ZGlmZiAtLWdpdCBhLy5jdnNpZ25vcmUgYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTQ5MzEzLi4wMDAwMDAwCi0tLSBhLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWNvbmZpZ3VyZQotbWlzc2luZwotaW5zdGFsbC1zaAotbWtpbnN0YWxsZGlycwotYWNsb2NhbC5tNAotLmRlcHMKLWdlbmVyYXRlZF9saXN0cwotYnVpbGRtay5zdGFtcApkaWZmIC0tZ2l0IGEvLmdkYmluaXQgYi8uZ2RiaW5pdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0ZDljMy4uMDAwMDAwMAotLS0gYS8uZ2RiaW5pdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMgZ2RiIG1hY3JvcyB3aGljaCBtYXkgYmUgdXNlZnVsIGZvciBmb2xrcyB1c2luZyBnZGIgdG8gZGVidWcKLSMgYXBhY2hlLiAgRGVsZXRlIGl0IGlmIGl0IGJvdGhlcnMgeW91LgotCi1kZWZpbmUgZHVtcF90YWJsZQotICAgIHNldCAkdCA9ICh0YWJsZV9lbnRyeSAqKSgoYXJyYXlfaGVhZGVyICopJGFyZzApLT5lbHRzCi0gICAgc2V0ICRuID0gKChhcnJheV9oZWFkZXIgKikkYXJnMCktPm5lbHRzCi0gICAgc2V0ICRpID0gMAotICAgIHdoaWxlICRpIDwgJG4KLQlwcmludGYgIlsldV0gJyVzJz0nJXMnXG4iLCAkaSwgJHRbJGldLmtleSwgJHRbJGldLnZhbAotCXNldCAkaSA9ICRpICsgMQotICAgIGVuZAotZW5kCi1kb2N1bWVudCBkdW1wX3RhYmxlCi0gICAgUHJpbnQgdGhlIGtleS92YWx1ZSBwYWlycyBpbiBhIHRhYmxlLgotZW5kCi0KLWRlZmluZSBkdW1wX3N0cmluZ19hcnJheQotICAgIHNldCAkYSA9IChjaGFyICoqKSgoYXJyYXlfaGVhZGVyICopJGFyZzApLT5lbHRzCi0gICAgc2V0ICRuID0gKGludCkoKGFycmF5X2hlYWRlciAqKSRhcmcwKS0+bmVsdHMKLSAgICBzZXQgJGkgPSAwCi0gICAgd2hpbGUgJGkgPCAkbgotCXByaW50ZiAiWyV1XSAnJXMnXG4iLCAkaSwgJGFbJGldCi0Jc2V0ICRpID0gJGkgKyAxCi0gICAgZW5kCi1lbmQKLWRvY3VtZW50IGR1bXBfc3RyaW5nX2FycmF5Ci0gICAgUHJpbnQgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiBhbiBhcnJheSBvZiBzdHJpbmdzLgotZW5kCmRpZmYgLS1naXQgYS9BQk9VVF9BUEFDSEUgYi9BQk9VVF9BUEFDSEUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NmE4N2IuLjAwMDAwMDAKLS0tIGEvQUJPVVRfQVBBQ0hFCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgVGhlIEFwYWNoZSBIVFRQIFNlcnZlciBQcm9qZWN0Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2h0dHBkCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKdWx5IDIwMDAKLQotVGhlIEFwYWNoZSBQcm9qZWN0IGlzIGEgY29sbGFib3JhdGl2ZSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBlZmZvcnQgYWltZWQKLWF0IGNyZWF0aW5nIGEgcm9idXN0LCBjb21tZXJjaWFsLWdyYWRlLCBmZWF0dXJlZnVsLCBhbmQgZnJlZWx5LWF2YWlsYWJsZQotc291cmNlIGNvZGUgaW1wbGVtZW50YXRpb24gb2YgYW4gSFRUUCAoV2ViKSBzZXJ2ZXIuICBUaGUgcHJvamVjdCBpcwotam9pbnRseSBtYW5hZ2VkIGJ5IGEgZ3JvdXAgb2Ygdm9sdW50ZWVycyBsb2NhdGVkIGFyb3VuZCB0aGUgd29ybGQsIHVzaW5nCi10aGUgSW50ZXJuZXQgYW5kIHRoZSBXZWIgdG8gY29tbXVuaWNhdGUsIHBsYW4sIGFuZCBkZXZlbG9wIHRoZSBzZXJ2ZXIgYW5kCi1pdHMgcmVsYXRlZCBkb2N1bWVudGF0aW9uLiAgVGhlc2Ugdm9sdW50ZWVycyBhcmUga25vd24gYXMgdGhlIEFwYWNoZSBHcm91cC4KLUluIGFkZGl0aW9uLCBodW5kcmVkcyBvZiB1c2VycyBoYXZlIGNvbnRyaWJ1dGVkIGlkZWFzLCBjb2RlLCBhbmQKLWRvY3VtZW50YXRpb24gdG8gdGhlIHByb2plY3QuICBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gYnJpZWZseSBkZXNjcmliZQotdGhlIGhpc3Rvcnkgb2YgdGhlIEFwYWNoZSBHcm91cCwgcmVjb2duaXplIHRoZSBtYW55IGNvbnRyaWJ1dG9ycywgYW5kCi1leHBsYWluIGhvdyB5b3UgY2FuIGpvaW4gdGhlIGZ1biB0b28uCi0KLUluIEZlYnJ1YXJ5IG9mIDE5OTUsIHRoZSBtb3N0IHBvcHVsYXIgc2VydmVyIHNvZnR3YXJlIG9uIHRoZSBXZWIgd2FzIHRoZQotcHVibGljIGRvbWFpbiBIVFRQIGRhZW1vbiBkZXZlbG9wZWQgYnkgUm9iIE1jQ29vbCBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyCi1mb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotSG93ZXZlciwgZGV2ZWxvcG1lbnQgb2YgdGhhdCBodHRwZCBoYWQgc3RhbGxlZCBhZnRlciBSb2IgbGVmdCBOQ1NBIGluCi1taWQtMTk5NCwgYW5kIG1hbnkgd2VibWFzdGVycyBoYWQgZGV2ZWxvcGVkIHRoZWlyIG93biBleHRlbnNpb25zIGFuZCBidWcKLWZpeGVzIHRoYXQgd2VyZSBpbiBuZWVkIG9mIGEgY29tbW9uIGRpc3RyaWJ1dGlvbi4gIEEgc21hbGwgZ3JvdXAgb2YgdGhlc2UKLXdlYm1hc3RlcnMsIGNvbnRhY3RlZCB2aWEgcHJpdmF0ZSBlLW1haWwsIGdhdGhlcmVkIHRvZ2V0aGVyIGZvciB0aGUgcHVycG9zZQotb2YgY29vcmRpbmF0aW5nIHRoZWlyIGNoYW5nZXMgKGluIHRoZSBmb3JtIG9mICJwYXRjaGVzIikuICBCcmlhbiBCZWhsZW5kb3JmCi1hbmQgQ2xpZmYgU2tvbG5pY2sgcHV0IHRvZ2V0aGVyIGEgbWFpbGluZyBsaXN0LCBzaGFyZWQgaW5mb3JtYXRpb24gc3BhY2UsCi1hbmQgbG9naW5zIGZvciB0aGUgY29yZSBkZXZlbG9wZXJzIG9uIGEgbWFjaGluZSBpbiB0aGUgQ2FsaWZvcm5pYSBCYXkgQXJlYSwKLXdpdGggYmFuZHdpZHRoIGFuZCBkaXNrc3BhY2UgZG9uYXRlZCBieSBIb3RXaXJlZCBhbmQgT3JnYW5pYyBPbmxpbmUuCi1CeSB0aGUgZW5kIG9mIEZlYnJ1YXJ5LCBlaWdodCBjb3JlIGNvbnRyaWJ1dG9ycyBmb3JtZWQgdGhlIGZvdW5kYXRpb24KLW9mIHRoZSBvcmlnaW5hbCBBcGFjaGUgR3JvdXA6Ci0KLSAgIEJyaWFuIEJlaGxlbmRvcmYgICAgICAgIFJveSBULiBGaWVsZGluZyAgICAgICAgICBSb2IgSGFydGlsbAotICAgRGF2aWQgUm9iaW5zb24gICAgICAgICAgQ2xpZmYgU2tvbG5pY2sgICAgICAgICAgIFJhbmR5IFRlcmJ1c2gKLSAgIFJvYmVydCBTLiBUaGF1ICAgICAgICAgIEFuZHJldyBXaWxzb24KLQotd2l0aCBhZGRpdGlvbmFsIGNvbnRyaWJ1dGlvbnMgZnJvbQotCi0gICBFcmljIEhhZ2JlcmcgICAgICAgICAgICBGcmFuayBQZXRlcnMgICAgICAgICAgICAgTmljb2xhcyBQaW9jaAotCi1Vc2luZyBOQ1NBIGh0dHBkIDEuMyBhcyBhIGJhc2UsIHdlIGFkZGVkIGFsbCBvZiB0aGUgcHVibGlzaGVkIGJ1ZyBmaXhlcwotYW5kIHdvcnRod2hpbGUgZW5oYW5jZW1lbnRzIHdlIGNvdWxkIGZpbmQsIHRlc3RlZCB0aGUgcmVzdWx0IG9uIG91ciBvd24KLXNlcnZlcnMsIGFuZCBtYWRlIHRoZSBmaXJzdCBvZmZpY2lhbCBwdWJsaWMgcmVsZWFzZSAoMC42LjIpIG9mIHRoZSBBcGFjaGUKLXNlcnZlciBpbiBBcHJpbCAxOTk1LiAgQnkgY29pbmNpZGVuY2UsIE5DU0EgcmVzdGFydGVkIHRoZWlyIG93biBkZXZlbG9wbWVudAotZHVyaW5nIHRoZSBzYW1lIHBlcmlvZCwgYW5kIEJyYW5kb24gTG9uZyBhbmQgQmV0aCBGcmFuayBvZiB0aGUgTkNTQSBTZXJ2ZXIKLURldmVsb3BtZW50IFRlYW0gam9pbmVkIHRoZSBsaXN0IGluIE1hcmNoIGFzIGhvbm9yYXJ5IG1lbWJlcnMgc28gdGhhdCB0aGUKLXR3byBwcm9qZWN0cyBjb3VsZCBzaGFyZSBpZGVhcyBhbmQgZml4ZXMuCi0KLVRoZSBlYXJseSBBcGFjaGUgc2VydmVyIHdhcyBhIGJpZyBoaXQsIGJ1dCB3ZSBhbGwga25ldyB0aGF0IHRoZSBjb2RlYmFzZQotbmVlZGVkIGEgZ2VuZXJhbCBvdmVyaGF1bCBhbmQgcmVkZXNpZ24uICBEdXJpbmcgTWF5LUp1bmUgMTk5NSwgd2hpbGUKLVJvYiBIYXJ0aWxsIGFuZCB0aGUgcmVzdCBvZiB0aGUgZ3JvdXAgZm9jdXNlZCBvbiBpbXBsZW1lbnRpbmcgbmV3IGZlYXR1cmVzCi1mb3IgMC43LnggKGxpa2UgcHJlLWZvcmtlZCBjaGlsZCBwcm9jZXNzZXMpIGFuZCBzdXBwb3J0aW5nIHRoZSByYXBpZGx5IGdyb3dpbmcKLUFwYWNoZSB1c2VyIGNvbW11bml0eSwgUm9iZXJ0IFRoYXUgZGVzaWduZWQgYSBuZXcgc2VydmVyIGFyY2hpdGVjdHVyZQotKGNvZGUtbmFtZWQgU2hhbWJoYWxhKSB3aGljaCBpbmNsdWRlZCBhIG1vZHVsYXIgc3RydWN0dXJlIGFuZCBBUEkgZm9yIGJldHRlcgotZXh0ZW5zaWJpbGl0eSwgcG9vbC1iYXNlZCBtZW1vcnkgYWxsb2NhdGlvbiwgYW5kIGFuIGFkYXB0aXZlIHByZS1mb3JraW5nCi1wcm9jZXNzIG1vZGVsLiAgVGhlIGdyb3VwIHN3aXRjaGVkIHRvIHRoaXMgbmV3IHNlcnZlciBiYXNlIGluIEp1bHkgYW5kIGFkZGVkCi10aGUgZmVhdHVyZXMgZnJvbSAwLjcueCwgcmVzdWx0aW5nIGluIEFwYWNoZSAwLjguOCAoYW5kIGl0cyBicmV0aHJlbikKLWluIEF1Z3VzdC4KLQotQWZ0ZXIgZXh0ZW5zaXZlIGJldGEgdGVzdGluZywgbWFueSBwb3J0cyB0byBvYnNjdXJlIHBsYXRmb3JtcywgYSBuZXcgc2V0Ci1vZiBkb2N1bWVudGF0aW9uIChieSBEYXZpZCBSb2JpbnNvbiksIGFuZCB0aGUgYWRkaXRpb24gb2YgbWFueSBmZWF0dXJlcwotaW4gdGhlIGZvcm0gb2Ygb3VyIHN0YW5kYXJkIG1vZHVsZXMsIEFwYWNoZSAxLjAgd2FzIHJlbGVhc2VkIG9uCi1EZWNlbWJlciAxLCAxOTk1LgotCi1MZXNzIHRoYW4gYSB5ZWFyIGFmdGVyIHRoZSBncm91cCB3YXMgZm9ybWVkLCB0aGUgQXBhY2hlIHNlcnZlciBwYXNzZWQKLU5DU0EncyBodHRwZCBhcyB0aGUgIzEgc2VydmVyIG9uIHRoZSBJbnRlcm5ldC4KLQotVGhlIHN1cnZleSBieSBOZXRjcmFmdCAoaHR0cDovL3d3dy5uZXRjcmFmdC5jb20vc3VydmV5Lykgc2hvd3MgdGhhdCBBcGFjaGUKLWlzIHRvZGF5IG1vcmUgd2lkZWx5IHVzZWQgdGhhbiBhbGwgb3RoZXIgd2ViIHNlcnZlcnMgY29tYmluZWQuCi0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUN1cnJlbnQgQXBhY2hlIEdyb3VwIGluIGFscGhhYmV0aWNhbCBvcmRlciBhcyBvZiAyNyBKdWx5IDIwMDA6Ci0KLSAgIEJyaWFuIEJlaGxlbmRvcmYgICAgICAgQ29sbGFiLk5ldCwgQ2FsaWZvcm5pYSAKLSAgIFJ5YW4gQmxvb20gICAgICAgICAgICAgQ292YWxlbnQgVGVjaG5vbG9naWVzLCBDYWxpZm9ybmlhIAotICAgS2VuIENvYXIgICAgICAgICAgICAgICBJQk0gQ29ycG9yYXRpb24sIFJlc2VhcmNoIFRyaWFuZ2xlIFBhcmssIE5DLCBVU0EKLSAgIE1hcmsgSi4gQ294ICAgICAgICAgICAgUmVkIEhhdCwgRW5nbGFuZAotICAgTGFycyBFaWxlYnJlY2h0ICAgICAgICBDeWJlclNvbHV0aW9ucywgTXVuaWNoLCBHZXJtYW55IAotICAgUmFsZiBTLiBFbmdlbHNjaGFsbCAgICBNdW5pY2gsIEdlcm1hbnkuCi0gICBSb3kgVC4gRmllbGRpbmcgICAgICAgIGVCdWlsdCwgQ2FsaWZvcm5pYSAKLSAgIFRvbnkgRmluY2ggICAgICAgICAgICAgQ292YWxlbnQgVGVjaG5vbG9naWVzLCBDYWxpZm9ybmlhCi0gICBEZWFuIEdhdWRldCAgICAgICAgICAgIFRyYW5zbWV0YSBDb3Jwb3JhdGlvbiwgQ2FsaWZvcm5pYSAKLSAgIERpcmstV2lsbGVtIHZhbiBHdWxpayAgQ292YWxlbnQgVGVjaG5vbG9naWVzLCBDYWxpZm9ybmlhIAotICAgQnJpYW4gSGF2YXJkICAgICAgICAgICBBdXN0cmFsaWEKLSAgIEJlbiBIeWRlICAgICAgICAgICAgICAgR2Vuc3ltLCBNYXNzYWNodXNldHRzCi0gICBKaW0gSmFnaWVsc2tpICAgICAgICAgIGphZ3VORVQgQWNjZXNzIFNlcnZpY2VzLCBNYXJ5bGFuZCAKLSAgIE1hbm9qIEthc2ljaGFpbnVsYSAgICAgQ29sbGFiLk5ldCwgQ2FsaWZvcm5pYQotICAgQWxleGVpIEtvc3V0ICAgICAgICAgICBTdGFuZm9yZCBVbml2ZXJzaXR5LCBDYWxpZm9ybmlhIAotICAgTWFydGluIEtyYWVtZXIgICAgICAgICBNdW5pY2gsIEdlcm1hbnkKLSAgIEJlbiBMYXVyaWUgICAgICAgICAgICAgRnJlZWxhbmNlIENvbnN1bHRhbnQsIFVLIAotICAgUmFzbXVzIExlcmRvcmYgICAgICAgICBMaW51eGNhcmUsIENhbGlmb3JuaWEKLSAgIERhbmllbCBMb3BleiBSaWRydWVqbyAgQ292YWxlbnQgVGVjaG5vbG9naWVzLCBDYWxpZm9ybmlhCi0gICBEb3VnIE1hY0VhY2hlcm4gICAgICAgIENvdmFsZW50IFRlY2hub2xvZ2llcywgQ2FsaWZvcm5pYQotICAgQXJhbSBXLiBNaXJ6YWRlaCAgICAgICBDYWJsZVZpc2lvbiwgTmV3IFlvcmsgCi0gICBDaHVjayBNdXJja28gICAgICAgICAgIFRoZSBUb3BzYWlsIEdyb3VwLCBQZW5uc3lsdmFuaWEgCi0gICBTYW1lZXIgUGFyZWtoICAgICAgICAgIENhbGlmb3JuaWEgCi0gICBEYXZpZCBSZWlkICAgICAgICAgICAgIFVLCi0gICBXaWxsaWFtIEEuIFJvd2UsIEpyLiAgIEZyZWVsYW5jZSBDb25zdWx0YW50LCBDaGljYWdvIGFyZWEKLSAgIFdpbGZyZWRvIFNhbmNoZXogICAgICAgQXBwbGUgQ29tcHV0ZXIsIENhbGlmb3JuaWEKLSAgIENsaWZmIFNrb2xuaWNrICAgICAgICAgQ2FsaWZvcm5pYQotICAgTWFyYyBTbGVta28gICAgICAgICAgICBDYW5hZGEgCi0gICBHcmVnIFN0ZWluICAgICAgICAgICAgIENhbGlmb3JuaWEKLSAgIEJpbGwgU3RvZGRhcmQgICAgICAgICAgSUJNIENvcnBvcmF0aW9uLCBSZXNlYXJjaCBUcmlhbmdsZSBQYXJrLCBOQwotICAgUGF1bCBTdXR0b24gICAgICAgICAgICBTZWF0dGxlCi0gICBSYW5keSBUZXJidXNoICAgICAgICAgIENvdmFsZW50IFRlY2hub2xvZ2llcywgQ2FsaWZvcm5pYSAKLQotQXBhY2hlIEVtZXJpdHVzIChvbGQgZ3JvdXAgbWVtYmVycyBub3cgb2ZmIGRvaW5nIG90aGVyIHRoaW5ncykKLQotICAgUm9iIEhhcnRpbGwgICAgICAgICAgICBJbnRlcm5ldCBNb3ZpZSBEQiwgVUsgCi0gICBEYXZpZCBSb2JpbnNvbiAgICAgICAgIENhbWJyaWRnZSBVbml2ZXJzaXR5LCBVSwotICAgUm9iZXJ0IFMuIFRoYXUgICAgICAgICBNSVQsIE1hc3NhY2h1c2V0dHMKLSAgIEFuZHJldyBXaWxzb24gICAgICAgICAgRnJlZWxhbmNlIENvbnN1bHRhbnQsIFVLIAotICAgCi1PdGhlciBtYWpvciBjb250cmlidXRvcnMKLQotICAgSG93YXJkIEZlYXIgKG1vZF9pbmNsdWRlKSwgRmxvcmVudCBHdWlsbGF1bWUgKGxhbmd1YWdlIG5lZ290aWF0aW9uKSwKLSAgIEtvZW4gSG9sdG1hbiAocmV3cml0ZSBvZiBtb2RfbmVnb3RpYXRpb24pLAotICAgS2V2aW4gSHVnaGVzIChjcmVhdG9yIG9mIGFsbCB0aG9zZSBuaWZ0eSBpY29ucyksCi0gICBCcmFuZG9uIExvbmcgYW5kIEJldGggRnJhbmsgKE5DU0EgU2VydmVyIERldmVsb3BtZW50IFRlYW0sIHBvc3QtMS4zKSwKLSAgIEFtYmFyaXNoIE1hbHBhbmkgKEJlZ2lubmluZyBvZiB0aGUgTlQgcG9ydCksCi0gICBSb2IgTWNDb29sIChvcmlnaW5hbCBhdXRob3Igb2YgdGhlIE5DU0EgaHR0cGQgMS4zKSwKLSAgIFBhdWwgUmljaGFyZHMgKGNvbnZpbmNlZCB0aGUgZ3JvdXAgdG8gdXNlIHJlbW90ZSBDVlMgYWZ0ZXIgMS4wKSwKLSAgIEdhcmV5IFNtaWxleSAoT1MvMiBwb3J0KSwgSGVucnkgU3BlbmNlciAoYXV0aG9yIG9mIHRoZSByZWdleCBsaWJyYXJ5KS4KLQotTWFueSAzcmQtcGFydHkgbW9kdWxlcywgZnJlcXVlbnRseSB1c2VkIGFuZCByZWNvbW1lbmRlZCwgYXJlIGFsc28KLWZyZWVseS1hdmFpbGFibGUgYW5kIGxpbmtlZCBmcm9tIHRoZSByZWxhdGVkIHByb2plY3RzIHBhZ2U6Ci08aHR0cDovL21vZHVsZXMuYXBhY2hlLm9yZy8+LCBhbmQgdGhlaXIgYXV0aG9ycyBmcmVxdWVudGx5Ci1jb250cmlidXRlIGlkZWFzLCBwYXRjaGVzLCBhbmQgdGVzdGluZy4KLQotSHVuZHJlZHMgb2YgcGVvcGxlIGhhdmUgbWFkZSBpbmRpdmlkdWFsIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIEFwYWNoZQotcHJvamVjdC4gIFBhdGNoIGNvbnRyaWJ1dG9ycyBhcmUgbGlzdGVkIGluIHRoZSBzcmMvQ0hBTkdFUyBmaWxlLgotRnJlcXVlbnQgY29udHJpYnV0b3JzIGhhdmUgaW5jbHVkZWQgUGV0ciBMYW1wYSwgVG9tIFRyb21leSwgSmFtZXMgSC4KLUNsb29zIEpyLiwgRWQgS29ydGhvZiwgTmF0aGFuIE5ldWxpbmdlciwgSmFzb24gUy4gQ2xhcnksIEphc29uIEEuIERvdXIsCi1NaWNoYWVsIERvdWdsYXNzLCBUb255IFNhbmRlcnMsIEJyaWFuIFRhbywgTWljaGFlbCBTbWl0aCwgQWRhbSBTdXNzbWFuLAotTmF0aGFuIFNjaHJlbmssIE1hdHRoZXcgR3JheSwgYW5kIEpvaG4gSGVpZGVtYW5uLgotCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1Ib3cgdG8gYmVjb21lIGludm9sdmVkIGluIHRoZSBBcGFjaGUgcHJvamVjdAotCi1UaGVyZSBhcmUgc2V2ZXJhbCBsZXZlbHMgb2YgY29udHJpYnV0aW5nLiAgSWYgeW91IGp1c3Qgd2FudCB0byBzZW5kCi1pbiBhbiBvY2Nhc2lvbmFsIHN1Z2dlc3Rpb24vZml4LCB0aGVuIHlvdSBjYW4ganVzdCB1c2UgdGhlIGJ1ZyByZXBvcnRpbmcKLWZvcm0gYXQgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9idWdfcmVwb3J0Lmh0bWw+LiAgWW91IGNhbiBhbHNvIHN1YnNjcmliZQotdG8gdGhlIGFubm91bmNlbWVudHMgbWFpbGluZyBsaXN0IChhcGFjaGUtYW5ub3VuY2VAYXBhY2hlLm9yZykgd2hpY2ggd2UKLXVzZSB0byBicm9hZGNhc3QgaW5mb3JtYXRpb24gYWJvdXQgbmV3IHJlbGVhc2VzLCBidWdmaXhlcywgYW5kIHVwY29taW5nCi1ldmVudHMuICBUaGVyZSdzIGEgbG90IG9mIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZlbG9wbWVudCBwcm9jZXNzIChtdWNoCi1vZiBpdCBpbiBzZXJpb3VzIG5lZWQgb2YgdXBkYXRpbmcpIHRvIGJlIGZvdW5kIGF0IDxodHRwOi8vZGV2LmFwYWNoZS5vcmcvPi4KLQotSWYgeW91J2QgbGlrZSB0byBiZWNvbWUgYW4gYWN0aXZlIGNvbnRyaWJ1dG9yIHRvIHRoZSBBcGFjaGUgcHJvamVjdCAodGhlCi1ncm91cCBvZiB2b2x1bnRlZXJzIHdobyB2b3RlIG9uIGNoYW5nZXMgdG8gdGhlIGRpc3RyaWJ1dGVkIHNlcnZlciksIHRoZW4KLXlvdSBuZWVkIHRvIHN0YXJ0IGJ5IHN1YnNjcmliaW5nIHRvIHRoZSBuZXctaHR0cGRAYXBhY2hlLm9yZyBtYWlsaW5nIGxpc3QuCi1PbmUgd2FybmluZyB0aG91Z2g6IHRyYWZmaWMgaXMgaGlnaCwgMTAwMCB0byAxNTAwIG1lc3NhZ2VzL21vbnRoLgotVG8gc3Vic2NyaWJlIHRvIHRoZSBsaXN0LCBzZW5kICJzdWJzY3JpYmUgbmV3LWh0dHBkIiBpbiB0aGUgYm9keSBvZgotYSBtZXNzYWdlIHRvIDxtYWpvcmRvbW9AYXBhY2hlLm9yZz4uICBXZSByZWNvbW1lbmQgcmVhZGluZyB0aGUgbGlzdCBmb3IKLWEgd2hpbGUgYmVmb3JlIHRyeWluZyB0byBqdW1wIGluIHRvIGRldmVsb3BtZW50LgotCi0gICBOT1RFOiBUaGUgZGV2ZWxvcGVyIG1haWxpbmcgbGlzdCAobmV3LWh0dHBkQGFwYWNoZS5vcmcpIGlzIG5vdAotICAgYSB1c2VyIHN1cHBvcnQgZm9ydW07IGl0IGlzIGZvciBwZW9wbGUgYWN0aXZlbHkgd29ya2luZyBvbiBkZXZlbG9wbWVudAotICAgb2YgdGhlIHNlcnZlciBjb2RlIGFuZCBkb2N1bWVudGF0aW9uLCBhbmQgZm9yIHBsYW5uaW5nIGZ1dHVyZQotICAgZGlyZWN0aW9ucy4gIElmIHlvdSBoYXZlIHVzZXIvY29uZmlndXJhdGlvbiBxdWVzdGlvbnMsIHNlbmQgdGhlbQotICAgdG8gdGhlIFVTRU5FVCBuZXdzZ3JvdXAgImNvbXAuaW5mb3N5c3RlbXMud3d3LnNlcnZlcnMudW5peCIuCi0KLVRoZXJlIGlzIGEgY29yZSBncm91cCBvZiBjb250cmlidXRvcnMgKGluZm9ybWFsbHkgY2FsbGVkIHRoZSAiY29yZSIpCi13aGljaCB3YXMgZm9ybWVkIGZyb20gdGhlIHByb2plY3QgZm91bmRlcnMgYW5kIGlzIGF1Z21lbnRlZCBmcm9tIHRpbWUKLXRvIHRpbWUgd2hlbiBjb3JlIG1lbWJlcnMgbm9taW5hdGUgb3V0c3RhbmRpbmcgY29udHJpYnV0b3JzIGFuZCB0aGUKLXJlc3Qgb2YgdGhlIGNvcmUgbWVtYmVycyBhZ3JlZS4gIFRoZSBjb3JlIGdyb3VwIGZvY3VzIGlzIG1vcmUgb24KLSJidXNpbmVzcyIgaXNzdWVzIGFuZCBsaW1pdGVkLWNpcmN1bGF0aW9uIHRoaW5ncyBsaWtlIHNlY3VyaXR5IHByb2JsZW1zCi10aGFuIG9uIG1haW5zdHJlYW0gY29kZSBkZXZlbG9wbWVudC4gIFRoZSB0ZXJtICJUaGUgQXBhY2hlIEdyb3VwIgotdGVjaG5pY2FsbHkgcmVmZXJzIHRvIHRoaXMgY29yZSBvZiBwcm9qZWN0IGNvbnRyaWJ1dG9ycy4KLQotVGhlIEFwYWNoZSBwcm9qZWN0IGlzIGEgbWVyaXRvY3JhY3kgLS0gdGhlIG1vcmUgd29yayB5b3UgaGF2ZSBkb25lLCB0aGUgbW9yZQoteW91IGFyZSBhbGxvd2VkIHRvIGRvLiAgVGhlIGdyb3VwIGZvdW5kZXJzIHNldCB0aGUgb3JpZ2luYWwgcnVsZXMsIGJ1dAotdGhleSBjYW4gYmUgY2hhbmdlZCBieSB2b3RlIG9mIHRoZSBhY3RpdmUgbWVtYmVycy4gIFRoZXJlIGlzIGEgZ3JvdXAKLW9mIHBlb3BsZSB3aG8gaGF2ZSBsb2dpbnMgb24gb3VyIHNlcnZlciAoYXBhY2hlLm9yZykgYW5kIGFjY2VzcyB0byB0aGUKLUNWUyByZXBvc2l0b3J5LiAgRXZlcnlvbmUgaGFzIGFjY2VzcyB0byB0aGUgQ1ZTIHNuYXBzaG90cy4gIENoYW5nZXMgdG8KLXRoZSBjb2RlIGFyZSBwcm9wb3NlZCBvbiB0aGUgbWFpbGluZyBsaXN0IGFuZCB1c3VhbGx5IHZvdGVkIG9uIGJ5IGFjdGl2ZQotbWVtYmVycyAtLSB0aHJlZSArMSAoeWVzIHZvdGVzKSBhbmQgbm8gLTEgKG5vIHZvdGVzLCBvciB2ZXRvZXMpIGFyZSBuZWVkZWQKLXRvIGNvbW1pdCBhIGNvZGUgY2hhbmdlIGR1cmluZyBhIHJlbGVhc2UgY3ljbGU7IGRvY3MgYXJlIHVzdWFsbHkgY29tbWl0dGVkCi1maXJzdCBhbmQgdGhlbiBjaGFuZ2VkIGFzIG5lZWRlZCwgd2l0aCBjb25mbGljdHMgcmVzb2x2ZWQgYnkgbWFqb3JpdHkgdm90ZS4KLQotT3VyIHByaW1hcnkgbWV0aG9kIG9mIGNvbW11bmljYXRpb24gaXMgb3VyIG1haWxpbmcgbGlzdC4gQXBwcm94aW1hdGVseSA0MAotbWVzc2FnZXMgYSBkYXkgZmxvdyBvdmVyIHRoZSBsaXN0LCBhbmQgYXJlIHR5cGljYWxseSB2ZXJ5IGNvbnZlcnNhdGlvbmFsIGluCi10b25lLiBXZSBkaXNjdXNzIG5ldyBmZWF0dXJlcyB0byBhZGQsIGJ1ZyBmaXhlcywgdXNlciBwcm9ibGVtcywgZGV2ZWxvcG1lbnRzCi1pbiB0aGUgd2ViIHNlcnZlciBjb21tdW5pdHksIHJlbGVhc2UgZGF0ZXMsIGV0Yy4gIFRoZSBhY3R1YWwgY29kZSBkZXZlbG9wbWVudAotdGFrZXMgcGxhY2Ugb24gdGhlIGRldmVsb3BlcnMnIGxvY2FsIG1hY2hpbmVzLCB3aXRoIHByb3Bvc2VkIGNoYW5nZXMKLWNvbW11bmljYXRlZCB1c2luZyBhIHBhdGNoIChvdXRwdXQgb2YgYSB1bmlmaWVkICJkaWZmIC11IG9sZGZpbGUgbmV3ZmlsZSIKLWNvbW1hbmQpLCBhbmQgY29tbWl0dGVkIHRvIHRoZSBzb3VyY2UgcmVwb3NpdG9yeSBieSBvbmUgb2YgdGhlIGNvcmUKLWRldmVsb3BlcnMgdXNpbmcgcmVtb3RlIENWUy4gIEFueW9uZSBvbiB0aGUgbWFpbGluZyBsaXN0IGNhbiB2b3RlIG9uIGEKLXBhcnRpY3VsYXIgaXNzdWUsIGJ1dCB3ZSBvbmx5IGNvdW50IHRob3NlIG1hZGUgYnkgYWN0aXZlIG1lbWJlcnMgb3IgcGVvcGxlCi13aG8gYXJlIGtub3duIHRvIGJlIGV4cGVydHMgb24gdGhhdCBwYXJ0IG9mIHRoZSBzZXJ2ZXIuICBWZXRvZXMgbXVzdCBiZQotYWNjb21wYW5pZWQgYnkgYSBjb252aW5jaW5nIGV4cGxhbmF0aW9uLgotCi1OZXcgbWVtYmVycyBvZiB0aGUgQXBhY2hlIEdyb3VwIGFyZSBhZGRlZCB3aGVuIGEgZnJlcXVlbnQgY29udHJpYnV0b3IgaXMKLW5vbWluYXRlZCBieSBvbmUgbWVtYmVyIGFuZCB1bmFuaW1vdXNseSBhcHByb3ZlZCBieSB0aGUgdm90aW5nIG1lbWJlcnMuCi1JbiBtb3N0IGNhc2VzLCB0aGlzICJuZXciIG1lbWJlciBoYXMgYmVlbiBhY3RpdmVseSBjb250cmlidXRpbmcgdG8gdGhlCi1ncm91cCdzIHdvcmsgZm9yIG92ZXIgc2l4IG1vbnRocywgc28gaXQncyB1c3VhbGx5IGFuIGVhc3kgZGVjaXNpb24uCi0KLVRoZSBhYm92ZSBkZXNjcmliZXMgb3VyIHBhc3QgYW5kIGN1cnJlbnQgKGFzIG9mIEp1bHkgMjAwMCkgZ3VpZGVsaW5lcywKLXdoaWNoIHdpbGwgcHJvYmFibHkgY2hhbmdlIG92ZXIgdGltZSBhcyB0aGUgbWVtYmVyc2hpcCBvZiB0aGUgZ3JvdXAKLWNoYW5nZXMgYW5kIG91ciBkZXZlbG9wbWVudC9jb29yZGluYXRpb24gdG9vbHMgaW1wcm92ZS4KLQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uICh3d3cuYXBhY2hlLm9yZykKLQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGV4aXN0cyB0byBwcm92aWRlIG9yZ2FuaXphdGlvbmFsLCBsZWdhbCwKLWFuZCBmaW5hbmNpYWwgc3VwcG9ydCBmb3IgdGhlIEFwYWNoZSBvcGVuLXNvdXJjZSBzb2Z0d2FyZSBwcm9qZWN0cy4KLUZvdW5kZWQgaW4gSnVuZSAxOTk5IGJ5IHRoZSBBcGFjaGUgR3JvdXAsIHRoZSBGb3VuZGF0aW9uIGhhcyBiZWVuCi1pbmNvcnBvcmF0ZWQgYXMgYSBtZW1iZXJzaGlwLWJhc2VkLCBub3QtZm9yLXByb2ZpdCBjb3Jwb3JhdGlvbiBpbiBvcmRlcgotdG8gZW5zdXJlIHRoYXQgdGhlIEFwYWNoZSBwcm9qZWN0cyBjb250aW51ZSB0byBleGlzdCBiZXlvbmQgdGhlIHBhcnRpY2lwYXRpb24KLW9mIGluZGl2aWR1YWwgdm9sdW50ZWVycywgdG8gZW5hYmxlIGNvbnRyaWJ1dGlvbnMgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1hbmQgZnVuZHMgb24gYSBzb3VuZCBiYXNpcywgYW5kIHRvIHByb3ZpZGUgYSB2ZWhpY2xlIGZvciBsaW1pdGluZyBsZWdhbAotZXhwb3N1cmUgd2hpbGUgcGFydGljaXBhdGluZyBpbiBvcGVuLXNvdXJjZSBzb2Z0d2FyZSBwcm9qZWN0cy4gCi0KLVlvdSBhcmUgaW52aXRlZCB0byBwYXJ0aWNpcGF0ZSBpbiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFdlIHdlbGNvbWUKLWNvbnRyaWJ1dGlvbnMgaW4gbWFueSBmb3Jtcy4gIE91ciBtZW1iZXJzaGlwIGNvbnNpc3RzIG9mIHRob3NlIGluZGl2aWR1YWxzCi13aG8gaGF2ZSBkZW1vbnN0cmF0ZWQgYSBjb21taXRtZW50IHRvIGNvbGxhYm9yYXRpdmUgb3Blbi1zb3VyY2Ugc29mdHdhcmUKLWRldmVsb3BtZW50IHRocm91Z2ggc3VzdGFpbmVkIHBhcnRpY2lwYXRpb24gYW5kIGNvbnRyaWJ1dGlvbnMgd2l0aGluIHRoZQotRm91bmRhdGlvbidzIHByb2plY3RzLiAgTWFueSBwZW9wbGUgYW5kIGNvbXBhbmllcyBoYXZlIGNvbnRyaWJ1dGVkIHRvd2FyZHMKLXRoZSBzdWNjZXNzIG9mIHRoZSBBcGFjaGUgcHJvamVjdHMuIAotCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1XaHkgQXBhY2hlIElzIEZyZWUKLQotQXBhY2hlIGV4aXN0cyB0byBwcm92aWRlIGEgcm9idXN0IGFuZCBjb21tZXJjaWFsLWdyYWRlIHJlZmVyZW5jZQotaW1wbGVtZW50YXRpb24gb2YgdGhlIEhUVFAgcHJvdG9jb2wuICBJdCBtdXN0IHJlbWFpbiBhIHBsYXRmb3JtIHVwb24gd2hpY2gKLWluZGl2aWR1YWxzIGFuZCBpbnN0aXR1dGlvbnMgY2FuIGJ1aWxkIHJlbGlhYmxlIHN5c3RlbXMsIGJvdGggZm9yCi1leHBlcmltZW50YWwgcHVycG9zZXMgYW5kIGZvciBtaXNzaW9uLWNyaXRpY2FsIHB1cnBvc2VzLiAgV2UgYmVsaWV2ZSB0aGUKLXRvb2xzIG9mIG9ubGluZSBwdWJsaXNoaW5nIHNob3VsZCBiZSBpbiB0aGUgaGFuZHMgb2YgZXZlcnlvbmUsIGFuZAotc29mdHdhcmUgY29tcGFuaWVzIHNob3VsZCBtYWtlIHRoZWlyIG1vbmV5IHByb3ZpZGluZyB2YWx1ZS1hZGRlZCBzZXJ2aWNlcwotc3VjaCBhcyBzcGVjaWFsaXplZCBtb2R1bGVzIGFuZCBzdXBwb3J0LCBhbW9uZ3N0IG90aGVyIHRoaW5ncy4gIFdlIHJlYWxpemUKLXRoYXQgaXQgaXMgb2Z0ZW4gc2VlbiBhcyBhbiBlY29ub21pYyBhZHZhbnRhZ2UgZm9yIG9uZSBjb21wYW55IHRvICJvd24iIGEKLW1hcmtldCAtIGluIHRoZSBzb2Z0d2FyZSBpbmR1c3RyeSB0aGF0IG1lYW5zIHRvIGNvbnRyb2wgdGlnaHRseSBhCi1wYXJ0aWN1bGFyIGNvbmR1aXQgc3VjaCB0aGF0IGFsbCBvdGhlcnMgbXVzdCBwYXkuICBUaGlzIGlzIHR5cGljYWxseSBkb25lCi1ieSAib3duaW5nIiB0aGUgcHJvdG9jb2xzIHRocm91Z2ggd2hpY2ggY29tcGFuaWVzIGNvbmR1Y3QgYnVzaW5lc3MsIGF0IHRoZQotZXhwZW5zZSBvZiBhbGwgdGhvc2Ugb3RoZXIgY29tcGFuaWVzLiAgVG8gdGhlIGV4dGVudCB0aGF0IHRoZSBwcm90b2NvbHMgb2YKLXRoZSBXb3JsZCBXaWRlIFdlYiByZW1haW4gInVub3duZWQiIGJ5IGEgc2luZ2xlIGNvbXBhbnksIHRoZSBXZWIgd2lsbAotcmVtYWluIGEgbGV2ZWwgcGxheWluZyBmaWVsZCBmb3IgY29tcGFuaWVzIGxhcmdlIGFuZCBzbWFsbC4gVGh1cywKLSJvd25lcnNoaXAiIG9mIHRoZSBwcm90b2NvbCBtdXN0IGJlIHByZXZlbnRlZCwgYW5kIHRoZSBleGlzdGVuY2Ugb2YgYQotcm9idXN0IHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcHJvdG9jb2wsIGF2YWlsYWJsZSBhYnNvbHV0ZWx5IGZvcgotZnJlZSB0byBhbGwgY29tcGFuaWVzLCBpcyBhIHRyZW1lbmRvdXNseSBnb29kIHRoaW5nLiAgCi0KLUZ1cnRoZXJtb3JlLCBBcGFjaGUgaXMgYW4gb3JnYW5pYyBlbnRpdHk7IHRob3NlIHdobyBiZW5lZml0IGZyb20gaXQKLWJ5IHVzaW5nIGl0IG9mdGVuIGNvbnRyaWJ1dGUgYmFjayB0byBpdCBieSBwcm92aWRpbmcgZmVhdHVyZSBlbmhhbmNlbWVudHMsCi1idWcgZml4ZXMsIGFuZCBzdXBwb3J0IGZvciBvdGhlcnMgaW4gcHVibGljIG5ld3Nncm91cHMuICBUaGUgYW1vdW50IG9mCi1lZmZvcnQgZXhwZW5kZWQgYnkgYW55IHBhcnRpY3VsYXIgaW5kaXZpZHVhbCBpcyB1c3VhbGx5IGZhaXJseSBsaWdodCwgYnV0Ci10aGUgcmVzdWx0aW5nIHByb2R1Y3QgaXMgbWFkZSB2ZXJ5IHN0cm9uZy4gIFRoaXMga2luZCBvZiBjb21tdW5pdHkgY2FuCi1vbmx5IGhhcHBlbiB3aXRoIGZyZWV3YXJlIC0tIHdoZW4gc29tZW9uZSBwYXlzIGZvciBzb2Z0d2FyZSwgdGhleSB1c3VhbGx5Ci1hcmVuJ3Qgd2lsbGluZyB0byBmaXggaXRzIGJ1Z3MuICBPbmUgY2FuIGFyZ3VlLCB0aGVuLCB0aGF0IEFwYWNoZSdzCi1zdHJlbmd0aCBjb21lcyBmcm9tIHRoZSBmYWN0IHRoYXQgaXQncyBmcmVlLCBhbmQgaWYgaXQgd2VyZSBtYWRlICJub3QKLWZyZWUiIGl0IHdvdWxkIHN1ZmZlciB0cmVtZW5kb3VzbHksIGV2ZW4gaWYgdGhhdCBtb25leSB3ZXJlIHNwZW50IG9uIGEKLXJlYWwgZGV2ZWxvcG1lbnQgdGVhbS4KLQotV2Ugd2FudCB0byBzZWUgQXBhY2hlIHVzZWQgdmVyeSB3aWRlbHkgLS0gYnkgbGFyZ2UgY29tcGFuaWVzLCBzbWFsbAotY29tcGFuaWVzLCByZXNlYXJjaCBpbnN0aXR1dGlvbnMsIHNjaG9vbHMsIGluZGl2aWR1YWxzLCBpbiB0aGUgaW50cmFuZXQKLWVudmlyb25tZW50LCBldmVyeXdoZXJlIC0tIGV2ZW4gdGhvdWdoIHRoaXMgbWF5IG1lYW4gdGhhdCBjb21wYW5pZXMgd2hvCi1jb3VsZCBhZmZvcmQgY29tbWVyY2lhbCBzb2Z0d2FyZSwgYW5kIHdvdWxkIHBheSBmb3IgaXQgd2l0aG91dCBibGlua2luZywKLW1pZ2h0IGdldCBhICJmcmVlIHJpZGUiIGJ5IHVzaW5nIEFwYWNoZS4gIFdlIHdvdWxkIGV2ZW4gYmUgaGFwcHkgaWYgc29tZQotY29tbWVyY2lhbCBzb2Z0d2FyZSBjb21wYW5pZXMgY29tcGxldGVseSBkcm9wcGVkIHRoZWlyIG93biBIVFRQIHNlcnZlcgotZGV2ZWxvcG1lbnQgcGxhbnMgYW5kIHVzZWQgQXBhY2hlIGFzIGEgYmFzZSwgd2l0aCB0aGUgcHJvcGVyIGF0dHJpYnV0aW9ucwotYXMgZGVzY3JpYmVkIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLVRoYW5rcyBmb3IgdXNpbmcgQXBhY2hlIQotCmRpZmYgLS1naXQgYS9BcGFjaGUuZHNwIGIvQXBhY2hlLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJiNjQ0ZC4uMDAwMDAwMAotLS0gYS9BcGFjaGUuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iQXBhY2hlIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMwotCi1DRkc9QXBhY2hlIC0gV2luMzIgUmVsZWFzZQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJBcGFjaGUubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJBcGFjaGUubWFrIiBDRkc9IkFwYWNoZSAtIFdpbjMyIFJlbGVhc2UiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAiQXBhY2hlIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFICJBcGFjaGUgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIkFwYWNoZSAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuXEFwYWNoZUxhIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVMYSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICIuXEFwYWNoZVIiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVSIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgQ29yZVJcQXBhY2hlQ29yZS5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFwYWNoZSAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxBcGFjaGVMMCIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIi5cQXBhY2hlTDAiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiLlxBcGFjaGVEIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi5cQXBhY2hlRCIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIENvcmVEXEFwYWNoZUNvcmUubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NgotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAiQXBhY2hlIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAiQXBhY2hlIC0gV2luMzIgRGVidWciCi0jIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtocGo7YmF0O2ZvcjtmOTAiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG9zXHdpbjMyXG1haW5fd2luMzIuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubDtmaTtmZCIKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47Y250O3J0ZjtnaWY7anBnO2pwZWc7anBlIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxvc1x3aW4zMlxhcGFjaGUuaWNvCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxvc1x3aW4zMlxhcGFjaGUucmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9BcGFjaGUuZHN3IGIvQXBhY2hlLmRzdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YzM2M1OS4uMDAwMDAwMAotLS0gYS9BcGFjaGUuZHN3CisrKyAvZGV2L251bGwKQEAgLTEsNDYwICswLDAgQEAKLU1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFdvcmtzcGFjZSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwCi0jIFdBUk5JTkc6IERPIE5PVCBFRElUIE9SIERFTEVURSBUSElTIFdPUktTUEFDRSBGSUxFIQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVByb2plY3Q6ICJBcGFjaGUiPSIuXEFwYWNoZS5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4KLQotUGFja2FnZT08NT4KLXt7ewotfX19Ci0KLVBhY2thZ2U9PDQ+Ci17e3sKLSAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBQcm9qZWN0X0RlcF9OYW1lIEFwYWNoZUNvcmUKLSAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgUHJvamVjdF9EZXBfTmFtZSBhcHJsaWJkbGwKLSAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Ci19fX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1Qcm9qZWN0OiAiQXBhY2hlQ29yZSI9Ii5cQXBhY2hlQ29yZS5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4KLQotUGFja2FnZT08NT4KLXt7ewotfX19Ci0KLVBhY2thZ2U9PDQ+Ci17e3sKLSAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBQcm9qZWN0X0RlcF9OYW1lIGFwCi0gICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgYXBybGliZGxsCi0gICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgcmVnZXgKLSAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgUHJvamVjdF9EZXBfTmFtZSBnZW5fdGVzdF9jaGFyCi0gICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgZ2VuX3VyaV9kZWxpbXMKLSAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Ci19fX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1Qcm9qZWN0OiAiQXBhY2hlTW9kdWxlQXV0aEFub24iPSIuXG9zXHdpbjMyXEFwYWNoZU1vZHVsZUF1dGhBbm9uLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0PgotCi1QYWNrYWdlPTw1Pgote3t7Ci19fX0KLQotUGFja2FnZT08ND4KLXt7ewotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgQXBhY2hlQ29yZQotICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBQcm9qZWN0X0RlcF9OYW1lIGFwcmxpYmRsbAotICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kKLX19fQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVByb2plY3Q6ICJBcGFjaGVNb2R1bGVDRVJOTWV0YSI9Ii5cb3Ncd2luMzJcQXBhY2hlTW9kdWxlQ0VSTk1ldGEuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0KLVBhY2thZ2U9PDU+Ci17e3sKLX19fQotCi1QYWNrYWdlPTw0Pgote3t7Ci0gICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgUHJvamVjdF9EZXBfTmFtZSBBcGFjaGVDb3JlCi0gICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgYXBybGliZGxsCi0gICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQotfX19Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotUHJvamVjdDogIkFwYWNoZU1vZHVsZURpZ2VzdCI9Ii5cb3Ncd2luMzJcQXBhY2hlTW9kdWxlRGlnZXN0LmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0PgotCi1QYWNrYWdlPTw1Pgote3t7Ci19fX0KLQotUGFja2FnZT08ND4KLXt7ewotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgQXBhY2hlQ29yZQotICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBQcm9qZWN0X0RlcF9OYW1lIGFwcmxpYmRsbAotICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kKLX19fQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVByb2plY3Q6ICJBcGFjaGVNb2R1bGVFeHBpcmVzIj0iLlxvc1x3aW4zMlxBcGFjaGVNb2R1bGVFeHBpcmVzLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0PgotCi1QYWNrYWdlPTw1Pgote3t7Ci19fX0KLQotUGFja2FnZT08ND4KLXt7ewotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgQXBhY2hlQ29yZQotICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBQcm9qZWN0X0RlcF9OYW1lIGFwcmxpYmRsbAotICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kKLX19fQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVByb2plY3Q6ICJBcGFjaGVNb2R1bGVIZWFkZXJzIj0iLlxvc1x3aW4zMlxBcGFjaGVNb2R1bGVIZWFkZXJzLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0PgotCi1QYWNrYWdlPTw1Pgote3t7Ci19fX0KLQotUGFja2FnZT08ND4KLXt7ewotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgQXBhY2hlQ29yZQotICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBQcm9qZWN0X0RlcF9OYW1lIGFwcmxpYmRsbAotICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kKLX19fQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVByb2plY3Q6ICJBcGFjaGVNb2R1bGVJbmZvIj0iLlxvc1x3aW4zMlxBcGFjaGVNb2R1bGVJbmZvLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0PgotCi1QYWNrYWdlPTw1Pgote3t7Ci19fX0KLQotUGFja2FnZT08ND4KLXt7ewotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgQXBhY2hlQ29yZQotICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBQcm9qZWN0X0RlcF9OYW1lIGFwcmxpYmRsbAotICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kKLX19fQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVByb2plY3Q6ICJBcGFjaGVNb2R1bGVQcm94eSI9Ii5cbW9kdWxlc1xwcm94eVxBcGFjaGVNb2R1bGVQcm94eS5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4KLQotUGFja2FnZT08NT4KLXt7ewotfX19Ci0KLVBhY2thZ2U9PDQ+Ci17e3sKLSAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBQcm9qZWN0X0RlcF9OYW1lIEFwYWNoZUNvcmUKLSAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgUHJvamVjdF9EZXBfTmFtZSBhcHJsaWJkbGwKLSAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Ci19fX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1Qcm9qZWN0OiAiQXBhY2hlTW9kdWxlUmV3cml0ZSI9Ii5cb3Ncd2luMzJcQXBhY2hlTW9kdWxlUmV3cml0ZS5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4KLQotUGFja2FnZT08NT4KLXt7ewotfX19Ci0KLVBhY2thZ2U9PDQ+Ci17e3sKLSAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBQcm9qZWN0X0RlcF9OYW1lIEFwYWNoZUNvcmUKLSAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgUHJvamVjdF9EZXBfTmFtZSBhcHJsaWJkbGwKLSAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Ci19fX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1Qcm9qZWN0OiAiQXBhY2hlTW9kdWxlU3BlbGluZyI9Ii5cb3Ncd2luMzJcQXBhY2hlTW9kdWxlU3BlbGluZy5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4KLQotUGFja2FnZT08NT4KLXt7ewotfX19Ci0KLVBhY2thZ2U9PDQ+Ci17e3sKLSAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBQcm9qZWN0X0RlcF9OYW1lIEFwYWNoZUNvcmUKLSAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgUHJvamVjdF9EZXBfTmFtZSBhcHJsaWJkbGwKLSAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Ci19fX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1Qcm9qZWN0OiAiQXBhY2hlTW9kdWxlU3RhdHVzIj0iLlxvc1x3aW4zMlxBcGFjaGVNb2R1bGVTdGF0dXMuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0KLVBhY2thZ2U9PDU+Ci17e3sKLX19fQotCi1QYWNrYWdlPTw0Pgote3t7Ci0gICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgUHJvamVjdF9EZXBfTmFtZSBBcGFjaGVDb3JlCi0gICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgYXBybGliZGxsCi0gICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQotfX19Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotUHJvamVjdDogIkFwYWNoZU1vZHVsZVVzZXJUcmFjayI9Ii5cb3Ncd2luMzJcQXBhY2hlTW9kdWxlVXNlclRyYWNrLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0PgotCi1QYWNrYWdlPTw1Pgote3t7Ci19fX0KLQotUGFja2FnZT08ND4KLXt7ewotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgQXBhY2hlQ29yZQotICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBQcm9qZWN0X0RlcF9OYW1lIGFwcmxpYmRsbAotICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kKLX19fQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVByb2plY3Q6ICJJbnN0YWxsQmluIj0iLlxJbnN0YWxsQmluLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0PgotCi1QYWNrYWdlPTw1Pgote3t7Ci19fX0KLQotUGFja2FnZT08ND4KLXt7ewotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgQXBhY2hlCi0gICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgQXBhY2hlQ29yZQotICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBQcm9qZWN0X0RlcF9OYW1lIEFwYWNoZU1vZHVsZUF1dGhBbm9uCi0gICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgQXBhY2hlTW9kdWxlQ0VSTk1ldGEKLSAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgUHJvamVjdF9EZXBfTmFtZSBBcGFjaGVNb2R1bGVEaWdlc3QKLSAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgUHJvamVjdF9EZXBfTmFtZSBBcGFjaGVNb2R1bGVFeHBpcmVzCi0gICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgQXBhY2hlTW9kdWxlSGVhZGVycwotICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBQcm9qZWN0X0RlcF9OYW1lIEFwYWNoZU1vZHVsZVJld3JpdGUKLSAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgUHJvamVjdF9EZXBfTmFtZSBBcGFjaGVNb2R1bGVTcGVsaW5nCi0gICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgQXBhY2hlTW9kdWxlU3RhdHVzCi0gICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgQXBhY2hlTW9kdWxlVXNlclRyYWNrCi0gICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgYXBybGliZGxsCi0gICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgaHRwYXNzd2QKLSAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgUHJvamVjdF9EZXBfTmFtZSByb3RhdGVsb2dzCi0gICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQotfX19Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotUHJvamVjdDogImFwIj0iLlxhcFxhcC5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4KLQotUGFja2FnZT08NT4KLXt7ewotfX19Ci0KLVBhY2thZ2U9PDQ+Ci17e3sKLX19fQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVByb2plY3Q6ICJhcHJsaWIiPSIuXGxpYlxhcHJcYXBybGliLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0PgotCi1QYWNrYWdlPTw1Pgote3t7Ci19fX0KLQotUGFja2FnZT08ND4KLXt7ewotfX19Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotUHJvamVjdDogImFwcmxpYmRsbCI9Ii5cbGliXGFwclxhcHJsaWJkbGwuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0KLVBhY2thZ2U9PDU+Ci17e3sKLX19fQotCi1QYWNrYWdlPTw0Pgote3t7Ci0gICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgUHJvamVjdF9EZXBfTmFtZSBhcHJsaWIKLSAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Ci19fX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1Qcm9qZWN0OiAiZ2VuX3Rlc3RfY2hhciI9Ii5cbWFpblxnZW5fdGVzdF9jaGFyLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0PgotCi1QYWNrYWdlPTw1Pgote3t7Ci19fX0KLQotUGFja2FnZT08ND4KLXt7ewotfX19Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotUHJvamVjdDogImdlbl91cmlfZGVsaW1zIj0iLlxtYWluXGdlbl91cmlfZGVsaW1zLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0PgotCi1QYWNrYWdlPTw1Pgote3t7Ci19fX0KLQotUGFja2FnZT08ND4KLXt7ewotfX19Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotUHJvamVjdDogImh0ZGlnZXN0Ij0iLlxzdXBwb3J0XGh0ZGlnZXN0LmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0PgotCi1QYWNrYWdlPTw1Pgote3t7Ci19fX0KLQotUGFja2FnZT08ND4KLXt7ewotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgYXBybGliCi0gICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQotfX19Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotUHJvamVjdDogImh0cGFzc3dkIj0iLlxzdXBwb3J0XGh0cGFzc3dkLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0PgotCi1QYWNrYWdlPTw1Pgote3t7Ci19fX0KLQotUGFja2FnZT08ND4KLXt7ewotICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQotICAgIFByb2plY3RfRGVwX05hbWUgYXAKLSAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgUHJvamVjdF9EZXBfTmFtZSBhcHJsaWIKLSAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Ci19fX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1Qcm9qZWN0OiAiaW5zdGFsbCI9Ii5cb3Ncd2luMzJcaW5zdGFsbGVyXGluc3RhbGxkbGxcaW5zdGFsbC5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4KLQotUGFja2FnZT08NT4KLXt7ewotfX19Ci0KLVBhY2thZ2U9PDQ+Ci17e3sKLSAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBQcm9qZWN0X0RlcF9OYW1lIGFwcmxpYgotICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kKLX19fQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVByb2plY3Q6ICJsb2dyZXNvbHZlIj0iLlxzdXBwb3J0XGxvZ3Jlc29sdmUuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0KLVBhY2thZ2U9PDU+Ci17e3sKLX19fQotCi1QYWNrYWdlPTw0Pgote3t7Ci19fX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1Qcm9qZWN0OiAicmVnZXgiPSIuXHJlZ2V4XHJlZ2V4LmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0PgotCi1QYWNrYWdlPTw1Pgote3t7Ci19fX0KLQotUGFja2FnZT08ND4KLXt7ewotfX19Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotUHJvamVjdDogInJvdGF0ZWxvZ3MiPSIuXHN1cHBvcnRccm90YXRlbG9ncy5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4KLQotUGFja2FnZT08NT4KLXt7ewotfX19Ci0KLVBhY2thZ2U9PDQ+Ci17e3sKLX19fQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUdsb2JhbDoKLQotUGFja2FnZT08NT4KLXt7ewotfX19Ci0KLVBhY2thZ2U9PDM+Ci17e3sKLX19fQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9CdWlsZEJpbi5kc3AgYi9CdWlsZEJpbi5kc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyOGM3YjYuLjAwMDAwMDAKLS0tIGEvQnVpbGRCaW4uZHNwCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJCdWlsZEJpbiIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBFeHRlcm5hbCBUYXJnZXQiIDB4MDEwNgotCi1DRkc9QnVpbGRCaW4gLSBXaW4zMiBEZWJ1ZwotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJCdWlsZEJpbi5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIkJ1aWxkQmluLm1hayIgQ0ZHPSJCdWlsZEJpbiAtIFdpbjMyIERlYnVnIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgIkJ1aWxkQmluIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBFeHRlcm5hbCBUYXJnZXQiKQotIU1FU1NBR0UgIkJ1aWxkQmluIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRXh0ZXJuYWwgVGFyZ2V0IikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwCi0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotCi0hSUYgICIkKENGRykiID09ICJCdWlsZEJpbiAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiIgotIyBQUk9QIEJBU0UgQ21kX0xpbmUgIk5NQUtFIC9mIG1ha2VmaWxlLndpbiIKLSMgUFJPUCBCQVNFIFJlYnVpbGRfT3B0ICIvYSIKLSMgUFJPUCBCQVNFIFRhcmdldF9GaWxlICJcQXBhY2hlMi4wXGJpblxBcGFjaGUuZXhlIgotIyBQUk9QIEJBU0UgQnNjX05hbWUgIi5cQnJvd3NlXEJ1aWxkQmluLmJzYyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICIiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiIgotIyBQUk9QIENtZF9MaW5lICJOTUFLRSAvZiBtYWtlZmlsZS53aW4gSU5TVERJUj0iXEFwYWNoZTIiIF9kdW1teSIKLSMgUFJPUCBSZWJ1aWxkX09wdCAiIgotIyBQUk9QIFRhcmdldF9GaWxlICJcQXBhY2hlMlxiaW5cQXBhY2hlLmV4ZSIKLSMgUFJPUCBCc2NfTmFtZSAiLlxCcm93c2VcQXBhY2hlLmJzYyIKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJCdWlsZEJpbiAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIiIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIiIKLSMgUFJPUCBCQVNFIENtZF9MaW5lICJOTUFLRSAvZiBtYWtlZmlsZS53aW4iCi0jIFBST1AgQkFTRSBSZWJ1aWxkX09wdCAiL2EiCi0jIFBST1AgQkFTRSBUYXJnZXRfRmlsZSAiXEFwYWNoZTIuMFxiaW5cQXBhY2hlLmV4ZSIKLSMgUFJPUCBCQVNFIEJzY19OYW1lICIuXEJyb3dzZVxCdWlsZEJpbi5ic2MiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIiIKLSMgUFJPUCBDbWRfTGluZSAiTk1BS0UgL2YgbWFrZWZpbGUud2luIElOU1RESVI9IlxBcGFjaGUyIiBfZHVtbXkiCi0jIFBST1AgUmVidWlsZF9PcHQgIiIKLSMgUFJPUCBUYXJnZXRfRmlsZSAiXEFwYWNoZTJcYmluXEFwYWNoZS5leGUiCi0jIFBST1AgQnNjX05hbWUgIi5cQnJvd3NlXEFwYWNoZS5ic2MiCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAiQnVpbGRCaW4gLSBXaW4zMiBSZWxlYXNlIgotIyBOYW1lICJCdWlsZEJpbiAtIFdpbjMyIERlYnVnIgotCi0hSUYgICIkKENGRykiID09ICJCdWlsZEJpbiAtIFdpbjMyIFJlbGVhc2UiCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJCdWlsZEJpbiAtIFdpbjMyIERlYnVnIgotCi0hRU5ESUYgCi0KLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cb3Ncd2luMzJcQmFzZUFkZHIucmVmCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxDSEFOR0VTCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxNYWtlZmlsZS53aW4KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXFNUQVRVUwotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvQ0hBTkdFUyBiL0NIQU5HRVMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyN2VhYjAuLjAwMDAwMDAKLS0tIGEvQ0hBTkdFUworKysgL2Rldi9udWxsCkBAIC0xLDg3MjIgKzAsMCBAQAotQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjBhOQotCi0gICopIERpc3RyaWJ1dGlvbiBkaXJlY3Rvcnkgc3RydWN0dXJlIHJlb3JnYW5pemVkIHRvIHJlZmxlY3QgYQotICAgICBub3JtYWwgc291cmNlIGRpc3RyaWJ1dGlvbiB3aXRoIGV4dGVybmFsIGluc3RhbGwgdGFyZ2V0cy4KLSAgICAgW1JveSBGaWVsZGluZ10KLQotICAqKSBUaGUgTVBNcyB0aGF0IG5lZWQgbXVsdGlwbGUgc2VnbWVudHMgb2Ygc2hhcmVkIG1lbW9yeSBub3cgY3JlYXRlCi0gICAgIHR3byBhcHJfc2htZW1fdCB2YXJpYWJsZXMsIG9uZSBmb3IgZWFjaCBzaGFyZWQgbWVtb3J5IGFsbG9jYXRpb24uCi0gICAgIHRoZSBwcm9ibGVtIGlzIHRoYXQgd2UgY2FuJ3QgZGV0ZXJtaW5lIGhvdyBtdWNoIG1lbW9yeSB3aWxsIGJlIHJlcXVpcmVkCi0gICAgIGZvciBzaGFyZWQgbWVtb3J5IGFsbG9jYXRpb25zIG9uY2Ugd2UgdHJ5IHRvIGFsbG9jYXRlIG1vcmUgdGhhbiBvbmUKLSAgICAgdmFyaWFibGUuICBUaGUgTU0gY29kZSBhdXRvbWF0aWNhbGx5IGFsaWducyB0aGUgc2hhcmVkIG1lbW9yeSBhbGxvY2F0aW9ucywKLSAgICAgc28gd2UgZW5kIHVwIG5lZWRpbmcgdG8gcGFkIHRoZSBhbW91bnQgb2Ygc2hhcmVkIG1lbW9yeSB3ZSB3YW50IGJhc2VkCi0gICAgIG9uIGhvdyBtYW55IHZhcmlhYmxlcyB3aWxsIGJlIGFsbG9jYXRlZCBvdXQgb2YgdGhlIHNoYXJlZCBtZW1vcnkgc2VnbWVudC4KLSAgICAgSXQgaXMganVzdCBlYXNpZXIgdG8gY3JlYXRlIGEgc2Vjb25kIGFwcl9zaG1lbV90IHZhcmlhYmxlLCBhbmQgdHdvCi0gICAgIHNobWVtIG1lbW9yeSBibG9ja3MuCi0gICAgIFtSeWFuIEJsb29tXQotCi0gICopIENsZWFudXAgdGhlIGV4cG9ydCBsaXN0IGEgYml0LiAgVGhpcyBjcmVhdGVzIGEgc2luZ2xlIHVuaWZpZWQgbGlzdCBvZgotICAgICBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgQVBSLiAgVGhlIGV4cG9ydCBsaXN0IGlzIGdlbmVyYXRlZCBhdCBjb25maWd1cmUKLSAgICAgdGltZSwgYW5kIHRoYXQgbGlzdCBpcyB0aGVuIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGV4cG9ydHMuYyBmaWxlLgotICAgICBCZWNhdXNlIG9mIHRoZSB3YXkgdGhlIGV4cG9ydCBsaXN0IGlzIGdlbmVyYXRlZCwgd2Ugb25seSBleHBvcnQgdGhvc2UKLSAgICAgZnVuY3Rpb25zIHRoYXQgYXJlIHZhbGlkIG9uIHRoZSBwbGF0Zm9ybSB3ZSBhcmUgYnVpbGRpbmcgb24uCi0gICAgIFtSeWFuIEJsb29tXQotCi0gICopIEVuYWJsZSBsb2dnaW5nIHRoZSBjb29raWUgd2l0aCBtb2RfbG9nX2NvbmZpZwotICAgICBbU2FuZGVyIHZhbiBab2VzdCA8c2FuZGVyQGNvdmFsZW50Lm5ldD5dCi0KLSAgKikgRml4IGEgc2VnZmF1bHQgaW4gbW9kX2luZm8gd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGNvbmZpZ3VyYXRpb24uCi0gICAgIFtKZWZmIFRyYXdpY2tdCi0KLSAgKikgQWRkZWQgbGliL2FwdXRpbC8gYXMgYSBwbGFjZWhvbGRlciBmb3IgdXRpbGl0eSBmdW5jdGlvbnMgd2hpY2ggYXJlIG5vdAotICAgICBzcGVjaWZpYyB0byB0aGUgQXBhY2hlIEhUVFAgU2VydmVyIChidXQgZG8gbm90IG1ha2Ugc2Vuc2Ugd2l0aCBBUFIpLgotICAgICBUaGUgZmlyc3QgdXRpbGl0eSBpcyAiYXB1X2RibSI6IGEgc2V0IG9mIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGggREJNCi0gICAgIGZpbGVzLiBUaGlzIGZpcnN0IHZlcnNpb24gY2FuIGJlIGNvbXBpbGVkIGZvciBTREJNIG9yIEdEQk0gZGF0YWJhc2VzLgotICAgICBbR3JlZyBTdGVpbl0KLQotICAqKSBDb21wbGV0ZSByZS13cml0ZSBvZiBtb2RfaW5jbHVkZS4gIFRoaXMgbWFrZXMgbW9kX2luY2x1ZGUgYSBmaWx0ZXIgdGhhdAotICAgICB1c2VzIGJ1Y2tldHMgZGlyZWN0bHkuICBUaGlzIGhhcyBub3cgc2VydmVkIHRoZSBGQVEgY29ycmVjdGx5LgotICAgICBbUGF1bCBSZWRlciA8cmVkZXJwakByYWxlaWdoLmlibS5jb20+XQotCi0gICopIEFsbG93IG1vZHVsZXMgdG8gc3BlY2lmeSB0aGUgZmlyc3QgZmlsdGVyIGluIGEgc3ViX3JlcXVlc3Qgd2hlbgotICAgICBtYWtpbmcgdGhlIHN1Yl9yZXF1ZXN0LiAgVGhpcyBrZWVwcyBtb2R1bGVzIGZyb20gaGF2aW5nIHRvIGNoYW5nZSB0aGUKLSAgICAgb3V0cHV0X2ZpbHRlciBpbW1lZGlhdGVseSBhZnRlciBjcmVhdGluZyB0aGUgc3ViLXJlcXVlc3QsIGFuZCB0aGVyZWZvcmUKLSAgICAgc2tpcCB0aGUgc3ViX3JlcV9vdXRwdXRfZmlsdGVyLiAgW1J5YW4gQmxvb21dCi0KLSAgKikgVXBkYXRlIGFiIHRvIGFjY2VwdCBVUkxzIHdpdGggSVB2NiBsaXRlcmFsIGFkZHJlc3Mgc3RyaW5ncyAoaW4gdGhlCi0gICAgIGZvcm1hdCBkZXNjcmliZWQgaW4gUkZDIDI3MzIpLCBhbmQgdG8gYnVpbGQgSG9zdCBoZWFkZXIgZmllbGRzIGluCi0gICAgIHRoZSBzYW1lIGZvcm1hdC4gIFRoaXMgYWxsb3dzIElQdjYgbGl0ZXJhbCBhZGRyZXNzIHN0cmluZ3MgdG8gYmUKLSAgICAgdXNlZCB3aXRoIGFiLiAgVGhpcyBzdXBwb3J0IGhhcyBiZWVuIHRlc3RlZCBhZ2FpbnN0IEFwYWNoZSAxLjMgd2l0aCAKLSAgICAgdGhlIEtBTUUgcGF0Y2gsIGJ1dCBBcGFjaGUgMi4wIGRvZXMgbm90IHlldCB3b3JrIHdpdGggdGhpcyBmb3JtYXQKLSAgICAgb2YgdGhlIEhvc3QgaGVhZGVyIGZpZWxkLiAgW0plZmYgVHJhd2lja10KLQotICAqKSBBY2NvbW9kYXRlIGFuIG91dC1vZi1zcGFjZSBjb25kaXRpb24gaW4gdGhlIHBpcGVkIGxvZ3MgYW5kIHRoZQotICAgICByb3RhdGVsb2dzLmMgY29kZSwgYW5kIG5vIGxvbmdlciBjaHVybiBsb2cgcHJvY2Vzc2VzIGZvciB0aGlzCi0gICAgIGNvbmRpdGlvbi4gIFtWaWN0b3IgSi4gT3JsaWtvd3NraV0KLQotICAqKSBBZGQgc3VwcG9ydCBmb3IgcGFydGlhbCB3cml0ZXMgd2l0aCBhcHJfc2VuZGZpbGUoKSB0byBjb3JlX291dHB1dF9maWx0ZXIuCi0gICAgIFtHcmVnIEFtZXNdIAotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDIuMGE4Ci0KLSAgKikgQWRkIGEgZGlyZWN0aXZlIHRvIG1vZF9taW1lIHNvIHRoYXQgZmlsdGVycyBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoCi0gICAgIGEgZ2l2ZW4gbWltZS10eXBlLgotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBHZXQgbXVsdGktdmlld3Mgd29ya2luZyBhZ2Fpbi4gIFdlIHdlcmUgc2V0dGluZyB0aGUgcGF0aF9pbmZvCi0gICAgIGZpZWxkIGluY29ycmVjdGx5IGlmIHdlIGNvdWxkbid0IGZpbmQgdGhlIHNwZWNpZmllZCBmaWxlLgotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBGaXggMzA0IHByb2Nlc3NpbmcuICBUaGUgY29yZSBzaG91bGQgbmV2ZXIgdHJ5IHRvIHNlbmQgdGhlIGhlYWRlcnMKLSAgICAgZG93biB0aGUgZmlsdGVyIHN0YWNrLiAgQWx3YXlzLCBqdXN0IHNldHVwIHRoZSB0YWJsZSBpbiB0aGUgcmVxdWVzdAotICAgICByZWNvcmQsIGFuZCBsZXQgdGhlIGhlYWRlciBmaWx0ZXIgY29udmVydCBpdCB0byBkYXRhIHRoYXQgaXMgcmVhZHkKLSAgICAgZm9yIHRoZSBuZXR3b3JrLgotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBNb3JlIGZpeGVzIGZvciB0aGUgcHJveHkuICBUaGVyZSBhcmUgc3RpbGwgYnVncyBpbiB0aGUgcHJveHkgY29kZSwKLSAgICAgYnV0IHRoaXMgaGFzIG5vdyBwcm94aWVkIHd3dy55YWhvby5jb20gYW5kIHd3dy5udHJuZXQubmV0IChteSBJU1ApCi0gICAgIHN1Y2Nlc3NmdWxseS4KLSAgICAgW1J5YW4gQmxvb21dCi0KLSAgKikgRml4IHBhcmFtcyBmb3IgYXByX2dldGFkZHJpbmZvKCkgY2FsbCBpbiBjb25uZWN0IHByb3h5IGhhbmRsZXIuCi0gICAgIFtDaHVjayBNdXJja29dCi0KLSAgKikgQVBSOiBBZGQgbmV3IGFwcl9nZXRvcHRfbG9uZyBmdW5jdGlvbiB0byBoYW5kbGUgbG9uZyBvcHRpb25zLgotICAgICBbQi4gVy4gRml0enBhdHJpY2sgPGZpdHpAcmVkLWJlYW4uY29tPl0KLQotICAqKSBBUFI6IENoYW5nZSBhcHJfY29ubmVjdCgpIHRvIHRha2UgYXByX3NvY2thZGRyX3QgaW5zdGVhZCBvZiBob3N0bmFtZS4KLSAgICAgQWRkIGdlbmVyaWMgYXByX2NyZWF0ZV9zb2NrZXQoKS4gIEFkZCBhcHJfZ2V0YWRkcmluZm8oKSBmb3IgZG9pbmcKLSAgICAgaG9zdG5hbWUgcmVzb2x1dGlvbi9hZGRyZXNzIHN0cmluZyBwYXJzaW5nIGFuZCBidWlsZGluZwotICAgICBhcHJfc29ja2FkZHJfdC4gIEFkZCBhcHJfZ2V0X3NvY2thZGRyKCkgZm9yIGdldHRpbmcgdGhlIGFkZHJlc3MKLSAgICAgb2Ygb25lIG9mIHRoZSBhcHJfc29ja2FkZHJfdCBzdHJ1Y3R1cmVzIGZvciBhIHNvY2tldC4gIENoYW5nZQotICAgICBhcHJfYmluZCgpIHRvIHRha2UgYXByX3NvY2thZGRyX3QuICBbRGF2aWQgUmVpZCBhbmQgSmVmZiBUcmF3aWNrXQotCi0gICopIFJlbW92ZSB0aGUgQlVGRiBmcm9tIHRoZSBIVFRQIHByb3h5LiAgVGhpcyBpcyBzdGlsbCBhIGJpdCB1Z2x5LCBidXQKLSAgICAgSSBoYXZlIHByb3hpZWQgcGFnZXMgd2l0aCBpdCwgY2xlYW51cCB3aWxsIGNvbW1lbmNlIHNvb24uCi0gICAgIFtSeWFuIEJsb29tXQotCi0gICopIE1ha2UgdGhlIHByb3h5IHdvcmsgd2l0aCBmaWx0ZXJzLiAgVGhpcyBpc24ndCBwZXJmZWN0LCBiZWNhdXNlIHdlCi0gICAgIGFyZW4ndCBkZWFsaW5nIHdpdGggdGhlIGhlYWRlcnMgcHJvcGVybHkuICBbUnlhbiBCbG9vbV0KLQotICAqKSBEbyBub3Qgc2VuZCBhIGNvbnRlbnQtbGVuZ3RoIGlmZiB0aGUgQy1MIGlzIDAgYW5kIHRoaXMgaXMgYSBoZWFkCi0gICAgIHJlcXVlc3QuICBbUnlhbiBCbG9vbV0KLQotICAqKSBNYWtlIGNnaS1iaW4gd29yayBhcyBhIHJlZ3VsYXIgZGlyZWN0b3J5IHdoZW4gdXNpbmcgbW9kX3Zob3N0X2FsaWFzCi0gICAgIHdpdGggbm8gVmlydHVhbFNjcmlwdEFsaWFzIGRpcmVjdGl2ZXMuIFBSIzY4MjkgW1RvbnkgRmluY2hdCi0KLSAgKikgUmVtb3ZlIEJVRkYgZnJvbSB0aGUgUFJPWFkgY29ubmVjdCBoYW5kbGluZy4gW1J5YW4gQmxvb21dCi0KLSAgKikgR2V0IHRoZSBkZWZhdWx0X2hhbmRsZXIgdG8gc3RvcCB0cnlpbmcgdG8gZGVhbCB3aXRoIEhFQUQgcmVxdWVzdHMuCi0gICAgIFRoZSBpZGVhIGlzIHRvIGxldCB0aGUgY29udGVudC1sZW5ndGggZmlsdGVyIGNvbXB1dGUgdGhlIEMtTCBiZWZvcmUKLSAgICAgd2UgdHJ5IHRvIHNlbmQgdGhlIGRhdGEuICBJZiB3ZSBjYW4gZ2V0IHRoZSBDLUwgY29ycmVjdGx5LCB0aGVuIHdlCi0gICAgIHNob3VsZCBzZW5kIGl0IGluIHRoZSBIRUFEIHJlc3BvbnNlLgotICAgICBbUnlhbiBCbG9vbV0KLSAgICAgCi0gICopIFRoZSBIZWFkZXIgZmlsdGVyIGNhbiBub3cgZGV0ZXJtaW5lIGlmIGEgYm9keSBzaG91bGQgYmUgc2VudCBiYXNlZAotICAgICBvbiByLT5oZWFkZXJfb25seS4gIFRoZSBnZW5lcmFsIGlkZWEgb2YgdGhpcyBpcyB0aGF0IGlmIHdlIGRlbGF5Ci0gICAgIGRlY2lkaW5nIHRvIHNlbmQgdGhlIGJvZHksIHRoZW4gd2UgbWlnaHQgYmUgYWJsZSB0byBjb21wdXRlIHRoZQotICAgICBjb250ZW50LWxlbmd0aCBjb3JyZWN0bHksIHdoaWNoIHdpbGwgaGVscCBjYWNoaW5nIHByb3hpZXMgdG8gY2FjaGUKLSAgICAgb3VyIGRhdGEgYmV0dGVyLiAgQW55IGhhbmRsZXIgdGhhdCBkb2Vzbid0IHdhbnQgdG8gdHJ5IHRvIGNvbXB1dGUKLSAgICAgdGhlIGNvbnRlbnQtbGVuZ3RoIGNhbiBqdXN0IHNlbmQgYW4gRU9TIGJ1Y2tldCB3aXRob3V0IGRhdGEgYW5kCi0gICAgIGV2ZXJ5dGhpbmcgd2lsbCBqdXN0IHdvcmsuCi0gICAgIFtSeWFuIEJsb29tXQotCi0gICopIEFkZCB0aGUgcmVmZXJlciB0byB0aGUgZXJyb3IgbG9nIGlmIG9uZSBpcyBhdmFpbGFibGUuCi0gICAgIFtNYXJrdXMgR3lnZXIgPG1neWdlckBpdHIuY2g+XQotCi0gICopIE1vZF9pbmZvLmMgaGFzIG5vdyBiZWVuIHBvcnRlZCB0byBBcGFjaGUgMi4wLiAgQXMgYSBwYXJ0IG9mIHRoaXMKLSAgICAgY2hhbmdlLCB0aGUgcm9vdCBvZiB0aGUgY29uZmlndXJhdGlvbiB0cmVlIGhhcyBiZWVuIGV4cG9zZWQgdG8gbW9kdWxlcwotICAgICBhcyBhcF9jb25mdHJlZS4KLSAgICAgW1J5YW4gTW9yZ2FuIDxybW9yZ2FuQGNvdmFsZW50Lm5ldD5dCi0KLSAgKikgR2V0IHRoZSBjb3JlX291dHB1dF9maWx0ZXIgdG8gdXNlIHRoZSBidWNrZXQgaW50ZXJmYWNlIGRpcmVjdGx5LgotICAgICBUaGlzIGtlZXBzIHVzIGZyb20gY2FsbGluZyB0aGUgY29udGVudC1sZW5ndGggZmlsdGVyIG11bHRpcGxlIHRpbWVzCi0gICAgIGZvciBhIHNpbXBsZSBzdGF0aWMgcmVxdWVzdC4KLSAgICAgW1J5YW4gQmxvb21dCi0KLSAgKikgV2UgYXJlIHNlbmRpbmcgdGhlIGNvbnRlbnQtdHlwZSBjb3JyZWN0bHkgbm93LgotICAgICBbUnlhbiBCbG9vbSBhbmQgV2lsbCBSb3dlXQotCi0gICopIEFQUiBvbiBGcmVlQlNEOiBGaXggYSBidWcgaW4gYXByX3NlbmRmaWxlKCkgd2hpY2ggY2F1c2VkIHVzIHRvIHJlcG9ydAotICAgICBhIGJvZ3VzIGJ5dGVzLXNlbnQgdmFsdWUgd2hlbiB0aGUgb25seSB0aGluZyBiZWluZyBzZW50IHdhcyB0cmFpbGVycwotICAgICBhbmQgd3JpdGV2KCkgcmV0dXJuZWQgYW4gZXJyb3IgKG9yIEVBR0FJTikuICBbSmVmZiBUcmF3aWNrXQotCi0gICopIEdldCBTSU5HTEVfTElTVEVOX1VOU0VSSUFMSVpFRF9BQ0NFUFQgd29ya2luZyBhZ2Fpbi4gIFRoaXMgdXNlcyB0aGUKLSAgICAgaGludHMgZmlsZSB0byBkZXRlcm1pbmUgd2hpY2ggcGxhdGZvcm1zIGRlZmluZSAKLSAgICAgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBULgotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBBUFI6IGFkZCBhcHJfZ2V0X2hvbWVfZGlyZWN0b3J5KCkgIFtKZWZmIFRyYXdpY2tdCi0KLSAgKikgSW5pdGlhbCBpbXBvcnQgb2YgMS4zLWN1cnJlbnQgbW9kX3Byb3h5LiBbQ2h1Y2sgTXVyY2tvXQotCi0gICopIE5vdCBhbGwgcGxhdGZvcm1zIGhhdmUgSU5BRERSX05PTkUgZGVmaW5lZCBieSBkZWZhdWx0LiAgQXBhY2hlCi0gICAgIHVzZWQgdG8gbWFrZSB0aGlzIGNoZWNrIGFuZCBkZWZpbmUgSU5BRERSX05PTkUgaWYgYXBwcm9wcmlhdGUsCi0gICAgIGJ1dCBBUFIgbmVlZHMgdGhlIGNoZWNrIHRvbywgYW5kIEkgc3VzcGVjdCBvdGhlciBhcHBsaWNhdGlvbnMgd2lsbAotICAgICBhcyB3ZWxsLiAgQVBSIG5vdyBkZWZpbmVzIEFQUl9JTkFERFJfTk9ORSwgd2hpY2ggaXMgYWx3YXlzIGEgdmFsaWQKLSAgICAgdmFsdWUgb24gYWxsIHBsYXRmb3Jtcy4KLSAgICAgW0JyYW5rbyDIaWJlaiA8YnJhbmVAeGJjLm51Pl0KLQotICAqKSBEZXN0cm95IHRoZSBwdGhyZWFkIG11dGV4IGluIGxvY2tfaW50cmFfY2xlYW51cCgpIGZvciBQUiM2ODI0LgotICAgICBbU2h1aWNoaSBLaXRhZ3VjaGkgPGtpQGhoLmlpajR1Lm9yLmpwPl0gCi0KLSAgKikgUmVsYXggdGhlIHN5bnRheCBjaGVja2luZyBvZiBIb3N0OiBoZWFkZXJzIGluIG9yZGVyIHRvIHN1cHBvcnQKLSAgICAgaUROUy4gUFIjNjYzNSBbVG9ueSBGaW5jaF0KLQotICAqKSBXaGVuIHJlYWRpbmcgZnJvbSBmaWxlIGJ1Y2tldHMgd2UgY29udmVydCB0byBhbiBNTUFQIGlmIGl0IG1ha2VzCi0gICAgIHNlbnNlLiAgVGhpcyBhbHNvIHNpbXBsaWZpZXMgdGhlIGRlZmF1bHQgaGFuZGxlciBiZWNhdXNlIHRoZQotICAgICBkZWZhdWx0IGhhbmRsZXIgbm8gbG9uZ2VyIG5lZWRzIHRvIHRyeSB0byBjcmVhdGUgTU1BUHMuCi0gICAgIFtSeWFuIEJsb29tXQotCi0gICopIEJVRkYgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBtYWluIHNlcnZlci4gIFRoZSBCVUZGIGNvZGUgd2lsbCByZW1haW4KLSAgICAgaW4gdGhlIGNvZGUgdW50aWwgaXQgaGFzIGJlZW4gcHVyZ2VkIGZyb20gdGhlIHByb3h5IG1vZHVsZSBhcyB3ZWxsLgotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBCeXRlcmFuZ2VzIGhhdmUgYmVlbiBjb21wbGV0ZWx5IHJlLXdyaXR0ZW4gdG8gYmUgYSBmaWx0ZXIuICBUaGlzCi0gICAgIGhhcyBiZWVuIHRlc3RlZCwgYW5kIEkgYmVsaWV2ZSBpdCBpcyB3b3JraW5nIGNvcnJlY3RseSwgYnV0IGl0IGNvdWxkCi0gICAgIGRvZXNuJ3Qgd29yayBmb3IgdGhlIEFkb2JlIEFjcm9iYXQgcGx1Zy1pbi4gIFRoZSBvdXRwdXQgYWxtb3N0IG1hdGNoZXMKLSAgICAgdGhlIG91dHB1dCBmcm9tIDEuMywgdGhlIG9ubHkgZGlmZmVyZW5jZSBiZWluZyB0aGF0IDEuMyBpbmNsdWRlcwotICAgICBhIGNvbnRlbnQtbGVuZ3RoIGluIHRoZSByZXNwb25zZSwgYW5kIHRoaXMgZG9lcyBub3QuCi0gICAgIFtSeWFuIEJsb29tXQotCi0gICopIEFQUiByZWFkL3dyaXRlIGZ1bmN0aW9ucyBhbmQgYnVja2V0IHJlYWQgZnVuY3Rpb25zIG5vdyBvcGVyYXRlCi0gICAgIG9uIHVuc2lnbmVkIGludGVnZXJzLCBpbnN0ZWFkIG9mIHNpZ25lZCBvbmVzLiAgSXQgZG9lc24ndCBtYWtlCi0gICAgIGFueSBzZW5zZSB0byB1c2Ugc2lnbmVkIGludHMsIGJlY2F1c2Ugd2UgcmV0dXJuIHRoZSBlcnJvciBjb2RlcywKLSAgICAgc28gaWYgd2UgaGF2ZSBhbiBlcnJvciB3ZSBzaG91bGQgcmVwb3J0IDAgYnl0ZXMgcmVhZCBvciB3cml0dGVuLgotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBBbHdheXMgY29tcHV0ZSB0aGUgY29udGVudCBsZW5ndGgsIHdoZXRoZXIgaXQgaXMgc2VudCBvciBub3QuCi0gICAgIFRoZSByZWFzb24gZm9yIHRoaXMsIGlzIHRoYXQgaXQgYWxsb3dzIHVzIHRvIGNvcnJlY3RseSByZXBvcnQKLSAgICAgdGhlIGJ5dGVzX3NlbnQgd2hlbiBsb2dnaW5nIHRoZSByZXF1ZXN0LiAgVGhpcyBhbHNvIHNpbXBsaWZpZXMKLSAgICAgY29udGVudC1sZW5ndGggZmlsdGVyIGEgYml0LCBhbmQgZml4ZXMgdGhlIGFjdHVhbCBieXRlLXJlcG9yaW5nCi0gICAgIGNvZGUgaW4gbW9kX2xvZ19jb25maWcuYwotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBSZW1vdmUgQVBfRU5EX09GX0JSSUdBREUgZGVmaW5pdGlvbi4gIFRoaXMgZG9lcyBub3Qgc2lnbmlmeSB3aGF0Ci0gICAgIGl0IHNheXMsIGJlY2F1c2UgaXQgd2FzIG9ubHkgdXNlZCBieSBFT1MgYW5kIEZMVVNIIGJ1Y2tldHMuICBTaW5jZQotICAgICBuZWl0aGVyIG9mIHRob3NlIGFyZSByZXF1aXJlZCBhdCB0aGUgZW5kIG9mIGEgYnJpZ2FkZSwgdGhpcyB3YXMKLSAgICAgcmVhbGx5IHNpZ25pZnlpbmcgRkxVU0hfVEhFX0RBVEEsIGJ1dCB0aGF0IGNhbiBiZSBkZXRlcm1pbmVkIGJldHRlcgotICAgICBieSBjaGVja2luZyBBUF9CVUNLRVRfSVNfRU9TKCkgb3IgQVBfQlVDS0VUX0lTX0ZMVVNILiAgRU9TIGFuZCBGTFVTSAotICAgICBidWNrZXRzIG5vdyByZXR1cm4gYSBsZW5ndGggb2YgMCwgd2hpY2ggaXMgYWN0dWFsbHkgdGhlIGFtb3VudCBvZiBkYXRhCi0gICAgIHJlYWQsIHNvIHRoZXkgbWFrZSBtb3JlIHNlbnNlLgotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBBbGxvdyB0aGUgY29yZV9vdXRwdXRfZmlsdGVyIHRvIHNhdmUgc29tZSBkYXRhIHBhc3QgdGhlIGVuZCBvZiBhCi0gICAgIHJlcXVlc3QuICBJZiB3ZSBnZXQgYW4gRU9TIGJ1Y2tldCwgd2Ugb25seSBzZW5kIHRoZSBkYXRhIGlmIGl0IAotICAgICBtYWtlcyBzZW5zZSB0byBzZW5kIGl0LiAgVGhpcyBhbGxvd3MgdXMgdG8gcGlwZWxpbmUgcmVxdWVzdAotICAgICByZXNwb25zZXMuICBBcyBhIHBhcnQgb2YgdGhpcywgd2UgYWxzbyBuZWVkIHRvIGFsbG9jYXRlIG1tYXAKLSAgICAgYnVja2V0cyBvdXQgb2YgdGhlIGNvbm5lY3Rpb24gcG9vbCwgbm90IHRoZSByZXF1ZXN0IHBvb2wuICBUaGlzCi0gICAgIGFsbG93cyB0aGUgbW1hcCB0byBvdXRsaXZlIHRoZSByZXF1ZXN0LgotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBNYWtlIGJsb2NraW5nIGFuZCBub24tYmxvY2tpbmcgYnVja2V0IHJlYWRzIHdvcmsgY29ycmVjdGx5IGZvcgotICAgICBzb2NrZXRzIGFuZCBwaXBlcy4gIFRoZXNlIGFyZSB0aGUgb25seSBidWNrZXQgdHlwZXMgdGhhdCBzaG91bGQKLSAgICAgaGF2ZSBub24tYmxvY2tpbmcgcmVhZHMsIGJlY2F1c2UgdGhlIG90aGVyIGJ1Y2tldCB0eXBlcyBzaG91bGQKLSAgICAgQUxXQVlTIGJlIGFibGUgdG8gcmV0dXJuIHNvbWV0aGluZyBpbW1lZGlhdGVseS4KLSAgICAgW1J5YW4gQmxvb21dCi0KLSAgKikgSW4gdGhlIEFwYWNoZS9XaW4zMiBjb25zb2xlIHdpbmRvdywgYWNjZXB0IEN0cmwrQyB0byBzdG9wIHRoZSAKLSAgICAgc2VydmVyLCBidXQgdXNlIEN0cmwrQnJlYWsgdG8gaW5pdGlhdGUgYSBncmFjZWZ1bCByZXN0YXJ0IAotICAgICBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIGJlaGF2aW9yLiBbSm9obiBTdGVybGluZ10KLQotICAqKSBQYXRjaCBtb2RfYXV0b2luZGV4IHRvIHNldCB0aGUgTGFzdC1Nb2RpZmllZCBoZWFkZXIgYmFzZWQgb24KLSAgICAgdGhlIGRpcmVjdG9yeSdzIG10aW1lLCBhbmQgYWRkIHRoZSBFVGFnIGhlYWRlci4gIFtXaWxsaWFtIFJvd2VdCi0KLSAgKikgTWVyZ2UgdGhlIDEuMyBwYXRjaCB0byBhZGQgc3VwcG9ydCBmb3IgbG9nZ2luZyBxdWVyeSBzdHJpbmcgaW4gCi0gICAgIHN1Y2ggYSB3YXkgdGhhdCAiJW0gJVUlcSAlSCIgaXMgdGhlIHNhbWUgYXMgIiVyIi4KLSAgICAgW0JpbGwgU3RvZGRhcmRdCi0KLSAgKikgUG9ydCB0aHJlZSBsb2cgbWV0aG9kcyBmcm9tIG1vZF9sb2dfY29uZmlnIDEuMyB0byAyLjA6IAotICAgICBDTEYgY29tcGxpYW50ICctJyBieXRlIGNvdW50LCBtZXRob2QgYW5kIHByb3RvY29sLgotICAgICBbQmlsbCBTdG9kZGFyZF0KLQotICAqKSBBZGQgYSBuZXcgTG9nRm9ybWF0IGRpcmVjdGl2ZSwgJWMsIHRoYXQgd2lsbCBsb2cgY29ubmVjdGlvbgotICAgICBzdGF0dXMgYXQgdGhlIGVuZCBvZiB0aGUgcmVzcG9uc2UgYXMgZm9sbG93czoKLSAgICAgJ1gnIC0gY29ubmVjdGlvbiBhYm9ydGVkIGJlZm9yZSB0aGUgcmVzcG9uc2UgY29tcGxldGVkLgotICAgICAnKycgLSBjb25uZWN0aW9uIG1heSBiZSBrZXB0LWFsaXZlIGJ5IHRoZSBzZXJ2ZXIuCi0gICAgICctJyAtIGNvbm5lY3Rpb24gd2lsbCBiZSBjbG9zZWQgYnkgdGhlIHNlcnZlci4KLSAgICAgW0JpbGwgU3RvZGRhcmRdCi0KLSAgKikgRXhwYW5kIEFQUiBmb3IgV2luTlQgdG8gZnVsbHkgYWNjZXB0IGFuZCByZXR1cm4gdXRmLTggZW5jb2RlZAotICAgICBVbmljb2RlIGZpbGUgbmFtZXMgYW5kIHBhdGhzIGZvciBXaW4zMiwgYW5kIHRhZyB0aGUgQ29udGVudC1UeXBlIAotICAgICBmcm9tIG1vZF9hdXRvaW5kZXggdG8gcmVmbGVjdCB0aGF0IGNoYXJzZXQgaWYgdGhlIHRoZSBmZWF0dXJlCi0gICAgIG1hY3JvIEFQUl9IQVNfVU5JQ09ERV9GUyBpcyB0cnVlLiAgW1dpbGxpYW0gUm93ZV0KLQotICAqKSBDb21wdXRlIHRoZSBjb250ZW50IGxlbmd0aCAoYW5kIGFkZCBhcHByb3ByaWF0ZSBoZWFkZXIgZmllbGQpIGZvcgotICAgICB0aGUgcmVzcG9uc2Ugd2hlbiBubyBjb250ZW50IGxlbmd0aCBpcyBhdmFpbGFibGUgYW5kIHdlIGNhbid0IHVzZSAKLSAgICAgY2h1bmtlZCBlbmNvZGluZy4gIFtKZWZmIFRyYXdpY2tdCi0KLSAgKikgQ2hhbmdlZCBhcF9kaXNjYXJkX3JlcXVlc3RfYm9keSgpIHRvIHVzZSBSRVFVRVNUX0NIVU5LRURfREVDSFVOSywKLSAgICAgc28gdGhhdCBjb250ZW50IGlucHV0IGZpbHRlcnMgZ2V0IGRlY2h1bmtlZCBkYXRhIHdoZW4gdXNpbmcKLSAgICAgdGhlIGRlZmF1bHQgaGFuZGxlci4gQWxzbyByZW1vdmVkIFJFUVVFU1RfQ0hVTktFRF9QQVNTLgotICAgICBbU2FzY2hhIFNjaHVtYW5uXQotICAgICAKLSAgKikgQWRkIG1vZF9leHRfZmlsdGVyIGFzIGFuIGV4cGVyaW1lbnRhbCBtb2R1bGUuICBUaGlzIG1vZHVsZSBhbGxvd3MKLSAgICAgdGhlIGFkbWluaXN0cmF0b3IgdG8gdXNlIGV4dGVybmFsIHByb2dyYW1zIGFzIGZpbHRlcnMuICBDdXJyZW50bHksCi0gICAgIG9ubHkgZmlsdGVyaW5nIG9mIG91dHB1dCBpcyBzdXBwb3J0ZWQuICBbSmVmZiBUcmF3aWNrXQotCi0gICopIE1vc3QgQXBhY2hlIGZ1bmN0aW9ucyB3b3JrIG9uIEVCQ0RJQyBtYWNoaW5lcyBhZ2FpbiwgYXMgcHJvdG9jb2wKLSAgICAgZGF0YSBpcyBub3cgdHJhbnNsYXRlZCAoYWdhaW4pLiAgW0plZmYgVHJhd2lja10KLQotICAqKSBJbnRyb2R1Y2UgYXBfeGxhdGVfcHJvdG9fe3RvfGZyb219X2FzY2lpKCkgdG8gY2xlYW4gdXAgc29tZSBvZgotICAgICB0aGUgRUJDRElDIHN1cHBvcnQuICBUaGV5IGFyZSBub29wcyBvbiBBU0NJSSBtYWNoaW5lcywgc28gdGhpcwotICAgICB0eXBlIG9mIHRyYW5zbGF0aW9uIGRvZXNuJ3QgaGF2ZSB0byBiZSBzdXJyb3VuZGVkIGJ5ICNpZmRlZgotICAgICBDSEFSU0VUX0VCQ0RJQy4gIFtKZWZmIFRyYXdpY2tdCi0KLSAgKikgRml4IG1vZF9pbmNsdWRlLiAgdGFnIGNvbW1hbmRzIHdvcmsgYWdhaW4sIGFuZCB0aGUgc2VydmVyIHdpbGwKLSAgICAgc2VuZCB0aGUgRkFRIGFnYWluLiAgVGhpcyBhbHNvIGFsbG93cyBtb2RfaW5jbHVkZSB0byBzZXQgYXNpZGUKLSAgICAgYnVja2V0cyB0aGF0IGluY2x1ZGUgcGFydGlhbCBidWNrZXRzLgotICAgICBbUnlhbiBCbG9vbSBhbmQgRGF2aWQgUmVpZF0KLQotICAqKSBBZGQgc3VleGVjIHN1cHBvcnQgYmFjay4gIFtNYW5vaiBLYXNpY2hhaW51bGFdCi0KLSAgKikgTGluZ2VyaW5nIGNsb3NlIG5vdyB1c2VzIHRoZSBzb2NrZXQgZGlyZWN0bHkgaW5zdGVhZCBvZiB1c2luZwotICAgICBCVUZGLiAgVGhpcyBoYXMgYmVlbiB0ZXN0ZWQsIGJ1dCBzaW5jZSBhbGwgd2UgY2FuIHRlbGwgaXMgdGhhdCBpdAotICAgICBkb2Vzbid0IGZhaWwsIHRoaXMgbmVlZHMgdG8gYmUgcmVhbGx5IGhhY2tlZCBvbi4KLSAgICAgW1J5YW4gQmxvb21dCi0KLSAgKikgQWxsb3cgZmlsdGVycyB0byBtb2RpZnkgaGVhZGVycyBhbmQgaGF2ZSB0aG9zZSBoZWFkZXJzIGJlIHNlbnQgdG8KLSAgICAgdGhlIGNsaWVudC4gIFRoZSBpZGVhIGlzIHRoYXQgd2UgaGF2ZSBhbiBodHRwX2hlYWRlciBmaWx0ZXIgdGhhdAotICAgICBhY3R1YWxseSBzZW5kcyB0aGUgaGVhZGVycyB0byB0aGUgbmV0d29yay4gIFRoaXMgcmVtb3ZlcyB0aGUgbmVlZAotICAgICBmb3IgdGhlIEJVRkYgdG8gc2VuZCBoZWFkZXJzLgotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBDaGFyc2V0IHRyYW5zbGF0aW9uOiBtb2RfY2hhcnNldF9saXRlIGhhbmRsZXMgdHJhbnNsYXRpb24gb2YKLSAgICAgcmVxdWVzdCBib2RpZXMuICBHZXQgcmlkIG9mIHRoZSB4bGF0ZSB2ZXJzaW9uIG9mIGFwX21kNV9kaWdlc3QoKQotICAgICBzaW5jZSB3ZSBkb24ndCBjb21wdXRlIGRpZ2VzdHMgb2YgZmlsdGVyZWQgKGUuZy4sIHRyYW5zbGF0ZWQpIAotICAgICByZXNwb25zZSBib2RpZXMgdGhpcyB3YXkgYW55bW9yZS4gIChOb3RlIHRoYXQgd2UgZG9uJ3QgZG8gaXQgYXQKLSAgICAgYWxsIGF0IHRoZSBwcmVzZW50OyBzb21lYm9keSBuZWVkcyB0byB3cml0ZSBhIGZpbHRlciB0byBkbyBzby4pCi0gICAgIFtKZWZmIFRyYXdpY2tdCi0KLSAgKikgSW5wdXQgZmlsdGVycyBhbmQgYXBfZ2V0X2JyaWdhZGUoKSBub3cgaGF2ZSBhIGlucHV0IG1vZGUgcGFyYW1ldGVyIAotICAgICAoYmxvY2tpbmcsIG5vbi1ibG9ja2luZywgcGVlaykgaW5zdGVhZCBvZiBhIGxlbmd0aCBwYXJhbWV0ZXIuCi0gICAgIFtoYWNrYXRob25dCi0KLSAgKikgVXBkYXRlIHRoZSBtaW1lLnR5cGVzIGZpbGUgdG8gdGhlIHJlZ2lzdGVyZWQgbWVkaWEgdHlwZXMgYXMKLSAgICAgb2YgMjAwMC0xMC0xOS4gUFIjNjYxMyBbQ2Fyc3RlbiBLbGFwcCA8Y2Fyc3Rlbi5rbGFwcEBob21lLm5ldD4sCi0gICAgIFRvbnkgRmluY2hdCi0KLSAgKikgTmFtZXNwYWNlIHByb3RlY3Qgc29tZSBtYWNyb3MgZGVjbGFyZWQgaW4gYXBfY29uZmlnLmgKLSAgICAgW1J5YW4gQmxvb21dCi0KLSAgKikgU3VwcG9ydCBIVFRQIGhlYWRlciBsaW5lIGZvbGRpbmcgd2l0aCBpbnB1dCBmaWx0ZXJpbmcuCi0gICAgIFtHcmVnIEFtZXNdCi0KLSAgKikgTW9kX2luY2x1ZGUgd29ya3MgYWdhaW4uICBUaGlzIHNob3VsZCBzdGlsbCBiZSByZS13cml0dGVuLCBidXQgYXQKLSAgICAgbGVhc3Qgbm93IHdlIGNhbiBzZXJ2ZSBhbiBTSFRNTCBwYWdlIGFnYWluLgotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBCZWdpbiB0byByZW1vdmUgQlVGRiBmcm9tIHRoZSBjb3JlLiAgQ3VycmVudGx5LCB3ZSBrZWVwIGEgcG9pbnRlcgotICAgICB0byBib3RoIHRoZSBCVUZGIGFuZCB0aGUgc29ja2V0IGluIHRoZSBjb25uX3JlYy4gIEZ1bmN0aW9ucyB0aGF0Ci0gICAgIHdhbnQgdG8gdXNlIHRoZSBCVUZGIGNhbiwgZnVuY3Rpb25zIHRoYXQgd2FudCB0byB1c2UgdGhlIHNvY2tldCwKLSAgICAgY2FuLiAgVGhleSBwb2ludCB0byB0aGUgc2FtZSBwbGFjZS4KLSAgICAgW1J5YW4gQmxvb21dCi0KLSAgKikgYXByX3BzcHJpbnRmIGRvZXNuJ3QgdW5kZXJzdGFuZCAlbGxkIGFzIGEgZm9ybWF0LiAgTWFrZSBpdCAlbGQuCi0gICAgIFtUb21hcyAi1mdyZW4iIDxzdHJpY0BpbmcudW11LnNlPl0KLQotICAqKSBBUFIgcGlwZXMgb24gVW5peCBhbmQgV2luMzIgYXJlIG5vdyBjbGVhbmVkIHVwIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgCi0gICAgIGFzc29jaWF0ZWQgcG9vbCBnb2VzIGF3YXkuICAoQVBSIHBpcGVzIG9uIE9TLzIgd2VyZSBhbHJlYWR5IGhhZCB0aGlzCi0gICAgIGxvZ2ljLikgIFRoaXMgcmVzb2x2cyBhIGZhdGFsIGZpbGUgZGVzY3JpcHRvciBsZWFrIHdpdGggQ0dJcy4gIAotICAgICBbSmVmZiBUcmF3aWNrXQotCi0gICopIFRoZSBmaW5hbCBsaW5lIG9mIHRoZSBjb25maWcgZmlsZSB3YXMgbm90IGJlaW5nIHJlYWQgaWYgdGhlcmUgd2FzCi0gICAgIG5vIFxuIGF0IHRoZSBlbmQgb2YgaXQuICBUaGlzIHdhcyBjYXVzZWQgYnkgYXByX2ZnZXRzIHJldHVybmluZyAKLSAgICAgQVBSX0VPRiBldmVuIHRob3VnaCB3ZSBoYWQgcmVhZCB2YWxpZCBkYXRhLiAgVGhpcyBpcyBzb2x2ZWQgYnkKLSAgICAgbWFraW5nIGNmZ19nZXRsaW5lIGNoZWNrIHRoZSBidWZmIHRoYXQgd2FzIHJldHVybmVkIGZyb20gYXByX2ZnZXRzLgotICAgICBJZiBhcHJfZmdldHMgcmV0dXJuIEFQUl9FT0YsIGJ1dCB0aGVyZSB3YXMgZGF0YSBpbiB0aGUgYnVmLCB0aGVuIHdlCi0gICAgIHJldHVybiB0aGUgYnVmLCBvdGhlcndpc2Ugd2UgcmV0dXJuIE5VTEwuCi0gICAgIFtSeWFuIEJsb29tXQotCi0gICopIFBpcGVkIGxvZ3Mgd29yayBhZ2FpbiBpbiB0aGUgMi4wIHNlcmllcy4KLSAgICAgW1J5YW4gQmxvb21dCi0KLSAgKikgUmVzdG9yZSBmdW5jdGlvbmFsaXR5IGJyb2tlbiBieSB0aGUgbW9kX3Jld3JpdGUgc2VjdXJpdHkgZml4OgotICAgICByZXdyaXRlIG1hcCBsb29rdXAga2V5cyBhbmQgZGVmYXVsdCB2YWx1ZXMgYXJlIG5vdyBleHBhbmRlZAotICAgICBzbyB0aGF0IHRoZSBsb29rdXAgY2FuIGRlcGVuZCBvbiB0aGUgcmVxdWVzdGVkIFVSSSBldGMuCi0gICAgIFBSICM2NjcxIFtUb255IEZpbmNoXQotCi0gICopIFRpZ2h0ZW4gdXAgdGhlIHN5bnRheCBjaGVja2luZyBvZiBIb3N0OiBoZWFkZXJzIHRvIGZpeCBhCi0gICAgIHNlY3VyaXR5IGJ1ZyBpbiBzb21lIG1hc3MgdmlydHVhbCBob3N0aW5nIGNvbmZpZ3VyYXRpb25zCi0gICAgIHRoYXQgY2FuIGFsbG93IGEgcmVtb3RlIGF0dGFja2VyIHRvIHJldHJpZXZlIHNvbWUgZmlsZXMKLSAgICAgb24gdGhlIHN5c3RlbSB0aGF0IHNob3VsZCBiZSBpbmFjY2Vzc2libGUuIFtUb255IEZpbmNoXQotCi0gICopIEFkZCBhIHBvb2wgYnVja2V0IHR5cGUuICBUaGlzIGJ1Y2tldCBpcyB1c2VkIGZvciBkYXRhIGFsbG9jYXRlZCBvdXQKLSAgICAgb2YgYSBwb29sLiAgSWYgdGhlIHBvb2wgaXMgY2xlYW5lZCBiZWZvcmUgdGhlIGJ1Y2tldCBpcyBkZXN0cm95ZWQsIHRoZW4KLSAgICAgdGhlIGRhdGEgaXMgY29udmVydGVkIHRvIGEgaGVhcCBidWNrZXQsIGFsbG93aW5nIGl0IHRvIHN1cnZpdmUgdGhlCi0gICAgIGRlYXRoIG9mIHRoZSBwb29sLgotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBBZGQgYSBmbHVzaCBidWNrZXQuICBUaGlzIGFsbG93cyBtb2R1bGVzIHRvIHNpZ25hbCB0aGF0IHRoZSBmaWx0ZXJzCi0gICAgIHNob3VsZCBhbGwgZmx1c2ggd2hhdGV2ZXIgZGF0YSB0aGV5IGN1cnJlbnRseSBoYXZlLiAgVGhlcmUgaXMgbm8gd2F5Ci0gICAgIHRvIGFjdHVhbGx5IGZvcmNlIHRoZW0gdG8gZG8gdGhpcywgc28gaWYgYSBmaWx0ZXIgaWdub3JlcyB0aGlzIGJ1Y2tldCwKLSAgICAgdGhhdCdzIGxpZmUsIGJ1dCBhdCBsZWFzdCB3ZSBjYW4gdHJ5IHdpdGggdGhpcy4KLSAgICAgW1J5YW4gQmxvb21dCi0KLSAgKikgQWRkIGFuIG91dHB1dCBmaWx0ZXIgZm9yIHN1Yi1yZXF1ZXN0cy4gIFRoaXMgZmlsdGVyIGp1c3Qgc3RyaXBzIHRoZQotICAgICBFT1MgYnVja2V0IHNvIHRoYXQgd2UgZG9uJ3QgY29uZnVzZSB0aGUgbWFpbiByZXF1ZXN0J3MgY29yZSBvdXRwdXQKLSAgICAgZmlsdGVyIGJ5IHNlbmRpbmcgbXVsdGlwbGUgRU9TIGJ1Y2tldHMuICBUaGlzIGNoYW5nZSBhbHNvIG1ha2VzIHN1YgotICAgICByZXF1ZXN0cyBzdGFydCB0byBzZW5kIEVPUyBidWNrZXRzIHdoZW4gdGhleSBhcmUgZmluaXNoZWQuCi0gICAgIFtSeWFuIEJsb29tXQotCi0gICopIE1ha2UgYXBfYnVja2V0XyhyZWFkfGRlc3Ryb3l8c3BsaXR8c2V0YXNpZGUpIGludG8gbWFjcm9zLiAgQWxzbwotICAgICBtYWtlcyBhcF9idWNrZXRfZGVzdHJveSBhIHJldHVybiB2b2lkLCB3aGljaCBpcyBva2F5IGJlY2F1c2UgaXQKLSAgICAgdXNlZCB0byBhbHdheXMgcmV0dXJuIEFQUl9TVUNDRVNTLCBhbmQgbm9ib2R5IGV2ZXIgY2hlY2tlZCBpdHMKLSAgICAgcmV0dXJuIHZhbHVlIGFueXdheS4KLSAgICAgW0NsaWZmIFdvb2xsZXkgPGNsaWZmd29vbGxleUB5YWhvby5jb20+XQotCi0gICopIFJlbW92ZSB0aGUgaW5kZXggaW50byB0aGUgYnVja2V0LXR5cGUgdGFibGUgZnJvbSB0aGUgYnVja2V0cwotICAgICBzdHJ1Y3R1cmUuICBUaGlzIGhhcyBub3cgYmVlbiByZXBsYWNlZCB3aXRoIGEgcG9pbnRlciB0byB0aGUKLSAgICAgYnVja2V0X3R5cGUuICBBbHNvIGFkZCBzb21lIG1hY3JvcyB0byB0ZXN0IHRoZSBidWNrZXQtdHlwZS4KLSAgICAgW1J5YW4gQmxvb21dCi0KLSAgKikgUmVuYW1lZCBhbGwgTU9EVUxFX0VYUE9SVCBzeW1ib2xzIHRvIEFQX01PRFVMRV9ERUNMQVJFIGFuZCBhbGwgc3ltYm9scwotICAgICBmb3IgQ09SRV9FWFBPUlQgdG8gQVBfQ09SRV9ERUNMQVJFIChuYW1lc3BhY2UgcHJvdGVjdGluZyB0aGUgd3JhcHBlcikKLSAgICAgYW5kIHJldGl0bGVkIEFQSV9FWFBPUlQgYXMgQVBfREVDTEFSRSBhbmQgQVBSX0VYUE9SVCBhcyBBUFJfREVDTEFSRS4KLSAgICAgQWxsIF9WQVJfIGZsYXZvcnMgY2hhbmdlcyB0byBfREFUQSB0byBiZSBhYnNvbHV0ZWx5IGNsZWFyLgotICAgICBbV2lsbGlhbSBSb3dlXQotCi0gICopIEFkZCBzdXBwb3J0IGZvciAvLCAvLywgLy9zZXJ2ZXJuYW1lIGFuZCAvL3NlcnZlci9zaGFyZW5hbWUgCi0gICAgIHBhcnNpbmcgb2YgPERpcmVjdG9yeT4gYmxvY2tzIHVuZGVyIFdpbjMyIGFuZCBPUzIuCi0gICAgIFtUaW0gQ29zdGVsbG8sIFdpbGxpYW0gUm93ZSwgQnJpYW4gSGFydmFyZF0KLQotICAqKSBSZW1vdmUgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIGZyb20gdGhlIGFwX2J1Y2tldCB0eXBlLiAgVGhleSBoYXZlIGJlZW4KLSAgICAgcmVwbGFjZWQgd2l0aCBhIGdsb2JhbCB0YWJsZS4gIE1vZHVsZXMgYXJlIGFsbG93ZWQgdG8gcmVnaXN0ZXIgYnVja2V0Ci0gICAgIHR5cGVzIGFuZCB1c2UgdGhlbiB1c2UgdGhvc2UgYnVja2V0cy4KLSAgICAgW1J5YW4gQmxvb21dCi0KLSAgKikgbW9kX2NnaWQ6IEluIHRoZSBoYW5kbGVyLCBzaHV0IGRvd24gdGhlIFVuaXggc29ja2V0IChvbmx5IGZvciB3cml0ZSkgCi0gICAgIG9uY2Ugd2UgZmluaXNoIHdyaXRpbmcgdGhlIHJlcXVlc3QgYm9keSB0byB0aGUgY2dpIGNoaWxkIHByb2Nlc3M7IAotICAgICBvdGhlcndpc2UsIHRoZSBjbGllbnQgZG9lc24ndCBoaXQgRU9GIG9uIHN0ZGluLiAgU21hbGwgcmVxdWVzdCBib2RpZXMgCi0gICAgIHdvcmtlZCB3aXRob3V0IHRoaXMgY2hhbmdlIChmb3IgcmVhc29ucyBJIGRvbid0IHVuZGVyc3RhbmQpLCBidXQgbGFyZ2UgCi0gICAgIG9uZXMgZGlkbid0LiAgW0plZmYgVHJhd2lja10KLQotICAqKSBSZW1vdmUgZmlsZSBidWNrZXQgc3BlY2lmaWMgaW5mb3JtYXRpb24gZnJvbSB0aGUgYXBfYnVja2V0IHR5cGUuCi0gICAgIFRoaXMgaGFzIGJlZW4gbW92ZWQgdG8gYSBmaWxlX2J1Y2tldCBzcGVjaWZpYyB0eXBlIHRoYXQgaGFuZ3Mgb2ZmCi0gICAgIHRoZSBkYXRhIHBvaW50ZXIgaW4gdGhlIGFwX2J1Y2tldCB0eXBlLgotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBJbnB1dCBmaWx0ZXJpbmcgbm93IGhhcyBhIHRoaXJkIGFyZ3VtZW50LiAgVGhpcyBpcyB0aGUgYW1vdW50IG9mIGRhdGEKLSAgICAgdG8gcmVhZCBmcm9tIGxvd2VyIGZpbHRlcnMuICBUaGlzIGFyZ3VtZW50IGNhbiBiZSAtMSwgMCwgb3IgYSBwb3NpdGl2ZQotICAgICBudW1iZXIuICAtMSBtZWFucyBnaXZlIG1lIGFsbCB0aGUgZGF0YSB5b3UgaGF2ZSwgSSdsbCBkZWFsIHdpdGggaXQgYW5kCi0gICAgIGxldCB5b3Uga25vdyBpZiBJIG5lZWQgbW9yZS4gIDAgbWVhbnMgZ2l2ZSBtZSBvbmUgbGluZSBhbmQgb25lIGxpbmUKLSAgICAgb25seS4gIEEgcG9zaXRpdmUgbnVtYmVyIG1lYW5zIEkgd2FudCBubyBtb3JlIHRoYW4gdGhpcyBtdWNoIGRhdGEuCi0KLSAgICAgQ3VycmVudGx5LCBvbmx5IDAgYW5kIGEgcG9zaXRpdmUgbnVtYmVyIGFyZSBpbXBsZW1lbnRlZC4gIFRoaXMgYWxsb3dzCi0gICAgIHVzIHRvIHJlbW92ZSB0aGUgcmVtYWluaW5nIGZpZWxkIGZyb20gdGhlIGNvbm5fcmVjIHN0cnVjdHVyZSwgd2hpY2gKLSAgICAgaGFzIGFsc28gYmVlbiBkb25lLgotICAgICBbUnlhbiBCbG9vbV0gCi0gICAgCi0gICopIEJpZyBjbGVhbnVwIG9mIHRoZSBpbnB1dCBmaWx0ZXJpbmcuICBUaGUgZ29hbCBpcyB0aGF0IGh0dHBfZmlsdGVyCi0gICAgIHVuZGVyc3RhbmRzIHR3byBjb25kaXRpb25zLCBoZWFkZXJzIGFuZCBib2R5LiAgSXQga25vd3Mgd2hlcmUgaXQgaXMKLSAgICAgYmFzZWQgb24gYy0+cmVtYWluaW5nLiAgSWYgYy0+cmVtYWluaW5nIGlzIDAsIHRoZW4gd2UgYXJlIGluIGhlYWRlcnMsCi0gICAgIGFuZCBodHRwX2ZpbHRlciByZXR1cm5zIGEgbGluZSBhdCBhIHRpbWUuICBJZiBpdCBpcyBub3QgMCwgdGhlbiB3ZSBhcmUKLSAgICAgaW4gYm9keSwgYW5kIGh0dHBfZmlsdGVyIHJldHVybnMgcmF3IGRhdGEsIGJ1dCBvbmx5IHVwIHRvIGMtPnJlbWFpbmluZwotICAgICBieXRlcy4gIEl0IGNhbiByZXR1cm4gbGVzcywgYnV0IG5ldmVyIG1vcmUuCi0gICAgIFtHcmVnIEFtZXMsIFJ5YW4gQmxvb20sIEplZmYgVHJhd2lja10KLQotICAqKSBtb2RfY2dpOiBXcml0ZSBhbGwgb2YgdGhlIHJlcXVlc3QgYm9keSB0byB0aGUgY2hpbGQsIG5vdCBqdXN0IHdoYXQKLSAgICAgdGhlIGtlcm5lbCB3b3VsZCBhY2NlcHQgb24gdGhlIGZpcnN0IHdyaXRlLiAgW0plZmYgVHJhd2lja10KLQotICAqKSBCYWNrIG91dCB0aGUgY2hhbmdlIHRoYXQgbW92ZWQgdGhlIGJyaWdhZGUgZnJvbSB0aGUgY29yZV9vdXRwdXRfZmlsdGVycwotICAgICBjdHggdG8gdGhlIGNvbm5fcmVjLiAgU2luY2UgYWxsIHJlcXVlc3RzIG92ZXIgYSBnaXZlbiBjb25uZWN0aW9uCi0gICAgIGdvIHRocm91Z2ggdGhlIHNhbWUgY29yZV9vdXRwdXRfZmlsdGVyLCB0aGUgY3R4IHBvaW50ZXIgaGFzIHRoZQotICAgICBjb3JyZWN0IGxpZmV0aW1lLgotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBGaXggYW5vdGhlciBidWcgaW4gdGhlIHNlbmRfdGhlX2ZpbGUoKSByZWFkL3dyaXRlIGxvb3AuIEEgcGFydGlhbAotICAgICBzZW5kIGJ5IGFwcl9zZW5kIHdvdWxkIGNhdXNlIHVuc2VudCBkYXRhIGluIHRoZSByZWFkIGJ1ZmZlciB0bwotICAgICBnZXQgY2xvYmJlcmVkLiBDb21wbGV0ZSBtYWtpbmcgc2VuZF90aGVfZmlsZSBoYW5kbGUgcGFydGlhbAotICAgICB3cml0ZXMgdG8gdGhlIG5ldHdvcmsuCi0gICAgIFtCaWxsIFN0b2RkYXJkXQotCi0gICopIEZpeCBhIGNvdXBsZSBvZiB0eXBlIGZpeGVzIHRvIGFsbG93IGNvbXBpbGF0aW9uIG9uIEFJWCBhZ2FpbgotICAgICBbVmljdG9yIEouIE9ybGlrb3dza2kgPHYuai5vcmxpa293c2tpQGd0ZS5uZXQ+XQotCi0gICopIEZpeCBidWcgaW4gc2VuZF90aGVfZmlsZSgpIHdoaWNoIGNhdXNlcyBvZmZzZXQgdG8gYmUgaWdub3JlZAotICAgICBpZiB0aGVyZSBhcmUgbm8gaGVhZGVycyB0byBzZW5kLgotICAgICBbQmlsbCBTdG9kZGFyZF0KLQotICAqKSBIYW5kbGUgQVBSX0VOT1RJTVBMIHJldHVybmVkIGZyb20gYXByX3NlbmRmaWxlIGluIHRoZSBjb3JlCi0gICAgIGZpbHRlci4gVXNlZnVsIGZvciBzdXBwb3J0aW5nIFdpbmRvd3MgOSogd2l0aCBhIGJpbmFyeQotICAgICBjb21waWxlZCBvbiBXaW5kb3dzIE5ULgotICAgICBbQmlsbCBTdG9kZGFyZF0KLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjBhNwotCi0gICopIFJlaW1wbGVtZW50IGNvcmVfb3V0cHV0X2ZpbHRlciB0byBidWZmZXIvc2F2ZSBidWNrZXQgYnJpZ2FkZXMKLSAgICAgYWNyb3NzIG11bHRpcGxlIGNhbGxzIHRvIHRoZSBjb3JlX2ZpbHRlci4gVGhlIGJyaWdhZGUgd2lsbCBiZQotICAgICBzZW50IHdoZW4gZWl0aGVyIE1JTl9CWVRFU19UT19TRU5EIG9yIE1BWF9JT1ZFQ19UT19XUklURQotICAgICB0aHJlc2hvbGRzIGFyZSBoaXQgb3IgdGhlIEVPUyBidWNrZXQgaXMgcmVjZWl2ZWQuCi0gICAgIFtCaWxsIFN0b2RkYXJkXQotCi0gICopIENyZWF0ZSBleHBlcmltZW50YWwgZmlsdGVyIChidWZmZXJfZmlsdGVyKSB0aGF0IGNvYWxlc2NlcyBieXRlcyAKLSAgICAgaW50byBvbmUgbGFyZ2UgYnVmZmVyIGJlZm9yZSBpbnZva2luZyB0aGUgbmV4dCBmaWx0ZXIgaW4gdGhlCi0gICAgIGNoYWluLiBUaGlzIGZpbHRlciBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdpdGggdGhlIGN1cnJlbnQgCi0gICAgIGltcGxlbWVudGF0aW9uIG9mIG1vZF9hdXRvaW5kZXggd2hlbiBpdCBpbnNlcnRlZCBhYm92ZSB0aGUKLSAgICAgY2h1bmtfZmlsdGVyLiBtb2RfYXV0b2luZGV4IGdlbmVyYXRlcyBhIGxvdCBvZiBicmlnYWRlcyB0aGF0Ci0gICAgIGNvbnRhaW5pbmcgYnVja2V0cyBob2xkaW5nIGp1c3QgYSBmZXcgYnl0ZXMgZWFjaC4gVGhlCi0gICAgIGJ1ZmZlcl9maWx0ZXIgY29hbGVzY2VzIHRoZXNlIGJ1Y2tldHMgaW50byBhIHNpbmdsZSBsYXJnZSBidWNrZXQuCi0gICAgIFtCaWxsIFN0b2RkYXJkXQotCi0gICopIEFkZCBhcHJfc2VuZGZpbGUoKSBzdXBwb3J0IGludG8gdGhlIGNvcmVfb3V0cHV0X2ZpbHRlci4KLSAgICAgW0JpbGwgU3RvZGRhcmRdCi0KLSAgKikgQWRkIGFwcl9zZW5kdigpIHN1cHBvcnQgaW50byB0aGUgY29yZV9vdXRwdXRfZmlsdGVyLgotICAgICBbQmlsbCBTdG9kZGFyZF0KLQotICAqKSBGaXggbW9kX2xvZ19jb25maWcgc28gdGhhdCBpdCBjb21waWxlcyBjbGVhbmx5IHdpdGggQlVGRkVSRURfTE9HUwotICAgICBbTWlrZSBBYmJvdHQgPG1qYUBzZ2kuY29tPl0KLQotICAqKSBSZW1vdmUgYXBfc2VuZF9mYi4gIFRoaXMgaXMgbm8gbG9uZ2VyIHVzZWQgaW4gQXBhY2hlLCBhbmQgaXQgZG9lc24ndAotICAgICBtYWtlIG11Y2ggc2Vuc2UsIGJlY2F1c2UgQXBhY2hlIHVzZXMgYnVja2V0cyBpbnN0ZWFkIG9mIEJVRkZzIG5vdy4KLSAgICAgW1J5YW4gQmxvb21dCi0KLSAgKikgc2VuZF90aGVfZmlsZSBub3cgZmFsbHMgYmFjayB0byBhIHJlYWQvd3JpdGUgbG9vcCBvbiBwbGF0Zm9ybXMgdGhhdAotICAgICBkbyBub3QgaGF2ZSBzZW5kZmlsZS4KLSAgICAgW1J5YW4gQmxvb20gYW5kIEJyaWFuIEhhdmFyZF0KLQotICAqKSBJbnN0YWxsIGFwYWNoZWN0bCBjb3JyZWN0bHksIGFuZCBzdWJzdGl0dXRlIHRoZSBwcm9wZXIgdmFsdWVzIHNvCi0gICAgIHRoYXQgaXQgd29ya3MgYWdhaW4uICBbUnlhbiBCbG9vbV0KLQotICAqKSBCZXR0ZXIoPz8pIGhhbmRsZSBwbGF0Zm9ybXMgdGhhdCBsYWNrIHNlbmRmaWxlKCkuCi0gICAgIFtKaW0gSmFnaWVsc2tpXQotCi0gICopIEFQUiBub3cgaGFzIFVVSUQgZ2VuZXJhdGlvbi9mb3JtYXR0aW5nL3BhcnNpbmcgc3VwcG9ydC4KLSAgICAgW0dyZWcgU3RlaW5dCi0KLSAgKikgQmVnaW4gdGhlIGh0dHBfZmlsdGVyLiAgVGhpcyBpcyBhbiBpbnB1dCBmaWx0ZXIgdGhhdCB1bmRlcnN0YW5kcwotICAgICB0aGUgYWJzb2x1dGUgYmFzaWMgYW1vdW50IHJlcXVpcmVkIHRvIHBhcnNlIGFuIEhUVFAgUmVxdWVzdC4gIFRoZQotICAgICBnb2FsIGlzIHRvIGJlIGFibGUgdG8gc3BsaXQgaGVhZGVycyBmcm9tIHJlcXVlc3QgYm9keSBiZWZvcmUgcGFzc2luZwotICAgICB0aGUgZGF0YSBiYWNrIHRvIHRoZSBvdGhlciBmaWx0ZXJzLgotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBCcmluZyBmb3J3YXJkIGZyb20gMS4zLjEzIHRoZSBjb25maWcgZGlyZWN0b3J5IGltcGxlbWVudGF0aW9uCi0gICAgIFtKaW0gSmFnaWVsc2tpXQotCi0gICopIGluc3RhbGwgYXB4cyBpZiBpdCBpcyBjcmVhdGVkCi0gICAgIFtSeWFuIEJsb29tXQotCi0gICopIEFkZGVkIEFQUl9JU19TVEFUVVNfY29uZGl0aW9uIHRlc3QgbWFjcm9zIHRvIGVsaW1pbmF0ZSBjYW5vbmljYWwgZXJyb3IKLSAgICAgY29udmVyc2lvbnMuICBbV2lsbGlhbSBSb3dlXQotCi0gICopIE5vdyB0aGF0IHdlIGhhdmUgYXBfYWRkX2lucHV0X2ZpbHRlcigpLCByZW5hbWUgYXBfYWRkX2ZpbHRlcigpIHRvIAotICAgICBhcF9hZGRfb3V0cHV0X2ZpbHRlcigpLiAgW0plZmYgVHJhd2lja10KLQotICAqKSBNdWx0aXBsZSBidWlsZCBhbmQgY29uZmlndXJhdGlvbiBmaXhlcwotICAgIEJ1aWxkIHByb2Nlc3M6Ci0KLSAgICAgIC1hZGQgZGF0YWRpciBhbmQgbG9jYWxzdGF0ZWRpciBzdWJzdGl0dXRpb25zCi0gICAgICAtZml4IGxheW91dCBuYW1lCi0gICAgICAtZml4IGxvZ2ZpbGVuYW1lIG1pc3NwZWxsaW5nCi0gICAgICAtZml4IGV2YWx1YXRpb24gb2YgaW5zdGFsbGF0aW9uIGRpciB2YXJpYWJsZXMgYW5kCi0gICAgICAtcmVwbGFjZSAkZm9vYmFyIGJ5ICQoZm9vYmFyKSB0byBiZSB1c2VmdWxsIGluIHRoZSBtYWtlZmlsZQotICAgIAotICAgIENyb3NzIGNvbXBpbGU6Ci0gICAgCi0gICAgICAtYWRkIHJ1bGVzIGZvciBjcm9zcy1jb21waWxpbmcgaW4gcnVsZXMubWsuIE9rYXksIHJ1bGUgdG8gY2hlY2sgZm9yCi0gICAgICAgJENDX0ZPUl9CVUlMRCBpcyBzdGlsbCBtaXNzaW5nCi0gICAgICAtdXNlIENIRUNLX1RPT0wgaW5zdGVhZCBvZiBDSEVDS19QUk9HIGZvciByYW5saWIKLSAgICAgIC1hZGQgbWlzc2luZyAiQVI9QEFSQCIgdG8gc2V2ZXJhbHkgTWFrZWZpbGUuaW4ncwotICAgICAgLWNhY2hlIHJlc3VsdCBmb3IgInN0cnVjdCBybGltaXQiCi0gICAgICAtY29tcGlsZSBhbGwgaGVscGVyIHByb2dyYW1zIHdpdGggbmF0aXZlIGFuZCBjcm9zcyBjb21waWxlcgotICAgICAgIGFuZCB1c2UgdGhlIG5hdGl2ZSB2ZXJzaW9uIHRvIGdlbmVyYXRlIGhlYWRlciBmaWxlCi0gICAgIFsiUvxkaWdlciIgS3VobG1hbm4gPFRhZHVAZ214LmRlPl0KLQotICAqKSBQcmVwYXJlIG91ciBhdXRvY29uZiBzZXR1cCBmb3IgYXV0b2NvbmYgMi4xNGEgYW5kIGZvciBjcm9zcy0KLSAgICAgY29tcGlsaW5nLgotICAgICBbIlL8ZGlnZXIiIEt1aGxtYW5uIDxUYWR1QGdteC5kZT5dCi0KLSAgKikgRml4IGEgYnVnIHdoZXJlIGEgY2xpZW50IHdoaWNoIG9ubHkgc2VuZHMgXG4gdG8gZGVsaW1pdCBoZWFkZXIKLSAgICAgbGluZXMgKG5ldGNhdCkgZ2V0cyBhIHN0cmFuZ2UgbG9va2luZyBIVFRQX05PVF9JTVBMRU1FTlRFRCAKLSAgICAgbWVzc2FnZS4gIFN0YXJ0IHdvcmtpbmcgb24gZWJjZGljIGNvLWV4aXN0YW5jZSB3aXRoIGlucHV0IAotICAgICBmaWx0ZXJpbmcuCi0gICAgIFtXaWxsaWFtIFJvd2UsIEdyZWcgQW1lc10KLQotICAqKSBJZiBtb2Rfc28gaXMgZW5hYmxlZCBpbiB0aGUgc2VydmVyIGFsd2F5cyBjcmVhdGUgbGliZXhlYywgZXZlbgotICAgICBpZiB0aGVyZSBhcmUgbm8gbW9kdWxlcyBpbnN0YWxsZWQgaW4gdGhpcyBkaXJlY3RvcnkuICBUaGlzIGlzIGEKLSAgICAgcmVxdWlyZW1lbnQgZm9yIEFQWFMgdG8gd29yayBjb3JyZWN0bHkuCi0gICAgIFtSeWFuIEJsb29tXQotCi0gICopIENvbm5lY3Rpb24gb3JpZW50ZWQgb3V0cHV0IGZpbHRlcnMgYXJlIG5vdyBzdG9yZWQgaW4gdGhlIAotICAgICBjb25uX3JlYyBpbnN0ZWFkIG9mIHRoZSByZXF1ZXN0X3JlYy4gIFRoaXMgYWxsb3dzIHVzIHRvIGFkZCB0aGUKLSAgICAgb3V0cHV0IGZpbHRlciBpbiB0aGUgcHJlLWNvbm5lY3Rpb24gcGhhc2UgaW5zdGVhZCBvZiB0aGUKLSAgICAgcG9zdF9yZWFkX3JlcXVlc3QgcGhhc2UsIHdoaWNoIGtlZXBzIHVzIGZyb20gdHJ5aW5nIHRvIHdyaXRlIGFuCi0gICAgIGVycm9yIHBhZ2UgYmVmb3JlIHdlIGhhdmUgYSBmaWx0ZXIgdG8gd3JpdGUgdG8gdGhlIG5ldHdvcmsuCi0gICAgIFtSeWFuIEJsb29tLCBKZWZmIFRyYXdpY2ssIGFuZCBHcmVnIEFtZXNdCi0KLSAgKikgQ2xlYW5pbmcgdXAgYW4gbW1hcCBidWNrZXQgbm8gbG9uZ2VyIGRlbGV0ZXMgdGhlIG1tYXAuICBBbgotICAgICBtbWFwIGNhbiBiZSB1c2VkIGFjcm9zcyBtdWx0aXBsZSBidWNrZXRzIChkZWZhdWx0X2hhbmRsZXIgd2l0aAotICAgICBieXRlIHJhbmdlcywgbW9kX2ZpbGVfY2FjaGUsIG1vZF9tbWFwX3N0YXRpYyksIHNvIGNsZWFudXAgb2YKLSAgICAgdGhlIG1tYXAgaXRzZWxmIGNhbid0IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVja2V0LgotICAgICBbSmVmZiBUcmF3aWNrXQotCi0gICopIEFkZCAuZGxsIGNhY2hpbmcgZGlyZWN0aXZlIElTQVBJQ2FjaGVGaWxlIHRvIG1vZF9pc2FwaS4KLSAgICAgW1dpbGxpYW0gUm93ZV0KLQotICAqKSBSYWRpY2FsIHN1cmdlcnkgdG8gaW1wcm92ZSBtb2RfaXNhcGkgc3VwcG9ydCB1bmRlciBXaW4zMi4KLSAgICAgSW5jbHVkZXMgYSBudW1iZXIgb2YgbmV3ZXIgU2VydmVyU3VwcG9ydEZ1bmN0aW9uIGNhbGxzLCBzdXBwb3J0Ci0gICAgIGZvciBSZWFkQ2xpZW50IChpbiBvcmRlciB0byByZXRyaWV2ZSBQT1NUcyBncmVhdGVyIHRoYW4gNDhLQiksCi0gICAgIGFuZCBnZW5lcmFsIGJ1ZyBmaXhlcyB0byBtb3JlIHJlbGlhYmx5IGxvYWQgSVNBUEkgLmRsbCdzIGFuZAotICAgICBwcmV2ZW50IGxlYWtpbmcgaGFuZGxlIHJlc291cmNlcy4gIE5vdGU6IFRoZXJlIGFyZSBzdGlsbCAKLSAgICAgZGlzY3JlcGFuY2llcyBiZXR3ZWVuIElJUydzIGFuZCBBcGFjaGUncyBTZXJ2ZXJWYXJpYWJsZXMsIGFuZAotICAgICBhc3luYyBjYWxscyBhcmUgc3RpbGwgbm90IHN1cHBvcnRlZC4gIEFkZGl0aW9uYWwgd2FybmluZ3MgYXJlCi0gICAgIGxvZ2dlZCB0byBmYWNpbGl0YXRlIGRlYnVnZ2luZyBvZiB1bnN1cHBvcnRlZCBJU0FQSSBjYWxscy4KLSAgICAgW1dpbGxpYW0gUm93ZV0KLQotICAqKSBBZGQgaW5wdXQgZmlsdGVyaW5nIHRvIEFwYWNoZS4gIFRoZSBiYXNpYyBpZGVhIGZvciB0aGUgaW5wdXQKLSAgICAgZmlsdGVycyBpcyB0aGUgc2FtZSBhcyB0aGUgaWRlYXMgZm9yIG91dHB1dCBmaWx0ZXJzLiAgVGhlIGJpZ2dlc3QKLSAgICAgZGlmZmVyZW5jZSBpcyB0aGF0IGluc3RlYWQgb2YgY2FsbGluZyBhcF9wYXNzX2JyaWdhZGUsIGFwX2dldF9icmlnYWRlCi0gICAgIHNob3VsZCBiZSBjYWxsZWQsIGFuZCB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uIGZvciB0aGUgZmlsdGVyIGl0c2VsZiBpcwotICAgICBkaWZmZXJlbnQuICBXaGVuIHdyaXRpbmcgYW4gb3V0cHV0IGZpbHRlciwgYSBicmlnYWRlIGlzIHBhc3NlZCBpbiwKLSAgICAgYW5kIGZpbHRlcnMgb3BlcmF0ZSBkaXJlY3RseSBvbiB0aGF0IGJyaWdhZGUsIHdoZW4gZG9uZSwgdGhleSBjYWxsCi0gICAgIGFwX3Bhc3NfYnJpZ2FkZS4gIElucHV0IGZpbHRlcnMgYXJlIHRoZSBleGFjdCBvcHBvc2l0ZS4gIEJlY2F1c2UgaW5wdXQKLSAgICAgaXMgbm90IGEgcHVzaCBvcGVyYXRpb24sIGZpbHRlcnMgZmlyc3QgY2FsbCBhcF9nZXRfYnJpZ2FkZS4gIFdoZW4gdGhpcwotICAgICBmdW5jdGlvbiByZXR1cm5zLCB0aGUgaW5wdXQgZmlsdGVyIHdpbGwgYmUgbGVmdCB3aXRoIGEgdmFsaWQgYnJpZ2FkZS4KLSAgICAgVGhlIGlucHV0IGZpbHRlciBzaG91bGQgdGhlbiBvcGVyYXRlIG9uIHRoZSBicmlnYWRlLCBhbmQgcmV0dXJuLgotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBGaXggYnVpbGRpbmcgb24gQlNEL09TIHVzaW5nIGl0cyBuYXRpdmUgbWFrZS4gVGhlIGJ1aWxkIHN5c3RlbQotICAgICBmYWxscyBiYWNrIHRvIHRoZSBCU0QgLmluY2x1ZGUgZGlyZWN0aXZlIG9uIHRoYXQgaG9zdCBwbGF0Zm9ybS4KLSAgICAgW1Nhc2NoYSBTY2h1bWFubl0KLQotICAqKSBFeHBhbmQgZGJtbWFuYWdlIHRvIGFsbG93IC1kIC1tIC1zIC1wIG9wdGlvbnMgZm9yIENyeXB0LCBNRDUsCi0gICAgIFNIQTEgYW5kIHBsYWludGV4dCBwYXNzd29yZCBlbmNvZGluZ3MuICBNYWtlIGZlYXR1cmUgdGVzdHMgYQotICAgICBiaXQgbW9yZSBmbGV4aWJsZS4gIFtXaWxsaWFtIFJvd2VdCi0KLSAgKikgQ2hhcnNldCB0cmFuc2xhdGlvbjogbW9kX2NoYXJzZXRfbGl0ZSBoYW5kbGVzIG91dHB1dCBjb250ZW50IAotICAgICB0cmFuc2xhdGlvbiBpbiBhIGZpbHRlci4gIG1vZF9jaGFyc2V0X2xpdGUgbm8gbG9uZ2VyIGlnbm9yZXMgCi0gICAgIHN1YnJlcXVlc3RzLiAgQSBidW5jaCBvZiBjcnVmdCByZWxhdGVkIHRvIEJVRkYncyBzdXBwb3J0IGZvcgotICAgICB0cmFuc2xhdGluZyByZXF1ZXN0IGFuZCByZXNwb25zZSBib2RpZXMgd2FzIHJlbW92ZWQuICAKLSAgICAgW0plZmYgVHJhd2lja10KLQotICAqKSBNb3ZlIHRoZSBhZGRpdGlvbiBvZiB0aGUgQ09SRSBmaWx0ZXIgdG8gdGhlIHBvc3RfcmVhZF9yZXF1ZXN0Ci0gICAgIGhvb2sgaW4gaHR0cF9jb3JlLmMuICBUaGlzIHJlbW92ZXMgdGhlIG5lZWQgdG8gYWRkIHRoZSBmaWx0ZXIgaW4KLSAgICAgbXVsdGlwbGUgcGxhY2VzIGFuZCBhbGxvd3MgZm9yIGFuIFNTTCBtb2R1bGUgdG8gYmUgYWRkZWQgbXVjaAotICAgICBzaW1wbGVyLiBbUnlhbiBCbG9vbV0KLQotICAqKSBGaXggYSBzZWN1cml0eSBwcm9ibGVtIHRoYXQgYWZmZWN0cyBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zIG9mCi0gICAgIG1vZF9yZXdyaXRlLiBJZiB0aGUgcmVzdWx0IG9mIGEgUmV3cml0ZVJ1bGUgaXMgYSBmaWxlbmFtZSB0aGF0Ci0gICAgIGNvbnRhaW5zIGV4cGFuc2lvbiBzcGVjaWZpZXJzLCBlc3BlY2lhbGx5IHJlZ2V4cCBiYWNrcmVmZXJlbmNlcwotICAgICAkMC4uJDkgYW5kICUwLi4lOSwgdGhlbiBpdCBtYXkgYmUgcG9zc2libGUgZm9yIGFuIGF0dGFja2VyIHRvCi0gICAgIGFjY2VzcyBhbnkgZmlsZSBvbiB0aGUgd2ViIHNlcnZlci4gW1RvbnkgRmluY2hdCi0KLSAgKikgRml4IGEgYnVnIHdoZXJlIGVycm9ycyB0aGF0IGFyZSBkZXRlY3RlZCBkdXJpbmcgZWFybHkgcmVxdWVzdCBwYXJzaW5nCi0gICAgIGRvbid0IHByb2R1Y2UgdmlzaWJsZSBIVFRQIGVycm9yIG1lc3NhZ2VzIGF0IHRoZSBicm93c2VyLCBiZWNhdXNlCi0gICAgIHRoZSBjb3JlX2ZpbHRlciB3YXNuJ3QgcHJlc2VudC4gIFtHcmVnIEFtZXNdCi0KLSAgKikgUHJvdmlkZSBhcHJfc29ja2xlbl90IGFzIGEgcG9ydGFiaWxpdHkgYWlkLiAKLSAgICAgW1ZpY3RvciAgSi4gT3JsaWtvd3NraV0KLQotICAqKSBPdmVyaGF1bCBvZiBkYm1tYW5hZ2UgdG8gYWxsb3cgYSBncm91cHMgYXJnIChhcyBpbiBBcGFjaGUgMS4yKQotICAgICBhcyB3ZWxsIGFzIGEgY29tbWVudCBhcmcgdG8gdGhlIGFkZCwgYWRkdXNlciBhbmQgdXBkYXRlIGNtZHMuCi0gICAgIHVwZGF0ZSBhbGxvd3MgdGhlIHVzZXIgdG8gY2xlYXIgb3IgcHJlc2VydmUgcHcvZ3JvdXBzL2NvbW1lbnQuCi0gICAgIEZpeGVkIGEgYnVnIGluIGRibW1hbmFnZSB0aGF0IHByZXZlbnRlZCB0aGUgY2hlY2sgb3B0aW9uIGZyb20gCi0gICAgIHBhcnNpbmcgYSBwYXNzd29yZCBmb2xsb3dlZCBieSA6Z3JvdXAuLi4gdGV4dC4gIENvcnJlY3RlZCB0aGUKLSAgICAgc2VlZCBjYWxjdWFsYXRpb24gZm9yIFdpbjMyIHN5c3RlbXMsIGFuZCBhZGRlZCAtbHNkYm0gc3VwcG9ydC4KLSAgICAgW1dpbGxpYW0gUm93ZV0KLQotICAqKSBDb25maWd1cmVkIG1vZF9hdXRoX2RibSB0byBjb21waWxlIHdpdGggc2RibWxpYiB1bmRlciBXaW4zMi4KLSAgICAgW1dpbGxpYW0gUm93ZV0KLQotICAqKSBBdm9pZCBhIHNlZ2ZhdWx0IHdoZW4gcGFyc2luZyAuaHRhY2Nlc3MgZmlsZXMuICBBbiAKLSAgICAgdW5pbml0aWFsaXplZCB0cmVlIHBvaW50ZXIgd2FzIHBhc3NlZCB0byBhcF9idWlsZF9jb25maWcoKS4KLSAgICAgW0plZmYgVHJhd2lja10KLQotICAqKSBDaGFuZ2UgdGhlIHdheSB0aGF0IGluZXRfYWRkciAmIGluZXRfbmV0d29yayBhcmUgY2hlY2tlZCBmb3IKLSAgICAgaW4gQVBSJ3MgY29uZmlndXJlIHByb2Nlc3MgdG8gYWxsb3cgQmVPUyBCT05FIHRvIGNvcnJlY3RseQotICAgICBmaW5kIHRoZW0uIFdpdGggdGhpcyBjaGFuZ2UgQmVPUyBCT05FIG5vdyBidWlsZHMgZnJvbSBzb3VyY2UKLSAgICAgd2l0aCBubyBwcm9ibGVtcy4gIFtEYXZpZCBSZWlkXQotCi0gICopIEZpeCBhIGJ1ZyBpbiBhcHJfY3JlYXRlX3Byb2Nlc3MoKSBmb3IgVW5peC4gIFRoZSBOVUxMIHNpZ25pZnlpbmcKLSAgICAgdGhlIGVuZCBvZiB0aGUgcGFyYW1ldGVycyB0byBleGVjdmUoKSB3YXMgc3RvcmVkIGluIHRoZSB3cm9uZwotICAgICBsb2NhdGlvbiwgb3ZlcmxheWluZyB0aGUgc3RvcmFnZSBiZXlvbmQgdGhlIG5ld2FyZ3NbXSBhcnJheSBhbmQgCi0gICAgIGFsc28gcGFzc2luZyB1bmluaXRpYWxpemVkIHN0b3JhZ2UgdG8gZXhlY3ZlKCksIHdoaWNoIHdvdWxkIAotICAgICBzb21ldGltZXMgZmFpbCB3aXRoIEVGQVVMVC4gIFtKZWZmIFRyYXdpY2tdCi0KLSAgKikgRml4IGEgYnVnIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmaWxlIGNvbnRhaW5lcnMuICBXaXRoIGEgc2VxdWVuY2UKLSAgICAgbGlrZSB0aGlzIGluIHRoZSBjb25maWcgZmlsZQotCi0gICAgICAgPElmTW9kdWxlIG1vZF9raWxyb3kuYz4KLSAgICAgICBhbnkgc3R1ZmYKLSAgICAgICA8L0lmTW9kdWxlPgotICAgICAgIDxJZk1vZHVsZSBtb2RfbG92ZWpveS5jPgotICAgICAgIChibGFuayBsaW5lKQotICAgICAgIGFueSBzdHVmZgotICAgICAgIDwvSWZNb2R1bGU+Ci0KLSAgICAgdGhlIHNlY29uZCBjb250YWluZXIgd291bGQgYmUgdGVybWluYXRlZCBhdCB0aGUgYmxhbmsgbGluZSBkdWUgdG8KLSAgICAgc2VkaW1lbnQgaW4gdGhlIGJ1ZmZlciBmcm9tIHJlYWRpbmcgdGhlIHByaW9yIDwvSWZNb2R1bGU+IGFuZCBhbiAKLSAgICAgZXJyb3IgbWVzc2FnZSB3b3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoZSByZWFsIDwvSWZNb2R1bGU+IGZvciB0aGUKLSAgICAgc2Vjb25kIGNvbnRhaW5lci4gIEFsc28gZHVlIHRvIHRoaXMgcHJvYmxlbSwgYW55IHR3byBjaGFyYWN0ZXJzIAotICAgICBjb3VsZCBiZSB1c2VkIGZvciAiPC8iIGluIHRoZSBjbG9zZSBvZiBhIGNvbnRhaW5lci4gIAotICAgICBbSmVmZiBUcmF3aWNrXQotCi0gICopIGFwX2FkZF9maWx0ZXIgcHJvdG90eXBlIGNoYW5nZWQgdG8gcmVtb3ZlIHRoZSBjdHggcG9pbnRlci4gIFRoZQotICAgICBwb2ludGVyIHN0aWxsIHJlbWFpbnMgaW4gdGhlIGZpbHRlciBzdHJ1Y3R1cmUsIGJ1dCBpdCBjYW4gbm90IGJlCi0gICAgIGEgcGFydCBvZiB0aGUgYXBfYWRkX2ZpbHRlciBwcm90b3R5cGUuICBUaGUgcmVhc29uIGlzIHRoYXQgd2hlbgotICAgICB0aGUgY29yZSB1c2VzIEFkZEZpbHRlciB0byBhZGQgYSBmaWx0ZXIgdG8gdGhlIHN0YWNrIGl0IGRvZXNuJ3QKLSAgICAga25vdyBob3cgdG8gYWxsb2NhdGUgdGhlIGN0eCBwb2ludGVyLCBvciBldmVuIGhvdyBtdWNoIG1lbW9yeSBzaG91bGQKLSAgICAgYmUgYWxsb2NhdGVkLiAgVGhlIGZpbHRlcnMgd2lsbCBoYXZlIHRvIGJlIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nCi0gICAgIHRoZSBjdHggbWVtb3J5IHdoZW4gdGhleSBuZWVkIGl0LgotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBBZGQgYW4gQWRkRmlsdGVyIGRpcmVjdGl2ZS4gIFRoaXMgZGlyZWN0aXZlIHRha2VzIGEgbGlzdCBvZiBmaWx0ZXJzCi0gICAgIHRoYXQgc2hvdWxkIGJlIGFjdGl2YXRlZCBmb3IgdGhlIHJlcXVlc3RlZCByZXNvdXJjZS4KLSAgICAgW1J5YW4gQmxvb21dCi0KLSAgKikgYXByX3NucHJpbnRmKCk6IEdldCBxdWFkIGZvcm1hdCBzdHJpbmdzIHdvcmtpbmcgb24gT1MvMzkwIChhbmQgcGVyaGFwcwotICAgICBzb21lIG90aGVyIHBsYXRmb3JtcykuICBbSmVmZiBUcmF3aWNrXQotCi0gICopIE1vZGlmeSBtb2RfaW5jbHVkZSB0byBiZSBhIGZpbHRlci4gIEN1cnJlbnRseSwgaXQgaGFzIG9ubHkgYmVlbiB0ZXN0ZWQKLSAgICAgb24gYWN0dWFsIGZpbGVzLCBidXQgaXQgc2hvdWxkIHdvcmsgZm9yIENHSSBzY3JpcHRzIHRvby4KLSAgICAgW1J5YW4gQmxvb21dCi0KLSAgKikgYXByX3B1dGMoKSwgYXByX3B1dHMoKSBmb3IgVW5peDogaGFuZGxlIGJ1ZmZlcmVkIGZpbGVzIGFuZCBpbnRlcnJ1cHRlZAotICAgICB3cml0ZXMuICBhcHJfZmx1c2goKSBmb3IgVW5peDogaGFuZGxlIGludGVycnVwdGVkIHdyaXRlcy4KLSAgICAgW0plZmYgVHJhd2lja10KLQotICAqKSBOYW1lVmlydHVhbEhvc3QgY2FuIG5vdyB0YWtlICIqIiBhcyBhbiBhcmd1bWVudCBpbnN0ZWFkIG9mCi0gICAgIGFuIElQIGFkZHJlc3MuIFRoaXMgYWxsb3dzIHlvdSB0byBjcmVhdGUgYSBwdXJlbHkgbmFtZS1iYXNlZAotICAgICB2aXJ0dWFsIGhvc3Rpbmcgc2VydmVyIHRoYXQgZG9lcyBub3QgaGF2ZSBhbnkgSVAgYWRkcmVzc2VzIGluCi0gICAgIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgYW5kIHdoaWNoIGlnbm9yZXMgdGhlIGxvY2FsIGFkZHJlc3MKLSAgICAgb2YgYW55IGNvbm5lY3Rpb25zLiBQUiAjNTU5NSwgUFIgIzQ0NTUgW1RvbnkgRmluY2hdCi0KLSAgKikgRml4IHNvbWUgY29tcGlsZSB3YXJuaW5ncyBpbiBtb2RfbW1hcF9zdGF0aWMuYwotICAgICBbTWlrZSBBYmJvdHQgPG1qYUBzZ2kuY29tPl0KLQotICAqKSBGaXggY2h1bmtpbmcgcHJvYmxlbSB3aXRoIENHSSBzY3JpcHRzLiAgVGhlIGdlbmVyYWwgcHJvYmxlbSB3YXMgdGhhdAotICAgICB0aGUgQ0dJIG1vZHVsZXMgd2VyZSBhZGRpbmcgYW4gRU9TIGJ1Y2tldCBhbmQgdGhlbiB0aGUgY29yZSBhZGRlZCBhbgotICAgICBFT1MgYnVja2V0LiAgVGhlIGNodW5raW5nIGZpbHRlciBmaW5hbGl6ZXMgdGhlIGNodW5rZWQgcmVzcG9uc2Ugd2hlbiBpdAotICAgICBlbmNvdW50ZXJzIGFuIEVPUyBidWNrZXQuICBCZWNhdXNlIHR3byBFT1MgYnVja2V0cyB3ZXJlIHNlbnQsIHdlCi0gICAgIGZpbmFsaXplZCB0aGUgcmVzcG9uc2UgdHdpY2UuICBUaGUgZml4IGlzIHRvIG1ha2Ugc3VyZSB3ZSBvbmx5IHNlbmQgb25lCi0gICAgIEVPUywgYnkgdXRpbGl6aW5nIGEgZmxhZyBpbiB0aGUgcmVxdWVzdF9yZWMuCi0gICAgIFtSeWFuIEJsb29tXQotCi0gICopIGFwcl9wdXRfb3NfZmlsZSgpIG5vdyBzZXRzIHVwIHRoZSB1bmdldCBieXRlIGFwcHJvcHJpYXRlbHkgb24gVW5peAotICAgICBhbmQgV2luMzIuICBQcmV2aW91c2x5LCB0aGUgZmlyc3QgcmVhZCBmcm9tIGFuIGFwcl9maWxlX3Qgc2V0IHVwIHZpYQotICAgICBhcHJfcHV0X29zX2ZpbGUoKSB3b3VsZCByZXR1cm4gYSAnXDAnLiAgW0plZmYgVHJhd2lja10KLQotICAqKSBNb2RfY2dpZCBub3cgY3JlYXRlcyBhIHNpbmdsZSBlbGVtZW50IGJ1Y2tldCBicmlnYWRlLCB3aXRoIGEgcGlwZQotICAgICBidWNrZXQsIGluc3RlYWQgb2YgdXNpbmcgQlVGRidzIGFuZCBhcF9yKi4KLSAgICAgW1J5YW4gQmxvb21dCi0KLSAgKikgQVBSVkFSUy5pbiBubyBsb25nZXIgb3ZlcndyaXRlcyB0aGUgRVhUUkFfTElCUyB2YXJpYWJsZS4KLSAgICAgW01pa2UgQWJib3R0IDxtamFAc2dpLmNvbT5dCi0KLSAgKikgUmVtb3ZlIGFwX2JvcGVuZiBmcm9tIGJ1ZmYgY29kZS4gIFRoaXMgcmVxdWlyZWQgbW9kaWZ5aW5nIHRoZSBmaWxlX2NhY2hlCi0gICAgIGNvZGUgdG8gdXNlIEFQUiBmaWxlJ3MgZGlyZWN0bHkgaW5zdGVhZCBvZiBnb2luZyB0aHJvdWdoIEJVRkZzLgotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBGaXggY29tcGlsZSBicmVhayBvbiBzb21lIHBsYXRmb3JtcyBmb3IgbW9kX21pbWVfbWFnaWMuYwotICAgICBbSm9obiBLLiBTdGVybGluZyA8c3RlcmxpbmdAY292YWxlbnQubmV0Pl0KLQotICAqKSBGaXggbWVyZ2luZyBvZiBBZGREZWZhdWx0Q2hhcnNldCBkaXJlY3RpdmUuCi0gICAgIFBSICM1ODcyICgxLjMpIFtKdW4gS3VyaXlhbWEgPGt1cml5YW1hQGltZ3NyYy5jby5qcD5dCi0KLSAgKikgTWlub3IgcmV2YW1wIG9mIHRoZSBybGltaXQgc2VjdGlvbnMgb2YgY29kZS4gV2Ugbm93IHRlc3QKLSAgICAgZXhwbGljaXRseSBmb3Igc2V0cmxpbWl0IGFuZCBnZXRybGltaXQuIEFsc28sIHVuaXhkX3NldF9ybGltaXQoKQotICAgICBpcyBub3cgImF2YWlsYWJsZSIgZXZlbiBpZiB0aGUgcGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0Ci0gICAgIHRoZSBybGltaXQgZmFtaWx5IChpdCdzIGp1c3QgYSBub29wIHRob3VnaCkuIFtKaW0gSmFnaWVsc2tpXQotCi0gICopIE1pZ3JhdGUgdGhlIHByZS1zZWxlY3Rpb24gb2Ygd2hpY2ggTVBNIHRvIHVzZSBmb3Igc3BlY2lmaWMKLSAgICAgcGxhdGZvcm1zIHRvIGhpbnRzLm00LCB3aGljaCBjb250YWlucyAob3Igc2hvdWxkIGNvbnRhaW4pCi0gICAgIGFsbCBwbGF0Zm9ybSBzcGVjaWZpYyAiaGludHMiLiBbSmltIEphZ2llbHNraV0KLQotICAqKSBSZW1vdmUgSU9McyBmcm9tIEFwYWNoZS4gIFdpdGggZmlsdGVyaW5nLCBJT0xzIGFyZSBubyBsb25nZXIgbmVjZXNzYXJ5Ci0gICAgIFtSeWFuIEJsb29tXQotCi0gICopIEFkZCB0YWJsZXMgd2l0aCBub24tc3RyaW5nL2JpbmFyeSB2YWx1ZXMgdG8gQVBSLgotICAgICBbS2VuIENvYXJdCi0KLSAgKikgRml4IHNvbWUgYmFkIGNhbGxzIHRvIGFwX2xvZ19yZXJyb3IoKSBpbiBtb2RfcmV3cml0ZS4gCi0gICAgIFtKZWZmIFRyYXdpY2tdCi0KLSAgKikgVXBkYXRlIFBDUkUgdG8gdmVyc2lvbiAzLjIuICBbUnlhbiBCbG9vbV0KLQotICAqKSBDaGFuZ2UgdGhlIHdheSBidWNrZXRzJyBkZXN0cm95IGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHNvIHRoYXQKLSAgICAgdGhleSBjYW4gYmUgbW9yZSBkaXJlY3RseSB1c2VkIHdoZW4gY2hhbmdpbmcgdGhlIHR5cGUgb2YgYQotICAgICBidWNrZXQgaW4gcGxhY2UuIFtUb255IEZpbmNoXQotCi0gICopIEFkZCBnZW5lcmljIHN1cHBvcnQgZm9yIHJlZmVyZW5jZS1jb3VudGluZyB0aGUgcmVzb3VyY2VzIHVzZWQgYnkKLSAgICAgYnVja2V0cywgYW5kIGFsdGVyIHRoZSBIRUFQIGFuZCBNTUFQIGJ1Y2tldHMgdG8gdXNlIGl0LiBDaGFuZ2UKLSAgICAgdGhlIHdheSBidWNrZXRzIGFyZSBpbml0aWFsaXNlZCB0byBzdXBwb3J0IGNoYW5naW5nIHRoZSB0eXBlIG9mCi0gICAgIGJ1Y2tldHMgaW4gcGxhY2UsIGFuZCB1c2UgaXQgd2hlbiBzZXR0aW5nIGFzaWRlIFRSQU5TSUVOVCBidWNrZXRzLgotICAgICBDaGFuZ2UgdGhlIGltcGxlbWVudGF0aW9uIG9mIFRSQU5TSUVOVCBidWNrZXRzIHNvIHRoYXQgaXQgY2FuIGJlCi0gICAgIG1vc3RseSBzaGFyZWQgd2l0aCBJTU1PUlRBTCBidWNrZXRzLCB3aGljaCBhcmUgbm93IGltcGxlbWVudGVkLgotICAgICBbVG9ueSBGaW5jaF0KLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjBhNgotCi0gICopIEFkZCBzdXBwb3J0IHRvIEFwYWNoZSBhbmQgQVBSIGZvciBkc29zIG9uIE9TLzM5MC4gIFtHcmVnIEFtZXNdCi0KLSAgKikgQWRkIGEgY2h1bmtpbmcgZmlsdGVyIHRvIEFwYWNoZS4gIFRoaXMgYnJpbmdzIHVzIG9uZSBzdGVwIGNsb3NlcgotICAgICB0byByZW1vdmluZyBCVUZGLiBbUnlhbiBCbG9vbV0KLQotICAqKSBhcF9hZGRfZmlsdGVyIG5vdyBhZGRzIGZpbHRlcnMgaW4gYSBMSUZPIGZhc2hpb24uICBUaGUgZmlyc3QgZmlsdGVyCi0gICAgIGFkZGVkIHRvIHRoZSBzdGFjayBpcyB0aGUgbGFzdCBmaWx0ZXIgdG8gYmUgY2FsbGVkLiAgW1J5YW4gQmxvb21dCi0KLSAgKikgQXBhY2hlIDIuMCBoYXMgYmVlbiBjb21wbGV0ZWx5IGRvY3VtZW50ZWQgdXNpbmcgU2NhbmRvYy4gIFRoZQotICAgICBkb2NzIGNhbiBiZSBnZW5lcmF0ZWQgYnkgcnVubmluZyAnbWFrZSBkb2NzJy4gIFtSeWFuIEJsb29tXQotCi0gICopIEFkZCBmaWx0ZXJlZCBJL08gdG8gQXBhY2hlLiAgVGhpcyBpcyBiYXNlZCBvbiBidWNrZXQgYnJpZ2FkZXMsCi0gICAgIEN1cnJlbnRseSB0aGUgYnVja2V0cyBzdGlsbCB1c2UgQlVGRiB1bmRlciB0aGUgY292ZXJzLCBidXQgdGhhdAotICAgICBzaG91bGQgY2hhbmdlIHF1aWNrbHkuICBUaGUgb25seSBjdXJyZW50bHkgd3JpdHRlbiBmaWx0ZXIgaXMgdGhlCi0gICAgIGNvcmUgZmlsdGVyIHdoaWNoIGp1c3QgY2FsbHMgYXBfYndyaXRlLiAgW1RoZSBBcGFjaGUgR3JvdXBdCi0KLSAgKikgQVBSIGxvY2tzIG9uIFVuaXg6IExldCBBUFJfTE9DS0FMTCBsb2NrcyB3b3JrIHdoZW4gQVBSIGlzbid0Ci0gICAgIGJ1aWx0IHdpdGggdGhyZWFkIHN1cHBvcnQuICBbSmVmZiBUcmF3aWNrXQotCi0gICopIEFib3J0IGNvbmZpZ3VyYXRpb24gaWYgLS13aXRoLWxheW91dCB3YXMgc3BlY2lmaWVkIGFuZCB0aGVyZSdzCi0gICAgIG5vIGxheW91dCBkZWZpbml0aW9uIGZpbGUuICBbS2VuIENvYXJdCi0KLSAgKikgQWRkIHN1cHBvcnQgZm9yICctLXdpdGgtcG9ydD1uJyBvcHRpb24gdG8gY29uZmlndXJlLiAgW0tlbiBDb2FyXQotCi0gICopIEFkZCBzdXBwb3J0IGZvciBleHRlbnNpb24gbWV0aG9kcyBmb3IgdGhlIEFsbG93IHJlc3BvbnNlIGhlYWRlcgotICAgICBmaWVsZCwgYW5kIGFuIEFQSSByb3V0aW5lIGZvciBhY2Nlc3Npbmcgci0+YWxsb3dlZCBhbmQgdGhlCi0gICAgIGxpc3Qgb2YgZXh0ZW5zaW9uIG1ldGhvZHMgaW4gYSB1bmlmaWVkIG1hbm5lci4gIFtLZW4gQ29hcl0KLQotICAqKSBtb2RfY2Vybl9tZXRhOiBmaXggYnJva2VuIGZpbGUgcmVhZGluZyBsb29wIGluIHNjYW5fbWV0YV9maWxlKCkuCi0gICAgIFtSb2IgU2ltb25zb24gPHNpbW9AdXMuaWJtLmNvbT5dCi0KLSAgKikgR2V0IHhsYXRlIGJ1aWxkcyB3b3JraW5nIGFnYWluLiAgVGhlIGFwciByZW5hbWluZyBpbiAyLjBhNSBicm9rZQotICAgICBBUEFDSEVfWExBVEUgYnVpbGRzLiAgW0plZmYgVHJhd2lja10KLQotICAqKSBBIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzaW5nIHByb2JsZW0gd2FzIGZpeGVkLiAgV2hlbiB0aGUgCi0gICAgIGNvbmZpZ3VyYXRpb24gZmlsZSBzdGFydGVkIHdpdGggYW4gSWZNb2R1bGUvSWZEZWZpbmUgY29udGFpbmVyLCAKLSAgICAgb25seSB0aGUgbGFzdCBzdGF0ZW1lbnQgaW4gdGhlIGNvbnRhaW5lciB3b3VsZCBiZSByZXRhaW5lZC4gIAotICAgICBbSmVmZiBUcmF3aWNrXQotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDIuMGE1Ci0KLSAgKikgUGVyY2hpbGQgaXMgc2VydmluZyBwYWdlcyBhZnRlciBwYXNzaW5nIHRoZW0gdG8gZGlmZmVyZW50IGNoaWxkCi0gICAgIHByb2Nlc3Nlcy4gIFRoZXJlIGFyZSBzdGlsbCBhIGxvdCBvZiBidWdzLCBidXQgdGhpcyBkb2VzIHdvcmsuICBJCi0gICAgIGhhdmUgbWFkZSByZXF1ZXN0cyBhZ2FpbnN0IHRoZSBzYW1lIGluc3RhbGxhdGlvbiBvZiBBcGFjaGUsIGFuZCBoYWQKLSAgICAgZGlmZmVyZW50IHNlcnZlcnMgdXNlIGRpZmZlcmVudCB1c2VyIElEcyB0byBzZXJ2ZSB0aGUgcmVzcG9uc2VzLgotICAgICBUaGlzIGNoYW5nZSBtb3ZlcyB0byB1c2luZyBzb2NrZXRwYWlyIGluc3RlYWQgb2YgYW4gQUZfVU5JWCBzb2NrZXQuCi0gICAgIFtSeWFuIEJsb29tXQotCi0gICopIFBlcmNoaWxkIE1QTSBzdGlsbCBkb2Vzbid0IHdvcmsgcGVyZmVjdGx5LCBidXQgaXQgaXMgc2VydmluZyBwYWdlcy4KLSAgICAgSXQgY2FuJ3Qgc2VlbSB0byBwYXNzIGJldHdlZW4gY2hpbGQgcHJvY2Vzc2VzIHlldCwgYnV0IEkgdGhpbmsgd2UKLSAgICAgYXJlIGNsb3NlciBub3cgdGhhbiBiZWZvcmUuICBUaGlzIG1vdmVzIHVzIGJhY2sgdG8gdXNpbmcgVW5peAotICAgICBEb21haW4gU29ja2V0cy4gIFtSeWFuIEJsb29tXQotCi0gICopIGxpYmFwciBmdW5jdGlvbnMgYW5kIHR5cGVzIHJlbmFtZWQgd2l0aCBhcHJfIHByZWZpeC4KLSAgICAgI2luY2x1ZGUgImFwcl9jb21wYXQuaCIgZm9yIDEuMy54IGJhY2t3YXJkcyBjb21wYXQKLSAgICAgW1BlcmxdCi0KLSAgKikgRml4IHByb2JsZW1zIHdpdGggQVBSIHNvY2thZGRyIGhhbmRsaW5nIG9uIFdpbjMyLiAgSXQgZGlkbid0IGFsd2F5cwotICAgICByZXR1cm4gdGhlIHJpZ2h0IGluZm9ybWF0aW9uIG9uIHRoZSBsb2NhbCBzb2NrZXQgYWRkcmVzcy4KLSAgICAgW0dyZWdvcnkgTmljaG9sbHMgPGduaWNob2xsc0BsZXZlbDguY29tPl0KLQotICAqKSBhcF9yZWN2KCkgb24gV2luMzI6IFNldCBieXRlcy1yZWFkIHRvIDAgb24gZXJyb3IuICAKLSAgICAgW0dyZWdvcnkgTmljaG9sbHMgPGduaWNob2xsc0BsZXZlbDguY29tPl0KLQotICAqKSBBZGQgYW4gb3B0aW9uIHRvIG5vdCBkZXRhY2ggZnJvbSB0aGUgY29udHJvbGxpbmcgdGVybWluYWwgd2l0aG91dAotICAgICBnb2luZyBpbnRvIHNpbmdsZSBwcm9jZXNzIG1vZGUuICBUaGlzIGFsbG93cyBmb3IgbXVjaCBlYXNpZXIKLSAgICAgZGVidWdnaW5nIG9mIHRoZSBwcm9jZXNzIHN0YXJ0dXAgY29kZS4gW1J5YW4gQmxvb21dCi0KLSAgKikgYWI6IGRvbid0IHVzZSBwZXJyb3IoKSB0byByZXBvcnQgdGhlIGZhaWx1cmUgb2YgYW4gQVBSIGZ1bmN0aW9uLgotICAgICBbSmVmZiBUcmF3aWNrXQotCi0gICopIE1ha2UgZGV4dGVyLCBtcG10X3B0aHJlYWQsIGFuZCBwZXJjaGlsZCBNUE1zIG5vdCBkZXN0cm95IHRoZQotICAgICBzY29yZWJvYXJkIG9uIGdyYWNlZnVsIHJlc3RhcnRzLgotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBGaXggc2VnZmF1bHQvU0lHU0VHViB3aGVuIHJ1bm5pbmcgZ3ppcCBmcm9tIG1vZF9taW1lX21hZ2ljLmMuCi0gICAgIEFuIGludmFsaWQgYXBfcHJvY190IHdhcyBwYXNzZWQgdG8gYXBfY3JlYXRlX3Byb2Nlc3MoKS4KLSAgICAgW0plZmYgVHJhd2lja10KLQotICAqKSBBbGxvdyBtb2R1bGVzIHRvIHJlZ2lzdGVyIGZpbHRlcnMuICBUaG9zZSBmaWx0ZXJzIGFyZSBzdGlsbAotICAgICBuZXZlciBjYWxsZWQsIGJ1dCB0aGlzIGlzIGEgc3RlcCBpbiB0aGUgcmlnaHQgZGlyZWN0aW9uLgotICAgICBbUnlhbiBCbG9vbSBhbmQgR3JlZyBTdGVpbl0KLQotICAqKSBSZWdpc3RlciB0aGUgbW9kX2NnaWQgZGFlbW9uIHByb2Nlc3MgZm9yIGNsZWFudXAgc28gdGhhdCBpdCBpcwotICAgICBraWxsZWQgYXQgdGVybWluYXRpb24gaWYgaXQgZG9lcyBub3QgZGllIHdoZW4gdGhlIHBhcmVudCBnZXRzCi0gICAgIFNJR1RFUk0uICBUaGlzIGNoYW5nZSBpcyB0byBmaXggb2NjYXNpb25hbCBwcm9ibGVtcyB3aGVyZSB0aGUKLSAgICAgcHJvY2VzcyBzdGF5cyBhcm91bmQuICBCdWdzIGluIHNpbWlsYXIgbG9naWMgaW4gbW9kX3Jld3JpdGUgYW5kCi0gICAgIG1vZF9pbmNsdWRlIHdlcmUgYWxzbyBmaXhlZC4gIFtKZWZmIFRyYXdpY2tdCi0KLSAgKikgRml4IGEgYnVnIGluIHRoZSB0aW1lIGhhbmRsaW5nLiAgQmFzaWNhbGx5LCB3ZSB3ZXJlIGltcGxvZGluZyBhIHRpbWUKLSAgICAgaW4gYXBfcGFyc2VIVFRQZGF0ZSwgYnV0IGl0IGhhZCBib2d1cyBkYXRhIGluIHRoZSBleHBsb2RlZCB0aW1lIGZvcm1hdC4KLSAgICAgTmFtZWx5LCB0bV91c2VjIGFuZCB0bV9nbXRvZmYgd2VyZSBub3QgZmlsbGVkIG91dC4gIGFwX2ltcGxvZGVfdGltZQotICAgICB1c2VzIHRob3NlIHR3byBmaWVsZHMgdG8gYWRqdXN0IHRoZSB0aW1lIHZhbHVlLiAgQmVjYXVzZSBvZiB0aGUgSFRUUAotICAgICBzcGVjLCBib3RoIG9mIHRob3NlIHZhbHVlcyBjYW4gYmUgemVybydlZCBvdXQgc2FmZWx5LiAgVGhpcyBmaXhlcwotICAgICB0aGUgYnVnIGNvcnJlY3RseS4gIFtSeWFuIEJsb29tXQotCi0gICopIEZpeCBhIGNvdXBsZSBvZiBwbGFjZSBpbiB0aGUgV2luZG93cyBjb2RlIHdoZXJlIHRoZSB3cm9uZyBlcnJvcgotICAgICBjb2RlIHdhcyBiZWluZyByZXR1cm5lZC4gW0dyZWdvcnkgTmljaG9sbHMgPGduaWNob2xsc0BsZXZlbDguY29tPl0KLQotICAqKSBGaXggUE9PTF9ERUJVRyAoYXQgbGVhc3QgZm9yIHByZWZvcmsgbXBtKS4gW0RlYW4gR2F1ZGV0XQotCi0gICopIEFkZGVkIHRoZSBBUFJfRU9MX1NUUiBtYWNybyBmb3IgcGxhdGZvcm0gZGVwZW5kZW50IGRpZmZlcmVuY2VzIGluIAotICAgICBsb2dmaWxlcyBhbmQgb3RoZXIgcmF3IHRleHQgKHN1Y2ggYXMgYWxsIEFQUiBmaWxlcykuICBGaXhlcyBsb2dmaWxlcwotICAgICBub3QgdGVybWluYXRlZCB3aXRoIGNyL2xmIHNlcXVlbmNlcyBpbiBXaW4zMi4gIFtXaWxsaWFtIFJvd2VdCi0KLSAgKikgTW92ZSBhbGwgc3RyaW5ncyBmdW5jdGlvbnMgaW4gQVBSIHRvIHNyYy9saWIvYXByL3N0cmluZ3MgYW5kIGNyZWF0ZQotICAgICBhcHJfc3RyaW5ncy5oIGZvciB0aGUgcHJvdG90eXBlcy4gW1J5YW4gQmxvb21dCi0KLSAgKikgQVBSIGxvY2sgZml4ZXM6IHdoZW4gdXNpbmcgU3lzViBzZW1zLCBmbG9jaygpLCBvciBmY250bCgpLCBiZSBzdXJlCi0gICAgIHRvIHJlcGVhdCB0aGUgc3lzY2FsbCB1bnRpbCB3ZSBzdG9wIGdldHRpbmcgRUlOVFIuICBJIG5vdGljZWQgYQotICAgICByZWxhdGVkIHByb2JsZW0gYXQgdGVybWluYXRpb24gKFNJR1RFUk0pIG9uIEZyZWVCU0Qgd2hlbiB1c2luZwotICAgICBmY250bCgpLiAgQXBhY2hlIDEuMyBoYWQgdGhlc2UgbmV3IGxvb3BzIHRvby4gIEFsc28sIG1ha2UgdGhlIGZsb2NrKCkgCi0gICAgIGltcGxlbWVudGF0aW9uIHdvcmsgcHJvcGVybHkgd2l0aCBjaGlsZCBpbml0LiAgUHJldmlvdXNseSwgYXBfbG9jaygpCi0gICAgIHdhcyBlc3NlbnRpYWxseSBhIG5vLW9wIGJlY2F1c2UgYWxsIGNoaWxkcmVuIHdlcmUgdXNpbmcgZGlmZmVyZW50Ci0gICAgIGxvY2tzIGFuZCB0aHVzIG5vYm9keSBldmVyIGJsb2NrZWQuICBbSmVmZiBUcmF3aWNrXQotCi0gICopIFRoZSBodGRvY3MvIHRyZWUgaGFzIGJlZW4gbW92ZWQgb3V0IG9mIHRoZSBDVlMgc291cmNlIHRyZWUgaW50bwotICAgICBhIHNlcGFyYXRlIGFyZWEgZm9yIGVhc2llciBkZXZlbG9wbWVudC4gIFRoaXMgaGFzIE5PIEVGRkVDVCBvbgotICAgICBlbmQtdXNlcnMgb3IgQXBhY2hlIGluc3RhbGxhdGlvbnMuICBbS2VuIENvYXJdCi0KLSAgKikgSW50ZWdyYXRlIHRoZSBtb2RfZGF2IG1vZHVsZSBmb3IgV2ViREFWIHByb3RvY29sIGhhbmRsaW5nLiBUaGlzCi0gICAgIGFkZHMgdGhlIGRhdiBhbmQgZGF2X2ZzIG1vZHVsZXMsIHRoZSBTREJNIGxpYnJhcnksIGFuZCBhZGRpdGlvbmFsCi0gICAgIFhNTCBoYW5kbGluZyB1dGlsaXRpZXMuIFtHcmVnIFN0ZWluXQotCi0gICopIENsZWFuIG91dCBvYnNvbGV0ZSBuYW1lcyAoZnJvbSBodHRwZC5oKSBmb3IgdGhlIEhUVFAgU3RhdHVzIENvZGVzCi0gICAgIFtHcmVnIFN0ZWluXQotCi0gICopIFVwZGF0ZSB0aGUgbGliL2V4cGF0LWxpdGUvIGxpYnJhcnkgKGJyaW5nIGZvcndhcmQgY2hhbmdlcyBmcm9tCi0gICAgIHRoZSBBcGFjaGUgMS4zIHJlcG9zaXRvcnkpLiBbR3JlZyBTdGVpbl0KLQotICAqKSBJZiBzaXplb2YobG9uZyBsb25nKSA9PSBzaXplb2YobG9uZyksIHRoZW4gcHJlZmVyIGxvbmcgaW4gQVBSCi0gICAgIGNvbmZpZ3VyZS5pbi4gIFtEYXZlIEhpbGwgPGRkaGlsbEB6azMuZGVjLmNvbT5dCi0KLSAgKikgQWRkIGFwX3NlbmRmaWxlIGZvciBUcnU2NCBVbml4LiAgQWxzbywgYWRkIGFuIGVycm9yIG1lc3NhZ2UgZm9yCi0gICAgIG1hY2hpbmVzIHdoZXJlIHNlbmRmaWxlIGlzIGRldGVjdGVkLCBidXQgbm9ib2R5IGhhcyB3cml0dGVuIGFwX3NlbmRmaWxlLgotICAgICBbRGF2ZSBIaWxsIDxkZGhpbGxAemszLmRlYy5jb20+XQotCi0gICopIENvbXBpbGUgZml4ZXMgaW4gbW9kX21tYXBfc3RhdGljLiAgW1ZpY3RvciBKLiBPcmxpa293c2tpXQotCi0gICopIGFiIHdvdWxkIHN0YXJ0IHVwIG1vcmUgY29ubmVjdGlvbnMgdGhhbiBuZWVkZWQsIHRoZW4gcXVpdCB3aGVuIHRoZQotICAgICBkZXNpcmVkIG51bWJlciB3ZXJlIGZpbmlzaGVkLiBBbHNvIGZpeGVkIGEgbG9naWMgZXJyb3IgaW52b2x2aW5nCi0gICAgIGFiIGtlZXBhbGl2ZXMuICBbVmljdG9yIEouIE9ybGlrb3dza2ldCi0KLSAgKikgV2luTlQ6IEltcGxlbWVudCBub24tYmxvY2tpbmcgcGlwZXMgd2l0aCB0aW1lb3V0cyB0byBjb21tdW5pY2F0ZQotICAgICB3aXRoIENHSXMuIEFwYWNoZSAyLjBhNCBoYWQgbm9uLWJsb2NraW5nIHBpcGVzIGJ1dCB3aXRob3V0IAotICAgICB0aW1lb3V0cyAoaS5lLCBpZiBhIHRpbWVvdXQgd2FzIHNwZWNpZmllZCwgdGhlIHBpcGUgcmV2ZXJ0ZWQgdG8KLSAgICAgYSBmdWxsIGJsb2NraW5nIHBpcGUpLiBOb3cgdGhlIGJlaGF2aW91ciBpcyBtb3JlIGluIGxpbmUgd2l0aAotICAgICBVbml4IG5vbi1ibG9ja2luZyBwaXBlcy4KLSAgICAgW0JpbGwgU3RvZGRhcmRdCi0KLSAgKikgV2luTlQ6IEltcGxlbWVudCBhY2NlcHQgc29ja2V0IHJldXNlLiBVc2luZyBtb2RfZmlsZV9jYWNoZSB0bwotICAgICBjYWNoZSBvcGVuIGZpbGUgaGFuZGxlcyBhbG9uZyB3aXRoIGFjY2VwdCBzb2NrZXQgcmV1c2UgZW5hYmxlcwotICAgICBBcGFjaGUgMi4wIHRvIHNlcnZlIG5vbi1rZWVwYWxpdmUgcmVxdWVzdHMgZm9yIHN0YXRpYyBmaWxlcyBhdAotICAgICAzeCB0aGUgcmF0ZSBvZiBBcGFjaGUgMS4zLihlLmcsIEFwYWNoZSAxLjMgd2lsbCBzZXJ2ZSA0MDAgcnBzCi0gICAgIGFuZCBBcGFjaGUgMi4wIHdpbGwgc2VydmUgYWxtb3N0IDEyMDAgcnBzIG9uIG15IHN5c3RlbSkuCi0gICAgIFtCaWxsIFN0b2RkYXJkXQotCi0gICopIE1lcmdlIG1vZF9tbWFwX3N0YXRpYyBmdW5jdGlvbiBpbnRvIG1vZF9maWxlX2NhY2hlLiBtb2RfZmlsZV9jYWNoZQotICAgICBzdXBwb3J0cyB0d28gY29uZmlnIGRpcmVjdGl2ZXMsIG1tYXBmaWxlIChzYW1lIGJlaGF2aW91cyBhcwotICAgICBtb2RfbW1hcF9zdGF0aWMpIGFuZCBjYWNoZWZpbGUuIFVzZSB0aGUgY2FjaGVmaWxlIGRpcmVjdGl2ZQotICAgICB0byBjYWNoZSBvcGVuIGZpbGUgaGFuZGxlcy4gVGhpcyBkaXJlY3RpdmUgb25seSB3b3JrcyBvbiBzeXN0ZW1zCi0gICAgIHRoYXQgaGF2ZSBpbXBsZW1lbnRlZCB0aGUgYXBfc2VuZGZpbGUgQVBJLiBjYWNoZWZpbGUgd29ya3MgdG9kYXkKLSAgICAgb24gV2luZG93cyBOVCwgYnV0IGhhcyBub3QgYmVlbiB0ZXN0ZWQgb24gYW55IGZsYXZvcnMgb2YgVW5peC4KLSAgICAgW0JpbGwgU3RvZGRhcmRdCi0KLSAgKikgQ2xlYW51cCB0aGUgY29uZmlndXJhdGlvbi4gIFdpdGggdGhlIGxhc3QgZmV3IGNoYW5nZXMgdGhlCi0gICAgIGNvbmZpZ3VyYXRpb24gcHJvY2VzcyBhdXRvbWF0aWNhbGx5OgotICAgICAgICAgaW5oZXJpdHMgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGJ1aWxkIGZyb20gQVBSLiAgQWxsb3dpbmcKLSAgICAgICAgIEFQUiB0byBpbmZvcm0gQXBhY2hlIHRoYXQgaXQgc2hvdWxkIG9yIHNob3VsZCBub3QgdXNlIC1sZGwKLSAgICAgICAgCi0gICAgICAgICBEZXRlY3RzIHdoaWNoIG1vZF9jZ2kgc2hvdWxkIGJlIHVzZWQgbW9kX2NnaSBvciBtb2RfY2dpZCwKLSAgICAgICAgIGJhc2VkIG9uIHRoZSB0aHJlYWRpbmcgbW9kZWwKLQotICAgICAgICAgQXBhY2hlIGNhbGxzIEFQUidzIGNvbmZpZ3VyZSBwcm9jZXNzIGJlZm9yZSBmaW5pc2hpbmcgaXQncwotICAgICAgICAgY29uZmlndXJhdGlvbiBwcm9jZXNzaW5nLCBhbGxvd2luZyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBmbG93Ci0gICAgICAgICBiZXR3ZWVuIHRoZSB0d28uCi0gICAgIFtSeWFuIEJsb29tXQotICAgICAgICAgCi0KLSAgKikgQ2hhbmdlIFVuaXggYW5kIFdpbjMyIGFwX3NldHNvY2tvcHQoKSBzbyB0aGF0IEFQUl9TT19OT05CTE9DSwotICAgICB3aXRoIG5vbi16ZXJvIGFyZ3VtZW50IG1ha2VzIHRoZSBzb2NrZXQgbm9uLWJsb2NraW5nLiAgQmVPUyBhbmQKLSAgICAgT1MvMiBhbHJlYWR5IHdvcmtlZCB0aGlzIHdheS4gIFtKZWZmIFRyYXdpY2tdCi0KLSAgKikgYXBfY2xvc2UoKSBub3cgY2FsbHMgYXBfZmx1c2goKSBmb3IgYnVmZmVyZWQgZmlsZXMsIHNvIHdyaXRlCi0gICAgIG9wZXJhdGlvbnMgd29yayBhIHdob2xlIGxvdCBiZXR0ZXIgb24gYnVmZmVyZWQgZmlsZXMuCi0gICAgIFtKZWZmIFRyYXdpY2tdCi0KLSAgKikgRml4IGVycm9yIG1lc3NhZ2VzIGlzc3VlZCBmcm9tIE1QTXMgd2hpY2ggZXhwbGFpbiB3aGVyZSB0byBjaGFuZ2UKLSAgICAgY29tcGlsZWQtaW4gbGltaXRzIChlLmcuLCBUaHJlYWRzUGVyQ2hpbGQsIE1heENsaWVudHMsIFN0YXJ0VHJlYWRzKS4KLSAgICAgW0dyZWcgQW1lc10KLQotICAqKSBhcF9jcmVhdGVfcGlwZSgpIG5vdyBsZWF2ZXMgcGlwZXMgaW4gYmxvY2tpbmcgc3RhdGUuICAoVGhpcyBoZWxwcyAKLSAgICAgcmVkdWNlIHRoZSBudW1iZXIgb2Ygc3lzY2FsbHMgb24gVW5peC4pICBhcF9zZXRfcGlwZV90aW1lb3V0KCkgaXMKLSAgICAgbm93IHRoZSB3YXkgdGhhdCB0aGUgYmxvY2tpbmcgc3RhdGUgb2YgYSBwaXBlIGlzIG1hbmlwdWxhdGVkLgotICAgICBhcF9ibG9ja19waXBlKCkgaXMgZ29uZS4gIFtKZWZmIFRyYXdpY2tdCi0KLSAgKikgQ29ycmVjdCB0aGUgcHJvYmxlbSB3aGVyZSB0aGUgb25seSBsb2NhbCBob3N0IG5hbWUgdGhhdCB0aGUgSVAgc3RhY2sKLSAgICAgY2FuIGRpc2NvdmVyIGFyZSAndW5kb3R0ZWQnIHByaXZhdGUgbmFtZXMuICBJZiBubyBmdWxseSBxdWFsaWZpZWQKLSAgICAgZG9tYWluIG5hbWUgY2FuIGJlIGlkZW50aWZpZWQsIHRoZSBkZWZhdWx0IFNlcnZlck5hbWUgd2lsbCBiZSBzZXQgdG8KLSAgICAgdGhlIG1hY2hpbmUncyBJUCBhZGRyZXNzIHN0cmluZy4gQSB3YXJuaW5nIGlzIGFsd2F5cyBwcm92aWRlZCBpZiB0aGUKLSAgICAgU2VydmVyTmFtZSBub3Qgc3BlY2lmaWVkLCBidXQgYXNzdW1lZC4gIFNvbHZlcyBQUjYyMTUgW1dpbGxpYW0gUm93ZV0KLQotICAqKSBSZXBhaXIgcHJvYmxlbXMgd2l0aCBjb25maWcgZmlsZSBwcm9jZXNzaW5nIHdoaWNoIGNhdXNlZCBzZWdmYXVsdAotICAgICBhdCBpbml0IHdoZW4gdmlydHVhbCBob3N0cyB3ZXJlIGRlZmluZWQgYW5kIHdoaWNoIGNhdXNlZCBTZXJ2ZXJOYW1lIHRvCi0gICAgIGJlIGlnbm9yZWQgd2hlbiB0aGVyZSB3YXMgbm8gdmFsaWQgRE5TIHNldHVwLiAgW0plZmYgVHJhd2lja10KLQotICAqKSBSZW1vdmVkIHBvaW50bGVzcyBhcF9pc19hYm9ydGVkIG1hY3JvIGZ1bmN0aW9uLiBbUm95IEZpZWxkaW5nXQotCi0gICopIEFkZCBhcF9zZW5kZmlsZSBpbXBsZW1lbnRhdGlvbiBmb3IgQUlYCi0gICAgIFtWaWN0b3IgSi4gT3JsaWtvd3NraV0KLQotICAqKSBSZXBhaXIgQysrIGNvbXBhdGliaWxpdHkgaW4gYXBfY29uZmlnLmgsIGFwcl9maWxlX2lvLmgsIAotICAgICBhcHJfbmV0d29ya19pby5oLCBhbmQgYXByX3RocmVhZF9wcm9jLmguICAKLSAgICAgW1R5bGVyIEouIEJyb29rcyA8dHlsZXJqYnJvb2tzQGhvbWUuY29tPiwgSmVmZiBUcmF3aWNrXQotCi0gICopIEJyaW5nIHRoZSBhbGxvY2F0aW9uIGFuZCBwb29sIGRlYnVnZ2luZyBjb2RlIGJhY2sgaW50byBhIHdvcmtpbmcKLSAgICAgc3RhdGUuICBUaGlzIHdpbGwgbmVlZCB0byBiZSB0ZXN0ZWQgYXMgc28gZmFyIGl0J3Mgb25seSBiZWVuIHVzZWQgb24KLSAgICAgQmVPUy4gW0RhdmlkIFJlaWRdCi0KLSAgKikgQ2hhbmdlIGNvbmZpZ3VyYXRpb24gY29tbWFuZCBzZXR1cCB0byBiZSBwcm9wZXJseSB0eXBlc2FmZSB3aGVuIGluCi0gICAgIG1haW50YWluZXIgbW9kZS4gTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgYSBjb21waWxlciB0aGF0IGNhbiBpbml0aWFsaXNlCi0gICAgIHVuaW9ucy4gW0JlbiBMYXVyaWVdCi0KLSAgKikgVHVybiBvbiBidWZmZXJpbmcgZm9yIGNvbmZpZyBmaWxlIHJlYWRzLiAgUGFydCBvZiB0aGlzIHdhcyB0bwotICAgICByZXBhaXIgYnVmZmVyZWQgSS9PIHN1cHBvcnQgaW4gVW5peCBhbmQgaW1wbGVtZW50IGJ1ZmZlcmVkCi0gICAgIGFwX2ZnZXRzKCkgZm9yIGFsbCBwbGF0Zm9ybXMuICBbQnJpYW4gSGF2YXJkLCBKZWZmIFRyYXdpY2tdCi0KLSAgKikgV2luMzI6IEZpeCBwcm9ibGVtIHdoZXJlIFVUQyBvZmZzZXQgd2FzIG5vdCBiZWluZyBzZXQgY29ycmVjdGx5Ci0gICAgIGluIHRoZSBhY2Nlc3MgbG9nLiBQcm9ibGVtIHJlcG9ydGVkIG9uIG5ld3MgZ3JvdXAgYnkgSmVycnkgQmFrZXIuCi0gICAgIFtCaWxsIFN0b2RkYXJkXQotCi0gICopIEZpeCBzZWdmYXVsdCB3aGVuIHJlcG9ydGluZyB0aGlzIHR5cGUgb2Ygc3ludGF4IGVycm9yOgotICAgICAiPC9jb250YWluZXI+IHdpdGhvdXQgbWF0Y2hpbmcgPGNvbnRhaW5lcj4gc2VjdGlvbiIsIHdoZXJlCi0gICAgIGNvbnRhaW5lciBpcyBWaXJ0dWFsSG9zdCBvciBEaXJlY3Rvcnkgb3Igd2hhdGV2ZXIuCi0gICAgIFtKZWZmIFRyYXdpY2tdCi0KLSAgKikgUHJldmVudCB0aGUgc291cmNlIGNvZGUgZm9yIENHSXMgZnJvbSBiZWluZyByZXZlYWxlZCB3aGVuIHVzaW5nCi0gICAgIG1vZF92aG9zdF9hbGlhcyBhbmQgdGhlIENHSSBkaXJlY3RvcnkgaXMgdW5kZXIgdGhlIGRvY3VtZW50IHJvb3QKLSAgICAgYW5kIGEgdXNlciBtYWtlcyBhIHJlcXVlc3QgbGlrZSBodHRwOi8vd3d3LmV4YW1wbGUuY29tLy9jZ2ktYmluL2NnaQotICAgICBhcyByZXBvcnRlZCBpbiA8bmV3czo5NjA5OTkxMDUuMzQ0MzIxQGVybmFuaS5sb2dpY2EuY28udWs+Ci0gICAgIFtUb255IEZpbmNoXQotCi0gICopIEFkZCBzdXBwb3J0IGZvciB0aGUgbmV3IEJlb3MgTmV0d09ya2luZyBFbnZpcm9ubWVudCAoQk9ORSkKLSAgICAgW0RhdmlkIFJlaWRdCi0KLSAgKikgeGxhdGU6IGFwX3hsYXRlX2NvbnZfYnVmZmVyKCkgbm93IHRlbGxzIHRoZSBjYWxsZXIgd2hlbiB0aGUKLSAgICAgZmluYWwgaW5wdXQgY2hhciBpcyBpbmNvbXBsZXRlOyBhcF9id3JpdGVfeGxhdGUoKSBub3cgaGFuZGxlcwotICAgICBpbmNvbXBsZXRlIGZpbmFsIGlucHV0IGNoYXJzLiAgW0plZmYgVHJhd2lja10KLQotICAqKSBZZXQgYW5vdGhlciB1cGRhdGUgdG8gc2FmZXJlYWQvaGFsZmR1cGxleCBzdHVmZiAtLSBuZWVkIHRvIGVuc3VyZQotICAgICB0aGF0IGEgYmhhbGZkdXBsZXggY2FsbCBvY2N1cnMgYmVmb3JlIGxvZ2dpbmcgb3IgZWxzZSBETlMgYW5kCi0gICAgIHN1Y2ggY2FuIGRlbGF5IHRoZSBsYXN0IHBhY2tldCBvZiB0aGUgcmVzcG9uc2UuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgU29tZSBzeXNjYWxsIHJlZHVjdGlvbiBpbiBBUFIgb24gdW5peCAtLSBkb24ndCBzZWVrIHdoZW4gc2V0dGluZwotICAgICB1cCBhbiBtbWFwOyBhbmQgZG9uJ3QgZmNudGwoKSBtb3JlIHRoYW4gb25jZSBwZXIgc29ja2V0LgotICAgICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgV2hlbiBtb2RfY2dpZCBpcyBzdGFydGVkIGFzIHJvb3QsIHRoZSBjZ2kgZGFlbW9uIG5vdyBzd2l0Y2hlcyAKLSAgICAgdG8gdGhlIGNvbmZpZ3VyZWQgVXNlci9Hcm91cCAobGlrZSBvdGhlciBodHRwZCBwcm9jZXNzZXMpIAotICAgICBpbnN0ZWFkIG9mIGNvbnRpbnVpbmcgYXMgcm9vdC4gIFtKZWZmIFRyYXdpY2tdCi0KLSAgKikgVGhlIHByZWZvcmsgTVBNIG5vdyB1c2VzIGFuIEFQUiBsb2NrIGZvciB0aGUgYWNjZXB0KCkgbXV0ZXguCi0gICAgIEl0IGhhcyBub3QgYmVlbiBnZXR0aW5nIGEgbG9jayBhdCBhbGwgcmVjZW50bHkuICBodHRwZCAtViBub3cgCi0gICAgIGRpc3BsYXlzIEFQUidzIHNlbGVjdGlvbiBvZiB0aGUgbG9jayBtZWNoYW5pc20gaW5zdGVhZCBvZiB0aGUgCi0gICAgIHN5bWJvbHMgcHJldmlvdXNseSByZXNwZWN0ZWQgYnkgcHJlZm9yay4gIFtKZWZmIFRyYXdpY2tdCi0KLSAgKikgQ2hhbmdlIHRoZSBtbWFwKCkgZmVhdHVyZSB0ZXN0IHRvIGNoZWNrIG9ubHkgZm9yIGV4aXN0ZW5jZS4KLSAgICAgVGhlIHByZXZpb3VzIGNoZWNrIHJlcXVpcmVkIGZlYXR1cmVzIG5vdCB1c2VkIGJ5IEFwYWNoZS4KLSAgICAgW0dyZWcgQW1lc10KLQotICAqKSBGaXggYSBjb3VwbGUgb2YgYnVncyBpbiBtb2RfY2dpZDogIFRoZSBjZ2kgYXJndW1lbnRzIHdlcmUKLSAgICAgc29tZXRpbWVzIG1hbmdsZWQuICBUaGUgbGVuIHBhcm0gdG8gYWNjZXB0KCkgd2FzIG5vdCAKLSAgICAgaW5pdGlhbGl6ZWQsIGxlYWRpbmcgc29tZXRpbWVzIHRvIGFuIGVuZGxlc3MgbG9vcCBvZiBmYWlsZWQKLSAgICAgYWNjZXB0KCkgY2FsbHMgb24gT1MvMzkwIGFuZCBhbnl3aGVyZSBlbHNlIHRoYXQgZmFpbGVkIHRoZSBjYWxsCi0gICAgIGlmIHRoZSBsZW4gd2FzIG5lZ2F0aXZlLiAgVXNlIDxzeXMvdW4uaD4gZm9yIHN0cnVjdCBzb2NrYWRkcl91bgotICAgICBpbnN0ZWFkIG9mIGRlY2xhcmluZyBpdCBvdXJzZWx2ZXMgdG8gZml4IGEgY29tcGlsYXRpb24gcHJvYmxlbQotICAgICBvbiBTb2xhcmlzLiAgW0plZmYgVHJhd2lja10KLQotICAqKSBBZGQgUmVzb3VyY2UgbGltaXRpbmcgY29kZSBiYWNrIGludG8gQXBhY2hlIDIuMC4gW1J5YW4gQmxvb21dCi0KLSAgKikgRml4IHpvbWJpZSBwcm9jZXNzIHByb2JsZW0gd2l0aCBtb2RfY2dpLiAgW0plZmYgVHJhd2lja10KLQotICAqKSBQb3J0IG1vZF9tbWFwX3N0YXRpYyB0byAyLjAuICBNYWtlIGl0IGdvIGZhc3Rlci4gIFtHcmVnIEFtZXNdCi0KLSAgKikgRml4IHN0b3JhZ2Ugb3ZlcmxheSB3aGVuIGxvYWRpbmcgZHNvcy4gIFN5bXB0b206IEFwYWNoZSBkaWVzIGF0Ci0gICAgIGluaXRpYWxpemF0aW9uIGlmIEFMTE9DX0RFQlVHIGlzIGRlZmluZWQ7IG5vIGtub3duIHN5bXB0b20gCi0gICAgIG90aGVyd2lzZS4gIFtKZWZmIFRyYXdpY2tdCi0KLSAgKikgRml4IHR5cG8gaW4gY29uZmlndXJlIHNjcmlwdCB3aGVuIGNoZWNraW5nIGZvciBtb2Rfc28uICBiYXNoCi0gICAgIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIGEgcHJvYmxlbSBidXQgL2Jpbi9zaCBvbiBTb2xhcmlzIGRvZXMuCi0gICAgIFN5bXB0b206ICIuL2NvbmZpZ3VyZTogdGVzdDogdW5rbm93biBvcGVyYXRvciA9PSIKLSAgICAgW0plZmYgVHJhd2lja10KLSAgIAotICAqKSBSZWJpbmQgdGhlIFdpbjMyIE5UIGFuZCA5eCBzZXJ2aWNlcyBjb250cm9sIGludG8gdGhlIE1QTS4gIAotICAgICBBbGwgY29uc29sZSwgV2luTlQgU0NNIGFuZCBXaW45eCBwc2V1ZG8tc2VydmljZSBjb250cm9sIGNvZGUgaXMKLSAgICAgbm93IHdyYXBwZWQgd2l0aGluIHRoZSBXaW5OVCBNUE0uCi0gICAgIFtXaWxsaWFtIFJvd2VdCi0KLSAgKikgTWFrZSBhIGNvcHkgb2YgZ2V0ZW52KCJQQVRIIikgYmVmb3JlIHN0b3JpbmcgZm9yIGxhdGVyIHVzZS4gIFNvbWUKLSAgICAgZ2V0ZW52KCkgaW1wbGVtZW50YXRpb25zIHVzZSB0aGUgc2FtZSBzdG9yYWdlIGZvciBzdWNjZXNzaXZlIGNhbGxzLgotICAgICBDR0lzIG9uIE9TLzM5MCBoYWQgYSBiYWQgUEFUSCBkdWUgdG8gdGhpcy4gIFtKZWZmIFRyYXdpY2tdCi0KLSAgKikgU2VydmVyIFRva2VucyB3b3JrIGluIDIuMCBhZ2Fpbi4gIFRoaXMgYWxzbyBwcm9wb2dhdGVzIHRoZSBjaGFuZ2UKLSAgICAgdG8gYWxsb3cganVzdCB0aGUgcHJvZHVjdCBuYW1lIGluIHRoZSBzZXJ2ZXIgc3RyaW5nIHVzaW5nCi0gICAgIFBST0RVQ1RfT05MWS4KLSAgICAgW1J5YW4gQmxvb21dCi0KLUNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wYTQKLQotICAqKSBFQkNESUM6IFJlYXJyYW5nZSBjYWxscyB0byBhcF9jaGVja2NvbnYoKSBzbyB0aGF0IG1vc3QgaGFuZGxlcnMKLSAgICAgd29uJ3QgbmVlZCB0byBjYWxsIGl0LiAgW0dyZWcgQW1lcywgSmVmZiBUcmF3aWNrXQotCi0gICopIE1vdmUgcHJlX2NvbmZpZyBob29rIGNhbGwgdG8gYmV0d2VlbiBjb25maWd1cmF0aW9uIHJlYWQgYW5kIGNvbmZpZwotICAgICB0cmVlIHdhbGsuICBUaGlzIGFsbG93cyBhbGwgbW9kdWxlcyB0byBpbXBsZW1lbnQgcHJlX2NvbmZpZyBob29rcwotICAgICBhbmQga25vdyB0aGF0IHRoZXkgd2lsbCBiZSBjYWxsZWQgYXQgYW4gYXBwcm9wcmlhdGUgdGltZS4KLSAgICAgW1J5YW4gQmxvb21dIAotCi0gICopIG1vZF9jZ2ksIG1vZF9jZ2lkOiBNYWtlIFNjcmlwdExvZyBkaXJlY3RpdmUgd29yayBhZ2Fpbi4gIAotICAgICBbSmVmZiBUcmF3aWNrXQotCi0gICopIEFkZCBwcmUtY29uZmlnIGhvb2tzIGJhY2sgdG8gYWxsIG1vZHVsZXMuCi0gICAgIFtSeWFuIEJsb29tXQotCi0gICopIEZpeCBhIFNJR1NFR1YgaW4gYXBfbWQ1ZGlnZXN0KCksIHdoaWNoIGlzIHVzZWQgd2hlbiB5b3UgaGF2ZQotICAgICBDb250ZW50RGlnZXN0IGVuYWJsZWQgYW5kIHdlIGNhbid0L2Rvbid0IG1tYXAgdGhlIGZpbGUuIAotICAgICBbSmVmZiBUcmF3aWNrXQotCi0gICopIFdlIG5vdyByZXBvcnQgdGhlIGNvcnJlY3QgbGluZSBudW1iZXIgZm9yIHN5bnRheCBlcnJvcnMgaW4gY29uZmlnCi0gICAgIGZpbGVzLiAgW1J5YW4gQmxvb20sIEdyZWcgU3RlaW4sIEplZmYgVHJhd2lja10KLQotICAqKSBCcm91Z2h0IG1vZF9hdXRoX2RpZ2VzdCB1cCB0byBzeW5jaCB3aXRoIDEuMywgZml4ZWQgYXBfdGltZV90LQotICAgICByZWxhdGVkIGJ1Z3MsIGFuZCBjaGFuZ2VkIHNobWVtL2xvY2tpbmcgdG8gdXNlIGFwciBBUEkuIFNoYXJlZC1tZW0KLSAgICAgaXMgY3VycmVudGx5IGRpc2FibGVkLCBob3dldmVyLCBiZWNhdXNlIG9mIHByb2JsZW1zIHdpdGggZ3JhY2VmdWwKLSAgICAgcmVzdGFydHMuIFtSb25hbGQgVHNjaGFs5HJdCi0KLSAgKikgRml4IGNvcnJ1cHRpb24gb2YgSUZTIHZhcmlhYmxlIGluIC0td2l0aC1tb2R1bGU9IGhhbmRsaW5nLiAgCi0gICAgIERlcGVuZGluZyBvbiB0aGUgdXNlcidzIHNoZWxsIG9yIGN1c3RvbWl6YXRpb24gdGhlcmVvZiwgdGhlcmUgCi0gICAgIHdvdWxkIGJlIGVycm9ycyBnZW5lcmF0aW5nIGFwX2NvbmZpZ19hdXRvLmggbGF0ZXIgaW4gdGhlIGNvbmZpZ3VyZQotICAgICBwcm9jZWR1cmUuICBbSmVmZiBUcmF3aWNrXQotCi0gICopIG1vZF9jZ2k6IFJlc3RvcmUgbG9nZ2luZyBvZiBzdGRlcnIgZnJvbSBjaGlsZCBwcm9jZXNzIHdoZW4gU2NyaXB0TG9nIAotICAgICBpc24ndCB1c2VkIChhcyBpbiAxLjMpLCBleGNlcHQgdGhhdCBvbiBVbml4IGl0IGlzIG5vdyBsb2dnZWQgdmlhIAotICAgICBhcF9sb2dfcmVycm9yKCkgaW5zdGVhZCBvZiBieSB0aGUgY2hpbGQgaGF2aW5nIFNUREVSUl9GSUxFTk8gcmVmZXIKLSAgICAgdG8gdGhlIGVycm9yIGxvZy4gIFtHcmVnIEFtZXMsIEplZmYgVHJhd2lja10KLQotICAqKSBBZGQgJy1EJyBhcmd1bWVudCBwcm9jZXNzaW5nIGZvciBydW4gdGltZSBjb25maWd1cmF0aW9uIGRlZmluZXMuCi0gICAgIFtXaWxsaWFtIFJvd2VdCi0KLSAgKikgT3JnYW5pemUgaHR0cF9tYWluLmMgYXMgaW5kZXBlbmRlbnQgY29kZSwgc3VjaCB0aGF0IG5vIGNvZGUgb3IKLSAgICAgZ2xvYmFsIGRhdGEgaXMgZXhwb3J0ZWQgZnJvbSBpdC4gIFdJTjMyIHdpbGwgZHluYW1pY2FsbHkgbGluayBpdAotICAgICB0byB0aGUgc2VydmVyIGNvcmUsIHNvIHRoaXMgd2lsbCBwcmV2ZW50IG11dHVhbCBkZXBlbmRlbmN5LgotICAgICBbV2lsbGlhbSBSb3dlXQotCi0gICopIEFkZCBzZXBhcmF0ZSBkeW5hbWljIGxpbmthZ2UgdGFncyBBUFJfRVhQT1JUKCksIEFQUl9FWFBPUlRfTk9OU1REKCkKLSAgICAgYW5kIEFQUl9WQVJfRVhQT1JUIHRvIGNvcnJlY3RseSByZXNvbHZlIGFwciBmdW5jdGlvbnMgYW5kIGdsb2JhbHMuCi0gICAgIFtXaWxsaWFtIFJvd2VdCi0KLSAgKikgQWRkIFdpbjl4IHNlcnZpY2UgZXhlY3V0aW9uIGFuZCBDdHJsK0MvQ3RybCtCcmVhay9TaHV0ZG93biBoYW5kbGVycy4KLSAgICAgW1dpbGxpYW0gUm93ZSwgSmFuIEp1c3QgS2VpanNlciA8S0VJSlNFUkpKQGxvZ2ljYS5jb20+XQotCi0gICopIEFkZCBtb2RfY2hhcnNldF9saXRlIGZvciBjb25maWd1cmluZyBjaGFyYWN0ZXIgc2V0IHRyYW5zbGF0aW9uLgotICAgICBbSmVmZiBUcmF3aWNrXQotCi0gICopIEFkZCAnLW4nIG9wdGlvbiB0byBodHBhc3N3ZCB0byBtYWtlIGl0IHByaW50IGl0cyB1c2VyOnB3IHJlY29yZAotICAgICBvbiBzdGRvdXQgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIGZyb2IgYSB0ZXh0IGZpbGUuICBbS2VuIENvYXJdCi0KLSAgKikgRml4IHNhZmVyZWFkLiAgQmFzaWNhbGx5LCB3ZSBmbHVzaCB0aGUgb3V0cHV0IGJ1ZmZlciBpZiBhIHJlYWQgb24gdGhlCi0gICAgIGlucHV0IHdpbGwgYmxvY2suCi0gICAgIFtSeWFuIEJsb29tXQotIAotICAqKSBBUFI6IEFkZCBhcF94bGF0ZV9nZXRfc2IoKSBzbyB0aGF0IGFuIGFwcCBjYW4gZmluZCBvdXQgd2hldGhlciBvciBub3QKLSAgICAgYSBjb252ZXJzaW9uIGlzIHNpbmdsZS1ieXRlIG9ubHkuIFtKZWZmIFRyYXdpY2tdCi0KLSAgKikgQkVPUzogYXBfc2h1dGRvd24gc2hvdWxkIHJldHVybiBBUFJfU1VDQ0VTUyBvciBlcnJuby4gTm90ZSB0aGF0Ci0gICAgIHRoZSBCZU9TIDUuMCBkb2N1bWVudGF0aW9uIHNheXMgdGhhdCBzaHV0ZG93biBkb2Vzbid0IHdvcmsgeWV0LgotICAgICBbUm95IEZpZWxkaW5nXQotCi0gICopIEZpeCBzb21lIG1pbm9yIGVycm9ycyB3aGVyZSBwaWQgd2FzIGJlaW5nIG1hbmlwdWxhdGVkIGFzIGFuIGludAotICAgICBpbnN0ZWFkIG9mIHRoZSBwb3J0YWJsZSBwaWRfdC4gIFtSb3kgRmllbGRpbmddCi0KLSAgKikgRml4IHNvbWUgZXJyb3IgbG9nIHByaW50cyB0aGF0IHdlcmUgcHJpbnRpbmcgdGhlIHBvaW50ZXIgdG8gYQotICAgICBzdHJ1Y3R1cmUgcmF0aGVyIHRoYW4gdGhlIHBpZCB3aXRoaW4gdGhlIHN0cnVjdHVyZS4KLSAgICAgW0plZmYgVHJhd2ljaywgUm95IEZpZWxkaW5nXQotCi0gICopIGFiOiBGaXggYSBjb21tYW5kLWxpbmUgcHJvY2Vzc2luZyBidWc7IHRyYWNrIGJhZCBoZWFkZXJzIGluIAotICAgICBlcnJfcmVzcG9uc2U7IHN1cHBvcnQgcmVhZGluZyBoZWFkZXJzIHVwIHRvIDJLLiAKLSAgICAgW0FzayBCam9lcm4gSGFuc2VuIDxhc2tAdmFsdWVjbGljay5jb20+XQotCi0gICopIEZpeCBhcF9yZXNvbHZlX2VudigpIHNvIHRoYXQgaXQgaGFuZGxlcyBuZXcgZnVuY3Rpb24gYWRkZWQgaW4gYSBwcmlvcgotICAgICBhbHBoYSAoc2VlICJBZGRlZCB0aGUgY2FwYWJpbGl0eSB0byBkbyAke0VOVlZBUn0gY29uc3RydWN0cyBpbiB0aGUKLSAgICAgY29uZmlnIGZpbGUuIikgYXMgd2VsbCBhcyB0aGUgY29uc3RydWN0cyB1c2VkIGJ5IG1vZF9yZXdyaXRlLgotICAgICBbUGF1bCBSZWRlciA8cmVkZXJwakByYWxlaWdoLmlibS5jb20+XQotCi0gICopIEFwYWNoZSAyLjAgYnVpbGRzIGFuZCBydW5zIG9uIE9TLzM5MC4gW0plZmYgVHJhd2ljaywgR3JlZyBBbWVzXQotCi0gICopIENoYW5nZSB0aGUgRUJDRElDIHN1cHBvcnQgaW4gZnVuY3Rpb25zIGZvciBNRDUsIFNIQTEsIGFuZCBiYXNlIDY0IHRvIHVzZQotICAgICBBUFIgdG8gcGVyZm9ybSB0cmFuc2xhdGlvbiwgaW5zdGVhZCBvZiBhY2Nlc3NpbmcgdGhlIGhhcmQtY29kZWQgdGFibGVzCi0gICAgIGluIDEuMydzIGViY2RpYy5jLiBbSmVmZiBUcmF3aWNrXQotCi0gICopIEZpeCBzb21lIGJ1Z3MgKG1vc3RseSBsb3N0IDEuMyBjb2RlKSBpbiBhYidzIGNvbW1hbmQtbGluZSBwcm9jZXNzaW5nLiAKLSAgICAgW0plZmYgVHJhd2lja10KLQotICAqKSBBZGQgdGhlIGFiaWxpdHkgdG8gaG9vayBpbnRvIHRoZSBjb25maWcgZmlsZSByZWFkaW5nIHBoYXNlLiAgQmFzaWNhbGx5Ci0gICAgIGlmIGEgZGlyZWN0aXZlIGlzIHNwZWNpZmllZCBFWEVDX09OX1JFQUQsIHRoZW4gd2hlbiB0aGF0IGRpcmVjdGl2ZSBpcwotICAgICByZWFkIGZyb20gdGhlIGNvbmZpZyBmaWxlLCB0aGUgYXNzb2NhaXRlZCBmdW5jdGlvbiBpcyBleGVjdXRlZC4gIFRoaXMKLSAgICAgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgdGhvc2UgZGlyZWN0aXZlcyB0aGF0IG11c3QgbXVjayB3aXRoIEhPVyB0aGUKLSAgICAgc2VydmVyIElOVEVSUFJFVFMgdGhlIGNvbmZpZy4gIFRoaXMgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBkaXJlY3RpdmVzCi0gICAgIHRoYXQgcmUtb3JkZXIgb3IgcmVwbGFjZSBpdGVtcyBpbiB0aGUgY29uZmlnIHRyZWUuICBUaG9zZSBjaGFuZ2VzIHNob3VsZAotICAgICBiZSBtYWRlIGluIHRoZSBwcmUtY29uZmlnIHN0ZXAuCi0gICAgIFtSeWFuIEJsb29tXQotCi0gICopIEFkZCBtb2RfZXhhbXBsZSB0byB0aGUgYnVpbGQgc3lzdGVtLgotICAgICBbVG9ueSBGaW5jaF0KLQotICAqKSBBUFI6IEFkZCBhcF94bGF0ZV9jb252X2J5dGUoKSB0byBjb252ZXJ0IG9uZSBjaGFyIGJldHdlZW4gc2luZ2xlLQotICAgICBieXRlIGNoYXJhY3RlciBzZXRzLiBbSmVmZiBUcmF3aWNrXQotCi0gICopIFBpY2sgdXAgdmFyaW91cyBFQkNESUMgZml4ZXMgZnJvbSAxLjMgKGZyb20gTWFydGluCi0gICAgIEtyYWVtZXIgYW5kIE9saXZlciBSZWggb3JpZ2luYWxseSBhY2NvcmRpbmcgdG8gdGhlIGNoYW5nZSBsb2cpLgotICAgICBbSmVmZiBUcmF3aWNrXQotCi0gICopIEZpeCBhIGNvdXBsZSBvZiBwcm9ibGVtcyBpbiBSRkMxNDEzIHN1cHBvcnQgKGNvbnRyb2xsZWQgYnkgdGhlCi0gICAgIElkZW50aXR5Q2hlY2sgZGlyZWN0aXZlKS4gIEFwYWNoZSBkaWQgbm90IGJ1aWxkIHRoZSByZXF1ZXN0IHN0cmluZwotICAgICBwcm9wZXJseSBhbmQgbW9yZSBpbXBvcnRhbnRseSBBcGFjaGUgd291bGQgbG9vcCBmb3JldmVyIGlmIHRoZSAKLSAgICAgd291bGQtYmUgaWRlbnQgc2VydmVyIGRyb3BwZWQgdGhlIGNvbm5lY3Rpb24gYmVmb3JlIHNlbmRpbmcgYQotICAgICBwcm9wZXJseSB0ZXJtaW5hdGVkIHJlc3BvbnNlLiBbSmVmZiBUcmF3aWNrXQotCi0gICopIGFweHMgd29ya3MgaW4gMi4wLgotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBSZWxpYWJsZSBwaXBlZCBsb2dzIHdvcmsgaW4gMi4wLgotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBJbnRyb2R1Y2UgYSBoYXNoIHRhYmxlIGltcGxlbWVudGF0aW9uIGludG8gQVBSIHRvIGJlIHVzZWQgZm9yCi0gICAgIHJlcGxhY2luZyB0YWJsZXMgYW5kIG90aGVyIHJhbmRvbSBkYXRhIHN0cnVjdHVyZXMgaW4gQXBhY2hlLgotICAgICBbVG9ueSBGaW5jaF0KLQotICAqKSBBZGQgc29tZSBtb3JlIGVycm9yIHJlcG9ydGluZyB0byBodHBhc3N3ZCBpbiB0aGUgY2FzZSBvZiBwcm9ibGVtcwotICAgICBnZW5lcmF0aW5nIG9yIGFjY2Vzc2luZyB0aGUgdGVtcG9yYXJ5IGZpbGUuICBBbHNvLCBwYXNzIGluIGEKLSAgICAgYnVmZmVyIGlmIHRoZSBpbXBsZW1lbnRhdGlvbiBrbm93cyBob3cgdG8gdXNlIGl0IChpLmUuLCBpZiBMX3RtcG5hbQotICAgICBpcyBkZWZpbmVkKS4gIFtLZW4gQ29hcl0KLQotICAqKSBDb25maWd1cmUgY3JlYXRlcyBjb25maWcubmljZSBub3cgY29udGFpbmluZyB5b3VyIGNvbmZpZ3VyZQotICAgICBvcHRpb25zLiBTeW50YXg6IC4vY29uZmlnLm5pY2UgWy0tbW9yZS1vcHRpb25zXQotICAgICBbU2FzY2hhIFNjaHVtYW5uXQotCi0gICopIEZpeCB2YXJpb3VzIHJldHVybiBjb2RlIHByb2JsZW1zIGluIEFQUiBvbiBXaW4zMi4gIEZvciBtb3N0IG9mCi0gICAgIHRoZXNlLCBBUFIgd2FzIHJldHVybmluZyBBUFJfRUVYSVNUIGluc3RlYWQgb2YgR2V0TGFzdEVycm9yKCkvCi0gICAgIFdTQUdldExhc3RFcnJvcigpLiAgW0plZmYgVHJhd2lja10KLQotICAqKSBNYWtlIHBpcGVkIGxvZ3Mgd29yayBhZ2FpbiBpbiB2ZXJzaW9uIDIuMAotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBBZGQgVlBBVEggc3VwcG9ydCB0byBVTklYIGJ1aWxkIHN5c3RlbSBvZiBBcGFjaGUgYW5kIEFQUi4KLSAgICAgW1Nhc2NoYSBTY2h1bWFubl0KLQotICAqKSBGaXggYXBfdG9rZW5pemVfdG9fYXJndiB0byByZXNwZWN0IHRoZSBjb25zdCBhcmd1bWVudHMgdGhhdCBhcmUKLSAgICAgcGFzc2VkIHRvIGl0LgotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBGaXggbW0ncyBtZW1jcHkvbWVtc2V0IG1hY3JvcywgcG9pbnRlciBhcml0aG1ldGljIHdhcyBicm9rZW4uCi0gICAgIFBhdGNoIHN1Ym1pdHRlZCB0byBhdXRob3IuCi0gICAgIFtTYXNjaGEgU2NodW1hbm5dCi0KLSAgKikgRml4IG1tIGNvbmZpZ3VyYXRpb24gb24gU29sYXJpcyA4IHg4NiBhbmQgT1MvMzkwLiAgRG9uJ3QgcmVxdWlyZQotICAgICAvc2JpbiBpbiBQQVRIIG9uIEZyZWVCU0QgKGFsbCBzdWJtaXR0ZWQgdG8gcnNlIHByZXZpb3VzbHkpIAotICAgICBbSmVmZiBUcmF3aWNrXQotCi0gICopIEZpeCBidWlsZGluZyBQdGhyZWFkLWJhc2VkIE1QTXMgb24gT3BlbkJTRAotICAgICBbU2FzY2hhIFNjaHVtYW5uXSBQUiMyNgotCi0gICopIEZpeCBhcF9yZWFkZGlyKCkgcHJvYmxlbSBvbiBzeXN0ZW1zIHdoZXJlIGRfbmFtZVtdIGZpZWxkIGluCi0gICAgIHN0cnVjdCBkaXJlbnQgaXMgZGVjbGFyZWQgd2l0aCBvbmx5IG9uZSBieXRlLiAgKFRoaXMgcHJvYmxlbSBvbmx5IAotICAgICBhZmZlY3RlZCBtdWx0aXRocmVhZGVkIGJ1aWxkcy4pICBUaGlzIGNhdXNlZCBhIHNlZ2ZhdWx0IGR1cmluZwotICAgICBwb29sIGNsZWFudXAgd2l0aCBtb2RfYXV0b2luZGV4IG9uIFNvbGFyaXMgKFNvbGFyaXMgOCB4ODYsIGF0IAotICAgICBsZWFzdCkuIFtKZWZmIFRyYXdpY2tdCi0KLSAgKikgRml4IHNvbWUgbWFrZS1wb3J0YWJpbGl0eSBwcm9ibGVtcyBvbiBhdCBsZWFzdCBUcnU2NCwgSXJpeAotICAgICBhbmQgVW5peFdhcmUuCi0gICAgIFtTYXNjaGEgU2NodW1hbm5dIFBSIzE4LCBQUiMzOQotCi0gICopIEFkZCBhcF9zaWd3YWl0KCkgdG8gc3VwcG9ydCBvbGQtc3R5bGUgc2lnd2FpdCgpIG9uIHN5c3RlbXMKLSAgICAgbGlrZSBPUy8zOTAgYW5kIFVuaXhXYXJlLgotICAgICBbU2FzY2hhIFNjaHVtYW5uXSAKLQotICAqKSBBZGQgUE9TSVgtdGhyZWFkIGZsYWdzIGZvciBtb3JlIHBsYXRmb3Jtcy4KLSAgICAgW1Nhc2NoYSBTY2h1bWFubl0KLQotICAqKSBGaXggc29tZSBtaW5vciBidWdzIGluIGFwX3N0cmVycm9yKCkuICBUZWFjaCBhcF9zdHJlcnJvcigpCi0gICAgIChvbiBVbml4LCBhdCBsZWFzdCkgdG8gaGFuZGxlIHJlc29sdmVyIGVycm9ycy4gIEZpeCBhIGJ1ZyBpbgotICAgICB0aGUgZGVmaW5pdGlvbiBvZiBBUFJfRU5PTUVNIHNvIHRoYXQgYXBfc3RyZXJyb3IoKSBjYW4gc3BpdAotICAgICBvdXQgdGhlIGNvcnJlY3QgZXJyb3IgbWVzc2FnZSBmb3IgaXQuCi0gICAgIFtKZWZmIFRyYXdpY2tdCi0KLUNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wYTMKLQotICAqKSBtb2Rfc28gcmVwb3J0cyBhcF9vc19kc29fZXJyb3IoKSBpZiBhcF9kc29fbG9hZCgpIGZhaWxzCi0gICAgIFtEb3VnIE1hY0VhY2hlcm5dCi0KLSAgKikgQVBJOiAqSE9PSyogbWFjcm9zIG5vdyBoYXZlIGFuIEFQXyBwcmVmaXgKLSAgICAgW0RvdWcgTWFjRWFjaGVybl0KLQotICAqKSBXaW4zMjogRWxpbWluYXRlIHJlZHVuZGFudCBjYWxscyB0byBpbml0aWFsaXplIHdpbnNvY2suCi0gICAgIFtUaW0gQ29zdGVsbG8gPHRpbWNvc3RlbGxvQG96ZW1haWwuY29tLmF1Pl0KLQotICAqKSBGaXggYnVncyBpbml0aWFsaXppbmcgdW5nZXRjaGFyIGZvciBwaXBlcy4gCi0gICAgIFtDaGlhLWxpYW5nIEthbyA8Y2xrYW9AQ2lyWC5PUkc+XQotCi0gICopIFRoZSBhYiBwcm9ncmFtIGluIHRoZSBzcmMvc3VwcG9ydCBkaXJlY3RvcnkgaXMgbm93IHBvcnRhYmxlIHVzaW5nCi0gICAgIEFQUi4KLSAgICAgW1J5YW4gQmxvb21dCi0KLSAgKikgU3VwcG9ydCBkaXJlY3RvcnkgaXMgYmVpbmcgY29tcGlsZWQgd2hlbiB0aGUgc2VydmVyIGlzIGJ1aWx0Ci0gICAgIFtSeWFuIEJsb29tXQotCi0gICopIFRoZSBjb25maWd1cmUgb3B0aW9uIC0td2l0aC1wcm9ncmFtLW5hbWUgaGFzIGJlZW4gYWRkZWQgdG8gYWxsb3cKLSAgICAgZGV2ZWxvcGVycyB0byByZW5hbWUgdGhlIGV4ZWN1dGFibGUgYXQgY29uZmlndXJlIHRpbWUuICBUaGlzIGFsc28KLSAgICAgY2hhbmdlcyB0aGUgbmFtZSBvZiB0aGUgY29uZmlnIGZpbGVzIHRvIG1hdGNoIHRoZSBleGVjdXRhYmxlJ3MgbmFtZS4KLSAgICAgW1J5YW4gQmxvb21dCi0KLSAgKikgbW9kX2F1dG9pbmRleDogQWRkIGBJbmRleE9wdGlvbnMgK1ZlcnNpb25Tb3J0JywgdG8gbmljZWx5IHNvcnQgZmlsZW5hbWVzCi0gICAgIGNvbnRhaW5pbmcgdmVyc2lvbiBudW1iZXJzLiBbTWFydGluIFBvb2xdCi0KLSAgKikgYXBfb3BlbiguLixBUFJfT1NfREVGQVVMVCwuLikgdXNlcyBwZXJtcyAwNjY2IGluc3RlYWQgb2YgMDc3NyBvbgotICAgICBVbml4OyBhY2Nlc3NfbG9nIGFuZCBlcnJvcl9sb2cgbm93IGNyZWF0ZWQgd2l0aCB0aGVzZSBwZXJtczsgbm9uLQotICAgICBVbml4IGlzIHVuYWZmZWN0ZWQgW0plZmYgVHJhd2lja10KLSAgICAgCi0gICopIEZpbmlzaGVkIG1vdmUgb2YgYXBfbWQ1IHJvdXRpbmVzIHRvIGFwcl9tZDUuICBSZW1vdmVkIGFwX21kNS5oLgotICAgICBSZXBsYWNlZCBtb3JlIG1hZ2ljIG51bWJlcnMgd2l0aCBNRDVfRElHRVNUU0laRS4KLSAgICAgW1dpbGxpYW0gUm93ZSwgUm95IEZpZWxkaW5nXQotCi0gICopIFdpbjMyOiBHZXQgbW9kX2F1dGhfZGlnZXN0IGNvbXBpbGluZyBhbmQgYWRkZWQgdG8gdGhlIFdpbmRvd3MKLSAgICAgYnVpbGQgZW52aXJvbm1lbnQuIE5vdCB0ZXN0ZWQgYW5kIEknZCBiZSBzdXByaXNlZCBpZiBpdCAKLSAgICAgYWN0dWFsbHkgd29ya3MuIFtCaWxsIFN0b2RkYXJkXQotCi0gICopIFJldmFtcCB0aGUgV2luMzIgbWFrZSBlbnZpcm9ubWVudC4gTWFrZWZpbGVzIGhhdmUgYmVlbiByZW1vdmVkIGFuZAotICAgICBBcGFjaGUuZHN3IGNyZWF0ZWQgdG8gYnJpbmcgdG9nZXRoZXIgYWxsIHRoZSBwaWVjZXMuIENyZWF0ZSBuZXcgZmlsZQotICAgICBvcy93aW4zMi9CYXNlQWRkci5yZWYgdG8gZGVmaW5lIG1vZHVsZSBiYXNlIGFkZHJlc3NlcyAodG8gcHJldmVudAotICAgICBkbGwgcmVsb2NhdGlvbiBhdCBzdGFydC11cCkuCi0gICAgIFtXaWxsaWFtIFJvd2UsIEdyZWcgTWFyciwgVGltIENvc3RlbGxvLCBCaWxsIFN0b2RkYXJkXQotCi0gICopIFtFQkNESUNdIFBvcnQgUGF1bCBHaWxtYXJ0aW4ncyBDUkxGIHBhdGNoIGZyb20gMS4zLiAgVGhpcyByZXBsYWNlcyBtb3N0Ci0gICAgIG9mIHRoZSBcMDE1LCBcMDEyLCBhbmQgXDAxNVwwMTIgY29uc3RhbnRzIHdpdGggbWFjcm9zLgotICAgICBbR3JlZyBBbWVzIDxncmVnYW1lc0B1cy5pYm0uY29tPl0KLSAgICAgCi0gICopIEFkZCBhcF94bGF0ZV9vcGVuKCkgZXQgYWwgZm9yIHRyYW5zbGF0aW9uIG9mIHRleHQgYmV0d2VlbiBkaWZmZXJlbnQgCi0gICAgIGNoYXJhY3RlciBzZXRzLiAgVGhlIGluaXRpYWwgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgaWNvbnYoKS4KLSAgICAgW0plZmYgVHJhd2lja10KLQotICAqKSBNb3JlIEZBUXMgYW5kIGFuc3dlcnMgZnJvbSBjb21wLmluZm9zeXN0ZW1zLnd3dy5zZXJ2ZXJzLnVuaXguCi0gICAgIFtKb3NodWEgU2xpdmUgPHNsaXZlQGZpbmFuY2UuY29tbWVyY2UudWJjLmNhPl0KLQotICAqKSBDR0kgb3V0cHV0IGlzIGJlaW5nIHRpbWVkIG91dCBub3cuCi0gICAgIFtSeWFuIEJsb29tXQotCi0gICopIEZpeCB0aGUgcHJvYmxlbSB3aXRoIGRpZWluZyBxdWlldGx5LiAgZHVwZmlsZSBub3cgdGFrZXMgYSBwb29sIHdoaWNoCi0gICAgIGlzIHVzZWQgYnkgdGhlIG5ldyBhcHIgZmlsZS4gIFRoZXJlIGlzIG5vIHJlYXNvbiB0byBjcmVhdGUgYSBuZXcgZmlsZQotICAgICB3aXRoIHRoZSBzYW1lIGxpZmV0aW1lIGFzIHRoZSBvcmlnaW5hbCBmaWxlLgotICAgICBbUnlhbiBCbG9vbV0gCi0KLSAgKikgV2luMzI6IEF0dGVtcHQgdG8gZWxpbWluYXRlIGRsbCByZWxvY2F0aW9uIGF0IHN0YXJ0LXVwIGJ5IHNwZWNpZnlpbmcKLSAgICAgbW9kdWxlIGJhc2UgYWRkcmVzc2VzLiBUaGlzIHdpbGwgaGVscCBzaG9vdGluZyBzZWcgZmF1bHRzCi0gICAgIGluIHRoZSBmaWVsZC4gW1dpbGxpYW0gUm93ZSA8d3Jvd2VAbG5kLmNvbT5dCi0KLSAgKikgVXBkYXRlIEFwYWNoZSBvbiBXaW5kb3dzIGRvY3VtZW50YXRpb24uIEFkZCBuZXcgZG9jdW1lbnQKLSAgICAgZGVzY3JpYmluZyBob3cgdG8gY29tcGlsZSBBcGFjaGUgb24gV2luZG93cy4KLSAgICAgW1dpbGxpYW0gUm93ZSA8d3Jvd2VAbG5kLmNvbT5dCi0KLSAgKikgYXBfc2V0X3BpcGVfdGltZW91dCgpLCBhcF9wb2xsKCksIGFuZCBBUFJfU09fVElNRU9VVCBub3cgdGFrZSAKLSAgICAgbWljcm9zZWNvbmRzIGluc3RlYWQgb2Ygc2Vjb25kcy4gIFNvbWUgc3RvcmFnZSBsZWFrcyBhbmQgb3RoZXIKLSAgICAgbWlub3IgYnVncyBpbiByZWxhdGVkIGNvZGUgd2VyZSBmaXhlZC4gIFtKZWZmIFRyYXdpY2tdCi0KLSAgKikgV2luMzI6IEZpcnN0IGN1dCBhdCBnZXR0aW5nIG1vZF9pc2FwaSB3b3JraW5nIHVuZGVyIDIuMAotICAgICBbV2lsbGlhbSBSb3dlIDx3cm93ZUBsbmQuY29tPl0KLQotICAqKSBGaXJzdCBzdGFiIGF0IGdldHRpbmcgbW9kX2F1dGhfZGlnZXN0IHdvcmtpbmcgdW5kZXIgMi4wCi0gICAgIHF1aWNrIGNoYW5nZSBzdW1tYXJ5OgotICAgICAtIG1vdmVkIHRoZSByYW5kb20gYnl0ZSBnZW5lcmF0aW9uIChhcF9nZW5lcmF0ZV9yYW5kb21fYnl0ZXMpIGludG8gQVBSCi0gICAgIC0gbm93IHVzZXMgYXBfdGltZV90Ci0gICAgIC0gY29tcGlsZXMgYW5kIHJ1bnMgb24gbGludXgKLSAgICAgLSB0ZXN0ZWQgd2l0aCBhbWF5YQotICAgICBbQnJpYW4gTWFydGluIDxibWFydGluQHBlbmd1aW5jb21wdXRpbmcuY29tPl0KLQotICAqKSBXaW4zMjogTW92ZSB0aGUgc3BhY2Ugc3RyaXBwaW5nIG9mIHBoeXNpY2FsIHNlcnZpY2UgbmFtZXMKLSAgICAgZml4IHVwIGZyb20gQXBhY2hlIDEuMy4gI2luY2x1ZGUnaW5nICJhcF9tcG0uaCIgZml4ZXMgdXAgYW4KLSAgICAgdW5yZXNvbHZlZCBzeW1ib2wuIEFkZCBkZXBlbmRlbmN5IGNoZWNraW5nIHRvIHRoZQotICAgICBDcmVhdGVTZXJ2aWNlIGNhbGwgdG8gZW5zdXJlIFRDUElQIGFuZCBBRlAgKHdpbnNvY2spIGlzIHN0YXJ0ZWQKLSAgICAgYmVmb3JlIEFwYWNoZS4KLSAgICAgW1dpbGxpYW0gUm93ZSA8d3Jvd2VAbG5kLmNvbT5dCi0KLSAgKikgV2luMzI6IEFkZCBjb2RlIHRvIHBlcmZvcm0gbGF0ZWJpbmRpbmcgb24gZnVuY3Rpb25zIHRoYXQgbWF5Ci0gICAgIG5vdCBleGlzdCBvbiBhbGwgbGV2ZWxzIG9mIFdpbmRvd3Mgd2hlcmUgQXBhY2hlIHJ1bnMuIFRoaXMKLSAgICAgaXMgbmVlZGVkIHRvIGFsbG93IEFwYWNoZSB0byBzdGFydC11cCBvbiBXaW45NS85OC4gQWxsIGNhbGxzCi0gICAgIHRvIG5vbiBwb3J0YWJsZSBmdW5jdGlvbnMgc2hvdWxkIGJlIHByb3RlY3RlZCB3aXRoCi0gICAgIGFwX29zbGV2ZWwgY2hlY2tzIHRvIHByZXZlbnQgcnVudGltZSBzZWdmYXVsdHMuIAotICAgICBbV2lsbGlhbSBSb3dlIDx3cm93ZUBsbmQuY29tPl0KLQotICAqKSBGaXggZmFsbGJhY2sgZGVmYXVsdCB2YWx1ZXMgZm9yIFNITV9SIGFuZCBTSE1fVyBbTWFydGluIEtyYWVtZXJdCi0KLSAgKikgR2V0IGxpbmdlcmluZ19jbG9zZSgpIHdvcmtpbmcgYWdhaW4uIFtEZWFuIEdhdWRldCwgSmVmZiBUcmF3aWNrXQotCi0gICopIFdpbjMyOiBHZXQgbm9uLWJsb2NraW5nIENHSSBwaXBlIHJlYWRzIHdvcmtpbmcgdW5kZXIgV2luZG93cyBOVC4KLSAgICAgVGhpcyBhZGRyZXNzZXMgUFIgMTYyMy4gU3RpbGwgbmVlZCB0byBhZGRyZXNzIHRpbWluZyBvdXQgcnVuYXdheQotICAgICBDR0kgc2NyaXB0cy4gW0JpbGwgU3RvZGRhcmRdCi0gCi0gICopIFdpbjMyOiBNYWtlIGFwX3N0YXQgV2luZG93cyA5NS85OCBmcmllbmRseQotICAgICBbV2lsbGlhbSBSb3dlIDx3cm93ZUBsbmQuY29tPl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICopIFdpbjMyOiBGaXggYSBidWcgaW4gYXBfZ2V0X29zbGV2ZWwgd2hpY2ggY2F1c2VzIEdldFZlcnNpb25FeCgpIHRvIAotICAgICBhbHdheXMgZmFpbC4gTmVlZCB0byBpbml0aWFsaXNlIHRoZSBkd09TVmVyc2lvbkluZm9TaXplIG1lbWJlciBvZiB0aGUgCi0gICAgIE9TVkVSU0lPTklORk8gc3RydWN0IGJlZm9yZSBjYWxsaW5nIEdldFZlcnNpb25FeCwgc28gR2V0VmVyc2lvbkV4IAotICAgICBhbHdheXMgZmFpbHMuIAotCi0gICAgIFRoZSBwYXRjaCBhbHNvIGVuaGFuY2VzIGFwX2dldF9vc2xldmVsIChhbmQgdGhlIGFzc29jaWF0ZWQgZW51bSkgdG8gCi0gICAgIGhhbmRsZSBzZWxlY3RlZCBzZXJ2aWNlIHBhY2tzIGZvciBOVDQsIGFuZCBhZGRzIHJlY29nbml0aW9uIGZvciAKLSAgICAgV2luZG93cyAyMDAwLiBUaGlzIGlzIHVzZWZ1bCwgZWcuIGlmIHdlIGNhbiByZWNvZ25pc2UgTlQ0IFNQMiB0aGVuIAotICAgICB3ZSBjYW4gdXNlIFJlYWRGaWxlU2NhdHRlciBhbmQgV3JpdGVGaWxlR2F0aGVyIGluIHJlYWR3cml0ZS5jLiAKLSAgICAgW1RpbSBDb3N0ZWxsbyA8VGltLkNvc3RlbGxvQEJURmluYW5jaWFsZ3JvdXAuY29tPl0KLQotICAqKSBHZXQgbW9kX3Jld3JpdGUgYnVpbGRpbmcgYW5kIHJ1bm5pbmcsIGFuZCBtb2Rfc3RhdHVzIGJ1aWxkaW5nIGZvciBXaW4gTlQKLSAgICAgW0FsbGFuIEVkd2FyZHMgPGFrZUByYWxlaWdoLmlibS5jb20+XQotCi0gICopIFBhdGNoIHRvIHBvcnQgbW9kX2F1dGhfZGIgdG8gdGhlIDIuMCBhcGkgYW5kIGFsc28gdG8gc3VwcG9ydCAKLSAgICAgQmVybGVrZXkgREIgMy4wLiBJdCB3b3JrcyBmb3IgbWUgd2l0aCBib3RoIEJlcmtlbGV5IERCIDMuMC41NSBhbmQgCi0gICAgIDIuNy43LiAgSXQgc2hvdWxkIHdvcmsgd2l0aCB2ZXJzaW9uIDEgYXMgd2VsbCBidXQgSSBoYXZlbid0IHRlc3RlZCBpdC4gIAotICAgICBbQnJpYW4gTWFydGluIDxibWFydGluQHBlbmd1aW5jb21wdXRpbmcuY29tPl0KLQotICAqKSBHZXQgQVBSIERTTyBjb2RlIHdvcmtpbmcgdW5kZXIgV2luZG93cy4gSW5jbHVkZXMgY3Jvc3MgcGxhdGZvcm0KLSAgICAgZml4ZXMgdG8gbW9kX3NvLmMuCi0gICAgIFtUaW0uQ29zdGVsbG9AQlRGaW5hbmNpYWxncm91cC5jb21dCi0KLSAgKikgRml4IHNvbWUgb2YgdGhlIFdpbmRvd3MgQVBSIHRpbWUgZnVuY3Rpb25zLgotICAgICBbV2lsbGlhbSBSb3dlXQotCi0gICopIEZBUSBjaGFuZ2VzIHJlbGF0ZWQgdG8gdGlkeWluZyB1cCBoaXN0b3JpY2FsIGRvY3VtZW50cyBvbiB0aGUgd2ViIHNpdGUuCi0gICAgIFtKb3NodWEgU2xpdmUgPHNsaXZlQGZpbmFuY2UuY29tbWVyY2UudWJjLmNhPl0KLQotICAqKSBNb3ZlIFdpbmRvd3MgRFNPIGNvZGUgaW50byBBUFIuCi0gICAgIFtCaWxsIFN0b2RkYXJkXQotCi0gICopIEVsaW1pbmF0ZSBhcHJfd2luLmggYW5kIGFwcl93aW5jb25maWcuaCAoYW5kIHRoZSB1Z2x5ICNpZmRlZnMgdGhleSBjYXVzZSkuCi0gICAgIE5vdywgYXByLmggYW5kIGFwcl9jb25maWcuaCBhcmUgZ2VuZXJhdGVkIGZyb20gYXByLmh3IGFuZCBhcHJfY29uZmlnLmh3Ci0gICAgIGF0IGJ1aWxkIHRpbWUuIEF0IHRoaXMgcG9pbnQsIHRoZSBzZXJ2ZXIgd2lsbCBub3QgY29tcGlsZSBvbiBXaW5kb3dzIGJlY2F1c2UKLSAgICAgb2YgdGhlIHJlY2VudCBEU08gY29tbWl0cy4gRml4aW5nIHRob3NlIG5leHQuCi0gICAgIFtCaWxsIFJvd2UgJiBCaWxsIFN0b2RkYXJkXQotCi0gICopIEFkZGVkIGVycm9yIGNoZWNraW5nIGZvciBmaWxlIEkvTyBBUFIgcm91dGluZXMuCi0gICAgIFtKb24gVHJhdmlzIDxqdHJhdmlzQGNvdmFsZW50Lm5ldD5dCi0KLSAgKikgQVBSOiBEb24ndCB1c2UgdGhlIHZhbHVlcyBvZiByZXNvbHZlciBlcnJvciBjb2RlcyBmb3IgdGhlIAotICAgICBjb3JyZXNwb25kaW5nIEFQUiBlcnJvciBjb2Rlcy4gIE9uIFVuaXggYW5kIFdpbjMyLCByZXR1cm4gdGhlIAotICAgICBwcm9wZXIgQVBSIGVycm9yIGNvZGUgYWZ0ZXIgYSByZXNvbHZlciBlcnJvci4gW0plZmYgVHJhd2lja10KLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjBhMgotCi0gICopIFJlbmFtZWQgdGhlIGV4ZWN1dGFibGUgYmFjayB0byBodHRwZCBvbiBhbGwgcGxhdGZvcm1zIG90aGVyIAotICAgICB0aGFuIFdpbjMyCi0gICAgIFtSeWFuIEJsb29tXQotCi0gICopIEFsbG93IEJlT1MgdG8gc3Vydml2ZSByZXN0YXJ0cywgbG9nIHByb3Blcmx5IGFuZCBhIGZldwotICAgICBzbWFsbCB0aGluZ3MgaXQgaGFkIHByb2JsZW1zIHdpdGggZHVlIHRvIHRoZSB3YXkgaXQgc2V0dXAKLSAgICAgdXNlcnMgYW5kIGdyb3Vwcy4gW0RhdmlkIFJlaWRdCi0KLSAgKikgR2V0IG1vZF9yZXdyaXRlIHdvcmtpbmcgd2l0aCBBUFIgbG9ja3MKLSAgICAgW1BhdWwgUmVkZXIgPHJlZGVycGpAcmFsZWlnaC5pYm0uY29tPl0KLQotICAqKSBBY3R1YWxseSByZW1vdmUgdGhlIHNlbXBhaG9yZSB3aGVuIHRoZSBsb2NrIGNsZWFudXAgcm91dGluZQotICAgICBpcyBjYWxsZWQgb24gQmVPUy4gW0RhdmlkIFJlaWRdCi0KLSAgKikgQ2xlYXIgaG9vayByZWdpc3RyYXRpb25zIGJldHdlZW4gcmVhZHMgb2YgdGhlIGNvbmZpZyBmaWxlLgotICAgICBXaGVuIERTT3MgYXJlIHVubG9hZGVkIGFuZCByZS1sb2FkZWQgdGhlIG9sZCBob29rIHBvaW50ZXJzIG1heQotICAgICBubyBsb25nZXIgYmUgdmFsaWQuIFRoaXMgZml4IGVsaW1pbmF0ZXMgcG90ZW50aWFsIHNlZ2ZhdWx0cy4KLSAgICAgW0FsbGFuIEVkd2FyZHMgPGFrZUByYWxlaWdoLmlibS5jb20+XQotCi0gICopIEZpeCBhIHByb2JsZW0gd2l0aCBTaWdmdW5jIG5vdCBiZWluZyBkZWZpbmVkIG9yIGJ5cGFzc2VkCi0gICAgIGlmIHNpZ2FjdGlvbigpIHdhc24ndCBmb3VuZC4gW0ppbSBKYWdpZWxza2ldCi0KLSAgKikgRml4IHRoZSBsb2NraW5nIG1lY2hhbmlzbSBvbiBCU0QgdmFyaWFudHMuICBUaGV5IG5vdyB1c2UgZmNudGwKLSAgICAgbG9ja3MuICBUaGlzIGFsbG93cyB0aGUgc2VydmVyIHRvIHN0YXJ0IGFuZCBzZXJ2ZSBwYWdlcy4KLSAgICAgW1J5YW4gQmxvb21dCi0KLSAgKikgRmlyc3QgY3V0IGF0IGdldHRpbmcgdGhlIFdpbjMyIGluc3RhbGxlciB0byB3b3JrCi0gICAgIFtXaWxsaWFtIFJvd2UgPHdyb3dlQGxuZC5jb20+XQotCi0gICopIEdldCBodHBhc3N3ZCBjb21waWxpbmcgdW5kZXIgV2luZG93cwotICAgICBbV2lsbGlhbSBSb3dlIDx3cm93ZUBsbmQuY29tPl0KLQotICAqKSBDaGFuZ2UgdGhlIGxvZyBtZXNzYWdlIGZvciBhIGJpbmQoKSBmYWlsdXJlIHRvIHNob3cgdGhlCi0gICAgIGludGVyZmFjZSBhbmQgcG9ydCBudW1iZXIuIFtKZWZmIFRyYXdpY2tdCi0KLSAgKikgSW1wb3J0IHRoZSBkb2N1bWVudGF0aW9uIGZyb20gMS4zLjEyIGFuZCBicmluZyBwYXJ0cyBvZiBpdAotICAgICB1cC10by1kYXRlIHdpdGggcmVzcGVjdCB0byB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgb2NjdXJyZWQKLSAgICAgaW4gMi4wLgotICAgICBbVG9ueSBGaW5jaF0KLQotICAqKSBCZU9TIE1QTSB1cGRhdGVkLiAgQ0dJIGJ1ZyBvbiBCZU9TIGZpeGVkLiAgSVAgYWRkcmVzc2VzCi0gICAgIG5vdyBsb2dnZWQgY29ycmVjdGx5IG9uIEJlT1MuCi0gICAgIFtEYXZpZCBSZWlkXQotCi0gICopIENyZWF0ZSBvbmUgbWFrZWZpbGUgZm9yIGFsbCBXaW4zMiBkaXN0cmlidXRpb25zIChOVC8yMDAwLzk1Lzk4KS4KLSAgICAgTWFrZWZpbGUud2luIGluY2x1ZGVzIHRoZSBzYW1lIHVzZXIgaW50ZXJmYWNlIGFzIHRoZSBvbGQgCi0gICAgIE1ha2VmaWxlLm50IAotICAgICBbV2lsbGlhbSBSb3dlIDx3cm93ZUBsbmQuY29tPiwgSmVmZiBUcmF3aWNrIDx0cmF3aWNrQHVzLmlibS5jb20+XQotCi0gICopIFdpbjMyIGV4ZWMgbm93IHVzZXMgQ09NU1BFQyBlbnZpcm9ubWVudCBzdHJpbmcgZm9yIGNvbW1hbmQgCi0gICAgIHNoZWxsIHBhdGggcmVzb2x1dGlvbi4KLSAgICAgW1dpbGxpYW0gUm93ZSA8d3Jvd2VAbG5kLmNvbT5dIFBSIzM3MTUKLQotICAqKSBXaW4zMjogYXBfY29ubmVjdCgpIHdhcyBub3QgcmV0dXJuaW5nIGNvcnJlY3QgZXJyb3IgY29uZGl0aW9uCi0gICAgIFBSNTg2NgotICAgICBbQWxsZW4gUHJlc2NvdHQgPGFsbGVuQGNsYW5wcmVzY290dC5jb20+XQotCi0gICopIFdpbjMyOiBhcF9vcGVuKCkgd2FzIGJyb2tlbiBvbiBXaW45eCBiZWNhdXNlIGFuIE5ULXNwZWNpZmljCi0gICAgIGZsYWcgd2FzIHBhc3NlZCB0byBDcmVhdGVGaWxlLiAgYXBfcHV0cygpIGFkZGVkIGFuIHVubmVjZXNzYXJ5Ci0gICAgICdcbicuCi0gICAgIFtKZWZmIFRyYXdpY2sgPHRyYXdpY2tAdXMuaWJtLmNvbT5dCi0KLSAgKikgUHV0IGluIEtvcmVhbiBhbmQgTm9yd2VnaWFuIGluZGV4Lmh0bWwgcGFnZXMgKDIuMCBhbmQgMS4zKQotICAgICB3aGljaCB3aGVyZSBkb25hdGVkIGJ5IExlZSBLdWsgSHl1biBhbmQgTG9yYW50IEN6YXJhbi4gJ0ZpeGVkJwotICAgICBjb25mdXNpbmcgZWUvZXQgbmFtZSBhbmQgbWFkZSBhbGwgZXh0ZW5zaW9ucyBsYW5ndWFnZS9kaWFsZWN0Ci0gICAgIHJhdGhlciB0aGFuIGNvdW50cnkgcmVmbGVjdGluZy4gQ2hhbmdlZCBleGFtcGxlIGZpbGVzIHRvCi0gICAgIGV4cGxpY2l0IHJlZmxlY3QgdGhlIElTTyBjaGFyc2V0IGFuZCBhZGRlZCBhIGZldyBjb21tb24gCi0gICAgIG9uZXMgdG8gdGhlIGV4YW1wbGUgY29uZmlnIFtkaXJreF0KLQotICAqKSBFeHRlbmQgZXh0ZXJuYWwgbW9kdWxlIGNhcGFiaWxpdHkuICBUbyB1c2UgdGhpcywgeW91IGNhbGwKLSAgICAgY29uZmlndXJlIHdpdGggLS13aXRoLW1vZHVsZT1wYXRoL3RvL21vZDEscGF0aC90by9tb2QyLGV0Yy4KLSAgICAgW1J5YW4gQmxvb21dCi0KLSAgKikgQmFja3BvcnRlZCB0aGUgdmFyaW91cyAiZGVmYXVsdCBjaGFyc2V0IiBmaXhlcyBmcm9tIDEuMy4xMiwKLSAgICAgaW5jbHVkaW5nIHRoZSBBZGREZWZhdWx0Q2hhcnNldCBkaXJlY3RpdmUuIFtKaW0gSmFnaWVsc2tpXQotCi0gICopIEFkZGVkIHRoZSBjYXBhYmlsaXR5IHRvIGRvICR7RU5WVkFSfSBjb25zdHJ1Y3RzIGluIHRoZQotICAgICBjb25maWcgZmlsZS4gRS5nLiAnU2VydmVyQWRtaW4gJHtQT1NUTUFTVEVSfScuIEFzIGNvbW1pdGVkCi0gICAgIGl0IGRvZXMgdGhpcyBvbiBhIGxpbmUgYnkgbGluZSBiYXNpczsgaS5lLiBpZiB0aGUgZW52dmFyCi0gICAgIGV4cGFuZHMgdG8gc29tZXRoaW5nIHdpdGggc3BhY2VzIHlvdSBoYXZlIHRvIHByb3RlY3QgaXQKLSAgICAgYnkgYWRkaW5nIHF1b3RlcyBhcm91bmQgaXQgKFVubGVzcyBvZiBjb3Vyc2UgeW91IGV4cGVjdCBpdAotICAgICB0byBjb250YWlucyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LiBBbHRlcm5hdGl2ZWx5IHlvdQotICAgICBjYW4gY29tcGlsZSBpdCBvbiBhIHBlciB0b2tlbiBiYXNpczsgd2hpY2ggaXMgd2hhdCBwZW9wbGUKLSAgICAgdXN1YWxseSBleHBlY3QgYnkgc2V0dGluZyBSRVNPTFZFX0VOVl9QRVJfVE9LRU4uIEJ1dCB0aGlzCi0gICAgIGhhbXBlcnMgZmFuY2llciBoYWNrcy4KLSAgICAgW0RpcmstV2lsbGVtIHZhbiBHdWxpa10KLQotICAqKSBDaGFuZ2VkIHRoZSAnRXJyb3JEb2N1bWVudCcgc3ludGF4IGluIHRoYXQgaXQgTk8gbG9uZ2VyCi0gICAgIHN1cHBvcnRzIHRoZSBhc3ltZXRyaWMKLQotICAgICAgICAgICAgICAgIEVycm9yRG9jdW1lbnQgMzAxICJTb21lIG1lc3NhZ2UKLQotICAgICBOb3RlIHRoZSBvcGVuaW5nICIgcXVvdGUsIHdpdGhvdXQgYSBjbG9zaW5nIHF1b3RlLiBJdCBub3cKLSAgICAgaGFzIGVpdGhlciB0aGUgZm9sbG93aW5nIHN5bnRheGVzCi0KLSAgICAgICAgICAgICAgICBFcnJvckRvY3VtZW50IFhYWCAvbG9jYWwvdXJpCi0gICAgICAgICAgICAgICAgRXJyb3JEb2N1bWVudCBYWFggaHR0cDovL3ZhbGlkL3VybAotICAgICAgICAgICAgICAgIEVycm9yRG9jdW1lbnQgWFhYICJTb21lIE1lc3NhZ2UiCi0KLSAgICAgVGhlIHJlY29nbml0aW9uIGhldXJpc3RpYyBpczogaWYgaXQgaGFzIGEgc3BhY2UgaXQKLSAgICAgaXMgYSBtZXNzYWdlLiBJZiBpdCBoYXMgbm8gc3BhY2VzIGFuZCBzdGFydHMgd2l0aCBhIC8KLSAgICAgb3IgaXMgYSB2YWxpZCBVUkwgdGhlbiB0cmVhdCBpdCB0aGF0IHdheS4gT3RoZXJ3aXNlIGl0Ci0gICAgIGlzIGFzc3VtZWQgdG8gYmUgYSBtZXNzYWdlLgotCi0gICAgIFRoaXMgYnJlYWtzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYnV0IG1ha2VzIGxpdmUgYSBoZWxsCi0gICAgIG9mIGEgbG90IGVhc2llciBmb3IgR1VJJ3MgYW5kIGNvbmZpZyBmaWxlIHBhcnNlcnMuCi0gICAgIFtEaXJrLVdpbGxlbSB2YW4gR3VsaWtdCi0KLSAgKikgQ2hhbmdlZCAnQ2FjaGVOZWdvdGlhdGVkRG9jcycgZnJvbSBpdHMgcHJlc2VudC9ub3QtcHJlc2VudAotICAgICBzeW50YXggaW50byBhICdvbicgb3IgJ29mZicgc3ludGF4LiBBcyBpdCBjdXJyZW50bHkgaXMgdGhlCi0gICAgIG9ubHkgbm9uIG5lc3RpbmcgdG9rZW4gd2hpY2ggdXNlcyBOT19BUkdTIGFuZCB0aHVzIGlzIGFuCi0gICAgIGFic29sdXRlIHBhaW4gZm9yIGFueSBjb25maWcgaW50ZXJmYWNlIGF1dG9tYXRpb24uIFRoaXMKLSAgICAgYnJlYWtzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIFtEaXJrLVdpbGxlbSB2YW4gR3VsaWtdCi0KLSAgKikgQWRkIGFiaWxpdHkgdG8gYWRkIGV4dGVybmFsIG1vZHVsZXMgdG8gdGhlIGJ1aWxkIHByb2Nlc3MuICBUaGlzIGlzCi0gICAgIGRvbmUgd2l0aCAtLXdpdGgtbW9kdWxlPS9wYXRoL3RvL21vZHVsZS4gIE1vZHVsZXMgY2FuIG9ubHkgYmUgYWRkZWQKLSAgICAgYXMgc3RhdGljIG1vZHVsZXMgYXQgdGhpcyBwb2ludC4KLSAgICAgW1J5YW4gQmxvb21dCi0KLUNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wYTEKLQotICAqKSBGaXggRnJlZUJTRCAzLjMgY29yZSBkdW1wLgotICAgICBCYXNpY2FsbHksIGFwX2luaXRpYWxpemUoKSBuZWVkcyB0byBnZXQgY2FsbGVkIGJlZm9yZSAKLSAgICAgY3JlYXRlX3Byb2Nlc3MoKSwgc2luY2UgY3JlYXRlX3Byb2Nlc3MoKSBwYXNzZXMgb3Bfb24gc3RydWN0dXJlCi0gICAgIHRvIHNlbW9wKCkgdG8gZ2V0IGEgbG9jaywgYnV0IG9wX29uIGlzbid0IGluaXRpYWxpemVkIHVudGlsIAotICAgICBhcF9pbml0aWFsaXplKCkgY2FsbHMgc2V0dXBfbG9jaygpLiAgSGVyZSBpcyBhIHNsaWdodAotICAgICByZWFycmFuZ2VtZW50IHRvIG1haW4oKSB3aGljaCBjYWxscyBhcF9pbml0aWFsaXplKCkgZWFybGllci4uLgotICAgICBbSmVmZiBUcmF3aWNrIDx0cmF3aWNrQHVzLmlibS5jb20+XQotCi0gICopIEVuYWJsZSBBcGFjaGUgdG8gdXNlIHNlbmRmaWxlL1RyYW5zbWl0RmlsZSBBUEkKLSAgICAgW0JpbGwgU3RvZGRhcmQsIERhdmlkIFJlaWQsIFBhdWwgUmVkZXJdCi0KLSAgKikgUmUtSW1wbGVtZW50IFdpbjMyIEFQUiBuZXR3b3JrIEkvTyBBUElzIGFuZCBtb3N0IG9mIHRoZSBmaWxlIEkvTwotICAgICBBUElzLgotICAgICBbQmlsbCBTdG9kZGFyZF0KLQotICAqKSBNYWtlIGZpbGUgSS9PIGFuZCBuZXR3b3JrIEkvTyB3cml0ZXYvc2VuZHYgQVBJcyBjb25zaXN0ZW50LgotICAgICBFbGltaW5hdGUgdXNlIG9mIGFwX2lvdmVjX3QgYW5kIHVzZSBQb3NpeCBzdHJ1Y3QgaW92ZWMuCi0gICAgIFVzZSBzZXBlcmF0ZSB2YXJpYWJsZSBvbiBhcF93cml0ZXYgdG8gc2V0IHRoZSBudW1iZXIgb2YgaW92ZWNzCi0gICAgIHBhc3NlZCBpbiBhbmQgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCi0gICAgIFtCaWxsIFN0b2RkYXJkXQotCi0gICopIEFkYXB0IGZpbGUgaW9sIHRvIHVzZSBBUFIgZnVuY3Rpb25zLiBSZXBsYWNlZCBhcF9vcGVuX2ZpbGUoKSAKLSAgICAgd2l0aCBhcF9jcmVhdGVfZmlsZV9pb2woKS4gYXBfY3JlYXRlX2ZpbGVfaW9sKCkgcmVxdWlyZXMgdGhhdCAKLSAgICAgdGhlIGZpbGUgYmUgb3BlbmVkIHByaW9yIHRvIHRoZSBjYWxsIHVzaW5nIGFwX29wZW4oKS4KLSAgICAgW0JpbGwgU3RvZGRhcmRdCi0KLSAgKikgUG9ydCBtb2RfaW5jbHVkZSBhbmQgbW9kX2NnaSB0byAyLjAKLSAgICAgW1BhdWwgUmVkZXIsIEJpbGwgU3RvZGRhcmRdCi0KLSAgKikgYXBfc2VuZHssdn0sIGFwX3JlY3YsIGFwX3NlbmRmaWxlIEFQSSBjbGFyaWZpY2F0aW9uIC0tCi0gICAgIGJ5dGVzX3JlYWQvYnl0ZXNfd3JpdHRlbiBpcyBhbHdheXMgdmFsaWQgKG5ldmVyIC0xKS4gIFBsdXMKLSAgICAgc29tZSBmaXhlcyB0byBidWZmLmMgdG8gY29ycmVjdCBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IHRoZQotICAgICBlcnJubyA9PiBhcF9zdGF0dXNfdCBjaGFuZ2VzIGEgd2hpbGUgYmFjay4gIFBsdXMgYSBmaXggdG8KLSAgICAgY2h1bmtlZCBlbmNvZGluZyBpbnRyb2R1Y2VkIHJpZ2h0IGF0IHRoZSBiZWdpbm5pbmcgb2YgMi4wLgotICAgICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgUmV2YW1wZWQgVU5JWCBidWlsZCBzeXN0ZW0gdG8gdXNlIGF1dG9jb25mIGFuZCBsaWJ0b29sLgotICAgICBbTWFub2ogS2FzaWNoYWludWxhLCBTYXNjaGEgU2NodW1hbm5dCi0KLSAgKikgcG9ydCBtb2RfcmV3cml0ZSB0byAyLjAuIFtQYXVsIEouIFJlZGVyIDxyZWRlcnBqQHJhbGVpZ2guaWJtLmNvbT5dCi0KLSAgKikgTW9yZSByaWdvcm91cyBjaGVja2luZyBvZiBIb3N0OiBoZWFkZXJzIHRvIGZpeCBzZWN1cml0eSBwcm9ibGVtcwotICAgICB3aXRoIG1hc3MgbmFtZS1iYXNlZCB2aXJ0dWFsIGhvc3RpbmcgKHdoZXRoZXIgdXNpbmcgbW9kX3Jld3JpdGUKLSAgICAgb3IgbW9kX3Zob3N0X2FsaWFzKS4KLSAgICAgW0JlbiBIeWRlLCBUb255IEZpbmNoXQotICAKLSAgKikgQWRkIGJhY2sgc3VwcG9ydCBmb3IgVXNlQ2Fub25pY2FsTmFtZSBpbiA8RGlyZWN0b3J5PiBjb250YWluZXJzLgotICAgICBbTWFub2ogS2FzaWNoYWludWxhXQotCi0gICopIEFkZGVkIEFQTE9HX1NUQVJUVVAgbG9nIHR5cGUuICBUaGlzIGFsbG93cyB1cyB0byB3cml0ZSBhbiBlcnJvcgotICAgICBtZXNzYWdlIHdpdGhvdXQgYW55IG9mIHRoZSBkYXRlIGFuZCB0aW1lIGluZm9ybWF0aW9uLiAgQXMgYSBwYXJ0Ci0gICAgIG9mIHRoaXMgY2hhbmdlLCBJIGFsc28gcmVtb3ZlZCBhbGwgb2YgdGhlIGNhbGxzIHRvIGZwcmludGYoc3RkZXJyCi0gICAgIGFuZCByZXBsYWNlZCB0aGVtIHdpdGggY2FsbHMgdG8gYXBfbG9nX2Vycm9yIHVzaW5nIEFQTE9HX1NUQVJUVVAKLSAgICAgd3JpdGluZyB0byBzdGRlcnIgaXMgbm8gbG9uZ2VyIHBvcnRhYmxlLCBiZWNhdXNlIHdlIGRvbid0IGRpcmVjdCAKLSAgICAgc3RkZXJyIHRvIHRoZSBlcnJvciBsb2cgb24gYWxsIHBsYXRmb3Jtcy4KLSAgICAgW1J5YW4gQmxvb21dIAotIAotICAqKSBDb252ZXJ0IGVycm9yIGxvZ2dpbmcgZnVuY3Rpb25zIHRvIHRha2UgZXJybm8gYXMgYW4gYXJndW1lbnQuCi0gICAgIFRoaXMgbWFrZXMgb3VyIGVycm9yIGxvZ3MgbW9yZSBwb3J0YWJsZSwgYmVjYXVzZSBzb21lIFdpbmRvd3MgQVBJJ3MgCi0gICAgIGRvbid0IHNldCBlcnJuby4gIFRoaXMgY2hhbmdlIGFsbG93cyB1cyB0byBzdGlsbCBvdXRwdXQgYSB2YWxpZAotICAgICBtZXNzYWdlIG9uIGFsbCBvZiBvdXIgcGxhdGZvcm1zLgotICAgICBbUnlhbiBCbG9vbV0KLQotICAqKSBtb2RfbWltZV9tYWdpYyBydW5zIGluIDIuMC1kZXYgbm93LgotICAgICBbUGF1bCBSZWRlciA8cmVkZXJwakByYWxlaWdoLmlibS5jb20+XQotCi0gICopIHNlbmRmaWxlIGhhcyBiZWVuIGFkZGVkIHRvIEFQUi4KLSAgICAgW0pvaG4gWmVkbGV3c2tpIDx6ZWRsd3NraUBQcmluY2V0b24uRURVPl0KLQotICAqKSBidWZmLmMgaGFzIGJlZW4gY29udmVydGVkIHRvIG5vIGxvbmdlciB1c2UgZXJybm8uCi0gICAgIFtNYW5vaiBLYXNpY2hhaW51bGFdCi0KLSAgKikgbW9kX3NwZWxpbmcgcnVucyBpbiAyLjAtZGV2IG5vdzogYSBidWcgaW4gcmVhZGRpcl9yIGhhbmRsaW5nIGFuZAotICAgICBpbnRlcmZhY2UgYWRhcHRpb24gdG8gQVBSIGZ1bmN0aW9ucyBkaWQgaXQuIFtNYXJ0aW4gS3JhZW1lcl0KLQotICAqKSBTdXBwb3J0IERTT3MgcHJvcGVybHkgb24gMzItYml0IEhQLVVYIDExLjAKLSAgICAgW0RpbGlwIEtoYW5kZWthciA8ZGlsaXBAY3VwLmhwLmNvbT5dCi0KLSAgKikgVXBkYXRlZCBNTSBpbiBBUFIgc291cmNlIHRyZWUgZnJvbSB2ZXJzaW9uIDEuMC44IHRvIDEuMC4xMQotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBDbGVhbmVkIEFQUiBidWlsZCBlbnZpcm9ubWVudCBpbnRlZ3JhdGlvbiBhbmQgYm9vdHN0cmFwIEFQUiAKLSAgICAgYXV0b21hdGljYWxseSBmb3IgZGV2ZWxvcGVycyBmcm9tIHNyYy9Db25maWd1cmUuCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIEZpeGVkIGJ1aWxkaW5nIG9mIHNyYy9zdXBwb3J0L2h0cGFzc3dkLmMKLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgV2hlbiBnZW5lcmF0aW5nIHRoZSBMb2NhdGlvbjogaGVhZGVyLCBtb2Rfc3BlbGluZyBmb3Jnb3QKLSAgICAgdG8gZXNjYXBlIHRoZSBzcGVsbGluZy1maXhlZCB1cmkuIChGb3J3LVBvcnQgZnJvbSAxLjMpCi0gICAgIFtNYXJ0aW4gS3JhZW1lcl0KLQotICAqKSBNb3ZlZCBtb2RfYXV0aF9kaWdlc3QuYyBmcm9tIGV4cGVyaW1lbnRhbCB0byBzdGFuZGFyZC4gW1JveSBGaWVsZGluZ10KLQotICAqKSBDaGFuZ2UgYWxsIHBvb2xzIHRvIEFQUiBjb250ZXh0cy4gIFRoaXMgaXMgdGhlIGZpcnN0IHN0ZXAgdG8KLSAgICAgaW5jb3Jwb3JhdGluZyBBUFIgaW50byBBcGFjaGUuIFtSeWFuIEJsb29tXQotCi0gICopIE1vdmUgImhhbmRsZXIgbm90IGZvdW5kIiB3YXJuaW5nIG1lc3NhZ2UgdG8gYmVsb3cgdGhlIGNoZWNrCi0gICAgIGZvciBhIHdpbGRjYXJkIGhhbmRsZXIuICBbRGlyayA8ZGlya21AdGVsZXBvcnQuY29tPiwgUm95IEZpZWxkaW5nXQotICAgICBQUiMyNTg0LCBQUiMyNzUxLCBQUiMzMzQ5LCBQUiMzNDM2LCBQUiMzNTQ4LCBQUiM0Mzg0LCBQUiM0Nzk1LCBQUiM0ODA3Ci0KLSAgKikgU3VwcG9ydCBsaW5lLWNvbnRpbnVhdGlvbiBmZWF0dXJlIGluIGNvbmZpZy5vcHRpb24gZmlsZSBhbmQKLSAgICAgYWxsb3cgdGhlIGxvYWRpbmcgb2YgbXVsdGlwbGUgb3B0aW9uIHNlY3Rpb25zIGF0IG9uY2UgdmlhCi0gICAgIGBgLS13aXRoLW9wdGlvbj08c2VjdGlvbjE+LDxzZWN0aW9uMj4sLi4uJycKLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgUmVidWlsdCBDVlMgcmVwb3NpdG9yeSB3aXRoIEFwYWNoZSAxLjMuOSBhcyBiYXNpcy4gIFtSb3kgRmllbGRpbmddCi0KLUNoYW5nZXMgd2l0aCBBcGFjaGUgTVBNCi0KLSAgKikgVXNlIGFzeW5jaHJvbm91cyBBY2NlcHRFeCgpIGFuZCBhIGNvbXBsZXRpb24gcG9ydCB0byBhY2NlcHQgYW5kCi0gICAgIGRpc3BhdGNoIGNvbm5lY3Rpb25zIHRvIHRocmVhZHMgaW4gV2luZG93cyBOVC8yMDAwLiAKLSAgICAgW0JpbGwgU3RvZGRhcmRdCi0KLSAgKikgSW1wbGVtZW50IFdJTk5UIFdpbjMyIE1QTSBmcm9tIG9yaWdpbmFsIFdpbjMyIGNvZGUgaW4gaHR0cF9tYWluLmMKLSAgICAgW0JpbGwgU3RvZGRhcmRdICAKLQotICAqKSBJbXBsZW1lbnQgdGhlIEFQQUNJIC0td2l0aC1vcHRpb24gZmFjaWxpdHkgCi0gICAgIChwZXIgZGVmYXVsdCB1c2VkIHRoZSBjb25maWcub3B0aW9uIGZpbGUpLgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBNUE0gQkVPUyBwb3J0LiAgW0RhdmlkIFJlaWQgPGFiYjM3QGRpYWwucGlwZXguY29tPl0KLQotICAqKSBTdGFydCB0byBpbXBsZW1lbnQgbW9kdWxlLWRlZmluZWQgaG9va3MgdGhhdCBhcmUgYSkgZmFzdCBhbmQgYikgdHlwZXNhZmUuCi0gICAgIFJlcGxhY2UgcHJlX2Nvbm5lY3Rpb24gbW9kdWxlIGNhbGwgd2l0aCBhIHJlZ2lzdGVyX2hvb2sgY2FsbCBhbmQKLSAgICAgaW1wbGVtZW50IHByZV9jb25uZWN0aW9uIGFzIGEgaG9vay4gVGhlIGludGVudCBpcyB0aGF0IHRoZXNlIGhvb2tzIHdpbGwKLSAgICAgYmUgZXh0ZW5kZWQgdG8gYWxsb3cgQXBhY2hlIHRvIGJlIG11bHRpLXByb3RvY29sLCBhbmQgYWxzbyB0byBhbGxvdyB0aGUKLSAgICAgY2FsbGluZyBvcmRlciB0byBiZSBzcGVjaWZpZWQgb24gYSBwZXItaG9vay9wZXItbW9kdWxlIGJhc2lzLgotICAgICBbQmVuIExhdXJpZV0KLQotICAqKSBJbXBsZW1lbnQgbXBtXyogbWV0aG9kcyBhcyAibW9kdWxlcyIuIEVhY2ggbWV0aG9kIGdldHMgaXRzIG93bgotICAgICBzdWJkaXIgaW4gc3JjL21vZHVsZXMgKGVnOiBzcmMvbW9kdWxlcy9wcmVmb3JrKS4gU2VsZWN0aW9uCi0gICAgIG9mIG1ldGhvZCB1c2VzIFJ1bGUgTVBNX01FVEhPRC4gIFtKaW0gSmFnaWVsc2tpXQotCi0gICopIFBvcnQgdGhlIGh5YnJpZCBzZXJ2ZXIgZnJvbSB0aGUgYXBhY2hlLWFwciByZXBvc2l0b3J5IGFzCi0gICAgIG1wbV9tcG10X3B0aHJlYWQuICBbTWFub2ogS2FzaWNoYWludWxhXQotCi0gICopIG9zL3VuaXgvdW5peGQuW2NoXTogZGV0YWNoLCBzZXR1aWQsIHNldGdpZCwgc3R1ZmYgd2hpY2ggd2lsbCBiZSBjb21tb24KLSAgICAgYW1vbmdzdCB0aGUgdW5peCBNUE1zLgotCi0gICopIG1wbV9wcmVmb3JrOiB0aHJvdyBhd2F5IGFsbCB0aGUgYWxhcm0vdGltZW91dCBjcnVkOyBhbmQgY2xlYW4gdXAgdGhlCi0gICAgIHNpZ25hbCBoYW5kbGluZyBmb3IgdGhlIG5ldyB3b3JsZCBvcmRlci4gIFtEZWFuIEdhdWRldF0KLQotICAqKSBDcnVkZSBhcF90aHJlYWRfbXV0ZXggYWJzdHJhY3Rpb24gc28gdGhhdCB3ZSBnZXQgdGhlIHB0aHJlYWQgc3R1ZmYgb3V0Ci0gICAgIG9mIGFsbG9jLmMgZm9yIG5vdy4gIFtEZWFuIEdhdWRldF0KLQotICAqKSBIYW5kbGUgcGFydGlhbCBsYXJnZSB3cml0ZXMgY29ycmVjdGx5LiAgW0JlbiBMYXVyaWVdCi0KLSAgKikgRWxpbWluYXRlIGNvbm5fcmVjJ3MgcG9pbnRlciB0byBzZXJ2ZXIuIEFsbCBpdCBrbm93cyBpcyB0aGUgYmFzZSBzZXJ2ZXIKLSAgICAgYmFzZWQgb24gSVAvcG9ydC4gIFtCZW4gTGF1cmllXQotCi0gICopIFBvcnQgYSBidW5jaCBvZiBtb2R1bGVzIHRvIHRoZSBuZXcgbW9kdWxlIHN0cnVjdHVyZS4KLSAgICAgWyJNaWNoYWVsIEguIFZvYXNlIiA8bXZvYXNlQG1pZGNvYXN0LmNvbS5hdT5dCi0KLSAgKikgSS9PIGxheWVyaW5nIGFuZCBCVUZGIHJldmFtcC4gIFNlZSBkb2NzL2J1ZmYudHh0LiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIEJhc2ljIHJlc3RydWN0dXJpbmcgdG8gaW50cm9kdWNlIHRoZSBNUE0gY29uY2VwdDsgaW5jbHVkZXMgdmFyaW91cwotICAgICBjaGFuZ2VzIHRvIHRoZSBtb2R1bGUgQVBJLi4uIGJldHRlciBkZXNjcmliZWQgYnkKLSAgICAgZG9jcy9pbml0aWFsX2JsdXJiLnR4dC4gIFtEZWFuIEdhdWRldF0KLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSBwdGhyZWFkcwotCi0gICopIE5ldyBidWZmIG9wdGlvbiBhZGRlZDogQk9fVElNRU9VVC4gSXQgZGVzY3JpYmVzIHRoZSB0aW1lb3V0IGZvcgotICAgICBidWZmIG9wZXJhdGlvbnMgKGdlbmVyYWxseSBvdmVyIGEgbmV0d29yaykuCi0gICAgIFtEZWFuIEdhdWRldCwgUnlhbiBCbG9vbSwgTWFub2ogS2FzaWNoYWludWxhXQotCi0gICopIENyZWF0ZWQgaHR0cF9hY2NlcHQgYWJzdHJhY3Rpb24uIEFkZGVkIDQgbmV3IGZ1bmN0aW9ucyAobm90IGV4cG9ydGVkKToKLSAgICAgaW5pdF9hY2NlcHQoKSwgYmVnaW5fYWNjZXB0aW5nX3JlcXVlc3RzKCksIGdldF9yZXF1ZXN0KCksIAotICAgICBzdG9wX2FjY2VwdGluZ19yZXF1ZXN0cygpIFtCaWxsIFN0b2RkYXJkXQotCi0gICopIEZpeCB0byBhcF9ycHJpbnRmIGNhbGwgdGhhdCBhbGxvd3MgbW9kX2luZm8gdG8gd29yayBwcm9wZXJseS4KLSAgICAgW0phbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1Pl0KLQotICAqKSB1c2VyIGFuZCBhcF9hdXRoX3R5cGUgZmllbGRzIHdlcmUgbW92ZWQgZnJvbSBjb25uZWN0aW9uX3JlYyB0byAKLSAgICAgcmVxdWVzdF9yZWMuIFtSeWFuIEJsb29tXSAKLQotICAqKSBSZW1vdmVkIHRoZSBhcF9ibG9ja19hbGFybXMgYW5kIGFwX3VuYmxvY2tfYWxhcm0gY2FsbHMuICBUaGVzZSBhcmVuJ3QKLSAgICAgbmVlZGVkIGluIGEgdGhyZWFkZWQgc2VydmVyLgotCi0gICopIEluaXRpYWwgcHRocmVhZCBpbXBsZW1lbnRhdGlvbiBmcm9tIGZyb20gRGVhbidzIGFwYWNoZS1uc3ByIGNvZGUuCi0gICAgIFtCaWxsIFN0b2RkYXJkLCBSeWFuIEJsb29tXQotCi0KLUNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zLjkKLQotICAqKSBSZW1vdmUgYm9ndXMgZXJyb3IgbWVzc2FnZSB3aGVuIGEgcmVkaXJlY3QgZG9lc24ndCBzZXQgTG9jYXRpb24uCi0gICAgIEluc3RlYWQsIHVzZSBhbiBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgY29yZWR1bXAgaWYgdGhlIGVycm9yIG1lc3NhZ2UKLSAgICAgd2FzIHN1cHBvc2VkIHRvIGluY2x1ZGUgYSBsb2NhdGlvbi4gIFtSb3kgRmllbGRpbmddCi0KLSAgKikgRG9uJ3QgYWxsb3cgY29uZmlndXJlIHRvIGluY2x1ZGUgbW9kX2F1dGhfZGlnZXN0IHVubGVzcyBpdCBpcwotICAgICBleHBsaWNpdGx5IHJlcXVlc3RlZCwgZXZlbiBpZiB0aGUgdXNlciBhc2tlZCBmb3IgYWxsIG1vZHVsZXMuCi0gICAgIFtSb3kgRmllbGRpbmddCi0KLSAgKikgVHJhbnNsYXRlIG1vZHVsZSBuYW1lcyB0byBkbGwgbmFtZXMgZm9yIE9TLzIgc28gdGhhdCB0aGV5IGFyZSBubyBtb3JlCi0gICAgIHRoYW4gOCBjaGFyYWN0ZXJzIGxvbmcgYW5kIGhhdmUgYW4gZXh0ZW5zaW9uIG9mICJkbGwiIGluc3RlYWQgb2YgInNvIi4KLSAgICAgW0JyaWFuIEhhdmFyZF0KLQotICAqKSBQcmludCBvdXQgcG9pbnRlciB0byBSdWxlIERFVl9SQU5ET00gd2hlbiB0cnVlcmFuZCBsaWIgbm90IGZvdW5kLgotICAgICBGaXggdGVzdC1jb21waWxlIGNoZWNrIHRvIGNoZWNrIGZvciByYW5kYnl0ZSBpbnN0ZWFkIG9mIHRyYW5kMzIuCi0gICAgIFVzZSBhcF9iYXNlNjRlbmNvZGVfYmluYXJ5L2RlY29kZSBpbnN0ZWFkIG9mIGNvcHkgaW4gbW9kX2F1dGhfZGlnZXN0LmMKLSAgICAgYW5kIHR3ZWFrIHRvIG1ha2UgQW1heWEgaGFwcGllci4gIFtSb25hbGQgVHNjaGFs5HJdCi0KLSAgKikgRW5zdXJlIHRoYXQgdGhlIGluc3RhbGxlZCBleHBhdCBpbmNsdWRlIGZpbGVzIGFyZSB3b3JsZCByZWFkYWJsZSwKLSAgICAganVzdCBsaWtlIHRoZSBvdGhlciBoZWFkZXIgZmlsZXMuICBbTWFydGluIEtyYWVtZXJdCi0KLSAgKikgRml4ZWQgZ2VuZXJhdGVkIEFkZE1vZHVsZSBhZGp1c3RtZW50cyBpbiBBUEFDSSdzIGBjb25maWd1cmUnIHNjcmlwdAotICAgICBpbiBvcmRlciB0byBhbGxvdyAobmV3KSBtb2R1bGVzIGxpa2UgbW9kX3Zob3N0X2FsaWFzIHRvIGJlIGhhbmRsZWQKLSAgICAgY29ycmVjdGx5ICh3aGljaCB3YXMgdG91Y2hlZCBieSB0aGUgYWRqdXN0bWVudHMgZm9yIG1vZF9hbGlhcykuCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIEZvciBiaW5hcnkgYnVpbGRzLCBhZGQgLVIgZmxhZyB0byBhcGFjaGVjdGwgdG8gd29yayBhcm91bmQgdGhlIGxhY2sgb2YKLSAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgLi9saWJleGVjIGRpcmVjdG9yeSB3aGVyZSB0aGUgbGliaHR0cC5lcCBmaWxlCi0gICAgIGlzIG5lZWRlZCBmb3IgU0hBUkVEX0NPUkUgYXJjaGl0ZWN0dXJlcy4gIFtSYW5keSBUZXJidXNoXQotCi0gICopIFdJTjMyOiBDcmVhdGUgdGhlIENHSSBzY3JpcHQgcHJvY2VzcyBhcyBERVRBQ0hFRC4gIFRoaXMgbWF5IHNvbHZlIHRoZQotICAgICBwcm9ibGVtIG9ic2VydmVkIGJ5IHNvbWUgV2luOTUvOTggdXNlcnMgd2hlcmUgdGhleSBnZXQgQ0dJIHNjcmlwdAotICAgICBvdXRwdXQgc2VudCB0byB0aGUgY29uc29sZS4gIFtCaWxsIFN0b2RkYXJkXQotCi0gICopIEZpeCAocmUpbmFtaW5nIGluIHRoZSB1dWVuY29kZS9kZWNvZGUgc2VjdGlvbi4gVGhlIGFwL2FwXwotICAgICByb3V0aW5lcyBhcmUgbm93IGNhbGxlZCBhcF9iYXNlNjQqIGFuZCBhcmUgJ3BsYWluJyAoaS5lLiwgbm8gCi0gICAgIHBvb2wgYWNjZXNzIG9yIGFueXRoaW5nIGNsZXZlcikuIEluc2lkZSB1dGlsLmMgdGhlIHJvdXRpbmVzIGFjdGluZwotICAgICBsaWtlIHBzdHJkdXAgYXJlIGNhbGxlZCBhcF9wYmFzZTY0ZW5jb2RlKCkgYW5kIGFwX3BiYXNlNjRkZWNvZGUoKS4KLSAgICAgVGhlIG9kZGx5IG5hbWVkIGFwX3V1ZW5jb2RlKCksIGFwX3V1ZGVjb2RlKCkgYXJlIGtlcHQgYXJvdW5kIGZvcgotICAgICBub3cgYnV0IGRlcHJlY2F0ZWQuICBbZGlya3hdCi0KLSAgKikgQ2xlYW4gdXAgdGhlIGJhc2U2NCBhbmQgU0hBMSBhZGRpdGlvbnMgYW5kIG1ha2Ugc3VyZSB0aGV5IGFyZQotICAgICByZXByZXNlbnRlZCBpbiB0aGUgQXBhY2hlQ29yZS5kZWYsIEFwYWNoZUNvcmVPUzIuZGVmLCBhbmQgaHR0cGQuZXhwCi0gICAgIGZpbGVzLiAgW1JveSBGaWVsZGluZ10KLQotICAqKSBXSU4zMjogTWlncmF0ZSB0byBJbnN0YWxsU2hpZWxkIDUuNSBhbmQgcHJvdmlkZSBhIGJpdCBtb3JlIGVycm9yCi0gICAgIGNoZWNraW5nLiAgQWxsb3cgY29tcGlsaW5nIG9uIFZTIDYuMC4gIFtSYW5keSBUZXJidXNoXQotCi0gICopIEZpeGVkIGFzc3VtcHRpb24gb2YgYWJzb2x1dGUgcGF0aHMgaW4gYmluYnVpbGQuc2guICBbVG9ueSBGaW5jaF0KLQotICAqKSBVc2UgVGVzdENvbXBpbGUgdG8gc2VhcmNoIGZvciB0aGUgdHJ1ZXJhbmQgbGlicmFyeSAocmF0aGVyIHRoYW4gYmxpbmRseQotICAgICBhc3N1bWluZyBpdHMgZXhpc3RlbmNlKS4gSWYgaXQgaXMgbm90IGZvdW5kLCBjb21wbGFpbiAoYnV0IGRvIG5vdAotICAgICBleGl0IC0geWV0KS4gIFtNYXJ0aW4gS3JhZW1lcl0KLQotICAqKSBXZSBmb3Jnb3QgdG8gYWRkIHRoZSBuZXcgZXhwb3J0ZWQgZnVuY3Rpb24gbmFtZXMgdG8KLSAgICAgc3JjL3N1cHBvcnQvaHR0cGQuZXhwLiAgW0JpbGwgU3RvZGRhcmQsIFJhbmR5IFRlcmJ1c2hdCi0KLSAgKikgQWRkIGRlc2NyaXB0aW9uIG9mIC1UIGNvbW1hbmQtbGluZSBvcHRpb24gdG8gdXNhZ2UoKS4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgRm9yICJzb21lIiBwbGF0Zm9ybXMgKG5vdGFibHksIEVCQ0RJQyBiYXNlZCBvbmVzKSwgbGlib3MgbmVlZHMgdG8gYmUKLSAgICAgc2VhcmNoZWQgb25seSBBRlRFUiBsaWJhcCBoYXMgYmVlbiBzZWFyY2hlZCwgYmVjYXVzZSBsaWJhcCBuZWVkcwotICAgICBzb21lIHN5bWJvbHMgZnJvbSBsaWJvcy4gIFtNYXJ0aW4gS3JhZW1lcl0KLQotICAqKSBGaXggY29uZmxpY3Qgd2l0aCBvcmlnaW5hbCBtb2RfZGlnZXN0IHJlbGF0ZWQgdG8gdGhlIHN5bWJvbCBvZiB0aGUKLSAgICAgbW9kdWxlIGRpc3BhdGNoIGxpc3QgKHdoaWNoIGhhcyB0byBiZSB1bmlxdWUgZm9yIERTTyBhbmQgZm9sbG93IHRoZQotICAgICB1c3VhbCBjb252ZW50aW9ucyBmb3IgdGhlIGluc3RhbGxhdGlvbiBwcm9jZWR1cmUpLgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBBZGQgYSBkYm0tbGlicmFyeSBjaGVjayBmb3IgdGhlICJ1c3VhbCBwbGFjZXMiICgtbGRibSwgLWxuZGJtLCAtbGRiKQotICAgICBmb3Igb3RoZXIgcGxhdGZvcm1zIGFzIHdlbGwuICBbTWFydGluIEtyYWVtZXJdCi0KLSAgKikgTWFrZSBhcF9zaGExLmMgY29tcGlsZSBmb3IgRUJDRElDIHBsYXRmb3JtczogcmVwbGFjZSByZW1haW5pbmcgTE9ORwotICAgICB0eXBlcyBieSBBUF9MT05HIGFuZCByZXBsYWNlIHJlZmVyZW5jZSB0byByZW5hbWVkIHZhcmlhYmxlICd1YnVmJwotICAgICBieSAnYnVmZmVyJy4gIFtNYXJ0aW4gS3JhZW1lcl0KLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjMuOCBbbm90IHJlbGVhc2VkXQotCi0gICopIEZsdXNoIHRoZSBvdXRwdXQgYnVmZmVyIGltbWVkaWF0ZWx5IGFmdGVyIHNlbmRpbmcgYW4gZXJyb3Igb3IgcmVkaXJlY3QKLSAgICAgcmVzcG9uc2UsIHNpbmNlIHRoZSByZXN1bHQgbWF5IGJlIG5lZWRlZCBieSB0aGUgY2xpZW50IHRvIGFib3J0IGEKLSAgICAgbG9uZyBkYXRhIHRyYW5zZmVyIG9yIHJlc3RhcnQgYSBzZXJpZXMgb2YgcGlwZWxpbmVkIHJlcXVlc3RzLgotICAgICBbVG9tIFZhdWdoYW4gPHR2YXVnaGFuQGF2ZW50YWlsLmNvbT4sIFJveSBGaWVsZGluZ10KLQotICAqKSBQT1JUOiBJbXByb3ZlZCBjb21waWxhdGlvbiBhbmQgRFNPIHN1cHBvcnQgb24gU2VxdWVudCBEWU5JWC9wdHguCi0gICAgIFtJYW4gVHVybmVyIDxpYW50QHNlcXVlbnQuY29tPl0gUFIjNDczNQotCi0gICopIExvY2FsIHN0cnVjdCBtbWFwIGluIGh0dHBfY29yZS5jIGNvbmZsaWN0ZWQgd2l0aCBzeXN0ZW0gc3RydWN0dXJlCi0gICAgIG5hbWUgb24gRFlOSVggLS0gY2hhbmdlZCB0byBtbWFwX3JlYy4gIFtSb3kgRmllbGRpbmddIFBSIzQ3MzUKLQotICAqKSBBZGRlZCB1cGRhdGVkIG1vZF9kaWdlc3QgYXMgbW9kdWxlcy9leHBlcmltZW50YWwvbW9kX2F1dGhfZGlnZXN0LgotICAgICBbUm9uYWxkIFRzY2hhbORyIDxyb25hbGRAaW5ub3ZhdGlvbi5jaD5dCi0KLSAgKikgRml4IGEgbWVtb3J5IGxlYWsgd2hlcmUgdGhlIG1vZHVsZSBjb3VudHMgd2VyZSBnZXR0aW5nIG1lc3NlZAotICAgICB1cCBhY3Jvc3MgcmVzdGFydHMuICBbRGF2aWQgSGFycmlzIDxkaGFycmlzQGRyaC5uZXQ+XQotCi0gICopIENJRFIgYWRkcmVzc2VzIHN1Y2ggYXMgYS5iLmMuZC8yNCB3aGVyZSBkICE9IDAgd2VyZW4ndCBoYW5kbGVkCi0gICAgIHByb3Blcmx5IGluIG1vZF9hY2Nlc3MuCi0gICAgIFsiUGF1bCBKLiBSZWRlciIgPHJlZGVycGpAcmFsZWlnaC5pYm0uY29tPl0gUFIjNDc3MAotCi0gICopIFJld3JpdGVMb2NrL1Jld3JpdGVNYXAgZGlkbid0IHdvcmsgcHJvcGVybHkgd2l0aCB2aXJ0dWFsIGhvc3RzLgotICAgICBbRG1pdHJ5IEtocnVzdGFsZXYgPGRpbWFAYm9nLm1zdS5zdT5dIFBSIzM4NzQKLQotICAqKSBQT1JUOiBTdXBwb3J0IGZvciBjb21wYXEvdGFuZGVtL2NvbS4KLSAgICAgW01pY2hhZWwgT3R0YXRpIDxtaWNoYWVsLm90dGF0aUBjb21wYXEuY29tPiwgZGlya3hdCi0KLSAgKikgQWRkZWQgU0hBMSBwYXNzd29yZCBlbmNyeXB0aW9uIHN1cHBvcnQgdG8gZWFzeSBtaWdyYXRpb24gZnJvbSAKLSAgICAgTmV0c2NhcGUgc2VydmVycy4gU2VlIHN1cHBvcnQvU0hBMSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgQ2F1c2VkIHRoZSBzZXBhcmF0aW9uIG9mIGFwX21kNS5jIGludG8gbWQ1LCBzaGExIGFuZCBhIGdlbmVyYWwKLSAgICAgYXBfY2hlY2twYXNzLmMgd2l0aCBqdXN0IGEgdmFsaWRhdGVfcGFzc3dkIHJvdXRpbmUuIEFkZGVkIGEKLSAgICAgY291cGxlIG9mIGZsYWdzIHRvIHN1cHBvcnQvaHRwYXNzd2QuIFNvbWUgcmV1c2Ugb2YgdGhlIHRvNjQoKQotICAgICBmdW5jdGlvbjsgaGVuY2UgcmVuYW1lZCB0byBhcF90bzY0KCkuCi0gICAgIFtEaXJrLVdpbGxlbSB2YW4gR3VsaWssIENsaW50b24gV29uZyA8Y2xpbnRkd0BuZXRjb20uY29tPl0KLQotICAqKSBDaGFuZ2UgZm9yIEVCQ0RJQyBwbGF0Zm9ybXMgKFRQRiBhbmQgQlMyMDAwKSB0byBjb3JyZWN0bHkgZGVhbAotICAgICB3aXRoIEFTQ0lJL0VCQ0RJQyBjb252ZXJzaW9ucyBpbiAiaWRlbnQiIHF1ZXJ5LgotICAgICBbRGF2aWQgTWNDcmVlZHkgPE1jQ3JlZWR5QHVzLmlibS5jb20+XQotCi0gICopIEdldCByaWQgb2YgcmVkZWZpbml0aW9uIHdhcm5pbmcgb24gTUFDX09TX1hfU0VSVkVSIHBsYXRmb3JtLgotICAgICBDaGFuZ2UgIlBvd2VyIE1hY2ludG9zaCIgdG8gUG93ZXIqIHNvIGlmIHVuYW1lIHByaW50cyAiUG93ZXIgQm9vayIKLSAgICAgd2UncmUgc3RpbGwgaGFwcHkgb24gUmhhcHNvZHkgcGxhdGZvcm1zLiAgW1dpbGZyZWRvIFNhbmNoZXpdCi0KLSAgKikgRml4IFNJR1NFR1Ygb24gc29tZSBzeXN0ZW1zIGJlY2F1c2UgdGhlIFZhcnkgZml4IGJlbG93IGluY2x1ZGVkCi0gICAgIGEgY2FsbCB0byB0YWJsZV9kbyB3aXRoIGEgdmFyaWFibGUgYXJndW1lbnQgbGlzdCB0aGF0IHdhcyBub3QKLSAgICAgTlVMTCB0ZXJtaW5hdGVkLiAgUmVwbGFjZWQgd2l0aCBiZXR0ZXIgaW1wbGVtZW50YXRpb24uIFtSb3kgRmllbGRpbmddCi0KLUNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zLjcgW25vdCByZWxlYXNlZF0KLQotICAqKSBUaGUgIlZhcnkiIHJlc3BvbnNlIGhlYWRlciBmaWVsZCBpcyBub3cgc2FuaXRpc2VkIHJpZ2h0IGJlZm9yZQotICAgICB0aGUgaGVhZGVyIGlzIHNlbnQgYmFjayB0byB0aGUgY2xpZW50LiAgTXVsdGlwbGUgIlZhcnkiIGZpZWxkcwotICAgICBhcmUgY29tYmluZWQsIGFuZCBkdXBsaWNhdGUgdG9rZW5zIChlLmcuLCAiVmFyeTogaG9zdCwgaG9zdCIgb3IKLSAgICAgIlZhcnk6IGhvc3QsIG5lZ290aWF0ZSwgaG9zdCwgYWNjZXB0LWxhbmd1YWdlIikgYXJlIHJlZHVjZWQgdG8KLSAgICAgc2luZ2xlIGluc3RhbmNlcy4gIFRoaXMgaXMgYSBiZXR0ZXIgc29sdXRpb24gdGhhbiB0aGUgZm9yY2Utbm8tdmFyeQotICAgICBvbmUgKHdoaWNoIGlzIHN0aWxsIHZhbGlkIGZvciBjbGllbnRzIHRoYXQgY2FuJ3QgY29wZSB3aXRoIFZhcnkKLSAgICAgYXQgYWxsKS4gIFBSIzMxMTggW0RlYW4gR2F1ZGV0LCBSb3kgRmllbGRpbmcsIEtlbiBDb2FyXQotCi0gICopIFBvcnRhYmlsaXR5IGNoYW5nZXMgZm9yIEJlT1MuIFtEYXZpZCBSZWlkIGFiYjM3QGRpYWwucGlwZXguY29tXQotCi0gICopIExpbmsgRFNPJ3Mgd2l0aCAiZ2NjIC1zaGFyZWQiIGluc3RlYWQgb2YgImxkIC1Cc2hhcmVhYmxlIiBhdCAKLSAgICAgbGVhc3Qgb24gTGludXggYW5kIEZyZWVCU0QgZm9yIG5vdy4gIAotICAgICBbUmFzbXVzIExlcmRvcmZdCi0KLSAgKikgV2luMzI6IE1vcmUgYXBhY2hlIC1rIHJlc3RhcnQgd29yay4gUmVzdGFydHMgYXJlIG5vdyBob25vcmVkCi0gICAgIGltbWVkaWF0ZWx5IGFuZCBjb25uZWN0aW9ucyBpbiB0aGUgbGlzdGVuIHF1ZXVlIGFyZSAtbm90LSBsb3N0LgotICAgICBUaGlzIGlzIG1hZGUgcG9zc2libGUgYnkgdGhlIHVzZSBvZiB0aGUgV1NBRHVwbGljYXRlU29ja2V0KCkKLSAgICAgY2FsbC4gIFRoZSBsaXN0ZW5lcnMgYXJlIG9wZW5lZCBpbiB0aGUgcGFyZW50LCBkdXBsaWNhdGVkLCB0aGVuCi0gICAgIHRoZSBkdXBsaWNhdGVzIGFyZSBwYXNzZWQgdG8gdGhlIGNoaWxkLiBUaGUgb3JpZ2luYWwgbGlzdGVuIHNvY2tldHMgCi0gICAgIGFyZSBub3QgY2xvc2VkIGJ5IHRoZSBwYXJlbnQgYWNyb3NzIGEgcmVzdGFydCwgdGh1cyB0aGUgbGlzdGVuIHF1ZXVlIAotICAgICBpcyBwcmVzZXJ2ZWQuCi0gICAgIFtCaWxsIFN0b2RkYXJkIDxzdG9kZGFyZEByYWxlaWdoLmlibS5jb20+XQotCi0gICopIEZpeCBoYW5kbGluZyBvZiBjYXNlIHdoZW4gYSBjbGllbnQgaGFzIHNlbnQgIkV4cGVjdDogMTAwLWNvbnRpbnVlIgotICAgICBhbmQgd2UgYXJlIGdvaW5nIHRvIHJlc3BvbmQgd2l0aCBhbiBlcnJvciwgYnV0IGdldCBzdHVjayB3YWl0aW5nIHRvCi0gICAgIGRpc2NhcmQgdGhlIGJvZHkgaW4gdGhlIHBvaW50bGVzcyBob3BlIG9mIHByZXNlcnZpbmcgdGhlIGNvbm5lY3Rpb24uCi0gICAgIFtSb3kgRmllbGRpbmcsIEpvZSBPcnRvbiA8amVvMTAxQHlvcmsuYWMudWs+XSBQUiM0NDk5LCBQUiMzODA2Ci0KLSAgKikgRml4ICdjb25maWd1cmUnIHRvIHdvcmsgY29ycmVjdGx5IHdpdGggU3lzVi1iYXNlZCB2ZXJzaW9ucyBvZgotICAgICAndHInIChjb25zaXN0ZW50IHdpdGggQ29uZmlndXJlJ3MgdXNlIGFzIHdlbGwpLiBbSmltIEphZ2llbHNraV0KLQotICAqKSBhcHhzOiBBZGQgIi1TIHZhcj12YWwiIG9wdGlvbiB3aGljaCBhbGxvd3MgZm9yIG92ZXJyaWRlIG9mIENGR18qCi0gICAgIGJ1aWx0LWluIHZhbHVlcy4gQWRkICItZSIgb3B0aW9uIHdoaWNoIHdvcmtzIGxpa2UgLWkgYnV0IGRvZXNuJ3QKLSAgICAgaW5zdGFsbCB0aGUgRFNPOyB1c2VmdWwgZm9yIGVkaXRpbmcgaHR0cGQuY29uZiB3aXRoIGFweHMuIEZpeAotICAgICBlZGl0aW5nIGNvZGUgc28gdGhhdCBtdWx0aXBsZSBpbnZvY2F0aW9ucyBvZiBhcHhzIC1hIHdpbGwgbm90Ci0gICAgIGNyZWF0ZSBkdXBsaWNhdGUgTG9hZE1vZHVsZS9BZGRNb2R1bGUgZW50cmllczsgYXB4cyBjYW4gbm93IGJlCi0gICAgIHVzZWQgdG8gcmUtIGVuYWJsZS9kaXNhYmxlIGEgbW9kdWxlLiAgW1dpbGZyZWRvIFNhbmNoZXpdCi0KLSAgKikgV2luMzI6IFVwZGF0ZSB0aGUgc2VydmVyIHRvIHVzZSBXaW5zb2NrIDIuIFNwZWNpZmljYWxseSwgbGluayB3aXRoCi0gICAgIHdzMl8zMi5saWIgcmF0aGVyIHRoYW4gd3NvY2szMi5saWIuICBUaGlzIGdpdmVzIHVzIGFjY2VzcyB0byAKLSAgICAgV1NBRHVwbGNhdGVTb2NrZXQoKSBpbiBhZGRpdGlvbiB0byBzb21lIG90aGVyIGVuaGFuY2VkIGNvbW0gQVBJcy4KLSAgICAgV2luIDk1IHVzZXJzIG1heSBuZWVkIHRvIHVwZGF0ZSB0aGVpciBUQ1AvSVAgc3RhY2sgdG8gcGljayB1cAotICAgICBXaW5zb2NrIDIuIChTZWUgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3dpbmRvd3M5NS9kb3dubG9hZHMvKQotICAgICBbQmlsbCBTdG9kZGFyZCBzdG9kZGFyZEByYWxlaWdoLmlibS5jb21dCi0KLSAgKikgV2luMzI6IFJlZGlyZWN0IENHSSBzY3JpcHQgc3RkZXJyIChzY3JpcHQgZGVidWcgaW5mbykgaW50byB0aGUgCi0gICAgIGVycm9yLmxvZyB3aGVuIENHSSBzY3JpcHRzIGZhaWwuIFRoaXMgbWFrZXMgQXBhY2hlIG9uIFdpbjMyIAotICAgICBiZWhhdmUgbW9yZSBsaWtlIFVuaXguICAgICAgCi0gICAgIFtCaWxsIFN0b2RkYXJkIHN0b2RkYXJkQHJhbGVpZ2guaWJtLmNvbV0KLQotICAqKSBGaXhlZCBgaHR0cGQnIHVzYWdlIGRpc3BsYXk6IC1EIHdhcyBtaXNzaW5nLgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjNDYxNAotCi0gICopIEZpeCBgbWFrZSByJyB0ZXN0IHByb2NlZHVyZSBpbiBzcmMvcmVnZXgvOiBhcF9pc3ByaW50IHdhcyBub3QgZm91bmQuCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiM0NTYxLCBQUiM0NTYyCi0KLSAgKikgT1MvMjogRml4IHByb2JsZW0gd2l0aCBhY2NlcHQgbG9jayBzZW1hcGhvcmVzIHdoZXJlIHNlcnZlciB3b3VsZCBkaWUgd2l0aAotICAgICAiT1MyU0VNOiBFcnJvciAxMDUgZ2V0dGluZyBhY2NlcHQgbG9jay4gRXhpdGluZyEiIAotICAgICBbQnJpYW4gSGF2YXJkXSBQUiM0NTA1Ci0KLSAgKikgQWRkIERTTyBzdXBwb3J0IGZvciBER1VYIDQueCB1c2luZyBnY2MuIFRlc3RlZCBvbiB4ODYgcGxhdGZvcm1zLgotICAgICBbUmFuZHkgVGVyYnVzaCA8cmFuZHlAY292YWxlbnQubmV0Pl0KLSAKLSAgKikgQWRkIHRoZSBuZXcgbWFzcy12aG9zdCBtb2R1bGUgKG1vZF92aG9zdF9hbGlhcy5jKSBkZXZlbG9wZWQgYW5kCi0gICAgIHVzZWQgYnkgRGVtb24gSW50ZXJuZXQsIEx0ZC4gW1RvbnkgRmluY2ggPGZhbmZAZGVtb24ubmV0Pl0KLQotICAqKSBCZXR0ZXIgR0NDIGRldGVjdGlvbiBmb3IgRFNPIGZsYWdzIHVuZGVyIFNvbGFyaXMgMiB3aGVyZSB0aGUgYGNjJyAKLSAgICAgY29tbWFuZCBwb3RlbnRpYWxseSBfaXNfIEdDQy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgRml4IGFweHMgYnVpbGQgaXNzdWVzIG9uIEFJWCAKLSAgICAgW1Jhc211cyBMZXJkb3JmIDxyYXNtdXNAcmFsZWlnaC5pYm0uY29tPl0KLQotICAqKSBEb2N1bWVudFJvb3QgQ2hlY2tpbmc6IFVuZGVyIHByZXZpb3VzIHZlcnNpb25zLCB3aGVuIEFwYWNoZQotICAgICBmaXJzdCBzdGFydGVkIHVwLCBpdCB1c2VkIHRvIGRvIGEgc3RhdCBvZiBlYWNoIERvY3VtZW50Um9vdCB0bwotICAgICBzZWUgaWYgaXQgZXhpc3RlZCBhbmQgd2FzIGEgZGlyZWN0b3J5LiBJZiBub3QsIHRoZW4gYW4gZXJyb3IKLSAgICAgbWVzc2FnZSB3YXMgcHJpbnRlZC4gVEhJUyBIQVMgQkVFTiBESVNBQkxFRC4gSWYgRG9jdW1lbnRSb290Ci0gICAgIGRvZXMgbm90IGV4aXN0LCB5b3Ugd2lsbCBnZXQgZXJyb3IgbWVzc2FnZXMgaW4gZXJyb3JfbG9nLiBJZgotICAgICB0aGUgJy10JyBjb21tYW5kIGxpbmUgb3B0aW9uIGlzIHVzZWQgKHRvIGNoZWNrIHRoZSBjb25maWd1cmF0aW9uKQotICAgICB0aGUgY2hlY2sgb2YgRG9jdW1lbnRSb290IElTIHBlcmZvcm1lZC4gQW4gYWRkaXRpb25hbCBjb21tYW5kCi0gICAgIGxpbmUgb3B0aW9uLCAnLVQnLCBoYXMgYmVlbiBhZGRlZCBpZiB5b3Ugd2FudCB0byBhdm9pZCB0aGUKLSAgICAgRG9jdW1lbnRSb290IGNoZWNrIGV2ZW4gd2hlbiBjaGVja2luZyB0aGUgY29uZmlndXJhdGlvbi4KLSAgICAgW0ppbSBKYWdpZWxza2ldCi0KLSAgKikgV2luMzI6IFRoZSBxdWVyeSBzd2l0Y2ggImFwYWNoZSAtUyIgZGlkbid0IGV4aXQgYWZ0ZXIgc2hvd2luZyB0aGUKLSAgICAgdmhvc3Qgc2V0dGluZ3MuIFRoYXQgd2FzIGluY29uc2lzdGVudCB3aXRoIHRoZSBvdGhlciBxdWVyeSBmdW5jdGlvbnMuCi0gICAgIFtCaWxsIFN0b2RkYXJkIC0gRml4ZWQgYnkgTWFydGluIG9uIFVuaXggaW4gMS4zLjRdCi0KLSAgKikgV2luMzI6IENoYW5nZWQgYmVoYXZpb3VyIG9mIGFwYWNoZSAtayByZXN0YXJ0LiAKLSAgICAgUHJldmlvdXNseSwgdGhlIHNlcnZlciB3b3VsZCBkcmFpbiBhbGwgY29ubmVjdGlvbnMgaW4gdGhlIHN0YWNrJ3MKLSAgICAgbGlzdGVuIHF1ZXVlIGJlZm9yZSBob25vcmluZyB0aGUgcmVzdGFydC4gT24gYSBidXN5IHNlcnZlciwgdGhpcwotICAgICBjb3VsZCB0YWtlIGhvdXJzLiAgTm93LCBhIHJlc3RhcnQgaXMgaG9ub3JlZCBhbG1vc3QgaW1tZWRpYXRlbHkuIAotICAgICBBbGwgY29ubmVjdGlvbnMgaW4gQXBhY2hlJ3MgcXVldWVzIGFyZSBoYW5kbGVkIGJ1dCBjb25uZWN0aW9ucyBpbiAKLSAgICAgdGhlIHN0YWNrJ3MgbGlzdGVuIHF1ZXVlIGFyZSBkaXNjYXJkZWQuIFJlc3RhcnQgdHJpZ2dlcmVkIGJ5IAotICAgICBNYXhSZXF1ZXN0UGVyQ2hpbGQgaXMgdW5jaGFuZ2VkLgotICAgICBbQmlsbCBTdG9kZGFyZCA8c3RvZGRhcmRAcmFsZWlnaC5pYm0uY29tPl0KLQotICAqKSBXaW4zMjogRWxpbWluYXRlZCB1bm5lY2Vzc2FyeSBjYWxsIHRvIHdhaXRfZm9yX211bHRpcGxlX29iamVjdHMgaW4KLSAgICAgdGhlIGFjY2VwdCBsb29wLiBHb29kIGZvciBhIDUlIHBlcmZvcm1hbmNlIGJvb3N0LiBDbGVhbmVkIHVwIAotICAgICBwYXJlbnQvY2hpbGQgcHJvY2VzcyBtYW5hZ2VtZW50IGNvZGUuIAotICAgICBbQmlsbCBTdG9kZGFyZCA8c3RvZGRhcmRAcmFsZWlnaC5pYm0uY29tPl0KLQotICAqKSBBZGRlZCBjZWlsaW5nIG9uIGZpbGUgc2l6ZSBmb3IgbWVtb3J5IG1hcHBlZCBmaWxlcy4KLSAgICAgW0pvaG4gR2lhbm5hbmRyZWEgPGpnQG1lZXIubmV0Pl0gUFIjNDEyMgotCi0gICopIEZpeCBuZGJtLmggaW5jbHVkZSBwcm9ibGVtcyB3aXRoIGJyYWluLWRlYWQgZ2xpYmMgPj0gMi4xIHdoaWNoIAotICAgICBoYXMgbmRibS5oIGluIGEgbm9uLXN0YW5kYXJkIGRiMS8gc3ViZGlyLiBQUiM0NDMxLCBQUiM0NTI4Ci0gICAgIFtIZW5yaSBHb21leiA8Z29tZXpAc2xpYi5mcj4sIFJhbGYgUy4gRW5nZWxzY2hhbGxdIAotCi0gICopIERldGVybWluZSBBUF9CWVRFX09SREVSIGZvciBhcF9jb25maWdfYXV0by5oIGFuZCBhbHJlYWR5Ci0gICAgIHVzZSB0aGlzIGF0IGxlYXN0IGZvciBFeHBhdC4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgQWxsb3cgLm1vZHVsZSBmaWxlcyB0byBzcGVjaWZ5IGxpYnJhcmllcyB3aXRoIExpYjouCi0gICAgIFtCZW4gTGF1cmllXQotCi0gICopIEFsbG93IFNldEVudklmW05vQ2FzZV0gdG8gdGVzdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgd2VsbAotICAgICBhcyBoZWFkZXIgZmllbGRzIGFuZCByZXF1ZXN0IGF0dHJpYnV0ZXMuICBbS2VuIENvYXJdCi0KLSAgKikgRml4IG1vZF9hdXRvaW5kZXgncyBoYW5kbGluZyBvZiBTY2FuSFRNTFRpdGxlcyB3aGVuIGZpbGUKLSAgICAgY29udGVudC10eXBlcyBhcmUgInRleHQvaHRtbDtwYXJhbWV0ZXJzIi4gIFBSIzQ1MjQgIFtLZW4gQ29hcl0KLQotICAqKSBSZW1vdmUgIm14YiIgc3VwcG9ydCBmcm9tIG1vZF9uZWdvdGlhdGlvbiAtLSBpdCB3YXMgYSBkcmFmdCBmZWF0dXJlCi0gICAgIG5ldmVyIGFjY2VwdGVkIGludG8gYW55IHN0YW5kYXJkLCBhbmQgaXQgb3BlbnMgdXAgY2VydGFpbiBEb1MKLSAgICAgYXR0YWNrcy4gIFtLb2VuIEhvbHRtYW4gPEtvZW4uSG9sdG1hbkBjZXJuLmNoPl0KLQotICAqKSBUZXN0Q29tcGlsZSB1cGRhdGVkLiBXZSBjYW4gbm93IHJ1biBwcm9ncmFtcyBhbmQgb3V0cHV0IHRoZQotICAgICByZXN1bHRzIGR1cmluZyB0aGUgQ29uZmlndXJlIHByb2Nlc3MuIFsgSmltIEphZ2llbHNraV0KLQotICAqKSBUaGUgc291cmNlIGlzIG5vdyBxdWFkIChsb25nIGxvbmcpIGF3YXJlIGFzIG5lZWRlZC4gU3BlY2lmaWNhbGx5LAotICAgICB0aGUgQ29uZmlndXJlIHByb2Nlc3MgZGV0ZXJtaW5lcyB0aGUgY29ycmVjdCBzaXplIG9mIG9mZl90IGFuZAotICAgICAqdm9pZC4gV2hlbiB0aGUgT1MvcGxhdGZvcm0vY29tcGlsZXIgc3VwcG9ydHMgcXVhZHMsIGFwX3NucHJpbnRmKCkKLSAgICAgcHJvdmlkZXMgZm9yIHRoZSAncScgZm9ybWF0IHF1YWxpZmllciAoaWYgcXVhZHMgYXJlIG5vdCBhdmFpbGFibGUsCi0gICAgICdxJyBpcyBzaWxlbnRseSAiZGVtb3RlZCIgdG8gbG9uZykuIFtKaW0gSmFnaWVsc2tpXQotCi0gICopIFdoZW4gdGhlIHVzZXJuYW1lIG9yIHBhc3N3b3JkIGZlZCB0byBodHBhc3N3ZCBpcyB0b28gbG9uZywgaW5jbHVkZSB0aGUKLSAgICAgc2l6ZSBsaW1pdCBpbiB0aGUgZXJyb3IgbWVzc2FnZS4gIEFsc28gcmVwb3J0IGlsbGVnYWwgY2hhcmFjdGVycwotICAgICAoY3VycmVudGx5IG9ubHkgJzonKSBpbiB0aGUgdXNlcm5hbWUuICBBZGQgdGhlIHNpemUgcmVzdHJpY3Rpb25zCi0gICAgIHRvIHRoZSBtYW4gcGFnZS4gIFtLZW4gQ29hcl0KLQotICAqKSBGaXhlZCB0aGUgY29uZmlndXJlIC0td2l0aG91dC1zdXBwb3J0IG9wdGlvbiBzbyBpdCBkb2Vzbid0IHJlc3VsdCBpbgotICAgICBhbiBpbmZpbml0ZSBsb29wLiAgW01hcmMgU2xlbWtvXQotCi0gICopIFBpcGVkIGVycm9yIGxvZ3MgY291bGQgY2F1c2UgYSBzZWdmYXVsdCBpZiBhbiBlcnJvciBvY2N1cmVkCi0gICAgIGR1cmluZyBjb25maWd1cmF0aW9uIGFmdGVyIGEgcmVzdGFydC4KLSAgICAgW0FpZGFuIEN1bGx5IDxhaWRhbkBwYW5peC5jb20+XSBQUiM0NDU2Ci0KLSAgKikgSWYgYSAiTG9jYXRpb24iIGZpZWxkIHdhcyBzdG9yZWQgaW4gci0+ZXJyX2hlYWRlcnNfb3V0IHJhdGhlcgotICAgICB0aGFuIHItPmhlYWRlcnNfb3V0LCByZWRpcmVjdCBwcm9jZXNzaW5nIHdvdWxkbid0IGZpbmQgaXQgYW5kCi0gICAgIHRoZSBzZXJ2ZXIgd291bGQgY29yZSBkdW1wIG9uIGFwX2VzY2FwZV9odG1sKE5VTEwpLiAgQ2hlY2sgYm90aAotICAgICB0YWJsZXMgYW5kIHJhaXNlIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SIHdpdGggYSBsb2cgbWVzc2FnZQotICAgICBpZiBMb2NhdGlvbiBpc24ndCBzZXQuICBbRG91ZyBNYWNFYWNoZXJuLCBLZW4gQ29hcl0KLQotICAqKSBBZGQgUlVMRV9FWFBBVCwgdGhlIHNyYy9saWIvIGRpcmVjdG9yeSBzdHJ1Y3R1cmUsIGFuZCBhIG1vZGlmaWVkIGNvcHkKLSAgICAgb2YgdGhlIEV4cGF0IDEuMC4yIGRpc3RyaWJ1dGlvbi4gW0dyZWcgU3RlaW5dCi0KLSAgKikgUmVwbGFjZSByZWdleGVjKCkgY2FsbHMgd2l0aCBjYWxscyB0byBhIG5ldyBBUEkgc3R1YiBmdW5jdGlvbgotICAgICBhcF9yZWdleGVjKCkuICBUaGlzIHNvbHZlcyBwcm9ibGVtcyB3aXRoIERTTyBtb2R1bGVzIHdoaWNoIHVzZSB0aGUgcmVnZXgKLSAgICAgbGlicmFyeS4gW0plbnMtVXdlIE1hZ2VyIDxqdW1AaGVsaW9zLmRlPiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBBZGQgJ1JlcXVlc3RfUHJvdG9jb2wnIHNwZWNpYWwga2V5d29yZCB0byBtb2Rfc2V0ZW52aWYgc28gdGhhdAotICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgY2FuIGJlIHNldCBhY2NvcmRpbmcgdG8gdGhlIHByb3RvY29sIHZlcnNpb24KLSAgICAgKGUuZy4sIEhUVFAvMC45IG9yIEhUVFAvMS4xKSBvZiB0aGUgcmVxdWVzdC4gIFtLZW4gQ29hcl0KLQotICAqKSBBZGQgRFNPIHN1cHBvcnQgZm9yIE9wZW5TdGVwIChNYWNoIDQuMikgcGxhdGZvcm0uCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBSZXggRGlldGVyIDxyZGlldGVyQG1hdGgudW5sLmVkdT5dIFBSIzM5OTcKLQotICAqKSBGaXggc2VkIHJlZ2V4IGZvciBnZW5lcmF0aW5nIGFwX2NvbmZpZ19hdXRvLmggaW4gc3JjL0NvbmZpZ3VyZS4KLSAgICAgW0phbiBHYWxsbyA8Z2FsbG9AcHZ0LnNrPl0gUFIjMzY5MCwgUFIjNDM3MwotIAotICAqKSBTd2l0Y2ggdG8gL2Jpbi9zaDUgaW4gQVBBQ0kgb24gVWx0cml4IGFuZCBmcmllbmRzIHRvIGF2b2lkIHByb2JsZW1zIHdpdGgKLSAgICAgdGhlaXIgYnJhaW4tZGVhZCAvYmluL3NoLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjNDM3MgotCi0gICopIEJldHRlciBEU08gZmxhZ3MgcmVjb2duaXRpb24gb24gTmV0QlNEIHBsYXRmb3JtcyB1c2luZyBFTEYuCi0gICAgIFtUb2RkIFZpZXJsaW5nIDx0dkBwb2JveC5jb20+XSBQUiM0MzEwCi0KLSAgKikgQWx3YXlzIGxvZyBtb250aHMgaW4gZW5nbGlzaCBmb3JtYXQgZm9yICV0IGluIG1vZF9sb2dfY29uZmlnLgotICAgICBbUGV0ciBMYW1wYSA8bGFtcGFAZmVlLnZ1dGJyLmN6Pl0gUFIjNDM2NiwgNjc5Ci0KLSAgKikgU3VwcG9ydCBmb3Igc2VydmVyLXBhcnNlZCBhbmQgbXVsdGl2aWV3LWRldGVybWluZWQgUmVhZG1lTmFtZSBhbmQKLSAgICAgSGVhZGVyTmFtZSBmaWxlcyBpbiBtb2RfYXV0b2luZGV4LiBSZW1vdmVkIHRoZSByZXN0cmljdGlvbiBvbgotICAgICAiLyJzIGluIFJlYWRtZU5hbWUgYW5kIEhlYWRlck5hbWUgZGlyZWN0aXZlcyBzaW5jZSB0aGUgKnN1Yl9yZXEqCi0gICAgIHJvdXRpbmVzIHdpbGwgZGVhbCB3aXRoIHRoZSBhY2Nlc3MgaXNzdWVzLiAoSXQncyBub3cgcG9zc2libGUgdG8KLSAgICAgaGF2ZSB7c2l0ZXxncm91cHxwcm9qZWN0fGN1c3RvbWVyfC4uLn0gd2lkZSByZWFkbWVzIGFuZCBoZWFkZXJzLikKLSAgICAgW1JheW1vbmQgUyBCcmFuZCA8cnNieEByc2J4Lm5ldD4sIEtlbiBDb2FyXSBQUiMxNTc0LCAzMDI2LCAzNTI5LAotICAgICAzNTY5LCA0MjU2Ci0KLSAgKikgV2hlbiBzdGF0KCkgZmFpbHMsIGRvbid0IGFzc3VtZSBhbnl0aGluZyBhYm91dCB0aGUgY29udGVudHMgb2YKLSAgICAgdGhlIHN0cnVjdCBzdGF0LiAgW0VkIEtvcnRob2YgPGVkQGJpdG1lY2hhbmljLmNvbT5dCi0KLSAgKikgSXQncyBPSyBmb3IgYSBzZW1vcCB0byByZXR1cm4gRUlOVFIsIGp1c3QgbG9vcCBhcm91bmQgYW5kIHRyeQotICAgICBhZ2Fpbi4gIFtEZWFuIEdhdWRldF0KLQotICAqKSBGaXggY29uZmlndXJhdGlvbiBlbmdpbmUgcmUtZW50cmFudCBoYW5ndXBzLCB3aGljaCBzb2x2ZSBhCi0gICAgIGhhbmRmdWwgb2YgcHJvYmxlbXMgc2VlbiB3aXRoIG1vZF9wZXJsIDxQZXJsPiBjb25maWd1cmF0aW9uIHNlY3Rpb25zCi0gICAgIFtTYWx2YWRvciBPcnRpeiBHYXJjaWEgPHNvZ0Btc2cuY29tLm14Pl0KLQotICAqKSBNYWMgT1MgYW5kIE1hYyBPUyBYIFNlcnZlciBub3cgdXNlIHRoZSBhcHByb3ByaWF0ZSBjdXN0b20gbGF5b3V0Ci0gICAgIGJ5IGRlZmF1bHQgd2hlbiBidWlsZGluZyB3aXRoIEFQQUNJOyBhbGxvdyBmb3IgcGxhdGZvcm0tc3BlY2lmaWMKLSAgICAgdmFyaWFibGUgZGVmYXVsdHMgaW4gY29uZmlndXJlLiBbV2lsZnJlZG8gU2FuY2hlel0KLQotICAqKSBEbyBzZXRnaWQoKSBiZWZvcmUgaW5pdGdyb3VwcygpIGluIGh0dHBfbWFpbjsgc29tZSBwbGF0Zm9ybXMKLSAgICAgemFwIHRoZSBncm91cGxpc3Qgd2hlbiBzZXRnaWQoKSBpcyBjYWxsZWQuICBUaGlzIHdhcyBmaXhlZCBpbgotICAgICBzdWV4ZWMgZWFybGllciwgYnV0IHRoZSBtYWluIGh0dHBkIGNvZGUgbWlzc2VkIHRoZSBjaGFuZ2UuCi0gICAgIFtSb2IgU2FjY29jY2lvIDxyb2JzQEluZmluaXRlVGVjaG5vbG9neS5jb20+XSAgUFIjMjU3OQotCi0gICopIEFkZCByZWNvZ25pdGlvbiBvZiAudGd6IGFzIGEgZ3ppcHBlZCB0YXJjaGl2ZS4KLSAgICAgW0JlcnRyYW5kIGRlIFNpbmdseSA8YmVydHJhbmQuZGUtc2luZ2x5QHBvbHl0ZWNobmlxdWUuZnI+XSAgUFIjMjM2NAotCi0gICopIG1vZF9pbmNsdWRlJ3MgZnNpemUvZmxhc3Rtb2Qgc2hvdWxkIGFsbG93IG9ubHkgcmVsYXRpdmUgcGF0aHMsIGp1c3QKLSAgICAgbGlrZSAiaW5jbHVkZSBmaWxlIi4gIFtKYXJvc2xhdiBCZW5rb3Zza3kgPGJlbmtvdnNrQHBoYS5wdnQuY3o+XQotCi0gICopIE9TLzI6IEFkZCBzdXBwb3J0IGZvciBidWlsZGluZyBsb2FkYWJsZSBtb2R1bGVzIHVzaW5nIERMTHMuCi0gICAgIFtCcmlhbiBIYXZhcmRdCi0KLSAgKikgQWRkIGljb25zZGlyLCBodGRvY3NkaXIsIGFuZCBjZ2lkaXIgdG8gY29uZmlnLmxheW91dC4KLSAgICAgW1dpbGZyZWRvIFNhbmNoZXpdCi0KLSAgKikgRml4IG1pbm9yIGJ1dCBhbm5veWluZyBidWcgd2l0aCB0aGUgdGVzdCBmb3IgQ29uZmlndXJhdGlvbi50bXBsCi0gICAgIGJlaW5nIG5ld2VyIHRoYW4gQ29uZmlndXJhdGlvbiBzbyB0aGF0IGl0IGlzIGxlc3MgbGlrZWx5IHRvIGZhaWwKLSAgICAgd2hlbiB1c2luZyBBUEFDSSBhbmQgc2hhZG93IHNvdXJjZXMuIFtXaWxmcmVkbyBTYW5jaGV6XQotCi0gICopIFBPUlQ6IEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIE1hYyBPUyAodmVyc2lvbnMgMTAuMCBhbmQKLSAgICAgZ3JlYXRlcikuIFVzZSBNYWMgT1MgWCBTZXJ2ZXIgbGF5b3V0IGZvciBub3cuIENsZWFuIHVwIGR5bGQgY29kZQotICAgICBpbiB1bml4L29zLmMsIGFuZCBkb24ndCBpbnN0YWxsIHRoZSBkeWxkIGVycm9yIGhhbmRsZXJzLCB3aGljaAotICAgICBhcmUgbm8gbG9uZ2VyIG5lZWRlZCBpbiBNYWMgT1MuIFtXaWxmcmVkbyBTYW5jaGV6XQotCi0gICopIFJlbmFtZSBSaGFwc29keSBsYXlvdXQgdG8gIk1hYyBPUyBYIFNlcnZlciIuIENoYW5nZSBpbnN0YWxsCi0gICAgIGxvY2F0aW9ucyB0byBhcHByb3ByaWF0ZSBvbmVzIGZvciB1c2VyLWJ1aWx0IChhcyBvcHBvc2VkIHRvCi0gICAgIHN5c3RlbSkgaW5zdGFsbHMuIFtXaWxmcmVkbyBTYW5jaGV6XQotCi0gICopIE1vZGlmeSBtb2RfYXV0b2luZGV4J3MgaGFuZGxpbmcgb2YgQWRkRGVzY3JpcHRpb24gc28gdGhhdCB0aGUKLSAgICAgYmVoYXZpb3VyIG1hdGNoZXMgdGhlIGRvY3VtZW50YXRpb24uICBbS2VuIENvYXJdIFBSIzE4OTgsIDMwNzIuCi0KLSAgKikgQWRkIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIGluc3RhbGwtYmluZGlzdC5zaCBzY3JpcHQgY3JlYXRlZCBieQotICAgICBiaW5idWlsZC5zaCB0byB1c2UgdGFyIHdoZW4gY29weWluZyBkaXN0cmlidXRpb24gZmlsZXMgdG8gdGhlCi0gICAgIHNlcnZlcnJvb3QuIFRoaXMgYWxsb3dzIHVwZ3JhZGluZyBhbiBleGlzdGluZyBpbnN0YWxsYXRpb24KLSAgICAgd2l0aG91dCBuZXN0aW5nIHRoZSBuZXcgZGlzdHJpYnV0aW9uIGluIHRoZSBvbGQuCi0KLSAgICAgaW5zdGFsbC1iaW5kaXN0LnNoIG5vdyBkZXRlY3RzIHRoZSBsb2NhbCBwZXJsNSBwYXRoIHRvIGluc3RhbGwKLSAgICAgYXB4cyBhbmQgZGJtbWFuYWdlIHdpdGggcHJvcGVyIHBhdGggdG8gcGVybCBpbnRlcnByZXRlci4KLQotICAgICBBZGQgYW4gaW5zdGFsbC1iaW5zdXBwb3J0IHRhcmdldCB3aGljaCBjb3BpZXMgdGhlIHNvdXJjZSBmaWxlcwotICAgICBmb3IgYXB4cyBhbmQgZGJtbWFuYWdlIHRvIGJpbmRpc3QgdG8gYWxsb3cgdGhlc2Ugc2NyaXB0cyB0bwotICAgICBiZSBwcm9wZXJseSBpbnN0YWxsZWQgcmVsYXRpdmUgdG8gdGhlIGRlc3RpbmF0aW9uIHNlcnZlcnJvb3QuCi0gICAgIFtSYW5keSBUZXJidXNoLCBDb3ZhbGVudCBUZWNobm9sb2dpZXMsIHJhbmR5QGNvdmFsZW50Lm5ldF0KLQotICAqKSBGaXggaW50ZXJtaXR0ZW50IFNFR1YgaW4gYXBfcHJveHlfY2FjaGVfZXJyb3IoKSBpbgotICAgICBzcmMvbW9kdWxlcy9wcm94eV91dGlsLmMgd2hlcmUgYSBOVUxMIGZpbGVwb2ludGVyIGFuZAotICAgICB0ZW1wb3JhcnkgZmlsZW5hbWUgd2VyZSBjbG9zZWQgYW5kIHVubGlua2VkLgotICAgICBbR3JhaGFtIExlZ2dldHQgPG1pbmZyaW5Ac2hhcnAuZm0+LAotICAgICBUaW0gQ29zdGVsbG8gPHRqY29zdGVsQHNvY3MudXRzLmVkdS5hdT5dIFBSIzMxNzgKLQotICAqKSBGaXggaW5jb25zaXN0ZW50IGVycm9yIG1lc3NhZ2VzIHJlcG9ydGVkIGJ5IG1vZF9wcm94eS4KLSAgICAgW0dyYWhhbSBMZWdnZXR0IDxtaW5mcmluQHNoYXJwLmZtPl0KLQotICAqKSBPUy8yOiBGaXggdGVybWluYXRpbmcgQ0dJcyB0aGF0IGFyZW4ndCBjb21waWxlZCBieSBFTVggR0NDIHdoZW4gYSAKLSAgICAgY29ubmVjdGlvbiBpcyBhYm9ydGVkLiAgW0JyaWFuIEhhdmFyZF0KLQotICAqKSBGb3JjZSB0aGUgTEFORyBlbnZhcmlhYmxlIHRvIHRoZSBrbm93biBzdGF0ZSBvZiAiQyIgc28gdGhhdCB3ZQotICAgICBoYXZlIGFzc3VyYW5jZSBhYm91dCBob3cgc3RyaW5nIG1hbmlwdWxhdG9ycyAoZS5nLiwgdHIpIHdpbGwKLSAgICAgZnVuY3Rpb24uICBbS2VuIENvYXJdICBQUiMxNjMwCi0KLSAgKikgQWRkIGEgZGlyZWN0aXZlIHRvIGFsbG93IGN1c3RvbWlzaW5nIG9mIHRoZSB0cmFja2luZyBjb29raWUgbmFtZS4KLSAgICAgW0tlbiBDb2FyXSAgUFIjMjkyMSwgNDMwMwotCi0gICopIEFkZCAiZm9yY2Utbm8tdmFyeSIgZW52YXJpYWJsZSB0byBhbGxvdyBzZXJ2ZXJzIHRvIHdvcmsgYXJvdW5kCi0gICAgIGNsaWVudHMgdGhhdCBjaG9rZSBvbiAiVmFyeSIgZmllbGRzIGluIHRoZSByZXNwb25zZSBoZWFkZXIuCi0gICAgIFtLZW4gQ29hciwgRG1pdHJ5IEtocnVzdGFsZXYgPGRpbWFAemlwcHkubWFjaGFvbi5ydT5dICBQUiM0MTE4Ci0KLSAgKikgRml4ZWQgYSBidWcgaW4gbW9kX2RpciB0aGF0IGNhdXNlcyBhIGNoaWxkIHByb2Nlc3Mgd2lsbCBpbmZpbml0ZWx5Ci0gICAgIHJlY3Vyc2Ugd2hlbiBpdCBhdHRlbXBzIHRvIGhhbmRsZSBhIHJlcXVlc3QgZm9yIGEgZGlyZWN0b3J5IHduZCB0aGUKLSAgICAgdmFsdWUgb2YgdGhlIERpcmVjdG9yeUluZGV4IGRpcmVjdGl2ZSBpcyBhIHNpbmdsZSBkb3QuIEFsc28gbGlrZWx5Ci0gICAgIHRvIGhhcHBlbiBmb3IgYW55b3RoZXIgdmFsdWVzIG9mIERpcmVjdG9yeUluZGV4IHRoYXQgd2lsbCBtYXAgYmFjawotICAgICB0byB0aGUgc2FtZSBkaXJlY3RvcnkuIFRoZSBoYW5kbGVyIG5vdyBvbmx5IGNvbnNpZGVycyByZWd1bGFyIGZpbGVzCi0gICAgIGFzIGJlaW5nIGluZGV4IGNhbmRpZGF0ZXMuIE5vIFBSI3MgZm91bmQuCi0gICAgIFtSYXltb25kIFMgQnJhbmQgPHJzYnhAcnNieC5uZXQ+XQotCi0gICopIEVhc2UgY29uZmlndXJhdGlvbiBkZWJ1Z2dpbmcgYnkgbWFraW5nIFRlc3RDb21waWxlIGZhbGwgYmFjayB0bwotICAgICB1c2luZyAibWFrZSIgaWYgdGhlICRNQUtFIHZhcmlhYmxlIGlzIHVuc2V0IFtNYXJ0aW4gS3JhZW1lcl0KLQotICAqKSBGaXhlZCB0aGUgU2VydmVyU2lnbmF0dXJlIGRpcmVjdGl2ZSB0byB3b3JrIGFzIGRvY3VtZW50ZWQuCi0gICAgIFtSYXltb25kIFMgQnJhbmQgPHJzYnhAcnNieC5uZXQ+XSBQUiM0MjQ4Ci0KLSAgKikgQWRkICJvcHQiIChTeXNWLXN0eWxlKSBsYXlvdXQgdG8gY29uZmlnLmxheW91dC4gW1JheW1vbmQgUyBCcmFuZAotICAgICA8cnNieEByc2J4Lm5ldD5dCi0KLSAgKikgQWRkIEFQQUNJIC0td2l0aG91dC1leGVjc3RyaXAgb3B0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGRpc2FibGUgdGhlCi0gICAgIHN0cmlwcGluZyBvZiBleGVjdXRhYmxlcyBvbiBpbnN0YWxsYXRpb24uICBUaGlzIGlzIHZlcnkgaW1wb3J0YW50IGZvciBEU08KLSAgICAgYW5kIGRlYnVnZ2luZyBzaXR1YXRpb25zLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBBZGQgc3VwcG9ydCBmb3IgT1MvMiAoY2FzZSBpbnNlbnN0aXZlIGZpbGVzeXN0ZW0sIC5leGUgc3VmZml4LCBldGMpCi0gICAgIHRvIEFQQUNJIGZpbGVzIGFuZCByZWxhdGVkIHNjcmlwdHMuIAotICAgICBbWWl0emNoYWsgU2NvdHQtVGhvZW5uZXMgPHN0aG9lbm5hQGVmbi5vcmc+LCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiM0MjY5Ci0KLSAgKikgQWRkIHN1cHBvcnQgZm9yIHN0YW5kYWxvbmUgbW9kZSBpbiBUUEYKLSAgICAgW0pvZSBNb2VuaWNoIDxtb2VuaWNoQHVzLmlibS5jb20+XQotCi0gICopIEZpeCBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGJ5IHJlYWRfY29ubmVjdGlvbigpIGluIHNyYy9zdXBwb3J0L2FiLmMKLSAgICAgW0ppbSBDb3ggPGpjQHN1cGVybGluay5uZXQ+XSBQUiM0MjcxCi0KLSAgKikgRml4IHNwZWNpYWwgUmV3cml0ZUNvbmQgIi1zIiBwYXR0ZXJuIG1hdGNoaW5nLgotICAgICBbQm9iIEZpbmNoIDxib2JAbmFzLmNvbT5dCi0KLSAgKikgRml4IHZhbHVlIHF1b3RpbmcgaW4gc3JjL0NvbmZpZ3VyZSBzY3JpcHQgZm9yIGFwX2NvbmZpZ19hdXRvLmggCi0gICAgIFtQYXVsIFN1dHRvbiA8cGF1bEBhd2UuY29tPl0KLQotICAqKSBNYWtlIHN1cmUgUmV3cml0ZUxvY2sgY2FuIGJlIHVzZWQgb25seSBpbiB0aGUgZ2xvYmFsIGNvbnRleHQsIChpLmUuCi0gICAgIG91dHNpZGUgb2YgYW55IDxWaXJ0dWFsSG9zdD4gc2VjdGlvbnMpIGJlY2F1c2UgaXQncyBhIGdsb2JhbCBmYWNpbGl0eSBvZgotICAgICB0aGUgcmV3cml0ZSBlbmdpbmUuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIEZpeCB0aGUgb3duZXJzaGlwIGRlbGVnYXRpb24gZm9yIHByb3h5IGRpcmVjdG9yeSB1bmRlciBgbWFrZSBpbnN0YWxsJy4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgQVBBQ0kgd291bGQgbm90IGNvcnJlY3RseSBidWlsZCBzdWV4ZWMuIFtNYXJpYSBWZXJpbmEKLSAgICAgPG1hcmlhdkBpY2dlYi50cmllc3RlLml0Pl0gUFIjNDI2MAotCi0gICopIG1vZF9taW1lX21hZ2ljIHBhc3NlZCBvbmx5IHRoZSBmaXJzdCA0ayBvZiBhIGZpbGUgdG8KLSAgICAgdW5jb21wcmVzcy9nemlwLCBidXQgdGhvc2UgdG9vbHMgc29tZXRpbWVzIGRvIG5vdCBwcm9kdWNlCi0gICAgIGFueSBvdXRwdXQgdW5sZXNzIGEgc3VmZmljaWVudCBwb3J0aW9uIG9mIHRoZSBjb21wcmVzc2VkCi0gICAgIGZpbGUgaXMgaW5wdXQuICBDaGFuZ2UgdG8gcGFzcyB0aGUgZW50aXJlIGZpbGUgLS0gYnV0Ci0gICAgIG9ubHkgcmVhZCA0ayBvZiBvdXRwdXQuCi0gICAgIFtNYXJjaW4gQ2llc2xhayA8c2FwZXJAc3lzdGVtLnBsPl0gUFIjNDA5NwotCi0gICopICJJbmRleE9wdGlvbnMgTm9uZSIgZ2VuZXJhdGVkIGV4dHJhIHNwYWNlcyBhdCB0aGUgZW5kIG9mIGVhY2gKLSAgICAgbGluZS4gIFtpbmtsaW5nQGZpcnN0bmV0aG91LmNvbV0gUFIjMzc3MAotCi0gICopIFRoZSAiMTAwIENvbnRpbnVlIiByZXNwb25zZSB3YXNuJ3QgYmVpbmcgc2VudCBhZnRlciBpbnRlcm5hbAotICAgICByZWRpcmVjdHMuIFtKb3NlIEtBSEFOIDxrYWhhbkB3My5vcmc+XSBQUiMzOTEwLCAzODA2LCAzNTc1Ci0KLSAgKikgV2hlbiBwYWRkaW5nIHRoZSBuYW1lIHdpdGggc3BhY2VzIGZvciBkaXNwbGF5LCBtb2RfYXV0b2luZGV4IHdvdWxkCi0gICAgIGNvdW50ICYsIDwsIGFuZCA+IGluIHRoZWlyIGVzY2FwZWQgd2lkdGgsIG1lc3NpbmcgdXAgdGhlIGRpc3BsYXkuCi0gICAgIFtEZWFuIEdhdWRldF0gUFIjNDA3NSwgMzc1OAotCi0gICopIFBPUlQ6IGZpeGVkIGEgY29tcGlsYXRpb24gcHJvYmxlbSBvbiBORVhULgotICAgICBbSmFjcXVlcyBEaXN0bGVyIDxkaXN0bGVyQGdvbGVtLnBoLnV0ZXhhcy5lZHU+XSBQUiM0MTMwCi0KLSAgKikgci0+cmVxdWVzdF90aW1lIHdhc24ndCBiZWluZyBzZXQgcHJvcGVybHkgaW4gY2VydGFpbiBlcnJvciBjb25kaXRpb25zLgotICAgICBbRGVhbiBHYXVkZXRdIFBSIzQxNTYKLQotICAqKSBQT1JUOiBkZWFsIHdpdGggVVRTIGNvbXBpbGVyIGVycm9yIGluIGh0dHBfcHJvdG9jb2wuYwotICAgICBbRGF2ZSBEeWtzdHJhIDxkd2RAYmVsbC1sYWJzLmNvbT5dIFBSIzQxODkKLQotICAqKSBBZGQgYXBfdnJwcmludGYoKSBmdW5jdGlvbi4gIFtKb2huIFRvYmV5IDxqdG9iZXlAYmFudGEtaW0uY29tPl0gUFIjNDI0NgotCi0gICopIEZpeCB0aGUgbW9kX21pbWUgaGFzaCB0YWJsZSB0byB3b3JrIHByb3Blcmx5IHdpdGggbG9jYWxlcyBvdGhlcgotICAgICB0aGFuIEMuICBbRGVhbiBHYXVkZXRdIFBSIzM0MjcKLQotICAqKSBGaXggYSBtZW1vcnkgbGVhayB3aGljaCBpcyBleGFjZXJiYXRlZCBieSBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zLgotICAgICBbRGVhbiBHYXVkZXRdIFBSIzQyMjUKLQotICAqKSBQcmV2ZW50IGNsb2JiZXJpbmcgc2F2ZWQgSUZTIHZhbHVlcyBpbiBBUEFDSS4gW0ppbSBKYWdpZWxza2ldCi0KLSAgKikgRml4IGJ1ZmZlciBvdmVyZmxvd3MgaW4gYXBfdXVlbmNvZGUgYW5kIGFwX3V1ZGVjb2RlIHBvaW50ZWQgb3V0Ci0gICAgIGJ5ICJQZXRlciAnTHVuYScgQWx0YmVyZyA8cGV0ZXJAYWx0YmVyZy5udT4iIGFuZCBQUiMzNDIyCi0gICAgIFtQZXRlciAnTHVuYScgQWx0YmVyZyA8cGV0ZXJAYWx0YmVyZy5udT4sIFJvbmFsZCBUc2NoYWzkcl0KLQotICAqKSBNYWtlIHtTZXQsVW5zZXQsUGFzc31FbnYgcGVyLWRpcmVjdG9yeSBpbnN0ZWFkIG9mIHBlci1zZXJ2ZXIuCi0gICAgIFtCZW4gTGF1cmllXQotCi0gICopIENvcnJlY3QgYW4gYXBwYXJlbnQgdHlwbzogb24gdGhlIFdpbmRvd3MgYW5kIE1QRSBwbGF0Zm9ybXMsIHRoZQotICAgICBodHBhc3N3ZCB1dGlsaXR5IHdhcyBsaW1pdGluZyBwYXNzd29yZHMgdG8gb25seSA4IGNoYXJhY3RlcnMuCi0gICAgIFtLZW4gQ29hcl0KLQotICAqKSBFQkNESUMgcGxhdGZvcm1zOiBEYXZpZCBzdWJtaXR0ZWQgcGF0Y2hlcyBmb3IgdHdvIGJ1Z3MgaW4gdGhlCi0gICAgIE1ENSBkaWdlc3QgcG9ydCBmb3IgRUJDRElDIG1hY2hpbmVzOgotICAgICBhKSB0aGUgaHRkaWdlc3QgdXRpbGl0eSBvdmVyd3JvdGUgdGhlIG9sZCBjb250ZW50cyBvZiB0aGUgZGlnZXN0IGZpbGUKLSAgICAgYikgdGhlIENvbnRlbnQtTUQ1IGhlYWRlciB2YWx1ZSAoQ29udGVudERpZ2VzdCBkaXJlY3RpdmUpIHdhcyB3cm9uZwotICAgICB3aGVuIHRoZSByZXR1cm5lZCBmaWxlIHdhcyBub3QgY29udmVydGVkIGZyb20gRUJDRElDLCBidXQgd2FzIGEKLSAgICAgYmluYXJ5IChlLmcuLCBpbWFnZSBmaWxlKSBpbiB0aGUgZmlyc3QgcGxhY2UuCi0gICAgIFtEYXZpZCBNY0NyZWVkeSA8bWNjcmVlZHlAdXMuaWJtLmNvbT5dCi0KLSAgKikgc3VwcG9ydC9odHBhc3N3ZCBub3cgcGVybWl0cyB0aGUgcGFzc3dvcmQgdG8gYmUgc3BlY2lmaWVkIG9uIHRoZQotICAgICBjb21tYW5kIGxpbmUgd2l0aCB0aGUgJy1iJyBzd2l0Y2guICBUaGlzIGlzIHVzZWZ1bCB3aGVuIHBhc3N3b3JkcwotICAgICBuZWVkIHRvIGJlIG1haW50YWluZWQgYnkgc2NyaXB0cyAtLSBwYXJ0aWN1bGFybHkgaW4gdGhlIFdpbjMyCi0gICAgIGVudmlyb25tZW50LiAgW0tlbiBDb2FyXQotCi0gICopIFdpbjMyOiBXaW4zMiBtdWx0aXBsZSBzZXJ2aWNlcyBwYXRjaC4gQWRkZWQgY2FwYWJpbGl0eSB0byBpbnN0YWxsIGFuZAotICAgICBydW4gbXVsdGlwbGUgY29waWVzIG9mIGFwYWNoZSBhcyBpbmRpdmlkdWFsIHNlcnZpY2VzLgotCi0gICAgIEV4YW1wbGUgMToKLSAgICAgYXBhY2hlIC1uIGFwYWNoZTEgLWkgLWYgYzovaHR0cGQuY29uZgotICAgICAgICBJbnN0YWxscyBhcGFjaGUgYXMgc2VydmljZSAnYXBhY2hlMScgYW5kIGFzc29jaWF0ZXMgYzovaHR0cGQuY29uZgotICAgICAgICB3aXRoIHRoYXQgc2VydmljZS4KLSAgICAgbmV0IHN0YXJ0IGFwYWNoZTEKLSAgICAgICAgU3RhcnRzIGFwYWNoZTEgc2VydmljZS4KLSAgICAgbmV0IHN0b3AgYXBhY2hlMQotICAgICAgICBTdG9wcyBhcGFjaGUxIHNlcnZpY2UKLQotICAgICBFeGFtcGxlIDI6Ci0gICAgIGFwYWNoZSAtbiBhcGFjaGUyIC1pCi0gICAgICAgIEluc3RhbGxzIGFwYWNoZSBhcyBzZXJ2aWNlICdhcGFjaGUyJy4gaHR0cGQuY29uZiBpcyBsb2NhdGVkIHVuZGVyCi0gICAgICAgIHRoZSBkZWZhdWx0IHNlcnZlciByb290ICgvYXBhY2hlL2NvbmYvaHR0cGQuY29uZikuCi0gICAgIG5ldCBzdGFydCBhcGFjaGUyCi0gICAgICAgIFN0YXJ0cyBhcGFjaGUyIHNlcnZpY2UuCi0KLSAgICAgRXhhbXBsZSAzOgotICAgICBhcGFjaGUgLW4gYXBhY2hlMyAtaSAtZCBjOi9wcm9ncmFtIGZpbGVzL2FwYWNoZQotICAgICAgICBJbnN0YWxsIGFwYWNoZSBhcyBzZXJ2aWNlICdhcGFjaGUzJyBhbmQgc2V0cyBzZXJ2ZXIgcm9vdCB0bwotICAgICAgICBjOi9wcm9ncmFtIGZpbGVzL2FwYWNoZS4KLQotICAgICBFeGFtcGxlIDQ6Ci0gICAgIGFwYWNoZSAtbiBhcGFjaGUyIC1rIHJlc3RhcnQKLSAgICAgICAgUmVzdGFydCBhcGFjaGUyIHNlcnZpY2UgCi0KLSAgICAgW0tlaXRoIFdhbm5hbWFrZXIsIEtlbiBQYXJ6eWduYXQsIEJpbGwgU3RvZGRhcmRdCi0KLSAgKikgQ29ycmVjdCB0aGUgc2lnbmVkL3Vuc2lnbmVkIGNoYXJhY3RlciBoYW5kbGluZyBmb3IgdGhlIE1ENSByb3V0aW5lczsKLSAgICAgbWlzbWF0Y2hlcyB3ZXJlIGNhdXNpbmcgY29tcGlsYXRpb24gcHJvYmxlbXMgd2l0aCBnY2MgLXBlZGFudGljIGFuZAotICAgICBpbiB0aGUgVFBGIGNyb3NzLWNvbXBpbGF0aW9uLiAgW0tlbiBDb2FyXQotCi0gICopIE9TLzI6IFJld29yayBDR0kgaGFuZGxpbmcgdG8gdXNlIHNwYXduKigpIGluc3RlYWQgb2YgZm9yay9leGVjLCBhY2hpZXZpbmcKLSAgICAgYSByb3VnaGx5IDUgZm9sZCBzcGVlZCB1cC4gW0JyaWFuIEhhdmFyZF0KLQotICAqKSBwcm94eSBmdHA6IGluc3RlYWQgb2YgdXNpbmcgdGhlIGhhcmR3aXJlZCBzdHJpbmcgInRleHQvcGxhaW4iIGFzCi0gICAgIGEgZmFsbGJhY2sgdHlwZSBmb3IgZmlsZXMgc2VydmVkIGJ5IHRoZSBmdHAgcHJveHksIHVzZSB0aGUKLSAgICAgYXBfZGVmYXVsdF90eXBlKCkgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSBjb25maWd1cmVkIHR5cGUuCi0gICAgIFRoaXMgYWxsb3dzIGZvciBzcGVjaWFsIGNvbmZpZ3VyYXRpb25zIGxpa2UKLSAgICAgICAgPERpcmVjdG9yeSBwcm94eTpmdHA6Ly9zb21lLmhvc3Q+Ci0gICAgICAgIERlZmF1bHRUeXBlIGdhcmdsZS9ibHVyYgotICAgICAgICA8L0RpcmVjdG9yeT4KLSAgICAgQWRkaXRpb25hbGx5LCBhZGQgdGhlIENvbnRlbnQtRW5jb2Rpbmc6IGhlYWRlciB0byBGVFAgcHJveHkgcmVwbGllcwotICAgICB3aGVuIHRoZSBlbmNvZGluZyBpcyBkZWZpbmVkIChieSB0aGUgQWRkRW5jb2RpbmcgZGlyZWN0aXZlKS4KLSAgICAgQmVjYXVzZSBpdCB3YXMgbWlzc2luZywgaXQgd2FzIGFsbW9zdCBpbXBvc3NpYmxlIHRvIGJyb3dzZSBjb21wcmVzc2VkCi0gICAgIGZpbGVzIHVzaW5nIHRoZSBGVFAgcHJveHkgKHdvcmtzIG5vdyBwZXJmZWN0bHkgaW4gQ29tbXVuaWNhdG9yKS4KLSAgICAgVGhlIGZ0cCBwcm94eSBub3cgYWxzbyByZXR1cm5zIHRoZSBEYXRlOiBhbmQgU2VydmVyOiBoZWFkZXIgbGluZXMgKGlmIG5vdAotICAgICBtdWNoIGVsc2UuLi4gVGhpcyBjb2RlIGlzICJzb21ld2hhdCIgYnJva2VuKSBsaWtlIG5vcm1hbCByZXF1ZXN0cyBkby4KLSAgICAgW01hcnRpbiBLcmFlbWVyXQotCi0gICopIEJlIG1vcmUgc21hcnQgaW4gQVBBQ0kncyBjb25maWd1cmUgc2NyaXB0IHdoZW4gZGV0ZXJtaW5pbmcgdGhlIFVJRC9HSUQKLSAgICAgZm9yIFVzZXIvR3JvdXAgZGlyZWN0aXZlcyBhbmQgdXNlIHRoZSBkZXRlcm1pbmVkIFVJRC9HSUQgdG8gaW5pdGlhbGl6ZQotICAgICB0aGUgcGVybWlzc2lvbnMgb24gdGhlIHByb3h5Y2FjaGVkaXIuCi0gICAgIFtEaXJrLVdpbGxlbSB2YW4gR3VsaWssIFJhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgQ2hhbmdlZCB0aGUgZm9ya2luZy1wcmlvci10by1jbGVhbnVwIGluIHRoZSBwcm94eSBtb2R1bGUgdG8gZmlyc3QKLSAgICAgY2hlY2sgd2V0aGVyIGl0IGFjdHVhbGx5IG5lZWRzIHRvIGNvbGxlY3QgZ2FyYmFnZS4gVGhpcyByZWR1Y2VzIAotICAgICB0aGUgbnVtYmVyIG9mIGZvcmsoKXMgZnJvbSBvbmUvcmVxdWVzdCB0byBqdXN0IHRoZSBvZGQgb25lIGFuIGhvdXIuCi0gICAgIFtEaXJrLVdpbGxlbSB2YW4gR3VsaWtdCi0KLSAgKikgQWRkZWQgcHJveHksIGF1dGggYW5kIGhlYWRlciBzdXBwb3J0IHRvIHNyYy9zdXBwb3J0L2FiLmMuIEFkZGVkIGEKLSAgICAgUkVBRE1FIGZpbGUgdG8gc3JjL3N1cHBvcnQvCi0gICAgIFtEaXJrLVdpbGxlbSB2YW4gR3VsaWtdCi0KLSAgKikgRG9uJ3QgaGFyZC1jb2RlIHRoZSBwYXRoIHRvIEFXSyBpbiAtLXNoYWRvdyBib290c3RyYXBwaW5nIE1ha2VmaWxlLgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjNDA1MAotCi0gICopIEFkZCBzdXBwb3J0IGZvciBEU08gbW9kdWxlIGNvbXBpbGF0aW9uIG9uIEJTRC9PUyAzLnguCi0gICAgIFtSYW5keSBUZXJidXNoLCBDb3ZhbGVudCBUZWNobm9sb2dpZXNdCi0KLSAgKikgRml4IHNlZC1zdWJzdGl0dXRpb25zIGluIGBtYWtlIGluc3RhbGwnOiBwYXRoIGVsZW1lbnRzIGxpa2UgYGh0dHBkL2NvbmYnCi0gICAgIChmb3IgaW5zdGFuY2UgZnJvbSBhbiBBUEFDSSBjb25maWd1cmUgLS1zeXNjb25mZGlyPS9ldGMvaHR0cGQvY29uZgotICAgICBvcHRpb24pIHdlcmUgc3Vic3RpdHV0ZWQgd2l0aCAkKFRBUkdFVCkuY29uZiwgZXRjLiBTYW1lIGZvciBvdGhlciBzdHJpbmdzCi0gICAgIHdpdGggZG90cyB3aGVyZSB0aGUgZG90IHdhc24ndCBtYXRjaGVkIGFzIHBsYWluIHRleHQuIAotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBQT1JUOiBBZGQgc3VwcG9ydCBmb3IgRnJlZUJTRCA0LnggW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgRml4IHZlcmJvc2Ugb3V0cHV0IG9mIEFQQUNJIGNvbmZpZ3VyZSAob3B0aW9uIC12KSAKLSAgICAgW01hcnRpbiBLcmFlbWVyLCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDEuMy42Ci0KLSAgKikgUmVtb3ZlZCBuZXcgUGFzc0FsbEVudiBjb2RlIGR1ZSB0byBEU08gcHJvYmxlbXMuIFtMYXJzIEVpbGVicmVjaHRdCi0KLUNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zLjUgW25vdCByZWxlYXNlZF0KLQotICAqKSBNX0lOVkFMSUQgbmVlZGVkIGEgdmFsdWUgd2l0aGluIHRoZSBzY29wZSBvZiBNRVRIT0RTIHNvIHRoYXQgdW5rbm93bgotICAgICBtZXRob2RzIGNhbiBiZSBhY2Nlc3MgY29udHJvbGxlZC4gIFtSb3kgRmllbGRpbmddIFBSIzM4MjEKLQotICAqKSBBZGRlZCBQYXNzQWxsRW52OyBtYWtlcyBzZXJ2ZXIncyBlbnRpcmUgZW52aXJvbm1lbnQgYXZhaWxhYmxlCi0gICAgIHRvIENHSXMgYW5kIFNTSXMgZXhlY3V0ZWQgd2l0aGluIGRpcmVjdGl2ZSdzIHNjb3BlLiAgW0tlbiBDb2FyXQotCi0gICopIGFwX3V1ZW5jb2RlKCkgYWx3YXlzIGFkZGVkIHR3byB0cmFpbGluZyAnPSdzIGFuZCBlbmNvZGluZyBvZgotICAgICA4IGJpdCBjaGFyYWN0ZXJzIG9uIGEgbWFjaGluZSB3aXRoIHNpZ25lZCBjaGFyIG1heSBwcm9kdWNlZAotICAgICBpbmNvcnJlY3QgcmVzdWx0cy4gQWRkaXRpb25hbGx5IGFwX3V1ZW5jb2RlKCkgc2hvdWxkIG5vdwotICAgICB3b3JrIGNvcnJlY3RseSBvbiBFQkNESUMgcGxhdGZvcm1zLgotICAgICBbUm9uYWxkIFRzY2hhbORyIDxyb25hbGRAaW5ub3ZhdGlvbi5jaD5dIFBSIzM0MTEKLQotICAqKSBXSU4zMjogQmluYXJ5IGluc3RhbGxlciBub3cgcnVucyB0aGUgY29uZmlndXJhdGlvbiBETEwgYmVmb3JlCi0gICAgIHRoZSByZWJvb3QgcHJvbXB0ICh3aGljaCBpcyBvbmx5IGdpdmVuIGlmIE1TVkNSVC5ETEwgc3lzdGVtCi0gICAgIERMTCBpcyBuZXcgb3IgdXBkYXRlZCkuIFRoaXMgc2hvdWxkIGF2b2lkIHRoZSBjb25maWd1cmF0aW9uCi0gICAgIGRpcmVjdG9yeSBiZWluZyBlbXB0eSBhZnRlciBpbnN0YWxsYXRpb24uIFtQYXVsIFN1dHRvbl0KLSAgICAgUFIjMzc2NywgMzgwMCwgMzgyNywgMzg1MCwgMzkwMCwgMzk1MywgMzk4OAotCi0gICopIFdJTjMyOiBCaW5hcnkgaW5zdGFsbGVyIG5vdyBjcmVhdGVzIFN0YXJ0IG1lbnUgb3B0aW9ucyB0byBzdGFydAotICAgICBhbmQgc3RvcCBBcGFjaGUgYXMgYSBjb25zb2xlIGFwcGxpY2F0aW9uIGFuZCB0byB1bmluc3RhbGwKLSAgICAgdGhlIEFwYWNoZSBzZXJ2aWNlIG9uIE5ULiBbUGF1bCBTdXR0b25dIFBSIzM3NDEKLQotICAqKSBXSU4zMjogQXBhY2hlLmV4ZSBub3cgY29udGFpbnMgYW4gaWNvbi4gW1BhdWwgU3V0dG9uXQotCi0gICopIFBPUlQ6IFN3aXRjaCBiYWNrIHRvIHVzaW5nIGZjbnRsKCkgbG9ja2luZyBvbiBMaW51eCAtLSBpbnN0YWJpbGl0aWVzCi0gICAgIGhhdmUgYmVlbiByZXBvcnRlZCB3aXRoIGZsb2NrKCkgbG9ja2luZyAocHJvYmFibHkgcmVsYXRlZCB0byBrZXJuZWwKLSAgICAgdmVyc2lvbikuICBbRGVhbiBHYXVkZXRdIFBSIzI3MjMsIDM1MzEKLQotICAqKSBVc2luZyBBUEFDSSwgdGhlIG1haW4gY29uZmlnIGZpbGUgKHVzdWFsbHkgaHR0cGQuY29uZikgd2FzCi0gICAgIG5vdCBiZWluZyBhZGp1c3RlZCBhcyAkKFRBUkdFVCkuY29uZi4gW1dpbGZyZWRvIFNhbmNoZXoKLSAgICAgPHdzYW5jaGV6QGFwcGxlLmNvbT5dCi0KLSAgKikgUE9SVDogQUlYIGRvZXMgbm90IHJlcXVpcmUgdGhlIFNIQVJFRF9DT0RFICJoYWNrIgotICAgICBbUnlhbiBCbG9vbSA8cmJiQHJhbGVpZ2guaWJtLmNvbT5dCi0KLSAgKikgU2V0LUNvb2tpZSBoZWFkZXJzIHdlcmUgYmVpbmcgZG91YmxlZCB1cCBmb3Igc29tZSBDR0lzIGJ5IHRoZSBPKG5eMikKLSAgICAgYXZvaWRhbmNlIGNvZGUgYWRkZWQgaW4gMS4zLjMuCi0gICAgIFtEZWFuIEdhdWRldCwgSmVmZiBMZXdpcyA8bGV3aXNAc3RhbmZvcmQuZWR1Pl0gUFIjMzg3MgotCi0gICopIGFwX2lzeGRpZ2l0IHdhcyBzb21laG93IG5lZ2xlY3RlZCB3aGVuIGFkZGluZyB0aGUgYXBfaXNmb28oKSBtYWNyb3MKLSAgICAgZm9yIDgtYml0IHNhZmVuZXNzLiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIFBPUlQ6IFVzZSAtZlBJQyBpbnN0ZWFkIG9mIC1mcGljIG9uIFNvbGFyaXMgYW5kIFN1bk9TIGZvciBjb21waWxpbmcgRFNPcwotICAgICBiZWNhdXNlIFNQQVJDcyBoYXZlIGEgc21hbGwgbWFjaGluZS1zcGVjaWZpYyBtYXhpbXVtIHNpemUgZm9yIHRoZSBHbG9iYWwKLSAgICAgT2Zmc2V0IFRhYmxlIHdoaWNoIGlzIG9mdGVuIGV4Y2VlZGVkIHdoZW4gY29tcGlsaW5nIG9uZSBvZiB0aGUgbGFyZ2VyCi0gICAgIHRoaXJkLXBhcnR5IG1vZHVsZXMgd2l0aCBBcGFjaGUuIFtQZXRlciBVcmJhbiA8UGV0ZXIuVXJiYW5AZXBmbC5jaD5dIFBSIzM5NzcKLQotICAqKSBNb3ZlIHRoZSBkaXJlY3RpdmUgYEV4dGVuZGVkU3RhdHVzJyBpbiBodHRwZC5jb25mLWRpc3Qtd2luIF9hZnRlcl8gdGhlCi0gICAgIERTTy9ETEwgc2VjdGlvbiBiZWNhdXNlIGl0J3MgYSBkaXJlY3RpdmUgZnJvbSBtb2Rfc3RhdHVzIGFuZCBpc24ndAotICAgICBhdmFpbGFibGUgYmVmb3JlIHRoZSBETEwgb2YgbW9kX3N0YXR1cyBpcyBsb2FkZWQuCi0gICAgIFtNYXJ0aW4gUE9FU0NITCA8bXBvZXNjaGxAZ214Lm5ldD5dIFBSIzM5MzYKLQotICAqKSBTRUNVUklUWTogRml4IGEgYnVnIGluIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgYnVmZmVyIHNpemUgZm9yIHRoZSBsaW5lIAotICAgICBjb250aW51YXRpb24gZmFjaWxpdHkgaW4gQXBhY2hlJ3MgY29uZmlndXJhdGlvbiBmaWxlcyB3aGljaCBjb3VsZCAKLSAgICAgbGVhZCB0byBhIGJ1ZmZlciBvdmVyZmxvdyBzaXR1YXRpb24uCi0gICAgIFtUaG9tYXMgRGV2YW5uZWF1eCA8VGhvbWFzLkRldmFubmVhdXhAZW5zdC5mcj5dIFBSIzM2MTcKLQotICAqKSBNYWtlIGRvY3VtZW50YXRpb24gYW5kIGVycm9yIG1lc3NhZ2VzIG9mIEFQQUNJJ3MgLS1hY3RpdmF0ZS1tb2R1bGU9RklMRSAKLSAgICAgb3B0aW9uIG1vcmUgY2xlYXIuIFtKYW4gV29sdGVyIDxqYW5jQHd3bmV0Lm5ldD5dIFBSIzM5OTUKLQotICAqKSBGaXggdGhlIGdjYyB2ZXJzaW9uIGNoZWNrIChmb3IgZW5hYmxpbmcgdGhlIGBpbmxpbmUnIGZhY2lsaXR5KSB0byAKLSAgICAgcmVhbGx5IHN1cHBvcnQgYWxsIGZ1dHVyZSBnY2MgdmVyc2lvbnMgPj0gMi43IHVudGlsIHdlIGtub3cgbW9yZS4KLSAgICAgW0pvaG4gVG9iZXkgPGp0b2JleUBiYW50YS1pbS5jb20+XSBQUiMzOTgzCi0KLSAgKikgTGV0IEFQQUNJJ3MgY29uZmlndXJlIHNjcmlwdCBjb3JyZWN0bHkgY29tcGxhaW4gZm9yIHVua25vd24gLS1lbmFibGUtWFhYCi0gICAgIGFuZCAtLWRpc2FibGUtWFhYIG9wdGlvbnMuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMzOTU4Ci0KLSAgKikgTGluayB0aGUgc2hhcmVkIGNvcmUgYm9vdHN0cmFwIHByb2dyYW0gKGBgUnVsZSBTSEFSRURfQ09SRT15ZXMnJykgYWxzbwotICAgICBhZ2FpbnN0IGxpYmFwLmEgYW5kIHVzZSBpdHMgYXBfc25wcmludGYoKSBpbnN0ZWFkIG9mIHNwcmludGYoKSB0byBhdm9pZAotICAgICBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3dzLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBSZW1vdmUgbm8gbG9uZ2VyIHVzZWQgbm9uLUFQSSBmdW5jdGlvbiBhcF9zaW5nbGVfbW9kdWxlX2luaXQoKS4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgQWRkIEFwcGxlJ3MgTWFjIE9TIFggU2VydmVyIExheW91dCAiUmhhcHNvZHkiIHRvIGNvbmZpZy5sYXlvdXQuCi0gICAgIFtXaWxmcmVkbyBTYW5jaGV6XQotCi0gICopIEFkZCBjZ2lkaXIsIGh0ZG9jc2RpciwgaWNvbnNkaXIgdmFyaWFibGVzIHRvIE1ha2VmaWxlLnRtcGwgaW4gb3JkZXIKLSAgICAgdG8gbWFrZSBwbGF0Zm9ybSBpbnN0YWxsYXRpb25zIGVhc2llci4gIFtXaWxmcmVkbyBTYW5jaGV6XQotCi0gICopIEluIGNvbmZpZ3VyZSwgZG8gbm90IGFwcGVuZCB0aGUgdGFyZ2V0IG5hbWUgdG8gdGhlIGRpcmVjdG9yeSBwYXRoIGlmCi0gICAgIHRoZSBwYXRoIGFscmVhZHkgY29udGFpbnMgImFwYWNoZSIuICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBTSUdQSVBFIGlzIG5vdyBpZ25vcmVkIGJ5IHRoZSBzZXJ2ZXIgY29yZS4gIFRoZSByZXF1ZXN0IHdyaXRlIHJvdXRpbmVzCi0gICAgIChhcF9ycHV0YywgYXBfcnB1dHMsIGFwX3J2cHV0cywgYXBfcndyaXRlLCBhcF9ycHJpbnRmLCBhcF9yZmx1c2gpIG5vdwotICAgICBjb3JyZWN0bHkgY2hlY2sgZm9yIG91dHB1dCBlcnJvcnMgYW5kIG1hcmsgdGhlIGNvbm5lY3Rpb24gYXMgYWJvcnRlZC4KLSAgICAgUmVwbGFjZWQgbWFueSBkaXJlY3QgKHVuY2hlY2tlZCkgY2FsbHMgdG8gYXBfYiogcm91dGluZXMgd2l0aCB0aGUKLSAgICAgYW5hbG9nb3VzIGFwX3IqIGNhbGxzLiAgW1JveSBGaWVsZGluZ10KLQotICAqKSBFbmhhbmNlZCBtb2RfcmV3cml0ZSdzIG1hcGZpbGUgaGFuZGxpbmc6IFRoZSBpbi1jb3JlIGNhY2hlIGZvciB0ZXh0IGFuZAotICAgICBEQk0gZm9ybWF0IG1hcGZpbGVzIG5vdyB1c2VzIGEgNC13YXkgaGFzaCB0YWJsZSB3aXRoIExSVSBmdW5jdGlvbmFsaXR5LgotICAgICBGdXJ0aGVybW9yZSBtYXAgbG9va3VwcyBmb3Igbm9uLWV4aXN0ZW50IGtleXMgYXJlIG5vdyBjYWNoZWQgYXMgd2VsbC4KLSAgICAgQWRkaXRpb25hbGx5ICJ0eHQiIG1hcHMgYXJlIG5vdyBwYXJzZWQgd2l0aCBzaW1wbGUgc3RyaW5nIGZ1bmN0aW9ucwotICAgICBpbnN0ZWFkIG9mIHVzaW5nIGFwX3ByZWdjb21wKCkuIEFzIGEgc2lkZSBlZmZlY3QgYSBidWcgdGhhdCBwcmV2ZW50ZWQKLSAgICAgdGhlIHVzYWdlIG9mIGtleXMgY29udGFpbmluZyB0aGUgIiwiIGNoYXJhY3RlciB3YXMgZml4ZWQuCi0gICAgIFRoZSBjaGFuZ2VzIGRyYXN0aWNhbGx5IGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIHdoZW4gbGFyZ2UgcmV3cml0ZSBtYXBzCi0gICAgIGFyZSBpbiB1c2UuCi0gICAgIFtNaWNoYWVsIHZhbiBFbHN0IDxtbGVsc3R2QHNlcnBlbnMuc3diLmRlPiwgTGFycyBFaWxlYnJlY2h0XSBQUiMzMTYwCi0KLSAgKikgQWRkZWQgYXBfc3ViX3JlcV9tZXRob2RfdXJpKCkgZm9yIGRvaW5nIGEgc3VicmVxdWVzdCB3aXRoIGEgbWV0aG9kCi0gICAgIG90aGVyIHRoYW4gR0VULCBhbmQgY29uc3QnZCB0aGUgZGVmaW5pdGlvbiBvZiBtZXRob2QgaW4gcmVxdWVzdF9yZWMuCi0gICAgIFtHcmVnIFN0ZWluXQotCi0gICopIFVzZSBwcm9wZXIgcGlkX3QgdHlwZSBmb3Igc2F2aW5nIFBJRHMgaW4gYWxsb2MuYy4gIFtKb2huIEJsZXldCi0KLSAgKikgUmVwbGFjZWQgdXNlIG9mIFdJTjMyIGRlZmluZSB3aXRoIEhBVkVfRFJJVkVfTEVUVEVSUyB0byBpbmRpY2F0ZQotICAgICB3aGVuIHRoZSBPUyBhbGxvd3MgYSBET1MgZHJpdmUgbGV0dGVyIHdpdGhpbiBwYXRobmFtZXMuICBbQnJpYW4gSGF2YXJkXQotCi0gICopIEFkZCAlViB0byBtb2RfbG9nX2NvbmZpZywgdGhpcyBsb2dzIHRoZSBob3N0bmFtZSBhY2NvcmRpbmcgdG8gdGhlCi0gICAgIFVzZUNhbm9uaWNhbE5hbWUgc2V0dGluZyAodGhpcyBpcyB0aGUgcHJlLTEuMy40IGJlaGF2aW91ciBvZgotICAgICAldikuICBVc2VmdWwgZm9yIG1hc3Mgdmhvc3RpbmcuICBbVG9ueSBGaW5jaCA8ZG90QGRvdGF0LmF0Pl0KLQotICAqKSBBZGQgc3VwcG9ydCBmb3IgXG4gYW5kIFx0IHRvIG1vZF9sb2dfY29uZmlnLCBjYW4gYmUgdXNlZCB0byBwcm9kdWNlCi0gICAgIG1vcmUgcmVsaWFibGUgbG9ncyB3aXRoIG11bHRpbGluZSBlbnRyaWVzLiAgW1RvbnkgRmluY2ggPGRvdEBkb3RhdC5hdD5dCi0KLSAgKikgRml4ZWQgYSBmZXcgY29tcGlsZXIgbml0cy4gIFtKb2huIEJsZXkgPGpiYjZAYWNwdWIuZHVrZS5lZHU+XQotCi0gICopIEFkZGVkIGluZm9ybWF0aXZlIGVycm9yIG1lc3NhZ2VzIGZvciBmYWlsZWQgbXVubWFwKCkgYW5kIGZzZWVrKCkgY2FsbHMKLSAgICAgaW4gaHR0cF9jb3JlLmMuIFtKb2huIEJsZXksIFJveSBGaWVsZGluZ10KLQotICAqKSBBZGRlZCBzb21lIGluZm9ybWF0aXZlIGVycm9yIG1lc3NhZ2VzIGZvciBzb21lIGZhaWxlZCBtYWxsb2MoKQotICAgICBjYWxscy4gW0pvaG4gQmxleSA8amJiNkBhY3B1Yi5kdWtlLmVkdT4sIEppbSBKYWdpZWxza2ldCi0KLSAgKikgT1MvMiBhcF9vc19jYW5vbmljYWxfZmlsZW5hbWUoKSdzIGJlaGF2aW91ciBpcyBpbXByb3ZlZDogYXBfYXNzZXJ0KCkKLSAgICAgaXMgcmVtb3ZlZC4gVGhpcyBhbGxvd3MgPERpcmVjdG9yeSBwcm94eToqPiBkaXJlY3RpdmVzIHRvIHdvcmsgYW5kCi0gICAgIHByZXZlbnRzIGludmFsaWQgcmVxdWVzdHMgZnJvbSBraWxsaW5nIHRoZSBwcm9jZXNzLgotICAgICBbQnJpYW4gSGF2YXJkIDxicmlhbmhAa2hlbGRhci5hcGFuYS5vcmcuYXU+XQotCi0gICopIFJlb3JnYW5pc2VkIEZBUSBkb2N1bWVudC4KLSAgICAgW0pvc2h1YSBTbGl2ZSA8c2xpdmVAZmluYW5jZS5jb21tZXJjZS51YmMuY2E+XSBQUiMyNDk3Ci0KLSAgKikgc3JjL3N1cHBvcnQvOiBUaGUgQXBhY2hlQmVuY2ggYmVuY2htYXJrIHByb2dyYW0gd2FzIG92ZXJoYXVsZWQgYnkKLSAgICAgRGF2aWQgTi4gV2VsdG9uOiB5b3UgY2FuIG5vdyBoYXZlIGl0IGdlbmVyYXRlIGFuIEhUTUwgVEFCTEUsIHByZXN1bWFibHkKLSAgICAgZm9yIGludGVncmF0aW9uIGludG8gb3RoZXIgSFRNTCBzb3VyY2VzLiBEYXZpZCB1cGRhdGVkIHRoZSBhYiBtYW4gcGFnZQotICAgICBhcyB3ZWxsIGFuZCBhZGRlZCBzb21lIG1pc3NpbmcgZGVzY3JpcHRpb25zLiBUaGFua3MhCi0gICAgIFtEYXZpZCBOLiBXZWx0b24gPGRhdmlkd0Bwcm9zYS5pdD5dCi0KLSAgKikgV2luMzI6IFRoZSBmaWxlbmFtZSB2YWxpZGl0eSBjaGVja2VyIG5vdyBhbGxvd3MgZmlsZW5hbWVzIGNvbnRhaW5pbmcKLSAgICAgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgMHg4MCB0byAweGZmIChmb3IgZXhhbXBsZSBhY2NlbnRlZCBjaGFyYWN0ZXJzKS4KLSAgICAgW1BhdWwgU3V0dG9uXSBQUiMzODkwCi0KLSAgKikgQWRkZWQgY29uZGl0aW9uYWwgbG9nZ2luZyBiYXNlZCB1cG9uIGVudmlyb25tZW50IHZhcmlhYmxlcyB0bwotICAgICBtb2RfbG9nX2NvbmZpZy4gIG1vZF9sb2dfcmVmZXJlciBhbmQgbW9kX2xvZ19hZ2VudAotICAgICBhcmUgbm93IGRlcHJlY2F0ZWQuICBbS2VuIENvYXJdCi0KLSAgKikgQWxsb3cgYXBhY2hlIGFjdGluZyBhcyBhIHByb3h5IHNlcnZlciB0byByZWxheSB0aGUgcmVhbAotICAgICByZWFzb24gb2YgYSBmYWlsdXJlIHRvIGEgY2xpZW50IHJhdGhlciB0aGFuIHRoZSAiaW50ZXJuYWwKLSAgICAgc2VydmVyIGVycm9yIiBpdCBkb2VzIGN1cnJlbnRseS4gVGhlIGdlbmVyYWwgZXhwb3N1cmUgbWVjaGFuaXNtCi0gICAgIGNhbiBiZSB0cmlnZ2VyZWQgYnkgYW55IG1vZHVsZSBieSBzZXR0aW5nIHRoZSAidmVyYm9zZS1lcnJvci10byIKLSAgICAgbm90ZSB0byAiKiI7IHRoaXMgYWxsb3dzIG1vcmUgdGhhbiBqdXN0IHByb3h5IGVycm9ycyB0byBiZSBleHBvc2VkLgotICAgICBbQ2xpZmYgU2tvbG5pY2ssIFJveSBGaWVsZGluZywgTWFydGluIEtyYWVtZXJdIFJlbGF0ZWQgdG8gUFIjMzQ1NSwgNDA4NgotCi0gICopIE1vdmVkIG1hbiBwYWdlcyBmb3IgYWIgYW5kIGFwYWNoZWN0cmwgdG8gc2VjdGlvbiA4LgotICAgICBbV2lsZnJlZG8gU2FuY2hleiwgUm95IEZpZWxkaW5nXQotCi0gICopIEFkZGVkIC1TIG9wdGlvbiB0byBpbnN0YWxsLnNoIHNvIHRoYXQgb3B0aW9ucyBjYW4gYmUgcGFzc2VkIHRvCi0gICAgIHN0cmlwIG9uIHNvbWUgcGxhdGZvcm1zLiBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgV2lsZnJlZG8gU2FuY2hlel0KLQotICAqKSBUd2VhayBtb2R1bGVzIE1ha2VmaWxlIGdlbmVyYXRlZCBieSBDb25maWd1cmUgc28gdGhhdCBpdCBoYW5kbGVzCi0gICAgIHRoZSB0ZXN0IGNhc2Ugb2Ygbm8gbW9kdWxlcyBiZWluZyBzZWxlY3RlZC4gW2NoYXpAcmVsaWFudC5jb21dCi0KLSAgKikgQWRkZWQgYSA8TGltaXRFeGNlcHQgbWV0aG9kIC4uLj4gc2VjdGlvbmluZyBkaXJlY3RpdmUgdGhhdCBhbGxvd3MKLSAgICAgdGhlIHVzZXIgdG8gYXNzaWduIGF1dGhlbnRpY2F0aW9uIGNvbnRyb2wgdG8gYW55IEhUVFAgbWV0aG9kIHRoYXQKLSAgICAgaXMgKm5vdCogZ2l2ZW4gaW4gdGhlIGFyZ3VtZW50IGxpc3Q7IGkuZS4sIHRoZSBsb2dpY2FsIG5lZ2F0aW9uCi0gICAgIG9mIHRoZSA8TGltaXQ+IGRpcmVjdGl2ZS4gIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgY29udHJvbGxpbmcKLSAgICAgYWNjZXNzIG9uIG1ldGhvZHMgdW5rbm93biB0byB0aGUgQXBhY2hlIGNvcmUsIGJ1dCBwZXJoYXBzIGtub3duIGJ5Ci0gICAgIHNvbWUgbW9kdWxlIG9yIENHSSBzY3JpcHQuIFtSb3kgRmllbGRpbmcsIFRvbnkgRmluY2hdCi0KLSAgKikgUHJldmVudCBhcGFjaGVjdGwgZnJvbSBjb21wbGFpbmluZyBpZiB0aGUgUElERklMRSBleGlzdHMgYnV0Ci0gICAgIGRvZXMgbm90IGNvbnRhaW4gYSBwcm9jZXNzIGlkLCBhcyBtaWdodCBvY2N1ciBpZiB0aGUgc2VydmVyIGlzCi0gICAgIGJlaW5nIHJhcGlkbHkgcmVzdGFydGVkLiBbV2lsZnJlZG8gU2FuY2hlel0KLQotICAqKSBXaW4zMjogQWRkIGdsb2JhbCBzeW1ib2xzIG1pc3NpbmcgZnJvbSBBcGFjaGVDb3JlLmRlZi4gW0NhcmwgT2xzZW5dCi0KLSAgKikgRW50aXR5IHRhZyBjb21wYXJpc29ucyBmb3IgSWYtTWF0Y2ggYW5kIElmLU5vbmUtTWF0Y2ggd2VyZSBub3QgYmVpbmcKLSAgICAgcGVyZm9ybWVkIGNvcnJlY3RseSAtLSB3ZWFrIHRhZ3MgbWlnaHQgY2F1c2UgZmFsc2UgcG9zaXRpdmVzLiAgQWxzbywKLSAgICAgc3Ryb25nIGNvbXBhcmlzb24gd2Fzbid0IHByb3Blcmx5IGVuZm9yY2VkIGluIGFsbCBjYXNlcy4KLSAgICAgW1JveSBGaWVsZGluZywgS2VuIENvYXIsIERlYW4gR2F1ZGV0XSBQUiMyMDY1LCAzNjU3Ci0KLSAgKikgT1MvMjogU3VwcGx5IE9TLzIgZXJyb3IgY29kZSBpbnN0ZWFkIG9mIGVycm5vIG9uIHNlbWFwaG9yZSBlcnJvcnMuCi0gICAgIFtCcmlhbiBIYXZhcmRdCi0KLSAgKikgV29yayBhcm91bmQgYSBidWcgaW4gTHlueCByZWdhcmRpbmcgaXRzIHNlbmRpbmcgIk5lZ290aWF0ZTogdHJhbnMiCi0gICAgIGV2ZW4gdGhvdWdoIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZCBUQ04uICBbS29lbiBIb2x0bWFuLCBSb3kgRmllbGRpbmddCi0KLSAgKikgQWRkZWQgYXBfc2l6ZV9saXN0X2l0ZW0oKSwgYXBfZ2V0X2xpc3RfaXRlbSgpLCBhbmQgYXBfZmluZF9saXN0X2l0ZW0oKQotICAgICB0byB1dGlsLmMgZm9yIHBhcnNpbmcgYW4gSFRUUCBoZWFkZXIgZmllbGQgdmFsdWUgdG8gZXh0cmFjdCB0aGUgbmV4dAotICAgICBsaXN0IGl0ZW0sIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHBvc3NpYmxlIHByZXNlbmNlIG9mIG5lc3RlZCBjb21tZW50cywKLSAgICAgcXVvdGVkLXBhaXJzLCBhbmQgcXVvdGVkLXN0cmluZ3MuIGFwX2dldF9saXN0X2l0ZW0oKSBhbHNvIHJlbW92ZXMKLSAgICAgaW5zaWduaWZpY2FudCB3aGl0ZXNwYWNlIGFuZCBsb3dlcmNhc2VzIG5vbi1xdW90ZWQgdG9rZW5zLgotICAgICBbUm95IEZpZWxkaW5nXSBQUiMyMDY1Ci0KLSAgKikgcHJveHk6IFRoZSB2YXJpb3VzIGNhbGxzIHRvIGFwX3Byb3h5ZXJyb3IoKSBjYW4gcmV0dXJuIEhUVFAvMS4xIHN0YXR1cwotICAgICBjb2RlIGRpZmZlcmVudCBmcm9tIDUwMC4gVGhpcyBhbGxvd3MgdGhlIHByb3h5IHRvLCBlLmcuLCByZXR1cm4KLSAgICAgIjQwMyBGb3JiaWRkZW4iIGZvciBQcm94eUJsb2NrJ2VkIFVSTCdzLiBbTWFydGluIEtyYWVtZXJdIFJlbGF0ZWQgdG8gUFIjMzQ1NQotCi0gICopIEZpeCBvcmRlcmluZyBvZiBsYW5ndWFnZSB2YXJpYW50cyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHRyYWRpdGlvbmFsCi0gICAgIG5lZ290aWF0aW9uIGFsZ29yaXRobSBpcyBiZWluZyB1c2VkIHdpdGggbXVsdGlwbGUgbGFuZ3VhZ2UgdmFyaWFudHMKLSAgICAgYW5kIG5vIEFjY2VwdC1MYW5ndWFnZS4gW0phbWVzIFRyZWFjeSA8dHJlYWN5QGRlYmlhbi5vcmc+XSBQUiMzMjk5LCAzNjg4Ci0KLSAgKikgRG8gbm90IHJvdW5kIHRoZSBUQ04gcXVhbGl0eSBjYWxjdWxhdGlvbiB0byA1IGRlY2ltYWwgcGxhY2VzLAotICAgICB1bmxpa2UgUkZDIDIyOTYsIGJlY2F1c2UgdGhlIGNhbGN1bGF0aW9uIG1pZ2h0IG5lZWQgMTIgZGVjaW1hbCBwbGFjZXMKLSAgICAgdG8gZ2V0IHRoZSByaWdodCByZXN1bHQuICBbUm95IEZpZWxkaW5nXQotCi0gICopIFJlbW92ZSB1bnVzZWQgY29kZSB0byBkaXNhYmxlIHRyYW5zcGFyZW50IG5lZ290aWF0aW9uIHdoZW4KLSAgICAgbmVnb3RpYXRpbmcgb24gZW5jb2Rpbmcgb25seSwgYXMgd2Ugbm93IGhhbmRsZSBlbmNvZGluZyB0b28KLSAgICAgKHRob3VnaCB0aGlzIGlzIG5vbnN0YW5kYXJkIGZvciBUQ04pLCByZW1vdmUgY2hhcnNldD1JU08tODg1OS0xCi0gICAgIGZpZGRsZSBmcm9tIHRoZSBmaWRkbGUtYXZlcnNlIFJWU0EgY29tcGFyaXNvbiwgYW5kIGZpeCBidWdzIGluCi0gICAgIHNvbWUgZGVidWdnaW5nIHN0YXRlbWVudHMgd2l0aGluIG1vZF9uZWdvdGlhdGlvbi4gW0tvZW4gSG9sdG1hbl0KLQotICAqKSBGaXhlZCBhIHJhcmUgbWVtb3J5IGNvcnJ1cHRpb24gcG9zc2liaWxpdHkgaW4gbW9kX2RpciBpZiB0aGUgaW5kZXgKLSAgICAgZmlsZSBpcyBuZWdvdGlhYmxlIGFuZCBubyBhY2NlcHRhYmxlIHZhcmlhbnQgY2FuIGJlIGZvdW5kLgotICAgICBbRGVhbiBHYXVkZXQsIFJveSBGaWVsZGluZywgTWFydGluIEtyYWVtZXJdCi0KLSAgKikgV2luMzI6IEFkZCBuZXcgY29uZmlnIGRpcmVjdGl2ZSwgU2NyaXB0SW50ZXJwcmV0ZXJTb3VyY2UsIHRvIGVuYWJsZQotICAgICBzZWFyY2hpbmcgdGhlIFdpbjMyIHJlZ2lzdHJ5IGZvciBzY3JpcHQgaW50ZXJwcmV0ZXJzLgotICAgICBbQmlsbCBTdG9kZGFyZF0KLQotICAqKSBXaW4zMjogVGhlIGNvbXBpbGVkLWluIGRlZmF1bHQgZmlsZW5hbWUgZm9yIHRoZSBlcnJvciBsb2cgaXMgbm93Ci0gICAgIGVycm9yLmxvZywgd2hpY2ggbWF0Y2hlcyB0aGUgZGVmYXVsdCBpbiB0aGUgZGlzdHJpYnV0ZWQgaHR0cGQuY29uZi4KLSAgICAgW1BhdWwgU3V0dG9uXQotCi0gICopIFdpbjMyOiBBbnkgZXJyb3IgbWVzc2FnZXMgZnJvbSAtaSBvciAtdSBjb21tYW5kIGxpbmUgb3B0aW9ucyBhcmUgbm93Ci0gICAgIGRpc3BsYXllZCBvbiB0aGUgY29uc29sZSBvdXRwdXQgcmF0aGVyIHRoYW4gc2VudCB0byB0aGUgZXJyb3IgbG9nLgotICAgICBBbHNvIHRoZSAiUnVubmluZyBBcGFjaGUuLi4iIG1lc3NhZ2UgaXMgbm90IG91dHB1dCB1bmxlc3MgQXBhY2hlIGlzCi0gICAgIGdvaW5nIHRvIHNlcnZlIHJlcXVlc3RzLiBbUGF1bCBTdXR0b25dCi0KLSAgKikgUmV3b3JrIHRoZSBNRDUgYXV0aGVudGljYXRpb24gc2NoZW1lIHRvIHVzZSBGcmVlQlNEJ3MgYWxnb3JpdGhtLAotICAgICBhbmQgdXNlIGEgcHJpdmF0ZSBzaWduaWZpY2F0b3IgKCckYXByMSQnKSB0byBtYXJrIHBhc3N3b3JkcyBhcwotICAgICBiZWluZyBzbWFzaGVkIHdpdGggb3VyIG93biBhbGdvcml0aG0uICBBbHNvIGFic3RyYWN0IHRoZSBwYXNzd29yZAotICAgICBjaGVja2luZyBpbnRvIGEgbmV3IGFwX3ZhbGlkYXRlX3Bhc3N3b3JkKCkgcm91dGluZS4gIFtLZW4gQ29hcl0KLQotICAqKSBXaW4zMjogVGhlIGZpbGVuYW1lIHZhbGlkaXR5IGNoZWNrZXIgbm93IGFsbG93cyAiQ09NIiBidXQgcmVmdXNlcyAKLSAgICAgYWNjZXNzIHRvICJDT00xIiB0aHJvdWdoICJDT000Ii4gVGhpcyBhbGxvd3MgZmlsZW5hbWVzIHN1Y2gKLSAgICAgYXMgImNvbS5uYW1lIiB0byBiZSBzZXJ2ZWQuIFtQYXVsIFN1dHRvbl0gUFIjMzc2OS4KLQotICAqKSBCUzIwMDA6IEFkYXB0IHRvIHRoZSBuZXcgdWZvcmsoKSBzeXN0ZW0gY2FsbCBpbnRlcmZhY2Ugd2hpY2ggd2lsbAotICAgICBtYWtlIHN1YnRhc2tpbmcgZWFzaWVyIG9uIHRoZSBPU0QvUE9TSVggbWFpbmZyYW1lIGVudmlyb25tZW50LgotICAgICBbTWFydGluIEtyYWVtZXJdCi0KLSAgKikgQWRkIGEgY29tcGF0aWJpbGl0eSBkZWZpbmUgZm9yIGVzY2FwZV91cmkoKSAtPiBhcF9lc2NhcGVfdXJpKCkgdG8KLSAgICAgYXBfY29tcGF0LmguIFtEYXZpZCBXaGl0ZSA8ZGF2aWRAcGVyc2ltbW9uLmNvbT5dIFBSIzM3MjUKLQotICAqKSBNYWtlIE5EQk0gZmlsZSBzdWZmaXggZGV0ZXJtaW5hdGlvbiBmb3IgbW9kX3Jld3JpdGUgbW9yZSBhY2N1cmF0ZSwgaS5lLgotICAgICB1c2UgYC5kYicgaW5zdGVhZCBvZiBgLnBhZycgbm90IG9ubHkgZm9yIEZyZWVCU0QsIGJ1dCBhbHNvIHdoZW4KLSAgICAgdGhlIE5EQk0gbGlicmFyeSBsb29rcyBsaWtlIEJlcmtlbGV5LURCIGJhc2VkLgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMzc3MwotCi0gICopIEFkZCBhYmlsaXR5IHRvIGhhbmRsZSBERVMgb3IgTUQ1IGF1dGhlbnRpY2F0aW9uIHBhc3N3b3Jkcy4KLSAgICAgW1J5YW4gQmxvb20gPHJiYkBSYWxlaWdoLklCTS5Db20+XQotCi0gICopIEZpeCBPKG5eMikgbWVtb3J5IGNvbnN1bXB0aW9uIGluIG1vZF9zcGVsaW5nLiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIFNFQ1VSSVRZOiBBdm9pZCBzb21lIGJ1ZmZlciBvdmVyZmxvdyBwcm9ibGVtcyB3aGVuIGVzY2FwaW5nCi0gICAgIHF1b3RlZCBzdHJpbmdzLiAgKFRoaXMgb3ZlcmZsb3cgd2FzIG9uIHRoZSBoZWFwIGFuZCB3ZSBiZWxpZXZlCi0gICAgIGltcG9zc2libGUgdG8gZXhwbG9pdC4pICBbUmljayBQZXJyeSA8cGVycnlAZWNlLnZpbGwuZWR1Pl0KLQotICAqKSBMZXQgc3JjL0NvbmZpZ3VyZSBiZSBhd2FyZSBvZiBDRkxBR1Mgb3B0aW9ucyBzdGFydGluZyB3aXRoIHBsdXMKLSAgICAgc2lnbnMgYXMgaXQncyB0aGUgY2FzZSBmb3IgdGhlIEhQL1VYIGNvbXBpbGVyLgotICAgICBbRG91ZyBZYXRjaWxsYSA8eWF0Y2lsZGFAdW1kbmouZWR1Pl0gUFIjMzY4MQotCi0gICopIFJlbW92ZSB0aGUgaGFyZC13aXJlIG9mIFRBUj10YXIgKHdlIG5vdyBjaGVjayBmb3IgZ3RhciBhbmQgZ251dGFyIGZpcnN0KQotICAgICBhbmQgY2hlY2sgdG8gc2VlIGlmIHRoZSB0YXIgd2Ugd2luZCB1cCB3aXRoIHN1cHBvcnRzICctaCcuCi0gICAgIFtKaW0gSmFnaWVsc2tpXSBQUiMzNjcxCi0KLSAgKikgQSBjb25zaXN0ZW50IGFuZCBjb25zZXJ2YXRpdmUgc3R5bGUgZm9yIGFsbCBzaGVsbCBzY3JpcHRzIGhhcyBiZWVuCi0gICAgIGltcGxlbWVudGVkLiBCYXNpY2FsbHksIGFsbCBzaGVsbCBzdHJpbmcgdGVzdHMgdXNlIHRoZSB0cmFkaXRpb25hbAotICAgICBoYWNrIG9mICdpZiBbICJ4JHZhciIgIT0gIngiIF0nIG9yICdpZiBbICJ4JHZhciIgPSAieHN0cmluZyIgXScKLSAgICAgdG8gcHJvdGVjdCBhZ2FpbnN0IGJhcmUgbnVsbCB2YXJpYWJsZSBzdHJpbmdzIChpZTogd3JhcHBpbmcgYm90aAotICAgICBzaWRlcyB3aXRoIGRvdWJsZSBxdW90ZXMgYW5kIHByZXBlbmRpbmcgJ3gnKS4gJ3gnIHdhcyBjaG9zZW4KLSAgICAgYmVjYXVzZSBpdCdzIG1vcmUgdW5pdmVyc2FsIGFuZCBob3BlZnVsbHkgZWFzaWVyIGZvciBvbGQgc2hlbGwKLSAgICAgcHJncmFtbWVycywgYXMgd2VsbCBhcyBiZWluZyBlYXNpZXIgdG8gc2VhcmNoIGZvciBpbiAndmknICgveFwkKSA6KQotICAgICBbSmltIEphZ2llbHNraV0KLQotICAqKSBUaGUgc3RhdHVzIG1vZHVsZSBub3cgcHJpbnRzIG91dCBib3RoIHRoZSBtYWluIHNlcnZlciBnZW5lcmF0aW9uIGFzCi0gICAgIHdlbGwgYXMgdGhlIGdlbmVyYXRpb24gb2YgZWFjaCBwcm9jZXNzLiBBbHNvLCB0aGUgdmhvc3QgaW5mbyBpcwotICAgICBwcmludGVkIHdpdGggJz9ub3RhYmxlJy4gW0ppbSBKYWdpZWxza2ldCi0KLSAgKikgTW92ZSBzcmMvbWFpbi9tZDVjLmMgdG8gc3JjL2FwL2FwX21kNWMuYzsgaXQncyBodHRwZC1uZXV0cmFsCi0gICAgIGFuZCB0aGlzIG1ha2VzIGl0cyBmdW5jdGlvbnMgYXZhaWxhYmxlIHRvIHRoaW5ncyBpbiBzcmMvc3VwcG9ydC4KLSAgICAgW0tlbiBDb2FyXQotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDEuMy40Ci0KLSAgKikgUmVuYW1lZCBtYWNyb3Mgc3RhdHVzX2Ryb3BzX2Nvbm5lY3Rpb24gdG8gYXBfc3RhdHVzX2Ryb3BzX2Nvbm5lY3Rpb24KLSAgICAgYW5kIHZlc3RpZ2lhbCBzY2FuX3NjcmlwdF9oZWFkZXIgdG8gYXBfc2Nhbl9zY3JpcHRfaGVhZGVyX2VyciwKLSAgICAgbW9zdGx5IGZvciBhZXN0aGV0aWMgcmVhc29ucy4gW1JveSBGaWVsZGluZ10KLQotICAqKSBUaGUgcXVlcnkgc3dpdGNoICJodHRwZCAtUyIgZGlkbid0IGV4aXQgYWZ0ZXIgc2hvd2luZyB0aGUKLSAgICAgdmhvc3Qgc2V0dGluZ3MuIFRoYXQgd2FzIGluY29uc2lzdGVudCB3aXRoIHRoZSBvdGhlciBxdWVyeSBmdW5jdGlvbnMuCi0gICAgIFtNYXJ0aW4gS3JhZW1lcl0KLQotICAqKSBNb3ZlZCB0aGUgTU9EVUxFX01BR0lDX0NPT0tJRSBmcm9tIGJlZm9yZSB0aGUgdmVyc2lvbnMgYW5kCi0gICAgIGZpbGVuYW1lIHRvIHRoZSBlbmQgb2YgdGhlIFNUQU5EQVJEX01PRFVMRV9TVFVGRi4gIEl0cwotICAgICBwcmVzZW5jZSBhdCB0aGUgYmVnaW5uaW5nIHByZXZlbnRlZCByZXBvcnRpbmcgb2YgdGhlIGZpbGVuYW1lCi0gICAgIGZvciBtb2R1bGVzIGNvbXBpbGVkIGJlZm9yZSAxIEphbnVhcnkgMTk5OS4gIFtLZW4gQ29hcl0KLQotICAqKSBTRUNVUklUWTogYXBfb3NfaXNfZmlsZW5hbWVfdmFsaWQoKSBoYXMgYmVlbiBhZGRlZCB0byBXaW4zMgotICAgICB0byBkZXRlY3QgYW5kIHByZXZlbnQgYWNjZXNzIHRvIHNwZWNpYWwgRE9TIGRldmljZSBmaWxlIG5hbWVzLgotICAgICBbUGF1bCBTdXR0b24sIEtlbiBQYXJ6eWduYXRdCi0gICAgIAotICAqKSBXSU4zMjogQ3JlYXRlZCBuZXcgbWFrZWZpbGVzIE1ha2VmaWxlX3dpbjMyLnR4dCAobm9ybWFsIGJ1aWxkKQotICAgICBhbmQgTWFrZWZpbGVfd2luMzJfZGVidWcudHh0IChkZWJ1ZyBidWlsZCkgdGhhdCB3b3JrIG9uIFdpbjk1LgotICAgICBSdW4gZWFjaCBvZiB0aGUgZm9sbG93aW5nIGZyb20gdGhlIHNyYyBkaXJlY3Rvcnk6Ci0gICAgICAgIG5tYWtlIC9mIE1ha2VmaWxlX3dpbjMyLnR4dCAgICAgICAgICAgIyBjb21waWxlcyBub3JtYWwgYnVpbGQKLSAgICAgICAgbm1ha2UgL2YgTWFrZWZpbGVfd2luMzIudHh0IGluc3RhbGwgICAjIGNvbXBpbGVzIGFuZCBpbnN0YWxscwotICAgICAgICBubWFrZSAvZiBNYWtlZmlsZV93aW4zMi50eHQgY2xlYW4gICAgICMgcmVtb3ZlcyBjb21waWxlZCBqdW5rCi0gICAgICAgIG5tYWtlIC9mIE1ha2VmaWxlX3dpbjMyX2RlYnVnLnR4dCAgICAgIyBjb21waWxlcyBkZWJ1ZyBidWlsZAotICAgICAgICBubWFrZSAvZiBNYWtlZmlsZV93aW4zMl9kZWJ1Zy50eHQgaW5zdGFsbAotICAgICAgICBubWFrZSAvZiBNYWtlZmlsZV93aW4zMl9kZWJ1Zy50eHQgY2xlYW4KLSAgICAgW1JveSBGaWVsZGluZ10KLQotICAqKSBBZGRlZCBiaW5idWlsZC5zaCBhbmQgZmluZHByZy5zaCBoZWxwZXJzIHRvIG1ha2UgaXQgZWFzaWVyIGZvciB1cwotICAgICB0byBidWlsZCBiaW5hcnkgZGlzdHJpYnV0aW9ucy4gW0xhcnMgRWlsZWJyZWNodF0KLQotICAqKSBJbmRleE9wdGlvbnMgU3VwcHJlc3NDb2x1bW5Tb3J0aW5nIG9ubHkgdHVybmVkIG9mZiBtYWtpbmcKLSAgICAgdGhlIGNvbHVtbiBoZWFkZXJzIGFuY2hvcnM7IHlvdSBjb3VsZCBzdGlsbCBjaGFuZ2UgdGhlIGRpc3BsYXkKLSAgICAgb3JkZXIgYnkgbWFudWFsbHkgYWRkaW5nIGEgJz9OPUEnIG9yIHNpbWlsYXIgcXVlcnkgc3RyaW5nIHRvIHRoZQotICAgICBVUkwuICBOb3cgU3VwcHJlc3NDb2x1bW5Tb3J0aW5nIGxvY2tzIGluIHRoZSBzb3J0IG9yZGVyIHNvCi0gICAgIGl0IGNhbid0IGJlIG92ZXJyaWRkZW4gdGhpcyB3YXkuICBbS2VuIENvYXJdCi0KLSAgKikgQWRkZWQgSW5kZXhPcmRlckRlZmF1bHQgZGlyZWN0aXZlIHRvIHN1cHBseSBhIGRlZmF1bHQgc29ydCBvcmRlcgotICAgICBmb3IgRmFuY3lJbmRleGVkIGRpcmVjdG9yeSBsaXN0aW5ncy4gIFtLZW4gQ29hcl0gUFIjMTY5OQotCi0gICopIENoYW5nZSB0aGUgYXBfYXNzZXJ0IG1hY3JvIHRvIGEgdmFyaWFudCB0aGF0IHdvcmtzIG9uIGFsbCBwbGF0Zm9ybXMuCi0gICAgIFtSaWNoYXJkIFByaW56IDxyaWNoYXJkLnByaW56QGNzby5uZXQ+XSBQUiMyNTc1Ci0KLSAgKikgTWFrZSBzdXJlIHVuZGVyIEVMRi1iYXNlZCBOZXRCU0QgKG5vdykgYW5kIE9wZW5CU0QgKGZ1dHVyZSkgd2UgZG9uJ3QKLSAgICAgc2VhcmNoIGZvciBhbiB1bmRlcnNjb3JlIG9uIGRsc3ltKCkgKGFzIGl0J3MgYWxyZWFkeSB0aGUgY2FzZQotICAgICBmb3IgRnJlZUJTRCAzLjApLiBbVG9kZCBWaWVybGluZyA8dHZAcG9ib3guY29tPl0gUFIjMjQ2MgotICAKLSAgKikgU21hbGwgZml4IGZvciBtb2RfZW52Lmh0bWw6IFRoZSBtb2R1bGUgd2FzIGRvY3VtZW50ZWQgYXMgdG8gYmUgX25vdF8KLSAgICAgY29tcGlsZWQgaW50byBBcGFjaGUgcGVyIGRlZmF1bHQsIGFsdGhvdWdoIGl0IF9JU18gY29tcGlsZWQgaW50byAKLSAgICAgQXBhY2hlIHBlciBkZWZhdWx0LiBbU2ltIEhhcmJlcnQgPHNpbUBtaW5kc3ByaW5nLmNvbT5dIFBSIzM1NzIKLQotICAqKSBJbnN0ZWFkIG9mIGZpeGluZyBhIGJ1ZyBpbiB0aGUgZ2VuZXJhdGlvbiBwcm9jZWR1cmUgZm9yIGNvbmZpZy5zdGF0dXMgKGEKLSAgICAgYmFja3NsYXNoIHdhcyBtaXNzaW5nKSB3ZSByZW1vdmUgdGhlIGJ1ZyB0b2dldGhlciB3aXRoIGl0J3MgY29tcGxldGUKLSAgICAgY29udGV4dCBiZWNhdXNlIHRoZSBzcGVjaWFsIGNhc2VzIG9mIHRoZSBwYXN0IGNhbiBub3cgbm8gbG9uZ2VyIG9jY3VyCi0gICAgIGJlY2F1c2Ugb2YgdGhlIHJlY2VudCBtYWdpYyBmb3IgdGhlIC0td2l0aC1sYXlvdXQgZGVmYXVsdC4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzM1OTAKLSAKLSAgKikgTWFrZSB0b3AtbGV2ZWwgTWFrZWZpbGUgYXdhcmUgb2YgYSBwYXJhbGxlbCBidWlsZCBwcm9jZWR1cmVzIChtYWtlIC1qKSBieQotICAgICBtYWtpbmcgc3VyZSB0aGUgc3JjL3N1cHBvcnQvIHRvb2xzIGFyZSBfZm9yY2VkXyB0byBiZSBidWlsZCBsYXN0ICh0aGV5Ci0gICAgIGRlcGVuZCBvbiBvdGhlciBsaWJyYXJpZXMpLgotICAgICBbTWFya3VzIFRoZWlzc2luZ2VyIDxtYXJrdXMudGhlaXNzaW5nZXJAZ214LmRlPl0KLQotICAqKSBGaXggaW5zdGFsbGF0aW9uIHByb2NlZHVyZTogTm93IHRoYXQgb3MtaW5saW5lLmMgaXMgYWN0dWFsbHkgdXNlZCAoYQotICAgICByZWNlbnRseSBmaXhlZCBidWcgcHJldmVudGVkIHRoaXMpIHdlIG5lZWQgdG8gYWxzbyBpbnN0YWxsIG9zLWluY2x1ZGUuYwotICAgICBpbiBhZGRpdGlvbiB0byBvcy5oIGludG8gdGhlIFBSRUZJWC9pbmNsdWRlLyBsb2NhdGlvbiBvciBidWlsZGluZyBvZgotICAgICBtb2R1bGUgRFNPcyB3aXRoIEFQWFMgZmFpbHMuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMzNTI3Ci0KLSAgKikgQWRkZWQgTU9EVUxFX01BR0lDX0NPT0tJRSBhcyB0aGUgZmlyc3QgZmllbGQgaW4gYSBtb2R1bGUgc3RydWN0dXJlIHRvCi0gICAgIGFsbG93IHVzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBnYXJibGVkIERTTyAob3IgZXZlbiBhIGZpbGUgd2hpY2ggaXNuJ3QKLSAgICAgYW4gQXBhY2hlIG1vZHVsZSBEU08gYXQgYWxsKSBhbmQgYSBEU08gd2hpY2ggZG9lc24ndCBtYXRjaCB0aGUgY3VycmVudAotICAgICBBcGFjaGUgQVBJLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMzE1MgotIAotICAqKSBUd28gbWlub3IgZW5oYW5jZW1lbnRzIHRvIG1vZF9yZXdyaXRlOiBGaXJzdCBSZXdyaXRlUnVsZSBub3cgYWxzbwotICAgICBzdXBwb3J0cyB0aGUgYGBub2Nhc2V8TkMnJyBmbGFnIChhcyBSZXdyaXRlQ29uZCBhbHJlYWR5IGRvZXMgZm9yIGFnZXMpIHRvCi0gICAgIG1hdGNoIGNhc2UgaW5zZW5zaXRpdmUgKHRoaXMgZXNwZWNpYWxseSBhdm9pZHMgbmFzdHkgcGF0dGVybnMgbGlrZQotICAgICBgW3RUXVtlRV1bc1NdW3RUXScpLiBTZWNvbmQgdHdvIGFkZGl0aW9uYWwgaW50ZXJuYWwgbWFwIGZ1bmN0aW9ucwotICAgICBgZXNjYXBlJyBhbmQgYHVuZXNjYXBlJyB3ZXJlIGFkZGVkIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGVzY2FwZS91bmVzY2FwZQotICAgICB0by9mcm9tIGhleC1lbmNvZGluZ3MgaW4gVVJMcyBwYXJ0cyAodGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBpbgotICAgICBjb21iaW5hdGlvbiB3aXRoIG1hcCBsb29rdXBzKS4gCi0gICAgIFtNYWdudXMgQm9kaW4sIElhbiBLYWxsZW4sIFJhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgUmVuYW1lZCB0aGUgbWFjcm8gZXNjYXBlX3VyaSgpIHRvIGFwX2VzY2FwZV91cmkoKSB3aGljaCB3YXMKLSAgICAgZm9yZ290dGVuIChiZWNhdXNlIGl0IHdhcyBhIG1hY3JvKSBpbiB0aGUgc3ltYm9sIHJlbmFtaW5nIHByb2Nlc3MuCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIEZpeCBzb21lIGluY29uc2lzdGVuY2llcyByZWxhdGVkIHRvIHRoZSBzY29wZXMgb2YgZGlyZWN0aXZlcy4gVGhlIG9ubHkKLSAgICAgdXNlciB2aXNpYmxlIGNoYW5nZSBpcyB0aGF0IHRoZSBkaXJlY3RpdmVzIGBVc2VDYW5vbmljYWxOYW1lJyBhbmQKLSAgICAgYENvbnRlbnREaWdlc3QnIG5vdyB1c2UgdGhlIChtb3JlIGNvcnJlY3QpIGBPcHRpb25zJyBzY29wZSBpbnN0ZWFkIG9mCi0gICAgIChsZXNzIGNvcnJlY3QpIGBBdXRoQ29uZmlnJyBzY29wZS4gIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIFVzaW5nIERTTywgdGhlIFNlcnZlciB0b2tlbiB3YXMgYmVpbmcgbWFuZ2xlZC4gU3BlY2lmaWNhbGx5LCB0aGUKLSAgICAgbW9kdWxlJ3MgdG9rZW4gd2FzIGJlaW5nIGFkZGVkIGZpcnN0IGJlZm9yZSB0aGUgQXBhY2hlIHRva2VuLiBUaGlzCi0gICAgIGhhcyBiZWVuIGZpeGVkLiBbSmltIEphZ2llbHNraV0KLQotICAqKSBNYWpvciBvdmVyaGF1bCBvZiBtb2RfbmVnb3RpYXRpb24uYywgcGFydCAyLgotICAgICAtIHByb3Blcmx5IGhhbmRsZSAiaWRlbnRpdHkiIHdpdGhpbiBBY2NlcHQtRW5jb2RpbmcuCi0gICAgIC0gYWxsb3cgZW5jb2RlZCB2YXJpYW50cyBpbiBSVlNBIG5lZ290aWF0aW9uIGFuZCBsZXQgdGhlbSBhcHBlYXIgaW4KLSAgICAgICB0aGUgQWx0ZXJuYXRlcyBmaWVsZCB1c2luZyB0aGUgbm9uLXN0YW5kYXJkICJlbmNvZGluZyIgdGFnLWxpc3QuCi0gICAgIC0gZml4ZWQgYm90aCBuZWdvdGlhdGlvbiBhbGdvcml0aG1zIHNvIHRoYXQgYW4gZXhwbGljaXRseSBhY2NlcHRlZAotICAgICAgIGVuY29kaW5nIGlzIHByZWZlcnJlZCBvdmVyIG5vIGVuY29kaW5nIGlmICJpZGVudGl0eSIgaXMgbm90Ci0gICAgICAgaW5jbHVkZWQgd2l0aGluIEFjY2VwdC1FbmNvZGluZy4KLSAgICAgLSBhZGRlZCBhcF9hcnJheV9wc3RyY2F0KCkgdG8gYWxsb2MuYyBmb3IgZWZmaWNpZW50IGNvbmNhdGVuYXRpb24KLSAgICAgICBvZiBsYXJnZSBzdWJzdHJpbmcgc2VxdWVuY2VzLgotICAgICAtIHJlcGxhY2VkIE8obl4yKSBtZW1vcnkgaG9ncyBpbiBtb2RfbmVnb3RpYXRpb24gd2l0aCBhcF9hcnJheV9wc3RyY2F0LgotICAgICBbUm95IEZpZWxkaW5nXQotCi0gICopIE1ham9yIG92ZXJoYXVsIG9mIG1vZF9uZWdvdGlhdGlvbi5jLCBwYXJ0IDEuCi0gICAgIC0gY2xlYW51cHMgdG8gbW9kX25lZ290aWF0aW9uIGNvbW1lbnRzIGFuZCBjb2RlIHN0cnVjdHVyZQotICAgICAtIG1hZGUgY29tcGxpYW50IHdpdGggSFRUUC8xLjEgcHJvcG9zZWQgc3RhbmRhcmQgKHJmYzIwNjgpIGFuZCBhZGRlZAotICAgICAgIHN1cHBvcnQgZm9yIGV2ZXJ5dGhpbmcgaW4gdGhlIHVwY29taW5nIEhUVFAvMS4xCi0gICAgICAgcmV2aXNpb24gKGRyYWZ0LWlldGYtaHR0cC12MTEtc3BlYy1yZXYtMDYudHh0KS4KLSAgICAgICAgIC0gbGFuZ3VhZ2UgdGFnIG1hdGNoaW5nIGFsc28gaGFuZGxlcyB0YWdzIHdpdGggbW9yZSB0aGFuIDIKLSAgICAgICAgICAgbGV2ZWxzIGxpa2UgeC15LXoKLSAgICAgICAgIC0gZW1wdHkgQWNjZXB0LCBBY2NlcHQtTGFuZ3VhZ2UsIEFjY2VwdC1DaGFyc2V0IGhlYWRlcnMgYXJlCi0gICAgICAgICAgIHByb2Nlc3NlZCBjb3JyZWN0bHk7IHByZXZpb3VzbHkgYW4gZW1wdHkgaGVhZGVyIHdvdWxkIG1ha2UgYWxsCi0gICAgICAgICAgIHZhbHVlcyBhY2NlcHRhYmxlIGluc3RlYWQgb2YgdW5hY2NlcHRhYmxlLgotICAgICAgICAgLSBhbGxvd2VkIGZvciBxIHZhbHVlcyBpbiBBY2NlcHQtRW5jb2RpbmcKLSAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciB0cmFuc3BhcmVudCBjb250ZW50IG5lZ290aWF0aW9uIChyZmMyMjk1IGFuZAotICAgICAgIHJmYzIyOTYpICh0aG91Z2ggd2UgZG8gbm90IGltcGxlbWVudCBhbGwgZmVhdHVyZXMgaW4gdGhlc2UgZHJhZnRzLAotICAgICAgIGUuZy4gbm8gZmVhdHVyZSBuZWdvdGlhdGlvbikuICBSZW1vdmVkIG9sZCBleHBlcmltZW50YWwgdmVyc2lvbi4KLSAgICAgLSBpbXBsZW1lbnRlZCAnc3RydWN0dXJlZCBlbnRpdHkgdGFncycgZm9yIGJldHRlciBjYWNoZSBjb3JyZWN0bmVzcwotICAgICAgIChzdHJ1Y3R1cmVkIGVudGl0eSB0YWdzIGVuc3VyZSB0aGF0IGNhY2hlcyB3aGljaCBjYW4gZGVhbCB3aXRoIFZhcnkKLSAgICAgICB3aWxsIChldmVudHVhbGx5KSBiZSB1cGRhdGVkIGlmIHRoZSBzZXQgb2YgdmFyaWFudHMgb24gdGhlIHNlcnZlcgotICAgICAgIGlzIGNoYW5nZWQpCi0gICAgICAgICAtIHRoaXMgaW52b2x2ZWQgYWRkaW5nIGEgdmxpc3RfdmFsaWRhdG9yIGVsZW1lbnQgdG8gcmVxdWVzdF9yZWMKLSAgICAgICAgIC0gdGhpcyBpbnZvbHZlZCBhZGRpbmcgdGhlIGFwX21ha2VfZXRhZygpIGZ1bmN0aW9uIHRvIHRoZSBnbG9iYWwgQVBJCi0gICAgIC0gbW9kaWZpZWQgZ3Vlc3Npbmcgb2YgY2hhcnNldHMgdXNlZCBieSBBcGFjaGUgbmVnb3RpYXRpb24gYWxnb3JpdGhtIAotICAgICAgIHRvIGd1ZXNzICdubyBjaGFyc2V0JyBpZiB0aGUgdmFyaWFudCBpcyBub3QgYSB0ZXh0LyogdHlwZQotICAgICAtIGFkZGVkIGNvZGUgdG8gc29ydCBtdWx0aXZpZXdzIHZhcmlhbnRzIGludG8gYSBjYW5vbmljYWwgb3JkZXIgc28gdGhhdAotICAgICAgIG5lZ290aWF0aW9uIHJlc3VsdHMgYXJlIGNvbnNpc3RlbnQgYWNyb3NzIGJhY2t1cC9yZXN0b3JlcyBhbmQgbWlycm9ycwotICAgICAtIHJlbW92ZWQgcG9zc2liaWxpdHkgb2YgYSB0eXBlIG1hcCBmaWxlIHJlc29sdmluZyB0byBhbm90aGVyIHR5cGUgbWFwCi0gICAgICAgZmlsZSBhcyBpdHMgYmVzdCB2YXJpYW50Ci0gICAgIFtLb2VuIEhvbHRtYW4sIFJveSBGaWVsZGluZywgTGFycyBFaWxlYnJlY2h0XSBQUiMzNDUxLCAzMjk5LCAxOTg3Ci0KLSAgKikgUkZDMjM5NiBhbGxvd3MgdGhlIHN5bnRheCBodHRwOi8vaG9zdDovcGF0aCAod2l0aCBubyBwb3J0IG51bWJlcikKLSAgICAgYnV0IHRoZSBwcm94eSBkaXNhbGxvd2VkIGl0IChhcF9wcm94eV9jYW5vbl9uZXRsb2MoKSkuCi0gICAgIFtEYXZpZCBLcmlzdG9sIDxkbWtAYmVsbC1sYWJzLmNvbT5dIFBSIzM1MzAKLQotICAqKSBXaGVuIG1vZHVsZXMgdXBkYXRlL21vZGlmeSB0aGUgZmlsZSBuYW1lIGluIHRoZSBjb25maWdmaWxlX3Qgc3RydWN0dXJlLAotICAgICBzeW50YXggZXJyb3JzIHdpbGwgcmVwb3J0IHRoZSB1cGRhdGVkIG5hbWUsIG5vdCB0aGUgb3JpZ2luYWwgb25lLgotICAgICBbRmFiaWVuIENvZWxobyA8Y29lbGhvQGNyaS5lbnNtcC5mcj5dIFBSIzM1NzMKLQotICAqKSBDb3JyZWN0IHNvbWUgZmlsZW5hbWUgY2FzZSBhc3N1bXB0aW9ucyBmcm9tIFdJTjMyIHRvCi0gICAgIENBU0VfQkxJTkRfRklMRVNZU1RFTS4gIFtCcmlhbiBIYXZhcmQgPGJyaWFuaEBraGVsZGFyLmFwYW5hLm9yZy5hdT5dCi0KLSAgKikgRm9yICV2IGxvZyBTZXJ2ZXJOYW1lIHJlZ2FyZGxlc3Mgb2YgdGhlIFVzZUNhbm9uaWNhbE5hbWUKLSAgICAgc2V0dGluZyAoc2ltaWxhcmx5IGZvciAlcCkuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgQ29uZmlndXJlIHdhcyBpbml0aWFsaXppbmcgdGhlIHZhcmlhYmxlcyAkT1NESVIsICRJTkNESVIgYW5kICRTSEVMTAotICAgICByYXRoZXIgbGF0ZSAodG9vIGxhdGUgZm9yIHNvbWUgaW52b2NhdGlvbnMgb2YgVGVzdENvbXBpbGUpLgotICAgICBUaGlzIGltcHJvdmVzIHRoZSBtYWtlIGVudmlyb25tZW50IGF2YWlsYWJsZSB0byBUZXN0Q29tcGlsZSBhbmQKLSAgICAgdGhlICoubW9kdWxlIHNjcmlwdHMuIFtNYXJ0aW4gS3JhZW1lcl0KLQotICAqKSBUaGUgaGFzaGJhbmcgZW11bGF0aW9uIGNvZGUgaW4gYXBfZXhlY3ZlLmMgd291bGQgaW50ZXJwcmV0Ci0gICAgICMhL2hhc2hiYW5nL3NjcmlwdHMgY29ycmVjdGx5LCBidXQgZmFpbGVkIHRvIGZhbGwgYmFjayB0byBhCi0gICAgIHN0YW5kYXJkIHNoZWxsIGZvciBzY3JpcHRzIHdoaWNoIGRpZCBOT1Qgc3RhcnQgd2l0aCAjIQotICAgICBOb3cgU0hFTExfUEFUSCBpcyBzdGFydGVkIGluIHRoZXNlIGNhc2VzLiBbTWFydGluIEtyYWVtZXJdCi0KLSAgKikgUE9SVDogQWRkZWQgdGhlIEN5YmVyZ3VhcmQgVjIgcG9ydCBbUmljaGFyZCBTdGFnZyA8c3RhZ2dAbGVudGlsLm9yZz5dCi0gICAgIFBSIzMzMzYKLQotICAqKSBVcGRhdGUgQVBYUyBtYW51YWwgcGFnZTogc29tZSAtcSBvcHRpb24gYXJndW1lbnRzIHdlcmUgbWlzc2luZwotICAgICBhbmQgYW5vdGhlciB3YXMgaW5jb3JyZWN0LiBbTWFyayBBbmRlcnNvbiA8bWRhQGRpc2Nlcm5pbmcuY29tPl0gUFIjMzU1MwotCi0gICopIENsZWFudXAgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zOiBgLT8nIHdhcyBkb2N1bWVudGVkIHRvIHNob3cKLSAgICAgdGhlIHVzYWdlIGxpc3QgYnV0IGRvZXMgaXQgd2l0aCBhbiBlcnJvciBiZWNhdXNlIGA/JyBpcyBub3QgYSB2YWxpZAotICAgICBjb21tYW5kLiBPVE9IIGEgbG90IG9mIHVzZXJzIGV4cGVjdCBgLWgnIHRvIHByaW50IHN1Y2ggYSB1c2FnZSBsaXN0IGFuZAotICAgICBpbnN0ZWFkIGFyZSBhbm5veWVkIGZvciBhZ2VzIGJ5IG91ciBodWdlIHVucmVhZGFibGUgbGlzdCBvZiBkaXJlY3RpdmVzLgotICAgICBTbyB3ZSBub3cgY2hhbmdlZCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgdGhpcyB3YXk6Ci0gICAgIDEuIGAtTCcgPT4gYC1SJyAKLSAgICAgICAgSW50ZW50OiB3ZSBuZWVkIGAtTCcgdG8gYmUgZnJlZSwgYW5kIGAtUicgZm9yIHRoZSBEU08gcnVuLXRpbWUgcGF0aCBpcwotICAgICAgICB2ZXJ5IHNpbWlsYXIgdG8gdGhlIHBvcHVsYXIgbGlua2VyIG9wdGlvbi4KLSAgICAgMi4gYC1oJyA9PiBgLUwnCi0gICAgICAgIEludGVudDogd2hpbGUgLWwgZ2l2ZXMgdGhlIHNtYWxsIGxpc3Qgb2YgbW9kdWxlcywgLUwgbm93IGdpdmVzIHRoZQotICAgICAgICBsYXJnZSBsaXN0IG9mIGRpcmVjdGl2ZXMgaW1wbGVtZW50ZWQgYnkgdGhlc2UgbW9kdWxlcy4gIFRoaXMgaXMgYWxzbwotICAgICAgICBjb25zaXN0ZW50IHdpdGggLXYgKHNob3J0IHZlcnNpb24gaW5mbykgYW5kIC1WIChsYXJnZSB2ZXJzaW9uIGluZm8pLgotICAgICAzLiBgLT8nID0+IGAtaCcgCi0gICAgICAgIEludGVudDogaXQncyBub3cgdGhlIGV4cGVjdGVkIG9wdGlvbiA7LSkKLSAgICAgVGhlIG1hbnVhbCBwYWdlIHdhcyBhZGp1c3RlZCBhY2NvcmRpbmdseS4gCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyNzE0Ci0KLSAgKikgRml4ZWQgcHJvYmxlbSBvZiBmY2xvc2UoKSBvbiBhbiB1bm9wZW5lZCBmaWxlIGluIHN1ZXhlYyBpZiBMT0dfRVhFQwotICAgICB3YXNuJ3QgZGVmaW5lZC4gIFtSaWNrIEZyYW5jaHVrIDxyaWNrZkB0cmFuc3BlY3QubmV0Pl0KLQotICAqKSBSZW1vdmVkIHJlY2VudGx5IGludHJvZHVjZWQgYnVncyBhbmQgZGlzZmlndXJlbWVudHMgaW4gQVBBQ0k6Ci0gICAgIG8gZml4ZWQgYXJndW1lbnQgbGluZSBwcm9jZXNzaW5nOiB1c2luZyAkYXJncyB3YXMgYnJva2VuOiBJdCB3YXMgbm90Ci0gICAgICAgaW5pdGlhbGl6ZWQgYW5kIHVzaW5nIGFyZ3M9IiRhcmdzICRhcGNfb3B0aW9uIiBhbmQgZXZlbiBhcmdzPSIkYXJncwotICAgICAgIFwiJGFwY19vcHRpb25cIiIgZmFpbHMgaW4gdGhlIHNlY29uZCBwcm9jZXNzaW5nIHJvdW5kIGZvciBhbnkgYXJndW1lbnRzCi0gICAgICAgY29udGFpbmluZyB3aGl0ZXNwYWNlcy4gVGhlIG9ubHkgY29ycmVjdCB3YXkgaXMgdG8gdXNlIHRoZSBjb25zdHJ1Y3QKLSAgICAgICAiJEAiIChidXQgbm90IHBvc3NpYmxlIGhlcmUpIG9yIGl0ZXJhdGUgX2JvdGhfIHRpbWVzIG92ZXIgdGhlIGltcGxpY2l0Ci0gICAgICAgYXJndW1lbnQgbGluZSAobm8gYXJndW1lbnQgdG8gZm9yLWxvb3ApIHdoaWNoIGlzIHdoYXQgd2Ugbm93IHVzZS4KLSAgICAgbyBtYWtlIC0td2l0aC1sYXlvdXQ9QXBhY2hlIHRoZSBkZWZhdWx0IHdpdGhvdXQgY3JlYXRpbmcKLSAgICAgICByZWR1bmRhbmN5IChjb3B5aW5nIHRoZSAtLXdpdGgtbGF5b3V0IGJsb2NrIGluIHRoZSBhcmd1bWVudCBwYXJzaW5nCi0gICAgICAgbG9vcCkuICBXZSBhY2hpZXZlIHRoaXMgYnkgdXNpbmcgdGhlICIkQCIgY29uc3RydWN0IHRvZ2V0aGVyIHdpdGggdGhlCi0gICAgICAgYHNldCcgY29tbWFuZCB0byBwcmVwZW5kIC0td2l0aC1sYXlvdXQ9QXBhY2hlIHRvIHRoZSBjb21tYW5kIGxpbmUgaW4KLSAgICAgICBjYXNlIC0td2l0aC1sYXlvdXQgaXMgbm90IHVzZWQuCi0gICAgIG8gZml4ZWQgYXV0by1zdWZmaXggaGFuZGxpbmcgbm93IHRoYXQgY29uZmlnLmxheW91dCBleGlzdHMuCi0gICAgICAgUGF0aHMgd2hpY2ggYXJlIGF1dG8tc3VmZml4ZWQgYXJlIG1hcmtlZCB3aXRoIGEgdHJhaWxpbmcgcGx1cyBzaWduIGluCi0gICAgICAgY29uZmlnLmxheW91dCBhbmQgZXZlcnkgcGF0aCBub3cgY2FuIGJlIG1hcmtlZCB0aGlzIHdheSAobm90IG9ubHkgdGhlCi0gICAgICAgZm91ciBwYXRocyBmb3Igd2hpY2ggd2UgZG8gaXQgY3VycmVudGx5KS4gIEFkZGl0aW9uYWxseSB0aGUgc3VmZml4IGlzCi0gICAgICAgbm8gbG9uZ2VyIGEgc3RhdGljIG9uZS4gSW5zdGVhZCBpdCdzIG5vdyBgLzx0YXJnZXQ+JyB3aGVyZSA8dGFyZ2V0PiBpcwotICAgICAgIHRoZSBhcmd1bWVudCBvZiB0aGUgLS10YXJnZXQgb3B0aW9uIG9yIHBlciBkZWZhdWx0IGBodHRwZCcuCi0gICAgIG8gYWxsb3cgYWxzbyB0YWJzIChhbmQgb25seSBzcGFjZXMpIHdoZXJlIHdlIG1hdGNoIHdoaXRlc3BhY2VzCi0gICAgIG8gdmFyaW91cyBmaXhlcyBhbmQgY2xlYW51cHMgcmVsYXRlZCB0byB1c2VkIHNoZWxsIGNvZGluZyBzdHlsZQotICAgICBvIG1hZGUgSmltIGhhcHB5IGJ5IHJlcGxhY2luZyBgV3JpdHRlbiBieScgd2l0aCBgSW5pdGlhbGx5IHdyaXR0ZW4gYnknIDstKQotICAgICBvIHRyaW1tZWQgb3V0cHV0IG9mIC0taGVscCB0byBmaXQgaW50byA4MCBjb2x1bW5zCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIEFkZGVkIHR3byBuZXcgY29yZSBBUEkgZnVuY3Rpb25zLCBhcF9zaW5nbGVfbW9kdWxlX2NvbmZpZ3VyZSgpIGFuZAotICAgICBhcF9zaW5nbGVfbW9kdWxlX2luaXQoKSwgd2hpY2ggYXJlIG5vdyB1c2VkIGJ5IG1vZF9zbyB0byBjb25maWd1cmUgYSBtb2R1bGUKLSAgICAgYWZ0ZXIgbG9hZGluZy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgUE9SVDogQWRkIGRlZmluZXMgZm9yIFVTRV9GTE9DS19TRVJJQUxJWkVEX0FDQ0VQVCBhbmQKLSAgICAgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBUIHRvIE5ldEJTRC9PcGVuQlNEIHNlY3Rpb24KLSAgICAgb2YgYXBfY29uZmlnLmggdG8gYWxsb3cgc2VyaWFsaXplZCBhY2NlcHQgZm9yIG11bHRpcG9ydCBsaXN0ZW5zLgotICAgICBbUm95IEZpZWxkaW5nLCBDdXJ0IFNhbXBzb25dIFBSIzMxMjAKLQotICAqKSBQT1JUOiBGaXhlZCBhIG1pc3BsYWNlZCAjZW5kaWYgZm9yIE5ldEJTRC9PcGVuQlNEIHNlY3Rpb24KLSAgICAgb2YgYXBfY29uZmlnLmggdGhhdCB3b3VsZCBza2lwIHNldmVyYWwgZGVmaW5lcyBpZiBERUZBVUxUX0dST1VQCi0gICAgIHdhcyBvdmVycmlkZGVuLiBbUm95IEZpZWxkaW5nXQotCi0gICopIFBPUlQ6IFRoZSBJODYgdmVyc2lvbiBvZiBER1VYIGhhcyBzdXBwb3J0IGZvciBzdHJuY2FzZWNtcCBhbmQgCi0gICAgIHN0cmNhc2VjbXAsIHNvIGFsbG93IGl0IGluIGFwX2NvbmZpZy5oLiBbQW1pZWwgTGVlIFllZV0gUFIjMzI0NwotCi0gICopIEZpeCBvcmRlcmluZyBvZiBkZWZpbml0aW9ucyBpbiBhcF9jb25maWcuaCBzbyB0aGF0IGFwX2lubGluZSBpcwotICAgICBkZWZpbmVkIGJlZm9yZSBpdCBtaWdodCBiZSB1c2VkLiBbVmljdG9yIEtoaW1lbmtvXQotCi0gICopIFBPUlQ6IEFkZCBEeW5hbWljIFNoYXJlZCBPYmplY3QgKERTTykgc3VwcG9ydCBmb3IgQlNESSAodjQuMCkuCi0gICAgIFtUb20gU2Vya293c2tpIDx0a3NAYnNkaS5jb20+XSBQUiMzNDUzCi0KLSAgKikgTWFrZSBnZW5lcmF0aW9uIG9mIHNyYy9Db25maWd1cmF0aW9uLmFwYWNpIG1vcmUgcm9idXN0OiBJdCBmYWlsZWQgdG8KLSAgICAgZGlmZmVyZW5jaWF0ZSBiZXR3ZWVuIG1vZHVsZXMgd2hlbiBvbmUgbW9kdWxlIG5hbWUgd2FzIGEgcG9zdGZpeCBvZgotICAgICBhbm90aGVyIChlLmcuIGNnaSB2cy4gZmFzdGNnaSkuIFdlIG5vdyBjaGVjayBmb3IgbW9kX1hYWCwgbGliWFhYIGFuZCBldmVuCi0gICAgIGp1c3QgWFhYICh0aGluayBhYm91dCB0b3RhbGx5IG5vbi1zdGFuZGFyZCBuYW1lcyBsaWtlICJhcGFjaGVfc3NsIiwgdG9vKS4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzMzODAKLQotICAqKSBJbiBzcmMvQ29uZmlndXJlIHJlbW92ZSB0aGUgU0VSVkVSX1NVQlZFUlNJT04gc3VwcG9ydCAoYWxyZWFkeSBkZXByZWNhdGVkCi0gICAgIHNpbmNlIDEuM2I3KSBhbmQgbWFrZSB3aGl0ZXNwYWNlIGhhbmRsaW5nIG1vcmUgcm9idXN0IChpdCBmYWlsZWQgaG9ycmlibGUKLSAgICAgd2hlbiB3aGl0ZXNwYWNlcyB3ZXJlIHByZXNlbnQgaW4gdGhlIGFyZ3VtZW50cyBvZiAtRCBvcHRpb25zKS4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzMyNDAKLQotICAqKSBBZGQgQVBBQ0kgLS1zaGFkb3c9RElSIHZhcmlhbnQgKGluIGFkZGl0aW9uIHRvIC0tc2hhZG93KS4gVGhpcyBub3cgZmlyc3QKLSAgICAgY3JlYXRlcyBhbiBleHRlcm5hbCBwYWNrYWdlIHNoYWRvdyB0cmVlIGluIERJUiBiZWZvcmUgdGhlIGxvY2FsIGJ1aWxkCi0gICAgIHNoYWRvdyB0cmVlIGlzIGdlbmVyYXRlZCB1bmRlciBESVIuIFRoaXMgd2F5IG9uZSBjYW4gaGF2ZSB0aGUgZXh0cmFjdGVkCi0gICAgIEFwYWNoZSBkaXN0cmlidXRpb24gdHJlZSByZWFkLW9ubHkgb24gTkZTIG9yIENEUk9NIGFuZCBzdGlsbCBidWlsZCBBcGFjaGUKLSAgICAgZnJvbSB0aGVzZSBzb3VyY2VzLiBBbiBhdXRvbWF0aWNhbGx5IHRyaWdnZXJlZCBWUEFUSC1saWtlIG1lY2hhbmlzbSBpcwotICAgICBwcm92aWRlZCB0aHJvdWdoIHRoZSBUT1AgdmFyaWFibGUsIHRvby4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGwsIFdpbGZyZWRvIFNhbmNoZXogPHdzYW5jaGV6QGFwcGxlLmNvbT5dCi0KLSAgKikgRml4IG5lZ290aWF0aW9uIHNvIHRoYXQgYSBWYXJ5IHJlc3BvbnNlIGhlYWRlciBpcyBjb3JyZWN0bHkgCi0gICAgIGdlbmVyYXRlZCB3aGVuLCBmb3IgYSBwYXJ0aWN1bGFyIGRpbWVuc2lvbiwgdmFyaWFudHMgb25seSB2YXJ5Ci0gICAgIGluIGhhdmluZyBvciBub3QgaGF2aW5nIGEgdmFsdWUgZm9yIHRoYXQgZGltZW5zaW9uLiBbUGF1bCBTdXR0b25dCi0KLSAgKikgRml4IG5lZ290aWF0aW9uIHNvIHRoYXQgd2UgcHJlZmVyIGFuIGVuY29kZWQgdmFyaWFudCBvdmVyIGFuCi0gICAgIHVuZW5jb2RlZCB2YXJpYW50IGlmIHRoZSB1c2VyLWFnZW50IGV4cGxpY2l0bHkgc2F5cyBpdCBjYW4KLSAgICAgYWNjZXB0IHRoYXQgZW5jb2RpbmcuIFByZXZpb3VzbHkgd2UgYWx3YXlzIHByZWZlcnJlZCB0aGUgdW5lbmNvZGVkCi0gICAgIHZhcmlhbnQuCi0gICAgIFtQYXVsIEF1c2JlY2sgPHBhdWxhQGFsdW1uaS5jc2UudWNzYy5lZHU+LCBQYXVsIFN1dHRvbl0gUFIjMzQ0NwotIAotICAqKSBGaXggQVBYUyB0b29sOiBxdWVyeSB2YXJpYWJsZXMgTElCU19TSExJQiBhbmQgVEFSR0VUIHdlcmUgbm90IHJlY29nbml6ZWQKLSAgICAgYW5kIHRoZSB1c2FnZSBwYWdlIHdhcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgZnVuY3Rpb25hbGl0eSBhbmQgbWFucGFnZS4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgQWxsb3cgc3BlY2lhbCBvcHRpb25zIC1XYyx4eHggYW5kIC1XbCx4eHggb24gQVBYUyBjb21waWxlL2xpbmsgY29tbWFuZC4KLSAgICAgVGhleSBjYW4gb2NjdXIgbXVsdGlwbGUgdGltZXMgYW5kIHRoZWlyIGFyZ3VtZW50cyAoYHh4eCcpIGFyZSBwYXNzZWQgQVMKLSAgICAgSVMgdG8gdGhlIGNvbXBpbGVyL2xpbmtlciBjb21tYW5kLiAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgRml4ZWQgcG9zc2libGUgKGJ1dCBoYXJtbGVzcyBpbiBwcmFjdGljZSkgYnVnIGluIHRoZSBEQk0gbG9va3VwCi0gICAgIHByb2NlZHVyZSBvZiBtb2RfcmV3cml0ZTogdmVyeSBsb25nIGtleXMgd2VyZSB0cnVuY2F0ZWQuCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIEFkZGVkIGEgZ2VuZXJpYyAtLXdpdGgtbGF5b3V0PVtGSUxFOl1JRCBvcHRpb24uIElEIGhlcmUgaXMgYSBsYXlvdXQKLSAgICAgaWRlbnRpZmllciwgY3VycmVudGx5ICJBcGFjaGUiIGFuZCAiR05VIiBhcmUgcHJlLWRlZmluZWQgaW4gdGhlIGZpbGUKLSAgICAgY29uZmlnLmxheW91dC4gIEN1c3RvbSBsYXlvdXRzIGFyZSBwb3NzaWJsZSBieSB1c2luZyBGSUxFOklEIGFzIHRoZQotICAgICBhcmd1bWVudCB3aGVyZSB0aGUgbGF5b3V0IElEIGlzIHRha2VuIGZyb20gRklMRS4KLQotICAgICBUaGUgY29uZmlnLmxheW91dCBmaWxlIGNvbnNpc3RzIG9mIDxMYXlvdXQgSUQ+Li48L0xheW91dD4gc2VjdGlvbnMKLSAgICAgd2hlcmUgaW5zaWRlIHRob3NlIHNlY3Rpb25zICJwYXRoX3ZhcmlhYmxlOiBwYXRoX3ZhbHVlIiBwYWlycyBjYW4gYmUKLSAgICAgc3BlY2lmaWVkLiBUaGVzZSBsaW5lcyBhcmUgY29udmVydGVkIHRvIHBhdGhfdmFyaWFibGU9J3BhdGhfdmFsdWUnLgotCi0gICopIEFkZCBhIERlZmF1bHRMYW5ndWFnZSBkaXJlY3RpdmUgc28gdGhhdCBmaWxlcyBtaXNzaW5nIGEgbGFuZ3VhZ2UKLSAgICAgZXh0ZW5zaW9uIChlLmcuLCAuZnIsIC5kZSkgY2FuIGJlIGxhYmVsbGVkIGFzIGJlaW5nIHNvbWUgb3RoZXIKLSAgICAgZGVmYXVsdCBsYW5ndWFnZS4gRGVmYXVsdExhbmd1YWdlIGNhbiBhcHBlYXIgaW4gPERpcmVjdG9yeT4gYW5kIAotICAgICA8RmlsZXM+IGNvbnRhaW5lcnMgYXMgd2VsbCBhcyAuaHRhY2Nlc3MgZmlsZXMuICBbUGF1bCBTdXR0b25dCi0gICAgIFBSIzExODAKLQotICAqKSBGaXggVEFSR0VUIGNvbmZpZ3VyYXRpb24gd2hlbiBjb25maWd1cmluZyBhbmQgaW5zdGFsbGluZyB1c2luZwotICAgICBBUEFDSSBjb25maWd1cmUuIFRBUkdFVCBub3cgZGVmaW5lcyB0aGUgYmFzZW5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgZmlsZSwgc3RhcnR1cCBzY3JpcHQsIG1hbnVhbCBwYWdlLCBldGMuIGxvZ19lcnJvcl9jb3JlKCkgbm93IHJlcG9ydHMKLSAgICAgdGhlIHNlcnZlciBiaW5hcnkgbmFtZSBnaXZlbiBieSBhcmd2WzBdLiBUQVJHRVQgY2FuIG5vdyBhbHNvIGJlIGRlZmluZWQKLSAgICAgd2l0aCAtLXRhcmdldD1UQVJHRVQgcGFyYW1ldGVyIHBhc3NlZCB0byBBUEFDSSBjb25maWd1cmUuCi0gICAgIFtSYWxmIEVuZ2Vsc2NoYWxsLCBSYW5keSBUZXJidXNoXQotCi0gICopIG1vZF9pbmNsdWRlLmM6aGFuZGxlX3BlcmwoKSBub3cgcHJvcGVybHkgdGVzdHMgZm9yIE9QVF9JTkNOT0VYRUMKLSAgICAgcmF0aGVyIHRoYW4gT1BUX0lOQ0xVREVTIFtSYWluZXIgU2Nob2VwZiA8c2Nob2VwZkB1bmktbWFpbnouZGU+XQotCi0gICopIGFwX21kNV9iaW5hcnkoKSB3YXMgdXNpbmcgc3ByaW50ZigpIHJhdGhlciB0aGFuIGEgdGFibGUgbG9va3VwCi0gICAgIHRvIGNvbnZlcnQgYmluYXJ5IGJ5dGVzIHRvIGhleCBkaWdpdHMuCi0gICAgIFtSb25hbGQgVHNjaGFs5HIgPHJvbmFsZEBpbm5vdmF0aW9uLmNoPl0gUFIjMzQwOQotCi0gICopIEZpeCBTRUdWIGluIFRDTiBuZWdvdGlhdGlvbiBpZiBubyB2YXJpYW50cyBhcmUgYWNjZXB0YWJsZS4KLSAgICAgW01hcnRpbiBQbGVjaHNtaWQgPHBsZWNoc21pQGthcmxpbi5tZmYuY3VuaS5jej5dIFBSIzE5ODcKLQotICAqKSBBUEk6IGFwX2V4aXN0c19jb25maWdfZGVmaW5lKCkgZnVuY3Rpb24gaXMgbm93ICJwdWJsaWMiIFtEb3VnIE1hY0VhY2hlcm5dCi0KLSAgKikgRml4IGRvY3VtZW50YXRpb24gb2YgYEFjdGlvbicgZGlyZWN0aXZlOiBJdCBjYW4gYWN0aXZhdGUgYSBDR0kgc2NyaXB0Ci0gICAgIHdoZW4gZWl0aGVyIGEgaGFuZGxlciBvciBhIE1JTUUgY29udGVudCB0eXBlIGlzIHRyaWdnZXJlZCBieSB0aGUgcmVxdWVzdC4KLSAgICAgW0FuZHJldyBQaW1sb3R0IDxwaW1sb3R0QG1hdGguaGFydmFyZC5lZHU+XSBQUiMzMzQwCi0KLSAgKikgRG9jdW1lbnQgdGhlIGBhZGQnIGNvbW1hbmQgb2YgYGRibW1hbmFnZScgaW4gYGRibW1hbmFnZS4xJyBtYW5wYWdlLgotICAgICBbRGF2aWQgTWFjS2VuemllIDxkam1AdXUubmV0Pl0gUFIjMzM5NAotCi0gICopIElnbm9yZSBhICJFcnJvckRvY3VtZW50IDQwMSIgZGlyZWN0aXZlIHdpdGggYSBmdWxsIFVSTCBhbmQgd3JpdGUgYQotICAgICBub3RpY2UgdG8gdGhlIGVycm9yIGxvZy4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIHNlbmQgYSA0MDEgcmVzcG9uc2UKLSAgICAgYW5kIGEgcmVkaXJlY3QgYXQgdGhlIHNhbWUgdGltZS4gIFtMYXJzIEVpbGVicmVjaHRdCi0KLSAgKikgRmFsbGJhY2sgdG8gbmF0aXZlIGNvbXBpbGVycyBmb3IgSVJJWC0zMiBwbGF0Zm9ybS4gSXQgc2VlbXMgdGhhdAotICAgICBhIGdjYyAyLjguMSBjb21waWxlZCBhcGFjaGUgaXMgbG9nZ2luZyBjbGllbnQgYWRkcmVzc2VzIHdpdGggYWxsCi0gICAgIGJpdHMgc2V0ICgyNTUuMjU1LjI1NS4yNTUpLiBUaGlzIGlzIHRoZSBzZWNvbmQgc3VjaCBwcm9ibGVtIGNhdXNlZAotICAgICBieSBnY2MgMi44LjEgY29tcGlsZXIuIFRoZSBmaXJzdCBiZWluZyBicm9rZW4gc2VtYXBob3JlIGxvY2tpbmcuCi0gICAgIFtSYW5keSBUZXJidXNoXQotCi0gICopIFVwZGF0ZWQgbWltZS50eXBlcyB0byByZWZsZWN0IGN1cnJlbnQgSW50ZXJuZXQgbWVkaWEgdHlwZXMKLSAgICAgYW5kIGluY2x1ZGUgYSBVUkwgdG8gdGhlIHJlZ2lzdHJ5LgotICAgICBbTWFub2ogS2FzaWNoYWludWxhLCBSb3kgRmllbGRpbmddIFBSIzIzODAsIDIyODYsIDIyNDYKLQotICAqKSBTRUNVUklUWTogRG8gYSBtb3JlIGNvbXBsZXRlIGNoZWNrIGluIG1vZF9pbmNsdWRlIHRvIGF2b2lkIAotICAgICBhbiBpbmZpbml0ZSBsb29wIG9mIHJlY3Vyc2l2ZSBTU0kgaW5jbHVkZXMuICBbTWFyYyBTbGVta29dIFBSIzMzMjMKLQotICAqKSBBZGQgQVBBQ0kgLS1zdWV4ZWMtZG9jcm9vdCBhbmQgLS1zdWV4ZWMtbG9nZmlsZSBvcHRpb25zIHdoaWNoIGNhbiBiZQotICAgICB1c2VkIHRvIHNldCB0aGUgZG9jdW1lbnQgcm9vdCBkaXJlY3RvcnkgKERPQ19ST09UKSBhbmQgdGhlIHN1ZXhlYwotICAgICBsb2dmaWxlIChMT0dfRVhFQyksIHJlc3BlY3RpdmVseS4gQWRkaXRpb25hbGx5IHRoZSAtLWxheW91dCBvcHRpb24KLSAgICAgd2FzIGNoYW5nZWQgdG8gc2hvdyBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdUVYRUMgc2V0dXAuCi0gICAgIFtMYXJzIEVpbGVicmVjaHRdIFBSIzMzMTYsIDMzNTcsIDMzNjEKLQotICAqKSBBZGRlZCB0aGUgbGFzdCB0d28gV2ViREFWIHN0YXR1cyBjb2RlcyBvZiA0MjQgKEZhaWxlZCBEZXBlbmRlbmN5KQotICAgICBhbmQgNTA3IChJbnN1ZmZpY2llbnQgU3RvcmFnZSkgZm9yIHVzZSBieSB0aGlyZC1wYXJ0eSBtb2R1bGVzLgotICAgICBbUm95IEZpZWxkaW5nXQotCi0gICopIEVuYWJsZWQgYWxsIG9mIHRoZSBXZWJEQVYgbWV0aG9kIG5hbWVzIGZvciB1c2UgYnkgdGhpcmQtcGFydHkKLSAgICAgbW9kdWxlcywgTGltaXQsIGFuZCBTY3JpcHQgZGlyZWN0aXZlcy4gIFRoYXQgaW5jbHVkZXMgUEFUQ0gsCi0gICAgIFBST1BGSU5ELCBQUk9QUEFUQ0gsIE1LQ09MLCBDT1BZLCBNT1ZFLCBMT0NLLCBhbmQgVU5MT0NLLgotICAgICBJbXByb3ZlZCBtb2RfYWN0aW9ucy5jIHNvIHRoYXQgaXQgY2FuIHVzZSBhbnkgb2YgdGhlIG1ldGhvZHMKLSAgICAgZGVmaW5lZCBpbiBodHRwZC5oLiAgQWRkZWQgYXBfbWV0aG9kX251bWJlcl9vZihtZXRob2QpIGZvcgotICAgICBnZXR0aW5nIHRoZSBpbnRlcm5hbCBtZXRob2QgbnVtYmVyLiAgW1JveSBGaWVsZGluZ10KLQotICAqKSBQT1JUOiBBZGQgYSBwb3J0IHRvIHRoZSBUUEYgT1MuIFtKb2UgTW9lbmljaCA8bW9lbmljaEB1cy5pYm0uY29tPiBhbmQKLSAgICAgb3RoZXJzIGF0IElCTV0KLQotICAqKSBGaXggcHJvYmxlbXMgd2l0aCBoYW5kbGluZyBvZiBVTkMgbmFtZXMgKGUuZy4sIFxcaG9zdFxwYXRoKQotICAgICBvbiBXaW4zMi4gIFtLZW4gUGFyenlnbmF0IDxrcGFyekB1cy5pYm0uY29tPl0KLQotICAqKSBSZXdvcmsgb3NfY2Fub25pY2FsXyooKSBvbiBXaW4zMiBzbyBpdCdzIHNpbXBsZXIsIG1vcmUKLSAgICAgcm9idXN0LCBhbmQgd29ya3MuICBbS2VuIFBhcnp5Z25hdCA8a3BhcnpAdXMuaWJtLmNvbT5dCi0gICAgIFBSIzI1NTUsIDI5MTUsIDMwNjQsIDMyMzIKLQotICAqKSBXb3JrIGFyb3VuZCBpbmNvbXBsZXRlIGltcGxlbWVudGF0aW9uIG9mIHN0cmZ0aW1lIG9uIFdpbjMyLgotICAgICBbTWFub2ogS2FzaWNoYWludWxhLCBLZW4gUGFyenlnbmF0IDxrcGFyekB1cy5pYm0uY29tPl0KLQotICAqKSBNb3ZlIGEgdHlwZWRlZiB0byBmaXggY29tcGlsZSBwcm9ibGVtcyBvbiBMaW51eCB3aXRoIDEueCBrZXJuZWxzLgotICAgICBbTWFub2ogS2FzaWNoYWludWxhXSBQUiMzMTc3Ci0KLSAgKikgUE9SVDogQWRkIGEgcG9ydCB0byB0aGUgQ29uY3VycmVudCBQb3dlck1BWCBPUy4gW1RvbSBIb3JzbGV5Ci0gICAgIDxUb20uSG9yc2xleUBtYWlsLmNjdXIuY29tPl0KLQotICAqKSBXSU4zMjogTG9nIG1vcmUgZXhwbGljaXQgZXJyb3IgbWVzc2FnZXMgaWYgc3Bhd25pbmcgYW4gaW50ZXJwcmV0ZWQgCi0gICAgIHNjcmlwdCBmYWlsZWQsIGluY2x1ZGluZyB0aGUgY29tbWFuZCBsaW5lIHVzZWQgdG8gYXR0ZW1wdCB0byBleGVjdXRlIAotICAgICB0aGUgaW50ZXJwcmV0ZXIgYW5kIHRoZSBXaW4zMiBlcnJvciBjb2RlIHJldHVybmVkLiAgW01hcmMgU2xlbWtvXQotCi0gICopIERpc2FibGUgc2VuZGluZyBvZiBlcnJvci1ub3RlcyBvbiBhIDUwMCAoSW50ZXJuYWwgU2VydmVyIEVycm9yKSByZXNwb25zZQotICAgICBzaW5jZSBpdCBvZnRlbiBpbmNsdWRlcyBmaWxlIHBhdGggaW5mby4gIEVuYWJsZSBzZW5kaW5nIG9mIGVycm9yLW5vdGVzCi0gICAgIG9uIGEgNTAxIChNZXRob2QgTm90IEltcGxlbWVudGVkKS4gIFtSb3kgRmllbGRpbmddIFBSIzMxNzMKLQotICAqKSBodHRwX2NvbmZpZy5jIHdvdWxkIHJlc3BvbmQgd2l0aCA1MDEgKE1ldGhvZCBOb3QgSW1wbGVtZW50ZWQpIGlmIGEKLSAgICAgY29udGVudCB0eXBlIGhhbmRsZXIgd2FzIHNwZWNpZmllZCBidXQgY291bGQgbm90IGJlIGZvdW5kLCB3aGljaAotICAgICBzaG91bGQgaGF2ZSBiZWVuIGEgNTAwIHJlc3BvbnNlLiAgTGlrZXdpc2UsIG1vZF9wcm94eS5jIHdvdWxkIHJlc3BvbnNkCi0gICAgIHdpdGggYSA1MDEgaWYgdGhlIFVSSSBzY2hlbWUgaXMgdW5yZWNvZ25pemVkIGluc3RlYWQgb2YgdGhlIGNvcnJlY3QKLSAgICAgcmVzcG9uc2Ugb2YgNDAzIChGb3JiaWRkZW4pLiAgW1JveSBGaWVsZGluZ10KLQotICAqKSBTRUNVUklUWTogRWxpbWluYXRlIERvUyBhdHRhY2sgd2hlbiBhIGJhZCBVUkkgcGF0aCBjb250YWlucyB3aGF0Ci0gICAgIGxvb2tzIGxpa2UgYSBwcmludGYgZm9ybWF0IGVzY2FwZS4gIFtNYXJjIFNsZW1rbywgU3R1ZGVudGVuIE5ldCBUd2VudGVdCi0KLSAgKikgRml4IGluIG1vZF9hdXRvaW5kZXg6IGZvciBmaWxlcyB3aGVyZSB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIHN0YW1wIHdhcwotICAgICB1bmF2YWlsYWJsZSwgYW4gZW1wdHkgc3RyaW5nIHdhcyBwcmludGVkIHdoaWNoIHdhcyAyIGJ5dGVzIHNob3J0LgotICAgICBUaGUgc2l6ZSBhbmQgZGVzY3JpcHRpb24gY29sdW1ucyB3ZXJlIHRoZXJlZm9yZSBub3QgYWxpZ25lZCBjb3JyZWN0bHkuCi0gICAgIFtNYXJ0aW4gS3JhZW1lcl0gKG5vIFBSIykKLQotICAqKSBVcGRhdGUgQlMyMDAwIE9TIGNvZGUgdG8gd29yayB3aXRoIHJlY2VudCB2ZXJzaW9ucy4gU3RhcnRpbmcgd2l0aAotICAgICByZWxlYXNlIEExNywgdGhlIGNoaWxkIGZvcmsoKSBtdXN0IGJlIHJlcGxhY2VkIGJ5IGEgX3Jmb3JrKCkuCi0gICAgIChCUzIwMDAgb25seSkgW01hcnRpbiBLcmFlbWVyXQotCi0gICopIEFkZCB0aGUgYWN0dWFsIHNlcnZlcl9yZWMgc3RydWN0dXJlIG9mIHRoZSBzcGVjaWZpYyBWaG9zdCB0byB0aGUKLSAgICAgc2NvcmVib2FyZCBmaWxlIGFuZCBhdm9pZCBhIHN0cmluZyBjb3B5IChhcyB3ZWxsIGFzIGFsbG93IHNvbWUKLSAgICAgZnVydGhlciBmdXR1cmUgZW5oYW5jZW1lbnRzKS4gW0hhcnJpZSBIYXpld2lua2VsCi0gICAgIDxoYXJyaWUuaGF6ZXdpbmtlbEBqcmMuaXQ+XQotCi0gICopIEFkZCBBUEFDSSAtLXBlcm11dGUtbW9kdWxlPWZvbzpiYXIgb3B0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvCi0gICAgIG9uLXRoZS1mbHkvYmF0Y2ggcGVybXV0ZSB0aGUgb3JkZXIgb2YgdHdvIG1vZHVsZXMgKG1vZF9mb28gYW5kIG1vZF9iYXIpCi0gICAgIGluIHRoZSBDb25maWd1cmF0aW9uWy5hcGFjaV0gZmlsZS4gVHdvIHNwZWNpYWwgYW5kIGltcG9ydGFudCB2YXJpYW50cyBhcmUKLSAgICAgc3VwcG9ydGVkIGZvciB0aGUgb3B0aW9uIGFyZ3VtZW50OiBmaXJzdCBCRUdJTjpmb28gd2hpY2ggcGVybXV0ZXMgbW9kdWxlCi0gICAgIG1vZF9mb28gd2l0aCB0aGUgYmVnaW4gb2YgdGhlIG1vZHVsZSBsaXN0LCBpLmUuIGl0IGBtb3ZlcycgdGhlIG1vZHVsZSB0bwotICAgICB0aGUgYmVnaW4gb2YgdGhlIGxpc3QgKGdpdmVzIGl0IGxvd2VzdCBwcmlvcml0eSkuICBBbmQgc2Vjb25kIGZvbzpFTkQKLSAgICAgd2hpY2ggcGVybXV0ZXMgbW9kX2ZvbyB3aXRoIHRoZSBlbmQgb2YgdGhlIG1vZHVsZSBsaXN0LCBpLmUuIGl0IGBtb3ZlcycKLSAgICAgdGhlIG1vZHVsZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IChnaXZlcyBpdCBoaWdoZXN0IHByaW9yaXR5KS4gCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIEZpeCBwcm9ibGVtIHdpdGggJ2FwYWNoZSAtayBzaHV0ZG93bicgYW5kIHN0YXJ0dXAgZXZlbnQKLSAgICAgc3luY2hyb25pc2F0aW9uIChXaW4zMikuICBbS2VuIFBhcnp5Z25hdCA8a3BhcnpAcmFsZWlnaC5pYm0uY29tPl0KLSAgICAgUFIjMzI1NQotCi0gICopIFRoZSBjb25maWcgcGFyc2VyIHdhc24ndCBjb3JyZWN0bHkgbm90aWNpbmcgYSBtaXNzaW5nICc+JwotICAgICBvbiBjb250YWluZXIgc3RhcnQgbGluZXMgKGUuZy4sIGl0IHdvdWxkbid0IHNwb3QKLSAgICAgIjxEaXJlY3RvcnkgLyIgYXMgYSBzeW50YXggZXJyb3IpLiAgW1J5YW4gQmxvb20gPHJiYmxvb21AdXMuaWJtLmNvbT5dCi0gICAgIFBSIzMyNzkKLQotICAqKSBBZGQgYSAnUmVtb3ZlSGFuZGxlcicgZGlyZWN0aXZlIHdoaWNoIHdpbGwgc2VsZWN0aXZlbHkgcmVtb3ZlCi0gICAgIGFsbCBoYW5kbGVyIGFzc29jaWF0aW9ucyBmb3IgdGhlIHNwZWNpZmllZCBmaWxlIGV4dGVuc2lvbnMuCi0gICAgIFtSeWFuIEJsb29tIDxyYmJsb29tQHVzLmlibS5jb20+XSBQUiMxNzk5LgotCi0gICopIFByb3Blcmx5IGhhbmRsZSAmIGFsbG93ICJudWwiIGFuZCAiLiovbnVsbCIgaW4gQWNjZXNzQ29uZmlnIGFuZAotICAgICBSZXNvdXJjZUNvbmZpZyBkaXJlY3RpdmVzIG9uIFdpbjMyLiAgQWxzbyBhZGQgYSBub3RlIHRvIHRoZSBlZmZlY3QKLSAgICAgb2YgJ3VzZWxlc3MgVXNlciBkaXJlY3RpdmUgaWdub3JlZCBvbiBXaW4zMicgdG8gdGhlIGVycm9ybG9nIGlmCi0gICAgIGEgVXNlciBkaXJlY3RpdmUgaXMgZW5jb3VudGVyZWQgb24gV2luMzIuCi0gICAgIFtLZW4gUGFyenlnbmF0IDxrcGFyekByYWxlaWdoLmlibS5jb20+XSBQUiMyMDc4LCAyMzAzLgotCi0gICopIEZpeCBtdWx0aXBsZSB3aGl0ZXNwYWNlIGhhbmRsaW5nIGluIGltYWdlbWFwcyBmb3IgbW9kX2ltYXAgd2hpY2ggd2FzCi0gICAgIGJyb2tlbiBzaW5jZSBBcGFjaGUgMS4zLjEgd2hlcmUgd2UgdG9vayBvdXQgY29tcHJlc3Npbmcgb2YgbXVsdGlwbGUKLSAgICAgc3BhY2VzIGluIGFwX2NmZ19nZXRsaW5lKCkuCi0gICAgIFtJdmFuIFJpY2h3YWxza2kgPGl2YW5Ac2VwcHVrdS5uZXQ+XSBQUiMzMjQ5Ci0KLSAgKikgRml4IEJlcmtlbGV5LURCLzIueCBzdXBwb3J0IGluIG1vZF9hdXRoX2RiOiBUaGUgZGF0YSBzdHJ1Y3R1cmVzIHdlcmUgbm90Ci0gICAgIGluaXRpYWxpemVkIGNvcnJlY3RseSBhbmQgdGhlIGRiX29wZW4oKSBjYWxsIHVzZWQgYW4gaW52YWxpZCBtb2RlCi0gICAgIHBhcmFtZXRlci4gW1JvbiBLbGF0Y2hrbyA8cm9uQGNrbS51Y3NmLmVkdT5dIFBSIzMxNzEKLQotICAqKSBQT1JUOiBEU08gc3VwcG9ydCBmb3IgVW5peFdhcmUgNwotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgUm9uIFJlY29yZCA8cnJAc2NvLmNvbT5dCi0KLSAgKikgTWVyZ2UgdGhlIGNvbnRlbnRzIG9mIHRoZSB7c3JtLGFjY2Vzc30uY29uZi1kaXN0KiBmaWxlcyBpbnRvIHRoZQotICAgICBodHRwZC5jb25mLWRpc3QqIGZpbGVzLiAgVGhlIHNybSBhbmQgYWNjZXNzIGZpbGVzIG5vdyBjb250YWluCi0gICAgIG9ubHkgY29tbWVudHMsIGFuZCBodHRwZC5jb25mIGhhcyBhbGwgdGhlIGNvbWJpbmVkIGNvbnRlbnRzIGluCi0gICAgIGEgcmF0aW9uYWwgb3JkZXIuICBbS2VuIENvYXJdCi0KLSAgKikgUE9SVDogRFNPL0VMRiBzdXBwb3J0IGZvciBGcmVlQlNEIDMuMC4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGwsIERpcmsgRnJvZW1iZXJnIDxpYmV4QHBoeXNpay5UVS1CZXJsaW4uREU+XQotICAKLSAgKikgQWRkIGEgImRlZmF1bHQtaGFuZGxlciIgaGFuZGxlciB0aGF0IGNhbGxzIHRoZSBkZWZhdWx0X2hhbmRlcigpCi0gICAgIGZ1bmN0aW9uIHdoaWNoIGlzIG5vcm1hbGx5IGNhbGxlZCBmb3Igc3RhdGljIGNvbnRlbnQuICBUaGlzIGFsbG93cwotICAgICB5b3UgdG8gb3ZlcnJpZGUgYSBzcGVjaWZpYyBoYW5kbGVyLiAgW01hcmMgU2xlbWtvXQotCi0gICopIEZ1cnRoZXIgc2ltcGxpZnkgY2hlY2tpbmcgZm9yIGFic29sdXRlIHBhdGhzIGJ5IHJlcGxhY2luZyBhbgotICAgICBoYXJkLWNvZGVkIHN5bnRheCBjaGVjayB3aXRoIGEgY2FsbCB0byBhIHJvdXRpbmUgd2UgYWxyZWFkeSBjcmVhdGVkIHRvCi0gICAgIGRvIHRoaXMuICBbS2VuIFBhcnp5Z25hdCA8a3BhcnpAcmFsZWlnaC5pYm0uY29tPl0gUFIjMjk3NiwgMzA3NAotCi0gICopIExvZyBhbiBlcnJvciBpZiB3ZSBlbmNvdW50ZXIgYSBtYWxmb3JtZWQgInJlcXVpcmUiIGRpcmVjdGl2ZSAKLSAgICAgaW4gbW9kX2F1dGggaWYgd2Uga25vdyB0aGF0IHdlIGtub3cgdGhhdCBubyBvdGhlciBtb2R1bGUgY2FuCi0gICAgIGRlYWwgd2l0aCBpdC4gIFtNYXJjIFNsZW1rb10KLQotICAqKSBSZW1vdmUgYXBfcHJpdmF0ZV9leHRlcm4gbWV0aG9kIG9mIGhpZGluZyBjb25mbGljdGluZyBzeW1ib2xzCi0gICAgIG9uIHRoZSBORVhUIHBsYXRmb3JtIGJlY2F1c2UgaXQgaXMgbm90IGNvcnJlY3QgZm9yIGFsbCB2ZXJzaW9ucywKLSAgICAgYW5kIHRoZSB2ZXJzaW9ucyBmb3Igd2hpY2ggaXQgaXMgY29ycmVjdCBhcmUgdW5rbm93bi4KLSAgICAgW1dpbGZyZWRvIFNhbmNoZXogPHdzYW5jaGV6QGFwcGxlLmNvbT5dCi0KLSAgKikgRml4IGluaGVyaXRhbmNlIG9mIEluZGV4T3B0aW9ucyBOYW1lV2lkdGggYW5kIHJlbW92ZSB1bmludGVuZGVkCi0gICAgIHJlc3RyaWN0aW9uIG9uICtOYW1lV2lkdGgsICtJY29uSGVpZ2h0LCBhbmQgK0ljb25XaWR0aC4gIFtLZW4gQ29hcl0KLQotICAqKSBGaXggcGVyLWRpcmVjdG9yeSBjb25maWcgbWVyZ2luZyBmb3IgY2FzZXMgaW4gd2hpY2ggYSA1MDAgZXJyb3IKLSAgICAgaXMgZW5jb3VudGVyZWQgaW4gYW4gLmh0YWNjZXNzIGZpbGUgc29tZXdoZXJlIGRvd24gdGhlIHRyZWUuCi0gICAgIFtLZW4gQ29hcl0gIFBSIzI0MDkKLQotICAqKSBNaW5vciBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCB0byBhcF9lc2NhcGVfaHRtbCgpLiBbUm95IEZpZWxkaW5nXQotCi0gICopIEZpeGVkIGEgc2VnbWVudGF0aW9uIHZpb2xhdGlvbiBpbiBtb2RfcHJveHkgd2hlbiBhIHJlc3BvbnNlIGlzCi0gICAgIG5vbi1jYWNoYWJsZS4gIFtSb3kgRmllbGRpbmcsIHRyYWNlZCBieSBEb3VnIEJsb2ViYXVtXS4gUFIjMjk1MCwgMzA1NgotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDEuMy4zCi0KLSAgKikgQWRkZWQgYSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRXhwZWN0IGhlYWRlciBmaWVsZCBhcwotICAgICBzcGVjaWZpZWQgaW4gcmV2LTA1IG9mIEhUVFAvMS4xLiAgRGlzYWJsZWQgdGhlIDEwMCBDb250aW51ZQotICAgICByZXNwb25zZSB3aGVuIHdlIGFscmVhZHkga25vdyB0aGUgZmluYWwgc3RhdHVzLCB3aGljaCBpcyBtaWdodHkKLSAgICAgdXNlZnVsIGZvciBQVVQgcmVzcG9uc2VzIHRoYXQgcmVzdWx0IGluIDMwMiBvciA0MDEuIFtSb3kgRmllbGRpbmddCi0KLSAgKikgUmVtb3ZlIGV4dHJhIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgZ2V0bGluZSByZXN1bHRzIGFzIHBhcnQKLSAgICAgb2YgdGhlIHByb3RvY29sIHByb2Nlc3NpbmcsIHdoaWNoIGlzIGV4dHJhIG5pY2UgYmVjYXVzZSBpdCB3b3JrcwotICAgICBiZXR3ZWVuIGNvbnRpbnVhdGlvbiBsaW5lcywgaXMgYWxtb3N0IG5vIGNvc3QgaW4gdGhlIG5vcm1hbCBjYXNlCi0gICAgIG9mIG5vIGV4dHJhIHdoaXRlc3BhY2UsIGFuZCBzYXZlcyBtZW1vcnkuIFtSb3kgRmllbGRpbmddCi0KLSAgKikgQWRkZWQgbmV3IEhUVFAgc3RhdHVzIGNvZGVzIGFuZCBkZWZhdWx0IHJlc3BvbnNlIGJvZGllcyBmcm9tIHRoZQotICAgICByZXZpc2VkIEhUVFAvMS4xICgzMDcsIDQxNiwgNDE3KSwgV2ViREFWICgxMDIsIDIwNywgNDIyLCA0MjMpLCBhbmQgCi0gICAgIEhUVFAgRXh0ZW5zaW9uIEZyYW1ld29yayAoNTEwKSBzcGVjaWZpY2F0aW9ucy4gIERpZCBub3QgYWRkIHRoZQotICAgICBXZWJEQVYgNDI0IGFuZCA0MjUgY29kZXMgYmVjYXVzZSB0aGV5IGFyZSBib2d1cy4gIFdlIGRvbid0IHVzZSBhbnkKLSAgICAgb2YgdGhlc2UgY29kZXMgeWV0LCBidXQgdGhleSBhcmUgbm93IGF2YWlsYWJsZSB0byAzcmQtcGFydHkgbW9kdWxlcy4KLSAgICAgW1JveSBGaWVsZGluZ10KLQotICAqKSBGaXggYSBwb3NzaWJsZSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIHRpbWVkLW91dCByZXF1ZXN0cyBhbmQgdGhlCi0gICAgIGFwX2JoYWxmZHVwbGV4IHNlbGVjdCB0aGF0IG1pZ2h0IHJlc3VsdCBpbiBhbiBpbmZpbml0ZSBsb29wIG9uCi0gICAgIHBsYXRmb3JtcyB0aGF0IGRvIG5vdCB2YWxpZGF0ZSB0aGUgZGVzY3JpcHRvci4gW1JveSBGaWVsZGluZ10KLQotICAqKSBXSU4zMjogQWRkICItayBzaHV0ZG93biIgYW5kICItayByZXN0YXJ0IiBvcHRpb25zIHRvIHNpZ25hbCBhCi0gICAgIHJ1bm5pbmcgQXBhY2hlIHNlcnZlciBbUGF1bCBTdXR0b25dCi0KLSAgKikgRml4IG1vZF9hdXRvaW5kZXggYnVnIHdoZXJlIGRpcmVjdG9yaWVzIGdvdCBhIHNpemUgb2YgIjBrIiBpbnN0ZWFkCi0gICAgIG9mICItIi4gIFtNYXJ0aW4gUGxlY2hzbWlkIDxwbGVjaHNtaUBrYXJsaW4ubWZmLmN1bmkuY3o+LCBNYXJjIFNsZW1rb10KLSAgICAgUFIjMzEzMAotCi0gICopIFBPUlQ6IERSUyA2MDAwIG1hY2hpbmUuIFtQYXVsIERlYmxlZWNrZXIgPHBkZWJsZWVja2VyQGpldGFpci5iZT5dCi0KLSAgKikgQWRkIHRoZSBzZXJ2ZXIgc2lnbmF0dXJlIHRleHQgKGZyb20gdGhlIGNvcmUgU2VydmVyU2lnbmF0dXJlIGRpcmVjdGl2ZSkKLSAgICAgdG8gdGhlIGxpc3Qgb2YgZW52YXJpYWJsZXMgYXZhaWxhYmxlIHRvIHNjcmlwdHMsIFNTSSwgYW5kIHRoZSBsaWtlLgotICAgICBbS2VuIENvYXJdCi0KLSAgKikgUE9SVDogRml4IHN5cy9yZXNvdXJjZS5oIGhhbmRsaW5nIGZvciBTQ08gMy54IHBsYXRmb3JtLgotICAgICBbTS4gTGFhayA8bWFlcnRAcHJvaW52LmVlPl0gUFIjMzEwOAotIAotICAqKSBGYWxsYmFjayBmcm9tIHN5c2NvbmYtYmFzZWQgdG8gcGxhaW4gSFotYmFzZWQgYHRpY2tzIHBlciBzZWNvbmQnCi0gICAgIGNhbGN1bGF0aW9uIGluIG1vZF9zdGF0dXMgZm9yIGFsbCBzeXN0ZW1zIHdoaWNoIGRvbid0IGhhdmUgUE9TSVgKLSAgICAgc3lzY29uZigpIChsaWtlIFVUUyAyLjEpIGFuZCBub3Qgb25seSBmb3IgdGhlIE5FWFQgcGxhdGZvcm0uCi0gICAgIFtEYXZlIER5a3N0cmEgPGR3ZEBiZWxsLWxhYnMuY29tPl0gUFIjMzA1NQotCi0gICopIEZpeCBgcmVxdWlyZSAuLi4nIGRpcmVjdGl2ZSBwYXJzaW5nIGluIG1vZF9hdXRoLCBtb2RfYXV0aF9kYm0gYW5kCi0gICAgIG1vZF9hdXRoX2RiIGJ5IHVzaW5nIGFwX2dldHdvcmRfd2hpdGUoKSAod2hpY2ggdXNlcyBhcF9pc3NwYWNlKCkpIAotICAgICBpbnN0ZWFkIG9mIGFwX2dldHdvcmQoLi4uLCAnICcpICh3aGljaCBwYXJzZXMgb25seSBhY2NvcmRpbmcgdG8gc3BhY2VzIAotICAgICBidXQgbm90IHRhYnMpLiAgW0phbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PiwgCi0gICAgIFJhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzMxMDUKLQotICAqKSBGaXggdGhlIFNFUlZFUl9OQU1FIHZhcmlhYmxlIHVuZGVyIHN1Yi1yZXF1ZXN0IHNpdHVhdGlvbnMgKHdoZXJlCi0gICAgIGBVc2VDYW5vbmljYWxOYW1lIG9mZicgaXMgdXNlZCkgbGlrZSBDR0kncyBjYWxsZWQgZnJvbSBTU0kgcGFnZXMgb3IKLSAgICAgUmV3cml0ZUNvbmQgdmFyaWFibGVzIGJ5IGFkb3B0aW5nIHItPmhvc3RuYW1lIHRvIHN1Yi1yZXF1ZXN0cy4KLSAgICAgW0phbWVzIEdyaW50ZXIgPGpyZ0BibG9kd2VuLmRlbW9uLmNvLnVrPl0gUFIjMzExMQotCi0gICopIEZpeCBzdGRlcnIgcmVkaXJlY3Rpb24gdW5kZXIgc3lzbG9nLWJhc2VkIGVycm9yIGxvZ2dpbmcgc2l0dWF0aW9uLgotICAgICBbWW91aWNoaXJvdSBLb2dhIDx5LWtvZ2FAanAuRnJlZUJTRC5vcmc+XSBQUiMzMDk1Ci0KLSAgKikgRG9jdW1lbnQgYEVycm9yTG9nIHN5c2xvZzpmYWNpbGl0eScgdmFyaWFudCBvZiBlcnJvciBsb2dnaW5nLgotICAgICBbWW91aWNoaXJvdSBLb2dhIDx5LWtvZ2FAanAuRnJlZUJTRC5vcmc+XSBQUiMzMDk2Ci0KLSAgKikgRml4IGh0dHA6Ly9sb2NhbGhvc3QvIGhpbnRzIGluIHRvcC1sZXZlbCBJTlNUQUxMIGRvY3VtZW50LgotICAgICBbUm9iIEplbnNvbiA8cm9iamVuQHNwb3RjaC5jb20+LCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMzMDg4Ci0KLSAgKikgUXVvdGUgcGF0aHMgaW4gZGVmYXVsdCBjb25maWd1cmF0aW9uIGZpbGVzLiAgW1dpbGZyZWRvIFNhbmNoZXpdCi0KLSAgKikgUE9SVDogUmVtb3ZlIGV4dHJhIEhBVkVfU1lTX1JFU09VUkNFX0ggZGVmaW5lIGZvciBSSEFQU09EWSBzaW5jZQotICAgICBpdCBpcyBub3cgdGFrZW4gY2FyZSBvZiBwcm9wZXJseSBieSB0aGUgaGVhZGVyIGZpbGUgdGVzdHMuCi0gICAgIFtXaWxmcmVkbyBTYW5jaGV6IDx3c2FuY2hlekBhcHBsZS5jb20+XQotCi0gICopIEZpeCBwcm9ibGVtIHdpdGggc2NyaXB0cyBhbmQgZmlsZWhhbmRsZSBpbmhlcml0YW5jZSBvbiBXaW4zMi4KLSAgICAgW0tlbiBQYXJ6eWduYXQgPGtwYXJ6QHJhbGVpZ2guaWJtLmNvbT5dICBQUiMyODg0LCAyOTEwCi0KLSAgKikgV2luMzIgbmFtZSBjYW5vbmljYWxpc2F0aW9uIGNvdWxkIGVuZCB1cCB1c2luZyB0aGUgc2VydmVyJ3MKLSAgICAgd29ya2luZyBkaXJlY3RvcnkgdG8gZmlsbCBpbiBzb21lIGJsYW5rcy4gIFtLZW4gUGFyenlnbmF0Ci0gICAgIDxrcGFyekByYWxlaWdoLmlibS5jb20+XSBQUiMzMDAxCi0KLSAgKikgQ29ycmVjdCBpbnZhbGlkIGFzc3VtcHRpb24gYnkgYXBfc3ViX3JlcV9sb29rdXBfZmlsZSgpIHRoYXQgYWxsCi0gICAgIGFic29sdXRlIHBhdGhzIGJlZ2luIHdpdGggIi8iIC0tIGJlY2F1c2UgdGhleSBkb24ndCBvbiBXaW4zMi4KLSAgICAgW0tlbiBQYXJ6eWduYXQgPGtwYXJ6QHJhbGVpZ2guaWJtLmNvbT5dIFBSIzI5NzYsIDMwNzQKLQotICAqKSBBZGQgW1JFRElSRUNUX11WQVJJQU5UUyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBtb2Rfc3BlbGluZwotICAgICBzbyB0aGF0IEVycm9yRG9jdW1lbnQgMzAwIHByb2Nlc3NvcnMgY2FuIHJlZm9ybWF0IHRoZSBsaXN0Ci0gICAgIGlmIGRlc2lyZWQuICBbS2VuIENvYXJdIFBSIzI4NTkKLQotICAqKSBBZGQgKy8tIGluY3JlbWVudGFsIHByZWZpeGVzIHRvIEluZGV4T3B0aW9ucyBrZXl3b3JkcywgYW5kCi0gICAgIGVuYWJsZSBtZXJnaW5nIG9mIG11bHRpcGxlIEluZGV4T3B0aW9ucyBkaXJlY3RpdmVzLiAgW0tlbiBDb2FyXQotCi0gICopIFBPUlQ6IEFsbG93IEd1ZXNzT1MgdG8gcmVjb2duaXplIFVuaXh3YXJlIDcuMC4xIFtTdGV2ZSBDYW1lcm9uCi0gICAgIDxzdGV2ZS5jYW1lcm9uQGNvbXBhcS5jb20+XQotCi0gICopIFJlY29uc3RydWN0ZWQgdGhlIGxvb3AgdGhyb3VnaCBtdWx0aXBsZSBodGFjY2VzcyBmaWxlIG5hbWVzIHNvCi0gICAgIHRoYXQgbWlzc2luZyBmaWxlcyBhcmUgbm90IGNvbmZ1c2VkIHdpdGggdW5yZWFkYWJsZSBmaWxlcy4KLSAgICAgW1JveSBGaWVsZGluZ10KLQotICAqKSBUaGUgYXBfcGZvcGVuIGFuZCBhcF9wZmRvcGVuIHJvdXRpbmVzIHdlcmUgZmFpbGluZyB0byBwcm90ZWN0IHRoZQotICAgICBlcnJubyBvbiBhbiBlcnJvciwgd2hpY2ggbGVhZHMgdG8gb25lIGVycm9yIGJlaW5nIG1pc3Rha2VuIGZvcgotICAgICBhbm90aGVyIHdoZW4gcmVhZGluZyBub24tZXhpc3RlbnQgLmh0YWNjZXNzIGZpbGVzLgotICAgICBbSmltIEphZ2llbHNraV0KLQotICAqKSBPUy8yOiBUaGUgbmV3IGhlYWRlciB0ZXN0cyBnZXQgdGhpbmdzIHJpZ2h0LCBuZWVkIHRvIHVwZGF0ZQotICAgICBhcF9jb25maWcuaC4gIFtCcmlhbiBIYXZhcmRdCi0KLSAgKikgVGhlIFBlcmwgJUVOViBoYXNoIHdpbGwgbm93IGJlIHNldHVwIGJ5IGRlZmF1bHQgd2hlbiB1c2luZyB0aGUKLSAgICAgbW9kX2luY2x1ZGUgYHBlcmwnIGNvbW1hbmQgW0RvdWcgTWFjRWFjaGVybl0KLQotICAqKSBQT1JUOiBBZGQgUHlyYW1pZCBEQy9PU3ggc3VwcG9ydCB0byBjb25maWd1cmF0aW9uIG1lY2hhbmlzbS4KLSAgICAgW0VhcmxlIEFrZSA8YWtlZUB3cGRpc3MxLndwYWZiLmFmLm1pbD5dCi0KLSAgKikgUE9SVDogRml4IHN5cy9yZXNvdXJjZS5oIGhhbmRsaW5nIGZvciBBbWRhaGwncyBVVFMgMi4xCi0gICAgIFtEYXZlIER5a3N0cmEgPGR3ZEBiZWxsLWxhYnMuY29tPl0gUFIjMzA1NAotCi0gICopIENvcnJlY3QgY29tbWVudCBpbiBtb2RfbG9nX2NvbmZpZy5jIGFib3V0IGl0cyBpbnRlcm5hbHMuCi0gICAgIFtFbGYgU3Rlcm5iZXJnIDxlbGZAaGFsY3lvbi5jb20+XQotCi0gICopIEF2b2lkIHBvc3NpYmxlIGxpbmUgb3ZlcmZsb3cgaW4gQ29uZmlndXJlOiBVc2UgYW4gYXdrZmlsZSB0bwotICAgICBoYW5kbGUgdGhlIGNyZWF0aW9uIG9mIG1vZHVsZXMuYyBbSmltIEphZ2llbHNraV0KLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjMuMgotCi0gICopIEZpeCBidWcgaW4gYXBfcmVtb3ZlX21vZHVsZSgpLCB3aGljaCBjYXVzZWQgcHJvYmxlbXMgZm9yIGRzbydzIAotICAgICB3aG8gd2VyZSB0aGUgdG9wX21vZHVsZS4gIFtEb3VnIE1hY0VhY2hlcm5dCi0KLSAgKikgQWRkIHN1cHBvcnQgZm9yIEJlcmtlbGV5LURCLzIueCAoaW4gYWRkaXRpb24gdG8gQmVya2VsZXktREIvMS54KSB0bwotICAgICBtb2RfYXV0aF9kYiB0byBib3RoIGJlIGZyaWVuZGx5IHRvIHVzZXJzIHdobyB3YW50cyB0byB1c2UgdGhpcyB2ZXJzaW9uCi0gICAgIGFuZCB0byBhdm9pZCBwcm9ibGVtcyB1bmRlciBwbGF0Zm9ybXMgd2hlcmUgb25seSB2ZXJzaW9uIDIueCBpcyBwcmVzZW50LgotICAgICBbRGFuIEphY29ib3dpdHogPGRyb3dAZmFsc2Uub3JnPiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBXaGVuIHVzaW5nIGFwX2xvZ19yZXJyb3IoKSwgbWFrZSB0aGUgZXJyb3IgbWVzc2FnZSBhdmFpbGFibGUgdG8gdGhlCi0gICAgICpFUlJPUl9OT1RFUyBlbnZhcmlhYmxlcyBieSBkZWZhdWx0LiAgW0tlbiBDb2FyXQotCi0gICopIEJTMjAwMCBwbGF0Zm9ybSBvbmx5OiBnZXQgcmlkIG9mIHRoZSBuYXN0eSBCUzIwMDBBdXRoRmlsZS4KLSAgICAgWW91IG5vdyBtdXN0IGRlZmluZSBhIEJTMjAwMEFjY291bnQgbmFtZSBmb3IgdGhlIHNlcnZlciBVc2VyLgotICAgICBUaGlzIGhhcyBmZXdlciBzZWN1cml0eSBpbXBsaWNhdGlvbnMgdGhhbiB0aGUgb2xkIGFwcHJvYWNoLgotICAgICBbTWFydGluIEtyYWVtZXJdCi0KLSAgKikgRml4IFNIQVJFRF9DT1JFIGZlYXR1cmUgZm9yIEhQVVggcGxhdGZvcm06IFdlIG5vdyB1c2UgZXh0ZW5zaW9uIGAuc2wnCi0gICAgIGluc3RlYWQgb2YgYC5zbycgYW5kIGBTSExJQl9QQVRIJyBpbnN0ZWFkIG9mIGBMRF9MSUJSQVJZX1BBVEgnIG9uIHRoaXMKLSAgICAgcGxhdGZvcm0gdG8gbWFrZSB0aGUgYnJhaW5kZWFkIEhQVVggbGlua2VyIGhhcHB5LiBOb3RpY2UsIGZvciB0aGUgbW9kdWxlCi0gICAgIERTT3Mgd2UgZG9uJ3QgaGF2ZSB0byB1c2UgdGhpcywgYmVjYXVzZSB0aGVzZSBhcmUgbG9hZGVkIG1hbnVhbGx5IChhbmQKLSAgICAgbm90IHZpYSBIUFVYJyBkbGQpLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjkwNSwgUFIjMjk2OAotCi0gICopIFJlbW92ZSA2NCB0aHJlYWQgbGltaXQgb24gV2luMzIuCi0gICAgIFtCaWxsIFN0b2RkYXJkIDxzdG9kZGFyZEByYWxlaWdoLmlibS5jb20+XQotCi0gICopIFJlbW92ZSByZWR1bmRhbnQgc3Vic3RpdHV0aW9ucyBpbiB0b3AtbGV2ZWwgTWFrZWZpbGUudG1wbC4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgRml4IEFQQUNJJ3MgYEdyb3VwJyBjb25maWd1cmF0aW9uIGFkanVzdG1lbnQgLSBlc3BlY2lhbGx5IGZvciBMaW51eAotICAgICBwbGF0Zm9ybXMgd2hlcmUgYG5vZ3JvdXAnIGV4aXN0cyBpbiAvZXRjL2dyb3VwLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLSAKLSAgKikgTWFrZSBQcmludFBhdGggd29yayBnZW5lcmljYWxseSBpbnN0ZWFkIG9mIGhhdmluZyBvbmUgdmVyc2lvbgotICAgICBzdHJpY3RseSBmb3IgT1MvMi4gW0ppbSBKYWdpZWxza2ksIEJyaWFuIEhhdmFyZF0KLQotICAqKSBGaXggdGhlIHJlY2VudGx5IGludHJvZHVjZWQgQyBoZWFkZXIgZmlsZSBjaGVja2luZzogV2Ugbm93IHVzZSB0aGUgQwotICAgICBwcmUtcHJvY2Vzc29yIHBhc3Mgb25seSAoYW5kIG5vIGxvbmdlciB0aGUgY29tcGxldGUgY29tcGlsZXIgcGFzcykgdG8KLSAgICAgZGV0ZXJtaW5lIHdoZXRoZXIgYSBDIGhlYWRlciBmaWxlIGV4aXN0cyBvciBub3QuIEJlY2F1c2Ugb25seSB0aGlzIHdheQotICAgICB3ZSdyZSBzYWZlIGFnYWluc3QgaW50ZXItaGVhZGVyIGRlcGVuZGVuY2llcyAod2hpY2ggY2F1c2VkIGhvcnJpYmxlCi0gICAgIHBvcnRhYmlsaXR5IHByb2JsZW1zKS4gVGhlIG9ubHkgZHJhd2JhY2sgaXMgdGhhdCB3ZSBub3cgaGF2ZSBhIENQUAotICAgICBjb25maWd1cmF0aW9uIHZhcmlhYmxlIHdoaWNoIGhhcyB0byBiZSBkZXRlcm1pbmVkIGZpcnN0ICh3ZSBkbyBhIHNpbWlsYXIKLSAgICAgYXBwcm9hY2ggYXMgR05VIEF1dG9jb25mIGRvZXMgaGVyZSkuIFdoZW4gYWxsIGZhaWxzIHRoZSB1c2VyIHN0aWxsIGhhcwotICAgICB0aGUgcG9zc2liaWxpdHkgdG8gb3ZlcnJpZGUgaXQgbWFudWFsbHkgdmlhIEFQQUNJIG9yIHNyYy9Db25maWd1cmF0aW9uLgotICAgICBBcyBhIGZhbGxiYWNrIGZvciB0aGUgaGVhZGVyIGNoZWNrIGl0c2VsZiB3ZSBjYW4gZGlyZWN0bHkgY2hlY2sgdGhlCi0gICAgIGV4aXN0YW5jZSBvZiB0aGUgZmlsZSB1bmRlciAvdXNyL2luY2x1ZGUsIHRvby4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI3NzcKLQotICAqKSBQT1JUOiBBZGRlZCBSSEFQU09EWSAoTWFjIE9TIFggU2VydmVyKSBzdXBwb3J0LiBNQVBfVE1QRklMRSBkZWZpbmVkCi0gICAgIGFzIGFuIGFsdGVybmF0ZSBtZWNoYW5pc20gZm9yIG1tYXAnZCBzaGFyZWQgbWVtb3J5IGZvciBSSEFQU09EWS4KLSAgICAgYXBfcHJpdmF0ZV9leHRlcm4gZGVmaW5lZCB0byBoaWRlIHN5bWJvbHMgdGhhdCBjb25mbGljdCB3aXRoIGxvYWRlZAotICAgICBkeW5hbWljIGxpYnJhcmllcyBvbiB0aGUgTkVYVCBhbmQgUkhBUFNPRFkgcGxhdGZvcm1zLgotICAgICBbV2lsZnJlZG8gU2FuY2hleiA8d3NhbmNoZXpAYXBwbGUuY29tPl0KLQotICAqKSBEZWxldGUgUElEIGZpbGUgb24gY2xlYW4gc2h1dGRvd25zLgotICAgICBbQ2hhcmxlcyBSYW5kYWxsIDxjcmFuZGFsbEBtYXRjaGxvZ2ljLmNvbT5dIFBSIzI5NDcKLQotICAqKSBGaXggbW9kX2F1dGhfKi5odG1sIGRvY3VtZW50czogTlNDQSAtPiBOQ1NBCi0gICAgIFtZb3VpY2hpcm91IEtvZ2EgPHkta29nYUBqcC5GcmVlQlNELm9yZz5dIFBSIzI5OTEKLQotICAqKSBGaXggSU5TVEFMTCBkb2N1bWVudDogd3d3LmdudS5haS5taXQuZWR1IC0+IHd3dy5nbnUub3JnCi0gICAgIFtLYXJsIEJlcnJ5IDxrYXJsQGdudS5vcmc+XSBQUiMyOTk0Ci0KLSAgKikgRml4IGRibW1hbmFnZS4xIG1hbnVhbCBwYWdlLgotICAgICBbWW91aWNoaXJvdSBLb2dhIDx5LWtvZ2FAanAuRnJlZUJTRC5vcmc+XSBQUiMyOTkyCi0gICAgIAotICAqKSBGaXggcG9zc2libGUgYnVmZmVyIG92ZXJmbG93IHNpdHVhdGlvbiBpbiBzdWV4ZWMuYy4KLSAgICAgW0plZmYgU3Rld2FydCA8andzQHB1cmR1ZS5lZHU+XSBQUiMyNzkwCi0KLSAgKikgQWRkIHNvbWUgbW9yZSBMSUJTIGZvciB0aGUgU0NPNSBwbGF0Zm9ybSB3aGljaCBhcmUgbmVlZGVkIGZvciB0aGUgYWxyZWFkeQotICAgICB1c2VkIC1scHJvdC4gSXQncyBhY3R1YWxseSBhIGJ1ZyBpbiBTQ081LCBvZiBjb3Vyc2UuCi0gICAgIFtSb25hbGQgUmVjb3JkIDxyckBzY28uY29tPl0gUFIjMjUzMwotCi0gICopIEZpeCBkb2N1bWVudGF0aW9uIG9mIFByb3h5UGFzcy9Qcm94eVBhc3NSZXZlcnNlIGFjY29yZGluZyB0byB0aGUKLSAgICAgdHJhaWxpbmcgc2xhc2ggcHJvYmxlbS4gW0pvbiBEcnVrbWFuIDxqc2RAZ2FtZXNwb3QuY29tPl0gUFIjMjkzMwotICAKLSAgKikgUmVtb3ZlIGAtbXN5bScgb3B0aW9uIGZyb20gTERGTEFHU19TSExJQiBmb3IgdGhlIERpZ2l0YWwgVU5JWCAoT1NGLzEpCi0gICAgIHBsYXRmb3JtLCBiZWNhdXNlIGl0J3Mgb25seSBzdXBwb3J0ZWQgdW5kZXIgdmVyc2lvbiA0LjAgYW5kIGhpZ2hlci4gQnV0Ci0gICAgIGJlY2F1c2Ugb3VyIEd1ZXNzT1MgaXMgc3RpbGwgdW5hd2FyZSBvZiBEaWdpdGFsIFVOSVggdmVyc2lvbnMgYW5kIHRoZQotICAgICAtbXN5bSBpcyBqdXN0IHRvIG9wdGltaXplIHRoZSBEU08gc3RhdHVwIHRpbWUgYSBsaXR0bGUgYml0IGl0J3Mgc2FmZSBhbmQKLSAgICAgYmVzdCB3aGVuIHdlIGxlYXZlIGl0IG91dCBub3cuICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjk2OQotCi0gICopIEZpeCB0aGUgYXBfbG9nX2Vycm9yX29sZCgpLCBhcF9sb2dfdW5peGVycigpIGFuZCBhcF9sb2dfcHJpbnRmKCkKLSAgICAgZnVuY3Rpb25zOiBGaXJzdCBhbGwgdGhyZWUgZnVuY3Rpb25zIG5vIGxvbmdlciBmYWlsIG9uIHN0cmluZ3MgY29udGFpbmluZwotICAgICAiJSIgY2hhcnMgYW5kIHNlY29uZCBhcF9sb2dfcHJpbnRmKCkgbm8gbG9uZ2VyIGRvZXMgYSBkb3VibGUtZm9ybWF0dGluZwotICAgICAoaW5zdGVhZCBpdCBkaXJlY3RseSBwYXNzZXMgdGhyb3VnaCB0aGUgbWVzc2FnZSB0byBiZSBmb3JtYXR0ZWQgdG8gdGhlCi0gICAgIHJlYWwgaW50ZXJuYWwgZm9ybWF0dGluZyBmdW5jdGlvbikuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyOTQxCi0KLSAgKikgQWxsb3cgIkluY2x1ZGUiIGRpcmVjdGl2ZXMgYW55d2hlcmUgaW4gdGhlIHNlcnZlciBjb25maWcKLSAgICAgZmlsZXMgKGJ1dCBub3QgLmh0YWNjZXNzIGZpbGVzKS4gIFtLZW4gQ29hcl0gUFIjMjcyNwotCi0gICopIFRoZSBwcm94eSB3YXMgcmVmdXNpbmcgdG8gc2VydmUgQ09OTkVDVCByZXF1ZXN0cyBleGNlcHQgdG8KLSAgICAgcG9ydCA0NDMgKGh0dHBzOi8vKSBhbmQgNTYzIChzbmV3czovLykuIFRoZSBuZXcgQWxsb3dDT05ORUNUCi0gICAgIGRpcmVjdGl2ZSBhbGxvd3MgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHBvcnRzIHRvIHdoaWNoIGEKLSAgICAgQ09OTkVDVCBpcyBhbGxvd2VkLiAgW1NhbWVlciBQYXJla2gsIE1hcnRpbiBLcmFlbWVyXQotCi0gICopIG1vZF9leHBpcmVzIHdpbGwgbm93IGFjdCBvbiBjb250ZW50IHRoYXQgaXMgbm90IHNlbnQgZnJvbSBhIGZpbGUKLSAgICAgb24gZGlzay4gIFByZXZpb3VzbHkgaXQgd291bGQgbmV2ZXIgYWRkIGFuIEV4cGlyZXM6IGhlYWRlciB0bwotICAgICBhbnkgcmVzcG9uc2UgdGhhdCBkaWQgbm90IGNvbWUgZnJvbSBhIGZpbGUgb24gZGlzazsgdGhlIG9ubHkKLSAgICAgY2FzZSB3aGVyZSBpdCBzdGlsbCBkb2Vzbid0IChhbmQgY2FuJ3QpIGFkZCBvbmUgZm9yIHRoYXQgdHlwZSBvZiAKLSAgICAgY29udGVudCBpcyBpZiB5b3UgYXJlIHVzaW5nIGEgbW9kaWZpY2F0aW9uIGRhdGUgYmFzZWQgc2V0dGluZy4gIAotICAgICBbTWFyYyBTbGVta28sIFBhdWwgUGhpbGxpcHMgPHBhdWxwQGdvMm5ldC5jb20+XQotCi0gICopIFByb2JsZW1zIGVuY291bnRlcmVkIGR1cmluZyAuaHRhY2Nlc3MgcGFyc2luZyBvciBDR0kgZXhlY3V0aW9uCi0gICAgIHRoYXQgbGVhZCB0byBhICI1MDAgU2VydmVyIEVycm9yIiBjb25kaXRpb24gbm93IHByb3ZpZGUgZXhwbGFuYXRvcnkKLSAgICAgdGV4dCAoaW4gdGhlICpFUlJPUl9OT1RFUyBlbnZhcmlhYmxlKSB0byBFcnJvckRvY3VtZW50IDUwMCBzY3JpcHRzLgotICAgICBbS2VuIENvYXJdIFBSIzEyOTEKLQotICAqKSBBZGQgTmFtZVdpZHRoIGtleXdvcmQgdG8gSW5kZXhPcHRpb25zIGRpcmVjdGl2ZSBzbyB0aGF0IHRoZQotICAgICB3aWR0aCBvZiB0aGUgZmlsZW5hbWUgY29sdW1uIGlzIGN1c3RvbWlzYWJsZS4gIFtLZW4gQ29hciwgRGVhbiBHYXVkZXRdCi0gICAgIFBSIzE5NDksIDIzMjQuCi0KLSAgKikgUmVjb2duaXplIGxvd2VyY2FzZSBfYW5kXyB1cHBlcmNhc2UgYHVuYW1lJyByZXN1bHRzIHVuZGVyCi0gICAgIFNDTyBPcGVuU2VydmVyLiBbRGF2aWQgQ29lbGhvIDxkcmNAcHB0LmNvbT5dCi0KLSAgKikgQXMgZHVwbGljYXRlICJIVFRQLzEuMCAyMDAgT0siIGxpbmVzIHdpdGhpbiB0aGUgaGVhZGVyIHNlZW0gdG8gYmUKLSAgICAgYSBjb21tb24gcHJvYmxlbSBvZiAobWlzLWFkbWluaXN0cmF0ZWQ/KSBJSVMgc2VydmVycywgbWFrZSB0aGUgYXBhY2hlCi0gICAgIHByb3h5IGltbXVuZSB0byB0aGVzZSBlcnJvcnMgKGFuZCBpZ25vcmUgdGhlIGR1cGxpY2F0ZXMsIGJ1dCBsb2cKLSAgICAgdGhlIGZhY3QgdG8gZXJyb3JfbG9nKS4gW01hcnRpbiBLcmFlbWVyXSwgYWZ0ZXIgdGhlIHByb3Bvc2FsIGluIFBSIzI5MTQgCi0gICAgIAotICAqKSBUaGUgPElmTW9kdWxlIGFuZCA8SWZEZWZpbmUgYmxvY2sgc3RhcnRpbmcgZGlyZWN0aXZlcyBub3cgb25seQotICAgICBhbGxvdyBleGFjdGx5IG9uZSBhcmd1bWVudC4gUHJldmlvdXNseSwgdGhlIG9wdGlvbmFsIG5lZ2F0aW9uCi0gICAgIGNoYXJhY3RlciAnIScgY291bGQgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2Ugd2l0aG91dCBhIHN5bnRheAotICAgICBlcnJvciBiZWluZyByZXBvcnRlZCwgYWxiZWl0IGRlZmVhdGluZyB0aGUgSWZNb2R1bGUgZnVuY3Rpb25hbGl0eQotICAgICAoZW5jbG9zZWQgZGlyZWN0aXZlcyB3b3VsZCBBTFdBWVMgYmUgZXhlY3V0ZWQpLiBCeSB1c2luZyB0aGUKLSAgICAgc3RyaWN0ZXIgc3ludGF4LCB0aGVzZSBoYXJkLXRvLXRyYWNrIGVycm9ycyBjYW4gYmUgYXZvaWRlZC4KLSAgICAgW01hcnRpbiBLcmFlbWVyXQotCi0gICopIFNpbXBsaWZ5IGhhbmRsaW5nIG9mIEluZGV4T3B0aW9ucyBpbiBtb2RfYXV0b2luZGV4IC0tIGFuZCBCVFcKLSAgICAgY2F1c2UgdGhlIHN0YW5kYWxvbmUgRmFuY3lJbmRleGluZyBkaXJlY3RpdmUgdG8gbG9naWNhbGx5IE9SCi0gICAgIGludG8gYW55IGV4aXN0aW5nIEluZGV4T3B0aW9ucyBzZXR0aW5ncyByYXRoZXIgdGhhbiB3aXBpbmcKLSAgICAgdGhlbSBvdXQuICBbS2VuIENvYXJdCi0KLSAgKikgQ2hhbmdlcyBpbiBmdHAgcHJveHk6IG1ha2UgVVJMIHBhcnNpbmcgc2ltcGxlciBieSB1c2luZyB0aGUKLSAgICAgcGFyc2VkX3VyaSBzdHVmZi4KLSAgICAgKyBBZGQgZGlzcGxheSBvZiB0aGUgImN1cnJlbnQgZGlyZWN0b3J5IiBpbiBjYXNlcyB3aGVyZSBpdCdzCi0gICAgIGRpZmZlcmVudCBmcm9tIHRoZSBzdXBwbGllZCBwYXRoIChlLmcuLCBmdHA6Ly91c2VyQGhvc3QvIGxpdmVzCi0gICAgIGluIC9ob21lL3VzZXIsIG5vdCBpbiAvLCB0aGVyZWZvcmUgY2xpY2tpbmcgb24gIi4uLyIgaW4gdGhlCi0gICAgIHN0YXJ0aW5nIGRpcmVjdG9yeSBtaWdodCBzZW5kIHVzIHRvIC9ob21lLykuCi0gICAgICsgV2hlbiBmdHAgbG9naW4gZmFpbHMsIChlc3AuIHdoZW4gYSB1c2VyIG5hbWUgd2FzIHBhcnQgb2YgdGhlCi0gICAgIFVSTCBhbHJlYWR5KSwgd2Ugbm93IHJldHVybiBbNDAxIFVuYXV0aG9yaXplZCBdIHRvIGFsbG93IHRoZQotICAgICBicm93c2VyIHRvIHBvcCB1cCBhbiBhdXRob3JpemF0aW9uIGRpYWxvZy4gVGhpcyBtYWtlcyBwYXNzd29yZHMKLSAgICAgc2xpZ2h0bHkgbGVzcyB2aXNpYmxlICh0aGV5IGRvbid0IGFwcGVhciBpbiB0aGUgcmVndWxhciBsb2cgZmlsZXMpCi0gICAgIGFuZCBpbXBsZW1lbnRzIGEgZnVuY3Rpb25hbGl0eSB0aGF0IG90aGVyIHd3dyBwcm94eSBzZXJ2ZXJzCi0gICAgIGFscmVhZHkgb2ZmZXJlZC4KLSAgICAgW01hcnRpbiBLcmFlbWVyXQotCi0gICopIFRyaWdnZXJlZCBieSB0aGUgcmVjZW50ICJWaWE6IiBoZWFkZXIgY2hhbmdlcywgdGhlIHByb3h5IG1vZHVsZSB3b3VsZAotICAgICBkdW1wIGNvcmUgZm9yIHJlcGxpZXMgd2l0aCBpbnZhbGlkIGhlYWRlcnMgKGUuZy4sIGR1cGxpY2F0ZQotICAgICAiSFRUUC8xLjAgMjAwIE9LIiBsaW5lcykuIFRoZXNlIGVycm9ycyBhcmUgbm93IGxvZ2dlZCBhbmQgdGhlCi0gICAgIGNvcmUgZHVtcCBpcyBhdm9pZGVkLiBBbHNvLCBicm9rZW4gcmVwbGllcyBhcmUgbm90IGNhY2hlZC4KLSAgICAgW01hcnRpbiBLcmFlbWVyXSBQUiMyOTE0Ci0KLSAgKikgbmV3IGBHcHJvZkRpcicgZGlyZWN0aXZlIHdoZW4gY29tcGlsZWQgd2l0aCAtREdQUk9GLCB3aGVyZSBncHJvZiBjYW4KLSAgICAgcGxvcCBnbW9uLm91dCBwcm9maWxlIGRhdGEgZm9yIGVhY2ggY2hpbGQgW0RvdWcgTWFjRWFjaGVybl0KLSAgIAotICAqKSBVc2UgdGhlIGNvbnN0cnVjdCBgYCIkQCInJyBpbnN0ZWFkIG9mIGBgJConJyBpbiB0aGUgZ2VuZXJhdGVkCi0gICAgIGNvbmZpZy5zdGF0dXMgc2NyaXB0IHRvIGJlIGltbXVuZSBhZ2FpbnN0IGFyZ3VtZW50cyB3aXRoIHdoaXRlc3BhY2VzLgotICAgICBbWXZlcyBBcnJvdXllIDx5dmVzQGFwcGxlLmNvbT5dIFBSIzI4NjYKLQotICAqKSBSZXBsYWNlIHRoZSBpbmxpbmVkIGluZm9ybWF0aW9uIGdyYWJiaW5nIHN0dWZmIGZvciB0aGUgY29uZmlndXJhdGlvbgotICAgICBhZGp1c3RtZW50IGZlYXR1cmUgKG5vIC0td2l0aG91dC1jb25mYWRqdXN0KSB3aXRoIGNhbGxzIHRvIGEgbmV3IGhlbHBlcgotICAgICBzY3JpcHQgYGJ1aWxkaW5mby5zaCcgd2hpY2ggaXMgYm90aCBtb3JlIGZsZXhpYmxlIGFuZCBhbHJlYWR5IHByb29mZWQgdG8KLSAgICAgYmUgbW9yZSByb2J1c3QgYWdhaW5zdCBwbGF0Zm9ybSBkaWZmZXJlbmNlcy4gVGhpcyBtYWlubHkgZml4ZXMgdGhlCi0gICAgIHJlY2VudGx5IG9jY3VyZWQgYGBzZWQ6IGNvbW1hbmQgZ2FyYmxlZDogLi4uJycgcHJvYmxlbXMuCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyNzc2LCBQUiMyODQ4Ci0KLSAgKikgTWFrZSBhYi5jIGFnYWluIHBhc3MgYGBnY2MgLVdhbGwgLVdzaGFkb3cgLVdwb2ludGVyLWFyaXRoIC1XY2FzdC1hbGlnbgotICAgICAtV21pc3NpbmctcHJvdG90eXBlcyAtV21pc3NpbmctZGVjbGFyYXRpb25zIC1XbmVzdGVkLWV4dGVybnMgLVdpbmxpbmUnJwotICAgICB3aXRob3V0IGNvbXBsYWlucyBhZnRlciB3ZSByZWNlbnRseSBhZGRlZCB0aGUgUE9TVCBmZWF0dXJlLgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBSZW5hbWVkIGlzX0hUVFBfeHh4KCkgbWFjcm9zIHRvIGFwX2lzX0hUVFBfeHh4KCkgbmFtZS4gVGhleSBhcmUgdXNlZCBpbnNpZGUKLSAgICAgbW9kdWxlcyBhcyBBUEkgZnVuY3Rpb25zIGFuZCB3ZSBmb3Jnb3QgdGhlbSBhdCB0aGUgYmlnIHN5bWJvbCByZW5hbWluZy4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgUmVtb3ZlIGJhZCByZWZlcmVuY2UgdG8gbm9uLWV4aXN0aW5nIFNFUlZFUl9WRVJTSU9OIGluIG1vZF9yZXdyaXRlLmh0bWwKLSAgICAgW1lvdWljaGlyb3UgS29nYSA8eS1rb2dhQGpwLkZyZWVCU0QuT1JHPl0gUFIjMjg5NQotCi0gICopIER5bmFtaWNhbGx5IHNpemUgdGhlIGZpbGVuYW1lIGNvbHVtbiBvZiBtb2RfYXV0b2luZGV4IG91dHB1dC4KLSAgICAgW0RlYW4gR2F1ZGV0XQotCi0gICopIEFkZCB0aGUgYWJpbGl0eSB0byBkbyBQT1NUIHJlcXVlc3RzIHRvIHRoZSBhYiBiZW5jaG1hcmtpbmcgdG9vbC4KLSAgICAgW0t1cnQgU3Vzc21hbiA8a2xzQGJlc3QuY29tPl0gUFIjMjg3MQotCi0gICopIEJ1bXAgdXAgTUFYX0VOVl9GTEFHUyBpbiBtb2RfcmV3cml0ZS5oIGZyb20gdGhlIHRvbyBjb25zZXJ2YXRpY2UgbGltaXQgb2YKLSAgICAgNSB0byAxMCBiZWNhdXNlIHRoZXJlIGFyZSBzb21lIHVzZXJzIG91dCB0aGVyZSB3aG8gYWx3YXlzIGhhdmUgNSB0byA4Ci0gICAgIHZhcmlhYmxlcyBpbiBvbmUgUmV3cml0ZVJ1bGUgYW5kIGhhZCB0byBwYXRjaCBtb2RfcmV3cml0ZS5oIGZvciBldmVyeQotICAgICByZWxlYXNlLiBTbyAxNSBzaG91bGQgYmUgbm93IG1vcmUgdGhhbiBlbm91Z2gsIGV2ZW4gZm9yIHRoZW0uIChJIG5ldmVyCi0gICAgIG5lZWRlZCBtb3JlIHRoYW4gNCBpbiBteSBSZXdyaXRlUnVsZXMgOy0pCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIE1ha2UgdGhlIHByb3h5IGdlbmVyYXRlIGFuZCB1bmRlcnN0YW5kIFZpYTogaGVhZGVycwotICAgICBbTWFydGluIEtyYWVtZXJdCi0KLSAgKikgQ2hhbmdlIHRoZSBwcm94eSB0byB1c2UgdGFibGVzIGluc3RlYWQgb2YgYXJyYXlfaGVhZGVycyBmb3IKLSAgICAgdGhlIGhlYWRlciBsaW5lcy4gW01hcnRpbiBLcmFlbWVyXQotCi0gICopIE1ha2Ugc3VyZSB0aGUgY29uZmlnLnN0YXR1cyBmaWxlIGlzIG5vdCBvdmVycmlkZGVuIHdoZW4ganVzdAotICAgICBgYGNvbmZpZ3VyZSAtLWhlbHAnJyBpcyB1c2VkLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjg0NAotCi0gICopIFNwbGl0IE1PRFVMRV9NQUdJQ19OVU1CRVIgaW50byBfTUFKT1IvX01JTk9SIG51bWJlcnMuIFRoaXMgc2hvdWxkCi0gICAgIHByb3ZpZGUgYSB3YXkgdG8gdHJhY2UgQVBJIGNoYW5nZXMgdGhhdCBhZGQgZnVuY3Rpb25hbGl0eSBidXQgZG8KLSAgICAgbm90IGNyZWF0ZSBhIGNvbXBhdGliaWxpdHkgaXNzdWUgZm9yIHByZWNvbXBpbGVkIG1vZHVsZXMsIGV0Yy4KLSAgICAgU2VlIGluY2x1ZGUvYXBfbW1uLmggZm9yIG1vcmUgZGV0YWlscy4gIFtSYW5keSBUZXJidXNoXQotCi0gICopIEZpeCBzdWV4ZWMgaW5zdGFsbGF0aW9uIHVuZGVyIGBtYWtlIGluc3RhbGwgcm9vdD14eHgnIHNpdHVhdGlvbi4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgRXh0ZW5kIHRoZSBvdXRwdXQgb2YgdGhlIC1WIHN3aXRjaCB0byBpbmNsdWRlIHRoZSBwYXRocyBvZiBhbGwKLSAgICAgY29tcGlsZWQtaW4gY29uZmlndXJhdGlvbiBmaWxlcywgaWYgdGhleSB3ZXJlIG92ZXJyaWRkZW4gYXQKLSAgICAgY29tcGlsZSB0aW1lLCBmb3IgbGVhc3QgYXN0b25pc2htZW50IG9mIHRoZSB1c2VyLgotICAgICBbTWFydGluIEtyYWVtZXJdCi0KLSAgKikgV2hlbiBSRUFEaW5nIGEgcmVxdWVzdCBpbiBFeHRlbmRlZFN0YXR1cyBtb2RlLCB0aGUgIm9sZCIKLSAgICAgdmhvc3QsIHJlcXVlc3QgYW5kIGNsaWVudCBpbmZvcm1hdGlvbiBpcyBub3QgZGlzcGxheWVkLgotICAgICBbSmltIEphZ2llbHNraV0KLQotICAqKSBTVEFUVVMgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS4gRnVsbCBzdGF0dXMgaW5mb3JtYXRpb24gbm93Ci0gICAgIHJ1bi10aW1lIGNvbmZpZ3VyYWJsZSB1c2luZyB0aGUgRXh0ZW5kZWRTdGF0dXMgZGlyZWN0aXZlLgotICAgICBbSmltIEphZ2llbHNraV0KLQotICAqKSBTRUNVUklUWTogRWxpbWluYXRlIE8obl4yKSBzcGFjZSBEb1MgYXR0YWNrcyAoYW5kIG90aGVyIE8obl4yKQotICAgICBjcHUgdGltZSBhdHRhY2tzKSBpbiBoZWFkZXIgcGFyc2luZy4gIEFkZCBhcF9vdmVybGFwX3RhYmxlcygpLAotICAgICBhIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gYnVsayB1cGRhdGUgb3BlcmF0aW9ucwotICAgICBvbiB0YWJsZXMgaW4gYSBtb3JlIGVmZmljaWVudCBtYW5uZXIuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgU0VDVVJJVFk6IEFkZGVkIGNvbXBpbGUtdGltZSBhbmQgY29uZmlndXJhYmxlIGxpbWl0cyBmb3IKLSAgICAgdmFyaW91cyBhc3BlY3RzIG9mIHJlYWRpbmcgYSBjbGllbnQgcmVxdWVzdCB0byBhdm9pZCBzb21lIHNpbXBsZQotICAgICBkZW5pYWwgb2Ygc2VydmljZSBhdHRhY2tzLCBpbmNsdWRpbmcgbGltaXRzIG9uIG1heGltdW0gcmVxdWVzdC1saW5lCi0gICAgIHNpemUgKExpbWl0UmVxdWVzdExpbmUpLCBudW1iZXIgb2YgaGVhZGVyIGZpZWxkcyAoTGltaXRSZXF1ZXN0RmllbGRzKSwKLSAgICAgYW5kIHNpemUgb2YgYW55IG9uZSBoZWFkZXIgZmllbGQgKExpbWl0UmVxdWVzdEZpZWxkc2l6ZSkuICBBbHNvIGFkZGVkCi0gICAgIGEgY29uZmlndXJhYmxlIGRpcmVjdGl2ZSBMaW1pdFJlcXVlc3RCb2R5IGZvciBsaW1pdGluZyB0aGUgc2l6ZSBvZiB0aGUKLSAgICAgcmVxdWVzdCBtZXNzYWdlIGJvZHkuICBbUm95IEZpZWxkaW5nXQotCi0gICopIE1ha2Ugc3RhdHVzIG1vZHVsZSBhd2FyZSBvZiBETlMgYW5kIGxvZ2dpbmcgc3RhdGVzLCBldmVuIGlmCi0gICAgIFNUQVRVUyBub3QgZGVmaW5lZC4gIFtKaW0gSmFnaWVsc2tpXQotCi0gICopIEZpeCBhIHByb2JsZW0gd2l0aCB0aGUgbmV3IE9TLzIgbXV0ZXhlcy4gIFtCcmlhbiBIYXZhcmRdCi0KLSAgKikgRW5oYW5jZSBtb2Rfc3BlbGluZyBzbyB0aGF0IENoZWNrU3BlbGxpbmcgY2FuIGJlIHVzZWQgaW4KLSAgICAgPERpcmVjdG9yeT4gY29udGFpbmVycyBhbmQgLmh0YWNjZXNzIGZpbGVzLiAgW0tlbiBDb2FyXQotCi0gICopIEFQSTogbmV3IGFwX2N1c3RvbV9yZXNwb25zZSgpIGZ1bmN0aW9uIGZvciBob29raW5nIGludG8gdGhlCi0gICAgIEVycm9yRG9jdW1lbnQgbWVjaGFuaXNtIGF0IHJ1bnRpbWUgW0RvdWcgTWFjRWFjaGVybl0KLQotICAqKSBBUEk6IG5ldyBhcF91dWVuY29kZSgpIGZ1bmN0aW9uIFtEb3VnIE1hY0VhY2hlcm5dCi0KLSAgKikgQVBJOiBzY2FuX3NjcmlwdF9oZWFkZXJfZXJyX2NvcmUoKSBub3cgInB1YmxpYyIgYW5kIHJlbmFtZWQKLSAgICAgYXBfc2Nhbl9zY3JpcHRfaGVhZGVyX2Vycl9jb3JlKCkgW0RvdWcgTWFjRWFjaGVybl0KLQotICAqKSBUaGUgJ3N0YXR1cycgbW9kdWxlIHdpbGwgbm93IHNob3cgdGhlIHByb2Nlc3MgcGlkJ3MgYW5kIHRoZWlyCi0gICAgIHN0YXRlIGV2ZW4gd2l0aG91dCBmdWxsIFNUQVRVUyBhY2NvdW50aW5nLiBbSmltIEphZ2llbHNraV0KLQotICAqKSBSZXN0b3JlIHRoZSBjbGllbnQgSVAgYWRkcmVzcyB0byB0aGUgZXJyb3IgbG9nIG1lc3NhZ2VzLCB0aGlzCi0gICAgIHdhcyBsb3N0IGR1cmluZyB0aGUgdHJhbnNpdGlvbiBmcm9tIDEuMiB0byAxLjMuICBBZGQgYSBuZXcKLSAgICAgZnVuY3Rpb24gYXBfbG9nX3JlcnJvcigpIHdoaWNoIHRha2VzIGEgcmVxdWVzdF9yZWMgKiBhbmQKLSAgICAgZm9ybWF0cyBpdCBhcHByb3ByaWF0ZWx5LiAgW0RlYW4gR2F1ZGV0XSBQUiMyNjYxCi0KLSAgKikgQ3VyZSBhcF9jZmdfZ2V0bGluZSgpIG9mIGl0cyBuYXN0eSBoYWJpdCBvZiBjb21wcmVzc2luZyBpbnRlcm5hbAotICAgICB3aGl0ZXNwYWNlIGluIGlucHV0IGxpbmVzIC0tIGluY2x1ZGluZyB3aXRoaW4gcXVvdGVkIHN0cmluZ3MuCi0gICAgIFtLZW4gQ29hcl0KLSAgICAgYnV0IGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2Ugc2hvdWxkIGNvbnRpbnVlIHRvIGJlCi0gICAgIHN0cmlwcGVkIFtNYXJ0aW4gS3JhZW1lcl0KLQotICAqKSBDbGVhbnVwIG9mIHRoZSBQcmludFBhdGgvUHJpbnRQYXRoT1MyIGhlbHBlciBmdW5jdGlvbnMuIEF2b2lkCi0gICAgIHRoZSB1Z2x5IHVzZSBvZiBhbiBlbnYuIHZhcmlhYmxlIGFuZCB1c2UgY29tbWFuZC1saW5lIGFyZ3MgZm9yCi0gICAgIGFsdGVybmF0ZSAkUEFUSC4gTWFrZSBtb3JlIGxpa2UgYWR2YW5jZWQgJ3R5cGUncyBhcyB3ZWxsLgotICAgICBbSmltIEphZ2llbHNraV0KLQotICAqKSBUaGUgSVJJWE4zMiBSdWxlIHdhcyBiZWluZyBpZ25vcmVkLiBDb25maWd1cmUgbm93IGNvcnJlY3RseSBhZGRzCi0gICAgIC1uMzIgb25seSBpZiBJUklYTjMyIHNheXMgdG8uIFtKaW0gSmFnaWVsc2tpLCBBbGFpbiBTdC1EZW5pcwotICAgICA8YWxhaW4uc3QtZGVuaXNAZWMuZ2MuY2E+XSBQUiMyNzM2Ci0KLSAgKikgQ2xlYW4gdXAgYSB3YXJuaW5nIGluIG1vZF9wcm94eS4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgUmVuYW1lZCBfX0VNWF9fIChpbnRlcm5hbCBkZWZpbmUgb2YgdGhlIGdjYyBwb3J0IHVuZGVyIE9TLzIpIHRvIE9TMgotICAgICBmb2xsb3dpbmcgdGhlIHNhbWUgaWRlYSBhcyAiTVNWQyB2cyBXSU4zMiIuIEFkZGl0aW9uYWxseSB0aGUgc3JjL29zL2VteC8KLSAgICAgZGlyZWN0b3J5IHdhcyByZW5hbWVkIHRvIHNyYy9vcy9vczIvIGZvciBjb25zaXN0ZW5jeS4KLSAgICAgW0JyaWFuIEhhdmFyZCwgUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBBZGQgbmV3IFJ1bGUgU0hBUkVEX0NIQUlOIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBsaW5raW5nIG9mIERTTwotICAgICBmaWxlcyAoaGVyZSBtb2R1bGVzKSBhZ2FpbnN0IG90aGVyIERTTyBmaWxlcyAoaGVyZSBzaGFyZWQgbGlicmFyaWVzKS4KLSAgICAgVGhpcyBpcyBkb25lIGJ5IGRldGVybWluaW5nIGEgc3Vic2V0IG9mIExJQlMgd2hpY2ggY2FuIGJlIHNhZmVseSB1c2VkIGZvcgotICAgICBsaW5raW5nIHRoZSBEU09zLCBpLmUuIFBJQyBsaWJzIGFuZCBzaGFyZWQgbGlicy4gIEN1cnJlbnRseSB0aGUgcnVsZSBpcwotICAgICBkaXNhYmxlZCBmb3IgYWxsIHBsYXRmb3JtcyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIHRoaXMgKGV4cGVyaW1lbnRhbCkKLSAgICAgcnVsZS4gQnV0IHdlIHByb3ZpZGUgaXQgbm93IGZvciB0aG9zZSBwZW9wbGUgaG93IHJhbiBpbnRvIHByb2JsZW1zIGFuZAotICAgICB3YW50IHRvIGNhbWUgb3V0IGJ5IGZvcmNpbmcgbGlua2luZyBhZ2FpbnN0IERTT3MuCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyNTg3Ci0KLSAgKikgRml4IHN1RVhFQyBzdGFydCBtZXNzYWdlOiBIYXMgdG8gYmUgb2YgYG5vdGljZScgbGV2ZWwgdG8gcmVhbGx5IGdldAotICAgICBwcmludGVkIHRvZ2V0aGVyIHdpdGggdGhlIHN0YW5kYXJkIHN0YXJ0dXAgbWVzc2FnZSBiZWNhdXNlIHRoZSBgbm90aWNlJwotICAgICBsZXZlbCBpcyBoYW5kbGVkIHNwZWNpYWwgaW5zaWRlIGFwX2xvZ19lcnJvcigpIGZvciBzdGFydHVwIG1lc3NhZ2VzLgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjc2MSBQUiMyNzYxIFBSIzI3NjUKLQotICAqKSBBZGQgY29ycmVjdCBgbW9kZWwnIE1JTUUgdHlwZXMgZnJvbSBSRkMyMDc3IHRvIG1pbWUudHlwZXMgZmlsZS4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI3MzIKLQotICAqKSBGaXhlZCBleGFtcGxlcyBpbiBtb2RfcmV3cml0ZS5odG1sIGRvY3VtZW50LiAKLSAgICAgW1lvdWljaGlyb3UgS29nYSA8eS1rb2dhQGpwLkZyZWVCU0Qub3JnPiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjc1NgotCi0gICopIEFsbG93IGFwX3JlYWRfcmVxdWVzdCBlcnJvcnMgdG8gcHJvcGFnYXRlIHRocm91Z2ggdGhlIG5vcm1hbCByZXF1ZXN0Ci0gICAgIGhhbmRsaW5nIGxvb3Agc28gdGhhdCB0aGUgY29ubmVjdGlvbiBjYW4gYmUgcHJvcGVybHkgY2xvc2VkIHdpdGgKLSAgICAgbGluZ2VyaW5nX2Nsb3NlLCB0aHVzIGF2b2lkaW5nIGEgcG90ZW50aWFsIFRDUCByZXNldCB0aGF0IHdvdWxkCi0gICAgIGNhdXNlIHRoZSBjbGllbnQgdG8gbWlzcyB0aGUgSFRUUCBlcnJvciByZXNwb25zZS4gIFtSb3kgRmllbGRpbmddCi0KLSAgKikgT25lIG1vcmUgcG9ydGFiaWxpdHkgZml4IGZvciBBUEFDSSBzaGFkb3cgdHJlZSBzdXBwb3J0OiBTd2FwIG9yZGVyIG9mIGF3awotICAgICBhbmQgc2VkIGluIHRvcC1sZXZlbCBjb25maWd1cmUgc2NyaXB0IHRvIGF2b2lkIHNlZCBmYWlscyBvbiBzb21lCi0gICAgIHBsYXRmb3JtcyAoZm9yIGluc3RhbmNlIFN1bk9TIDQuMS4zIGFuZCBOQ1IgU3lzVikgYmVjYXVzZSBvZiB0aGUKLSAgICAgbm9uLW5ld2xpbmUtdGVybWluZWQgb3V0cHV0IG9mIEF3ay4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI3MjkKLQotICAqKSBQT1JUOiBORUMgRVdTNDgwMCBzdXBwb3J0LgotICAgICBbTUFUU1VVUkEgVGFrYW5vcmkgPHQtbWF0c3V1QHByb3RlaW4ub3Nha2EtdS5hYy5qcD5dCi0KLSAgKikgRml4IGEgc2VnZmF1bHQgaW4gdGhlIHByb3h5IG9uIE9TLzIuICBbQnJpYW4gSGF2YXJkXQotCi0gICopIEZpeCBXaW4zMiBwYXJ0IG9mIGFwX3NwYXduX2NoaWxkKCkgYnkgcHJvdmlkaW5nIGEgcmVhc29uYWJsZSBjaGlsZF9pbmZvCi0gICAgIHN0cnVjdHVyZSBpbnN0ZWFkIG9mIGp1c3QgTlVMTC4gVGhpcyBmaXhlcyBhdCBsZWFzdCB0aGUgUmV3cml0ZU1hcAotICAgICBwcm9ncmFtcyB1bmRlciBXaW4zMi4gW01hcmNvIERlIE1pY2hlbGUgPG1kZW1pY2hlbGVAdGluLml0Pl0gUFIjMjQ4MwotCi0gICopIEFkZCB3b3JrYXJvdW5kIHRvIHRvcC1sZXZlbCBgY29uZmlndXJlJyBzY3JpcHQgZm9yIGJyYWluIGRlYWQgCi0gICAgIGBlY2hvJyBjb21tYW5kcyB3aGljaCBpbnRlcnBldCBlc2NhcGUgc2VxdWVuY2VzIHBlciBkZWZhdWx0LgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjY1NAotCi0gICopIE1ha2Ugc3VyZSB0aGF0IHRoZSBwYXRoIHRvIHRoZSBQZXJsIGludGVycHJldGVyIGlzIGNvcnJlY3RseQotICAgICBhZGp1c3RlZCB1bmRlciBgbWFrZSBpbnN0YWxsJyBhbHNvIGZvciB0aGUgcHJpbnRlbnYgQ0dJIHNjcmlwdC4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI1OTUKLSAKLSAgKikgVXBkYXRlIHRoZSBtb2RfcmV3cml0ZS5odG1sIGRvY3VtZW50IHRvIGNvcnJlY3RseSByZWZsZWN0IHRoZSBzaXR1YXRpb24KLSAgICAgb2YgdGhlIGBwcm94eScgKGBbUF0nKSBmZWF0dXJlLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjY3OQotCi0gICopIEZpeCBgaW5zdGFsbC1pbmNsdWRlcycgc3ViLXRhcmdldCBvZiBgaW5zdGFsbCcgdGFyZ2V0IGluIHRvcC1sZXZlbAotICAgICBNYWtlZmlsZS50bXBsOiBUaGUgdW1hc2srY3AgYXBwcm9hY2ggZGlkbid0IHdvcmsgYXMgZXhwZWN0ZWQgKGVzcGVjaWFsbHkKLSAgICAgZm9yIHVzZXJzIHdoaWNoIGV4dHJhY3RlZCB0aGUgZGlzdHJpYnV0aW9uIHVuZGVyICd1bWFzayAwNzcnKSwgc28gcmVwbGFjZQotICAgICBpdCBieSBhbiBleHBsaWNpdCBjcCtjaG1vZCBhcHByb2FjaC4KLSAgICAgW1JpY2hhcmQgTGxveWQsIEN1cnQgU2FtcHNvbiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjY1NiBQUiMyNjI2Ci0gCi0gICopIEZpeCBgZGlzdGNsZWFuJyBhbmQgYGNsZWFuJyB0YXJnZXRzIGluIHNyYy9NYWtlZmlsZS50bXBsIHRvIGhhdmUgc2FtZQotICAgICBiZWhhdmlvciBhbmQgdG8gY2xlYW51cCBjb3JyZWN0bHkgZXZlbiB1bmRlciBlbmFibGVkIFNIQVJFRF9DT1JFIHJ1bGUuCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIFVzZSBhIG1vcmUgc3RyYWlnaHQgZm9yd2FyZCBhbmQgdGh1cyBsZXNzIHByb2JsZW1hdGljIFNlZCBjb21tYW5kIGluCi0gICAgIHNyYy9oZWxwZXIvbWtkaXIuc2ggc2NyaXB0LiAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgTWFrZSBzdXJlIHRoZSBgY29uZmlndXJlJyBzY3JpcHRzIGRvZXNuJ3QgZmFpbCB3aGVuIHRyeWluZyB0byBndWVzcyB0aGUKLSAgICAgZG9tYWlubmFtZSBvZiB0aGUgbWFjaGluZSBhbmQgdGhlcmUgYXJlIG11bHRpcGxlIGBkb21haW5uYW1lJyBhbmQKLSAgICAgYHNlYXJjaCcgZW50cmllcyBpbiAvZXRjL3Jlc29sdi5jb25mLgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjcxMAotCi0gICopIEFkZCBub3RlIGFib3V0IHRoZSBTSEFSRURfQ09SRSByZXF1aXJlbWVudCBvbiBzb21lIHBsYXRmb3JtcyBhbHNvIHRvIHRoZQotICAgICBJTlNUQUxMIGZpbGUgYmVjYXVzZSBhIGxvdCBvZiB1c2VycyBkb24ndCByZWFkIGh0ZG9jcy9tYW51YWwvZHNvLmh0bWwKLSAgICAgZmlyc3QuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyNzAxCi0KLSAgKikgRml4IGRvY3VtZW50ICJoeXBlcmxpbmsiIGZvciBkc28uaHRtbCBpbiBzcmMvQ29uZmlndXJhdGlvbi50bXBsCi0gICAgIFtLbnV0IEEuU3llZCA8S251dC5TeWVkQG5oaC5ubz5dIFBSIzI2NzQKLQotICAqKSBNb2RpZnkgbW9kX3Jld3JpdGUgdG8gdXBkYXRlIHRoZSBWYXJ5IHJlc3BvbnNlIGZpZWxkIGlmIHRoZSBVUkwgcmV3cml0aW5nCi0gICAgIGVuZ2luZSBkb2VzIGFueSBtYW5pcHVsYXRpb25zIG9yIGRlY2lzaW9ucyBiYXNlZCB1cG9uIHJlcXVlc3QgZmllbGRzLiAKLSAgICAgW0tlbiBDb2FyXSBQUiMxNjQ0Ci0KLSAgKikgRG9jdW1lbnQgdGhlIHNwZWNpYWwgQVBBQ0kgYmVoYXZpb3IgZm9yIGluc3RhbGxhdGlvbiBwYXRocyB3aGVyZQotICAgICBgYC9hcGFjaGUnJyBpcyBhcHBlbmRlZCB0byBwYXRocyB1bmRlciBzb21lICh3ZWxsIGRlZmluZWQsIG9mIGNvdXJzZSkKLSAgICAgc2l0dWF0aW9ucyB0byBwcmV2ZW50IHBvbGx1dGlvbiBvZiBzeXN0ZW0gbG9jYXRpb25zIHdpdGggQXBhY2hlIGZpbGVzLgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjY2MAotCi0gICopIEZpeGVkIHByb2JsZW0gd2l0aCBidWZmZXJlZCByZXNwb25zZSBtZXNzYWdlIG5vdCBiZWluZyBzZW50IGZvcgotICAgICB0aGUgcmVhZF9yZXF1ZXN0IGVycm9yIGNvbmRpdGlvbnMgb2YgVVJJLXRvby1sb25nICg0MTQpIGFuZAotICAgICBtYWxmb3JtZWQgaGVhZGVyIGZpZWxkcyAoNDAwKS4gIFtSb3kgRmllbGRpbmddIFBSIzI2NDYKLQotICAqKSBBZGQgc3VwcG9ydCBmb3IgdGhlIE1heC1Gb3J3YXJkczogaGVhZGVyIGxpbmUgcmVxdWlyZWQgYnkgUkZDMjA2OCBmb3IKLSAgICAgdGhlIFRSQUNFIG1ldGhvZC4gVGhpcyBhbGxvd3MgYXBhY2hlIHRvIFRSQUNFIGFsb25nIGEgY2hhaW4gb2YgcHJveGllcwotICAgICB1cCB0byBhIHByZWRldGVybWluZWQgZGVwdGguIFtNYXJ0aW4gS3JhZW1lcl0KLQotICAqKSBGaXggU0hBUkVEX0NPUkUgcnVsZTogVGhlIENGTEFHU19TSExJQiB2YXJpYWJsZSBpcyBubyBsb25nZXIgZG91YmxlZAotICAgICAoY29tcGlsZXJzIGNvbXBsYWluZWQpIGFuZCB0aGUgLnNvLlYuUi5QIGZpbGVuYW1lIGV4dGVuc2lvbiB3YXMgYWRqdXN0ZWQKLSAgICAgdG8gY29ycmVjdGx5IHJlZmxlY3QgdGhlIDEuMy4yIHZlcnNpb24uCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyNjQ0Ci0KLSAgKikgU0VDVVJJVFk6IFBsdWcgIi4uLiIgYW5kIG90aGVyIGNhbm9uaWNhbGl6YXRpb24gaG9sZXMgdW5kZXIgT1MvMi4KLSAgICAgW0JyaWFuIEhhdmFyZF0KLSAgCi0gICopIFBPUlQ6IGltcGxlbWVudCBzZXJpYWxpemVkIGFjY2VwdHMgZm9yIE9TLzIuICBbQnJpYW4gSGF2YXJkXQotCi0gICopIG1vZF9pbmNsdWRlIGhhZCBwcm9ibGVtcyB3aXRoIHRoZSBmc2l6ZSBhbmQgZmxhc3Rtb2QgZGlyZWN0aXZlcwotICAgICB1bmRlciBXSU4zMi4gIEZpeCBhbHNvIGF2b2lkcyB0aGUgbWlub3Igc2VjdXJpdHkgaG9sZSBvZiB1c2luZwotICAgICAiLi4iIHBhdGhzIGZvciBmc2l6ZSBhbmQgZmxhc3Rtb2QuCi0gICAgIFtNYW5vaiBLYXNpY2hhaW51bGEgPG1hbm9qa0ByYWxlaWdoLmlibS5jb20+XSBQUiMyMzU1Ci0KLSAgKikgRml4ZWQgc29tZSBNYWtlZmlsZSBkZXBlbmRlbmN5IHByb2JsZW1zLiAgW0RlYW4gR2F1ZGV0XQotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDEuMy4xCi0KLSAgKikgRGlzYWJsZSB0aGUgaW5jb3JyZWN0IGVudHJ5IGZvciBhcHBsaWNhdGlvbi9tc3dvcmQgaW4gdGhlIAotICAgICBtb2RfbWltZV9tYWdpYyAibWFnaWMiIGZpbGUgYmVjYXVzZSBpdCBhbHNvIG1hdGNoZXMgb3RoZXIgT2ZmaWNlCi0gICAgIGRvY3VtZW50cy4gIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyNjA4Ci0KLSAgKikgRml4IGJyb2tlbiBSQU5MSUIgaGFuZGxpbmcgaW4gc3JjL0NvbmZpZ3VyZSAodGhlIGVudHJ5IGZyb20KLSAgICAgc3JjL0NvbmZpZ3VyYXRpb24udG1wbCB3YXMgaWdub3JlZCkgYW5kIGFkZGl0aW9uYWxseSBmb3JjZSBSQU5MSUIgdG8KLSAgICAgL2Jpbi90cnVlIHVuZGVyIEhQL1VYIHdoZXJlIHJhbmxpYiBleGlzdHMgYnV0IGlzIGRlcHJlY2F0ZWQuCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyNjI3Ci0gICAgIAotICAqKSAnYXBhY2hlY3RsIHN0YXR1cycgZmFpbGVkIG9uIHNvbWUgc3lzdGVtcy4KLSAgICAgW1N0ZXZlIFZhbkRldmVuZGVyIDxzdGV2ZXZAZGFya3dpbmcudW9yZWdvbi5lZHU+LCBMYXJzIEVpbGVicmVjaHRdIFBSIzI2MTMKLQotICAqKSBBZGQgbmV3IGZsYWdzIGZvciBhcF91bnBhcnNlX3VyaV9jb21wb25lbnRzKCkgdG8gbWFrZSBpdCBnZW5lcmF0ZQotICAgICB0aGUgc2NoZW1lOi8vc2l0ZXBhcnQgc3RyaW5nIG9ubHksIG9yIHRvIG9taXQgdGhlIHF1ZXJ5IHN0cmluZy4KLSAgICAgW01hcnRpbiBLcmFlbWVyXQotCi0gICopIFdJTjMyOiBDYW5vbmljYWxpemUgU2VydmVyUm9vdCBiZWZvcmUgY2hlY2tpbmcgdG8gc2VlIGlmIGl0Ci0gICAgIGlzIGEgdmFsaWQgZGlyZWN0b3J5LiAgVGhlIGZhaWx1cmUgdG8gZG8gdGhpcyBjYXVzZWQgY2VydGFpbgotICAgICBTZXJ2ZXJSb290IHNldHRpbmdzIChlZy4gIlNlcnZlclJvb3QgL2FwYWNoZSIpIHRvIGJlIGltcHJvcGVybHkKLSAgICAgcmVqZWN0ZWQuICBbTWFyYyBTbGVta29dCi0KLSAgKikgR2xvYmFsIHJlbmFtaW5nIG9mIEMgaGVhZGVyIGZpbGVzIHRvIGJvdGggZ2V0IHJpZCBvZiBjb25mbGljdHMgd2l0aCB0aGlyZAotICAgICBwYXJ0eSBwYWNrYWdlcyBhbmQgdG8gYWdhaW4gcmVhY2ggY29uc2lzdGVuY3k6Ci0gICAgICAgMS4gY29uZi5oICAgICAgLT4gYXBfY29uZmlnLmgKLSAgICAgICAyLiBjb25mX2F1dG8uaCAtPiBhcF9jb25maWdfYXV0by5oIFwgdGhlc2UgYXJlIG5vdyBtZXJnZWQKLSAgICAgICAzLiBhcF9jb25maWcuaCAtPiBhcF9jb25maWdfYXV0by5oIC8gaW4gdGhlIGNvbmZpZyBwcm9jZXNzCi0gICAgICAgNC4gY29tcGF0LmggICAgLT4gYXBfY29tcGF0LmgKLSAgICAgICA1LiBhcGN0eXBlLmggICAtPiBhcF9jdHlwZS5oCi0gICAgIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZmlsZXMgZm9yIGNvbmYuaCBhbmQgY29tcGF0Lmggd2VyZSBjcmVhdGVkLgotCi0gICopIG1vZF9tbWFwX3N0YXRpYyB3aWxsIG5vIGxvbmdlciB0YWtlIGFjdGlvbiBvbiByZXF1ZXN0cyB1bmxlc3MgYXQgCi0gICAgIGxlYXN0IG9uZSAibW1hcGZpbGUiIGRpcmVjdGl2ZSBpcyBwcmVzZW50IGluIHRoZSBjb25maWd1cmF0aW9uLiAKLSAgICAgVGhpcyBleHBlcmltZW50YWwgbW9kdWxlIGhhcyB0byBkbyBzb21lIGJsYWNrIG1hZ2ljIHRvIG9wZXJhdGUgCi0gICAgIGluc2lkZSB0aGUgY3VycmVudCBBUEkgYW5kIHRodXMgY3JlYXRlcyBzaWRlLWVmZmVjdHMgZm9yIG90aGVyIAotICAgICBtb2R1bGVzIHVuZGVyIHNvbWUgY2lyY3Vtc3RhbmNlcy4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0gCi0gICopIEFkZCBjb25zZXJ2YXRpdmUgdGlja3MgYXJvdW5kIG1vcmUgZWdyZXAgYXJndW1lbnRzIGluIHRvcC1sZXZlbCBjb25maWd1cmUKLSAgICAgdG8gYXZvaWQgcHJvYmxlbXMgdW5kZXIgYnJhaW4tZGVhZCBwbGF0Zm9ybXMgbGlrZSBEaWdpdGFsIFVOSVggKE9TRjEpLgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjU5NgotCi0gICopIG1vZF9yZXdyaXRlIGNyZWF0ZWQgUmV3cml0ZUxvY2sgZmlsZXMgdW5kZXIgdGhlIFVJRCBvZiB0aGUgcGFyZW50Ci0gICAgIHByb2Nlc3MsIHRodXMgdGhlIGNoaWxkIHByb2Nlc3NlcyBoYWQgbm8gd3JpdGUgYWNjZXNzIHRvIHRoZSBmaWxlcy4KLSAgICAgTm93IGEgY2hvd24oKSBpcyBkb25lIG9uIHRoZSBmaWxlIHRvIHRoZSB1aWQgb2YgdGhlIGNoaWxkcmVuLAotICAgICBpZiBhcHBsaWNhYmxlLiAgW0xhcnMgRWlsZWJyZWNodCwgUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjM0MQotCi0gICopIEF1dG9nZW5lcmF0ZSBzb21lIEhBVkVfWFhYWFhfSCBkZWZpbmVzIGluIGNvbmZfYXV0by5oIChkZXRlcm1pbmVkIHZpYQotICAgICBUZXN0Q29tcGlsZSkgaW5zdGVhZCBvZiBkZWZpbmluZyB0aGVtIG1hbnVhbGx5IGluIGNvbmYuaCBiYXNlZCBvbiBsZXNzCi0gICAgIGFjY3VyYXRlIHBsYXRmb3JtIGRlZmluaXRpb25zLiAgVGhpcyB3YXkgd2Ugbm8gbG9uZ2VyIGhhdmUgdG8gZmlkZGxlIHdpdGgKLSAgICAgT1MtdHlwZSBhbmQvb3IgT1MtdmVyc2lvbiBpZGVudGlmaWVycyB0byBkaXNjb3ZlciB3aGV0aGVyIGEgc3lzdGVtIGhlYWRlcgotICAgICBmaWxlIGV4aXN0cyBvciBub3QuICBJbnN0ZWFkIHdlIG5vdyBkaXJlY3RseSBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZgotICAgICB0aG9zZSBlc290ZXJpYyBvbmVzLiAKLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIwOTMsIFBSIzIzNjEsIFBSIzIzNzcsIFBSIzI0MzQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQUiMyNTI0LCBQUiMyNTI1LCBQUiMyNTMzLCBQUiMyNTY5Ci0KLSAgKikgbW9kX3NldGVudmlmIChCcm93c2VyTWF0Y2gqIGFuZCBmcmllbmRzKSB3aWxsIG5vdyBtYXRjaCBhIG1pc3NpbmcKLSAgICAgZmllbGQgd2l0aCAiXiQiLiAgW0tlbiBDb2FyXQotCi0gICopIFNldCB0aGUgUlRMRF9HTE9CQUwgZGxvcGVuIG1vZGUgcGFyYW1ldGVyIHRvIGFsbG93IGR5bmFtaWNhbGx5IGxvYWRlZAotICAgICBtb2R1bGVzIHRvIGxvYWQgdGhlaXIgb3duIG1vZHVsZXMgZHluYW1pY2FsbHkuICBUaGlzIGltcHJvdmVzIG1vZF9wZXJsCi0gICAgIGFuZCBtb2RfcGhwMyB3aGVuIHRoZXNlIG1vZHVsZXMgYXJlIGxvYWRlZCBkeW5hbWljYWxseSBpbnRvIEFwYWNoZS4KLSAgICAgW1Jhc211cyBMZXJkb3JmXQotCi0gICopIENhY2hlIGEgcHJveGllZCByZXF1ZXN0IGluIHRoZSBldmVudCB0aGF0IHRoZSBjbGllbnQgY2FuY2VscyB0aGUKLSAgICAgdHJhbnNmZXIsIHByb3ZpZGVkIHRoYXQgdGhlIGNvbmZpZ3VyZWQgcGVyY2VudGFnZSBvZiB0aGUgZmlsZSBoYXMKLSAgICAgYWxyZWFkeSBiZWVuIHRyYW5zZmVyZWQuIEl0IHdvcmtzIGZvciBIVFRQIHRyYW5zZmVycyBvbmx5LiAgVGhlIAotICAgICBuZXcgY29uZmlndXJhdGlvbiBkaXJlY3RpdmUgaXMgY2FsbGVkIENhY2hlRm9yY2VDb21wbGV0aW9uLiAKLSAgICAgW0dsZW4gUGFya2VyIDxnbGVuZWJvYkBud2xpbmsuY29tPl0gUFIjMjI3NwotCi0gICopIEFkZCB0aGUgIjwhRE9DVFlQRSBIVE1MIiBtYWdpYyBjb29raWUgdXNlZCBieSBtb2Rlcm4gZG9jdW1lbnRzIChhbmQKLSAgICAgcmVxdWlyZWQgYnkgSFRNTCAzLjIgYW5kIGxhdGVyKSB0byBtb2RfbWltZV9tYWdpYydzIGNvbmYvbWFnaWMuCi0gICAgIFtBbm5hIFNoZXJnb2xkIDxhbm5hQGluZXh0LmNvLnVrPl0KLQotICAqKSBGaXggeWV0IGFub3RoZXIgc2lnbmFsLWJhc2VkIHJhY2UgY29uZGl0aW9uIGludm9sdmluZyBuZXN0ZWQgdGltZXJzLgotICAgICBTaWduYWxzIHN1Y2suICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgc3VleGVjJ3MgZXJyb3IgbWVzc2FnZXMgaGF2ZSBiZWVuIGNsYXJpZmllZCBhIGxpdHRsZSBiaXQuICBbS2VuIENvYXJdCi0KLSAgKikgQ2xlYW4gdXAgc29tZSwgYnV0IHBlcmhhcHMgbm90IGFsbCwgOC1iaXQgY2hhcmFjdGVyIHNldCBwcm9ibGVtcwotICAgICB3aXRoIGNvbmZpZyBmaWxlIHBhcnNpbmcsIGFuZCBVUkwgcGFyc2luZy4gIFdlIG5vdyBkZWZpbmUKLSAgICAgYXBfaXNkaWdpdCgpLCBhcF9pc3VwcGVyKCksIC4uLiB3aGljaCBjYXN0IHRvIGFuICh1bnNpZ25lZCBjaGFyKS4KLSAgICAgVGhpcyBzaG91bGQgd29yayBvbiBtb3N0IG1vZGVybiB1bml4ZXMuCi0gICAgIFtEZWFuIEdhdWRldF0gUFIjODAwLCAyMjgyLCAyNTUzICAoYW5kIG90aGVycykKLQotICAqKSBUaGUgImhhbmRsZXIgbm90IGZvdW5kIiBlcnJvciB3YXMgaXNzdWVkIGluIGNhc2VzIHdoZXJlIHRoZSBoYW5kbGVyCi0gICAgIHJlYWxseSBkaWQgZXhpc3QsIGJ1dCB3YXMganVzdCBkZWNsaW5pbmcgdG8gc2VydmUgdGhlIHJlcXVlc3QuCi0gICAgIFtKb2huIFZhbiBFc3NlbiA8anZlQGdhbWVycy5vcmc+XSBQUiMyNTI5Ci0KLSAgKikgQWRkIER5bmFtaWMgU2hhcmVkIE9iamVjdCAoRFNPKSBzdXBwb3J0IGZvciBTQ081IChPcGVuU2VydmVyIDUuMC54KS4KLSAgICAgW1JvbmFsZCBSZWNvcmQgPHJyQHNjby5jb20+XSBQUiMyNTMzCi0KLSAgKikgVGhlIEFQQUNJIGxpYmV4ZWNkaXIgd2FzIG5vdCBleHRlbmRlZCB3aXRoIGFuICJhcGFjaGUvIiBzdWJkaXIKLSAgICAgaWYgdGhlIGluc3RhbGxhdGlvbiBwcmVmaXggZGlkbid0IGFscmVhZHkgY29udGFpbiAiYXBhY2hlIiwgYnV0Ci0gICAgIGl0IHNob3VsZCBiZSBiZWNhdXNlIHRoZSBEU08gZmlsZXMgYXJlIEFwYWNoZS1zcGVjaWZpYy4gIE5vdwotICAgICBsaWJleGVjZGlyIGlzIHRyZWF0ZWQgdGhlIHNhbWUgd2F5IHN5c2NvbmZkaXIsIGRhdGFkaXIsIGxvY2Fsc3RhdGVkaXIKLSAgICAgYW5kIGluY2x1ZGVkaXIgYXJlIGFscmVhZHkgdHJlYXRlZC4KLSAgICAgW0NoYXJsZXMgTGV2ZXJ0IDxjaGFybGVzQGNvbW0ucG9seW10bC5jYT5dIFBSIzI1NTEKLQotICAqKSBUaGUgPExpbWl0PiBwYXJzaW5nIHJvdXRpbmUgd2FzIGluY29ycmVjdGx5IHRyZWF0aW5nIG1ldGhvZHMgYXMKLSAgICAgY2FzZS1pbnNlbnNpdGl2ZS4gIFtLZW4gQ29hcl0KLQotICAqKSBUaGUgYXBfYnByaW50ZigpIGNvZGUgbmVnbGVjdGVkIHRvIHRlc3QgaWYgdGhlcmUgd2FzIGFuIGVycm9yIG9uCi0gICAgIHRoZSBjb25uZWN0aW9uLiAgYXBfYmZsdXNoKCkgbWlzZGlhZ25vc2VkIGEgZmFpbHVyZSBhcyBhIHN1Y2Nlc3MuCi0gICAgIFtEZWFuIEdhdWRldF0KLQotICAqKSBhZGQgc3VwcG9ydCBmb3IgI3BlcmwgYXJnIGludGVycG9sYXRpb24gaW4gbW9kX2luY2x1ZGUKLSAgICAgW0RvdWcgTWFjRWFjaGVybl0KLQotICAqKSBBUEk6IE5hbWUgY2hhbmdlcyBvZiB0YWJsZV9lbHRzIHRvIGFwX3RhYmxlX2VsdHMsIGlzX3RhYmxlX2VtcHR5Ci0gICAgIHRvIGFwX2lzX3RhYmxlX2VtcHR5IGFuZCBiZ2V0ZmxhZyB0byBhcF9iZ2V0ZmxhZy4gW0JlbiBMYXVyaWVdCi0KLSAgKikgUE9SVDogQWRkIFVuaXhXYXJlIDcgc3VwcG9ydAotICAgICBbVmFkaW0gS29zdG9nbG9kb2ZmIDx2YWRpbUBvbGx5LnJ1Pl0gUFIjMjQ2MwotCi0gICopIEZpeCB0aGUgR3Vlc3MtRFNPLWZsYWdzLWZyb20tUGVybCBzdHVmZiBpbiBzcmMvQ29uZmlndXJlOiAicGVybCIgd2FzCi0gICAgIHVzZWQgaW5zdGVhZCBvZiAiJFBFUkwiIHdoaWNoIGNvbnRhaW5zIHRoZSBjb3JyZWN0bHkgZGV0ZXJtaW5lZCBQZXJsCi0gICAgIGludGVycHJldGVyIChpbXBvcnRhbnQgZm9yIGluc3RhbmNlIG9uIHN5c3RlbXMgd2hlcmUgInBlcmwiIGFuZCAicGVybDUiCi0gICAgIGV4aXN0cywgbGlrZSBCU0RJIG9yIEZyZWVCU0QsIGV0YykuCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyNTA1Ci0KLSAgKikgTW92ZSB0aGUgaW5pdGlhbCBzdUVYRUMtcmVsYXRlZCBzdGFydHVwIG1lc3NhZ2UgZnJvbSBwbGFpbgotICAgICBmcHJpbnRmKCkvc3RkZXJyIHRvIGEgZGVsYXllZCBhcF9sb2dfZXJyb3IoKS1iYXNlZCBvbmUgdG8gYXZvaWQgcHJvYmxlbXMKLSAgICAgd2hlbiBBcGFjaGUgaXMgc3RhcnRlZCBmcm9tIGluZXRkIChpbnN0ZWFkIG9mIHN0YW5kYWxvbmUpLiBVbmRlciB0aGlzCi0gICAgIHNpdHVhdGlvbiBzdGFydHVwIG1lc3NhZ2VzIG9uIHN0ZGVyciBsZWFkIHRvIHByb2JsZW1zICh0aGUgbGluZSBpcyBzZW50Ci0gICAgIHRvIHRoZSBjbGllbnQgaW4gZnJvbnQgb2YgdGhlIHJlcXVlc3RlZCBkb2N1bWVudCkuCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiM4NzEsIFBSIzEzMTgKLQotICAqKSBBZGQgYSBmbGFnIHNvIGFwX2ZubWF0Y2goKSBjYW4gYmUgdXNlZCBmb3IgY2FzZS1ibGluZCBwYXR0ZXJuIG1hdGNoaW5nLgotICAgICBbS2VuIENvYXIsIERlYW4gR2F1ZGV0XQotCi0gICopIFdJTjMyOiBEb24ndCBjb2xsYXBzZSBtdWx0aXBsZSBzbGFzaGVzIGluIFBBVEhfSU5GTy4KLSAgICAgW0JlbiBMYXVyaWUsIEJpbGwgU3RvZGRhcmQgPHdnc3RvZGRhQHVzLmlibS5jb20+XSBQUiMyMjc0Ci0KLSAgKikgV0lOMzIgU0VDVVJJVFk6IEVsaW1pbmF0ZSB0cmFpbGluZyAiLiJzIGluIHBhdGggY29tcG9uZW50cy4gVGhlc2UgYXJlCi0gICAgIGlnbm9yZWQgYnkgdGhlIFdpbmRvd3MgZmlsZXN5c3RlbSwgYW5kIHNvIGNhbiBiZSB1c2VkIHRvIGJ5cGFzcyBzZWN1cml0eS4KLSAgICAgW0JlbiBMYXVyaWUsIEFsZXhlaSBLb3N1dF0uCi0KLSAgKikgV2Ugbm93IGF0dGVtcHQgdG8gZHVtcCBjb3JlIHdoZW4gd2UgZ2V0IFNJR0lMTC4gW0ppbSBKYWdpZWxza2ldCi0KLSAgKikgUE9SVDogcmVtb3ZlIGJyb2tlbiB0ZXN0IGZvciBNQVBfRklMRSBpbiBodHRwX21haW4uYy4KLSAgICAgW1dpbGZyZWRvIFNhbmNoZXogPHdzYW5jaGV6QGFwcGxlLmNvbT5dCi0KLSAgKikgUE9SVDogQ2hhbmdlIHN1cHBvcnQvYXBhY2hlY3RsIHRvIHVzZSAia2lsbCAtMCAkcGlkIiB0byB0ZXN0IGlmIHRoZQotICAgICBodHRwZCBpcyBydW5uaW5nLiAgVGhpcyBzaG91bGQgYmUgbW9yZSBwb3J0YWJsZSB0aGFuIGZpZ3VyaW5nIG91dAotICAgICB3aGljaCBvZiB0aHJlZSBkb3plbiBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgInBzIiBhcmUgaW5zdGFsbGVkLgotICAgICBbYSBjYXN0IG9mIGRvemVuc10KLQotICAqKSBXSU4zMjogSWYgd2UgY2FuJ3QgZmlndXJlIG91dCBob3cgdG8gZXhlY3V0ZSBhIGZpbGUgaW4gYSBzY3JpcHQKLSAgICAgZGlyZWN0b3J5LCBiYWlsIG91dCBvZiB0aGUgcmVxdWVzdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuICBbVyBHIFN0b2RkYXJkXQotCi0gICopIFdJTjMyIFNFQ1VSSVRZOiBFbGltaW5hdGUgZGlyZWN0b3JpZXMgY29uc2lzdGluZyBvZiB0aHJlZSBvciBtb3JlIGRvdHM7Ci0gICAgIHRoZXNlIGFyZSB0cmVhdGVkIGJ5IFdpbjMyIGFzIGlmIHRoZXkgYXJlICIuLiIgYnV0IGFyZSBub3QgZGV0ZWN0ZWQgYnkKLSAgICAgb3RoZXIgbWFjaGluZXJ5IHdpdGhpbiBBcGFjaGUuIFRoaXMgaXMgc29tZXRoaW5nIG9mIGEga2x1ZGdlIGJ1dAotICAgICBlbGltaW5hdGVzIGEgc2VjdXJpdHkgaG9sZS4gW01hbm9qIEthc2ljaGFpbnVsYSwgQmVuIExhdXJpZV0KLQotICAqKSBNb3ZlIGFwX2VzY2FwZV9xdW90ZXMoKSBmcm9tIHNyYy9hcCB0byBzcmMvbWFpbi91dGlsLmM7IGl0IHVzZXMKLSAgICAgcG9vbHMgYW5kIHRodXMgcG9sbHV0ZXMgbGliYXAgKHVudGlsIHRoZSBwb29sIHN0dWZmIGlzIG1vdmVkIHRoZXJlKS4KLSAgICAgW0tlbiBDb2FyXQotCi0gICopIEluZGV4SWdub3JlIHNob3VsZCBiZSBjYXNlLWJsaW5kIG9uIFdpbjMyIChhbmQgYW55IG90aGVyIGNhc2UtYXdhcmUKLSAgICAgYnV0IGNhc2UtaW5zZW5zaXRpdmUgcGxhdGZvcm1zKS4gIE5ldyAjZGVmaW5lIGZvciB0aGlzIGFkZGVkIHRvIGNvbmYuaAotICAgICAoQ0FTRV9CTElORF9GSUxFU1lTVEVNKS4gIFtLZW4gQ29hcl0gUFIjMjQ1NQotCi0gICopIEVuYWJsZSBEU08gc3VwcG9ydCBmb3IgT3BlbkJTRCBpbiBnZW5lcmFsLCBub3Qgb25seSBmb3IgMi54LCBiZWNhdXNlIGl0Ci0gICAgIGFsc28gd29ya3MgZm9yIE9wZW5CU0QgMS54LiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBQT1JUOiBGaXggY29tcGlsYXRpb24gcHJvYmxlbSBvbiBBUk0gTGludXguCi0gICAgIFtTYW0gS2luZ3RvbiA8c2FtQGlsbHVtaW5hdGVkLmNvLnVrPl0gUFIjMjQ0MwotCi0gICopIExldCBBUEFDSSdzIGNvbmZpZ3VyZSBzY3JpcHQgZGV0ZXJtaW5lIHNvbWUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCi0gICAgIChHcm91cCwgUG9ydCwgU2VydmVyQWRtaW4sIFNlcnZlck5hbWUpIHZpYSBzb21lIGludGVsbGlnZW50IHRlc3RzIHRvCi0gICAgIHJlbW92ZSBzb21lIG9mIHRoZSBjbGFzc2ljYWwgaHVyZGxlcyBmb3IgbmV3IHVzZXJzIHdoZW4gc2V0dGluZyB1cAotICAgICBBcGFjaGUuIFRoaXMgaXMgZG9uZSBwZXIgZGVmYXVsdCBiZWNhdXNlIGl0IGlzIHVzZWZ1bCBmb3IgdGhlIGF2ZXJhZ2UKLSAgICAgdXNlci4gUGFja2FnZSBhdXRob3JzIGNhbiB1c2UgdGhlIC0td2l0aG91dC1jb25mYWRqdXN0IG9wdGlvbiB0byBkaXNhYmxlCi0gICAgIHRoZXNlIGNvbmZpZ3VyYXRpb24gYWRqdXN0bWVudHMuCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIEFkZGVkIGFuIEVYVFJBX0RFUFMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgd2hpY2ggY2FuIGJlIHVzZWQKLSAgICAgdG8gYWRkIGFuIGV4dHJhIE1ha2VmaWxlIGRlcGVuZGVuY3kgZm9yIHRoZSBodHRwZCB0YXJnZXQsIGZvciBpbnN0YW5jZQotICAgICB0byBleHRlcm5hbCB0aGlyZC1wYXJ0eSBsaWJyYXJpZXMsIGV0Yy4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgQWRkIDxJZkRlZmluZT4uLjwvSWZEZWZpbmU+IHNlY3Rpb25zIHRvIHRoZSBjb3JlIG1vZHVsZSAod2l0aCBzYW1lIHNwaXJpdAotICAgICBhcyA8SWZNb2R1bGU+Li48L0lmTW9kdWxlPiBzZWN0aW9ucykgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2tpcCBvciBwcm9jZXNzCi0gICAgIGNvbnRhaW5lZCBjb21tYW5kcyBkZXBlbmRlbmQgb2YgYGAtRCBQQVJBTUVURVInJyBvcHRpb25zIG9uIHRoZSBjb21tYW5kCi0gICAgIGxpbmUuIFRoaXMgY2FuIGJlIHVzZWQgdG8gYWNoaWV2ZSBsb2dpY2FsIGNvbmRpdGlvbnMgbGlrZSA8SWZEZWZpbmUKLSAgICAgUmV2ZXJzZVByb3h5PiBpbnN0ZWFkIG9mIHBoeXNpY2FsbHkgb25lcyAoZS5nLiA8SWZNb2R1bGUgbW9kX3Byb3h5LmM+KQotICAgICBhbmQgdGh1cyBlc3BlY2lhbGx5IGNhbiBiZSB1c2VkIGZvciBjb25kaXRpb25hbGx5IGxvYWRpbmcgRFNPLWJhc2VkCi0gICAgIG1vZHVsZXMgdmlhIExvYWRNb2R1bGUsIGV0Yy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgUE9SVDogY2xlYW4gdXAgYSB3YXJuaW5nIGluIG1vZF9zdGF0dXMgZm9yIE9TLzIuICBbQnJpYW4gSGF2YXJkXQotCi0gICopIE1ha2UgdGFibGUgZWxlbWVudHMgY29uc3QuIFRoaXMgbWF5IHByZXZlbnQgb2JzY3VyZSBlcnJvcnMuIFtCZW4gTGF1cmllXQotCi0gICopIEZpeCBwYXJzaW5nIG9mIEZUUCBgU0laRScgcmVzcG9uc2VzIGluIHByb3h5IG1vZHVsZTogVGhlIG5ld2xpbmUgd2FzIG5vdAotICAgICB0cnVuY2F0ZWQgd2hpY2ggZm9yY2VkIGZvbGxvd2luZyBIVFRQIGhlYWRlcnMgdG8gYmUgZGF0YSBpbiB0aGUgSFRUUAotICAgICByZXBvbnNlLiBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgQ2hhcmxlcyBGdSA8Y2N3ZkBiYWNjaHVzLmNvbT5dIAotICAgICBQUiMyNDEyLCAyMzY3Ci0KLSAgKikgUG9ydGFiaWxpdHkgZml4IGZvciBBUEFDSSBzaGFkb3cgdHJlZSBzdXBwb3J0OiBTd2FwIG9yZGVyIG9mIGF3ayBhbmQgc2VkCi0gICAgIGluIHRvcC1sZXZlbCBjb25maWd1cmUgc2NyaXB0IHRvIGF2b2lkIHNlZCBmYWlscyBvbiBzb21lIHBsYXRmb3JtcyAoZm9yCi0gICAgIGluc3RhbmNlIFN1bk9TIDQuMS4zIGFuZCBOQ1IgU3lzVikgYmVjYXVzZSBvZiB0aGUgbm9uLW5ld2xpbmUtdGVybWluZWQKLSAgICAgb3V0cHV0IG9mIEF3ay4gW0JpbGwgSG91bGUgPGJob3VsZUBzYW5kaWVnb2NhLm5jci5jb20+XSBQUiMyNDM1Ci0KLSAgKikgSW1wcm92ZSBwZXJmb3JtYW5jZSBvZiBkaXJlY3RvcnkgbGlzdGluZ3MgKG1vZF9hdXRvaW5kZXgpIGJ5IGNvbXBhcmluZwotICAgICBpbnRlZ2VyIGtleXMgKGxhc3QtbW9kaWZpZWQgYW5kIHNpemUpIGFzIGludGVnZXJzIHJhdGhlciB0aGFuIGNvbnZlcnRpbmcKLSAgICAgdGhlbSB0byBzdHJpbmdzIGZpcnN0LiAgQWxzbyB1c2UgYSBzZXQgb2YgZXhwbGljaXQgYnl0ZSB0ZXN0cyByYXRoZXIKLSAgICAgdGhhbiBzdHJjbXAoKSB0byBjaGVjayBmb3IgcGFyZW50IGRpcmVjdG9yeS1uZXNzIG9mIGFuIGVudHJ5LiAgT2gsIGFuZAotICAgICBtYWtlIHN1cmUgdGhlIHBhcmVudCBkaXJlY3RvcnkgKGlmIGRpc3BsYXllZCkgaXMgKmFsd2F5cyogbGlzdGVkIGZpcnN0Ci0gICAgIHJlZ2FyZGxlc3Mgb2YgdGhlIHNvcnQga2V5LiAgT3ZlcmFsbCBwZXJmb3JtYW5jZSB3aW5uYWdlIHNob3VsZCBiZSBnb29kCi0gICAgIGluIENQVSB0aW1lLCBpbnN0cnVjdGlvbiBjYWNoZSwgYW5kIG1lbW9yeSB1c2FnZSwgcGFydGljdWxhcmx5IGZvciBsYXJnZQotICAgICBkaXJlY3Rvcmllcy4gIFtLZW4gQ29hcl0KLQotICAqKSBBZGQgYSB0aW55IGJ1dCB1c2VmdWwgZ29vZHkgdG8gQVBBQ0kncyBjb25maWd1cmUgc2NyaXB0OiBUaGUgZ2VuZXJhdGlvbgotICAgICBvZiBhIGNvbmZpZy5zdGF0dXMgc2NyaXB0IChhcyBHTlUgQXV0b2NvbmYgZG9lcykgd2hpY2ggcmVtZW1iZXJzIHRoZSB1c2VkCi0gICAgIGNvbmZpZ3VyZSBjb21tYW5kIGFuZCBoZW5jZSBjYW4gYmUgdXNlZCB0byByZXN0b3JlIHRoZSBjb25maWd1cmF0aW9uIGJ5Ci0gICAgIGp1c3QgcmUtcnVubmluZyB0aGlzIHNjcmlwdCBvciBmb3IgcmVtZW1iZXJpbmcgdGhlIGNvbmZpZ3VyYXRpb24gYmV0d2VlbgotICAgICByZWxlYXNlcy4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgQWRkIGh0dHBkIC10ICh0ZXN0KSBvcHRpb24gZm9yIHJ1bm5pbmcgY29uZmlndXJhdGlvbiBzeW50YXggdGVzdHMgb25seS4KLSAgICAgSWYgc29tZXRoaW5nIGlzIGJyb2tlbiBpdCBjb21wbGFpbnMgYW5kIGV4aXRzIHdpdGggYSByZXR1cm4gY29kZQotICAgICBub24tZXF1YWwgdG8gMC4gVGhpcyBjYW4gYmUgdXNlZCBtYW51YWxseSBieSB0aGUgdXNlciB0byBjaGVjayB0aGUgQXBhY2hlCi0gICAgIGNvbmZpZ3VyYXRpb24gYWZ0ZXIgZWRpdGluZyBhbmQgaXMgYWxzbyBhdXRvbWF0aWNhbGx5IHVzZWQgYnkgYXBhY2hlY3RsCi0gICAgIG9uIChncmFjZWZ1bCkgcmVzdGFydCBjb21tYW5kIHRvIG1ha2Ugc3VyZSBBcGFjaGUgZG9lc24ndCBkaWUgb24gcmVzdGFydHMKLSAgICAgYmVjYXVzZSBvZiBhIGNvbmZpZ3VyYXRpb24gd2hpY2ggaXMgbm93IGJyb2tlbiBzaW5jZSB0aGUgbGFzdCAocmUpc3RhcnQuCi0gICAgIFRoaXMgd2F5IGBhcGFjaGVjdGwgcmVzdGFydCcgY2FuIGJlIHVzZWQgaW5zaWRlIGNyb25qb2JzIHdpdGhvdXQgaGF2aW5nCi0gICAgIHRvIGV4cGVjdCBBcGFjaGUgdG8gYmUgZmFsbGluZyBkb3duLiBBZGRpdGlvbmFsbHkgdGhlIGh0dHBkIC10IGNhbiBiZSBydW4KLSAgICAgdmlhIGBhcGFjaGVjdGwgY29uZmlndGVzdCcuCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyMzkzCi0gIAotICAqKSBNaW5vciBkaXNwbGF5IGZpeCBmb3IgImluc3RhbGwiIHRhcmdldCBvZiB0b3AtbGV2ZWwgTWFrZWZpbGU6Ci0gICAgIHRoZSBkaXNwbGF5ZWQgaW5zdGFsbGF0aW9uIGNvbW1hbmQgd2FzIGluY29ycmVjdCBhbHRob3VnaCB0aGUKLSAgICAgZXhlY3V0ZWQgY29tbWFuZCB3YXMgY29ycmVjdC4gTm93IHRoZXkgYXJlIGluIHN5bmMuCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyNDAyCi0KLSAgKikgQ29ycmVjdCBpbml0aWFsaXphdGlvbiBvZiB2YXJpYWJsZSBgYWxsb3dlZF9nbG9iYWxzJyBpbiBodHRwX21haW4uYwotICAgICBbSnVzdGluIEJyYWRmb3JkIDxqdXN0aW5AdWthbnMuZWR1Pl0gUFIjMjQwMAotCi0gICopIEFwYWNoZSB3b3VsZCBpbmNvcnJlY3RseSBkb3duY2FzZSB0aGUgZW50aXJlIENvbnRlbnQtVHlwZSBwYXNzZWQgZnJvbQotICAgICBDR0lzLiAgVGhpcyBhZmZlY3RlZCBzZXJ2ZXItcHVzaCBzY3JpcHRzIGFuZCBzdWNoIHdoaWNoIHVzZQotICAgICBtdWx0aXBhcnQveC1taXhlZC1yZXBsYWNlO2JvdW5kYXJ5PVRoaXNSYW5kb21TdHJpbmcuCi0gICAgIFtEZWFuIEdhdWRldF0gUFIjMjM5NAotCi0gICopIFBPUlQ6IFFOWCB1cGRhdGUgdG8gcHJvcGVybHkgZ3Vlc3MgMzItYml0IHN5c3RlbXMuCi0gICAgIFtTZWFuIEJvdWRyZWF1IDxzZWFuYkBxbnguY29tPl0gUFIjMjM5MAotCi0gICopIE1ha2Ugc3VyZSB0aGUgRFNPIGVtdWxhdGlvbiBjb2RlIGZvciBIUFVYIGZpbmRzIHRoZSBwcm9wcmlldGFyeSBzaGxfeHh4KCkKLSAgICAgZnVuY3Rpb25zIHdoaWNoIGFyZSBpbiBsaWJkbGQgdW5kZXIgSFBVWCA5LzEwLgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjM3OAotCi0gICopIE1ha2Ugc3VyZSB0aGUgImluc3RhbGwiIHRhcmdldCBvZiB0aGUgdG9wLWxldmVsIE1ha2VmaWxlIGRvZXNuJ3QgYnJlYWsKLSAgICAgYmVjYXVzZSBvZiBhIHJldHVybiBjb2RlIG9mIDEgZnJvbSBhbiAiaWYiIChmb3IgaW5zdGFuY2UgdW5kZXIgYnJhaW5kZWFkCi0gICAgIFVsdHJpeCB0aGUgcmVzdWx0IGNvZGUgb2YgYW4gImlmIiBjb25zdHJ1Y3QgaXMgMSBpZiB0aGUgInRoZW4iIGNsYXVzZQotICAgICBkaWRuJ3QgbWF0Y2gpLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBBZGQgYW4gYWRkaXRpb25hbCAiZHVtbXkiIHRhcmdldCB0byB0aGUgIiQoTElCKSIgdGFyZ2V0IGluIGdlbmVyYXRlZAotICAgICBtb2R1bGVzL3h4eC9NYWtlZmlsZSdzIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggU1ZSNCBNYWtlIHVuZGVyICJmdWxsLURTTyIKLSAgICAgc2l0dWF0aW9uIChubyBsaWJ4eHguYSBidWlsdCwgb25seSBtb2RfeHh4LnNvJ3MpIHdoZXJlIExJQiBhbmQgT0JKUyBhcmUKLSAgICAgZW1wdHkuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBEZWFuIEdhdWRldCwgTWFydGluIEtyYWVtZXJdCi0KLSAgKikgUmVwbGFjZSB0d28gYmFkIHNwcmludGYoKSBjYWxscyB3aXRoIGFwX3NucHJpbnRmKCkgdmFyaWFudHMgaW4KLSAgICAgbW9kX3Jld3JpdGUuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIEZpeCBtaXNzaW5nIHVzYWdlIGRlc2NyaXB0aW9uIGZvciBNZXRhRmlsZXMgZGlyZWN0aXZlLgotICAgICBbRGF2aWQgTWFjS2VuemllIDxkam1AdmEucHVibml4LmNvbT5dIFBSIzIzODQKLQotICAqKSBtb2RfbG9nX2NvbmZpZyB3b3VsZG4ndCBsZXQgdmhvc3RzIHVzZSBsb2cgZm9ybWF0cyBkZWZpbmVkIGluIHRoZQotICAgICBtYWluIHNlcnZlci4gIFtDaHJpc3RvZiBEYW1pYW4gPGRhbWlhbkBtZWRpYWNvbnN1bHQuY29tPl0gUFIjMjA5MAotCi0gICopIG1vZF91c2VydHJhY2sgd2FzIGNvcnJ1cHRpbmcgdGhlIGNsaWVudCBob3N0bmFtZS4gIEFzIHBhcnQgb2YgdGhlCi0gICAgIGZpeCwgdGhlIGNvb2tpZSB2YWx1ZXMgd2VyZSBzbGlnaHRseSBleHRlbmRlZCB0byBpbmNsdWRlIHRoZQotICAgICBmdWxseSBxdWFsaWZpZWQgaG9zdG5hbWUgb2YgdGhlIGNsaWVudC4KLSAgICAgW0RlYW4gR2F1ZGV0XSBQUiMyMTkwLCAyMjI5LCAyMzY2Ci0KLSAgKikgRml4IGEgdHlwbyBpbiBwb29sIGRlYnVnZ2luZyBjb2RlLiAgW0FsdmFybyBNYXJ0aW5leiBFY2hldmFycmlhXQotCi0gICopIG1vZF91bmlxdWVfaWQgZGlkIG5vdCB3b3JrIG9uIGFscGhhIGxpbnV4IChpbiBnZW5lcmFsIG9uIGFueQotICAgICBhcmNoaXRlY3R1cmUgdGhhdCBoYXMgNjQtYml0IHRpbWVfdCkuCi0gICAgIFtBbHZhcm8gTWFydGluZXogRWNoZXZhcnJpYV0KLQotICAqKSBQT1JUOiBNYWtlIFNDTyA1IChhbmQgcHJvYmFibHkgMykgY29tcGlsZSBhZ2Fpbi4gW0JlbiBMYXVyaWVdCi0KLSAgKikgUE9SVDogTkNSIE1QUkFTIHN5c3RlbXMgaGF2ZSB0aGUgc2FtZSBidWcgd2l0aCBTSUdIVVAgcmVzdGFydCB0aGF0Ci0gICAgIFNvbGFyaXMgc3lzdGVtcyBleHBlcmllbmNlLiAgU28gZGVmaW5lIFdPUktBUk9VTkRfU09MQVJJU19CVUcuCi0gICAgIFtLbGF1cyBXZWJlciA8a3dlYmVyQGNoZXBocmVuLmdlcm1hbnkubmNyLmNvbT5dIFBSIzE5NzMKLQotICAqKSBDaGFuZ2UgIk9wdGlvbnMgTm9uZSIgdG8gIk9wdGlvbnMgRm9sbG93U3ltTGlua3MiIGluIHRoZSAKLSAgICAgPERpcmVjdG9yeSAvPiBzZWN0aW9uIG9mIHRoZSBkZWZhdWx0IGFjY2Vzcy5jb25mLWRpc3QKLSAgICAgKGFuZCAtd2luIGV2ZW4gdGhvdWdoIGl0IGRvZXNuJ3QgbWF0dGVyIHRoZXJlKS4gIFRoaXMgaGFzIGJldHRlcgotICAgICBwZXJmb3JtYW5jZSwgYW5kIG1vcmUgaW50dWl0aXZlIHNlbWFudGljcy4gIFtEZWFuIEdhdWRldF0KLQotICAqKSBQT1JUOiBVcGRhdGVkIHN1cHBvcnQgZm9yIFVUUyAyLjEuMi4KLSAgICAgW0RhdmUgRHlrc3RyYSA8ZHdkQGJlbGwtbGFicy5jb20+XSBQUiMyMzIwCi0KLSAgKikgRml4IHN5bWJvbCBleHBvcnQgbGlzdCAoc3JjL3N1cHBvcnQvaHR0cGQuZXhwKSBhZnRlciByZWNlbnQKLSAgICAgQVBJIGNoYW5nZXMgaW4gdGhlIGNoaWxkIHNwYXduaW5nIGFyZWEuCi0gICAgIFtKZW5zLVV3ZSBNYWdlciA8anVtQGhlbGlvcy5kZT5dCi0KLSAgKikgV29ya2Fyb3VuZCBmb3IgY29uZmlndXJlIHNjcmlwdCBhbmQgb2xkIGB0ZXN0JyBjb21tYW5kcyB3aGljaCBkbyBub3QKLSAgICAgc3VwcG9ydCB0aGUgLXggZmxhZyAoZm9yIGluc3RhbmNlIHVuZGVyIHBsYXRmb3JtcyBsaWtlIFVsdHJpeCkuIFRoaXMgaXMKLSAgICAgc29sdmVkIGJ5IGFub3RoZXIgaGVscGVyIHNjcmlwdCBmaW5kcHJnLnNoIHdoaWNoIHNlYXJjaGVzIGZvciBQZXJsIGFuZAotICAgICBBd2sgbGlrZSBQcmludFBhdGggYnV0IF92aWEgZGlmZmVyZW50IG5hbWVzXy4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgUmVtb3ZlIHRoZSBzeXN0ZW0oKSBjYWxsIGZyb20gaHRwYXNzd2QuYywgd2hpY2ggZWxpbWluYXRlcyBhIHN5c3RlbQotICAgICBkZXBlbmRhbmN5LiAgWyJNLkQuUGFya2VyIiA8bWRwY0BuZXRjb20uY29tPl0gUFIjMjMzMgotCi0gICopIFBPUlQ6IEZpeCBjb21waWxhdGlvbiBmYWlsdXJlcyBvbiBORVhUU1RFUC4KLSAgICAgW1JleCBEaWV0ZXIgPHJkaWV0ZXJAbWF0aC51bmwuZWR1Pl0gUFIjMjI5MywgMjMxNgotCi0gICopIFBPUlQ6IEZfTkRFTEFZIGlzIGEgdHlwbywgc2hvdWxkIGhhdmUgYmVlbiBGTkRFTEFZLiAgVGhlcmUncyBhbHNvCi0gICAgIE9fTkRFTEFZIG9uIHZhcmlvdXMgc3lzdGVtcy4gIFtEYXZlIER5a3N0cmEgPGR3ZEBiZWxsLWxhYnMuY29tPl0gUFIjMjMxMwotCi0gICopIFBPUlQ6IGhlbHBlcnMvR3Vlc3NPUyB1cGRhdGVzIGZvciB2YXJpb3VzIHZlcnNpb25zIGZvciBOQ1IgU1ZSNC4KLSAgICAgW2p1ZXJnIHNjaHJlaW5lciA8ai5zY2hyZWluZXJAemguY2g+LAotICAgICBCaWxsIEhvdWxlIDxCaWxsLkhvdWxlQFNhbkRpZWdvQ0EuTkNSLkNPTT5dIFBSIzIzMTAKLQotICAqKSBGaXggcmVjZW50bHkgaW50cm9kdWNlZCBXaW4zMiBjaGlsZCBzcGF3bmluZyBjb2RlIGluIG1vZF9yZXdyaXRlLmMgd2hpY2gKLSAgICAgd2FzIGJyb2tlbiBiZWNhdXNlIG9mIGludmFsaWQgYXBfcHN0cmNhdCgpIC0+IHN0cmNhdCgpIHRyYW5zZm9ybWF0aW9uLgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBQcm94eSBDYWNoZSBGaXhlczogYWNjb3VudCBmb3IgZGlyZWN0b3J5IHNpemVzLCBmb3JrIG9mZiBnYXJiYWdlIGNvbGxlY3Rpb24KLSAgICAgdG8gY29udGludWUgaW4gYmFja2dyb3VuZCwgdXNlIHByZWRlZmluZWQgdHlwZXMgKG9mZl90LCBzaXplX3QsIHRpbWVfdCksCi0gICAgIGxvZyB0aGUgY3VycmVudCBjYWNoZSB1c2FnZSBwZXJjZW50YWdlIGF0IExvZ0xldmVsIGRlYnVnCi0gICAgIFtNYXJ0aW4gS3JhZW1lciwgYmFzZWQgb24gZGlzY3Vzc2lvbiBiZXR3ZWVuIERlYW4gR2F1ZGV0ICYgRGlyayB2YW5HdWxpa10KLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjMuMAotCi0gICopIFVzaW5nIGEgdHlwZSBtYXAgZmlsZSBhcyBhIGN1c3RvbSBlcnJvciBkb2N1bWVudCB3YXMgbm90IHBvc3NpYmxlLgotICAgICBbTGFycyBFaWxlYnJlY2h0XSBQUiMxMDMxCi0KLSAgKikgQXZvaWQgcHJvYmxlbXMgd2l0aCBicmFpbmRlYWQgQXdrcyBieSBhZGRpdGlvbmFsbHkgc2VhcmNoaW5nIGZvciBnYXdrIAotICAgICBhbmQgbmF3ayBpbiBBUEFDSSdzIGNvbmZpZ3VyZSBzY3JpcHQuCi0gICAgIFtEYXZlIER5a3N0cmEgPGR3ZEBiZWxsLWxhYnMuY29tPiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjMxOQotCi0gICopIFJlbmFtZSBtZDUuaCB0byBhcF9tZDUuaCB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBuYXRpdmUgTUQ1IG9uCi0gICAgIHNvbWUgc3lzdGVtcy4gW1JhbmR5IFRlcmJ1c2hdCi0KLSAgKikgQ2hhbmdlIHVzYWdlIG9mIHBlcnJvcigpK2ZwcmludGYoc3RkZXJyLC4uLikgaW4gbW9kX3Jld3JpdGUgdG8KLSAgICAgbW9yZSBwcm9wZXIgYXBfbG9nX2Vycm9yKCkgdmFyaWFudHMuCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIE1ha2Ugc3VyZSB0aGUgYXJndW1lbnQgZm9yIHRoZSAtLWFkZC1tb2R1bGUgb3B0aW9uIHRvIEFQQUNJJ3MgY29uZmlndXJlCi0gICAgIHNjcmlwdCBpcyBvZiB0eXBlIFtwYXRoL3RvL11tb2RfeHh4LmMgYmVjYXVzZSBhbGwgY2FsY3VsYXRpb25zIGluc2lkZQotICAgICBjb25maWd1cmUgYW5kIHNyYy9Db25maWd1cmUgZGVwZW5kIG9uIHRoaXMuCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyMzA3Ci0KLSAgKikgQ2hhbmdlcyB1c2FnZSBvZiBwZXJyb3IvZnByaW50ZiB0byBzdGRlcnIgdG8gbW9yZSBwcm9wZXIgYXBfbG9nX2Vycm9yCi0gICAgIGluIG1vZF9taW1lLCBtb2RfbG9nX3JlZmVyZXIsIG1vZF9sb2dfYWdlbnQsIGFuZCBtb2RfbG9nX2NvbmZpZy4KLSAgICAgW0JyaWFuIEJlaGxlbmRvcmZdCi0KLSAgKikgVmFyaW91cyBPUy8yIGNsZWFudXBzIFsiQnJpYW4gSGF2YXJkIiA8YnJpYW5oQGtoZWxkYXIuYXBhbmEub3JnLmF1Pl0KLQotICAqKSBQT1JUOiBRTlggbmVlZGVkIGEgI2luY2x1ZGUgPHN5cy9tbWFuLmg+OyBhbmQgbm93IGl0IHVzZXMgZmxvY2sKLSAgICAgc2VyaWFsaXplZCBhY2NlcHQgdG8gaGFuZGxlIG11bHRpcGxlIHNvY2tldHMuCi0gICAgIFtSb2IgU2FjY29jY2lvIDxyb2JzQEluZmluaXRlVGVjaG5vbG9neS5jb20+XSBQUiMyMjk1LCAyMjk2Ci0gCi0gICopIEhhdmUgTlQgcHJvcGVybHkgc2V0IHRoZSBkaXJlY3RvcnkgZm9yIENHSSBzY3JpcHRzIAotICAgICAoJiBvdGhlciBzcGF3bmVkIGNoaWxkcmVuKQotICAgICBbVyBHIFN0b2RkYXJkIDx3Z3N0b2RkYUB1cy5pYm0uY29tPl0KLQotICAqKSBQcm9wYWdhdGUgZW52aXJvbm1lbnQgdG8gQ0dJIHNjcmlwdHMgY29ycmVjdGx5IGluIFdpbjMyLgotICAgICBbVyBHIFN0b2RkYXJkIDx3Z3N0b2RkYUB1cy5pYm0uY29tPl0gUFIjMjI5NAotCi0gICopIFNvbWUgc3ltYm9sIHJlbmFtaW5nOgotICAgICBhcF9zcGF3bl9jaGlsZF9lcnIgYmVjYW1lIGFwX3NwYXduX2NoaWxkCi0gICAgIGFwX3NwYXduX2NoaWxkX2Vycl9idWZmIGJlY2FtZSBhcF9ic3Bhd25fY2hpbGQKLSAgICAgc3Bhd25fY2hpbGQgd2FzIG9ic29sZXRlZCBhbmQgbW92ZWQgdG8gY29tcGF0LmgKLSAgICAgW0JyaWFuIEJlaGxlbmRvcmZdCi0KLSAgKikgVXBncmFkZSB0aGUgY2hpbGQgc3Bhd25pbmcgY29kZSBpbiBtb2RfcmV3cml0ZSBmb3IgdGhlIFJld3JpdGVNYXAKLSAgICAgcHJvZ3JhbXM6IGFwX3NwYXduX2NoaWxkX2VycigpIGlzIHVzZWQgYW5kIHRoZSBXaW4zMiBjYXNlIG5vdyB1c2VzCi0gICAgIENyZWF0ZVByb2Nlc3MoKSBpbnN0ZWFkIG9mIGEgbG93LWxldmVsIGV4ZWNsKCkgKHdoaWNoIGNhdXNlZCBwcm9ibGVtcyBpbgotICAgICB0aGUgcGFzdCB1bmRlciBXaW4zMikuCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIEEgZmV3IGNvc21ldGljcyBhbmQgdHJpdmlhbCBlbmhhbmNlbWVudHMgdG8gQVBYUyB0byBtYWtlIHRoZQotICAgICBnZW5lcmF0ZWQgTWFrZWZpbGUgbW9yZSB1c2VyIGZyaWVuZGx5LiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBQcm94eSBGaXg6IFRoZSBwcm94eSBzcGVjaWFsIGZhaWx1cmUgcm91dGluZSBhcF9wcm94eWVycm9yKCkKLSAgICAgd2FzIHVwZGF0ZWQgdG8gdXNlIHRoZSBub3JtYWwgYXBhY2hlIGVycm9yIHByb2Nlc3NpbmcsIHRoZXJlYnkgYWxsb3dpbmcKLSAgICAgcHJveHkgZXJyb3JzIHRvIGJlIHRyZWF0ZWQgYnkgRXJyb3JEb2N1bWVudCdzIGFzIHdlbGwuIEZvciB0aGlzCi0gICAgIHB1cnBvc2UsIGEgbmV3IG1vZHVsZS10by1jb3JlIGNvbW11bmljYXRpb24gdmFyaWFibGUgImVycm9yLW5vdGVzIgotICAgICB3YXMgaW50cm9kdWNlZDsgdGhlIHByb3h5IChhbmQgcG9zc2libHkgb3RoZXIgbW9kdWxlcykgY29tbXVuaWNhdGVzCi0gICAgIGl0cyBlcnJvciB0ZXh0IHVzaW5nIHRoaXMgdmFyaWFibGUuIEl0cyBjb250ZW50IGlzIGNvcGllZCB0byBhIG5ldwotICAgICBjZ2ktZW52LXZhciBSRURJUkVDVF9FUlJPUl9OT1RFUyBmb3IgdXNlIGJ5IEVycm9yRG9jdW1lbnRzLgotICAgICBUaGUgb2xkIHByb3h5IHNwZWNpYWwgZXJyb3Igcm91dGluZSBhcF9wcm94eV9sb2dfdWVycm9yKCkKLSAgICAgd2FzIHJlcGxhY2VkIGJ5IHJlZ3VsYXIgYXBfbG9nX2Vycm9yKCkgY2FsbHMsIG1hbnkgbWVzc2FnZXMgd2VyZSBtYWRlCi0gICAgIG1vcmUgaW5mb3JtYXRpdmUuIAotICAgICBbTWFydGluIEtyYWVtZXJdIFBSIzQ5NCwgMTI1OQotCi0gICopIFNFQ1VSSVRZOiBBIHBvc3NpYmxlIGJ1ZmZlciBvdmVyZmxvdyBpbiB0aGUgZnRwIHByb3h5IHdhcyBmaXhlZC4KLSAgICAgW01hcnRpbiBLcmFlbWVyXQotCi0gICopIFRyYW5zZm9ybSB0aGUgY29uZmlndXJlIG1lc3NhZ2UgIllvdSBuZWVkIHJvb3QgcHJpdmlsZWdlcyBmb3Igc3VFWEVDIgotICAgICBmcm9tIGEgZmF0YWwgZXJyb3IgaW50byBhIChtb3JlIGZyaWVuZGx5KSB3YXJuaW5nIGJlY2F1c2UgdGhlIGJ1aWxkaW5nCi0gICAgICgibWFrZSIpIG9mIEFwYWNoZSB3ZSBjYW4gYWxsb3csIG9mIGNvdXJzZS4gUm9vdCBwcml2aWxlZ2VzIGFyZSBuZWVkZWQKLSAgICAgb25seSBmb3IgdGhlIGluc3RhbGxhdGlvbiBzdGVwICgibWFrZSBpbnN0YWxsIikuIFNvIG1ha2Ugc3VyZSB0aGUKLSAgICAgdXNlciBpcyBhd2FyZSBvZiB0aGlzIGZhY3QgYnV0IGxldCBoaW0gcHJvY2VlZCBhcyBsb25nIGFzIGhlIGNhbi4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIyODgKLSAgCi0gICopIFJlbmFtZWQgdGhyZWUgbW9yZSBmdW5jdGlvbnMgdG8gY29tbW9uIGFwXyBwcmVmaXggd2hpY2ggd2UgbWlzc2VkIGF0IHRoZQotICAgICBCaWcgU3ltYm9sIFJlbmFtaW5nIGJlY2F1c2UgdGhleSdyZSAjZGVmaW5lcyBhbmQgbm90IHJlYWwgQyBmdW5jdGlvbnM6Ci0gICAgIGlzX2RlZmF1bHRfcG9ydCgpLCBkZWZhdWx0X3BvcnQoKSwgaHR0cF9tZXRob2QoKS4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgQSB6ZXJvLWxlbmd0aCBuYW1lIGFmdGVyIGEgJCBpbiBhbiBTU0kgZG9jdW1lbnQgc2hvdWxkIGNhdXNlCi0gICAgIGp1c3QgdGhlICQgdG8gYmUgaW4gdGhlIGV4cGFuc2lvbi4gIFRoaXMgd2FzIGJyb2tlbiBkdXJpbmcgdGhlCi0gICAgIHNlY3VyaXR5IGZpeGVzIGluIDEuMi41LiAgW0RlYW4gR2F1ZGV0XSBQUiMxOTIxLCAyMjQ5Ci0KLSAgKikgQ2FsbCBhcF9kZXN0cm95X3N1Yl9yZXEoKSBpbiBhcF9hZGRfY2dpX3ZhcnMoKSB0byByZWNsYWltIHNvbWUKLSAgICAgbWVtb3J5LiAgW1JvYiBTYWNjb2NjaW8gPHJvYnNASW5maW5pdGVUZWNobm9sb2d5LmNvbT5dIFBSIzIyNTIKLQotICAqKSBGaXggc3JjL3N1cHBvcnQvaHR0cGQuZXhwIChEU08gZXhwb3J0IGZpbGUgd2hpY2ggaXMgY3VycmVudGx5IG9ubHkKLSAgICAgdXNlZCB1bmRlciBBSVgpIGJlY2F1c2Ugb2YgcmVjZW50IGNoYW5nZXMgdG8gZnVuY3Rpb24gbmFtZXMuCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDEuM2I3Ci0KLSAgKikgTWFrZSBzdXJlIGEgTUlNRS10eXBlIGNhbiBiZSBmb3JjZWQgdmlhIGEgUmV3cml0ZVJ1bGUgZXZlbiB3aGVuIG5vCi0gICAgIHN1YnN0aXR1dGlvbiB0YWtlcyBwbGFjZSwgZm9yIGluc3RhbmNlIHZpYSB0aGUgZm9sbG93aW5nIHJ1bGU6Ci0gICAgIGBgUmV3cml0ZVJ1bGUgXm15c2NyaXB0JCAtIFtUPWFwcGxpY2F0aW9uL3gtaHR0cGQtY2dpXScnIFRoaXMgd2FzIG9mdGVuCi0gICAgIHJlcXVlc3RlZCBieSB1c2VycyBpbiB0aGUgcGFzdCB0byBmb3JjZSBhIHNpbmdsZSBzY3JpcHQgd2l0aG91dCBhIC5jZ2kKLSAgICAgZXh0ZW5zaW9uIGFuZCBvdXRzaWRlIGFueSBjZ2ktYmluIGRpcnMgdG8gYmUgZXhlY3V0ZWQgYXMgYSBDR0kgcHJvZ3JhbS4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIyNTQKLQotICAqKSBBIGZpeCBmb3IgcHJvdG9jb2wgaXNzdWVzIHN1cnJvdW5kaW5nIDQwMCwgNDA4LCBhbmQKLSAgICAgNDE0IHJlc3BvbnNlcy4gW0VkIEtvcnRob2ZdCi0KLSAgKikgSWdub3JlIE1heFJlcXVlc3RzUGVyQ2hpbGQgb24gV0lOMzIuIFtCcmlhbiBCZWhsZW5kb3JmXQotCi0gICopIEZpeCBkaXNjcmVwYW5jeSBpbiBwcm94eV9mdHAuYyB3aGljaCB3YXMgY2F1c2luZyBmYWlsdXJlcyB3aGVuIAotICAgICB0cnlpbmcgdG8gY29ubmVjdCB0byBjZXJ0YWluIGZ0cGQncywgc3VjaCBhcyBhbm9uZnRwZC4gIAotICAgICBbUmljayBPaG5lbXVzIDxyaWNrQGVjb21wY29uLmNvbT5dCi0KLSAgKikgTWFrZSBtb2RfcmV3cml0ZSB1c2UgYXBfb3Blbl9waXBlZF9sb2coKSBmb3IgUmV3cml0ZUxvZyBkaXJlY3RpdmUncwotICAgICBsb2dmaWxlIGluc3RlYWQgb2YgZmlkZGxpbmcgYXJvdW5kIGl0c2VsZiB3aXRoIGNoaWxkIHNwYXduaW5nIHN0dWZmLgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBNYWRlIFJlZmVyZXJJZ25vcmUgY2FzZS1pbnNlbnNpdGl2ZS4KLQotICAqKSBNb2RfbG9nX2FnZW50LCBtb2RfbG9nX3JlZmVyZXIgbm93IHVzZSBhcF9vcGVuX3BpcGVkX2xvZyBmb3IgcGlwZWQgbG9ncy4KLSAgICAgW0JyaWFuIEJlaGxlbmRvcmZdCi0KLSAgKikgUmVwbGFjZSB1c2Ugb2Ygc3Bhd25fY2hpbGQgd2l0aCBhcF9zcGF3bl9jaGlsZF9lcnJfYnVmZiwgdG8gbWFrZSBldmVyeXRoaW5nCi0gICAgICJzYWZlIiB1bmRlciBXaW4zMi4gIEluOiBtb2RfaW5jbHVkZS5jLCBtb2RfbWltZV9tYWdpYy5jCi0gICAgIFtCcmlhbiBCZWhsZW5kb3JmXQotCi0gICopIEltcHJvdmUgUkZDMTQxMyBzdXBwb3J0LiBbQm9iIEJlY2sgPGJlY2tAYm9maC51Y3MudWFsYmVydGEuY2E+XQotCi0gICopIEZpeCBzdXBwb3J0IHNjcmlwdCBgZGJtbWFuYWdlJzogSXQgd2FzIHVuYWJsZSB0byBoYW5kbGUgc29tZSBzb3J0Ci0gICAgIG9mIHBhc3N3b3JkcywgZXNwZWNpYWxseSBwYXNzd29yZHMgd2l0aCAiMCIgY2hhcnMuCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyMjQyCi0KLSAgKikgV0lOMzI6IENsaWNraW5nIG9uICJMYXN0IE1vZGlmaWVkIiBpbiBhIGZhbmN5IGluZGV4IGNhdXNlZCBhIGNyYXNoLiBGaXhlZC4KLSAgICAgW0JlbiBMYXVyaWVdIFBSIzIyMzgKLQotICAqKSBXSU4zMjogQ0dJcyBjb3VsZCBjYXVzZSBhIGhhbmcgKGJlY2F1c2Ugb2YgYSBkZWFkbG9jayBpbiB0aGUgc3RhbmRhcmQgQwotICAgICBsaWJyYXJ5KSwgc28gQ0dJIGhhbmRsaW5nIGhhcyBiZWVuIGNoYW5nZWQgdG8gdXNlIFdpbjMyIG5hdGl2ZSBoYW5kbGVzCi0gICAgIGluc3RlYWQgb2YgQyBmaWxlIGRlc2NyaXB0b3JzLgotICAgICBbQmVuIExhdXJpZSBhbmQgQmlsbCBTdG9kZGFyZCA8d2dzdG9kZGFAdXMuaWJtLmNvbT5dIFBSIzExMjksIDE2MDcKLQotICAqKSBUaGUgcHJveHkgY2FjaGUgd291bGQgc3RvcmUgYW4gaW5jb3JyZWN0IGNvbnRlbnQtbGVuZ3RoIGluIHRoZSBjYWNoZWQKLSAgICAgZmlsZSBjb3B5IGFmdGVyIGEgY2FjaGUgdXBkYXRlLiBUaGF0IHJlc3VsdGVkIGluIHJlcGVhdGVkIGZldGNoaW5nCi0gICAgIG9mIHRoZSBvcmlnaW5hbCBjb3B5IGluc3RlYWQgb2YgdXNpbmcgdGhlIGNhY2hlZCBjb3B5LgotICAgICBbRXJuc3QgS2xvcHBlbmJ1cmcgPGtsb3BwZW5AaXNyLnVuaS1zdHV0dGdhcnQuZGU+XSBQUiMyMDk0Ci0KLSAgKikgVGhlIE1ha2VmaWxlcyBhc3N1bWVkIHRoYXQgRFNPIGZpbGVzIGFyZSBidWlsZCB2aWEgJChMRCkuIFRoaXMKLSAgICAgaXMgYnJva2VuIGZvciB0d28gcmVhc29uczogRmlyc3Qgd2UgbmV2ZXIgZGVmaW5lZCBhdCBsZWFzdCBMRD1sZAotICAgICBzb21ld2hlcmUgdG8gbWFrZSBzdXJlIHRoaXMgd29ya3MgKGl0IHdhcyBzaWxlbnRseSBhc3N1bWVkIHRoYXQgbW9zdCBNYWtlCi0gICAgIHByb3ZpZGUgYSBidWlsdC1pbiBMRCBkZWZpbml0aW9uIC0gQVJHTCEpIGFuZCBzZWNvbmQgdXNpbmcgdGhlIGdlbmVyaWMgTEQKLSAgICAgdmFyaWFibGUgaXMgbm90IHRoZSB0cnV0aC4gSW5zdGVhZCBhIHNwZWNpYWwgdmFyaWFibGUgbmFtZWQgTERfU0hMSUIgaXMKLSAgICAgcmVhc29uYWJsZSBiZWNhdXNlIGFsdGhvdWdoICJsZCIgaXMgdXN1YWxseSB0aGUgZGVmYXVsdCwgdGhlIGNvbW1hbmQgZm9yCi0gICAgIGJ1aWxkaW5nIERTTyBmaWxlcyBjYW4gYmUgImxpYnRvb2wiIG9yIGV2ZW4gImNjIiBvbiBzb21lIHN5c3RlbXMuCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIFJlcGxhY2UgdGhlIEFkZFZlcnNpb25QbGF0Zm9ybSBkaXJlY3RpdmUgd2l0aCBTZXJ2ZXJUb2tlbnMgd2hpY2gKLSAgICAgcHJvdmlkZXMgZm9yIG1vcmUgY29udHJvbCBvdmVyIHRoZSBmb3JtYXQgb2YgdGhlIFNlcnZlcjoKLSAgICAgaGVhZGVyIGxpbmUuIFNFUlZFUl9TVUJWRVJTSU9OIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQ7Ci0gICAgIGFsbCBtb2R1bGUgc2hvdWxkIHVzZSB0aGUgYXBfYWRkX3ZlcnNpb25fY29tcG9uZW50KCkKLSAgICAgQVBJIGZ1bmN0aW9uIGluc3RlYWQuIFtKaW0gSmFnaWVsc2tpXQotCi0gICopIFN1cHBvcnQgZm9yIHRoZSBOQ1IgTVAvUkFTIDMuMAotICAgICBbSm9obiBXaXRoZXJzIDx3aXRoZXJzQHNlbWkua2NzYy5td3IuaXJzLmdvdj5dCi0KLSAgKikgVGhlIExERkxBR1NfU0hMSUJfRVhQT1JUIHZhcmlhYmxlIG9mIHNyYy9Db25maWd1cmF0aW9uWy50bXBsXSB3YXMKLSAgICAgbm90IHJldHJpZXZlZCBpbiBzcmMvQ29uZmlndXJlIGFuZCB0aHVzIHdhcyBub3QgdXNlYWJsZS4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0gCi0gICopIFZhcmlvdXMgTWFrZWZpbGUgY29uc2lzdGVuY3kgY2xlYW51cHM6Ci0gICAgIC0gbWFrZSBPU0RJUiBhbHNvIGF1dG9tYXRpY2FsbHkgYmUgcmVsYXRpdmUgdG8gc3JjLyBsaWtlIElOQ0RJUgotICAgICAtIFNVQkRJUlMgaXMgbm93IGdlbmVyYXRlZCBpbiBzcmMvTWFrZWZpbGUgb25seSBhbmQgbm90IGluCi0gICAgICAgTWFrZWZpbGUuY29uZmlnIGJlY2F1c2UgaXQgaXMgYSBsb2NhbCBkZWZpbmUgZm9yIHRoaXMgbG9jYXRpb24uCi0gICAgIC0gcmVtb3ZlIEJST0tFTl9CUFJJTlRGX0ZMQUdTIGJlY2F1c2UgaXMgaXQgbm8gbG9uZ2VyIHVzZWQgaW5zaWRlCi0gICAgICAgYW55IE1ha2VmaWxlIGJ1dCBtYWtlIHN1cmUgdGhhdCBhdCBsZWFzdCB0aGUgIi1LIGlubGluZSIgaXMga2VwdCBpbgotICAgICAgIENGTEFHUyBmb3IgU0NPIDUuCi0gICAgIC0gdXBkYXRlIHRoZSAiZGVwZW5kIiB0YXJnZXRzIGluIE1ha2VmaWxlLnRtcGwgZmlsZXMgdG8gdXNlICQoT1NESVIpLCB0b28uCi0gICAgIC0gdXBkYXRlZCB0aGUgZGVwZW5kZW5jaWVzIHRoZWlyc2VsZgotICAgICAtIHJlbW92ZWQgbm90IGV4aXN0aW5nIFNITElCIHZhcmlhYmxlIGZyb20gImNsZWFuIiB0YXJnZXRzCi0gICAgIC0gcmVwbGFjZWQgU0hMSUJfT0JKUy9TSExJQlNfT0JKIGNvbnNpc3RlbnRseSB3aXRoIE9CSlNfUElDIGJlY2F1c2UgT0JKUwotICAgICAgIGFscmVhZHkgZXhpc3RzIGFuZCBPQkpTX1BJQyBhcmUgYWxzbyBqdXN0IHBsYWluIG9iamVjdHMgYW5kIGhhdmUgbm90Ci0gICAgICAgZGlyZWN0bHkgdG8gZG8gd2l0aCAic2hhcmVkIiB0aGluZ3MuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhhdCB0aGV5Ci0gICAgICAgY29udGFpbiBQSUMuIFNvIE9CSlNfUElDIGlzIHRoZSBtb3JlIGNhbm9uaWNhbCBuYW1lLgotICAgICAtIFVwZGF0ZWQgdGhlIE1ha2VmaWxlLWRlcGVuZGVuY3kgbGluZXMgZm9yIE9CSlNfUElDCi0gICAgIC0gUmVtb3ZlZCB0aGUgTWFrZWZpbGUtZGVwZW5kZW5jeSBsaW5lIGluIENvbmZpZ3VyZSB0byBhdm9pZCBkb3VibGUKLSAgICAgICBkZWZpbml0aW9ucwotICAgICAtIHJlcGxhY2VkIHVnbHkgeHgtc28uby94eC5zby1vIGhhY2sgd2l0aCBhIGNsZWFuIGFuZCBjb25zaXN0ZW50IHVzYWdlCi0gICAgICAgb2YgeHh4LmxvIGFzIEdOVSBsaWJ0b29sIGRvZXMgd2l0aCBpdHMgUElDIG9iamVjdHMKLSAgICAgLSByZWR1Y2UgbG9jYWwgY29tcGxleGl0eSBpbiBtb2R1bGVzIE1ha2VmaWxlLnRtcGwgYnkgbW92aW5nIHRoZSBsYXN0Ci0gICAgICAgZXhpc3RpbmcgdGFyZ2V0ICJkZXBlbmQiIHRvIHRoZSBnZW5lcmF0aW9uIHNlY3Rpb24gaW4gQ29uZmlndXJlLCB0b28uCi0gICAgIC0gcmVtb3ZlZCB0aGUgaGlzdG9yaWNhbCAkKFNQQUNFUikgd2hpY2ggd2FzIHVzZWQgaW4gdGhlIHBhc3QgdG9nZXRoZXIKLSAgICAgICB3aXRoIEJST0tFTl9CUFJJTlRGX0ZMQUdTIHRvIGF2b2lkIHppZy16YWdzIGluIHRoZSBidWlsZCBwcm9jZXNzLiBUaGlzCi0gICAgICAgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLSAgICAgLSBmb3JjZSB0aGUgYnVpbGQgYW5kIHJ1biBvZiB0aGUgZ2VuX3h4eCBwcm9ncmFtcyB1bmRlciBtYWluLyBhcyB0aGUKLSAgICAgICBmaXJzdCBzdGVwIGJlZm9yZSBidWlsZGluZyB0aGUgb2JqZWN0cyBiZWNhdXNlIGl0IGxvb2tzIGNsZWFuZXIKLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgV0lOMzI6IE1ha2UgV2luMzIgd29yayBhZ2FpbiBhZnRlciB0aGUgL2Rldi9udWxsIERvUyBmaXguCi0gICAgIFtCZW4gTGF1cmllXQotCi0gICopIFdJTjMyOiBDaGVjayBmb3IgYnVmZmVyIG92ZXJmbG93cyBpbiBhcF9vc19jYW5vbmljYWxfZmlsZW5hbWUuCi0gICAgIFtCZW4gTGF1cmllXQotCi0gICopIFdJTjMyOiBEb24ndCBmb3JjZSBJU0FQSSBoZWFkZXJzIHRvIGZpbmlzaCB3aXRoIFxuLgotICAgICBbSmltIFBhdHRlcnNvbiA8SmltLlBhdHRlcnNvbkBDb2dub3MuQ09NPiwgQmVuIExhdXJpZV0gUFIjMjA2MAotCi0gICopIFdoZW4gb3BlbmluZyAiY29uZmlndXJhdGlvbiIgZmlsZXMgKGxpa2UgaHR0cGQuY29uZiwgaHRhY2Nlc3MKLSAgICAgYW5kIGh0cGFzc3dkKSwgQXBhY2hlIHdpbGwgbm90IGFsbG93IHRoZW0gdG8gYmUgbm9uLS9kZXYvbnVsbAotICAgICBkZXZpY2UgZmlsZXMuIFRoaXMgY2xvc2VzIGEgRG9TIGhvbGUuIEF0IHRoZSBzYW1lIHRpbWUsCi0gICAgIHdlIHVzZSBhcF9wZm9wZW4gdG8gb3BlbiB0aGVzZSBmaWxlcyB0byBoYW5kbGUgdGltZW91dHMuCi0gICAgIFtKaW0gSmFnaWVsc2tpLCBNYXJ0aW4gS3JhZW1lcl0KLQotICAqKSBBcGFjaGUgd2lsbCBub3cgbG9nIHRoZSByZWFzb24gaXRzIGh0dHBkIGNoaWxkcmVuIGV4aXQgaWYgdGhleSBleGl0Ci0gICAgIGR1ZSB0byBhbiB1bmV4cGVjdGVkIHNpZ25hbC4gIChJdCByZXF1aXJlcyBhIG5ldyBwb3J0aW5nIGRlZmluZSwKLSAgICAgU1lTX1NJR0xJU1QsIHdoaWNoIGlmIGRlZmluZWQgc2hvdWxkIHBvaW50IHRvIGEgbGlzdCBvZiB0ZXh0Ci0gICAgIGRlc2NyaXB0aW9ucyBvZiB0aGUgc2lnbmFscyBhdmFpbGFibGUuICBTZWUgUE9SVElORy4pICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgV0lOMzI6IGNoZGlyKCkgZG9lc24ndCBtYWtlIHNlbnNlIGluIGEgbXVsdGl0aHJlYWRlZCBlbnZpcm9ubWVudCAKLSAgICAgbGlrZSBXSU4zMi4gIEJlZm9yZSwgV2luMzIgQ0dJJ3MgY291bGQgaGF2ZSBoYWQgc3BvcmFkaWMgZmFpbHVyZXMgCi0gICAgIGlmIGEgY2hkaXIgY2FsbCBmcm9tIG9uZSB0aHJlYWQgd2FzIG1hZGUgYmV0d2VlbiBhbm90aGVyIGNoZGlyIGNhbGwgCi0gICAgIGFuZCBhIHNwYXduIGluIGFub3RoZXIgdGhyZWFkLiAgU28sIGZvciBub3cgZG9uJ3QgY2hkaXIgZm9yIENHSSBzY3JpcHRzIAotICAgICBpbiBXSU4zMi4gIFRoZSBjdXJyZW50IENHSSAic3BlYyIgaXMgdW5jbGVhciBhcyB0byB3aGV0aGVyIGl0J3MgCi0gICAgIG5lY2Vzc2FyeS4gIExvbmctdGVybSBmaXggaXMgdG8gZWl0aGVyIHNlcmlhbGl6ZSB0aGUgY2hkaXIvc3Bhd24gY29tYm8gCi0gICAgIG9yIHVzZSBXSU4zMiBuYXRpdmUgY2FsbHMgdG8gc3Bhd24gYSBwcm9jZXNzLiAgVGhpcyB0ZW1wIGZpeCB3YXMgCi0gICAgIG5lY2Vzc2FyeSB0byByZW1vdmUgdGhpcyBhcyBhIHNob3dzdG9wcGVyIGZvciAxLjMncyByZWxlYXNlLiAKLSAgICAgW0JyaWFuIEJlaGxlbmRvcmZdCi0KLSAgKikgQ2xlYW51cCB0aGUgc3VFWEVDIHN1cHBvcnQgaW4gQVBBQ0kgYW5kIG1ha2UgaXQgbW9yZSBzYWZlOgotICAgICAxLiBBZGQgYmlnIGZhdCBoaW50IGluIElOU1RBTEwgYWJvdXQgcmlza3MgYW5kIHRvIHJlYWQgdGhlCi0gICAgICAgIGh0ZG9jcy9tYW51YWwvc3VleGVjLmh0bWwgZG9jdW1lbnQgYmVmb3JlIHVzaW5nIHRoZSBzdWV4ZWMtcmVsYXRlZAotICAgICAgICBjb25maWd1cmUgb3B0aW9ucy4KLSAgICAgMi4gTWFrZSBzdXJlIHRoZSB1c2VyIGhhcyBhdCBsZWFzdCBwcm92aWRlZCBvbmUgLS1zdWV4ZWMteHh4eCBvcHRpb24KLSAgICAgICAgKHNwZWNpZmllcyBzdUVYRUMgcGFyYW1ldGVycykgaW4gYWRkaXRpb24gdG8gLS1lbmFibGUtc3VleGVjIG9wdGlvbi4KLSAgICAgICAgSWYgb25seSAtLWVuYWJsZS1zdWV4ZWMgaXMgZ2l2ZW4gQVBBQ0kgc3RvcHMgd2l0aCBhIGhpbnQgdG8gSU5TVEFMTAotICAgICAgICBhbmQgaHRkb2NzL21hbnVhbC9zdWV4ZWMuaHRtbCBkb2N1bWVudHMuCi0gICAgIDMuIFByb3ZpZGUgdHdvIGFkZGl0aW9uYWwgLS1zdWV4ZWMteHh4eCBvcHRpb25zIHRvIG1ha2UgdGhlIHN1RVhFQwotICAgICAgICBjb25maWd1cmF0aW9uIGNvbXBsZXRlIChlc3BlY2lhbGx5IGZvciBwYWNrYWdlIG1haW50YWluZXJzIHdobyBlbHNlCi0gICAgICAgIGhhZCB0byBwYXRjaCB0aGUgc291cmNlIHRyZWUpIGJ5IHByb3ZpZGluZyB3YXlzIHRvIGNvbmZpZ3VyZSBtaW5pbWFsCi0gICAgICAgIFVJRC9HSUQgYW5kIHNhZmUgUEFUSCwgdG9vLgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBDbGVhbnVwIG9mIHRoZSBgY29uZmlndXJlIC0tc2hhZG93JyBwcm9jZXNzOgotICAgICAtIG1ha2Ugc3VyZSB0aGUgY29uZmlndXJlIHNjcmlwdCBjcmVhdGVzIGl0cyB0ZW1wb3JhcnkgZmlsZXMgaW4gdGhlCi0gICAgICAgc2hhZG93IHRyZWUgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggcGFyYWxsZWwgY29uZmlndXJlIHJ1bnMKLSAgICAgLSByZW1vdmVkIHVubmVjZXNzYXJ5IG9wdGlvbiAiLXIiIGZyb20gInJtIiBjYWxsIGZvciBNYWtlZmlsZXMKLSAgICAgLSBtYWtlIHN1cmUgdGhlIGNvbmZpZ3VyZSBzY3JpcHRzIGNyZWF0ZXMgdGhlIHNoYWRvdy13cmFwcGVyIE1ha2VmaWxlCi0gICAgICAgb25seSB3aGVuIG5vIHNoYWRvdyB0cmVlcyBhbHJlYWR5IGV4aXN0cwotICAgICAtIG1ha2Ugc3VyZSAibWFrZSBkaXN0Y2xlYW4iIHJlbW92ZXMgdGhlIHNoYWRvdy13cmFwcGVyIE1ha2VmaWxlIGJ1dCBvbmx5Ci0gICAgICAgd2hlbiBubyBtb3JlIHNoYWRvdyB0cmVlcyBleGlzdHMKLSAgICAgLSBvdmVyaGF1bGVkIG1rc2hhZG93LnNoIHNjcmlwdDogbm93IGl0cyBtb3JlIElGUy1zYWZlIGFuZCBhcHByb3guIHR3aWNlCi0gICAgICAgYXMgZmFzdCAoaW4gdGhlIHBhc3QgaXQgbmVlZGVkIDcwc2VjLCBub3cgaXQgcnVucyBqdXN0IDM4c2VjKQotICAgICAtIG1ha2Ugc3VyZSBDVlMgZG9lcyBub3QgY29tcGxhaW4gYWJvdXQgdGhlIGNyZWF0ZWQgZmlsZXMKLSAgICAgICBNYWtlZmlsbGUuPGdudXRyaXBsZT4gYW5kIGRpcmVjdG9yaWVzIHNyYy48Z251dHJpcGxlPgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBBZGRlZCB0aGUgYXBfYWRkX3ZlcnNpb25fY29tcG9uZW50KCkgQVBJIHJvdXRpbmUgYW5kIHRoZQotICAgICBBZGRWZXJzaW9uUGxhdGZvcm0gY29yZSBkaXJlY3RpdmUuICBUaGUgZmlyc3QgYWxsb3dzIG1vZHVsZXMgdG8KLSAgICAgZGVjbGFyZSB0aGVtc2VsdmVzIGluIHRoZSBTZXJ2ZXIgcmVzcG9uc2UgaGVhZGVyIGZpZWxkIHZhbHVlLAotICAgICBhdWdtZW50aW5nIHRoZSBTRVJWRVJfU1VCVkVSU0lPTiBkZWZpbmUgaW4gdGhlIENvbmZpZ3VyYXRpb24gZmlsZQotICAgICB3aXRoIHJ1bi10aW1lIHNldHRpbmdzIChtb3JlIHVzZWZ1bCBpbiBhIGxvYWRhYmxlLW1vZHVsZSBlbnZpcm9ubWVudCkuCi0gICAgIEFkZFZlcnNpb25QbGF0Zm9ybSBpbnNlcnRzIGEgY29tbWVudCBzdWNoIGFzICIoVU5JWCkiIG9yICIoV2luMzIpIgotICAgICBpbnRvIHRoZSBzZXJ2ZXIgdmVyc2lvbiBzdHJpbmcuICBbS2VuIENvYXJdIFBSIzIwNTYKLQotICAqKSBNaW5vciBzdGFiaWxpdHkgdHdlYWtzIHRvIGF2b2lkIGNvcmUgZHVtcHMgaW4gYXBfc25wcmludGYuCi0gICAgIFtNYXJ0aW4gS3JhZW1lcl0KLQotICAqKSBFbWl0IHRoZSAiQWNjZXB0LVJhbmdlIiBoZWFkZXIgZm9yIHRoZSBkZWZhdWx0IGhhbmRsZXIuCi0gICAgIFtCcmlhbiBCZWhsZW5kb3JmXSBQUiMxNDY0Ci0KLSAgKikgQWRkIGEgbm90ZSB0byBodHRwZC5jb25mLWRpc3QgdGhhdCBhcGFjaGUgd2lsbCBvbiBzb21lIHN5c3RlbXMgZmFpbAotICAgICB0byBzdGFydCB3aGVuIHRoZSBHcm91cCAjIGlzIHNldCB0byBhIG5lZ2F0aXZlIG9yIGxhcmdlIHBvc2l0aXZlIHZhbHVlLgotICAgICBbTWFydGluIEtyYWVtZXJdCi0KLSAgKikgTWFrZSBzdXJlIHRoZSBtb2R1bGUgZXhlY3V0aW9uIG9yZGVyIGlzIGNvcnJlY3QgZXZlbiB3aGVuIHNvbWUgbW9kdWxlcwotICAgICBhcmUgbG9hZGVkIHVuZGVyIHJ1bnRpbWUgKGBMb2FkTW9kdWxlJykgdmlhIHRoZSBEU08gbWVjaGFuaXNtOgotICAgICAxLiBUaGUgbGlzdCBvZiBsb2FkZWQgbW9kdWxlcyBpcyBub3cgYSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgb25lCi0gICAgICAgIGFuZCBub3QgdGhlIG9yaWdpbmFsIHN0YXRpY2FsbHkgbGlzdCBmcm9tIG1vZHVsZXMuYwotICAgICAyLiBUaGUgbG9hZGVkIG1vZHVsZXMgYXJlIG5vdyBjb3JyZWN0bHkgc2V0dXAgYnkgTG9hZE1vZHVsZSBmb3IKLSAgICAgICAgbGF0ZXIgdXNlIGJ5IHRoZSBBZGRNb2R1bGUgY29tbWFuZC4KLSAgICAgMy4gV2hlbiB0aGUgRFNPIG1lY2hhbmlzbSBmb3IgbW9kdWxlcyBpcyB1c2VkIEFQQUNJJ3MgYGluc3RhbGwnCi0gICAgICAgIHRhcmdldCBub3cgZW5hYmxlcyBhbGwgY3JlYXRlZCBgTG9hZE1vZHVsZScgbGluZXMgcGVyIGRlZmF1bHQgYmVjYXVzZQotICAgICAgICB0aGlzIGlzIGJvdGggYWxyZWFkeSBleHBlY3RlZCBieSB0aGUgdXNlciBfYW5kXyBuZWVkZWQgdG8gYXZvaWQKLSAgICAgICAgY29uZnVzaW9uIHdpdGggdGhlIG5leHQgcG9pbnQgYW5kIHJlZHVjZXMgdGhlIE1ha2VmaWxlLnRtcGwgY29tcGxleGl0eQotICAgICA0LiBXaGVuIHRoZSBEU08gbWVjaGFuaXNtIGZvciBtb2R1bGVzIGlzIHVzZWQsIEFQQUNJJ3MgYGluc3RhbGwnCi0gICAgICAgIHRhcmdldCBub3cgYWRkaXRpb25hbGx5IG1ha2VzIHN1cmUgdGhlIG1vZHVsZSBsaXN0IGlzIHJlY29uc3RydWN0ZWQKLSAgICAgICAgdmlhIGEgY29tcGxldGUgYENsZWFyTW9kdWxlTGlzdCtBZGRNb2R1bGUuLi4nIGVudHJ5LgotICAgICA1LiBUaGUgc3VwcG9ydCB0b29sIGBhcHhzJyBub3cgYWxzbyBtYWtlcyBzdXJlIGFuIEFkZE1vZHVsZSBjb21tYW5kCi0gICAgICAgIGlzIGFkZGVkIGluIGFkZGl0aW9uIHRvIHRoZSBMb2FkTW9kdWxlIGNvbW1hbmQuCi0gICAgIDYuIFRoZSBtb2R1bGVzLmMgZ2VuZXJhdGlvbiB3YXMgZXh0ZW5kZWQgdG8gbm93IGNvbnRhaW4gdHdvCi0gICAgICAgIGNvbW1lbnRzIHRvIG1ha2Ugc3VyZSBubyBvbmUgaXMgY29uZnVzZWQgYnkgdGhlIGNvbmZ1c2luZyB0ZXJtaW5vbG9neQotICAgICAgICBvZiBsb2FkaW5nL2xpbmtpbmcgKHdlIHVzZSBsb2FkPWxpbmsrbG9hZCAmIGxpbms9YWN0aXZhdGUgaW5zdGVhZCBvZgotICAgICAgICB0aGUgb2J2aW91cyBsb2FkPWFjdGl2YXRlICYgbGluaz1saW5rIDotKCApCi0gICAgIFRoaXMgd2F5IG5vdyB0aGVyZSBpcyBubyBsb25nZXIgYSBkaWZmZXJlbmNlIHVuZGVyIGV4ZWN1dGlvbiB0aW1lIGJldHdlZW4KLSAgICAgc3RhdGljYWxseSBhbmQgZHluYW1pY2FsbHkgbGlua2VkIG1vZHVsZXMuCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIEZpeCB0aGUgZ2VuZXJhdGVkIG1vZF94eHguYyBmcm9tICJhcHhzIC1nIC1mIHh4eCIgYWZ0ZXIgdGhlCi0gICAgIEJpZyBTeW1ib2wgUmVuYW1pbmcuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIEFkZCBhIGNvbW1lbnQgdG8gbW9kX2V4YW1wbGUuYyBzaG93aW5nIHRoZSBmb3JtYXQgb2YgYSBGTEFHIGNvbW1hbmQKLSAgICAgaGFuZGxlci4gIFtLZW4gQ29hcl0KLQotICAqKSBTdGFuZGFyZGl6ZWQgdGhlIHRpbWUgZm9ybWF0IGluIG1vZF9zdGF0dXMgdG8gbWF0Y2ggdGhhdCBvZiBvdGhlciAKLSAgICAgcGxhY2VzIGluIHRoZSBjb2RlIChlLmcuIERBVEVfR01UKS4gIFBSIzE1NTEKLQotICAqKSBGaXggaGFuZGxpbmcgb2YgJVogaW4gdGltZWZtdCBzdHJpbmdzIGZvciB0aG9zZSBwbGF0Zm9ybXMgd2l0aCBubyB0aW1lCi0gICAgIHpvbmUgaW5mb3JtYXRpb24gaW4gdGhlaXIgdG0gc3RydWN0LiBbUGF1bCBFZ2dlcnQgPGVnZ2VydEB0d2luc3VuLmNvbT5dCi0gICAgIFBSIzc1NAotCi0gICopIE1ha2VzIG1vZF9yZXdyaXRlLCBtb2RfbG9nX2NvbmZpZywgbW9kX3N0YXR1cyBhbmQgdGhlIFNlcnZlclNpZ25hdHVyZSAKLSAgICAgZmVhdHVyZSBjb21wYXRpYmxlIHdpdGggJ1VzZUNhbm9uaWNhbE5hbWUgb2ZmJyBieSBjaGFuZ2luZyAgCi0gICAgIHItPnNlcnZlci0+c2VydmVyX2hvc3RuYW1lIHRvIGFwX2dldF9zZXJ2ZXJfbmFtZSgpLiAgQW5kIEkgY2hhbmdlZCBzb21lIAotICAgICBmdW5jdGlvbnMgd2hpY2ggdXNlIHItPnNlcnZlci0+cG9ydCB0byB1c2UgYXBfZ2V0X3NlcnZlcl9wb3J0KCkgaW5zdGVhZCwgCi0gICAgIGJlY2F1c2UgaWYgdGhlcmUncyBubyBQb3J0IGRpcmVjdGl2ZSBpbiB0aGUgY29uZmlnIHItPnNlcnZlci0+cG9ydCBpcyAwLgotICAgICBbTGFycyBFaWxlYnJlY2h0XQotCi0gICopIGdldC9zZXRfbW9kdWxlX2NvbmZpZyBhcmUgdHJpdmlhbCBlbm91Z2ggdG8gYmUgYmV0dGVyIG9mZiBpbmxpbmUuICBXb3J0aAotICAgICAxLjUlIHBlcmZvcm1hbmNlIGJvb3N0LiBbRGVhbiBHYXVkZXRdCi0KLSAgKikgRml4IG9mZi1ieS1vbmUgZXJyb3IgaW4gYXBfcHJveHlfZGF0ZV9jYW5vbigpIGluIHByb3h5X3V0aWwuYwotICAgICB3aGVuIGVuc3VyaW5nICd4JyBpcyBhdCBsZWFzdCAzMC1jaGFycyBiaWcuIFtKaW0gSmFnaWVsc2tpLAotICAgICBCcmlhbiBCZWhsZW5kb3JmXQotCi0gICopIFtCUzIwMDAgc2VjdXJpdHldIEJTMjAwMCBuZWVkcyBhbiBleHRyYSBhdXRoZW50aWNhdGlvbiB0byBpbml0aWFsaXplCi0gICAgIHRoZSB0YXNrIGVudmlyb25tZW50IHRvIHRoZSB1bnByaXZpbGVnZWQgVXNlciBpZC4gT3RoZXJ3aXNlIENHSSBzY3JpcHRzCi0gICAgIHdvdWxkIGhhdmUgYSB3YXkgdG8gZ2FpbiBzdXBlciB1c2VyIGFjY2Vzcy4gW01hcnRpbiBLcmFlbWVyXQotCi0gICopIEZpeCBkZWJ1ZyBsb2cgbWVzc2FnZXMgZm9yIEJTMjAwMC9PU0Q6IGluc3RlYWQgb2YgbG9nZ2luZyB0aGUgd2hvbGUKLSAgICAgYWJzb2x1dGUgcGF0aCwgb25seSBsb2cgYmFzZSBuYW1lIG9mIGxvZ2dpbmcgc291cmNlIGFzIGlzIGRvbmUKLSAgICAgaW4gdW5peC4gW01hcnRpbiBLcmFlbWVyXQotCi0gICopIFJvbmFsZCBUc2NoYWxhZXIncyBBY2NlcHQtRW5jb2RpbmcgcGF0Y2ggLSBwcmVzZXJ2ZSB0aGUgIngtIiBpbgotICAgICB0aGUgZW5jb2RpbmcgdHlwZSBmcm9tIHRoZSBBY2NlcHQtRW5jb2RpbmcgaGVhZGVyIChpZiBpdCdzIHRoZXJlKQotICAgICBhbmQgdXNlIGl0IGluIHRoZSByZXNwb25zZSwgYXMgdGhhdCdzIHByb2JhYmx5IHdoYXQgaXQnbGwgYmUgZXhwZWN0aW5nLgotICAgICBbUm9uYWxkLlRzY2hhbGFlckBwc2kuY2hdCi0KLSAgKikgRml4IHRvIG1vZF9hbGlhczogdHJhbnNsYXRlX2FsaWFzX3JlZGlyIGlzIGRlYWxpbmcgd2l0aAotICAgICBhIFVSSSwgbm90IGEgZmlsZW5hbWUsIHNvIHRoZSBjaGVjayBmb3IgZHJpdmUgbGV0dGVycyBmb3Igd2luMzIgCi0gICAgIGFuZCBlbXggaXMgbm90IG5lY2Vzc2FyeS4gW0RlYW4gR2F1ZGV0XQotCi0gICopIFdJTjMyOiBBbGxvdyAuY21kIGFzIGFuIGV4ZWN1dGFibGUgZXh0ZW5zaW9uLgotICAgICBbS2FyaSBMaWtvdnVvcmkgPEthcmkuTGlrb3Z1b3JpQG1vbC5maT5dIFBSIzIxNDYKLQotICAqKSBNYWtlIEFwYWNoZSBoZWFkZXIgZmlsZXMsIGFuZCBzb21lIHZhcmlhYmxlcywgQysrIGZyaWVuZGx5LgotICAgICBbTWljaGFlbCBBbmRlcnNvbidzIDxta2FAcmVkZXMuaW50LmNvbS5teD5dCi0KLSAgKikgQ2hpbGQgcHJvY2Vzc2VzIGNhbiBub3cgInNpZ25hbCIgKGJ5IGV4aXRpbmcgd2l0aCBhIHN0YXR1cwotICAgICBvZiBBUEVYSVRfQ0hJTERGQVRBTCkgdGhlIHBhcmVudCBwcm9jZXNzIHRvIGFib3J0IGFuZAotICAgICBzaHV0ZG93biB0aGUgc2VydmVyIGlmIHRoZSBlcnJvciBpbiB0aGUgY2hpbGQgcHJvY2VzcyB3YXMKLSAgICAgZmF0YWwgZW5vdWdoLiBbSmltIEphZ2llbHNraV0KLQotICAqKSBtb2RfYXV0b2luZGV4J3MgZmluZF9pdG1lKCkgd2FzIHNlbnNpdGl2ZSB0byBNSU1FIHR5cGUgY2FzZS4KLSAgICAgW0ppbSBKYWdpZWxza2ldIFBSIzIxMTIKLQotICAqKSBNYWtlIHN1cmUgdGhlIHJlZmVyZXJfbG9nIGFuZCBhZ2VudF9sb2cgZW50cmllcyBpbiB0aGUgZGVmYXVsdCBodHRwZC5jb25mCi0gICAgIGZpbGUgYXJlIGFsc28gYWRqdXN0ZWQgZm9yIHRoZSBhY3R1YWwgcmVsYXRpdmUgaW5zdGFsbGF0aW9uIHBhdGhzLgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjE3NQotCi0gICopIFdJTjMyOiBFeHRlbnNpdmUgb3ZlcmhhdWwgb2YgdGhlIHdheSBVTkNzIGFyZSBoYW5kbGVkLiBbQmVuIExhdXJpZV0KLQotICAqKSBXSU4zMjogTWFrZSByb290cyBvZiBmaWxlc3lzdGVtcyAoZS5nLiBjOi8pIHdvcmsuIFtCZW4gTGF1cmllXQotICAgICBQUiMxNTU4Ci0KLSAgKikgUE9SVDogVmFyaW91cyBwb3J0aW5nIGNoYW5nZXMgdG8gc3VwcG9ydCBBSVggMy4yLCA0LjEuNSwgNC4yIGFuZCA0LjMuCi0gICAgIEFkZGl0aW9uYWxseSB0aGUgY2hlY2tzIGZvciBmaW5kaW5nIHRoZSB2ZW5kb3IgRFNPIGxpYnJhcnkgd2VyZSBtb3ZlZAotICAgICBmcm9tIG1vZF9zby5jIHRvIENvbmZpZ3VyZSBiZWNhdXNlIGZpcnN0IGl0IG5lZWRzICRQTEFUIGV0Yy4gYW5kIHNlY29uZAotICAgICBtb2Rfc28gYWxyZWFkeSB1c2VzIGFuIGFic3RyYWN0aW9uIGxheWVyIGFuZCBkb2VzIG5vdCBmaWRkbGUgd2l0aCB0aGUKLSAgICAgdmVuZG9yIGZ1bmN0aW9ucyBpdHNlbGYuCi0gICAgIFtKZW5zLVV3ZSBNYWdlciwgUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBQT1JUOiBTb21lIG9wdGltaXphdGlvbiBkZWZpbmVzIGZvciBOZXRCU0QKLSAgICAgW0phcm9taXIgRG9sZWNlayA8ZG9sZWNla0BpY3MubXVuaS5jej5dIFBSIzIxNjUKLQotICAqKSBQT1JUOiBEeW5hbWljIFNoYXJlZCBPYmplY3QgKERTTykgc3VwcG9ydCBmb3IgTmV0QlNELgotICAgICBbSmFyb21pciBEb2xlY2VrIDxkb2xlY2VrQGljcy5tdW5pLmN6PiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjE1OAotCi0gICopIEFkZCBEeW5hbWljIFNoYXJlZCBPYmplY3QgKERTTykgc3VwcG9ydCBmb3IgQUlYIChhdCBsZWFzdCA0LjIgYnV0IG9sZGVyCi0gICAgIEFJWCB2YXJpYW50cyBzaG91bGQgd29yayBmaW5lLCB0b28uIEV2ZW4gQUlYIDMueCBzaG91bGQgd29yaykuIFRoaXMgaXMKLSAgICAgYWNjb21wbGlzaGVkIGJ5IHVzaW5nIHRoZSBmcmVlIERTTyBlbXVsYXRpb24gY29kZSBmcm9tIEplbnMtVXdlIE1hZ2VyCi0gICAgIHdoaWNoIHdlIHB1dCBpbnRvIGEgb3MvdW5peC9vcy1kc28tYWl4LmMgZmlsZS4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0gIAotICAqKSBQT1JUOiBGaXggY29tcGlsZXIgd2FybmluZ3MgdW5kZXIgQUlYID49IDQuMiB3aGVyZSB0aGUgbWFudWFsIHBhZ2VzIGltcGx5Ci0gICAgIHRoYXQgd2Ugc2hvdWxkIHVzZSBORVRfU0laRV9UID09IGludCBidXQgdGhlIGluY2x1ZGUgZmlsZXMgZm9yY2Ugc2l6ZV90LgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBGaXggdHdvIGJ1Z3MgaW4gc2VsZWN0KCkgaGFuZGxpbmcgaW4gaHR0cF9tYWluLmMuCi0gICAgIFtSb3kgRmllbGRpbmddCi0KLSAgKikgU3VwcHJlc3MgImVycm9yKDApIiBtZXNzYWdlcyBmb3IgYXBfbG9nX2Vycm9yKCkgd2hlbiB0aGUgQVBMT0dfTk9FUlJOTwotICAgICBpcyB1bnNldCAoYXMgaXQgaXMgaW4gc2l0dWF0aW9ucyBsaWtlIHRpbWVvdXRzKSB3aGVyZSBpdCBpcyB1bmNsZWFyCi0gICAgIHdoZXRoZXIgZXJybm8gaXMgc2V0IG9yIG5vdC4gIFtNYXJ0aW4gS3JhZW1lcl0KLQotICAqKSBKdXN0IGhhdmluZyBBUEFDSSdzIGxvY2Fsc3RhdGVkaXIgaXMgdG9vIGdlbmVyYWwgYW5kIG5vdCBlbm91Z2ggZm9yIG1vc3QKLSAgICAgb2YgdGhlIHN5c3RlbXMuIDEuM2I2IGFnYWluIHJlcXVpcmVkIG1hbnVhbCBBUEFDSSBwYXRjaGVzIGJ5IHBhY2thZ2UKLSAgICAgbWFpbnRhaW5lcnMgZnJvbSBSZWRIYXQgYW5kIEZyZWVCU0QgYmVjYXVzZSBmb3IgdGhlaXIgZmlsZXN5c3RlbSBsYXlvdXQgYQotICAgICBsaXR0bGUgYml0IG1vcmUgZmxleGliaWxpdHkgaW4gY29uZmlndXJpbmcgdGhlIHBhdGhzIGlzIG5lZWRlZC4gSGVuY2Ugd2UKLSAgICAgcHJvdmlkZSB0aHJlZSBhZGRpdGlvbmFsIGNvbmZpZ3VyZSBvcHRpb25zICgtLXJ1bnRpbWVkaXIsIC0tbG9nZmlsZWRpciwKLSAgICAgLS1wcm94eWNhY2hlZGlyKSB3aGljaCBub3cgY2FuIGJlIHVzZWQgZm9yIG1vcmUgZ3JhbnVsYXIgYWRqdXN0bWVudHMgaWYKLSAgICAgLS1sb2NhbHN0YXRlZGlyIGlzIG5vdCBlbm91Z2ggdG8gZml0IHRoZSBwYXJ0aWN1bGFyIG5lZWRzLiBBcyBhIG5pY2UKLSAgICAgc2lkZS1lZmZlY3QgdGhpcyByZWR1Y2VzIHNvbWUgc3ViZGlyIGZpZGRsaW5nIGluIGNvbmZpZ3VyZStNYWtlZmlsZS50bXBsLgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBNYWtlIHRoZSBpbnN0YWxsIHJvb3QgZm9yICJtYWtlIGluc3RhbGwiIGluIEFQQUNJJ3MgTWFrZWZpbGUgb3ZlcnJpZGVhYmxlCi0gICAgIGJ5IHBhY2thZ2UgYXV0aG9ycy4gIFRoaXMgd2F5IHdlIGFyZSBldmVuIG1vcmUgZnJpZW5kbHkgdG8gcGFja2FnZQotICAgICBtYWludGFpbmVycyAoZXNwZWNpYWxseSBEZWJpYW4gYW5kIFJlZEhhdCkgd2hvIGJ1aWxkIGZvciB0aGUgcmVhbCBwcmVmaXgKLSAgICAgdmlhICJjb25maWd1cmUgLS1wcmVmaXg9LzxyZWFsPiIgYnV0IHVzZSBhIGRpZmZlcmVudCBsb2NhbCBwcmVmaXggdmlhCi0gICAgICJtYWtlIHJvb3Q9L3RtcC9hcGFjaGUgaW5zdGFsbCIgZm9yIHJvbGxpbmcgdGhlIHBhY2thZ2Ugd2l0aG91dCBicmlzdGxpbmcKLSAgICAgdGhlIHRhcmdldCBsb2NhdGlvbiBvbiB0aGVpciBzeXN0ZW0uIAotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBXb3JrYXJvdW5kIHNlZCBsaW1pdGF0aW9ucyBpbiBBUEFDSSdzIGNvbmZpZ3VyZSBzY3JpcHQgYnkgbm93Ci0gICAgIHN1YnN0aXR1dGluZyBpbiBjaHVua3Mgb2YgNTAgY29tbWFuZHMgKGJlY2F1c2UgZm9yIGluc3RhbmNlIEhQVVgncyB2ZW5kb3IKLSAgICAgc2VkIGhhcyBhIGxpbWl0IG9mIG1heC4gOTggY29tbWFuZHMpCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyMTM2Ci0KLSAgKikgQWRkaW5nIFNPQ0tTNSBzdXBwb3J0IGFuZCBmaXhpbmcgZXhpc3RpbmcgU09DS1M0IHN1cHBvcnQuCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyMTQwCi0KLSAgKikgTWFudWFsbHkgZml4IHNvbWUgc3ltYm9scyB3aGljaCB3ZXJlIG5vdCByZW5hbWVkIHRvIHByZWZpeCBhcF8gaW4gdGhlIEJJRwotICAgICBSRU5BTUlORyBwcm9jZXNzIGJlY2F1c2UgdGhleSBhcmUgZGVmaW5lZCBhcyBwcmUtcHJvY2Vzc29yIG1hY3JvcyBpbnN0ZWFkCi0gICAgIG9mIHJlYWwgZnVuY3Rpb25zOiBicHV0YywgYmdldGMsIHBpcGVkX2xvZ193cml0ZV9mZCwgcGlwZWRfbG9nX3JlYWRfZmQKLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgV29ya2Fyb3VuZCBicmFpbmRlYWQgQVdLJ3Mgd2hlbiBnZW5lcmF0aW5nIGFwX2NvbmZpZy5oOiBUaGUgc3BsaXQoKSBhbmQKLSAgICAgc3Vic3RyKCkgZnVuY3Rpb25zIGNhbm5vdCBiZSBuZXN0ZWQgdW5kZXIgdmVuZG9yIEFXSyBmcm9tIFNvbGFyaXMgMi42LgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjEzOQotCi0gICopIFZhcmlvdXMgYnVnZml4ZXMgYW5kIGNsZWFudXBzIGZvciB0aGUgQVBBQ0kgY29uZmlndXJlIHNjcmlwdDoKLSAgICAgbyBmaXggSUZTIGhhbmRsaW5nIGZvciBfbmVzdGVkXyBzaXR1YXRpb24KLSAgICAgbyBmaXggUGVybCBpbnRlcnByZXRlciBzZWFyY2g6IHRha2UgZmlyc3Qgb25lIGZvdW5kIGluc3RlYWQgb2YgbGFzdCBvbmUKLSAgICAgbyBmaXggRFNPIGNvbnNpc3RlbmN5IGNoZWNrCi0gICAgIG8gcHJpbnQgZXJyb3IgbWVzc2FnZXMgdG8gc3RkZXJyIGluc3RlYWQgb2Ygc3Rkb3V0Ci0gICAgIG8gYWRkIGluc3RhbGwtcXVpZXQgZm9yIC0tc2hhZG93IHNpdHVhdGlvbiB0byBNYWtlZmlsZSBzdHViCi0gICAgIG8gcmVkdWNlIGNvbXBsZXhpdHkgYnkgYXZvaWRpbmcgc2VkLWhhY2tzIGZvciBydWxlIGFuZCBtb2R1bGUgbGlzdCBsb29wcwotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBGaXggREVCVUdfQ0dJIHNpdHVhdGlvbiBpbiBtb2RfY2dpLmMgW0RhdmlkIE1hY0tlbnppZV0gUFIjMjExNAotCi0gICopIE1ha2Ugc3VyZSB0aGUgaW5wdXQgZmllbGQgc2VwYXJhdG9yIChJRlMpIHNoZWxsIHZhcmlhYmxlIGlzIGV4cGxpY2l0bHkKLSAgICAgaW5pdGlhbGl6ZWQgY29ycmVjdGx5IGJlZm9yZSBfZXZlcnlfIGBmb3InIGxvb3AgYW5kIGFsc28gcmVzdG9yZWQgYWZ0ZXIKLSAgICAgdGhlIGxvb3BzLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBNYWtlIHN1cmUgdGhhdCAibWFrZSBpbnN0YWxsIiBkb2Vzbid0IG92ZXJ3cml0ZSB0aGUgYG1pbWUudHlwZXMnIGFuZAotICAgICBgbWFnaWMnIGZpbGVzIGZyb20gYW4gZXhpc3RpbmcgQXBhY2hlIGluc3RhbGxhdGlvbi4gQmVjYXVzZSBwZW9wbGUgb2Z0ZW4KLSAgICAgY3VzdG9taXplIHRoZXNlIGZvciBvd24gTUlNRSBhbmQgY29udGVudCB0eXBlcy4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgUE9SVDogRHluYW1pYyBTaGFyZWQgT2JqZWN0IChEU08pIHN1cHBvcnQgZm9yIE9wZW5CU0QgMi54Ci0gICAgIFtQZXRlciBHYWxiYXZ5LCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyMTA5Ci0KLSAgKikgRml4IHRoZSBwYXRoIHRvIHRoZSBTY29yZUJvYXJkRmlsZSBpbiB0aGUgaW5zdGFsbC1jb25maWcgdGFyZ2V0LCB0b28uCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyMTA1Ci0KLSAgKikgTGV0ICJjb25maWd1cmUiIGNsZWFyIG91dCB0aGUgdXNlcnMgcGFyYW1ldGVycyAocHJvdmlkZWQgYXMgc2hlbGwKLSAgICAgdmFyaWFibGVzKSB0byBhdm9pZCBzaWRlLWVmZmVjdHMgaW4gInNyYy9Db25maWd1cmUiIHdoZW4gdGhlIHVzZXIKLSAgICAgZXhwb3J0ZWQgdGhlbSAod2hpY2ggaXMgbm90IG5lZWRlZCwgYnV0IHNvbWUgdXNlcnMgZG8gaXQpLiAKLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIxMDEKLQotICAqKSBQcm92aWRlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZnJvbSBzb21lIG9sZCBzcmMvQ29uZmlndXJhdGlvbi50bXBsCi0gICAgIHBhcmFtZXRlciBuYW1lcyB0byB0aGUgY2Fub25pY2FsIEF1dG9jb25mLXN0eWxlIHNoZWxsIHZhcmlhYmxlIG5hbWVzLiBGb3IKLSAgICAgaW5zdGFuY2UgQ0ZMQUdTIHZzLiBFWFRSQV9DRkxBR1MuIFRoZSBFWFRSQV94eHggdmFyaWFudHMgYXJlIGFjY2VwdGVkIG5vdwotICAgICBidXQgYSBoaW50IG1lc3NhZ2UgaXMgZGlzcGxheWVkLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLSAgCi0gICopIE1ha2Ugc3VyZSB0aGF0ICJtYWtlIGluc3RhbGwiIGRvZXNuJ3Qgb3ZlcndyaXRlIHRoZSBEb2N1bWVudFJvb3QgYW5kCi0gICAgIENHSSBzY3JpcHRzIGZyb20gYW4gZXhpc3RpbmcgQXBhY2hlIGluc3RhbGxhdGlvbi4gCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBKaW0gSmFnaWVsc2tpXSBQUiMyMDg0Ci0KLSAgKikgTWFrZSBgY29uZmlndXJlIC0tY29tcGF0JyBtb3JlICJjb21wYXRpYmxlIiBieSBmaXJzdCAKLSAgICAgbGV0IHRoZSBsaWJleGVjZGlyIGRlZmF1bHQgdG8gRVBSRUZJWC9saWJleGVjIGluc3RlYWQgb2YgRVBSRUZJWC9iaW4gYW5kCi0gICAgIHNlY29uZCBieSBtYWtpbmcgc3VyZSB0aGUgImF2b2lkLWJyaXN0bGluZy1zdWZmaXgiIC9hcGFjaGUgaXMgbm90Ci0gICAgIGFwcGVuZGVkIHRvIHN5c2NvbmZkaXIsIGRhdGFkaXIsIGxvY2Fsc3RhdGVkaXIgYW5kIGluY2x1ZGVkaXIgd2hlbgotICAgICAtLWNvbXBhdCBpcyB1c2VkLiBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgTGFycyBFaWxlYnJlY2h0XQotCi0gICopIE5lWFQgcmVxdWlyZWQgc3RyZHVwKCkgaW4gc3VwcG9ydC9sb2dyZXNvbHZlLmMKLSAgICAgW0ZyYW5jaXNjbyBUb21laSA8ZmF0b21laUBzYW5kYnVyZy51bm0uZWR1Pl0gUFIjMjA4MgotCi0gICopIEFJWCByZXF1aXJlZCBzeXMvc2VsZWN0LmggaW4gc3VwcG9ydC9hYi5jCi0gICAgIFtKZW5zIFNjaGxldXNlbmVyIDxKZW5zLlNjaGxldXNlbmVyQGRsci5kZT5dIFBSIzIwODEKLQotICAqKSBGaXggdGhlIHBhdGggdG8gdGhlIE1pbWVNYWdpY0ZpbGUgaW4gdGhlIGluc3RhbGwtY29uZmlnIHRhcmdldCwgdG9vLgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjA4OQotCi0gICopIFBPUlQ6IEFkZGVkIEhQLVVYIDExIHBhdGNoZXMgW0plZmYgRWFyaWNrc29uIDxqYWVhcmlja0Bjb2xieS5lZHU+XQotCi0gICopIElmIHlvdSBzdGFydCBhcGFjaGUgd2l0aCB0aGUgLVMgY29tbWFuZCBsaW5lIG9wdGlvbiBpdCB3aWxsIGR1bXAKLSAgICAgb3V0IHRoZSBwYXJzZWQgdmhvc3Qgc2V0dGluZ3MuICBUaGlzIGlzIHVzZWZ1bCBmb3IgZm9sa3MgdHJ5aW5nCi0gICAgIHRvIGZpZ3VyZSBvdXQgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZWlyIHZob3N0IGNvbmZpZ3VyYXRpb24uCi0gICAgIChPdGhlciBkdW1wcyBtYXkgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZS4pIFtEZWFuIEdhdWRldF0KLQotICAqKSBBZGQgJXBBLCAlcEksIGFuZCAlcHAgY29kZXMgdG8gYXBfdmZvcm1hdHRlciAoYW5kIGhlbmNlIGFwX2JwcmludGYsCi0gICAgIGFwX3NucHJpbnRmLCBhbmQgYXBfcHNwcmludGYpLiAgU2VlIGluY2x1ZGUvYXAuaCBmb3IgZG9jcy4KLSAgICAgW0RlYW4gR2F1ZGV0XQotCi0gICopIEJlY2F1c2UgL3Vzci9sb2NhbC9hcGFjaGUgaXMgdGhlIGRlZmF1bHQgcHJlZml4IHRoZSBgYGNvbmZpZ3VyZQotICAgICAtLWNvbXBhdCcnIG9wdGlvbiBubyBsb25nZXIgaGFzIHRvIHNldCBwcmVmaXgsIGFnYWluLiBUaGlzIHdheSB0aGUKLSAgICAgLS1jb21wYXQgb3B0aW9uIGhvbm9ycyBhIGxlYWRpbmcgLS1wcmVmaXggb3B0aW9uLiBbTGFycyBFaWxlYnJlY2h0XQotCi0gICopIFBPUlQ6IENhc3QgdGhlIGZpcnN0IGFyZ3VtZW50IG9mIGRsb3BlbigpIGluIGFwX29zX2Rzb19sb2FkKCkKLSAgICAgdG8gYGNoYXIgKicgdW5kZXIgT1NGMSBhbmQgRnJlZUJTRCAyLnggd2hlcmUgaXQgaXMgZGVmaW5lZCB0aGlzIHdheQotICAgICB0byBhdm9pZCAiZGlzY2FyZCBjb25zdCIgd2FybmluZ3MuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIElmIGEgc3BlY2lmaWMgaGFuZGxlciBpcyBzZXQgZm9yIGEgZmlsZSB5ZXQgdGhlIHJlcXVlc3Qgc3RpbGwKLSAgICAgZW5kcyB1cCBiZWluZyBoYW5kbGVkIGJ5IHRoZSBkZWZhdWx0IGhhbmRsZXIsIGxvZyBhbiBlcnJvcgotICAgICBtZXNzYWdlIGJlZm9yZSBoYW5kbGluZyBpdC4gIFRoaXMgY2F0Y2hlcyB0aGluZ3Mgc3VjaCBhcyB0cnlpbmcgCi0gICAgIHRvIHVzZSBTU0lzIHdpdGhvdXQgbW9kX2luY2x1ZGUgZW5hYmxlZC4gIFtNYXJjIFNsZW1rb10KLQotICAqKSBGaXggZXJyb3IgbG9nZ2luZyBmb3IgdGhlIHN0YXJ0dXAgY2FzZSB3aGVyZSBhcF9sb2dfZXJyb3IoKSBzdGlsbCB1c2VzCi0gICAgIHN0ZGVyciBhcyB0aGUgdGFyZ2V0LiBOb3cgdGhlIGRlZmF1bHQgbG9nIGxldmVsIGlzIGhvbm9yZWQgaGVyZSwgdG9vLgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLSAgICAKLSAgKikgUE9SVDogTWFrZSBzdXJlIHNvbWUgQVdLJ3MgZG9uJ3QgZmFpbCBpbiBzcmMvQ29uZmlndXJlIHdpdGggInN0cmluZyB0b28KLSAgICAgbG9uZyIgZXJyb3JzIHdoZW4gZ2VuZXJhdGluZyB0aGUgTU9EVUxFUyBlbnRyeSBmb3Igc3JjL01ha2VmaWxlCi0gICAgIFtCZW4gSHlkZSwgUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBNYWtlIHN1cmUgc3JjL0NvbmZpZ3VyZSBkb2Vzbid0IGNvbXBsYWluIGFib3V0IHRoZSBvbGQgZGlyZWN0b3J5Ci0gICAgIC91c3IvbG9jYWwvZXRjL2h0dHBkLyB3aGVuIEFQQUNJIGlzIHVzZWQuICBbTGFycyBFaWxlYnJlY2h0XQotICAgCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDEuM2I2Ci0KLSAgKikgUE9SVDogQ2xlYW4gdXAgd2FybmluZ3Mgb24gVWx0cml4IGFuZCBIUFVYLiAgW0JlbiBIeWRlXQotIAotICAqKSBBZGRpbmcgRFNPIHN1cHBvcnQgZm9yIHRoZSBIUC9VWCBwbGF0Zm9ybSBieSBlbXVsYXRpbmcgdGhlIGRsb3Blbi1zdHlsZQotICAgICBpbnRlcmZhY2UgdmlhIHRoZSBzaW1pbGFyIGJ1dCBwcm9wcmlldGFyeSBIUC9VWCBzaGxfeHh4LXN0eWxlIHN5c3RlbQotICAgICBjYWxscy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgUE9SVDogVXBkYXRlZCBVbml4V2FyZSAyLjAueCBhbmQgMi4xLnggZW50cmllcyBmb3IgRFNPIHN1cHBvcnQgYW5kIG1hZGUKLSAgICAgQVBBQ0kgTWFrZWZpbGUudG1wbCAiaW5zdGFsbCIgdGFyZ2V0IG1vcmUgcm9idXN0IGZvciBzZW5zaWJsZSBVbml4V2FyZQotICAgICBNYWtlLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSArKysrIFRIRSBCSUcgU1lNQk9MIFJFTkFNSU5HICsrKysKLSAgICAgVG8gYXZvaWQgc3ltYm9sIGNsYXNoZXMgd2l0aCB0aGlyZC1wYXJ0eSBjb2RlIGNvbXBpbGVkIGludG8gdGhlIHNlcnZlciwKLSAgICAgd2UgZ2xvYmFsbHkgYXBwbGllZCB0aGUgcHJlZml4ICJhcF8iIHRvIHRoZSBmb2xsb3dpbmcgY2xhc3NlcyBvZgotICAgICBmdW5jdGlvbnM6Ci0gICAgICAgIC0gQXBhY2hlIHByb3ZpZGVkIGdlbmVyYWwgZnVuY3Rpb25zIChlLmcuLCBhcF9jcHlzdHJuKQotICAgICAgICAtIFB1YmxpYyBBUEkgZnVuY3Rpb25zIChlLmcuLCBwYWxsb2MsIGJnZXRzKQotICAgICAgICAtIFByaXZhdGUgZnVuY3Rpb25zIHdoaWNoIHdlIGNhbid0IG1ha2Ugc3RhdGljIChiZWNhdXNlIG9mCi0gICAgICAgICAgY3Jvc3Mtb2JqZWN0IHVzYWdlKSBidXQgc2hvdWxkIGJlIChlLmcuLCBuZXdfY29ubmVjdGlvbikKLSAgICAgRm9yIGJhY2t3YXJkIHNvdXJjZSBjb21wYXRpYmlsaXR5IGEgbmV3IGhlYWRlciBmaWxlIG5hbWVkIGNvbXBhdC5oIHdhcwotICAgICBjcmVhdGVkIHdoaWNoIHByb3ZpZGVzIGRlZmluZXMgZm9yIHRoZSBvbGQgc3ltYm9sIG5hbWVzIGFuZCBjYW4gYmUgdXNlZAotICAgICBieSB0aGlyZC1wYXJ0eSBtb2R1bGUgYXV0aG9ycy4KLSAgICAgW1RoZSBBcGFjaGUgR3JvdXBdCi0KLSAgKikgQWRkZWQgZHluYW1pYyBzaGFyZWQgb2JqZWN0IChEU08pIHN1cHBvcnQgZm9yIFNWUjQtZGVyaXZhdGVzOiBUaGUKLSAgICAgcHJvYmxlbSB1bmRlciBTVlI0IGlzIHRoYXQgdGhlcmUgaXMgbm8gY29tbWFuZCBmbGFnIHRvIGZvcmNlIHRoZSBsaW5rZXIKLSAgICAgdG8gZXhwb3J0IHRoZSBnbG9iYWwgc3ltYm9scyBvZiB0aGUgaHR0cGQgZXhlY3V0YWJsZSB0aGVyZXdpdGggdGhleSBhcmUKLSAgICAgYXZhaWxhYmxlIHRvIHRoZSBEU08ncy4gSW5zdGVhZCBvZiBwcm9ibGVtYXRpYyBoYWNrcyBsaWtlIGNyZWF0aW5nIGEKLSAgICAgZHVtbXkuc28gZmlsZSAoY29udGFpbmluZyBkdW1teSByZWZlcmVuY2VzIHRvIGFsbCBnbG9iYWwgc3ltYm9scykgdGhlCi0gICAgIGh0dHBkIGJpbmFyeSBpcyBsaW5rZWQgYWdhaW5zdCwgd2UgdXNlIGEgY2xlYW4gdHJpY2sgc3RvbGVuIGZyb20gUGVybCA1OgotICAgICBQbGFjaW5nIHRoZSBBcGFjaGUgY29yZSBjb2RlIGl0c2VsZiBpbnRvIGEgRFNPIGxpYnJhcnkgbmFtZWQgbGliaHR0cGQuc28uCi0gICAgIFRoaXMgd2F5IHRoZSBnbG9iYWwgc3ltYm9scyBfSEFWRV8gdG8gYmUgZXhwb3J0ZWQgYW5kIHRodXMgYXJlIGF2YWlsYWJsZQotICAgICB0byBhbnkgbWFudWFsbHkgbG9hZGVkIERTTydzIHVuZGVyIHJ1bnRpbWUuIFRvIHJlZHVjZSB0aGUgaW1wYWN0IHRvIHRoZQotICAgICB1c2VyIHRvIG51bGwgd2UgZ28gZXZlbiBmdXJ0aGVyIGFuZCBjcmVhdGUgYSBzdHViIGh0dHBkIGV4ZWN1dGFibGUgd2hpY2gKLSAgICAgYXV0b21hdGljYWxseSBrZWVwcyB0cmFjayBvZiB0aGUgRFNPIGxpYnJhcnkgbG9hZGluZyBpdHNlbGYgYW5kIHRodXMKLSAgICAgaGlkZXMgdGhlIGNvbXBsZXRlIG1lY2hhbmlzbSBmcm9tIHRoZSB1c2VyLiBBbHRob3VnaCB0aGUgZ2VuZXJhdGlvbiBvZgotICAgICB0aGlzIERTTyBsaWJyYXJ5IGlzIGF1dG9tYXRpY2FsbHkgdHJpZ2dlcmVkIGZvciBwbGF0Zm9ybXMgd2hpY2gKLSAgICAgZXNzZW50aWFsbHkgbmVlZCBpdCAobW9zdGx5IGFsbCBTVlI0LWRlcml2YXRlcykgaXQgY2FuIGJlIGFsc28gZW5hYmxlZAotICAgICBtYW51YWxseSB2aWEgdGhlIFJ1bGUgU0hBUkVEX0NPUkUuIFRoaXMgY2FuIGJlIGludGVyZXN0aW5nIGluIHRoZSBmdXR1cmUKLSAgICAgd2hlcmUgd2UgcGVyaGFwcyBleHBsb2l0IHRoaXMgbGliaHR0cGQuc28gbWVjaGFuaXNtIGZvciBwcm92aWRpbmcgbmlmdHkKLSAgICAgZmVhdHVyZXMgbGlrZSBncmFjZWZ1bCB1cGdyYWRlcywgb3Igd2hhdGV2ZXIuIAotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgTWFydGluIEtyYWVtZXJdCi0KLSAgKikgQnVpbGQgdGhlIGxpYnJhcmllcyBiZWZvcmUgYnVpbGRpbmcgdGhlIHJlc3Qgb2YgdGhlIHRvb2xzLiBbQmVuIEh5ZGVdCi0KLSAgKikgQWRkICJkaXN0Y2xlYW4iIHRhcmdldCB0byBzcmMvLU1ha2VmaWxlcyB0byBwcm92aWRlICJtYWtlIGRpc3RjbGVhbiIgYWxzbwotICAgICBpbnNpZGUgdGhlIHNyYyBzdWJ0cmVlIChpLmUuIGZvciBub24tQVBBQ0kgdXNlcnMpLiBGb2xsb3dpbmcgR05VIE1ha2VmaWxlCi0gICAgIGNvbnZlbnRpb25zIHdoaWxlICJjbGVhbiIgcmVtb3ZlcyBvbmx5IHN0dWZmIGNyZWF0ZWQgYnkgImFsbCIgdGFyZ2V0cywKLSAgICAgImRpc3RjbGVhbiIgYWRkaXRpb25hbGx5IHJlbW92ZXMgdGhlIHN0dWZmIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgcHJvY2Vzcy4gVGhpcyB3YXkgIm1ha2UgZGlzdGNsZWFuIiAoaGVuY2UgdGhlIG5hbWUpIHByb3ZpZGVzIGEgZnJlc2gKLSAgICAgc291cmNlIHRyZWUgYXMgaXQgd2FzIGZvciBkaXN0cmlidXRpb24uCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIEFsbG93IHRvcC1sZXZlbCAoQVBBQ0kpIE1ha2VmaWxlIHRvIGJyZWFrIG9uIGJ1aWxkIGVycm9ycwotICAgICB0aGUgc2FtZSB3YXkgdGhlIHNyYy8gc3VidHJlZSBNYWtlZmlsZXMgYnJlYWtzIG9uIHRoZW0gYnkgcmVwbGFjaW5nIHRoZQotICAgICBpbml0aWFsIEFQQUNJIHNlZC1zdWJkaXItZGlzcGxheS1rbHVkZ2Ugd2l0aCBhIG1vcmUgY2xlYW4KLSAgICAgdmFyaWFibGUtcGFzc2luZy1zb2x1dGlvbjogdmFyaWFibGUgU0RQIGNhbiBvcHRpb25hbGx5IGhvbGQgdGhlIHN1YmRpcgotICAgICBwcmVmaXggd2hpY2ggaXMgY29uc2lzdGVudGx5IHVzZWQgZm9yIGRpc3BsYXlpbmcgdGhlIHN1YmRpciBtb3ZlbWVudC4KLSAgICAgVGhpcyB3YXkgZXZlbiB0aGUgdG9wLWxldmVsIE1ha2VmaWxlIGNhbiBzdG9wIGNvcnJlY3RseSBvbiBlcnJvcnMgYXMgdGhlCi0gICAgIHVzZXIgZXhwZWN0cy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgRml4ZWQgb3JkZXJpbmcgb2YgYXJndW1lbnQgY2hlY2tzIGZvciBSZXdyaXRlQmFzZSBkaXJlY3RpdmUuCi0gICAgIFtUb2RkIEVpZ2Vuc2NoaW5rIDxlaWdlbnN0ckBtaXhpLm5ldD5dIFBSIzIwNDUKLQotICAqKSBDaGFuZ2UgV2luMzIgSVNfTU9EVUxFIHRvIFNIQVJFRF9NT0RVTEUgdG8gbWF0Y2ggVW5peCcgbWV0aG9kIG9mCi0gICAgIGluZGljYXRpbmcgdGhhdCBhIG1vZHVsZSBpcyBiZWluZyBjb21waWxlZCBmb3IgZHluYW1pYyBsb2FkaW5nLiBBbHNvCi0gICAgIHJlbW92ZSAjZGVmaW5lIElTX01PRFVMRSBmcm9tIG1vZHVsZXMgYW5kIGFkZCBTSEFSRURfTU9EVUxFIGRlZmluZQotICAgICB0byB0aGUgbWFrL2RzcCBmaWxlcy4gW0FsZXhlaSBLb3N1dF0KLQotICAqKSBSZWR1Y2UgbG9nZ2luZyBsZXZlbCBvZiAibm9ybWFsIiB3YXJuaW5nIG1lc3NhZ2VzIHRvIEFQTE9HX0lORk8sCi0gICAgIHNpbmNlIHdlIGFyZSBub3cgbG9nZ2luZyBBUExPR19XQVJOSU5HIGJ5IGRlZmF1bHQuIFtSb3kgRmllbGRpbmddCi0KLSAgKikgUE9SVDogT1MvMiB0d2VhayB0byBkZWFsIHdpdGggbXVsdGlwbGUgLmV4ZSB0YXJnZXRzLiBbQnJpYW4gSGF2YXJkXQotIAotICAqKSBBZGQgZG9jdW1lbnRhdGlvbiBmaWxlIGFuZCBzcmMvQ29uZmlndXJhdGlvbi50bXBsIGVudHJ5IGZvciB0aGUKLSAgICAgZXhwZXJpbWVudGFsIG1vZF9tbWFwX3N0YXRpYyBtb2R1bGUuIEJlY2F1c2UgYWx0aG91Z2ggaXQgaXMgYW5kIG1hcmtlZCBhcwotICAgICBhbiBleHBlcmltZW50YWwgb25lIGl0IGlzIGRpc3RyaWJ1dGVkIGFuZCB0aHVzIHNob3VsZCBiZSBkb2N1bWVudGVkIGFuZAotICAgICBwcmVwYXJlZCBmb3IgY29uZmlndXJhdGlvbiB0aGUgc2FtZSB3YXkgYXMgYWxsIG90aGVycyBtb2R1bGVzLiAKLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgQWRkIHF1ZXJ5ICgtcSkgb3B0aW9uIHRvIGFweHMgc3VwcG9ydCB0b29sIHRvIGJlIGFibGUgdG8gbWFudWFsbHkgcXVlcnkKLSAgICAgc3BlY2lmaWMgc2V0dGluZ3MgZnJvbSBhcHhzLiBUaGlzIGlzIG5lZWRlZCBmb3IgaW5zdGFuY2Ugd2hlbiB5b3UKLSAgICAgbWFudWFsbHkgd2FudCB0byBhY2Nlc3MgQXBhY2hlJ3MgaGVhZGVyIGZpbGVzIGFuZCB5b3UgbmVlZCB0byBhc3NlbWJsZQotICAgICB0aGUgLUkgb3B0aW9uLiAgTm93IHlvdSBjYW4gZG8gLUlgYXB4cyAtcSBJTkNMVURFRElSYC4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgTm93IHNyYy9Db25maWd1cmUgdXNlcyBhIGZhbGxiYWNrIHN0cmF0ZWd5IGZvciB0aGUgc2hhcmVkIG9iamVjdCBzdXBwb3J0Ci0gICAgIG9uIHBsYXRmb3JtcyB3aGVyZSBubyBleHBsaWNpdCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGU6IElmIGEgUGVybAotICAgICBpbnN0YWxsYXRpb24gZXhpc3RzIHdlIGFzayBpdCBhYm91dCBpdHMgc2hhcmVkIG9iamVjdCBzdXBwb3J0IGFuZCBpZiBpdCdzCi0gICAgIHRoZSBkbG9wZW4tc3R5bGUgb25lIHdlIHNoYW1lbGVzc2x5IGd1ZXNzIHRoZSBjb21waWxlciBhbmQgbGlua2VyIGZsYWdzCi0gICAgIGZvciBjcmVhdGluZyBzaGFyZWQgb2JqZWN0cyBmcm9tIFBlcmxzIGtub3dsZWRnZS4gT2YgY291cnNlLCB0aGUgdXNlciBpcwotICAgICB3YXJuaW5nIGFib3V0IHdoYXQgd2UgYXJlIGRvaW5nIGFuZCBpbmZvcm1lZCB0aGF0IGhlIHNob3VsZCBzZW5kIHVzCi0gICAgIHRoZSBndWVzc2VkIGZsYWdzIHdoZW4gdGhleSB3b3JrLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBQcm92aWRlIEFQQUNJIC0td2l0aG91dC1zdXBwb3J0IG9wdGlvbiB0byBiZSBhYmxlIHRvIGRpc2FibGUgdGhlIGJ1aWxkCi0gICAgIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIHN1cHBvcnQgdG9vbHMgZnJvbSB0aGUgc3JjL3N1cHBvcnQvIGFyZWEuCi0gICAgIEFsdGhvdWdoIGl0cyB1c2VmdWwgdG8gaGF2ZSB0aGVzZSBpbnN0YWxsZWQgcGVyIGRlZmF1bHQgd2Ugc2hvdWxkIHByb3ZpZGUKLSAgICAgYSB3YXkgdG8gY29tcGlsZSBhbmQgaW5zdGFsbCB3aXRob3V0IHRoZW0gZm9yIGJhY2t3YXJkLWNvbXBhdGliaWxpdHkuCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIEFkZCBvZiB0aGUgbmV3IEFQYWNoZSBlWHRlblNpb24gKGFweHMpIHN1cHBvcnQgdG9vbCBmb3IgYnVpbGRpbmcgYW5kCi0gICAgIGluc3RhbGxpbmcgbW9kdWxlcyBpbnRvIGFuIF9hbHJlYWR5IGluc3RhbGxlZF8gQXBhY2hlIHBhY2thZ2UgdGhyb3VnaCB0aGUKLSAgICAgZHluYW1pYyBzaGFyZWQgb2JqZWN0IChEU08pIG1lY2hhbmlzbSBbbW9kX3NvLmNdLiBUaGUgdHJpY2sgaGVyZSBpcyB0aGF0Ci0gICAgIHRoaXMgYXBwcm9hY2ggYWN0dWFsbHkgZG9lc24ndCBuZWVkIHRoZSBBcGFjaGUgc291cmNlIHRyZWUuICBUaGUKLSAgICAgKEFQQUNJLWluc3RhbGxlZCkgc2VydmVyIHBhY2thZ2UgaXMgZW5vdWdoLCBiZWNhdXNlIHRoaXMgbm93IGluY2x1ZGVzIHRoZQotICAgICBBcGFjaGUgQyBoZWFkZXIgZmlsZXMgKFBSRUZJWC9pbmNsdWRlKSBhbmQgdGhlIG5ldyBBUFhTIHRvb2wKLSAgICAgKFNCSU5ESVIvYXB4cykuICBUaGUgaW50ZW5kIGlzIHRvIHByb3ZpZGUgYSBoYW5keSB0b29sIGZvciB0aGlyZC1wYXJ0eQotICAgICBtb2R1bGUgYXV0aG9ycyB0byBidWlsZCB0aGVpciBBcGFjaGUgbW9kdWxlcyBfT1VUU0lERV8gdGhlIEFwYWNoZSBzb3VyY2UKLSAgICAgdHJlZSB3aGlsZSBhdm9pZGluZyB0aGVtIHRvIGZpZGRsZSBhcm91bmQgd2l0aCB0aGUgdG90YWxseSBwbGF0Zm9ybQotICAgICBkZXBlbmRlbmQgd2F5IG9mIGNvbXBpbGluZyBEU08gZmlsZXMuIFRoZSB0b29sIHN1cHBvcnRzIGFsbCByYW5nZXMgb2YKLSAgICAgbW9kdWxlcywgZnJvbSB0cml2aWFsIG9uZXMgKHNpbmdsZSBtb2RfZm9vLmMpIHRvIGNvbXBsZXggb25lcyAobGlrZSBQSFAzCi0gICAgIHdoaWNoIGhhcyBhIG1vZF9waHAzLmMgcGx1cyBhIHByZS1idWlsdCBsaWJtb2RwaHAzLXNvLmEpIGFuZCBldmVuIGNhbgotICAgICBvbi10aGUtZmx5IGdlbmVyYXRlIGEgbWluaW1hbGlzdGljIE1ha2VmaWxlIGFuZCBzYW1wbGUgbW9kdWxlIGZvciB0aGUKLSAgICAgZmlyc3Qgc3RlcCB0byBwcm92aWRlIGJvdGggYSBxdWljayBzdWNjZXNzIGV2ZW50IGFuZCB0byBkZW1vbnN0cmF0ZSB0aGUKLSAgICAgQVBYUyBtZWNoYW5pc20gdG8gbW9kdWxlIGF1dGhvcnMuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIEZpeCBjb3JlIGR1bXBzIGluIHVzZSBvZiBDT05ORUNUIGluIHByb3h5LiAgCi0gICAgIFtSYWluZXIuU2NoZXJnQHJleHJvdGguZGVdIFBSIzEzMjYsICMxNTczLCAjMTk0MgotCi0gICopIE1vZGlmeSB0aGUgbG9nIGRpcmVjdGl2ZXMgaW4gaHR0cGQuY29uZi1kaXN0IGZpbGVzIHRvIHVzZSBDdXN0b21Mb2cKLSAgICAgc28gdGhhdCB1c2VycyBoYXZlIGV4YW1wbGVzIG9mIGhvdyBDdXN0b21Mb2cgY2FuIGJlIHVzZWQuCi0gICAgIFtMYXJzIEVpbGVicmVjaHRdCi0KLSAgKikgQWRkIHRoZSBuZXcgQXBhY2hlIEF1dG9jb25mLXN0eWxlIEludGVyZmFjZSAoQVBBQ0kpIGZvciB0aGUgdG9wLWxldmVsIG9mCi0gICAgIHRoZSBBcGFjaGUgZGlzdHJpYnV0aW9uIHRyZWUuICBVbnRpbCBBcGFjaGUgMS4zIHRoZXJlIHdhcyBubyByZWFsCi0gICAgIG91dC1vZi10aGUtYm94IGJhdGNoLWNhcGFibGUgYnVpbGQgYW5kIGluc3RhbGxhdGlvbiBwcm9jZWR1cmUgZm9yIHRoZQotICAgICBjb21wbGV0ZSBBcGFjaGUgcGFja2FnZS4gVGhpcyBpcyBub3cgcHJvdmlkZWQgYnkgYSB0b3AtbGV2ZWwgImNvbmZpZ3VyZSIKLSAgICAgc2NyaXB0IGFuZCBhIGNvcnJlc3BvbmRpbmcgdG9wLWxldmVsICJNYWtlZmlsZS50bXBsIiBmaWxlLiAgVGhlIGdvYWwgaXMKLSAgICAgdG8gcHJvdmlkZSBhIEdOVSBBdXRvY29uZi1zdHlsZSBmcm9udGVuZCB3aGljaCBpcyBjYXBhYmxlIHRvIGJvdGggZHJpdmUKLSAgICAgdGhlIG9sZCBzcmMvQ29uZmlndXJlIHN0dWZmIGluIGJhdGNoIGFuZCBhZGRpdGlvbmFsbHkgaW5zdGFsbHMgdGhlCi0gICAgIHBhY2thZ2Ugd2l0aCBhIEdOVS1jb25mb3JtaW5nIGRpcmVjdG9yeSBsYXlvdXQuIEFueSBvcHRpb25zIGZyb20gdGhlIG9sZAotICAgICBjb25maWd1cmF0aW9uIHNjaGVtZSBhcmUgYXZhaWxhYmxlIHBsdXMgYSBsb3Qgb2YgbmV3IG9wdGlvbnMgZm9yIGZsZXhpYmx5Ci0gICAgIGN1c3RvbWl6aW5nIEFwYWNoZS4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgVGhlIGZsb2F0aW5nIHBvaW50IGFwX3NucHJpbnRmIGNvZGUgd2Fzbid0IHRocmVhZHNhZmUuCi0gICAgIEhhZCB0byByZW1vdmUgdGhlIEhBVkVfQ1ZUIG1hY3JvIGluIG9yZGVyIHRvIGRvIHRocmVhZHNhZmUKLSAgICAgY2FsbGluZyBvZiB0aGUgP2N2dCgpIGZsb2F0aW5nIHBvaW50IHJvdXRpbmVzLiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIFBPUlQ6IEFkZCB0aGUgU0NPX1NWIHBvcnQuIFtKaW0gSmFnaWVsc2tpXSBQUiMxOTYyCi0KLSAgKikgUE9SVDogSVJJWCBuZWVkcyB0aGUgLW4zMiBmbGFnIGlmZiB1c2luZyB0aGUgJ2NjJyBjb21waWxlcgotICAgICBbSmltIEphZ2llbHNraV0gUFIjMTkwMQotCi0gICopIEJVRzogQ29uZmlndXJlIHdhcyB1c2luZyBUQ0MgYW5kIENDIGluY29uc2lzdGVudGx5LiBNYWtlIHN1cmUKLSAgICAgQ29uZmlndXJlIGtub3dzIHdoaWNoIENDIHdlIGFyZSB1c2luZy4gW0ppbSBKYWdpZWxza2ldCi0KLSAgKikgIk9wdGlvbnMgK0luY2x1ZGVzIiB3YXNuJ3QgY29ycmVjdGx5IG1lcmdlZCBpZiAiK0luY2x1ZGVzTm9FeGVjIgotICAgICB3YXMgZGVmaW5lZCBpbiBhIHBhcmVudCBkaXJlY3RvcnkuIFtMYXJzIEVpbGVicmVjaHRdCi0KLSAgKikgQVBJOiBhcF9zbnByaW50ZigpIGNvZGUgbXV0YXRlZCBpbnRvIGFwX3Zmb3JtYXR0ZXIoKSwgd2hpY2ggaXMKLSAgICAgYSBnZW5lcmljIHByaW50Zi1zdHlsZSByb3V0aW5lIHRoYXQgY2FuIGNhbGwgYXJiaXRyYXJ5IG91dHB1dAotICAgICByb3V0aW5lcy4gIFVzZSB0aGlzIHRvIHJlcGxhY2UgaHR0cF9icHJpbnRmLmMuICBBZGQgbmV3IHJvdXRpbmVzCi0gICAgIHBzcHJpbnRmKCksIHB2c3ByaW50ZigpIHdoaWNoIGFsbG9jYXRlIHRoZSBleGFjdCBhbW91bnQgb2YgbWVtb3J5Ci0gICAgIHJlcXVpcmVkIGZvciBhIHN0cmluZyBmcm9tIGEgcG9vbC4gIFVzZSBwc3ByaW50ZigpIHRvIGNsZWFuIHVwCi0gICAgIHZhcmlvdXMgYml0cyBvZiBjb2RlIHdoaWNoIHVzZWQgYXBfc25wcmludGYoKS9wc3RyZHVwKCkuCi0gICAgIFtEZWFuIEdhdWRldF0KLQotICAqKSBQT1JUOiBIQVZFX1NOUFJJTlRGIGRvZXNuJ3QgZG8gYW55dGhpbmcgYW55IGxvbmdlci4gIFRoaXMgaXMgYmVjYXVzZQotICAgICBhcF9zbnByaW50ZigpIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzIGFuZCBmb3JtYXR0aW5nIGNvZGVzIHRoYW4KLSAgICAgc25wcmludGYoKS4gIFtEZWFuIEdhdWRldF0KLQotICAqKSBTSUdYQ1BVIGFuZCBTSUdYRlNaIGFyZSBub3cgcmVzZXQgdG8gU0lHX0RGTCBhdCBib290LXRpbWUuICBUaGlzCi0gICAgIGlzIG5lY2Vzc2FyeSBvbiBhdCBsZWFzdCBTb2xhcmlzIHdoZXJlIHRoZSAvZXRjL3JjPy5kIHNjcmlwdHMKLSAgICAgYXJlIHJ1biB3aXRoIHRoZXNlIHNpZ25hbHMgaWdub3JlZCwgYW5kICJTSUdfSUdOIiBzZXR0aW5ncyBhcmUKLSAgICAgbWFpbnRhaW5lZCBhY3Jvc3MgZXhlYygpLgotICAgICBbUmVpbiBUb2xsZXZpayA8cmVpbnRAc3lzLnNvbC5ubz5dIFBSIzIwMDkKLQotICAqKSBGaXggdGhlIGNoZWNrIGZvciBzeW1ib2xpYyBsaW5rcyBpbiBgYFJld3JpdGVDb25kIC4uLiAtbCcnOiBzdGF0KCkgd2FzCi0gICAgIHVzZWQgaW5zdGVhZCBvZiBsc3RhdCgpIGFuZCB0aHVzIHRoaXMgZmxhZyBkaWRuJ3Qgd29yayBhcyBleHBlY3RlZC4KLSAgICAgW1JlaW4gVG9sbGV2aWsgPHJlaW50QHN5cy5zb2wubm8+XSBQUiMyMDEwCi0KLSAgKikgRml4IHRoZSBwcm94eSBwYXNzLXRocm91Z2ggZmVhdHVyZSBvZiBtb2RfcmV3cml0ZSBmb3IgdGhlIGNhc2Ugb2YKLSAgICAgZXhpc3RpbmcgUVVFUllfU1RSSU5HIG5vdyB0aGF0IG1vZF9wcm94eSB3YXMgcmVjZW50bHkgY2hhbmdlZCBiZWNhdXNlIG9mCi0gICAgIHRoZSBuZXcgVVJMIHBhcnNpbmcgc3R1ZmYuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIEEgZmV3IGNoYW5nZXMgdG8gc2NvcmVib2FyZCBkZWZpbml0aW9ucyB3aGljaCBoZWxwcyBnY2MgZ2VuZXJhdGUKLSAgICAgYmV0dGVyIGNvZGUuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgQU5TSSBDIGRvZXNuJ3QgZ3VhcmFudGVlIHRoYXQgImludCBmb28gOiAyIiBpbiBhIHN0cnVjdHVyZSB3aWxsCi0gICAgIGJlIGEgc2lnbmVkIGJpdGZpZWxkLiAgU28gbWFyayBhIGZldyBiaXRmaWVsZHMgYXMgc2lnbmVkIHRvCi0gICAgIGVuc3VyZSBjb3JyZWN0IGNvZGUuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgVGhlIGRlZmF1bHQgZm9yIEhvc3RuYW1lTG9va3VwcyB3YXMgY2hhbmdlZCB0byBPZmYsIGJ1dCB0aGVyZQotICAgICB3YXMgYSBwcm9ibGVtIGFuZCBpdCB3YXNuJ3QgdGFraW5nIGVmZmVjdC4gW0RlYW4gR2F1ZGV0XQotCi0gICopIFBPUlQ6IENsZWFuIHVwIHVuZGVmaW5lZCBzaWduYWxzIG9uIHNvbWUgcGxhdGZvcm1zIChTQ08sIEJlT1MpLgotICAgICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgQWZ0ZXIgYSBTSUdIVVAgdGhlIGxpc3RlbmluZyBzb2NrZXRzIGluIHRoZSBwYXJlbnQgd2VyZW4ndAotICAgICBwcm9wZXJseSBtYXJrZWQgZm9yIGNsb3N1cmUgb24gZm9yaygpLgotICAgICBbSvxyZ2VuIEtlaWwgPGprQHRvb2xzLmRlPl0gUFIjMjAwMAotIAotICAqKSBBbGxvdyAlMkYgaW4gdHdvIHNpdHVhdGlvbnM6IDEpIGl0IGlzIGluIHRoZSBxdWVyeSBwYXJ0IG9mIHRoZSBVUkksCi0gICAgIHRoZXJlZm9yZSBub3QgZXhwb3NlZCB0byAlMkYgLT4gJy8nIHRyYW5zbGF0aW9ucyBhbmQgMikgdGhlIHJlcXVlc3QKLSAgICAgaXMgYSBwcm94eSByZXF1ZXN0LCBzbyB3ZSdyZSBub3QgZGVhbGluZyB3aXRoIGEgbG9jYWwgcmVzb3VyY2UgYW55d2F5LgotICAgICBXaXRob3V0IHRoaXMsIHRoZSBwcm94eSB3b3VsZCBmYWlsIHRvIHdvcmsgZm9yIGFueSBVUkwncyB3aXRoCi0gICAgICUyZiBpbiB0aGVtIChvY2N1cnMgcXVpdGUgb2Z0ZW4gaW4KLSAgICAgaHR0cDovLy4uLi9jZ2ktYmluLy4uLj9odHRwJTNBJTJGJTJGLi4uIHJlZmVyZW5jZXMpIFtNYXJ0aW4gS3JhZW1lcl0KLQotICAqKSBQcm90ZWN0IGFnYWluc3QgRkRfU0VUU0laRSBtaXNtYXRjaGVzLiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIE1ha2UgdGhlIHNoYXJlZCBvYmplY3QgY29tcGlsYXRpb24gY29tbWFuZCBtb3JlIHBvcnRhYmxlIGJ5IGF2b2lkaW5nCi0gICAgIHRoZSBkaXJlY3QgY29tYmluYXRpb24gb2YgYC1jJyAmIGAtbycgd2hpY2ggaXMgbm90IGhvbm9yZWQgYnkgc29tZQotICAgICBjb21waWxlcnMgbGlrZSBVbml4V2FyZSdzIGNjLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBXSU4zMjogdGhlIHByb3h5IHdhcyBjcmVhdGluZyBmaWxlbmFtZXMgbWlzc2luZyB0aGUgbGFzdCBmb3VyCi0gICAgIGNoYXJhY3RlcnMuICBXaGlsZSB0aGlzIG5vcm1hbGx5IGRvZXNuJ3Qgc3RvcCBhbnl0aGluZyBmcm9tIAotICAgICB3b3JraW5nLCBpdCBjYW4gcmVzdWx0IGluIGV4dHJhIGNvbGxpc2lvbnMuICAKLSAgICAgW1RpbSBDb3N0ZWxsbyA8dGpjb3N0ZWxAc29jcy51dHMuZWR1LmF1Pl0gUFIjMTg5MAotCi0gICopIE5vdyBtb2RfcHJveHkgdXNlcyB0aGUgcmVzcG9uc2Ugc3RyaW5nIChpbiBhZGRpdGlvbiB0byB0aGUgcmVzcG9uc2Ugc3RhdHVzCi0gICAgIGNvZGUpIGZyb20gdGhlIGFscmVhZHkgdXNlZCBGVFAgU0laRSBjb21tYW5kIHRvIHNldHVwIHRoZSBDb250ZW50LUxlbmd0aAotICAgICBoZWFkZXIgaWYgYXZhaWxhYmxlLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMTE4MwotCi0gICopIFJlYW5pbWF0ZWQgdGhlIChzdGlsbCB1bmRvY3VtZW50ZWQpIHByb3h5IHJlY2VpdmUgYnVmZmVyIHNpemUgZGlyZWN0aXZlOgotICAgICBSZW5hbWVkIGZyb20gUmVjZWl2ZUJ1ZmZlclNpemUgdG8gUHJveHlSZWNlaXZlQnVmZmVyU2l6ZSBiZWNhdXNlIHRoZSBvbGQKLSAgICAgbmFtZSB3YXMgcmVhbGx5IHRvbyBnZW5lcmljLCBhZGRlZCBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGRpcmVjdGl2ZSB0bwotICAgICB0aGUgbW9kX3Byb3h5Lmh0bWwgYW5kIGNvcnJlY3RlZCB0aGUgaHlwZXJsaW5rIHRvIGl0IGluIHRoZQotICAgICBuZXdfZmVhdHVyZXNfMS4zLmh0bWwgZG9jdW1lbnQuICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMTM0OAotCi0gICopIEZpeCBhIGJ1ZyBpbiB0aGUgc3JjL2hlbHBlcnMvZnAycnAgc2NyaXB0IGFuZCBtYWtlIGl0IGEgbGl0dGxlIGJpdAotICAgICBmYXN0ZXIgW01hcnRpbiBLcmFlbWVyXQotICAKLSAgKikgTWFrZSBDb25maWd1cmUgZGllIHdoZW4geW91IGdpdmUgaXQgYW4gdW5rbm93biBjb21tYW5kIHN3aXRjaC4KLSAgICAgW0JlbiBIeWRlXQotCi0gICopIEFkZCBmaXZlIG5ldyBhbmQgZnJlc2ggbWFucGFnZXMgZm9yIHRoZSBzdXBwb3J0IHByb2dyYW1zOiBkYm1tYW5hZ2UuMSwKLSAgICAgc3VleGVjLjgsIGh0ZGlnZXN0LjEsIHJvdGF0ZWxvZ3MuOCBhbmQgbG9ncmVzb2x2ZS44LiAgTm93IGFsbCB1cC10by1kYXRlCi0gICAgIGFuZCBwZXIgZGVmYXVsdCBjb21waWxlZCBzdXBwb3J0IHByb2dyYW1zIGhhdmUgbWFudWFsIHBhZ2VzIC0ganVzdCB0bwotICAgICBkb2N1bWVudCBvdXIgc3R1ZmYgYSBsaXR0bGUgYml0IG1vcmUgYW5kIHRvIGJlIGFibGUgdG8gZG8gcmVhbGx5Ci0gICAgIFVuaXgtbGlrZSBpbnN0YWxsYXRpb25zIDstKSBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBNYWpvciBjbGVhbnVwcyB0byB0aGUgQ29uZmlndXJlIHNjcmlwdCB0byBtYWtlIGl0IGFuZCBpdHMgZ2VuZXJhdGVkCi0gICAgIE1ha2VmaWxlcyBhZ2FpbiByZWFkYWJsZSBhbmQgbWFpbnRhaW5hYmxlOiBhZGQgU1JDRElSIG9wdGlvbiwgcmVtb3ZlZAotICAgICBJTkNMVURFU19ERVBUSFswLTJdIGtsdWRnZSwgY2xlYW51cCBvZiBUQVJHRVQgb3B0aW9uLCBjbGVhbnVwIG9mCi0gICAgIGdlbmVyYXRlZCBzZWN0aW9ucywgY29uc2VxdWVudGx5IGFkZGVkIE1ha2VmaWxlIGhlYWRlcnMgd2l0aCBpbmhlcml0YW5jZQotICAgICBpbmZvcm1hdGlvbiwgYWRkZWQgc3ViZGlyIG1vdmVtZW50IG1lc3NhZ2VzIGZvciBlYXNpZXIgZm9sbG93aW5nIHdoZXJlCi0gICAgIHRoZSBidWlsZCBwcm9jZXNzIGN1cnJlbnRseSBzdGF5cyAobW9yZSB2ZXJib3NlIHRoZW4gc3RhbmRhcmQgTWFrZSwgbGVzcwotICAgICB2ZXJib3NlIHRoYW4gR05VIG1ha2UpLCBzYW1lIHN0eWxlIHRvIGNvbW1lbnRzIGluIHRoZSBDb25maWd1cmUgc2NyaXB0LAotICAgICBhZGRlZCBBcGFjaGUgbGljZW5zZSBoZWFkZXIsIGZpeGVkIGEgZmV3IGJ1Z3MsIGV0Yy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0gICAgIAotICAqKSBBZGQgdGhlIG5ldyBBcGFjaGVCZW5jaCBwcm9ncmFtICJhYiIgdG8gc3JjL3N1cHBvcnQvOiBUaGlzIGlzIGRlcml2ZWQKLSAgICAgZnJvbSB0aGUgWmV1c0JlbmNoIGJlbmNobWFya2luZyBwcm9ncmFtIGFuZCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlCi0gICAgIHJlc3BvbnNlIHBlcmZvcm1hbmNlIG9mIGFuIEFwYWNoZSBpbnN0YWxsYXRpb24uIFRoaXMgdmVyc2lvbiBpcwotICAgICBvZmZpY2lhbGx5IGxpY2Vuc2VkIHdpdGggWmV1cyBUZWNobm9sb2d5LCBMdGQuIFNlZSB0aGUgbGljZW5zZSBhZ3JlZW1lbnQKLSAgICAgc3RhdGVtZW50cyBpbiA8MTk5ODAzMTcxMjI0Lk5BQTI0NTQ3QGVuMS5lbmdlbHNjaGFsbC5jb20+IGluIGFwYWNoZS1jb3JlLgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBBUEk6IFZhcmlvdXMgY29yZSBmdW5jdGlvbnMgdGhhdCBhcmUgZGVmaW5hdGVseSBub3QgcGFydCBvZiB0aGUgQVBJCi0gICAgIGhhdmUgYmVlbiBtYWRlIHN0YXRpYywgYW5kIGEgZmV3IGhhdmUgYmVlbiBtYXJrZWQgQVBJX0VYUE9SVC4gIFN0aWxsCi0gICAgIG1vcmUgaGF2ZSBiZWVuIG1hcmtlZCBDT1JFX0VYUE9SVCBhbmQgYXJlIG5vdCBpbnRlbmRlZCBmb3IgZ2VuZXJhbAotICAgICB1c2UgYnkgbW9kdWxlcy4gIFtEb3VnIE1hY0VhY2hlcm4sIERlYW4gR2F1ZGV0XQotCi0gICopIG1vZF9wcm94eSB3YXMgbm90IGNsZWFyaW5nIHRoZSBQcm94eS1Db25uZWN0aW9uIGhlYWRlciBmcm9tCi0gICAgIHJlcXVlc3RzOyBub3cgaXQgZG9lcy4gIFRoaXMgZGlkIG5vdCB2aW9sYXRlIGFueSBzcGVjLCBob3dldmVyIAotICAgICBjYXVzZXMgcG9vciBpbnRlcmFjdGlvbnMgd2hlbiB5b3UgYXJlIHRhbGtpbmcgdG8gcmVtb3RlIHByb3hpZXMuICAKLSAgICAgW01hcmMgU2xlbWtvXSBQUiMxNzQxCi0KLSAgKikgVmFyaW91cyBjbGVhbnVwcyB0byB0aGUgY29tbWFuZCBsaW5lIGludGVyZmFjZSBhbmQgbWFudWFsIHBhZ2VzLgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBjZmdfZ2V0bGluZSgpIHdhcyBub3QgcHJvcGVybHkgaGFuZGxpbmcgbGluZXMgdGhhdCBkaWQgbm90IGVuZAotICAgICB3aXRoIGEgbGluZSB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXIuICBbTWFyYyBTbGVta29dIFBSIzE4NjksIDE5MDkKLQotICAqKSBQZXJmb3JtYW5jZSB0d2VhayB0byBtb2RfbG9nX2NvbmZpZy4gIFtEbWl0cnkgS2hydXN0YWxldl0KLQotICAqKSBDbGVhbiB1cCBzb21lIHVuZG9jdW1lbnRlZCBiZWhhdmlvciBvZiBtb2Rfc2V0ZW52aWYgcmVsYXRlZCB0bwotICAgICAibWVyZ2luZyIgdHdvIFNldEVudklmIGRpcmVjdGl2ZXMgd2hlbiB0aGV5IG1hdGNoIHRoZSBzYW1lIGhlYWRlcgotICAgICBhbmQgcmVnZXguICBEb2N1bWVudCB0aGF0IG1vZF9zZXRlbnZpZiB3aWxsIHBlcmZvcm0gY29tcGFyaXNvbnMgaW4KLSAgICAgdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBjb25maWcgZmlsZS4gIE9wdGltaXplIG1vZF9zZXRlbnZpZiBieQotICAgICBkb2luZyBtb3JlIHdvcmsgYXQgY29uZmlnIHRpbWUgcmF0aGVyIHRoYW4gYXQgcnVudGltZS4KLSAgICAgW0RlYW4gR2F1ZGV0XQotCi0gICopIHNyYy9pbmNsdWRlL2FwX2NvbmZpZy5oIG5vdyB3cmFwcyBpdCdzICNkZWZpbmUncyB3aXRoICNpZm5kZWYvI2VuZGlmJ3MKLSAgICAgdG8gYWxsb3cgZm9yIG1vZHVsZXMgdG8gb3ZlcnJ1bGUgdGhlbSBhbmQgdG8gcmVkdWNlIHJlZGVmaW5pdGlvbgotICAgICB3YXJuaW5ncyBbSmltIEphZ2llbHNraV0KLQotICAqKSBbUE9SVF0gRm9yIEEvVVggY2hhbmdlIHRoZSBPUy0jZGVmaW5lIGZvciAtREFVWCB0byAtREFVWDMuCi0gICAgIFtKaW0gSmFnaWVsc2tpXQotCi0gICopIE1ha2luZyB0aGUgaGFyZC1jb2RlZCBjcm9zcy1tb2R1bGUgZnVuY3Rpb24gY2FsbCBtaW1lX2ZpbmRfY3QoKSAoZnJvbQotICAgICBtb2RfcHJveHkgdG8gbW9kX21pbWUpIG9ic29sZXRlIGJ5IG1ha2luZyBzdXJlIHRoZSBBUEkgaG9vayBmb3IgTUlNRSB0eXBlCi0gICAgIGNoZWNraW5nIGlzIHJlYWxseSBjYWxsZWQgZXZlbiBmb3IgcHJveHkgcmVxdWVzdHMgZXhjZXB0IGZvciBVUkxzIHdpdGgKLSAgICAgSFRUUCBzY2hlbWVzIChiZWNhdXNlIHRoZXJlIHdlIGNhbiBvcHRpbWl6ZSBieSBub3QgcnVubmluZyB0aGUgdHlwZQotICAgICBjaGVja2luZyBob29rcyBkdWUgdG8gdGhlIGZhY3QgdGhhdCB0aGUgcHJveHkgZ2V0cyB0aGUgTUlNRSBDb250ZW50LXR5cGUKLSAgICAgZnJvbSB0aGUgcmVtb3RlIGhvc3QgbGF0ZXIpLiBUaGlzIGNoYW5nZSBjbGVhbnMgdXAgbW9kX21pbWUgYnkgcmVtb3ZpbmcKLSAgICAgdGhlIHVnbHkgZXhwb3J0IGtsdWRnZSwgbWFrZXMgdGhlIG9uZS1saW5lciBmaWxlIG1vZF9taW1lLmggb2Jzb2xldGUsIGFuZAotICAgICBlc3BlY2lhbGx5IHVuYnVuZGxlcyBtb2RfcHJveHkgYW5kIG1vZF9taW1lLiBUaGlzIHdheSB0aGV5IGJvdGggbm93IGNhbgotICAgICBiZSBjb21waWxlZCBhcyBzaGFyZWQgb2JqZWN0cyBhbmQgYXJlIG5vIGxvbmdlciB0aWVkIHRvZ2V0aGVyLiAKLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgdXRpbC5jIGNsZWFudXAgYW5kIHNwZWVkdXAuIFtEZWFuIEdhdWRldF0KLQotICAqKSBBUEk6IENsYXJpZmljYXRpb24sIHBzdHJuZHVwKCkgd2lsbCBhbHdheXMgY29weSBuIGJ5dGVzIG9mIHRoZSBzb3VyY2UKLSAgICAgYW5kIE5VTCB0ZXJtaW5hdGUgYXQgdGhlIChuKzEpc3QgYnl0ZS4gIFtEZWFuIEdhdWRldF0KLQotICAqKSBNYXJrIG1vZHVsZSBjb21tYW5kX3JlYyBhbmQgaGFuZGxlcl9yZWMgc3RydWN0dXJlcyBjb25zdCBzbyB0aGF0IHRoZXkKLSAgICAgZW5kIHVwIGluIHRoZSByZWFkLW9ubHkgZGF0YSBzZWN0aW9uIChhbmQgYXJlIGZyaWVuZGxpZXIgdG8gc3lzdGVtcwotICAgICB0aGF0IGRvbid0IGRvIG9wdGltaXN0aWMgbWVtb3J5IGFsbG9jYXRpb24gb24gZm9yaygpKS4gW0RlYW4gR2F1ZGV0XQotCi0gICopIEFkZCBjaGVjayB0byB0aGUgIlBvcnQiIGRpcmVjdGl2ZSB0byBtYWtlIHN1cmUgdGhlIHNwZWNpZmllZCAKLSAgICAgcG9ydCBpcyBpbiB0aGUgYXBwcm9wcmlhdGUgcmFuZ2UuICBbQmVuIEh5ZGVdCi0KLSAgKikgUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIHRvIGludm9rZV9oYW5kbGVyKCkuCi0gICAgIFtEbWl0cnkgS2hydXN0YWxldiA8ZGltYUBib2cubXN1LnN1Pl0KLQotICAqKSBBZGRlZCBzdXBwb3J0IGZvciBidWlsZGluZyBzaGFyZWQgb2JqZWN0cyBldmVuIGZvciBsaWJyYXJ5LXN0eWxlIG1vZHVsZXMKLSAgICAgKHdoaWNoIGFyZSBidWlsdCBmcm9tIG1vcmUgdGhhbiBvbmUgb2JqZWN0IGZpbGUpLiBUaGlzIG5vdyBwcm92aWRlcyB0aGUKLSAgICAgYWJpbGl0eSB0byBidWlsZCBtb2RfcHJveHkgYXMgYSBzaGFyZWQgb2JqZWN0IG1vZHVsZS4gQWRkaXRpb25hbGx5Ci0gICAgIG1vZHVsZXMgbGlrZSBtb2RfZXhhbXBsZSBhcmUgbm93IGFsc28gc3VwcG9ydGVkIGZvciBzaGFyZWQgb2JqZWN0Ci0gICAgIGJ1aWxkaW5nIGJlY2F1c2UgdGhlIGdlbmVyYXRlZCBNYWtlZmlsZXMgbm93IG5vIGxvbmdlciBhc3N1bWUgdGhlcmUgaXMgYXQKLSAgICAgbGVhc3Qgb25lIHN0YXRpY2FsbHkgbGlua2VkIG1vZHVsZS4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgQVBJOiBDbGFyaWZ5IHVzYWdlIG9mIGNvbnRlbnRfdHlwZSwgaGFuZGxlciwgY29udGVudF9lbmNvZGluZywKLSAgICAgY29udGVudF9sYW5ndWFnZSBhbmQgY29udGVudF9sYW5ndWFnZXMgZmllbGRzIGluIHJlcXVlc3RfcmVjLiAgVGhleQotICAgICBtdXN0IGFsd2F5cyBiZSBsb3dlcmNhc2VkOyBhbmQgdGhlIHN0cmluZ3MgcG9pbnRlZCB0byBzaG91bGRuJ3QKLSAgICAgYmUgbW9kaWZpZWQgKHlvdSBtdXN0IGNvcHkgdGhlbSB0byBtb2RpZnkgdGhlbSkuICBGaXggYSBmZXcgYnVncwotICAgICByZWxhdGVkIHRvIHRoaXMuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgQVBJOiBDbGFyaWZpY2F0aW9uOiBleGNlcHQgZm9yIFJBV19BUkdTLCBhbGwgY29tbWFuZCBoYW5kbGVycyBjYW4KLSAgICAgdHJlYXQgdGhlIGNoYXIgKiBwYXJhbWV0ZXJzIGFzIHBlcm1hbmVudCwgYW5kIG1vZGlmaWFibGUuICBUaGVyZQotICAgICBpcyBubyBuZWVkIHRvIHBzdHJkdXAoKSB0aGVtLiAgQ2xlYW4gdXAgc29tZSBuZWVkbGVzcyBwc3RyZHVwKCkuCi0gICAgIFtEZWFuIEdhdWRldF0KLQotICAqKSBOb3cgbW9kX3NvIGtlZXBzIHRyYWNrIG9mIHdoaWNoIG1vZHVsZSBzaGFyZWQgb2JqZWN0cyB3aXRoIHdoaWNoIG5hbWVzCi0gICAgIGFyZSBsb2FkZWQgYW5kIHRodXMgYXZvaWRzIG11bHRpcGxlIGxvYWRpbmcgYW5kIHVubG9hZGluZyBhbmQgaXJyaXRhdGluZwotICAgICBlcnJvcl9sb2cgbWVzc2FnZXMuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIFByaW9yIHRvIHRoZSBleGlzdGVuY2Ugb2YgbW9kX3NldGVudiBpdCB3YXMgbmVjZXNzYXJ5IHRvIHR3ZWFrIHRoZSBUWgotICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbiB0aGUgYXBhY2hlIGNvcmUuICBCdXQgdGhhdCB0d2Vha2luZyBpbnRlcmZlcmVzCi0gICAgIHdpdGggbW9kX3NldGVudi4gIFNvIGRvbid0IHR3ZWFrIGlmIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgYW4gZXhwbGljaXQKLSAgICAgVFogdmFyaWFibGUuICBbSmF5IFNvZmZpYW4gPGpheUBjaW1lZGlhLmNvbT5dIFBSIzE4ODgKLQotICAqKSBycHV0cygpIGRpZCBub3QgY2FsY3VsYXRlIHItPnNlbnRfYm9keWN0IHByb3Blcmx5LgotICAgICBbU2llZ211bmQgU3Rpcm53ZWlzcyA8c2llZ3N0QGthdC5pbmEuZGU+XSBQUiMxOTAwCi0KLSAgKikgVGhlIENHSSBzcGVjIHNheXMgdGhhdCBSRU1PVEVfSE9TVCBzaG91bGQgYmUgc2V0IHRvIHRoZSByZW1vdGUgaG9zdHMncwotICAgICBuYW1lLCBvciBsZWZ0IHVuc2V0IGlmIHRoaXMgdmFsdWUgaXMgdW5hdmFpbGFibGUuICBBcGFjaGUgd2FzIHNldHRpbmcKLSAgICAgaXQgdG8gdGhlIElQIGFkZHJlc3Mgd2hlbiB1bmF2YWlsYWJsZS4KLSAgICAgW1RvbnkgRmluY2ggPGZhbmZAZGVtb24ubmV0Pl0gUFIjMTkyNQotCi0gICopIFZhcmlvdXMgaW1wcm92ZW1lbnRzIHRvIHRoZSBjb25maWd1cmF0aW9uIGFuZCBidWlsZCBzdXBwb3J0IGZvciBjb21waWxpbmcKLSAgICAgbW9kdWxlcyBhcyBzaGFyZWQgb2JqZWN0cy4gRXNwZWNpYWxseSBTb2xhcmlzIDIueCwgU3VuT1MgNC4xLCBJUklYIGFuZAotICAgICBPU0YxIHN1cHBvcnQgd2l0aCBHQ0MgYW5kIHZlbmRvciBjb21waWxlcnMgd2FzIGFkZGVkLiAgVGhpcyB3YXkgc2hhcmVkCi0gICAgIG9iamVjdCBzdXBwb3J0IGlzIG5vdyBwcm92aWRlZCBvdXQtb2YtdGhlLWJveCBmb3IgRnJlZUJTRCwgTGludXgsCi0gICAgIFNvbGFyaXMsIFN1bk9TLCBJUklYIGFuZCBPU0YxLiBJbiBzaG9ydDogT24gYWxsIG1ham9yIHBsYXRmb3JtcyEKLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgTWlub3IgY2xlYW51cCBpbiBodHRwX21haW4gLS0gc3BsaXQgUU5YIGFuZCBPUzIgc3BlY2lmaWMgIm1tYXAiCi0gICAgIHNjb3JlYm9hcmQgY29kZSBpbnRvIHNlcGFyYXRlICNkZWZpbmVzIC0tIFVTRV9QT1NJWF9TQ09SRUJPQVJECi0gICAgIGFuZCBVU0VfT1MyX1NDT1JFQk9BUkQuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgRml4IG9uZSBtb3JlIHNwZWNpYWwgbG9ja2luZyBwcm9ibGVtIGZvciBSZXdyaXRlTWFwIHByb2dyYW1zIGluCi0gICAgIG1vZF9yZXdyaXRlOiBBY2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50YXRpb24gb2YgZmxvY2soKSwgIkxvY2tzIGFyZSBvbgotICAgICBmaWxlcywgbm90IGZpbGUgZGVzY3JpcHRvcnMuICBUaGF0IGlzLCBmaWxlIGRlc2NyaXB0b3JzIGR1cGxpY2F0ZWQKLSAgICAgdGhyb3VnaCBkdXAoMikgb3IgZm9yaygyKSBkbyBub3QgcmVzdWx0IGluIG11bHRpcGxlIGluc3RhbmNlcyBvZiBhIGxvY2ssCi0gICAgIGJ1dCByYXRoZXIgbXVsdGlwbGUgcmVmZXJlbmNlcyB0byBhIHNpbmdsZSBsb2NrLiBJZiBhIHByb2Nlc3MgaG9sZGluZyBhCi0gICAgIGxvY2sgb24gYSBmaWxlIGZvcmtzIGFuZCB0aGUgY2hpbGQgZXhwbGljaXRseSB1bmxvY2tzIHRoZSBmaWxlLCB0aGUKLSAgICAgcGFyZW50IHdpbGwgbG9zZSBpdHMgbG9jay4iLiBUbyBvdmVyY29tZSB0aGlzIHdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoZQotICAgICBSZXdyaXRlTG9jayBmaWxlIGlzIG9wZW5lZCBfQUZURVJfIHRoZSBjaGlsZHMgd2VyZSBzcGF3bmVkIHdoaWNoIGlzIG5vdwotICAgICB0aGUgY2FzZSBieSBvcGVuaW5nIGl0IGluIHRoZSBjaGlsZF9pbml0IGluc3RlYWQgb2YgdGhlIG1vZHVsZV9pbml0IEFQSQotICAgICBob29rLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMTAyOQotCi0gICopIENoYW5nZSB0byBMb2NhdGlvbiBhbmQgTG9jYXRpb25NYXRjaCBzZW1hbnRpY3MuICBMb2NhdGlvbk1hdGNoIG5vCi0gICAgIGxvbmdlciBsZXRzIGEgc2luZ2xlIHNsYXNoIG1hdGNoIG11bHRpcGxlIGFkamFjZW50IHNsYXNoZXMgaW4gdGhlCi0gICAgIFVSTC4gIFRoaXMgY2hhbmdlIGlzIGZvciBjb25zaXN0ZW5jeSB3aXRoIFJld3JpdGVSdWxlIGFuZAotICAgICBBbGlhc01hdGNoLiAgTXVsdGlwbGUgc2xhc2hlcyBoYXZlIG1lYW5pbmcgaW4gVVJMcyB0aGF0IHRoZXkgZG8KLSAgICAgbm90IGhhdmUgaW4gKHNvbWUpIGZpbGVzeXN0ZW1zLiAgTG9jYXRpb24gb24gdGhlIG90aGVyIGhhbmQgY2FuCi0gICAgIGJlIGNvbnNpZGVyZWQgYSBzaG9ydGhhbmQgZm9yIGEgbW9yZSBjb21wbGljYXRlZCByZWdleCwgYW5kIGl0Ci0gICAgIGRvZXMgbWF0Y2ggbXVsdGlwbGUgc2xhc2hlcyB3aXRoIGEgc2luZ2xlIHNsYXNoIC0tIHdoaWNoIGlzCi0gICAgIGFsc28gY29uc2lzdGVudCB3aXRoIHRoZSBBbGlhcyBkaXJlY3RpdmUuCi0gICAgIFtEZWFuIEdhdWRldF0gcmVsYXRlZCBQUiMxNDQwCi0KLSAgKikgRml4IGJ1ZyB3aXRoIG1vZF9taW1lX21hZ2ljIGNhdXNpbmcgY2VydGFpbiBmaWxlcywgaW5jbHVkaW5nIGZpbGVzCi0gICAgIG9mIGxlbmd0aCAwLCB0byByZXN1bHQgaW4gbm8gcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLgotICAgICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgVGhlIENvbmZpZ3VyZSBzY3JpcHQgbm93IGdlbmVyYXRlcyBzcmMvaW5jbHVkZS9hcF9jb25maWcuaCB3aGljaAotICAgICBjb250YWlucyB0aGUgc2V0IG9mIGRlZmluZXMgdXNlZCB3aGVuIEFwYWNoZSBpcyBjb21waWxlZCBvbiBhIHBsYXRmb3JtLgotICAgICBUaGlzIGZpbGUgY2FuIHRoZW4gYmUgaW5jbHVkZWQgYnkgZXh0ZXJuYWwgbW9kdWxlcyBiZWZvcmUgaW5jbHVkaW5nCi0gICAgIGFueSBBcGFjaGUgaGVhZGVyIGZpbGVzIGluIGNhc2UgdGhleSBhcmUgYmVpbmcgYnVpbHQgc2VwYXJhdGVseSBmcm9tCi0gICAgIEFwYWNoZS4gIEFsb25nIHdpdGggdGhpcyBjaGFuZ2UsIGEgY291cGxlIG9mIG1pbm9yIGNoYW5nZXMgd2VyZQotICAgICBtYWRlIHRvIG1ha2UgQXBhY2hlJ3MgI2RlZmluZXMgY29leGlzdCBwZWFjZWZ1bGx5IHdpdGggYW55IGF1dG9jb25mCi0gICAgIGRlZmluZXMgYW4gZXh0ZXJuYWwgbW9kdWxlIG1pZ2h0IGhhdmUuIFtSYXNtdXMgTGVyZG9yZl0KLQotICAqKSBGaXggbW9kX3Jld3JpdGUgZm9yIHRoZSB1Z2x5IEFQSSBjYXNlIHdoZXJlIDxWaXJ0dWFsSG9zdD4gc2VjdGlvbnMgZXhpc3QKLSAgICAgYnV0IHdpdGhvdXQgYW55IFJld3JpdGVYWFhYWCBkaXJlY3RpdmVzLiBIZXJlIG1vZF9yZXdyaXRlIGlzIGdpdmVuIG5vCi0gICAgIGNoYW5jZSBieSB0aGUgQVBJIHRvIGluaXRpYWxpemUgaXRzIHBlci1zZXJ2ZXIgY29uZmlndXJhdGlvbiBhbmQgdGh1cwotICAgICByZWNlaXZlcyB0aGUgd3Jvbmcgb25lIGZyb20gdGhlIG1haW4gc2VydmVyLiBUaGlzIGlzIG5vdyBhdm9pZGVkIGJ5Ci0gICAgIHJlbWVtYmVyaW5nIHRoZSBzZXJ2ZXIgdG9nZXRoZXIgd2l0aCB0aGUgY29uZmlnIHN0cnVjdHVyZSB3aGlsZQotICAgICBjb25maWd1cmluZyBhbmQgbGF0ZXIgYXNzdW1pbmcgdGhlcmUgaXMgbm8gY29uZmlnIHdoZW4gd2Ugc2VlIGEKLSAgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByZW1lbWJlcmVkIHNlcnZlciBhbmQgdGhlIG9uZSBjYWxsaW5nIHVzLiAKLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzE3OTAKLQotICAqKSBGaXhlZCB0aGUgREJNIFJld3JpdGVNYXAgc3VwcG9ydCBmb3IgbW9kX3Jld3JpdGU6IEZpcnN0IHRoZSBzdXBwb3J0IG5vdwotICAgICBpcyBhdXRvbWF0aWNhbGx5IGRpc2FibGVkIHVuZGVyIGNvbmZpZ3VyZSB0aW1lIHdoZW4gdGhlIGRibV94eHggZnVuY3Rpb25zCi0gICAgIGFyZSBub3QgYXZhaWxhYmxlLiBTZWNvbmQsIHR3byBoZWF2eSBzb3VyY2UgY29kZSBlcnJvcnMgaW4gdGhlIERCTQotICAgICBzdXBwb3J0IGNvZGUgd2VyZSBmaXhlZC4gIFRoaXMgbWFrZXMgREJNIFJld3JpdGVNYXAncyB1c2FibGUgYWdhaW4gYWZ0ZXIKLSAgICAgYSBsb25nIHRpbWUgb2YgYnJva2VubmVzcy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzE2OTYKLQotICAqKSBOb3cgYWxsIGNvbmZpZ3VyYXRpb24gZmlsZXMgc3VwcG9ydCBVbml4LXN0eWxlIGxpbmUtY29udGludWF0aW9uIHZpYSAKLSAgICAgdGhlIHRyYWlsaW5nIGJhY2tzbGFzaCAoIlwiKSBjaGFyYWN0ZXIuIFRoaXMgZW5hYmxlcyB1cyB0byB3cml0ZSBkb3duCi0gICAgIGNvbXBsZXggb3IganVzdCB2ZXJ5IGxvbmcgZGlyZWN0aXZlcyBpbiBhIG1vcmUgcmVhZGFibGUgd2F5LiAgVGhlCi0gICAgIGJhY2tzbGFzaCBjaGFyYWN0ZXIgaGFzIHRvIGJlIHJlYWxseSB0aGUgbGFzdCBjaGFyYWN0ZXIgYmVmb3JlIHRoZQotICAgICBuZXdsaW5lIGFuZCBpdCBoYXMgbm90IGJlZW4gcHJlZml4ZWQgYnkgYW5vdGhlciAoZXNjYXBpbmcpIGJhY2tzbGFzaC4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgV2hlbiB1c2luZyBQcm94eVBhc3MgdGhlID9xdWVyeXN0cmluZyB3YXMgbm90IHBhc3NlZCBjb3JyZWN0bHkuCi0gICAgIFtKb2VsIFRydWhlciA8dHJ1aGVyQHdpcmVkLmNvbT5dCi0KLSAgKikgVG8gZGVhbCB3aXRoIG1vZHVsZXMgYmVpbmcgY29tcGlsZWQgYW5kIFtkeW5hbWljYWxseV0gbGlua2VkCi0gICAgIGF0IGEgZGlmZmVyZW50IHRpbWUgZnJvbSB0aGUgY29yZSwgdGhlIFNFUlZFUl9WRVJTSU9OIGFuZAotICAgICBTRVJWRVJfQlVJTFQgc3ltYm9scyBoYXZlIGJlZW4gYWJzdHJhY3RlZCB0aHJvdWdoIHRoZSBuZXcKLSAgICAgQVBJIHJvdXRpbmVzIGFwYXBpX2dldF9zZXJ2ZXJfdmVyc2lvbigpIGFuZCBhcGFwaV9nZXRfc2VydmVyX2J1aWx0KCkuCi0gICAgIFtLZW4gQ29hcl0gIFBSIzE0NDgKLQotICAqKSBXSU4zMjogUHJlc2VydmUgdHJhaWxpbmcgc2xhc2ggaW4gY2Fub25pY2FsIHBhdGggKGFuZCBoZW5jZQotICAgICBpbiBQQVRIX0lORk8pLiBbUGF1bCBTdXR0b24sIEJlbiBMYXVyaWVdCi0KLSAgKikgUE9SVDogVVNFX1BUSFJFQURfU0VSSUFMSVpFRF9BQ0NFUFQgaGFzIHByb3ZlbiB1bnJlbGlhYmxlCi0gICAgIGRlcGVuZGluZyBvbiB0aGUgcmV2IG9mIFNvbGFyaXMgYW5kIHdoYXQgbWl4dHVyZSBvZiBtb2R1bGVzCi0gICAgIGFyZSBpbiB1c2UuICBTbyBpdCBoYXMgYmVlbiBkaXNhYmxlZCwgYW5kIFNvbGFyaXMgaXMgYmFjayB0bwotICAgICB1c2luZyBVU0VfRkNOVExfU0VSSUFMSVpFRF9BQ0NFUFQuICBVc2VycyBtYXkgZXhwZXJpbWVudCB3aXRoCi0gICAgIFVTRV9QVEhSRUFEX1NFUklBTElaRURfQUNDRVBUIGF0IHRoZWlyIG93biByaXNrLCBpdCBtYXkgc3BlZWQKLSAgICAgdXAgc3RhdGljIGNvbnRlbnQgb25seSBzZXJ2ZXJzLiAgT3IgaXQgbWF5IGZhaWwgdW5wcmVkaWN0YWJseS4KLSAgICAgW0RlYW4gR2F1ZGV0XSBQUiMxNzc5LCAxODU0LCAxOTA0Ci0KLSAgKikgbW9kX3Rlc3RfdXRpbF91cmkuYyBjcmVhdGVkIHdoaWNoIHRlc3RzIHRoZSBsb2dpYyBpbiB1dGlsX3VyaS5jLgotICAgICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgQVBJOiBSZXdyaXRlIG9mIGFic29sdXRlVVJJIGhhbmRsaW5nLCBhbmQgaW4gcGFydGljdWxhciBob3cKLSAgICAgYWJzb2x1dGVVUklzIG1hdGNoIHZob3N0cy4gIFVubGVzcyBhIHJlcXVlc3QgaXMgYSBwcm94eSByZXF1ZXN0LCBhCi0gICAgICJodHRwOi8vaG9zdCIgdXJsIGlzIHRyZWF0ZWQgYXMgaWYgYSBzaW1pbGFyICJIb3N0OiIgaGVhZGVyIGhhZCBiZWVuCi0gICAgIHN1cHBsaWVkLiAgVGhpcyBjaGFuZ2Ugd2FzIG1hZGUgdG8gc3VwcG9ydCBmdXR1cmUgSFRUUC8xLnggcHJvdG9jb2xzCi0gICAgIHdoaWNoIG1heSByZXF1aXJlIGNsaWVudHMgdG8gc2VuZCBhYnNvbHV0ZVVSSXMgZm9yIGFsbCByZXF1ZXN0cy4KLQotICAgICBJbiBvcmRlciB0byBhY2hpZXZlIHRoaXMgY2hhbmdlIHN1YnRsZSBjaGFuZ2VzIHdlcmUgbWFkZSB0byB0aGUgQVBJLiAgSW4gYQotICAgICByZXF1ZXN0X3JlYywgci0+aG9zdGxlbiBoYXMgYmVlbiByZW1vdmVkLiAgci0+dW5wYXJzZWRfdXJpIG5vdyBleGlzdHMgc28KLSAgICAgdGhhdCB0aGUgdW5tb2RpZmllZCB1cmkgY2FuIGJlIHJldHJpZXZlZCBlYXNpbHkuICByLT5wcm94eXJlcSBpcyBub3Qgc2V0Ci0gICAgIGJ5IHRoZSBjb3JlLCBtb2R1bGVzIG11c3Qgc2V0IGl0IGR1cmluZyB0aGUgcG9zdF9yZWFkX3JlcXVlc3Qgb3IKLSAgICAgdHJhbnNsYXRlX25hbWVzIHBoYXNlLgotCi0gICAgIFBsdXMgY2hhbmdlcyB0byB0aGUgdmlydHVhbGhvc3QgdGVzdCBzdWl0ZSBmb3IgYWJzb2x1dGVVUkkgdGVzdGluZy4KLQotICAgICBUaGlzIGZpeGVzIHNldmVyYWwgYnVncyB3aXRoIHRoZSBwcm94eSBwcm94eWluZyByZXF1ZXN0cyB0byB2aG9zdHMKLSAgICAgbWFuYWdlZCBieSB0aGUgc2FtZSBodHRwZC4KLSAgICAgW0RlYW4gR2F1ZGV0XQotCi0gICopIEFQSTogQ2xlYW51cCBvZiBjb2RlIGluIGh0dHBfdmhvc3QuYywgYW5kIHJlbW92ZSB2aG9zdCBtYXRjaGluZwotICAgICBjb2RlIGZyb20gbW9kX3Jld3JpdGUuICBUaGUgdmhvc3QgbWF0Y2hpbmcgaXMgbm93IHBlcmZvcm1lZCBieSBhCi0gICAgIGdsb2JhbGx5IGF2YWlsYWJsZSBmdW5jdGlvbiBtYXRjaGVzX3JlcXVlc3Rfdmhvc3QoKS4gIFtEZWFuIEdhdWRldF0KLQotICAqKSBSZWR1Y2UgbWVtb3J5IHVzYWdlLCBhbmQgc3BlZWQgdXAgU2VydmVyQWxpYXMgc3VwcG9ydC4gIEFzIGEKLSAgICAgc2lkZS1lZmZlY3QgdXNlcnMgY2FuIGxpc3QgbXVsdGlwbGUgU2VydmVyQWxpYXMgZGlyZWN0aXZlcwotICAgICBhbmQgdGhleSdyZSBhbGwgY29uc2lkZXJlZC4KLSAgICAgW0NoaWEtbGlhbmcgS2FvIDxjbGthb0BjaXJ4Lm9yZz5dIFBSIzE1MzEKLQotICAqKSBUaGUgInBvbHkiIGRpcmVjdGl2ZSBpbiBpbWFnZSBtYXBzIGRpZCBub3QgaW5jbHVkZSB0aGUgYm9yZGVycyBvZiB0aGUKLSAgICAgcG9seWdvbiwgd2hlcmVhcyB0aGUgInJlY3QiIGRpcmVjdGl2ZSBkb2VzLiAgRml4IHRoaXMgaW5jb25zaXN0ZW5jeS4KLSAgICAgW0tvbnN0YW50aW4gTW9yc2huZXYgPG1va29AZGVzaWduLnJ1Pl0gUFIjMTc3MQotCi0gICopIE1ha2UgXFwgYmVoYXZlIGFzIGV4cGVjdGVkLiAgW1JvbmFsZC5Uc2NoYWxhZXJAcHNpLmNoXQotCi0gICopIEFkZCB0aGUgYCVhJyBjb25zdHJ1Y3QgdG8gTG9nRm9ybWF0IGFuZCBDdXN0b21Mb2cgdG8gbG9nIHRoZSBjbGllbnQgSVAKLSAgICAgYWRkcmVzcy4gW1RvZGQgRWlnZW5zY2hpbmsgPGVpZ2Vuc3RyQG1peGkubmV0Pl0gUFIjMTg4NQotCi0gICopIEFQSTogQSBuZXcgc291cmNlIG1vZHVsZSBtYWluL3V0aWxfdXJpLmM7IEl0IGNvbnRhaW5zIGEgcm91dGluZQotICAgICBwYXJzZV91cmlfY29tcG9uZW50cygpIGFuZCBmcmllbmRzIHdoaWNoIGJyZWFrcyBhIFVSSSBpbnRvIGl0cyBjb21wb25lbnQKLSAgICAgcGFydHMuICBUaGVzZSBwYXJ0cyBhcmUgc3RvcmVkIGluIGEgdXJpX2NvbXBvbmVudHMgc3RydWN0dXJlIGNhbGxlZAotICAgICBwYXJzZWRfdXJpIHdpdGhpbiBlYWNoIHJlcXVlc3RfcmVjLCBhbmQgYXJlIGF2YWlsYWJsZSB0byBhbGwgbW9kdWxlcy4KLSAgICAgQWRkaXRpb25hbGx5LCBhbiB1bnBhcnNlIHJvdXRpbmUgaXMgc3VwcGxpZWQgd2hpY2ggcmUtYXNzZW1ibGVzIHRoZSBVUkkKLSAgICAgY29tcG9uZW50cyBiYWNrIHRvIGFuIFVSSSwgb3B0aW9uYWxseSBoaWRpbmcgdGhlIHVzZXJuYW1lOnBhc3N3b3JkQCBwYXJ0Ci0gICAgIGZyb20gZnRwIHByb3h5IHJlcXVlc3RzLCBhbmQgb3RoZXIgdXNlZnVsIHJvdXRpbmVzLiAgV2l0aGluIHRoZSBzdHJ1Y3R1cmUsCi0gICAgIHlvdSBmaW5kIG9uIGEgcmVhZHktZm9yLXVzZSBiYXNpczoKLSAgICAgICAgc2NoZW1lOyAgICAgLyogc2NoZW1lICgiaHR0cCIvImZ0cCIvLi4uKSAqLwotICAgICAgICBob3N0aW5mbzsgICAvKiBjb21iaW5lZCBbdXNlcls6cGFzc3dvcmRdQF1ob3N0Wzpwb3J0XSAqLwotICAgICAgICB1c2VyOyAgICAgICAvKiB1c2VyIG5hbWUsIGFzIGluIGh0dHA6Ly91c2VyOnBhc3N3ZEBob3N0OnBvcnQvICovCi0gICAgICAgIHBhc3N3b3JkOyAgIC8qIHBhc3N3b3JkLCBhcyBpbiBodHRwOi8vdXNlcjpwYXNzd2RAaG9zdDpwb3J0LyAqLwotICAgICAgICBob3N0bmFtZTsgICAvKiBob3N0bmFtZSBmcm9tIFVSSSAob3IgZnJvbSBIb3N0OiBoZWFkZXIpICovCi0gICAgICAgIHBvcnRfc3RyOyAgIC8qIHBvcnQgc3RyaW5nIChpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIGlzIGluICJwb3J0IikgKi8KLSAgICAgICAgcGF0aDsgICAgICAgLyogdGhlIHJlcXVlc3QgcGF0aCAob3IgIi8iIGlmIG9ubHkgc2NoZW1lOi8vaG9zdCB3YXMgZ2l2ZW4pICovCi0gICAgICAgIHF1ZXJ5OyAgICAgIC8qIEV2ZXJ5dGhpbmcgYWZ0ZXIgYSAnPycgaW4gdGhlIHBhdGgsIGlmIHByZXNlbnQgKi8KLSAgICAgICAgZnJhZ21lbnQ7ICAgLyogVHJhaWxpbmcgIiNmcmFnbWVudCIgc3RyaW5nLCBpZiBwcmVzZW50ICovCi0gICAgIFRoaXMgaXMgbWVhbnQgdG8gc2VydmUgYXMgdGhlIHBsYXRmb3JtIGZvciAqQklHKiBzYXZpbmdzIGluCi0gICAgIGNvZGUgY29tcGxleGl0eSBmb3IgdGhlIHByb3h5IG1vZHVsZSAoYW5kIG1heWJlIHRoZSB2aG9zdCBsb2dpYykuCi0gICAgIFtNYXJ0aW4gS3JhZW1lcl0KLQotICAqKSBNYWtlIGFsbCBwb3NzaWJsZSBtZXRhLWNvbnN0cnVjdCBleHBhbnNpb25zICgkTiwgJU4sICV7TkFNRX0gYW5kCi0gICAgICR7bWFwOmtleX0pIGF2YWlsYWJsZSBmb3IgYWxsIGxvY2F0aW9uIHdoZXJlIGEgc3RyaW5nIGlzIGNyZWF0ZWQgaW4KLSAgICAgbW9kX3Jld3JpdGUgcmV3cml0aW5nIHJ1bGVzZXRzOiAxc3QgYXJnIG9mIFJld3JpdGVDb25kLCAybmQgYXJnIG9mCi0gICAgIFJld3JpdGVSdWxlIGFuZCBmb3IgdGhlIFtFPU5BTUU6U1RSSU5HXSBmbGFnIG9mIFJld3JpdGVSdWxlLiBUaGlzIHdheSB0aGUKLSAgICAgcG9zc2libGUgZXhwYW5zaW9ucyBhcmUgY29uc2VxdWVudGx5IHVzYWJsZSBhdCBhbGwgc3RyaW5nIGNyZWF0aW9uCi0gICAgIGxvY2F0aW9ucy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgRml4IGluaXRpYWxpemF0aW9uIG9mIFJld3JpdGVMb2dMZXZlbCAoZGVmYXVsdCBub3cgaXMgMCBhcyBkb2N1bWVudGVkIAotICAgICBhbmQgbm90IDEpIGFuZCB0aGUgcGVyLXZpcnR1YWwtc2VydmVyIG1lcmdpbmcgb2YgZGlyZWN0aXZlcy4gTm93IGFsbAotICAgICBkaXJlY3RpdmVzIGV4Y2VwdCBgUmV3cml0ZUVuZ2luZScgYW5kIGBSZXdyaXRlT3B0aW9uJyBhcmUgZWl0aGVyCi0gICAgIGNvbXBsZXRlbHkgb3ZlcnJpZGRlbiAoZGVmYXVsdCkgb3IgY29tcGxldGVseSBpbmhlcml0ZWQgKHdoZW4KLSAgICAgYFJld3JpdGVPcHRpb25zIGluaGVyaXQnKSBpcyB1c2VkLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMTMyNQotCi0gICopIEZpeCBgUmV3cml0ZU1hcCcgcHJvZ3JhbSBsb29rdXAgaW4gc2l0dWF0aW9ucyB3aGVyZSBzdWNoIG1hcHMgYXJlCi0gICAgIGRlZmluZWQgYnV0IGRpc2FibGVkIChgUmV3cml0ZUVuZ2luZSBvZmYnKSBpbiBwZXItc2VydmVyIGNvbnRleHQuIAotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMTQzMQotCi0gICopIEZpeCBidWcgaW50cm9kdWNlZCBpbiAxLjNiNC1kZXYsIGNvbmZpZyB3aXRoIG5vIFBvcnQgc2V0dGluZyB3b3VsZCBjYXVzZQotICAgICBzZXJ2ZXIgdG8gYmluZCB0byBwb3J0IDAgcmF0aGVyIHRoYW4gODAuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgRml4IGxvbmctc3RhbmRpbmcgcHJvYmxlbSB3aXRoIFJld3JpdGVNYXAgX3Byb2dyYW1zXyB1bmRlciBVbml4IGRlcml2YXRlcwotICAgICAobGlrZSBTdW5PUyBhbmQgRnJlZUJTRCkgd2hpY2ggZG9uJ3QgYWNjZXB0IHRoZSBsb2NraW5nIG9mIHBpcGVzCi0gICAgIGRpcmVjdGx5LiAgQSBuZXcgZGlyZWN0aXZlIFJld3JpdGVMb2NrIGlzIGludHJvZHVjZWQgd2hpY2ggY2FuIGJlIHVzZWQgdG8KLSAgICAgc2V0dXAgYSBzZXBhcmF0ZSBsb2NraW5nIGZpbGUgd2hpY2ggdGhlbiBpcyB1c2VkIGZvciBzeW5jaHJvbml6YXRpb24uCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMxMDI5Ci0KLSAgKikgV0lOMzI6IFRoZSBzZXJ2ZXIgcm9vdCBpcyBvYnRhaW5lZCBmcm9tIHRoZSByZWdpc3RyeSBrZXkKLSAgICAgSEtMTVxTT0ZUV0FSRVxBcGFjaGUgR3JvdXBcQXBhY2hlXDx2ZXJzaW9uPiAodmVyc2lvbiBpcyBjdXJyZW50bHkKLSAgICAgIjEuMyBiZXRhIiksIHVubGVzcyBvdmVycmlkZGVuIGJ5IHRoZSAtZCBjb21tYW5kIGxpbmUgZmxhZy4gVGhlCi0gICAgIHZhbHVlIGlzIHN0b3JlZCBieSBydW5uaW5nICJhcGFjaGUgLWkgLWQgc2VydmVycm9vdCIuIFtQYXVsIFN1dHRvbl0KLQotICAqKSBNZXJnZWQgb3Mvd2luMzIvbW9kX2RsbC5jIGludG8gbW9kdWxlcy9zdGFuZGFyZC9tb2Rfc28uYyB0byBzdXBwb3J0Ci0gICAgIGR5bmFtaWMgbG9hZGluZyBvbiBXaW4zMiBhbmQgVW5peCB2aWEgdGhlIHNhbWUgbW9kdWxlLiBbUGF1bCBTdXR0b25dCi0KLSAgKikgTm93IG1vZF9yZXdyaXRlIG5vIGxvbmdlciBtYWtlcyBwcm9ibGVtYXRpYyBhc3N1bXB0aW9ucyBvbiB0aGUgY2hhcmFjdGVycwotICAgICBhIHVzZXJuYW1lIGNhbiBjb250YWluIHdoZW4gdHJ5aW5nIHRvIGV4cGFuZCBpdCB2aWEgL2V0Yy9wYXNzd2QuIAotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBUaGUgbW9kX3NldGVudmlmIEJyb3dzZXJNYXRjaCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjb21tYW5kIGRpZCBub3QKLSAgICAgd29yayBwcm9wZXJseSB3aXRoIHNwYWNlcyBpbiB0aGUgcmVnZXguICBbUm9uYWxkIFRzY2hhbGFlcl0gUFIjMTgyNQotCi0gICopIEFkZCBuZXcgUmV3cml0ZU1hcCB0eXBlczogRmlyc3QsIGBybmQnIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGB0eHQnCi0gICAgIHR5cGUgYnV0IHdpdGggYSBzcGVjaWFsIHBvc3QtcHJvY2Vzc2luZyBmb3IgdGhlIGxvb2tlZC11cCB2YWx1ZTogSXQKLSAgICAgcGFyc2VzIGl0IGludG8gYWx0ZXJuYXRpdmVzIGFjY29yZGluZyB0byBgfCcgY2hhcnMgYW5kIHRoZW4gb25seSBvbmUKLSAgICAgcGFydGljdWxhciBhbHRlcm5hdGl2ZSBpcyBjaG9zZW4gcmFuZG9tbHkgKHRoaXMgaXMgYW4gZXNzZW50aWFsCi0gICAgIGZ1bmN0aW9uYWxpdHkgbmVlZGVkIGZvciBiYWxhbmNpbmcgYmV0d2VlbiBiYWNrZW5kLXNlcnZlcnMgd2hlbiB1c2luZwotICAgICBBcGFjaGUgYXMgYSBSZXZlcnNlIFByb3h5LiAgVGhlIGxvb2tlZCB1cCB2YWx1ZSBoZXJlIGlzIGEgbGlzdCBvZgotICAgICBzZXJ2ZXJzKS4gU2Vjb25kLCBgaW50JyB3aXRoIHRoZSBidWlsdC1pbiBtYXBzIG5hbWVkIGB0b2xvd2VyJyBhbmQKLSAgICAgYHRvdXBwZXInIHdoaWNoIGNhbiBiZSB1c2VkIHRvIG1hcCBVUkwgcGFydHMgdG8gYSBmaXhlZCBjYXNlICh0aGlzIGlzIGFuCi0gICAgIGVzc2VudGlhbCBmZWF0dXJlIHRvIGZpeCB0aGUgY2FzZSBvZiBzZXJ2ZXIgbmFtZXMgd2hlbiBkb2luZyBtYXNzCi0gICAgIHZpcnR1YWwtaG9zdGluZyB3aXRoIHRoZSBoZWxwIG9mIG1vZF9yZXdyaXRlIGluc3RlYWQgb2YgdXNpbmcKLSAgICAgPFZpcnR1YWxIb3N0PiBzZWN0aW9ucykuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBwYXJ0cyBiYXNlZCBvbiBjb2RlIGZyb20KLSAgICAgSmF5IFNvZmZpYW4gPGpheUBjaW1lZGlhLmNvbT5dIFBSIzE2MzEKLQotICAqKSBBZGQgYSBuZXcgZGlyZWN0aXZlIHRvIG1vZF9wcm94eSBzaW1pbGFyIHRvIFByb3h5UGFzczogYFByb3h5UGFzc1JldmVyc2UnLgotICAgICBUaGlzIGRpcmVjdGl2ZSBsZXRzIEFwYWNoZSBhZGp1c3QgdGhlIFVSTCBpbiBMb2NhdGlvbi1oZWFkZXJzIG9uIEhUVFAKLSAgICAgcmVkaXJlY3QgcmVzcG9uc2VzIHNlbnQgYnkgdGhlIHJlbW90ZSBzZXJ2ZXIuIFRoaXMgd2F5IHRoZSB2aXJ0dWFsbHkKLSAgICAgbWFwcGVkIGFyZWEgaXMgbm8gbG9uZ2VyIGxlZnQgb24gcmVkaXJlY3RzIGFuZCB0aHVzIGJ5LXBhc3NlZCB3aGljaCBpcwotICAgICBlc3BlY2lhbGx5IGVzc2VudGlhbCB3aGVuIHJ1bm5pbmcgQXBhY2hlIGFzIGEgcmV2ZXJzZSBwcm94eS4gIAotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBIaWRlIFByb3h5LUF1dGhvcml6YXRpb24gZnJvbSBDR0kvU1NJL2V0YyBqdXN0IGxpa2UgQXV0aG9yaXphdGlvbiBpcwotICAgICBoaWRkZW4uIFtBbHZhcm8gTWFydGluZXogRWNoZXZhcnJpYV0KLQotICAqKSBBcGFjaGUgd2lsbCwgd2hlbiBzdGFydGVkIHdpdGggdGhlIC1YIChzaW5nbGUgcHJvY2VzcykgZGVidWdnaW5nIGZsYWcsCi0gICAgIGhvbm9yIHRoZSBTSUdJTlQgb3IgU0lHUVVJVCBzaWduYWxzIGFnYWluIG5vdy4gVGhpcyBjYXBhYmlsaXR5IGdvdCBsb3N0Ci0gICAgIGEgd2hpbGUgYWdvIGR1cmluZyBPUy8yIHNpZ25hbCBoYW5kbGluZyBjaGFuZ2VzLgotCi0gICopIFtQT1JUXSBXb3JrIGFyb3VuZCB0aGUgZmFjdCB0aGF0IE5lWFQgcnVucyBvbiBtb3JlIHRoYW4gdGhlCi0gICAgIG02OGsgY2hpcHMgaW4gbW9kX3N0YXR1cyBbU2NvdHQgQW5ndWlzaCBhbmQgVGltb3RoeSBMdW9tYQotICAgICA8bHVvbWF0QHBlYWsub3JnPl0KLQotICAqKSBbUE9SVF0gUmVjb2duaXplIEZyZWVCU0QgdmVyc2lvbnMgc28gd2UgY2FuIHVzZSB0aGUgT1MgcmVnZXggYXMgd2VsbAotICAgICBhcyBoYW5kbGluZyB1bnNpZ25lZC1jaGFycyBmb3IgRnJlZUJTRCB2MyBhbmQgdjIgW0FuZHJleSBDaGVybm92Ci0gICAgIDxhY2hlQG5hZ3VhbC5wcC5ydT4gYW5kIEppbV0gUFIjMTQ1MAotCi0gICopIFVzZSBTQV9SRVNFVEhBTkQgb3IgU0FfT05FU0hPVCB3aGVuIGluc3RhbGxpbmcgdGhlIGNvcmVkdW1wIGhhbmRsZXJzLgotICAgICBJbiBwYXJ0aWN1bGFyIHRoZSBoYW5kbGVycyBjb3VsZCB0cmlnZ2VyIHRoZW1zZWx2ZXMgaW50byBhbiBpbmZpbml0ZQotICAgICBsb29wIGlmIFJMaW1pdE1lbSB3YXMgdXNlZCB3aXRoIGEgc21hbGwgYW1vdW50IG9mIG1lbW9yeSAtLSB0b28gc21hbGwKLSAgICAgZm9yIHRoZSBzaWduYWwgc3RhY2sgZnJhbWUgdG8gYmUgc2V0IHVwLiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIEZpeCBwcm9ibGVtcyB3aXRoIGFic29sdXRlVVJJcyBpbnRyb2R1Y2VkIGR1cmluZyAxLjNiNC4gIFtEZWFuIEdhdWRldCwKLSAgICAgQWx2YXJvIE1hcnRpbmV6IEVjaGV2YXJyaWEgPGFsdmFyb0BsYW5kZXIuZXM+XQotCi0gICopIEZpeCBtdWx0aXBsZSBVc2VyRGlyIHByb2JsZW0gaW50cm9kdWNlZCBkdXJpbmcgMS4zYjQtZGV2LgotICAgICBbRGVhbiBHYXVkZXRdIFBSIzE4NTAKLQotICAqKSBhcF9jcHlzdHJuKCkgaGFkIGFuIG9mZi1ieS0xIGVycm9yLgotICAgICBbQ2hhcmxlcyBGdSA8Y2N3ZkBrbGFiLmNhbHRlY2guZWR1Pl0gUFIjMTg0NwotCi0gICopIEFQSTogQXMgS2VuIHN1Z2dlc3RlZCB0aGUgY2hlY2tfY21kX2NvbnRleHQoKSBmdW5jdGlvbiBhbmQgcmVsYXRlZAotICAgICBkZWZpbmVzIGFyZSBub24tc3RhdGljIG5vdyBzbyBtb2R1bGVzIGNhbiB1c2UgJ2VtLiAgW01hcnRpbiBLcmFlbWVyXQotCi0gICopIG1vZF9pbmZvIHdvdWxkIG9jY2FzaW9uYWxseSBwcm9kdWNlIGFuIHVucGFpcmVkIDx0dD4gaW4gaXRzCi0gICAgIG91dHB1dC4gRml4ZWQuIFtNYXJ0aW4gS3JhZW1lcl0KLQotICAqKSBCeSBkZWZhdWx0IEFJWCBiaW5kcyBhIHByb2Nlc3MgKGFuZCBpdCdzIGNoaWxkcmVuKSB0byBhIHNpbmdsZQotICAgICBwcm9jZXNzb3IuICBodHRwZCBjaGlsZHJlbiBub3cgdW5iaW5kIHRoZW1zZWx2ZXMgZnJvbSB0aGF0IGNwdQotICAgICBhbmQgcmUtYmluZCB0byBvbmUgc2VsZWN0ZWQgYXQgcmFuZG9tIHZpYSBiaW5kcHJvY2Vzc29yKCkKLSAgICAgW0RvdWcgTWFjRWFjaGVybl0KLQotICAqKSBMaW51eCAyLjAgYW5kIGFib3ZlIGltcGxlbWVudCBSTElNSVRfQVMsIFJMSU1JVF9EQVRBIGhhcyBhbG1vc3Qgbm8KLSAgICAgZWZmZWN0LiAgV29yayBhcm91bmQgaXQgYnkgdXNpbmcgUkxJTUlUX0FTIGZvciB0aGUgUkxpbWl0TUVNCi0gICAgIGRpcmVjdGl2ZS4gIFtFbnJpayBCZXJraGFuIDxlbnJpa0BpbmthLmRlPl0gUFIjMTgxNgotCi0gICopIG1vZF9taW1lX21hZ2ljIGVycm9yIG1lc3NhZ2Ugc2hvdWxkIGluZGljYXRlIHRoZSBmaWxlbmFtZSB3aGVuCi0gICAgIHJlYWRzIGZhaWwuICBbIk0uRC5QYXJrZXIiIDxtZHBjQG5ldGNvbS5jb20+XSBQUiMxODI3Ci0KLSAgKikgUHJldmlvdXNseSBBcGFjaGUgd291bGQgcGVybWl0IDwvRmlsZXM+IHRvIGVuZCA8RmlsZXNNYXRjaD4gKGFuZAotICAgICBzaW1pbGFyeSBmb3IgTG9jYXRpb24gYW5kIERpcmVjdG9yeSksIG5vdyB0aGlzIGlzIGRpYWdub3NlZCBhcyBhbgotICAgICBlcnJvci4gIEltcHJvdmUgZXJyb3IgbWVzc2FnZXMgZm9yIG1pc21hdGNoZWQgc2VjdGlvbnMgKDxGaWxlcz4sCi0gICAgIDxGaWxlc01hdGNoPiwgPERpcmVjdG9yeT4sIDxEaXJlY3RvcnlNYXRjaD4sIC4uLikuCi0gICAgIFtEZWFuIEdhdWRldCwgTWFydGluIEtyYWVtZXJdCi0KLSAgKikgPEZpbGVzPiBpcyBub3QgcGVybWl0dGVkIHdpdGhpbiA8TG9jYXRpb24+IChiZWNhdXNlIG9mIHRoZQotICAgICBzZW1hbnRpYyBvcmRlcmluZykuICBbRGVhbiBHYXVkZXRdIFBSIzM3OQotCi0gICopIDxGaWxlcz4gd2l0aCB3aWxkY2FyZHMgd2FzIGJyb2tlbiBieSB0aGUgY2hhbmdlIGluIHdpbGRjYXJkCi0gICAgIHNlbWFudGljcyAoKiBkb2VzIG5vdCBtYXRjaCAvKS4gIFRvIGZpeCB0aGlzLCA8RmlsZXM+IG5vdwotICAgICBhcHBseSBvbmx5IHRvIHRoZSBiYXNlbmFtZSBvZiB0aGUgcmVxdWVzdCBmaWxlbmFtZS4gIFRoaXMKLSAgICAgZml4ZXMgc29tZSBvdGhlciBpbmNvbnNpc3RlbmNpZXMgaW4gPEZpbGVzPiBzZW1hbnRpY3MKLSAgICAgKHN1Y2ggYXMgPEZpbGVzIGEqYj4gbm90IHdvcmtpbmcpLiAgW0RlYW4gR2F1ZGV0XSBQUiMxODE3Ci0KLSAgKikgUmVtb3ZlZCBib2d1cyAiZGlzdC50YXIiIHRhcmdldCBmcm9tIE1ha2VmaWxlLnRtcGwgYW5kIG1ha2Ugc3VyZQotICAgICBiYWNrdXAgZmlsZXMgYXJlIHJlbW92ZWQgb24gImNsZWFuIiB0YXJnZXQgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgUE9SVDogQWRkIC1sbSB0byBMSUJTIGZvciBIUFVYLiAgW0RlYW4gR2F1ZGV0XSBQUiMxNjM5Ci0KLSAgKikgVmFyaW91cyBlcnJvcnMgZnJvbSBzZWxlY3QoKSBhbmQgYWNjZXB0KCkgaW4gY2hpbGRfbWFpbigpIHdvdWxkCi0gICAgIHJlc3VsdCBpbiBhbiBpbmZpbml0ZSBsb29wLiAgSXQgc2VlbXMgdGhlc2UgdHdvIHRpY2tsZSBrZXJuZWwKLSAgICAgb3IgbGlicmFyeSBidWdzIG9jY2FzaW9uYWxseSwgYW5kIHJlc3VsdCBpbiBsb2cgc3BhbW1hZ2UgYW5kCi0gICAgIGEgZ2VuZXJhbGx5IGJhZCBzY2VuZS4gIE5vdyB0aGUgY2hpbGQgZXhpdHMgaW1tZWRpYXRlbHksCi0gICAgIHdoaWNoIHNlZW1zIHRvIGJlIGEgZ29vZCB3b3JrYXJvdW5kLgotICAgICBbRGVhbiBHYXVkZXRdIFBSIzE3NDcsIDExMDcsIDU4OCwgMTc4NywgOTg3LCA1ODgKLQotICAqKSBDbGVhbmVkIHVwIHNvbWUgcmFjZSBjb25kaXRpb25zIGluIHVuaXggY2hpbGRfbWFpbiBkdXJpbmcKLSAgICAgaW5pdGlhbGl6YXRpb24uIFtEZWFuIEdhdWRldF0KLQotICAqKSBTRUNVUklUWTogIlVzZXJEaXIgL2Fic3BhdGgiIHdpdGhvdXQgYSAqIGluIHRoZSBwYXRoIHdvdWxkIGFsbG93Ci0gICAgIHJlbW90ZSB1c2VycyB0byBhY2Nlc3MgIi9+Li4iIGFuZCBieXBhc3MgYWNjZXNzIHJlc3RyaWN0aW9ucwotICAgICAoYnV0IG5vdGUgL34uLi8uLiB3YXMgaGFuZGxlZCBwcm9wZXJseSkuCi0gICAgIFtMYXVyaSBKZXNtaW4gPGplc21pbkB1dC5lZT5dIFBSIzE3MDEKLQotICAqKSBBUEk6IG9zX2lzX3BhdGhfYWJzb2x1dGUoKSBub3cgdGFrZXMgYSBjb25zdCBjaGFyICogaW5zdGVhZCBvZiBhIGNoYXIgKi4KLSAgICAgW0RlYW4gR2F1ZGV0XQotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDEuM2I1Ci0KLSAgKikgU291cmNlIGZpbGUgZGVwZW5kZW5jaWVzIGluIE1ha2VmaWxlLnRtcGwgZmlsZXMgdGhyb3VnaG91dCB0aGUKLSAgICAgc291cmNlIHRyZWUgd2VyZSB1cGRhdGVkIHRvIGFjY3VyYXRlbHkgcmVmbGVjdCByZWFsaXR5LgotICAgICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgUHJlc2VydmUgdGhlIGNvbnRlbnQgZW5jb2RpbmcgZ2l2ZW4gYnkgdGhlIEFkZEVuY29kaW5nIGRpcmVjdGl2ZQotICAgICB3aGVuIHRoZSBjbGllbnQgZG9lc24ndCBvdGhlcndpc2Ugc3BlY2lmeSBhbiBlbmNvZGluZy4KLSAgICAgW1JvbmFsZCBUc2NoYWxhZXIgPFJvbmFsZC5Uc2NoYWxhZXJAcHNpLmNoPl0KLQotICAqKSBTb3J0IG91dCBwcm9ibGVtcyB3aXRoIGNhbm9uaWNhbCBmaWxlbmFtZSBoYW5kbGluZyBoYXBwZW5pbmcgdG9vIGxhdGUuCi0gICAgIFtEZWFuIEdhdWRldCwgQmVuIExhdXJpZV0KLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjNiNAotCi0gICopIFRoZSBtb2R1bGUgc3RydWN0dXJlIHdhcyBtb2RpZmllZCB0byBpbmNsdWRlIGEgKmR5bmFtaWNfbG9hZF9oYW5kbGUKLSAgICAgaW4gdGhlIFNUQU5EQVJEX01PRFVMRV9TVFVGRiBwb3J0aW9uLCBhbmQgdGhlIE1PRFVMRV9NQUdJQ19OVU1CRVIKLSAgICAgaGFzIGJlZW4gYnVtcGVkIGFjY29yZGluZ2x5LiAgW1BhdWwgU3V0dG9uXQotCi0gICopIEFsbCBCcm93c2VyTWF0Y2ggZGlyZWN0aXZlcyBtZW50aW9uZWQgaW4KLSAgICAgaHRkb2NzL21hbnVhbC9rbm93bl9jbGllbnRfcHJvYmxlbXMuaHRtbCBhcmUgaW4gdGhlIGRlZmF1bHQKLSAgICAgY29uZmlndXJhdGlvbiBmaWxlcy4gIFtMYXJzIEVpbGVicmVjaHRdCi0KLSAgKikgTWlOVCBwb3J0IHVwZGF0ZS4gW0phbiBQYXVsIFNjaG1pZHRdCi0KLSAgKikgSFRUUC8xLjEgcmVxdWlyZXMgeC1nemlwIGFuZCBnemlwIGVuY29kaW5ncyBiZSB0cmVhdGVkCi0gICAgIGVxdWl2YWxlbnQsIHNpbWlsYXJseSBmb3IgeC1jb21wcmVzcyBhbmQgY29tcHJlc3MuICBBcGFjaGUKLSAgICAgbm93IGlnbm9yZXMgYSBsZWFkaW5nIHgtIHdoZW4gY29tcGFyaW5nIGVuY29kaW5ncy4gIEl0IGFsc28KLSAgICAgcHJlc2VydmVzIHRoZSBlbmNvZGluZyB0aGUgY2xpZW50IHJlcXVlc3RzIChmb3IgZXhhbXBsZSBpZgotICAgICBpdCByZXF1ZXN0cyB4LWd6aXAsIHRoZW4gQXBhY2hlIHdpbGwgcmVzcG9uZCB3aXRoIHgtZ3ppcAotICAgICBpbiB0aGUgQ29udGVudC1FbmNvZGluZyBoZWFkZXIpLgotICAgICBbUm9uYWxkIFRzY2hhbGFlciA8Um9uYWxkLlRzY2hhbGFlckBwc2kuY2g+XSBQUiMxNzcyCi0KLSAgKikgRml4IGEgbWVtb3J5IGxlYWsgb24ga2VlcC1hbGl2ZSBjb25uZWN0aW9ucy4gIFtJZ29yIFRhdGFyaW5vdl0KLQotICAqKSBBZGRlZCBtb2Rfc28gbW9kdWxlIHRvIHN1cHBvcnQgZHluYW1pYyBsb2FkaW5nIG9mIG1vZHVsZXMgb24gVW5peAotICAgICAobGlrZSBtb2RfZGxkIGZvciBXaW4zMikuIFRoaXMgcmVwbGFjZXMgbW9kX2RsZC5jLiBVc2UgU2hhcmVkTW9kdWxlCi0gICAgIGluc3RlYWQgb2YgQWRkTW9kdWxlIGluIENvbmZpZ3VyYXRpb24gdG8gYnVpbGQgc2hhcmVkIG1vZHVsZXMKLSAgICAgW1NhbWVlciBQYXJla2gsIFBhdWwgU3V0dG9uXQotCi0gICopIE1pbm9yIGNsZWFudXBzIHRvIHItPmZpbmZvIGhhbmRsaW5nIGluIHNvbWUgbW9kdWxlcy4KLSAgICAgW0RlYW4gR2F1ZGV0XQotCi0gICopIEFic3RyYWN0IHJlYWQoKS93cml0ZSgpIHRvIGFwX3JlYWQoKS9hcF93cml0ZSgpLgotICAgICBNYWtlcyBpdCBlYXNpZXIgdG8gYWRkIG90aGVyIHR5cGVzIG9mIElPIGNvZGUgc3VjaCBhcyBTRklPLgotICAgICBbUmFuZHkgVGVyYnVzaF0KLQotICAqKSBBUEk6IEdlbmVyYWxpemUgZGVmYXVsdF9wb3J0IG1hbmlwdWxhdGlvbnMgdG8gbWFrZSBzdXBwb3J0IG9mCi0gICAgIGRpZmZlcmVudCBwcm90b2NvbHMgZWFzaWVyLiBbQmVuIExhdXJpZSwgUmFuZHkgVGVyYnVzaF0KLQotICAqKSBUaGVyZSBhcmUgbWFueSBjYXNlcyB3aGVyZSB1c2VycyBkbyBub3Qgd2FudCBBcGFjaGUgdG8gZm9ybQotICAgICBzZWxmLXJlZmVyZW50aWFsIHVybHMgdXNpbmcgdGhlICJjYW5vbmljYWwiIFNlcnZlck5hbWUgYW5kIFBvcnQuCi0gICAgIFRoZSBuZXcgVXNlQ2Fub25pY2FsTmFtZSBkaXJlY3RpdmUgKGRlZmF1bHQgb24pLCBpZiBzZXQgdG8gb2ZmCi0gICAgIHdpbGwgY2F1c2UgQXBhY2hlIHRvIHVzZSB0aGUgY2xpZW50LXN1cHBsaWVkIGhvc3RuYW1lIGFuZCBwb3J0LgotICAgICBBUEk6IFBhcnQgb2YgdGhpcyBjaGFuZ2UgcmVxdWlyZWQgYSBjaGFuZ2UgdG8gdGhlIGNvbnN0cnVjdF91cmwoKQotICAgICBwcm90b3R5cGU7IGFuZCB0aGUgYWRkaXRpb24gb2YgZ2V0X3NlcnZlcl9uYW1lKCkgYW5kCi0gICAgIGdldF9zZXJ2ZXJfcG9ydCgpLgotICAgICBbTWljaGFlbCBEb3VnbGFzcyA8bWlrZWRvdWdAdGV4YXMubmV0PiwgRGVhbiBHYXVkZXRdCi0gICAgIFBSIzMxNSwgNDU5LCA0ODUsIDE0MzMKLQotICAqKSBZZXQgYW5vdGhlciByZWFycmFuZ2VtZW50IG9mIHRoZSBzb3VyY2UgdHJlZS4uIG5vdyBhbGwgdGhlIGNvbW1vbgotICAgICBoZWFkZXIgZmlsZXMgYXJlIGluIHRoZSBzcmMvaW5jbHVkZSBkaXJlY3RvcnkuICBUaGUgLUltYWluIC1JYXAKLSAgICAgcmVmZXJlbmNlcyBpbiBNYWtlZmlsZXMgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gdGhlIHNpbXBsZXIgLUlpbmNsdWRlCi0gICAgIGluc3RlYWQuICBJbiBhZGRpdGlvbiB0byBzaW1wbGlmeWluZyB0aGUgYnVpbGQgYSBsaXR0bGUgYml0LCB0aGlzCi0gICAgIGFsc28gbWFrZXMgaXQgY2xlYXIgd2hlbiBhIG1vZHVsZSBpcyByZWZlcmVuY2luZyBzb21ldGhpbmcgaW4gYQotICAgICBvdGhlciB0aGFuIGtvc2hlciBtYW5uZXIgKGUuZy4sIHRoZSBwcm94eSBpbmNsdWRpbmcgbW9kX21pbWUuaCkuCi0gICAgIE1vZHVsZS1wcml2YXRlIGhlYWRlciBmaWxlcyAodGhlIHByb3h5LCBtb2RfbWltZSwgdGhlIHJlZ2V4IGxpYnJhcnksCi0gICAgIGFuZCBtb2RfcmV3cml0ZSkgaGF2ZSBub3QgYmVlbiBtb3ZlZCB0byBzcmMvaW5jbHVkZTsgbm9yIGhhdmUKLSAgICAgdGhlIE9TLWFic3RyYWN0aW9uIGZpbGVzLiAgW0tlbiBDb2FyXQotCi0gICopIEZpeCBhIGJ1ZyB3aGVyZSByLT5ob3N0bmFtZSBkaWRuJ3QgaGF2ZSB0aGUgOnBvcnQgc3RyaXBwZWQKLSAgICAgZnJvbSBpdC4gIFtEZWFuIEdhdWRldF0KLQotICAqKSBUd2Vha2VkIHRoZSBoZWFkZXJzX291dCB0YWJsZSBzaXplLCBhbmQgdGhlIHN1YnByb2Nlc3NfZW52Ci0gICAgIHRhYmxlIHNpemUgZ3Vlc3MgaW4gcmVuYW1lX29yaWdpbmFsX2Vudmlyb25tZW50KCkuICBBZGRlZAotICAgICBNQUtFX1RBQkxFX1BST0ZJTEUgd2hpY2ggY2FuIGhlbHAgZGlzY292ZXIgbWFrZV90YWJsZSgpCi0gICAgIGNhbGxzIHRoYXQgdXNlIHRvbyBzbWFsbCBhbiBpbml0aWFsIGd1ZXNzLCBzZWUgYWxsb2MuYy4KLSAgICAgW0RlYW4gR2F1ZGV0XQotCi0gICopIE9wdGlvbnMgYW5kIEFsbG93T3ZlcnJpZGUgd2VyZW4ndCBwcm9wZXJseSBtZXJnaW5nIGluIHRoZSBtYWluCi0gICAgIHNlcnZlciBzZXR0aW5nIGluc2lkZSB2aG9zdHMgKG9ubHkgYW4gaXNzdWUgd2hlbiB5b3UgaGF2ZSBubwotICAgICA8RGlyZWN0b3J5PiBvciBvdGhlciBzZWN0aW9uIGNvbnRhaW5pbmcgYW4gT3B0aW9ucyB0aGF0IGFmZmVjdHMKLSAgICAgYSByZXF1ZXN0KS4gIE9wdGlvbnMgK2ZvbyBvciAtZm9vIGluIHRoZSBtYWluX3NlcnZlciB3b3VsZG4ndAotICAgICBhZmZlY3QgdGhlIG1haW5fc2VydmVyJ3MgbG9va3VwIGRlZmF1bHRzLiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIFZhcmlhYmxlICdjd2QnIHdhcyBiZWluZyB1c2VkIHBvaW50bGVzc2x5IGJlZm9yZSBiZWluZyBzZXQuCi0gICAgIFtLZW4gQ29hcl0gUFIjMTczOAotCi0gICopIHItPmFsbG93ZWQgaGFuZGxpbmcgY2xlYW5lZCB1cCBpbiB0aGUgc3RhbmRhcmQgbW9kdWxlcy4KLSAgICAgW0RlYW4gR2F1ZGV0XQotCi0gICopIFNvbWUgY2FzZS1zZW5zaXRpdml0eSBpc3N1ZXMgY2xlYW5lZCB1cCB0byBiZSBjb25zaXN0ZW50IHdpdGgKLSAgICAgUkZDMjA2OC4gIFtEZWFuIEdhdWRldF0KLQotICAqKSBTSUdVUkcgZG9lc24ndCBleGlzdCBldmVyeXdoZXJlLgotICAgICBbTWFyayBBbmRyZXcgSGVpbnJpY2ggPGhlaW5yaWNoQHRpbmRlcmJveC5TdGFuZm9yZC5FRFU+XQotCi0gICopIG1vZF91bmlxdWVfaWQgd2FzIGVycm9uZW91c2x5IGdlbmVyYXRpbmcgYSBzZWNvbmQgdW5pcXVlIGlkIHdoZW4KLSAgICAgYW4gaW50ZXJuYWwgcmVkaXJlY3Qgb2NjdXJlZC4gIFN1Y2ggcmVkaXJlY3RzIG9jY3VyLCBmb3IgZXhhbXBsZSwKLSAgICAgd2hlbiBwcm9jZXNzaW5nIGEgRGlyZWN0b3J5SW5kZXggbWF0Y2guICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgQVBJOiB0YWJsZV9hZGQsIHRhYmxlX21lcmdlLCBhbmQgdGFibGVfc2V0IGluY2x1ZGUgaW1wbGljaXQgcHN0cmR1cCgpCi0gICAgIG9mIHRoZSBrZXkgYW5kIHZhbHVlLiAgQnV0IGluIG1hbnkgY2FzZXMgdGhpcyBpcyBub3QgcmVxdWlyZWQKLSAgICAgYmVjYXVzZSB0aGUga2V5L3ZhbHVlIGlzIGEgY29uc3RhbnQsIG9yIHRoZSB2YWx1ZSBoYXMgYmVlbiBidWlsdAotICAgICBieSBwc3RyY2F0KCkgb3Igb3RoZXIgc2ltaWxhciBtZWFucy4gIE5ldyByb3V0aW5lcyB0YWJsZV9hZGRuLAotICAgICB0YWJsZV9tZXJnZW4sIGFuZCB0YWJsZV9zZXRuIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgQVBJLCB0aGVzZQotICAgICByb3V0aW5lcyBkbyBub3QgcHN0cmR1cCgpIHRoZWlyIGFyZ3VtZW50cy4gIFRoZSBjb3JlIGNvZGUgYW5kCi0gICAgIHN0YW5kYXJkIG1vZHVsZXMgd2VyZSBjaGFuZ2VkIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZXNlIHJvdXRpbmVzLgotICAgICBUaGUgcmVzdWx0aW5nIHNlcnZlciBpcyB1cCB0byAyMCUgZmFzdGVyIGluIHNvbWUgc2l0dWF0aW9ucy4KLQotICAgICBOb3RlIHRoYXQgaXQgaXMgZWFzeSB0byBnZXQgY29kZSBzdWJ0bHkgd3JvbmcgaWYgeW91IHBhc3MgYSBrZXkvdmFsdWUKLSAgICAgd2hpY2ggaXMgaW4gYSBwb29sIG90aGVyIHRoYW4gdGhlIHBvb2wgb2YgdGhlIHRhYmxlLiAgVGhlIG9ubHkKLSAgICAgc2FmZSB0aGluZyB0byBkbyBpcyB0byBwYXNzIGtleS92YWx1ZXMgd2hpY2ggYXJlIGluIHRoZSBwb29sIG9mCi0gICAgIHRoZSB0YWJsZSwgb3IgaW4gb25lIG9mIHRoZSBhbmNlc3RvcnMgb2YgdGhlIHBvb2wgb2YgdGhlIHRhYmxlLgotICAgICBpLmUuIGlmIHRoZSB0YWJsZSBpcyBwYXJ0IG9mIGEgc3VicmVxdWVzdCwgYSB2YWx1ZSBmcm9tIHRoZSBtYWluCi0gICAgIHJlcXVlc3QncyBwb29sIGlzIE9LIHNpbmNlIHRoZSBzdWJyZXF1ZXN0IHBvb2wgaXMgYSBzdWJfcG9vbCBvZiB0aGUKLSAgICAgbWFpbiByZXF1ZXN0J3MgcG9vbCAoYW5kIHRoZXJlZm9yZSBoYXMgYSBsaWZlc3BhbiBhdCBtb3N0IGFzIGxvbmcgYXMKLSAgICAgdGhlIG1haW4gcG9vbCkuICBUaGVyZSBpcyBkZWJ1Z2dpbmcgY29kZSB3aGljaCBjYW4gZGV0ZWN0IGltcHJvcGVyCi0gICAgIHVzYWdlLCBlbmFibGVkIGJ5IGRlZmluaW5nIFBPT0xfREVCVUcuICBTZWUgYWxsb2MuYyBmb3IgbW9yZSBkZXRhaWxzLgotICAgICBbRG1pdHJ5IEtocnVzdGFsZXYgPGRpbWFAYm9nLm1zdS5zdT4sIERlYW4gR2F1ZGV0XQotCi0gICopIE1vcmUgbW9kX21pbWVfbWFnaWMgY2xlYW51cDogIGZld2VyIHN5c2NhbGxzOyBzaG91bGQgaGFuZGxlICJmaWxlcyIKLSAgICAgd2hpY2ggZG9uJ3QgZXhpc3Qgb24gZGlzayBtb3JlIGdyYWNlZnVsbHk7IGhhbmRsZXMgdmhvc3RzIHByb3Blcmx5LgotICAgICBVcGRhdGUgZG9jdW1lbnRhdGlvbiB0byByZWZsZWN0IHRoZSBjb2RlIC0tIGlmIHRoZXJlJ3Mgbm8KLSAgICAgTWltZU1hZ2ljRmlsZSBkaXJlY3RpdmUgdGhlbiB0aGUgbW9kdWxlIGlzIG5vdCBlbmFibGVkLgotICAgICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgUE9SVDogU29tZSBvbGRlciAqbml4IGRpYWxlY3RzIGNhbm5vdCBhdXRvbWF0aWNhbGx5IHN0YXJ0IHNjcmlwdHMKLSAgICAgd2hpY2ggYmVnaW4gd2l0aCBhICMhIGludGVycHJldGVyIGxpbmUgKHRoZSBzaGVsbCBzdGFydHMgdGhlIHNjcmlwdHMKLSAgICAgYXBwcm9wcmlhdGVseSBvbiB0aGVzZSBwbGF0Zm9ybXMpLiBBcGFjaGUgbm93IHN1cHBvcnRzIHN0YXJ0aW5nIG9mCi0gICAgICJoYXNoYmFuZy1zY3JpcHRzIiB3aGVuIHRoZSBORUVEX0hBU0hCQU5HX0VNVUwgZGVmaW5lIGlzIHNldC4KLSAgICAgW01hcnRpbiBLcmFlbWVyLCB3aXRoIGNvZGUgZnJvbSBwZXRlckB6ZXVzLmRpYWxpeC5vei5hdSAoUGV0ZXIgV2VtbSkKLSAgICAgdGFrZW4gZnJvbSB0Y3NoXQotCi0gICopIEFQSTogInR5cGVkZWYgYXJyYXlfaGVhZGVyIHRhYmxlIiByZW1vdmVkIGZyb20gYWxsb2MuaCwgZm9sa3Mgc2hvdWxkCi0gICAgIGhhdmUgYmVlbiB3cml0aW5nIHRvIHVzZSB0YWJsZSBhcyBpZiBpdCB3ZXJlIGFuIG9wYXF1ZSB0eXBlLCBidXQgZXZlbgotICAgICBzb21lIHN0YW5kYXJkIG1vZHVsZXMgZ290IHRoaXMgd3JvbmcuICBCeSBjaGFuZ2luZyB0aGUgZGVmaW5pdGlvbgotICAgICB0byAidHlwZWRlZiBzdHJ1Y3QgdGFibGUgdGFibGUiIG1vZHVsZSBhdXRob3JzIHdpbGwgcmVjZWl2ZSBjb21waWxlCi0gICAgIHRpbWUgd2FybmluZ3MgdGhhdCB0aGV5J3JlIGRvaW5nIHRoZSB3cm9uZyB0aGluZy4gIFRoaXMgY2hhbmdlCi0gICAgIGZhY2lsaXRhdGVzIGZ1dHVyZSBjaGFuZ2VzIHdpdGggbW9yZSBzb3BoaXN0aWNhdGVkIHRhYmxlCi0gICAgIHN0cnVjdHVyZXMuICBTcGVjaWZpY2FsbHksIG1vZHVsZSBhdXRob3JzIHNob3VsZCBiZSB1c2luZyB0YWJsZV9lbHRzKCkKLSAgICAgdG8gZ2V0IGFjY2VzcyB0byBhbiBhcnJheV9oZWFkZXIgKiBmb3IgdGhlIHRhYmxlLiBbRGVhbiBHYXVkZXRdCi0KLSAgKikgQVBJOiBSZW5hbWVkIG5ld19jb25uZWN0aW9uKCkgdG8gYXZvaWQgbmFtZXNwYWNlIGNvbGxpc2lvbiB3aXRoIExEQVAKLSAgICAgbGlicmFyeSByb3V0aW5lcy4gIFtLZW4gQ29hciwgUmFzbXVzIExlcmRvcmZdCi0KLSAgKikgV0lOMzI6IG1vZF9zcGVsaW5nIGlzIG5vdyBhdmFpbGFibGUgb24gdGhlIFdpbjMyIHBsYXRmb3JtLgotICAgICBbTWFyYyBTbGVta29dCi0KLSAgKikgRm9yIGNsYXJpdHkgdGhlIGZvbGxvd2luZyBjb21waWxlIHRpbWUgZGVmaW5pdGlvbiB3YXMgY2hhbmdlZDoKLQotICAgICAgICBTQUZFX1VOU0VSSUFMSVpFRF9BQ0NFUFQgIC0+ICAgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBUCi0KLSAgICAgQWxzbywgZm9yIGV4YW1wbGUsIEhBVkVfTU1BUCB3b3VsZCBtZWFuIHRvIHVzZSBtbWFwKCkgc2NvcmVib2FyZHMKLSAgICAgYW5kIG5vdCBiZSBhIGdlbmVyYWwgbm90aWNlIHRoYXQgdGhlIE9TIGhhcyBtbWFwKCkuIE5vdyB0aGUKLSAgICAgSEFWRV9NTUFQL1NITUdFVCAjZGVmaW5lcyBzdHJpY3RseSBhcmUgaW5mb3JtYXRpb25hbCB0aGF0IHRoZQotICAgICBPUyBoYXMgdGhhdCBtZXRob2Qgb2Ygc2hhcmVkIG1lbW9yeTsgdGhlIHR5cGUgdG8gdXNlIGZvcgotICAgICB0aGUgc2NvcmVib2FyZCBpcyBhIHNlcGVyYXRlICNkZWZpbmUgKFVTRV9NTUFQX1NDT1JFQk9BUkQKLSAgICAgYW5kIFVTRV9TSE1HRVRfU0NPUkVCT0FSRCkuIFRoaXMgYWxsb3dzIG91dHNpZGUgbW9kdWxlcyB0bwotICAgICBkZXRlcm1pbmUgaWYgc2hhcmVkIG1lbW9yeSBpcyBhdmFpbGFibGUgYW5kIGFsbG93cyBBcGFjaGUKLSAgICAgdG8gZGV0ZXJtaW5lIHRoZSBiZXN0IG1ldGhvZCB0byB1c2UgZm9yIHRoZSBzY29yZWJvYXJkLgotICAgICBbSmltIEphZ2llbHNraV0KLQotICAqKSBQT1JUOiBVbml4V2FyZSAyLjEuMiBTTVAgYXBwZWFycyB0byByZXF1aXJlIFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVCwKLSAgICAgYXMgZG8gdmFyaW91cyBlYXJsaWVyIHZlcnNpb25zLiAgSXQgc2hvdWxkIGJlIHNhZmUgb24gYWxsIHZlcnNpb25zLgotICAgICBVbml4d2FyZSAxLnggYXBwZWFycyB0byBoYXZlIHRoZSBzYW1lIFNJR0hVUCBidWcgYXMgc29sYXJpcyBkb2VzIHdpdGgKLSAgICAgdGhlIHNsYWNrIGNvZGUuICBBIGZldyBvdGhlciBjbGVhbnVwcyBmb3IgVW5peHdhcmUuCi0gICAgIFtUb20gSHVnaGVzIDx0aGhAY3liZXJzY2llbmNlLmNvbT5dIFBSIzEwODIsIFBSIzEyODIsIFBSIzE0OTksIFBSIzE1NTMKLQotICAqKSBQT1JUOiBBL1VYIGNhbiBoYW5kbGUgc2luZ2xlLWxpc3RlbiBhY2NlcHRzIHdpdGhvdXQgbXV0ZXgKLSAgICAgbG9ja2luZywgc28gd2UgYWRkIFNJTkdMRV9MSVNURU5fVU5TRVJJQUxJWkVEX0FDQ0VQVC4gW0ppbSBKYWdpZWxza2ldCi0KLSAgKikgV2hlbiBkaWUoKSBoYXBwZW5zIHdlIG5lZWQgdG8gZWF0IGFueSByZXF1ZXN0IGJvZHkgaWYgb25lIGV4aXN0cy4KLSAgICAgT3RoZXJ3aXNlIHdlIGNhbid0IGNvbnRpbnVlIHdpdGggYSBrZWVwYWxpdmUgc2Vzc2lvbi4gIFRoaXMgc2hvd3MgdXAKLSAgICAgYXMgYSBQT1NUIHByb2JsZW0gd2l0aCBNU0lFIDQuMCwgdHlwaWNhbGx5IGFnYWluc3QgcGFnZXMgd2hpY2ggYXJlCi0gICAgIGF1dGhlbnRpY2F0ZWQuICBbUm95IEZpZWxkaW5nXSBQUiMxMzk5Ci0KLSAgKikgSWYgeW91IGRlZmluZSBTRUNVUklUWV9IT0xFX1BBU1NfQVVUSE9SSVpBVElPTiB0aGVuIHRoZSBBdXRob3JpemF0aW9uCi0gICAgIGhlYWRlciB3aWxsIGJlIHBhc3NlZCB0byBDR0lzLiAgVGhpcyBpcyBnZW5lcmFsbHkgYSBzZWN1cml0eSBob2xlLCBzbwotICAgICBpdCdzIG5vdCBhIGRlZmF1bHQuICBbTWFyYyBTbGVta29dIFBSIzU0OQotCi0gICopIEZpeCBZMksgcHJvYmxlbSB3aXRoIGRhdGUgcHJpbnRpbmcgaW4gc3VleGVjIGxvZy4KLSAgICAgW1BhdWwgRWdnZXJ0IDxlZ2dlcnRAdHdpbnN1bi5jb20+XSBQUiMxMzQzCi0KLSAgKikgV0lOMzIgZGVzZXJ2ZXMgYSBwaWQgZmlsZS4gIFtCZW4gSHlkZV0KLQotICAqKSBzdWV4ZWMgZXJyb3JzIG5vdyBpbmNsdWRlIHRoZSBlcnJuby9kZXNjcmlwdGlvbi4gIFtNYXJjIFNsZW1rb10gUFIjMTU0MwotCi0gICopIFBPUlQ6IE9TRi8xIG5vdyB1c2VzIFVTRV9GTE9DS19TRVJJQUxJWkVEX0FDQ0VQVCB0byBzb2x2ZSBQUiM0NjcuCi0gICAgIFRoZSBjaG9pY2Ugb2YgZmxvY2sgdnMuIGZjbnRsIHdhcyBtYWRlIGJhc2VkIG9uIHRpbWluZ3Mgd2hpY2ggc2hvd2VkIHRoYXQKLSAgICAgZXZlbiBvbiBub24tTkZTLCBub24tZXhwb3J0ZWQgZmlsZXN5c3RlbXMgZmNudGwoKSB3YXMgYW4gb3JkZXIgb2YKLSAgICAgbWFnbml0dWRlIHNsb3dlci4gIEl0IGFsc28gdXNlcyBTSU5HTEVfTElTVEVOX1VOU0VSSUFMSVpFRF9BQ0NFUFQgc28KLSAgICAgdGhhdCBzaW5nbGUgc29ja2V0IHVzZXJzIHdpbGwgc2VlIG5vIGRpZmZlcmVuY2UuIFtEZWFuIEdhdWRldF0gUFIjNDY3Ci0KLSAgKikgIkZpbGUgZG9lcyBub3QgZXhpc3QiIGVycm9yIG1lc3NhZ2Ugd2FzIGVycm9uZW91c2x5IGluY2x1ZGluZyB0aGUKLSAgICAgZXJybm8uICBbTWFyYyBTbGVta29dCi0KLSAgKikgSW1wcm92ZSB0aGUgd2FybmluZyBtZXNzYWdlIGdlbmVyYXRlZCB3aGVuIGEgY2xpZW50IGRyb3BzIHRoZQotICAgICBjb25uZWN0aW9uIChoaXRzIHN0b3AgYnV0dG9uLCBldGMuKSBkdXJpbmcgYSBzZW5kLiAgW1JveSBGaWVsZGluZ10KLQotICAqKSBEZWZpbmluZyBHUFJPRiB3aWxsIGRpc2FibGUgcHJvZmlsaW5nIGluIHRoZSBwYXJlbnQgYW5kIGVuYWJsZSBpdAotICAgICBpbiB0aGUgY2hpbGRyZW4uICBJZiB5b3UncmUgcHJvZmlsaW5nIHVuZGVyIExpbnV4IHRoaXMgaXMgcHJldHR5IG11Y2gKLSAgICAgbmVjZXNzYXJ5IGJlY2F1c2UgU0lHUFJPRiBpcyBsb3N0IGFjcm9zcyBhIGZvcmsoKS4gW0RlYW4gR2F1ZGV0XQotCi0gICopIGh0ZGlnZXN0IGFuZCBodHBhc3N3ZCBuZWVkZWQgc2xpZ2h0IHR3ZWFrcyB0byB3b3JrIG9uIE9TLzIgYW5kIFdJTjMyLgotICAgICBbQnJpYW4gSGF2YXJkXQotCi0gICopIFRoZSBOZVhUIGNjICh3aGljaCBpcyBnY2MgaGFja2VkIHVwKSBkb2Vzbid0IGFwcGVhciB0byBzdXBwb3J0IHNvbWUKLSAgICAgZ2NjIGZ1bmN0aW9uYWxpdHkuICBXb3JrIGFyb3VuZCBpdC4KLSAgICAgW0tlaXRoIFNldmVyc29uIDxrZWl0aEBzc3NkLm5hdnkubWlsPl0gUFIjMTYxMwotCi0gICopIFNvbWUgbGlua2VycyBjb21wbGFpbiB3aGVuIC5vIGZpbGVzIGNvbnRhaW4gbm8gZnVuY3Rpb25zLgotICAgICBbS2VpdGggU2V2ZXJzb24gPGtlaXRoQHNzc2QubmF2eS5taWw+XSBQUiMxNjE0Ci0KLSAgKikgU29tZSBjb25zdCBkZWNsYXJhdGlvbnMgaW4gbW9kX2ltYXAuYyB0aGF0IHdlcmUgYWRkZWQgZm9yIGRlYnVnZ2luZwotICAgICBwdXJwb3NlcyBjYXVzZWQgc29tZSBjb21waWxlcnMgaGVhcnRidXJuIHdpdGhvdXQgYWRkaW5nIGFueQotICAgICBzaWduaWZpY2FudCB2YWx1ZSwgc28gdGhleSd2ZSBiZWVuIHJlbW92ZWQuICBbS2VuIENvYXJdCi0KLSAgKikgVGhlIHNyYy9tYWluLyouaCBoZWFkZXIgZmlsZXMgaGF2ZSBoYWQgI2lmbmRlZiB3cmFwcGVycyBhZGRlZCB0bwotICAgICBpbnN1bGF0ZSB0aGVtIGFnYWluc3QgZHVwbGljYXRlIGNhbGxzIGlmIHRoZXkgZ2V0IGluY2x1ZGVkIHRocm91Z2gKLSAgICAgbXVsdGlwbGUgcGF0aHMgKGUuZy4sIGluIC5jIGZpbGVzIGFzIHdlbGwgYXMgb3RoZXIgLmggZmlsZXMpLgotICAgICBbS2VuIENvYXJdCi0KLSAgKikgVGhlIGxpYmFwIHJvdXRpbmVzIG5vdyBoYXZlIGEgaGVhZGVyIGZpbGUgZm9yIHRoZWlyIHByb3RvdHlwZXMsCi0gICAgIHNyYy9hcC9hcC5oLCB0byBlYXNlIHRoZWlyIHVzZSBpbiBub24taHR0cGQgYXBwbGljYXRpb25zLiAgW0tlbiBDb2FyXQotCi0gICopIG1vZF9hdXRvaW5kZXggd2l0aCBhIHBsYWludGV4dCBoZWFkZXIgZmlsZSB3b3VsZCBlbWl0IHRoZSA8UFJFPgotICAgICBzdGFydC10YWcgYmVmb3JlIHRoZSBIVE1MIHByZWFtYmxlLCByYXRoZXIgdGhhbiBhZnRlciB0aGUgcHJlYW1ibGUKLSAgICAgYnV0IGJlZm9yZSB0aGUgaGVhZGVyIGZpbGUgY29udGVudHMuICBbSm9obiBWYW4gRXNzZW4gPGp2ZUBnYW1lcnMub3JnPl0KLSAgICAgUFIjMTY2NwotCi0gICopIFNFQ1VSSVRZOiBGaXggYSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgaW4gbG9ncmVzb2x2ZS4gIFRoaXMgaXMKLSAgICAgb25seSBhbiBpc3N1ZSBvbiBzeXN0ZW1zIHdpdGhvdXQgYSBNQVhETkFNRSBkZWZpbmUgb3Igd2hlcmUKLSAgICAgdGhlIHJlc29sdmVyIHJldHVybnMgZG9tYWluIG5hbWVzIGxvbmdlciB0aGFuIE1BWEROQU1FLiAgW01hcmMgU2xlbWtvXQotCi0gICopIFNFQ1VSSVRZOiBFbGltaW5hdGUgcG9zc2libGUgYnVmZmVyIG92ZXJmbG93IGluIGNmZ19nZXRsaW5lLCB3aGljaAotICAgICBpcyB1c2VkIHRvIHJlYWQgdmFyaW91cyB0eXBlcyBvZiBmaWxlcyBzdWNoIGFzIGh0YWNjZXNzIGFuZAotICAgICBodHBhc3N3ZCBmaWxlcy4gIFtNYXJjIFNsZW1rb10KLQotICAqKSBTRUNVUklUWTogRW5zdXJlIHRoYXQgdGhlIGJ1ZmZlciByZXR1cm5lZCBieSBodF90aW1lIGlzIGFsd2F5cwotICAgICBwcm9wZXJseSBudWxsIHRlcm1pbmF0ZWQuICBbTWFyYyBTbGVta29dCi0KLSAgKikgVGhlICJDb25uZWN0aW9uIiBoZWFkZXIgY291bGQgYmUgc2VudCBiYWNrIHdpdGggbXVsdGlwbGUgImNsb3NlIgotICAgICB0b2tlbnMuICBOb3QgYW4gZXJyb3IsIGJ1dCBhIHdhc3RlLgotICAgICBbUm9uYWxkLlRzY2hhbGFlckBwc2kuY2hdIFBSIzE2ODMKLQotICAqKSBtb2RfcmV3cml0ZSdzIFJld3JpdGVMb2cgc2hvdWxkIGJlaGF2ZSBsaWtlIG1vZF9sb2dfY29uZmlnLCBpdAotICAgICBzaG91bGRuJ3QgZm9yY2UgaG9zdG5hbWUgbG9va3Vwcy4gIFtEZWFuIEdhdWRldF0gUFIjMTY4NAotCi0gICopICJiYXNpYyIgYXV0aCBuZWVkcyBhIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbi4KLSAgICAgW1JvbmFsZC5Uc2NoYWxhZXJAcHNpLmNoXSBQUiMxNjY2Ci0KLSAgKikgRm9yIG1heGltdW0gcG9ydGFiaWxpdHksIHRoZSBlbnZpcm9ubWVudCBwYXNzZWQgdG8gQ0dJcyBzaG91bGQKLSAgICAgb25seSBjb250YWluIHZhcmlhYmxlcyB3aG9zZSBuYW1lcyBtYXRjaCB0aGUgcmVnZXgKLSAgICAgL1thLXpBLVpdW2EtekEtWjAtOV9dKi8uICBUaGlzIGlzIG5vdyBlbmZvcmNlZCBieSBzdGFtcGluZwotICAgICB1bmRlcnNjb3JlcyBvdmVyIGFueSBjaGFyYWN0ZXIgb3V0c2lkZSB0aGUgcmVnZXguICBUaGlzCi0gICAgIGFmZmVjdHMgSFRUUF8qIHZhcmlhYmxlcywgaW4gYSB3YXkgdGhhdCBzaG91bGQgYmUgYmFja3dhcmQKLSAgICAgY29tcGF0aWJsZSBmb3IgYWxsIHRoZSBzdGFuZGFyZCBoZWFkZXJzOyBhbmQgYWZmZWN0cyB2YXJpYWJsZXMKLSAgICAgc2V0IHdpdGggU2V0RW52L0Jyb3dzZXJNYXRjaCBhbmQgc2ltaWxhciBkaXJlY3RpdmVzLgotICAgICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgbW9kX3NwZWxpbmcgcmV0dXJuZWQgaW5jb3JyZWN0IEhSRUYncyB3aGVuIGFuIGFtYmlnb3VzIG1hdGNoCi0gICAgIHdhcyBmb3VuZC4gTm90aWNlZCBieSA8cm9iaW50b25AYW10cmFzaC5jb21saW5rLmRlPiAoU29lcmVuIFppZWhlKQotICAgICBbcm9iaW50b25AYW10cmFzaC5jb21saW5rLmRlIChTb2VyZW4gWmllaGUpLCBNYXJ0aW4gS3JhZW1lcl0KLQotICAqKSBQT1JUOiBBcGFjaGUgbm93IGNvbXBpbGVzICYgcnVucyBvbiBhbiBFQkNESUMgbWFpbmZyYW1lCi0gICAgICh0aGUgU2llbWVucyBCUzIwMDAvT1NEIGZhbWlseSkgaW4gdGhlIFBPU0lYIHN1YnN5c3RlbQotICAgICBbTWFydGluIEtyYWVtZXJdCi0KLSAgKikgUE9SVDogRml4IHByb2JsZW0ga2lsbGluZyBjaGlsZHJlbiB3aGVuIHRlcm1pbmF0aW5nLiAgQWxsb3cgXkMKLSAgICAgdG8gc2h1dCBkb3duIHRoZSBzZXJ2ZXIuICBbQnJpYW4gSGF2YXJkXQotCi0gICopIHBzdHJkdXAoKSBpcyBpbXBsaWNpdCBpbiBjYWxscyB0byB0YWJsZV8qIGZ1bmN0aW9ucywgc28gdGhlcmUncwotICAgICBubyBuZWVkIHRvIGRvIGl0IGJlZm9yZSBjYWxsaW5nLiAgQ2xlYW4gdXAgYSBmZXcgY2FzZXMuCi0gICAgIFtNYXJjIFNsZW1rbywgRGVhbiBHYXVkZXRdCi0KLSAgKikgbmV3IC1DIGFuZCAtYyBjb21tYW5kIGxpbmUgYXJndW1lbnRzCi0gICAgIHVzYWdlOgotICAgICAtQyAiZGlyZWN0aXZlIiA6IHByb2Nlc3MgZGlyZWN0aXZlIGJlZm9yZSByZWFkaW5nIGNvbmZpZyBmaWxlcwotICAgICAtYyAiZGlyZWN0aXZlIiA6IHByb2Nlc3MgZGlyZWN0aXZlIGFmdGVyIHJlYWRpbmcgY29uZmlnIGZpbGVzCi0gICAgIGV4YW1wbGU6Ci0gICAgIGh0dHBkIC1DICJQZXJsTW9kdWxlIEFwYWNoZTo6aHR0cGRfY29uZiIKLSAgICAgW0RvdWcgTWFjRWFjaGVybiwgTWFydGluIEtyYWVtZXJdCi0KLSAgKikgV0lOMzI6IEZpeCB0aGUgZXhlY3V0aW9uIG9mIENHSXMgdGhhdCBhcmUgc2NyaXB0cyBhbmQgY2FsbGVkIAotICAgICB3aXRoIHBhdGggaW5mbyB0aGF0IGRvZXMgbm90IGhhdmUgYW4gJz0nIGluLgotICAgICAoZWcuIGh0dHA6Ly9zZXJ2ZXIvY2dpLWJpbi9wcmludGVudj9mb29iYXIpICAKLSAgICAgW01hcmMgU2xlbWtvXSBQUiMxNTkxCi0KLSAgKikgV0lOMzI6IEZpeCBhIGNhbGwgdG8gb3NfY2Fub25pY2FsX2ZpbGVuYW1lIHNvIGl0IGRvZXNuJ3QgdHJ5IHRvIAotICAgICBtZXNzIHdpdGggZmFrZSBmaWxlbmFtZXMuICBUaGlzIGZpeGVzIHByb3h5IGNhY2hpbmcgb24gCi0gICAgIHdpbjMyLiBQUiMxMjY1Ci0KLSAgKikgU0VDVVJJVFk6IEdlbmVyYWwgbW9kX2luY2x1ZGUgY2xlYW51cCwgaW5jbHVkaW5nIGZpeGluZyBzZXZlcmFsCi0gICAgIHBvc3NpYmxlIGJ1ZmZlciBvdmVyZmxvd3MgYW5kIGEgcG9zc2libGUgaW5maW5pdGUgbG9vcC4KLSAgICAgW0RlYW4gR2F1ZGV0LCBNYXJjIFNsZW1rb10KLQotICAqKSBTRUNVUklUWTogTnVtZXJvdXMgY2hhbmdlcyB0byBtb2RfaW1hcCBpbiBhIGdlbmVyYWwgY2xlYW51cAotICAgICBpbmNsdWRpbmcgZml4aW5nIGEgcG9zc2libGUgYnVmZmVyIG92ZXJmbG93LiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIFdJTjMyOiBvdmVyaGF1bCBvZiBtdWx0aXRocmVhZGluZyBjb2RlLiBTaHV0ZG93bnMgYXJlIG5vdyBncmFjZWZ1bAotICAgICAoY29ubmVjdGlvbnMgYXJlIG5vdCBkcm9wcGVkKS4gQ29kZSBjYW4gaGFuZGxlIGdyYWNlZnVsIHJlc3RhcnRzCi0gICAgIChidXQgdGhlcmUgaXMgYXMgeWV0IG5vIHdheSB0byBzaWduYWwgdGhpcyB0byBBcGFjaGUpLiBWYXJpb3VzCi0gICAgIG90aGVyIGNsZWFudXBzLiBbUGF1bCBTdXR0b25dCi0KLSAgKikgVGhlIGFwbG9nX2Vycm9yIGNoYW5nZXMgc3BlY2lmaWMgdG8gMS4zIGludHJvZHVjZWQgYSBidWZmZXIKLSAgICAgb3ZlcnJ1biBpbiB0aGUgKG5vdyBsZWdhY3kpIGxvZ19wcmludGYgZnVuY3Rpb24uICBGaXhlZC4KLSAgICAgW0RlYW4gR2F1ZGV0XQotCi0gICopIG1vZF9kaWdlc3QgZGlkbid0IHByb3Blcmx5IGRlYWwgd2l0aCBwcm94eSBhdXRoZW50aWNhdGlvbi4gIEl0Ci0gICAgIGFsc28gbGFja2VkIGEgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc2lvbiBvZiB0aGUgIkRpZ2VzdCIKLSAgICAgdG9rZW4uICBbUm9uYWxkIFRzY2hhbGFlciA8Um9uYWxkLlRzY2hhbGFlckBwc2kuY2g+XSBQUiMxNTk5Ci0KLSAgKikgQSBmZXcgY2xlYW51cHMgaW4gbW9kX3N0YXR1cyBmb3IgZWZmaWNpZW5jeS4gIFtEZWFuIEdhdWRldF0KLQotICAqKSBBIGZldyBjbGVhbnVwcyBpbiBtb2RfaW5mbyB0byBtYWtlIGl0IHRocmVhZC1zYWZlLCBhbmQgcmVtb3ZlIGFuCi0gICAgIG9mZi1ieS01IGJ1ZyB0aGF0IGNvdWxkIGhhbW1lciBcMCBvbiB0aGUgc3RhY2suIFtEZWFuIEdhdWRldF0KLQotICAqKSBubzJzbGFzaCgpIHdhcyBPKG5eMikgaW4gdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQuICBNYWtlIGl0IE8obikuCi0gICAgIFtEZWFuIEdhdWRldF0KLQotICAqKSBBUEk6IG1pZ3JhdGlvbiBmcm9tIHN0cm5jcHkoKSB0byBvdXIgImVuaGFuY2VkIiB2ZXJzaW9uIGNhbGxlZAotICAgICBhcF9jcHlzdHJuKCkgZm9yIHBlcmZvcm1hbmNlIGFuZCBmdW5jdGlvbmFsaXR5IHJlYXNvbnMuCi0gICAgIExvY2F0ZWQgaW4gbGliYXAuYS4gIFtKaW0gSmFnaWVsc2tpXQotCi0gICopIHRhYmxlX3NldCgpIGFuZCB0YWJsZV91bnNldCgpIGRpZCBub3QgZGVhbCBjb3JyZWN0bHkgd2l0aAotICAgICBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSBrZXkuCi0gICAgIFtTdGVwaGVuIFNjaGVjayA8c3NjaGVja0BpbmZvbmV4Lm5ldD4sIEJlbiBMYXVyaWVdIFBSIzE2MDQKLQotICAqKSBUaGUgQXV0aE5hbWUgbXVzdCBub3cgYmUgZW5jbG9zZWQgaW4gcXVvdGVzIGlmIGl0IGlzIHRvIGNvbnRhaW4KLSAgICAgc3BhY2VzLiAgW0tlbiBDb2FyXSBQUiMxMTk1Ci0KLSAgKikgQVBJOiBuZXcgZnVuY3Rpb246IGFwX2VzY2FwZV9xdW90ZXMoKS4gW0tlbiBDb2FyXSBQUiMxMTk1Ci0KLSAgKikgV0lOMzI6IFdvcmsgYXJvdW5kIG9wdGltaXNlciBidWcgdGhhdCBraWxsZWQgSVNBUEkgaW4gcmVsZWFzZQotICAgICB2ZXJzaW9ucy4gW0JlbiBMYXVyaWVdIFBSIzE1MzMKLQotICAqKSBQT1JUOiBVcGRhdGUgdGhlIE1QRSBwb3J0IFtNYXJrIEJpeGJ5LCBKaW0gSmFnaWVsc2tpXQotCi0gICopIEludGVyaW0gKHNsb3cpIGZpeCBmb3IgcC0+c3ViX3Bvb2wgY3JpdGljYWwgc2VjdGlvbnMgaW4KLSAgICAgYWxsb2MuYyAoYWZmZWN0cyB3aW4zMiBvbmx5KS4gIFtCZW4gSHlkZV0KLQotICAqKSBub24tV0lOMzIgd2FzIG1pc3NpbmcgZGVzdHJveV9tdXRleCBkZWZpbml0aW9uLiAgW0JlbiBIeWRlXQotCi0gICopIHNlbmRfZmRfbGVuZ3RoKCkgZGlkIG5vdCBjYWxjdWxhdGUgdG90YWxfYnl0ZXNfc2VudCBwcm9wZXJseS4KLSAgICAgW0JlbiBSZXNlciA8YnJlc2VyQHJlZ25vdy5jb20+XSBQUiMxMzY2Ci0KLSAgKikgVGhlIGJwdXRjKCkgbWFjcm8gd2FzIG5vdCBwcm9wZXJseSBpbnRlZ3JhdGVkIHdpdGggdGhlIGNodW5raW5nCi0gICAgIGNvZGU7IGluIG1hbnkgY2FzZXMgbW9kdWxlcyB1c2luZyBicHV0YygpIGNvdWxkIGNhdXNlIGNvbXBsZXRlbHkKLSAgICAgYm9ndXMgY2h1bmtlZCBvdXRwdXQuICAoVHlwaWNhbGx5IHRoaXMgd2lsbCBzaG93IHVwIGFzIHByb2JsZW1zCi0gICAgIHdpdGggSW50ZXJuZXQgRXhwbG9yZXIgNC4wIHJlYWRpbmcgYSBwYWdlLCBidXQgb3RoZXIgYnJvd3NlcnMKLSAgICAgaGF2aW5nIG5vIHByb2JsZW0uKSBbRGVhbiBHYXVkZXRdCi0KLSAgKikgQ3JlYXRlIExBUkdFX1dSSVRFX1RIUkVTSE9MRCBkZWZpbmUgd2hpY2ggZGV0ZXJtaW5lcyBob3cgbWFueQotICAgICBieXRlcyBoYXZlIHRvIGJlIHN1cHBsaWVkIHRvIGJ3cml0ZSgpIGJlZm9yZSBpdCB3aWxsIGNvbnNpZGVyCi0gICAgIGRvaW5nIGEgd3JpdGV2KCkgdG8gYXNzZW1ibGUgbXVsdGlwbGUgYnVmZmVycyBpbiBvbmUgc3lzdGVtCi0gICAgIGNhbGwuICBUaGlzIGlzIGNyaXRpY2FsIGZvciBtb2R1bGVzIHN1Y2ggYXMgbW9kX2luY2x1ZGUsCi0gICAgIG1vZF9hdXRvaW5kZXgsIG1vZF9waHAzIHdoaWNoIGFsbCB1c2UgYnB1dGMoKS9icHV0cygpIG9mIHNtYWxsZXIKLSAgICAgc3RyaW5ncyBpbiBzb21lIGNhc2VzLiAgVGhlIHJlc3VsdCB3b3VsZCBiZSBleHRyYSBlZmZvcnQKLSAgICAgc2V0dGluZyB1cCB3cml0ZXYoKSwgYW5kIGluIG1hbnkgY2FzZXMgZXh0cmEgZWZmb3J0IGJ1aWxkaW5nCi0gICAgIGNodW5rcy4gIFRoZSBkZWZhdWx0IGlzIDMxLCBpdCBjYW4gYmUgb3ZlcnJpZGVuIGF0IGNvbXBpbGUKLSAgICAgdGltZS4gW0RlYW4gR2F1ZGV0XQotCi0gICopIE1vdmUgdGhlIGdpZCBzd2l0Y2hpbmcgY29kZSBpbnRvIHRoZSBjaGlsZCBzbyB0aGF0IGxvZyBmaWxlcwotICAgICBhbmQgcGlkIGZpbGVzIGFyZSBvcGVuZWQgd2l0aCB0aGUgcm9vdCBnaWQuCi0gICAgIFtHcmVnb3J5IEEgTHVuZGJlcmcgPGx1bmRiZXJnQHZyLm5ldD5dCi0KLSAgKikgV0lOMzI6IENoZWNrIGZvciBiaW5hcmllcyBieSBsb29raW5nIGZvciB0aGUgZXhlY3V0YWJsZSBoZWFkZXIKLSAgICAgaW5zdGVhZCBvZiBjb3VudGluZyBjb250cm9sIGNoYXJhY3RlcnMuCi0gICAgIFtKaW0gUGF0dGVyc29uIDxKaW0uUGF0dGVyc29uQENvZ25vcy5DT00+XSBQUiMxMzQwCi0KLSAgKikgYXBfc25wcmludGYoKSBtb3ZlZCBmcm9tIG1haW4vdXRpbF9zbnByaW50Zi5jIHRvIGFwL2FwX3NucHJpbnRmLmMKLSAgICAgc28gdGhlIGZ1bmN0aW9uYWxpdHkgaXMgYXZhaWxhYmxlIHRvIGFwcGxpY2F0aW9ucyBvdGhlciB0aGFuIHRoZQotICAgICBzZXJ2ZXIgaXRzZWxmIChsaWtlIHRoZSBzcmMvc3VwcG9ydCB0b29scykuICBbS2VuIENvYXJdCi0KLSAgKikgYXBfc2xhY2soKSBtb3ZlZCBvdXQgb2YgbWFpbi91dGlsLmMgaW50byBhcC9hcF9zbGFjay5jIGFzIHBhcnQgb2YKLSAgICAgdGhlIGxpYmFwIGNvbnNvbGlkYXRpb24gd29yay4gIFtLZW4gQ29hcl0KLQotICAqKSBhcF9zbnByaW50ZigpIHdpdGggYSBsZW4gb2YgMCBiZWhhdmVkIGxpa2Ugc3ByaW50ZigpLiAgVGhpcyBpcyBub3QKLSAgICAgdXNlZnVsLCBhbmQgaXNuJ3Qgd2hhdCB0aGUgc3RhbmRhcmRzIHJlcXVpcmUuICBOb3cgaXQgcmV0dXJucyAwCi0gICAgIGFuZCB3cml0ZXMgbm90aGluZy4gIFtEZWFuIEdhdWRldF0KLQotICAqKSBXaGVuIGFuIGVycm9yIG9jY3VycyBpbiBmY250bCgpIGxvY2tpbmcgc3VnZ2VzdCB0aGUgdXNlciBsb29rIHVwCi0gICAgIHRoZSBkb2NzIGZvciBMb2NrRmlsZS4gIFtEZWFuIEdhdWRldF0KLQotICAqKSBFbGltaW5hdGUgc29tZSBkZWFkIGNvZGUgZnJvbSB3cml0ZXZfaXRfYWxsKCkuCi0gICAgIFtJZ29yIFRhdGFyaW5vdiA8dGF0YXJpbm9AcHJhaXJpZS5Ob0Rhay5lZHU+XQotCi0gICopIG1vZF9hdXRvaW5kZXggaGFkIGFuIGZyZWFkKCkgd2l0aG91dCBjaGVja2luZyB0aGUgcmVzdWx0IGNvZGUuCi0gICAgIEl0IGFsc28gd291bGRuJ3QgaGFuZGxlICJBZGRJY29uQnlUeXBlIChUWFQsL2ljb25zL3RleHQuZ2lmIHRleHQvKiIKLSAgICAgKG5vdGUgdGhlIG1pc3NpbmcgY2xvc2luZyBwYXJlbikgcHJvcGVybHkuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgSXQgYXBwZWFycyB0aGUgIjI1N3RoIGJ5dGUiIGJ1ZyAoc2VlCi0gICAgIGh0ZG9jcy9tYW51YWwvbWlzYy9rbm93bl9jbGllbnRfcHJvYmxlbXMuaHRtbCMyNTd0aC1ieXRlKSBjYW4gaGFwcGVuCi0gICAgIGF0IHRoZSAyNTZ0aCBieXRlIGFzIHdlbGwuICBGaXhlZC4gIFtEZWFuIEdhdWRldF0KLQotICAqKSBQT1JUOiBGaXggbW9kX21pbWVfbWFnaWMgdW5kZXIgT1MvMiwgbm8gc3VwcG9ydCBmb3IgYmxvY2sgZGV2aWNlcy4KLSAgICAgW0JyaWFuIEhhdmFyZF0KLQotICAqKSBGaXggbWVtb3J5IGNvcnJ1cHRpb24gY2F1c2VkIGJ5IGFsbG9jYXRpbmcgYXV0aCB1c2VybmFtZXMgaW4gdGhlCi0gICAgIHdyb25nIHBvb2wuICBbRGVhbiBHYXVkZXRdIFBSIzE1MDAKLQotICAqKSBGaXggYW4gb2ZmLWJ5LTEsIGFuZCBhbiB1bnRlcm1pbmF0ZWQgc3RyaW5nIGVycm9yIGluCi0gICAgIG1vZF9taW1lX21hZ2ljLiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIEZpeCBhIHBvdGVudGlhbCBTRUdWIHByb2JsZW0gaW4gbW9kX25lZ290aWF0aW9uIHdoZW4gZGVhbGluZwotICAgICB3aXRoIHR5cGUtbWFwcy4gIFtEZWFuIEdhdWRldF0KLQotICAqKSBCZXR0ZXIgZ2xpYmMgc3VwcG9ydCB1bmRlciBMaW51eC4gIFtEZWFuIEdhdWRldF0gUFIjMTU0MgotCi0gICopICJSZWRpcmVjdE1hdGNoIGdvbmUgLyIgd291bGQgY2F1c2UgYSBTSUdTRUdWLiBbRGVhbiBHYXVkZXRdIFBSIzEzMTkKLQotICAqKSBXSU4zMjogYXZvaWQgb3ZlcmZsb3dzIGR1cmluZyBmaWxlIGNhbm9uaWNhbGlzYXRpb25zLgotICAgICBbbWFsY29sbUBtZ2Rldi5kZW1vbi5jby51a10gUFIjMTM3OAotCi0gICopIFdJTjMyOiBzZXRfZmlsZV9zbG90KCkgZGlkbid0IGRldGVjdCBhYnNvbHV0ZSBwYXRocy4gW0JlbiBMYXVyaWVdCi0gICAgIFBSIzE1MTEsIDE1MDgKLQotICAqKSBXSU4zMjogbW9kX3N0YXR1cyBkaXNwbGF5IGhlYWRlciBkaWRuJ3QgbWF0Y2ggZmllbGRzLiBbQmVuIExhdXJpZV0KLQotICAqKSBUaGUgcHRocmVhZF9tdXRleF8qIGZ1bmN0aW9ucyByZXR1cm4gYW4gZXJyb3IgY29kZSwgYW5kIGRvbid0Ci0gICAgIHNldCBlcnJuby4gIFtJZ29yIFRhdGFyaW5vdiA8dGF0YXJpbm9AcHJhaXJpZS5Ob0Rhay5lZHU+XQotCi0gICopIFdJTjMyOiBBbGxvdyBzcGFjZXMgdG8gcHJlZml4IHRoZSBpbnRlcnByZXRlciBpbiAjISBsaW5lcy4KLSAgICAgW0JlbiBMYXVyaWVdIFBSIzExMDEKLQotICAqKSBXSU4zMjogQ3VyZSBmaWxlIGxlYWsgaW4gQ0dJcy4gW1BldGVyIFRpbGxlbWFucyA8cHRpQG5ldDRhbGwuYmU+XSBQUiMxNTIzCi0KLSAgKikgcHJveHlfZnRwOiB0aGUgZGlyZWN0b3J5IGxpc3RpbmdzIGdlbmVyYXRlZCBieSB0aGUgcHJveHkgZnRwIG1vZHVsZQotICAgICBub3cgaGF2ZSBhIHRpdGxlIGluIHdoaWNoIHRoZSBwYXRoIGNvbXBvbmVudHMgYXJlIGNsaWNrYWJsZSBhbmQgYWxsb3cKLSAgICAgcXVpY2sgbmF2aWdhdGlvbiB0byB0aGUgY2xpY2tlZC1vbiBkaXJlY3Rvcnkgb24gdGhlIGN1cnJlbnRseSBsaXN0ZWQKLSAgICAgZnRwIHNlcnZlci4gVGhpcyBhbHNvIGZpeGVzIGEgYnVnIHdoZXJlIHRoZSAiLi4iIGRpcmVjdG9yeSBsaW5rcyB3b3VsZAotICAgICBzb21ldGltZXMgcmVmZXIgdG8gdGhlIHdyb25nIGRpcmVjdG9yeS4gIFtNYXJ0aW4gS3JhZW1lcl0KLQotICAqKSBXSU4zMjogQWxsb2NhdGUgdGhlIGNvcnJlY3QgYW1vdW50IG9mIG1lbW9yeSBmb3IgdGhlIHNjb3JlYm9hcmQuCi0gICAgIFtCZW4gSHlkZV0gUFIjMTM4NwotCi0gICopIFdJTjMyOiBPbmx5IGxvd2VyY2FzZSB0aGUgcGFydCBvZiB0aGUgcGF0aCB0aGF0IGlzIHJlYWwuIFtCZW4gTGF1cmllXQotICAgICBQUiMxNTA1Ci0KLSAgKikgRml4IHByb2JsZW1zIHdpdGggdGltZW91dHMgaW4gaW5ldGQgbW9kZSBhbmQgLVggbW9kZS4gIFtEZWFuIEdhdWRldF0KLQotICAqKSBGaXggdGhlIHNwdXJpb3VzICIoMCl1bmtub3duIGVycm9yOiBtbWFwX2hhbmRsZXI6IG1tYXAgZmFpbGVkIgotICAgICBlcnJvciBtZXNzYWdlcy4gW0JlbiBIeWRlXQotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDEuM2IzCi0KLSAgKikgV0lOMzI6IFdvcmsgYXJvdW5kIGJyYWluLWRhbWFnZWQgc3Bhd24gY2FsbHMgdGhhdCBjYW4ndCBkZWFsCi0gICAgIHdpdGggc3BhY2VzIGFuZCBzbGFzaGVzLiAgW0JlbiBMYXVyaWVdCi0KLSAgKikgV0lOMzI6IEZpeCB0aGUgY29kZSBzbyBDR0lzIGNhbiB1c2Ugc29ja2V0IGNhbGxzIG9uIFdpbmRvd3MuICAKLSAgICAgVGhlIHByb2JsZW0gd2FzIHRoYXQgY2VydGFpbiB1bmRvY3VtZW50ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzCi0gICAgIG5lZWRlZCBmb3Igc29ja2V0cyB0byB3b3JrIHVuZGVyIFdpbjMyIHdlcmUgbm90IGJlaW5nIHBhc3NlZC4KLSAgICAgW0ZyYW5rIEZhdWJlcnQgPGZyYW5rQHNhbmUuY29tPl0KLQotICAqKSBBZGQgYSAiLVYiIGNvbW1hbmQgbGluZSBmbGFnIHRvIHRoZSBodHRwZCBiaW5hcnkuICBUaGlzIAotICAgICBmbGFnIHNob3dzIHNvbWUgb2YgdGhlIGRlZmluZXMgdGhhdCBBcGFjaGUgd2FzIGNvbXBpbGVkIHdpdGguCi0gICAgIEl0IGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiAgW01hcnRpbiBLcmFlbWVyXQotCi0gICopIFN0YXJ0IHNlcGFyYXRpbmcgdGhlIGFwXyooKSByb3V0aW5lcyBpbnRvIHRoZWlyIG93biBsaWJyYXJ5LCBzbyB0aGV5Ci0gICAgIGNhbiBiZSB1c2VkIGJ5IGl0ZW1zIGluIHNyYy9zdXBwb3J0IGFtb25nIG90aGVyIHRoaW5ncy4gIAotICAgICBbS2VuIENvYXJdIFBSIzUxMiwgOTA1LCAxMjUyLCAxMzA4IAotCi0gICopIEdpdmUgYSBtb3JlIGluZm9ybWF0aXZlIGVycm9yIHdoZW4gbm8gQXV0aFR5cGUgaXMgc2V0LgotICAgICBbTGFycyBFaWxlYnJlY2h0XQotCi0gICopIFJlbW92ZSBzdHJ0b3VsKCkgdXNlIGZyb20gbW9kX3Byb3h5IGJlY2F1c2UgaXQgaXNuJ3QgYXZhaWxhYmxlCi0gICAgIG9uIGFsbCBwbGF0Zm9ybXMuICAgW01hcmMgU2xlbWtvXSBQUiMxMjE0Ci0KLSAgKikgV0lOMzI6IFNvbWUgV2luMzIgc3lzdGVtcyB0ZXJtaW5hdGVkIGFsbCByZXNwb25zZXMgYWZ0ZXIgMTYga0IuIAotICAgICBUaGlzIHR1cm5zIG91dCB0byBiZSBhIGJ1ZyBpbiBXaW5zb2NrIC0gc2VsZWN0KCkgZG9lc24ndCBhbHdheXMgCi0gICAgIHJldHVybiB0aGUgY29ycmVjdCBzdGF0dXMuICBbQmVuIExhdXJpZV0KLQotICAqKSBEaXJlY3RpdmVzIG93bmVkIGJ5IGh0dHBfY29yZSBjYW4gbm93IHVzZSB0aGUgbmV3IGNoZWNrX2NtZF9jb250ZXh0KCkKLSAgICAgcm91dGluZSB0byBlbnN1cmUgdGhhdCB0aGV5J3JlIG5vdCBiZWluZyB1c2VkIHdpdGhpbiBhIGNvbnRhaW5lcgotICAgICAoZS5nLiwgPERpcmVjdG9yeT4pIHdoZXJlIHRoZXkncmUgaW52YWxpZC4gIFtNYXJ0aW4gS3JhZW1lcl0KLQotICAqKSBQT1JUOiBSZWNlbnQgY2hhbmdlcyBtYWRlIGl0IG5lY2Vzc2FyeSB0byBhZGQgZXhwbGljaXQgcHJvdG90eXBlCi0gICAgIGZvciBmZ2V0YygpIGFuZCBmZ2V0cygpIG9uIFN1bk9TIDQueC4gIFtNYXJ0aW4gS3JhZW1lciwgQmVuIEh5ZGVdCi0KLSAgKikgSXQgd2FzIG5lY2Vzc2FyeSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHJlc291cmNlcyB3aGljaCBhcmUKLSAgICAgYWxsb2NhdGVkIGluIHRoZSBwYXJlbnQsIGZvciBjbGVhbnVwIGluIHRoZSBwYXJlbnQsIGFuZCByZXNvdXJjZXMKLSAgICAgd2hpY2ggYXJlIGFsbG9jYXRlZCBpbiBlYWNoIGNoaWxkLCBmb3IgY2xlYW51cCBpbiBlYWNoIGNoaWxkLgotICAgICBBIG5ldyBwb29sIHdhcyBjcmVhdGVkIHdoaWNoIGlzIHBhc3NlZCB0byB0aGUgbW9kdWxlIGNoaWxkX2luaXQKLSAgICAgYW5kIGNoaWxkX2V4aXQgZnVuY3Rpb25zOyBtb2R1bGVzIGFyZSBmcmVlIHRvIHJlZ2lzdGVyIHBlci1jaGlsZAotICAgICBjbGVhbnVwcyB0aGVyZS4gIFRoaXMgZml4ZXMgYSBidWcgd2l0aCByZWxpYWJsZSBwaXBlZCBsb2dzLgotICAgICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgbW9kX2F1dG9pbmRleCB3YXNuJ3QgZGlzcGxheWluZyB0aGUgUmVhZG1lTmFtZSBmaWxlIGF0IHRoZSBib3R0b20KLSAgICAgdW5sZXNzIGl0IHdhcyBhbHNvIGRvaW5nIEZhbmN5SW5kZXhlcywgYnV0IGl0IGRpc3BsYXllZCB0aGUKLSAgICAgSGVhZGVyTmFtZSBmaWxlIGF0IHRoZSB0b3AgdW5kZXIgYWxsIGNpcmN1bXN0YW5jZXMuICBJdCBub3cgc2hvd3MKLSAgICAgdGhlIFJlYWRtZU5hbWUgZmlsZSBmb3Igc2ltcGxlIGluZGljZXMsIHRvbywgYXMgaXQgc2hvdWxkLiAgCi0gICAgIFtLZW4gQ29hcl0gUFIjMTM3MwotCi0gICopIGh0dHBfY29yZSB3YXMgbW1hcCgpaW5nIGV2ZW4gaW4gY2FzZXMgd2hlcmUgaXQgd2Fzbid0IGdvaW5nIHRvCi0gICAgIHJlYWQgdGhlIGZpbGUuICBbQmVuIEh5ZGUgPGJoeWRlQGdlbnN5bS5jb20+XQotCi0gICopIENvbXBsZXRlIHJld3JpdGUgOy0pIG9mIG1vZF9yZXdyaXRlJ3MgVVJMIHJld3JpdGluZyBlbmdpbmU6Ci0gICAgIE5vdyB0aGUgcmV3cml0aW5nIGVuZ2luZSAodGhlIGhlYXJ0IG9mIG1vZF9yZXdyaXRlKSBpcyBvcmdhbml6ZWQgbW9yZQotICAgICBzdHJhaWdodC1mb3J3YXJkLCBmaXJzdCB0aW1lIHdlbGwgZG9jdW1lbnRlZCBhbmQgcmVkdWNlZCB0byB0aGUgcmVhbGx5Ci0gICAgIGVzc2VudGlhbCBwYXJ0cy4gQWxsIHJlZHVuZGFudCBjYXNlcyB3ZXJlIHN0cmlwcGVkIG9mZiBhbmQgcHJvY2Vzc2luZyBub3cKLSAgICAgaXMgdGhlIHNhbWUgZm9yIGJvdGggcGVyLXNlcnZlciBhbmQgcGVyLWRpcmVjdG9yeSBjb250ZXh0IHdpdGggb25seSBhCi0gICAgIG1pbmltdW0gZGlmZmVyZW5jZSAodGhlIHByZWZpeCBzdHJpcHBpbmcgaW4gcGVyLWRpciBjb250ZXh0KS4gQXMgYQotICAgICBzaWRlLWVmZmVjdCBzb21lIHN1YnRsZSByZXN0cmljdGlvbnMgYW5kIHR3byByZWNlbnRseSBkaXNjb3ZlcmVkIHByb2JsZW1zCi0gICAgIGFyZSBnb25lOiBXcm9uZyBlc2NhcGluZyBvZiBRVUVSWV9TVFJJTkcgb24gcmVkaXJlY3RzIGluIHBlci1kaXJlY3RvcnkKLSAgICAgY29udGV4dCBhbmQgcmVzdHJpY3Rpb25zIG9uIHRoZSBzdWJzdGl0dXRpb24gVVJMIG9uIHJlZGlyZWN0cy4KLSAgICAgQWRkaXRpb25hbGx5IHNvbWUgbWlub3Igc291cmNlIGNsZWFudXBzIHdlcmUgZG9uZS4gCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSAKLQotICAqKSBMYXJzIEVpbGVicmVjaHQgd3JvdGUgYSB3aG9sZSBuZXcgc2V0IG9mIEFwYWNoZSBWaG9zdCBJbnRlcm5hbHMKLSAgICAgZG9jdW1lbnRhdGlvbiwgZXhhbXBsZXMsIGV4cGxhbmF0aW9ucyBhbmQgY2F2ZWF0cy4gVGhleSBsaXZlIGluIGEgbmV3Ci0gICAgIHN1YmRpcmVjdG9yeSBodGRvY3MvbWFudWFsL3Zob3N0Ly4gW0xhcnMgRWlsZWJyZWNodCA8c2Z4QHVuaXgtYWcub3JnPl0KLQotICAqKSBJZiBhcF9zbGFjayBmYWlscyB0byBhbGxvY2F0ZSBhYm92ZSB0aGUgbG93IHNsYWNrIGxpbmUgaXQncyBhIGdvb2QKLSAgICAgaW5kaWNhdGlvbiB0aGF0IGZ1cnRoZXIgcHJvYmxlbXMgd2lsbCBvY2N1cjsgaXQncyBhIGJldHRlciBpbmRpY2F0aW9uCi0gICAgIHRoYW4gbWFueSBleHRlcm5hbCBsaWJyYXJpZXMgZ2l2ZSB1cyB3aGVuIHdlIGFjdHVhbGx5IHJ1biBvdXQgb2YKLSAgICAgZGVzY3JpcHRvcnMuICBTbyByZXBvcnQgaXQgdG8gdGhlIHVzZXIgb25jZSBwZXIgcmVzdGFydC4KLSAgICAgW0RlYW4gR2F1ZGV0XSBQUiMxMTgxCi0KLSAgKikgQ2hhbmdlIG1vZF9pbmNsdWRlIGFuZCBtb2RfYXV0b2luZGV4IHRvIHVzZSBZMkstc2FmZSBkYXRlIGZvcm1hdHMKLSAgICAgYnkgZGVmYXVsdC4gIFtLZW4gQ29hcl0KLQotICAqKSBBZGQgYSAiU3VwcHJlc3NDb2x1bW5Tb3J0aW5nIiBvcHRpb24gdG8gdGhlIEluZGV4T3B0aW9ucyBsaXN0LAotICAgICB3aGljaCB3aWxsIGtlZXAgdGhlIGNvbHVtbiBoZWFkaW5nIGZyb20gYmVpbmcgbGlua3MgZm9yIHNvcnRpbmcKLSAgICAgdGhlIGRpc3BsYXkuICBbS2VuIENvYXIsIHN1Z2dlc3RlZCBieSBCcmlhbiBUaWVtYW5uIDxidG1hbkBwYWNpZmljLm5ldD5dCi0gICAgIFBSICMxMjYxCi0KLSAgKikgUE9SVDogVXBkYXRlIHRoZSBMeW54T1MgcG9ydC4gIFtNYXJpdXMgR3JvZWdlciA8bWFnQHN5c2dvLmRlPl0KLQotICAqKSBGaXggbG9naWMgZXJyb3Igd2hlbiBpc3N1aW5nIGEgbW1hcCgpIGZhaWxlZCBtZXNzYWdlCi0gICAgIHdpdGggYSBub24temVybyBNTUFQX1RIUkVTSE9MRC4KLSAgICAgW0RhdmlkIENoYW1iZXJzIDxkYXZpZGNAZmxvc3VuLnNhbGsuZWR1Pl0gUFIjMTI5NAotCi0gICopIFByZXNlcnZlIGhhbmRsZXIgdmFsdWUgb24gUHJveHlQYXNzJ2VkIHJlcXVlc3RzIGJ5IG5vdAotICAgICBjYWxsaW5nIGZpbmRfdHlwZXMgb24gYSBwcm94eSdkIHJlcXVlc3Q7IGZpeGVzIHByb2JsZW1zCi0gICAgIHdoZXJlIHNvbWUgUHJveHlQYXNzJ2VkIFVSTHMgd2VyZW4ndCBhY3R1YWxseSBwYXNzZWQKLSAgICAgdG8gdGhlIHByb3h5LgotICAgICBbTGFycyBFaWxlYnJlY2h0XSBQUiM4NzAKLQotICAqKSBGaXggYSBieXRlIG9yZGVyaW5nIHByb2JsZW0gaW4gbW9kX2FjY2VzcyB3aGljaCBwcmV2ZW50ZWQKLSAgICAgdGhlIG9sZC1zdHlsZSBzeW50YXggKGkuZS4gImEuYi5jLiIgdG8gbWF0Y2ggYSBjbGFzcyBDKQotICAgICBmcm9tIHdvcmtpbmcgcHJvcGVybHkuIFtEZWFuIEdhdWRldF0gUFIjMTI0OCwgMTMyOCwgMTM4NAotCi0gICopIEZpeCBwcm9ibGVtIHdpdGggVVNFX0ZMT0NLX1NFUklBTElaRURfQUNDRVBUIG5vdCB3b3JraW5nCi0gICAgIHByb3Blcmx5LiBFYWNoIGNoaWxkIG5lZWRzIHRvIG9wZW4gdGhlIGxvY2tmaWxlIGluc3RlYWQKLSAgICAgb2YgdXNpbmcgdGhlIHBhc3NlZCBmaWxlLWRlc2NyaXB0b3IgZnJvbSB0aGUgcGFyZW50LiAKLSAgICAgW0ppbSBKYWdpZWxza2ldIFBSIzEwNTYKLQotICAqKSBGaXggdGhlIGVycm9yIGxvZ2dpbmcgaW4gbW9kX2NnaTsgdGhlIHJlY2VudCBlcnJvciBsb2cgY2hhbmdlcwotICAgICBpbnRyb2R1Y2VkIGEgYnVnIHRoYXQgcHJldmVudGVkIGl0IGZyb20gd29ya2luZyBjb3JyZWN0bHkuCi0gICAgIFtNLkQuUGFya2VyXSBQUiMxMzUyCi0KLSAgKikgRGVmYXVsdCB0byBVU0VfRkNOVExfU0VSSUFMSVpFRF9BQ0NFUFQgb24gSFBVWCB0byBwcm9wZXJseSAKLSAgICAgaGFuZGxlIG11bHRpcGxlIExpc3RlbiBkaXJlY3RpdmVzLiAgW01hcmMgU2xlbWtvXSBQUiM4NzIKLQotICAqKSBJbmhlcml0IGEgYnVnZml4IHRvIGZubWF0Y2guYyBmcm9tIEZyZWVCU0Qgc291cmNlcy4KLSAgICAgWyJbS09JOC1SXSDhzsTSxcog/sXSzs/XIiA8YWNoZUBuYWd1YWwucHAucnU+XSBQUiMxMzExCi0KLSAgKikgV2hlbiBhIGNvbmZpZ3VyYXRpb24gcGFyc2UgY29tcGxhaW5lZCBhYm91dCBhIGJhZCBkaXJlY3RpdmUsCi0gICAgIHRoZSBsb2dnZXIgd291bGQgdXNlIHdoYXRldmVyICh1bnJlbGF0ZWQpIHZhbHVlIHdhcyBpbiBlcnJuby4KLSAgICAgZXJybm8gaXMgbm93IGZvcmNlZCB0byBFSU5WQUwgZmlyc3QgaW4gdGhpcyBjYXNlLiAgW0tlbiBDb2FyXQotCi0gICopIEEgc2VkIGNvbW1hbmQgaW4gdGhlIENvbmZpZ3VyZSBzY3JpcHQgcHVzaGVkIHRoZSBlZGdlIG9mIFBPU0lYbmVzcywKLSAgICAgYnJlYWtpbmcgb24gc29tZSBzeXN0ZW1zLiAgW0JoYWJhIFIuTWlzcmEgPHN5c3RlbUB2dC5lZHU+XSBQUiMxMzY4Ci0KLSAgKikgU29sYXJpcyA+PSAyLjUgd2FzIHRvdGFsbHkgYnJva2VuIGR1ZSB0byBhIG1lc3MgdXAgdXNpbmcgcHRocmVhZAotICAgICBtdXRleGVzLiAgW1JveSBGaWVsZGluZywgRGVhbiBHYXVkZXRdCi0KLSAgKikgT1MvMiBQb3J0IHVwZGF0ZWQ7IGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBidWlsZCBPUy8yIGZyb20gdGhlIHNhbWUKLSAgICAgc291cmNlcyBhcyBVbml4IG5vdy4gIFtCcmlhbiBIYXZhcmQgPGJyaWFuaEBraGVsZGFyLmFwYW5hLm9yZy5hdT5dCi0KLSAgKikgRml4IGEgeWVhciBmb3JtYXR0aW5nIGJ1ZyBpbiBtb2RfdXNlcnRyYWNrLgotICAgICBbUGF1bCBFZ2dlcnQgPGVnZ2VydEB0d2luc3VuLmNvbT5dIFBSIzEzNDIKLQotICAqKSBBIG1pbGQgU0lHVEVSTS9TSUdBTFJNIHJhY2UgY29uZGl0aW9uIHdhcyBlbGltaW5hdGVkLgotICAgICBbRGVhbiBHYXVkZXRdIFBSIzEyMTEKLQotICAqKSBXYXJuIHVzZXIgdGhhdCBkZWZhdWx0IHBhdGggaGFzIGNoYW5nZWQgaWYgL3Vzci9sb2NhbC9ldGMvaHR0cGQKLSAgICAgaXMgZm91bmQgb24gdGhlIHN5c3RlbS4gIFtMYXJzIEVpbGVicmVjaHRdCi0KLSAgKikgVmFyaW91cyBtb2RfbWltZV9tYWdpYyBidWcgZml4ZXMgYW5kIGNsZWFudXBzOiBVbmNvbXByZXNzaW9uCi0gICAgIHNob3VsZCB3b3JrLCBpdCBzaG91bGQgd29yayBvbiBXSU4zMiwgYW5kIGEgZmV3IHJlc291cmNlCi0gICAgIGxlYWtzIGFuZCBhYm9ydCBjb25kaXRpb25zIGFyZSBmaXhlZC4KLSAgICAgW0RlYW4gR2F1ZGV0XSBQUiMxMjA1Ci0KLSAgKikgUE9SVDogT24gQUlYIDEueCBmaWxlcyBjYW4ndCBiZSBuYW1lZCAnQCcsIGZpeCB0aGUgcHJveHkgY2FjaGUKLSAgICAgdG8gdXNlICclJyBpbnN0ZWFkIG9mICdAJyBpbiBpdHMgZW5jb2RpbmdzLgotICAgICBbRGF2aWQgU2NodWxlciA8c2NodWxkQGJ0di5pYm0uY29tPl0gUFIjMTMxNwotCi0gICopIEltcHJvdmUgdGhlIHdhcm5pbmcgbWVzc2FnZSBnZW5lcmF0ZWQgd2hlbiB0aGUgInNlcnZlciBpcyBidXN5Ii4KLSAgICAgW0RlYW4gR2F1ZGV0XSBQUiMxMjkzCi0KLSAgKikgUE9SVDogQWxsIHBvcnRzIHdoaWNoIGRvbid0IG90aGVyd2lzZSBkZWZpbmUgREVGX1dBTlRIU1JFR0VYIHdpbGwKLSAgICAgZ2V0IFNwZW5jZXIgcmVnZXggYnkgZGVmYXVsdC4gIFRoaXMgaXMgdG8gYXZvaWQgaGF2aW5nIHRvCi0gICAgIGRpc2NvdmVyIGJ1Z3MgaW4gb3BlcmF0aW5nIHN5c3RlbSBsaWJyYXJpZXMuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgUE9SVDogIkZpeCIgUFIjNDY3IGJ5IGdlbmVyYXRpbmcgd2FybmluZ3Mgb24gc3lzdGVtcyB3aGljaCB3ZSBoYXZlCi0gICAgIG5vdCBiZWVuIGFibGUgdG8gZ2V0IHdvcmtpbmcgVVNFXypfU0VSSUFMSVpFRF9BQ0NFUFQgc2V0dGluZ3MgZm9yLgotICAgICBEb2N1bWVudCB0aGlzIGEgYml0IG1vcmUgaW4gc3JjL1BPUlRJTkcuICBbRGVhbiBHYXVkZXRdIFBSIzQ2NwotCi0gICopIEVuc3VyZSB0aGF0IG9uZSBjb3B5IG9mIGNvbmZpZyB3YXJuaW5ncyBtYWtlcyBpdCB0byB0aGUKLSAgICAgZXJyb3JfbG9nLiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIEludmVudCBuZXcgc3RydWN0dXJlIGFuZCBhc3NvY2lhdGVkIG1ldGhvZHMgdG8gaGFuZGxlIGNvbmZpZyBmaWxlCi0gICAgIHJlYWRpbmcuIEFkZCAiY3VzdG9tIiBob29rIHRvIHVzZSBjb25maWcgZmlsZSBjZmdfZ2V0bGluZSgpIG9uCi0gICAgIHNvbWV0aGluZyB3aGljaCBpcyBub3QgYSBGSUxFKiAgW01hcnRpbiBLcmFlbWVyXQotCi0gICopIE1ha2Ugc2luZ2xlLWV4ZSBXaW5kb3dzIGluc3RhbGwuIFtCZW4gTGF1cmllIGFuZCBFcmljIEVzc2VsaW5rXQotCi0gICopIFdJTjMyOiBNYWtlIENHSSB3b3JrIHVuZGVyIFdpbjk1LiBbQmVuIExhdXJpZSBhbmQgUGF1bCBTdXR0b25dCi0KLSAgKikgV0lOMzI6IE1ha2UgaW5kZXguaHRtbCBhbmQgZnJpZW5kcyB3b3JrIHVuZGVyIFdpbjk1LiBbQmVuIExhdXJpZV0KLQotICAqKSBQT1JUOiBTb2xhcmlzIDIuNCBuZWVkcyBTcGVuY2VyIHJlZ2V4LCB0aGUgc3lzdGVtIHJlZ2V4IGlzIGJyb2tlbi4KLSAgICAgW0pvaG4gTGluZSA8am1sNEBjYW0uYWMudWs+XSBQUiMxMzIxCi0KLSAgKikgRGVmYXVsdCBwYXRobmFtZSBoYXMgYmVlbiBjaGFuZ2VkIGV2ZXJ5d2hlcmUgdG8gL3Vzci9sb2NhbC9hcGFjaGUKLSAgICAgW1NhbWVlciA8c2FtZWVyQGMyLm5ldD5dCi0KLSAgKikgUE9SVDogQUlYIG5vdyB1c2VzIFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVC4KLSAgICAgW0RhdmlkIEJyb25kZXIgPERhdmlkLUJyb25kZXJAdWlvd2EuZWR1Pl0gUFIjODQ5Ci0KLSAgKikgUE9SVDogaTM4NiBBSVggZG9lcyBub3QgaGF2ZSBtZW1tb3ZlLgotICAgICBbRGF2aWQgU2NodWxlciA8c2NodWxkQGJ0di5pYm0uY29tPl0gUFIjMTI2NwotCi0gICopIFBPUlQ6IEhQVVggbm93IGRlZmF1bHRzIHRvIHVzaW5nIFNwZW5jZXIgcmVnZXguCi0gICAgIFtQaGlsaXBwZSBWYW5oYWVzZW5kb25jayA8cHZhbmhhZXNAYmUub3JhY2xlLmNvbT4sCi0gICAgIE9tYXIgRGVsIFJpbyA8YWwxMTIyNjNAYWNhZGVtMDEubGFnLml0ZXNtLm14Pl0gUFIjNDgyLCAxMjQ2Ci0KLSAgKikgUE9SVDogU29tZSB2ZXJzaW9ucyBvZiBOZXRCU0QgZG9uJ3QgYXV0b21hdGljYWxseSBkZWZpbmUKLSAgICAgX19OZXRCU0RfXy4gIFdvcmthcm91bmQgYnkgZGVmaW5pbmcgTkVUQlNELgotICAgICBbQ2hyaXMgQ3JhZnQgPGNjcmFmdEBjbmNjLmNjLmNvLnVzPl0gUFIjOTc3Ci0KLSAgKikgUE9SVDogVW5peFdhcmUgMi54IHJlcXVpcmVzIC1sZ2VuIGZvciBzeXNsb2cuCi0gICAgIFtIYW5zIFNuaWpkZXIgPGhzQG1lZ2FuZXQubmw+XSBQUiMxMjQ5Ci0KLSAgKikgUE9SVDogVUxUUklYIGFwcGVhcnMgdG8gbm90IGhhdmUgc3lzbG9nLgotICAgICBbTGFycyBFaWxlYnJlY2h0IDxMYXJzLkVpbGVicmVjaHRAdW5peC1hZy5vcmc+XQotCi0gICopIFBPUlQ6IEJhc2ljIEdlbWluaSBwb3J0ICh0cmVhdCBpdCBsaWtlIHVuaXh3YXJlMjEyKS4KLSAgICAgWyJQYXZlbCBZYWtvdmxldiAoUGF1bCBNY0hhY2tlcikiIDxoYWNAdG9tY2F0Lm9sbHkucnU+XQotCi0gICopIFBPUlQ6IEFsbCBTVlI0IHN5c3RlbXMgbm93IHVzZSBORVRfU0laRV9UID0gc2l6ZV90LCBhbmQKLSAgICAgdXNlIFVTRV9TSE1HRVRfU0NPUkVCT0FSRC4KLSAgICAgW01hcnRpbiBLcmFlbWVyXQotCi0gICopIFZhcmlvdXMgaW1wcm92ZW1lbnRzIGluIGRldGVjdGluZyBjb25maWcgZmlsZSBlcnJvcnMgKG1pc3NpbmcgY2xvc2luZwotICAgICBkaXJlY3RpdmVzIGZvciA8RGlyZWN0b3J5PiwgPEZpbGVzPiBldGMuIGJsb2NrcywgcHJvaGliaXRpbmcgZ2xvYmFsCi0gICAgIHNlcnZlciBzZXR0aW5ncyBpbiA8VmlydHVhbEhvc3Q+IGJsb2NrcywgZmxhZ2dpbmcgdW5oYW5kbGVkIG11bHRpcGxlCi0gICAgIGFyZ3VtZW50cyB0byA8RGlyZWN0b3J5PiwgPEZpbGVzPiBldGMuKQotICAgICBbTWFydGluIEtyYWVtZXJdCi0KLSAgKikgQWRkIHN1cHBvcnQgdG8gc3VleGVjIHdyYXBwZXIgcHJvZ3JhbSBmb3IgbW9kX3VuaXF1ZV9pZCdzIFVOSVFVRV9JRAotICAgICB2YXJpYWJsZSB0byBwcm92aWRlIHRoaXMgb25lIHRvIHN1ZXhlYydkIENHSXMsIHRvby4KLSAgICAgW00uRC5QYXJrZXIgPG1kcGNAbmV0Y29tLmNvbT5dIFBSIzEyODQKLQotICAqKSBOZXcgc3VwcG9ydCB0b29sOiBzcmMvc3VwcG9ydC9zcGxpdC1sb2dmaWxlLCBhIHNhbXBsZSBQZXJsIHNjcmlwdCB3aGljaAotICAgICBzcGxpdHMgdXAgYSBjb21iaW5lZCBhY2Nlc3MgbG9nIGludG8gc2VwYXJhdGUgZmlsZXMgYmFzZWQgb24gdGhlCi0gICAgIG5hbWUgb2YgdGhlIHZpcnR1YWwgaG9zdCAobGlzdGVkIGZpcnN0IGluIHRoZSBsb2cgcmVjb3JkcyBieSAiJXYiKS4KLSAgICAgW0tlbiBDb2FyXQotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDEuM2IyICh0aGVyZSBpcyBubyAxLjNiMSkKLQotICAqKSBUZXN0Q29tcGlsZSB3YXMgbm90IHBhc3NpbmcgJExJQlMgW0RlYW4gR2F1ZGV0XQotCi0gICopIE1ha2VmaWxlLnRtcGwgd2FzIG5vdCB1c2luZyAkQ0ZMQUdTIGluIHRoZSBsaW5rIHBoYXNlLiAKLSAgICAgW01hcnRpbiBLcmFlbWVyXQotCi0gICopIEFkZCBkZWJ1Z2dpbmcgY29kZSB0byBhbGxvYy5jLiAgRGVmaW5pbmcgQUxMT0NfREVCVUcgcHJvdmlkZXMgYQotICAgICBydWRpbWVudGFyeSBtZW1vcnkgZGVidWdnZXIgd2hpY2ggY2FuIGJlIHVzZWQgb24gbGl2ZSBzZXJ2ZXJzIHdpdGgKLSAgICAgbG93IGltcGFjdCAtLSBpdCBzZXRzIGFsbCBhbGxvY2F0ZWQgYW5kIGZyZWVkIG1lbW9yeSBieXRlcyB0byAweGE1LgotICAgICBEZWZpbmluZyBBTExPQ19VU0VfTUFMTE9DIHdpbGwgY2F1c2UgdGhlIGFsbG9jIGNvZGUgdG8gdXNlIG1hbGxvYygpCi0gICAgIGFuZCBmcmVlKCkgZm9yIGVhY2ggb2JqZWN0LiAgVGhpcyBpcyBmYXIgbW9yZSBleHBlbnNpdmUgYW5kIHNob3VsZAotICAgICBvbmx5IGJlIHVzZWQgZm9yIHRlc3Rpbmcgd2l0aCB0b29scyBzdWNoIGFzIEVsZWN0cmljIEZlbmNlIGFuZAotICAgICBQdXJpZnkuICBTZWUgbWFpbi9hbGxvYy5jIGZvciBtb3JlIGRldGFpbHMuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgQ29uZmlndXJlIHVzZXMgYSBzaCB0cmFwIGFuZCBkaWRuJ3Qgc2V0IGl0cyBleGl0Y29kZSBwcm9wZXJseS4KLSAgICAgW0RlYW4gR2F1ZGV0XSBQUiMxMTU5Ci0KLSAgKikgWWV0IGFub3RoZXIgdmhvc3QgcmV2YW1wLiAgQWRkIHRoZSBOYW1lVmlydHVhbEhvc3QgZGlyZWN0aXZlIHdoaWNoCi0gICAgIGV4cGxpY2l0bHkgbGlzdHMgdGhlIGlwOnBvcnQgcGFpcnMgdGhhdCBhcmUgdG8gYmUgdXNlZCBmb3IgbmFtZS12aG9zdHMuCi0gICAgIEZyb20gYSBnaXZlbiBpcDpwb3J0LCByZWdhcmRsZXNzIHdoYXQgdGhlIEhvc3Q6IGhlYWRlciBpcywgeW91IGNhbgotICAgICBvbmx5IHJlYWNoIHRoZSB2aG9zdHMgZGVmaW5lZCBvbiB0aGF0IGlwOnBvcnQuICBUaGUgcHJlY2VkZW5jZSBvZgotICAgICB2aG9zdHMgd2FzIHJldmVyc2VkIHRvIG1hdGNoIG90aGVyIHByZWNlZGVuY2VzIGluIHRoZSBjb25maWcgLS0KLSAgICAgdGhlIGVhcmxpZXIgdmhvc3RzIG92ZXJyaWRlIHRoZSBsYXRlciB2aG9zdHMuICBBbGwgdmhvc3QgbWF0Y2hpbmcgd2FzCi0gICAgIG1vdmVkIGludG8gaHR0cF92aG9zdC5bY2hdLiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIGFwX2lubGluZSBjYW4gYmUgdXNlZCB0byBmb3JjZSBpbmxpbmluZy4gIEdOVUMgX19hdHRyaWJ1dGVfXygpIGNhbgotICAgICBiZSB1c2VkIGZvciB3aGF0ZXZlciByZWFzb24gaXMgYXBwcm9wcmlhdGUgKGkuZS4gZm9ybWF0KCkgd2FybmluZ3MKLSAgICAgZm9yIHByaW50ZiBzdHlsZSBmdW5jdGlvbnMpLiAgQm90aCBhcmUgZW5hYmxlZCBvbmx5IHdpdGgKLSAgICAgZ2NjID49IDIuNy54IChzbyB0aGF0IHdlIGhhdmUgZmV3ZXIgc3VwcG9ydCBpc3N1ZXMgd2l0aCBvbGRlcgotICAgICB2ZXJzaW9ucykuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgRml4IHN1cHBvcnQgZm9yIFByb3h5IEF1dGhlbnRpY2F0aW9uICh3ZSB3ZXJlIHRlc3RpbmcgdGhlIHJlc3BvbnNlCi0gICAgIHN0YXR1cyB0b28gZWFybHkpLiBbTWFyYyBTbGVta29dCi0KLSAgKikgQ29yZUR1bXBEaXJlY3RvcnkgZGlyZWN0aXZlIGRpcmVjdHMgd2hlcmUgdGhlIGNvcmUgZmlsZSBpcwotICAgICB3cml0dGVuIHdoZW4gYSBTSUdTRUdWLCBTSUdCVVMsIFNJR0FCT1JUIG9yIFNJR0FCUlQgYXJlCi0gICAgIHJlY2VpdmVkLiAgW01hcmMgU2xlbWtvLCBEZWFuIEdhdWRldF0KLQotICAqKSBQT1JUOiBTdXBwb3J0IGZvciBBdGFyaSBNSU5ULgotICAgICBbSmFuIFBhdWwgU2NobWlkdCA8SmFuLlAuU2NobWlkdEBtbmkuZmgtZ2llc3Nlbi5kZT5dCi0KLSAgKikgV2hlbiBib290aW5nLCBhcGFjaGUgd2lsbCBub3cgZGV0YWNoIGl0c2VsZiBmcm9tIHN0ZGluLCBzdGRvdXQsCi0gICAgIGFuZCBzdGRlcnIuICBzdGRlcnIgd2lsbCBub3QgYmUgZGV0YWNoZWQgdW50aWwgYWZ0ZXIgdGhlIGNvbmZpZwotICAgICBmaWxlcyBoYXZlIGJlZW4gcmVhZCBzbyB5b3Ugd2lsbCBiZSBhYmxlIHRvIHNlZSBpbml0aWFsIGVycm9yCi0gICAgIG1lc3NhZ2VzLiAgQWZ0ZXIgdGhhdCBhbGwgZXJyb3JzIGFyZSBsb2dnZWQgaW4gdGhlIGVycm9yX2xvZy4KLSAgICAgVGhpcyBtYWtlcyBpdCBtb3JlIGNvbnZlbmllbnQgdG8gc3RhcnQgYXBhY2hlIHZpYSByc2gsIHNzaCwKLSAgICAgb3IgY3JvbnRhYnMuICBbRGVhbiBHYXVkZXRdIFBSIzUyMwotCi0gICopIG1vZF9wcm94eSB3YXMgc2VuZGluZyBIVFRQLzEuMSByZXNwb25zZXMgdG8gZnRwIHJlcXVlc3RzIGJ5IG1pc3Rha2UuCi0gICAgIEFsc28gcmVtb3ZlZCB0aGUgYXV0by1nZW5lcmF0ZWQgbGluayB0byB3d3cuYXBhY2hlLm9yZyB0aGF0IHdhcyB0aGUKLSAgICAgc291cmNlIG9mIHNvIG1hbnkgbWlzZGlyZWN0ZWQgYnVnIHJlcG9ydHMuICBbUm95IEZpZWxkaW5nLCBNYXJjIFNsZW1rb10KLQotICAqKSBzZW5kX2ZiIHdvdWxkIG5vdCBkZXRlY3QgYWJvcnRlZCBjb25uZWN0aW9ucyBpbiBzb21lIHNpdHVhdGlvbnMuCi0gICAgIFtEZWFuIEdhdWRldF0KLQotICAqKSBtb2RfaW5jbHVkZSB3b3VsZCB1c2UgdW5pbml0aWFsaXplZCBkYXRhIHdoZW4gcGFyc2luZyBjZXJ0YWluCi0gICAgIGV4cHJlc3Npb25zIGludm9sdmluZyAmJiBhbmQgfHwuIFtCcmlhbiBTbGVzaW5za3ldIFBSIzExMzkKLQotICAqKSBtb2RfaW1hcCBzaG91bGQgb25seSBoYW5kbGUgR0VUIG1ldGhvZHMuICBbSmF5IEJsb29kd29ydGhdCi0KLSAgKikgc3VleGVjLmMgd291bGRuJ3QgYnVpbGQgd2l0aG91dCAtRExPR19FWEVDLiBbSmFzb24gQS4gRG91cl0KLQotICAqKSBtb2RfYXV0b2luZGV4IGltcHJvcGVybHkgY291bnRlZCAmZXNjYXBlczsgYXMgbW9yZSB0aGFuIG9uZQotICAgICBjaGFyYWN0ZXIgaW4gdGhlIGRlc2NyaXB0aW9uLiAgSXQgYWxzbyBpbXByb3Blcmx5IHRydW5jYXRlZAotICAgICBkZXNjcmlwdGlvbnMgdGhhdCB3ZXJlIGV4YWN0bHkgdGhlIG1heGltdW0gbGVuZ3RoLgotICAgICBbTWFydGluIEtyYWVtZXJdCi0KLSAgKikgUmVkaXJlY3RNYXRjaCB3YXMgbm90IHByb3Blcmx5IGVzY2FwaW5nIHRoZSByZXN1bHQgKFBSIzExNTUpLiAgQWxzbwotICAgICAiUmVkaXJlY3RNYXRjaCAvYWR2ZXJ0aXNlci8oLiopICQxIiBpcyBub3cgcGVybWl0dGVkLgotICAgICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgbW9kX2luY2x1ZGUgbm93IHVzZXMgc3ltYm9saWMgbmFtZXMgdG8gY2hlY2sgZm9yIHJlcXVlc3Qgc3VjY2VzcwotICAgICBhbmQgcmV0dXJuIEhUVFAgZXJyb3JzLCBhbmQgY29ycmVjdGx5IGhhbmRsZXMgYWxsIHR5cGVzIG9mCi0gICAgIHJlZGlyZWN0aW9ucyAocHJldmlvdXNseSBpdCBvbmx5IGRpZCB0ZW1wb3JhcnkgcmVkaXJlY3QgY29ycmVjdGx5KS4KLSAgICAgW0tlbiBDb2FyLCBSb3kgRmllbGRpbmddCi0KLSAgKikgbW9kX3VzZXJkaXIgd2FzIG1vZGlmeWluZyByLT5maW5mbyBpbiBjYXNlcyB3aGVyZSBpdCB3YXNuJ3Qgc2V0dGluZwotICAgICByLT5maWxlbmFtZS4gIFNpbmNlIHRob3NlIHR3byBhcmUgbWVhbnQgdG8gYmUgaW4gc3luYyB3aXRoIGVhY2ggb3RoZXIKLSAgICAgdGhpcyBpcyBhIGJ1Zy4gIFsiUGF1bCBCLiBIZW5zb24iIDxoZW5zb25AaW50cmFuZXQuY3N1cG9tb25hLmVkdT5dCi0KLSAgKikgUE9SVDogU3VwcG9ydCBVbmlzeXMgU1ZSNCwgd2hvc2UgdW5hbWUgcmV0dXJucyBtb3N0bHkgdXNlbGVzcyBkYXRhLgotICAgICBbIkthdWZtYW4sIFN0ZXZlbiBFIiA8U3RldmVuLkthdWZtYW5AdW5pc3lzLmNvbT5dCi0KLSAgKikgSW5ldGQgbW9kZSAod2hpY2ggaXMgYnVnZ3kpIHVzZXMgdGltZW91dHMgd2l0aG91dCBoYXZpbmcgc2V0dXAgdGhlCi0gICAgIGptcGJ1ZmZlci4gW0RlYW4gR2F1ZGV0XSBQUiMxMDY0Ci0KLSAgKikgV29yayBhcm91bmQgcHJvYmxlbSB1bmRlciBMaW51eCB3aGVyZSBhIGNoaWxkIHdpbGwgc3RhcnQgbG9vcGluZwotICAgICByZXBvcnRpbmcgYSBzZWxlY3QgZXJyb3Igb3ZlciBhbmQgb3Zlci4KLSAgICAgW1JpY2sgRnJhbmNodWsgPHJpY2tmQHRyYW5zcGVjdC5uZXQ+XSBQUiMxMTA3LCA5ODcsIDU4OAotCi0gICopIEZpeGVkIGVycm9yIGluIHByb3h5X3V0aWwuYyB3aGVuIGxvb3BpbmcgdGhyb3VnaCBtdWx0aXBsZSBob3N0IElQCi0gICAgIGFkZHJlc3Nlcy4gW0xhcnMgRWlsZWJyZWNodF0gUFIjOTc0Ci0KLSAgKikgSWYgQlVGRkVSRURfTE9HUyBpcyBkZWZpbmVkIHRoZW4gbW9kX2xvZ19jb25maWcgd2lsbCBkbyBhdG9taWMKLSAgICAgYnVmZmVyZWQgd3JpdGVzIC0tIHRoYXQgaXMsIGl0IHdpbGwgYnVmZmVyIHVwIHRvIFBJUEVfQlVGIChpLmUuIDRrKQotICAgICBieXRlcyBiZWZvcmUgd3JpdGluZywgYnV0IGl0IHdpbGwgbmV2ZXIgc3BsaXQgYSBsb2cgZW50cnkgYWNyb3NzIGEKLSAgICAgYnVmZmVyIGJvdW5kYXJ5LiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIEFQSTogdGhlIHNob3J0X3Njb3JlIHJlY29yZCBoYXMgYmVlbiBzcGxpdCBpbnRvIHR3byBwaWVjZXMsIG9uZSB3aGljaAotICAgICB0aGUgcGFyZW50IHdyaXRlcyBvbiwgYW5kIG9uZSB3aGljaCB0aGUgY2hpbGQgd3JpdGVzIG9uLiAgQXMgcGFydCBvZgotICAgICB0aGlzIGNoYW5nZSB0aGUgZ2V0X3Njb3JlYm9hcmRfaW5mbygpIGZ1bmN0aW9uIHdhcyByZW1vdmVkLCBhbmQKLSAgICAgc2NvcmVib2FyZF9pbWFnZSB3YXMgZXhwb3J0ZWQuICBUaGlzIGNoYW5nZSBmaXhlcyBhIHJhY2UgY29uZGl0aW9uCi0gICAgIGluIGZpbGUgYmFzZWQgc2NvcmVib2FyZCBzeXN0ZW1zLCBhbmQgc3BlZWRzIHVwIGNoYW5nZXMgaW52b2x2aW5nIHRoZQotICAgICBzY29yZWJvYXJkIGluIGVhcmxpZXIgMS4zIGRldmVsb3BtZW50LiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIEFQSTogTmV3IHJlZ2lzdGVyX290aGVyX2NoaWxkKCkgQVBJIChzZWUgaHR0cF9tYWluLmgpIHdoaWNoIGFsbG93cwotICAgICBtb2R1bGVzIHRvIHJlZ2lzdGVyIGNoaWxkcmVuIHdpdGggdGhlIHBhcmVudCBmb3IgbWFpbnRlbmFuY2UuICBJdAotICAgICBpcyBkaXNhYmxlZCBieSBkZWZpbmluZyBOT19PVEhFUl9DSElMRC4gIFtEZWFuIEdhdWRldF0KLQotICAqKSBBUEk6IE5ldyBwaXBlZF9sb2cgQVBJIChzZWUgaHR0cF9sb2cuaCkgd2hpY2ggaW1wbGVtZW50cyBwaXBlZCBsb2dzLAotICAgICBhbmQgd2lsbCB1c2UgcmVnaXN0ZXJfb3RoZXJfY2hpbGQgdG8gaW1wbGVtZW50IHJlbGlhYmxlIHBpcGVkIGxvZ3MKLSAgICAgd2hlbiBpdCBpcyBhdmFpbGFibGUuICBUaGUgcmVsaWFibGUgcGlwZWQgbG9ncyBwYXJ0IGNhbiBiZSBkaXNhYmxlZAotICAgICBieSBkZWZpbmluZyBOT19SRUxJQUJMRV9QSVBFRF9MT0dTLiAgQXQgdGhlIG1vbWVudCByZWxpYWJsZSBwaXBlZAotICAgICBsb2dzIGlzIG9ubHkgYXZhaWxhYmxlIG9uIFVuaXguIFtEZWFuIEdhdWRldF0KLQotICAqKSBBUEk6IHNldF9sYXN0X21vZGlmaWVkKCkgYnJva2VuIGludG8gc2V0X2xhc3RfbW9kaWZpZWQoKSwgc2V0X2V0YWcoKSwgYW5kCi0gICAgIG1lZXRzX2NvbmRpdGlvbnMoKS4gIFRoaXMgYWxsb3dzIGNvbmRpdGlvbmFsIEhUVFAgc2VsZWN0aW9uIHRvIGJlCi0gICAgIGhhbmRsZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBzdG9yaW5nIG9mIHRoZSBoZWFkZXIgZmllbGRzLCBhbmQgcHJvdmlkZXMKLSAgICAgdGhlIGFiaWxpdHkgZm9yIENHSXMgdG8gc2V0IHRoZWlyIG93biBFVGFncyBmb3IgY29uZGl0aW9uYWwgY2hlY2tpbmcuCi0gICAgIFtLZW4gQ29hciwgUm95IEZpZWxkaW5nXSAgUFIjODk1Ci0KLSAgKikgQ2hhbmdlcyB0byBtb2RfbG9nX2NvbmZpZyB0byBhbGxvdyBuYW1pbmcgb2YgZm9ybWF0IHN0cmluZ3MuCi0gICAgIEZvcm1hdCBuaWNrbmFtZXMgYXJlIGRlZmluZWQgd2l0aCAiTG9nRm9ybWF0IGZtdCBuaWNrbmFtZSIsIGFuZCBjYW4KLSAgICAgYmUgdXNlZCB3aXRoICJMb2dGb3JtYXQgbmlja25hbWUiIGFuZCAiQ3VzdG9tTG9nIGxvZ3RhcmdldCBuaWNrbmFtZSIuCi0gICAgIFtLZW4gQ29hcl0KLQotICAqKSBOZXcgbW9kdWxlLCAibW9kX3NwZWxpbmciLCB3aGljaCBjYW4gaGVscCBmaW5kIGZpbGVzIGV2ZW4gd2hlbiAKLSAgICAgdGhlIFVSTCBpcyBzbGlnaHRseSBtaXNzcGVsbGVkLiBbTWFydGluIEtyYWVtZXIsIEFsZXhlaSBLb3N1dF0KLQotICAqKSBBUEk6IE5ldyBmdW5jdGlvbiBjaGlsZF90ZXJtaW5hdGUoKSB0cmlnZ2VycyB0aGUgY2hpbGQgcHJvY2VzcyB0bwotICAgICBleGl0LCB3aGlsZSBhbGxvd2luZyB0aGUgY2hpbGQgZmluaXNoIHdoYXQgaXQgbmVlZHMgdG8gZm9yIHRoZQotICAgICBjdXJyZW50IHJlcXVlc3QgZmlyc3QuICAKLSAgICAgW0RvdWcgTWFjRWFjaGVybiwgQWxleGVpIEtvc3V0XQotCi0gICopIFdpbmRvd3Mgbm93IGRlZmF1bHRzIHRvIHVzaW5nIGZ1bGwgc3RhdHVzIHJlcG9ydHMgd2l0aCBtb2Rfc3RhdHVzLgotICAgICBbQWxleGVpIEtvc3V0XSBQUiAjMTA5NAotCi0gICopICpSZWFsbHkqIGRpc2FibGUgYWxsIG1vZF9yZXdyaXRlIG9wZXJhdGlvbnMgaWYgdGhlIGVuZ2luZSBpcyBvZmYuCi0gICAgIFNvbWUgdGhpbmdzIChsaWtlIFJld3JpdGVNYXBzKSB3ZXJlIGNoZWNrZWQvcGVyZm9ybWVkIGV2ZW4gaWYgdGhleQotICAgICB3ZXJlbid0IHN1cHBvc2VkIHRvIGJlLiAgW0tlbiBDb2FyXSBQUiAjOTkxCi0KLSAgKikgSW1wbGVtZW50IGEgbmV3IHRpbWVyIHNjaGVtZSB3aGljaCBlbGltaW5hdGVzIHRoZSBuZWVkIHRvIGNhbGwgYWxhcm0oKSBhbGwKLSAgICAgdGhlIHRpbWUuICBJbnN0ZWFkIGEgY291bnRlciBpbiB0aGUgc2NvcmVib2FyZCBmb3IgZWFjaCBjaGlsZCBpcyB1c2VkIHRvCi0gICAgIHNob3cgd2hlbiB0aGUgY2hpbGQgaGFzIG1hZGUgZm9yd2FyZCBwcm9ncmVzcy4gIFRoZSBwYXJlbnQgc2FtcGxlcyB0aGlzCi0gICAgIGNvdW50ZXIgZXZlcnkgc2NvcmVib2FyZCBtYWludGVuYW5jZSBjeWNsZSwgYW5kIGlzc3VlcyBTSUdBTFJNIGlmIG5vCi0gICAgIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgaW4gdGhlIHRpbWVvdXQgcGVyaW9kLiAgVGhpcyByZWR1Y2VzIHRoZSBzdGF0aWMKLSAgICAgcmVxdWVzdCBiZXN0LWNhc2Ugc3lzY2FsbCBjb3VudCB0byAyMiBmcm9tIDI5LiAgVGhpcyBzY2hlbWUgaXMgb25seQotICAgICB1c2VkIGJ5IHN5c3RlbXMgd2l0aCBtZW1vcnktYmFzZWQgc2NvcmVib2FyZHMuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgVGhlIHByb3h5IG5vdyBwcm9wZXJseSBoYW5kbGVzIENPTk5FQ1QgcmVxdWVzdHMgd2hpY2ggYXJlIHNlbnQKLSAgICAgdG8gcHJveHkgc2VydmVycyB3aGVuIHVzaW5nIFByb3h5UmVtb3RlLiAgW01hcmMgU2xlbWtvXSBQUiMxMDI0Ci0KLSAgKikgQSBzY3JpcHQgY2FsbGVkIGFwYWNoZWN0bCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgc3VwcG9ydCAKLSAgICAgZGlyZWN0b3J5LiAgVGhpcyBzY3JpcHQgYWxsb3dzIHlvdSB0byBkbyB0aGluZ3Mgc3VjaCBhcyAKLSAgICAgImFwYWNoZWN0bCBzdGFydCIgYW5kICJhcGFjaGVjdGwgcmVzdGFydCIgZnJvbSB0aGUgY29tbWFuZAotICAgICBsaW5lLiAgW01hcmMgU2xlbWtvXQotCi0gICopIE1vZHVsZXMgYW5kIGNvcmUgcm91dGluZXMgYXJlIG5vdyBwdXQgaW50byBsaWJyYXJpZXMsIHdoaWNoCi0gICAgIHNpbXBsaWZpZXMgdGhlIGxpbmsgbGluZSB0cmVtZW5kb3VzbHkgKGFtb25nIG90aGVyIGFkdmFudGFnZXMpLgotICAgICBbUGF1bCBTdXR0b25dCi0KLSAgKikgU29tZSBvZiB0aGUgTUQ1IG5hbWVzIGRlZmluZWQgaW4gQXBhY2hlIGhhdmUgYmVlbiByZW5hbWVkIHRvIGhhdmUKLSAgICAgYW4gYGFwXycgcHJlZml4IHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHJvdXRpbmVzIHN1cHBsaWVkIGJ5Ci0gICAgIGV4dGVybmFsIGxpYnJhcmllcy4gIFtLZW4gQ29hcl0KLQotICAqKSBSZW1vdmFsIG9mIG1vZF9hdXRoX21zcWwuYyBmcm9tIHRoZSBkaXN0cmlidXRpb24uIFRoZXJlIGFyZSBtYW55Ci0gICAgIG90aGVyIG9wdGlvbnMgZm9yIGRhdGFiYXNlcyB0b2RheS4gUmF0aGVyIHRoYW4gb2ZmZXIgb25lIG9wdGlvbiwKLSAgICAgb2ZmZXIgbm9uZSBhdCB0aGlzIHRpbWUuIG1vZF9hdXRoX21zcWwgYW5kIG90aGVyIFNRTCBkYXRhYmFzZQotICAgICBhdXRoZW50aWNhdGlvbiBtb2R1bGVzIGNhbiBiZSBmb3VuZCBhdCB0aGUgQXBhY2hlIE1vZHVsZSBSZWdpc3RyeS4KLSAgICAgaHR0cDovL21vZHVsZXMuYXBhY2hlLm9yZy8gSXQgd291bGQgYmUgbmljZSB0byBvZmZlciBhIGdlbmVyaWMKLSAgICAgbW9kX2F1dGhfc3FsIG9wdGlvbiBpbiB0aGUgbmVhciBmdXR1cmUuCi0KLSAgKikgUE9SVDogQmVPUyBzdXBwb3J0IGFkZGVkIFtBbGV4ZWkgS29zdXRdCi0KLSAgKikgQ29uZmlndXJlIG5vIGxvbmdlciBhY2NlcHRzIHRoZSAtbWFrZSBvcHRpb24sIHNpbmNlIGl0IGNyZWF0ZXMKLSAgICAgTWFrZWZpbGUgb24gdGhlIGZseSBiYXNlZCBvbiBNYWtlZmlsZS50bXBsIGFuZCBDb25maWd1cmF0aW9uLgotCi0gICopIEFwYWNoZSBub3cgZ3JhY2VmdWxseSBzaHV0cyBkb3duIHdoZW4gaXQgcmVjZWl2ZXMgYSBTSUdURVJNLCBpbnN0ZWFkCi0gICAgIG9mIGZvcmNpYmx5IGtpbGxpbmcgb2ZmIGFsbCBpdHMgcHJvY2Vzc2VzIGFuZCBleGl0aW5nIHdpdGhvdXQKLSAgICAgY2xlYW5pbmcgdXAuIFtBbGV4ZWkgS29zdXRdCi0KLSAgKikgQVBJOiBBIG5ldyBmaWVsZCBpbiB0aGUgcmVxdWVzdF9yZWMsIHItPm10aW1lLCBoYXMgYmVlbiBhZGRlZCB0bwotICAgICBhdm9pZCBncmF0dWl0b3VzIHBhcnNpbmcgb2YgZGF0ZSBzdHJpbmdzLiAgSXQgaXMgaW50ZW5kZWQgdG8gaG9sZAotICAgICB0aGUgbGFzdC1tb2RpZmllZCBkYXRlIG9mIHRoZSByZXNvdXJjZSAoaWYgYXBwbGljYWJsZSkuICBBbgotICAgICB1cGRhdGVfbXRpbWUoKSByb3V0aW5lIGhhcyBhbHNvIGJlZW4gYWRkZWQgdG8gYWR2YW5jZSBpdCBpZgotICAgICBhcHByb3ByaWF0ZS4gIFtSb3kgRmllbGRpbmcsIEtlbiBDb2FyXQotCi0gICopIFNFQ1VSSVRZOiBJZiBhIGh0YWNjZXNzIGZpbGUgY2FuIG5vdCBiZSByZWFkIGR1ZSB0byBiYWQgcGVybWlzc2lvbnMsCi0gICAgIGRlbnkgYWNjZXNzIHRvIHRoZSBkaXJlY3Rvcnkgd2l0aCBhIEhUVFBfRk9SQklEREVOLiAgVGhlIHByZXZpb3VzCi0gICAgIGJlaGF2aW9yIHdhcyB0byBpZ25vcmUgdGhlIGh0YWNjZXNzIGZpbGUgaWYgaXQgY291bGQgbm90IGJlIHJlYWQuCi0gICAgIFRoaXMgY2hhbmdlIG1heSBtYWtlIHNvbWUgc2V0dXBzIHdpdGggdW5yZWFkYWJsZSBodGFjY2VzcyBmaWxlcwotICAgICBzdG9wIHdvcmtpbmcuICBbTWFyYyBTbGVta29dIFBSIzgxNwotCi0gICopIEFkZCBhcGxvZ19lcnJvcigpIHByb3ZpZGluZyBhIG1lY2hhbmlzbSB0byBkZWZpbmUgbGV2ZWxzIG9mCi0gICAgIHZlcmJvc2l0eSB0byB0aGUgc2VydmVyIGVycm9yIGxvZ2dpbmcuIFRoaXMgYWRkaXRpb24gYWxzbyBwcm92aWRlcwotICAgICB0aGUgYWJpbGl0eSB0byBsb2cgZXJyb3JzIHVzaW5nIHN5c2xvZ2QuIEVycm9yIGxvZ2dpbmcgaXMgY29uZmlndXJhYmxlCi0gICAgIG9uIGEgcGVyLXNlcnZlciBiYXNpcyB1c2luZyB0aGUgTG9nTGV2ZWwgZGlyZWN0aXZlLiBDb252ZXJzaW9uCi0gICAgIG9mIGxvZ18qKCkgaW4gcHJvZ3Jlc3MuIFtSYW5keSBUZXJidXNoXQotCi0gICopIEZ1cnRoZXIgZW5oYW5jZSBhcGxvZ19lcnJvcigpIHRvIG5vdCBsb2cgZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBhbmQKLSAgICAgZXJybm8gaW5mb3JtYXRpb24gd2hlbiBpdCBpc24ndCBhcHBsaWNhYmxlLiBbS2VuIENvYXIsIERlYW4gR2F1ZGV0XQotCi0gICopIFdJTjMyOiBDYW5vbmljYWxpc2UgZmlsZW5hbWVzIHVuZGVyIFdpbjMyLiBTaG9ydCBmaWxlbmFtZXMgYXJlCi0gICAgIGNvbnZlcnRlZCB0byBsb25nIG9uZXMuIEJhY2tzbGFzaGVzIGFyZSBjb252ZXJ0ZWQgdG8gZm9yd2FyZAotICAgICBzbGFzaGVzLiBDYXNlIGlzIGNvbnZlcnRlZCB0byBsb3dlci4gUGFydHMgb2YgVVJMcyB0aGF0IGRvIG5vdAotICAgICBjb3JyZXNwb25kIHRvIGZpbGVzIGFyZSBsZWZ0IGNvbXBsZXRlbHkgYWxvbmUuIFtCZW4gTGF1cmllXQotCi0gICopIFBPUlQ6IDIgbmV3IE9TcyBhZGRlZCB0byB0aGUgbGlzdCBvZiBwb3J0czoKLSAgICAgIEVuY29yZSdzIFVNQVggVjogQXJpZWggTWFya2VsIDxhbWFya2VsQGVuY29yZS5jb20+Ci0gICAgICBBY29ybiBSSVNDaVg6IFN0ZXBoZW4gQm9ycmlsbCA8c2JvcnJpbGxAeGVtcGxhci5jby51az4KLQotICAqKSBBZGQgdGhlIHNlcnZlciB2ZXJzaW9uIChTRVJWRVJfVkVSU0lPTiBtYWNybykgdG8gdGhlICJzZXJ2ZXIKLSAgICAgY29uZmlndXJlZCBhbmQgcnVubmluZyIgZW50cnkgaW4gdGhlIGVycm9yX2xvZy4gIEFsc28gYnVpbGQgYW4KLSAgICAgb2JqZWN0IGZpbGUgYXQgbGluay10aW1lIHRoYXQgY29udGFpbnMgdGhlIGN1cnJlbnQgdGltZQotICAgICAoU0VSVkVSX0JVSUxUIGdsb2JhbCBjb25zdCBjaGFyW10pLCBhbmQgaW5jbHVkZSB0aGF0IGluIHRoZQotICAgICBtZXNzYWdlLiAgW0tlbiBDb2FyXQotCi0gICopIFNldCByLT5oZWFkZXJzX291dCB3aGVuIHNlbmRpbmcgcmVzcG9uc2VzIGZyb20gdGhlIHByb3h5LgotICAgICBUaGlzIGZpeGVzIHRoaW5ncyBzdWNoIGFzIHRoZSBsb2dnaW5nIG9mIGhlYWRlcnMgc2VudCBmcm9tCi0gICAgIHRoZSBwcm94eS4gIFtNYXJjIFNsZW1rb10gUFIjNjU5Ci0KLSAgKikgc3VwcG9ydC9odHRwZF9tb25pdG9yIGlzIG5vIGxvbmdlciBkaXN0cmlidXRlZCBiZWNhdXNlIHRoZSAKLSAgICAgc2NvcmVib2FyZCBzaG91bGQgbm90IGJlIGZpbGUgYmFzZWQgaWYgYXQgYWxsIHBvc3NpYmxlLiBVc2UKLSAgICAgbW9kX3N0YXR1cyB0byBzZWUgY3VycmVudCBzZXJ2ZXIgc25hcHNob3QuCi0KLSAgKikgKHNldF9maWxlX3Nsb3QpOiBOZXcgZnVuY3Rpb24sIGFsbG93aW5nIGF1dGggZGlyZWN0aXZlcyB0byBiZQotICAgICBpbmRlcGVuZGVudCBvZiB0aGUgc2VydmVyIHJvb3QsIHNvIHRoZSBzZXJ2ZXIgZG9jdW1lbnRzIGNhbiBiZQotICAgICBtb3ZlZCB0byBhIGRpZmZlcmVudCBkaXJlY3Rvcnkgb3IgbWFjaGluZSBtb3JlIGVhc2lseS4KLSAgICAgW0RhdmlkIEouIE1hY0tlbnppZV0KLQotICAqKSBJZiBubyBUcmFuc2ZlckxvZyBpcyBnaXZlbiBleHBsaWNpdGx5LCBkZWNsaW5lCi0gICAgIHRvIGxvZy4gIFRoaXMgc3VwcG9ydHMgY29leGlzdGVuY2Ugd2l0aCBvdGhlciBsb2dnaW5nIG1vZHVsZXMsCi0gICAgIHN1Y2ggYXMgdGhlIGN1c3RvbSBvbmUgdGhhdCBVVU5FVCB1c2VzLiBbRGF2aWQgSi4gTWFjS2VuemllXQotCi0gICopIENoZWNrIGZvciB0aXRsZXMgaW4gc2VydmVyLXBhcnNlZCBIVE1MIGZpbGVzLgotICAgICBJZ25vcmUgbGVhZGluZyBuZXdsaW5lcyBhbmQgcmV0dXJucyBpbiB0aXRsZXMuICBUaGUgb2xkIGJlaGF2aW9yCi0gICAgIG9mIHJlcGxhY2luZyBhIG5ld2xpbmUgYWZ0ZXIgPHRpdGxlPiB3aXRoIGEgc3BhY2UgY2F1c2VzIHRoZQotICAgICB0aXRsZSB0byBiZSBtaXNhbGlnbmVkIGluIHRoZSBsaXN0aW5nLiBbRGF2aWQgSi4gTWFjS2VuemllXQotCi0gICopIENoYW5nZSBtb2RfY2Vybl9tZXRhIHRvIGJlIGNvbmZpZ3VyYWJsZSBvbiBhIHBlci1kaXJlY3RvcnkgYmFzaXMuCi0gICAgIFtEYXZpZCBKLiBNYWNLZW56aWVdCi0KLSAgKikgQWRkICdJbmNsdWRlJyBkaXJlY3RpdmUgdG8gYWxsb3cgaW5jbHVzaW9uIG9mIGNvbmZpZ3VyYXRpb24KLSAgICAgZmlsZXMgd2l0aGluIGNvbmZpZ3VyYXRpb24gZmlsZXMuIFtSYW5keSBUZXJidXNoXQotCi0gICopIFByb3h5IGVycm9ycyBvbiBjb25uZWN0KCkgYXJlIGxvZ2dlZCB0byB0aGUgZXJyb3JfbG9nIChub3RoaW5nCi0gICAgIG5ldyk7IG5vdyB0aGV5IGluY2x1ZGUgdGhlIElQIGFkZHJlc3MgYW5kIHBvcnQgdGhhdCBmYWlsZWQKLSAgICAgKCp0aGF0J3MqIG5ldykuICAgW0tlbiBDb2FyLCBNYXJjIFNsZW1rb10gUFIjMzUyCi0KLSAgKikgVmFyaW91cyBhcmNoaXRlY3R1cmVzIG5vdyBkZWZpbmUgVVNFX01NQVBfRklMRVMgd2hpY2ggY2F1c2VzCi0gICAgIHRoZSBzZXJ2ZXIgdG8gdXNlIG1tYXAoKSBmb3Igc3RhdGljIGZpbGVzLiAgVGhlcmUgYXJlIHR3bwotICAgICBjb21waWxlLXRpbWUgdHVuYWJsZXMgTU1BUF9USFJFU0hPTEQgKG1pbmltdW0gbnVtYmVyIG9mIGJ5dGVzCi0gICAgIHJlcXVpcmVkIHRvIHVzZSBtbWFwKCksIGRlZmF1bHQgaXMgMCksIGFuZCBNTUFQX1NFR01FTlRfU0laRSAobWF4aW11bQotICAgICBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpbiBvbmUgY3ljbGUgZnJvbSBhIHNpbmdsZSBtbWFwKClkIG9iamVjdCwKLSAgICAgZGVmYXVsdCAzMjc2OCkuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgQVBJOiBBZGRlZCBwb3N0X3JlYWRfcmVxdWVzdCBBUEkgcGhhc2Ugd2hpY2ggaXMgcnVuIHJpZ2h0IGFmdGVyIHJlYWRpbmcKLSAgICAgdGhlIHJlcXVlc3QgZnJvbSBhIGNsaWVudCwgb3IgcmlnaHQgYWZ0ZXIgYW4gaW50ZXJuYWwgcmVkaXJlY3QuICBJdCBpcwotICAgICB1c2VmdWwgZm9yIG1vZHVsZXMgc2V0dGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCBkZXBlbmQgb25seSBvbgotICAgICB0aGUgaGVhZGVycy9jb250ZW50cyBvZiB0aGUgcmVxdWVzdC4gIEl0IGRvZXMgbm90IHJ1biBkdXJpbmcgc3VicmVxdWVzdHMKLSAgICAgYmVjYXVzZSBzdWJyZXF1ZXN0cyBpbmhlcml0IHByZXR0eSBtdWNoIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgbWFpbgotICAgICByZXF1ZXN0LiBbRGVhbiBHYXVkZXRdCi0KLSAgKikgQWRkZWQgbW9kX3VuaXF1ZV9pZCB3aGljaCBpcyB1c2VkIHRvIGdlbmVyYXRlIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yCi0gICAgIGVhY2ggaGl0LCBhdmFpbGFibGUgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFVOSVFVRV9JRC4KLSAgICAgW0RlYW4gR2F1ZGV0XQotCi0gICopIGluaXRfbW9kdWxlcyBpcyBub3cgY2FsbGVkIGFmdGVyIHRoZSBlcnJvciBsb2dzIGhhdmUgYmVlbiBvcGVuZWQuICBUaGlzCi0gICAgIGFsbG93cyBtb2R1bGVzIHRvIGVtaXQgaW5mb3JtYXRpb24gbWVzc2FnZXMgaW50byB0aGUgZXJyb3IgbG9ncy4KLSAgICAgW0RlYW4gR2F1ZGV0XQotCi0gICopIEZpeGVkIHByb3h5LXBhc3MtdGhyb3VnaCBmZWF0dXJlIG9mIG1vZF9yZXdyaXRlOyBBZGRlZCBlcnJvciBsb2dnaW5nCi0gICAgIGluZm9ybWF0aW9uIGZvciBjYXNlIHdoZXJlIHByb3h5IG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlLiBbTWFyYyBTbGVta29dCi0KLSAgKikgUE9SVDogQXBhY2hlIGhhcyBuZWVkIGZvciBtdXRleGVzIHRvIHNlcmlhbGl6ZSBpdHMgY2hpbGRyZW4gYXJvdW5kCi0gICAgIGFjY2VwdC4gIEluIHByaW9yIHZlcnNpb25zIGVpdGhlciBmY250bCBmaWxlIGxvY2tpbmcgb3IgZmxvY2sgZmlsZQotICAgICBsb2NraW5nIHdlcmUgdXNlZC4gIFRoZSBtZXRob2QgaXMgY2hvc2VuIGJ5IHRoZSBkZWZpbml0aW9uIG9mCi0gICAgIFVTRV94eHhfU0VSSUFMSVpFRF9BQ0NFUFQgaW4gY29uZi5oLiAgeHh4IGlzIEZDTlRMIGZvciBmY250bCgpLAotICAgICBhbmQgRkxPQ0sgZm9yIGZsb2NrKCkuICBOZXcgb3B0aW9ucyBoYXZlIGJlZW4gYWRkZWQ6Ci0gICAgICAgIC0gU1lTVlNFTSB0byB1c2UgU3lzdGVtIFYgc3R5bGUgc2VtYXBob3JlcwotICAgICAgICAtIFBUSFJFQUQgdG8gdXNlIFBPU0lYIHRocmVhZHMgKGFwcGVhcnMgdG8gd29yayBvbiBTb2xhcmlzIG9ubHkpCi0gICAgICAgIC0gVVNMT0NLIHRvIHVzZSBJUklYIHVzbG9jawotICAgICBCYXNlZCBvbiB0aW1pbmcgdmFyaW91cyB0ZWNobmlxdWVzLCB0aGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlCi0gICAgIHRvIHRoZSBkZWZhdWx0czoKLSAgICAgICAgLSBMaW51eCAyLnggdXNlcyBmbG9jayBpbnN0ZWFkIG9mIGZjbnRsCi0gICAgICAgIC0gU29sYXJpcyAyLnggdXNlcyBwdGhyZWFkcwotICAgICAgICAtIElSSVggdXNlcyBTeXNWIHNlbWFwaG9yZXMgLS0gaG93ZXZlciBtdWx0aXByb2Nlc3NvciBJUklYIGJveGVzCi0gICAgICAgICAgd29yayBmYXIgZmFzdGVyIGlmIHlvdSAtRFVTRV9VU0xPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQKLSAgICAgW0RlYW4gR2F1ZGV0LCBQaWVycmUtWXZlcyBLZXJlbWJlbGxlYyA8UGllcnJlLVl2ZXMuS2VyZW1iZWxsZWNAdnRjb20uZnI+LAotICAgICBNYXJ0aWpuIEtvc3RlciA8bS5rb3N0ZXJAcG9ib3guY29tPl0KLQotICAqKSBQT1JUOiBUaGUgc2VtYW50aWNzIG9mIGFjY2VwdC9zZWxlY3QgbWFrZSBpdCB2ZXJ5IGRlc2lyYWJsZSB0byB1c2UKLSAgICAgbXV0ZXhlcyB0byBzZXJpYWxpemUgYWNjZXB0IHdoZW4gbXVsdGlwbGUgTGlzdGVucyBhcmUgaW4gdXNlLiAgQnV0Ci0gICAgIGluIHRoZSBjYXNlIHdoZXJlIG9ubHkgYSBzaW5nbGUgc29ja2V0IGlzIG9wZW4gaXQgaXMgc29tZXRpbWVzCi0gICAgIHJlZHVuZGFudCB0byBzZXJpYWxpemUgYWNjZXB0KCkuICBOb3QgYWxsIHVuaXhlcyBkbyBhIGdvb2Qgam9iIHdpdGgKLSAgICAgcG90ZW50aWFsbHkgZG96ZW5zIG9mIGNoaWxkcmVuIGJsb2NrZWQgb24gYWNjZXB0KCkgb24gdGhlIHNhbWUKLSAgICAgc29ja2V0LiAgSXQncyBub3cgcG9zc2libGUgdG8gZGVmaW5lIFNJTkdMRV9MSVNURU5fVU5TRVJJQUxJWkVEX0FDQ0VQVCBhbmQKLSAgICAgdGhlIHNlcnZlciB3aWxsIGF2b2lkIHNlcmlhbGl6YXRpb24gd2hlbiBsaXN0ZW5pbmcgb24gb25seSBvbmUgc29ja2V0LAotICAgICBhbmQgdXNlIHNlcmlhbGl6YXRpb24gd2hlbiBsaXN0ZW5pbmcgb24gbXVsdGlwbGUgc29ja2V0cy4KLSAgICAgW0RlYW4gR2F1ZGV0XSBQUiM0NjcKLQotICAqKSBDb25maWd1cmUgY2hhbmdlczogVGVzdExpYiByZXBsYWNlZCBieSBUZXN0Q29tcGlsZSwgd2hpY2ggaGFzCi0gICAgIHNvbWUgYWRkaXRpb25hbCBjYXBhYmlsaXR5IChzdWNoIGFzIGRvaW5nIGEgc2FuaXR5IGNoZWNrIG9mCi0gICAgIHRoZSBjb21waWxlciBhbmQgZmxhZ3Mgc2VsZWN0ZWQpOyB0aGUgdmVyc2lvbiBvZiBTb2xhcmlzIGlzIG5vdwotICAgICBhdmFpbGFibGUgdmlhIHRoZSAjZGVmaW5lIHZhbHVlIG9mIFNPTEFSSVMyOyBJUklYIG4zMmJpdCBsaWJzCi0gICAgIG5vdyBzdXBwb3J0ZWQgYW5kIHNlbGVjdGFibGUgYnkgbmV3IENvbmZpZ3VyYXRpb24gUnVsZTogSVJJWE4zMjsKLSAgICAgV2Ugbm8gbG9uZ2VyIGRlZmF1bHQgdG8gLU8yIG9wdGltaXphdGlvbi4gIFtKaW0gSmFnaWVsc2tpXQotCi0gICopIFVwZGF0ZWQgQ29uZmlndXJlOiBDb25maWd1cmF0aW9uIG5vdyB1c2VzIEFkZE1vZHVsZSB0byBzcGVjaWZ5Ci0gICAgIG1vZHVsZSBzb3VyY2Ugb3IgYmluYXJ5IGZpbGUgbG9jYXRpb24sIHJlbGF0aXZlIHRvIHNyYyBkaXJlY3RvcnkuCi0gICAgIE1vZHVsZXMgY2FuIGJlIGRyb3BwZWQgaW50byBtb2R1bGVzL2V4dHJhLCBvciBpbiB0aGVpciBvd24gCi0gICAgIGRpcmVjdG9yeSwgYW5kIG1vZHVsZXMgY2FuIGNvbWUgd2l0aCBhIE1ha2VmaWxlIG9yIENvbmZpZ3VyZSBjYW4gCi0gICAgIGNyZWF0ZSBvbmUuICBNb2R1bGVzIGNhbiBhZGQgY29tcGlsZXIgb3IgbGlicmFyeSBpbmZvcm1hdGlvbiB0byAKLSAgICAgZ2VuZXJhdGVkIE1ha2VmaWxlcy4gW1BhdWwgU3V0dG9uXQotCi0gICopIFNvdXJjZSBjb3JlIHJlLW9yZ2FuaXNhdGlvbjogZGlzdHJpYnV0ZWQgbW9kdWxlcyBhcmUgbm93IGluIAotICAgICBtb2R1bGVzL3N0YW5kYXJkLiBBbGwgb3RoZXIgc291cmNlIGNvZGUgaXMgaW4gbWFpbi4gT1Mtc3BlY2lmaWMKLSAgICAgY29kZSBpcyBpbiBvcy97dW5peCxlbXgsd2luMzJ9IGRpcmVjdG9yaWVzLiBbUGF1bCBTdXR0b25dCi0KLSAgKikgbW9kX2Jyb3dzZXIgaGFzIGJlZW4gcmVtb3ZlZCwgc2luY2UgaXQncyByZXBsYWNlZCBieSBtb2Rfc2V0ZW52aWYuCi0gICAgIFtLZW4gQ29hcl0KLQotICAqKSBGaXggYW5vdGhlciBsb25nLXN0YW5kaW5nIGJ1ZyBpbiBzdWJfcmVxX2xvb2t1cF9maWxlIHdoZXJlIGl0IHdvdWxkCi0gICAgIGhhcHBpbHkgc2tpcCBwYXN0IGFjY2VzcyBjaGVja3Mgb24gc3ViZGlyZWN0b3JpZXMgbG9va2VkIHVwIHdpdGgKLSAgICAgcmVsYXRpdmUgcGF0aHMuICAoSXQncyB1c2VkIGJ5IG1vZF9kaXIsIG1vZF9uZWdvdGlhdGlvbiwKLSAgICAgYW5kIG1vZF9pbmNsdWRlLikgW0RlYW4gR2F1ZGV0XQotCi0gICopIGRpcmVjdG9yeV93YWxrIG9wdGltaXphdGlvbiB0byByZWR1Y2UgYW4gTyhOKk0pIGxvb3AgdG8gTyhOK00pIHdoZXJlCi0gICAgIE4gaXMgdGhlIG51bWJlciBvZiA8RGlyZWN0b3J5PiBzZWN0aW9ucywgYW5kIE0gaXMgdGhlIG51bWJlciBvZgotICAgICBjb21wb25lbnRzIGluIHRoZSBmaWxlbmFtZSBvZiBhbiBvYmplY3QuCi0KLSAgICAgVG8gYWNoaWV2ZSB0aGlzIG9wdGltaXphdGlvbiB0aGUgZm9sbG93aW5nIGNvbmZpZyBjaGFuZ2VzIHdlcmUgbWFkZToKLSAgICAgICAgLSBXaWxkY2FyZHMgKCogYW5kID8sIG5vdCB0aGUgcmVnZXggZm9ybXMpIGluIDxEaXJlY3Rvcnk+cywKLSAgICAgICAgICA8RmlsZXM+cywgYW5kIDxMb2NhdGlvbj5zIG5vdyB0cmVhdCBhIHNsYXNoIGFzIGEgc3BlY2lhbAotICAgICAgICAgIGNoYXJhY3Rlci4gIEZvciBleGFtcGxlICIvaG9tZS8qL3B1YmxpY19odG1sIiBwcmV2aW91c2x5IHdvdWxkCi0gICAgICAgICAgbWF0Y2ggIi9ob21lL2EvYW5kcmV3L3B1YmxpY19odG1sIiwgbm93IGl0IG9ubHkgbWF0Y2hlcyB0aGluZ3MKLSAgICAgICAgICBsaWtlICIvaG9tZS9ib2IvcHVibGljX2h0bWwiLiAgVGhpcyBtaW1pY3MgL2Jpbi9zaCBiZWhhdmlvdXIuCi0gICAgICAgIC0gSXQncyBwb3NzaWJsZSBub3cgdG8gdXNlIFtdIHdpbGRjYXJkaW5nIGluIDxEaXJlY3Rvcnk+LCA8RmlsZXM+Ci0gICAgICAgICAgb3IgPExvY2F0aW9uPi4KLSAgICAgICAgLSBSZWdleCA8RGlyZWN0b3J5PnMgYXJlIGFwcGxpZWQgYWZ0ZXIgYWxsIG5vbi1yZWdleCA8RGlyZWN0b3J5PnMuCi0KLSAgICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgRml4IGEgYnVnIGludHJvZHVjZWQgaW4gMS4zYTEgZGlyZWN0b3J5X3dhbGsgcmVnYXJkaW5nIC5odGFjY2VzcyBmaWxlcwotICAgICBhbmQgY29ycnVwdGVkIHBhdGhzLiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIEVuaGFuY2VkIGFuZCBjbGVhbmVkIHVwIHRoZSBVUkwgcmV3cml0aW5nIGVuZ2luZSBvZiBtb2RfcmV3cml0ZToKLSAgICAgRmlyc3QgdGhlIGdyb3VwZWQgcGFydHMgb2YgUmV3cml0ZVJ1bGUgcGF0dGVybiBtYXRjaGVzIChwYXJlbnRoZXNpcyEpIGNhbgotICAgICBiZSBhY2Nlc3NlZCBub3cgdmlhIGJhY2tyZWZlcmVuY2VzICQxLi4kOSBpbiBSZXdyaXRlQ29uZHMgdGVzdC1hZ2FpbnN0Ci0gICAgIHN0cmluZ3MgaW4gYWRkaXRpb24gdG8gUmV3cml0ZVJ1bGVzIHN1YnN0IHN0cmluZy4gU2Vjb25kIHRoZSBncm91cGVkCi0gICAgIHBhcnRzIG9mIFJld3JpdGVDb25kIHBhdHRlcm4gbWF0Y2hlcyAocGFyZW50aGVzaXMhKSBjYW4gYmUgYWNjZXNzZWQgbm93Ci0gICAgIHZpYSBiYWNrcmVmZXJlbmNlcyAlMS4uJTkgYm90aCBpbiBmb2xsb3dpbmcgUmV3cml0ZUNvbmQgdGVzdC1hZ2FpbnN0Ci0gICAgIHN0cmluZ3MgYW5kIFJld3JpdGVSdWxlcyBzdWJzdCBzdHJpbmcuIFRoaXMgcHJvdmlkZXMgbWF4aW11bSBmbGV4aWJpbGl0eQotICAgICB0aHJvdWdoIHRoZSB1c2Ugb2YgYmFja3JlZmVyZW5jZXMuCi0gICAgIEFkZGl0aW9uYWxseSB0aGUgcmV3cml0aW5nIGVuZ2luZSB3YXMgY2xlYW5lZCB1cCBieSBwdXR0aW5nIGNvbW1vbgotICAgICBjb2RlIHRvIHRoZSBuZXcgZXhwYW5kX2JhY2tyZWZzX2luYnVmZmVyKCkgZnVuY3Rpb24uIAotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBXaGVuIG1lcmdpbmcgdGhlIG1haW4gc2VydmVyJ3MgPERpcmVjdG9yeT4gYW5kIDxMb2NhdGlvbj4gc2VjdGlvbnMgaW50bwotICAgICBhIHZob3N0LCBwdXQgdGhlIG1haW4gc2VydmVyJ3MgZmlyc3QgYW5kIHRoZSB2aG9zdCdzIHNlY29uZC4gIE90aGVyd2lzZQotICAgICB0aGUgdmhvc3QgY2FuJ3Qgb3ZlcnJpZGUgdGhlIG1haW4gc2VydmVyLiAgW0RlYW4gR2F1ZGV0XSBQUiM3MTcKLQotICAqKSBUaGUgPERpcmVjdG9yeT4gY29kZSB3b3VsZCBtZXJnZSBhbmQgcmUtbWVyZ2UgdGhlIHNhbWUgc2VjdGlvbiBhZnRlcgotICAgICBhIG1hdGNoIHdhcyBmb3VuZCwgcG9zc2libHkgY2F1c2luZyBwcm9ibGVtcyB3aXRoIHNvbWUgbW9kdWxlcy4KLSAgICAgW0RlYW4gR2F1ZGV0XQotCi0gICopIGlwLWJhc2VkIHZob3N0cyBhcmUgc3RvcmVkIGFuZCBxdWVyaWVkIHVzaW5nIGEgaGFzaGluZyBmdW5jdGlvbiwgd2hpY2gKLSAgICAgaGFzIGJlZW4gc2hvd24gdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBvbiBzZXJ2ZXJzIHdpdGggbWFueSBpcC12aG9zdHMuCi0gICAgIFNvbWUgb3RoZXIgY2hhbmdlcyBoYWQgdG8gYmUgbWFkZSB0byBhY2NvbW1vZGF0ZSB0aGlzOgotICAgICAgICAtIHRoZSAqIGFkZHJlc3MgZm9yIHZob3N0cyBub3cgYmVoYXZlcyBsaWtlIF9kZWZhdWx0XwotICAgICAgICAtIHRoZSBtYXRjaGluZyBwcm9jZXNzIG5vdyBpczoKLSAgICAgICAgICAgIC0gbWF0Y2ggYW4gaXAtdmhvc3QgZGlyZWN0bHkgdmlhIGhhc2ggKHBvc3NpYmx5IG1hdGNoZXMgbWFpbgotICAgICAgICAgICAgICBzZXJ2ZXIpCi0gICAgICAgICAgICAtIGlmIHRoYXQgZmFpbHMsIGp1c3QgcHJldGVuZCBpdCBtYXRjaGVkIHRoZSBtYWluIHNlcnZlcgotICAgICAgICAgICAgLSBpZiBzbyBmYXIgb25seSB0aGUgbWFpbiBzZXJ2ZXIgaGFzIGJlZW4gbWF0Y2hlZCwgcGVyZm9ybQotICAgICAgICAgICAgICBuYW1lLWJhc2VkIGxvb2t1cHMgKFNlcnZlck5hbWUsIFNlcnZlckFsaWFzLCBTZXJ2ZXJQYXRoKQotICAgICAgICAgICAgICAqb25seSBvbiBuYW1lLWJhc2VkIHZob3N0cyoKLSAgICAgICAgICAgIC0gaWYgdGhleSBmYWlsLCBsb29rIGZvciBfZGVmYXVsdF8gdmhvc3RzCi0gICAgIFtEZWFuIEdhdWRldCwgRGF2ZSBIYW5raW5zIDxkaGFua2luc0BzdWdhcmF0Lm5ldD5dCi0KLSAgKikgZGJtbWFuYWdlIG92ZXJoYXVsOgotICAgICAtIG1lcmdlIGRibW1hbmFnZSBhbmQgZGJtbWFuYWdlLm5ldyBmdW5jdGlvbmFsaXR5LCByZW1vdmUgZGJtbWFuYWdlLm5ldyAKLSAgICAgLSB0aWUoKSB0byBBbnlEQk1fRmlsZSB3aGljaCB3aWxsIHVzZSBvbmUgb2YgREJfRmlsZSwgTkRCTV9GaWxlIG9yCi0gICAgICAgR0RCTV9GaWxlICgtbGRiLCAtbG5kYm0sIC1sZ2RibSkgKHRyeWluZyBlYWNoIGluIHRoYXQgb3JkZXIpCi0gICAgIC0gcHJvdmlkZSBiZXR0ZXIgc2VlZCBmb3IgcmFuZAotICAgICAtIHByb21wdCBmb3IgcGFzc3dvcmQgYXMgcGVyIGdldHBhc3MoMykgKHR1cm4gb2ZmIGVjaG8sIHJlYWQgZnJvbQotICAgICAgIC9kZXYvdHR5LCBldGMuKQotICAgICAtIHVzZSAibmV3c3R5bGUiIGNyeXB0IGJhc2VkIG9uICRDb25maWd7b3NuYW1lfSAoJF5PKQotICAgICAtIHdpbGwgbm90IGFkZCBhIHVzZXIgaWYgYWxyZWFkeSBpbiBkYXRhYmFzZSwgdXNlIG5ldyBgdXBkYXRlJyBjb21tYW5kCi0gICAgICAgaW5zdGVhZAotICAgICAtIGFkZGVkIGBjaGVjaycgY29tbWFuZCB0byBjaGVjayBhIHVzZXJzJyBwYXNzd29yZAotICAgICAtIGFkZGVkIGBpbXBvcnQnIGNvbW1hbmQgdG8gY29udmVydCBleGlzdGluZyBwYXNzd29yZCB0ZXh0LWZpbGVzIG9yIAotICAgICAgIGRibSBmaWxlcyBleHBvcnRlZCB3aXRoIGB2aWV3JwotICAgICAtIG1vcmUgZGVzY3JpcHRpdmUgdXNhZ2UsIGdlbmVyYWwgY2xlYW51cCwgJ3VzZSBzdHJpY3QnIGNsZWFuLCBldGMuCi0gICAgIFtEb3VnIE1hY0VhY2hlcm5dCi0KLSAgKikgQWRkZWQgcHNvY2tldCgpIHdoaWNoIGlzIGEgcG9vbCBmb3JtIG9mIHNvY2tldCgpLCB2YXJpb3VzIHBsYWNlcyB3aXRoaW4KLSAgICAgdGhlIHByb3h5IHdlcmVuJ3QgcHJvcGVybHkgYmxvY2tpbmcgYWxhcm1zIHdoaWxlIHJlZ2lzdGVyaW5nIHRoZSBjbGVhbnVwCi0gICAgIGZvciBpdHMgc29ja2V0cy4gIGJjbG9zZSgpIG5vdyB1c2VzIHBjbG9zZSgpIGFuZCBwY2xvc2Vzb2NrZXQoKS4gIFRoZXJlCi0gICAgIHdhcyBhIGJ1ZyB3aGVyZSB0aGUgY2xpZW50IHNvY2tldCB3YXMgYmVpbmcgY2xvc2UoKWQgdHdpY2UgZHVlIGEgc3RpbGwKLSAgICAgcmVnaXN0ZXJlZCBjbGVhbnVwLiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIEEgZmV3IGNsZWFudXBzIHdlcmUgbWFkZSB0byByZWR1Y2UgdGltZSgpLCBnZXRwaWQoKSwgYW5kIHNpZ25hbCgpIGNhbGxzLgotICAgICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgUE9SVDogQUlYID49IDQuMiByZXF1aXJlcyAtbG0gZHVlIHRvIGxpYmMgY2hhbmdlcy4KLSAgICAgW0phc29uIFZlbm5lciA8amFzb25AaWRpb20uY29tPl0gUFIjNjY3Ci0KLSAgKikgRW5hYmxlIGBgPSIiJycgZm9yIFJld3JpdGVDb25kIGRpcmVjdGl2ZXMgdG8gbWF0Y2ggYWdhaW5zdAotICAgICB0aGUgZW1wdHkgc3RyaW5nLiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgd2F5IGluc3RlYWQgb2YgYGBeJCcnLgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBGaXhlZCBhbiBpbmZpbml0ZSBsb29wIGluIG1vZF9pbWFwIGZvciByZWZlcmVuY2VzIGFib3ZlIHRoZSBzZXJ2ZXIgcm9vdAotICAgICBbRGVhbiBHYXVkZXRdIFBSIzc0OAotCi0gICopIG1vZF9wcm94eSBub3cgaGFzIGEgUmVjZWl2ZUJ1ZmZlclNpemUgZGlyZWN0aXZlLCBzaW1pbGFyIHRvCi0gICAgIFNlbmRCdWZmZXJTaXplLCBzbyB0aGF0IHRoZSBUQ1Agd2luZG93IGNhbiBiZSBzZXQgYXBwcm9wcmlhdGVseQotICAgICBmb3IgTEZOcy4gW1BoaWxsaXAgQS4gUHJpbmRldmlsbGVdCi0KLSAgKikgbW9kX2Jyb3dzZXIgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIG1vcmUgZ2VuZXJhbCBtb2Rfc2V0ZW52aWYKLSAgICAgKGNvdXJ0ZXN5IG9mIFBhdWwgU3V0dG9uKS4gIEJyb3dzZXJNYXRjaCogZGlyZWN0aXZlcyBhcmUgc3RpbGwKLSAgICAgYXZhaWxhYmxlLCBidXQgYXJlIG5vdyBqb2luZWQgYnkgU2V0RW52SWYqLCBVblNldEVudklmKiwgYW5kCi0gICAgIFVuU2V0RW52SWZaZXJvIGRpcmVjdGl2ZXMuICBbS2VuIENvYXJdCi0KLSAgKikgIkhvc3RuYW1lTG9va3VwcyBkb3VibGUiIGZvcmNlcyBkb3VibGUtcmV2ZXJzZSBETlMgdG8gc3VjY2VlZCBpbgotICAgICBvcmRlciBmb3IgcmVtb3RlX2hvc3QgdG8gYmUgc2V0IChmb3IgbG9nZ2luZywgb3IgZm9yIHRoZSBlbnYgdmFyCi0gICAgIFJFTU9URV9IT1NUKS4gIFRoZSBvbGQgZGVmaW5lIE1BWElNVU1fRE5TIGhhcyBiZWVuIGRlcHJlY2F0ZWQuCi0gICAgIFtEZWFuIEdhdWRldF0KLQotICAqKSBtb2RfYWNjZXNzIG92ZXJoYXVsOgotICAgICAtIE5vdyB1bmRlcnN0YW5kcyBuZXR3b3JrL25ldG1hc2sgc3ludGF4IChpLmUuICAxMC4xLjAuMC8yNTUuMjU1LjAuMCkKLSAgICAgICBhbmQgY2lkciBzeW50YXggKGkuZS4gMTAuMS4wLjAvMTYpLiAgUFIjNzYyCi0gICAgIC0gQ3JpdGljYWwgcGF0aCB3YXMgc3BlZCB1cCBieSBwcmUtY29tcHV0aW5nIGEgZmV3IHRoaW5ncyBhdCBjb25maWcgdGltZS4KLSAgICAgLSBUaGUgdW5kb2N1bWVudGVkIHN5bnRheCAiYWxsb3cgdXNlci1hZ2VudHMiIHdhcyByZW1vdmVkLAotICAgICAgIHRoZSByZXBsYWNlbWVudCBpcyAiYWxsb3cgZnJvbSBlbnY9Zm9vYmFyIiBjb21iaW5lZCB3aXRoIG1vZF9icm93c2VyLgotICAgICAtIFdoZW4gdXNlZCB3aXRoIGhvc3RuYW1lcyBpdCBub3cgZm9yY2VzIGEgZG91YmxlLXJldmVyc2UgbG9va3VwCi0gICAgICAgbm8gbWF0dGVyIHdoYXQgdGhlIGRpcmVjdG9yeSBzZXR0aW5ncyBhcmUuICBUaGlzIGRvdWJsZS1yZXZlcnNlCi0gICAgICAgZG9lc24ndCBhZmZlY3QgYW55IG9mIHRoZSBvdGhlciByb3V0aW5lcyB0aGF0IHVzZSB0aGUgcmVtb3RlCi0gICAgICAgaG9zdG5hbWUuICBJbiBwYXJ0aWN1bGFyIGl0J3Mgc3RpbGwgcGFzc2VkIHRvIENHSXMgYW5kIHRoZSBsb2cKLSAgICAgICB3aXRob3V0IHRoZSBkb3VibGUtcmV2ZXJzZSBjaGVjay4gIFJlbGF0ZWQgUFIjODYwLgotICAgICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgV2hlbiBhIGxhcmdlIGJ3cml0ZSgpIG9jY3VycyAobGFyZ2VyIHRoYW4gdGhlIGludGVybmFsIGJ1ZmZlciBzaXplKSwKLSAgICAgd2hpbGUgdGhlcmUgaXMgYWxyZWFkeSBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlciwgYXBhY2hlIHdpbGwgY29tYmluZQotICAgICB0aGUgbGFyZ2Ugd3JpdGUgYW5kIHRoZSBidWZmZXIgaW50byBhIHNpbmdsZSB3cml0ZXYoKS4gIChUaGlzIGlzCi0gICAgIGluIGFudGljaXBhdGlvbiBvZiB1c2luZyBtbWFwKCkgZm9yIHJlYWRpbmcgZmlsZXMuKQotICAgICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgSW4gb2JzY3VyZSBjYXNlcyB3aGVyZSBhIHBhcnRpYWwgc29ja2V0IHdyaXRlIG9jY3VycmVkIHdoaWxlIGNodW5raW5nLAotICAgICBBcGFjaGUgd291bGQgb21pdCB0aGUgY2h1bmsgaGVhZGVyL2Zvb3RlciBvbiB0aGUgbmV4dCBibG9jay4gIENsZWFuZWQKLSAgICAgdXAgb3RoZXIgYnVncy9pbmNvbnNpc3RlbmNpZXMgaW4gZXJyb3IgY29uZGl0aW9ucyBpbiBidWZmLmMuICBGaXhlZAotICAgICBhIGJ1ZyB3aGVyZSBhIGxvbmcgcGF1c2UgaW4gRE5TIGxvb2t1cHMgY291bGQgY2F1c2UgdGhlIGxhc3QgcGFja2V0Ci0gICAgIG9mIGEgcmVzcG9uc2UgdG8gYmUgdW5kdWx5IGRlbGF5ZWQuICBbUm95IEZpZWxkaW5nLCBEZWFuIEdhdWRldF0KLQotICAqKSBBUEk6IEFkZGVkIGNoaWxkX2V4aXQgZnVuY3Rpb24gdG8gbW9kdWxlIHN0cnVjdHVyZS4gIFRoaXMgaXMgY2FsbGVkCi0gICAgIG9uY2UgcGVyICJoZWF2eS13ZWlnaHQgcHJvY2VzcyIganVzdCBiZWZvcmUgYSBzZXJ2ZXIgY2hpbGQgZXhpdCgpJ3MgCi0gICAgIGUuZy4gd2hlbiBtYXhfcmVxdWVzdHNfcGVyX2NoaWxkIGlzIHJlYWNoZWQsIGV0Yy4KLSAgICAgW0RvdWcgTWFjRWFjaGVybiwgRGVhbiBHYXVkZXRdCi0KLSAgKikgbW9kX2luY2x1ZGUgY2xlYW51cCBzaG93ZWQgdGhhdCBoYW5kbGVfZWxzZSB3YXMgYmVpbmcgdXNlZCB0byBoYW5kbGUKLSAgICAgZW5kaWYuICBJdCBkaWRuJ3QgY2F1c2UgcHJvYmxlbXMsIGJ1dCBpdCB3YXMgY2xlYW5lZCB1cCB0b28uCi0gICAgIFtIb3dhcmQgRmVhcl0KLQotICAqKSBtb2RfY2Vybl9tZXRhIHdvdWxkIGF0dGVtcHQgdG8gZmluZCBtZXRhIGZpbGVzIGZvciB0aGUgZGlyZWN0b3J5IGl0c2VsZgotICAgICBpbiBzb21lIGNhc2VzLCBidXQgbm90IGluIG90aGVycy4gIEl0IG5vdyBhdm9pZHMgaXQgaW4gYWxsIGNhc2VzLgotICAgICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgbW9kX21pbWVfbWFnaWMgd291bGQgY29yZSBkdW1wIGlmIHRoZXJlIHdhcyBhIGRlY29tcHJlc3Npb24gZXJyb3IuCi0gICAgIFtNYXJ0aW4gS3JhZW1lciA8TWFydGluLktyYWVtZXJAbWNoLnNuaS5kZT5dIFBSIzkwNAotCi0gICopIFBPUlQ6IHNvbWUgdmFyaWFudHMgb2YgREdVWCByZXF1aXJlIC1sc29ja2V0IC1sbnNsCi0gICAgIFtBbGV4YW5kZXIgTCBKb25lcyA8YWxleEBzeXN0ZW1zLW9wdGlvbnMuY28udWs+XSBQUiM3MzIKLQotICAqKSBtb2RfYXV0b2luZGV4IG5vdyBhbGxvd3Mgc29ydGluZyBvZiBGYW5jeUluZGV4ZWQgZGlyZWN0b3J5IGxpc3RpbmdzCi0gICAgIGJ5IHRoZSB2YXJpb3VzIGZpZWxkcyAobmFtZSwgc2l6ZSwgZXQgY2V0ZXJhKSwgZWl0aGVyIGluIGFzY2VuZGluZwotICAgICBvciBkZXNjZW5kaW5nIG9yZGVyLiAgSnVzdCBjbGljayBvbiB0aGUgY29sdW1uIGhlYWRlci4gIFtLZW4gQ29hcl0KLQotICAqKSBQT1JUOiBWYXJpb3VzIHR3ZWFrcyB0byBlbGltaW5hdGUgcG9pbnRlci1pbnQgY2FzdGluZyB3YXJuaW5ncyBvbiA2NC1iaXQKLSAgICAgQ1BVcyBsaWtlIHRoZSBBbHBoYS4gIEFwYWNoZSBzdGlsbCBzdG9yZXMgaW50cyBpbiBwb2ludGVycywgYnV0IHRoYXQncwotICAgICB0aGUgcmVsYXRpdmVseSBzYWZlIGRpcmVjdGlvbi4gIFtEZWFuIEdhdWRldF0gUFIjMzQ0Ci0KLSAgKikgUE9SVDogUU5YIG1tYXAoKSBzdXBwb3J0IGZvciBmYXN0ZXIvbW9yZSByZWxpYWJsZSBzY29yZWJvYXJkIGhhbmRsaW5nLgotICAgICBbSWdvciBOIEtvdmFsZW5rbyA8aW5mb2hAbWFpbC53cGx1cy5uZXQ+XSBQUiM2ODMKLQotICAqKSBjaGlsZF9tYWluIGF2b2lkcyBhbiB1bm5lZWRlZCBjYWxsIHRvIHNlbGVjdCgpIHdoZW4gdGhlcmUgaXMgb25seSBvbmUKLSAgICAgbGlzdGVuaW5nIHNvY2tldC4gIFtEZWFuIEdhdWRldF0KLQotICAqKSBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgc2VydmVyIGlzIHN0YXJ2ZWQgZm9yIGlkbGUgc2VydmVycyBpdCB3aWxsCi0gICAgIHNwYXduIDEsIHRoZW4gMiwgdGhlbiA0LCAuLi4sIHRoZW4gMzIgc2VydmVycyBlYWNoIHNlY29uZCwKLSAgICAgZG91YmxpbmcgZWFjaCBzZWNvbmQuICBJdCdsbCBhbHNvIGdpdmUgYSB3YXJuaW5nIGluIHRoZSBlcnJvcmxvZwotICAgICBzaW5jZSB0aGUgbW9zdCBjb21tb24gcmVhc29uIGZvciB0aGlzIGlzIGEgcG9vciBTdGFydFNlcnZlcnMKLSAgICAgc2V0dGluZy4gIFRoZSBkZWZpbmUgTUFYX1NQQVdOX1JBVEUgY2FuIGJlIHVzZWQgdG8gcmFpc2UvbG93ZXIKLSAgICAgdGhlIG1heGltdW0uICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgQXBhY2hlIG5vdyBwcm92aWRlcyBhbiBlZmZlY3RpdmVseSB1bmJ1ZmZlcmVkIGNvbm5lY3Rpb24gZm9yCi0gICAgIENHSSBzY3JpcHRzLiAgVGhpcyBtZWFucyB0aGF0IGRhdGEgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQKLSAgICAgYXMgc29vbiBhcyB0aGUgQ0dJIHBhdXNlcyBvciBzdG9wcyBvdXRwdXQ7IHByZXZpb3VzbHksIEFwYWNoZSB3b3VsZAotICAgICBidWZmZXIgdGhlIG91dHB1dCB1cCB0byBhIGZpeGVkIGJ1ZmZlciBzaXplIGJlZm9yZSBzZW5kaW5nLCB3aGljaAotICAgICBjb3VsZCByZXN1bHQgaW4gdGhlIHVzZXIgdmlld2luZyBhbiBlbXB0eSBwYWdlIHVudGlsIHRoZSBDR0kgZmluaXNoZWQKLSAgICAgb3Igb3V0cHV0IGEgY29tcGxldGUgYnVmZmVyLiAgSXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byB1c2UgYW4KLSAgICAgIm5waC0iIENHSSB0byBnZXQgdW5idWZmZXJlZCBvdXRwdXQuICBHaXZlbiB0aGF0IG1vc3QgQ0dJcyBhcmUgd3JpdHRlbgotICAgICBpbiBhIGxhbmd1YWdlIHRoYXQgYnkgZGVmYXVsdCBkb2VzIGJ1ZmZlcmluZyAoZS5nLiBwZXJsKSB0aGlzCi0gICAgIHNob3VsZG4ndCBoYXZlIGEgZGV0cmltZW50YWwgZWZmZWN0IG9uIHBlcmZvcm1hbmNlLgotCi0gICAgICJucGgtIiBDR0lzLCB3aGljaCBmb3JtZXJseSBwcm92aWRlZCBhIGRpcmVjdCBzb2NrZXQgdG8gdGhlIGNsaWVudAotICAgICB3aXRob3V0IGFueSBzZXJ2ZXIgcG9zdC1wcm9jZXNzaW5nLCB3ZXJlIG5vdCBmdWxseSBjb21wYXRpYmxlIHdpdGgKLSAgICAgSFRUUC8xLjEgb3IgU1NMIHN1cHBvcnQuICBBcyBzdWNoIHRoZXkgd291bGQgaGF2ZSBoYWQgdG8gaW1wbGVtZW50Ci0gICAgIHRoZSB0cmFuc3BvcnQgZGV0YWlscywgc3VjaCBhcyBlbmNyeXB0aW9uIG9yIGNodW5raW5nLCBpbiBvcmRlcgotICAgICB0byB3b3JrIHByb3Blcmx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucy4gIE5vdywgdGhlIG9ubHkgZGlmZmVyZW5jZQotICAgICBiZXR3ZWVuIG5waCBhbmQgbm9uLW5waCBzY3JpcHRzIGlzICJub24tcGFyc2VkIGhlYWRlcnMiLgotICAgICBbRGVhbiBHYXVkZXQsIFNhbWVlciBQYXJla2gsIFJveSBGaWVsZGluZ10KLQotICAqKSBJZiBhIEJVRkYgaXMgc3dpdGNoZWQgZnJvbSBidWZmZXJlZCB0byB1bmJ1ZmZlcmVkIHJlYWRpbmcgdGhlIGZpcnN0Ci0gICAgIGJyZWFkKCkgd2lsbCByZXR1cm4gd2hhdGV2ZXIgcmVtYWluZWQgaW4gdGhlIGJ1ZmZlciBwcmlvciB0byB0aGUKLSAgICAgc3dpdGNoLiBbRGVhbiBHYXVkZXRdCi0KLUNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zYTEKLQotICAqKSBBZGRlZCBhbm90aGVyIENvbmZpZ3VyZSBoZWxwZXIgc2NyaXB0OiBUZXN0TGliLiBJdCBkZXRlcm1pbmVzCi0gICAgIGlmIGEgc3BlY2lmaWVkIGxpYnJhcnkgZXhpc3RzLiAgW0ppbSBKYWdpZWxza2ldCi0KLSAgKikgUE9SVDogQWxsb3cgZm9yIHVzZSBvZiBuMzJiaXQgbGlicmFyaWVzIHVuZGVyIElSSVggNi54Ci0gICAgIFtkZXJpdmVkIGZyb20gcGF0Y2ggZnJvbSBKZWZmIEhheWVzIDxqaGF5ZXNAYXcuc2dpLmNvbT5dCi0gICAgIFBSIzcyMQotCi0gICopIFBPUlQ6IFNvbWUgYXJjaGl0ZWN0dXJlcyB1c2Ugc2l6ZV90IGZvciB2YXJpb3VzIGxlbmd0aHMgaW4gbmV0d29yawotICAgICBmdW5jdGlvbnMgc3VjaCBhcyBhY2NlcHQoKSwgYW5kIGdldHNvY2tuYW1lKCkuICBUaGUgZGVmaW5pdGlvbgotICAgICBORVRfU0laRV9UIGlzIHVzZWQgdG8gY29udHJvbCB0aGlzLiBbRGVhbiBHYXVkZXRdCi0KLSAgKikgUE9SVDogTGludXg6IEF0dGVtcHQgdG8gZGV0ZWN0IGdsaWJjIGJhc2VkIHN5c3RlbXMgYW5kIGluY2x1ZGUgY3J5cHQuaAotICAgICBhbmQgLWxjcnlwdC4gIFRlc3QgZm9yIHZhcmlvdXMgZGIgbGlicmFyaWVzIChkYm0sIG5kYm0sIGRiKSB3aGVuCi0gICAgIG1vZF9hdXRoX2RibSBvciBtb2RfYXV0aF9kYiBhcmUgaW5jbHVkZWQuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgUE9SVDogUU5YIGRvZXNuJ3QgaGF2ZSBpbml0Z3JvdXBzKCkgd2hpY2ggc3VwcG9ydC9zdWV4ZWMuYyB1c2VzLgotICAgICBbSWdvciBOIEtvdmFsZW5rbyA8aW5mb2hAbWFpbC53cGx1cy5uZXQ+XQotCi0gICopICJmb3JjZS1yZXNwb25zZS0xLjAiIG5vdyBvbmx5IGFwcGxpZXMgdG8gcmVxdWVzdHMgd2hpY2ggYXJlIEhUVFAvMS4wIHRvCi0gICAgIGJlZ2luIHdpdGguICAibm9rZWVwYWxpdmUiIG5vdyB3b3JrcyBmb3IgSFRUUC8xLjEgY2xpZW50cy4gIEFkZGVkCi0gICAgICJkb3duZ3JhZGUtMS4wIiB3aGljaCBjYXVzZXMgQXBhY2hlIHRvIHByZXRlbmQgaXQgcmVjZWl2ZWQgYSAxLjAuCi0gICAgIFtEZWFuIEdhdWRldF0gcmVsYXRlZCBQUiM4NzUKLQotICAqKSBBUEk6IENvcnJlY3QgY2hpbGRfaW5pdCgpIHNsb3QgZGVjbGFyYXRpb24gZnJvbSBpbnQgdG8gdm9pZCwgdG8KLSAgICAgbWF0Y2ggdGhlIGluaXQoKSBkZWNsYXJhdGlvbi4gIFVwZGF0ZSBtb2RfZXhhbXBsZSB0byB1c2UgdGhlIG5ldwotICAgICBob29rLiAgW0tlbiBDb2FyXQotCi0gICopIGFkZGVkIHRyYW5zcG9ydCBoYW5kbGUgc2xvdCAodF9oYW5kbGUpIHRvIHRoZSBCVUZGIHN0cnVjdHVyZQotICAgICBbRG91ZyBNYWNFYWNoZXJuXQotCi0gICopIGdldF9jbGllbnRfYmxvY2soKSByZXR1cm5zIHdyb25nIGxlbmd0aCBpZiBwb2xpY3kgaXMKLSAgICAgUkVRVUVTVF9DSFVOS0VEX0RFQ0hVTksuCi0gICAgIFtLZW5pY2hpIEhvcmkgPGtlbkBkMi5iczEuZmMubmVjLmNvLmpwPl0gUFIjODE1Ci0KLSAgKikgU3VwcG9ydCB0aGUgaW1hZ2UgbWFwIGZvcm1hdCBvZiBGcm9udFBhZ2UuICBGb3IgZXhhbXBsZToKLSAgICAgICAgcmVjdCAvdXJsLmhybSAxMCAyMCAzMCA0MAotICAgICBbIkNocmlzIE8nQnlybmUiIDxvYnlybmVAaW9sLmllPl0gUFIjODA3Ci0KLSAgKikgUE9SVDogLWxyZXNvbHYgYW5kIC1sc29ja3Mgd2VyZSBpbiB0aGUgd3Jvbmcgb3JkZXIgZm9yIFNvbGFyaXMuCi0gICAgIFsiRGFycmVuIE8nU2hhdWdobmVzc3kiIDxkYXJyZW5AYWFpaS5vei5hdT5dIFBSIzg0NgotCi0gICopIEFkZE1vZHVsZUluZm8gZGlyZWN0aXZlIGZvciBtb2RfaW5mbyB3aGljaCBhbGxvd3MgeW91IHRvIGFubm90YXRlCi0gICAgIHRoZSBvdXRwdXQgb2YgbW9kX2luZm8uICBbIkxvdSBELiBMYW5naG9sdHoiIDxsZGxAdXNpLnV0YWguZWR1Pl0KLQotICAqKSBBZGRlZCBOb1Byb3h5IGRpcmVjdGl2ZSB0byBhdm9pZCB1c2luZyBQcm94eVJlbW90ZSBmb3Igc2VsZWN0ZWQKLSAgICAgYWRkcmVzc2VzLiAgQWRkZWQgUHJveHlEb21haW4gZGlyZWN0aXZlIHRvIGNhdXNlIHVucXVhbGlmaWVkCi0gICAgIG5hbWVzIHRvIGJlIHF1YWxpZmllZCBieSByZWRpcmVjdGlvbi4KLSAgICAgW01hcnRpbiBLcmFlbWVyIDxNYXJ0aW4uS3JhZW1lckBtY2guc25pLmRlPl0KLQotICAqKSBTdXBwb3J0IFByb3h5IEF1dGhlbnRpY2F0aW9uLCBhbmQgZG9uJ3QgcGFzcyB0aGUgUHJveHktQXV0aG9yaXplCi0gICAgIGhlYWRlciB0byB0aGUgcmVtb3RlIGhvc3QgaW4gdGhlIHByb3h5LiBbU2FtZWVyIFBhcmVraCBhbmQKLSAgICAgV2FsbGFjZV0KLQotICAqKSBVcGdyYWRlZCBtb2RfcmV3cml0ZSBmcm9tIDMuMC42KyB0byBsYXRlc3Qgb2ZmaWNpYWxseSBhdmFpbGFibGUgdmVyc2lvbgotICAgICAzLjAuOS4gVGhpcyB1cGdyYWRlIGluY2x1ZGVzOiBmaXhlZCBkZWFkbG9vcGluZyBvbiByZXdyaXRpbmcgdG8gc2FtZQotICAgICBVUkxzLCBmaXhlZCByZXdyaXRlbG9nKCksIGZpeGVkIGZvcmNlZCByZXNwb25zZSBjb2RlIGhhbmRsaW5nIG9uCi0gICAgIHJlZGlyZWN0cyBmcm9tIHdpdGhpbiAuaHRhY2Nlc3MgZmlsZXMsIGRpc2FibGVkIHBpcGUgbG9ja2luZyB1bmRlcgotICAgICBicmFpbmRlYWQgU3VuT1MgNC4xLngsIGFsbG93IGVudiB2YXJpYWJsZXMgdG8gYmUgc2V0IGV2ZW4gb24gcnVsZXMgd2l0aAotICAgICBubyBzdWJzdGl0dXRpb24sIGJ1Z2ZpeGVkIHNpdHVhdGlvbnMgd2hlcmUgSG9zdG5hbWVMb29rdXBzIGlzIG9mZiwgbWFkZQotICAgICBtb2RfcmV3cml0ZSBtb3JlIHRocmVhZC1zYWZlIGZvciBOVCBwb3J0IGFuZCBmaXhlZCBwcm9ibGVtIHdoZW4gY3JlYXRpbmcKLSAgICAgYW4gZW1wdHkgcXVlcnkgc3RyaW5nIHZpYSAieHh4PyIuCi0gICAgICAgICBUaGlzIHVwZGF0ZSBhbHNvIHJlbW92ZXMgdGhlIGNvcHlyaWdodCBvZiBSYWxmIFMuIEVuZ2Vsc2NoYWxsLAotICAgICBpLmUuIG5vdyBtb2RfcmV3cml0ZSBubyBsb25nZXIgaGFzIGEgc2hhcmVkIGNvcHlyaWdodC4gSW5zdGVhZCBpcyBpcwotICAgICBleGNsdXNpdmVseSBjb3B5cmlnaHRlZCBieSB0aGUgQXBhY2hlIEdyb3VwIG5vdy4gVGhpcyBoYXBwZW5lZCBiZWNhdXNlCi0gICAgIHRoZSBhdXRob3Igbm93IGhhcyBnaWZ0ZWQgbW9kX3Jld3JpdGUgZXhjbHVzaXZlbHkgdG8gdGhlIEFwYWNoZSBHcm91cCBhbmQgCi0gICAgIG5vIGxvbmdlciBtYWludGFpbnMgYW4gZXh0ZXJuYWwgdmVyc2lvbi4KLSAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCi0KLSAgKikgQVBJOiBBZGRlZCBjaGlsZF9pbml0IGZ1bmN0aW9uIHRvIG1vZHVsZSBzdHJ1Y3R1cmUuICBUaGlzIGlzIGNhbGxlZAotICAgICBvbmNlIHBlciAiaGVhdnktd2VpZ2h0IHByb2Nlc3MiIGJlZm9yZSBhbnkgcmVxdWVzdHMgYXJlIGhhbmRsZWQuCi0gICAgIFNlZSBodHRwX2NvbmZpZy5oIGZvciBtb3JlIGRldGFpbHMuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgQW5vbnltb3VzX0xvZ0VtYWlsIHdhcyBsb2dnaW5nIG9uIGVhY2ggc3VicmVxdWVzdC4KLSAgICAgW0RlYW4gR2F1ZGV0XSBQUiM0MjEsIDg2OAotCi0gICopIEFQSTogQWRkZWQgaXNfaW5pdGlhbF9yZXEoKSB3aGljaCB0ZXN0cyBpZiB0aGUgcmVxdWVzdCBiZWluZwotICAgICBwcm9jZXNzZWQgaXMgdGhlIGluaXRpYWwgcmVxdWVzdCwgb3IgYSBzdWJyZXF1ZXN0LgotICAgICBbRG91ZyBNYWNFYWNoZXJuXQotCi0gICopIEV4dGVuZGVkIFNTSSAobW9kX2luY2x1ZGUpIG5vdyBoYW5kbGVzIGFkZGl0aW9uYWwgcmVsb3BzIGZvcgotICAgICBzdHJpbmcgY29tcGFyaXNvbnMgKDwsID4sIDw9LCBhbmQgPj0pLiAgW0JydW5vIFdvbGZmIElJSV0gUFIjNDEKLQotICAqKSBDb25maWd1cmUgZml4ZWQgdG8gY29ycmVjdGx5IHByb3BhZ2F0ZSB1c2VyLXNlbGVjdGVkIG9wdGlvbnMgYW5kCi0gICAgIHNldHRpbmdzIChzdWNoIGFzIENDIGFuZCBPUFRJTSkgdG8gTWFrZWZpbGVzIG90aGVyIHRoYW4KLSAgICAgc3JjL01ha2VmaWxlIChub3RhYmx5IHN1cHBvcnQvTWFrZWZpbGUpLiAgW0tlbiBDb2FyXSBQUiM2NjYsICM4MzQKLQotICAqKSBJbmRleE9wdGlvbnMgU3VwcHJlc3NIVE1MUHJlYW1ibGUgbm93IGNhdXNlcyB0aGUgYWN0dWFsIEhUTUwgb2YKLSAgICAgZGlyZWN0b3J5IGluZGljZXMgdG8gc3RhcnQgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIEhlYWRlck5hbWUgZmlsZQotICAgICBpZiB0aGVyZSBpcyBvbmUuICBJZiB0aGVyZSBpc24ndCBvbmUsIHRoZSBiZWhhdmlvdXIgaXMgdW5jaGFuZ2VkLgotICAgICBbS2VuIENvYXIsIFJveSBGaWVsZGluZywgQW5kcmV5IEEuIENoZXJub3ZdCi0KLSAgKikgV0lOMzI6IE1vZHVsZXMgY2FuIG5vdyBiZSBkeW5hbWljYWxseSBsb2FkZWQgRExMcyB1c2luZyB0aGUKLSAgICAgTG9hZE1vZHVsZS9Mb2FkRmlsZSBkaXJlY3RpdmVzLiBOb3RlIHRoYXQgbW9kdWxlIERMTHMgbXVzdCBiZQotICAgICBjb21waWxlZCB3aXRoIHRoZSBtdWx0aXRocmVhZGVkIERMTCB2ZXJzaW9uIG9mIHRoZSBydW50aW1lIGxpYnJhcnkuCi0gICAgIFtBbGV4ZWkgS29zdXQgYW5kIEJlbiBMYXVyaWVdCi0KLSAgKikgQXV0b21hdGljIGluZGV4aW5nIHJlbW92ZWQgZnJvbSBtb2RfZGlyIGFuZCBwbGFjZWQgaW50byBtb2RfYXV0b2luZGV4LgotICAgICBUaGlzIGFsbG93cyB0aGUgYWRtaW4gdG8gY29tcGxldGVseSByZW1vdmUgYXV0b21hdGljIGluZGV4aW5nCi0gICAgIGZyb20gdGhlIHNlcnZlciwgd2hpbGUgc3RpbGwgc3VwcG9ydGluZyB0aGUgYmFzaWMgZnVuY3Rpb25zIG9mCi0gICAgIHRyYWlsaW5nLXNsYXNoIHJlZGlyZWN0cyBhbmQgRGlyZWN0b3J5SW5kZXggZmlsZXMuICBOb3RlIHRoYXQgaWYKLSAgICAgeW91J3JlIGNhcnJ5aW5nIG92ZXIgYW4gb2xkIENvbmZpZ3VyYXRpb24gZmlsZSBhbmQgeW91IHVzZSBkaXJlY3RvcnkKLSAgICAgaW5kZXhpbmcgdGhlbiB5b3UnbGwgd2FudCB0byBhZGQ6Ci0KLSAgICAgTW9kdWxlIGF1dG9pbmRleF9tb2R1bGUgICAgbW9kX2F1dG9pbmRleC5vCi0KLSAgICAgYmVmb3JlIG1vZF9kaXIgaW4geW91ciBDb25maWd1cmF0aW9uLiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIHBvcGVuZGlyL3BjbG9zZWRpciBjcmVhdGVkIHRvIHByb3Blcmx5IHByb3RlY3QgZGlyZWN0b3J5IHNjYW5uaW5nLgotICAgICBbRGVhbiBHYXVkZXRdIFBSIzUyNQotCi0gICopIEFsaWFzTWF0Y2gsIFNjcmlwdEFsaWFzTWF0Y2ggYW5kIFJlZGlyZWN0TWF0Y2ggZGlyZWN0aXZlcyBhZGRlZCwKLSAgICAgZ2l2aW5nIHJlZ2V4IHN1cHBvcnQgdG8gbW9kX2FsaWFzLiA8RGlyZWN0b3J5TWF0Y2g+LCA8TG9jYXRpb25NYXRjaD4KLSAgICAgYW5kIDxGaWxlc01hdGNoPiBzZWN0aW9ucyBhZGRlZCB0byBzdWNjZWVkIDxEaXJlY3RvcnlNYXRjaCB+PiwgZXRjLi4uCi0gICAgIFtBbGV4ZWkgS29zdXRdCi0KLSAgKikgVGhlIEFjY2Vzc0ZpbGVOYW1lIGRpcmVjdGl2ZSBjYW4gbm93IHRha2UgbW9yZSB0aGFuIG9uZSBmaWxlbmFtZS4KLSAgICAgWyJMb3UgRC4gTGFuZ2hvbHR6IiA8bGRsQHVzaS51dGFoLmVkdT5dCi0KLSAgKikgVGhlIG5ldyBtb2RfbWltZV9tYWdpYyBjYW4gYmUgdXNlZCB0byAibWFnaWNhbGx5IiBkZXRlcm1pbmUgdGhlIHR5cGUKLSAgICAgb2YgYSBmaWxlIGlmIHRoZSBleHRlbnNpb24gaXMgdW5rbm93bi4gIEJhc2VkIG9uIHRoZSB1bml4IGZpbGUoMSkKLSAgICAgY29tbWFuZC4gIFtJYW4gS2x1ZnQgPGlrbHVmdEBjaXNjby5jb20+XQotCi0gICopIFdlIG5vdyBkZXRlcm1pbmUgYW5kIGRpc3BsYXkgdGhlIHRpbWUgc3BlbnQgcHJvY2Vzc2luZyBhCi0gICAgIHJlcXVlc3QgaWYgZGVzaXJlZC4gIFtKaW0gSmFnaWVsc2tpXQotCi0gICopIG1vZF9zdGF0dXM6IFBJRCBmaWVsZCBvZiAiZGVhZCIgY2hpbGQgc2xvdHMgbm8gbG9uZ2VyIGRpc3BsYXlzCi0gICAgIG1haW4gaHR0cGQgcHJvY2VzcydzIFBJRC4gIFtKaW0gSmFnaWVsc2tpXQotCi0gICopIE1ha2VmaWxlLm50IGFkZGVkIC0gdG8gYnVpbGQgYWxsIHRoZSBiaXRzIGZyb20gdGhlIGNvbW1hbmQgbGluZToKLSAgICAgICAgbm1ha2UgLWYgTWFrZWZpbGUubnQKLSAgICAgICAgIERvZXNuJ3QgeWV0IHdvcmsgcHJvcGVybHkuIFtCZW4gTGF1cmllXQotCi0gICopIERlZmF1bHQgdGV4dCBvZiA0MDQgZXJyb3IgaXMgbm93ICJOb3QgRm91bmQiIHJhdGhlciB0aGFuIHRoZQotICAgICBwb3RlbnRpYWxseSBtaXNsZWFkaW5nICJGaWxlIE5vdCBGb3VuZCIuICBbS2VuIENvYXJdCi0KLSAgKikgQ09ORklHOiAiSG9zdG5hbWVMb29rdXBzIiBub3cgZGVmYXVsdHMgdG8gb2ZmIGJlY2F1c2UgaXQgaXMgZmFyIGJldHRlcgotICAgICBmb3IgdGhlIG5ldCBpZiB3ZSByZXF1aXJlIHBlb3BsZSB0aGF0IGFjdHVhbGx5IG5lZWQgdGhpcyBkYXRhIHRvCi0gICAgIGVuYWJsZSBpdC4gIFtMaW51cyBUb3J2YWxkc10KLQotICAqKSBkaXJlY3Rvcnlfd2FsaygpIGlzIGFuIGV4cGVuc2l2ZSBmdW5jdGlvbiwga2VlcCBhIGxpdHRsZSBtb3JlIHN0YXRlIHRvCi0gICAgIGF2b2lkIG5lZWRsZXNzIHN0cmluZyBjb3VudGluZy4gIEFkZCB0d28gbmV3IGZ1bmN0aW9ucyBtYWtlX2RpcnN0cl9wYXJlbnQKLSAgICAgYW5kIG1ha2VfZGlyc3RyX3ByZWZpeCB3aGljaCByZXBsYWNlIGFsbCBleGlzdGluZyB1c2VzIG9mIG1ha2VfZGlyc3RyLgotICAgICBUaGUgbmV3IGZ1bmN0aW9ucyBhcmUgYSBsaXR0bGUgbGVzcyBnZW5lcmFsIHRoYW4gbWFrZV9kaXJzdHIsIGJ1dAotICAgICB3b3JrIG1vcmUgZWZmaWNpZW50bHkgKGxlc3MgbWVtb3J5LCBsZXNzIHN0cmluZyBjb3VudGluZykuCi0gICAgIFtEZWFuIEdhdWRldF0KLQotICAqKSBFWFRSQV9MRkxBR1Mgd2FzIGNoYW5nZWQgdG8gRVhUUkFfTERGTEFHUyAoYW5kIExGTEFHUyB3YXMgY2hhbmdlZAotICAgICB0byBMREZMQUdTKSB0byBhdm9pZCBjb21wbGljYXRpb25zIHdpdGggbGV4IHJ1bGVzIGluIG1ha2UgZmlsZXMuCi0gICAgIFtEZWFuIEdhdWRldF0gUFIjMzcyCi0KLSAgKikgcnVuX21ldGhvZCBvcHRpbWl6ZWQgdG8gYXZvaWQgbmVlZGxlc3Mgc2Nhbm5pbmcgb3ZlciBOVUxMcyBpbiB0aGUKLSAgICAgbW9kdWxlIGxpc3QuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgUmV2YW1wIG9mICh1bml4KSBzY29yZWJvYXJkIG1hbmFnZW1lbnQgY29kZSBzdWNoIHRoYXQgaXQgYXZvaWRzCi0gICAgIHVubmVjZXNzYXJ5IHRyYXZlcnNhbHMgb2YgdGhlIHNjb3JlYm9hcmQgb24gZWFjaCBoaXQuICBUaGlzIGlzCi0gICAgIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgZm9yIGhpZ2ggdm9sdW1lIHNpdGVzIHdpdGggYSBsYXJnZQotICAgICBIQVJEX1NFUlZFUl9MSU1JVC4gIFNvbWUgb2YgdGhlIHByZXZpb3VzIG9wZXJhdGlvbnMgd2VyZSBPKG5eMiksCi0gICAgIGFuZCBhcmUgbm93IE8obikuICBTZWUgYWxzbyBTQ09SRUJPQVJEX01BSU5URU5BTkNFX0lOVEVSVkFMIGluCi0gICAgIGh0dHBkLmguIFtEZWFuIEdhdWRldF0KLQotICAqKSBJbiBjb25maWd1cmF0aW9ucyB1c2luZyBtdWx0aXBsZSBMaXN0ZW4gc3RhdGVtZW50cyBpdCB3YXMgcG9zc2libGUgZm9yCi0gICAgIGJ1c3kgc29ja2V0cyB0byBzdGFydmUgb3RoZXIgc29ja2V0cyBvZiBzZXJ2aWNlLiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIEFkZGVkIGhvb2sgc28gc3RhbmRhbG9uZV9tYWluIGNhbiBiZSByZXBsYWNlZCBhdCBjb21waWxlIHRpbWUKLSAgICAgKGRlZmluZSBTVEFOREFMT05FX01BSU4pCi0gICAgIFtEb3VnIE1hY0VhY2hlcm5dCi0KLSAgKikgTG93ZXN0LWxldmVsIHJlYWQvd3JpdGUgZnVuY3Rpb25zIGluIGJ1ZmYuYyB3aWxsIGJlIHJlcGxhY2VkIHdpdGgKLSAgICAgdGhlIFNGSU8gbGlicmFyeSBjYWxscyBzZnJlYWQvc2Z3cml0ZSBpZiBCX1NGSU8gaXMgZGVmaW5lZCBhdAotICAgICBjb21waWxlIHRpbWUuICBUaGUgZGVmYXVsdCBzZmlvIGRpc2NpcGxpbmUgd2lsbCBiZWhhdmUgYXMgYXBhY2hlCi0gICAgIHdvdWxkIHdpdGhvdXQgc2ZpbyBjb21waWxlZCBpbi4KLSAgICAgW0RvdWcgTWFjRWFjaGVybl0KLQotICAqKSBFbmhhbmNlIFVzZXJEaXIgZGlyZWN0aXZlIChtb2RfdXNlcmRpcikgdG8gYWNjZXB0IGEgbGlzdCBvZgotICAgICB1c2VybmFtZXMgZm9yIHRoZSAnZGlzYWJsZScga2V5d29yZCwgYW5kIGFkZCAnZW5hYmxlIHVzZXIuLi4nIHRvCi0gICAgIHNlbGVjdGl2ZWx5ICplbiphYmxlIHVzZXJkaXJzIGlmIHRoZXkncmUgZ2xvYmFsbHkgZGlzYWJsZWQuCi0gICAgIFtLZW4gQ29hcl0KLQotICAqKSBJZiBORVRTQ0FQRV9EQk1fQ09NUEFUIGlzIGRlZmluZWQgaW4gRVhUUkFfQ0ZMQUdTIHRoZW4gQXBhY2hlCi0gICAgIHdpbGwgd29yayB3aXRoIE5ldHNjYXBlIGRibSBmaWxlcy4gIChkYm1tYW5hZ2Ugd2lsbCBwcm9iYWJseSBub3QKLSAgICAgd29yayBob3dldmVyLikgW0FsZXhhbmRlciBTcG9ociA8YXNwb2hyQG5ldG1hdGljLmNvbT5dIFBSIzQ0NAotCi0gICopIEFkZCBhIExpc3RlbkJhY2tsb2cgZGlyZWN0aXZlIHRvIGNvbnRyb2wgdGhlIGJhY2tsb2cgcGFyYW1ldGVyCi0gICAgIHBhc3NlZCB0byBsaXN0ZW4oKS4gIEFsc28gY2hhbmdlIHRoZSBkZWZhdWx0IHRvIDUxMSBmcm9tIDUxMi4KLSAgICAgW01hcmMgU2xlbWtvXQotCi0gICopIEFQSTogQSBuZXcgaGFuZGxlciByZXNwb25zZSBET05FIHdoaWNoIGluZm9ybXMgYXBhY2hlIHRoYXQgdGhlCi0gICAgIHJlcXVlc3QgaGFzIGJlZW4gaGFuZGxlZCBhbmQgaXQgY2FuIGZpbmlzaCBvZmYgcXVpY2tseSwgc2ltaWxhciB0bwotICAgICBob3cgaXQgaGFuZGxlcyBlcnJvcnMuIFtSb2IgSGFydGlsbF0KLQotICAqKSBUdXJuIG9mZiBjaHVua2VkIGVuY29kaW5nIGFmdGVyIHNlbmRpbmcgdGVybWluYXRpbmcgY2h1bmsvZm9vdGVyCi0gICAgIHNvIHRoYXQgd2UgY2FuJ3QgZG8gaXQgdHdpY2UgYnkgYWNjaWRlbnQuIFtSb3kgRmllbGRpbmddCi0KLSAgKikgbW9kX2V4cGlyZSBhbHNvIGlzc3VlcyBDYWNoZS1Db250cm9sOiBtYXgtYWdlIGhlYWRlcnMuCi0gICAgIFtSb2IgSGFydGlsbF0KLQotICAqKSBBUEk6IEFkZGVkIGtpbGxfb25seV9vbmNlIG9wdGlvbiBmb3IgZnJlZV9wcm9jX2NoYWluIHNvIHRoYXQgaXQgd29uJ3QKLSAgICAgYWdncmVzc2l2ZWx5IHRyeSB0byBraWxsIG9mZiBzcGVjaWZpYyBjaGlsZHJlbi4gIEZvciBmYXN0Y2dpLgotICAgICBbU3RhbmxleSBHYW1iYXJpbiA8Z2FtYmFyaW5AT3Blbk1hcmtldC5jb20+XQotCi0gICopIG1vZF9hdXRoIGRlYWxzIHdpdGggZXh0cmEgJzonIGRlbGltaXRlZCBmaWVsZHMuICBbTWFyYyBTbGVta29dCi0KLSAgKikgQWRkZWQgSWNvbkhlaWdodCBhbmQgSWNvbldpZHRoIHRvIG1vZF9kaXIncyBJbmRleE9wdGlvbnMgZGlyZWN0aXZlLgotICAgICBXaGVuIHVzZWQgdG9nZXRoZXIsIHRoZXNlIGNhdXNlIG1vZF9kaXIgdG8gZW1pdCBIRUlHSFQgYW5kIFdJRFRICi0gICAgIGF0dHJpYnV0ZXMgaW4gdGhlIEZhbmN5SW5kZXhpbmcgSU1HIHRhZ3MuICBbS2VuIENvYXJdCi0KLSAgKikgUE9SVDogU2VxdWVudCBhbmQgU09OWSBORVdTLU9TIHN1cHBvcnQgYWRkZWQuICBbSmltIEphZ2llbHNraV0KLQotICAqKSBQT1JUOiBBZGRlZCBXaW5kb3dzIE5UIHN1cHBvcnQKLSAgICAgW0JlbiBMYXVyaWUgYW5kIEFtYmFyaXNoIE1hbHBhbmkgPGFtYmFyaXNoQHZhbGljZXJ0LmNvbT5dCi0KLUNoYW5nZXMgd2l0aCBBcGFjaGUgMS4yLjYKLQotICAqKSBtb2RfaW5jbHVkZSB3aGVuIHVzaW5nIFhCaXRIYWNrIEZ1bGwgd291bGQgc2VuZCBFVGFncyBpbiBhZGRpdGlvbiB0bwotICAgICBzZW5kaW5nIExhc3QtTW9kaWZpZWRzLiAgVGhpcyBpcyBpbmNvcnJlY3QgSFRUUC8xLjEgYmVoYXZpb3VyLgotICAgICBbRGVhbiBHYXVkZXRdIFBSIzExMzMKLQotICAqKSBTRUNVUklUWTogV2hlbiBhIGNsaWVudCBjb25uZWN0cyB0byBhIHBhcnRpY3VsYXIgcG9ydC9hZGRyLCBhbmQKLSAgICAgZ2l2ZXMgYSBIb3N0OiBoZWFkZXIgZW5zdXJlIHRoYXQgdGhlIHZpcnR1YWwgaG9zdCByZXF1ZXN0ZWQgY2FuCi0gICAgIGFjdHVhbGx5IGJlIHJlYWNoZWQgdmlhIHRoYXQgcG9ydC9hZGRyLiAgW0VkIEtvcnRob2YgPGVkQG9yZ2FuaWMuY29tPl0KLQotICAqKSBTdXBwb3J0IHZpcnR1YWwgaG9zdHMgd2l0aCB3aWxkY2FyZCBwb3J0IGFuZC9vciBtdWx0aXBsZSBwb3J0cwotICAgICBwcm9wZXJseS4gIFtFZCBLb3J0aG9mIDxlZEBvcmdhbmljLmNvbT5dCi0KLSAgKikgRml4ZWQgc29tZSBjYXNlLXNlbnNpdGl2aXR5IGlzc3VlcyBhY2NvcmRpbmcgdG8gUkZDMjA2OC4KLSAgICAgW0RlYW4gR2F1ZGV0XQotCi0gICopIFNldCByLT5hbGxvd2VkIHByb3Blcmx5IGluIG1vZF9hc2lzLmMsIG1vZF9kaXIuYywgbW9kX2luZm8uYywKLSAgICAgYW5kIG1vZF9pbmNsdWRlLmMuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgVmFyaWFibGUgJ2N3ZCcgd2FzIGJlaW5nIHVzZWQgcG9pbnRsZXNzbHkgYmVmb3JlIGJlaW5nIHNldC4KLSAgICAgW0tlbiBDb2FyXSBQUiMxNzM4Ci0KLSAgKikgU0lHVVJHIGRvZXNuJ3QgZXhpc3Qgb24gYWxsIHBsYXRmb3Jtcy4KLSAgICAgW01hcmsgQW5kcmV3IEhlaW5yaWNoIDxoZWlucmljaEB0aW5kZXJib3guU3RhbmZvcmQuRURVPl0KLQotICAqKSBXaGVuIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgYSBQT1NULCBvciBvdGhlciBvcGVyYXRpb24gd2l0aCBhCi0gICAgIHJlcXVlc3QgYm9keSwgdGhlIGJvZHkgaGFzIHRvIGJlIHJlYWQgZnJvbSB0aGUgbmV0IGJlZm9yZSBhbGxvd2luZwotICAgICBhIGtlZXBhbGl2ZSBzZXNzaW9uIHRvIGNvbnRpbnVlLiAgW1JveSBGaWVsZGluZ10gUFIjMTM5OQotCi0gICopIFdoZW4gYW4gZXJyb3Igb2NjdXJzIGluIGZjbnRsKCkgbG9ja2luZyBzdWdnZXN0IHRoZSB1c2VyIGxvb2sgdXAKLSAgICAgdGhlIGRvY3MgZm9yIExvY2tGaWxlLiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIHRhYmxlX3NldCgpIGFuZCB0YWJsZV91bnNldCgpIGRpZCBub3QgZGVhbCBjb3JyZWN0bHkgd2l0aAotICAgICBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSBrZXkuIFtTdGVwaGVuIFNjaGVjawotICAgICA8c3NjaGVja0BpbmZvbmV4Lm5ldD4sIEJlbiBMYXVyaWVdIFBSIzE2MDQKLQotICAqKSBzZW5kX2ZkX2xlbmd0aCgpIGRpZCBub3QgY2FsY3VsYXRlIHRvdGFsX2J5dGVzX3NlbnQgcHJvcGVybHkgaW4gZXJyb3IKLSAgICAgY2FzZXMuICBbQmVuIFJlc2VyIDxicmVzZXJAcmVnbm93LmNvbT5dIFBSIzEzNjYKLQotICAqKSByLT5jb25uZWN0aW9uLT51c2VyIHdhcyBhbGxvY2F0ZWQgaW4gdGhlIHdyb25nIHBvb2wgY2F1c2luZyBjb3JydXB0aW9uCi0gICAgIGluIHNvbWUgY2FzZXMgd2hlbiB1c2VkIHdpdGggbW9kX2Nlcm5fbWV0YS4gIFtEZWFuIEdhdWRldF0gUFIjMTUwMAotCi0gICopIG1vZF9wcm94eSB3YXMgc2VuZGluZyBIVFRQLzEuMSByZXNwb25zZXMgdG8gZnRwIHJlcXVlc3RzIGJ5IG1pc3Rha2UuCi0gICAgIEFsc28gcmVtb3ZlZCB0aGUgYXV0by1nZW5lcmF0ZWQgbGluayB0byB3d3cuYXBhY2hlLm9yZyB0aGF0IHdhcyB0aGUKLSAgICAgc291cmNlIG9mIHNvIG1hbnkgbWlzZGlyZWN0ZWQgYnVnIHJlcG9ydHMuICBbUm95IEZpZWxkaW5nLCBNYXJjIFNsZW1rb10KLQotICAqKSBNdWx0aXBsZSAiY2xvc2UiIHRva2VucyBtYXkgaGF2ZSBiZWVuIHNldCBpbiB0aGUgIkNvbm5lY3Rpb24iCi0gICAgIGhlYWRlciwgbm90IGFuIGVycm9yLCBidXQgYSB3YXN0ZS4KLSAgICAgW1JvbmFsZC5Uc2NoYWxhZXJAcHNpLmNoXSBQUiMxNjgzCi0KLSAgKikgImJhc2ljIiBhbmQgImRpZ2VzdCIgYXV0aCB0b2tlbnMgc2hvdWxkIGJlIHRlc3RlZCBjYXNlLWluc2Vuc2l0aXZlLgotICAgICBbUm9uYWxkLlRzY2hhbGFlckBwc2kuY2hdIFBSIzE1OTksIFBSIzE2NjYKLQotICAqKSBJdCBhcHBlYXJzIHRoZSAiMjU3dGggYnl0ZSIgYnVnIChzZWUKLSAgICAgaHRkb2NzL21hbnVhbC9taXNjL2tub3duX2NsaWVudF9wcm9ibGVtcy5odG1sIzI1N3RoLWJ5dGUpIGNhbiBoYXBwZW4KLSAgICAgYXQgdGhlIDI1NnRoIGJ5dGUgYXMgd2VsbC4gIEZpeGVkLiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIG1vZF9yZXdyaXRlIHdvdWxkIG5vdCBoYW5kbGUgJTNmIHByb3Blcmx5IGluIHNvbWUgc2l0dWF0aW9ucy4KLSAgICAgW1JhbGYgRW5nZWxzY2hhbGxdCi0KLSAgKikgQXBhY2hlIGNvdWxkIGdlbmVyYXRlIGltcHJvcGVybHkgY2h1bmtlZCBIVFRQLzEuMSByZXNwb25zZXMgd2hlbgotICAgICB0aGUgYnB1dGMoKSBvciBycHV0YygpIGZ1bmN0aW9ucyB3ZXJlIHVzZWQgYnkgbW9kdWxlcyAoc3VjaCBhcwotICAgICBtb2RfaW5jbHVkZSkuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgI2lmZGVmIHdyYXAgYSBmZXcgI2RlZmluZXMgaW4gaHR0cGQuaCB0byBtYWtlIGxpZmUgZWFzaWVyIG9uCi0gICAgIHNvbWUgcG9ydHMuICBbUmFsZiBFbmdlbHNjaGFsbF0KLQotICAqKSBGaXggTVBFIGNvbXBpbGF0aW9uIGVycm9yIGluIG1vZF91c2VydHJhY2suYy4gIFtNYXJrIEJpeGJ5XQotCi0gICopIFF1b3RlIENDPSckKENDKScgdG8gaW1wcm92ZSByZWN1cnNlIG1ha2UgY2FsbHMuICBbTWFydGluIEtyYWVtZXJdCi0KLSAgKikgQXZvaWQgQl9FUlJPUiByZWRlY2xhcmF0aW9uIG9uIHN5c3ZyNCBzeXN0ZW1zLiAgW01hcnRpbiBLcmFlbWVyXQotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDEuMi41Ci0KLSAgKikgU0VDVVJJVFk6IEZpeCBhIHBvc3NpYmxlIGJ1ZmZlciBvdmVyZmxvdyBpbiBsb2dyZXNvbHZlLiAgVGhpcyBpcwotICAgICBvbmx5IGFuIGlzc3VlIG9uIHN5c3RlbXMgd2l0aG91dCBhIE1BWEROQU1FIGRlZmluZSBvciB3aGVyZSAKLSAgICAgdGhlIHJlc29sdmVyIHJldHVybnMgZG9tYWluIG5hbWVzIGxvbmdlciB0aGFuIE1BWEROQU1FLiAgW01hcmMgU2xlbWtvXQotCi0gICopIEZpeCBhbiBpbXByb3BlciBsZW5ndGggaW4gYW4gYXBfc25wcmludGYgY2FsbCBpbiBwcm94eV9kYXRlX2Nhbm9uKCkuCi0gICAgIFtNYXJjIFNsZW1rb10KLQotICAqKSBGaXggY29yZSBkdW1wIGluIHRoZSBmdHAgcHJveHkgd2hlbiByZWFkaW5nIGluY29ycmVjdGx5IGZvcm1hdHRlZAotICAgICBkaXJlY3RvcnkgbGlzdGluZ3MuICBbTWFyYyBTbGVta29dCi0KLSAgKikgU0VDVVJJVFk6IEZpeCBwb3NzaWJsZSBtaW5vciBidWZmZXIgb3ZlcmZsb3cgaW4gdGhlIHByb3h5IGNhY2hlLgotICAgICBbTWFyYyBTbGVta29dCi0KLSAgKikgU0VDVVJJVFk6IEVsaW1pbmF0ZSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgaW4gY2ZnX2dldGxpbmUsIHdoaWNoCi0gICAgIGlzIHVzZWQgdG8gcmVhZCB2YXJpb3VzIHR5cGVzIG9mIGZpbGVzIHN1Y2ggYXMgaHRhY2Nlc3MgYW5kIAotICAgICBodHBhc3N3ZCBmaWxlcy4gIFtNYXJjIFNsZW1rb10KLQotICAqKSBTRUNVUklUWTogRW5zdXJlIHRoYXQgdGhlIGJ1ZmZlciByZXR1cm5lZCBieSBodF90aW1lIGlzIGFsd2F5cwotICAgICBwcm9wZXJseSBudWxsIHRlcm1pbmF0ZWQuICBbTWFyYyBTbGVta29dCi0KLSAgKikgU0VDVVJJVFk6IEdlbmVyYWwgbW9kX2luY2x1ZGUgY2xlYW51cCwgaW5jbHVkaW5nIGZpeGluZyBzZXZlcmFsCi0gICAgIHBvc3NpYmxlIGJ1ZmZlciBvdmVyZmxvd3MgYW5kIGEgcG9zc2libGUgaW5maW5pdGUgbG9vcC4gIFRoaXMgY2xlYW51cAotICAgICB3YXMgZG9uZSBhZ2FpbnN0IDEuMyBjb2RlIGFuZCB0aGVuIGJhY2twb3J0ZWQgdG8gMS4yLCB0aGUgcmVzdWx0Ci0gICAgIGlzIGEgbGFyZ2UgZGlmZmVyZW5jZSAoZHVlIHRvIGluZGVudGF0aW9uIGNsZWFudXAgaW4gMS4zIGNvZGUpLgotICAgICBVc2VycyBpbnRlcmVzdGVkIGluIHNlZWluZyBhIHNtYWxsZXIgc2V0IG9mIHJlbGV2YW50IGRpZmZlcmVuY2VzCi0gICAgIHNob3VsZCBjb25zaWRlciBjb21wYXJpbmcgYWdhaW5zdCBzcmMvbW9kdWxlcy9zdGFuZGFyZC9tb2RfaW5jbHVkZS5jCi0gICAgIGZyb20gdGhlIDEuM2IzIHJlbGVhc2UuICBOb24taW5kZW50YXRpb24gY2hhbmdlcyB0byBtb2RfaW5jbHVkZQotICAgICBiZXR3ZWVuIDEuMiBhbmQgMS4zIHdlcmUgbWluaW1hbC4gIFtEZWFuIEdhdWRldCwgTWFyYyBTbGVta29dCi0KLSAgKikgU0VDVVJJVFk6IE51bWVyb3VzIGNoYW5nZXMgdG8gbW9kX2ltYXAgaW4gYSBnZW5lcmFsIGNsZWFudXAKLSAgICAgaW5jbHVkaW5nIGZpeGluZyBhIHBvc3NpYmxlIGJ1ZmZlciBvdmVyZmxvdy4gIFRoaXMgY2xlYW51cCBhbHNvCi0gICAgIHdhcyBkb25lIHdpdGggMS4zIGNvZGUgYXMgYSBiYXNpcywgc2VlIHRoZSB0aGUgcHJldmlvdXMgbm90ZQotICAgICBhYm91dCBtb2RfaW5jbHVkZS4gIFtEZWFuIEdhdWRldF0KLQotICAqKSBTRUNVUklUWTogSWYgYSBodGFjY2VzcyBmaWxlIGNhbiBub3QgYmUgcmVhZCBkdWUgdG8gYmFkIAotICAgICBwZXJtaXNzaW9ucywgZGVueSBhY2Nlc3MgdG8gdGhlIGRpcmVjdG9yeSB3aXRoIGEgSFRUUF9GT1JCSURERU4uICAKLSAgICAgVGhlIHByZXZpb3VzIGJlaGF2aW9yIHdhcyB0byBpZ25vcmUgdGhlIGh0YWNjZXNzIGZpbGUgaWYgaXQgY291bGQgbm90Ci0gICAgIGJlIHJlYWQuICBUaGlzIGNoYW5nZSBtYXkgbWFrZSBzb21lIHNldHVwcyB3aXRoIHVucmVhZGFibGUKLSAgICAgaHRhY2Nlc3MgZmlsZXMgc3RvcCB3b3JraW5nLiAgUFIjODE3ICBbTWFyYyBTbGVta29dCi0KLSAgKikgU0VDVVJJVFk6IG5vMnNsYXNoKCkgd2FzIE8obl4yKSBpbiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dC4gIAotICAgICBNYWtlIGl0IE8obikuICBUaGlzIGluZWZmaWNpZW5jeSBjb3VsZCBiZSB1c2VkIHRvIG1vdW50IGEgZGVuaWFsIAotICAgICBvZiBzZXJ2aWNlIGF0dGFjayBhZ2FpbnN0IHRoZSBBcGFjaGUgc2VydmVyLiAgVGhhbmtzIHRvIAotICAgICBNaWNoYWwgWmFsZXdza2kgPGxjYW10dWZAYm9zcy5zdGFzemljLndhdy5wbD4gZm9yIHJlcG9ydGluZwotICAgICB0aGlzLiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIG1vZF9pbmNsdWRlIHVzZWQgdW5pbml0aWFsaXplZCBkYXRhIGZvciBzb21lIHVzZXMgb2YgJiYgYW5kIHx8LgotICAgICBbQnJpYW4gU2xlc2luc2t5IDxic2xlc2luc0B3aXJlZC5jb20+XSBQUiMxMTM5Ci0KLSAgKikgbW9kX2ltYXAgc2hvdWxkIGRlY2xpbmUgYWxsIG5vbi1HRVQgbWV0aG9kcy4KLSAgICAgW0pheSBCbG9vZHdvcnRoIDxqYXlAcGF0aHdheXMuc2RlLnN0YXRlLnNjLnVzPl0KLQotICAqKSBzdWV4ZWMuYyB3b3VsZG4ndCBidWlsZCB3aXRob3V0IC1ETE9HX0VYRUMuIFtKYXNvbiBBLiBEb3VyXQotCi0gICopIG1vZF91c2VyZGlyIHdhcyBtb2RpZnlpbmcgci0+ZmluZm8gaW4gY2FzZXMgd2hlcmUgaXQgd2Fzbid0IHNldHRpbmcKLSAgICAgci0+ZmlsZW5hbWUuICBTaW5jZSB0aG9zZSB0d28gYXJlIG1lYW50IHRvIGJlIGluIHN5bmMgd2l0aCBlYWNoIG90aGVyCi0gICAgIHRoaXMgaXMgYSBidWcuICBbIlBhdWwgQi4gSGVuc29uIiA8aGVuc29uQGludHJhbmV0LmNzdXBvbW9uYS5lZHU+XQotCi0gICopIG1vZF9pbmNsdWRlIGRpZCBub3QgcHJvcGVybHkgaGFuZGxlIGFsbCBwb3NzaWJsZSByZWRpcmVjdHMgZnJvbSBzdWItCi0gICAgIHJlcXVlc3RzLiAgW0tlbiBDb2FyXQotCi0gICopIEluZXRkIG1vZGUgKHdoaWNoIGlzIGJ1Z2d5KSB1c2VzIHRpbWVvdXRzIHdpdGhvdXQgaGF2aW5nIHNldHVwIHRoZQotICAgICBqbXBidWZmZXIuIFtEZWFuIEdhdWRldF0gUFIjMTA2NAotCi0gICopIFdvcmsgYXJvdW5kIHByb2JsZW0gdW5kZXIgTGludXggd2hlcmUgYSBjaGlsZCB3aWxsIHN0YXJ0IGxvb3BpbmcKLSAgICAgcmVwb3J0aW5nIGEgc2VsZWN0IGVycm9yIG92ZXIgYW5kIG92ZXIuCi0gICAgIFtSaWNrIEZyYW5jaHVrIDxyaWNrZkB0cmFuc3BlY3QubmV0Pl0gUFIjMTEwNwotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDEuMi40Ci0KLSAgKikgVGhlIFByb3h5UmVtb3RlIGNoYW5nZSBpbiAxLjIuMyBpbnRyb2R1Y2VkIGEgYnVnIHJlc3VsdGluZyBpbiB0aGUgcHJveHkKLSAgICAgYWx3YXlzIG1ha2luZyByZXF1ZXN0cyB3aXRoIHRoZSBmdWxsLVVSSSBpbnN0ZWFkIG9mIGp1c3QgdGhlIFVSSSBwYXRoLgotICAgICBbTWFyYyBTbGVta28sIFJveSBGaWVsZGluZ10KLQotICAqKSBBZGQgLWxtIGZvciBBSVggdmVyc2lvbnMgPj0gNC4yIHRvIGFsbG93IEFwYWNoZSB0byBsaW5rIHByb3Blcmx5Ci0gICAgIG9uIHRoaXMgcGxhdGZvcm0uICBbTWFyYyBTbGVta29dCi0KLUNoYW5nZXMgd2l0aCBBcGFjaGUgMS4yLjMKLQotICAqKSBUaGUgcmVxdWVzdCB0byBhIHJlbW90ZSBwcm94eSB3YXMgbWFuZ2xlZCBpZiBpdCB3YXMgZ2VuZXJhdGVkIGFzIHRoZQotICAgICByZXN1bHQgb2YgYSBQcm94eVBhc3MgZGlyZWN0aXZlLiBVUkwgc2NoZW1lcyBvdGhlciB0aGFuIGh0dHA6Ly8gd2VyZSBub3QKLSAgICAgc3VwcG9ydGVkIHdoZW4gUHJveHlSZW1vdGUgd2FzIHVzZWQuIFBSIzI2MCwgUFIjNjU2LCBQUiM2OTksIFBSIzcxMywKLSAgICAgUFIjODEyIFtMYXJzIEVpbGVicmVjaHRdCi0KLSAgKikgRml4ZWQgcHJveHktcGFzcy10aHJvdWdoIGZlYXR1cmUgb2YgbW9kX3Jld3JpdGU7IEFkZGVkIGVycm9yIGxvZ2dpbmcKLSAgICAgaW5mb3JtYXRpb24gZm9yIGNhc2Ugd2hlcmUgcHJveHkgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUuIFtNYXJjIFNsZW1rb10KLQotICAqKSBGb3JjZSBwcm94eSB0byBhbHdheXMgcmVzcG9uZCBhcyBIVFRQLzEuMCwgd2hpY2ggaXQgd2FzIGZhaWxpbmcgdG8KLSAgICAgZG8gZm9yIGVycm9ycyBhbmQgY2FjaGVkIHJlc3BvbnNlcy4gIFtSb3kgRmllbGRpbmddCi0KLSAgKikgUE9SVDogSW1wcm92ZWQgc3VwcG9ydCBmb3IgQ29udmV4T1MgMTEuICBbSmVmZiBWZW50ZXJzXQotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDEuMi4yIFtub3QgcmVsZWFzZWRdCi0KLSAgKikgRml4ZWQgYW5vdGhlciBsb25nLXN0YW5kaW5nIGJ1ZyBpbiBzdWJfcmVxX2xvb2t1cF9maWxlIHdoZXJlIGl0IHdvdWxkCi0gICAgIGhhcHBpbHkgc2tpcCBwYXN0IGFjY2VzcyBjaGVja3Mgb24gc3ViZGlyZWN0b3JpZXMgbG9va2VkIHVwIHdpdGggcmVsYXRpdmUKLSAgICAgcGF0aHMuICAoSXQncyB1c2VkIGJ5IG1vZF9kaXIsIG1vZF9uZWdvdGlhdGlvbiwgYW5kIG1vZF9pbmNsdWRlLikKLSAgICAgW0RlYW4gR2F1ZGV0XQotCi0gICopIEFkZCBsb2NrZmlsZSBuYW1lIHRvIGVycm9yIG1lc3NhZ2UgcHJpbnRlZCBvdXQgd2hlbgotICAgICBVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQgaXMgZGVmaW5lZC4KLSAgICAgW01hcmMgU2xlbWtvXQotCi0gICopIEVuaGFuY2VkIHRoZSBjaHVua2luZyBhbmQgZXJyb3IgaGFuZGxpbmcgaW5zaWRlIHRoZSBidWZmZXIgZnVuY3Rpb25zLgotICAgICBbRGVhbiBHYXVkZXQsIFJveSBGaWVsZGluZ10KLQotICAqKSBXaGVuIG1lcmdpbmcgdGhlIG1haW4gc2VydmVyJ3MgPERpcmVjdG9yeT4gYW5kIDxMb2NhdGlvbj4gc2VjdGlvbnMgaW50bwotICAgICBhIHZob3N0LCBwdXQgdGhlIG1haW4gc2VydmVyJ3MgZmlyc3QgYW5kIHRoZSB2aG9zdCdzIHNlY29uZC4gIE90aGVyd2lzZQotICAgICB0aGUgdmhvc3QgY2FuJ3Qgb3ZlcnJpZGUgdGhlIG1haW4gc2VydmVyLiAgW0RlYW4gR2F1ZGV0XSBQUiM3MTcKLQotICAqKSBUaGUgPERpcmVjdG9yeT4gY29kZSB3b3VsZCBtZXJnZSBhbmQgcmUtbWVyZ2UgdGhlIHNhbWUgc2VjdGlvbiBhZnRlcgotICAgICBhIG1hdGNoIHdhcyBmb3VuZCwgcG9zc2libHkgY2F1c2luZyBwcm9ibGVtcyB3aXRoIHNvbWUgbW9kdWxlcy4KLSAgICAgW0RlYW4gR2F1ZGV0XQotCi0gICopIEZpeGVkIGFuIGluZmluaXRlIGxvb3AgaW4gbW9kX2ltYXAgZm9yIHJlZmVyZW5jZXMgYWJvdmUgdGhlIHNlcnZlciByb290LgotICAgICBbRGVhbiBHYXVkZXRdIFBSIzc0OAotCi0gICopIG1vZF9pbmNsdWRlIGNsZWFudXAgc2hvd2VkIHRoYXQgaGFuZGxlX2Vsc2Ugd2FzIGJlaW5nIHVzZWQgdG8gaGFuZGxlCi0gICAgIGVuZGlmLiAgSXQgZGlkbid0IGNhdXNlIHByb2JsZW1zLCBidXQgaXQgd2FzIGNsZWFuZWQgdXAgdG9vLgotICAgICBbSG93YXJkIEZlYXJdCi0KLSAgKikgTGFzdCBvZmZpY2lhbCBzeW5jaHJvbml6YXRpb24gb2YgbW9kX3Jld3JpdGUgd2l0aCBhdXRob3IgdmVyc2lvbiAoYmVjYXVzZQotICAgICBtb2RfcmV3cml0ZSBpcyBub3cgZGlyZWN0bHkgZGV2ZWxvcGVkIGJ5IHRoZSBhdXRob3IgYXQgdGhlIEFwYWNoZSBHcm91cCk6Ci0gICAgIG8gYWRkZWQgZGlmZiBiZXR3ZWVuIG1vZF9yZXdyaXRlIDMuMC42KyBhbmQgMy4wLjkKLSAgICAgICBtaW51cyBXSU4zMi9OVCBzdHVmZiwgYnV0IHBsdXMgY29weXJpZ2h0IHJlbW92ZW1lbnQuCi0gICAgICAgSW4gZGV0YWlsOgotICAgICAgIC0gd29ya2Fyb3VuZCBmb3IgZGV0ZWN0aW5nIGluZmluaXRlIHJld3JpdGluZyBsb29wcwotICAgICAgIC0gZml4ZWQgc2V0dGluZyBvZiBlbnYgdmFycyB3aGVuICItIiBpcyB1c2VkIGFzIHN1YnN0IHN0cmluZwotICAgICAgIC0gZml4ZWQgZm9yY2VkIHJlc3BvbnNlIGNvZGUgb24gcmVkaXJlY3RzIChQUiM3NzcpCi0gICAgICAgLSBmaXhlZCBjYXNlcyB3aGVyZSByLT5hcmdzIGlzICIiCi0gICAgICAgLSBrbHVkZ2UgdG8gZGlzYWJsZSBsb2NraW5nIG9uIHBpcGVzIHVuZGVyIGJyYWluZGVhZCBTdW5PUwotICAgICAgIC0gZml4IGZvciByZXdyaXRlbG9nIGluIGNhc2VzIHdoZXJlIHJlbW90ZSBob3N0bmFtZSBpcyB1bmtub3duCi0gICAgICAgLSBmaXhlZCB0b3RhbGx5IGRhbWFnZWQgcmVxdWVzdF9yZWMgd2Fsay1iYWNrIGxvb3AKLSAgICAgbyByZW1vdmUgc3RhdGljIGZyb20gbG9jYWwgZGF0YSBhbmQgYWRkIHN0YXRpYyB0byBnbG9iYWwgb25lcy4KLSAgICAgbyByZXBsYWNlZCB1Z2x5IHByb3h5IGZpbmRpbmcgc3R1ZmYgYnkgc2ltcGxlCi0gICAgICAgZmluZF9saW5rZWRfbW9kdWxlKCJtb2RfcHJveHkiKSBjYWxsLgotICAgICBvIGFkZGVkIG1pc3NpbmcgbmVnYXRpb24gY2hhciBvbiByZXdyaXRlbG9nKCkKLSAgICAgbyBmaXhlZCBhIGZldyBjb21tZW50IHR5cG9zCi0gICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIEFub255bW91c19Mb2dFbWFpbCB3YXMgbG9nZ2luZyBvbiBlYWNoIHN1YnJlcXVlc3QuCi0gICAgIFtEZWFuIEdhdWRldF0gUFIjNDIxLCBQUiM4NjgKLQotICAqKSAiZm9yY2UtcmVzcG9uc2UtMS4wIiBub3cgb25seSBhcHBsaWVzIHRvIHJlcXVlc3RzIHdoaWNoIGFyZSBIVFRQLzEuMCB0bwotICAgICBiZWdpbiB3aXRoLiAgIm5va2VlcGFsaXZlIiBub3cgd29ya3MgZm9yIEhUVFAvMS4xIGNsaWVudHMuICBBZGRlZAotICAgICAiZG93bmdyYWRlLTEuMCIgd2hpY2ggY2F1c2VzIEFwYWNoZSB0byBwcmV0ZW5kIGl0IHJlY2VpdmVkIGEgMS4wLgotICAgICBBZGRpdGlvbmFsbHkgbW9kX2Jyb3dzZXIgbm93IHRyaWdnZXJzIGR1cmluZyB0cmFuc2xhdGVfbmFtZSB0byB3b3JrYXJvdW5kCi0gICAgIGEgZGVmaWNpZW5jeSBpbiB0aGUgaGVhZGVyX3BhcnNlIHBoYXNlLgotICAgICBbRGVhbiBHYXVkZXRdIFBSIzg3NQotCi0gICopIGdldF9jbGllbnRfYmxvY2soKSByZXR1cm5zIHdyb25nIGxlbmd0aCBpZiBwb2xpY3kgaXMgCi0gICAgIFJFUVVFU1RfQ0hVTktFRF9ERUNIVU5LLgotICAgICBbS2VuaWNoaSBIb3JpIDxrZW5AZDIuYnMxLmZjLm5lYy5jby5qcD5dIFBSIzgxNQotCi0gICopIFByb3Blcmx5IHRyZWF0IDxmaWxlcz4gY29udGFpbmVyIGxpa2Ugb3RoZXIgY29udGFpbmVycyBpbiBtb2RfaW5mby4KLSAgICAgW01hcmMgU2xlbWtvXSBQUiM4NDgKLQotICAqKSBUaGUgcHJveHkgZGlkbid0IHRyZWF0IHRoZSAiSG9zdDoiIGtleXdvcmQgb2YgdGhlIGhvc3QgaGVhZGVyIGFzIGNhc2UtCi0gICAgIGluc2Vuc2l0aXZlLiAgVGhlIHByb3h5IHdvdWxkIGNvcnJ1cHQgdGhlIGZpcnN0IGxpbmUgb2YgYSByZXNwb25zZSBmcm9tCi0gICAgIGFuIEhUVFAvMC45IHNlcnZlci4gIFtLZW5pY2hpIEhvcmkgPGtlbkBkMi5iczEuZmMubmVjLmNvLmpwPl0gUFIjODEzLDgxNAotCi0gICopIG1vZF9pbmNsdWRlIHdvdWxkIGxvZyBzb21lIGJvZ3VzIHZhbHVlcyBvY2Nhc2lvbmFsbHkuCi0gICAgIFtTa2lwIE1vbnRhbmFybyA8c2tpcEBjYWxlbmRhci5jb20+LCBNYXJjIFNsZW1rb10gUFIjNzk3Ci0KLSAgKikgUE9SVDogVGhlIHNsYWNrIGZkIGNoYW5nZXMgaW4gMS4yLjEgaW50cm9kdWNlZCBhIHByb2JsZW0gd2l0aCBTSUdIVVAKLSAgICAgdW5kZXIgU29sYXJpcyAyLnggKHVwIHRocm91Z2ggMi41LjEpLiAgSXQgaGFzIGJlZW4gZml4ZWQuCi0gICAgIFtEZWFuIEdhdWRldF0gUFIjODMyCi0KLSAgKikgQVBJOiBJbiBIVFRQLzEuMSwgd2hldGhlciBvciBub3QgYSByZXF1ZXN0IG1lc3NhZ2UgY29udGFpbnMgYSBib2R5Ci0gICAgIGlzIGluZGVwZW5kZW50IG9mIHRoZSByZXF1ZXN0IG1ldGhvZCBhbmQgYmFzZWQgc29sZWx5IG9uIHRoZSBwcmVzZW5jZQotICAgICBvZiBhIENvbnRlbnQtTGVuZ3RoIG9yIFRyYW5zZmVyLUVuY29kaW5nLiAgVGhlcmVmb3JlLCBvdXIgZGVmYXVsdAotICAgICBoYW5kbGVycyBuZWVkIHRvIGJlIHByZXBhcmVkIHRvIHJlYWQgYSBib2R5IGV2ZW4gaWYgdGhleSBkb24ndCBrbm93Ci0gICAgIHdoYXQgdG8gZG8gd2l0aCBpdDsgb3RoZXJ3aXNlLCB0aGUgYm9keSB3b3VsZCBiZSBtaXN0YWtlbiBmb3IgdGhlCi0gICAgIG5leHQgcmVxdWVzdCBvbiBhIHBlcnNpc3RlbnQgY29ubmVjdGlvbi4gIGRpc2NhcmRfcmVxdWVzdF9ib2R5KCkKLSAgICAgaGFzIGJlZW4gYWRkZWQgdG8gdGFrZSBjYXJlIG9mIHRoYXQuICBbUm95IEZpZWxkaW5nXSBQUiMzNzgKLQotICAqKSBBUEk6IFN5bWJvbCBBUEFDSEVfUkVMRUFTRSBwcm92aWRlcyBhIG51bWVyaWMgZm9ybSBvZiB0aGUgQXBhY2hlCi0gICAgIHJlbGVhc2UgdmVyc2lvbiBudW1iZXIsIHN1Y2ggdGhhdCBpdCBhbHdheXMgaW5jcmVhc2VzIGFsb25nIHRoZQotICAgICBzYW1lIGxpbmVzIGFzIG91ciBzb3VyY2UgY29kZSBicmFuY2hpbmcuICBbUm95IEZpZWxkaW5nXQotCi0gICopIE1pbm9yIG92ZXJzaWdodCBvbiBtdWx0aXBsZSB2YXJpYW50cyBmaXhlZC4gIFtQYXVsIFN1dHRvbl0gUFIjOTQKLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjIuMQotCi0gICopIFNFQ1VSSVRZOiBEb24ndCBzZXJ2ZSBmaWxlIHN5c3RlbSBvYmplY3RzIHVubGVzcyB0aGV5IGFyZSBwbGFpbiBmaWxlcywKLSAgICAgc3ltbGlua3MsIG9yIGRpcmVjdG9yaWVzLiAgVGhpcyBwcmV2ZW50cyBsb2NhbCB1c2VycyBmcm9tIHVzaW5nIHBpcGVzCi0gICAgIG9yIG5hbWVkIHNvY2tldHMgdG8gaW52b2tlIHByb2dyYW1zIGZvciBhbiBleHRyZW1lbHkgY3J1ZGUgZm9ybSBvZgotICAgICBDR0kuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgU0VDVVJJVFk6IEhlYWRlck5hbWUgYW5kIFJlYWRtZU5hbWUgd2VyZSBzZXR0YWJsZSBpbiAuaHRhY2Nlc3MgYW5kCi0gICAgIGNvdWxkIGNvbnRhaW4gIi4uLyIgYWxsb3dpbmcgYSBsb2NhbCB1c2VyIHRvICJwdWJsaXNoIiBhbnkgZmlsZSBvbgotICAgICB0aGUgc3lzdGVtLiAgTm8gc2xhc2hlcyBhcmUgYWxsb3dlZCBub3cuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgU0VDVVJJVFk6IEl0IHdhcyBwb3NzaWJsZSB0byB2aW9sYXRlIHRoZSBzeW1saW5rIE9wdGlvbnMgdXNpbmcgbW9kX2RpcgotICAgICAoaGVhZGVycywgcmVhZG1lcywgdGl0bGVzKSwgbW9kX25lZ290aWF0aW9uICh0eXBlIG1hcHMpLCBvcgotICAgICBtb2RfY2Vybl9tZXRhIChtZXRhIGZpbGVzKS4gIFtEZWFuIEdhdWRldF0KLQotICAqKSBTRUNVUklUWTogQXBhY2hlIHdpbGwgcmVmdXNlIHRvIHJ1biBhcyAiVXNlciByb290IiB1bmxlc3MKLSAgICAgQklHX1NFQ1VSSVRZX0hPTEUgaXMgZGVmaW5lZCBhdCBjb21waWxlIHRpbWUuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgQ09ORklHOiBJZiBhIHN5bWxpbmsgcG9pbnRlZCB0byBhIGRpcmVjdG9yeSB0aGVuIGl0IHdvdWxkIGJlIGRpc2FsbG93ZWQKLSAgICAgaWYgaXQgY29udGFpbmVkIGEgLmh0YWNjZXNzIGRpc2FsbG93aW5nIHN5bWxpbmtzLiAgVGhpcyBpcyBjb250cmFyeQotICAgICB0byB0aGUgcnVsZSB0aGF0IHN5bWxpbmsgcGVybWlzc2lvbnMgYXJlIHRlc3RlZCB3aXRoIHRoZSBzeW1saW5rCi0gICAgIG9wdGlvbnMgb2YgdGhlIHBhcmVudCBkaXJlY3RvcnkuICBbRGVhbiBHYXVkZXRdIFBSIzM1MwotCi0gICopIENPTkZJRzogVGhlIExvY2tGaWxlIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBwbGFjZSB0aGUgc2VyaWFsaXppbmcKLSAgICAgbG9ja2ZpbGUgaW4gYW55IGxvY2F0aW9uLiAgSXQgcHJldmlvdXNseSBkZWZhdWx0ZWQgdG8gL3Vzci90bXAvaHRsb2NrLgotICAgICBbU29tZWhvdyBpdCB0b29rIGZvdXIgb2YgdXM6IFJhbmR5IFRlcmJ1c2gsIEppbSBKYWdpZWxza2ksIERlYW4gR2F1ZGV0LAotICAgICBNYXJjIFNsZW1rb10KLQotICAqKSBSZXF1ZXN0IHByb2Nlc3Npbmcgbm93IHJldGFpbnMgc3RhdGUgb2Ygd2hldGhlciBvciBub3QgdGhlIHJlcXVlc3QKLSAgICAgYm9keSBoYXMgYmVlbiByZWFkLCBzbyB0aGF0IGludGVybmFsIHJlZGlyZWN0cyBhbmQgc3VicmVxdWVzdHMgd2lsbAotICAgICBub3QgdHJ5IHRvIHJlYWQgaXQgdHdpY2UgKGFuZCBibG9jaykuIFtSb3kgRmllbGRpbmddCi0KLSAgKikgQWRkIGEgcGxhY2Vob2xkZXIgaW4gbW9kdWxlcy9NYWtlZmlsZSB0byBhdm9pZCBlcnJvcnMgd2l0aCBjZXJ0YWluCi0gICAgIG1ha2VzLiBbTWFyYyBTbGVta29dCi0KLSAgKikgUVVFUllfU1RSSU5HIHdhcyB1bmVzY2FwZWQgaW4gbW9kX2luY2x1ZGUsIGl0IHNob3VsZG4ndCBiZS4KLSAgICAgW0RlYW4gR2F1ZGV0XSBQUiM2NDQKLQotICAqKSBtb2RfaW5jbHVkZSB3YXMgbm90IHByb3Blcmx5IGNoYW5naW5nIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KLSAgICAgW01hcmMgU2xlbWtvXSBQUiM3NDIKLQotICAqKSBBdHRlbXB0IHRvIHdvcmsgYXJvdW5kIHByb2JsZW1zIHdpdGggdGhpcmQgcGFydHkgbGlicmFyaWVzIHRoYXQgZG8gbm90Ci0gICAgIGhhbmRsZSBoaWdoIG51bWJlcmVkIGRlc2NyaXB0b3JzIChleGFtcGxlcyBpbmNsdWRlIGJpbmQsIGFuZAotICAgICBzb2xhcmlzIGxpYmMpLiAgT24gYWxsIHN5c3RlbXMgYXBhY2hlIGF0dGVtcHRzIHRvIGtlZXAgYWxsIHBlcm1hbmVudAotICAgICBkZXNjcmlwdG9ycyBhYm92ZSAxNSAoY2FsbGVkIHRoZSBsb3cgc2xhY2sgbGluZSkuICBTb2xhcmlzIHVzZXJzCi0gICAgIGNhbiBhbHNvIGJlbmVmaXQgZnJvbSBhZGRpbmcgLURISUdIX1NMQUNLX0xJTkU9MjU2IHRvIEVYVFJBX0NGTEFHUwotICAgICB3aGljaCBrZWVwcyBhbGwgbm9uLUZJTEUgKiBkZXNjcmlwdG9ycyBhYm92ZSAyNTUuICBPbiBhbGwgc3lzdGVtcwotICAgICB0aGlzIHNob3VsZCBtYWtlIHN1cHBvcnRpbmcgbGFyZ2UgbnVtYmVycyBvZiB2aG9zdHMgd2l0aCBtYW55IG9wZW4KLSAgICAgbG9nIGZpbGVzIG1vcmUgZmVhc2libGUuICBJZiB0aGlzIGNhdXNlcyB0cm91YmxlIHBsZWFzZSByZXBvcnQgaXQsCi0gICAgIHlvdSBjYW4gZGlzYWJsZSB0aGlzIHdvcmthcm91bmQgYnkgYWRkaW5nIC1ETk9fU0xBQ0sgdG8gRVhUUkFfQ0ZMQUdTLgotICAgICBbRGVhbiBHYXVkZXRdIHZhcmlvdXMgUFJzCi0KLSAgKikgUmVsYXRlZCB0byB0aGUgbGFzdCBlbnRyeSwgbmV0d29yayBzb2NrZXRzIGFyZSBub3cgb3BlbmVkIGJlZm9yZQotICAgICBsb2cgZmlsZXMgYXJlIG9wZW5lZC4gIFRoZSBvbmx5IGtub3duIGNhc2Ugd2hlcmUgdGhpcyBjYW4gY2F1c2UKLSAgICAgcHJvYmxlbXMgaXMgdW5kZXIgU29sYXJpcyB3aXRoIG1hbnkgdmlydHVhbGhvc3RzIGFuZCBtYW55IExpc3RlbgotICAgICBkaXJlY3RpdmVzLiAgQnV0IHVzaW5nIC1ESElHSF9TTEFDS19MSU5FPTI1NiBkZXNjcmliZWQgYWJvdmUgd2lsbAotICAgICB3b3JrIGFyb3VuZCB0aGlzIHByb2JsZW0uICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgVVNFX0ZMT0NLX1NFUklBTElaRURfQUNDRVBUIGlzIG5vdyBkZWZhdWx0IGZvciBGcmVlQlNELCBBL1VYLCBhbmQKLSAgICAgU3VuT1MgNC4KLQotICAqKSBJbXByb3ZlZCB1bml4IGVycm9yIHJlc3BvbnNlIGxvZ2dpbmcuICBbTWFyYyBTbGVta29dCi0KLSAgKikgVXBkYXRlIG1vZF9yZXdyaXRlIGZyb20gMy4wLjUgdG8gMy4wLjYuICBOZXcgcnVsZWZsYWcKLSAgICAgUVNBPXF1ZXJ5X3N0cmluZ19hcHBlbmQuICBBbHNvIGZpeGVkIGEgbmFzdHkgYnVnIGluIHBlci1kaXIgY29udGV4dDoKLSAgICAgd2hlbiBhIFVSTCBodHRwOi8vLi4uIHdhcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYSBzcGVjaWFsCi0gICAgIHJlZGlyZWN0IGZsYWcsIGUuZy4gUj1wZXJtYW5lbnQsIHRoZSBwZXJtYW5lbnQgc3RhdHVzIHdhcyBsb3N0LgotICAgICBbUm9uYWxkIFRzY2hhbGFlciA8Um9uYWxkLlRzY2hhbGFlckBwc2kuY2g+LCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXQotCi0gICopIElmIGFuIG9iamVjdCBoYXMgbXVsdGlwbGUgdmFyaWFudHMgdGhhdCBhcmUgb3RoZXJ3aXNlIGVxdWFsIEFwYWNoZQotICAgICB3b3VsZCBwcmVmZXIgdGhlIGxhc3QgbGlzdGVkIHZhcmlhbnQgcmF0aGVyIHRoYW4gdGhlIGZpcnN0LgotICAgICBbUGF1bCBTdXR0b25dIFBSIzk0Ci0KLSAgKikgIm1ha2UgY2xlYW4iIGF0IHRoZSB0b3AgbGV2ZWwgbm93IHJlbW92ZXMgKi5vLiAgW0RlYW4gR2F1ZGV0XSBQUiM3NTIKLQotICAqKSBtb2Rfc3RhdHVzIGR1bXBzIGNvcmUgaW4gaW5ldGQgbW9kZS4gIFtNYXJjIFNsZW1rbyBhbmQgUm95IEZpZWxkaW5nXQotICAgICBQUiM1NjYKLQotICAqKSBwcmVnc3ViIGhhZCBhbiBvZmYtYnktMSBpbiBpdHMgZXJyb3IgY2hlY2tpbmcgY29kZS4gW0FsZXhlaSBLb3N1dF0KLQotICAqKSBQT1JUOiBmaXggcmxpbV90IHByb2JsZW1zIHdpdGggQUlYIDQuMi4gW01hcmMgU2xlbWtvXSBQUiMzMzMKLQotICAqKSBQT1JUOiBVcGRhdGUgVW5peFdhcmUgc3VwcG9ydCBmb3IgMi4xLjIuCi0gICAgIFtMYXdyZW5jZSBSb3Nlbm1hbiA8bGVyQGxlcmN0ci5vcmc+XSBQUiM1MTEKLQotICAqKSBQT1JUOiBOb25TdG9wLVVYIFtKb2FjaGltIFNjaG1pdHogPHNjaG1pdHpfam9hY2hpbUB0YW5kZW0uY29tPl0gUFIjMzI3Ci0KLSAgKikgUE9SVDogVXBkYXRlIENvbnZleE9TIHN1cHBvcnQgZm9yIDExLjUuCi0gICAgIFtEYXZpZCBEZVNpbW9uZSA8Zm94QGNvbnZleC5jb20+XSBQUiMzOTkKLQotICAqKSBQT1JUOiBTdXBwb3J0IGZvciBERUMgY2MgY29tcGlsZXIgdW5kZXIgVUxUUklYLgotICAgICBbIlAuIEFsZWphbmRybyBMb3Blei1WYWxlbmNpYSIgPGFsZWpvbG9AaWRlYW0uZ292LmNvPl0gUFIjMzg4Ci0KLSAgKikgUE9SVDogU3VwcG9ydCBmb3IgTWF4aW9uL09TIFNWUjQuMiBSZWFsIFRpbWUgVW5peC4gW25vIG5hbWUgZ2l2ZW5dIFBSIzM4MwotCi0gICopIFBPUlQ6IFdvcmthcm91bmQgZm9yIEFJWCAzLnggY29tcGlsZXIgYnVnIGluIGh0dHBfYnByaW50Zi5jLiAgCi0gICAgIFtNYXJjIFNsZW1rb10gUFIjNzI1Ci0KLSAgKikgUE9SVDogZml4IHByb2JsZW0gY29tcGlsaW5nIGh0dHBfYnByaW50Zi5jIHdpdGggZ2NjIHVuZGVyIFNDTwotICAgICBbTWFyYyBTbGVta29dIFBSIzY5NQotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDEuMgotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDEuMmIxMQotCi0gICopIEZpeGVkIG9wZW4gdGltZXN0YW1wIGZkIGluIHByb3h5X2NhY2hlLmMgW0NodWNrIE11cmNrb10KLQotICAqKSBBZGRlZCB1bmRvY3VtZW50ZWQgcGVybCBTU0kgbWVjaGFuaXNtIGZvciAtRFVTRV9QRVJMX1NTSSBhbmQgbW9kX3BlcmwuCi0gICAgIFtEb3VnIE1hY0VhY2hlcm4sIFJvYiBIYXJ0aWxsXQotCi0gICopIFByb3h5IG5lZWRzIHRvIHVzZSBoYXJkX3RpbWVvdXQgaW5zdGVhZCBvZiBzb2Z0X3RpbWVvdXQgd2hlbiBpdCBpcwotICAgICByZWFkaW5nIGZyb20gb25lIGJ1ZmZlciBhbmQgd3JpdGluZyB0byBhbm90aGVyLCBhdCBsZWFzdCB1bnRpbCBpdCBoYXMKLSAgICAgYSBjdXN0b20gdGltZW91dCBoYW5kbGVyLiAgW1JveSBGaWVsZGluZyBhbmQgUGV0ciBMYW1wYV0KLQotICAqKSBGaXhlZCBwcm9ibGVtIG9uIElSSVggd2l0aCBzZXJ2ZXJzIGhhbmdpbmcgaW4gSWRlbnRpdHlDaGVjaywKLSAgICAgYXBwYXJlbnRseSBkdWUgdG8gYSBtaXNtYXRjaCBiZXR3ZWVuIHNpZ2FjdGlvbiBhbmQgc2V0am1wLgotICAgICBbUm95IEZpZWxkaW5nXSBQUiM1MDIKLQotICAqKSBMb2cgY29ycmVjdCBzdGF0dXMgY29kZSBpZiB3ZSB0aW1lb3V0IGJlZm9yZSByZWNlaXZpbmcgYSByZXF1ZXN0ICg0MDgpCi0gICAgIG9yIGlmIHdlIHJlY2VpdmVkIGEgcmVxdWVzdC1saW5lIHRoYXQgd2FzIHRvbyBsb25nIHRvIHByb2Nlc3MgKDQxNCkuCi0gICAgIFtFZCBLb3J0aG9mIGFuZCBSb3kgRmllbGRpbmddIFBSIzYwMQotCi0gICopIFZpcnR1YWwgaG9zdHMgd2l0aCB0aGUgc2FtZSBTZXJ2ZXJOYW1lLCBidXQgb24gZGlmZmVyZW50IHBvcnRzLCB3ZXJlCi0gICAgIG5vdCBiZWluZyBzZWxlY3RlZCBwcm9wZXJseS4gIFtFZCBLb3J0aG9mXQotCi0gICopIEFkZGVkIGNvZGUgdG8gcmV0dXJuIHRoZSByZXF1ZXN0ZWQgSVAgYWRkcmVzcyBmcm9tIHByb3h5X2hvc3QyYWRkcigpCi0gICAgIGlmIGdldGhvc3RieWFkZHIoKSBmYWlscyBkdWUgdG8gcmV2ZXJzZSBETlMgbG9va3VwIHByb2JsZW1zLiBPcmlnaW5hbAotICAgICBjaGFuZ2Ugc3VibWl0dGVkIGJ5IEpvenNlZiBIb2xsb3NpIDxob2xsb3NpQHNiY20uY29tPi4KLSAgICAgW0NodWNrIE11cmNrb10gUFIjNjE0Ci0KLSAgKikgSWYgbXVsdGlwbGUgcmVxdWVzdHMgb24gYSBzaW5nbGUgY29ubmVjdGlvbiBhcmUgdXNlZCB0byByZXRyaWV2ZQotICAgICBkYXRhIGZyb20gZGlmZmVyZW50IHZpcnR1YWwgaG9zdHMsIHRoZSB2aXJ0dWFsIGhvc3QgbGlzdCB3b3VsZCBiZQotICAgICBzY2FubmVkIHN0YXJ0aW5nIHdpdGggdGhlIG1vc3QgcmVjZW50bHkgdXNlZCBWSCBpbnN0ZWFkIG9mIHRoZSBmaXJzdCwKLSAgICAgY2F1c2luZyBtb3N0IHZpcnR1YWwgaG9zdHMgdG8gYmUgaWdub3JlZC4KLSAgICAgW1BhdWwgU3V0dG9uIGFuZCBNYXJ0aW4gTWFyZXNdIFBSIzYxMAotCi0gICopIFRoZSBPUy8yIGhhbmRsaW5nIG9mIHByb2Nlc3MgZ3JvdXAgd2FzIGJyb2tlbiBieSBhIHBvcnRpbmcgcGF0Y2ggZm9yCi0gICAgIE1QRSwgc28gcmVzdG9yZWQgcHJpb3IgY29kZSBmb3IgT1MvMi4gIFtSb3kgRmllbGRpbmcgYW5kIEdhcmV5IFNtaWxleV0KLQotICAqKSBJbmhlcml0IHZpcnR1YWwgc2VydmVyIHBvcnQgZnJvbSBtYWluIHNlcnZlciBpZiBub25lIChvciAiKiIpIGlzCi0gICAgIGdpdmVuIGZvciBWaXJ0dWFsSG9zdC4gIFtEZWFuIEdhdWRldF0gUFIjNTc2Ci0KLSAgKikgSWYgdGhlIGxvb2t1cCBmb3IgYSBEaXJlY3RvcnlJbmRleCBuYW1lIHdpdGggY29udGVudCBuZWdvdGlhdGlvbgotICAgICBoYXMgZm91bmQgbWF0Y2hpbmcgdmFyaWFudHMsIGJ1dCBub25lIGFyZSBhY2NlcHRhYmxlLCByZXR1cm4gdGhlCi0gICAgIG5lZ290aWF0aW9uIHJlc3VsdCBpZiB0aGVyZSBhcmUgbm8gbW9yZSBEaXJlY3RvcnlJbmRleCBuYW1lcyB0byBsb29rdXAuCi0gICAgIFtQZXRyIExhbXBhIGFuZCBSb3kgRmllbGRpbmddCi0KLSAgKikgSWYgYSBzb2Z0X3RpbWVvdXQgb2NjdXJzIGFmdGVyIGtlZXBhbGl2ZSBpcyBzZXQsIHRoZW4gdGhlIG1haW4gY2hpbGQKLSAgICAgbG9vcCB3b3VsZCB0cnkgdG8gcmVhZCBhbm90aGVyIHJlcXVlc3QgZXZlbiB0aG91Z2ggdGhlIGNvbm5lY3Rpb24KLSAgICAgaGFzIGJlZW4gYWJvcnRlZC4gIFtSb3kgRmllbGRpbmddCi0KLSAgKikgQ29uZmlndXJlIGNoYW5nZXM6IEFsbG93IGZvciB3aGl0ZXNwYWNlIGF0IHRoZSBzdGFydCBvZiBhCi0gICAgIE1vZHVsZSBkZWNsYXJhdGlvbi4gQWxzbywgYmUgbW9yZSB1bmRlcnN0YW5kaW5nIGFib3V0IHRoZQotICAgICBDQz0vT1BUSU09IGZvcm1hdCBpbiBDb25maWd1cmF0aW9uLiBGaW5hbGx5LCBmaXggY29tcGlsZXIKLSAgICAgZmxhZ3MgaWYgdXNpbmcgSFAtVVgncyBjYyBjb21waWxlci4gW0ppbSBKYWdpZWxza2ldCi0KLSAgKikgU3VicmVxdWVzdHMgYW5kIGludGVybmFsIHJlZGlyZWN0cyBub3cgaW5oZXJpdCB0aGVfcmVxdWVzdCBmcm9tIHRoZQotICAgICBvcmlnaW5hbCByZXF1ZXN0LWxpbmUuIFtSb3kgRmllbGRpbmddCi0KLSAgKikgVGVzdCBmb3IgZXJyb3IgY29uZGl0aW9ucyBiZWZvcmUgY3JlYXRpbmcgb3V0cHV0IGhlYWRlciBmaWVsZHMsIHNpbmNlCi0gICAgIHdlIGRvbid0IHdhbnQgdGhlIGVycm9yIG1lc3NhZ2UgdG8gaW5jbHVkZSB0aG9zZSBmaWVsZHMuICBMaWtld2lzZSwKLSAgICAgcmVzZXQgdGhlIGNvbnRlbnRfbGFuZ3VhZ2UocykgYW5kIGNvbnRlbnRfZW5jb2Rpbmcgb2YgdGhlIHJlc3BvbnNlCi0gICAgIGJlZm9yZSBnZW5lcmF0aW5nIG9yIHJlZGlyZWN0aW5nIHRvIGFuIGVycm9yIG1lc3NhZ2UsIHNpbmNlIHRoZSBuZXcKLSAgICAgbWVzc2FnZSB3aWxsIGhhdmUgaXRzIG93biBDb250ZW50LSogZGVmaW5pdGlvbnMuIFtEZWFuIEdhdWRldF0KLQotICAqKSBSZXN0b3JlZCB0aGUgc2VtYW50aWNzIG9mIGhlYWRlcnNfb3V0IChoZWFkZXJzIHNlbnQgb25seSB3aXRoIDIwMC4uMjk5Ci0gICAgIGFuZCAzMDQgcmVzcG9uc2VzKSBhbmQgZXJyX2hlYWRlcnNfb3V0IChoZWFkZXJzIHNlbnQgd2l0aCBhbGwgcmVzcG9uc2VzKS4KLSAgICAgQXZvaWQgdGhlIG92ZXJoZWFkIG9mIGNvcHlpbmcgdGFibGVzIGlmIGVycl9oZWFkZXJzX291dCBpcyBlbXB0eQotICAgICAodGhlIHVzdWFsIGNhc2UpLiAgW1JveSBGaWVsZGluZ10KLQotICAqKSBGaXhlZCBhIGNvdXBsZSBwbGFjZXMgd2hlcmUgYSBjaGVjayBmb3IgdGhlIGRlZmF1bHQgQ29udGVudC1UeXBlIHdhcwotICAgICBub3QgcHJvcGVybHkgY2hlY2tpbmcgYm90aCB0aGUgdmFsdWUgY29uZmlndXJlZCBieSB0aGUgRGVmYXVsdFR5cGUKLSAgICAgZGlyZWN0aXZlIGFuZCB0aGUgREVGQVVMVF9UWVBFIHN5bWJvbCBpbiBodHRwZC5oLiAgQ2hhbmdlZCB0aGUgdmFsdWUKLSAgICAgb2YgREVGQVVMVF9UWVBFIHRvIG1hdGNoIHRoZSBkb2N1bWVudGVkIGRlZmF1bHQgKHRleHQvcGxhaW4pLgotICAgICBbRGVhbiBHYXVkZXRdIFBSIzUwNgotCi0gICopIEVzY2FwZSB0aGUgSFRNTC1zZW5zaXRpdmUgY2hhcmFjdGVycyBpbiB0aGUgUmVxdWVzdC1VUkkgdGhhdCBpcwotICAgICBvdXRwdXQgZm9yIGVhY2ggY2hpbGQgYnkgbW9kX3N0YXR1cy4gW0RlYW4gR2F1ZGV0IGFuZCBLZW4gQ29hcl0gUFIjNTAxCi0KLSAgKikgUHJvcGVybHkgaW5pdGlhbGl6ZSB0aGUgZmxvY2sgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBtdXRleCBsb2NraW5nCi0gICAgIGFyb3VuZCBhY2NlcHQoKSB3aGVuIFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVCBpcyBkZWZpbmVkLgotICAgICBbTWFyYyBTbGVta29dCi0KLSAgKikgVGhlIG1ldGhvZCBmb3IgZGV0ZXJtaW5pbmcgUEFUSF9JTkZPIGhhcyBiZWVuIHJlc3RvcmVkIHRvIHRoZSBwcmUtMS4yYgotICAgICAoYW5kIE5DU0EgaHR0cGQpIGRlZmluaXRpb24gd2hlcmVpbiBpdCB3YXMgdGhlIGV4dHJhIHBhdGggaW5mbyBiZXlvbmQKLSAgICAgdGhlIENHSSBzY3JpcHQgZmlsZW5hbWUuICBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgRklMRVBBVEhfSU5GTyBoYXMKLSAgICAgYmVlbiByZW1vdmVkLCBhbmQgaW5zdGVhZCB3ZSBzdXBwbHkgdGhlIG9yaWdpbmFsIFJFUVVFU1RfVVJJIHRvIGFueQotICAgICBzY3JpcHQgdGhhdCB3YW50cyB0byBiZSBBcGFjaGUtc3BlY2lmaWMgYW5kIG5lZWRzIHRoZSByZWFsIFVSSSBwYXRoLgotICAgICBUaGlzIHNvbHZlcyBhIHByb2JsZW0gd2l0aCBleGlzdGluZyBzY3JpcHRzIHRoYXQgdXNlIGV4dHJhIHBhdGggaW5mbwotICAgICBpbiB0aGUgU2NyaXB0QWxpYXMgZGlyZWN0aXZlIHRvIHBhc3Mgb3B0aW9ucyB0byB0aGUgQ0dJIHNjcmlwdC4KLSAgICAgW1JveSBGaWVsZGluZ10KLQotICAqKSBUaGUgX2RlZmF1bHRfIGNoYW5nZSBpbiAxLjJiMTAgd2lsbCBjaGFuZ2UgdGhlIGJlaGF2aW91ciBvbiBjb25maWdzCi0gICAgIHRoYXQgdXNlIG11bHRpcGxlIExpc3RlbiBzdGF0ZW1lbnRzIGZvciBsaXN0ZW5pbmcgb24gbXVsdGlwbGUgcG9ydHMuCi0gICAgIEJ1dCB0aGF0IGNoYW5nZSBpcyBuZWNlc3NhcnkgdG8gbWFrZSBfZGVmYXVsdF8gY29uc2lzdGVudCB3aXRoIG90aGVyCi0gICAgIGZvcm1zIG9mIDxWaXJ0dWFsSG9zdD4uICBJdCByZXF1aXJlcyBzdWNoIGNvbmZpZ3MgdG8gYmUgbW9kaWZpZWQKLSAgICAgdG8gdXNlIDxWaXJ0dWFsSG9zdCBfZGVmYXVsdF86Kj4uICBUaGUgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbgotICAgICB1cGRhdGVkLiAgW0RlYW4gR2F1ZGV0XSBQUiM1MzAKLQotICAqKSBJZiBhbiBFcnJvckRvY3VtZW50IENHSSBzY3JpcHQgaXMgdXNlZCB0byByZXNwb25kIHRvIGFuIGVycm9yCi0gICAgIGdlbmVyYXRlZCBieSBhbm90aGVyIENHSSBzY3JpcHQgd2hpY2ggaGFzIGFscmVhZHkgcmVhZCB0aGUgbWVzc2FnZQotICAgICBib2R5IG9mIHRoZSByZXF1ZXN0LCB0aGUgc2VydmVyIHdvdWxkIGJsb2NrIHRyeWluZyB0byByZWFkIHRoZQotICAgICBtZXNzYWdlIGJvZHkgYWdhaW4uICBbUm9iIEhhcnRpbGxdCi0KLSAgKikgc2lnbmFsKCkgcmVwbGFjZW1lbnQgY29uZmxpY3RlZCB3aXRoIGEgZGVmaW5lIG9uIFFOWCAoYW5kIHBvdGVudGlhbGx5Ci0gICAgIG90aGVyIHBsYXRmb3JtcykuIEZpeGVkLiBbQmVuIExhdXJpZV0gUFIjNTEyCi0KLUNoYW5nZXMgd2l0aCBBcGFjaGUgMS4yYjEwCi0KLSAgKikgQWxsb3cgSFRUUERfUk9PVCwgU0VSVkVSX0NPTkZJR19GSUxFLCBERUZBVUxUX1BBVEgsIGFuZCBTSEVMTF9QQVRICi0gICAgIHRvIGJlIGNvbmZpZ3VyZWQgdmlhIC1EIGluIENvbmZpZ3VyYXRpb24uICBbRGVhbiBHYXVkZXRdIFBSIzQ0OQotCi0gICopIDxWaXJ0dWFsSG9zdCBfZGVmYXVsdF86cG9ydG51bT4gZGlkbid0IHdvcmsgcHJvcGVybHkuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgQWRkZWQgcHJvdG90eXBlIGZvciBta3RlbXAoKSBmb3IgU1VOT1M0IFtNYXJjIFNsZW1rb10KLQotICAqKSBJbiBtb2RfcHJveHkuYywgY2hlY2sgcmV0dXJuIHZhbHVlcyBmb3IgcHJveHlfaG9zdDJhZGRyKCkgd2hlbiByZWFkaW5nCi0gICAgIGNvbmZpZywgaW4gY2FzZSB0aGUgaG9zdGVudCBzdHJ1Y3QgcmV0dXJuZWQgaXMgdHJhc2guCi0gICAgIFtDaHVjayBNdXJja29dIFBSICM0OTEKLQotICAqKSBGaXhlZCB0aGUgZml4IGluIDEuMmI5IGZvciBwYXJzaW5nIFVSTCBxdWVyeSBpbmZvIGludG8gYXJncyBmb3IgQ0dJCi0gICAgIHNjcmlwdHMuICBbRGVhbiBHYXVkZXQsIFJveSBGaWVsZGluZywgTWFyYyBTbGVta29dCi0KLUNoYW5nZXMgd2l0aCBBcGFjaGUgMS4yYjkgIFtuZXZlciBhbm5vdW5jZWRdCi0KLSAgKikgUmVzZXQgdGhlIE1PRFVMRV9NQUdJQ19OVU1CRVIgdG8gYWNjb3VudCBmb3IgdGhlIHVuc2lnbmVkIHBvcnQKLSAgICAgY2hhbmdlcyBhbmQgaW4gYW50aWNpcGF0aW9uIG9mIDEuMiBmaW5hbCByZWxlYXNlLiAgW1JveSBGaWVsZGluZ10KLQotICAqKSBGaXggcHJvYmxlbSB3aXRoIHNjcmlwdHMgbm90IHJlY2VpdmluZyBhIFNJR1BJUEUgd2hlbiBjbGllbnQgZHJvcHMKLSAgICAgdGhlIGNvbm5lY3Rpb24gKGUuZy4sIHdoZW4gdXNlciBwcmVzc2VzIFN0b3ApLiAgQXBhY2hlIHdpbGwgbm93IHN0b3AKLSAgICAgdHJ5aW5nIHRvIHNlbmQgYSBtZXNzYWdlIGJvZHkgaW1tZWRpYXRlbHkgYWZ0ZXIgYW4gZXJyb3IgZnJvbSB3cml0ZS4KLSAgICAgW1JveSBGaWVsZGluZyBhbmQgTmF0aGFuIEt1cnpdIFBSIzMzNQotCi0gICopIFJlYXJyYW5nZSBDb25maWd1cmF0aW9uLnRtcGwgc28gdGhhdCBtb2RfcmV3cml0ZSBoYXMgaGlnaGVyIHByaW9yaXR5Ci0gICAgIHRoYW4gbW9kX2FsaWFzLCBhbmQgbW9kX2FsaWFzIGhhcyBoaWdoZXIgcHJpb3JpdHkgdGhhbiBtb2RfcHJveHk7Ci0gICAgIHJlYXJyYW5nZWQgb3RoZXIgbW9kdWxlcyB0byBlbmhhbmNlIHVuZGVyc3RhbmRpbmcgb2YgdGhlaXIgcHVycG9zZQotICAgICBhbmQgcmVsYXRpdmUgb3JkZXIgKGFuZCBtYXliZSBldmVuIHJlZHVjZSBzb21lIG92ZXJoZWFkKS4KLSAgICAgW1JveSBGaWVsZGluZyBhbmQgU2FtZWVyIFBhcmVraF0KLQotICAqKSBGaXggZ3JhY2VmdWwgcmVzdGFydC4gIEVsaW1pbmF0ZSBtYW55IHNpZ25hbC1yZWxhdGVkIHJhY2UKLSAgICAgY29uZGl0aW9ucyBpbiBib3RoIGZvcm1zIG9mIHJlc3RhcnQsIGFuZCBpbiBTSUdURVJNLiAgU2VlCi0gICAgIGh0ZG9jcy9tYW51YWwvc3RvcHBpbmcuaHRtbCBmb3IgZGV0YWlscyBvbiBzdG9wcGluZyBhbmQKLSAgICAgcmVzdGFydGluZyB0aGUgcGFyZW50LiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIEZpeCBtZW1vcnkgbGVha3MgaW4gbW9kX3Jld3JpdGUsIG1vZF9icm93c2VyLCBtb2RfaW5jbHVkZS4gIFR1bmUKLSAgICAgbWVtb3J5IGFsbG9jYXRvciB0byBhdm9pZCBhIGJlaGF2aW91ciB0aGF0IHJlcXVpcmVkIGV4dHJhIGJsb2NrcyB0bwotICAgICBiZSBhbGxvY2F0ZWQuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgQWxsb3cgc3VleGVjIHRvIGFjY2VzcyBmaWxlcyByZWxhdGl2ZSB0byBjdXJyZW50IGRpcmVjdG9yeSBidXQgbm90Ci0gICAgIGFib3ZlLiAgKEV4Y2x1ZGluZyBsZWFkaW5nIC8gb3IgYW55IC4uIGRpcmVjdG9yeS4pICBbS2VuIENvYXJdCi0gICAgIFBSIzI2OSwgMzE5LCAzOTUKLQotICAqKSBGaXggc3VleGVjIHNlZ2ZhdWx0IHdoZW4gZ3JvdXAgZG9lc24ndCBleGlzdC4gW0dyZWdvcnkgTmVpbCBTaGFwaXJvXQotICAgICBQUiMzNjcsIDM2OCwgMzU0LCA0NTMKLQotICAqKSBGaXggdGhlIGFib3ZlIGZpeDogaWYgc3VleGVjIGlzIGVuYWJsZWQsIGF2b2lkIGRlc3Ryb3lpbmcgci0+dXJsCi0gICAgIHdoaWxlIG9idGFpbmluZyB0aGUgL351c2VyIGFuZCBzYXZlIHRoZSB1c2VybmFtZSBpbiBhIHNlcGFyYXRlIGRhdGEKLSAgICAgYXJlYSBzbyB0aGF0IGl0IHdvbid0IGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBjYWxsIHRvIGdldGdyZ2lkKCksIGFuZAotICAgICBmaXggc29tZSBtaXN1c2Ugb2YgdGhlIHBvb2wgc3RyaW5nIGFsbG9jYXRpb24gZnVuY3Rpb25zLiAgQWxzbyBmaXhlcwotICAgICBhIGdlbmVyYWwgcHJvYmxlbSB3aXRoIHBhcnNpbmcgVVJMIHF1ZXJ5IGluZm8gaW50byBhcmdzIGZvciBDR0kgc2NyaXB0cy4KLSAgICAgW1JveSBGaWVsZGluZ10gUFIjMzM5LCAzNjcsIDM1NCwgNDUzCi0KLSAgKikgRml4IElSSVggd2FybmluZyBhYm91dCBiemVybyB1bmRlZmluZWQuIFtNYXJjIFNsZW1rb10KLQotICAqKSBGaXggcHJvYmxlbSB3aXRoIDxEaXJlY3RvcnkgcHJveHk6Li4uPi4gW01hcnRpbiBLcmFlbWVyXSBQUiMyNzEKLQotICAqKSBDb3JyZWN0ZWQgc3BlbGxpbmcgb2YgImF1dGhvcml0YXRpdmUiLiAgQXV0aERCQXV0aG9yYXRhdGl2ZSBiZWNhbWUKLSAgICAgQXV0aERCQXV0aG9yaXRhdGl2ZS4gW01hcmMgU2xlbWtvXSBQUiM0MjAKLQotICAqKSBNYXhDbGllbnRzIHNob3VsZCBiZSBhdCBsZWFzdCAxLiBbTGFycyBFaWxlYnJlY2h0XSBQUiMzNzUKLQotICAqKSBUaGUgZGVmYXVsdCBoYW5kbGVyIG5vdyBsb2dzIGludmFsaWQgbWV0aG9kcyBvciBVUklzIChpLmUuIFBVVCBvbiBhbgotICAgICBvYmplY3QgdGhhdCBjYW4ndCBiZSBQVVQsIG9yIEZPT0JBUiBmb3Igc29tZSBtZXRob2QgRk9PQkFSIHRoYXQKLSAgICAgYXBhY2hlIGRvZXNuJ3Qga25vdyBhYm91dCBhdCBhbGwpLiAgTG9nIDQwNHMgdGhhdCBvY2N1ciBpbiBtb2RfaW5jbHVkZS4KLSAgICAgW1BhdWwgU3V0dG9uLCBKb2huIFZhbiBFc3Nlbl0KLQotICAqKSBJZiBhIHNvZnQgdGltZW91dCAob3IgbGluZ2Vyb3V0KSBvY2N1cnMgd2hpbGUgdHJ5aW5nIHRvIGZsdXNoIGEKLSAgICAgYnVmZmVyIG9yIHdyaXRlIGluc2lkZSBidWZmLmMgb3IgZnJlYWQnaW5nIGZyb20gYSBDR0kncyBvdXRwdXQsCi0gICAgIHRoZW4gdGhlIHRpbWVvdXQgd291bGQgYmUgaWdub3JlZC4gW1JveSBGaWVsZGluZ10gUFIjMzczCi0KLSAgKikgV29yayBhcm91bmQgYSBidWcgaW4gTmV0c2NhcGUgTmF2aWdhdG9yIHZlcnNpb25zIDIueCwgMy54IGFuZCA0LjBiMidzCi0gICAgIHBhcnNpbmcgb2YgaGVhZGVycy4gIElmIHRoZSB0ZXJtaW5hdGluZyBlbXB0eS1saW5lIENSTEYgb2NjdXJzIHN0YXJ0aW5nCi0gICAgIGF0IHRoZSAyNTZ0aCBvciAyNTd0aCBieXRlIG9mIG91dHB1dCwgdGhlbiBOYXZpZ2F0b3Igd2lsbCB0aGluayBhIG5vcm1hbAotICAgICBpbWFnZSBpcyBpbnZhbGlkLiAgV2UgYXJlIGd1ZXNzaW5nIHRoYXQgdGhpcyBpcyBiZWNhdXNlIHRoZWlyIGluaXRpYWwKLSAgICAgcmVhZCBvZiBhIG5ldyByZXF1ZXN0IHVzZXMgYSAyNTYgYnl0ZSBidWZmZXIuIFdlIGNoZWNrIHRoZSBieXRlcyB3cml0dGVuCi0gICAgIHNvIGZhciBhbmQsIGlmIHdlIGFyZSBhYm91dCB0byB0aWNrbGUgdGhlIGJ1Zywgd2UgaW5zdGVhZCBpbnNlcnQgYQotICAgICBwYWRkaW5nIGhlYWRlciBvZiBlbWluZW50IGJvZ29zaXR5LiBbUm95IEZpZWxkaW5nIGFuZCBEZWFuIEdhdWRldF0gUFIjMjMyCi0KLSAgKikgRml4ZWQgU0lHU0VHViBwcm9ibGVtIHdoZW4gYSBEaXJlY3RvcnlJbmRleCBmaWxlIGlzIGFsc28gdGhlIHNvdXJjZQotICAgICBvZiBhbiBleHRlcm5hbCByZWRpcmVjdGlvbi4gIFtSb3kgRmllbGRpbmcgYW5kIFBhdWwgU3V0dG9uXQotCi0gICopIENvbmZpZ3VyZSB3b3VsZCBjcmVhdGUgYSBicm9rZW4gTWFrZWZpbGUgaWYgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQotICAgICBjb250YWluZWQgYSBjb21tZW50ZWQtb3V0IFJ1bGUuICBbUm95IEZpZWxkaW5nXQotCi0gICopIFByb21vdGUgcGVyX2Rpcl9jb25maWcgYW5kIHN1YnByb2Nlc3NfZW52IGZyb20gdGhlIHN1YnJlcXVlc3QgdG8gdGhlCi0gICAgIG1haW4gcmVxdWVzdCBpbiBtb2RfbmVnb3RpYXRpb24uICBJbiBwYXJ0aWN1bGFyIHRoaXMgZml4ZXMgYSBidWcKLSAgICAgd2hlcmUgPEZpbGVzPiBzZWN0aW9ucyB3b3VsZG4ndCBwcm9wZXJseSBhcHBseSB0byBuZWdvdGlhdGVkIGNvbnRlbnQuCi0gICAgIFtEZWFuIEdhdWRldF0KLQotICAqKSBGaXggYSBwb3RlbnRpYWwgZGVhZGxvY2sgaW4gbW9kX2NnaSBzY3JpcHRfZXJyIGhhbmRsaW5nLgotICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSByb3RhdGVsb2dzIHplcm8tcGFkcyB0aGUgbG9nZmlsZSBuYW1lcyB0byBpbXByb3ZlIGFscGhhYmV0aWMgc29ydGluZy4KLSAgICAgW01pdGNoZWxsIEJsYW5rIEpyXQotCi0gICopIFVwZGF0ZWQgbW9kX3Jld3JpdGUgdG8gMy4wLjQ6IEZpeGVzIEhUVFAgcmVkaXJlY3RzIGZyb20gd2l0aGluCi0gICAgIC5odGFjY2VzcyBmaWxlcyBiZWNhdXNlIHRoZSBSZXdyaXRlQmFzZSB3YXMgbm90IHJlcGxhY2VkIGNvcnJlY3RseS4KLSAgICAgVXBkYXRlZCBtb2RfcmV3cml0ZSB0byAzLjAuNTogRml4ZXMgcHJvYmxlbSB3aXRoIHJld3JpdGluZyBpbnNpZGUKLSAgICAgPERpcmVjdG9yeT4gc2VjdGlvbnMgbWlzc2luZyBhIHRyYWlsaW5nIC8uICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBDbGVhbiB1cCBMaW51eCBzZXR0aW5ncyBpbiBjb25mLmggYnkgZGV0ZWN0aW5nIDIueCB2ZXJzdXMgMS54LiAgRm9yCi0gICAgIDEueCB0aGUgc2V0dGluZ3MgYXJlIHRob3NlIG9mIHByZS0xLjJiOC4gIEZvciAyLnggd2UgaW5jbHVkZQotICAgICBVU0VfU0hNR0VUX1NDT1JFQk9BUkQgKHNjb3JlYm9hcmQgaW4gc2hhcmVkIG1lbW9yeSByYXRoZXIgdGhhbiBmaWxlKSBhbmQKLSAgICAgSEFWRV9TWVNfUkVTT1VSQ0VfSCAoZW5hYmxlIHRoZSBSTGltaXQgY29tbWFuZHMpLgotICAgICBbRGVhbiBHYXVkZXRdIFBSIzMzNiwgUFIjMzQwCi0KLSAgKikgUmVkaXJlY3QgZGlkIG5vdCBwcmVzZXJ2ZSA/cXVlcnlfc3RyaW5ncyB3aGVuIHByZXNlbnQgaW4gdGhlIGNsaWVudCdzCi0gICAgIHJlcXVlc3QuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgQ29uZmlndXJlIHdhcyBmaW5kaW5nIG5vbi1tb2R1bGVzIG9uIEVYVFJBX0xJQlMuIFtGcmFuayBDcmluZ2xlXSBQUiMzODAKLQotICAqKSBVc2UgL2Jpbi9zaDUgb24gVUxUUklYLiAgW1AuIEFsZWphbmRybyBMb3Blei1WYWxlbmNpYV0gUFIjMzY5Ci0KLSAgKikgQWRkIFVuaXhXYXJlIGNvbXBpbGUvaW5zdGFsbCBpbnN0cnVjdGlvbnMuICBbQ2h1Y2sgTXVyY2tvXQotCi0gICopIEFkZCBtb2RfZXhhbXBsZSAoaWxsdXN0cmF0aW9uIG9mIEFQSSB0ZWNobmlxdWVzKS4gIFtLZW4gQ29hcl0KLQotICAqKSBBZGQgbWFjcm8gZm9yIG1lbW1vdmUgdG8gY29uZi5oIGZvciBTVU5PUzQuIFtNYXJjIFNsZW1rb10KLQotICAqKSBJbXByb3ZlIGhhbmRsaW5nIG9mIGRpcmVjdG9yaWVzIHdoZW4gZmlsZW5hbWVzIGhhdmUgc3BhY2VzIGluIHRoZW0uCi0gICAgIFtDaHVjayBNdXJja29dCi0KLSAgKikgRm9yIGhvc3RzIHdpdGggbXVsdGlwbGUgSVAgYWRkcmVzc2VzLCB0cnkgYWxsIGFkZGl0aW9uYWwgYWRkcmVzc2VzIGlmCi0gICAgIG5lY2Vzc2FyeSB0byBnZXQgYSBjb25uZWN0LiBGYWlsIG9ubHkgaWYgaG9zdGVudCBhZGRyZXNzIGxpc3QgaXMKLSAgICAgZXhoYXVzdGVkLiBbQ2h1Y2sgTXVyY2tvXQotCi0gICopIE1vcmUgc2lnbmVkL3Vuc2lnbmVkIHBvcnQgZml4ZXMuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgSEFSRF9TRVJWRVJfTElNSVQgY2FuIGJlIGRlZmluZWQgaW4gdGhlIENvbmZpZ3VyYXRpb24gZmlsZSBub3cuCi0gICAgIFtEZWFuIEdhdWRldF0KLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjJiOAotCi0gICopIHN1ZXhlYy5jIGRvZXNuJ3QgY2xvc2UgdGhlIGxvZyBmaWxlLCBhbGxvd2luZyBDR0lzIHRvIGNvbnRpbnVlIHdyaXRpbmcKLSAgICAgdG8gaXQuICBbTWFyYyBTbGVta29dCi0KLSAgKikgVGhlIGFkZGl0aW9uIG9mIDxMb2NhdGlvbj4gYW5kIDxGaWxlPiBkaXJlY3RpdmVzIG1hZGUgdGhlCi0gICAgIHN1Yl9yZXFfbG9va3VwX3NpbXBsZSgpIGZ1bmN0aW9uIGJvZ3VzLCBzbyB3ZSBub3cgaGFuZGxlCi0gICAgIHRoZSBzcGVjaWFsIGNhc2VzIGRpcmVjdGx5LiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIFdlIG5vdyB0cnkgdG8gbG9nIHdoZXJlIHRoZSBzZXJ2ZXIgaXMgZHVtcGluZyBjb3JlIHdoZW4gYSBmYXRhbAotICAgICBzaWduYWwgaXMgcmVjZWl2ZWQuICBbS2VuIENvYXJdCi0KLSAgKikgSW1wcm92ZWQgbGluZ2VyaW5nX2Nsb3NlIGJ5IGFkZGluZyBhIHNwZWNpYWwgdGltZW91dCwgcmVtb3ZpbmcgdGhlCi0gICAgIHNwdXJpb3VzIGxvZyBtZXNzYWdlcywgcmVtb3ZpbmcgdGhlIG5vbmJsb2NraW5nIHNldHRpbmdzICh0aGV5Ci0gICAgIGFyZSBub3QgbmVlZGVkIHdpdGggdGhlIGJldHRlciB0aW1lb3V0KSwgYW5kIGFkZGluZyBjb21tZW50YXJ5Ci0gICAgIGFib3V0IHRoZSBOT19MSU5HQ0xPU0UgYW5kIFVTRV9TT19MSU5HRVIgaXNzdWVzLiAgTk9fTElOR0NMT1NFIGlzCi0gICAgIG5vdyB0aGUgZGVmYXVsdCBmb3IgU3VuT1M0LCBVbml4V2FyZSwgTmVYVCwgYW5kIElSSVguICBbUm95IEZpZWxkaW5nXQotCi0gICopIFNlbmQgZXJyb3IgbWVzc2FnZXMgYWJvdXQgc2V0c29ja29wdCBmYWlsdXJlcyB0byB0aGUgc2VydmVyIGVycm9yCi0gICAgIGxvZyBpbnN0ZWFkIG9mIHN0ZGVyci4gIFtSb3kgRmllbGRpbmddCi0KLSAgKikgRml4IGxvb3Bob2xlcyBpbiBwcm94eSBjYWNoZSBleHBpcnkgdmlzIGEgdmlzIGFsYXJtcy4gW0JyaWFuIE1vb3JlXQotCi0gICopIFN0b3BnYXAgc29sdXRpb24gZm9yIENHSSAzLXNlY29uZCBkZWxheSB3aXRoIHNlcnZlci1zaWRlIGluY2x1ZGVzOiBpZgotICAgICBwcm9jZXNzaW5nIGEgc3VicmVxdWVzdCwgYWxsb2NhdGUgbWVtb3J5IGZyb20gci0+bWFpbi0+cG9vbCBpbnN0ZWFkCi0gICAgIG9mIHItPnBvb2wgc28gdGhhdCB3ZSBjYW4gYXZvaWQgd2FpdGluZyBmb3IgZnJlZV9wcm9jX2NoYWluIHRvIGNsZWFudXAKLSAgICAgaW4gdGhlIG1pZGRsZSBvZiBhbiBTU0kgcmVxdWVzdC4gIFtEZWFuIEdhdWRldF0gUFIgIzEyMgotCi0gICopIEZpeGVkIHN0YXR1cyBvZiByZXNwb25zZSB3aGVuIFBPU1QgaXMgcmVjZWl2ZWQgZm9yIGEgbm9uZXhpc3RlbnQgVVJMCi0gICAgICh3YXMgc2VuZGluZyA0MDUsIG5vdyA0MDQpIGFuZCB3aGVuIGFueSBtZXRob2QgaXMgc2VudCB3aXRoIGEKLSAgICAgZnVsbC1VUkkgdGhhdCBkb2Vzbid0IG1hdGNoIHRoZSBzZXJ2ZXIgYW5kIHRoZSBzZXJ2ZXIgaXMgbm90IGFjdGluZwotICAgICBhcyBhIHByb3h5ICh3YXMgc2VuZGluZyA1MDEsIG5vdyA0MDMpLiAgW1JveSBGaWVsZGluZ10KLQotICAqKSBIb3N0IHBvcnQgY2hhbmdlZCB0byB1bnNpZ25lZCBzaG9ydC4gW0tlbiBDb2FyXSBQUiAjMjc2Ci0KLSAgKikgRml4IHR5cG8gaW4gY29tbWFuZCBkZWZpbml0aW9uIG9mIEF1dGhBdXRob3JpdGF0aXZlLiBbS2VuIENvYXJdIFBSICMyNDYKLQotICAqKSBEZWZpbmVkIFVTRV9TSE1HRVRfU0NPUkVCT0FSRCBmb3Igc2hhcmVkIG1lbW9yeSBvbiBMaW51eC4gIFtEZWFuIEdhdWRldF0KLQotICAqKSBSZXBvcnQgZXh0cmEgaW5mbyBmcm9tIGVycm5vIHdpdGggbWFueSBlcnJvcnMgdGhhdCBjYXVzZSBodHRwZCB0byBleGl0LgotICAgICBzcGF3bl9jaGlsZCwgcG9wZW5mLCBhbmQgcGNsb3NlZiBub3cgaGF2ZSB2YWxpZCBlcnJubyByZXR1cm5zIGluIHRoZQotICAgICBldmVudCBvZiBhbiBlcnJvci4gIENvcnJlY3QgcHJvYmxlbXMgd2hlcmUgZXJybm8gd2FzIHN0b21wZWQgb24KLSAgICAgYmVmb3JlIGJlaW5nIHJlcG9ydGVkLiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIEluIHRoZSBwcm94eSwgaWYgdGhlIGNhY2hlIGZpbGVzeXN0ZW0gd2FzIGZ1bGwsIGdhcmJhZ2VfY29sbCgpIHdhcwotICAgICBuZXZlciBjYWxsZWQsIGFuZCB0aHVzIHRoZSBmaWxlc3lzdGVtIHdvdWxkIHJlbWFpbiBmdWxsIGluZGVmaW5pdGVseS4KLSAgICAgV2Ugbm93IGFsc28gcmVtb3ZlIGluY29tcGxldGUgY2FjaGUgZmlsZXMgbGVmdCBpZiB0aGUgb3JpZ2luIHNlcnZlcgotICAgICBkaWRuJ3Qgc2VuZCBhIENvbnRlbnQtTGVuZ3RoIGhlYWRlciBhbmQgZWl0aGVyIHRoZSBjbGllbnQgaGFzIGFib3J0ZWQKLSAgICAgdHJhbnNmZXIgb3IgYndyaXRlKCkgdG8gY2xpZW50IGhhcyBmYWlsZWQuIFtQZXRyIExhbXBhXQotCi0gICopIEZpeGVkIHRoZSBoYW5kbGluZyBvZiBtb2R1bGUgYW5kIHNjcmlwdC1hZGRlZCBoZWFkZXIgZmllbGRzLgotICAgICBJbXByb3ZlZCB0aGUgaW50ZXJmYWNlIGZvciBzZW5kaW5nIGhlYWRlciBmaWVsZHMgYW5kIHJlZHVjZWQKLSAgICAgdGhlIGR1cGxpY2F0aW9uIG9mIGNvZGUgYmV0d2VlbiBzZW5kaW5nIG9rYXkgcmVzcG9uc2VzIGFuZCBlcnJvcnMuCi0gICAgIFdlIG5vdyBhbHdheXMgc2VuZCBib3RoIGhlYWRlcnNfb3V0IGFuZCBlcnJfaGVhZGVyc19vdXQsIGFuZAotICAgICBlbnN1cmUgdGhhdCB0aGUgc2VydmVyLXJlc2VydmVkIGZpZWxkcyBhcmUgbm90IGJlaW5nIG92ZXJyaWRkZW4sCi0gICAgIHdoaWxlIG5vdCBvdmVycmlkaW5nIHRob3NlIHRoYXQgYXJlIG5vdCByZXNlcnZlZC4gIFtSb3kgRmllbGRpbmddCi0KLSAgKikgTW92ZWQgdHJhbnNwYXJlbnQgY29udGVudCBuZWdvdGlhdGlvbiBmaWVsZHMgdG8gZXJyX2hlYWRlcnNfb3V0Ci0gICAgIHRvIHJlZmxlY3QgYWJvdmUgY2hhbmdlcy4gIFtQZXRyIExhbXBhXQotCi0gICopIEZpeGVkIHRoZSBkZXRlcm1pbmF0aW9uIG9mIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBtYWtlIHRoZQotICAgICBjb25uZWN0aW9uIHBlcnNpc3RlbnQgZm9yIGFsbCBvZiB0aGUgY2FzZXMgd2hlcmUgc29tZSBvdGhlciBwYXJ0Ci0gICAgIG9mIHRoZSBzZXJ2ZXIgaGFzIGFscmVhZHkgaW5kaWNhdGVkIHRoYXQgd2Ugc2hvdWxkIG5vdC4gIEFsc28KLSAgICAgaW1wcm92ZWQgdGhlIG9yZGVyaW5nIG9mIHRoZSB0ZXN0IHNvIHRoYXQgY2h1bmtlZCBlbmNvZGluZyB3aWxsCi0gICAgIGJlIHNldCB3aGVuZXZlciBpdCBpcyBkZXNpcmVkIGluc3RlYWQgb2Ygb25seSB3aGVuIEtlZXBBbGl2ZQotICAgICBpcyBlbmFibGVkLiBBZGRlZCBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gY2FwYWJpbGl0eSBmb3IgbW9zdCBlcnJvcgotICAgICByZXNwb25zZXMgKHRob3NlIHRoYXQgZG8gbm90IGluZGljYXRlIGEgYmFkIGlucHV0IHN0cmVhbSkgd2hlbgotICAgICBhY2Nlc3NlZCBieSBhbiBIVFRQLzEuMSBjbGllbnQuIFtSb3kgRmllbGRpbmddCi0KLSAgKikgQWRkZWQgbWlzc2luZyB0aW1lb3V0cyBmb3Igc2VuZGluZyBoZWFkZXIgZmllbGRzLCBlcnJvciByZXNwb25zZXMsCi0gICAgIGFuZCB0aGUgbGFzdCBjaHVuayBvZiBjaHVua2VkIGVuY29kaW5nLCBlYWNoIG9mIHdoaWNoIGNvdWxkIGhhdmUKLSAgICAgcmVzdWx0ZWQgaW4gYSBwcm9jZXNzIGJlaW5nIHN0dWNrIGluIHdyaXRlIGZvcmV2ZXIuICBVc2luZyBzb2Z0X3RpbWVvdXQKLSAgICAgcmVxdWlyZXMgdGhhdCB0aGUgc2VuZGVyIGNoZWNrIGZvciBhbiBhYm9ydGVkIGNvbm5lY3Rpb24gcmF0aGVyIHRoYW4KLSAgICAgY29udGludWluZyBhZnRlciBhbiBFSU5UUi4gIFRpbWVvdXRzIHRoYXQgdXNlZCB0byBiZSBpbml0aWF0ZWQgYmVmb3JlCi0gICAgIHNlbmRfaHR0cF9oZWFkZXIgKGFuZCBuZXZlciBraWxsZWQpIGFyZSBub3cgaW5pdGlhdGVkIG9ubHkgd2l0aGluIG9yCi0gICAgIGFyb3VuZCB0aGUgcm91dGluZXMgdGhhdCBhY3R1YWxseSBkbyB0aGUgc2VuZGluZywgYW5kIG5vdCBhbGxvd2VkIHRvCi0gICAgIHByb3BhZ2F0ZSBhYm92ZSB0aGUgY2FsbGVyLiAgW1JveSBGaWVsZGluZ10KLQotICAqKSBtb2RfYXV0aF9hbm9uIHJlcXVpcmVkIGFuIEAgb3IgYSAuIGluIHRoZSBlbWFpbCBhZGRyZXNzLCBub3QgYm90aC4KLSAgICAgW0RpcmsgdmFuR3VsaWtdCi0KLSAgKikgcGVyX2Rpcl9kZWZhdWx0cyB3ZXJlbid0IHNldCBjb3JyZWN0bHkgdW50aWwgZGlyZWN0b3J5X3dhbGsgZm9yCi0gICAgIG5hbWUtYmFzZWQgdmhvc3RzLiAgVGhpcyBmaXhlcyBhbiBvYnNjdXJlIGJ1ZyB3aXRoIHRoZSB3cm9uZyBjb25maWcKLSAgICAgaW5mbyBiZWluZyB1c2VkIGZvciB2aG9zdHMgdGhhdCBzaGFyZSB0aGUgc2FtZSBpcCBhcyB0aGUgc2VydmVyLgotICAgICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgSW1wcm92ZWQgZ2VuZXJhdGlvbiBvZiBtb2R1bGVzL01ha2VmaWxlIHRvIGJlIG1vcmUgZ2VuZXJpYyBmb3IKLSAgICAgbmV3IG1vZHVsZSBkaXJlY3Rvcmllcy4gW0tlbiBDb2FyLCBDaHVjayBNdXJja28sIFJveSBGaWVsZGluZ10KLQotICAqKSBHZW5lcmF0ZSBtYWtlZmlsZSBkZXBlbmRlbmN5IGZvciBDb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBhY3R1YWwKLSAgICAgbmFtZSBnaXZlbiB3aGVuIHJ1bm5pbmcgdGhlIENvbmZpZ3VyZSBwcm9jZXNzLiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIEZpeGVkIHByb2JsZW0gd2l0aCB2aG9zdCBlcnJvciBsb2cgbm90IGJlaW5nIHNldCBwcmlvciB0bwotICAgICBpbml0aWFsaXppbmcgdmlydHVhbCBob3N0cy4gW0RlYW4gR2F1ZGV0XQotCi0gICopIEZpeGVkIGluZmluaXRlIGxvb3Agd2hlbiBhIHRyYWlsaW5nIHNsYXNoIGlzIGluY2x1ZGVkIGFmdGVyIGEgdHlwZSBtYXAKLSAgICAgZmlsZSBVUkwgKGV4dHJhIHBhdGggaW5mbykuIFtQZXRyIExhbXBhXQotCi0gICopIEZpeGVkIHNlcnZlciBzdGF0dXMgdXBkYXRpbmcgb2YgcGVyLWNvbm5lY3Rpb24gY291bnRlcnMuIFtSb3kgRmllbGRpbmddCi0KLSAgKikgQWRkIGRvY3VtZW50YXRpb24gZm9yIEROUyBpc3N1ZXMgKHJlbGlhYmlsaXR5IGFuZCBzZWN1cml0eSksIGFuZCB0cnkKLSAgICAgdG8gZXhwbGFpbiB0aGUgdmlydHVhbCBob3N0IG1hdGNoaW5nIHByb2Nlc3MuICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgVHJ5IHRvIGNvbnRpbnVlIGdyYWNlZnVsbHkgYnkgZGlzYWJsaW5nIHRoZSB2aG9zdCBpZiBhIEROUyBsb29rdXAKLSAgICAgZmFpbHMgd2hpbGUgcGFyc2luZyB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIEltcHJvdmVkIGNhbGxzIHRvIHNldHNvY2tvcHQuICBbUm95IEZpZWxkaW5nXQotCi0gICopIE5lZ290aWF0aW9uIGNoYW5nZXM6IERvbid0IG91dHB1dCBlbXB0eSBjb250ZW50LXR5cGUgaW4gdmFyaWFudCBsaXN0OwotICAgICBPdXRwdXQgY2hhcnNldCBpbiB2YXJpYW50IGxpc3Q7IFJldHVybiBzb29uZXIgZnJvbSBoYW5kbGVfbXVsdGkoKSBpZgotICAgICBubyB2YXJpYW50cyBmb3VuZDsgQWRkIGhhbmRsaW5nIG9mICcqJyB3aWxkY2FyZCBpbiBBY2NlcHQtQ2hhcnNldC4KLSAgICAgW1BldHIgTGFtcGEgYW5kIFBhdWwgU3V0dG9uXQotCi0gICopIEZpeGVkIG92ZXJsYXlpbmcgb2YgcmVxdWVzdC9zdWItcmVxdWVzdCBub3RlcyBhbmQgaGVhZGVycyBpbgotICAgICBtb2RfbmVnb3RpYXRpb24uICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgSWYgdHdvIHZhcmlhbnRzJyBjaGFyc2V0IHF1YWxpdHkgYXJlIGVxdWFsIGFuZCBvbmUgaXMgdGhlIGRlZmF1bHQKLSAgICAgY2hhcnNldCAoaXNvLTg4NTktMSksIHRoZW4gcHJlZmVyIHRoZSB2YXJpYW50IHRoYXQgd2FzIHNwZWNpZmljYWxseQotICAgICBsaXN0ZWQgaW4gQWNjZXB0LUNoYXJzZXQgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdC4gIFtQZXRyIExhbXBhXQotCi0gICopIE1lbW9yeSBhbGxvY2F0aW9uIHByb2JsZW0gaW4gcHVzaF9hcnJheSgpIC0tIGl0IHdvdWxkIGNvcnJ1cHQgbWVtb3J5Ci0gICAgIHdoZW4gbmFsbG9jPT0wLiAgW0thaSBSaXNrdSA8a3Jpc2t1QHRmLmh1dC5maT4gYW5kIFJveSBGaWVsZGluZ10KLQotICAqKSBpbnZva2VfaGFuZGxlcigpIGRvZXNuJ3QgaGFuZGxlIG1pbWUgYXJndW1lbnRzIGluIGNvbnRlbnQtdHlwZQotICAgICBbUGV0ciBMYW1wYV0gUFIjMTYwCi0KLSAgKikgUmVkdWNlZCBJZGVudGl0eUNoZWNrIHRpbWVvdXQgdG8gMzAgc2Vjb25kcywgYXMgcGVyIFJGQyAxNDEzIG1pbmltdW0uCi0gICAgIFtLZW4gQ29hcl0KLQotICAqKSBGaXhlZCBwcm9ibGVtIHdpdGggRXJyb3JEb2N1bWVudCBub3Qgd29ya2luZyBmb3IgdmlydHVhbCBob3N0cwotICAgICBkdWUgdG8gb25lIG9mIHRoZSBwZXJmb3JtYW5jZSBjaGFuZ2VzIGluIDEuMmI3LiBbRGVhbiBHYXVkZXRdCi0KLSAgKikgTG9nIGFuIGVycm9yIG1lc3NhZ2UgaWYgd2UgZ2V0IGEgcmVxdWVzdCBoZWFkZXIgdGhhdCBpcyB0b28gbG9uZywKLSAgICAgc2luY2UgaXQgbWF5IGluZGljYXRlIGEgYnVmZmVyIG92ZXJmbG93IGF0dGFjay4gW01hcmMgU2xlbWtvXQotCi0gICopIE1hZGUgaXNfdXJsKCkgYWxsb3cgIlstLithLXpBLVowLTldKzoiIGFzIGEgdmFsaWQgc2NoZW1lIGFuZAotICAgICBub3QgcmVqZWN0IFVSTHMgd2l0aG91dCBhIGRvdWJsZS1zbGFzaCwgYXMgcGVyIFJGQzIwNjggc2VjdGlvbiAzLjIuCi0gICAgIFtLZW4gQ29hcl0gUFIgIzE0NiwgIzE4NwotCi0gICopIEFkZGVkIHRhYmxlIGVudHJ5IHBsYWNlaG9sZGVyIGZvciBuZXcgaGVhZGVyX3BhcnNlciBjYWxsYmFjawotICAgICBpbiBhbGwgb2YgdGhlIGRpc3RyaWJ1dGVkIG1vZHVsZXMuIFtLZW4gQ29hcl0gUFIgIzE5MQotCi0gICopIEFsbG93IGZvciBjZ2kgZmlsZXMgd2l0aG91dCB0aGUgLkVYRSBleHRlbnNpb24gb24gdGhlbSB1bmRlciBPUy8yLgotICAgICBbR2FyZXkgU21pbGV5XSBQUiAjNTkKLQotICAqKSBGaXhlZCBlcnJvciBtZXNzYWdlIHdoZW4gcmVzb3VyY2UgaXMgbm90IGZvdW5kIGFuZCBVUkwgY29udGFpbnMKLSAgICAgcGF0aCBpbmZvLiBbUGV0ciBMYW1wYSBhbmQgRGVhbiBHYXVkZXRdIFBSICM0MAotCi0gICopIEZpeGVkIHVzZXIgYW5kIHNlcnZlciBjb25mdXNpb24gb3ZlciB3aGF0IHNob3VsZCBiZSBhIHZpcnR1YWwgaG9zdAotICAgICBhbmQgd2hhdCBpcyB0aGUgbWFpbiBzZXJ2ZXIsIHJlc3VsdGluZyBpbiBhY2Nlc3MgdG8gc29tZXRoaW5nCi0gICAgIG90aGVyIHRoYW4gdGhlIG5hbWUgZGVmaW5lZCBpbiB0aGUgdmlydHVhbGhvc3QgZGlyZWN0aXZlIChidXQKLSAgICAgd2l0aCB0aGUgc2FtZSBJUCBhZGRyZXNzKSBmYWlsaW5nLiBbRGVhbiBHYXVkZXRdCi0KLSAgKikgVXBkYXRlZCBtb2RfcmV3cml0ZSB0byB2ZXJzaW9uIDMuMC4yLCB3aGljaDogZml4ZXMgY29tcGlsZSBlcnJvciBvbgotICAgICBBSVg7IGltcHJvdmVzIHRoZSByZWRpcmVjdGlvbiBzdHVmZiB0byBlbmFibGUgdGhlIHVzZXJzIHRvIGdlbmVyYWxseQotICAgICByZWRpcmVjdCB0byBodHRwLCBodHRwcywgZ29waGVyIGFuZCBmdHA7IGFkZGVkIFRJTUUgdmFyaWFibGUgZm9yCi0gICAgIFJld3JpdGVDb25kIHdoaWNoIGV4cGFuZHMgdG8gWVlZWU1NRERISE1NU1Mgc3RyaW5ncyBhbmQgYWRkZWQgdGhlCi0gICAgIHNwZWNpYWwgcGF0dGVybnMgPlNUUklORywgPFNUUklORyBhbmQgPVNUUklORyB0byBSZXdyaXRlQ29uZCwgd2hpY2gKLSAgICAgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAle1RJTUV9IG9yIG90aGVyIHZhcmlhYmxlcyB0byBjcmVhdGUKLSAgICAgdGltZS1kZXBlbmRlbnQgcmV3cml0aW5nIHJ1bGVzLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KLQotICAqKSBicHVzaGZkKCkgbm8gbG9uZ2VyIG5vdGVzIGNsZWFudXBzIGZvciB0aGUgZmlsZSBkZXNjcmlwdG9ycyBpdCBpcyBoYW5kZWQuCi0gICAgIE1vZHVsZSBhdXRob3JzIG1heSBuZWVkIHRvIGFkanVzdCB0aGVpciBjb2RlIGZvciBwcm9wZXIgY2xlYW51cCB0byB0YWtlCi0gICAgIHBsYWNlICh0aGF0IGlzLCBjYWxsIG5vdGVfY2xlYW51cHNfZm9yX2ZkKCkpLiBUaGlzIGNoYW5nZSBmaXhlcyBwcm9ibGVtcwotICAgICB3aXRoIGZpbGUgZGVzY3JpcHRvcnMgYmVpbmcgZXJyb25lb3VzbHkgY2xvc2VkIHdoZW4gdGhlIHByb3h5IG1vZHVsZSB3YXMKLSAgICAgaW4gdXNlLiBbQmVuIExhdXJpZV0KLQotICAqKSBGaXggYnVnIGluIHN1ZXhlYyByZWludHJvZHVjZWQgYnkgY2hhbmdlcyBpbiAxLjJiNyB3aGljaCBhbGxvd3MKLSAgICAgaW5pdGdyb3VwcygpIHRvIGhvc2UgdGhlIGdyb3VwIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgbGF0ZXIKLSAgICAgY29tcGFyaXNvbnMuIFtSYW5keSBUZXJidXNoXQotCi0gICopIFJlbW92ZSB1bm5lY2Vzc2FyeSBjYWxsIHRvIHZhX2VuZCgpIGluIGNyZWF0ZV9hcmd2KCkgd2hpY2gKLSAgICAgY2F1c2VkIGEgU0VHViBvbiBzb21lIHN5c3RlbXMuCi0KLSAgKikgVXNlIHByb3BlciBNQVhIT1NUTkFNRUxFTiBzeW1ib2wgZm9yIGxpbWl0aW5nIGxlbmd0aCBvZiBzZXJ2ZXIgbmFtZS4KLSAgICAgW0RlYW4gR2F1ZGV0XQotCi0gICopIENsZWFyIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGxpc3RlbmVycy4gW1JhbmR5IFRlcmJ1c2hdCi0KLSAgKikgSW1wcm92ZWQgaGFuZGxpbmcgb2YgSVAgYWRkcmVzcyBhcyBhIHZpcnR1YWxob3N0IGFkZHJlc3MgYW5kCi0gICAgIGludHJvZHVjZWQgIl9kZWZhdWx0XyIgYXMgYSBzeW5vbnltIGZvciB0aGUgZGVmYXVsdCB2aG9zdCBjb25maWcuCi0gICAgIFtEZWFuIEdhdWRldF0gUFIgIzIxMgotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDEuMmI3Ci0KLSAgKikgUG9ydCB0byAgVVhQL0RTKFYyMCkgW1Rvc2hpYWtpIE5vbXVyYSA8bm9tQHlrLmZ1aml0c3UuY28uanA+XQotCi0gICopIHVuc2V0IENvbnRlbnQtTGVuZ3RoIGlmIGNodW5rZWQgKFJGQy0yMDY4KSBbUGV0ciBMYW1wYV0KLQotICAqKSBtb2RfbmVnb3RpYXRpb24gZml4ZXMgW1BldHIgTGFtcGFdIFBSIzE1NywgUFIjMTU4LCBQUiMxNTkKLSAgICAgLSByZXBsYWNlIHByb3RvY29sIHJlc3BvbnNlIG51bWJlcnMgd2l0aCBzeW1ib2xzCi0gICAgIC0gc2F2ZSB2YXJpYW50LWxpc3QgaW50byBtYWluIHJlcXVlc3Qgbm90ZXMKLSAgICAgLSBmcmVlIGFsbG9jYXRlZCBtZW1vcnkgZnJvbSBzdWJyZXF1ZXN0cwotICAgICAtIG1lcmdlIG5vdGVzLCBoZWFkZXJzX291dCBhbmQgZXJyX2hlYWRlcnNfb3V0Ci0KLSAgKikgY2hhbmdlZCBzdGF0dXMgY2hlY2sgbWFzayBpbiBwcm94eV9odHRwLmMgZnJvbSAiSFRUUC8jLiMgIyMjICoiIHRvCi0gICAgICJIVFRQLyMuIyAjIyMqIiB0byBiZSBtb3JlIGxlbmllbnQgYWJvdXQgd2hhdCB3ZSBhY2NlcHQuCi0gICAgIFtDaHVjayBNdXJja29dCi0KLSAgKikgbW9yZSBwcm94eSBGVFAgYnVnIGZpeGVzOgotICAgICAtIENoYW5nZWQgc2VuZF9kaXIoKSB0byByZW1vdmUgdXNlci9wYXNzd2QgZnJvbSBkaXNwbGF5ZWQgVVJMLgotICAgICAtIENoYW5nZWQgbG9naW4gZXJyb3IgbWVzc2FnZXMgdG8gYmUgbW9yZSBkZXNjcmlwdGl2ZS4KLSAgICAgLSByZW1vdmUgc2V0dGluZyBvZiBTT19ERUJVRyBzb2NrZXQgb3B0aW9uCi0gICAgIC0gTWFrZSBmdHBfZ2V0cmMoKSBtb3JlIGxlbmllbnQgYWJvdXQgbXVsdGlsaW5lIHJlc3BvbnNlcywKLSAgICAgICBzcGVjaWZpY2FsbHksIDIzMCByZXNwb25zZXMgd2hpY2ggZG9uJ3QgaGF2ZSBjb250aW51YXRpb24gMjMwLQotICAgICAgIG9uIGVhY2ggbGluZSkuIFRoZXNlIHNlZW0gdG8gYmUgYWxsIE5UIEZUUCBzZXJ2ZXJzLCBhbmQgd2hpbGUKLSAgICAgICBwZXJoYXBzIHF1ZXN0aW9uYWJsZSwgdGhleSBhcHBlYXIgdG8gYmUgbGVnYWwgYnkgUkZDIDk1OS4KLSAgICAgLSBBZGQgbWlzc2luZyBraWxsX3RpbWVvdXQoKSBhZnRlciB0cmFuc2ZlciB0byB1c2VyIGNvbXBsZXRlcy4KLSAgICAgW0NodWNrIE11cmNrb10KLQotICAqKSBGaXhlZCBwcm9ibGVtIHdoZXJlIGEgYnVzeSBzZXJ2ZXIgY291bGQgaGFuZyB3aGVuIHJlc3RhcnRpbmcKLSAgICAgYWZ0ZXIgYmVpbmcgc2VudCBhIFNJR0hVUCBkdWUgdG8gY2hpbGQgcHJvY2Vzc2VzIG5vdCBleGl0aW5nLgotICAgICBbTWFyYyBTbGVta29dCi0KLSAgKikgTW9kaWZ5IG1vZF9pbmNsdWRlIGVzY2FwaW5nIHNvIGEgJ1wnIG9ubHkgc2lnbmlmaWVzIGFuIGVzY2FwZWQKLSAgICAgY2hhcmFjdGVyIGlmIHRoZSBuZXh0IGNoYXJhY3RlciBpcyBvbmUgdGhhdCBuZWVkcwotICAgICBlc2NhcGluZy4gIFtCZW4gTGF1cmllXQotCi0gICopIEVsaW1pbmF0ZWQgcG9zc2libGUgaW5maW5pdGUgbG9vcCBpbiBtb2RfaW1hcCB3aGVuIHJlbGF0aXZlIFVSTHMgYXJlCi0gICAgIHVzZWQgd2l0aCBhICdiYXNlJyBkaXJlY3RpdmUgdGhhdCBkb2VzIG5vdCBoYXZlIGEgJy8nIGluIGl0LgotICAgICBbTWFyYyBTbGVta28sIHJlcG9ydGVkIGJ5IE9ubm8gV2l0dmxpZXQgPG9ubm9AdGMuaHNhLm5sPl0KLQotICAqKSBSZWR1Y2VkIHRoZSBkZWZhdWx0IHRpbWVvdXQgZnJvbSAxMjAwIHNlY29uZHMgdG8gMzAwLCBhbmQgdGhlCi0gICAgIG9uZSBpbiB0aGUgc2FtcGxlIGNvbmZpZ2ZpbGUgZnJvbSA0MDAgdG8gMzAwLiAgW01hcmMgU2xlbWtvXQotCi0gICopIFN0b3AgdmJwcmludGYgZnJvbSBjcmFzaGluZyBpZiBnaXZlbiBhIE5VTEwgc3RyaW5nIHBvaW50ZXI7Ci0gICAgIHByaW50IChudWxsKSBpbnN0ZWFkLiAgW0tlbiBDb2FyXQotCi0gICopIERvbid0IGRpc2FibGUgTmFnbGUgYWxnb3JpdGhtIGlmIHN5c3RlbSBkb2Vzbid0IGhhdmUgVENQX05PREVMQVkuCi0gICAgIFtNYXJjIFNsZW1rbyBhbmQgUm95IEZpZWxkaW5nXQotCi0gICopIEZpeGVkIHByb2JsZW0gd2l0aCBtb2RfY2dpLWdlbmVyYXRlZCBpbnRlcm5hbCByZWRpcmVjdHMgdHJ5aW5nIHRvCi0gICAgIHJlYWQgdGhlIHJlcXVlc3QgbWVzc2FnZS1ib2R5IHR3aWNlLiBbQXJjaGllIENvYmJzIGFuZCBSb3kgRmllbGRpbmddCi0KLSAgKikgUmVkdWNlZCB0aW1lb3V0IG9uIGxpbmdlcmluZyBjbG9zZSwgcmVtb3ZlZCBwb3NzaWJpbGl0eSBvZiBhIGJsb2NrZWQKLSAgICAgcmVhZCBjYXVzaW5nIHRoZSBjaGlsZCB0byBoYW5nLCBhbmQgc3RvcHBlZCBsb2dnaW5nIG9mIGVycm9ycyBpZgotICAgICB0aGUgc29ja2V0IGlzIG5vdCBjb25uZWN0ZWQgKHJlc2V0IGJ5IGNsaWVudCkuICBbUm95IEZpZWxkaW5nXQotCi0gICopIFJlYXJyYW5nZWQgbWFpbiBjaGlsZCBsb29wIHRvIHJlbW92ZSBkdXBsaWNhdGlvbiBvZiBjb2RlIGluCi0gICAgIHNlbGVjdC9hY2NlcHQgYW5kIGtlZXAtYWxpdmUgcmVxdWVzdHMsIGZpeGVkIHNldmVyYWwgYnVncyByZWdhcmRpbmcKLSAgICAgY2hlY2tpbmcgc2NvcmVib2FyZF9pbWFnZSBmb3IgZXhpdCBpbmRpY2F0aW9uIGFuZCBmYWlsdXJlIHRvCi0gICAgIGFjY291bnQgZm9yIGFsbCBzdWNjZXNzIGNvbmRpdGlvbnMgYW5kIHRyYXAgYWxsIGVycm9yIGNvbmRpdGlvbnMsCi0gICAgIHByZXZlbnRlZCBtdWx0aXBsZSBmbHVzaGVzIGJlZm9yZSBjbG9zaW5nIHRoZSBzb2NrZXQ7IGNsb3NlIHRoZSBlbnRpcmUKLSAgICAgc29ja2V0IGJ1ZmZlciBpbnN0ZWFkIG9mIGp1c3Qgb25lIGRlc2NyaXB0b3IsIHByZXZlbnQgbG9nZ2luZyBvZgotICAgICBFUFJPVE8gYW5kIEVDT05OQUJPUlRFRCBvbiBwbGF0Zm9ybXMgd2hlcmUgc3VwcG9ydGVkLCBhbmQgZ2VuZXJhbGx5Ci0gICAgIGltcHJvdmVkIHJlYWRhYmlsaXR5LiAgW1JveSBGaWVsZGluZ10KLQotICAqKSBFeHRlbnNpdmUgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzLiBDbGVhbmVkIHVwIGluZWZmaWNpZW50IHVzZSBvZgotICAgICBhdXRvIGluaXRpYWxpemVycywgbXVsdGlwbGUgaXNfbWF0Y2hleHAgY2FsbHMgb24gYSBzdGF0aWMgc3RyaW5nLAotICAgICBhbmQgZXhjZXNzaXZlIG1lcmdpbmcgb2YgcmVzcG9uc2VfY29kZV9zdHJpbmdzLiBbRGVhbiBHYXVkZXRdCi0KLSAgKikgQWRkZWQgZG91YmxlLWJ1ZmZlcmluZyB0byBtb2RfaW5jbHVkZSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIG9uCi0gICAgIHNlcnZlci1zaWRlIGluY2x1ZGVzLiBbTWFyYyBTbGVta29dCi0KLSAgKikgU2V2ZXJhbCBmaXhlcyBmb3Igc3VleGVjIHdyYXBwZXIuIFtSYW5keSBUZXJidXNoXQotICAgICAtIE1ha2Ugd3JhcHBlciB3b3JrIGZvciBmaWxlcyBvbiBORlMgZmlsZXN5c3RlbS4KLSAgICAgLSBGaXggcG9ydGFiaWxpdHkgcHJvYmxlbSBvZiBNQVhQQVRITEVOLgotICAgICAtIEZpeCBhcnJheSBvdmVycnVuIHByb2JsZW0gaW4gY2xlYW5fZW52KCkuCi0gICAgIC0gRml4IGFsbG9jYXRpb24gb2YgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZQotCi0gICopIFJlbW92ZWQgZXh0cmFuZW91cyBibGFuayBsaW5lIGlzIGRlc2NyaXB0aW9uIG9mIG1vZF9zdGF0dXMgY2hhcnMuCi0gICAgIFtLdXJ0IEtvaGxlcl0KLQotICAqKSBMb2dnaW5nIG9mIGVycm9ycyBmcm9tIHRoZSBjYWxsX2V4ZWMgcm91dGluZSBzaW1wbHkgd2VudCBub3doZXJlLAotICAgICBzaW5jZSB0aGUgbG9nZmlsZSBmZCBoYXMgYmVlbiBjbG9zZWQsIHNvIG5vdyB3ZSBzZW5kIHRoZW0gdG8gc3RkZXJyLgotICAgICBbSGFyYWxkIFQuIEFsdmVzdHJhbmRdCi0KLSAgKikgRml4ZWQgY29yZSBkdW1wIHdoZW4gRG9jdW1lbnRSb290IGlzIGEgQ0dJLgotICAgICBbQmVuIExhdXJpZSwgcmVwb3J0ZWQgYnkgZ2VkZGlzQHRlc3NlcmFlLmNvbV0KLQotICAqKSBGaXhlZCBwb3RlbnRpYWwgZmlsZSBkZXNjcmlwdG9yIGxlYWsgaW4gbW9kX2FzaXM7IHVwZGF0ZWQgaXQgYW5kCi0gICAgIGh0dHBfY29yZSB0byB1c2UgcGZvcGVuL3BmY2xvc2UgaW5zdGVhZCBvZiBmb3Blbi9mY2xvc2UuCi0gICAgIFtSYW5keSBUZXJidXNoIGFuZCBSb3kgRmllbGRpbmddCi0KLSAgKikgRml4ZWQgaGFuZGxpbmcgb2YgdW5zaWduZWQgaW50cyBpbiBhcF9zbnByaW50ZigpIG9uIHNvbWUgY2hpcHMgc3VjaAotICAgICBhcyB0aGUgREVDIEFscGhhIHdoaWNoIGlzIDY0LWJpdCBidXQgdXNlcyAzMi1iaXQgaW50cy4KLSAgICAgW0RlYW4gR2F1ZGV0IGFuZCBLZW4gQ29hcl0KLQotICAqKSBSZXR1cm4gYSAzMDIgcmVzcG9uc2UgY29kZSB0byB0aGUgY2xpZW50IHdoZW4gc2VuZGluZyBhIHJlZGlyZWN0Ci0gICAgIGR1ZSB0byBhIG1pc3NpbmcgdHJhaWxpbmcgJy8nIG9uIGEgZGlyZWN0b3J5IGluc3RlYWQgb2YgYSAzMDE7IG5vdwotICAgICBpdCBpcyBjYWNoZWFibGUuIFtNYXJrdXMgR3lnZXJdCi0KLSAgKikgRml4IGNvbmRpdGlvbiB3aGVyZSwgaWYgYSBiYWQgZGlyZWN0aXZlIG9jY3VycyBpbiAuaHRhY2Nlc3MsIGFuZAotICAgICBzdWJfcmVxdWVzdCgpIGdvZXMgZmlyc3QgdG8gdGhpcyBkaXJlY3RvcnksIHRoZW4gbG9nX3JlYXNvbigpIHdpbGwKLSAgICAgU0lHU0VHViBiZWNhdXNlIGl0IGRvZXNuJ3QgaGF2ZSBpbml0aWFsaXplZCByLT5wZXJfZGlyX2NvbmZpZy4KLSAgICAgW1BSIzE2MiBmcm9tIFBldHIgTGFtcGEsIGZpeCBieSBNYXJjIFNsZW1rbyBhbmQgRGVhbiBHYXVkZXRdCi0KLSAgKikgRml4IGhhbmRsaW5nIG9mIGxhbmdfaW5kZXggaW4gaXNfdmFyaWFudF9iZXR0ZXIoKS4gIFRoaXMgd2FzCi0gICAgIGNhdXNpbmcgcHJvYmxlbXMgd2hpY2ggcmVzdWx0ZWQgaW4gdGhlIHNlcnZlciBzZW5kaW5nIHRoZQotICAgICB3cm9uZyBsYW5ndWFnZSBkb2N1bWVudCBpbiBzb21lIGNhc2VzLiBbUGV0ciBMYW1wYV0KLQotICAqKSBSZW1vdmUgZnJlZSgpIGZyb20gY2xlYW5fZW52KCkgaW4gc3VleGVjIHdyYXBwZXIuIFRoaXMgd2FzIG51a2luZwotICAgICB0aGUgY2xlYW4gZW52aXJvbm1lbnQgb24gc29tZSBzeXN0ZW1zLgotCi0gICopIFR3ZWFrIGJ5dGVzZXJ2aW5nIGNvZGUgKGUuZy4gc2VydmluZyBQREYgZmlsZXMpIHRvIHdvcmsgYXJvdW5kCi0gICAgIGJ1Z3MgaW4gTmV0c2NhcGUgTmF2aWdhdG9yIGFuZCBNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIuCi0gICAgIEVtaXQgQ29udGVudC1MZW5ndGggaGVhZGVyIHdoZW4gc2VuZGluZyBtdWx0aXBhcnQvYnl0ZXJhbmdlcy4KLSAgICAgW0FsZXhlaSBLb3N1dF0KLQotICAqKSBQb3J0IHRvIEhJLVVYL1dFMi4gW05pY2sgTWFjbGFyZW5dCi0KLSAgKikgUG9ydCB0byBIUCBNUEUgb3BlcmF0aW5nIHN5c3RlbSBmb3IgSFAgMzAwMCBtYWNoaW5lcwotICAgICBbTWFyayBCaXhieSA8bWFya2JAY2NjZC5lZHU+XQotCi0gICopIEZpeGVkIGJ1ZyB3aGljaCBjYXVzZWQgYSBzZWdtZW50YXRpb24gZmF1bHQgaWYgb25seSBvbmUgYXJndW1lbnQKLSAgICAgZ2l2ZW4gdG8gUkxpbWl0KiBkaXJlY3RpdmVzLiBbRWQgS29ydGhvZl0KLQotICAqKSBDb250aW51ZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gYWZ0ZXIgMjA0IG9yIDMwNCByZXNwb25zZS4gW0RlYW4gR2F1ZGV0XQotCi0gICopIEltcHJvdmVkIGJ1ZmZlcmVkIG91dHB1dCB0byB0aGUgY2xpZW50IGJ5IGRlbGF5aW5nIHRoZSBmbHVzaCBkZWNpc2lvbgotICAgICB1bnRpbCB0aGUgQlVGRiBjb2RlIGlzIGFjdHVhbGx5IGFib3V0IHRvIHJlYWQgdGhlIG5leHQgcmVxdWVzdC4KLSAgICAgVGhpcyBmaXhlcyBhIHByb2JsZW0gaW50cm9kdWNlZCBpbiAxLjJiNSB3aXRoIGNsaWVudHMgdGhhdCBzZW5kCi0gICAgIGFuIGV4dHJhIENSTEYgYWZ0ZXIgYSBQT1NUIHJlcXVlc3QuIEFsc28gaW1wcm92ZWQgY2h1bmtlZCBvdXRwdXQKLSAgICAgcGVyZm9ybWFuY2UgYnkgY29tYmluaW5nIHdyaXRlcyB1c2luZyB3cml0ZXYoKSBhbmQgcmVtb3ZpbmcgYXMKLSAgICAgbWFueSBiZmx1c2goKSBjYWxscyBhcyBwb3NzaWJsZS4gIE5PVEU6IFBsYXRmb3JtcyB3aXRob3V0IHdyaXRldigpCi0gICAgIG11c3QgYWRkIC1ETk9fV1JJVEVWIHRvIHRoZSBjb21waWxlciBDRkxBR1MsIGVpdGhlciBpbiBDb25maWd1cmF0aW9uCi0gICAgIG9yIENvbmZpZ3VyZSwgdW5sZXNzIHdlIGhhdmUgYWxyZWFkeSBkb25lIHNvLiAgW0RlYW4gR2F1ZGV0XQotCi0gICopIEZpeGVkIG1vZF9yZXdyaXRlIGJ1ZyB3aGljaCB0cnVuY2F0ZWQgdGhlIHJld3JpdHRlbiBVUkwgW01hcmMgU2xlbWtvXQotCi0gICopIEZpeGVkIG1vZF9pbmZvIG91dHB1dCBjb3JydXB0aW9uIGJ1ZyBpbnRyb2R1Y2VkIGJ5IGJ1ZmZlciBvdmVyZmxvdwotICAgICBmaXhlcy4gW0RlYW4gR2F1ZGV0XQotCi0gICopIEZpeGVkIGh0dHBfcHJvdG9jb2wgdG8gY29ycmVjdGx5IG91dHB1dCBhbGwgSFRUUC8xLjEgaGVhZGVycywgaW5jbHVkaW5nCi0gICAgIGZvciB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgMzA0IHJlc3BvbnNlLiAgW1BhdWwgU3V0dG9uXQotCi0gICopIEltcHJvdmVkIGhhbmRsaW5nIG9mIFRSQUNFIG1ldGhvZCBieSBieXBhc3Npbmcgbm9ybWFsIG1ldGhvZCBoYW5kbGluZwotICAgICBhbmQgaGVhZGVyIHBhcnNpbmcgcm91dGluZXM7IGZpeGVkIEFsbG93IHJlc3BvbnNlIHRvIGFsd2F5cyBhbGxvdyBUUkFDRS4KLSAgICAgW0RlYW4gR2F1ZGV0XQotCi0gICopIEZpeGVkIGNvbXBpbGVyIHdhcm5pbmdzIGluIHRoZSByZWdleCBsaWJyYXJ5LiBbRGVhbiBHYXVkZXRdCi0KLSAgKikgQ2xlYW5lZC11cCBzb21lIG9mIHRoZSBnZW5lcmF0ZWQgSFRNTC4gW0tlbiBDb2FyXQotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDEuMmI2Ci0KLSAgKikgQWxsb3cgd2hpdGVzcGFjZSBpbiBpbWFnZW1hcCBtYXBmaWxlIGNvb3JkaW5hdGVzLiBbTWFyYyBTbGVta29dCi0KLSAgKikgRml4IHR5cG8gaW50cm9kdWNlZCBpbiBmaXggZm9yIHBvdGVudGlhbCBpbmZpbml0ZSBsb29wIGFyb3VuZAotICAgICBhY2NlcHQoKSBpbiBjaGlsZF9tYWluKCkuIFRoaXMgY2hhbmdlIGNhdXNlZCB0aGUgcmV2IHRvIDEuMmI2LgotICAgICAxLjJiNSB3YXMgbmV2ZXIgYSBwdWJsaWMgYmV0YS4KLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjJiNQotCi0gICopIENoYW5nZSBLZWVwQWxpdmUgc2VtYW50aWNzIChPbnxPZmYgaW5zdGVhZCBvZiBhIG51bWJlciksIGFkZAotICAgICBNYXhLZWVwQWxpdmVSZXF1ZXN0cyBkaXJlY3RpdmUuIFtBbGV4ZWkgS29zdXRdCi0KLSAgKikgVmFyaW91cyBOZVhUIGNvbXBpbGF0aW9uIHBhdGNoZXMsIGFzIHdlbGwgYXMgYSBjaGFuZ2UgaW4KLSAgICAgcmVnZXgvcmVnY29tcC5jIHNpbmNlIHRoYXQgZmlsZSBhbHNvIHVzZWQgYSBORVhUIGRlZmluZS4KLSAgICAgW0FuZHJlYXMgS29lbmlnXQotCi0gICopIEFsbG93ICogdG8gdGVybWluYXRlIHRoZSBlbmQgb2YgYSBkaXJlY3RvcnkgbWF0Y2ggaW4gbW9kX2Rpci4KLSAgICAgQWxsb3dzIC9+KiB0byBtYXRjaCBmb3IgYm90aCAvfmpvZSBhbmQgL35qb2UvLiBbRGF2aWQgQnJvbmRlcl0KLQotICAqKSBEb24ndCBjYWxsIGNhbl9leGVjKCkgaWYgc3VleGVjX2VuYWJsZWQuIENhbGxpbmcgdGhpcyByZXF1aXJlcwotICAgICBzY3JpcHRzIGV4ZWN1dGVkIGJ5IHRoZSBzdWV4ZWMgd3JhcHBlciB0byBiZSB3b3JsZCBleGVjdXRhYmxlLCB3aGljaAotICAgICBkZWZlYXRzIG9uZSBvZiB0aGUgYWR2YW50YWdlcyBvZiBydW5uaW5nIHRoZSB3cmFwcGVyLiBbUmFuZHkgVGVyYnVzaF0KLQotICAqKSBQb3J0YWJpbGl0eSBGaXg6IElSSVggY29tcGxhaW5lZCB3aXRoICdtYWtlIGNsZWFuJyBhYm91dCAqcHVyZSogKHJlbW92ZWQpCi0gICAgIFtKaW0gSmFnaWVsc2tpXQotCi0gICopIE1pZ3JhdGlvbiBmcm9tIHNwcmludGYoKSB0byBzbnByaW50ZigpIHRvIGF2b2lkIGJ1ZmZlcgotICAgICBvdmVyZmxvd3MuIFtNYXJjIFNsZW1rb10KLQotICAqKSBQcm92aWRlIHBvcnRhYmxlIHNucHJpbnRmKCkgaW1wbGVtZW50YXRpb24gKGFwX3NucHJpbnRmKQotICAgICBhcyB3ZWxsIGFzICpjdnQgZmFtaWx5LiBbSmltIEphZ2llbHNraV0KLQotICAqKSBQb3J0YWJpbGl0eSBGaXg6IE5lWFQgbGFja3MgdW5pc3RkLmggc28gd2Ugd3JhcCBpdCdzIGluY2x1c2lvbgotICAgICBbSmltIEphZ2llbHNraV0KLQotICAqKSBSZW1vdmUgbW9kX2Zhc3RjZ2kuYyBmcm9tIHRoZSBkaXN0cmlidXRpb24uIFRoaXMgbW9kdWxlIGFwcGVhcnMKLSAgICAgdG8gYmUgbWFpbnRhaW5lZCBtb3JlIHRocm91Z2ggdGhlIE9wZW4gTWFya2V0IGNoYW5uZWxzIGFuZCBzaG91bGQKLSAgICAgY29udGludWUgdG8gYmUgZWFzaWx5IGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmZhc3RjZ2kuY29tLwotCi0gICopIEZpeGVkIGJ1ZyBpbiBtb2R1bGVzL01ha2VmaWxlIHRoYXQgd291bGRuJ3QgYWxsb3cgYnVpbGRpbmcgaW4gbW9yZQotICAgICB0aGFuIG9uZSBzdWJkaXJlY3RvcnkgKG9yIGNsZWFuaW5nLCBlaXRoZXIpLiBbSmVyZW15IExhaWRtYW5dCi0KLSAgKikgbW9kX2luZm8gYXNzdW1lZCB0aGF0IHRoZSBjb25maWcgZmlsZXMgd2VyZSByZWxhdGl2ZSB0byBTZXJ2ZXJSb290LgotICAgICBbS2VuIHRoZSBSb2RlbnRdCi0KLSAgKikgQ0dJIHNjcmlwdHMgY2FsbGVkIGFzIGFuIGVycm9yIGRvY3VtZW50IHJlc3VsdGluZyBmcm9tIGZhaWxlZAotICAgICBDR0kgZXhlY3V0aW9uIHdvdWxkIGhhbmcgd2FpdGluZyBmb3IgUE9TVCdlZCBkYXRhLiBbUm9iIEhhcnRpbGxdCi0KLSAgKikgTG9nIHJlYXNvbiB3aGVuIG1vZF9kaXIgcmV0dXJucyBhY2Nlc3MgSFRUUF9GT1JCSURERU4KLSAgICAgW0tlbiB0aGUgUm9kZW50XQotCi0gICopIFByb3Blcmx5IGNoZWNrIGVycm5vIHRvIHByZXZlbnQgZGlzcGxheSBvZiBhIGRpcmVjdG9yeSBpbmRleAotICAgICB3aGVuIHNlcnZlciByZWNlaXZlcyBhIGxvbmcgZW5vdWdoIFVSTCB0byBjb25mdXNlIHN0YXQoKS4KLSAgICAgW01hcmMgU2xlbWtvXQotCi0gICopIFNldmVyYWwgc2VjdXJpdHkgZW5oYW5jZW1lbnRzIHRvIHN1ZXhlYyB3cmFwcGVyLiBJdCBpcyBfaGlnaGx5XwotICAgICByZWNvbW1lbmRlZCB0aGF0IHByZXZpb3VzbHkgaW5zdGFsbGVkIHZlcnNpb25zIG9mIHRoZSB3cmFwcGVyCi0gICAgIGJlIHJlcGxhY2VkIHdpdGggdGhpcyB2ZXJzaW9uLiAgW1JhbmR5IFRlcmJ1c2gsIEphc29uIERvdXJdCi0KLSAgICAgICAgLSB+dXNlciBleGVjdXRpb24gbm93IHByb3Blcmx5IHJlc3RyaWN0ZWQgdG8gfnVzZXIncyBob21lCi0gICAgICAgICAgZGlyZWN0b3J5IGFuZCBiZWxvdy4KLSAgICAgICAgLSBleGVjdXRpb24gcmVzdHJpY3RlZCB0byBVSUQvR0lEID4gMTAwCi0gICAgICAgIC0gcmVzdHJpY3QgcGFzc2VkIGVudmlyb25tZW50IHRvIGtub3duIHZhcmlhYmxlcwotICAgICAgICAtIGNhbGwgc2V0Z2lkKCkgYmVmb3JlIGluaXRncm91cHMoKSAocG9ydGFiaWxpdHkgZml4KQotICAgICAgICAtIHJlbW92ZSB1c2Ugb2Ygc2V0ZW52KCkgKHBvcnRhYmlsaXR5IGZpeCkKLQotICAqKSBBZGQgSFRUUC8xLjAgcmVzcG9uc2UgZm9yY2luZy4gW0JlbiBMYXVyaWVdCi0KLSAgKikgQWRkIGFjY2VzcyBjb250cm9sIHZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIFtCZW4gTGF1cmllXQotCi0gICopIEFkZCByZmx1c2goKSBmdW5jdGlvbi4gW0FsZXhlaSBLb3N1dF0KLQotICAqKSByZW1vdmUgZHVwbGljYXRlIHBjYWxsb2MoKSBjYWxsIGluIG5ld19jb25uZWN0aW9uKCkuCi0KLSAgKikgRml4IGluY29ycmVjdCBjb21wYXJpc29uIHdoaWNoIGNvdWxkIGFsbG93IG51bWJlciBvZiBjaGlsZHJlbiA9Ci0gICAgIE1heENsaWVudHMgKyAxIGlmIGxlc3MgdGhhbiBIQVJEX1NFUlZFUl9MSU1JVC4gQWxzbyBmaXggcG90ZW50aWFsCi0gICAgIHByb2JsZW0gaWYgU3RhcnRTZXJ2ZXJzID4gSEFSRF9TRVJWRVJfTElNSVQuIFtFZCBLb3J0aG9mXQotCi0gICopIFVwZGF0ZWQgc3VwcG9ydCBmb3IgT1NlcyAoTWFjaFRlbiwgVUxUUklYLCBQYXJhZ29uLCBJU0MsIE9wZW5CU0QKLSAgICAgQUlYIFBTLzIsIENPTlZFWE9TLiBbSmltIEphZ2llbHNraV0KLQotICAqKSBSZXBsYWNlIGluc3RhbmNlcyBvZiBpbmV0X250b2EoKSB3aXRoIGluZXRfYWRkcigpIGZvciBQcm94eUJsb2NrLgotICAgICBJdCdzIG1vcmUgcG9ydGFibGUuIFtNYXJ0aW4gS3JhZW1lcl0KLQotICAqKSBSZXBsYWNlIHJlZmVyZW5jZXMgdG8gbWFrZSBpbiBNYWtlZmlsZS50bXBsIHdpdGggJChNQUtFKS4KLSAgICAgW0NodWNrIE11cmNrb10KLQotICAqKSBBZGQgUHJveHlCbG9jayBkaXJlY3RpdmUgdy9JUCBhZGRyZXNzIGNhY2hpbmcuIEFkZCBJUCBhZGRyZXNzCi0gICAgIGNhY2hpbmcgdG8gTm9DYWNoZSBkaXJlY3RpdmUgYXMgd2VsbC4gUHJveHlCbG9jayB3b3JrcyB3aXRoIGFsbAotICAgICBoYW5kbGVyczsgTm9DYWNoZSBub3cgYWxzbyB3b3JrcyB3aXRoIEZUUCBmb3IgYW5vbnltb3VzIGxvZ2lucy4KLSAgICAgU3RpbGwgbW9yZSBjb2RlIGNsZWFudXAuIFtDaHVjayBNdXJja29dCi0KLSAgKikgQWRkICJoZWFkZXIgcGFyc2UiIEFQSSBob29rIFtCZW4gTGF1cmllXQotCi0gICopIEZpeCBieXRlIG9yZGVyaW5nIHByb2JsZW1zIGZvciBSRU1PVEVfUE9SVCBbQ2h1Y2sgTXVyY2tvXQotCi0gICopIHN1RVhFQyB3cmFwcGVyIHdhcyBmcmVlaW5nIG1lbW9yeSB0aGF0IGhhZCBub3QgYmVlbiBtYWxsb2MnZWQuCi0KLSAgKikgQ29ycmVjdGx5IGFsbG93IGFjY2VzcyBhbmQgYXV0aCBkaXJlY3RpdmVzIGluIDxGaWxlcz4gc2VjdGlvbnMgaW4KLSAgICAgc2VydmVyIGNvbmZpZyBmaWxlcy4gW0FsZXhlaSBLb3N1dF0KLQotICAqKSBGaXggYnVnIHdpdGggU2VydmVyUGF0aCB0aGF0IGNvdWxkIGNhdXNlIGNlcnRhaW4gZmlsZXMgdG8gYmUgbm90Ci0gICAgIGZvdW5kIGJ5IHRoZSBzZXJ2ZXIuIFtBbGV4ZWkgS29zdXRdCi0KLSAgKikgRml4IGhhbmRsaW5nIG9mIEVycm9yRG9jdW1lbnQgc28gdGhhdCBpdCBkb2Vzbid0IHJlbW92ZSBhIHRyYWlsaW5nCi0gICAgIGRvdWJsZS1xdW90ZSBmcm9tIHRleHQgYW5kIHNvIHRoYXQgaXQgcHJvcGVybHkgY2hlY2tzIGZvciB1bnN1cHBvcnRlZAotICAgICBzdGF0dXMgY29kZXMgdXNpbmcgdGhlIG5ldyBpbmRleF9vZl9yZXNwb25zZSBpbnRlcmZhY2UuIFtSb3kgRmllbGRpbmddCi0KLSAgKikgTXVsdGlwbGUgZml4ZXMgdG8gdGhlIGxpbmdlcmluZ19jbG9zZSBjb2RlIGluIG9yZGVyIHRvIGF2b2lkIGJlaW5nCi0gICAgIGludGVycnVwdGVkIGJ5IGEgc3RyYXkgdGltZW91dCwgdG8gYXZvaWQgbGluZ2VyaW5nIG9uIGEgY29ubmVjdGlvbgotICAgICB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gYWJvcnRlZCBvciBuZXZlciByZWFsbHkgZXhpc3RlZCwgdG8gZW5zdXJlIHRoYXQKLSAgICAgd2Ugc3RvcCBsaW5nZXJpbmcgYXMgc29vbiBhcyBhbnkgZXJyb3IgY29uZGl0aW9uIGlzIHJlY2VpdmVkLCBhbmQgdG8KLSAgICAgcHJldmVudCBiZWluZyBzdHVjayBpbmRlZmluaXRlbHkgaWYgdGhlIHJlYWQgYmxvY2tzLiAgQWxzbyBpbXByb3ZlcwotICAgICByZXBvcnRpbmcgb2YgZXJyb3IgY29uZGl0aW9ucy4gIFtNYXJjIFNsZW1rbyBhbmQgUm95IEZpZWxkaW5nXQotCi0gICopIEZpeGVkIGluaXRpYWxpemF0aW9uIG9mIHBhcmFtZXRlciBzdHJ1Y3R1cmUgZm9yIHNpZ2FjdGlvbi4KLSAgICAgW21neWdlckBpdHIuY2gsIEFkcmlhbiBGaWxpcGktTWFydGluXQotCi0gICopIEZpeGVkIHJlaW5pdGlhbGl6aW5nIHRoZSBwYXJhbWV0ZXJzIGJlZm9yZSBlYWNoIGNhbGwgdG8gYWNjZXB0IGFuZAotICAgICBzZWxlY3QsIGFuZCByZW1vdmVkIHBvdGVudGlhbCBmb3IgaW5maW5pdGUgbG9vcCBpbiBhY2NlcHQuCi0gICAgIFtSb3kgRmllbGRpbmcsIGFmdGVyIHVzZWZ1bCBQUiBmcm9tIGFkcmlhbkB2aXJnaW5pYS5lZHVdCi0KLSAgKikgRml4ZWQgY29uZGl0aW9uIHdoZXJlLCBpZiBhIGNoaWxkIGZhaWxzIHRvIGZvcmssIHRoZSBzY29yZWJvYXJkIHdvdWxkCi0gICAgIGNvbnRpbnVlIHRvIHNheSBTRVJWRVJfU1RBUlRJTkcgZm9yZXZlci4gRXZlbnR1YWxseSwgdGhlIG1haW4gcHJvY2VzcwotICAgICB3b3VsZCByZWZ1c2UgdG8gc3RhcnQgbmV3IGNoaWxkcmVuIGJlY2F1c2UgY291bnRfaWRsZV9zZXJ2ZXJzKCkgd2lsbAotICAgICBjb3VudCB0aG9zZSBTRVJWRVJfU1RBUlRJTkcgZW50cmllcyBhbmQgd2lsbCBhbHdheXMgcmVwb3J0IHRoYXQgdGhlcmUKLSAgICAgYXJlIGVub3VnaCBpZGxlIHNlcnZlcnMuIFtQaGlsbGlwIFZhbmRyeV0KLQotICAqKSBGaXhlZCBidWcgaW4gYmN3cml0ZSByZWdhcmRpbmcgZmFpbHVyZSB0byBhY2NvdW50IGZvciBwYXJ0aWFsIHdyaXRlcy4KLSAgICAgQXZvaWRlZCBjYWxsaW5nIGJmbHVzaCgpIHdoZW4gdGhlIGNsaWVudCBpcyBwaXBlbGluaW5nIHJlcXVlc3RzLgotICAgICBSZW1vdmVkIHVubmVjZXNzYXJ5IGZsdXNoZXMgZnJvbSBodHRwX3Byb3RvY29sLiBbRGVhbiBHYXVkZXRdCi0KLSAgKikgQWRkZWQgZGVzY3JpcHRpb24gb2YgIi4iIG1vZGUgaW4gc2VydmVyLXN0YXR1cyBbSmltIEphZ2llbHNraV0KLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjJiNAotCi0gICopIEZpeCBwb3NzaWJsZSByYWNlIGNvbmRpdGlvbiBpbiBhY2NlcHRfbXV0ZXhfaW5pdCgpIHRoYXQKLSAgICAgY291bGQgbGVhdmUgYSBzbWFsbCBzZWN1cml0eSBob2xlIG9wZW4gYWxsb3dpbmcgZmlsZXMgdG8gYmUKLSAgICAgb3ZlcndyaXR0ZW4gaW4gY2FzZXMgd2hlcmUgdGhlIHNlcnZlciBVSUQgaGFzIHdyaXRlIHBlcm1pc3Npb25zLgotICAgICBbTWFyYyBTbGVta29dCi0KLSAgKikgRml4IGF3ayBjb21wYXRpYmlsdHkgcHJvYmxlbSBpbiBDb25maWd1cmUuIFtKaW0gSmFnaWVsc2tpXQotCi0gICopIEZpeCBwb3J0YWJsaXR5IHByb2JsZW0gaW4gdXRpbF9zY3JpcHQgd2hlcmUgQVJHX01BWCBtYXkgbm90IGJlCi0gICAgIGRlZmluZWQgZm9yIHNvbWUgc3lzdGVtcy4KLQotICAqKSBBZGQgY2hhbmdlcyB0byBhbGxvdyBjb21waWxhdGlvbiBvbiBNYWNodGVuIDQuMC4zIGZvciBQb3dlclBDLgotICAgICBbUmFuZGFsIFNjaHdhcnR6XQotCi0gICopIE9TLzIgY2hhbmdlcyB0byBzdXBwb3J0IGFuIE1NQVAgc3R5bGUgc2NvcmVib2FyZCBmaWxlIGFuZCBVTklYCi0gICAgIHN0eWxlIG1hZ2ljICMhIHRva2VuIGZvciBiZXR0ZXIgc2NyaXB0IHBvcnRhYmlsaXR5LiBbR2FyZXkgU21pbGV5XQotCi0gICopIEZpeCBidWcgaW4gc3VleGVjIHdyYXBwZXIgaW50cm9kdWNlZCBpbiBiMyB0aGF0IHdvdWxkIGNhdXNlIGZhaWxlZAotICAgICBleGVjdXRpb24gZm9yIH51c2VyZGlyIENHSS4gW0phc29uIERvdXJdCi0KLSAgKikgRml4IGluaXRncm91cHMoKSBidXNpbmVzcyBpbiBzdWV4ZWMgd3JhcHBlci4gW0phc29uIERvdXJdCi0KLSAgKikgRml4IG1vbnRoIG9mZiBieSBvbmUgaW4gc3VleGVjIHdyYXBwZXIgbG9nZ2luZy4KLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjJiMzoKLQotICAqKSBGaXggZXJyb3IgaW4gbW9kX2NnaSB3aGljaCBjb3VsZCBjYXVzZSByZXNvdXJjZXMgbm90IHRvIGJlIHByb3Blcmx5Ci0gICAgIGZyZWVkLCBvciB3b3JzZS4gW0RlYW4gR2F1ZGV0XQotCi0gICopIEZpeCBmaW5kX3N0cmluZygpIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZS4gW0hvd2FyZCBGZWFyXQotCi0gICopIEFkZCBzZXRfZmxhZ19zbG90KCkgYXQgdGhlIHJlcXVlc3Qgb2YgRGlyayBhbmQgb3RoZXJzLgotICAgICBbRGlyayB2YW5HdWxpa10KLQotICAqKSBTeW5jIG1vZF9yZXdyaXRlIHdpdGggcGF0Y2ggbGV2ZWwgMTAuIFtSYWxmIEVuZ2Vsc2NoYWxsXQotCi0gICopIEFkZCBjaGFuZ2VzIHRvIGltcHJvdmUgdGhlIGVycm9yIG1lc3NhZ2UgZ2l2ZW4gZm9yIGludmFsaWQKLSAgICAgU2VydmVyTmFtZSBwYXJhbWV0ZXJzLiBbRGlyayB2YW5HdWxpa10KLQotICAqKSBBZGQgIkF1dGhvcml0YXRpdmUiIGRpcmVjdGl2ZSBmb3IgQXV0aCBtb2R1bGVzIHRoYXQgZG9uJ3QKLSAgICAgY3VycmVudGx5IGhhdmUgaXQuIFRoaXMgZ2l2ZXMgYWRtaW4gY29udHJvbCB0byBhc3NpZ24gYXV0aG9yaXRhdGl2ZQotICAgICBjb250cm9sIHRvIGFuIGF1dGhlbnRpY2F0aW9uIHNjaGVtZSBhbmQgYWxsb3cgImZhbGwgdGhyb3VnaCIgZm9yCi0gICAgIHRob3NlIGF1dGhlbnRpY2F0aW9uIG1vZHVsZXMgdGhhdCBhcmVuJ3QgIkF1dGhvcml0YXRpdmUiIHRoZXJlYnkKLSAgICAgYWxsb3dpbmcgbXVsdGlwbGUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyB0byBiZSBjaGFpbmVkLgotICAgICBbRGlyayB2YW5HdWxpa10KLQotICAqKSBSZW1vdmUgcmVxdWlyZW1lbnQgZm9yIFJlc291cmNlQ29uZmlnL0FjY2Vzc0NvbmZpZyBpZiBub3QgdXNpbmcKLSAgICAgdGhlIHRocmVlIGNvbmZpZyBmaWxlIGxheW91dC4gW1JhbmR5IFRlcmJ1c2hdCi0KLSAgKikgQWRkIFBBU1YgbW9kZSB0byBtb2RfcHJveHkgRlRQIGhhbmRsZXIuIFtDaHVjayBNdXJja29dCi0KLSAgKikgQ2hhbmdlcyB0byBzdWV4ZWMgd3JhcHBlciB0byBmaXggdGhlIGZvbGxvd2luZyBwcm9ibGVtczoKLSAgICAgMS4gIHN5bWxpbmtlZCBob21lZGlycyB3aWxsIGtpbGwgfnVzZXJkaXJzLgotICAgICAyLiAgaW5pdGdyb3VwcygpIG9uIExpbnV4IDIuMC54IGNsb2JiZXJzIGdyLT5ncmlkLgotICAgICAzLiAgQ0dJIGNvbW1hbmQgbGluZXMgcGFyYW10ZXJzIHByb2JsZW1zCi0gICAgIDQuICBwdy1wd2RpciBmb3IgImRvY3Jvb3QgY2hlY2siIHN0aWxsIHRoZSBodHRwZCB1c2VyJ3MgcHcgcmVjb3JkLgotICAgIFtSYW5keSBUZXJidXNoLCBKYXNvbiBEb3VyXQotCi0gICopIENoYW5nZSBjcmVhdGVfYXJndigpIHRvIGFjY2VwdCB2YXJpYWJsZSBhcmd1bWVudHMuIFRoaXMgZml4ZXMKLSAgICAgYSBwcm9ibGVtIHdoZXJlIGFyZ3VtZW50cyB3ZXJlIG5vdCBnZXR0aW5nIHBhc3NlZCB0byB0aGUgQ0dJIHZpYQotICAgICBhcmd2W10gd2hlbiB0aGUgc3VleGVjIHdyYXBwZXIgd2FzIGFjdGl2ZS4gW1JhbmR5IFRlcmJ1c2gsIEpha2UgQnVjaGhvbHpdCi0KLSAgKikgQ29sbGFwc2UgbXVsdGlwbGUgc2xhc2hlcyBpbiBwYXRoIFVSTHMgdG8gcHJvcGVybHkgYXBwbHkKLSAgICAgaGFuZGxlcnMgZGVmaW5lZCBieSA8TG9jYXRpb24+LiBbQWxleGVpIEtvc3V0XQotCi0gICopIERlZmluZSBhIHNhbmUgc2V0IG9mIERFRkFVTFRfVVNFUiBhbmQgREVGQVVMVF9HUk9VUCB2YWx1ZXMgZm9yIEFJWC4KLQotICAqKSBJbXByb3ZlIHRoZSBhY2N1cmFjeSBvZiByZXF1ZXN0IGR1cmF0aW9uIHRpbWluZ3MgYnkgc2V0dGluZwotICAgICByLT5yZXF1ZXN0X3RpbWUgaW4gcmVhZF9yZXF1ZXN0X2xpbmUoKSBpbnN0ZWFkIG9mIHJlYWRfcmVxdWVzdCgpLgotICAgICBbRGVhbiBHYXVkZXRdCi0KLSAgKikgUmVzZXQgdGltZW91dCB3aGlsZSByZWFkaW5nIHZpYSBnZXRfY2xpZW50X2Jsb2NrKCkgaW4gbW9kX2NnaS5jCi0gICAgIEZpeGVzIHByb2JsZW0gd2l0aCB0aW1lZCBvdXQgdHJhbnNmZXJzIG9mIGxhcmdlIGZpbGVzLiBbUmFzbXVzIExlcmRvcmZdCi0KLSAgKikgQWRkIHRoZSBhYmlsaXR5IHRvIHBhc3MgZGlmZmVyZW50IE1ha2VmaWxlLnRtcGwgZmlsZXMgdG8gQ29uZmlndXJlCi0gICAgIHVzaW5nIHRoZSAtbWFrZSBmbGFnLiBbUm9iIEhhcnRpbGxdCi0KLSAgKikgRml4IGNvcmVkdW1wIHRyaWdnZXJlZCB3aGVuIHNlbmRpbmcgYSBTSUdIVVAgdG8gdGhlIHNlcnZlciBjYXVzZWQKLSAgICAgYnkgYW4gYXNzZXJ0aW9uIGZhaWx1cmUsIGluIHR1cm4gY2F1c2VkIGJ5IGFuIHVuaW5pdGlhbGlzZWQgZmllbGQgaW4gYQotICAgICBsaXN0ZW5fcmVjLgotICAgICBbQmVuIExhdXJpZV0KLQotICAqKSBBZGQgRklMRVBBVEhfSU5GTyB2YXJpYWJsZSB0byBDR0kgZW52aXJvbm1lbnQsIHdoaWNoIGlzIGVxdWFsIHRvCi0gICAgIFBBVEhfSU5GTyBmcm9tIHByZXZpb3VzIHZlcnNpb25zIG9mIEFwYWNoZSAoaW4gY2VydGFpbiBzaXR1YXRpb25zLAotICAgICBBcGFjaGUgMS4yJ3MgUEFUSF9JTkZPIHdpbGwgYmUgZGlmZmVyZW50IHRoYW4gMS4xJ3MpLiBbQWxleGVpIEtvc3V0XQotICAgICBbbGF0ZXIgcmVtb3ZlZCBpbiAxLjJiMTFdCi0KLSAgKikgQWRkIHJ3cml0ZSgpIGZ1bmN0aW9uIHRvIEFQSSB0byBhbGxvdyBmb3Igc2VuZGluZyBzdHJpbmdzIG9mCi0gICAgIGFyYml0cmFyeSBsZW5ndGguIFtEb3VnIE1hY0VhY2hlcm5dCi0KLSAgKikgUmVtb3ZlIHJsaW1fdCB0eXBlZGVmIGZvciBOZXRCU0QuIERvIG9sZGVyIHZlcnNpb25zIG5lZWQgdGhpcz8KLQotICAqKSBEZWZpbmVkIHJsaW1fdCBhbmQgV0FOVEhTUkVHRVg9eWVzIGFuZCBmaXhlZCB3YWl0cGlkKCkgc3Vic3RpdHV0ZSBmb3IKLSAgICAgTmVYVC4gW0ppbSBKYWdpZWxza2ldCi0KLSAgKikgUmVtb3ZlZCByZWNlbnQgbW9kaWZpY2F0aW9uIHRvIHByb21vdGUgdGhlIHN0YXR1cyBjb2RlIG9uIGludGVybmFsCi0gICAgIHJlZGlyZWN0cywgc2luY2UgdGhlIGNvcnJlY3QgZml4IHdhcyB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgbG9nIGZvcm1hdAotICAgICBpbiBtb2RfbG9nX2NvbmZpZyBzbyB0aGF0IGl0IG91dHB1dHMgdGhlIG9yaWdpbmFsIHN0YXR1cy4gW1JvYiBIYXJ0aWxsXQotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDEuMmIyOgotCi0gICopIFVwZGF0ZSBzZXRfc2lnbmFscygpIHRvIHVzZSBzaWdhY3Rpb24oKSBmb3Igc2V0dGluZyBoYW5kbGVycy4KLSAgICAgVGhpcyBhcHBlYXJzIHRvIGZpeCBhIHJlLWVudHJhbnQgcHJvYmxlbSBpbiB0aGUgc2VnX2ZhdWx0KCkKLSAgICAgYnVzX2Vycm9yKCkgaGFuZGxlcnMuIFtSYW5keSBUZXJidXNoXQotCi0gICopIENoYW5nZXMgdG8gYWxsb3cgbW9kX3N0YXR1cyBjb21waWxlIGZvciBPUy8yIFtHYXJleSBTbWlsZXldCi0KLSAgKikgY2hhbmdlcyBmb3IgREVDIEFYUCBydW5uaW5nIE9TRi8xIHYzLjAuIFtNYXJjIEV2YW5zXQotCi0gICopIHByb3h5X2h0dHAuYyBidWdmaXhlczogIFtDaHVjayBNdXJja29dCi0gICAgICAgIDEpIGZpeGVzIHBvc3NpYmxlIE5VTEwgcG9pbnRlciByZWZlcmVuY2Ugdy9Ob0NhY2hlCi0gICAgICAgIDIpIGZpeGVzIE5vQ2FjaGUgYmVoYXZpb3Igd2hlbiB1c2luZyBQcm94eVJlbW90ZSAoUHJveHlSZW1vdGUKLSAgICAgICAgICAgaG9zdCB3b3VsZCBjYWNoZSBub3RoaW5nIGlmIGl0IHdhcyBpbiB0aGUgbG9jYWwgZG9tYWluLAotICAgICAgICAgICBhbmQgdGhlIGxvY2FsIGRvbWFpbiB3YXMgaW4gdGhlIE5vQ2FjaGUgbGlzdCkKLSAgICAgICAgMykgQWRkcyBIb3N0OiBoZWFkZXIgd2hlbiBub3QgYXZhaWxhYmxlCi0gICAgICAgIDQpIFNvbWUgY29kZSBjbGVhbnVwIGFuZCBjbGFyaWZpY2F0aW9uCi0KLSAgKikgbW9kX2luY2x1ZGUuYyBidWdmaXhlczoKLSAgICAgICAgMSkgRml4ZWQgYW4gb21taXNzaW9uIHRoYXQgY2F1c2VkIGluY2x1ZGUgdmFyaWFibGVzIHRvIG5vdAotICAgICAgICAgICBiZSBwYXJzZWQgaW4gY29uZmlnIGVycm1zZyBkaXJlY3RpdmVzIFtIb3dhcmQgRmVhcl0KLSAgICAgICAgMikgUmVtb3ZlIEhBVkVfUE9TSVhfUkVHRVggY3J1ZnQgW0FsZXhlaSBLb3N1dF0KLSAgICAgICAgMykgUGF0Y2ggdG8gZml4IGNvbXBpbGVyIHdhcm5pbmdzIFtwZXJyb3RAbGFsLmluMnAzLmZyXQotICAgICAgICA0KSBBbGxvdyBiYWNrc2xhc2gtZXNjYXBpbmcgdG8gYWxsIHF1b3RlZCB0ZXh0Ci0gICAgICAgICAgIFtCZW4gWW9zaGlubyA8YmVuQHdpbGlraS5lbmcuaGF3YWlpLmVkdT5dCi0gICAgICAgIDUpIFBhc3MgdmFyaWFibGUgdG8gY29tbWFuZCBsaW5lIGlmIG5vdCBzZXQgaW4gWFNTSSdzIGVudgotICAgICAgICAgICBbSG93YXJkIEZlYXJdCi0KLSAgKikgRml4IGluZmluaXRlIGxvb3Agd2hlbiBwcm9jZXNzaW5nIENvbnRlbnQtbGFuZ3VhZ2UgbGluZXMgaW4KLSAgICAgdHlwZS1tYXAgZmlsZXMuIFtBbGV4ZWkgS29zdXRdCi0KLSAgKikgQ2xvc2VkIGZpbGUtZ2xvYmJpbmcgaG9sZSBpbiB0ZXN0LWNnaSBzY3JpcHQuIFtCcmlhbiBCZWhsZW5kb3JmXQotCi0gICopIEZpeGVkIHByb2JsZW0gaW4gc2V0X1t1c2VyfGdyb3VwXSB0aGF0IHByZXZlbnRlZCBDR0kgZXhlY3V0aW9uCi0gICAgIGZvciBub24tdmlydHVhbGhvc3RzIHdoZW4gc3VFWEVDIHdhcyBlbmFibGVkLiBbUmFuZHkgVGVyYnVzaF0KLQotICAqKSBBZGRlZCBQT1JUSU5HIGluZm9ybWF0aW9uIGZpbGUuICBbSmltIEphZ2llbHNraV0KLQotICAqKSBBZGRlZCBkZWZpbml0aW9ucyBmb3IgU19JV0dSUCBhbmQgU19JV09USCB0byBjb25mLmggW0JlbiBMYXVyaWVdCi0KLSAgKikgQ2hhbmdlZCBkZWZhdWx0IGdyb3VwIHRvICJub2dyb3VwIiBpbnN0ZWFkIG9mICJub2JvZHkiIFtSYW5keSBUZXJidXNoXQotCi0gICopIEZpeGVkIGRlZmluZSB0eXBvIG9mIEZDTlRMX1NFUklBTElaRURfQUNDRVBUIHdoZXJlCi0gICAgIFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVCB3YXMgaW50ZW5kZWQuCi0KLSAgKikgRml4ZWQgYWRkaXRpb25hbCB1c2VzIG9mIDB4ZmZmZmZmZmYgd2hlcmUgSU5BRERSX05PTkUgd2FzIGludGVuZGVkLAotICAgICB3aGljaCBjYXVzZWQgcHJvYmxlbXMgb2Ygc3lzdGVtcyB3aGVyZSBzb2NrZXQgc19hZGRyIGlzID4zMmJpdHMuCi0KLSAgKikgQWRkZWQgY29tbWVudCB0byBleHBsYWluIChyLT5jaHVua2VkID0gMSkgc2lkZS1lZmZlY3QgaW4KLSAgICAgaHR0cF9wcm90b2NvbC5jIFtSb3kgRmllbGRpbmddCi0KLSAgKikgUmVwbGFjZWQgdXNlIG9mIGluZGV4KCkgaW4gbW9kX2V4cGlyZXMuYyB3aXRoIG1vcmUgYXBwcm9wcmlhdGUKLSAgICAgYW5kIHBvcnRhYmxlIGlzZGlnaXQoKSB0ZXN0LiAgW0JlbiBMYXVyaWVdCi0KLSAgKikgVXBkYXRlZCBDb25maWd1cmUgZm9yIC4uLgotICAgICAgICBPUy8yICAgICAgICAgIChERUZfV0FOVEhTUkVHRVg9eWVzLCBvdGhlciBjb2RlIGNoYW5nZXMpCi0gICAgICAgICotZGctZGd1eCogICAgKGJhZCBwYXR0ZXJuIG1hdGNoKQotICAgICAgICBRTlggICAgICAgICAgIChERUZfV0FOVEhTUkVHRVg9eWVzKQotICAgICAgICAqLXN1bm9zNCogICAgIChERUZfV0FOVEhTUkVHRVg9eWVzLCAtRFVTRUJDT1BZKQotICAgICAgICAqLXVsdHJpeCAgICAgIChuZXcpCi0gICAgICAgICotdW5peHdhcmUyMTEgKG5ldykKLSAgICAgYW5kIGFkZGVkIHNvbWUgdXNlciBkaWFnbm9zdGljIGluZm8uICBbQmVuIExhdXJpZV0KLQotICAqKSBJbiBoZWxwZXJzL0N1dFJ1bGUsIHJlcGxhY2VkICJjdXQiIGludm9jYXRpb24gd2l0aCAiYXdrIiBpbnZvY2F0aW9uCi0gICAgIGZvciBiZXR0ZXIgcG9ydGFiaWxpdHkuIFtKaW0gSmFnaWVsc2tpXQotCi0gICopIFVwZGF0ZWQgaGVscGVycy9HdWVzc09TIGZvciAuLi4KLSAgICAgICAgU0NPIDUgICAgICAgICAgICAocmVjb2duaXplIG1pbm9yIHJlbGVhc2VzKQotICAgICAgICBTQ08gVW5peFdhcmUgICAgIChicmFpbmRhbWFnZWQgdW5hbWUsIHdoYXRldmVyLXdoYXRldmVyLXVuaXh3YXJlMikKLSAgICAgICAgU0NPIFVuaXhXYXJlIDIuMS4xICAgICAgKHJlcXVpcmVzIGEgc2VwYXJhdGUgc2V0IG9mICNkZWZpbmVzIGluIGNvbmYuaCkKLSAgICAgICAgSVJJWDY0ICAgICAgICAgICAoLXNnaS1pcml4NjQpCi0gICAgICAgIFVMVFJJWCAgICAgICAgICAgKC11bmtub3duLXVsdHJpeCkKLSAgICAgICAgU0lOSVggICAgICAgICAgICAoLXdoYXRldmVyLXN5c3Y0KQotICAgICAgICBOQ1IgVW5peCAgICAgICAgICgtbmNyLXN5c3Y0KQotICAgICBhbmQgZml4ZWQgc29tZXRoaW5nIGluIGhlbHBlcnMvUHJpbnRQYXRoICBbQmVuIExhdXJpZV0KLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjJiMQotCi0gICopIE5vdCBsaXN0ZWQuIFNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvbmV3X2ZlYXR1cmVzXzFfMi5odG1sPgotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDEuMS4xCi0KLSAgKikgRml4ZWQgYnVnIHdoZXJlIENvb2tpZSBtb2R1bGUgd291bGQgbWFrZSB0d28gZW50cmllcyBpbiB0aGUKLSAgICAgbG9nZmlsZSBmb3IgZWFjaCBhY2Nlc3MgW01hcmsgQ294XQotCi0gICopIEZpeGVkIGJ1ZyB3aGVyZSBSZWRpcmVjdCBpbiAuaHRhY2Nlc3MgZmlsZXMgd291bGQgY2F1c2UgbWVtb3J5Ci0gICAgIGxlYWsuIFtOYXRoYW4gTmV1bGluZ2VyXQotCi0gICopIE11bHRpVmlld3Mgbm93IHdvcmtzIGNvcnJlY3RseSB3aXRoIEFkZEhhbmRsZXIgW0FsZXhlaSBLb3N1dF0KLQotICAqKSBQcm9ibGVtcyB3aXRoIG1vZF9hdXRoX21zcWwgZml4ZWQgW0RpcmsgdmFuR3VsaWtdCi0KLSAgKikgRml4IG1pc3NwZWxsaW5nIG9mICJBbm9ueW1vdXNfQXV0aG9yYXRpdmUiIGRpcmVjdGl2ZSBpbiBtb2RfYXV0aF9hbm9uLgotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDEuMS4wCi0KLSAgKikgQnJpbmcgTmVYVCBzdXBwb3J0IHVwIHRvIGRhdGUuIFtUYWthYWtpIE1hdHN1bW90b10KLQotICAqKSBCcmluZyBRTlggc3VwcG9ydCB1cCB0byBkYXRlLiBbQmVuIExhdXJpZV0KLQotICAqKSBNYWtlIHZpcnR1YWwgaG9zdHMgZGVmYXVsdCB0byBtYWluIHNlcnZlciBrZWVwYWxpdmUgcGFyYW1ldGVycy4KLSAgICAgW0FsZXhlaSBLb3N1dCwgQmVuIExhdXJpZV0KLQotICAqKSBBbGxvdyBTY2FuSFRNTFRpdGxlcyB0byB3b3JrIHdpdGggbG93ZXJjYXNlIDx0aXRsZT4gdGFncy4gW0FsZXhlaSBLb3N1dF0KLQotICAqKSBGaXggbWlzc2luZyBhZGRyZXNzIGZhbWlseSBmb3IgY29ubmVjdCwgYWxzbyByZW1vdmUgdW5yZWFjaGFibGUgc3RhdGVtZW50Ci0gICAgIGluIG1vZF9wcm94eS4gW0JlbiBMYXVyaWVdCi0KLSAgKikgbW9kX2VudiBub3cgdHVybmVkIG9uIGJ5IGRlZmF1bHQgaW4gQ29uZmlndXJhdGlvbi50bXBsLgotCi0gICopIEJ1Z3Mgd2hpY2ggd2VyZSBmaXhlZDoKLSAgICAgICAgYSkgeWV0IG1vcmUgbW9kX3Byb3h5IGJ1Z3MgW0JlbiBMYXVyaWVdCi0gICAgICAgIGIpIENHSSB3b3JrcyBhZ2FpbiB3aXRoIGluZXRkIFtBbGV4ZWkgS29zdXRdCi0gICAgICAgIGMpIExlYWRpbmcgY29sb25zIHdlcmUgc3RyaXBwZWQgZnJvbSBwYXNzd29yZHMgW29zbUBpbnRlcmd1aWRlLmNvbV0KLSAgICAgICAgZCkgQW5vdGhlciBmaXggdG8gbXVsdGktbWV0aG9kIExpbWl0IHByb2JsZW0gW2prQHRvb2xzLmRlXQotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDEuMWI0Ci0KLSAgKikgci0+Ynl0ZXNfc2VudCB2YXJpYWJsZSByZXN0b3JlZC4gW1JvYmVydCBUaGF1XQotCi0gICopIFByZXZpb3VzbHkgYnJva2VuIG11bHRpLW1ldGhvZCA8TGltaXQ+IHBhcnNpbmcgZml4ZWQuIFtSb2JlcnQgVGhhdV0KLQotICAqKSBNb3JlIHBvc3NpYmx5IHVuc2VjdXJlIHByb2dyYW1zIHJlbW92ZWQgZnJvbSB0aGUgc3VwcG9ydCBkaXJlY3RvcnkuCi0KLSAgKikgTW9yZSBtb2RfYXV0aF9tc3FsIGF1dGhlbnRpY2F0aW9uIGltcHJvdmVtZW50cy4KLQotICAqKSBWaXJ0dWFsSG9zdHMgYmFzZWQgb24gSG9zdDogaGVhZGVycyBubyBsb25nZXIgY29uZmxpY3Qgd2l0aCB0aGUKLSAgICAgTGlzdGVuIGRpcmVjdGl2ZS4KLQotICAqKSBPUy8yIGNvbXBhdGliaWxpdHkgZW5oYW5jZW1lbnRzLiBbR2FyeSBTbWlsZXldCi0KLSAgKikgUE9TVCBub3cgYWxsb3dlZCB0byBkaXJlY3RvcnkgaW5kZXggQ0dJIHNjcmlwdHMuCi0KLSAgKikgQWN0aW9ucyBub3cgd29yayB3aXRoIGZpbGVzIG9mIHRoZSBkZWZhdWx0IHR5cGUuCi0KLSAgKikgQnVncyB3aGljaCB3ZXJlIGZpeGVkOgotICAgICAgICBhKSBtb3JlIG1vZF9wcm94eSBidWdzCi0gICAgICAgIGIpIGVhcmx5IHRlcm1pbmF0aW9uIG9mIGluZXRkIHJlcXVlc3RzCi0gICAgICAgIGMpIGNvbXBpbGUgd2FybmluZ3Mgb24gc2V2ZXJhbCBzeXN0ZW1zCi0gICAgICAgIGQpIHByb2JsZW1zIHdoZW4gc2NyaXB0cyBzdG9wIHJlYWRpbmcgb3V0cHV0IGVhcmx5Ci0KLUNoYW5nZXMgd2l0aCBBcGFjaGUgMS4xYjMKLQotICAqKSBNdWNoIG9mIGNnaS1iaW4gYW5kIGFsbCBvZiBjZ2ktc3JjIGhhcyBiZWVuIHJlbW92ZWQsIGR1ZSB0bwotICAgICB2YXJpb3VzIHNlY3VyaXR5IGhvbGVzIGZvdW5kIGFuZCB0aGF0IHdlIGNvdWxkIG5vIGxvbmdlciBzdXBwb3J0Ci0gICAgIHRoZW0uCi0KLSAgKikgVGhlICJTZXQtQ29va2llIiBoZWFkZXIgaXMgbm93IHNwZWNpYWwtY2FzZWQgdG8gbm90IG1lcmdlIG11bHRpcGxlCi0gICAgIGluc3RhbmNlcywgc2luY2UgY2VydGFpbiBwb3B1bGFyIGJyb3dzZXJzIGNhbiBub3QgaGFuZGxlIG11bHRpcGxlCi0gICAgIFNldC1Db29raWUgaW5zdHJ1Y3Rpb25zIGluIGEgc2luZ2xlIGhlYWRlci4gW1BhdWwgU3V0dG9uXQotCi0gICopIHJwcmludGYoKSBhZGRlZCB0byBidWZmZXIgY29kZSwgb2NjdXJyZW5jZXMgb2Ygc3ByaW50ZiByZW1vdmVkLgotICAgICBbQmVuIExhdXJpZV0KLQotICAqKSBDT05ORUNUIG1ldGhvZCBmb3IgcHJveHkgbW9kdWxlLCB3aGljaCBtZWFucyB0dW5uZWxpbmcgU1NMIHNob3VsZCB3b3JrLgotICAgICAoTm8gY3J5cHRvIG5lZWRlZCkgIEFsc28gYSBOb0NhY2hlIGNvbmZpZyBkaXJlY3RpdmUuCi0KLSAgKikgU2V2ZXJhbCBBUEkgYWRkaXRpb25zOiBwc3RybmR1cCgpLCB0YWJsZV91bnNldCgpIGFuZCBnZXRfdG9rZW4oKQotICAgICBmdW5jdGlvbnMgbm93IGF2YWlsYWJsZSB0byBtb2R1bGVzLgotCi0gICopIG1vZF9pbWFwIGZpeHVwcywgaW4gcGFydGljdWxhciBMb2NhdGlvbjogaGVhZGVycyBhcmUgbm93IGNvbXBsZXRlCi0gICAgIFVSTCdzLgotCi0gICopIE5ldyAiaW5mbyIgbW9kdWxlIHdoaWNoIHJlcG9ydHMgb24gaW5zdGFsbGVkIG1vZHVsZSBzZXQgdGhyb3VnaCBhCi0gICAgIHNwZWNpYWwgVVJMLCBhIGxhIG1vZF9zdGF0dXMuCi0KLSAgKikgIlNlcnZlclBhdGgiIGRpcmVjdGl2ZSBhZGRlZCAtIGFsbG93cyBmb3IgZ3JhY2VmdWwgdHJhbnNpdGlvbgotICAgICBmb3IgSG9zdDotaGVhZGVyLWJhc2VkIHZpcnR1YWwgaG9zdHMuCi0KLSAgKikgQW5vbnltb3VzIGF1dGhlbnRpY2F0aW9uIG1vZHVsZSBpbXByb3ZlbWVudHMuCi0KLSAgKikgTVNRTCBhdXRoZW50aWNhdGlvbiBtb2R1bGUgaW1wcm92ZW1lbnRzLgotCi0gICopIFN0YXR1cyBtb2R1bGUgZGVzaWduIGltcHJvdmVkIC0gb3V0cHV0IG5vdyB0YWJsZS1iYXNlZC4gW0JlbiBMYXVyaWVdCi0KLSAgKikgaHRkaWdlc3QgdXRpbGl0eSBpbmNsdWRlZCBmb3IgdXNlIHdpdGggZGlnZXN0IGF1dGhlbnRpY2F0aW9uCi0gICAgIG1vZHVsZS4KLQotICAqKSBtb2RfbmVnb3RpYXRpb246IEFjY2VwdCB2YWx1ZXMgd2l0aCB3aWxkY2FyZHMgdG8gYmUgdHJlYXRlZCB3aXRoCi0gICAgIGxlc3MgcHJpb3JpdHkgdGhhbiB0aG9zZSB3aXRob3V0IHdpbGRjYXJkcyBhdCB0aGUgc2FtZSBxdWFsaXR5Ci0gICAgIHZhbHVlLiBbQWxleGVpIEtvc3V0XQotCi0gICopIEJ1Z3Mgd2hpY2ggd2VyZSBmaXhlZDoKLSAgICAgICAgYSkgbnVtZXJvdXMgbW9kX3Byb3h5IGJ1Z3MKLSAgICAgICAgYikgQ0dJIGVhcmx5LXRlcm1pbmF0aW9uIGJ1ZyBbQmVuIExhdXJpZV0KLSAgICAgICAgYykgS2VlcGFsaXZlcyBub3Qgd29ya2luZyB3aXRoIHZpcnR1YWwgaG9zdHMKLSAgICAgICAgZCkgUmVmZXJlcklnbm9yZSBwcm9ibGVtcwotICAgICAgICBlKSBjbG9zaW5nIGZkJ3MgdHdpY2UgaW4gbW9kX2luY2x1ZGUgKGNhdXNpbmcgY29yZSBkdW1wcyBvbgotICAgICAgICAgICBMaW51eCBhbmQgZWxzZXdoZXJlKS4KLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjFiMgotCi0gICopIEJ1Z2ZpeGVzOgotICAgICAgICBhKSBjb3JlIGR1bXBzIGluIG1vZF9kaWdlc3QKLSAgICAgICAgYikgdHJ1bmNhdGVkIGhvc3RuYW1lcy9pcCBhZGRyZXNzIGluIHRoZSBsb2dzCi0gICAgICAgIGMpIHJlbGF0aXZlIFVSTCdzIGluIG1vZF9pbWFwIG1hcCBmaWxlcwotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDEuMWIxCi0KLSAgKikgTm90IGxpc3RlZC4gU2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvZG9jcy9uZXdfZmVhdHVyZXNfMV8xLmh0bWw+Ci0KLUNoYW5nZXMgd2l0aCBBcGFjaGUgMS4wLjMKLQotICAqKSBJbnRlcm5hbCByZWRpcmVjdHMgd2hpY2ggb2NjdXIgaW4gbW9kX2Rpci5jIG5vdyBwcmVzZXJ2ZSB0aGUKLSAgICAgcXVlcnkgcG9ydGlvbiBvZiBhIHJlcXVlc3QgKHRoZSBiaXQgYWZ0ZXIgdGhlIHF1ZXN0aW9uIG1hcmspLgotICAgICBbQWRhbSBTdXNzbWFuXQotCi0gICopIEVzY2FwZSBhY3RpdmUgY2hhcmFjdGVycyAnPCcsICc+JyBhbmQgJyYnIGluIGh0bWwgb3V0cHV0IGluCi0gICAgIGRpcmVjdG9yeSBsaXN0aW5ncywgZXJyb3IgbWVzc2FnZXMgYW5kIHJlZGlyZWN0aW9uIGxpbmtzLgotICAgICBbRGF2aWQgUm9iaW5zb25dCi0KLSAgKikgQXBhY2hlIHdpbGwgbm93IHdvcmsgd2l0aCBMeW54T1MgMi4zIGFuZCBsYXRlciBbU3RldmVuIFdhdHRdCi0KLSAgKikgRml4IGZvciBQT1NJWCBjb21wbGlhbmNlIGluIHdhaXRpbmcgZm9yIHByb2Nlc3NlcyBpbiBhbGxvYy5jLgotICAgICBbTmljayBXaWxsaWFtc10KLQotICAqKSBzZXRzb2Nrb3B0IG5vIGxvbmdlciB0YWtlcyBhIGNvbnN0IGRlY2xhcmVkIGFyZ3VtZW50IFtNYXJ0aWpuIEtvc3Rlcl0KLQotICAqKSBSZXNldCB0aW1lb3V0IHRpbWVyIGFmdGVyIGVhY2ggc3VjY2Vzc2Z1bCBmd3JpdGUoKSB0byB0aGUgbmV0d29yay4KLSAgICAgVGhpcyBwYXRjaCBhZGRzIGEgcmVzZXRfdGltZW91dCgpIHByb2NlZHVyZSB0aGF0IGlzIGNhbGxlZCBieQotICAgICBzZW5kX2ZkKCkgdG8gcmVzZXQgdGhlIHRpbWVvdXQgZXZlciB0aW1lIGRhdGEgaXMgd3JpdHRlbiB0byB0aGUgbmV0LgotICAgICBbTmF0aGFuIFNjaHJlbmtdCi0KLSAgKikgdGltZW91dCgpIHNpZ25hbCBoYW5kbGVyIG5vdyBjaGVja3MgZm9yIFNJR1BJUEUgYW5kIHJlcG9ydHMKLSAgICAgbG9zdCBjb25uZWN0aW9ucyBpbiBhIG1vcmUgdXNlciBmcmllbmRseSB3YXkuIFtSb2IgSGFydGlsbF0KLQotICAqKSBMb2NhdGlvbiBvZiB0aGUgInNjb3JlYm9hcmQiIGZpbGUgd2hpY2ggdXNlZCB0byBsaXZlIGluIC90bXAgaXMKLSAgICAgbm93IGNvbmZpZ3VyYWJsZSAoZm9yIE9TZXMgdGhhdCBjYW4ndCB1c2UgbW1hcCkgdmlhIFNjb3JlQm9hcmRGaWxlCi0gICAgIHdoaWNoIHdvcmtzIHNpbWlsYXIgdG8gUGlkRmlsZSAoaW4gaHR0cGQuY29uZikgW1JvYiBIYXJ0aWxsXQotCi0gICopIEluY2x1ZGUgc3lzL3Jlc291cmNlLmggaW4gdGhlIGNvcnJlY3QgcGxhY2UgZm9yIFN1bk9TNCBbU2FtZWVyIFBhcmVraF0KLQotICAqKSB0aGUgcHN0cmNhdCBjYWxsIGluIG1vZF9jb29raWVzLmMgZGlkbid0IGhhdmUgYW4gZW5kaW5nIE5VTEwsCi0gICAgIHdoaWNoIGNhdXNlZCBhIFNFR1Ygd2l0aCBjb29raWVzIGVuYWJsZWQKLQotICAqKSBPdXRwdXQgd2FybmluZyB3aGVuIE1pblNwYXJlU2VydmVycyBpcyBzZXQgdG8gPD0gMCBhbmQgY2hhbmdlIGl0IHRvIDEKLSAgICAgW1JvYiBIYXJ0aWxsXQotCi0gICopIExvZyB0aGUgVU5JWCB0ZXh0dWFsIGVycm9yIHJldHVybmVkIGJ5IHNvbWUgc3lzdGVtIGNhbGxzLCBpbgotICAgICBwYXJ0aWN1bGFyIGVycm9ycyBmcm9tIGFjY2VwdCgpIFtEYXZpZCBSb2JpbnNvbl0KLQotICAqKSBBZGQgc3RyZXJyb3IgZnVuY3Rpb24gdG8gdXRpbC5jIGZvciBTdW5PUzQgW1JhbmR5IFRlcmJ1c2hdCi0KLUNoYW5nZXMgd2l0aCBBcGFjaGUgMS4wLjIKLQotICAqKSBwYXRjaCB0byBnZXQgQXBhY2hlIGNvbXBpbGVkIG9uIFVuaXhXYXJlIDIueCwgcmVjb21tZW5kZWQgYXMKLSAgICAgYSB0ZW1wb3JhcnkgbWVhc3VyZSwgcGVuZGluZyByZXdyaXRlIG9mIHJmYzkzMS5jLiBbQ2h1Y2sgTXVyY2tvXQotCi0gICopIEZpeCBnZXRfYmFzaWNfYXV0aF9wdygpIHRvIHNldCB0aGUgYXV0aF90eXBlIG9mIHRoZSByZXF1ZXN0LgotICAgICBbRGF2aWQgUm9iaW5zb25dCi0KLSAgKikgcGFzdCBjaGFuZ2VzIHRvIGh0dHBfY29uZmlnLmMgdG8gb25seSB1c2UgdGhlCi0gICAgIHNldHJsaW1pdCBmdW5jdGlvbiBvbiBzeXN0ZW1zIGRlZmluaW5nIFJMSU1JVF9OT0ZJTEUKLSAgICAgYnJva2UgdGhlIGZlYXR1cmUgb24gU1VOT1M0LiBOb3cgZGVmaW5lcyBIQVZFX1JFU09VUkNFCi0gICAgIGZvciBTVU5PUyBhbmQgcHJvdG90eXBlcyB0aGUgbmVlZGVkIGZ1bmN0aW9ucy4KLQotICAqKSBSZW1vdmUgdXNlcyBvZiBNQVhfU1RSSU5HX0xFTi9IVUdFX1NUUklOR19MRU4gZnJvbSBzZXZlcmFsIHJvdXRpbmVzLgotICAgICBbRGF2aWQgUm9iaW5zb25dCi0KLSAgKikgRml4IHVzZSBvZiBwb2ludGVyIHRvIHNjcmF0Y2ggbWVtb3J5LiBbQ2xpZmYgU2tvbG5pY2tdCi0KLSAgKikgTWVyZ2UgbXVsdGlwbGUgaGVhZGVycyBmcm9tIENHSSBzY3JpcHRzIGluc3RlYWQgb2YgdGFraW5nIGxhc3QKLSAgICAgb25lLiBbRGF2aWQgUm9iaW5zb25dCi0KLSAgKikgQWRkIHN1cHBvcnQgZm9yIFNDTyA1LiBbQmVuIExhdXJpZV0KLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjAuMQotCi0gICopIFNpbGVuY2UgbW9kX2xvZ19yZWZlcmVyIGFuZCBtb2RfbG9nX2FnZW50IGlmIG5vdCBjb25maWd1cmVkCi0gICAgIFtSYW5keSBUZXJidXNoXQotCi0gICopIFJlY3Vyc2l2ZSBpbmNsdWRlcyBjYW4gb2NjdXIgaWYgdGhlIGNsaWVudCBzdXBwbGllcyBQQVRIX0lORk8gZGF0YQotICAgICBhbmQgdGhlIHNlcnZlciBwcm92aWRlciB1c2VzIHJlbGF0aXZlIGxpbmtzOyBhcyBmaWxlLmh0bWwKLSAgICAgcmVsYXRpdmUgdG8gL2RvYy5zaHRtbC9wYXRoaW5mbyBpcyAvZG9jLnNodG1sL2ZpbGUuaHRtbC4gW0RhdmlkIFJvYmluc29uXQotCi0gICopIFRoZSByZXBsYWNlbWVudCBmb3IgaW5pdGdyb3VwcygpIGRpZCBub3QgY2FsbCB7c2V0LGVuZH1ncmVudCgpLiBUaGlzCi0gICAgIGhhZCB0d28gaW1wbGljYXRpb25zOiBpZiBhbnl0aGluZyBlbHNlIHVzZWQgZ2V0Z3JlbnQoKSwgdGhlbgotICAgICBpbml0Z3JvdXBzKCkgd291bGQgZmFpbCwgYW5kIGl0IHdhcyBjb25zdW1pbmcgYSBmaWxlIGRlc2NyaXB0b3IuCi0gICAgIFtCZW4gTGF1cmllXQotCi0gICopIE9uIGhlYXZpbHkgbG9hZGVkIHNlcnZlcnMgaXQgd2FzIHBvc3NpYmxlIGZvciB0aGUgc2NvcmVib2FyZCB0byBnZXQKLSAgICAgb3V0IG9mIHN5bmMgd2l0aCByZWFsaXR5LCBhcyBhIHJlc3VsdCBvZiBhIHJhY2UgY29uZGl0aW9uLgotICAgICBUaGUgb2JzZXJ2ZWQgc3ltcHRvbXMgYXJlIGZhciBtb3JlIEFwYWNoZXMgcnVubmluZyB0aGFuIHNob3VsZAotICAgICBiZSwgYW5kIGhlYXZ5IHN5c3RlbSBsb2FkcywgZ2VuZXJhbGx5IGZvbGxvd2VkIGJ5IGNhdGFzdHJvcGhpYwotICAgICBzeXN0ZW0gZmFpbHVyZS4gW0JlbiBMYXVyaWVdCi0KLSAgKikgRml4IHR5cG8gaW4gbGljZW5zZS4gW0RhdmlkIFJvYmluc29uXQotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDEuMC4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzIE5vdiAxOTk1Ci0KLSAgKikgTm90IGxpc3RlZC4gU2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvZG9jcy9uZXdfZmVhdHVyZXNfMV8wLmh0bWw+Ci0KLUNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDUgTm92IDE5OTUKLQotICAqKSBOZXcgbWFuIHBhZ2UgZm9yICdodHRwZCcgYWRkZWQgdG8gc3VwcG9ydCBkaXJlY3RvcnkgW0RhdmlkIFJvYmluc29uXQotCi0gICopIC5odGdyb3VwIGZpbGVzIGNhbiBoYXZlIG1vcmUgdGhhbiBvbmUgbGluZSBnaXZpbmcgbWVtYmVycyBmb3IgYQotICAgICBnaXZlbiBncm91cCAoZWFjaCBtdXN0IGhhdmUgdGhlIGdyb3VwIG5hbWUgaW4gZnJvbnQpLCBmb3IgTkNTQQotICAgICBiYWNrLWNvbXBhdGliaWxpdHkgW1JvYmVydCBUaGF1XQotCi0gICopIE11dHVhbCBleGNsdXNpb24gYXJvdW5kIGFjY2VwdCgpIGlzIG9uIGJ5IGRlZmF1bHQgZm9yIFNWUjQgc3lzdGVtcwotICAgICBnZW5lcmFsbHksIHNpbmNlIHRoZXkgZ2VuZXJhbGx5IGNhbid0IGhhbmRsZSBtdWx0aXBsZSBwcm9jZXNzZXMgaW4KLSAgICAgYWNjZXB0KCkgb24gdGhlIHNhbWUgc29ja2V0LiAgVGhpcyBzaG91bGQgY3VyZSBmbGFreSBiZWhhdmlvciBvbgotICAgICBhIGxvdCBvZiB0aG9zZSBzeXN0ZW1zLiAgW0RhdmlkIFJvYmluc29uXQotCi0gICopIEFkZFR5cGUsIEFkZEVuY29kaW5nLCBhbmQgQWRkTGFuZ3VhZ2UgZGlyZWN0aXZlcyB0YWtlIG11bHRpcGxlCi0gICAgIGV4dGVuc2lvbnMgb24gYSBzaW5nbGUgY29tbWFuZCBsaW5lIFtEYXZpZCBSb2JpbnNvbl0KLQotICAqKSBVc2VyRGlyIGNhbiBiZSBkaXNhYmxlZCBmb3IgYSBnaXZlbiB2aXJ0dWFsIGhvc3QgYnkgc2F5aW5nCi0gICAgICJVc2VyRGlyIGRpc2FibGVkIiBpbiB0aGUgPFZpcnR1YWxIb3N0PiBzZWN0aW9uIC0tLSBpdCB3YXMgYSBidWcKLSAgICAgdGhhdCB0aGlzIGRpZG4ndCB3b3JrLiAgW0RhdmlkIFJvYmluc29uXQotCi0gICopIENvbXBpbGVzIG9uIFFOWCBbQmVuIExhdXJpZV0KLQotICAqKSBDb3JyZWN0ZWQgcGFyc2luZyBvZiBjdGltZSB0aW1lIGZvcm1hdCBbRGF2aWQgUm9iaW5zb25dCi0KLSAgKikgaHR0cGQgZG9lcyBhIHBlcnJvcigpIGJlZm9yZSBleGl0aW5nIGlmIGl0IGNhbid0IGxvZyBpdHMgcGlkCi0gICAgIHRvIHRoZSBQaWRGaWxlLCB0byBtYWtlIGRpYWdub3NpbmcgdGhlIGVycm9yIGEgYml0IGVhc2llci4KLSAgICAgW0RhdmlkIFJvYmluc29uXQotCi0gICopIDwhLS0jaW5jbHVkZSBmaWxlPSIuLi4iLS0+IGNhbiBubyBsb25nZXIgaW5jbHVkZSBmaWxlcyBpbiB0aGUKLSAgICAgcGFyZW50IGRpcmVjdG9yeSwgZm9yIE5DU0EgYmFjay1jb21wYXRpYmlsaXR5LiAgW0RhdmlkIFJvYmluc29uXQotCi0gICopICd+JyBpcyAqbm90KiBlc2NhcGVkIGluIFVSSXMgZ2VuZXJhdGVkIGZvciBkaXJlY3RvcnkgbGlzdGluZ3MKLSAgICAgW1JveSBGaWVsZGluZ10KLQotICAqKSBFbGltaW5hdGVkIGNvbXBpbGVyIHdhcm5pbmcgaW4gdGhlIGltYWdlbWFwIG1vZHVsZSBbUmFuZHkgVGVyYnVzaF0KLQotICAqKSBGaXhlZCBidWcgaW52b2x2aW5nIGhhbmRsaW5nIFVSSXMgd2l0aCBlc2NhcGVkICUtY2hhcmFjdGVycwotICAgICBpbiByZWRpcmVjdHMgW0RhdmlkIFJvYmluc29uXQotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDAuOC4xNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0IE9jdCAxOTk1Ci0KLSAgKikgU3dpdGNoZWQgdG8gbmV3LCBzaW1wbGVyIGxpY2Vuc2UKLQotICAqKSBFbGltaW5hdGVkIGNvcmUgZHVtcHMgd2l0aCBpbXByb3Blcmx5IGZvcm1hdHRlZCBEQk0gZ3JvdXAgZmlsZXMgW01hcmsgQ294XQotCi0gICopIERvbid0IGFsbG93IHJlcXVlc3RzIGZvciBvcmRpbmFyeSBmaWxlcyB0byBoYXZlIFBBVEhfSU5GTyBbQmVuIExhdXJpZV0KLQotICAqKSBSZWplY3QgcGF0aHMgY29udGFpbmluZyAlLWVzY2FwZWQgJyUnIG9yIG51bGwgY2hhcmFjdGVycyBbRGF2aWQgUm9iaW5zb25dCi0KLSAgKikgQ29ycmVjdGx5IGhhbmRsZXMgaW50ZXJuYWwgcmVkaXJlY3RzIHRvIGZpbGVzIHdpdGggbmFtZXMgY29udGFpbmluZyAnJScKLSAgICAgW0RhdmlkIFJvYmluc29uXQotCi0gICopIFJlcHVuY3R1YXRlZCBzb21lIGVycm9yIG1lc3NhZ2VzIFtBcmFtIE1pcnphZGVoLCBBbmRyZXcgV2lsc29uXQotCi0gICopIFVzZSBnZXRldWlkKCkgcmF0aGVyIHRoYW4gZ2V0dWlkKCkgdG8gc2VlIGlmIHdlIGhhdmUgcm9vdCBwcml2aWxlZ2UsCi0gICAgIHNvIHRoYXQgc2VydmVyIGNvcnJlY3RseSByZXNldHMgcHJpdmlsZWdlIGlmIHJ1biBzZXR1aWQgcm9vdC4gIFtBbmRyZXcKLSAgICAgV2lsc29uXQotCi0gICopIEhhbmRsZSBmdHA6IGFuZCB0ZWxuZXQ6IFVSTHMgY29ycmVjdGx5IGluIGltYWdlbWFwcyAoYnVpbHQtaW4gbW9kdWxlKQotICAgICBbUmFuZHkgVGVyYnVzaF0KLQotICAqKSBGaXggcmVsYXRpdmUgVVJMcyBpbiBpbWFnZW1hcCBmaWxlcyBbUmFuZHkgVGVyYnVzaF0KLQotICAqKSBTb21ld2hhdCBiZXR0ZXIgZml4IGZvciB0aGUgb2xkICJBbGlhcyAvZm9vLyAvYmFyLyIgYnVzaW5lc3MKLSAgICAgW0RhdmlkIFJvYmluc29uXQotCi0gICopIERvbid0IHJlcGVhdGVkbHkgb3BlbiB0aGUgRXJyb3JMb2cgaWYgYSBidW5jaCBvZiA8VmlydHVhbEhvc3Q+Ci0gICAgIGVudHJpZXMgYWxsIG5hbWUgdGhlIHNhbWUgb25lLiBbRGF2aWQgUm9iaW5zb25dCi0KLSAgKikgRml4IGRpcmVjdG9yeSBsaXN0aW5ncyB3aXRoIGZpbGVuYW1lcyBjb250YWluaW5nIHVudXN1YWwgY2hhcmFjdGVycwotICAgICBbRGF2aWQgUm9iaW5zb25dCi0KLSAgKikgQmV0dGVyIFVSSS1lc2NhcGluZyBmb3IgZ2VuZXJhdGVkIFVSSXMgaW4gZGlyZWN0b3JpZXMgd2l0aCBmaWxlbmFtZXMKLSAgICAgY29udGFpbmluZyB1bnVzdWFsIGNoYXJhY3RlcnMgW0JlbiBMYXVyaWVdCi0KLSAgKikgRml4ZWQgcG90ZW50aWFsIEZJTEUqIGxlYWsgaW4gaHR0cF9tYWluLmMgW0JlbiBMYXVyaWVdCi0KLSAgKikgVW5ibG9jayBhbGFybXMgb24gZXJyb3IgcmV0dXJuIGZyb20gc3Bhd25fY2hpbGQoKSBbRGF2aWQgUm9iaW5zb25dCi0KLSAgKikgU2FtcGxlIENvbmZpZyBmaWxlcyBoYXZlIGV4dHJhIG5vdGUgZm9yIFNDTyB1c2VycyBbQmVuIExhdXJpZV0KLQotICAqKSBDb25maWd1cmF0aW9uIGhhcyBub3RlIGZvciBIUC1VWCB1c2VycyBbUm9iIEhhcnRpbGxdCi0KLSAgKikgRWxpbWluYXRlZCBzb21lIGJvZ3VzIExpbnV4LW9ubHkgI2RlZmluZXMgaW4gY29uZi5oIFtBcmFtIE1pcnphZGVoXQotCi0gICopIE51a2VkIGJvZ3VzICNkZWZpbmUgaW4gaHR0cGQuaCBbRGF2aWQgUm9iaW5zb25dCi0KLSAgKikgQmV0dGVyIHRlc3QgZm9yIHdoZXRoZXIgYSBzeXN0ZW0gaGFzIHNldHJsaW1pdCgpIFtEYXZpZCBSb2JpbnNvbl0KLQotICAqKSBDYWxscyB1cGRhdGVfY2hpbGRfc3RhdHVzKCkgYWZ0ZXIgcmVvcGVuX3Njb3JlYm9hcmQoKSBbRGF2aWQgUm9iaW5zb25dCi0KLSAgKikgRG9lc24ndCBzZW5kIGl0c2VsZiBTSUdIVVAgb24gc3RhcnR1cCB3aGVuIHJ1biBpbiB0aGUgLVggZGVidWctb25seSBtb2RlCi0gICAgIFtCZW4gTGF1cmllXQotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDAuOC4xNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5IFNlcCAxOTk1Ci0KLSAgKikgQ29tcGlsZXMgb24gU0NPIE9EVCAzLjAgW0JlbiBMYXVyaWVdCi0KLSAgKikgQWRkRGVzY3JpcHRpb24gd29ya3MgKGJldHRlcikgW0JlbiBMYXVyaWVdCi0KLSAgKikgTGVhdmVzIGFuIGludGVsbGlnaWJsZSBlcnJvciBkaWFnbm9zdGljIHdoZW4gaXQgY2FuJ3Qgc2V0IGdyb3VwCi0gICAgIHByaXZpbGVnZXMgb24gc3RhbmRhbG9uZSBzdGFydHVwIFtBbmRyZXcgV2lsc29uXQotCi0gICopIENvbXBpbGVzIG9uIE5lWFQgYWdhaW4gLS0tIHRoZSAwLjguMTMgUkxJTUlUIHBhdGNoIHdhcyBmYWlsaW5nIG9uCi0gICAgIHRoYXQgbWFjaGluZSwgd2hpY2ggY2xhaW1zIHRvIGJlIEJTRCBidXQgZG9lcyBub3Qgc3VwcG9ydCBSTElNSVQuCi0gICAgIFtSYW5keSBUZXJidXNoXQotCi0gICopIGdjYyAtV2FsbCBubyBsb25nZXIgY29tcGxhaW5zIGFib3V0IGFuIHVudXNlZCB2YXJpYWJsZSB3aGVuIHV0aWwuYwotICAgICBpcyBjb21waWxlZCB3aXRoIC1ETUlOSU1BTF9ETlMgW0FuZHJldyBXaWxzb25dCi0KLSAgKikgTnVrZWQgYW5vdGhlciBjb21waWxlciB3YXJuaW5nIGZvciAtV2FsbCBvbiBMaW51eCBbQXJhbSBNaXJ6YWRlaF0KLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwNyBTZXAgMTk5NQotCi0gICopIE1ha2UgSW5kZXhJZ25vcmUgKndvcmsqIChvb29wcykgW0phcmtrbyBUb3JwcGFdCi0KLSAgKikgSGF2ZSBidWlsdC1pbiBpbWFnZW1hcCBjb2RlIHJlY29nbml6ZSAmIGhvbm9yIFBvaW50IGRpcmVjdGl2ZSBbSmFtZXMKLSAgICAgQ2xvb3NdCi0KLSAgKikgR2VuZXJhdGUgY2xlYW5lciBkaXJlY3RvcnkgbGlzdGluZ3MgaW4gZGlyZWN0b3JpZXMgd2l0aCBhIG1peCBvZgotICAgICBsb25nIGFuZCBzaG9ydCBmaWxlbmFtZXMgW1JvYiBIYXJ0aWxsXQotCi0gICopIFByb3Blcmx5IGluaXRpYWxpemUgZHluYW1pY2FsbHkgbG9hZGVkIG1vZHVsZXMgW1JveXN0b24gU2h1ZmZsZWJvdGhhbV0KLQotICAqKSBQcm9wZXJseSBkZWZhdWx0IFNlcnZlck5hbWUgZm9yIHZpcnR1YWwgc2VydmVycyBbUm9iZXJ0IFRoYXVdCi0KLSAgKikgUmF0aW9uYWxpemUgaGFuZGxpbmcgb2YgQlNEIGluIGNvbmYuaCBhbmQgZWxzZXdoZXJlIFtSYW5keSBUZXJidXNoLAotICAgICBQYXVsIFJpY2hhcmRzIGFuZCBhIGNhc3Qgb2YgdGhvdXNhbmRzLi4uXQotCi0gICopIE9uIHNlbGYtaWRlbnRpZmllZCBCU0Qgc3lzdGVtcyAod2UgZG9uJ3QgdHJ5IHRvIGd1ZXNzIGFueSBtb3JlKSwKLSAgICAgYWxsb2NhdGUgYSBmZXcgZXh0cmEgZmlsZSBkZXNjcmlwdG9ycyBwZXIgdmlydHVhbCBob3N0IHdpdGggc2V0cmxpbWl0LAotICAgICBpZiB3ZSBjYW4sIHRvIGF2b2lkIHJ1bm5pbmcgb3V0LiBbUmFuZHkgVGVyYnVzaF0KLQotICAqKSBXcml0ZSAyMi1jaGFyYWN0ZXIgbG9jayBmaWxlIG5hbWUgaW50byBidWZmZXIgd2l0aCBlbm91Z2ggc3BhY2UKLSAgICAgb24gc3RhcnR1cCBbS29uc3RhbnRpbiBPbGNoYW5za2ldCi0KLSAgKikgVXNlIGFyY2hhaWMgc2V0cGdycCgpIGludGVyZmFjZSBvbiBOZVhULCB3aGljaCByZXF1aXJlcyBpdCBbQnJpYW4KLSAgICAgUGlua2VydG9uXQotCi0gICopIFN1cHByZXNzIC1XYWxsIHdhcm5pbmcgYnkgY2FzdGluZyBjb25zdCBhd2F5IGluIHV0aWwuYyBbQXJhbSBNaXJ6YWRlaF0KLQotICAqKSBTdXBwcmVzcyAtV2FsbCB3YXJuaW5nIGJ5IGluaXRpYWxpemluZyB2YXJpYWJsZSBpbiBuZWdvdGlhdGlvbiBjb2RlCi0gICAgIFtUb2JpYXMgV2VpbmdhcnRuZXJdCi0KLUNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEgQXVnIDE5OTUKLQotICAqKSBEb2Vzbid0IHBhdXNlIHRocmVlIHNlY29uZHMgYWZ0ZXIgaW5jbHVkaW5nIGEgQ0dJIHNjcmlwdCB3aGljaCBpcwotICAgICB0b28gc2xvdyB0byBkaWUgb2ZmICh0aGlzIGlzIGRvbmUgYnkgbm90IGV2ZW4gdHJ5aW5nIHRvIGtpbGwgb2ZmCi0gICAgIHN1YnByb2Nlc3NlcywgaW5jbHVkaW5nIHRoZSBTSUdURVJNL3BhdXNlL1NJR0tJTEwgcm91dGluZSwgdW50aWwKLSAgICAgYWZ0ZXIgdGhlIGVudGlyZSBkb2N1bWVudCBoYXMgYmVlbiBwcm9jZXNzZWQpLiAgW1JvYmVydCBUaGF1XQotCi0gICopIERvZXNuJ3QgZG8gU1NJIGlmIE9wdGlvbnMgSW5jbHVkZXMgaXMgb2ZmLiAgKE9vb3BzKS4gIFtEYXZpZCBSb2JpbnNvbl0KLQotICAqKSBPcHRpb25zIEluY2x1ZGVzTm9FeGVjIGFsbG93cyBpbmNsdXNpb24gb2YgYXQgbGVhc3QgdGV4dC8qIFtSb3kgRmllbGRpbmddCi0KLSAgKikgQWxsb3dzIC5odGFjY2VzcyBmaWxlcyB0byBvdmVycmlkZSA8RGlyZWN0b3J5PiBzZWN0aW9ucyBuYW1pbmcgdGhlCi0gICAgIHNhbWUgZGlyZWN0b3J5IFtEYXZpZCBSb2JpbnNvbl0KLQotICAqKSBSZW1vdmVkIGFuIGVmZmljaWVuY3kgaGFjayBpbiBzdWJfcmVxX2xvb2t1cF91cmkgd2hpY2ggd2FzCi0gICAgIGNhdXNpbmcgY2VydGFpbiBleHRyZW1lbHkgbWFyZ2luYWwgY2FzZXMgKGUuZy4sIFNjcmlwdEFsaWFzIG9mIGEKLSAgICAgKnBhcnRpY3VsYXIqIGluZGV4Lmh0bWwgZmlsZSkgdG8gZmFpbC4gIFtEYXZpZCBSb2JpbnNvbl0KLQotICAqKSBEb2Vzbid0IGxvZyBhbiBlcnJvciB3aGVuIHRoZSByZXF1ZXN0ZWQgVVJJIHJlcXVpcmVzCi0gICAgIGF1dGhlbnRpY2F0aW9uLCBidXQgbm8gYXV0aCBoZWFkZXIgbGluZSB3YXMgc3VwcGxpZWQgYnkgdGhlCi0gICAgIGNsaWVudDsgdGhpcyBpcyBhIG5vcm1hbCBjb25kaXRpb24gKHRoZSBjbGllbnQgZG9lc24ndCBubyBhdXRoIGlzCi0gICAgIG5lZWRlZCBoZXJlIHlldCkuICBbUm9iZXJ0IFRoYXVdCi0KLSAgKikgQmVoYXZlcyBtb3JlIHNhbmVseSB3aGVuIHRoZSBuYW1lIHNlcnZlciBsb3NlcyBpdHMgbWluZCBbU2VhbiBXZWxjaF0KLQotICAqKSBSRkM5MzEgY29kZSBjb21waWxlcyBjbGVhbmx5IG9uIG9sZCBCU0RJIHJlbGVhc2VzIFtSYW5keSBUZXJidXNoXQotCi0gICopIFJGQzkzMSBjb2RlIG5vIGxvbmdlciBwYXNzZXMgb3V0IG5hbWUgb2YgcHJpb3IgY2xpZW50cyBvbiBjdXJyZW50Ci0gICAgIHJlcXVlc3RzIGlmIHRoZSBjdXJyZW50IHJlcXVlc3QgY2FtZSBmcm9tIGEgc2VydmVyIHRoYXQgZG9lc24ndAotICAgICBkbyBSRkM5MzEuICBbRGF2aWQgUm9iaW5zb25dCi0KLSAgKikgQ29uZmlndXJhdGlvbiBzY3JpcHQgYWNjZXB0cyAiTW9kdWxlIiBsaW5lcyB3aXRoIHRyYWlsaW5nIHdoaXRlc3BhY2UuCi0gICAgIFtSb2JlcnQgVGhhdV0KLQotICAqKSBDbGVhbmVkIHVwIGNvbXBpbGVyIHdhcm5pbmcgZnJvbSBtb2RfYWNjZXNzLmMgW1JvYmVydCBUaGF1XQotCi0gICopIENsZWFuZWQgdXAgY29tbWVudHMgaW4gbW9kX2NnaS5jIFtSb2JlcnQgVGhhdV0KLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCBBdWcgMTk5NQotCi0gICopIFdpbGRjYXJkIDxEaXJlY3Rvcnk+IHNwZWNpZmljYXRpb25zIHdvcmsuICBbUm9iZXJ0IFRoYXVdCi0KLSAgKikgRG9lc24ndCBsb29wIGZvciBidWdneSBDR0kgb24gU29sYXJpcyBbQ2xpZmYgU2tvbG5pY2tdCi0KLSAgKikgU3ltbGluayBjaGVja3MgKEZvbGxvd1N5bUxpbmtzIG9mZiwgb3IgU3ltTGlua0lmT3duZXJNYXRjaCkgYWx3YXlzIGNoZWNrCi0gICAgIHRoZSBmaWxlIGJlaW5nIHJlcXVlc3RlZCBpdHNlbGYsIGluIGFkZGl0aW9uIHRvIHRoZSBkaXJlY3RvcmllcyBsZWFkaW5nCi0gICAgIHVwIHRvIGl0LiBbUm9iZXJ0IFRoYXVdCi0KLSAgKikgTG9ncyBhY2Nlc3MgZmFpbHVyZXMgZHVlIHRvIHN5bWxpbmsgY2hlY2tzIG9yIGludmFsaWQgY2xpZW50IGFkZHJlc3MKLSAgICAgaW4gdGhlIGVycm9yIGxvZyBbUm95IEZpZWxkaW5nLCBSb2JlcnQgVGhhdV0KLQotICAqKSBTeW1saW5rIGNoZWNrcyBkZWFsIGNvcnJlY3RseSB3aXRoIHN5c3RlbXMgd2hlcmUgbHN0YXQgb2YKLSAgICAgIi9wYXRoL3RvL3NvbWUvbGluay8iIGZvbGxvd3MgdGhlIGxpbmsuICBbVGhhdSwgRmllbGRpbmddCi0KLSAgKikgRG9lc24ndCByZXNldCBEaXJlY3RvcnlJbmRleCB0byAnaW5kZXguaHRtbCcgd2hlbgotICAgICBvdGhlciBkaXJlY3Rvcnkgb3B0aW9ucyBhcmUgc2V0IGluIGEgLmh0YWNjZXNzIGZpbGUuICBbUm9iZXJ0IFRoYXVdCi0KLSAgKikgQ2xhcmlmaWVkIGluaXQgY29kZSBhbmQgbnVrZWQgYm9ndXMgd2FybmluZyBpbiBtb2RfYWNjZXNzLmMKLSAgICAgW0Zsb3JlbnQgR3VpbGxhdW1lXQotCi0gICopIENvcnJlY3RlZCBzZXZlcmFsIGRpcmVjdGl2ZXMgaW4gc2FtcGxlIHNybS5jb25mCi0gICAgIC0tLSBpbmNsdWRlcyBjb3JyZWN0aW9ucyB0byBkaXJlY3RvcnkgaW5kZXhpbmcgaWNvbi1yZWxhdGVkIGRpcmVjdGl2ZXMKLSAgICAgKHVzaW5nIHVua25vd24uZ2lmIHJhdGhlciB0aGFuIHVua25vd24ueGJtIGFzIHRoZSBEZWZhdWx0SWNvbiwgZG9pbmcKLSAgICAgaWNvbnMgZm9yIGVuY29kaW5ncyByaWdodCwgYW5kIHR1cm5pbmcgb24gQWRkRW5jb2RpbmcgYnkgZGVmYXVsdCkuCi0gICAgIFtSb3kgRmllbGRpbmddCi0KLSAgKikgQ29ycmVjdGVkIGRlc2NyaXB0aW9ucyBvZiBhcmdzIHRvIEFkZEljb24gYW5kIEFkZEFsdCBpbiBjb21tYW5kIHRhYmxlCi0gICAgIFtKYW1lcyBDbG9vc10KLQotICAqKSBJTlNUQUxMICYgUkVBRE1FIG1lbnRpb24gImNvbnRyaWJ1dGVkIG1vZHVsZXMiIGRpcmVjdG9yeSBbQnJpYW4KLSAgICAgQmVobGVuZG9yZl0KLQotICAqKSBGaXhlZCBFbmdsaXNoIGluIHRoZSBsaWNlbnNlIGxhbmd1YWdlLi4uICAiZm9yIGZvciIgLS0+ICJmb3IiLgotICAgICBbUm95IEZpZWxkaW5nXQotCi0gICopIEZpeGVkIFNjcmlwdEFsaWFzL0FsaWFzIGludGVyYWN0aW9uIGJ5IG1vdmluZyBTY3JpcHRBbGlhcyBoYW5kbGluZyB0bwotICAgICBtb2RfYWxpYXMuYywgbWVyZ2luZyBpdCBhbG1vc3QgY29tcGxldGVseSB3aXRoIGhhbmRsaW5nIG9mIEFsaWFzLCBhbmQKLSAgICAgYWRkaW5nIGEgJ25vdGVzJyBmaWVsZCB0byB0aGUgcmVxdWVzdF9yZWMgd2hpY2ggYWxsb3dzIHRoZSBDR0kgbW9kdWxlCi0gICAgIHRvIGRpc2NvdmVyIHdoZXRoZXIgdGhlIEFsaWFzIG1vZHVsZSBoYXMgcHV0IHRoaXMgcmVxdWVzdCB0aHJvdWdoCi0gICAgIFNjcmlwdEFsaWFzICh3aGljaCBpdCBuZWVkcyB0byBrbm93IGZvciBiYWNrLWNvbXBhdGliaWxpdHksIGFzIHRoZSBvbGQKLSAgICAgTkNTQSBjb2RlIGRpZCBub3QgY2hlY2sgT3B0aW9ucyBFeGVjQ0dJIGluIFNjcmlwdEFsaWFzIGRpcmVjdG9yaWVzKS4KLSAgICAgW1JvYmVydCBUaGF1XQotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDAuOC4xMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4IEF1ZyAxOTk1Ci0KLSAgKikgQWxsb3dPdmVycmlkZSBhcHBsaWVzIHRvIHRoZSBuYW1lZCBkaXJlY3RvcnksIGFuZCBub3QganVzdAotICAgICBzdWJkaXJlY3Rvcmllcy4gIFtEYXZpZCBSb2JpbnNvbl0KLQotICAqKSBEbyBsb2NraW5nIGZvciBhY2NlcHQoKSBleGNsdXNpb24gKG9uIHN5c3RlbXMgdGhhdCBuZWVkIGl0KQotICAgICB1c2luZyBhIHNwZWNpYWwgZmlsZSBjcmVhdGVkIGZvciB0aGUgcHVycG9zZSBpbiAvdXNyL3RtcCwgYW5kCi0gICAgIG5vdCB0aGUgZXJyb3IgbG9nOyB1c2luZyB0aGUgZXJyb3IgbG9nIGNhdXNlcyByZWFsIHByb2JsZW1zCi0gICAgIGlmIGl0J3MgTkZTLW1vdW50ZWQ7IHRoaXMgaXMga25vd24gdG8gYmUgdGhlIGNhdXNlIG9mIGEgd2hvbGUKLSAgICAgbG90IG9mICJzZXJ2ZXIgaGFuZyIgcHJvYmxlbXMgd2l0aCBTb2xhcmlzLiAgW0RhdmlkIFJvYmluc29uOwotICAgICB0aGFua3MgdG8gTWVydGVuIFNjaHVtYW5uIGZvciBoZWxwIGRpYWdub3NpbmcgdGhlIHByb2JsZW1dLgotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDAuOC45ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyIEF1ZyAxOTk1Ci0KLSAgKikgQ29tcGlsZXMgd2l0aCAtRE1BWElNVU1fRE5TIC0tLS0gb29vcHMhIFtIZW5yaWsgTW9ydGVuc2VuXQotCi0gICopIE5lc3RlZCBpbmNsdWRlcyBzZWUgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9mIHRoZSBpbmNsdWRpbmcgZG9jdW1lbnQsCi0gICAgIGZvciBOQ1NBIGJ1Zy1jb21wYXRpYmlsaXR5IChzb21lIHNpdGVzIGhhdmUgc3RhbmRhcmQgZm9vdGVyIGluY2x1ZGVzCi0gICAgIHdoaWNoIHRyeSB0byBwcmludCBvdXQgdGhlIGxhc3QtbW9kaWZpZWQgZGF0ZSkuICBbRXJpYyBIYWdiZXJnL1JvYmVydAotICAgICBUaGF1XQotCi0gICopIDwhLS1leGVjIGNnaT0iL3NvbWUvdXJpL2hlcmUiLS0+IGFsd2F5cyB0cmVhdHMgdGhlIGl0ZW0gbmFtZWQgYnkgdGhlCi0gICAgIFVSSSBhcyBhIENHSSBzY3JpcHQsIGV2ZW4gaWYgaXQgd291bGQgaGF2ZSBiZWVuIHRyZWF0ZWQgYXMgc29tZXRoaW5nCi0gICAgIGVsc2UgaWYgcmVxdWVzdGVkIGRpcmVjdGx5LCBmb3IgTkNTQSBiYWNrLWNvbXBhdGliaWxpdHkuICAoTm90ZSB0aGF0Ci0gICAgIHRoaXMgbWVhbnMgdGhhdCBwZW9wbGUgd2hvIGtub3cgdGhlIG5hbWUgb2YgdGhlIHNjcmlwdCBjYW4gc2VlIHRoZQotICAgICBjb2RlIGp1c3QgYnkgYXNraW5nIGZvciBpdCkuICBbUm9iZXJ0IFRoYXVdCi0KLSAgKikgTmV3IHZlcnNpb24gb2YgZGJtbWFuYWdlIHNjcmlwdCBpbmNsdWRlZCBpbiBzdXBwb3J0IGRpcmVjdG9yeSBhcwotICAgICBkYm1tYW5hZ2UubmV3LgotCi0gICopIENoZWNrIGlmIHNjb3JlYm9hcmQgZmlsZSBjb3VsZG4ndCBiZSBvcGVuZWQsIGFuZCBzYXkgc28sIHJhdGhlcgotICAgICB0aGVuIGdvaW5nIGluc2FuZSBbRGF2aWQgUm9iaW5zb25dCi0KLSAgKikgUE9TVCB0byBDR0kgd29ya3Mgb24gQS9VWCBbSmltIEphZ2llbHNraV0KLQotICAqKSBBZGRJY29uIGFuZCBBZGRBbHQgY29tbWFuZHMgd29yayBwcm9wZXJseSBbUm9iIEhhcnRpbGxdCi0KLSAgKikgTkNTQSBzZXJ2ZXIgcHVzaCB3b3JrcyBwcm9wZXJseSAtLS0gdGhlIEFyZW5hIGJ1ZyBjb21wYXRpYmlsaXR5Ci0gICAgIHdvcmthcm91bmQsIHdoaWNoIGJyb2tlIGl0LCBpcyBnb25lICh1c2UgLURBUkVOQV9CVUdfV09SS0FST1VORAotICAgICBpZiB5b3Ugc3RpbGwgd2FudCB0aGUgd29ya2Fyb3VuZCkuICBbUm9iIEhhcnRpbGxdCi0KLSAgKikgSWYgY2xpZW50IGRpZG4ndCBzdWJtaXQgYW55IEFjY2VwdC1lbmNvZGluZ3MsIGlnbm9yZSBlbmNvZGluZ3MgaW4KLSAgICAgY29udGVudCBuZWdvdGlhdGlvbi4gIChOQiB0aGlzIHdpbGwgYWxsIGhhdmUgdG8gYmUgcmV3b3JrZWQgYW55d2F5Ci0gICAgIGZvciB0aGUgbmV3IEhUVFAgZHJhZnQpLiAgW0Zsb3JlbnQgR3VpbGxhdW1lXQotCi0gICopIERvbid0IGR1bXAgY29yZSB3aGVuIHRyeWluZyB0byBsb2cgdGltZWQtb3V0IHJlcXVlc3RzIFtKaW0gSmFnaWVsc2tpXQotCi0gICopIFJlYWxseSBob25vciBDYWNoZU5lZ290aWF0ZWREb2NzIFtGbG9yZW50IEd1aWxsYXVtZV0KLQotICAqKSBHaXZlIFJlZGlyZWN0IHByaW9yaXR5IG92ZXIgQWxpYXMsIGZvciBOQ1NBIGJ1ZyBjb21wYXRpYmlsaXR5Ci0gICAgIFtEYXZpZCBSb2JpbnNvbl0KLQotICAqKSBDb3JyZWN0bHkgc2V0IFBBVEhfVFJBTlNMQVRFRCBpbiBhbGwgY2FzZXMgZnJvbSA8IS0tI2V4ZWMgY21kPSIiLS0+LAotICAgICBwYXJhbGxlbGluZyBlYXJsaWVyIGJ1ZyBmaXggZm9yIENHSSBbRGF2aWQgUm9iaW5zb25dCi0KLSAgKikgSWYgREJNIGF1dGggaXMgaW1wcm9wZXJseSBjb25maWd1cmVkLCByZXBvcnQgYSBzZXJ2ZXIgZXJyb3IgYW5kIGRvbid0Ci0gICAgIGR1bXAgY29yZS4KLQotICAqKSBEZWxldGVkIEZDTlRMX1NFUklBTElaRURfQUNDRVBUUyBmcm9tIGNvbmYuaCBlbnRyeSBmb3IgQS9VWDsKLSAgICAgaXQgc2VlbXMgdG8gd29yayB3ZWxsIGVub3VnaCB3aXRob3V0IGl0IChldmVuIGluIGEgMTAgaGl0cy9zZWMKLSAgICAgd29ya291dCksIGFuZCB0aGUgb3ZlcmhlYWQgZm9yIHRoZSBsb2NraW5nIHVuZGVyIEEvVVggaXMKLSAgICAgYWxhcm1pbmdseSBoaWdoICh0aG91Z2ggaXQgaXMgdmVyeSBsb3cgb24gb3RoZXIgc3lzdGVtcykuCi0gICAgIFtFcmljIEhhZ2JlcmcsIEppbSBKYWdpZWxza2ldCi0KLSAgKikgRml4ZWQgcG9ydGFiaWxpdHkgcHJvYmxlbXMgd2l0aCBtb2RfY29va2llcy5jIFtDbGlmZiBTa29sbmlja10KLQotICAqKSBGdXJ0aGVyIGRlLUJlcmtsaXplIG1vZF9jb29raWVzLmM7IGNoYW5nZSB0aGUgYm9ndXMgI2luY2x1ZGUuICBbQnJpYW4KLSAgICAgQmVobGVuZG9yZi9FcmljIEhhZ2JlcmddCi0KLSAgKikgTW9yZSBpbXByb3ZlbWVudHMgdG8gZGVmYXVsdCBDb25maWd1cmF0aW9uIGZvciBBL1VYIFtKaW0gSmFnaWVsc2tpXQotCi0gICopIENvbXBpbGVzIGNsZWFuIG9uIE5FWFQgW1JvYiBIYXJ0aWxsXQotCi0gICopIENvbXBpbGVzIGNsZWFuIG9uIFNHSSBbUm9iZXJ0IFRoYXVdCi0KLUNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDggQXVnIDE5OTUKLQotICAqKSBTdW5PUyBsaWJyYXJ5IHByb3RvdHlwZXMgbm93IG5ldmVyIGluY2x1ZGVkIHVubGVzcyBleHBsaWNpdGx5Ci0gICAgIHJlcXVlc3RlZCBpbiB0aGUgY29uZmlndXJhdGlvbiAodmlhIC1EU1VOT1NfTElCX1BST1RPVFlQRVMpOwotICAgICBwZW9wbGUgdXNpbmcgR05VIGxpYmMgb24gU3VuT1MgYXJlIHNjcmV3ZWQgYnkgcHJvdG90eXBlcyBmb3IgdGhlCi0gICAgIHN0YW5kYXJkIGxpYnJhcnkuCi0KLSAgICAgKFRob3NlIHdobyB3aXNoIHRvIGNvbXBpbGUgY2xlYW4gd2l0aCBnY2MgLVdhbGwgb24gYSBzdGFuZGFyZAotICAgICBTdW5PUyBzZXR1cCBuZWVkIHRoZSBwcm90b3R5cGVzLCBhbmQgbWF5IG9idGFpbiB0aGVtIHVzaW5nCi0gICAgIC1EU1VOT1NfTElCX1BST1RPVFlQRVMuICBUaG9zZSB3aXNoaW5nIHRvIHVzZSAtV2FsbCBvbiBhIHN5c3RlbQotICAgICB3aXRoIG5vbnN0YW5kYXJkIGxpYnJhcmllcyBhcmUgcHJlc3VtYWJseSBjb21wZXRlbnQgdG8gbWFrZSB0aGVpcgotICAgICBvd24gYXJyYW5nZW1lbnRzKS4KLQotICAqKSBTdHJpcHMgdHJhaWxpbmcgJy8nIGNoYXJhY3RlcnMgb2ZmIGJvdGggYXJncyB0byB0aGUgQWxpYXMgY29tbWFuZCwKLSAgICAgdG8gbWFrZSAnQWxpYXMgL2Zvby8gL2Jhci8nIHdvcmsuCi0KLUNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDMgQXVnIDE5OTUKLQotICAqKSBEb24ndCBoYW5nIHdoZW4gcmVzdGFydGluZyB3aXRoIGEgY2hpbGQgZnJvbSAnVHJhbnNmZXJMb2cgInwuLi4iJyBydW5uaW5nCi0gICAgIFtyZXBvcnRlZCBieSBEYXZpZCBSb2JpbnNvbl0KLQotICAqKSBDb21waWxlcyBjbGVhbiBvbiBPU0YvMSBbRGF2aWQgUm9iaW5zb25dCi0KLSAgKikgQWRkZWQgc29tZSBvZiB0aGUgbW9yZSByZWNlbnQgc2lnbmlmaWNhbnQgY2hhbmdlcyAoQWRkTGFuZ3VhZ2Ugc3R1ZmYsCi0gICAgIGV4cGVyaW1lbnRhbCBMb2dGb3JtYXQgc3VwcG9ydCkgdG8gQ0hBTkdFUyBmaWxlIGluIGRpc3RyaWJ1dGlvbiByb290Ci0gICAgIGRpcmVjdG9yeQotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDAuOC42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAyIEF1ZyAxOTk1Ci0KLSAgKikgRGVsZXRlZCBOZXRzY2FwZSByZWxvYWQgd29ya2Fyb3VuZCAtLS0gaXQncyBpbiB2aW9sYXRpb24gb2YgSFRUUCBzcGVjcy4KLSAgICAgKElmIHlvdSBhY3R1YWxseSB3YW50ZWQgYSBjb25kaXRpb25hbCBHRVQgd2hpY2ggYnlwYXNzZWQgdGhlIGNhY2hlLCB5b3UKLSAgICAgY291bGRuJ3QgZ2V0IGl0KS4gW1JlcG9ydGVkIGJ5IFJveSBGaWVsZGluZ10KLQotICAqKSBQcm9wZXJseSB0ZXJtaW5hdGUgaGVhZGVycyBvbiAnMzA0IE5vdCBNb2RpZmllZCcgcmVwbGllcyB0byBjb25kaXRpb25hbAotICAgICBHRVRzIC0tLSBubyBicm93c2VyIHdlIGNhbiBmaW5kIGNhcmVzIG11Y2gsIGJ1dCB0aGUgQ0VSTiBwcm94eSBjaG9rZXMuCi0gICAgIFtSZXBvcnRlZCBieSBDbGlmZiBTa29sbmljazsgZml4IGRpc2NvdmVyZWQgaW5kZXBlbmRlbnRseSBieSBSb2IgSGFydGlsbF0KLQotICAqKSBodHRwZCAtdiBkb2Vzbid0IGNhbGwgaXRzZWxmICJTaGFtYmhhbGEiLiAgW1JlcG9ydGVkIGJ5IENodWNrIE11cmNrb10KLQotICAqKSBTdW5PUyBsaWItZnVuY3Rpb24gcHJvdG90eXBlcyBpbiBjb25mLmggY29uZGl0aW9uYWxpemVkIG9uIF9fR05VQ19fLAotICAgICBub3QgX19TVU5QUk9fQyAodGhleSdyZSBuZWVkZWQgdG8gcXVpZXQgZ2NjIC1XYWxsLCBidXQgYWNjIGNob2tlcyBvbiAnZW0sCi0gICAgIGFuZCBvbGRlciB2ZXJzaW9ucyBkb24ndCBzZXQgdGhlIF9fU1VOUFJPX0MgcHJlcHJvY2Vzc29yIHZhcmlhYmxlKS4gIE9uCi0gICAgIGFsbCBvdGhlciBzeXN0ZW1zLCB0aGVzZSBhcmUgbmV2ZXIgdXNlZCBhbnl3YXkuICBbUmVwb3J0ZWQgYnkgTWFyayBDb3hdLgotCi0gICopIFNjb3JlYm9hcmQgZmlsZSAoL3RtcC9odHN0YXR1cy4qKSBubyBsb25nZXIgcHVibGljYWxseSB3cml0YWJsZS4KLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMSBBdWcgMTk5NQotCi0gICopIEFkZGVkIGxhc3QtbWludXRlIGNvbmZpZ3VyYWJsZSBsb2cgZXhwZXJpbWVudCwgYXMgb3B0aW9uYWwgbW9kdWxlCi0KLSAgKikgQ29ycmVjdGx5IHNldCByLT5ieXRlc19zZW50IGZvciBIVFRQLzAuOSByZXF1ZXN0cywgc28gdGhleSBnZXQgbG9nZ2VkCi0gICAgIHByb3Blcmx5LiAgKE9uZS1saW5lIGZpeCB0byBodHRwX3Byb3RvY29sLmMpLgotCi0gICopIFdvcmsgYXJvdW5kIGJvZ3VzIGJlaGF2aW9yIHdoZW4gcmVsb2FkaW5nIGZyb20gTmV0c2NhcGUuCi0gICAgIEl0J3MgTmV0c2NhcGUncyBidWcgLS0tIGZvciBzb21lIHJlYXNvbiB0aGV5IGV4cGVjdCBhIHJlcXVlc3Qgd2l0aAotICAgICBJZi1tb2RpZmllZC1zaW5jZTogdG8gbm90IGZ1bmN0aW9uIGFzIGEgY29uZGl0aW9uYWwgR0VUIGlmIGl0IGFsc28KLSAgICAgY29tZXMgd2l0aCBQcmFnbWE6IG5vLWNhY2hlLCB3aGljaCBpcyB3YXkgb3V0IG9mIGxpbmUgd2l0aCB0aGUgSFRUUAotICAgICBzcGVjIChhY2NvcmRpbmcgdG8gUm95IEZpZWxkaW5nLCB0aGUgcmVkYWN0b3IpLgotCi0gICopIEFkZGVkIHBhcmFtZXRlciB0byBzZXQgbWF4aW11bSBudW1iZXIgb2Ygc2VydmVyIHByb2Nlc3Nlcy4KLQotICAqKSBBZGRlZCBwYXRjaGVzIHRvIG1ha2UgaXQgd29yayBvbiBBL1VYLiAgQS9VWCBpcyAqd2VpcmQqLiAgW0VyaWMgSGFnYmVyZywKLSAgICAgSmltIEphZ2llbHNraV0KLQotICAqKSBJZGVudGl0eUNoZWNrIGJ1Z2ZpeCBbQ2h1Y2sgTXVyY2tvXS4KLQotICAqKSBDb3JyZWN0ZWQgY2dpLXNyYy9NYWtlZmlsZSBlbnRyeSBmb3IgbmV3IGltYWdlbWFwIHNjcmlwdC4gIFtBbGV4ZWkgS29zdXRdCi0KLSAgKikgTW9yZSBzYW1wbGUgY29uZmlnIGZpbGUgY29ycmVjdGlvbnM7IGFkZCBleHRlbnNpb24gdG8gQWRkVHlwZSBmb3IKLSAgICAgKi5hc2lzLCBtb3ZlIEFkZFR5cGUgZ2VuZXJpYyBkZXNjcmlwdGlvbiB0byBpdHMgcHJvcGVyIHBsYWNlLCBhbmQKLSAgICAgZml4IG1pc2NlbGxhbmVvdXMgdHlwb3MuIFsgQWxleGVpIEtvc3V0IF0KLQotICAqKSBEZWxldGVkIHRoZSAqb3RoZXIqIHJlZmVyZW5jZSB0byB0aGUgcmVnZW50cyBmcm9tIHRoZSBCZXJrZWxleQotICAgICBsZWdhbCBkaXNjbGFpbWVyIChldmVyeXBsYWNlKS4KLQotICAqKSBOdWtlZCBTaGFtYmhhbGEgbmFtZSBmcm9tIHNyYy9SRUFETUU7IGhhZCBhbHJlYWR5IGNsZWFuZWQgaXQgb3V0Ci0gICAgIG9mIGV2ZXJ5d2hlcmUgZWxzZS4KLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguNAotCi0gICopIENoYW5nZXMgdG8gc2VydmVyLXBvb2wgbWFuYWdlbWVudCBwYXJtcyAtLS0gcmVuYW1lZCBjdXJyZW50Ci0gICAgIFN0YXJ0U2VydmVycyB0byBNaW5TcGFyZVNlcnZlcnMsIGNyZWF0ZWQgc2VwYXJhdGUgU3RhcnRTZXJ2ZXJzCi0gICAgIHBhcmFtZXRlciB3aGljaCBtZWFucyB3aGF0IGl0IHNheXMsIGFuZCByZW5hbWVkIE1heFNlcnZlcnMgdG8KLSAgICAgTWF4U3BhcmVTZXJ2ZXJzICh0aG91Z2ggdGhlIG9sZCBuYW1lIHN0aWxsIHdvcmtzLCBmb3IgTkNTQSAxLjQKLSAgICAgYmFjay1jb21wYXRpYmlsaXR5KS4gIFRoZSBvbGQgbmFtZXMgd2VyZSBnZW5lcmFsbHkgcmVnYXJkZWQgYXMKLSAgICAgdG9vIGNvbmZ1c2luZy4gIEFsc28gYWx0ZXJlZCAiZG9jcyIgaW4gc2FtcGxlIGNvbmZpZyBmaWxlcy4KLQotICAqKSBNb3JlIGltcHJvdmVtZW50cyB0byBkZWZhdWx0IGNvbmZpZyBmaWxlcyAtLS0KLSAgICAgc2FtcGxlIGRpcmVjdGl2ZXMgKGNvbW1lbnRlZCBvdXQpIGZvciBYQml0SGFjaywgQmluZEFkZHJlc3MsCi0gICAgIENhY2hlTmVnb3RpYXRlZERvY3MsIFZpcnR1YWxIb3N0OyBkZWNlbnQgc2V0IG9mIEFkZExhbmd1YWdlCi0gICAgIGRlZmF1bHRzLCBBZGRUeXBlcyBmb3Igc2VuZC1hcy1pcyBhbmQgaW1hZ2VtYXAgbWFnaWMgdHlwZXMsIGFuZAotICAgICBpbXByb3ZlbWVudHMgdG8gc2FtcGxlcyBmb3IgRGlyZWN0b3J5SW5kZXggW0FsZXhlaSBLb3N1dF0KLQotICAqKSBZZXQgbW9yZSBpbXByb3ZlbWVudHMgdG8gZGVmYXVsdCBjb25maWcgZmlsZXMgLS0tIGNoYW5nZXMgdG8KLSAgICAgQWxleGVpJ3Mgc2FtcGxlIEFkZExhbmd1YWdlIGRpcmVjdGl2ZXMsIGFuZCBzYW1wbGUgTGFuZ3VhZ2VQcmlvcml0eQotICAgICBbIEZsb3JlbnQgR3VpbGxhdW1lIF0KLQotICAqKSBTZXQgY29uZmlnIGZpbGUgbG9jYXRpb25zIHByb3Blcmx5IGlmIG5vdCBzZXQgaW4gaHR0cGQuY29uZgotICAgICBbIERhdmlkIFJvYmluc29uIF0KLQotICAqKSBEb24ndCBlc2NhcGUgVVJJcyBpbiBpbnRlcm5hbCByZWRpcmVjdHMgbXVsdGlwbGUgdGltZXM7IGRvbid0Ci0gICAgIGRvIHRoYXQgd2hlbiB0cmFuc2xhdGluZyBQQVRIX0lORk8gdG8gUEFUSF9UUkFOU0xBVEVEIGVpdGhlci4KLSAgICAgWyBEYXZpZCBSb2JpbnNvbiBdCi0KLSAgKikgQ29ycmVjdGVkIHNwZWxsaW5nIG9mICJSZXF1aXJlZCIgaW4gNDAxIGVycm9yIHJlcG9ydHMgW0FuZHJldyBXaWxzb25dCi0KLUNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjMKLQotICAqKSBFZGl0ZWQgZGlzdHJpYnV0aW9uIFJFQURNRSB0byAqYnJpZWZseSogc3VtbWFyaXplIGluc3RhbGxhdGlvbgotICAgICBwcm9jZWR1cmVzLCBhbmQgZ2l2ZSBhIHBvaW50ZXIgdG8gdGhlIElOU1RBTEwgZmlsZSBpbiB0aGUgc3JjLwotICAgICBkaXJlY3RvcnkuCi0KLSAgKikgVXBncmFkZWQgaW1hZ2VtYXAgc2NyaXB0IGluIGNnaS1iaW4gdG8gMS44IHZlcnNpb24gZnJvbSBtb3JlCi0gICAgIHJlY2VudCBOQ1NBIGRpc3RyaWJ1dGlvbnMuCi0KLSAgKikgQnVnIGZpeCB0byBwcmV2aW91cyBidWcgZml4IC0tLSBpZiAuaHRhY2Nlc3MgZmlsZSBhbmQgPERpcmVjdG9yeT4KLSAgICAgZXhpc3QgZm9yIHRoZSBzYW1lIGRpcmVjdG9yeSwgdXNlIGJvdGggYW5kIGRvbid0IHNlZ2ZhdWx0LiAgW1JlcG9ydGVkCi0gICAgIGJ5IERhdmlkIFJvYmluc29uXQotCi0gICopIFByb3BlciBtYWtlZmlsZSBkZXBlbmRlbmNpZXMgW0RhdmlkIFJvYmluc29uXQotCi0gICopIE5vdGUgKHJlKXN0YXJ0cyBpbiBlcnJvciBsb2cgLS0tIHJlcG9ydGVkIGJ5IFJvYiBIYXJ0aWxsLgotCi0gICopIE9ubHkgY2FsbCBubzJzbGFzaCgpIGFmdGVyIGdldF9wYXRoX2luZm8oKSBoYXMgYmVlbiBkb25lLCB0bwotICAgICBwcmVzZXJ2ZSBtdWx0aXBsZSBzbGFzaGVzIGluIHRoZSBQQVRIX0lORk8gW05DU0EgY29tcGF0aWJpbGl0eSwKLSAgICAgcmVwb3J0ZWQgYnkgQW5kcmV3IFdpbHNvbiwgdGhvdWdoIHRoaXMgb25lIGlzIHByb2JhYmx5IGEgcmVhbCBidWddCi0KLSAgKikgRml4ZWQgbW9kX2ltYXAuYyAtLS0gcmVsYXRpdmUgcGF0aHMgd2l0aCBiYXNlX3VyaSByZWZlcmVyIGRvbid0Ci0gICAgIGR1bXAgY29yZSB3aGVuIFJlZmVyZXIgaXMgbm90IHN1cHBsaWVkLiBbUmFuZHkgVGVyYnVzaF0KLQotICAqKSBMaWdodGx5IGVkaXRlZCBzYW1wbGUgY29uZmlnIGZpbGVzIHRvIHJlZmVyIHBlb3BsZSB0byBvdXIgZG9jdW1lbnRhdGlvbgotICAgICBpbnN0ZWFkIG9mIE5DU0EncywgYW5kIHRvIGxpc3QgUm9iIE1jQ29vbCBhcyAqb3JpZ2luYWwqIGF1dGhvciAoYWxzbwotICAgICBkZWxldGVkIGhpcyBvbGQsIGFuZCBubyBkb3VidCBub24tZnVuY3Rpb25hbCBlbWFpbCBhZGRyZXNzKS4gIFdvdWxkIGJlCi0gICAgIG5pY2UgdG8gaGF2ZSBleGFtcGxlcyBvZiBuZXcgZmVhdHVyZXMuLi4KLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOSBKdWwgMTk5NQotCi0gICopIEFkZGVkIEFkZExhbnVhZ2UgY29kZSBbRmxvcmVudCBHdWlsbGF1bWVdCi0KLSAgKikgRG9uJ3Qgc2F5ICJhY2Nlc3MgZm9yYmlkZGVuIiB3aGVuIGEgQ0dJIHNjcmlwdCBpcyBub3QgZm91bmQuICBbTWFyayBDb3hdCi0KLSAgKikgQWxsIHNvcnRzIG9mIHByb2JsZW1zIHdoZW4gTXVsdGlWaWV3cyBmaW5kcyBhIGRpcmVjdG9yeS4gIEl0IHdvdWxkCi0gICAgIGJlIG5pY2UgaWYgbW9kX2Rpci5jIHdhcyByb2J1c3QgZW5vdWdoIHRvIGhhbmRsZSB0aGF0LCBidXQgZm9yIG5vdywKLSAgICAganVzdCBwdW50LiAgW3JlcG9ydGVkIGJ5IEJyaWFuIEJlaGxlbmRvcmZdCi0KLSAgKikgV2FpdCBmb3IgYWxsIGNoaWxkcmVuIG9uIHJlc3RhcnQsIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBvbGQgc29ja2V0Ci0gICAgIGlzIGdvbmUgYW5kIHdlIGNhbiByZW9wZW4gaXQuICBbcmVwb3J0ZWQgYnkgUmFuZHkgVGVyYnVzaF0KLQotICAqKSBJbWFnZW1hcCBtb2R1bGUgaXMgZW5hYmxlZCBpbiBkZWZhdWx0IENvbmZpZ3VyYXRpb24KLQotICAqKSBSZWZlcmVyTG9nIGFuZCBVc2VyQWdlbnRMb2cgbW9kdWxlcyBwcm9wZXJseSBkZWZhdWx0IHRoZSBsb2dmaWxlCi0gICAgIFtSYW5keSBUZXJidXNoXQotCi0gICopIE1hcmsgQ294J3MgbW9kX2Nvb2tpZXMgYWRkZWQgdG8gdGhlIGRpc3RyaWJ1dGlvbiBhcyBhbiBvcHRpb25hbAotICAgICBtb2R1bGUgKGNvbW1lbnRlZCBvdXQgaW4gdGhlIGRlZmF1bHQgQ29uZmlndXJhdGlvbiwgYW5kIG5vdGVkIGFzCi0gICAgIGFuIGV4cGVyaW1lbnQsIGFsb25nIHdpdGggbW9kX2RsZCkuIFtNYXJrIENveF0KLQotICAqKSBDb21waWxlcyBvbiBVTFRSSVggKGEgY29udGludWluZyBiYXR0bGUuLi4pLiBbUm9iZXJ0IFRoYXVdCi0KLSAgKikgRml4ZWQgbmFzdHkgYnVnIGluIFNJR1RFUk0gaGFuZGxpbmcgW3JlcG9ydGVkIGJ5IFJhbmR5IFRlcmJ1c2hdCi0KLSAgKikgQ2hhbmdlZCAiU2hhbWJoYWxhIiB0byAiQXBhY2hlIiBpbiBBUEkgZG9jcy4gW1JvYmVydCBUaGF1XQotCi0gICopIEFkZGVkIG5ldywgdG9vdGhpZXIgbGVnYWwgZGlzY2xhaW1lci4gW1JvYmVydCBUaGF1OyBjb3BpZWQgZnJvbSBCU0QKLSAgICAgbGljZW5zZV0KLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguMQotCi0gICopIE5ldyBpbWFnZW1hcCBtb2R1bGUgW1JhbmR5IFRlcmJ1c2hdCi0KLSAgKikgUmVwbGFjZW1lbnQgcmVmZXJlciBsb2cgbW9kdWxlIHdpdGggTkNTQS1jb21wYXRpYmxlIFJlZmVyZXJJZ25vcmUKLSAgICAgW01hdHRoZXcgR3JheSBhZ2Fpbl0KLQotICAqKSBEb24ndCBtdW5nIGRpcmVjdG9yeSBsaXN0aW5ncyB3aXRoIHZlcnkgbG9uZyBmaWxlbmFtZXMuCi0gICAgIFtGbG9yZW50IEd1aWxsYXVtZV0KLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguMCAobmVlIFNoYW1iaGFsYSAwLjYuMikgICAgICAgICAgICAgICAgICAxNiBKdWwgMTk5NQotCi0gICopIE5ldyBjb25maWcgc2NyaXB0LiAgU2VlIElOU1RBTEwgZm9yIGluZm8uICBbUm9iZXJ0IFRoYXVdCi0KLSAgKikgU2NvcmVib2FyZCBtZWNoYW5pc20gZm9yIHJlZ3VsYXRpbmcgdGhlIG51bWJlciBvZiBleHRhbnQgc2VydmVyCi0gICAgIHByb2Nlc3Nlcy4gIE1heFNlcnZlcnMgYW5kIFN0YXJ0U2VydmVycyBkZWZhdWx0cyBhcmUgdGhlIHNhbWUgYXMKLSAgICAgZm9yIE5DU0EsIGJ1dCB0aGUgbWVhbmluZ3MgYXJlIHNsaWdodGx5IGRpZmZlcmVudC4gIChBY3R1YWxseSwKLSAgICAgSSBzaG91bGQgcHJvYmFibHkgbG93ZXIgdGhlIE1heFNlcnZlcnMgZGVmYXVsdCB0byAxMCkuCi0KLSAgICAgQmVmb3JlIGFza2luZyBmb3IgYSBuZXcgY29ubmVjdGlvbiwgZWFjaCBzZXJ2ZXIgcHJvY2VzcyBjaGVja3MKLSAgICAgdGhlIG51bWJlciBvZiBvdGhlciBzZXJ2ZXJzIHdoaWNoIGFyZSBhbHNvIHdhaXRpbmcgZm9yIGEKLSAgICAgY29ubmVjdGlvbi4gIElmIHRoZXJlIGFyZSBtb3JlIHRoYW4gTWF4U2VydmVycywgaXQgcXVpZXRseSBkaWVzCi0gICAgIG9mZi4gIENvbnZlcnNlbHksIGV2ZXJ5IHNlY29uZCwgdGhlIHJvb3QsIG9yIGNhcmV0YWtlciwgcHJvY2VzcwotICAgICBsb29rcyB0byBzZWUgaG93IG1hbnkgc2VydmVycyBhcmUgd2FpdGluZyBmb3IgYSBuZXcgY29ubmVjdGlvbjsKLSAgICAgaWYgdGhlcmUgYXJlIGZld2VyIHRoYW4gU3RhcnRTZXJ2ZXJzLCBpdCBzdGFydHMgYSBuZXcgb25lLiAgVGhpcwotICAgICBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIG51bWJlciBvZiBzZXJ2ZXIgcHJvY2Vzc2VzIGFscmVhZHkgZXh0YW50LgotICAgICBUaGUgYWNjb3VudGluZyBpcyBhcnJhbmdlZCB0aHJvdWdoIGEgInNjb3JlYm9hcmQiIGZpbGUsIG5hbWVkCi0gICAgIC90bXAvaHRzdGF0dXMuKiwgb24gd2hpY2ggZWFjaCBwcm9jZXNzIGhhcyBhbiBpbmRlcGVuZGVudCBmaWxlCi0gICAgIGRlc2NyaXB0b3IgKHRoZXkgbmVlZCB0byBzZWVrIHdpdGhvdXQgaW50ZXJmZXJlbmNlKS4KLQotICAgICBUaGUgZW5kIGVmZmVjdCBpcyB0aGF0IE1heFNlcnZlcnMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mCi0gICAgIHNlcnZlcnMgb24gYW4gKmluYWN0aXZlKiBzZXJ2ZXIgbWFjaGluZSwgYnV0IG1vcmUgd2lsbCBiZSBmb3JrZWQKLSAgICAgb2ZmIHRvIGhhbmRsZSB1bnVzdWFsbHkgaGVhdnkgbG9hZHMgKG9yIHVudXN1YWxseSBzbG93IGNsaWVudHMpOwotICAgICB0aGVzZSB3aWxsIGRpZSBvZmYgd2hlbiB0aGV5IGFyZSBubyBsb25nZXIgbmVlZGVkIC0tLSB3aXRob3V0Ci0gICAgIHJldmVydGluZyB0byB0aGUgb3ZlcmhlYWQgb2YgZnVsbCBmb3JraW5nIG9wZXJhdGlvbi4gIFRoZXJlIGlzIGEKLSAgICAgaGFyZCBtYXhpbXVtIG9mIDE1MCBzZXJ2ZXIgcHJvY2Vzc2VzIGNvbXBpbGVkIGluLCBsYXJnZWx5IHRvCi0gICAgIGF2b2lkIGZvcmtpbmcgb3V0IG9mIGNvbnRyb2wgYW5kIGRyYWdnaW5nIHRoZSBtYWNoaW5lIGRvd24uCi0gICAgIChUaGlzIGlzIGFyZ3VhYmx5IHRvbyBoaWdoKS4KLQotICAgICBJbiBteSBzZXJ2ZXIgZW5kdXJhbmNlIHRlc3RzLCB0aGlzIG1lY2hhbmlzbSBkaWQgbm90IGFwcGVhciB0bwotICAgICBpbXBvc2UgYW55IHNpZ25pZmljYW50IG92ZXJoZWFkLCBldmVuIGFmdGVyIEkgZm9yY2VkIGl0IHRvIHB1dCB0aGUKLSAgICAgc2NvcmVib2FyZCBmaWxlIG9uIGEgbm9ybWFsIGZpbGVzeXN0ZW0gKHdoaWNoIG1pZ2h0IGhhdmUgbW9yZQotICAgICBvdmVyaGVhZCB0aGFuIHRtcGZzKS4gIFtSb2JlcnQgVGhhdV0KLQotICAqKSBTZXQgSFRUUF9GT08gdmFyaWFibGVzIGZvciBTU0kgPCEtLSNleGVjIGNtZC0tPnMsIG5vdCBqdXN0IENHSSBzY3JpcHRzLgotICAgICBbQ2xpZmYgU2tvbG5pY2tdCi0KLSAgKikgUmVhZCAuaHRhY2Nlc3MgZmlsZXMgZXZlbiBpbiBkaXJlY3Rvcnkgd2l0aCA8RGlyZWN0b3J5PiBzZWN0aW9uLgotICAgICAoRm9ybWVyIGluY29tcGF0aWJpbGl0eSBub3RlZCBvbiBtYWlsaW5nIGxpc3QsIG5vdyBmaXhlZCkuIFtSb2JlcnQKLSAgICAgVGhhdV0KLQotICAqKSAiSEVBRCAvIiBnaXZlcyB0aGUgY2xpZW50IGEgIkJhZCBSZXF1ZXN0IiBlcnJvciBtZXNzYWdlLCByYXRoZXIKLSAgICAgdGhhbiB0cnlpbmcgdG8gc2VuZCBubyBib2R5ICphbmQqIG5vIGhlYWRlcnMuICBbQ2xpZmYgU2tvbG5pY2tdLgotCi0gICopIERvbid0IHByb2R1Y2UgZG91YmxlIGVycm9yIHJlcG9ydHMgZm9yIHNvbWUgdmVyeSBvYnNjdXJlIGNhc2VzCi0gICAgIG1haW5seSBpbnZvbHZpbmcgYXV0aCBjb25maWd1cmF0aW9uICh0aGUgImFsbCBtb2R1bGVzIGRlY2xpbmUgdG8KLSAgICAgaGFuZGxlIiBjYXNlIHdoaWNoIGlzIGEgc3VyZSBzaWduIG9mIGEgc2VydmVyIGJ1ZyBpbiBtb3N0IGNhc2VzLAotICAgICBidXQgYWxzbyBoYXBwZW5zIHdoZW4gYXV0aGVudGljYXRpb24gaXMgYmFkbHkgbWlzY29uZmlndXJlZCkuCi0gICAgIFtSb2JlcnQgVGhhdV0KLQotICAqKSBNb3ZlZCBGQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVCBkZWZpbmVzIGludG8gY29uZi5oICh0aGF0J3Mgd2hhdAotICAgICBpdCdzICpmb3IqLCBhbmQgdGhpcyBzb3J0IG9mIHRoaW5nIHJlYWxseSBzaG91bGRuJ3QgYmUgY2x1dHRlcmluZwotICAgICB1cCB0aGUgTWFrZWZpbGUpLiBbUm9iZXJ0IFRoYXVdCi0KLSAgKikgSW5jaWRlbnRhbCBjb2RlIGNsZWFudXBzIGluIGh0dHBfbWFpbi5jIC0tLSBzdG9wIGRyYWdnaW5nCi0gICAgIHNhX2NsaWVudCBhcm91bmQ7IGp1c3QgZGVjbGFyZSBpdCB3aGVyZSB1c2VkLiAgW1JvYmVydCBUaGF1XQotCi0gICopIEFub3RoZXIgYWNjLXJlbGF0ZWQgZml4LiAgKEl0IGRvZXNuJ3QgbGlrZSBjb25zdCBjaGFyCi0gICAgIGluIHNvbWUgcGxhY2VzLi4uKS4gW01hcmsgQ294XQotCi1DaGFuZ2VzIHdpdGggU2hhbWJoYWxhIDAuNi4xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzIEp1bCAxOTk1Ci0KLSAgKikgRml4ZWQgYXV0aF9uYW1lLXJlbGF0ZWQgdHlwb3MgaW4gaHR0cF9jb3JlLmMgW0JyaWFuIEJlaGxlbmRvcmZdCi0gICAgIEFsc28sIGZpeGVkIGF1dGggdHlwbyBpbiBodHRwX3Byb3RvY29sLmMgdW5tYXNrZWQgYnkgdGhpcyBmaXguCi0KLSAgKikgQ29tcGlsZXMgY2xlYW4gd2l0aCBhY2Mgb24gU3VuT1MgW1BhdWwgU3V0dG9uXQotCi0gICopIFJlb3JkZXJlZCBtb2R1bGVzIGluIG1vZHVsZXMuYyBzbyB0aGF0IFJlZGlyZWN0IHRha2VzIHByaW9yaXR5Ci0gICAgIG92ZXIgU2NyaXB0QWxpYXMsIGZvciBOQ1NBIGJ1Zy1jb21wYXRpYmlsaXR5IFtSb2IgSGFydGlsbF0gLS0tCi0gICAgIGJlbGlldmUgaXQgb3Igbm90LCBoZSBoYXMgYW4gYWN0dWFsIHNpdGUgd2l0aCBhIFNjcmlwdEFsaWFzIGFuZAotICAgICBhIFJlZGlyZWN0IGRlY2xhcmVkIGZvciB0aGUgKmV4YWN0IHNhbWUgZGlyZWN0b3J5Ki4gIEV2ZW4gKm15KgotICAgICBjb21wYXRpYmlsaXR5IGZldGlzaCB3b3VsZG4ndCBtb3RpdmF0ZSBtZSB0byBmaXggdGhpcyBpZiB0aGUgZml4Ci0gICAgIHJlcXVpcmVkIGFueSBlZmZvcnQsIGJ1dCBpdCBkb2Vzbid0LCBzbyB3aGF0IHRoZSBoZXkuCi0KLSAgKikgRml4ZWQgdG8gcHJvcGVybHkgZGVmYXVsdCBzZXZlcmFsIHNlcnZlcl9yZWMgZmllbGRzIGZvciB2aXJ0dWFsCi0gICAgIHNlcnZlcnMgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBmaWVsZHMgaW4gdGhlIG1haW4gc2VydmVyX3JlYy4KLSAgICAgW0NsaWZmIFNrb2xuaWNrIC0tLSAncG9ydCcgd2FzIGEgcGFydGljdWxhciBpcnJpdGFudF0uCi0KLSAgKikgTm8gbG9uZ2VyIGtpbGxzIG9mZiBucGgtIGNoaWxkIHByb2Nlc3NlcyBiZWZvcmUgdGhleSBhcmUKLSAgICAgZmluaXNoZWQgc2VuZGluZyBvdXRwdXQuIFtNYXR0aGV3IEdyYXldCi0KLUNoYW5nZXMgd2l0aCBTaGFtYmhhbGEgMC42LjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgSnVsIDE5OTUKLQotICAqKSBUd28gc3R5bGVzIG9mIHRpbWVvdXQgLS0tIGhhcmQgYW5kIHNvZnQuICBzb2Z0X3RpbWVvdXQoKXMganVzdCBwdXQKLSAgICAgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGNsaWVudCBpbiBhbiAiYWJvcnRlZCIgc3RhdGUsIGJ1dCBvdGhlcndpc2UKLSAgICAgYWxsb3cgd2hhdGV2ZXIgaGFuZGxlcnMgYXJlIHJ1bm5pbmcgdG8gY2xlYW4gdXAuICBoYXJkX3RpbWVvdXQoKXMKLSAgICAgYWJvcnQgdGhlIHJlcXVlc3QgaW4gcHJvZ3Jlc3MgY29tcGxldGVseTsgYW55dGhpbmcgbm90IHRpZWQgdG8gc29tZQotICAgICByZXNvdXJjZSBwb29sIGNsZWFudXAgd2lsbCBsZWFrLiAgVGhleSdyZSBzdGlsbCBhcm91bmQgYmVjYXVzZSBJCi0gICAgIGhhdmVuJ3QgeWV0IGNvbWUgdXAgd2l0aCBhIG1vcmUgZWxlZ2FudCB3YXkgb2YgaGFuZGxpbmcKLSAgICAgdGltZW91dHMgd2hlbiB0YWxraW5nIHRvIHNvbWV0aGluZyB0aGF0IGlzbid0IHRoZSBjbGllbnQuICBUaGUKLSAgICAgZGVmYXVsdF9oYW5kbGVyIGFuZCB0aGUgZGlyX2hhbmRsZXIgbm93IHVzZSBzb2Z0IHRpbWVvdXRzLCBsYXJnZWx5Ci0gICAgIHNvIEkgY2FuIHRlc3QgdGhlIGZlYXR1cmUuICBbUm9iZXJ0IFRoYXVdCi0KLSAgKikgVHJhbnNmZXJMb2cgInwgbXlfcG9zdHByb2Nlc3NvciAuLi4iIHNlZW1zIHRvIGJlIHRoZXJlLiAgTm90ZSB0aGF0Ci0gICAgIHRoZSBjYXNlIG9mIGxvZyBoYW5kbGVycyBkeWluZyBwcmVtYXR1cmVseSBpcyBwcm9iYWJseSBoYW5kbGVkIFZFUlkKLSAgICAgZ3JhY2VsZXNzbHkgYXQgdGhpcyBwb2ludCwgYW5kIGlmIHRoZSBsb2dnZXIgc3RvcHMgcmVhZGluZyBpbnB1dCwKLSAgICAgdGhlIHNlcnZlciB3aWxsIGhhbmcuICAoSXQgaXMga25vd24gdG8gY29ycmVjdGx5IHJlc3RhcnQgdGhlCi0gICAgIGxvZ2dpbmcgcHJvY2VzcyBvbiBzZXJ2ZXIgcmVzdGFydDsgdGhpcyBpcyAoc2hvdWxkIGJlISkgZ29pbmcgdGhyb3VnaAotICAgICB0aGUgc2FtZSBTSUdURVJNL3BhdXNlL1NJR0tJTEwgcm91dGluZSB1c2VkIHRvIGRpbmcgYW4gZXJyYW50IENHSQotICAgICBzY3JpcHQpLiAgW1JvYmVydCBUaGF1XQotCi0gICopIGFzaXMgZmlsZXMgc3VwcG9ydGVkIChuZXcgbW9kdWxlKS4gIFtSb2JlcnQgVGhhdV0KLQotICAqKSBJZGVudGl0eUNoZWNrIGNvZGUgaXMgY29tcGlsZWQgaW4sIGJ1dCBoYXMgbm90IGJlZW4gdGVzdGVkLiAgKEkKLSAgICAgZG9uJ3Qga25vdyBhbnlvbmUgd2hvIHJ1bnMgaWRlbnRkKS4gW1JvYmVydCBUaGF1XQotCi0gICopIFBBVEhfSU5GTyBhbmQgUEFUSF9UUkFOU0xBVEVEIGFyZSBub3Qgc2V0IHVubGVzcyBzb21lIHJlYWwgUEFUSF9JTkZPCi0gICAgIGNhbWUgaW4gd2l0aCB0aGUgcmVxdWVzdCwgZm9yIE5DU0EgYnVnLWNvbXBhdGliaWxpdHkuIFtSb2JlcnQgVGhhdV0KLQotICAqKSBEb24ndCBsZWFrIHRoZSBESVIgKiBvbiBIRUFEIHJlcXVlc3QgZm9yIGEgZGlyZWN0b3J5LiBbUm9iZXJ0IFRoYXVdCi0KLSAgKikgRGVsZXRlZCB0aGUgYmxvY2tfYWxhcm1zKCkgc3R1ZmYgZnJvbSBkYm1fYXV0aDsgbm8gbG9uZ2VyIG5lY2Vzc2FyeSwKLSAgICAgYXMgdGltZW91dHMgYXJlIG5vdCBpbiBzY29wZS4gW1JvYmVydCBUaGF1XQotCi0gICopIHF1b3RlZC1zdHJpbmcgYXJncyBpbiBjb25maWcgZmlsZXMgbm93IGhhbmRsZWQgY29ycmVjdGx5IChkb2Vzbid0IGRyb3AKLSAgICAgdGhlIGxhc3QgY2hhcmFjdGVyKS4gW1JvYmVydCBUaGF1OyByZXBvcnRlZCBieSBSYW5keSBUZXJidXNoXQotCi0gICopIEZpeGVkIHNpbGx5IHR5cG8gaW4gaHR0cF9tYWluLmMgd2hpY2ggd2FzIHN1ZGRlbmx5IGZhdGFsIGluIEhQLVVYLgotICAgICBIb3cgdGhlIGhlbGwgZGlkIGl0IGV2ZXIgd29yaz8gW1JvYmVydCBUaGF1OyByZXBvcnRlZCBieSBSb2IgSGFydGlsbF0KLQotICAqKSBtb2RfY29yZS5jIC0tLSBkZWZhdWx0X3R5cGUgcmV0dXJucyBERUZBVUxUX1RZUEUgKHRoZSBjb21waWxlLXRpbWUKLSAgICAgZGVmYXVsdCBkZWZhdWx0IHR5cGUpOyB0aGUgZm9ybWVyIGRlZmF1bHQgZGVmYXVsdCBiZWhhdmlvciB3aGVuIGFsbAotICAgICB0eXBlLWNoZWNrZXJzIGRlZmF1bHRlZCBoYWQgYmVlbiBhIGNvcmUgZHVtcC4gIFtQYXVsIFN1dHRvbl0KLQotICAqKSBDb3B5IGZpbGVuYW1lcyBvdXQgb2YgdGhlIHN0cnVjdCBkaXJlbnQgd2hlbiBpbmRleGluZwotICAgICBkaXJlY3Rvcmllcy4gIChPbiBMaW51eCwgcmVhZGRpcigpIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzYW1lCi0gICAgIG1lbW9yeSBhcmVhIGV2ZXJ5IHRpbWUpLiAgRml4IGlzIGluIG1vZF9kaXIuYy4gIFtQYXVsIFN1dHRvbl0KLQotQ2hhbmdlcyB3aXRoIFNoYW1iaGFsYSAwLjUuMyBbbm90IHJlbGVhc2VkXQotCi0gICopIERlZmF1bHQgcmVzcG9uc2UgaGFuZGxlciBub3RlcyAiZmlsZSBub3QgZm91bmQiIGluIHRoZSBlcnJvciBsb2csCi0gICAgIGlmIHRoZSBmaWxlIHdhcyBub3QgZm91bmQuICBbQ2xpZmYgU2tvbG5pY2tdLgotCi0gICopIEFub3RoZXIgQ2xpZmYgYnVnIC0tLSAiR0VUIC9+dXNlciIgbm93IHByb3Blcmx5IHJlZGlyZWN0cyAodGhlIHVzZXJkaXIKLSAgICAgY29kZSBubyBsb25nZXIgc2V0cyB1cCBib2d1cyBQQVRIX0lORk8gd2hpY2ggZmFrZXMgb3V0IHRoZSBkaXJlY3RvcnkKLSAgICAgaGFuZGxlcikuIFtDbGlmZiBTa29sbmlja10KLQotQ2hhbmdlcyB3aXRoIFNoYW1iaGFsYSAwLjUuMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwNiBKdWwgMTk5NQotCi0gICopIENoYW5nZXMgdG8gaHR0cF9tYWluLmMgLS0tIHJvb3Qgc2VydmVyIG5vIGxvbmdlciBwbGF5cyBzaWxseQotICAgICBnYW1lcyB3aXRoIFNJR0NITEQsIGFuZCBzbyBub3cgZGV0ZWN0cyBhbmQgcmVwbGFjZXMgZHlpbmcKLSAgICAgY2hpbGRyZW4uICBDaGlsZCBwcm9jZXNzZXMganVzdCBkaWUgb24gU0lHVEVSTSwgd2l0aG91dCB0YWtpbmcKLSAgICAgdGhlIHdob2xlIHByb2Nlc3MgZ3JvdXAgd2l0aCB0aGVtLiAgUG90ZW50aWFsIHByb2JsZW0gLS0tIGlmIGFueQotICAgICBjaGlsZCBwcm9jZXNzIHJlZnVzZXMgdG8gZGllLCB3ZSBoYW5nIGluIHJlc3RhcnQuCi0gICAgIE1heFJlcXVlc3RzUGVyQ2hpbGQgbWF5IHN0aWxsIG5vdCB3b3JrLCBidXQgaXQgY2VydGFpbmx5IHdvcmtzCi0gICAgIGJldHRlciB0aGFuIGl0IGRpZCBiZWZvcmUgdGhpcyEgIFtSb2JlcnQgVGhhdV0KLQotICAqKSBtb2RfZGlyLmMgYnVnIGZpeGVzOiBSZWFkbWVOYW1lIGFuZCBIZWFkZXJOYW1lCi0gICAgIHdvcmsgKG9yIHdvcmsgYmV0dGVyLCBhdCBsZWFzdCk7IG92ZXItbG9uZyBkZXNjcmlwdGlvbiBsaW5lcwotICAgICBwcm9wZXJseSB0ZXJtaW5hdGVkLiBbTWFyayBDb3hdCi0KLSAgKikgaHR0cF9yZXF1ZXN0LmMgbm93IGNhbGxzIHVuZXNjYXBlX3VybCgpIG1vcmUgcGxhY2VzIHdoZXJlIGl0Ci0gICAgIHNob3VsZCBbUGF1bCBTdXR0b25dLgotCi0gICopIE1vcmUgZGlyZWN0b3J5IGhhbmRsaW5nIGJ1Z3MgKHJlcG9ydGVkIGJ5IENveCkKLSAgICAgUGFyZW50IERpcmVjdG9yeSBsaW5rIGlzIG5vdyBzZXQgY29ycmVjdGx5LiBbUm9iZXJ0IFRoYXVdCi0KLUNoYW5nZXMgd2l0aCBTaGFtYmhhbGEgMC41LjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDQgSnVsIDE5OTUKLQotICAqKSBHZW5lcmFsaXplZCBjbGVhbnVwIGludGVyZmFjZSBpbiBhbGxvYy5jIC0tLSBhbnkgZnVuY3Rpb24gY2FuIGJlCi0gICAgIHJlZ2lzdGVyZWQgd2l0aCBhbGxvYy5jIGFzIGEgY2xlYW51cCBmb3IgYSByZXNvdXJjZSBwb29sOwotICAgICB0cmFja2luZyBvZiBmaWxlcyBhbmQgZmlsZSBkZXNjcmlwdG9ycyBoYXMgYmVlbiByZWltcGxlbWVudGVkIGluCi0gICAgIHRlcm1zIG9mIHRoaXMgaW50ZXJmYWNlLCBzbyBJIGNhbiBnaXZlIGl0IHNvbWUgc29ydCBvZiBhIHRlc3QuCi0gICAgIFtSb2JlcnQgVGhhdV0KLQotICAqKSBNb3JlIGNoYW5nZXMgaW4gYWxsb2MuYyAtLS0gbmV3IGNsZWFudXBfZm9yX2V4ZWMoKSBmdW5jdGlvbiwKLSAgICAgd2hpY2ggdHJhY2tzIGRvd24gYW5kIGNsb3NlcyBhbGwgZmlsZSBkZXNjcmlwdG9ycyB3aGljaCBoYXZlIGJlZW4KLSAgICAgcmVnaXN0ZXJlZCB3aXRoIHRoZSBhbGxvYy5jIG1hY2hpbmVyeSBiZWZvcmUgdGhlIHNlcnZlciBleGVjKClzIGEKLSAgICAgY2hpbGQgcHJvY2VzcyBmb3IgQ0dJIG9yIDwhLS0jZXhlYy0tPi4gIENHSSBjaGlsZHJlbiBub3cgZ2V0Ci0gICAgIHN0YXJ0ZWQgd2l0aCBleGFjdGx5IHRocmVlIGZpbGUgZGVzY3JpcHRvcnMgb3Blbi4gIEhvcGVmdWxseSwKLSAgICAgdGhpcyBjdXJlcyB0aGUgcHJvYmxlbSBSb2IgSC4gd2FzIGhhdmluZyB3aXRoIG92ZXJseSBwZXJzaXN0ZW50Ci0gICAgIENHSSBjb25uZWN0aW9ucy4gW1JvYmVydCBUaGF1XQotCi0gICopIE11dHVhbCBleGNsdXNpb24gYXJvdW5kIHRoZSBhY2NlcHQoKSBpbiBjaGlsZF9tYWluKCkgLS0tIHRoaXMgaXMKLSAgICAgcmVxdWlyZWQgb24gYXQgbGVhc3QgU0dJLCBTb2xhcmlzIGFuZCBMaW51eCwgYW5kIGlzICNpZmRlZidlZCBpbgotICAgICBieSBkZWZhdWx0IG9uIHRob3NlIHN5c3RlbXMgb25seSAoLURGQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVCkuCi0gICAgIFRoaXMgdXNlcyBmY250bChGX1NFVExLLC4uLikgb24gdGhlIGVycm9yIGxvZyBkZXNjcmlwdG9yIGJlY2F1c2UKLSAgICAgZmxvY2soKSBvbiB0aGF0IGRlc2NyaXB0b3Igd29uJ3Qgd29yayBvbiBzeXN0ZW1zIHdoaWNoIGhhdmUgQlNECi0gICAgIGZsb2NrKCkgc2VtYW50aWNzLCBpbmNsdWRpbmcgKEkgdGhpbmspIExpbnV4IDEuMyBhbmQgU29sYXJpcy4KLQotICAgICBUaGlzIGRvZXMgd29yayBvbiBTdW5PUyAod2hlbiB0aGUgc2VydmVyIGlzIGlkbGUsIG9ubHkgb25lCi0gICAgIHByb2Nlc3MgaW4gdGhlIHBvb2wgaXMgd2FpdGluZyBvbiBhY2NlcHQoKSk7IGl0ICpvdWdodCogdG8gd29yawotICAgICBvbiB0aGUgb3RoZXIgc3lzdGVtcy4gW1JvYmVydCBUaGF1XQotCi0gICopIEZyZWVCU0QgYW5kIEJTREkgcG9ydGFiaWxpdHkgdHdlYWtzIFtDaHVjayBNdXJja29dCi0KLSAgKikgc2l6ZW9mKCpzYV9jbGllbnQpIGJ1Z2ZpeCBmcm9tIFtSb2IgSGFydGlsbF0KLQotICAqKSBwc3RyZHVwKC4uLiwgTlVMTCkgcmV0dXJucyBOVUxMLCBbUmFuZHkgVGVyYnVzaF0KLQotICAqKSBibG9ja19hbGFybXMoKSB0byBhdm9pZCBsZWFraW5nIHRoZSBEQk0qIGluIGRibSBhdXRoICh0aGlzIHNob3VsZAotICAgICBiZSB1bm5lY2Vzc2FyeSBpZiBJIGdvIHRvIHRoZSByZXZpc2VkIHRpbWVvdXQtaGFuZGxpbmcgc2NoZW1lKS4KLSAgICAgW1JvYmVydCBUaGF1XQotCi0gICopIEZvciBOQ1NBIGJ1Zy1jb21wYXRpYmlsaXR5LCBzZXQgUVVFUllfU1RSSU5HIGVudiB2YXIgKHRvIGEgbnVsbAotICAgICBzdHJpbmcpIGV2ZW4gaWYgbm9uZSBjYW1lIGluIHdpdGggdGhlIHJlcXVlc3QuICBbUm9iZXJ0IFRoYXVdCi0KLSAgKikgQ0hBTkdFUyBmaWxlIGFkZGVkIHRvIGRpc3RyaWJ1dGlvbiA7LSkuCi0KLUNoYW5nZXMgd2l0aCBTaGFtYmhhbGEgMC40LjUKLQotICAqKSBtb2RfZGxkIC0tLSBlYXJseSBkeW5hbWljIGxvYWRpbmcgc3VwcG9ydCBbcnN0XQotICAqKSBBZGQgd2lsZGNhcmQgY29udGVudCBoYW5kbGVycyBmb3IgWEJJVEhBQ0s7IGRlZmF1bHRfaGFuZGVyIG5vdwotICAgICBpbnZva2VkIHdpdGggdGhhdCBtZWNoYW5pc20gKGFzIGEgaGFuZGxlciBoYW5naW5nIG9mZiBtb2RfY29yZSkgW3JzdF0KLSAgKikgWEJJVEhBQ0sgc3VwcG9ydGVkIGFzIGEgd2lsZGNhcmQgY29udGVudC1oYW5kbGVyLCBhbmQgCi0gICAgIGNvbmZpZ3VyYWJsZSBhdCBydW4tdGltZSAobm90IGp1c3QgYXQgY29tcGlsZSB0aW1lLCBhcyBpbiB0aGUKLSAgICAgInBhdGNoeSBzZXJ2ZXIiIHJlbGVhc2VzKSBbcnN0XQotCi1DaGFuZ2VzIHdpdGggU2hhbWJoYWxhIDAuNC40ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwIEp1biAxOTk1Ci0KLSAgKikgRml4ZWQgYmFzaWMgdGhpbmtvcyBpbiBtb2RfZGJtX2F1dGguYyBbcnN0LCByZXBvcnRlZCBieSBNYXJrIENveF0KLSAgKikgSGFuZGxlIEFkZHR5cGUgeC95IC56IFtyc3QsIHJlcG9ydGVkIGJ5IENveF0KLQotQ2hhbmdlcyB3aXRoIFNoYW1iaGFsYSAwLjQuMwotCi0gICopIEZpeGVkIHZlcnkgZHVtYiBidWcgaW4gbW9kX2FsaWFzOyAiQWxpYXMiIGFuZCAiUmVkaXJlY3QiIGFyZSBub3QKLSAgICAgc3lub255bW91cyBbcnN0LCB0ZXJidXNoXQotCi1DaGFuZ2VzIHdpdGggU2hhbWJoYWxhIDAuNC4xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4IEp1biAxOTk1Ci0KLSAgKikgRmlyc3QtY3V0IHZpcnR1YWwgaG9zdCBpbXBsZW1lbnRhdGlvbjsgc29tZSByZWZpdCBpbiB0aGUgY29uZmlnCi0gICAgIHJlYWRpbmcgY29kZSwgYW5kIGxvZyBtYW5hZ2VtZW50LCB3YXMgbmVjZXNzYXJ5IHRvIHN1cHBvcnQgdGhpcyBbcnN0XQotICAqKSBTdWItcG9vbCBtYWNoaW5lcnksIG9yaWdpbmFsbHkgYWRkZWQgdG8gYXZvaWQgZXhjZXNzaXZlIHN0b3JhZ2UKLSAgICAgYWxsb2NhdGlvbiBvbiBsaXN0aW5ncyBvZiBsYXJnZSBkaXJlY3RvcmllcyAod2hpY2ggdHVybmVkIG91dCB0bwotICAgICBiZSB0aGUgcHJvYmxlbSB0aGF0IHRoZSAwLjMgc3RvcmFnZSBhY2NvdW50aW5nIHdhcyBhZGRlZCB0bwotICAgICBmaW5kKS4gIFN1YnJlcXVlc3RzIGFuZCBtb2RfZGlyIGNoYW5nZWQgdG8gdXNlIHN1YnBvb2xzLiAgW3JzdF0KLSAgKikgTW9yZSBtZW1vcnkgZGVidWdnaW5nIC0tLSBmcmVlIGxpc3QgY29uc2lzdGVuY3kgY2hlY2tzLiBbcnN0XQotICAqKSBBZGRlZCBlcnJfaGVhZGVycyB0byByZXF1ZXN0X3JlYywgd2l0aCBzdXBwb3J0IGVsc2V3aGVyZSBbcnN0XQotICAqKSBPdGhlciBmaXhlcyB0byBtaW5vciBidWdzIGluIG1vZF9kaXIgYW5kIG1vZF9pbmNsdWRlcyBbcnN0LCB0ZXJidXNoXQotCi1DaGFuZ2VzIHdpdGggU2hhbWJoYWxhIDAuMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5IEp1biAxOTk1Ci0KLSAgKikgU3dpdGNoIE9ORV9QUk9DRVNTIHRvIGEgcnVudGltZSBjb21tYW5kLWxpbmUgb3B0aW9uICgtWCkKLSAgKikgRG9uJ3QgY29tcGlsZSBpbiBtb2RfYWlfYmFja2NvbXBhdCBieSBkZWZhdWx0Ci0gICopIFN3aXRjaCBuYW1lIG9mIHNlcnZlciBmcm9tIEFwYWNoZSB0byBTaGFtYmhhbGEgaW4gTWFrZWZpbGUKLSAgKikgQWRkIHNvbWUgYWNjb3VudGluZyByb3V0aW5lcyB0byB0cmFjayBtZW1vcnkgdXNhZ2UgaW4gdGhlIHBvb2xzLAotICAgICBmb3IgZGVidWdnaW5nCi0KLUNoYW5nZXMgd2l0aCBTaGFtYmhhbGEgMC4yCi0KLSAgKikgU2V0IERPQ1VNRU5UX1JPT1QgQ0dJIHZhcmlhYmxlCi0gICopIEFkZCBzaW5nbGUtcHJvY2VzcyBkZWJ1Z2dpbmcsIGFzIGEgY29tcGlsZS10aW1lIG9wdGlvbiAoT05FX1BST0NFU1MpCi0gICopIEFkZCBjcml0aWNhbCBzZWN0aW9uIHByb3RlY3Rpb24gdG8gaGFuZGxpbmcgb2YgY2xlYW51cCBzdHJ1Y3R1cmVzIAotICAgICBpbiBhbGxvYy5jIFtyc3RdCi0gICopIFNpZ25pZmljYW50IGNvZGUgcmVvcmcgd2l0aGluIHRoZSBzZXJ2ZXIgY29yZSB0byBncm91cCByZWxhdGVkCi0gICAgIGZ1bmN0aW9ucyB0b2dldGhlciBbcnN0XQotICAqKSBDb3JyZWN0bHkgaGFuZGxlIGNsaWVudHMgdGhhdCBoYW5nIHVwIGJlZm9yZSBzZW5kaW5nIGFueSByZXF1ZXN0Ci0gICAgIFtyc3RdCi0gICopIFJlcGxhY2UgZHlpbmcgY2hpbGQgcHJvY2Vzc2VzLiBbcnN0XQotCi1DaGFuZ2VzIHdpdGggU2hhbWJoYWxhIDAuMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyIEp1biAxOTk1Ci0KLSAgIE1ham9yIHJld3JpdGUgb2YgdGhlIHByZS1leGlzdGluZyAicGF0Y2h5IHNlcnZlciIgY29kZWJhc2UsIGJ5Ci0gICBSb2JlcnQgVGhhdSAocnN0KS4gIFNpZ25pZmljYW50IHBvcnRpb25zIG9mIHRoZSBzZXJ2ZXIgY29kZSwgc3VjaAotICAgYXMgY29uZmlndXJhdGlvbi1maWxlIGhhbmRsaW5nIGFuZCBIVFRQIGF1dGhlbnRpY2F0aW9uIHN1cHBvcnQsCi0gICB3ZXJlIHJpcHBlZCBvdXQgYW5kIHJld3JpdHRlbiBmcm9tIHNjcmF0Y2guICBDb2RlIHRoYXQgd2FzIG5vdAotICAgY29tcGxldGVseSByZXdyaXR0ZW4gd2FzIHNpZ25pZmljYW50bHkgYWx0ZXJlZC4KLQotICAgTWFqb3IgY2hhbmdlcyB3aXRoIHRoaXMgcmVsZWFzZSBpbmNsdWRlOgotCi0gICAqKSBJbnRyb2R1Y3Rpb24gb2YgdGhlIG1vZHVsZSBBUEk7IGluIHJlcXVlc3QgaGFuZGxpbmcsIHRoZSBjZW50cmFsIAotICAgICAgbWFjaGluZXJ5IGp1c3QgZGlzcGF0Y2hlcyB0byB2YXJpb3VzIG1vZHVsZXMsIHdoaWNoIGFjdHVhbGx5IGRvCi0gICAgICBtb3N0IG9mIHRoZSB3b3JrLiAgQ29uZmlndXJhdGlvbiBoYW5kbGluZyBpcyBzaW1pbGFyIC0tLSBtb2R1bGVzCi0gICAgICBkZWNsYXJlIHRoZWlyIG93biBjb21tYW5kcywgYW5kIHRoZSBjZW50cmFsIG1hY2hpbmVyeSBqdXN0Ci0gICAgICBkaXNwYXRjaGVzIHRvIHRoZW0uICAKLQotICAgICAgQVBJIGZlYXR1cmVzIGZyb20gc2hhbWJoYWxhLzAuMSB3ZXJlIHN1YnN0YW50aWFsbHkgdW5jaGFuZ2VkIGluCi0gICAgICBBcGFjaGUgMS4wIGFuZCAxLjEuICAoMS4wIEFQSSBmZWF0dXJlcyBub3QgeWV0IHByZXNlbnQgaW4gdGhpcwotICAgICAgcmVsZWFzZSwgc3VjaCBhcyB3aWxkY2FyZCBoYW5kbGVycyBhbmQgc3VicG9vbHMsIHdlcmUgYWRkZWQgaW4KLSAgICAgIHN1YnNlcXVlbnQgU2hhbWJoYWxhIHJlbGVhc2VzLCBhbmQgd2VyZSBhbHNvIGdlbmVyYWxseSByc3QncwotICAgICAgd29yaykuIAotCi0gICAqKSBUaGlzIHJlbGVhc2UgaW5jbHVkZWQgdGhlIGZvbGxvd2luZyBtb2R1bGVzOgotCi0gICAgICBtb2RfYWNjZXNzICAgICAgKGFjY2VzcyBjb250cm9sIC0tLSBhbGxvdyBhbmQgZGVueSBkaXJlY3RpdmVzKSwKLSAgICAgIG1vZF9hbGlhcyAgICAgICAoQWxpYXMgYW5kIFJlZGlyZWN0IGNvbW1hbmRzKSwKLSAgICAgIG1vZF9hdXRoICAgICAgICAoc3RyYWlnaHQgSFRUUCBhdXRoZW50aWNhdGlvbiwgYmFzZWQgb24gZmxhdC1maWxlcykKLSAgICAgIG1vZF9hdXRoX2RibSAgICAoc2FtZSwgd2l0aCBkYm0gZmlsZXMpCi0gICAgICBtb2RfY2dpICAgICAgICAgKENHSSBzY3JpcHRzIGFuZCwgaW4gdGhpcyByZWxlYXNlLCBTY3JpcHRBbGlhcykKLSAgICAgIG1vZF9jb21tb25fbG9nICAoQ0xGIGFjY2VzcyBsb2dzOyBsYXRlciByZW5hbWVkIG1vZF9sb2dfY29tbW9uKQotICAgICAgbW9kX2RpciAgICAgICAgIChkaXJlY3RvcnkgaW5kZXhpbmcpCi0gICAgICBtb2RfaW5jbHVkZSAgICAgKHNlcnZlci1zaWRlIGluY2x1ZGVzKQotICAgICAgbW9kX21pbWUgICAgICAgIChBZGRUeXBlIGRpcmVjdGl2ZXMpCi0gICAgICBtb2RfbmVnb3RpYXRpb24gKGNvbnRlbnQgbmVnb3RpYXRpb24pCi0gICAgICBtb2RfdXNlcmRpciAgICAgKHN1cHBvcnQgZm9yIHVzZXJzJyBwdWJsaWNfaHRtbCBkaXJlY3RvcmllcykKLQotICAgICAgSXQgYWxzbyBpbmNsdWRlZCBhIG1vZF9haV9iYWNrY29tcGF0LCB3aGljaCB3YXMgYSBwcml2YXRlIGhhY2sKLSAgICAgIGZvciBiYWNrLWNvbXBhdGliaWxpdHkgd2l0aCByc3QncyBvd24gQUktbGFiIHNlcnZlcnMuCi0KLSAgICAgIEFsbCBvZiB0aGVzZSBtb2R1bGVzIHdlcmUgc3Vic3RhbnRpYWxseSBjb21wbGV0ZSwgYW5kIGZ1bmN0aW9uYWwgCi0gICAgICBvciBuZWFybHkgc28gKGEgZmV3LCB3aGljaCBpbXBsZW1lbnRlZCBmZWF0dXJlcyBub3QgaW4gdXNlIGF0Ci0gICAgICBUaGF1J3Mgc2l0ZSwgcmVxdWlyZWQgcGF0Y2hlcyBvZiBhIGZldyBsaW5lcykuCi0KLSAgICopIHN1Yi1yZXF1ZXN0IG1hY2hpbmVyeSwgdG8gYWxsb3cgbW9kdWxlcyB0byBkZXRlcm1pbmUgaG93IG90aGVyCi0gICAgICBtb2R1bGVzIHdvdWxkIGFzc2lnbiBNSU1FIHR5cGVzIHRvIGEgZ2l2ZW4gZmlsZSwgb3Igb3B0aW9uYWxseQotICAgICAgc2VydmUgaXRzIGNvbnRlbnQgKHRoaXMgaXMgaGVhdmlseSB1c2VkIGJ5IG1vZF9kaXIsIG1vZF9pbmNsdWRlCi0gICAgICBhbmQgbW9kX25lZ290aWF0aW9uKS4KLQotICAgKikgUmVzb3VyY2UgcG9vbCBzeXN0ZW0gZm9yIGtlZXBpbmcgdHJhY2sgb2YgbWVtb3J5IGFsbG9jYXRlZCBhbmQKLSAgICAgIGZpbGVzIG9wZW5lZCBpbiBzZXJ2aWNlIG9mIGEgcGFydGljdWxhciByZXF1ZXN0LiAgTXVjaCBvZiB0aGUKLSAgICAgIGNvZGUgaW4gdGhlIG1vZHVsZXMgKHdoZW4gdGhleSB3ZXJlbid0IHJld3JpdGVzKSB3YXMgYWRqdXN0ZWQgdG8gCi0gICAgICByZXBsYWNlIGEgcGVydmFzaXZlIGNvbnZlbnRpb24gb2YgdXNpbmcgZml4ZWQtc2l6ZSBidWZmZXJzIG9uCi0gICAgICB0aGUgc3RhY2sgd2l0aCBhbiBlcXVhbGx5IHBlcnZhc2l2ZSBjb252ZW50aW9uIG9mIHVzaW5nIG1lbW9yeQotICAgICAgYWxsb2NhdGVkIHdpdGggcGFsbG9jKCkuCi0KLSAgICopIFJlb3JnYW5pemF0aW9uIG9mIGRhdGEgc3RydWN0dXJlcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbgotICAgICAgcmVxdWVzdCB0byBlbGltaW5hdGUgdXNlIG9mIGdsb2JhbCB2YXJpYWJsZXMgYW5kIHRoZSB0cm91Ymxlc29tZSAKLSAgICAgIHVubXVuZ2VfbmFtZSBmdW5jdGlvbiAodXNlZCBpbiBOQ1NBIGFuZCBlYXJseSBBcGFjaGUgcmVsZWFzZXMgdG8gCi0gICAgICBhdHRlbXB0IHRvIGRldGVybWluZSB0aGUgVVJJIHdoaWNoIG1hcHBlZCB0byBhIGdpdmVuIGZpbGVuYW1lCi0gICAgICAtLS0gYSBkaWZmaWN1bHQgcHJvcG9zaXRpb24sIGdpdmVuIHRoYXQgaXQgaXMgZWFzeSB0byBwcm9kdWNlCi0gICAgICBzZXR1cHMgaW4gd2hpY2ggbXVsdGlwbGUgVVJJcyBtYXAgdG8gdGhlIHNhbWUgZmlsZSkuCi0KLSAgICopIFNvdXJjZSBmaWxlcyByZW5hbWVkIGFuZCByZWFycmFuZ2VkCi0KLSAgICopIFZlcnkgc2ltcGxlIHByZS1mb3JraW5nIGJlaGF2aW9yIC0tLSBwYXJlbnQgcHJvY2VzcyBmb3JrZWQgb2ZmIGEgCi0gICAgICBmaXhlZCBudW1iZXIgb2YgY2hpbGRyZW4sIGFuZCB0aGVuIGp1c3Qgd2FpdGVkIGZvciBTSUdIVVAuCi0KLSAgICopIE90aGVyIG1vcmUgbWlub3IgY2hhbmdlcyB0b28gbnVtZXJvdXMgdG8gbGlzdC4KLQotICAgVGhpcyByZWxlYXNlIGluY2x1ZGVkIG1vZGlmaWVkIHZlcnNpb25zIG9mIGEgbG90IG9mIGNvZGUgZnJvbSB0aGUKLSAgIEFwYWNoZSAwLjYuNCBwdWJsaWMgcmVsZWFzZSwgcGx1cyBhbiBlYXJseSBwcmUtZm9ya2luZyBwYXRjaAotICAgY29kZXZlbG9wZWQgYnkgUm9iZXJ0IFRoYXUgYW5kIFJvYiBIYXJ0aWxsLgotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDAuNy4zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwIEp1biAxOTk1Ci0KLSAgICopIFRoZXJlIHdlcmUgYSBidW5jaCBvZiBjaGFuZ2VzIGJldHdlZW4gQXBhY2hlIDAuNi40IGFuZCAwLjcuMyB0aGF0Ci0gICAgICB3ZXJlIGluY29ycG9yYXRlZCBieSBSb2IgSGFydGlsbCBvbiB0aGUgbWFpbiBicmFuY2ggd2hpbGUgUm9iZXJ0IFRoYXUKLSAgICAgIHdvcmtlZCBvbiB0aGUgU2hhbWJoYWxhIHJld3JpdGUgYWJvdmUuICBNb3N0IHdlcmUgbWVyZ2VkIGludG8gdGhlCi0gICAgICBTaGFtYmFsYSBhcmNoaXRlY3R1cmUgYWZ0ZXIgQXBhY2hlIDAuOC4wLgotCi1DaGFuZ2VzIHdpdGggQXBhY2hlIDAuNi40ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzIE1heSAxOTk1Ci0KLSAgICopIFBhdGNoZXMgYnkgUm9iIEhhcnRpbGwsIENsaWZmIFNrb2xuaWNrLCBSYW5keSBUZXJidXNoLCBSb2JlcnQgVGhhdSwKLSAgICAgIGFuZCBvdGhlcnMuCi0KLUNoYW5nZXMgd2l0aCBBcGFjaGUgMC41LjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgQXByIDE5OTUKLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMiBBcHIgMTk5NQotCi0gICopIFBhdGNoZXMgYnkgQnJpYW4gQmVobGVuZG9yZiwgQW5kcmV3IFdpbHNvbiwgUm9iZXJ0IFRoYXUsCi0gICAgIGFuZCBSb2IgSGFydGlsbC4KLQotQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCBNYXIgMTk5NQotCi0gICopIFBhdGNoZXMgYnkgUm9iZXJ0IFRoYXUsIERhdmlkIFJvYmluc29uLCBSb2IgSGFydGlsbCwgYW5kCi0gICAgIENhcmxvcyBWYXJlbGEuCi0KLUNoYW5nZXMgd2l0aCBBcGFjaGUgMC4yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTggTWFyIDE5OTUKLQotICAqKSBCYXNlZCBvbiBOQ1NBIGh0dHBkIDEuMyBieSBSb2IgTWNDb29sIGFuZCBwYXRjaGVzIGJ5IENFUlQsCi0gICAgIFJveSBGaWVsZGluZywgUm9iZXJ0IFRoYXUsIE5pY29sYXMgUGlvY2gsIERhdmlkIFJvYmluc29uLAotICAgICBCcmlhbiBCZWhsZW5kb3JmLCBSb2IgSGFydGlsbCwgYW5kIENsaWZmIFNrb2xuaWNrLgpkaWZmIC0tZ2l0IGEvSU5TVEFMTCBiL0lOU1RBTEwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNTk4ZWIuLjAwMDAwMDAKLS0tIGEvSU5TVEFMTAorKysgL2Rldi9udWxsCkBAIC0xLDQ0OSArMCwwIEBACi0KLSAgQVBBQ0hFIElOU1RBTExBVElPTgotCi0gIEludHJvZHVjdGlvbgotICA9PT09PT09PT09PT0KLQotICBBcGFjaGUgMi4wJ3MgY29uZmlndXJhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIGVudmlyb25tZW50IGhhcyBjaGFuZ2VkCi0gIGNvbXBsZXRlbHkgZnJvbSBBcGFjaGUgMS4zLiAgQXBhY2hlIDEuMyB1c2VkIGEgY3VzdG9tIHNldCBvZiBzY3JpcHRzCi0gIHRvIGFjaGlldmUgZWFzeSBpbnN0YWxsYXRpb24uICBBcGFjaGUgMi4wIG5vdyB1c2VzIGxpYnRvb2wgYW5kIGF1dG9jb25mCi0gIHRvIGNyZWF0ZSBhbiBlbnZpcm9ubWVudCB0aGF0IGxvb2tzIGxpa2UgbWFueSBvdGhlciBPcGVuIFNvdXJjZSBwcm9qZWN0cy4KLQotCi0gIEluc3RhbGxpbmcgdGhlIEFwYWNoZSAxLjMgSFRUUCBzZXJ2ZXIgd2l0aCBBUEFDSQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAxLiBPdmVydmlldyBmb3IgdGhlIGltcGF0aWVudAotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICQgLi9idWlsZGNvbmYKLSAgICAgJCAuL2NvbmZpZ3VyZSAtLXByZWZpeD1QUkVGSVgKLSAgICAgJCBtYWtlCi0gICAgICQgbWFrZSBpbnN0YWxsCi0gICAgICQgUFJFRklYL2Jpbi9hcGFjaGVjdGwgc3RhcnQKLQotICAgICBOT1RFOiBQUkVGSVggaXMgbm90IHRoZSBzdHJpbmcgIlBSRUZJWCIuIEluc3RlYWQgdXNlIHRoZSBVbml4Ci0gICAgICAgICAgIGZpbGVzeXN0ZW0gcGF0aCB1bmRlciB3aGljaCBBcGFjaGUgc2hvdWxkIGJlIGluc3RhbGxlZC4gRm9yCi0gICAgICAgICAgIGluc3RhbmNlIHVzZSAiL3Vzci9sb2NhbC9hcGFjaGUiIGZvciBQUkVGSVggYWJvdmUuCi0KLSAgMi4gUmVxdWlyZW1lbnRzCi0gICAgIC0tLS0tLS0tLS0tLQotCi0gICAgIFRoZSBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzIGV4aXN0IGZvciBidWlsZGluZyBBcGFjaGU6Ci0KLSAgICAgbyAgRGlzayBTcGFjZTogCi0KLSAgICAgICAgTWFrZSBzdXJlIHlvdSBoYXZlIGFwcHJveGltYXRlbHkgMTIgTUIgb2YgdGVtcG9yYXJ5IGZyZWUgZGlzayBzcGFjZQotICAgICAgICBhdmFpbGFibGUuICBBZnRlciBpbnN0YWxsYXRpb24gQXBhY2hlIG9jY3VwaWVzIGFwcHJveGltYXRlbHkgNSBNQiBvZgotICAgICAgICBkaXNrIHNwYWNlICh0aGUgYWN0dWFsIHJlcXVpcmVkIGRpc2sgc3BhY2UgZGVwZW5kcyBvbiB0aGUgYW1vdW50IG9mCi0gICAgICAgIGNvbXBpbGVkIGluIHRoaXJkIHBhcnR5IG1vZHVsZXMsIGV0YykuCi0KLSAgICAgbyAgQU5TSS1DIENvbXBpbGVyOiAKLQotICAgICAgICBNYWtlIHN1cmUgeW91IGhhdmUgYW4gQU5TSS1DIGNvbXBpbGVyIGluc3RhbGxlZC4gVGhlIEdOVSBDIGNvbXBpbGVyCi0gICAgICAgIChHQ0MpIGZyb20gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiAoRlNGKSBpcyByZWNvbW1lbmRlZCAodmVyc2lvbgotICAgICAgICAyLjcuMiBpcyBmaW5lKS4gSWYgeW91IGRvbid0IGhhdmUgR0NDIHRoZW4gYXQgbGVhc3QgbWFrZSBzdXJlIHlvdXIKLSAgICAgICAgdmVuZG9ycyBjb21waWxlciBpcyBBTlNJIGNvbXBsaWFudC4gWW91IGNhbiBmaW5kIHRoZSBob21lcGFnZSBvZiBHTlUKLSAgICAgICAgYXQgaHR0cDovL3d3dy5nbnUub3JnLyBhbmQgdGhlIEdDQyBkaXN0cmlidXRpb24gdW5kZXIKLSAgICAgICAgaHR0cDovL3d3dy5nbnUub3JnL29yZGVyL2Z0cC5odG1sIC4KLQotICAgICBvICBMaWJ0b29sIDEuMy4zOgotCi0gICAgICAgIE1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGxpYnRvb2wgMS4zLjMgb3IgbGF0ZXIgaW5zdGFsbGVkIGJlZm9yZQotICAgICAgICB0cnlpbmcgdG8gY29uZmlndXJlIGFuZCBidWlsZCBBcGFjaGUgMi4wLiAgTGlidG9vbCBjYW4gYmUgZG93bmxvYWRlZAotICAgICAgICBmcm9tIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEZTRiksIGF0IAotICAgICAgICBodHRwOi8vd3d3LmdudS5vcmcvb3JkZXIvZnRwLmh0bWwuCi0KLSAgICAgbyAgQXV0b2NvbmYgMi4xMzoKLQotICAgICAgICBNYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBhdXRvY29uZiAyLjEzIG9yIGxhdGVyIGluc3RhbGxlZCBiZWZvcmUKLSAgICAgICAgdHJ5aW5nIHRvIGNvbmZpZ3VyZSBhbmQgYnVpbGQgQXBhY2hlIDIuMC4gIEF1dG9jb25mIGNhbiBiZQotICAgICAgICBkb3dubG9hZGVkIGZyb20gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiAoRlNGKSwgYXQKLSAgICAgICAgaHR0cDovL3d3dy5nbnUub3JnL29yZGVyL2Z0cC5odG1sLgotCi0gICAgIG8gIFBlcmwgNSBJbnRlcnByZXRlciBbT1BUSU9OQUxdOgotCi0gICAgICAgIEZvciBzb21lIG9mIHRoZSBzdXBwb3J0IHNjcmlwdHMgbGlrZSBgYXB4cycgb3IgYGRibW1hbmFnZScgKHdoaWNoIGFyZQotICAgICAgICB3cml0dGVuIGluIFBlcmwpIHRoZSBQZXJsIDUgaW50ZXJwcmV0ZXIgaXMgcmVxdWlyZWQgKHZlcnNpb25zIDUuMDAzCi0gICAgICAgIGFuZCA1LjAwNCBhcmUgZmluZSkuIElmIG5vIHN1Y2ggaW50ZXJwcmV0ZXIgaXMgZm91bmQgYnkgQVBBQ0kncwotICAgICAgICBgY29uZmlndXJlJyBzY3JpcHQgdGhpcyBpcyBubyBoYXJtLiAgT2YgY291cnNlLCB5b3Ugc3RpbGwgY2FuIGJ1aWxkCi0gICAgICAgIGFuZCBpbnN0YWxsIEFwYWNoZSAxLjMuIE9ubHkgdGhvc2Ugc3VwcG9ydCBzY3JpcHRzIGNhbm5vdCBiZSB1c2VkLiBJZgotICAgICAgICB5b3UgaGF2ZSBtdWx0aXBsZSBQZXJsIGludGVycHJldGVycyBpbnN0YWxsZWQgKHBlcmhhcHMgYSBQZXJsIDQgZnJvbQotICAgICAgICB0aGUgdmVuZG9yIGFuZCBhIFBlcmwgNSBmcm9tIHlvdXIgb3duKSwgdGhlbiBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UKLSAgICAgICAgdGhlIC0td2l0aC1wZXJsIG9wdGlvbiAoc2VlIGJlbG93KSB0byBtYWtlIHN1cmUgdGhlIGNvcnJlY3Qgb25lIGlzCi0gICAgICAgIHNlbGVjdGVkIGJ5IEFQQUNJLgotCi0gICAgIG8gIER5bmFtaWMgU2hhcmVkIE9iamVjdCAoRFNPKSBzdXBwb3J0IFtPUFRJT05BTF06Ci0KLSAgICAgICAgVG8gcHJvdmlkZSBtYXhpbXVtIGZsZXhpYmlsaXR5IEFwYWNoZSBub3cgaXMgYWJsZSB0byBsb2FkIG1vZHVsZXMKLSAgICAgICAgdW5kZXIgcnVudGltZSB2aWEgdGhlIERTTyBtZWNoYW5pc20gYnkgdXNpbmcgdGhlIHByYWdtYXRpYwotICAgICAgICBkbG9wZW4oKS9kbHN5bSgpIHN5c3RlbSBjYWxscy4gVGhlc2Ugc3lzdGVtIGNhbGxzIGFyZSBub3QgYXZhaWxhYmxlCi0gICAgICAgIHVuZGVyIGFsbCBvcGVyYXRpbmcgc3lzdGVtcyB0aGVyZWZvcmUgeW91IGNhbm5vdCB1c2UgdGhlIERTTyBtZWNoYW5pc20KLSAgICAgICAgb24gYWxsIHBsYXRmb3Jtcy4gQW5kIEFwYWNoZSBjdXJyZW50bHkgaGFzIG9ubHkgbGltaXRlZCBidWlsdC1pbgotICAgICAgICBrbm93bGVkZ2Ugb24gaG93IHRvIGNvbXBpbGUgc2hhcmVkIG9iamVjdHMgYmVjYXVzZSB0aGlzIGlzIGhlYXZpbHkKLSAgICAgICAgcGxhdGZvcm0tZGVwZW5kZW50LiBUaGUgY3VycmVudCBzdGF0ZSBpcyB0aGlzOgotCi0gICAgICAgIG8gT3V0LW9mLXRoZS1ib3ggc3VwcG9ydGVkIHBsYXRmb3JtcyBhcmUgKE5vdCBhbGwgb2YgdGhlc2Ugd2lsbAotICAgICAgICAgIHdvcmsgY3VycmVudGx5LiAgRFNPIHN1cHBvcnQgaXMgY3VycmVudGx5IGF2YWlsYWJsZSBvbiBtb3N0Ci0gICAgICAgICAgb2YgdGhlc2UgcGxhdGZvcm1zIGhvd2V2ZXIpOgotICAgICAgICAgICAtIExpbnV4ICAgICAtIFN1bk9TICAgICAgICAgLSBVbml4V2FyZSAgICAgLSBEYXJ3aW4vTWFjIE9TCi0gICAgICAgICAgIC0gRnJlZUJTRCAgIC0gU29sYXJpcyAgICAgICAtIEFJWCAgICAgICAgICAtIE9wZW5TdGVwL01hY2gKLSAgICAgICAgICAgLSBPcGVuQlNEICAgLSBJUklYICAgICAgICAgIC0gU0NPICAgICAgICAgIC0gRFlOSVgvcHR4Ci0gICAgICAgICAgIC0gTmV0QlNEICAgIC0gSFBVWCAgICAgICAgICAtIFJlbGlhbnRVTklYCi0gICAgICAgICAgIC0gQlNESSAgICAgIC0gRGlnaXRhbCBVbml4ICAtIERHVVgKLQotICAgICAgICBvIEVudGlyZWx5IHVuc3VwcG9ydGVkIHBsYXRmb3JtcyBhcmU6Ci0gICAgICAgICAgIC0gVWx0cml4Ci0KLSAgICAgICAgSWYgeW91ciBzeXN0ZW0gaXMgbm90IG9uIHRoZXNlIGxpc3RzIGJ1dCBoYXMgdGhlIGRsb3Blbi1zdHlsZQotICAgICAgICBpbnRlcmZhY2UsIHlvdSBlaXRoZXIgaGF2ZSB0byBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBjb21waWxlciBhbmQKLSAgICAgICAgbGlua2VyIGZsYWdzIChzZWUgQ0ZMQUdTX1NITElCLCBMREZMQUdTX1NITElCIGFuZCBMREZMQUdTX1NITElCX0VYUE9SVAotICAgICAgICBiZWxvdykgbWFudWFsbHkgb3IgYXQgbGVhc3QgbWFrZSBzdXJlIGEgUGVybCA1IGludGVycHJldGVyIGlzCi0gICAgICAgIGluc3RhbGxlZCBmcm9tIHdoaWNoIEFwYWNoZSBjYW4gZ3Vlc3MgdGhlIG9wdGlvbnMuCi0KLSAgMy4gQ29uZmlndXJpbmcgdGhlIHNvdXJjZSB0cmVlCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgIFNldHVwOgotIAotICAgICBUaGUgZmlyc3Qgc3RlcCBpbiBjb21waWxpbmcgQXBhY2hlIDIuMCBpcyB0byBzZXR1cCB0aGUgc291cmNlIHRyZWUgc28KLSAgICAgdGhhdCBpdCBjYW4gYmUgYnVpbHQuICBUaGlzIGlzIGRvbmUgYnkgcnVubmluZzoKLSAKLSAgICAgLi9idWlsZGNvbmYKLQotICAgICBUaGlzIHNjcmlwdCBlbnN1cmVzIHRoYXQgYWxsIHJlcXVpcmVkIHByb2dyYW1zIGFyZSBpbnN0YWxsZWQgb24gdGhlCi0gICAgIGN1cnJlbnRseSBtYWNoaW5lLCBhbmQgY3JlYXRlcyB0aGUgLi9jb25maWd1cmUgc2NyaXB0LiAgSWYgeW91IGFyZQotICAgICB1c2luZyBhIHBhY2thZ2UgZG93bmxvYWRlZCBmcm9tIGFwYWNoZS5vcmcgdGhlbiB0aGlzIHN0ZXAgaXMgbm90IAotICAgICBuZWNlc3NhcnkuCi0KLSAgICAgSW50cm9kdWN0aW9uOgotCi0gICAgIFRoZSBuZXh0IHN0ZXAgaXMgdG8gY29uZmlndXJlIHRoZSBBcGFjaGUgc291cmNlIHRyZWUgZm9yIHlvdXIgcGFydGljdWxhcgotICAgICBwbGF0Zm9ybSBhbmQgcGVyc29uYWwgcmVxdWlyZW1lbnRzLiBUaGUgbW9zdCBpbXBvcnRhbnQgc2V0dXAgaGVyZSBpcyB0aGUKLSAgICAgbG9jYXRpb24gcHJlZml4IHdoZXJlIEFwYWNoZSBpcyB0byBiZSBpbnN0YWxsZWQgbGF0ZXIsIGJlY2F1c2UgQXBhY2hlIGhhcwotICAgICB0byBiZSBjb25maWd1cmVkIGZvciB0aGlzIGxvY2F0aW9uIHRvIHdvcmsgY29ycmVjdGx5LiBCdXQgdGhlcmUgYXJlIGEgbG90Ci0gICAgIG9mIG90aGVyIG9wdGlvbnMgYXZhaWxhYmxlIGZvciB5b3VyIHBsZWFzdXJlLgotCi0gICAgIEZvciBhIHNob3J0IGltcHJlc3Npb24gb2Ygd2hhdCBwb3NzaWJpbGl0aWVzIHlvdSBoYXZlLCBoZXJlIGlzIGEgdHlwaWNhbAotICAgICBleGFtcGxlIHdoaWNoIGNvbXBpbGVzIEFwYWNoZSBmb3IgdGhlIGluc3RhbGxhdGlvbiB0cmVlIC9zdy9wa2cvYXBhY2hlCi0gICAgIHdpdGggYSBwYXJ0aWN1bGFyIGNvbXBpbGVyIGFuZCBmbGFncyBwbHVzIHRoZSB0d28gYWRkaXRpb25hbCBtb2R1bGVzCi0gICAgIG1vZF9yZXdyaXRlIGFuZCBtb2Rfc3BlbGluZyBmb3IgbGF0ZXIgbG9hZGluZyB0aHJvdWdoIHRoZSBEU08gbWVjaGFuaXNtOiAKLQotICAgICAkIENDPSJwZ2NjIiBPUFRJTT0iLU8yIiBcCi0gICAgICAgLi9jb25maWd1cmUgLS1wcmVmaXg9L3N3L3BrZy9hcGFjaGUgXAotICAgICAgICAgICAgICAgICAgIC0tZW5hYmxlLXJld3JpdGU9c2hhcmVkIFwKLSAgICAgICAgICAgICAgICAgICAtLWVuYWJsZS1zcGVsaW5nPXNoYXJlZAotCi0gICAgIFRoZSBlYXNpZXN0IHdheSB0byBmaW5kIGFsbCBvZiB0aGUgY29uZmlndXJhdGlvbiBmbGFncyBmb3IgQXBhY2hlIDIuMAotICAgICBpcyB0byBydW4gLi9jb25maWd1cmUgLS1oZWxwLiAgV2hhdCBmb2xsb3dzIGlzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YKLSAgICAgbW9zdCBvZiB0aGUgYXJndW1lbnRzLgotCi0gICAgIFJlZmVyZW5jZToKLQotICAgICAkIFtDQz0uLi5dICAgICAgICBbQ0ZMQUdTX1NITElCPS4uLl0gICAgICAgICAgIFtUQVJHRVQ9Li4uXQotICAgICAgIFtPUFRJTT0uLi5dICAgICBbTERfU0hMSUI9Li4uXQotICAgICAgIFtDRkxBR1M9Li4uXSAgICBbTERGTEFHU19TSExJQj0uLi5dICAgICAgICAKLSAgICAgICBbSU5DTFVERVM9Li4uXSAgW0xERkxBR1NfU0hMSUJfRVhQT1JUPS4uLl0gCi0gICAgICAgW0xERkxBR1M9Li4uXSAgIFtSQU5MSUI9Li4uXSAgCi0gICAgICAgW0xJQlM9Li4uXSAgICAgIFtERVBTPS4uLl0KLSAgICAgICAuL2NvbmZpZ3VyZQotICAgICAgICAgICBbLS1xdWlldF0gICAgICAgICBbLS1wcmVmaXg9RElSXSAgICAgICAgICAgIFstLWVuYWJsZS1OQU1FPShzaGFyZWQpXQotICAgICAgICAgICBbLS12ZXJib3NlXSAgICAgICBbLS1leGVjLXByZWZpeD1QUkVGSVhdICAgIFstLWRpc2FibGUtTkFNRV0KLSAgICAgICAgICAgWy0tc2hhZG93Wz1ESVJdXSAgWy0tYmluZGlyPUVQUkVGSVhdICAgICAgICBbLS13aXRoLW1wbT1OQU1FXQotICAgICAgICAgICBbLS1zaG93LWxheW91dF0gICBbLS1zYmluZGlyPURJUl0gICAgICAgICAgIAotICAgICAgICAgICBbLS1oZWxwXSAgICAgICAgICBbLS1saWJleGVjZGlyPURJUl0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbLS1tYW5kaXI9RElSXSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbLS1zeXNjb25mZGlyPURJUl0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbLS1kYXRhZGlyPURJUl0gICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbLS1pbmNsdWRlZGlyPURJUl0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbLS1sb2NhbHN0YXRlZGlyPURJUl0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWy0tcnVudGltZWRpcj1ESVJdICAgICAgICBbLS1lbmFibGUtc3VleGVjXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbLS1sb2dmaWxlZGlyPURJUl0gICAgICAgIFstLXN1ZXhlYy1jYWxsZXI9VUlEXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbLS1wcm94eWNhY2hlZGlyPURJUl0gICAgIFstLXN1ZXhlYy1kb2Nyb290PURJUl0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWy0td2l0aC1sYXlvdXQ9W0ZJTEU6XUlEXSBbLS1zdWV4ZWMtbG9nZmlsZT1GSUxFXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFstLXN1ZXhlYy11c2VyZGlyPURJUl0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWy0td2l0aC1wZXJsPUZJTEVdICAgICAgICBbLS1zdWV4ZWMtdWlkbWluPVVJRF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWy0td2l0aG91dC1zdXBwb3J0XSAgICAgICBbLS1zdWV4ZWMtZ2lkbWluPUdJRF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWy0td2l0aG91dC1jb25mYWRqdXN0XSAgICBbLS1zdWV4ZWMtc2FmZXBhdGg9UEFUSF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWy0td2l0aG91dC1leGVjc3RyaXBdCi0JCQkgICAgIFstLXNlcnZlci11aWQ9VUlEXSAgICAgICAgWy0td2l0aC1tYWludGFpbnRlci1tb2RlXQotCQkJICAgICBbLS1zZXJ2ZXItZ2lkPUdJRF0KLQotICAgICBVc2UgdGhlIENDLCBPUFRJTSwgQ0ZMQUdTLCBJTkNMVURFUywgTERGTEFHUywgTElCUywgQ0ZMQUdTX1NITElCLAotICAgICBMRF9TSExJQiwgTERGTEFHU19TSExJQiwgTERGTEFHU19TSExJQl9FWFBPUlQsIFJBTkxJQiwgREVQUyBhbmQgVEFSR0VUCi0gICAgIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBvdmVycmlkZSB0aGUgY29ycmVzcG9uZGluZyBkZWZhdWx0IGVudHJpZXMgaW4KLSAgICAgdGhlIHNyYy9Db25maWd1cmF0aW9uLnRtcGwgZmlsZSAoc2VlIHRoZXJlIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0Ci0gICAgIHRoZWlyIHVzYWdlKS4KLQotICAgICBVc2UgdGhlIC0tcHJlZml4PVBSRUZJWCBhbmQgLS1leGVjLXByZWZpeD1FUFJFRklYIG9wdGlvbnMgdG8gY29uZmlndXJlCi0gICAgIEFwYWNoZSB0byB1c2UgYSBwYXJ0aWN1bGFyIGluc3RhbGxhdGlvbiBwcmVmaXguIFRoZSBkZWZhdWx0IGlzCi0gICAgIFBSRUZJWD0vdXNyL2xvY2FsL2FwYWNoZSBhbmQgRVBSRUZJWD1QUkVGSVguCi0KLSAgICAgVXNlIHRoZSAtLWJpbmRpcj1ESVIsIC0tc2JpbmRpcj1ESVIsIC0tbGliZXhlY2Rpcj1ESVIsIC0tbWFuZGlyPURJUiwKLSAgICAgLS1zeXNjb25mZGlyPURJUiwgLS1kYXRhZGlyPURJUiwgLS1pbmNsdWRlZGlyPURJUiwgLS1sb2NhbHN0YXRlZGlyPURJUiwKLSAgICAgLS1ydW50aW1lZGlyPURJUiwgLS1sb2dmaWxlZGlyPURJUiBhbmQgcHJveHljYWNoZWRpcj1ESVIgb3B0aW9uIHRvIGNoYW5nZQotICAgICB0aGUgcGF0aHMgZm9yIHBhcnRpY3VsYXIgc3ViZGlyZWN0b3JpZXMgb2YgdGhlIGluc3RhbGxhdGlvbiB0cmVlLgotICAgICBEZWZhdWx0cyBhcmUgYmluZGlyPUVQUkVGSVgvYmluLCBzYmluZGlyPUVQUkVGSVgvc2JpbiwKLSAgICAgbGliZXhlY2Rpcj1FUFJFRklYL2xpYmV4ZWMsIG1hbmRpcj1QUkVGSVgvbWFuLCBzeXNjb25mZGlyPVBSRUZJWC9ldGMsCi0gICAgIGRhdGFkaXI9UFJFRklYL3NoYXJlLCBpbmNsdWRlZGlyPVBSRUZJWC9pbmNsdWRlLAotICAgICBsb2NhbHN0YXRlZGlyPVBSRUZJWC92YXIsIHJ1bnRpbWVkaXI9UFJFRklYL3Zhci9ydW4sCi0gICAgIGxvZ2ZpbGVkaXI9UFJFRklYL3Zhci9sb2cgYW5kIHByb3h5Y2FjaGVkaXI9UFJFRklYL3Zhci9wcm94eS4KLQotICAgICAgICAgTm90ZTogVG8gcmVkdWNlIHRoZSBwb2xsdXRpb24gb2Ygc2hhcmVkIGluc3RhbGxhdGlvbiBsb2NhdGlvbnMKLSAgICAgICAgICAgICAgIChsaWtlIC91c3IvbG9jYWwvIG9yIC9ldGMpIHdpdGggQXBhY2hlIGZpbGVzIHRvIGEgbWluaW11bSB0aGUKLSAgICAgICAgICAgICAgIHN0cmluZyBgYC9hcGFjaGUnJyBpcyBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIHRvICdsaWJleGVjZGlyJywKLSAgICAgICAgICAgICAgICdzeXNjb25mZGlyJywgJ2RhdGFkaXInLCAnbG9jYWxzdGF0ZWRpcicgYW5kICdpbmNsdWRlZGlyJyBpZgotICAgICAgICAgICAgICAgKGFuZCBvbmx5IGlmKSB0aGUgZm9sbG93aW5nIHBvaW50cyBhcHBseSBmb3IgZWFjaCBwYXRoCi0gICAgICAgICAgICAgICBpbmRpdmlkdWFsbHk6Ci0KLSAgICAgICAgICAgICAgICAgICAxLiB0aGUgcGF0aCBkb2Vzbid0IGFscmVhZHkgY29udGFpbiB0aGUgd29yZCBgYGFwYWNoZScnCi0gICAgICAgICAgICAgICAgICAgMi4gdGhlIHBhdGggd2FzIG5vdCBkaXJlY3RseSBjdXN0b21pemVkIGJ5IHRoZSB1c2VyCi0KLSAgICAgICAgICAgICAgIEtlZXAgaW4gbWluZCB0aGF0IHBlciBkZWZhdWx0IHRoZXNlIHBhdGhzIGFyZSBkZXJpdmVkIGZyb20KLSAgICAgICAgICAgICAgICdwcmVmaXgnIGFuZCAnZXhlYy1wcmVmaXgnLCBzbyB1c3VhbGx5IGl0cyBvbmx5IGEgbWF0dGVyCi0gICAgICAgICAgICAgICB3aGV0aGVyIHRoZXNlIHBhdGhzIGNvbnRhaW4gYGBhcGFjaGUnJyBvciBub3QuIEFsdGhvdWdoIHRoZQotICAgICAgICAgICAgICAgZGVmYXVsdHMgd2VyZSBkZWZpbmVkIHdpdGggZXhwZXJpZW5jZSBpbiBtaW5kIHlvdSBhbHdheXMgc2hvdWxkCi0gICAgICAgICAgICAgICBtYWtlIHN1cmUgdGhlIHBhdGhzIGZpdCB5b3VyIHNpdHVhdGlvbiBieSBjaGVja2luZyB0aGUgZmluYWxseQotICAgICAgICAgICAgICAgY2hvc2VuIHBhdGhzIHZpYSB0aGUgLS1sYXlvdXQgb3B0aW9uLgotCi0gICAgIFVzZSB0aGUgLS13aXRoLWxheW91dD1bRjpdSUQgb3B0aW9uIHRvIHNlbGVjdCBhIHBhcnRpY3VsYXIgaW5zdGFsbGF0aW9uCi0gICAgIHBhdGggYmFzZS1sYXlvdXQuIFlvdSBhbHdheXMgX0hBVkVfIHRvIHNlbGVjdCBhIGJhc2UtbGF5b3V0LiBUaGVyZSBhcmUKLSAgICAgY3VycmVudGx5IHR3byBsYXlvdXRzIHByZS1kZWZpbmVkIGluIHRoZSBmaWxlIGNvbmZpZy5sYXlvdXQ6IGBBcGFjaGUnIGZvcgotICAgICB0aGUgY2xhc3NpY2FsIEFwYWNoZSBwYXRoIGxheW91dCBhbmQgYEdOVScgZm9yIGEgcGF0aCBsYXlvdXQgY29uZm9ybWluZwotICAgICB0byB0aGUgR05VIGBzdGFuZGFyZHMnIGRvY3VtZW50LiBXaGVuIHlvdSB3YW50IHRvIHVzZSB5b3VyIG93biBjdXN0b20KLSAgICAgbGF5b3V0IEZPTywgZWl0aGVyIGFkZCBhIGNvcnJlc3BvbmRpbmcgIjxMYXlvdXQgRk9PPi4uLjwvTGF5b3V0PiIgc2VjdGlvbgotICAgICB0byBjb25maWcubGF5b3V0IGFuZCB1c2UgLS13aXRoLWxheW91dD1GT08gb3IgcGxhY2UgaXQgaW50byB5b3VyIG93bgotICAgICBmaWxlLCBzYXkgY29uZmlnLm15cGF0aHMsIGFuZCB1c2UgLS13aXRoLWxheW91dD1jb25maWcubXlwYXRoczpGT08uCi0gCi0gICAgIFVzZSB0aGUgLS1zaG93LWxheW91dCBvcHRpb24gdG8gY2hlY2sgdGhlIGZpbmFsIGluc3RhbGxhdGlvbiBwYXRoIGxheW91dAotICAgICB3aGlsZSBmaWRkbGluZyB3aXRoIHRoZSBvcHRpb25zIGFib3ZlLgotIAotICAgICBVc2UgdGhlIC0tZW5hYmxlLXJ1bGU9TkFNRSBhbmQgLS1kaXNhYmxlLXJ1bGU9TkFNRSBvcHRpb25zIHRvIGVuYWJsZSBvcgotICAgICBkaXNhYmxlIGEgcGFydGljdWxhciBSdWxlIGZyb20gdGhlIEFwYWNoZSBzcmMvQ29uZmlndXJhdGlvbi50bXBsIGZpbGUuIFRoZQotICAgICBkZWZhdWx0cyAoeWVzPWVuYWJsZWQsIG5vPWRpc2FibGVkKSBjYW4gZWl0aGVyIGJlIHNlZW4gd2hlbiBydW5uaW5nCi0gICAgIGAuL2NvbmZpZ3VyZSAtLWhlbHAnIG9yIG1hbnVhbGx5IGxvb2tlZCB1cCBpbiB0aGUgc3JjL0NvbmZpZ3VyYXRpb24udG1wbAotICAgICBmaWxlLgotIAotICAgICBVc2UgdGhlIC0tZW5hYmxlLU5BTUU9KHNoYXJlZCkgYW5kIC0tZGlzYWJsZS1OQU1FIG9wdGlvbnMgdG8gZW5hYmxlCi0gICAgIG9yIGRpc2FibGUgYSBwYXJ0aWN1bGFyIGFscmVhZHkgZGlzdHJpYnV0ZWQgbW9kdWxlIGZyb20gdGhlIEFwYWNoZQotICAgICBwYWNrYWdlLgotCi0gICAgIFVzZSB0aGUgLS13aXRoLW1wbT1OQU1FIG9wdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggTVBNIHNob3VsZCBiZSBidWlsdAotICAgICBmb3IgeW91ciBzZXJ2ZXIuCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSAgICAgTElTVCBPRiBBVkFJTEFCTEUgTU9EVUxFUwotCi0gICAgIEVudmlyb25tZW50IGNyZWF0aW9uCi0gICAgICAoKykgbW9kX2VudiAuLi4uLi4uLi4uIFNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIENHSS9TU0kgc2NyaXB0cwotICAgICAgKCspIG1vZF9zZXRlbnZpZiAuLi4uLiBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJhc2VkIG9uIEhUVFAgaGVhZGVycwotICAgICAgKC0pIG1vZF91bmlxdWVfaWQgLi4uLiBHZW5lcmF0ZSB1bmlxdWUgaWRlbnRpZmllcnMgZm9yIHJlcXVlc3QKLSAgICAgQ29udGVudCB0eXBlIGRlY2lzaW9ucwotICAgICAgKCspIG1vZF9taW1lIC4uLi4uLi4uLiBDb250ZW50IHR5cGUvZW5jb2RpbmcgZGV0ZXJtaW5hdGlvbiAoY29uZmlndXJlZCkKLSAgICAgICgtKSBtb2RfbWltZV9tYWdpYyAuLi4gQ29udGVudCB0eXBlL2VuY29kaW5nIGRldGVybWluYXRpb24gKGF1dG9tYXRpYykKLSAgICAgICgrKSBtb2RfbmVnb3RpYXRpb24gLi4gQ29udGVudCBzZWxlY3Rpb24gYmFzZWQgb24gdGhlIEhUVFAgQWNjZXB0KiBoZWFkZXJzCi0gICAgIFVSTCBtYXBwaW5nCi0gICAgICAoKykgbW9kX2FsaWFzIC4uLi4uLi4uIFNpbXBsZSAgIFVSTCB0cmFuc2xhdGlvbiBhbmQgcmVkaXJlY3Rpb24KLSAgICAgICgtKSBtb2RfcmV3cml0ZSAuLi4uLi4gQWR2YW5jZWQgVVJMIHRyYW5zbGF0aW9uIGFuZCByZWRpcmVjdGlvbgotICAgICAgKCspIG1vZF91c2VyZGlyIC4uLi4uLiBTZWxlY3Rpb24gb2YgcmVzb3VyY2UgZGlyZWN0b3JpZXMgYnkgdXNlcm5hbWUKLSAgICAgICgtKSBtb2Rfc3BlbGluZyAuLi4uLi4gQ29ycmVjdGlvbiBvZiBtaXNzcGVsbGVkIFVSTHMKLSAgICAgRGlyZWN0b3J5IEhhbmRsaW5nCi0gICAgICAoKykgbW9kX2RpciAuLi4uLi4uLi4uIERpcmVjdG9yeSBhbmQgZGlyZWN0b3J5IGRlZmF1bHQgZmlsZSBoYW5kbGluZwotICAgICAgKCspIG1vZF9hdXRvaW5kZXggLi4uLiBBdXRvbWF0ZWQgZGlyZWN0b3J5IGluZGV4IGZpbGUgZ2VuZXJhdGlvbgotICAgICBBY2Nlc3MgQ29udHJvbAotICAgICAgKCspIG1vZF9hY2Nlc3MgLi4uLi4uLiBBY2Nlc3MgQ29udHJvbCAodXNlciwgaG9zdCwgbmV0d29yaykKLSAgICAgICgrKSBtb2RfYXV0aCAuLi4uLi4uLi4gSFRUUCBCYXNpYyBBdXRoZW50aWNhdGlvbiAodXNlciwgcGFzc3dkKQotICAgICAgKC0pIG1vZF9hdXRoX2RibSAuLi4uLiBIVFRQIEJhc2ljIEF1dGhlbnRpY2F0aW9uIHZpYSBVbml4IE5EQk0gZmlsZXMKLSAgICAgICgtKSBtb2RfYXV0aF9kYiAuLi4uLi4gSFRUUCBCYXNpYyBBdXRoZW50aWNhdGlvbiB2aWEgQmVya2VsZXktREIgZmlsZXMKLSAgICAgICgtKSBtb2RfYXV0aF9hbm9uIC4uLi4gSFRUUCBCYXNpYyBBdXRoZW50aWNhdGlvbiBmb3IgQW5vbnltb3VzLXN0eWxlIHVzZXJzCi0gICAgICAoLSkgbW9kX2RpZ2VzdCAuLi4uLi4uIEhUVFAgRGlnZXN0IEF1dGhlbnRpY2F0aW9uCi0gICAgIEhUVFAgcmVzcG9uc2UKLSAgICAgICgtKSBtb2RfaGVhZGVycyAuLi4uLi4gQXJiaXRyYXJ5IEhUVFAgcmVzcG9uc2UgaGVhZGVycyAoY29uZmlndXJlZCkKLSAgICAgICgtKSBtb2RfY2Vybl9tZXRhIC4uLi4gQXJiaXRyYXJ5IEhUVFAgcmVzcG9uc2UgaGVhZGVycyAoQ0VSTi1zdHlsZSBmaWxlcykKLSAgICAgICgtKSBtb2RfZXhwaXJlcyAuLi4uLi4gRXhwaXJlcyBIVFRQIHJlc3BvbnNlcyAKLSAgICAgICgrKSBtb2RfYXNpcyAuLi4uLi4uLi4gUmF3IEhUVFAgcmVzcG9uc2VzIAotICAgICBTY3JpcHRpbmcKLSAgICAgICgrKSBtb2RfaW5jbHVkZSAuLi4uLi4gU2VydmVyIFNpZGUgSW5jbHVkZXMgKFNTSSkgc3VwcG9ydAotICAgICAgKCspIG1vZF9jZ2kgLi4uLi4uLi4uLiBDb21tb24gR2F0ZXdheSBJbnRlcmZhY2UgKENHSSkgc3VwcG9ydAotICAgICAgKCspIG1vZF9jZ2lkIC4uLi4uLi4uLiBDb21tb24gR2F0ZXdheSBJbnRlcmZhY2UgKENHSSkgc3VwcG9ydCBmb3IgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpLXRocmVhZGVkIE1QTXMKLSAgICAgICgrKSBtb2RfYWN0aW9ucyAuLi4uLi4gTWFwIENHSSBzY3JpcHRzIHRvIGFjdCBhcyBpbnRlcm5hbCBgaGFuZGxlcnMnCi0gICAgIEludGVybmFsIENvbnRlbnQgSGFuZGxlcnMKLSAgICAgICgrKSBtb2Rfc3RhdHVzIC4uLi4uLi4gQ29udGVudCBoYW5kbGVyIGZvciBzZXJ2ZXIgcnVuLXRpbWUgc3RhdHVzCi0gICAgICAoLSkgbW9kX2luZm8gLi4uLi4uLi4uIENvbnRlbnQgaGFuZGxlciBmb3Igc2VydmVyIGNvbmZpZ3VyYXRpb24gc3VtbWFyeQotICAgICBSZXF1ZXN0IExvZ2dpbmcKLSAgICAgICgrKSBtb2RfbG9nX2NvbmZpZyAuLi4gQ3VzdG9taXphYmxlIGxvZ2dpbmcgb2YgcmVxdWVzdHMKLSAgICAgICgtKSBtb2RfbG9nX2FnZW50IC4uLi4gU3BlY2lhbGl6ZWQgSFRUUCBVc2VyLUFnZW50IGxvZ2dpbmcgKGRlcHJlY2F0ZWQpCi0gICAgICAoLSkgbW9kX2xvZ19yZWZlcmVyIC4uIFNwZWNpYWxpemVkIEhUVFAgUmVmZXJyZXIgbG9nZ2luZyAgIChkZXByZWNhdGVkKQotICAgICAgKC0pIG1vZF91c2VydHJhY2sgLi4uLiBMb2dnaW5nIG9mIHVzZXIgY2xpY2stdHJhaWxzIHZpYSBIVFRQIENvb2tpZXMKLSAgICAgTWlzY2VsbGFuZW91cwotICAgICAgKCspIG1vZF9pbWFwIC4uLi4uLi4uLiBTZXJ2ZXItc2lkZSBJbWFnZSBNYXAgc3VwcG9ydAotICAgICAgKC0pIG1vZF9wcm94eSAuLi4uLi4uLiBDYWNoaW5nIFByb3h5IE1vZHVsZSAoSFRUUCwgSFRUUFMsIEZUUCkKLSAgICAgICgtKSBtb2Rfc28gLi4uLi4uLi4uLi4gRHluYW1pYyBTaGFyZWQgT2JqZWN0IChEU08pIGJvb3RzdHJhcHBpbmcKLSAgICAgRXhwZXJpbWVudGFsCi0gICAgICAoLSkgbW9kX21tYXBfc3RhdGljIC4uIENhY2hpbmcgb2YgZnJlcXVlbnRseSBzZXJ2ZWQgcGFnZXMgdmlhIG1tYXAoKQotICAgICBEZXZlbG9wbWVudAotICAgICAgKC0pIG1vZF9leGFtcGxlIC4uLi4uLiBBcGFjaGUgQVBJIGRlbW9uc3RyYXRpb24gKGRldmVsb3BlcnMgb25seSkKLQotICAgICBNUE1zCi0gICAgICAgICAgbXBtdF9wdGhyZWFkIC4uLi4uIE11dGxpLXByb2Nlc3MoZHluYW1pYykgTXVsdGktdGhyZWFkZWQoc3RhdGljKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5peCBNUE0KLSAgICAgICAgICBwcmVmb3JrIC4uLi4uLi4uLi4gUHJlZm9ya2luZyBVbml4IE1QTQotICAgICAgICAgIGRleHRlciAuLi4uLi4uLi4uLiBNdWx0aS1wcm9jZXNzKHN0YXRpYykgTXVsdGktdGhyZWFkZWQoZHluYW1pYykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5peCBNUE0KLSAgICAgICAgICBwZXJjaGlsZCAuLi4uLi4uLi4gTXVsdGktcHJvY2VzcyhzdGF0aWMpIE11bHRpLXRocmVhZGVkKGR5bmFtaWMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaXggTVBNLCB0aGF0IGFsbG93cyBhIFVzZXIgcGVyIGNoaWxkIHByb2Nlc3MKLQotICAgICAgICAgIHdpbm50IC4uLi4uLi4uLi4uLiBNdWx0aS1wcm9jZXNzKDEpIE11bHRpLXRocmVhZGVkIFdpbmRvd3MgTVBNCi0KLSAgICAgICAgICBtcG10X2Jlb3MgLi4uLi4uLi4gTXVsdGktcHJvY2VzcyBNdWx0aS10aHJlYWRlZCBCZW9zIE1QTQotICAgICAgICAgIGJlb3MgLi4uLi4uLi4uLi4uLiBNdWx0aS1wcm9jZXNzIE11bHRpLXRocmVhZGVkIEJlb3MgTVBNCi0KLSAgICAgICAgICBzcG10X29zMiAuLi4uLi4uLi4gU2luZ2xlLXByb2Nlc3MgTXVsdGktdGhyZWFkZWQgT1MvMiBNUE0KLSAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotICAgICAgICAgICAgICAgICAgICAoKykgPSBlbmFibGVkICBwZXIgZGVmYXVsdCBbZGlzYWJsZSB3aXRoIC0tZGlzYWJsZS1tb2R1bGVdCi0gICAgICAgICAgICAgICAgICAgICgtKSA9IGRpc2FibGVkIHBlciBkZWZhdWx0IFtlbmFibGUgIHdpdGggLS1lbmFibGUtbW9kdWxlIF0KLQotICAgICBVc2UgdGhlIC0tZW5hYmxlLXN1ZXhlYyBvcHRpb24gdG8gZW5hYmxlIHRoZSBzdUVYRUMgZmVhdHVyZSBieSBidWlsZGluZwotICAgICBhbmQgaW5zdGFsbGluZyB0aGUgInN1ZXhlYyIgc3VwcG9ydCBwcm9ncmFtLiBVc2UgLS1zdWV4ZWMtY2FsbGVyPVVJRCB0bwotICAgICBzZXQgdGhlIGFsbG93ZWQgY2FsbGVyIHVzZXIgaWQsIC0tc3VleGVjLXVzZXJkaXI9RElSIHRvIHNldCB0aGUgdXNlcgotICAgICBzdWJkaXJlY3RvcnksIC0tc3VleGVjLWRvY3Jvb3Q9RElSIHRvIHNldCB0aGUgc3VleGVjIHJvb3QgZGlyZWN0b3J5LAotICAgICAtLXN1ZXhlYy11aWRtaW49VUlELy0tc3VleGVjLWdpZG1pbj1HSUQgdG8gc2V0IHRoZSBtaW5pbWFsIGFsbG93ZWQKLSAgICAgVUlEL0dJRCwgLS1zdWV4ZWMtbG9nZmlsZT1GSUxFIHRvIHNldCB0aGUgbG9nZmlsZSBhbmQKLSAgICAgLS1zdWV4ZWMtc2FmZXBhdGg9UEFUSCB0byBzZXQgdGhlIHNhZmUgc2hlbGwgUEFUSCBmb3IgdGhlIHN1RVhFQwotICAgICBmZWF0dXJlLiBBdCBsZWFzdCBvbmUgLS1zdWV4ZWMteHh4eHggb3B0aW9uIGhhcyB0byBiZSBwcm92aWRlZCB0b2dldGhlcgotICAgICB3aXRoIHRoZSAtLWVuYWJsZS1zdWV4ZWMgb3B0aW9uIHRvIGxldCBBUEFDSSBhY2NlcHQgeW91ciByZXF1ZXN0IGZvcgotICAgICB1c2luZyB0aGUgc3VFWEVDIGZlYXR1cmUuCi0KLSAgICAgQ0FVVElPTjogRk9SIERFVEFJTFMgQUJPVVQgVEhFIFNVRVhFQyBGRUFUVVJFIFdFIEhJR0hMWSBSRUNPTU1FTkQgWU9VIFRPCi0gICAgICAgICAgICAgIEZJUlNUIFJFQUQgVEhFIERPQ1VNRU5UIGh0ZG9jcy9tYW51YWwvc3VleGVjLmh0bWwgQkVGT1JFIFVTSU5HCi0gICAgICAgICAgICAgIFRIRSBBQk9WRSBPUFRJT05TLgotICAgICAKLSAgICAgICAgICAgICAgVVNJTkcgVEhFIFNVRVhFQyBGRUFUVVJFIFBST1BFUkxZIENBTiBSRURVQ0UgQ09OU0lERVJBQkxZIFRIRQotICAgICAgICAgICAgICBTRUNVUklUWSBSSVNLUyBJTlZPTFZFRCBXSVRIIEFMTE9XSU5HIFVTRVJTIFRPIERFVkVMT1AgQU5EIFJVTgotICAgICAgICAgICAgICBQUklWQVRFIENHSSBPUiBTU0kgUFJPR1JBTVMuIEhPV0VWRVIsIElGIFNVRVhFQyBJUyBJTVBST1BFUkxZCi0gICAgICAgICAgICAgIENPTkZJR1VSRUQsIElUIENBTiBDQVVTRSBBTlkgTlVNQkVSIE9GIFBST0JMRU1TIEFORCBQT1NTSUJMWQotICAgICAgICAgICAgICBDUkVBVEUgTkVXIEhPTEVTIElOIFlPVVIgQ09NUFVURVInUyBTRUNVUklUWS4gIElGIFlPVSBBUkVOJ1QKLSAgICAgICAgICAgICAgRkFNSUxJQVIgV0lUSCBNQU5BR0lORyBTRVRVSUQgUk9PVCBQUk9HUkFNUyBBTkQgVEhFIFNFQ1VSSVRZCi0gICAgICAgICAgICAgIElTU1VFUyBUSEVZIFBSRVNFTlQsIFdFIEhJR0hMWSBSRUNPTU1FTkQgVEhBVCBZT1UgTk9UIENPTlNJREVSCi0gICAgICAgICAgICAgIFVTSU5HIFNVRVhFQyBBTkQgS0VFUCBBV0FZIEZST00gVEhFU0UgT1BUSU9OUyEKLQotICAgICBVc2UgdGhlIC0tc2hhZG93IG9wdGlvbiB0byBsZXQgQVBBQ0kgY3JlYXRlIGEgc2hhZG93IHNvdXJjZSB0cmVlIG9mIHRoZQotICAgICBzb3VyY2VzIGZvciBidWlsZGluZy4gVGhpcyBpcyB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBidWlsZCBmb3IgZGlmZmVyZW50Ci0gICAgIHBsYXRmb3JtcyBpbiBwYXJhbGxlbCAodXN1YWxseSB0aHJvdWdoIGEgTkZTLCBBRlMgb3IgREZTIG1vdW50ZWQKLSAgICAgZmlsZXN5c3RlbSkuICBZb3UgbWF5IHNwZWNpZnkgYSBkaXJlY3RvcnkgdG8gdGhlIC0tc2hhZG93IG9wdGlvbiBpbnRvCi0gICAgIHdoaWNoIHRoZSBzaGFkb3cgdHJlZSB3aWxsIGJlIGNyZWF0ZWQuCi0gCi0gICAgIFVzZSB0aGUgLS1xdWlldCBvcHRpb24gdG8gZGlzYWJsZSBhbGwgY29uZmlndXJhdGlvbiB2ZXJib3NlIG1lc3NhZ2VzLgotIAotICAgICBVc2UgdGhlIC0tdmVyYm9zZSBvcHRpb24gdG8gZW5hYmxlIGFkZGl0aW9uYWwgdmVyYm9zZSBtZXNzYWdlcy4KLSAgICAgCi0gICAgIFVzZSB0aGUgLS1zZXJ2ZXItdWlkIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSB1c2VyIElEIHlvdSB3YW50IHRoZSBzZXJ2ZXIgdG8gcnVuCi0gICAgIGFzLiBJZiBub3Qgc3BlY2lmaWVkIHRoZSBzZXJ2ZXIgd2lsbCBydW4gYXMgdXNlciBub2JvZHkuICBJZiB0aGUgdXNlciBJRAotICAgICBzcGVjaWZpZWQgaXMgZGlmZmVyZW50IHRoYW4gdGhlIElEIG9mIHRoZSB1c2VyIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIsIHlvdSBuZWVkIHRvCi0gICAgIHN0YXJ0IHRoZSBzZXJ2ZXIgYXMgcm9vdC4KLQotICAgICBVc2UgdGhlIC0tc2VydmVyLWdpZCBvcHRpb24gdG8gc3BlY2lmeSB0aGUgZ3JvdXAgSUQgeW91IHdhbnQgdGhlIHNlcnZlciB1c2VyIElEIHRvCi0gICAgIGJlIGEgbWVtYmVyIG9mLiAgSWYgbm90IHNwZWNpZmllZCwgdGhlIGdyb3VwIElEIHdpbGwgYmUgIy0xLgotCi0gIDQuIEJ1aWxkaW5nIHRoZSBwYWNrYWdlCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIAotICAgICBOb3cgeW91IGNhbiBidWlsZCB0aGUgdmFyaW91cyBwYXJ0cyB3aGljaCBmb3JtIHRoZSBBcGFjaGUgcGFja2FnZSBieQotICAgICBzaW1wbHkgcnVubmluZyB0aGUgY29tbWFuZAotIAotICAgICAgICAkIG1ha2UgCi0gCi0gICAgIFBsZWFzZSBiZSBwYXRpZW50IGhlcmUsIHRoaXMgdGFrZXMgYXBwcm94aW1hdGVseSAyIG1pbnV0ZXMgdG8gY29tcGxldGUKLSAgICAgdW5kZXIgYSBQZW50aXVtLTE2Ni9GcmVlQlNELTIuMiBzeXN0ZW0sIGRlcGVuZGVuZCBvbiB0aGUgYW1vdW50IG9mCi0gICAgIG1vZHVsZXMgeW91IGhhdmUgZW5hYmxlZC4gCi0gCi0gIDUuIEluc3RhbGxpbmcgdGhlIHBhY2thZ2UKLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAKLSAgICAgTm93IGl0cyB0aW1lIHRvIGluc3RhbGwgdGhlIHBhY2thZ2UgdW5kZXIgdGhlIGNvbmZpZ3VyZWQgaW5zdGFsbGF0aW9uCi0gICAgIFBSRUZJWCAoc2VlIC0tcHJlZml4IG9wdGlvbiBhYm92ZSkgYnkgcnVubmluZzoKLSAKLSAgICAgICAgJCBtYWtlIGluc3RhbGwKLSAKLSAgICAgRm9yIHRoZSBwYXJhbm9pZCBoYWNrZXJzIHVuZGVyIHVzOiBUaGUgYWJvdmUgY29tbWFuZCByZWFsbHkgaW5zdGFsbHMgdW5kZXIKLSAgICAgcHJlZml4IF9vbmx5XywgaS5lLiBubyBvdGhlciBzdHVmZiBmcm9tIHlvdXIgc3lzdGVtIGlzIHRvdWNoZWQuIEV2ZW4gaWYKLSAgICAgeW91IHVwZ3JhZGUgYW4gZXhpc3RpbmcgaW5zdGFsbGF0aW9uIHlvdXIgY29uZmlndXJhdGlvbiBmaWxlcyBpbgotICAgICBQUkVGSVgvZXRjLyBhcmUgcHJlc2VydmVkLgotCi0gIDYuIFRlc3RpbmcgdGhlIHBhY2thZ2UKLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLQotIAotICAgICBOb3cgeW91IGNhbiBmaXJlIHVwIHlvdXIgQXBhY2hlIEhUVFAgc2VydmVyIGJ5IGltbWVkaWF0ZWx5IHJ1bm5pbmcKLSAKLSAgICAgICAgJCBQUkVGSVgvYmluL2FwYWNoZWN0bCBzdGFydAotIAotICAgICBhbmQgdGhlbiB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gcmVxdWVzdCB5b3VyIGZpcnN0IGRvY3VtZW50IHZpYSBVUkwKLSAgICAgaHR0cDovL2xvY2FsaG9zdC8gKHdoZW4geW91IGJ1aWx0IGFuZCBpbnN0YWxsZWQgQXBhY2hlIGFzIHJvb3Qgb3IgYXQKLSAgICAgbGVhc3QgdXNlZCB0aGUgLS13aXRob3V0LWNvbmZhZGp1c3Qgb3B0aW9uKSBvciBodHRwOi8vbG9jYWxob3N0OjgwODAvCi0gICAgICh3aGVuIHlvdSBidWlsdCBhbmQgaW5zdGFsbGVkIEFwYWNoZSBhcyBhIHJlZ3VsYXIgdXNlcikuIFRoZW4gc3RvcCB0aGUKLSAgICAgc2VydmVyIGFnYWluIGJ5IHJ1bm5pbmc6IAotCi0gICAgICAgICQgUFJFRklYL2Jpbi9hcGFjaGVjdGwgc3RvcAotIAotICA3LiBDdXN0b21pemluZyB0aGUgcGFja2FnZQotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIAotICAgICBGaW5hbGx5IHlvdSBjYW4gY3VzdG9taXplIHlvdXIgQXBhY2hlIEhUVFAgc2VydmVyIGJ5IGVkaXRpbmcgdGhlCi0gICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMgdW5kZXIgUFJFRklYL2V0Yy8uCi0gCi0gICAgICAgICQgdmkgUFJFRklYL2V0Yy9odHRwZC5jb25mCi0gICAgICAgICQgdmkgUFJFRklYL2V0Yy9hY2Nlc3MuY29uZgotICAgICAgICAkIHZpIFBSRUZJWC9ldGMvc3JtLmNvbmYKLSAKLSAgICAgSGF2ZSBhIGxvb2sgYXQgdGhlIEFwYWNoZSBtYW51YWwgdW5kZXIgaHRkb2NzL21hbnVhbC8gb3IKLSAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvIGZvciBhIGNvbXBsZXRlIHJlZmVyZW5jZSBvZiBhdmFpbGFibGUKLSAgICAgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzLgotCi0gIDguIFByZXBhcmluZyB0aGUgc3lzdGVtCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgUHJvcGVyIG9wZXJhdGlvbiBvZiBhIHB1YmxpYyBIVFRQIHNlcnZlciByZXF1aXJlcyBhdCBsZWFzdCB0aGUgZm9sbG93aW5nOgotCi0gICAgIDEuIEEgY29ycmVjdGx5IHdvcmtpbmcgVENQL0lQIGxheWVyLCBzaW5jZSBIVFRQIGlzIGltcGxlbWVudGVkIG9uIHRvcCBvZgotICAgICAgICBUQ1AvSVAuIEFsdGhvdWdoIG1vZGVybiBVbml4IHBsYXRmb3JtcyBoYXZlIGdvb2QgbmV0d29ya2luZyBsYXllcnMsCi0gICAgICAgIGFsd2F5cyBtYWtlIHN1cmUgeW91IGhhdmUgYWxsIG9mZmljaWFsIHZlbmRvciBwYXRjaGVzIHJlZmVycmluZyB0byB0aGUKLSAgICAgICAgbmV0d29yayBsYXllciBhcHBsaWVkLgotCi0gICAgIDIuIEFjY3VyYXRlIHRpbWUga2VlcGluZywgc2luY2UgZWxlbWVudHMgb2YgdGhlIEhUVFAgcHJvdG9jb2wgYXJlCi0gICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgdGltZSBvZiBkYXkuICBTbywgaXQncyB0aW1lIHRvIGludmVzdGlnYXRlIHNldHRpbmcKLSAgICAgICAgc29tZSB0aW1lIHN5bmNocm9uaXphdGlvbiBmYWNpbGl0eSBvbiB5b3VyIHN5c3RlbS4gVXN1YWxseSB0aGUgbnRwZGF0ZQotICAgICAgICBvciB4bnRwZCBwcm9ncmFtcyBhcmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUKLSAgICAgICAgTmV0d29yayBUaW1lIFByb3RvY29sIChOVFApLiBTZWUgdGhlIFVzZW5ldCBuZXdzZ3JvdXAKLSAgICAgICAgY29tcC5wcm90b2NvbHMudGltZS5udHAgYW5kIHRoZSBOVFAgaG9tZXBhZ2UgYXQKLSAgICAgICAgaHR0cDovL3d3dy5lZWNpcy51ZGVsLmVkdS9+bnRwLyBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IE5UUCBzb2Z0d2FyZQotICAgICAgICBhbmQgcHVibGljIHRpbWUgc2VydmVycy4KLQotICA5LiBDb250YWN0cwotICAgICAtLS0tLS0tLQotCi0gICAgIG8gSWYgeW91IHdhbnQgdG8gYmUgaW5mb3JtZWQgYWJvdXQgbmV3IGNvZGUgcmVsZWFzZXMsIGJ1ZyBmaXhlcywgCi0gICAgICAgc2VjdXJpdHkgZml4ZXMsIGdlbmVyYWwgbmV3cyBhbmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEFwYWNoZSBzZXJ2ZXIKLSAgICAgICBzdWJzY3JpYmUgdG8gdGhlIGFwYWNoZS1hbm5vdW5jZSBtYWlsaW5nIGxpc3QgYXMgZGVzY3JpYmVkIHVuZGVyCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2Fubm91bmNlbGlzdC5odG1sCi0KLSAgICAgbyBJZiB5b3Ugd2FudCBmcmVlbHkgYXZhaWxhYmxlIHN1cHBvcnQgZm9yIHJ1bm5pbmcgQXBhY2hlIHBsZWFzZSBqb2luIHRoZQotICAgICAgIEFwYWNoZSB1c2VyIGNvbW11bml0eSBieSBzdWJzY3JpYmluZyBhdCBsZWFzdCB0byB0aGUgZm9sbG93aW5nIFVTRU5FVAotICAgICAgIG5ld3Nncm91cDoKLSAgICAgICBjb21wLmluZm9zeXN0ZW1zLnd3dy5zZXJ2ZXJzLnVuaXgKLQotICAgICBvIElmIHlvdSB3YW50IGNvbW1lcmNpYWwgc3VwcG9ydCBmb3IgcnVubmluZyBBcGFjaGUgcGxlYXNlIGNvbnRhY3QKLSAgICAgICBvbmUgb2YgdGhlIGNvbXBhbmllcyBhbmQgY29udHJhY3RvcnMgd2hpY2ggYXJlIGxpc3RlZCBhdAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9pbmZvL3N1cHBvcnQuY2dpCi0KLSAgICAgbyBJZiB5b3UgaGF2ZSBhIGNvbmNyZXRlIGJ1ZyByZXBvcnQgZm9yIEFwYWNoZSBwbGVhc2UgZ28gdG8gdGhlCi0gICAgICAgQXBhY2hlIEdyb3VwIEJ1ZyBEYXRhYmFzZSBhbmQgc3VibWl0IHlvdXIgcmVwb3J0OgotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9idWdfcmVwb3J0Lmh0bWwKLQotICAgICBvIElmIHlvdSB3YW50IHRvIHBhcnRpY2lwYXRlIGluIGFjdGl2ZWx5IGRldmVsb3BpbmcgQXBhY2hlIHBsZWFzZQotICAgICAgIHN1YnNjcmliZSB0byB0aGUgYG5ldy1odHRwZCcgbWFpbGluZyBsaXN0IGFzIGRlc2NyaWJlZCBhdAotICAgICAgIGh0dHA6Ly9kZXYuYXBhY2hlLm9yZy9tYWlsaW5nLWxpc3RzCi0KLSAgICAgVGhhbmtzIGZvciBydW5uaW5nIEFwYWNoZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBBcGFjaGUgR3JvdXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8KLQpkaWZmIC0tZ2l0IGEvSW5zdGFsbEJpbi5kc3AgYi9JbnN0YWxsQmluLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I1YjdjNi4uMDAwMDAwMAotLS0gYS9JbnN0YWxsQmluLmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iSW5zdGFsbEJpbiIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNS4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBFeHRlcm5hbCBUYXJnZXQiIDB4MDEwNgotCi1DRkc9SW5zdGFsbEJpbiAtIFdpbjMyIERlYnVnCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIkluc3RhbGxCaW4ubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJJbnN0YWxsQmluLm1hayIgQ0ZHPSJJbnN0YWxsQmluIC0gV2luMzIgRGVidWciCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAiSW5zdGFsbEJpbiAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRXh0ZXJuYWwgVGFyZ2V0IikKLSFNRVNTQUdFICJJbnN0YWxsQmluIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRXh0ZXJuYWwgVGFyZ2V0IikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIkluc3RhbGxCaW4gLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgQ21kX0xpbmUgIk5NQUtFIC9mIEluc3RhbGxCaW4ubWFrIgotIyBQUk9QIEJBU0UgUmVidWlsZF9PcHQgIi9hIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0ZpbGUgIkluc3RhbGxCaW4uZXhlIgotIyBQUk9QIEJBU0UgQnNjX05hbWUgIkluc3RhbGxCaW4uYnNjIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBDbWRfTGluZSAiTk1BS0UgL2YgbWFrZWZpbGUud2luIElOU1RESVI9Li4gU0hPUlQ9RCBMT05HPURlYnVnIF9pbnN0YWxsIgotIyBQUk9QIFJlYnVpbGRfT3B0ICIiCi0jIFBST1AgVGFyZ2V0X0ZpbGUgIi4uXEFwYWNoZS5leGUiCi0jIFBST1AgQnNjX05hbWUgIiIKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJJbnN0YWxsQmluIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIENtZF9MaW5lICJOTUFLRSAvZiBJbnN0YWxsQmluLm1hayIKLSMgUFJPUCBCQVNFIFJlYnVpbGRfT3B0ICIvYSIKLSMgUFJPUCBCQVNFIFRhcmdldF9GaWxlICJJbnN0YWxsQmluLmV4ZSIKLSMgUFJPUCBCQVNFIEJzY19OYW1lICJJbnN0YWxsQmluLmJzYyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBDbWRfTGluZSAiTk1BS0UgL2YgbWFrZWZpbGUud2luIElOU1RESVI9Li4gU0hPUlQ9RCBMT05HPURlYnVnIF9pbnN0YWxsIgotIyBQUk9QIFJlYnVpbGRfT3B0ICIiCi0jIFBST1AgVGFyZ2V0X0ZpbGUgIi4uXEFwYWNoZS5leGUiCi0jIFBST1AgQnNjX05hbWUgIi5cYXBhY2hlLmJzYyIKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJJbnN0YWxsQmluIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAiSW5zdGFsbEJpbiAtIFdpbjMyIERlYnVnIgotCi0hSUYgICIkKENGRykiID09ICJJbnN0YWxsQmluIC0gV2luMzIgUmVsZWFzZSIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkluc3RhbGxCaW4gLSBXaW4zMiBEZWJ1ZyIKLQotIUVORElGIAotCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlxsb2dzXGFjY2Vzcy5sb2cKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlxsb2dzXGVycm9yLmxvZwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXGNvbmZcaHR0cGQuY29uZgotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cTWFrZWZpbGUud2luCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9MSUNFTlNFIGIvTElDRU5TRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFjNjUzOC4uMDAwMDAwMAotLS0gYS9MSUNFTlNFCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0KLQpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuaW4gYi9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg5MmMwOC4uMDAwMDAwMAotLS0gYS9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLQotREVQVEggICAgID0gLgotdG9wc3JjZGlyID0gQHRvcHNyY2RpckAKLXNyY2RpciAgICA9IEBzcmNkaXJACi1WUEFUSCAgICAgPSBAc3JjZGlyQAotCi1TVUJESVJTID0gYXAgbGliIG1haW4gbW9kdWxlcyBvcyAkKFJFR0VYX0RJUikKLQotUFJPR1JBTV9OQU1FICAgICAgICAgPSBhcGFjaGUKLVBST0dSQU1fU09VUkNFUyAgICAgID0gbW9kdWxlcy5jIGJ1aWxkbWFyay5jCi1QUk9HUkFNX0xEQUREICAgICAgICA9ICQoRVhUUkFfTERGTEFHUykgJChQUk9HUkFNX0RFUEVOREVOQ0lFUykgJChFWFRSQV9MSUJTKQotUFJPR1JBTV9ERVBFTkRFTkNJRVMgPSBcCi0gICQoQlVJTFRJTl9MSUJTKSBcCi0gICQoTVBNX0xJQikgXAotICBtYWluL2xpYm1haW4ubGEgXAotICAkKE9TX0RJUikvbGlib3MubGEgXAotICBhcC9saWJhcC5sYSBcCi0gIGxpYi9hcHIvbGliYXByLmEgXAotICAkKFJFR0VYX0xJQikKLQotUFJPR1JBTVMgICAgICAgID0gJChQUk9HUkFNX05BTUUpCi10YXJnZXRzICAgICAgICAgPSAkKFBST0dSQU1TKQotcGhvbnlfdGFyZ2V0cyAgID0gYnVpbGRtYXJrLmMKLWluc3RhbGxfdGFyZ2V0cyA9IGluc3RhbGwtY29uZiBpbnN0YWxsLWh0ZG9jcyBpbnN0YWxsLWljb25zIGluc3RhbGwtb3RoZXIgXAotCWluc3RhbGwtY2dpIGluc3RhbGwtaW5jbHVkZQotCi1pbmNsdWRlICQodG9wc3JjZGlyKS9idWlsZC9ydWxlcy5tawotaW5jbHVkZSAkKHRvcHNyY2RpcikvYnVpbGQvcHJvZ3JhbS5tawotCi1pbnN0YWxsLWNvbmY6Ci0JQGVjaG8gSW5zdGFsbGluZyBjb25maWd1cmF0aW9uIGZpbGVzCi0JQHRlc3QgLWQgJChzeXNjb25mZGlyKSB8fCAkKG1raW5zdGFsbGRpcnMpICQoc3lzY29uZmRpcikKLQlAY2QgJChzcmNkaXIpLy4uL2NvbmY7IFwKLQlmb3IgaSBpbiBtaW1lLnR5cGVzIG1hZ2ljOyBkbyBcCi0JCSQoSU5TVEFMTF9EQVRBKSAkJGkgJChzeXNjb25mZGlyKTsgXAotCWRvbmU7IFwKLQlmb3IgaSBpbiAqLWRpc3Q7IGRvIFwKLQkJc2VkIC1lICdzI0BAU2VydmVyUm9vdEBAIyQocHJlZml4KSNnJyBcCi0JCQk8ICQkaSA+ICQoc3lzY29uZmRpcikvJCRpOyBcCi0JCWNobW9kIDA2NDQgJChzeXNjb25mZGlyKS8kJGk7IFwKLQkJZmlsZT1gZWNobyAkJGl8c2VkIHMvLWRpc3QvL2A7IFwKLQkJaWYgdGVzdCAiJCRmaWxlIiAhPSAiJCRpIiAmJiB0ZXN0ICEgLWYgJChzeXNjb25mZGlyKS8kJGZpbGU7IHRoZW4gXAotCQkJJChJTlNUQUxMX0RBVEEpICQoc3lzY29uZmRpcikvJCRpICQoc3lzY29uZmRpcikvJCRmaWxlOyBcCi0JCWZpOyBcCi0JZG9uZQotCi1pbnN0YWxsLWh0ZG9jczoKLQlAZWNobyBJbnN0YWxsaW5nIEhUTUwgZG9jdW1lbnRzCi0JQHRlc3QgLWQgJChodGRvY3NkaXIpIHx8ICQobWtpbnN0YWxsZGlycykgJChodGRvY3NkaXIpCi0JQGNwIC1ycCAkKHNyY2RpcikvLi4vaHRkb2NzLyogJChodGRvY3NkaXIpCi0KLWluc3RhbGwtaWNvbnM6Ci0JQGVjaG8gSW5zdGFsbGluZyBpY29ucwotCUB0ZXN0IC1kICQoaWNvbnNkaXIpIHx8ICQobWtpbnN0YWxsZGlycykgJChpY29uc2RpcikKLQlAY3AgLXJwICQoc3JjZGlyKS8uLi9pY29ucy8qICQoaWNvbnNkaXIpCi0KLWluc3RhbGwtY2dpOgotCUBlY2hvIEluc3RhbGxpbmcgQ0dJcwotCUB0ZXN0IC1kICQoY2dpZGlyKSB8fCAkKG1raW5zdGFsbGRpcnMpICQoY2dpZGlyKQotCUBjcCAtcnAgJChzcmNkaXIpLy4uL2NnaS1iaW4vKiAkKGNnaWRpcikKLQkKLWluc3RhbGwtb3RoZXI6Ci0JQHRlc3QgLWQgJChsb2dkaXIpIHx8ICQobWtpbnN0YWxsZGlycykgJChsb2dkaXIpCi0KLWluc3RhbGwtaW5jbHVkZToKLQlAZWNobyBJbnN0YWxsaW5nIGhlYWRlciBmaWxlcwotCUB0ZXN0IC1kICQoaW5jbHVkZWRpcikgICAgIHx8ICQobWtpbnN0YWxsZGlycykgJChpbmNsdWRlZGlyKQotCUB0ZXN0IC1kICQoaW5jbHVkZWRpcikveG1sIHx8ICQobWtpbnN0YWxsZGlycykgJChpbmNsdWRlZGlyKS94bWwKLQlAdGVzdCAtZCAkKGluY2x1ZGVkaXIpL2FwciB8fCAkKG1raW5zdGFsbGRpcnMpICQoaW5jbHVkZWRpcikvYXByCi0JQGNwIGluY2x1ZGUvKi5oICQoc3JjZGlyKS9pbmNsdWRlLyouaCAkKGluY2x1ZGVkaXIpCi0JQGNwICQoc3JjZGlyKS9saWIvZXhwYXQtbGl0ZS8qLmggJChpbmNsdWRlZGlyKS94bWwKLQlAY3AgbGliL2Fwci9pbmNsdWRlLyouaCAkKHNyY2RpcikvbGliL2Fwci9pbmNsdWRlLyouaCAkKGluY2x1ZGVkaXIpL2FwcgotCUBjaG1vZCA2NDQgJChpbmNsdWRlZGlyKS8qLmggJChpbmNsdWRlZGlyKS94bWwvKi5oICQoaW5jbHVkZWRpcikvYXByLyouaApkaWZmIC0tZ2l0IGEvTWFrZWZpbGUud2luIGIvTWFrZWZpbGUud2luCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTdiZjZjLi4wMDAwMDAwCi0tLSBhL01ha2VmaWxlLndpbgorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBXaW5kb3dzIE5UIGFuZCBXaW5kb3dzIDk1Lzk4Ci0KLSMgVGFyZ2V0cyBhcmU6Ci0jICAgX2FwYWNoZXIgICAtIGJ1aWxkIEFwYWNoZSBpbiBSZWxlYXNlIG1vZGUKLSMgICBfYXBhY2hlZCAgIC0gYnVpbGQgQXBhY2hlIGluIERlYnVnIG1vZGUKLSMgICBpbnN0YWxsciAgIC0gYnVpbGQgYW5kIGluc3RhbGwgYSBSZWxlYXNlIGJ1aWxkCi0jICAgaW5zdGFsbGQgICAtIGJ1aWxkIGFuZCBpbnN0YWxsIGEgRGVidWcgYnVpbGQKLSMgICBjbGVhbiAgICAgIC0gcmVtb3ZlIChtb3N0KSBnZW5lcmF0ZWQgZmlsZXMKLSMgICBfY2xlYW5yICAgIC0gcmVtb3ZlIChtb3N0KSBmaWxlcyBnZW5lcmF0ZWQgYnkgYSBSZWxlYXNlIGJ1aWxkCi0jICAgX2NsZWFuZCAgICAtIHJlbW92ZSAobW9zdCkgZmlsZXMgZ2VuZXJhdGVkIGJ5IGEgRGVidWcgYnVpbGQKLSMKLSMgVGhlIGRlZmF1bHQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBpcyBcQXBhY2hlLiBUaGlzIGNhbiBiZSBjaGFuZ2VkCi0jIHdpdGggdGhlIElOU1RESVIgbWFjcm8sIGZvciBleGFtcGxlOgotIwotIyAgIG5tYWtlIC9mIE1ha2VmaWxlLndpbiBJTlNURElSPSJkOlxQcm9ncmFtIEZpbGVzXEFwYWNoZSIgaW5zdGFsbHIKLSMKLSMgTm90ZTogdGhpcyBkb2VzICpOT1QqIGNoYW5nZSB0aGUgY29tcGlsZWQgaW4gZGVmYXVsdCAic2VydmVyIHJvb3QiCi0KLSFJRiAiJChJTlNURElSKSIgPT0gIiIKLUlOU1RESVI9XEFwYWNoZQotIU1FU1NBR0UgVXNpbmcgZGVmYXVsdCBpbnN0YWxsIGRpcmVjdG9yeSBcQXBhY2hlCi0hRU5ESUYgCi0KLWRlZmF1bHQ6ICAgICAgICBfYXBhY2hlcgotCi1fYXBhY2hlcjogCi0JJChNQUtFKSAvZiBNYWtlZmlsZS53aW4gU0hPUlQ9UiBMT05HPVJlbGVhc2UgX2J1aWxkCi0KLV9hcGFjaGVkOiAKLQkkKE1BS0UpIC9mIE1ha2VmaWxlLndpbiBTSE9SVD1EIExPTkc9RGVidWcgICBfYnVpbGQKLQotaW5zdGFsbHI6IAotCSQoTUFLRSkgL2YgTWFrZWZpbGUud2luIFNIT1JUPVIgTE9ORz1SZWxlYXNlIF9idWlsZCBfaW5zdGFsbAotCi1pbnN0YWxsZDogCi0JJChNQUtFKSAvZiBNYWtlZmlsZS53aW4gU0hPUlQ9RCBMT05HPURlYnVnICAgX2J1aWxkIF9pbnN0YWxsCi0KLV9jbGVhbnI6ICAKLQkkKE1BS0UpIC9mIE1ha2VmaWxlLndpbiBTSE9SVD1SIExPTkc9UmVsZWFzZSBfY2xlYW4KLQotX2NsZWFuZDogIAotCSQoTUFLRSkgL2YgTWFrZWZpbGUud2luIFNIT1JUPUQgTE9ORz1EZWJ1ZyAgIF9jbGVhbgotCi1jbGVhbjoKLQkkKE1BS0UpIC9mIE1ha2VmaWxlLndpbiBfY2xlYW5yCi0JJChNQUtFKSAvZiBNYWtlZmlsZS53aW4gX2NsZWFuZAotCi1pbnN0YWxsZGxsOgotCSQoTUFLRSkgL2YgTWFrZWZpbGUud2luIFNIT1JUPVIgTE9ORz1SZWxlYXNlIF9pbnN0YWxsZGxsCi0KLV9idWlsZDoKLQllY2hvIEJ1aWxkaW5nIFdpbjMyICQoTE9ORykgdGFyZ2V0cyAoJChTSE9SVCkgc3VmZml4ZXMpCi0JY2QgbGliXGFwcgotCSBubWFrZSAvbm9sb2dvIENGRz0iYXBybGliIC0gV2luMzIgJChMT05HKSIgLWYgYXBybGliLm1hawotCWNkIC4uXC4uCi0JY2Qgb3Ncd2luMzIKLQkgbm1ha2UgL25vbG9nbyBDRkc9IkFwYWNoZU9TIC0gV2luMzIgJChMT05HKSIgLWYgQXBhY2hlT1MubWFrCi0JY2QgLi5cLi4KLQljZCByZWdleAotCSBubWFrZSAvbm9sb2dvIENGRz0icmVnZXggLSBXaW4zMiAkKExPTkcpIiAtZiByZWdleC5tYWsKLQljZCAuLgotCWNkIGFwCi0JIG5tYWtlIC9ub2xvZ28gQ0ZHPSJhcCAtIFdpbjMyICQoTE9ORykiIC1mIGFwLm1hawotCWNkIC4uCi0JY2Qgc3VwcG9ydAotIyAgICAgICAgbm1ha2UgL25vbG9nbyBDRkc9Imh0cGFzc3dkIC0gV2luMzIgJChMT05HKSIgLWYgaHRwYXNzd2QubWFrCi0jICAgICAgICBubWFrZSAvbm9sb2dvIENGRz0iaHRkaWdlc3QgLSBXaW4zMiAkKExPTkcpIiAtZiBodGRpZ2VzdC5tYWsKLQkgbm1ha2UgL25vbG9nbyBDRkc9InJvdGF0ZWxvZ3MgLSBXaW4zMiAkKExPTkcpIiAtZiByb3RhdGVsb2dzLm1hawotCWNkIC4uCi0JY2QgbWFpbgotCSBubWFrZSAvbm9sb2dvIENGRz0iZ2VuX3VyaV9kZWxpbXMgLSBXaW4zMiAkKExPTkcpIiAtZiBnZW5fdXJpX2RlbGltcy5tYWsKLQkgbm1ha2UgL25vbG9nbyBDRkc9Imdlbl90ZXN0X2NoYXIgLSBXaW4zMiAkKExPTkcpIiAtZiBnZW5fdGVzdF9jaGFyLm1hawotCWNkIC4uCi0JIC1kZWwgQ29yZSQoU0hPUlQpXGJ1aWxkbWFyay5vYmoKLQkgbm1ha2UgL25vbG9nbyBDRkc9IkFwYWNoZUNvcmUgLSBXaW4zMiAkKExPTkcpIiAtZiBBcGFjaGVDb3JlLm1hawotCSBubWFrZSAvbm9sb2dvIENGRz0iQXBhY2hlIC0gV2luMzIgJChMT05HKSIgLWYgQXBhY2hlLm1hawotCWNkIG9zXHdpbjMyCi0jICAgICAgICBzZXQgQ0ZHPUFwYWNoZU1vZHVsZVN0YXR1cyAtIFdpbjMyICQoTE9ORykKLSMgICAgICAgIG5tYWtlIC9ub2xvZ28gQ0ZHPSJBcGFjaGVNb2R1bGVTdGF0dXMgLSBXaW4zMiAkKExPTkcpIiAtZiBBcGFjaGVNb2R1bGVTdGF0dXMubWFrCi0jICAgICAgICBubWFrZSAvbm9sb2dvIENGRyI9QXBhY2hlTW9kdWxlSW5mbyAtIFdpbjMyICQoTE9ORykiIC1mIEFwYWNoZU1vZHVsZUluZm8ubWFrCi0JIG5tYWtlIC9ub2xvZ28gQ0ZHPSJBcGFjaGVNb2R1bGVBdXRoQW5vbiAtIFdpbjMyICQoTE9ORykiIC1mIEFwYWNoZU1vZHVsZUF1dGhBbm9uLm1hawotCSBubWFrZSAvbm9sb2dvIENGRz0iQXBhY2hlTW9kdWxlRGlnZXN0IC0gV2luMzIgJChMT05HKSIgLWYgQXBhY2hlTW9kdWxlRGlnZXN0Lm1hawotCSBubWFrZSAvbm9sb2dvIENGRz0iQXBhY2hlTW9kdWxlQ0VSTk1ldGEgLSBXaW4zMiAkKExPTkcpIiAtZiBBcGFjaGVNb2R1bGVDRVJOTWV0YS5tYWsKLQkgbm1ha2UgL25vbG9nbyBDRkc9IkFwYWNoZU1vZHVsZUV4cGlyZXMgLSBXaW4zMiAkKExPTkcpIiAtZiBBcGFjaGVNb2R1bGVFeHBpcmVzLm1hawotCSBubWFrZSAvbm9sb2dvIENGRz0iQXBhY2hlTW9kdWxlSGVhZGVycyAtIFdpbjMyICQoTE9ORykiIC1mIEFwYWNoZU1vZHVsZUhlYWRlcnMubWFrCi0JIG5tYWtlIC9ub2xvZ28gQ0ZHPSJBcGFjaGVNb2R1bGVTcGVsaW5nIC0gV2luMzIgJChMT05HKSIgLWYgQXBhY2hlTW9kdWxlU3BlbGluZy5tYWsKLQkgbm1ha2UgL25vbG9nbyBDRkc9IkFwYWNoZU1vZHVsZVVzZXJUcmFjayAtIFdpbjMyICQoTE9ORykiIC1mIEFwYWNoZU1vZHVsZVVzZXJUcmFjay5tYWsKLSMgICAgICAgIG5tYWtlIC9ub2xvZ28gQ0ZHPSJBcGFjaGVNb2R1bGVSZXdyaXRlIC0gV2luMzIgJChMT05HKSIgLWYgQXBhY2hlTW9kdWxlUmV3cml0ZS5tYWsKLQljZCAuLlwuLgotIyAgICAgICBjZCBtb2R1bGVzXHByb3h5Ci0jICAgICAgICBubWFrZSAvbm9sb2dvIENGRz0iQXBhY2hlTW9kdWxlUHJveHkgLSBXaW4zMiAkKExPTkcpIiAtZiBBcGFjaGVNb2R1bGVQcm94eS5tYWsKLSMgICAgICAgY2QgLi5cLi4KLQotX2luc3RhbGw6Ci0JLW1rZGlyICQoSU5TVERJUikKLQktbWtkaXIgJChJTlNURElSKVxtb2R1bGVzCi0JLW1rZGlyICQoSU5TVERJUilcbG9ncwotCS1ta2RpciAkKElOU1RESVIpXGNvbmYKLQktbWtkaXIgJChJTlNURElSKVxiaW4KLQljb3B5IEFwYWNoZSQoU0hPUlQpXEFwYWNoZS5leGUgJChJTlNURElSKQotCWNvcHkgQ29yZSQoU0hPUlQpXEFwYWNoZUNvcmUuZGxsICQoSU5TVERJUikKLQljb3B5IGxpYlxhcHJcJChMT05HKVxhcHJsaWIuZGxsICQoSU5TVERJUikKLSMgICAgICAgY29weSBvc1x3aW4zMlxBcGFjaGVNb2R1bGVTdGF0dXMkKFNIT1JUKVxBcGFjaGVNb2R1bGVTdGF0dXMuZGxsICQoSU5TVERJUilcbW9kdWxlcwotIyAgICAgICBjb3B5IG9zXHdpbjMyXEFwYWNoZU1vZHVsZUluZm8kKFNIT1JUKVxBcGFjaGVNb2R1bGVJbmZvLmRsbCAkKElOU1RESVIpXG1vZHVsZXMKLQljb3B5IG9zXHdpbjMyXEFwYWNoZU1vZHVsZUF1dGhBbm9uJChTSE9SVClcQXBhY2hlTW9kdWxlQXV0aEFub24uZGxsICQoSU5TVERJUilcbW9kdWxlcwotCWNvcHkgb3Ncd2luMzJcQXBhY2hlTW9kdWxlRGlnZXN0JChTSE9SVClcQXBhY2hlTW9kdWxlRGlnZXN0LmRsbCAkKElOU1RESVIpXG1vZHVsZXMKLQljb3B5IG9zXHdpbjMyXEFwYWNoZU1vZHVsZUNFUk5NZXRhJChTSE9SVClcQXBhY2hlTW9kdWxlQ0VSTk1ldGEuZGxsICQoSU5TVERJUilcbW9kdWxlcwotCWNvcHkgb3Ncd2luMzJcQXBhY2hlTW9kdWxlRXhwaXJlcyQoU0hPUlQpXEFwYWNoZU1vZHVsZUV4cGlyZXMuZGxsICQoSU5TVERJUilcbW9kdWxlcwotCWNvcHkgb3Ncd2luMzJcQXBhY2hlTW9kdWxlSGVhZGVycyQoU0hPUlQpXEFwYWNoZU1vZHVsZUhlYWRlcnMuZGxsICQoSU5TVERJUilcbW9kdWxlcwotIyAgICAgICBjb3B5IG9zXHdpbjMyXEFwYWNoZU1vZHVsZVJld3JpdGUkKFNIT1JUKVxBcGFjaGVNb2R1bGVSZXdyaXRlLmRsbCAkKElOU1RESVIpXG1vZHVsZXMKLQljb3B5IG9zXHdpbjMyXEFwYWNoZU1vZHVsZVNwZWxpbmckKFNIT1JUKVxBcGFjaGVNb2R1bGVTcGVsaW5nLmRsbCAkKElOU1RESVIpXG1vZHVsZXMKLQljb3B5IG9zXHdpbjMyXEFwYWNoZU1vZHVsZVVzZXJUcmFjayQoU0hPUlQpXEFwYWNoZU1vZHVsZVVzZXJUcmFjay5kbGwgJChJTlNURElSKVxtb2R1bGVzCi0jICAgICAgIGNvcHkgbW9kdWxlc1xwcm94eVwkKExPTkcpXEFwYWNoZU1vZHVsZVByb3h5LmRsbCAkKElOU1RESVIpXG1vZHVsZXMKLSMgICAgICAgY29weSBzdXBwb3J0XCQoTE9ORylcaHRwYXNzd2QuZXhlICQoSU5TVERJUilcYmluCi0jICAgICAgIGNvcHkgc3VwcG9ydFwkKExPTkcpXGh0ZGlnZXN0LmV4ZSAkKElOU1RESVIpXGJpbgotCWNvcHkgc3VwcG9ydFwkKExPTkcpXHJvdGF0ZWxvZ3MuZXhlICQoSU5TVERJUilcYmluCi0KLV9jbGVhbjoKLQljZCBsaWJcYXByCi0JIG5tYWtlIC9ub2xvZ28gQ0ZHPSJhcHJsaWIgLSBXaW4zMiAkKExPTkcpIiAtZiBhcHJsaWIubWFrIGNsZWFuCi0JY2QgLi5cLi4KLQljZCBvc1x3aW4zMgotCSBubWFrZSAvbm9sb2dvIENGRz0iQXBhY2hlT1MgLSBXaW4zMiAkKExPTkcpIiAtZiBBcGFjaGVPUy5tYWsgY2xlYW4KLQljZCAuLlwuLgotCWNkIHJlZ2V4Ci0JIG5tYWtlIC9ub2xvZ28gQ0ZHPSJyZWdleCAtIFdpbjMyICQoTE9ORykiIC1mIHJlZ2V4Lm1hayBjbGVhbgotCWNkIC4uCi0gICAgICAgIGNkIGFwCi0gICAgICAgICBubWFrZSAvbm9sb2dvIENGRz0iYXAgLSBXaW4zMiAkKExPTkcpIiAtZiBhcC5tYWsgY2xlYW4KLSAgICAgICAgY2QgLi4KLQljZCBzdXBwb3J0Ci0JIG5tYWtlIC9ub2xvZ28gQ0ZHPSJodHBhc3N3ZCAtIFdpbjMyICQoTE9ORykiIC1mIGh0cGFzc3dkLm1hayBjbGVhbgotCSBubWFrZSAvbm9sb2dvIENGRz0iaHRkaWdlc3QgLSBXaW4zMiAkKExPTkcpIiAtZiBodGRpZ2VzdC5tYWsgY2xlYW4KLQkgbm1ha2UgL25vbG9nbyBDRkc9InJvdGF0ZWxvZ3MgLSBXaW4zMiAkKExPTkcpIiAtZiByb3RhdGVsb2dzLm1hayBjbGVhbgotCWNkIC4uCi0JY2QgbWFpbgotCSBubWFrZSAvbm9sb2dvIENGRz0iZ2VuX3VyaV9kZWxpbXMgLSBXaW4zMiAkKExPTkcpIiAtZiBnZW5fdXJpX2RlbGltcy5tYWsgY2xlYW4KLQkgZGVsIHVyaV9kZWxpbXMuaAotCSBubWFrZSAvbm9sb2dvIENGRz0iZ2VuX3Rlc3RfY2hhciAtIFdpbjMyICQoTE9ORykiIC1mIGdlbl90ZXN0X2NoYXIubWFrIGNsZWFuCi0JIGRlbCB0ZXN0X2NoYXIuaAotCWNkIC4uCi0JIG5tYWtlIC9ub2xvZ28gQ0ZHPSJBcGFjaGVDb3JlIC0gV2luMzIgJChMT05HKSIgLWYgQXBhY2hlQ29yZS5tYWsgY2xlYW4KLQkgbm1ha2UgL25vbG9nbyBDRkc9IkFwYWNoZSAtIFdpbjMyICQoTE9ORykiIC1mIEFwYWNoZS5tYWsgY2xlYW4KLQljZCBvc1x3aW4zMgotIyAgICAgICAgbm1ha2UgL25vbG9nbyBDRkc9IkFwYWNoZU1vZHVsZVN0YXR1cyAtIFdpbjMyICQoTE9ORykiIC1mIEFwYWNoZU1vZHVsZVN0YXR1cy5tYWsgY2xlYW4KLSMgICAgICAgIG5tYWtlIC9ub2xvZ28gQ0ZHPSJBcGFjaGVNb2R1bGVJbmZvIC0gV2luMzIgJChMT05HKSIgLWYgQXBhY2hlTW9kdWxlSW5mby5tYWsgY2xlYW4KLQkgbm1ha2UgL25vbG9nbyBDRkc9IkFwYWNoZU1vZHVsZUF1dGhBbm9uIC0gV2luMzIgJChMT05HKSIgLWYgQXBhY2hlTW9kdWxlQXV0aEFub24ubWFrIGNsZWFuCi0JIG5tYWtlIC9ub2xvZ28gQ0ZHPSJBcGFjaGVNb2R1bGVEaWdlc3QgLSBXaW4zMiAkKExPTkcpIiAtZiBBcGFjaGVNb2R1bGVEaWdlc3QubWFrIGNsZWFuCi0JIG5tYWtlIC9ub2xvZ28gQ0ZHPSJBcGFjaGVNb2R1bGVDRVJOTWV0YSAtIFdpbjMyICQoTE9ORykiIC1mIEFwYWNoZU1vZHVsZUNFUk5NZXRhLm1hayBjbGVhbgotCSBubWFrZSAvbm9sb2dvIENGRz0iQXBhY2hlTW9kdWxlRXhwaXJlcyAtIFdpbjMyICQoTE9ORykiIC1mIEFwYWNoZU1vZHVsZUV4cGlyZXMubWFrIGNsZWFuCi0JIG5tYWtlIC9ub2xvZ28gQ0ZHPSJBcGFjaGVNb2R1bGVIZWFkZXJzIC0gV2luMzIgJChMT05HKSIgLWYgQXBhY2hlTW9kdWxlSGVhZGVycy5tYWsgY2xlYW4KLQkgbm1ha2UgL25vbG9nbyBDRkc9IkFwYWNoZU1vZHVsZVNwZWxpbmcgLSBXaW4zMiAkKExPTkcpIiAtZiBBcGFjaGVNb2R1bGVTcGVsaW5nLm1hayBjbGVhbgotCSBubWFrZSAvbm9sb2dvIENGRz0iQXBhY2hlTW9kdWxlVXNlclRyYWNrIC0gV2luMzIgJChMT05HKSIgLWYgQXBhY2hlTW9kdWxlVXNlclRyYWNrLm1hayBjbGVhbgotIyAgICAgICAgbm1ha2UgL25vbG9nbyBDRkc9IkFwYWNoZU1vZHVsZVJld3JpdGUgLSBXaW4zMiAkKExPTkcpIiAtZiBBcGFjaGVNb2R1bGVSZXdyaXRlLm1hayBjbGVhbgotCWNkIC4uXC4uCi0jICAgICAgIGNkIG1vZHVsZXNccHJveHkKLSMgICAgICAgIG5tYWtlIC9ub2xvZ28gQ0ZHPSJBcGFjaGVNb2R1bGVQcm94eSAtIFdpbjMyICQoTE9ORykiIC1mIEFwYWNoZU1vZHVsZVByb3h5Lm1hayBjbGVhbgotIyAgICAgICBjZCAuLlwuLgotCWNkIG9zXHdpbjMyXGluc3RhbGxlclxpbnN0YWxsZGxsCi0JIG5tYWtlIC9ub2xvZ28gQ0ZHPSJpbnN0YWxsIC0gV2luMzIgJChMT05HKSIgLWYgaW5zdGFsbC5tYWsgY2xlYW4KLQljZCAuLlwuLlwuLgotCi1faW5zdGFsbGRsbDoKLQljZCBvc1x3aW4zMlxpbnN0YWxsZXJcaW5zdGFsbGRsbAotCSBubWFrZSAvbm9sb2dvIENGRz0iaW5zdGFsbCAtIFdpbjMyICQoTE9ORykiIC1mIGluc3RhbGwubWFrCi0JY2QgLi5cLi5cLi4KZGlmZiAtLWdpdCBhL05XR05VbWFrZWZpbGUgYi9OV0dOVW1ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWFmMzExLi4wMDAwMDAwCi0tLSBhL05XR05VbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw0MDAgKzAsMCBAQAotIwotIyBEZWNsYXJlIHRoZSBzdWItZGlyZWN0b3JpZXMgdG8gYmUgYnVpbHQgaGVyZQotIwotCi1TVUJESVJTID0gXAotCXNyY2xpYlxhcHIgXAotCWJ1aWxkIFwKLQlzdXBwb3J0IFwKLQltb2R1bGVzIFwKLQkkKEVPTElTVCkgCi0KLSMKLSMgR2V0IHRoZSAnaGVhZCcgb2YgdGhlIGJ1aWxkIGVudmlyb25tZW50LiAgVGhpcyBpbmNsdWRlcyBkZWZhdWx0IHRhcmdldHMgYW5kCi0jIHBhdGhzIHRvIHRvb2xzCi0jCi0KLWluY2x1ZGUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jCi0KLSMKLSMgYnVpbGQgdGhpcyBsZXZlbCdzIGZpbGVzCi0KLSMKLSMgTWFrZSBzdXJlIGFsbCBuZWVkZWQgbWFjcm8ncyBhcmUgZGVmaW5lZAotIwotCi0jCi0jIFRoZXNlIGRpcmVjdG9yaWVzIHdpbGwgYmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5jbHVkZSBsaXN0LCBmb2xsb3dlZCBieQotIyBJTkNESVJTCi0jCi1YSU5DRElSUwkrPSBcCi0JCQkkKEFQX1dPUkspL3NyY2xpYi9hcHIvaW5jbHVkZSBcCi0JCQkkKEFQX1dPUkspL3NyY2xpYi9pbmNsdWRlL2FyY2gvTmV0V2FyZSBcCi0JCQkkKEFQX1dPUkspL3NyY2xpYi9hcHItdXRpbC9pbmNsdWRlIFwKLQkJCSQoQVBfV09SSykvaW5jbHVkZSBcCi0JCQkkKEFQX1dPUkspL21vZHVsZXMvZmlsdGVycy8gXAotCQkJJChBUF9XT1JLKS9tb2R1bGVzL2dlbmVyYXRvcnMvIFwKLQkJCSQoQVBfV09SSykvbW9kdWxlcy9odHRwLyBcCi0JCQkkKEFQX1dPUkspL21vZHVsZXMvbG9nZ2Vycy8gXAotCQkJJChBUF9XT1JLKS9tb2R1bGVzL21hcHBlcnMvIFwKLQkJCSQoQVBfV09SSykvbW9kdWxlcy9wcm94eS8gXAotCQkJJChBUF9XT1JLKS9vcy9OZXRXYXJlIFwKLQkJCSQoQVBfV09SSykvc2VydmVyL21wbS9OZXRXYXJlIFwKLQkJCSQoQVBfV09SSykvc3JjbGliL3BjcmUgXAotCQkJJChOV09TKSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBmbGFncyB3aWxsIGNvbWUgYWZ0ZXIgQ0ZMQUdTCi0jCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBkZWZpbmVzIHdpbGwgY29tZSBhZnRlciBERUZJTkVTCi0jCi1YREVGSU5FUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBmbGFncyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaW5rLm9wdCBmaWxlCi0jCi1YTEZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSB2YWx1ZXMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgY29ycmVjdCB2YXJpYWJsZXMgYmFzZWQgb24gdGhlIHZhbHVlIG9mCi0jIFJFTEVBU0UKLSMKLWlmZXEgIiQoUkVMRUFTRSkiICJkZWJ1ZyIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJICAgCSQoRU9MSVNUKQotZW5kaWYKLQotaWZlcSAiJChSRUxFQVNFKSIgIm5vb3B0IgotWElOQ0RJUlMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhDRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YREVGSU5FUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWExGTEFHUwkJKz0gXAotCQkgICAJJChFT0xJU1QpCi1lbmRpZgotCi1pZmVxICIkKFJFTEVBU0UpIiAicmVsZWFzZSIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotZW5kaWYKLQotIwotIyBUaGVzZSBhcmUgdXNlZCBieSB0aGUgbGluayB0YXJnZXQgaWYgYW4gTkxNIGlzIGJlaW5nIGdlbmVyYXRlZAotIyBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmsgJ25hbWUnIGRpcmVjdGl2ZSB0byBuYW1lIHRoZSBubG0uICBJZiBsZWZ0IGJsYW5rCi0jIFRBUkdFVF9ubG0gKHNlZSBiZWxvdykgd2lsbCBiZSB1c2VkLgotIwotTkxNX05BTUUJCT0gQXBhY2hlMgotCi0jCi0jIFRoaXMgaXMgdXNlZCBieSB0aGUgbGluayAnLWRlc2MgJyBkaXJlY3RpdmUuIAotIyBJZiBsZWZ0IGJsYW5rLCBOTE1fTkFNRSB3aWxsIGJlIHVzZWQuCi0jCi1OTE1fREVTQ1JJUFRJT04JPSBBcGFjaGUgV2ViIFNlcnZlciAKLQotIwotIyBUaGlzIGlzIHVzZWQgYnkgdGhlICctdGhyZWFkbmFtZScgZGlyZWN0aXZlLiAgSWYgbGVmdCBibGFuaywKLSMgTkxNX05BTUUgVGhyZWFkIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9USFJFQURfTkFNRQk9IEFwYWNoZQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSBWRVJTSU9OIHZhbHVlIGluIAotIyAkKEFQX1dPUkspXGJ1aWxkXE5XR05VZW52aXJvbm1lbnQuaW5jCi0jCi1OTE1fVkVSU0lPTgkJPQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG9mIDY0SwotIwotTkxNX1NUQUNLX1NJWkUJPSA2NTUzNgotIAotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWVudHJ5JyBkaXJlY3RpdmUKLSMKLU5MTV9FTlRSWV9TWU0JPSBfTGliQ1ByZWx1ZGUKLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1leGl0JyBkaXJlY3RpdmUKLSMKLU5MTV9FWElUX1NZTQk9IF9MaWJDUG9zdGx1ZGUKLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1jaGVjaycgZGlyZWN0aXZlCi0jCi1OTE1fQ0hFQ0tfU1lNCT0gX0xpYkNDaGVja1VubG9hZAotCi0jCi0jIElmIHRoZXNlIGFyZSBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZmxhZ3MnIGRpcmVjdGl2ZQotIwotTkxNX0ZMQUdTCQk9ICBQU0VVRE9QUkVFTVBUSU9OCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSBsaW5rZWQgaW4gd2l0aCB0aGUgWERDRGF0YSBvcHRpb24gaW4gdGhlIGRlZiAKLSMgZmlsZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG9mICQoTldPUykvYXBhY2hlLnhkYy4gIFhEQ0RhdGEgY2FuIGJlIGRpc2FibGVkCi0jIGJ5IHNldHRpbmcgQVBBQ0hFX1VOSVBST0MgaW4gdGhlIGVudmlyb25tZW50Ci0jCi1YRENEQVRBICAgICAgICAgPSAKLQotIwotIyBJZiB0aGVyZSBpcyBhbiBOTE0gdGFyZ2V0LCBwdXQgaXQgaGVyZQotIwotVEFSR0VUX25sbSA9IFwKLQkkKE9CSkRJUikvQXBhY2hlMi5ubG0gXAotCSQoRU9MSVNUKQotCi0jCi0jIElmIHRoZXJlIGlzIGFuIExJQiB0YXJnZXQsIHB1dCBpdCBoZXJlCi0jCi1UQVJHRVRfbGliID0gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgT0JKIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIE5MTSB0YXJnZXQgYWJvdmUuCi0jIFBhdGhzIG11c3QgYWxsIHVzZSB0aGUgJy8nIGNoYXJhY3RlcgotIwotRklMRVNfbmxtX29ianMgPSBcCi0JJChPQkpESVIpL2J1aWxkbWFyay5vIFwKLQkkKE9CSkRJUikvY29uZmlnLm8gXAotCSQoT0JKRElSKS9jb25uZWN0aW9uLm8gXAotCSQoT0JKRElSKS9jb3JlLm8gXAotCSQoT0JKRElSKS9lcnJvcl9idWNrZXQubyBcCi0JJChPQkpESVIpL2h0dHBfY29yZS5vIFwKLQkkKE9CSkRJUikvaHR0cF9wcm90b2NvbC5vIFwKLQkkKE9CSkRJUikvaHR0cF9yZXF1ZXN0Lm8gXAotCSQoT0JKRElSKS9saXN0ZW4ubyBcCi0JJChPQkpESVIpL2xvZy5vIFwKLQkkKE9CSkRJUikvbWFpbi5vIFwKLQkkKE9CSkRJUikvbW9kX2FjY2Vzcy5vIFwKLQkkKE9CSkRJUikvbW9kX2FjdGlvbnMubyBcCi0JJChPQkpESVIpL21vZF9hbGlhcy5vIFwKLQkkKE9CSkRJUikvbW9kX2FzaXMubyBcCi0JJChPQkpESVIpL21vZF9hdXRoLm8gXAotCSQoT0JKRElSKS9tb2RfYXV0b2luZGV4Lm8gXAotCSQoT0JKRElSKS9tb2RfZGlyLm8gXAotCSQoT0JKRElSKS9tb2RfZW52Lm8gXAotCSQoT0JKRElSKS9tb2RfaW1hcC5vIFwKLQkkKE9CSkRJUikvbW9kX2luY2x1ZGUubyBcCi0JJChPQkpESVIpL21vZF9sb2dfY29uZmlnLm8gXAotCSQoT0JKRElSKS9tb2RfbWltZS5vIFwKLQkkKE9CSkRJUikvbW9kX25lZ290aWF0aW9uLm8gXAotCSQoT0JKRElSKS9tb2Rfbndfc3NsLm8gXAotCSQoT0JKRElSKS9tb2Rfc2V0ZW52aWYubyBcCi0JJChPQkpESVIpL21vZF9zby5vIFwKLQkkKE9CSkRJUikvbW9kX3VzZXJkaXIubyBcCi0JJChPQkpESVIpL21vZHVsZXMubyBcCi0JJChPQkpESVIpL21wbV9jb21tb24ubyBcCi0JJChPQkpESVIpL21wbV9uZXR3YXJlLm8gXAotCSQoT0JKRElSKS9wY3JlLm8gXAotCSQoT0JKRElSKS9wY3JlcG9zaXgubyBcCi0JJChPQkpESVIpL3Byb3RvY29sLm8gXAotCSQoT0JKRElSKS9yZXF1ZXN0Lm8gXAotCSQoT0JKRElSKS9yZmMxNDEzLm8gXAotCSQoT0JKRElSKS9zY29yZWJvYXJkLm8gXAotCSQoT0JKRElSKS91dGlsLm8gXAotCSQoT0JKRElSKS91dGlsX2NmZ3RyZWUubyBcCi0JJChPQkpESVIpL3V0aWxfY2hhcnNldC5vIFwKLQkkKE9CSkRJUikvdXRpbF9maWx0ZXIubyBcCi0JJChPQkpESVIpL3V0aWxfbWQ1Lm8gXAotCSQoT0JKRElSKS91dGlsX253Lm8gXAotCSQoT0JKRElSKS91dGlsX3NjcmlwdC5vIFwKLQkkKE9CSkRJUikvdXRpbF90aW1lLm8gXAotCSQoT0JKRElSKS91dGlsX3htbC5vIFwKLQkkKE9CSkRJUikvdmhvc3QubyBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBMSUIgZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTkxNIHRhcmdldCBhYm92ZS4KLSMgVGhlc2Ugd2lsbCBiZSBhZGRlZCBhcyBhIGxpYnJhcnkgY29tbWFuZCBpbiB0aGUgbGluay5vcHQgZmlsZS4KLSMKLUZJTEVTX25sbV9saWJzID0gXAotICAgCWxpYmNwcmUubyBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBtb2R1bGVzIHRoYXQgdGhlIGFib3ZlIE5MTSB0YXJnZXQgZGVwZW5kcyBvbiB0byBsb2FkLgotIyBUaGVzZSB3aWxsIGJlIGFkZGVkIGFzIGEgbW9kdWxlIGNvbW1hbmQgaW4gdGhlIGxpbmsub3B0IGZpbGUuCi0jCi1GSUxFU19ubG1fbW9kdWxlcyA9IFwKLQlhcHJsaWIgXAotCUxpYmMgXAotCSQoRU9MSVNUKQotCi0jCi0jIElmIHRoZSBubG0gaGFzIGEgbXNnIGZpbGUsIHB1dCBpdCdzIHBhdGggaGVyZQotIwotRklMRV9ubG1fbXNnID0KLSAKLSMKLSMgSWYgdGhlIG5sbSBoYXMgYSBobHAgZmlsZSBwdXQgaXQncyBwYXRoIGhlcmUKLSMKLUZJTEVfbmxtX2hscCA9Ci0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgJChOV09TKVxjb3B5cmlnaHQudHh0LgotIwotRklMRV9ubG1fY29weXJpZ2h0ID0KLQotIwotIyBBbnkgYWRkaXRpb25hbCBpbXBvcnRzIGdvIGhlcmUKLSMKLUZJTEVTX25sbV9YaW1wb3J0cyA9IFwKLQlAbmV0d2FyZS5pbXAgXAotCUAkKEFQUikvYXBybGliLmltcCBcCi0JQGxpYmMuaW1wIFwKLQlAd3MybmxtLmltcCBcCi0JR2V0Q3VycmVudEFkZHJlc3NTcGFjZSBcCi0JJChFT0xJU1QpCi0gCi0jICAgCi0jIEFueSBzeW1ib2xzIGV4cG9ydGVkIHRvIGhlcmUKLSMKLUZJTEVTX25sbV9leHBvcnRzID0gXAotCUAkKE5XT1MpL2h0dHBkLmltcCBcCi0JJChFT0xJU1QpCi0JCi0jICAgCi0jIFRoZXNlIGFyZSB0aGUgT0JKIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIExJQiB0YXJnZXQgYWJvdmUuCi0jIFBhdGhzIG11c3QgYWxsIHVzZSB0aGUgJy8nIGNoYXJhY3RlcgotIwotRklMRVNfbGliX29ianMgPSBcCi0JCSQoRU9MSVNUKQotCi0jCi0jIGltcGxlbWVudCB0YXJnZXRzIGFuZCBkZXBlbmRhbmNpZXMgKGxlYXZlIHRoaXMgc2VjdGlvbiBhbG9uZSkKLSMKLQotbGlicyA6OiAkKE9CSkRJUikgJChUQVJHRVRfbGliKQotCi1ubG1zIDo6IGxpYnMgJChUQVJHRVRfbmxtKQotCi0jCi0jIFVwZGF0ZWQgdGhpcyB0YXJnZXQgdG8gY3JlYXRlIG5lY2Vzc2FyeSBkaXJlY3RvcmllcyBhbmQgY29weSBmaWxlcyB0byB0aGUgCi0jIGNvcnJlY3QgcGxhY2UuICAoU2VlICQoQVBfV09SSylcYnVpbGRcTldHTlVoZWFkLmluYyBmb3IgZXhhbXBsZXMpCi0jCi1pbnN0YWxsIDo6IG5sbXMgRk9SQ0UKLQljb3B5ICQoT0JKRElSKVxBcGFjaGUyLm5sbSAkKElOU1RBTEwpXEFwYWNoZTJcKi4qCi0JLWNvcHkgQUJPVVRfQVBBQ0hFICAgICAgICAgICAgICAkKElOU1RBTEwpXEFwYWNoZTJcKi4qCi0JLWNvcHkgUkVBRE1FICAgICAgICAgICAgICAgICAgICAkKElOU1RBTEwpXEFwYWNoZTJcKi4qCi0JLWNvcHkgU1RBVFVTICAgICAgICAgICAgICAgICAgICAkKElOU1RBTEwpXEFwYWNoZTJcKi4qCi0JLWNvcHkgTElDRU5TRSAgICAgICAgICAgICAgICAgICAkKElOU1RBTEwpXEFwYWNoZTJcKi4qCi0JLWNvcHkgZG9jc1xjZ2ktZXhhbXBsZXNcKi4gICAgICAkKElOU1RBTEwpXEFwYWNoZTJcY2dpLWV4YW1wbGVzXCouKgotCS1jb3B5IGRvY3NcY29uZlxodHRwZC1zdGQuY29uZiAgJChJTlNUQUxMKVxBcGFjaGUyXGNvbmZcaHR0cGQuY29uZgotCS1jb3B5IGRvY3NcY29uZlxtYWdpYyAgICAgICAgICAgJChJTlNUQUxMKVxBcGFjaGUyXGNvbmZcbWFnaWMKLQktY29weSBkb2NzXGNvbmZcbWltZS50eXBlcyAgICAgICQoSU5TVEFMTClcQXBhY2hlMlxjb25mXG1pbWUudHlwZXMKLQktY29weSBkb2NzXGVycm9yXCouKiAgICAgICAgICAgICQoSU5TVEFMTClcQXBhY2hlMlxlcnJvclwqLioKLQktY29weSBkb2NzXGVycm9yXGluY2x1ZGVcKi4qICAgICQoSU5TVEFMTClcQXBhY2hlMlxlcnJvclxpbmNsdWRlXCouKgotCS1jb3B5IGRvY3NcZG9jcm9vdFwqLiogICAgICAgICAgJChJTlNUQUxMKVxBcGFjaGUyXGh0ZG9jc1wqLioKLQktY29weSBkb2NzXGljb25zXCouKiAgICAgICAgICAgICQoSU5TVEFMTClcQXBhY2hlMlxpY29uc1wqLioKLQktY29weSBkb2NzXGljb25zXHNtYWxsXCouKiAgICAgICQoSU5TVEFMTClcQXBhY2hlMlxpY29uc1xzbWFsbFwqLioKLQktY29weSBkb2NzXG1hblwqLiogICAgICAgICAgICAgICQoSU5TVEFMTClcQXBhY2hlMlxtYW5cKi4qCi0JLWNvcHkgZG9jc1xtYW51YWxcKi4qICAgICAgICAgICAkKElOU1RBTEwpXEFwYWNoZTJcbWFudWFsXCouKgotCS1jb3B5IGRvY3NcbWFudWFsXGRldmVsb3BlclwqLiogJChJTlNUQUxMKVxBcGFjaGUyXG1hbnVhbFxkZXZlbG9wZXIKLQktY29weSBkb2NzXG1hbnVhbFxmYXFcKi4qICAgICAgICQoSU5TVEFMTClcQXBhY2hlMlxtYW51YWxcZmFxCi0JLWNvcHkgZG9jc1xtYW51YWxcaG93dG9cKi4qICAgICAkKElOU1RBTEwpXEFwYWNoZTJcbWFudWFsXGhvd3RvCi0JLWNvcHkgZG9jc1xtYW51YWxcaW1hZ2VzXCouKiAgICAkKElOU1RBTEwpXEFwYWNoZTJcbWFudWFsXGltYWdlcwotCS1jb3B5IGRvY3NcbWFudWFsXG1pc2NcKi4qICAgICAgJChJTlNUQUxMKVxBcGFjaGUyXG1hbnVhbFxtaXNjCi0JLWNvcHkgZG9jc1xtYW51YWxcbW9kXCouKiAgICAgICAkKElOU1RBTEwpXEFwYWNoZTJcbWFudWFsXG1vZAotCS1jb3B5IGRvY3NcbWFudWFsXHBsYXRmb3JtXCouKiAgJChJTlNUQUxMKVxBcGFjaGUyXG1hbnVhbFxwbGF0Zm9ybQotCS1jb3B5IGRvY3NcbWFudWFsXHByb2dyYW1zXCouKiAgJChJTlNUQUxMKVxBcGFjaGUyXG1hbnVhbFxwcm9ncmFtcwotCS1jb3B5IGRvY3NcbWFudWFsXHNlYXJjaFwqLiogICAgJChJTlNUQUxMKVxBcGFjaGUyXG1hbnVhbFxzZWFyY2gKLQktY29weSBkb2NzXG1hbnVhbFx2aG9zdHNcKi4qICAgICQoSU5TVEFMTClcQXBhY2hlMlxtYW51YWxcdmhvc3RzCi0gICAgCi1pbnN0YWxsZGV2IDo6IEZPUkNFCi0JLWNvcHkgJChzdWJzdCAvLFwsJChBUF9XT1JLKSlcaW5jbHVkZVwqLmggICAgICAgICAgICQoSU5TVEFMTClcQXBhY2hlMlxpbmNsdWRlXCouKgotCS1jb3B5ICQoc3Vic3QgLyxcLCQoQVBfV09SSykpXG9zXG5ldHdhcmVcKi5oICAgICAgICAkKElOU1RBTEwpXEFwYWNoZTJcaW5jbHVkZVwqLioKLQktY29weSAkKHN1YnN0IC8sXCwkKE5XT1MpKVxpbmNsdWRlXCouaCAgICAgICAgICAgICAgJChJTlNUQUxMKVxBcGFjaGUyXGluY2x1ZGVcKi4qCi0JLWNvcHkgJChzdWJzdCAvLFwsJChOV09TKSlcKi5pbXAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTClcQXBhY2hlMlxsaWJcKi4qCi0JLWNvcHkgJChzdWJzdCAvLFwsJChBUFIpKVxpbmNsdWRlXCouaCAgICAgICAgICAgICAgICQoSU5TVEFMTClcQXBhY2hlMlxpbmNsdWRlXCouKgotCS1jb3B5ICQoc3Vic3QgLyxcLCQoQVBSKSlcYXJjaFxuZXR3YXJlXGluY2x1ZGVcKi5oICAkKElOU1RBTEwpXEFwYWNoZTJcaW5jbHVkZVwqLioKLQktY29weSAkKHN1YnN0IC8sXCwkKEFQUlVUSUwpKVxpbmNsdWRlXCouaCAgICAgICAgICAgJChJTlNUQUxMKVxBcGFjaGUyXGluY2x1ZGVcKi4qCi0JLWNvcHkgJChzdWJzdCAvLFwsJChBUFIpKVwqLmltcCAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTClcQXBhY2hlMlxsaWJcKi4qCi0gICAgCi0jCi0jIEFueSBzcGVjaWFsaXplZCBydWxlcyBoZXJlCi0jCi0KLSQoT0JKRElSKS8lLm86IHNlcnZlci8lLmMgJChPQkpESVIpXGNjLm9wdAotCUBlY2hvIGNvbXBpbGluZyAkPAotCSQoQ0MpICQ8IC1vPSQoT0JKRElSKVwkKEBGKSBAJChPQkpESVIpXGNjLm9wdAotCi0kKE9CSkRJUikvJS5vOiBtb2R1bGVzL2FyY2gvbmV0d2FyZS8lLmMgJChPQkpESVIpXGNjLm9wdAotCUBlY2hvIGNvbXBpbGluZyAkPAotCSQoQ0MpICQ8IC1vPSQoT0JKRElSKVwkKEBGKSBAJChPQkpESVIpXGNjLm9wdAotCi0kKE9CSkRJUikvJS5vOiBtb2R1bGVzL2h0dHAvJS5jICQoT0JKRElSKVxjYy5vcHQKLQlAZWNobyBjb21waWxpbmcgJDwKLQkkKENDKSAkPCAtbz0kKE9CSkRJUilcJChARikgQCQoT0JKRElSKVxjYy5vcHQKLQotJChPQkpESVIpLyUubzogbW9kdWxlcy9hYWEvJS5jICQoT0JKRElSKVxjYy5vcHQKLQlAZWNobyBjb21waWxpbmcgJDwKLQkkKENDKSAkPCAtbz0kKE9CSkRJUilcJChARikgQCQoT0JKRElSKVxjYy5vcHQKLQotJChPQkpESVIpLyUubzogbW9kdWxlcy9tYXBwZXJzLyUuYyAkKE9CSkRJUilcY2Mub3B0Ci0JQGVjaG8gY29tcGlsaW5nICQ8Ci0JJChDQykgJDwgLW89JChPQkpESVIpXCQoQEYpIEAkKE9CSkRJUilcY2Mub3B0Ci0KLSQoT0JKRElSKS8lLm86IG1vZHVsZXMvZ2VuZXJhdG9ycy8lLmMgJChPQkpESVIpXGNjLm9wdAotCUBlY2hvIGNvbXBpbGluZyAkPAotCSQoQ0MpICQ8IC1vPSQoT0JKRElSKVwkKEBGKSBAJChPQkpESVIpXGNjLm9wdAotCi0kKE9CSkRJUikvJS5vOiBtb2R1bGVzL21ldGFkYXRhLyUuYyAkKE9CSkRJUilcY2Mub3B0Ci0JQGVjaG8gY29tcGlsaW5nICQ8Ci0JJChDQykgJDwgLW89JChPQkpESVIpXCQoQEYpIEAkKE9CSkRJUilcY2Mub3B0Ci0KLSQoT0JKRElSKS8lLm86IG1vZHVsZXMvZmlsdGVycy8lLmMgJChPQkpESVIpXGNjLm9wdAotCUBlY2hvIGNvbXBpbGluZyAkPAotCSQoQ0MpICQ8IC1vPSQoT0JKRElSKVwkKEBGKSBAJChPQkpESVIpXGNjLm9wdAotCi0kKE9CSkRJUikvJS5vOiBtb2R1bGVzL2xvZ2dlcnMvJS5jICQoT0JKRElSKVxjYy5vcHQKLQlAZWNobyBjb21waWxpbmcgJDwKLQkkKENDKSAkPCAtbz0kKE9CSkRJUilcJChARikgQCQoT0JKRElSKVxjYy5vcHQKLQotJChPQkpESVIpLyUubzogb3MvbmV0d2FyZS8lLmMgJChPQkpESVIpXGNjLm9wdAotCUBlY2hvIGNvbXBpbGluZyAkPAotCSQoQ0MpICQ8IC1vPSQoT0JKRElSKVwkKEBGKSBAJChPQkpESVIpXGNjLm9wdAotCi0kKE9CSkRJUikvJS5vOiBzZXJ2ZXIvbXBtL25ldHdhcmUvJS5jICQoT0JKRElSKVxjYy5vcHQKLQlAZWNobyBjb21waWxpbmcgJDwKLQkkKENDKSAkPCAtbz0kKE9CSkRJUilcJChARikgQCQoT0JKRElSKVxjYy5vcHQKLQotJChPQkpESVIpLyUubzogc3JjbGliL3BjcmUvJS5jICQoT0JKRElSKVxjYy5vcHQKLQlAZWNobyBjb21waWxpbmcgJDwKLQkkKENDKSAkPCAtbz0kKE9CSkRJUilcJChARikgQCQoT0JKRElSKVxjYy5vcHQKLQotIwotIyBJbmNsdWRlIHRoZSAndGFpbCcgbWFrZWZpbGUgdGhhdCBoYXMgdGFyZ2V0cyB0aGF0IGRlcGVuZCBvbiB2YXJpYWJsZXMgZGVmaW5lZAotIyBpbiB0aGlzIG1ha2VmaWxlCi0jCi0KLWluY2x1ZGUgJChBUF9XT1JLKVxidWlsZFxOV0dOVXRhaWwuaW5jCi0KZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc5YjIwNy4uMDAwMDAwMAotLS0gYS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDEuMyAoYW5kIHVwKQotCi0gIFdoYXQgaXMgaXQ/Ci0gIC0tLS0tLS0tLS0tCi0KLSAgQXBhY2hlIGlzIGFuIEhUVFAgc2VydmVyIGRlc2lnbmVkIGFzIGEgcGx1Zy1pbiByZXBsYWNlbWVudCBmb3IKLSAgdGhlIE5DU0Egc2VydmVyIHZlcnNpb24gMS4zIChvciAxLjQpLiBJdCBmaXhlcyBudW1lcm91cyBidWdzIGluCi0gIHRoZSBOQ1NBIHNlcnZlciBhbmQgaW5jbHVkZXMgbWFueSBmcmVxdWVudGx5IHJlcXVlc3RlZCBuZXcKLSAgZmVhdHVyZXMsIGFuZCBoYXMgYW4gQVBJIHdoaWNoIGFsbG93cyBpdCB0byBiZSBleHRlbmRlZCB0byBtZWV0Ci0gIHVzZXJzJyBuZWVkcyBtb3JlIGVhc2lseS4KLQotICBUaGUgTGF0ZXN0IFZlcnNpb24KLSAgLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgRGV0YWlscyBvZiB0aGUgbGF0ZXN0IHZlcnNpb24gY2FuIGJlIGZvdW5kIG9uIHRoZSBBcGFjaGUgSFRUUAotICBzZXJ2ZXIgcHJvamVjdCBwYWdlIHVuZGVyIGh0dHA6Ly9odHRwZC5hcGFjaGUub3JnLy4KLQotICBEb2N1bWVudGF0aW9uCi0gIC0tLS0tLS0tLS0tLS0KLQotICBUaGUgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgYXMgb2YgdGhlIGRhdGUgb2YgdGhpcyByZWxlYXNlIGlzCi0gIGFsc28gaW5jbHVkZWQsIGluIEhUTUwgZm9ybWF0LCBpbiB0aGUgaHRkb2NzL21hbnVhbC8gZGlyZWN0b3J5LgotICBGb3IgdGhlIG1vc3QgdXAtdG8tZGF0ZSBkb2N1bWVudGF0aW9uIGNhbiBiZSBmb3VuZCBvbgotICBodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy9kb2NzLy4KLQotICBJbnN0YWxsYXRpb24KLSAgLS0tLS0tLS0tLS0tCi0KLSAgQXBhY2hlIDIuMCB1c2VzIGF1dG9jb25mIGZvciBjb25maWd1cmF0aW9uIGFuZCBpbnN0YWxsYXRpb24uICBUbyB1c2UKLSAgQXBhY2hlJ3MgYXV0b2NvbmYgc2NyaXB0LCB5b3Ugd2lsbCBuZWVkIGxpYnRvb2wgMS4zLjMgb3IgaGlnaGVyLCBhbmQKLSAgYXV0b2NvbmYgMi4xMyBvciBuZXdlci4KLQotICBUbyBjb25maWd1cmUgQXBhY2hlIDIuMCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kcy4KLQotICAuL2J1aWxkY29uZgotICAuL2NvbmZpZ3VyZSBbYXV0b2NvbmYgYXJndW1lbnRzXSBbYXBhY2hlIGFyZ3VtZW50c10KLSAgbWFrZQotICBtYWtlIGluc3RhbGwKLSAgCi0gIFRoZSBidWlsZGNvbmYgc2NyaXB0IGlzIHZlcnkgaW1wb3J0YW50LiAgSnVzdCBydW5uaW5nIGF1dG9jb25mIHdpbGwgbm90Ci0gIGxlYXZlIHRoZSBkaXJlY3RvcnkgdHJlZSBpbiBhIHVzYWJsZSBzdGF0ZS4KLQotICBMaWNlbnNpbmcKLSAgLS0tLS0tLS0tCi0KLSAgUGxlYXNlIHNlZSB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS4KLQotICBBY2tub3dsZWRnbWVudHMKLSAgLS0tLS0tLS0tLS0tLS0tLQotCi0gIFdlIHdpc2ggdG8gYWNrbm93bGVkZ2UgdGhlIGZvbGxvd2luZyBjb3B5cmlnaHRlZCB3b3JrcyB0aGF0Ci0gIG1ha2UgdXAgcG9ydGlvbnMgb2YgdGhlIEFwYWNoZSBzb2Z0d2FyZToKLQotICBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgZGV2ZWxvcGVkIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIKLSAgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucyAoTkNTQSkgYXQgdGhlIFVuaXZlcnNpdHkgb2YKLSAgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbi4KLQotICBUaGlzIHNvZnR3YXJlIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBSU0EgRGF0YSBTZWN1cml0eQotICBJbmMuIE1ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0sIGluY2x1ZGluZyB2YXJpb3VzCi0gIG1vZGlmaWNhdGlvbnMgYnkgU3B5Z2xhc3MgSW5jLiwgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHksIGFuZAotICBCZWxsIENvbW11bmljYXRpb25zIFJlc2VhcmNoLCBJbmMgKEJlbGxjb3JlKS4KLQotICBUaGlzIHBhY2thZ2UgY29udGFpbnMgc29mdHdhcmUgd3JpdHRlbiBhbmQgY29weXJpZ2h0ZWQgYnkgSGVucnkKLSAgU3BlbmNlci4gIFBsZWFzZSBzZWUgdGhlIGZpbGUgY2FsbGVkIHNyYy9yZWdleC9DT1BZUklHSFQuIAotCi0gIFRoZSBOVCBwb3J0IHdhcyBzdGFydGVkIHdpdGggY29kZSBwcm92aWRlZCB0byB0aGUgQXBhY2hlIEdyb3VwCi0gIGJ5IEFtYmFyaXNoIE1hbHBhbmkgb2YgVmFsaUNlcnQsIEluYy4gKGh0dHA6Ly93d3cudmFsaWNlcnQuY29tLykuCi0KLSAgQXBhY2hlIDIuMCByZWxpZXMgaGVhdmlseSBvbiB0aGUgdXNlIG9mIGF1dG9jb25mIGFuZCBsaWJ0b29sIHRvIHByb3ZpZGUKLSAgYSBidWlsZCBlbnZpcm9ubWVudC4KZGlmZiAtLWdpdCBhL1JPQURNQVAgYi9ST0FETUFQCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDQ1ZDZkLi4wMDAwMDAwCi0tLSBhL1JPQURNQVAKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1BUEFDSEUgMi4xKyBST0FETUFQOgotCi1MYXN0IG1vZGlmaWVkIGF0IFskRGF0ZTogMjAwMS8xMS8yNyAwNToxOTozOSAkXQotCi1ERUZFUlJSRUQgRk9SIEFQQUNIRSAyLjEKLQotICAgICogU291cmNlIGNvZGUgc2hvdWxkIGZvbGxvdyBzdHlsZSBndWlkZWxpbmVzLgotICAgICAgT0ssIHdlIGFsbCBhZ3JlZSBwcmV0dHkgY29kZSBpcyBnb29kLiAgUHJvYmFibHkgYmVzdCB0byBjbGVhbiB0aGlzCi0gICAgICB1cCBieSBoYW5kIGltbWVkaWF0ZWx5IHVwb24gYnJhbmNoaW5nIGEgMi4xIHRyZWUuCi0gICAgICBKdXN0aW4ncyB2b3VsZW50ZWVyZWQgdG8gaGFuZC1lZGl0IHRoZSBlbnRpcmUgc291cmNlIHRyZWUgOykKLQotICAgICogcmV2YW1wIHRoZSBpbnB1dCBmaWx0ZXIgc3ludGF4IHRvIHByb3ZpZGUgZm9yIG9yZGVyaW5nIG9mCi0gICAgICBmaWx0ZXJzIGNyZWF0ZWQgd2l0aCB0aGUgU2V0e0lucHV0fE91dHB1dH1GaWx0ZXIgYW5kIHRoZQotICAgICAgQWRke0lucHV0fE91dHB1dH1GaWx0ZXIgZGlyZWN0aXZlcy4gIEEgJ3JlbGF0aXZlIHRvIGZpbHRlcngnIAotICAgICAgc3ludGF4IGlzIGRlZmluYXRlbHkgcHJlZmVyYWJsZSwgYnV0IG5vdCByZWFsaXN0aWMgZm9yIDIuMC4KLQotICAgICogUGxhdGZvcm1zIHRoYXQgZG8gbm90IHN1cHBvcnQgZm9yayAocHJpbWFyaWx5IFdpbjMyIGFuZCBBUy80MDApCi0gICAgICBBcmNoaXRlY3Qgc3RhcnQtdXAgY29kZSB0aGF0IGF2b2lkcyBpbml0aWFsaXppbmcgYWxsIHRoZSBtb2R1bGVzIAotICAgICAgaW4gdGhlIHBhcmVudCBwcm9jZXNzIG9uIHBsYXRmb3JtcyB0aGF0IGRvIG5vdCBzdXBwb3J0IGZvcmsuCi0gICAgICBCZXR0ZXIgeWV0IC0gbm90IG9ubHkgaW5mb3JtIHRoZSBzdGFydHVwIG9mIHdoaWNoIHBoYXNlIGl0J3MgaW4sCi0gICAgICBidXQgYWxsb3cgdGhlIHBhcmVudCAncHJvY2VzcycgdG8gaW5pdGlhbGl6ZSBzaGFyZWQgbWVtb3J5LCBldGMsCi0gICAgICBhbmQgY3JlYXRlIGEgbW9kdWxlLWJ5LW1vZHVsZSBzdHJlYW0gdG8gcGFzcyB0byB0aGUgY2hpbGQsIHNvIHRoZQotICAgICAgcGFyZW50IGNhbiBhY3R1YWxseSBhcmJpdHJhdGUgdGhlIGltcG9ydGFudCBzdHVmZi4KLQotICAgICogUmVwbGFjZSBzdGF0IFtkZWZlcnJlZCBvcGVuXSB3aXRoIG9wZW4vZnN0YXQgaW4gZGlyZWN0b3J5X3dhbGsuCi0gICAgICBKdXN0aW4sIElhbiwgT3RoZXJCaWxsIGFsbCBpbnRlcmVzdGVkIGluIHRoaXMuICBJbXBsaWVzIHNldHRpbmcgdXAKLSAgICAgIHRoZSBhcHJfZmlsZV90IG1lbWJlciBpbiByZXF1ZXN0X3JlYywgYW5kIGhhdmluZyBhbGwgbW9kdWxlcyB1c2UKLSAgICAgIHRoYXQgZmlsZSwgYW5kIGFsbG93IHRoZSBjbGVhbnVwIHRvIGNsb3NlIGl0IFtpZiBpdCBpc24ndCBhIHNoYXJlZCwKLSAgICAgIGNhY2hlZCBmaWxlIGhhbmRsZS5dCi0KLSAgICAqIFJlZmFjdG9yIGF1dGggaW50byBhdXRoIHByb3RvY29scyBhbmQgYXV0aCBkYXRhYmFzZSBzdG9yZXMuCi0gICAgICBNYW55IGludGVyZXN0ZWQgaGFja2VycywgdG9vIGRlc3RhYmlsaXppbmcgZm9yIDIuMCBpbmNsdXNpb24uCi0KLURFRkVSUlJFRCBGT1IgQVBBQ0hFIDMuMAotCi0gICAgKiBUaGUgQXN5bmMgQXBhY2hlIFNlcnZlciBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBBUFIuCi0gICAgICBbQmlsbCBTdG9kZGFyZCdzIHBldCBwcm9qZWN0Ll0KLQotICAgIApkaWZmIC0tZ2l0IGEvU1RBVFVTIGIvU1RBVFVTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTRjM2NhLi4wMDAwMDAwCi0tLSBhL1NUQVRVUworKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLUFwYWNoZSAyLjAgU1RBVFVTOgotTGFzdCBtb2RpZmllZCBhdCBbJERhdGU6IDE5OTkvMDgvMjcgMTg6NTc6MTcgJF0KLQotUmVsZWFzZToKLQotICAgIDIuMDogSW4gcHJlLWFscGhhIGRldmVsb3BtZW50Ci0KLVBsYW46Ci0KLSAgICAqIFZhZ3VlIGdvYWwgb2YgYW4gYWxwaGEgb3IgYmV0YSByZWxlYXNlIGluIDE5OTkuIENvbW1pdC10aGVuLXJldmlldwotICAgICAgaXMgYWN0aXZlLgotCi1SRUxFQVNFIFNIT1dTVE9QUEVSUzoKLQotICAgICogQ0dJIGRvZXNuJ3Qgd29yawotICAgICAgICBTdGF0dXM6IEJlbiBMYXVyaWUgaXMgd29ya2luZyBvbiB0aGlzLgotCi0gICAgKiBtb2Rfc3RhdHVzIGRvZXNuJ3Qgd29yawotICAgICAgICBTdGF0dXM6IE1hbm9qIEthc2ljaGFpbnVsYSA8bWFub2prQGlvLmNvbT4gaXMgd29ya2luZyBvbiB0aGlzLiBBCi0gICAgICAgIHBhdGNoIGhhcyBiZWVuIHBvc3RlZCB0aGF0IHN0YXJ0cyB0byBmaXggdGhpczoKLSAgICAgICAgKDwxOTk5MDgyNTAyNTY1My5BMTkwNjVAc2Ftb3NhLm1pbmRzcHJpbmcuY29tPiBhbmQKLSAgICAgICAgPDE5OTkwODI1MDIyMTQ2LkExMDA5NkBpby5jb20+KQotCi0gICAgKiBzdUVYRUMgZG9lc24ndCB3b3JrCi0gICAgICAgIEJlbiBMYXVyaWUncyB3b3JrIHRvIGZpeCBDR0lzIHdpbGwgYWxzbyBmaXggdGhpcy4KLQotICAgICogV2luZG93cyBOVCBwb3J0IGlzbid0IGRvbmUKLSAgICAgICAgU3RhdHVzOiBCaWxsIGlzIHdvcmtpbmcgb24gdGhpcyB0aHJvdWdoIGhpcyBNUE0gd29yaywgYW5kIFJ5YW4KLSAgICAgICAgaXMgd2l0aCBBUFIuCi0KLSAgICAqIEN1cnJlbnQgMi4wIGNvZGUgaXMgbm90IHRlc3RlZCBvbiBtYW55IFVuaXggcGxhdGZvcm1zLiBNYWtlIDIuMAotICAgICAgd29yayBvbiBtb3N0LCBpZiBub3QgYWxsIHRoZSBzeXN0ZW1zIDEuMyBkaWQKLQotICAgICAgICBTdGF0dXM6IEF1dG9jb25mIGFuZCBBUFIgd2lsbCBnZXQgdXMgbW9zdCBvZiB0aGUgd2F5IHRoZXJlLgotCi0gICAgKiBUaGUgbW9kdWxlIEFQSSBpcyBhIHdlaXJkIGNvbWJpbmF0aW9uIG9mIHRoZSBvbGQgdGFibGUgYW5kIHRoZSBuZXcKLSAgICAgIGhvb2sgc3lzdGVtLiBTd2l0Y2ggY29tcGxldGVseSB0byB0aGUgbmV3IGhvb2sgc3lzdGVtCi0gICAgICAgIFN0YXR1czogQmVuIExhdXJpZSBpcyB3b3JraW5nIG9uIHRoaXMuCi0KLVJFTEVBU0UgTk9OLVNIT1dTVE9QUEVSUyBCVVQgV09VTEQgQkUgUkVBTCBOSUNFIFRPIFdSQVAgVEhFU0UgVVA6Ci0KLSAgICAobm9uZSBsaXN0ZWQpCi0KLU90aGVyIGJ1Z3MgdGhhdCBuZWVkIGZpeGluZzoKLQotICAgICogTWF4UmVxdWVzdHNQZXJDaGlsZCBtZWFzdXJlcyBjb25uZWN0aW9ucywgbm90IHJlcXVlc3RzLgotICAgIAotICAgICogUmVnZXggY29udGFpbmVycyBkb24ndCB3b3JrIGluIGFuIGludHV0aXZlIHdheQotICAgICAgICBTdGF0dXM6IE5vIG9uZSBoYXMgY29tZSB1cCB3aXRoIGFuIGVmZmljaWVudCB3YXkgdG8gZml4IHRoaXMKLSAgICAgICAgYmVoYXZpb3IuIERlYW4gaGFzIHN1Z2dlc3RlZCBnZXR0aW5nIHJpZCBvZiByZWdleCBjb250YWluZXJzCi0gICAgICAgIGNvbXBsZXRlbHkuCi0KLU90aGVyIGZlYXR1cmVzIHRoYXQgbmVlZCB3cml0aW5nOgotCi0gICAgKiBTd2l0Y2ggdG8gYXV0b2NvbmYsIGV0IGFsLiBmb3IgY29uZmlndXJhdGlvbi4KLQotICAgICogVXNlIEFQUiB0byBnZXQgcmlkIG9mIG1vcmUgcGxhdGZvcm0gZGVwZW5kYW5jaWVzLgotICAgICAgICBTdGF0dXM6IFJ5YW4gQmxvb20gPHJiYkByYWxlaWdoLmlibS5jb20+IGlzIHdvcmtpbmcgb24gdGhpcy4KLQotICAgICogRmluaXNoIGluZnJhc3RydWN0dXJlIGluIGNvcmUgZm9yIGFzeW5jIE1QTXMKLSAgICAgICAgU3RhdHVzOiA/Ci0KLSAgICAqIFdvcmsgb24gb3RoZXIgTVBNcy4gUG9zc2libGUgTVBNcyBkaXNjdXNzZWQgb3IgaW4gcHJvZ3Jlc3MgaW5jbHVkZToKLQotICAgICAgLSBEYXZpZCBSZWlkJ3MgPGFiYjM3QGRpYWwucGlwZXguY29tPiBCZW9zIE1QTQotICAgICAgICAgIFN0YXR1czogaW4gcHJvZ3Jlc3MKLQotICAgICAgLSBEZWFuIEdhdWRldCdzIGFzeW5jIE1QTQotICAgICAgICAgIFN0YXR1czogPwotCi0gICAgICAtIFphY2ggQnJvd24ncyA8emFiQHphYmJvLm5ldD4gTGludXggc2lnaW5mbyBNUE0KLSAgICAgICAgICBTdGF0dXM6ID8KLQotRG9jdW1lbnRhdGlvbiB0aGF0IG5lZWRzIHdyaXRpbmc6Ci0KLSAgICAqIFRoZSBjb25jZXB0IG9mIE1QTXMsIGVzcGVjaWFsbHkgaWYgd2Ugc2hpcCBtb3JlIHRoYW4gb25lIE1QTSBmb3IgYQotICAgICAgZ2l2ZW4gcGxhdGZvcm0KLQotICAgICogTmV3IGRpcmVjdGl2ZXMgaW4gdGhlIHZhcmlvdXMgTVBNcwotCi0gICAgKiBBUEkgZG9jdW1lbnRhdGlvbgotICAgICAgICBTdGF0dXM6IEJlbiBMYXVyaWUgaGFzIHdyaXR0ZW4gc29tZSBob29rcyBkb2N1bWVudGF0aW9uCi0gICAgICAgIChhcGFjaGUtMi4wL2h0ZG9jcy9ob29rcy5odG1sKQotCi1BdmFpbGFibGUgUGF0Y2hlczoKLQotICAgKiBNaWtlIEFiYm90dCdzIDxtamFAdHJ1ZGdlLmVuZ3Iuc2dpLmNvbT4gcGF0Y2hlcyB0byBpbXByb3ZlCi0gICAgIHBlcmZvcm1hbmNlCi0gICAgICAgU3RhdHVzOiBUaGVzZSB3ZXJlIHdyaXR0ZW4gZm9yIDEuMywgYW5kIGFyZSBhd2FpdGluZyBhIHBvcnQgdG8KLSAgICAgICAyLjAKLQotT3BlbiBpc3N1ZXM6Ci0KLSAgICogV2hhdCBkbyB3ZSBkbyBhYm91dCBtb2RfcHJveHk/Ci0KLSAgICogV2hpY2ggTVBNcyB3aWxsIGJlIGluY2x1ZGVkIHdpdGggQXBhY2hlIDIuMD8KZGlmZiAtLWdpdCBhL2FjaW5jbHVkZS5tNCBiL2FjaW5jbHVkZS5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE5N2Y3Mi4uMDAwMDAwMAotLS0gYS9hY2luY2x1ZGUubTQKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi1kbmwKLWRubCBBUEFDSEVfTU9EVUxFKG1vZG5hbWUgWywgc2hhcmVkXSkKLWRubAotZG5sIEluY2x1ZGVzIGFuIGV4dGVuc2lvbiBpbiB0aGUgYnVpbGQuCi1kbmwKLWRubCAibW9kbmFtZSIgaXMgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZXMvIHN1YmRpciB3aGVyZSB0aGUgZXh0ZW5zaW9uIHJlc2lkZXMKLWRubCAic2hhcmVkIiBjYW4gYmUgc2V0IHRvICJzaGFyZWQiIG9yICJ5ZXMiIHRvIGJ1aWxkIHRoZSBleHRlbnNpb24gYXMKLWRubCBhIGR5bmFtaWNhbGx5IGxvYWRhYmxlIGxpYnJhcnkuCi1kbmwKLUFDX0RFRlVOKEFQQUNIRV9NT0RVTEUsWwotICBpZiB0ZXN0IC1kICIkY3dkLyRzcmNkaXIvbW9kdWxlcy8kMSIgOyB0aGVuCi0gICAgTU9EX1NVQkRJUlM9IiRNT0RfU1VCRElSUyAkMSIKLSAgICBpZiB0ZXN0ICIkMiIgIT0gInNoYXJlZCIgLWEgIiQyIiAhPSAieWVzIjsgdGhlbgotICAgICAgbGlibmFtZT0kKGJhc2VuYW1lICQxKQotICAgICAgX2V4dGxpYj0ibGliJHtsaWJuYW1lfS5hIgotICAgICAgTU9EX0xUTElCUz0iJE1PRF9MVExJQlMgbW9kdWxlcy8kMS9saWIke2xpYm5hbWV9LmxhIgotICAgICAgTU9EX0xJQlM9IiRNT0RfTElCUyAkMS8kX2V4dGxpYiIKLSAgICAgIE1PRF9TVEFUSUM9IiRNT0RfU1RBVElDICQxIgotICAgIGVsc2UKLSAgICAgIE1PRF9TSEFSRUQ9IiRNT0RfU0hBUkVEICQxIgotICAgIGZpCi0gICAgQVBBQ0hFX09VVFBVVChtb2R1bGVzLyQxL01ha2VmaWxlKQotICBmaQotXSkKLQotQUNfU1VCU1QoTU9EX0xUTElCUykKLQotZG5sICMjIEFQQUNIRV9PVVRQVVQoZmlsZSkKLWRubCAjIyBhZGRzICJmaWxlIiB0byB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQgYnkgQUNfT1VUUFVUCi1kbmwgIyMgVGhpcyBtYWNybyBjYW4gYmUgdXNlZCBzZXZlcmFsIHRpbWVzLgotQUNfREVGVU4oQVBBQ0hFX09VVFBVVCwgWwotICBBUEFDSEVfT1VUUFVUX0ZJTEVTPSIkQVBBQ0hFX09VVFBVVF9GSUxFUyAkMSIKLV0pCi0KLWRubAotZG5sIEFDX0FERF9MSUJSQVJZKGxpYnJhcnkpCi1kbmwKLWRubCBhZGQgYSBsaWJyYXJ5IHRvIHRoZSBsaW5rIGxpbmUKLWRubAotQUNfREVGVU4oQUNfQUREX0xJQlJBUlksWwotICBBUEFDSEVfT05DRShMSUJSQVJZLCAkMSwgWwotICAgIEVYVFJBX0xJQlM9IiRFWFRSQV9MSUJTIC1sJDEiCi0gIF0pCi1dKQotCi1kbmwKLWRubCBBUEFDSEVfT05DRShuYW1lc3BhY2UsIHZhcmlhYmxlLCBjb2RlKQotZG5sCi1kbmwgZXhlY3V0ZSBjb2RlLCBpZiB2YXJpYWJsZSBpcyBub3Qgc2V0IGluIG5hbWVzcGFjZQotZG5sCi1BQ19ERUZVTihBUEFDSEVfT05DRSxbCi0gIHVuaXF1ZT1gZWNobyAkYWNfbiAiJDIkYWNfYyIgfCB0ciAtYyAtZCBhLXpBLVowLTlgCi0gIGNtZD0iZWNobyAkYWNfbiBcIlwkJDEkdW5pcXVlJGFjX2NcIiIKLSAgaWYgdGVzdCAtbiAiJHVuaXF1ZSIgJiYgdGVzdCAiYGV2YWwgJGNtZGAiID0gIiIgOyB0aGVuCi0gICAgZXZhbCAiJDEkdW5pcXVlPXNldCIKLSAgICAkMwotICBmaQotXSkKLQpkaWZmIC0tZ2l0IGEvYXBhY2hlbncubWNwLnppcCBiL2FwYWNoZW53Lm1jcC56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NTA5OWYuLjAwMDAwMDAKLS0tIGEvYXBhY2hlbncubWNwLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1aWxkLy5jdnNpZ25vcmUgYi9idWlsZC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWQ1MWJiLi4wMDAwMDAwCi0tLSBhL2J1aWxkLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1ydWxlcy5tawpkaWZmIC0tZ2l0IGEvYnVpbGQvTldHTlVlbnZpcm9ubWVudC5pbmMgYi9idWlsZC9OV0dOVWVudmlyb25tZW50LmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxNDlhZC4uMDAwMDAwMAotLS0gYS9idWlsZC9OV0dOVWVudmlyb25tZW50LmluYworKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0jCi0jIFNldHVwIG5lZWRlZCBUb29scyBhbmQgTGlicmFyaWVzCi0jCi0KLWlmZXEgIiQod2lsZGNhcmQgJChBUF9XT1JLKVxOV0dOVWN1c3RvbS5pbmkpIiAiJChBUF9XT1JLKVxOV0dOVWN1c3RvbS5pbmkiCi1pbmNsdWRlICQoQVBfV09SSylcTldHTlVjdXN0b20uaW5pCi1DVVNUT01fSU5JID0gJChBUF9XT1JLKVxOV0dOVWN1c3RvbS5pbmkKLWVuZGlmCi0KLWlmbmRlZiBWRVJCT1NFCi0uU0lMRU5UOgotZW5kaWYKLQotIwotIyBUcmVhdCBsaWtlIGFuIGluY2x1ZGUKLSMKLWlmbmRlZiBFbnZpcm9ubWVudERlZmluZWQKLQotIwotIyBzaW1wbGUgbWFjcm9zIGZvciBwYXJzaW5nIG1ha2VmaWxlcwotIwotRU9MSVNUOj0KLUVNUFRZIDo9Ci1DT01NQSA6PSAsCi1TUEFDRSA6PSAkKEVNUFRZKSAkKEVNUFRZKQotCi0jCi0jIEJhc2UgZW52aXJvbm1lbnQKLSMKLQotIyBUcnkgYW5kIGhhbmRsZSBjYXNlIGlzc3VlcwotaWZuZGVmIE5PVkVMTExJQkMKLWlmZGVmIE5vdmVsbExpYkMKLU5PVkVMTExJQkMgPSAkKE5vdmVsbExpYkMpCi1lbmRpZgotZW5kaWYKLQotaWZuZGVmIE5PVkVMTExJQkMKLU5PVkVMTExJQkMgPSBDOi9ub3ZlbGwvbmRrL2xpYmMKLWVuZGlmCi0KLSMgVGhpcyBpcyBhIHBsYWNlaG9sZGVyCi0jIGlmbmRlZiBMREFQU0RLCi0jIExEQVBTREsgPSBDOi9ub3ZlbGwvbmRrL2NsZGFwc2RrCi0jIGVuZGlmCi0KLWlmbmRlZiBNRVRST1dFUktTCi1NRVRST1dFUktTID0gQzpcUHJvZ3JhbSBGaWxlc1xNZXRyb3dlcmtzXENvZGVXYXJyaW9yCi1lbmRpZgotCi0jIElmIExNX0xJQ0VOU0VfRklMRSBpc24ndCBkZWZpbmVkLCBkZWZpbmUgYSB2YXJpYWJsZSB0aGF0IGNhbiBiZSB1c2VkIHRvCi0jIHJlc3RhcnQgbWFrZSB3aXRoIGl0IGRlZmluZWQKLWlmbmRlZiBMTV9MSUNFTlNFX0ZJTEUKLU5PX0xJQ0VOU0VfRklMRSA9IE5PX0xJQ0VOU0VfRklMRQotZW5kaWYKLQotIwotIyBTZXQgdGhlIFJlbGVhc2UgdHlwZSB0aGF0IHlvdSB3YW50IHRvIGJ1aWxkLCBwb3NzaWJsZSB2YWx1ZXMgYXJlOgotIwotIyAgZGVidWcJCS0gZnVsbCBkZWJ1ZyBzd2l0Y2hlcyBhcmUgc2V0Ci0jICBub29wdAkJLSBub3JtYWwgc3dpdGNoZXMgYXJlIHNldCAoZGVmYXVsdCkKLSMgIG9wdGltaXplZAktIG9wdGltaXphdGlvbiBzd2l0Y2hlcyBhcmUgc2V0Ci0KLWlmZGVmIHJlbHR5cGUKLVJFTEVBU0U9JChyZWx0eXBlKQotZW5kaWYKLQotaWZkZWYgUkVMVFlQRQotUkVMRUFTRT0kKFJFTFRZUEUpCi1lbmRpZgotCi1pZmRlZiBkZWJ1ZwotUkVMRUFTRT1kZWJ1ZwotZW5kaWYKLQotaWZkZWYgREVCVUcKLVJFTEVBU0U9ZGVidWcKLWVuZGlmCi0KLWlmZGVmIG9wdGltaXplZAotUkVMRUFTRT1vcHRpbWl6ZWQKLWVuZGlmCi0KLWlmZGVmIE9QVElNSVpFRAotUkVMRUFTRT1vcHRpbWl6ZWQKLWVuZGlmCi0KLWlmbmRlZiBSRUxFQVNFCi1SRUxFQVNFID0gb3B0aW1pemVkCi1lbmRpZgotCi1pZmVxICIkKFJFTEVBU0UpIiAiZGVidWciCi1PQkpESVIgPSBEZWJ1ZwotZW5kaWYKLQotaWZlcSAiJChSRUxFQVNFKSIgIm5vb3B0IgotT0JKRElSID0gTm9vcHQKLWVuZGlmCi0KLWlmZXEgIiQoUkVMRUFTRSkiICJvcHRpbWl6ZWQiCi1PQkpESVIgPSBSZWxlYXNlCi1lbmRpZgotCi0jCi0jIFNldHVwIGNvbXBpbGVyIGluZm9ybWF0aW9uCi0jCi0KLSMgTWV0cm9XZXJrcyBOTE0gdG9vbHMKLUNDCQk9IG13Y2NubG0KLUNQUAkJPSBtd2NjbmxtCi1MSU5LCT0gbXdsZG5sbQotTElCCQk9IG13bGRubG0gLXR5cGUgbGlicmFyeSAtdyBub2NtZGxpbmUKLQotTk9WSQk9ICQoTk9WRUxMTElCQylcaW1wb3J0cwotCi1JTkNESVJTIAk9ICQoTk9WRUxMTElCQylcaW5jbHVkZTskKE5PVkVMTExJQkMpXGluY2x1ZGVcbmtzOyQoTk9WRUxMTElCQylcaW5jbHVkZVx3aW5zb2NrOwotCi1ERUZJTkVTCQk9IC1ETkVUV0FSRQotCi0jCi0jIE1ldHJvV2Vya3Mgc3RhdGljIExpYnJhcmllcwotCi1DTElCM1MJPSAkKE1FVFJPV0VSS1MpXE5vdmVsbCBTdXBwb3J0XE1ldHJvd2Vya3MgU3VwcG9ydFxMaWJyYXJpZXNcUnVudGltZVxtd2NydGwubGliCi1NQVRIM1MJPQotUExJQjNTCT0gJChNRVRST1dFUktTKVxOb3ZlbGwgU3VwcG9ydFxNZXRyb3dlcmtzIFN1cHBvcnRcTGlicmFyaWVzXE1TTCBDKytcTVdDUFAubGliCi0KLSMgQmFzZSBjb21waWxlIGZsYWdzCi0jIGFuZCBwcmVmaXggb3IgcHJlY29tcGlsZWQgaGVhZGVyIGFkZGVkIGhlcmUuCi0KLSMgVGhlIGRlZmF1bHQgZmxhZ3MgYXJlIGFzIGZvbGxvd3M6Ci0jCi0jIC1jICAgICAgICAgICAgICAgICAgICBjb21waWxlIG9ubHksIG5vIGxpbmsKLSMgLW5vc3lzcGF0aCAgICAgICAgICAgIHRyZWF0ICNpbmNsdWRlIDwuLi4+IGxpa2UgI2luY2x1ZGUgIi4uLiIKLSMgLUNwcF9leGNlcHRpb25zIG9mZiAgIGRpc2FibGUgQysrIGV4Y2VwdGlvbnMKLSMgLVJUVEkgb2ZmICAgICAgICAgICAgIGRpc2FibGUgQysrIHJ1bi10aW1lIHR5cGluZyBpbmZvcm1hdGlvbgotIyAtYWxpZ24gNCAgICAgICAgICAgICAgYWxpZ24gb24gNCBieXRlIGJvdW5kZXJpZXMKLSMgLXcgbm9jbWRsaW5lICAgICAgICAgIGRpc2FibGUgY29tbWFuZC1saW5lIGRyaXZlci9wYXJzZXIgd2FybmluZ3MKLSMgLXByb2MgUElJICAgICAgICAgICAgIGdlbmVyYXRlIGNvZGUgYmFzZSBvbiBQZW50aXVtIElJIGluc3RydWN0aW9uIHNldAotIyAtaW5zdCBtbXggICAgICAgICAgICAgdXNlIE1NWCBleHRlbnNpb25zCi0KLUNGTEFHUyA9IC1jIC1ub3N5c3BhdGggLUNwcF9leGNlcHRpb25zIG9mZiAtUlRUSSBvZmYgLWFsaWduIDQgLXcgbm9jbWRsaW5lIC1wcm9jIFBJSSAtaW5zdCBtbXgKLQotIyAtZyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uCi0jIC1PMSAgICAgICAgICAgICAgICAgICBsZXZlbCAxIG9wdGltaXphdGlvbnMKLQotaWZlcSAiJChSRUxFQVNFKSIgImRlYnVnIgotQ0ZMQUdTICs9IC1nIC1PMQotZW5kaWYKLQotIyAtTzQscCAgICAgICAgICAgICAgICAgbGV2ZWwgNCBvcHRpbWl6YXRpb25zLCBvcHRpbWl6ZSBmb3Igc3BlZWQKLWlmZXEgIiQoUkVMRUFTRSkiICJvcHRpbWl6ZWQiCi1DRkxBR1MgKz0gLU80LHAKLWVuZGlmCi0KLSMgLXByZWZpeCBwcmVfbncuaCAgICAgICNpbmNsdWRlIHByZV9udy5oIGZvciBhbGwgZmlsZXMKLQotQ0ZMQUdTICs9IC1wcmVmaXggcHJlX253LmgKLQotCi1QQVRIOj0kKFBBVEgpOyQoTUVUUk9XRVJLUylcYmluOyQoTUVUUk9XRVJLUylcT3RoZXIgTWV0cm93ZXJrcyBUb29sc1xDb21tYW5kIExpbmUgVG9vbHMKLQotIwotIyBEZWNsYXJlIG1ham9yIHByb2plY3QgZGVsaXZlcmFibGVzIG91dHB1dCBkaXJlY3RvcmllcyBoZXJlCi0jCi0KLWlmZGVmIERFU1QKLUlOU1RBTEwgPSAkKERFU1QpCi1pZmVxIChcLCAkKGZpbmRzdHJpbmcgXCwkKElOU1RBTEwpKSkKLUlOU1RESVJTID0gJChERVNUKQotZW5kaWYKLWVuZGlmCi0KLWlmZGVmIGRlc3QKLUlOU1RBTEwgPSAkKGRlc3QpCi1pZmVxIChcLCAkKGZpbmRzdHJpbmcgXCwkKElOU1RBTEwpKSkKLUlOU1RESVJTID0gJChkZXN0KQotZW5kaWYKLWVuZGlmCi0KLWlmbmRlZiBJTlNUQUxMCi1JTlNUQUxMID0gJChBUF9XT1JLKVwuLlxEaXN0Ci1JTlNURElSUyA9ICQoQVBfV09SSylcLi5cRGlzdAotZW5kaWYKLQotSU5TVERFVkRJUlMgOj0gXAotICAgICQoSU5TVERJUlMpIFwKLQkkKElOU1RBTEwpXEFwYWNoZTJcaW5jbHVkZSBcCi0JJChJTlNUQUxMKVxBcGFjaGUyXGxpYiBcCi0KLUlOU1RESVJTICs9IFwKLQkkKElOU1RBTEwpXEFwYWNoZTIgXAotCSQoSU5TVEFMTClcQXBhY2hlMlxjZ2ktZXhhbXBsZXMgXAotCSQoSU5TVEFMTClcQXBhY2hlMlxjb25mIFwKLQkkKElOU1RBTEwpXEFwYWNoZTJcZXJyb3IgXAotCSQoSU5TVEFMTClcQXBhY2hlMlxlcnJvclxpbmNsdWRlIFwKLQkkKElOU1RBTEwpXEFwYWNoZTJcaHRkb2NzIFwKLQkkKElOU1RBTEwpXEFwYWNoZTJcaWNvbnMgXAotCSQoSU5TVEFMTClcQXBhY2hlMlxpY29uc1xzbWFsbCBcCi0JJChJTlNUQUxMKVxBcGFjaGUyXGxvZ3MgXAotCSQoSU5TVEFMTClcQXBhY2hlMlxtYW4gXAotCSQoSU5TVEFMTClcQXBhY2hlMlxtYW51YWwgXAotCSQoSU5TVEFMTClcQXBhY2hlMlxtYW51YWxcZGV2ZWxvcGVyIFwKLQkkKElOU1RBTEwpXEFwYWNoZTJcbWFudWFsXGZhcSBcCi0JJChJTlNUQUxMKVxBcGFjaGUyXG1hbnVhbFxob3d0byBcCi0JJChJTlNUQUxMKVxBcGFjaGUyXG1hbnVhbFxpbWFnZXMgXAotCSQoSU5TVEFMTClcQXBhY2hlMlxtYW51YWxcbWlzYyBcCi0JJChJTlNUQUxMKVxBcGFjaGUyXG1hbnVhbFxtb2QgXAotCSQoSU5TVEFMTClcQXBhY2hlMlxtYW51YWxccGxhdGZvcm0gXAotCSQoSU5TVEFMTClcQXBhY2hlMlxtYW51YWxccHJvZ3JhbXMgXAotCSQoSU5TVEFMTClcQXBhY2hlMlxtYW51YWxcc2VhcmNoIFwKLQkkKElOU1RBTEwpXEFwYWNoZTJcbWFudWFsXHNzbCBcCi0JJChJTlNUQUxMKVxBcGFjaGUyXG1hbnVhbFx2aG9zdHMgXAotCSQoSU5TVEFMTClcQXBhY2hlMlxtb2R1bGVzIFwKLQotIwotIyBEZWNsYXJlIENvbW1hbmQgYW5kIHRvb2wgbWFjcm9zIGhlcmUKLSMKLQotIyBPczJMaWJQYXRoIGlzIGFuIGV4dHJhIGNoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgb24gTlQKLWlmZGVmIE9zMkxpYlBhdGgKLU9TID0gV2luZG93c19OVAotZW5kaWYKLQotaWZlcSAiJChPUykiICJXaW5kb3dzX05UIgotQ01EPWNtZCAvQwotQ0hLPWNtZCAvQyBpZiBleGlzdAotQ0hLTk9UPWNtZCAvQyBpZiBub3QgZXhpc3QKLURFTCA9IGRlbCAvRgotREVMVFJFRSA9IGNtZCAvQyByZCAvcy9xCi1XSU5OVD0xCi1lbHNlCi1DTUQ9Y29tbWFuZCAvQwotQ0hLPWNvbW1hbmQgL0MgaWYgZXhpc3QKLUNIS05PVD1jb21tYW5kIC9DIGlmIG5vdCBleGlzdAotREVMID0gZGVsCi1ERUxUUkVFID0gZGVsdHJlZSAveQotZW5kaWYKLQotCi0jCi0jIFNldHVwIGJhc2UgQyBjb21waWxlciBmbGFncwotIwotCi0jCi0jIENvbW1vbiBkaXJlY3RvcmllcwotIwotCi1TVERNT0QJCT0gJChBUF9XT1JLKS9tb2R1bGVzCi1OV09TCQk9ICQoQVBfV09SSykvb3MvbmV0d2FyZQotU0VSVkVSCQk9ICQoQVBfV09SSykvc2VydmVyCi1TUkMJCQk9ICQoQVBfV09SSykKLUFQUgkJCT0gJChBUF9XT1JLKS9zcmNsaWIvYXByCi1BUFJVVElMCQk9ICQoQVBfV09SSykvc3JjbGliL2Fwci11dGlsCi1TVVBNT0QJCT0gJChBUF9XT1JLKS9zdXBwb3J0Ci1QQ1JFCQk9ICQoQVBfV09SSykvc3JjbGliL3BjcmUKLUFQUlRFU1QJCT0gJChBUF9XT1JLKS9zcmNsaWIvYXByL3Rlc3QKLUhUVFBECQk9ICQoQVBfV09SSykvbW9kdWxlcy9odHRwCi1YTUwJCQk9ICQoQVBfV09SSykvc3JjbGliL2Fwci11dGlsL3htbAotCi0jCi0jIEludGVybmFsIExpYnJhcmllcwotIwotCi1BUFJMSUIJCT0gJChBUFIpLyQoT0JKRElSKS9hcHJsaWIubGliCi1BUFJVVExJQgk9ICQoQVBSVVRJTCkvJChPQkpESVIpL2FwcnV0aWwubGliCi1TVE1PRExJQgk9ICQoU1RETU9EKS8kKE9CSkRJUikvc3RkbW9kLmxpYgotUENSRUxJQgkJPSAkKFBDUkUvJChPQkpESVIpL3BjcmUubGliCi1OV09TTElCCQk9ICQoTldPUykvJChPQkpESVIpL25ldHdhcmUubGliCi1TRVJWTElCCQk9ICQoU0VSVkVSKS8kKE9CSkRJUikvc2VydmVyLmxpYgotSFRUUERMSUIJPSAkKEhUVFBEKS8kKE9CSkRJUikvaHR0cGQubGliCi1YTUxMSUIJCT0gJChYTUwpLyQoT0JKRElSKS94bWxsaWIubGliCi0KLSMKLSMgQWRkaXRpb25hbCBnZW5lcmFsIGRlZmluZXMKLSMKLVZFUlNJT04JCT0gMiwwLDAKLQkJCQotRW52aXJvbm1lbnREZWZpbmVkID0gMQotZW5kaWYgIyBpZm5kZWYgRW52aXJvbm1lbnREZWZpbmVkCi0KLSMgVGhpcyBpcyBhbHdheXMgc2V0IHNvIHRoYXQgaXQgd2lsbCBzaG93IHVwIGluIGxvd2VyIGRpcmVjdG9yaWVzCi0KLWlmZGVmIFBhdGgKLVBhdGggPSAkKFBBVEgpCi1lbmRpZgotCmRpZmYgLS1naXQgYS9idWlsZC9OV0dOVWhlYWQuaW5jIGIvYnVpbGQvTldHTlVoZWFkLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4NTVhYi4uMDAwMDAwMAotLS0gYS9idWlsZC9OV0dOVWhlYWQuaW5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLSMKLSMgT2J0YWluIHRoZSBnbG9iYWwgYnVpbGQgZW52aXJvbm1lbnQKLSMKLQotaW5jbHVkZSAkKEFQX1dPUkspXGJ1aWxkXE5XR05VZW52aXJvbm1lbnQuaW5jCi0KLSMKLSMgRGVmaW5lIGJhc2UgdGFyZ2V0cyBhbmQgcnVsZXMKLSMgCi0KLVRBUkdFVFMgPSBsaWJzIG5sbXMgaW5zdGFsbCBjbG9iYmVyX2xpYnMgY2xvYmJlcl9ubG1zIGNsZWFuIGluc3RhbGxkZXYKLQotLlBIT05ZIDogJChUQVJHRVRTKSBkZWZhdWx0IGFsbCBoZWxwICQoTk9fTElDRU5TRV9GSUxFKQotCi0jIEhlcmUgaXMgd2hlcmUgd2Ugd2lsbCB1c2UgdGhlIE5PX0xJQ0VOU0VfRklMRSB2YXJpYWJsZSB0byBzZWUgaWYgd2UgbmVlZCB0bwotIyByZXN0YXJ0IHRoZSBtYWtlIHdpdGggaXQgZGVmaW5lZAotCi1pZmRlZiBOT19MSUNFTlNFX0ZJTEUKLQotZGVmYXVsdDogTk9fTElDRU5TRV9GSUxFCi0KLWFsbDogTk9fTElDRU5TRV9GSUxFCi0KLWluc3RhbGwgOjogTk9fTElDRU5TRV9GSUxFCi0KLWluc3RhbGxkZXYgOjogTk9fTElDRU5TRV9GSUxFCi0KLU5PX0xJQ0VOU0VfRklMRSA6Ci0JJChNQUtFKSAkKE1BS0VDTURHT0FMUykgLWYgTldHTlVtYWtlZmlsZSBSRUxFQVNFPSQoUkVMRUFTRSkgREVTVD0iJChJTlNUQUxMKSIgTE1fTElDRU5TRV9GSUxFPSIkKE1FVFJPV0VSS1MpXGxpY2Vuc2UuZGF0IgotCi1lbHNlICMgTE1fTElDRU5TRV9GSUxFIG11c3QgYmUgZGVmaW5lZCBzbyB1c2UgdGhlIHJlYWwgdGFyZ2V0cwotCi1kZWZhdWx0OiAkKFNVQkRJUlMpIGxpYnMgbmxtcwotCi1hbGw6ICQoU1VCRElSUykgbGlicyBubG1zIGluc3RhbGwKLQotJChUQVJHRVRTKSA6OiAkKFNVQkRJUlMpCi0KLWluc3RhbGwgOjogbmxtcyAkKElOU1RESVJTKQotCi1pbnN0YWxsZGV2IDo6ICQoSU5TVERFVkRJUlMpCi0KLSQoSU5TVERJUlMpIDo6Ci0JJChDSEtOT1QpICRAXE5VTCBta2RpciAkQAotCi0kKElOU1RERVZESVJTKSA6OgotCSQoQ0hLTk9UKSAkQFxOVUwgbWtkaXIgJEAKLQotZW5kaWYgI05PX0xJQ0VOU0VfRklMRSBjaGVjawotCi1oZWxwIDoKLQlAZWNobyB0YXJnZXRzIGZvciBSRUxFQVNFPSQoUkVMRUFTRSk6Ci0JQGVjaG8gKGRlZmF1bHQpIC4gLiAuIC4gbGlicyBubG1zCi0JQGVjaG8gYWxsIC4gLiAuIC4gLiAuIC4gZG9lcyBldmVyeXRoaW5nIChsaWJzIG5sbXMgaW5zdGFsbCkKLQlAZWNobyBsaWJzLiAuIC4gLiAuIC4gLiBidWlsZHMgYWxsIGxpYnMKLQlAZWNobyBubG1zLiAuIC4gLiAuIC4gLiBidWlsZHMgYWxsIG5sbXMKLQlAZWNobyBpbnN0YWxsIC4gLiAuIC4gLiBidWlsZHMgbGlicyBhbmQgbmxtcyBhbmQgY29waWVzIGluc3RhbGwgZmlsZXMgdG8KLQlAZWNobyAgICAgICAgICAgICAgICAgICAiJChJTlNUQUxMKSIKLQlAZWNobyBjbGVhbiAuIC4gLiAuIC4gLiBkZWxldGVzICQoT0JKRElSKSBkaXJzLCAqLmVyciwgYW5kICoubWFwCi0JQGVjaG8gY2xvYmJlcl9hbGwgLiAuIC4gZGVsZXRlcyBhbGwgcG9zc2libGUgb3V0cHV0IGZyb20gdGhlIG1ha2UKLQlAZWNobyBjbG9iYmVyX2luc3RhbGwgLiBkZWxldGVzIGFsbCBmaWxlcyBpbiAkKElOU1RBTEwpCi0JQCQoQ01EKSBlY2hvLgotCUBlY2hvIE11bHRpcGxlIHRhcmdldHMgY2FuIGJlIHVzZWQgb24gYSBzaW5nbGUgbm1ha2UgY29tbWFuZCBsaW5lIC0KLQlAZWNobyAoaS5lLiAkKE1BS0UpIGNsZWFuIGFsbCkKLQlAJChDTUQpIGVjaG8uCi0JQGVjaG8gWW91IGNhbiBhbHNvIHNwZWNpZnkgUkVMRUFTRT1kZWJ1ZywgUkVMRUFTRT1ub29wdCwgb3IgUkVMRUFTRT1vcHRpbWl6ZWQKLQlAZWNobyBUaGUgZGVmYXVsdCBpcyBSRUxFQVNFPW9wdGltaXplZAotCi1jbG9iYmVyX2FsbCA6OiBjbGVhbiBjbG9iYmVyX2luc3RhbGwKLQotY2xvYmJlcl9pbnN0YWxsIDo6Ci0JLSQoREVMVFJFRSkgJChJTlNUQUxMKSAyPk5VTAotCi0jCi0jIGJ1aWxkIHJlY3Vyc2l2ZSB0YXJnZXRzCi0jCi0KLSQoU1VCRElSUykgOiBGT1JDRQotaWZuZXEgIiQoTUFLRUNNREdPQUxTKSIgImNsZWFuIgotCSQoQ01EKSBlY2hvLgotCUBlY2hvIEJ1aWxkaW5nICQoQ1VSRElSKS8kQAotZW5kaWYKLQkkKE1BS0UpIC1DICRAICQoTUFLRUNNREdPQUxTKSAtZiBOV0dOVW1ha2VmaWxlIFJFTEVBU0U9JChSRUxFQVNFKSBERVNUPSIkKElOU1RBTEwpIiBMTV9MSUNFTlNFX0ZJTEU9IiQoTE1fTElDRU5TRV9GSUxFKSIKLQkkKENNRCkgZWNoby4KLQotRk9SQ0U6Ci0KLSMKLSMgU3RhbmRhcmQgdGFyZ2V0cwotIwotCi1jbGVhbiA6OiAkKFNVQkRJUlMpCi0JQGVjaG8gQ2xlYW5pbmcgdXAgJChDVVJESVIpCi0JLSQoREVMVFJFRSkgJChPQkpESVIpIDI+IE5VTAotCSQoQ0hLKSAqLmVyciAkKERFTCkgKi5lcnIKLQkkKENISykgKi5tYXAgJChERUwpICoubWFwCi0JJChDSEspICouZCAkKERFTCkgKi5kCi0JJChDSEspICoudG1wICQoREVMKSAqLnRtcAotCS0kKERFTFRSRUUpICQoT0JKRElSKSAyPiBOVUwKLQotJChPQkpESVIpIDo6Ci0JJChDSEtOT1QpICQoT0JKRElSKVxudWwgbWtkaXIgJChPQkpESVIpCi0KZGlmZiAtLWdpdCBhL2J1aWxkL05XR05VbWFrZWZpbGUgYi9idWlsZC9OV0dOVW1ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWVlZjg0Li4wMDAwMDAwCi0tLSBhL2J1aWxkL05XR05VbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jCi0jIERlY2xhcmUgdGhlIHN1Yi1kaXJlY3RvcmllcyB0byBiZSBidWlsdCBoZXJlCi0jCi0KLVNVQkRJUlMgPSBcCi0JJChFT0xJU1QpIAotCi0jCi0jIEdldCB0aGUgJ2hlYWQnIG9mIHRoZSBidWlsZCBlbnZpcm9ubWVudC4gIFRoaXMgaW5jbHVkZXMgZGVmYXVsdCB0YXJnZXRzIGFuZAotIyBwYXRocyB0byB0b29scwotIwotCi1pbmNsdWRlICQoQVBfV09SSylcYnVpbGRcTldHTlVoZWFkLmluYwotCi0jCi0jIGJ1aWxkIHRoaXMgbGV2ZWwncyBmaWxlcwotCi1GSUxFU19wcmVidWlsZF9oZWFkZXJzID0gXAotCSQoQVBSKS9pbmNsdWRlL2Fwci5oIFwKLQkkKEFQUlVUSUwpL2luY2x1ZGUvYXB1LmggXAotCSQoQVBSVVRJTCkvaW5jbHVkZS9hcHJfbGRhcC5oIFwKLQkkKFBDUkUpL2NvbmZpZy5oIFwKLQkkKFBDUkUpL3BjcmUuaCBcCi0JJChFT0xJU1QpIAotICAgIAotbmxtcyA6OiAkKE5XT1MpL2h0dHBkLmltcAotCi0kKE5XT1MpL2h0dHBkLmltcCA6IG1ha2VfbndfZXhwb3J0LmF3ayBud19leHBvcnQuaQotCUBlY2hvIEdlbmVyYXRpbmcgJChzdWJzdCAvLFwsJEApCi0JYXdrIC1mIG1ha2VfbndfZXhwb3J0LmF3ayBud19leHBvcnQuaSB8IHNvcnQgPiQoTldPUykvaHR0cGQuaW1wCi0gICAgCi1ud19leHBvcnQuaSA6IG53X2V4cG9ydC5pbmMgJChGSUxFU19wcmVidWlsZF9oZWFkZXJzKSBjYy5vcHQKLQlAZWNobyBHZW5lcmF0aW5nICQoc3Vic3QgLyxcLCRAKQotCSQoQ0MpICQ8IEBjYy5vcHQKLQotY2Mub3B0IDogTldHTlVtYWtlZmlsZSAkKEFQX1dPUkspXGJ1aWxkXE5XR05VZW52aXJvbm1lbnQuaW5jICQoQVBfV09SSylcYnVpbGRcTldHTlV0YWlsLmluYyAkKEFQX1dPUkspXGJ1aWxkXE5XR05VaGVhZC5pbmMKLQkkKENISykgJEAgJChERUwpICRACi0JQGVjaG8gLVAgPj4gJEAKLQlAZWNobyAtRVAgPj4gJEAKLQlAZWNobyAtbm9zeXNwYXRoID4+ICRACi0JQGVjaG8gLXcgbm9jbWRsaW5lID4+ICRACi0JQGVjaG8gLURORVRXQVJFID4+ICRACi0JQGVjaG8gLURDT1JFX1BSSVZBVEUgPj4gJEAKLQlAZWNobyAtSS4uXGluY2x1ZGUgPj4gJEAKLQlAZWNobyAtSS4uXG1vZHVsZXNcaHR0cCA+PiAkQAotCUBlY2hvIC1JLi5cb3NcbmV0d2FyZSA+PiAkQAotCUBlY2hvIC1JLi5cc2VydmVyXG1wbVxuZXR3YXJlID4+ICRACi0JQGVjaG8gLUkuLlxzcmNsaWJcYXByXGluY2x1ZGUgPj4gJEAKLQlAZWNobyAtSS4uXHNyY2xpYlxhcHItdXRpbFxpbmNsdWRlID4+ICRACi0JQGVjaG8gLWlyICQoTk9WRUxMTElCQykgPj4gJEAKLQotJChBUFIpL2luY2x1ZGUvJS5oOiAkKHN1YnN0IC8sXCwkKEFQUikpXGluY2x1ZGVcJS5obncKLQlAZWNobyBDcmVhdGluZyAkKHN1YnN0IC8sXCwkQCkKLQljb3B5ICQ8ICQoc3Vic3QgLyxcLCQoQVBSKSlcaW5jbHVkZVwkKEBGKQotCi0kKEFQUlVUSUwpL2luY2x1ZGUvJS5oOiAkKHN1YnN0IC8sXCwkKEFQUlVUSUwpKVxpbmNsdWRlXCUuaG53Ci0JQGVjaG8gQ3JlYXRpbmcgJChzdWJzdCAvLFwsJEApCi0JY29weSAkPCAkKHN1YnN0IC8sXCwkKEFQUlVUSUwpKVxpbmNsdWRlXCQoQEYpCi0KLSQoUENSRSkvJS5oOiAkKHN1YnN0IC8sXCwkKFBDUkUpKVwlLmh3Ci0JQGVjaG8gQ3JlYXRpbmcgJChzdWJzdCAvLFwsJEApCi0JY29weSAkPCAkKHN1YnN0IC8sXCwkKFBDUkUpKVwkKEBGKQotCi0jCi0jIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IGlmIGFsbCB0aGF0IGlzIG5lZWRlZCBpcyB0byBjb3B5IGZpbGVzIHRvIHRoZQotIyBpbnN0YWxsYXRpb24gYXJlYQotIwotaW5zdGFsbCA6OiBubG1zIEZPUkNFCi0JCi0KLWNsZWFuIDo6Ci0JJChDSEspIG53X2V4cG9ydC5pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoREVMKSBud19leHBvcnQuaQotCSQoQ0hLKSBjYy5vcHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKERFTCkgY2Mub3B0Ci0JJChDSEspICQoc3Vic3QgLyxcLCQoQVBSKSlcaW5jbHVkZVxhcHIuaCAgICAgICAgICAgICQoREVMKSAkKHN1YnN0IC8sXCwkKEFQUikpXGluY2x1ZGVcYXByLmgKLQkkKENISykgJChzdWJzdCAvLFwsJChBUFJVVElMKSlcaW5jbHVkZVxhcHUuaCAgICAgICAgJChERUwpICQoc3Vic3QgLyxcLCQoQVBSVVRJTCkpXGluY2x1ZGVcYXB1LmgKLQkkKENISykgJChzdWJzdCAvLFwsJChBUFJVVElMKSlcaW5jbHVkZVxhcHJfbGRhcC5oICAgJChERUwpICQoc3Vic3QgLyxcLCQoQVBSVVRJTCkpXGluY2x1ZGVcYXByX2xkYXAuaAotCSQoQ0hLKSAkKHN1YnN0IC8sXCwkKFBDUkUpKVxjb25maWcuaCAgICAgICAgICAgICAgICAkKERFTCkgJChzdWJzdCAvLFwsJChQQ1JFKSlcY29uZmlnLmgKLQkkKENISykgJChzdWJzdCAvLFwsJChQQ1JFKSlccGNyZS5oICAgICAgICAgICAgICAgICAgJChERUwpICQoc3Vic3QgLyxcLCQoUENSRSkpXHBjcmUuaAotCSQoQ0hLKSAkKHN1YnN0IC8sXCwkKE5XT1MpKVxodHRwZC5pbXAgICAgICAgICAgICAgICAkKERFTCkgJChzdWJzdCAvLFwsJChOV09TKSlcaHR0cGQuaW1wCi0gICAgCmRpZmYgLS1naXQgYS9idWlsZC9OV0dOVXRhaWwuaW5jIGIvYnVpbGQvTldHTlV0YWlsLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE1ZjE5Ny4uMDAwMDAwMAotLS0gYS9idWlsZC9OV0dOVXRhaWwuaW5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLSMKLSMgVGhpcyBjb250YWlucyBmaW5hbCB0YXJnZXRzIGFuZCBzaG91bGQgYmUgaW5jbHVkZWQgYXQgdGhlIGVuZCBvZiBhbnkKLSMgTldHTlVtYWtlZmlsZSBmaWxlCi0jCi0KLSMKLSMgSWYgd2UgYXJlIGdvaW5nIHRvIGNyZWF0ZSBhbiBubG0sIG1ha2Ugc3VyZSB3ZSBoYXZlIGFzc2lnbmVkIHZhcmlhYmxlcyB0byAKLSMgdXNlIGR1cmluZyB0aGUgbGluay4KLSMKLWVjaG8gTkxNX05BTUU9JChOTE1fTkFNRSkKLWlmbmRlZiBOTE1fTkFNRQotTkxNX05BTUUgPSAkKFRBUkdFVF9ubG0pCi1lbmRpZgotCi1pZm5kZWYgTkxNX0RFU0NSSVBUSU9OCi1OTE1fREVTQ1JJUFRJT04gPSAkKE5MTV9OQU1FKQotZW5kaWYKLQotaWZuZGVmIE5MTV9USFJFQURfTkFNRQotTkxNX1RIUkVBRF9OQU1FID0gJChOTE1fTkFNRSkgVGhyZWFkCi1lbmRpZgotCi0jCi0jIENyZWF0ZSBkZXBlbmRlbmN5IGxpc3RzIGJhc2VkIG9uIHRoZSBmaWxlcyBhdmFpbGFibGUKLSMKLQotQ0NPUFRfREVQRU5EUyAJPSBcCi0JCQkJJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jIFwKLQkJCQkkKEFQX1dPUkspXGJ1aWxkXE5XR05VZW52aXJvbm1lbnQuaW5jIFwKLQkJCQkkKEFQX1dPUkspXGJ1aWxkXE5XR05VdGFpbC5pbmMgXAotCQkJCU5XR05VbWFrZWZpbGUgXAotCQkJCSQoQ1VTVE9NX0lOSSkgXAotCQkJCSQoRU9MSVNUKQotICAgICAgICAgICAgICAgIAotQ1BQT1BUX0RFUEVORFMJPSBcCi0JCQkJJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jIFwKLQkJCQkkKEFQX1dPUkspXGJ1aWxkXE5XR05VZW52aXJvbm1lbnQuaW5jIFwKLQkJCQkkKEFQX1dPUkspXGJ1aWxkXE5XR05VdGFpbC5pbmMgXAotCQkJCU5XR05VbWFrZWZpbGUgXAotCQkJCSQoQ1VTVE9NX0lOSSkgXAotCQkJCSQoRU9MSVNUKQotCi0kKE5MTV9OQU1FKV9MSU5LT1BUX0RFUEVORFMJPSBcCi0JCQkJJChUQVJHRVRfbGliKSBcCi0JCQkJJChBUF9XT1JLKVxidWlsZFxOV0dOVWVudmlyb25tZW50LmluYyBcCi0JCQkJTldHTlVtYWtlZmlsZSBcCi0JCQkJJChBUF9XT1JLKVxidWlsZFxOV0dOVXRhaWwuaW5jIFwKLQkJCQkkKENVU1RPTV9JTkkpIFwKLQkJCQkkKEVPTElTVCkKLQotaWZlcSAiJCh3b3JkcyAkKHN0cmlwICQoVEFSR0VUX2xpYikpKSIgIjEiCi1MSUJfTkFNRQkJCQkJPSAkKGJhc2VuYW1lICQobm90ZGlyICQoVEFSR0VUX2xpYikpKQotJChMSUJfTkFNRSlfTElCTFNUX0RFUEVORFMJPSBcCi0JCQkJJChGSUxFU19saWJfb2JqcykgXAotCQkJCSQoQVBfV09SSylcYnVpbGRcTldHTlVlbnZpcm9ubWVudC5pbmMgXAotCQkJCU5XR05VbWFrZWZpbGUgXAotCQkJCSQoQVBfV09SSylcYnVpbGRcTldHTlV0YWlsLmluYyBcCi0JCQkJJChDVVNUT01fSU5JKSBcCi0JCQkJJChFT0xJU1QpCi1lbmRpZgotCi1pZmVxICIkKHdpbGRjYXJkIE5XR05VJChMSUJfTkFNRSkpIiAiTldHTlUkKExJQl9OQU1FKSIKLSQoTElCX05BTUUpX0xJQkxTVF9ERVBFTkRTCSs9IE5XR05VJChMSUJfTkFNRSkKLWVuZGlmCi0KLWlmZXEgIiQod2lsZGNhcmQgTldHTlUkKE5MTV9OQU1FKSkiICJOV0dOVSQoTkxNX05BTUUpIgotJChOTE1fTkFNRSlfTElOS09QVF9ERVBFTkRTCSs9IE5XR05VJChOTE1fTkFNRSkKLUNDT1BUX0RFUEVORFMgCSs9IE5XR05VJChOTE1fTkFNRSkKLUNQUE9QVF9ERVBFTkRTIAkrPSBOV0dOVSQoTkxNX05BTUUpCi1lbmRpZgotCi0jCi0jIEdlbmVyaWMgY29tcGlsZXIgcnVsZXMKLSMKLQotJChPQkpESVIpLyUubzogJS5jICQoT0JKRElSKVxjYy5vcHQKLQlAZWNobyBDb21waWxpbmcgJDwKLQkkKENDKSAkPCAtbz0kKE9CSkRJUilcJChARikgQCQoT0JKRElSKVxjYy5vcHQgCi0KLSQoT0JKRElSKVxjYy5vcHQ6ICQoQ0NPUFRfREVQRU5EUykKLQkkKENISykgJEAgJChERUwpICRACi0JQGVjaG8gR2VuZXJhdGluZyAkQAotaWZuZXEgIiQoc3RyaXAgJChDRkxBR1MpKSIgIiIKLQlAZWNobyAkKENGTEFHUykgPj4gJEAKLWVuZGlmCQotaWZuZXEgIiQoc3RyaXAgJChYQ0ZMQUdTKSkiICIiCi0JQGVjaG8gJChYQ0ZMQUdTKSA+PiAkQAotZW5kaWYKLWlmbmVxICIkKHN0cmlwICQoWElOQ0RJUlMpKSIgIiIKLQlAZWNobyAkKGZvcmVhY2ggeGluY2RpciwkKHN0cmlwICQoc3Vic3QgOywkKFNQQUNFKSwkKFhJTkNESVJTKSkpLC1JJCh4aW5jZGlyKSkgPj4gJEAKLWVuZGlmCQotaWZuZXEgIiQoc3RyaXAgJChJTkNESVJTKSkiICIiCi0JQGVjaG8gJChmb3JlYWNoIGluY2RpciwkKHN0cmlwICQoc3Vic3QgOywkKFNQQUNFKSwkKElOQ0RJUlMpKSksLUkkKGluY2RpcikpID4+ICRACi1lbmRpZgotaWZuZXEgIiQoc3RyaXAgJChERUZJTkVTKSkiICIiIAotCUBlY2hvICQoREVGSU5FUykgPj4gJEAKLWVuZGlmCi1pZm5lcSAiJChzdHJpcCAkKFhERUZJTkVTKSkiICIiIAotCUBlY2hvICQoWERFRklORVMpID4+ICRACi1lbmRpZgotCi0kKE9CSkRJUikvJS5vOiAlLmNwcCAkKE9CSkRJUilcY3BwLm9wdAotCUBlY2hvIENvbXBpbGluZyAkPAotCSQoQ1BQKSAkPCAtbz0kKE9CSkRJUilcJChARikgQCQoT0JKRElSKVxjcHAub3B0IAotCi0kKE9CSkRJUilcY3BwLm9wdDogJChDUFBPUFRfREVQRU5EUykKLQkkKENISykgJEAgJChERUwpICRACi0JQGVjaG8gR2VuZXJhdGluZyAkQAotaWZuZXEgIiQoc3RyaXAgJChDRkxBR1MpKSIgIiIKLQlAZWNobyAkKENGTEFHUykgPj4gJEAKLWVuZGlmCQotaWZuZXEgIiQoc3RyaXAgJChYQ0ZMQUdTKSkiICIiCi0JQGVjaG8gJChYQ0ZMQUdTKSA+PiAkQAotZW5kaWYKLWlmbmVxICIkKHN0cmlwICQoWElOQ0RJUlMpKSIgIiIKLQlAZWNobyAkKGZvcmVhY2ggeGluY2RpciwkKHN0cmlwICQoc3Vic3QgOywkKFNQQUNFKSwkKFhJTkNESVJTKSkpLC1JJCh4aW5jZGlyKSkgPj4gJEAKLWVuZGlmCQotaWZuZXEgIiQoc3RyaXAgJChJTkNESVJTKSkiICIiCi0JQGVjaG8gJChmb3JlYWNoIGluY2RpciwkKHN0cmlwICQoc3Vic3QgOywkKFNQQUNFKSwkKElOQ0RJUlMpKSksLUkkKGluY2RpcikpID4+ICRACi1lbmRpZgotaWZuZXEgIiQoc3RyaXAgJChERUZJTkVTKSkiICIiIAotCUBlY2hvICQoREVGSU5FUykgPj4gJEAKLWVuZGlmCi1pZm5lcSAiJChzdHJpcCAkKFhERUZJTkVTKSkiICIiIAotCUBlY2hvICQoWERFRklORVMpID4+ICRACi1lbmRpZgotCi0jCi0jIFJ1bGVzIHRvIGJ1aWxkIGxpYnJhcmllcwotIwotCi0jIElmIHdlIG9ubHkgaGF2ZSBvbmUgdGFyZ2V0IGxpYnJhcnkgdGhlbiBidWlsZCBpdAotCi1pZmVxICIkKHdvcmRzICQoc3RyaXAgJChUQVJHRVRfbGliKSkpIiAiMSIKLQotJChUQVJHRVRfbGliKSA6ICQoT0JKRElSKVwkKExJQl9OQU1FKV9saWIubHN0Ci0JQGVjaG8gR2VuZXJhdGluZyAkQAotCSQoQ0hLKSAkKE9CSkRJUilcJChARikgJChERUwpICQoT0JKRElSKVwkKEBGKQotCSQoTElCKSAtbyAkKE9CSkRJUilcJChARikgQCQ/Ci0gICAKLSQoT0JKRElSKVwkKExJQl9OQU1FKV9saWIubHN0OiAkKCQoTElCX05BTUUpX0xJQkxTVF9ERVBFTkRTKQotCSQoQ0hLKSAkQCAkKERFTCkgJEAKLQlAZWNobyBHZW5lcmF0aW5nICRACi1pZm5lcSAiJChzdHJpcCAkKEZJTEVTX2xpYl9vYmpzKSkiICIiCi0JQGVjaG8gJChmb3JlYWNoIG9iamZpbGUsJChGSUxFU19saWJfb2JqcyksJChzdWJzdCAvLFwsJChvYmpmaWxlKSkgKSA+PiAkQAotZW5kaWYKLQotZWxzZSAjIFdlIG11c3QgaGF2ZSBtb3JlIHRoYW4gb25lIHRhcmdldCBsaWJyYXJ5IHNvIGxvYWQgdGhlIGluZGl2aWR1YWwgbWFrZWZpbGVzCi0KLSQoT0JKRElSKS8lLmxpYjogTldHTlUlICQoQVBfV09SSylcYnVpbGRcTldHTlVoZWFkLmluYyAkKEFQX1dPUkspXGJ1aWxkXE5XR05VdGFpbC5pbmMgJChBUF9XT1JLKVxidWlsZFxOV0dOVWVudmlyb25tZW50LmluYyBGT1JDRQotCUBlY2hvIENhbGxpbmcgJDwKLQkkKE1BS0UpIC1mICQ8ICQoTUFLRUNNREdPQUxTKSBSRUxFQVNFPSQoUkVMRUFTRSkKLQotZW5kaWYKLQotIwotIyBSdWxlcyB0byBidWlsZCBubG1zLiAKLSMKLQotdnBhdGggbGliY3ByZS5vICQoTk9WRUxMTElCQylcaW1wb3J0cwotCi0jIElmIHdlIG9ubHkgaGF2ZSBvbmUgdGFyZ2V0IE5MTSB0aGVuIGJ1aWxkIGl0Ci1pZmVxICIkKHdvcmRzICQoc3RyaXAgJChUQVJHRVRfbmxtKSkpIiAiMSIKLQotJChUQVJHRVRfbmxtKSA6ICQoRklMRVNfbmxtX29ianMpICQoRklMRVNfbmxtX2xpYnMpICQoT0JKRElSKVwkKE5MTV9OQU1FKV9saW5rLm9wdAotCUBlY2hvIExpbmtpbmcgJEAKLQkkKExJTkspIEAkKE9CSkRJUilcJChOTE1fTkFNRSlfbGluay5vcHQKLQotIyBUaGlzIHdpbGwgZm9yY2UgdGhlIGxpbmsgb3B0aW9uIGZpbGUgdG8gYmUgcmVidWlsdCBpZiB3ZSBjaGFuZ2UgdGhlIAotIyBjb3JyZXNwb25kaW5nIG1ha2VmaWxlCi0KLSQoT0JKRElSKVwkKE5MTV9OQU1FKV9saW5rLm9wdCA6ICQoJChOTE1fTkFNRSlfTElOS09QVF9ERVBFTkRTKQotCSQoQ0hLKSAkKE9CSkRJUilcJChARikgJChERUwpICQoT0JKRElSKVwkKEBGKQotCSQoQ0hLKSAkKE9CSkRJUilcJChOTE1fTkFNRSlfbGluay5kZWYgJChERUwpICQoT0JKRElSKVwkKE5MTV9OQU1FKV9saW5rLmRlZgotCUBlY2hvIEdlbmVyYXRpbmcgJEAKLQlAZWNobyAtd2FybmluZ3Mgb2ZmID4+ICRACi0JQGVjaG8gLXplcm9ic3MgPj4gJEAKLQlAZWNobyAtZGVzYyAiJChOTE1fREVTQ1JJUFRJT04pIiA+PiAkQAotCUBlY2hvIC1vICQoVEFSR0VUX25sbSkgPj4gJEAKLWlmbmVxICIkKEZJTEVfbmxtX2NvcHlyaWdodCkiICIiCi0JQC10eXBlICQoRklMRV9ubG1fY29weXJpZ2h0KSA+PiAkQAotZW5kaWYKLWlmZXEgIiQoUkVMRUFTRSkiICJkZWJ1ZyIKLQlAZWNobyAtZyA+PiAkQAotCUBlY2hvIC1zeW0gaW50ZXJuYWwgPj4gJEAKLQlAZWNobyAtc3ltIGNvZGV2aWV3NCA+PiAkQAotCUBlY2hvIC1vc3ltICQoT0JKRElSKVwkKE5MTV9OQU1FKS5zeW0gPj4gJEAKLWVsc2UJCi0JQGVjaG8gLXN5bSBpbnRlcm5hbCA+PiAkQAotZW5kaWYJCi0JQGVjaG8gLXNjcmVlbm5hbWUgIkFwYWNoZSBmb3IgTmV0V2FyZSIgPj4gJEAgCi1pZm5lcSAiJChOTE1fVkVSU0lPTikiICIiCi0JQGVjaG8gLW5sbXZlcnNpb249JChOTE1fVkVSU0lPTikgPj4gJEAgCi1lbHNlCi0JQGVjaG8gLW5sbXZlcnNpb249JChWRVJTSU9OKSA+PiAkQAotZW5kaWYKLQlAZWNobyAtbCAkKE5XT1MpID4+ICRACi0JQGVjaG8gLWwgJChBUCkvJChPQkpESVIpID4+ICRACi0JQGVjaG8gLWwgJChBUFIpLyQoT0JKRElSKSA+PiAkQAotCUBlY2hvIC1sICQoQVBSVVRJTCkvJChPQkpESVIpID4+ICRACi0JQGVjaG8gLWwgJChQQ1JFKS8kKE9CSkRJUikgPj4gJEAKLQlAZWNobyAtbCAkKEhUVFBEKS8kKE9CSkRJUikgPj4gJEAKLQlAZWNobyAtbCAkKFNFUlZFUikvJChPQkpESVIpID4+ICRACi0JQGVjaG8gLWwgJChTVERNT0QpLyQoT0JKRElSKSA+PiAkQAotCUBlY2hvIC1sICQoTldPUykvJChPQkpESVIpID4+ICRACi0JQGVjaG8gLWwgIiQoTUVUUk9XRVJLUykvTm92ZWxsIFN1cHBvcnQvTWV0cm93ZXJrcyBTdXBwb3J0L0xpYnJhcmllcy9SdW50aW1lIiA+PiAkQAotCUBlY2hvIC1sICIkKE1FVFJPV0VSS1MpL05vdmVsbCBTdXBwb3J0L01ldHJvd2Vya3MgU3VwcG9ydC9MaWJyYXJpZXMvTVNMIEMrKyIgPj4gJEAKLQlAZWNobyAtbCAkKE5PVkVMTExJQkMpL2ltcG9ydHMgPj4gJEAKLWlmbmVxICIkKExEQVBTREspIiAiIiAgICAKLQlAZWNobyAtbCAkKExEQVBTREspL2xpYi9ubG0gPj4gJEAKLWVuZGlmICAgIAotCUBlY2hvIC1sICQoWE1MKS8kKE9CSkRJUikgPj4gJEAKLQlAZWNobyAtbm9kZWZhdWx0cyA+PiAkQAotCUBlY2hvIC1tYXAgJChPQkpESVIpXCQoTkxNX05BTUUpLm1hcD4+ICRACi0JQGVjaG8gLXRocmVhZG5hbWUgIiQoTkxNX1RIUkVBRF9OQU1FKSIgPj4gJEAKLWlmbmVxICIkKE5MTV9TVEFDS19TSVpFKSIgIiIKLQlAZWNobyAtc3RhY2tzaXplICQoc3Vic3QgSywwMDAsJChzdWJzdCBrLEssJChzdHJpcCAkKE5MTV9TVEFDS19TSVpFKSkpKSA+PiAkQAotZWxzZQkKLQlAZWNobyAtc3RhY2tzaXplIDY0MDAwID4+ICRACi1lbmRpZgotaWZuZXEgIiQoTkxNX0VOVFJZX1NZTSkiICIiCi0JQGVjaG8gLWVudHJ5ICQoTkxNX0VOVFJZX1NZTSkgPj4gJEAKLWVuZGlmCi1pZm5lcSAiJChOTE1fRVhJVF9TWU0pIiAiIgotCUBlY2hvIC1leGl0ICQoTkxNX0VYSVRfU1lNKSA+PiAkQAotZW5kaWYKLWlmbmVxICIkKE5MTV9DSEVDS19TWU0pIiAiIgotCUBlY2hvIC1jaGVjayAkKE5MTV9DSEVDS19TWU0pID4+ICRACi1lbmRpZgotaWZuZXEgIiQoTkxNX0ZMQUdTKSIgIiIKLQlAZWNobyAtZmxhZ3MgJChOTE1fRkxBR1MpID4+ICRACi1lbmRpZgotaWZuZXEgIiQoc3RyaXAgJChGSUxFU19ubG1fb2JqcykpIiAiIgotCUBlY2hvICQoZm9yZWFjaCBvYmpmaWxlLCQoc3RyaXAgJChGSUxFU19ubG1fb2JqcykpLCQoc3Vic3QgLyxcLCQob2JqZmlsZSkpKSA+PiAkQAotZW5kaWYKLWlmbmVxICIkKEZJTEVTX25sbV9saWJzKSIgIiIKLQlAZWNobyAkKGZvcmVhY2ggbGliZmlsZSwgJChub3RkaXIgJChzdHJpcCAkKEZJTEVTX25sbV9saWJzKSkpLC1sJChzdWJzdCAvLFwsJChsaWJmaWxlKSkpID4+ICRACi1lbmRpZgotCUBlY2hvIC1jb21tYW5kZmlsZSAkKE9CSkRJUilcJChOTE1fTkFNRSlfbGluay5kZWYgPj4gJEAKLWlmbmVxICIkKEZJTEVfbmxtX21zZykiICIiCi0JQGVjaG8gTWVzc2FnZXMgJChGSUxFX25sbV9tc2cpID4+ICQoT0JKRElSKVwkKE5MTV9OQU1FKV9saW5rLmRlZgotZW5kaWYKLWlmbmVxICIkKEZJTEVfbmxtX2hscCkiICIiCi0JQGVjaG8gSGVscCAkKEZJTEVfbmxtX2hscCkgPj4gJChPQkpESVIpXCQoTkxNX05BTUUpX2xpbmsuZGVmCi1lbmRpZgotaWZuZXEgIiQoRklMRVNfbmxtX21vZHVsZXMpIiAiIgotCUBlY2hvIG1vZHVsZSAkKGZvcmVhY2ggbW9kdWxlLCQoc3Vic3QgJChTUEFDRSksJChDT01NQSksJChzdHJpcCAkKEZJTEVTX25sbV9tb2R1bGVzKSkpLCQoc3Vic3QgLyxcLCQobW9kdWxlKSkpID4+ICQoT0JKRElSKVwkKE5MTV9OQU1FKV9saW5rLmRlZgotZW5kaWYKLWlmbmVxICIkKEZJTEVTX25sbV9YaW1wb3J0cykiICIiCi0JQGVjaG8gSW1wb3J0ICQoZm9yZWFjaCBpbXBvcnQsJChzdWJzdCAkKFNQQUNFKSwkKENPTU1BKSwkKHN0cmlwICQoRklMRVNfbmxtX1hpbXBvcnRzKSkpLCQoc3Vic3QgLyxcLCQoaW1wb3J0KSkpID4+ICQoT0JKRElSKVwkKE5MTV9OQU1FKV9saW5rLmRlZgotZW5kaWYJCi1pZm5lcSAiJChGSUxFU19ubG1fZXhwb3J0cykiICIiCi0JQGVjaG8gRXhwb3J0ICQoZm9yZWFjaCBleHBvcnQsJChzdWJzdCAkKFNQQUNFKSwkKENPTU1BKSwkKHN0cmlwICQoRklMRVNfbmxtX2V4cG9ydHMpKSksJChzdWJzdCAvLFwsJChleHBvcnQpKSkgPj4gJChPQkpESVIpXCQoTkxNX05BTUUpX2xpbmsuZGVmCi1lbmRpZgkKLWlmbmVxICIkKHN0cmlwICQoWExGTEFHUykpIiAiIgotCUBlY2hvICQoWExGTEFHUykgPj4gJChPQkpESVIpXCQoTkxNX05BTUUpX2xpbmsuZGVmCi1lbmRpZgotCi0jIGlmIEFQQUNIRV9VTklQUk9DIGlzIGRlZmluZWQsIGRvbid0IGluY2x1ZGUgWERDRGF0YQotaWZuZGVmIEFQQUNIRV9VTklQUk9DCi1pZm5lcSAiJChzdHJpbmcgJChYRENEQVRBKSkiICIiCi0JQGVjaG8gWERDRGF0YSAkKFhEQ0RBVEEpID4+ICQoT0JKRElSKVwkKE5MTV9OQU1FKV9saW5rLmRlZgotZWxzZQotCUBlY2hvIFhEQ0RhdGEgJChOV09TKVxhcGFjaGUueGRjID4+ICQoT0JKRElSKVwkKE5MTV9OQU1FKV9saW5rLmRlZgotZW5kaWYKLWVuZGlmCi0KLWVsc2UgIyBtb3JlIHRoYW4gb25lIHRhcmdldCBzbyBsb29rIGZvciBpbmRpdmlkdWFsIG1ha2VmaWxlcy4KLQotIyBPbmx5IGluY2x1ZGUgdGhlc2UgaWYgTk9fTElDRU5TRV9GSUxFIGlzbid0IHNldCB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSAKLSMgcmVjdXJzaW9uCi0KLWlmbmRlZiBOT19MSUNFTlNFX0ZJTEUKLQotJChPQkpESVIpLyUubmxtOiBOV0dOVSUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jICQoQVBfV09SSylcYnVpbGRcTldHTlV0YWlsLmluYyAkKEFQX1dPUkspXGJ1aWxkXE5XR05VZW52aXJvbm1lbnQuaW5jICQoQ1VTVE9NX0lOSSkgRk9SQ0UKLQlAZWNobyBDYWxsaW5nICQ8Ci0JJChNQUtFKSAtZiAkPCAkKE1BS0VDTURHT0FMUykgUkVMRUFTRT0kKFJFTEVBU0UpCi0JJChDTUQpIGVjaG8uCi0KLWVsc2UKLQotJChUQVJHRVRfbmxtKToKLQotZW5kaWYgIyBOT19MSUNFTlNFX0ZJTEUKLQotZW5kaWYKLQpkaWZmIC0tZ2l0IGEvYnVpbGQvUHJpbnRQYXRoIGIvYnVpbGQvUHJpbnRQYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MDhkMjc0Li4wMDAwMDAwCi0tLSBhL2J1aWxkL1ByaW50UGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0jIS9iaW4vc2gKLSMgTG9vayBmb3IgcHJvZ3JhbVtzXSBzb21ld2hlcmUgaW4gJFBBVEguCi0jCi0jIE9wdGlvbnM6Ci0jICAtcwotIyAgICBEbyBub3QgcHJpbnQgb3V0IGZ1bGwgcGF0aG5hbWUuIChzaWxlbnQpCi0jICAtcFBBVEhOQU1FCi0jICAgIExvb2sgaW4gUEFUSE5BTUUgaW5zdGVhZCBvZiAkUEFUSAotIwotIyBVc2FnZToKLSMgIFByaW50UGF0aCBbLXNdIFstcFBBVEhOQU1FXSBwcm9ncmFtIFtwcm9ncmFtIC4uLl0KLSMKLSMgSW5pdGlhbGx5IHdyaXR0ZW4gYnkgSmltIEphZ2llbHNraSBmb3IgdGhlIEFwYWNoZSBjb25maWd1cmF0aW9uIG1lY2hhbmlzbQotIyAgKHdpdGgga3Vkb3MgdG8gS2VybmlnaGFuL1Bpa2UpCi0jCi0jIFRoaXMgc2NyaXB0IGZhbGxzIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZS4KLSMgU2VlIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzL0xJQ0VOU0UKLQotIyMKLSMgU29tZSAiY29uc3RhbnRzIgotIyMKLXBhdGhuYW1lPSRQQVRICi1lY2hvPSJ5ZXMiCi0KLSMjCi0jIEZpbmQgb3V0IHdoYXQgT1Mgd2UgYXJlIHJ1bm5pbmcgZm9yIGxhdGVyIG9uCi0jIwotb3M9YCh1bmFtZSkgMj4vZGV2L251bGxgCi0KLSMjCi0jIFBhcnNlIGNvbW1hbmQgbGluZQotIyMKLWZvciBhcmdzIGluICQqCi1kbwotICAgIGNhc2UgJGFyZ3MgaW4KLQktcyAgKSBlY2hvPSJubyIgOzsKLQktcCogKSBwYXRobmFtZT0iYGVjaG8gJGFyZ3MgfCBzZWQgJ3MvXi4uLy8nYCIgOzsKLQkqICAgKSBwcm9ncmFtcz0iJHByb2dyYW1zICRhcmdzIiA7OwotICAgIGVzYWMKLWRvbmUKLQotIyMKLSMgTm93IHdlIG1ha2UgdGhlIGFkanVzdG1lbnRzIHJlcXVpcmVkIGZvciBPUy8yIGFuZCBldmVyeW9uZQotIyBlbHNlIDopCi0jCi0jIEZpcnN0IG9mIGFsbCwgYWxsIE9TLzIgcHJvZ3JhbXMgaGF2ZSB0aGUgJy5leGUnIGV4dGVuc2lvbi4KLSMgTmV4dCwgd2UgYWRqdXN0IFBBVEggKG9yIHdoYXQgd2FzIGdpdmVuIHRvIHVzIGFzIFBBVEgpIHRvCi0jIGJlIHdoaXRlc3BhY2Ugc2VwZXJhdGVkIGRpcmVjdG9yaWVzLgotIyBGaW5hbGx5LCB3ZSB0cnkgdG8gZGV0ZXJtaW5lIHRoZSBiZXN0IGZsYWcgdG8gdXNlIGZvcgotIyB0ZXN0L1tdIHRvIGxvb2sgZm9yIGFuIGV4ZWN1dGFibGUgZmlsZS4gT1MvMiBqdXN0IGhhcyAnLXInCi0jIGJ1dCB3aXRoIG90aGVyIE9Tcywgd2UgZG8gc29tZSBmdW5ueSBzdHVmZiB0byBjaGVjayB0byBzZWUKLSMgaWYgdGVzdC9bXSBrbm93cyBhYm91dCAteCwgd2hpY2ggaXMgdGhlIHByZWZlcmVkIGZsYWcuCi0jIwotCi1pZiBbICJ4JG9zIiA9ICJ4T1MvMiIgXQotdGhlbgotICAgIGV4dD0iLmV4ZSIKLSAgICBwYXRobmFtZT1gZWNobyAtRSAkcGF0aG5hbWUgfAotICAgICBzZWQgJ3MvXjsvLjsvCi0JICBzLzs7LzsuOy9nCi0JICBzLzskLzsuLwotCSAgcy87LyAvZwotCSAgcy9cXFxcL1xcLy9nJyBgCi0gICAgdGVzdF9leGVjX2ZsYWc9Ii1yIgotZWxzZQotICAgIGV4dD0iIgkjIE5vIGRlZmF1bHQgZXh0ZW5zaW9ucwotICAgIHBhdGhuYW1lPWBlY2hvICRwYXRobmFtZSB8Ci0gICAgIHNlZCAncy9eOi8uOi8KLQkgIHMvOjovOi46L2cKLQkgIHMvOiQvOi4vCi0JICBzLzovIC9nJyBgCi0gICAgIyBIZXJlIGlzIGhvdyB3ZSB0ZXN0IHRvIHNlZSBpZiB0ZXN0L1tdIGNhbiBoYW5kbGUgLXgKLSAgICB0ZXN0ZmlsZT0icHAudC4kJCIKLQotICAgIGNhdCA+ICR0ZXN0ZmlsZSA8PEVORFRFU1QKLSMhL2Jpbi9zaAotaWYgWyAteCAvIF0gfHwgWyAteCAvYmluIF0gfHwgWyAteCAvYmluL2xzIF07IHRoZW4KLSAgICBleGl0IDAKLWZpCi1leGl0IDEKLUVORFRFU1QKLQotICAgIGlmIGAvYmluL3NoICR0ZXN0ZmlsZSAyPi9kZXYvbnVsbGA7IHRoZW4KLQl0ZXN0X2V4ZWNfZmxhZz0iLXgiCi0gICAgZWxzZQotCXRlc3RfZXhlY19mbGFnPSItciIKLSAgICBmaQotICAgIHJtIC1mICR0ZXN0ZmlsZQotZmkKLQotZm9yIHByb2dyYW0gaW4gJHByb2dyYW1zCi1kbwotICAgIGZvciBwYXRoIGluICRwYXRobmFtZQotICAgIGRvCi0JaWYgWyAkdGVzdF9leGVjX2ZsYWcgJHBhdGgvJHtwcm9ncmFtfSR7ZXh0fSBdICYmIFwKLQkgICBbICEgLWQgJHBhdGgvJHtwcm9ncmFtfSR7ZXh0fSBdOyB0aGVuCi0JICAgIGlmIFsgIngkZWNobyIgPSAieHllcyIgXTsgdGhlbgotCQllY2hvICRwYXRoLyR7cHJvZ3JhbX0ke2V4dH0KLQkgICAgZmkKLQkgICAgZXhpdCAwCi0JZmkKLSAgICBkb25lCi1kb25lCi1leGl0IDEKLQpkaWZmIC0tZ2l0IGEvYnVpbGQvYmluYnVpbGQuc2ggYi9idWlsZC9iaW5idWlsZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzI3OTE0OC4uMDAwMDAwMAotLS0gYS9idWlsZC9iaW5idWlsZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgYmluYnVpbGQuc2ggLSBCdWlsZHMgYW4gQXBhY2hlIGJpbmFyeSBkaXN0cmlidXRpb24uCi0jIEluaXRpYWxseSB3cml0dGVuIGJ5IExhcnMgRWlsZWJyZWNodCA8bGFyc0BhcGFjaGUub3JnPi4KLSMKLSMgVGhpcyBzY3JpcHQgZmFsbHMgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLgotIyBTZWUgaHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvTElDRU5TRQotCi0KLUFQRElSPSQoYmFzZW5hbWUgJChwd2QpKQotVkVSPSQoZWNobyAkQVBESVIgfHNlZCBzL2FwYWNoZS0vLykKLU9TPSQoc3JjL2hlbHBlcnMvR3Vlc3NPUykKLVVTRVI9IiQoc3JjL2hlbHBlcnMvYnVpbGRpbmZvLnNoIC1uICV1QCVoJWQpIgotVEFSPSIkKHNyYy9oZWxwZXJzL2ZpbmRwcmcuc2ggdGFyKSIKLUdUQVI9IiQoc3JjL2hlbHBlcnMvZmluZHByZy5zaCBndGFyKSIKLUdaSVA9IiQoc3JjL2hlbHBlcnMvZmluZHByZy5zaCBnemlwKSIKLUNPTkZJR1BBUkFNPSItLXdpdGgtbGF5b3V0PUJpbmFyeURpc3RyaWJ1dGlvbiAtLWVuYWJsZS1tb2R1bGU9bW9zdCAtLWVuYWJsZS1zaGFyZWQ9bWF4IgotCi1pZiBbICEgLWYgLi9BQk9VVF9BUEFDSEUgXQotdGhlbgotICBlY2hvICJFUlJPUjogVGhlIGN1cnJlbnQgZGlyZWN0b3J5IGNvbnRhaW5zIG5vIHZhbGlkIEFwYWNoZSBkaXN0cmlidXRpb24uIgotICBlY2hvICJQbGVhc2UgY2hhbmdlIHRoZSBkaXJlY3RvcnkgdG8gdGhlIHRvcCBsZXZlbCBkaXJlY3Rvcnkgb2YgYSBmcmVzaGx5IgotICBlY2hvICJ1bnBhY2tlZCBBcGFjaGUgMS4zIHNvdXJjZSBkaXN0cmlidXRpb24gYW5kIHJlLWV4ZWN1dGUgdGhlIHNjcmlwdCIKLSAgZWNobyAiJy4vc3JjL2hlbHBlcnMvYmluZGJ1aWxkLnNoJy4iIAotICBleGl0IDE7Ci1maQotCi1pZiBbIC1kIC4vQ1ZTIF0KLXRoZW4KLSAgZWNobyAiRVJST1I6IFRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBhIENWUyBjaGVja291dCBvZiBBcGFjaGUuIgotICBlY2hvICJPbmx5IGEgc3RhbmRhcmQgQXBhY2hlIDEuMyBzb3VyY2UgZGlzdHJpYnV0aW9uIHNob3VsZCBiZSB1c2VkIHRvIgotICBlY2hvICJjcmVhdGUgYSBiaW5hcnkgZGlzdHJpYnV0aW9uLiIKLSAgZXhpdCAxOwotZmkKLQotZWNobyAiQnVpbGRpbmcgQXBhY2hlICRWRVIgYmluYXJ5IGRpc3RyaWJ1dGlvbi4uLiIKLWVjaG8gIlBsYXRmb3JtIGlzIFwiJE9TXCIuLi4iCi0KLSggZWNobyAiQnVpbGQgbG9nIGZvciBBcGFjaGUgYmluYXJ5IGRpc3RyaWJ1dGlvbiIgJiYgXAotICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiAmJiBcCi0gIC4vY29uZmlndXJlICRDT05GSUdQQVJBTSAmJiBcCi0gIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iICYmIFwKLSAgbWFrZSBjbGVhbiAmJiBcCi0gIHJtIC1yZiBiaW5kaXN0IGluc3RhbGwtYmluZGlzdC5zaCAqLmJpbmRpc3QKLSAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgJiYgXAotICBtYWtlICYmIFwKLSAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgJiYgXAotICBtYWtlIGluc3RhbGwtcXVpZXQgcm9vdD0iYmluZGlzdC8iICYmIFwKLSAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgJiYgXAotICBtYWtlIGNsZWFuICYmIFwKLSAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgJiYgXAotICBlY2hvICJbRU9GXSIgXAotKSA+IGJ1aWxkLmxvZyAyPiYxCi0KLWlmIFsgISAtZiAuL2JpbmRpc3QvYmluL2h0dHBkIF0KLXRoZW4KLSAgZWNobyAiRVJST1I6IEZhaWxlZCB0byBidWlsZCBBcGFjaGUuIFNlZSBcImJ1aWxkLmxvZ1wiIGZvciBkZXRhaWxzLiIKLSAgZXhpdCAxOwotZmkKLQotZWNobyAiQmluYXJ5IGltYWdlcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4uLiIKLWVjaG8gIkNyZWF0aW5nIHN1cHBsZW1lbnRhcnkgZmlsZXMuLi4iCi0KLSggZWNobyAiICIgJiYgXAotICBlY2hvICJBcGFjaGUgJFZFUiBiaW5hcnkgZGlzdHJpYnV0aW9uIiAmJiBcCi0gIGVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IiAmJiBcCi0gIGVjaG8gIiAiICYmIFwKLSAgZWNobyAiVGhpcyBiaW5hcnkgZGlzdHJpYnV0aW9uIGlzIHVzYWJsZSBvbiBhIFwiJE9TXCIiICYmIFwKLSAgZWNobyAic3lzdGVtIGFuZCB3YXMgYnVpbHQgYnkgXCIkVVNFUlwiLiIgJiYgXAotICBlY2hvICIiICYmIFwKLSAgZWNobyAiVGhlIGRpc3RyaWJ1dGlvbiBjb250YWlucyBhbGwgc3RhbmRhcmQgQXBhY2hlIG1vZHVsZXMgYXMgc2hhcmVkIiAmJiBcCi0gIGVjaG8gIm9iamVjdHMuIFRoaXMgYWxsb3dzIHlvdSB0byBlbmFibGUgb3IgZGlzYWJsZSBwYXJ0aWN1bGFyIG1vZHVsZXMiICYmIFwKLSAgZWNobyAid2l0aCB0aGUgTG9hZE1vZHVsZS9BZGRNb2R1bGUgZGlyZWN0aXZlcyBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIiAmJiBcCi0gIGVjaG8gIndpdGhvdXQgdGhlIG5lZWQgdG8gcmUtY29tcGlsZSBBcGFjaGUuIiAmJiBcCi0gIGVjaG8gIiIgJiYgXAotICBlY2hvICJTZWUgXCJJTlNUQUxMLmJpbmRpc3RcIiBvbiBob3cgdG8gaW5zdGFsbCB0aGUgZGlzdHJpYnV0aW9uLiIgJiYgXAotICBlY2hvICIgIiAmJiBcCi0gIGVjaG8gIk5PVEU6IFBsZWFzZSBkbyBub3Qgc2VuZCBzdXBwb3J0LXJlbGF0ZWQgbWFpbHMgdG8gdGhlIGFkZHJlc3MgbWVudGlvbmVkIiAmJiBcCi0gIGVjaG8gIiAgICAgIGFib3ZlIG9yIHRvIGFueSBtZW1iZXIgb2YgdGhlIEFwYWNoZSBHcm91cCEgU3VwcG9ydCBxdWVzdGlvbnMiICYmIFwKLSAgZWNobyAiICAgICAgc2hvdWxkIGJlIGRpcmVjdGVkIHRvIHRoZSBcImNvbXAuaW5mb3N5c3RlbXMud3d3LnNlcnZlcnMudW5peFwiIiAmJiBcCi0gIGVjaG8gIiAgICAgIG9yIFwiY29tcC5pbmZvc3lzdGVtcy53d3cuc2VydmVycy5tcy13aW5kb3dzXCIgbmV3c2dyb3VwIiAmJiBcCi0gIGVjaG8gIiAgICAgIChhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIHBsYXRmb3JtIHlvdSB1c2UpLCB3aGVyZSBzb21lIG9mIHRoZSIgJiYgXAotICBlY2hvICIgICAgICBBcGFjaGUgdGVhbSBsdXJrLCBpbiB0aGUgY29tcGFueSBvZiBtYW55IG90aGVyIEFwYWNoZSBndXJ1cyIgJiYgXAotICBlY2hvICIgICAgICB3aG8gc2hvdWxkIGJlIGFibGUgdG8gaGVscC4iICYmIFwKLSAgZWNobyAiICAgICAgSWYgeW91IHRoaW5rIHlvdSBmb3VuZCBhIGJ1ZyBpbiBBcGFjaGUgb3IgaGF2ZSBhIHN1Z2dlc3Rpb24gcGxlYXNlIiAmJiBcCi0gIGVjaG8gIiAgICAgIHZpc2l0IHRoZSBidWcgcmVwb3J0IHBhZ2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2J1Z19yZXBvcnQuaHRtbCIgJiYgXAotICBlY2hvICIgIiAmJiBcCi0gIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iICYmIFwKLSAgLi9iaW5kaXN0L2Jpbi9odHRwZCAtViAmJiBcCi0gIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIFwKLSkgPiBSRUFETUUuYmluZGlzdAotY3AgUkVBRE1FLmJpbmRpc3QgLi4vYXBhY2hlLSRWRVItJE9TLlJFQURNRQotCi0oIGVjaG8gIiAiICYmIFwKLSAgZWNobyAiQXBhY2hlICRWRVIgYmluYXJ5IGluc3RhbGxhdGlvbiIgJiYgXAotICBlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIgJiYgXAotICBlY2hvICIgIiAmJiBcCi0gIGVjaG8gIlRvIGluc3RhbGwgdGhpcyBiaW5hcnkgZGlzdHJpYnV0aW9uIHlvdSBoYXZlIHRvIGV4ZWN1dGUgdGhlIGluc3RhbGxhdGlvbiIgJiYgXAotICBlY2hvICJzY3JpcHQgXCJpbnN0YWxsLWJpbmRpc3Quc2hcIiBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJpYnV0aW9uLiIgJiYgXAotICBlY2hvICIgIiAmJiBcCi0gIGVjaG8gIlRoZSBzY3JpcHQgdGFrZXMgdGhlIFNlcnZlclJvb3QgZGlyZWN0b3J5IGludG8gd2hpY2ggeW91IHdhbnQgdG8gaW5zdGFsbCIgJiYgXAotICBlY2hvICJBcGFjaGUgYXMgYW4gb3B0aW9uLiBJZiB5b3Ugb21taXQgdGhlIG9wdGlvbiB0aGUgZGVmYXVsdCBwYXRoIiAmJiBcCi0gIGVjaG8gIlwiL3Vzci9sb2NhbC9hcGFjaGVcIiBpcyB1c2VkLiIgJiYgXAotICBlY2hvICJNYWtlIHN1cmUgeW91IGhhdmUgd3JpdGUgcGVybWlzc2lvbnMgaW4gdGhlIHRhcmdldCBkaXJlY3RvcnksIGUuZy4gc3dpdGNoIiAmJiBcCi0gIGVjaG8gInRvIHVzZXIgXCJyb290XCIgYmVmb3JlIHlvdSBleGVjdXRlIHRoZSBzY3JpcHQuIiAmJiBcCi0gIGVjaG8gIiAiICYmIFwKLSAgZWNobyAiU2VlIFwiUkVBRE1FLmJpbmRpc3RcIiBmb3IgZnVydGhlciBkZXRhaWxzIGFib3V0IHRoaXMgZGlzdHJpYnV0aW9uLiIgJiYgXAotICBlY2hvICIgIiAmJiBcCi0gIGVjaG8gIlBsZWFzZSBub3RlIHRoYXQgdGhpcyBkaXN0cmlidXRpb24gaW5jbHVkZXMgdGhlIGNvbXBsZXRlIEFwYWNoZSBzb3VyY2UgY29kZS4iICYmIFwKLSAgZWNobyAiVGhlcmVmb3JlIHlvdSBtYXkgY29tcGlsZSBBcGFjaGUgeW91cnNlbGYgYXQgYW55IHRpbWUgaWYgeW91IGhhdmUgYSBjb21waWxlciIgJiYgXAotICBlY2hvICJpbnN0YWxsYXRpb24gb24geW91ciBzeXN0ZW0uIiAmJiBcCi0gIGVjaG8gIlNlZSBcIklOU1RBTExcIiBmb3IgZGV0YWlscyBvbiBob3cgdG8gYWNjb21wbGlzaCB0aGlzLiIgJiYgXAotICBlY2hvICIgIiBcCi0pID4gSU5TVEFMTC5iaW5kaXN0Ci0KLSggZWNobyAiIyEvYmluL3NoIiAmJiBcCi0gIGVjaG8gIiMiICYmIFwKLSAgZWNobyAiIyBVc2FnZTogaW5zdGFsbC1iaW5kaXN0LnNoIFtTZXJ2ZXJSb290XSIgJiYgXAotICBlY2hvICIjIFRoaXMgc2NyaXB0IGluc3RhbGxzIHRoZSBBcGFjaGUgYmluYXJ5IGRpc3RyaWJ1dGlvbiBhbmQiICYmIFwKLSAgZWNobyAiIyB3YXMgYXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IGJpbmJ1aWxkLnNoLiIgJiYgXAotICBlY2hvICIgIiAmJiBcCi0gIGVjaG8gImlmIFsgLlwkMSA9IC4gXSIgJiYgXAotICBlY2hvICJ0aGVuIiAmJiBcCi0gIGVjaG8gIiAgU1I9L3Vzci9sb2NhbC9hcGFjaGUiICYmIFwKLSAgZWNobyAiZWxzZSIgJiYgXAotICBlY2hvICIgIFNSPVwkMSIgJiYgXAotICBlY2hvICJmaSIgJiYgXAotICBlY2hvICJlY2hvIFwiSW5zdGFsbGluZyBiaW5hcnkgZGlzdHJpYnV0aW9uIGZvciBwbGF0Zm9ybSAkT1NcIiIgJiYgXAotICBlY2hvICJlY2hvIFwiaW50byBkaXJlY3RvcnkgXCRTUiAuLi5cIiIgJiYgXAotICBlY2hvICIuL3NyYy9oZWxwZXJzL21rZGlyLnNoIFwkU1IiICYmIFwKLSAgZWNobyAiY3AgLXIgYmluZGlzdC9wcm94eSBcJFNSL3Byb3h5IiAmJiBcCi0gIGVjaG8gImNwIC1yIGJpbmRpc3QvbWFuIFwkU1IvbWFuIiAmJiBcCi0gIGVjaG8gImNwIC1yIGJpbmRpc3QvbG9ncyBcJFNSL2xvZ3MiICYmIFwKLSAgZWNobyAiY3AgLXIgYmluZGlzdC9saWJleGVjIFwkU1IvbGliZXhlYyIgJiYgXAotICBlY2hvICJjcCAtciBiaW5kaXN0L2luY2x1ZGUgXCRTUi9pbmNsdWRlIiAmJiBcCi0gIGVjaG8gImNwIC1yIGJpbmRpc3QvaWNvbnMgXCRTUi9pY29ucyIgJiYgXAotICBlY2hvICJjcCAtciBiaW5kaXN0L2NnaS1iaW4gXCRTUi9jZ2ktYmluIiAmJiBcCi0gIGVjaG8gImNwIC1yIGJpbmRpc3QvYmluIFwkU1IvYmluIiAmJiBcCi0gIGVjaG8gImlmIFsgLWQgXCRTUi9jb25mIF0iICYmIFwKLSAgZWNobyAidGhlbiIgJiYgXAotICBlY2hvICIgIGVjaG8gXCJbUHJlc2VydmluZyBleGlzdGluZyBjb25maWd1cmF0aW9uIGZpbGVzLl1cIiIgJiYgXAotICBlY2hvICIgIGNwIC1yIGJpbmRpc3QvY29uZi8qLmRlZmF1bHQgXCRTUi9jb25mLyIgJiYgXAotICBlY2hvICJlbHNlIiAmJiBcCi0gIGVjaG8gIiAgY3AgLXIgYmluZGlzdC9jb25mIFwkU1IvY29uZiIgJiYgXAotICBlY2hvICJmaSIgJiYgXAotICBlY2hvICJpZiBbIC1kIFwkU1IvaHRkb2NzIF0iICYmIFwKLSAgZWNobyAidGhlbiIgJiYgXAotICBlY2hvICIgIGVjaG8gXCJbUHJlc2VydmluZyBleGlzdGluZyBodGRvY3MgZGlyZWN0b3J5Ll1cIiIgJiYgXAotICBlY2hvICJlbHNlIiAmJiBcCi0gIGVjaG8gIiAgY3AgLXIgYmluZGlzdC9odGRvY3MgXCRTUi9odGRvY3MiICYmIFwKLSAgZWNobyAiZmkiICYmIFwKLSAgZWNobyAic2VkIC1lIHMlL3Vzci9sb2NhbC9hcGFjaGUlXCRTUi8lIFwkU1IvY29uZi9odHRwZC5jb25mLmRlZmF1bHQgPiBcJFNSL2NvbmYvaHR0cGQuY29uZiIgJiYgXAotICBlY2hvICJzZWQgLWUgcyVQSURGSUxFPSVQSURGSUxFPVwkU1IvJSAtZSBzJUhUVFBEPSVIVFRQRD1cXFwiXCRTUi8lIC1lIFwicyUvaHR0cGQkJS9odHRwZCAtZCBcJFNSXFxcIiVcIiBiaW5kaXN0L2Jpbi9hcGFjaGVjdGwgPiBcJFNSL2Jpbi9hcGFjaGVjdGwiICYmIFwKLSAgZWNobyAiICIgJiYgXAotICBlY2hvICJlY2hvIFwiUmVhZHkuXCIiICYmIFwKLSAgZWNobyAiZWNobyBcIiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXCIiICYmIFwKLSAgZWNobyAiZWNobyBcIiB8IFlvdSBub3cgaGF2ZSBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkIHRoZSBBcGFjaGUgJFZFUiAgIHxcIiIgJiYgXAotICBlY2hvICJlY2hvIFwiIHwgSFRUUCBzZXJ2ZXIuIFRvIHZlcmlmeSB0aGF0IEFwYWNoZSBhY3R1YWxseSB3b3JrcyAgICAgIHxcIiIgJiYgXAotICBlY2hvICJlY2hvIFwiIHwgY29ycmVjdGx5IHlvdSBub3cgc2hvdWxkIGZpcnN0IGNoZWNrIHRoZSAoaW5pdGlhbGx5ICAgIHxcIiIgJiYgXAotICBlY2hvICJlY2hvIFwiIHwgY3JlYXRlZCBvciBwcmVzZXJ2ZWQpIGNvbmZpZ3VyYXRpb24gZmlsZXMgICAgICAgICAgICAgIHxcIiIgJiYgXAotICBlY2hvICJlY2hvIFwiIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcIiIgJiYgXAotICBlY2hvICJlY2hvIFwiIHwgICBcJFNSL2NvbmYvaHR0cGQuY29uZlwiIiAmJiBcCi0gIGVjaG8gImVjaG8gXCIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFwiIiAmJiBcCi0gIGVjaG8gImVjaG8gXCIgfCBhbmQgdGhlbiB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gaW1tZWRpYXRlbHkgZmlyZSB1cCAgICAgfFwiIiAmJiBcCi0gIGVjaG8gImVjaG8gXCIgfCBBcGFjaGUgdGhlIGZpcnN0IHRpbWUgYnkgcnVubmluZzogICAgICAgICAgICAgICAgICAgICAgfFwiIiAmJiBcCi0gIGVjaG8gImVjaG8gXCIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFwiIiAmJiBcCi0gIGVjaG8gImVjaG8gXCIgfCAgIFwkU1IvYmluL2FwYWNoZWN0bCBzdGFydCBcIiIgJiZcCi0gIGVjaG8gImVjaG8gXCIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFwiIiAmJiBcCi0gIGVjaG8gImVjaG8gXCIgfCBUaGFua3MgZm9yIHVzaW5nIEFwYWNoZS4gICAgICAgVGhlIEFwYWNoZSBHcm91cCAgICAgICAgfFwiIiAmJiBcCi0gIGVjaG8gImVjaG8gXCIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnLyAgfFwiIiAmJiBcCi0gIGVjaG8gImVjaG8gXCIgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1wiIiAmJiBcCi0gIGVjaG8gImVjaG8gXCIgXCIiIFwKLSkgPiBpbnN0YWxsLWJpbmRpc3Quc2gKLWNobW9kIDc1NSBpbnN0YWxsLWJpbmRpc3Quc2gKLQotc2VkIC1lICJzJVwiL2h0ZG9jcyVcIi91c3IvbG9jYWwvYXBhY2hlL2h0ZG9jcyUiIFwKLSAgICAtZSAicyVcIi9pY29ucyVcIi91c3IvbG9jYWwvYXBhY2hlL2ljb25zJSIgXAotICAgIC1lICJzJVwiL2NnaS1iaW4lXCIvdXNyL2xvY2FsL2FwYWNoZS9jZ2ktYmluJSIgXAotICAgIC1lICJzJV5TZXJ2ZXJBZG1pbi4qJVNlcnZlckFkbWluIHlvdUB5b3VyLmFkZHJlc3MlIiBcCi0gICAgLWUgInMlI1NlcnZlck5hbWUuKiUjU2VydmVyTmFtZSBsb2NhbGhvc3QlIiBcCi0gICAgLWUgInMlUG9ydCA4MDgwJVBvcnQgODAlIiBcCi0gICAgYmluZGlzdC9jb25mL2h0dHBkLmNvbmYuZGVmYXVsdCA+IGJpbmRpc3QvY29uZi9odHRwZC5jb25mCi1jcCBiaW5kaXN0L2NvbmYvaHR0cGQuY29uZiBiaW5kaXN0L2NvbmYvaHR0cGQuY29uZi5kZWZhdWx0Ci0KLWVjaG8gIkNyZWF0aW5nIGRpc3RyaWJ1dGlvbiBhcmNoaXZlIGFuZCByZWFkbWUgZmlsZS4uLiIKLSAKLWlmIFsgIi5gZ3JlcCAtaSBlcnJvciBidWlsZC5sb2cgPiAvZGV2L251bGxgIiAhPSAuIF0KLXRoZW4KLSAgZWNobyAiRVJST1I6IEZhaWxlZCB0byBidWlsZCBBcGFjaGUuIFNlZSBcImJ1aWxkLmxvZ1wiIGZvciBkZXRhaWxzLiIKLSAgZXhpdCAxOwotZWxzZQotICBpZiBbICIuJEdUQVIiICE9IC4gXQotICB0aGVuCi0gICAgJEdUQVIgLXpjZiAuLi9hcGFjaGUtJFZFUi0kT1MudGFyLmd6IC1DIC4uIC0tb3duZXI9cm9vdCAtLWdyb3VwPXJvb3QgYXBhY2hlLSRWRVIKLSAgZWxzZQotICAgIGlmIFsgIi4kVEFSIiAhPSAuIF0KLSAgICB0aGVuCi0gICAgICAkVEFSIC1jZiAuLi9hcGFjaGUtJFZFUi0kT1MudGFyIC1DIC4uIGFwYWNoZS0kVkVSCi0gICAgICBpZiBbICIuJEdaSVAiICE9IC4gXQotICAgICAgdGhlbgotICAgICAgICAkR1pJUCAuLi9hcGFjaGUtJFZFUi0kT1MudGFyCi0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gIkVSUk9SOiBDb3VsZCBub3QgZmluZCBhICd0YXInIHByb2dyYW0hIgotICAgICAgZWNobyAiICAgICAgIFBsZWFzZSBleGVjdXRlIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgbWFudWFsbHk6IgotICAgICAgZWNobyAiICAgICAgICAgdGFyIC1jZiAuLi9hcGFjaGUtJFZFUi0kT1MudGFyIC4iCi0gICAgICBlY2hvICIgICAgICAgICBnemlwIC4uL2FwYWNoZS0kVkVSLSRPUy50YXIiCi0gICAgZmkKLSAgZmkKLQotICBpZiBbIC1mIC4uL2FwYWNoZS0kVkVSLSRPUy50YXIuZ3ogXSAmJiBbIC1mIC4uL2FwYWNoZS0kVkVSLSRPUy5SRUFETUUgXQotICB0aGVuCi0gICAgZWNobyAiUmVhZHkuIgotICAgIGVjaG8gIllvdSBjYW4gZmluZCB0aGUgYmluYXJ5IGFyY2hpdmUgKGFwYWNoZS0kVkVSLSRPUy50YXIuZ3opIgotICAgIGVjaG8gImFuZCB0aGUgcmVhZG1lIGZpbGUgKGFwYWNoZS0kVkVSLSRPUy5SRUFETUUpIGluIHRoZSIKLSAgICBlY2hvICJwYXJlbnQgZGlyZWN0b3J5LiIKLSAgICBleGl0IDA7Ci0gIGVsc2UKLSAgICBleGl0IDE7Ci0gIGZpCi1maQpkaWZmIC0tZ2l0IGEvYnVpbGQvYnNkX21ha2VmaWxlIGIvYnVpbGQvYnNkX21ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MGNlNWZlLi4wMDAwMDAwCi0tLSBhL2J1aWxkL2JzZF9tYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotIyByZXNlcnZlZC4KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIyBhcmUgbWV0OgotIwotIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jCi0jIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotIyAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jICAgIGRpc3RyaWJ1dGlvbi4KLSMKLSMgMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0jICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0jICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotIyAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSMgICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotIyAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotIwotIyA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotIyAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSMgICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0jICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotIwotIyA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSMgICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0jICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0jIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0jIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0jIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSMgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSMgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSMgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0jIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotIyBTVUNIIERBTUFHRS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSMgaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0jIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotIyA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0jCi0jIFRoZSBidWlsZCBlbnZpcm9ubWVudCB3YXMgcHJvdmlkZWQgYnkgU2FzY2hhIFNjaHVtYW5uLgotIwotCi0jIGN3ZCBtdXN0IGJlIHRvcF9zcmNkaXIKLXRlc3QgLWYgYnVpbGQvYnNkX21ha2VmaWxlIHx8IGV4aXQgMgotCi10ZXN0IC1mIGJzZF9jb252ZXJ0ZWQgJiYgZXhpdCAwCi0KLXRtcGZpbGU9YG1rdGVtcCAvdG1wLyQwLlhYWFhYWGAgfHwgZXhpdCAxCi1mb3IgaSBpbiBidWlsZC8qLm1rOyBkbwotICAgIHNlZCAncy9eaW5jbHVkZSBcKC4qXCkvLmluY2x1ZGUgIlwxIi8nICRpID4kdG1wZmlsZSBcCi0gICAgICAgICYmIGNwICR0bXBmaWxlICRpCi1kb25lCi1ybSAtZiAkdG1wZmlsZQotCi10b3VjaCBic2RfY29udmVydGVkCi1leGl0IDAKZGlmZiAtLWdpdCBhL2J1aWxkL2J1aWxkLW1vZHVsZXMtYy5hd2sgYi9idWlsZC9idWlsZC1tb2R1bGVzLWMuYXdrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGE4NDIxLi4wMDAwMDAwCi0tLSBhL2J1aWxkL2J1aWxkLW1vZHVsZXMtYy5hd2sKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi1CRUdJTiB7Ci0gICAgUlMgPSAiICIKLSAgICBtb2R1bGVzW24rK10gPSAiY29yZSIKLSAgICBwbW9kdWxlc1twbisrXSA9ICJjb3JlIgotfSAKLXsgbW9kdWxlc1tuKytdID0gJDEgOyBwbW9kdWxlc1twbisrXSA9ICQxIH0gCi1FTkQgewotICAgIHByaW50ICIvKiIKLSAgICBwcmludCAiICogbW9kdWxlcy5jIC0tLSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBBcGFjaGUiCi0gICAgcHJpbnQgIiAqIGNvbmZpZ3VyYXRpb24gc2NyaXB0LiAgRE8gTk9UIEhBTkQgRURJVCEhISEhIgotICAgIHByaW50ICIgKi8iCi0gICAgcHJpbnQgIiIKLSAgICBwcmludCAiI2luY2x1ZGUgXCJodHRwZC5oXCIiCi0gICAgcHJpbnQgIiNpbmNsdWRlIFwiaHR0cF9jb25maWcuaFwiIgotICAgIHByaW50ICIiCi0gICAgZm9yIChpID0gMDsgaSA8IHBuOyArK2kpIHsKLSAgICAgICAgcHJpbnRmICgiZXh0ZXJuIG1vZHVsZSAlc19tb2R1bGU7XG4iLCBwbW9kdWxlc1tpXSkKLSAgICB9Ci0gICAgcHJpbnQgIiIKLSAgICBwcmludCAiLyoiCi0gICAgcHJpbnQgIiAqICBNb2R1bGVzIHdoaWNoIGltcGxpY2l0bHkgZm9ybSB0aGUiCi0gICAgcHJpbnQgIiAqICBsaXN0IG9mIGFjdGl2YXRlZCBtb2R1bGVzIG9uIHN0YXJ0dXAsIgotICAgIHByaW50ICIgKiAgaS5lLiB0aGVzZSBhcmUgdGhlIG1vZHVsZXMgd2hpY2ggYXJlIgotICAgIHByaW50ICIgKiAgaW5pdGlhbGx5IGxpbmtlZCBpbnRvIHRoZSBBcGFjaGUgcHJvY2Vzc2luZyIKLSAgICBwcmludCAiICogIFtleHRlbmRhYmxlIHVuZGVyIHJ1bi10aW1lIHZpYSBBZGRNb2R1bGVdIgotICAgIHByaW50ICIgKi8iCi0gICAgcHJpbnQgIm1vZHVsZSAqYXBfcHJlbGlua2VkX21vZHVsZXNbXSA9IHsiCi0gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICBwcmludGYgIiAgJiVzX21vZHVsZSxcbiIsIG1vZHVsZXNbaV0KLSAgICB9Ci0gICAgcHJpbnQgIiAgTlVMTCIKLSAgICBwcmludCAifTsiCi0gICAgcHJpbnQgIiIKLSAgICBwcmludCAiLyoiCi0gICAgcHJpbnQgIiAqICBNb2R1bGVzIHdoaWNoIGluaXRpYWxseSBmb3JtIHRoZSIKLSAgICBwcmludCAiICogIGxpc3Qgb2YgYXZhaWxhYmxlIG1vZHVsZXMgb24gc3RhcnR1cCwiCi0gICAgcHJpbnQgIiAqICBpLmUuIHRoZXNlIGFyZSB0aGUgbW9kdWxlcyB3aGljaCBhcmUiCi0gICAgcHJpbnQgIiAqICBpbml0aWFsbHkgbG9hZGVkIGludG8gdGhlIEFwYWNoZSBwcm9jZXNzIgotICAgIHByaW50ICIgKiAgW2V4dGVuZGFibGUgdW5kZXIgcnVuLXRpbWUgdmlhIExvYWRNb2R1bGVdIgotICAgIHByaW50ICIgKi8iCi0gICAgcHJpbnQgIm1vZHVsZSAqYXBfcHJlbG9hZGVkX21vZHVsZXNbXSA9IHsiCi0gICAgZm9yIChpID0gMDsgaSA8IHBuOyArK2kpIHsKLSAgICAgICAgcHJpbnRmICIgICYlc19tb2R1bGUsXG4iLCBwbW9kdWxlc1tpXQotICAgIH0KLSAgICBwcmludCAiICBOVUxMIgotICAgIHByaW50ICJ9OyIKLSAgICBwcmludCAiIgotfQpkaWZmIC0tZ2l0IGEvYnVpbGQvYnVpbGRpbmZvLnNoIGIvYnVpbGQvYnVpbGRpbmZvLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YzJhNzJkLi4wMDAwMDAwCi0tLSBhL2J1aWxkL2J1aWxkaW5mby5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0jIS9iaW4vc2gKLSMjCi0jIyAgYnVpbGRpbmZvLnNoIC0tIERldGVybWluZSBCdWlsZCBJbmZvcm1hdGlvbgotIyMgIEluaXRpYWxseSB3cml0dGVuIGJ5IFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBhcGFjaGUub3JnPgotIyMgIGZvciB0aGUgQXBhY2hlJ3MgQXV0b2NvbmYtc3R5bGUgSW50ZXJmYWNlIChBUEFDSSkgCi0jIwotIwotIyBUaGlzIHNjcmlwdCBmYWxscyB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UuCi0jIFNlZSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvZG9jcy9MSUNFTlNFCi0KLQotIwotIyAgIGFyZ3VtZW50IGxpbmUgaGFuZGxpbmcKLSMKLWVycm9yPW5vCi1pZiBbICQjIC1uZSAxIC1hICQjIC1uZSAyIF07IHRoZW4KLSAgICBlcnJvcj15ZXMKLWZpCi1pZiBbICQjIC1lcSAyIC1hICJ4JDEiICE9ICJ4LW4iIF07IHRoZW4KLSAgICBlcnJvcj15ZXMKLWZpCi1pZiBbICJ4JGVycm9yIiA9ICJ4eWVzIiBdOyB0aGVuCi0gICAgZWNobyAiJDA6RXJyb3I6IGludmFsaWQgYXJndW1lbnQgbGluZSIKLSAgICBlY2hvICIkMDpVc2FnZTogJDAgWy1uXSA8Zm9ybWF0LXN0cmluZz4iCi0gICAgZWNobyAiV2hlcmUgPGZvcm1hdC1zdHJpbmc+IGNhbiBjb250YWluOiIKLSAgICBlY2hvICIgICAldSAuLi4uLi4gc3Vic3RpdHV0ZWQgYnkgZGV0ZXJtaW5lZCB1c2VybmFtZSAgICAoZm9vKSIKLSAgICBlY2hvICIgICAlaCAuLi4uLi4gc3Vic3RpdHV0ZWQgYnkgZGV0ZXJtaW5lZCBob3N0bmFtZSAgICAoYmFyKSIKLSAgICBlY2hvICIgICAlZCAuLi4uLi4gc3Vic3RpdHV0ZWQgYnkgZGV0ZXJtaW5lZCBkb21haW5uYW1lICAoLmNvbSkiCi0gICAgZWNobyAiICAgJUQgLi4uLi4uIHN1YnN0aXR1dGVkIGJ5IGRldGVybWluZWQgZGF5ICAgICAgICAgKEREKSIKLSAgICBlY2hvICIgICAlTSAuLi4uLi4gc3Vic3RpdHV0ZWQgYnkgZGV0ZXJtaW5lZCBtb250aCAgICAgICAoTU0pIgotICAgIGVjaG8gIiAgICVZIC4uLi4uLiBzdWJzdGl0dXRlZCBieSBkZXRlcm1pbmVkIHllYXIgICAgICAgIChZWVlZWSkiCi0gICAgZWNobyAiICAgJW0gLi4uLi4uIHN1YnN0aXR1dGVkIGJ5IGRldGVybWluZWQgbW9udGhuYW1lICAgKEphbikiCi0gICAgZXhpdCAxCi1maQotaWYgWyAkIyAtZXEgMiBdOyB0aGVuCi0gICAgbmV3bGluZT1ubwotICAgIGZvcm1hdF9zdHJpbmc9IiQyIgotZWxzZQotICAgIG5ld2xpbmU9eWVzCi0gICAgZm9ybWF0X3N0cmluZz0iJDEiCi1maQotCi0jCi0jICAgaW5pdGlhbGl6YXRpb24KLSMKLXVzZXJuYW1lPScnCi1ob3N0bmFtZT0nJwotZG9tYWlubmFtZT0nJwotdGltZV9kYXk9JycKLXRpbWVfbW9udGg9JycKLXRpbWVfeWVhcj0nJwotdGltZV9tb250aG5hbWU9JycKLQotIwotIyAgIGRldGVybWluZSB1c2VybmFtZQotIwotdXNlcm5hbWU9IiRMT0dOQU1FIgotaWYgWyAieCR1c2VybmFtZSIgPSAieCIgXTsgdGhlbgotICAgIHVzZXJuYW1lPSIkVVNFUiIKLSAgICBpZiBbICJ4JHVzZXJuYW1lIiA9ICJ4IiBdOyB0aGVuCi0gICAgICAgIHVzZXJuYW1lPSJgKHdob2FtaSkgMj4vZGV2L251bGwgfFwKLSAgICAgICAgICAgICAgICAgICBhd2sgJ3sgcHJpbnRmKCIlcyIsICQxKTsgfSdgIgotICAgICAgICBpZiBbICJ4JHVzZXJuYW1lIiA9ICJ4IiBdOyB0aGVuCi0gICAgICAgICAgICB1c2VybmFtZT0iYCh3aG8gYW0gaSkgMj4vZGV2L251bGwgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgYXdrICd7IHByaW50ZigiJXMiLCAkMSk7IH0nYCIKLSAgICAgICAgICAgIGlmIFsgIngkdXNlcm5hbWUiID0gIngiIF07IHRoZW4KLSAgICAgICAgICAgICAgICB1c2VybmFtZT0ndW5rbm93bicKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgZmkKLWZpCi0KLSMKLSMgICBkZXRlcm1pbmUgaG9zdG5hbWUgYW5kIGRvbWFpbm5hbWUKLSMKLWhvc3RuYW1lPSJgKHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8XAotICAgICAgICAgICBhd2sgJ3sgcHJpbnRmKCIlcyIsICQxKTsgfSdgIgotaWYgWyAieCRob3N0bmFtZSIgPSAieCIgXTsgdGhlbgotICAgIGhvc3RuYW1lPSJgKGhvc3RuYW1lKSAyPi9kZXYvbnVsbCB8XAotICAgICAgICAgICAgICAgYXdrICd7IHByaW50ZigiJXMiLCAkMSk7IH0nYCIKLSAgICBpZiBbICJ4JGhvc3RuYW1lIiA9ICJ4IiBdOyB0aGVuCi0gICAgICAgIGhvc3RuYW1lPSd1bmtub3duJwotICAgIGZpCi1maQotY2FzZSAkaG9zdG5hbWUgaW4KLSAgICAqLiogKQotICAgICAgICBkb21haW5uYW1lPSIuYGVjaG8gJGhvc3RuYW1lIHwgY3V0IC1kLiAtZjItYCIKLSAgICAgICAgaG9zdG5hbWU9ImBlY2hvICRob3N0bmFtZSB8IGN1dCAtZC4gLWYxYCIKLSAgICAgICAgOzsKLWVzYWMKLWlmIFsgIngkZG9tYWlubmFtZSIgPSAieCIgXTsgdGhlbgotICAgIGlmIFsgLWYgL2V0Yy9yZXNvbHYuY29uZiBdOyB0aGVuCi0gICAgICAgIGRvbWFpbm5hbWU9ImBlZ3JlcCAnXlsgCV0qZG9tYWluJyAvZXRjL3Jlc29sdi5jb25mIHwgaGVhZCAtMSB8XAotICAgICAgICAgICAgICAgICAgICAgc2VkIC1lICdzLy4qZG9tYWluLy8nIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAtZSAncy9eWyAJXSovLycgLWUgJ3MvXiAqLy8nIC1lICdzL14JKi8vJyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvXlwuLy8nIC1lICdzL14vLi8nIHxcCi0gICAgICAgICAgICAgICAgICAgICBhd2sgJ3sgcHJpbnRmKCIlcyIsICQxKTsgfSdgIgotICAgICAgICBpZiBbICJ4JGRvbWFpbm5hbWUiID0gIngiIF07IHRoZW4KLSAgICAgICAgICAgIGRvbWFpbm5hbWU9ImBlZ3JlcCAnXlsgCV0qc2VhcmNoJyAvZXRjL3Jlc29sdi5jb25mIHwgaGVhZCAtMSB8XAotICAgICAgICAgICAgICAgICAgICAgICAgIHNlZCAtZSAncy8uKnNlYXJjaC8vJyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1lICdzL15bIAldKi8vJyAtZSAncy9eICovLycgLWUgJ3MvXgkqLy8nIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvIC4qLy8nIC1lICdzLwkuKi8vJyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1lICdzL15cLi8vJyAtZSAncy9eLy4vJyB8XAotICAgICAgICAgICAgICAgICAgICAgICAgIGF3ayAneyBwcmludGYoIiVzIiwgJDEpOyB9J2AiCi0gICAgICAgIGZpCi0gICAgZmkKLWZpCi0KLSMKLSMgICBkZXRlcm1pbmUgY3VycmVudCB0aW1lCi0jCi10aW1lX2RheT0iYGRhdGUgJyslZCcgfCBhd2sgJ3sgcHJpbnRmKCIlcyIsICQxKTsgfSdgIgotdGltZV9tb250aD0iYGRhdGUgJyslbScgfCBhd2sgJ3sgcHJpbnRmKCIlcyIsICQxKTsgfSdgIgotdGltZV95ZWFyPSJgZGF0ZSAnKyVZJyAyPi9kZXYvbnVsbCB8IGF3ayAneyBwcmludGYoIiVzIiwgJDEpOyB9J2AiCi1pZiBbICJ4JHRpbWVfeWVhciIgPSAieCIgXTsgdGhlbgotICAgIHRpbWVfeWVhcj0iYGRhdGUgJysleScgfCBhd2sgJ3sgcHJpbnRmKCIlcyIsICQxKTsgfSdgIgotICAgIGNhc2UgJHRpbWVfeWVhciBpbgotICAgICAgICBbNS05XVswLTldKSB0aW1lX3llYXI9IjE5JHRpbWVfeWVhciIgOzsKLSAgICAgICAgWzAtNF1bMC05XSkgdGltZV95ZWFyPSIyMCR0aW1lX3llYXIiIDs7Ci0gICAgZXNhYwotZmkKLWNhc2UgJHRpbWVfbW9udGggaW4KLSAgICAxfDAxKSB0aW1lX21vbnRobmFtZT0nSmFuJyA7OwotICAgIDJ8MDIpIHRpbWVfbW9udGhuYW1lPSdGZWInIDs7Ci0gICAgM3wwMykgdGltZV9tb250aG5hbWU9J01hcicgOzsKLSAgICA0fDA0KSB0aW1lX21vbnRobmFtZT0nQXByJyA7OwotICAgIDV8MDUpIHRpbWVfbW9udGhuYW1lPSdNYXknIDs7Ci0gICAgNnwwNikgdGltZV9tb250aG5hbWU9J0p1bicgOzsKLSAgICA3fDA3KSB0aW1lX21vbnRobmFtZT0nSnVsJyA7OwotICAgIDh8MDgpIHRpbWVfbW9udGhuYW1lPSdBdWcnIDs7Ci0gICAgOXwwOSkgdGltZV9tb250aG5hbWU9J1NlcCcgOzsKLSAgICAgIDEwKSB0aW1lX21vbnRobmFtZT0nT2N0JyA7OwotICAgICAgMTEpIHRpbWVfbW9udGhuYW1lPSdOb3YnIDs7Ci0gICAgICAxMikgdGltZV9tb250aG5hbWU9J0RlYycgOzsKLWVzYWMKLQotIwotIyAgIGNyZWF0ZSByZXN1bHQgc3RyaW5nCi0jCi1pZiBbICJ4JG5ld2xpbmUiID0gInh5ZXMiIF07IHRoZW4KLSAgICBlY2hvICRmb3JtYXRfc3RyaW5nIHxcCi0gICAgc2VkIC1lICJzOyV1OyR1c2VybmFtZTtnIiBcCi0gICAgICAgIC1lICJzOyVoOyRob3N0bmFtZTtnIiBcCi0gICAgICAgIC1lICJzOyVkOyRkb21haW5uYW1lO2ciIFwKLSAgICAgICAgLWUgInM7JUQ7JHRpbWVfZGF5O2ciIFwKLSAgICAgICAgLWUgInM7JU07JHRpbWVfbW9udGg7ZyIgXAotICAgICAgICAtZSAiczslWTskdGltZV95ZWFyO2ciIFwKLSAgICAgICAgLWUgInM7JW07JHRpbWVfbW9udGhuYW1lO2ciCi1lbHNlCi0gICAgZWNobyAiJHtmb3JtYXRfc3RyaW5nfSYiIHxcCi0gICAgc2VkIC1lICJzOyV1OyR1c2VybmFtZTtnIiBcCi0gICAgICAgIC1lICJzOyVoOyRob3N0bmFtZTtnIiBcCi0gICAgICAgIC1lICJzOyVkOyRkb21haW5uYW1lO2ciIFwKLSAgICAgICAgLWUgInM7JUQ7JHRpbWVfZGF5O2ciIFwKLSAgICAgICAgLWUgInM7JU07JHRpbWVfbW9udGg7ZyIgXAotICAgICAgICAtZSAiczslWTskdGltZV95ZWFyO2ciIFwKLSAgICAgICAgLWUgInM7JW07JHRpbWVfbW9udGhuYW1lO2ciIHxcCi0gICAgYXdrICctRiYnICd7IHByaW50ZigiJXMiLCAkMSk7IH0nCi1maQotCmRpZmYgLS1naXQgYS9idWlsZC9jb25maWctc3R1YnMgYi9idWlsZC9jb25maWctc3R1YnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmZjAwYTUuLjAwMDAwMDAKLS0tIGEvYnVpbGQvY29uZmlnLXN0dWJzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIS9iaW4vc2gKLQotZGlyPSQxCi1mb3Igc3R1YmRpciBpbiBgZmluZCAkZGlyIC10eXBlIGRgOyBkbwotICAgIGlmIFsgLXIgJHN0dWJkaXIvY29uZmlnLm00IF07IHRoZW4KLSAgICAgICAgZWNobyAic2luY2x1ZGUoJHN0dWJkaXIvY29uZmlnLm00KSIKLSAgICBmaQotZG9uZQpkaWZmIC0tZ2l0IGEvYnVpbGQvZGVmYXVsdC5wbCBiL2J1aWxkL2RlZmF1bHQucGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYzBiMGMuLjAwMDAwMDAKLS0tIGEvYnVpbGQvZGVmYXVsdC5wbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5NiArMCwwIEBACi08PAotIyBTY2FuZG9jIHRlbXBsYXRlIGZpbGUuCi0jCi0jIFRoaXMgaXMgYW4gZXhhbXBsZSBzZXQgb2YgdGVtcGxhdGVzIHRoYXQgaXMgZGVzaWduZWQgdG8gY3JlYXRlIHNldmVyYWwgCi0jIGRpZmZlcmVudCBraW5kcyBvZiBpbmRleCBmaWxlcy4gSXQgZ2VuZXJhdGVzIGEgIm1hc3RlciBpbmRleCIgd2hpY2ggaW50ZW5kZWQgCi0jIGZvciB1c2Ugd2l0aCBhIGZyYW1lcyBicm93c2VyOyBBICJwYWNrYWdlIGluZGV4IiB3aGljaCBpcyB0aGUgcm9vdCBwYWdlIG9mIAotIyB0aGUgaW5kZXgsIGFuZCB0aGVuICJwYWNrYWdlIGZpbGVzIiBjb250YWluaW5nIGRvY3VtZW50YXRpb24gZm9yIGFsbCBvZiB0aGUgCi0jIGNsYXNzZXMgd2l0aGluIGEgc2luZ2xlIHBhY2thZ2UuCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyMgRm9yIHF1aWNrIGFuZCBzdXBlcmZpY2lhbCBjdXN0b21pemF0aW9uLCAKLSMjIHNpbXBseSBjaGFuZ2UgdGhlc2UgdmFyaWFibGVzCi0KLSRwcm9qZWN0X25hbWUgICAgID0gJ1tBcGFjaGVdJzsKLSRjb21wYW55X2xvZ28gICAgID0gJzxpbWcgc3JjPSIuLi9pbWFnZXMvU2NhbkRvY0JpZy5qcGciPic7ICMgY2hhbmdlIHRoaXMgdG8gYW4gaW1hZ2UgdGFnLgotJGNvcHlyaWdodCAgICAgICAgPSAnJmNvcHkgMjAwMCBbQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb25dJzsKLSRpbWFnZV9kaXJlY3RvcnkgID0gIi4uL2ltYWdlcy8iOwotJGJ1bGxldDFfaW1hZ2UgICAgPSAkaW1hZ2VfZGlyZWN0b3J5IC4gImJhbGwxLmdpZiI7Ci0kYnVsbGV0Ml9pbWFnZSAgICA9ICRpbWFnZV9kaXJlY3RvcnkgLiAiYmFsbDIuZ2lmIjsKLSRiZ2NvbG9yMSAgICAgICAgID0gIiNGRkZGRkYiOwotJGJnY29sb3IyICAgICAgICAgPSAiI0ZGRkZGRiI7Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyMgQmVnaW4gZ2VuZXJhdGluZyBmcmFtZSBpbmRleCBmaWxlLgotCi1maWxlICJpbmRleC5odG1sIjsKLT4+PGh0bWw+Ci0gIDxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBpc28tODg1OS0xIj4KLSAgICA8dGl0bGU+JHByb2plY3RfbmFtZTwvdGl0bGU+Ci0gIDwvaGVhZD4KLSAgPGZyYW1lc2V0IGNvbHM9IjE5MCwwJSI+Ci0gICAgPGZyYW1lIHNyYz0ibWFzdGVyLmh0bWwiICBuYW1lPSJNYXN0ZXIgSW5kZXgiIG5vcmVzaXplPgotICAgIDxmcmFtZSBzcmM9InBhY2thZ2VzLmh0bWwiIG5hbWU9IkRvY3VtZW50YXRpb24iPgotICAgIDxub2ZyYW1lcz4KLSAgICAgIDxib2R5IGJnY29sb3I9IiRiZ2NvbG9yMiIgc3R5bGVzcmM9ImluZGV4Lmh0bWwiPgotICAgICAgICA8cD5Tb21lIERvY3VtZW50YXRpb248L3A+Ci0gICAgICA8L2JvZHk+Ci0gICAgPC9ub2ZyYW1lcz4KLSAgPC9mcmFtZXNldD4KLTwvaHRtbD4KLTw8Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyMgQmVnaW4gZ2VuZXJhdGluZyBtYXN0ZXIgaW5kZXggZmlsZSAobGVmdC1oYW5kIGZyYW1lKS4KLQotZmlsZSAibWFzdGVyLmh0bWwiOwotPj48aHRtbD4KLSAgPGhlYWQ+Ci0gICAgPHRpdGxlPk1hc3RlciBJbmRleDwvdGl0bGU+Ci0gIDwvaGVhZD4KLSAgPGJvZHkgYmdjb2xvcj0iJGJnY29sb3IxIiB0ZXh0PSMwMDAwZmYgbGluaz0jMDAyMGZmIHZsaW5rPSMwMDIwZmY+Ci0gICAgPGNlbnRlcj48aW1nIHNyYz0iJHtpbWFnZV9kaXJlY3Rvcnl9U2NhbkRvY1NtYWxsLmpwZyIgYm9yZGVyPSIwIiAvPjwvY2VudGVyPgotICAgIDxwPgotICAgIDxhIGhyZWY9InBhY2thZ2VzLmh0bWwiIHRhcmdldD0iRG9jdW1lbnRhdGlvbiI+TWFzdGVyIEluZGV4PC9hPgotICAgIDwvcD4KLSAgICA8cD4KLSAgICAgIDxmb250IHNpemU9IjIiPgotICAgICAgICA8bm9icj4KLTw8Ci0KLSMjIEZvciBlYWNoIHBhY2thZ2UsIGdlbmVyYXRlIGFuIGluZGV4IGVudHJ5LgotCi1mb3JlYWNoICRwIChwYWNrYWdlcygpKSB7Ci0gICRfID0gJHAtPnVybDsKLSAgcy9ccy8lMjAvZzsKLSAgPj48YSBocmVmPSIkXyIgdGFyZ2V0PSJEb2N1bWVudGF0aW9uIj48Yj4kKHAubmFtZSk8L2I+PC9hPjxicj4KLSAgICA8ZGlyPgotICA8PAotICBmb3JlYWNoICRlICgkcC0+Y2xhc3NlcygpKSB7Ci0gICAgJF8gPSAkZS0+dXJsOwotICAgIHMvXHMvJTIwL2c7Ci0gICAgPj48bGk+PGEgaHJlZj0iJF8iIHRhcmdldD0iRG9jdW1lbnRhdGlvbiI+JChlLmZ1bGxuYW1lKTwvYT4KLSAgICA8PAotICB9Ci0gIGZvcmVhY2ggJGUgKCRwLT5nbG9iYWxzKCkpIHsKLSAgICAkXyA9ICRlLT51cmw7Ci0gICAgcy9ccy8lMjAvZzsKLSAgICA+PjxsaT48YSBocmVmPSIkXyIgdGFyZ2V0PSJEb2N1bWVudGF0aW9uIj4kKGUuZnVsbG5hbWUpPC9hPgotICAgIDw8Ci0gIH0KLSAgPj48L2Rpcj48PAotfQotCi0+PgotICAgICAgICAgIDxhIGhyZWY9InRvLWRvLmh0bWwiIHRhcmdldD0iRG9jdW1lbnRhdGlvbiI+PGI+VG8tRG8gTGlzdDwvYj48L2E+PGJyPgotICAgICAgICA8L25vYnI+Ci0gICAgICA8L2ZvbnQ+Ci0gICAgPC9wPgotICA8L2JvZHk+Ci08L2h0bWw+Ci08PAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjIEJlZ2luIGdlbmVyYXRpbmcgcGFja2FnZSBpbmRleCBmaWxlCi0KLWZpbGUgInBhY2thZ2VzLmh0bWwiOwotPj48aHRtbD4KLSAgPGhlYWQ+Ci0gICAgPHRpdGxlPiRwcm9qZWN0X25hbWUgLS0gUGFja2FnZXM8L3RpdGxlPgotICA8L2hlYWQ+Ci0gIDxib2R5IGJnY29sb3I9IiRiZ2NvbG9yMiI+Ci0KLSAgICA8Y2VudGVyPiRjb21wYW55X2xvZ28KLSAgICA8aDE+RG9jdW1lbnRhdGlvbiBmb3IgJHByb2plY3RfbmFtZTwvaDE+Ci0gICAgPC9jZW50ZXI+Ci0gICAgPGgyPlBhY2thZ2UgTGlzdDwvaDI+Ci08PAotCi0jIyBGb3IgZWFjaCBwYWNrYWdlLCBnZW5lcmF0ZSBhbiBpbmRleCBlbnRyeS4KLQotZm9yZWFjaCAkcCAocGFja2FnZXMoKSkgewotICAkXyA9ICRwLT51cmw7Ci0gIHMvXHMvJTIwL2c7Ci0gID4+PGEgaHJlZiA9ICIkXyI+JChwLm5hbWUpPC9hPjxicj4KLSAgPDwKLX0KLQotPj4KLSAgICA8cD4KLSAgICA8aHIgc2l6ZT00PgotICAgICRjb3B5cmlnaHQ8YnI+Ci0gICAgR2VuZXJhdGVkIGJ5IDxhIGhyZWY9IiRzY2FuZG9jVVJMIj48Yj5TY2FuRG9jICRtYWpvclZlcnNpb24uJG1pbm9yVmVyc2lvbjwvYj48L2E+PGJyPgotICAgIExhc3QgVXBkYXRlZDogJGRhdGU8YnI+Ci0gIDwvYm9keT4KLTwvaHRtbD4KLQotPDwKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIyBHZW5lcmF0ZSAiVG8tZG8gbGlzdCIKLQotZmlsZSAidG8tZG8uaHRtbCI7Ci0+PjxodG1sPgotICA8aGVhZD4KLSAgICA8dGl0bGU+JHByb2plY3RfbmFtZSAtLSBUby1EbyBsaXN0PC90aXRsZT4KLSAgPC9oZWFkPgotICA8Ym9keSBiZ2NvbG9yPSIkYmdjb2xvcjIiPgotCi0gICAgJGNvbXBhbnlfbG9nbwotCi0gICAgPGgxPlRvLWRvIGxpc3QgZm9yICRwcm9qZWN0X25hbWU8L2gxPgotPDwKLQotaWYgKCZ0b2RvbGlzdEZpbGVzKCkpIHsKLSAgPj48aHIgc2l6ZT00PjxwPgotICA8PAotICBmb3JlYWNoICRmICgmdG9kb2xpc3RGaWxlcygpKSB7Ci0gICAgbXkgQG0gPSAmdG9kb2xpc3RFbnRyaWVzKCAkZiApOwotICAgIGlmICgkZiA9fiAvKFteXC9dKykkLykgeyAkZiA9ICQxOyB9Ci0gICAgPj48Yj4kZjo8L2I+PHVsPgotICAgIDw8Ci0gICAgZm9yZWFjaCAkdGV4dCAoQG0pIHsKLSAgICAgIGlmICgkdGV4dCkgewotICAgICAgICBwcmludCAiPGxpPiIsICZwcm9jZXNzRGVzY3JpcHRpb24oICR0ZXh0ICksICJcbiI7Ci0gICAgICB9Ci0gICAgfQotICAgID4+PC91bD4KLSAgICA8PAotICB9Ci19Ci0KLT4+Ci0gICAgPGhyIHNpemU9ND4KLSAgICAkY29weXJpZ2h0PGJyPgotICAgIEdlbmVyYXRlZCBieSA8YSBocmVmPSIkc2NhbmRvY1VSTCI+PGI+U2NhbkRvYyAkbWFqb3JWZXJzaW9uLiRtaW5vclZlcnNpb248L2I+PC9hPjxicj4KLSAgICBMYXN0IFVwZGF0ZWQ6ICRkYXRlPGJyPgotICA8L2JvZHk+Ci08L2h0bWw+Ci08PAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjIEdlbmVyYXRlIGluZGl2aWR1YWwgZmlsZXMgZm9yIGVhY2ggcGFja2FnZS4KLQotbXkgJHA7Ci1mb3JlYWNoICRwIChwYWNrYWdlcygpKSB7Ci0gIGZpbGUgJHAtPm5hbWUoKSAuICIuaHRtbCI7Ci0gID4+PGh0bWw+Ci0gIDxoZWFkPgotICAgIDx0aXRsZT4kcHJvamVjdF9uYW1lIC0tICQocC5uYW1lKTwvdGl0bGU+Ci0gIDwvaGVhZD4KLSAgPGJvZHkgYmdjb2xvcj0iJGJnY29sb3IyIj4KLSAgICA8Y2VudGVyPgotICAgICAgPGZvbnQgc2l6ZT02PjxiPiRwcm9qZWN0X25hbWU8L2I+PC9mb250PgotICAgICAgPGhyIHNpemU9ND48cD4KLSAgICA8L2NlbnRlcj4KLQotICAgIDxoMj5QYWNrYWdlIE5hbWU6ICQocC5uYW1lKTwvaDI+Ci0gICAgPGI+Ci08PAotCi0jIyBHZW5lcmF0ZSBjbGFzcyBhbmQgbWVtYmVyIGluZGV4IGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUuCi0KLWZvcmVhY2ggJGMgKCRwLT5jbGFzc2VzKCkpIHsKLSAgPj48aDM+PGltZyBzcmM9IiRidWxsZXQxX2ltYWdlIiB3aWR0aD0xOCBoZWlnaHQ9MTcgYWxpZ249dGV4dHRvcD4KLSAgICA8YSBocmVmPSIkKGMudXJsKSI+JChjLmZ1bGxuYW1lKTwvaDM+PC9hPgotICAgIDx1bD4KLSAgPDwKLSAgZm9yZWFjaCAkbSAoJGMtPm1lbWJlcnMoKSkgewotICAgID4+PGxpPjxhIGhyZWY9IiQobS51cmwpIj4kKG0ubG9uZ25hbWUpPC9hPgotICAgIDw8Ci0gIH0KLSAgPj48L3VsPgotICA8PAotfQotCi0+PgotPC9iPgotPDwKLQotIyMgR2VuZXJhdGUgZGV0YWlsZWQgY2xhc3MgZG9jdW1lbnRhdGlvbgotZm9yZWFjaCAkYyAoJHAtPmNsYXNzZXMoKSkgewotICMjIE91dHB1dCBzZWFyY2hhYmxlIGtleXdvcmQgbGlzdAotIGlmICgkYy0+a2V5d29yZHMoKSkgewotICAgcHJpbnQgIjwhLS0gIiwgJGMtPmtleXdvcmRzKCksICIgLS0+XG4iOwotIH0KLQotID4+PGhyIHNpemU9IjQiPgotICAgPGEgbmFtZT0iJChjLmFuY2hvcikiPjwvYT4KLSAgIDxoMT4kKGMuZnVsbG5hbWUpPC9oMT4KLSAgIDx0YWJsZSBiZ2NvbG9yPSJmZmZmZmYiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjQiPgotICAgICA8dHI+Ci0gICAgICAgPHRoIGFsaWduPWNlbnRlciBjb2xzcGFuPTI+Ci0gICAgICAgPC90aD4KLSAgICAgPC90cj4KLSAgPDwKLSAgCi0gICMgT3V0cHV0IGF1dGhvciB0YWcKLSAgaWYgKCRjLT5hdXRob3IoKSkgewotICAgID4+PHRyPjx0aCB3aWR0aD0yMCUgYWxpZ249cmlnaHQ+QXV0aG9yOjwvdGg+PDwKLSAgICA+Pjx0ZD4kKGMuYXV0aG9yKTwvdGQ+PC90cj48PAotICB9Ci0KLSAgIyBPdXRwdXQgcGFja2FnZSB2ZXJzaW9uCi0gIGlmICgkYy0+dmVyc2lvbigpKSB7Ci0gICAgPj48dHI+PHRoIHdpZHRoPTIwJSBhbGlnbj1yaWdodD5WZXJzaW9uOjwvdGg+PDwKLSAgICA+Pjx0ZD4kKGMudmVyc2lvbik8L3RkPjwvdHI+PDwKLSAgfQotCi0gICMgT3V0cHV0IFNvdXJjZSBmaWxlCi0gIGlmICgkYy0+c291cmNlZmlsZSgpKSB7Ci0gICAgPj48dHI+PHRoIHdpZHRoPTIwJSBhbGlnbj1yaWdodD5Tb3VyY2U6PC90aD48PAotICAgID4+PHRkPiQoYy5zb3VyY2VmaWxlKTwvdGQ+PC90cj48PAotICB9Ci0KLSAgIyBPdXRwdXQgYmFzZSBjbGFzcyBsaXN0Ci0gIGlmICgkYy0+YmFzZWNsYXNzZXMoKSkgewotICAgID4+PHRyPjx0aCB3aWR0aD0yMCUgYWxpZ249cmlnaHQ+QmFzZSBjbGFzc2VzOjwvdGg+Ci0gICAgPHRkPjw8Ci0gICAgbXkgQHQgPSAoKTsKLSAgICBmb3JlYWNoICRiICgkYy0+YmFzZWNsYXNzZXMoKSkgewotICAgICAgbXkgJG5hbWUgPSAkYi0+bmFtZSgpOwotICAgICAgaWYgKCR1cmwgPSAkYi0+dXJsKCkpIHsKLSAgICAgICAgcHVzaCBAdCwgIjxhIGhyZWY9XCIkdXJsXCI+JG5hbWU8L2E+IjsKLSAgICAgIH0KLSAgICAgIGVsc2UgeyBwdXNoIEB0LCAkbmFtZTsgfQotICAgIH0KLSAgICBwcmludCBqb2luKCAnLCAnLCBAdCApOwotICAgID4+PC90ZD48L3RyPgotICAgIDw8Ci0gIH0JCi0KLSAgIyBPdXRwdXQgc3ViY2xhc3NlcyBsaXN0Ci0gIGlmICgkYy0+c3ViY2xhc3NlcygpKSB7Ci0gICAgPj48dHI+PHRoIHdpZHRoPTIwJSBhbGlnbj1yaWdodD5TdWJjbGFzc2VzOjwvdGg+Ci0gICAgICA8dGQ+PDwKLSAgICBteSBAdCA9ICgpOwotICAgIGZvcmVhY2ggJHMgKCRjLT5zdWJjbGFzc2VzKCkpIHsKLSAgICAgIG15ICRuYW1lID0gJHMtPm5hbWUoKTsKLSAgICAgIGlmICgkdXJsID0gJHMtPnVybCgpKSB7Ci0gICAgICAgIHB1c2ggQHQsICI8YSBocmVmPVwiJHVybFwiPiRuYW1lPC9hPiI7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsgcHVzaCBAdCwgJG5hbWU7IH0KLSAgICB9Ci0gICAgcHJpbnQgam9pbiggJywgJywgQHQgKTsKLSAgICA+PjwvdGQ+PC90cj48PAotICB9Ci0KLSAgIyBPdXRwdXQgbWFpbiBjbGFzcyBkZXNjcmlwdGlvbgotICA+PjwvdHI+Ci0gIDwvdGFibGU+Ci0gIDxwPgotICA8PAotICBwcmludCAmcHJvY2Vzc0Rlc2NyaXB0aW9uKCAkYy0+ZGVzY3JpcHRpb24oKSApOwotCQotICAjIE91dHB1dCAic2VlIGFsc28iIGluZm9ybWF0aW9uCi0gIGlmICgkYy0+c2VlYWxzbygpKSB7Ci0gICAgPj48cD48ZHQ+PGI+U2VlIEFsc288L2I+PGRkPgotICAgIDw8Ci0gICAgbXkgQHIgPSAoKTsKLSAgICBmb3JlYWNoICRhICgkYy0+c2VlYWxzbygpKSB7Ci0gICAgICBteSAkbmFtZSA9ICRhLT5uYW1lKCk7Ci0gICAgICBpZiAoJHVybCA9ICRhLT51cmwoKSkgewotICAgICAgICBwdXNoIEByLCAiPGEgaHJlZj1cIiR1cmxcIj4kbmFtZTwvYT4iOwotICAgICAgfQotICAgICAgZWxzZSB7IHB1c2ggQHIsICRuYW1lOyB9Ci0gICAgfQotICAgIHByaW50IGpvaW4oICcsJywgQHIgKTsKLSAgICA+PjxwPgotICAgIDw8Ci0gIH0KLQotICAjIE91dHB1dCBjbGFzcyBtZW1iZXIgaW5kZXgKLSAgaWYgKCRjLT5tZW1iZXJzKCkpIHsKLSAgICBwcmludCAiPGgyPk1lbWJlciBJbmRleDwvaDI+XG4iOwotICAgIHByaW50ICI8dWw+IjsKLSAgICBmb3JlYWNoICRtICgkYy0+bWVtYmVycygpKSB7Ci0gICAgICA+PjxsaT48YSBocmVmPSIkKG0udXJsKSI+JChtLmZ1bGxuYW1lKTwvYT4KLQk8PAotICAgIH0KLSAgICA+PjwvdWw+PDwKLSAgfQotIAotICAjIE91dHB1dCBjbGFzcyBtZW1iZXIgdmFyaWFibGUgZG9jdW1lbnRhdGlvbgotICBpZiAoJGMtPm1lbWJlcnZhcnMoKSkgewotICAgIHByaW50ICI8aDI+Q2xhc3MgVmFyaWFibGVzPC9oMj5cbiI7Ci0gICAgcHJpbnQgIjxibG9ja3F1b3RlPlxuIjsKLSAgICBmb3JlYWNoICRtICgkYy0+bWVtYmVydmFycygpKSB7ICZ2YXJpYWJsZSggJG0gKTsgfQotICAgIHByaW50ICI8L2Jsb2NrcXVvdGU+XG4iOwotICB9Ci0KLSAgIyBPdXRwdXQgY2xhc3MgbWVtYmVyIGZ1bmN0aW9uIGRvY3VtZW50YXRpb24KLSAgaWYgKCRjLT5tZW1iZXJmdW5jcygpKSB7Ci0gICAgcHJpbnQgIjxoMj5DbGFzcyBNZXRob2RzPC9oMj5cbiI7Ci0gICAgcHJpbnQgIjxibG9ja3F1b3RlPlxuIjsKLSAgICBmb3JlYWNoICRtICgkYy0+bWVtYmVyZnVuY3MoKSkgeyAmZnVuY3Rpb24oICRtICk7IH0KLSAgICBwcmludCAiPC9ibG9ja3F1b3RlPlxuIjsKLSAgfQotfQotCi0jIE91dHB1dCBnbG9iYWwgdmFyaWFibGVzCi1pZiAoJHAtPmdsb2JhbHZhcnMoKSkgewotICA+PjxoMj5HbG9iYWwgVmFyaWFibGVzPC9oMj4KLSAgICA8YmxvY2txdW90ZT4KLSAgPDwKLSAgZm9yZWFjaCAkbSAoJHAtPmdsb2JhbHZhcnMoKSkgeyAmdmFyaWFibGUoICRtICk7IH0KLSAgcHJpbnQgIjwvYmxvY2txdW90ZT5cbiI7Ci19Ci0KLSMgT3V0cHV0IGdsb2JhbCBmdW5jdGlvbnMKLWlmICgkcC0+Z2xvYmFsZnVuY3MoKSkgewotICA+PjxoMj5HbG9iYWwgRnVuY3Rpb25zPC9oMj4KLSAgICA8YmxvY2txdW90ZT4KLSAgPDwKLSAgZm9yZWFjaCAkbSAoJHAtPmdsb2JhbGZ1bmNzKCkpIHsgJmZ1bmN0aW9uKCAkbSApOyB9Ci0gIHByaW50ICI8L2Jsb2NrcXVvdGU+XG4iOwotfQotCi0+PgotICAgIDxociBzaXplPTQ+Ci0gICAgJGNvcHlyaWdodDxicj4KLSAgICBHZW5lcmF0ZWQgYnkgPGEgaHJlZj0iJHNjYW5kb2NVUkwiPjxiPlNjYW5Eb2MgJG1ham9yVmVyc2lvbi4kbWlub3JWZXJzaW9uPC9iPjwvYT48YnI+Ci0gICAgTGFzdCBVcGRhdGVkOiAkZGF0ZTxicj4KLSAgPC9ib2R5PgotPC9odG1sPgotPDwKLX0gIyBlbmQgb2YgZm9yZWFjaCAocGFja2FnZXMpIGxvb3AKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIyBTdWJyb3V0aW5lIHRvIGdlbmVyYXRlIGRvY3VtZW50YXRpb24gZm9yIGEgbWVtYmVyIGZ1bmN0aW9uIG9yIGdsb2JhbCBmdW5jdGlvbgotCi1zdWIgZnVuY3Rpb24gewotICBsb2NhbCAoJGYpID0gQF87Ci0gIAotICBpZiAoJGYtPmtleXdvcmRzKCkpIHsKLSAgICA+PjwhLS0gJChmLmtleXdvcmRzKSAtLT4KLSAgICAgIDw8Ci0gIH0KLSAgPj4KLSAgPGEgbmFtZT0iJChmLmFuY2hvcikiPjwvYT4KLSAgPGRsPgotICAgIDxkdD4KLSAgICAgPGI+PGltZyBzcmM9IiRidWxsZXQyX2ltYWdlIiB3aWR0aD0xOSBoZWlnaHQ9MTcgYWxpZ249dGV4dHRvcD4kKGYuZnVsbG5hbWUpOzwvYj4KLSAgICA8ZGQ+Ci0gIDw8Ci0gIHByaW50ICZwcm9jZXNzRGVzY3JpcHRpb24oICRmLT5kZXNjcmlwdGlvbigpICk7Ci0gID4+Ci0gIDxwPjxkbD4KLSAgPDwKLSAgaWYgKCRmLT5wYXJhbXMoKSkgewotICAgID4+Ci0gICAgICA8ZHQ+PGI+UGFyYW1ldGVyczwvYj48ZGQ+Ci0JPHRhYmxlIHdpZHRoPSI4NSUiPgotICAgIDw8Ci0gICAgZm9yZWFjaCAkYSAoJGYtPnBhcmFtcygpKSB7Ci0gICAgICA+Pjx0ciB2YWxpZ249dG9wPjx0aCBhbGlnbj1yaWdodD4KLQkkKGEubmFtZSk8L3RoPjx0ZD48PAotICAgICAgcHJpbnQgJnByb2Nlc3NEZXNjcmlwdGlvbiggJGEtPmRlc2NyaXB0aW9uKCkgKTsKLSAgICAgID4+PC90ZD48L3RyPgotICAgICAgPDwKLSAgICB9Ci0gICAgPj48L3RhYmxlPgotICAgICAgPDwKLSAgfQotCQotICBpZiAoJGYtPnJldHVyblZhbHVlKCkpIHsKLSAgICA+PjxkdD48Yj5SZXR1cm4gVmFsdWU8L2I+Ci0gICAgICA8ZGQ+PDwKLSAgICBwcmludCAmcHJvY2Vzc0Rlc2NyaXB0aW9uKCAkZi0+cmV0dXJuVmFsdWUoKSApOwotICAgID4+PHA+PDwKLSAgfQotICAKLSAgaWYgKCRmLT5leGNlcHRpb25zKCkpIHsKLSAgICA+PjxkdD48Yj5FeGNlcHRpb25zPC9iPjxkZD4KLSAgICAgIDx0YWJsZSB3aWR0aD04NSU+PHRyPjx0ZCBjb2xzcGFuPTI+PGhyIHNpemU9Mz48L3RkPjwvdHI+Ci0gICAgPDwKLSAgICBmb3JlYWNoICRhICgkZi0+ZXhjZXB0aW9ucygpKSB7Ci0gICAgICA+Pjx0ciB2YWxpZ249dG9wPjx0aCBhbGlnbj1yaWdodD4KLQkkKGEubmFtZSk8L3RoPjx0ZD48PAotCSAgcHJpbnQgJnByb2Nlc3NEZXNjcmlwdGlvbiggJGEtPmRlc2NyaXB0aW9uKCkgKTsKLSAgICAgID4+PC90ZD48L3RyPgotICAgICAgPDwKLSAgICB9Ci0gICAgPj48dHI+PHRkIGNvbHNwYW49Mj48aHIgc2l6ZT0zPjwvdGQ+PC90cj48L3RhYmxlPgotICAgIDw8Ci0gIH0KLQkKLSAgaWYgKCRmLT5zZWVhbHNvKCkpIHsKLSAgICA+PjxkdD48Yj5TZWUgQWxzbzwvYj48ZGQ+Ci0gICAgICA8PAotICAgIG15IEByID0gKCk7Ci0gICAgZm9yZWFjaCAkYSAoJGYtPnNlZWFsc28oKSkgewotICAgICAgbXkgJG5hbWUgPSAkYS0+bmFtZSgpOwotICAgICAgaWYgKCR1cmwgPSAkYS0+dXJsKCkpIHsKLQlwdXNoIEByLCAiPGEgaHJlZj1cIiR1cmxcIj4kbmFtZTwvYT4iOwotICAgICAgfQotICAgICAgZWxzZSB7IHB1c2ggQHIsICRuYW1lOyB9Ci0gICAgfQotICAgIHByaW50IGpvaW4oICcsJywgQHIgKTsKLSAgICA+PjxwPjw8Ci0gIH0KLSAgPj48L2RsPjwvZGw+Ci0gIDw8Ci19Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyMgU3Vicm91dGluZSB0byBnZW5lcmF0ZSBkb2N1bWVudGF0aW9uIGZvciBhIG1lbWJlciB2YXJpYWJsZSBvciBnbG9iYWwgdmFyaWFibGUuCi0KLXN1YiB2YXJpYWJsZSB7Ci0gIGxvY2FsICgkdikgPSBAXzsKLSAgCi0gIGlmICgkdi0+a2V5d29yZHMoKSkgewotICAgIHByaW50ICI8IS0tICQodi5rZXl3b3JkcykgLS0+IjsKLSAgfQotCi0gID4+Ci0gICAgPGEgbmFtZT0iJCh2Lm5hbWUpIj48L2E+Ci0gICAgICA8ZGw+PGR0PgotCTxiPjxpbWcgc3JjPSIkYnVsbGV0Ml9pbWFnZSIgd2lkdGg9MTkgaGVpZ2h0PTE3IGFsaWduPXRleHR0b3A+JCh2LmZ1bGxuYW1lKTs8L2I+Ci0gIDxkZD4KLSAgPDxwcmludCAmcHJvY2Vzc0Rlc2NyaXB0aW9uKCAkdi0+ZGVzY3JpcHRpb24oKSApOz4+Ci0gIDxwPjxkbD4KLSAgPDwKLSAgaWYgKCR2LT5zZWVhbHNvKCkpIHsKLSAgICA+PjxkdD48Yj5TZWUgQWxzbzwvYj48ZGQ+Ci0gICAgICA8PAotCSRjb21tYSA9IDA7Ci0gICAgZm9yZWFjaCAkYSAoJHYtPnNlZWFsc28oKSkgewotICAgICAgaWYgKCRjb21tYSkgeyBwcmludCAiLCI7IH0KLSAgICAgICRjb21tYSA9IDE7Ci0gICAgICA+PjxhIGhyZWY9IiQoYS51cmwpIj4kKGEubmFtZSk8L2E+Ci0JPDwKLSAgICB9Ci0gICAgPj48cD4KLSAgICA8PAotICB9Ci0gID4+PC9kbD48L2RsPgotICA8PAotfQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXN1YiBwcm9jZXNzRGVzY3JpcHRpb24gewotICBsb2NhbCAoJF8pID0gQF87Ci0gIAotICBzL15ccysvLzsJCQkJIyBSZW1vdmUgd2hpdGVzcGFjZSBmcm9tIGJlZ2lubmluZwotICBzL1xzKyQvXG4vOwkJCQkjIFJlbW92ZSB3aGl0ZXNwYWNlIGZyb20gZW5kCi0gIHMvXG5cbi88cD5cbi9nOwkJCSMgUmVwbGFjZSBtdWx0aXBsZSBDUidzIHdpdGggcGFyYWdyYXBoIG1hcmtlcnMKLSAgczpcQGhlYWRpbmcoLiopXG46PHA+PGgyPiQxPC9oMj46OwkjIEhhbmRsZSBoZWFkaW5nIHRleHQKLSAgCi0gICMgSGFuZGxlIGVtYmVkZGVkIGltYWdlIHRhZ3MKLSAgczpcQGNhdXRpb246PHA+PGltZyBzcmM9XCIke2ltYWdlX2RpcmVjdG9yeX0vY2F1dGlvbi5naWZcIiBhbGlnbj1sZWZ0Pjo7Ci0gIHM6XEB3YXJuaW5nOjxwPjxpbWcgc3JjPVwiJHtpbWFnZV9kaXJlY3Rvcnl9L3dhcm5pbmcuZ2lmXCIgYWxpZ249bGVmdD46OwotICBzOlxAYnVnOjxwPjxpbWcgc3JjPVwiJHtpbWFnZV9kaXJlY3Rvcnl9L2J1Zy5naWZcIj46OwotICBzOlxAdGlwOjxwPjxpbWcgc3JjPVwiJHtpbWFnZV9kaXJlY3Rvcnl9L3RpcC5naWZcIj46OwotCi0gIHJldHVybiAkXzsKLX0KZGlmZiAtLWdpdCBhL2J1aWxkL2Zhc3RnZW4uc2ggYi9idWlsZC9mYXN0Z2VuLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YTU5YWI3Li4wMDAwMDAwCi0tLSBhL2J1aWxkL2Zhc3RnZW4uc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jISAvYmluL3NoCi0jCi0jIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCBTYXNjaGEgU2NodW1hbm4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSMgYXJlIG1ldDoKLSMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0jICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0jIAotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFNBU0NIQSBTQ0hVTUFOTiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0jIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PCi0jIEVWRU5UIFNIQUxMIFNBU0NIQSBTQ0hVTUFOTiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0jIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOwotIyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSMgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLSMgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotIyBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAkSWQ6IGZhc3RnZW4uc2gsdiAxLjEgMjAwMC8wMS8xMSAxMzoxMDo1OCBzYXNjaGEgRXhwICQgCi0jCi0KLXNyY2Rpcj0kMQotc2hpZnQKLQotdG9wc3JjZGlyPWAoY2QgJHNyY2RpcjsgcHdkKWAKLQotbWtkaXJfcD0kMQotc2hpZnQKLQotaWYgdGVzdCAiJG1rZGlyX3AiID0gInllcyI7IHRoZW4KLSAgbWtkaXJfcD0ibWtkaXIgLXAiCi1lbHNlCi0gIG1rZGlyX3A9IiR0b3BzcmNkaXIvaGVscGVycy9ta2Rpci5zaCIKLWZpCi0KLWJhc2U9IlwkKERFUFRIKS8kc3JjZGlyIgotCi1mb3IgaSBpbiAkQCA7IGRvCi0JZWNobyAiY3JlYXRpbmcgJGkiCi0JZGlyPWBkaXJuYW1lICRpYAotCSRta2Rpcl9wICRkaXIKLQlzZWQgXAotCQktZSBzI0B0b3BzcmNkaXJAIyRiYXNlIyBcCi0JCS1lIHMjQHNyY2RpckAjJGJhc2UvJGRpciMgXAotCTwgJHRvcHNyY2Rpci8kaS5pbiA+ICRpCi1kb25lCmRpZmYgLS1naXQgYS9idWlsZC9odHRwZF9yb2xsX3JlbGVhc2UgYi9idWlsZC9odHRwZF9yb2xsX3JlbGVhc2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk5MzBlYzAuLjAwMDAwMDAKLS0tIGEvYnVpbGQvaHR0cGRfcm9sbF9yZWxlYXNlCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLSMhL2Jpbi9zaAotCi1pZiBbICJ4JDEiID0gInhoZWxwIiBdOyB0aGVuCi0gICAgZWNobyAiVXNhZ2U6ICAuL2h0dHBkX3JvbGxfcmVsZWFzZSB0YWcgbG9nX25hbWUgW3VzZXJdIgotICAgIGVjaG8gInRhZyAgICAgICAgdGhlIHRhZyB0byB1c2Ugd2hlbiBjaGVja2luZyBvdXQgdGhlIHJlcG9zaXRvcnkiCi0gICAgZWNobyAibG9nX25hbWUgICB0aGUgbmFtZSBvZiBhIGZpbGUgdG8gbG9nIHRoZSByZXN1bHRzIHRvLiIKLSAgICBlY2hvICJ1c2VyICAgICAgIEFuIG9wdGlvbmFsIHVzZXIgbmFtZSB0byB1c2Ugd2hlbiBzaWdpbmcgdGhlIHJlbGVhc2UiCi0gICAgZXhpdAotZWxzZQotICAgIFRBRz0kMQotZmkKLQotTE9HX05BTUU9YHB3ZGAvJDIKLQotVVNFUj0kMwotCi1SRVBPPSJodHRwZC0yLjAiCi1XT1JLSU5HX0RJUj1gZWNobyAiJFJFUE8iIHwgc2VkIC1lICdzL1tcLVwuXS9fL2cnYAotV09SS0lOR19UQUc9YGVjaG8gIiRUQUciIHwgc2VkIC1lICdzL0FQQUNIRV8yXzBfL18vJ2AKLVdPUktJTkdfRElSPSIkV09SS0lOR19ESVIkV09SS0lOR19UQUciCi0KLVNUQVJUX0RJUj1gZWNobyAiJFBXRCJgCi0KLSMgQ2hlY2sgb3V0IHRoZSBjb3JyZWN0IHJlcG9zaXRvcmllcy4KLWVjaG8gIkNoZWNraW5nIG91dCByZXBvc2l0b3J5ICRSRVBPIGludG8gJFdPUktJTkdfRElSIHVzaW5nIHRhZyAkVEFHIgotCi11bWFzayAwMjIKLWVjaG8gQ2hlY2tpbmcgb3V0IGh0dHBkLTIuMCA+ICRMT0dfTkFNRQotY3ZzIGNoZWNrb3V0IC1yICRUQUcgLWQgJFdPUktJTkdfRElSICRSRVBPID4+ICRMT0dfTkFNRQotY2QgJFdPUktJTkdfRElSL3NyY2xpYgotZWNobyAiQ2hlY2tpbmcgb3V0IGFwciBhbmQgYXByLXV0aWwiID4+ICRMT0dfTkFNRQotY3ZzIGNoZWNrb3V0IC1yICRUQUcgYXByIGFwci11dGlsID4+ICRMT0dfTkFNRQotY2QgJFNUQVJUX0RJUi8kV09SS0lOR19ESVIKLQotIyBNYWtlIHN1cmUgdGhlIG1hc3RlciBzaXRlJ3MgRkFRIGlzIHVwLXRvLWRhdGUuICBJdCBkb2Vzbid0IGh1cnQgdG8gZG8gdGhpcwotIyBhbGwgdGhlIHRpbWUuICA6LSkKLWVjaG8gIlVwZGF0aW5nIHRoZSBzaXRlJ3MgRkFRIgotKGNkIC93d3cvd3d3LmFwYWNoZS5vcmcvZG9jcy0yLjAvbWlzYyA7IGN2cyB1cGRhdGUpCi0KLSMgTm93IHVwZGF0ZSB0aGUgRkFRIGluIHRoZSB0YXJiYWxsCi1ybSAtZiBkb2NzL21hbnVhbC9taXNjL0ZBUSouaHRtbAotbGlua3MgLXNvdXJjZSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvZG9jcy0yLjAvbWlzYy9GQVEuaHRtbCA+IGRvY3MvbWFudWFsL21pc2MvRkFRLmh0bWwKLQotIyBDcmVhdGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHRzCi1lY2hvICJDcmVhdGluZyB0aGUgY29uZmlndXJlIHNjcmlwdCIKLWNkICRTVEFSVF9ESVIvJFdPUktJTkdfRElSCi0KLWVjaG8gPj4gJExPR19OQU1FCi1lY2hvICJSdW5uaW5nIC4vYnVpbGRjb25mIiA+PiAkTE9HX05BTUUKLS4vYnVpbGRjb25mID4+ICRMT0dfTkFNRQotcm0gLWYgbHRjb25maWcgbHRtYWluLnNoIGNvbmZpZy5zdWIgY29uZmlnLmd1ZXNzCi1jcCAvdXNyL2xvY2FsL3NoYXJlL2xpYnRvb2wvbHRjb25maWcgLgotY3AgL3Vzci9sb2NhbC9zaGFyZS9saWJ0b29sL2x0bWFpbi5zaCAuCi1jcCAvdXNyL2xvY2FsL3NoYXJlL2xpYnRvb2wvY29uZmlnLnN1YiAuCi1jcCAvdXNyL2xvY2FsL3NoYXJlL2xpYnRvb2wvY29uZmlnLmd1ZXNzIC4KLQotIyBSZW1vdmUgYW55IGZpbGVzIHdlIGRvbid0IGRpc3RyaWJ1dGUgd2l0aCBvdXIgY29kZQotcm0gLWYgU1RBVFVTCi0KLWVjaG8gPj4gJExPR19OQU1FCi1lY2hvICJSZW1vdmluZyBmaWxlcyB0aGF0IHdlIGRvbid0IGRpc3RyaWJ1dGUiID4+ICRMT0dfTkFNRQotZmluZCAuIC1uYW1lICIuY3ZzaWdub3JlIiAtZXhlYyBybSB7fSBcOyA+PiAkTE9HX05BTUUgCi1maW5kIC4gLXR5cGUgZCAtbmFtZSAidGVzdCIgfCB4YXJncyBybSAtcmYgPj4gJExPR19OQU1FCi1maW5kIC4gLXR5cGUgZCAtbmFtZSAiQ1ZTIiB8IHhhcmdzIHJtIC1yZiA+PiAkTE9HX05BTUUKLQotIyBleHBhbmQgU1NJIGRpcmVjdGl2ZXMgaW4gdGhlIG1hbnVhbAotZWNobyAiTWFraW5nIHN1cmUgcGVvcGxlIGNhbiByZWFkIHRoZSBtYW51YWwgKGV4cGFuZGluZyBTU0kncykiCi0KLWVjaG8gPj4gJExPR19OQU1FCi1lY2hvICJNYWtpbmcgc3VyZSBwZW9wbGUgY2FuIHJlYWQgdGhlIG1hbnVhbCAoZXhwYW5kaW5nIFNTSSdzKSIgPj4gJExPR19OQU1FCi0oIGNkIGRvY3MvbWFudWFsIDsgY2htb2QgK3ggZXhwYW5kLnBsIDsgLi9leHBhbmQucGwgOyBybSAuL2V4cGFuZC5wbCApID4+ICRMT0dfTkFNRQotCi0jIFRpbWUgdG8gcm9sbCB0aGUgdGFyYmFsbAotZWNobyAiUm9sbGluZyB0aGUgdGFyYmFsbHMiCi0KLWNkICRTVEFSVF9ESVIKLWVjaG8gPj4gJExPR19OQU1FCi1lY2hvICJSb2xsaW5nIHRoZSB0YXJiYWxsIiA+PiAkTE9HX05BTUUKLXRhciBjdmYgJFdPUktJTkdfRElSLWFscGhhLnRhciAkV09SS0lOR19ESVIgPj4gJExPR19OQU1FCi1jcCAtcCAkV09SS0lOR19ESVItYWxwaGEudGFyIHgkV09SS0lOR19ESVItYWxwaGEudGFyCi1nemlwIC05ICRXT1JLSU5HX0RJUi1hbHBoYS50YXIKLW12IHgkV09SS0lOR19ESVItYWxwaGEudGFyICRXT1JLSU5HX0RJUi1hbHBoYS50YXIKLWNvbXByZXNzICRXT1JLSU5HX0RJUi1hbHBoYS50YXIKLQotIyBUZXN0IHRoZSB0YXJiYWxscwotZWNobyAiVGVzdGluZyB0aGUgdGFyYmFsbCIKLQotZWNobyA+PiAkTE9HX05BTUUKLWVjaG8gIlRlc3RpbmcgdGhlIHRhcmJhbGwgJFdPUktJTkdfRElSLWFscGhhLnRhci5neiIgPj4gJExPR19OQU1FCi1ndW56aXAgLWMgJFdPUktJTkdfRElSLWFscGhhLnRhci5neiB8IHRhciB0dmYgLSA+PiAkTE9HX05BTUUKLXpjYXQgJFdPUktJTkdfRElSLWFscGhhLnRhci5aIHwgdGFyIHR2ZiAtID4+ICRMT0dfTkFNRQotCi0jIHJlbWVtYmVyIHRoZSBDSEFOR0VTIGZpbGUKLWVjaG8gIkNvcHlpbmcgdGhlIENIQU5HRVMgZmlsZSB0byB0aGlzIGRpcmVjdG9yeSIKLWNwICRXT1JLSU5HX0RJUi9DSEFOR0VTIC4KLQotIyBjbGVhbnVwCi1lY2hvICJDbGVhbmluZyB1cCBteSB3b3Jrc3BhY2UiCi1ybSAtZnIgJFdPUktJTkdfRElSCi0KLWlmIFsgIngkVVNFUiIgIT0gIngiIF07IHRoZW4KLSAgICBVU0VSPSItdSAkVVNFUiIKLWZpCi0KLWVjaG8gVGFnZ2luZyB0aGUgdGFyYmFsbHMKLQotZWNobyAiVGFnZ2lnIHRoZSB0YXJiYWxscyIgPj4gJExPR19OQU1FCi1wZ3AgLXNiYSAkV09SS0lOR19ESVItYWxwaGEudGFyLmd6ICRVU0VSCi1wZ3AgLXNiYSAkV09SS0lOR19ESVItYWxwaGEudGFyLlogJFVTRVIKLQotcGdwICRXT1JLSU5HX0RJUi1hbHBoYS50YXIuZ3ouYXNjICRXT1JLSU5HX0RJUi1hbHBoYS50YXIuZ3ogPj4gJExPR19OQU1FCi1wZ3AgJFdPUktJTkdfRElSLWFscGhhLnRhci5aLmFzYyAkV09SS0lOR19ESVItYWxwaGEudGFyLlogPj4gJExPR19OQU1FCi0KLWVjaG8gIkRvbid0IGZvcmdldCB0byBtYWtlIHRoZSB0YXJiYWxscyBhdmFpbGFibGUgYnkgY29weWluZyB0aGVtIHRvIHRoZSIKLWVjaG8gIi93d3cvZGV2LmFwYWNoZS5vcmcvZGlzdCBkaXJlY3RvcnkuIgpkaWZmIC0tZ2l0IGEvYnVpbGQvaW5zdGFsbC1iaW5kaXN0LnNoLmluIGIvYnVpbGQvaW5zdGFsbC1iaW5kaXN0LnNoLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYzhhMjNlLi4wMDAwMDAwCi0tLSBhL2J1aWxkL2luc3RhbGwtYmluZGlzdC5zaC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgVXNhZ2U6IGluc3RhbGwtYmluZGlzdC5zaCBbU2VydmVyUm9vdF0KLSMgVGhpcyBzY3JpcHQgaW5zdGFsbHMgdGhlIEFwYWNoZSBiaW5hcnkgZGlzdHJpYnV0aW9uIGFuZAotIyB3YXMgYXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IGJpbmJ1aWxkLnNoLgotIAotbG1rZGlyKCkKLXsKLSAgcGF0aD0iIgotICBkaXJzPWBlY2hvICQxIHwgc2VkIC1lICdzJS8lICVnJ2AKLSAgbW9kZT0kMgotIAotICBzZXQgLS0gJHtkaXJzfQotIAotICBmb3IgZCBpbiAke2RpcnN9Ci0gIGRvCi0gICAgcGF0aD0iJHtwYXRofS8kZCIKLSAgICBpZiB0ZXN0ICEgLWQgIiR7cGF0aH0iIDsgdGhlbgotICAgICAgbWtkaXIgJHtwYXRofQotICAgICAgaWYgdGVzdCAkPyAtbmUgMCA7IHRoZW4KLSAgICAgICAgZWNobyAiRmFpbGVkIHRvIGNyZWF0ZSBkaXJlY3Rvcnk6ICR7cGF0aH0iCi0gICAgICAgIGV4aXQgMQotICAgICAgZmkKLSAgICAgIGNobW9kICR7bW9kZX0gJHtwYXRofQotICAgIGZpCi0gIGRvbmUKLX0KLSAKLWxjb3B5KCkKLXsKLSAgZnJvbT0kMQotICB0bz0kMgotICBkbW9kZT0kMwotICBmbW9kZT0kNAotIAotICB0ZXN0IC1kICR7dG99IHx8IGxta2RpciAke3RvfSAke2Rtb2RlfQotICAoY2QgJHtmcm9tfSAmJiB0YXIgLWNmIC0gKikgfCAoY2QgJHt0b30gJiYgdGFyIC14ZiAtKQotIAotICBpZiB0ZXN0ICJYJHtmbW9kZX0iICE9IFggOyB0aGVuCi0gICAgZmluZCAke3RvfSAtdHlwZSBmIC1wcmludCB8IHhhcmdzIGNobW9kICR7Zm1vZGV9Ci0gIGZpCi0gIGlmIHRlc3QgIlgke2Rtb2RlfSIgIT0gWCA7IHRoZW4KLSAgICBmaW5kICR7dG99IC10eXBlIGQgLXByaW50IHwgeGFyZ3MgY2htb2QgJHtkbW9kZX0KLSAgZmkKLX0KLSAKLSMjCi0jIyAgZGV0ZXJtaW5lIHBhdGggdG8gKG9wdGlvbmFsKSBQZXJsIGludGVycHJldGVyCi0jIwotUEVSTD1uby1wZXJsNS1vbi10aGlzLXN5c3RlbQotcGVybHM9J3Blcmw1IHBlcmwnCi1wYXRoPWBlY2hvICRQQVRIIHwgc2VkIC1lICdzLzovIC9nJ2AKLSAKLWZvciBkaXIgaW4gJHtwYXRofSA7ICBkbwotICBmb3IgcHBlcmwgaW4gJHtwZXJsc30gOyBkbwotICAgIGlmIHRlc3QgLWYgIiR7ZGlyfS8ke3BwZXJsfSIgOyB0aGVuCi0gICAgICBpZiBgJHtkaXJ9LyR7cHBlcmx9IC12IHwgZ3JlcCAndmVyc2lvbiA1XC4nID4vZGV2L251bGwgMj4mMWAgOyB0aGVuCi0gICAgICAgIFBFUkw9IiR7ZGlyfS8ke3BwZXJsfSIKLSAgICAgICAgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotZG9uZQotIAotaWYgWyAuJDEgPSAuIF0KLXRoZW4KLSAgU1I9QGRlZmF1bHRfZGlyQAotZWxzZQotICBTUj0kMQotZmkKLWVjaG8gIkluc3RhbGxpbmcgYmluYXJ5IGRpc3RyaWJ1dGlvbiBmb3IgcGxhdGZvcm0gaTY4Ni1wYy1saW51eCIKLWVjaG8gImludG8gZGlyZWN0b3J5ICRTUiAuLi4iCi1sbWtkaXIgJFNSIDc1NQotbG1rZGlyICRTUi9wcm94eSA3NTAKLWxta2RpciAkU1IvbG9ncyA3NTAKLWxjb3B5IGJpbmRpc3QvbWFuICRTUi9tYW4gNzU1IDY0NAotaWYgWyAtZCBiaW5kaXN0L21vZHVsZXMgXQotdGhlbgotICBsY29weSBiaW5kaXN0L21vZHVsZXMgJFNSL21vZHVsZXMgNzUwIDc1MAotZmkKLWxjb3B5IGJpbmRpc3QvaW5jbHVkZSAkU1IvaW5jbHVkZSA3NTUgNjQ0Ci1sY29weSBiaW5kaXN0L2ljb25zICRTUi9pY29ucyA3NTUgNjQ0Ci1sY29weSBiaW5kaXN0L2NnaS1iaW4gJFNSL2NnaS1iaW4gNzUwIDc1MAotbGNvcHkgYmluZGlzdC9iaW4gJFNSL2JpbiA3NTAgNzUwCi1pZiBbIC1kICRTUi9jb25mIF0KLXRoZW4KLSAgZWNobyAiW1ByZXNlcnZpbmcgZXhpc3RpbmcgY29uZmlndXJhdGlvbiBmaWxlcy5dIgotICBjcCBiaW5kaXN0L2NvbmYvKi1zdGQuY29uZiAkU1IvY29uZi8KLWVsc2UKLSAgbGNvcHkgYmluZGlzdC9jb25mICRTUi9jb25mIDc1MCA2NDAKLSAgc2VkIC1lICJzJUBkZWZhdWx0X2RpckAlJFNSJSIgJFNSL2NvbmYvaHR0cGQtc3RkLmNvbmYgPiAkU1IvY29uZi9odHRwZC5jb25mCi1maQotaWYgWyAtZCAkU1IvaHRkb2NzIF0KLXRoZW4KLSAgZWNobyAiW1ByZXNlcnZpbmcgZXhpc3RpbmcgaHRkb2NzIGRpcmVjdG9yeS5dIgotZWxzZQotICBsY29weSBiaW5kaXN0L2h0ZG9jcyAkU1IvaHRkb2NzIDc1NSA2NDQKLWZpCi1pZiBbIC1kICRTUi9lcnJvciBdCi10aGVuCi0gIGVjaG8gIltQcmVzZXJ2aW5nIGV4aXN0aW5nIGVycm9yIGRvY3VtZW50cyBkaXJlY3RvcnkuXSIKLWVsc2UKLSAgbGNvcHkgYmluZGlzdC9lcnJvciAkU1IvZXJyb3IgNzU1IDY0NAotZmkKLSAKLXNlZCAtZSAiczteIyEvLio7IyEkUEVSTDsiIC1lICJzO1xAcHJlZml4XEA7JFNSOyIgLWUgInM7XEBzYmluZGlyXEA7JFNSL2JpbjsiIFwKLQktZSAicztcQGxpYmV4ZWNkaXJcQDskU1IvbGliZXhlYzsiIC1lICJzO1xAaW5jbHVkZWRpclxAOyRTUi9pbmNsdWRlOyIgXAotCS1lICJzO1xAc3lzY29uZmRpclxAOyRTUi9jb25mOyIgYmluZGlzdC9iaW4vYXB4cyA+ICRTUi9iaW4vYXB4cwotc2VkIC1lICJzO14jIS8uKjsjISRQRVJMOyIgYmluZGlzdC9iaW4vZGJtbWFuYWdlID4gJFNSL2Jpbi9kYm1tYW5hZ2UKLXNlZCAtZSAicyVAZGVmYXVsdF9kaXJAJSRTUiUiIFwKLSAgICAgICAgLWUgInMlXkhUVFBEPS4qJCVIVFRQRD1cIiRTUi9iaW4vaHR0cGQgLWQgJFNSXCIlIiBiaW5kaXN0L2Jpbi9hcGFjaGVjdGwgPiAkU1IvYmluL2FwYWNoZWN0bAotIAotZWNobyAiUmVhZHkuIgotZWNobyAiICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsiCi1lY2hvICIgfCBZb3Ugbm93IGhhdmUgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZCB0aGUgQXBhY2hlIEB2ZXJAICB8IgotZWNobyAiIHwgSFRUUCBzZXJ2ZXIuIFRvIHZlcmlmeSB0aGF0IEFwYWNoZSBhY3R1YWxseSB3b3JrcyAgICAgIHwiCi1lY2hvICIgfCBjb3JyZWN0bHkgeW91IHNob3VsZCBmaXJzdCBjaGVjayB0aGUgKGluaXRpYWxseSAgICAgICAgfCIKLWVjaG8gIiB8IGNyZWF0ZWQgb3IgcHJlc2VydmVkKSBjb25maWd1cmF0aW9uIGZpbGVzOiAgICAgICAgICAgICB8IgotZWNobyAiIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwiCi1lY2hvICIgfCAgICRTUi9jb25mL2h0dHBkLmNvbmYiCi1lY2hvICIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCIKLWVjaG8gIiB8IFlvdSBzaG91bGQgdGhlbiBiZSBhYmxlIHRvIGltbWVkaWF0ZWx5IGZpcmUgdXAgICAgICAgICB8IgotZWNobyAiIHwgQXBhY2hlIHRoZSBmaXJzdCB0aW1lIGJ5IHJ1bm5pbmc6ICAgICAgICAgICAgICAgICAgICAgIHwiCi1lY2hvICIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCIKLWVjaG8gIiB8ICAgJFNSL2Jpbi9hcGFjaGVjdGwgc3RhcnQgIgotZWNobyAiIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwiCi1lY2hvICIgfCBUaGFua3MgZm9yIHVzaW5nIEFwYWNoZS4gICAgICAgVGhlIEFwYWNoZSBHcm91cCAgICAgICAgfCIKLWVjaG8gIiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvICB8IgotZWNobyAiICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsiCi1lY2hvICIgIgpkaWZmIC0tZ2l0IGEvYnVpbGQvaW5zdGFsbC5zaCBiL2J1aWxkL2luc3RhbGwuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlhODgyMWYuLjAwMDAwMDAKLS0tIGEvYnVpbGQvaW5zdGFsbC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0jIS9iaW4vc2gKLSMjCi0jIyAgaW5zdGFsbC5zaCAtLSBpbnN0YWxsIGEgcHJvZ3JhbSwgc2NyaXB0IG9yIGRhdGFmaWxlCi0jIwotIyMgIEJhc2VkIG9uIGBpbnN0YWxsLXNoJyBmcm9tIHRoZSBYIENvbnNvcnRpdW0ncyBYMTFSNSBkaXN0cmlidXRpb24KLSMjICBhcyBvZiA4OS8xMi8xOCB3aGljaCBpcyBmcmVlbHkgYXZhaWxhYmxlLgotIyMgIENsZWFuZWQgdXAgZm9yIEFwYWNoZSdzIEF1dG9jb25mLXN0eWxlIEludGVyZmFjZSAoQVBBQ0kpCi0jIyAgYnkgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGFwYWNoZS5vcmc+Ci0jIwotIwotIyBUaGlzIHNjcmlwdCBmYWxscyB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UuCi0jIFNlZSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvZG9jcy9MSUNFTlNFCi0KLQotIwotIyAgIHB1dCBpbiBhYnNvbHV0ZSBwYXRocyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsgCi0jICAgb3IgdXNlIGVudi4gdmFycy4KLSMKLW12cHJvZz0iJHtNVlBST0ctbXZ9IgotY3Bwcm9nPSIke0NQUFJPRy1jcH0iCi1jaG1vZHByb2c9IiR7Q0hNT0RQUk9HLWNobW9kfSIKLWNob3ducHJvZz0iJHtDSE9XTlBST0ctY2hvd259IgotY2hncnBwcm9nPSIke0NIR1JQUFJPRy1jaGdycH0iCi1zdHJpcHByb2c9IiR7U1RSSVBQUk9HLXN0cmlwfSIKLXJtcHJvZz0iJHtSTVBST0ctcm19IgotCi0jCi0jICAgcGFyc2UgYXJndW1lbnQgbGluZQotIwotaW5zdGNtZD0iJG12cHJvZyIKLWNobW9kY21kPSIiCi1jaG93bmNtZD0iIgotY2hncnBjbWQ9IiIKLXN0cmlwY21kPSIiCi1ybWNtZD0iJHJtcHJvZyAtZiIKLW12Y21kPSIkbXZwcm9nIgotZXh0PSIiCi1zcmM9IiIKLWRzdD0iIgotd2hpbGUgWyAieCQxIiAhPSAieCIgXTsgZG8KLSAgICBjYXNlICQxIGluCi0gICAgICAgIC1jKSBpbnN0Y21kPSIkY3Bwcm9nIgotICAgICAgICAgICAgc2hpZnQ7IGNvbnRpbnVlCi0gICAgICAgICAgICA7OwotICAgICAgICAtbSkgY2htb2RjbWQ9IiRjaG1vZHByb2cgJDIiCi0gICAgICAgICAgICBzaGlmdDsgc2hpZnQ7IGNvbnRpbnVlCi0gICAgICAgICAgICA7OwotICAgICAgICAtbykgY2hvd25jbWQ9IiRjaG93bnByb2cgJDIiCi0gICAgICAgICAgICBzaGlmdDsgc2hpZnQ7IGNvbnRpbnVlCi0gICAgICAgICAgICA7OwotICAgICAgICAtZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCi0gICAgICAgICAgICBzaGlmdDsgc2hpZnQ7IGNvbnRpbnVlCi0gICAgICAgICAgICA7OwotICAgICAgICAtcykgc3RyaXBjbWQ9IiRzdHJpcHByb2ciCi0gICAgICAgICAgICBzaGlmdDsgY29udGludWUKLSAgICAgICAgICAgIDs7Ci0gICAgICAgIC1TKSBzdHJpcGNtZD0iJHN0cmlwcHJvZyAkMiIKLSAgICAgICAgICAgIHNoaWZ0OyBzaGlmdDsgY29udGludWUKLSAgICAgICAgICAgIDs7Ci0gICAgICAgIC1lKSBleHQ9IiQyIgotICAgICAgICAgICAgc2hpZnQ7IHNoaWZ0OyBjb250aW51ZQotICAgICAgICAgICAgOzsKLSAgICAgICAgKikgIGlmIFsgIngkc3JjIiA9ICJ4IiBdOyB0aGVuCi0gICAgICAgICAgICAgICAgc3JjPSQxCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZHN0PSQxCi0gICAgICAgICAgICBmaQotICAgICAgICAgICAgc2hpZnQ7IGNvbnRpbnVlCi0gICAgICAgICAgICA7OwotICAgIGVzYWMKLWRvbmUKLWlmIFsgIngkc3JjIiA9ICJ4IiBdOyB0aGVuCi0gICAgIGVjaG8gImluc3RhbGwuc2g6IG5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIgotICAgICBleGl0IDEKLWZpCi1pZiBbICJ4JGRzdCIgPSAieCIgXTsgdGhlbgotICAgICBlY2hvICJpbnN0YWxsLnNoOiBubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQiCi0gICAgIGV4aXQgMQotZmkKLQotIwotIyAgSWYgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnksIGFwcGVuZCB0aGUgaW5wdXQgZmlsZW5hbWU7IGlmCi0jICB5b3VyIHN5c3RlbSBkb2VzIG5vdCBsaWtlIGRvdWJsZSBzbGFzaGVzIGluIGZpbGVuYW1lcywgeW91IG1heQotIyAgbmVlZCB0byBhZGQgc29tZSBsb2dpYwotIwotaWYgWyAtZCAkZHN0IF07IHRoZW4KLSAgICBkc3Q9IiRkc3QvYGJhc2VuYW1lICRzcmNgIgotZmkKLQotIyAgQWRkIGEgcG9zc2libGUgZXh0ZW5zaW9uIChzdWNoIGFzICIuZXhlIikgdG8gc3JjIGFuZCBkc3QKLXNyYz0iJHNyYyRleHQiCi1kc3Q9IiRkc3QkZXh0IgotCi0jICBNYWtlIGEgdGVtcCBmaWxlIG5hbWUgaW4gdGhlIHByb3BlciBkaXJlY3RvcnkuCi1kc3RkaXI9YGRpcm5hbWUgJGRzdGAKLWRzdHRtcD0kZHN0ZGlyLyNpbnN0LiQkIwotCi0jICBNb3ZlIG9yIGNvcHkgdGhlIGZpbGUgbmFtZSB0byB0aGUgdGVtcCBuYW1lCi0kaW5zdGNtZCAkc3JjICRkc3R0bXAKLQotIyAgQW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cwotaWYgWyAieCRjaG93bmNtZCIgIT0gIngiIF07IHRoZW4gJGNob3duY21kICRkc3R0bXA7IGZpCi1pZiBbICJ4JGNoZ3JwY21kIiAhPSAieCIgXTsgdGhlbiAkY2hncnBjbWQgJGRzdHRtcDsgZmkKLWlmIFsgIngkc3RyaXBjbWQiICE9ICJ4IiBdOyB0aGVuICRzdHJpcGNtZCAkZHN0dG1wOyBmaQotaWYgWyAieCRjaG1vZGNtZCIgIT0gIngiIF07IHRoZW4gJGNobW9kY21kICRkc3R0bXA7IGZpCi0KLSMgIE5vdyByZW5hbWUgdGhlIGZpbGUgdG8gdGhlIHJlYWwgZGVzdGluYXRpb24uCi0kcm1jbWQgJGRzdAotJG12Y21kICRkc3R0bXAgJGRzdAotCi1leGl0IDAKLQpkaWZmIC0tZ2l0IGEvYnVpbGQvaW5zdGRzby5zaCBiL2J1aWxkL2luc3Rkc28uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3YjVkNjEuLjAwMDAwMDAKLS0tIGEvYnVpbGQvaW5zdGRzby5zaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLSMhL2Jpbi9zaAotIwotIyBpbnN0ZHNvLnNoIC0gaW5zdGFsbCBBcGFjaGUgRFNPIG1vZHVsZXMKLSMKLSMgdXN1YWxseSB0aGlzIGp1c3QgcGFzc2VzIHRocm91Z2ggdG8gbGlidG9vbCBidXQgb24gYSBmZXcKLSMgcGxhdGZvcm1zIGxpYnRvb2wgZG9lc24ndCBpbnN0YWxsIERTT3MgZXhhY3RseSBsaWtlIHdlJ2QKLSMgd2FudCBzbyBtb3JlIGVmZm9ydCBpcyByZXF1aXJlZAotCi1pZiB0ZXN0ICIkIyIgIT0gIjMiOyB0aGVuCi0gICAgZWNobyAid3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBpbnN0ZHNvLnNoIgotICAgIGVjaG8gIlVzYWdlOiBpbnN0ZHNvLnNoIFNIX0xJQlRPT0wtdmFsdWUgZHNvLW5hbWUgcGF0aC10by1tb2R1bGVzIgotICAgIGV4aXQgMQotZmkKLQotU0hfTElCVE9PTD1gZWNobyAkMSB8IHNlZCAtZSAncy9eU0hfTElCVE9PTD0vLydgCi1EU09BUkNISVZFPSQyCi1UQVJHRVRESVI9JDMKLURTT0JBU0U9YGVjaG8gJERTT0FSQ0hJVkUgfCBzZWQgLWUgJ3MvXC5sYSQvLydgCi1UQVJHRVRfTkFNRT0iJERTT0JBU0Uuc28iCi0KLSMgc3BlY2lhbCBsb2dpYyBmb3Igc3lzdGVtcyB3aGVyZSBsaWJ0b29sIGRvZXNuJ3QgaW5zdGFsbAotIyB0aGUgRFNPIGV4YWN0bHkgbGlrZSB3ZSdkIHdhbnQKLQotU1lTPWB1bmFtZSAtc2AKLWNhc2UgJFNZUyBpbgotICAgIEFJWCkKLSAgICAgICAgIyBvbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgcmVtYWluIGluIHN0b3JhZ2UgZXZlbiB3aGVuCi0gICAgICAgICMgYWxsIHByb2Nlc3NlcyB1c2luZyB0aGVtIGhhdmUgZXhpdGVkOyBzdGFuZGFyZCBwcmFjdGljZQotICAgICAgICAjIHByaW9yIHRvIGluc3RhbGxpbmcgYSBzaGFyZWQgbGlicmFyeSBpcyB0byBybSAtZiBmaXJzdAotICAgICAgICBDTUQ9InJtIC1mICRUQVJHRVRESVIvJFRBUkdFVF9OQU1FIgotICAgICAgICBlY2hvICRDTUQKLSAgICAgICAgJENNRCB8fCBleGl0ICQ/Ci0gICAgICAgIENNRD0iY3AgLmxpYnMvbGliJERTT0JBU0Uuc28uMCAkVEFSR0VURElSLyRUQVJHRVRfTkFNRSIKLSAgICAgICAgZWNobyAkQ01ECi0gICAgICAgICRDTUQgfHwgZXhpdCAkPwotICAgICAgICA7OwotICAgIEhQLVVYKQotICAgICAgICBDTUQ9ImNwIC5saWJzLyREU09CQVNFLnNsICRUQVJHRVRESVIvJFRBUkdFVF9OQU1FIgotICAgICAgICBlY2hvICRDTUQKLSAgICAgICAgJENNRCB8fCBleGl0ICQ/Ci0gICAgICAgIDs7Ci0gICAgT1NGMSkKLSAgICAgICAgQ01EPSJjcCAubGlicy9saWIkRFNPQkFTRS5zbyAkVEFSR0VURElSLyRUQVJHRVRfTkFNRSIKLSAgICAgICAgZWNobyAkQ01ECi0gICAgICAgICRDTUQgfHwgZXhpdCAkPwotICAgICAgICA7OwotICAgICopCi0gICAgICAgIENNRD0iJFNIX0xJQlRPT0wgLS1tb2RlPWluc3RhbGwgY3AgJERTT0FSQ0hJVkUgJFRBUkdFVERJUiIKLSAgICAgICAgZWNobyAkQ01ECi0gICAgICAgICRDTUQgfHwgZXhpdCAkPwotICAgICAgICA7OwotZXNhYwotCi1leGl0IDAKZGlmZiAtLWdpdCBhL2J1aWxkL2xpYnJhcnkubWsgYi9idWlsZC9saWJyYXJ5Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmFkYjYzLi4wMDAwMDAwCi0tLSBhL2J1aWxkL2xpYnJhcnkubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCBTYXNjaGEgU2NodW1hbm4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSMgYXJlIG1ldDoKLSMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0jICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0jIAotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFNBU0NIQSBTQ0hVTUFOTiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0jIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PCi0jIEVWRU5UIFNIQUxMIFNBU0NIQSBTQ0hVTUFOTiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0jIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOwotIyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSMgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLSMgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotIyBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAkSWQ6IGxpYnJhcnkubWssdiAxLjEgMjAwMC8wMS8xMSAxMzoxMDo1OCBzYXNjaGEgRXhwICQgCi0jCi0KLUxUTElCUkFSWV9PQkpFQ1RTID0gJChMVExJQlJBUllfU09VUkNFUzouYz0ubG8pCi0KLSQoTFRMSUJSQVJZX05BTUUpOiAkKExUTElCUkFSWV9PQkpFQ1RTKSAkKExUTElCUkFSWV9ERVBFTkRFTkNJRVMpCi0JJChMSU5LKSAkKExUTElCUkFSWV9MREZMQUdTKSAkKExUTElCUkFSWV9PQkpFQ1RTKSAkKExUTElCUkFSWV9MSUJBREQpCi0KLSQoTFRMSUJSQVJZX1NIQVJFRF9OQU1FKTogJChMVExJQlJBUllfT0JKRUNUUykgJChMVExJQlJBUllfREVQRU5ERU5DSUVTKQotCUB0ZXN0IC1kICQocGhwbGliZGlyKSB8fCAkKG1raW5zdGFsbGRpcnMpICQocGhwbGliZGlyKQotCSQoTElOSykgLWF2b2lkLXZlcnNpb24gLW1vZHVsZSAtcnBhdGggJChwaHBsaWJkaXIpICQoTFRMSUJSQVJZX0xERkxBR1MpICQoTFRMSUJSQVJZX09CSkVDVFMpICQoTFRMSUJSQVJZX1NIQVJFRF9MSUJBREQpCi0JJChTSExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsIGluc3RhbGwgJEAgJChwaHBsaWJkaXIpCi0KLXNoYXJlZDoKLQlAaWYgdGVzdCAnJChTSExJQlRPT0wpJyAhPSAnJChMSUJUT09MKSc7IHRoZW4gXAotCQkkKE1BS0UpICdMSUJUT09MPSQoU0hMSUJUT09MKScgJChMVExJQlJBUllfU0hBUkVEX05BTUUpOyBcCi0JZWxzZSBcCi0JCSQoTUFLRSkgJChMVExJQlJBUllfU0hBUkVEX05BTUUpOyBcCi0JZmk7IFwKZGlmZiAtLWdpdCBhL2J1aWxkL2x0bGliLm1rIGIvYnVpbGQvbHRsaWIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYmJiN2MuLjAwMDAwMDAKLS0tIGEvYnVpbGQvbHRsaWIubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCBTYXNjaGEgU2NodW1hbm4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSMgYXJlIG1ldDoKLSMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0jICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0jIAotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFNBU0NIQSBTQ0hVTUFOTiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0jIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PCi0jIEVWRU5UIFNIQUxMIFNBU0NIQSBTQ0hVTUFOTiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0jIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOwotIyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSMgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLSMgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotIyBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAkSWQ6IGx0bGliLm1rLHYgMS4xIDIwMDAvMDEvMTEgMTM6MTA6NTggc2FzY2hhIEV4cCAkIAotIwotCi10YXJnZXRzID0gJChMVExJQlJBUllfTkFNRSkKLQotaW5jbHVkZSAkKHRvcHNyY2RpcikvYnVpbGQvcnVsZXMubWsKLWluY2x1ZGUgJCh0b3BzcmNkaXIpL2J1aWxkL2xpYnJhcnkubWsKLQpkaWZmIC0tZ2l0IGEvYnVpbGQvbWFrZV9leHBvcnRzLmF3ayBiL2J1aWxkL21ha2VfZXhwb3J0cy5hd2sKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZmQ2MzEuLjAwMDAwMDAKLS0tIGEvYnVpbGQvbWFrZV9leHBvcnRzLmF3aworKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0KLUJFR0lOIHsKLSAgICBwcmludGYoIi8qXG4iKQotICAgIHByaW50ZigiICogVEhJUyBGSUxFIFdBUyBBVVRPR0VORVJBVEVEIEJZIG1ha2VfZXhwb3J0cy5hd2tcbiIpCi0gICAgcHJpbnRmKCIgKlxuIikKLSAgICBwcmludGYoIiAqIFRoaXMgaXMgYW4gdWdseSBoYWNrIHRoYXQgbmVlZHMgdG8gYmUgaGVyZSwgc29cbiIpCi0gICAgcHJpbnRmKCIgKiB0aGF0IGxpYnRvb2wgd2lsbCBsaW5rIGFsbCBvZiB0aGUgQVBSIGZ1bmN0aW9uc1xuIikKLSAgICBwcmludGYoIiAqIGludG8gc2VydmVyIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYmFzZSBzZXJ2ZXJcbiIpCi0gICAgcHJpbnRmKCIgKiB1c2VzIHRoZW0uXG4iKQotICAgIHByaW50ZigiICovXG4iKQotICAgIHByaW50ZigiXG4iKQotICAgIHByaW50ZigiI2RlZmluZSBDT1JFX1BSSVZBVEVcbiIpCi0gICAgcHJpbnRmKCJcbiIpCi0gICAgCi0gICAgZm9yIChpID0gMTsgaSA8IEFSR0M7IGkrKykgewotICAgICAgICBmaWxlID0gQVJHVltpXQotICAgICAgICBzdWIoIihbXi9dKlsvXSkqIiwgIiIsIGZpbGUpCi0gICAgICAgIHByaW50ZigiI2luY2x1ZGUgXCIlc1wiXG4iLCBmaWxlKQotICAgIH0KLQotICAgIHByaW50ZigiXG4iKQotICAgIHByaW50ZigiY29uc3Qgdm9pZCAqYXBfdWdseV9oYWNrID0gTlVMTDtcbiIpCi0gICAgcHJpbnRmKCJcbiIpCi0gICAgCi0gICAgVFlQRV9OT1JNQUwgPSAwCi0gICAgVFlQRV9IRUFERVIgPSAxCi0KLSAgICBzdGFja3B0ciA9IDAKLX0KLQotZnVuY3Rpb24gcHVzaChsaW5lKSB7Ci0gICAgc3RhY2tbc3RhY2twdHJdID0gbGluZQotICAgIHN0YWNrcHRyKysKLX0KLQotZnVuY3Rpb24gZG9fb3V0cHV0KCkgewotICAgIHByaW50ZigiLypcbiIpCi0gICAgcHJpbnRmKCIgKiAlc1xuIiwgRklMRU5BTUUpCi0gICAgcHJpbnRmKCIgKi9cbiIpCi0gICAgCi0gICAgZm9yIChpID0gMDsgaSA8IHN0YWNrcHRyOyBpKyspIHsKLSAgICAgICAgcHJpbnRmKCIlc1xuIiwgc3RhY2tbaV0pCi0gICAgfQotICAgIAotICAgIHN0YWNrcHRyID0gMAotCi0gICAgcHJpbnRmKCJcbiIpOwotfQotCi1mdW5jdGlvbiBlbnRlcl9zY29wZSh0eXBlKSB7Ci0gICAgc2NvcGUrKwotICAgIHNjb3BlX3R5cGVbc2NvcGVdID0gdHlwZQotICAgIHNjb3BlX3N0YWNrW3Njb3BlXSA9IHN0YWNrcHRyCi0gICAgZGVsZXRlIHNjb3BlX3VzZWRbc2NvcGVdCi19Ci0KLWZ1bmN0aW9uIGxlYXZlX3Njb3BlKCkgewotICAgIHVzZWQgPSBzY29wZV91c2VkW3Njb3BlXQotICAgCi0gICAgaWYgKCF1c2VkKQotICAgICAgICBzdGFja3B0ciA9IHNjb3BlX3N0YWNrW3Njb3BlXQotCi0gICAgc2NvcGUtLQotICAgIGlmICh1c2VkKSB7Ci0gICAgICAgIHNjb3BlX3VzZWRbc2NvcGVdID0gMQotICAgICAgICAKLSAgICAgICAgaWYgKCFzY29wZSkKLSAgICAgICAgICAgIGRvX291dHB1dCgpCi0gICAgfQotfQotCi1mdW5jdGlvbiBhZGRfc3ltYm9sKHN5bWJvbCkgewotICAgIGlkeCA9IGluZGV4KHN5bWJvbCwgIiMiKQotCi0gICAgaWYgKCFpZHgpIHsKLSAgICAgICAgcHVzaCgiY29uc3Qgdm9pZCAqYXBfaGFja18iIHN5bWJvbCAiID0gKGNvbnN0IHZvaWQgKikiIHN5bWJvbCAiOyIpCi0gICAgICAgIHNjb3BlX3VzZWRbc2NvcGVdID0gMQotICAgIH0KLX0KLQotL15bIFx0XSpBUFtSVV0/X0RFQ0xBUkVbXihdKlsoXVteKV0qWyldKFteIF0qICkqW14oXStbKF0vICB7IAotICAgIHN1YigiWyBcdF0qQVBbUlVdP19ERUNMQVJFW14oXSpbKF1bXildKlspXSIsICIiKTsKLSAgICBzdWIoIlsoXS4qIiwgIiIpOwotICAgIHN1YigiXlsgXHRdKyIsICIiKTsKLSAgICBzdWIoIihbXiBdKiBeKFsgXHRdKlsoXSkpKiIsICIiKTsKLQotICAgIGFkZF9zeW1ib2woJDApCi0gICAgbmV4dAotfQotCi0vXiNbIFx0XSppZihuZGVmfCAhZGVmaW5lZFsoXSkoW15fXSpfKSpILyB7Ci0gICAgZW50ZXJfc2NvcGUoVFlQRV9IRUFERVIpCi0gICAgbmV4dAotfQotCi0vXiNbIFx0XSppZihbbl0/ZGVmKT8gLyB7Ci0gICAgZW50ZXJfc2NvcGUoVFlQRV9OT1JNQUwpCi0gICAgcHVzaCgkMCkKLSAgICBuZXh0Ci19Ci0KLS9eI1sgXHRdKmVuZGlmLyB7Ci0gICAgaWYgKHNjb3BlX3R5cGVbc2NvcGVdID09IFRZUEVfTk9STUFMKQotICAgICAgICBwdXNoKCQwKQotICAgICAgICAKLSAgICBsZWF2ZV9zY29wZSgpCi0gICAgbmV4dAotfQotCi0vXiNbIFx0XSplbHNlLyB7Ci0gICAgcHVzaCgkMCkKLSAgICBuZXh0Ci19Ci0KLS9eI1sgXHRdKmVsaWYvIHsKLSAgICBwdXNoKCQwKQotICAgIG5leHQKLX0KLQotCmRpZmYgLS1naXQgYS9idWlsZC9tYWtlX253X2V4cG9ydC5hd2sgYi9idWlsZC9tYWtlX253X2V4cG9ydC5hd2sKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxN2U0YmMuLjAwMDAwMDAKLS0tIGEvYnVpbGQvbWFrZV9ud19leHBvcnQuYXdrCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLSMgQmFzZWQgb24gYXByJ3MgbWFrZV9leHBvcnQuYXdrLCB3aGljaCBpcwotIyBiYXNlZCBvbiBSeWFuIEJsb29tJ3MgbWFrZV9leHBvcnQucGwKLQotIyBMaXN0IG9mIGZ1bmN0aW9ucyB0aGF0IHdlIGRvbid0IHN1cHBvcnQsIHlldD8/Ci0vYXByXyMjbmFtZSMjX3NldF9pbmhlcml0L3tuZXh0fQotL2Fwcl8jI25hbWUjI191bnNldF9pbmhlcml0L3tuZXh0fQotL2Fwcl9jb21wYXJlX2dyb3Vwcy97bmV4dH0KLS9hcHJfY29tcGFyZV91c2Vycy97bmV4dH0KLS9hcHJfZmluZF9wb29sL3tuZXh0fQotL2Fwcl9nZW5lcmF0ZV9yYW5kb21fYnl0ZXMve25leHR9Ci0vYXByX2xvY2tfY3JlYXRlX25wL3tuZXh0fQotL2Fwcl9tZDVfc2V0X3hsYXRlL3tuZXh0fQotL2Fwcl9tbWFwX2NyZWF0ZS97bmV4dH0KLS9hcHJfbW1hcF9kZWxldGUve25leHR9Ci0vYXByX21tYXBfb2Zmc2V0L3tuZXh0fQotL2Fwcl9vc190aHJlYWRfZ2V0L3tuZXh0fQotL2Fwcl9vc190aHJlYWRfcHV0L3tuZXh0fQotL2Fwcl9wb29sX2ZyZWVfYmxvY2tzX251bV9ieXRlcy97bmV4dH0KLS9hcHJfcG9vbF9qb2luL3tuZXh0fQotL2Fwcl9wb29sX251bV9ieXRlcy97bmV4dH0KLS9hcHJfcHJvY19tdXRleF9jaGlsZF9pbml0L3tuZXh0fQotL2Fwcl9wcm9jX211dGV4X2NyZWF0ZS97bmV4dH0KLS9hcHJfcHJvY19tdXRleF9jcmVhdGVfbnAve25leHR9Ci0vYXByX3Byb2NfbXV0ZXhfZGVzdHJveS97bmV4dH0KLS9hcHJfcHJvY19tdXRleF9sb2NrL3tuZXh0fQotL2Fwcl9wcm9jX211dGV4X3RyeWxvY2sve25leHR9Ci0vYXByX3Byb2NfbXV0ZXhfdW5sb2NrL3tuZXh0fQotL2Fwcl9wcm9jX290aGVyX2NoaWxkX2NoZWNrL3tuZXh0fQotL2Fwcl9wcm9jX290aGVyX2NoaWxkX3JlYWQve25leHR9Ci0vYXByX3Byb2Nfb3RoZXJfY2hpbGRfcmVnaXN0ZXIve25leHR9Ci0vYXByX3Byb2Nfb3RoZXJfY2hpbGRfdW5yZWdpc3Rlci97bmV4dH0KLS9hcHJfc2VuZGZpbGUve25leHR9Ci0vYXByX3NobV9hdmFpbC97bmV4dH0KLS9hcHJfc2htX2NhbGxvYy97bmV4dH0KLS9hcHJfc2htX2Rlc3Ryb3kve25leHR9Ci0vYXByX3NobV9mcmVlL3tuZXh0fQotL2Fwcl9zaG1faW5pdC97bmV4dH0KLS9hcHJfc2htX21hbGxvYy97bmV4dH0KLS9hcHJfc2htX25hbWVfZ2V0L3tuZXh0fQotL2Fwcl9zaG1fbmFtZV9zZXQve25leHR9Ci0vYXByX3NobV9vcGVuL3tuZXh0fQotL2Fwcl9zaWduYWwve25leHR9Ci0vYXByX3NpZ25hbF90aHJlYWQve25leHR9Ci0vYXByX3NvY2tldF9mcm9tX2ZpbGUve25leHR9Ci0vYXByX3RocmVhZF9vbmNlL3tuZXh0fQotL2Fwcl90aHJlYWRfb25jZV9pbml0L3tuZXh0fQotL2Fwcl94bGF0ZV9jbG9zZS97bmV4dH0KLS9hcHJfeGxhdGVfY29udl9idWZmZXIve25leHR9Ci0vYXByX3hsYXRlX2NvbnZfYnl0ZS97bmV4dH0KLS9hcHJfeGxhdGVfY29udl9jaGFyL3tuZXh0fQotL2Fwcl94bGF0ZV9nZXRfc2Ive25leHR9Ci0vYXByX3hsYXRlX29wZW4ve25leHR9Ci0vYXByX2JyaWdhZGVfY29uc3VtZS97bmV4dH0KLS9hcHJfYnVja2V0X21tYXBfY3JlYXRlL3tuZXh0fQotL2Fwcl9idWNrZXRfbW1hcF9tYWtlL3tuZXh0fQotL2Fwcl9idWNrZXRfdHlwZV9tbWFwL3tuZXh0fQotL2Fwcl9tZDRfc2V0X3hsYXRlL3tuZXh0fQotIy9YTUxfUGFyc2VyRnJlZS97bmV4dH0KLSMvWE1MX1BhcnNlckNyZWF0ZS97bmV4dH0KLSMvWE1MX1NldFVzZXJEYXRhL3tuZXh0fQotIy9YTUxfU2V0RWxlbWVudEhhbmRsZXIve25leHR9Ci0jL1hNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlci97bmV4dH0KLSMvWE1MX1BhcnNlL3tuZXh0fQotIy9YTUxfR2V0RXJyb3JDb2RlL3tuZXh0fQotIy9YTUxfRXJyb3JTdHJpbmcve25leHR9Ci0KLQotZnVuY3Rpb24gYWRkX3N5bWJvbCAoc3ltX25hbWUpIHsKLQlpZiAoY291bnQpIHsKLQkJZm91bmQrKwotCX0KLSMJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSMJCWxpbmUgPSBsaW5lICJcdCIKLSMJfQotCWxpbmUgPSBsaW5lIHN5bV9uYW1lICIsXG4iCi0KLQlpZiAoY291bnQgPT0gMCkgewotCQlwcmludGYoIiAlcyIsIGxpbmUpCi0JCWxpbmUgPSAiIgotCX0KLX0KLQotL15bIFx0XSpBUFtSVV0/X0RFQ0xBUkVbXihdKlsoXVteKV0qWyldKFteIF0qICkqW14oXStbKF0vIHsKLSAgICBzdWIoIlsgXHRdKkFQW1JVXT9fREVDTEFSRVteKF0qWyhdW14pXSpbKV1bIFx0XSoiLCAiIikKLSAgICBzdWIoIlsoXS4qIiwgIiIpCi0gICAgc3ViKCIoW14gXSogKF4oWyBcdF0qWyhdKSkpKyIsICIiKQotCi0gICAgYWRkX3N5bWJvbCgkMCkKLSAgICBuZXh0Ci19Ci0KLS9eWyBcdF0qQVBfREVDTEFSRV9IT09LW14oXSpbKF1bXildKlspXS8gewotICAgIHNwbGl0KCQwLCBhcmdzLCAiLCIpCi0gICAgc3ltYm9sID0gYXJnc1syXQotICAgIHN1YigiXlsgXHRdKyIsICIiLCBzeW1ib2wpCi0gICAgc3ViKCJbIFx0XSskIiwgIiIsIHN5bWJvbCkKLQotICAgIGFkZF9zeW1ib2woImFwX2hvb2tfIiBzeW1ib2wpCi0gICAgYWRkX3N5bWJvbCgiYXBfaG9va19nZXRfIiBzeW1ib2wpCi0gICAgYWRkX3N5bWJvbCgiYXBfcnVuXyIgc3ltYm9sKQotICAgIG5leHQKLX0KLQotL15bIFx0XSpBUFtSVV0/X0RFQ0xBUkVfREFUQSAuKjskLyB7Ci0gICAgICAgdmFybmFtZSA9ICRORjsKLSAgICAgICBnc3ViKCAvWyo7XS8sICIiLCB2YXJuYW1lKTsKLSAgICAgICBnc3ViKCAvXFsuKlxdLywgIiIsIHZhcm5hbWUpOwotICAgICAgIGFkZF9zeW1ib2wodmFybmFtZSk7Ci19Ci0KLSNFTkQgewotIwlwcmludGYoIiAlcyIsIGxpbmUpCi0jfQpkaWZmIC0tZ2l0IGEvYnVpbGQvbWFrZV92YXJfZXhwb3J0LmF3ayBiL2J1aWxkL21ha2VfdmFyX2V4cG9ydC5hd2sKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMjYzZjEuLjAwMDAwMDAKLS0tIGEvYnVpbGQvbWFrZV92YXJfZXhwb3J0LmF3aworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLSMgQmFzZWQgb24gYXByJ3MgbWFrZV9leHBvcnQuYXdrLCB3aGljaCBpcwotIyBiYXNlZCBvbiBSeWFuIEJsb29tJ3MgbWFrZV9leHBvcnQucGwKLQotL14jWyBcdF0qaWYoZGVmKT8gKEFQW1JVXT9ffCE/ZGVmaW5lZCkuKi8gewotCWlmIChvbGRfZmlsZW5hbWUgIT0gRklMRU5BTUUpIHsKLQkJaWYgKG9sZF9maWxlbmFtZSAhPSAiIikgcHJpbnRmKCIlcyIsIGxpbmUpCi0JCW1hY3JvX25vID0gMAotCQlmb3VuZCA9IDAKLQkJY291bnQgPSAwCi0JCW9sZF9maWxlbmFtZSA9IEZJTEVOQU1FCi0JCWxpbmUgPSAiIgotCX0KLQltYWNyb19zdGFja1ttYWNyb19ubysrXSA9IG1hY3JvCi0JbWFjcm8gPSBzdWJzdHIoJDAsIGxlbmd0aCgkMSkrMikKLQljb3VudCsrCi0JbGluZSA9IGxpbmUgIiNpZmRlZiAiIG1hY3JvICJcbiIKLQluZXh0Ci19Ci0KLS9eI1sgXHRdKmVuZGlmLyB7Ci0JaWYgKGNvdW50ID4gMCkgewotCQljb3VudC0tCi0JCWxpbmUgPSBsaW5lICIjZW5kaWYgIiBtYWNybyAiXG4iCi0JCW1hY3JvID0gbWFjcm9fc3RhY2tbLS1tYWNyb19ub10KLQl9Ci0JaWYgKGNvdW50ID09IDApIHsKLQkJaWYgKGZvdW5kICE9IDApIHsKLQkJCXByaW50ZigiJXMiLCBsaW5lKQotCQl9Ci0JCWxpbmUgPSAiIgotCX0KLQluZXh0Ci19Ci0KLWZ1bmN0aW9uIGFkZF9zeW1ib2wgKHN5bV9uYW1lKSB7Ci0JaWYgKGNvdW50KSB7Ci0JCWZvdW5kKysKLQl9Ci0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJbGluZSA9IGxpbmUgIlx0IgotCX0KLQlsaW5lID0gbGluZSBzeW1fbmFtZSAiXG4iCi0KLQlpZiAoY291bnQgPT0gMCkgewotCQlwcmludGYoIiVzIiwgbGluZSkKLQkJbGluZSA9ICIiCi0JfQotfQotCi0vXlsgXHRdKkFQW1JVXT9fREVDTEFSRV9EQVRBIC4qOyQvIHsKLSAgICAgICB2YXJuYW1lID0gJE5GOwotICAgICAgIGdzdWIoIC9bKjtdLywgIiIsIHZhcm5hbWUpOwotICAgICAgIGdzdWIoIC9cWy4qXF0vLCAiIiwgdmFybmFtZSk7Ci0gICAgICAgYWRkX3N5bWJvbCh2YXJuYW1lKTsKLX0KLQotRU5EIHsKLQlwcmludGYoIiVzIiwgbGluZSkKLX0KZGlmZiAtLWdpdCBhL2J1aWxkL21rY29uZk5XLmF3ayBiL2J1aWxkL21rY29uZk5XLmF3awpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VjN2E1MS4uMDAwMDAwMAotLS0gYS9idWlsZC9ta2NvbmZOVy5hd2sKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0KLQotQkVHSU4gewotICAgIAotICAgIEFbIlNlcnZlclJvb3QiXSA9ICJTWVM6XEFQQUNIRTIiCi0gICAgQVsiUG9ydCJdID0gIjgwIgotICAgIAotfQotCi0vQEBMb2FkTW9kdWxlQEAvIHsKLSAgICBwcmludCAiI0xvYWRNb2R1bGUgYXV0aF9hbm9uX21vZHVsZSBtb2R1bGVzL2F1dGhhbm9uLm5sbSIKLSAgICBwcmludCAiI0xvYWRNb2R1bGUgYXV0aF9kYm1fbW9kdWxlIG1vZHVsZXMvYXV0aGRibS5ubG0iCi0gICAgcHJpbnQgIiNMb2FkTW9kdWxlIGF1dGhfZGlnZXN0X21vZHVsZSBtb2R1bGVzL2RpZ2VzdC5ubG0iCi0gICAgcHJpbnQgIiNMb2FkTW9kdWxlIGNlcm5fbWV0YV9tb2R1bGUgbW9kdWxlcy9jZXJubWV0YS5ubG0iCi0gICAgcHJpbnQgIiNMb2FkTW9kdWxlIGRhdl9tb2R1bGUgbW9kdWxlcy9tb2RfZGF2Lm5sbSIKLSAgICBwcmludCAiI0xvYWRNb2R1bGUgZGF2X2ZzX21vZHVsZSBtb2R1bGVzL21vZGRhdmZzLm5sbSIKLSAgICBwcmludCAiI0xvYWRNb2R1bGUgZXhwaXJlc19tb2R1bGUgbW9kdWxlcy9leHBpcmVzLm5sbSIKLSAgICBwcmludCAiI0xvYWRNb2R1bGUgZmlsZV9jYWNoZV9tb2R1bGUgbW9kdWxlcy9maWxlY2FjaC5ubG0iCi0gICAgcHJpbnQgIiNMb2FkTW9kdWxlIGhlYWRlcnNfbW9kdWxlIG1vZHVsZXMvaGVhZGVycy5ubG0iCi0gICAgcHJpbnQgIiNMb2FkTW9kdWxlIGluZm9fbW9kdWxlIG1vZHVsZXMvaW5mby5ubG0iCi0gICAgcHJpbnQgIiNMb2FkTW9kdWxlIG1pbWVfbWFnaWNfbW9kdWxlIG1vZHVsZXMvbWltZW1hZ2kubmxtIgotICAgIHByaW50ICIjTG9hZE1vZHVsZSBwcm94eV9tb2R1bGUgbW9kdWxlcy9wcm94eS5ubG0iCi0gICAgcHJpbnQgIiNMb2FkTW9kdWxlIHByb3h5X2Nvbm5lY3RfbW9kdWxlIG1vZHVsZXMvcHJveHlfY29ubmVjdC5ubG0iCi0gICAgcHJpbnQgIiNMb2FkTW9kdWxlIHByb3h5X2h0dHBfbW9kdWxlIG1vZHVsZXMvcHJveHlfaHR0cC5ubG0iCi0gICAgcHJpbnQgIiNMb2FkTW9kdWxlIHByb3h5X2Z0cF9tb2R1bGUgbW9kdWxlcy9wcm94eV9mdHAubmxtIgotICAgIHByaW50ICIjTG9hZE1vZHVsZSByZXdyaXRlX21vZHVsZSBtb2R1bGVzL3Jld3JpdGUubmxtIgotICAgIHByaW50ICIjTG9hZE1vZHVsZSBzcGVsaW5nX21vZHVsZSBtb2R1bGVzL3NwZWxpbmcubmxtIgotICAgIHByaW50ICIjTG9hZE1vZHVsZSBzdGF0dXNfbW9kdWxlIG1vZHVsZXMvc3RhdHVzLm5sbSIKLSAgICBwcmludCAiI0xvYWRNb2R1bGUgdW5pcXVlX2lkX21vZHVsZSBtb2R1bGVzL3VuaXF1ZWlkLm5sbSIKLSAgICBwcmludCAiI0xvYWRNb2R1bGUgdXNlcnRyYWNrX21vZHVsZSBtb2R1bGVzL3VzZXJ0cmsubmxtIgotICAgIHByaW50ICIjTG9hZE1vZHVsZSB2aG9zdF9hbGlhc19tb2R1bGUgbW9kdWxlcy92aG9zdC5ubG0iCi0gICAgcHJpbnQgIiIKLSAgICBuZXh0Ci19Ci0KLW1hdGNoICgkMCwvQEAuKkBALykgewotICAgIHM9c3Vic3RyKCQwLFJTVEFSVCsyLFJMRU5HVEgtNCkKLSMgICAgc3Vic3RyKCQwLFJTVEFSVCxSTEVOR1RIKSA9IEFbc10KLSAgICBzdWIoL0BALipAQC8sQVtzXSwkMCkKLSMgICAgcHJpbnQKLX0KLQotCi17Ci0gICAgcHJpbnQKLX0KLQotCi1FTkQgewotICAgIHByaW50Ci0gICAgcHJpbnQgIiMiCi0gICAgcHJpbnQgIiMgU2VjdXJlTGlzdGVuOiBBbGxvd3MgeW91IHRvIHNlY3VyZWx5IGJpbmQgQXBhY2hlIHRvIHNwZWNpZmljIElQIGFkZHJlc3NlcyAiCi0gICAgcHJpbnQgIiMgYW5kL29yIHBvcnRzLiIKLSAgICBwcmludCAiIyIKLSAgICBwcmludCAiIyBDaGFuZ2UgdGhpcyB0byBTZWN1cmVMaXN0ZW4gb24gc3BlY2lmaWMgSVAgYWRkcmVzc2VzIGFzIHNob3duIGJlbG93IHRvICIKLSAgICBwcmludCAiIyBwcmV2ZW50IEFwYWNoZSBmcm9tIGdsb21taW5nIG9udG8gYWxsIGJvdW5kIElQIGFkZHJlc3NlcyAoMC4wLjAuMCkiCi0gICAgcHJpbnQgIiMiCi0gICAgcHJpbnQgIiNTZWN1cmVMaXN0ZW4gNDQzIFwiU1NMIENlcnRpZmljYXRlSVBcIiIKLX0KZGlmZiAtLWdpdCBhL2J1aWxkL21rZGVwLnBlcmwgYi9idWlsZC9ta2RlcC5wZXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWUwNmVhLi4wMDAwMDAwCi0tLSBhL2J1aWxkL21rZGVwLnBlcmwKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0jIS91c3IvYmluL3BlcmwKLSMKLSMgJElkOiBta2RlcC5wZXJsLHYgMS4xIDIwMDAvMDEvMTEgMTM6MTA6NTkgc2FzY2hhIEV4cCAkCi0jCi0jIENyZWF0ZWQ6IFRodSBBdWcgMTUgMTE6NTc6MzMgMTk5NiB0b28KLSMgTGFzdCBtb2RpZmllZDogTW9uIERlYyAyNyAwOToyMzo1NiAxOTk5IHRvbwotIwotIyBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OSBUb21pIE9sbGlsYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSMgYXJlIG1ldDoKLSMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0jICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0jIAotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotIyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0jIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTwotIyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSMgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci0jIE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotIyBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgotIyBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi0jIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1kaWUgIlVzYWdlOiBta2RlcCBDUFAtY29tbWFuZCBbQ1BQIG9wdGlvbnNdIGZpbGUxIFtmaWxlMi4uLl1cbiIKLSAgaWYgKCQjQVJHViA8IDEpOwotCi0kY21kbCA9IHNoaWZ0KEBBUkdWKTsKLQotJGNtZGwgPSAiJGNtZGwgIiAuIHNoaWZ0IChAQVJHVikgd2hpbGUgKCRBUkdWWzBdID1+IC9eLVtBLVpdLyk7Ci0gIAotd2hpbGUgKCRmaWxlID0gc2hpZnQoQEFSR1YpKQotewotICAgICRmaWxlID1+IHMvXC5vJC8uYy87Ci0KLSAgICBvcGVuKEYsICIkY21kbCAkZmlsZXwiKTsKLQotICAgICZwYXJzZW91dDsKLQotICAgIGNsb3NlKEYpOwotfQotCi0KLXN1YiBpbml0aW5pdAotewotICAgICV1c2VkID0gKCk7Ci0gICAgJG9mID0gJGZpbGU7Ci0gICAgJG9mID1+IHMvXC5jJC8ubG8vOwotICAgICRzdHIgPSAiJG9mOlx0JGZpbGUiOwotICAgICRsZW4gPSBsZW5ndGggJHN0cjsKLX0KLQkKLXN1YiBpbml0c3RyCi17Ci0gICAgJHN0ciA9ICJcdCI7Ci0gICAgJGxlbiA9IGxlbmd0aCAkc3RyOwotfQotCi1zdWIgcGFyc2VvdXQKLXsKLSAgICAmaW5pdGluaXQ7Ci0gICAgd2hpbGUgKDxGPikKLSAgICB7Ci0JbmV4dCB1bmxlc3MgKC9eIyBbMC05XSogIiguKlwuaCkiLyk7Ci0KLQluZXh0IGlmICgkMSA9fiAvXlwvLyk7Ci0KLQluZXh0IGlmICR1c2VkeyQxfTsKLQotICAgICAgICAkdXNlZHskMX0gPSAxOwotCi0JJG5sZW4gPSBsZW5ndGgoJDEpICsgMTsKLQotCWlmICgkbGVuICsgJG5sZW4gPiA3MikKLQl7Ci0JICAgIHByaW50ICRzdHIsICJcXFxuIjsKLQkgICAgJmluaXRzdHI7Ci0JICAgICRzdHIgPSAkc3RyIC4gJDE7Ci0JfQotCWVsc2UgeyAkc3RyID0gJHN0ciAuICIgIiAuICQxOyB9Ci0JCSAgICAgCi0JJGxlbiArPSAkbmxlbjsJCi0JCSAgICAgCi0gICAgfQotICAgIHByaW50ICRzdHIsICJcbiI7Ci19CmRpZmYgLS1naXQgYS9idWlsZC9ta2Rpci5zaCBiL2J1aWxkL21rZGlyLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Y2QzM2M1Li4wMDAwMDAwCi0tLSBhL2J1aWxkL21rZGlyLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyEvYmluL3NoCi0jIyAKLSMjICBta2Rpci5zaCAtLSBtYWtlIGRpcmVjdG9yeSBoaWVyYXJjaHkKLSMjCi0jIyAgQmFzZWQgb24gYG1raW5zdGFsbGRpcnMnIGZyb20gTm9haCBGcmllZG1hbiA8ZnJpZWRtYW5AcHJlcC5haS5taXQuZWR1PgotIyMgIGFzIG9mIDE5OTQtMDMtMjUsIHdoaWNoIHdhcyBwbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCi0jIyAgQ2xlYW5lZCB1cCBmb3IgQXBhY2hlJ3MgQXV0b2NvbmYtc3R5bGUgSW50ZXJmYWNlIChBUEFDSSkKLSMjICBieSBSYWxmIFMuIEVuZ2Vsc2NoYWxsIDxyc2VAYXBhY2hlLm9yZz4KLSMjCi0jCi0jIFRoaXMgc2NyaXB0IGZhbGxzIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZS4KLSMgU2VlIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzL0xJQ0VOU0UKLQotCi11bWFzayAwMjIKLWVycnN0YXR1cz0wCi1mb3IgZmlsZSBpbiAkezErIiRAIn0gOyBkbyAKLSAgICBzZXQgZm5vcmQgYGVjaG8gIjokZmlsZSIgfFwKLSAgICAgICAgICAgICAgIHNlZCAtZSAncy9eOlwvLyUvJyAtZSAncy9eOi8vJyAtZSAncy9cLy8gL2cnIC1lICdzL14lL1wvLydgCi0gICAgc2hpZnQKLSAgICBwYXRoY29tcD0KLSAgICBmb3IgZCBpbiAkezErIiRAIn07IGRvCi0gICAgICAgIHBhdGhjb21wPSIkcGF0aGNvbXAkZCIKLSAgICAgICAgY2FzZSAiJHBhdGhjb21wIiBpbgotICAgICAgICAgICAgLSogKSBwYXRoY29tcD0uLyRwYXRoY29tcCA7OwotICAgICAgICBlc2FjCi0gICAgICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgotICAgICAgICAgICAgZWNobyAibWtkaXIgJHBhdGhjb21wIiAxPiYyCi0gICAgICAgICAgICBta2RpciAiJHBhdGhjb21wIiB8fCBlcnJzdGF0dXM9JD8KLSAgICAgICAgZmkKLSAgICAgICAgcGF0aGNvbXA9IiRwYXRoY29tcC8iCi0gICAgZG9uZQotZG9uZQotZXhpdCAkZXJyc3RhdHVzCi0KZGlmZiAtLWdpdCBhL2J1aWxkL253X2V4cG9ydC5pbmMgYi9idWlsZC9ud19leHBvcnQuaW5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzE4NWVhLi4wMDAwMDAwCi0tLSBhL2J1aWxkL253X2V4cG9ydC5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKiBNdXN0IGluY2x1ZGUgYXBfY29uZmlnLmggZmlyc3Qgc28gdGhhdCB3ZSBjYW4gcmVkZWZpbmUKLSAgICB0aGUgc3RhbmRhcmQgcHJvdG90eXBlcyBtYWNyb3MgYWZ0ZXIgaXQgbWVzc2VzIHdpdGgKLSAgICB0aGVtLiAqLwotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotCi0vKiBEZWZpbmUgYWxsIG9mIHRoZSBzdGFuZGFyZCBwcm90b3R5cGUgbWFjcm9zIGFzIHRoZW1zZWx2ZXMKLSAgICBzbyB0aGF0IGh0dHBkLmggd2lsbCBub3QgbWVzcyB3aXRoIHRoZW0uIFRoaXMgYWxsb3dzIAotICAgIHRoZW0gdG8gcGFzcyB1bnRvdWNoZWQgc28gdGhhdCB0aGUgQVdLIHNjcmlwdCBjYW4gcGljayAKLSAgICB0aGVtIG91dCBvZiB0aGUgcHJlcHJvY2Vzc2VkIHJlc3VsdCBmaWxlLiAqLwotI2RlZmluZSBBUF9ERUNMQVJFICAgICAgICAgICAgICBBUF9ERUNMQVJFCi0jZGVmaW5lIEFQX0NPUkVfREVDTEFSRSAgICAgICAgIEFQX0NPUkVfREVDTEFSRQotI2RlZmluZSBBUF9ERUNMQVJFX05PTlNURCAgICAgICBBUF9ERUNMQVJFX05PTlNURAotI2RlZmluZSBBUF9DT1JFX0RFQ0xBUkVfTk9OU1REICBBUF9DT1JFX0RFQ0xBUkVfTk9OU1RECi0jZGVmaW5lIEFQX0RFQ0xBUkVfSE9PSyAgICAgICAgIEFQX0RFQ0xBUkVfSE9PSwotI2RlZmluZSBBUF9ERUNMQVJFX0RBVEEgICAgICAgICBBUF9ERUNMQVJFX0RBVEEKLQotI2luY2x1ZGUgImh0dHBkLmgiCi0KLS8qIFByZXByb2Nlc3MgYWxsIG9mIHRoZSBzdGFuZGFyZCBIVFRQRCBoZWFkZXJzLiAqLwotI2luY2x1ZGUgImFwX2NvbXBhdC5oIgotI2luY2x1ZGUgImFwX2xpc3Rlbi5oIgotI2luY2x1ZGUgImFwX21tbi5oIgotI2luY2x1ZGUgImFwX21wbS5oIgotI2luY2x1ZGUgImFwX3JlbGVhc2UuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfY29ubmVjdGlvbi5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiCi0jaW5jbHVkZSAiaHR0cF9wcm90b2NvbC5oIgotI2luY2x1ZGUgImh0dHBfcmVxdWVzdC5oIgotI2luY2x1ZGUgImh0dHBfdmhvc3QuaCIKLSNpbmNsdWRlICJtcG1fY29tbW9uLmgiCi0jaW5jbHVkZSAicGNyZXBvc2l4LmgiCi0jaW5jbHVkZSAicmZjMTQxMy5oIgotI2luY2x1ZGUgInNjb3JlYm9hcmQuaCIKLSNpbmNsdWRlICJ1dGlsX2NmZ3RyZWUuaCIKLSNpbmNsdWRlICJ1dGlsX2NoYXJzZXQuaCIKLSNpbmNsdWRlICJ1dGlsX2ViY2RpYy5oIgotI2luY2x1ZGUgInV0aWxfZmlsdGVyLmgiCi0vKiNpbmNsdWRlICJ1dGlsX2xkYXAuaCIqLwotI2luY2x1ZGUgInV0aWxfbWQ1LmgiCi0jaW5jbHVkZSAidXRpbF9zY3JpcHQuaCIKLSNpbmNsdWRlICJ1dGlsX3RpbWUuaCIKLSNpbmNsdWRlICJ1dGlsX3htbC5oIgotCi0jaW5jbHVkZSAibW9kX2NvcmUuaCIKZGlmZiAtLWdpdCBhL2J1aWxkL3ByZWJ1aWxkTlcuYmF0IGIvYnVpbGQvcHJlYnVpbGROVy5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ4MmJlNGUuLjAwMDAwMDAKLS0tIGEvYnVpbGQvcHJlYnVpbGROVy5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1AZWNobyBvZmYKLXJlbSAjIEFzIHBhcnQgb2YgdGhlIHByZS1idWlsZCBwcm9jZXNzLCB0aGUgdXRpbGl0aWVzIEdlbkNoYXJzLk5MTQotcmVtICMgIChHZW4gVGVzdCBDaGFycykgYW5kIERGVGFibGVzLk5MTSAoZGZ0YWJsZXMpIG11c3QgYmUgYnVpbHQsIAotcmVtICMgIGNvcGllZCB0byBhIE5ldFdhcmUgc2VydmVyIGFuZCBydW4gdXNpbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKLXJlbSAjCi1yZW0gIyBnZW5jaGFycyA+dGVzdF9jaGFyLmgKLXJlbSAjIGRmdGFibGVzID5jaGFydGFibGVzLmMKLXJlbSAjCi1yZW0gIyAgVGhlIGZpbGVzICJzeXM6XHRlc3RfY2hhcnMuaCIgYW5kICJzeXM6XGNoYXJ0YWJsZXMuYyIgbXVzdCBiZSAKLXJlbSAjICBjb3BpZWQgdG8gImh0dHBkXG9zXG5ldHdhcmUiIG9uIHRoZSBidWlsZCBtYWNoaW5lLgotCi1AZWNobyBGaXhpbmcgdXAgdGhlIEFQUiBoZWFkZXJzCi1jb3B5IC4uXHNyY2xpYlxhcHJcaW5jbHVkZVxhcHIuaG53IC4uXHNyY2xpYlxhcHJcaW5jbHVkZVxhcHIuaAotCi1AZWNobyBGaXhpbmcgdXAgdGhlIEFQUi1VdGlsIGhlYWRlcnMKLWNvcHkgLi5cc3JjbGliXGFwci11dGlsXGluY2x1ZGVcYXB1LmguaW4gLi5cc3JjbGliXGFwci11dGlsXGluY2x1ZGVcYXB1LmgKLQotQGVjaG8gRml4aW5nIHVwIHRoZSBwY3JlIGhlYWRlcnMKLWNvcHkgLi5cc3JjbGliXHBjcmVcY29uZmlnLmh3IC4uXHNyY2xpYlxwY3JlXGNvbmZpZy5oCi1jb3B5IC4uXHNyY2xpYlxwY3JlXHBjcmUuaHcgLi5cc3JjbGliXHBjcmVccGNyZS5oCi0KLUBlY2hvIEdlbmVyYXRpbmcgdGhlIGltcG9ydCBsaXN0cy4uLgotYXdrOTUgLWYgbWFrZV9ud19leHBvcnQuYXdrIC4uXHNyY2xpYlxhcHJcaW5jbHVkZVwqLmggfHNvcnQgPiAuLlxvc1xuZXR3YXJlXGFwcmxpYi5pbXAKLWF3azk1IC1mIG1ha2VfbndfZXhwb3J0LmF3ayAuLlxzcmNsaWJcYXByLXV0aWxcaW5jbHVkZVwqLmggfHNvcnQgPiAuLlxvc1xuZXR3YXJlXGFwcnV0aWwuaW1wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVpbGQvcHJvZ3JhbS5tayBiL2J1aWxkL3Byb2dyYW0ubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNTJkODguLjAwMDAwMDAKLS0tIGEvYnVpbGQvcHJvZ3JhbS5taworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAxOTk5LCAyMDAwIFNhc2NoYSBTY2h1bWFubi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIyBhcmUgbWV0OgotIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSMgCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgU0FTQ0hBIFNDSFVNQU5OIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSMgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotIyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8KLSMgRVZFTlQgU0hBTEwgU0FTQ0hBIFNDSFVNQU5OIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSMgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci0jIE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotIyBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgotIyBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi0jIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICRJZDogcHJvZ3JhbS5tayx2IDEuMSAyMDAwLzAxLzExIDEzOjEwOjU5IHNhc2NoYSBFeHAgJCAKLSMKLQotUFJPR1JBTV9PQkpFQ1RTID0gJChQUk9HUkFNX1NPVVJDRVM6LmM9LmxvKQotCi0kKFBST0dSQU1fTkFNRSk6ICQoUFJPR1JBTV9ERVBFTkRFTkNJRVMpICQoUFJPR1JBTV9PQkpFQ1RTKQotCSQoTElOSykgJChQUk9HUkFNX0xERkxBR1MpICQoUFJPR1JBTV9PQkpFQ1RTKSAkKFBST0dSQU1fTERBREQpCmRpZmYgLS1naXQgYS9idWlsZC9ydWxlcy5tay5pbiBiL2J1aWxkL3J1bGVzLm1rLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTljYmNmLi4wMDAwMDAwCi0tLSBhL2J1aWxkL3J1bGVzLm1rLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0jIHJlc2VydmVkLgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0jIGFyZSBtZXQ6Ci0jCi0jIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMKLSMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0jICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgICAgZGlzdHJpYnV0aW9uLgotIwotIyAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSMgICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSMgICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0jICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotIyAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0jICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0jCi0jIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0jICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotIyAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSMgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0jCi0jIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotIyAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSMgICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSMgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSMgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotIyBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIyBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0jIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotIyBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSMgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0jIFNVQ0ggREFNQUdFLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotIyBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSMgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0jIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSMKLSMgVGhlIGJ1aWxkIGVudmlyb25tZW50IHdhcyBvcmlnaW5hbGx5IHByb3ZpZGVkIGJ5IFNhc2NoYSBTY2h1bWFubi4KLSMKLQotaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvY29uZmlnX3ZhcnMubWsKLQotIyBDb21iaW5lIGFsbCBvZiB0aGUgZmxhZ3MgdG9nZXRoZXIgaW4gdGhlIHByb3BlciBvcmRlciBzbyB0aGF0Ci0jIHRoZSB1c2VyLWRlZmluZWQgZmxhZ3MgY2FuIGFsd2F5cyBvdmVycmlkZSB0aGUgY29uZmlndXJlIG9uZXMsIGlmIG5lZWRlZC4KLSMgTm90ZSB0aGF0IGluY2x1ZGVzIGFyZSBsaXN0ZWQgYWZ0ZXIgdGhlIGZsYWdzIGJlY2F1c2UgLUkgb3B0aW9ucyBoYXZlCi0jIGxlZnQtdG8tcmlnaHQgcHJlY2VkZW5jZSBhbmQgQ1BQRkxBR1MgbWF5IGluY2x1ZGUgdXNlci1kZWZpbmVkIG92ZXJyaWRlcy4KLSMKLUFMTF9DRkxBR1MgICA9ICQoRVhUUkFfQ0ZMQUdTKSAkKE5PVEVTVF9DRkxBR1MpICQoQ0ZMQUdTKQotQUxMX0NQUEZMQUdTID0gJChERUZTKSAkKEVYVFJBX0NQUEZMQUdTKSAkKE5PVEVTVF9DUFBGTEFHUykgJChDUFBGTEFHUykKLUFMTF9DWFhGTEFHUyA9ICQoRVhUUkFfQ1hYRkxBR1MpICQoTk9URVNUX0NYWEZMQUdTKSAkKENYWEZMQUdTKQotQUxMX0xERkxBR1MgID0gJChFWFRSQV9MREZMQUdTKSAkKE5PVEVTVF9MREZMQUdTKSAkKExERkxBR1MpCi1BTExfTElCUyAgICAgPSAkKEVYVFJBX0xJQlMpICQoTk9URVNUX0xJQlMpICQoTElCUykKLUFMTF9JTkNMVURFUyA9ICQoSU5DTFVERVMpICQoRVhUUkFfSU5DTFVERVMpCi0KLSMgQ29tcGlsZSBjb21tYW5kcwotCi1DT01QSUxFICAgICAgPSAkKENDKSAgJChBTExfQ0ZMQUdTKSAkKEFMTF9DUFBGTEFHUykgJChBTExfSU5DTFVERVMpCi1DWFhfQ09NUElMRSAgPSAkKENYWCkgJChBTExfQ1hYRkxBR1MpICQoQUxMX0NQUEZMQUdTKSAkKEFMTF9JTkNMVURFUykKLQotU0hfQ09NUElMRSAgICAgPSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgQFNITFRDRkxBR1NAIC1jICQ8ICYmIHRvdWNoICRACi1TSF9DWFhfQ09NUElMRSA9ICQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDWFhfQ09NUElMRSkgQFNITFRDRkxBR1NAIC1jICQ8ICYmIHRvdWNoICRACi0KLUxUX0NPTVBJTEUgICAgID0gJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIEBMVENGTEFHU0AgLWMgJDwgJiYgdG91Y2ggJEAKLUxUX0NYWF9DT01QSUxFID0gJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENYWF9DT01QSUxFKSBATFRDRkxBR1NAIC1jICQ8ICYmIHRvdWNoICRACi0KLSMgTGluay1yZWxhdGVkIGNvbW1hbmRzCi0KLUxJTksgICAgID0gJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENPTVBJTEUpICQoTFRfTERGTEFHUykgJChBTExfTERGTEFHUykgLW8gJEAKLVNIX0xJTksgID0gJChTSF9MSUJUT09MKSAtLW1vZGU9bGluayAkKENPTVBJTEUpICQoTFRfTERGTEFHUykgJChBTExfTERGTEFHUykgJChTSF9MREZMQUdTKSAkKENPUkVfSU1QTElCKSAtbyAkQAotTU9EX0xJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ09NUElMRSkgLW1vZHVsZSAkKExUX0xERkxBR1MpICQoQUxMX0xERkxBR1MpIC1vICRACi0KLSMgQ3Jvc3MgY29tcGlsZSBjb21tYW5kcwotCi0jIEhlbHBlciBwcm9ncmFtcwotCi1NS0lOU1RBTExESVJTID0gJChhYnNfc3JjZGlyKS9idWlsZC9ta2Rpci5zaAotSU5TVEFMTCA9ICQoYWJzX3NyY2RpcikvYnVpbGQvaW5zdGFsbC5zaCAtYwotSU5TVEFMTF9EQVRBID0gJChJTlNUQUxMKSAtbSA2NDQKLUlOU1RBTExfUFJPR1JBTSA9ICQoSU5TVEFMTCkgLW0gNzU1ICQoSU5TVEFMTF9QUk9HX0ZMQUdTKQotCi0jCi0jIFN0YW5kYXJkIGJ1aWxkIHJ1bGVzCi0jCi1hbGw6IGFsbC1yZWN1cnNpdmUKLWRlcGVuZDogZGVwZW5kLXJlY3Vyc2l2ZQotY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCi1leHRyYWNsZWFuOiBleHRyYWNsZWFuLXJlY3Vyc2l2ZQotaW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKLXNoYXJlZC1idWlsZDogc2hhcmVkLWJ1aWxkLXJlY3Vyc2l2ZQotCi1hbGwtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIGRlcGVuZC1yZWN1cnNpdmU6Ci0JQG90YXJnZXQ9YGVjaG8gJEB8c2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBcCi0JZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWQgIiQkaSI7IHRoZW4gXAotCQl0YXJnZXQ9IiQkb3RhcmdldCI7IFwKLQkJZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkaSI7IFwKLQkJaWYgdGVzdCAiJCRpIiA9ICIuIjsgdGhlbiBcCi0JCQltYWRlX2xvY2FsPXllczsgXAotCQkJdGFyZ2V0PSJsb2NhbC0kJHRhcmdldCI7IFwKLQkJZmk7IFwKLQkJKGNkICQkaSAmJiAkKE1BS0UpICQkdGFyZ2V0KSB8fCBleGl0IDE7IFwKLQkgICAgZmk7IFwKLQlkb25lOyBcCi0JaWYgdGVzdCAiJCRvdGFyZ2V0IiA9ICJhbGwiICYmIHRlc3QgLXogJyQoVEFSR0VUUyknOyB0aGVuIFwKLQkgICAgbWFkZV9sb2NhbD15ZXM7IFwKLQlmaTsgXAotCWlmIHRlc3QgIiQkbWFkZV9sb2NhbCIgIT0gInllcyI7IHRoZW4gXAotCSAgICAkKE1BS0UpICJsb2NhbC0kJG90YXJnZXQiIHx8IGV4aXQgMTsgXAotCWZpCi0KLWNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIGV4dHJhY2xlYW4tcmVjdXJzaXZlOgotCUBvdGFyZ2V0PWBlY2hvICRAfHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlsaXN0PSckKFNVQkRJUlMpICQoQ0xFQU5fU1VCRElSUyknOyBcCi0JZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWQgIiQkaSI7IHRoZW4gXAotCQl0YXJnZXQ9IiQkb3RhcmdldCI7IFwKLQkJZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkaSI7IFwKLQkJaWYgdGVzdCAiJCRpIiA9ICIuIjsgdGhlbiBcCi0JCQltYWRlX2xvY2FsPXllczsgXAotCQkJdGFyZ2V0PSJsb2NhbC0kJHRhcmdldCI7IFwKLQkJZmk7IFwKLQkJKGNkICQkaSAmJiAkKE1BS0UpICQkdGFyZ2V0KTsgXAotCSAgICBmaTsgXAotCWRvbmU7IFwKLQlpZiB0ZXN0ICIkJG90YXJnZXQiID0gImFsbCIgJiYgdGVzdCAteiAnJChUQVJHRVRTKSc7IHRoZW4gXAotCSAgICBtYWRlX2xvY2FsPXllczsgXAotCWZpOyBcCi0JaWYgdGVzdCAiJCRtYWRlX2xvY2FsIiAhPSAieWVzIjsgdGhlbiBcCi0JICAgICQoTUFLRSkgImxvY2FsLSQkb3RhcmdldCI7IFwKLQlmaQotCi1zaGFyZWQtYnVpbGQtcmVjdXJzaXZlOgotCUBpZiB0ZXN0IGBwd2RgID0gIiQodG9wX2J1aWxkZGlyKSI7IHRoZW4gXAotCSAgICAkKFBSRV9TSEFSRURfQ01EUykgOyBcCi0JZmk7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIHRhcmdldD0ic2hhcmVkLWJ1aWxkIjsgXAotCSAgICBpZiB0ZXN0ICIkJGkiID0gIi4iOyB0aGVuIFwKLQkJbWFkZV9sb2NhbD15ZXM7IFwKLQkJdGFyZ2V0PSJsb2NhbC1zaGFyZWQtYnVpbGQiOyBcCi0JICAgIGZpOyBcCi0JICAgIGlmIHRlc3QgIiQkaSIgIT0gInNyY2xpYiI7IHRoZW4gXAotCQkoY2QgJCRpICYmICQoTUFLRSkgJCR0YXJnZXQpIHx8IGV4aXQgMTsgXAotCSAgICBmaTsgXAotCWRvbmU7IFwKLQlpZiB0ZXN0IC1mICdtb2R1bGVzLm1rJzsgdGhlbiBcCi0JICAgIGlmIHRlc3QgLW4gJyQoU0hBUkVEX1RBUkdFVFMpJzsgdGhlbiBcCi0JCWVjaG8gIkJ1aWxkaW5nIHNoYXJlZDogJChTSEFSRURfVEFSR0VUUykiOyBcCi0JCWlmIHRlc3QgIiQkbWFkZV9sb2NhbCIgIT0gInllcyI7IHRoZW4gXAotCQkJJChNQUtFKSAibG9jYWwtc2hhcmVkLWJ1aWxkIiB8fCBleGl0IDE7IFwKLQkJZmk7IFwKLQkgICAgZmk7IFwKLQlmaTsgXAotCWlmIHRlc3QgYHB3ZGAgPSAiJCh0b3BfYnVpbGRkaXIpIjsgdGhlbiBcCi0JCSQoUE9TVF9TSEFSRURfQ01EUykgOyBcCi0JZmkKLQotbG9jYWwtYWxsOiAkKFRBUkdFVFMpCi0KLWxvY2FsLXNoYXJlZC1idWlsZDogJChTSEFSRURfVEFSR0VUUykKLQotbG9jYWwtZGVwZW5kOiB4LWxvY2FsLWRlcGVuZAotCWlmIHRlc3QgImBlY2hvICQoc3JjZGlyKS8qLmNgIiAhPSAiJChzcmNkaXIpJy8qLmMnIjsgdGhlbiBcCi0JCSQoQ0MpIC1NTSAkKEFMTF9DUFBGTEFHUykgJChBTExfSU5DTFVERVMpICQoc3JjZGlyKS8qLmMgfCBzZWQgJ3MvXC5vOi8ubG86LycgPiAkKGJ1aWxkZGlyKS8uZGVwcyB8fCB0cnVlOyAgICAgICAgICAgXAotCWZpCi0KLWxvY2FsLWNsZWFuOiB4LWxvY2FsLWNsZWFuCi0Jcm0gLWYgKi5vICoubG8gKi5zbG8gKi5vYmogKi5hICoubGEgJChDTEVBTl9UQVJHRVRTKSAkKFRBUkdFVFMpCi0Jcm0gLXJmIC5saWJzCi0KLWxvY2FsLWRpc3RjbGVhbjogbG9jYWwtY2xlYW4geC1sb2NhbC1kaXN0Y2xlYW4KLQlybSAtZiAuZGVwcyBNYWtlZmlsZSAkKERJU1RDTEVBTl9UQVJHRVRTKQotCi1sb2NhbC1leHRyYWNsZWFuOiBsb2NhbC1kaXN0Y2xlYW4geC1sb2NhbC1leHRyYWNsZWFuCi0JQGlmIHRlc3QgLW4gIiQoRVhUUkFDTEVBTl9UQVJHRVRTKSI7IHRoZW4gXAotCSAgICBlY2hvICJybSAtZiAkKEVYVFJBQ0xFQU5fVEFSR0VUUykiOyBcCi0JICAgIHJtIC1mICQoRVhUUkFDTEVBTl9UQVJHRVRTKSA7IFwKLQlmaQotCi1sb2NhbC1pbnN0YWxsOiAkKFRBUkdFVFMpICQoU0hBUkVEX1RBUkdFVFMpICQoSU5TVEFMTF9UQVJHRVRTKQotCUBpZiB0ZXN0IC1uICckKFBST0dSQU1TKSc7IHRoZW4gXAotCSAgICB0ZXN0IC1kICQoYmluZGlyKSB8fCAkKE1LSU5TVEFMTERJUlMpICQoYmluZGlyKTsgXAotCSAgICBsaXN0PSckKFBST0dSQU1TKSc7IGZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgICAgICAgJChJTlNUQUxMX1BST0dSQU0pICQkaSAkKGJpbmRpcik7IFwKLQkgICAgZG9uZTsgXAotCWZpCi0KLSMgdG8gYmUgZmlsbGVkIGluIGJ5IHRoZSBhY3R1YWwgTWFrZWZpbGUgaWYgZXh0cmEgY29tbWFuZHMgYXJlIG5lZWRlZAoteC1sb2NhbC1kZXBlbmQgeC1sb2NhbC1jbGVhbiB4LWxvY2FsLWRpc3RjbGVhbiB4LWxvY2FsLWV4dHJhY2xlYW46Ci0KLSMKLSMgSW1wbGljaXQgcnVsZXMgZm9yIGNyZWF0aW5nIG91dHB1dHMgZnJvbSBpbnB1dCBmaWxlcwotIwotQ1hYX1NVRkZJWCA9IGNwcAotU0hMSUJfU1VGRklYID0gc28KLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuUyAuYyAuJChDWFhfU1VGRklYKSAubG8gLm8gLnMgLnkgLmwgLnNsbyAuZGVmIC5sYQotCi0uYy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLnMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5jLmxvOgotCSQoTFRfQ09NUElMRSkKLQotLnMubG86Ci0JJChMVF9DT01QSUxFKQotCi0uYy5zbG86Ci0JJChTSF9DT01QSUxFKQotCi0uJChDWFhfU1VGRklYKS5sbzoKLQkkKExUX0NYWF9DT01QSUxFKQotCi0uJChDWFhfU1VGRklYKS5zbG86Ci0JJChTSF9DWFhfQ09NUElMRSkKLQotLnkuYzoKLQkkKFlBQ0MpICQoWUZMQUdTKSAkPCAmJiBtdiB5LnRhYi5jICQqLmMKLQlpZiB0ZXN0IC1mIHkudGFiLmg7IHRoZW4gXAotCWlmIGNtcCAtcyB5LnRhYi5oICQqLmg7IHRoZW4gcm0gLWYgeS50YWIuaDsgZWxzZSBtdiB5LnRhYi5oICQqLmg7IGZpOyBcCi0JZWxzZSA6OyBmaQotCi0ubC5jOgotCSQoTEVYKSAkKExGTEFHUykgJDwgJiYgbXYgJChMRVhfT1VUUFVUX1JPT1QpLmMgJEAKLQotIyBNYWtlcyBhbiBpbXBvcnQgbGlicmFyeSBmcm9tIGEgZGVmIGZpbGUKLS5kZWYubGE6Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKE1LX0lNUExJQikgLW8gJEAgJDwKLQotIwotIyBEZXBlbmRlbmNpZXMKLSMKLWluY2x1ZGUgJChidWlsZGRpcikvLmRlcHMKLQotLlBIT05ZOiBhbGwgYWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSBsb2NhbC1hbGwgJChQSE9OWV9UQVJHRVRTKSBcCi0Jc2hhcmVkLWJ1aWxkIHNoYXJlZC1idWlsZC1yZWN1cnNpdmUgbG9jYWwtc2hhcmVkLWJ1aWxkIFwKLQlkZXBlbmQgZGVwZW5kLXJlY3Vyc2l2ZSBsb2NhbC1kZXBlbmQgeC1sb2NhbC1kZXBlbmQgXAotCWNsZWFuIGNsZWFuLXJlY3Vyc2l2ZSBsb2NhbC1jbGVhbiB4LWxvY2FsLWNsZWFuIFwKLQlkaXN0Y2xlYW4gZGlzdGNsZWFuLXJlY3Vyc2l2ZSBsb2NhbC1kaXN0Y2xlYW4geC1sb2NhbC1kaXN0Y2xlYW4gXAotCWV4dHJhY2xlYW4gZXh0cmFjbGVhbi1yZWN1cnNpdmUgbG9jYWwtZXh0cmFjbGVhbiB4LWxvY2FsLWV4dHJhY2xlYW4gXAotCWluc3RhbGwgbG9jYWwtaW5zdGFsbCAkKElOU1RBTExfVEFSR0VUUykKLQpkaWZmIC0tZ2l0IGEvYnVpbGQvc3BlY2lhbC5tayBiL2J1aWxkL3NwZWNpYWwubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNjg4MzYuLjAwMDAwMDAKLS0tIGEvYnVpbGQvc3BlY2lhbC5taworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAxOTk5LCAyMDAwIFNhc2NoYSBTY2h1bWFubi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIyBhcmUgbWV0OgotIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSMgCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgU0FTQ0hBIFNDSFVNQU5OIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSMgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotIyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8KLSMgRVZFTlQgU0hBTEwgU0FTQ0hBIFNDSFVNQU5OIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSMgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci0jIE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotIyBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgotIyBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi0jIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICRJZDogc3BlY2lhbC5tayx2IDEuMSAyMDAwLzAxLzExIDEzOjEwOjU5IHNhc2NoYSBFeHAgJCAKLSMKLQotCi0KLWFsbDogYWxsLXJlY3Vyc2l2ZQotCi1pbmNsdWRlIG1vZHVsZXMubWsKLXRhcmdldHMgPSAkKHN0YXRpYykgJChzaGFyZWQpCi1pbnN0YWxsX3RhcmdldHMgPSBpbnN0YWxsLW1vZHVsZXMKLQotaW5zdGFsbC1tb2R1bGVzOgotCUBzaGFyZWQ9JyQoc2hhcmVkKSc7IFwKLQlpZiB0ZXN0IC1uICIkJHNoYXJlZCI7IHRoZW4gXAotCQkkKG1raW5zdGFsbGRpcnMpICQobGliZXhlY2Rpcik7IFwKLQkJZm9yIGkgaW4gJCRzaGFyZWQ7IGRvIFwKLQkJCSQoU0hMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCBjcCAkJGkgJChsaWJleGVjZGlyKTsgXAotCQlkb25lOyBcCi0JZmkJCi0KLWluY2x1ZGUgJCh0b3BzcmNkaXIpL2J1aWxkL3J1bGVzLm1rCi0KZGlmZiAtLWdpdCBhL2J1aWxkL3N5c3ZfbWFrZWZpbGUgYi9idWlsZC9zeXN2X21ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZjM3MDMwLi4wMDAwMDAwCi0tLSBhL2J1aWxkL3N5c3ZfbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0jISAvYmluL3NoCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSMKLSMgQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSMgYXJlIG1ldDoKLSMKLSMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIwotIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSMgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyAgICBkaXN0cmlidXRpb24uCi0jCi0jIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotIyAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotIyAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSMgICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0jICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSMgICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSMKLSMgNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSMgICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0jICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotIyAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSMKLSMgNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0jICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotIyAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotIyBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIyBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0jIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0jIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0jIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotIyBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSMgU1VDSCBEQU1BR0UuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0jIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotIyBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSMgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotIwotIyBUaGUgYnVpbGQgZW52aXJvbm1lbnQgd2FzIHByb3ZpZGVkIGJ5IFNhc2NoYSBTY2h1bWFubi4KLSMKLQotIyBjd2QgbXVzdCBiZSB0b3Bfc3JjZGlyCi10ZXN0IC1mIGJ1aWxkL3N5c3ZfbWFrZWZpbGUgfHwgZXhpdCAyCi0KLXRlc3QgLWYgYnNkX2NvbnZlcnRlZCB8fCBleGl0IDEKLQotdG1wZmlsZT1gbWt0ZW1wIC90bXAvc3lzdl9tYWtlZmlsZS5YWFhYWFhgIHx8IGV4aXQgMQotZm9yIGkgaW4gYnVpbGQvKi5tazsgZG8KLSAgICBzZWQgJ3MvXlwuaW5jbHVkZSAiXCguKlwpIi9pbmNsdWRlIFwxLycgJGkgPiR0bXBmaWxlIFwKLSAgICAgICAgJiYgY3AgJHRtcGZpbGUgJGkKLWRvbmUKLXJtIC1mICR0bXBmaWxlCi0KLXJtIGJzZF9jb252ZXJ0ZWQKLWV4aXQgMApkaWZmIC0tZ2l0IGEvYnVpbGQvd2luMzIvLmN2c2lnbm9yZSBiL2J1aWxkL3dpbjMyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNzU1NjAuLjAwMDAwMDAKLS0tIGEvYnVpbGQvd2luMzIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotQXBhY2hlLmFwcwotQXBhY2hlLnJjCmRpZmYgLS1naXQgYS9idWlsZC93aW4zMi9hcGFjaGUuaWNvIGIvYnVpbGQvd2luMzIvYXBhY2hlLmljbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU4YWRjYi4uMDAwMDAwMAotLS0gYS9idWlsZC93aW4zMi9hcGFjaGUuaWNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVpbGQvd2luMzIvd2luMzJ2ZXIuYXdrIGIvYnVpbGQvd2luMzIvd2luMzJ2ZXIuYXdrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODYyYWE4Li4wMDAwMDAwCi0tLSBhL2J1aWxkL3dpbjMyL3dpbjMydmVyLmF3aworKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi1CRUdJTiB7Ci0KLSAgIyBmZiBiaXRzOiAxKGRlYnVnKSwgMihwcmVyZWxlYXNlKSwgNChwYXRjaGVkKSwgOCh2ZW5kb3IpIGFuZCAzMihzcGVjaWFsKQotICAjIGRlYnVnIGlzIHN1bW1lZCBiYXNlZCBvbiB0aGUgL0RlZmluZSBfREVCVUcKLSAgIyBwcmVyZWxlYXNlIGlzIGJhc2VkIG9uIHRoZSAtZGV2IGV4dGVuc2lvbiwKLSAgIyBwYXRjaGVkIGlzIGJhc2VkIG9uIGEgbm9uLXN0YW5kYXJkICItdmVyIiBleHRlbnNpb24sIAotICAjIHNwZWNpYWwgYW5kIHZlbmRvciBhcmUgdG9nZ2xlZCBieSB0aGVpciBhcmdzLgotICAjCi0gIGZmID0gMDsKLQotICBmaWxlPUFSR1ZbMV07Ci0gIGRlc2M9QVJHVlsyXTsKLSAgcmVsX2g9QVJHVlszXTsKLQotICBpID0gNDsKLSAgd2hpbGUgKGxlbmd0aChBUkdWW2ldKSkgewotICAgIGlmIChtYXRjaChBUkdWW2ldLCAvaWNvbj0vKSkgewotICAgICAgaWNvbiA9IHN1YnN0cihBUkdWW2ldLCA2KTsKLSAgICB9Ci0gICAgaWYgKG1hdGNoKEFSR1ZbaV0sIC92ZW5kb3I9LykpIHsKLSAgICAgIHZlbmRvciA9IHN1YnN0cihBUkdWW2ldLCA4KTsKLSAgICAgIGZmID0gZmYgKyA4OwotICAgIH0KLSAgICBpZiAobWF0Y2goQVJHVltpXSwgL3NwZWNpYWw9LykpIHsKLSAgICAgIHNwZWNpYWwgPSBzdWJzdHIoQVJHVltpXSwgOSk7Ci0gICAgICBmZiA9IGZmICsgMzI7Ci0gICAgfQotICAgIGkgPSBpICsgMQotICB9Ci0KLSAgaSA9IGkgLSAxOwotICB3aGlsZSAoaSkgewotICAgIGRlbGV0ZSBBUkdWW2ldOwotICAgIGkgPSBpIC0gMTsKLSAgfQotCi0gIHdoaWxlICgoZ2V0bGluZSA8IHJlbF9oKSA+IDApIHsKLSAgICBpZiAobWF0Y2ggKCQwLCAvXiNkZWZpbmUgQVBfU0VSVkVSX0JBU0VSRVZJU0lPTiAiW14iXSsiLykpIHsKLSAgICAgIHZlciA9IHN1YnN0cigkMCwgUlNUQVJUICsgMzIsIFJMRU5HVEggLSAzMyk7Ci0gICAgfQotICB9Ci0KLSAgdmVyYyA9IHZlcjsKLSAgZ3N1YigvXC4vLCAiLCIsIHZlcmMpOwotICBpZiAoYnVpbGQpIHsKLSAgICBzdWIoLy0uKi8sICIiLCB2ZXJjKQotICAgIHZlcmMgPSB2ZXJjICIsIiBidWlsZDsKLSAgfSBlbHNlIGlmIChzdWIoLy1kZXYvLCAiLDAiLCB2ZXJjKSkgewotICAgICAgZmYgPSBmZiArIDI7Ci0gIH0gZWxzZSBpZiAoIXN1YigvLWFscGhhLywgIiwxMCIsIHZlcmMpICBcCi0gICAgICAgICAgJiYgIXN1YigvLWJldGEvLCAiLDEwMCIsIHZlcmMpICBcCi0gICAgICAgICAgJiYgIXN1YigvLWdvbGQvLCAiLDIwMCIsIHZlcmMpKSB7Ci0gICAgc3ViKC8tLiovLCAiIiwgdmVyYyk7Ci0gICAgdmVyYyA9IHZlcmMgIiwiIDA7Ci0gIH0KLSAgCi0gIGlmIChsZW5ndGgodmVuZG9yKSkgewotICAgIGZmID0gZmYgKyA4OwotICB9Ci0KLSAgaWYgKGxlbmd0aChpY29uKSkgewotICAgIHByaW50ICIxIElDT04gRElTQ0FSREFCTEUgXCIiIGljb24gIlwiIjsKLSAgfQotICBwcmludCAiMSBWRVJTSU9OSU5GTyI7Ci0gIHByaW50ICIgRklMRVZFUlNJT04gIiB2ZXJjICIiOwotICBwcmludCAiIFBST0RVQ1RWRVJTSU9OICIgdmVyYyAiIjsKLSAgcHJpbnQgIiBGSUxFRkxBR1NNQVNLIDB4M2ZMIjsKLSAgcHJpbnQgIiNpZiBkZWZpbmVkKF9ERUJVRykiCi0gIHByaW50ICIgRklMRUZMQUdTIDB4IiBzcHJpbnRmKCIlMDJ4IiwgZmYgKyAxKSAiTCI7Ci0gIHByaW50ICIjZWxzZSIKLSAgcHJpbnQgIiBGSUxFRkxBR1MgMHgiIHNwcmludGYoIiUwMngiLCBmZikgIkwiOwotICBwcmludCAiI2VuZGlmIgotICBwcmludCAiIEZJTEVPUyAweDQwMDA0TCI7Ci0gIHByaW50ICIgRklMRVRZUEUgMHgxTCI7Ci0gIHByaW50ICIgRklMRVNVQlRZUEUgMHgwTCI7Ci0gIHByaW50ICJCRUdJTiI7Ci0gIHByaW50ICIgIEJMT0NLIFwiU3RyaW5nRmlsZUluZm9cIiI7Ci0gIHByaW50ICIgIEJFR0lOIjsKLSAgcHJpbnQgIiAgICBCTE9DSyBcIjAwMDAwMDAwXCIiOwotICBwcmludCAiICAgIEJFR0lOIjsKLSAgcHJpbnQgIiAgICAgIFZBTFVFIFwiQ29tbWVudHNcIiwgXCJUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mICIgXAotICAgICAgICAidm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55IGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiAiIFwKLSAgICAgICAgInRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSAiIFwKLSAgICAgICAgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPlxcMFwiIjsKLSAgcHJpbnQgIiAgICAgIFZBTFVFIFwiQ29tcGFueU5hbWVcIiwgXCJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi5cXDBcIiI7Ci0gIHByaW50ICIgICAgICBWQUxVRSBcIkZpbGVEZXNjcmlwdGlvblwiLCBcIiIgZGVzYyAiXFwwXCIiOwotICBwcmludCAiICAgICAgVkFMVUUgXCJGaWxlVmVyc2lvblwiLCBcIiIgdmVyICJcXDBcIiI7Ci0gIHByaW50ICIgICAgICBWQUxVRSBcIkludGVybmFsTmFtZVwiLCBcIiIgZmlsZSAiXFwwXCIiOwotICBwcmludCAiICAgICAgVkFMVUUgXCJMZWdhbENvcHlyaWdodFwiLCBcIkNvcHlyaWdodCAoYykgMjAwMSwgIiBcCi0gICAgICAgICJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBDdXJyZW50IExpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gIiBcCi0gICAgICAgICI8aHR0cDovL3d3dy5hcGFjaGUub3JnL0xJQ0VOU0UudHh0PlxcMFwiIjsKLSAgcHJpbnQgIiAgICAgIFZBTFVFIFwiT3JpZ2luYWxGaWxlbmFtZVwiLCBcIiIgZmlsZSAiLmV4ZVxcMFwiIjsKLSAgaWYgKHZlbmRvcikgewotICAgIHByaW50ICIgICAgICBWQUxVRSBcIlByaXZhdGVCdWlsZFwiLCBcIiIgdmVuZG9yICJcXDBcIiI7Ci0gIH0KLSAgaWYgKHNwZWNpYWwpIHsKLSAgICBwcmludCAiICAgICAgVkFMVUUgXCJTcGVjaWFsQnVpbGRcIiwgXCIiIHZlbmRvciAiXFwwXCIiOwotICB9Ci0gIHByaW50ICIgICAgICBWQUxVRSBcIlByb2R1Y3ROYW1lXCIsIFwiQXBhY2hlIGh0dHBkIFNlcnZlclxcMFwiIjsKLSAgcHJpbnQgIiAgICAgIFZBTFVFIFwiUHJvZHVjdFZlcnNpb25cIiwgXCIiIHZlciAiXFwwXCIiOwotICBwcmludCAiICAgIEVORCI7Ci0gIHByaW50ICIgIEVORCI7Ci0gIHByaW50ICIgIEJMT0NLIFwiVmFyRmlsZUluZm9cIiI7Ci0gIHByaW50ICIgIEJFR0lOIjsKLSAgcHJpbnQgIiAgICBWQUxVRSBcIlRyYW5zbGF0aW9uXCIsIDAsIDEyMDAiOwotICBwcmludCAiICBFTkQiOwotICBwcmludCAiRU5EIjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idWlsZGNvbmYgYi9idWlsZGNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEyM2M3MTcuLjAwMDAwMDAKLS0tIGEvYnVpbGRjb25mCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIFRPRE8gLSBTdGVhbCB0aGUgbmV3IFBIUCBidWlsZGNvbmYgYW5kIGJ1aWxkLm1rLgotIyBUaGlzIHdpbGwgZG8gZm9yIG5vdywgdGhvdWdoCi0KLXN1cHBsaWVkX2ZsYWc9JDEKLQotIyBkbyBzb21lIHZlcnNpb24gY2hlY2tpbmcgZm9yIHRoZSB0b29scyB3ZSB1c2UKLWlmIHRlc3QgIiQxIiA9ICItLWZvcmNlIjsgdGhlbgotICAgIHNoaWZ0Ci0jIHRoaXMgaXMgYSBwb3NpeCBjb3JyZWN0ICJ0ZXN0IC1udCIKLWVsaWYgdGVzdCAiYGxzIC10IGJ1aWxkY29uZiBidWlsZGNvbmYuc3RhbXAgMj4vZGV2L251bGwgfGhlYWQgLTFgIiAhPSAiYnVpbGRjb25mIjsgdGhlbgotICAgIDoKLWVsc2UKLSAgICBlY2hvICJidWlsZGNvbmY6IGNoZWNraW5nIGluc3RhbGxhdGlvbi4uLiIKLQotICAgICMgYXV0b2NvbmYgd2lsbCBjaGVjayBmb3IgdGhlIHZlcnNpb24gaXRzZWxmCi0gICAgIyBhdXRvbWFrZSAxLjQgb3IgbmV3ZXIKLSAgICBhbV92ZXJzaW9uPWBhdXRvbWFrZSAtLXZlcnNpb24gMj4vZGV2L251bGx8aGVhZCAtMXxzZWQgLWUgJ3MvXlteMC05XSovLycgLWUgJ3MvW2Etel0qICokLy8nYAotICAgIGlmIHRlc3QgIiRhbV92ZXJzaW9uIiA9ICIiOyB0aGVuCi0JZWNobyAiYnVpbGRjb25mOiBhdXRvbWFrZSBub3QgZm91bmQuIgotCWVjaG8gIiAgICAgICAgICAgWW91IG5lZWQgYXV0b21ha2UgdmVyc2lvbiAxLjQgb3IgbmV3ZXIgaW5zdGFsbGVkIgotCWVjaG8gIiAgICAgICAgICAgdG8gYnVpbGQgQVBBQ0hFIGZyb20gQ1ZTLiIKLQlleGl0IDEKLSAgICBmaQotICAgIElGUz0uOyBzZXQgJGFtX3ZlcnNpb247IElGUz0nICcKLSAgICBpZiB0ZXN0ICIkMSIgPSAiMSIgLWEgIiQyIiAtbHQgIjQiIHx8IHRlc3QgIiQxIiAtbHQgIjEiOyB0aGVuCi0JZWNobyAiYnVpbGRjb25mOiBhdXRvbWFrZSB2ZXJzaW9uICRhbV92ZXJzaW9uIGZvdW5kLiIKLQllY2hvICIgICAgICAgICAgIFlvdSBuZWVkIGF1dG9tYWtlIHZlcnNpb24gMS40IG9yIG5ld2VyIGluc3RhbGxlZCIKLQllY2hvICIgICAgICAgICAgIHRvIGJ1aWxkIEFQQUNIRSBmcm9tIENWUy4iCi0JZXhpdCAxCi0gICAgZWxzZQotCWVjaG8gImJ1aWxkY29uZjogYXV0b21ha2UgdmVyc2lvbiAkYW1fdmVyc2lvbiAob2spIgotICAgIGZpCi0KLSAgICAjIGxpYnRvb2wgMS4zLjMgb3IgbmV3ZXIKLSAgICBsdF9wdmVyc2lvbj1gbGlidG9vbCAtLXZlcnNpb24gMj4vZGV2L251bGx8c2VkIC1lICdzL15bXjAtOV0qLy8nIC1lICdzL1stIF0uKi8vJ2AKLSAgICBpZiB0ZXN0ICIkbHRfcHZlcnNpb24iID0gIiI7IHRoZW4KLQllY2hvICJidWlsZGNvbmY6IGxpYnRvb2wgbm90IGZvdW5kLiIKLQllY2hvICIgICAgICAgICAgIFlvdSBuZWVkIGxpYnRvb2wgdmVyc2lvbiAxLjMgb3IgbmV3ZXIgaW5zdGFsbGVkIgotCWVjaG8gIiAgICAgICAgICAgdG8gYnVpbGQgQVBBQ0hFIGZyb20gQ1ZTLiIKLQlleGl0IDEKLSAgICBmaQotICAgIGx0X3ZlcnNpb249YGVjaG8gJGx0X3B2ZXJzaW9ufHNlZCAtZSAncy9cKFthLXpdKlwpJC8uXDEvJ2AKLSAgICBJRlM9Ljsgc2V0ICRsdF92ZXJzaW9uOyBJRlM9JyAnCi0gICAgaWYgdGVzdCAiJDEiIC1ndCAiMSIgfHwgdGVzdCAiJDIiIC1ndCAiMyIgfHwgdGVzdCAiJDIiID0gIjMiIC1hICIkMyIgLWdlICIzIgotICAgIHRoZW4KLQllY2hvICJidWlsZGNvbmY6IGxpYnRvb2wgdmVyc2lvbiAkbHRfcHZlcnNpb24gKG9rKSIKLSAgICBlbHNlCi0JZWNobyAiYnVpbGRjb25mOiBsaWJ0b29sIHZlcnNpb24gJGx0X3B2ZXJzaW9uIGZvdW5kLiIKLQllY2hvICIgICAgICAgICAgIFlvdSBuZWVkIGxpYnRvb2wgdmVyc2lvbiAxLjMuMyBvciBuZXdlciBpbnN0YWxsZWQiCi0JZWNobyAiICAgICAgICAgICB0byBidWlsZCBBUEFDSEUgZnJvbSBDVlMuIgotCWV4aXQgMQotICAgIGZpCi0gICAgdG91Y2ggYnVpbGRjb25mLnN0YW1wCi1maQotCi1hbV9wcmVmaXg9YHdoaWNoIGF1dG9tYWtlIHwgc2VkIC1lICdzIy9bXi9dKi9bXi9dKiQjIydgCi1sdF9wcmVmaXg9YHdoaWNoIGxpYnRvb2wgfCBzZWQgLWUgJ3MjL1teL10qL1teL10qJCMjJ2AKLWlmIHRlc3QgIiRhbV9wcmVmaXgiICE9ICIkbHRfcHJlZml4IjsgdGhlbgotICAgIGVjaG8gImJ1aWxkY29uZjogV0FSTklORzogYXV0b21ha2UgYW5kIGxpYnRvb2wgYXJlIGluc3RhbGxlZCBpbiBkaWZmZXJlbnQiCi0gICAgZWNobyAiICAgICAgICAgICBkaXJlY3Rvcmllcy4gIFRoaXMgbWF5IGNhdXNlIGFjbG9jYWwgdG8gZmFpbC4iCi0gICAgZWNobyAiYnVpbGRjb25mOiBjb250aW51aW5nIGFueXdheSIKLWZpCi0KLWlmIHRlc3QgIiRzdXBwbGllZF9mbGFnIiA9ICItLWNvcHkiOyB0aGVuCi0gICAgYXV0b21ha2VfZmxhZ3M9LS1jb3B5Ci1maQotCi0uL2hlbHBlcnMvYnVpbGQtYWNjb25maWctaGVhZGVyCi0KLW12IGFjbG9jYWwubTQgYWNsb2NhbC5tNC5vbGQgMj4vZGV2L251bGwKLWFjbG9jYWwKLWlmIHRlc3QgIiQ/IiAhPSAiMCIgLWEgIiRhbV9wcmVmaXgiICE9ICIkbHRfcHJlZml4IjsgdGhlbgotICAgIGVjaG8gImJ1aWxkY29uZjogRVJST1I6IGFjbG9jYWwgZmFpbGVkLCBwcm9iYWJseSBiZWNhdXNlIGF1dG9tYWtlIGFuZCIKLSAgICBlY2hvICIgICAgICAgICAgIGxpYnRvb2wgYXJlIGluc3RhbGxlZCB3aXRoIGRpZmZlcmVudCBwcmVmaXhlczsiCi0gICAgZWNobyAiICAgICAgICAgICBhdXRvbWFrZSBpcyBpbnN0YWxsZWQgaW4gJGFtX3ByZWZpeCwgYnV0IGxpYnRvb2wgaW4gJGx0X3ByZWZpeC4iCi0gICAgZWNobyAiICAgICAgICAgICBQbGVhc2UgcmUtaW5zdGFsbCBhdXRvbWFrZSBhbmQvb3IgbGlidG9vbCB3aXRoIGEgY29tbW9uIHByZWZpeCIKLSAgICBlY2hvICIgICAgICAgICAgIGFuZCB0cnkgYWdhaW4uIgotICAgIGV4aXQgMQotZmkKLQotaWYgY21wIGFjbG9jYWwubTQub2xkIGFjbG9jYWwubTQgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgIGVjaG8gImJ1aWxkY29uZjoga2VlcGluZyBhY2xvY2FsLm00IgotICAgIG12IGFjbG9jYWwubTQub2xkIGFjbG9jYWwubTQKLWVsc2UKLSAgICBlY2hvICJidWlsZGNvbmY6IGNyZWF0ZWQgb3IgbW9kaWZpZWQgYWNsb2NhbC5tNCIKLWZpCi0KLWF1dG9oZWFkZXIKLQotIyBmaW5kIGFsbCBNYWtlZmlsZS5hbXMKLWZpbGVzPSJNYWtlZmlsZSBgZmluZCBhcCBsaWIgbWFpbiBtb2R1bGVzIHJlZ2V4IG9zIC1uYW1lIE1ha2VmaWxlLmFtIHwgc2VkICdzI1wuYW0jIycgfCB0ciAnXG4nICcgJ2AiCi0KLSMgc3VwcHJlc3Mgc3R1cGlkIGF1dG9tYWtlIHdhcm5pbmcKLWF1dG9tYWtlIC0tYWRkLW1pc3NpbmcgLS1pbmNsdWRlLWRlcHMgJGF1dG9tYWtlX2ZsYWdzICRmaWxlcyAyPiYxIHwgZ3JlcCAtdiBcJEFQQUNIRV9PVVRQVVRfRklMRVMgPiYyCi0KLQotbXYgY29uZmlndXJlIGNvbmZpZ3VyZS5vbGQgMj4vZGV2L251bGwKLWF1dG9jb25mCi1pZiBjbXAgY29uZmlndXJlLm9sZCBjb25maWd1cmUgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgIGVjaG8gImJ1aWxkY29uZjoga2VlcGluZyBjb25maWd1cmUiCi0gICAgbXYgY29uZmlndXJlLm9sZCBjb25maWd1cmUKLWVsc2UKLSAgICBlY2hvICJidWlsZGNvbmY6IGNyZWF0ZWQgb3IgbW9kaWZpZWQgY29uZmlndXJlIgotZmkKLQpkaWZmIC0tZ2l0IGEvY29uZmlnLmxheW91dCBiL2NvbmZpZy5sYXlvdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3OTc0MWUuLjAwMDAwMDAKLS0tIGEvY29uZmlnLmxheW91dAorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0jIwotIyMgIGNvbmZpZy5sYXlvdXQgLS0gQVBBQ0kgUHJlLWRlZmluZWQgSW5zdGFsbGF0aW9uIFBhdGggTGF5b3V0cwotIyMKLSMjICBIaW50czoKLSMjICAtIGxheW91dHMgY2FuIGJlIGxvYWRlZCB3aXRoIEFQQUNJJ3MgLS13aXRoLWxheW91dD1JRCBvcHRpb24KLSMjICAtIHdoZW4gbm8gLS13aXRoLWxheW91dCBvcHRpb24gaXMgZ2l2ZW4sIHRoZSBkZWZhdWx0IGxheW91dCBpcyBgQXBhY2hlJwotIyMgIC0gYSB0cmFpbGluZyBwbHVzIGNoYXJhY3RlciAoYCsnKSBvbiBwYXRocyBpcyByZXBsYWNlZCB3aXRoIGEgCi0jIyAgICBgLzx0YXJnZXQ+JyBzdWZmaXggd2hlcmUgPHRhcmdldD4gaXMgdGhlIHRoZSBhcmd1bWVudCBmcm9tIAotIyMgICAgb3B0aW9uIC0tdGFyZ2V0IChkZWZhdWx0cyB0byBgaHR0cGQnKS4KLSMjCi0KLSMgICBDbGFzc2ljYWwgQXBhY2hlIHBhdGggbGF5b3V0LgotPExheW91dCBBcGFjaGU+Ci0gICAgcHJlZml4OiAgICAgICAgL3Vzci9sb2NhbC9hcGFjaGUKLSAgICBleGVjX3ByZWZpeDogICAkcHJlZml4Ci0gICAgYmluZGlyOiAgICAgICAgJGV4ZWNfcHJlZml4L2JpbgotICAgIHNiaW5kaXI6ICAgICAgICRleGVjX3ByZWZpeC9iaW4KLSAgICBsaWJleGVjZGlyOiAgICAkZXhlY19wcmVmaXgvbGliZXhlYwotICAgIG1hbmRpcjogICAgICAgICRwcmVmaXgvbWFuCi0gICAgc3lzY29uZmRpcjogICAgJHByZWZpeC9jb25mCi0gICAgZGF0YWRpcjogICAgICAgJHByZWZpeAotICAgIGljb25zZGlyOiAgICAgICRkYXRhZGlyL2ljb25zCi0gICAgaHRkb2NzZGlyOiAgICAgJGRhdGFkaXIvaHRkb2NzCi0gICAgY2dpZGlyOiAgICAgICAgJGRhdGFkaXIvY2dpLWJpbgotICAgIGluY2x1ZGVkaXI6ICAgICRwcmVmaXgvaW5jbHVkZQotICAgIGxvY2Fsc3RhdGVkaXI6ICRwcmVmaXgKLSAgICBydW50aW1lZGlyOiAgICAkbG9jYWxzdGF0ZWRpci9sb2dzCi0gICAgbG9nZmlsZWRpcjogICAgJGxvY2Fsc3RhdGVkaXIvbG9ncwotICAgIHByb3h5Y2FjaGVkaXI6ICRsb2NhbHN0YXRlZGlyL3Byb3h5Ci08L0xheW91dD4KLQotIyAgIEdOVSBzdGFuZGFyZHMgY29uZm9ybWluZyBwYXRoIGxheW91dC4KLSMgICBTZWUgRlNGJ3MgR05VIHByb2plY3QgYG1ha2Utc3RkcycgZG9jdW1lbnQgZm9yIGRldGFpbHMuCi08TGF5b3V0IEdOVT4KLSAgICBwcmVmaXg6ICAgICAgICAvdXNyL2xvY2FsCi0gICAgZXhlY19wcmVmaXg6ICAgJHByZWZpeAotICAgIGJpbmRpcjogICAgICAgICRleGVjX3ByZWZpeC9iaW4KLSAgICBzYmluZGlyOiAgICAgICAkZXhlY19wcmVmaXgvc2JpbgotICAgIGxpYmV4ZWNkaXI6ICAgICRleGVjX3ByZWZpeC9saWJleGVjCi0gICAgbWFuZGlyOiAgICAgICAgJHByZWZpeC9tYW4KLSAgICBzeXNjb25mZGlyOiAgICAkcHJlZml4L2V0YysKLSAgICBkYXRhZGlyOiAgICAgICAkcHJlZml4L3NoYXJlKwotICAgIGljb25zZGlyOiAgICAgICRkYXRhZGlyL2ljb25zCi0gICAgaHRkb2NzZGlyOiAgICAgJGRhdGFkaXIvaHRkb2NzCi0gICAgY2dpZGlyOiAgICAgICAgJGRhdGFkaXIvY2dpLWJpbgotICAgIGluY2x1ZGVkaXI6ICAgICRwcmVmaXgvaW5jbHVkZSsKLSAgICBsb2NhbHN0YXRlZGlyOiAkcHJlZml4L3ZhcisKLSAgICBydW50aW1lZGlyOiAgICAkbG9jYWxzdGF0ZWRpci9ydW4KLSAgICBsb2dmaWxlZGlyOiAgICAkbG9jYWxzdGF0ZWRpci9sb2cKLSAgICBwcm94eWNhY2hlZGlyOiAkbG9jYWxzdGF0ZWRpci9wcm94eQotPC9MYXlvdXQ+Ci0KLSMgICBBcGFjaGUgYmluYXJ5IGRpc3RyaWJ1dGlvbiBwYXRoIGxheW91dAotPExheW91dCBCaW5hcnlEaXN0cmlidXRpb24+Ci0gICAgcHJlZml4OiAgICAgICAgL3Vzci9sb2NhbC9hcGFjaGUKLSAgICBleGVjX3ByZWZpeDoKLSAgICBiaW5kaXI6ICAgICAgICBiaW4KLSAgICBzYmluZGlyOiAgICAgICBiaW4KLSAgICBsaWJleGVjZGlyOiAgICBsaWJleGVjCi0gICAgbWFuZGlyOiAgICAgICAgbWFuCi0gICAgc3lzY29uZmRpcjogICAgY29uZgotICAgIGRhdGFkaXI6Ci0gICAgaWNvbnNkaXI6ICAgICAgaWNvbnMKLSAgICBodGRvY3NkaXI6ICAgICBodGRvY3MKLSAgICBjZ2lkaXI6ICAgICAgICBjZ2ktYmluCi0gICAgaW5jbHVkZWRpcjogICAgaW5jbHVkZQotICAgIGxvY2Fsc3RhdGVkaXI6Ci0gICAgcnVudGltZWRpcjogICAgbG9ncwotICAgIGxvZ2ZpbGVkaXI6ICAgIGxvZ3MKLSAgICBwcm94eWNhY2hlZGlyOiBwcm94eQotPC9MYXlvdXQ+Ci0KLSMgICBNYWMgT1MgWCBTZXJ2ZXIgKFJoYXBzb2R5KQotPExheW91dCBNYWMgT1MgWCBTZXJ2ZXI+Ci0gICAgcHJlZml4OiAgICAgICAgL0xvY2FsL0xpYnJhcnkvV2ViU2VydmVyCi0gICAgZXhlY19wcmVmaXg6ICAgL3VzcgotICAgIGJpbmRpcjogICAgICAgICRleGVjX3ByZWZpeC9iaW4KLSAgICBzYmluZGlyOiAgICAgICAkZXhlY19wcmVmaXgvc2JpbgotICAgIGxpYmV4ZWNkaXI6ICAgIC9TeXN0ZW0vTGlicmFyeS9BcGFjaGUvTW9kdWxlcwotICAgIG1hbmRpcjogICAgICAgICRleGVjX3ByZWZpeC9zaGFyZS9tYW4KLSAgICBzeXNjb25mZGlyOiAgICAkcHJlZml4L0NvbmZpZ3VyYXRpb24KLSAgICBkYXRhZGlyOiAgICAgICAkcHJlZml4Ci0gICAgaWNvbnNkaXI6ICAgICAgL1N5c3RlbS9MaWJyYXJ5L0FwYWNoZS9JY29ucwotICAgIGh0ZG9jc2RpcjogICAgICRkYXRhZGlyL0RvY3VtZW50cwotICAgIGNnaWRpcjogICAgICAgICRkYXRhZGlyL0NHSS1FeGVjdXRhYmxlcwotICAgIGluY2x1ZGVkaXI6ICAgIC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0FwYWNoZS5mcmFtZXdvcmsvVmVyc2lvbnMvMS4zL0hlYWRlcnMKLSAgICBsb2NhbHN0YXRlZGlyOiAvdmFyCi0gICAgcnVudGltZWRpcjogICAgJHByZWZpeC9Mb2dzCi0gICAgbG9nZmlsZWRpcjogICAgJHByZWZpeC9Mb2dzCi0gICAgcHJveHljYWNoZWRpcjogJHByZWZpeC9Qcm94eUNhY2hlCi08L0xheW91dD4KLQotIyAgIERhcndpbi9NYWMgT1MgTGF5b3V0Ci08TGF5b3V0IERhcndpbj4KLSAgICBwcmVmaXg6ICAgICAgICAvdXNyCi0gICAgZXhlY19wcmVmaXg6ICAgJHByZWZpeAotICAgIGJpbmRpcjogICAgICAgICRleGVjX3ByZWZpeC9iaW4KLSAgICBzYmluZGlyOiAgICAgICAkZXhlY19wcmVmaXgvc2JpbgotICAgIGxpYmV4ZWNkaXI6ICAgICRleGVjX3ByZWZpeC9saWJleGVjKwotICAgIG1hbmRpcjogICAgICAgICRwcmVmaXgvc2hhcmUvbWFuCi0gICAgZGF0YWRpcjogICAgICAgL0xpYnJhcnkvV2ViU2VydmVyCi0gICAgc3lzY29uZmRpcjogICAgL2V0YysKLSAgICBpY29uc2RpcjogICAgICAkcHJlZml4L3NoYXJlL2h0dHBkL2ljb25zCi0gICAgaHRkb2NzZGlyOiAgICAgJGRhdGFkaXIvRG9jdW1lbnRzCi0gICAgY2dpZGlyOiAgICAgICAgJGRhdGFkaXIvQ0dJLUV4ZWN1dGFibGVzCi0gICAgaW5jbHVkZWRpcjogICAgJHByZWZpeC9pbmNsdWRlKwotICAgIGxvY2Fsc3RhdGVkaXI6IC92YXIKLSAgICBydW50aW1lZGlyOiAgICAkbG9jYWxzdGF0ZWRpci9ydW4KLSAgICBsb2dmaWxlZGlyOiAgICAkbG9jYWxzdGF0ZWRpci9sb2crCi0gICAgcHJveHljYWNoZWRpcjogJHJ1bnRpbWVkaXIvcHJveHkKLTwvTGF5b3V0PgotCi0jICAgUmVkSGF0IDUueCBsYXlvdXQKLTxMYXlvdXQgUmVkSGF0PgotICAgIHByZWZpeDogICAgICAgIC91c3IKLSAgICBleGVjX3ByZWZpeDogICAkcHJlZml4Ci0gICAgYmluZGlyOiAgICAgICAgJHByZWZpeC9iaW4KLSAgICBzYmluZGlyOiAgICAgICAkcHJlZml4L3NiaW4KLSAgICBsaWJleGVjZGlyOiAgICAkcHJlZml4L2xpYi9hcGFjaGUKLSAgICBtYW5kaXI6ICAgICAgICAkcHJlZml4L21hbgotICAgIHN5c2NvbmZkaXI6ICAgIC9ldGMvaHR0cGQvY29uZgotICAgIGRhdGFkaXI6ICAgICAgIC9ob21lL2h0dHBkCi0gICAgaWNvbnNkaXI6ICAgICAgJGRhdGFkaXIvaWNvbnMKLSAgICBodGRvY3NkaXI6ICAgICAkZGF0YWRpci9odG1sCi0gICAgY2dpZGlyOiAgICAgICAgJGRhdGFkaXIvY2dpLWJpbgotICAgIGluY2x1ZGVkaXI6ICAgICRwcmVmaXgvaW5jbHVkZS9hcGFjaGUKLSAgICBsb2NhbHN0YXRlZGlyOiAvdmFyCi0gICAgcnVudGltZWRpcjogICAgJGxvY2Fsc3RhdGVkaXIvcnVuCi0gICAgbG9nZmlsZWRpcjogICAgJGxvY2Fsc3RhdGVkaXIvbG9nL2h0dHBkCi0gICAgcHJveHljYWNoZWRpcjogJGxvY2Fsc3RhdGVkaXIvY2FjaGUvaHR0cGQKLTwvTGF5b3V0PiAgICAgCi0KLSMgICBBY2NvcmRpbmcgdG8gdGhlIC9vcHQgZmlsZXN5c3RlbSBjb252ZW50aW9ucwotPExheW91dCBvcHQ+Ci0gICAgcHJlZml4OiAgICAgICAgL29wdC9hcGFjaGUKLSAgICBleGVjX3ByZWZpeDogICAkcHJlZml4Ci0gICAgYmluZGlyOiAgICAgICAgJGV4ZWNfcHJlZml4L2JpbgotICAgIHNiaW5kaXI6ICAgICAgICRleGVjX3ByZWZpeC9zYmluCi0gICAgbGliZXhlY2RpcjogICAgJGV4ZWNfcHJlZml4L2xpYmV4ZWMKLSAgICBtYW5kaXI6ICAgICAgICAkcHJlZml4L21hbgotICAgIHN5c2NvbmZkaXI6ICAgIC9ldGMkcHJlZml4Ci0gICAgZGF0YWRpcjogICAgICAgJHByZWZpeC9zaGFyZQotICAgIGljb25zZGlyOiAgICAgICRkYXRhZGlyL2ljb25zCi0gICAgaHRkb2NzZGlyOiAgICAgJGRhdGFkaXIvaHRkb2NzCi0gICAgY2dpZGlyOiAgICAgICAgJGRhdGFkaXIvY2dpLWJpbgotICAgIGluY2x1ZGVkaXI6ICAgICRwcmVmaXgvaW5jbHVkZQotICAgIGxvY2Fsc3RhdGVkaXI6IC92YXIkcHJlZml4Ci0gICAgcnVudGltZWRpcjogICAgJGxvY2Fsc3RhdGVkaXIvcnVuCi0gICAgbG9nZmlsZWRpcjogICAgJGxvY2Fsc3RhdGVkaXIvbG9ncwotICAgIHByb3h5Y2FjaGVkaXI6ICRsb2NhbHN0YXRlZGlyL3Byb3h5Ci08L0xheW91dD4KLQotIyAgQmVPUyBsYXlvdXQuLi4KLTxMYXlvdXQgYmVvcz4KLSAgICBwcmVmaXg6ICAgICAgICAvYm9vdC9ob21lL2FwYWNoZQotICAgIGV4ZWNfcHJlZml4OiAgICRwcmVmaXgKLSAgICBiaW5kaXI6ICAgICAgICAkZXhlY19wcmVmaXgvYmluCi0gICAgc2JpbmRpcjogICAgICAgJGV4ZWNfcHJlZml4L2JpbgotICAgIGxpYmV4ZWNkaXI6ICAgICRleGVjX3ByZWZpeC9saWJleGVjCi0gICAgbWFuZGlyOiAgICAgICAgJHByZWZpeC9tYW4KLSAgICBzeXNjb25mZGlyOiAgICAkcHJlZml4L2NvbmYKLSAgICBkYXRhZGlyOiAgICAgICAkcHJlZml4Ci0gICAgaWNvbnNkaXI6ICAgICAgJGRhdGFkaXIvaWNvbnMKLSAgICBodGRvY3NkaXI6ICAgICAkZGF0YWRpci9odGRvY3MKLSAgICBjZ2lkaXI6ICAgICAgICAkZGF0YWRpci9jZ2ktYmluCi0gICAgaW5jbHVkZWRpcjogICAgJHByZWZpeC9pbmNsdWRlCi0gICAgbG9jYWxzdGF0ZWRpcjogJHByZWZpeAotICAgIHJ1bnRpbWVkaXI6ICAgICRsb2NhbHN0YXRlZGlyL2xvZ3MKLSAgICBsb2dmaWxlZGlyOiAgICAkbG9jYWxzdGF0ZWRpci9sb2dzCi0gICAgcHJveHljYWNoZWRpcjogJGxvY2Fsc3RhdGVkaXIvcHJveHkKLTwvTGF5b3V0PgotCi0jICAgU3VTRSA2LnggbGF5b3V0Ci08TGF5b3V0IFN1U0U+Ci0gICAgcHJlZml4OiAgICAgICAgL3VzcgotICAgIGV4ZWNfcHJlZml4OiAgICRwcmVmaXgKLSAgICBiaW5kaXI6ICAgICAgICAkcHJlZml4L2JpbgotICAgIHNiaW5kaXI6ICAgICAgICRwcmVmaXgvc2JpbgotICAgIGxpYmV4ZWNkaXI6ICAgICRwcmVmaXgvbGliL2FwYWNoZQotICAgIG1hbmRpcjogICAgICAgICRwcmVmaXgvbWFuCi0gICAgc3lzY29uZmRpcjogICAgL2V0Yy9odHRwZAotICAgIGRhdGFkaXI6ICAgICAgIC91c3IvbG9jYWwvaHR0cGQKLSAgICBpY29uc2RpcjogICAgICAkZGF0YWRpci9pY29ucwotICAgIGh0ZG9jc2RpcjogICAgICRkYXRhZGlyL2h0ZG9jcwotICAgIGNnaWRpcjogICAgICAgICRkYXRhZGlyL2NnaS1iaW4KLSAgICBpbmNsdWRlZGlyOiAgICAkcHJlZml4L2luY2x1ZGUvYXBhY2hlCi0gICAgbG9jYWxzdGF0ZWRpcjogL3ZhcgotICAgIHJ1bnRpbWVkaXI6ICAgICRsb2NhbHN0YXRlZGlyL3J1bgotICAgIGxvZ2ZpbGVkaXI6ICAgICRsb2NhbHN0YXRlZGlyL2xvZy9odHRwZAotICAgIHByb3h5Y2FjaGVkaXI6ICRsb2NhbHN0YXRlZGlyL2NhY2hlL2h0dHBkCi08L0xheW91dD4KLQotIyAgIEJTRC9PUyBsYXlvdXQKLTxMYXlvdXQgQlNEST4KLSAgICBwcmVmaXg6ICAgICAgICAvdmFyL3d3dwotICAgIGV4ZWNfcHJlZml4OiAgIC91c3IvY29udHJpYgotICAgIGJpbmRpcjogICAgICAgICRleGVjX3ByZWZpeC9iaW4KLSAgICBzYmluZGlyOiAgICAgICAkZXhlY19wcmVmaXgvYmluCi0gICAgbGliZXhlY2RpcjogICAgJGV4ZWNfcHJlZml4L2xpYmV4ZWMvYXBhY2hlCi0gICAgbWFuZGlyOiAgICAgICAgJGV4ZWNfcHJlZml4L21hbgotICAgIHN5c2NvbmZkaXI6ICAgICRwcmVmaXgvY29uZgotICAgIGRhdGFkaXI6ICAgICAgICRwcmVmaXgKLSAgICBpY29uc2RpcjogICAgICAkZGF0YWRpci9pY29ucwotICAgIGh0ZG9jc2RpcjogICAgICRkYXRhZGlyL2h0ZG9jcwotICAgIGNnaWRpcjogICAgICAgICRkYXRhZGlyL2NnaS1iaW4KLSAgICBpbmNsdWRlZGlyOiAgICAkZXhlY19wcmVmaXgvaW5jbHVkZS9hcGFjaGUKLSAgICBsb2NhbHN0YXRlZGlyOiAvdmFyCi0gICAgcnVudGltZWRpcjogICAgJGxvY2Fsc3RhdGVkaXIvcnVuCi0gICAgbG9nZmlsZWRpcjogICAgJGxvY2Fsc3RhdGVkaXIvbG9nL2h0dHBkCi0gICAgcHJveHljYWNoZWRpcjogJGxvY2Fsc3RhdGVkaXIvcHJveHkKLTwvTGF5b3V0PgotCi0jICAgU29sYXJpcyA4IExheW91dAotPExheW91dCBTb2xhcmlzPgotICAgIHByZWZpeDogICAgICAgIC91c3IvYXBhY2hlCi0gICAgZXhlY19wcmVmaXg6ICAgJHByZWZpeAotICAgIGJpbmRpcjogICAgICAgICRleGVjX3ByZWZpeC9iaW4KLSAgICBzYmluZGlyOiAgICAgICAkZXhlY19wcmVmaXgvYmluCi0gICAgbGliZXhlY2RpcjogICAgJGV4ZWNfcHJlZml4L2xpYmV4ZWMKLSAgICBtYW5kaXI6ICAgICAgICAkZXhlY19wcmVmaXgvbWFuCi0gICAgc3lzY29uZmRpcjogICAgL2V0Yy9hcGFjaGUKLSAgICBkYXRhZGlyOiAgICAgICAvdmFyL2FwYWNoZQotICAgIGljb25zZGlyOiAgICAgICRkYXRhZGlyL2ljb25zCi0gICAgaHRkb2NzZGlyOiAgICAgJGRhdGFkaXIvaHRkb2NzCi0gICAgY2dpZGlyOiAgICAgICAgJGRhdGFkaXIvY2dpLWJpbgotICAgIGluY2x1ZGVkaXI6ICAgICRleGVjX3ByZWZpeC9pbmNsdWRlCi0gICAgbG9jYWxzdGF0ZWRpcjogJHByZWZpeAotICAgIHJ1bnRpbWVkaXI6ICAgIC92YXIvcnVuCi0gICAgbG9nZmlsZWRpcjogICAgJGRhdGFkaXIvbG9ncwotICAgIHByb3h5Y2FjaGVkaXI6ICRkYXRhZGlyL3Byb3h5Ci08L0xheW91dD4KLQotIyAgIE9wZW5CU0QgTGF5b3V0Ci08TGF5b3V0IE9wZW5CU0Q+Ci0gICAgcHJlZml4OiAgICAgICAgL3Zhci93d3cKLSAgICBleGVjX3ByZWZpeDogICAvdXNyCi0gICAgYmluZGlyOiAgICAgICAgJGV4ZWNfcHJlZml4L2JpbgotICAgIHNiaW5kaXI6ICAgICAgICRleGVjX3ByZWZpeC9zYmluCi0gICAgbGliZXhlY2RpcjogICAgJGV4ZWNfcHJlZml4L2xpYi9hcGFjaGUvbW9kdWxlcwotICAgIG1hbmRpcjogICAgICAgICRleGVjX3ByZWZpeC9zaGFyZS9tYW4KLSAgICBzeXNjb25mZGlyOiAgICAkcHJlZml4L2NvbmYKLSAgICBkYXRhZGlyOiAgICAgICAkcHJlZml4Ci0gICAgaWNvbnNkaXI6ICAgICAgJHByZWZpeC9pY29ucwotICAgIGh0ZG9jc2RpcjogICAgICRwcmVmaXgvaHRkb2NzCi0gICAgY2dpZGlyOiAgICAgICAgJHByZWZpeC9jZ2ktYmluCi0gICAgaW5jbHVkZWRpcjogICAgJGV4ZWNfcHJlZml4L2xpYi9hcGFjaGUvaW5jbHVkZQotICAgIGxvY2Fsc3RhdGVkaXI6ICRwcmVmaXgKLSAgICBydW50aW1lZGlyOiAgICAkcHJlZml4L2xvZ3MKLSAgICBsb2dmaWxlZGlyOiAgICAkcHJlZml4L2xvZ3MKLSAgICBwcm94eWNhY2hlZGlyOiAkcHJlZml4L3Byb3h5Ci08L0xheW91dD4KZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5pbiBiL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUyMzI4YS4uMDAwMDAwMAotLS0gYS9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi1kbmwgIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdAotCi1BQ19QUkVSRVEoMi4xMykKLUFDX0lOSVQobWFpbi9odHRwX21haW4uYykKLUFNX0lOSVRfQVVUT01BS0UoYXBhY2hlLCAyLjAtZGV2KQotCi1kbmwgVGhpcyB3b3VsZCBiZSBpbiBzcmMvaW5jbHVkZSwgYnV0IEkgdGhpbmsgSSd2ZSBmb3VuZCBhbiBhdXRvaGVhZGVyIGJ1ZwotQU1fQ09ORklHX0hFQURFUihhcF9jb25maWdfYXV0by5oKQotCi1kbmwgIyMgVGhpcyBpcyB0aGUgY2VudHJhbCBwbGFjZSB3aGVyZSBBcGFjaGUncyB2ZXJzaW9uIHNob3VsZCBiZSBrZXB0LgotCi1BUEFDSEVfVkVSU0lPTj0kVkVSU0lPTgotQUNfU1VCU1QoQVBBQ0hFX1ZFUlNJT04pCi0KLWRubCBYWFggLSBkb2Vzbid0IGFjdHVhbGx5IHdvcmssIGJlY2F1c2Ugb2YgdGhlIEFQQUNIRV9PVVRQVVRfRklMRVMgZXJyb3IKLUFNX01BSU5UQUlORVJfTU9ERQotCi1kbmwgV2Ugd2FudCB0aGlzIG9uZSBiZWZvcmUgdGhlIGNoZWNrcywgc28gdGhlIGNoZWNrcyBjYW4gbW9kaWZ5IENGTEFHUwotdGVzdCAteiAiJENGTEFHUyIgJiYgYXV0b19jZmxhZ3M9MQotCi1kbmwgTmVlZGVkIGZvciBBUEFDSEVfTU9EVUxFKCkgdG8gd29yawotY3dkPWBwd2RgCi0KLWRubCAjIyBDaGVjayBmb3IgcHJvZ3JhbXMKLQotZG5sIEFDX1BST0dfQVdLCi1BQ19QUk9HX0NDCi1BQ19QUk9HX0NQUAotQUNfUFJPR19JTlNUQUxMCi1kbmwgQUNfUFJPR19SQU5MSUIKLWRubCBBQ19QQVRIX1BST0coUEVSTF9QQVRILCBwZXJsKQotCi1kbmwgaW5mbyBhdXRvY29uZiBzYXlzIEFJWCBuZWVkcyB0aGlzLiBPa2F5LgotQUNfQUlYCi0KLWRubCAjIyBDaGVjayBmb3IgbGlicmFyaWVzCi0KLWRubCAjIyBDaGVjayBmb3IgaGVhZGVyIGZpbGVzCi0KLWRubCBJIHRoaW5rIHRoZXNlIGFyZSBqdXN0IHVzZWQgYWxsIG92ZXIgdGhlIHBsYWNlLCBzbyBqdXN0IGNoZWNrIGZvcgotZG5sIHRoZW0gYXQgdGhlIGJhc2Ugb2YgdGhlIHRyZWUuIElmIHNvbWUgYXJlIHNwZWNpZmljIHRvIGEgc2luZ2xlCi1kbmwgZGlyZWN0b3J5LCB0aGV5IHNob3VsZCBiZSBtb3ZlZCAoQ29tbWVudCAjU3Bvb24pCi0KLUFDX0NIRUNLX0hFQURFUlMoIFwKLXVuaXN0ZC5oIFwKLXN5cy90aW1lcy5oIFwKLXN5cy90aW1lLmggXAotKQotCi1kbmwgIyMgQ2hlY2sgZm9yIHR5cGVkZWZzLCBzdHJ1Y3R1cmVzLCBhbmQgY29tcGlsZXIgY2hhcmFjdGVyaXN0aWNzLgotCi1BQ19DX0lOTElORQotCi1kbmwgIyMgQ2hlY2sgZm9yIGxpYnJhcnkgZnVuY3Rpb25zCi0KLWRubCBTZWUgQ29tbWVudCAjU3Bvb24KLQotQUNfQ0hFQ0tfRlVOQ1MoIFwKLXN0cmR1cCBcCi1zdHJjYXNlY21wIFwKLXN0cm5jYXNlY21wIFwKLXN0cnN0ciBcCi1zdHJlcnJvciBcCi1pbml0Z3JvdXBzIFwKLXdhaXRwaWQgXAotZGlmZnRpbWUgXAotZ2V0dGltZW9mZGF5IFwKLW1lbW1vdmUgXAotKQotCi1BTV9QUk9HX0xJQlRPT0wKLQotZG5sICMjIENoZWNraW5nIGNvbW1hbmQtbGluZSBvcHRpb25zCi10ZXN0IC1uICIkR0NDIiAmJiB0ZXN0ICIkVVNFX01BSU5UQUlORVJfTU9ERSIgPSAieWVzIiAmJiBcCi0gICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1nIC1XYWxsIC1XbWlzc2luZy1wcm90b3R5cGVzIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyIKLQotSU5DTFVERVM9Ii1JXCQodG9wX3NyY2RpcikvaW5jbHVkZSAtSVwkKHRvcF9zcmNkaXIpL2xpYi9hcHIvaW5jbHVkZSIKLUFDX1NVQlNUKElOQ0xVREVTKQotCi1kbmwgcmVhZGluZyBjb25maWcgc3R1YnMKLWVzeXNjbWQoLi9oZWxwZXJzL2NvbmZpZy1zdHVicyAuKQotCi1JTkNMVURFUz0iJElOQ0xVREVTIC1JXCQodG9wX3NyY2RpcikvXCQoT1NfRElSKSIKLUFDX1NVQlNUKEVYVFJBX0xJQlMpCi1BQ19TVUJTVChSRUdFWF9ESVIpCi1BQ19TVUJTVChSRUdFWF9MSUIpCi1BQ19TVUJTVChNUE1fTElCKQotQUNfU1VCU1QoT1MpCi1BQ19TVUJTVChPU19ESVIpCi0KLUFDX09VVFBVVChbTWFrZWZpbGUgYXAvTWFrZWZpbGUgbWFpbi9NYWtlZmlsZSBsaWIvYXByL01ha2VmaWxlIG9zL01ha2VmaWxlCi0gICAgICAgICAgJEFQQUNIRV9PVVRQVVRfRklMRVNdKQpkaWZmIC0tZ2l0IGEvZG9jcy9TVEFUVVMgYi9kb2NzL1NUQVRVUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDliMjZjMi4uMDAwMDAwMAotLS0gYS9kb2NzL1NUQVRVUworKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLUFwYWNoZSBIVFRQIFNlcnZlciAyLjAgRG9jdW1lbnRhdGlvbiBTdGF0dXMgRmlsZS4KLQotSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIGhlbHBpbmcgYWNjb21wbGlzaCBzb21lIG9mIHRoZSB0YXNrcyBvbiB0aGlzCi1saXN0IG9yIG90aGVyd2lzZSBpbXByb3ZpbmcgdGhlIGRvY3VtZW50YXRpb24sIHBsZWFzZSBqb2luIHRoZQotYXBhY2hlLWRvY3MgbWFpbGluZyBsaXN0IGJ5IG1haWxpbmcgdG8gCi1hcGFjaGUtZG9jcy1zdWJzY3JpYmVAYXBhY2hlLm9yZwotCi0tIG1hbiBwYWdlcwotICAgIC0gU29tZSBvZiB0aGUgbWFuIHBhZ2VzIG5lZWQgdG8gYmUgdXBkYXRlZCBmb3IgMi4wLiAgQXQgbGVhc3QKLSAgICAgIHRoZSBodHRwZCBtYW4gcGFnZSBhcHBlYXJzIHRvIGJlIG91dGRhdGVkLCBhbmQgcGVyaGFwcyBvdGhlci4KLSAgICAgIEFmdGVyIHRoaXMgaXMgZG9uZSwgdGhlIG1hbnVhbC9wcm9ncmFtcy8gdmVyc2lvbnMgY2FuIGJlCi0gICAgICByZWdlbmVyYXRlZC4KLQotLSBYSFRNTCBjb252ZXJzaW9uCi0gICAgICAgIFN0YXR1czogSmFtZXMgQSBTdXRoZXJsYW5kIDxqYXM4OEBjYW0uYWMudWs+IHdhcyBnb2luZwotICAgICAgICAgICAgICAgIHRvIHNwZWFyaGVhZCB0aGlzLCBidXQgd2UgaGF2ZW4ndCBoZWFyZCBhbnl0aGluZwotICAgICAgICAgICAgICAgIGxhdGVseS4gIFNvbWUgd29yayBpcyBzdGlsbCBuZWVkZWQKLSAgICAgICAgICAgICAgICB0byBkZXRlcm1pbmUgd2hhdCB0aGUgU1NJcyBzaG91bGQgbG9vayBsaWtlLgotCi0tIE1QTSBkb2N1bWVudGF0aW9uCi0gICAtIEVhY2ggTVBNIG5lZWRzIHRvIGhhdmUgYSBkb2N1bWVudGF0aW9uIGZpbGUgaW4gbWFudWFsL21vZC8KLSAgICAgd2hpY2ggbGlzdHMgdGhlIGRpcmVjdGl2ZXMgaXQgcHJvdmlkZXMsIGFuZCBzb21lIGRldGFpbHMKLSAgICAgYWJvdXQgaXRzIG9wZXJhdGlvbi4KLSAgICAgICAgU3RhdHVzOiBJbml0aWFsIG91dGxpbmVzIGRvbmUuICBNdWNoIG1vcmUgZGV0YWlscyBuZWVkIHRvIGJlCi0gICAgICAgICAgZmlsbGVkIGluLgotICAgICAgICAgIC0gTm9uIHVuaXgvd2luZG93cyBNUE1zIHN0aWxsIG5lZWQgdG8gYmUgY29tcGxldGVkLgotICAgICAgICAgIC0gcGVyY2hpbGQgTVBNIG5lZWRzIHNvbWUgZG9jcy4KLQotLSBNZXJnaW5nIG9mIGNoYW5nZXMgaW4gMS4zLgotICAgLSBUaGVyZSBoYXZlIGJlZW4gbWFueSBjaGFuZ2VzIGluIHRoZSAxLjMgZG9jcyB3aGljaCBoYXZlbid0Ci0gICAgIGJlZW4gcHJvcGFnYXRlZCBpbnRvIDIuMC4KLSAgICAgVGhpbmdzIHdoaWNoIG5lZWQgdG8gYmUgbWVyZ2VkOiA/Pz8KLQotLSBDbGVhbmluZy4KLSAgIC0gV2UgY291bGQgdXNlIGEgbGlzdCBvZiBhbGwgdGhlIGRvY3MgdGhhdCBjYW4gYmUgYXhlZCBvdXQgb2YgMi4wCi0gICAgIGJlY2F1c2UgdGhleSBhcmUgcmVkdW5kYW50IG9yIGlycmVsZXZhbnQuCi0gICAgICAgIFN0YXR1czoKLQlTb21lIHN1Z2dlc3Rpb25zIG9uIGZpbGVzIHRvIGF4ZS4gIEZlZWwgZnJlZSB0byBjb21tZW50LgotICAgICAgICAgIG1hbnVhbC9jZ2ktcGF0aC5odG1sIChzaG91bGQgYmUgZG9jdW1lbnRlZCBpbiBtb2RfY2dpLmh0bWwgaW5zdGVhZCkKLSAgICAgICAgICBtYW51YWwvcHJvY2Vzcy1tb2RlbC5odG1sIChkb2N1bWVudGVkIGluIE1QTXMsIGV2ZW50dWFsbHkpCi0gICAgICAgICAgcGxhdGZvcm0vcGVyZi0qIChhcmUgdGhlc2UgcmVsZXZhbnQgYW55bW9yZT8pCi0KLQotICAgLSBJbmRpdmlkdWFsIGRvY3Mgd2lsbCBuZWVkIHNvbWUgY2xlYW51cC4gCi0gICAgICAgIFN0YXR1czogIFdoYXQgZG9jcyBzdGlsbCBuZWVkIHRvIGJlIHRvdWNoZWQgaGVyZT8KLSAgICAgICAgICAgICAgICAgLSBpbnZva2luZy5odG1sIGhhcyBoYWQgYSBmaXJzdC1wYXNzIGNsZWFuaW5nIGRvbmUuCi0gICAgICAgICAgICAgICAgIC0gbWlzYy9wZXJmLXR1bmluZy5odG1sIC0gbmVlZHMgbWFqb3IgcmV3cml0ZSBmb3IgMi4wCi0gICAgICAgICAgICAgICAgIC0gbWlzYy9GQVEuaHRtbCAtIHNvbWUgb2xkIHF1ZXN0aW9ucyBjb3VsZCBiZSByZW1vdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gaXMgYSBuZXcgZm9ybWF0IGluIG9yZGVyPwotICAgICAgICAgICAgICAgICAtIG1pc2MvdHV0b3JpYWxzLmh0bWwgLSBtb3N0bHkgbm90IHJlbGV2YW50IHRvIDIuMAotICAgICAgICAgICAgICAgICAtIG1pc2Mvc3RvcHBpbmcuaHRtbAotICAgICAgICAgICAgICAgICAtIGRzby5odG1sCi0gICAgICAgICAgICAgICAgIC0gbWlzYy9yZXdyaXRlZ3VpZGUuaHRtbCAtIG5lZWRzIGNsZWFuaW5nIGluIDEuMyBhbmQgMi4wCi0gICAgICAgICAgICAgICAgIC0gbWlzYy9rbm93bl9jbGllbnRfcHJvYmxlbXMuaHRtbCAtIG1vc3RseSBhbmNpZW50Ci0gICAgICAgICAgICAgICAgIC0gaG93dG8vKiAtIHNvbWUgc3ludGF4IGhhcyBjaGFuZ2VkIGluIDIuMCBkdWUgdG8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmluZyBhbmQgbW9kX2NnaWQKLQotLSBOZXcgYnVpbGQgcHJvY2Vzcy4KLSAgIC0gVGhlIG5ldyBidWlsZCBwcm9jZXNzIGlzIGF1dG9jb25mIGJhc2VkLCBzbyBtYW51YWwvaW5zdGFsbC5odG1sCi0gICAgIHdpbGwgbmVlZCB0byBiZSBjb21wbGV0ZWx5IHJld3JpdHRlbi4gIFNvbWVvbmUgd2l0aCBlbm91Z2gKLSAgICAgcGF0aWVuY2UgY291bGQgcHJvYmFibHkgZmlndXJlIG91dCBtb3N0IG9mIHRoZSBpbXBvcnRhbnQgc3R1ZmYKLSAgICAgYnkgdHJpYWwgYW5kIGVycm9yLgotICAgICAgICBTdGF0dXM6IFJ5YW4ncyAiQnVpbGRpbmcgYW5kIEluc3RhbGxpbmcgQXBhY2hlIDIuMCIgbWlnaHQgYmUKLSAgICAgICAgICAgICAgICBhIHN0YXJ0aW5nIHBsYWNlLiAgCi0KLS0gRG9jdW1lbnRhdGlvbiBvZiBuZXcgZmVhdHVyZXMuCi0gICAtIFRoaXMgd2lsbCBwcm9iYWJseSByZXF1aXJlIG1vcmUgaW5wdXQgZnJvbSBuZXctaHR0cGQsIHNpbmNlCi0gICAgIG5vdCBtYW55IHBlb3BsZSBoZXJlIGZvbGxvdyB0aGUgZGV2ZWxvcG1lbnQgcHJvY2VzcyBjbG9zZQotICAgICBlbm91Z2ggdG8ga25vdyB3aGF0IGlzIGdvaW5nIG9uLgotICAgICAgICBTdGF0dXM6IFJ5YW4gaGFzIHR3byBBcGFjaGVUb2RheSBhcnRpY2xlcyB3aGljaCBtYXkgYmUgdXNlZnVsIAotICAgICAgICAgICAgICAgIGZvciB0aGlzLgotCSAgICAgICAgTmV3IGZlYXR1cmVzIHdoaWNoIG5lZWQgZG9jdW1lbnRhdGlvbjoKLSAgICAgICAgICAgICAgICAgICAgLSBmaWx0ZXJzICEhIQotCi0tIFRyYW5zbGF0aW9ucwotICAgICAgICBTdGF0dXM6ID8/PwpkaWZmIC0tZ2l0IGEvZG9jcy9jZ2ktZXhhbXBsZXMvcHJpbnRlbnYgYi9kb2NzL2NnaS1leGFtcGxlcy9wcmludGVudgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzODllMC4uMDAwMDAwMAotLS0gYS9kb2NzL2NnaS1leGFtcGxlcy9wcmludGVudgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyEvdXNyL2xvY2FsL2Jpbi9wZXJsCi0KLXByaW50ICJDb250ZW50LXR5cGU6IHRleHQvaHRtbFxuXG4iOwotd2hpbGUgKCgka2V5LCAkdmFsKSA9IGVhY2ggJUVOVikgewotCXByaW50ICIka2V5ID0gJHZhbDxCUj5cbiI7Ci19Ci0KZGlmZiAtLWdpdCBhL2RvY3MvY2dpLWV4YW1wbGVzL3Rlc3QtY2dpIGIvZG9jcy9jZ2ktZXhhbXBsZXMvdGVzdC1jZ2kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NTYzMWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9jZ2ktZXhhbXBsZXMvdGVzdC1jZ2kKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBkaXNhYmxlIGZpbGVuYW1lIGdsb2JiaW5nCi1zZXQgLWYKLQotZWNobyBDb250ZW50LXR5cGU6IHRleHQvcGxhaW4KLWVjaG8KLQotZWNobyBDR0kvMS4wIHRlc3Qgc2NyaXB0IHJlcG9ydDoKLWVjaG8KLQotZWNobyBhcmdjIGlzICQjLiBhcmd2IGlzICIkKiIuCi1lY2hvCi0KLWVjaG8gU0VSVkVSX1NPRlRXQVJFID0gJFNFUlZFUl9TT0ZUV0FSRQotZWNobyBTRVJWRVJfTkFNRSA9ICRTRVJWRVJfTkFNRQotZWNobyBHQVRFV0FZX0lOVEVSRkFDRSA9ICRHQVRFV0FZX0lOVEVSRkFDRQotZWNobyBTRVJWRVJfUFJPVE9DT0wgPSAkU0VSVkVSX1BST1RPQ09MCi1lY2hvIFNFUlZFUl9QT1JUID0gJFNFUlZFUl9QT1JUCi1lY2hvIFJFUVVFU1RfTUVUSE9EID0gJFJFUVVFU1RfTUVUSE9ECi1lY2hvIEhUVFBfQUNDRVBUID0gIiRIVFRQX0FDQ0VQVCIKLWVjaG8gUEFUSF9JTkZPID0gIiRQQVRIX0lORk8iCi1lY2hvIFBBVEhfVFJBTlNMQVRFRCA9ICIkUEFUSF9UUkFOU0xBVEVEIgotZWNobyBTQ1JJUFRfTkFNRSA9ICIkU0NSSVBUX05BTUUiCi1lY2hvIFFVRVJZX1NUUklORyA9ICIkUVVFUllfU1RSSU5HIgotZWNobyBSRU1PVEVfSE9TVCA9ICRSRU1PVEVfSE9TVAotZWNobyBSRU1PVEVfQUREUiA9ICRSRU1PVEVfQUREUgotZWNobyBSRU1PVEVfVVNFUiA9ICRSRU1PVEVfVVNFUgotZWNobyBBVVRIX1RZUEUgPSAkQVVUSF9UWVBFCi1lY2hvIENPTlRFTlRfVFlQRSA9ICRDT05URU5UX1RZUEUKLWVjaG8gQ09OVEVOVF9MRU5HVEggPSAkQ09OVEVOVF9MRU5HVEgKZGlmZiAtLWdpdCBhL2RvY3MvY29uZi9oaWdocGVyZm9ybWFuY2Utc3RkLmNvbmYgYi9kb2NzL2NvbmYvaGlnaHBlcmZvcm1hbmNlLXN0ZC5jb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkM2E1NTQwLi4wMDAwMDAwCi0tLSBhL2RvY3MvY29uZi9oaWdocGVyZm9ybWFuY2Utc3RkLmNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0jIEhhLCB5b3UncmUgcmVhZGluZyB0aGlzIGNvbmZpZyBmaWxlIGxvb2tpbmcgZm9yIHRoZSBlYXN5IHdheSBvdXQhCi0jICJob3cgZG8gSSBtYWtlIG15IGFwYWNoZSBzZXJ2ZXIgZ28gcmVhbGx5IHJlYWxseSBmYXN0Pz8iCi0jIFdlbGwgeW91IGNvdWxkIHN0YXJ0IGJ5IHJlYWRpbmcgdGhlIGh0ZG9jcy9tYW51YWwvbWlzYy9wZXJmLXR1bmluZy5odG1sCi0jIHBhZ2UuICBCdXQsIHdlJ2xsIGdpdmUgeW91IGEgaGVhZCBzdGFydC4KLSMKLSMgVGhpcyBjb25maWcgZmlsZSBpcyBzbWFsbCwgaXQgaXMgcHJvYmFibHkgbm90IHdoYXQgeW91J2QgZXhwZWN0IG9uIGEKLSMgZnVsbCBmZWF0dXJlZCBpbnRlcm5ldCB3ZWJzZXJ2ZXIgd2l0aCBtdWx0aXBsZSB1c2Vycy4gIEJ1dCBpdCdzCi0jIHByb2JhYmx5IGEgZ29vZCBzdGFydGluZyBwb2ludCBmb3IgYW55IGZvbGtzIGludGVyZXN0ZWQgaW4gdGVzdGluZwotIyBwZXJmb3JtYW5jZS4KLSMKLSMgVG8gcnVuIHRoaXMgY29uZmlnIHlvdSdsbCBuZWVkIHRvIHVzZSBzb21ldGhpbmcgbGlrZToKLSMgICAgIGh0dHBkIC1mIEBAU2VydmVyUm9vdEBAL2NvbmYvaGlnaHBlcmZvcm1hbmNlLmNvbmYKLQotUG9ydCA4MAotU2VydmVyUm9vdCBAQFNlcnZlclJvb3RAQAotRG9jdW1lbnRSb290IEBAU2VydmVyUm9vdEBAL2h0ZG9jcwotCi1Vc2VyICBub2JvZHkKLSMgSWYgeW91J3JlIG5vdCBvbiBMaW51eCwgeW91J2xsIHByb2JhYmx5IG5lZWQgdG8gY2hhbmdlIEdyb3VwCi1Hcm91cCBub2JvZHkKLQotPElmTW9kdWxlIHByZWZvcmsuYz4KLU1heENsaWVudHMgICAgICAgOCAKLVN0YXJ0U2VydmVycyAgICAgNQotTWluU3BhcmVTZXJ2ZXJzICA1Ci1NYXhTcGFyZVNlcnZlcnMgMTAKLTwvSWZNb2R1bGU+Ci0KLTxJZk1vZHVsZSBtcG10X3B0aHJlYWQuYz4KLU1heENsaWVudHMgICAgICAgOAotU3RhcnRTZXJ2ZXJzICAgICAxCi1NaW5TcGFyZVRocmVhZHMgIDUKLU1heFNwYXJlVGhyZWFkcyAxMAotVGhyZWFkc1BlckNoaWxkIDIwCi08L0lmTW9kdWxlPgotCi0jIEFzc3VtZSBubyBtZW1vcnkgbGVha3MgYXQgYWxsCi1NYXhSZXF1ZXN0c1BlckNoaWxkIDAKLQotIyBpdCdzIGFsd2F5cyBuaWNlIHRvIGtub3cgdGhlIHNlcnZlciBoYXMgc3RhcnRlZAotRXJyb3JMb2cgbG9ncy9lcnJvcl9sb2cKLQotIyBTb21lIGJlbmNobWFya3MgcmVxdWlyZSBsb2dnaW5nLCB3aGljaCBpcyBhIGdvb2QgcmVxdWlyZW1lbnQuICBVbmNvbW1lbnQKLSMgdGhpcyBpZiB5b3UgbmVlZCBsb2dnaW5nLgotI1RyYW5zZmVyTG9nIGxvZ3MvYWNjZXNzX2xvZwotCi0jIERpc2FibGUgc3ltbGluayBwcm90ZWN0aW9uIGFuZCBodGFjY2VzcyBmaWxlcywgdGhleSBjaGV3IGZhciB0b28gbXVjaC4KLTxEaXJlY3RvcnkgLz4KLSAgICBBbGxvd092ZXJyaWRlIG5vbmUKLSAgICBPcHRpb25zIEZvbGxvd1N5bUxpbmtzCi0gICAgIyBJZiB0aGlzIHdhcyBhIHJlYWwgaW50ZXJuZXQgc2VydmVyIHlvdSdkIHByb2JhYmx5IHdhbnQgdG8KLSAgICAjIHVuY29tbWVudCB0aGVzZToKLSAgICAjb3JkZXIgZGVueSxhbGxvdwotICAgICNkZW55IGZyb20gYWxsCi08L0RpcmVjdG9yeT4KLQotIyBJZiB0aGlzIHdhcyBhIHJlYWwgaW50ZXJuZXQgc2VydmVyIHlvdSdkIHByb2JhYmx5IHdhbnQgdG8gdW5jb21tZW50IHRoaXM6Ci0jPERpcmVjdG9yeSAiQEBTZXJ2ZXJSb290QEAvaHRkb2NzIj4KLSMgICAgb3JkZXIgYWxsb3csZGVueQotIyAgICBhbGxvdyBmcm9tIGFsbAotIzwvRGlyZWN0b3J5PgotCi0jIE9LIHRoYXQncyBlbm91Z2ggaGludHMuICBSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGlmIHlvdSB3YW50IG1vcmUuCmRpZmYgLS1naXQgYS9kb2NzL2NvbmYvaHR0cGQtd2luLmNvbmYgYi9kb2NzL2NvbmYvaHR0cGQtd2luLmNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlY2E3ZWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9jb25mL2h0dHBkLXdpbi5jb25mCisrKyAvZGV2L251bGwKQEAgLTEsNzgxICswLDAgQEAKLSMKLSMgQmFzZWQgdXBvbiB0aGUgTkNTQSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlcyBvcmlnaW5hbGx5IGJ5IFJvYiBNY0Nvb2wuCi0jCi0jIFRoaXMgaXMgdGhlIG1haW4gQXBhY2hlIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGUuICBJdCBjb250YWlucyB0aGUKLSMgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzIHRoYXQgZ2l2ZSB0aGUgc2VydmVyIGl0cyBpbnN0cnVjdGlvbnMuCi0jIFNlZSA8VVJMOmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzLz4gZm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0Ci0jIHRoZSBkaXJlY3RpdmVzLgotIwotIyBEbyBOT1Qgc2ltcGx5IHJlYWQgdGhlIGluc3RydWN0aW9ucyBpbiBoZXJlIHdpdGhvdXQgdW5kZXJzdGFuZGluZwotIyB3aGF0IHRoZXkgZG8uICBUaGV5J3JlIGhlcmUgb25seSBhcyBoaW50cyBvciByZW1pbmRlcnMuICBJZiB5b3UgYXJlIHVuc3VyZQotIyBjb25zdWx0IHRoZSBvbmxpbmUgZG9jcy4gWW91IGhhdmUgYmVlbiB3YXJuZWQuICAKLSMKLSMgQWZ0ZXIgdGhpcyBmaWxlIGlzIHByb2Nlc3NlZCwgdGhlIHNlcnZlciB3aWxsIGxvb2sgZm9yIGFuZCBwcm9jZXNzCi0jIEBAU2VydmVyUm9vdEBAL2NvbmYvc3JtLmNvbmYgYW5kIHRoZW4gQEBTZXJ2ZXJSb290QEAvY29uZi9hY2Nlc3MuY29uZgotIyB1bmxlc3MgeW91IGhhdmUgb3ZlcnJpZGRlbiB0aGVzZSB3aXRoIFJlc291cmNlQ29uZmlnIGFuZC9vcgotIyBBY2Nlc3NDb25maWcgZGlyZWN0aXZlcyBoZXJlLgotIwotIyBUaGUgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzIGFyZSBncm91cGVkIGludG8gdGhyZWUgYmFzaWMgc2VjdGlvbnM6Ci0jICAxLiBEaXJlY3RpdmVzIHRoYXQgY29udHJvbCB0aGUgb3BlcmF0aW9uIG9mIHRoZSBBcGFjaGUgc2VydmVyIHByb2Nlc3MgYXMgYQotIyAgICAgd2hvbGUgKHRoZSAnZ2xvYmFsIGVudmlyb25tZW50JykuCi0jICAyLiBEaXJlY3RpdmVzIHRoYXQgZGVmaW5lIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSAnbWFpbicgb3IgJ2RlZmF1bHQnIHNlcnZlciwKLSMgICAgIHdoaWNoIHJlc3BvbmRzIHRvIHJlcXVlc3RzIHRoYXQgYXJlbid0IGhhbmRsZWQgYnkgYSB2aXJ0dWFsIGhvc3QuCi0jICAgICBUaGVzZSBkaXJlY3RpdmVzIGFsc28gcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHNldHRpbmdzCi0jICAgICBvZiBhbGwgdmlydHVhbCBob3N0cy4KLSMgIDMuIFNldHRpbmdzIGZvciB2aXJ0dWFsIGhvc3RzLCB3aGljaCBhbGxvdyBXZWIgcmVxdWVzdHMgdG8gYmUgc2VudCB0bwotIyAgICAgZGlmZmVyZW50IElQIGFkZHJlc3NlcyBvciBob3N0bmFtZXMgYW5kIGhhdmUgdGhlbSBoYW5kbGVkIGJ5IHRoZQotIyAgICAgc2FtZSBBcGFjaGUgc2VydmVyIHByb2Nlc3MuCi0jCi0jIENvbmZpZ3VyYXRpb24gYW5kIGxvZ2ZpbGUgbmFtZXM6IElmIHRoZSBmaWxlbmFtZXMgeW91IHNwZWNpZnkgZm9yIG1hbnkKLSMgb2YgdGhlIHNlcnZlcidzIGNvbnRyb2wgZmlsZXMgYmVnaW4gd2l0aCAiLyIgKG9yICJkcml2ZTovIiBmb3IgV2luMzIpLCB0aGUKLSMgc2VydmVyIHdpbGwgdXNlIHRoYXQgZXhwbGljaXQgcGF0aC4gIElmIHRoZSBmaWxlbmFtZXMgZG8gKm5vdCogYmVnaW4KLSMgd2l0aCAiLyIsIHRoZSB2YWx1ZSBvZiBTZXJ2ZXJSb290IGlzIHByZXBlbmRlZCAtLSBzbyAibG9ncy9mb28ubG9nIgotIyB3aXRoIFNlcnZlclJvb3Qgc2V0IHRvICIvdXNyL2xvY2FsL2FwYWNoZSIgd2lsbCBiZSBpbnRlcnByZXRlZCBieSB0aGUKLSMgc2VydmVyIGFzICIvdXNyL2xvY2FsL2FwYWNoZS9sb2dzL2Zvby5sb2ciLgotIwotIyBOT1RFOiBXaGVyZSBmaWxlbmFtZXMgYXJlIHNwZWNpZmllZCwgeW91IG11c3QgdXNlIGZvcndhcmQgc2xhc2hlcwotIyBpbnN0ZWFkIG9mIGJhY2tzbGFzaGVzIChlLmcuLCAiYzovYXBhY2hlIiBpbnN0ZWFkIG9mICJjOlxhcGFjaGUiKS4KLSMgSWYgYSBkcml2ZSBsZXR0ZXIgaXMgb21pdHRlZCwgdGhlIGRyaXZlIG9uIHdoaWNoIEFwYWNoZS5leGUgaXMgbG9jYXRlZAotIyB3aWxsIGJlIHVzZWQgYnkgZGVmYXVsdC4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IGFsd2F5cyBzdXBwbHkKLSMgYW4gZXhwbGljaXQgZHJpdmUgbGV0dGVyIGluIGFic29sdXRlIHBhdGhzLCBob3dldmVyLCB0byBhdm9pZAotIyBjb25mdXNpb24uCi0jCi0KLSMjIyBTZWN0aW9uIDE6IEdsb2JhbCBFbnZpcm9ubWVudAotIwotIyBUaGUgZGlyZWN0aXZlcyBpbiB0aGlzIHNlY3Rpb24gYWZmZWN0IHRoZSBvdmVyYWxsIG9wZXJhdGlvbiBvZiBBcGFjaGUsCi0jIHN1Y2ggYXMgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IHJlcXVlc3RzIGl0IGNhbiBoYW5kbGUgb3Igd2hlcmUgaXQKLSMgY2FuIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0jCi0KLSMKLSMgU2VydmVyVHlwZSBpcyBlaXRoZXIgaW5ldGQsIG9yIHN0YW5kYWxvbmUuICBJbmV0ZCBtb2RlIGlzIG9ubHkgc3VwcG9ydGVkIG9uCi0jIFVuaXggcGxhdGZvcm1zLgotIwotU2VydmVyVHlwZSBzdGFuZGFsb25lCi0KLSMKLSMgU2VydmVyUm9vdDogVGhlIHRvcCBvZiB0aGUgZGlyZWN0b3J5IHRyZWUgdW5kZXIgd2hpY2ggdGhlIHNlcnZlcidzCi0jIGNvbmZpZ3VyYXRpb24sIGVycm9yLCBhbmQgbG9nIGZpbGVzIGFyZSBrZXB0LgotIwotIyBEbyBOT1QgYWRkIGEgc2xhc2ggYXQgdGhlIGVuZCBvZiB0aGUgZGlyZWN0b3J5IHBhdGguCi0jCi1TZXJ2ZXJSb290ICJAQFNlcnZlclJvb3RAQCIKLQotIwotIyBQaWRGaWxlOiBUaGUgZmlsZSBpbiB3aGljaCB0aGUgc2VydmVyIHNob3VsZCByZWNvcmQgaXRzIHByb2Nlc3MKLSMgaWRlbnRpZmljYXRpb24gbnVtYmVyIHdoZW4gaXQgc3RhcnRzLgotIwotUGlkRmlsZSBsb2dzL2h0dHBkLnBpZAotCi0jCi0jIFNjb3JlQm9hcmRGaWxlOiBGaWxlIHVzZWQgdG8gc3RvcmUgaW50ZXJuYWwgc2VydmVyIHByb2Nlc3MgaW5mb3JtYXRpb24uCi0jIE5vdCBhbGwgYXJjaGl0ZWN0dXJlcyByZXF1aXJlIHRoaXMuICBCdXQgaWYgeW91cnMgZG9lcyAoeW91J2xsIGtub3cgYmVjYXVzZQotIyB0aGlzIGZpbGUgd2lsbCBiZSAgY3JlYXRlZCB3aGVuIHlvdSBydW4gQXBhY2hlKSB0aGVuIHlvdSAqbXVzdCogZW5zdXJlIHRoYXQKLSMgbm8gdHdvIGludm9jYXRpb25zIG9mIEFwYWNoZSBzaGFyZSB0aGUgc2FtZSBzY29yZWJvYXJkIGZpbGUuCi0jCi1TY29yZUJvYXJkRmlsZSBsb2dzL2FwYWNoZV9zdGF0dXMKLQotIwotIyBJbiB0aGUgc3RhbmRhcmQgY29uZmlndXJhdGlvbiwgdGhlIHNlcnZlciB3aWxsIHByb2Nlc3MgaHR0cGQuY29uZiwKLSMgc3JtLmNvbmYsIGFuZCBhY2Nlc3MuY29uZiBpbiB0aGF0IG9yZGVyLiAgVGhlIGxhdHRlciB0d28gZmlsZXMgYXJlCi0jIG5vdyBkaXN0cmlidXRlZCBlbXB0eSwgYXMgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCBhbGwgZGlyZWN0aXZlcwotIyBiZSBrZXB0IGluIGEgc2luZ2xlIGZpbGUgZm9yIHNpbXBsaWNpdHkuICBUaGUgY29tbWVudGVkLW91dCB2YWx1ZXMKLSMgYmVsb3cgYXJlIHRoZSBidWlsdC1pbiBkZWZhdWx0cy4gIFlvdSBjYW4gaGF2ZSB0aGUgc2VydmVyIGlnbm9yZQotIyB0aGVzZSBmaWxlcyBhbHRvZ2V0aGVyIGJ5IHVzaW5nICIvZGV2L251bGwiIChmb3IgVW5peCkgb3IKLSMgIm51bCIgKGZvciBXaW4zMikgZm9yIHRoZSBhcmd1bWVudHMgdG8gdGhlIGRpcmVjdGl2ZXMuCi0jCi0jUmVzb3VyY2VDb25maWcgY29uZi9zcm0uY29uZgotI0FjY2Vzc0NvbmZpZyBjb25mL2FjY2Vzcy5jb25mCi0KLSMKLSMgVGltZW91dDogVGhlIG51bWJlciBvZiBzZWNvbmRzIGJlZm9yZSByZWNlaXZlcyBhbmQgc2VuZHMgdGltZSBvdXQuCi0jCi1UaW1lb3V0IDMwMAotCi0jCi0jIEtlZXBBbGl2ZTogV2hldGhlciBvciBub3QgdG8gYWxsb3cgcGVyc2lzdGVudCBjb25uZWN0aW9ucyAobW9yZSB0aGFuCi0jIG9uZSByZXF1ZXN0IHBlciBjb25uZWN0aW9uKS4gU2V0IHRvICJPZmYiIHRvIGRlYWN0aXZhdGUuCi0jCi1LZWVwQWxpdmUgT24KLQotIwotIyBNYXhLZWVwQWxpdmVSZXF1ZXN0czogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIHRvIGFsbG93Ci0jIGR1cmluZyBhIHBlcnNpc3RlbnQgY29ubmVjdGlvbi4gU2V0IHRvIDAgdG8gYWxsb3cgYW4gdW5saW1pdGVkIGFtb3VudC4KLSMgV2UgcmVjY29tZW5kIHlvdSBsZWF2ZSB0aGlzIG51bWJlciBoaWdoLCBmb3IgbWF4aW11bSBwZXJmb3JtYW5jZS4KLSMKLU1heEtlZXBBbGl2ZVJlcXVlc3RzIDEwMAotCi0jCi0jIEtlZXBBbGl2ZVRpbWVvdXQ6IE51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgZm9yIHRoZSBuZXh0IHJlcXVlc3QgZnJvbSB0aGUKLSMgc2FtZSBjbGllbnQgb24gdGhlIHNhbWUgY29ubmVjdGlvbi4KLSMKLUtlZXBBbGl2ZVRpbWVvdXQgMTUKLQotIwotIyBBcGFjaGUgb24gV2luMzIgYWx3YXlzIGNyZWF0ZXMgb25lIGNoaWxkIHByb2Nlc3MgdG8gaGFuZGxlIHJlcXVlc3RzLiAgSWYgaXQKLSMgZGllcywgYW5vdGhlciBjaGlsZCBwcm9jZXNzIGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseS4gIFdpdGhpbiB0aGUgY2hpbGQKLSMgcHJvY2VzcyBtdWx0aXBsZSB0aHJlYWRzIGhhbmRsZSBpbmNvbWluZyByZXF1ZXN0cy4gIFRoZSBuZXh0IHR3bwotIyBkaXJlY3RpdmVzIGNvbnRyb2wgdGhlIGJlaGF2aW91ciBvZiB0aGUgdGhyZWFkcyBhbmQgcHJvY2Vzc2VzLgotIwotCi0jCi0jIE1heFJlcXVlc3RzUGVyQ2hpbGQ6IHRoZSBudW1iZXIgb2YgcmVxdWVzdHMgZWFjaCBjaGlsZCBwcm9jZXNzIGlzCi0jIGFsbG93ZWQgdG8gcHJvY2VzcyBiZWZvcmUgdGhlIGNoaWxkIGRpZXMuICBUaGUgY2hpbGQgd2lsbCBleGl0IHNvCi0jIGFzIHRvIGF2b2lkIHByb2JsZW1zIGFmdGVyIHByb2xvbmdlZCB1c2Ugd2hlbiBBcGFjaGUgKGFuZCBtYXliZSB0aGUKLSMgbGlicmFyaWVzIGl0IHVzZXMpIGxlYWsgbWVtb3J5IG9yIG90aGVyIHJlc291cmNlcy4gIE9uIG1vc3Qgc3lzdGVtcywgdGhpcwotIyBpc24ndCByZWFsbHkgbmVlZGVkLCBidXQgYSBmZXcgKHN1Y2ggYXMgU29sYXJpcykgZG8gaGF2ZSBub3RhYmxlIGxlYWtzCi0jIGluIHRoZSBsaWJyYXJpZXMuICBGb3IgV2luMzIsIHNldCB0aGlzIHZhbHVlIHRvIHplcm8gKHVubGltaXRlZCkKLSMgdW5sZXNzIGFkdmlzZWQgb3RoZXJ3aXNlLgotIwotTWF4UmVxdWVzdHNQZXJDaGlsZCAwCi0KLSMKLSMgTnVtYmVyIG9mIGNvbmN1cnJlbnQgdGhyZWFkcyAoaS5lLiwgcmVxdWVzdHMpIHRoZSBzZXJ2ZXIgd2lsbCBhbGxvdy4KLSMgU2V0IHRoaXMgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSByZXNwb25zaXZlbmVzcyBvZiB0aGUgc2VydmVyIChtb3JlCi0jIHJlcXVlc3RzIGFjdGl2ZSBhdCBvbmNlIG1lYW5zIHRoZXkncmUgYWxsIGhhbmRsZWQgbW9yZSBzbG93bHkpIGFuZAotIyB0aGUgYW1vdW50IG9mIHN5c3RlbSByZXNvdXJjZXMgeW91J2xsIGFsbG93IHRoZSBzZXJ2ZXIgdG8gY29uc3VtZS4KLSMKLVRocmVhZHNQZXJDaGlsZCA1MAotCi0jCi0jIExpc3RlbjogQWxsb3dzIHlvdSB0byBiaW5kIEFwYWNoZSB0byBzcGVjaWZpYyBJUCBhZGRyZXNzZXMgYW5kL29yCi0jIHBvcnRzLCBpbiBhZGRpdGlvbiB0byB0aGUgZGVmYXVsdC4gU2VlIGFsc28gdGhlIDxWaXJ0dWFsSG9zdD4KLSMgZGlyZWN0aXZlLgotIwotI0xpc3RlbiAzMDAwCi0jTGlzdGVuIDEyLjM0LjU2Ljc4OjgwCi0KLSMKLSMgQmluZEFkZHJlc3M6IFlvdSBjYW4gc3VwcG9ydCB2aXJ0dWFsIGhvc3RzIHdpdGggdGhpcyBvcHRpb24uIFRoaXMgZGlyZWN0aXZlCi0jIGlzIHVzZWQgdG8gdGVsbCB0aGUgc2VydmVyIHdoaWNoIElQIGFkZHJlc3MgdG8gbGlzdGVuIHRvLiBJdCBjYW4gZWl0aGVyCi0jIGNvbnRhaW4gIioiLCBhbiBJUCBhZGRyZXNzLCBvciBhIGZ1bGx5IHF1YWxpZmllZCBJbnRlcm5ldCBkb21haW4gbmFtZS4KLSMgU2VlIGFsc28gdGhlIDxWaXJ0dWFsSG9zdD4gYW5kIExpc3RlbiBkaXJlY3RpdmVzLgotIwotI0JpbmRBZGRyZXNzICoKLQotIwotIyBEeW5hbWljIFNoYXJlZCBPYmplY3QgKERTTykgU3VwcG9ydAotIwotIyBUbyBiZSBhYmxlIHRvIHVzZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhIG1vZHVsZSB3aGljaCB3YXMgYnVpbHQgYXMgYSBEU08geW91Ci0jIGhhdmUgdG8gcGxhY2UgY29ycmVzcG9uZGluZyBgTG9hZE1vZHVsZScgbGluZXMgYXQgdGhpcyBsb2NhdGlvbiBzbyB0aGUKLSMgZGlyZWN0aXZlcyBjb250YWluZWQgaW4gaXQgYXJlIGFjdHVhbGx5IGF2YWlsYWJsZSBfYmVmb3JlXyB0aGV5IGFyZSB1c2VkLgotIyBQbGVhc2UgcmVhZCB0aGUgZmlsZSBSRUFETUUuRFNPIGluIHRoZSBBcGFjaGUgMS4zIGRpc3RyaWJ1dGlvbiBmb3IgbW9yZQotIyBkZXRhaWxzIGFib3V0IHRoZSBEU08gbWVjaGFuaXNtIGFuZCBydW4gYGFwYWNoZSAtbCcgZm9yIHRoZSBsaXN0IG9mIGFscmVhZHkKLSMgYnVpbHQtaW4gKHN0YXRpY2FsbHkgbGlua2VkIGFuZCB0aHVzIGFsd2F5cyBhdmFpbGFibGUpIG1vZHVsZXMgaW4geW91ciBBcGFjaGUKLSMgYmluYXJ5LgotIwotIyBOb3RlOiBUaGUgb3JkZXIgaW4gd2hpY2ggbW9kdWxlcyBhcmUgbG9hZGVkIGlzIGltcG9ydGFudC4gIERvbid0IGNoYW5nZQotIyB0aGUgb3JkZXIgYmVsb3cgd2l0aG91dCBleHBlcnQgYWR2aWNlLgotIwotI0xvYWRNb2R1bGUgYW5vbl9hdXRoX21vZHVsZSBtb2R1bGVzL0FwYWNoZU1vZHVsZUF1dGhBbm9uLmRsbAotI0xvYWRNb2R1bGUgY2Vybl9tZXRhX21vZHVsZSBtb2R1bGVzL0FwYWNoZU1vZHVsZUNFUk5NZXRhLmRsbAotI0xvYWRNb2R1bGUgZGlnZXN0X21vZHVsZSBtb2R1bGVzL0FwYWNoZU1vZHVsZURpZ2VzdC5kbGwKLSNMb2FkTW9kdWxlIGV4cGlyZXNfbW9kdWxlIG1vZHVsZXMvQXBhY2hlTW9kdWxlRXhwaXJlcy5kbGwKLSNMb2FkTW9kdWxlIGhlYWRlcnNfbW9kdWxlIG1vZHVsZXMvQXBhY2hlTW9kdWxlSGVhZGVycy5kbGwKLSNMb2FkTW9kdWxlIHByb3h5X21vZHVsZSBtb2R1bGVzL0FwYWNoZU1vZHVsZVByb3h5LmRsbAotI0xvYWRNb2R1bGUgcmV3cml0ZV9tb2R1bGUgbW9kdWxlcy9BcGFjaGVNb2R1bGVSZXdyaXRlLmRsbAotI0xvYWRNb2R1bGUgc3BlbGluZ19tb2R1bGUgbW9kdWxlcy9BcGFjaGVNb2R1bGVTcGVsaW5nLmRsbAotI0xvYWRNb2R1bGUgc3RhdHVzX21vZHVsZSBtb2R1bGVzL0FwYWNoZU1vZHVsZVN0YXR1cy5kbGwKLSNMb2FkTW9kdWxlIHVzZXJ0cmFja19tb2R1bGUgbW9kdWxlcy9BcGFjaGVNb2R1bGVVc2VyVHJhY2suZGxsCi0KLSMKLSMgRXh0ZW5kZWRTdGF0dXMgY29udHJvbHMgd2hldGhlciBBcGFjaGUgd2lsbCBnZW5lcmF0ZSAiZnVsbCIgc3RhdHVzCi0jIGluZm9ybWF0aW9uIChFeHRlbmRlZFN0YXR1cyBPbikgb3IganVzdCBiYXNpYyBpbmZvcm1hdGlvbiAoRXh0ZW5kZWRTdGF0dXMKLSMgT2ZmKSB3aGVuIHRoZSAic2VydmVyLXN0YXR1cyIgaGFuZGxlciBpcyBjYWxsZWQuIFRoZSBkZWZhdWx0IGlzIE9mZi4KLSMKLSNFeHRlbmRlZFN0YXR1cyBPbgotCi0jIyMgU2VjdGlvbiAyOiAnTWFpbicgc2VydmVyIGNvbmZpZ3VyYXRpb24KLSMKLSMgVGhlIGRpcmVjdGl2ZXMgaW4gdGhpcyBzZWN0aW9uIHNldCB1cCB0aGUgdmFsdWVzIHVzZWQgYnkgdGhlICdtYWluJwotIyBzZXJ2ZXIsIHdoaWNoIHJlc3BvbmRzIHRvIGFueSByZXF1ZXN0cyB0aGF0IGFyZW4ndCBoYW5kbGVkIGJ5IGEKLSMgPFZpcnR1YWxIb3N0PiBkZWZpbml0aW9uLiAgVGhlc2UgdmFsdWVzIGFsc28gcHJvdmlkZSBkZWZhdWx0cyBmb3IKLSMgYW55IDxWaXJ0dWFsSG9zdD4gY29udGFpbmVycyB5b3UgbWF5IGRlZmluZSBsYXRlciBpbiB0aGUgZmlsZS4KLSMKLSMgQWxsIG9mIHRoZXNlIGRpcmVjdGl2ZXMgbWF5IGFwcGVhciBpbnNpZGUgPFZpcnR1YWxIb3N0PiBjb250YWluZXJzLAotIyBpbiB3aGljaCBjYXNlIHRoZXNlIGRlZmF1bHQgc2V0dGluZ3Mgd2lsbCBiZSBvdmVycmlkZGVuIGZvciB0aGUKLSMgdmlydHVhbCBob3N0IGJlaW5nIGRlZmluZWQuCi0jCi0KLSMKLSMgSWYgeW91ciBTZXJ2ZXJUeXBlIGRpcmVjdGl2ZSAoc2V0IGVhcmxpZXIgaW4gdGhlICdHbG9iYWwgRW52aXJvbm1lbnQnCi0jIHNlY3Rpb24pIGlzIHNldCB0byAiaW5ldGQiLCB0aGUgbmV4dCBmZXcgZGlyZWN0aXZlcyBkb24ndCBoYXZlIGFueQotIyBlZmZlY3Qgc2luY2UgdGhlaXIgc2V0dGluZ3MgYXJlIGRlZmluZWQgYnkgdGhlIGluZXRkIGNvbmZpZ3VyYXRpb24uCi0jIFNraXAgYWhlYWQgdG8gdGhlIFNlcnZlckFkbWluIGRpcmVjdGl2ZS4KLSMKLQotIwotIyBQb3J0OiBUaGUgcG9ydCB0byB3aGljaCB0aGUgc3RhbmRhbG9uZSBzZXJ2ZXIgbGlzdGVucy4KLSMKLVBvcnQgODAKLQotIwotIyBTZXJ2ZXJBZG1pbjogWW91ciBhZGRyZXNzLCB3aGVyZSBwcm9ibGVtcyB3aXRoIHRoZSBzZXJ2ZXIgc2hvdWxkIGJlCi0jIGUtbWFpbGVkLiAgVGhpcyBhZGRyZXNzIGFwcGVhcnMgb24gc29tZSBzZXJ2ZXItZ2VuZXJhdGVkIHBhZ2VzLCBzdWNoCi0jIGFzIGVycm9yIGRvY3VtZW50cy4KLSMKLVNlcnZlckFkbWluIHlvdUB5b3VyLmFkZHJlc3MKLQotIwotIyBTZXJ2ZXJOYW1lIGFsbG93cyB5b3UgdG8gc2V0IGEgaG9zdCBuYW1lIHdoaWNoIGlzIHNlbnQgYmFjayB0byBjbGllbnRzIGZvcgotIyB5b3VyIHNlcnZlciBpZiBpdCdzIGRpZmZlcmVudCB0aGFuIHRoZSBvbmUgdGhlIHByb2dyYW0gd291bGQgZ2V0IChpLmUuLCB1c2UKLSMgInd3dyIgaW5zdGVhZCBvZiB0aGUgaG9zdCdzIHJlYWwgbmFtZSkuCi0jCi0jIE5vdGU6IFlvdSBjYW5ub3QganVzdCBpbnZlbnQgaG9zdCBuYW1lcyBhbmQgaG9wZSB0aGV5IHdvcmsuIFRoZSBuYW1lIHlvdSAKLSMgZGVmaW5lIGhlcmUgbXVzdCBiZSBhIHZhbGlkIEROUyBuYW1lIGZvciB5b3VyIGhvc3QuIElmIHlvdSBkb24ndCB1bmRlcnN0YW5kCi0jIHRoaXMsIGFzayB5b3VyIG5ldHdvcmsgYWRtaW5pc3RyYXRvci4KLSMgSWYgeW91ciBob3N0IGRvZXNuJ3QgaGF2ZSBhIHJlZ2lzdGVyZWQgRE5TIG5hbWUsIGVudGVyIGl0cyBJUCBhZGRyZXNzIGhlcmUuCi0jIFlvdSB3aWxsIGhhdmUgdG8gYWNjZXNzIGl0IGJ5IGl0cyBhZGRyZXNzIChlLmcuLCBodHRwOi8vMTIzLjQ1LjY3Ljg5LykKLSMgYW55d2F5LCBhbmQgdGhpcyB3aWxsIG1ha2UgcmVkaXJlY3Rpb25zIHdvcmsgaW4gYSBzZW5zaWJsZSB3YXkuCi0jCi0jU2VydmVyTmFtZSBuZXcuaG9zdC5uYW1lCi0KLSMKLSMgRG9jdW1lbnRSb290OiBUaGUgZGlyZWN0b3J5IG91dCBvZiB3aGljaCB5b3Ugd2lsbCBzZXJ2ZSB5b3VyCi0jIGRvY3VtZW50cy4gQnkgZGVmYXVsdCwgYWxsIHJlcXVlc3RzIGFyZSB0YWtlbiBmcm9tIHRoaXMgZGlyZWN0b3J5LCBidXQKLSMgc3ltYm9saWMgbGlua3MgYW5kIGFsaWFzZXMgbWF5IGJlIHVzZWQgdG8gcG9pbnQgdG8gb3RoZXIgbG9jYXRpb25zLgotIwotRG9jdW1lbnRSb290ICJAQFNlcnZlclJvb3RAQC9odGRvY3MiCi0KLSMKLSMgRWFjaCBkaXJlY3RvcnkgdG8gd2hpY2ggQXBhY2hlIGhhcyBhY2Nlc3MsIGNhbiBiZSBjb25maWd1cmVkIHdpdGggcmVzcGVjdAotIyB0byB3aGljaCBzZXJ2aWNlcyBhbmQgZmVhdHVyZXMgYXJlIGFsbG93ZWQgYW5kL29yIGRpc2FibGVkIGluIHRoYXQKLSMgZGlyZWN0b3J5IChhbmQgaXRzIHN1YmRpcmVjdG9yaWVzKS4gCi0jCi0jIEZpcnN0LCB3ZSBjb25maWd1cmUgdGhlICJkZWZhdWx0IiB0byBiZSBhIHZlcnkgcmVzdHJpY3RpdmUgc2V0IG9mIAotIyBwZXJtaXNzaW9ucy4gIAotIwotPERpcmVjdG9yeSAvPgotICAgIE9wdGlvbnMgRm9sbG93U3ltTGlua3MKLSAgICBBbGxvd092ZXJyaWRlIE5vbmUKLTwvRGlyZWN0b3J5PgotCi0jCi0jIE5vdGUgdGhhdCBmcm9tIHRoaXMgcG9pbnQgZm9yd2FyZCB5b3UgbXVzdCBzcGVjaWZpY2FsbHkgYWxsb3cKLSMgcGFydGljdWxhciBmZWF0dXJlcyB0byBiZSBlbmFibGVkIC0gc28gaWYgc29tZXRoaW5nJ3Mgbm90IHdvcmtpbmcgYXMKLSMgeW91IG1pZ2h0IGV4cGVjdCwgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgc3BlY2lmaWNhbGx5IGVuYWJsZWQgaXQKLSMgYmVsb3cuCi0jCi0KLSMKLSMgVGhpcyBzaG91bGQgYmUgY2hhbmdlZCB0byB3aGF0ZXZlciB5b3Ugc2V0IERvY3VtZW50Um9vdCB0by4KLSMKLTxEaXJlY3RvcnkgIkBAU2VydmVyUm9vdEBAL2h0ZG9jcyI+Ci0KLSMKLSMgVGhpcyBtYXkgYWxzbyBiZSAiTm9uZSIsICJBbGwiLCBvciBhbnkgY29tYmluYXRpb24gb2YgIkluZGV4ZXMiLAotIyAiSW5jbHVkZXMiLCAiRm9sbG93U3ltTGlua3MiLCAiRXhlY0NHSSIsIG9yICJNdWx0aVZpZXdzIi4KLSMKLSMgTm90ZSB0aGF0ICJNdWx0aVZpZXdzIiBtdXN0IGJlIG5hbWVkICpleHBsaWNpdGx5KiAtLS0gIk9wdGlvbnMgQWxsIgotIyBkb2Vzbid0IGdpdmUgaXQgdG8geW91LgotIwotICAgIE9wdGlvbnMgSW5kZXhlcyBGb2xsb3dTeW1MaW5rcwotCi0jCi0jIFRoaXMgY29udHJvbHMgd2hpY2ggb3B0aW9ucyB0aGUgLmh0YWNjZXNzIGZpbGVzIGluIGRpcmVjdG9yaWVzIGNhbgotIyBvdmVycmlkZS4gQ2FuIGFsc28gYmUgIkFsbCIsIG9yIGFueSBjb21iaW5hdGlvbiBvZiAiT3B0aW9ucyIsICJGaWxlSW5mbyIsIAotIyAiQXV0aENvbmZpZyIsIGFuZCAiTGltaXQiCi0jCi0gICAgQWxsb3dPdmVycmlkZSBOb25lCi0KLSMKLSMgQ29udHJvbHMgd2hvIGNhbiBnZXQgc3R1ZmYgZnJvbSB0aGlzIHNlcnZlci4KLSMKLSAgICBPcmRlciBhbGxvdyxkZW55Ci0gICAgQWxsb3cgZnJvbSBhbGwKLTwvRGlyZWN0b3J5PgotCi0jCi0jIFVzZXJEaXI6IFRoZSBuYW1lIG9mIHRoZSBkaXJlY3Rvcnkgd2hpY2ggaXMgYXBwZW5kZWQgb250byBhIHVzZXIncyBob21lCi0jIGRpcmVjdG9yeSBpZiBhIH51c2VyIHJlcXVlc3QgaXMgcmVjZWl2ZWQuCi0jCi0jIFVuZGVyIFdpbjMyLCB3ZSBkbyBub3QgY3VycmVudGx5IHRyeSB0byBkZXRlcm1pbmUgdGhlIGhvbWUgZGlyZWN0b3J5IG9mCi0jIGEgV2luZG93cyBsb2dpbiwgc28gYSBmb3JtYXQgc3VjaCBhcyB0aGF0IGJlbG93IG5lZWRzIHRvIGJlIHVzZWQuICBTZWUKLSMgdGhlIFVzZXJEaXIgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KLSMKLVVzZXJEaXIgIkBAU2VydmVyUm9vdEBAL3VzZXJzLyIKLQotIwotIyBEaXJlY3RvcnlJbmRleDogTmFtZSBvZiB0aGUgZmlsZSBvciBmaWxlcyB0byB1c2UgYXMgYSBwcmUtd3JpdHRlbiBIVE1MCi0jIGRpcmVjdG9yeSBpbmRleC4gIFNlcGFyYXRlIG11bHRpcGxlIGVudHJpZXMgd2l0aCBzcGFjZXMuCi0jCi1EaXJlY3RvcnlJbmRleCBpbmRleC5odG1sCi0KLSMKLSMgQWNjZXNzRmlsZU5hbWU6IFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGxvb2sgZm9yIGluIGVhY2ggZGlyZWN0b3J5Ci0jIGZvciBhY2Nlc3MgY29udHJvbCBpbmZvcm1hdGlvbi4KLSMKLUFjY2Vzc0ZpbGVOYW1lIC5odGFjY2VzcwotCi0jCi0jIFRoZSBmb2xsb3dpbmcgbGluZXMgcHJldmVudCAuaHRhY2Nlc3MgZmlsZXMgZnJvbSBiZWluZyB2aWV3ZWQgYnkKLSMgV2ViIGNsaWVudHMuICBTaW5jZSAuaHRhY2Nlc3MgZmlsZXMgb2Z0ZW4gY29udGFpbiBhdXRob3JpemF0aW9uCi0jIGluZm9ybWF0aW9uLCBhY2Nlc3MgaXMgZGlzYWxsb3dlZCBmb3Igc2VjdXJpdHkgcmVhc29ucy4gIENvbW1lbnQKLSMgdGhlc2UgbGluZXMgb3V0IGlmIHlvdSB3YW50IFdlYiB2aXNpdG9ycyB0byBzZWUgdGhlIGNvbnRlbnRzIG9mCi0jIC5odGFjY2VzcyBmaWxlcy4gIElmIHlvdSBjaGFuZ2UgdGhlIEFjY2Vzc0ZpbGVOYW1lIGRpcmVjdGl2ZSBhYm92ZSwKLSMgYmUgc3VyZSB0byBtYWtlIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5nZXMgaGVyZS4KLSMKLTxGaWxlcyAuaHRhY2Nlc3M+Ci0gICAgT3JkZXIgYWxsb3csZGVueQotICAgIERlbnkgZnJvbSBhbGwKLTwvRmlsZXM+Ci0KLSMKLSMgQ2FjaGVOZWdvdGlhdGVkRG9jczogQnkgZGVmYXVsdCwgQXBhY2hlIHNlbmRzICJQcmFnbWE6IG5vLWNhY2hlIiB3aXRoIGVhY2gKLSMgZG9jdW1lbnQgdGhhdCB3YXMgbmVnb3RpYXRlZCBvbiB0aGUgYmFzaXMgb2YgY29udGVudC4gVGhpcyBhc2tzIHByb3h5Ci0jIHNlcnZlcnMgbm90IHRvIGNhY2hlIHRoZSBkb2N1bWVudC4gVW5jb21tZW50aW5nIHRoZSBmb2xsb3dpbmcgbGluZSBkaXNhYmxlcwotIyB0aGlzIGJlaGF2aW9yLCBhbmQgcHJveGllcyB3aWxsIGJlIGFsbG93ZWQgdG8gY2FjaGUgdGhlIGRvY3VtZW50cy4KLSMKLSNDYWNoZU5lZ290aWF0ZWREb2NzCi0KLSMKLSMgVXNlQ2Fub25pY2FsTmFtZTogIChuZXcgZm9yIDEuMykgIFdpdGggdGhpcyBzZXR0aW5nIHR1cm5lZCBvbiwgd2hlbmV2ZXIKLSMgQXBhY2hlIG5lZWRzIHRvIGNvbnN0cnVjdCBhIHNlbGYtcmVmZXJlbmNpbmcgVVJMIChhIFVSTCB0aGF0IHJlZmVycyBiYWNrCi0jIHRvIHRoZSBzZXJ2ZXIgdGhlIHJlc3BvbnNlIGlzIGNvbWluZyBmcm9tKSBpdCB3aWxsIHVzZSBTZXJ2ZXJOYW1lIGFuZAotIyBQb3J0IHRvIGZvcm0gYSAiY2Fub25pY2FsIiBuYW1lLiAgV2l0aCB0aGlzIHNldHRpbmcgb2ZmLCBBcGFjaGUgd2lsbAotIyB1c2UgdGhlIGhvc3RuYW1lOnBvcnQgdGhhdCB0aGUgY2xpZW50IHN1cHBsaWVkLCB3aGVuIHBvc3NpYmxlLiAgVGhpcwotIyBhbHNvIGFmZmVjdHMgU0VSVkVSX05BTUUgYW5kIFNFUlZFUl9QT1JUIGluIENHSSBzY3JpcHRzLgotIwotVXNlQ2Fub25pY2FsTmFtZSBPbgotCi0jCi0jIFR5cGVzQ29uZmlnIGRlc2NyaWJlcyB3aGVyZSB0aGUgbWltZS50eXBlcyBmaWxlIChvciBlcXVpdmFsZW50KSBpcwotIyB0byBiZSBmb3VuZC4KLSMKLVR5cGVzQ29uZmlnIGNvbmYvbWltZS50eXBlcwotCi0jCi0jIERlZmF1bHRUeXBlIGlzIHRoZSBkZWZhdWx0IE1JTUUgdHlwZSB0aGUgc2VydmVyIHdpbGwgdXNlIGZvciBhIGRvY3VtZW50Ci0jIGlmIGl0IGNhbm5vdCBvdGhlcndpc2UgZGV0ZXJtaW5lIG9uZSwgc3VjaCBhcyBmcm9tIGZpbGVuYW1lIGV4dGVuc2lvbnMuCi0jIElmIHlvdXIgc2VydmVyIGNvbnRhaW5zIG1vc3RseSB0ZXh0IG9yIEhUTUwgZG9jdW1lbnRzLCAidGV4dC9wbGFpbiIgaXMKLSMgYSBnb29kIHZhbHVlLiAgSWYgbW9zdCBvZiB5b3VyIGNvbnRlbnQgaXMgYmluYXJ5LCBzdWNoIGFzIGFwcGxpY2F0aW9ucwotIyBvciBpbWFnZXMsIHlvdSBtYXkgd2FudCB0byB1c2UgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIgaW5zdGVhZCB0bwotIyBrZWVwIGJyb3dzZXJzIGZyb20gdHJ5aW5nIHRvIGRpc3BsYXkgYmluYXJ5IGZpbGVzIGFzIHRob3VnaCB0aGV5IGFyZQotIyB0ZXh0LgotIwotRGVmYXVsdFR5cGUgdGV4dC9wbGFpbgotCi0jCi0jIFRoZSBtb2RfbWltZV9tYWdpYyBtb2R1bGUgYWxsb3dzIHRoZSBzZXJ2ZXIgdG8gdXNlIHZhcmlvdXMgaGludHMgZnJvbSB0aGUKLSMgY29udGVudHMgb2YgdGhlIGZpbGUgaXRzZWxmIHRvIGRldGVybWluZSBpdHMgdHlwZS4gIFRoZSBNSU1FTWFnaWNGaWxlCi0jIGRpcmVjdGl2ZSB0ZWxscyB0aGUgbW9kdWxlIHdoZXJlIHRoZSBoaW50IGRlZmluaXRpb25zIGFyZSBsb2NhdGVkLgotIyBtb2RfbWltZV9tYWdpYyBpcyBub3QgcGFydCBvZiB0aGUgZGVmYXVsdCBzZXJ2ZXIgKHlvdSBoYXZlIHRvIGFkZAotIyBpdCB5b3Vyc2VsZiB3aXRoIGEgTG9hZE1vZHVsZSBbc2VlIHRoZSBEU08gcGFyYWdyYXBoIGluIHRoZSAnR2xvYmFsCi0jIEVudmlyb25tZW50JyBzZWN0aW9uXSwgb3IgcmVjb21waWxlIHRoZSBzZXJ2ZXIgYW5kIGluY2x1ZGUgbW9kX21pbWVfbWFnaWMKLSMgYXMgcGFydCBvZiB0aGUgY29uZmlndXJhdGlvbiksIHNvIGl0J3MgZW5jbG9zZWQgaW4gYW4gPElmTW9kdWxlPiBjb250YWluZXIuCi0jIFRoaXMgbWVhbnMgdGhhdCB0aGUgTUlNRU1hZ2ljRmlsZSBkaXJlY3RpdmUgd2lsbCBvbmx5IGJlIHByb2Nlc3NlZCBpZiB0aGUKLSMgbW9kdWxlIGlzIHBhcnQgb2YgdGhlIHNlcnZlci4KLSMKLTxJZk1vZHVsZSBtb2RfbWltZV9tYWdpYy5jPgotICAgIE1JTUVNYWdpY0ZpbGUgY29uZi9tYWdpYwotPC9JZk1vZHVsZT4KLQotIwotIyBIb3N0bmFtZUxvb2t1cHM6IExvZyB0aGUgbmFtZXMgb2YgY2xpZW50cyBvciBqdXN0IHRoZWlyIElQIGFkZHJlc3NlcwotIyBlLmcuLCB3d3cuYXBhY2hlLm9yZyAob24pIG9yIDIwNC42Mi4xMjkuMTMyIChvZmYpLgotIyBUaGUgZGVmYXVsdCBpcyBvZmYgYmVjYXVzZSBpdCdkIGJlIG92ZXJhbGwgYmV0dGVyIGZvciB0aGUgbmV0IGlmIHBlb3BsZQotIyBoYWQgdG8ga25vd2luZ2x5IHR1cm4gdGhpcyBmZWF0dXJlIG9uLCBzaW5jZSBlbmFibGluZyBpdCBtZWFucyB0aGF0Ci0jIGVhY2ggY2xpZW50IHJlcXVlc3Qgd2lsbCByZXN1bHQgaW4gQVQgTEVBU1Qgb25lIGxvb2t1cCByZXF1ZXN0IHRvIHRoZQotIyBuYW1lc2VydmVyLgotIwotSG9zdG5hbWVMb29rdXBzIE9mZgotCi0jCi0jIEVycm9yTG9nOiBUaGUgbG9jYXRpb24gb2YgdGhlIGVycm9yIGxvZyBmaWxlLgotIyBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYW4gRXJyb3JMb2cgZGlyZWN0aXZlIHdpdGhpbiBhIDxWaXJ0dWFsSG9zdD4KLSMgY29udGFpbmVyLCBlcnJvciBtZXNzYWdlcyByZWxhdGluZyB0byB0aGF0IHZpcnR1YWwgaG9zdCB3aWxsIGJlCi0jIGxvZ2dlZCBoZXJlLiAgSWYgeW91ICpkbyogZGVmaW5lIGFuIGVycm9yIGxvZ2ZpbGUgZm9yIGEgPFZpcnR1YWxIb3N0PgotIyBjb250YWluZXIsIHRoYXQgaG9zdCdzIGVycm9ycyB3aWxsIGJlIGxvZ2dlZCB0aGVyZSBhbmQgbm90IGhlcmUuCi0jCi1FcnJvckxvZyBsb2dzL2Vycm9yLmxvZwotCi0jCi0jIExvZ0xldmVsOiBDb250cm9sIHRoZSBudW1iZXIgb2YgbWVzc2FnZXMgbG9nZ2VkIHRvIHRoZSBlcnJvci5sb2cuCi0jIFBvc3NpYmxlIHZhbHVlcyBpbmNsdWRlOiBkZWJ1ZywgaW5mbywgbm90aWNlLCB3YXJuLCBlcnJvciwgY3JpdCwKLSMgYWxlcnQsIGVtZXJnLgotIwotTG9nTGV2ZWwgd2FybgotCi0jCi0jIFRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlcyBkZWZpbmUgc29tZSBmb3JtYXQgbmlja25hbWVzIGZvciB1c2Ugd2l0aAotIyBhIEN1c3RvbUxvZyBkaXJlY3RpdmUgKHNlZSBiZWxvdykuCi0jCi1Mb2dGb3JtYXQgIiVoICVsICV1ICV0IFwiJXJcIiAlPnMgJWIgXCIle1JlZmVyZXJ9aVwiIFwiJXtVc2VyLUFnZW50fWlcIiIgY29tYmluZWQKLUxvZ0Zvcm1hdCAiJWggJWwgJXUgJXQgXCIlclwiICU+cyAlYiIgY29tbW9uCi1Mb2dGb3JtYXQgIiV7UmVmZXJlcn1pIC0+ICVVIiByZWZlcmVyCi1Mb2dGb3JtYXQgIiV7VXNlci1hZ2VudH1pIiBhZ2VudAotCi0jCi0jIFRoZSBsb2NhdGlvbiBhbmQgZm9ybWF0IG9mIHRoZSBhY2Nlc3MgbG9nZmlsZSAoQ29tbW9uIExvZ2ZpbGUgRm9ybWF0KS4KLSMgSWYgeW91IGRvIG5vdCBkZWZpbmUgYW55IGFjY2VzcyBsb2dmaWxlcyB3aXRoaW4gYSA8VmlydHVhbEhvc3Q+Ci0jIGNvbnRhaW5lciwgdGhleSB3aWxsIGJlIGxvZ2dlZCBoZXJlLiAgQ29udHJhcml3aXNlLCBpZiB5b3UgKmRvKgotIyBkZWZpbmUgcGVyLTxWaXJ0dWFsSG9zdD4gYWNjZXNzIGxvZ2ZpbGVzLCB0cmFuc2FjdGlvbnMgd2lsbCBiZQotIyBsb2dnZWQgdGhlcmVpbiBhbmQgKm5vdCogaW4gdGhpcyBmaWxlLgotIwotQ3VzdG9tTG9nIGxvZ3MvYWNjZXNzLmxvZyBjb21tb24KLQotIwotIyBJZiB5b3Ugd291bGQgbGlrZSB0byBoYXZlIGFnZW50IGFuZCByZWZlcmVyIGxvZ2ZpbGVzLCB1bmNvbW1lbnQgdGhlCi0jIGZvbGxvd2luZyBkaXJlY3RpdmVzLgotIwotI0N1c3RvbUxvZyBsb2dzL3JlZmVyZXIubG9nIHJlZmVyZXIKLSNDdXN0b21Mb2cgbG9ncy9hZ2VudC5sb2cgYWdlbnQKLQotIwotIyBJZiB5b3UgcHJlZmVyIGEgc2luZ2xlIGxvZ2ZpbGUgd2l0aCBhY2Nlc3MsIGFnZW50LCBhbmQgcmVmZXJlciBpbmZvcm1hdGlvbgotIyAoQ29tYmluZWQgTG9nZmlsZSBGb3JtYXQpIHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlLgotIwotI0N1c3RvbUxvZyBsb2dzL2FjY2Vzcy5sb2cgY29tYmluZWQKLQotIwotIyBPcHRpb25hbGx5IGFkZCBhIGxpbmUgY29udGFpbmluZyB0aGUgc2VydmVyIHZlcnNpb24gYW5kIHZpcnR1YWwgaG9zdAotIyBuYW1lIHRvIHNlcnZlci1nZW5lcmF0ZWQgcGFnZXMgKGVycm9yIGRvY3VtZW50cywgRlRQIGRpcmVjdG9yeSBsaXN0aW5ncywKLSMgbW9kX3N0YXR1cyBhbmQgbW9kX2luZm8gb3V0cHV0IGV0Yy4sIGJ1dCBub3QgQ0dJIGdlbmVyYXRlZCBkb2N1bWVudHMpLgotIyBTZXQgdG8gIkVNYWlsIiB0byBhbHNvIGluY2x1ZGUgYSBtYWlsdG86IGxpbmsgdG8gdGhlIFNlcnZlckFkbWluLgotIyBTZXQgdG8gb25lIG9mOiAgT24gfCBPZmYgfCBFTWFpbAotIwotU2VydmVyU2lnbmF0dXJlIE9uCi0KLSMKLSMgQWxpYXNlczogQWRkIGhlcmUgYXMgbWFueSBhbGlhc2VzIGFzIHlvdSBuZWVkICh3aXRoIG5vIGxpbWl0KS4gVGhlIGZvcm1hdCBpcyAKLSMgQWxpYXMgZmFrZW5hbWUgcmVhbG5hbWUKLSMKLSMgTm90ZSB0aGF0IGlmIHlvdSBpbmNsdWRlIGEgdHJhaWxpbmcgLyBvbiBmYWtlbmFtZSB0aGVuIHRoZSBzZXJ2ZXIgd2lsbAotIyByZXF1aXJlIGl0IHRvIGJlIHByZXNlbnQgaW4gdGhlIFVSTC4gIFNvICIvaWNvbnMiIGlzbid0IGFsaWFzZWQgaW4gdGhpcwotIyBleGFtcGxlLCBvbmx5ICIvaWNvbnMvIi4uCi0jCi1BbGlhcyAvaWNvbnMvICJAQFNlcnZlclJvb3RAQC9pY29ucy8iCi0KLSMKLSMgU2NyaXB0QWxpYXM6IFRoaXMgY29udHJvbHMgd2hpY2ggZGlyZWN0b3JpZXMgY29udGFpbiBzZXJ2ZXIgc2NyaXB0cy4KLSMgU2NyaXB0QWxpYXNlcyBhcmUgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgQWxpYXNlcywgZXhjZXB0IHRoYXQKLSMgZG9jdW1lbnRzIGluIHRoZSByZWFsbmFtZSBkaXJlY3RvcnkgYXJlIHRyZWF0ZWQgYXMgYXBwbGljYXRpb25zIGFuZAotIyBydW4gYnkgdGhlIHNlcnZlciB3aGVuIHJlcXVlc3RlZCByYXRoZXIgdGhhbiBhcyBkb2N1bWVudHMgc2VudCB0byB0aGUgY2xpZW50LgotIyBUaGUgc2FtZSBydWxlcyBhYm91dCB0cmFpbGluZyAiLyIgYXBwbHkgdG8gU2NyaXB0QWxpYXMgZGlyZWN0aXZlcyBhcyB0bwotIyBBbGlhcy4KLSMKLVNjcmlwdEFsaWFzIC9jZ2ktYmluLyAiQEBTZXJ2ZXJSb290QEAvY2dpLWJpbi8iCi0KLSMKLSMgIkBAU2VydmVyUm9vdEBAL2NnaS1iaW4iIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHdoYXRldmVyIHlvdXIgU2NyaXB0QWxpYXNlZAotIyBDR0kgZGlyZWN0b3J5IGV4aXN0cywgaWYgeW91IGhhdmUgdGhhdCBjb25maWd1cmVkLgotIwotPERpcmVjdG9yeSAiQEBTZXJ2ZXJSb290QEAvY2dpLWJpbiI+Ci0gICAgQWxsb3dPdmVycmlkZSBOb25lCi0gICAgT3B0aW9ucyBOb25lCi08L0RpcmVjdG9yeT4KLQotIwotIyBSZWRpcmVjdCBhbGxvd3MgeW91IHRvIHRlbGwgY2xpZW50cyBhYm91dCBkb2N1bWVudHMgd2hpY2ggdXNlZCB0byBleGlzdCBpbgotIyB5b3VyIHNlcnZlcidzIG5hbWVzcGFjZSwgYnV0IGRvIG5vdCBhbnltb3JlLiBUaGlzIGFsbG93cyB5b3UgdG8gdGVsbCB0aGUKLSMgY2xpZW50cyB3aGVyZSB0byBsb29rIGZvciB0aGUgcmVsb2NhdGVkIGRvY3VtZW50LgotIyBGb3JtYXQ6IFJlZGlyZWN0IG9sZC1VUkkgbmV3LVVSTAotIwotCi0jCi0jIERpcmVjdGl2ZXMgY29udHJvbGxpbmcgdGhlIGRpc3BsYXkgb2Ygc2VydmVyLWdlbmVyYXRlZCBkaXJlY3RvcnkgbGlzdGluZ3MuCi0jCi0KLSMKLSMgRmFuY3lJbmRleGluZyBpcyB3aGV0aGVyIHlvdSB3YW50IGZhbmN5IGRpcmVjdG9yeSBpbmRleGluZyBvciBzdGFuZGFyZAotIwotSW5kZXhPcHRpb25zIEZhbmN5SW5kZXhpbmcKLQotIwotIyBBZGRJY29uKiBkaXJlY3RpdmVzIHRlbGwgdGhlIHNlcnZlciB3aGljaCBpY29uIHRvIHNob3cgZm9yIGRpZmZlcmVudAotIyBmaWxlcyBvciBmaWxlbmFtZSBleHRlbnNpb25zLiAgVGhlc2UgYXJlIG9ubHkgZGlzcGxheWVkIGZvcgotIyBGYW5jeUluZGV4ZWQgZGlyZWN0b3JpZXMuCi0jCi1BZGRJY29uQnlFbmNvZGluZyAoQ01QLC9pY29ucy9jb21wcmVzc2VkLmdpZikgeC1jb21wcmVzcyB4LWd6aXAKLQotQWRkSWNvbkJ5VHlwZSAoVFhULC9pY29ucy90ZXh0LmdpZikgdGV4dC8qCi1BZGRJY29uQnlUeXBlIChJTUcsL2ljb25zL2ltYWdlMi5naWYpIGltYWdlLyoKLUFkZEljb25CeVR5cGUgKFNORCwvaWNvbnMvc291bmQyLmdpZikgYXVkaW8vKgotQWRkSWNvbkJ5VHlwZSAoVklELC9pY29ucy9tb3ZpZS5naWYpIHZpZGVvLyoKLQotQWRkSWNvbiAvaWNvbnMvYmluYXJ5LmdpZiAuYmluIC5leGUKLUFkZEljb24gL2ljb25zL2JpbmhleC5naWYgLmhxeAotQWRkSWNvbiAvaWNvbnMvdGFyLmdpZiAudGFyCi1BZGRJY29uIC9pY29ucy93b3JsZDIuZ2lmIC53cmwgLndybC5neiAudnJtbCAudnJtIC5pdgotQWRkSWNvbiAvaWNvbnMvY29tcHJlc3NlZC5naWYgLlogLnogLnRneiAuZ3ogLnppcAotQWRkSWNvbiAvaWNvbnMvYS5naWYgLnBzIC5haSAuZXBzCi1BZGRJY29uIC9pY29ucy9sYXlvdXQuZ2lmIC5odG1sIC5zaHRtbCAuaHRtIC5wZGYKLUFkZEljb24gL2ljb25zL3RleHQuZ2lmIC50eHQKLUFkZEljb24gL2ljb25zL2MuZ2lmIC5jCi1BZGRJY29uIC9pY29ucy9wLmdpZiAucGwgLnB5Ci1BZGRJY29uIC9pY29ucy9mLmdpZiAuZm9yCi1BZGRJY29uIC9pY29ucy9kdmkuZ2lmIC5kdmkKLUFkZEljb24gL2ljb25zL3V1ZW5jb2RlZC5naWYgLnV1Ci1BZGRJY29uIC9pY29ucy9zY3JpcHQuZ2lmIC5jb25mIC5zaCAuc2hhciAuY3NoIC5rc2ggLnRjbAotQWRkSWNvbiAvaWNvbnMvdGV4LmdpZiAudGV4Ci1BZGRJY29uIC9pY29ucy9ib21iLmdpZiBjb3JlCi0KLUFkZEljb24gL2ljb25zL2JhY2suZ2lmIC4uCi1BZGRJY29uIC9pY29ucy9oYW5kLnJpZ2h0LmdpZiBSRUFETUUKLUFkZEljb24gL2ljb25zL2ZvbGRlci5naWYgXl5ESVJFQ1RPUlleXgotQWRkSWNvbiAvaWNvbnMvYmxhbmsuZ2lmIF5eQkxBTktJQ09OXl4KLQotIwotIyBEZWZhdWx0SWNvbiBpcyB3aGljaCBpY29uIHRvIHNob3cgZm9yIGZpbGVzIHdoaWNoIGRvIG5vdCBoYXZlIGFuIGljb24KLSMgZXhwbGljaXRseSBzZXQuCi0jCi1EZWZhdWx0SWNvbiAvaWNvbnMvdW5rbm93bi5naWYKLQotIwotIyBBZGREZXNjcmlwdGlvbiBhbGxvd3MgeW91IHRvIHBsYWNlIGEgc2hvcnQgZGVzY3JpcHRpb24gYWZ0ZXIgYSBmaWxlIGluCi0jIHNlcnZlci1nZW5lcmF0ZWQgaW5kZXhlcy4gIFRoZXNlIGFyZSBvbmx5IGRpc3BsYXllZCBmb3IgRmFuY3lJbmRleGVkCi0jIGRpcmVjdG9yaWVzLgotIyBGb3JtYXQ6IEFkZERlc2NyaXB0aW9uICJkZXNjcmlwdGlvbiIgZmlsZW5hbWUKLSMKLSNBZGREZXNjcmlwdGlvbiAiR1pJUCBjb21wcmVzc2VkIGRvY3VtZW50IiAuZ3oKLSNBZGREZXNjcmlwdGlvbiAidGFyIGFyY2hpdmUiIC50YXIKLSNBZGREZXNjcmlwdGlvbiAiR1pJUCBjb21wcmVzc2VkIHRhciBhcmNoaXZlIiAudGd6Ci0KLSMKLSMgUmVhZG1lTmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgUkVBRE1FIGZpbGUgdGhlIHNlcnZlciB3aWxsIGxvb2sgZm9yIGJ5Ci0jIGRlZmF1bHQsIGFuZCBhcHBlbmQgdG8gZGlyZWN0b3J5IGxpc3RpbmdzLgotIwotIyBIZWFkZXJOYW1lIGlzIHRoZSBuYW1lIG9mIGEgZmlsZSB3aGljaCBzaG91bGQgYmUgcHJlcGVuZGVkIHRvCi0jIGRpcmVjdG9yeSBpbmRleGVzLiAKLSMKLSMgVGhlIHNlcnZlciB3aWxsIGZpcnN0IGxvb2sgZm9yIG5hbWUuaHRtbCBhbmQgaW5jbHVkZSBpdCBpZiBmb3VuZC4KLSMgSWYgbmFtZS5odG1sIGRvZXNuJ3QgZXhpc3QsIHRoZSBzZXJ2ZXIgd2lsbCB0aGVuIGxvb2sgZm9yIG5hbWUudHh0Ci0jIGFuZCBpbmNsdWRlIGl0IGFzIHBsYWludGV4dCBpZiBmb3VuZC4KLSMKLVJlYWRtZU5hbWUgUkVBRE1FCi1IZWFkZXJOYW1lIEhFQURFUgotCi0jCi0jIEluZGV4SWdub3JlIGlzIGEgc2V0IG9mIGZpbGVuYW1lcyB3aGljaCBkaXJlY3RvcnkgaW5kZXhpbmcgc2hvdWxkIGlnbm9yZQotIyBhbmQgbm90IGluY2x1ZGUgaW4gdGhlIGxpc3RpbmcuICBTaGVsbC1zdHlsZSB3aWxkY2FyZGluZyBpcyBwZXJtaXR0ZWQuCi0jCi1JbmRleElnbm9yZSAuPz8qICp+ICojIEhFQURFUiogUkVBRE1FKiBSQ1MgQ1ZTICosdiAqLHQKLQotIwotIyBBZGRFbmNvZGluZyBhbGxvd3MgeW91IHRvIGhhdmUgY2VydGFpbiBicm93c2VycyAoTW9zYWljL1ggMi4xKykgdW5jb21wcmVzcwotIyBpbmZvcm1hdGlvbiBvbiB0aGUgZmx5LiBOb3RlOiBOb3QgYWxsIGJyb3dzZXJzIHN1cHBvcnQgdGhpcy4KLSMgRGVzcGl0ZSB0aGUgbmFtZSBzaW1pbGFyaXR5LCB0aGUgZm9sbG93aW5nIEFkZCogZGlyZWN0aXZlcyBoYXZlIG5vdGhpbmcKLSMgdG8gZG8gd2l0aCB0aGUgRmFuY3lJbmRleGluZyBjdXN0b21pc2F0aW9uIGRpcmVjdGl2ZXMgYWJvdmUuCi0jCi1BZGRFbmNvZGluZyB4LWNvbXByZXNzIFoKLUFkZEVuY29kaW5nIHgtZ3ppcCBneiB0Z3oKLQotIwotIyBBZGRMYW5ndWFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGxhbmd1YWdlIG9mIGEgZG9jdW1lbnQuIFlvdSBjYW4KLSMgdGhlbiB1c2UgY29udGVudCBuZWdvdGlhdGlvbiB0byBnaXZlIGEgYnJvd3NlciBhIGZpbGUgaW4gYSBsYW5ndWFnZQotIyBpdCBjYW4gdW5kZXJzdGFuZC4gIE5vdGUgdGhhdCB0aGUgc3VmZml4IGRvZXMgbm90IGhhdmUgdG8gYmUgdGhlIHNhbWUKLSMgYXMgdGhlIGxhbmd1YWdlIGtleXdvcmQgLS0tIHRob3NlIHdpdGggZG9jdW1lbnRzIGluIFBvbGlzaCAod2hvc2UKLSMgbmV0LXN0YW5kYXJkIGxhbmd1YWdlIGNvZGUgaXMgcGwpIG1heSB3aXNoIHRvIHVzZSAiQWRkTGFuZ3VhZ2UgcGwgLnBvIiAKLSMgdG8gYXZvaWQgdGhlIGFtYmlndWl0eSB3aXRoIHRoZSBjb21tb24gc3VmZml4IGZvciBwZXJsIHNjcmlwdHMuCi0jCi1BZGRMYW5ndWFnZSBlbiAuZW4KLUFkZExhbmd1YWdlIGZyIC5mcgotQWRkTGFuZ3VhZ2UgZGUgLmRlCi1BZGRMYW5ndWFnZSBkYSAuZGEKLUFkZExhbmd1YWdlIGVsIC5lbAotQWRkTGFuZ3VhZ2UgaXQgLml0Ci0KLSMKLSMgTGFuZ3VhZ2VQcmlvcml0eSBhbGxvd3MgeW91IHRvIGdpdmUgcHJlY2VkZW5jZSB0byBzb21lIGxhbmd1YWdlcwotIyBpbiBjYXNlIG9mIGEgdGllIGR1cmluZyBjb250ZW50IG5lZ290aWF0aW9uLgotIyBKdXN0IGxpc3QgdGhlIGxhbmd1YWdlcyBpbiBkZWNyZWFzaW5nIG9yZGVyIG9mIHByZWZlcmVuY2UuCi0jCi1MYW5ndWFnZVByaW9yaXR5IGVuIGZyIGRlCi0KLSMKLSMgQWRkVHlwZSBhbGxvd3MgeW91IHRvIHR3ZWFrIG1pbWUudHlwZXMgd2l0aG91dCBhY3R1YWxseSBlZGl0aW5nIGl0LCBvciB0bwotIyBtYWtlIGNlcnRhaW4gZmlsZXMgdG8gYmUgY2VydGFpbiB0eXBlcy4KLSMKLSMgRm9yIGV4YW1wbGUsIHRoZSBQSFAzIG1vZHVsZSAobm90IHBhcnQgb2YgdGhlIEFwYWNoZSBkaXN0cmlidXRpb24pCi0jIHdpbGwgdHlwaWNhbGx5IHVzZToKLSMKLSNBZGRUeXBlIGFwcGxpY2F0aW9uL3gtaHR0cGQtcGhwMyAucGh0bWwKLSNBZGRUeXBlIGFwcGxpY2F0aW9uL3gtaHR0cGQtcGhwMy1zb3VyY2UgLnBocHMKLQotQWRkVHlwZSBhcHBsaWNhdGlvbi94LXRhciAudGd6Ci0KLSMKLSMgQWRkSGFuZGxlciBhbGxvd3MgeW91IHRvIG1hcCBjZXJ0YWluIGZpbGUgZXh0ZW5zaW9ucyB0byAiaGFuZGxlcnMiLAotIyBhY3Rpb25zIHVucmVsYXRlZCB0byBmaWxldHlwZS4gVGhlc2UgY2FuIGJlIGVpdGhlciBidWlsdCBpbnRvIHRoZSBzZXJ2ZXIKLSMgb3IgYWRkZWQgd2l0aCB0aGUgQWN0aW9uIGNvbW1hbmQgKHNlZSBiZWxvdykKLSMKLSMgSWYgeW91IHdhbnQgdG8gdXNlIHNlcnZlciBzaWRlIGluY2x1ZGVzLCBvciBDR0kgb3V0c2lkZQotIyBTY3JpcHRBbGlhc2VkIGRpcmVjdG9yaWVzLCB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lcy4KLSMKLSMgVG8gdXNlIENHSSBzY3JpcHRzOgotIwotI0FkZEhhbmRsZXIgY2dpLXNjcmlwdCAuY2dpCi0KLSMKLSMgVG8gdXNlIHNlcnZlci1wYXJzZWQgSFRNTCBmaWxlcwotIwotI0FkZFR5cGUgdGV4dC9odG1sIC5zaHRtbAotI0FkZEhhbmRsZXIgc2VydmVyLXBhcnNlZCAuc2h0bWwKLQotIwotIyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIGVuYWJsZSBBcGFjaGUncyBzZW5kLWFzaXMgSFRUUCBmaWxlCi0jIGZlYXR1cmUKLSMKLSNBZGRIYW5kbGVyIHNlbmQtYXMtaXMgYXNpcwotCi0jCi0jIElmIHlvdSB3aXNoIHRvIHVzZSBzZXJ2ZXItcGFyc2VkIGltYWdlbWFwIGZpbGVzLCB1c2UKLSMKLSNBZGRIYW5kbGVyIGltYXAtZmlsZSBtYXAKLQotIwotIyBUbyBlbmFibGUgdHlwZSBtYXBzLCB5b3UgbWlnaHQgd2FudCB0byB1c2UKLSMKLSNBZGRIYW5kbGVyIHR5cGUtbWFwIHZhcgotCi0jCi0jIEFjdGlvbiBsZXRzIHlvdSBkZWZpbmUgbWVkaWEgdHlwZXMgdGhhdCB3aWxsIGV4ZWN1dGUgYSBzY3JpcHQgd2hlbmV2ZXIKLSMgYSBtYXRjaGluZyBmaWxlIGlzIGNhbGxlZC4gVGhpcyBlbGltaW5hdGVzIHRoZSBuZWVkIGZvciByZXBlYXRlZCBVUkwKLSMgcGF0aG5hbWVzIGZvciBvZnQtdXNlZCBDR0kgZmlsZSBwcm9jZXNzb3JzLgotIyBGb3JtYXQ6IEFjdGlvbiBtZWRpYS90eXBlIC9jZ2ktc2NyaXB0L2xvY2F0aW9uCi0jIEZvcm1hdDogQWN0aW9uIGhhbmRsZXItbmFtZSAvY2dpLXNjcmlwdC9sb2NhdGlvbgotIwotCi0jCi0jIE1ldGFEaXI6IHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIEFwYWNoZSBjYW4gZmluZAotIyBtZXRhIGluZm9ybWF0aW9uIGZpbGVzLiBUaGVzZSBmaWxlcyBjb250YWluIGFkZGl0aW9uYWwgSFRUUCBoZWFkZXJzCi0jIHRvIGluY2x1ZGUgd2hlbiBzZW5kaW5nIHRoZSBkb2N1bWVudAotIwotI01ldGFEaXIgLndlYgotCi0jCi0jIE1ldGFTdWZmaXg6IHNwZWNpZmllcyB0aGUgZmlsZSBuYW1lIHN1ZmZpeCBmb3IgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSMgbWV0YSBpbmZvcm1hdGlvbi4KLSMKLSNNZXRhU3VmZml4IC5tZXRhCi0KLSMKLSMgQ3VzdG9taXphYmxlIGVycm9yIHJlc3BvbnNlIChBcGFjaGUgc3R5bGUpCi0jICB0aGVzZSBjb21lIGluIHRocmVlIGZsYXZvcnMKLSMKLSMgICAgMSkgcGxhaW4gdGV4dAotI0Vycm9yRG9jdW1lbnQgNTAwICJUaGUgc2VydmVyIG1hZGUgYSBib28gYm9vLgotIyAgbi5iLiAgdGhlICgiKSBtYXJrcyBpdCBhcyB0ZXh0LCBpdCBkb2VzIG5vdCBnZXQgb3V0cHV0Ci0jCi0jICAgIDIpIGxvY2FsIHJlZGlyZWN0cwotI0Vycm9yRG9jdW1lbnQgNDA0IC9taXNzaW5nLmh0bWwKLSMgIHRvIHJlZGlyZWN0IHRvIGxvY2FsIFVSTCAvbWlzc2luZy5odG1sCi0jRXJyb3JEb2N1bWVudCA0MDQgL2NnaS1iaW4vbWlzc2luZ19oYW5kbGVyLnBsCi0jICBOLkIuOiBZb3UgY2FuIHJlZGlyZWN0IHRvIGEgc2NyaXB0IG9yIGEgZG9jdW1lbnQgdXNpbmcgc2VydmVyLXNpZGUtaW5jbHVkZXMuCi0jCi0jICAgIDMpIGV4dGVybmFsIHJlZGlyZWN0cwotI0Vycm9yRG9jdW1lbnQgNDAyIGh0dHA6Ly9zb21lLm90aGVyX3NlcnZlci5jb20vc3Vic2NyaXB0aW9uX2luZm8uaHRtbAotIyAgTi5CLjogTWFueSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwKLSMgIHJlcXVlc3Qgd2lsbCAqbm90KiBiZSBhdmFpbGFibGUgdG8gc3VjaCBhIHNjcmlwdC4KLQotIwotIyBUaGUgZm9sbG93aW5nIGRpcmVjdGl2ZXMgZGlzYWJsZSBrZWVwYWxpdmVzIGFuZCBIVFRQIGhlYWRlciBmbHVzaGVzLgotIyBUaGUgZmlyc3QgZGlyZWN0aXZlIGRpc2FibGVzIGl0IGZvciBOZXRzY2FwZSAyLnggYW5kIGJyb3dzZXJzIHdoaWNoCi0jIHNwb29mIGl0LiBUaGVyZSBhcmUga25vd24gcHJvYmxlbXMgd2l0aCB0aGVzZS4KLSMgVGhlIHNlY29uZCBkaXJlY3RpdmUgaXMgZm9yIE1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciA0LjBiMgotIyB3aGljaCBoYXMgYSBicm9rZW4gSFRUUC8xLjEgaW1wbGVtZW50YXRpb24gYW5kIGRvZXMgbm90IHByb3Blcmx5Ci0jIHN1cHBvcnQga2VlcGFsaXZlIHdoZW4gaXQgaXMgdXNlZCBvbiAzMDEgb3IgMzAyIChyZWRpcmVjdCkgcmVzcG9uc2VzLgotIwotQnJvd3Nlck1hdGNoICJNb3ppbGxhLzIiIG5va2VlcGFsaXZlCi1Ccm93c2VyTWF0Y2ggIk1TSUUgNFwuMGIyOyIgbm9rZWVwYWxpdmUgZG93bmdyYWRlLTEuMCBmb3JjZS1yZXNwb25zZS0xLjAKLQotIwotIyBUaGUgZm9sbG93aW5nIGRpcmVjdGl2ZSBkaXNhYmxlcyBIVFRQLzEuMSByZXNwb25zZXMgdG8gYnJvd3NlcnMgd2hpY2gKLSMgYXJlIGluIHZpb2xhdGlvbiBvZiB0aGUgSFRUUC8xLjAgc3BlYyBieSBub3QgYmVpbmcgYWJsZSB0byBncm9rIGEKLSMgYmFzaWMgMS4xIHJlc3BvbnNlLgotIwotQnJvd3Nlck1hdGNoICJSZWFsUGxheWVyIDRcLjAiIGZvcmNlLXJlc3BvbnNlLTEuMAotQnJvd3Nlck1hdGNoICJKYXZhLzFcLjAiIGZvcmNlLXJlc3BvbnNlLTEuMAotQnJvd3Nlck1hdGNoICJKREsvMVwuMCIgZm9yY2UtcmVzcG9uc2UtMS4wCi0KLSMKLSMgQWxsb3cgc2VydmVyIHN0YXR1cyByZXBvcnRzLCB3aXRoIHRoZSBVUkwgb2YgaHR0cDovL3NlcnZlcm5hbWUvc2VydmVyLXN0YXR1cwotIyBDaGFuZ2UgdGhlICIueW91cl9kb21haW4uY29tIiB0byBtYXRjaCB5b3VyIGRvbWFpbiB0byBlbmFibGUuCi0jCi0jPExvY2F0aW9uIC9zZXJ2ZXItc3RhdHVzPgotIyAgICBTZXRIYW5kbGVyIHNlcnZlci1zdGF0dXMKLSMgICAgT3JkZXIgZGVueSxhbGxvdwotIyAgICBEZW55IGZyb20gYWxsCi0jICAgIEFsbG93IGZyb20gLnlvdXJfZG9tYWluLmNvbQotIzwvTG9jYXRpb24+Ci0KLSMKLSMgQWxsb3cgcmVtb3RlIHNlcnZlciBjb25maWd1cmF0aW9uIHJlcG9ydHMsIHdpdGggdGhlIFVSTCBvZgotIyAgaHR0cDovL3NlcnZlcm5hbWUvc2VydmVyLWluZm8gKHJlcXVpcmVzIHRoYXQgbW9kX2luZm8uYyBiZSBsb2FkZWQpLgotIyBDaGFuZ2UgdGhlICIueW91cl9kb21haW4uY29tIiB0byBtYXRjaCB5b3VyIGRvbWFpbiB0byBlbmFibGUuCi0jCi0jPExvY2F0aW9uIC9zZXJ2ZXItaW5mbz4KLSMgICAgU2V0SGFuZGxlciBzZXJ2ZXItaW5mbwotIyAgICBPcmRlciBkZW55LGFsbG93Ci0jICAgIERlbnkgZnJvbSBhbGwKLSMgICAgQWxsb3cgZnJvbSAueW91cl9kb21haW4uY29tCi0jPC9Mb2NhdGlvbj4KLQotIwotIyBUaGVyZSBoYXZlIGJlZW4gcmVwb3J0cyBvZiBwZW9wbGUgdHJ5aW5nIHRvIGFidXNlIGFuIG9sZCBidWcgZnJvbSBwcmUtMS4xCi0jIGRheXMuICBUaGlzIGJ1ZyBpbnZvbHZlZCBhIENHSSBzY3JpcHQgZGlzdHJpYnV0ZWQgYXMgYSBwYXJ0IG9mIEFwYWNoZS4KLSMgQnkgdW5jb21tZW50aW5nIHRoZXNlIGxpbmVzIHlvdSBjYW4gcmVkaXJlY3QgdGhlc2UgYXR0YWNrcyB0byBhIGxvZ2dpbmcgCi0jIHNjcmlwdCBvbiBwaGYuYXBhY2hlLm9yZy4gIE9yLCB5b3UgY2FuIHJlY29yZCB0aGVtIHlvdXJzZWxmLCB1c2luZyB0aGUgc2NyaXB0Ci0jIHN1cHBvcnQvcGhmX2FidXNlX2xvZy5jZ2kuCi0jCi0jPExvY2F0aW9uIC9jZ2ktYmluL3BoZio+Ci0jICAgIERlbnkgZnJvbSBhbGwKLSMgICAgRXJyb3JEb2N1bWVudCA0MDMgaHR0cDovL3BoZi5hcGFjaGUub3JnL3BoZl9hYnVzZV9sb2cuY2dpCi0jPC9Mb2NhdGlvbj4KLQotIwotIyBQcm94eSBTZXJ2ZXIgZGlyZWN0aXZlcy4gVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSB0bwotIyBlbmFibGUgdGhlIHByb3h5IHNlcnZlcjoKLSMKLSNQcm94eVJlcXVlc3RzIE9uCi0KLSMKLSMgRW5hYmxlL2Rpc2FibGUgdGhlIGhhbmRsaW5nIG9mIEhUVFAvMS4xICJWaWE6IiBoZWFkZXJzLgotIyAoIkZ1bGwiIGFkZHMgdGhlIHNlcnZlciB2ZXJzaW9uOyAiQmxvY2siIHJlbW92ZXMgYWxsIG91dGdvaW5nIFZpYTogaGVhZGVycykKLSMgU2V0IHRvIG9uZSBvZjogT2ZmIHwgT24gfCBGdWxsIHwgQmxvY2sKLSMKLSNQcm94eVZpYSBPbgotCi0jCi0jIFRvIGVuYWJsZSB0aGUgY2FjaGUgYXMgd2VsbCwgZWRpdCBhbmQgdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZXM6Ci0jIChubyBjYWNoZWluZyB3aXRob3V0IENhY2hlUm9vdCkKLSMKLSNDYWNoZVJvb3QgIkBAU2VydmVyUm9vdEBAL3Byb3h5IgotI0NhY2hlU2l6ZSA1Ci0jQ2FjaGVHY0ludGVydmFsIDQKLSNDYWNoZU1heEV4cGlyZSAyNAotI0NhY2hlTGFzdE1vZGlmaWVkRmFjdG9yIDAuMQotI0NhY2hlRGVmYXVsdEV4cGlyZSAxCi0jTm9DYWNoZSBhX2RvbWFpbi5jb20gYW5vdGhlcl9kb21haW4uZWR1IGpvZXMuZ2FyYWdlX3NhbGUuY29tCi0KLSMjIyBTZWN0aW9uIDM6IFZpcnR1YWwgSG9zdHMKLSMKLSMgVmlydHVhbEhvc3Q6IElmIHlvdSB3YW50IHRvIG1haW50YWluIG11bHRpcGxlIGRvbWFpbnMvaG9zdG5hbWVzIG9uIHlvdXIKLSMgbWFjaGluZSB5b3UgY2FuIHNldHVwIFZpcnR1YWxIb3N0IGNvbnRhaW5lcnMgZm9yIHRoZW0uCi0jIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50YXRpb24gYXQgPFVSTDpodHRwOi8vd3d3LmFwYWNoZS5vcmcvZG9jcy92aG9zdHMvPgotIyBmb3IgZnVydGhlciBkZXRhaWxzIGJlZm9yZSB5b3UgdHJ5IHRvIHNldHVwIHZpcnR1YWwgaG9zdHMuCi0jIFlvdSBtYXkgdXNlIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9uICctUycgdG8gdmVyaWZ5IHlvdXIgdmlydHVhbCBob3N0Ci0jIGNvbmZpZ3VyYXRpb24uCi0KLSMKLSMgSWYgeW91IHdhbnQgdG8gdXNlIG5hbWUtYmFzZWQgdmlydHVhbCBob3N0cyB5b3UgbmVlZCB0byBkZWZpbmUgYXQKLSMgbGVhc3Qgb25lIElQIGFkZHJlc3MgKGFuZCBwb3J0IG51bWJlcikgZm9yIHRoZW0uCi0jCi0jTmFtZVZpcnR1YWxIb3N0IDEyLjM0LjU2Ljc4OjgwCi0jTmFtZVZpcnR1YWxIb3N0IDEyLjM0LjU2Ljc4Ci0KLSMKLSMgVmlydHVhbEhvc3QgZXhhbXBsZToKLSMgQWxtb3N0IGFueSBBcGFjaGUgZGlyZWN0aXZlIG1heSBnbyBpbnRvIGEgVmlydHVhbEhvc3QgY29udGFpbmVyLgotIwotIzxWaXJ0dWFsSG9zdCBpcC5hZGRyZXNzLm9mLmhvc3Quc29tZV9kb21haW4uY29tPgotIyAgICBTZXJ2ZXJBZG1pbiB3ZWJtYXN0ZXJAaG9zdC5zb21lX2RvbWFpbi5jb20KLSMgICAgRG9jdW1lbnRSb290IC93d3cvZG9jcy9ob3N0LnNvbWVfZG9tYWluLmNvbQotIyAgICBTZXJ2ZXJOYW1lIGhvc3Quc29tZV9kb21haW4uY29tCi0jICAgIEVycm9yTG9nIGxvZ3MvaG9zdC5zb21lX2RvbWFpbi5jb20tZXJyb3JfbG9nCi0jICAgIEN1c3RvbUxvZyBsb2dzL2hvc3Quc29tZV9kb21haW4uY29tLWFjY2Vzc19sb2cgY29tbW9uCi0jPC9WaXJ0dWFsSG9zdD4KLQotIzxWaXJ0dWFsSG9zdCBfZGVmYXVsdF86Kj4KLSM8L1ZpcnR1YWxIb3N0PgpkaWZmIC0tZ2l0IGEvZG9jcy9jb25mL21hZ2ljIGIvZG9jcy9jb25mL21hZ2ljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODViNzkzLi4wMDAwMDAwCi0tLSBhL2RvY3MvY29uZi9tYWdpYworKysgL2Rldi9udWxsCkBAIC0xLDM3MSArMCwwIEBACi0jIE1hZ2ljIGRhdGEgZm9yIG1vZF9taW1lX21hZ2ljIEFwYWNoZSBtb2R1bGUgKG9yaWdpbmFsbHkgZm9yIGZpbGUoMSkgY29tbWFuZCkKLSMgVGhlIG1vZHVsZSBpcyBkZXNjcmliZWQgaW4gaHRkb2NzL21hbnVhbC9tb2QvbW9kX21pbWVfbWFnaWMuaHRtbAotIwotIyBUaGUgZm9ybWF0IGlzIDQtNSBjb2x1bW5zOgotIyAgICBDb2x1bW4gIzE6IGJ5dGUgbnVtYmVyIHRvIGJlZ2luIGNoZWNraW5nIGZyb20sICI+IiBpbmRpY2F0ZXMgY29udGludWF0aW9uCi0jICAgIENvbHVtbiAjMjogdHlwZSBvZiBkYXRhIHRvIG1hdGNoCi0jICAgIENvbHVtbiAjMzogY29udGVudHMgb2YgZGF0YSB0byBtYXRjaAotIyAgICBDb2x1bW4gIzQ6IE1JTUUgdHlwZSBvZiByZXN1bHQKLSMgICAgQ29sdW1uICM1OiBNSU1FIGVuY29kaW5nIG9mIHJlc3VsdCAob3B0aW9uYWwpCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTG9jYWxzdHVmZjogIGZpbGUoMSkgbWFnaWMgZm9yIGxvY2FsbHkgb2JzZXJ2ZWQgZmlsZXMKLSMgQWRkIGFueSBsb2NhbGx5IG9ic2VydmVkIGZpbGVzIGhlcmUuCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgZW5kIGxvY2FsIHN0dWZmCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgSmF2YQotCi0wCXNob3J0CQkweGNhZmUKLT4yCXNob3J0CQkweGJhYmUJCWFwcGxpY2F0aW9uL2phdmEKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBhdWRpbzogIGZpbGUoMSkgbWFnaWMgZm9yIHNvdW5kIGZvcm1hdHMKLSMKLSMgZnJvbSBKYW4gTmljb2xhaSBMYW5nZmVsZHQgPGphbmxAaWZpLnVpby5ubz4sCi0jCi0KLSMgU3VuL05lWFQgYXVkaW8gZGF0YQotMAlzdHJpbmcJCS5zbmQKLT4xMgliZWxvbmcJCTEJCWF1ZGlvL2Jhc2ljCi0+MTIJYmVsb25nCQkyCQlhdWRpby9iYXNpYwotPjEyCWJlbG9uZwkJMwkJYXVkaW8vYmFzaWMKLT4xMgliZWxvbmcJCTQJCWF1ZGlvL2Jhc2ljCi0+MTIJYmVsb25nCQk1CQlhdWRpby9iYXNpYwotPjEyCWJlbG9uZwkJNgkJYXVkaW8vYmFzaWMKLT4xMgliZWxvbmcJCTcJCWF1ZGlvL2Jhc2ljCi0KLT4xMgliZWxvbmcJCTIzCQlhdWRpby94LWFkcGNtCi0KLSMgREVDIHN5c3RlbXMgKGUuZy4gREVDc3RhdGlvbiA1MDAwKSB1c2UgYSB2YXJpYW50IG9mIHRoZSBTdW4vTmVYVCBmb3JtYXQKLSMgdGhhdCB1c2VzIGxpdHRsZS1lbmRpYW4gZW5jb2RpbmcgYW5kIGhhcyBhIGRpZmZlcmVudCBtYWdpYyBudW1iZXIKLSMgKDB4MDA2NDczMkUgaW4gbGl0dGxlLWVuZGlhbiBlbmNvZGluZykuCi0wCWxlbG9uZwkJMHgwMDY0NzMyRQkKLT4xMglsZWxvbmcJCTEJCWF1ZGlvL3gtZGVjLWJhc2ljCi0+MTIJbGVsb25nCQkyCQlhdWRpby94LWRlYy1iYXNpYwotPjEyCWxlbG9uZwkJMwkJYXVkaW8veC1kZWMtYmFzaWMKLT4xMglsZWxvbmcJCTQJCWF1ZGlvL3gtZGVjLWJhc2ljCi0+MTIJbGVsb25nCQk1CQlhdWRpby94LWRlYy1iYXNpYwotPjEyCWxlbG9uZwkJNgkJYXVkaW8veC1kZWMtYmFzaWMKLT4xMglsZWxvbmcJCTcJCWF1ZGlvL3gtZGVjLWJhc2ljCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NlZCAoRy43MjEgQURQQ00pCi0+MTIJbGVsb25nCQkyMwkJYXVkaW8veC1kZWMtYWRwY20KLQotIyBCeXRlcyAwLTMgb2YgQUlGRiwgQUlGRi1DLCAmIDhTVlggYXVkaW8gZmlsZXMgYXJlICJGT1JNIgotIwkJCQkJQUlGRiBhdWRpbyBkYXRhCi04CXN0cmluZwkJQUlGRgkJYXVkaW8veC1haWZmCQotIwkJCQkJQUlGRi1DIGF1ZGlvIGRhdGEKLTgJc3RyaW5nCQlBSUZDCQlhdWRpby94LWFpZmYJCi0jCQkJCQlJRkYvOFNWWCBhdWRpbyBkYXRhCi04CXN0cmluZwkJOFNWWAkJYXVkaW8veC1haWZmCQotCi0jIENyZWF0aXZlIExhYnMgQVVESU8gc3R1ZmYKLSMJCQkJCVN0YW5kYXJkIE1JREkgZGF0YQotMAlzdHJpbmcJTVRoZAkJCWF1ZGlvL3Vua25vd24JCi0jPjkgCWJ5dGUJPjAJCQkoZm9ybWF0ICVkKQotIz4xMQlieXRlCT4xCQkJdXNpbmcgJWQgY2hhbm5lbHMKLSMJCQkJCUNyZWF0aXZlIE11c2ljIChDTUYpIGRhdGEKLTAJc3RyaW5nCUNUTUYJCQlhdWRpby91bmtub3duCQotIwkJCQkJU291bmRCbGFzdGVyIGluc3RydW1lbnQgZGF0YQotMAlzdHJpbmcJU0JJCQkJYXVkaW8vdW5rbm93bgkKLSMJCQkJCUNyZWF0aXZlIExhYnMgdm9pY2UgZGF0YQotMAlzdHJpbmcJQ3JlYXRpdmVcIFZvaWNlXCBGaWxlCWF1ZGlvL3Vua25vd24JCi0jIyBpcyB0aGlzIG5leHQgbGluZSByaWdodD8gIGl0IGNhbWUgdGhpcyB3YXkuLi4KLSM+MTkJYnl0ZQkweDFBCi0jPjIzCWJ5dGUJPjAJCQktIHZlcnNpb24gJWQKLSM+MjIJYnl0ZQk+MAkJCVxiLiVkCi0KLSMgW0dSUiA5NTAxMTU6ICBpcyB0aGlzIGFsc28gQ3JlYXRpdmUgTGFicz8gIEd1ZXNzaW5nIHRoYXQgZmlyc3QgbGluZQotIyAgc2hvdWxkIGJlIHN0cmluZyBpbnN0ZWFkIG9mIHVua25vd24tZW5kaWFuIGxvbmcuLi5dCi0jMAlsb25nCQkweDRlNTQ1MjRiCU11bHRpVHJhY2sgc291bmQgZGF0YQotIzAJc3RyaW5nCQlOVFJLCQlNdWx0aVRyYWNrIHNvdW5kIGRhdGEKLSM+NAlsb25nCQl4CQktIHZlcnNpb24gJWxkCi0KLSMgTWljcm9zb2Z0IFdBVkUgZm9ybWF0ICgqLndhdikKLSMgW0dSUiA5NTAxMTU6ICBwcm9iYWJseSBhbGwgb2YgdGhlIHNob3J0cyBhbmQgbG9uZ3Mgc2hvdWxkIGJlIGxlc2hvcnQvbGVsb25nXQotIwkJCQkJTWljcm9zb2Z0IFJJRkYKLTAJc3RyaW5nCQlSSUZGCQlhdWRpby91bmtub3duCQotIwkJCQkJLSBXQVZFIGZvcm1hdAotPjgJc3RyaW5nCQlXQVZFCQlhdWRpby94LXdhdgkKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBjLWxhbmc6ICBmaWxlKDEpIG1hZ2ljIGZvciBDIHByb2dyYW1zIG9yIHZhcmlvdXMgc2NyaXB0cwotIwotCi0jIFhQTSBpY29ucyAoR3JlZyBSb2Vsb2ZzLCBuZXd0QHVjaGljYWdvLmVkdSkKLSMgaWRlYWxseSBzaG91bGQgZ28gaW50byAiaW1hZ2VzIiwgYnV0IGVudHJpZXMgYmVsb3cgd291bGQgdGFnIFhQTSBhcyBDIHNvdXJjZQotMAlzdHJpbmcJCS8qXCBYUE0JCWltYWdlL3gteGJtCTdiaXQKLQotIyB0aGlzIGZpcnN0IHdpbGwgdXBzZXQgeW91IGlmIHlvdSdyZSBhIFBMLzEgc2hvcC4uLiAoYXJlIHRoZXJlIGFueSBsZWZ0PykKLSMgaW4gd2hpY2ggY2FzZSBybSBpdDsgYXNjbWFnaWMgd2lsbCBjYXRjaCByZWFsIEMgcHJvZ3JhbXMKLSMJCQkJCUMgb3IgUkVYWCBwcm9ncmFtIHRleHQKLTAJc3RyaW5nCQkvKgkJdGV4dC9wbGFpbgotIwkJCQkJQysrIHByb2dyYW0gdGV4dAotMAlzdHJpbmcJCS8vCQl0ZXh0L3BsYWluCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgY29tcHJlc3M6ICBmaWxlKDEpIG1hZ2ljIGZvciBwdXJlLWNvbXByZXNzaW9uIGZvcm1hdHMgKG5vIGFyY2hpdmVzKQotIwotIyBjb21wcmVzcywgZ3ppcCwgcGFjaywgY29tcGFjdCwgaHVmLCBzcXVlZXplLCBjcnVuY2gsIGZyZWV6ZSwgeWFiYmEsIHdoYXAsIGV0Yy4KLSMKLSMgRm9ybWF0cyBmb3IgdmFyaW91cyBmb3JtcyBvZiBjb21wcmVzc2VkIGRhdGEKLSMgRm9ybWF0cyBmb3IgImNvbXByZXNzIiBwcm9wZXIgaGF2ZSBiZWVuIG1vdmVkIGludG8gImNvbXByZXNzLmMiLAotIyBiZWNhdXNlIGl0IHRyaWVzIHRvIHVuY29tcHJlc3MgaXQgdG8gZmlndXJlIG91dCB3aGF0J3MgaW5zaWRlLgotCi0jIHN0YW5kYXJkIHVuaXggY29tcHJlc3MKLTAJc3RyaW5nCQlcMDM3XDIzNQlhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0JeC1jb21wcmVzcwotCi0jIGd6aXAgKEdOVSB6aXAsIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIFtJbmZvLVpJUC9QS1dBUkVdIHppcCBhcmNoaXZlcikKLTAgICAgICAgc3RyaW5nICAgICAgICAgIFwwMzdcMjEzICAgICAgICBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0JeC1nemlwCi0KLSMgQWNjb3JkaW5nIHRvIGd6aXAuaCwgdGhpcyBpcyB0aGUgY29ycmVjdCBieXRlIG9yZGVyIGZvciBwYWNrZWQgZGF0YS4KLTAJc3RyaW5nCQlcMDM3XDAzNglhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KLSMKLSMgVGhpcyBtYWdpYyBudW1iZXIgaXMgYnl0ZS1vcmRlci1pbmRlcGVuZGVudC4KLSMKLTAJc2hvcnQJCTAxNzQzNwkJYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCi0KLSMgWFhYIC0gd2h5ICp0d28qIGVudHJpZXMgZm9yICJjb21wYWN0ZWQgZGF0YSIsIG9uZSBvZiB3aGljaCBpcwotIyBieXRlLW9yZGVyIGluZGVwZW5kZW50LCBhbmQgb25lIG9mIHdoaWNoIGlzIGJ5dGUtb3JkZXIgZGVwZW5kZW50PwotIwotIyBjb21wYWN0ZWQgZGF0YQotMAlzaG9ydAkJMHgxZmZmCQlhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KLTAJc3RyaW5nCQlcMzc3XDAzNwlhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KLSMgaHVmIG91dHB1dAotMAlzaG9ydAkJMDE0NTQwNQkJYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCi0KLSMgU3F1ZWV6ZSBhbmQgQ3J1bmNoLi4uCi0jIFRoZXNlIG51bWJlcnMgd2VyZSBnbGVhbmVkIGZyb20gdGhlIFVuaXggdmVyc2lvbnMgb2YgdGhlIHByb2dyYW1zIHRvCi0jIGhhbmRsZSB0aGVzZSBmb3JtYXRzLiAgTm90ZSB0aGF0IEkgY2FuIG9ubHkgdW5jcnVuY2gsIG5vdCBjcnVuY2gsIGFuZAotIyBJIGRpZG4ndCBoYXZlIGEgY3J1bmNoZWQgZmlsZSBoYW5keSwgc28gdGhlIGNydW5jaCBudW1iZXIgaXMgdW50ZXN0ZWQuCi0jCQkJCUtlaXRoIFdhY2xlbmEgPGtlaXRoQGNlcmJlcnVzLnVjaGljYWdvLmVkdT4KLSMwCWxlc2hvcnQJCTB4NzZGRgkJc3F1ZWV6ZWQgZGF0YSAoQ1AvTSwgRE9TKQotIzAJbGVzaG9ydAkJMHg3NkZFCQljcnVuY2hlZCBkYXRhIChDUC9NLCBET1MpCi0KLSMgRnJlZXplCi0jMAlzdHJpbmcJCVwwMzdcMjM3CUZyb3plbiBmaWxlIDIuMQotIzAJc3RyaW5nCQlcMDM3XDIzNglGcm96ZW4gZmlsZSAxLjAgKG9yIGd6aXAgMC41KQotCi0jIGx6aD8KLSMwCXN0cmluZwkJXDAzN1wyNDAJTFpIIGNvbXByZXNzZWQgZGF0YQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGZyYW1lOiAgZmlsZSgxKSBtYWdpYyBmb3IgRnJhbWVNYWtlciBmaWxlcwotIwotIyBUaGlzIHN0dWZmIGNhbWUgb24gYSBGcmFtZU1ha2VyIGRlbW8gdGFwZSwgbW9zdCBvZiB3aGljaCBpcwotIyBjb3B5cmlnaHQsIGJ1dCB0aGlzIGZpbGUgaXMgInB1Ymxpc2hlZCIgYXMgd2l0bmVzcyB0aGUgZm9sbG93aW5nOgotIwotMAlzdHJpbmcJCVw8TWFrZXJGaWxlCWFwcGxpY2F0aW9uL3gtZnJhbWUKLTAJc3RyaW5nCQlcPE1JRkZpbGUJYXBwbGljYXRpb24veC1mcmFtZQotMAlzdHJpbmcJCVw8TWFrZXJEaWN0aW9uYXJ5CWFwcGxpY2F0aW9uL3gtZnJhbWUKLTAJc3RyaW5nCQlcPE1ha2VyU2NyZWVuRm9uCWFwcGxpY2F0aW9uL3gtZnJhbWUKLTAJc3RyaW5nCQlcPE1NTAkJYXBwbGljYXRpb24veC1mcmFtZQotMAlzdHJpbmcJCVw8Qm9vawkJYXBwbGljYXRpb24veC1mcmFtZQotMAlzdHJpbmcJCVw8TWFrZXIJCWFwcGxpY2F0aW9uL3gtZnJhbWUKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBodG1sOiAgZmlsZSgxKSBtYWdpYyBmb3IgSFRNTCAoSHlwZXJUZXh0IE1hcmt1cCBMYW5ndWFnZSkgZG9jcwotIwotIyBmcm9tIERhbmllbCBRdWlubGFuIDxxdWlubGFuQHlnZ2RyYXNpbC5jb20+Ci0jIGFuZCBBbm5hIFNoZXJnb2xkIDxhbm5hQGluZXh0LmNvLnVrPgotIwotMAlzdHJpbmcJCVw8IURPQ1RZUEVcIEhUTUwJdGV4dC9odG1sCi0wCXN0cmluZwkJXDwhZG9jdHlwZVwgaHRtbAl0ZXh0L2h0bWwKLTAJc3RyaW5nCQlcPEhFQUQJCXRleHQvaHRtbAotMAlzdHJpbmcJCVw8aGVhZAkJdGV4dC9odG1sCi0wCXN0cmluZwkJXDxUSVRMRQkJdGV4dC9odG1sCi0wCXN0cmluZwkJXDx0aXRsZQkJdGV4dC9odG1sCi0wICAgICAgIHN0cmluZyAgICAgICAgICBcPGh0bWwgICAgICAgICAgdGV4dC9odG1sCi0wICAgICAgIHN0cmluZyAgICAgICAgICBcPEhUTUwgICAgICAgICAgdGV4dC9odG1sCi0wCXN0cmluZwkJXDwhLS0JCXRleHQvaHRtbAotMAlzdHJpbmcJCVw8aDEJCXRleHQvaHRtbAotMAlzdHJpbmcJCVw8SDEJCXRleHQvaHRtbAotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGltYWdlczogIGZpbGUoMSkgbWFnaWMgZm9yIGltYWdlIGZvcm1hdHMgKHNlZSBhbHNvICJjLWxhbmciIGZvciBYUE0gYml0bWFwcykKLSMKLSMgb3JpZ2luYWxseSBmcm9tIGplZkBoZWxpb3MuZWUubGJsLmdvdiAoSmVmIFBvc2thbnplciksCi0jIGFkZGl0aW9ucyBieSBqYW5sQGlmaS51aW8ubm8gYXMgd2VsbCBhcyBvdGhlcnMuIEphbiBhbHNvIHN1Z2dlc3RlZAotIyBtZXJnaW5nIHNldmVyYWwgb25lLSBhbmQgdHdvLWxpbmUgZmlsZXMgaW50byBoZXJlLgotIwotIyBYWFggLSBieXRlIG9yZGVyIGZvciBHSUYgYW5kIFRJRkYgZmllbGRzPwotIyBbR1JSOiAgVElGRiBhbGxvd3MgYm90aCBieXRlIG9yZGVyczsgR0lGIGlzIHByb2JhYmx5IGxpdHRsZS1lbmRpYW5dCi0jCi0KLSMgW0dSUjogIHdoYXQgdGhlIGhlbGwgaXMgdGhpcyBkb2luZyBpbiBoZXJlP10KLSMwCXN0cmluZwkJeGJ0b2EJCWJ0b2EnZCBmaWxlCi0KLSMgUEJNUExVUwotIwkJCQkJUEJNIGZpbGUKLTAJc3RyaW5nCQlQMQkJaW1hZ2UveC1wb3J0YWJsZS1iaXRtYXAJN2JpdAotIwkJCQkJUEdNIGZpbGUKLTAJc3RyaW5nCQlQMgkJaW1hZ2UveC1wb3J0YWJsZS1ncmV5bWFwCTdiaXQKLSMJCQkJCVBQTSBmaWxlCi0wCXN0cmluZwkJUDMJCWltYWdlL3gtcG9ydGFibGUtcGl4bWFwCTdiaXQKLSMJCQkJCVBCTSAicmF3Yml0cyIgZmlsZQotMAlzdHJpbmcJCVA0CQlpbWFnZS94LXBvcnRhYmxlLWJpdG1hcAotIwkJCQkJUEdNICJyYXdiaXRzIiBmaWxlCi0wCXN0cmluZwkJUDUJCWltYWdlL3gtcG9ydGFibGUtZ3JleW1hcAotIwkJCQkJUFBNICJyYXdiaXRzIiBmaWxlCi0wCXN0cmluZwkJUDYJCWltYWdlL3gtcG9ydGFibGUtcGl4bWFwCi0KLSMgTklGRiAoTmF2eSBJbnRlcmNoYW5nZSBGaWxlIEZvcm1hdCwgYSBtb2RpZmljYXRpb24gb2YgVElGRikKLSMgW0dSUjogIHRoaXMgKm11c3QqIGdvIGJlZm9yZSBUSUZGXQotMAlzdHJpbmcJCUlJTjEJCWltYWdlL3gtbmlmZgotCi0jIFRJRkYgYW5kIGZyaWVuZHMKLSMJCQkJCVRJRkYgZmlsZSwgYmlnLWVuZGlhbgotMAlzdHJpbmcJCU1NCQlpbWFnZS90aWZmCi0jCQkJCQlUSUZGIGZpbGUsIGxpdHRsZS1lbmRpYW4KLTAJc3RyaW5nCQlJSQkJaW1hZ2UvdGlmZgotCi0jIHBvc3NpYmxlIEdJRiByZXBsYWNlbWVudHM7IG5vbmUgeWV0IHJlbGVhc2VkIQotIyAoR3JlZyBSb2Vsb2ZzLCBuZXd0QHVjaGljYWdvLmVkdSkKLSMKLSMgR1JSIDk1MDExNTogIHRoaXMgd2FzIG1pbmUgKCJaaXAgR0lGIik6Ci0jCQkJCQlaSUYgaW1hZ2UgKEdJRitkZWZsYXRlIGFscGhhKQotMAlzdHJpbmcJCUdJRjk0egkJaW1hZ2UvdW5rbm93bgotIwotIyBHUlIgOTUwMTE1OiAgdGhpcyBpcyBKZXJlbXkgV29obCdzIEZyZWUgR3JhcGhpY3MgRm9ybWF0IChiZXR0ZXIpOgotIwkJCQkJRkdGIGltYWdlIChHSUYrZGVmbGF0ZSBiZXRhKQotMAlzdHJpbmcJCUZHRjk1YQkJaW1hZ2UvdW5rbm93bgotIwotIyBHUlIgOTUwMTE1OiAgdGhpcyBpcyBUaG9tYXMgQm91dGVsbCdzIFBvcnRhYmxlIEJpdG1hcCBGb3JtYXQgcHJvcG9zYWwKLSMgKGJlc3Q7IG5vdCB5ZXQgaW1wbGVtZW50ZWQpOgotIwkJCQkJUEJGIGltYWdlIChkZWZsYXRlIGNvbXByZXNzaW9uKQotMAlzdHJpbmcJCVBCRgkJaW1hZ2UvdW5rbm93bgotCi0jIEdJRgotMAlzdHJpbmcJCUdJRgkJaW1hZ2UvZ2lmCi0KLSMgSlBFRyBpbWFnZXMKLTAJYmVzaG9ydAkJMHhmZmQ4CQlpbWFnZS9qcGVnCi0KLSMgUEMgYml0bWFwcyAoT1MvMiwgV2luZG96ZSBCTVAgZmlsZXMpICAoR3JlZyBSb2Vsb2ZzLCBuZXd0QHVjaGljYWdvLmVkdSkKLTAJc3RyaW5nCQlCTQkJaW1hZ2UvYm1wCi0jPjE0CWJ5dGUJCTEyCQkoT1MvMiAxLnggZm9ybWF0KQotIz4xNAlieXRlCQk2NAkJKE9TLzIgMi54IGZvcm1hdCkKLSM+MTQJYnl0ZQkJNDAJCShXaW5kb3dzIDMueCBmb3JtYXQpCi0jMAlzdHJpbmcJCUlDCQlpY29uCi0jMAlzdHJpbmcJCVBJCQlwb2ludGVyCi0jMAlzdHJpbmcJCUNJCQljb2xvciBpY29uCi0jMAlzdHJpbmcJCUNQCQljb2xvciBwb2ludGVyCi0jMAlzdHJpbmcJCUJBCQliaXRtYXAgYXJyYXkKLQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGxpc3A6ICBmaWxlKDEpIG1hZ2ljIGZvciBsaXNwIHByb2dyYW1zCi0jCi0jIHZhcmlvdXMgbGlzcCB0eXBlcywgZnJvbSBEYW5pZWwgUXVpbmxhbiAocXVpbmxhbkB5Z2dkcmFzaWwuY29tKQotMAlzdHJpbmcJOzsJCQl0ZXh0L3BsYWluCThiaXQKLSMgRW1hY3MgMTggLSB0aGlzIGlzIGFsd2F5cyBjb3JyZWN0LCBidXQgbm90IHZlcnkgbWFnaWNhbC4KLTAJc3RyaW5nCVwwMTIoCQkJYXBwbGljYXRpb24veC1lbGMKLSMgRW1hY3MgMTkKLTAJc3RyaW5nCTtFTENcMDIzXDAwMFwwMDBcMDAwCWFwcGxpY2F0aW9uL3gtZWxjCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgbWFpbC5uZXdzOiAgZmlsZSgxKSBtYWdpYyBmb3IgbWFpbCBhbmQgbmV3cwotIwotIyBUaGVyZSBhcmUgdGVzdHMgdG8gYXNjbWFnaWMuYyB0byBjb3BlIHdpdGggbWFpbCBhbmQgbmV3cy4KLTAJc3RyaW5nCQlSZWxheS1WZXJzaW9uOiAJbWVzc2FnZS9yZmM4MjIJN2JpdAotMAlzdHJpbmcJCSMhXCBybmV3cwltZXNzYWdlL3JmYzgyMgk3Yml0Ci0wCXN0cmluZwkJTiMhXCBybmV3cwltZXNzYWdlL3JmYzgyMgk3Yml0Ci0wCXN0cmluZwkJRm9yd2FyZFwgdG8gCW1lc3NhZ2UvcmZjODIyCTdiaXQKLTAJc3RyaW5nCQlQaXBlXCB0byAJbWVzc2FnZS9yZmM4MjIJN2JpdAotMAlzdHJpbmcJCVJldHVybi1QYXRoOgltZXNzYWdlL3JmYzgyMgk3Yml0Ci0wCXN0cmluZwkJUGF0aDoJCW1lc3NhZ2UvbmV3cwk4Yml0Ci0wCXN0cmluZwkJWHJlZjoJCW1lc3NhZ2UvbmV3cwk4Yml0Ci0wCXN0cmluZwkJRnJvbToJCW1lc3NhZ2UvcmZjODIyCTdiaXQKLTAJc3RyaW5nCQlBcnRpY2xlIAltZXNzYWdlL25ld3MJOGJpdAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBtc3dvcmQ6IGZpbGUoMSkgbWFnaWMgZm9yIE1TIFdvcmQgZmlsZXMKLSMKLSMgQ29udHJpYnV0b3IgY2xhaW1zOgotIyBSZXZlcnNlZC1lbmdpbmVlcmVkIE1TIFdvcmQgbWFnaWMgbnVtYmVycwotIwotCi0wCXN0cmluZwkJXDM3NlwwNjdcMFwwNDMJCQlhcHBsaWNhdGlvbi9tc3dvcmQKLTAJc3RyaW5nCQlcMzMzXDI0NS1cMFwwXDAJCQlhcHBsaWNhdGlvbi9tc3dvcmQKLQotIyBkaXNhYmxlIHRoaXMgb25lIGJlY2F1c2UgaXQgYXBwbGllcyBhbHNvIHRvIG90aGVyCi0jIE9mZmljZS9PTEUgZG9jdW1lbnRzIGZvciB3aGljaCBtc3dvcmQgaXMgbm90IGNvcnJlY3QuIFNlZSBQUiMyNjA4LgotIzAJc3RyaW5nCQlcMzIwXDMxN1wwMjFcMzQwXDI0MVwyNjEJYXBwbGljYXRpb24vbXN3b3JkCi0KLQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIHByaW50ZXI6ICBmaWxlKDEpIG1hZ2ljIGZvciBwcmludGVyLWZvcm1hdHRlZCBmaWxlcwotIwotCi0jIFBvc3RTY3JpcHQKLTAJc3RyaW5nCQklIQkJYXBwbGljYXRpb24vcG9zdHNjcmlwdAotMAlzdHJpbmcJCVwwMDQlIQkJYXBwbGljYXRpb24vcG9zdHNjcmlwdAotCi0jIEFjcm9iYXQKLSMgKGR1ZSB0byBjbGFtZW5AY3MuY211LmVkdSkKLTAJc3RyaW5nCQklUERGLQkJYXBwbGljYXRpb24vcGRmCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgc2M6ICBmaWxlKDEpIG1hZ2ljIGZvciAic2MiIHNwcmVhZHNoZWV0Ci0jCi0zOAlzdHJpbmcJCVNwcmVhZHNoZWV0CWFwcGxpY2F0aW9uL3gtc2MKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyB0ZXg6ICBmaWxlKDEpIG1hZ2ljIGZvciBUZVggZmlsZXMKLSMKLSMgWFhYIC0gbmVlZHMgYnl0ZS1lbmRpYW4gc3R1ZmYgKGJpZy1lbmRpYW4gYW5kIGxpdHRsZS1lbmRpYW4gRFZJPykKLSMKLSMgRnJvbSA8Y29ua2xpbkB0YWxpc21hbi5rYWxlaWRhLmNvbT4KLQotIyBBbHRob3VnaCB3ZSBtYXkga25vdyB0aGUgb2Zmc2V0IG9mIGNlcnRhaW4gdGV4dCBmaWVsZHMgaW4gVGVYIERWSQotIyBhbmQgZm9udCBmaWxlcywgd2UgY2FuJ3QgdXNlIHRoZW0gcmVsaWFibHkgYmVjYXVzZSB0aGV5IGFyZSBub3QKLSMgemVybyB0ZXJtaW5hdGVkLiBbYnV0IHdlIGRvIGFueXdheSwgY2hyaXN0b3NdCi0wCXN0cmluZwkJXDM2N1wwMDIJYXBwbGljYXRpb24veC1kdmkKLSMwCXN0cmluZwkJXDM2N1wyMDMJVGVYIGdlbmVyaWMgZm9udCBkYXRhCi0jMAlzdHJpbmcJCVwzNjdcMTMxCVRlWCBwYWNrZWQgZm9udCBkYXRhCi0jMAlzdHJpbmcJCVwzNjdcMzEyCVRlWCB2aXJ0dWFsIGZvbnQgZGF0YQotIzAJc3RyaW5nCQlUaGlzXCBpc1wgVGVYLAlUZVggdHJhbnNjcmlwdCB0ZXh0CQotIzAJc3RyaW5nCQlUaGlzXCBpc1wgTUVUQUZPTlQsCU1FVEFGT05UIHRyYW5zY3JpcHQgdGV4dAotCi0jIFRoZXJlIGlzIG5vIHdheSB0byBkZXRlY3QgVGVYIEZvbnQgTWV0cmljICgqLnRmbSkgZmlsZXMgd2l0aG91dAotIyBicmVha2luZyB0aGVtIGFwYXJ0IGFuZCByZWFkaW5nIHRoZSBkYXRhLiAgVGhlIGZvbGxvd2luZyBwYXR0ZXJucwotIyBtYXRjaCBtb3N0ICoudGZtIGZpbGVzIGdlbmVyYXRlZCBieSBNRVRBRk9OVCBvciBhZm0ydGZtLgotIzIJc3RyaW5nCQlcMDAwXDAyMQlUZVggZm9udCBtZXRyaWMgZGF0YQotIzIJc3RyaW5nCQlcMDAwXDAyMglUZVggZm9udCBtZXRyaWMgZGF0YQotIz4zNAlzdHJpbmcJCT5cMAkJKCVzKQotCi0jIFRleGluZm8gYW5kIEdOVSBJbmZvLCBmcm9tIERhbmllbCBRdWlubGFuIChxdWlubGFuQHlnZ2RyYXNpbC5jb20pCi0jMAlzdHJpbmcJCVxcaW5wdXRcIHRleGluZm8JVGV4aW5mbyBzb3VyY2UgdGV4dAotIzAJc3RyaW5nCQlUaGlzXCBpc1wgSW5mb1wgZmlsZQlHTlUgSW5mbyB0ZXh0Ci0KLSMgY29ycmVjdCBUZVggbWFnaWMgZm9yIExpbnV4IChhbmQgbWF5YmUgbW9yZSkKLSMgZnJvbSBQZXRlciBUb2JpYXMgKHRvYmlhc0BzZXJ2ZXIuZXQtaW5mLmZoby1lbWRlbi5kZSkKLSMKLTAJbGVzaG9ydAkJMHgwMmY3CQlhcHBsaWNhdGlvbi94LWR2aQotCi0jIFJURiAtIFJpY2ggVGV4dCBGb3JtYXQKLTAJc3RyaW5nCQl7XFxydGYJCWFwcGxpY2F0aW9uL3J0ZgotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGFuaW1hdGlvbjogIGZpbGUoMSkgbWFnaWMgZm9yIGFuaW1hdGlvbi9tb3ZpZSBmb3JtYXRzCi0jCi0jIGFuaW1hdGlvbiBmb3JtYXRzLCBvcmlnaW5hbGx5IGZyb20gdmF4QGNjd2YuY2MudXRleGFzLmVkdSAoVmFYI244KQotIwkJCQkJCU1QRUcgZmlsZQotMAlzdHJpbmcJCVwwMDBcMDAwXDAwMVwyNjMJdmlkZW8vbXBlZwotIwotIyBUaGUgY29udHJpYnV0b3IgY2xhaW1zOgotIyAgIEkgY291bGRuJ3QgZmluZCBhIHJlYWwgbWFnaWMgbnVtYmVyIGZvciB0aGVzZSwgaG93ZXZlciwgdGhpcwotIyAgIC1hcHBlYXJzLSB0byB3b3JrLiAgTm90ZSB0aGF0IGl0IG1pZ2h0IGNhdGNoIG90aGVyIGZpbGVzLCB0b28sCi0jICAgc28gQkUgQ0FSRUZVTCEKLSMKLSMgTm90ZSB0aGF0IHRpdGxlIGFuZCBhdXRob3IgYXBwZWFyIGluIHRoZSB0d28gMjAtYnl0ZSBjaHVua3MKLSMgYXQgZGVjaW1hbCBvZmZzZXRzIDIgYW5kIDIyLCByZXNwZWN0aXZlbHksIGJ1dCB0aGV5IGFyZSBYT1InZWQgd2l0aAotIyAyNTUgKGhleCBGRikhIERMIGZvcm1hdCBTVUNLUyBCSUcgUk9DS1MuCi0jCi0jCQkJCQkJREwgZmlsZSB2ZXJzaW9uIDEgLCBtZWRpdW0gZm9ybWF0ICgxNjB4MTAwLCA0IGltYWdlcy9zY3JlZW4pCi0wCWJ5dGUJCTEJCQl2aWRlby91bmtub3duCi0wCWJ5dGUJCTIJCQl2aWRlby91bmtub3duCi0KZGlmZiAtLWdpdCBhL2RvY3MvY29uZi9taW1lLnR5cGVzIGIvZG9jcy9jb25mL21pbWUudHlwZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1M2RiMGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9jb25mL21pbWUudHlwZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotIyBUaGlzIGlzIGEgY29tbWVudC4gSSBsb3ZlIGNvbW1lbnRzLgotCi0jIFRoaXMgZmlsZSBjb250cm9scyB3aGF0IEludGVybmV0IG1lZGlhIHR5cGVzIGFyZSBzZW50IHRvIHRoZSBjbGllbnQgZm9yCi0jIGdpdmVuIGZpbGUgZXh0ZW5zaW9uKHMpLiAgU2VuZGluZyB0aGUgY29ycmVjdCBtZWRpYSB0eXBlIHRvIHRoZSBjbGllbnQKLSMgaXMgaW1wb3J0YW50IHNvIHRoZXkga25vdyBob3cgdG8gaGFuZGxlIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlLgotIyBFeHRyYSB0eXBlcyBjYW4gZWl0aGVyIGJlIGFkZGVkIGhlcmUgb3IgYnkgdXNpbmcgYW4gQWRkVHlwZSBkaXJlY3RpdmUKLSMgaW4geW91ciBjb25maWcgZmlsZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IEludGVybmV0IG1lZGlhIHR5cGVzLAotIyBwbGVhc2UgcmVhZCBSRkMgMjA0NSwgMjA0NiwgMjA0NywgMjA0OCwgYW5kIDIwNzcuICBUaGUgSW50ZXJuZXQgbWVkaWEgdHlwZQotIyByZWdpc3RyeSBpcyBhdCA8ZnRwOi8vZnRwLmlhbmEub3JnL2luLW5vdGVzL2lhbmEvYXNzaWdubWVudHMvbWVkaWEtdHlwZXMvPi4KLQotIyBNSU1FIHR5cGUJCQlFeHRlbnNpb24KLWFwcGxpY2F0aW9uL0VESS1Db25zZW50Ci1hcHBsaWNhdGlvbi9FREktWDEyCi1hcHBsaWNhdGlvbi9FRElGQUNUCi1hcHBsaWNhdGlvbi9hY3RpdmVtZXNzYWdlCi1hcHBsaWNhdGlvbi9hbmRyZXctaW5zZXQJZXoKLWFwcGxpY2F0aW9uL2FwcGxlZmlsZQotYXBwbGljYXRpb24vYXRvbWljbWFpbAotYXBwbGljYXRpb24vY2Fscy0xODQwCi1hcHBsaWNhdGlvbi9jb21tb25ncm91bmQKLWFwcGxpY2F0aW9uL2N5YmVyY2FzaAotYXBwbGljYXRpb24vZGNhLXJmdAotYXBwbGljYXRpb24vZGVjLWR4Ci1hcHBsaWNhdGlvbi9lc2hvcAotYXBwbGljYXRpb24vaHlwZXJzdHVkaW8KLWFwcGxpY2F0aW9uL2lnZXMKLWFwcGxpY2F0aW9uL21hYy1iaW5oZXg0MAlocXgKLWFwcGxpY2F0aW9uL21hYy1jb21wYWN0cHJvCWNwdAotYXBwbGljYXRpb24vbWFjd3JpdGVpaQotYXBwbGljYXRpb24vbWFyYwotYXBwbGljYXRpb24vbWF0aGVtYXRpY2EKLWFwcGxpY2F0aW9uL21zd29yZAkJZG9jCi1hcHBsaWNhdGlvbi9uZXdzLW1lc3NhZ2UtaWQKLWFwcGxpY2F0aW9uL25ld3MtdHJhbnNtaXNzaW9uCi1hcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0JYmluIGRtcyBsaGEgbHpoIGV4ZSBjbGFzcwotYXBwbGljYXRpb24vb2RhCQkJb2RhCi1hcHBsaWNhdGlvbi9wZGYJCQlwZGYKLWFwcGxpY2F0aW9uL3BncC1lbmNyeXB0ZWQKLWFwcGxpY2F0aW9uL3BncC1rZXlzCi1hcHBsaWNhdGlvbi9wZ3Atc2lnbmF0dXJlCi1hcHBsaWNhdGlvbi9wa2NzMTAKLWFwcGxpY2F0aW9uL3BrY3M3LW1pbWUKLWFwcGxpY2F0aW9uL3BrY3M3LXNpZ25hdHVyZQotYXBwbGljYXRpb24vcG9zdHNjcmlwdAkJYWkgZXBzIHBzCi1hcHBsaWNhdGlvbi9wcnMuYWx2ZXN0cmFuZC50aXRyYXgtc2hlZXQKLWFwcGxpY2F0aW9uL3Bycy5jd3cKLWFwcGxpY2F0aW9uL3Bycy5ucHJlbmQKLWFwcGxpY2F0aW9uL3JlbW90ZS1wcmludGluZwotYXBwbGljYXRpb24vcmlzY29zCi1hcHBsaWNhdGlvbi9ydGYJCQlydGYKLWFwcGxpY2F0aW9uL3NldC1wYXltZW50Ci1hcHBsaWNhdGlvbi9zZXQtcGF5bWVudC1pbml0aWF0aW9uCi1hcHBsaWNhdGlvbi9zZXQtcmVnaXN0cmF0aW9uCi1hcHBsaWNhdGlvbi9zZXQtcmVnaXN0cmF0aW9uLWluaXRpYXRpb24KLWFwcGxpY2F0aW9uL3NnbWwKLWFwcGxpY2F0aW9uL3NnbWwtb3Blbi1jYXRhbG9nCi1hcHBsaWNhdGlvbi9zbGF0ZQotYXBwbGljYXRpb24vc21pbAkJc21pIHNtaWwKLWFwcGxpY2F0aW9uL3ZlbW1pCi1hcHBsaWNhdGlvbi92bmQuM00uUG9zdC1pdC1Ob3RlcwotYXBwbGljYXRpb24vdm5kLkZsb0dyYXBoSXQKLWFwcGxpY2F0aW9uL3ZuZC5hY3Vjb2JvbAotYXBwbGljYXRpb24vdm5kLmFuc2VyLXdlYi1jZXJ0aWZpY2F0ZS1pc3N1ZS1pbml0aWF0aW9uCi1hcHBsaWNhdGlvbi92bmQuYW5zZXItd2ViLWZ1bmRzLXRyYW5zZmVyLWluaXRpYXRpb24KLWFwcGxpY2F0aW9uL3ZuZC5hdWRpb2dyYXBoCi1hcHBsaWNhdGlvbi92bmQuYnVzaW5lc3NvYmplY3RzCi1hcHBsaWNhdGlvbi92bmQuY2xheW1vcmUKLWFwcGxpY2F0aW9uL3ZuZC5jb21zb2NhbGxlcgotYXBwbGljYXRpb24vdm5kLmRuYQotYXBwbGljYXRpb24vdm5kLmR4cgotYXBwbGljYXRpb24vdm5kLmVjZGlzLXVwZGF0ZQotYXBwbGljYXRpb24vdm5kLmVjb3dpbi5jaGFydAotYXBwbGljYXRpb24vdm5kLmVjb3dpbi5maWxlcmVxdWVzdAotYXBwbGljYXRpb24vdm5kLmVjb3dpbi5maWxldXBkYXRlCi1hcHBsaWNhdGlvbi92bmQuZWNvd2luLnNlcmllcwotYXBwbGljYXRpb24vdm5kLmVjb3dpbi5zZXJpZXNyZXF1ZXN0Ci1hcHBsaWNhdGlvbi92bmQuZWNvd2luLnNlcmllc3VwZGF0ZQotYXBwbGljYXRpb24vdm5kLmVubGl2ZW4KLWFwcGxpY2F0aW9uL3ZuZC5lcHNvbi5zYWx0Ci1hcHBsaWNhdGlvbi92bmQuZmRmCi1hcHBsaWNhdGlvbi92bmQuZmZzbnMKLWFwcGxpY2F0aW9uL3ZuZC5mcmFtZW1ha2VyCi1hcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5cwotYXBwbGljYXRpb24vdm5kLmZ1aml0c3Uub2FzeXMyCi1hcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5czMKLWFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzZ3AKLWFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzcHJzCi1hcHBsaWNhdGlvbi92bmQuZnVqaXhlcm94LmRvY3V3b3JrcwotYXBwbGljYXRpb24vdm5kLmhwLUhQR0wKLWFwcGxpY2F0aW9uL3ZuZC5ocC1QQ0wKLWFwcGxpY2F0aW9uL3ZuZC5ocC1QQ0xYTAotYXBwbGljYXRpb24vdm5kLmhwLWhwcwotYXBwbGljYXRpb24vdm5kLmlibS5NaW5pUGF5Ci1hcHBsaWNhdGlvbi92bmQuaWJtLm1vZGNhcAotYXBwbGljYXRpb24vdm5kLmludGVyY29uLmZvcm1uZXQKLWFwcGxpY2F0aW9uL3ZuZC5pbnRlcnRydXN0LmRpZ2lib3gKLWFwcGxpY2F0aW9uL3ZuZC5pbnRlcnRydXN0Lm5uY3AKLWFwcGxpY2F0aW9uL3ZuZC5pcy14cHIKLWFwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC1kaXJlY3Rvcnktc2VydmljZQotYXBwbGljYXRpb24vdm5kLmphcGFubmV0LWpwbnN0b3JlLXdha2V1cAotYXBwbGljYXRpb24vdm5kLmphcGFubmV0LXBheW1lbnQtd2FrZXVwCi1hcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtcmVnaXN0cmF0aW9uCi1hcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtcmVnaXN0cmF0aW9uLXdha2V1cAotYXBwbGljYXRpb24vdm5kLmphcGFubmV0LXNldHN0b3JlLXdha2V1cAotYXBwbGljYXRpb24vdm5kLmphcGFubmV0LXZlcmlmaWNhdGlvbgotYXBwbGljYXRpb24vdm5kLmphcGFubmV0LXZlcmlmaWNhdGlvbi13YWtldXAKLWFwcGxpY2F0aW9uL3ZuZC5rb2FuCi1hcHBsaWNhdGlvbi92bmQubG90dXMtMS0yLTMKLWFwcGxpY2F0aW9uL3ZuZC5sb3R1cy1hcHByb2FjaAotYXBwbGljYXRpb24vdm5kLmxvdHVzLWZyZWVsYW5jZQotYXBwbGljYXRpb24vdm5kLmxvdHVzLW9yZ2FuaXplcgotYXBwbGljYXRpb24vdm5kLmxvdHVzLXNjcmVlbmNhbQotYXBwbGljYXRpb24vdm5kLmxvdHVzLXdvcmRwcm8KLWFwcGxpY2F0aW9uL3ZuZC5tZXJpZGlhbi1zbGluZ3Nob3QKLWFwcGxpY2F0aW9uL3ZuZC5taWYJCW1pZgotYXBwbGljYXRpb24vdm5kLm1pbmlzb2Z0LWhwMzAwMC1zYXZlCi1hcHBsaWNhdGlvbi92bmQubWl0c3ViaXNoaS5taXN0eS1ndWFyZC50cnVzdHdlYgotYXBwbGljYXRpb24vdm5kLm1zLWFydGdhbHJ5Ci1hcHBsaWNhdGlvbi92bmQubXMtYXNmCi1hcHBsaWNhdGlvbi92bmQubXMtZXhjZWwJeGxzCi1hcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludAlwcHQKLWFwcGxpY2F0aW9uL3ZuZC5tcy1wcm9qZWN0Ci1hcHBsaWNhdGlvbi92bmQubXMtdG5lZgotYXBwbGljYXRpb24vdm5kLm1zLXdvcmtzCi1hcHBsaWNhdGlvbi92bmQubXVzaWMtbmlmZgotYXBwbGljYXRpb24vdm5kLm11c2ljaWFuCi1hcHBsaWNhdGlvbi92bmQubmV0ZnB4Ci1hcHBsaWNhdGlvbi92bmQubm9ibGVuZXQtZGlyZWN0b3J5Ci1hcHBsaWNhdGlvbi92bmQubm9ibGVuZXQtc2VhbGVyCi1hcHBsaWNhdGlvbi92bmQubm9ibGVuZXQtd2ViCi1hcHBsaWNhdGlvbi92bmQubm92YWRpZ20uRURNCi1hcHBsaWNhdGlvbi92bmQubm92YWRpZ20uRURYCi1hcHBsaWNhdGlvbi92bmQubm92YWRpZ20uRVhUCi1hcHBsaWNhdGlvbi92bmQub3NhLm5ldGRlcGxveQotYXBwbGljYXRpb24vdm5kLnBvd2VyYnVpbGRlcjYKLWFwcGxpY2F0aW9uL3ZuZC5wb3dlcmJ1aWxkZXI2LXMKLWFwcGxpY2F0aW9uL3ZuZC5yYXBpZAotYXBwbGljYXRpb24vdm5kLnNlZW1haWwKLWFwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5mb3JtdGVtcGxhdGUKLWFwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5pbnRlcmNoYW5nZQotYXBwbGljYXRpb24vdm5kLnNoYW5hLmluZm9ybWVkLnBhY2thZ2UKLWFwcGxpY2F0aW9uL3ZuZC5zdHJlZXQtc3RyZWFtCi1hcHBsaWNhdGlvbi92bmQuc3ZkCi1hcHBsaWNhdGlvbi92bmQuc3dpZnR2aWV3LWljcwotYXBwbGljYXRpb24vdm5kLnRydWVkb2MKLWFwcGxpY2F0aW9uL3ZuZC52aXNpbwotYXBwbGljYXRpb24vdm5kLndlYnR1cmJvCi1hcHBsaWNhdGlvbi92bmQud3JxLWhwMzAwMC1sYWJlbGxlZAotYXBwbGljYXRpb24vdm5kLnd0LnN0ZgotYXBwbGljYXRpb24vdm5kLnhhcmEKLWFwcGxpY2F0aW9uL3ZuZC55ZWxsb3dyaXZlci1jdXN0b20tbWVudQotYXBwbGljYXRpb24vd2l0YQotYXBwbGljYXRpb24vd29yZHBlcmZlY3Q1LjEKLWFwcGxpY2F0aW9uL3gtYmNwaW8JCWJjcGlvCi1hcHBsaWNhdGlvbi94LWNkbGluawkJdmNkCi1hcHBsaWNhdGlvbi94LWNoZXNzLXBnbgkJcGduCi1hcHBsaWNhdGlvbi94LWNvbXByZXNzCi1hcHBsaWNhdGlvbi94LWNwaW8JCWNwaW8KLWFwcGxpY2F0aW9uL3gtY3NoCQljc2gKLWFwcGxpY2F0aW9uL3gtZGlyZWN0b3IJCWRjciBkaXIgZHhyCi1hcHBsaWNhdGlvbi94LWR2aQkJZHZpCi1hcHBsaWNhdGlvbi94LWZ1dHVyZXNwbGFzaAlzcGwKLWFwcGxpY2F0aW9uL3gtZ3RhcgkJZ3RhcgotYXBwbGljYXRpb24veC1nemlwCi1hcHBsaWNhdGlvbi94LWhkZgkJaGRmCi1hcHBsaWNhdGlvbi94LWphdmFzY3JpcHQJanMKLWFwcGxpY2F0aW9uL3gta29hbgkJc2twIHNrZCBza3Qgc2ttCi1hcHBsaWNhdGlvbi94LWxhdGV4CQlsYXRleAotYXBwbGljYXRpb24veC1uZXRjZGYJCW5jIGNkZgotYXBwbGljYXRpb24veC1zaAkJc2gKLWFwcGxpY2F0aW9uL3gtc2hhcgkJc2hhcgotYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2gJc3dmCi1hcHBsaWNhdGlvbi94LXN0dWZmaXQJCXNpdAotYXBwbGljYXRpb24veC1zdjRjcGlvCQlzdjRjcGlvCi1hcHBsaWNhdGlvbi94LXN2NGNyYwkJc3Y0Y3JjCi1hcHBsaWNhdGlvbi94LXRhcgkJdGFyCi1hcHBsaWNhdGlvbi94LXRjbAkJdGNsCi1hcHBsaWNhdGlvbi94LXRleAkJdGV4Ci1hcHBsaWNhdGlvbi94LXRleGluZm8JCXRleGluZm8gdGV4aQotYXBwbGljYXRpb24veC10cm9mZgkJdCB0ciByb2ZmCi1hcHBsaWNhdGlvbi94LXRyb2ZmLW1hbgkJbWFuCi1hcHBsaWNhdGlvbi94LXRyb2ZmLW1lCQltZQotYXBwbGljYXRpb24veC10cm9mZi1tcwkJbXMKLWFwcGxpY2F0aW9uL3gtdXN0YXIJCXVzdGFyCi1hcHBsaWNhdGlvbi94LXdhaXMtc291cmNlCXNyYwotYXBwbGljYXRpb24veDQwMC1icAotYXBwbGljYXRpb24veG1sCi1hcHBsaWNhdGlvbi96aXAJCQl6aXAKLWF1ZGlvLzMya2FkcGNtCi1hdWRpby9iYXNpYwkJCWF1IHNuZAotYXVkaW8vbWlkaQkJCW1pZCBtaWRpIGthcgotYXVkaW8vbXBlZwkJCW1wZ2EgbXAyIG1wMwotYXVkaW8vdm5kLnFjZWxwCi1hdWRpby94LWFpZmYJCQlhaWYgYWlmZiBhaWZjCi1hdWRpby94LXBuLXJlYWxhdWRpbwkJcmFtIHJtCi1hdWRpby94LXBuLXJlYWxhdWRpby1wbHVnaW4JcnBtCi1hdWRpby94LXJlYWxhdWRpbwkJcmEKLWF1ZGlvL3gtd2F2CQkJd2F2Ci1jaGVtaWNhbC94LXBkYgkJCXBkYiB4eXoKLWltYWdlL2JtcAkJCWJtcAotaW1hZ2UvY2dtCi1pbWFnZS9nM2ZheAotaW1hZ2UvZ2lmCQkJZ2lmCi1pbWFnZS9pZWYJCQlpZWYKLWltYWdlL2pwZWcJCQlqcGVnIGpwZyBqcGUKLWltYWdlL25hcGxwcwotaW1hZ2UvcG5nCQkJcG5nCi1pbWFnZS9wcnMuYnRpZgotaW1hZ2UvdGlmZgkJCXRpZmYgdGlmCi1pbWFnZS92bmQuZHdnCi1pbWFnZS92bmQuZHhmCi1pbWFnZS92bmQuZnB4Ci1pbWFnZS92bmQubmV0LWZweAotaW1hZ2Uvdm5kLnN2ZgotaW1hZ2Uvdm5kLnhpZmYKLWltYWdlL3gtY211LXJhc3RlcgkJcmFzCi1pbWFnZS94LXBvcnRhYmxlLWFueW1hcAkJcG5tCi1pbWFnZS94LXBvcnRhYmxlLWJpdG1hcAkJcGJtCi1pbWFnZS94LXBvcnRhYmxlLWdyYXltYXAJcGdtCi1pbWFnZS94LXBvcnRhYmxlLXBpeG1hcAkJcHBtCi1pbWFnZS94LXJnYgkJCXJnYgotaW1hZ2UveC14Yml0bWFwCQkJeGJtCi1pbWFnZS94LXhwaXhtYXAJCQl4cG0KLWltYWdlL3gteHdpbmRvd2R1bXAJCXh3ZAotbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMKLW1lc3NhZ2UvZGlzcG9zaXRpb24tbm90aWZpY2F0aW9uCi1tZXNzYWdlL2V4dGVybmFsLWJvZHkKLW1lc3NhZ2UvaHR0cAotbWVzc2FnZS9uZXdzCi1tZXNzYWdlL3BhcnRpYWwKLW1lc3NhZ2UvcmZjODIyCi1tb2RlbC9pZ2VzCQkJaWdzIGlnZXMKLW1vZGVsL21lc2gJCQltc2ggbWVzaCBzaWxvCi1tb2RlbC92bmQuZHdmCi1tb2RlbC92cm1sCQkJd3JsIHZybWwKLW11bHRpcGFydC9hbHRlcm5hdGl2ZQotbXVsdGlwYXJ0L2FwcGxlZG91YmxlCi1tdWx0aXBhcnQvYnl0ZXJhbmdlcwotbXVsdGlwYXJ0L2RpZ2VzdAotbXVsdGlwYXJ0L2VuY3J5cHRlZAotbXVsdGlwYXJ0L2Zvcm0tZGF0YQotbXVsdGlwYXJ0L2hlYWRlci1zZXQKLW11bHRpcGFydC9taXhlZAotbXVsdGlwYXJ0L3BhcmFsbGVsCi1tdWx0aXBhcnQvcmVsYXRlZAotbXVsdGlwYXJ0L3JlcG9ydAotbXVsdGlwYXJ0L3NpZ25lZAotbXVsdGlwYXJ0L3ZvaWNlLW1lc3NhZ2UKLXRleHQvY3NzCQkJY3NzCi10ZXh0L2RpcmVjdG9yeQotdGV4dC9lbnJpY2hlZAotdGV4dC9odG1sCQkJaHRtbCBodG0KLXRleHQvcGxhaW4JCQlhc2MgdHh0Ci10ZXh0L3Bycy5saW5lcy50YWcKLXRleHQvcmZjODIyLWhlYWRlcnMKLXRleHQvcmljaHRleHQJCQlydHgKLXRleHQvcnRmCQkJcnRmCi10ZXh0L3NnbWwJCQlzZ21sIHNnbQotdGV4dC90YWItc2VwYXJhdGVkLXZhbHVlcwl0c3YKLXRleHQvdXJpLWxpc3QKLXRleHQvdm5kLmFiYwotdGV4dC92bmQuZmxhdGxhbmQuM2RtbAotdGV4dC92bmQuZm1pLmZsZXhzdG9yCi10ZXh0L3ZuZC5pbjNkLjNkbWwKLXRleHQvdm5kLmluM2Quc3BvdAotdGV4dC92bmQubGF0ZXgtegotdGV4dC94LXNldGV4dAkJCWV0eAotdGV4dC94bWwJCQl4bWwKLXZpZGVvL21wZWcJCQltcGVnIG1wZyBtcGUKLXZpZGVvL3F1aWNrdGltZQkJCXF0IG1vdgotdmlkZW8vdm5kLm1vdG9yb2xhLnZpZGVvCi12aWRlby92bmQubW90b3JvbGEudmlkZW9wCi12aWRlby92bmQudml2bwotdmlkZW8veC1tc3ZpZGVvCQkJYXZpCi12aWRlby94LXNnaS1tb3ZpZQkJbW92aWUKLXgtY29uZmVyZW5jZS94LWNvb2x0YWxrCQlpY2UKZGlmZiAtLWdpdCBhL2RvY3MvZG9jcm9vdC9hcGFjaGVfcGIuZ2lmIGIvZG9jcy9kb2Nyb290L2FwYWNoZV9wYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMWMxMzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9kb2Nyb290L2FwYWNoZV9wYi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2RvY3Jvb3QvYXBhY2hlX3BiLnBuZyBiL2RvY3MvZG9jcm9vdC9hcGFjaGVfcGIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjk5YThjLi4wMDAwMDAwCi0tLSBhL2RvY3MvZG9jcm9vdC9hcGFjaGVfcGIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9kb2Nyb290L2FwYWNoZV9wYjIuZ2lmIGIvZG9jcy9kb2Nyb290L2FwYWNoZV9wYjIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTY3YzcxLi4wMDAwMDAwCi0tLSBhL2RvY3MvZG9jcm9vdC9hcGFjaGVfcGIyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvZG9jcm9vdC9hcGFjaGVfcGIyLnBuZyBiL2RvY3MvZG9jcm9vdC9hcGFjaGVfcGIyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiYWE3MC4uMDAwMDAwMAotLS0gYS9kb2NzL2RvY3Jvb3QvYXBhY2hlX3BiMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2RvY3Jvb3QvYXBhY2hlX3BiMl9hbmkuZ2lmIGIvZG9jcy9kb2Nyb290L2FwYWNoZV9wYjJfYW5pLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0MWMwMy4uMDAwMDAwMAotLS0gYS9kb2NzL2RvY3Jvb3QvYXBhY2hlX3BiMl9hbmkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwuY2EgYi9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5jYQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcxYTY4NS4uMDAwMDAwMAotLS0gYS9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5jYQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotIDxIRUFEPgotICA8VElUTEU+UCZhZ3JhdmU7Z2luYSBkZSBwcm92YSBkZSBsJ2luc3RhbCZtaWRkb3Q7bGFjaSZvYWN1dGU7IGQnQXBhY2hlPC9USVRMRT4KLSA8L0hFQUQ+Ci08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci0gPEJPRFkKLSAgQkdDT0xPUj0iI0ZGRkZGRiIKLSAgVEVYVD0iIzAwMDAwMCIKLSAgTElOSz0iIzAwMDBGRiIKLSAgVkxJTks9IiMwMDAwODAiCi0gIEFMSU5LPSIjRkYwMDAwIgotID4KLSAgPEgxIEFMSUdOPSJDRU5URVIiPgotICAgRnVuY2lvbmEmbmJzcDshICBFbCBzZXJ2aWRvciB3ZWIgQXBhY2hlIGVzdCZhZ3JhdmU7IGluc3RhbCZtaWRkb3Q7bGF0Ci0gICBlbiBhcXVlc3QgbGxvYyAmbmJzcDshCi0gIDwvSDE+Ci0gIDxQPgotICBTaSB2ZXUgYXF1ZXN0YSBwJmFncmF2ZTtnaW5hLCBlcyBxdWUgZWxzIHByb3BpZXRhcmlzIGQnYXF1ZXN0IGRvbWluaQotICBhY2FiZW4gZCdpbnN0YWwmbWlkZG90O2xhciBzYXRpc2ZhY3Qmb2dyYXZlO3JpYW1lbnQgZWwKLSAgPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2h0dHBkIj5zZXJ2aWRvciB3ZWIgQXBhY2hlPC9BPi4KLSAgQXJhIGhhbiBkJ2FmZWdpciBjb250aW5ndXQgZW4gYXF1ZXN0IGRpcmVjdG9yaSBpIHN1YnN0aXR1aXIgYXF1ZXN0YSBwJmFncmF2ZTtnaW5hLCAKLSAgbyBiJmVncmF2ZTsgZGlyaWdpciBhcXVlc3Qgc2Vydmlkb3IgY2FwIGFsIGNvbnRpbmd1dCByZWFsLgotICA8L1A+Ci0gIDxIUj4KLSAgPEJMT0NLUVVPVEU+Ci0gICBTaSBlc3QmYWdyYXZlOyB2ZWllbiBhcXVlc3RhIHAmYWdyYXZlO2dpbmEgaSBubyBlcyBsYSBxdWUgZXNwZXJhdmEsIHBvc2lzIGVuCi0gICBjb250YWN0ZSAgYW1iCi0gICA8U1RST05HPmwnYWRtaW5pc3RyYWRvciB3ZWIgZCdhcXVlc3QgbGxvYy48L1NUUk9ORz4KLSAgIChQcm92aSBkJ2VudmlhciB1biBjb3JyZXUgZWxlY3RyJm9ncmF2ZTtuaWMgYSA8U0FNUD4mbHQ7V2VibWFzdGVyQDxFTT5kb21haW48L0VNPiZndDs8L1NBTVA+LikKLSAgIEVuY2FyYSBxdWUgYXF1ZXN0IGxsb2MgZXN0JmFncmF2ZTsgdXRpbGl0emFudCBlbCBwcm9ncmFtYXJpIEFwYWNoZSwgZXMgZ2FpcmViJmVhY3V0ZTsgc2VndXIKLSAgIHF1ZSBubyB0JmVncmF2ZTsgcmVzIGEgdmV1cmUgYW1iIGVsIEdydXAgQXBhY2hlLCBwZXIgdGFudCAKLSAgIG5vIGVudmkmaXVtbDsgY2FwIGNvcnJldSBlbGVjdHImb2dyYXZlO25pYyBhbHMgYXV0b3JzIGQnQXBhY2hlIHJlZmVyZW50IGEgYXF1ZXN0IGxsb2MgbyBhbCBzZXUgY29udGluZ3V0LgotICAgU2kgZXMgcXVlIGhvIGZhLCBlbCBzZXUgbWlzc2F0Z2Ugc2VyJmFncmF2ZTsgPFNUUk9ORz48QklHPmlnbm9yYXQ8L0JJRz48L1NUUk9ORz4uCi0gIDwvQkxPQ0tRVU9URT4KLSAgPEhSPgotICA8UD4KLSAgTGEKLSAgPEEgSFJFRj0ibWFudWFsL2luZGV4Lmh0bWwiPmRvY3VtZW50YWNpJm9hY3V0ZTs8L0E+Ci0gIGQnQXBhY2hlIGhhIGVzdGF0IGluY2xvc2EgZW4gYXF1ZXN0YSBkaXN0cmlidWNpJm9hY3V0ZTsuCi0gIDwvUD4KLSAgPFA+Ci0gIEwnYWRtaW5pc3RyYWRvciBkZSB3ZWIgcG90IHV0aWxpdHphciBsbGl1cmVtZW50IGxhIGltYXRnZSBkJ2FxdSZpYWN1dGU7IHNvdGEKLSAgZW4gZWwgc2Vydmlkb3Igd2ViIGVxdWlwYXQgYW1iIGVsIHByb2dyYW1hcmkgQXBhY2hlLgotICBHciZhZ3JhdmU7Y2llcyBwZXIgdXRpbGl0emFyIEFwYWNoZSZuYnNwOyEKLSAgPC9QPgotICA8RElWIEFMSUdOPSJDRU5URVIiPgotICAgPElNRyBTUkM9ImFwYWNoZV9wYi5naWYiIEFMVD0iIj4KLSAgPC9ESVY+Ci0gPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwuY3ouaXNvODg1OS0yIGIvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwuY3ouaXNvODg1OS0yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGNkMmJhLi4wMDAwMDAwCi0tLSBhL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLmN6Lmlzbzg4NTktMgorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotIDxIRUFEPgotICA8TUVUQSBIVFRQLUVxdWl2PSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0yIj4KLSAgPFRJVExFPlRlc3RvdmFj7SBzdHLhbmthIGluc3RhbGFjZSB3ZWIgc2VydmVydSBBcGFjaGU8L1RJVExFPgotIDwvSEVBRD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLSA8Qk9EWQotICBCR0NPTE9SPSIjRkZGRkZGIgotICBURVhUPSIjMDAwMDAwIgotICBMSU5LPSIjMDAwMEZGIgotICBWTElOSz0iIzAwMDA4MCIKLSAgQUxJTks9IiNGRjAwMDAiCi0gPgotICA8SDEgQUxJR049IkNFTlRFUiI+Ci0gICBGdW5ndWplIHRvISBOYSB0b210byBzZXJ2ZXJ1IGLsvu0gQXBhY2hlIQotICA8L0gxPgotICA8UD4KLSAgUG9rdWQgdmlk7XRlIHR1dG8genBy4XZ1LCBzcHLhdmNlIHRvaG90byBwb+jtdGHoZSBwcuF27CD6c3DsuW7sCi0gIG5haW5zdGFsb3ZhbCBBcGFjaGUgd2ViIHNlcnZlci4KLSAgVGXvIGpluXTsIG11c+0gZG9wbG5pdCBvYnNhaCBhIG5haHJhZGl0IHR1dG8gc3RhbmRhcmRu7SB1du10YWPtCi0gIHN0cuFua3UsIG5lYm8gcPhlc23scm92YXQgc2VydmVyIG5hIHNrdXRl6G5vdSBkb21vdnNrb3Ugc3Ry4W5rdS4KLSAgPC9QPgotICA8SFI+Ci0gIDxCTE9DS1FVT1RFPgotICAgUG9rdWQgdmlk7XRlIHR1dG8genBy4XZ1IG3tc3RvIG/oZWvhdmFu6SBkb21vdnNr6SBzdHLhbmt5LCAKLSAgIDxTVFJPTkc+a29udGFrdHVqdGUsIHByb3PtbSwgc3By4XZjZSBw+O1zbHW5bulobyB3ZWIKLSAgIHNlcnZlcnUuPC9TVFJPTkc+IChaa3VzdGUgcG9zbGF0IGUtbWFpbCBuYSBhZHJlc3UKLSAgIDxTQU1QPiZsdDtXZWJtYXN0ZXJAPEVNPmRvbWFpbjwvRU0+Jmd0OzwvU0FNUD4uKSAKLSAgIFD4ZXN0b75lIHRlbnRvIHNlcnZlciBwb3W+7XbhIHByb2dyYW0gQXBhY2hlLCB06W3s+CBqaXN07CBuZW3hIG5pYwotICAgc3BvbGXobulobyBzIEFwYWNoZSBHcm91cCwgcHJvdG8gcHJvc+1tIG5lcG9z7WxlanRlIGUtbWFpbHkgbyB0b210bwotICAgc2VydmVydSBuZWJvIGplaG8gb2JzYWh1IGF1dG9y+W0gQXBhY2hlLiBQb2t1ZCB0byB1ZOxs4XRlLCBidWRlbWUKLSAgIHZhuWUgenBy4XZ5IDxTVFJPTkc+PEJJRz5pZ25vcm92YXQ8L0JJRz48L1NUUk9ORz4uCi0gIDwvQkxPQ0tRVU9URT4KLSAgPEhSPgotICA8UD4KLSAgWmRlIG5hamRldGUKLSAgPEEKLSAgIEhSRUY9Im1hbnVhbC8iCi0gID5kb2t1bWVudGFjaTwvQT4KLSAgQXBhY2hlIChhbmdsaWNreSkgb2JzYb5lbm91IHYgdOl0byBkaXN0cmlidWNpLgotICA8L1A+Ci0gIDxQPgotICBO4XNsZWR1au1j7SBsb2dvIG35vmUgYv10IHBvdb5pdG8gYmV6IG9tZXplbu0gbmEgd2ViIHNlcnZlcnUgcwotICBwcm9ncmFtZW0gQXBhY2hlLiBE7Gt1amVtZSB6YSBwb3W+aXTtIEFwYWNoZSEKLSAgPC9QPgotICA8RElWIEFMSUdOPSJDRU5URVIiPgotICAgPElNRyBTUkM9ImFwYWNoZV9wYi5naWYiIEFMVD0iIj4KLSAgPC9ESVY+Ci0gPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwuZGUgYi9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5kZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU0MjBlOS4uMDAwMDAwMAotLS0gYS9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5kZQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotIDxIRUFEPgotICA8VElUTEU+VGVzdHNlaXRlIGZ1ZXIgZGllIEFwYWNoZS1JbnN0YWxsYXRpb24gYXVmIGRpZXNlciBXZWIgU2l0ZTwvVElUTEU+Ci0gIDwhLS0gVHJhbnNsYXRlZCBXZWQgQXVnIDE4IDExOjA0OjAyIEdNVCAxOTk5IC0gTWFydGluLktyYWVtZXJATWNocC5TaWVtZW5zLkRlIC0tPgotIDwvSEVBRD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLSA8Qk9EWQotICBCR0NPTE9SPSIjRkZGRkZGIgotICBURVhUPSIjMDAwMDAwIgotICBMSU5LPSIjMDAwMEZGIgotICBWTElOSz0iIzAwMDA4MCIKLSAgQUxJTks9IiNGRjAwMDAiCi0gPgotICA8SDEgQUxJR049IkNFTlRFUiI+Ci0gICBFcyBrbGFwcHQhIERlciBBcGFjaGUgV2ViLVNlcnZlciBpc3QgYXVmIGRpZXNlciBXZWItU2l0ZSBpbnN0YWxsaWVydCEKLSAgPC9IMT4KLSAgPFA+Ci0gICBXZW5uIFNpZSBkaWVzZSBTZWl0ZSBzZWhlbiwgZGFubiBiZWRldXRldCBkYXMsIGRhc3MgZGllCi0gICBFaWdlbnQmdXVtbDttZXIgZGllc2VyIERvbSZhdW1sO25lIHNvZWJlbiBlaW5lbiBuZXVlbgotICAgPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2h0dHBkIj5BcGFjaGUgV2ViLVNlcnZlcjwvQT4KLSAgIGVyZm9sZ3JlaWNoIGluc3RhbGxpZXJ0IGhhYmVuLiBKZXR6dCBtdXNzIG5vY2ggZGVyCi0gICByaWNodGlnZSBXZWItSW5oYWx0IHp1Z2VmJnV1bWw7Z3QgdW5kIGRpZXNlIFBsYXR6aGFsdGVyLVNlaXRlCi0gICBlcnNldHp0IHdlcmRlbiAob2RlciBkZXIgV2ViLVNlcnZlciBmJnV1bWw7ciBkZW4gWnVncmlmZiBhdWYgZGVuCi0gICByaWNodGlnZW4gSW5oYWx0IHVta29uZmlndXJpZXJ0IHdlcmRlbikuCi0gIDwvUD4KLSAgPEhSPgotICA8QkxPQ0tRVU9URT4KLSAgIFdlbm4gU2llIGRpZXNlIFNlaXRlIGFuIFN0ZWxsZSBlaW5lciBhbmRlcmVuIGVyd2FydGV0ZW4gV2ViLVNpdGUKLSAgIHNlaGVuIHNvbGx0ZW4sIGRhbm4gPFNUUk9ORz5uZWhtZW4gU2llIGJpdHRlIEtvbnRha3QgbWl0IGRlbQotICAgRWlnZW50JnV1bWw7bWVyIGRpZXNlciBTaXRlIGF1ZjwvU1RST05HPiAoVmVyc3VjaGVuIFNpZSwgZWluZSBFTWFpbAotICAgYW4gPFNBTVA+Jmx0O1dlYm1hc3RlckA8RU0+ZG9tJmF1bWw7bmVubmFtZTwvRU0+Jmd0OzwvU0FNUD4KLSAgIHp1IHNlbmRlbikhPEJSPgotICAgPFA+Ci0gICBPYndvaGwgZGVyIEVpZ2VudCZ1dW1sO21lciBkaWVzZXIgRG9tJmF1bWw7bmUgZGllIEFwYWNoZQotICAgV2ViLVNlcnZlciBTb2Z0d2FyZSB2ZXJ3ZW5kZXQsIGhhdCBkaWVzZSBXZWItU2l0ZSB6aWVtbGljaCBzaWNoZXIKLSAgIGtlaW5lcmxlaSBWZXJiaW5kdW5nIG1pdCBkZXIgPEVNPkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9FTT4KLSAgIChkaWUgZGllc2UgU29mdHdhcmUga29zdGVubG9zIHZlcnRyZWlidCkuIEVzIGJlc3RlaHQgYWxzbwotICAgPEJJRz48U1RST05HPmtlaW5lcmxlaSBWZXJhbmxhc3N1bmc8L1NUUk9ORz48L0JJRz4sIGVpbmUgRU1haWwgYW4KLSAgIGRpZSBFbnR3aWNrbGVyIGRlciBTb2Z0d2FyZSB6dSBzZW5kZW4uIFNvbGx0ZW4gU2llIGRhcyBkZW5ub2NoCi0gICB0dW4sIHdpcmQgSWhyZSBNYWlsIHN0aWxsc2Nod2VpZ2VuZAotICAgPFNUUk9ORz48QklHPmlnbm9yaWVydDwvQklHPjwvU1RST05HPi4KLSAgPC9CTE9DS1FVT1RFPgotICA8SFI+Ci0gIDxQPgotICAgRGllIGVuZ2xpc2NoZSA8QQotICAgSFJFRj0ibWFudWFsL2luZGV4Lmh0bWwiPk9ubGluZS1Eb2t1bWVudGF0aW9uPC9BPiBmJnV1bWw7ciBkaWUKLSAgIEFwYWNoZSBXZWItU2VydmVyIFNvZnR3YXJlIGlzdCBCZXN0YW5kdGVpbCBkaWVzZXIKLSAgIFNvZnR3YXJlLURpc3RyaWJ1dGlvbi4KLSAgPC9QPgotICA8UD4KLSAgIERlbSA8ST5XZWJNYXN0ZXI8L0k+IGRpZXNlciBXZWItU2l0ZSBzdGVodCBlcyBmcmVpLCBkYXMKLSAgIHVudGVuc3RlaGVuZGUgIlBvd2VyZWQgYnkgQXBhY2hlIi1Mb2dvIGF1ZiBlaW5lbSBBcGFjaGUtYmFzaWVydGVuCi0gICBXZWItU2VydmVyIHp1IHZlcndlbmRlbi48QlI+Ci0gICBWaWVsZW4gRGFuaywgZGFzcyBTaWUgQXBhY2hlIGdldyZhdW1sO2hsdCBoYWJlbiEKLSAgPC9QPgotICA8RElWIEFMSUdOPSJDRU5URVIiPgotICAgPElNRyBTUkM9ImFwYWNoZV9wYi5naWYiIEFMVD0iUG93ZXJlZCBieSBBcGFjaGUhIj4KLSAgPC9ESVY+Ci0gPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwuZGsgYi9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5kawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJiMzkzMS4uMDAwMDAwMAotLS0gYS9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5kaworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotIDxIRUFEPgotICA8VElUTEU+UHImb3NsYXNoO3Zlc2lkZSBmb3IgQXBhY2hlIGluc3RhbGxhdGlvbmVuPC9USVRMRT4KLSA8L0hFQUQ+Ci08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci0gPEJPRFkKLSAgQkdDT0xPUj0iI0ZGRkZGRiIKLSAgVEVYVD0iIzAwMDAwMCIKLSAgTElOSz0iIzAwMDBGRiIKLSAgVkxJTks9IiMwMDAwODAiCi0gIEFMSU5LPSIjRkYwMDAwIgotID4KLSAgPEgxIEFMSUdOPSJDRU5URVIiPgotICAgRGV0IHZpcmtlZGUhICBBcGFjaGUgV2Vic2VydmVyZW4gZXIgaW5zdGFsbGVyZXQgcCZhcmluZzsgZGVubmUgbWFza2luZSEKLSAgPC9IMT4KLSAgPFA+Ci0gIEh2aXMgZHUga2FuIHNlIGRlbm5lIHNpZGUsIHMmYXJpbmc7IGhhciBkZW0gc29tIGVqZXIgZGV0dGUgZG9tJmFlbGlnO25lIGxpZ2UKLSAgaW5zdGFsbGVyZXQgPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2h0dHBkIj5BcGFjaGUgV2Vic2VydmVyZW48L0E+LgotICBEdSBtJmFyaW5nOyBudSBwbGFjZXJlIHdlYiBzaWRlciBpIGRldHRlIGRpcmVjdG9yeSBvZyBmamVybmUgZGVubmUgc2lkZSwgZWxsZXIKLSAga29uZmlndXJlcmUgc2VydmVyZW4gdGlsIGF0IGFudmVuZGUgZXQgYW5kZXQgZGlyZWN0b3J5LgotICA8L1A+Ci0gIDxIUj4KLSAgPEJMT0NLUVVPVEU+Ci0gICBIdmlzIGR1IHNlciBkZW5uZSBzaWRlIGlzdGVkZXQgZm9yIGVuIGFuZGVuIGZvcnZlbnRldCBzaWRlLCA8U1RST05HPmtvbnRha3QKLSAgIHZlbmxpZ3N0IGFkbWluaXN0cmF0b3JlbiBmb3IgZGVuIHNlcnZlciBkdSBwciZvc2xhc2g7dmVyIGF0IGtvbnRha3RlLjwvU1RST05HPgotICAgKFByJm9zbGFzaDt2IGF0IHNlbmRlIG1haWwgdGlsIDxTQU1QPiZsdDtXZWJtYXN0ZXJAPEVNPmRvbWFpbjwvRU0+Jmd0OzwvU0FNUD4uKQotICAgQXBhY2hlZ3J1cHBlbiBoYXIgaWtrZSBub2dldCBhdCBnJm9zbGFzaDtyZSBtZWQgZGVubmUgc2l0ZSwgcyZhcmluZzsgZGV0IHZpbCBpa2tlCi0gICBoaiZhZWxpZztscGUgYXQgc2VuZGUgbWFpbCB0byBBcGFjaGUgdWR2aWtsZXJuZSBhbmcmYXJpbmc7ZW5kZSBkZW5uZSBzaXRlLiAgCi0gIDwvQkxPQ0tRVU9URT4KLSAgPEhSPgotICA8UD4KLSAgQXBhY2hlLQotICA8QQotICAgSFJFRj0ibWFudWFsL2luZGV4Lmh0bWwiCi0gID5kb2N1bWVudGF0aW9uZW48L0E+Ci0gIGVyIGlua2x1ZGVyZXQgbWVkIGRlbm5lIGRpc3RyaWJ1dGlvbi4KLSAgPC9QPgotICA8UD4KLSAgV2VibWFzdGVyZW4gYWYgZGVubmUgc2l0ZSBtJmFyaW5nOyBnZXJuZSBicnVnZSBkZW4gZiZvc2xhc2g7bGdlbmRlIGdyYWZpawotICBwJmFyaW5nOyBlbiBBcGFjaGUtZHJldmV0IHdlYnNlcnZlci4gIE1hbmdlIHRhayBmb3IgYXQgYnJ1Z2UgQXBhY2hlIQotICA8L1A+Ci0gIDxESVYgQUxJR049IkNFTlRFUiI+Ci0gICA8SU1HIFNSQz0iYXBhY2hlX3BiLmdpZiIgQUxUPSIiPgotICA8L0RJVj4KLSA8L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5lZSBiL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLmVlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzljMzBlLi4wMDAwMDAwCi0tLSBhL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLmVlCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci0gPEhFQUQ+Ci0gIDxUSVRMRT5BcGFjaGUgdmVlYmlzZXJ2ZXJpIGluc3RhbGxhdHNpb29uaSB0ZXN0bGVoZWsmdXVtbDtsZzwvVElUTEU+Ci0gIDwhLS0gT3JpZ2luYWwgdHJhbnNsYXRpb246IEFodGkgSGVpbmxhLCBhaHRpQGFodGkuYmx1ZW1vb24uZWUsIFRodSBBdWcgMTkgMTI6NTc6NDggR01UIDE5OTkgLS0+Ci0gPC9IRUFEPgotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotIDxCT0RZCi0gIEJHQ09MT1I9IiNGRkZGRkYiCi0gIFRFWFQ9IiMwMDAwMDAiCi0gIExJTks9IiMwMDAwRkYiCi0gIFZMSU5LPSIjMDAwMDgwIgotICBBTElOSz0iI0ZGMDAwMCIKLSA+Ci0gIDxIMSBBTElHTj0iQ0VOVEVSIj4KLSAgIEt1anV0YSBwaWx0aSwgayZhdW1sO2ltYSBsJmF1bWw7a3MhICBBcGFjaGUgdmVlYmlzZXJ2ZXIgb24gaW5zdGFsbGVlcml0dWQhCi0gIDwvSDE+Ci0gIDxQPgotICBLdWkgU2EgbiZhdW1sO2VkIHNlZGEgbGVoZWsmdXVtbDtsZ2UsIHNpaXMgc2VsbGUgZG9tZWVuaSBvbWFuaWt1ZCBvbgotICBlZHVrYWx0IGhha2thbWEgc2FhbnVkIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9odHRwZCI+QXBhY2hlIHZlZWJpc2VydmVyaTwvQT4KLSAgaW5zdGFsbGVlcmltaXNlZ2EuIEomYXVtbDtyZ21pc2VrcyBwZWFrcyBuYWQgc2VsbGUgbGVoZWsmdXVtbDtsamUgYXNlbmRhbWEKLSAgbWlzaWdhbmVzIG1hdGVyamFsaWdhLCBtaWRhIG5hZCBvbWEgdmVlYmlzYWlkaXMgbiZhdW1sO2lkYXRhIHRhaGF2YWQsCi0gIHYmb3RpbGRlO2kgc2lpcyBqdWhhdGFtYSB2ZWViaXNlcnZlcmlsZSBrJmF1bWw7dHRlIHRlZ2VsaWt1IG1hdGVyamFsaQotICBhc3Vrb2hhLgotICA8L1A+Ci0gIDxIUj4KLSAgPEJMT0NLUVVPVEU+Ci0gICBLdWkgU2Egb290YXNpZCBzaWluIGxlaGVrJnV1bWw7bGplbCBuJmF1bWw7aGEgaG9vcGlzIG1pZGFnaSBtdXVkLAotICAgc2lpcyBwYWx1biA8U1RST05HPnYmb3RpbGRlO3RhICZ1dW1sO2hlbmR1c3Qgc2VsbGUgdmVlYmlzYWlkaQotICAgYWRtaW5pc3RyYWF0b3JpZ2EuPC9TVFJPTkc+IChWJm90aWxkZTtpZCBuJmF1bWw7aXRla3Mga2lyanV0YWRhIGFhZHJlc3NpbAotICAgPFNBTVA+Jmx0O1dlYm1hc3RlckA8RU0+ZG9tYWluPC9FTT4mZ3Q7PC9TQU1QPi4pIEt1aWdpIHNlZSB2ZWViaXNhaXQKLSAgIGthc3V0YWIgQXBhY2hlIHRhcmt2YXJhLCBwb2xlIHRhIHBlYWFlZ3Uga2luZGxhc3RpIG1pdHRlIEFwYWNoZSBHcm91cCdpZ2EKLSAgIG1pbmdpbCBtdXVsIG1vZWwgc2VvdHVkLiBTZWVnYSwgcGFsdW4gJmF1bWw7cmEga2lyanV0YSBzZWxsZSBzYWlkaQotICAgYXNqdXMgQXBhY2hlIGF1dG9yaXRlbGUuIEt1aSBzYSBzZWRhIHRlZWQsIHNpaXMgc2ludSBraXJqYQotICAgPFNUUk9ORz48QklHPmlnbm9yZWVyaXRha3NlPC9CSUc+PC9TVFJPTkc+LgotICA8L0JMT0NLUVVPVEU+Ci0gIDxIUj4KLSAgPFA+Ci0gIEthIEFwYWNoZQotICA8QQotICAgSFJFRj0ibWFudWFsL2luZGV4Lmh0bWwiCi0gID5kb2t1bWVudGF0c2lvb248L0E+Ci0gIG9uIHNlbGxlcyBkaXN0cmlidXRzaW9vbmlzIG9sZW1hcy4KLSAgPC9QPgotICA8UD4KLSAgS29oYWxpayB2ZWVibWVpc3RlciB2Jm90aWxkZTtpYiB2YWJhbHQga2FzdXRhZGEgYWxscG9vbCBvbGV2YXQKLSAgcGlsdGkgb21hIEFwYWNoZSB2ZWViaXNlcnZlcmlsLiBBaXQmYXVtbDtoIEFwYWNoZXQga2FzdXRhbWFzdCEKLSAgPC9QPgotICA8RElWIEFMSUdOPSJDRU5URVIiPgotICAgPElNRyBTUkM9ImFwYWNoZV9wYi5naWYiIEFMVD0iIj4KLSAgPC9ESVY+Ci0gPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwuZWwgYi9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5lbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcxMzU0Zi4uMDAwMDAwMAotLS0gYS9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5lbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VMIj4KLTxIVE1MPgotIDxIRUFEPgotICA8VElUTEU+xO/q6ezh8/Tp6t4g0+Xr3+ThIOPp4SD05+0gxePq4fTc8/Th8+cg9O/1IEFwYWNoZTwvVElUTEU+Ci0gPC9IRUFEPgotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotIDxCT0RZCi0gIEJHQ09MT1I9IiNGRkZGRkYiCi0gIFRFWFQ9IiMwMDAwMDAiCi0gIExJTks9IiMwMDAwRkYiCi0gIFZMSU5LPSIjMDAwMDgwIgotICBBTElOSz0iI0ZGMDAwMCIKLSA+Ci0KLQotPFA+Ci3F3O0g7PDv8eXf9OUg7eEg5OXf9OUg4fX03iD05yDz5evf5OEsIPT89OUg5yDl4+rh9Nzz9OHz5yD07/Ug6+/j6fPs6erv/SD07/UgPEEgSFJFRj0iaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvIj7F7vXw5/Hl9Of03iBXV1cgQXBhY2hlPC9BPiDz5SDh9fT8IPTvIPP98/Tn7OEg3vTh7SDl8On09ffe8i4gzPDv8eXf9OUg9P7x4SDt4SDw8e/z6N3z5fTlIPDl8enl9/zs5e3vIPPlIOH19Pwg9O/tIOrh9Nzr7+PvIOrh6SDt4SDh7fTp6uH04fP03vPl9OUg4fX03iD05yDz5evf5OEuCi0KLTxQPjxIUiBXSURUSD0iNTAlIiBTSVpFPSI4Ij4KLQotPEgyIEFMSUdOPSJDRU5URVIiPsLr3fDl9OUg4fX03iD05yDz5evf5OEg4e303yDj6eEg9O8g5Onq9PXh6vwg9Pzw7yDw7/Ug8OXx6ezd7eH05Ts8L0gyPgotCi08UD4KLcH19N4g5yDz5evf5OEg4vHf8+rl9OHpIOXk/iDj6eH03yDvIOTp4ffl6fHp8/Te8iDh9fTv/SD07/Ug5Onq9PXh6u/9IPT88O/1IPTx7/Dv8O/f5/PlIPTp8iDx9ejs3/Pl6fIg8/Tv7SDl7vXw5/Hl9Of03iBBcGFjaGUuINDh8eHq4ev+IDxTVFJPTkc+5fDp6u/p7fnt3vP05SDs5SD07+0g9fDl/ej17e8g4+nhIPTnIOTp4ffl3/Hp8+cg9O/1IPDh8fzt9O/yIOXu9fDn8eX05/TeLjwvU1RST05HPiDU7yC65PH17OEgy+/j6fPs6erv/SBBcGFjaGUgKFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbikg3ePx4fjlIPTvIOvv4+nz7Onq/CD07/Ug5e718Ofx5fTn9N4gV1dXIPTvIO/w79/vIPfx5/Pp7O/w7+nl3yDvIOTp4ffl6fHp8/Te8iDh9fTv/SD07/Ug5Onq9PXh6u/9IPT88O/1LiDU7yC65PH17OEg/Oz58iDk5e0g3ffl6SDq4ezp3CDh8ezv5On89Of04SDz9+X06ereIOzlIPTnIOTp4ffl3/Hp8+cg4fX07/0g9O/1IOTp6vT14erv/SD0/PDv9SDq4ekg5OXtIOzw7/Hl3yDt4SDi7+fo3vPl6SDz9OftIOXw3+v18+cg6OXs3PT57SDw7/Ug3ffv9e0g8/fd8+cg7OUg9OnyIPH16Ozf8+Xp8iD07/UuCi0KLTxQPjxIUiBXSURUSD0iNTAlIiBTSVpFPSI4Ij4KLQotCi08UD4KLccgPEEgSFJFRj0ibWFudWFsLyI+9OXq7Ofx3/nz5zwvQT4g9O/1IEFwYWNoZSDd9+XpIPP17PDl8enr5/bo5d8g8+Ug4fX03iD05yDk6eHt7+zeLgotCi08UD4KLcXf8/TlIOXr5f3o5fHv8i/nIO3hIPfx5/Pp7O/w7+ne8+X05SD05+0g8OHx4erc9Pkg5enq/O3hIPPlIN3t4e0g5e718Ofx5fTn9N4g9O/1IFdXVyDw7/Ug4uHz3+bl9OHpIPPlIEFwYWNoZS4gIMX19+Hx6fP07/3s5SDw7/Ug9/Hn8+ns7/Dv6eXf9OUg9O/tIEFwYWNoZSEKLQotPERJViBBTElHTj0iQ0VOVEVSIj48SU1HIFNSQz0iYXBhY2hlX3BiLmdpZiIgQUxUPSIiPjwvRElWPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwuZW4gYi9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNmNWVjYS4uMDAwMDAwMAotLS0gYS9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotIDxIRUFEPgotICA8VElUTEU+VGVzdCBQYWdlIGZvciBBcGFjaGUgSW5zdGFsbGF0aW9uPC9USVRMRT4KLSA8L0hFQUQ+Ci08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci0gPEJPRFkKLSAgQkdDT0xPUj0iI0ZGRkZGRiIKLSAgVEVYVD0iIzAwMDAwMCIKLSAgTElOSz0iIzAwMDBGRiIKLSAgVkxJTks9IiMwMDAwODAiCi0gIEFMSU5LPSIjRkYwMDAwIgotID4KLQotCi08UD4KLUlmIHlvdSBjYW4gc2VlIHRoaXMsIGl0IG1lYW5zIHRoYXQgdGhlIGluc3RhbGxhdGlvbiBvZiB0aGUgPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2h0dHBkIj5BcGFjaGUgd2ViIHNlcnZlcjwvQT4gc29mdHdhcmUgb24gdGhpcyBzeXN0ZW0gd2FzIHN1Y2Nlc3NmdWwuICBZb3UgbWF5IG5vdyBhZGQgY29udGVudCB0byB0aGlzIGRpcmVjdG9yeSBhbmQgcmVwbGFjZSB0aGlzIHBhZ2UuCi0KLTxQPjxIUiBXSURUSD0iNTAlIiBTSVpFPSI4Ij4KLQotPEgyIEFMSUdOPSJDRU5URVIiPlNlZWluZyB0aGlzIGluc3RlYWQgb2YgdGhlIHdlYnNpdGUgeW91IGV4cGVjdGVkPzwvSDI+Ci0KLTxQPgotVGhpcyBwYWdlIGlzIGhlcmUgYmVjYXVzZSB0aGUgc2l0ZSBhZG1pbmlzdHJhdG9yIGhhcyBjaGFuZ2VkIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoaXMgd2ViIHNlcnZlci4gIAotUGxlYXNlICA8U1RST05HPmNvbnRhY3QgdGhlIHBlcnNvbiByZXNwb25zaWJsZSBmb3IgbWFpbnRhaW5pbmcgdGhpcyBzZXJ2ZXIgd2l0aCBxdWVzdGlvbnMuPC9TVFJPTkc+ICAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aGljaCB3cm90ZSB0aGUgd2ViIHNlcnZlciBzb2Z0d2FyZSB0aGlzIHNpdGUgYWRtaW5pc3RyYXRvciBpcyB1c2luZywgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBtYWludGFpbmluZyB0aGlzIHNpdGUgYW5kIGNhbm5vdCBoZWxwIHJlc29sdmUgY29uZmlndXJhdGlvbiBpc3N1ZXMuCi0KLTxQPjxIUiBXSURUSD0iNTAlIiBTSVpFPSI4Ij4KLQotCi08UD4KLVRoZSBBcGFjaGUgPEEgSFJFRj0ibWFudWFsL2luZGV4Lmh0bWwiPmRvY3VtZW50YXRpb248L0E+IGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24uCi0KLTxQPgotWW91IGFyZSBmcmVlIHRvIHVzZSB0aGUgaW1hZ2UgYmVsb3cgb24gYW4gQXBhY2hlLXBvd2VyZWQgd2ViIHNlcnZlci4gIFRoYW5rcyBmb3IgdXNpbmcgQXBhY2hlIQotCi08RElWIEFMSUdOPSJDRU5URVIiPjxJTUcgU1JDPSJhcGFjaGVfcGIuZ2lmIiBBTFQ9IiI+PC9ESVY+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5lcyBiL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLmVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWY4MTA3Li4wMDAwMDAwCi0tLSBhL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLmVzCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRVMiPgotPEhUTUw+Ci0gPEhFQUQ+Ci0gIDxUSVRMRT5QYWcmaWFjdXRlO25hIHBhcmEgcHJvYmFyIGxhIGluc3RhbGFjaSZvYWN1dGU7biBkZSBBcGFjaGU8L1RJVExFPgotIDwvSEVBRD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLSA8Qk9EWQotICBCR0NPTE9SPSIjRkZGRkZGIgotICBURVhUPSIjMDAwMDAwIgotICBMSU5LPSIjMDAwMEZGIgotICBWTElOSz0iIzAwMDA4MCIKLSAgQUxJTks9IiNGRjAwMDAiCi0gPgotICA8SDEgQUxJR049IkNFTlRFUiI+Ci0gICAmaWV4Y2w7RnVuY2lvbiZvYWN1dGU7ISAgJmlleGNsO0VsIFNlcnZpZG9yIGRlIFJlZCBBcGFjaGUgaGEgc2lkbyBpbnN0YWxhZG8gZW4gZXNlIHNpdGlvIQotICA8L0gxPgotICA8UD4KLSAgU2kgdXN0ZWQgcHVlZGUgdmVyIGVzdGEgcGFnJmlhY3V0ZTtuYSwgZW50b25jZXMgbG9zIGR1ZSZudGlsZGU7b3MgZGUgZXN0YQotICBtYXF1JmlhY3V0ZTtuYSBoYW4gaW5zdGFsYWRvIGVsIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iPlNlcnZpZG9yIGRlCi0gIFJlZCBBcGFjaGU8L0E+IGNvbiBleCZpYWN1dGU7dG8uICBBaG9yYSBkZWJlbiBhJm50aWxkZTthZGlyIGNvbnRlbmlkbyBhIGVzdGUgZGlyZWN0b3JpbwotICB5IHJlZW1wbGF6YXIgZXN0YSBwYWcmaWFjdXRlO25hLCAmb2FjdXRlOyBhcHVudGFyIGVzdGUgc2Vydmlkb3IgYWwgY29udGVuaWRvIHJlYWwuCi0gIDwvUD4KLSAgPEhSPgotICA8QkxPQ0tRVU9URT4KLSAgIFNpIHVzdGVkIGVzdGEgbGV5ZW5kbyBlc3RhIHBhZyZpYWN1dGU7bmEgeSBubyBlcyBsbyBxdWUgZXNwZXJhYmEsIHBvciBmYXZvcgotICAgPFNUUk9ORz5jb250YWN0ZSBlbCBhZG1pbmlzdHJhZG9yIGRlIGVzdGUgc2l0aW8uPC9TVFJPTkc+Ci0gICAoVHJhdGUgZGUgZW52aWFyIGNvcnJlbyBlbGVjdHImb2FjdXRlO25pY28gYSA8U0FNUD4mbHQ7V2VibWFzdGVyQDxFTT5kb21haW48L0VNPiZndDs8L1NBTVA+LikKLSAgIEF1bnF1ZSBlc3RlIHNpdGlvIGVzdGEgdXRpbGl6YW5kbyBlbCBwcm9ncmFtYSBBcGFjaGUgZXMgY2FzaSBzZWd1cm8KLSAgIHF1ZSBubyB0aWVuZSBuaW5ndW5hIGNvbmV4aSZvYWN1dGU7biBjb24gZWwgQXBhY2hlIEdyb3VwLCBwb3IgZXNvIGZhdm9yIGRlCi0gICBubyBlbnZpYXIgY29ycmVvIHNvYnJlIGVzdGUgc2l0aW8gbyBzdSBjb250ZW5pZG8gYSBsb3MgYXV0b3JlcyBkZQotICAgQXBhY2hlLiAgU2kgbG8gaGFjZSwgc3UgbWVuc2FqZSBzZXJhCi0gICA8U1RST05HPjxCSUc+aWdub3JhZG88L0JJRz48L1NUUk9ORz4uCi0gIDwvQkxPQ0tRVU9URT4KLSAgPEhSPgotICA8UD4KLSAgTGEKLSAgPEEKLSAgIEhSRUY9Im1hbnVhbC9pbmRleC5odG1sIgotICA+ZG9jdW1lbnRhY2kmb2FjdXRlO248L0E+Ci0gIGRlIEFwYWNoZSBoYSBzaWRvIGluY2x1aWRhIGVuIGVzdGEgZGlzdHJpYnVjaSZvYWN1dGU7bi4KLSAgPC9QPgotICA8UD4KLSAgRWwgYWRtaW5pc3RyYWRvciBkZWwgc2l0aW8gZXN0YSBpbnZpdGFkbyBhIHVzYXIgbGEgc2lndWllbnRlCi0gIGltYWdlbiBwYXJhIGluZGljYXIgcXVlIHN1IHNpdGlvIGVzIHNlcnZpZG8gcG9yIEFwYWNoZS4KLSAgJmlleGNsO0dyYWNpYXMgcG9yIHVzYXIgQXBhY2hlIQotICA8L1A+Ci0gIDxESVYgQUxJR049IkNFTlRFUiI+Ci0gICA8SU1HIFNSQz0iYXBhY2hlX3BiLmdpZiIgQUxUPSIiPgotICA8L0RJVj4KLSA8L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5ldCBiL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLmV0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzljMzBlLi4wMDAwMDAwCi0tLSBhL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLmV0CisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci0gPEhFQUQ+Ci0gIDxUSVRMRT5BcGFjaGUgdmVlYmlzZXJ2ZXJpIGluc3RhbGxhdHNpb29uaSB0ZXN0bGVoZWsmdXVtbDtsZzwvVElUTEU+Ci0gIDwhLS0gT3JpZ2luYWwgdHJhbnNsYXRpb246IEFodGkgSGVpbmxhLCBhaHRpQGFodGkuYmx1ZW1vb24uZWUsIFRodSBBdWcgMTkgMTI6NTc6NDggR01UIDE5OTkgLS0+Ci0gPC9IRUFEPgotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotIDxCT0RZCi0gIEJHQ09MT1I9IiNGRkZGRkYiCi0gIFRFWFQ9IiMwMDAwMDAiCi0gIExJTks9IiMwMDAwRkYiCi0gIFZMSU5LPSIjMDAwMDgwIgotICBBTElOSz0iI0ZGMDAwMCIKLSA+Ci0gIDxIMSBBTElHTj0iQ0VOVEVSIj4KLSAgIEt1anV0YSBwaWx0aSwgayZhdW1sO2ltYSBsJmF1bWw7a3MhICBBcGFjaGUgdmVlYmlzZXJ2ZXIgb24gaW5zdGFsbGVlcml0dWQhCi0gIDwvSDE+Ci0gIDxQPgotICBLdWkgU2EgbiZhdW1sO2VkIHNlZGEgbGVoZWsmdXVtbDtsZ2UsIHNpaXMgc2VsbGUgZG9tZWVuaSBvbWFuaWt1ZCBvbgotICBlZHVrYWx0IGhha2thbWEgc2FhbnVkIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9odHRwZCI+QXBhY2hlIHZlZWJpc2VydmVyaTwvQT4KLSAgaW5zdGFsbGVlcmltaXNlZ2EuIEomYXVtbDtyZ21pc2VrcyBwZWFrcyBuYWQgc2VsbGUgbGVoZWsmdXVtbDtsamUgYXNlbmRhbWEKLSAgbWlzaWdhbmVzIG1hdGVyamFsaWdhLCBtaWRhIG5hZCBvbWEgdmVlYmlzYWlkaXMgbiZhdW1sO2lkYXRhIHRhaGF2YWQsCi0gIHYmb3RpbGRlO2kgc2lpcyBqdWhhdGFtYSB2ZWViaXNlcnZlcmlsZSBrJmF1bWw7dHRlIHRlZ2VsaWt1IG1hdGVyamFsaQotICBhc3Vrb2hhLgotICA8L1A+Ci0gIDxIUj4KLSAgPEJMT0NLUVVPVEU+Ci0gICBLdWkgU2Egb290YXNpZCBzaWluIGxlaGVrJnV1bWw7bGplbCBuJmF1bWw7aGEgaG9vcGlzIG1pZGFnaSBtdXVkLAotICAgc2lpcyBwYWx1biA8U1RST05HPnYmb3RpbGRlO3RhICZ1dW1sO2hlbmR1c3Qgc2VsbGUgdmVlYmlzYWlkaQotICAgYWRtaW5pc3RyYWF0b3JpZ2EuPC9TVFJPTkc+IChWJm90aWxkZTtpZCBuJmF1bWw7aXRla3Mga2lyanV0YWRhIGFhZHJlc3NpbAotICAgPFNBTVA+Jmx0O1dlYm1hc3RlckA8RU0+ZG9tYWluPC9FTT4mZ3Q7PC9TQU1QPi4pIEt1aWdpIHNlZSB2ZWViaXNhaXQKLSAgIGthc3V0YWIgQXBhY2hlIHRhcmt2YXJhLCBwb2xlIHRhIHBlYWFlZ3Uga2luZGxhc3RpIG1pdHRlIEFwYWNoZSBHcm91cCdpZ2EKLSAgIG1pbmdpbCBtdXVsIG1vZWwgc2VvdHVkLiBTZWVnYSwgcGFsdW4gJmF1bWw7cmEga2lyanV0YSBzZWxsZSBzYWlkaQotICAgYXNqdXMgQXBhY2hlIGF1dG9yaXRlbGUuIEt1aSBzYSBzZWRhIHRlZWQsIHNpaXMgc2ludSBraXJqYQotICAgPFNUUk9ORz48QklHPmlnbm9yZWVyaXRha3NlPC9CSUc+PC9TVFJPTkc+LgotICA8L0JMT0NLUVVPVEU+Ci0gIDxIUj4KLSAgPFA+Ci0gIEthIEFwYWNoZQotICA8QQotICAgSFJFRj0ibWFudWFsL2luZGV4Lmh0bWwiCi0gID5kb2t1bWVudGF0c2lvb248L0E+Ci0gIG9uIHNlbGxlcyBkaXN0cmlidXRzaW9vbmlzIG9sZW1hcy4KLSAgPC9QPgotICA8UD4KLSAgS29oYWxpayB2ZWVibWVpc3RlciB2Jm90aWxkZTtpYiB2YWJhbHQga2FzdXRhZGEgYWxscG9vbCBvbGV2YXQKLSAgcGlsdGkgb21hIEFwYWNoZSB2ZWViaXNlcnZlcmlsLiBBaXQmYXVtbDtoIEFwYWNoZXQga2FzdXRhbWFzdCEKLSAgPC9QPgotICA8RElWIEFMSUdOPSJDRU5URVIiPgotICAgPElNRyBTUkM9ImFwYWNoZV9wYi5naWYiIEFMVD0iIj4KLSAgPC9ESVY+Ci0gPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwuZnIgYi9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5mcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZmYTA5Ny4uMDAwMDAwMAotLS0gYS9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5mcgorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotIDxIRUFEPgotICA8VElUTEU+UGFnZSBkZSB0ZXN0IGRlIGwnaW5zdGFsbGF0aW9uIGQnQXBhY2hlPC9USVRMRT4KLSA8L0hFQUQ+Ci08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci0gPEJPRFkKLSAgQkdDT0xPUj0iI0ZGRkZGRiIKLSAgVEVYVD0iIzAwMDAwMCIKLSAgTElOSz0iIzAwMDBGRiIKLSAgVkxJTks9IiMwMDAwODAiCi0gIEFMSU5LPSIjRkYwMDAwIgotID4KLSAgPEgxIEFMSUdOPSJDRU5URVIiPgotICAgJkNjZWRpbDthIGZvbmN0aW9ubmUmbmJzcDshICBMZSBzZXJ2ZXVyIHdlYiBBcGFjaGUgZXN0IGluc3RhbGwmZWFjdXRlOyBzdXIKLSAgIGNlIHNpdGUmbmJzcDshCi0gIDwvSDE+Ci0gIDxQPgotICBTaSB2b3VzIGxpc2V6IGNldHRlIHBhZ2UsIGMnZXN0IHF1ZSBsZXMgcHJvcHJpJmVhY3V0ZTt0YWlyZXMgZGUgY2UgZG9tYWluZQotICB2aWVubmVudCBkJ2luc3RhbGxlciBsZQotICA8QSBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvaHR0cGQiPnNlcnZldXIgd2ViIEFwYWNoZTwvQT4KLSAgYXZlYyBzdWNjJmVncmF2ZTtzLiBJbHMgZG9pdmVudCBtYWludGVuYW50IGFqb3V0ZXIgZHUgY29udGVudSAmYWdyYXZlOyBjZQotICByJmVhY3V0ZTtwZXJ0b2lyZSBldCByZW1wbGFjZXIgY2V0dGUgcGFnZSwgb3UgYmllbiBmYWlyZSBwb2ludGVyIGxlIHNlcnZldXIKLSAgdmVycyBsJ2VuZHJvaXQgbyZ1Z3JhdmU7IHNlIHRyb3V2ZSBsZSBjb250ZW51IHImZWFjdXRlO2VsIGR1IHNpdGUuCi0gIDwvUD4KLSAgPEhSPgotICA8QkxPQ0tRVU9URT4KLSAgIFNpIHZvdXMgdm95ZXogY2V0dGUgcGFnZSBhdSBsaWV1IGR1IHNpdGUgYXR0ZW5kdSwgdmV1aWxsZXogY29udGFjdGVyCi0gICA8U1RST05HPmwnYWRtaW5pc3RyYXRldXIgZHUgc2l0ZSBjb25jZXJuJmVhY3V0ZTsuPC9TVFJPTkc+Ci0gICAoRXNzYXlleiBkJ2Vudm95ZXIgdW4gZW1haWwgJmFncmF2ZTsKLSAgIDxTQU1QPiZsdDtXZWJtYXN0ZXJAPEVNPmRvbWFpbmU8L0VNPiZndDs8L1NBTVA+LikKLSAgIEJpZW4gcXVlIGNlIHNpdGUgdXRpbGlzZSBsZSBsb2dpY2llbCBBcGFjaGUsIGlsIG4nYSBjZXJ0YWluZW1lbnQKLSAgIHJpZW4gJmFncmF2ZTsgdm9pciBhdmVjIGxlIEdyb3VwZSBBcGFjaGUsIHBhciBjb25zJmVhY3V0ZTtxdWVudAotICAgdmV1aWxsZXogbmUgcGFzIGVudm95ZXIgZCdlbWFpbCBhdXgKLSAgIGF1dGV1cnMgZCdBcGFjaGUgY29uY2VybmFudCBjZSBzaXRlIG91IHNvbiBjb250ZW51LiBTaSB2b3VzIGxlIGZhaXRlcywKLSAgIHZvdHJlIG1lc3NhZ2Ugc2VyYSA8U1RST05HPjxCSUc+aWdub3ImZWFjdXRlOzwvQklHPjwvU1RST05HPi4KLSAgPC9CTE9DS1FVT1RFPgotICA8SFI+Ci0gIDxQPgotICBMYQotICA8QSBIUkVGPSJtYW51YWwvaW5kZXguaHRtbCI+ZG9jdW1lbnRhdGlvbjwvQT4KLSAgQXBhY2hlIGVzdCBpbmNsdXNlIGRhbnMgY2V0dGUgZGlzdHJpYnV0aW9uLgotICA8L1A+Ci0gIDxQPgotICBMZSB3ZWJtYXN0ZXIgZGUgY2Ugc2l0ZSBwZXV0IGxpYnJlbWVudCB1dGlsaXNlciBsJ2ltYWdlIGNpLWRlc3NvdXMKLSAgc3VyIHVuIHNpdGUgd2ViIHV0aWxpc2FudCBsZSBsb2dpY2llbCBBcGFjaGUuIE1lcmNpIGQnYXZvaXIgY2hvaXNpCi0gIEFwYWNoZSZuYnNwOyEKLSAgPC9QPgotICA8RElWIEFMSUdOPSJDRU5URVIiPgotICAgPElNRyBTUkM9ImFwYWNoZV9wYi5naWYiIEFMVD0iIj4KLSAgPC9ESVY+Ci0gPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwuaGUuaXNvODg1OS04IGIvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwuaGUuaXNvODg1OS04CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDI1NDg4Li4wMDAwMDAwCi0tLSBhL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLmhlLmlzbzg4NTktOAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4gICAgICAgICAgICAgICAgICAgICAgICAgCi08SFRNTD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotIDxIRUFEPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTgiPgotICAgPFRJVExFPkFwYWNoZS3kIPr4+SD68Pf65Owg7+Xp8fAg8+M8L1RJVExFPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotIDwvSEVBRD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4gCi0gPEJPRFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBCR0NPTE9SPSIjRkZGRkZGIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgVEVYVD0iIzAwMDAwMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIExJTks9IiMwMDAwRkYiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBWTElOSz0iIzAwMDA4MCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgQUxJTks9IiNGRjAwMDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi08RElWIEFMSUdOPXJpZ2h0PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxQPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QlI+IOTm5CDj5e7y5CD64CDk4OX4IOT64CDt4AotPEJSPjxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9odHRwZCI+QXBhY2hlIOjw+Ojw6eDkIPr4+TwvQT4g7Pkg5PD3+uTk+SD47uAg5OYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJSPiEhIeTn7Pbk4SDk+OHyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJSPiDq7Pkg7en24ffkIPrgIPPp8eXk7CDs5evpIOT64CDl6fnr8gotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJSPi7k5uQg8+PkIPrgIPPp7Ofk7OUg+uDm5CDk9unn7uwKLSAgICAgICAKLTwvRElWPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotPFA+PEhSIFdJRFRIPSI1MCUiIFNJWkU9IjgiPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgPEgyIEFMSUdOPSJDRU5URVIiPj/66fTp9vkg+Prg5CDt5ffu4SD64OYg4OX4PC9IMj4gICAgICAgIAotPERJViBBTElHTj1yaWdodD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFA+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCUj4g5ObkIPj64OQg7PIg6eD45+Ag6esgLO/g6yDk9u7wIOTm5CDj5e7y5AotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QlI+LuTmIOjw+Ojw6eDkIPr4+eQg7Pkg5On2+OXi6fTw5ffkIPrgIOTw6fkKLSAgICAgICAgICAgICAgICAgICAgICAgPEJSPi48U1RST05HPvrl7OD5IO3gIPr4+eQg6eD45+Ag7eAg+Pn3IPjl9unsPC9TVFJPTkc+IODwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCUj764CDk+PbpIPj54CBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QlI++vj55CD69+Xm5/og7PIg+ung+OfgIOTw6eAgLOTmIPr4+eQg+vDr5foKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCUj7k6fb45eLp9PDl9yD65eny4SDv5fj69OEg5Onp8vHsIOTs5evpIOTw6eDlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC7t5Pns6wotPC9ESVY+Ci0KLTxQPjxIUiBXSURUSD0iNTAlIiBTSVpFPSI4Ij4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLTxESVYgQUxJR049cmlnaHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFA+Ci0gICAgICAgICAgICAgIDxCUj4g6uX64SDt6fL27vAgPEEgSFJFRj0ibWFudWFsL2luZGV4Lmh0bWwiPuTp9ujw7uX35ePkIOnr7vHuPC9BPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLvr4+eQg+vDr5fog+uzp4ecKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QlI+4+Xu8uQg+un65/rhIOT27vDkIOzu8eEg+e76+eTsIOng+fgg5PrgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJSPi5BcGFjaGUg6Scn8iDs8vTl7vkg+vj55CDs8iD3+AotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEhIUFwYWNoZS3hIPnl7un55CDs8iDk4+X6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotPC9ESVY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotPERJViBBTElHTj0iQ0VOVEVSIj48SU1HIFNSQz0iYXBhY2hlX3BiLmdpZiIgQUxUPSIiPjwvRElWPiAgICAgICAgICAgICAgICAgICAgICAKLTwvQk9EWT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi08L0hUTUw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwuaHIuaXNvODg1OS0yIGIvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwuaHIuaXNvODg1OS0yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWY5NjNkLi4wMDAwMDAwCi0tLSBhL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLmhyLmlzbzg4NTktMgorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0yIj4KLTx0aXRsZT5UZXN0bmEgU3RyYW5pY2EgQXBhY2hlIEluc3RhbGFjaWplPC90aXRsZT4KLTwvaGVhZD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZAotKGFjdGl2ZSkgLS0+Ci08Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB0ZXh0PSIjMDAwMDAwIiBsaW5rPSIjMDAwMEZGIgotdmxpbms9IiMwMDAwODAiIGFsaW5rPSIjRkYwMDAwIj4KLTxoMiBhbGlnbj0iY2VudGVyIj7IZXN0aXRhbW8hIEFwYWNoZSB3ZWIgcG9zbHW+aXRlbGogZnVua2Npb25pcmEhPC9oMj4KLTxwPlVrb2xpa28gdmlkaXRlIG92dSBzdHJhbmljdSwgdG8gem5h6GkgZGEgamUgaW5zdGFsYWNpamEgPGEKLWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3ByZUZBUS5odG1sIj5BcGFjaGUgd2ViIHBvc2x1vml0ZWxqYTwvYT4gdXNwamW5bm8gaXp2crllbmEgbmEgb3ZvbSByYeh1bmFsdS4KLVNhZGEgbW++ZXRlIGRvZGF0aSBzYWRyvmFqIHUgb3ZhaiBkaXJla3RvcmlqIHRlIHByb21pamVuaXRpIG92dSBzdHJhbmljdS48L3A+Ci0KLTxociB3aWR0aD0iNTAlIiBzaXplPSI4IiAvPgotPGgyIGFsaWduPSJjZW50ZXIiPk/oZWtpdmFsaSBzdGUgbmVrdSBkcnVndSBzdHJhbmljdT88L2gyPgotCi08cD5PdnUgc3RyYW5pY2EgdmlkaXRlIHN0b2dhILl0byBqZSBhZG1pbmlzdHJhdG9yIG92b2cgcG9zbHW+aXRlbGphIHByb21pamVuaW8KLWtvbmZpZ3VyYWNpanUuIEFwYWNoZSBTb2Z0dmVyIEZvbmRhY2lqYSBuYXBpc2FsYSBqZSBzb2Z0dmVyIGtvamkga29yaXN0aQotYWRtaW5pc3RyYXRvciBvdm9nIHdlYiBwb3Nsdb5pdGVsamEgaSBuaWplIG9kZ292b3JuYSB6YSBvZHK+YXZhbmplIG92b2cgcG9zbHW+aXRlbGphLiBNb2xpbW8gdmFzIGRhIHphIHN2YSBwaXRhbmphIDxzdHJvbmc+a29udGFrdGlyYXRlIG9kZ292b3JudQotb3NvYnUgemEgb2RyvmF2YW5qZSBvdm9nIHBvc2x1vml0ZWxqYS48L3N0cm9uZz48L3A+Ci0KLTxociB3aWR0aD0iNTAlIiBzaXplPSI4IiAvPgotPHA+T3ZkamUgc2UgbmFsYXppIDxhIGhyZWY9Im1hbnVhbC8iPkRva3VtZW50YWNpamE8L2E+IG8gQXBhY2hlIHdlYiBwb3Nsdb5pdGVsanUKLShlbmdsZXNraSkuPC9wPgotCi08cD5Eb25qdSBzbGnoaWN1IG1vvmV0ZSBzbG9ib2RubyBrb3Jpc3RpdGkgbmEgc3RyYW5pY2FtYSBvdm9nIHZlYiBwb3Nsdb5pdGVsamEuCi1IdmFsYSB2YW0guXRvIGtvcmlzdGl0ZSBBcGFjaGUhPC9wPgotCi08ZGl2IGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSJhcGFjaGVfcGIuZ2lmIiBhbHQ9IkFwYWNoZSBXZWIgUG9zbHW+aXRlbGoiIC8+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLml0IGIvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwuaXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMzJkMDQuLjAwMDAwMDAKLS0tIGEvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwuaXQKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlBhZ2luYSBkaSBwcm92YSBkZWxsJ2luc3RhbGxhemlvbmUgZGkgdW4gc2l0byBXZWIgY29uIEFwYWNoZTwvdGl0bGU+Ci08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08L2hlYWQ+Ci08Ym9keSB0ZXh0PSIjMDAwMDAwIiBiZ2NvbG9yPSIjRkZGRkZGIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzAwMDA4MCIgYWxpbms9IiNGRjAwMDAiPgotCi08Y2VudGVyPgotPGgxPgotRnVuemlvbmEhIElsIFNlcnZlciBXZWIgQXBhY2hlIGUnIHN0YXRvIGluc3RhbGxhdG8gc3UgcXVlc3RvIHNpdG8gV2ViITwvaDE+PC9jZW50ZXI+Ci1TZSByaXVzY2l0ZSBhIHZlZGVyZSBxdWVzdGEgcGFnaW5hLCBhbGxvcmEgdnVvbCBkaXJlIGNoZSBjb2xvcm8gY2hlIGdlc3Rpc2Nvbm8KLXF1ZXN0byBkb21pbmlvIGhhbm5vIGFwcGVuYSBpbnN0YWxsYXRvIGlsIHNvZnR3YXJlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9odHRwZCI+V2ViJm5ic3A7U2VydmVyCi1BcGFjaGU8L2E+IGNvcnJldHRhbWVudGUuIE9yYSBlJyBuZWNlc3NhcmlvIGFnZ2l1bmdlcmUgaWwgdm9zdHJvIG1hdGVyaWFsZQotaW4gcXVlc3RvIGRpcmV0dG9yaW8gZSBzb3N0aXR1aXJlIHF1ZXN0YSBwYWdpbmEgZGkgcHJvdmEsIG9wcHVyZSBjb25maWd1cmFyZQotaWwgc2VydmVyIHBlciBmYXIgcmlmZXJpbWVudG8gYWwgdm9zdHJvIG1hdGVyaWFsZSBzZSBjb2xsb2NhdG8gYWx0cm92ZS4KLTxwPgotPGhyPgotPGJsb2NrcXVvdGU+U2Ugc3RhdGUgdmVkZW5kbyBxdWVzdGEgcGFnaW5hIGludmVjZSBkZWwgc2l0byBjaGUgcGVuc2F2YXRlLAotdmkgcHJlZ2hpYW1vIGRpIDxiPmNvbnRhdHRhcmUgbCdhbW1pbmlzdHJhdG9yZSBkZWwgc2l0byBpbiBxdWVzdGlvbmUuPC9iPgotKFByb3ZhdGUgYWQgaW52aWFyZSB1biBlbWFpbCBhIDx0dD4mbHQ7V2VibWFzdGVyQDxpPmRvbWFpbjwvaT4+PC90dD4uKSZuYnNwOwotTm9ub3N0YW50ZSBxdWVzdG8gc2l0byBzdGlhIHV0aWxpenphbmRvIGlsIHNvZnR3YXJlIEFwYWNoZSwgcXVlc3RvIG5vbgotdmkgZ2FyYW50aXNjZSBuZXNzdW4gdGlwbyBkaSBjb250YXR0byBkaXJldHRvIGFsIEdydXBwbyBBcGFjaGUsIHF1aW5kaQotdmkgcHJlZ2hpYW1vIGRpIG5vbiBpbnZpYXJlIGVtYWlsIHJpZ3VhcmRhbnRpIHF1ZXN0byBzaXRvIG8gYWwgbWF0ZXJpYWxlCi1pbiBlc3NvIGNvbnRlbnV0byBhZ2xpIGF1dG9yaSBkaSBBcGFjaGUuIE9nbmkgbWVzc2FnZ2lvIGRlbCBnZW5lcmUgdmVycmEnCi08Yj48Zm9udCBzaXplPSsxPmlnbm9yYXRvPC9mb250PjwvYj4uPC9ibG9ja3F1b3RlPgotCi08aHI+Ci08YnI+TGEgPGEgaHJlZj0ibWFudWFsL2luZGV4Lmh0bWwiPmRvY3VtZW50YXppb25lPC9hPiByZWxhdGl2YSBkaSBBcGFjaGUKLWUnIGluY2x1c2EgbmVsbGEgZGlzdHJpYnV6aW9uZS4KLTxwPklsIFdlYm1hc3RlciBkaSBxdWVzdG8gc2l0byBlJyBsaWJlcm8gZGkgdXRpbGl6emFyZSBsJ2ltbWFnaW5lIHF1aSBzb3R0bwotc3UgcXVhbHNpYXNpIFdlYiBzZXJ2ZXIgcG90ZW56aWF0byBjb24gQXBhY2hlLiBHcmF6aWUgcGVyIGF2ZXIgc2NlbHRvIEFwYWNoZSEKLTxjZW50ZXI+Ci08cD48aW1nIFNSQz0iYXBhY2hlX3BiLmdpZiIgQUxUPSIiID48L2NlbnRlcj4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwuamEuaXNvMjAyMi1qcCBiL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLmphLmlzbzIwMjItanAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNGU1NDUuLjAwMDAwMDAKLS0tIGEvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwuamEuaXNvMjAyMi1qcAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9sb29zZS5kdGQiPgotPGh0bWw+Ci0gPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy0yMDIyLUpQIj4KLSAgPHRpdGxlPkFwYWNoZSAbJEIlJCVzJTklSCE8JWs7fiROJUYlOSVIJVohPCU4GyhCPC90aXRsZT4KLSA8L2hlYWQ+Ci08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci0gPGJvZHkKLSAgYmdjb2xvcj0iI2ZmZmZmZiIKLSAgdGV4dD0iIzAwMDAwMCIKLSAgbGluaz0iIzAwMDBmZiIKLSAgdmxpbms9IiMwMDAwODAiCi0gIGFsaW5rPSIjZmYwMDAwIgotID4KLQotCi08cD4KLRskQiRiJDckMyROJVohPCU4JCxGSSRhJD8kTiRHJCIkbCRQISIbKEI8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvaHR0cGQiPkFwYWNoZSAbJEIlJiUnJVYlNSE8JVAbKEI8L2E+GyRCJE4lJCVzJTklSCE8JWskLCQzJE43Vzs7NSEkR0w1O3YkSz0qTjskNyQ/JDMkSCRyMFVMIyQ3JF4kOSEjJCIkSiQ/JE8hIiQzJE4lRyUjJWwlLyVIJWokS0o4PXEkcjJDJCgkPyRqISIkMyROJVohPCU4JHJDViQtJCskKCRrJDMkSCQsJEckLSReJDkhIxsoQgotPC9wPgotPGhyIHdpZHRoPSI1MCUiIHNpemU9IjgiPgotCi08aDIgYWxpZ249ImNlbnRlciI+GyRCJCIkSiQ/JE5NPUFbJEtIPyQ3JEYhIiQzJE4lWiE8JTgkLDgrJCgkRiQkJGskRyQ3JGckJiQrGyhCPzwvaDI+Ci0KLTxwPgotGyRCJDMkTiVaITwlOCRPISIlNSUkJUg0SU19PFQkLCQzJE4bKEIgd2ViIBskQiU1ITwlUCROQF9EaiRySlE5OSQ3JD8kPyRhJEs4KyQoJEYkJCReJDkhIxsoQgotPHN0cm9uZz4bJEIkMyROJTUhPCVQJHI0SU19JDkka0BVRyQkcjt9JEMkRiQkJGtKfSRLTyJNbSRyJEgkQyRGGyhCPC9zdHJvbmc+GyRCJC8kQCQ1JCQhIyQzJE4lNSUkJUg0SU19PFQkLE14TVEkNyRGJCQkaxsoQiB3ZWIgGyRCJTUhPCVQJHIzK0gvJDckPxsoQiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gGyRCJE8hIiQzJE4lNSUkJUgkThsoQiB3ZWIgGyRCJTUhPCVQJE40SU19JEgkTzRYNzgkLCRKJC8hIiU1ITwlUCROQF9EaiRLNFgkOSRrTGRCaiRyMnI3aCQ5JGskMyRIJE8kRyQtJF4kOyRzISMbKEIKLTwvcD4KLTxociB3aWR0aD0iNTAlIiBzaXplPSI4Ij4KLQotCi08cD4KLUFwYWNoZSAbJEIkSzRYJDkkaxsoQjxBIEhSRUY9Im1hbnVhbC9pbmRleC5odG1sIj4bJEJKOD1xGyhCPC9BPiAbJEIkTyEiJDMkThsoQiB3ZWIgGyRCJTUhPCVQR1tJW0oqJE5DZiRLNF4kXiRsJEYkJCReJDkhIxsoQgotPC9wPgotPHA+Ci0bJEIwSjI8JE4yaEF8JE8hIhsoQkFwYWNoZSAbJEIkck14TVEkNyRGJCQkaxsoQiB3ZWIgGyRCJTUhPCVQJEc8K00zJEs7SCQmJDMkSCQsJEckLSReJDkhIxsoQkFwYWNoZSAbJEIkciQ0TXhNUSQkJD8kQCQtISIkIiRqJCwkSCQmJDQkNiQkJF4kORsoQiEKLTwvcD4KLSAgPGRpdiBhbGlnbj0iY2VudGVyIj4KLSAgIDxpbWcgc3JjPSJhcGFjaGVfcGIuZ2lmIiBhbHQ9IiI+Ci0gIDwvZGl2PgotIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLm5sIGIvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwubmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMDc0N2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwubmwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLSA8SEVBRD4KLSAgPFRJVExFPlRlc3QgUGFnaW5hIHZvb3IgZGUgQXBhY2hlIEluc3RhbGxhdGllIG9wIGRlemUgV2ViIFNpdGU8L1RJVExFPgotICA8IS0tIFRyYW5zbGF0ZWQgVHVlIEF1ZyAxNyAyMDo1NzoxNyBHTVQgMTk5OSAtIGRpcmt4QHdlYndlYXZpbmcub3JnIC0tPgotIDwvSEVBRD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLSA8Qk9EWQotICBCR0NPTE9SPSIjRkZGRkZGIgotICBURVhUPSIjMDAwMDAwIgotICBMSU5LPSIjMDAwMEZGIgotICBWTElOSz0iIzAwMDA4MCIKLSAgQUxJTks9IiNGRjAwMDAiCi0gPgotICA8SDEgQUxJR049IkNFTlRFUiI+Ci0gICBBbGxlcyBXZXJrdCEgRGUgQXBhY2hlIFdlYiBTZXJ2ZXIgaXMgZ2VpbnN0YWxsZWVyZCBvcCBkZXplIFdlYiBTaXRlCi0gIDwvSDE+Ci0gIDxQPgotICBNb2NodCB1IGRlemUgcGFnaW5hIHppZW4sIGRhbiBiZXRla2VudCBkYXQsIGRhdCBkZSBlaWdlbmFyZW4gdmFuIGRpdAotICBkb21laW4gem9qdWlzdCBlZW4gbmlldXdlIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9odHRwZCI+QXBhY2hlIFdlYgotICBTZXJ2ZXI8L0E+IGhlYmJlbiBnZWluc3RhbGxlZXJkLiBOdSBtb2V0IG1lbiBub2cgZGUgZWNodGUgaW5ob3VkIGdhYW4KLSAgdG9ldm9lZ2VuLCBlbiBtb2V0IG1lbiBkZXplIHBhZ2luYSBnYWFuIHZlcnZhbmdlbiBkb29yIGRlIGVjaHRlIHdlYgotICBzaXRlLiAKLSAgPC9QPgotICA8SFI+Ci0gIDxCTE9DS1FVT1RFPgotICAgTW9jaHQgdSBkZXplIHBhZ2luYSB6aWVuLCBpbiBwbGFhdHMgdmFuIGRlIHBhZ2luYSBvZiB3ZWIgc2l0ZSBkaWUgdSAKLSAgIHZlcndhY2h0dGUsIG5lZW0gZGFuIDxTVFJPTkc+Y29udGFjdCBvcCBtZXQgZGUgYmVoZWVyZGVyIHZhbgotICAgZGV6ZSBzaXRlPC9TVFJPTkc+LiBCaWp2b29yYmVlbGQgZG9vciBlZW4gYmVyaWNodGplIHRlIHN0dXJlbiBuYWFyCi0gICA8U0FNUD4mbHQ7V2VibWFzdGVyQDxFTT5kaXQtZG9tYWluPC9FTT4mZ3Q7PC9TQU1QPi4KLSAgIDxQPgotICAgQWxob2V3ZWwgZGV6ZSB3ZWIgc2l0ZSBnZWJydWlrIG1hYWt0IHZhbiBkZSBBcGFjaGUgU29mdHdhcmUgaXMgZXIgCi0gICB2ZXJkZXIgZ2VlbiBlbmtlbGUgcmVsYXRpZSB0dXNzZW4gZGUgYmVoZWVyZGVycyB2YW4gZGV6ZSB3ZWIgc2l0ZSBlbgotICAgZGUgQXBhY2hlIEdyb2VwIChkaWUgZGUgd2ViIHNvZnR3YXJlIGdlc2NocmV2ZW4gaGVlZnQpLiBIZXQgaGVlZnQgZHVzCi0gICA8QklHPjxTVFJPTkc+YWJzb2x1dXQ8L1NUUk9ORz48L0JJRz4KLSAgIGdlZW4gemluIGRlIHdlYiBzb2Z0d2FyZSBhdXRldXJzIGVlbiBlbWFpbHRqZSB0ZSBzdHVyZW4uIE1vY2h0IHUgZGF0Ci0gICB0b2NoIGRvZW4sIGRhbiB3b3JkdCB1dyBiZXJpY2h0IGdld29vbiA8U1RST05HPjxCSUc+Z2VuZWdlZXJkPC9CSUc+PC9TVFJPTkc+LgotICA8L0JMT0NLUVVPVEU+Ci0gIDxIUj4KLSAgPFA+Ci0gIERlIAotICA8QSBIUkVGPSJtYW51YWwvaW5kZXguaHRtbCIgPmhhbmRsZWlkaW5nPC9BPiB2b29yIGRlIGFwYWNoZSB3ZWIKLSAgc2VydmVyIHNvZnR3YXJlIG1hYWt0IGRlZWwgdWl0IHZhbiBkZXplIGRpc3RyaWJ1dGllLgotICA8L1A+Ci0gIDxQPgotICBBbHMgYmVoZWVyZGVyIG9mIDxJPndlYm1hc3RlcjwvST4gaXMgaGV0IHUgdG9lZ2VzdGFhbiBoZXQgb25kZXJzdGFhbmRlIAotICBwbGFhdGplIHZyaWplbGlqayB0ZSBnZWJydWlrZW4gb3AgdXcgJ0FwYWNoZSBQb3dlcmVkJyB3ZWIgc2l0ZS4gQmVkYW5rdAotICB2b29yIGhldCBraWV6ZW4gdm9vciwgZW4gZ2VicnVpa2VuIHZhbiwgQXBhY2hlIQotICA8L1A+Ci0gIDxESVYgQUxJR049IkNFTlRFUiI+Ci0gICA8SU1HIFNSQz0iYXBhY2hlX3BiLmdpZiIgQUxUPSJLbGVpbiAnUG93ZXJlZCBieSBBcGFjaGUnIExvZ290amUiPgotICA8L0RJVj4KLSA8L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5ubiBiL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLm5uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2RiOTU3Li4wMDAwMDAwCi0tLSBhL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLm5uCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci0gPEhFQUQ+Ci0gIDxUSVRMRT5UZXN0c2lkZSBBcGFjaGUtaW5zdGFsbGFzam9uPC9USVRMRT4KLSA8L0hFQUQ+Ci08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci0gPEJPRFkKLSAgQkdDT0xPUj0iI0ZGRkZGRiIKLSAgVEVYVD0iIzAwMDAwMCIKLSAgTElOSz0iIzAwMDBGRiIKLSAgVkxJTks9IiMwMDAwODAiCi0gIEFMSU5LPSIjRkYwMDAwIgotID4KLSAgPEgxIEFMSUdOPSJDRU5URVIiPgotICAgRGV0IGdqZWtrIGJyYSEgQXBhY2hlIGVyIG5vIGluc3RhbGxlcnQgcOUgZGVubmUgbWFza2luYSEKLSAgPC9IMT4KLSAgPFA+Ci0gIERlcnNvbSBkdSBrYW4gc2rlIGRlbm5lIHNpZGEsIGhhciBkZW4gZWxsZXIgZGVpIHNvbSBkcml2IGRlbm5lIG5ldHRzdGFkZW4KLSAgaW5zdGFsbGVydCA8QSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9wcmVGQVEuaHRtbCI+QXBhY2hlIHZldnRlbmFyPC9hPi4KLSAgTm8gbeUgZGVubmUgdGVzdHNpZGEgZXJzdGF0dGFzdCBtZWQgdmVya2VsZWcgaW5uaGFsZC4KLSAgPC9QPgotICA8SFI+Ci0gIDxCTE9DS1FVT1RFPgotICBEZXJzb20gZHUgaGFkZGUgdmVudGEg5SBzauUgZWkgYW5uYSBzaWRlIGVubiBkZW5uZSwgYvhyIGR1Ci0gIDxzdHJvbmc+dGEga29udGFrdCBtZWQgZGVuIHNvbSBlciBhbnN2YXJsZWcgZm9yIGRlbm5lIG5ldHRzdGFkZW48L3N0cm9uZz4KLSAgIChQcvh2IOUgc2VuZGUgZS1wb3N0IHRpbCA8U0FNUD4mbHQ7d2VibWFzdGVyQDxFTT5kb21lbmU8L0VNPiZndDs8L1NBTVA+LikKLSAgIFNq+Gx2IG9tIGRlbm5lIG5ldHRzdGFkZW4gdmVydCBravhydCBw5SBBcGFjaGUsIGhhciBkZW4gaW5nZW4gYW5uYW4KLSAgIHRpbGtueXRuaW5nIHRpbCBBcGFjaGUtZ3J1cHBhLCBzb20gaGFyIHV0dmlrbGEgcHJvZ3JhbXZhcmVuLgotICAgVmVyIHNuaWxsIG9nIGlra2plIHNlbmQgZS1wb3N0IG9tIGRlbm5lIG5ldHRzdGFkZW4gZWxsZXIKLSAgIGlubmhhbGRldCBkdSBmaW5uIGhlciB0aWwgdXR2aWtsYXJhbmUgaSBBcGFjaGUtZ3J1cHBhLiAKLSAgIEkgc+UgdGlsZmVsbGUgdmlsIGb4cmVzcHVybmFkZW4gPHN0cm9uZz48QklHPmlnbm9yZXJhc3Q8L0JJRz48L3N0cm9uZz4uCi0gIDwvQkxPQ0tRVU9URT4gICAKLSAgPEhSPgotICA8UD4KLSAgPEEKLSAgIEhSRUY9Im1hbnVhbC9pbmRleC5odG1sIgotICA+RG9rdW1lbnRhc2pvbjwvQT4KLSAgZm9yIEFwYWNoZSBlciBpbmtsdWRlcnQgaSBkZW5uZSBwYWtrYS4KLSAgPC9QPgotICA8UD4KLSAgTG9nb2VuIHVuZGVyIGthbiBicnVrYXN0IHDlIGt2YSBzb20gaGVsc3QgYXYgbWFza2luZXIgc29tIGv4eXJlciBBcGFjaGUuCi0gIFRha2sgZm9yIGF0IGR1IG55dHRhciBBcGFjaGUhCi0gIDwvUD4KLSAgPERJViBBTElHTj0iQ0VOVEVSIj4KLSAgIDxJTUcgU1JDPSJhcGFjaGVfcGIuZ2lmIiBBTFQ9IiI+Ci0gIDwvRElWPgotIDwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLm5vIGIvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwubm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OWM0Y2UuLjAwMDAwMDAKLS0tIGEvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwubm8KKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLSA8SEVBRD4KLSAgPFRJVExFPlRlc3RzaWRlIGZvciBBcGFjaGUgSW5zdGFsbGFzam9uIHDlIFdlYnNpZGU8L1RJVExFPgotIDwvSEVBRD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLSA8Qk9EWQotICBCR0NPTE9SPSIjRkZGRkZGIgotICBURVhUPSIjMDAwMDAwIgotICBMSU5LPSIjMDAwMEZGIgotICBWTElOSz0iIzAwMDA4MCIKLSAgQUxJTks9IiNGRjAwMDAiCi0gPgotICA8SDEgQUxJR049IkNFTlRFUiI+Ci0gICBEZXQgZ2lrayBicmEhIERldCBBcGFjaGUgV2ViIFNlcnZlciBFciBO5SBJbnN0YWxsZXJ0IGhlciEKLSAgPC9IMT4KLSAgPFA+Ci0gIEh2aXMgZHUga2FuIHNlIGRlbm5lIHNpZGVuLCBkZXQgYmV0eXIgYXQgZGUgc29tIGVpZXIgZGVubmUgZG9tZW5lIChkb21haW4pCi0gIGhhciBuZXR0b3BwIGdyZWlkIOUgaW5zdGFsbGVyZSA8QSBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIj5BcGFjaGUgV2ViIHNlcnZlcjwvQT4KLSAgc29mdHdhcmUuICBEZSBt5SB0aWxm+HllIGlubmhvbGQgdGlsIGRlbm5lIGthdGFsb2cgb2cgZXJzdGF0dGUgZGVubmUgCi0gIHBsYXNzaG9sZGVyIHNpZGVuLCBlbGxlcnMgcGVrZSBzZXJ2ZXJlbiB0aWwgZGUgdmlya2VsaWdlIGlubmhvbGQuCi0gIDwvUD4KLSAgPEhSPgotICA8QkxPQ0tRVU9URT4KLSAgSHZpcyBkdSBzZXIgZGVubmUgc2lkZW4gaXN0ZWRlbmZvciBkZW4gZHUgdmVudGV0IGZvciwgdmVubmxpZ3N0IAotICA8U1RST05HPnRhIGtvbnRha3QgbWVkIHdlYnNldmVyIGFkbWluaXN0cmF0+HJlbi48L1NUUk9ORz4KLSAgIChQcvh2IOUgc2VuZGUgZS1wb3N0IHRpbCA8U0FNUD4mbHQ7V2VibWFzdGVyQDxFTT5kb21lbmU8L0VNPiZndDs8L1NBTVA+LikKLSAgIFNlbHYgb20gZGVubmUgaGplbW1lc2lkZW4gZHJpdmVyIG1lZCBBcGFjaGUgc29mdHdhcmUsIGhhciBkZW4gaW5nZW4gYW5uZW4gCi0gICB0aWxrbnl0dGluZyB0aWwgQXBhY2hlIEdydXBwZW4uIFZlbm5saWdzdCBpa2tlIHNlbmQgcG9zdCBhbmflZW5kZSBkZW5uZSBoamVtbWVzaWRlbiBlbGxlciAKLSAgIGRldHMgaW5uaG9sZCB0aWwgQXBhY2hlIHByb2dyYW1tZXJlcmUuIEh2aXMgZHUgZ2r4ciBkZXQsIGRpbiBiZXNramVkIGJsaXIgCi0gICA8U1RST05HPjxCSUc+b3ZlcnNldHQ8L0JJRz48L1NUUk9ORz4uCi0gIDwvQkxPQ0tRVU9URT4KLSAgPEhSPgotICA8UD4KLSAgRGVuIEFwYWNoZQotICA8QQotICAgSFJFRj0ibWFudWFsL2luZGV4Lmh0bWwiCi0gID5kb2t1bWVudGFzam9uPC9BPgotICBlciBpbmtsdWRlcnQgaSBkZW5uZSBkaXN0cmlidXNqb25lbi4KLSAgPC9QPgotICA8UD4KLSAgRGVubmUgc2lkZW5zIFdlYm1hc3RlciBrYW4gYnJ1a2UgZGV0IGdyYWZpa2sgbmVkZW5m+HIgcOUgZW4gQXBhY2hlLWRyZXZldCBXZWJzZXJ2ZXIuCi0gIFRha2sgZm9yIGF0IGR1IGJydWtlciBBcGFjaGUhCi0gIDwvUD4KLSAgPERJViBBTElHTj0iQ0VOVEVSIj4KLSAgIDxJTUcgU1JDPSJhcGFjaGVfcGIuZ2lmIiBBTFQ9IiI+Ci0gIDwvRElWPgotIDwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLnBvLmlzbzg4NTktMiBiL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLnBvLmlzbzg4NTktMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIwMzBiZC4uMDAwMDAwMAotLS0gYS9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5wby5pc284ODU5LTIKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLSA8SEVBRD4KLSAgPFRJVExFPlN0cm9uYSB0ZXN0b3dhIGluc3RhbGFjamkgc2Vyd2VyYSBBcGFjaGU8L1RJVExFPgotICA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0yIj4KLSAgPCEtLSB0cmFuc2xhdGVkIGJ5IEJhcnQgR3J6eWJpY2tpLCBiZ3J6eWJpY2tpQG1vcmxpbnkucGwgLSBodHRwOi8vd3d3LmJncnp5Ymlja2kubW9ybGlueS5wbCBvbiAxOXRoIG9mIERlY2VtYmVyIDIwMDAgLS0+Ci0gPC9IRUFEPgotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotIDxCT0RZCi0gIEJHQ09MT1I9IiNGRkZGRkYiCi0gIFRFWFQ9IiMwMDAwMDAiCi0gIExJTks9IiMwMDAwRkYiCi0gIFZMSU5LPSIjMDAwMDgwIgotICBBTElOSz0iI0ZGMDAwMCIKLSA+Ci0KLQotPFA+Ci1KZb9lbGkgc3Ryb25hIHRhIGplc3Qgd2lkb2N6bmEsIG96bmFjemEgdG8gcG9wcmF3brEgaW5zdGFsYWNq6iBzZXJ3ZXJhIEFwYWNoZS4gIE1vv25hIGp1vyB6YW1pZW5p5iB6YXdhcnRvtuYgdGVqIHdpdHJ5bnkuCi0KLTxQPjxIUiBXSURUSD0iNTAlIiBTSVpFPSI4Ij4KLQotPEgyIEFMSUdOPSJDRU5URVIiPkN6eSB6YW1pYXN0IHNwb2R6aWV3YW5laiB3aXRyeW55IFdXVyB3aWRvY3puYSBqZXN0IHRhPzwvSDI+Ci0KLTxQPgotU3Ryb25hIHRhIGplc3Qgd2lkb2N6bmEsIHBvbmlld2G/IGFkbWluaXN0cmF0b3Igc2Vyd2VyYSBXV1cgem1pZW5psyBqZWdvIGtvbmZpZ3VyYWNq6i4gIAotUHJvc3rqIDxTVFJPTkc+c2tvbnRha3Rvd2HmIHNp6iB6IG9zb2KxIG9kcG93aWVkemlhbG6xIHphIHphcnqxZHphbmllIHR5bSBzZXJ3ZXJlbS48L1NUUk9ORz4gQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHByb2R1Y2VudCBvcHJvZ3JhbW93YW5pYSBzZXJ3ZXJvd2VnbyBBcGFjaGUsIG5pZSBhZG1pbmlzdHJ1amUgdLEgd2l0cnlusSBpIG5pZSBqZXN0IHcgc3RhbmllIHBvbfNjIHcgc3ByYXdhY2ggendpsXphbnljaCB6IGplaiBrb25maWd1cmFjarEuCi0KLTxQPjxIUiBXSURUSD0iNTAlIiBTSVpFPSI4Ij4KLQotCi08UD4KLURvIG5pbmllanN6ZWogZHlzdHJ5YnVjamkgc2Vyd2VyYSBBcGFjaGUgZG+zsWN6b25vIGFuZ2xvaup6eWN6brEgPEEgSFJFRj0ibWFudWFsL2luZGV4Lmh0bWwiPmRva3VtZW50YWNq6jwvQT4uCi0KLTxQPgotUG9uab9zemUgbG9nbywgIlBvd2VyZWQgYnkgQXBhY2hlIiwgbW+/bmEgc3Rvc293YeYgYmV6IG9ncmFuaWN6ZfEuIER6aeprdWplbXkgemEgd3licmFuaWUgQXBhY2hlJ2EhCi0KLTxESVYgQUxJR049IkNFTlRFUiI+PElNRyBTUkM9ImFwYWNoZV9wYi5naWYiIEFMVD0iIj48L0RJVj4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLnB0IGIvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwucHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMjY0NWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwucHQKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLSA8SEVBRD4KLSAgPFRJVExFPlDhZ2luYSBkZSB0ZXN0ZSBkYSBpbnN0YWxh5+NvIGRvIEFwYWNoZSBXZWIgU2VydmVyPC9USVRMRT4KLTwhLS0gb3JpZ2luYWwgdHJhbnNsYXRpb24gZm9yIHBvcnR1Z3Vlc2UgYnkgSHVnbyBSYW1vcywgcmFtb3NAcG9wM3IuY29tLCBTYXQgSmFuIDI5IDA1OjMwOjAwIEdNVCAyMDAwIC0tPgotIDwvSEVBRD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLSA8Qk9EWQotICBCR0NPTE9SPSIjRkZGRkZGIgotICBURVhUPSIjMDAwMDAwIgotICBMSU5LPSIjMDAwMEZGIgotICBWTElOSz0iIzAwMDA4MCIKLSAgQUxJTks9IiNGRjAwMDAiCi0gPgotCi0KLTxQPiBTZSBlc3QmYWFjdXRlOyBhIHZlciBlc3RhIHAmYWFjdXRlO2dpbmEgc2lnbmlmaWNhIHF1ZSBhIGluc3RhbGEmY2NlZGlsOyZhdGlsZGU7byAKLSAgZG8gPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2h0dHBkIj5BcGFjaGUgV2ViIFNlcnZlcjwvQT4gZm9pIGVmZWN0dWFkYSAKLSAgY29tIHN1Y2Vzc28uIFBvZGUgYWdvcmEgYWRpY2lvbmFyIGNvbnRlJnVhY3V0ZTtkbyBhIGVzdGEgZGlyZWN0b3JpYSBlIHN1YnN0aXR1aXIgCi0gIGVzdGEgcCZhYWN1dGU7Z2luYS4gCi08UD48SFIgV0lEVEg9IjUwJSIgU0laRT0iOCI+Ci0KLTxIMiBBTElHTj0iQ0VOVEVSIj5Fc3QmYWFjdXRlOyBhIHZlciBlc3RhIHAmYWFjdXRlO2dpbmEgZW0gdmV6IGRvIHdlYnNpdGUgcXVlIAotICBlc3BlcmF2YT88L0gyPgotCi08UD4gRXN0YSBwJmFhY3V0ZTtnaW5hIGVzdCZhYWN1dGU7IG5lc3RlIG1vbWVudG8gYWN0aXZhIHBvcnF1ZSBvIGFkbWluaXN0cmFkb3IgCi0gIGRlc3RlIHNpdGUgYWx0ZXJvdSBhIGNvbmZpZ3VyYSZjY2VkaWw7JmF0aWxkZTtvIGRvIHdlYiBzZXJ2ZXIuIFBvciBmYXZvciA8U1RST05HPmNvbnRhY3RlIAotICBhIHBlc3NvYSByZXNwb25zJmFhY3V0ZTt2ZWwgcGVsYSBtYW51dGVuJmNjZWRpbDsmYXRpbGRlO28gZGVzdGUgc2Vydmlkb3IuPC9TVFJPTkc+IAotICBBIEZ1bmRhJmNjZWRpbDsmYXRpbGRlO28gQXBhY2hlIFNvZnR3YXJlIChBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiksIGFwZXNhciAKLSAgZGUgdGVyIHByb2R1emlkbyBvIHdlYiBzZXJ2ZXIgcXVlIG8gYWRtaW5pc3RyYWRvciBkZXN0ZSBzaXRlIGVzdCZhYWN1dGU7IGEgdXNhciwgCi0gIG4mYXRpbGRlO28gdGVtIHF1YWxxdWVyIHRpcG8gZGUgcmVzcG9uc2FiaWxpZGFkZSBwZWxhIG1hbnV0ZW4mY2NlZGlsOyZhdGlsZGU7byAKLSAgZGVzdGUgbmVtIHBvZGUgYWp1ZGFyIGEgcmVzb2x2ZXIgcHJvYmxlbWFzIGRlIGNvbmZpZ3VyYSZjY2VkaWw7JmF0aWxkZTtvLiAKLTxQPjxIUiBXSURUSD0iNTAlIiBTSVpFPSI4Ij4KLQotCi08UD4gQSA8QSBIUkVGPSJtYW51YWwvaW5kZXguaHRtbCI+ZG9jdW1lbnRhJmNjZWRpbDsmYXRpbGRlO288L0E+IGZvaSBpbmNsdSZpYWN1dGU7ZGEgCi0gIGp1bnRhbWVudGUgY29tIGVzdGEgZGlzdHJpYnVpJmNjZWRpbDsmYXRpbGRlO28uIAotPFA+IEEgaW1hZ2VtIGFiYWl4byBwb2RlIHNlciB1c2FkYSBsaXZyZW1lbnRlIGVtIHF1YWxxdWVyIHNpdGUgcHJlc2VudGUgbnVtIHNlcnZpZG9yIAotICBjb20gbyBBcGFjaGUgV2ViIFNlcnZlciBpbnN0YWxhZG8uIE9icmlnYWRvIHBvciB1c2FyIG8gQXBhY2hlIFdlYiBTZXJ2ZXIhIAotPERJViBBTElHTj0iQ0VOVEVSIj48SU1HIFNSQz0iYXBhY2hlX3BiLmdpZiIgQUxUPSIiPjwvRElWPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwucHQtYnIgYi9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5wdC1icgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI0MjhkNS4uMDAwMDAwMAotLS0gYS9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5wdC1icgorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotICAgIDxIRUFEPgotICAgICA8VElUTEU+UGFnaW5hIHRlc3RlIHBhcmEgYSBpbnN0YWxhY2FvIGRvIEFwYWNoZSBubyBXZWIgU2l0ZTwvVElUTEU+Ci0gICAgIDwhLS0gb3JpZ2luYWwgdHJhbnNsYXRpb24gRHVsY2UgTGFqYXMsIGR1bGNlLmxhamFzQGpyYy5pdCwgVGh1IEF1ZyAxOSAxMzoxMjowMCBHTVQgMTk5OSAtLT4KLSAgICA8L0hFQUQ+Ci0gICA8IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQKLSAgIChhY3RpdmUpIC0tPgotICAgIDxCT0RZCi0gICAgIEJHQ09MT1I9IiNGRkZGRkYiCi0gICAgIFRFWFQ9IiMwMDAwMDAiCi0gICAgIExJTks9IiMwMDAwRkYiCi0gICAgIFZMSU5LPSIjMDAwMDgwIgotICAgICBBTElOSz0iI0ZGMDAwMCIKLSAgICA+Ci0gICAgIDxIMSBBTElHTj0iQ0VOVEVSIj4KLSAgICAgIEZ1bmNpb25vdSEgIE8gQXBhY2hlIFdlYiBTZXJ2ZXIgZXN0YSBpbnN0YWxhZG8gbmVzdGUgV2ViIFNpdGUhCi0gICAgIDwvSDE+Ci0gICAgIDxQPgotICAgICBTZSBjb25zZWd1aXIgdmVyIGVzdGEgcGFnaW5hLCBlbnRhbyBhcyBwZXNzb2FzIHF1ZSBwb3NzdWVtIGVzdGUKLSAgIGRvbWluaW8gYWNhYmFyYW0KLSAgICAgZGUgaW5zdGFsYXIgbyBzb2Z0d2FyZSA8QSBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvaHR0cGQiPkFwYWNoZSBXZWIKLSAgIHNlcnZlcjwvQT4KLSAgICAgY29tIHN1Y2Vzc28uICBBZ29yYSB0ZW0gZGUgYWRpY2lvbmFyIG8gY29udGV1ZG8gYSBlc3RhIGRpcmVjdG9yaWEKLSAgICAgZSBzdWJzdGl0dWlyIGVzdGEgcGFnaW5hICJwbGFjZWhvbGRlciIsIG91IGFwb250YXIgbyBzZXJ2aWRvciBwYXJhIG8KLSAgIHNldSBjb250ZXVkbyByZWFsLgotICAgICA8L1A+Ci0gICAgIDxIUj4KLSAgICAgPEJMT0NLUVVPVEU+Ci0gICAgICBTZSBlc3RhIGEgdmVyIGVzdGEgcGFnaW5hIGVtIHZleiBkbyBzaXRlIHF1ZSBlc3BlcmF2YSwgcG9yIGZhdm9yCi0gICAgICA8U1RST05HPmNvbnRhY3RlIG8gYWRtaW5pc3RyYWRvciBkbyBzaXRlIGVudm9sdmlkby48L1NUUk9ORz4KLSAgICAgIChUZW50ZSBlbnZpYXIgdW0gZS1tYWlsIHBhcmEKLSAgIDxTQU1QPiZsdDtXZWJtYXN0ZXJAPEVNPmRvbWFpbjwvRU0+Jmd0OzwvU0FNUD4uKQotICAgICAgQXBlc2FyIGRlIG5lc3RlIHNpdGUgZXN0YXIgYQotICAgICAgY29ycmVyIG8gc29mdHdhcmUgQXBhY2hlIGUgcXVhc2UgY2VydG8gcXVlIG5hbyB0ZW0KLSAgICAgIG91dHJhIGxpZ2FjYW8gY29tIG8gR3J1cG8gQXBhY2hlLCBwb3IgaXNzbyBwb3IgZmF2b3IgbmFvIGVudmllCi0gICBlLW1haWxzIGFjZXJjYSBkZXN0ZQotICAgICAgc2l0ZSBvdSBkbyBzZXUgY29udGV1ZG8gcGFyYSBvcyBhdXRvcmVzIGRvIEFwYWNoZS4gIFNlIG8gZml6ZXIsIGEKLSAgIHN1YSBtZW5zYWdlbSB2YWkgc2VyCi0gICAgICA8U1RST05HPjxCSUc+aWdub3JhZGE8L0JJRz48L1NUUk9ORz4uCi0gICAgIDwvQkxPQ0tRVU9URT4KLSAgICAgPEhSPgotICAgICA8UD4KLSAgICAgTyBBcGFjaGUgPEEgSFJFRj0ibWFudWFsL2luZGV4Lmh0bWwiID5kb2N1bWVudGF0aW9uPC9BPgotICAgICBmb2kgaW5jbHVpZG8gY29tIGVzdGEgZGlzdHJpYnVpY2FvLgotICAgICA8L1A+Ci0gICAgIDxQPgotICAgICBPIFdlYm1hc3RlciBkZXN0ZSBzaXRlIGUgbGl2cmUgcGFyYSB1dGlsaXphciBhIGltYWdlbSBhYmFpeG8gbnVtCi0gICAgIFdlYiBzZXJ2ZXIgaW5zdGFsYWRvIGNvbSBvIEFwYWNoZS4gT2JyaWdhZG8gcG9yIHV0aWxpemFyIG8gQXBhY2hlIQotICAgICA8L1A+Ci0gICAgIDxESVYgQUxJR049IkNFTlRFUiI+Ci0gICAgICA8SU1HIFNSQz0iYXBhY2hlX3BiLmdpZiIgQUxUPSIiPgotICAgICA8L0RJVj4KLSAgICA8L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5ydS5jcC0xMjUxIGIvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwucnUuY3AtMTI1MQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZiOGExNi4uMDAwMDAwMAotLS0gYS9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5ydS5jcC0xMjUxCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTEiPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNzIgW2tvaTgtcl0gKFgxMTsgVTsgTGludXggMi4yLjEyLTIwc21wIGk2ODYpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPtLl8fLu4uD/IPHy8ODt6PbgIPPx8uDt7uLq6CBBcGFjaGU8L3RpdGxlPgotPCEtLSDB5ev76SD07u0sIPHx++vq6Dog8ejt6OUgKO3l7+7x5fm47e375SksIPK47O3uLfTo7uvl8u7i++UgKO/u8eX5uO3t++UpLCDq8ODx7fvlICjv7vHl+bjt7fvlKSAtLT4KLTwvaGVhZD4KLTxib2R5IHRleHQ9IiMwMDAwMDAiIGJnY29sb3I9IiNGRkZGRkYiIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjMDAwMDgwIiBhbGluaz0iI0ZGMDAwMCI+Ci3F8evoIML7IP3y7iDi6OTo8uUsIP3y7iDn7eD36PIsIPfy7iDz8fLg7e7i6uAKLc/OIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9odHRwZCI+4uXhLfHl8OLl8OAgQXBhY2hlPC9hPiDt4CD98u7pCi3x6PHy5ezlIOfg4uXw+Ojr4PH8IPPx7+X47e4uIML7IOzu5uXy5SDy5e/l8Pwg5O7h4OLr//L8IPHu5OXw5ujs7uUg4iD98vMKLeTo8OXq8u7w6P4g6CDn4Ozl7ejy/CD98vMg8fLw4O3o9vMuCi08cD4KLTxociBXSURUSD0iNTAlIiBTSVpFPSI4Ij4KLTxjZW50ZXI+Ci08aDI+Ci3C+yDi6OTo8uUg/fLuIOLs5fHy7iDu5ujk4OXs7ukg8fLw4O3o9vs/PC9oMj48L2NlbnRlcj4KLd3y4CDx8vDg7ej24CDt4PXu5Ojy8f8g5+Tl8fwg7+7y7uzzLCD38u4g4OTs6O3o8fLw4PLu8CDx6PHy5ez7IOjn7OXt6OsKLeru7fTo4/Pw4Pbo/iD98u7j7iDi5eEt8eXw4uXw4C4gz+7m4Ovz6fHy4CwgPGI+8eL/5ujy5fH8IPEg6+j27uwsIO7y4uXy8eLl7e377Aot5+Ag7+7k5OXw5urzIP3y7uPuIPHl8OLl8OAg5Ov/IOL7//Ht5e3o/yDi4Pjo9SDi7u/w7vHu4i48L2I+IEFwYWNoZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwg4OLy7vAgz84g4uXhLfHl8OLl8OAsIOru8u7w++wg7+7r/Ofz5fLx/yDg5Ozo7ejx8vDg8u7wIP3y7ukKLfHo8fLl7PssIO3lIPHi/+fg7SDxIO/u5OTl8Obq7ukg/fLu6SDx6PHy5ez7IOgg7eUg7O7m5fIg7+7s7vf8Jm5ic3A7wuDsCi3w4Ofw5fjo8vwg7/Du4evl7Psg6u7t9Ojj8/Dg9ujoLgotPHA+Ci08aHIgV0lEVEg9IjUwJSIgU0laRT0iOCI+Ci08cD48YSBocmVmPSJtYW51YWwvaW5kZXguaHRtbCI+xO7q8+zl7fLg9uj/PC9hPiDv7iDi5eEt8eXw4uXw8yBBcGFjaGUg7/Do6+Dj4OXy8f8KLeog6u7s7+vl6vLzIM/OLgotPHA+wvsg7O7m5fLlIPHi7uHu5O3uIOjx7+7r/Ofu4uDy/CDv6Ory7uPw4Ozs8ywg7eD17uT/+fP+8f8g7ejm5Swg7eAg4uXhLfHl8OLl8OUsCi3o8e/u6/zn8/756Owgz84gQXBhY2hlLiDR7+Dx6OHuIOfgIOjx7+7r/Ofu4uDt6OUgQXBhY2hlIQotPGNlbnRlcj48aW1nIFNSQz0iYXBhY2hlX3BiLmdpZiIgQUxUPSIiID48L2NlbnRlcj4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwucnUuY3A4NjYgYi9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5ydS5jcDg2NgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlmMjYxNS4uMDAwMDAwMAotLS0gYS9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5ydS5jcDg2NgorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aWJtODY2Ij4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjcyIFtrb2k4LXJdIChYMTE7IFU7IExpbnV4IDIuMi4xMi0yMHNtcCBpNjg2KSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT6SpeHirqKg7yDh4uCgrajmoCDj4eKgra6iqqggQXBhY2hlPC90aXRsZT4KLTwhLS0ggaWr66kg5K6tLCDh4eurqqg6IOGorailICitpa+u4aXp8a2t66UpLCDi8aytri3kqK6rpeKuouulICivruGl6fGtreulKSwgquCg4a3rpSAor67hpenxra3rpSkgLS0+Ci08L2hlYWQ+Ci08Ym9keSB0ZXh0PSIjMDAwMDAwIiBiZ2NvbG9yPSIjRkZGRkZGIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzAwMDA4MCIgYWxpbms9IiNGRjAwMDAiPgotheGrqCCC6yDt4q4goqikqOKlLCDt4q4gp62g56jiLCDn4q4g4+HioK2uoqqgCi2PjiA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvaHR0cGQiPqKloS3hpeCipeCgIEFwYWNoZTwvYT4graAg7eKuqQot4ajh4qWspSCnoKKl4Oioq6Dh7CDj4a+l6K2uLiCC6yCsrqal4qUg4qWvpeDsIKSuoaCiq+/i7CDhrqSl4KaorK6lIKIg7eLjCi2kqOClquKu4KjuIKggp6Cspa2o4uwg7eLjIOHi4KCtqObjLgotPHA+Ci08aHIgV0lEVEg9IjUwJSIgU0laRT0iOCI+Ci08Y2VudGVyPgotPGgyPgotgusgoqikqOKlIO3iriCirKXh4q4grqaopKClrK6pIOHi4KCtqObrPzwvaDI+PC9jZW50ZXI+Ci2d4qAg4eLgoK2o5qAgraDlrqSo4uHvIKekpeHsIK+u4q6s4ywg5+KuIKCkrKitqOHi4KDiruAg4ajh4qWs6yCop6ylrairCi2qrq3kqKPj4KDmqO4g7eKuo64goqWhLeGl4KKl4KAuII+upqCr46nh4qAsIDxiPuGi76ao4qXh7CDhIKuo5q6sLCCu4qKl4uGipa2t66wKLaegIK+upKSl4Kaq4yDt4q6jriDhpeCipeCgIKSr7yCi6+/hraWtqO8goqDoqOUgoq6v4K7hrqIuPC9iPiBBcGFjaGUgU29mdHdhcmUKLUZvdW5kYXRpb24sIKCi4q7gII+OIKKloS3hpeCipeCgLCCqruKu4OusIK+uq+yn46Xi4e8goKSsqK2o4eLgoOKu4CDt4q6pCi3hqOHipazrLCCtpSDhou+noK0g4SCvrqSkpeCmqq6pIO3irqkg4ajh4qWs6yCoIK2lIKyupqXiIK+urK7n7CZuYnNwO4KgrAot4KCn4KXoqOLsIK/grqGrpazrIKqureSoo+PgoOaoqC4KLTxwPgotPGhyIFdJRFRIPSI1MCUiIFNJWkU9IjgiPgotPHA+PGEgaHJlZj0ibWFudWFsL2luZGV4Lmh0bWwiPoSuquOspa3ioOao7zwvYT4gr64goqWhLeGl4KKl4OMgQXBhY2hlIK/gqKugo6Cl4uHvCi2qIKqurK+rpari4yCPji4KLTxwPoLrIKyupqXipSDhoq6hrqStriCo4a+uq+ynrqKg4uwgr6iq4q6j4KCsrOMsIK2g5a6k7+nj7uHvIK2opqUsIK2gIKKloS3hpeCipeClLAotqOGvrqvsp+Pu6aisII+OIEFwYWNoZS4gka+g4aihriCnoCCo4a+uq+ynrqKgrailIEFwYWNoZSEKLTxjZW50ZXI+PGltZyBTUkM9ImFwYWNoZV9wYi5naWYiIEFMVD0iIiA+PC9jZW50ZXI+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLnJ1Lmlzby1ydSBiL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLnJ1Lmlzby1ydQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0ZDlmNy4uMDAwMDAwMAotLS0gYS9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5ydS5pc28tcnUKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTUiPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNzIgW2tvaTgtcl0gKFgxMTsgVTsgTGludXggMi4yLjEyLTIwc21wIGk2ODYpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPsLV4eLe0tDvIOHi4NDd2ObQIOPh4tDd3tLa2CBBcGFjaGU8L3RpdGxlPgotPCEtLSCx1dvr2SDk3t0sIOHh69va2Dog4djd2NUgKN3V397h1enx3d3r1SksIOLx3N3eLeTY3tvV4t7S69UgKN/e4dXp8d3d69UpLCDa4NDh3evVICjf3uHV6fHd3evVKSAtLT4KLTwvaGVhZD4KLTxib2R5IHRleHQ9IiMwMDAwMDAiIGJnY29sb3I9IiNGRkZGRkYiIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjMDAwMDgwIiBhbGluaz0iI0ZGMDAwMCI+Ci214dvYILLrIO3i3iDS2NTY4tUsIO3i3iDX3dDn2OIsIOfi3iDj4eLQ3d7S2tAKLb++IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9odHRwZCI+0tXRLeHV4NLV4NAgQXBhY2hlPC9hPiDd0CDt4t7ZCi3h2OHi1dzVINfQ0tXg6Njb0OHsIOPh39Xo3d4uILLrINze1tXi1SDi1d/V4Owg1N7R0NLb7+LsIOHe1NXg1tjc3tUg0iDt4uMKLdTY4NXa4t7g2O4g2CDX0NzV3dji7CDt4uMg4eLg0N3Y5uMuCi08cD4KLTxociBXSURUSD0iNTAlIiBTSVpFPSI4Ij4KLTxjZW50ZXI+Ci08aDI+Ci2y6yDS2NTY4tUg7eLeINLc1eHi3iDe1tjU0NXc3tkg4eLg0N3Y5us/PC9oMj48L2NlbnRlcj4KLc3i0CDh4uDQ3djm0CDd0OXe1Nji4e8g19TV4ewg397i3tzjLCDn4t4g0NTc2N3Y4eLg0OLe4CDh2OHi1dzrINjX3NXd2NsKLdre3eTY0+Pg0ObY7iDt4t7T3iDS1dEt4dXg0tXg0C4gv97W0Nvj2eHi0CwgPGI+4dLv1tji1eHsIOEg29jm3twsIN7i0tXi4dLV3d3r3Aot19Ag397U1NXg1trjIO3i3tPeIOHV4NLV4NAg1NvvINLr7+Hd1d3Y7yDS0OjY5SDS3t/g3uHe0i48L2I+IEFwYWNoZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwg0NLi3uAgv74g0tXRLeHV4NLV4NAsINre4t7g69wg397b7Nfj1eLh7yDQ1NzY3djh4uDQ4t7gIO3i3tkKLeHY4eLV3OssIN3VIOHS79fQ3SDhIN/e1NTV4Nba3tkg7eLe2SDh2OHi1dzrINgg3dUg3N7W1eIg397c3ufsJm5ic3A7stDcCi3g0Nfg1ejY4uwg3+De0dvV3Osg2t7d5NjT4+DQ5tjYLgotPHA+Ci08aHIgV0lEVEg9IjUwJSIgU0laRT0iOCI+Ci08cD48YSBocmVmPSJtYW51YWwvaW5kZXguaHRtbCI+tN7a49zV3eLQ5tjvPC9hPiDf3iDS1dEt4dXg0tXg4yBBcGFjaGUg3+DY29DT0NXi4e8KLdog2t7c39vV2uLjIL++LgotPHA+susg3N7W1eLVIOHS3tHe1N3eINjh397b7Nfe0tDi7CDf2Nri3tPg0Nzc4ywg3dDl3tTv6ePu4e8g3djW1Swg3dAg0tXRLeHV4NLV4NUsCi3Y4d/e2+zX4+7p2Nwgv74gQXBhY2hlLiDB39Dh2NHeINfQINjh397b7Nfe0tDd2NUgQXBhY2hlIQotPGNlbnRlcj48aW1nIFNSQz0iYXBhY2hlX3BiLmdpZiIgQUxUPSIiID48L2NlbnRlcj4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwucnUua29pOC1yIGIvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwucnUua29pOC1yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODViNTYyLi4wMDAwMDAwCi0tLSBhL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLnJ1LmtvaTgtcgorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9a29pOC1yIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjcyIFtrb2k4LXJdIChYMTE7IFU7IExpbnV4IDIuMi4xMi0yMHNtcCBpNjg2KSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT70xdPUz9fB0SDT1NLBzsnDwSDV09TBzs/Xy8kgQXBhY2hlPC90aXRsZT4KLTwhLS0g4sXM2cogxs/OLCDT09nMy8k6INPJzsnFICjOxdDP08Xdo87O2cUpLCDUo83Ozy3Gyc/MxdTP19nFICjQz9PF3aPOztnFKSwgy9LB087ZxSAo0M/Txd2jzs7ZxSkgLS0+Ci08L2hlYWQ+Ci08Ym9keSB0ZXh0PSIjMDAwMDAwIiBiZ2NvbG9yPSIjRkZGRkZGIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzAwMDA4MCIgYWxpbms9IiNGRjAwMDAiPgot5dPMySD32SDc1M8g18nEydTFLCDc1M8g2s7B3snULCDe1M8g1dPUwc7P18vBCi3w7yA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvaHR0cGQiPtfFwi3TxdLXxdLBIEFwYWNoZTwvYT4gzsEg3NTPygot08nT1MXNxSDawdfF0tvJzMHT2CDV09DF287PLiD32SDNz9bF1MUg1MXQxdLYIMTPwsHXzNHU2CDTz8TF0tbJzc/FINcg3NTVCi3EydLFy9TP0snAIMkg2sHNxc7J1Ngg3NTVINPU0sHOycPVLgotPHA+Ci08aHIgV0lEVEg9IjUwJSIgU0laRT0iOCI+Ci08Y2VudGVyPgotPGgyPgot99kg18nEydTFINzUzyDXzcXT1M8gz9bJxMHFzc/KINPU0sHOycPZPzwvaDI+PC9jZW50ZXI+Ci381MEg09TSwc7Jw8EgzsHIz8TJ1NPRINrExdPYINDP1M/N1Swg3tTPIMHEzcnOydPU0sHUz9Ig08nT1MXN2SDJ2s3FzsnMCi3Lz87GycfV0sHDycAg3NTPx88g18XCLdPF0tfF0sEuIPDP1sHM1crT1MEsIDxiPtPX0dbJ1MXT2CDTIMzJw8/NLCDP1NfF1NPXxc7O2c0KLdrBINDPxMTF0tbL1SDc1M/HzyDTxdLXxdLBIMTM0SDX2dHTzsXOydEg18Hbycgg18/Q0s/Tz9cuPC9iPiBBcGFjaGUgU29mdHdhcmUKLUZvdW5kYXRpb24sIMHX1M/SIPDvINfFwi3TxdLXxdLBLCDLz9TP0tnNINDPzNja1cXU09EgwcTNyc7J09TSwdTP0iDc1M/KCi3TydPUxc3ZLCDOxSDT19Hawc4g0yDQz8TExdLWy8/KINzUz8og08nT1MXN2SDJIM7FIM3P1sXUINDPzc/e2CZuYnNwO/fBzQot0sHa0sXbydTYINDSz8LMxc3ZIMvPzsbJx9XSwcPJyS4KLTxwPgotPGhyIFdJRFRIPSI1MCUiIFNJWkU9IjgiPgotPHA+PGEgaHJlZj0ibWFudWFsL2luZGV4Lmh0bWwiPuTPy9XNxc7UwcPJ0TwvYT4g0M8g18XCLdPF0tfF0tUgQXBhY2hlINDSyczBx8HF1NPRCi3LIMvPzdDMxcvU1SDw7y4KLTxwPvfZIM3P1sXUxSDT18/Cz8TOzyDJ09DPzNjaz9fB1Ngg0MnL1M/H0sHNzdUsIM7ByM/E0d3VwNPRIM7J1sUsIM7BINfFwi3TxdLXxdLFLAotydPQz8zY2tXA3cnNIPDvIEFwYWNoZS4g89DB08nCzyDawSDJ09DPzNjaz9fBzsnFIEFwYWNoZSEKLTxjZW50ZXI+PGltZyBTUkM9ImFwYWNoZV9wYi5naWYiIEFMVD0iIiA+PC9jZW50ZXI+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLnJ1LnV0ZjggYi9kb2NzL2RvY3Jvb3QvaW5kZXguaHRtbC5ydS51dGY4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGE5M2MzLi4wMDAwMDAwCi0tLSBhL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLnJ1LnV0ZjgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjcyIFtrb2k4LXJdIChYMTE7IFU7IExpbnV4IDIuMi4xMi0yMHNtcCBpNjg2KSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT7QotC10YHRgtC+0LLQsNGPINGB0YLRgNCw0L3QuNGG0LAg0YPRgdGC0LDQvdC+0LLQutC4IEFwYWNoZTwvdGl0bGU+Ci08IS0tINCR0LXQu9GL0Lkg0YTQvtC9LCDRgdGB0YvQu9C60Lg6INGB0LjQvdC40LUgKNC90LXQv9C+0YHQtdGJ0ZHQvdC90YvQtSksINGC0ZHQvNC90L4t0YTQuNC+0LvQtdGC0L7QstGL0LUgKNC/0L7RgdC10YnRkdC90L3Ri9C1KSwg0LrRgNCw0YHQvdGL0LUgKNC/0L7RgdC10YnRkdC90L3Ri9C1KSAtLT4KLTwvaGVhZD4KLTxib2R5IHRleHQ9IiMwMDAwMDAiIGJnY29sb3I9IiNGRkZGRkYiIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjMDAwMDgwIiBhbGluaz0iI0ZGMDAwMCI+Ci3QldGB0LvQuCDQktGLINGN0YLQviDQstC40LTQuNGC0LUsINGN0YLQviDQt9C90LDRh9C40YIsINGH0YLQviDRg9GB0YLQsNC90L7QstC60LAKLdCf0J4gPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2h0dHBkIj7QstC10LEt0YHQtdGA0LLQtdGA0LAgQXBhY2hlPC9hPiDQvdCwINGN0YLQvtC5Ci3RgdC40YHRgtC10LzQtSDQt9Cw0LLQtdGA0YjQuNC70LDRgdGMINGD0YHQv9C10YjQvdC+LiDQktGLINC80L7QttC10YLQtSDRgtC10L/QtdGA0Ywg0LTQvtCx0LDQstC70Y/RgtGMINGB0L7QtNC10YDQttC40LzQvtC1INCyINGN0YLRgwot0LTQuNGA0LXQutGC0L7RgNC40Y4g0Lgg0LfQsNC80LXQvdC40YLRjCDRjdGC0YMg0YHRgtGA0LDQvdC40YbRgy4KLTxwPgotPGhyIFdJRFRIPSI1MCUiIFNJWkU9IjgiPgotPGNlbnRlcj4KLTxoMj4KLdCS0Ysg0LLQuNC00LjRgtC1INGN0YLQviDQstC80LXRgdGC0L4g0L7QttC40LTQsNC10LzQvtC5INGB0YLRgNCw0L3QuNGG0Ys/PC9oMj48L2NlbnRlcj4KLdCt0YLQsCDRgdGC0YDQsNC90LjRhtCwINC90LDRhdC+0LTQuNGC0YHRjyDQt9C00LXRgdGMINC/0L7RgtC+0LzRgywg0YfRgtC+INCw0LTQvNC40L3QuNGB0YLRgNCw0YLQvtGAINGB0LjRgdGC0LXQvNGLINC40LfQvNC10L3QuNC7Ci3QutC+0L3RhNC40LPRg9GA0LDRhtC40Y4g0Y3RgtC+0LPQviDQstC10LEt0YHQtdGA0LLQtdGA0LAuINCf0L7QttCw0LvRg9C50YHRgtCwLCA8Yj7RgdCy0Y/QttC40YLQtdGB0Ywg0YEg0LvQuNGG0L7QvCwg0L7RgtCy0LXRgtGB0LLQtdC90L3Ri9C8Ci3Qt9CwINC/0L7QtNC00LXRgNC20LrRgyDRjdGC0L7Qs9C+INGB0LXRgNCy0LXRgNCwINC00LvRjyDQstGL0Y/RgdC90LXQvdC40Y8g0LLQsNGI0LjRhSDQstC+0L/RgNC+0YHQvtCyLjwvYj4gQXBhY2hlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCDQsNCy0YLQvtGAINCf0J4g0LLQtdCxLdGB0LXRgNCy0LXRgNCwLCDQutC+0YLQvtGA0YvQvCDQv9C+0LvRjNC30YPQtdGC0YHRjyDQsNC00LzQuNC90LjRgdGC0YDQsNGC0L7RgCDRjdGC0L7QuQot0YHQuNGB0YLQtdC80YssINC90LUg0YHQstGP0LfQsNC9INGBINC/0L7QtNC00LXRgNC20LrQvtC5INGN0YLQvtC5INGB0LjRgdGC0LXQvNGLINC4INC90LUg0LzQvtC20LXRgiDQv9C+0LzQvtGH0YwmbmJzcDvQktCw0LwKLdGA0LDQt9GA0LXRiNC40YLRjCDQv9GA0L7QsdC70LXQvNGLINC60L7QvdGE0LjQs9GD0YDQsNGG0LjQuC4KLTxwPgotPGhyIFdJRFRIPSI1MCUiIFNJWkU9IjgiPgotPHA+PGEgaHJlZj0ibWFudWFsL2luZGV4Lmh0bWwiPtCU0L7QutGD0LzQtdC90YLQsNGG0LjRjzwvYT4g0L/QviDQstC10LEt0YHQtdGA0LLQtdGA0YMgQXBhY2hlINC/0YDQuNC70LDQs9Cw0LXRgtGB0Y8KLdC6INC60L7QvNC/0LvQtdC60YLRgyDQn9CeLgotPHA+0JLRiyDQvNC+0LbQtdGC0LUg0YHQstC+0LHQvtC00L3QviDQuNGB0L/QvtC70YzQt9C+0LLQsNGC0Ywg0L/QuNC60YLQvtCz0YDQsNC80LzRgywg0L3QsNGF0L7QtNGP0YnRg9GO0YHRjyDQvdC40LbQtSwg0L3QsCDQstC10LEt0YHQtdGA0LLQtdGA0LUsCi3QuNGB0L/QvtC70YzQt9GD0Y7RidC40Lwg0J/QniBBcGFjaGUuINCh0L/QsNGB0LjQsdC+INC30LAg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40LUgQXBhY2hlIQotPGNlbnRlcj48aW1nIFNSQz0iYXBhY2hlX3BiLmdpZiIgQUxUPSIiID48L2NlbnRlcj4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwudmFyIGIvZG9jcy9kb2Nyb290L2luZGV4Lmh0bWwudmFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjY5M2ZmLi4wMDAwMDAwCi0tLSBhL2RvY3MvZG9jcm9vdC9pbmRleC5odG1sLnZhcgorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLWluZGV4Lmh0bWwuY2EKLWluZGV4Lmh0bWwuY3oKLWluZGV4Lmh0bWwuZGUKLWluZGV4Lmh0bWwuZGsKLWluZGV4Lmh0bWwuZWUKLWluZGV4Lmh0bWwuZWwKLWluZGV4Lmh0bWwuZW4KLWluZGV4Lmh0bWwuZXMKLWluZGV4Lmh0bWwuZXQKLWluZGV4Lmh0bWwuZnIKLWluZGV4Lmh0bWwuaGUuaXNvODg1OS04Ci1pbmRleC5odG1sLml0Ci1pbmRleC5odG1sLmphLmlzbzIwMjItanAKLWluZGV4Lmh0bWwuamEuamlzCi1pbmRleC5odG1sLmtyLmlzby1rcgotaW5kZXguaHRtbC5rci5pc28yMDIyLWtyCi1pbmRleC5odG1sLmx0egotaW5kZXguaHRtbC5sdQotaW5kZXguaHRtbC5ubAotaW5kZXguaHRtbC5ubwotaW5kZXguaHRtbC5wby5pc28tcGwKLWluZGV4Lmh0bWwucHQKLWluZGV4Lmh0bWwucHQtYnIKLWluZGV4Lmh0bWwucnUuY3AtMTI1MQotaW5kZXguaHRtbC5ydS5jcDg2NgotaW5kZXguaHRtbC5ydS5pc28tcnUKLWluZGV4Lmh0bWwucnUua29pOC1yCi1pbmRleC5odG1sLnJ1LnVjczIKLWluZGV4Lmh0bWwucnUudWNzNAotaW5kZXguaHRtbC5ydS51dGY4Ci1pbmRleC5odG1sLnNlCi1pbmRleC5odG1sLnR3Ci1pbmRleC5odG1sLnR3LkJpZzUKLWluZGV4Lmh0bWwudmFyCmRpZmYgLS1naXQgYS9kb2NzL2RveHlnZW4uY29uZiBiL2RvY3MvZG94eWdlbi5jb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWE2ZTljLi4wMDAwMDAwCi0tLSBhL2RvY3MvZG94eWdlbi5jb25mCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotUFJPSkVDVF9OQU1FPUFwYWNoZQotCi1JTlBVVD0uCi1SRUNVUlNJVkU9WUVTCi1GSUxFX1BBVFRFUk5TPSouaAotCi1PVVRQVVRfRElSRUNUT1JZPWRvY3MvZG94Ci0KLU1BQ1JPX0VYUEFOU0lPTj1ZRVMKLUVYUEFORF9PTkxZX1BSRURFRj1ZRVMKLUVYUEFORF9BU19ERUZJTkVEPUFQX0RFQ0xBUkUKLQotT1BUSU1JWkVfT1VUUFVUX0ZPUl9DPVlFUwpkaWZmIC0tZ2l0IGEvZG9jcy9lcnJvci9IVFRQX0JBRF9HQVRFV0FZLmh0bWwudmFyIGIvZG9jcy9lcnJvci9IVFRQX0JBRF9HQVRFV0FZLmh0bWwudmFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmY4MWRlLi4wMDAwMDAwCi0tLSBhL2RvY3MvZXJyb3IvSFRUUF9CQURfR0FURVdBWS5odG1sLnZhcgorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLUNvbnRlbnQtbGFuZ3VhZ2U6IGRlCi1Db250ZW50LXR5cGU6IHRleHQvaHRtbAotQm9keTotLS0tLS0tLS0tZGUtLQotPCEtLSNzZXQgdmFyPSJUSVRMRSIgdmFsdWU9IkZlaGxlcmhhZnRlcyBHYXRld2F5ISIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS90b3AuaHRtbCIgLS0+Ci0KLSAgICBEZXIgUHJveHktU2VydmVyIGVyaGllbHQgZWluZSBmZWhsZXJoYWZ0ZSBBbnR3b3J0Ci0gICAgZWluZXMg/GJlcmdlb3JkbmV0ZW4gU2VydmVycyBvZGVyIFByb3hpZXMuIAotCi0gIDwhLS0jaWYgZXhwcj0iJFJFRElSRUNUX0VSUk9SX05PVEVTIiAtLT4KLSAgICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9zcGFjZXIuaHRtbCIgLS0+Ci0gICAgPCEtLSNlY2hvIHZhcj0iUkVESVJFQ1RfRVJST1JfTk9URVMiIC0tPgotICA8IS0tI2VuZGlmIC0tPgotICAgICAKLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4KLS0tLS0tLS0tLS1kZS0tCi0KLUNvbnRlbnQtbGFuZ3VhZ2U6IGVuCi1Db250ZW50LXR5cGU6IHRleHQvaHRtbAotQm9keTotLS0tLS0tLS0tZW4tLQotPCEtLSNzZXQgdmFyPSJUSVRMRSIgdmFsdWU9IkJhZCBHYXRld2F5ISIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS90b3AuaHRtbCIgLS0+Ci0KLSAgICBUaGUgcHJveHkgc2VydmVyIHJlY2VpdmVkIGFuIGludmFsaWQKLSAgICByZXNwb25zZSBmcm9tIGFuIHVwc3RyZWFtIHNlcnZlci4KLQotICA8IS0tI2lmIGV4cHI9IiRSRURJUkVDVF9FUlJPUl9OT1RFUyIgLS0+Ci0gICAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvc3BhY2VyLmh0bWwiIC0tPgotICAgIDwhLS0jZWNobyB2YXI9IlJFRElSRUNUX0VSUk9SX05PVEVTIiAtLT4KLSAgPCEtLSNlbmRpZiAtLT4KLSAgICAKLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4KLS0tLS0tLS0tLS1lbi0tCi0KLUNvbnRlbnQtbGFuZ3VhZ2U6IGVzCi1Db250ZW50LXR5cGU6IHRleHQvaHRtbAotQm9keTotLS0tLS0tLS0tZXMtLQotPCEtLSNzZXQgdmFyPSJUSVRMRSIgdmFsdWU9IkJhZCBHYXRld2F5ISIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS90b3AuaHRtbCIgLS0+Ci0KLQlFbCBzZXJ2aWRvciBmdWVudGUgcmVjaWJpbyBpbmZvcm1hY2kmb2FjdXRlO24gCi0JaW52JmFhY3V0ZTtsaWRhIHBvciBwYXJ0ZSBkZWwgc2Vydmlkb3IgZGVzdGluby4KLQotICA8IS0tI2lmIGV4cHI9IiRSRURJUkVDVF9FUlJPUl9OT1RFUyIgLS0+Ci0gICAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvc3BhY2VyLmh0bWwiIC0tPgotICAgIDwhLS0jZWNobyB2YXI9IlJFRElSRUNUX0VSUk9SX05PVEVTIiAtLT4KLSAgPCEtLSNlbmRpZiAtLT4KLSAgICAKLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4KLS0tLS0tLS0tLS1lcy0tCi0KLUNvbnRlbnQtbGFuZ3VhZ2U6IGZyCi1Db250ZW50LXR5cGU6IHRleHQvaHRtbAotQm9keTotLS0tLS0tLS0tZnItLQotPCEtLSNzZXQgdmFyPSJUSVRMRSIgdmFsdWU9IkdhdGV3YXkgaW5jb3JyZWN0ISIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS90b3AuaHRtbCIgLS0+Ci0KLSAgICBMZSBzZXJ2ZXVyIHByb3h5IGEgcmUmY2NlZGlsO3UgdW5lIHImZWFjdXRlO3BvbnNlIGluY29ycmVjdGUgZGUgbGEgcGFydCBkJ3VuIHNlcnZldXIgc3VwJmVhY3V0ZTtyaWV1ci4gCi0KLSAgPCEtLSNpZiBleHByPSIkUkVESVJFQ1RfRVJST1JfTk9URVMiIC0tPgotICAgIDwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3NwYWNlci5odG1sIiAtLT4KLSAgICA8IS0tI2VjaG8gdmFyPSJSRURJUkVDVF9FUlJPUl9OT1RFUyIgLS0+Ci0gIDwhLS0jZW5kaWYgLS0+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4gICAKLS0tLS0tLS0tLS1mci0tCmRpZmYgLS1naXQgYS9kb2NzL2Vycm9yL0hUVFBfQkFEX1JFUVVFU1QuaHRtbC52YXIgYi9kb2NzL2Vycm9yL0hUVFBfQkFEX1JFUVVFU1QuaHRtbC52YXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOGRiODEuLjAwMDAwMDAKLS0tIGEvZG9jcy9lcnJvci9IVFRQX0JBRF9SRVFVRVNULmh0bWwudmFyCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotQ29udGVudC1sYW5ndWFnZTogZGUKLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1kZS0tCi08IS0tI3NldCB2YXI9IlRJVExFIiB2YWx1ZT0iRmVobGVyaGFmdGUgQW5mcmFnZSEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi0gICAgSWhyIEJyb3dzZXIgKG9kZXIgUHJveHkpIGhhdCBlaW5lIHVuZ/xsdGlnZSBBbmZyYWdlIGdlc2VuZGV0LAotICAgIGRpZSB2b20gU2VydmVyIG5pY2h0IGJlYW50d29ydGV0IHdlcmRlbiBrYW5uLgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZGUtLQotCi1Db250ZW50LWxhbmd1YWdlOiBlbgotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWVuLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJCYWQgcmVxdWVzdCEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi0gICAgWW91ciBicm93c2VyIChvciBwcm94eSkgc2VudCBhIHJlcXVlc3QgdGhhdAotICAgIHRoaXMgc2VydmVyIGNvdWxkIG5vdCB1bmRlcnN0YW5kLgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZW4tLQotCi1Db250ZW50LWxhbmd1YWdlOiBlcwotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWVzLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJCYWQgcmVxdWVzdCEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi0JRWwgYnVzY2Fkb3IgaGEgc29saWNpdGFkbyB1bmEgb3BlcmFjaSZvYWN1dGU7bgotCXF1ZSBubyBwdWVkZSBzZXIgcHJvY2VzYWRhIHBvciBlbCBzZXJ2aWRvci4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvYm90dG9tLmh0bWwiIC0tPgotLS0tLS0tLS0tLWVzLS0KLQotQ29udGVudC1sYW5ndWFnZTogZnIKLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1mci0tCi08IS0tI3NldCB2YXI9IlRJVExFIiB2YWx1ZT0iZGVtYW5kZSBpbmNvcnJlY3RlISIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS90b3AuaHRtbCIgLS0+Ci0KLSAgICBWb3RyZSBuYXZpZ2F0ZXVyIChvdSB2b3RyZSBwcm94eSkgYSBlbnZveSZlYWN1dGU7IHVuZSBkZW1hbmRlIHF1ZSBjZSBzZXJ2ZXVyIG4nYSBwYXMgY29tcHJpc2UuCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4gIAotLS0tLS0tLS0tLWZyLS0KZGlmZiAtLWdpdCBhL2RvY3MvZXJyb3IvSFRUUF9GT1JCSURERU4uaHRtbC52YXIgYi9kb2NzL2Vycm9yL0hUVFBfRk9SQklEREVOLmh0bWwudmFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTMwY2ViLi4wMDAwMDAwCi0tLSBhL2RvY3MvZXJyb3IvSFRUUF9GT1JCSURERU4uaHRtbC52YXIKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi1Db250ZW50LWxhbmd1YWdlOiBkZQotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWRlLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJadWdyaWZmIHZlcndlaWdlcnQhIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLQotICA8IS0tI2lmIGV4cHI9IiRSRURJUkVDVF9VUkw9Ly8kLyIgLS0+Ci0KLSAgICBEZXIgWnVncmlmZiBhdWYgZGFzIGFuZ2Vmb3JkZXJ0ZSBWZXJ6ZWljaG5pcyBpc3QgbmljaHQgbfZnbGljaC4KLSAgICBFbnR3ZWRlciBpc3Qga2VpbiBJbmRleC1Eb2t1bWVudCB2b3JoYW5kZW4gb2RlciBkYXMgVmVyemVpY2huaXMKLSAgICBpc3QgenVncmlmZnNnZXNjaPx0enQuCi0KLSAgPCEtLSNlbHNlIC0tPgotCi0gICAgRGVyIFp1Z3JpZmYgYXVmIGRhcyBhbmdlZm9yZGVydGUgT2JqZWt0IGlzdCBuaWNodCBt9mdsaWNoLgotICAgIEVudHdlZGVyIGthbm4gZXMgdm9tIFNlcnZlciBuaWNodCBnZWxlc2VuIHdlcmRlbiBvZGVyIGVzCi0gICAgaXN0IHp1Z3JpZmZzZ2VzY2j8dHp0LgotCi0gIDwhLS0jZW5kaWYgLS0+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4KLS0tLS0tLS0tLS1kZS0tCi0KLUNvbnRlbnQtbGFuZ3VhZ2U6IGVuCi1Db250ZW50LXR5cGU6IHRleHQvaHRtbAotQm9keTotLS0tLS0tLS0tZW4tLQotPCEtLSNzZXQgdmFyPSJUSVRMRSIgdmFsdWU9IkFjY2VzcyBmb3JiaWRkZW4hIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLTwhLS0jaWYgZXhwcj0iJFJFRElSRUNUX1VSTD0vLyQvIiAtLT4KLQotICAgWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHJlcXVlc3RlZCBkaXJlY3RvcnkuCi0gICBUaGVyZSBpcyBlaXRoZXIgbm8gaW5kZXggZG9jdW1lbnQgb3IgdGhlIGRpcmVjdG9yeSBpcyByZWFkLXByb3RlY3RlZC4KLQotICA8IS0tI2Vsc2UgLS0+Ci0KLSAgIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSByZXF1ZXN0ZWQgb2JqZWN0LgotICAgSXQgaXMgZWl0aGVyIHJlYWQtcHJvdGVjdGVkIG9yIG5vdCByZWFkYWJsZSBieSB0aGUgc2VydmVyLgotCi0gIDwhLS0jZW5kaWYgLS0+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4KLS0tLS0tLS0tLS1lbi0tCi0KLUNvbnRlbnQtbGFuZ3VhZ2U6IGVzCi1Db250ZW50LXR5cGU6IHRleHQvaHRtbAotQm9keTotLS0tLS0tLS0tZXMtLQotPCEtLSNzZXQgdmFyPSJUSVRMRSIgdmFsdWU9IkFjY2VzcyBmb3JiaWRkZW4hIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLQotICA8IS0tI2lmIGV4cHI9IiRSRURJUkVDVF9VUkw9Ly8kLyIgLS0+Ci0KLSAgICAgICAgVXN0ZWQgbm8gdGllbmUgcGVybWlzbyBwYXJhIGFjY2VzYXIgYSBsYSBkaXJlY2NpJm9hY3V0ZTtuCi0gICAgICAgIHNvbGljaXRhZGEuIEV4aXN0ZSBsYSBwb3NpYmlsaWRhZCBkZSBxdWUgZWwgZGlyZWN0b3JpbwotICAgICAgICBlc3RlIHByb3RlZ2lkbyBjb250cmEgbGVjdHVyYSBvIHF1ZSBubyBleGlzdGEgbGEKLSAgICAgICAgZG9jdW1lbnRhY2kmb2FjdXRlO24gcmVxdWVyaWRhLgotCi0gIDwhLS0jZWxzZSAtLT4KLQotICAgICAgICBVc3RlZCBubyB0aWVuZSBwZXJtaXNvIGRlIGFjY2VzYXIgYWwgb2JqZXRvIHNvbGljaXRhZG8uCi0gICAgICAgIEV4aXN0ZSBsYSBwb3NpYmlsaWRhZCBkZSBxdWUgZXN0ZSBwcm90ZWdpZG8gY29udHJhCi0gICAgICAgIGxlY3R1cmEgbyBxdWUgbm8gaGF5YSBwb2RpZG8gc2VyIGxlaWRvIHBvciBlbCBzZXJ2aWRvci4KLQotICA8IS0tI2VuZGlmIC0tPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZXMtLQotCi1Db250ZW50LWxhbmd1YWdlOiBmcgotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWZyLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJBY2MmZWdyYXZlO3MgaW50ZXJkaXQhIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLTwhLS0jaWYgZXhwcj0iJFJFRElSRUNUX1VSTD0vLyQvIiAtLT4KLVZvdXMgbidhdmV6IHBhcyBsZSBkcm9pdCBkJ2FjYyZlYWN1dGU7ZGVyIGF1IHImZWFjdXRlO3BlcnRvaXJlCi1kZW1hbmQmZWFjdXRlOy4gU29pdCBpbCBuJ3kgYSBwYXMgZGUgZG9jdW1lbnQgaW5kZXggc29pdCBsZSByJmVhY3V0ZTtwZXJ0b2lyZQotZXN0IHByb3QmZWFjdXRlO2cmZWFjdXRlOy4KLTwhLS0jZWxzZSAtLT4KLVZvdXMgbidhdmV6IHBhcyBsZSBkcm9pdCBkJ2FjYyZlYWN1dGU7ZGVyICZhZ3JhdmU7IGwnb2JqZXQKLWRlbWFuZCZlYWN1dGU7LiBTb2l0IGNlbHVpLWNpIGVzdCBwcm90JmVhY3V0ZTtnJmVhY3V0ZTssIHNvaXQgaWwgbmUgcGV1dAotJmVjaXJjO3RyZSBsdSBwYXIgbGUgc2VydmV1ci4KLTwhLS0jZW5kaWYgLS0+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4KLS0tLS0tLS0tLS1mci0tCmRpZmYgLS1naXQgYS9kb2NzL2Vycm9yL0hUVFBfR09ORS5odG1sLnZhciBiL2RvY3MvZXJyb3IvSFRUUF9HT05FLmh0bWwudmFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmFlZjdjLi4wMDAwMDAwCi0tLSBhL2RvY3MvZXJyb3IvSFRUUF9HT05FLmh0bWwudmFyCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLUNvbnRlbnQtbGFuZ3VhZ2U6IGRlCi1Db250ZW50LXR5cGU6IHRleHQvaHRtbAotQm9keTotLS0tLS0tLS0tZGUtLQotPCEtLSNzZXQgdmFyPSJUSVRMRSIgdmFsdWU9Ik9iamVrdCBuaWNodCBtZWhyIHZlcmb8Z2JhciEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi0gICAgRGVyIGFuZ2Vmb3JkZXJ0ZSBVUkwgZXhpc3RpZXJ0IGF1ZiBkZW0gU2VydmVyIG5pY2h0IG1laHIKLSAgICB1bmQgd3VyZGUgZGF1ZXJoYWZ0IGVudGZlcm50LgotICAgIEVpbmUgV2VpdGVybGVpdHVuZ3NhZHJlc3NlIGlzdCBuaWNodCB2ZXJm/GdiYXIuCi0KLSAgPCEtLSNpZiBleHByPSIkSFRUUF9SRUZFUkVSIiAtLT4KLQotICAgIEJpdHRlIGluZm9ybWllcmVuIFNpZSBkZW4gQXV0b3IgZGVyCi0gICAgPGEgaHJlZj0iPCEtLSNlY2hvIGVuY29kaW5nPSJ1cmwiIHZhcj0iSFRUUF9SRUZFUkVSIi0tPiI+dmVyd2Vpc2VuZGVuIFNlaXRlPC9hPgotICAgIGRhcyBkZXIgTGluayBuaWNodCBtZWhyIGFrdHVlbGwgaXN0LgotCi0gIDwhLS0jZWxzZSAtLT4KLQotICAgIEZhbGxzIFNpZSBlaW5lbSBMaW5rIHZvbiBlaW5lciBhbmRlcmVuIFNlaXRlIGdlZm9sZ3Qgc2luZCwKLSAgICBpbmZvcm1pZXJlbiBTaWUgYml0dGUgZGVuIEF1dG9yIGRlciBTZWl0ZSBoaWVy/GJlci4KLQotICA8IS0tI2VuZGlmIC0tPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZGUtLQotCi1Db250ZW50LWxhbmd1YWdlOiBlbgotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWVuLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJSZXNvdXJjZSBpcyBubyBsb25nZXIgYXZhaWxhYmxlISIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS90b3AuaHRtbCIgLS0+Ci0KLSAgIFRoZSByZXF1ZXN0ZWQgVVJMIGlzIG5vIGxvbmdlciBhdmFpbGFibGUgb24gdGhpcyBzZXJ2ZXIgYW5kIHRoZXJlIGlzIG5vCi0gICBmb3J3YXJkaW5nIGFkZHJlc3MuCi0gIAotICA8IS0tI2lmIGV4cHI9IiRIVFRQX1JFRkVSRVIiIC0tPgotICAKLSAgIFBsZWFzZSBpbmZvcm0gdGhlIGF1dGhvciBvZiB0aGUKLSAgIDxhIGhyZWY9IjwhLS0jZWNobyBlbmNvZGluZz0idXJsIiB2YXI9IkhUVFBfUkVGRVJFUiItLT4iPnJlZmVycmluZwotICAgcGFnZTwvYT4gdGhhdCB0aGUgbGluayBpcyBvdXRkYXRlZC4KLSAgIAotICA8IS0tI2Vsc2UgLS0+Ci0gIAotICAgSWYgeW91IGZvbGxvd2VkIGEgbGluayBmcm9tIGEgZm9yZWlnbiBwYWdlLCBwbGVhc2UgY29udGFjdCB0aGUKLSAgIGF1dGhvciBvZiB0aGlzIHBhZ2UuCi0gICAKLSAgPCEtLSNlbmRpZiAtLT4KLSAgCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+IAotLS0tLS0tLS0tLWVuLS0KLQotQ29udGVudC1sYW5ndWFnZTogZXMKLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1lcy0tCi08IS0tI3NldCB2YXI9IlRJVExFIiB2YWx1ZT0iUmVzb3VyY2UgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi0JTG9zIHJlY3Vyc29zIHNvbGljaXRhZG9zIHlhIG5vIGVzdGFuIGRpc3BvbmlibGVzIGVuCi0JZXN0ZSBzZXJ2aWRvciB5IG5vIGV4aXN0ZSB1bmEgZGlyZWNjaSZvYWN1dGU7biBhbHRlcm5hLgotCi0gIDwhLS0jaWYgZXhwcj0iJEhUVFBfUkVGRVJFUiIgLS0+Ci0KLQlMZSBzb2xpY2l0YW1vcyBxdWUgY29tdW5pcXVlIGFsIGF1dG9yIGRlIGxhIAotCTxhIGhyZWY9IjwhLS0jZWNobyBlbmNvZGluZz0idXJsIiB2YXI9IkhUVFBfUkVGRVJFUiItLT4iPnAmYWFjdXRlO2dpbmEgCi0JcmVmZXJpZGE8L2E+IHF1ZSBlbCBVUkwgZXN0YSBmdWVyYSBkZSB0aWVtcG8uCi0KLSAgPCEtLSNlbHNlIC0tPgotCQotCVNpIHVzdGVkIHNpZ3VpbyBlbCBVUkwgZGVzZGUgdW5hIHAmYWFjdXRlO2dpbmEgZXh0ZXJuYSwgCi0JcG9yZmF2b3IgY29udGFjdGUgYWwgYXV0b3IgZGUgZXNhIHAmYWFjdXRlO2dpbmEuCi0KLQotICA8IS0tI2VuZGlmIC0tPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZXMtLQotCi1Db250ZW50LWxhbmd1YWdlOiBmcgotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWZyLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJDZXR0ZSByZXNzb3VyY2UgbidleGlzdGUgcGx1cyEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi0gICBMJ1VSTCBkZW1hbmQmZWFjdXRlO2Ugbidlc3QgcGx1cyBhY2Nlc3NpYmxlIHN1ciBjZSBzZXJ2ZXVyIGV0IGlsCi0gICBuJ3kgYSBwYXMgZCdhZHJlc3NlIGRlIHN1aXRlLiAKLQotICA8IS0tI2lmIGV4cHI9IiRIVFRQX1JFRkVSRVIiIC0tPiAKLQotICAgTm91cyB2b3VzIHByaW9ucyBkJ2luZm9ybWVyIGwnYXV0ZXVyIGRlCi0gICA8YSBocmVmPSI8IS0tI2VjaG8gZW5jb2Rpbmc9InVybCIgdmFyPSJIVFRQX1JFRkVSRVIiLS0+Ij5sYSAKLSAgIHBhZ2UgZW4gcXVlc3Rpb248L2E+IHF1ZSBsYSByJmVhY3V0ZTtmJmVhY3V0ZTtyZW5jZSBuJ2VzdCBwbHVzIGFjdHVlbGxlLiAKLQotICA8IS0tI2Vsc2UgLS0+IAotCi0gICBTaSB2b3VzIGF2ZXogc3VpdmkgdW5lIHImZWFjdXRlO2YmZWFjdXRlO3JlbmNlIGlzc3VlIGQndW5lIHBhZ2UgYXV0cmUsIAotICAgdmV1aWxsZXogY29udGFjdGVyIGwnYXV0ZXVyIGRlIGNldHRlIHBhZ2UuCi0KLSAgPCEtLSNlbmRpZiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4KLS0tLS0tLS0tLS1mci0tCmRpZmYgLS1naXQgYS9kb2NzL2Vycm9yL0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLmh0bWwudmFyIGIvZG9jcy9lcnJvci9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUi5odG1sLnZhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQyZTIzNS4uMDAwMDAwMAotLS0gYS9kb2NzL2Vycm9yL0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLmh0bWwudmFyCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotQ29udGVudC1sYW5ndWFnZTogZGUKLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1kZS0tCi08IS0tI3NldCB2YXI9IlRJVExFIiB2YWx1ZT0iU2VydmVyZmVobGVyISIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS90b3AuaHRtbCIgLS0+Ci0KLSAgPCEtLSNpZiBleHByPSIkUkVESVJFQ1RfRVJST1JfTk9URVMiIC0tPgotCi0gICAgRGlyIFByb3h5LUFuZnJhZ2Uga29ubnRlIG5pY2h0IGF1c2dlZvxocnQgd2VyZGVuLgotCi0gICAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvc3BhY2VyLmh0bWwiIC0tPgotCi0gICAgRmVobGVybWVsZHVuZzoKLSAgICA8QlI+PCEtLSNlY2hvIHZhcj0iUkVESVJFQ1RfRVJST1JfTk9URVMiIC0tPgotCi0KLSAgPCEtLSNlbHNlIC0tPgotCi0gICAgRGllIEFuZnJhZ2Uga2FubiBuaWNodCBiZWFudHdvcnRldCB3ZXJkZW4sIGRhIGltIFNlcnZlcgotICAgIGVpbiBpbnRlcm5lciBGZWhsZXIgYXVmZ2V0cmV0ZW4gaXN0LgotICAgIERlciBTZXJ2ZXIgaXN0IGVudHdlZGVyIPxiZXJsYXN0ZXQgb2RlciBlaW4gRmVobGVyIGluCi0gICAgZWluZW0gQ0dJLVNjcmlwdCBpc3QgYXVmZ2V0cmV0ZW4uCi0KLSAgPCEtLSNlbmRpZiAtLT4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvYm90dG9tLmh0bWwiIC0tPgotLS0tLS0tLS0tLWRlLS0KLQotQ29udGVudC1sYW5ndWFnZTogZW4KLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1lbi0tCi08IS0tI3NldCB2YXI9IlRJVExFIiB2YWx1ZT0iU2VydmVyIGVycm9yISIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS90b3AuaHRtbCIgLS0+Ci0KLSAgPCEtLSNpZiBleHByPSIkUkVESVJFQ1RfRVJST1JfTk9URVMiIC0tPgotICAgIDwhLS0jZWNobyB2YXI9IlJFRElSRUNUX0VSUk9SX05PVEVTIiAtLT4KLSAgPCEtLSNlbHNlIC0tPgotCi0gICAgVGhlIHNlcnZlciBlbmNvdW50ZXJlZCBhbiBpbnRlcm5hbCBlcnJvciBhbmQgd2FzIAotICAgIHVuYWJsZSB0byBjb21wbGV0ZSB5b3VyIHJlcXVlc3QuIFRoZSBzZXJ2ZXIgaXMgZWl0aGVyCi0gICAgb3ZlcmxvYWRlZCBvciB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gYSBDR0kgc2NyaXB0LgotCi0gIDwhLS0jZW5kaWYgLS0+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4KLS0tLS0tLS0tLS1lbi0tCi0KLUNvbnRlbnQtbGFuZ3VhZ2U6IGVzCi1Db250ZW50LXR5cGU6IHRleHQvaHRtbAotQm9keTotLS0tLS0tLS0tZXMtLQotPCEtLSNzZXQgdmFyPSJUSVRMRSIgdmFsdWU9IlNlcnZlciBlcnJvciEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi0gIDwhLS0jaWYgZXhwcj0iJFJFRElSRUNUX0VSUk9SX05PVEVTIiAtLT4KLSAgICA8IS0tI2VjaG8gdmFyPSJSRURJUkVDVF9FUlJPUl9OT1RFUyIgLS0+Ci0gIDwhLS0jZWxzZSAtLT4KLQotCUVsIHNlcnZpZG9yIGVuY29udHJvIHVuIGVycm9yIGludGVybm8geSBmdWUKLQlpbXBvc2libGUgY29tcGxldGFyIHN1IHNvbGljaXR1ZC4gCi0JRXhpc3RlIHRhbWJpZW4gbGEgcG9zaWJpbGlkYWQgZGUgcXVlIGVsIHNlcnZpZG9yIAotCWVzdGUgc29icmVjYXJnYWRvCW8gZGUgYWxnJnVhY3V0ZTtuIGVycm9yIGVuIHVuIAotCXByb2dyYW1hIGRlIENHSS4KLQotICA8IS0tI2VuZGlmIC0tPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZXMtLQotCi1Db250ZW50LWxhbmd1YWdlOiBmcgotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWZyLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJFcnJldXIgZHUgc2VydmV1ciEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi0gIDwhLS0jaWYgZXhwcj0iJFJFRElSRUNUX0VSUk9SX05PVEVTIiAtLT4KLSAgICA8IS0tI2VjaG8gdmFyPSJSRURJUkVDVF9FUlJPUl9OT1RFUyIgLS0+Ci0gIDwhLS0jZWxzZSAtLT4KLQotICAgIExlIHNlcnZldXIgYSAmZWdyYXZlO3QmZWFjdXRlOyB2aWN0aW1lIGQndW5lIGVycmV1ciBpbnRlcm5lIGV0IG4nYSBwYXMgJmVhY3V0ZTt0JmVhY3V0ZTsKLSAgICBjYXBhYmxlIGRlIGZhaXJlIGFib3V0aXIgdm90cmUgcmVxdSZlY2lyYzt0ZS4gU29pdCBsZSBzZXJ2ZXIgZXN0IHN1cmNoYXJnJmVhY3V0ZTsKLSAgICBzb2l0IGlsIHMnYWdpdCBkJ3VuZSBlcnJldXIgZGFucyBsZSBzY3JpcHQgQ0dJLgotCi0gIDwhLS0jZW5kaWYgLS0+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4gICAKLS0tLS0tLS0tLS1mci0tCmRpZmYgLS1naXQgYS9kb2NzL2Vycm9yL0hUVFBfTEVOR1RIX1JFUVVJUkVELmh0bWwudmFyIGIvZG9jcy9lcnJvci9IVFRQX0xFTkdUSF9SRVFVSVJFRC5odG1sLnZhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRkNjkwOS4uMDAwMDAwMAotLS0gYS9kb2NzL2Vycm9yL0hUVFBfTEVOR1RIX1JFUVVJUkVELmh0bWwudmFyCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotQ29udGVudC1sYW5ndWFnZTogZGUKLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1kZS0tCi08IS0tI3NldCB2YXI9IlRJVExFIiB2YWx1ZT0iQ29udGVudC1MZW5ndGgtQW5nYWJlIGZlaGxlcmhhZnQhIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLQotICAgIERpZSBBbmZyYWdlIGthbm4gbmljaHQgYmVhbnR3b3J0ZXQgd2VyZGVuLgotICAgIEJlaSBWZXJ3ZW5kdW5nIGRlciA8IS0tI2VjaG8gZW5jb2Rpbmc9Im5vbmUiIHZhcj0iUkVESVJFQ1RfTUVUSE9EIi0tPi1NZXRob2RlCi0gICAgbXXfIGVpbiBrb3JyZWt0ZXIgPGNvZGU+Q29udGVudC1MZW5ndGg8L2NvZGU+LUhlYWRlcgotICAgIGFuZ2VnZWJlbiB3ZXJkZW4uIAotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZGUtLQotCi1Db250ZW50LWxhbmd1YWdlOiBlbgotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWVuLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJCYWQgQ29udGVudC1MZW5ndGghIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLQotICAgIEEgcmVxdWVzdCB3aXRoIHRoZSA8IS0tI2VjaG8gZW5jb2Rpbmc9Im5vbmUiIHZhcj0iUkVESVJFQ1RfTUVUSE9EIi0tPgotICAgIG1ldGhvZCByZXF1aXJlcyBhIHZhbGlkIDxjb2RlPkNvbnRlbnQtTGVuZ3RoPC9jb2RlPiBoZWFkZXIuCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4KLS0tLS0tLS0tLS1lbi0tCi0KLUNvbnRlbnQtbGFuZ3VhZ2U6IGZyCi1Db250ZW50LXR5cGU6IHRleHQvaHRtbAotQm9keTotLS0tLS0tLS0tZnItLQotPCEtLSNzZXQgdmFyPSJUSVRMRSIgdmFsdWU9Ikxvbmd1ZXVyIGR1IGNvbnRlbnUgaWxsJmVhY3V0ZTtnYWwhIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLQotICAgIFVuZSByZXF1JmVjaXJjO3RlIHV0aWxpc2FudCBsYSBtJmVhY3V0ZTt0aG9kZSA8IS0tI2VjaG8gZW5jb2Rpbmc9Im5vbmUiIHZhcj0iUkVESVJFQ1RfTUVUSE9EIi0tPgotICAgIG4mZWFjdXRlO2Nlc3NpdGUgdW4gaGVhZGVyIHZhbGFibGUgPGNvZGU+Q29udGVudC1MZW5ndGg8L2NvZGU+IChpbmRpcXVhbnQgbGEgbG9uZ3VldXIpLgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZnItLQpkaWZmIC0tZ2l0IGEvZG9jcy9lcnJvci9IVFRQX01FVEhPRF9OT1RfQUxMT1dFRC5odG1sLnZhciBiL2RvY3MvZXJyb3IvSFRUUF9NRVRIT0RfTk9UX0FMTE9XRUQuaHRtbC52YXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZDJiZDguLjAwMDAwMDAKLS0tIGEvZG9jcy9lcnJvci9IVFRQX01FVEhPRF9OT1RfQUxMT1dFRC5odG1sLnZhcgorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLUNvbnRlbnQtbGFuZ3VhZ2U6IGRlCi1Db250ZW50LXR5cGU6IHRleHQvaHRtbAotQm9keTotLS0tLS0tLS0tZGUtLQotPCEtLSNzZXQgdmFyPSJUSVRMRSIgdmFsdWU9Ik1ldGhvZGUgbmljaHQgZXJsYXVidCEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi0gICAgRGllIDwhLS0jZWNobyBlbmNvZGluZz0ibm9uZSIgdmFyPSJSRURJUkVDVF9NRVRIT0QiLS0+LU1ldGhvZGUKLSAgICBpc3QgZvxyIGRlbiBhbmdlZm9yZGVydGVuIFVSTCBuaWNodCBlcmxhdWJ0LgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZGUtLQotCi1Db250ZW50LWxhbmd1YWdlOiBlbgotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWVuLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJNZXRob2Qgbm90IGFsbG93ZWQhIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLQotICAgIFRoZSA8IS0tI2VjaG8gZW5jb2Rpbmc9Im5vbmUiIHZhcj0iUkVESVJFQ1RfTUVUSE9EIi0tPgotICAgIG1ldGhvZCBpcyBub3QgYWxsb3dlZCBmb3IgdGhlIHJlcXVlc3RlZCBVUkwuCi0gICAgCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZW4tLQotCi1Db250ZW50LWxhbmd1YWdlOiBlcwotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWVzLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJNZXRob2Qgbm90IGFsbG93ZWQhIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLQotCUVsIDwhLS0jZWNobyBlbmNvZGluZz0ibm9uZSIgdmFyPSJSRURJUkVDVF9NRVRIT0QiLS0+Ci0JbSZlYWN1dGU7dG9kbyB1dGlsaXphZG8gcG9yIHN1IHNvbGljaXR1ZCBubyBlc3RhIAotCXBlcm1pdGlkbyBwb3IgZWwgVVJMLgotICAgIAotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvYm90dG9tLmh0bWwiIC0tPgotLS0tLS0tLS0tLWVzLS0KLQotQ29udGVudC1sYW5ndWFnZTogZnIKLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1mci0tCi08IS0tI3NldCB2YXI9IlRJVExFIiB2YWx1ZT0iTSZlYWN1dGU7dGhvZGUgaW50ZXJkaXRlISIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS90b3AuaHRtbCIgLS0+Ci0KLSAgICBMYSBtJmVhY3V0ZTt0aG9kZSA8IS0tI2VjaG8gZW5jb2Rpbmc9Im5vbmUiIHZhcj0iUkVESVJFQ1RfTUVUSE9EIi0tPgotICAgIG4nZXN0IHBhcyB1dGlsaXNhYmxlIHBvdXIgbCdVUkwgcmVxdWlzZS4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvYm90dG9tLmh0bWwiIC0tPgotLS0tLS0tLS0tLWZyLS0KZGlmZiAtLWdpdCBhL2RvY3MvZXJyb3IvSFRUUF9OT1RfQUNDRVBUQUJMRS5odG1sLnZhciBiL2RvY3MvZXJyb3IvSFRUUF9OT1RfQUNDRVBUQUJMRS5odG1sLnZhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU0MjM2Zi4uMDAwMDAwMAotLS0gYS9kb2NzL2Vycm9yL0hUVFBfTk9UX0FDQ0VQVEFCTEUuaHRtbC52YXIKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi1Db250ZW50LWxhbmd1YWdlOiBkZQotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWRlLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJLZWluIHBhc3NlbmRlcyBPYmpla3QgZ2VmdW5kZW4hIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLQotICAgIFVudGVyIGRlbSBhbmdlZm9yZGVydGVuIFVSTCBrb25udGUga2VpbiBnZWVpZ25ldGVzIE9iamVrdAotICAgIGF1ZiBkZW0gU2VydmVyIGdlZnVuZGVuIHdlcmRlbiwgZGFzIGRlbSB2b20gQnJvd3NlcgotICAgIGdlZm9yZGVydGVuIEZvcm1hdCBlbnRzcHJlY2hlbiB3/HJkZS4gIAotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZGUtLQotCi1Db250ZW50LWxhbmd1YWdlOiBlbgotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWVuLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJObyBhY2NlcHRhYmxlIG9iamVjdCBmb3VuZCEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi0gICAgQW4gYXBwcm9wcmlhdGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlcXVlc3RlZCByZXNvdXJjZQotICAgIGNvdWxkIG5vdCBiZSBmb3VuZCBvbiB0aGlzIHNlcnZlci4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvYm90dG9tLmh0bWwiIC0tPgotLS0tLS0tLS0tLWVuLS0KLQotQ29udGVudC1sYW5ndWFnZTogZXMKLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1lcy0tCi08IS0tI3NldCB2YXI9IlRJVExFIiB2YWx1ZT0iTm8gYWNjZXB0YWJsZSBvYmplY3QgZm91bmQhIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLQotCVVuYSByZXByZXNlbnRhY2kmb2FjdXRlO24gYXByb3BpYWRhIGRlIGxvcyByZWN1cnNvcyAKLQlzb2xpY2l0YWRvcyBubyBoYSBwb2RpZG8gc2VyIGxvY2FsaXphZGEgZW4gCi0JZXN0ZSBzZXJ2aWRvci4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvYm90dG9tLmh0bWwiIC0tPgotLS0tLS0tLS0tLWVzLS0KLQotQ29udGVudC1sYW5ndWFnZTogZnIKLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1mci0tCi08IS0tI3NldCB2YXI9IlRJVExFIiB2YWx1ZT0iTCdvYmpldCB0cm91diZlYWN1dGU7IG4nZXN0IHBhcyBhY2NlcHRhYmxlISIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS90b3AuaHRtbCIgLS0+Ci0KLSAgICBVbmUgcmVwciZlYWN1dGU7c2VudGF0aW9uIGFwcHJvcHJpJmVhY3V0ZTtlIGRlIGxhIHJlc3NvdXJjZSByZXF1aXNlCi0gICAgbidhIHB1ICZlY2lyYzt0cmUgdHJvdXYmZWFjdXRlO2Ugc3VyIGNlIHNlcnZldXIuCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4gIAotLS0tLS0tLS0tLWZyLS0KZGlmZiAtLWdpdCBhL2RvY3MvZXJyb3IvSFRUUF9OT1RfRk9VTkQuaHRtbC52YXIgYi9kb2NzL2Vycm9yL0hUVFBfTk9UX0ZPVU5ELmh0bWwudmFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTdlOGVlLi4wMDAwMDAwCi0tLSBhL2RvY3MvZXJyb3IvSFRUUF9OT1RfRk9VTkQuaHRtbC52YXIKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotQ29udGVudC1sYW5ndWFnZTogZGUKLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1kZS0tCi08IS0tI3NldCB2YXI9IlRJVExFIiB2YWx1ZT0iT2JqZWt0IG5pY2h0IGdlZnVuZGVuISIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS90b3AuaHRtbCIgLS0+Ci0KLSAgICBEZXIgYW5nZWZvcmRlcnRlIFVSTCBrb25udGUgYXVmIGRlbSBTZXJ2ZXIgbmljaHQgZ2VmdW5kZW4gd2VyZGVuLgotCi0gIDwhLS0jaWYgZXhwcj0iJEhUVFBfUkVGRVJFUiIgLS0+Ci0KLSAgICBEZXIgTGluayBhdWYgZGVyCi0gICAgPGEgaHJlZj0iPCEtLSNlY2hvIGVuY29kaW5nPSJ1cmwiIHZhcj0iSFRUUF9SRUZFUkVSIi0tPiI+dmVyd2Vpc2VuZGVuCi1TZWl0ZTwKLS9hPgotICAgIHNjaGVpbnQgZmFsc2NoIG9kZXIgbmljaHQgbWVociBha3R1ZWxsIHp1IHNlaW4uCi0gICAgQml0dGUgaW5mb3JtaWVyZW4gU2llIGRlbiBBdXRvcgotICAgIDxhIGhyZWY9IjwhLS0jZWNobyBlbmNvZGluZz0idXJsIiB2YXI9IkhUVFBfUkVGRVJFUiItLT4iPmRpZXNlciBTZWl0ZTwvYT4KLSAgICD8YmVyIGRlbiBGZWhsZXIuCi0KLSAgPCEtLSNlbHNlIC0tPgotCi0gICAgU29mZXJuIFNpZSBkZW4gVVJMIG1hbnVlbGwgZWluZ2VnZWJlbiBoYWJlbiwKLSAgICD8YmVycHL8ZmVuIFNpZSBiaXR0ZSBkaWUgU2NocmVpYndlaXNlIHVuZCB2ZXJzdWNoZW4gZXMgZXJuZXV0LgotCi0gIDwhLS0jZW5kaWYgLS0+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4KLS0tLS0tLS0tLS1kZS0tCi0KLUNvbnRlbnQtbGFuZ3VhZ2U6IGVuCi1Db250ZW50LXR5cGU6IHRleHQvaHRtbAotQm9keTotLS0tLS0tLS0tZW4tLQotPCEtLSNzZXQgdmFyPSJUSVRMRSIgdmFsdWU9Ik9iamVjdCBub3QgZm91bmQhIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLQotICAgIFRoZSByZXF1ZXN0ZWQgVVJMIHdhcyBub3QgZm91bmQgb24gdGhpcyBzZXJ2ZXIuCi0KLSAgPCEtLSNpZiBleHByPSIkSFRUUF9SRUZFUkVSIiAtLT4KLQotICAgIFRoZSBsaW5rIG9uIHRoZQotICAgIDxhIGhyZWY9IjwhLS0jZWNobyBlbmNvZGluZz0idXJsIiB2YXI9IkhUVFBfUkVGRVJFUiItLT4iPnJlZmVycmluZwotcGFnZTwvYT4KLSAgICBzZWVtcyB0byBiZSB3cm9uZyBvciBvdXRkYXRlZC4gUGxlYXNlIGluZm9ybSB0aGUgYXV0aG9yIG9mCi0gICAgPGEgaHJlZj0iPCEtLSNlY2hvIGVuY29kaW5nPSJ1cmwiIHZhcj0iSFRUUF9SRUZFUkVSIi0tPiI+dGhhdCBwYWdlPC9hPgotICAgIGFib3V0IHRoZSBlcnJvci4KLQotICA8IS0tI2Vsc2UgLS0+Ci0KLSAgICBJZiB5b3UgZW50ZXJlZCB0aGUgVVJMIG1hbnVhbGx5IHBsZWFzZSBjaGVjayB5b3VyCi0gICAgc3BlbGxpbmcgYW5kIHRyeSBhZ2Fpbi4KLQotICA8IS0tI2VuZGlmIC0tPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZW4tLQotCi1Db250ZW50LWxhbmd1YWdlOiBlcwotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWVzLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJPYmplY3Qgbm90IGZvdW5kISIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS90b3AuaHRtbCIgLS0+Ci0KLSAgICAgICAgRWwgVVJMIHJlcXVlcmlkbyBubyBoYSBzaWRvIGxvY2FsaXphZG8gZW4KLSAgICAgICAgZXN0ZSBzZXJ2aWRvci4KLQotICA8IS0tI2lmIGV4cHI9IiRIVFRQX1JFRkVSRVIiIC0tPgotCi0gICAgICAgIEVsIFVSTCBlbiBsYQotICAgIDxhIGhyZWY9IjwhLS0jZWNobyBlbmNvZGluZz0idXJsIiB2YXI9IkhUVFBfUkVGRVJFUiItLT4iPnAmYWFjdXRlO2dpbmEKLXJlZmVyaWRhPC9hPgotICAgICAgICBwYXJlY2UgdGVuZXIgYWxndW4gZXJyb3IgbyBlc3RhciBmdWVyYSBkZSB0aWVtcG8uIFBvcmZhdm9yCi0gICAgICAgIGNvbXVuaXF1ZSBhbCBhdXRvciBkZQotICAgIDxhIGhyZWY9IjwhLS0jZWNobyBlbmNvZGluZz0idXJsIiB2YXI9IkhUVFBfUkVGRVJFUiItLT4iPmxhCi1wJmFhY3V0ZTtnaW5hPC9hPgotICAgICAgICBhY2VyY2EgZGVsIGVycm9yLgotCi0gIDwhLS0jZWxzZSAtLT4KLQotICAgICAgICBTaSB1c3RlZCBwcm92aXNpb25vIGVsIFVSTCBkZSBtYW5lcmEgbWFudWFsIGxlIHNvbGljaXRhbW9zCi0gICAgICAgIHF1ZSBwb3JmYXZvciByZXZpc2UgbG9zIGRhdG9zIGUgaW50ZW50ZSBkZSBudWV2by4KLQotICA8IS0tI2VuZGlmIC0tPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZXMtLQotCi1Db250ZW50LWxhbmd1YWdlOiBmcgotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWZyLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJPYmpldCBub24gdHJvdXYmZWFjdXRlOyEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi0gICAgTCdVUkwgcmVxdWlzZSBuJ2EgcHUgZXRyZSB0cm91diZlYWN1dGU7ZSBzdXIgY2Ugc2VydmV1ci4KLQotICA8IS0tI2lmIGV4cHI9IiRIVFRQX1JFRkVSRVIiIC0tPgotCi0gICAgTGEgciZlYWN1dGU7ZiZlYWN1dGU7cmVuY2Ugc3VyCi0gICAgPGEgaHJlZj0iPCEtLSNlY2hvIGVuY29kaW5nPSJ1cmwiIHZhcj0iSFRUUF9SRUZFUkVSIi0tPiI+bGEgcGFnZQotY2l0JmVhY3V0ZTtlPC9hPgotICAgIHNlbWJsZSAmZWNpcmM7dHJlIGVycm9uJmVhY3V0ZTtlIG91IHBlcmltJmVhY3V0ZTtlLiBOb3VzIHZvdXMgcHJpb25zCi1kJ2luZm9ybWVyIGwnYXV0ZXVyIGRlCi0gICAgPGEgaHJlZj0iPCEtLSNlY2hvIGVuY29kaW5nPSJ1cmwiIHZhcj0iSFRUUF9SRUZFUkVSIi0tPiI+Y2V0dGUgcGFnZTwvYT4KLSAgICBkZSBjZXR0ZSBlcnJldXIuCi0KLSAgPCEtLSNlbHNlIC0tPgotCi0gICAgU2kgdm91cyBhdmV6IHRhcCZlYWN1dGU7IGwnVVJMICZhZ3JhdmU7IGxhIG1haW4sIHZldWlsbGV6IHYmZWFjdXRlO3JpZmllcgotICAgIGwnb3J0aG9ncmFwaGUgZXQgciZlYWN1dGU7ZXNzYXllci4KLQotICA8IS0tI2VuZGlmIC0tPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZnItLQpkaWZmIC0tZ2l0IGEvZG9jcy9lcnJvci9IVFRQX05PVF9JTVBMRU1FTlRFRC5odG1sLnZhciBiL2RvY3MvZXJyb3IvSFRUUF9OT1RfSU1QTEVNRU5URUQuaHRtbC52YXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMzQ2OGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9lcnJvci9IVFRQX05PVF9JTVBMRU1FTlRFRC5odG1sLnZhcgorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLUNvbnRlbnQtbGFuZ3VhZ2U6IGRlCi1Db250ZW50LXR5cGU6IHRleHQvaHRtbAotQm9keTotLS0tLS0tLS0tZGUtLQotPCEtLSNzZXQgdmFyPSJUSVRMRSIgdmFsdWU9IkFuZnJhZ2UgbmljaHQgYXVzZvxocmJhciEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi0gICAgRGllIHZvbSBCcm93c2VyIGFuZ2Vmb3JkZXJ0ZSBBa3Rpb24gd2lyZCB2b20gU2VydmVyCi0gICAgbmljaHQgdW50ZXJzdPx0enQuCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4KLS0tLS0tLS0tLS1kZS0tCi0KLUNvbnRlbnQtbGFuZ3VhZ2U6IGVuCi1Db250ZW50LXR5cGU6IHRleHQvaHRtbAotQm9keTotLS0tLS0tLS0tZW4tLQotPCEtLSNzZXQgdmFyPSJUSVRMRSIgdmFsdWU9IkNhbm5vdCBwcm9jZWVkIHJlcXVlc3QhIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLQotICAgVGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBhY3Rpb24gcmVxdWVzdGVkIGJ5IHRoZSBicm93c2VyLgotICAgCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZW4tLQotCi1Db250ZW50LWxhbmd1YWdlOiBlcwotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWVzLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJDYW5ub3QgcHJvY2VlZCByZXF1ZXN0ISIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS90b3AuaHRtbCIgLS0+Ci0KLQlFbCBidXNjYWRvciBlc3RhIHNvbGljaXRhbmRvIHVuYSBhY2NpJm9hY3V0ZTtuIAotCXF1ZSBubyBwdWVkZSBzZXIgcHJvY2VzYWRhLgotICAgIAotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvYm90dG9tLmh0bWwiIC0tPgotLS0tLS0tLS0tLWVzLS0KLQotQ29udGVudC1sYW5ndWFnZTogZnIKLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1mci0tCi08IS0tI3NldCB2YXI9IlRJVExFIiB2YWx1ZT0iTGEgcmVxdSZlY2lyYzt0ZSBuZSBwZXV0ICZlY2lyYzt0cmUgZWZmZWN0dSZlYWN1dGU7ZSEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi1MZSBzZXJ2ZXVyIG4nZXN0IHBhcyBlbiBtZXN1cmUgZCdlZmZlY3R1ZXIgbCdhY3Rpb24gcmVxdWlzZSBwYXIgbGUgbmF2aWdhdGV1ci4gCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4KLS0tLS0tLS0tLS1mci0tCmRpZmYgLS1naXQgYS9kb2NzL2Vycm9yL0hUVFBfUFJFQ09ORElUSU9OX0ZBSUxFRC5odG1sLnZhciBiL2RvY3MvZXJyb3IvSFRUUF9QUkVDT05ESVRJT05fRkFJTEVELmh0bWwudmFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjRiZmNlLi4wMDAwMDAwCi0tLSBhL2RvY3MvZXJyb3IvSFRUUF9QUkVDT05ESVRJT05fRkFJTEVELmh0bWwudmFyCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotQ29udGVudC1sYW5ndWFnZTogZGUKLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1kZS0tCi08IS0tI3NldCB2YXI9IlRJVExFIiB2YWx1ZT0iVm9yYmVkaW5ndW5nIG5lZ2F0aXYhIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLQotICAgIERpZSBWb3JiZWRpbmd1bmcgdW50ZXIgZGVtIGFuZ2Vmb3JkZXJ0ZW4gVVJMIHd1cmRlCi0gICAgbmVnYXRpdiBhdXNnZXdlcnRldC4KLSAgICAKLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4KLS0tLS0tLS0tLS1kZS0tCi0KLUNvbnRlbnQtbGFuZ3VhZ2U6IGVuCi1Db250ZW50LXR5cGU6IHRleHQvaHRtbAotQm9keTotLS0tLS0tLS0tZW4tLQotPCEtLSNzZXQgdmFyPSJUSVRMRSIgdmFsdWU9IlByZWNvbmRpdGlvbiBmYWlsZWQhIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLQotICBUaGUgcHJlY29uZGl0aW9uIG9uIHRoZSByZXF1ZXN0IGZvciB0aGUgVVJMIGZhaWxlZCBwb3NpdGl2ZSBldmFsdWF0aW9uLgotICAKLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4gCi0tLS0tLS0tLS0tZW4tLQotCi1Db250ZW50LWxhbmd1YWdlOiBlcwotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWVzLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJQcmVjb25kaXRpb24gZmFpbGVkISIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS90b3AuaHRtbCIgLS0+Ci0KLQlMYSBwcmVjb25kaWNpb24gcGFyYSBxdWUgZXhpc3RhIHVuYSAKLQljb25lY2NpJm9hY3V0ZTtuIGFsIFVSTCBzb2xpY2l0YWRvIGVzIGZhbHNhLgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZXMtLQotCi1Db250ZW50LWxhbmd1YWdlOiBmcgotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWZyLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJQciZlYWN1dGU7Y29uZGl0aW9uIG4mZWFjdXRlO2dhdGl2ZSEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi1MYSBwciZlYWN1dGU7Y29uZGl0aW9uIHBvdXIgbCdVUkwgcmVxdWlzZSBhICZlYWN1dGU7dCZlYWN1dGU7ICZlYWN1dGU7dmFsdSZlYWN1dGU7ZSBuJmVhY3V0ZTtnYXRpdmVtZW50LgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+LS0tLS0tLS0tLWZyLS0KZGlmZiAtLWdpdCBhL2RvY3MvZXJyb3IvSFRUUF9SRVFVRVNUX0VOVElUWV9UT09fTEFSR0UuaHRtbC52YXIgYi9kb2NzL2Vycm9yL0hUVFBfUkVRVUVTVF9FTlRJVFlfVE9PX0xBUkdFLmh0bWwudmFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjdlZjI2Li4wMDAwMDAwCi0tLSBhL2RvY3MvZXJyb3IvSFRUUF9SRVFVRVNUX0VOVElUWV9UT09fTEFSR0UuaHRtbC52YXIKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi1Db250ZW50LWxhbmd1YWdlOiBkZQotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWRlLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSLcYmVyZ2ViZW5lIERhdGVuIHp1IGdyb98hIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLQotICAgIERpZSBiZWkgZGVyIEFuZnJhZ2Ug/GJlcm1pdHRlbG5kZW4gRGF0ZW4gc2luZCBm/HIKLSAgICBkaWUgPCEtLSNlY2hvIGVuY29kaW5nPSJub25lIiB2YXI9IlJFRElSRUNUX01FVEhPRCItLT4tTWV0aG9kZSBuaWNodCBlcmxhdWJ0Ci0gICAgb2RlciBkaWUgRGF0ZW5tZW5nZSBoYXQgZGFzIE1heGltdW0g/GJlcnNjaHJpdHRlbi4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvYm90dG9tLmh0bWwiIC0tPgotLS0tLS0tLS0tLWRlLS0KLQotQ29udGVudC1sYW5ndWFnZTogZW4KLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1lbi0tCi08IS0tI3NldCB2YXI9IlRJVExFIiB2YWx1ZT0iUmVxdWVzdCBlbnRpdHkgdG9vIGxhcmdlISIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS90b3AuaHRtbCIgLS0+Ci0KLSAgVGhlIDwhLS0jZWNobyBlbmNvZGluZz0ibm9uZSIgdmFyPSJSRURJUkVDVF9NRVRIT0QiLS0+IG1ldGhvZCBkb2VzIG5vdCBhbGxvdyB0aGUgZGF0YQotICB0cmFuc21pdHRlZCwgb3IgdGhlIGRhdGEgdm9sdW1lIGV4Y2VlZHMgdGhlIGNhcGFjaXR5IGxpbWl0LgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZW4tLQotCi1Db250ZW50LWxhbmd1YWdlOiBlcwotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWVzLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJSZXF1ZXN0IGVudGl0eSB0b28gbGFyZ2UhIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLQotCUxvcyByZWN1cnNvcyBlc3RhYmxlY2lkb3Mgbm8gcGVybWl0ZW4gcGV0aWNpb25lcyBjb24KLQllbCA8IS0tI2VjaG8gZW5jb2Rpbmc9Im5vbmUiIHZhcj0iUkVESVJFQ1RfTUVUSE9EIi0tPiBtJmVhY3V0ZTt0b2RvIAotCXN1bWluaXN0cmFkbyBwb3Igc3Ugc29saWNpdHVkLCBvLCBsYSBjYW50aWRhZCBkZSBkYXRvcyAKLQlwcm92aXN0b3MgZXhjZWRlbiBsb3MgbCZpYWN1dGU7bWl0ZXMgZGUgY2FwYWNpZGFkLgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZXMtLQotCi1Db250ZW50LWxhbmd1YWdlOiBmcgotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWZyLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJWb2x1bWUgZGUgbGEgZGVtYW5kZSB0cm9wIGdyYW5kISIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS90b3AuaHRtbCIgLS0+Ci0KLUxhIG0mZWFjdXRlO3Rob2RlIDwhLS0jZWNobyBlbmNvZGluZz0ibm9uZSIgdmFyPSJSRURJUkVDVF9NRVRIT0QiLS0+IAotbidhdXRvcmlzZSBwYXMgbGUgdHJhbnNmZXJ0IGRlIGNlcyBkb25uJmVhY3V0ZTtlcyBvdSBiaWVuIGxlIHZvbHVtZQotZGVzIGRvbm4mZWFjdXRlO2VzIGV4YyZlZ3JhdmU7ZGUgbGEgbGltaXRlIGRlIGNhcGFjaXQmZWFjdXRlOy4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvYm90dG9tLmh0bWwiIC0tPiAgICAgICAgICAgICAgIAotLS0tLS0tLS0tLWZyLS0KZGlmZiAtLWdpdCBhL2RvY3MvZXJyb3IvSFRUUF9SRVFVRVNUX1RJTUVfT1VULmh0bWwudmFyIGIvZG9jcy9lcnJvci9IVFRQX1JFUVVFU1RfVElNRV9PVVQuaHRtbC52YXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyOTUyNzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9lcnJvci9IVFRQX1JFUVVFU1RfVElNRV9PVVQuaHRtbC52YXIKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi1Db250ZW50LWxhbmd1YWdlOiBkZQotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWRlLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJaZWl0bGltaXQg/GJlcnNjaHJpdHRlbiEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi0gICAgRGVyIFNlcnZlciBrb25udGUgbmljaHQgbWVociBs5G5nZXIgYXVmIGRpZSBCZWVuZGlndW5nCi0gICAgZGVyIEJyb3dzZXJhbmZyYWdlIHdhcnRlbiwgZGllIE5ldHp3ZXJrdmVyYmluZHVuZyB3dXJkZQotICAgIHZvbSBTZXJ2ZXIgZ2VzY2hsb3NzZW4uCi0gICAgCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZGUtLQotCi1Db250ZW50LWxhbmd1YWdlOiBlbgotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWVuLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJSZXF1ZXN0IHRpbWUtb3V0ISIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS90b3AuaHRtbCIgLS0+Ci0KLSAgIFRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gYmVjYXVzZSB0aGUgYnJvd3NlcgotICAgZGlkbid0IGZpbmlzaCB0aGUgcmVxdWVzdCB3aXRoaW4gdGhlIHNwZWNpZmllZCB0aW1lLgotICAgCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+IAotLS0tLS0tLS0tLWVuLS0KLQotQ29udGVudC1sYW5ndWFnZTogZXMKLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1lcy0tCi08IS0tI3NldCB2YXI9IlRJVExFIiB2YWx1ZT0iUmVxdWVzdCB0aW1lLW91dCEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi0JRWwgc2Vydmlkb3IgaGEgY2VycmFkbyBsYSBjb25lY2NpJm9hY3V0ZTtuIGRlIHJlZCAKLQlkZWJpZG8gYSBxdWUgZWwgYnVzY2Fkb3Igbm8gdGVybWlubyBsYSBzb2xpY2l0dWQKLQlkZW50cm8gZGVsIHRpZW1wbyBlc3BlY2lmaWNhZG8uCi0gICAgCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZXMtLQotCi1Db250ZW50LWxhbmd1YWdlOiBmcgotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWZyLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJQciZlYWN1dGU7Y29uZGl0aW9uIG4mZWFjdXRlO2dhdGl2ZSEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi1MYSBwciZlYWN1dGU7Y29uZGl0aW9uIHBvdXIgbCdVUkwgcmVxdWlzZSBhICZlYWN1dGU7dCZlYWN1dGU7ICZlYWN1dGU7dmFsdSZlYWN1dGU7ZSBuJmVhY3V0ZTtnYXRpdmVtZW50LgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZnItLQpkaWZmIC0tZ2l0IGEvZG9jcy9lcnJvci9IVFRQX1JFUVVFU1RfVVJJX1RPT19MQVJHRS5odG1sLnZhciBiL2RvY3MvZXJyb3IvSFRUUF9SRVFVRVNUX1VSSV9UT09fTEFSR0UuaHRtbC52YXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNGRlNTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9lcnJvci9IVFRQX1JFUVVFU1RfVVJJX1RPT19MQVJHRS5odG1sLnZhcgorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLUNvbnRlbnQtbGFuZ3VhZ2U6IGRlCi1Db250ZW50LXR5cGU6IHRleHQvaHRtbAotQm9keTotLS0tLS0tLS0tZGUtLQotPCEtLSNzZXQgdmFyPSJUSVRMRSIgdmFsdWU9ItxiZXJnZWJlbmVyIFVSSSB6dSBncm/fISIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS90b3AuaHRtbCIgLS0+Ci0KLSAgICBEZXIgYmVpIGRlciBBbmZyYWdlIPxiZXJtaXR0ZWxuZGUgVVJJIPxiZXJzY2hyZWl0ZXQKLSAgICBkaWUgbWF4aW1hbGUgTORuZ2UuCi0gICAgRGllIEFuZnJhZ2Uga2FubiBuaWNodCBhdXNnZWb8aHJ0IHdlcmRlbi4KLSAgICAKLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4KLS0tLS0tLS0tLS1kZS0tCi0KLUNvbnRlbnQtbGFuZ3VhZ2U6IGVuCi1Db250ZW50LXR5cGU6IHRleHQvaHRtbAotQm9keTotLS0tLS0tLS0tZW4tLQotPCEtLSNzZXQgdmFyPSJUSVRMRSIgdmFsdWU9IlN1Ym1pdHRlZCBVUkkgdG9vIGxhcmdlISIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS90b3AuaHRtbCIgLS0+Ci0KLSAgIFRoZSBsZW5ndGggb2YgdGhlIHJlcXVlc3RlZCBVUkwgZXhjZWVkcyB0aGUgY2FwYWNpdHkgbGltaXQgZm9yIHRoaXMgc2VydmVyLgotICAgVGhlIHJlcXVlc3QgY2Fubm90IGJlIHByb2Nlc3NlZC4KLSAgIAotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvYm90dG9tLmh0bWwiIC0tPgotLS0tLS0tLS0tLWVuLS0KLQotQ29udGVudC1sYW5ndWFnZTogZXMKLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1lcy0tCi08IS0tI3NldCB2YXI9IlRJVExFIiB2YWx1ZT0iU3VibWl0dGVkIFVSSSB0b28gbGFyZ2UhIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLQotCVN1IHNvbGljaXR1ZCBubyBwdWVkZSBwcm9jZXNhcnNlIGRlYmlkbyBhIHF1ZSBsYQotCWxvbmdpdHVkIGRlbCBVUkwgZXhjZWRlIGxhIGNhcGFjaWRhZCBsaW1pdGUgZGVsIAotCXNlcnZpZG9yLiAKLSAgICAKLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4KLS0tLS0tLS0tLS1lcy0tCi0KLUNvbnRlbnQtbGFuZ3VhZ2U6IGZyCi1Db250ZW50LXR5cGU6IHRleHQvaHRtbAotQm9keTotLS0tLS0tLS0tZnItLQotPCEtLSNzZXQgdmFyPSJUSVRMRSIgdmFsdWU9IkwnVVJJIGRlbWFuZGVlIGVzdCB0cm9wIGxvbmd1ZSEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi1MYSBsb25ndWV1ciBkZSBsJ1VSTCBkZW1hbmQmZWFjdXRlO2UgZXhjJmVncmF2ZTtkZSBsYSBsaW1pdGUgZGUgY2FwYWNpdCZlZ3JhdmU7IHBvdXIgY2Ugc2VydmV1ci4gTm91cyBuZSBwb3V2b25zIGRvbm5lciBzdWl0ZSAmYWdyYXZlOyB2b3RyZSByZXF1JmVjaXJjO3RlLgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZnItLQpkaWZmIC0tZ2l0IGEvZG9jcy9lcnJvci9IVFRQX1NFUlZJQ0VfVU5BVkFJTEFCTEUuaHRtbC52YXIgYi9kb2NzL2Vycm9yL0hUVFBfU0VSVklDRV9VTkFWQUlMQUJMRS5odG1sLnZhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI5ZjE2Zi4uMDAwMDAwMAotLS0gYS9kb2NzL2Vycm9yL0hUVFBfU0VSVklDRV9VTkFWQUlMQUJMRS5odG1sLnZhcgorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLUNvbnRlbnQtbGFuZ3VhZ2U6IGRlCi1Db250ZW50LXR5cGU6IHRleHQvaHRtbAotQm9keTotLS0tLS0tLS0tZGUtLQotPCEtLSNzZXQgdmFyPSJUSVRMRSIgdmFsdWU9Ilp1Z3JpZmYgbmljaHQgbfZnbGljaCEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi0gICAgRGVyIFNlcnZlciBpc3QgZGVyemVpdCBuaWNodCBpbiBkZXIgTGFnZSBkaWUgQW5mcmFnZQotICAgIHp1IGJlYXJiZWl0ZW4uIEVudHdlZGVyIGlzdCBkZXIgU2VydmVyIGRlcnplaXQg/GJlcmxhc3RldAotICAgIG9kZXIgd2VnZW4gV2FydHVuZ3NhcmJlaXRlbiBuaWNodCB2ZXJm/GdiYXIuCi0gICAgQml0dGUgdmVyc3VjaGVuIFNpZSBlcyBzcOR0ZXIgd2llZGVyLiAKLSAgICAKLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4KLS0tLS0tLS0tLS1kZS0tCi0KLUNvbnRlbnQtbGFuZ3VhZ2U6IGVuCi1Db250ZW50LXR5cGU6IHRleHQvaHRtbAotQm9keTotLS0tLS0tLS0tZW4tLQotPCEtLSNzZXQgdmFyPSJUSVRMRSIgdmFsdWU9IlNlcnZpY2UgdW5hdmFpbGFibGUhIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLQotICAgIFRoZSBzZXJ2ZXIgaXMgdGVtcG9yYXJpbHkgdW5hYmxlIHRvIHNlcnZpY2UgeW91cgotICAgIHJlcXVlc3QgZHVlIHRvIG1haW50ZW5hbmNlIGRvd250aW1lIG9yIGNhcGFjaXR5Ci0gICAgcHJvYmxlbXMuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuIAotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZW4tLQotCi1Db250ZW50LWxhbmd1YWdlOiBlcwotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWVzLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJTZXJ2aWNlIHVuYXZhaWxhYmxlISIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS90b3AuaHRtbCIgLS0+Ci0KLQlFbCBzZXJ2aWRvciBubyBwdWVkZSBhdGVuZGVyIHN1IHNvbGljaXR1ZCBwb3IKLQllbCBtb21lbnRvIGRlYmlkbyBhIHByb2JsZW1hcyBkZSBtYW50ZW5pbWllbnRvCi0JbyBkZSBjYXBhY2lkYWQuCi0KLQlMZSBzb2xpY2l0YW1vcyBxdWUgcG9yZmF2b3IgcmVwaXRhIGxhIG9wZXJhY2kmb2FjdXRlO24KLQltYXMgdGFyZGUuCi0JCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4KLS0tLS0tLS0tLS1lcy0tCi0KLUNvbnRlbnQtbGFuZ3VhZ2U6IGZyCi1Db250ZW50LXR5cGU6IHRleHQvaHRtbAotQm9keTotLS0tLS0tLS0tZnItLQotPCEtLSNzZXQgdmFyPSJUSVRMRSIgdmFsdWU9IlNlcnZpY2UgaW5hY2Nlc3NpYmxlISIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS90b3AuaHRtbCIgLS0+Ci0KLSAgICBFbiByYWlzb24gZGUgdHJhdmF1eCBkZSBtYWludGVuYW5jZSBvdSBkZSBwcm9ibCZlZ3JhdmU7bWVzIGRlIGNhcGFjaXQmZWFjdXRlOwotICAgIGxlIHNlcnZldXIgbidlc3QgcGFzIGVuIG1lc3VyZSBkZSByJmVhY3V0ZTtwb25kcmUgJmFncmF2ZTsgdm90cmUgcmVxdSZlY2lyYzt0ZSBwb3VyIGwnaW5zdGFudC4KLSAgICBWZXVpbGxleiByJmVhY3V0ZTtlc3NheWVyIHBsdXMgdGFyZC4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvYm90dG9tLmh0bWwiIC0tPgotLS0tLS0tLS0tLWZyLS0KZGlmZiAtLWdpdCBhL2RvY3MvZXJyb3IvSFRUUF9VTkFVVEhPUklaRUQuaHRtbC52YXIgYi9kb2NzL2Vycm9yL0hUVFBfVU5BVVRIT1JJWkVELmh0bWwudmFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTUyYjY2Li4wMDAwMDAwCi0tLSBhL2RvY3MvZXJyb3IvSFRUUF9VTkFVVEhPUklaRUQuaHRtbC52YXIKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi1Db250ZW50LWxhbmd1YWdlOiBkZQotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWRlLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJBdXRoZW50aWthdGlvbiBmZWhsZ2VzY2hsYWdlbiEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi0gICAgRGVyIFNlcnZlciBrb25udGUgbmljaHQgdmVyaWZpemllcmVuLCBvYiBTaWUgYXV0aG9yaXNpZXJ0IHNpbmQsCi0gICAgYXVmIGRlbiBVUkwgIjwhLS0jZWNobyBlbmNvZGluZz0idXJsIiB2YXI9IlJFRElSRUNUX1VSTCItLT4iIHp1enVncmVpZmVuLgotICAgIEVudHdlZGVyIHd1cmRlbiBmYWxzY2hlIFJlZmVyZW56ZW4gKHouQi4gZWluIGZhbHNjaGVzIFBhc3N3b3J0KQotICAgIGFuZ2ViZW4gb2RlciBpaHIgQnJvd3NlciB2ZXJzdGVodCBuaWNodCwgd2llIGRpZSBnZWZvcmRlcnRlbgotICAgIFJlZmVyZW56ZW4genUg/GJlcm1pdHRlbG4gc2luZC4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvc3BhY2VyLmh0bWwiIC0tPgotCi0gICAgU29mZXJuIFNpZSBm/HIgZGVuIFp1Z3JpZmYgYmVyZWNodGlndCBzaW5kLCD8YmVycHL8ZmVuIFNpZSBiaXR0ZQotICAgIGRpZSBlaW5nZWdlYmVuZSBVc2VyLUlEIHVuZCBkYXMgUGFzc3dvcnQgdW5kIHZlcnN1Y2hlbiBlcyBlcm5ldXQuICAKLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvYm90dG9tLmh0bWwiIC0tPgotLS0tLS0tLS0tLWRlLS0KLQotQ29udGVudC1sYW5ndWFnZTogZW4KLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1lbi0tCi08IS0tI3NldCB2YXI9IlRJVExFIiB2YWx1ZT0iQXV0aGVudGljYXRpb24gcmVxdWlyZWQhIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLQotICAgIFRoaXMgc2VydmVyIGNvdWxkIG5vdCB2ZXJpZnkgdGhhdCB5b3UgYXJlIGF1dGhvcml6ZWQgdG8gYWNjZXNzCi0gICAgdGhlIFVSTCAiPCEtLSNlY2hvIGVuY29kaW5nPSJ1cmwiIHZhcj0iUkVESVJFQ1RfVVJMIiAtLT4iLgotICAgIFlvdSBlaXRoZXIgc3VwcGxpZWQgdGhlIHdyb25nIGNyZWRlbnRpYWxzIChlLmcuLCBiYWQgcGFzc3dvcmQpLCBvciB5b3VyCi0gICAgYnJvd3NlciBkb2Vzbid0IHVuZGVyc3RhbmQgaG93IHRvIHN1cHBseSB0aGUgY3JlZGVudGlhbHMgcmVxdWlyZWQuCi0KLSAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvc3BhY2VyLmh0bWwiIC0tPgotCi0gICAgSW4gY2FzZSB5b3UgYXJlIGFsbG93ZWQgdG8gcmVxdWVzdCB0aGUgZG9jdW1lbnQsIHBsZWFzZQotICAgIGNoZWNrIHlvdXIgdXNlci1pZCBhbmQgcGFzc3dvcmQgYW5kIHRyeSBhZ2Fpbi4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvYm90dG9tLmh0bWwiIC0tPgotLS0tLS0tLS0tLWVuLS0KLQotQ29udGVudC1sYW5ndWFnZTogZXMKLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1lcy0tCi08IS0tI3NldCB2YXI9IlRJVExFIiB2YWx1ZT0iQXV0aGVudGljYXRpb24gcmVxdWlyZWQhIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLQotIEVsIHNlcnZpZG9yIG5vIHB1ZWRlIGNlcnRpZmljYXIgcXVlIHVzdGVkIGVzdGUgYXV0b3JpemFkbwotIHBhcmEgYWNjZXNhciBlbCBVUkwgIjwhLS0jZWNobyBlbmNvZGluZz0idXJsIiB2YXI9IlJFRElSRUNUX1VSTCIgLS0+Ii4KLSBVc3RlZCBwdWRvIHN1bWluaXN0cmFyIGluZm9ybWFjaSZvYWN1dGU7biBpbmNvcnJlY3RhIGFjY2lkZW50YWxtZW50ZQotIChlamVtLiB1bmEgY29udHJhc2UmbnRpbGRlO2EgaW52JmFhY3V0ZTtsaWRhKSBvLCBlbCBidXNjYWRvciBubyBzYWJlIAotIGNvbW8gc3VtaW5pc3RyYXIgbGEgaW5mb3JtYWNpJm9hY3V0ZTtuIHJlcXVlcmlkYS4KLQotICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9zcGFjZXIuaHRtbCIgLS0+Ci0KLSBFbiBjYXNvIGRlIHF1ZSBhIHVzdGVkIGxlIGVzdGUgcGVybWl0aWRvIGVsIHVzbyBkZWwKLSBkb2N1bWVudG8gcmVxdWVyaWRvLCBsZSBzb2xpY2l0YW1vcyBkZSBsYSBtYW5lcmEgbWFzIGF0ZW50YQotIHF1ZSBwb3JmYXZvciB2dWVsdmEgYSBpbnRlbnRhciBsYSBvcGVyYWNpJm9hY3V0ZTtuIHN1bWluaXN0cmFuZG8KLSBudWV2YW1lbnRlIHN1IG51bWVybyBkZSBpZGVudGlmaWNhY2kmb2FjdXRlO24geSBzdSBjb250cmFzZSZudGlsZGU7YS4KLQotIE11Y2hhcyBHcmFjaWFzLgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvYm90dG9tLmh0bWwiIC0tPgotLS0tLS0tLS0tLWVzLS0KLQotQ29udGVudC1sYW5ndWFnZTogZnIKLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1mci0tCi08IS0tI3NldCB2YXI9IlRJVExFIiB2YWx1ZT0iQXV0b3Jpc2F0aW9uIHJlcXVpc2UhIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLQotICAgIENlIHNlcnZlciBuJ2EgcGFzICZlYWN1dGU7dCZlYWN1dGU7IGVuIG1lc3VyZSBkZSB2JmVhY3V0ZTtyaWZpZXIgcXVlCi0gICAgdm91cyAmZWNpcmM7dGVzIGF1dG9yaXMmZWFjdXRlOyAmYWdyYXZlOyBhY2MmZWFjdXRlO2RlciAmYWdyYXZlOyBjZXR0ZQotICAgIFVSTCAiPCEtLSNlY2hvIGVuY29kaW5nPSJ1cmwiIHZhcj0iUkVESVJFQ1RfVVJMIiAtLT4iLgotCi0gICAgVm91cyBhdmV6IG91IGJpZW4gZm91cm5pIGRlcyBjb29yZG9ubiZlYWN1dGU7ZXMgZXJyb24mZWFjdXRlO2VzCi0gICAgKHAuZXguIG1vdCBkZSBwYXNzZSBpbmV4YWN0KSBvdSBiaWVuIHZvdHJlIG5hdmlnYXRldXIgbmUgcGFydmllbnQKLSAgICBwYXMgJmFncmF2ZTsgZm91cm5pciBsZXMgZG9ubiZlYWN1dGU7ZXMgZXhhY3Rlcy4KLQotICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9zcGFjZXIuaHRtbCIgLS0+Ci0KLSAgICBTaSB2b3VzICZlY2lyYzt0ZXogYXV0b3JpcyZlYWN1dGU7ICZhZ3JhdmU7IHJlcXUmZWFjdXRlO3JpciBsZSBkb2N1bWVudCwKLSAgICB2ZXVpbGxleiB2JmVhY3V0ZTtyaWZpZXIgdm90cmUgbm9tIGQndXRpbGlzYXRldXIgZXQgdm90cmUgbW90IGRlIHBhc3NlCi0gICAgZXQgciZlYWN1dGU7ZXNzYXllci4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvYm90dG9tLmh0bWwiIC0tPgotLS0tLS0tLS0tLWZyLS0KZGlmZiAtLWdpdCBhL2RvY3MvZXJyb3IvSFRUUF9VTlNVUFBPUlRFRF9NRURJQV9UWVBFLmh0bWwudmFyIGIvZG9jcy9lcnJvci9IVFRQX1VOU1VQUE9SVEVEX01FRElBX1RZUEUuaHRtbC52YXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YzQ4YmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9lcnJvci9IVFRQX1VOU1VQUE9SVEVEX01FRElBX1RZUEUuaHRtbC52YXIKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1Db250ZW50LWxhbmd1YWdlOiBkZQotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWRlLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJOaWNodCB1bnRlcnN0/HR6dGVzIEZvcm1hdCEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi0gICAgRGFzIGJlaSBkZXIgQW5mcmFnZSD8YmVybWl0dGVsdGUgRm9ybWF0IChtZWRpYSB0eXBlKQotICAgIHdpcmQgdm9tIFNlcnZlciBuaWNodCB1bnRlcnN0/HR6dC4KLSAgICAKLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4KLS0tLS0tLS0tLS1kZS0tCi0KLUNvbnRlbnQtbGFuZ3VhZ2U6IGVuCi1Db250ZW50LXR5cGU6IHRleHQvaHRtbAotQm9keTotLS0tLS0tLS0tZW4tLQotPCEtLSNzZXQgdmFyPSJUSVRMRSIgdmFsdWU9IlVuc3VwcG9ydGVkIG1lZGlhIHR5cGUhIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLQotICAgVGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBtZWRpYSB0eXBlIHRyYW5zbWl0dGVkIGluIHRoZSByZXF1ZXN0LgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZW4tLQotCi1Db250ZW50LWxhbmd1YWdlOiBlcwotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWVzLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJVbnN1cHBvcnRlZCBtZWRpYSB0eXBlISIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS90b3AuaHRtbCIgLS0+Ci0KLQlMb3MgZGF0b3MgZGUgc3Ugc29saWNpdHVkIG5vIHNlIGVuY3VlbnRyYW4gZW4KLQl1biBmb3JtYXRvIGFjZXB0YWRvIHBvciBlc3RlIHJlY3Vyc28uCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4KLS0tLS0tLS0tLS1lcy0tCi0KLUNvbnRlbnQtbGFuZ3VhZ2U6IGZyCi1Db250ZW50LXR5cGU6IHRleHQvaHRtbAotQm9keTotLS0tLS0tLS0tZnItLQotPCEtLSNzZXQgdmFyPSJUSVRMRSIgdmFsdWU9InR5cGUgZGUgbSZlYWN1dGU7ZGlhIGludmFsaWRlISIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS90b3AuaHRtbCIgLS0+Ci0KLUxlIHNlcnZldXIgbmUgc3VwcG9ydGUgcGFzIGxlIHR5cGUgZGUgbSZlYWN1dGU7ZGlhIHV0aWxpcyZlYWN1dGU7IGRhbnMgdm90cmUgcmVxdSZlY2lyYzt0ZS4gCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL2JvdHRvbS5odG1sIiAtLT4KLS0tLS0tLS0tLS1mci0tCmRpZmYgLS1naXQgYS9kb2NzL2Vycm9yL0hUVFBfVkFSSUFOVF9BTFNPX1ZBUklFUy5odG1sLnZhciBiL2RvY3MvZXJyb3IvSFRUUF9WQVJJQU5UX0FMU09fVkFSSUVTLmh0bWwudmFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTU4Mjg0Li4wMDAwMDAwCi0tLSBhL2RvY3MvZXJyb3IvSFRUUF9WQVJJQU5UX0FMU09fVkFSSUVTLmh0bWwudmFyCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotQ29udGVudC1sYW5ndWFnZTogZGUKLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1kZS0tCi08IS0tI3NldCB2YXI9IlRJVExFIiB2YWx1ZT0iVmFyaWFudGUgZWJlbmZhbGxzIHZlcuRuZGVybGljaCEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi0gICAgRWluIFp1Z3JpZmYgYXVmIGRhcyBhbmdlZm9yZGVydGUgT2JqZWt0IGJ6dy4gZWluZXIKLSAgICBWYXJpYW50ZSBkaWVzZXMgT2JqZWt0ZXMgaXN0IG5pY2h0IG32Z2xpY2gsIGRhIGVzIGViZW5mYWxscwotICAgIGVpbiB2YXJpYWJsZXMgT2JqZWt0IGRhcnN0ZWxsdC4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvYm90dG9tLmh0bWwiIC0tPgotLS0tLS0tLS0tLWRlLS0KLQotQ29udGVudC1sYW5ndWFnZTogZW4KLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1lbi0tCi08IS0tI3NldCB2YXI9IlRJVExFIiB2YWx1ZT0iVmFyaWFudCBhbHNvIHZhcmllcyEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi0gICAgQSB2YXJpYW50IGZvciB0aGUgcmVxdWVzdGVkIGVudGl0eQotICAgIGlzIGl0c2VsZiBhIG5lZ290aWFibGUgcmVzb3VyY2UuCi0gICAgQWNjZXNzIG5vdCBwb3NzaWJsZS4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvYm90dG9tLmh0bWwiIC0tPgotLS0tLS0tLS0tLWVuLS0KLQotQ29udGVudC1sYW5ndWFnZTogZXMKLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1lcy0tCi08IS0tI3NldCB2YXI9IlRJVExFIiB2YWx1ZT0iVmFyaWFudCBhbHNvIHZhcmllcyEiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImluY2x1ZGUvdG9wLmh0bWwiIC0tPgotCi0JTm8gZXMgcG9zaWJsZSB0ZW5lciBhY2Nlc28gZGViaWRvIGEgcXVlCi0JdW5hIHZhcmlhbnRlIGRlIGxhIHNvbGljaXR1ZCBlcyBwb3Igc2kgCi0JbWlzbWEgdW4gcmVjdXJzbyBuZWdvY2lhYmxlLgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+Ci0tLS0tLS0tLS0tZXMtLQotCi1Db250ZW50LWxhbmd1YWdlOiBmcgotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWZyLS0KLTwhLS0jc2V0IHZhcj0iVElUTEUiIHZhbHVlPSJMYSB2YXJpYW50ZSB2YXJpZSBlbGxlLW0mZWNpcmM7bWUhIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlL3RvcC5odG1sIiAtLT4KLQotICAgIFVuZSB2YXJpYW50ZSBwb3VyIGwnZW50aXQmZWFjdXRlOyByZXF1aXNlCi0gICAgZXN0IGVsbGUtbSZlY2lyYzttZSB1bmUgcmVzc291cmNlIG4mZWFjdXRlO2dvY2lhYmxlLgotICAgIEwnYWNjJmVncmF2ZTtzIGVzdCBpbXBvc3NpYmxlLgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaW5jbHVkZS9ib3R0b20uaHRtbCIgLS0+ICAKLS0tLS0tLS0tLS1mci0tCmRpZmYgLS1naXQgYS9kb2NzL2Vycm9yL1JFQURNRSBiL2RvY3MvZXJyb3IvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODU2YjdjLi4wMDAwMDAwCi0tLSBhL2RvY3MvZXJyb3IvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotCi0gTXVsdGkgTGFuZ3VhZ2UgQ3VzdG9tIEVycm9yIERvY3VtZW50cwotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIFRoZSAnZXJyb3InIGRpcmVjdG9yeSBpbiB0aGUgZG9jdW1lbnQgcm9vdCBkaXJlY3RvcnkgY29udGFpbnMgSFRUUCBlcnJvcgotIG1lc3NhZ2VzIGluIG11bHRpcGxlIGxhbmd1YWdlcy4gSWYgdGhlIHByZWZlcnJlZCBsYW5ndWFnZSBvZiBjbGllbnQgaXMKLSBhdmFpbGFibGUgaXQgaXMgc2VsZWN0ZWQgYXV0b21hdGljYWxseSB2aWEgdGhlIE11bHRpVmlld3MgZmVhdHVyZS4KLSBZb3UgbWF5IGNvbmZpZ3VyZSB0aGUgZGVzaWduIGFuZCBtYXJrdXAgb2YgdGhlIGRvY3VtZW50cyBieSBtb2RpZnlpbmcKLSB0aGUgSFRNTCBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5ICcvZXJyb3IvaW5jbHVkZXMnLCBlc3BlY2lhbGx5IHRoZQotIGZpbGUgJ2NvbmZpZy5odG1sJy4KLQotCi0gU3VwcG9ydGVkIExhbmd1YWdlczoKLSAKLSAgKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgTGFuZ3VhZ2UgICAgICAgICB8IENvbnRyaWJ1dGVkIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgfCBFbmdsaXNoIChlbikgICAgIHwgTGFycyBFaWxlYnJlY2h0ICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gIHwgR2VybWFuIChkZSkgICAgICB8IExhcnMgRWlsZWJyZWNodCAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICB8IFNwYW5pc2ggKGVzKSAgICAgfCBLYXJsYSBRdWludGVybyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgfCBGcmVuY2ggKGZyKSAgICAgIHwgQ2VjaWxlIGRlIENyZWN5ICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAoUGxlYXNlIHNlZSBodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy9kb2NzLXByb2plY3QvIGlmIHlvdSB3b3VsZAotICAgbGlrZSB0byBjb250cmlidXRlIHRoZSBwYWdlcyBpbiBhbiBhZGRpdGlvbmFsIGxhbmd1YWdlLikKLQotCi0gQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KZGlmZiAtLWdpdCBhL2RvY3MvZXJyb3IvY29udGFjdC5odG1sLnZhciBiL2RvY3MvZXJyb3IvY29udGFjdC5odG1sLnZhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM5MTM2Yi4uMDAwMDAwMAotLS0gYS9kb2NzL2Vycm9yL2NvbnRhY3QuaHRtbC52YXIKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1Db250ZW50LWxhbmd1YWdlOiBkZQotQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLUJvZHk6LS0tLS0tLS0tLWRlLS0KLSBTb2Zlcm4gU2llIGRpZXMgZvxyIGVpbmUgRmVobGZ1bmt0aW9uIGRlcyBTZXJ2ZXJzIGhhbHRlbiwKLSBpbmZvcm1pZXJlbiBTaWUgYml0dGUgZGVuCi0gPEEgSFJFRj0ibWFpbHRvOjwhLS0jZWNobyBlbmNvZGluZz0ibm9uZSIgdmFyPSJTRVJWRVJfQURNSU4iIC0tPiI+V2VibWFzdGVyPC9BPgotIGhpZXL8YmVyLgotLS0tLS0tLS0tLWRlLS0KLQotQ29udGVudC1sYW5ndWFnZTogZW4KLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1lbi0tCi0gSW4gY2FzZSB5b3UgdGhpbmsgdGhpcyBpcyBhIHNlcnZlciBlcnJvciwgcGxlYXNlIGNvbnRhY3QKLSB0aGUgPEEgSFJFRj0ibWFpbHRvOjwhLS0jZWNobyBlbmNvZGluZz0ibm9uZSIgdmFyPSJTRVJWRVJfQURNSU4iIC0tPiI+V2VibWFzdGVyPC9BPgotLS0tLS0tLS0tLWVuLS0KLQotQ29udGVudC1sYW5ndWFnZTogZXMKLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1lcy0tCi1GYXZvciBkZSBjb250YWN0YXIgYWwgCi08QSBIUkVGPSJtYWlsdG86PCEtLSNlY2hvIGVuY29kaW5nPSJub25lIiB2YXI9IlNFUlZFUl9BRE1JTiIgLS0+Ij5XZWJtYXN0ZXI8L0E+Ci1lbiBjYXNvIGRlIHF1ZSB1c3RlZCBjcmVhIHF1ZSBleGlzdGUgdW4gZXJyb3IgZW4gZWwgc2Vydmlkb3IuIAotLS0tLS0tLS0tLWVzLS0KLQotQ29udGVudC1sYW5ndWFnZTogZnIKLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sCi1Cb2R5Oi0tLS0tLS0tLS1mci0tCi1TaSB2b3VzIHBlbnNleiBxdSdpbCBzJ2FnaXQgZCd1bmUgZXJyZXVyIGR1IHNlcnZldXIsIHZldWlsbGV6IGNvbnRhY3RlciAKLWxlIDxBIEhSRUY9Im1haWx0bzo8IS0tI2VjaG8gZW5jb2Rpbmc9Im5vbmUiIHZhcj0iU0VSVkVSX0FETUlOIiAtLT4iPmdlc3Rpb25uYWlyZSBkdSBzaXRlPC9BPiAgIAotLS0tLS0tLS0tLWZyLS0KZGlmZiAtLWdpdCBhL2RvY3MvZXJyb3IvaW5jbHVkZS9ib3R0b20uaHRtbCBiL2RvY3MvZXJyb3IvaW5jbHVkZS9ib3R0b20uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNiMjM2OS4uMDAwMDAwMAotLS0gYS9kb2NzL2Vycm9yL2luY2x1ZGUvYm90dG9tLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08IS0tI2luY2x1ZGUgdmlydHVhbD0ic3BhY2VyLmh0bWwiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9Ii4uL2NvbnRhY3QiIC0tPgotPC9ETD4KLTwhLS0jaWYgZXhwcj0iJElOQ0xVREVfTE9HTz15ZXMiIC0tPgotIDxCUiBDTEVBUj08IS0tI2lmIGV4cHI9IiRBTElHTl9MT0dPPWxlZnQiIC0tPnJpZ2h0PCEtLSNlbHNlIC0tPmxlZnQ8IS0tI2VuZGlmIC0tPj4KLTwhLS0jZW5kaWYgLS0+Ci0KLTxUQUJMRSBCT1JERVI9MCBDRUxMUEFERElORz02IFdJRFRIPSIxMDAlIj4KLTxUUj48VEQgQUxJR049Q0VOVEVSIEJHQ09MT1I9IiMwMDAwMDAiPgotPEZPTlQgU0laRT0iKzIiIENPTE9SPSIjRkZGRkZGIj48c3Ryb25nPkVycm9yIDwhLS0jZWNobyBlbmNvZGluZz0ibm9uZSIgdmFyPSJSRURJUkVDVF9TVEFUVVMiIC0tPjwvc3Ryb25nPjwvRk9OVD4KLTwvVEQ+PC9UUj48L1RBQkxFPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KZGlmZiAtLWdpdCBhL2RvY3MvZXJyb3IvaW5jbHVkZS9zcGFjZXIuaHRtbCBiL2RvY3MvZXJyb3IvaW5jbHVkZS9zcGFjZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBjNWIyNS4uMDAwMDAwMAotLS0gYS9kb2NzL2Vycm9yL2luY2x1ZGUvc3BhY2VyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08L0RMPjxETD48REQ+CmRpZmYgLS1naXQgYS9kb2NzL2Vycm9yL2luY2x1ZGUvdG9wLmh0bWwgYi9kb2NzL2Vycm9yL2luY2x1ZGUvdG9wLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMjRlNDguLjAwMDAwMDAKLS0tIGEvZG9jcy9lcnJvci9pbmNsdWRlL3RvcC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFRFWFQ9IiMwMDAwMDAiIExJTks9IiMwMDAwQ0MiPgotPEJSPgotPFRBQkxFIEJPUkRFUj0wIENFTExQQURESU5HPTYgV0lEVEg9IjEwMCUiPgotPFRSPjxURCBBTElHTj1DRU5URVIgQkdDT0xPUj0iIzAwMDAwMCI+Ci08Rk9OVCBTSVpFPSIrMiIgQ09MT1I9IiNGRkZGRkYiPjxzdHJvbmc+PCEtLSNlY2hvIGVuY29kaW5nPSJub25lIiB2YXI9IlRJVExFIiAtLT48L3N0cm9uZz48L0ZPTlQ+Ci08L1REPjwvVFI+PC9UQUJMRT4KLTwhLS0jaWYgZXhwcj0iJElOQ0xVREVfTE9HTz15ZXMiIC0tPgotIDxJTUcgQUxJR049PCEtLSNlY2hvIGVuY29kaW5nPSJub25lIiB2YXI9IkFMSUdOX0xPR08iIC0tPiBTUkM9Ii9lcnJvci9pbWFnZXMvbG9nby5naWYiIEFMVD0iIj4KLTwhLS0jZW5kaWYgLS0+Ci08REw+Ci08REQ+CmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL1JFQURNRSBiL2RvY3MvaWNvbnMvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGIyOTcwLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLVB1YmxpYyBEb21haW4gSWNvbnMKLQotICAgICBUaGVzZSBpY29ucyB3ZXJlIG9yaWdpbmFsbHkgbWFkZSBmb3IgTW9zYWljIGZvciBYIGFuZCBoYXZlIGJlZW4KLSAgICAgaW5jbHVkZWQgaW4gdGhlIE5DU0EgaHR0cGQgYW5kIEFwYWNoZSBzZXJ2ZXIgZGlzdHJpYnV0aW9ucyBpbiB0aGUKLSAgICAgcGFzdC4gVGhleSBhcmUgaW4gdGhlIHB1YmxpYyBkb21haW4gYW5kIG1heSBiZSBmcmVlbHkgaW5jbHVkZWQgaW4gYW55Ci0gICAgIGFwcGxpY2F0aW9uLiBUaGUgb3JpZ2luYWxzIHdlcmUgZG9uZSBieSBLZXZpbiBIdWdoZXMgCi0gICAgIChrZXZpbmhAa2V2Y29tLmNvbSkuCi0KLSAgICAgTWFueSB0aGFua3MgdG8gQW5keSBQb2x5YWtvdiBmb3IgdHVuaW5nIHRoZSBpY29uIGNvbG9ycyBhbmQgYWRkaW5nIGEKLSAgICAgZmV3IG5ldyBpbWFnZXMuIElmIHlvdSdkIGxpa2UgdG8gY29udHJpYnV0ZSBhZGRpdGlvbnMgb3IgaWRlYXMgdG8KLSAgICAgdGhpcyBzZXQsIHBsZWFzZSBsZXQgbWUga25vdy4KLQotICAgICBBbG1vc3QgYWxsIG9mIHRoZXNlIGljb25zIGFyZSAyMHgyMiBwaXhlbHMgaW4gc2l6ZS4gIFRoZXJlIGFyZQotICAgICBhbHRlcm5hdGl2ZSBpY29ucyBpbiB0aGUgInNtYWxsIiBkaXJlY3RvcnkgdGhhdCBhcmUgMTZ4MTYgaW4gc2l6ZSwKLSAgICAgcHJvdmlkZWQgYnkgTWlrZSBCcm93biAobWlrZUBoeXBlcnJlYWwub3JnKS4KLQotU3VnZ2VzdGVkIFVzZXMKLQotVGhlIGZvbGxvd2luZyBhcmUgYSBmZXcgc3VnZ2VzdGlvbnMsIHRvIHNlcnZlIGFzIGEgc3RhcnRpbmcgcG9pbnQgZm9yIGlkZWFzLgotUGxlYXNlIGZlZWwgZnJlZSB0byB0d2VhayBhbmQgcmVuYW1lIHRoZSBpY29ucyBhcyB5b3UgbGlrZS4KLQotICAgICBhLmdpZgotICAgICAgICAgIFRoaXMgbWlnaHQgYmUgdXNlZCB0byByZXByZXNlbnQgUG9zdFNjcmlwdCBvciB0ZXh0IGxheW91dAotICAgICAgICAgIGxhbmd1YWdlcy4KLQotICAgICBhbGVydC5ibGFjay5naWYsIGFsZXJ0LnJlZC5naWYKLSAgICAgICAgICBUaGVzZSBjYW4gYmUgdXNlZCB0byBoaWdobGlnaHQgYW55IGltcG9ydGFudCBpdGVtcywgc3VjaCBhcyBhCi0gICAgICAgICAgUkVBRE1FIGZpbGUgaW4gYSBkaXJlY3RvcnkuCi0KLSAgICAgYmFjay5naWYsIGZvcndhcmQuZ2lmCi0gICAgICAgICAgVGhlc2UgY2FuIGJlIHVzZWQgYXMgbGlua3MgdG8gZ28gdG8gcHJldmlvdXMgYW5kIG5leHQgYXJlYXMuCi0KLSAgICAgYmFsbC5ncmF5LmdpZiwgYmFsbC5yZWQuZ2lmCi0gICAgICAgICAgVGhlc2UgbWlnaHQgYmUgdXNlZCBhcyBidWxsZXRzLgotCi0gICAgIGJpbmFyeS5naWYKLSAgICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBiaW5hcnkgZmlsZXMuCi0KLSAgICAgYmluaGV4LmdpZgotICAgICAgICAgIFRoaXMgY2FuIHJlcHJlc2VudCBCaW5IZXgtZW5jb2RlZCBkYXRhLgotCi0gICAgIGJsYW5rLmdpZgotICAgICAgICAgIFRoaXMgY2FuIGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBvciBhIHNwYWNpbmcgZWxlbWVudC4KLQotICAgICBib21iLmdpZgotICAgICAgICAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVwcmVlc250IGNvcmUgZmlsZXMuCi0KLSAgICAgYm94MS5naWYsIGJveDIuZ2lmCi0gICAgICAgICAgVGhlc2UgaWNvbnMgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IGdlbmVyaWMgM0QgYXBwbGljYXRpb25zIGFuZAotICAgICAgICAgIHJlbGF0ZWQgZmlsZXMuCi0KLSAgICAgYnJva2VuLmdpZgotICAgICAgICAgIFRoaXMgY2FuIHJlcHJlc2VudCBjb3JydXB0ZWQgZGF0YS4KLQotICAgICBidXJzdC5naWYKLSAgICAgICAgICBUaGlzIGNhbiBjYWxsIGF0dGVudGlvbiB0byBuZXcgYW5kIGltcG9ydGFudCBpdGVtcy4KLQotICAgICBjLmdpZgotICAgICAgICAgIFRoaXMgbWlnaHQgcmVwcmVzZW50IEMgc291cmNlIGNvZGUuCi0KLSAgICAgY29tcC5ibHVlLmdpZiwgY29tcC5yZWQuZ2lmCi0gICAgICAgICAgVGhlc2UgbGl0dGxlIGNvbXB1dGVyIGljb25zIGNhbiBzdGFuZCBmb3IgdGVsbmV0IG9yIEZUUAotICAgICAgICAgIHNlc3Npb25zLgotCi0gICAgIGNvbXByZXNzZWQuZ2lmCi0gICAgICAgICAgVGhpcyBtYXkgcmVwcmVzZW50IGNvbXByZXNzZWQgZGF0YS4KLQotICAgICBjb250aW51ZWQuZ2lmCi0gICAgICAgICAgVGhpcyBjYW4gYmUgYSBsaW5rIHRvIGEgY29udGludWVkIGxpc3Rpbmcgb2YgYSBkaXJlY3RvcnkuCi0KLSAgICAgZG93bi5naWYsIHVwLmdpZiwgbGVmdC5naWYsIHJpZ2h0LmdpZgotICAgICAgICAgIFRoZXNlIGNhbiBiZSB1c2VkIHRvIHNjcm9sbCB1cCwgZG93biwgbGVmdCBhbmQgcmlnaHQgaW4gYQotICAgICAgICAgIGxpc3Rpbmcgb3IgbWF5IGJlIHVzZWQgdG8gZGVub3RlIGl0ZW1zIGluIGFuIG91dGxpbmUuCi0KLSAgICAgZHZpLmdpZgotICAgICAgICAgIFRoaXMgY2FuIHJlcHJlc2VudCBEVkkgZmlsZXMuCi0KLSAgICAgZi5naWYKLSAgICAgICAgICBUaGlzIG1pZ2h0IHJlcHJlc2VudCBGT1JUUkFOIG9yIEZvcnRoIHNvdXJjZSBjb2RlLgotCi0gICAgIGZvbGRlci5naWYsIGZvbGRlci5vcGVuLmdpZiwgZm9sZGVyLnNlYy5naWYKLSAgICAgICAgICBUaGUgZm9sZGVyIGNhbiByZXByZXNlbnQgZGlyZWN0b3JpZXMuIFRoZXJlIGlzIGFsc28gYSB2ZXJzaW9uCi0gICAgICAgICAgdGhhdCBjYW4gcmVwcmVzZW50IHNlY3VyZSBkaXJlY3RvcmllcyBvciBkaXJlY3RvcmllcyB0aGF0IGNhbm5vdAotICAgICAgICAgIGJlIHZpZXdlZC4KLQotICAgICBnZW5lcmljLmdpZiwgZ2VuZXJpYy5zZWMuZ2lmLCBnZW5lcmljLnJlZC5naWYKLSAgICAgICAgICBUaGVzZSBjYW4gcmVwcmVzZW50IGdlbmVyaWMgZmlsZXMsIHNlY3VyZSBmaWxlcywgYW5kIGltcG9ydGFudAotICAgICAgICAgIGZpbGVzLCByZXNwZWN0aXZlbHkuCi0KLSAgICAgaGFuZC5yaWdodC5naWYsIGhhbmQudXAuZ2lmCi0gICAgICAgICAgVGhlc2UgY2FuIHBvaW50IG91dCBpbXBvcnRhbnQgaXRlbXMgKHB1biBpbnRlbmRlZCkuCi0KLSAgICAgaW1hZ2UxLmdpZiwgaW1hZ2UyLmdpZiwgaW1hZ2UzLmdpZgotICAgICAgICAgIFRoZXNlIGNhbiByZXByZXNlbnQgaW1hZ2UgZm9ybWF0cyBvZiB2YXJpb3VzIHR5cGVzLgotCi0gICAgIGluZGV4LmdpZgotICAgICAgICAgIFRoaXMgbWlnaHQgcmVwcmVzZW50IGEgV0FJUyBpbmRleCBvciBzZWFyY2ggZmFjaWxpdHkuCi0KLSAgICAgbGF5b3V0LmdpZgotICAgICAgICAgIFRoaXMgbWlnaHQgcmVwcmVzZW50IGZpbGVzIGFuZCBmb3JtYXRzIHRoYXQgY29udGFpbiBncmFwaGljcyBhcwotICAgICAgICAgIHdlbGwgYXMgdGV4dCBsYXlvdXQsIHN1Y2ggYXMgSFRNTCBhbmQgUERGIGZpbGVzLgotCi0gICAgIGxpbmsuZ2lmCi0gICAgICAgICAgVGhpcyBtaWdodCByZXByZXNlbnQgZmlsZXMgdGhhdCBhcmUgc3ltYm9saWMgbGlua3MuCi0KLSAgICAgbW92aWUuZ2lmCi0gICAgICAgICAgVGhpcyBjYW4gcmVwcmVzZW50IHZhcmlvdXMgbW92aWUgZm9ybWF0cy4KLQotICAgICBwLmdpZgotICAgICAgICAgIFRoaXMgbWF5IHN0YW5kIGZvciBQZXJsIG9yIFB5dGhvbiBzb3VyY2UgY29kZS4KLQotICAgICBwaWUwLmdpZiAuLi4gcGllOC5naWYKLSAgICAgICAgICBUaGVzZSBpY29ucyBjYW4gYmUgdXNlZCBpbiBhcHBsaWNhdGlvbnMgd2hlcmUgYSBsaXN0IG9mCi0gICAgICAgICAgZG9jdW1lbnRzIGlzIHJldHVybmVkIGZyb20gYSBzZWFyY2guIFRoZSBsaXR0bGUgcGllIGNoYXJ0IGltYWdlcwotICAgICAgICAgIGNhbiBkZW5vdGUgaG93IHJlbGV2YW50IHRoZSBkb2N1bWVudHMgbWF5IGJlIHRvIHlvdXIgc2VhcmNoCi0gICAgICAgICAgcXVlcnkuCi0KLSAgICAgcGF0Y2guZ2lmCi0gICAgICAgICAgVGhpcyBtYXkgc3RhbmQgZm9yIHBhdGNoZXMgYW5kIGRpZmYgZmlsZXMuCi0KLSAgICAgcG9ydGFsLmdpZgotICAgICAgICAgIFRoaXMgbWlnaHQgYmUgYSBsaW5rIHRvIGFuIG9ubGluZSBzZXJ2aWNlIG9yIGEgM0Qgd29ybGQuCi0KLSAgICAgcHMuZ2lmLCBxdWlsbC5naWYKLSAgICAgICAgICBUaGVzZSBtYXkgcmVwcmVzZW50IFBvc3RTY3JpcHQgZmlsZXMuCi0KLSAgICAgc2NyZXcxLmdpZiwgc2NyZXcyLmdpZgotICAgICAgICAgIFRoZXNlIG1heSByZXByZXNlbnQgQ0FEIG9yIGVuZ2luZWVyaW5nIGRhdGEgYW5kIGZvcm1hdHMuCi0KLSAgICAgc2NyaXB0LmdpZgotICAgICAgICAgIFRoaXMgY2FuIHJlcHJlc2VudCBhbnkgb2YgdmFyaW91cyBpbnRlcnByZXRlZCBsYW5ndWFnZXMsIHN1Y2ggYXMKLSAgICAgICAgICBQZXJsLCBweXRob24sIFRDTCwgYW5kIHNoZWxsIHNjcmlwdHMsIGFzIHdlbGwgYXMgc2VydmVyCi0gICAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICBzb3VuZDEuZ2lmLCBzb3VuZDIuZ2lmCi0gICAgICAgICAgVGhlc2UgY2FuIHJlcHJlc2VudCBzb3VuZCBmaWxlcy4KLQotICAgICBzcGhlcmUxLmdpZiwgc3BoZXJlMi5naWYKLSAgICAgICAgICBUaGVzZSBjYW4gcmVwcmVzZW50IDNEIHdvcmxkcyBvciByZW5kZXJpbmcgYXBwbGljYXRpb25zIGFuZAotICAgICAgICAgIGZvcm1hdHMuCi0KLSAgICAgdGV4LmdpZgotICAgICAgICAgIFRoaXMgY2FuIHJlcHJlc2VudCBUZVggZmlsZXMuCi0KLSAgICAgdGV4dC5naWYKLSAgICAgICAgICBUaGlzIGNhbiByZXByZXNlbnQgZ2VuZXJpYyAocGxhaW4pIHRleHQgZmlsZXMuCi0KLSAgICAgdHJhbnNmZXIuZ2lmCi0gICAgICAgICAgVGhpcyBjYW4gcmVwcmVzZW50IEZUUCB0cmFuc2ZlcnMgb3IgdXBsb2Fkcy9kb3dubG9hZHMuCi0KLSAgICAgdW5rbm93bi5naWYKLSAgICAgICAgICBUaGlzIG1heSByZXByZXNlbnQgYSBmaWxlIG9mIGFuIHVua25vd24gdHlwZS4KLQotICAgICB1dWVuY29kZWQuZ2lmCi0gICAgICAgICAgVGhpcyBjYW4gc3RhbmQgZm9yIHV1ZW5jb2RlZCBkYXRhLgotCi0gICAgIHdvcmxkMS5naWYsIHdvcmxkMi5naWYKLSAgICAgICAgICBUaGVzZSBjYW4gcmVwcmVzZW50IDNEIHdvcmxkcyBvciBvdGhlciAzRCBmb3JtYXRzLgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9hLmdpZiBiL2RvY3MvaWNvbnMvYS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMjNkOTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9hLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvYS5wbmcgYi9kb2NzL2ljb25zL2EucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg0MDI1Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvYS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2FsZXJ0LmJsYWNrLmdpZiBiL2RvY3MvaWNvbnMvYWxlcnQuYmxhY2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWVjZDIxLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvYWxlcnQuYmxhY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9hbGVydC5ibGFjay5wbmcgYi9kb2NzL2ljb25zL2FsZXJ0LmJsYWNrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2YjEyNC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2FsZXJ0LmJsYWNrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvYWxlcnQucmVkLmdpZiBiL2RvY3MvaWNvbnMvYWxlcnQucmVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyMzg5NC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2FsZXJ0LnJlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2FsZXJ0LnJlZC5wbmcgYi9kb2NzL2ljb25zL2FsZXJ0LnJlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MjIyZmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9hbGVydC5yZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9hcGFjaGVfcGIuZ2lmIGIvZG9jcy9pY29ucy9hcGFjaGVfcGIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTFjMTM5Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvYXBhY2hlX3BiLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvYXBhY2hlX3BiLnBuZyBiL2RvY3MvaWNvbnMvYXBhY2hlX3BiLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI5OWE4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2FwYWNoZV9wYi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2FwYWNoZV9wYjIuZ2lmIGIvZG9jcy9pY29ucy9hcGFjaGVfcGIyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU2N2M3MS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2FwYWNoZV9wYjIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9hcGFjaGVfcGIyLnBuZyBiL2RvY3MvaWNvbnMvYXBhY2hlX3BiMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YmFhNzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9hcGFjaGVfcGIyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvYXBhY2hlX3BiMl9hbmkuZ2lmIGIvZG9jcy9pY29ucy9hcGFjaGVfcGIyX2FuaS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNDFjMDMuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9hcGFjaGVfcGIyX2FuaS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2JhY2suZ2lmIGIvZG9jcy9pY29ucy9iYWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY5NGFlMS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2JhY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9iYWNrLnBuZyBiL2RvY3MvaWNvbnMvYmFjay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkOGQzNTMuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9iYWNrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvYmFsbC5ncmF5LmdpZiBiL2RvY3MvaWNvbnMvYmFsbC5ncmF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4NDI2OC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2JhbGwuZ3JheS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2JhbGwuZ3JheS5wbmcgYi9kb2NzL2ljb25zL2JhbGwuZ3JheS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNzU2ZjIuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9iYWxsLmdyYXkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9iYWxsLnJlZC5naWYgYi9kb2NzL2ljb25zL2JhbGwucmVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0MjVjYi4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2JhbGwucmVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvYmFsbC5yZWQucG5nIGIvZG9jcy9pY29ucy9iYWxsLnJlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZjNlNTAuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9iYWxsLnJlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2JpbmFyeS5naWYgYi9kb2NzL2ljb25zL2JpbmFyeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMTVjYmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9iaW5hcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9iaW5hcnkucG5nIGIvZG9jcy9pY29ucy9iaW5hcnkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTExOWQxLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvYmluYXJ5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvYmluaGV4LmdpZiBiL2RvY3MvaWNvbnMvYmluaGV4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJkMDM2My4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2JpbmhleC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2JpbmhleC5wbmcgYi9kb2NzL2ljb25zL2JpbmhleC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZjUzMjIuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9iaW5oZXgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9ibGFuay5naWYgYi9kb2NzL2ljb25zL2JsYW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNjZjAxZS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2JsYW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvYmxhbmsucG5nIGIvZG9jcy9pY29ucy9ibGFuay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MDJjMDMuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9ibGFuay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2JvbWIuZ2lmIGIvZG9jcy9pY29ucy9ib21iLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwZmRiMS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2JvbWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9ib21iLnBuZyBiL2RvY3MvaWNvbnMvYm9tYi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNjFhMDUuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9ib21iLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvYm94MS5naWYgYi9kb2NzL2ljb25zL2JveDEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWRjZDAwLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvYm94MS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2JveDEucG5nIGIvZG9jcy9pY29ucy9ib3gxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU1ZmNjZi4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2JveDEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9ib3gyLmdpZiBiL2RvY3MvaWNvbnMvYm94Mi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0M2JjNGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9ib3gyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvYm94Mi5wbmcgYi9kb2NzL2ljb25zL2JveDIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmQxNDMyLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvYm94Mi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2Jyb2tlbi5naWYgYi9kb2NzL2ljb25zL2Jyb2tlbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOGNiZTkuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9icm9rZW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9icm9rZW4ucG5nIGIvZG9jcy9pY29ucy9icm9rZW4ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGZkMTUwLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvYnJva2VuLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvYnVyc3QuZ2lmIGIvZG9jcy9pY29ucy9idXJzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZGNmNTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9idXJzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2J1cnN0LnBuZyBiL2RvY3MvaWNvbnMvYnVyc3QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzI5ODk4Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvYnVyc3QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9jLmdpZiBiL2RvY3MvaWNvbnMvYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NTViNmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9jLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvYy5wbmcgYi9kb2NzL2ljb25zL2MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTU5M2IzLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvYy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2NvbXAuYmx1ZS5naWYgYi9kb2NzL2ljb25zL2NvbXAuYmx1ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZDc2YTguLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9jb21wLmJsdWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9jb21wLmJsdWUucG5nIGIvZG9jcy9pY29ucy9jb21wLmJsdWUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGZmMTU2Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvY29tcC5ibHVlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvY29tcC5ncmF5LmdpZiBiL2RvY3MvaWNvbnMvY29tcC5ncmF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2NGNkMC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2NvbXAuZ3JheS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2NvbXAuZ3JheS5wbmcgYi9kb2NzL2ljb25zL2NvbXAuZ3JheS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNTM4ZjguLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9jb21wLmdyYXkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9jb21wcmVzc2VkLmdpZiBiL2RvY3MvaWNvbnMvY29tcHJlc3NlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZTczMjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9jb21wcmVzc2VkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvY29tcHJlc3NlZC5wbmcgYi9kb2NzL2ljb25zL2NvbXByZXNzZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTcyNzZkLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvY29tcHJlc3NlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2NvbnRpbnVlZC5naWYgYi9kb2NzL2ljb25zL2NvbnRpbnVlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZmZiN2UuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9jb250aW51ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9jb250aW51ZWQucG5nIGIvZG9jcy9pY29ucy9jb250aW51ZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjY1NmUyLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvY29udGludWVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvZGlyLmdpZiBiL2RvY3MvaWNvbnMvZGlyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgyNjQ2MC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2Rpci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2Rpci5wbmcgYi9kb2NzL2ljb25zL2Rpci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOTc5MDUuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9kaXIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9kb3duLmdpZiBiL2RvY3MvaWNvbnMvZG93bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNTRjODcuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9kb3duLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvZG93bi5wbmcgYi9kb2NzL2ljb25zL2Rvd24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTM5MDRiLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvZG93bi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2R2aS5naWYgYi9kb2NzL2ljb25zL2R2aS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MWJlMzMuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9kdmkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9kdmkucG5nIGIvZG9jcy9pY29ucy9kdmkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWM0MTdmLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvZHZpLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvZi5naWYgYi9kb2NzL2ljb25zL2YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmUzNTNjLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2YucG5nIGIvZG9jcy9pY29ucy9mLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0NmY1Yi4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2YucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9mb2xkZXIuZ2lmIGIvZG9jcy9pY29ucy9mb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODI2NDYwLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvZm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvZm9sZGVyLm9wZW4uZ2lmIGIvZG9jcy9pY29ucy9mb2xkZXIub3Blbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOTc5Y2IuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9mb2xkZXIub3Blbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2ZvbGRlci5vcGVuLnBuZyBiL2RvY3MvaWNvbnMvZm9sZGVyLm9wZW4ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDJkN2UwLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvZm9sZGVyLm9wZW4ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9mb2xkZXIucG5nIGIvZG9jcy9pY29ucy9mb2xkZXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yjk3OTA1Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvZm9sZGVyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvZm9sZGVyLnNlYy5naWYgYi9kb2NzL2ljb25zL2ZvbGRlci5zZWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTMzMmQ5Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvZm9sZGVyLnNlYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2ZvbGRlci5zZWMucG5nIGIvZG9jcy9pY29ucy9mb2xkZXIuc2VjLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMzZjU5YS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2ZvbGRlci5zZWMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9mb3J3YXJkLmdpZiBiL2RvY3MvaWNvbnMvZm9yd2FyZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOTU5YjQuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9mb3J3YXJkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvZm9yd2FyZC5wbmcgYi9kb2NzL2ljb25zL2ZvcndhcmQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTU4NGE0Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvZm9yd2FyZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2dlbmVyaWMuZ2lmIGIvZG9jcy9pY29ucy9nZW5lcmljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU2MGIyOS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2dlbmVyaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9nZW5lcmljLnBuZyBiL2RvY3MvaWNvbnMvZ2VuZXJpYy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMjdjYWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9nZW5lcmljLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvZ2VuZXJpYy5yZWQuZ2lmIGIvZG9jcy9pY29ucy9nZW5lcmljLnJlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NzQzOTguLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9nZW5lcmljLnJlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2dlbmVyaWMucmVkLnBuZyBiL2RvY3MvaWNvbnMvZ2VuZXJpYy5yZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTYzMjQ5Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvZ2VuZXJpYy5yZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9nZW5lcmljLnNlYy5naWYgYi9kb2NzL2ljb25zL2dlbmVyaWMuc2VjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhkNTI0MC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2dlbmVyaWMuc2VjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvZ2VuZXJpYy5zZWMucG5nIGIvZG9jcy9pY29ucy9nZW5lcmljLnNlYy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZDNkOTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9nZW5lcmljLnNlYy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2hhbmQucmlnaHQuZ2lmIGIvZG9jcy9pY29ucy9oYW5kLnJpZ2h0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNkYmM3Mi4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2hhbmQucmlnaHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9oYW5kLnJpZ2h0LnBuZyBiL2RvY3MvaWNvbnMvaGFuZC5yaWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMDM1YzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9oYW5kLnJpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvaGFuZC51cC5naWYgYi9kb2NzL2ljb25zL2hhbmQudXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWE1ZDY4Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvaGFuZC51cC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2hhbmQudXAucG5nIGIvZG9jcy9pY29ucy9oYW5kLnVwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQwNWE2Zi4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2hhbmQudXAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9pY29uLnNoZWV0LmdpZiBiL2RvY3MvaWNvbnMvaWNvbi5zaGVldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMTY4NmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9pY29uLnNoZWV0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvaWNvbi5zaGVldC5wbmcgYi9kb2NzL2ljb25zL2ljb24uc2hlZXQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODc1Y2I2Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvaWNvbi5zaGVldC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2ltYWdlMS5naWYgYi9kb2NzL2ljb25zL2ltYWdlMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZTQ0MmIuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9pbWFnZTEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9pbWFnZTEucG5nIGIvZG9jcy9pY29ucy9pbWFnZTEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTM3NGZkLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvaW1hZ2UxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvaW1hZ2UyLmdpZiBiL2RvY3MvaWNvbnMvaW1hZ2UyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxZmFlZS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2ltYWdlMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2ltYWdlMi5wbmcgYi9kb2NzL2ljb25zL2ltYWdlMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNmQ0ZmIuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9pbWFnZTIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9pbWFnZTMuZ2lmIGIvZG9jcy9pY29ucy9pbWFnZTMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjMwNDg0Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvaW1hZ2UzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvaW1hZ2UzLnBuZyBiL2RvY3MvaWNvbnMvaW1hZ2UzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAxZmIxZS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2ltYWdlMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2luZGV4LmdpZiBiL2RvY3MvaWNvbnMvaW5kZXguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjI0NzhmLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvaW5kZXguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9pbmRleC5wbmcgYi9kb2NzL2ljb25zL2luZGV4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwZGUzNS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2luZGV4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvbGF5b3V0LmdpZiBiL2RvY3MvaWNvbnMvbGF5b3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk2MzM4YS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2xheW91dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2xheW91dC5wbmcgYi9kb2NzL2ljb25zL2xheW91dC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOTdjMWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9sYXlvdXQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9sZWZ0LmdpZiBiL2RvY3MvaWNvbnMvbGVmdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3OWU2NzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9sZWZ0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvbGVmdC5wbmcgYi9kb2NzL2ljb25zL2xlZnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmUyNDA0Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvbGVmdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2xpbmsuZ2lmIGIvZG9jcy9pY29ucy9saW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViNjg4OS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2xpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9saW5rLnBuZyBiL2RvY3MvaWNvbnMvbGluay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MTRkMGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9saW5rLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvbW92aWUuZ2lmIGIvZG9jcy9pY29ucy9tb3ZpZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMzUxODMuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9tb3ZpZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL21vdmllLnBuZyBiL2RvY3MvaWNvbnMvbW92aWUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjE1MTgwLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvbW92aWUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9wLmdpZiBiL2RvY3MvaWNvbnMvcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiOTE3YjQuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvcC5wbmcgYi9kb2NzL2ljb25zL3AucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmJlMGU4Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvcC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3BhdGNoLmdpZiBiL2RvY3MvaWNvbnMvcGF0Y2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWJjOTBlLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvcGF0Y2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9wYXRjaC5wbmcgYi9kb2NzL2ljb25zL3BhdGNoLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA4ZWQ3OC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3BhdGNoLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvcGRmLmdpZiBiL2RvY3MvaWNvbnMvcGRmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4ZmQ3Ny4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3BkZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3BkZi5wbmcgYi9kb2NzL2ljb25zL3BkZi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNjE0MmIuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9wZGYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9waWUwLmdpZiBiL2RvY3MvaWNvbnMvcGllMC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmN2EwYWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9waWUwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvcGllMC5wbmcgYi9kb2NzL2ljb25zL3BpZTAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmUwMjAwLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvcGllMC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3BpZTEuZ2lmIGIvZG9jcy9pY29ucy9waWUxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNhYTZiZS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3BpZTEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9waWUxLnBuZyBiL2RvY3MvaWNvbnMvcGllMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NGM3OTMuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9waWUxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvcGllMi5naWYgYi9kb2NzL2ljb25zL3BpZTIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDRjNWUwLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvcGllMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3BpZTIucG5nIGIvZG9jcy9pY29ucy9waWUyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBiNzE2Ny4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3BpZTIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9waWUzLmdpZiBiL2RvY3MvaWNvbnMvcGllMy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYjlkMDIuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9waWUzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvcGllMy5wbmcgYi9kb2NzL2ljb25zL3BpZTMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjBhM2MzLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvcGllMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3BpZTQuZ2lmIGIvZG9jcy9pY29ucy9waWU0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM0NzFmZC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3BpZTQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9waWU0LnBuZyBiL2RvY3MvaWNvbnMvcGllNC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NDkwZDguLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9waWU0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvcGllNS5naWYgYi9kb2NzL2ljb25zL3BpZTUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2FlZTkzLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvcGllNS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3BpZTUucG5nIGIvZG9jcy9pY29ucy9waWU1LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5YjdkMy4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3BpZTUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9waWU2LmdpZiBiL2RvY3MvaWNvbnMvcGllNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYzMyN2IuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9waWU2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvcGllNi5wbmcgYi9kb2NzL2ljb25zL3BpZTYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjI5M2VhLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvcGllNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3BpZTcuZ2lmIGIvZG9jcy9pY29ucy9waWU3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY2MTMzNy4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3BpZTcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9waWU3LnBuZyBiL2RvY3MvaWNvbnMvcGllNy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZmEyZDAuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9waWU3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvcGllOC5naWYgYi9kb2NzL2ljb25zL3BpZTguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWRkYjM0Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvcGllOC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3BpZTgucG5nIGIvZG9jcy9pY29ucy9waWU4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE2Y2YyOC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3BpZTgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9wb3J0YWwuZ2lmIGIvZG9jcy9pY29ucy9wb3J0YWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTZlNTA2Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvcG9ydGFsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvcG9ydGFsLnBuZyBiL2RvY3MvaWNvbnMvcG9ydGFsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3YzBmOC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3BvcnRhbC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3BzLmdpZiBiL2RvY3MvaWNvbnMvcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjU2NWJjLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9wcy5wbmcgYi9kb2NzL2ljb25zL3BzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NjY2Y3My4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3BzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvcXVpbGwuZ2lmIGIvZG9jcy9pY29ucy9xdWlsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxOGE1Y2QuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9xdWlsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3F1aWxsLnBuZyBiL2RvY3MvaWNvbnMvcXVpbGwucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjk3NzcwLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvcXVpbGwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9yaWdodC5naWYgYi9kb2NzL2ljb25zL3JpZ2h0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI1NmU1Zi4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3JpZ2h0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvcmlnaHQucG5nIGIvZG9jcy9pY29ucy9yaWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZjg1MjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9yaWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NjcmV3MS5naWYgYi9kb2NzL2ljb25zL3NjcmV3MS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNmJhMmIuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zY3JldzEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zY3JldzEucG5nIGIvZG9jcy9pY29ucy9zY3JldzEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTY3M2FiLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc2NyZXcxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc2NyZXcyLmdpZiBiL2RvY3MvaWNvbnMvc2NyZXcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZkY2NiMy4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NjcmV3Mi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NjcmV3Mi5wbmcgYi9kb2NzL2ljb25zL3NjcmV3Mi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkN2QyY2YuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zY3JldzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zY3JpcHQuZ2lmIGIvZG9jcy9pY29ucy9zY3JpcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGE4NTNiLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc2NyaXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc2NyaXB0LnBuZyBiL2RvY3MvaWNvbnMvc2NyaXB0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUyMDU3MC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NjcmlwdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL1JFQURNRS50eHQgYi9kb2NzL2ljb25zL3NtYWxsL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYjk2NzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0KLVRoZXNlIGljb25zIGFyZSBwcm92aWRlZCBhcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgc3RhbmRhcmQgQXBhY2hlCi1pY29uIGdyYXBoaWNzLiAgQWxsIGdyYXBoaWNzIGluIHRoaXMgZGlyZWN0b3J5LCB3aXRoIHRoZSBleGNlcHRpb24KLW9mIHJhaW5ib3cuZ2lmLCBhcmUgMTZ4MTYgcGl4ZWxzIGluIHNpemUsIHJhdGhlciB0aGFuIHRoZSAyMHgyMgotZGltZW5zaW9uIGljb25zIHdoaWNoIGFyZSB0aGUgbm9ybWFsIGRlZmF1bHRzIGZvciBBcGFjaGUgYW5kIGFyZQotaW4gdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhpcyBvbmUuCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL2JhY2suZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC9iYWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzMTQ1NC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL2JhY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9iYWNrLnBuZyBiL2RvY3MvaWNvbnMvc21hbGwvYmFjay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNTdkZjIuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9iYWNrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvYmluYXJ5LmdpZiBiL2RvY3MvaWNvbnMvc21hbGwvYmluYXJ5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk1Zjc5Yi4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL2JpbmFyeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL2JpbmFyeS5wbmcgYi9kb2NzL2ljb25zL3NtYWxsL2JpbmFyeS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMmUxYjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9iaW5hcnkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9iaW5oZXguZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC9iaW5oZXguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDU0YTU0Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvYmluaGV4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvYmluaGV4LnBuZyBiL2RvY3MvaWNvbnMvc21hbGwvYmluaGV4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRlYWI0MS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL2JpbmhleC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL2JsYW5rLmdpZiBiL2RvY3MvaWNvbnMvc21hbGwvYmxhbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDY3ODdhLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvYmxhbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9ibGFuay5wbmcgYi9kb2NzL2ljb25zL3NtYWxsL2JsYW5rLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZmNTdhNS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL2JsYW5rLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvYnJva2VuLmdpZiBiL2RvY3MvaWNvbnMvc21hbGwvYnJva2VuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjYzU3Zi4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL2Jyb2tlbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL2Jyb2tlbi5wbmcgYi9kb2NzL2ljb25zL3NtYWxsL2Jyb2tlbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5Yzk5OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9icm9rZW4ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9idXJzdC5naWYgYi9kb2NzL2ljb25zL3NtYWxsL2J1cnN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg4MmNlYi4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL2J1cnN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvYnVyc3QucG5nIGIvZG9jcy9pY29ucy9zbWFsbC9idXJzdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMjE0MzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9idXJzdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL2NvbXAxLmdpZiBiL2RvY3MvaWNvbnMvc21hbGwvY29tcDEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTJmMzZhLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvY29tcDEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9jb21wMS5wbmcgYi9kb2NzL2ljb25zL3NtYWxsL2NvbXAxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4YzM0NS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL2NvbXAxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvY29tcDIuZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC9jb21wMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NTllYjEuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9jb21wMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL2NvbXAyLnBuZyBiL2RvY3MvaWNvbnMvc21hbGwvY29tcDIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2Y3YWQxLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvY29tcDIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9jb21wcmVzc2VkLmdpZiBiL2RvY3MvaWNvbnMvc21hbGwvY29tcHJlc3NlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYjE1NjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9jb21wcmVzc2VkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvY29tcHJlc3NlZC5wbmcgYi9kb2NzL2ljb25zL3NtYWxsL2NvbXByZXNzZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2FjZDhiLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvY29tcHJlc3NlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL2NvbnRpbnVlZC5naWYgYi9kb2NzL2ljb25zL3NtYWxsL2NvbnRpbnVlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYzlmMmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9jb250aW51ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9jb250aW51ZWQucG5nIGIvZG9jcy9pY29ucy9zbWFsbC9jb250aW51ZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjE3YzQyLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvY29udGludWVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvZGlyLmdpZiBiL2RvY3MvaWNvbnMvc21hbGwvZGlyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzN2IwOS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL2Rpci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL2Rpci5wbmcgYi9kb2NzL2ljb25zL3NtYWxsL2Rpci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZDYyNTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9kaXIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9kaXIyLmdpZiBiL2RvY3MvaWNvbnMvc21hbGwvZGlyMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNWQ2ZTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9kaXIyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvZGlyMi5wbmcgYi9kb2NzL2ljb25zL3NtYWxsL2RpcjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzZkYWY0Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvZGlyMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL2RvYy5naWYgYi9kb2NzL2ljb25zL3NtYWxsL2RvYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmY2YxOGQuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9kb2MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9kb2MucG5nIGIvZG9jcy9pY29ucy9zbWFsbC9kb2MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTYwZGYyLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvZG9jLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvZm9yd2FyZC5naWYgYi9kb2NzL2ljb25zL3NtYWxsL2ZvcndhcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTk3NDY2Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvZm9yd2FyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL2ZvcndhcmQucG5nIGIvZG9jcy9pY29ucy9zbWFsbC9mb3J3YXJkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkYmM2MS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL2ZvcndhcmQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9nZW5lcmljLmdpZiBiL2RvY3MvaWNvbnMvc21hbGwvZ2VuZXJpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZGE2ZmYuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9nZW5lcmljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvZ2VuZXJpYy5wbmcgYi9kb2NzL2ljb25zL3NtYWxsL2dlbmVyaWMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjM3NGExLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvZ2VuZXJpYy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL2dlbmVyaWMyLmdpZiBiL2RvY3MvaWNvbnMvc21hbGwvZ2VuZXJpYzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTJmMTMzLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvZ2VuZXJpYzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9nZW5lcmljMi5wbmcgYi9kb2NzL2ljb25zL3NtYWxsL2dlbmVyaWMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBkNjBjMS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL2dlbmVyaWMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvZ2VuZXJpYzMuZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC9nZW5lcmljMy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YWEyNzUuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9nZW5lcmljMy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL2dlbmVyaWMzLnBuZyBiL2RvY3MvaWNvbnMvc21hbGwvZ2VuZXJpYzMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTM4OTYzLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvZ2VuZXJpYzMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9pbWFnZS5naWYgYi9kb2NzL2ljb25zL3NtYWxsL2ltYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMzZDk1Yy4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL2ltYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvaW1hZ2UucG5nIGIvZG9jcy9pY29ucy9zbWFsbC9pbWFnZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MmYwYTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9pbWFnZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL2ltYWdlMi5naWYgYi9kb2NzL2ljb25zL3NtYWxsL2ltYWdlMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YzQwZjEuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9pbWFnZTIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9pbWFnZTIucG5nIGIvZG9jcy9pY29ucy9zbWFsbC9pbWFnZTIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDQ5YmRhLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvaW1hZ2UyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvaW5kZXguZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC9pbmRleC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNmRmNmIuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9pbmRleC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL2luZGV4LnBuZyBiL2RvY3MvaWNvbnMvc21hbGwvaW5kZXgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODA0NTNlLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvaW5kZXgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9rZXkuZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC9rZXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGZkNmMwLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwva2V5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwva2V5LnBuZyBiL2RvY3MvaWNvbnMvc21hbGwva2V5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE0NWY2Ny4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL2tleS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL21vdmllLmdpZiBiL2RvY3MvaWNvbnMvc21hbGwvbW92aWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjRhNDJlLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvbW92aWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9tb3ZpZS5wbmcgYi9kb2NzL2ljb25zL3NtYWxsL21vdmllLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MxMjYwNC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL21vdmllLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvcGF0Y2guZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC9wYXRjaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMDQ4NGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9wYXRjaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL3BhdGNoLnBuZyBiL2RvY3MvaWNvbnMvc21hbGwvcGF0Y2gucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzlmMTQ0Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvcGF0Y2gucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9wcy5naWYgYi9kb2NzL2ljb25zL3NtYWxsL3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE0YmNmYy4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvcHMucG5nIGIvZG9jcy9pY29ucy9zbWFsbC9wcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNjA0MjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9wcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL3JhaW5ib3cuZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC9yYWluYm93LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxNmI4OS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL3JhaW5ib3cuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9yYWluYm93LnBuZyBiL2RvY3MvaWNvbnMvc21hbGwvcmFpbmJvdy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NTA1M2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9yYWluYm93LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvc291bmQuZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC9zb3VuZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YTg5ZmYuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9zb3VuZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL3NvdW5kLnBuZyBiL2RvY3MvaWNvbnMvc21hbGwvc291bmQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTNlOTVkLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvc291bmQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9zb3VuZDIuZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC9zb3VuZDIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzcwNmUwLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvc291bmQyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvc291bmQyLnBuZyBiL2RvY3MvaWNvbnMvc21hbGwvc291bmQyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM0NmViNC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL3NvdW5kMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL3Rhci5naWYgYi9kb2NzL2ljb25zL3NtYWxsL3Rhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YzNmZmIuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC90YXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC90YXIucG5nIGIvZG9jcy9pY29ucy9zbWFsbC90YXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmYwMzQ3Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvdGFyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvdGV4dC5naWYgYi9kb2NzL2ljb25zL3NtYWxsL3RleHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmNlZWZiLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvdGV4dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL3RleHQucG5nIGIvZG9jcy9pY29ucy9zbWFsbC90ZXh0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRlMzBmNC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL3RleHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC90cmFuc2Zlci5naWYgYi9kb2NzL2ljb25zL3NtYWxsL3RyYW5zZmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ2MGQzZi4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL3RyYW5zZmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvdHJhbnNmZXIucG5nIGIvZG9jcy9pY29ucy9zbWFsbC90cmFuc2Zlci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNDA0ODEuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC90cmFuc2Zlci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL3Vua25vd24uZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC91bmtub3duLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmMGJiYy4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL3Vua25vd24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC91bmtub3duLnBuZyBiL2RvY3MvaWNvbnMvc21hbGwvdW5rbm93bi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZDdlN2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC91bmtub3duLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvdXUuZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC91dS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNzkzZjguLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC91dS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL3V1LnBuZyBiL2RvY3MvaWNvbnMvc21hbGwvdXUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjg3YzgyLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvdXUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zb3VuZDEuZ2lmIGIvZG9jcy9pY29ucy9zb3VuZDEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWZiNDlmLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc291bmQxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc291bmQxLnBuZyBiL2RvY3MvaWNvbnMvc291bmQxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E3NjZiZS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NvdW5kMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NvdW5kMi5naWYgYi9kb2NzL2ljb25zL3NvdW5kMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZTZhN2YuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zb3VuZDIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zb3VuZDIucG5nIGIvZG9jcy9pY29ucy9zb3VuZDIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTExMjkwLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc291bmQyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc3BoZXJlMS5naWYgYi9kb2NzL2ljb25zL3NwaGVyZTEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDY3MDcwLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc3BoZXJlMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NwaGVyZTEucG5nIGIvZG9jcy9pY29ucy9zcGhlcmUxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OGFlOC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NwaGVyZTEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zcGhlcmUyLmdpZiBiL2RvY3MvaWNvbnMvc3BoZXJlMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTQ2MmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zcGhlcmUyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc3BoZXJlMi5wbmcgYi9kb2NzL2ljb25zL3NwaGVyZTIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTc2MzJiLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc3BoZXJlMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3Rhci5naWYgYi9kb2NzL2ljb25zL3Rhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMzJjMWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy90YXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy90YXIucG5nIGIvZG9jcy9pY29ucy90YXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzQwNTIxLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvdGFyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvdGV4LmdpZiBiL2RvY3MvaWNvbnMvdGV4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVlNDMyMy4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3RleC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3RleC5wbmcgYi9kb2NzL2ljb25zL3RleC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNjYyMmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy90ZXgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy90ZXh0LmdpZiBiL2RvY3MvaWNvbnMvdGV4dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNjIzOTAuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy90ZXh0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvdGV4dC5wbmcgYi9kb2NzL2ljb25zL3RleHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGQwZWRmLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvdGV4dC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3RyYW5zZmVyLmdpZiBiL2RvY3MvaWNvbnMvdHJhbnNmZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzY5N2RiLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvdHJhbnNmZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy90cmFuc2Zlci5wbmcgYi9kb2NzL2ljb25zL3RyYW5zZmVyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhZjE3Yi4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3RyYW5zZmVyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvdW5rbm93bi5naWYgYi9kb2NzL2ljb25zL3Vua25vd24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmIxZWEyLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvdW5rbm93bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3Vua25vd24ucG5nIGIvZG9jcy9pY29ucy91bmtub3duLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MyNDFjMy4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3Vua25vd24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy91cC5naWYgYi9kb2NzL2ljb25zL3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ2ZDZkMS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvdXAucG5nIGIvZG9jcy9pY29ucy91cC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2OWVhMDAuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy91cC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3V1LmdpZiBiL2RvY3MvaWNvbnMvdXUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mzg3ZDUyLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvdXUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy91dS5wbmcgYi9kb2NzL2ljb25zL3V1LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFkMWE4NS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3V1LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvdXVlbmNvZGVkLmdpZiBiL2RvY3MvaWNvbnMvdXVlbmNvZGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM4N2Q1Mi4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3V1ZW5jb2RlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3V1ZW5jb2RlZC5wbmcgYi9kb2NzL2ljb25zL3V1ZW5jb2RlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZDFhODUuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy91dWVuY29kZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy93b3JsZDEuZ2lmIGIvZG9jcy9pY29ucy93b3JsZDEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWI0ZWMyLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvd29ybGQxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvd29ybGQxLnBuZyBiL2RvY3MvaWNvbnMvd29ybGQxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E2NWMwMC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3dvcmxkMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3dvcmxkMi5naWYgYi9kb2NzL2ljb25zL3dvcmxkMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMjAzZjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy93b3JsZDIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy93b3JsZDIucG5nIGIvZG9jcy9pY29ucy93b3JsZDIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjhhM2VhLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvd29ybGQyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvbWFuL2FiLjggYi9kb2NzL21hbi9hYi44CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTA2ZjM2Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFuL2FiLjgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLlRIIGFiIDEgIk1hcmNoIDE5OTgiCi0uXCIgJElkOiBhYi44LHYgMS4xIDE5OTkvMDgvMjQgMDY6NDU6NTMgZmllbGRpbmcgRXhwICQKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLlwiCi0uXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0uXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0uXCIgYXJlIG1ldDoKLS5cIgotLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLS5cIgotLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0uXCIgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLlwiICAgIGRpc3RyaWJ1dGlvbi4KLS5cIgotLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotLlwiICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotLlwiICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLS5cIiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotLlwiCi0uXCIgNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotLlwiICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0uXCIgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLlwiCi0uXCIgNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLS5cIiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLS5cIiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0uXCIKLS5cIiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0uXCIgICAgYWNrbm93bGVkZ21lbnQ6Ci0uXCIgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotLlwiICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0uXCIKLS5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLS5cIiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0uXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0uXCIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLS5cIiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0uXCIgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0uXCIgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0uXCIgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLS5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0uXCIgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotLlwiIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLS5cIiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0uXCIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS5cIgotLlwiIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0uXCIgaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0uXCIgb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0uXCIgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotLlwiIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLS5cIiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLS5TSCBOQU1FCi1hYiBcLSBBcGFjaGUgSFRUUCBzZXJ2ZXIgYmVuY2htYXJraW5nIHRvb2wKLS5TSCBTWU5PUFNJUwotLkIgYWIgCi1bCi0uQiBcLWsKLV0gWwotLkJJIFwtbiAiIHJlcXVlc3RzIgotXSBbCi0uQkkgXC10ICIgdGltZWxpbWl0IgotXSBbCi0uQkkgXC1jICIgY29uY3VycmVuY3kiCi1dIFsKLS5CSSBcLXAgIiBQT1NUIGZpbGUiCi1dIFsKLS5CSSBcLUEgIiBBdXRoZW50aWNhdGUgdXNlcm5hbWU6cGFzc3dvcmQiCi1dIFsKLS5CSSBcLVAgIiBQcm94eSBBdXRoZW50aWNhdGUgdXNlcm5hbWU6cGFzc3dvcmQiCi1dIFsKLS5CSSBcLUggIiBDdXN0b20gaGVhZGVyIgotXSBbCi0uQkkgXC1DICIgQ29va2llIG5hbWU9dmFsdWUiCi1dIFsKLS5CSSBcLVQgIiBjb250ZW50LXR5cGUiCi1dIFsKLS5CSSBcLXYgIiB2ZXJib3NpdHkiCi1dCi1dIFsKLS5CSSBcLXcgIiBvdXRwdXQgSFRNTCIKLV0KLV0gWwotLkJJIFwteCAiIDx0YWJsZT4gYXR0cmlidXRlcyIKLV0KLV0gWwotLkJJIFwteSAiIDx0cj4gYXR0cmlidXRlcyIKLV0KLV0gWwotLkJJIFwteiAiIDx0ZD4gYXR0cmlidXRlcyIKLV0KLS5JIFtodHRwOi8vXWhvc3RuYW1lWzpwb3J0XS9wYXRoIAotCi0uQiBhYgotWwotLkIgXC1WCi1dIFsKLS5CIFwtaCAKLV0KLS5QUAotLlNIIERFU0NSSVBUSU9OCi0uQiBhYgotaXMgYSB0b29sIGZvciBiZW5jaG1hcmtpbmcgeW91ciBBcGFjaGUgSHlwZXJUZXh0IFRyYW5zZmVyIFByb3RvY29sIChIVFRQKQotc2VydmVyLiBJdCBpcyBkZXNpZ25lZCB0byBnaXZlIHlvdSBhbiBpbXByZXNzaW9uIG9uIGhvdyBwZXJmb3JtYW50IGlzIHlvdXIKLWN1cnJlbnQgQXBhY2hlIGluc3RhbGxhdGlvbi4gIFRoaXMgZXNwZWNpYWxseSBzaG93cyB5b3UgaG93IG11Y2ggcmVxdWVzdHMgcGVyCi10aW1lIHlvdXIgQXBhY2hlIGluc3RhbGxhdGlvbiBpcyBjYXBhYmxlIHRvIHNlcnZlLiAKLS5QUAotLlNIIE9QVElPTlMKLS5UUCAxMgotLkIgXC1rIAotRW5hYmxlIHRoZSBIVFRQIEtlZXBBbGl2ZSBmZWF0dXJlLCBpLmUuIHBlcmZvcm0gbXVsdGlwbGUgcmVxdWVzdHMgd2l0aGluIG9uZQotSFRUUCBzZXNzaW9uIGluc3RlYWQuIERlZmF1bHQgaXMgbm8gS2VlcEFsaXZlLgotLlRQIDEyCi0uQkkgXC1uICIgcmVxdWVzdHMiCi1OdW1iZXIgb2YgcmVxdWVzdHMgdG8gcGVyZm9ybSBmb3IgdGhlIGJlbmNobWFya2luZyBzZXNzaW9uLiAgVGhlIGRlZmF1bHQgaXMgdG8KLWp1c3QgcGVyZm9ybSBvbmUgc2luZ2xlIHJlcXVlc3Qgd2hpY2ggdXN1YWxseSBsZWFkcyB0byBub3QgdmVyeSByZXByZXNlbnRhdGl2ZQotYmVuY2htYXJraW5nIHJlc3VsdHMuCi0uVFAgMTIKLS5CSSBcLXQgIiB0aW1lbGltaXQiCi1TZWNvbmRzIHRvIG1heC4gc3BlbmQgZm9yIGJlbmNobWFya2luZy4gVGhpcyBpbXBsaWVzCi1hIAotLkIgXC1uIAotLkIgNTAwMDAKLWludGVybmFsbHkuIFVzZSB0aGlzIHRvIGJlbmNobWFyayB0aGUgc2VydmVyIHdpdGhpbiBhIGZpeGVkIHRvdGFsIGFtb3VudCBvZgotdGltZS4gIFBlciBkZWZhdWx0IHRoZXJlIGlzIG5vIHRpbWVsaW1pdC4gCi0uVFAgMTIKLS5CSSBcLWMgIiBjb25jdXJyZW5jeSIKLU51bWJlciBvZiBtdWx0aXBsZSByZXF1ZXN0cyBwZXIgdGltZSB0byBwZXJmb3JtLiAKLURlZmF1bHQgaXMgb25lIHJlcXVlc3QgcGVyIHRpbWUuCi0KLS5UUCAxMgotLkJJIFwtcCAiIFBPU1QgZmlsZSIKLUZpbGUgY29udGFpbmluZyBkYXRhIHRvIFBPU1QuCi0KLS5UUCAxMgotLkJJIFwtQSAiIEF1dGhvcml6YXRpb24gdXNlcm5hbWU6cGFzc3dvcmQiCi1TdXBwbHkgQkFTSUMgQXV0aGVudGlmaWNhdGlvbiBjcmVkZW50aWFscyB0byB0aGUgc2VydmVyLiBUaGUgdXNlcm5hbWUKLWFuZCBwYXNzd29yZCBhcmUgc2VwYXJhdGVkIGJ5IGEgc2luZ2xlICc6JyBhbmQgc2VuZCBvbiB0aGUgd2lyZSB1dWVuY29kZWQuCi1UaGUgc3RyaW5nIGlzIHNlbmQgcmVnYXJkbGVzcyBvZiB3ZXRoZXIgdGhlIHNlcnZlciBuZWVkcyBpdDsgKGkuZS4gaGFzCi1zZW5kIGFuIDQwMS4gQXV0aGVudGlmY2F0aW9uIG5lZWRlZCkuCi0KLS5UUCAxMgotLkJJIFwtcCAiIFByb3h5LUF1dGhvcml6YXRpb24gdXNlcm5hbWU6cGFzc3dvcmQiCi1TdXBwbHkgQkFTSUMgQXV0aGVudGlmaWNhdGlvbiBjcmVkZW50aWFscyB0byBhIHByb3h5IGVuLXJvdXRlLiBUaGUgdXNlcm5hbWUKLWFuZCBwYXNzd29yZCBhcmUgc2VwYXJhdGVkIGJ5IGEgc2luZ2xlICc6JyBhbmQgc2VuZCBvbiB0aGUgd2lyZSB1dWVuY29kZWQuCi1UaGUgc3RyaW5nIGlzIHNlbmQgcmVnYXJkbGVzcyBvZiB3ZXRoZXIgdGhlIHByb3h5IG5lZWRzIGl0OyAoaS5lLiBoYXMKLXNlbmQgYW4gNDA3IFByb3h5IGF1dGhlbnRpZmNhdGlvbiBuZWVkZWQpLgotCi0uVFAgMTIKLS5CSSBcLUMgIiBDb29raWUgbmFtZT12YWx1ZSIKLUFkZCBhICdDb29raWU6JyBsaW5lIHRvIHRoZSByZXF1ZXN0LiBUaGUgYXJndW1lbnQgaXMgdHlwaWNhbGx5IGluIHRoZSBmb3JtCi1vZiBhICduYW1lPXZhbHVlJyBwYWlyLiBUaGlzIGZpZWxkIGlzIHJlcGVhdGFibGUuCi0KLS5UUCAxMgotLkJJIFwtcCAiIEhlYWRlciBzdHJpbmciCi1Qb3N0Zml4IGV4dHJhIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3QuIFRoZSBhcmd1bWVudCBpcyB0eXBpY2FsbHkgaW4gdGhlIGZvcm0KLW9mIGEgdmFsaWQgaGVhZGVyIGxpbmU7IGNvbnRhaW5pbmcgYSBjb2xvbiBzZXBhcmF0ZWQgZmllbGQgdmFsdWUgcGFpci4gKGkuZS4gCi0nQWNjZXB0LUVuY29kaW5nOiB6aXAvem9wOzhiaXQnKS4KLQotLlRQIDEyCi0uQkkgXC1UICIgY29udGVudC10eXBlIgotQ29udGVudC10eXBlIGhlYWRlciB0byB1c2UgZm9yIFBPU1QgZGF0YS4KLQotLlRQIDEyCi0uQiBcLXYgCi1TZXQgdmVyYm9zaXR5IGxldmVsIC0gNCBhbmQgYWJvdmUgcHJpbnRzIGluZm9ybWF0aW9uIG9uIGhlYWRlcnMsIDMgYW5kCi1hYm92ZSBwcmludHMgcmVzcG9uc2UgY29kZXMgKDQwNCwgMjAwLCBldGMuKSwgMiBhbmQgYWJvdmUgcHJpbnRzCi13YXJuaW5ncyBhbmQgaW5mby4KLQotLlRQIDEyCi0uQkkgXC13Ci1QcmludCBvdXQgcmVzdWx0cyBpbiBIVE1MIHRhYmxlcy4gIERlZmF1bHQgdGFibGUgaXMgdHdvIGNvbHVtbnMgd2lkZSwKLXdpdGggYSB3aGl0ZSBiYWNrZ3JvdW5kLgotLlRQIDEyCi0uQkkgXC14ICIgYXR0cmlidXRlcyIKLVN0cmluZyB0byB1c2UgYXMgYXR0cmlidXRlcyBmb3IgPHRhYmxlPi4gIEF0dHJpYnV0ZXMgYXJlIGluc2VydGVkCi08dGFibGUgCi0uQiBoZXJlCi0+Ci0uVFAgMTIKLS5CSSBcLXkgIiBhdHRyaWJ1dGVzIgotU3RyaW5nIHRvIHVzZSBhcyBhdHRyaWJ1dGVzIGZvciA8dHI+LgotLlRQIDEyCi0uQkkgXC16ICIgYXR0cmlidXRlcyIKLVN0cmluZyB0byB1c2UgYXMgYXR0cmlidXRlcyBmb3IgPHRkPi4KLS5UUCAxMgotLkIgXC1WCi1EaXNwbGF5IHZlcnNpb24gbnVtYmVyIGFuZCBleGl0LgotLlRQIDEyCi0uQiBcLWggCi1EaXNwbGF5IHVzYWdlIGluZm9ybWF0aW9uLgotLlBECi0uU0ggQlVHUwotVGhlcmUgYXJlIHZhcmlvdXMgc3RhdGljYWxseSBkZWNsYXJlZCBidWZmZXJzIG9mIGZpeGVkIGxlbmd0aC4gQ29tYmluZWQKLXdpdGggdGhlIGxhenkgcGFyc2luZyBvZiB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cywgdGhlIHJlc3BvbnNlIGhlYWRlcnMKLWZyb20gdGhlIHNlcnZlciBhbmQgb3RoZXIgZXh0ZXJuYWwgaW5wdXRzIHRoaXMgbWlnaHQgYml0ZSB5b3UuCi0uUAotSXQgZG9lcyBub3QgaW1wbGVtZW50IEhUVFAvMS54IGZ1bGx5OyBvbmx5IGFjY2VwdHMgc29tZSAnZXhwZWN0ZWQnIGZvcm1zCi1vZiByZXNwb25zZXMuIFRoZSByYXRoZXIgaGVhdnkgdXNlIG9mIAotLkJSIHN0cnN0cigzKQotc2hvd3MgdXAgdG9wIGluIHByb2ZpbGUsCi13aGljaCBtaWdodCBpbmRpY2F0ZSBhIHBlcmZvcm1hbmNlIHByb2JsZW07IGkuZS4geW91IHdvdWxkIG1lYXN1cmUgdGhlCi0uQlIgYWIKLXBlcmZvcm1hbmNlIHJhdGhlciB0aGFuIHRoZSBzZXJ2ZXIncy4KLQotLlNIIFNFRSBBTFNPCi0uQlIgaHR0cGQoOCkKLS4KZGlmZiAtLWdpdCBhL2RvY3MvbWFuL2FwYWNoZWN0bC44IGIvZG9jcy9tYW4vYXBhY2hlY3RsLjgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMzAwZWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW4vYXBhY2hlY3RsLjgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLlRIIGFwYWNoZWN0bCAxICJTZXB0ZW1iZXIgMTk5NyIKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTctMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLlwiCi0uXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0uXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0uXCIgYXJlIG1ldDoKLS5cIgotLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLS5cIgotLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0uXCIgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLlwiICAgIGRpc3RyaWJ1dGlvbi4KLS5cIgotLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotLlwiICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotLlwiICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLS5cIiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotLlwiCi0uXCIgNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotLlwiICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0uXCIgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLlwiCi0uXCIgNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLS5cIiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLS5cIiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0uXCIKLS5cIiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0uXCIgICAgYWNrbm93bGVkZ21lbnQ6Ci0uXCIgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotLlwiICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0uXCIKLS5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLS5cIiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0uXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0uXCIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLS5cIiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0uXCIgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0uXCIgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0uXCIgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLS5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0uXCIgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotLlwiIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLS5cIiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0uXCIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS5cIgotLlwiIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0uXCIgaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0uXCIgb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0uXCIgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotLlwiIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLS5cIiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLS5TSCBOQU1FCi1hcGFjaGVjdGwgXC0gQXBhY2hlIEhUVFAgc2VydmVyIGNvbnRyb2wgaW50ZXJmYWNlCi0uU0ggU1lOT1BTSVMKLS5CIGFwYWNoZWN0bCAKLVxmSWNvbW1hbmRcZlAgWy4uLl0KLS5TSCBERVNDUklQVElPTgotLkIgYXBhY2hlY3RsCi1pcyBhIGZyb250IGVuZCB0byB0aGUgQXBhY2hlIEh5cGVyVGV4dCBUcmFuc2ZlciBQcm90b2NvbCAoSFRUUCkgCi1zZXJ2ZXIuICBJdCBpcyBkZXNpZ25lZCB0byBoZWxwIHRoZSBhZG1pbmlzdHJhdG9yIGNvbnRyb2wgdGhlIAotZnVuY3Rpb25pbmcgb2YgdGhlIEFwYWNoZSAKLS5CIGh0dHBkCi1kYWVtb24uICAKLS5QUAotLkIgTk9URTogCi1JZiB5b3VyIEFwYWNoZSBpbnN0YWxsYXRpb24gdXNlcyBub24tc3RhbmRhcmQgcGF0aHMsIHlvdSB3aWxsIG5lZWQgdG8gCi1lZGl0IHRoZSAKLS5CIGFwYWNoZWN0bAotc2NyaXB0IHRvIHNldCB0aGUgYXBwcm9wcmlhdGUgcGF0aHMgdG8geW91ciBQSUQgZmlsZSBhbmQgeW91ciAKLS5CIGh0dHBkCi1iaW5hcnkuICBTZWUgdGhlIGNvbW1lbnRzIGluIHRoZSBzY3JpcHQgZm9yIGRldGFpbHMuCi0uUFAKLVRoZSAKLS5CIGFwYWNoZWN0bAotc2NyaXB0IHJldHVybnMgYSAwIGV4aXQgdmFsdWUgb24gc3VjY2VzcywgYW5kID4wIGlmIGFuIGVycm9yIAotb2NjdXJzLiAgRm9yIG1vcmUgZGV0YWlscywgdmlldyB0aGUgY29tbWVudHMgaW4gdGhlIHNjcmlwdC4KLS5QUAotRnVsbCBkb2N1bWVudGF0aW9uIGZvciBBcGFjaGUgaXMgYXZhaWxhYmxlIGF0IAotLkIgaHR0cDovL3d3dy5hcGFjaGUub3JnLwotLgotLlNIIE9QVElPTlMKLVRoZSBcZkljb21tYW5kXGZQIGNhbiBiZSBhbnkgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOgotLlRQIDEyCi0uQkkgc3RhcnQKLVN0YXJ0IHRoZSBBcGFjaGUgZGFlbW9uLiAgR2l2ZXMgYW4gZXJyb3IgaWYgaXQgaXMgYWxyZWFkeSBydW5uaW5nLgotLlRQCi0uQkkgc3RvcAotU3RvcHMgdGhlIEFwYWNoZSBkYWVtb24uCi0uVFAKLS5CSSByZXN0YXJ0Ci1SZXN0YXJ0cyB0aGUgQXBhY2hlIGRhZW1vbiBieSBzZW5kaW5nIGl0IGEgU0lHSFVQLiAgSWYgdGhlIGRhZW1vbgotaXMgbm90IHJ1bm5pbmcsIGl0IGlzIHN0YXJ0ZWQuCi1UaGlzIGNvbW1hbmQgYXV0b21hdGljYWxseSBjaGVja3MgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgdmlhIAotLkJJIGNvbmZpZ3Rlc3QKLWJlZm9yZSBpbml0aWF0aW5nIHRoZSByZXN0YXJ0IHRvIG1ha2Ugc3VyZSBBcGFjaGUgZG9lc24ndCBkaWUuCi0uVFAKLS5CSSBmdWxsc3RhdHVzCi1EaXNwbGF5cyBhIGZ1bGwgc3RhdHVzIHJlcG9ydCBmcm9tIAotLkIgbW9kX3N0YXR1cy4gCi1Gb3IgdGhpcyB0byB3b3JrLCB5b3UgbmVlZCB0byBoYXZlIG1vZF9zdGF0dXMgZW5hYmxlZCBvbiB5b3VyIHNlcnZlciAKLWFuZCBhIHRleHQtYmFzZWQgYnJvd3NlciBzdWNoIGFzIFxmSWx5bnhcZlAgYXZhaWxhYmxlIG9uIHlvdXIgc3lzdGVtLiAgVGhlCi1VUkwgdXNlZCB0byBhY2Nlc3MgdGhlIHN0YXR1cyByZXBvcnQgY2FuIGJlIHNldCBieSBlZGl0aW5nIHRoZQotLkIgU1RBVFVTVVJMCi12YXJpYWJsZSBpbiB0aGUgc2NyaXB0LgotLlRQCi0uQkkgc3RhdHVzCi1EaXNwbGF5cyBhIGJyaWVmIHN0YXR1cyByZXBvcnQuICBTaW1pbGFyIHRvIHRoZSBmdWxsc3RhdHVzIG9wdGlvbiwKLWV4Y2VwdCB0aGF0IHRoZSBsaXN0IG9mIHJlcXVlc3RzIGN1cnJlbnRseSBiZWluZyBzZXJ2ZWQgaXMgb21pdHRlZC4KLS5UUAotLkJJIGdyYWNlZnVsCi1HcmFjZWZ1bGx5IHJlc3RhcnRzIHRoZSBBcGFjaGUgZGFlbW9uIGJ5IHNlbmRpbmcgaXQgYSBTSUdVU1IxLiAgSWYKLXRoZSBkYWVtb24gaXMgbm90IHJ1bm5pbmcsIGl0IGlzIHN0YXJ0ZWQuICBUaGlzIGRpZmZlcnMgZnJvbSBhCi1ub3JtYWwgcmVzdGFydCBpbiB0aGF0IGN1cnJlbnRseSBvcGVuIGNvbm5lY3Rpb25zIGFyZSBub3QgYWJvcnRlZC4KLUEgc2lkZSBlZmZlY3QgaXMgdGhhdCBvbGQgbG9nIGZpbGVzIHdpbGwgbm90IGJlIGNsb3NlZCBpbW1lZGlhdGVseS4KLVRoaXMgbWVhbnMgdGhhdCBpZiB1c2VkIGluIGEgbG9nIHJvdGF0aW9uIHNjcmlwdCwgYSBzdWJzdGFudGlhbCBkZWxheSBtYXkgYmUKLW5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCB0aGUgb2xkIGxvZyBmaWxlcyBhcmUgY2xvc2VkIGJlZm9yZSBwcm9jZXNzaW5nIHRoZW0uCi1UaGlzIGNvbW1hbmQgYXV0b21hdGljYWxseSBjaGVja3MgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgdmlhIAotLkJJIGNvbmZpZ3Rlc3QKLWJlZm9yZSBpbml0aWF0aW5nIHRoZSByZXN0YXJ0IHRvIG1ha2Ugc3VyZSBBcGFjaGUgZG9lc24ndCBkaWUuCi0uVFAKLS5CSSBjb25maWd0ZXN0Ci1SdW4gYSBjb25maWd1cmF0aW9uIGZpbGUgc3ludGF4IHRlc3QuIEl0IHBhcnNlcyB0aGUgY29uZmlndXJhdGlvbgotZmlsZXMgYW5kIGVpdGhlciByZXBvcnRzIAotLkIgIlN5bnRheCBPayIKLW9yIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXJ0aWN1bGFyIHN5bnRheCBlcnJvci4KLS5UUAotLkJJIGhlbHAKLURpc3BsYXlzIGEgc2hvcnQgaGVscCBtZXNzYWdlLgotLlNIIFNFRSBBTFNPCi0uQlIgaHR0cGQoOCkKLS4KZGlmZiAtLWdpdCBhL2RvY3MvbWFuL2FweHMuOCBiL2RvY3MvbWFuL2FweHMuOApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY0NzY2Yy4uMDAwMDAwMAotLS0gYS9kb2NzL21hbi9hcHhzLjgKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLlRIIGFweHMgOCAiQXByaWwgMTk5OCIKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLlwiCi0uXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0uXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0uXCIgYXJlIG1ldDoKLS5cIgotLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLS5cIgotLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0uXCIgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLlwiICAgIGRpc3RyaWJ1dGlvbi4KLS5cIgotLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotLlwiICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotLlwiICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLS5cIiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotLlwiCi0uXCIgNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotLlwiICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0uXCIgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLlwiCi0uXCIgNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLS5cIiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLS5cIiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0uXCIKLS5cIiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0uXCIgICAgYWNrbm93bGVkZ21lbnQ6Ci0uXCIgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotLlwiICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0uXCIKLS5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLS5cIiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0uXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0uXCIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLS5cIiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0uXCIgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0uXCIgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0uXCIgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLS5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0uXCIgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotLlwiIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLS5cIiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0uXCIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS5cIgotLlwiIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0uXCIgaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0uXCIgb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0uXCIgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotLlwiIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLS5cIiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLS5TSCBOQU1FCi1hcHhzIFwtIEFQYWNoZSBlWHRlblNpb24gdG9vbAotLlNIIFNZTk9QU0lTCi0uQiBhcHhzCi0uQiBcLWcKLVsKLS5CSSBcLVMgIiBuYW1lPXZhbHVlCi1dCi0uQkkgXC1uICIgbW9kbmFtZSIKLQotLkIgYXB4cwotLkIgXC1xCi1bCi0uQkkgXC1TICIgbmFtZT12YWx1ZQotXQotLklSIHF1ZXJ5ICIgLi4uIgotCi0uQiBhcHhzCi0uQiBcLWMKLVsKLS5CSSBcLVMgIiBuYW1lPXZhbHVlCi1dCi1bCi0uQkkgXC1vICIgZHNvZmlsZSIKLV0KLVsKLS5CSSBcLUkgIiBpbmNkaXIiCi1dCi1bCi0uQkkgXC1EICIgbmFtZT12YWx1ZSIKLV0KLVsKLS5CSSBcLUwgIiBsaWJkaXIiCi1dCi1bCi0uQkkgXC1sICIgbGlibmFtZSIKLV0KLVsKLS5CSSBcLVdjLCAiY29tcGlsZXItZmxhZ3MiCi1dCi1bCi0uQkkgXC1XbCwgImxpbmtlci1mbGFncyIKLV0KLS5JUiBmaWxlcyAiIC4uLiIKLQotLkIgYXB4cwotLkIgXC1pCi1bCi0uQkkgXC1TICIgbmFtZT12YWx1ZQotXQotWwotLkJJIFwtbiAiIG1vZG5hbWUiCi1dCi1bCi0uQiBcLWEKLV0KLVsKLS5CIFwtQQotXQotLklSIGRzb2ZpbGUgIiAuLi4iCi0KLS5CIGFweHMKLS5CIFwtZQotWwotLkJJIFwtUyAiIG5hbWU9dmFsdWUKLV0KLVsKLS5CSSBcLW4gIiBtb2RuYW1lIgotXQotWwotLkIgXC1hCi1dCi1bCi0uQiBcLUEKLV0KLS5JUiBkc29maWxlICIgLi4uIgotLlBQCi0uU0ggREVTQ1JJUFRJT04KLS5CIGFweHMKLWlzIGEgdG9vbCBmb3IgYnVpbGRpbmcgYW5kIGluc3RhbGxpbmcgZXh0ZW5zaW9uIG1vZHVsZXMgZm9yIHRoZSBBcGFjaGUKLUh5cGVyVGV4dCBUcmFuc2ZlciBQcm90b2NvbCAoSFRUUCkgc2VydmVyLiBUaGlzIGlzIGFjaGlldmVkIGJ5IGJ1aWxkaW5nIGEKLWR5bmFtaWMgc2hhcmVkIG9iamVjdCAoRFNPKSBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvciBvYmplY3QKLS5JIGZpbGVzCi13aGljaCB0aGVuIGNhbiBiZSBsb2FkZWQgaW50bwotdGhlIEFwYWNoZSBzZXJ2ZXIgdW5kZXIgcnVudGltZSB2aWEgdGhlCi0uQiBMb2FkTW9kdWxlCi1kaXJlY3RpdmUgZnJvbQotLkJSIG1vZF9zby4KLQotU28gdG8gdXNlIHRoaXMgZXh0ZW5zaW9uIG1lY2hhbmlzbSB5b3VyIHBsYXRmb3JtIGhhcwotdG8gc3VwcG9ydCB0aGUgRFNPIGZlYXR1cmUgYW5kIHlvdXIKLUFwYWNoZQotLkIgaHR0cGQKLWJpbmFyeSBoYXMgdG8gYmUgYnVpbHQgd2l0aCB0aGUKLS5CIG1vZF9zbwotbW9kdWxlLgotVGhlCi0uQiBhcHhzCi10b29sIGF1dG9tYXRpY2FsbHkgY29tcGxhaW5zIGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlLgotWW91IGNhbiBjaGVjayB0aGlzIHlvdXJzZWxmIGJ5IG1hbnVhbGx5IHJ1bm5pbmcgdGhlIGNvbW1hbmQKLQotLm5mCi0gICQgaHR0cGQgLWwKLS5maQotCi1UaGUgbW9kdWxlCi0uQiBtb2Rfc28KLXNob3VsZCBiZSBwYXJ0IG9mIHRoZSBkaXNwbGF5ZWQgbGlzdC4KLUlmIHRoZXNlIHJlcXVpcmVtZW50cyBhcmUgZnVsZmlsbGVkIHlvdSBjYW4gZWFzaWx5IGV4dGVuZAoteW91ciBBcGFjaGUgc2VydmVyJ3MgZnVuY3Rpb25hbGl0eSBieSBpbnN0YWxsaW5nIHlvdXIgb3duCi1tb2R1bGVzIHdpdGggdGhlIERTTyBtZWNoYW5pc20gYnkgdGhlIGhlbHAgb2YgdGhpcwotLkIgYXB4cwotdG9vbDoKLQotLm5mCi0gICQgYXB4cyAtaSAtYSAtYyBtb2RfZm9vLmMKLSAgZ2NjIC1mcGljIC1EU0hBUkVEX01PRFVMRSAtSS9wYXRoL3RvL2FwYWNoZS9pbmNsdWRlIC1jIG1vZF9mb28uYwotICBsZCAtQnNoYXJlYWJsZSAtbyBtb2RfZm9vLnNvIG1vZF9mb28ubwotICBjcCBtb2RfZm9vLnNvIC9wYXRoL3RvL2FwYWNoZS9saWJleGVjL21vZF9mb28uc28KLSAgY2htb2QgNzU1IC9wYXRoL3RvL2FwYWNoZS9saWJleGVjL21vZF9mb28uc28KLSAgW2FjdGl2YXRpbmcgbW9kdWxlIGBmb28nIGluIC9wYXRoL3RvL2FwYWNoZS9ldGMvaHR0cGQuY29uZl0KLSAgJCBhcGFjaGVjdGwgcmVzdGFydAotICAvcGF0aC90by9hcGFjaGUvc2Jpbi9hcGFjaGVjdGwgcmVzdGFydDogaHR0cGQgbm90IHJ1bm5pbmcsIHRyeWluZyB0byBzdGFydAotICBbVHVlIE1hciAzMSAxMToyNzo1NSAxOTk4XSBbZGVidWddIG1vZF9zby5jKDMwMyk6IGxvYWRlZCBtb2R1bGUgZm9vX21vZHVsZQotICAvcGF0aC90by9hcGFjaGUvc2Jpbi9hcGFjaGVjdGwgcmVzdGFydDogaHR0cGQgc3RhcnRlZAotICAkIF8KLS5maQotCi1UaGUgYXJndW1lbnRzCi0uSSBmaWxlcwotY2FuIGJlIGFueSBDIHNvdXJjZSBmaWxlICguYyksIGEgb2JqZWN0IGZpbGUgKC5vKSBvcgotZXZlbiBhIGxpYnJhcnkgYXJjaGl2ZSAoLmEpLiBUaGUKLS5CIGFweHMKLXRvb2wgYXV0b21hdGljYWxseSByZWNvZ25pemVzIHRoZXNlIGV4dGVuc2lvbnMgYW5kIGF1dG9tdGFpY2FsbHkgdXNlZCB0aGUgQwotc291cmNlIGZpbGVzIGZvciBjb21waWxhdGlvbiB3aGlsZSBqdXN0IHVzaW5nIHRoZSBvYmplY3QgYW5kIGFyY2hpdmUgZmlsZXMgZm9yCi10aGUgbGlua2luZyBwaGFzZS4gQnV0IHdoZW4gdXNpbmcgc3VjaCBwcmUtY29tcGlsZWQgb2JqZWN0cyBtYWtlIHN1cmUgdGhleSBhcmUKLWNvbXBpbGVkIGZvciBwb3NpdGlvbiBpbmRlcGVuZGVuZCBjb2RlIChQSUMpIHRvIGJlIGFibGUgdG8gdXNlIHRoZW0gZm9yIGEKLWR5bmFtaWNhbGx5IGxvYWRlZCBzaGFyZWQgb2JqZWN0LgotRm9yIGluc3RhbmNlIHdpdGggR0NDIHlvdSBhbHdheXMganVzdCBoYXZlIHRvIHVzZQotLkJSIC1mcGljIC4KLUZvciBvdGhlcgotQyBjb21waWxlcnMgY29uc3VsdCBpdHMgbWFudWFsCi1wYWdlIG9yIGF0IHdhdGNoIGZvciB0aGUgZmxhZ3MKLS5CIGFweHMKLXVzZXMgdG8gY29tcGlsZSB0aGUgb2JqZWN0IGZpbGVzLgotCi1Gb3IgbW9yZSBkZXRhaWxzIGFib3V0IERTTyBzdXBwb3J0IGluIEFwYWNoZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uCi1vZgotLkIgbW9kX3NvCi1vciBwZXJoYXBzIGV2ZW4gcmVhZCB0aGUKLS5CIHNyYy9tb2R1bGVzL3N0YW5kYXJkL21vZF9zby5jCi1zb3VyY2UgZmlsZS4KLQotLlBQCi0uU0ggT1BUSU9OUwotQ29tbW9uIG9wdGlvbnM6Ci0uVFAgMTIKLS5CSSBcLW4gIiBtb2RuYW1lIgotVGhpcyBleHBsaWNpdGx5IHNldHMgdGhlIG1vZHVsZSBuYW1lIGZvciB0aGUKLS5CIFwtaQotKGluc3RhbGwpCi1hbmQKLS5CIFwtZwotKHRlbXBsYXRlIGdlbmVyYXRpb24pIG9wdGlvbi4gVXNlIHRoaXMgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSBtb2R1bGUgbmFtZS4KLUZvciBvcHRpb24KLS5CIFwtZwotdGhpcyBpcyByZXF1aXJlZCwgZm9yIG9wdGlvbgotLkIgXC1pCi10aGUKLS5CIGFweHMKLXRvb2wgdHJpZXMgdG8gZGV0ZXJtaW5lIHRoZSBuYW1lIGZyb20gdGhlIHNvdXJjZSBvciAoYXMgYSBmYWxsYmFjaykgYXQgbGVhc3QKLWJ5IGd1ZXNzaW5nIGl0IGZyb20gdGhlIGZpbGVuYW1lLgotLlBQCi1RdWVyeSBvcHRpb25zOgotLlRQIDEyCi0uQiBcLXEgCi1QZXJmb3JtcyBhIHF1ZXJ5IGZvciAKLS5CUiBhcHhzICdzCi1rbm93bGVkZ2UgYWJvdXQgY2VydGFpbiBzZXR0aW5ncy4gVGhlCi0uSSBxdWVyeQotcGFyYW1ldGVycyBjYW4gYmUgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBzdHJpbmdzOgotLm5mCi0gIENDICAgICAgICAgICAgICBUQVJHRVQKLSAgQ0ZMQUdTICAgICAgICAgIFNCSU5ESVIgICAgCi0gIENGTEFHU19TSExJQiAgICBJTkNMVURFRElSIAotICBMRF9TSExJQiAgICAgICAgTElCRVhFQ0RJUiAKLSAgTERGTEFHU19TSExJQiAgIFNZU0NPTkZESVIgCi0gIExJQlNfU0hMSUIKLS5maQotVXNlIHRoaXMgZm9yIG1hbnVhbGx5IGRldGVybWluaW5nIHNldHRpbmdzLiBGb3IgaW5zdGFuY2UgdXNlCi0ubmYKLSAgSU5DPS1JYGFweHMgLXEgSU5DTFVERURJUmAKLS5maQotaW5zaWRlIHlvdXIgb3duIE1ha2VmaWxlcyBpZiB5b3UgbmVlZCBtYW51YWwgYWNjZXNzCi10byBBcGFjaGUncyBDIGhlYWRlciBmaWxlcy4KLS5QUAotQ29uZmlndXJhdGlvbiBvcHRpb25zOgotLlRQIDEyCi0uQkkgXC1TICIgbmFtZT12YWx1ZSIKLVRoaXMgb3B0aW9uIGNoYW5nZXMgdGhlIGFweHMgc2V0dGluZ3MgZGVzY3JpYmVkIGFib3ZlLgotLlBQCi1UZW1wbGF0ZSBHZW5lcmF0aW9uIG9wdGlvbnM6Ci0uVFAgMTIKLS5CIFwtZwotVGhpcyBnZW5lcmF0ZXMgYSBzdWJkaXJlY3RvcnkKLS5JIG5hbWUKLShzZWUgb3B0aW9uCi0uQlIgXC1uICIpIgotYW5kIHRoZXJlIHR3byBmaWxlczogQSBzYW1wbGUgbW9kdWxlIHNvdXJjZSBmaWxlIG5hbWVkCi0uQkkgbW9kXyBuYW1lLmMKLXdoaWNoIGNhbiBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIGNyZWF0aW5nIHlvdXIgb3duIG1vZHVsZXMgb3IKLWFzIGEgcXVpY2sgc3RhcnQgZm9yIHBsYXlpbmcgd2l0aCB0aGUgQVBYUyBtZWNoYW5pc20uCi1BbmQgYSBjb3JyZXNwb25kaW5nCi0uQiBNYWtlZmlsZQotZm9yIGV2ZW4gZWFzaWVyIGJ1aWxkIGFuZCBpbnN0YWxsaW5nIG9mIHRoaXMgbW9kdWxlLgotLlBQCi1EU08gY29tcGlsYXRpb24gb3B0aW9uczoKLS5UUCAxMgotLkIgXC1jCi1UaGlzIGluZGljYXRlcyB0aGUgY29tcGlsYXRpb24gb3BlcmF0aW9uLiBJdCBmaXJzdCBjb21waWxlcyB0aGUgQyBzb3VyY2UKLWZpbGVzICguYykgb2YKLS5JIGZpbGVzCi1pbnRvIGNvcnJlc3BvbmRpbmcgb2JqZWN0IGZpbGVzICgubykgYW5kIHRoZW4gYnVpbGRzIGEgZHluYW1pY2FsbHkgc2hhcmVkIG9iamVjdCBpbgotLkkgZHNvZmlsZQotYnkgbGlua2luZyB0aGVzZSBvYmplY3QgZmlsZXMgcGx1cyB0aGUgcmVtYWluaW5nCi1vYmplY3QgZmlsZXMgKC5vIGFuZCAuYSkgb2YKLS5JIGZpbGVzCi1JZiBubwotLkIgXC1vCi1vcHRpb24gaXMgc3BlY2lmaWVkCi10aGUgb3V0cHV0IGZpbGUgaXMgZ3Vlc3NlZCBmcm9tIHRoZSBmaXJzdCBmaWxlbmFtZSBpbgotLkkgZmlsZXMKLWFuZCB0aHVzIHVzdWFsbHkgZGVmYXVsdHMgdG8KLS5CSSBtb2RfIG5hbWUuc28KLS5UUCAxMgotLkJJIFwtbyAiIGRzb2ZpbGUiCi1FeHBsaWNpdGx5IHNwZWNpZmllcyB0aGUgZmlsZW5hbWUgb2YgdGhlIGNyZWF0ZWQgZHluYW1pY2FsbHkgc2hhcmVkIG9iamVjdC4gSWYKLW5vdCBzcGVjaWZpZWQgYW5kIHRoZSBuYW1lIGNhbm5vdCBiZSBndWVzc2VkIGZyb20gdGhlCi0uSSBmaWxlcwotbGlzdCwgdGhlIGZhbGxiYWNrIG5hbWUKLS5CIG1vZF91bmtub3duLnNvCi1pcyB1c2VkLgotLlRQIDEyCi0uQkkgXC1EICIgbmFtZT12YWx1ZSIKLVRoaXMgb3B0aW9uIGlzIGRpcmVjdGx5IHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBjb21waWxhdGlvbiBjb21tYW5kKHMpLgotVXNlIHRoaXMgdG8gYWRkIHlvdXIgb3duIGRlZmluZXMgdG8gdGhlIGJ1aWxkIHByb2Nlc3MuCi0uVFAgMTIKLS5CSSBcLUkgIiBpbmNkaXIiCi1UaGlzIG9wdGlvbiBpcyBkaXJlY3RseSBwYXNzZWQgdGhyb3VnaCB0byB0aGUgY29tcGlsYXRpb24gY29tbWFuZChzKS4KLVVzZSB0aGlzIHRvIGFkZCB5b3VyIG93biBpbmNsdWRlIGRpcmVjdG9yaWVzIHRvIHNlYXJjaCB0byB0aGUgYnVpbGQgcHJvY2Vzcy4KLS5UUCAxMgotLkJJIFwtTCAiIGxpYmRpciIKLVRoaXMgb3B0aW9uIGlzIGRpcmVjdGx5IHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBsaW5rZXIgY29tbWFuZC4KLVVzZSB0aGlzIHRvIGFkZCB5b3VyIG93biBsaWJyYXJ5IGRpcmVjdG9yaWVzIHRvIHNlYXJjaCB0byB0aGUgYnVpbGQgcHJvY2Vzcy4KLS5UUCAxMgotLkJJIFwtbCAiIGxpYm5hbWUiCi1UaGlzIG9wdGlvbiBpcyBkaXJlY3RseSBwYXNzZWQgdGhyb3VnaCB0byB0aGUgbGlua2VyIGNvbW1hbmQuCi1Vc2UgdGhpcyB0byBhZGQgeW91ciBvd24gbGlicmFyaWVzIHRvIHNlYXJjaCB0byB0aGUgYnVpbGQgcHJvY2Vzcy4KLS5UUCAxMgotLkJJIFwtV2MsICJjb21waWxlci1mbGFncyIKLVRoaXMgb3B0aW9uIHBhc3NlcyAKLS5JIGNvbXBpbGVyLWZsYWdzCi1hcyBhZGRpdGlvbmFsIGZsYWdzIHRvIHRoZSBjb21waWxlciBjb21tYW5kLgotVXNlIHRoaXMgdG8gYWRkIGxvY2FsIGNvbXBpbGVyLXNwZWNpZmljIG9wdGlvbnMuCi0uVFAgMTIKLS5CSSBcLVdsLCAibGlua2VyLWZsYWdzIgotVGhpcyBvcHRpb24gcGFzc2VzIAotLkkgbGlua2VyLWZsYWdzCi1hcyBhZGRpdGlvbmFsIGZsYWdzIHRvIHRoZSBsaW5rZXIgY29tbWFuZC4KLVVzZSB0aGlzIHRvIGFkZCBsb2NhbCBsaW5rZXItc3BlY2lmaWMgb3B0aW9ucy4KLS5QUAotRFNPIGluc3RhbGxhdGlvbiBhbmQgY29uZmlndXJhdGlvbiBvcHRpb25zOgotLlRQIDEyCi0uQiBcLWkKLVRoaXMgaW5kaWNhdGVzIHRoZSBpbnN0YWxsYXRpb24gb3BlcmF0aW9uIGFuZCBpbnN0YWxscyBvbmUgb3IgbW9yZQotZHluYW1pY2FsbHkgc2hhcmVkIG9iamVjdHMgaW50byB0aGUKLXNlcnZlcidzCi0uSSBsaWJleGVjCi1kaXJlY3RvcnkuCi0uVFAgMTIKLS5CIFwtYQotVGhpcyBhY3RpdmF0ZXMgdGhlIG1vZHVsZSBieSBhdXRvbWF0aWNhbGx5IGFkZGluZyBhIGNvcnJlc3BvbmRpbmcKLS5CIExvYWRNb2R1bGUKLWxpbmUgdG8gQXBhY2hlJ3MKLS5CIGh0dHBkLmNvbmYKLWNvbmZpZ3VyYXRpb24gZmlsZSwgb3IgYnkgZW5hYmxpbmcgaXQgaWYgaXQgYWxyZWFkeSBleGlzdHMuCi0uVFAgMTIKLS5CIFwtQQotU2FtZSBhcyBvcHRpb24KLS5CIFwtYQotYnV0IHRoZSBjcmVhdGVkIAotLkIgTG9hZE1vZHVsZQotZGlyZWN0aXZlIGlzIHByZWZpeGVkIHdpdGggYSBoYXNoIHNpZ24gKCMpLCBpLmUuIHRoZSBtb2R1bGUgaXMKLWp1c3QgcHJlcGFyZWQgZm9yIGxhdGVyIGFjdGl2YXRpb24gYnV0IGluaXRpYWxseSBkaXNhYmxlZC4gCi0uVFAgMTIKLS5CIFwtZQotVGhpcyBpbmRpY2F0ZXMgdGhlIGVkaXRpbmcgb3BlcmF0aW9uLCB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIHRoZQotLkIgXC1hCi1hbmQKLS5CIFwtQQotb3B0aW9ucyBzaW1pbGFybHkgdG8gdGhlCi0uQiBcLWkKLW9wZXJhdGlvbiB0byBlZGl0IEFwYWNoZSdzCi0uQiBodHRwZC5jb25mCi1jb25maWd1cmF0aW9uIGZpbGUgd2l0aG91dCBhdHRlbXB0aW5nIHRvIGluc3RhbGwgdGhlIG1vZHVsZS4KLS5QRAotLlNIIEVYQU1QTEVTCi1Bc3N1bWUgeW91IGhhdmUgYW4gQXBhY2hlIG1vZHVsZSBuYW1lZCBtb2RfZm9vLmMgYXZhaWxhYmxlIHdoaWNoIHNob3VsZCBleHRlbmQKLUFwYWNoZSdzIHNlcnZlciBmdW5jdGlvbmFsaXR5LiBUbyBhY2NvbXBsaXNoIHRoaXMgeW91IGZpcnN0IGhhdmUgdG8gY29tcGlsZQotdGhlIEMgc291cmNlIGludG8gYSBzaGFyZWQgb2JqZWN0IHN1aXRhYmxlIGZvciBsb2FkaW5nIGludG8gdGhlIEFwYWNoZSBzZXJ2ZXIKLXVuZGVyIHJ1bnRpbWUgdmlhIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKLQotLm5mCi0gICQgYXB4cyAtYyBtb2RfZm9vLmMKLSAgZ2NjIC1mcGljIC1EU0hBUkVEX01PRFVMRSAtSS9wYXRoL3RvL2FwYWNoZS9pbmNsdWRlIC1jIG1vZF9mb28uYwotICBsZCAtQnNoYXJlYWJsZSAtbyBtb2RfZm9vLnNvIG1vZF9mb28ubwotICAkIF8KLS5maQotCi1UaGVuIHlvdSBoYXZlIHRvIHVwZGF0ZSB0aGUgQXBhY2hlIGNvbmZpZ3VyYXRpb24gYnkgbWFraW5nIHN1cmUgYQotLkIgTG9hZE1vZHVsZQotZGlyZWN0aXZlIGlzIHByZXNlbnQgdG8gbG9hZCB0aGlzIHNoYXJlZCBvYmplY3QuIFRvIHNpbXBsaWZ5IHRoaXMKLXN0ZXAKLS5CIGFweHMKLXByb3ZpZGVzIGFuIGF1dG9tYXRpYyB3YXkgdG8gaW5zdGFsbCB0aGUgc2hhcmVkIG9iamVjdCBpbiBpdHMKLSJsaWJleGVjIiBkaXJlY3RvcnkgYW5kIHVwZGF0aW5nIHRoZQotLkIgaHR0cGQuY29uZgotZmlsZSBhY2NvcmRpbmdseS4gVGhpcyBjYW4gYmUgYWNoaWV2ZWQgYnkgcnVubmluZzoKLQotLm5mCi0gICQgYXB4cyAtaSAtYSBtb2RfZm9vLmMKLSAgY3AgbW9kX2Zvby5zbyAvcGF0aC90by9hcGFjaGUvbGliZXhlYy9tb2RfZm9vLnNvCi0gIGNobW9kIDc1NSAvcGF0aC90by9hcGFjaGUvbGliZXhlYy9tb2RfZm9vLnNvCi0gIFthY3RpdmF0aW5nIG1vZHVsZSBgZm9vJyBpbiAvcGF0aC90by9hcGFjaGUvZXRjL2h0dHBkLmNvbmZdCi0gICQgXwotLmZpCi0KLVRoaXMgd2F5IGEgbGluZSBuYW1lZAotCi0ubmYKLSAgTG9hZE1vZHVsZSBmb29fbW9kdWxlIGxpYmV4ZWMvbW9kX2Zvby5zbwotLmZpCi0KLWlzIGFkZGVkIHRvIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaWYgc3RpbGwgbm90IHByZXNlbnQuCi1JZiB5b3Ugd2FudCB0byBoYXZlIHRoaXMgdGhpcyBkaXNhYmxlZCBwZXIgZGVmYXVsdCB1c2UgdGhlCi0uQiBcLUEKLW9wdGlvbiwgaS5lLgotCi0ubmYKLSAgJCBhcHhzIC1pIC1BIG1vZF9mb28uYwotLmZpCi0KLUZvciBhIHF1aWNrIHRlc3Qgb2YgdGhlIEFQWFMgbWVjaGFuaXNtIHlvdSBjYW4gY3JlYXRlIGEgc2FtcGxlIEFwYWNoZSBtb2R1bGUKLXRlbXBsYXRlIHBsdXMgYSBjb3JyZXNwb25kaW5nIE1ha2VmaWxlIHZpYToKLQotLm5mCi0gICQgYXB4cyAtZyAtbiBmb28KLSAgQ3JlYXRpbmcgW0RJUl0gIGZvbwotICBDcmVhdGluZyBbRklMRV0gZm9vL01ha2VmaWxlCi0gIENyZWF0aW5nIFtGSUxFXSBmb28vbW9kX2Zvby5jCi0gICQgXwotLmZpCi0KLVRoZW4geW91IGNhbiBpbW1lZGlhdGVseSBjb21waWxlIHRoaXMgc2FtcGxlIG1vZHVsZSBpbnRvIGEgc2hhcmVkIG9iamVjdCBhbmQKLWxvYWQgaXQgaW50byB0aGUgQXBhY2hlIHNlcnZlcjoKLQotLm5mCi0gICQgY2QgZm9vCi0gICQgbWFrZSBhbGwgcmVsb2FkCi0gIGFweHMgLWMgbW9kX2Zvby5jCi0gIGdjYyAtZnBpYyAtRFNIQVJFRF9NT0RVTEUgLUkvcGF0aC90by9hcGFjaGUvaW5jbHVkZSAtYyBtb2RfZm9vLmMKLSAgbGQgLUJzaGFyZWFibGUgLW8gbW9kX2Zvby5zbyBtb2RfZm9vLm8KLSAgYXB4cyAtaSAtYSAtbiAiZm9vIiBtb2RfZm9vLnNvCi0gIGNwIG1vZF9mb28uc28gL3BhdGgvdG8vYXBhY2hlL2xpYmV4ZWMvbW9kX2Zvby5zbwotICBjaG1vZCA3NTUgL3BhdGgvdG8vYXBhY2hlL2xpYmV4ZWMvbW9kX2Zvby5zbwotICBbYWN0aXZhdGluZyBtb2R1bGUgYGZvbycgaW4gL3BhdGgvdG8vYXBhY2hlL2V0Yy9odHRwZC5jb25mXQotICBhcGFjaGVjdGwgcmVzdGFydAotICAvcGF0aC90by9hcGFjaGUvc2Jpbi9hcGFjaGVjdGwgcmVzdGFydDogaHR0cGQgbm90IHJ1bm5pbmcsIHRyeWluZyB0byBzdGFydAotICBbVHVlIE1hciAzMSAxMToyNzo1NSAxOTk4XSBbZGVidWddIG1vZF9zby5jKDMwMyk6IGxvYWRlZCBtb2R1bGUgZm9vX21vZHVsZQotICAvcGF0aC90by9hcGFjaGUvc2Jpbi9hcGFjaGVjdGwgcmVzdGFydDogaHR0cGQgc3RhcnRlZAotICAkIF8KLS5maQotCi1Zb3UgY2FuIGV2ZW4gdXNlCi0uQiBhcHhzCi10byBjb21waWxlIGNvbXBsZXggbW9kdWxlcyBvdXRzaWRlIHRoZSBBcGFjaGUgc291cmNlIHRyZWUsIGxpa2UgUEhQMzoKLQotLm5mCi0gICQgY2QgcGhwMwotICAkIC4vY29uZmlndXJlIC0td2l0aC1zaGFyZWQtYXBhY2hlPS4uL2FwYWNoZS0xLjMKLSAgJCBhcHhzIC1jIC1vIGxpYnBocDMuc28gbW9kX3BocDMuYyBsaWJtb2RwaHAzLXNvLmEKLSAgZ2NjIC1mcGljIC1EU0hBUkVEX01PRFVMRSAtSS90bXAvYXBhY2hlL2luY2x1ZGUgIC1jIG1vZF9waHAzLmMKLSAgbGQgLUJzaGFyZWFibGUgLW8gbGlicGhwMy5zbyBtb2RfcGhwMy5vIGxpYm1vZHBocDMtc28uYQotICAkIF8KLS5maQotCi1iZWNhdXNlCi0uQiBhcHhzCi1hdXRvbWF0aWNhbGx5IHJlY29nbml6ZWQgQyBzb3VyY2UgZmlsZXMgYW5kIG9iamVjdCBmaWxlcy4gIE9ubHkgQyBzb3VyY2UgZmlsZXMKLWFyZSBjb21waWxlZCB3aGlsZSByZW1haW5pbmcgb2JqZWN0IGZpbGVzIGFyZSB1c2VkIGZvciB0aGUgbGlua2luZyBwaGFzZS4KLQotLlBECi0uU0ggU0VFIEFMU08KLS5CUiBhcGFjaGVjdGwoMSksCi0uQlIgaHR0cGQoOCkuCi0uCmRpZmYgLS1naXQgYS9kb2NzL21hbi9kYm1tYW5hZ2UuMSBiL2RvY3MvbWFuL2RibW1hbmFnZS4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjM4MGZmLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFuL2RibW1hbmFnZS4xCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS5USCBkYm1tYW5hZ2UgMSAiTWFyY2ggMTk5OCIKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLlwiCi0uXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0uXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0uXCIgYXJlIG1ldDoKLS5cIgotLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLS5cIgotLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0uXCIgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLlwiICAgIGRpc3RyaWJ1dGlvbi4KLS5cIgotLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotLlwiICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotLlwiICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLS5cIiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotLlwiCi0uXCIgNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotLlwiICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0uXCIgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLlwiCi0uXCIgNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLS5cIiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLS5cIiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0uXCIKLS5cIiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0uXCIgICAgYWNrbm93bGVkZ21lbnQ6Ci0uXCIgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotLlwiICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0uXCIKLS5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLS5cIiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0uXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0uXCIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLS5cIiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0uXCIgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0uXCIgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0uXCIgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLS5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0uXCIgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotLlwiIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLS5cIiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0uXCIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS5cIgotLlwiIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0uXCIgaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0uXCIgb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0uXCIgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotLlwiIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLS5cIiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLS5TSCBOQU1FCi1kYm1tYW5hZ2UgXC0gQ3JlYXRlIGFuZCB1cGRhdGUgdXNlciBhdXRoZW50aWNhdGlvbiBmaWxlcyBpbiBEQk0gZm9ybWF0Ci0uU0ggU1lOT1BTSVMKLS5CIGRibW1hbmFnZQotLkkgZmlsZW5hbWUKLVsKLS5JIGNvbW1hbmQKLV0gWwotLkkgdXNlcm5hbWUKLVsKLS5JIGVuY3Bhc3N3ZAotXSBdCi0uUFAKLS5TSCBERVNDUklQVElPTgotLkIgZGJtbWFuYWdlCi1pcyB1c2VkIHRvIGNyZWF0ZSBhbmQgdXBkYXRlIHRoZSBEQk0gZm9ybWF0IGZpbGVzIHVzZWQgdG8gc3RvcmUKLXVzZXJuYW1lcyBhbmQgcGFzc3dvcmQgZm9yIGJhc2ljIGF1dGhlbnRpY2F0aW9uIG9mIEhUVFAgdXNlcnMuCi1SZXNvdXJjZXMgYXZhaWxhYmxlIGZyb20gdGhlCi0uQiBodHRwZAotQXBhY2hlIHdlYiBzZXJ2ZXIgY2FuIGJlIHJlc3RyaWN0ZWQgdG8ganVzdCB0aGUgdXNlcnMgbGlzdGVkCi1pbiB0aGUgZmlsZXMgY3JlYXRlZCBieSAKLS5CIGRibW1hbmFnZS4KLVRoaXMgcHJvZ3JhbSBjYW4gb25seSBiZSB1c2VkCi13aGVuIHRoZSB1c2VybmFtZXMgYXJlIHN0b3JlZCBpbiBhIERCTSBmaWxlLiBUbyB1c2UgYQotZmxhdC1maWxlIGRhdGFiYXNlIHNlZSAKLVxmQmh0cGFzc3dkXGZQLgotLlBQCi1UaGlzIG1hbnVhbCBwYWdlIG9ubHkgbGlzdHMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuIEZvciBkZXRhaWxzIG9mCi10aGUgZGlyZWN0aXZlcyBuZWNlc3NhcnkgdG8gY29uZmlndXJlIHVzZXIgYXV0aGVudGljYXRpb24gaW4gCi0uQiBodHRwZCAKLXNlZQotdGhlIEFwYWNoZSBtYW51YWwsIHdoaWNoIGlzIHBhcnQgb2YgdGhlIEFwYWNoZSBkaXN0cmlidXRpb24gb3IgY2FuIGJlCi1mb3VuZCBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvLgotLlNIIE9QVElPTlMKLS5JUCBcZkJcZklmaWxlbmFtZVxmUAotVGhlIGZpbGVuYW1lIG9mIHRoZSBEQk0gZm9ybWF0IGZpbGUuIFVzdWFsbHkgd2l0aG91dCB0aGUgCi1leHRlbnNpb24gLmRiLCAucGFnLCBvciAuZGlyLgotLklQIFxmQlxmSWNvbW1hbmRcZlAKLVRoaXMgc2VsZWN0cyB0aGUgb3BlcmF0aW9uIHRvIHBlcmZvcm06Ci0uVFAgMTIKLS5CIGFkZAotQWRkcyBhbiBlbnRyeSBmb3IgXGZJdXNlcm5hbWVcZlAgdG8gXGZJZmlsZW5hbWVcZlAgdXNpbmcgdGhlIGVuY3J5cHRlZAotcGFzc3dvcmQgXGZJZW5jcGFzc3dvcmRcZlAuCi0uVFAgMTIKLS5CIGFkZHVzZXIKLUFza3MgZm9yIGEgcGFzc3dvcmQgYW5kIHRoZW4gYWRkcyBhbiBlbnRyeSBmb3IgXGZJdXNlcm5hbWVcZlAgdG8KLVxmSWZpbGVuYW1lXGZQIC4KLS5UUCAxMgotLkIgY2hlY2sKLUFza3MgZm9yIGEgcGFzc3dvcmQgYW5kIHRoZW4gY2hlY2tzIGlmIAotXGZJdXNlcm5hbWVcZlAgaXMgaW4gXGZJZmlsZW5hbWVcZlAgYW5kIGlmIGl0J3MgcGFzc3dvcmQgbWF0Y2hlcwotdGhlIHNwZWNpZmllZCBvbmUuCi0uVFAgMTIKLS5CIGRlbGV0ZQotRGVsZXRlcyB0aGUgXGZJdXNlcm5hbWVcZlAgZW50cnkgZnJvbSBcZklmaWxlbmFtZVxmUC4KLS5UUCAxMgotLkIgaW1wb3J0Ci1SZWFkcyB1c2VybmFtZTpwYXNzd29yZCBlbnRyaWVzIChvbmUgcGVyIGxpbmUpIGZyb20gU1RESU4gYW5kIGFkZHMgdGhlbSB0bwotXGZJZmlsZW5hbWVcZlAuIFRoZSBwYXNzd29yZHMgYWxyZWFkeSBoYXMgdG8gYmUgY3J5cHRlZC4KLS5UUCAxMgotLkIgdXBkYXRlCi1TYW1lIGFzIHRoZSAiYWRkdXNlciIgY29tbWFuZCwgZXhjZXB0IHRoYXQgaXQgbWFrZXMgc3VyZSBcZkl1c2VybmFtZVxmUAotYWxyZWFkeSBleGlzdHMgaW4gXGZJZmlsZW5hbWVcZlAuCi0uVFAgMTIKLS5CIHZpZXcKLUp1c3QgZGlzcGxheXMgdGhlIGNvbXBsZXRlIGNvbnRlbnRzIG9mIHRoZSBEQk0gZmlsZS4KLS5JUCBcZkJcZkl1c2VybmFtZVxmUAotVGhlIHVzZXIgZm9yIHdoaWNoIHRoZSB1cGRhdGUgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZC4KLS5QRAotLlNIIEJVR1MKLS5QUAotT25lIHNob3VsZCBiZSBhd2FyZSB0aGF0IHRoZXJlIGFyZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgREJNIGZpbGUKLWZvcm1hdHMgaW4gZXhpc3RhbmNlLCBhbmQgd2l0aCBhbGwgbGlrZWxpaG9vZCwgbGlicmFyaWVzIGZvciBtb3JlIHRoYW4KLW9uZSBmb3JtYXQgbWF5IGV4aXN0IG9uIHlvdXIgc3lzdGVtLiAgVGhlIHRocmVlIHByaW1hcnkgZXhhbXBsZXMgYXJlCi1OREJNLCB0aGUgR05VIHByb2plY3QncyBHREJNLCBhbmQgQmVya2VsZXkgREIgMi4gIFVuZm9ydHVuYXRlbHksIGFsbAotdGhlc2UgbGlicmFyaWVzIHVzZSBkaWZmZXJlbnQgZmlsZSBmb3JtYXRzLCBhbmQgeW91IG11c3QgbWFrZSBzdXJlCi10aGF0IHRoZSBmaWxlIGZvcm1hdCB1c2VkIGJ5Ci0uSSBmaWxlbmFtZQotaXMgdGhlIHNhbWUgZm9ybWF0IHRoYXQgCi0uQiBkYm1tYW5hZ2UKLWV4cGVjdHMgdG8gc2VlLiAgCi0uQiBkYm1tYW5hZ2UKLWN1cnJlbnRseSBoYXMgbm8gd2F5IG9mIGRldGVybWluaW5nIHdoYXQgdHlwZSBvZiBEQk0gZmlsZSBpdCBpcwotbG9va2luZyBhdC4gIElmIHVzZWQgYWdhaW5zdCB0aGUgd3JvbmcgZm9ybWF0LCAKLS5kYm1tYW5hZ2UKLXdpbGwgc2ltcGx5IHJldHVybiBub3RoaW5nLCBvciBtYXkgY3JlYXRlIGEgZGlmZmVyZW50IERCTSBmaWxlIHdpdGggYQotZGlmZmVyZW50IG5hbWUsIG9yIGF0IHdvcnN0LCBpdCBtYXkgY29ycnVwdCB0aGUgREJNIGZpbGUgaWYgeW91IHdlcmUKLWF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gaXQuCi0uUFAKLS5CIGRibW1hbmFnZQotaGFzIGEgbGlzdCBvZiBEQk0gZm9ybWF0IHByZWZlcmVuY2VzLCBkZWZpbmVkIGJ5IHRoZSAKLS5CIEBBbnlEQk06OklTQQotYXJyYXkgbmVhciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm9ncmFtLiAgU2luY2Ugd2UgcHJlZmVyIHRoZSBCZXJrZWxleQotREIgMiBmaWxlIGZvcm1hdCwgdGhlIG9yZGVyIGluIHdoaWNoCi0uQiBkYm1tYW5hZ2UgCi13aWxsIGxvb2sgZm9yIHN5c3RlbSBsaWJyYXJpZXMgaXMgQmVya2VsZXkgREIgMiwgdGhlbiBOREJNLCBhbmQgdGhlbgotR0RCTS4gIFRoZSBmaXJzdCBsaWJyYXJ5IGZvdW5kIHdpbGwgYmUgdGhlIGxpYnJhcnkKLS5CIGRibW1hbmFnZQotd2lsbCBhdHRlbXB0IHRvIHVzZSBmb3IgYWxsIERCTSBmaWxlIHRyYW5zYWN0aW9ucy4gIFRoaXMgb3JkZXJpbmcgaXMKLXNsaWdodGx5IGRpZmZlcmVudCB0aGFuIHRoZSBzdGFuZGFyZCAKLS5CIEBBbnlEQk06OklTQQotb3JkZXJpbmcgaW4gcGVybCwgYXMgd2VsbCBhcyB0aGUgb3JkZXJpbmcgdXNlZCBieSB0aGUgc2ltcGxlIGRibW9wZW4oKQotY2FsbCBpbiBQZXJsLCBzbyBpZiB5b3UgdXNlIGFueSBvdGhlciB1dGlsaXRpZXMgdG8gbWFuYWdlIHlvdXIgREJNCi1maWxlcywgdGhleSBtdXN0IGFsc28gZm9sbG93IHRoaXMgcHJlZmVyZW5jZSBvcmRlcmluZy4gIFNpbWlsYXIgY2FyZQotbXVzdCBiZSB0YWtlbiBpZiB1c2luZyBwcm9ncmFtcyBpbiBvdGhlciBsYW5ndWFnZXMsIGxpa2UgQywgdG8gCi1hY2Nlc3MgdGhlc2UgZmlsZXMuCi0uUFAKLUFwYWNoZSdzIAotLkIgbW9kX2F1dGhfZGIuYyAKLW1vZHVsZSBjb3JyZXNwb25kcyB0byBCZXJrZWxleSBEQiAyIGxpYnJhcnksIHdoaWxlCi0uQiBtb2RfYXV0aF9kYm0uYwotY29ycmVzcG9uZHMgdG8gdGhlIE5EQk0gbGlicmFyeS4gIEFsc28sIG9uZSBjYW4gdXN1YWxseSB1c2UgdGhlIAotLkIgZmlsZQotcHJvZ3JhbSBzdXBwbGllZCB3aXRoIG1vc3QgVW5peCBzeXN0ZW1zIHRvIHNlZSB3aGF0IGZvcm1hdCBhIERCTSBmaWxlIGlzIGluLgotLlBECi0uU0ggU0VFIEFMU08KLS5CUiBodHRwZCg4KQotLgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW4vaHRkaWdlc3QuMSBiL2RvY3MvbWFuL2h0ZGlnZXN0LjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MTllNDUuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW4vaHRkaWdlc3QuMQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS5USCBodGRpZ2VzdCAxICJNYXJjaCAxOTk4IgotLlwiIENvcHlyaWdodCAoYykgMTk5Ny0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0uXCIKLS5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLS5cIiBhcmUgbWV0OgotLlwiCi0uXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotLlwiCi0uXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLS5cIiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0uXCIgICAgZGlzdHJpYnV0aW9uLgotLlwiCi0uXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0uXCIgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0uXCIgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotLlwiICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0uXCIKLS5cIiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0uXCIgICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLS5cIiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0uXCIgICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0uXCIKLS5cIiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotLlwiICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotLlwiICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLS5cIgotLlwiIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLS5cIiAgICBhY2tub3dsZWRnbWVudDoKLS5cIiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0uXCIgICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLS5cIgotLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotLlwiIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLS5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLS5cIiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotLlwiIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS5cIiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLS5cIiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLS5cIiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLS5cIiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0uXCIgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotLlwiIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS5cIiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLlwiCi0uXCIgVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLS5cIiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLS5cIiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLS5cIiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0uXCIgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotLlwiIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotLlNIIE5BTUUKLWh0ZGlnZXN0IFwtIENyZWF0ZSBhbmQgdXBkYXRlIHVzZXIgYXV0aGVudGljYXRpb24gZmlsZXMKLS5TSCBTWU5PUFNJUwotLkIgaHRkaWdlc3QgCi1bCi0uQiBcLWMKLV0gCi0uSSBwYXNzd2RmaWxlCi0uSSByZWFsbQotLkkgdXNlcm5hbWUKLS5TSCBERVNDUklQVElPTgotLkIgaHRkaWdlc3QKLWlzIHVzZWQgdG8gY3JlYXRlIGFuZCB1cGRhdGUgdGhlIGZsYXQtZmlsZXMgdXNlZCB0byBzdG9yZQotdXNlcm5hbWVzLCByZWFsbSBhbmQgcGFzc3dvcmQgZm9yIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiBvZiBIVFRQIHVzZXJzLgotUmVzb3VyY2VzIGF2YWlsYWJsZSBmcm9tIHRoZQotLkIgaHR0cGQKLUFwYWNoZSB3ZWIgc2VydmVyIGNhbiBiZSByZXN0cmljdGVkIHRvIGp1c3QgdGhlIHVzZXJzIGxpc3RlZAotaW4gdGhlIGZpbGVzIGNyZWF0ZWQgYnkgCi0uQiBodGRpZ2VzdC4KLS5QUAotVGhpcyBtYW51YWwgcGFnZSBvbmx5IGxpc3RzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiBGb3IgZGV0YWlscyBvZgotdGhlIGRpcmVjdGl2ZXMgbmVjZXNzYXJ5IHRvIGNvbmZpZ3VyZSBkaWdlc3QgYXV0aGVudGljYXRpb24gaW4gCi0uQiBodHRwZCAKLXNlZQotdGhlIEFwYWNoZSBtYW51YWwsIHdoaWNoIGlzIHBhcnQgb2YgdGhlIEFwYWNoZSBkaXN0cmlidXRpb24gb3IgY2FuIGJlCi1mb3VuZCBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvLgotLlNIIE9QVElPTlMKLS5JUCBcLWMgCi1DcmVhdGUgdGhlIFxmSXBhc3N3ZGZpbGVcZlAuIElmIFxmSXBhc3N3ZGZpbGVcZlAgYWxyZWFkeSBleGlzdHMsIGl0Ci1pcyBkZWxldGVkIGZpcnN0LiAKLS5JUCBcZkJcZklwYXNzd2RmaWxlXGZQCi1OYW1lIG9mIHRoZSBmaWxlIHRvIGNvbnRhaW4gdGhlIHVzZXJuYW1lLCByZWFsbSBhbmQgcGFzc3dvcmQuIElmIFwtYwotaXMgZ2l2ZW4sIHRoaXMgZmlsZSBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QsCi1vciBkZWxldGVkIGFuZCByZWNyZWF0ZWQgaWYgaXQgZG9lcyBleGlzdC4gCi0uSVAgXGZCXGZJcmVhbG1cZlAKLVRoZSByZWFsbSBuYW1lIHRvIHdoaWNoIHRoZSB1c2VyIG5hbWUgYmVsb25ncyB0by4gCi0uSVAgXGZCXGZJdXNlcm5hbWVcZlAKLVRoZSB1c2VyIG5hbWUgdG8gY3JlYXRlIG9yIHVwZGF0ZSBpbiBcZkJwYXNzd2RmaWxlXGZQLiBJZgotXGZJdXNlcm5hbWVcZlAgZG9lcyBub3QgZXhpc3QgaXMgdGhpcyBmaWxlLCBhbiBlbnRyeSBpcyBhZGRlZC4gSWYgaXQKLWRvZXMgZXhpc3QsIHRoZSBwYXNzd29yZCBpcyBjaGFuZ2VkLgotLlNIIFNFRSBBTFNPCi0uQlIgaHR0cGQoOCkgCi0uCmRpZmYgLS1naXQgYS9kb2NzL21hbi9odHBhc3N3ZC4xIGIvZG9jcy9tYW4vaHRwYXNzd2QuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY4N2NkZS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbi9odHBhc3N3ZC4xCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS5USCBodHBhc3N3ZCAxICJGZWJydWFyeSAxOTk3IgotLlwiIENvcHlyaWdodCAoYykgMTk5Ny0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0uXCIKLS5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLS5cIiBhcmUgbWV0OgotLlwiCi0uXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotLlwiCi0uXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLS5cIiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0uXCIgICAgZGlzdHJpYnV0aW9uLgotLlwiCi0uXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0uXCIgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0uXCIgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotLlwiICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0uXCIKLS5cIiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0uXCIgICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLS5cIiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0uXCIgICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0uXCIKLS5cIiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotLlwiICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotLlwiICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLS5cIgotLlwiIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLS5cIiAgICBhY2tub3dsZWRnbWVudDoKLS5cIiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0uXCIgICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLS5cIgotLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotLlwiIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLS5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLS5cIiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotLlwiIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS5cIiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLS5cIiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLS5cIiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLS5cIiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0uXCIgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotLlwiIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS5cIiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLlwiCi0uXCIgVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLS5cIiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLS5cIiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLS5cIiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0uXCIgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotLlwiIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotLlNIIE5BTUUKLWh0cGFzc3dkIFwtIENyZWF0ZSBhbmQgdXBkYXRlIHVzZXIgYXV0aGVudGljYXRpb24gZmlsZXMKLS5TSCBTWU5PUFNJUwotLkIgaHRwYXNzd2QgCi1bCi0uQiBcLWMKLV0gCi1bCi0uQiBcLW0KLV0gCi0uSSBwYXNzd2RmaWxlCi0uSSB1c2VybmFtZQotLmJyCi0uQiBodHBhc3N3ZAotLkIgXC1iICAKLVsKLS5CIFwtYwotXSAKLVsKLS5CIFwtbQotLkIgXC1kCi0uQiBcLXAKLS5CIFwtcwotXSAKLS5JIHBhc3N3ZGZpbGUKLS5JIHVzZXJuYW1lCi0uSSBwYXNzd29yZAotLlNIIERFU0NSSVBUSU9OCi0uQiBodHBhc3N3ZAotaXMgdXNlZCB0byBjcmVhdGUgYW5kIHVwZGF0ZSB0aGUgZmxhdC1maWxlcyB1c2VkIHRvIHN0b3JlCi11c2VybmFtZXMgYW5kIHBhc3N3b3JkIGZvciBiYXNpYyBhdXRoZW50aWNhdGlvbiBvZiBIVFRQIHVzZXJzLgotSWYKLS5CIGh0cGFzc3dkCi1jYW5ub3QgYWNjZXNzIGEgZmlsZSwgc3VjaCBhcyBub3QgYmVpbmcgYWJsZSB0byB3cml0ZSB0byB0aGUgb3V0cHV0Ci1maWxlIG9yIG5vdCBiZWluZyBhYmxlIHRvIHJlYWQgdGhlIGZpbGUgaW4gb3JkZXIgdG8gdXBkYXRlIGl0LAotaXQgcmV0dXJucyBhbiBlcnJvciBzdGF0dXMgYW5kIG1ha2VzIG5vIGNoYW5nZXMuCi0uUFAKLVJlc291cmNlcyBhdmFpbGFibGUgZnJvbSB0aGUKLS5CIGh0dHBkCi1BcGFjaGUgd2ViIHNlcnZlciBjYW4gYmUgcmVzdHJpY3RlZCB0byBqdXN0IHRoZSB1c2VycyBsaXN0ZWQKLWluIHRoZSBmaWxlcyBjcmVhdGVkIGJ5IAotLkIgaHRwYXNzd2QuCi1UaGlzIHByb2dyYW0gY2FuIG9ubHkgYmUgdXNlZAotd2hlbiB0aGUgdXNlcm5hbWVzIGFyZSBzdG9yZWQgaW4gYSBmbGF0LWZpbGUuIFRvIHVzZSBhCi1EQk0gZGF0YWJhc2Ugc2VlIAotXGZCZGJtbWFuYWdlXGZQLgotLlBQCi0uQiBodHBhc3N3ZAotZW5jcnlwdHMgcGFzc3dvcmRzIHVzaW5nIGVpdGhlciBhIHZlcnNpb24gb2YgTUQ1IG1vZGlmaWVkIGZvciBBcGFjaGUsCi1vciB0aGUgc3lzdGVtJ3MgXGZJY3J5cHQoKVxmUCByb3V0aW5lLiAgRmlsZXMgbWFuYWdlZCBieQotLkIgaHRwYXNzd2QKLW1heSBjb250YWluIGJvdGggdHlwZXMgb2YgcGFzc3dvcmRzOyBzb21lIHVzZXIgcmVjb3JkcyBtYXkgaGF2ZQotTUQ1LWVuY3J5cHRlZCBwYXNzd29yZHMgd2hpbGUgb3RoZXJzIGluIHRoZSBzYW1lIGZpbGUgbWF5IGhhdmUgcGFzc3dvcmRzCi1lbmNyeXB0ZWQgd2l0aCBcZkljcnlwdCgpXGZQLgotLlBQCi1UaGlzIG1hbnVhbCBwYWdlIG9ubHkgbGlzdHMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuIEZvciBkZXRhaWxzIG9mCi10aGUgZGlyZWN0aXZlcyBuZWNlc3NhcnkgdG8gY29uZmlndXJlIHVzZXIgYXV0aGVudGljYXRpb24gaW4gCi0uQiBodHRwZCAKLXNlZQotdGhlIEFwYWNoZSBtYW51YWwsIHdoaWNoIGlzIHBhcnQgb2YgdGhlIEFwYWNoZSBkaXN0cmlidXRpb24gb3IgY2FuIGJlCi1mb3VuZCBhdCA8VVJMOmh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotLlNIIE9QVElPTlMKLS5JUCBcLWIgCi1Vc2UgYmF0Y2ggbW9kZTsgXGZJaS5lLlxmUCwgZ2V0IHRoZSBwYXNzd29yZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUKLXJhdGhlciB0aGFuIHByb21wdGluZyBmb3IgaXQuIFxmQlRoaXMgb3B0aW9uIHNob3VsZCBiZSB1c2VkIHdpdGgKLWV4dHJlbWUgY2FyZSwgc2luY2UgdGhlIHBhc3N3b3JkIGlzIGNsZWFybHkgdmlzaWJsZSBvbiB0aGUgY29tbWFuZAotbGluZS5cZlAKLS5JUCBcLWMgCi1DcmVhdGUgdGhlIFxmSXBhc3N3ZGZpbGVcZlAuIElmIFxmSXBhc3N3ZGZpbGVcZlAgYWxyZWFkeSBleGlzdHMsIGl0Ci1pcyByZXdyaXR0ZW4gYW5kIHRydW5jYXRlZC4KLS5JUCBcLW0gCi1Vc2UgTUQ1IGVuY3J5cHRpb24gZm9yIHBhc3N3b3Jkcy4gT24gV2luZG93cyBhbmQgVFBGLCB0aGlzIGlzIHRoZSBkZWZhdWx0LgotLklQIFwtZAotVXNlIGNyeXB0KCkgZW5jcnlwdGlvbiBmb3IgcGFzc3dvcmRzLiBUaGUgZGVmYXVsdCBvbiBhbGwgcGxhdGZvcm1zIGJ1dAotV2luZG93cyBhbmQgVFBGLiBUaG91Z2ggcG9zc2libHkgc3VwcG9ydGVkIGJ5Ci0uQiBodHBhc3N3ZAotb25tIGFsbCBwbGF0Zm9ybXMsIGl0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCi0uQiBodHRwZAotc2VydmVyIG9uIFdpbmRvd3MgYW5kIFRQRi4KLS5JUCBcLXMKLVVzZSBTSEEgZW5jcnlwdGlvbiBmb3IgcGFzc3dvcmRzLiBGYWNpbGlhdGVzIG1pZ3JhdGlvbiBmcm9tL3RvIE5ldHNjYXBlCi1zZXJ2ZXJzIHVzaW5nIHRoZSBMREFQIERpcmVjdG9yeSBJbnRlcmNoYW5nZSBGb3JtYXQgKGxkaWYpLgotLklQIFwtcAotVXNlIHBsYWludGV4dCBwYXNzd29yZHMuIFRob3VnaCAKLS5CIGh0cGFzc3dkCi13aWxsIHN1cHBvcnQgY3JlYXRpb24gb24gYWxsIHBsYXRvZnJtcywgdGhlCi0uQiBodHRwZAotZGVhbW9uIHdpbGwgb25seSBhY2NlcHQgcGxhaW4gdGV4dCBwYXNzd29yZHMgb24gV2luZG93cyBhbmQgVFBGLgotLklQIFxmQlxmSXBhc3N3ZGZpbGVcZlAKLU5hbWUgb2YgdGhlIGZpbGUgdG8gY29udGFpbiB0aGUgdXNlciBuYW1lIGFuZCBwYXNzd29yZC4gSWYgXC1jCi1pcyBnaXZlbiwgdGhpcyBmaWxlIGlzIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdCwKLW9yIHJld3JpdHRlbiBhbmQgdHJ1bmNhdGVkIGlmIGl0IGRvZXMgZXhpc3QuIAotLklQIFxmQlxmSXVzZXJuYW1lXGZQCi1UaGUgdXNlcm5hbWUgdG8gY3JlYXRlIG9yIHVwZGF0ZSBpbiBcZkJwYXNzd2RmaWxlXGZQLiBJZgotXGZJdXNlcm5hbWVcZlAgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBmaWxlLCBhbiBlbnRyeSBpcyBhZGRlZC4gSWYgaXQKLWRvZXMgZXhpc3QsIHRoZSBwYXNzd29yZCBpcyBjaGFuZ2VkLgotLklQIFxmQlxmSXBhc3N3b3JkXGZQCi1UaGUgcGxhaW50ZXh0IHBhc3N3b3JkIHRvIGJlIGVuY3J5cHRlZCBhbmQgc3RvcmVkIGluIHRoZSBmaWxlLiAgT25seSB1c2VkCi13aXRoIHRoZSBcZkktYlxmUCBmbGFnLgotLlNIIEVYSVQgU1RBVFVTCi0uQiBodHBhc3N3ZAotcmV0dXJucyBhIHplcm8gc3RhdHVzICgidHJ1ZSIpIGlmIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgaGF2ZQotYmVlbiBzdWNjZXNzZnVsbHkgYWRkZWQgb3IgdXBkYXRlZCBpbiB0aGUgXGZJcGFzc3dkZmlsZVxmUC4KLS5CIGh0cGFzc3dkCi1yZXR1cm5zIDEgaWYgaXQgZW5jb3VudGVycyBzb21lIHByb2JsZW0gYWNjZXNzaW5nIGZpbGVzLCAyIGlmIHRoZXJlCi13YXMgYSBzeW50YXggcHJvYmxlbSB3aXRoIHRoZSBjb21tYW5kIGxpbmUsIDMgaWYgdGhlIHBhc3N3b3JkIHdhcwotZW50ZXJlZCBpbnRlcmFjdGl2ZWx5IGFuZCB0aGUgdmVyaWZpY2F0aW9uIGVudHJ5IGRpZG4ndCBtYXRjaCwgNCBpZgotaXRzIG9wZXJhdGlvbiB3YXMgaW50ZXJydXB0ZWQsIDUgaWYgYSB2YWx1ZSBpcyB0b28gbG9uZyAodXNlcm5hbWUsCi1maWxlbmFtZSwgcGFzc3dvcmQsIG9yIGZpbmFsIGNvbXB1dGVkIHJlY29yZCksIGFuZCA2IGlmIHRoZSB1c2VybmFtZQotY29udGFpbnMgaWxsZWdhbCBjaGFyYWN0ZXJzIChzZWUgdGhlIFxmQlJFU1RSSUNUSU9OU1xmUCBzZWN0aW9uKS4KLS5TSCBFWEFNUExFUwotXGZCaHRwYXNzd2QgL3Vzci9sb2NhbC9ldGMvYXBhY2hlLy5odHBhc3N3ZC11c2VycyBqc21pdGhcZlAKLS5JUAotQWRkcyBvciBtb2RpZmllcyB0aGUgcGFzc3dvcmQgZm9yIHVzZXIgXGZJanNtaXRoXGZQLiAgCi1UaGUgdXNlciBpcyBwcm9tcHRlZCBmb3IgdGhlIHBhc3N3b3JkLiAgSWYgZXhlY3V0ZWQKLW9uIGEgV2luZG93cyBzeXN0ZW0sIHRoZSBwYXNzd29yZCB3aWxsIGJlIGVuY3J5cHRlZCB1c2luZyB0aGUKLW1vZGlmaWVkIEFwYWNoZSBNRDUgYWxnb3JpdGhtOyBvdGhlcndpc2UsIHRoZSBzeXN0ZW0ncwotXGZJY3J5cHQoKVxmUCByb3V0aW5lIHdpbGwgYmUgdXNlZC4gIElmIHRoZSBmaWxlIGRvZXMgbm90Ci1leGlzdCwgCi0uQiBodHBhc3N3ZAotd2lsbCBkbyBub3RoaW5nIGV4Y2VwdCByZXR1cm4gYW4gZXJyb3IuCi0uTFAKLVxmQmh0cGFzc3dkIC1jIC9ob21lL2RvZS9wdWJsaWNfaHRtbC8uaHRwYXNzd2QgamFuZVxmUAotLklQCi1DcmVhdGVzIGEgbmV3IGZpbGUgYW5kIHN0b3JlcyBhIHJlY29yZCBpbiBpdCBmb3IgdXNlciBcZklqYW5lXGZQLgotVGhlIHVzZXIgaXMgcHJvbXB0ZWQgZm9yIHRoZSBwYXNzd29yZC4KLUlmIHRoZSBmaWxlIGV4aXN0cyBhbmQgY2Fubm90IGJlIHJlYWQsIG9yIGNhbm5vdCBiZSB3cml0dGVuLAotaXQgaXMgbm90IGFsdGVyZWQgYW5kCi0uQiBodHBhc3N3ZAotd2lsbCBkaXNwbGF5IGEgbWVzc2FnZSBhbmQgcmV0dXJuIGFuIGVycm9yIHN0YXR1cy4KLS5MUAotXGZCaHRwYXNzd2QgLW1iIC91c3Ivd2ViLy5odHBhc3N3ZC1hbGwgam9uZXMgUHdkNFN0ZXZlXGZQCi0uSVAKLUVuY3J5cHRzIHRoZSBwYXNzd29yZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKFxmSVB3ZDRTdGV2ZVxmUCkgdXNpbmcKLXRoZSBNRDUgYWxnb3JpdGhtLCBhbmQgc3RvcmVzIGl0IGluIHRoZSBzcGVjaWZpZWQgZmlsZS4KLS5MUAotLlNIIFNFQ1VSSVRZIENPTlNJREVSQVRJT05TCi1XZWIgcGFzc3dvcmQgZmlsZXMgc3VjaCBhcyB0aG9zZSBtYW5hZ2VkIGJ5Ci0uQiBodHBhc3N3ZAotc2hvdWxkIFxmQm5vdFxmUCBiZSB3aXRoaW4gdGhlIFdlYiBzZXJ2ZXIncyBVUkkgc3BhY2UgLS0gdGhhdCBpcywKLXRoZXkgc2hvdWxkIG5vdCBiZSBmZXRjaGFibGUgd2l0aCBhIGJyb3dzZXIuCi0uUFAKLVRoZSB1c2Ugb2YgdGhlIFxmSS1iXGZQIG9wdGlvbiBpcyBkaXNjb3VyYWdlZCwgc2luY2Ugd2hlbiBpdCBpcwotdXNlZCB0aGUgdW5lbmNyeXB0ZWQgcGFzc3dvcmQgYXBwZWFycyBvbiB0aGUgY29tbWFuZCBsaW5lLgotLlNIIFJFU1RSSUNUSU9OUwotT24gdGhlIFdpbmRvd3MgYW5kIE1QRSBwbGF0Zm9ybXMsIHBhc3N3b3JkcyBlbmNyeXB0ZWQgd2l0aAotLkIgaHRwYXNzd2QKLWFyZSBsaW1pdGVkIHRvIG5vIG1vcmUgdGhhbiAyNTUgY2hhcmFjdGVycyBpbiBsZW5ndGguICBMb25nZXIKLXBhc3N3b3JkcyB3aWxsIGJlIHRydW5jYXRlZCB0byAyNTUgY2hhcmFjdGVycy4KLS5QUAotVGhlIE1ENSBhbGdvcml0aG0gdXNlZCBieQotLkIgaHRwYXNzd2QKLWlzIHNwZWNpZmljIHRvIHRoZSBBcGFjaGUgc29mdHdhcmU7IHBhc3N3b3JkcyBlbmNyeXB0ZWQgdXNpbmcgaXQgd2lsbCBub3QgYmUKLXVzYWJsZSB3aXRoIG90aGVyIFdlYiBzZXJ2ZXJzLgotLlBQCi1Vc2VybmFtZXMgYXJlIGxpbWl0ZWQgdG8gMjU1IGJ5dGVzIGFuZCBtYXkgbm90IGluY2x1ZGUgdGhlIGNoYXJhY3RlciAnOicuCi0uU0ggU0VFIEFMU08KLS5CUiBodHRwZCg4KQotYW5kIHRoZSBzY3JpcHRzIGluIHN1cHBvcnQvU0hBMSB3aGljaCBjb21lIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KZGlmZiAtLWdpdCBhL2RvY3MvbWFuL2h0dHBkLjggYi9kb2NzL21hbi9odHRwZC44CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTMyMGJhLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFuL2h0dHBkLjgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLlRIIGh0dHBkIDggIkZlYnJ1YXJ5IDE5OTciCi0uXCIgQ29weXJpZ2h0IChjKSAxOTk1LTE5OTcgRGF2aWQgUm9iaW5zb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0uXCIgQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5cIgotLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotLlwiIGFyZSBtZXQ6Ci0uXCIKLS5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0uXCIKLS5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotLlwiICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS5cIiAgICBkaXN0cmlidXRpb24uCi0uXCIKLS5cIiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLS5cIiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLS5cIiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0uXCIgICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLS5cIgotLlwiIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLS5cIiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotLlwiICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLS5cIiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLS5cIgotLlwiIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0uXCIgICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0uXCIgICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotLlwiCi0uXCIgNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotLlwiICAgIGFja25vd2xlZGdtZW50OgotLlwiICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLS5cIiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotLlwiCi0uXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0uXCIgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotLlwiIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0uXCIgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLlwiIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotLlwiIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotLlwiIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0uXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotLlwiIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLS5cIiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0uXCIgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLlwiID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0uXCIKLS5cIiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotLlwiIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotLlwiIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotLlwiIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLS5cIiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0uXCIgcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0uU0ggTkFNRQotaHR0cGQgXC0gQXBhY2hlIGh5cGVydGV4dCB0cmFuc2ZlciBwcm90b2NvbCBzZXJ2ZXIKLS5TSCBTWU5PUFNJUwotLkIgaHR0cGQgCi1bCi0uQiBcLVgKLV0gWwotLkJJIFwtUiAiIGxpYmV4ZWNkaXIiCi1dIFsKLS5CSSBcLWQgIiBzZXJ2ZXJyb290IgotXSBbCi0uQkkgXC1mICIgY29uZmlnIgotXSBbCi0uQkkgXC1DICIgZGlyZWN0aXZlIgotXSBbCi0uQkkgXC1jICIgZGlyZWN0aXZlIgotXSBbCi0uQkkgXC1EICIgcGFyYW1ldGVyIgotXQotCi0uQiBodHRwZCAKLVsKLS5CIFwtaAotXSAKLVsKLS5CIFwtbAotXSAKLVsKLS5CIFwtTAotXSAKLVsKLS5CIFwtdgotXSAKLVsKLS5CIFwtVgotXSAKLVsKLS5CIFwtUwotXSAKLVsKLS5CIFwtdAotXSAKLVsKLS5CIFwtVAotXQotCi0uU0ggREVTQ1JJUFRJT04KLS5CIGh0dHBkCi1pcyB0aGUgQXBhY2hlIEh5cGVyVGV4dCBUcmFuc2ZlciBQcm90b2NvbCAoSFRUUCkgc2VydmVyIHByb2dyYW0uIEl0IGlzCi1kZXNpZ25lZCB0byBiZSBydW4gYXMgYSBzdGFuZGFsb25lIGRhZW1vbiBwcm9jZXNzLiBXaGVuIHVzZWQgbGlrZSB0aGlzCi1pdCB3aWxsIGNyZWF0ZSBhIHBvb2wgb2YgY2hpbGQgcHJvY2Vzc2VzIHRvIGhhbmRsZSByZXF1ZXN0cy4gVG8gc3RvcAotaXQsIHNlbmQgYSBURVJNIHNpZ25hbCB0byB0aGUgaW5pdGlhbCAocGFyZW50KSBwcm9jZXNzLiBUaGUgUElEIG9mCi10aGlzIHByb2Nlc3MgaXMgd3JpdHRlbiB0byBhIGZpbGUgYXMgZ2l2ZW4gaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLUFsdGVybmF0aXZlbHkgCi0uQiBodHRwZCAKLW1heSBiZSBpbnZva2VkIGJ5IHRoZSBJbnRlcm5ldCBkYWVtb24gaW5ldGQoOCkgZWFjaAotdGltZSBhIGNvbm5lY3Rpb24gdG8gdGhlIEhUVFAgc2VydmljZSBpcyBtYWRlLgotLlBQCi1UaGlzIG1hbnVhbCBwYWdlIG9ubHkgbGlzdHMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuIEZvciBkZXRhaWxzCi1vZiB0aGUgZGlyZWN0aXZlcyBuZWNlc3NhcnkgdG8gY29uZmlndXJlIAotLkIgaHR0cGQKLXNlZSB0aGUgQXBhY2hlIG1hbnVhbCwKLXdoaWNoIGlzIHBhcnQgb2YgdGhlIEFwYWNoZSBkaXN0cmlidXRpb24gb3IgY2FuIGJlIGZvdW5kIGF0Ci1odHRwOi8vd3d3LmFwYWNoZS5vcmcvLiBQYXRocyBpbiB0aGlzIG1hbnVhbCBtYXkgbm90IHJlZmxlY3QgdGhvc2UKLWNvbXBpbGVkIGludG8gCi0uQiBodHRwZC4KLS5TSCBPUFRJT05TCi0uVFAgMTIKLS5CSSBcLVIgIiBsaWJleGVjZGlyIgotVGhpcyBvcHRpb24gaXMgb25seSBhdmFpbGFibGUgaWYgQXBhY2hlIHdhcyBidWlsdCB3aXRoCi10aGUgCi0uSSBTSEFSRURfQ09SRQotcnVsZSBlbmFibGVkIHdoaWNoIGZvcmNlcyB0aGUgQXBhY2hlIGNvcmUgY29kZSB0byBiZQotcGxhY2VkIGludG8gYSBkeW5hbWljIHNoYXJlZCBvYmplY3QgKERTTykgZmlsZS4gVGhpcyBmaWxlCi1pcyBzZWFyY2hlZCBpbiBhIGhhcmRjb2RlZCBwYXRoIHVuZGVyIFNlcnZlclJvb3QgcGVyIGRlZmF1bHQuIFVzZSB0aGlzCi1vcHRpb24gaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgaXQuCi0uVFAgMTIKLS5CSSBcLWQgIiBzZXJ2ZXJyb290IgotU2V0IHRoZSBpbml0aWFsIHZhbHVlIGZvciB0aGUgU2VydmVyUm9vdCBkaXJlY3RpdmUgdG8gXGZJc2VydmVycm9vdFxmUC4gVGhpcwotY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIFNlcnZlclJvb3QgY29tbWFuZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiBUaGUKLWRlZmF1bHQgaXMgXGZCL3Vzci9sb2NhbC9hcGFjaGVcZlAuCi0uVFAKLS5CSSBcLWYgIiBjb25maWciCi1FeGVjdXRlIHRoZSBjb21tYW5kcyBpbiB0aGUgZmlsZSBcZkljb25maWdcZlAgb24gc3RhcnR1cC4gSWYgXGZJY29uZmlnXGZQCi1kb2VzIG5vdCBiZWdpbiB3aXRoIGEgLywgdGhlbiBpdCBpcyB0YWtlbiB0byBiZSBhIHBhdGggcmVsYXRpdmUgdG8KLXRoZSBTZXJ2ZXJSb290LiBUaGUgZGVmYXVsdCBpcyBcZkJjb25mL2h0dHBkLmNvbmZcZlAuCi0uVFAKLS5CSSBcLUMgIiBkaXJlY3RpdmUiCi1Qcm9jZXNzIHRoZSBjb25maWd1cmF0aW9uIFxmSWRpcmVjdGl2ZVxmUCBiZWZvcmUgcmVhZGluZyBjb25maWcgZmlsZXMuCi0uVFAKLS5CSSBcLWMgIiBkaXJlY3RpdmUiCi1Qcm9jZXNzIHRoZSBjb25maWd1cmF0aW9uIFxmSWRpcmVjdGl2ZVxmUCBhZnRlciByZWFkaW5nIGNvbmZpZyBmaWxlcy4KLS5UUAotLkJJIFwtRCAiIHBhcmFtZXRlciIKLVNldHMgYSBjb25maWd1cmF0aW9uIFxmSXBhcmFtZXRlclxmUCB3aGljaCBjYW4gYmUgdXNlZCB3aXRoCi08SWZEZWZpbmU+Li4uPC9JZkRlZmluZT4gc2VjdGlvbnMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMKLXRvIGNvbmRpdGlvbmFsbHkgc2tpcCBvciBwcm9jZXNzIGNvbW1hbmRzLgotLlRQCi0uQiBcLWgKLU91dHB1dCBhIHNob3J0IHN1bW1hcnkgb2YgYXZhaWxhYmxlIGNvbW1hbmQgbGluZSBvcHRpb25zLgotLlRQCi0uQiBcLWwKLU91dHB1dCBhIGxpc3Qgb2YgbW9kdWxlcyBjb21waWxlZCBpbnRvIHRoZSBzZXJ2ZXIuCi0uVFAKLS5CIFwtTAotT3V0cHV0IGEgbGlzdCBvZiBkaXJlY3RpdmVzIHRvZ2V0aGVyIHdpdGggZXhwZWN0ZWQgYXJndW1lbnRzIGFuZAotcGxhY2VzIHdoZXJlIHRoZSBkaXJlY3RpdmUgaXMgdmFsaWQuCi0uVFAKLS5CIFwtUwotU2hvdyB0aGUgc2V0dGluZ3MgYXMgcGFyc2VkIGZyb20gdGhlIGNvbmZpZyBmaWxlIChjdXJyZW50bHkgb25seSBzaG93cyB0aGUKLXZpcnR1YWxob3N0IHNldHRpbmdzKS4KLS5UUAotLkIgXC10Ci1SdW4gc3ludGF4IHRlc3RzIGZvciBjb25maWd1cmF0aW9uIGZpbGVzIG9ubHkuIFRoZSBwcm9ncmFtIGltbWVkaWF0ZWx5IGV4aXRzCi1hZnRlciB0aGVzZSBzeW50YXggcGFyc2luZyB3aXRoIGVpdGhlciBhIHJldHVybiBjb2RlIG9mIDAgKFN5bnRheCBPSykgb3IKLXJldHVybiBjb2RlIG5vdCBlcXVhbCB0byAwIChTeW50YXggRXJyb3IpLgotLlRQCi0uQiBcLVQKLVNhbWUgYXMgb3B0aW9uIAotLkIgXC10Ci1idXQgZG9lcyBub3QgY2hlY2sgdGhlIGNvbmZpZ3VyZWQgZG9jdW1lbnQgcm9vdHMuIAotLlRQCi0uQiBcLVgKLVJ1biBpbiBzaW5nbGUtcHJvY2VzcyBtb2RlLCBmb3IgaW50ZXJuYWwgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHk7IHRoZSBkYWVtb24KLWRvZXMgbm90IGRldGFjaCBmcm9tIHRoZSB0ZXJtaW5hbCBvciBmb3JrIGFueSBjaGlsZHJlbi4gRG8gTk9UIHVzZSB0aGlzIG1vZGUKLXRvIHByb3ZpZGUgb3JkaW5hcnkgd2ViIHNlcnZpY2UuCi0uVFAKLS5CIFwtdgotUHJpbnQgdGhlIHZlcnNpb24gb2YgCi0uQiBodHRwZAotLCBhbmQgdGhlbiBleGl0LgotLlRQCi0uQiBcLVYKLVByaW50IHRoZSB2ZXJzaW9uIGFuZCBidWlsZCBwYXJhbWV0ZXJzIG9mIAotLkIgaHR0cGQKLSwgYW5kIHRoZW4gZXhpdC4KLS5TSCBGSUxFUwotLlBEIDAKLS5CIC91c3IvbG9jYWwvYXBhY2hlL2NvbmYvaHR0cGQuY29uZgotLmJyCi0uQiAvdXNyL2xvY2FsL2FwYWNoZS9jb25mL3NybS5jb25mCi0uYnIKLS5CIC91c3IvbG9jYWwvYXBhY2hlL2NvbmYvYWNjZXNzLmNvbmYKLS5icgotLkIgL3Vzci9sb2NhbC9hcGFjaGUvY29uZi9taW1lLnR5cGVzCi0uYnIKLS5CIC91c3IvbG9jYWwvYXBhY2hlL2NvbmYvbWFnaWMKLS5icgotLkIgL3Vzci9sb2NhbC9hcGFjaGUvbG9ncy9lcnJvcl9sb2cKLS5icgotLkIgL3Vzci9sb2NhbC9hcGFjaGUvbG9ncy9hY2Nlc3NfbG9nCi0uYnIKLS5CIC91c3IvbG9jYWwvYXBhY2hlL2xvZ3MvaHR0cGQucGlkCi0uUEQKLS5TSCBTRUUgQUxTTwotLkJSIGluZXRkICg4KS4KZGlmZiAtLWdpdCBhL2RvY3MvbWFuL2xvZ3Jlc29sdmUuOCBiL2RvY3MvbWFuL2xvZ3Jlc29sdmUuOApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg1MTI2OS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbi9sb2dyZXNvbHZlLjgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0uVEggbG9ncmVzb2x2ZSA4ICJNYXJjaCAxOTk4IgotLlwiIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0uXCIKLS5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLS5cIiBhcmUgbWV0OgotLlwiCi0uXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotLlwiCi0uXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLS5cIiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0uXCIgICAgZGlzdHJpYnV0aW9uLgotLlwiCi0uXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0uXCIgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0uXCIgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotLlwiICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0uXCIKLS5cIiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0uXCIgICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLS5cIiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0uXCIKLS5cIiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotLlwiICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotLlwiICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLS5cIgotLlwiIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLS5cIiAgICBhY2tub3dsZWRnbWVudDoKLS5cIiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0uXCIgICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLS5cIgotLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotLlwiIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLS5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLS5cIiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotLlwiIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS5cIiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLS5cIiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLS5cIiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLS5cIiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0uXCIgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotLlwiIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS5cIiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLlwiCi0uXCIgVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLS5cIiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLS5cIiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLS5cIiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0uXCIgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotLlwiIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotLlNIIE5BTUUKLWxvZ3Jlc29sdmUgXC0gcmVzb2x2ZSBob3N0bmFtZXMgZm9yIElQLWFkcmVzc2VzIGluIEFwYWNoZSBsb2dmaWxlcwotLlNIIFNZTk9QU0lTCi0uQiBsb2dyZXNvbHZlCi1bCi0uQkkgXC1zICIgZmlsZW5hbWUiCi1dIFsKLS5CIFwtYwotXSA8IAotLkkgYWNjZXNzX2xvZwotPgotLkkgYWNjZXNzX2xvZy5uZXcKLS5QUAotLlNIIERFU0NSSVBUSU9OCi0uQiBsb2dyZXNvbHZlCi1pcyBhIHBvc3QtcHJvY2Vzc2luZyBwcm9ncmFtIHRvIHJlc29sdmUgSVAtYWRyZXNzZXMgaW4gQXBhY2hlJ3MgYWNjZXNzCi1sb2dmaWxlcy4gIFRvIG1pbmltaXplIGltcGFjdCBvbiB5b3VyIG5hbWVzZXJ2ZXIsIGxvZ3Jlc29sdmUgaGFzIGl0cyB2ZXJ5IG93bgotaW50ZXJuYWwgaGFzaC10YWJsZSBjYWNoZS4gVGhpcyBtZWFucyB0aGF0IGVhY2ggSVAgbnVtYmVyIHdpbGwgb25seSBiZSBsb29rZWQKLXVwIHRoZSBmaXJzdCB0aW1lIGl0IGlzIGZvdW5kIGluIHRoZSBsb2cgZmlsZS4KLS5TSCBPUFRJT05TCi0uVFAgMTIKLS5CSSBcLXMgIiBmaWxlbmFtZSIKLVNwZWNpZmllcyBhIGZpbGVuYW1lIHRvIHJlY29yZCBzdGF0aXN0aWNzLgotLlRQIDEyCi0uQiBcLWMgCi1UaGlzIGNhdXNlcyAKLS5CIGxvZ3Jlc29sdmUgCi10byBhcHBseSBzb21lIEROUyBjaGVja3M6IGFmdGVyIGZpbmRpbmcgdGhlIGhvc3RuYW1lIGZyb20gdGhlIElQIGFkZHJlc3MsIGl0Ci1sb29rcyB1cCB0aGUgSVAgYWRkcmVzc2VzIGZvciB0aGUgaG9zdG5hbWUgYW5kIGNoZWNrcyB0aGF0IG9uZSBvZiB0aGVzZQotbWF0Y2hlcyB0aGUgb3JpZ2luYWwgYWRkcmVzcy4KLS5QRAotLlNIIFNFRSBBTFNPCi0uQlIgaHR0cGQoOCkKLS4KZGlmZiAtLWdpdCBhL2RvY3MvbWFuL3JvdGF0ZWxvZ3MuOCBiL2RvY3MvbWFuL3JvdGF0ZWxvZ3MuOApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVlMDJlMS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbi9yb3RhdGVsb2dzLjgKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0uVEggcm90YXRlbG9ncyA4ICJNYXJjaCAxOTk4IgotLlwiIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0uXCIKLS5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLS5cIiBhcmUgbWV0OgotLlwiCi0uXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotLlwiCi0uXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLS5cIiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0uXCIgICAgZGlzdHJpYnV0aW9uLgotLlwiCi0uXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0uXCIgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0uXCIgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotLlwiICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0uXCIKLS5cIiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0uXCIgICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLS5cIiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0uXCIKLS5cIiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotLlwiICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotLlwiICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLS5cIgotLlwiIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLS5cIiAgICBhY2tub3dsZWRnbWVudDoKLS5cIiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0uXCIgICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLS5cIgotLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotLlwiIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLS5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLS5cIiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotLlwiIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS5cIiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLS5cIiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLS5cIiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLS5cIiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0uXCIgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotLlwiIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS5cIiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLlwiCi0uXCIgVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLS5cIiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLS5cIiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLS5cIiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0uXCIgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotLlwiIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotLlNIIE5BTUUKLXJvdGF0ZWxvZ3MgXC0gcm90YXRlIEFwYWNoZSBsb2dzIHdpdGhvdXQgaGF2aW5nIHRvIGtpbGwgdGhlIHNlcnZlcgotLlNIIFNZTk9QU0lTCi0uQiByb3RhdGVsb2dzCi0uSSBsb2dmaWxlCi0uSSByb3RhdGlvbnRpbWUKLS5QUAotLlNIIERFU0NSSVBUSU9OCi0uQiByb3RhdGVsb2dzCi1pcyBhIHNpbXBsZSBwcm9ncmFtIGZvciB1c2UgaW4gY29uanVuY3Rpb24gd2l0aCBBcGFjaGUncyBwaXBlZCBsb2dmaWxlCi1mZWF0dXJlIHdoaWNoIGNhbiBiZSB1c2VkIGxpa2UgdGhpczoKLQotLmZpCi0gICBUcmFuc2ZlckxvZyAifHJvdGF0ZWxvZ3MgL3BhdGgvdG8vbG9ncy9hY2Nlc3NfbG9nIDg2NDAwIgotLm1mCi0KLVRoaXMgY3JlYXRlcyB0aGUgZmlsZXMgL3BhdGgvdG8vbG9ncy9hY2Nlc3NfbG9nLm5ubm4gd2hlcmUgbm5ubiBpcyB0aGUgc3lzdGVtCi10aW1lIGF0IHdoaWNoIHRoZSBsb2cgbm9taW5hbGx5IHN0YXJ0cyAodGhpcyB0aW1lIHdpbGwgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YKLXRoZSByb3RhdGlvbiB0aW1lLCBzbyB5b3UgY2FuIHN5bmNocm9uaXplIGNyb24gc2NyaXB0cyB3aXRoIGl0KS4gIEF0IHRoZSBlbmQKLW9mIGVhY2ggcm90YXRpb24gdGltZSAoaGVyZSBhZnRlciAyNCBob3VycykgYSBuZXcgbG9nIGlzIHN0YXJ0ZWQuCi0uU0ggT1BUSU9OUwotLklQIFxmQlxmSWxvZ2ZpbGVcZlAKLVRoZSBwYXRoIHBsdXMgYmFzZW5hbWUgb2YgdGhlIGxvZ2ZpbGUuIFRoZSBzdWZmaXggLm5ubm4gaXMgYXV0b21hdGljYWxseQotYWRkZWQuCi0uSVAgXGZCXGZJcm90YXRpb250aW1lXGZQCi1UaGUgcm90YXRpb24gdGltZSBpbiBzZWNvbmRzLgotLlBECi0uU0ggU0VFIEFMU08KLS5CUiBodHRwZCg4KQotLgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW4vc3VleGVjLjggYi9kb2NzL21hbi9zdWV4ZWMuOApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAxZDdhYi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbi9zdWV4ZWMuOAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS5USCBzdWV4ZWMgOCAiTWFyY2ggMTk5OCIKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLlwiCi0uXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0uXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0uXCIgYXJlIG1ldDoKLS5cIgotLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLS5cIgotLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0uXCIgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLlwiICAgIGRpc3RyaWJ1dGlvbi4KLS5cIgotLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotLlwiICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotLlwiICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLS5cIiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotLlwiCi0uXCIgNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotLlwiICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0uXCIgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLlwiCi0uXCIgNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLS5cIiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLS5cIiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0uXCIKLS5cIiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0uXCIgICAgYWNrbm93bGVkZ21lbnQ6Ci0uXCIgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotLlwiICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0uXCIKLS5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLS5cIiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0uXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0uXCIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLS5cIiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0uXCIgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0uXCIgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0uXCIgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLS5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0uXCIgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotLlwiIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLS5cIiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0uXCIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS5cIgotLlwiIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0uXCIgaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0uXCIgb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0uXCIgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotLlwiIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLS5cIiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLS5TSCBOQU1FCi1zdWV4ZWMgXC0gU3dpdGNoIFVzZXIgRm9yIEV4ZWMKLS5TSCBTWU5PUFNJUwotTm8gc3lub3BzaXMgZm9yIHVzYWdlLCBiZWNhdXNlIHRoaXMgcHJvZ3JhbQotaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IEFwYWNoZSBvbmx5LiAKLS5QUAotLlNIIERFU0NSSVBUSU9OCi0uQiBzdWV4ZWMKLWlzIHRoZSAid3JhcHBlciIgc3VwcG9ydCBwcm9ncmFtIGZvciB0aGUgc3VFWEVDIGJlaGF2aW91ciBmb3IgQXBhY2hlLgotSXQgaXMgcnVuIGZyb20gd2l0aGluIEFwYWNoZSBhdXRvbWF0aWNhbGx5IHRvIHN3aXRjaCB0aGUgdXNlciB3aGVuCi1hbiBleHRlcm5hbCBwcm9ncmFtIGhhcyB0byBiZSBydW4gdW5kZXIgYSBkaWZmZXJlbnQgdXNlci4gRm9yIG1vcmUKLWluZm9ybWF0aW9uIGFib3V0IHN1RVhFQyBzZWUgdGhlIGRvY3VtZW50IGBBcGFjaGUgc3VFWEVDIFN1cHBvcnQnCi11bmRlciBodHRwOi8vd3d3LmFwYWNoZS5vcmcvZG9jcy9zdWV4ZWMuaHRtbCAuCi0uUEQKLS5TSCBTRUUgQUxTTwotLkJSIGh0dHBkKDgpCi0uCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9MSUNFTlNFIGIvZG9jcy9tYW51YWwvTElDRU5TRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzMDUzYS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9MSUNFTlNFCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotCi1BcGFjaGUgaHR0cGQgbGljZW5zZQotID09PT09PT09PT09PT09PT09PT09Ci0KLQotVGhpcyBpcyB0aGUgbGljZW5zZSBmb3IgdGhlIEFwYWNoZSBTZXJ2ZXIuIEl0IGNvdmVycyBhbGwgdGhlCi1maWxlcyB3aGljaCBjb21lIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgc2hvdWxkIG5ldmVyIGJlIHJlbW92ZWQuCi0KLVRoZSAiQXBhY2hlIEdyb3VwIiBoYXMgYmFzZWQgdGhpcyBzZXJ2ZXIsIGNhbGxlZCAiQXBhY2hlIiwgb24KLXB1YmxpYyBkb21haW4gY29kZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgbmFtZSAiTkNTQSBodHRwZCAxLjMiLgotCi1OQ1NBIGh0dHBkIDEuMyB3YXMgcGxhY2VkIGluIHRoZSBwdWJsaWMgZG9tYWluIGJ5IHRoZSBOYXRpb25hbCBDZW50ZXIgCi1mb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zIGF0IHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIAotYXQgVXJiYW5hLUNoYW1wYWlnbi4KLQotQXMgcmVxdWVzdGVkIGJ5IE5DU0Egd2UgYWNrbm93bGVkZ2UsCi0KLSAgIlBvcnRpb25zIGRldmVsb3BlZCBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZwotICAgQXBwbGljYXRpb25zIGF0IHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24uIgotCi1Db3B5cmlnaHQgb24gdGhlIHNlY3Rpb25zIG9mIGNvZGUgYWRkZWQgYnkgdGhlICJBcGFjaGUgR3JvdXAiIGJlbG9uZwotdG8gdGhlICJBcGFjaGUgR3JvdXAiIGFuZC9vciB0aGUgb3JpZ2luYWwgYXV0aG9ycy4gVGhlICJBcGFjaGUgR3JvdXAiIGFuZAotYXV0aG9ycyBoZXJlYnkgZ3JhbnQgcGVybWlzc2lvbiBmb3IgdGhlaXIgY29kZSwgYWxvbmcgd2l0aCB0aGUKLXB1YmxpYyBkb21haW4gTkNTQSBjb2RlLCB0byBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgIkFwYWNoZSIgbmFtZS4KLQotUmV1c2Ugb2YgIkFwYWNoZSBHcm91cCIgY29kZSBvdXRzaWRlIG9mIHRoZSBBcGFjaGUgZGlzdHJpYnV0aW9uIHNob3VsZAotYmUgYWNrbm93bGVkZ2VkIHdpdGggdGhlIGZvbGxvd2luZyBxdW90ZWQgdGV4dCwgdG8gYmUgaW5jbHVkZWQgd2l0aCBhbnkgbmV3Ci13b3JrOwotCi0gIlBvcnRpb25zIGRldmVsb3BlZCBieSB0aGUgIkFwYWNoZSBHcm91cCIsIHRha2VuIHdpdGggcGVybWlzc2lvbiAKLSAgICBmcm9tIHRoZSBBcGFjaGUgU2VydmVyICAgaHR0cDovL3d3dy5oeXBlcnJlYWwuY29tL2FwYWNoZS8gICAiCi0KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byBhbnlvbmUgdG8gcmVkaXN0cmlidXRlIEFwYWNoZSB1bmRlcgotdGhlICJBcGFjaGUiIG5hbWUuIFdlIGRvIG5vdCBncmFudCBwZXJtaXNzaW9uIGZvciB0aGUgcmVzYWxlIG9mIEFwYWNoZSwgYnV0Ci13ZSBkbyBncmFudCBwZXJtaXNzaW9uIGZvciB2ZW5kb3JzIHRvIGJ1bmRsZSBBcGFjaGUgZnJlZSB3aXRoIG90aGVyIHNvZnR3YXJlLAotb3IgdG8gY2hhcmdlIGEgcmVhc29uYWJsZSBwcmljZSBmb3IgcmVkaXN0cmlidXRpb24sIHByb3ZpZGVkIGl0IGlzIG1hZGUKLWNsZWFyIHRoYXQgQXBhY2hlIGlzIGZyZWUuIFBlcm1pc3Npb24gaXMgYWxzbyBncmFudGVkIGZvciB2ZW5kb3JzIHRvIAotc2VsbCBzdXBwb3J0IGZvciBmb3IgQXBhY2hlLiBXZSBleHBsaWNpdGx5IGZvcmJpZCB0aGUgcmVkaXN0cmlidXRpb24gb2YgCi1BcGFjaGUgdW5kZXIgYW55IG90aGVyIG5hbWUuCi0KLVRoZSAiQXBhY2hlIEdyb3VwIiBtYWtlcyBubyBwcm9taXNlcyB0byBzdXBwb3J0ICJBcGFjaGUiLiBVc2VycyBhbmQKLXNlbGxlcnMgb2YgQXBhY2hlIHN1cHBvcnQsIGFuZCB1c2VycyBvZiAiQXBhY2hlIEdyb3VwIiBjb2RlLCBzaG91bGQgYmUgCi1hd2FyZSB0aGF0IHRoZXkgdXNlICJBcGFjaGUiIG9yIHBvcnRpb25zIG9mIHRoZSAiQXBhY2hlIEdyb3VwIiBjb2RlIGF0IAotdGhlaXIgb3duIHJpc2suIFdoaWxlIGV2ZXJ5IGVmZm9ydCBoYXMgYmVlbiBtYWRlIHRvIGVuc3VyZSB0aGF0ICJBcGFjaGUiCi1pcyByb2J1c3QgYW5kIHNhZmUgdG8gdXNlLCB3ZSB3aWxsIG5vdCBhY2NlcHQgcmVzcG9uc2liaWxpdHkgZm9yIGFueQotZGFtYWdlIGNhdXNlZCwgb3IgbG9zcyBvZiBkYXRhIG9yIGluY29tZSB3aGljaCByZXN1bHRzIGZyb20gaXRzIHVzZS4KLQotCi0KLUFwYWNoZSBodHRwZCBzZXJ2ZXIgKGMpIDE5OTUgVGhlIEFwYWNoZSBHcm91cC4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2JpbmQuaHRtbCBiL2RvY3MvbWFudWFsL2JpbmQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc3Zjc5Ni4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9iaW5kLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPGh0bWw+PGhlYWQ+Ci08dGl0bGU+U2V0dGluZyB3aGljaCBhZGRyZXNzZXMgYW5kIHBvcnRzIEFwYWNoZSB1c2VzPC90aXRsZT4KLTwvaGVhZD48Ym9keT4KLQotPGltZyBzcmM9Ii4uL2ltYWdlcy9hcGFjaGVfc3ViLmdpZiIgYWx0PSIiPgotPGgxPlNldHRpbmcgd2hpY2ggYWRkcmVzc2VzIGFuZCBwb3J0cyBBcGFjaGUgdXNlczwvaDE+Ci0KLTxocj4KLQotV2hlbiBBcGFjaGUgc3RhcnRzLCBpdCBjb25uZWN0cyB0byBzb21lIHBvcnQgYW5kIGFkZHJlc3Mgb24gdGhlCi1sb2NhbCBtYWNoaW5lIGFuZCB3YWl0cyBmb3IgaW5jb21pbmcgcmVxdWVzdHMuIEJ5IGRlZmF1bHQsIGl0Ci1saXN0ZW5zIHRvIGFsbCBhZGRyZXNzZXMgb24gdGhlIG1hY2hpbmUsIGFuZCB0byB0aGUgcG9ydAotYXMgc3BlY2lmaWVkIGJ5IHRoZSA8dHQ+UG9ydDwvdHQ+IGRpcmVjdGl2ZSBpbiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24uCi1Ib3dldmVyLCBpdCBjYW4gYmUgdG9sZCB0byBsaXN0ZW4gdG8gbW9yZSB0aGUgb25lIHBvcnQsIG9yIHRvIGxpc3RlbgotdG8gb25seSBzZWxlY3RlZCBhZGRyZXNzZXMsIG9yIGEgY29tYmluYXRpb24uIFRoaXMgaXMgb2Z0ZW4gY29tYmluZWQKLXdpdGggdGhlIFZpcnR1YWwgSG9zdCBmZWF0dXJlIHdoaWNoIGRldGVybWluZXMgaG93IEFwYWNoZQotcmVzcG9uZHMgdG8gZGlmZmVyZW50IElQIGFkZHJlc3NlcywgaG9zdG5hbWVzIGFuZCBwb3J0cy48cD4KLQotVGhlcmUgYXJlIHR3byBkaXJlY3RpdmVzIHVzZWQgdG8gcmVzdHJpY3Qgb3Igc3BlY2lmeSB3aGljaCBhZGRyZXNzZXMKLWFuZCBwb3J0cyBBcGFjaGUgbGlzdGVucyB0by4KLQotPHVsPgotPGxpPjxhIGhyZWY9IiNiaW5kYWRkcmVzcyI+QmluZEFkZHJlc3M8L2E+IGlzIHVzZWQgdG8gcmVzdHJpY3QgdGhlIHNlcnZlciB0byBsaXN0ZW5pbmcgdG8KLSAgYSBzaW5nbGUgYWRkcmVzcywgYW5kIGNhbiBiZSB1c2VkIHRvIHBlcm1pdCBtdWx0aXBsZSBBcGFjaGUgc2VydmVycwotICBvbiB0aGUgc2FtZSBtYWNoaW5lIGxpc3RlbmluZyB0byBkaWZmZXJlbnQgSVAgYWRkcmVzc2VzLgotPGxpPjxhIGhyZWY9IiNsaXN0ZW4iPkxpc3RlbjwvYT4gY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHNpbmdsZSBBcGFjaGUgc2VydmVyIGxpc3RlbgotICB0byBtb3JlIHRoYW4gb25lIGFkZHJlc3MgYW5kL29yIHBvcnQuCi08L3VsPgotCi08aDM+PGEgbmFtZT0iYmluZGFkZHJlc3MiPkJpbmRBZGRyZXNzPC9hPjwvaDM+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gQmluZEFkZHJlc3MgPGVtPlsgKiB8IElQLWFkZHJlc3MgfCBob3N0bmFtZSBdPC9lbT48YnI+Ci08c3Ryb25nPkRlZmF1bHQ6PC9zdHJvbmc+IDxjb2RlPkJpbmRBZGRyZXNzICo8L2NvZGU+PGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IENvcmU8cD4KLQotTWFrZXMgdGhlIHNlcnZlciBsaXN0ZW4gdG8ganVzdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuIElmIHRoZSBhcmd1bWVudAotaXMgKiwgdGhlIHNlcnZlciBsaXN0ZW5zIHRvIGFsbCBhZGRyZXNzZXMuIFRoZSBwb3J0IGxpc3RlbmVkIHRvCi1pcyBzZXQgd2l0aCB0aGUgPHR0PlBvcnQ8L3R0PiBkaXJlY3RpdmUuIE9ubHkgb25lIEJpbmRBZGRyZXNzCi1zaG91bGQgYmUgdXNlZC4KLQotPGgzPjxhIG5hbWU9Imxpc3RlbiI+TGlzdGVuPC9hPjwvaDM+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gTGlzdGVuIDxlbT5bIHBvcnQgfCBJUC1hZGRyZXNzOnBvcnQgXTwvZW0+PGJyPgotPHN0cm9uZz5EZWZhdWx0Ojwvc3Ryb25nPiA8Y29kZT5ub25lPC9jb2RlPjxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZzxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBDb3JlPHA+Ci0KLTx0dD5MaXN0ZW48L3R0PiBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIDx0dD5CaW5kQWRkcmVzczwvdHQ+IGFuZAotPHR0PlBvcnQ8L3R0Pi4gSXQgdGVsbHMgdGhlIHNlcnZlciB0byBhY2NlcHQgaW5jb21pbmcgcmVxdWVzdHMgb24gdGhlCi1zcGVjaWZpZWQgcG9ydCBvciBhZGRyZXNzLWFuZC1wb3J0IGNvbWJpbmF0aW9uLiBJZiB0aGUgZmlyc3QgZm9ybWF0IGlzCi11c2VkLCB3aXRoIGEgcG9ydCBudW1iZXIgb25seSwgdGhlIHNlcnZlciBsaXN0ZW5zIHRvIHRoZSBnaXZlbiBwb3J0IG9uCi1hbGwgaW50ZXJmYWNlcywgaW5zdGVhZCBvZiB0aGUgcG9ydCBnaXZlbiBieSB0aGUgPHR0PlBvcnQ8L3R0PgotZGlyZWN0aXZlLiBJZiBhbiBJUCBhZGRyZXNzIGlzIGdpdmVuIGFzIHdlbGwgYXMgYSBwb3J0LCB0aGUgc2VydmVyCi13aWxsIGxpc3RlbiBvbiB0aGUgZ2l2ZW4gcG9ydCBhbmQgaW50ZXJmYWNlLiAgPHA+IE11bHRpcGxlIExpc3RlbgotZGlyZWN0aXZlcyBtYXkgYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIGFkZHJlc3NlcyBhbmQgcG9ydHMgdG8KLWxpc3RlbiB0by4gVGhlIHNlcnZlciB3aWxsIHJlc3BvbmQgdG8gcmVxdWVzdHMgZnJvbSBhbnkgb2YgdGhlIGxpc3RlZAotYWRkcmVzc2VzIGFuZCBwb3J0cy48cD4KLQotRm9yIGV4YW1wbGUsIHRvIG1ha2UgdGhlIHNlcnZlciBhY2NlcHQgY29ubmVjdGlvbnMgb24gYm90aCBwb3J0Ci04MCBhbmQgcG9ydCA4MDAwLCB1c2U6Ci08cHJlPgotICAgTGlzdGVuIDgwCi0gICBMaXN0ZW4gODAwMAotPC9wcmU+Ci0KLVRvIG1ha2UgdGhlIHNlcnZlciBhY2NlcHQgY29ubmVjdGlvbnMgb24gdHdvIHNwZWNpZmllZAotaW50ZXJmYWNlcyBhbmQgcG9ydCBudW1iZXJzLCB1c2UKLTxwcmU+Ci0gICBMaXN0ZW4gMTkyLjE3MC4yLjE6ODAKLSAgIExpc3RlbiAxOTIuMTcwLjIuNTo4MDAwCi08L3ByZT4KLQotPGgyPkhvdyB0aGlzIHdvcmtzIHdpdGggVmlydHVhbCBIb3N0czwvaDI+Ci0KLUJpbmRBZGRyZXNzIGFuZCBMaXN0ZW4gZG8gbm90IGltcGxlbWVudCBWaXJ0dWFsIEhvc3RzLiBUaGV5IHRlbGwgdGhlCi1tYWluIHNlcnZlciB3aGF0IGFkZHJlc3NlcyBhbmQgcG9ydHMgdG8gbGlzdGVuIHRvLiAgSWYgbm8KLSZsdDtWaXJ0dWFsSG9zdCZndDsgZGlyZWN0aXZlcyBhcmUgdXNlZCwgdGhlIHNlcnZlciB3aWxsIGJlaGF2ZSB0aGUKLXNhbWUgZm9yIGFsbCBhY2NlcHRlZCByZXF1ZXN0cy4gSG93ZXZlciwgJmx0O1ZpcnR1YWxIb3N0Jmd0OyBjYW4gYmUKLXVzZWQgdG8gc3BlY2lmeSBhIGRpZmZlcmVudCBiZWhhdm91ciBmb3Igb25lIG9yIG1vcmUgb2YgdGhlIGFkZHJlc3NlcwotYW5kIHBvcnRzLiBUbyBpbXBsZW1lbnQgYSBWaXJ0dWFsSG9zdCwgdGhlIHNlcnZlciBtdXN0IGZpcnN0IGJlIHRvbGQKLXRvIGxpc3RlbiB0byB0aGUgYWRkcmVzcyBhbmQgcG9ydCB0byBiZSB1c2VkLiBUaGVuIGEKLSZsdDtWaXJ0dWFsSG9zdCZndDsgc2VjdGlvbiBzaG91bGQgYmUgY3JlYXRlZCBmb3IgYSBzcGVjaWZpZWQgYWRkcmVzcwotYW5kIHBvcnQgdG8gc2V0IHRoZSBiZWhhdmlvdXIgb2YgdGhpcyB2aXJ0dWFsIGhvc3QuIE5vdGUgdGhhdCBpZiB0aGUKLSZsdDtWaXJ0dWFsSG9zdCZndDsgaXMgc2V0IGZvciBhbiBhZGRyZXNzIGFuZCBwb3J0IHRoYXQgdGhlIHNlcnZlciBpcwotbm90IGxpc3RlbmluZyB0bywgaXQgY2Fubm90IGJlIGFjY2Vzc2VkLgotCi08aDI+U2VlIGFsc288L2gyPgotCi1TZWUgYWxzbyB0aGUgZG9jdW1lbnRhdGlvbiBvbgotPGEgaHJlZj0idmlydHVhbC1ob3N0Lmh0bWwiPlZpcnR1YWwgSG9zdHM8L2E+LAotPGEgaHJlZj0iaG9zdC5odG1sIj5Ob24tSVAgdmlydHVhbCBob3N0czwvYT4sCi08YSBocmVmPSJjb3JlLmh0bWwjYmluZGFkZHJlc3MiPkJpbmRBZGRyZXNzIGRpcmVjdGl2ZTwvYT4sCi08YSBocmVmPSJjb3JlLmh0bWwjcG9ydCI+UG9ydCBkaXJlY3RpdmU8L2E+Ci1hbmQKLTxhIGhyZWY9ImNvcmUuaHRtbCN2aXJ0dWFsaG9zdCI+Jmx0O1ZpcnR1YWxIb3N0Jmd0OyBzZWN0aW9uPC9hPi4KLTwvdWw+Ci0KLTxocj4KLTxBIEhSRUY9Ii4uLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfaG9tZS5naWYiIEFMVD0iSG9tZSI+PC9BPgotPEEgSFJFRj0iLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2luZGV4LmdpZiIgQUxUPSJJbmRleCI+PC9BPgotCi08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2JpbmQuaHRtbC5lbiBiL2RvY3MvbWFudWFsL2JpbmQuaHRtbC5lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc3Zjc5Ni4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9iaW5kLmh0bWwuZW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPGh0bWw+PGhlYWQ+Ci08dGl0bGU+U2V0dGluZyB3aGljaCBhZGRyZXNzZXMgYW5kIHBvcnRzIEFwYWNoZSB1c2VzPC90aXRsZT4KLTwvaGVhZD48Ym9keT4KLQotPGltZyBzcmM9Ii4uL2ltYWdlcy9hcGFjaGVfc3ViLmdpZiIgYWx0PSIiPgotPGgxPlNldHRpbmcgd2hpY2ggYWRkcmVzc2VzIGFuZCBwb3J0cyBBcGFjaGUgdXNlczwvaDE+Ci0KLTxocj4KLQotV2hlbiBBcGFjaGUgc3RhcnRzLCBpdCBjb25uZWN0cyB0byBzb21lIHBvcnQgYW5kIGFkZHJlc3Mgb24gdGhlCi1sb2NhbCBtYWNoaW5lIGFuZCB3YWl0cyBmb3IgaW5jb21pbmcgcmVxdWVzdHMuIEJ5IGRlZmF1bHQsIGl0Ci1saXN0ZW5zIHRvIGFsbCBhZGRyZXNzZXMgb24gdGhlIG1hY2hpbmUsIGFuZCB0byB0aGUgcG9ydAotYXMgc3BlY2lmaWVkIGJ5IHRoZSA8dHQ+UG9ydDwvdHQ+IGRpcmVjdGl2ZSBpbiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24uCi1Ib3dldmVyLCBpdCBjYW4gYmUgdG9sZCB0byBsaXN0ZW4gdG8gbW9yZSB0aGUgb25lIHBvcnQsIG9yIHRvIGxpc3RlbgotdG8gb25seSBzZWxlY3RlZCBhZGRyZXNzZXMsIG9yIGEgY29tYmluYXRpb24uIFRoaXMgaXMgb2Z0ZW4gY29tYmluZWQKLXdpdGggdGhlIFZpcnR1YWwgSG9zdCBmZWF0dXJlIHdoaWNoIGRldGVybWluZXMgaG93IEFwYWNoZQotcmVzcG9uZHMgdG8gZGlmZmVyZW50IElQIGFkZHJlc3NlcywgaG9zdG5hbWVzIGFuZCBwb3J0cy48cD4KLQotVGhlcmUgYXJlIHR3byBkaXJlY3RpdmVzIHVzZWQgdG8gcmVzdHJpY3Qgb3Igc3BlY2lmeSB3aGljaCBhZGRyZXNzZXMKLWFuZCBwb3J0cyBBcGFjaGUgbGlzdGVucyB0by4KLQotPHVsPgotPGxpPjxhIGhyZWY9IiNiaW5kYWRkcmVzcyI+QmluZEFkZHJlc3M8L2E+IGlzIHVzZWQgdG8gcmVzdHJpY3QgdGhlIHNlcnZlciB0byBsaXN0ZW5pbmcgdG8KLSAgYSBzaW5nbGUgYWRkcmVzcywgYW5kIGNhbiBiZSB1c2VkIHRvIHBlcm1pdCBtdWx0aXBsZSBBcGFjaGUgc2VydmVycwotICBvbiB0aGUgc2FtZSBtYWNoaW5lIGxpc3RlbmluZyB0byBkaWZmZXJlbnQgSVAgYWRkcmVzc2VzLgotPGxpPjxhIGhyZWY9IiNsaXN0ZW4iPkxpc3RlbjwvYT4gY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHNpbmdsZSBBcGFjaGUgc2VydmVyIGxpc3RlbgotICB0byBtb3JlIHRoYW4gb25lIGFkZHJlc3MgYW5kL29yIHBvcnQuCi08L3VsPgotCi08aDM+PGEgbmFtZT0iYmluZGFkZHJlc3MiPkJpbmRBZGRyZXNzPC9hPjwvaDM+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gQmluZEFkZHJlc3MgPGVtPlsgKiB8IElQLWFkZHJlc3MgfCBob3N0bmFtZSBdPC9lbT48YnI+Ci08c3Ryb25nPkRlZmF1bHQ6PC9zdHJvbmc+IDxjb2RlPkJpbmRBZGRyZXNzICo8L2NvZGU+PGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IENvcmU8cD4KLQotTWFrZXMgdGhlIHNlcnZlciBsaXN0ZW4gdG8ganVzdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuIElmIHRoZSBhcmd1bWVudAotaXMgKiwgdGhlIHNlcnZlciBsaXN0ZW5zIHRvIGFsbCBhZGRyZXNzZXMuIFRoZSBwb3J0IGxpc3RlbmVkIHRvCi1pcyBzZXQgd2l0aCB0aGUgPHR0PlBvcnQ8L3R0PiBkaXJlY3RpdmUuIE9ubHkgb25lIEJpbmRBZGRyZXNzCi1zaG91bGQgYmUgdXNlZC4KLQotPGgzPjxhIG5hbWU9Imxpc3RlbiI+TGlzdGVuPC9hPjwvaDM+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gTGlzdGVuIDxlbT5bIHBvcnQgfCBJUC1hZGRyZXNzOnBvcnQgXTwvZW0+PGJyPgotPHN0cm9uZz5EZWZhdWx0Ojwvc3Ryb25nPiA8Y29kZT5ub25lPC9jb2RlPjxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZzxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBDb3JlPHA+Ci0KLTx0dD5MaXN0ZW48L3R0PiBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIDx0dD5CaW5kQWRkcmVzczwvdHQ+IGFuZAotPHR0PlBvcnQ8L3R0Pi4gSXQgdGVsbHMgdGhlIHNlcnZlciB0byBhY2NlcHQgaW5jb21pbmcgcmVxdWVzdHMgb24gdGhlCi1zcGVjaWZpZWQgcG9ydCBvciBhZGRyZXNzLWFuZC1wb3J0IGNvbWJpbmF0aW9uLiBJZiB0aGUgZmlyc3QgZm9ybWF0IGlzCi11c2VkLCB3aXRoIGEgcG9ydCBudW1iZXIgb25seSwgdGhlIHNlcnZlciBsaXN0ZW5zIHRvIHRoZSBnaXZlbiBwb3J0IG9uCi1hbGwgaW50ZXJmYWNlcywgaW5zdGVhZCBvZiB0aGUgcG9ydCBnaXZlbiBieSB0aGUgPHR0PlBvcnQ8L3R0PgotZGlyZWN0aXZlLiBJZiBhbiBJUCBhZGRyZXNzIGlzIGdpdmVuIGFzIHdlbGwgYXMgYSBwb3J0LCB0aGUgc2VydmVyCi13aWxsIGxpc3RlbiBvbiB0aGUgZ2l2ZW4gcG9ydCBhbmQgaW50ZXJmYWNlLiAgPHA+IE11bHRpcGxlIExpc3RlbgotZGlyZWN0aXZlcyBtYXkgYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIGFkZHJlc3NlcyBhbmQgcG9ydHMgdG8KLWxpc3RlbiB0by4gVGhlIHNlcnZlciB3aWxsIHJlc3BvbmQgdG8gcmVxdWVzdHMgZnJvbSBhbnkgb2YgdGhlIGxpc3RlZAotYWRkcmVzc2VzIGFuZCBwb3J0cy48cD4KLQotRm9yIGV4YW1wbGUsIHRvIG1ha2UgdGhlIHNlcnZlciBhY2NlcHQgY29ubmVjdGlvbnMgb24gYm90aCBwb3J0Ci04MCBhbmQgcG9ydCA4MDAwLCB1c2U6Ci08cHJlPgotICAgTGlzdGVuIDgwCi0gICBMaXN0ZW4gODAwMAotPC9wcmU+Ci0KLVRvIG1ha2UgdGhlIHNlcnZlciBhY2NlcHQgY29ubmVjdGlvbnMgb24gdHdvIHNwZWNpZmllZAotaW50ZXJmYWNlcyBhbmQgcG9ydCBudW1iZXJzLCB1c2UKLTxwcmU+Ci0gICBMaXN0ZW4gMTkyLjE3MC4yLjE6ODAKLSAgIExpc3RlbiAxOTIuMTcwLjIuNTo4MDAwCi08L3ByZT4KLQotPGgyPkhvdyB0aGlzIHdvcmtzIHdpdGggVmlydHVhbCBIb3N0czwvaDI+Ci0KLUJpbmRBZGRyZXNzIGFuZCBMaXN0ZW4gZG8gbm90IGltcGxlbWVudCBWaXJ0dWFsIEhvc3RzLiBUaGV5IHRlbGwgdGhlCi1tYWluIHNlcnZlciB3aGF0IGFkZHJlc3NlcyBhbmQgcG9ydHMgdG8gbGlzdGVuIHRvLiAgSWYgbm8KLSZsdDtWaXJ0dWFsSG9zdCZndDsgZGlyZWN0aXZlcyBhcmUgdXNlZCwgdGhlIHNlcnZlciB3aWxsIGJlaGF2ZSB0aGUKLXNhbWUgZm9yIGFsbCBhY2NlcHRlZCByZXF1ZXN0cy4gSG93ZXZlciwgJmx0O1ZpcnR1YWxIb3N0Jmd0OyBjYW4gYmUKLXVzZWQgdG8gc3BlY2lmeSBhIGRpZmZlcmVudCBiZWhhdm91ciBmb3Igb25lIG9yIG1vcmUgb2YgdGhlIGFkZHJlc3NlcwotYW5kIHBvcnRzLiBUbyBpbXBsZW1lbnQgYSBWaXJ0dWFsSG9zdCwgdGhlIHNlcnZlciBtdXN0IGZpcnN0IGJlIHRvbGQKLXRvIGxpc3RlbiB0byB0aGUgYWRkcmVzcyBhbmQgcG9ydCB0byBiZSB1c2VkLiBUaGVuIGEKLSZsdDtWaXJ0dWFsSG9zdCZndDsgc2VjdGlvbiBzaG91bGQgYmUgY3JlYXRlZCBmb3IgYSBzcGVjaWZpZWQgYWRkcmVzcwotYW5kIHBvcnQgdG8gc2V0IHRoZSBiZWhhdmlvdXIgb2YgdGhpcyB2aXJ0dWFsIGhvc3QuIE5vdGUgdGhhdCBpZiB0aGUKLSZsdDtWaXJ0dWFsSG9zdCZndDsgaXMgc2V0IGZvciBhbiBhZGRyZXNzIGFuZCBwb3J0IHRoYXQgdGhlIHNlcnZlciBpcwotbm90IGxpc3RlbmluZyB0bywgaXQgY2Fubm90IGJlIGFjY2Vzc2VkLgotCi08aDI+U2VlIGFsc288L2gyPgotCi1TZWUgYWxzbyB0aGUgZG9jdW1lbnRhdGlvbiBvbgotPGEgaHJlZj0idmlydHVhbC1ob3N0Lmh0bWwiPlZpcnR1YWwgSG9zdHM8L2E+LAotPGEgaHJlZj0iaG9zdC5odG1sIj5Ob24tSVAgdmlydHVhbCBob3N0czwvYT4sCi08YSBocmVmPSJjb3JlLmh0bWwjYmluZGFkZHJlc3MiPkJpbmRBZGRyZXNzIGRpcmVjdGl2ZTwvYT4sCi08YSBocmVmPSJjb3JlLmh0bWwjcG9ydCI+UG9ydCBkaXJlY3RpdmU8L2E+Ci1hbmQKLTxhIGhyZWY9ImNvcmUuaHRtbCN2aXJ0dWFsaG9zdCI+Jmx0O1ZpcnR1YWxIb3N0Jmd0OyBzZWN0aW9uPC9hPi4KLTwvdWw+Ci0KLTxocj4KLTxBIEhSRUY9Ii4uLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfaG9tZS5naWYiIEFMVD0iSG9tZSI+PC9BPgotPEEgSFJFRj0iLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2luZGV4LmdpZiIgQUxUPSJJbmRleCI+PC9BPgotCi08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2NnaV9wYXRoLmh0bWwgYi9kb2NzL21hbnVhbC9jZ2lfcGF0aC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWJiMzE0Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2NnaV9wYXRoLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08aHRtbD48aGVhZD4KLTx0aXRsZT5QQVRIX0lORk8gQ2hhbmdlcyBpbiB0aGUgQ0dJIEVudmlyb25tZW50PC90aXRsZT4KLTwvaGVhZD48Ym9keT4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxoMT5QQVRIX0lORk8gQ2hhbmdlcyBpbiB0aGUgQ0dJIEVudmlyb25tZW50PC9oMT4KLQotPGhyPgotCi08aDI+PGEgbmFtZT0ib3ZlciI+T3ZlcnZpZXc8L2E+PC9oMj4KLQotPHA+QXMgaW1wbGVtZW50ZWQgaW4gQXBhY2hlIDEuMS4xIGFuZCBlYXJsaWVyIHZlcnNpb25zLCB0aGUgbWV0aG9kCi1BcGFjaGUgdXNlZCB0byBjcmVhdGUgUEFUSF9JTkZPIGluIHRoZSBDR0kgZW52aXJvbm1lbnQgd2FzCi1jb3VudGVyaW50aXV0aXZlLCBhbmQgY291bGQgcmVzdWx0IGluIGNyYXNoZXMgaW4gY2VydGFpbiBjYXNlcy4gSW4KLUFwYWNoZSAxLjIgYW5kIGJleW9uZCwgdGhpcyBiZWhhdmlvciBoYXMgY2hhbmdlZC4gQWx0aG91Z2ggdGhpcwotcmVzdWx0cyBpbiBzb21lIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgd2l0aCBjZXJ0YWluIGxlZ2FjeSBDR0kKLWFwcGxpY2F0aW9ucywgdGhlIEFwYWNoZSAxLjIgYmVoYXZpb3IgaXMgc3RpbGwgY29tcGF0aWJsZSB3aXRoIHRoZQotQ0dJLzEuMSBzcGVjaWZpY2F0aW9uLCBhbmQgQ0dJIHNjcmlwdHMgY2FuIGJlIGVhc2lseSBtb2RpZmllZCAoPGEKLWhyZWY9IiNjb21wYXQiPnNlZSBiZWxvdzwvYT4pLgotCi08aDI+PGEgbmFtZT0icHJvYiI+VGhlIFByb2JsZW08L2E+PC9oMj4KLQotPHA+QXBhY2hlIDEuMS4xIGFuZCBlYXJsaWVyIGltcGxlbWVudGVkIHRoZSBQQVRIX0lORk8gYW5kIFNDUklQVF9OQU1FCi1lbnZpcm9ubWVudCB2YXJpYWJsZXMgYnkgbG9va2luZyBhdCB0aGUgZmlsZW5hbWUsIG5vdCB0aGUgVVJMLiBXaGlsZQotdGhpcyByZXN1bHRlZCBpbiB0aGUgY29ycmVjdCB2YWx1ZXMgaW4gbWFueSBjYXNlcywgd2hlbiB0aGUgZmlsZXN5c3RlbQotcGF0aCB3YXMgb3ZlcmxvYWRlZCB0byBjb250YWluIHBhdGggaW5mb3JtYXRpb24sIGl0IGNvdWxkIHJlc3VsdCBpbgotZXJyYW50IGJlaGF2aW9yLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGZvbGxvd2luZyBhcHBlYXJlZCBpbiBhIGNvbmZpZwotZmlsZToKLTxwcmU+Ci0gICAgIEFsaWFzIC9jZ2ktcmFscGggL3Vzci9sb2NhbC9odHRwZC9jZ2ktYmluL3VzZXIuY2dpL3JhbHBoCi08L3ByZT4KLTxwPkluIHRoaXMgY2FzZSwgPGNvZGU+dXNlci5jZ2k8L2NvZGU+IGlzIHRoZSBDR0kgc2NyaXB0LCB0aGUgIi9yYWxwaCIKLWlzIGluZm9ybWF0aW9uIHRvIGJlIHBhc3NlZCBvbnRvIHRoZSBDR0kuIElmIHRoaXMgY29uZmlndXJhdGlvbiB3YXMgaW4KLXBsYWNlLCBhbmQgYSByZXF1ZXN0IGNhbWUgZm9yICI8Y29kZT4vY2dpLXJhbHBoL3NjcmlwdC88L2NvZGU+IiwgdGhlCi1jb2RlIHdvdWxkIHNldCBQQVRIX0lORk8gdG8gIjxjb2RlPi9yYWxwaC9zY3JpcHQ8L2NvZGU+IiwgYW5kCi1TQ1JJUFRfTkFNRSB0byAiPGNvZGU+L2NnaS08L2NvZGU+Ii4gT2J2aW91c2x5LCB0aGUgbGF0dGVyIGlzCi1pbmNvcnJlY3QuIEluIGNlcnRhaW4gY2FzZXMsIHRoaXMgY291bGQgZXZlbiBjYXVzZSB0aGUgc2VydmVyIHRvCi1jcmFzaC48L3A+Ci0KLTxoMj48YSBuYW1lPSJzb2x1dGlvbiI+VGhlIFNvbHV0aW9uPC9hPjwvaDI+Ci0KLTxwPkFwYWNoZSAxLjIgYW5kIGxhdGVyIG5vdyBkZXRlcm1pbmUgU0NSSVBUX05BTUUgYW5kIFBBVEhfSU5GTyBieQotbG9va2luZyBkaXJlY3RseSBhdCB0aGUgVVJMLCBhbmQgZGV0ZXJtaW5pbmcgaG93IG11Y2ggb2YgdGhlIFVSTCBpcwotY2xpZW50LW1vZGlmaWFibGUsIGFuZCBzZXR0aW5nIFBBVEhfSU5GTyB0byBpdC4gVG8gdXNlIHRoZSBhYm92ZQotZXhhbXBsZSwgUEFUSF9JTkZPIHdvdWxkIGJlIHNldCB0byAiPGNvZGU+L3NjcmlwdDwvY29kZT4iLCBhbmQKLVNDUklQVF9OQU1FIHRvICI8Y29kZT4vY2dpLXJhbHBoPC9jb2RlPiIuIFRoaXMgbWFrZXMgc2Vuc2UgYW5kIHJlc3VsdHMKLWluIG5vIHNlcnZlciBiZWhhdmlvciBwcm9ibGVtcy4gSXQgYWxzbyBwZXJtaXRzIHRoZSBzY3JpcHQgdG8gYmUKLWdhdXJhbnRlZWQgdGhhdAotIjxjb2RlPmh0dHA6Ly8kU0VSVkVSX05BTUU6JFNFUlZFUl9QT1JUJFNDUklQVF9OQU1FJFBBVEhfSU5GTzwvY29kZT4iCi13aWxsIGFsd2F5cyBiZSBhbiBhY2Nlc3NhYmxlIFVSTCB0aGF0IHBvaW50cyB0byB0aGUgY3VycmVudCBzY3JpcHQsCi1zb21ldGhpbmcgd2hpY2ggd2FzIG5vdCBuZWNjZXNzYXJpbHkgdHJ1ZSB3aXRoIHByZXZpb3VzIHZlcnNpb25zIG9mCi1BcGFjaGUuCi0KLTxwPkhvd2V2ZXIsIHRoZSAiPGNvZGU+L3JhbHBoPC9jb2RlPiIKLWluZm9ybWF0aW9uIGZyb20gdGhlIDxjb2RlPkFsaWFzPC9jb2RlPiBkaXJlY3RpdmUgaXMgbG9zdC4gVGhpcyBpcwotdW5mb3J0dW5hdGUsIGJ1dCB3ZSBmZWVsIHRoYXQgdXNpbmcgdGhlIGZpbGVzeXN0ZW0gdG8gcGFzcyBhbG9uZyB0aGlzCi1zb3J0IG9mIGluZm9ybWF0aW9uIGlzIG5vdCBhIHJlY29tbWVuZGVkIG1ldGhvZCwgYW5kIGEgc2NyaXB0IG1ha2luZwotdXNlIG9mIGl0ICJkZXNlcnZlcyIgbm90IHRvIHdvcmsuIEFwYWNoZSAxLjJiMyBhbmQgbGF0ZXIsIGhvd2V2ZXIsIGRvCi1wcm92aWRlIDxhIGhyZWY9IiNjb21wYXQiPmEgd29ya2Fyb3VuZC48L2E+Ci0KLTxoMj48YSBuYW1lPSJjb21wYXQiPkNvbXBhdGliaWxpdHkgd2l0aCBQcmV2aW91cyBTZXJ2ZXJzPC9hPjwvaDI+Ci0KLTxwPkl0IG1heSBiZSBuZWNjZXNzYXJ5IGZvciBhIHNjcmlwdCB0aGF0IHdhcyBkZXNpZ25lZCBmb3IgZWFybGllcgotdmVyc2lvbnMgb2YgQXBhY2hlIG9yIG90aGVyIHNlcnZlcnMgdG8gbmVlZCB0aGUgaW5mb3JtYXRpb24gdGhhdCB0aGUKLW9sZCBQQVRIX0lORk8gdmFyaWFibGUgcHJvdmlkZWQuIEZvciB0aGlzIHB1cnBvc2UsIEFwYWNoZSAxLjIgKDEuMmIzCi1hbmQgbGF0ZXIpIHNldHMgYW4gYWRkaXRpb25hbCB2YXJpYWJsZSwgRklMRVBBVEhfSU5GTy4gVGhpcwotZW52aXJvbm1lbnQgdmFyaWFibGUgY29udGFpbnMgdGhlIHZhbHVlIHRoYXQgUEFUSF9JTkZPIHdvdWxkIGhhdmUgaGFkCi13aXRoIEFwYWNoZSAxLjEuMS48L3A+Ci0KLTxwPkEgc2NyaXB0IHRoYXQgd2lzaGVzIHRvIHdvcmsgd2l0aCBib3RoIEFwYWNoZSAxLjIgYW5kIGVhcmxpZXIKLXZlcnNpb25zIGNhbiBzaW1wbHkgdGVzdCBmb3IgdGhlIGV4aXN0YW5jZSBvZiBGSUxFUEFUSF9JTkZPLCBhbmQgdXNlCi1pdCBpZiBhdmFpbGFibGUuIE90aGVyd2lzZSwgaXQgY2FuIHVzZSBQQVRIX0lORk8uIEZvciBleGFtcGxlLCBpbgotUGVybCwgb25lIG1pZ2h0IHVzZToKLTxwcmU+Ci0gICAgJHBhdGhfaW5mbyA9ICRFTlZ7J0ZJTEVQQVRIX0lORk8nfSB8fCAkRU5WeydQQVRIX0lORk8nfTsKLTwvcHJlPgotCi08cD5CeSBkb2luZyB0aGlzLCBhIHNjcmlwdCBjYW4gd29yayB3aXRoIGFsbCBzZXJ2ZXJzIHN1cHBvcnRpbmcgdGhlCi1DR0kvMS4xIHNwZWNpZmljYXRpb24sIGluY2x1ZGluZyBhbGwgdmVyc2lvbnMgb2YgQXBhY2hlLjwvcD4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvY2dpX3BhdGguaHRtbC5lbiBiL2RvY3MvbWFudWFsL2NnaV9wYXRoLmh0bWwuZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYmIzMTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvY2dpX3BhdGguaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTxodG1sPjxoZWFkPgotPHRpdGxlPlBBVEhfSU5GTyBDaGFuZ2VzIGluIHRoZSBDR0kgRW52aXJvbm1lbnQ8L3RpdGxlPgotPC9oZWFkPjxib2R5PgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPGgxPlBBVEhfSU5GTyBDaGFuZ2VzIGluIHRoZSBDR0kgRW52aXJvbm1lbnQ8L2gxPgotCi08aHI+Ci0KLTxoMj48YSBuYW1lPSJvdmVyIj5PdmVydmlldzwvYT48L2gyPgotCi08cD5BcyBpbXBsZW1lbnRlZCBpbiBBcGFjaGUgMS4xLjEgYW5kIGVhcmxpZXIgdmVyc2lvbnMsIHRoZSBtZXRob2QKLUFwYWNoZSB1c2VkIHRvIGNyZWF0ZSBQQVRIX0lORk8gaW4gdGhlIENHSSBlbnZpcm9ubWVudCB3YXMKLWNvdW50ZXJpbnRpdXRpdmUsIGFuZCBjb3VsZCByZXN1bHQgaW4gY3Jhc2hlcyBpbiBjZXJ0YWluIGNhc2VzLiBJbgotQXBhY2hlIDEuMiBhbmQgYmV5b25kLCB0aGlzIGJlaGF2aW9yIGhhcyBjaGFuZ2VkLiBBbHRob3VnaCB0aGlzCi1yZXN1bHRzIGluIHNvbWUgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyB3aXRoIGNlcnRhaW4gbGVnYWN5IENHSQotYXBwbGljYXRpb25zLCB0aGUgQXBhY2hlIDEuMiBiZWhhdmlvciBpcyBzdGlsbCBjb21wYXRpYmxlIHdpdGggdGhlCi1DR0kvMS4xIHNwZWNpZmljYXRpb24sIGFuZCBDR0kgc2NyaXB0cyBjYW4gYmUgZWFzaWx5IG1vZGlmaWVkICg8YQotaHJlZj0iI2NvbXBhdCI+c2VlIGJlbG93PC9hPikuCi0KLTxoMj48YSBuYW1lPSJwcm9iIj5UaGUgUHJvYmxlbTwvYT48L2gyPgotCi08cD5BcGFjaGUgMS4xLjEgYW5kIGVhcmxpZXIgaW1wbGVtZW50ZWQgdGhlIFBBVEhfSU5GTyBhbmQgU0NSSVBUX05BTUUKLWVudmlyb25tZW50IHZhcmlhYmxlcyBieSBsb29raW5nIGF0IHRoZSBmaWxlbmFtZSwgbm90IHRoZSBVUkwuIFdoaWxlCi10aGlzIHJlc3VsdGVkIGluIHRoZSBjb3JyZWN0IHZhbHVlcyBpbiBtYW55IGNhc2VzLCB3aGVuIHRoZSBmaWxlc3lzdGVtCi1wYXRoIHdhcyBvdmVybG9hZGVkIHRvIGNvbnRhaW4gcGF0aCBpbmZvcm1hdGlvbiwgaXQgY291bGQgcmVzdWx0IGluCi1lcnJhbnQgYmVoYXZpb3IuIEZvciBleGFtcGxlLCBpZiB0aGUgZm9sbG93aW5nIGFwcGVhcmVkIGluIGEgY29uZmlnCi1maWxlOgotPHByZT4KLSAgICAgQWxpYXMgL2NnaS1yYWxwaCAvdXNyL2xvY2FsL2h0dHBkL2NnaS1iaW4vdXNlci5jZ2kvcmFscGgKLTwvcHJlPgotPHA+SW4gdGhpcyBjYXNlLCA8Y29kZT51c2VyLmNnaTwvY29kZT4gaXMgdGhlIENHSSBzY3JpcHQsIHRoZSAiL3JhbHBoIgotaXMgaW5mb3JtYXRpb24gdG8gYmUgcGFzc2VkIG9udG8gdGhlIENHSS4gSWYgdGhpcyBjb25maWd1cmF0aW9uIHdhcyBpbgotcGxhY2UsIGFuZCBhIHJlcXVlc3QgY2FtZSBmb3IgIjxjb2RlPi9jZ2ktcmFscGgvc2NyaXB0LzwvY29kZT4iLCB0aGUKLWNvZGUgd291bGQgc2V0IFBBVEhfSU5GTyB0byAiPGNvZGU+L3JhbHBoL3NjcmlwdDwvY29kZT4iLCBhbmQKLVNDUklQVF9OQU1FIHRvICI8Y29kZT4vY2dpLTwvY29kZT4iLiBPYnZpb3VzbHksIHRoZSBsYXR0ZXIgaXMKLWluY29ycmVjdC4gSW4gY2VydGFpbiBjYXNlcywgdGhpcyBjb3VsZCBldmVuIGNhdXNlIHRoZSBzZXJ2ZXIgdG8KLWNyYXNoLjwvcD4KLQotPGgyPjxhIG5hbWU9InNvbHV0aW9uIj5UaGUgU29sdXRpb248L2E+PC9oMj4KLQotPHA+QXBhY2hlIDEuMiBhbmQgbGF0ZXIgbm93IGRldGVybWluZSBTQ1JJUFRfTkFNRSBhbmQgUEFUSF9JTkZPIGJ5Ci1sb29raW5nIGRpcmVjdGx5IGF0IHRoZSBVUkwsIGFuZCBkZXRlcm1pbmluZyBob3cgbXVjaCBvZiB0aGUgVVJMIGlzCi1jbGllbnQtbW9kaWZpYWJsZSwgYW5kIHNldHRpbmcgUEFUSF9JTkZPIHRvIGl0LiBUbyB1c2UgdGhlIGFib3ZlCi1leGFtcGxlLCBQQVRIX0lORk8gd291bGQgYmUgc2V0IHRvICI8Y29kZT4vc2NyaXB0PC9jb2RlPiIsIGFuZAotU0NSSVBUX05BTUUgdG8gIjxjb2RlPi9jZ2ktcmFscGg8L2NvZGU+Ii4gVGhpcyBtYWtlcyBzZW5zZSBhbmQgcmVzdWx0cwotaW4gbm8gc2VydmVyIGJlaGF2aW9yIHByb2JsZW1zLiBJdCBhbHNvIHBlcm1pdHMgdGhlIHNjcmlwdCB0byBiZQotZ2F1cmFudGVlZCB0aGF0Ci0iPGNvZGU+aHR0cDovLyRTRVJWRVJfTkFNRTokU0VSVkVSX1BPUlQkU0NSSVBUX05BTUUkUEFUSF9JTkZPPC9jb2RlPiIKLXdpbGwgYWx3YXlzIGJlIGFuIGFjY2Vzc2FibGUgVVJMIHRoYXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IHNjcmlwdCwKLXNvbWV0aGluZyB3aGljaCB3YXMgbm90IG5lY2Nlc3NhcmlseSB0cnVlIHdpdGggcHJldmlvdXMgdmVyc2lvbnMgb2YKLUFwYWNoZS4KLQotPHA+SG93ZXZlciwgdGhlICI8Y29kZT4vcmFscGg8L2NvZGU+IgotaW5mb3JtYXRpb24gZnJvbSB0aGUgPGNvZGU+QWxpYXM8L2NvZGU+IGRpcmVjdGl2ZSBpcyBsb3N0LiBUaGlzIGlzCi11bmZvcnR1bmF0ZSwgYnV0IHdlIGZlZWwgdGhhdCB1c2luZyB0aGUgZmlsZXN5c3RlbSB0byBwYXNzIGFsb25nIHRoaXMKLXNvcnQgb2YgaW5mb3JtYXRpb24gaXMgbm90IGEgcmVjb21tZW5kZWQgbWV0aG9kLCBhbmQgYSBzY3JpcHQgbWFraW5nCi11c2Ugb2YgaXQgImRlc2VydmVzIiBub3QgdG8gd29yay4gQXBhY2hlIDEuMmIzIGFuZCBsYXRlciwgaG93ZXZlciwgZG8KLXByb3ZpZGUgPGEgaHJlZj0iI2NvbXBhdCI+YSB3b3JrYXJvdW5kLjwvYT4KLQotPGgyPjxhIG5hbWU9ImNvbXBhdCI+Q29tcGF0aWJpbGl0eSB3aXRoIFByZXZpb3VzIFNlcnZlcnM8L2E+PC9oMj4KLQotPHA+SXQgbWF5IGJlIG5lY2Nlc3NhcnkgZm9yIGEgc2NyaXB0IHRoYXQgd2FzIGRlc2lnbmVkIGZvciBlYXJsaWVyCi12ZXJzaW9ucyBvZiBBcGFjaGUgb3Igb3RoZXIgc2VydmVycyB0byBuZWVkIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHRoZQotb2xkIFBBVEhfSU5GTyB2YXJpYWJsZSBwcm92aWRlZC4gRm9yIHRoaXMgcHVycG9zZSwgQXBhY2hlIDEuMiAoMS4yYjMKLWFuZCBsYXRlcikgc2V0cyBhbiBhZGRpdGlvbmFsIHZhcmlhYmxlLCBGSUxFUEFUSF9JTkZPLiBUaGlzCi1lbnZpcm9ubWVudCB2YXJpYWJsZSBjb250YWlucyB0aGUgdmFsdWUgdGhhdCBQQVRIX0lORk8gd291bGQgaGF2ZSBoYWQKLXdpdGggQXBhY2hlIDEuMS4xLjwvcD4KLQotPHA+QSBzY3JpcHQgdGhhdCB3aXNoZXMgdG8gd29yayB3aXRoIGJvdGggQXBhY2hlIDEuMiBhbmQgZWFybGllcgotdmVyc2lvbnMgY2FuIHNpbXBseSB0ZXN0IGZvciB0aGUgZXhpc3RhbmNlIG9mIEZJTEVQQVRIX0lORk8sIGFuZCB1c2UKLWl0IGlmIGF2YWlsYWJsZS4gT3RoZXJ3aXNlLCBpdCBjYW4gdXNlIFBBVEhfSU5GTy4gRm9yIGV4YW1wbGUsIGluCi1QZXJsLCBvbmUgbWlnaHQgdXNlOgotPHByZT4KLSAgICAkcGF0aF9pbmZvID0gJEVOVnsnRklMRVBBVEhfSU5GTyd9IHx8ICRFTlZ7J1BBVEhfSU5GTyd9OwotPC9wcmU+Ci0KLTxwPkJ5IGRvaW5nIHRoaXMsIGEgc2NyaXB0IGNhbiB3b3JrIHdpdGggYWxsIHNlcnZlcnMgc3VwcG9ydGluZyB0aGUKLUNHSS8xLjEgc3BlY2lmaWNhdGlvbiwgaW5jbHVkaW5nIGFsbCB2ZXJzaW9ucyBvZiBBcGFjaGUuPC9wPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9jb25maWd1cmluZy5odG1sIGIvZG9jcy9tYW51YWwvY29uZmlndXJpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJlNDFjMi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9jb25maWd1cmluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+Q29uZmlndXJpbmcgQXBhY2hlPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+Q29uZmlndXJpbmcgQXBhY2hlPC9IMT4KLQotPEgyPk1haW4gQ29uZmlndXJhdGlvbiBGaWxlczwvSDI+Ci0KLTxQPkFwYWNoZSBpcyBjb25maWd1cmVkIGJ5IHBsYWNpbmcgPEEgSFJFRj0ibW9kL2RpcmVjdGl2ZXMuaHRtbCIKLT5kaXJlY3RpdmVzPC9BPiBpbiBwbGFpbiB0ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZXMuICBUaGUgbWFpbgotY29uZmlndXJhdGlvbiBmaWxlIGlzIHVzdWFsbHkgY2FsbGVkIDxDT0RFPmh0dHBkLmNvbmY8L0NPREU+LiAgVGhlCi1sb2NhdGlvbiBvZiB0aGlzIGZpbGUgaXMgc2V0IGF0IGNvbXBpbGUtdGltZSwgYnV0IG1heSBiZSBvdmVycmlkZGVuCi13aXRoIHRoZSA8Q09ERT4tZjwvQ09ERT4gY29tbWFuZCBsaW5lIGZsYWcuICBTb21lIHNpdGVzIGFsc28gaGF2ZQotPENPREU+c3JtLmNvbmY8L0NPREU+IGFuZCA8Q09ERT5hY2Nlc3MuY29uZjwvQ09ERT4gZmlsZXMgZm9yIDxBCi1IUkVGPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvaW5mby90aHJlZS1jb25maWctZmlsZXMuaHRtbCI+aGlzdG9yaWNhbAotcmVhc29uczwvQT4uICBJbiBhZGRpdGlvbiwgb3RoZXIgY29uZmlndXJhdGlvbiBmaWxlcyBtYXkgYmUgYWRkZWQgdXNpbmcKLXRoZSA8Q09ERT48QSBIUkVGPSJtb2QvY29yZS5odG1sI2luY2x1ZGUiPkluY2x1ZGU8L0E+PC9DT0RFPgotZGlyZWN0aXZlLiAgQW55IGRpcmVjdGl2ZSBtYXkgYmUgcGxhY2VkIGluIGFueSBvZiB0aGVzZSBjb25maWd1cmF0aW9uCi1maWxlcy4gIENoYW5nZXMgdG8gdGhlIG1haW4gY29uZmlndXJhdGlvbiBmaWxlcyBhcmUgb25seSByZWNvZ25pemVkIGJ5Ci1BcGFjaGUgd2hlbiBpdCBpcyBzdGFydGVkIG9yIHJlc3RhcnRlZC4KLQotPFA+Ci1UaGUgc2VydmVyIGFsc28gcmVhZHMgYSBmaWxlIGNvbnRhaW5pbmcgbWltZSBkb2N1bWVudCB0eXBlczsgdGhlCi1maWxlbmFtZSBpcyBzZXQgYnkgdGhlIDxBIEhSRUY9Im1vZC9tb2RfbWltZS5odG1sI3R5cGVzY29uZmlnIgotPlR5cGVzQ29uZmlnPC9BPiBkaXJlY3RpdmUsIGFuZCBpcyA8Q09ERT5taW1lLnR5cGVzPC9DT0RFPiBieSBkZWZhdWx0LgotCi08SDI+U3ludGF4IG9mIHRoZSBDb25maWd1cmF0aW9uIEZpbGVzPC9IMj4KLQotPFA+RGlyZWN0aXZlcyBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSwgYnV0Ci1hcmd1bWVudHMgdG8gZGlyZWN0aXZlcyBhcmUgb2Z0ZW4gY2FzZSBzZW5zaXRpdmUuICBMaW5lcyB3aGljaCBiZWdpbgotd2l0aCB0aGUgaGFzaCBjaGFyYWN0ZXIgIiMiIGFyZSBjb25zaWRlcmVkIGNvbW1lbnRzLCBhbmQgYXJlIGlnbm9yZWQuCi1Db21tZW50cyBtYXkgPFNUUk9ORz5ub3Q8L1NUUk9ORz4gYmUgaW5jbHVkZWQgb24gYSBsaW5lIGFmdGVyIGEgY29uZmlndXJhdGlvbgotZGlyZWN0aXZlLiAgV2hpdGUgc3BhY2Ugb2NjdXJyaW5nIGJlZm9yZSBhIGRpcmVjdGl2ZQotaXMgaWdub3JlZCwgc28geW91IG1heSBpbmRlbnQgZGlyZWN0aXZlcyBmb3IgY2xhcml0eS4KLQotPFA+WW91IGNhbiBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIHN5bnRheCBlcnJvcnMgd2l0aG91dAotc3RhcnRpbmcgdGhlIHNlcnZlciBieSB1c2luZyA8Q09ERT5hcGFjaGVjdGwgY29uZmlndGVzdDwvQ09ERT4KLW9yIHRoZSA8Q09ERT4tdDwvQ09ERT4gY29tbWFuZCBsaW5lIG9wdGlvbi4KLQotPEgyPk1vZHVsZXM8L0gyPgotCi08UD5BcGFjaGUgaXMgYSBtb2R1bGFyIHNlcnZlci4gIFRoaXMgaW1wbGllcyB0aGF0IG9ubHkgdGhlIG1vc3QgYmFzaWMKLWZ1bmN0aW9uYWxpdHkgaXMgaW5jbHVkZWQgaW4gdGhlIGNvcmUgc2VydmVyLiAgRXh0ZW5kZWQgZmVhdHVyZXMgYXJlCi1hdmFpbGFibGUgdGhyb3VnaCA8QSBIUkVGPSJtb2QvaW5kZXgtYnl0eXBlLmh0bWwiPm1vZHVsZXM8L0E+IHdoaWNoIGNhbgotYmUgbG9hZGVkIGludG8gQXBhY2hlLiAgQnkgZGVmYXVsdCwgYSA8QQotSFJFRj0ibW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIj5iYXNlPC9BPiBzZXQgb2YgbW9kdWxlcyBpcwotaW5jbHVkZWQgaW4gdGhlIHNlcnZlciBhdCBjb21waWxlLXRpbWUuICBJZiB0aGUgc2VydmVyIGlzIGNvbXBpbGVkIHRvCi11c2UgPEEgSFJFRj0iZHNvLmh0bWwiPmR5bmFtaWNhbGx5IGxvYWRlZDwvQT4gbW9kdWxlcywgdGhlbiBtb2R1bGVzCi1jYW4gYmUgY29tcGlsZWQgc2VwYXJhdGVseSBhbmQgYWRkZWQgYXQgYW55IHRpbWUgdXNpbmcgdGhlIDxBCi1IUkVGPSJtb2QvbW9kX3NvLmh0bWwjbG9hZG1vZHVsZSI+TG9hZE1vZHVsZTwvQT4gZGlyZWN0aXZlLgotT3RoZXJ3aXNlLCBhcGFjaGUgbXVzdCBiZSByZWNvbXBpbGVkIHRvIGFkZCBvciByZW1vdmUgbW9kdWxlcy4KLQotPFA+VG8gc2VlIHdoaWNoIG1vZHVsZXMgYXJlIGN1cnJlbnRseSBjb21waWxlZCBpbnRvIHRoZSBzZXJ2ZXIsCi15b3UgY2FuIHVzZSB0aGUgPENPREU+LWw8L0NPREU+IGNvbW1hbmQgbGluZSBvcHRpb24uCi0KLTxIMj5TY29wZSBvZiBEaXJlY3RpdmVzPC9IMj4KLQotPFA+RGlyZWN0aXZlcyBwbGFjZWQgaW4gdGhlIG1haW4gY29uZmlndXJhdGlvbiBmaWxlcyBhcHBseSB0byB0aGUgZW50aXJlCi1zZXJ2ZXIuICBJZiB5b3Ugd2lzaCB0byBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIG9ubHkgYSBwYXJ0IG9mCi10aGUgc2VydmVyLCB5b3UgY2FuIHNjb3BlIHlvdXIgZGlyZWN0aXZlcyBieSBwbGFjaW5nIHRoZW0gaW4gCi08Q09ERT48QSBIUkVGPSJtb2QvY29yZS5odG1sI2RpcmVjdG9yeSI+Jmx0O0RpcmVjdG9yeSZndDs8L0E+LAotPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNkaXJlY3RvcnltYXRjaCI+Jmx0O0RpcmVjdG9yeU1hdGNoJmd0OzwvQT4sCi08QSBIUkVGPSJtb2QvY29yZS5odG1sI2ZpbGVzIj4mbHQ7RmlsZXMmZ3Q7PC9BPiwKLTxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjZmlsZXNtYXRjaCI+Jmx0O0ZpbGVzTWF0Y2gmZ3Q7PC9BPiwKLTxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjbG9jYXRpb24iPiZsdDtMb2NhdGlvbiZndDs8L0E+LAotPC9DT0RFPiBhbmQgPENPREU+Ci08QSBIUkVGPSJtb2QvY29yZS5odG1sI2xvY2F0aW9ubWF0Y2giPiZsdDtMb2NhdGlvbk1hdGNoJmd0OzwvQT4KLTwvQ09ERT4KLXNlY3Rpb25zLiAgVGhlc2Ugc2VjdGlvbnMgbGltaXQgdGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmVzCi13aGljaCB0aGV5IGVuY2xvc2UgdG8gcGFydGljdWxhciBmaWxlc3lzdGVtIGxvY2F0aW9ucyBvciBVUkxzLiAgVGhleQotY2FuIGFsc28gYmUgbmVzdGVkLCBhbGxvd2luZyBmb3IgdmVyeSBmaW5lIGdyYWluZWQgY29uZmlndXJhdGlvbi4KLQotPFA+QXBhY2hlIGhhcyB0aGUgY2FwYWJpbGl0eSB0byBzZXJ2ZSBtYW55IGRpZmZlcmVudCB3ZWJzaXRlcwotc2ltdWx0YW5lb3VzbHkuICBUaGlzIGlzIGNhbGxlZCA8QSBIUkVGPSJ2aG9zdHMvIj5WaXJ0dWFsIEhvc3Rpbmc8L0E+LgotRGlyZWN0aXZlcyBjYW4gYWxzbyBiZSBzY29wZWQgYnkgcGxhY2luZyB0aGVtIGluc2lkZQotPENPREU+PEEgSFJFRj0ibW9kL2NvcmUuaHRtbCN2aXJ0dWFsaG9zdCI+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvQT48L0NPREU+Ci1zZWN0aW9ucywgc28gdGhhdCB0aGV5IHdpbGwgb25seSBhcHBseSB0byByZXF1ZXN0cyBmb3IgYSBwYXJ0aWN1bGFyCi13ZWJzaXRlLgotCi08UD5BbHRob3VnaCBtb3N0IGRpcmVjdGl2ZXMgY2FuIGJlIHBsYWNlZCBpbiBhbnkgb2YgdGhlc2Ugc2VjdGlvbnMsCi1zb21lIGRpcmVjdGl2ZXMgZG8gbm90IG1ha2Ugc2Vuc2UgaW4gc29tZSBjb250ZXh0cy4gIEZvciBleGFtcGxlLAotZGlyZWN0aXZlcyBjb250cm9sbGluZyBwcm9jZXNzIGNyZWF0aW9uIGNhbiBvbmx5IGJlIHBsYWNlZCBpbiB0aGUgbWFpbgotc2VydmVyIGNvbnRleHQuICBUbyBmaW5kIHdoaWNoIGRpcmVjdGl2ZXMgY2FuIGJlIHBsYWNlZCBpbiB3aGljaAotc2VjdGlvbnMsIGNoZWNrIHRoZSA8QQotSFJFRj0ibW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCI+Q29udGV4dDwvQT4gb2YgdGhlIGRpcmVjdGl2ZS4KLUZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCB3ZSBwcm92aWRlIGRldGFpbHMgb24gPEEKLUhSRUY9InNlY3Rpb25zLmh0bWwiPkhvdyBEaXJlY3RvcnksIExvY2F0aW9uIGFuZCBGaWxlcyBzZWN0aW9ucwotd29yazwvQT4uCi0KLTxIMj4uaHRhY2Nlc3MgRmlsZXM8L0gyPgotCi08UD5BcGFjaGUgYWxsb3dzIGZvciBkZWNlbnRyYWxpemVkIG1hbmFnZW1lbnQgb2YgY29uZmlndXJhdGlvbiB2aWEKLXNwZWNpYWwgZmlsZXMgcGxhY2VkIGluc2lkZSB0aGUgd2ViIHRyZWUuICBUaGUgc3BlY2lhbCBmaWxlcyBhcmUKLXVzdWFsbHkgY2FsbGVkIDxDT0RFPi5odGFjY2VzczwvQ09ERT4sIGJ1dCBhbnkgbmFtZSBjYW4gYmUgc3BlY2lmaWVkCi1pbiB0aGUgPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNhY2Nlc3NmaWxlbmFtZSI+PENPREUKLT5BY2Nlc3NGaWxlTmFtZTwvQ09ERT48L0E+IGRpcmVjdGl2ZS4gIERpcmVjdGl2ZXMgcGxhY2VkIGluCi08Q09ERT4uaHRhY2Nlc3M8L0NPREU+IGZpbGVzIGFwcGx5IHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgeW91IHBsYWNlCi10aGUgZmlsZSwgYW5kIGFsbCBzdWItZGlyZWN0b3JpZXMuICBUaGUgPENPREU+Lmh0YWNjZXNzPC9DT0RFPiBmaWxlcwotZm9sbG93IHRoZSBzYW1lIHN5bnRheCBhcyB0aGUgbWFpbiBjb25maWd1cmF0aW9uIGZpbGVzLiAgU2luY2UKLTxDT0RFPi5odGFjY2VzczwvQ09ERT4gZmlsZXMgYXJlIHJlYWQgb24gZXZlcnkgcmVxdWVzdCwgcmF0aGVyIHRoYW4KLW9ubHkgYXQgc2VydmVyIHN0YXJ0dXAsIGNoYW5nZXMgbWFkZSBpbiB0aGVzZSBmaWxlcyB0YWtlIGltbWVkaWF0ZQotZWZmZWN0LgotCi08UD5UbyBmaW5kIHdoaWNoIGRpcmVjdGl2ZXMgY2FuIGJlIHBsYWNlZCBpbiA8Q09ERT4uaHRhY2Nlc3M8L0NPREU+Ci1maWxlcywgY2hlY2sgdGhlIDxBIEhSRUY9Im1vZC9kaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiPkNvbnRleHQ8L0E+Ci1vZiB0aGUgZGlyZWN0aXZlLiAgVGhlIHNlcnZlciBhZG1pbmlzdHJhdG9yIGZ1cnRoZXIgY29udHJvbHMgd2hhdAotZGlyZWN0aXZlcyBtYXkgYmUgcGxhY2VkIGluIDxDT0RFPi5odGFjY2VzczwvQ09ERT4gZmlsZXMgYnkKLWNvbmZpZ3VyaW5nIHRoZSA8QQotSFJFRj0ibW9kL2NvcmUuaHRtbCNhbGxvd292ZXJyaWRlIj48Q09ERT5BbGxvd092ZXJyaWRlPC9DT0RFPjwvQT4KLWRpcmVjdGl2ZSBpbiB0aGUgbWFpbiBjb25maWd1cmF0aW9uIGZpbGVzLgotCi08SDI+TG9nIGZpbGVzPC9IMj4KLTxIMz5zZWN1cml0eSB3YXJuaW5nPC9IMz4KLUFueW9uZSB3aG8gY2FuIHdyaXRlIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgQXBhY2hlIGlzIHdyaXRpbmcgYQotbG9nIGZpbGUgY2FuIGFsbW9zdCBjZXJ0YWlubHkgZ2FpbiBhY2Nlc3MgdG8gdGhlIHVpZCB0aGF0IHRoZSBzZXJ2ZXIgaXMKLXN0YXJ0ZWQgYXMsIHdoaWNoIGlzIG5vcm1hbGx5IHJvb3QuICBEbyA8RU0+Tk9UPC9FTT4gZ2l2ZSBwZW9wbGUgd3JpdGUKLWFjY2VzcyB0byB0aGUgZGlyZWN0b3J5IHRoZSBsb2dzIGFyZSBzdG9yZWQgaW4gd2l0aG91dCBiZWluZyBhd2FyZSBvZgotdGhlIGNvbnNlcXVlbmNlczsgc2VlIHRoZSA8QSBIUkVGPSJtaXNjL3NlY3VyaXR5X3RpcHMuaHRtbCI+c2VjdXJpdHkgdGlwczwvQT4KLWRvY3VtZW50IGZvciBkZXRhaWxzLgotCi08SDM+cGlkIGZpbGU8L0gzPgotCi08UD5PbiBzdGFydHVwLCBBcGFjaGUgc2F2ZXMgdGhlIHByb2Nlc3MgaWQgb2YgdGhlIHBhcmVudCBodHRwZCBwcm9jZXNzIHRvCi10aGUgZmlsZSA8Q09ERT5sb2dzL2h0dHBkLnBpZDwvQ09ERT4uIFRoaXMgZmlsZW5hbWUgY2FuIGJlIGNoYW5nZWQKLXdpdGggdGhlIDxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjcGlkZmlsZSI+UGlkRmlsZTwvQT4gZGlyZWN0aXZlLiBUaGUKLXByb2Nlc3MtaWQgaXMgZm9yIHVzZSBieSB0aGUgYWRtaW5pc3RyYXRvciBpbiByZXN0YXJ0aW5nIGFuZAotdGVybWluYXRpbmcgdGhlIGRhZW1vbjogb24gVW5peCwgYSBIVVAgb3IgVVNSMSBzaWduYWwgY2F1c2VzIHRoZQotZGFlbW9uIHRvIHJlLXJlYWQgaXRzIGNvbmZpZ3VyYXRpb24gZmlsZXMgYW5kIGEgVEVSTSBzaWduYWwgY2F1c2VzIGl0Ci10byBkaWUgZ3JhY2VmdWxseTsgb24gV2luZG93cywgdXNlIHRoZSAtayBjb21tYW5kIGxpbmUgb3B0aW9uIGluc3RlYWQuCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgdGhlIDxBIEhSRUY9InN0b3BwaW5nLmh0bWwiPlN0b3BwaW5nIGFuZAotUmVzdGFydGluZzwvQT4gcGFnZS4KLQotPFA+Ci1JZiB0aGUgcHJvY2VzcyBkaWVzIChvciBpcyBraWxsZWQpIGFibm9ybWFsbHksIHRoZW4gaXQgd2lsbCBiZSBuZWNlc3NhcnkgdG8KLWtpbGwgdGhlIGNoaWxkcmVuIGh0dHBkIHByb2Nlc3Nlcy4KLQotPEgzPkVycm9yIGxvZzwvSDM+Ci0KLTxQPlRoZSBzZXJ2ZXIgd2lsbCBsb2cgZXJyb3IgbWVzc2FnZXMgdG8gYSBsb2cgZmlsZSwgYnkgZGVmYXVsdAotPENPREU+bG9ncy9lcnJvcl9sb2c8L0NPREU+IG9uIFVuaXggb3IgPENPREU+bG9ncy9lcnJvci5sb2c8L0NPREU+IG9uCi1XaW5kb3dzIGFuZCBPUy8yLiBUaGUgZmlsZW5hbWUgY2FuIGJlIHNldCB1c2luZyB0aGUgPEEKLUhSRUY9Im1vZC9jb3JlLmh0bWwjZXJyb3Jsb2ciPkVycm9yTG9nPC9BPiBkaXJlY3RpdmU7IGRpZmZlcmVudCBlcnJvcgotbG9ncyBjYW4gYmUgc2V0IGZvciBkaWZmZXJlbnQgPEEKLUhSRUY9Im1vZC9jb3JlLmh0bWwjdmlydHVhbGhvc3QiPnZpcnR1YWwgaG9zdHM8L0E+LgotCi08SDM+VHJhbnNmZXIgbG9nPC9IMz4KLQotPFA+VGhlIHNlcnZlciB3aWxsIHR5cGljYWxseSBsb2cgZWFjaCByZXF1ZXN0IHRvIGEgdHJhbnNmZXIgZmlsZSwgYnkKLWRlZmF1bHQgPENPREU+bG9ncy9hY2Nlc3NfbG9nPC9DT0RFPiBvbiBVbml4IG9yCi08Q09ERT5sb2dzL2FjY2Vzcy5sb2c8L0NPREU+IG9uIFdpbmRvd3MgYW5kIE9TLzIuIFRoZSBmaWxlbmFtZSBjYW4gYmUKLXNldCB1c2luZyBhIDxBIEhSRUY9Im1vZC9tb2RfbG9nX2NvbmZpZy5odG1sI2N1c3RvbWxvZyI+Q3VzdG9tTG9nPC9BPgotZGlyZWN0aXZlOyBkaWZmZXJlbnQgdHJhbnNmZXIgbG9ncyBjYW4gYmUgc2V0IGZvciBkaWZmZXJlbnQgPEEKLUhSRUY9Im1vZC9jb3JlLmh0bWwjdmlydHVhbGhvc3QiPnZpcnR1YWwgaG9zdHM8L0E+LgotCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9jb25maWd1cmluZy5odG1sLmVuIGIvZG9jcy9tYW51YWwvY29uZmlndXJpbmcuaHRtbC5lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJlNDFjMi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9jb25maWd1cmluZy5odG1sLmVuCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+Q29uZmlndXJpbmcgQXBhY2hlPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+Q29uZmlndXJpbmcgQXBhY2hlPC9IMT4KLQotPEgyPk1haW4gQ29uZmlndXJhdGlvbiBGaWxlczwvSDI+Ci0KLTxQPkFwYWNoZSBpcyBjb25maWd1cmVkIGJ5IHBsYWNpbmcgPEEgSFJFRj0ibW9kL2RpcmVjdGl2ZXMuaHRtbCIKLT5kaXJlY3RpdmVzPC9BPiBpbiBwbGFpbiB0ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZXMuICBUaGUgbWFpbgotY29uZmlndXJhdGlvbiBmaWxlIGlzIHVzdWFsbHkgY2FsbGVkIDxDT0RFPmh0dHBkLmNvbmY8L0NPREU+LiAgVGhlCi1sb2NhdGlvbiBvZiB0aGlzIGZpbGUgaXMgc2V0IGF0IGNvbXBpbGUtdGltZSwgYnV0IG1heSBiZSBvdmVycmlkZGVuCi13aXRoIHRoZSA8Q09ERT4tZjwvQ09ERT4gY29tbWFuZCBsaW5lIGZsYWcuICBTb21lIHNpdGVzIGFsc28gaGF2ZQotPENPREU+c3JtLmNvbmY8L0NPREU+IGFuZCA8Q09ERT5hY2Nlc3MuY29uZjwvQ09ERT4gZmlsZXMgZm9yIDxBCi1IUkVGPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvaW5mby90aHJlZS1jb25maWctZmlsZXMuaHRtbCI+aGlzdG9yaWNhbAotcmVhc29uczwvQT4uICBJbiBhZGRpdGlvbiwgb3RoZXIgY29uZmlndXJhdGlvbiBmaWxlcyBtYXkgYmUgYWRkZWQgdXNpbmcKLXRoZSA8Q09ERT48QSBIUkVGPSJtb2QvY29yZS5odG1sI2luY2x1ZGUiPkluY2x1ZGU8L0E+PC9DT0RFPgotZGlyZWN0aXZlLiAgQW55IGRpcmVjdGl2ZSBtYXkgYmUgcGxhY2VkIGluIGFueSBvZiB0aGVzZSBjb25maWd1cmF0aW9uCi1maWxlcy4gIENoYW5nZXMgdG8gdGhlIG1haW4gY29uZmlndXJhdGlvbiBmaWxlcyBhcmUgb25seSByZWNvZ25pemVkIGJ5Ci1BcGFjaGUgd2hlbiBpdCBpcyBzdGFydGVkIG9yIHJlc3RhcnRlZC4KLQotPFA+Ci1UaGUgc2VydmVyIGFsc28gcmVhZHMgYSBmaWxlIGNvbnRhaW5pbmcgbWltZSBkb2N1bWVudCB0eXBlczsgdGhlCi1maWxlbmFtZSBpcyBzZXQgYnkgdGhlIDxBIEhSRUY9Im1vZC9tb2RfbWltZS5odG1sI3R5cGVzY29uZmlnIgotPlR5cGVzQ29uZmlnPC9BPiBkaXJlY3RpdmUsIGFuZCBpcyA8Q09ERT5taW1lLnR5cGVzPC9DT0RFPiBieSBkZWZhdWx0LgotCi08SDI+U3ludGF4IG9mIHRoZSBDb25maWd1cmF0aW9uIEZpbGVzPC9IMj4KLQotPFA+RGlyZWN0aXZlcyBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSwgYnV0Ci1hcmd1bWVudHMgdG8gZGlyZWN0aXZlcyBhcmUgb2Z0ZW4gY2FzZSBzZW5zaXRpdmUuICBMaW5lcyB3aGljaCBiZWdpbgotd2l0aCB0aGUgaGFzaCBjaGFyYWN0ZXIgIiMiIGFyZSBjb25zaWRlcmVkIGNvbW1lbnRzLCBhbmQgYXJlIGlnbm9yZWQuCi1Db21tZW50cyBtYXkgPFNUUk9ORz5ub3Q8L1NUUk9ORz4gYmUgaW5jbHVkZWQgb24gYSBsaW5lIGFmdGVyIGEgY29uZmlndXJhdGlvbgotZGlyZWN0aXZlLiAgV2hpdGUgc3BhY2Ugb2NjdXJyaW5nIGJlZm9yZSBhIGRpcmVjdGl2ZQotaXMgaWdub3JlZCwgc28geW91IG1heSBpbmRlbnQgZGlyZWN0aXZlcyBmb3IgY2xhcml0eS4KLQotPFA+WW91IGNhbiBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIHN5bnRheCBlcnJvcnMgd2l0aG91dAotc3RhcnRpbmcgdGhlIHNlcnZlciBieSB1c2luZyA8Q09ERT5hcGFjaGVjdGwgY29uZmlndGVzdDwvQ09ERT4KLW9yIHRoZSA8Q09ERT4tdDwvQ09ERT4gY29tbWFuZCBsaW5lIG9wdGlvbi4KLQotPEgyPk1vZHVsZXM8L0gyPgotCi08UD5BcGFjaGUgaXMgYSBtb2R1bGFyIHNlcnZlci4gIFRoaXMgaW1wbGllcyB0aGF0IG9ubHkgdGhlIG1vc3QgYmFzaWMKLWZ1bmN0aW9uYWxpdHkgaXMgaW5jbHVkZWQgaW4gdGhlIGNvcmUgc2VydmVyLiAgRXh0ZW5kZWQgZmVhdHVyZXMgYXJlCi1hdmFpbGFibGUgdGhyb3VnaCA8QSBIUkVGPSJtb2QvaW5kZXgtYnl0eXBlLmh0bWwiPm1vZHVsZXM8L0E+IHdoaWNoIGNhbgotYmUgbG9hZGVkIGludG8gQXBhY2hlLiAgQnkgZGVmYXVsdCwgYSA8QQotSFJFRj0ibW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIj5iYXNlPC9BPiBzZXQgb2YgbW9kdWxlcyBpcwotaW5jbHVkZWQgaW4gdGhlIHNlcnZlciBhdCBjb21waWxlLXRpbWUuICBJZiB0aGUgc2VydmVyIGlzIGNvbXBpbGVkIHRvCi11c2UgPEEgSFJFRj0iZHNvLmh0bWwiPmR5bmFtaWNhbGx5IGxvYWRlZDwvQT4gbW9kdWxlcywgdGhlbiBtb2R1bGVzCi1jYW4gYmUgY29tcGlsZWQgc2VwYXJhdGVseSBhbmQgYWRkZWQgYXQgYW55IHRpbWUgdXNpbmcgdGhlIDxBCi1IUkVGPSJtb2QvbW9kX3NvLmh0bWwjbG9hZG1vZHVsZSI+TG9hZE1vZHVsZTwvQT4gZGlyZWN0aXZlLgotT3RoZXJ3aXNlLCBhcGFjaGUgbXVzdCBiZSByZWNvbXBpbGVkIHRvIGFkZCBvciByZW1vdmUgbW9kdWxlcy4KLQotPFA+VG8gc2VlIHdoaWNoIG1vZHVsZXMgYXJlIGN1cnJlbnRseSBjb21waWxlZCBpbnRvIHRoZSBzZXJ2ZXIsCi15b3UgY2FuIHVzZSB0aGUgPENPREU+LWw8L0NPREU+IGNvbW1hbmQgbGluZSBvcHRpb24uCi0KLTxIMj5TY29wZSBvZiBEaXJlY3RpdmVzPC9IMj4KLQotPFA+RGlyZWN0aXZlcyBwbGFjZWQgaW4gdGhlIG1haW4gY29uZmlndXJhdGlvbiBmaWxlcyBhcHBseSB0byB0aGUgZW50aXJlCi1zZXJ2ZXIuICBJZiB5b3Ugd2lzaCB0byBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIG9ubHkgYSBwYXJ0IG9mCi10aGUgc2VydmVyLCB5b3UgY2FuIHNjb3BlIHlvdXIgZGlyZWN0aXZlcyBieSBwbGFjaW5nIHRoZW0gaW4gCi08Q09ERT48QSBIUkVGPSJtb2QvY29yZS5odG1sI2RpcmVjdG9yeSI+Jmx0O0RpcmVjdG9yeSZndDs8L0E+LAotPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNkaXJlY3RvcnltYXRjaCI+Jmx0O0RpcmVjdG9yeU1hdGNoJmd0OzwvQT4sCi08QSBIUkVGPSJtb2QvY29yZS5odG1sI2ZpbGVzIj4mbHQ7RmlsZXMmZ3Q7PC9BPiwKLTxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjZmlsZXNtYXRjaCI+Jmx0O0ZpbGVzTWF0Y2gmZ3Q7PC9BPiwKLTxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjbG9jYXRpb24iPiZsdDtMb2NhdGlvbiZndDs8L0E+LAotPC9DT0RFPiBhbmQgPENPREU+Ci08QSBIUkVGPSJtb2QvY29yZS5odG1sI2xvY2F0aW9ubWF0Y2giPiZsdDtMb2NhdGlvbk1hdGNoJmd0OzwvQT4KLTwvQ09ERT4KLXNlY3Rpb25zLiAgVGhlc2Ugc2VjdGlvbnMgbGltaXQgdGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmVzCi13aGljaCB0aGV5IGVuY2xvc2UgdG8gcGFydGljdWxhciBmaWxlc3lzdGVtIGxvY2F0aW9ucyBvciBVUkxzLiAgVGhleQotY2FuIGFsc28gYmUgbmVzdGVkLCBhbGxvd2luZyBmb3IgdmVyeSBmaW5lIGdyYWluZWQgY29uZmlndXJhdGlvbi4KLQotPFA+QXBhY2hlIGhhcyB0aGUgY2FwYWJpbGl0eSB0byBzZXJ2ZSBtYW55IGRpZmZlcmVudCB3ZWJzaXRlcwotc2ltdWx0YW5lb3VzbHkuICBUaGlzIGlzIGNhbGxlZCA8QSBIUkVGPSJ2aG9zdHMvIj5WaXJ0dWFsIEhvc3Rpbmc8L0E+LgotRGlyZWN0aXZlcyBjYW4gYWxzbyBiZSBzY29wZWQgYnkgcGxhY2luZyB0aGVtIGluc2lkZQotPENPREU+PEEgSFJFRj0ibW9kL2NvcmUuaHRtbCN2aXJ0dWFsaG9zdCI+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvQT48L0NPREU+Ci1zZWN0aW9ucywgc28gdGhhdCB0aGV5IHdpbGwgb25seSBhcHBseSB0byByZXF1ZXN0cyBmb3IgYSBwYXJ0aWN1bGFyCi13ZWJzaXRlLgotCi08UD5BbHRob3VnaCBtb3N0IGRpcmVjdGl2ZXMgY2FuIGJlIHBsYWNlZCBpbiBhbnkgb2YgdGhlc2Ugc2VjdGlvbnMsCi1zb21lIGRpcmVjdGl2ZXMgZG8gbm90IG1ha2Ugc2Vuc2UgaW4gc29tZSBjb250ZXh0cy4gIEZvciBleGFtcGxlLAotZGlyZWN0aXZlcyBjb250cm9sbGluZyBwcm9jZXNzIGNyZWF0aW9uIGNhbiBvbmx5IGJlIHBsYWNlZCBpbiB0aGUgbWFpbgotc2VydmVyIGNvbnRleHQuICBUbyBmaW5kIHdoaWNoIGRpcmVjdGl2ZXMgY2FuIGJlIHBsYWNlZCBpbiB3aGljaAotc2VjdGlvbnMsIGNoZWNrIHRoZSA8QQotSFJFRj0ibW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCI+Q29udGV4dDwvQT4gb2YgdGhlIGRpcmVjdGl2ZS4KLUZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCB3ZSBwcm92aWRlIGRldGFpbHMgb24gPEEKLUhSRUY9InNlY3Rpb25zLmh0bWwiPkhvdyBEaXJlY3RvcnksIExvY2F0aW9uIGFuZCBGaWxlcyBzZWN0aW9ucwotd29yazwvQT4uCi0KLTxIMj4uaHRhY2Nlc3MgRmlsZXM8L0gyPgotCi08UD5BcGFjaGUgYWxsb3dzIGZvciBkZWNlbnRyYWxpemVkIG1hbmFnZW1lbnQgb2YgY29uZmlndXJhdGlvbiB2aWEKLXNwZWNpYWwgZmlsZXMgcGxhY2VkIGluc2lkZSB0aGUgd2ViIHRyZWUuICBUaGUgc3BlY2lhbCBmaWxlcyBhcmUKLXVzdWFsbHkgY2FsbGVkIDxDT0RFPi5odGFjY2VzczwvQ09ERT4sIGJ1dCBhbnkgbmFtZSBjYW4gYmUgc3BlY2lmaWVkCi1pbiB0aGUgPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNhY2Nlc3NmaWxlbmFtZSI+PENPREUKLT5BY2Nlc3NGaWxlTmFtZTwvQ09ERT48L0E+IGRpcmVjdGl2ZS4gIERpcmVjdGl2ZXMgcGxhY2VkIGluCi08Q09ERT4uaHRhY2Nlc3M8L0NPREU+IGZpbGVzIGFwcGx5IHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgeW91IHBsYWNlCi10aGUgZmlsZSwgYW5kIGFsbCBzdWItZGlyZWN0b3JpZXMuICBUaGUgPENPREU+Lmh0YWNjZXNzPC9DT0RFPiBmaWxlcwotZm9sbG93IHRoZSBzYW1lIHN5bnRheCBhcyB0aGUgbWFpbiBjb25maWd1cmF0aW9uIGZpbGVzLiAgU2luY2UKLTxDT0RFPi5odGFjY2VzczwvQ09ERT4gZmlsZXMgYXJlIHJlYWQgb24gZXZlcnkgcmVxdWVzdCwgcmF0aGVyIHRoYW4KLW9ubHkgYXQgc2VydmVyIHN0YXJ0dXAsIGNoYW5nZXMgbWFkZSBpbiB0aGVzZSBmaWxlcyB0YWtlIGltbWVkaWF0ZQotZWZmZWN0LgotCi08UD5UbyBmaW5kIHdoaWNoIGRpcmVjdGl2ZXMgY2FuIGJlIHBsYWNlZCBpbiA8Q09ERT4uaHRhY2Nlc3M8L0NPREU+Ci1maWxlcywgY2hlY2sgdGhlIDxBIEhSRUY9Im1vZC9kaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiPkNvbnRleHQ8L0E+Ci1vZiB0aGUgZGlyZWN0aXZlLiAgVGhlIHNlcnZlciBhZG1pbmlzdHJhdG9yIGZ1cnRoZXIgY29udHJvbHMgd2hhdAotZGlyZWN0aXZlcyBtYXkgYmUgcGxhY2VkIGluIDxDT0RFPi5odGFjY2VzczwvQ09ERT4gZmlsZXMgYnkKLWNvbmZpZ3VyaW5nIHRoZSA8QQotSFJFRj0ibW9kL2NvcmUuaHRtbCNhbGxvd292ZXJyaWRlIj48Q09ERT5BbGxvd092ZXJyaWRlPC9DT0RFPjwvQT4KLWRpcmVjdGl2ZSBpbiB0aGUgbWFpbiBjb25maWd1cmF0aW9uIGZpbGVzLgotCi08SDI+TG9nIGZpbGVzPC9IMj4KLTxIMz5zZWN1cml0eSB3YXJuaW5nPC9IMz4KLUFueW9uZSB3aG8gY2FuIHdyaXRlIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgQXBhY2hlIGlzIHdyaXRpbmcgYQotbG9nIGZpbGUgY2FuIGFsbW9zdCBjZXJ0YWlubHkgZ2FpbiBhY2Nlc3MgdG8gdGhlIHVpZCB0aGF0IHRoZSBzZXJ2ZXIgaXMKLXN0YXJ0ZWQgYXMsIHdoaWNoIGlzIG5vcm1hbGx5IHJvb3QuICBEbyA8RU0+Tk9UPC9FTT4gZ2l2ZSBwZW9wbGUgd3JpdGUKLWFjY2VzcyB0byB0aGUgZGlyZWN0b3J5IHRoZSBsb2dzIGFyZSBzdG9yZWQgaW4gd2l0aG91dCBiZWluZyBhd2FyZSBvZgotdGhlIGNvbnNlcXVlbmNlczsgc2VlIHRoZSA8QSBIUkVGPSJtaXNjL3NlY3VyaXR5X3RpcHMuaHRtbCI+c2VjdXJpdHkgdGlwczwvQT4KLWRvY3VtZW50IGZvciBkZXRhaWxzLgotCi08SDM+cGlkIGZpbGU8L0gzPgotCi08UD5PbiBzdGFydHVwLCBBcGFjaGUgc2F2ZXMgdGhlIHByb2Nlc3MgaWQgb2YgdGhlIHBhcmVudCBodHRwZCBwcm9jZXNzIHRvCi10aGUgZmlsZSA8Q09ERT5sb2dzL2h0dHBkLnBpZDwvQ09ERT4uIFRoaXMgZmlsZW5hbWUgY2FuIGJlIGNoYW5nZWQKLXdpdGggdGhlIDxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjcGlkZmlsZSI+UGlkRmlsZTwvQT4gZGlyZWN0aXZlLiBUaGUKLXByb2Nlc3MtaWQgaXMgZm9yIHVzZSBieSB0aGUgYWRtaW5pc3RyYXRvciBpbiByZXN0YXJ0aW5nIGFuZAotdGVybWluYXRpbmcgdGhlIGRhZW1vbjogb24gVW5peCwgYSBIVVAgb3IgVVNSMSBzaWduYWwgY2F1c2VzIHRoZQotZGFlbW9uIHRvIHJlLXJlYWQgaXRzIGNvbmZpZ3VyYXRpb24gZmlsZXMgYW5kIGEgVEVSTSBzaWduYWwgY2F1c2VzIGl0Ci10byBkaWUgZ3JhY2VmdWxseTsgb24gV2luZG93cywgdXNlIHRoZSAtayBjb21tYW5kIGxpbmUgb3B0aW9uIGluc3RlYWQuCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgdGhlIDxBIEhSRUY9InN0b3BwaW5nLmh0bWwiPlN0b3BwaW5nIGFuZAotUmVzdGFydGluZzwvQT4gcGFnZS4KLQotPFA+Ci1JZiB0aGUgcHJvY2VzcyBkaWVzIChvciBpcyBraWxsZWQpIGFibm9ybWFsbHksIHRoZW4gaXQgd2lsbCBiZSBuZWNlc3NhcnkgdG8KLWtpbGwgdGhlIGNoaWxkcmVuIGh0dHBkIHByb2Nlc3Nlcy4KLQotPEgzPkVycm9yIGxvZzwvSDM+Ci0KLTxQPlRoZSBzZXJ2ZXIgd2lsbCBsb2cgZXJyb3IgbWVzc2FnZXMgdG8gYSBsb2cgZmlsZSwgYnkgZGVmYXVsdAotPENPREU+bG9ncy9lcnJvcl9sb2c8L0NPREU+IG9uIFVuaXggb3IgPENPREU+bG9ncy9lcnJvci5sb2c8L0NPREU+IG9uCi1XaW5kb3dzIGFuZCBPUy8yLiBUaGUgZmlsZW5hbWUgY2FuIGJlIHNldCB1c2luZyB0aGUgPEEKLUhSRUY9Im1vZC9jb3JlLmh0bWwjZXJyb3Jsb2ciPkVycm9yTG9nPC9BPiBkaXJlY3RpdmU7IGRpZmZlcmVudCBlcnJvcgotbG9ncyBjYW4gYmUgc2V0IGZvciBkaWZmZXJlbnQgPEEKLUhSRUY9Im1vZC9jb3JlLmh0bWwjdmlydHVhbGhvc3QiPnZpcnR1YWwgaG9zdHM8L0E+LgotCi08SDM+VHJhbnNmZXIgbG9nPC9IMz4KLQotPFA+VGhlIHNlcnZlciB3aWxsIHR5cGljYWxseSBsb2cgZWFjaCByZXF1ZXN0IHRvIGEgdHJhbnNmZXIgZmlsZSwgYnkKLWRlZmF1bHQgPENPREU+bG9ncy9hY2Nlc3NfbG9nPC9DT0RFPiBvbiBVbml4IG9yCi08Q09ERT5sb2dzL2FjY2Vzcy5sb2c8L0NPREU+IG9uIFdpbmRvd3MgYW5kIE9TLzIuIFRoZSBmaWxlbmFtZSBjYW4gYmUKLXNldCB1c2luZyBhIDxBIEhSRUY9Im1vZC9tb2RfbG9nX2NvbmZpZy5odG1sI2N1c3RvbWxvZyI+Q3VzdG9tTG9nPC9BPgotZGlyZWN0aXZlOyBkaWZmZXJlbnQgdHJhbnNmZXIgbG9ncyBjYW4gYmUgc2V0IGZvciBkaWZmZXJlbnQgPEEKLUhSRUY9Im1vZC9jb3JlLmh0bWwjdmlydHVhbGhvc3QiPnZpcnR1YWwgaG9zdHM8L0E+LgotCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9jb25maWd1cmluZy5odG1sLmphLmppcyBiL2RvY3MvbWFudWFsL2NvbmZpZ3VyaW5nLmh0bWwuamEuamlzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWI0MWU1Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2NvbmZpZ3VyaW5nLmh0bWwuamEuamlzCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+GyRCQF9EaiVVJSElJCVrGyhCPC90aXRsZT4KLTwvaGVhZD4KLTwhLS0gRW5nbGlzaCByZXZpc2lvbjogMS44IC0tPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Ym9keQotIGJnY29sb3I9IiNGRkZGRkYiCi0gdGV4dD0iIzAwMDAwMCIKLSBsaW5rPSIjMDAwMEZGIgotIHZsaW5rPSIjMDAwMDgwIgotIGFsaW5rPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxoMSBhbGlnbj0iQ0VOVEVSIj4bJEIlVSUhJSQlayROQF9EahsoQjwvaDE+Ci0KLTx1bD4KLTxsaT48YSBocmVmPSIjbWFpbiI+GyRCJWElJCVzJE5AX0RqJVUlISUkJWsbKEI8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjc3ludGF4Ij4bJEJAX0RqJVUlISUkJWskTjk9SjgbKEI8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjbW9kdWxlcyI+GyRCJWIlOCVlITwlaxsoQjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNzY29wZSI+GyRCJUclIyVsJS8lRiUjJVYkTkUsTVFITzBPGyhCPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI2h0YWNjZXNzIj4uaHRhY2Nlc3MgGyRCJVUlISUkJWsbKEI8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjbG9ncyI+GyRCJW0lMCVVJSElJCVrGyhCPC9hPjwvbGk+Ci08L3VsPgotCi08aHI+Ci0KLTxoMj48YSBuYW1lPSJtYWluIj4bJEIlYSUkJXMkTkBfRGolVSUhJSQlaxsoQjwvYT48L2gyPgotCi08dGFibGUgYm9yZGVyPSIxIj48dHI+PHRkIHZhbGlnbj0idG9wIj4KLTxzdHJvbmc+GyRCNFhPIiViJTglZSE8JWsbKEI8L3N0cm9uZz48YnI+PGJyPgotPGEgaHJlZj0ibW9kL21vZF9taW1lLmh0bWwiPm1vZF9taW1lPC9hPjxicj4KLTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCI+Ci08c3Ryb25nPhskQjRYTyIlRyUjJWwlLyVGJSMlVhsoQjwvc3Ryb25nPjxicj48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI2lmZGVmaW5lIj4mbHQ7SWZEZWZpbmUmZ3Q7PC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjaW5jbHVkZSI+SW5jbHVkZTwvYT48YnI+Ci08YSBocmVmPSJtb2QvbW9kX21pbWUuaHRtbCN0eXBlc2NvbmZpZyI+VHlwZXNDb25maWc8L2E+PGJyPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPkFwYWNoZSAbJEIkTxsoQiA8YSBocmVmPSJtb2QvZGlyZWN0aXZlcy5odG1sIj4bJEIlRyUjJWwlLyVGJSMlVhsoQjwvYT4gGyRCJHIbKEIKLRskQkBfRGolVSUhJSQlayRLSj9KOCRHPXEkLyQzJEgkSyRoJGpAX0RqJDckXiQ5ISMlYSUkJXMkThsoQgotGyRCQF9EaiVVJSElJCVrJE9JYURMJE8bKEIgPGNvZGU+aHR0cGQuY29uZjwvY29kZT4gGyRCJEgkJCQmTD5BMCRHJDkhIxsoQgotGyRCJDMkTiVVJSElJCVrJE4wTENWJE8lMyVzJVElJCVrO34kS0BfRGokNSRsJF4kOSQsISIlMyVeJXMlSSVpJSQlcyROGyhCCi08Y29kZT4tZjwvY29kZT4gGyRCJVUlaSUwJEskaCRqPmU9cSQtJEckLSReJDkhIyQ9JE4+ZSEiQj4kTkBfRGolVSUhJSQlayQsGyhCCi08Y29kZT48YSBocmVmPSJtb2QvY29yZS5odG1sI2luY2x1ZGUiPkluY2x1ZGU8L2E+PC9jb2RlPiAbJEIlRyUjJWwlLyVGJSMlVhsoQgotGyRCJEskaCRDJEZESTJDJDUkbCRGJCQkayQrJGIkNyRsJF4kOyRzISMkSSROJUclIyVsJS8lRiUjJVYkYhsoQgotGyRCJDMkbCRpJE5AX0RqJVUlISUkJWskTiRJJGwkSyRHJGJGfiRsJGkkbCReJDkhIxsoQkFwYWNoZSAbJEIkTzUvRjA7fiQrGyhCCi0bJEI6RjUvRjA7fiROJF8lYSUkJXNAX0RqJVUlISUkJWskTkpROTkkckcnPDEkNyReJDkhIxsoQjwvcD4KLQotPHA+QXBhY2hlIDEuMy4xMyAbJEIkTj83JDckJDUhRz0kSCQ3JEYhIkBfRGolVSUhJSQlayQsPEI6XSRPJUclIyVsJS8lSCVqJEcbKEIKLRskQiQiJGskSCQtJEskTyQ9JE4lRyUjJWwlLyVIJWokRzgrJEQkKyRDJD8kOSRZJEYkTiVVJSElJCVrGyhCCi0oGyRCJEglNSVWJUclIyVsJS8lSCVqGyhCKSAbJEIkcjJyQE8kOSRrJEgkJCQmJGIkTiQsJCIkaiReJDkhI014TVFLISRIJDckRiRPISIbKEIKLRskQiVQITwlQSVjJWslWyU5JUgkckRJMkMkOSRrJEgkLSRLISIkPSRsJD4kbCROJVslOSVIJEtCUCQ3JEY+LiQ1JEpAX0RqGyhCCi0bJEIlVSUhJSQlayRyOm4kaiEiQF9EaiVHJSMlbCUvJUglaiRLQ1YkLyRIJCQkJiRiJE4kLDVzJDIkaSRsJF4kOSEjGyhCCi0bJEIkMyQmJDkkayRIISJDMSRLJVUlISUkJWskTkRJMkMhIjpvPXwkciQ5JGskMyRIJEskaCRqQTQkLyVVJSElJCVrJHIbKEIKLRskQkpUPTgkOSRrJDMkSCRKJC8lUCE8JUElYyVrJVslOSVIJE5ESTJDISI6bz18JCwkRyQtJF4kOSEjJDMkbCRPPCtGMDI9JHIbKEIKLRskQiQ6JEMkSDRKQzEkSyQ3JF4kOSEjGyhCPC9wPgotCi08cD4KLRskQiU1ITwlUCRPGyhCIG1pbWUgGyRCJUklLSVlJWElcyVIJT8lJCVXJHI0XiRzJEckJCRrJVUlISUkJWskYkZJJF85fiRfJF4kOSEjGyhCCi0bJEIlVSUhJSQla0w+JE8bKEIgPGEgaHJlZj0ibW9kL21vZF9taW1lLmh0bWwjdHlwZXNjb25maWciCi0+VHlwZXNDb25maWc8L2E+IBskQiRHQF9EaiQ1JGwhIiVHJVUlKSVrJUgkRxsoQiA8Y29kZT5taW1lLnR5cGVzPC9jb2RlPgotGyRCJEskSiRDJEYkJCReJDkhIxsoQjwvcD4KLTxocj4KLQotPGgyPjxhIG5hbWU9InN5bnRheCI+GyRCQF9EaiVVJSElJCVrJE45PUo4GyhCPC9hPjwvaDI+Ci0KLTxwPkFwYWNoZSAbJEJAX0RqJVUlISUkJWskTxsoQjEbJEI5VCRLGyhCMRskQiREJE4lRyUjJWwlLyVGJSMlViQrJGkkSiRqJF4kOSEjGyhCCi0bJEIlUCVDJS8lOSVpJUMlNyVlGyhCICJcIiAbJEIkTyVHJSMlbCUvJUYlIyVWJCw8ISROOVQkSzdRQjMkNyRGJCQkayQzJEgkchsoQgotGyRCPCgkOSQ/JGEkSzlUJE46RzhlJE5KODt6JEgkNyRGO0gkbyRsJEYkJCRrJCskYiQ3JGwkXiQ7JHMhIxsoQgotGyRCOVQkTjpHOGUkSCVQJUMlLyU5JWklQyU3JWUkTjRWJEtCPiROSjg7eiRkNnVHciQsJCIkQyRGJE8kJCQxJF4kOyRzISMbKEI8L3A+Ci0KLTxwPhskQkBfRGolVSUhJSQlayROJUclIyVsJS8lRiUjJVYkT0JnSjg7ej4uSjg7eiRyNmhKTCQ3JF4kOyRzJCwhIhsoQgotGyRCMHo/dCRLJE8kNyRQJDckUDZoSkwkOSRrJGIkTiQsJCIkaiReJDkhIyVPJUMlNyVlSjg7ehsoQiAiIyIgGyRCJEc7TyReJGs5VCRPGyhCCi0bJEIlMyVhJXMlSCRIOCskSiQ1JGwkRkw1O2skNSRsJF4kOSEjQF9EaiVHJSMlbCUvJUYlIyVWJE44ZSROOVQkRyRPGyhCCi0bJEIlMyVhJXMlSCQsNF4kXiRsJEYkJCRGJE8bKEI8c3Ryb25nPhskQiQkJDEkXiQ7JHMbKEI8L3N0cm9uZz4bJEIhIyVHJSMlbCUvJUYlIyVWJE4bKEIKLRskQkEwJE42dTlUJEg2dUdyJE9MNTtrJDUkbCReJDkkTiRHISIkbyQrJGokZCQ5JC8kOSRrJD8kYSRLJUclIyVsJS8lRiUjJVYkchsoQgotGyRCJSQlcyVHJXMlSCQ5JGskMyRIJCwkRyQtJF4kOSEjGyhCPC9wPgotCi08cD4bJEJAX0RqJVUlISUkJWskTjk9SjglKCVpITwkTxsoQgotPGNvZGU+YXBhY2hlY3RsIGNvbmZpZ3Rlc3Q8L2NvZGU+IBskQiQrJTMlXiVzJUklaSUkJXMlKiVXJTclZyVzGyhCCi08Y29kZT4tdDwvY29kZT4gGyRCJHI7SCRDJEZENCRZJGkkbCReJDkhIxsoQjwvcD4KLQotPGhyPgotCi08aDI+PGEgbmFtZT0ibW9kdWxlcyI+GyRCJWIlOCVlITwlaxsoQjwvYT48L2gyPgotCi08dGFibGUgYm9yZGVyPSIxIj48dHI+PHRkIHZhbGlnbj0idG9wIj4KLTxzdHJvbmc+GyRCNFhPIiViJTglZSE8JWsbKEI8L3N0cm9uZz48YnI+PGJyPgotPGEgaHJlZj0ibW9kL21vZF9zby5odG1sIj5tb2Rfc288L2E+PGJyPgotPC90ZD4KLTx0ZCB2YWxpZ249InRvcCI+Ci08c3Ryb25nPhskQjRYTyIlRyUjJWwlLyVGJSMlVhsoQjwvc3Ryb25nPjxicj48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI2FkZG1vZHVsZSI+QWRkTW9kdWxlPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjY2xlYXJtb2R1bGVsaXN0Ij5DbGVhck1vZHVsZUxpc3Q8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNpZm1vZHVsZSI+Jmx0O0lmTW9kdWxlJmd0OzwvYT48YnI+Ci08YSBocmVmPSJtb2QvbW9kX3NvLmh0bWwjbG9hZG1vZHVsZSI+TG9hZE1vZHVsZTwvYT48YnI+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+QXBhY2hlIBskQiRPJWIlOCVlITwlazI9JDUkbCQ/JTUhPCVQJEckOSEjJTMlIiU1ITwlUCRLJE8bKEIKLRskQjBsSFY0cEtcRSokSjUhRz0kQCQxJCw0XiReJGwkRiQkJF4kOSEjM0hEJTUhRz0kTxsoQiBBcGFjaGUgGyRCJEsbKEIKLRskQiVtITwlSSQ1JGwkaxsoQjxhIGhyZWY9Im1vZC9pbmRleC1ieXR5cGUuaHRtbCI+GyRCJWIlOCVlITwlaxsoQjwvYT4bJEIkSCQ3JEYbKEIKLRskQk14TVEyREc9JEckOSEjJUclVSUpJWslSCRHJE8lMyVzJVElJCVrO34kSyViJTglZSE8JWskThsoQjxhCi1ocmVmPSJtb2QvbW9kdWxlLWRpY3QuaHRtbCNTdGF0dXMiPhskQjRwS1wbKEI8L2E+GyRCJTslQyVIJCwbKEIKLRskQiU1ITwlUCRLNF4kXiRsJF4kOSEjJTUhPCVQJCwbKEI8YSBocmVmPSJkc28uaHRtbCI+GyRCRjBFKiVtITwlSRsoQjwvYT4bJEIlYiU4JWUhPCVrJHIbKEIKLRskQjtIJCYkaCQmJEslMyVzJVElJCVrJDUkbCRGJCQkaz5sOWckTyEiJWIlOCVlITwlayRySkwkSyUzJXMlUSUkJWskNyRGISIbKEIKLRskQiQkJEQkRyRiGyhCIDxhIGhyZWY9Im1vZC9tb2Rfc28uaHRtbCNsb2FkbW9kdWxlIj5Mb2FkTW9kdWxlPC9hPgotGyRCJUclIyVsJS8lRiUjJVYkcjtIJEMkRkRJMkMkRyQtJF4kOSEjJD0kJiRHJEokJD5sOWckTyEiJWIlOCVlITwlayROGyhCCi0bJEJESTJDJGQ6bz18JHIkOSRrJD8kYSRLJE8bKEIgQXBhY2hlIBskQiRyOkYlMyVzJVElJCVrJDkka0ksTVckLCQiJGokXiQ5ISMbKEIKLRskQkBfRGolRyUjJWwlLyVGJSMlViRPGyhCIDxhCi1ocmVmPSJtb2QvY29yZS5odG1sI2lmbW9kdWxlIj4mbHQ7SWZNb2R1bGUmZ3Q7PC9hPiAbJEIlViVtJUMlLyRLGyhCCi0bJEJGfiRsJGskMyRIJEdGQ0RqJE4lYiU4JWUhPCVrJCxCODpfJDkkayRIJC0kQCQxGyhCCi0bJEJAX0RqJVUlISUkJWskSzReJF4kbCRrJGgkJiRLJDkkayQzJEgkLCRHJC0kXiQ5ISMbKEI8L3A+Ci0KLTxwPhskQiUzJV4lcyVJJWklJCVzJSolVyU3JWclcxsoQiA8Y29kZT4tbDwvY29kZT4gGyRCJHI7SCRDJEYbKEIKLRskQjg9O35FQCRHJEkkTiViJTglZSE8JWskLCU1ITwlUCRLJTMlcyVRJSQlayQ1JGwkRiQkJGskKyRyGyhCCi0bJEJDTiRrJDMkSCQsJEckLSReJDkhIxsoQgotCi08aHI+Ci0KLTxoMj48YSBuYW1lPSJzY29wZSI+GyRCJUclIyVsJS8lRiUjJVYkTkUsTVFITzBPGyhCPC9hPjwvaDI+Ci0KLTx0YWJsZSBib3JkZXI9IjEiPjx0cj48dGQgdmFsaWduPSJ0b3AiPgotPHN0cm9uZz4bJEI0WE8iJUclIyVsJS8lRiUjJVYbKEI8L3N0cm9uZz48YnI+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNkaXJlY3RvcnkiPiZsdDtEaXJlY3RvcnkmZ3Q7PC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjZGlyZWN0b3J5bWF0Y2giPiZsdDtEaXJlY3RvcnlNYXRjaCZndDs8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNmaWxlcyI+Jmx0O0ZpbGVzJmd0OzwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI2ZpbGVzbWF0Y2giPiZsdDtGaWxlc01hdGNoJmd0OzwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI2xvY2F0aW9uIj4mbHQ7TG9jYXRpb24mZ3Q7PC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjbG9jYXRpb25tYXRjaCI+Jmx0O0xvY2F0aW9uTWF0Y2gmZ3Q7PC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjdmlydHVhbGhvc3QiPiZsdDtWaXJ0dWFsSG9zdCZndDs8L2E+PGJyPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPhskQiVhJSQlc0BfRGolVSUhJSQlayRLJCIkayVHJSMlbCUvJUYlIyVWJE8lNSE8JVBBNEJOJEtFLE1RJDUkbCReJDkhIxsoQgotGyRCJTUhPCVQJE4wbEl0SiwkTkBfRGokQCQxJHJKUTk5JDckPyQkPmw5ZyRPGyhCCi08Y29kZT48YSBocmVmPSJtb2QvY29yZS5odG1sI2RpcmVjdG9yeSI+Jmx0O0RpcmVjdG9yeSZndDs8L2E+LAotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNkaXJlY3RvcnltYXRjaCI+Jmx0O0RpcmVjdG9yeU1hdGNoJmd0OzwvYT4sCi08YSBocmVmPSJtb2QvY29yZS5odG1sI2ZpbGVzIj4mbHQ7RmlsZXMmZ3Q7PC9hPiwKLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjZmlsZXNtYXRjaCI+Jmx0O0ZpbGVzTWF0Y2gmZ3Q7PC9hPiwKLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjbG9jYXRpb24iPiZsdDtMb2NhdGlvbiZndDs8L2E+LAotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNsb2NhdGlvbm1hdGNoIj4mbHQ7TG9jYXRpb25NYXRjaCZndDs8L2E+Ci08L2NvZGU+Ci0bJEIlOyUvJTclZyVzJE5DZiRLQ1YkLyQzJEgkR0UsTVFITzBPJHI3aCRhJGkkbCReJDkhIyQzJGwkaSROJTslLyU3JWclcyRPGyhCCi0bJEIkPSROQ2YkSyQiJGslRyUjJWwlLyVGJSMlViRORSxNUUhPME8kckZDRGokTiVVJSElJCVrJTclOSVGJWAkTjBMQ1YkZBsoQgotVVJMIBskQiRLOEJEaiQ3JF4kOSEjSHM+byRLOllOM0VZJE5AX0RqJHIyREc9JEskOSRrJD8kYSRLISIlOyUvJTclZyVzJHIbKEIKLRskQkZ+JGw7UiRLJDkkayQzJEgkYiRHJC0kXiQ5ISMbKEI8L3A+Ci0KLTxwPkFwYWNoZSAbJEIkT0YxO34kS0I/JC8kTjBjJCYlJiUnJVYlNSUkJUgkcjA3JCZHPU5PJCwkIiRqJF4kOSEjGyhCCi0bJEIkMyRsJE8bKEIgPGEgaHJlZj0idmhvc3RzLyI+GyRCJVAhPCVBJWMlayVbJTklSBsoQjwvYT4gGyRCJEg4RiRQJGwkRiQkJF4kOSEjGyhCCi0bJEJGQ0RqJE4lJiUnJVYlNSUkJUgkSyROJF9FLE1RJDUkbCRrJGgkJiRLJDkkayQ/JGEkSyEiJUclIyVsJS8lRiUjJVYkTxsoQgotPGNvZGU+PGEgaHJlZj0ibW9kL2NvcmUuaHRtbCN2aXJ0dWFsaG9zdCI+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvYT48L2NvZGU+Ci0bJEIlOyUvJTclZyVzJE5DZiRLQ1YkLyQzJEgkRyRiRSxNUUhPME8kckpRJCgkayQzJEgkLCRHJC0kXiQ5ISMbKEI8L3A+Ci0KLTxwPhskQiRbJEgkcyRJJE4lRyUjJWwlLyVGJSMlViRPJEkkTiU7JS8lNyVnJXMkSyRHJGI9cSQxJF4kOSQsISIbKEIKLRskQkNmJEskTyUzJXMlRiUtJTklSCRLJGgkQyRGJE8wVUwjJHIkSiQ1JEokJCRiJE4kYiQiJGokXiQ5ISNOYyQoJFAhIhsoQgotGyRCJVclbSU7JTkkTjpuQC4kckApOGYkNyRGJCQkayVHJSMlbCUvJUYlIyVWJE8lYSUkJXMlNSE8JVAkTiUzJXMlRiUtJTklSCRLGyhCCi0bJEIkTiRfPXEkLyQzJEgkLCRHJC0kXiQ5ISMkSSROJUclIyVsJS8lRiUjJVYkciRJJE4lOyUvJTclZyVzJEs9cSQvJDMkSCQsGyhCCi0bJEIkRyQtJGskKyRyQ04kayQ/JGEkSyRPJUclIyVsJS8lRiUjJVYkThsoQgotPGEgaHJlZj0ibW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCI+GyRCJTMlcyVGJS0lOSVIGyhCPC9hPhskQiRyRDQkWSRGJC8kQCQ1JCQhIxsoQgotGyRCPlwkNyQkPnBKcyRPISIbKEI8YQotaHJlZj0ic2VjdGlvbnMuaHRtbCI+RGlyZWN0b3J5LCBMb2NhdGlvbiwgRmlsZXMgGyRCJTslLyU3JWclcyRORjA6bkshGyhCPC9hPgotGyRCJEskIiRqJF4kOSEjGyhCPC9wPgotCi08aHI+Ci0KLTxoMj48YSBuYW1lPSJodGFjY2VzcyI+Lmh0YWNjZXNzIBskQiVVJSElJCVrGyhCPC9hPjwvaDI+Ci0KLTx0YWJsZSBib3JkZXI9IjEiPjx0cj48dGQgdmFsaWduPSJ0b3AiPgotPHN0cm9uZz4bJEI0WE8iJUclIyVsJS8lRiUjJVYbKEI8L3N0cm9uZz48YnI+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNhY2Nlc3NmaWxlbmFtZSI+QWNjZXNzRmlsZU5hbWU8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNhbGxvd292ZXJyaWRlIj5BbGxvd092ZXJyaWRlPC9hPjxicj4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD5BcGFjaGUgGyRCJEckTyUmJSclViVEJWohPCROQ2YkS0NWJCskbCQ/RkNKTCRKJVUlISUkJWskcjtIJEMkRhsoQgotGyRCSHNDZjF7PTg4IkUqJEpAX0RqNElNfSRyJEckLSReJDkhIyQ9JE5GQ0pMJEolVSUhJSQlayRPSWFETCRPGyhCCi08Y29kZT4uaHRhY2Nlc3M8L2NvZGU+IBskQiRIJCQkJkw+QTAkRyEiGyhCCi08YSBocmVmPSJtb2QvY29yZS5odG1sI2FjY2Vzc2ZpbGVuYW1lIj48Y29kZQotPkFjY2Vzc0ZpbGVOYW1lPC9jb2RlPjwvYT4gGyRCJUclIyVsJS8lRiUjJVYkRyRJJHMkSkw+QTAkRyRiO1hEaiRHJC0kXiQ5ISMbKEIKLTxjb2RlPi5odGFjY2VzczwvY29kZT4gGyRCJVUlISUkJWskSz1xJCskbCQ/JUclIyVsJS8lRiUjJVYkTyVVJSElJCVrJHIbKEIKLRskQkNWJCQkPyVHJSMlbCUvJUglaiRIJD0kTkE0JEYkTiU1JVYlRyUjJWwlLyVIJWokS0UsTVEkNSRsJF4kOSEjGyhCCi08Y29kZT4uaHRhY2Nlc3M8L2NvZGU+IBskQiVVJSElJCVrJE8kOSRZJEYkTiVqJS8lKCU5JUgkRxsoQgotGyRCRkkkXzl+JF4kbCRrJD8kYSEiSlE5OSRPJDkkMCRLSD8xRyQ1JGwkXiQ5ISMbKEIKLQotPHA+GyRCJEkkTiVHJSMlbCUvJUYlIyVWJCwbKEIgPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiAbJEIlVSUhJSQlayRLPXEkMSRrJCskchsoQgotGyRCRDQkWSRrJEskTyEiJUclIyVsJS8lRiUjJVYkThsoQgotPGEgaHJlZj0ibW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCI+GyRCJTMlcyVGJS0lOSVIGyhCPC9hPiAbJEIkckQ0JFkkRiQvJEAkNSQkISMbKEIKLRskQiU1ITwlUDRJTX08VCRPJDUkaSRLJWElJCVzQF9EaiVVJSElJCVrJE4bKEIgPGEKLWhyZWY9Im1vZC9jb3JlLmh0bWwjYWxsb3dvdmVycmlkZSI+PGNvZGU+QWxsb3dPdmVycmlkZTwvY29kZT48L2E+Ci0bJEIkckBfRGokOSRrJDMkSCRHJEkkTiVHJSMlbCUvJUYlIyVWJHIbKEIgPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiAbJEIlVSUhJSQlayRLGyhCCi0bJEI9cSQxJGskaCQmJEskOSRrJCskckApOGYkOSRrJDMkSCQsJEckLSReJDkhIxsoQjwvcD4KLQotPGhyPgotCi08aDI+PGEgbmFtZT0ibG9ncyI+GyRCJW0lMCVVJSElJCVrGyhCPC9hPjwvaDI+Ci08IS0tIFhYWDogVGhpcyBzZWN0aW9uIHNob3VsZCBiZSBtb3ZlZCB0byBpdHMgb3duIGZpbGUgLS0+Ci08aDM+GyRCJTslLSVlJWolRiUjJEs0WCQ5JGs3WTlwGyhCPC9oMz4KLTxwPgotQXBhY2hlIBskQiQsJW0lMCVVJSElJCVrJHI9cSQkJEYkJCRrJUclIyVsJS8lSCVqJEs9cSQtOX4kYSRrP00kT0MvJEckYhsoQgotGyRCJFskXDNOPEIkSyU1ITwlUCQsNS9GMCQ1JGwkPxsoQiB1aWQgGyRCJE4lIiUvJTslOSRyPGhGQCRHJC0kXiQ5ISMbKEIKLRskQiQ9JDckRiQ9JGwkT0lhREwbKEIgcm9vdCAbJEIkRyQ5ISMkPSRON2syTCRyJGgkLyRvJCskaSQ6JEslbSUwJCxKXTRJJDUkbCRGJCQkaxsoQgotGyRCJUclIyVsJS8lSCVqJEs9cSQtOX4kXzgiOEIkck0/JCgkPyRqGyhCPGVtPhskQiQ3JEokJBsoQjwvZW0+GyRCJEckLyRAJDUkJCEjPlw6WSRPGyhCCi08YSBocmVmPSJtaXNjL3NlY3VyaXR5X3RpcHMuaHRtbCI+GyRCJTslLSVlJWolRiUjPnBKcxsoQjwvYT4bJEIkcjsyPkgkNyRGJC8kQCQ1JCQhIxsoQjwvcD4KLQotPGgzPnBpZCAbJEIlVSUhJSQlaxsoQjwvaDM+Ci0KLTxwPhskQjUvRjA7fiRLGyhCIEFwYWNoZSAbJEIkTz9GGyhCIGh0dHBkIBskQiVXJW0lOyU5JE4lVyVtJTslORsoQiBJRCAbJEIkchsoQgotPGNvZGU+bG9ncy9odHRwZC5waWQ8L2NvZGU+IBskQiVVJSElJCVrJEtKXUI4JDckXiQ5ISMkMyROJVUlISUkJWtMPiRPGyhCCi08YSBocmVmPSJtb2QvY29yZS5odG1sI3BpZGZpbGUiPlBpZEZpbGU8L2E+Ci0bJEIlRyUjJWwlLyVGJSMlViRHSlE5OSQ5JGskMyRIJCwkRyQtJF4kOSEjJVclbSU7JTkbKEIgSUQgGyRCJE80SU19PFQkLCVHITwlYiVzJHIbKEIKLRskQjpGNS9GMCQ3JD8kaj0qTjskNyQ/JGokOSRrJD8kYSRLO0gkJCReJDkhIxsoQlVuaXggGyRCJEckTxsoQiBIVVAgGyRCJEgbKEIgVVNSMSAbJEIlNyUwJUolayRHGyhCCi0bJEIlRyE8JWIlcyQsQF9EaiVVJSElJCVrJHI6RkZJJF85fiRfJDckXiQ5ISMbKEJURVJNIBskQiU3JTAlSiVrJE8lRyE8JWIlcyRyGyhCCi0bJEJNJTJtJEs9Kk47JDUkOyReJDkhIxsoQldpbmRvd3MgGyRCJEckTyEiQmUkbyRqJEslMyVeJXMlSSVpJSQlcyUqJVclNyVnJXMbKEIgLWsgGyRCJHIbKEIKLRskQjtIJCQkXiQ5ISMbKEIKLRskQj5cJDckJD5wSnMkTxsoQjxhIGhyZWY9InN0b3BwaW5nLmh0bWwiPhskQjUvRjAkSD0qTjsbKEI8L2E+GyRCJHI7Mj5IJDckRiQvJEAkNSQkISMbKEI8L3A+Ci0KLTxwPgotGyRCJVclbSU7JTkkLDBbPm89Kk47JDkkaxsoQiAoGyRCJGIkNyQvJE8bKEIga2lsbCAbJEIkNSRsJGsbKEIpIBskQiRIISI7UhsoQiBodHRwZCAbJEIlVyVtJTslOSRyGyhCCi1raWxsIBskQiQ5JGtJLE1XJCwkIiRqJF4kOSEjGyhCPC9wPgotCi08aDM+GyRCJSglaSE8JW0lMBsoQjwvaDM+Ci0KLTxwPhskQiU1ITwlUCRPJSglaSE8JWElQyU7ITwlOCRyJW0lMCVVJSElJCVrJEs1LU8/JDckXiQ5ISMlRyVVJSklayVIJE8hIhsoQlVuaXgKLRskQiRHJE8bKEIgPGNvZGU+bG9ncy9lcnJvcl9sb2c8L2NvZGU+IBskQiRHGyhCIFdpbmRvd3MgGyRCJEgbKEIgT1MvMiAbJEIkRyRPGyhCCi08Y29kZT5sb2dzL2Vycm9yLmxvZzwvY29kZT4gGyRCJEckOSEjJVUlISUkJWtMPiRPGyhCIDxhCi1ocmVmPSJtb2QvY29yZS5odG1sI2Vycm9ybG9nIj5FcnJvckxvZzwvYT4gGyRCJUclIyVsJS8lRiUjJVYkR0BfRGokRyQtJF4kOSEjGyhCCi0bJEIwYyQmGyhCPGEKLWhyZWY9Im1vZC9jb3JlLmh0bWwjdmlydHVhbGhvc3QiPhskQiVQITwlQSVjJWslWyU5JUgbKEI8L2E+Ci0bJEIkSzBjJCYlKCVpITwlbSUwJHJAX0RqJDkkayQzJEgkLCRHJC0kXiQ5ISMbKEI8L3A+Ci0KLTxoMz4bJEJFPkF3JW0lMBsoQjwvaDM+Ci0KLTxwPhskQiU1ITwlUCRPSWFETCQ9JGwkPiRsJE4laiUvJSglOSVIJHJFPkF3JVUlISUkJWskSyVtJTAkcjxoJGokXiQ5ISMbKEIKLRskQiVHJVUlKSVrJUgkTxsoQiBVbml4IBskQiRHJE8bKEIgPGNvZGU+bG9ncy9hY2Nlc3NfbG9nPC9jb2RlPiAbJEIkRxsoQiBXaW5kb3dzIBskQiRIGyhCCi1PUy8yIBskQiRHJE8bKEIgPGNvZGU+bG9ncy9hY2Nlc3MubG9nPC9jb2RlPiAbJEIkRyQ5ISMlVSUhJSQla0w+JE8bKEIKLTxhIGhyZWY9Im1vZC9tb2RfbG9nX2NvbmZpZy5odG1sI2N1c3RvbWxvZyI+Q3VzdG9tTG9nPC9hPgotGyRCJUclIyVsJS8lRiUjJVYkciRHQF9EaiRHJC0kXiQ5ISMwYyQmGyhCPGEKLWhyZWY9Im1vZC9jb3JlLmh0bWwjdmlydHVhbGhvc3QiPhskQiVQITwlQSVjJWslWyU5JUgbKEI8L2E+GyRCJEsbKEIKLRskQjBjJCZFPkF3JW0lMCRyQF9EaiQ5JGskMyRIJCwkRyQtJF4kOSEjGyhCPC9wPgotCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9jb250ZW50LW5lZ290aWF0aW9uLmh0bWwgYi9kb2NzL21hbnVhbC9jb250ZW50LW5lZ290aWF0aW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwODI1ZjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvY29udGVudC1uZWdvdGlhdGlvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QXBhY2hlIHNlcnZlciBDb250ZW50IGFyYml0cmF0aW9uOiBNdWx0aVZpZXdzIGFuZCAqLnZhciBmaWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfc3ViLmdpZiIgQUxUPSIiPgotPGgzPkNvbnRlbnQgQXJiaXRyYXRpb246ICBNdWx0aVZpZXdzIGFuZCAqLnZhciBmaWxlczwvaDM+Ci0KLVRoZSBIVFRQIHN0YW5kYXJkIGFsbG93cyBjbGllbnRzIChpLmUuLCBicm93c2VycyBsaWtlIE1vc2FpYyBvcgotTmV0c2NhcGUpIHRvIHNwZWNpZnkgd2hhdCBkYXRhIGZvcm1hdHMgdGhleSBhcmUgcHJlcGFyZWQgdG8gYWNjZXB0LgotVGhlIGludGVudGlvbiBpcyB0aGF0IHdoZW4gaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGluIG11bHRpcGxlCi12YXJpYW50cyAoZS5nLiwgaW4gZGlmZmVyZW50IGRhdGEgZm9ybWF0cyksIHNlcnZlcnMgY2FuIHVzZSB0aGlzCi1pbmZvcm1hdGlvbiB0byBkZWNpZGUgd2hpY2ggdmFyaWFudCB0byBzZW5kLiAgVGhpcyBmZWF0dXJlIGhhcyBiZWVuCi1zdXBwb3J0ZWQgaW4gdGhlIENFUk4gc2VydmVyIGZvciBhIHdoaWxlLCBhbmQgd2hpbGUgaXQgaXMgbm90IHlldAotc3VwcG9ydGVkIGluIHRoZSBOQ1NBIHNlcnZlciwgaXQgaXMgbGlrZWx5IHRvIGFzc3VtZSBhIG5ldyBpbXBvcnRhbmNlCi1pbiBsaWdodCBvZiB0aGUgZW1lcmdlbmNlIG9mIEhUTUwzIGNhcGFibGUgYnJvd3NlcnMuIDxwPgotCi1UaGUgQXBhY2hlIG1vZHVsZSA8QSBIUkVGPSJtb2RfbmVnb3RpYXRpb24uaHRtbCI+bW9kX25lZ290aWF0aW9uPC9BPiBoYW5kbGVzCi1jb250ZW50IG5lZ290aWF0aW9uIGluIHR3byBkaWZmZXJlbnQgd2F5czsgc3BlY2lhbCB0cmVhdG1lbnQgZm9yIHRoZQotcHNldWRvLW1pbWUtdHlwZSA8Y29kZT5hcHBsaWNhdGlvbi94LXR5cGUtbWFwPC9jb2RlPiwgYW5kIHRoZQotTXVsdGlWaWV3cyBwZXItZGlyZWN0b3J5IE9wdGlvbiAod2hpY2ggY2FuIGJlIHNldCBpbiBzcm0uY29uZiwgb3IgaW4KLS5odGFjY2VzcyBmaWxlcywgYXMgdXN1YWwpLiAgVGhlc2UgZmVhdHVyZXMgYXJlIGFsdGVybmF0ZSB1c2VyCi1pbnRlcmZhY2VzIHRvIHdoYXQgYW1vdW50cyB0byB0aGUgc2FtZSBwaWVjZSBvZiBjb2RlIChpbiB0aGUgbmV3IGZpbGUKLTxjb2RlPmh0dHBfbWltZV9kYi5jPC9jb2RlPikgd2hpY2ggaW1wbGVtZW50cyB0aGUgY29udGVudCBuZWdvdGlhdGlvbgotcG9ydGlvbiBvZiB0aGUgSFRUUCBwcm90b2NvbC4gPHA+Ci0KLUVhY2ggb2YgdGhlc2UgZmVhdHVyZXMgYWxsb3dzIG9uZSBvZiBzZXZlcmFsIGZpbGVzIHRvIHNhdGlzZnkgYQotcmVxdWVzdCwgYmFzZWQgb24gd2hhdCB0aGUgY2xpZW50IHNheXMgaXQncyB3aWxsaW5nIHRvIGFjY2VwdDsgdGhlCi1kaWZmZXJlbmNlcyBhcmUgaW4gdGhlIHdheSB0aGUgZmlsZXMgYXJlIGlkZW50aWZpZWQ6Ci0KLTx1bD4KLSAgPGxpPiBBIHR5cGUgbWFwIChpLmUuLCBhIDxjb2RlPioudmFyPC9jb2RlPiBmaWxlKSBuYW1lcyB0aGUgZmlsZXMKLSAgICAgICBjb250YWluaW5nIHRoZSB2YXJpYW50cyBleHBsaWNpdGx5Ci0gIDxsaT4gSW4gYSBNdWx0aVZpZXdzIHNlYXJjaCwgdGhlIHNlcnZlciBkb2VzIGFuIGltcGxpY2l0IGZpbGVuYW1lCi0gICAgICAgcGF0dGVybiBtYXRjaCwgYW5kIGNob29zZXMgZnJvbSBhbW9uZyB0aGUgcmVzdWx0cy4KLTwvdWw+Ci0KLUFwYWNoZSBhbHNvIHN1cHBvcnRzIGEgbmV3IHBzZXVkby1NSU1FIHR5cGUsCi10ZXh0L3gtc2VydmVyLXBhcnNlZC1odG1sMywgd2hpY2ggaXMgdHJlYXRlZCBhcyB0ZXh0L2h0bWw7bGV2ZWw9MwotZm9yIHB1cnBvc2VzIG9mIGNvbnRlbnQgbmVnb3RpYXRpb24sIGFuZCBhcyBzZXJ2ZXItc2lkZS1pbmNsdWRlZCBIVE1MCi1lbHNld2hlcmUuIAotCi08aDM+VHlwZSBtYXBzICgqLnZhciBmaWxlcyk8L2gzPgotCi1BIHR5cGUgbWFwIGlzIGEgZG9jdW1lbnQgd2hpY2ggaXMgdHlwZWQgYnkgdGhlIHNlcnZlciAodXNpbmcgaXRzCi1ub3JtYWwgc3VmZml4LWJhc2VkIG1lY2hhbmlzbXMpIGFzCi08Y29kZT5hcHBsaWNhdGlvbi94LXR5cGUtbWFwPC9jb2RlPi4gIE5vdGUgdGhhdCB0byB1c2UgdGhpcyBmZWF0dXJlLAoteW91J3ZlIGdvdCB0byBoYXZlIGFuIDxjb2RlPkFkZFR5cGU8L2NvZGU+IHNvbWUgcGxhY2Ugd2hpY2ggZGVmaW5lcyBhCi1maWxlIHN1ZmZpeCBhcyA8Y29kZT5hcHBsaWNhdGlvbi94LXR5cGUtbWFwPC9jb2RlPjsgdGhlIGVhc2llc3QgdGhpbmcKLW1heSBiZSB0byBzdGljayBhCi08cHJlPgotCi0gIEFkZFR5cGUgYXBwbGljYXRpb24veC10eXBlLW1hcCB2YXIKLQotPC9wcmU+Ci1pbiA8Y29kZT5zcm0uY29uZjwvY29kZT4uICBTZWUgY29tbWVudHMgaW4gdGhlIHNhbXBsZSBjb25maWcgZmlsZXMgZm9yCi1kZXRhaWxzLiA8cD4KLQotVHlwZSBtYXAgZmlsZXMgaGF2ZSBhbiBlbnRyeSBmb3IgZWFjaCBhdmFpbGFibGUgdmFyaWFudDsgdGhlc2UgZW50cmllcwotY29uc2lzdCBvZiBjb250aWd1b3VzIFJGQzgyMi1mb3JtYXQgaGVhZGVyIGxpbmVzLiAgRW50cmllcyBmb3IKLWRpZmZlcmVudCB2YXJpYW50cyBhcmUgc2VwYXJhdGVkIGJ5IGJsYW5rIGxpbmVzLiAgQmxhbmsgbGluZXMgYXJlCi1pbGxlZ2FsIHdpdGhpbiBhbiBlbnRyeS4gIEl0IGlzIGNvbnZlbnRpb25hbCB0byBiZWdpbiBhIG1hcCBmaWxlIHdpdGgKLWFuIGVudHJ5IGZvciB0aGUgY29tYmluZWQgZW50aXR5IGFzIGEgd2hvbGUsIGUuZy4sCi08cHJlPgotCi0gIFVSSTogZm9vOyB2YXJ5PSJ0eXBlLGxhbmd1YWdlIgotCi0gIFVSSTogZm9vLmVuLmh0bWwKLSAgQ29udGVudC10eXBlOiB0ZXh0L2h0bWw7IGxldmVsPTIKLSAgQ29udGVudC1sYW5ndWFnZTogZW4KLQotICBVUkk6IGZvby5mci5odG1sCi0gIENvbnRlbnQtdHlwZTogdGV4dC9odG1sOyBsZXZlbD0yCi0gIENvbnRlbnQtbGFuZ3VhZ2U6IGZyCi0KLTwvcHJlPgotSWYgdGhlIHZhcmlhbnRzIGhhdmUgZGlmZmVyZW50IHF1YWxpdGllcywgdGhhdCBtYXkgYmUgaW5kaWNhdGVkIGJ5IHRoZQotInFzIiBwYXJhbWV0ZXIsIGFzIGluIHRoaXMgcGljdHVyZSAoYXZhaWxhYmxlIGFzIGpwZWcsIGdpZiwgb3IgQVNDSUktYXJ0KToKLTxwcmU+Ci0KLSAgVVJJOiBmb287IHZhcnk9InR5cGUsbGFuZ3VhZ2UiCi0KLSAgVVJJOiBmb28uanBlZwotICBDb250ZW50LXR5cGU6IGltYWdlL2pwZWc7IHFzPTAuOAotCi0gIFVSSTogZm9vLmdpZgotICBDb250ZW50LXR5cGU6IGltYWdlL2dpZjsgcXM9MC41Ci0KLSAgVVJJOiBmb28udHh0Ci0gIENvbnRlbnQtdHlwZTogdGV4dC9wbGFpbjsgcXM9MC4wMQotCi08L3ByZT48cD4KLQotVGhlIGZ1bGwgbGlzdCBvZiBoZWFkZXJzIHJlY29nbml6ZWQgaXM6Ci0KLTxkbD4KLSAgPGR0PiA8Y29kZT5VUkk6PC9jb2RlPgotICA8ZGQ+IHVyaSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSB2YXJpYW50IChvZiB0aGUgZ2l2ZW4gbWVkaWEKLSAgICAgICB0eXBlLCBlbmNvZGVkIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQgZW5jb2RpbmcpLiAgVGhlc2UgYXJlCi0gICAgICAgaW50ZXJwcmV0ZWQgYXMgVVJMcyByZWxhdGl2ZSB0byB0aGUgbWFwIGZpbGU7IHRoZXkgbXVzdCBiZSBvbgotICAgICAgIHRoZSBzYW1lIHNlcnZlciAoISksIGFuZCB0aGV5IG11c3QgcmVmZXIgdG8gZmlsZXMgdG8gd2hpY2ggdGhlCi0gICAgICAgY2xpZW50IHdvdWxkIGJlIGdyYW50ZWQgYWNjZXNzIGlmIHRoZXkgd2VyZSB0byBiZSByZXF1ZXN0ZWQKLSAgICAgICBkaXJlY3RseS4gCi0gIDxkdD4gPGNvZGU+Q29udGVudC10eXBlOjwvY29kZT4KLSAgPGRkPiBtZWRpYSB0eXBlIC0tLSBsZXZlbCBtYXkgYmUgc3BlY2lmaWVkLCBhbG9uZyB3aXRoICJxcyIuICBUaGVzZQotICAgICAgIGFyZSBvZnRlbiByZWZlcnJlZCB0byBhcyBNSU1FIHR5cGVzOyB0eXBpY2FsIG1lZGlhIHR5cGVzIGFyZQotICAgICAgIDxjb2RlPmltYWdlL2dpZjwvY29kZT4sIDxjb2RlPnRleHQvcGxhaW48L2NvZGU+LCBvcgotICAgICAgIDxjb2RlPnRleHQvaHRtbDsmbmJzcDtsZXZlbD0zPC9jb2RlPi4KLSAgPGR0PiA8Y29kZT5Db250ZW50LWxhbmd1YWdlOjwvY29kZT4KLSAgPGRkPiBUaGUgbGFuZ3VhZ2Ugb2YgdGhlIHZhcmlhbnQsIHNwZWNpZmllZCBhcyBhbiBpbnRlcm5ldCBzdGFuZGFyZAotICAgICAgIGxhbmd1YWdlIGNvZGUgKGUuZy4sIDxjb2RlPmVuPC9jb2RlPiBmb3IgRW5nbGlzaCwKLSAgICAgICA8Y29kZT5rcjwvY29kZT4gZm9yIEtvcmVhbiwgZXRjLikuCi0gIDxkdD4gPGNvZGU+Q29udGVudC1lbmNvZGluZzo8L2NvZGU+Ci0gIDxkZD4gSWYgdGhlIGZpbGUgaXMgY29tcHJlc3NlZCwgb3Igb3RoZXJ3aXNlIGVuY29kZWQsIHJhdGhlciB0aGFuCi0gICAgICAgY29udGFpbmluZyB0aGUgYWN0dWFsIHJhdyBkYXRhLCB0aGlzIHNheXMgaG93IHRoYXQgd2FzIGRvbmUuCi0gICAgICAgRm9yIGNvbXByZXNzZWQgZmlsZXMgKHRoZSBvbmx5IGNhc2Ugd2hlcmUgdGhpcyBnZW5lcmFsbHkgY29tZXMKLSAgICAgICB1cCksIGNvbnRlbnQgZW5jb2Rpbmcgc2hvdWxkIGJlCi0gICAgICAgPGNvZGU+eC1jb21wcmVzczwvY29kZT4sIG9yIDxjb2RlPmd6aXA8L2NvZGU+LCBhcyBhcHByb3ByaWF0ZS4KLSAgPGR0PiA8Y29kZT5Db250ZW50LWxlbmd0aDo8L2NvZGU+Ci0gIDxkZD4gVGhlIHNpemUgb2YgdGhlIGZpbGUuICBDbGllbnRzIGNhbiBhc2sgdG8gcmVjZWl2ZSBhIGdpdmVuIG1lZGlhCi0gICAgICAgdHlwZSBvbmx5IGlmIHRoZSB2YXJpYW50IGlzbid0IHRvbyBiaWc7IHNwZWNpZnlpbmcgYSBjb250ZW50Ci0gICAgICAgbGVuZ3RoIGluIHRoZSBtYXAgYWxsb3dzIHRoZSBzZXJ2ZXIgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZXNlCi0gICAgICAgdGhyZXNob2xkcyB3aXRob3V0IGNoZWNraW5nIHRoZSBhY3R1YWwgZmlsZS4KLTwvZGw+Ci0KLTxoMz5NdWx0aXZpZXdzPC9oMz4KLQotVGhpcyBpcyBhIHBlci1kaXJlY3Rvcnkgb3B0aW9uLCBtZWFuaW5nIGl0IGNhbiBiZSBzZXQgd2l0aCBhbgotPGNvZGU+T3B0aW9uczwvY29kZT4gZGlyZWN0aXZlIHdpdGhpbiBhIDxjb2RlPiZsdDtEaXJlY3RvcnkmZ3Q7PC9jb2RlPgotc2VjdGlvbiBpbiA8Y29kZT5hY2Nlc3MuY29uZjwvY29kZT4sIG9yIChpZiA8Y29kZT5BbGxvd092ZXJyaWRlPC9jb2RlPgotaXMgcHJvcGVybHkgc2V0KSBpbiA8Y29kZT4uaHRhY2Nlc3M8L2NvZGU+IGZpbGVzLiAgTm90ZSB0aGF0Ci08Y29kZT5PcHRpb25zIEFsbDwvY29kZT4gZG9lcyBub3Qgc2V0IDxjb2RlPk11bHRpVmlld3M8L2NvZGU+OyB5b3UKLWhhdmUgdG8gYXNrIGZvciBpdCBieSBuYW1lLiAgKEZpeGluZyB0aGlzIGlzIGEgb25lLWxpbmUgY2hhbmdlIHRvCi08Y29kZT5odHRwZC5oPC9jb2RlPikuCi0KLTxwPgotCi1UaGUgZWZmZWN0IG9mIDxjb2RlPk11bHRpVmlld3M8L2NvZGU+IGlzIGFzIGZvbGxvd3M6IGlmIHRoZSBzZXJ2ZXIKLXJlY2VpdmVzIGEgcmVxdWVzdCBmb3IgPGNvZGU+L3NvbWUvZGlyL2ZvbzwvY29kZT4sIGlmCi08Y29kZT4vc29tZS9kaXI8L2NvZGU+IGhhcyA8Y29kZT5NdWx0aVZpZXdzPC9jb2RlPiBlbmFibGVkLCBhbmQKLTxjb2RlPi9zb21lL2Rpci9mb288L2NvZGU+IGRvZXMgKm5vdCogZXhpc3QsIHRoZW4gdGhlIHNlcnZlciByZWFkcyB0aGUKLWRpcmVjdG9yeSBsb29raW5nIGZvciBmaWxlcyBuYW1lZCBmb28uKiwgYW5kIGVmZmVjdGl2ZWx5IGZha2VzIHVwIGEKLXR5cGUgbWFwIHdoaWNoIG5hbWVzIGFsbCB0aG9zZSBmaWxlcywgYXNzaWduaW5nIHRoZW0gdGhlIHNhbWUgbWVkaWEKLXR5cGVzIGFuZCBjb250ZW50LWVuY29kaW5ncyBpdCB3b3VsZCBoYXZlIGlmIHRoZSBjbGllbnQgaGFkIGFza2VkIGZvcgotb25lIG9mIHRoZW0gYnkgbmFtZS4gIEl0IHRoZW4gY2hvb3NlcyB0aGUgYmVzdCBtYXRjaCB0byB0aGUgY2xpZW50J3MKLXJlcXVpcmVtZW50cywgYW5kIGZvcndhcmRzIHRoZW0gYWxvbmcuCi0KLTxwPgotCi1UaGlzIGFwcGxpZXMgdG8gc2VhcmNoZXMgZm9yIHRoZSBmaWxlIG5hbWVkIGJ5IHRoZQotPGNvZGU+RGlyZWN0b3J5SW5kZXg8L2NvZGU+IGRpcmVjdGl2ZSwgaWYgdGhlIHNlcnZlciBpcyB0cnlpbmcgdG8KLWluZGV4IGEgZGlyZWN0b3J5OyBpZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyBzcGVjaWZ5Ci08cHJlPgotCi0gIERpcmVjdG9yeUluZGV4IGluZGV4Ci0KLTwvcHJlPiB0aGVuIHRoZSBzZXJ2ZXIgd2lsbCBhcmJpdHJhdGUgYmV0d2VlbiA8Y29kZT5pbmRleC5odG1sPC9jb2RlPgotYW5kIDxjb2RlPmluZGV4Lmh0bWwzPC9jb2RlPiBpZiBib3RoIGFyZSBwcmVzZW50LiAgSWYgbmVpdGhlciBhcmUKLXByZXNlbnQsIGFuZCA8Y29kZT5pbmRleC5jZ2k8L2NvZGU+IGlzIHRoZXJlLCB0aGUgc2VydmVyIHdpbGwgcnVuIGl0LgotCi08cD4KLQotSWYgb25lIG9mIHRoZSBmaWxlcyBmb3VuZCBieSB0aGUgZ2xvYmJpbmcgaXMgYSBDR0kgc2NyaXB0LCBpdCdzIG5vdAotb2J2aW91cyB3aGF0IHNob3VsZCBoYXBwZW4uICBNeSBjb2RlIGdpdmVzIHRoYXQgY2FzZSBnZXRzIHNwZWNpYWwKLXRyZWF0bWVudCAtLS0gaWYgdGhlIHJlcXVlc3Qgd2FzIGEgUE9TVCwgb3IgYSBHRVQgd2l0aCBRVUVSWV9BUkdTIG9yCi1QQVRIX0lORk8sIHRoZSBzY3JpcHQgaXMgZ2l2ZW4gYW4gZXh0cmVtZWx5IGhpZ2ggcXVhbGl0eSByYXRpbmcsIGFuZAotZ2VuZXJhbGx5IGludm9rZWQ7IG90aGVyd2lzZSBpdCBpcyBnaXZlbiBhbiBleHRyZW1lbHkgbG93IHF1YWxpdHkKLXJhdGluZywgd2hpY2ggZ2VuZXJhbGx5IGNhdXNlcyBvbmUgb2YgdGhlIG90aGVyIHZpZXdzIChpZiBhbnkpIHRvIGJlCi1yZXRyaWV2ZWQuICBUaGlzIGlzIHRoZSBvbmx5IGppZ2dlcmluZyBvZiBxdWFsaXR5IHJhdGluZ3MgZG9uZSBieSB0aGUKLU11bHRpVmlld3MgY29kZTsgYXNpZGUgZnJvbSB0aGF0LCBhbGwgUXVhbGl0aWVzIGluIHRoZSBzeW50aGVzaXplZAotdHlwZSBtYXBzIGFyZSAxLjAuCi0KLTxwPgotCi08Qj5OZXcgYXMgb2YgMC44OjwvQj4gRG9jdW1lbnRzIGluIG11bHRpcGxlIGxhbmd1YWdlcyBjYW4gYWxzbyBiZSByZXNvbHZlZCB0aHJvdWdoIHRoZSB1c2UKLW9mIHRoZSA8Y29kZT5BZGRMYW5ndWFnZTwvY29kZT4gYW5kIDxjb2RlPkxhbmd1YWdlUHJpb3JpdHk8L2NvZGU+IAotZGlyZWN0aXZlczoKLQotPHByZT4KLUFkZExhbmd1YWdlIGVuIC5lbgotQWRkTGFuZ3VhZ2UgZnIgLmZyCi1BZGRMYW5ndWFnZSBkZSAuZGUKLUFkZExhbmd1YWdlIGRhIC5kYQotQWRkTGFuZ3VhZ2UgZWwgLmVsCi1BZGRMYW5ndWFnZSBpdCAuaXQKLQotIyBMYW5ndWFnZVByaW9yaXR5IGFsbG93cyB5b3UgdG8gZ2l2ZSBwcmVjZWRlbmNlIHRvIHNvbWUgbGFuZ3VhZ2VzCi0jIGluIGNhc2Ugb2YgYSB0aWUgZHVyaW5nIGNvbnRlbnQgbmVnb3RpYXRpb24uCi0jIEp1c3QgbGlzdCB0aGUgbGFuZ3VhZ2VzIGluIGRlY3JlYXNpbmcgb3JkZXIgb2YgcHJlZmVyZW5jZS4KLQotTGFuZ3VhZ2VQcmlvcml0eSBlbiBmciBkZQotPC9wcmU+Ci0KLUhlcmUsIGEgcmVxdWVzdCBmb3IgImZvby5odG1sIiBtYXRjaGVkIGFnYWluc3QgImZvby5odG1sLmVuIiBhbmQKLSJmb28uaHRtbC5mciIgd291bGQgcmV0dXJuIGFuIEZyZW5jaCBkb2N1bWVudCB0byBhIGJyb3dzZXIgdGhhdAotaW5kaWNhdGVkIGEgcHJlZmVyZW5jZSBmb3IgRnJlbmNoLCBvciBhbiBFbmdsaXNoIGRvY3VtZW50IG90aGVyd2lzZS4KLUluIGZhY3QsIGEgcmVxdWVzdCBmb3IgImZvbyIgbWF0Y2hlZCBhZ2FpbnN0ICJmb28uaHRtbC5lbiIsCi0iZm9vLmh0bWwuZnIiLCAiZm9vLnBzLmVuIiwgImZvby5wZGYuZGUiLCBhbmQgImZvby50eHQuaXQiIHdvdWxkIGRvCi1qdXN0IHdoYXQgeW91IGV4cGVjdCAtIHRyZWF0IHRob3NlIHN1ZmZpY2VzIGFzIGEgZGF0YWJhc2UgYW5kIGNvbXBhcmUKLXRoZSByZXF1ZXN0IHRvIGl0LCByZXR1cm5pbmcgdGhlIGJlc3QgbWF0Y2guICBUaGUgbGFuZ3VhZ2VzIGFuZCBkYXRhCi10eXBlcyBzaGFyZSB0aGUgc2FtZSBzdWZmaXggbmFtZSBzcGFjZS4KLQotPHA+Ci0KLU5vdGUgdGhhdCB0aGlzIG1hY2hpbmVyeSBvbmx5IGNvbWVzIGludG8gcGxheSBpZiB0aGUgZmlsZSB3aGljaCB0aGUKLXVzZXIgYXR0ZW1wdGVkIHRvIHJldHJpZXZlIGRvZXMgPGVtPm5vdDwvZW0+IGV4aXN0IGJ5IHRoYXQgbmFtZTsgaWYgaXQKLWRvZXMsIGl0IGlzIHNpbXBseSByZXRyaWV2ZWQgYXMgdXN1YWwuICAoU28sIHNvbWVvbmUgd2hvIGFjdHVhbGx5IGFza3MKLWZvciA8Y29kZT5mb28uanBlZzwvY29kZT4sIGFzIG9wcG9zZWQgdG8gPGNvZGU+Zm9vPC9jb2RlPiwgbmV2ZXIgZ2V0cwotPGNvZGU+Zm9vLmdpZjwvY29kZT4pLgotCi08UD48SFI+PFA+Ci08QSBIUkVGPSIuLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2hvbWUuZ2lmIiBBTFQ9IkhvbWUiPjwvQT4KLTxBIEhSRUY9Ii4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9pbmRleC5naWYiIEFMVD0iSW5kZXgiPjwvQT4KLQotPC9ib2R5PiA8L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9jb250ZW50LW5lZ290aWF0aW9uLmh0bWwuZW4gYi9kb2NzL21hbnVhbC9jb250ZW50LW5lZ290aWF0aW9uLmh0bWwuZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwODI1ZjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvY29udGVudC1uZWdvdGlhdGlvbi5odG1sLmVuCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QXBhY2hlIHNlcnZlciBDb250ZW50IGFyYml0cmF0aW9uOiBNdWx0aVZpZXdzIGFuZCAqLnZhciBmaWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfc3ViLmdpZiIgQUxUPSIiPgotPGgzPkNvbnRlbnQgQXJiaXRyYXRpb246ICBNdWx0aVZpZXdzIGFuZCAqLnZhciBmaWxlczwvaDM+Ci0KLVRoZSBIVFRQIHN0YW5kYXJkIGFsbG93cyBjbGllbnRzIChpLmUuLCBicm93c2VycyBsaWtlIE1vc2FpYyBvcgotTmV0c2NhcGUpIHRvIHNwZWNpZnkgd2hhdCBkYXRhIGZvcm1hdHMgdGhleSBhcmUgcHJlcGFyZWQgdG8gYWNjZXB0LgotVGhlIGludGVudGlvbiBpcyB0aGF0IHdoZW4gaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGluIG11bHRpcGxlCi12YXJpYW50cyAoZS5nLiwgaW4gZGlmZmVyZW50IGRhdGEgZm9ybWF0cyksIHNlcnZlcnMgY2FuIHVzZSB0aGlzCi1pbmZvcm1hdGlvbiB0byBkZWNpZGUgd2hpY2ggdmFyaWFudCB0byBzZW5kLiAgVGhpcyBmZWF0dXJlIGhhcyBiZWVuCi1zdXBwb3J0ZWQgaW4gdGhlIENFUk4gc2VydmVyIGZvciBhIHdoaWxlLCBhbmQgd2hpbGUgaXQgaXMgbm90IHlldAotc3VwcG9ydGVkIGluIHRoZSBOQ1NBIHNlcnZlciwgaXQgaXMgbGlrZWx5IHRvIGFzc3VtZSBhIG5ldyBpbXBvcnRhbmNlCi1pbiBsaWdodCBvZiB0aGUgZW1lcmdlbmNlIG9mIEhUTUwzIGNhcGFibGUgYnJvd3NlcnMuIDxwPgotCi1UaGUgQXBhY2hlIG1vZHVsZSA8QSBIUkVGPSJtb2RfbmVnb3RpYXRpb24uaHRtbCI+bW9kX25lZ290aWF0aW9uPC9BPiBoYW5kbGVzCi1jb250ZW50IG5lZ290aWF0aW9uIGluIHR3byBkaWZmZXJlbnQgd2F5czsgc3BlY2lhbCB0cmVhdG1lbnQgZm9yIHRoZQotcHNldWRvLW1pbWUtdHlwZSA8Y29kZT5hcHBsaWNhdGlvbi94LXR5cGUtbWFwPC9jb2RlPiwgYW5kIHRoZQotTXVsdGlWaWV3cyBwZXItZGlyZWN0b3J5IE9wdGlvbiAod2hpY2ggY2FuIGJlIHNldCBpbiBzcm0uY29uZiwgb3IgaW4KLS5odGFjY2VzcyBmaWxlcywgYXMgdXN1YWwpLiAgVGhlc2UgZmVhdHVyZXMgYXJlIGFsdGVybmF0ZSB1c2VyCi1pbnRlcmZhY2VzIHRvIHdoYXQgYW1vdW50cyB0byB0aGUgc2FtZSBwaWVjZSBvZiBjb2RlIChpbiB0aGUgbmV3IGZpbGUKLTxjb2RlPmh0dHBfbWltZV9kYi5jPC9jb2RlPikgd2hpY2ggaW1wbGVtZW50cyB0aGUgY29udGVudCBuZWdvdGlhdGlvbgotcG9ydGlvbiBvZiB0aGUgSFRUUCBwcm90b2NvbC4gPHA+Ci0KLUVhY2ggb2YgdGhlc2UgZmVhdHVyZXMgYWxsb3dzIG9uZSBvZiBzZXZlcmFsIGZpbGVzIHRvIHNhdGlzZnkgYQotcmVxdWVzdCwgYmFzZWQgb24gd2hhdCB0aGUgY2xpZW50IHNheXMgaXQncyB3aWxsaW5nIHRvIGFjY2VwdDsgdGhlCi1kaWZmZXJlbmNlcyBhcmUgaW4gdGhlIHdheSB0aGUgZmlsZXMgYXJlIGlkZW50aWZpZWQ6Ci0KLTx1bD4KLSAgPGxpPiBBIHR5cGUgbWFwIChpLmUuLCBhIDxjb2RlPioudmFyPC9jb2RlPiBmaWxlKSBuYW1lcyB0aGUgZmlsZXMKLSAgICAgICBjb250YWluaW5nIHRoZSB2YXJpYW50cyBleHBsaWNpdGx5Ci0gIDxsaT4gSW4gYSBNdWx0aVZpZXdzIHNlYXJjaCwgdGhlIHNlcnZlciBkb2VzIGFuIGltcGxpY2l0IGZpbGVuYW1lCi0gICAgICAgcGF0dGVybiBtYXRjaCwgYW5kIGNob29zZXMgZnJvbSBhbW9uZyB0aGUgcmVzdWx0cy4KLTwvdWw+Ci0KLUFwYWNoZSBhbHNvIHN1cHBvcnRzIGEgbmV3IHBzZXVkby1NSU1FIHR5cGUsCi10ZXh0L3gtc2VydmVyLXBhcnNlZC1odG1sMywgd2hpY2ggaXMgdHJlYXRlZCBhcyB0ZXh0L2h0bWw7bGV2ZWw9MwotZm9yIHB1cnBvc2VzIG9mIGNvbnRlbnQgbmVnb3RpYXRpb24sIGFuZCBhcyBzZXJ2ZXItc2lkZS1pbmNsdWRlZCBIVE1MCi1lbHNld2hlcmUuIAotCi08aDM+VHlwZSBtYXBzICgqLnZhciBmaWxlcyk8L2gzPgotCi1BIHR5cGUgbWFwIGlzIGEgZG9jdW1lbnQgd2hpY2ggaXMgdHlwZWQgYnkgdGhlIHNlcnZlciAodXNpbmcgaXRzCi1ub3JtYWwgc3VmZml4LWJhc2VkIG1lY2hhbmlzbXMpIGFzCi08Y29kZT5hcHBsaWNhdGlvbi94LXR5cGUtbWFwPC9jb2RlPi4gIE5vdGUgdGhhdCB0byB1c2UgdGhpcyBmZWF0dXJlLAoteW91J3ZlIGdvdCB0byBoYXZlIGFuIDxjb2RlPkFkZFR5cGU8L2NvZGU+IHNvbWUgcGxhY2Ugd2hpY2ggZGVmaW5lcyBhCi1maWxlIHN1ZmZpeCBhcyA8Y29kZT5hcHBsaWNhdGlvbi94LXR5cGUtbWFwPC9jb2RlPjsgdGhlIGVhc2llc3QgdGhpbmcKLW1heSBiZSB0byBzdGljayBhCi08cHJlPgotCi0gIEFkZFR5cGUgYXBwbGljYXRpb24veC10eXBlLW1hcCB2YXIKLQotPC9wcmU+Ci1pbiA8Y29kZT5zcm0uY29uZjwvY29kZT4uICBTZWUgY29tbWVudHMgaW4gdGhlIHNhbXBsZSBjb25maWcgZmlsZXMgZm9yCi1kZXRhaWxzLiA8cD4KLQotVHlwZSBtYXAgZmlsZXMgaGF2ZSBhbiBlbnRyeSBmb3IgZWFjaCBhdmFpbGFibGUgdmFyaWFudDsgdGhlc2UgZW50cmllcwotY29uc2lzdCBvZiBjb250aWd1b3VzIFJGQzgyMi1mb3JtYXQgaGVhZGVyIGxpbmVzLiAgRW50cmllcyBmb3IKLWRpZmZlcmVudCB2YXJpYW50cyBhcmUgc2VwYXJhdGVkIGJ5IGJsYW5rIGxpbmVzLiAgQmxhbmsgbGluZXMgYXJlCi1pbGxlZ2FsIHdpdGhpbiBhbiBlbnRyeS4gIEl0IGlzIGNvbnZlbnRpb25hbCB0byBiZWdpbiBhIG1hcCBmaWxlIHdpdGgKLWFuIGVudHJ5IGZvciB0aGUgY29tYmluZWQgZW50aXR5IGFzIGEgd2hvbGUsIGUuZy4sCi08cHJlPgotCi0gIFVSSTogZm9vOyB2YXJ5PSJ0eXBlLGxhbmd1YWdlIgotCi0gIFVSSTogZm9vLmVuLmh0bWwKLSAgQ29udGVudC10eXBlOiB0ZXh0L2h0bWw7IGxldmVsPTIKLSAgQ29udGVudC1sYW5ndWFnZTogZW4KLQotICBVUkk6IGZvby5mci5odG1sCi0gIENvbnRlbnQtdHlwZTogdGV4dC9odG1sOyBsZXZlbD0yCi0gIENvbnRlbnQtbGFuZ3VhZ2U6IGZyCi0KLTwvcHJlPgotSWYgdGhlIHZhcmlhbnRzIGhhdmUgZGlmZmVyZW50IHF1YWxpdGllcywgdGhhdCBtYXkgYmUgaW5kaWNhdGVkIGJ5IHRoZQotInFzIiBwYXJhbWV0ZXIsIGFzIGluIHRoaXMgcGljdHVyZSAoYXZhaWxhYmxlIGFzIGpwZWcsIGdpZiwgb3IgQVNDSUktYXJ0KToKLTxwcmU+Ci0KLSAgVVJJOiBmb287IHZhcnk9InR5cGUsbGFuZ3VhZ2UiCi0KLSAgVVJJOiBmb28uanBlZwotICBDb250ZW50LXR5cGU6IGltYWdlL2pwZWc7IHFzPTAuOAotCi0gIFVSSTogZm9vLmdpZgotICBDb250ZW50LXR5cGU6IGltYWdlL2dpZjsgcXM9MC41Ci0KLSAgVVJJOiBmb28udHh0Ci0gIENvbnRlbnQtdHlwZTogdGV4dC9wbGFpbjsgcXM9MC4wMQotCi08L3ByZT48cD4KLQotVGhlIGZ1bGwgbGlzdCBvZiBoZWFkZXJzIHJlY29nbml6ZWQgaXM6Ci0KLTxkbD4KLSAgPGR0PiA8Y29kZT5VUkk6PC9jb2RlPgotICA8ZGQ+IHVyaSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSB2YXJpYW50IChvZiB0aGUgZ2l2ZW4gbWVkaWEKLSAgICAgICB0eXBlLCBlbmNvZGVkIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQgZW5jb2RpbmcpLiAgVGhlc2UgYXJlCi0gICAgICAgaW50ZXJwcmV0ZWQgYXMgVVJMcyByZWxhdGl2ZSB0byB0aGUgbWFwIGZpbGU7IHRoZXkgbXVzdCBiZSBvbgotICAgICAgIHRoZSBzYW1lIHNlcnZlciAoISksIGFuZCB0aGV5IG11c3QgcmVmZXIgdG8gZmlsZXMgdG8gd2hpY2ggdGhlCi0gICAgICAgY2xpZW50IHdvdWxkIGJlIGdyYW50ZWQgYWNjZXNzIGlmIHRoZXkgd2VyZSB0byBiZSByZXF1ZXN0ZWQKLSAgICAgICBkaXJlY3RseS4gCi0gIDxkdD4gPGNvZGU+Q29udGVudC10eXBlOjwvY29kZT4KLSAgPGRkPiBtZWRpYSB0eXBlIC0tLSBsZXZlbCBtYXkgYmUgc3BlY2lmaWVkLCBhbG9uZyB3aXRoICJxcyIuICBUaGVzZQotICAgICAgIGFyZSBvZnRlbiByZWZlcnJlZCB0byBhcyBNSU1FIHR5cGVzOyB0eXBpY2FsIG1lZGlhIHR5cGVzIGFyZQotICAgICAgIDxjb2RlPmltYWdlL2dpZjwvY29kZT4sIDxjb2RlPnRleHQvcGxhaW48L2NvZGU+LCBvcgotICAgICAgIDxjb2RlPnRleHQvaHRtbDsmbmJzcDtsZXZlbD0zPC9jb2RlPi4KLSAgPGR0PiA8Y29kZT5Db250ZW50LWxhbmd1YWdlOjwvY29kZT4KLSAgPGRkPiBUaGUgbGFuZ3VhZ2Ugb2YgdGhlIHZhcmlhbnQsIHNwZWNpZmllZCBhcyBhbiBpbnRlcm5ldCBzdGFuZGFyZAotICAgICAgIGxhbmd1YWdlIGNvZGUgKGUuZy4sIDxjb2RlPmVuPC9jb2RlPiBmb3IgRW5nbGlzaCwKLSAgICAgICA8Y29kZT5rcjwvY29kZT4gZm9yIEtvcmVhbiwgZXRjLikuCi0gIDxkdD4gPGNvZGU+Q29udGVudC1lbmNvZGluZzo8L2NvZGU+Ci0gIDxkZD4gSWYgdGhlIGZpbGUgaXMgY29tcHJlc3NlZCwgb3Igb3RoZXJ3aXNlIGVuY29kZWQsIHJhdGhlciB0aGFuCi0gICAgICAgY29udGFpbmluZyB0aGUgYWN0dWFsIHJhdyBkYXRhLCB0aGlzIHNheXMgaG93IHRoYXQgd2FzIGRvbmUuCi0gICAgICAgRm9yIGNvbXByZXNzZWQgZmlsZXMgKHRoZSBvbmx5IGNhc2Ugd2hlcmUgdGhpcyBnZW5lcmFsbHkgY29tZXMKLSAgICAgICB1cCksIGNvbnRlbnQgZW5jb2Rpbmcgc2hvdWxkIGJlCi0gICAgICAgPGNvZGU+eC1jb21wcmVzczwvY29kZT4sIG9yIDxjb2RlPmd6aXA8L2NvZGU+LCBhcyBhcHByb3ByaWF0ZS4KLSAgPGR0PiA8Y29kZT5Db250ZW50LWxlbmd0aDo8L2NvZGU+Ci0gIDxkZD4gVGhlIHNpemUgb2YgdGhlIGZpbGUuICBDbGllbnRzIGNhbiBhc2sgdG8gcmVjZWl2ZSBhIGdpdmVuIG1lZGlhCi0gICAgICAgdHlwZSBvbmx5IGlmIHRoZSB2YXJpYW50IGlzbid0IHRvbyBiaWc7IHNwZWNpZnlpbmcgYSBjb250ZW50Ci0gICAgICAgbGVuZ3RoIGluIHRoZSBtYXAgYWxsb3dzIHRoZSBzZXJ2ZXIgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZXNlCi0gICAgICAgdGhyZXNob2xkcyB3aXRob3V0IGNoZWNraW5nIHRoZSBhY3R1YWwgZmlsZS4KLTwvZGw+Ci0KLTxoMz5NdWx0aXZpZXdzPC9oMz4KLQotVGhpcyBpcyBhIHBlci1kaXJlY3Rvcnkgb3B0aW9uLCBtZWFuaW5nIGl0IGNhbiBiZSBzZXQgd2l0aCBhbgotPGNvZGU+T3B0aW9uczwvY29kZT4gZGlyZWN0aXZlIHdpdGhpbiBhIDxjb2RlPiZsdDtEaXJlY3RvcnkmZ3Q7PC9jb2RlPgotc2VjdGlvbiBpbiA8Y29kZT5hY2Nlc3MuY29uZjwvY29kZT4sIG9yIChpZiA8Y29kZT5BbGxvd092ZXJyaWRlPC9jb2RlPgotaXMgcHJvcGVybHkgc2V0KSBpbiA8Y29kZT4uaHRhY2Nlc3M8L2NvZGU+IGZpbGVzLiAgTm90ZSB0aGF0Ci08Y29kZT5PcHRpb25zIEFsbDwvY29kZT4gZG9lcyBub3Qgc2V0IDxjb2RlPk11bHRpVmlld3M8L2NvZGU+OyB5b3UKLWhhdmUgdG8gYXNrIGZvciBpdCBieSBuYW1lLiAgKEZpeGluZyB0aGlzIGlzIGEgb25lLWxpbmUgY2hhbmdlIHRvCi08Y29kZT5odHRwZC5oPC9jb2RlPikuCi0KLTxwPgotCi1UaGUgZWZmZWN0IG9mIDxjb2RlPk11bHRpVmlld3M8L2NvZGU+IGlzIGFzIGZvbGxvd3M6IGlmIHRoZSBzZXJ2ZXIKLXJlY2VpdmVzIGEgcmVxdWVzdCBmb3IgPGNvZGU+L3NvbWUvZGlyL2ZvbzwvY29kZT4sIGlmCi08Y29kZT4vc29tZS9kaXI8L2NvZGU+IGhhcyA8Y29kZT5NdWx0aVZpZXdzPC9jb2RlPiBlbmFibGVkLCBhbmQKLTxjb2RlPi9zb21lL2Rpci9mb288L2NvZGU+IGRvZXMgKm5vdCogZXhpc3QsIHRoZW4gdGhlIHNlcnZlciByZWFkcyB0aGUKLWRpcmVjdG9yeSBsb29raW5nIGZvciBmaWxlcyBuYW1lZCBmb28uKiwgYW5kIGVmZmVjdGl2ZWx5IGZha2VzIHVwIGEKLXR5cGUgbWFwIHdoaWNoIG5hbWVzIGFsbCB0aG9zZSBmaWxlcywgYXNzaWduaW5nIHRoZW0gdGhlIHNhbWUgbWVkaWEKLXR5cGVzIGFuZCBjb250ZW50LWVuY29kaW5ncyBpdCB3b3VsZCBoYXZlIGlmIHRoZSBjbGllbnQgaGFkIGFza2VkIGZvcgotb25lIG9mIHRoZW0gYnkgbmFtZS4gIEl0IHRoZW4gY2hvb3NlcyB0aGUgYmVzdCBtYXRjaCB0byB0aGUgY2xpZW50J3MKLXJlcXVpcmVtZW50cywgYW5kIGZvcndhcmRzIHRoZW0gYWxvbmcuCi0KLTxwPgotCi1UaGlzIGFwcGxpZXMgdG8gc2VhcmNoZXMgZm9yIHRoZSBmaWxlIG5hbWVkIGJ5IHRoZQotPGNvZGU+RGlyZWN0b3J5SW5kZXg8L2NvZGU+IGRpcmVjdGl2ZSwgaWYgdGhlIHNlcnZlciBpcyB0cnlpbmcgdG8KLWluZGV4IGEgZGlyZWN0b3J5OyBpZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyBzcGVjaWZ5Ci08cHJlPgotCi0gIERpcmVjdG9yeUluZGV4IGluZGV4Ci0KLTwvcHJlPiB0aGVuIHRoZSBzZXJ2ZXIgd2lsbCBhcmJpdHJhdGUgYmV0d2VlbiA8Y29kZT5pbmRleC5odG1sPC9jb2RlPgotYW5kIDxjb2RlPmluZGV4Lmh0bWwzPC9jb2RlPiBpZiBib3RoIGFyZSBwcmVzZW50LiAgSWYgbmVpdGhlciBhcmUKLXByZXNlbnQsIGFuZCA8Y29kZT5pbmRleC5jZ2k8L2NvZGU+IGlzIHRoZXJlLCB0aGUgc2VydmVyIHdpbGwgcnVuIGl0LgotCi08cD4KLQotSWYgb25lIG9mIHRoZSBmaWxlcyBmb3VuZCBieSB0aGUgZ2xvYmJpbmcgaXMgYSBDR0kgc2NyaXB0LCBpdCdzIG5vdAotb2J2aW91cyB3aGF0IHNob3VsZCBoYXBwZW4uICBNeSBjb2RlIGdpdmVzIHRoYXQgY2FzZSBnZXRzIHNwZWNpYWwKLXRyZWF0bWVudCAtLS0gaWYgdGhlIHJlcXVlc3Qgd2FzIGEgUE9TVCwgb3IgYSBHRVQgd2l0aCBRVUVSWV9BUkdTIG9yCi1QQVRIX0lORk8sIHRoZSBzY3JpcHQgaXMgZ2l2ZW4gYW4gZXh0cmVtZWx5IGhpZ2ggcXVhbGl0eSByYXRpbmcsIGFuZAotZ2VuZXJhbGx5IGludm9rZWQ7IG90aGVyd2lzZSBpdCBpcyBnaXZlbiBhbiBleHRyZW1lbHkgbG93IHF1YWxpdHkKLXJhdGluZywgd2hpY2ggZ2VuZXJhbGx5IGNhdXNlcyBvbmUgb2YgdGhlIG90aGVyIHZpZXdzIChpZiBhbnkpIHRvIGJlCi1yZXRyaWV2ZWQuICBUaGlzIGlzIHRoZSBvbmx5IGppZ2dlcmluZyBvZiBxdWFsaXR5IHJhdGluZ3MgZG9uZSBieSB0aGUKLU11bHRpVmlld3MgY29kZTsgYXNpZGUgZnJvbSB0aGF0LCBhbGwgUXVhbGl0aWVzIGluIHRoZSBzeW50aGVzaXplZAotdHlwZSBtYXBzIGFyZSAxLjAuCi0KLTxwPgotCi08Qj5OZXcgYXMgb2YgMC44OjwvQj4gRG9jdW1lbnRzIGluIG11bHRpcGxlIGxhbmd1YWdlcyBjYW4gYWxzbyBiZSByZXNvbHZlZCB0aHJvdWdoIHRoZSB1c2UKLW9mIHRoZSA8Y29kZT5BZGRMYW5ndWFnZTwvY29kZT4gYW5kIDxjb2RlPkxhbmd1YWdlUHJpb3JpdHk8L2NvZGU+IAotZGlyZWN0aXZlczoKLQotPHByZT4KLUFkZExhbmd1YWdlIGVuIC5lbgotQWRkTGFuZ3VhZ2UgZnIgLmZyCi1BZGRMYW5ndWFnZSBkZSAuZGUKLUFkZExhbmd1YWdlIGRhIC5kYQotQWRkTGFuZ3VhZ2UgZWwgLmVsCi1BZGRMYW5ndWFnZSBpdCAuaXQKLQotIyBMYW5ndWFnZVByaW9yaXR5IGFsbG93cyB5b3UgdG8gZ2l2ZSBwcmVjZWRlbmNlIHRvIHNvbWUgbGFuZ3VhZ2VzCi0jIGluIGNhc2Ugb2YgYSB0aWUgZHVyaW5nIGNvbnRlbnQgbmVnb3RpYXRpb24uCi0jIEp1c3QgbGlzdCB0aGUgbGFuZ3VhZ2VzIGluIGRlY3JlYXNpbmcgb3JkZXIgb2YgcHJlZmVyZW5jZS4KLQotTGFuZ3VhZ2VQcmlvcml0eSBlbiBmciBkZQotPC9wcmU+Ci0KLUhlcmUsIGEgcmVxdWVzdCBmb3IgImZvby5odG1sIiBtYXRjaGVkIGFnYWluc3QgImZvby5odG1sLmVuIiBhbmQKLSJmb28uaHRtbC5mciIgd291bGQgcmV0dXJuIGFuIEZyZW5jaCBkb2N1bWVudCB0byBhIGJyb3dzZXIgdGhhdAotaW5kaWNhdGVkIGEgcHJlZmVyZW5jZSBmb3IgRnJlbmNoLCBvciBhbiBFbmdsaXNoIGRvY3VtZW50IG90aGVyd2lzZS4KLUluIGZhY3QsIGEgcmVxdWVzdCBmb3IgImZvbyIgbWF0Y2hlZCBhZ2FpbnN0ICJmb28uaHRtbC5lbiIsCi0iZm9vLmh0bWwuZnIiLCAiZm9vLnBzLmVuIiwgImZvby5wZGYuZGUiLCBhbmQgImZvby50eHQuaXQiIHdvdWxkIGRvCi1qdXN0IHdoYXQgeW91IGV4cGVjdCAtIHRyZWF0IHRob3NlIHN1ZmZpY2VzIGFzIGEgZGF0YWJhc2UgYW5kIGNvbXBhcmUKLXRoZSByZXF1ZXN0IHRvIGl0LCByZXR1cm5pbmcgdGhlIGJlc3QgbWF0Y2guICBUaGUgbGFuZ3VhZ2VzIGFuZCBkYXRhCi10eXBlcyBzaGFyZSB0aGUgc2FtZSBzdWZmaXggbmFtZSBzcGFjZS4KLQotPHA+Ci0KLU5vdGUgdGhhdCB0aGlzIG1hY2hpbmVyeSBvbmx5IGNvbWVzIGludG8gcGxheSBpZiB0aGUgZmlsZSB3aGljaCB0aGUKLXVzZXIgYXR0ZW1wdGVkIHRvIHJldHJpZXZlIGRvZXMgPGVtPm5vdDwvZW0+IGV4aXN0IGJ5IHRoYXQgbmFtZTsgaWYgaXQKLWRvZXMsIGl0IGlzIHNpbXBseSByZXRyaWV2ZWQgYXMgdXN1YWwuICAoU28sIHNvbWVvbmUgd2hvIGFjdHVhbGx5IGFza3MKLWZvciA8Y29kZT5mb28uanBlZzwvY29kZT4sIGFzIG9wcG9zZWQgdG8gPGNvZGU+Zm9vPC9jb2RlPiwgbmV2ZXIgZ2V0cwotPGNvZGU+Zm9vLmdpZjwvY29kZT4pLgotCi08UD48SFI+PFA+Ci08QSBIUkVGPSIuLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2hvbWUuZ2lmIiBBTFQ9IkhvbWUiPjwvQT4KLTxBIEhSRUY9Ii4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9pbmRleC5naWYiIEFMVD0iSW5kZXgiPjwvQT4KLQotPC9ib2R5PiA8L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9jdXN0b20tZXJyb3IuaHRtbCBiL2RvY3MvbWFudWFsL2N1c3RvbS1lcnJvci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWM5NTVhLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2N1c3RvbS1lcnJvci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+Q2N1c3RvbSBlcnJvciByZXNwb25zZXM8L1RJVExFPgotPC9IRUFEPgotCi08Qk9EWT4KLTxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX3N1Yi5naWYiIEFMVD0iIj4KLTxIMT5DdXN0b20gZXJyb3IgcmVzcG9uc2VzPC9IMT4KLTxETD4KLTxEVD5QdXJwb3NlCi08REQ+QWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5LiBBbGxvd3Mgd2VibWFzdGVycyB0byBjb25maWd1cmUgdGhlIHJlc3BvbnNlIG9mCi1BcGFjaGUgdG8gc29tZSBlcnJvciBvciBwcm9ibGVtLjxCUj4KLTxQPkN1c3RvbWl6YWJsZSByZXNwb25zZXMgY2FuIGJlIGRlZmluZWQgdG8gYmUgYWN0aXZhdGVkIGluIHRoZSBldmVudCBvZiBhCi1zZXJ2ZXIgZGV0ZWN0ZWQgZXJyb3Igb3IgcHJvYmxlbS48QlI+Ci1lLmcuIGlmIGEgc2NyaXB0IGNyYXNoZXMgYW5kIHByb2R1Y2VzIGEgIjUwMCBTZXJ2ZXIgRXJyb3IiIHJlc3BvbnNlLCB0aGVuCi10aGlzIHJlc3BvbnNlIGNhbiBiZSByZXBsYWNlZCB3aXRoIGVpdGhlciBzb21lIGZyaWVuZGxpZXIgdGV4dCBvciBieSBhCi1yZWRpcmVjdGlvbiB0byBhbm90aGVyIFVSTCAobG9jYWwgb3IgZXh0ZXJuYWwpLgotPERUPk9sZCBiZWhhdmlvcgotPEREPk5DU0EgaHR0cGQgMS4zIHdvdWxkIHJldHVybiBzb21lIGJvcmluZyBvbGQgZXJyb3IvcHJvYmxlbSBtZXNzYWdlIHdoaWNoCi13b3VsZCBvZnRlbiBiZSBtZWFuaW5nbGVzcyB0byB0aGUgdXNlciwgYW5kIHdvdWxkIHByb3ZpZGUgbm8gbWVhbnMgb2YgbG9nZ2luZwotdGhlIHN5bXB0b21zIHdoaWNoIGNhdXNlZCBpdC48QlI+PEJSPgotPERUPk5ldyBiZWhhdmlvcgotPEREPlRoZSBzZXJ2ZXIgY2FuIGJlIGFza2VkIHRvOwotPE9MPgotPExJPkRpc3BsYXkgc29tZSBvdGhlciB0ZXh0LCBpbnN0ZWFkIG9mIHRoZSBOQ1NBIGhhcmQgY29kZWQgbWVzc2FnZXMsIG9yCi08TEk+cmVkaXJlY3QgdG8gYSBsb2NhbCBVUkwsIG9yCi08TEk+cmVkaXJlY3QgdG8gYW4gZXh0ZXJuYWwgVVJMLgotPC9PTD4KLTxQPlJlZGlyZWN0aW5nIHRvIGFub3RoZXIgVVJMIGNhbiBiZSB1c2VmdWwsIGJ1dCBvbmx5IGlmIHNvbWUgaW5mb3JtYXRpb24KLWNhbiBiZSBwYXNzZWQgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCB0byBleHBsYWluIGFuZC9vciBsb2cgdGhlIGVycm9yL3Byb2JsZW0KLW1vcmUgY2xlYXJseS48QlI+VG8gYWNoaWV2ZSB0aGlzLCBBcGFjaGUgd2lsbCBkZWZpbmUgbmV3IENHSS1saWtlIGVudmlyb25tZW50Ci12YXJpYWJsZXMsIGUuZy4KLTxibG9ja3F1b3RlPjxjb2RlPgotUkVESVJFQ1RfSFRUUF9BQ0NFUFQ9Ki8qLCBpbWFnZS9naWYsIGltYWdlL3gteGJpdG1hcCwgaW1hZ2UvanBlZyA8YnI+Ci1SRURJUkVDVF9IVFRQX1VTRVJfQUdFTlQ9TW96aWxsYS8xLjFiMiAoWDExOyBJOyBIUC1VWCBBLjA5LjA1IDkwMDAvNzEyKSA8YnI+Ci1SRURJUkVDVF9QQVRIPS46L2JpbjovdXNyL2xvY2FsL2JpbjovZXRjIDxicj4KLVJFRElSRUNUX1FVRVJZX1NUUklORz0gPGJyPgotUkVESVJFQ1RfUkVNT1RFX0FERFI9MTIxLjM0NS43OC4xMjMgPGJyPgotUkVESVJFQ1RfUkVNT1RFX0hPU1Q9b29oLmFoaGguY29tIDxicj4KLVJFRElSRUNUX1NFUlZFUl9OQU1FPWNyYXNoLmJhbmcuZWR1IDxicj4KLVJFRElSRUNUX1NFUlZFUl9QT1JUPTgwIDxicj4KLVJFRElSRUNUX1NFUlZFUl9TT0ZUV0FSRT1BcGFjaGUvMC44LjE1IDxicj4KLVJFRElSRUNUX1VSTD0vY2dpLWJpbi9idWdneS5wbCA8YnI+Ci08L2NvZGU+PC9ibG9ja3F1b3RlPgotCi1ub3RlIHRoZSA8Y29kZT5SRURJUkVDVF88L2NvZGU+IHByZWZpeC4gPHA+Ci0KLUF0IGxlYXN0IDxjb2RlPlJFRElSRUNUX1VSTDwvY29kZT4gYW5kIDxjb2RlPlJFRElSRUNUX1FVRVJZX1NUUklORzwvY29kZT4gd2lsbAotYmUgcGFzc2VkIHRvIHRoZSBuZXcgVVJMIChhc3N1bWluZyBpdCdzIGEgY2dpLXNjcmlwdCBvciBhIGNnaS1pbmNsdWRlKS4gVGhlCi1vdGhlciB2YXJpYWJsZXMgd2lsbCBleGlzdCBvbmx5IGlmIHRoZXkgZXhpc3RlZCBwcmlvciB0byB0aGUgZXJyb3IvcHJvYmxlbS48cD4KLQotPERUPkNvbmZpZ3VyYXRpb24KLTxERD48ZW0+ZmlsZTogPC9lbT5zZXJ2ZXIgY29uZmlndXJhdGlvbjxCUj4KLTxQPkhlcmUgYXJlIHNvbWUgZXhhbXBsZXMuLi4KLTxibG9ja3F1b3RlPjxjb2RlPgotRXJyb3JEb2N1bWVudCA1MDAgL2NnaS1iaW4vY3Jhc2gtcmVjb3ZlciA8YnI+Ci1FcnJvckRvY3VtZW50IDUwMCAiU29ycnksIG91ciBzY3JpcHQgY3Jhc2hlZCBiZWNhdXNlICVzLiBPaCBkZWFyPGJyPgotRXJyb3JEb2N1bWVudCA1MDAgaHR0cDovL3h4eC8gPGJyPgotRXJyb3JEb2N1bWVudCA0MDQgL0xhbWVfZXhjdXNlcy9ub3RfZm91bmQuaHRtbCAgPGJyPgotRXJyb3JEb2N1bWVudCA0MDEgL1N1YnNjcmlwdGlvbi9ob3dfdG9fc3Vic2NyaWJlLmh0bWwKLTwvY29kZT48L2Jsb2NrcXVvdGU+Ci1UaGUgc3ludGF4IGlzLCA8cD4KLTxjb2RlPjxBIEhSRUY9ImNvcmUuaHRtbCNlcnJvcmRvY3VtZW50Ij5FcnJvckRvY3VtZW50PC9BPjwvY29kZT4KLSZsdDszLWRpZ2l0LWNvZGUmZ3Q7IGFjdGlvbiA8cD4KLQotd2hlcmUgdGhlIGFjdGlvbiBjYW4gYmUsCi08T0w+Ci08TEk+VGV4dCB0byBiZSBkaXNwbGF5ZWQuPEJSPlByZWZpeCB0aGUgdGV4dCB3aXRoIGEgcXVvdGUgKCZxdW90OykuIFdoYXRldmVyCi1mb2xsb3dzIHRoZSBxdW90ZSBpcyBkaXNwbGF5ZWQuIElmIHRoZSBlcnJvci9wcm9ibGVtIHByb2R1Y2VkIGFueSBhZGRpdGlvbmFsCi1pbmZvcm1hdGlvbiwgaXQgY2FuIGJlIHNwZWNpZmllZCB1c2luZyA8Y29kZT4lczwvY29kZT4uCi08ZW0+Tm90ZTogdGhlICgmcXVvdDspIHByZWZpeCBpc24ndCBkaXNwbGF5ZWQuPC9lbT4KLTxMST5BbiBleHRlcm5hbCBVUkwgdG8gcmVkaXJlY3QgdG8uCi08TEk+QSBsb2NhbCBVUkwgdG8gcmVkaXJlY3QgdG8uCi08L09MPgotPFA+PGNvZGU+RXJyb3JEb2N1bWVudDwvY29kZT4gZGVmaW5pdGlvbnMgYXJlIHNlbnNpdGl2ZSB0byBhCi08Y29kZT5TSUdIVVA8L2NvZGU+LCBzbyB5b3UgY2FuIGNoYW5nZSBhbnkgb2YgdGhlIGRlZmluaXRpb25zIG9yIGFkZCBuZXcgb25lcwotcHJpb3IgdG8gc2VuZGluZyBhIDxjb2RlPlNJR0hVUDwvY29kZT4gKGtpbGwgLTEpIHNpZ25hbC4KLTwvREw+Ci08UD48SFI+PFA+Ci0KLTxoMj5DdXN0b20gZXJyb3IgcmVzcG9uc2VzIGFuZCByZWRpcmVjdHM8L0gyPgotPERMPgotPERUPlB1cnBvc2UKLTxERD5BcGFjaGUncyBiZWhhdmlvdXIgdG8gcmVkaXJlY3RlZCBVUkxzIGhhcyBiZWVuIG1vZGlmaWVkIHNvIHRoYXQgYWRkaXRpb25hbAotZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBhdmFpbGFibGUgdG8gYSBzY3JpcHQvc2VydmVyLWluY2x1ZGUuPHA+Ci0KLTxEVD5PbGQgYmVoYXZpb3VyCi08REQ+U3RhbmRhcmQgQ0dJIHZhcnMgd2VyZSBtYWRlIGF2YWlsYWJsZSB0byBhIHNjcmlwdCB3aGljaCBoYXMgYmVlbgotcmVkaXJlY3RlZCB0by4gTm8gaW5kaWNhdGlvbiBvZiB3aGVyZSB0aGUgcmVkaXJlY3Rpb24gY2FtZSBmcm9tIHdhcyBwcm92aWRlZC4KLTxwPgotPERUPk5ldyBiZWhhdmlvdXIKLTxERD5BIG5ldyBiYXRjaCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2lsbCBiZSBpbml0aWFsaXplZCBmb3IgdXNlIGJ5IGEKLXNjcmlwdCB3aGljaCBoYXMgYmVlbiByZWRpcmVjdGVkIHRvLjxCUj4KLUVhY2ggbmV3IHZhcmlhYmxlIHdpbGwgaGF2ZSB0aGUgcHJlZml4IDxjb2RlPlJFRElSRUNUXzwvY29kZT4uPEJSPgotUkVESVJFQ1RfIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgY3JlYXRlZCBmcm9tIHRoZSBDR0kgZW52aXJvbm1lbnQKLXZhcmlhYmxlcyB3aGljaCBleGlzdGVkIHByaW9yIHRvIHRoZSByZWRpcmVjdCwgdGhleSBhcmUgcmVuYW1lZCB3aXRoIGEKLVJFRElSRUNUXyBwcmVmaXgsIGkuZS4gSFRUUF9VU0VSX0FHRU5UIC0mZ3Q7IFJFRElSRUNUX0hUVFBfVVNFUl9BR0VOVC48QlI+Ci1JbiBhZGRpdGlvbiB0byB0aGVzZSBuZXcgdmFyaWFibGVzLCBBcGFjaGUgd2lsbCBkZWZpbmUKLTxjb2RlPlJFRElSRUNUX1VSTDwvY29kZT4gYW5kIDxjb2RlPlJFRElSRUNUX1NUQVRVUzwvY29kZT4gdG8gaGVscCB0aGUgc2NyaXB0Ci10cmFjZSBpdHMgb3JpZ2luLjxCUj4KLUxvZ2dpbmc6IGJvdGggdGhlIG9yaWdpbmFsIFVSTCBhbmQgdGhlIFVSTCBiZWluZyByZWRpcmVjdGVkIHRvLCB3aWxsCi1ub3cgYmUgbG9nZ2VkIGNvcnJlY3RseSBpbiB0aGUgYWNjZXNzIGxvZy48cD4KLTwvREw+Ci08UD48SFI+Ci0KLTxBIEhSRUY9Ii4uLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfaG9tZS5naWYiIEFMVD0iSG9tZSI+PC9BPgotPEEgSFJFRj0iLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2luZGV4LmdpZiIgQUxUPSJJbmRleCI+PC9BPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvY3VzdG9tLWVycm9yLmh0bWwuZW4gYi9kb2NzL21hbnVhbC9jdXN0b20tZXJyb3IuaHRtbC5lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFjOTU1YS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9jdXN0b20tZXJyb3IuaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08SFRNTD4KLTxIRUFEPgotPFRJVExFPkNjdXN0b20gZXJyb3IgcmVzcG9uc2VzPC9USVRMRT4KLTwvSEVBRD4KLQotPEJPRFk+Ci08SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9zdWIuZ2lmIiBBTFQ9IiI+Ci08SDE+Q3VzdG9tIGVycm9yIHJlc3BvbnNlczwvSDE+Ci08REw+Ci08RFQ+UHVycG9zZQotPEREPkFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eS4gQWxsb3dzIHdlYm1hc3RlcnMgdG8gY29uZmlndXJlIHRoZSByZXNwb25zZSBvZgotQXBhY2hlIHRvIHNvbWUgZXJyb3Igb3IgcHJvYmxlbS48QlI+Ci08UD5DdXN0b21pemFibGUgcmVzcG9uc2VzIGNhbiBiZSBkZWZpbmVkIHRvIGJlIGFjdGl2YXRlZCBpbiB0aGUgZXZlbnQgb2YgYQotc2VydmVyIGRldGVjdGVkIGVycm9yIG9yIHByb2JsZW0uPEJSPgotZS5nLiBpZiBhIHNjcmlwdCBjcmFzaGVzIGFuZCBwcm9kdWNlcyBhICI1MDAgU2VydmVyIEVycm9yIiByZXNwb25zZSwgdGhlbgotdGhpcyByZXNwb25zZSBjYW4gYmUgcmVwbGFjZWQgd2l0aCBlaXRoZXIgc29tZSBmcmllbmRsaWVyIHRleHQgb3IgYnkgYQotcmVkaXJlY3Rpb24gdG8gYW5vdGhlciBVUkwgKGxvY2FsIG9yIGV4dGVybmFsKS4KLTxEVD5PbGQgYmVoYXZpb3IKLTxERD5OQ1NBIGh0dHBkIDEuMyB3b3VsZCByZXR1cm4gc29tZSBib3Jpbmcgb2xkIGVycm9yL3Byb2JsZW0gbWVzc2FnZSB3aGljaAotd291bGQgb2Z0ZW4gYmUgbWVhbmluZ2xlc3MgdG8gdGhlIHVzZXIsIGFuZCB3b3VsZCBwcm92aWRlIG5vIG1lYW5zIG9mIGxvZ2dpbmcKLXRoZSBzeW1wdG9tcyB3aGljaCBjYXVzZWQgaXQuPEJSPjxCUj4KLTxEVD5OZXcgYmVoYXZpb3IKLTxERD5UaGUgc2VydmVyIGNhbiBiZSBhc2tlZCB0bzsKLTxPTD4KLTxMST5EaXNwbGF5IHNvbWUgb3RoZXIgdGV4dCwgaW5zdGVhZCBvZiB0aGUgTkNTQSBoYXJkIGNvZGVkIG1lc3NhZ2VzLCBvcgotPExJPnJlZGlyZWN0IHRvIGEgbG9jYWwgVVJMLCBvcgotPExJPnJlZGlyZWN0IHRvIGFuIGV4dGVybmFsIFVSTC4KLTwvT0w+Ci08UD5SZWRpcmVjdGluZyB0byBhbm90aGVyIFVSTCBjYW4gYmUgdXNlZnVsLCBidXQgb25seSBpZiBzb21lIGluZm9ybWF0aW9uCi1jYW4gYmUgcGFzc2VkIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgdG8gZXhwbGFpbiBhbmQvb3IgbG9nIHRoZSBlcnJvci9wcm9ibGVtCi1tb3JlIGNsZWFybHkuPEJSPlRvIGFjaGlldmUgdGhpcywgQXBhY2hlIHdpbGwgZGVmaW5lIG5ldyBDR0ktbGlrZSBlbnZpcm9ubWVudAotdmFyaWFibGVzLCBlLmcuCi08YmxvY2txdW90ZT48Y29kZT4KLVJFRElSRUNUX0hUVFBfQUNDRVBUPSovKiwgaW1hZ2UvZ2lmLCBpbWFnZS94LXhiaXRtYXAsIGltYWdlL2pwZWcgPGJyPgotUkVESVJFQ1RfSFRUUF9VU0VSX0FHRU5UPU1vemlsbGEvMS4xYjIgKFgxMTsgSTsgSFAtVVggQS4wOS4wNSA5MDAwLzcxMikgPGJyPgotUkVESVJFQ1RfUEFUSD0uOi9iaW46L3Vzci9sb2NhbC9iaW46L2V0YyA8YnI+Ci1SRURJUkVDVF9RVUVSWV9TVFJJTkc9IDxicj4KLVJFRElSRUNUX1JFTU9URV9BRERSPTEyMS4zNDUuNzguMTIzIDxicj4KLVJFRElSRUNUX1JFTU9URV9IT1NUPW9vaC5haGhoLmNvbSA8YnI+Ci1SRURJUkVDVF9TRVJWRVJfTkFNRT1jcmFzaC5iYW5nLmVkdSA8YnI+Ci1SRURJUkVDVF9TRVJWRVJfUE9SVD04MCA8YnI+Ci1SRURJUkVDVF9TRVJWRVJfU09GVFdBUkU9QXBhY2hlLzAuOC4xNSA8YnI+Ci1SRURJUkVDVF9VUkw9L2NnaS1iaW4vYnVnZ3kucGwgPGJyPgotPC9jb2RlPjwvYmxvY2txdW90ZT4KLQotbm90ZSB0aGUgPGNvZGU+UkVESVJFQ1RfPC9jb2RlPiBwcmVmaXguIDxwPgotCi1BdCBsZWFzdCA8Y29kZT5SRURJUkVDVF9VUkw8L2NvZGU+IGFuZCA8Y29kZT5SRURJUkVDVF9RVUVSWV9TVFJJTkc8L2NvZGU+IHdpbGwKLWJlIHBhc3NlZCB0byB0aGUgbmV3IFVSTCAoYXNzdW1pbmcgaXQncyBhIGNnaS1zY3JpcHQgb3IgYSBjZ2ktaW5jbHVkZSkuIFRoZQotb3RoZXIgdmFyaWFibGVzIHdpbGwgZXhpc3Qgb25seSBpZiB0aGV5IGV4aXN0ZWQgcHJpb3IgdG8gdGhlIGVycm9yL3Byb2JsZW0uPHA+Ci0KLTxEVD5Db25maWd1cmF0aW9uCi08REQ+PGVtPmZpbGU6IDwvZW0+c2VydmVyIGNvbmZpZ3VyYXRpb248QlI+Ci08UD5IZXJlIGFyZSBzb21lIGV4YW1wbGVzLi4uCi08YmxvY2txdW90ZT48Y29kZT4KLUVycm9yRG9jdW1lbnQgNTAwIC9jZ2ktYmluL2NyYXNoLXJlY292ZXIgPGJyPgotRXJyb3JEb2N1bWVudCA1MDAgIlNvcnJ5LCBvdXIgc2NyaXB0IGNyYXNoZWQgYmVjYXVzZSAlcy4gT2ggZGVhcjxicj4KLUVycm9yRG9jdW1lbnQgNTAwIGh0dHA6Ly94eHgvIDxicj4KLUVycm9yRG9jdW1lbnQgNDA0IC9MYW1lX2V4Y3VzZXMvbm90X2ZvdW5kLmh0bWwgIDxicj4KLUVycm9yRG9jdW1lbnQgNDAxIC9TdWJzY3JpcHRpb24vaG93X3RvX3N1YnNjcmliZS5odG1sCi08L2NvZGU+PC9ibG9ja3F1b3RlPgotVGhlIHN5bnRheCBpcywgPHA+Ci08Y29kZT48QSBIUkVGPSJjb3JlLmh0bWwjZXJyb3Jkb2N1bWVudCI+RXJyb3JEb2N1bWVudDwvQT48L2NvZGU+Ci0mbHQ7My1kaWdpdC1jb2RlJmd0OyBhY3Rpb24gPHA+Ci0KLXdoZXJlIHRoZSBhY3Rpb24gY2FuIGJlLAotPE9MPgotPExJPlRleHQgdG8gYmUgZGlzcGxheWVkLjxCUj5QcmVmaXggdGhlIHRleHQgd2l0aCBhIHF1b3RlICgmcXVvdDspLiBXaGF0ZXZlcgotZm9sbG93cyB0aGUgcXVvdGUgaXMgZGlzcGxheWVkLiBJZiB0aGUgZXJyb3IvcHJvYmxlbSBwcm9kdWNlZCBhbnkgYWRkaXRpb25hbAotaW5mb3JtYXRpb24sIGl0IGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgPGNvZGU+JXM8L2NvZGU+LgotPGVtPk5vdGU6IHRoZSAoJnF1b3Q7KSBwcmVmaXggaXNuJ3QgZGlzcGxheWVkLjwvZW0+Ci08TEk+QW4gZXh0ZXJuYWwgVVJMIHRvIHJlZGlyZWN0IHRvLgotPExJPkEgbG9jYWwgVVJMIHRvIHJlZGlyZWN0IHRvLgotPC9PTD4KLTxQPjxjb2RlPkVycm9yRG9jdW1lbnQ8L2NvZGU+IGRlZmluaXRpb25zIGFyZSBzZW5zaXRpdmUgdG8gYQotPGNvZGU+U0lHSFVQPC9jb2RlPiwgc28geW91IGNhbiBjaGFuZ2UgYW55IG9mIHRoZSBkZWZpbml0aW9ucyBvciBhZGQgbmV3IG9uZXMKLXByaW9yIHRvIHNlbmRpbmcgYSA8Y29kZT5TSUdIVVA8L2NvZGU+IChraWxsIC0xKSBzaWduYWwuCi08L0RMPgotPFA+PEhSPjxQPgotCi08aDI+Q3VzdG9tIGVycm9yIHJlc3BvbnNlcyBhbmQgcmVkaXJlY3RzPC9IMj4KLTxETD4KLTxEVD5QdXJwb3NlCi08REQ+QXBhY2hlJ3MgYmVoYXZpb3VyIHRvIHJlZGlyZWN0ZWQgVVJMcyBoYXMgYmVlbiBtb2RpZmllZCBzbyB0aGF0IGFkZGl0aW9uYWwKLWVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgYXZhaWxhYmxlIHRvIGEgc2NyaXB0L3NlcnZlci1pbmNsdWRlLjxwPgotCi08RFQ+T2xkIGJlaGF2aW91cgotPEREPlN0YW5kYXJkIENHSSB2YXJzIHdlcmUgbWFkZSBhdmFpbGFibGUgdG8gYSBzY3JpcHQgd2hpY2ggaGFzIGJlZW4KLXJlZGlyZWN0ZWQgdG8uIE5vIGluZGljYXRpb24gb2Ygd2hlcmUgdGhlIHJlZGlyZWN0aW9uIGNhbWUgZnJvbSB3YXMgcHJvdmlkZWQuCi08cD4KLTxEVD5OZXcgYmVoYXZpb3VyCi08REQ+QSBuZXcgYmF0Y2ggb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpbGwgYmUgaW5pdGlhbGl6ZWQgZm9yIHVzZSBieSBhCi1zY3JpcHQgd2hpY2ggaGFzIGJlZW4gcmVkaXJlY3RlZCB0by48QlI+Ci1FYWNoIG5ldyB2YXJpYWJsZSB3aWxsIGhhdmUgdGhlIHByZWZpeCA8Y29kZT5SRURJUkVDVF88L2NvZGU+LjxCUj4KLVJFRElSRUNUXyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGNyZWF0ZWQgZnJvbSB0aGUgQ0dJIGVudmlyb25tZW50Ci12YXJpYWJsZXMgd2hpY2ggZXhpc3RlZCBwcmlvciB0byB0aGUgcmVkaXJlY3QsIHRoZXkgYXJlIHJlbmFtZWQgd2l0aCBhCi1SRURJUkVDVF8gcHJlZml4LCBpLmUuIEhUVFBfVVNFUl9BR0VOVCAtJmd0OyBSRURJUkVDVF9IVFRQX1VTRVJfQUdFTlQuPEJSPgotSW4gYWRkaXRpb24gdG8gdGhlc2UgbmV3IHZhcmlhYmxlcywgQXBhY2hlIHdpbGwgZGVmaW5lCi08Y29kZT5SRURJUkVDVF9VUkw8L2NvZGU+IGFuZCA8Y29kZT5SRURJUkVDVF9TVEFUVVM8L2NvZGU+IHRvIGhlbHAgdGhlIHNjcmlwdAotdHJhY2UgaXRzIG9yaWdpbi48QlI+Ci1Mb2dnaW5nOiBib3RoIHRoZSBvcmlnaW5hbCBVUkwgYW5kIHRoZSBVUkwgYmVpbmcgcmVkaXJlY3RlZCB0bywgd2lsbAotbm93IGJlIGxvZ2dlZCBjb3JyZWN0bHkgaW4gdGhlIGFjY2VzcyBsb2cuPHA+Ci08L0RMPgotPFA+PEhSPgotCi08QSBIUkVGPSIuLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2hvbWUuZ2lmIiBBTFQ9IkhvbWUiPjwvQT4KLTxBIEhSRUY9Ii4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9pbmRleC5naWYiIEFMVD0iSW5kZXgiPjwvQT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2RldmVsb3Blci9BUEkuaHRtbCBiL2RvY3MvbWFudWFsL2RldmVsb3Blci9BUEkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg2MDk5Ni4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9kZXZlbG9wZXIvQVBJLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ODggKzAsMCBAQAotPCEtLSVoeXBlcnRleHQgLS0+Ci08aHRtbD48aGVhZD4KLTx0aXRsZT5BcGFjaGUgQVBJIG5vdGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPCEtLS8laHlwZXJ0ZXh0IC0tPgotPGgxPkFwYWNoZSBBUEkgbm90ZXM8L2gxPgotCi1UaGVzZSBhcmUgc29tZSBub3RlcyBvbiB0aGUgQXBhY2hlIEFQSSBhbmQgdGhlIGRhdGEgc3RydWN0dXJlcyB5b3UKLWhhdmUgdG8gZGVhbCB3aXRoLCBldGMuICBUaGV5IGFyZSBub3QgeWV0IG5lYXJseSBjb21wbGV0ZSwgYnV0Ci1ob3BlZnVsbHksIHRoZXkgd2lsbCBoZWxwIHlvdSBnZXQgeW91ciBiZWFyaW5ncy4gIEtlZXAgaW4gbWluZCB0aGF0Ci10aGUgQVBJIGlzIHN0aWxsIHN1YmplY3QgdG8gY2hhbmdlIGFzIHdlIGdhaW4gZXhwZXJpZW5jZSB3aXRoIGl0LgotKFNlZSB0aGUgVE9ETyBmaWxlIGZvciB3aGF0IDxlbT5taWdodDwvZW0+IGJlIGNvbWluZykuICBIb3dldmVyLAotaXQgd2lsbCBiZSBlYXN5IHRvIGFkYXB0IG1vZHVsZXMgdG8gYW55IGNoYW5nZXMgdGhhdCBhcmUgbWFkZS4KLShXZSBoYXZlIG1vcmUgbW9kdWxlcyB0byBhZGFwdCB0aGFuIHlvdSBkbykuCi08cD4KLQotQSBmZXcgbm90ZXMgb24gZ2VuZXJhbCBwZWRhZ29naWNhbCBzdHlsZSBoZXJlLiAgSW4gdGhlIGludGVyZXN0IG9mCi1jb25jaXNlbmVzcywgYWxsIHN0cnVjdHVyZSBkZWNsYXJhdGlvbnMgaGVyZSBhcmUgaW5jb21wbGV0ZSAtLS0gdGhlCi1yZWFsIG9uZXMgaGF2ZSBtb3JlIHNsb3RzIHRoYXQgSSdtIG5vdCB0ZWxsaW5nIHlvdSBhYm91dC4gIEZvciB0aGUKLW1vc3QgcGFydCwgdGhlc2UgYXJlIHJlc2VydmVkIHRvIG9uZSBjb21wb25lbnQgb2YgdGhlIHNlcnZlciBjb3JlIG9yCi1hbm90aGVyLCBhbmQgc2hvdWxkIGJlIGFsdGVyZWQgYnkgbW9kdWxlcyB3aXRoIGNhdXRpb24uICBIb3dldmVyLCBpbgotc29tZSBjYXNlcywgdGhleSByZWFsbHkgYXJlIHRoaW5ncyBJIGp1c3QgaGF2ZW4ndCBnb3R0ZW4gYXJvdW5kIHRvCi15ZXQuICBXZWxjb21lIHRvIHRoZSBibGVlZGluZyBlZGdlLjxwPgotCi1GaW5hbGx5LCBoZXJlJ3MgYW4gb3V0bGluZSwgdG8gZ2l2ZSB5b3Ugc29tZSBiYXJlIGlkZWEgb2Ygd2hhdCdzCi1jb21pbmcgdXAsIGFuZCBpbiB3aGF0IG9yZGVyOgotCi08dWw+Ci08bGk+IDxhIGhyZWY9IiNiYXNpY3MiPkJhc2ljIGNvbmNlcHRzLjwvYT4KLTxtZW51PgotIDxsaT4gPGEgaHJlZj0iI0hNUiI+SGFuZGxlcnMsIE1vZHVsZXMsIGFuZCBSZXF1ZXN0czwvYT4KLSA8bGk+IDxhIGhyZWY9IiNtb2R1bGV0b3VyIj5BIGJyaWVmIHRvdXIgb2YgYSBtb2R1bGU8L2E+Ci08L21lbnU+Ci08bGk+IDxhIGhyZWY9IiNoYW5kbGVycyI+SG93IGhhbmRsZXJzIHdvcms8L2E+Ci08bWVudT4KLSA8bGk+IDxhIGhyZWY9IiNyZXFfdG91ciI+QSBicmllZiB0b3VyIG9mIHRoZSA8Y29kZT5yZXF1ZXN0X3JlYzwvY29kZT48L2E+Ci0gPGxpPiA8YSBocmVmPSIjcmVxX29yaWciPldoZXJlIHJlcXVlc3RfcmVjIHN0cnVjdHVyZXMgY29tZSBmcm9tPC9hPgotIDxsaT4gPGEgaHJlZj0iI3JlcV9yZXR1cm4iPkhhbmRsaW5nIHJlcXVlc3RzLCBkZWNsaW5pbmcsIGFuZCByZXR1cm5pbmcgZXJyb3IgY29kZXM8L2E+Ci0gPGxpPiA8YSBocmVmPSIjcmVzcF9oYW5kbGVycyI+U3BlY2lhbCBjb25zaWRlcmF0aW9ucyBmb3IgcmVzcG9uc2UgaGFuZGxlcnM8L2E+Ci0gPGxpPiA8YSBocmVmPSIjYXV0aF9oYW5kbGVycyI+U3BlY2lhbCBjb25zaWRlcmF0aW9ucyBmb3IgYXV0aGVudGljYXRpb24gaGFuZGxlcnM8L2E+Ci0gPGxpPiA8YSBocmVmPSIjbG9nX2hhbmRsZXJzIj5TcGVjaWFsIGNvbnNpZGVyYXRpb25zIGZvciBsb2dnaW5nIGhhbmRsZXJzPC9hPgotPC9tZW51PgotPGxpPiA8YSBocmVmPSIjcG9vbHMiPlJlc291cmNlIGFsbG9jYXRpb24gYW5kIHJlc291cmNlIHBvb2xzPC9hPgotPGxpPiA8YSBocmVmPSIjY29uZmlnIj5Db25maWd1cmF0aW9uLCBjb21tYW5kcyBhbmQgdGhlIGxpa2U8L2E+Ci08bWVudT4KLSA8bGk+IDxhIGhyZWY9IiNwZXItZGlyIj5QZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlczwvYT4KLSA8bGk+IDxhIGhyZWY9IiNjb21tYW5kcyI+Q29tbWFuZCBoYW5kbGluZzwvYT4KLSA8bGk+IDxhIGhyZWY9IiNzZXJ2Y29uZiI+U2lkZSBub3RlcyAtLS0gcGVyLXNlcnZlciBjb25maWd1cmF0aW9uLCB2aXJ0dWFsIHNlcnZlcnMsIGV0Yy48L2E+Ci08L21lbnU+Ci08L3VsPgotCi08aDI+PGEgbmFtZT0iYmFzaWNzIj5CYXNpYyBjb25jZXB0cy48L2E+PC9oMj4KLQotV2UgYmVnaW4gd2l0aCBhbiBvdmVydmlldyBvZiB0aGUgYmFzaWMgY29uY2VwdHMgYmVoaW5kIHRoZSAKLUFQSSwgYW5kIGhvdyB0aGV5IGFyZSBtYW5pZmVzdGVkIGluIHRoZSBjb2RlLgotCi08aDM+PGEgbmFtZT0iSE1SIj5IYW5kbGVycywgTW9kdWxlcywgYW5kIFJlcXVlc3RzPC9hPjwvaDM+Ci0KLUFwYWNoZSBicmVha3MgZG93biByZXF1ZXN0IGhhbmRsaW5nIGludG8gYSBzZXJpZXMgb2Ygc3RlcHMsIG1vcmUgb3IKLWxlc3MgdGhlIHNhbWUgd2F5IHRoZSBOZXRzY2FwZSBzZXJ2ZXIgQVBJIGRvZXMgKGFsdGhvdWdoIHRoaXMgQVBJIGhhcwotYSBmZXcgbW9yZSBzdGFnZXMgdGhhbiBOZXRTaXRlIGRvZXMsIGFzIGhvb2tzIGZvciBzdHVmZiBJIHRob3VnaHQKLW1pZ2h0IGJlIHVzZWZ1bCBpbiB0aGUgZnV0dXJlKS4gIFRoZXNlIGFyZToKLQotPHVsPgotICA8bGk+IFVSSSAtJmd0OyBGaWxlbmFtZSB0cmFuc2xhdGlvbgotICA8bGk+IEF1dGggSUQgY2hlY2tpbmcgW2lzIHRoZSB1c2VyIHdobyB0aGV5IHNheSB0aGV5IGFyZT9dCi0gIDxsaT4gQXV0aCBhY2Nlc3MgY2hlY2tpbmcgW2lzIHRoZSB1c2VyIGF1dGhvcml6ZWQgPGVtPmhlcmU8L2VtPj9dCi0gIDxsaT4gQWNjZXNzIGNoZWNraW5nIG90aGVyIHRoYW4gYXV0aAotICA8bGk+IERldGVybWluaW5nIE1JTUUgdHlwZSBvZiB0aGUgb2JqZWN0IHJlcXVlc3RlZAotICA8bGk+IGBGaXh1cHMnIC0tLSB0aGVyZSBhcmVuJ3QgYW55IG9mIHRoZXNlIHlldCwgYnV0IHRoZSBwaGFzZSBpcwotICAgICAgIGludGVuZGVkIGFzIGEgaG9vayBmb3IgcG9zc2libGUgZXh0ZW5zaW9ucyBsaWtlCi0gICAgICAgPGNvZGU+U2V0RW52PC9jb2RlPiwgd2hpY2ggZG9uJ3QgcmVhbGx5IGZpdCB3ZWxsIGVsc2V3aGVyZS4KLSAgPGxpPiBBY3R1YWxseSBzZW5kaW5nIGEgcmVzcG9uc2UgYmFjayB0byB0aGUgY2xpZW50LiAgCi0gIDxsaT4gTG9nZ2luZyB0aGUgcmVxdWVzdAotPC91bD4KLQotVGhlc2UgcGhhc2VzIGFyZSBoYW5kbGVkIGJ5IGxvb2tpbmcgYXQgZWFjaCBvZiBhIHN1Y2Nlc3Npb24gb2YKLTxlbT5tb2R1bGVzPC9lbT4sIGxvb2tpbmcgdG8gc2VlIGlmIGVhY2ggb2YgdGhlbSBoYXMgYSBoYW5kbGVyIGZvciB0aGUKLXBoYXNlLCBhbmQgYXR0ZW1wdGluZyBpbnZva2luZyBpdCBpZiBzby4gIFRoZSBoYW5kbGVyIGNhbiB0eXBpY2FsbHkgZG8KLW9uZSBvZiB0aHJlZSB0aGluZ3M6Ci0KLTx1bD4KLSAgPGxpPiA8ZW0+SGFuZGxlPC9lbT4gdGhlIHJlcXVlc3QsIGFuZCBpbmRpY2F0ZSB0aGF0IGl0IGhhcyBkb25lIHNvCi0gICAgICAgYnkgcmV0dXJuaW5nIHRoZSBtYWdpYyBjb25zdGFudCA8Y29kZT5PSzwvY29kZT4uICAKLSAgPGxpPiA8ZW0+RGVjbGluZTwvZW0+IHRvIGhhbmRsZSB0aGUgcmVxdWVzdCwgYnkgcmV0dXJuaW5nIHRoZSBtYWdpYwotICAgICAgIGludGVnZXIgY29uc3RhbnQgPGNvZGU+REVDTElORUQ8L2NvZGU+LiAgSW4gdGhpcyBjYXNlLCB0aGUKLSAgICAgICBzZXJ2ZXIgYmVoYXZlcyBpbiBhbGwgcmVzcGVjdHMgYXMgaWYgdGhlIGhhbmRsZXIgc2ltcGx5IGhhZG4ndAotICAgICAgIGJlZW4gdGhlcmUuCi0gIDxsaT4gU2lnbmFsIGFuIGVycm9yLCBieSByZXR1cm5pbmcgb25lIG9mIHRoZSBIVFRQIGVycm9yIGNvZGVzLgotICAgICAgIFRoaXMgdGVybWluYXRlcyBub3JtYWwgaGFuZGxpbmcgb2YgdGhlIHJlcXVlc3QsIGFsdGhvdWdoIGFuCi0gICAgICAgRXJyb3JEb2N1bWVudCBtYXkgYmUgaW52b2tlZCB0byB0cnkgdG8gbW9wIHVwLCBhbmQgaXQgd2lsbCBiZQotICAgICAgIGxvZ2dlZCBpbiBhbnkgY2FzZS4KLTwvdWw+Ci0KLU1vc3QgcGhhc2VzIGFyZSB0ZXJtaW5hdGVkIGJ5IHRoZSBmaXJzdCBtb2R1bGUgdGhhdCBoYW5kbGVzIHRoZW07Ci1ob3dldmVyLCBmb3IgbG9nZ2luZywgYGZpeHVwcycsIGFuZCBub24tYWNjZXNzIGF1dGhlbnRpY2F0aW9uCi1jaGVja2luZywgYWxsIGhhbmRsZXJzIGFsd2F5cyBydW4gKGJhcnJpbmcgYW4gZXJyb3IpLiAgQWxzbywgdGhlCi1yZXNwb25zZSBwaGFzZSBpcyB1bmlxdWUgaW4gdGhhdCBtb2R1bGVzIG1heSBkZWNsYXJlIG11bHRpcGxlIGhhbmRsZXJzCi1mb3IgaXQsIHZpYSBhIGRpc3BhdGNoIHRhYmxlIGtleWVkIG9uIHRoZSBNSU1FIHR5cGUgb2YgdGhlIHJlcXVlc3RlZAotb2JqZWN0LiAgTW9kdWxlcyBtYXkgZGVjbGFyZSBhIHJlc3BvbnNlLXBoYXNlIGhhbmRsZXIgd2hpY2ggY2FuIGhhbmRsZQotPGVtPmFueTwvZW0+IHJlcXVlc3QsIGJ5IGdpdmluZyBpdCB0aGUga2V5IDxjb2RlPiovKjwvY29kZT4gKGkuZS4sIGEKLXdpbGRjYXJkIE1JTUUgdHlwZSBzcGVjaWZpY2F0aW9uKS4gIEhvd2V2ZXIsIHdpbGRjYXJkIGhhbmRsZXJzIGFyZQotb25seSBpbnZva2VkIGlmIHRoZSBzZXJ2ZXIgaGFzIGFscmVhZHkgdHJpZWQgYW5kIGZhaWxlZCB0byBmaW5kIGEgbW9yZQotc3BlY2lmaWMgcmVzcG9uc2UgaGFuZGxlciBmb3IgdGhlIE1JTUUgdHlwZSBvZiB0aGUgcmVxdWVzdGVkIG9iamVjdAotKGVpdGhlciBub25lIGV4aXN0ZWQsIG9yIHRoZXkgYWxsIGRlY2xpbmVkKS48cD4KLQotVGhlIGhhbmRsZXJzIHRoZW1zZWx2ZXMgYXJlIGZ1bmN0aW9ucyBvZiBvbmUgYXJndW1lbnQgKGEKLTxjb2RlPnJlcXVlc3RfcmVjPC9jb2RlPiBzdHJ1Y3R1cmUuIHZpZGUgaW5mcmEpLCB3aGljaCByZXR1cm5zIGFuCi1pbnRlZ2VyLCBhcyBhYm92ZS48cD4KLQotPGgzPjxhIG5hbWU9Im1vZHVsZXRvdXIiPkEgYnJpZWYgdG91ciBvZiBhIG1vZHVsZTwvYT48L2gzPgotCi1BdCB0aGlzIHBvaW50LCB3ZSBuZWVkIHRvIGV4cGxhaW4gdGhlIHN0cnVjdHVyZSBvZiBhIG1vZHVsZS4gIE91cgotY2FuZGlkYXRlIHdpbGwgYmUgb25lIG9mIHRoZSBtZXNzaWVyIG9uZXMsIHRoZSBDR0kgbW9kdWxlIC0tLSB0aGlzCi1oYW5kbGVzIGJvdGggQ0dJIHNjcmlwdHMgYW5kIHRoZSA8Y29kZT5TY3JpcHRBbGlhczwvY29kZT4gY29uZmlnIGZpbGUKLWNvbW1hbmQuICBJdCdzIGFjdHVhbGx5IGEgZ3JlYXQgZGVhbCBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gbW9zdAotbW9kdWxlcywgYnV0IGlmIHdlJ3JlIGdvaW5nIHRvIGhhdmUgb25seSBvbmUgZXhhbXBsZSwgaXQgbWlnaHQgYXMgd2VsbAotYmUgdGhlIG9uZSB3aXRoIGl0cyBmaW5nZXJzIGluIGV2ZXJ5IHBsYWNlLjxwPgotCi1MZXQncyBiZWdpbiB3aXRoIGhhbmRsZXJzLiAgSW4gb3JkZXIgdG8gaGFuZGxlIHRoZSBDR0kgc2NyaXB0cywgdGhlCi1tb2R1bGUgZGVjbGFyZXMgYSByZXNwb25zZSBoYW5kbGVyIGZvciB0aGVtLiBCZWNhdXNlIG9mCi08Y29kZT5TY3JpcHRBbGlhczwvY29kZT4sIGl0IGFsc28gaGFzIGhhbmRsZXJzIGZvciB0aGUgbmFtZQotdHJhbnNsYXRpb24gcGhhc2UgKHRvIHJlY29nbmlzZSA8Y29kZT5TY3JpcHRBbGlhczwvY29kZT5lZCBVUklzKSwgdGhlCi10eXBlLWNoZWNraW5nIHBoYXNlIChhbnkgPGNvZGU+U2NyaXB0QWxpYXM8L2NvZGU+ZWQgcmVxdWVzdCBpcyB0eXBlZAotYXMgYSBDR0kgc2NyaXB0KS48cD4KLQotVGhlIG1vZHVsZSBuZWVkcyB0byBtYWludGFpbiBzb21lIHBlciAodmlydHVhbCkKLXNlcnZlciBpbmZvcm1hdGlvbiwgbmFtZWx5LCB0aGUgPGNvZGU+U2NyaXB0QWxpYXM8L2NvZGU+ZXMgaW4gZWZmZWN0OwotdGhlIG1vZHVsZSBzdHJ1Y3R1cmUgdGhlcmVmb3JlIGNvbnRhaW5zIHBvaW50ZXJzIHRvIGEgZnVuY3Rpb25zIHdoaWNoCi1idWlsZHMgdGhlc2Ugc3RydWN0dXJlcywgYW5kIHRvIGFub3RoZXIgd2hpY2ggY29tYmluZXMgdHdvIG9mIHRoZW0gKGluCi1jYXNlIHRoZSBtYWluIHNlcnZlciBhbmQgYSB2aXJ0dWFsIHNlcnZlciBib3RoIGhhdmUKLTxjb2RlPlNjcmlwdEFsaWFzPC9jb2RlPmVzIGRlY2xhcmVkKS48cD4KLQotRmluYWxseSwgdGhpcyBtb2R1bGUgY29udGFpbnMgY29kZSB0byBoYW5kbGUgdGhlCi08Y29kZT5TY3JpcHRBbGlhczwvY29kZT4gY29tbWFuZCBpdHNlbGYuICBUaGlzIHBhcnRpY3VsYXIgbW9kdWxlIG9ubHkKLWRlY2xhcmVzIG9uZSBjb21tYW5kLCBidXQgdGhlcmUgY291bGQgYmUgbW9yZSwgc28gbW9kdWxlcyBoYXZlCi08ZW0+Y29tbWFuZCB0YWJsZXM8L2VtPiB3aGljaCBkZWNsYXJlIHRoZWlyIGNvbW1hbmRzLCBhbmQgZGVzY3JpYmUKLXdoZXJlIHRoZXkgYXJlIHBlcm1pdHRlZCwgYW5kIGhvdyB0aGV5IGFyZSB0byBiZSBpbnZva2VkLiAgPHA+Ci0KLUEgZmluYWwgbm90ZSBvbiB0aGUgZGVjbGFyZWQgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyBvZiBzb21lIG9mIHRoZXNlCi1jb21tYW5kczogYSA8Y29kZT5wb29sPC9jb2RlPiBpcyBhIHBvaW50ZXIgdG8gYSA8ZW0+cmVzb3VyY2UgcG9vbDwvZW0+Ci1zdHJ1Y3R1cmU7IHRoZXNlIGFyZSB1c2VkIGJ5IHRoZSBzZXJ2ZXIgdG8ga2VlcCB0cmFjayBvZiB0aGUgbWVtb3J5Ci13aGljaCBoYXMgYmVlbiBhbGxvY2F0ZWQsIGZpbGVzIG9wZW5lZCwgZXRjLiwgZWl0aGVyIHRvIHNlcnZpY2UgYQotcGFydGljdWxhciByZXF1ZXN0LCBvciB0byBoYW5kbGUgdGhlIHByb2Nlc3Mgb2YgY29uZmlndXJpbmcgaXRzZWxmLgotVGhhdCB3YXksIHdoZW4gdGhlIHJlcXVlc3QgaXMgb3ZlciAob3IsIGZvciB0aGUgY29uZmlndXJhdGlvbiBwb29sLAotd2hlbiB0aGUgc2VydmVyIGlzIHJlc3RhcnRpbmcpLCB0aGUgbWVtb3J5IGNhbiBiZSBmcmVlZCwgYW5kIHRoZSBmaWxlcwotY2xvc2VkLCA8aT5lbiBtYXNzZTwvaT4sIHdpdGhvdXQgYW55b25lIGhhdmluZyB0byB3cml0ZSBleHBsaWNpdCBjb2RlIHRvCi10cmFjayB0aGVtIGFsbCBkb3duIGFuZCBkaXNwb3NlIG9mIHRoZW0uICBBbHNvLCBhCi08Y29kZT5jbWRfcGFybXM8L2NvZGU+IHN0cnVjdHVyZSBjb250YWlucyB2YXJpb3VzIGluZm9ybWF0aW9uIGFib3V0Ci10aGUgY29uZmlnIGZpbGUgYmVpbmcgcmVhZCwgYW5kIG90aGVyIHN0YXR1cyBpbmZvcm1hdGlvbiwgd2hpY2ggaXMKLXNvbWV0aW1lcyBvZiB1c2UgdG8gdGhlIGZ1bmN0aW9uIHdoaWNoIHByb2Nlc3NlcyBhIGNvbmZpZy1maWxlIGNvbW1hbmQKLShzdWNoIGFzIDxjb2RlPlNjcmlwdEFsaWFzPC9jb2RlPikuCi0KLVdpdGggbm8gZnVydGhlciBhZG8sIHRoZSBtb2R1bGUgaXRzZWxmOgotIAotPHByZT4KLS8qIERlY2xhcmF0aW9ucyBvZiBoYW5kbGVycy4gKi8KLQotaW50IHRyYW5zbGF0ZV9zY3JpcHRhbGlhcyAocmVxdWVzdF9yZWMgKik7Ci1pbnQgdHlwZV9zY3JpcHRhbGlhcyAocmVxdWVzdF9yZWMgKik7Ci1pbnQgY2dpX2hhbmRsZXIgKHJlcXVlc3RfcmVjICopOwotCi0vKiBTdWJzaWRpYXJ5IGRpc3BhdGNoIHRhYmxlIGZvciByZXNwb25zZS1waGFzZSBoYW5kbGVycywgYnkgTUlNRSB0eXBlICovCi0KLWhhbmRsZXJfcmVjIGNnaV9oYW5kbGVyc1tdID0gewoteyAiYXBwbGljYXRpb24veC1odHRwZC1jZ2kiLCBjZ2lfaGFuZGxlciB9LAoteyBOVUxMIH0KLX07Ci0KLS8qIERlY2xhcmF0aW9ucyBvZiByb3V0aW5lcyB0byBtYW5pcHVsYXRlIHRoZSBtb2R1bGUncyBjb25maWd1cmF0aW9uCi0gKiBpbmZvLiAgTm90ZSB0aGF0IHRoZXNlIGFyZSByZXR1cm5lZCwgYW5kIHBhc3NlZCBpbiwgYXMgdm9pZCAqJ3M7Ci0gKiB0aGUgc2VydmVyIGNvcmUga2VlcHMgdHJhY2sgb2YgdGhlbSwgYnV0IGl0IGRvZXNuJ3QsIGFuZCBjYW4ndCwKLSAqIGtub3cgdGhlaXIgaW50ZXJuYWwgc3RydWN0dXJlLgotICovCi0KLXZvaWQgKm1ha2VfY2dpX3NlcnZlcl9jb25maWcgKHBvb2wgKik7Ci12b2lkICptZXJnZV9jZ2lfc2VydmVyX2NvbmZpZyAocG9vbCAqLCB2b2lkICosIHZvaWQgKik7Ci0KLS8qIERlY2xhcmF0aW9ucyBvZiByb3V0aW5lcyB0byBoYW5kbGUgY29uZmlnLWZpbGUgY29tbWFuZHMgKi8KLQotZXh0ZXJuIGNoYXIgKnNjcmlwdF9hbGlhcyhjbWRfcGFybXMgKiwgdm9pZCAqcGVyX2Rpcl9jb25maWcsIGNoYXIgKmZha2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnJlYWwpOwotCi1jb21tYW5kX3JlYyBjZ2lfY21kc1tdID0gewoteyAiU2NyaXB0QWxpYXMiLCBzY3JpcHRfYWxpYXMsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTIsCi0gICAgImEgZmFrZW5hbWUgYW5kIGEgcmVhbG5hbWUifSwKLXsgTlVMTCB9Ci19OwotCi1tb2R1bGUgY2dpX21vZHVsZSA9IHsKLSAgIFNUQU5EQVJEX01PRFVMRV9TVFVGRiwKLSAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZXIgKi8KLSAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogZGlyIGNvbmZpZyBjcmVhdG9yICovCi0gICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIGRpciBtZXJnZXIgLS0tIGRlZmF1bHQgaXMgdG8gb3ZlcnJpZGUgKi8KLSAgIG1ha2VfY2dpX3NlcnZlcl9jb25maWcsICAgLyogc2VydmVyIGNvbmZpZyAqLwotICAgbWVyZ2VfY2dpX3NlcnZlcl9jb25maWcsICAvKiBtZXJnZSBzZXJ2ZXIgY29uZmlnICovCi0gICBjZ2lfY21kcywgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgdGFibGUgKi8KLSAgIGNnaV9oYW5kbGVycywgICAgICAgICAgICAgLyogaGFuZGxlcnMgKi8KLSAgIHRyYW5zbGF0ZV9zY3JpcHRhbGlhcywgICAgLyogZmlsZW5hbWUgdHJhbnNsYXRpb24gKi8KLSAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2tfdXNlcl9pZCAqLwotICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBhdXRoICovCi0gICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGFjY2VzcyAqLwotICAgdHlwZV9zY3JpcHRhbGlhcywgICAgICAgICAvKiB0eXBlX2NoZWNrZXIgKi8KLSAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogZml4dXBzICovCi0gICBOVUxMICAgICAgICAgICAgICAgICAgICAgIC8qIGxvZ2dlciAqLwotfTsKLTwvcHJlPgotCi08aDI+PGEgbmFtZT0iaGFuZGxlcnMiPkhvdyBoYW5kbGVycyB3b3JrPC9hPjwvaDI+Ci0KLVRoZSBzb2xlIGFyZ3VtZW50IHRvIGhhbmRsZXJzIGlzIGEgPGNvZGU+cmVxdWVzdF9yZWM8L2NvZGU+IHN0cnVjdHVyZS4KLVRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBhIHBhcnRpY3VsYXIgcmVxdWVzdCB3aGljaCBoYXMgYmVlbiBtYWRlIHRvCi10aGUgc2VydmVyLCBvbiBiZWhhbGYgb2YgYSBjbGllbnQuICBJbiBtb3N0IGNhc2VzLCBlYWNoIGNvbm5lY3Rpb24gdG8KLXRoZSBjbGllbnQgZ2VuZXJhdGVzIG9ubHkgb25lIDxjb2RlPnJlcXVlc3RfcmVjPC9jb2RlPiBzdHJ1Y3R1cmUuPHA+Ci0KLTxoMz48YSBuYW1lPSJyZXFfdG91ciI+QSBicmllZiB0b3VyIG9mIHRoZSA8Y29kZT5yZXF1ZXN0X3JlYzwvY29kZT48L2E+PC9oMz4KLQotVGhlIDxjb2RlPnJlcXVlc3RfcmVjPC9jb2RlPiBjb250YWlucyBwb2ludGVycyB0byBhIHJlc291cmNlIHBvb2wKLXdoaWNoIHdpbGwgYmUgY2xlYXJlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgZmluaXNoZWQgaGFuZGxpbmcgdGhlCi1yZXF1ZXN0OyB0byBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgcGVyLXNlcnZlciBhbmQgcGVyLWNvbm5lY3Rpb24KLWluZm9ybWF0aW9uLCBhbmQgbW9zdCBpbXBvcnRhbnRseSwgaW5mb3JtYXRpb24gb24gdGhlIHJlcXVlc3QgaXRzZWxmLjxwPgotCi1UaGUgbW9zdCBpbXBvcnRhbnQgc3VjaCBpbmZvcm1hdGlvbiBpcyBhIHNtYWxsIHNldCBvZiBjaGFyYWN0ZXIKLXN0cmluZ3MgZGVzY3JpYmluZyBhdHRyaWJ1dGVzIG9mIHRoZSBvYmplY3QgYmVpbmcgcmVxdWVzdGVkLCBpbmNsdWRpbmcKLWl0cyBVUkksIGZpbGVuYW1lLCBjb250ZW50LXR5cGUgYW5kIGNvbnRlbnQtZW5jb2RpbmcgKHRoZXNlIGJlaW5nIGZpbGxlZAotaW4gYnkgdGhlIHRyYW5zbGF0aW9uIGFuZCB0eXBlLWNoZWNrIGhhbmRsZXJzIHdoaWNoIGhhbmRsZSB0aGUKLXJlcXVlc3QsIHJlc3BlY3RpdmVseSkuIDxwPgotCi1PdGhlciBjb21tb25seSB1c2VkIGRhdGEgaXRlbXMgYXJlIHRhYmxlcyBnaXZpbmcgdGhlIE1JTUUgaGVhZGVycyBvbgotdGhlIGNsaWVudCdzIG9yaWdpbmFsIHJlcXVlc3QsIE1JTUUgaGVhZGVycyB0byBiZSBzZW50IGJhY2sgd2l0aCB0aGUKLXJlc3BvbnNlICh3aGljaCBtb2R1bGVzIGNhbiBhZGQgdG8gYXQgd2lsbCksIGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLWZvciBhbnkgc3VicHJvY2Vzc2VzIHdoaWNoIGFyZSBzcGF3bmVkIG9mZiBpbiB0aGUgY291cnNlIG9mIHNlcnZpY2luZwotdGhlIHJlcXVlc3QuICBUaGVzZSB0YWJsZXMgYXJlIG1hbmlwdWxhdGVkIHVzaW5nIHRoZQotPGNvZGU+dGFibGVfZ2V0PC9jb2RlPiBhbmQgPGNvZGU+dGFibGVfc2V0PC9jb2RlPiByb3V0aW5lcy4gPHA+Ci0KLUZpbmFsbHksIHRoZXJlIGFyZSBwb2ludGVycyB0byB0d28gZGF0YSBzdHJ1Y3R1cmVzIHdoaWNoLCBpbiB0dXJuLAotcG9pbnQgdG8gcGVyLW1vZHVsZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZXMuICBTcGVjaWZpY2FsbHksIHRoZXNlCi1ob2xkIHBvaW50ZXJzIHRvIHRoZSBkYXRhIHN0cnVjdHVyZXMgd2hpY2ggdGhlIG1vZHVsZSBoYXMgYnVpbHQgdG8KLWRlc2NyaWJlIHRoZSB3YXkgaXQgaGFzIGJlZW4gY29uZmlndXJlZCB0byBvcGVyYXRlIGluIGEgZ2l2ZW4KLWRpcmVjdG9yeSAodmlhIDxjb2RlPi5odGFjY2VzczwvY29kZT4gZmlsZXMgb3IKLTxjb2RlPiZsdDtEaXJlY3RvcnkmZ3Q7PC9jb2RlPiBzZWN0aW9ucyksIGZvciBwcml2YXRlIGRhdGEgaXQgaGFzCi1idWlsdCBpbiB0aGUgY291cnNlIG9mIHNlcnZpY2luZyB0aGUgcmVxdWVzdCAoc28gbW9kdWxlcycgaGFuZGxlcnMgZm9yCi1vbmUgcGhhc2UgY2FuIHBhc3MgYG5vdGVzJyB0byB0aGVpciBoYW5kbGVycyBmb3Igb3RoZXIgcGhhc2VzKS4gIFRoZXJlCi1pcyBhbm90aGVyIHN1Y2ggY29uZmlndXJhdGlvbiB2ZWN0b3IgaW4gdGhlIDxjb2RlPnNlcnZlcl9yZWM8L2NvZGU+Ci1kYXRhIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IHRoZSA8Y29kZT5yZXF1ZXN0X3JlYzwvY29kZT4sIHdoaWNoCi1jb250YWlucyBwZXIgKHZpcnR1YWwpIHNlcnZlciBjb25maWd1cmF0aW9uIGRhdGEuPHA+Ci0KLUhlcmUgaXMgYW4gYWJyaWRnZWQgZGVjbGFyYXRpb24sIGdpdmluZyB0aGUgZmllbGRzIG1vc3QgY29tbW9ubHkgdXNlZDo8cD4KLQotPHByZT4KLXN0cnVjdCByZXF1ZXN0X3JlYyB7Ci0KLSAgcG9vbCAqcG9vbDsKLSAgY29ubl9yZWMgKmNvbm5lY3Rpb247Ci0gIHNlcnZlcl9yZWMgKnNlcnZlcjsKLQotICAvKiBXaGF0IG9iamVjdCBpcyBiZWluZyByZXF1ZXN0ZWQgKi8KLSAgCi0gIGNoYXIgKnVyaTsKLSAgY2hhciAqZmlsZW5hbWU7Ci0gIGNoYXIgKnBhdGhfaW5mbzsKLSAgY2hhciAqYXJnczsgICAgICAgICAgIC8qIFFVRVJZX0FSR1MsIGlmIGFueSAqLwotICBzdHJ1Y3Qgc3RhdCBmaW5mbzsgICAgLyogU2V0IGJ5IHNlcnZlciBjb3JlOwotICAgICAgICAgICAgICAgICAgICAgICAgICogc3RfbW9kZSBzZXQgdG8gemVybyBpZiBubyBzdWNoIGZpbGUgKi8KLSAgCi0gIGNoYXIgKmNvbnRlbnRfdHlwZTsKLSAgY2hhciAqY29udGVudF9lbmNvZGluZzsKLSAgCi0gIC8qIE1JTUUgaGVhZGVyIGVudmlyb25tZW50cywgaW4gYW5kIG91dC4gIEFsc28sIGFuIGFycmF5IGNvbnRhaW5pbmcKLSAgICogZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGJlIHBhc3NlZCB0byBzdWJwcm9jZXNzZXMsIHNvIHBlb3BsZSBjYW4KLSAgICogd3JpdGUgbW9kdWxlcyB0byBhZGQgdG8gdGhhdCBlbnZpcm9ubWVudC4KLSAgICoKLSAgICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBoZWFkZXJzX291dCBhbmQgZXJyX2hlYWRlcnNfb3V0IGlzIHRoYXQKLSAgICogdGhlIGxhdHRlciBhcmUgcHJpbnRlZCBldmVuIG9uIGVycm9yLCBhbmQgcGVyc2lzdCBhY3Jvc3MgaW50ZXJuYWwKLSAgICogcmVkaXJlY3RzIChzbyB0aGUgaGVhZGVycyBwcmludGVkIGZvciBFcnJvckRvY3VtZW50IGhhbmRsZXJzIHdpbGwKLSAgICogaGF2ZSB0aGVtKS4KLSAgICovCi0gIAotICB0YWJsZSAqaGVhZGVyc19pbjsKLSAgdGFibGUgKmhlYWRlcnNfb3V0OwotICB0YWJsZSAqZXJyX2hlYWRlcnNfb3V0OwotICB0YWJsZSAqc3VicHJvY2Vzc19lbnY7Ci0KLSAgLyogSW5mbyBhYm91dCB0aGUgcmVxdWVzdCBpdHNlbGYuLi4gKi8KLSAgCi0gIGludCBoZWFkZXJfb25seTsgICAgIC8qIEhFQUQgcmVxdWVzdCwgYXMgb3Bwb3NlZCB0byBHRVQgKi8KLSAgY2hhciAqcHJvdG9jb2w7ICAgICAgLyogUHJvdG9jb2wsIGFzIGdpdmVuIHRvIHVzLCBvciBIVFRQLzAuOSAqLwotICBjaGFyICptZXRob2Q7ICAgICAgICAvKiBHRVQsIEhFQUQsIFBPU1QsIGV0Yy4gKi8KLSAgaW50IG1ldGhvZF9udW1iZXI7ICAgLyogTV9HRVQsIE1fUE9TVCwgZXRjLiAqLwotCi0gIC8qIEluZm8gZm9yIGxvZ2dpbmcgKi8KLQotICBjaGFyICp0aGVfcmVxdWVzdDsKLSAgaW50IGJ5dGVzX3NlbnQ7Ci0KLSAgLyogQSBmbGFnIHdoaWNoIG1vZHVsZXMgY2FuIHNldCwgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZGF0YSBiZWluZwotICAgKiByZXR1cm5lZCBpcyB2b2xhdGlsZSwgYW5kIGNsaWVudHMgc2hvdWxkIGJlIHRvbGQgbm90IHRvIGNhY2hlIGl0LgotICAgKi8KLQotICBpbnQgbm9fY2FjaGU7Ci0KLSAgLyogVmFyaW91cyBvdGhlciBjb25maWcgaW5mbyB3aGljaCBtYXkgY2hhbmdlIHdpdGggLmh0YWNjZXNzIGZpbGVzCi0gICAqIFRoZXNlIGFyZSBjb25maWcgdmVjdG9ycywgd2l0aCBvbmUgdm9pZCogcG9pbnRlciBmb3IgZWFjaCBtb2R1bGUKLSAgICogKHRoZSB0aGluZyBwb2ludGVkIHRvIGJlaW5nIHRoZSBtb2R1bGUncyBidXNpbmVzcykuCi0gICAqLwotICAKLSAgdm9pZCAqcGVyX2Rpcl9jb25maWc7ICAgLyogT3B0aW9ucyBzZXQgaW4gY29uZmlnIGZpbGVzLCBldGMuICovCi0gIHZvaWQgKnJlcXVlc3RfY29uZmlnOyAgIC8qIE5vdGVzIG9uICp0aGlzKiByZXF1ZXN0ICovCi0gIAotfTsKLQotPC9wcmU+Ci0KLTxoMz48YSBuYW1lPSJyZXFfb3JpZyI+V2hlcmUgcmVxdWVzdF9yZWMgc3RydWN0dXJlcyBjb21lIGZyb208L2E+PC9oMz4KLQotTW9zdCA8Y29kZT5yZXF1ZXN0X3JlYzwvY29kZT4gc3RydWN0dXJlcyBhcmUgYnVpbHQgYnkgcmVhZGluZyBhbiBIVFRQCi1yZXF1ZXN0IGZyb20gYSBjbGllbnQsIGFuZCBmaWxsaW5nIGluIHRoZSBmaWVsZHMuICBIb3dldmVyLCB0aGVyZSBhcmUKLWEgZmV3IGV4Y2VwdGlvbnM6Ci0KLTx1bD4KLSAgPGxpPiBJZiB0aGUgcmVxdWVzdCBpcyB0byBhbiBpbWFnZW1hcCwgYSB0eXBlIG1hcCAoaS5lLiwgYQotICAgICAgIDxjb2RlPioudmFyPC9jb2RlPiBmaWxlKSwgb3IgYSBDR0kgc2NyaXB0IHdoaWNoIHJldHVybmVkIGEKLSAgICAgICBsb2NhbCBgTG9jYXRpb246JywgdGhlbiB0aGUgcmVzb3VyY2Ugd2hpY2ggdGhlIHVzZXIgcmVxdWVzdGVkCi0gICAgICAgaXMgZ29pbmcgdG8gYmUgdWx0aW1hdGVseSBsb2NhdGVkIGJ5IHNvbWUgVVJJIG90aGVyIHRoYW4gd2hhdAotICAgICAgIHRoZSBjbGllbnQgb3JpZ2luYWxseSBzdXBwbGllZC4gIEluIHRoaXMgY2FzZSwgdGhlIHNlcnZlciBkb2VzCi0gICAgICAgYW4gPGVtPmludGVybmFsIHJlZGlyZWN0PC9lbT4sIGNvbnN0cnVjdGluZyBhIG5ldwotICAgICAgIDxjb2RlPnJlcXVlc3RfcmVjPC9jb2RlPiBmb3IgdGhlIG5ldyBVUkksIGFuZCBwcm9jZXNzaW5nIGl0Ci0gICAgICAgYWxtb3N0IGV4YWN0bHkgYXMgaWYgdGhlIGNsaWVudCBoYWQgcmVxdWVzdGVkIHRoZSBuZXcgVVJJCi0gICAgICAgZGlyZWN0bHkuIDxwPgotCi0gIDxsaT4gSWYgc29tZSBoYW5kbGVyIHNpZ25hbGVkIGFuIGVycm9yLCBhbmQgYW4KLSAgICAgICA8Y29kZT5FcnJvckRvY3VtZW50PC9jb2RlPiBpcyBpbiBzY29wZSwgdGhlIHNhbWUgaW50ZXJuYWwKLSAgICAgICByZWRpcmVjdCBtYWNoaW5lcnkgY29tZXMgaW50byBwbGF5LjxwPgotCi0gIDxsaT4gRmluYWxseSwgYSBoYW5kbGVyIG9jY2FzaW9uYWxseSBuZWVkcyB0byBpbnZlc3RpZ2F0ZSBgd2hhdAotICAgICAgIHdvdWxkIGhhcHBlbiBpZicgc29tZSBvdGhlciByZXF1ZXN0IHdlcmUgcnVuLiAgRm9yIGluc3RhbmNlLAotICAgICAgIHRoZSBkaXJlY3RvcnkgaW5kZXhpbmcgbW9kdWxlIG5lZWRzIHRvIGtub3cgd2hhdCBNSU1FIHR5cGUKLSAgICAgICB3b3VsZCBiZSBhc3NpZ25lZCB0byBhIHJlcXVlc3QgZm9yIGVhY2ggZGlyZWN0b3J5IGVudHJ5LCBpbgotICAgICAgIG9yZGVyIHRvIGZpZ3VyZSBvdXQgd2hhdCBpY29uIHRvIHVzZS48cD4KLQotICAgICAgIFN1Y2ggaGFuZGxlcnMgY2FuIGNvbnN0cnVjdCBhIDxlbT5zdWItcmVxdWVzdDwvZW0+LCB1c2luZyB0aGUKLSAgICAgICBmdW5jdGlvbnMgPGNvZGU+c3ViX3JlcV9sb29rdXBfZmlsZTwvY29kZT4gYW5kCi0gICAgICAgPGNvZGU+c3ViX3JlcV9sb29rdXBfdXJpPC9jb2RlPjsgdGhpcyBjb25zdHJ1Y3RzIGEgbmV3Ci0gICAgICAgPGNvZGU+cmVxdWVzdF9yZWM8L2NvZGU+IHN0cnVjdHVyZSBhbmQgcHJvY2Vzc2VzIGl0IGFzIHlvdQotICAgICAgIHdvdWxkIGV4cGVjdCwgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgdGhlIHBvaW50IG9mIGFjdHVhbGx5Ci0gICAgICAgc2VuZGluZyBhIHJlc3BvbnNlLiAgKFRoZXNlIGZ1bmN0aW9ucyBza2lwIG92ZXIgdGhlIGFjY2VzcwotICAgICAgIGNoZWNrcyBpZiB0aGUgc3ViLXJlcXVlc3QgaXMgZm9yIGEgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkKLSAgICAgICBhcyB0aGUgb3JpZ2luYWwgcmVxdWVzdCkuPHA+Ci0KLSAgICAgICAoU2VydmVyLXNpZGUgaW5jbHVkZXMgd29yayBieSBidWlsZGluZyBzdWItcmVxdWVzdHMgYW5kIHRoZW4KLSAgICAgICBhY3R1YWxseSBpbnZva2luZyB0aGUgcmVzcG9uc2UgaGFuZGxlciBmb3IgdGhlbSwgdmlhIHRoZQotICAgICAgIGZ1bmN0aW9uIDxjb2RlPnJ1bl9zdWJfcmVxdWVzdDwvY29kZT4pLgotPC91bD4KLQotPGgzPjxhIG5hbWU9InJlcV9yZXR1cm4iPkhhbmRsaW5nIHJlcXVlc3RzLCBkZWNsaW5pbmcsIGFuZCByZXR1cm5pbmcgZXJyb3IgY29kZXM8L2E+PC9oMz4KLQotQXMgZGlzY3Vzc2VkIGFib3ZlLCBlYWNoIGhhbmRsZXIsIHdoZW4gaW52b2tlZCB0byBoYW5kbGUgYSBwYXJ0aWN1bGFyCi08Y29kZT5yZXF1ZXN0X3JlYzwvY29kZT4sIGhhcyB0byByZXR1cm4gYW4gPGNvZGU+aW50PC9jb2RlPiB0bwotaW5kaWNhdGUgd2hhdCBoYXBwZW5lZC4gIFRoYXQgY2FuIGVpdGhlciBiZQotCi08dWw+Ci0gIDxsaT4gT0sgLS0tIHRoZSByZXF1ZXN0IHdhcyBoYW5kbGVkIHN1Y2Nlc3NmdWxseS4gIFRoaXMgbWF5IG9yIG1heQotICAgICAgIG5vdCB0ZXJtaW5hdGUgdGhlIHBoYXNlLgotICA8bGk+IERFQ0xJTkVEIC0tLSBubyBlcnJvbmVvdXMgY29uZGl0aW9uIGV4aXN0cywgYnV0IHRoZSBtb2R1bGUKLSAgICAgICBkZWNsaW5lcyB0byBoYW5kbGUgdGhlIHBoYXNlOyB0aGUgc2VydmVyIHRyaWVzIHRvIGZpbmQgYW5vdGhlci4KLSAgPGxpPiBhbiBIVFRQIGVycm9yIGNvZGUsIHdoaWNoIGFib3J0cyBoYW5kbGluZyBvZiB0aGUgcmVxdWVzdC4KLTwvdWw+Ci0KLU5vdGUgdGhhdCBpZiB0aGUgZXJyb3IgY29kZSByZXR1cm5lZCBpcyA8Y29kZT5SRURJUkVDVDwvY29kZT4sIHRoZW4KLXRoZSBtb2R1bGUgc2hvdWxkIHB1dCBhIDxjb2RlPkxvY2F0aW9uPC9jb2RlPiBpbiB0aGUgcmVxdWVzdCdzCi08Y29kZT5oZWFkZXJzX291dDwvY29kZT4sIHRvIGluZGljYXRlIHdoZXJlIHRoZSBjbGllbnQgc2hvdWxkIGJlCi1yZWRpcmVjdGVkIDxlbT50bzwvZW0+LiA8cD4KLQotPGgzPjxhIG5hbWU9InJlc3BfaGFuZGxlcnMiPlNwZWNpYWwgY29uc2lkZXJhdGlvbnMgZm9yIHJlc3BvbnNlIGhhbmRsZXJzPC9hPjwvaDM+Ci0KLUhhbmRsZXJzIGZvciBtb3N0IHBoYXNlcyBkbyB0aGVpciB3b3JrIGJ5IHNpbXBseSBzZXR0aW5nIGEgZmV3IGZpZWxkcwotaW4gdGhlIDxjb2RlPnJlcXVlc3RfcmVjPC9jb2RlPiBzdHJ1Y3R1cmUgKG9yLCBpbiB0aGUgY2FzZSBvZiBhY2Nlc3MKLWNoZWNrZXJzLCBzaW1wbHkgYnkgcmV0dXJuaW5nIHRoZSBjb3JyZWN0IGVycm9yIGNvZGUpLiAgSG93ZXZlciwKLXJlc3BvbnNlIGhhbmRsZXJzIGhhdmUgdG8gYWN0dWFsbHkgc2VuZCBhIHJlcXVlc3QgYmFjayB0byB0aGUgY2xpZW50LiA8cD4KLQotVGhleSBzaG91bGQgYmVnaW4gYnkgc2VuZGluZyBhbiBIVFRQIHJlc3BvbnNlIGhlYWRlciwgdXNpbmcgdGhlCi1mdW5jdGlvbiA8Y29kZT5zZW5kX2h0dHBfaGVhZGVyPC9jb2RlPi4gIChZb3UgZG9uJ3QgaGF2ZSB0byBkbwotYW55dGhpbmcgc3BlY2lhbCB0byBza2lwIHNlbmRpbmcgdGhlIGhlYWRlciBmb3IgSFRUUC8wLjkgcmVxdWVzdHM7IHRoZQotZnVuY3Rpb24gZmlndXJlcyBvdXQgb24gaXRzIG93biB0aGF0IGl0IHNob3VsZG4ndCBkbyBhbnl0aGluZykuICBJZgotdGhlIHJlcXVlc3QgaXMgbWFya2VkIDxjb2RlPmhlYWRlcl9vbmx5PC9jb2RlPiwgdGhhdCdzIGFsbCB0aGV5IHNob3VsZAotZG87IHRoZXkgc2hvdWxkIHJldHVybiBhZnRlciB0aGF0LCB3aXRob3V0IGF0dGVtcHRpbmcgYW55IGZ1cnRoZXIKLW91dHB1dC4gIDxwPgotCi1PdGhlcndpc2UsIHRoZXkgc2hvdWxkIHByb2R1Y2UgYSByZXF1ZXN0IGJvZHkgd2hpY2ggcmVzcG9uZHMgdG8gdGhlCi1jbGllbnQgYXMgYXBwcm9wcmlhdGUuICBUaGUgcHJpbWl0aXZlcyBmb3IgdGhpcyBhcmUgPGNvZGU+cnB1dGM8L2NvZGU+Ci1hbmQgPGNvZGU+cnByaW50ZjwvY29kZT4sIGZvciBpbnRlcm5hbGx5IGdlbmVyYXRlZCBvdXRwdXQsIGFuZAotPGNvZGU+c2VuZF9mZDwvY29kZT4sIHRvIGNvcHkgdGhlIGNvbnRlbnRzIG9mIHNvbWUgPGNvZGU+RklMRSAqPC9jb2RlPgotc3RyYWlnaHQgdG8gdGhlIGNsaWVudC4gIDxwPgotCi1BdCB0aGlzIHBvaW50LCB5b3Ugc2hvdWxkIG1vcmUgb3IgbGVzcyB1bmRlcnN0YW5kIHRoZSBmb2xsb3dpbmcgcGllY2UKLW9mIGNvZGUsIHdoaWNoIGlzIHRoZSBoYW5kbGVyIHdoaWNoIGhhbmRsZXMgPGNvZGU+R0VUPC9jb2RlPiByZXF1ZXN0cwotd2hpY2ggaGF2ZSBubyBtb3JlIHNwZWNpZmljIGhhbmRsZXI7IGl0IGFsc28gc2hvd3MgaG93IGNvbmRpdGlvbmFsCi08Y29kZT5HRVQ8L2NvZGU+cyBjYW4gYmUgaGFuZGxlZCwgaWYgaXQncyBkZXNpcmFibGUgdG8gZG8gc28gaW4gYQotcGFydGljdWxhciByZXNwb25zZSBoYW5kbGVyIC0tLSA8Y29kZT5zZXRfbGFzdF9tb2RpZmllZDwvY29kZT4gY2hlY2tzCi1hZ2FpbnN0IHRoZSA8Y29kZT5JZi1tb2RpZmllZC1zaW5jZTwvY29kZT4gdmFsdWUgc3VwcGxpZWQgYnkgdGhlCi1jbGllbnQsIGlmIGFueSwgYW5kIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgY29kZSAod2hpY2ggd2lsbCwgaWYKLW5vbnplcm8sIGJlIFVTRV9MT0NBTF9DT1BZKS4gICBObyBzaW1pbGFyIGNvbnNpZGVyYXRpb25zIGFwcGx5IGZvcgotPGNvZGU+c2V0X2NvbnRlbnRfbGVuZ3RoPC9jb2RlPiwgYnV0IGl0IHJldHVybnMgYW4gZXJyb3IgY29kZSBmb3IKLXN5bW1ldHJ5LjxwPgotCi08cHJlPgotaW50IGRlZmF1bHRfaGFuZGxlciAocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IGVycnN0YXR1czsKLSAgICBGSUxFICpmOwotICAgIAotICAgIGlmIChyLSZndDttZXRob2RfbnVtYmVyICE9IE1fR0VUKSByZXR1cm4gREVDTElORUQ7Ci0gICAgaWYgKHItJmd0O2ZpbmZvLnN0X21vZGUgPT0gMCkgcmV0dXJuIE5PVF9GT1VORDsKLQotICAgIGlmICgoZXJyc3RhdHVzID0gc2V0X2NvbnRlbnRfbGVuZ3RoIChyLCByLSZndDtmaW5mby5zdF9zaXplKSkKLSAgICAgICAgfHwgKGVycnN0YXR1cyA9IHNldF9sYXN0X21vZGlmaWVkIChyLCByLSZndDtmaW5mby5zdF9tdGltZSkpKQotICAgICAgICByZXR1cm4gZXJyc3RhdHVzOwotICAgIAotICAgIGYgPSBmb3BlbiAoci0mZ3Q7ZmlsZW5hbWUsICJyIik7Ci0KLSAgICBpZiAoZiA9PSBOVUxMKSB7Ci0gICAgICAgIGxvZ19yZWFzb24oImZpbGUgcGVybWlzc2lvbnMgZGVueSBzZXJ2ZXIgYWNjZXNzIiwKLSAgICAgICAgICAgICAgICAgICByLSZndDtmaWxlbmFtZSwgcik7Ci0gICAgICAgIHJldHVybiBGT1JCSURERU47Ci0gICAgfQotICAgICAgCi0gICAgcmVnaXN0ZXJfdGltZW91dCAoInNlbmQiLCByKTsKLSAgICBzZW5kX2h0dHBfaGVhZGVyIChyKTsKLQotICAgIGlmICghci0mZ3Q7aGVhZGVyX29ubHkpIHNlbmRfZmQgKGYsIHIpOwotICAgIHBmY2xvc2UgKHItJmd0O3Bvb2wsIGYpOwotICAgIHJldHVybiBPSzsKLX0KLTwvcHJlPgotCi1GaW5hbGx5LCBpZiBhbGwgb2YgdGhpcyBpcyB0b28gbXVjaCBvZiBhIGNoYWxsZW5nZSwgdGhlcmUgYXJlIGEgZmV3Ci13YXlzIG91dCBvZiBpdC4gIEZpcnN0IG9mZiwgYXMgc2hvd24gYWJvdmUsIGEgcmVzcG9uc2UgaGFuZGxlciB3aGljaAotaGFzIG5vdCB5ZXQgcHJvZHVjZWQgYW55IG91dHB1dCBjYW4gc2ltcGx5IHJldHVybiBhbiBlcnJvciBjb2RlLCBpbgotd2hpY2ggY2FzZSB0aGUgc2VydmVyIHdpbGwgYXV0b21hdGljYWxseSBwcm9kdWNlIGFuIGVycm9yIHJlc3BvbnNlLgotU2Vjb25kbHksIGl0IGNhbiBwdW50IHRvIHNvbWUgb3RoZXIgaGFuZGxlciBieSBpbnZva2luZwotPGNvZGU+aW50ZXJuYWxfcmVkaXJlY3Q8L2NvZGU+LCB3aGljaCBpcyBob3cgdGhlIGludGVybmFsIHJlZGlyZWN0aW9uCi1tYWNoaW5lcnkgZGlzY3Vzc2VkIGFib3ZlIGlzIGludm9rZWQuICBBIHJlc3BvbnNlIGhhbmRsZXIgd2hpY2ggaGFzCi1pbnRlcm5hbGx5IHJlZGlyZWN0ZWQgc2hvdWxkIGFsd2F5cyByZXR1cm4gPGNvZGU+T0s8L2NvZGU+LiA8cD4KLQotKEludm9raW5nIDxjb2RlPmludGVybmFsX3JlZGlyZWN0PC9jb2RlPiBmcm9tIGhhbmRsZXJzIHdoaWNoIGFyZQotPGVtPm5vdDwvZW0+IHJlc3BvbnNlIGhhbmRsZXJzIHdpbGwgbGVhZCB0byBzZXJpb3VzIGNvbmZ1c2lvbikuCi0KLTxoMz48YSBuYW1lPSJhdXRoX2hhbmRsZXJzIj5TcGVjaWFsIGNvbnNpZGVyYXRpb25zIGZvciBhdXRoZW50aWNhdGlvbiBoYW5kbGVyczwvYT48L2gzPgotCi1TdHVmZiB0aGF0IHNob3VsZCBiZSBkaXNjdXNzZWQgaGVyZSBpbiBkZXRhaWw6Ci0KLTx1bD4KLSAgPGxpPiBBdXRoZW50aWNhdGlvbi1waGFzZSBoYW5kbGVycyBub3QgaW52b2tlZCB1bmxlc3MgYXV0aCBpcwotICAgICAgIGNvbmZpZ3VyZWQgZm9yIHRoZSBkaXJlY3RvcnkuCi0gIDxsaT4gQ29tbW9uIGF1dGggY29uZmlndXJhdGlvbiBzdG9yZWQgaW4gdGhlIGNvcmUgcGVyLWRpcgotICAgICAgIGNvbmZpZ3VyYXRpb247IGl0IGhhcyBhY2Nlc3NvcnMgPGNvZGU+YXV0aF90eXBlPC9jb2RlPiwKLSAgICAgICA8Y29kZT5hdXRoX25hbWU8L2NvZGU+LCBhbmQgPGNvZGU+cmVxdWlyZXM8L2NvZGU+LgotICA8bGk+IENvbW1vbiByb3V0aW5lcywgdG8gaGFuZGxlIHRoZSBwcm90b2NvbCBlbmQgb2YgdGhpbmdzLCBhdCBsZWFzdAotICAgICAgIGZvciBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uICg8Y29kZT5nZXRfYmFzaWNfYXV0aF9wdzwvY29kZT4sCi0gICAgICAgd2hpY2ggc2V0cyB0aGUgPGNvZGU+Y29ubmVjdGlvbi0mZ3Q7dXNlcjwvY29kZT4gc3RydWN0dXJlIGZpZWxkCi0gICAgICAgYXV0b21hdGljYWxseSwgYW5kIDxjb2RlPm5vdGVfYmFzaWNfYXV0aF9mYWlsdXJlPC9jb2RlPiwgd2hpY2gKLSAgICAgICBhcnJhbmdlcyBmb3IgdGhlIHByb3BlciA8Y29kZT5XV1ctQXV0aGVudGljYXRlOjwvY29kZT4gaGVhZGVyCi0gICAgICAgdG8gYmUgc2VudCBiYWNrKS4KLTwvdWw+Ci0KLTxoMz48YSBuYW1lPSJsb2dfaGFuZGxlcnMiPlNwZWNpYWwgY29uc2lkZXJhdGlvbnMgZm9yIGxvZ2dpbmcgaGFuZGxlcnM8L2E+PC9oMz4KLQotV2hlbiBhIHJlcXVlc3QgaGFzIGludGVybmFsbHkgcmVkaXJlY3RlZCwgdGhlcmUgaXMgdGhlIHF1ZXN0aW9uIG9mCi13aGF0IHRvIGxvZy4gIEFwYWNoZSBoYW5kbGVzIHRoaXMgYnkgYnVuZGxpbmcgdGhlIGVudGlyZSBjaGFpbiBvZgotcmVkaXJlY3RzIGludG8gYSBsaXN0IG9mIDxjb2RlPnJlcXVlc3RfcmVjPC9jb2RlPiBzdHJ1Y3R1cmVzIHdoaWNoIGFyZQotdGhyZWFkZWQgdGhyb3VnaCB0aGUgPGNvZGU+ci0mZ3Q7cHJldjwvY29kZT4gYW5kIDxjb2RlPnItJmd0O25leHQ8L2NvZGU+Ci1wb2ludGVycy4gIFRoZSA8Y29kZT5yZXF1ZXN0X3JlYzwvY29kZT4gd2hpY2ggaXMgcGFzc2VkIHRvIHRoZSBsb2dnaW5nCi1oYW5kbGVycyBpbiBzdWNoIGNhc2VzIGlzIHRoZSBvbmUgd2hpY2ggd2FzIG9yaWdpbmFsbHkgYnVpbHQgZm9yIHRoZQotaW5pdGlhbCByZXF1ZXN0IGZyb20gdGhlIGNsaWVudDsgbm90ZSB0aGF0IHRoZSBieXRlc19zZW50IGZpZWxkIHdpbGwKLW9ubHkgYmUgY29ycmVjdCBpbiB0aGUgbGFzdCByZXF1ZXN0IGluIHRoZSBjaGFpbiAodGhlIG9uZSBmb3Igd2hpY2ggYQotcmVzcG9uc2Ugd2FzIGFjdHVhbGx5IHNlbnQpLiAKLQotPGgyPjxhIG5hbWU9InBvb2xzIj5SZXNvdXJjZSBhbGxvY2F0aW9uIGFuZCByZXNvdXJjZSBwb29sczwvYT48L2gyPgotCi1PbmUgb2YgdGhlIHByb2JsZW1zIG9mIHdyaXRpbmcgYW5kIGRlc2lnbmluZyBhIHNlcnZlci1wb29sIHNlcnZlciBpcwotdGhhdCBvZiBwcmV2ZW50aW5nIGxlYWthZ2UsIHRoYXQgaXMsIGFsbG9jYXRpbmcgcmVzb3VyY2VzIChtZW1vcnksCi1vcGVuIGZpbGVzLCBldGMuKSwgd2l0aG91dCBzdWJzZXF1ZW50bHkgcmVsZWFzaW5nIHRoZW0uICBUaGUgcmVzb3VyY2UKLXBvb2wgbWFjaGluZXJ5IGlzIGRlc2lnbmVkIHRvIG1ha2UgaXQgZWFzeSB0byBwcmV2ZW50IHRoaXMgZnJvbQotaGFwcGVuaW5nLCBieSBhbGxvd2luZyByZXNvdXJjZSB0byBiZSBhbGxvY2F0ZWQgaW4gc3VjaCBhIHdheSB0aGF0Ci10aGV5IGFyZSA8ZW0+YXV0b21hdGljYWxseTwvZW0+IHJlbGVhc2VkIHdoZW4gdGhlIHNlcnZlciBpcyBkb25lIHdpdGgKLXRoZW0uIDxwPgotCi1UaGUgd2F5IHRoaXMgd29ya3MgaXMgYXMgZm9sbG93czogIHRoZSBtZW1vcnkgd2hpY2ggaXMgYWxsb2NhdGVkLCBmaWxlCi1vcGVuZWQsIGV0Yy4sIHRvIGRlYWwgd2l0aCBhIHBhcnRpY3VsYXIgcmVxdWVzdCBhcmUgdGllZCB0byBhCi08ZW0+cmVzb3VyY2UgcG9vbDwvZW0+IHdoaWNoIGlzIGFsbG9jYXRlZCBmb3IgdGhlIHJlcXVlc3QuICBUaGUgcG9vbAotaXMgYSBkYXRhIHN0cnVjdHVyZSB3aGljaCBpdHNlbGYgdHJhY2tzIHRoZSByZXNvdXJjZXMgaW4gcXVlc3Rpb24uIDxwPgotCi1XaGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHByb2Nlc3NlZCwgdGhlIHBvb2wgaXMgPGVtPmNsZWFyZWQ8L2VtPi4gIEF0Ci10aGF0IHBvaW50LCBhbGwgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggaXQgaXMgcmVsZWFzZWQgZm9yIHJldXNlLAotYWxsIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBpdCBhcmUgY2xvc2VkLCBhbmQgYW55IG90aGVyIGNsZWFuLXVwCi1mdW5jdGlvbnMgd2hpY2ggYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcG9vbCBhcmUgcnVuLiAgV2hlbiB0aGlzIGlzCi1vdmVyLCB3ZSBjYW4gYmUgY29uZmlkZW50IHRoYXQgYWxsIHRoZSByZXNvdXJjZSB0aWVkIHRvIHRoZSBwb29sIGhhdmUKLWJlZW4gcmVsZWFzZWQsIGFuZCB0aGF0IG5vbmUgb2YgdGhlbSBoYXZlIGxlYWtlZC4gPHA+Ci0KLVNlcnZlciByZXN0YXJ0cywgYW5kIGFsbG9jYXRpb24gb2YgbWVtb3J5IGFuZCByZXNvdXJjZXMgZm9yIHBlci1zZXJ2ZXIKLWNvbmZpZ3VyYXRpb24sIGFyZSBoYW5kbGVkIGluIGEgc2ltaWxhciB3YXkuICBUaGVyZSBpcyBhCi08ZW0+Y29uZmlndXJhdGlvbiBwb29sPC9lbT4sIHdoaWNoIGtlZXBzIHRyYWNrIG9mIHJlc291cmNlcyB3aGljaCB3ZXJlCi1hbGxvY2F0ZWQgd2hpbGUgcmVhZGluZyB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gZmlsZXMsIGFuZCBoYW5kbGluZwotdGhlIGNvbW1hbmRzIHRoZXJlaW4gKGZvciBpbnN0YW5jZSwgdGhlIG1lbW9yeSB0aGF0IHdhcyBhbGxvY2F0ZWQgZm9yCi1wZXItc2VydmVyIG1vZHVsZSBjb25maWd1cmF0aW9uLCBsb2cgZmlsZXMgYW5kIG90aGVyIGZpbGVzIHRoYXQgd2VyZQotb3BlbmVkLCBhbmQgc28gZm9ydGgpLiAgV2hlbiB0aGUgc2VydmVyIHJlc3RhcnRzLCBhbmQgaGFzIHRvIHJlcmVhZAotdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMsIHRoZSBjb25maWd1cmF0aW9uIHBvb2wgaXMgY2xlYXJlZCwgYW5kIHNvIHRoZQotbWVtb3J5IGFuZCBmaWxlIGRlc2NyaXB0b3JzIHdoaWNoIHdlcmUgdGFrZW4gdXAgYnkgcmVhZGluZyB0aGVtIHRoZQotbGFzdCB0aW1lIGFyZSBtYWRlIGF2YWlsYWJsZSBmb3IgcmV1c2UuIDxwPgotCi1JdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB1c2Ugb2YgdGhlIHBvb2wgbWFjaGluZXJ5IGlzbid0IGdlbmVyYWxseQotb2JsaWdhdG9yeSwgZXhjZXB0IGZvciBzaXR1YXRpb25zIGxpa2UgbG9nZ2luZyBoYW5kbGVycywgd2hlcmUgeW91Ci1yZWFsbHkgbmVlZCB0byByZWdpc3RlciBjbGVhbnVwcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbG9nIGZpbGUgZ2V0cwotY2xvc2VkIHdoZW4gdGhlIHNlcnZlciByZXN0YXJ0cyAodGhpcyBpcyBtb3N0IGVhc2lseSBkb25lIGJ5IHVzaW5nIHRoZQotZnVuY3Rpb24gPGNvZGU+PGEgaHJlZj0iI3Bvb2wtZmlsZXMiPnBmb3BlbjwvYT48L2NvZGU+LCB3aGljaCBhbHNvCi1hcnJhbmdlcyBmb3IgdGhlIHVuZGVybHlpbmcgZmlsZSBkZXNjcmlwdG9yIHRvIGJlIGNsb3NlZCBiZWZvcmUgYW55Ci1jaGlsZCBwcm9jZXNzZXMsIHN1Y2ggYXMgZm9yIENHSSBzY3JpcHRzLCBhcmUgPGNvZGU+ZXhlYzwvY29kZT5lZCksIG9yCi1pbiBjYXNlIHlvdSBhcmUgdXNpbmcgdGhlIHRpbWVvdXQgbWFjaGluZXJ5ICh3aGljaCBpc24ndCB5ZXQgZXZlbgotZG9jdW1lbnRlZCBoZXJlKS4gIEhvd2V2ZXIsIHRoZXJlIGFyZSB0d28gYmVuZWZpdHMgdG8gdXNpbmcgaXQ6Ci1yZXNvdXJjZXMgYWxsb2NhdGVkIHRvIGEgcG9vbCBuZXZlciBsZWFrIChldmVuIGlmIHlvdSBhbGxvY2F0ZSBhCi1zY3JhdGNoIHN0cmluZywgYW5kIGp1c3QgZm9yZ2V0IGFib3V0IGl0KTsgYWxzbywgZm9yIG1lbW9yeQotYWxsb2NhdGlvbiwgPGNvZGU+cGFsbG9jPC9jb2RlPiBpcyBnZW5lcmFsbHkgZmFzdGVyIHRoYW4KLTxjb2RlPm1hbGxvYzwvY29kZT4uPHA+Ci0KLVdlIGJlZ2luIGhlcmUgYnkgZGVzY3JpYmluZyBob3cgbWVtb3J5IGlzIGFsbG9jYXRlZCB0byBwb29scywgYW5kIHRoZW4KLWRpc2N1c3MgaG93IG90aGVyIHJlc291cmNlcyBhcmUgdHJhY2tlZCBieSB0aGUgcmVzb3VyY2UgcG9vbAotbWFjaGluZXJ5LgotCi08aDM+QWxsb2NhdGlvbiBvZiBtZW1vcnkgaW4gcG9vbHM8L2gzPgotCi1NZW1vcnkgaXMgYWxsb2NhdGVkIHRvIHBvb2xzIGJ5IGNhbGxpbmcgdGhlIGZ1bmN0aW9uCi08Y29kZT5wYWxsb2M8L2NvZGU+LCB3aGljaCB0YWtlcyB0d28gYXJndW1lbnRzLCBvbmUgYmVpbmcgYSBwb2ludGVyIHRvCi1hIHJlc291cmNlIHBvb2wgc3RydWN0dXJlLCBhbmQgdGhlIG90aGVyIGJlaW5nIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvCi1hbGxvY2F0ZSAoaW4gPGNvZGU+Y2hhcjwvY29kZT5zKS4gIFdpdGhpbiBoYW5kbGVycyBmb3IgaGFuZGxpbmcKLXJlcXVlc3RzLCB0aGUgbW9zdCBjb21tb24gd2F5IG9mIGdldHRpbmcgYSByZXNvdXJjZSBwb29sIHN0cnVjdHVyZSBpcwotYnkgbG9va2luZyBhdCB0aGUgPGNvZGU+cG9vbDwvY29kZT4gc2xvdCBvZiB0aGUgcmVsZXZhbnQKLTxjb2RlPnJlcXVlc3RfcmVjPC9jb2RlPjsgaGVuY2UgdGhlIHJlcGVhdGVkIGFwcGVhcmFuY2Ugb2YgdGhlCi1mb2xsb3dpbmcgaWRpb20gaW4gbW9kdWxlIGNvZGU6Ci0KLTxwcmU+Ci1pbnQgbXlfaGFuZGxlcihyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBzdHJ1Y3QgbXlfc3RydWN0dXJlICpmb287Ci0gICAgLi4uCi0KLSAgICBmb28gPSAoZm9vICopcGFsbG9jIChyLT5wb29sLCBzaXplb2YobXlfc3RydWN0dXJlKSk7Ci19Ci08L3ByZT4KLQotTm90ZSB0aGF0IDxlbT50aGVyZSBpcyBubyA8Y29kZT5wZnJlZTwvY29kZT48L2VtPiAtLS0KLTxjb2RlPnBhbGxvYzwvY29kZT5lZCBtZW1vcnkgaXMgZnJlZWQgb25seSB3aGVuIHRoZSBhc3NvY2lhdGVkCi1yZXNvdXJjZSBwb29sIGlzIGNsZWFyZWQuICBUaGlzIG1lYW5zIHRoYXQgPGNvZGU+cGFsbG9jPC9jb2RlPiBkb2VzIG5vdAotaGF2ZSB0byBkbyBhcyBtdWNoIGFjY291bnRpbmcgYXMgPGNvZGU+bWFsbG9jKCk8L2NvZGU+OyBhbGwgaXQgZG9lcyBpbgotdGhlIHR5cGljYWwgY2FzZSBpcyB0byByb3VuZCB1cCB0aGUgc2l6ZSwgYnVtcCBhIHBvaW50ZXIsIGFuZCBkbyBhCi1yYW5nZSBjaGVjay48cD4KLQotKEl0IGFsc28gcmFpc2VzIHRoZSBwb3NzaWJpbGl0eSB0aGF0IGhlYXZ5IHVzZSBvZiA8Y29kZT5wYWxsb2M8L2NvZGU+Ci1jb3VsZCBjYXVzZSBhIHNlcnZlciBwcm9jZXNzIHRvIGdyb3cgZXhjZXNzaXZlbHkgbGFyZ2UuICBUaGVyZSBhcmUKLXR3byB3YXlzIHRvIGRlYWwgd2l0aCB0aGlzLCB3aGljaCBhcmUgZGVhbHQgd2l0aCBiZWxvdzsgYnJpZWZseSwgeW91Ci1jYW4gdXNlIDxjb2RlPm1hbGxvYzwvY29kZT4sIGFuZCB0cnkgdG8gYmUgc3VyZSB0aGF0IGFsbCBvZiB0aGUgbWVtb3J5Ci1nZXRzIGV4cGxpY2l0bHkgPGNvZGU+ZnJlZTwvY29kZT5kLCBvciB5b3UgY2FuIGFsbG9jYXRlIGEgc3ViLXBvb2wgb2YKLXRoZSBtYWluIHBvb2wsIGFsbG9jYXRlIHlvdXIgbWVtb3J5IGluIHRoZSBzdWItcG9vbCwgYW5kIGNsZWFyIGl0IG91dAotcGVyaW9kaWNhbGx5LiAgVGhlIGxhdHRlciB0ZWNobmlxdWUgaXMgZGlzY3Vzc2VkIGluIHRoZSBzZWN0aW9uIG9uCi1zdWItcG9vbHMgYmVsb3csIGFuZCBpcyB1c2VkIGluIHRoZSBkaXJlY3RvcnktaW5kZXhpbmcgY29kZSwgaW4gb3JkZXIKLXRvIGF2b2lkIGV4Y2Vzc2l2ZSBzdG9yYWdlIGFsbG9jYXRpb24gd2hlbiBsaXN0aW5nIGRpcmVjdG9yaWVzIHdpdGgKLXRob3VzYW5kcyBvZiBmaWxlcykuCi0KLTxoMz5BbGxvY2F0aW5nIGluaXRpYWxpemVkIG1lbW9yeTwvaDM+Ci0KLVRoZXJlIGFyZSBmdW5jdGlvbnMgd2hpY2ggYWxsb2NhdGUgaW5pdGlhbGl6ZWQgbWVtb3J5LCBhbmQgYXJlCi1mcmVxdWVudGx5IHVzZWZ1bC4gIFRoZSBmdW5jdGlvbiA8Y29kZT5wY2FsbG9jPC9jb2RlPiBoYXMgdGhlIHNhbWUKLWludGVyZmFjZSBhcyA8Y29kZT5wYWxsb2M8L2NvZGU+LCBidXQgY2xlYXJzIG91dCB0aGUgbWVtb3J5IGl0Ci1hbGxvY2F0ZXMgYmVmb3JlIGl0IHJldHVybnMgaXQuICBUaGUgZnVuY3Rpb24gPGNvZGU+cHN0cmR1cDwvY29kZT4KLXRha2VzIGEgcmVzb3VyY2UgcG9vbCBhbmQgYSA8Y29kZT5jaGFyICo8L2NvZGU+IGFzIGFyZ3VtZW50cywgYW5kCi1hbGxvY2F0ZXMgbWVtb3J5IGZvciBhIGNvcHkgb2YgdGhlIHN0cmluZyB0aGUgcG9pbnRlciBwb2ludHMgdG8sCi1yZXR1cm5pbmcgYSBwb2ludGVyIHRvIHRoZSBjb3B5LiAgRmluYWxseSA8Y29kZT5wc3RyY2F0PC9jb2RlPiBpcyBhCi12YXJhcmdzLXN0eWxlIGZ1bmN0aW9uLCB3aGljaCB0YWtlcyBhIHBvaW50ZXIgdG8gYSByZXNvdXJjZSBwb29sLCBhbmQKLWF0IGxlYXN0IHR3byA8Y29kZT5jaGFyICo8L2NvZGU+IGFyZ3VtZW50cywgdGhlIGxhc3Qgb2Ygd2hpY2ggbXVzdCBiZQotPGNvZGU+TlVMTDwvY29kZT4uICBJdCBhbGxvY2F0ZXMgZW5vdWdoIG1lbW9yeSB0byBmaXQgY29waWVzIG9mIGVhY2gKLW9mIHRoZSBzdHJpbmdzLCBhcyBhIHVuaXQ7IGZvciBpbnN0YW5jZToKLQotPHByZT4KLSAgICAgcHN0cmNhdCAoci0+cG9vbCwgImZvbyIsICIvIiwgImJhciIsIE5VTEwpOwotPC9wcmU+Ci0KLXJldHVybnMgYSBwb2ludGVyIHRvIDggYnl0ZXMgd29ydGggb2YgbWVtb3J5LCBpbml0aWFsaXplZCB0bwotPGNvZGU+ImZvby9iYXIiPC9jb2RlPi4KLQotPGgzPlRyYWNraW5nIG9wZW4gZmlsZXMsIGV0Yy48L2gzPgotCi1BcyBpbmRpY2F0ZWQgYWJvdmUsIHJlc291cmNlIHBvb2xzIGFyZSBhbHNvIHVzZWQgdG8gdHJhY2sgb3RoZXIgc29ydHMKLW9mIHJlc291cmNlcyBiZXNpZGVzIG1lbW9yeS4gIFRoZSBtb3N0IGNvbW1vbiBhcmUgb3BlbiBmaWxlcy4gIFRoZQotcm91dGluZSB3aGljaCBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgdGhpcyBpcyA8Y29kZT5wZm9wZW48L2NvZGU+LCB3aGljaAotdGFrZXMgYSByZXNvdXJjZSBwb29sIGFuZCB0d28gc3RyaW5ncyBhcyBhcmd1bWVudHM7IHRoZSBzdHJpbmdzIGFyZQotdGhlIHNhbWUgYXMgdGhlIHR5cGljYWwgYXJndW1lbnRzIHRvIDxjb2RlPmZvcGVuPC9jb2RlPiwgZS5nLiwKLQotPHByZT4KLSAgICAgLi4uCi0gICAgIEZJTEUgKmYgPSBwZm9wZW4gKHItPnBvb2wsIHItPmZpbGVuYW1lLCAiciIpOwotCi0gICAgIGlmIChmID09IE5VTEwpIHsgLi4uIH0gZWxzZSB7IC4uLiB9Ci08L3ByZT4KLQotVGhlcmUgaXMgYWxzbyBhIDxjb2RlPnBvcGVuZjwvY29kZT4gcm91dGluZSwgd2hpY2ggcGFyYWxsZWxzIHRoZQotbG93ZXItbGV2ZWwgPGNvZGU+b3BlbjwvY29kZT4gc3lzdGVtIGNhbGwuICBCb3RoIG9mIHRoZXNlIHJvdXRpbmVzCi1hcnJhbmdlIGZvciB0aGUgZmlsZSB0byBiZSBjbG9zZWQgd2hlbiB0aGUgcmVzb3VyY2UgcG9vbCBpbiBxdWVzdGlvbgotaXMgY2xlYXJlZC4gIDxwPgotCi1Vbmxpa2UgdGhlIGNhc2UgZm9yIG1lbW9yeSwgdGhlcmUgPGVtPmFyZTwvZW0+IGZ1bmN0aW9ucyB0byBjbG9zZQotZmlsZXMgYWxsb2NhdGVkIHdpdGggPGNvZGU+cGZvcGVuPC9jb2RlPiwgYW5kIDxjb2RlPnBvcGVuZjwvY29kZT4sCi1uYW1lbHkgPGNvZGU+cGZjbG9zZTwvY29kZT4gYW5kIDxjb2RlPnBjbG9zZWY8L2NvZGU+LiAgKFRoaXMgaXMKLWJlY2F1c2UsIG9uIG1hbnkgc3lzdGVtcywgdGhlIG51bWJlciBvZiBmaWxlcyB3aGljaCBhIHNpbmdsZSBwcm9jZXNzCi1jYW4gaGF2ZSBvcGVuIGlzIHF1aXRlIGxpbWl0ZWQpLiAgSXQgaXMgaW1wb3J0YW50IHRvIHVzZSB0aGVzZQotZnVuY3Rpb25zIHRvIGNsb3NlIGZpbGVzIGFsbG9jYXRlZCB3aXRoIDxjb2RlPnBmb3BlbjwvY29kZT4gYW5kCi08Y29kZT5wb3BlbmY8L2NvZGU+LCBzaW5jZSB0byBkbyBvdGhlcndpc2UgY291bGQgY2F1c2UgZmF0YWwgZXJyb3JzIG9uCi1zeXN0ZW1zIHN1Y2ggYXMgTGludXgsIHdoaWNoIHJlYWN0IGJhZGx5IGlmIHRoZSBzYW1lCi08Y29kZT5GSUxFKjwvY29kZT4gaXMgY2xvc2VkIG1vcmUgdGhhbiBvbmNlLiA8cD4KLQotKFVzaW5nIHRoZSA8Y29kZT5jbG9zZTwvY29kZT4gZnVuY3Rpb25zIGlzIG5vdCBtYW5kYXRvcnksIHNpbmNlIHRoZQotZmlsZSB3aWxsIGV2ZW50dWFsbHkgYmUgY2xvc2VkIHJlZ2FyZGxlc3MsIGJ1dCB5b3Ugc2hvdWxkIGNvbnNpZGVyIGl0Ci1pbiBjYXNlcyB3aGVyZSB5b3VyIG1vZHVsZSBpcyBvcGVuaW5nLCBvciBjb3VsZCBvcGVuLCBhIGxvdCBvZiBmaWxlcykuCi0KLTxoMz5PdGhlciBzb3J0cyBvZiByZXNvdXJjZXMgLS0tIGNsZWFudXAgZnVuY3Rpb25zPC9oMz4KLQotTW9yZSB0ZXh0IGdvZXMgaGVyZS4gIERlc2NyaWJlIHRoZSB0aGUgY2xlYW51cCBwcmltaXRpdmVzIGluIHRlcm1zIG9mCi13aGljaCB0aGUgZmlsZSBzdHVmZiBpcyBpbXBsZW1lbnRlZDsgYWxzbywgPGNvZGU+c3Bhd25fcHJvY2VzczwvY29kZT4uIAotCi08aDM+RmluZSBjb250cm9sIC0tLSBjcmVhdGluZyBhbmQgZGVhbGluZyB3aXRoIHN1Yi1wb29scywgd2l0aCBhIG5vdGUKLW9uIHN1Yi1yZXF1ZXN0czwvaDM+Ci0KLU9uIHJhcmUgb2NjYXNpb25zLCB0b28tZnJlZSB1c2Ugb2YgPGNvZGU+cGFsbG9jKCk8L2NvZGU+IGFuZCB0aGUKLWFzc29jaWF0ZWQgcHJpbWl0aXZlcyBtYXkgcmVzdWx0IGluIHVuZGVzaXJhYmx5IHByb2ZsaWdhdGUgcmVzb3VyY2UKLWFsbG9jYXRpb24uICBZb3UgY2FuIGRlYWwgd2l0aCBzdWNoIGEgY2FzZSBieSBjcmVhdGluZyBhCi08ZW0+c3ViLXBvb2w8L2VtPiwgYWxsb2NhdGluZyB3aXRoaW4gdGhlIHN1Yi1wb29sIHJhdGhlciB0aGFuIHRoZSBtYWluCi1wb29sLCBhbmQgY2xlYXJpbmcgb3IgZGVzdHJveWluZyB0aGUgc3ViLXBvb2wsIHdoaWNoIHJlbGVhc2VzIHRoZQotcmVzb3VyY2VzIHdoaWNoIHdlcmUgYXNzb2NpYXRlZCB3aXRoIGl0LiAgKFRoaXMgcmVhbGx5IDxlbT5pczwvZW0+IGEKLXJhcmUgc2l0dWF0aW9uOyB0aGUgb25seSBjYXNlIGluIHdoaWNoIGl0IGNvbWVzIHVwIGluIHRoZSBzdGFuZGFyZAotbW9kdWxlIHNldCBpcyBpbiBjYXNlIG9mIGxpc3RpbmcgZGlyZWN0b3JpZXMsIGFuZCB0aGVuIG9ubHkgd2l0aAotPGVtPnZlcnk8L2VtPiBsYXJnZSBkaXJlY3Rvcmllcy4gIFVubmVjZXNzYXJ5IHVzZSBvZiB0aGUgcHJpbWl0aXZlcwotZGlzY3Vzc2VkIGhlcmUgY2FuIGhhaXIgdXAgeW91ciBjb2RlIHF1aXRlIGEgYml0LCB3aXRoIHZlcnkgbGl0dGxlCi1nYWluKS4gPHA+Ci0KLVRoZSBwcmltaXRpdmUgZm9yIGNyZWF0aW5nIGEgc3ViLXBvb2wgaXMgPGNvZGU+bWFrZV9zdWJfcG9vbDwvY29kZT4sCi13aGljaCB0YWtlcyBhbm90aGVyIHBvb2wgKHRoZSBwYXJlbnQgcG9vbCkgYXMgYW4gYXJndW1lbnQuICBXaGVuIHRoZQotbWFpbiBwb29sIGlzIGNsZWFyZWQsIHRoZSBzdWItcG9vbCB3aWxsIGJlIGRlc3Ryb3llZC4gIFRoZSBzdWItcG9vbAotbWF5IGFsc28gYmUgY2xlYXJlZCBvciBkZXN0cm95ZWQgYXQgYW55IHRpbWUsIGJ5IGNhbGxpbmcgdGhlIGZ1bmN0aW9ucwotPGNvZGU+Y2xlYXJfcG9vbDwvY29kZT4gYW5kIDxjb2RlPmRlc3Ryb3lfcG9vbDwvY29kZT4sIHJlc3BlY3RpdmVseS4KLShUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IDxjb2RlPmNsZWFyX3Bvb2w8L2NvZGU+IGZyZWVzIHJlc291cmNlcwotYXNzb2NpYXRlZCB3aXRoIHRoZSBwb29sLCB3aGlsZSA8Y29kZT5kZXN0cm95X3Bvb2w8L2NvZGU+IGFsc28KLWRlYWxsb2NhdGVzIHRoZSBwb29sIGl0c2VsZi4gIEluIHRoZSBmb3JtZXIgY2FzZSwgeW91IGNhbiBhbGxvY2F0ZSBuZXcKLXJlc291cmNlcyB3aXRoaW4gdGhlIHBvb2wsIGFuZCBjbGVhciBpdCBhZ2FpbiwgYW5kIHNvIGZvcnRoOyBpbiB0aGUKLWxhdHRlciBjYXNlLCBpdCBpcyBzaW1wbHkgZ29uZSkuIDxwPgotCi1PbmUgZmluYWwgbm90ZSAtLS0gc3ViLXJlcXVlc3RzIGhhdmUgdGhlaXIgb3duIHJlc291cmNlIHBvb2xzLCB3aGljaAotYXJlIHN1Yi1wb29scyBvZiB0aGUgcmVzb3VyY2UgcG9vbCBmb3IgdGhlIG1haW4gcmVxdWVzdC4gIFRoZSBwb2xpdGUKLXdheSB0byByZWNsYWltIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgc3ViIHJlcXVlc3Qgd2hpY2ggeW91Ci1oYXZlIGFsbG9jYXRlZCAodXNpbmcgdGhlIDxjb2RlPnN1Yl9yZXFfbG9va3VwXy4uLjwvY29kZT4gZnVuY3Rpb25zKQotaXMgPGNvZGU+ZGVzdHJveV9zdWJfcmVxdWVzdDwvY29kZT4sIHdoaWNoIGZyZWVzIHRoZSByZXNvdXJjZSBwb29sLgotQmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgYmUgc3VyZSB0byBjb3B5IGFueXRoaW5nIHRoYXQgeW91IGNhcmUKLWFib3V0IHdoaWNoIG1pZ2h0IGJlIGFsbG9jYXRlZCBpbiB0aGUgc3ViLXJlcXVlc3QncyByZXNvdXJjZSBwb29sIGludG8KLXNvbWVwbGFjZSBhIGxpdHRsZSBsZXNzIHZvbGF0aWxlIChmb3IgaW5zdGFuY2UsIHRoZSBmaWxlbmFtZSBpbiBpdHMKLTxjb2RlPnJlcXVlc3RfcmVjPC9jb2RlPiBzdHJ1Y3R1cmUpLiA8cD4KLQotKEFnYWluLCB1bmRlciBtb3N0IGNpcmN1bXN0YW5jZXMsIHlvdSBzaG91bGRuJ3QgZmVlbCBvYmxpZ2VkIHRvIGNhbGwKLXRoaXMgZnVuY3Rpb247IG9ubHkgMksgb2YgbWVtb3J5IG9yIHNvIGFyZSBhbGxvY2F0ZWQgZm9yIGEgdHlwaWNhbCBzdWIKLXJlcXVlc3QsIGFuZCBpdCB3aWxsIGJlIGZyZWVkIGFueXdheSB3aGVuIHRoZSBtYWluIHJlcXVlc3QgcG9vbCBpcwotY2xlYXJlZC4gIEl0IGlzIG9ubHkgd2hlbiB5b3UgYXJlIGFsbG9jYXRpbmcgbWFueSwgbWFueSBzdWItcmVxdWVzdHMKLWZvciBhIHNpbmdsZSBtYWluIHJlcXVlc3QgdGhhdCB5b3Ugc2hvdWxkIHNlcmlvdXNseSBjb25zaWRlciB0aGUKLTxjb2RlPmRlc3Ryb3kuLi48L2NvZGU+IGZ1bmN0aW9ucykuCi0KLTxoMj48YSBuYW1lPSJjb25maWciPkNvbmZpZ3VyYXRpb24sIGNvbW1hbmRzIGFuZCB0aGUgbGlrZTwvYT48L2gyPgotCi1PbmUgb2YgdGhlIGRlc2lnbiBnb2FscyBmb3IgdGhpcyBzZXJ2ZXIgd2FzIHRvIG1haW50YWluIGV4dGVybmFsCi1jb21wYXRpYmlsaXR5IHdpdGggdGhlIE5DU0EgMS4zIHNlcnZlciAtLS0gdGhhdCBpcywgdG8gcmVhZCB0aGUgc2FtZQotY29uZmlndXJhdGlvbiBmaWxlcywgdG8gcHJvY2VzcyBhbGwgdGhlIGRpcmVjdGl2ZXMgdGhlcmVpbiBjb3JyZWN0bHksCi1hbmQgaW4gZ2VuZXJhbCB0byBiZSBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIE5DU0EuICBPbiB0aGUgb3RoZXIKLWhhbmQsIGFub3RoZXIgZGVzaWduIGdvYWwgd2FzIHRvIG1vdmUgYXMgbXVjaCBvZiB0aGUgc2VydmVyJ3MKLWZ1bmN0aW9uYWxpdHkgaW50byBtb2R1bGVzIHdoaWNoIGhhdmUgYXMgbGl0dGxlIGFzIHBvc3NpYmxlIHRvIGRvIHdpdGgKLXRoZSBtb25vbGl0aGljIHNlcnZlciBjb3JlLiAgVGhlIG9ubHkgd2F5IHRvIHJlY29uY2lsZSB0aGVzZSBnb2FscyBpcwotdG8gbW92ZSB0aGUgaGFuZGxpbmcgb2YgbW9zdCBjb21tYW5kcyBmcm9tIHRoZSBjZW50cmFsIHNlcnZlciBpbnRvIHRoZQotbW9kdWxlcy4gIDxwPgotCi1Ib3dldmVyLCBqdXN0IGdpdmluZyB0aGUgbW9kdWxlcyBjb21tYW5kIHRhYmxlcyBpcyBub3QgZW5vdWdoIHRvCi1kaXZvcmNlIHRoZW0gY29tcGxldGVseSBmcm9tIHRoZSBzZXJ2ZXIgY29yZS4gIFRoZSBzZXJ2ZXIgaGFzIHRvCi1yZW1lbWJlciB0aGUgY29tbWFuZHMgaW4gb3JkZXIgdG8gYWN0IG9uIHRoZW0gbGF0ZXIuICBUaGF0IGludm9sdmVzCi1tYWludGFpbmluZyBkYXRhIHdoaWNoIGlzIHByaXZhdGUgdG8gdGhlIG1vZHVsZXMsIGFuZCB3aGljaCBjYW4gYmUKLWVpdGhlciBwZXItc2VydmVyLCBvciBwZXItZGlyZWN0b3J5LiAgTW9zdCB0aGluZ3MgYXJlIHBlci1kaXJlY3RvcnksCi1pbmNsdWRpbmcgaW4gcGFydGljdWxhciBhY2Nlc3MgY29udHJvbCBhbmQgYXV0aG9yaXphdGlvbiBpbmZvcm1hdGlvbiwKLWJ1dCBhbHNvIGluZm9ybWF0aW9uIG9uIGhvdyB0byBkZXRlcm1pbmUgZmlsZSB0eXBlcyBmcm9tIHN1ZmZpeGVzLAotd2hpY2ggY2FuIGJlIG1vZGlmaWVkIGJ5IDxjb2RlPkFkZFR5cGU8L2NvZGU+IGFuZAotPGNvZGU+RGVmYXVsdFR5cGU8L2NvZGU+IGRpcmVjdGl2ZXMsIGFuZCBzbyBmb3J0aC4gIEluIGdlbmVyYWwsIHRoZQotZ292ZXJuaW5nIHBoaWxvc29waHkgaXMgdGhhdCBhbnl0aGluZyB3aGljaCA8ZW0+Y2FuPC9lbT4gYmUgbWFkZQotY29uZmlndXJhYmxlIGJ5IGRpcmVjdG9yeSBzaG91bGQgYmU7IHBlci1zZXJ2ZXIgaW5mb3JtYXRpb24gaXMKLWdlbmVyYWxseSB1c2VkIGluIHRoZSBzdGFuZGFyZCBzZXQgb2YgbW9kdWxlcyBmb3IgaW5mb3JtYXRpb24gbGlrZQotPGNvZGU+QWxpYXM8L2NvZGU+ZXMgYW5kIDxjb2RlPlJlZGlyZWN0PC9jb2RlPnMgd2hpY2ggY29tZSBpbnRvIHBsYXkKLWJlZm9yZSB0aGUgcmVxdWVzdCBpcyB0aWVkIHRvIGEgcGFydGljdWxhciBwbGFjZSBpbiB0aGUgdW5kZXJseWluZwotZmlsZSBzeXN0ZW0uIDxwPgotCi1Bbm90aGVyIHJlcXVpcmVtZW50IGZvciBlbXVsYXRpbmcgdGhlIE5DU0Egc2VydmVyIGlzIGJlaW5nIGFibGUgdG8KLWhhbmRsZSB0aGUgcGVyLWRpcmVjdG9yeSBjb25maWd1cmF0aW9uIGZpbGVzLCBnZW5lcmFsbHkgY2FsbGVkCi08Y29kZT4uaHRhY2Nlc3M8L2NvZGU+IGZpbGVzLCB0aG91Z2ggZXZlbiBpbiB0aGUgTkNTQSBzZXJ2ZXIgdGhleSBjYW4KLWNvbnRhaW4gZGlyZWN0aXZlcyB3aGljaCBoYXZlIG5vdGhpbmcgYXQgYWxsIHRvIGRvIHdpdGggYWNjZXNzCi1jb250cm9sLiAgQWNjb3JkaW5nbHksIGFmdGVyIFVSSSAtJmd0OyBmaWxlbmFtZSB0cmFuc2xhdGlvbiwgYnV0IGJlZm9yZQotcGVyZm9ybWluZyBhbnkgb3RoZXIgcGhhc2UsIHRoZSBzZXJ2ZXIgd2Fsa3MgZG93biB0aGUgZGlyZWN0b3J5Ci1oaWVyYXJjaHkgb2YgdGhlIHVuZGVybHlpbmcgZmlsZXN5c3RlbSwgZm9sbG93aW5nIHRoZSB0cmFuc2xhdGVkCi1wYXRobmFtZSwgdG8gcmVhZCBhbnkgPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBmaWxlcyB3aGljaCBtaWdodCBiZQotcHJlc2VudC4gIFRoZSBpbmZvcm1hdGlvbiB3aGljaCBpcyByZWFkIGluIHRoZW4gaGFzIHRvIGJlCi08ZW0+bWVyZ2VkPC9lbT4gd2l0aCB0aGUgYXBwbGljYWJsZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzZXJ2ZXIncyBvd24KLWNvbmZpZyBmaWxlcyAoZWl0aGVyIGZyb20gdGhlIDxjb2RlPiZsdDtEaXJlY3RvcnkmZ3Q7PC9jb2RlPiBzZWN0aW9ucwotaW4gPGNvZGU+YWNjZXNzLmNvbmY8L2NvZGU+LCBvciBmcm9tIGRlZmF1bHRzIGluCi08Y29kZT5zcm0uY29uZjwvY29kZT4sIHdoaWNoIGFjdHVhbGx5IGJlaGF2ZXMgZm9yIG1vc3QgcHVycG9zZXMgYWxtb3N0Ci1leGFjdGx5IGxpa2UgPGNvZGU+Jmx0O0RpcmVjdG9yeSAvJmd0OzwvY29kZT4pLjxwPgotCi1GaW5hbGx5LCBhZnRlciBoYXZpbmcgc2VydmVkIGEgcmVxdWVzdCB3aGljaCBpbnZvbHZlZCByZWFkaW5nCi08Y29kZT4uaHRhY2Nlc3M8L2NvZGU+IGZpbGVzLCB3ZSBuZWVkIHRvIGRpc2NhcmQgdGhlIHN0b3JhZ2UgYWxsb2NhdGVkCi1mb3IgaGFuZGxpbmcgdGhlbS4gIFRoYXQgaXMgc29sdmVkIHRoZSBzYW1lIHdheSBpdCBpcyBzb2x2ZWQgd2hlcmV2ZXIKLWVsc2Ugc2ltaWxhciBwcm9ibGVtcyBjb21lIHVwLCBieSB0eWluZyB0aG9zZSBzdHJ1Y3R1cmVzIHRvIHRoZQotcGVyLXRyYW5zYWN0aW9uIHJlc291cmNlIHBvb2wuICA8cD4KLQotPGgzPjxhIG5hbWU9InBlci1kaXIiPlBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmVzPC9hPjwvaDM+Ci0KLUxldCdzIGxvb2sgb3V0IGhvdyBhbGwgb2YgdGhpcyBwbGF5cyBvdXQgaW4gPGNvZGU+bW9kX21pbWUuYzwvY29kZT4sCi13aGljaCBkZWZpbmVzIHRoZSBmaWxlIHR5cGluZyBoYW5kbGVyIHdoaWNoIGVtdWxhdGVzIHRoZSBOQ1NBIHNlcnZlcidzCi1iZWhhdmlvciBvZiBkZXRlcm1pbmluZyBmaWxlIHR5cGVzIGZyb20gc3VmZml4ZXMuICBXaGF0IHdlJ2xsIGJlCi1sb29raW5nIGF0LCBoZXJlLCBpcyB0aGUgY29kZSB3aGljaCBpbXBsZW1lbnRzIHRoZQotPGNvZGU+QWRkVHlwZTwvY29kZT4gYW5kIDxjb2RlPkFkZEVuY29kaW5nPC9jb2RlPiBjb21tYW5kcy4gIFRoZXNlCi1jb21tYW5kcyBjYW4gYXBwZWFyIGluIDxjb2RlPi5odGFjY2VzczwvY29kZT4gZmlsZXMsIHNvIHRoZXkgbXVzdCBiZQotaGFuZGxlZCBpbiB0aGUgbW9kdWxlJ3MgcHJpdmF0ZSBwZXItZGlyZWN0b3J5IGRhdGEsIHdoaWNoIGluIGZhY3QsCi1jb25zaXN0cyBvZiB0d28gc2VwYXJhdGUgPGNvZGU+dGFibGU8L2NvZGU+cyBmb3IgTUlNRSB0eXBlcyBhbmQKLWVuY29kaW5nIGluZm9ybWF0aW9uLCBhbmQgaXMgZGVjbGFyZWQgYXMgZm9sbG93czoKLQotPHByZT4KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB0YWJsZSAqZm9yY2VkX3R5cGVzOyAgICAgIC8qIEFkZGl0aW9uYWwgQWRkVHlwZWQgc3R1ZmYgKi8KLSAgICB0YWJsZSAqZW5jb2RpbmdfdHlwZXM7ICAgIC8qIEFkZGVkIHdpdGggQWRkRW5jb2RpbmcuLi4gKi8KLX0gbWltZV9kaXJfY29uZmlnOwotPC9wcmU+Ci0KLVdoZW4gdGhlIHNlcnZlciBpcyByZWFkaW5nIGEgY29uZmlndXJhdGlvbiBmaWxlLCBvcgotPGNvZGU+Jmx0O0RpcmVjdG9yeSZndDs8L2NvZGU+IHNlY3Rpb24sIHdoaWNoIGluY2x1ZGVzIG9uZSBvZiB0aGUgTUlNRQotbW9kdWxlJ3MgY29tbWFuZHMsIGl0IG5lZWRzIHRvIGNyZWF0ZSBhIDxjb2RlPm1pbWVfZGlyX2NvbmZpZzwvY29kZT4KLXN0cnVjdHVyZSwgc28gdGhvc2UgY29tbWFuZHMgaGF2ZSBzb21ldGhpbmcgdG8gYWN0IG9uLiAgSXQgZG9lcyB0aGlzCi1ieSBpbnZva2luZyB0aGUgZnVuY3Rpb24gaXQgZmluZHMgaW4gdGhlIG1vZHVsZSdzIGBjcmVhdGUgcGVyLWRpcgotY29uZmlnIHNsb3QnLCB3aXRoIHR3byBhcmd1bWVudHM6IHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdG8gd2hpY2gKLXRoaXMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhcHBsaWVzIChvciA8Y29kZT5OVUxMPC9jb2RlPiBmb3IKLTxjb2RlPnNybS5jb25mPC9jb2RlPiksIGFuZCBhIHBvaW50ZXIgdG8gYSByZXNvdXJjZSBwb29sIGluIHdoaWNoIHRoZQotYWxsb2NhdGlvbiBzaG91bGQgaGFwcGVuLiA8cD4KLQotKElmIHdlIGFyZSByZWFkaW5nIGEgPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBmaWxlLCB0aGF0IHJlc291cmNlIHBvb2wKLWlzIHRoZSBwZXItcmVxdWVzdCByZXNvdXJjZSBwb29sIGZvciB0aGUgcmVxdWVzdDsgb3RoZXJ3aXNlIGl0IGlzIGEKLXJlc291cmNlIHBvb2wgd2hpY2ggaXMgdXNlZCBmb3IgY29uZmlndXJhdGlvbiBkYXRhLCBhbmQgY2xlYXJlZCBvbgotcmVzdGFydHMuICBFaXRoZXIgd2F5LCBpdCBpcyBpbXBvcnRhbnQgZm9yIHRoZSBzdHJ1Y3R1cmUgYmVpbmcgY3JlYXRlZAotdG8gdmFuaXNoIHdoZW4gdGhlIHBvb2wgaXMgY2xlYXJlZCwgYnkgcmVnaXN0ZXJpbmcgYSBjbGVhbnVwIG9uIHRoZQotcG9vbCBpZiBuZWNlc3NhcnkpLiA8cD4KLQotRm9yIHRoZSBNSU1FIG1vZHVsZSwgdGhlIHBlci1kaXIgY29uZmlnIGNyZWF0aW9uIGZ1bmN0aW9uIGp1c3QKLTxjb2RlPnBhbGxvYzwvY29kZT5zIHRoZSBzdHJ1Y3R1cmUgYWJvdmUsIGFuZCBhIGNyZWF0ZXMgYSBjb3VwbGUgb2YKLTxjb2RlPnRhYmxlPC9jb2RlPnMgdG8gZmlsbCBpdC4gIFRoYXQgbG9va3MgbGlrZSB0aGlzOgotCi08cHJlPgotdm9pZCAqY3JlYXRlX21pbWVfZGlyX2NvbmZpZyAocG9vbCAqcCwgY2hhciAqZHVtbXkpCi17Ci0gICAgbWltZV9kaXJfY29uZmlnICpuZXcgPQotICAgICAgKG1pbWVfZGlyX2NvbmZpZyAqKSBwYWxsb2MgKHAsIHNpemVvZihtaW1lX2Rpcl9jb25maWcpKTsKLQotICAgIG5ldy0mZ3Q7Zm9yY2VkX3R5cGVzID0gbWFrZV90YWJsZSAocCwgNCk7Ci0gICAgbmV3LSZndDtlbmNvZGluZ190eXBlcyA9IG1ha2VfdGFibGUgKHAsIDQpOwotICAgIAotICAgIHJldHVybiBuZXc7Ci19Ci08L3ByZT4KLQotTm93LCBzdXBwb3NlIHdlJ3ZlIGp1c3QgcmVhZCBpbiBhIDxjb2RlPi5odGFjY2VzczwvY29kZT4gZmlsZS4gIFdlCi1hbHJlYWR5IGhhdmUgdGhlIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBuZXh0Ci1kaXJlY3RvcnkgdXAgaW4gdGhlIGhpZXJhcmNoeS4gIElmIHRoZSA8Y29kZT4uaHRhY2Nlc3M8L2NvZGU+IGZpbGUgd2UKLWp1c3QgcmVhZCBpbiBkaWRuJ3QgaGF2ZSBhbnkgPGNvZGU+QWRkVHlwZTwvY29kZT4gb3IKLTxjb2RlPkFkZEVuY29kaW5nPC9jb2RlPiBjb21tYW5kcywgaXRzIHBlci1kaXJlY3RvcnkgY29uZmlnIHN0cnVjdHVyZQotZm9yIHRoZSBNSU1FIG1vZHVsZSBpcyBzdGlsbCB2YWxpZCwgYW5kIHdlIGNhbiBqdXN0IHVzZSBpdC4KLU90aGVyd2lzZSwgd2UgbmVlZCB0byBtZXJnZSB0aGUgdHdvIHN0cnVjdHVyZXMgc29tZWhvdy4gPHA+Ci0KLVRvIGRvIHRoYXQsIHRoZSBzZXJ2ZXIgaW52b2tlcyB0aGUgbW9kdWxlJ3MgcGVyLWRpcmVjdG9yeSBjb25maWcgbWVyZ2UKLWZ1bmN0aW9uLCBpZiBvbmUgaXMgcHJlc2VudC4gIFRoYXQgZnVuY3Rpb24gdGFrZXMgdGhyZWUgYXJndW1lbnRzOgotdGhlIHR3byBzdHJ1Y3R1cmVzIGJlaW5nIG1lcmdlZCwgYW5kIGEgcmVzb3VyY2UgcG9vbCBpbiB3aGljaCB0bwotYWxsb2NhdGUgdGhlIHJlc3VsdC4gIEZvciB0aGUgTUlNRSBtb2R1bGUsIGFsbCB0aGF0IG5lZWRzIHRvIGJlIGRvbmUKLWlzIG92ZXJsYXkgdGhlIHRhYmxlcyBmcm9tIHRoZSBuZXcgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlIHdpdGgKLXRob3NlIGZyb20gdGhlIHBhcmVudDoKLQotPHByZT4KLXZvaWQgKm1lcmdlX21pbWVfZGlyX2NvbmZpZ3MgKHBvb2wgKnAsIHZvaWQgKnBhcmVudF9kaXJ2LCB2b2lkICpzdWJkaXJ2KQotewotICAgIG1pbWVfZGlyX2NvbmZpZyAqcGFyZW50X2RpciA9IChtaW1lX2Rpcl9jb25maWcgKilwYXJlbnRfZGlydjsKLSAgICBtaW1lX2Rpcl9jb25maWcgKnN1YmRpciA9IChtaW1lX2Rpcl9jb25maWcgKilzdWJkaXJ2OwotICAgIG1pbWVfZGlyX2NvbmZpZyAqbmV3ID0KLSAgICAgIChtaW1lX2Rpcl9jb25maWcgKilwYWxsb2MgKHAsIHNpemVvZihtaW1lX2Rpcl9jb25maWcpKTsKLQotICAgIG5ldy0mZ3Q7Zm9yY2VkX3R5cGVzID0gb3ZlcmxheV90YWJsZXMgKHAsIHN1YmRpci0mZ3Q7Zm9yY2VkX3R5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF9kaXItJmd0O2ZvcmNlZF90eXBlcyk7Ci0gICAgbmV3LSZndDtlbmNvZGluZ190eXBlcyA9IG92ZXJsYXlfdGFibGVzIChwLCBzdWJkaXItJmd0O2VuY29kaW5nX3R5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50X2Rpci0mZ3Q7ZW5jb2RpbmdfdHlwZXMpOwotCi0gICAgcmV0dXJuIG5ldzsKLX0KLTwvcHJlPgotCi1BcyBhIG5vdGUgLS0tIGlmIHRoZXJlIGlzIG5vIHBlci1kaXJlY3RvcnkgbWVyZ2UgZnVuY3Rpb24gcHJlc2VudCwgdGhlCi1zZXJ2ZXIgd2lsbCBqdXN0IHVzZSB0aGUgc3ViZGlyZWN0b3J5J3MgY29uZmlndXJhdGlvbiBpbmZvLCBhbmQgaWdub3JlCi10aGUgcGFyZW50J3MuICBGb3Igc29tZSBtb2R1bGVzLCB0aGF0IHdvcmtzIGp1c3QgZmluZSAoZS5nLiwgZm9yIHRoZQotaW5jbHVkZXMgbW9kdWxlLCB3aG9zZSBwZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KLWNvbnNpc3RzIHNvbGVseSBvZiB0aGUgc3RhdGUgb2YgdGhlIDxjb2RlPlhCSVRIQUNLPC9jb2RlPiksIGFuZCBmb3IKLXRob3NlIG1vZHVsZXMsIHlvdSBjYW4ganVzdCBub3QgZGVjbGFyZSBvbmUsIGFuZCBsZWF2ZSB0aGUKLWNvcnJlc3BvbmRpbmcgc3RydWN0dXJlIHNsb3QgaW4gdGhlIG1vZHVsZSBpdHNlbGYgPGNvZGU+TlVMTDwvY29kZT4uPHA+Ci0KLTxoMz48YSBuYW1lPSJjb21tYW5kcyI+Q29tbWFuZCBoYW5kbGluZzwvYT48L2gzPgotCi1Ob3cgdGhhdCB3ZSBoYXZlIHRoZXNlIHN0cnVjdHVyZXMsIHdlIG5lZWQgdG8gYmUgYWJsZSB0byBmaWd1cmUgb3V0Ci1ob3cgdG8gZmlsbCB0aGVtLiAgVGhhdCBpbnZvbHZlcyBwcm9jZXNzaW5nIHRoZSBhY3R1YWwKLTxjb2RlPkFkZFR5cGU8L2NvZGU+IGFuZCA8Y29kZT5BZGRFbmNvZGluZzwvY29kZT4gY29tbWFuZHMuICBUbyBmaW5kCi1jb21tYW5kcywgdGhlIHNlcnZlciBsb29rcyBpbiB0aGUgbW9kdWxlJ3MgPGNvZGU+Y29tbWFuZCB0YWJsZTwvY29kZT4uCi1UaGF0IHRhYmxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGhvdyBtYW55IGFyZ3VtZW50cyB0aGUgY29tbWFuZHMKLXRha2UsIGFuZCBpbiB3aGF0IGZvcm1hdHMsIHdoZXJlIGl0IGlzIHBlcm1pdHRlZCwgYW5kIHNvIGZvcnRoLiAgVGhhdAotaW5mb3JtYXRpb24gaXMgc3VmZmljaWVudCB0byBhbGxvdyB0aGUgc2VydmVyIHRvIGludm9rZSBtb3N0Ci1jb21tYW5kLWhhbmRsaW5nIGZ1bmN0aW9ucyB3aXRoIHByZS1wYXJzZWQgYXJndW1lbnRzLiAgV2l0aG91dCBmdXJ0aGVyCi1hZG8sIGxldCdzIGxvb2sgYXQgdGhlIDxjb2RlPkFkZFR5cGU8L2NvZGU+IGNvbW1hbmQgaGFuZGxlciwgd2hpY2gKLWxvb2tzIGxpa2UgdGhpcyAodGhlIDxjb2RlPkFkZEVuY29kaW5nPC9jb2RlPiBjb21tYW5kIGxvb2tzIGJhc2ljYWxseQotdGhlIHNhbWUsIGFuZCB3b24ndCBiZSBzaG93biBoZXJlKToKLQotPHByZT4KLWNoYXIgKmFkZF90eXBlKGNtZF9wYXJtcyAqY21kLCBtaW1lX2Rpcl9jb25maWcgKm0sIGNoYXIgKmN0LCBjaGFyICpleHQpCi17Ci0gICAgaWYgKCpleHQgPT0gJy4nKSArK2V4dDsKLSAgICB0YWJsZV9zZXQgKG0tJmd0O2ZvcmNlZF90eXBlcywgZXh0LCBjdCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci08L3ByZT4KLQotVGhpcyBjb21tYW5kIGhhbmRsZXIgaXMgdW51c3VhbGx5IHNpbXBsZS4gIEFzIHlvdSBjYW4gc2VlLCBpdCB0YWtlcwotZm91ciBhcmd1bWVudHMsIHR3byBvZiB3aGljaCBhcmUgcHJlLXBhcnNlZCBhcmd1bWVudHMsIHRoZSB0aGlyZCBiZWluZwotdGhlIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBtb2R1bGUgaW4gcXVlc3Rpb24sCi1hbmQgdGhlIGZvdXJ0aCBiZWluZyBhIHBvaW50ZXIgdG8gYSA8Y29kZT5jbWRfcGFybXM8L2NvZGU+IHN0cnVjdHVyZS4KLVRoYXQgc3RydWN0dXJlIGNvbnRhaW5zIGEgYnVuY2ggb2YgYXJndW1lbnRzIHdoaWNoIGFyZSBmcmVxdWVudGx5IG9mCi11c2UgdG8gc29tZSwgYnV0IG5vdCBhbGwsIGNvbW1hbmRzLCBpbmNsdWRpbmcgYSByZXNvdXJjZSBwb29sIChmcm9tCi13aGljaCBtZW1vcnkgY2FuIGJlIGFsbG9jYXRlZCwgYW5kIHRvIHdoaWNoIGNsZWFudXBzIHNob3VsZCBiZSB0aWVkKSwKLWFuZCB0aGUgKHZpcnR1YWwpIHNlcnZlciBiZWluZyBjb25maWd1cmVkLCBmcm9tIHdoaWNoIHRoZSBtb2R1bGUncwotcGVyLXNlcnZlciBjb25maWd1cmF0aW9uIGRhdGEgY2FuIGJlIG9idGFpbmVkIGlmIHJlcXVpcmVkLjxwPgotCi1Bbm90aGVyIHdheSBpbiB3aGljaCB0aGlzIHBhcnRpY3VsYXIgY29tbWFuZCBoYW5kbGVyIGlzIHVudXN1YWxseQotc2ltcGxlIGlzIHRoYXQgdGhlcmUgYXJlIG5vIGVycm9yIGNvbmRpdGlvbnMgd2hpY2ggaXQgY2FuIGVuY291bnRlci4KLUlmIHRoZXJlIHdlcmUsIGl0IGNvdWxkIHJldHVybiBhbiBlcnJvciBtZXNzYWdlIGluc3RlYWQgb2YKLTxjb2RlPk5VTEw8L2NvZGU+OyB0aGlzIGNhdXNlcyBhbiBlcnJvciB0byBiZSBwcmludGVkIG91dCBvbiB0aGUKLXNlcnZlcidzIDxjb2RlPnN0ZGVycjwvY29kZT4sIGZvbGxvd2VkIGJ5IGEgcXVpY2sgZXhpdCwgaWYgaXQgaXMgaW4KLXRoZSBtYWluIGNvbmZpZyBmaWxlczsgZm9yIGEgPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBmaWxlLCB0aGUgc3ludGF4Ci1lcnJvciBpcyBsb2dnZWQgaW4gdGhlIHNlcnZlciBlcnJvciBsb2cgKGFsb25nIHdpdGggYW4gaW5kaWNhdGlvbiBvZgotd2hlcmUgaXQgY2FtZSBmcm9tKSwgYW5kIHRoZSByZXF1ZXN0IGlzIGJvdW5jZWQgd2l0aCBhIHNlcnZlciBlcnJvcgotcmVzcG9uc2UgKEhUVFAgZXJyb3Igc3RhdHVzLCBjb2RlIDUwMCkuIDxwPgotCi1UaGUgTUlNRSBtb2R1bGUncyBjb21tYW5kIHRhYmxlIGhhcyBlbnRyaWVzIGZvciB0aGVzZSBjb21tYW5kcywgd2hpY2gKLWxvb2sgbGlrZSB0aGlzOgotCi08cHJlPgotY29tbWFuZF9yZWMgbWltZV9jbWRzW10gPSB7Ci17ICJBZGRUeXBlIiwgYWRkX3R5cGUsIE5VTEwsIE9SX0ZJTEVJTkZPLCBUQUtFMiwgCi0gICAgImEgbWltZSB0eXBlIGZvbGxvd2VkIGJ5IGEgZmlsZSBleHRlbnNpb24iIH0sCi17ICJBZGRFbmNvZGluZyIsIGFkZF9lbmNvZGluZywgTlVMTCwgT1JfRklMRUlORk8sIFRBS0UyLCAKLSAgICAiYW4gZW5jb2RpbmcgKGUuZy4sIGd6aXApLCBmb2xsb3dlZCBieSBhIGZpbGUgZXh0ZW5zaW9uIiB9LAoteyBOVUxMIH0KLX07Ci08L3ByZT4KLQotVGhlIGVudHJpZXMgaW4gdGhlc2UgdGFibGVzIGFyZToKLQotPHVsPgotICA8bGk+IFRoZSBuYW1lIG9mIHRoZSBjb21tYW5kCi0gIDxsaT4gVGhlIGZ1bmN0aW9uIHdoaWNoIGhhbmRsZXMgaXQKLSAgPGxpPiBhIDxjb2RlPih2b2lkICopPC9jb2RlPiBwb2ludGVyLCB3aGljaCBpcyBwYXNzZWQgaW4gdGhlCi0gICAgICAgPGNvZGU+Y21kX3Bhcm1zPC9jb2RlPiBzdHJ1Y3R1cmUgdG8gdGhlIGNvbW1hbmQgaGFuZGxlciAtLS0KLSAgICAgICB0aGlzIGlzIHVzZWZ1bCBpbiBjYXNlIG1hbnkgc2ltaWxhciBjb21tYW5kcyBhcmUgaGFuZGxlZCBieSB0aGUKLSAgICAgICBzYW1lIGZ1bmN0aW9uLgotICA8bGk+IEEgYml0IG1hc2sgaW5kaWNhdGluZyB3aGVyZSB0aGUgY29tbWFuZCBtYXkgYXBwZWFyLiAgVGhlcmUgYXJlCi0gICAgICAgbWFzayBiaXRzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCA8Y29kZT5BbGxvd092ZXJyaWRlPC9jb2RlPgotICAgICAgIG9wdGlvbiwgYW5kIGFuIGFkZGl0aW9uYWwgbWFzayBiaXQsIDxjb2RlPlJTUkNfQ09ORjwvY29kZT4sCi0gICAgICAgaW5kaWNhdGluZyB0aGF0IHRoZSBjb21tYW5kIG1heSBhcHBlYXIgaW4gdGhlIHNlcnZlcidzIG93bgotICAgICAgIGNvbmZpZyBmaWxlcywgYnV0IDxlbT5ub3Q8L2VtPiBpbiBhbnkgPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPgotICAgICAgIGZpbGUuCi0gIDxsaT4gQSBmbGFnIGluZGljYXRpbmcgaG93IG1hbnkgYXJndW1lbnRzIHRoZSBjb21tYW5kIGhhbmRsZXIgd2FudHMKLSAgICAgICBwcmUtcGFyc2VkLCBhbmQgaG93IHRoZXkgc2hvdWxkIGJlIHBhc3NlZCBpbi4KLSAgICAgICA8Y29kZT5UQUtFMjwvY29kZT4gaW5kaWNhdGVzIHR3byBwcmUtcGFyc2VkIGFyZ3VtZW50cy4gIE90aGVyCi0gICAgICAgb3B0aW9ucyBhcmUgPGNvZGU+VEFLRTE8L2NvZGU+LCB3aGljaCBpbmRpY2F0ZXMgb25lIHByZS1wYXJzZWQKLSAgICAgICBhcmd1bWVudCwgPGNvZGU+RkxBRzwvY29kZT4sIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBhcmd1bWVudAotICAgICAgIHNob3VsZCBiZSA8Y29kZT5PbjwvY29kZT4gb3IgPGNvZGU+T2ZmPC9jb2RlPiwgYW5kIGlzIHBhc3NlZCBpbgotICAgICAgIGFzIGEgYm9vbGVhbiBmbGFnLCA8Y29kZT5SQVdfQVJHUzwvY29kZT4sIHdoaWNoIGNhdXNlcyB0aGUKLSAgICAgICBzZXJ2ZXIgdG8gZ2l2ZSB0aGUgY29tbWFuZCB0aGUgcmF3LCB1bnBhcnNlZCBhcmd1bWVudHMKLSAgICAgICAoZXZlcnl0aGluZyBidXQgdGhlIGNvbW1hbmQgbmFtZSBpdHNlbGYpLiAgVGhlcmUgaXMgYWxzbwotICAgICAgIDxjb2RlPklURVJBVEU8L2NvZGU+LCB3aGljaCBtZWFucyB0aGF0IHRoZSBoYW5kbGVyIGxvb2tzIHRoZQotICAgICAgIHNhbWUgYXMgPGNvZGU+VEFLRTE8L2NvZGU+LCBidXQgdGhhdCBpZiBtdWx0aXBsZSBhcmd1bWVudHMgYXJlCi0gICAgICAgcHJlc2VudCwgaXQgc2hvdWxkIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcywgYW5kIGZpbmFsbHkKLSAgICAgICA8Y29kZT5JVEVSQVRFMjwvY29kZT4sIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBjb21tYW5kIGhhbmRsZXIKLSAgICAgICBsb29rcyBsaWtlIGEgPGNvZGU+VEFLRTI8L2NvZGU+LCBidXQgaWYgbW9yZSBhcmd1bWVudHMgYXJlCi0gICAgICAgcHJlc2VudCwgdGhlbiBpdCBzaG91bGQgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLCBob2xkaW5nIHRoZQotICAgICAgIGZpcnN0IGFyZ3VtZW50IGNvbnN0YW50LgotICA8bGk+IEZpbmFsbHksIHdlIGhhdmUgYSBzdHJpbmcgd2hpY2ggZGVzY3JpYmVzIHRoZSBhcmd1bWVudHMgdGhhdAotICAgICAgIHNob3VsZCBiZSBwcmVzZW50LiAgSWYgdGhlIGFyZ3VtZW50cyBpbiB0aGUgYWN0dWFsIGNvbmZpZyBmaWxlCi0gICAgICAgYXJlIG5vdCBhcyByZXF1aXJlZCwgdGhpcyBzdHJpbmcgd2lsbCBiZSB1c2VkIHRvIGhlbHAgZ2l2ZSBhCi0gICAgICAgbW9yZSBzcGVjaWZpYyBlcnJvciBtZXNzYWdlLiAgKFlvdSBjYW4gc2FmZWx5IGxlYXZlIHRoaXMKLSAgICAgICA8Y29kZT5OVUxMPC9jb2RlPikuIAotPC91bD4KLQotRmluYWxseSwgaGF2aW5nIHNldCB0aGlzIGFsbCB1cCwgd2UgaGF2ZSB0byB1c2UgaXQuICBUaGlzIGlzCi11bHRpbWF0ZWx5IGRvbmUgaW4gdGhlIG1vZHVsZSdzIGhhbmRsZXJzLCBzcGVjaWZpY2FsbHkgZm9yIGl0cwotZmlsZS10eXBpbmcgaGFuZGxlciwgd2hpY2ggbG9va3MgbW9yZSBvciBsZXNzIGxpa2UgdGhpczsgbm90ZSB0aGF0IHRoZQotcGVyLWRpcmVjdG9yeSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBpcyBleHRyYWN0ZWQgZnJvbSB0aGUKLTxjb2RlPnJlcXVlc3RfcmVjPC9jb2RlPidzIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiB2ZWN0b3IgYnkgdXNpbmcKLXRoZSA8Y29kZT5nZXRfbW9kdWxlX2NvbmZpZzwvY29kZT4gZnVuY3Rpb24uCi0KLTxwcmU+Ci1pbnQgZmluZF9jdChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpbnQgaTsKLSAgICBjaGFyICpmbiA9IHBzdHJkdXAgKHItPnBvb2wsIHItPmZpbGVuYW1lKTsKLSAgICBtaW1lX2Rpcl9jb25maWcgKmNvbmYgPSAobWltZV9kaXJfY29uZmlnICopCi0gICAgICAgICAgICAgZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsICZhbXA7bWltZV9tb2R1bGUpOwotICAgIGNoYXIgKnR5cGU7Ci0KLSAgICBpZiAoU19JU0RJUihyLT5maW5mby5zdF9tb2RlKSkgewotICAgICAgICByLT5jb250ZW50X3R5cGUgPSBESVJfTUFHSUNfVFlQRTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICAKLSAgICBpZigoaT1yaW5kKGZuLCcuJykpICZsdDsgMCkgcmV0dXJuIERFQ0xJTkVEOwotICAgICsraTsKLQotICAgIGlmICgodHlwZSA9IHRhYmxlX2dldCAoY29uZi0+ZW5jb2RpbmdfdHlwZXMsICZhbXA7Zm5baV0pKSkKLSAgICB7Ci0gICAgICAgIHItPmNvbnRlbnRfZW5jb2RpbmcgPSB0eXBlOwotCi0gICAgICAgIC8qIGdvIGJhY2sgdG8gcHJldmlvdXMgZXh0ZW5zaW9uIHRvIHRyeSB0byB1c2UgaXQgYXMgYSB0eXBlICovCi0KLSAgICAgICAgZm5baS0xXSA9ICdcMCc7Ci0gICAgICAgIGlmKChpPXJpbmQoZm4sJy4nKSkgJmx0OyAwKSByZXR1cm4gT0s7Ci0gICAgICAgICsraTsKLSAgICB9Ci0KLSAgICBpZiAoKHR5cGUgPSB0YWJsZV9nZXQgKGNvbmYtPmZvcmNlZF90eXBlcywgJmFtcDtmbltpXSkpKQotICAgIHsKLSAgICAgICAgci0+Y29udGVudF90eXBlID0gdHlwZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIE9LOwotfQotCi08L3ByZT4KLQotPGgzPjxhIG5hbWU9InNlcnZjb25mIj5TaWRlIG5vdGVzIC0tLSBwZXItc2VydmVyIGNvbmZpZ3VyYXRpb24sIHZpcnR1YWwgc2VydmVycywgZXRjLjwvYT48L2gzPgotCi1UaGUgYmFzaWMgaWRlYXMgYmVoaW5kIHBlci1zZXJ2ZXIgbW9kdWxlIGNvbmZpZ3VyYXRpb24gYXJlIGJhc2ljYWxseQotdGhlIHNhbWUgYXMgdGhvc2UgZm9yIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbjsgdGhlcmUgaXMgYSBjcmVhdGlvbgotZnVuY3Rpb24gYW5kIGEgbWVyZ2UgZnVuY3Rpb24sIHRoZSBsYXR0ZXIgYmVpbmcgaW52b2tlZCB3aGVyZSBhCi12aXJ0dWFsIHNlcnZlciBoYXMgcGFydGlhbGx5IG92ZXJyaWRkZW4gdGhlIGJhc2Ugc2VydmVyIGNvbmZpZ3VyYXRpb24sCi1hbmQgYSBjb21iaW5lZCBzdHJ1Y3R1cmUgbXVzdCBiZSBjb21wdXRlZC4gIChBcyB3aXRoIHBlci1kaXJlY3RvcnkKLWNvbmZpZ3VyYXRpb24sIHRoZSBkZWZhdWx0IGlmIG5vIG1lcmdlIGZ1bmN0aW9uIGlzIHNwZWNpZmllZCwgYW5kIGEKLW1vZHVsZSBpcyBjb25maWd1cmVkIGluIHNvbWUgdmlydHVhbCBzZXJ2ZXIsIGlzIHRoYXQgdGhlIGJhc2UKLWNvbmZpZ3VyYXRpb24gaXMgc2ltcGx5IGlnbm9yZWQpLiA8cD4KLQotVGhlIG9ubHkgc3Vic3RhbnRpYWwgZGlmZmVyZW5jZSBpcyB0aGF0IHdoZW4gYSBjb21tYW5kIG5lZWRzIHRvCi1jb25maWd1cmUgdGhlIHBlci1zZXJ2ZXIgcHJpdmF0ZSBtb2R1bGUgZGF0YSwgaXQgbmVlZHMgdG8gZ28gdG8gdGhlCi08Y29kZT5jbWRfcGFybXM8L2NvZGU+IGRhdGEgdG8gZ2V0IGF0IGl0LiAgSGVyZSdzIGFuIGV4YW1wbGUsIGZyb20gdGhlCi1hbGlhcyBtb2R1bGUsIHdoaWNoIGFsc28gaW5kaWNhdGVzIGhvdyBhIHN5bnRheCBlcnJvciBjYW4gYmUgcmV0dXJuZWQKLShub3RlIHRoYXQgdGhlIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiBhcmd1bWVudCB0byB0aGUgY29tbWFuZAotaGFuZGxlciBpcyBkZWNsYXJlZCBhcyBhIGR1bW15LCBzaW5jZSB0aGUgbW9kdWxlIGRvZXNuJ3QgYWN0dWFsbHkgaGF2ZQotcGVyLWRpcmVjdG9yeSBjb25maWcgZGF0YSk6Ci0KLTxwcmU+Ci1jaGFyICphZGRfcmVkaXJlY3QoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICpmLCBjaGFyICp1cmwpCi17Ci0gICAgc2VydmVyX3JlYyAqcyA9IGNtZC0+c2VydmVyOwotICAgIGFsaWFzX3NlcnZlcl9jb25mICpjb25mID0gKGFsaWFzX3NlcnZlcl9jb25mICopCi0gICAgICAgICAgICBnZXRfbW9kdWxlX2NvbmZpZyhzLSZndDttb2R1bGVfY29uZmlnLCZhbXA7YWxpYXNfbW9kdWxlKTsKLSAgICBhbGlhc19lbnRyeSAqbmV3ID0gcHVzaF9hcnJheSAoY29uZi0mZ3Q7cmVkaXJlY3RzKTsKLQotICAgIGlmICghaXNfdXJsICh1cmwpKSByZXR1cm4gIlJlZGlyZWN0IHRvIG5vbi1VUkwiOwotICAgIAotICAgIG5ldy0mZ3Q7ZmFrZSA9IGY7IG5ldy0mZ3Q7cmVhbCA9IHVybDsKLSAgICByZXR1cm4gTlVMTDsKLX0KLTwvcHJlPgotPCEtLSVoeXBlcnRleHQgLS0+Ci08L2JvZHk+PC9odG1sPgotPCEtLS8laHlwZXJ0ZXh0IC0tPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvZGV2ZWxvcGVyL2RlYnVnZ2luZy5odG1sIGIvZG9jcy9tYW51YWwvZGV2ZWxvcGVyL2RlYnVnZ2luZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2IyMTBmLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2RldmVsb3Blci9kZWJ1Z2dpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkRlYnVnZ2luZyBNZW1vcnkgQWxsb2NhdGlvbiBpbiBBUFI8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotCi08SDEgQUxJR049IkNFTlRFUiI+RGVidWdnaW5nIE1lbW9yeSBBbGxvY2F0aW9uIGluIEFQUjxicj48L0gxPgotCi08cD5UaGUgYWxsb2NhdGlvbiBtZWNoYW5pc20ncyB3aXRoaW4gQVBSIGhhdmUgYSBudW1iZXIgb2YgZGVidWdnaW5nCi1tb2RlcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGFzc2lzdCBpbiBmaW5kaW5nIG1lbW9yeSBwcm9ibGVtcy4gIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzCi10aGUgbW9kZXMgYXZhaWxhYmxlIGFuZCBnaXZlcyBpbnN0cnVjdGlvbnMgb24gYWN0aXZhdGluZyB0aGVtLjwvcD4KLQotPHVsPgotPGxpPjxhIGhyZWY9IiNvcHRpb25zIj5BdmFpbGFibGUgZGVidWdnaW5nIG9wdGlvbnM8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjY29tYm8iPkFsbG93YWJsZSBjb21iaW5hdGlvbnM8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjaG93dG8iPkhvdyB0byBhY3RpdmF0ZSBkZWJ1Z2dpbmc8L2E+PC9saT4KLTwvdWw+Ci0KLTxocj4KLTxhIG5hbWU9Im9wdGlvbnMiPgotPGgyPkFsbG9jYXRpb24gRGVidWdnaW5nPC9oMj4KLQotPGgzPkFMTE9DX0RFQlVHPC9oMz4KLTxwPjxlbT5EZWJ1Z2dpbmcgc3VwcG9ydDogRGVmaW5lIHRoaXMgdG8gZW5hYmxlIGNvZGUgd2hpY2ggaGVscHMgZGV0ZWN0IHJlLXVzZSBvZiBmcmVlZCBtZW1vcnkgYW5kIG90aGVyIHN1Y2ggbm9uc2Vuc2UuPC9lbT48L3A+Ci0KLTxwPlRoZSB0aGVvcnkgaXMgc2ltcGxlLiAgVGhlIEZJTExfQllURSAoMHhhNSkgaXMgd3JpdHRlbiBvdmVyIGFsbCBtYWxsb2MnZCBtZW1vcnkgYXMgd2UgcmVjZWl2ZSBpdCwgYW5kIGlzIHdyaXR0ZW4gb3ZlciBldmVyeXRoaW5nIHRoYXQgd2UgZnJlZSB1cCBkdXJpbmcgYSBjbGVhcl9wb29sLiAgV2UgY2hlY2sgdGhhdCBibG9ja3Mgb24gdGhlIGZyZWUgbGlzdCBhbHdheXMgaGF2ZSB0aGUgRklMTF9CWVRFIGluIHRoZW0sIGFuZCB3ZSBjaGVjayBkdXJpbmcgcGFsbG9jKCkgdGhhdCB0aGUgYnl0ZXMgc3RpbGwgaGF2ZSBGSUxMX0JZVEUgaW4gdGhlbS4gIElmIHlvdSBldmVyIHNlZSBnYXJiYWdlIFVSTHMgb3Igd2hhdG5vdCBjb250YWluaW5nIGxvdHMgb2YgMHhhNXMgdGhlbiB5b3Uga25vdyBzb21ldGhpbmcgdXNlZCBkYXRhIHRoYXQncyBiZWVuIGZyZWVkIG9yIHVuaW5pdGlhbGl6ZWQuPC9wPgotCi08aDI+TWFsbG9jIFN1cHBvcnQ8L2gyPgotPGgzPkFMTE9DX1VTRV9NQUxMT0M8L2gzPgotPHA+PGVtPklmIGRlZmluZWQgYWxsIGFsbG9jYXRpb25zIHdpbGwgYmUgZG9uZSB3aXRoIG1hbGxvYyBhbmQgZnJlZSgpZCBhcHByb3ByaWF0ZWx5IGF0IHRoZSBlbmQuCi08L2VtPjwvcD4KLQotPHA+VGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggc29tZXRoaW5nIGxpa2UgRWxlY3RyaWMgRmVuY2Ugb3IgUHVyaWZ5IHRvIGhlbHAgZGV0ZWN0IG1lbW9yeSBwcm9ibGVtcy4gIE5vdGUgdGhhdCBpZiB5b3UncmUgdXNpbmcgZWZlbmNlIHRoZW4geW91IHNob3VsZCBhbHNvIGFkZCBpbiBBTExPQ19ERUJVRy4gIEJ1dCBkb24ndCBhZGQgaW4gQUxMT0NfREVCVUcgaWYgeW91J3JlIHVzaW5nIFB1cmlmeSBiZWNhdXNlIEFMTE9DX0RFQlVHIHdvdWxkIGhpZGUgYWxsIHRoZSB1bmluaXRpYWxpemVkIHJlYWQgZXJyb3JzIHRoYXQgUHVyaWZ5IGNhbiBkaWFnbm9zZS48L3A+Ci0KLTxoMj5Qb29sIERlYnVnZ2luZzwvaDI+Ci08aDM+UE9PTF9ERUJVRzwvaDM+Ci08cD48ZW0+VGhpcyBpcyBpbnRlbmRlZCB0byBkZXRlY3QgY2FzZXMgd2hlcmUgdGhlIHdyb25nIHBvb2wgaXMgdXNlZCB3aGVuIGFzc2lnbmluZyBkYXRhIHRvIGFuIG9iamVjdCBpbiBhbm90aGVyIHBvb2wuPC9lbT48L3A+Ci0KLTxwPkluIHBhcnRpY3VsYXIsIGl0IGNhdXNlcyB0aGUgdGFibGVfe3NldCxhZGQsbWVyZ2V9biByb3V0aW5lcyB0byBjaGVjayB0aGF0IHRoZWlyIGFyZ3VtZW50cyBhcmUgc2FmZSBmb3IgdGhlIGFwX3RhYmxlX3QgdGhleSdyZSBiZWluZyBwbGFjZWQgaW4uICBJdCBjdXJyZW50bHkgb25seSB3b3JrcyB3aXRoIHRoZSB1bml4IG11bHRpcHJvY2VzcyBtb2RlbCwgYnV0IGNvdWxkIGJlIGV4dGVuZGVkIHRvIG90aGVycy48L3A+Ci0KLTxoMj5UYWJsZSBEZWJ1Z2dpbmc8L2gyPgotPGgzPk1BS0VfVEFCTEVfUFJPRklMRTwvaDM+Ci08cD48ZW0+UHJvdmlkZSBkaWFnbm9zdGljIGluZm9ybWF0aW9uIGFib3V0IG1ha2VfdGFibGUoKSBjYWxscyB3aGljaCBhcmUgcG9zc2libHkgdG9vIHNtYWxsLjwvZW0+PC9wPgotCi08cD5UaGlzIHJlcXVpcmVzIGEgcmVjZW50IGdjYyB3aGljaCBzdXBwb3J0cyBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoKS4gIFRoZSBlcnJvcl9sb2cgb3V0cHV0IHdpbGwgYmUgYSBtZXNzYWdlIHN1Y2ggYXM6IDwvcD4KLTxwcmU+dGFibGVfcHVzaDogYXBfdGFibGVfdCBjcmVhdGVkIGJ5IDB4ODA0ZDg3NCBoaXQgbGltaXQgb2YgMTA8L3ByZT4KLTxwPlVzZSAiPGVtPjxzdHJvbmc+bCAqMHg4MDRkODc0PC9zdHJvbmc+PC9lbT4iIHRvIGZpbmQgdGhlIHNvdXJjZSB0aGF0IGNvcnJlc3BvbmRzIHRvLiAgSXQKLSBpbmRpY2F0ZXMgdGhhdCBhIGFwX3RhYmxlX3QgYWxsb2NhdGVkIGJ5IGEgY2FsbCBhdCB0aGF0IGFkZHJlc3MgaGFzIHBvc3NpYmx5IHRvbyBzbWFsbCBhbiBpbml0aWFsIGFwX3RhYmxlX3Qgc2l6ZSBndWVzcy48L3A+Ci0KLTxoMj5BbGxvY2F0aW9uIFN0YXRpc3RpY3M8L2gyPgotPGgzPkFMTE9DX1NUQVRTPC9oMz4KLTxwPjxlbT5Qcm92aWRlIHNvbWUgc3RhdGlzdGljcyBvbiB0aGUgY29zdCBvZiBhbGxvY2F0aW9ucy48L2VtPjwvcD4KLQotPHA+VGhpcyByZXF1aXJlcyBhIGJpdCBvZiBhbiB1bmRlcnN0YW5kaW5nIG9mIGhvdyBhbGxvYy5jIHdvcmtzLjwvcD4KLQotPGhyPgotCi08YSBuYW1lPSJjb21ibyI+Ci08aDI+QWxsb3dhYmxlIENvbWJpbmF0aW9uczwvaDI+Ci0KLTxwPk5vdCBhbGwgdGhlIG9wdGlvbnMgb3V0bGluZWQgYWJvdmUgY2FuIGJlIGFjdGl2YXRlZCBhdCB0aGUgc2FtZSB0aW1lLiAgdGhlIGZvbGxvd2luZyB0YWJsZSBnaXZlcyBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLQotPHAgYWxpZ249ImNlbnRlciI+Ci08dGFibGUgd2lkdGg9IjgwJSI+Ci08dHI+Ci08dGggd2lkdGg9IjI1JSI+T3B0aW9uIDE8L3RoPgotPHRoIHdpZHRoPSIxNSUiPkFMTE9DPGJyPkRFQlVHPC90aD4KLTx0aCB3aWR0aD0iMTUlIj5BTExPQzxicj5VU0U8YnI+TUFMTE9DPC90aD4KLTx0aCB3aWR0aD0iMTUlIj5QT09MPGJyPkRFQlVHPC90aD4KLTx0aCB3aWR0aD0iMTUlIj5NQUtFPGJyPlRBQkxFPGJyPlBST0ZJTEU8L3RoPgotPHRoIHdpZHRoPSIxNSUiPkFMTE9DPGJyPlNUQVRTPC90aD4KLTwvdHI+Ci08dHI+Ci08dGQ+QUxMT0NfREVCVUc8L3RkPgotPHRkIGJnY29sb3I9IiNmZjAwMDAiPiZuYnNwOzwvdGQ+Ci08dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotPHRkIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+Ci08dGQgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KLTx0ZCBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgotPC90cj4KLTx0cj4KLTx0ZD5BTExPQ19VU0U8YnI+TUFMTE9DPC90ZD4KLTx0ZCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci08dGQgYmdjb2xvcj0iI2ZmMDAwMCI+Jm5ic3A7PC90ZD4KLTx0ZCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci08dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotPHRkIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGQ+UE9PTF9ERUJVRzwvdGQ+Ci08dGQgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KLTx0ZCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci08dGQgYmdjb2xvcj0iI2ZmMDAwMCI+Jm5ic3A7PC90ZD4KLTx0ZCBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgotPHRkIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+Ci08L3RyPgotPHRyPgotPHRkPk1BS0VfVEFCTEU8YnI+UFJPRklMRTwvdGQ+Ci08dGQgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KLTx0ZCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci08dGQgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KLTx0ZCBiZ2NvbG9yPSIjZmYwMDAwIj4mbmJzcDs8L3RkPgotPHRkIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+Ci08L3RyPgotPHRyPgotPHRkPkFMTE9DX1NUQVRTPC90ZD4KLTx0ZCBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgotPHRkIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLTx0ZCBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgotPHRkIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+Ci08dGQgYmdjb2xvcj0iI2ZmMDAwMCI+Jm5ic3A7PC90ZD4KLTwvdHI+Ci0KLTwvdGFibGU+Ci0KLTxwPkFkZGl0aW9uYWxseSB0aGUgZGVidWdnaW5nIG9wdGlvbnMgYXJlIG5vdCBzdWl0YWJsZSBmb3IgbXVsdGktdGhyZWFkZWQgdmVyc2lvbnMgb2YgdGhlIHNlcnZlci4gIFdoZW4gdHJ5aW5nIHRvIGRlYnVnIHdpdGggdGhlc2Ugb3B0aW9ucyB0aGUgc2VydmVyIHNob3VsZCBiZSBzdGFydGVkIGluIHNpbmdsZSBwcm9jZXNzIG1vZGUuPC9wPgotCi08aHI+Ci0KLTxhIG5hbWU9Imhvd3RvIj4KLTxoMj5BY3RpdmF0aW5nIERlYnVnZ2luZyBPcHRpb25zPC9oMj4KLTxwPlRoZSB2YXJpb3VzIG9wdGlvbnMgZm9yIGRlYnVnZ2luZyBtZW1vcnkgYXJlIG5vdyBlbmFibGVkIGluIHRoZSBhcHJfZ2VuZXJhbC5oIGhlYWRlciBmaWxlIGluIEFQUi4gIFRoZSB2YXJpb3VzIG9wdGlvbnMgYXJlIGVuYWJsZWQgYnkgdW5jb21tZW50aW5nIHRoZSBkZWZpbmUgZm9yIHRoZSBvcHRpb24geW91IHdpc2ggdG8gdXNlLiAgVGhlIHNlY3Rpb24gb2YgdGhlIGNvZGUgY3VycmVudGx5IGxvb2tzIGxpa2UgdGhpcyA8ZW0+KGNvbnRhaW5lZCBpbiBzcmMvbGliL2Fwci9pbmNsaWRlL2Fwcl9nZW5lcmFsLmgpPC9lbT48L3A+Ci0KLTxwcmU+Ci0vKgotI2RlZmluZSBBTExPQ19ERUJVRwotI2RlZmluZSBQT09MX0RFQlVHCi0jZGVmaW5lIEFMTE9DX1VTRV9NQUxMT0MKLSNkZWZpbmUgTUFLRV9UQUJMRV9QUk9GSUxFCi0jZGVmaW5lIEFMTE9DX1NUQVRTCi0qLwotCi10eXBlZGVmIHN0cnVjdCBhcF9wb29sX3QgewotICAgIHVuaW9uIGJsb2NrX2hkciAqZmlyc3Q7Ci0gICAgdW5pb24gYmxvY2tfaGRyICpsYXN0OwotICAgIHN0cnVjdCBjbGVhbnVwICpjbGVhbnVwczsKLSAgICBzdHJ1Y3QgcHJvY2Vzc19jaGFpbiAqc3VicHJvY2Vzc2VzOwotICAgIHN0cnVjdCBhcF9wb29sX3QgKnN1Yl9wb29sczsKLSAgICBzdHJ1Y3QgYXBfcG9vbF90ICpzdWJfbmV4dDsKLSAgICBzdHJ1Y3QgYXBfcG9vbF90ICpzdWJfcHJldjsKLSAgICBzdHJ1Y3QgYXBfcG9vbF90ICpwYXJlbnQ7Ci0gICAgY2hhciAqZnJlZV9maXJzdF9hdmFpbDsKLSNpZmRlZiBBTExPQ19VU0VfTUFMTE9DCi0gICAgdm9pZCAqYWxsb2NhdGlvbl9saXN0OwotI2VuZGlmCi0jaWZkZWYgUE9PTF9ERUJVRwotICAgIHN0cnVjdCBhcF9wb29sX3QgKmpvaW5lZDsKLSNlbmRpZgotICAgIGludCAoKmFwcl9hYm9ydCkoaW50IHJldGNvZGUpOwotICAgIHN0cnVjdCBkYXRhc3RydWN0ICpwcm9nX2RhdGE7Ci19YXBfcG9vbF90OwotPC9wcmU+Ci0KLTxwPlRvIGVuYWJsZSBhbGxvY2F0aW9uIGRlYnVnZ2luZyBzaW1wbHkgbW92ZSB0aGUgI2RlZmluZSBBTExPQ19ERUJVRyBhYm92ZSB0aGUgc3RhcnQgb2YgdGhlIGNvbW1lbnRzIGJsb2NrIGFuZCByZWJ1aWxkIHRoZSBzZXJ2ZXIuPC9wPgotCi08aDM+TkIuIEluIG9yZGVyIHRvIHVzZSB0aGUgdmFyaW91cyBvcHRpb25zIHRoZSBzZXJ2ZXIgTVVTVCBiZSByZWJ1aWx0IGFmdGVyIGVkaXRpbmcgdGhlIGhlYWRlciBmaWxlLgotPC9oMz4KLQotCi08L2JvZHk+Ci08L2h0bWw+Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvZGV2ZWxvcGVyL2RvY3VtZW50aW5nLmh0bWwgYi9kb2NzL21hbnVhbC9kZXZlbG9wZXIvZG9jdW1lbnRpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY4MTYzZi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9kZXZlbG9wZXIvZG9jdW1lbnRpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+RG9jdW1lbnRpbmcgQXBhY2hlIDIuMDwvdGl0bGU+Ci08L2hlYWQ+Ci08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotCi08aDEgYWxpZ249ImNlbnRlciI+RG9jdW1lbnRhdGluZyBBcGFjaGUgMi4wPC9oMT4KLQotPHA+QXBhY2hlIDIuMCB1c2VzIERveHlHZW4gdG8gZG9jdW1lbnQgdGhlIEFQSSdzIGFuZCBnbG9iYWwgdmFyaWFibGVzIGluIHRoZQotICAgdGhlIGNvZGUuICBUaGlzIHdpbGwgZXhwbGFpbiB0aGUgYmFzaWNzIG9mIGhvdyB0byBkb2N1bWVudCB1c2luZyBEb3h5R2VuLgotCi08cD5UbyBzdGFydCBhIGRvY3VtZW50YXRpb24gYmxvY2ssIHVzZSAvKio8YnIgLz4KLSAgIFRvIGVuZCBhIGRvY3VtZW50YXRpb24gYmxvY2ssIHVzZSAqLzwvcD4KLQotPHA+SW4gdGhlIG1pZGRsZSBvZiB0aGUgYmxvY2ssIHRoZXJlIGFyZSBtdWx0aXBsZSB0YWdzIHdlIGNhbiB1c2U6PC9wPgotPHByZT4KLSAgICBEZXNjcmlwdGlvbiBvZiB0aGlzIGZ1bmN0aW9ucyBwdXJwb3NlCi0gICAgQHBhcmFtIHBhcmFtZXRlcl9uYW1lIGRlc2NyaXB0aW9uCi08L3A+Ci0KLTxwPlRoZSBkZWZmdW5jIGlzIG5vdCBhbHdheXMgbmVjZXNzYXJ5LiAgRG94eUdlbiBkb2VzIG5vdCBoYXZlIGEgZnVsbCBwYXJzZXIgCi0gICBpbiBpdCwgc28gYW55IHByb3RvdHlwZSB0aGF0IHVzZSBhIG1hY3JvIGluIHRoZSByZXR1cm4gdHlwZSBkZWNsYXJhdGlvbiAKLSAgIGlzIHRvbyBjb21wbGV4IGZvciBzY2FuZG9jLiAgVGhvc2UgZnVuY3Rpb25zIHJlcXVpcmUgYSBkZWZmdW5jLjwvcD4KLQotPHA+QW4gZXhhbXBsZSAodXNpbmcgJiZndDsgcmF0aGVyIHRoYW4gJmd0Oyk6PC9wPgotPHByZT4KLS8qKgotICogcmV0dXJuIHRoZSBmaW5hbCBlbGVtZW50IG9mIHRoZSBwYXRobmFtZQotICogQHBhcmFtIHBhdGhuYW1lIFRoZSBwYXRoIHRvIGdldCB0aGUgZmluYWwgZWxlbWVudCBvZgotICogQHJldHVybiB0aGUgZmluYWwgZWxlbWVudCBvZiB0aGUgcGF0aAotICogQHRpcCBFeGFtcGxlczoKLSAqICZsdDtwcmUmZ3Q7Ci0gKiAgICAgICAgICAgICAgICAgIi9mb28vYmFyL2d1bSIgICAtJiZndDsgImd1bSIKLSAqICAgICAgICAgICAgICAgICAiL2Zvby9iYXIvZ3VtLyIgIC0mJmd0OyAiIgotICogICAgICAgICAgICAgICAgICJndW0iICAgICAgICAgICAgLSYmZ3Q7ICJndW0iCi0gKiAgICAgICAgICAgICAgICAgIndpXFxuMzJcXHN0dWZmIiAtJiZndDsgInN0dWZmIgotICogJmx0Oy9wcmUmZ3Q7Ci0gKiBAZGVmZnVuYyBjb25zdCBjaGFyICogYXBfZmlsZW5hbWVfb2ZfcGF0aG5hbWUoY29uc3QgY2hhciAqcGF0aG5hbWUpCi0gKi8KLTwvcHJlPgotCi08cD5BdCB0aGUgdG9wIG9mIHRoZSBoZWFkZXIgZmlsZSwgYWx3YXlzIGluY2x1ZGU6PC9wPgotPHByZT4KLS8qKgotICogQHBhY2thZ2UgTmFtZSBvZiBsaWJyYXJ5IGhlYWRlcgotICovCi08L3ByZT4KLQotPHA+U2NhbkRvYyB1c2VzIGEgbmV3IGh0bWwgZmlsZSBmb3IgZWFjaCBwYWNrYWdlLiAgVGhlIGh0bWwgZmlsZXMgYXJlIG5hbWVkCi0gICB7TmFtZV9vZl9saWJyYXJ5X2hlYWRlcn0uaHRtbCwgc28gdHJ5IHRvIGJlIGNvbmNpc2Ugd2l0aCB5b3VyIG5hbWVzLjwvcD4KLSAKLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9kZXZlbG9wZXIvZmlsdGVycy5odG1sIGIvZG9jcy9tYW51YWwvZGV2ZWxvcGVyL2ZpbHRlcnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhhYzYxMC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9kZXZlbG9wZXIvZmlsdGVycy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci0gIDxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iSFRNTCBUaWR5LCBzZWUgd3d3LnczLm9yZyIgLz4KLQotICAgIDx0aXRsZT5SZXF1ZXN0IFByb2Nlc3NpbmcgaW4gQXBhY2hlIDIuMDwvdGl0bGU+Ci0gIDwvaGVhZD4KLSAgPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotCi0gIDxib2R5IGJnY29sb3I9IiNGRkZGRkYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiMwMDAwRkYiCi0gIHZsaW5rPSIjMDAwMDgwIiBhbGluaz0iI0ZGMDAwMCI+Ci0gICAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLQotICAgIDxoMT5Ib3cgZmlsdGVycyB3b3JrIGluIEFwYWNoZSAyLjA8L2gxPgotCi0gICAgPHA+V2FybmluZyAtIHRoaXMgaXMgYSBjdXQgJ24gcGFzdGUgam9iIGZyb20gYW4gZW1haWw6Ci0gICAgICAgJmx0MDIyNTAxYzFjNTI5JGY2M2E5NTUwJDdmMDAwMDBhQEtPSiZndDwvcD4KLQotPHByZT4KLVRoZXJlIGFyZSB0aHJlZSBiYXNpYyBmaWx0ZXIgdHlwZXMgKGVhY2ggb2YgdGhlc2UgaXMgYWN0dWFsbHkgYnJva2VuCi1kb3duIGludG8gdHdvIGNhdGVnb3JpZXMsIGJ1dCB0aGF0IGNvbWVzIGxhdGVyKS4KLQotQ09OTkVDVElPTjogIEZpbHRlcnMgb2YgdGhpcyB0eXBlIGFyZSB2YWxpZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoaXMKLSAgICAgICAgICAgICBjb25uZWN0aW9uLgotCi1QUk9UT0NPTDogICAgRmlsdGVycyBvZiB0aGlzIHR5cGUgYXJlIHZhbGlkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhpcwotICAgICAgICAgICAgIHJlcXVlc3QgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiB0aGUgY2xpZW50LCB0aGlzIG1lYW5zCi0gICAgICAgICAgICAgdGhhdCB0aGUgcmVxdWVzdCBpcyB2YWxpZCBmcm9tIHRoZSB0aW1lIHRoYXQgdGhlIHJlcXVlc3QKLSAgICAgICAgICAgICBpcyBzZW50IHVudGlsIHRoZSB0aW1lIHRoYXQgdGhlIHJlc3BvbnNlIGlzIHJlY2VpdmVkLgotCi1SRVNPVVJDRTogICAgRmlsdGVycyBvZiB0aGlzIHR5cGUgYXJlIHZhbGlkIGZvciB0aGUgdGltZSB0aGF0IHRoaXMKLSAgICAgICAgICAgICBjb250ZW50IGlzIHVzZWQgdG8gc2F0aXNmeSBhIHJlcXVlc3QuICBGb3Igc2ltcGxlCi0gICAgICAgICAgICAgcmVxdWVzdHMsIHRoaXMgaXMgaWRlbnRpY2FsIHRvIFBST1RPQ09MLCBidXQgaW50ZXJuYWwgcmVkaXJlY3RzCi0gICAgICAgICAgICAgYW5kIHN1Yi1yZXF1ZXN0cyBjYW4gY2hhbmdlIHRoZSBjb250ZW50IHdpdGhvdXQgZW5kaW5nCi0gICAgICAgICAgICAgdGhlIHJlcXVlc3QuCi0KLUl0IGlzIGltcG9ydGFudCB0byBtYWtlIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGEgcHJvdG9jb2wgYW5kIGEKLXJlc291cmNlIGZpbHRlci4gIEEgcmVzb3VyY2UgZmlsdGVyIGlzIHRpZWQgdG8gYSBzcGVjaWZpYyByZXNvdXJjZSwgaXQKLW1heSBhbHNvIGJlIHRpZWQgdG8gaGVhZGVyIGluZm9ybWF0aW9uLCBidXQgdGhlIG1haW4gYmluZGluZyBpcyB0byBhCi1yZXNvdXJjZS4gIElmIHlvdSBhcmUgd3JpdGluZyBhIGZpbHRlciBhbmQgeW91IHdhbnQgdG8ga25vdyBpZiBpdCBpcwotcmVzb3VyY2Ugb3IgcHJvdG9jb2wsIHRoZSBjb3JyZWN0IHF1ZXN0aW9uIHRvIGFzayBpczogICJDYW4gdGhpcyBmaWx0ZXIKLWJlIHJlbW92ZWQgaWYgdGhlIHJlcXVlc3QgaXMgcmVkaXJlY3RlZCB0byBhIGRpZmZlcmVudCByZXNvdXJjZT8iICBJZgotdGhlIGFuc3dlciBpcyB5ZXMsIHRoZW4gaXQgaXMgYSByZXNvdXJjZSBmaWx0ZXIuICBJZiBpdCBpcyBubywgdGhlbiBpdAotaXMgbW9zdCBsaWtlbHkgYSBwcm90b2NvbCBvciBjb25uZWN0aW9uIGZpbHRlci4gIEkgd29uJ3QgZ28gaW50bwotY29ubmVjdGlvbiBmaWx0ZXJzLCBiZWNhdXNlIHRoZXkgc2VlbSB0byBiZSB3ZWxsIHVuZGVyc3Rvb2QuCi0KLVdpdGggdGhpcyBkZWZpbml0aW9uLCBhIGZldyBleGFtcGxlcyBtaWdodCBoZWxwOgotQnl0ZXJhbmdlOiAgV2UgaGF2ZSBjb2RlZCBpdCB0byBiZSBpbnNlcnRlZCBmb3IgYWxsCi1yZXF1ZXN0cywgYW5kIGl0IGlzIHJlbW92ZWQgaWYgbm90IHVzZWQuICBCZWNhdXNlIHRoaXMgZmlsdGVyIGlzIGFjdGl2ZQotYXQgdGhlIGJlZ2lubmluZyBvZiBhbGwgcmVxdWVzdHMsIGl0IGNhbiBub3QgYmUgcmVtb3ZlZCBpZiBpdCBpcwotcmVkaXJlY3RlZCwgc28gdGhpcyBpcyBhIHByb3RvY29sIGZpbHRlci4KLQotaHR0cF9oZWFkZXI6ICBUaGlzIGZpbHRlciBhY3R1YWxseSB3cml0ZXMgdGhlIGhlYWRlcnMgdG8gdGhlCi1uZXR3b3JrLiAgVGhpcyBpcyBvYnZpb3VzbHkgYSByZXF1aXJlZCBmaWx0ZXIgKGV4Y2VwdCBpbiB0aGUgYXNpcyBjYXNlCi13aGljaCBpcyBzcGVjaWFsIGFuZCB3aWxsIGJlIGRlYWx0IHdpdGggYmVsb3cpIGFuZCBzbyBpdCBpcyBhIHByb3RvY29sCi1maWx0ZXIuCi0KLURlZmxhdGU6ICBUaGUgYWRtaW5pc3RyYXRvciBjb25maWd1cmVzIHRoaXMgZmlsdGVyIGJhc2VkIG9uCi13aGljaCBmaWxlIGhhcyBiZWVuIHJlcXVlc3RlZC4gIElmIHdlIGRvIGFuIGludGVybmFsIHJlZGlyZWN0IGZyb20gYW4KLWF1dG9pbmRleCBwYWdlIHRvIGFuIGluZGV4Lmh0bWwgcGFnZSwgdGhlIGRlZmxhdGUgZmlsdGVyIG1heSBiZSBhZGRlZCBvcgotcmVtb3ZlZCBiYXNlZCBvbiBjb25maWcsIHNvIHRoaXMgaXMgYSByZXNvdXJjZSBmaWx0ZXIuCi0KLVRoZSBmdXJ0aGVyIGJyZWFrZG93biBvZiBlYWNoIGNhdGVnb3J5IGludG8gdHdvIG1vcmUgZmlsdGVyIHR5cGVzIGlzCi1zdHJpY3RseSBmb3Igb3JkZXJpbmcuICBXZSBjb3VsZCByZW1vdmUgaXQsIGFuZCBvbmx5IGFsbG93IGZvciBvbmUKLWZpbHRlciB0eXBlLCBidXQgdGhlIG9yZGVyIHdvdWxkIHRlbmQgdG8gYmUgd3JvbmcsIGFuZCB3ZSB3b3VsZCBuZWVkIHRvCi1oYWNrIHRoaW5ncyB0byBtYWtlIGl0IHdvcmsuICBDdXJyZW50bHksIHRoZSBSRVNPVVJDRSBmaWx0ZXJzIG9ubHkgaGF2ZQotb25lIGZpbHRlciB0eXBlLCBidXQgdGhhdCBzaG91bGQgY2hhbmdlLgotCi1Ib3cgYXJlIGZpbHRlcnMgaW5zZXJ0ZWQ/Ci1UaGlzIGlzIGFjdHVhbGx5IHJhdGhlciBzaW1wbGUgaW4gdGhlb3J5LCBidXQgdGhlIGNvZGUgaXMKLWNvbXBsZXguICBGaXJzdCBvZiBhbGwsIGl0IGlzIGltcG9ydGFudCB0aGF0IGV2ZXJ5Ym9keSByZWFsaXplIHRoYXQKLXRoZXJlIGFyZSB0aHJlZSBmaWx0ZXIgbGlzdHMgZm9yIGVhY2ggcmVxdWVzdCwgYnV0IHRoZXkgYXJlIGFsbAotY29uY2F0ZW5hdGVkIHRvZ2V0aGVyLiAgU28sIHRoZSBmaXJzdCBsaXN0IGlzIHItPm91dHB1dF9maWx0ZXJzLCB0aGVuCi1yLT5wcm90b19vdXRwdXRfZmlsdGVycywgYW5kIGZpbmFsbHkgci0+Y29ubmVjdGlvbi0+b3V0cHV0X2ZpbHRlcnMuCi1UaGVzZSBjb3JyZXNwb25kIHRvIHRoZSBSRVNPVVJDRSwgUFJPVE9DT0wsIGFuZCBDT05ORUNUSU9OIGZpbHRlcnMKLXJlc3BlY3RpdmVseS4gIFRoZSBwcm9ibGVtIHByZXZpb3VzbHksIHdhcyB0aGF0IHdlIHVzZWQgYSBzaW5nbHkgbGlua2VkCi1saXN0IHRvIGNyZWF0ZSB0aGUgZmlsdGVyIHN0YWNrLCBhbmQgd2Ugc3RhcnRlZCBmcm9tIHRoZSAiY29ycmVjdCIKLWxvY2F0aW9uLiAgVGhpcyBtZWFucyB0aGF0IGlmIEkgaGFkIGEgUkVTT1VSQ0UgZmlsdGVyIG9uIHRoZSBzdGFjaywgYW5kCi1JIGFkZGVkIGEgQ09OTkVDVElPTiBmaWx0ZXIsIHRoZSBDT05ORUNUSU9OIGZpbHRlciB3b3VsZCBiZSBpZ25vcmVkLgotVGhpcyBzaG91bGQgbWFrZSBzZW5zZSwgYmVjYXVzZSB3ZSB3b3VsZCBpbnNlcnQgdGhlIGNvbm5lY3Rpb24gZmlsdGVyIGF0Ci10aGUgdG9wIG9mIHRoZSBjLT5vdXRwdXRfZmlsdGVycyBsaXN0LCBidXQgdGhlIGVuZCBvZiByLT5vdXRwdXRfZmlsdGVycwotcG9pbnRlZCB0byB0aGUgZmlsdGVyIHRoYXQgdXNlZCB0byBiZSBhdCB0aGUgZnJvbnQgb2YgYy0+b3V0cHV0X2ZpbHRlcnMuCi1UaGlzIGlzIG9idmlvdXNseSB3cm9uZy4gIFRoZSBuZXcgaW5zZXJ0aW9uIGNvZGUgdXNlcyBhIGRvdWJseSBsaW5rZWQKLWxpc3QuICBUaGlzIGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgd2UgbmV2ZXIgbG9zZSBhIGZpbHRlciB0aGF0IGhhcyBiZWVuCi1pbnNlcnRlZC4gIFVuZm9ydHVuYXRlbHksIGl0IGNvbWVzIHdpdGggYSBzZXBhcmF0ZSBzZXQgb2YgaGVhZGFjaGVzLgotCi1UaGUgcHJvYmxlbSBpcyB0aGF0IHdlIGhhdmUgdHdvIGRpZmZlcmVudCBjYXNlcyB3ZXJlIHdlIHVzZSBzdWJyZXF1ZXN0cy4KLVRoZSBmaXJzdCBpcyB0byBpbnNlcnQgbW9yZSBkYXRhIGludG8gYSByZXNwb25zZS4gIFRoZSBzZWNvbmQgaXMgdG8KLXJlcGxhY2UgdGhlIGV4aXN0aW5nIHJlc3BvbnNlIHdpdGggYW4gaW50ZXJuYWwgcmVkaXJlY3QuICBUaGVzZSBhcmUgdHdvCi1kaWZmZXJlbnQgY2FzZXMgYW5kIG5lZWQgdG8gYmUgdHJlYXRlZCBhcyBzdWNoLgotCi1JbiB0aGUgZmlyc3QgY2FzZSwgd2UgYXJlIGNyZWF0aW5nIHRoZSBzdWJyZXF1ZXN0IGZyb20gd2l0aGluIGEgaGFuZGxlcgotb3IgZmlsdGVyLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBuZXh0IGZpbHRlciBzaG91bGQgYmUgcGFzc2VkIHRvCi1tYWtlX3N1Yl9yZXF1ZXN0IGZ1bmN0aW9uLCBhbmQgdGhlIGxhc3QgcmVzb3VyY2UgZmlsdGVyIGluIHRoZQotc3ViLXJlcXVlc3Qgd2lsbCBwb2ludCB0byB0aGUgbmV4dCBmaWx0ZXIgaW4gdGhlIG1haW4gcmVxdWVzdC4gIFRoaXMKLW1ha2VzIHNlbnNlLCBiZWNhdXNlIHRoZSBzdWItcmVxdWVzdCdzIGRhdGEgbmVlZHMgdG8gZmxvdyB0aHJvdWdoIHRoZQotc2FtZSBzZXQgb2YgZmlsdGVycyBhcyB0aGUgbWFpbiByZXF1ZXN0LiAgQSBncmFwaGljYWwgcmVwcmVzZW50YXRpb24KLW1pZ2h0IGhlbHA6Ci0KLURlZmF1bHRfaGFuZGxlciAtLT4gaW5jbHVkZXNfZmlsdGVyIC0tPiBieXRlcmFuZ2UgLS0+IGNvbnRlbnRfbGVuZ3RoIC0+Ci1ldGMKLQotSWYgdGhlIGluY2x1ZGVzIGZpbHRlciBjcmVhdGVzIGEgc3ViIHJlcXVlc3QsIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUKLWRhdGEgZnJvbSB0aGF0IHN1Yi1yZXF1ZXN0IHRvIGdvIHRocm91Z2ggdGhlIGluY2x1ZGVzIGZpbHRlciwgYmVjYXVzZSBpdAotbWlnaHQgbm90IGJlIFNTSSBkYXRhLiAgU28sIHRoZSBzdWJyZXF1ZXN0IGFkZHMgdGhlIGZvbGxvd2luZzoKLQotRGVmYXVsdF9oYW5kbGVyIC0tPiBpbmNsdWRlc19maWx0ZXIgLS8tPiBieXRlcmFuZ2UgLS0+IGNvbnRlbnRfbGVuZ3RoIC0+IGV0YwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLwotRGVmYXVsdF9oYW5kbGVyIC0tPiBzdWJfcmVxdWVzdF9jb3JlCi0KLVdoYXQgaGFwcGVucyBpZiB0aGUgc3VicmVxdWVzdCBpcyBTU0kgZGF0YT8gIFdlbGwsIHRoYXQncyBlYXN5LCB0aGUKLWluY2x1ZGVzX2ZpbHRlciBpcyBhIHJlc291cmNlIGZpbHRlciwgc28gaXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgc3ViCi1yZXF1ZXN0IGluIGJldHdlZW4gdGhlIERlZmF1bHRfaGFuZGxlciBhbmQgdGhlIHN1Yl9yZXF1ZXN0X2NvcmUgZmlsdGVyLgotCi1UaGUgc2Vjb25kIGNhc2UgZm9yIHN1Yi1yZXF1ZXN0cyBpcyB3aGVuIG9uZSBzdWItcmVxdWVzdCBpcyBnb2luZyB0bwotYmVjb21lIHRoZSByZWFsIHJlcXVlc3QuICBUaGlzIGhhcHBlbnMgd2hlbmV2ZXIgYSBzdWItcmVxdWVzdCBpcyBjcmVhdGVkCi1vdXRzaWRlIG9mIGEgaGFuZGxlciBvciBmaWx0ZXIsIGFuZCBOVUxMIGlzIHBhc3NlZCBhcyB0aGUgbmV4dCBmaWx0ZXIgdG8KLXRoZSBtYWtlX3N1Yl9yZXF1ZXN0IGZ1bmN0aW9uLgotCi1JbiB0aGlzIGNhc2UsIHRoZSByZXNvdXJjZSBmaWx0ZXJzIG5vIGxvbmdlciBtYWtlIHNlbnNlIGZvciB0aGUgbmV3Ci1yZXF1ZXN0LCBiZWNhdXNlIHRoZSByZXNvdXJjZSBoYXMgY2hhbmdlZC4gIFNvLCBpbnN0ZWFkIG9mIHN0YXJ0aW5nIGZyb20KLXNjcmF0Y2gsIHdlIHNpbXBseSBwb2ludCB0aGUgZnJvbnQgb2YgdGhlIHJlc291cmNlIGZpbHRlcnMgZm9yIHRoZQotc3ViLXJlcXVlc3QgdG8gdGhlIGZyb250IG9mIHRoZSBwcm90b2NvbCBmaWx0ZXJzIGZvciB0aGUgb2xkIHJlcXVlc3QuCi1UaGlzIG1lYW5zIHRoYXQgd2Ugd29uJ3QgbG9zZSBhbnkgb2YgdGhlIHByb3RvY29sIGZpbHRlcnMsIG5laXRoZXIgd2lsbAotd2UgdHJ5IHRvIHNlbmQgdGhpcyBkYXRhIHRocm91Z2ggYSBmaWx0ZXIgdGhhdCBzaG91bGRuJ3Qgc2VlIGl0LgotCi1UaGUgcHJvYmxlbSBpcyB0aGF0IHdlIGFyZSB1c2luZyBhIGRvdWJseS1saW5rZWQgbGlzdCBmb3Igb3VyIGZpbHRlcgotc3RhY2tzIG5vdy4gQnV0LCB5b3Ugc2hvdWxkIG5vdGljZSB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciB0d28gbGlzdHMgdG8KLWludGVyc2VjdCBpbiB0aGlzIG1vZGVsLiAgU28sIHlvdSBkbyB5b3UgaGFuZGxlIHRoZSBwcmV2aW91cyBwb2ludGVyPwotVGhpcyBpcyBhIHZlcnkgZGlmZmljdWx0IHF1ZXN0aW9uIHRvIGFuc3dlciwgYmVjYXVzZSB0aGVyZSBpcyBubyAicmlnaHQiCi1hbnN3ZXIsIGVpdGhlciBtZXRob2QgaXMgZXF1YWxseSB2YWxpZC4gIEkgbG9va2VkIGF0IHdoeSB3ZSB1c2UgdGhlCi1wcmV2aW91cyBwb2ludGVyLiAgVGhlIG9ubHkgcmVhc29uIGZvciBpdCBpcyB0byBhbGxvdyBmb3IgZWFzaWVyCi1hZGRpdGlvbiBvZiBuZXcgc2VydmVycy4gIFdpdGggdGhhdCBiZWluZyBzYWlkLCB0aGUgc29sdXRpb24gSSBjaG9zZSB3YXMKLXRvIG1ha2UgdGhlIHByZXZpb3VzIHBvaW50ZXIgYWx3YXlzIHN0YXkgb24gdGhlIG9yaWdpbmFsIHJlcXVlc3QuCi0KLVRoaXMgY2F1c2VzIHNvbWUgbW9yZSBjb21wbGV4IGxvZ2ljLCBidXQgaXQgd29ya3MgZm9yIGFsbCBjYXNlcy4gIE15Ci1jb25jZXJuIGluIGhhdmluZyBpdCBtb3ZlIHRvIHRoZSBzdWItcmVxdWVzdCwgaXMgdGhhdCBmb3IgdGhlIG1vcmUKLWNvbW1vbiBjYXNlICh3aGVyZSBhIHN1Yi1yZXF1ZXN0IGlzIHVzZWQgdG8gYWRkIGRhdGEgdG8gYSByZXNwb25zZSksIHRoZQotbWFpbiBmaWx0ZXIgY2hhaW4gd291bGQgYmUgd3JvbmcuICBUaGF0IGRpZG4ndCBzZWVtIGxpa2UgYSBnb29kIGlkZWEgdG8KLW1lLgotCi1hc2lzOgotVGhlIGZpbmFsIHRvcGljLiAgOi0pICBNb2RfQXNpcyBpcyBhIGJpdCBvZiBhIGhhY2ssIGJ1dCB0aGUKLWhhbmRsZXIgbmVlZHMgdG8gcmVtb3ZlIGFsbCBmaWx0ZXJzIGV4Y2VwdCBmb3IgY29ubmVjdGlvbiBmaWx0ZXJzLCBhbmQKLXNlbmQgdGhlIGRhdGEuICBJZiB5b3UgYXJlIHVzaW5nIG1vZF9hc2lzLCBhbGwgb3RoZXIgYmV0cyBhcmUgb2ZmLgotCi1UaGUgYWJzb2x1dGVseSBsYXN0IHBvaW50IGlzIHRoYXQgdGhlIHJlYXNvbiB0aGlzIGNvZGUgd2FzIHNvIGhhcmQgdG8KLWdldCByaWdodCwgd2FzIGJlY2F1c2Ugd2UgaGFkIGhhY2tlZCBzbyBtdWNoIHRvIGZvcmNlIGl0IHRvIHdvcmsuICBJCi13cm90ZSBtb3N0IG9mIHRoZSBoYWNrcyBvcmlnaW5hbGx5LCBzbyBJIGFtIHZlcnkgbXVjaCB0byBibGFtZS4KLUhvd2V2ZXIsIG5vdyB0aGF0IHRoZSBjb2RlIGlzIHJpZ2h0LCBJIGhhdmUgc3RhcnRlZCB0byByZW1vdmUgc29tZQotaGFja3MuICBNb3N0IHBlb3BsZSBzaG91bGQgaGF2ZSBzZWVuIHRoYXQgdGhlIHJlc2V0X2ZpbHRlcnMgYW5kCi1hZGRfcmVxdWlyZWRfZmlsdGVycyBmdW5jdGlvbnMgYXJlIGdvbmUuICBUaG9zZSBpbnNlcnRlZCBwcm90b2NvbCBsZXZlbAotZmlsdGVycyBmb3IgZXJyb3IgY29uZGl0aW9ucywgaW4gZmFjdCwgYm90aCBmdW5jdGlvbnMgZGlkIHRoZSBzYW1lCi10aGluZywgb25lIGFmdGVyIHRoZSBvdGhlciwgaXQgd2FzIHJlYWxseSBzdHJhbmdlLiAgQmVjYXVzZSB3ZSBkb24ndAotbG9zZSBwcm90b2NvbCBmaWx0ZXJzIGZvciBlcnJvciBjYXNlcyBhbnkgbW9yZSwgdGhvc2UgaGFja3Mgd2VudCBhd2F5LgotVGhlIEhUVFBfSEVBREVSLCBDb250ZW50LWxlbmd0aCwgYW5kIEJ5dGVyYW5nZSBmaWx0ZXJzIGFyZSBhbGwgYWRkZWQgaW4KLXRoZSBpbnNlcnRfZmlsdGVycyBwaGFzZSwgYmVjYXVzZSBpZiB0aGV5IHdlcmUgYWRkZWQgZWFybGllciwgd2UgaGFkCi1zb21lIGludGVyZXN0aW5nIGludGVyYWN0aW9ucy4gIE5vdywgdGhvc2UgY291bGQgYWxsIGJlIG1vdmVkIHRvIGJlCi1pbnNlcnRlZCB3aXRoIHRoZSBIVFRQX0lOLCBDT1JFLCBhbmQgQ09SRV9JTiBmaWx0ZXJzLiAgVGhhdCB3b3VsZCBtYWtlCi10aGUgY29kZSBlYXNpZXIgdG8gZm9sbG93LgotPC9wcmU+Ci0KLSAgICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotICA8L2JvZHk+Ci08L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2RldmVsb3Blci9ob29rcy5odG1sIGIvZG9jcy9tYW51YWwvZGV2ZWxvcGVyL2hvb2tzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZjRlOGIuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvZGV2ZWxvcGVyL2hvb2tzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BcGFjaGUgMi4wIEhvb2sgRnVuY3Rpb25zPC90aXRsZT4KLTwvaGVhZD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLQotPEgxIGFsaWduPSJjZW50ZXIiPkFwYWNoZSBIb29rIEZ1bmN0aW9uczwvSDE+Ci0KLTxQPkluIGdlbmVyYWwsIGEgaG9vayBmdW5jdGlvbiBpcyBvbmUgdGhhdCBBcGFjaGUgd2lsbCBjYWxsIGF0IHNvbWUKLXBvaW50IGR1cmluZyB0aGUgcHJvY2Vzc2luZyBvZiBhIHJlcXVlc3QuIE1vZHVsZXMgY2FuIHByb3ZpZGUKLWZ1bmN0aW9ucyB0aGF0IGFyZSBjYWxsZWQsIGFuZCBzcGVjaWZ5IHdoZW4gdGhleSBnZXQgY2FsbGVkIGluCi1jb21wYXJpc29uIHRvIG90aGVyIG1vZHVsZXMuPC9QPgotCi08SDI+Q3JlYXRpbmcgYSBob29rIGZ1bmN0aW9uPC9IMj4KLQotPFA+SW4gb3JkZXIgdG8gY3JlYXRlIGEgbmV3IGhvb2ssIGZvdXIgdGhpbmdzIG5lZWQgdG8gYmUgZG9uZTo8L1A+Ci0KLTxIMz5EZWNsYXJlIHRoZSBob29rIGZ1bmN0aW9uPC9IMz4KLQotPFA+VXNlIHRoZSBERUNMQVJFX0hPT0sgbWFjcm8sIHdoaWNoIG5lZWRzIHRvIGJlIGdpdmVuIHRoZSBuYW1lIG9mIHRoZQotaG9vaywgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBob29rIGZ1bmN0aW9uIGFuZCB0aGUgYXJndW1lbnRzLiBGb3IKLWV4YW1wbGUsIGlmIHRoZSBob29rIHJldHVybnMgYW4gPFRUPmludDwvVFQ+IGFuZCB0YWtlcyBhCi08VFQ+cmVxdWVzdF9yZWMgKjwvVFQ+IGFuZCBhbiA8VFQ+aW50PC9UVD4gYW5kIGlzIGNhbGxlZAotImRvX3NvbWV0aGluZyIsIHRoZW4gZGVjbGFyZSBpdCBsaWtlIHRoaXM6PC9QPgotCi08VFQ+REVDTEFSRV9IT09LKGludCxkb19zb21ldGhpbmcsKHJlcXVlc3RfcmVjICpyLGludCBuKSk8L1RUPgotCi08UD5UaGlzIHNob3VsZCBnbyBpbiBhIGhlYWRlciB3aGljaCBtb2R1bGVzIHdpbGwgaW5jbHVkZSBpZiB0aGV5IHdhbnQKLXRvIHVzZSB0aGUgaG9vay48L1A+Ci0KLTxIMz5DcmVhdGUgdGhlIGhvb2sgc3RydWN0dXJlPC9IMz4KLQotPFA+RWFjaCBzb3VyY2UgZmlsZSB0aGF0IGV4cG9ydHMgYSBob29rIGhhcyBhIHByaXZhdGUgc3RydWN0dXJlIHdoaWNoCi1pcyB1c2VkIHRvIHJlY29yZCB0aGUgbW9kdWxlIGZ1bmN0aW9ucyB0aGF0IHVzZSB0aGUgaG9vay4gVGhpcyBpcwotZGVjbGFyZWQgYXMgZm9sbG93czo8L1A+Ci0KLTxQUkU+Ci1IT09LX1NUUlVDVCgKLSAgICAgICAgICAgIEhPT0tfTElOSyhkb19zb21ldGhpbmcpCi0gICAgICAgICAgICAuLi4KLSAgICAgICAgICAgKQotPC9QUkU+Ci0KLTxIMz5JbXBsZW1lbnQgdGhlIGhvb2sgY2FsbGVyPC9IMz4KLQotPFA+VGhlIHNvdXJjZSBmaWxlIHRoYXQgZXhwb3J0cyB0aGUgaG9vayBoYXMgdG8gaW1wbGVtZW50IGEgZnVuY3Rpb24KLXRoYXQgd2lsbCBjYWxsIHRoZSBob29rLiBUaGVyZSBhcmUgY3VycmVudGx5IHRocmVlIHBvc3NpYmxlIHdheXMgdG8gZG8KLXRoaXMuIEluIGFsbCBjYXNlcywgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaXMgY2FsbGVkCi08VFQ+YXBfcnVuXzxJPmhvb2tuYW1lPC9JPigpPC9UVD4uPC9QPgotCi08SDQ+Vm9pZCBob29rczwvSDQ+Ci0KLTxQPklmIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBob29rIGlzIDxUVD52b2lkPC9UVD4sIHRoZW4gYWxsIHRoZSBob29rcyBhcmUKLWNhbGxlZCwgYW5kIHRoZSBjYWxsZXIgaXMgaW1wbGVtZW50ZWQgbGlrZSB0aGlzOjwvUD4KLQotPFRUPklNUExFTUVOVF9IT09LX1ZPSUQoZG9fc29tZXRoaW5nLChyZXF1ZXN0X3JlYyAqcixpbnQKLW4pLChyLG4pKTwvVFQ+Ci0KLTxQPlRoZSBzZWNvbmQgYW5kIHRoaXJkIGFyZ3VtZW50cyBhcmUgdGhlIGR1bW15IGFyZ3VtZW50IGRlY2xhcmF0aW9uIGFuZAotdGhlIGR1bW15IGFyZ3VtZW50cyBhcyB0aGV5IHdpbGwgYmUgdXNlZCB3aGVuIGNhbGxpbmcgdGhlIGhvb2suIEluCi1vdGhlciB3b3JkcywgdGhpcyBtYWNybyBleHBhbmRzIHRvIHNvbWV0aGluZyBsaWtlIHRoaXM6PC9QPgotCi08UFJFPgotdm9pZCBhcF9ydW5fZG9fc29tZXRoaW5nKHJlcXVlc3RfcmVjICpyLGludCBuKQotewotICAgIC4uLgotICAgIGRvX3NvbWV0aGluZyhyLG4pOwotfQotPC9QUkU+Ci0KLTxIND5Ib29rcyB0aGF0IHJldHVybiBhIHZhbHVlPC9IND4KLQotPFA+SWYgdGhlIGhvb2sgcmV0dXJucyBhIHZhbHVlLCB0aGVuIGl0IGNhbiBlaXRoZXIgYmUgcnVuIHVudGlsIHRoZSBmaXJzdAotaG9vayB0aGF0IGRvZXMgc29tZXRoaW5nIGludGVyZXN0aW5nLCBsaWtlIHNvOjwvUD4KLQotPFRUPklNUExFTUVOVF9IT09LX1JVTl9GSVJTVChpbnQsZG9fc29tZXRoaW5nLChyZXF1ZXN0X3JlYyAqcixpbnQgbiksKHIsbiksREVDTElORUQpPC9UVD4KLQotPFA+VGhlIGZpcnN0IGhvb2sgdGhhdCA8ST5kb2Vzbid0PC9JPiByZXR1cm4gPFRUPkRFQ0xJTkVEPC9UVD4gc3RvcHMKLXRoZSBsb29wIGFuZCBpdHMgcmV0dXJuIHZhbHVlIGlzIHJldHVybmVkIGZyb20gdGhlIGhvb2sgY2FsbGVyLiBOb3RlCi10aGF0IDxUVD5ERUNMSU5FRDwvVFQ+IGlzIHRoZSB0cmFkaXRpb24gQXBhY2hlIGhvb2sgcmV0dXJuIG1lYW5pbmcgIkkKLWRpZG4ndCBkbyBhbnl0aGluZyIsIGJ1dCBpdCBjYW4gYmUgd2hhdGV2ZXIgc3VpdHMgeW91LjwvUD4KLQotPFA+QWx0ZXJuYXRpdmVseSwgYWxsIGhvb2tzIGNhbiBiZSBydW4gdW50aWwgYW4gZXJyb3Igb2NjdXJzLiBUaGlzCi1ib2lscyBkb3duIHRvIHBlcm1pdHRpbmcgPEk+dHdvPC9JPiByZXR1cm4gdmFsdWVzLCBvbmUgb2Ygd2hpY2ggbWVhbnMKLSJJIGRpZCBzb21ldGhpbmcsIGFuZCBpdCB3YXMgT0siIGFuZCB0aGUgb3RoZXIgbWVhbmluZyAiSSBkaWQKLW5vdGhpbmciLiBUaGUgZmlyc3QgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgdmFsdWUgb3RoZXIgdGhhbiBvbmUgb2YKLXRob3NlIHR3byBzdG9wcyB0aGUgbG9vcCwgYW5kIGl0cyByZXR1cm4gaXMgdGhlIHJldHVybiB2YWx1ZS4gRGVjbGFyZQotdGhlc2UgbGlrZSBzbzo8L1A+Ci0KLTxUVD5JTVBMRU1FTlRfSE9PS19SVU5fQUxMKGludCxkb19zb21ldGhpbmcsKHJlcXVlc3RfcmVjICpyLGludAotbiksKHIsbiksT0ssREVDTElORUQpPC9UVD4KLQotPFA+QWdhaW4sIDxUVD5PSzwvVFQ+IGFuZCA8VFQ+REVDTElORUQ8L1RUPiBhcmUgdGhlIHRyYWRpdGlvbmFsCi12YWx1ZXMuIFlvdSBjYW4gdXNlIHdoYXQgeW91IHdhbnQuPC9QPgotCi08SDM+Q2FsbCB0aGUgaG9vayBjYWxsZXJzPC9IMz4KLQotPFA+QXQgYXBwcm9wcmlhdGUgbW9tZW50cyBpbiB0aGUgY29kZSwgY2FsbCB0aGUgaG9vayBjYWxsZXIsIGxpa2UKLXNvOjwvUD4KLQotPFBSRT4KLSAgICBpbnQgbixyZXQ7Ci0gICAgcmVxdWVzdF9yZWMgKnI7Ci0KLSAgICByZXQ9YXBfcnVuX2RvX3NvbWV0aGluZyhyLG4pOwotPC9QUkU+Ci0KLTxIMj5Ib29raW5nIHRoZSBob29rPC9IMj4KLQotPFA+QSBtb2R1bGUgdGhhdCB3YW50cyBhIGhvb2sgdG8gYmUgY2FsbGVkIG5lZWRzIHRvIGRvIHR3bwotdGhpbmdzLjwvUD4KLQotPEgzPkltcGxlbWVudCB0aGUgaG9vayBmdW5jdGlvbjwvSDM+Ci0KLTxQPkluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlIGhlYWRlciwgYW5kIGRlZmluZSBhIHN0YXRpYyBmdW5jdGlvbiBvZiB0aGUKLWNvcnJlY3QgdHlwZTo8L1A+Ci0KLTxQUkU+Ci1zdGF0aWMgaW50IG15X3NvbWV0aGluZ19kb2VyKHJlcXVlc3RfcmVjICpyLGludCBuKQotewotICAgIC4uLgotICAgIHJldHVybiBPSzsKLX0KLTwvUFJFPgotCi08SDM+QWRkIGEgaG9vayByZWdpc3RlcmluZyBmdW5jdGlvbjwvSDM+Ci0KLTxQPkR1cmluZyBpbml0aWFsaXNhdGlvbiwgQXBhY2hlIHdpbGwgY2FsbCBlYWNoIG1vZHVsZXMgaG9vawotcmVnaXN0ZXJpbmcgZnVuY3Rpb24sIHdoaWNoIGlzIGluY2x1ZGVkIGluIHRoZSBtb2R1bGUgc3RydWN0dXJlOjwvUD4KLQotPFBSRT4KLXN0YXRpYyB2b2lkIG15X3JlZ2lzdGVyX2hvb2tzKCkKLXsKLSAgICBhcF9ob29rX2RvX3NvbWV0aGluZyhteV9zb21ldGhpbmdfZG9lcixOVUxMLE5VTEwsSE9PS19NSURETEUpOwotfQotCi1tb2RlIE1PRFVMRV9WQVJfRVhQT1JUIG15X21vZHVsZSA9Ci17Ci0gICAgLi4uCi0gICAgbXlfcmVnaXN0ZXJfaG9va3MgICAgICAgLyogcmVnaXN0ZXIgaG9va3MgKi8KLX07Ci08L1BSRT4KLQotPEgzPkNvbnRyb2xsaW5nIGhvb2sgY2FsbGluZyBvcmRlcjwvSDM+Ci0KLTxQPkluIHRoZSBleGFtcGxlIGFib3ZlLCB3ZSBkaWRuJ3QgdXNlIHRoZSB0aHJlZSBhcmd1bWVudHMgaW4gdGhlIGhvb2sKLXJlZ2lzdHJhdGlvbiBmdW5jdGlvbiB0aGF0IGNvbnRyb2wgY2FsbGluZyBvcmRlci4gVGhlcmUgYXJlIHR3bwotbWVjaGFuaXNtcyBmb3IgZG9pbmcgdGhpcy4gVGhlIGZpcnN0LCByYXRoZXIgY3J1ZGUsIG1ldGhvZCwgYWxsb3dzIHVzCi10byBzcGVjaWZ5IHJvdWdobHkgd2hlcmUgdGhlIGhvb2sgaXMgcnVuIHJlbGF0aXZlIHRvIG90aGVyCi1tb2R1bGVzLiBUaGUgZmluYWwgYXJndW1lbnQgY29udHJvbCB0aGlzLiBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUKLXZhbHVlczo8L1A+Ci0KLTxQUkU+Ci1IT09LX0ZJUlNUCi1IT09LX01JRERMRQotSE9PS19MQVNUCi08L1BSRT4KLQotPFA+QWxsIG1vZHVsZXMgdXNpbmcgYW55IHBhcnRpY3VsYXIgdmFsdWUgbWF5IGJlIHJ1biBpbiBhbnkgb3JkZXIKLXJlbGF0aXZlIHRvIGVhY2ggb3RoZXIsIGJ1dCwgb2YgY291cnNlLCBhbGwgbW9kdWxlcyB1c2luZwotPFRUPkhPT0tfRklSU1Q8L1RUPiB3aWxsIGJlIHJ1biBiZWZvcmUgPFRUPkhPT0tfTUlERExFPC9UVD4gd2hpY2ggYXJlCi1iZWZvcmUgPFRUPkhPT0tfTEFTVDwvVFQ+LiBNb2R1bGVzIHRoYXQgZG9uJ3QgY2FyZSB3aGVuIHRoZXkgYXJlIHJ1bgotc2hvdWxkIHVzZSA8VFQ+SE9PS19NSURETEU8L1RUPi4gPEk+KEkgc3BhY2VkIHRoZXNlIG91dCBzbyBwZW9wbGUKLWNvdWxkIGRvIHN0dWZmIGxpa2UgPFRUPkhPT0tfRklSU1QtMjwvVFQ+IHRvIGdldCBpbiBzbGlnaHRseSBlYXJsaWVyLAotYnV0IGlzIHRoaXMgd2lzZT8gLSBCZW4pPC9JPjwvUD4KLQotPFA+Tm90ZSB0aGF0IHRoZXJlIGFyZSB0d28gbW9yZSB2YWx1ZXMsIDxUVD5IT09LX1JFQUxMWV9GSVJTVDwvVFQ+IGFuZAotPFRUPkhPT0tfUkVBTExZX0xBU1Q8L1RUPi4gVGhlc2Ugc2hvdWxkIG9ubHkgYmUgdXNlZCBieSB0aGUgaG9vawotZXhwb3J0ZXIuPC9QPgotCi08UD5UaGUgb3RoZXIgbWV0aG9kIGFsbG93cyBmaW5lciBjb250cm9sLiBXaGVuIGEgbW9kdWxlIGtub3dzIHRoYXQgaXQKLW11c3QgYmUgcnVuIGJlZm9yZSAob3IgYWZ0ZXIpIHNvbWUgb3RoZXIgbW9kdWxlcywgaXQgY2FuIHNwZWNpZnkgdGhlbQotYnkgbmFtZS4gVGhlIHNlY29uZCAodGhpcmQpIGFyZ3VtZW50IGlzIGEgTlVMTC10ZXJtaW5hdGVkIGFycmF5IG9mCi1zdHJpbmdzIGNvbnNpc3Rpbmcgb2YgdGhlIG5hbWVzIG9mIG1vZHVsZXMgdGhhdCBtdXN0IGJlIHJ1biBiZWZvcmUKLShhZnRlcikgdGhlIGN1cnJlbnQgbW9kdWxlLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB3ZSB3YW50ICJtb2RfeHl6LmMiCi1hbmQgIm1vZF9hYmMuYyIgdG8gcnVuIGJlZm9yZSB3ZSBkbywgdGhlbiB3ZSdkIGhvb2sgYXMgZm9sbG93czo8L1A+Ci0KLTxQUkU+Ci1zdGF0aWMgdm9pZCByZWdpc3Rlcl9ob29rcygpCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhc3pQcmVbXT17ICJtb2RfeHl6LmMiLCAibW9kX2FiYy5jIiwgTlVMTCB9OwotCi0gICAgYXBfaG9va19kb19zb21ldGhpbmcobXlfc29tZXRoaW5nX2RvZXIsYXN6UHJlLE5VTEwsSE9PS19NSURETEUpOwotfQotPC9QUkU+Ci0KLTxQPk5vdGUgdGhhdCB0aGUgc29ydCB1c2VkIHRvIGFjaGlldmUgdGhpcyBpcyBzdGFibGUsIHNvIG9yZGVyaW5nIHNldAotYnkgPFRUPkhPT0tfPEk+T1JERVI8L0k+PC9UVD4gaXMgcHJlc2VydmVkLCBhcyBmYXIgYXMgaXMKLXBvc3NpYmxlLjwvUD4KLQotPEk+QmVuIExhdXJpZSwgMTV0aCBBdWd1c3QgMTk5OTwvST4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2RldmVsb3Blci9pbmRleC5odG1sIGIvZG9jcy9tYW51YWwvZGV2ZWxvcGVyL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MmRkNDQuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvZGV2ZWxvcGVyL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFwYWNoZS0yLjAgRGV2ZWxvcGVyIERvY3VtZW50YXRpb248L3RpdGxlPgotPC9oZWFkPgotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTxoMiBhbGlnbj0iY2VudGVyIj5EZXZlbG9wZXIgRG9jdW1lbnRhdGlvbiBmb3IgQXBhY2hlLTIuMDwvaDI+Ci08cD48YSBocmVmPSJob29rcy5odG1sIj5BcGFjaGUgSG9vayBGdW5jdGlvbnM8L2E+PC9wPgotPHA+PGEgaHJlZj0ibW9kdWxlcy5odG1sIj5Db252ZXJ0aW5nIEFwYWNoZSAxLjMgTW9kdWxlcyB0byBBcGFjaGUgMi4wPC9hPjwvcD4KLTxwPjxhIGhyZWY9Ii4uL3VzZXIvbXBtLmh0bWwiPk1QTSBsaXN0aW5nPC9hPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2RldmVsb3Blci9tb2R1bGVzLmh0bWwgYi9kb2NzL21hbnVhbC9kZXZlbG9wZXIvbW9kdWxlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDY2MjIzLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2RldmVsb3Blci9tb2R1bGVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5Db252ZXJ0aW5nIE1vZHVsZXMgZnJvbSBBcGFjaGUgMS4zIHRvIEFwYWNoZSAyLjA8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotCi08SDEgQUxJR049IkNFTlRFUiI+RnJvbSBBcGFjaGUgMS4zIHRvIEFwYWNoZSAyLjA8YnI+TW9kdWxlczwvSDE+Ci0KLTxwPgotVGhpcyBpcyBhIGZpcnN0IGF0dGVtcHQgYXQgd3JpdGluZyB0aGUgbGVzc29ucyBJIGxlYXJuZWQgd2hlbiB0cnlpbmcgdG8gY29udmVydCB0aGUgbW9kX21tYXBfc3RhdGljIG1vZHVsZSB0byBBcGFjaGUgMi4wLiAgSXQncyBieSBubyBtZWFucyBkZWZpbml0aXZlIGFuZCBwcm9iYWJseSB3b24ndCBldmVuIGJlIGNvcnJlY3QgaW4gc29tZSB3YXlzLCBidXQgaXQncyBhIHN0YXJ0LgotPC9wPgotPGhyPgotPGgyPlRoZSBlYXNpZXIgY2hhbmdlcy4uLgotPC9oMj4KLQotPGgzPkNsZWFudXAgUm91dGluZXM8L2gzPgotPHA+Ci1UaGVzZSBub3cgbmVlZCB0byBiZSBvZiB0eXBlIGFwX3N0YXR1c190IGFuZCByZXR1cm4gYSB2YWx1ZSBvZiB0aGF0IHR5cGUuICBOb3JtYWxseSB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgQVBSX1NVQ0NFU1MgdW5sZXNzIHRoZXJlIGlzIHNvbWUgbmVlZCB0byBzaWduYWwgYW4gZXJyb3IgaW4gdGhlIGNsZWFudXAuICBCZSBhd2FyZSB0aGF0IGV2ZW4gdGhvdWdoIHlvdSBzaWduYWwgYW4gZXJyb3Igbm90IGFsbCBjb2RlIHlldCBjaGVja3MgYW5kIGFjdHMgdXBvbiB0aGUgZXJyb3IuCi08L3A+Ci0KLTxoMz5Jbml0aWFsaXNhdGlvbiBSb3V0aW5lczwvaDM+Ci0KLTxwPgotVGhlc2Ugc2hvdWxkIG5vdyBiZSByZW5hbWVkIHRvIGJldHRlciBzaWduaWZ5IHdoZXJlIHRoZXkgc2l0IGluIHRoZSBvdmVyYWxsIHByb2Nlc3MuICBTbyB0aGUgbmFtZSBnZXRzIGEgc21hbGwgY2hhbmdlIGZyb20gbW1hcF9pbml0IHRvIG1tYXBfcG9zdF9jb25maWcuICBUaGUgYXJndW1lbnRzIHBhc3NlZCBoYXZlIHVuZGVyZ29uZSBhIHJhZGljYWwgY2hhbmdlIGFuZCBub3cgbG9vayBsaWtlCi08L3A+Ci08dWwgc3R5bGU9Imxpc3Qtc3R5bGU6bm9uZSI+Ci08bGk+YXBfY29udGV4dF90ICpwLDwvbGk+Ci08bGk+YXBfY29udGV4dF90ICpwbG9nLDwvbGk+Ci08bGk+YXBfY29udGV4dF90ICpwdGVtcCw8L2xpPgotPGxpPnNlcnZlcl9yZWMgKnM8L2xpPgotPC91bD4KLTxwPgotVGhyb3VnaG91dCBBcGFjaGUgdGhlIG9sZCBwb29scyBoYXZlIGJlZW4gcmVwbGNlZCBieSB0aGUgYXBfY29udGV4dF90LCB0aG91Z2ggdGhlaXIgdXNlIHJlbWFpbnMgcmVtYXJrYWJseSBzaW1pbGFyLgotPC9wPgotCi08aDM+RGF0YSBUeXBlczwvaDM+Ci08cD4KLUEgbG90IG9mIHRoZSBkYXRhIHR5cGVzIGhhdmUgYmVlbiBtb3ZlZCBpbnRvIHRoZSBBUFIuICBUaGlzIG1lYW5zIHRoYXQgc29tZSBoYXZlIGhhZCBhIG5hbWUgY2hhbmdlLCBzdWNoIGFzIHRoZSBvbmUgc2hvd24gYWJvdmUuICBUaGUgZm9sbG93aW5nIGlzIGEgYnJpZWYgbGlzdCBvZiBzb21lIG9mIHRoZSBjaGFuZ2VzIHRoYXQgeW91IGFyZSBsaWtlbHkgdG8gaGF2ZSB0byBtYWtlLgotPHVsIHN0eWxlPSJsaXN0LXN0eWxlOm5vbmUiPgotPGxpPnBvb2wgYmVjb21lcyBhcF9jb250ZXh0X3Q8L2xpPgotPGxpPnRhYmxlIGJlY29tZXMgYXBfdGFibGVfdDwvbGk+Ci08L3VsPgotPGhyPgotCi08aDI+Ci1UaGUgPGVtPm1lc3NpZXI8L2VtPiBjaGFuZ2VzLi4uCi08L2gyPgotPGgzPlJlZ2lzdGVyIEhvb2tzPC9oMz4KLTxwPgotVGhlIG5ldyBhcmNoaXRlY3R1cmUgdXNlcyBhIHNlcmllcyBvZiBob29rcyB0byBwcm92aWRlIGZvciBjYWxsaW5nIHlvdXIgZnVuY3Rpb25zLiAgVGhlc2UgeW91J2xsIG5lZWQgdG8gYWRkIHRvIHlvdXIgbW9kdWxlIGJ5IHdheSBvZiBhIG5ldyBmdW5jdGlvbiwgc3RhdGljIHZvaWQgcmVnaXN0ZXJfaG9va3Modm9pZCkuICBUaGUgZnVuY3Rpb24gaXMgcmVhbGx5IHJlYXNvbmFibHkgc3RyYWlnaHRmb3J3YXJkIG9uY2UgeW91IHVuZGVyc3RhbmQgd2hhdCBuZWVkcyB0byBiZSBkb25lLiAgRWFjaCBmdW5jdGlvbiB0aGF0IG5lZWRzIGNhbGxpbmcgYXQgc29tZSBzdGFnZSBpbiB0aGUgcHJvY2Vzc2luZyBvZiBhIHJlcXVlc3QgbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCwgaGFuZGxlcnMgZG8gbm90LiAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHBoYXNlcyB3aGVyZSBmdW5jdGlvbnMgY2FuIGJlIGFkZGVkLCBhbmQgZm9yIGVhY2ggeW91IGNhbiBzcGVjaWZ5IHdpdGggYSBoaWdoIGRlZ3JlZSBvZiBjb250cm9sIHRoZSByZWxhdGl2ZSBvcmRlciB0aGF0IHRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBpbi4KLTwvcD4KLTxwPgotVGhpcyBpcyB0aGUgY29kZSB0aGF0IHdhcyBhZGRlZCB0byBtb2RfbW1hcF9zdGF0aWMKLTwvcD4KLTxwcmU+Ci1zdGF0aWMgdm9pZCByZWdpc3Rlcl9ob29rcyh2b2lkKQotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXN6UHJlW109eyAiaHR0cF9jb3JlLmMiLE5VTEwgfTsKLSAgICBhcF9ob29rX3Bvc3RfY29uZmlnKG1tYXBfcG9zdF9jb25maWcsTlVMTCxOVUxMLEhPT0tfTUlERExFKTsKLSAgICBhcF9ob29rX3RyYW5zbGF0ZV9uYW1lKG1tYXBfc3RhdGljX3hsYXQsYXN6UHJlLE5VTEwsSE9PS19MQVNUKTsKLX07Ci08L3ByZT4KLTxwPgotVGhpcyByZWdpc3RlcnMgMiBmdW5jdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGNhbGxlZCwgb25lIGluIHRoZSBwb3N0X2NvbmZpZyBzdGFnZSAodmlydHVhbGx5IGV2ZXJ5IG1vZHVsZSB3aWxsIG5lZWQgdGhpcyBvbmUpIGFuZCBvbmUgZm9yIHRoZSB0cmFuc2xhdGVfbmFtZSBwaGFzZS4gIG5vdGUgdGhhdCB3aGlsZSB0aGVyZSBhcmUgZGlmZmVyZW50IGZ1bmN0aW9uIG5hbWVzIHRoZSBmb3JtYXQgb2YgZWFjaCBpcyBpZGVudGljYWwuICBTbyB3aGF0IGlzIHRoZSBmb3JtYXQ/Ci08L3A+Ci08cD48c3Ryb25nPgotYXBfaG9va19bcGhhc2VfbmFtZV0oZnVuY3Rpb25fbmFtZSwgcHJlZGVjZXNzb3JzLCBzdWNjZXNzb3JzLCBwb3NpdGlvbik7Ci08L3N0cm9uZz48L3A+Ci08cD4KLVRoZXJlIGFyZSAzIGhvb2sgcG9zaXRpb25zIGRlZmluZWQuLi4KLTwvcD4KLTx1bCBzdHlsZT0ibGlzdC1zdHlsZTpub25lIj4KLTxsaT5IT09LX0ZJUlNUPC9saT4KLTxsaT5IT09LX01JRERMRTwvbGk+Ci08bGk+SE9PS19MQVNUPC9saT4KLTwvdWw+Ci08cD4KLVRvIGRlZmluZSB0aGUgcG9zaXRpb24geW91IHVzZSB0aGUgcG9zaXRpb24gYW5kIHRoZW4gbW9kaWZ5IGl0IHdpdGggdGhlIHByZWRlY2Vzc29ycyBhbmQgc3VjY2Vzc29ycy4gIGVhY2ggb2YgdGhlIG1vZGlmaWVycyBjYW4gYmUgYSBsaXN0IG9mIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBjYWxsZWQsIGVpdGhlciBiZWZvcmUgdGhlIGZ1bmN0aW9uIGlzIHJ1biAocHJlZGVjZXNzb3JzKSBvciBhZnRlciB0aGUgZnVuY3Rpb24gaGFzIHJ1biAoc3VjY2Vzc29ycykuCi08L3A+Ci08cD4KLUluIHRoZSBtb2RfbW1hcF9zdGF0aWMgY2FzZSBJIGRpZG4ndCBjYXJlIGFib3V0IHRoZSBwb3N0X2NvbmZpZyBzdGFnZSwgYnV0IHRoZSBtbWFwX3N0YXRpY194bGF0IE1VU1QgYmUgY2FsbGVkIGFmdGVyIHRoZSBjb3JlIG1vZHVsZSBoYWQgZG9uZSBpdCdzIG5hbWUgdHJhbnNsYXRpb24sIGhlbmNlIHRoZSB1c2Ugb2YgdGhlIGFzelByZSB0byBkZWZpbmUgYSBtb2RpZmllciB0byB0aGUgcG9zaXRpb24gSE9PS19MQVNULgotPC9wPgotPGgzPk1vZHVsZSBEZWZpbml0aW9uPC9oMz4KLQotPHA+Ci1UaGVyZSBhcmUgbm93IGEgbG90IGZld2VyIHN0YWdlcyB0byB3b3JyeSBhYm91dCB3aGVuIGNyZWF0aW5nIHlvdXIgbW9kdWxlIGRlZmluaXRpb24uICBUaGUgb2xkIGRlZmludGlvbiBsb29rZWQgbGlrZQotPC9wPgotPHByZT4KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBbbW9kdWxlX25hbWVdX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkRfTU9EVUxFX1NUVUZGLAotICAgIC8qIGluaXRpYWxpemVyICovCi0gICAgLyogZGlyIGNvbmZpZyBjcmVhdGVyICovCi0gICAgLyogZGlyIG1lcmdlciAtLS0gZGVmYXVsdCBpcyB0byBvdmVycmlkZSAqLwotICAgIC8qIHNlcnZlciBjb25maWcgKi8KLSAgICAvKiBtZXJnZSBzZXJ2ZXIgY29uZmlnICovCi0gICAgLyogY29tbWFuZCBoYW5kbGVycyAqLwotICAgIC8qIGhhbmRsZXJzICovCi0gICAgLyogZmlsZW5hbWUgdHJhbnNsYXRpb24gKi8KLSAgICAvKiBjaGVja191c2VyX2lkICovCi0gICAgLyogY2hlY2sgYXV0aCAqLwotICAgIC8qIGNoZWNrIGFjY2VzcyAqLwotICAgIC8qIHR5cGVfY2hlY2tlciAqLwotICAgIC8qIGZpeHVwcyAqLwotICAgIC8qIGxvZ2dlciAqLwotICAgIC8qIGhlYWRlciBwYXJzZXIgKi8KLSAgICAvKiBjaGlsZF9pbml0ICovCi0gICAgLyogY2hpbGRfZXhpdCAqLwotICAgIC8qIHBvc3QgcmVhZC1yZXF1ZXN0ICovCi19OwotPC9wcmU+Ci08cD4KLVRoZSBuZXcgc3RydWN0dXJlIGlzIGEgZ3JlYXQgZGVhbCBzaW1wbGVyLi4uCi08L3A+Ci08cHJlPgotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIFttb2R1bGVfbmFtZV1fbW9kdWxlID0KLXsKLSAgICBTVEFOREFSRDIwX01PRFVMRV9TVFVGRiwKLSAgICAvKiBjcmVhdGUgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIC8qIG1lcmdlIHBlci1kaXJlY3RvcnkgY29uZmlnIHN0cnVjdHVyZXMgICovCi0gICAgLyogY3JlYXRlIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZXMgICAgKi8KLSAgICAvKiBtZXJnZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmVzICAgICAqLwotICAgIC8qIGNvbW1hbmQgaGFuZGxlcnMgKi8KLSAgICAvKiBoYW5kbGVycyAqLwotICAgIC8qIHJlZ2lzdGVyIGhvb2tzICovCi0gfTsKLTwvcHJlPgotPHA+Ci1Tb21lIG9mIHRoZXNlIHJlYWQgZGlyZWN0bHkgYWNyb3NzLCBzb21lIGRvbid0LiAgSSdsbCB0cnkgdG8gc3VtbWFyaXNlIHdoYXQgc2hvdWxkIGJlIGRvbmUgYmVsb3cuCi08L3A+Ci08cD4KLVRoZSBzdGFnZXMgdGhhdCByZWFkIGRpcmVjdGx5IGFjcm9zcyA6Ci08L3A+Ci08dWwgc3R5bGU9Imxpc3Qtc3R5bGU6bm9uZSI+Ci08bGk+Ci0vKiBkaXIgY29uZmlnIGNyZWF0ZXIgKi8gPT0+IC8qIGNyZWF0ZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmVzICovCi08L2xpPgotPGxpPgotLyogc2VydmVyIGNvbmZpZyAqLyA9PT4gLyogY3JlYXRlIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZXMgICAgKi8KLTwvbGk+Ci08bGk+Ci0vKiBkaXIgbWVyZ2VyICovID09PiAvKiBtZXJnZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmVzICAqLwotPC9saT4KLTxsaT4KLS8qIG1lcmdlIHNlcnZlciBjb25maWcgKi8gPT0+IC8qIG1lcmdlIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZXMgICAgICovCi08L2xpPgotPGxpPgotLyogY29tbWFuZCB0YWJsZSAqLyA9PT4gLyogY29tbWFuZCBhcF90YWJsZV90ICovCi08L2xpPgotPGxpPgotLyogaGFuZGxlcnMgKi8gPT0+IC8qIGhhbmRsZXJzICovCi08L2xpPgotPC91bD4KLTxQPgotVGhlIHJlbWFpbmRlciBvZiB0aGUgb2xkIGZ1bmN0aW9ucyBzaG91bGQgYmUgcmVnaXN0ZXJlZCBhcyBob29rcy4gIFRoZXJlIGFyZSB0aGUgZm9sbG93aW5nIGhvb2sgc3RhZ2VzIGRlZmluZWQgc28gZmFyLi4uCi08L1A+Ci0KLTx1bCBzdHlsZT0ibGlzdC1zdHlsZTpub25lIj4KLTxsaT4KLWFwX2hvb2tfcG9zdF9jb25maWcgIDxlbT4odGhpcyBpcyB3aGVyZSB0aGUgb2xkIF9pbml0IHJvdXRpbmVzIGdldCByZWdpc3RlcmVkKTwvZW0+Ci08L2xpPgotPGxpPgotYXBfaG9va19odHRwX21ldGhvZAotPC9saT4KLTxsaT4KLWFwX2hvb2tfb3Blbl9sb2dzCi08L2xpPgotPGxpPgotYXBfaG9va19hdXRoX2NoZWNrZXIKLTwvbGk+Ci08bGk+Ci1hcF9ob29rX2RlZmF1bHRfcG9ydAotPC9saT4KLTxsaT4KLWFwX2hvb2tfYWNjZXNzX2NoZWNrZXIKLTwvbGk+Ci08bGk+Ci1hcF9ob29rX3Byb2Nlc3NfY29ubmVjdGlvbgotPC9saT4KLTxsaT4KLWFwX2hvb2tfY2hpbGRfaW5pdF9ob29rCi08L2xpPgotCi0KLTwvYm9keT4KLTwvaHRtbD4KLQotCi0KLQotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9kZXZlbG9wZXIvbW9kdWxlcy5odG1sLmVuIGIvZG9jcy9tYW51YWwvZGV2ZWxvcGVyL21vZHVsZXMuaHRtbC5lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2NjIyMy4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9kZXZlbG9wZXIvbW9kdWxlcy5odG1sLmVuCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+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+Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvZGV2ZWxvcGVyL3JlcXVlc3QuaHRtbCBiL2RvY3MvbWFudWFsL2RldmVsb3Blci9yZXF1ZXN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZWNjOTMuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvZGV2ZWxvcGVyL3JlcXVlc3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPlJlcXVlc3QgUHJvY2Vzc2luZyBpbiBBcGFjaGUgMi4wPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLQotPGgxPlJlcXVlc3QgUHJvY2Vzc2luZyBpbiBBcGFjaGUgMi4wPC9oMT4KLQotPHA+V2FybmluZyAtIHRoaXMgaXMgYSBmaXJzdCAoZmFzdCkgZHJhZnQgdGhhdCBuZWVkcyBmdXJ0aGVyIHJldmlzaW9uITwvcD4KLQotPHA+U2V2ZXJhbCBjaGFuZ2VzIGluIEFwYWNoZSAyLjAgYWZmZWN0IHRoZSBpbnRlcm5hbCByZXF1ZXN0IHByb2Nlc3NpbmcKLSAgIG1lY2hhbmljcy4gIE1vZHVsZSBhdXRob3JzIG5lZWQgdG8gYmUgYXdhcmUgb2YgdGhlc2UgY2hhbmdlcyBzbyB0aGV5Ci0gICBtYXkgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIG9wdGltaXphdGlvbnMgYW5kIHNlY3VyaXR5IGVuaGFuY2VtZW50cy48L3A+Ci0KLTxwPlRoZSBmaXJzdCBtYWpvciBjaGFuZ2UgaXMgdG8gdGhlIHN1YnJlcXVlc3QgYW5kIHJlZGlyZWN0IG1lY2hhbmlzbXMuCi0gICBUaGVyZSB3ZXJlIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBjb2RlIHBhdGhzIGluIEFwYWNoZSAxLjMgdG8gYXR0ZW1wdAotICAgdG8gb3B0aW1pemUgc3VicmVxdWVzdCBvciByZWRpcmVjdCBiZWhhdmlvci4gIEFzIHBhdGNoZXMgd2VyZSBpbnRyb2R1Y2VkCi0gICB0byAyLjAsIHRoZXNlIG9wdGltaXphdGlvbnMgKGFuZCB0aGUgc2VydmVyIGJlaGF2aW9yKSB3ZXJlIHF1aWNrbHkgYnJva2VuCi0gICBkdWUgdG8gdGhpcyBkdXBsaWNhdGlvbiBvZiBjb2RlLiAgQWxsIGR1cGxpY2F0ZSBjb2RlIGhhcyBiZWVuIGZvbGRlZAotICAgYmFjayBpbnRvIDxjb2RlPmFwX3Byb2Nlc3NfaW50ZXJuYWxfcmVxdWVzdCgpPC9jb2RlPiB0byBwcmV2ZW50IHRoZQotICAgY29kZSBmcm9tIGZhbGxpbmcgb3V0IG9mIHN5bmMgYWdhaW4uPC9wPgotCi08cD5UaGlzIG1lYW5zIHRoYXQgbXVjaCBvZiB0aGUgZXhpc3RpbmcgY29kZSB3YXMgJ3Vub3B0aW1pemVkJy4gIEl0IGlzIAotICAgdGhlIEFwYWNoZSBIVFRQIFByb2plY3QncyBmaXJzdCBnb2FsIHRvIGNyZWF0ZSBhIHJvYnVzdCBhbmQgY29ycmVjdAotICAgaW1wbGVtZW50YXRpb24gb2YgdGhlIEhUVFAgc2VydmVyIFJGQy4gIEFkZGl0aW9uYWwgZ29hbHMgaW5jbHVkZQotICAgc2VjdXJpdHksIHNjYWxhYmlsaXR5IGFuZCBvcHRpbWl6YXRpb24uICBOZXcgbWV0aG9kcyB3ZXJlIHNvdWdodCB0bwotICAgb3B0aW1pemUgdGhlIHNlcnZlciAoYmV5b25kIHRoZSBwZXJmb3JtYW5jZSBvZiBBcGFjaGUgMS4zKSB3aXRob3V0Ci0gICBpbnRyb2R1Y2luZyBmcmFnaWxlIG9yIGluc2VjdXJlIGNvZGUuPC9wPgotCi08aDI+VGhlIFJlcXVlc3QgUHJvY2Vzc2luZyBDeWNsZTwvaDI+Ci0KLTxwPkFsbCByZXF1ZXN0cyBwYXNzIHRocm91Z2ggPGNvZGU+YXBfcHJvY2Vzc19yZXF1ZXN0X2ludGVybmFsKCk8L2NvZGU+Ci0gICBpbiByZXF1ZXN0LmMsIGluY2x1ZGluZyBzdWJyZXF1ZXN0cyBhbmQgcmVkaXJlY3RzLiAgSWYgYSBtb2R1bGUgZG9lc24ndCAKLSAgIHBhc3MgZ2VuZXJhdGVkIHJlcXVlc3RzIHRocm91Z2ggdGhpcyBjb2RlLCB0aGUgYXV0aG9yIGlzIGNhdXRpb25lZCB0aGF0Ci0gICB0aGUgbW9kdWxlIG1heSBiZSBicm9rZW4gYnkgZnV0dXJlIGNoYW5nZXMgdG8gcmVxdWVzdCBwcm9jZXNzaW5nLjwvcD4KLQotPHA+VG8gc3RyZWFtbGluZSByZXF1ZXN0cywgdGhlIG1vZHVsZSBhdXRob3IgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoZQotICAgaG9va3Mgb2ZmZXJlZCB0byBkcm9wIG91dCBvZiB0aGUgcmVxdWVzdCBjeWNsZSBlYXJseSwgb3IgdG8gYnlwYXNzCi0gICBjb3JlIEFwYWNoZSBob29rcyB3aGljaCBhcmUgaXJyZWxldmFudCAoYW5kIGNvc3RseSBpbiB0ZXJtcyBvZiBDUFUuKTwvcD4KLQotPGgyPlRoZSBSZXF1ZXN0IFBhcnNpbmcgUGhhc2U8L2gzPgotCi08aDM+VW5lc2NhcGVzIHRoZSBVUkw8L2gzPgotCi08cD5UaGUgcmVxdWVzdCdzIHBhcnNlZF91cmkgcGF0aCBpcyB1bmVzY2FwZWQsIG9uY2UgYW5kIG9ubHkgb25jZSwgYXQgdGhlCi0gICBiZWdpbm5pbmcgb2YgaW50ZXJuYWwgcmVxdWVzdCBwcm9jZXNzaW5nLjwvcD4KLQotPHA+VGhpcyBzdGVwIGlzIGJ5cGFzc2VkIGlmIHRoZSBwcm94eXJlcSBmbGFnIGlzIHNldCwgb3IgdGhlIHBhcnNlZF91cmkucGF0aAotICAgZWxlbWVudCBpcyB1bnNldC4gIFRoZSBtb2R1bGUgaGFzIG5vIGZ1cnRoZXIgY29udHJvbCBvZiB0aGlzIG9uZS10aW1lIAotICAgdW5lc2NhcGUgb3BlcmF0aW9uLCBlaXRoZXIgZmFpbGluZyB0byB1bmVzY2FwZSBvciBtdWx0aXBseSB1bmVzY2FwaW5nCi0gICB0aGUgVVJMIGxlYWRzIHRvIHNlY3VyaXR5IHJlcHJlY3Vzc2lvbnMuPC9wPgotCi08aDM+U3RyaXBzIFBhcmVudCBhbmQgVGhpcyBFbGVtZW50cyBmcm9tIHRoZSBVUkk8L2gzPgotCi08cD5BbGwgPGNvZGU+Ly4uLzwvY29kZT4gYW5kIDxjb2RlPi8uLzwvY29kZT4gZWxlbWVudHMgYXJlIHJlbW92ZWQgYnkKLSAgIDxjb2RlPmFwX2dldHBhcmVudHMoKTwvY29kZT4uICBUaGlzIGhlbHBzIHRvIGVuc3VyZSB0aGUgcGF0aCBpcyAobmVhcmx5KSAKLSAgIGFic29sdXRlIGJlZm9yZSB0aGUgcmVxdWVzdCBwcm9jZXNzaW5nIGNvbnRpbnVlcy48L3A+Ci0KLTxwPlRoaXMgc3RlcCBjYW5ub3QgYmUgYnlwYXNzZWQuPC9wPgotCi08aDM+SW5pdGlhbCBVUkkgTG9jYXRpb24gV2FsazwvaDM+Ci0KLTxwPkV2ZXJ5IHJlcXVlc3QgaXMgc3ViamVjdCB0byBhbiA8Y29kZT5hcF9sb2NhdGlvbl93YWxrKCk8L2NvZGU+IGNhbGwuCi0gICBUaGlzIGVuc3VyZXMgdGhhdCAmbHQ7TG9jYXRpb24gJmd0OyBzZWN0aW9ucyBhcmUgY29uc2lzdGVudGx5IGVuZm9yY2VkIGZvciAKLSAgIGFsbCByZXF1ZXN0cy4gIElmIHRoZSByZXF1ZXN0IGlzIGFuIGludGVybmFsIHJlZGlyZWN0IG9yIGEgc3ViLXJlcXVlc3QsIAotICAgaXQgbWF5IGJvcnJvdyBzb21lIG9yIGFsbCBvZiB0aGUgcHJvY2Vzc2luZyBmcm9tIHRoZSBwcmV2aW91cyBvciBwYXJlbnQgCi0gICByZXF1ZXN0J3MgYXBfbG9jYXRpb25fd2Fsaywgc28gdGhpcyBzdGVwIGlzIGdlbmVyYWxseSB2ZXJ5IGVmZmljaWVudCAKLSAgIGFmdGVyIHByb2Nlc3NpbmcgdGhlIG1haW4gcmVxdWVzdC48L3A+Ci0KLTxoMz5Ib29rOiB0cmFuc2xhdGVfbmFtZTwvaDM+Ci0KLTxwPk1vZHVsZXMgY2FuIGRldGVybWluZSB0aGUgZmlsZSBuYW1lLCBvciBhbHRlciB0aGUgZ2l2ZW4gVVJJIGluIHRoaXMgc3RlcC4KLSAgIEZvciBleGFtcGxlLCBtb2Rfdmhvc3RfYWxpYXMgd2lsbCB0cmFuc2xhdGUgdGhlIFVSSSdzIHBhdGggaW50byB0aGUKLSAgIGNvbmZpZ3VyZWQgdmlydHVhbCBob3N0LCBtb2RfYWxpYXMgd2lsbCB0cmFuc2xhdGUgdGhlIHBhdGggdG8gYW4gYWxpYXMKLSAgIHBhdGgsIGFuZCBpZiB0aGUgcmVxdWVzdCBmYWxscyBiYWNrIG9uIHRoZSBjb3JlLCB0aGUgRG9jdW1lbnRSb290IGlzCi0gICBwcmVwZW5kZWQgdG8gdGhlIHJlcXVlc3QgcmVzb3VyY2UuCi0KLTxwPklmIGFsbCBtb2R1bGVzIERFQ0xJTkUgdGhpcyBwaGFzZSwgYW4gZXJyb3IgNTAwIGlzIHJldHVybmVkIHRvIHRoZSBicm93c2VyLAotICAgYW5kIGEgImNvdWxkbid0IHRyYW5zbGF0ZSBuYW1lIiBlcnJvciBpcyBsb2dnZWQgYXV0b21hdGljYWxseS48L3A+Ci0KLTxoMz5Ib29rOiBtYXBfdG9fc3RvcmFnZTwvaDM+Ci0KLTxwPkFmdGVyIHRoZSBmaWxlIG9yIGNvcnJlY3QgVVJJIHdhcyBkZXRlcm1pbmVkLCB0aGUgYXBwcm9wcmlhdGUgcGVyLWRpcgotICAgY29uZmlndXJhdGlvbnMgYXJlIG1lcmdlZCB0b2dldGhlci4gIEZvciBleGFtcGxlLCBtb2RfcHJveHkgY29tcGFyZXMgCi0gICBhbmQgbWVyZ2VzIHRoZSBhcHByb3ByaWF0ZSAmbHQ7UHJveHkgJmd0OyBzZWN0aW9ucy4gIElmIHRoZSBVUkkgaXMgbm90aGluZyAKLSAgIG1vcmUgdGhhbiBhIGxvY2FsIChub24tcHJveHkpIFRSQUNFIHJlcXVlc3QsIHRoZSBjb3JlIGhhbmRsZXMgdGhlCi0gICByZXF1ZXN0IGFuZCByZXR1cm5zIERPTkUuICBJZiBubyBtb2R1bGUgYW5zd2VycyB0aGlzIGhvb2sgd2l0aCBPSyBvcgotICAgRE9ORSwgdGhlIGNvcmUgd2lsbCBydW4gdGhlIHJlcXVlc3QgZmlsZW5hbWUgYWdhaW5zdCB0aGUgJmx0O0RpcmVjdG9yeSAmZ3Q7Ci0gICBhbmQgJmx0O0ZpbGVzICZndDsgc2VjdGlvbnMuICBJZiB0aGUgcmVxdWVzdCAnZmlsZW5hbWUnIGlzbid0IGFuIGFic29sdXRlLAotICAgbGVnYWwgZmlsZW5hbWUsIGEgbm90ZSBpcyBzZXQgZm9yIGxhdGVyIHRlcm1pbmF0aW9uLjwvcD4KLQotPGgzPkluaXRpYWwgVVJJIExvY2F0aW9uIFdhbGs8L2gzPgotCi08cD5FdmVyeSByZXF1ZXN0IGlzIGhhcmRlbmVkIGJ5IGEgc2Vjb25kIDxjb2RlPmFwX2xvY2F0aW9uX3dhbGsoKTwvY29kZT4gCi0gIGNhbGwuICBUaGlzIHJlYXNzdXJlcyB0aGF0IGEgdHJhbnNsYXRlZCByZXF1ZXN0IGlzIHN0aWxsIHN1YmplY3RlZCB0byAKLSAgdGhlIGNvbmZpZ3VyZWQgJmx0O0xvY2F0aW9uICZndDsgc2VjdGlvbnMuICBUaGUgcmVxdWVzdCBhZ2FpbiBib3Jyb3dzIAotICBzb21lIG9yIGFsbCBvZiB0aGUgcHJvY2Vzc2luZyBmcm9tIGl0J3MgcHJldmlvdXMgbG9jYXRpb25fd2FsayBhYm92ZSwgCi0gIHNvIHRoaXMgc3RlcCBpcyBhbG1vc3QgYWx3YXlzIHZlcnkgZWZmaWNpZW50IHVubGVzcyB0aGUgdHJhbnNsYXRlZCBVUkkgCi0gIG1hcHBlZCB0byBhIHN1YnN0YW50aWFsbHkgZGlmZmVyZW50IHBhdGggb3IgVmlydHVhbCBIb3N0LjwvcD4KLQotPGgzPkhvb2s6IGhlYWRlcl9wYXJzZXI8L2gzPgotCi08cD5UaGUgbWFpbiByZXF1ZXN0IHRoZW4gcGFyc2VzIHRoZSBjbGllbnQncyBoZWFkZXJzLiAgVGhpcyBwcmVwYXJlcyAKLXRoZSByZW1haW5pbmcgcmVxdWVzdCBwcm9jZXNzaW5nIHN0ZXBzIHRvIGJldHRlciBzZXJ2ZSB0aGUgY2xpZW50J3MgCi1yZXF1ZXN0LjwvcD4KLQotPGgyPlRoZSBTZWN1cml0eSBQaGFzZTwvaDM+Ci0KLTxwPk5lZWRzIERvY3VtZW50YXRpb24uICBDb2RlIGlzOzwvcD4KLTxwcmU+Ci0gICAgc3dpdGNoIChhcF9zYXRpc2ZpZXMocikpIHsKLSAgICBjYXNlIFNBVElTRllfQUxMOgotICAgIGNhc2UgU0FUSVNGWV9OT1NQRUM6Ci0gICAgICAgIGlmICgoYWNjZXNzX3N0YXR1cyA9IGFwX3J1bl9hY2Nlc3NfY2hlY2tlcihyKSkgIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGRlY2xfZGllKGFjY2Vzc19zdGF0dXMsICJjaGVjayBhY2Nlc3MiLCByKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXBfc29tZV9hdXRoX3JlcXVpcmVkKHIpKSB7Ci0gICAgICAgICAgICBpZiAoKChhY2Nlc3Nfc3RhdHVzID0gYXBfcnVuX2NoZWNrX3VzZXJfaWQocikpICE9IDApIHx8ICFhcF9hdXRoX3R5cGUocikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVjbF9kaWUoYWNjZXNzX3N0YXR1cywgYXBfYXV0aF90eXBlKHIpCi0JCSAgICAgICAgICAgID8gImNoZWNrIHVzZXIuICBObyB1c2VyIGZpbGU/IgotCQkgICAgICAgICAgICA6ICJwZXJmb3JtIGF1dGhlbnRpY2F0aW9uLiBBdXRoVHlwZSBub3Qgc2V0ISIsIHIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCgoYWNjZXNzX3N0YXR1cyA9IGFwX3J1bl9hdXRoX2NoZWNrZXIocikpICE9IDApIHx8ICFhcF9hdXRoX3R5cGUocikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVjbF9kaWUoYWNjZXNzX3N0YXR1cywgYXBfYXV0aF90eXBlKHIpCi0JCSAgICAgICAgICAgID8gImNoZWNrIGFjY2Vzcy4gIE5vIGdyb3VwcyBmaWxlPyIKLQkJICAgICAgICAgICAgOiAicGVyZm9ybSBhdXRoZW50aWNhdGlvbi4gQXV0aFR5cGUgbm90IHNldCEiLCByKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFNBVElTRllfQU5ZOgotICAgICAgICBpZiAoKChhY2Nlc3Nfc3RhdHVzID0gYXBfcnVuX2FjY2Vzc19jaGVja2VyKHIpKSAhPSAwKSB8fCAhYXBfYXV0aF90eXBlKHIpKSB7Ci0gICAgICAgICAgICBpZiAoIWFwX3NvbWVfYXV0aF9yZXF1aXJlZChyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBkZWNsX2RpZShhY2Nlc3Nfc3RhdHVzLCBhcF9hdXRoX3R5cGUocikKLQkJICAgICAgICAgICAgPyAiY2hlY2sgYWNjZXNzIgotCQkgICAgICAgICAgICA6ICJwZXJmb3JtIGF1dGhlbnRpY2F0aW9uLiBBdXRoVHlwZSBub3Qgc2V0ISIsIHIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCgoYWNjZXNzX3N0YXR1cyA9IGFwX3J1bl9jaGVja191c2VyX2lkKHIpKSAhPSAwKSB8fCAhYXBfYXV0aF90eXBlKHIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlY2xfZGllKGFjY2Vzc19zdGF0dXMsIGFwX2F1dGhfdHlwZShyKQotCQkgICAgICAgICAgICA/ICJjaGVjayB1c2VyLiAgTm8gdXNlciBmaWxlPyIKLQkJICAgICAgICAgICAgOiAicGVyZm9ybSBhdXRoZW50aWNhdGlvbi4gQXV0aFR5cGUgbm90IHNldCEiLCByKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoKGFjY2Vzc19zdGF0dXMgPSBhcF9ydW5fYXV0aF9jaGVja2VyKHIpKSAhPSAwKSB8fCAhYXBfYXV0aF90eXBlKHIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlY2xfZGllKGFjY2Vzc19zdGF0dXMsIGFwX2F1dGhfdHlwZShyKQotCQkgICAgICAgICAgICA/ICJjaGVjayBhY2Nlc3MuICBObyBncm91cHMgZmlsZT8iCi0JCSAgICAgICAgICAgIDogInBlcmZvcm0gYXV0aGVudGljYXRpb24uIEF1dGhUeXBlIG5vdCBzZXQhIiwgcik7Ci0gICAgICAgICAgICB9Ci0JICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLTwvcHJlPgotPGgyPlRoZSBQcmVwYXJhdGlvbiBQaGFzZTwvaDI+Ci0KLTxoMz5Ib29rOiB0eXBlX2NoZWNrZXI8L2gzPgotCi08cD5UaGUgbW9kdWxlcyBoYXZlIGFuIG9wcG9ydHVuaXR5IHRvIHRlc3QgdGhlIFVSSSBvciBmaWxlbmFtZSBhZ2FpbnN0Ci0gICB0aGUgdGFyZ2V0IHJlc291cmNlLCBhbmQgc2V0IG1pbWUgaW5mb3JtYXRpb24gZm9yIHRoZSByZXF1ZXN0LiAgQm90aAotICAgbW9kX21pbWUgYW5kIG1vZF9taW1lX21hZ2ljIHVzZSB0aGlzIHBoYXNlIHRvIGNvbXBhcmUgdGhlIGZpbGUgbmFtZQotICAgb3IgY29udGVudHMgYWdhaW5zdCB0aGUgYWRtaW5pc3RyYXRvcidzIGNvbmZpZ3VyYXRpb24gYW5kIHNldCB0aGUKLSAgIGNvbnRlbnQgdHlwZSwgbGFuZ3VhZ2UsIGNoYXJhY3RlciBzZXQgYW5kIHJlcXVlc3QgaGFuZGxlci4gIFNvbWUKLSAgIG1vZHVsZXMgbWF5IHNldCB1cCB0aGVpciBmaWx0ZXJzIG9yIG90aGVyIHJlcXVlc3QgaGFuZGxpbmcgcGFyYW1ldGVycwotICAgYXQgdGhpcyB0aW1lLjwvcD4KLQotPHA+SWYgYWxsIG1vZHVsZXMgREVDTElORSB0aGlzIHBoYXNlLCBhbiBlcnJvciA1MDAgaXMgcmV0dXJuZWQgdG8gdGhlIGJyb3dzZXIsCi0gICBhbmQgYSAiY291bGRuJ3QgZmluZCB0eXBlcyIgZXJyb3IgaXMgbG9nZ2VkIGF1dG9tYXRpY2FsbHkuPC9wPgotCi08aDM+SG9vazogZml4dXBzPC9oMz4KLQotPHA+TWFueSBtb2R1bGVzIGFyZSAndHJvdW5jZWQnIGJ5IHNvbWUgcGhhc2UgYWJvdmUuICBUaGUgZml4dXBzIHBoYXNlIGlzCi0gICB1c2VkIGJ5IG1vZHVsZXMgdG8gJ3JlYXNzZXJ0JyB0aGVpciBvd25lcnNoaXAgb3IgZm9yY2UgdGhlIHJlcXVlc3QncwotICAgZmllbGRzIHRvIHRoZWlyIGFwcHJvcHJpYXRlIHZhbHVlcy4gIEl0IGlzbid0IGFsd2F5cyB0aGUgY2xlYW5lc3QKLSAgIG1lY2hhbmlzbSwgYnV0IG9jY2FzaW9uYWxseSBpdCdzIHRoZSBvbmx5IG9wdGlvbi48L3A+Ci0KLTxoMz5Ib29rOiBpbnNlcnRfZmlsdGVyPC9oMz4KLQotPHA+TW9kdWxlcyB0aGF0IHRyYW5zZm9ybSB0aGUgY29udGVudCBpbiBzb21lIHdheSBjYW4gaW5zZXJ0IHRoZWlyIHZhbHVlcwotICAgYW5kIG92ZXJyaWRlIGV4aXN0aW5nIGZpbHRlcnMsIHN1Y2ggdGhhdCBpZiB0aGUgdXNlciBjb25maWd1cmVkIGEgbW9yZQotICAgYWR2YW5jZWQgZmlsdGVyIG91dC1vZi1vcmRlciwgdGhlbiB0aGUgbW9kdWxlIGNhbiBtb3ZlIGl0J3Mgb3JkZXIgYXMKLSAgIG5lZWQgYmUuCi0KLTxoMj5UaGUgSGFuZGxlciBQaGFzZTwvaDI+Ci0KLTxwPlRoaXMgcGhhc2UgaXMgPHN0cm9uZz48ZW0+bm90PC9lbT48L3N0cm9uZz4gcGFydCBvZiB0aGUgcHJvY2Vzc2luZyBpbgotICAgPGNvZGU+YXBfcHJvY2Vzc19yZXF1ZXN0X2ludGVybmFsKCk8L2NvZGU+LiAgTWFueSBtb2R1bGVzIHByZXBhcmUgb25lCi0gICBvciBtb3JlIHN1YnJlcXVlc3RzIHByaW9yIHRvIGNyZWF0aW5nIGFueSBjb250ZW50IGF0IGFsbC4gIEFmdGVyIHRoZQotICAgY29yZSwgb3IgYSBtb2R1bGUgY2FsbHMgPGNvZGU+YXBfcHJvY2Vzc19yZXF1ZXN0X2ludGVybmFsKCk8L2NvZGU+IGl0IAotICAgdGhlbiBjYWxscyA8Y29kZT5hcF9pbnZva2VfaGFuZGxlcigpPC9jb2RlPiB0byBnZW5lcmF0ZSB0aGUgcmVxdWVzdC48L3A+Ci0KLTxoMz5Ib29rOiBoYW5kbGVyPC9oMz4KLQotPHA+VGhlIG1vZHVsZSBmaW5hbGx5IGhhcyBhIGNoYW5jZSB0byBzZXJ2ZSB0aGUgcmVxdWVzdCBpbiBpdCdzIGhhbmRsZXIKLSAgIGhvb2suICBOb3RlIHRoYXQgbm90IGV2ZXJ5IHByZXBhcmVkIHJlcXVlc3QgaXMgc2VudCB0byB0aGUgaGFuZGxlcgotICAgaG9vay4gIE1hbnkgbW9kdWxlcywgc3VjaCBhcyBtb2RfYXV0b2luZGV4LCB3aWxsIGNyZWF0ZSBzdWJyZXF1ZXN0cwotICAgZm9yIGEgZ2l2ZW4gVVJJLCBhbmQgdGhlbiBuZXZlciBzZXJ2ZSB0aGUgc3VicmVxdWVzdCwgYnV0IHNpbXBseQotICAgbGlzdHMgaXQgZm9yIHRoZSB1c2VyLiAgUmVtZW1iZXIgbm90IHRvIHB1dCByZXF1aXJlZCB0ZWFyZG93biBmcm9tCi0gICB0aGUgaG9va3MgYWJvdmUgaW50byB0aGlzIG1vZHVsZSwgYnV0IHJlZ2lzdGVyIHBvb2wgY2xlYW51cHMgYWdhaW5zdAotICAgdGhlIHJlcXVlc3QgcG9vbCB0byBmcmVlIHJlc291cmNlcyBhcyByZXF1aXJlZC48L3A+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci0KLTwvYm9keT4KLTwvaHRtbD4KLQotCi0KLQotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9kbnMtY2F2ZWF0cy5odG1sIGIvZG9jcy9tYW51YWwvZG5zLWNhdmVhdHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUzNWEzNi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9kbnMtY2F2ZWF0cy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgMi4wLy9FTiI+Ci08aHRtbD48aGVhZD4KLTx0aXRsZT5Jc3N1ZXMgUmVnYXJkaW5nIEROUyBhbmQgQXBhY2hlPC90aXRsZT4KLTwvaGVhZD48Ym9keT4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxoMT5Jc3N1ZXMgUmVnYXJkaW5nIEROUyBhbmQgQXBhY2hlPC9oMT4KLQotPHA+VGhpcyBwYWdlIGNvdWxkIGJlIHN1bW1hcml6ZWQgd2l0aCB0aGUgc3RhdGVtZW50OiA8aT5kb24ndCByZXF1aXJlCi1BcGFjaGUgdG8gdXNlIEROUyBmb3IgYW55IHBhcnNpbmcgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXM8L2k+LgotSWYgQXBhY2hlIGhhcyB0byB1c2UgRE5TIHRvIHBhcnNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIHRoZW4geW91cgotc2VydmVyIG1heSBiZSBzdWJqZWN0IHRvIHJlbGlhYmlsaXR5IHByb2JsZW1zIChpdCBtaWdodCBub3QgYm9vdCksIG9yCi1kZW5pYWwgYW5kIHRoZWZ0IG9mIHNlcnZpY2UgYXR0YWNrcyAoaW5jbHVkaW5nIHVzZXJzIGFibGUgdG8gc3RlYWwgaGl0cwotZnJvbSBvdGhlciB1c2VycykuCi0KLTxoMz5BIFNpbXBsZSBFeGFtcGxlPC9oMz4KLQotQ29uc2lkZXIgdGhpcyBjb25maWd1cmF0aW9uIHNuaXBwZXQ6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0gICAgJmx0O1ZpcnR1YWxIb3N0IHd3dy5hYmMuZG9tJmd0OwotICAgIFNlcnZlckFkbWluIHdlYmdpcmxAYWJjLmRvbQotICAgIERvY3VtZW50Um9vdCAvd3d3L2FiYwotICAgICZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLTxwPkluIG9yZGVyIGZvciBBcGFjaGUgdG8gZnVuY3Rpb24gcHJvcGVybHkgaXQgYWJzb2x1dGVseSBuZWVkcwotdG8gaGF2ZSB0d28gcGllY2VzIG9mIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggdmlydHVhbCBob3N0OiB0aGUKLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjc2VydmVybmFtZSI+PGNvZGU+U2VydmVyTmFtZTwvY29kZT48L2E+Ci1hbmQgYXQgbGVhc3Qgb25lIGlwIGFkZHJlc3MgdGhhdCB0aGUgc2VydmVyCi1yZXNwb25kcyB0by4gIFRoaXMgZXhhbXBsZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBpcCBhZGRyZXNzLCBzbyBBcGFjaGUKLW11c3QgdXNlIEROUyB0byBmaW5kIHRoZSBhZGRyZXNzIG9mIDxjb2RlPnd3dy5hYmMuZG9tPC9jb2RlPi4gIElmIGZvcgotc29tZSByZWFzb24gRE5TIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhlIHRpbWUgeW91ciBzZXJ2ZXIgaXMgcGFyc2luZyBpdHMKLWNvbmZpZyBmaWxlLCB0aGVuIHRoaXMgdmlydHVhbCBob3N0IDxiPndpbGwgbm90IGJlIGNvbmZpZ3VyZWQ8L2I+LiAgSXQKLXdvbid0IGJlIGFibGUgdG8gcmVzcG9uZCB0byBhbnkgaGl0cyB0byB0aGlzIHZpcnR1YWwgaG9zdCAocHJpb3IgdG8KLUFwYWNoZSB2ZXJzaW9uIDEuMiB0aGUgc2VydmVyIHdvdWxkIG5vdCBldmVuIGJvb3QpLgotCi08cD5TdXBwb3NlIHRoYXQgPGNvZGU+d3d3LmFiYy5kb208L2NvZGU+IGhhcyBhZGRyZXNzIDEwLjAuMC4xLiAgVGhlbgotY29uc2lkZXIgdGhpcyBjb25maWd1cmF0aW9uIHNuaXBwZXQ6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0gICAgJmx0O1ZpcnR1YWxIb3N0IDEwLjAuMC4xJmd0OwotICAgIFNlcnZlckFkbWluIHdlYmdpcmxAYWJjLmRvbQotICAgIERvY3VtZW50Um9vdCAvd3d3L2FiYwotICAgICZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLTxwPk5vdyBBcGFjaGUgbmVlZHMgdG8gdXNlIHJldmVyc2UgRE5TIHRvIGZpbmQgdGhlIDxjb2RlPlNlcnZlck5hbWU8L2NvZGU+Ci1mb3IgdGhpcyB2aXJ0dWFsaG9zdC4gIElmIHRoYXQgcmV2ZXJzZSBsb29rdXAgZmFpbHMgdGhlbiBpdCB3aWxsIHBhcnRpYWxseQotZGlzYWJsZSB0aGUgdmlydHVhbGhvc3QgKHByaW9yIHRvIEFwYWNoZSB2ZXJzaW9uIDEuMiB0aGUgc2VydmVyIHdvdWxkIG5vdAotZXZlbiBib290KS4gIElmIHRoZSB2aXJ0dWFsIGhvc3QgaXMgbmFtZS1iYXNlZCB0aGVuIGl0IHdpbGwgZWZmZWN0aXZlbHkKLWJlIHRvdGFsbHkgZGlzYWJsZWQsIGJ1dCBpZiBpdCBpcyBpcC1iYXNlZCB0aGVuIGl0IHdpbGwgbW9zdGx5IHdvcmsuCi1Ib3dldmVyIGlmIEFwYWNoZSBzaG91bGQgZXZlciBoYXZlIHRvIGdlbmVyYXRlIGEgZnVsbCBVUkwgZm9yIHRoZSBzZXJ2ZXIKLXdoaWNoIGluY2x1ZGVzIHRoZSBzZXJ2ZXIgbmFtZSB0aGVuIGl0IHdpbGwgZmFpbCB0byBnZW5lcmF0ZSBhIHZhbGlkIFVSTC4KLQotPHA+SGVyZSBpcyBhIHNuaXBwZXQgdGhhdCBhdm9pZHMgYm90aCBvZiB0aGVzZSBwcm9ibGVtcy4KLQotPGJsb2NrcXVvdGU+PHByZT4KLSAgICAmbHQ7VmlydHVhbEhvc3QgMTAuMC4wLjEmZ3Q7Ci0gICAgU2VydmVyTmFtZSB3d3cuYWJjLmRvbQotICAgIFNlcnZlckFkbWluIHdlYmdpcmxAYWJjLmRvbQotICAgIERvY3VtZW50Um9vdCAvd3d3L2FiYwotICAgICZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLTxoMz5EZW5pYWwgb2YgU2VydmljZTwvaDM+Ci0KLTxwPlRoZXJlIGFyZSAoYXQgbGVhc3QpIHR3byBmb3JtcyB0aGF0IGRlbmlhbCBvZiBzZXJ2aWNlIGNhbiBjb21lIGluLgotSWYgeW91IGFyZSBydW5uaW5nIGEgdmVyc2lvbiBvZiBBcGFjaGUgcHJpb3IgdG8gdmVyc2lvbiAxLjIgdGhlbiB5b3VyCi1zZXJ2ZXIgd2lsbCBub3QgZXZlbiBib290IGlmIG9uZSBvZiB0aGUgdHdvIEROUyBsb29rdXBzIG1lbnRpb25lZCBhYm92ZQotZmFpbHMgZm9yIGFueSBvZiB5b3VyIHZpcnR1YWwgaG9zdHMuICBJbiBzb21lIGNhc2VzIHRoaXMgRE5TIGxvb2t1cCBtYXkKLW5vdCBldmVuIGJlIHVuZGVyIHlvdXIgY29udHJvbC4gIEZvciBleGFtcGxlLCBpZiA8Y29kZT5hYmMuZG9tPC9jb2RlPgotaXMgb25lIG9mIHlvdXIgY3VzdG9tZXJzIGFuZCB0aGV5IGNvbnRyb2wgdGhlaXIgb3duIEROUyB0aGVuIHRoZXkKLWNhbiBmb3JjZSB5b3VyIChwcmUtMS4yKSBzZXJ2ZXIgdG8gZmFpbCB3aGlsZSBib290aW5nIHNpbXBseSBieSBkZWxldGluZyB0aGUKLTxjb2RlPnd3dy5hYmMuZG9tPC9jb2RlPiByZWNvcmQuCi0KLTxwPkFub3RoZXIgZm9ybSBpcyBmYXIgbW9yZSBpbnNpZGlvdXMuICBDb25zaWRlciB0aGlzIGNvbmZpZ3VyYXRpb24KLXNuaXBwZXQ6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0gICAgJmx0O1ZpcnR1YWxIb3N0IHd3dy5hYmMuZG9tJmd0OwotICAgIFNlcnZlckFkbWluIHdlYmdpcmxAYWJjLmRvbQotICAgIERvY3VtZW50Um9vdCAvd3d3L2FiYwotICAgICZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0gICAgJmx0O1ZpcnR1YWxIb3N0IHd3dy5kZWYuZG9tJmd0OwotICAgIFNlcnZlckFkbWluIHdlYmd1eUBkZWYuZG9tCi0gICAgRG9jdW1lbnRSb290IC93d3cvZGVmCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotPHA+U3VwcG9zZSB0aGF0IHlvdSd2ZSBhc3NpZ25lZCAxMC4wLjAuMSB0byA8Y29kZT53d3cuYWJjLmRvbTwvY29kZT4gYW5kCi0xMC4wLjAuMiB0byA8Y29kZT53d3cuZGVmLmRvbTwvY29kZT4uICBGdXJ0aGVybW9yZSwgc3VwcG9zZSB0aGF0Ci08Y29kZT5kZWYuY29tPC9jb2RlPiBoYXMgY29udHJvbCBvZiB0aGVpciBvd24gRE5TLiAgV2l0aCB0aGlzIGNvbmZpZwoteW91IGhhdmUgcHV0IDxjb2RlPmRlZi5jb208L2NvZGU+IGludG8gYSBwb3NpdGlvbiB3aGVyZSB0aGV5IGNhbiBzdGVhbAotYWxsIHRyYWZmaWMgZGVzdGluZWQgdG8gPGNvZGU+YWJjLmNvbTwvY29kZT4uICBUbyBkbyBzbywgYWxsIHRoZXkgaGF2ZSB0bwotZG8gaXMgc2V0IDxjb2RlPnd3dy5kZWYuZG9tPC9jb2RlPiB0byAxMC4wLjAuMS4KLVNpbmNlIHRoZXkgY29udHJvbCB0aGVpciBvd24gRE5TIHlvdSBjYW4ndCBzdG9wIHRoZW0gZnJvbSBwb2ludGluZyB0aGUKLTxjb2RlPnd3dy5kZWYuY29tPC9jb2RlPiByZWNvcmQgd2hlcmV2ZXIgdGhleSB3aXNoLgotCi08cD5SZXF1ZXN0cyBjb21pbmcgaW4gdG8gMTAuMC4wLjEgKGluY2x1ZGluZyBhbGwgdGhvc2Ugd2hlcmUgdXNlcnMgdHlwZWQKLWluIFVSTHMgb2YgdGhlIGZvcm0gPGNvZGU+aHR0cDovL3d3dy5hYmMuZG9tL3doYXRldmVyPC9jb2RlPikgd2lsbCBhbGwgYmUKLXNlcnZlZCBieSB0aGUgPGNvZGU+ZGVmLmNvbTwvY29kZT4gdmlydHVhbCBob3N0LiAgVG8gYmV0dGVyIHVuZGVyc3RhbmQgd2h5Ci10aGlzIGhhcHBlbnMgcmVxdWlyZXMgYSBtb3JlIGluLWRlcHRoIGRpc2N1c3Npb24gb2YgaG93IEFwYWNoZSBtYXRjaGVzCi11cCBpbmNvbWluZyByZXF1ZXN0cyB3aXRoIHRoZSB2aXJ0dWFsIGhvc3QgdGhhdCB3aWxsIHNlcnZlIGl0LiAgQSByb3VnaAotZG9jdW1lbnQgZGVzY3JpYmluZyB0aGlzIDxhIGhyZWY9InZob3N0cy1pbi1kZXB0aC5odG1sIj4gaXMgYXZhaWxhYmxlPC9hPi4KLQotPGgzPlRoZSAibWFpbiBzZXJ2ZXIiIEFkZHJlc3M8L2gzPgotCi08cD5UaGUgYWRkaXRpb24gb2YgPGEgaHJlZj0iaG9zdC5odG1sIj5ub24tSVAtYmFzZWQgdmlydHVhbCBob3N0Ci1zdXBwb3J0PC9hPiBpbiBBcGFjaGUgMS4xIHJlcXVpcmVzIEFwYWNoZSB0byBrbm93IHRoZSBJUCBhZGRyZXNzKGVzKSBvZgotdGhlIGhvc3QgdGhhdCBodHRwZCBpcyBydW5uaW5nIG9uLiAgVG8gZ2V0IHRoaXMgYWRkcmVzcyBpdCB1c2VzIGVpdGhlcgotdGhlIGdsb2JhbCA8Y29kZT5TZXJ2ZXJOYW1lPC9jb2RlPiAoaWYgcHJlc2VudCkgb3IgY2FsbHMgdGhlIEMgZnVuY3Rpb24KLTxjb2RlPmdldGhvc3RuYW1lPC9jb2RlPiAod2hpY2ggc2hvdWxkIHJldHVybiB0aGUgc2FtZSBhcyB0eXBpbmcKLSJob3N0bmFtZSIgYXQgdGhlIGNvbW1hbmQgcHJvbXB0KS4gIFRoZW4gaXQgcGVyZm9ybXMgYSBETlMgbG9va3VwIG9uCi10aGlzIGFkZHJlc3MuICBBdCBwcmVzZW50IHRoZXJlIGlzIG5vIHdheSB0byBhdm9pZCB0aGlzIGxvb2t1cC4KLQotPHA+SWYgeW91IGZlYXIgdGhhdCB0aGlzIGxvb2t1cCBtaWdodCBmYWlsIGJlY2F1c2UgeW91ciBETlMgc2VydmVyIGlzIGRvd24KLXRoZW4geW91IGNhbiBpbnNlcnQgdGhlIGhvc3RuYW1lIGluIDxjb2RlPi9ldGMvaG9zdHM8L2NvZGU+ICh3aGVyZSB5b3UKLXByb2JhYmx5IGFscmVhZHkgaGF2ZSBpdCBzbyB0aGF0IHRoZSBtYWNoaW5lIGNhbiBib290IHByb3Blcmx5KS4gIFRoZW4KLWVuc3VyZSB0aGF0IHlvdXIgbWFjaGluZSBpcyBjb25maWd1cmVkIHRvIHVzZSA8Y29kZT4vZXRjL2hvc3RzPC9jb2RlPgotaW4gdGhlIGV2ZW50IHRoYXQgRE5TIGZhaWxzLiAgRGVwZW5kaW5nIG9uIHdoYXQgT1MgeW91IGFyZSB1c2luZyB0aGlzCi1taWdodCBiZSBhY2NvbXBsaXNoZWQgYnkgZWRpdGluZyA8Y29kZT4vZXRjL3Jlc29sdi5jb25mPC9jb2RlPiwgb3IgbWF5YmUKLTxjb2RlPi9ldGMvbnNzd2l0Y2guY29uZjwvY29kZT4uCi0KLTxwPklmIHlvdXIgc2VydmVyIGRvZXNuJ3QgaGF2ZSB0byBwZXJmb3JtIEROUyBmb3IgYW55IG90aGVyIHJlYXNvbgotdGhlbiB5b3UgbWlnaHQgYmUgYWJsZSB0byBnZXQgYXdheSB3aXRoIHJ1bm5pbmcgQXBhY2hlIHdpdGggdGhlCi08Y29kZT5IT1NUUkVTT1JERVI8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlIHNldCB0byAibG9jYWwiLiAgVGhpcyBhbGwKLWRlcGVuZHMgb24gd2hhdCBPUyBhbmQgcmVzb2x2ZXIgbGlicmFyaWVzIHlvdSBhcmUgdXNpbmcuICBJdCBhbHNvIGFmZmVjdHMKLUNHSXMgdW5sZXNzIHlvdSB1c2UgPGEgaHJlZj0ibW9kL21vZF9lbnYuaHRtbCI+PGNvZGU+bW9kX2VudjwvY29kZT48L2E+Ci10byBjb250cm9sIHRoZSBlbnZpcm9ubWVudC4gIEl0J3MgYmVzdCB0byBjb25zdWx0IHRoZSBtYW4gcGFnZXMgb3IgRkFRcwotZm9yIHlvdXIgT1MuCi0KLTxoMz5UaGUgX2RlZmF1bHRfIEFkZHJlc3M8L2gzPgotCi08cD5BbnkgYWRkcmVzcyB0aGF0IGhhcHBlbnMgdG8gZ28gdG8geW91ciB3ZWJzZXJ2ZXIgd2hpY2ggZG9lc24ndCBtYXRjaAotdGhlIGlwIGFkZHJlc3Mgb2YgYW55IG9mIHRoZSB3ZWJzZXJ2ZXJzIHdpbGwgYmUgc2VydmVkIGZyb20gdGhlICJtYWluIiBvcgotImRlZmF1bHQiIHNlcnZlciBjb25maWd1cmF0aW9ucy4gIFRoZSAibWFpbiIgc2VydmVyIGNvbmZpZ3VyYXRpb24gY29uc2lzdHMKLW9mIGFsbCB0aG9zZSBkZWZpbml0aW9ucyBhcHBlYXJpbmcgb3V0c2lkZSBvZiBhbnkgVmlydHVhbEhvc3Qgc2VjdGlvbi4KLVlvdSBtYXkgd2FudCBpbnN0ZWFkIHRvIGRlZmluZSBhIDxjb2RlPiZsdDtWaXJ0dWFsSG9zdCBfZGVmYXVsdCZndDs8L2NvZGU+Ci13aGljaCByZXR1cm5zIDQwMyBvciA0MDQgZm9yIGFsbCBoaXRzLgotCi08YSBuYW1lPSJ0aXBzIj48aDM+VGlwcyB0byBBdm9pZCB0aGVzZSBwcm9ibGVtczwvaDM+PC9hPgotCi08dWw+Ci08bGk+IHVzZSBpcCBhZGRyZXNzZXMgaW4gPGNvZGU+Jmx0O1ZpcnR1YWxIb3N0Jmd0PC9jb2RlPgotPGxpPiB1c2UgaXAgYWRkcmVzc2VzIGluIDxjb2RlPkxpc3RlbjwvY29kZT4KLTxsaT4gdXNlIGlwIGFkZHJlc3NlcyBpbiA8Y29kZT5CaW5kQWRkcmVzczwvY29kZT4KLTxsaT4gZW5zdXJlIGFsbCB2aXJ0dWFsIGhvc3RzIGhhdmUgYW4gZXhwbGljaXQgPGNvZGU+U2VydmVyTmFtZTwvY29kZT4KLTxsaT4gY3JlYXRlIGEgPGNvZGU+Jmx0O1ZpcnR1YWxIb3N0IF9kZWZhdWx0XyZndDs8L2NvZGU+IHNlcnZlciB0aGF0Ci0gICAgaGFzIG5vIHBhZ2VzIHRvIHNlcnZlCi08L3VsPgotCi08aDM+QXBwZW5kaXg6IEZ1dHVyZSBEaXJlY3Rpb25zPC9oMz4KLQotPHA+VGhlIHNpdHVhdGlvbiByZWdhcmRpbmcgRE5TIGlzIGhpZ2hseSB1bmRlc2lyYWJsZS4gIEZvciBBcGFjaGUKLTEuMiB3ZSd2ZSBhdHRlbXB0ZWQgdG8gbWFrZSB0aGUgc2VydmVyIGF0IGxlYXN0IGNvbnRpbnVlIGJvb3RpbmcKLWluIHRoZSBldmVudCBvZiBmYWlsZWQgRE5TLCBidXQgaXQgbWlnaHQgbm90IGJlIHRoZSBiZXN0IHdlCi1jYW4gZG8uICBJbiBhbnkgZXZlbnQgcmVxdWlyaW5nIHRoZSB1c2Ugb2YgZXhwbGljaXQgaXAgYWRkcmVzc2VzIGluCi1jb25maWd1cmF0aW9uIGZpbGVzIGlzIGhpZ2hseSB1bmRlc2lyYWJsZSBpbiB0b2RheSdzIEludGVybmV0IHdoZXJlIDxhCi1ocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL2h0bWwuY2hhcnRlcnMvcGllci1jaGFydGVyLmh0bWwiPnJlbnVtYmVyaW5nCi08L2E+IGlzIGEgbmVjZXNzaXR5LgotCi08cD5BIHBvc3NpYmxlIHdvcmsgYXJvdW5kIHRvIHRoZSB0aGVmdCBvZiBzZXJ2aWNlIGF0dGFjayBkZXNjcmliZWQgYWJvdmUKLXdvdWxkIGJlIHRvIHBlcmZvcm0gYSByZXZlcnNlIEROUyBsb29rdXAgb24gdGhlIGlwIGFkZHJlc3MgcmV0dXJuZWQgYnkKLXRoZSBmb3J3YXJkIGxvb2t1cCBhbmQgY29tcGFyZSB0aGUgdHdvIG5hbWVzLiAgSW4gdGhlIGV2ZW50IG9mIGEgbWlzbWF0Y2gKLXRoZSB2aXJ0dWFsaG9zdCB3b3VsZCBiZSBkaXNhYmxlZC4gIFRoaXMgd291bGQgcmVxdWlyZSByZXZlcnNlIEROUyB0byBiZQotY29uZmlndXJlZCBwcm9wZXJseSAod2hpY2ggaXMgc29tZXRoaW5nIHRoYXQgbW9zdCBhZG1pbnMgYXJlIGZhbWlsaWFyIHdpdGgKLWJlY2F1c2Ugb2YgdGhlIGNvbW1vbiB1c2Ugb2YgImRvdWJsZS1yZXZlcnNlIiBETlMgbG9va3VwcyBieSBGVFAgc2VydmVycwotYW5kIFRDUCB3cmFwcGVycykuCi0KLTxwPkluIGFueSBldmVudCBpdCBkb2Vzbid0IHNlZW0gcG9zc2libGUgdG8gcmVsaWFibHkgYm9vdCBhIHZpcnR1YWwtaG9zdGVkCi13ZWIgc2VydmVyIHdoZW4gRE5TIGhhcyBmYWlsZWQgdW5sZXNzIElQIGFkZHJlc3NlcyBhcmUgdXNlZC4gIFBhcnRpYWwKLXNvbHV0aW9ucyBzdWNoIGFzIGRpc2FibGluZyBwb3J0aW9ucyBvZiB0aGUgY29uZmlndXJhdGlvbiBtaWdodCBiZSB3b3JzZQotdGhhbiBub3QgYm9vdGluZyBhdCBhbGwgZGVwZW5kaW5nIG9uIHdoYXQgdGhlIHdlYnNlcnZlciBpcyBzdXBwb3NlZAotdG8gYWNjb21wbGlzaC4KLQotPHA+QXMgSFRUUC8xLjEgaXMgZGVwbG95ZWQgYW5kIGJyb3dzZXJzIGFuZCBwcm94aWVzIHN0YXJ0IGlzc3VpbmcgdGhlIAotPGNvZGU+SG9zdDwvY29kZT4gaGVhZGVyIGl0IHdpbGwgYmVjb21lIHBvc3NpYmxlIHRvIGF2b2lkIHRoZSB1c2Ugb2YKLWlwLWJhc2VkIHZpcnR1YWwgaG9zdHMgZW50aXJlbHkuICBJbiB0aGlzIGV2ZW50IGEgd2Vic2VydmVyIGhhcyBubyByZXF1aXJlbWVudAotdG8gZG8gRE5TIGxvb2t1cHMgZHVyaW5nIGNvbmZpZ3VyYXRpb24uICBCdXQgYXMgb2YgTWFyY2ggMTk5NyB0aGVzZQotZmVhdHVyZXMgaGF2ZSBub3QgYmVlbiBkZXBsb3llZCB3aWRlbHkgZW5vdWdoIHRvIGJlIHB1dCBpbnRvIHVzZSBvbgotY3JpdGljYWwgd2Vic2VydmVycy4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvZHNvLmh0bWwgYi9kb2NzL21hbnVhbC9kc28uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNhZjMzZi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9kc28uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD48SEVBRD4KLTxUSVRMRT5BcGFjaGUgMS4zIER5bmFtaWMgU2hhcmVkIE9iamVjdCAoRFNPKSBzdXBwb3J0PC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci0KLTxIMT5BcGFjaGUgMS4zIER5bmFtaWMgU2hhcmVkIE9iamVjdCAoRFNPKSBzdXBwb3J0PC9IMT4KLQotPFA+PEhSPjxQPgotCi08YWRkcmVzcz5PcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUmFsZiBTLiBFbmdlbHNjaGFsbCwgQXByaWwgMTk5ODwvYWRkcmVzcz4KLQotPEgzPkJhY2tncm91bmQ8L0gzPgotCi08UD5PbiBtb2Rlcm4gVW5peCBkZXJpdmF0aXZlcyB0aGVyZSBleGlzdHMgYSBuaWZ0eSBtZWNoYW5pc20gdXN1YWxseQotIGNhbGxlZCBkeW5hbWljIGxpbmtpbmcvbG9hZGluZyBvZiBEeW5hbWljIFNoYXJlZCBPYmplY3RzIChEU08pIHdoaWNoCi0gcHJvdmlkZXMgYSB3YXkgdG8gYnVpbGQgYSBwaWVjZSBvZiBwcm9ncmFtIGNvZGUgaW4gYSBzcGVjaWFsIGZvcm1hdAotIGZvciBsb2FkaW5nIGl0IGF0IHJ1bi10aW1lIGludG8gdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgYW4gZXhlY3V0YWJsZQotIHByb2dyYW0uCi0KLTxQPlRoaXMgbG9hZGluZyBjYW4gdXN1YWxseSBiZSBkb25lIGluIHR3byB3YXlzOiBBdXRvbWF0aWNhbGx5IGJ5IGEKLSBzeXN0ZW0gcHJvZ3JhbSBjYWxsZWQgPENPREU+bGQuc288L0NPREU+IHdoZW4gYW4gZXhlY3V0YWJsZSBwcm9ncmFtCi0gaXMgc3RhcnRlZCBvciBtYW51YWxseSBmcm9tIHdpdGhpbiB0aGUgZXhlY3V0aW5nIHByb2dyYW0gdmlhIGEKLSBwcm9ncmFtbWF0aWMgc3lzdGVtIGludGVyZmFjZSB0byB0aGUgVW5peCBsb2FkZXIgdGhyb3VnaCB0aGUgc3lzdGVtCi0gY2FsbHMgPENPREU+ZGxvcGVuKCkvZGxzeW0oKTwvQ09ERT4uCi0gCi08UD5JbiB0aGUgZmlyc3Qgd2F5IHRoZSBEU08ncyBhcmUgdXN1YWxseSBjYWxsZWQgInNoYXJlZCBsaWJyYXJpZXMiIG9yCi0gIkRTTyBsaWJyYXJpZXMiIGFuZCBuYW1lZCA8Q09ERT5saWJmb28uc288L0NPREU+IG9yCi0gPENPREU+bGliZm9vLnNvLjEuMjwvQ09ERT4uIFRoZXkgcmVzaWRlIGluIGEgc3lzdGVtIGRpcmVjdG9yeQotICh1c3VhbGx5IDxDT0RFPi91c3IvbGliPC9DT0RFPikgYW5kIHRoZSBsaW5rIHRvIHRoZSBleGVjdXRhYmxlCi0gcHJvZ3JhbSBpcyBlc3RhYmxpc2hlZCBhdCBsaW5rLXRpbWUgYnkgc3BlY2lmeWluZyA8Q09ERT4tbGZvbzwvQ09ERT4KLSB0byB0aGUgbGlua2VyIGNvbW1hbmQuIFRoaXMgaGFyZGNvZGVzIGxpYnJhcnkgcmVmZXJlbmNlcyBpbnRvIHRoZQotIGV4ZWN1dGFibGUgcHJvZ3JhbSBmaWxlIHNvIHRoYXQgYXQgc3RhcnQtdGltZSB0aGUgVW5peCBsb2FkZXIgaXMgYWJsZQotIHRvIGxvY2F0ZSA8Q09ERT5saWJmb28uc288L0NPREU+IGluIDxDT0RFPi91c3IvbGliPC9DT0RFPiBvciBpbiBwYXRocwotIGNvbmZpZ3VyZWQgdmlhIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotIDxDT0RFPkxEX0xJQlJBUllfUEFUSDwvQ09ERT4uIEl0IHRoZW4gcmVzb2x2ZXMgYW55ICh5ZXQgdW5yZXNvbHZlZCkKLSBzeW1ib2xzIGluIHRoZSBleGVjdXRhYmxlIHByb2dyYW0gd2hpY2ggYXJlIGF2YWlsYWJsZSBpbiB0aGUgRFNPLgotIAotPFA+U3ltYm9scyBpbiB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtIGFyZSB1c3VhbGx5IG5vdCByZWZlcmVuY2VkIGJ5IHRoZQotIERTTyAoYmVjYXVzZSBpdCdzIGEgcmV1c2VhYmxlIGxpYnJhcnkgb2YgZ2VuZXJhbCBjb2RlKSBhbmQgaGVuY2Ugbm8KLSBmdXJ0aGVyIHJlc29sdmluZyBoYXMgdG8gYmUgZG9uZS4gVGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSBoYXMgbm8gbmVlZAotIHRvIGRvIGFueXRoaW5nIG9uIGl0cyBvd24gdG8gdXNlIHRoZSBzeW1ib2xzIGZyb20gdGhlIERTTyBiZWNhdXNlIHRoZQotIGNvbXBsZXRlIHJlc29sdmluZyBpcyBkb25lIGJ5IHRoZSBVbml4IGxvYWRlci4gKEluIGZhY3QsIHRoZSBjb2RlIHRvCi0gaW52b2tlIDxDT0RFPmxkLnNvPC9DT0RFPiBpcyBwYXJ0IG9mIHRoZSBydW4tdGltZSBzdGFydHVwIGNvZGUgd2hpY2gKLSBpcyBsaW5rZWQgaW50byBldmVyeSBleGVjdXRhYmxlIHByb2dyYW0gd2hpY2ggaGFzIGJlZW4gYm91bmQKLSBub24tc3RhdGljKS4gVGhlIGFkdmFudGFnZSBvZiBkeW5hbWljIGxvYWRpbmcgb2YgY29tbW9uIGxpYnJhcnkgY29kZQotIGlzIG9idmlvdXM6IHRoZSBsaWJyYXJ5IGNvZGUgbmVlZHMgdG8gYmUgc3RvcmVkIG9ubHkgb25jZSwgaW4gYQotIHN5c3RlbSBsaWJyYXJ5IGxpa2UgPENPREU+bGliYy5zbzwvQ09ERT4sIHNhdmluZyBkaXNrIHNwYWNlIGZvciBldmVyeQotIHByb2dyYW0uCi0KLTxQPkluIHRoZSBzZWNvbmQgd2F5IHRoZSBEU08ncyBhcmUgdXN1YWxseSBjYWxsZWQgInNoYXJlZCBvYmplY3RzIiBvcgotICJEU08gZmlsZXMiIGFuZCBjYW4gYmUgbmFtZWQgd2l0aCBhbiBhcmJpdHJhcnkgZXh0ZW5zaW9uIChhbHRob3VnaAotIHRoZSBjYW5vbmljYWwgbmFtZSBpcyA8Q09ERT5mb28uc288L0NPREU+KS4gVGhlc2UgZmlsZXMgdXN1YWxseSBzdGF5Ci0gaW5zaWRlIGEgcHJvZ3JhbS1zcGVjaWZpYyBkaXJlY3RvcnkgYW5kIHRoZXJlIGlzIG5vIGF1dG9tYXRpY2FsbHkKLSBlc3RhYmxpc2hlZCBsaW5rIHRvIHRoZSBleGVjdXRhYmxlIHByb2dyYW0gd2hlcmUgdGhleSBhcmUKLSB1c2VkLiBJbnN0ZWFkIHRoZSBleGVjdXRhYmxlIHByb2dyYW0gbWFudWFsbHkgbG9hZHMgdGhlIERTTyBhdAotIHJ1bi10aW1lIGludG8gaXRzIGFkZHJlc3Mgc3BhY2UgdmlhIDxDT0RFPmRsb3BlbigpPC9DT0RFPi4gQXQgdGhpcwotIHRpbWUgbm8gcmVzb2x2aW5nIG9mIHN5bWJvbHMgZnJvbSB0aGUgRFNPIGZvciB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtCi0gaXMgZG9uZS4gQnV0IGluc3RlYWQgdGhlIFVuaXggbG9hZGVyIGF1dG9tYXRpY2FsbHkgcmVzb2x2ZXMgYW55ICh5ZXQKLSB1bnJlc29sdmVkKSBzeW1ib2xzIGluIHRoZSBEU08gZnJvbSB0aGUgc2V0IG9mIHN5bWJvbHMgZXhwb3J0ZWQgYnkKLSB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtIGFuZCBpdHMgYWxyZWFkeSBsb2FkZWQgRFNPIGxpYnJhcmllcwotIChlc3BlY2lhbGx5IGFsbCBzeW1ib2xzIGZyb20gdGhlIHViaXF1aXRvdXMgPENPREU+bGliYy5zbzwvQ09ERT4pLgotIFRoaXMgd2F5IHRoZSBEU08gZ2V0cyBrbm93bGVkZ2Ugb2YgdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSdzIHN5bWJvbAotIHNldCBhcyBpZiBpdCBoYWQgYmVlbiBzdGF0aWNhbGx5IGxpbmtlZCB3aXRoIGl0IGluIHRoZSBmaXJzdCBwbGFjZS4KLSAKLTxQPkZpbmFsbHksIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBEU08ncyBBUEkgdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbQotIGhhcyB0byByZXNvbHZlIHBhcnRpY3VsYXIgc3ltYm9scyBmcm9tIHRoZSBEU08gdmlhCi0gPENPREU+ZGxzeW0oKTwvQ09ERT4gZm9yIGxhdGVyIHVzZSBpbnNpZGUgZGlzcGF0Y2ggdGFibGVzIGV0Yy4gSW4KLSBvdGhlciB3b3JkczogVGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSBoYXMgdG8gbWFudWFsbHkgcmVzb2x2ZSBldmVyeQotIHN5bWJvbCBpdCBuZWVkcyB0byBiZSBhYmxlIHRvIHVzZSBpdC4gIFRoZSBhZHZhbnRhZ2Ugb2Ygc3VjaCBhCi0gbWVjaGFuaXNtIGlzIHRoYXQgb3B0aW9uYWwgcHJvZ3JhbSBwYXJ0cyBuZWVkIG5vdCBiZSBsb2FkZWQgKGFuZCB0aHVzCi0gZG8gbm90IHNwZW5kIG1lbW9yeSkgdW50aWwgdGhleSBhcmUgbmVlZGVkIGJ5IHRoZSBwcm9ncmFtIGluCi0gcXVlc3Rpb24uIFdoZW4gcmVxdWlyZWQsIHRoZXNlIHByb2dyYW0gcGFydHMgY2FuIGJlIGxvYWRlZAotIGR5bmFtaWNhbGx5IHRvIGV4dGVuZCB0aGUgYmFzZSBwcm9ncmFtJ3MgZnVuY3Rpb25hbGl0eS4KLQotPFA+QWx0aG91Z2ggdGhpcyBEU08gbWVjaGFuaXNtIHNvdW5kcyBzdHJhaWdodGZvcndhcmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lCi0gZGlmZmljdWx0IHN0ZXAgaGVyZTogVGhlIHJlc29sdmluZyBvZiBzeW1ib2xzIGZyb20gdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSBmb3IKLSB0aGUgRFNPIHdoZW4gdXNpbmcgYSBEU08gdG8gZXh0ZW5kIGEgcHJvZ3JhbSAodGhlIHNlY29uZCB3YXkpLiBXaHk/IEJlY2F1c2UKLSBgcmV2ZXJzZSByZXNvbHZpbmcnIERTTyBzeW1ib2xzIGZyb20gdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSdzIHN5bWJvbCBzZXQgaXMKLSBhZ2FpbnN0IHRoZSBsaWJyYXJ5IGRlc2lnbiAod2hlcmUgdGhlIGxpYnJhcnkgaGFzIG5vIGtub3dsZWRnZSBhYm91dCB0aGUKLSBwcm9ncmFtcyBpdCBpcyB1c2VkIGJ5KSBhbmQgaXMgbmVpdGhlciBhdmFpbGFibGUgdW5kZXIgYWxsIHBsYXRmb3JtcyBub3IKLSBzdGFuZGFyZGl6ZWQuIEluIHByYWN0aWNlIHRoZSBleGVjdXRhYmxlIHByb2dyYW0ncyBnbG9iYWwgc3ltYm9scyBhcmUgb2Z0ZW4KLSBub3QgcmUtZXhwb3J0ZWQgYW5kIHRodXMgbm90IGF2YWlsYWJsZSBmb3IgdXNlIGluIGEgRFNPLiAgRmluZGluZyBhIHdheSB0bwotIGZvcmNlIHRoZSBsaW5rZXIgdG8gZXhwb3J0IGFsbCBnbG9iYWwgc3ltYm9scyBpcyB0aGUgbWFpbiBwcm9ibGVtIG9uZSBoYXMgdG8KLSBzb2x2ZSB3aGVuIHVzaW5nIERTTyBmb3IgZXh0ZW5kaW5nIGEgcHJvZ3JhbSBhdCBydW4tdGltZS4KLQotPEgzPlByYWN0aWNhbCBVc2FnZTwvSDM+Ci0KLTxQPlRoZSBzaGFyZWQgbGlicmFyeSBhcHByb2FjaCBpcyB0aGUgdHlwaWNhbCBvbmUsIGJlY2F1c2UgaXQgaXMgd2hhdCB0aGUgRFNPCi0gbWVjaGFuaXNtIHdhcyBkZXNpZ25lZCBmb3IsIGhlbmNlIGl0IGlzIHVzZWQgZm9yIG5lYXJseSBhbGwgdHlwZXMgb2YKLSBsaWJyYXJpZXMgdGhlIG9wZXJhdGluZyBzeXN0ZW0gcHJvdmlkZXMuIE9uIHRoZSBvdGhlciBoYW5kIHVzaW5nIHNoYXJlZAotIG9iamVjdHMgZm9yIGV4dGVuZGluZyBhIHByb2dyYW0gaXMgbm90IHVzZWQgYnkgYSBsb3Qgb2YgcHJvZ3JhbXMuCi0KLTxQPkFzIG9mIDE5OTggdGhlcmUgYXJlIG9ubHkgYSBmZXcgc29mdHdhcmUgcGFja2FnZXMgYXZhaWxhYmxlIHdoaWNoIHVzZSB0aGUgRFNPCi0gbWVjaGFuaXNtIHRvIGFjdHVhbGx5IGV4dGVuZCB0aGVpciBmdW5jdGlvbmFsaXR5IGF0IHJ1bi10aW1lOiBQZXJsIDUgKHZpYSBpdHMKLSBYUyBtZWNoYW5pc20gYW5kIHRoZSBEeW5hTG9hZGVyIG1vZHVsZSksIEdJTVAsIE5ldHNjYXBlIFNlcnZlciwgZXRjLgotIFN0YXJ0aW5nIHdpdGggdmVyc2lvbiAxLjMsIEFwYWNoZSBqb2luZWQgdGhlIGNyZXcsIGJlY2F1c2UgQXBhY2hlIGFscmVhZHkKLSB1c2VzIGEgbW9kdWxlIGNvbmNlcHQgdG8gZXh0ZW5kIGl0cyBmdW5jdGlvbmFsaXR5IGFuZCBpbnRlcm5hbGx5IHVzZXMgYQotIGRpc3BhdGNoLWxpc3QtYmFzZWQgYXBwcm9hY2ggdG8gbGluayBleHRlcm5hbCBtb2R1bGVzIGludG8gdGhlIEFwYWNoZSBjb3JlCi0gZnVuY3Rpb25hbGl0eS4gU28sIEFwYWNoZSBpcyByZWFsbHkgcHJlZGVzdGluZWQgZm9yIHVzaW5nIERTTyB0byBsb2FkIGl0cwotIG1vZHVsZXMgYXQgcnVuLXRpbWUuCi0KLTxQPkFzIG9mIEFwYWNoZSAxLjMsIHRoZSBjb25maWd1cmF0aW9uIHN5c3RlbSBzdXBwb3J0cyB0d28gb3B0aW9uYWwgZmVhdHVyZXMgZm9yCi0gdGFraW5nIGFkdmFudGFnZSBvZiB0aGUgbW9kdWxhciBEU08gYXBwcm9hY2g6IGNvbXBpbGF0aW9uIG9mIHRoZSBBcGFjaGUgY29yZQotIHByb2dyYW0gaW50byBhIERTTyBsaWJyYXJ5IGZvciBzaGFyZWQgdXNhZ2UgYW5kIGNvbXBpbGF0aW9uIG9mIHRoZSBBcGFjaGUKLSBtb2R1bGVzIGludG8gRFNPIGZpbGVzIGZvciBleHBsaWNpdCBsb2FkaW5nIGF0IHJ1bi10aW1lLgotCi08SDM+SW1wbGVtZW50YXRpb248L0gzPgotCi08UD4gVGhlIERTTyBzdXBwb3J0IGZvciBsb2FkaW5nIGluZGl2aWR1YWwgQXBhY2hlIG1vZHVsZXMgaXMgYmFzZWQgb24gYSBtb2R1bGUKLSBuYW1lZCBtb2Rfc28uYyB3aGljaCBoYXMgdG8gYmUgc3RhdGljYWxseSBjb21waWxlZCBpbnRvIHRoZSBBcGFjaGUgY29yZS4gSXQKLSBpcyB0aGUgb25seSBtb2R1bGUgYmVzaWRlcyBodHRwX2NvcmUuYyB3aGljaCBjYW5ub3QgYmUgcHV0IGludG8gYSBEU08gaXRzZWxmCi0gKGJvb3RzdHJhcHBpbmchKS4gUHJhY3RpY2FsbHkgYWxsIG90aGVyIGRpc3RyaWJ1dGVkIEFwYWNoZSBtb2R1bGVzIHRoZW4gY2FuCi0gdGhlbiBiZSBwbGFjZWQgaW50byBhIERTTyBieSBpbmRpdmlkdWFsbHkgZW5hYmxpbmcgdGhlIERTTyBidWlsZCBmb3IgdGhlbSB2aWEKLSBjb25maWd1cmUncyAtLWVuYWJsZS1zaGFyZWQgb3B0aW9uIChzZWUgLi4vSU5TVEFMTCBmaWxlKSBvciBieSBjaGFuZ2luZyB0aGUKLSBgQWRkTW9kdWxlJyBjb21tYW5kIGluIHNyYy9Db25maWd1cmF0aW9uLnRtcGwgaW50byBhIGBTaGFyZWRNb2R1bGUnIGNvbW1hbmQKLSAoc2VlIC4vSU5TVEFMTCBmaWxlKS4gIEFmdGVyIGEgbW9kdWxlIGlzIGNvbXBpbGVkIGludG8gYSBEU08gbmFtZWQgbW9kX2Zvby5zbwotIHlvdSBjYW4gdXNlIG1vZF9zbydzIGBMb2FkTW9kdWxlJyBjb21tYW5kIGluIHlvdXIgaHR0cGQuY29uZiBmaWxlIHRvIGxvYWQKLSB0aGlzIG1vZHVsZSBhdCBzZXJ2ZXIgc3RhcnR1cCBvciByZXN0YXJ0LgotCi08UD5UbyBzaW1wbGlmeSB0aGlzIGNyZWF0aW9uIG9mIERTTyBmaWxlcyBmb3IgQXBhY2hlIG1vZHVsZXMgKGVzcGVjaWFsbHkgZm9yCi0gdGhpcmQtcGFydHkgbW9kdWxlcykgYSBuZXcgc3VwcG9ydCBwcm9ncmFtIG5hbWVkIGBhcHhzJyBpcyBhdmFpbGFibGUuIEl0IGNhbgotIGJlIHVzZWQgdG8gYnVpbGQgRFNPIGJhc2VkIG1vZHVsZXMgX291dHNpZGUgb2ZfIHRoZSBBcGFjaGUgc291cmNlIHRyZWUuIFRoZQotIGlkZWEgaXMgc2ltcGxlOiBXaGVuIGluc3RhbGxpbmcgQXBhY2hlIHRoZSBjb25maWd1cmUncyAibWFrZSBpbnN0YWxsIgotIHByb2NlZHVyZSBpbnN0YWxscyB0aGUgQXBhY2hlIEMgaGVhZGVyIGZpbGVzIGFuZCBwdXRzIHRoZSBwbGF0Zm9ybS1kZXBlbmRlbmQKLSBjb21waWxlciBhbmQgbGlua2VyIGZsYWdzIGZvciBidWlsZGluZyBEU08gZmlsZXMgaW50byB0aGUgYGFweHMnIHByb2dyYW0uCi0gVGhpcyB3YXkgdGhlIHVzZXIgY2FuIHVzZSBgYXB4cycgdG8gY29tcGlsZSBoaXMgQXBhY2hlIG1vZHVsZSBzb3VyY2VzIHdpdGhvdXQKLSB0aGUgQXBhY2hlIGRpc3RyaWJ1dGlvbiBzb3VyY2UgdHJlZSBhbmQgd2l0aG91dCBoYXZpbmcgdG8gZmlkZGxlIHdpdGggdGhlCi0gcGxhdGZvcm0tZGVwZW5kZW5kIGNvbXBpbGVyIGFuZCBsaW5rZXIgZmxhZ3MgZm9yIERTTyBzdXBwb3J0LgotCi08UD5UbyBwbGFjZSB0aGUgY29tcGxldGUgQXBhY2hlIGNvcmUgcHJvZ3JhbSBpbnRvIGEgRFNPIGxpYnJhcnkgKG9ubHkgcmVxdWlyZWQKLSBvbiBzb21lIG9mIHRoZSBzdXBwb3J0ZWQgcGxhdGZvcm1zIHRvIGZvcmNlIHRoZSBsaW5rZXIgdG8gZXhwb3J0IHRoZSBhcGFjaGUKLSBjb3JlIHN5bWJvbHMgLS0gYSBwcmVyZXF1aXNpdGUgZm9yIHRoZSBEU08gbW9kdWxhcml6YXRpb24pIHRoZSBydWxlCi0gU0hBUkVEX0NPUkUgaGFzIHRvIGJlIGVuYWJsZWQgdmlhIGNvbmZpZ3VyZSdzIC0tZW5hYmxlLXJ1bGU9U0hBUkVEX0NPUkUKLSBvcHRpb24gKHNlZSAuLi9JTlNUQUxMIGZpbGUpIG9yIGJ5IGNoYW5naW5nIHRoZSBSdWxlIGNvbW1hbmQgaW4KLSBDb25maWd1cmF0aW9uLnRtcGwgdG8gIlJ1bGUgU0hBUkVEX0NPUkU9eWVzIiAoc2VlIC4vSU5TVEFMTCBmaWxlKS4gVGhlIEFwYWNoZQotIGNvcmUgY29kZSBpcyB0aGVuIHBsYWNlZCBpbnRvIGEgRFNPIGxpYnJhcnkgbmFtZWQgbGliaHR0cGQuc28uIEJlY2F1c2Ugb25lCi0gY2Fubm90IGxpbmsgYSBEU08gYWdhaW5zdCBzdGF0aWMgbGlicmFyaWVzLCBhbiBhZGRpdGlvbmFsIGV4ZWN1dGFibGUgcHJvZ3JhbQotIG5hbWVkIGxpYmh0dHBkLmVwIGlzIGNyZWF0ZWQgd2hpY2ggYm90aCBiaW5kcyB0aGlzIHN0YXRpYyBjb2RlIGFuZCBwcm92aWRlcyBhCi0gc3R1YiBmb3IgdGhlIG1haW4oKSBmdW5jdGlvbi4gRmluYWxseSB0aGUgaHR0cGQgZXhlY3V0YWJsZSBwcm9ncmFtIGl0c2VsZiBpcwotIHJlcGxhY2VkIGJ5IGEgYm9vdHN0cmFwcGluZyBjb2RlIHdoaWNoIGF1dG9tYXRpY2FsbHkgbWFrZXMgc3VyZSB0aGUgVW5peAotIGxvYWRlciBpcyBhYmxlIHRvIGxvYWQgYW5kIHN0YXJ0IGxpYmh0dHBkLmVwIGJ5IHByb3ZpZGluZyB0aGUgTERfTElCUkFSWV9QQVRICi0gdG8gbGliaHR0cGQuc28uCi0KLTxIMz5TdXBwb3J0ZWQgUGxhdGZvcm1zPC9IMz4KLQotPFA+QXBhY2hlJ3Mgc3JjL0NvbmZpZ3VyZSBzY3JpcHQgY3VycmVudGx5IGhhcyBvbmx5IGxpbWl0ZWQgYnVpbHQtaW4ga25vd2xlZGdlCi0gb24gaG93IHRvIGNvbXBpbGUgRFNPIGZpbGVzIGJlY2F1c2UgKGFzIGFscmVhZHkgbWVudGlvbmVkKSB0aGlzIGlzIGhlYXZpbHkKLSBwbGF0Zm9ybS1kZXBlbmRlbnQuIE5ldmVydGhlbGVzcyBhbGwgbWFqb3IgVW5peCBwbGF0Zm9ybXMgYXJlIHN1cHBvcnRlZC4gIFRoZQotIGRlZmluaXRpdmUgY3VycmVudCBzdGF0ZSAoTWF5IDE5OTgpIGlzIHRoaXM6Ci0KLTxQUkU+Ci0gT3V0LW9mLXRoZS1ib3ggc3VwcG9ydGVkIHBsYXRmb3JtczoKLSAoYWN0dWFsbHkgdGVzdGVkIHZlcnNpb25zIGluIHBhcmVudGhlc2lzKQotCi0gICBvICBGcmVlQlNEICAgICAgICAgICAgKDIuMS41LCAyLjIuNSwgMi4yLjYpCi0gICBvICBPcGVuQlNEICAgICAgICAgICAgKDIueCkKLSAgIG8gIE5ldEJTRCAgICAgICAgICAgICAoMS4zLjEpCi0gICBvICBMaW51eCAgICAgICAgICAgICAgKERlYmlhbi8xLjMuMSwgUmVkSGF0LzQuMikKLSAgIG8gIFNvbGFyaXMgICAgICAgICAgICAoMi40LCAyLjUuMSwgMi42KQotICAgbyAgU3VuT1MgICAgICAgICAgICAgICg0LjEuMykKLSAgIG8gIE9TRjEgICAgICAgICAgICAgICAoNC4wKQotICAgbyAgSVJJWCAgICAgICAgICAgICAgICg2LjIpCi0gICBvICBIUC9VWCAgICAgICAgICAgICAgKDEwLjIwKQotICAgbyAgVW5peFdhcmUgICAgICAgICAgICgyLjAxLCAyLjEuMikKLSAgIG8gIEFJWCAgICAgICAgICAgICAgICAoMy4yLCA0LjEuNSwgNC4yLCA0LjMpCi0gICBvICBSZWxpYW50VU5JWC9TSU5JWCAgKDUuNDMpCi0gICBvICBTVlI0ICAgICAgICAgICAgICAgKC0pCi0KLSBFeHBsaWNpdGx5IHVuc3VwcG9ydGVkIHBsYXRmb3JtczoKLQotICAgbyAgVWx0cml4OiBUaGVyZSBpcyBubyBkbG9wZW4tc3R5bGUgaW50ZXJmYWNlIHVuZGVyIHRoaXMgcGxhdGZvcm0uCi08L1BSRT4KLQotCi08SDM+VXNhZ2UgU3VtbWFyeTwvSDM+Ci0KLTxQPlRvIGdpdmUgeW91IGFuIG92ZXJ2aWV3IG9mIHRoZSBEU08gZmVhdHVyZXMgb2YgQXBhY2hlIDEuMywgaGVyZSBpcwotIGEgc2hvcnQgYW5kIGNvbmNpc2Ugc3VtbWFyeToKLQotPE9MPgotCi08TEk+UGxhY2luZyB0aGUgQXBhY2hlIGNvcmUgY29kZSAoYWxsIHRoZSBzdHVmZiB3aGljaCB1c3VhbGx5IGZvcm1zCi0gICAgdGhlIGh0dHBkIGJpbmFyeSkgaW50byBhIERTTyBsaWJodHRwZC5zbywgYW4gZXhlY3V0YWJsZSBwcm9ncmFtCi0gICAgbGliaHR0cGQuZXAgYW5kIGEgYm9vdHN0cmFwcGluZyBleGVjdXRhYmxlIHByb2dyYW0gaHR0cGQgKE5vdGljZToKLSAgICB0aGlzIGlzIG9ubHkgcmVxdWlyZWQgb24gc29tZSBvZiB0aGUgc3VwcG9ydGVkIHBsYXRmb3JtcyB0byBmb3JjZQotICAgIHRoZSBsaW5rZXIgdG8gZXhwb3J0IHRoZSBBcGFjaGUgY29yZSBzeW1ib2xzLCB3aGljaCBpbiB0dXJuIGlzIGEKLSAgICBwcmVyZXF1aXNpdGUgZm9yIHRoZSBEU08gbW9kdWxhcml6YXRpb24pOgotCi08UFJFPgotICAgbyBCdWlsZCBhbmQgaW5zdGFsbCB2aWEgY29uZmlndXJlIChwcmVmZXJyZWQpOgotICAgICAkIC4vY29uZmlndXJlIC0tcHJlZml4PS9wYXRoL3RvL2luc3RhbGwKLSAgICAgICAgICAgICAgICAgICAtLWVuYWJsZS1ydWxlPVNIQVJFRF9DT1JFIC4uLgotICAgICAkIG1ha2UgaW5zdGFsbAotCi0gICBvIEJ1aWxkIGFuZCBpbnN0YWxsIG1hbnVhbGx5OiAKLSAgICAgLSBFZGl0IHNyYy9Db25maWd1cmF0aW9uOgotICAgICAgIDw8ICJSdWxlIFNIQVJFRF9DT1JFPWRlZmF1bHQiCi0gICAgICAgPj4gIlJ1bGUgU0hBUkVEX0NPUkU9eWVzIgotICAgICAgIDw8ICJFWFRSQV9DRkxBR1M9ICIKLSAgICAgICA+PiAiRVhUUkFfQ0ZMQUdTPSAtRFNIQVJFRF9DT1JFX0RJUj1cIi9wYXRoL3RvL2luc3RhbGwvbGliZXhlY1wiCi0gICAgICQgbWFrZSAKLSAgICAgJCBjcCBzcmMvbGliaHR0cGQuc28qIC9wYXRoL3RvL2luc3RhbGwvbGliZXhlYy8KLSAgICAgJCBjcCBzcmMvbGliaHR0cGQuZXAgIC9wYXRoL3RvL2luc3RhbGwvbGliZXhlYy8KLSAgICAgJCBjcCBzcmMvaHR0cGQgICAgICAgIC9wYXRoL3RvL2luc3RhbGwvYmluLwotPC9QUkU+ICAgIAotCi08TEk+QnVpbGQgYW5kIGluc3RhbGwgYSBkaXN0cmlidXRlZCBBcGFjaGUgbW9kdWxlLCBzYXkgbW9kX2Zvby5jLCAKLSAgICBpbnRvIGl0cyBvd24gRFNPIG1vZF9mb28uc286Ci0KLTxQUkU+Ci0gICBvIEJ1aWxkIGFuZCBpbnN0YWxsIHZpYSBjb25maWd1cmUgKHByZWZlcnJlZCk6Ci0gICAgICQgLi9jb25maWd1cmUgLS1wcmVmaXg9L3BhdGgvdG8vaW5zdGFsbAotICAgICAgICAgICAgIC0tZW5hYmxlLXNoYXJlZD1mb28KLSAgICAgJCBtYWtlIGluc3RhbGwKLQotICAgbyBCdWlsZCBhbmQgaW5zdGFsbCBtYW51YWxseTogCi0gICAgIC0gRWRpdCBzcmMvQ29uZmlndXJhdGlvbjoKLSAgICAgICA8PCAiQWRkTW9kdWxlICAgIG1vZHVsZXMveHh4eC9tb2RfZm9vLm8iIAotICAgICAgID4+ICJTaGFyZWRNb2R1bGUgbW9kdWxlcy94eHh4L21vZF9mb28uc28iCi0gICAgICQgbWFrZQotICAgICAkIGNwIHNyYy94eHh4L21vZF9mb28uc28gL3BhdGgvdG8vaW5zdGFsbC9saWJleGVjCi0gICAgIC0gRWRpdCAvcGF0aC90by9pbnN0YWxsL2V0Yy9odHRwZC5jb25mCi0gICAgICAgPj4gIkxvYWRNb2R1bGUgZm9vX21vZHVsZSAvcGF0aC90by9pbnN0YWxsL2xpYmV4ZWMvbW9kX2Zvby5zbyIKLTwvUFJFPgotCi08TEk+QnVpbGQgYW5kIGluc3RhbGwgYSB0aGlyZC1wYXJ0eSBBcGFjaGUgbW9kdWxlLCBzYXkgbW9kX2Zvby5jLCAKLSAgICBpbnRvIGl0cyBvd24gRFNPIG1vZF9mb28uc28KLQotPFBSRT4KLSAgIG8gQnVpbGQgYW5kIGluc3RhbGwgdmlhIGNvbmZpZ3VyZSAocHJlZmVycmVkKToKLSAgICAgJCAuL2NvbmZpZ3VyZSAtLWFkZC1tb2R1bGU9L3BhdGgvdG8vM3JkcGFydHkvbW9kX2Zvby5jIAotICAgICAgICAgICAgIC0tZW5hYmxlLXNoYXJlZD1mb28KLSAgICAgJCBtYWtlIGluc3RhbGwKLQotICAgbyBCdWlsZCBhbmQgaW5zdGFsbCBtYW51YWxseTogCi0gICAgICQgY3AgL3BhdGgvdG8vM3JkcGFydHkvbW9kX2Zvby5jIC9wYXRoL3RvL2FwYWNoZS0xLjMvc3JjL21vZHVsZXMvZXh0cmEvCi0gICAgIC0gRWRpdCBzcmMvQ29uZmlndXJhdGlvbjoKLSAgICAgICA+PiAiU2hhcmVkTW9kdWxlIG1vZHVsZXMvZXh0cmEvbW9kX2Zvby5zbyIKLSAgICAgJCBtYWtlCi0gICAgICQgY3Agc3JjL3h4eHgvbW9kX2Zvby5zbyAvcGF0aC90by9pbnN0YWxsL2xpYmV4ZWMKLSAgICAgLSBFZGl0IC9wYXRoL3RvL2luc3RhbGwvZXRjL2h0dHBkLmNvbmYKLSAgICAgICA+PiAiTG9hZE1vZHVsZSBmb29fbW9kdWxlIC9wYXRoL3RvL2luc3RhbGwvbGliZXhlYy9tb2RfZm9vLnNvIgotPC9QUkU+Ci0KLTxMST5CdWlsZCBhbmQgaW5zdGFsbCBhIHRoaXJkLXBhcnR5IEFwYWNoZSBtb2R1bGUsIHNheSBtb2RfZm9vLmMsIAotICAgIGludG8gaXRzIG93biBEU08gbW9kX2Zvby5zbyBfb3V0c2lkZSBvZl8gdGhlIEFwYWNoZSBzb3VyY2UgdHJlZToKLQotPFBSRT4KLSAgIG8gQnVpbGQgYW5kIGluc3RhbGwgdmlhIEFQWFM6IAotICAgICAkIGNkIC9wYXRoL3RvLzNyZHBhcnR5Ci0gICAgICQgYXB4cyAtYyBtb2RfZm9vLmMKLSAgICAgJCBhcHhzIC1pIC1hIC1uIGZvbyBtb2RfZm9vLnNvCi08L1BSRT4KLQotPC9VTD4KLQotPEgzPkFkdmFudGFnZXMgJiBEaXNhZHZhbnRhZ2VzPC9IMz4KLQotPFA+VGhlIGFib3ZlIERTTyBiYXNlZCBmZWF0dXJlcyBvZiBBcGFjaGUgMS4zIGhhdmUgdGhlIGZvbGxvd2luZyBhZHZhbnRhZ2VzOgotCi08VUw+Ci08TEk+IFRoZSBzZXJ2ZXIgcGFja2FnZSBpcyBtb3JlIGZsZXhpYmxlIGF0IHJ1bi10aW1lIGJlY2F1c2UgdGhlIGFjdHVhbCBzZXJ2ZXIKLSAgICAgcHJvY2VzcyBjYW4gYmUgYXNzZW1ibGVkIGF0IHJ1bi10aW1lIHZpYSBMb2FkTW9kdWxlIGh0dHBkLmNvbmYKLSAgICAgY29uZmlndXJhdGlvbiBjb21tYW5kcyBpbnN0ZWFkIG9mIENvbmZpZ3VyYXRpb24gQWRkTW9kdWxlIGNvbW1hbmRzIGF0Ci0gICAgIGJ1aWxkLXRpbWUuIEZvciBpbnN0YW5jZSB0aGlzIHdheSBvbmUgaXMgYWJsZSB0byBydW4gZGlmZmVyZW50IHNlcnZlcgotICAgICBpbnN0YW5jZXMgKHN0YW5kYXJkICYgU1NMIHZlcnNpb24sIG1pbmltYWxpc3RpYyAmIHBvd2VyZWQgdXAgdmVyc2lvbgotICAgICBbbW9kX3BlcmwsIFBIUDNdLCBldGMuKSB3aXRoIG9ubHkgb25lIEFwYWNoZSBpbnN0YWxsYXRpb24uCi0KLTxMST4gVGhlIHNlcnZlciBwYWNrYWdlIGNhbiBiZSBlYXNpbHkgZXh0ZW5kZWQgd2l0aCB0aGlyZC1wYXJ0eSBtb2R1bGVzIGV2ZW4KLSAgICAgYWZ0ZXIgaW5zdGFsbGF0aW9uLiBUaGlzIGlzIGF0IGxlYXN0IGEgZ3JlYXQgYmVuZWZpdCBmb3IgdmVuZG9yIHBhY2thZ2UKLSAgICAgbWFpbnRhaW5lcnMgd2hvIGNhbiBjcmVhdGUgYSBBcGFjaGUgY29yZSBwYWNrYWdlIGFuZCBhZGRpdGlvbmFsIHBhY2thZ2VzCi0gICAgIGNvbnRhaW5pbmcgZXh0ZW5zaW9ucyBsaWtlIFBIUDMsIG1vZF9wZXJsLCBtb2RfZmFzdGNnaSwgZXRjLgotCi08TEk+IEVhc2llciBBcGFjaGUgbW9kdWxlIHByb3RvdHlwaW5nIGJlY2F1c2Ugd2l0aCB0aGUgRFNPL0FQWFMgcGFpciB5b3UgY2FuCi0gICAgIGJvdGggd29yayBvdXRzaWRlIHRoZSBBcGFjaGUgc291cmNlIHRyZWUgYW5kIG9ubHkgbmVlZCBhbiBgYXB4cyAtaScKLSAgICAgY29tbWFuZCBmb2xsb3dlZCBieSBhIGBhcGFjaGVjdGwgcmVzdGFydCcgdG8gYnJpbmcgYSBuZXcgdmVyc2lvbiBvZiB5b3VyCi0gICAgIGN1cnJlbnRseSBkZXZlbG9wZWQgbW9kdWxlIGludG8gdGhlIHJ1bm5pbmcgQXBhY2hlIHNlcnZlci4KLTwvVUw+Ci0KLTxQPkRTTyBoYXMgdGhlIGZvbGxvd2luZyBkaXNhZHZhbnRhZ2VzOgotCi08VUw+Ci08TEk+IFRoZSBEU08gbWVjaGFuaXNtIGNhbm5vdCBiZSB1c2VkIG9uIGV2ZXJ5IHBsYXRmb3JtIGJlY2F1c2Ugbm90IGFsbAotICAgICBvcGVyYXRpbmcgc3lzdGVtcyBzdXBwb3J0IGR5bmFtaWMgbG9hZGluZy4KLQotPExJPiBUaGUgc2VydmVyIGlzIGFwcHJveGltYXRlbHkgMjAlIHNsb3dlciBhdCBzdGFydHVwIHRpbWUgYmVjYXVzZSBvZiB0aGUKLSAgICAgc3ltYm9sIHJlc29sdmluZyBvdmVyaGVhZCB0aGUgVW5peCBsb2FkZXIgbm93IGhhcyB0byBkby4KLQotPExJPiBUaGUgc2VydmVyIGlzIGFwcHJveGltYXRlbHkgNSUgc2xvd2VyIGF0IGV4ZWN1dGlvbiB0aW1lIHVuZGVyIHNvbWUKLSAgICAgcGxhdGZvcm1zIGJlY2F1c2UgcG9zaXRpb24gaW5kZXBlbmRlZCBjb2RlIChQSUMpIHNvbWV0aW1lcyBuZWVkcwotICAgICBjb21wbGljYXRlZCBhc3NlbWJsZXIgdHJpY2tzIGZvciByZWxhdGl2ZSBhZGRyZXNzaW5nIHdoaWNoIGFyZSBub3QKLSAgICAgbmVjZXNzYXJpbHkgYXMgZmFzdCBhcyBhYnNvbHV0ZSBhZGRyZXNzaW5nLgotCi08TEk+IEJlY2F1c2UgRFNPIG1vZHVsZXMgY2Fubm90IGJlIGxpbmtlZCBhZ2FpbnN0IG90aGVyIERTTy1iYXNlZCBsaWJyYXJpZXMKLSAgICAgKGxkIC1sZm9vKSBvbiBhbGwgcGxhdGZvcm1zIChmb3IgaW5zdGFuY2UgYS5vdXQtYmFzZWQgcGxhdGZvcm1zIHVzdWFsbHkKLSAgICAgZG9uJ3QgcHJvdmlkZSB0aGlzIGZ1bmN0aW9uYWxpdHkgd2hpbGUgRUxGLWJhc2VkIHBsYXRmb3JtcyBkbykgeW91IGNhbm5vdAotICAgICB1c2UgdGhlIERTTyBtZWNoYW5pc20gZm9yIGFsbCB0eXBlcyBvZiBtb2R1bGVzLiBPciBpbiBvdGhlciB3b3JkcywKLSAgICAgbW9kdWxlcyBjb21waWxlZCBhcyBEU08gZmlsZXMgYXJlIHJlc3RyaWN0ZWQgdG8gb25seSB1c2Ugc3ltYm9scyBmcm9tIHRoZQotICAgICBBcGFjaGUgY29yZSwgZnJvbSB0aGUgQyBsaWJyYXJ5IChsaWJjKSBhbmQgYWxsIG90aGVyIGR5bmFtaWMgb3Igc3RhdGljCi0gICAgIGxpYnJhcmllcyB1c2VkIGJ5IHRoZSBBcGFjaGUgY29yZSwgb3IgZnJvbSBzdGF0aWMgbGlicmFyeSBhcmNoaXZlcwotICAgICAobGliZm9vLmEpIGNvbnRhaW5pbmcgcG9zaXRpb24gaW5kZXBlbmRlbmQgY29kZS4gVGhlIG9ubHkgY2hhbmNlIHRvIHVzZQotICAgICBvdGhlciBjb2RlIGlzIHRvIGVpdGhlciBtYWtlIHN1cmUgdGhlIEFwYWNoZSBjb3JlIGl0c2VsZiBhbHJlYWR5IGNvbnRhaW5zCi0gICAgIGEgcmVmZXJlbmNlIHRvIGl0IG9yIGxvYWRpbmcgdGhlIGNvZGUgeW91cnNlbGYgdmlhIGRsb3BlbigpLgotCi08TEk+IFVuZGVyIHNvbWUgcGxhdGZvcm1zIChtYW55IFNWUjQgc3lzdGVtcykgdGhlcmUgaXMgbm8gd2F5IHRvIGZvcmNlIHRoZQotICAgICBsaW5rZXIgdG8gZXhwb3J0IGFsbCBnbG9iYWwgc3ltYm9scyBmb3IgdXNlIGluIERTTydzIHdoZW4gbGlua2luZyB0aGUKLSAgICAgQXBhY2hlIGh0dHBkIGV4ZWN1dGFibGUgcHJvZ3JhbS4gQnV0IHdpdGhvdXQgdGhlIHZpc2liaWxpdHkgb2YgdGhlIEFwYWNoZQotICAgICBjb3JlIHN5bWJvbHMgbm8gc3RhbmRhcmQgQXBhY2hlIG1vZHVsZSBjb3VsZCBiZSB1c2VkIGFzIGEgRFNPLiBUaGUgb25seQotICAgICBjaGFuY2UgaGVyZSBpcyB0byB1c2UgdGhlIFNIQVJFRF9DT1JFIGZlYXR1cmUgYmVjYXVzZSB0aGlzIHdheSB0aGUgZ2xvYmFsCi0gICAgIHN5bWJvbHMgYXJlIGZvcmNlZCB0byBiZSBleHBvcnRlZC4gQXMgYSBjb25zZXF1ZW5jZSB0aGUgQXBhY2hlCi0gICAgIHNyYy9Db25maWd1cmUgc2NyaXB0IGF1dG9tYXRpY2FsbHkgZW5mb3JjZXMgU0hBUkVEX0NPUkUgb24gdGhlc2UKLSAgICAgcGxhdGZvcm1zIHdoZW4gRFNPIGZlYXR1cmVzIGFyZSB1c2VkIGluIHRoZSBDb25maWd1cmF0aW9uIGZpbGUgb3Igb24gdGhlCi0gICAgIGNvbmZpZ3VyZSBjb21tYW5kIGxpbmUuCi08L1VMPgotCi08UFJFPgotICAgICAgICAgICAgICAgICAgICAgUmFsZiBTLiBFbmdlbHNjaGFsbAotICAgICAgICAgICAgICAgICAgICAgcnNlQGVuZ2Vsc2NoYWxsLmNvbQotICAgICAgICAgICAgICAgICAgICAgd3d3LmVuZ2Vsc2NoYWxsLmNvbQotPC9QUkU+Ci0KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KLQotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9kc28uaHRtbC5lbiBiL2RvY3MvbWFudWFsL2Rzby5odG1sLmVuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2FmMzNmLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2Rzby5odG1sLmVuCisrKyAvZGV2L251bGwKQEAgLTEsMzM3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPjxIRUFEPgotPFRJVExFPkFwYWNoZSAxLjMgRHluYW1pYyBTaGFyZWQgT2JqZWN0IChEU08pIHN1cHBvcnQ8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLQotPEgxPkFwYWNoZSAxLjMgRHluYW1pYyBTaGFyZWQgT2JqZWN0IChEU08pIHN1cHBvcnQ8L0gxPgotCi08UD48SFI+PFA+Ci0KLTxhZGRyZXNzPk9yaWdpbmFsbHkgd3JpdHRlbiBieSBSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBBcHJpbCAxOTk4PC9hZGRyZXNzPgotCi08SDM+QmFja2dyb3VuZDwvSDM+Ci0KLTxQPk9uIG1vZGVybiBVbml4IGRlcml2YXRpdmVzIHRoZXJlIGV4aXN0cyBhIG5pZnR5IG1lY2hhbmlzbSB1c3VhbGx5Ci0gY2FsbGVkIGR5bmFtaWMgbGlua2luZy9sb2FkaW5nIG9mIER5bmFtaWMgU2hhcmVkIE9iamVjdHMgKERTTykgd2hpY2gKLSBwcm92aWRlcyBhIHdheSB0byBidWlsZCBhIHBpZWNlIG9mIHByb2dyYW0gY29kZSBpbiBhIHNwZWNpYWwgZm9ybWF0Ci0gZm9yIGxvYWRpbmcgaXQgYXQgcnVuLXRpbWUgaW50byB0aGUgYWRkcmVzcyBzcGFjZSBvZiBhbiBleGVjdXRhYmxlCi0gcHJvZ3JhbS4KLQotPFA+VGhpcyBsb2FkaW5nIGNhbiB1c3VhbGx5IGJlIGRvbmUgaW4gdHdvIHdheXM6IEF1dG9tYXRpY2FsbHkgYnkgYQotIHN5c3RlbSBwcm9ncmFtIGNhbGxlZCA8Q09ERT5sZC5zbzwvQ09ERT4gd2hlbiBhbiBleGVjdXRhYmxlIHByb2dyYW0KLSBpcyBzdGFydGVkIG9yIG1hbnVhbGx5IGZyb20gd2l0aGluIHRoZSBleGVjdXRpbmcgcHJvZ3JhbSB2aWEgYQotIHByb2dyYW1tYXRpYyBzeXN0ZW0gaW50ZXJmYWNlIHRvIHRoZSBVbml4IGxvYWRlciB0aHJvdWdoIHRoZSBzeXN0ZW0KLSBjYWxscyA8Q09ERT5kbG9wZW4oKS9kbHN5bSgpPC9DT0RFPi4KLSAKLTxQPkluIHRoZSBmaXJzdCB3YXkgdGhlIERTTydzIGFyZSB1c3VhbGx5IGNhbGxlZCAic2hhcmVkIGxpYnJhcmllcyIgb3IKLSAiRFNPIGxpYnJhcmllcyIgYW5kIG5hbWVkIDxDT0RFPmxpYmZvby5zbzwvQ09ERT4gb3IKLSA8Q09ERT5saWJmb28uc28uMS4yPC9DT0RFPi4gVGhleSByZXNpZGUgaW4gYSBzeXN0ZW0gZGlyZWN0b3J5Ci0gKHVzdWFsbHkgPENPREU+L3Vzci9saWI8L0NPREU+KSBhbmQgdGhlIGxpbmsgdG8gdGhlIGV4ZWN1dGFibGUKLSBwcm9ncmFtIGlzIGVzdGFibGlzaGVkIGF0IGxpbmstdGltZSBieSBzcGVjaWZ5aW5nIDxDT0RFPi1sZm9vPC9DT0RFPgotIHRvIHRoZSBsaW5rZXIgY29tbWFuZC4gVGhpcyBoYXJkY29kZXMgbGlicmFyeSByZWZlcmVuY2VzIGludG8gdGhlCi0gZXhlY3V0YWJsZSBwcm9ncmFtIGZpbGUgc28gdGhhdCBhdCBzdGFydC10aW1lIHRoZSBVbml4IGxvYWRlciBpcyBhYmxlCi0gdG8gbG9jYXRlIDxDT0RFPmxpYmZvby5zbzwvQ09ERT4gaW4gPENPREU+L3Vzci9saWI8L0NPREU+IG9yIGluIHBhdGhzCi0gY29uZmlndXJlZCB2aWEgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi0gPENPREU+TERfTElCUkFSWV9QQVRIPC9DT0RFPi4gSXQgdGhlbiByZXNvbHZlcyBhbnkgKHlldCB1bnJlc29sdmVkKQotIHN5bWJvbHMgaW4gdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSB3aGljaCBhcmUgYXZhaWxhYmxlIGluIHRoZSBEU08uCi0gCi08UD5TeW1ib2xzIGluIHRoZSBleGVjdXRhYmxlIHByb2dyYW0gYXJlIHVzdWFsbHkgbm90IHJlZmVyZW5jZWQgYnkgdGhlCi0gRFNPIChiZWNhdXNlIGl0J3MgYSByZXVzZWFibGUgbGlicmFyeSBvZiBnZW5lcmFsIGNvZGUpIGFuZCBoZW5jZSBubwotIGZ1cnRoZXIgcmVzb2x2aW5nIGhhcyB0byBiZSBkb25lLiBUaGUgZXhlY3V0YWJsZSBwcm9ncmFtIGhhcyBubyBuZWVkCi0gdG8gZG8gYW55dGhpbmcgb24gaXRzIG93biB0byB1c2UgdGhlIHN5bWJvbHMgZnJvbSB0aGUgRFNPIGJlY2F1c2UgdGhlCi0gY29tcGxldGUgcmVzb2x2aW5nIGlzIGRvbmUgYnkgdGhlIFVuaXggbG9hZGVyLiAoSW4gZmFjdCwgdGhlIGNvZGUgdG8KLSBpbnZva2UgPENPREU+bGQuc288L0NPREU+IGlzIHBhcnQgb2YgdGhlIHJ1bi10aW1lIHN0YXJ0dXAgY29kZSB3aGljaAotIGlzIGxpbmtlZCBpbnRvIGV2ZXJ5IGV4ZWN1dGFibGUgcHJvZ3JhbSB3aGljaCBoYXMgYmVlbiBib3VuZAotIG5vbi1zdGF0aWMpLiBUaGUgYWR2YW50YWdlIG9mIGR5bmFtaWMgbG9hZGluZyBvZiBjb21tb24gbGlicmFyeSBjb2RlCi0gaXMgb2J2aW91czogdGhlIGxpYnJhcnkgY29kZSBuZWVkcyB0byBiZSBzdG9yZWQgb25seSBvbmNlLCBpbiBhCi0gc3lzdGVtIGxpYnJhcnkgbGlrZSA8Q09ERT5saWJjLnNvPC9DT0RFPiwgc2F2aW5nIGRpc2sgc3BhY2UgZm9yIGV2ZXJ5Ci0gcHJvZ3JhbS4KLQotPFA+SW4gdGhlIHNlY29uZCB3YXkgdGhlIERTTydzIGFyZSB1c3VhbGx5IGNhbGxlZCAic2hhcmVkIG9iamVjdHMiIG9yCi0gIkRTTyBmaWxlcyIgYW5kIGNhbiBiZSBuYW1lZCB3aXRoIGFuIGFyYml0cmFyeSBleHRlbnNpb24gKGFsdGhvdWdoCi0gdGhlIGNhbm9uaWNhbCBuYW1lIGlzIDxDT0RFPmZvby5zbzwvQ09ERT4pLiBUaGVzZSBmaWxlcyB1c3VhbGx5IHN0YXkKLSBpbnNpZGUgYSBwcm9ncmFtLXNwZWNpZmljIGRpcmVjdG9yeSBhbmQgdGhlcmUgaXMgbm8gYXV0b21hdGljYWxseQotIGVzdGFibGlzaGVkIGxpbmsgdG8gdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSB3aGVyZSB0aGV5IGFyZQotIHVzZWQuIEluc3RlYWQgdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSBtYW51YWxseSBsb2FkcyB0aGUgRFNPIGF0Ci0gcnVuLXRpbWUgaW50byBpdHMgYWRkcmVzcyBzcGFjZSB2aWEgPENPREU+ZGxvcGVuKCk8L0NPREU+LiBBdCB0aGlzCi0gdGltZSBubyByZXNvbHZpbmcgb2Ygc3ltYm9scyBmcm9tIHRoZSBEU08gZm9yIHRoZSBleGVjdXRhYmxlIHByb2dyYW0KLSBpcyBkb25lLiBCdXQgaW5zdGVhZCB0aGUgVW5peCBsb2FkZXIgYXV0b21hdGljYWxseSByZXNvbHZlcyBhbnkgKHlldAotIHVucmVzb2x2ZWQpIHN5bWJvbHMgaW4gdGhlIERTTyBmcm9tIHRoZSBzZXQgb2Ygc3ltYm9scyBleHBvcnRlZCBieQotIHRoZSBleGVjdXRhYmxlIHByb2dyYW0gYW5kIGl0cyBhbHJlYWR5IGxvYWRlZCBEU08gbGlicmFyaWVzCi0gKGVzcGVjaWFsbHkgYWxsIHN5bWJvbHMgZnJvbSB0aGUgdWJpcXVpdG91cyA8Q09ERT5saWJjLnNvPC9DT0RFPikuCi0gVGhpcyB3YXkgdGhlIERTTyBnZXRzIGtub3dsZWRnZSBvZiB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtJ3Mgc3ltYm9sCi0gc2V0IGFzIGlmIGl0IGhhZCBiZWVuIHN0YXRpY2FsbHkgbGlua2VkIHdpdGggaXQgaW4gdGhlIGZpcnN0IHBsYWNlLgotIAotPFA+RmluYWxseSwgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIERTTydzIEFQSSB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtCi0gaGFzIHRvIHJlc29sdmUgcGFydGljdWxhciBzeW1ib2xzIGZyb20gdGhlIERTTyB2aWEKLSA8Q09ERT5kbHN5bSgpPC9DT0RFPiBmb3IgbGF0ZXIgdXNlIGluc2lkZSBkaXNwYXRjaCB0YWJsZXMgZXRjLiBJbgotIG90aGVyIHdvcmRzOiBUaGUgZXhlY3V0YWJsZSBwcm9ncmFtIGhhcyB0byBtYW51YWxseSByZXNvbHZlIGV2ZXJ5Ci0gc3ltYm9sIGl0IG5lZWRzIHRvIGJlIGFibGUgdG8gdXNlIGl0LiAgVGhlIGFkdmFudGFnZSBvZiBzdWNoIGEKLSBtZWNoYW5pc20gaXMgdGhhdCBvcHRpb25hbCBwcm9ncmFtIHBhcnRzIG5lZWQgbm90IGJlIGxvYWRlZCAoYW5kIHRodXMKLSBkbyBub3Qgc3BlbmQgbWVtb3J5KSB1bnRpbCB0aGV5IGFyZSBuZWVkZWQgYnkgdGhlIHByb2dyYW0gaW4KLSBxdWVzdGlvbi4gV2hlbiByZXF1aXJlZCwgdGhlc2UgcHJvZ3JhbSBwYXJ0cyBjYW4gYmUgbG9hZGVkCi0gZHluYW1pY2FsbHkgdG8gZXh0ZW5kIHRoZSBiYXNlIHByb2dyYW0ncyBmdW5jdGlvbmFsaXR5LgotCi08UD5BbHRob3VnaCB0aGlzIERTTyBtZWNoYW5pc20gc291bmRzIHN0cmFpZ2h0Zm9yd2FyZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUKLSBkaWZmaWN1bHQgc3RlcCBoZXJlOiBUaGUgcmVzb2x2aW5nIG9mIHN5bWJvbHMgZnJvbSB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtIGZvcgotIHRoZSBEU08gd2hlbiB1c2luZyBhIERTTyB0byBleHRlbmQgYSBwcm9ncmFtICh0aGUgc2Vjb25kIHdheSkuIFdoeT8gQmVjYXVzZQotIGByZXZlcnNlIHJlc29sdmluZycgRFNPIHN5bWJvbHMgZnJvbSB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtJ3Mgc3ltYm9sIHNldCBpcwotIGFnYWluc3QgdGhlIGxpYnJhcnkgZGVzaWduICh3aGVyZSB0aGUgbGlicmFyeSBoYXMgbm8ga25vd2xlZGdlIGFib3V0IHRoZQotIHByb2dyYW1zIGl0IGlzIHVzZWQgYnkpIGFuZCBpcyBuZWl0aGVyIGF2YWlsYWJsZSB1bmRlciBhbGwgcGxhdGZvcm1zIG5vcgotIHN0YW5kYXJkaXplZC4gSW4gcHJhY3RpY2UgdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSdzIGdsb2JhbCBzeW1ib2xzIGFyZSBvZnRlbgotIG5vdCByZS1leHBvcnRlZCBhbmQgdGh1cyBub3QgYXZhaWxhYmxlIGZvciB1c2UgaW4gYSBEU08uICBGaW5kaW5nIGEgd2F5IHRvCi0gZm9yY2UgdGhlIGxpbmtlciB0byBleHBvcnQgYWxsIGdsb2JhbCBzeW1ib2xzIGlzIHRoZSBtYWluIHByb2JsZW0gb25lIGhhcyB0bwotIHNvbHZlIHdoZW4gdXNpbmcgRFNPIGZvciBleHRlbmRpbmcgYSBwcm9ncmFtIGF0IHJ1bi10aW1lLgotCi08SDM+UHJhY3RpY2FsIFVzYWdlPC9IMz4KLQotPFA+VGhlIHNoYXJlZCBsaWJyYXJ5IGFwcHJvYWNoIGlzIHRoZSB0eXBpY2FsIG9uZSwgYmVjYXVzZSBpdCBpcyB3aGF0IHRoZSBEU08KLSBtZWNoYW5pc20gd2FzIGRlc2lnbmVkIGZvciwgaGVuY2UgaXQgaXMgdXNlZCBmb3IgbmVhcmx5IGFsbCB0eXBlcyBvZgotIGxpYnJhcmllcyB0aGUgb3BlcmF0aW5nIHN5c3RlbSBwcm92aWRlcy4gT24gdGhlIG90aGVyIGhhbmQgdXNpbmcgc2hhcmVkCi0gb2JqZWN0cyBmb3IgZXh0ZW5kaW5nIGEgcHJvZ3JhbSBpcyBub3QgdXNlZCBieSBhIGxvdCBvZiBwcm9ncmFtcy4KLQotPFA+QXMgb2YgMTk5OCB0aGVyZSBhcmUgb25seSBhIGZldyBzb2Z0d2FyZSBwYWNrYWdlcyBhdmFpbGFibGUgd2hpY2ggdXNlIHRoZSBEU08KLSBtZWNoYW5pc20gdG8gYWN0dWFsbHkgZXh0ZW5kIHRoZWlyIGZ1bmN0aW9uYWxpdHkgYXQgcnVuLXRpbWU6IFBlcmwgNSAodmlhIGl0cwotIFhTIG1lY2hhbmlzbSBhbmQgdGhlIER5bmFMb2FkZXIgbW9kdWxlKSwgR0lNUCwgTmV0c2NhcGUgU2VydmVyLCBldGMuCi0gU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDEuMywgQXBhY2hlIGpvaW5lZCB0aGUgY3JldywgYmVjYXVzZSBBcGFjaGUgYWxyZWFkeQotIHVzZXMgYSBtb2R1bGUgY29uY2VwdCB0byBleHRlbmQgaXRzIGZ1bmN0aW9uYWxpdHkgYW5kIGludGVybmFsbHkgdXNlcyBhCi0gZGlzcGF0Y2gtbGlzdC1iYXNlZCBhcHByb2FjaCB0byBsaW5rIGV4dGVybmFsIG1vZHVsZXMgaW50byB0aGUgQXBhY2hlIGNvcmUKLSBmdW5jdGlvbmFsaXR5LiBTbywgQXBhY2hlIGlzIHJlYWxseSBwcmVkZXN0aW5lZCBmb3IgdXNpbmcgRFNPIHRvIGxvYWQgaXRzCi0gbW9kdWxlcyBhdCBydW4tdGltZS4KLQotPFA+QXMgb2YgQXBhY2hlIDEuMywgdGhlIGNvbmZpZ3VyYXRpb24gc3lzdGVtIHN1cHBvcnRzIHR3byBvcHRpb25hbCBmZWF0dXJlcyBmb3IKLSB0YWtpbmcgYWR2YW50YWdlIG9mIHRoZSBtb2R1bGFyIERTTyBhcHByb2FjaDogY29tcGlsYXRpb24gb2YgdGhlIEFwYWNoZSBjb3JlCi0gcHJvZ3JhbSBpbnRvIGEgRFNPIGxpYnJhcnkgZm9yIHNoYXJlZCB1c2FnZSBhbmQgY29tcGlsYXRpb24gb2YgdGhlIEFwYWNoZQotIG1vZHVsZXMgaW50byBEU08gZmlsZXMgZm9yIGV4cGxpY2l0IGxvYWRpbmcgYXQgcnVuLXRpbWUuCi0KLTxIMz5JbXBsZW1lbnRhdGlvbjwvSDM+Ci0KLTxQPiBUaGUgRFNPIHN1cHBvcnQgZm9yIGxvYWRpbmcgaW5kaXZpZHVhbCBBcGFjaGUgbW9kdWxlcyBpcyBiYXNlZCBvbiBhIG1vZHVsZQotIG5hbWVkIG1vZF9zby5jIHdoaWNoIGhhcyB0byBiZSBzdGF0aWNhbGx5IGNvbXBpbGVkIGludG8gdGhlIEFwYWNoZSBjb3JlLiBJdAotIGlzIHRoZSBvbmx5IG1vZHVsZSBiZXNpZGVzIGh0dHBfY29yZS5jIHdoaWNoIGNhbm5vdCBiZSBwdXQgaW50byBhIERTTyBpdHNlbGYKLSAoYm9vdHN0cmFwcGluZyEpLiBQcmFjdGljYWxseSBhbGwgb3RoZXIgZGlzdHJpYnV0ZWQgQXBhY2hlIG1vZHVsZXMgdGhlbiBjYW4KLSB0aGVuIGJlIHBsYWNlZCBpbnRvIGEgRFNPIGJ5IGluZGl2aWR1YWxseSBlbmFibGluZyB0aGUgRFNPIGJ1aWxkIGZvciB0aGVtIHZpYQotIGNvbmZpZ3VyZSdzIC0tZW5hYmxlLXNoYXJlZCBvcHRpb24gKHNlZSAuLi9JTlNUQUxMIGZpbGUpIG9yIGJ5IGNoYW5naW5nIHRoZQotIGBBZGRNb2R1bGUnIGNvbW1hbmQgaW4gc3JjL0NvbmZpZ3VyYXRpb24udG1wbCBpbnRvIGEgYFNoYXJlZE1vZHVsZScgY29tbWFuZAotIChzZWUgLi9JTlNUQUxMIGZpbGUpLiAgQWZ0ZXIgYSBtb2R1bGUgaXMgY29tcGlsZWQgaW50byBhIERTTyBuYW1lZCBtb2RfZm9vLnNvCi0geW91IGNhbiB1c2UgbW9kX3NvJ3MgYExvYWRNb2R1bGUnIGNvbW1hbmQgaW4geW91ciBodHRwZC5jb25mIGZpbGUgdG8gbG9hZAotIHRoaXMgbW9kdWxlIGF0IHNlcnZlciBzdGFydHVwIG9yIHJlc3RhcnQuCi0KLTxQPlRvIHNpbXBsaWZ5IHRoaXMgY3JlYXRpb24gb2YgRFNPIGZpbGVzIGZvciBBcGFjaGUgbW9kdWxlcyAoZXNwZWNpYWxseSBmb3IKLSB0aGlyZC1wYXJ0eSBtb2R1bGVzKSBhIG5ldyBzdXBwb3J0IHByb2dyYW0gbmFtZWQgYGFweHMnIGlzIGF2YWlsYWJsZS4gSXQgY2FuCi0gYmUgdXNlZCB0byBidWlsZCBEU08gYmFzZWQgbW9kdWxlcyBfb3V0c2lkZSBvZl8gdGhlIEFwYWNoZSBzb3VyY2UgdHJlZS4gVGhlCi0gaWRlYSBpcyBzaW1wbGU6IFdoZW4gaW5zdGFsbGluZyBBcGFjaGUgdGhlIGNvbmZpZ3VyZSdzICJtYWtlIGluc3RhbGwiCi0gcHJvY2VkdXJlIGluc3RhbGxzIHRoZSBBcGFjaGUgQyBoZWFkZXIgZmlsZXMgYW5kIHB1dHMgdGhlIHBsYXRmb3JtLWRlcGVuZGVuZAotIGNvbXBpbGVyIGFuZCBsaW5rZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIERTTyBmaWxlcyBpbnRvIHRoZSBgYXB4cycgcHJvZ3JhbS4KLSBUaGlzIHdheSB0aGUgdXNlciBjYW4gdXNlIGBhcHhzJyB0byBjb21waWxlIGhpcyBBcGFjaGUgbW9kdWxlIHNvdXJjZXMgd2l0aG91dAotIHRoZSBBcGFjaGUgZGlzdHJpYnV0aW9uIHNvdXJjZSB0cmVlIGFuZCB3aXRob3V0IGhhdmluZyB0byBmaWRkbGUgd2l0aCB0aGUKLSBwbGF0Zm9ybS1kZXBlbmRlbmQgY29tcGlsZXIgYW5kIGxpbmtlciBmbGFncyBmb3IgRFNPIHN1cHBvcnQuCi0KLTxQPlRvIHBsYWNlIHRoZSBjb21wbGV0ZSBBcGFjaGUgY29yZSBwcm9ncmFtIGludG8gYSBEU08gbGlicmFyeSAob25seSByZXF1aXJlZAotIG9uIHNvbWUgb2YgdGhlIHN1cHBvcnRlZCBwbGF0Zm9ybXMgdG8gZm9yY2UgdGhlIGxpbmtlciB0byBleHBvcnQgdGhlIGFwYWNoZQotIGNvcmUgc3ltYm9scyAtLSBhIHByZXJlcXVpc2l0ZSBmb3IgdGhlIERTTyBtb2R1bGFyaXphdGlvbikgdGhlIHJ1bGUKLSBTSEFSRURfQ09SRSBoYXMgdG8gYmUgZW5hYmxlZCB2aWEgY29uZmlndXJlJ3MgLS1lbmFibGUtcnVsZT1TSEFSRURfQ09SRQotIG9wdGlvbiAoc2VlIC4uL0lOU1RBTEwgZmlsZSkgb3IgYnkgY2hhbmdpbmcgdGhlIFJ1bGUgY29tbWFuZCBpbgotIENvbmZpZ3VyYXRpb24udG1wbCB0byAiUnVsZSBTSEFSRURfQ09SRT15ZXMiIChzZWUgLi9JTlNUQUxMIGZpbGUpLiBUaGUgQXBhY2hlCi0gY29yZSBjb2RlIGlzIHRoZW4gcGxhY2VkIGludG8gYSBEU08gbGlicmFyeSBuYW1lZCBsaWJodHRwZC5zby4gQmVjYXVzZSBvbmUKLSBjYW5ub3QgbGluayBhIERTTyBhZ2FpbnN0IHN0YXRpYyBsaWJyYXJpZXMsIGFuIGFkZGl0aW9uYWwgZXhlY3V0YWJsZSBwcm9ncmFtCi0gbmFtZWQgbGliaHR0cGQuZXAgaXMgY3JlYXRlZCB3aGljaCBib3RoIGJpbmRzIHRoaXMgc3RhdGljIGNvZGUgYW5kIHByb3ZpZGVzIGEKLSBzdHViIGZvciB0aGUgbWFpbigpIGZ1bmN0aW9uLiBGaW5hbGx5IHRoZSBodHRwZCBleGVjdXRhYmxlIHByb2dyYW0gaXRzZWxmIGlzCi0gcmVwbGFjZWQgYnkgYSBib290c3RyYXBwaW5nIGNvZGUgd2hpY2ggYXV0b21hdGljYWxseSBtYWtlcyBzdXJlIHRoZSBVbml4Ci0gbG9hZGVyIGlzIGFibGUgdG8gbG9hZCBhbmQgc3RhcnQgbGliaHR0cGQuZXAgYnkgcHJvdmlkaW5nIHRoZSBMRF9MSUJSQVJZX1BBVEgKLSB0byBsaWJodHRwZC5zby4KLQotPEgzPlN1cHBvcnRlZCBQbGF0Zm9ybXM8L0gzPgotCi08UD5BcGFjaGUncyBzcmMvQ29uZmlndXJlIHNjcmlwdCBjdXJyZW50bHkgaGFzIG9ubHkgbGltaXRlZCBidWlsdC1pbiBrbm93bGVkZ2UKLSBvbiBob3cgdG8gY29tcGlsZSBEU08gZmlsZXMgYmVjYXVzZSAoYXMgYWxyZWFkeSBtZW50aW9uZWQpIHRoaXMgaXMgaGVhdmlseQotIHBsYXRmb3JtLWRlcGVuZGVudC4gTmV2ZXJ0aGVsZXNzIGFsbCBtYWpvciBVbml4IHBsYXRmb3JtcyBhcmUgc3VwcG9ydGVkLiAgVGhlCi0gZGVmaW5pdGl2ZSBjdXJyZW50IHN0YXRlIChNYXkgMTk5OCkgaXMgdGhpczoKLQotPFBSRT4KLSBPdXQtb2YtdGhlLWJveCBzdXBwb3J0ZWQgcGxhdGZvcm1zOgotIChhY3R1YWxseSB0ZXN0ZWQgdmVyc2lvbnMgaW4gcGFyZW50aGVzaXMpCi0KLSAgIG8gIEZyZWVCU0QgICAgICAgICAgICAoMi4xLjUsIDIuMi41LCAyLjIuNikKLSAgIG8gIE9wZW5CU0QgICAgICAgICAgICAoMi54KQotICAgbyAgTmV0QlNEICAgICAgICAgICAgICgxLjMuMSkKLSAgIG8gIExpbnV4ICAgICAgICAgICAgICAoRGViaWFuLzEuMy4xLCBSZWRIYXQvNC4yKQotICAgbyAgU29sYXJpcyAgICAgICAgICAgICgyLjQsIDIuNS4xLCAyLjYpCi0gICBvICBTdW5PUyAgICAgICAgICAgICAgKDQuMS4zKQotICAgbyAgT1NGMSAgICAgICAgICAgICAgICg0LjApCi0gICBvICBJUklYICAgICAgICAgICAgICAgKDYuMikKLSAgIG8gIEhQL1VYICAgICAgICAgICAgICAoMTAuMjApCi0gICBvICBVbml4V2FyZSAgICAgICAgICAgKDIuMDEsIDIuMS4yKQotICAgbyAgQUlYICAgICAgICAgICAgICAgICgzLjIsIDQuMS41LCA0LjIsIDQuMykKLSAgIG8gIFJlbGlhbnRVTklYL1NJTklYICAoNS40MykKLSAgIG8gIFNWUjQgICAgICAgICAgICAgICAoLSkKLQotIEV4cGxpY2l0bHkgdW5zdXBwb3J0ZWQgcGxhdGZvcm1zOgotCi0gICBvICBVbHRyaXg6IFRoZXJlIGlzIG5vIGRsb3Blbi1zdHlsZSBpbnRlcmZhY2UgdW5kZXIgdGhpcyBwbGF0Zm9ybS4KLTwvUFJFPgotCi0KLTxIMz5Vc2FnZSBTdW1tYXJ5PC9IMz4KLQotPFA+VG8gZ2l2ZSB5b3UgYW4gb3ZlcnZpZXcgb2YgdGhlIERTTyBmZWF0dXJlcyBvZiBBcGFjaGUgMS4zLCBoZXJlIGlzCi0gYSBzaG9ydCBhbmQgY29uY2lzZSBzdW1tYXJ5OgotCi08T0w+Ci0KLTxMST5QbGFjaW5nIHRoZSBBcGFjaGUgY29yZSBjb2RlIChhbGwgdGhlIHN0dWZmIHdoaWNoIHVzdWFsbHkgZm9ybXMKLSAgICB0aGUgaHR0cGQgYmluYXJ5KSBpbnRvIGEgRFNPIGxpYmh0dHBkLnNvLCBhbiBleGVjdXRhYmxlIHByb2dyYW0KLSAgICBsaWJodHRwZC5lcCBhbmQgYSBib290c3RyYXBwaW5nIGV4ZWN1dGFibGUgcHJvZ3JhbSBodHRwZCAoTm90aWNlOgotICAgIHRoaXMgaXMgb25seSByZXF1aXJlZCBvbiBzb21lIG9mIHRoZSBzdXBwb3J0ZWQgcGxhdGZvcm1zIHRvIGZvcmNlCi0gICAgdGhlIGxpbmtlciB0byBleHBvcnQgdGhlIEFwYWNoZSBjb3JlIHN5bWJvbHMsIHdoaWNoIGluIHR1cm4gaXMgYQotICAgIHByZXJlcXVpc2l0ZSBmb3IgdGhlIERTTyBtb2R1bGFyaXphdGlvbik6Ci0KLTxQUkU+Ci0gICBvIEJ1aWxkIGFuZCBpbnN0YWxsIHZpYSBjb25maWd1cmUgKHByZWZlcnJlZCk6Ci0gICAgICQgLi9jb25maWd1cmUgLS1wcmVmaXg9L3BhdGgvdG8vaW5zdGFsbAotICAgICAgICAgICAgICAgICAgIC0tZW5hYmxlLXJ1bGU9U0hBUkVEX0NPUkUgLi4uCi0gICAgICQgbWFrZSBpbnN0YWxsCi0KLSAgIG8gQnVpbGQgYW5kIGluc3RhbGwgbWFudWFsbHk6IAotICAgICAtIEVkaXQgc3JjL0NvbmZpZ3VyYXRpb246Ci0gICAgICAgPDwgIlJ1bGUgU0hBUkVEX0NPUkU9ZGVmYXVsdCIKLSAgICAgICA+PiAiUnVsZSBTSEFSRURfQ09SRT15ZXMiCi0gICAgICAgPDwgIkVYVFJBX0NGTEFHUz0gIgotICAgICAgID4+ICJFWFRSQV9DRkxBR1M9IC1EU0hBUkVEX0NPUkVfRElSPVwiL3BhdGgvdG8vaW5zdGFsbC9saWJleGVjXCIKLSAgICAgJCBtYWtlIAotICAgICAkIGNwIHNyYy9saWJodHRwZC5zbyogL3BhdGgvdG8vaW5zdGFsbC9saWJleGVjLwotICAgICAkIGNwIHNyYy9saWJodHRwZC5lcCAgL3BhdGgvdG8vaW5zdGFsbC9saWJleGVjLwotICAgICAkIGNwIHNyYy9odHRwZCAgICAgICAgL3BhdGgvdG8vaW5zdGFsbC9iaW4vCi08L1BSRT4gICAgCi0KLTxMST5CdWlsZCBhbmQgaW5zdGFsbCBhIGRpc3RyaWJ1dGVkIEFwYWNoZSBtb2R1bGUsIHNheSBtb2RfZm9vLmMsIAotICAgIGludG8gaXRzIG93biBEU08gbW9kX2Zvby5zbzoKLQotPFBSRT4KLSAgIG8gQnVpbGQgYW5kIGluc3RhbGwgdmlhIGNvbmZpZ3VyZSAocHJlZmVycmVkKToKLSAgICAgJCAuL2NvbmZpZ3VyZSAtLXByZWZpeD0vcGF0aC90by9pbnN0YWxsCi0gICAgICAgICAgICAgLS1lbmFibGUtc2hhcmVkPWZvbwotICAgICAkIG1ha2UgaW5zdGFsbAotCi0gICBvIEJ1aWxkIGFuZCBpbnN0YWxsIG1hbnVhbGx5OiAKLSAgICAgLSBFZGl0IHNyYy9Db25maWd1cmF0aW9uOgotICAgICAgIDw8ICJBZGRNb2R1bGUgICAgbW9kdWxlcy94eHh4L21vZF9mb28ubyIgCi0gICAgICAgPj4gIlNoYXJlZE1vZHVsZSBtb2R1bGVzL3h4eHgvbW9kX2Zvby5zbyIKLSAgICAgJCBtYWtlCi0gICAgICQgY3Agc3JjL3h4eHgvbW9kX2Zvby5zbyAvcGF0aC90by9pbnN0YWxsL2xpYmV4ZWMKLSAgICAgLSBFZGl0IC9wYXRoL3RvL2luc3RhbGwvZXRjL2h0dHBkLmNvbmYKLSAgICAgICA+PiAiTG9hZE1vZHVsZSBmb29fbW9kdWxlIC9wYXRoL3RvL2luc3RhbGwvbGliZXhlYy9tb2RfZm9vLnNvIgotPC9QUkU+Ci0KLTxMST5CdWlsZCBhbmQgaW5zdGFsbCBhIHRoaXJkLXBhcnR5IEFwYWNoZSBtb2R1bGUsIHNheSBtb2RfZm9vLmMsIAotICAgIGludG8gaXRzIG93biBEU08gbW9kX2Zvby5zbwotCi08UFJFPgotICAgbyBCdWlsZCBhbmQgaW5zdGFsbCB2aWEgY29uZmlndXJlIChwcmVmZXJyZWQpOgotICAgICAkIC4vY29uZmlndXJlIC0tYWRkLW1vZHVsZT0vcGF0aC90by8zcmRwYXJ0eS9tb2RfZm9vLmMgCi0gICAgICAgICAgICAgLS1lbmFibGUtc2hhcmVkPWZvbwotICAgICAkIG1ha2UgaW5zdGFsbAotCi0gICBvIEJ1aWxkIGFuZCBpbnN0YWxsIG1hbnVhbGx5OiAKLSAgICAgJCBjcCAvcGF0aC90by8zcmRwYXJ0eS9tb2RfZm9vLmMgL3BhdGgvdG8vYXBhY2hlLTEuMy9zcmMvbW9kdWxlcy9leHRyYS8KLSAgICAgLSBFZGl0IHNyYy9Db25maWd1cmF0aW9uOgotICAgICAgID4+ICJTaGFyZWRNb2R1bGUgbW9kdWxlcy9leHRyYS9tb2RfZm9vLnNvIgotICAgICAkIG1ha2UKLSAgICAgJCBjcCBzcmMveHh4eC9tb2RfZm9vLnNvIC9wYXRoL3RvL2luc3RhbGwvbGliZXhlYwotICAgICAtIEVkaXQgL3BhdGgvdG8vaW5zdGFsbC9ldGMvaHR0cGQuY29uZgotICAgICAgID4+ICJMb2FkTW9kdWxlIGZvb19tb2R1bGUgL3BhdGgvdG8vaW5zdGFsbC9saWJleGVjL21vZF9mb28uc28iCi08L1BSRT4KLQotPExJPkJ1aWxkIGFuZCBpbnN0YWxsIGEgdGhpcmQtcGFydHkgQXBhY2hlIG1vZHVsZSwgc2F5IG1vZF9mb28uYywgCi0gICAgaW50byBpdHMgb3duIERTTyBtb2RfZm9vLnNvIF9vdXRzaWRlIG9mXyB0aGUgQXBhY2hlIHNvdXJjZSB0cmVlOgotCi08UFJFPgotICAgbyBCdWlsZCBhbmQgaW5zdGFsbCB2aWEgQVBYUzogCi0gICAgICQgY2QgL3BhdGgvdG8vM3JkcGFydHkKLSAgICAgJCBhcHhzIC1jIG1vZF9mb28uYwotICAgICAkIGFweHMgLWkgLWEgLW4gZm9vIG1vZF9mb28uc28KLTwvUFJFPgotCi08L1VMPgotCi08SDM+QWR2YW50YWdlcyAmIERpc2FkdmFudGFnZXM8L0gzPgotCi08UD5UaGUgYWJvdmUgRFNPIGJhc2VkIGZlYXR1cmVzIG9mIEFwYWNoZSAxLjMgaGF2ZSB0aGUgZm9sbG93aW5nIGFkdmFudGFnZXM6Ci0KLTxVTD4KLTxMST4gVGhlIHNlcnZlciBwYWNrYWdlIGlzIG1vcmUgZmxleGlibGUgYXQgcnVuLXRpbWUgYmVjYXVzZSB0aGUgYWN0dWFsIHNlcnZlcgotICAgICBwcm9jZXNzIGNhbiBiZSBhc3NlbWJsZWQgYXQgcnVuLXRpbWUgdmlhIExvYWRNb2R1bGUgaHR0cGQuY29uZgotICAgICBjb25maWd1cmF0aW9uIGNvbW1hbmRzIGluc3RlYWQgb2YgQ29uZmlndXJhdGlvbiBBZGRNb2R1bGUgY29tbWFuZHMgYXQKLSAgICAgYnVpbGQtdGltZS4gRm9yIGluc3RhbmNlIHRoaXMgd2F5IG9uZSBpcyBhYmxlIHRvIHJ1biBkaWZmZXJlbnQgc2VydmVyCi0gICAgIGluc3RhbmNlcyAoc3RhbmRhcmQgJiBTU0wgdmVyc2lvbiwgbWluaW1hbGlzdGljICYgcG93ZXJlZCB1cCB2ZXJzaW9uCi0gICAgIFttb2RfcGVybCwgUEhQM10sIGV0Yy4pIHdpdGggb25seSBvbmUgQXBhY2hlIGluc3RhbGxhdGlvbi4KLQotPExJPiBUaGUgc2VydmVyIHBhY2thZ2UgY2FuIGJlIGVhc2lseSBleHRlbmRlZCB3aXRoIHRoaXJkLXBhcnR5IG1vZHVsZXMgZXZlbgotICAgICBhZnRlciBpbnN0YWxsYXRpb24uIFRoaXMgaXMgYXQgbGVhc3QgYSBncmVhdCBiZW5lZml0IGZvciB2ZW5kb3IgcGFja2FnZQotICAgICBtYWludGFpbmVycyB3aG8gY2FuIGNyZWF0ZSBhIEFwYWNoZSBjb3JlIHBhY2thZ2UgYW5kIGFkZGl0aW9uYWwgcGFja2FnZXMKLSAgICAgY29udGFpbmluZyBleHRlbnNpb25zIGxpa2UgUEhQMywgbW9kX3BlcmwsIG1vZF9mYXN0Y2dpLCBldGMuCi0KLTxMST4gRWFzaWVyIEFwYWNoZSBtb2R1bGUgcHJvdG90eXBpbmcgYmVjYXVzZSB3aXRoIHRoZSBEU08vQVBYUyBwYWlyIHlvdSBjYW4KLSAgICAgYm90aCB3b3JrIG91dHNpZGUgdGhlIEFwYWNoZSBzb3VyY2UgdHJlZSBhbmQgb25seSBuZWVkIGFuIGBhcHhzIC1pJwotICAgICBjb21tYW5kIGZvbGxvd2VkIGJ5IGEgYGFwYWNoZWN0bCByZXN0YXJ0JyB0byBicmluZyBhIG5ldyB2ZXJzaW9uIG9mIHlvdXIKLSAgICAgY3VycmVudGx5IGRldmVsb3BlZCBtb2R1bGUgaW50byB0aGUgcnVubmluZyBBcGFjaGUgc2VydmVyLgotPC9VTD4KLQotPFA+RFNPIGhhcyB0aGUgZm9sbG93aW5nIGRpc2FkdmFudGFnZXM6Ci0KLTxVTD4KLTxMST4gVGhlIERTTyBtZWNoYW5pc20gY2Fubm90IGJlIHVzZWQgb24gZXZlcnkgcGxhdGZvcm0gYmVjYXVzZSBub3QgYWxsCi0gICAgIG9wZXJhdGluZyBzeXN0ZW1zIHN1cHBvcnQgZHluYW1pYyBsb2FkaW5nLgotCi08TEk+IFRoZSBzZXJ2ZXIgaXMgYXBwcm94aW1hdGVseSAyMCUgc2xvd2VyIGF0IHN0YXJ0dXAgdGltZSBiZWNhdXNlIG9mIHRoZQotICAgICBzeW1ib2wgcmVzb2x2aW5nIG92ZXJoZWFkIHRoZSBVbml4IGxvYWRlciBub3cgaGFzIHRvIGRvLgotCi08TEk+IFRoZSBzZXJ2ZXIgaXMgYXBwcm94aW1hdGVseSA1JSBzbG93ZXIgYXQgZXhlY3V0aW9uIHRpbWUgdW5kZXIgc29tZQotICAgICBwbGF0Zm9ybXMgYmVjYXVzZSBwb3NpdGlvbiBpbmRlcGVuZGVkIGNvZGUgKFBJQykgc29tZXRpbWVzIG5lZWRzCi0gICAgIGNvbXBsaWNhdGVkIGFzc2VtYmxlciB0cmlja3MgZm9yIHJlbGF0aXZlIGFkZHJlc3Npbmcgd2hpY2ggYXJlIG5vdAotICAgICBuZWNlc3NhcmlseSBhcyBmYXN0IGFzIGFic29sdXRlIGFkZHJlc3NpbmcuCi0KLTxMST4gQmVjYXVzZSBEU08gbW9kdWxlcyBjYW5ub3QgYmUgbGlua2VkIGFnYWluc3Qgb3RoZXIgRFNPLWJhc2VkIGxpYnJhcmllcwotICAgICAobGQgLWxmb28pIG9uIGFsbCBwbGF0Zm9ybXMgKGZvciBpbnN0YW5jZSBhLm91dC1iYXNlZCBwbGF0Zm9ybXMgdXN1YWxseQotICAgICBkb24ndCBwcm92aWRlIHRoaXMgZnVuY3Rpb25hbGl0eSB3aGlsZSBFTEYtYmFzZWQgcGxhdGZvcm1zIGRvKSB5b3UgY2Fubm90Ci0gICAgIHVzZSB0aGUgRFNPIG1lY2hhbmlzbSBmb3IgYWxsIHR5cGVzIG9mIG1vZHVsZXMuIE9yIGluIG90aGVyIHdvcmRzLAotICAgICBtb2R1bGVzIGNvbXBpbGVkIGFzIERTTyBmaWxlcyBhcmUgcmVzdHJpY3RlZCB0byBvbmx5IHVzZSBzeW1ib2xzIGZyb20gdGhlCi0gICAgIEFwYWNoZSBjb3JlLCBmcm9tIHRoZSBDIGxpYnJhcnkgKGxpYmMpIGFuZCBhbGwgb3RoZXIgZHluYW1pYyBvciBzdGF0aWMKLSAgICAgbGlicmFyaWVzIHVzZWQgYnkgdGhlIEFwYWNoZSBjb3JlLCBvciBmcm9tIHN0YXRpYyBsaWJyYXJ5IGFyY2hpdmVzCi0gICAgIChsaWJmb28uYSkgY29udGFpbmluZyBwb3NpdGlvbiBpbmRlcGVuZGVuZCBjb2RlLiBUaGUgb25seSBjaGFuY2UgdG8gdXNlCi0gICAgIG90aGVyIGNvZGUgaXMgdG8gZWl0aGVyIG1ha2Ugc3VyZSB0aGUgQXBhY2hlIGNvcmUgaXRzZWxmIGFscmVhZHkgY29udGFpbnMKLSAgICAgYSByZWZlcmVuY2UgdG8gaXQgb3IgbG9hZGluZyB0aGUgY29kZSB5b3Vyc2VsZiB2aWEgZGxvcGVuKCkuCi0KLTxMST4gVW5kZXIgc29tZSBwbGF0Zm9ybXMgKG1hbnkgU1ZSNCBzeXN0ZW1zKSB0aGVyZSBpcyBubyB3YXkgdG8gZm9yY2UgdGhlCi0gICAgIGxpbmtlciB0byBleHBvcnQgYWxsIGdsb2JhbCBzeW1ib2xzIGZvciB1c2UgaW4gRFNPJ3Mgd2hlbiBsaW5raW5nIHRoZQotICAgICBBcGFjaGUgaHR0cGQgZXhlY3V0YWJsZSBwcm9ncmFtLiBCdXQgd2l0aG91dCB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgQXBhY2hlCi0gICAgIGNvcmUgc3ltYm9scyBubyBzdGFuZGFyZCBBcGFjaGUgbW9kdWxlIGNvdWxkIGJlIHVzZWQgYXMgYSBEU08uIFRoZSBvbmx5Ci0gICAgIGNoYW5jZSBoZXJlIGlzIHRvIHVzZSB0aGUgU0hBUkVEX0NPUkUgZmVhdHVyZSBiZWNhdXNlIHRoaXMgd2F5IHRoZSBnbG9iYWwKLSAgICAgc3ltYm9scyBhcmUgZm9yY2VkIHRvIGJlIGV4cG9ydGVkLiBBcyBhIGNvbnNlcXVlbmNlIHRoZSBBcGFjaGUKLSAgICAgc3JjL0NvbmZpZ3VyZSBzY3JpcHQgYXV0b21hdGljYWxseSBlbmZvcmNlcyBTSEFSRURfQ09SRSBvbiB0aGVzZQotICAgICBwbGF0Zm9ybXMgd2hlbiBEU08gZmVhdHVyZXMgYXJlIHVzZWQgaW4gdGhlIENvbmZpZ3VyYXRpb24gZmlsZSBvciBvbiB0aGUKLSAgICAgY29uZmlndXJlIGNvbW1hbmQgbGluZS4KLTwvVUw+Ci0KLTxQUkU+Ci0gICAgICAgICAgICAgICAgICAgICBSYWxmIFMuIEVuZ2Vsc2NoYWxsCi0gICAgICAgICAgICAgICAgICAgICByc2VAZW5nZWxzY2hhbGwuY29tCi0gICAgICAgICAgICAgICAgICAgICB3d3cuZW5nZWxzY2hhbGwuY29tCi08L1BSRT4KLQotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotCi0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2Vudi5odG1sIGIvZG9jcy9tYW51YWwvZW52Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZWNmNDEuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvZW52Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDIuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5TcGVjaWFsIFB1cnBvc2UgRW52aXJvbm1lbnQgVmFyaWFibGVzPC9USVRMRT4KLTwvSEVBRD4KLQotPEJPRFk+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPGgxPlNwZWNpYWwgUHVycG9zZSBFbnZpcm9ubWVudCBWYXJpYWJsZXM8L2gxPgotPFA+SW50ZXJvcGVyYWJpbGl0eSBwcm9ibGVtcyBoYXZlIGxlZCB0byB0aGUgaW50cm9kdWN0aW9uIG9mIG1lY2hhbmlzbXMgdG8gbW9kaWZ5Ci10aGUgd2F5IEFwYWNoZSBiZWhhdmVzIHdoZW4gdGFsa2luZyB0byBwYXJ0aWN1bGFyIGNsaWVudHMuIFRvIG1ha2UgdGhlc2UKLW1lY2hhbmlzbXMgYXMgZmxleGlibGUgYXMgcG9zc2libGUsIHRoZXkgYXJlIGludm9rZWQgYnkgZGVmaW5pbmcgZW52aXJvbm1lbnQKLXZhcmlhYmxlcywgdHlwaWNhbGx5IHdpdGggPEEgSFJFRj1tb2QvbW9kX2Jyb3dzZXIuaHRtbCNicm93c2VybWF0Y2g+QnJvd3Nlck1hdGNoPC9BPiwgdGhvdWdoIDxBIEhSRUY9bW9kL21vZF9lbnYuaHRtbCNzZXRlbnY+U2V0RW52PC9BPiBhbmQKLTxBIEhSRUY9bW9kL21vZF9lbnYuaHRtbCNwYXNzZW52PlBhc3NFbnY8L0E+IGNvdWxkIGFsc28gYmUgdXNlZCwgZm9yIGV4YW1wbGUuPC9QPgotPEgyPm5va2VlcGFsaXZlPC9IMj4KLVRoaXMgZGlzYWJsZXMgPEEgSFJFRj1tb2QvY29yZS5odG1sI2tlZXBhbGl2ZT5LZWVwQWxpdmU8L0E+IHdoZW4gc2V0LiBCZWNhdXNlCi1vZiBwcm9ibGVtcyB3aXRoIE5ldHNjYXBlIDIueCBhbmQgS2VlcEFsaXZlLCB3ZSByZWNvbW1lbmQgdGhlIGZvbGxvd2luZwotZGlyZWN0aXZlIGJlIHVzZWQ6Ci08QkxPQ0tRVU9URT48Q09ERT4KLUJyb3dzZXJNYXRjaCBNb3ppbGxhLzIgbm9rZWVwYWxpdmUKLTwvQ09ERT48L0JMT0NLUVVPVEU+Ci08SDI+Zm9yY2UtcmVzcG9uc2UtMS4wPC9IMj4KLVRoaXMgZm9yY2VzIGFuIEhUVFAvMS4wIHJlc3BvbnNlIHdoZW4gc2V0LiBJdCB3YXMgb3JpZ2luYWxseSBpbXBsZW1lbnRlZCBhcyBhCi1yZXN1bHQgb2YgYSBwcm9ibGVtIHdpdGggQU9MJ3MgcHJveGllcy4gU29tZSBjbGllbnRzIG1heSBub3QgYmVoYXZlIGNvcnJlY3RseQotd2hlbiBnaXZlbiBhbiBIVFRQLzEuMSByZXNwb25zZSwgYW5kIHRoaXMgY2FuIGJlIHVzZWQgdG8gaW50ZXJvcGVyYXRlIHdpdGgKLXRoZW0uCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9lbnYuaHRtbC5lbiBiL2RvY3MvbWFudWFsL2Vudi5odG1sLmVuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmVjZjQxLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2Vudi5odG1sLmVuCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCAyLjAvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+U3BlY2lhbCBQdXJwb3NlIEVudmlyb25tZW50IFZhcmlhYmxlczwvVElUTEU+Ci08L0hFQUQ+Ci0KLTxCT0RZPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxoMT5TcGVjaWFsIFB1cnBvc2UgRW52aXJvbm1lbnQgVmFyaWFibGVzPC9oMT4KLTxQPkludGVyb3BlcmFiaWxpdHkgcHJvYmxlbXMgaGF2ZSBsZWQgdG8gdGhlIGludHJvZHVjdGlvbiBvZiBtZWNoYW5pc21zIHRvIG1vZGlmeQotdGhlIHdheSBBcGFjaGUgYmVoYXZlcyB3aGVuIHRhbGtpbmcgdG8gcGFydGljdWxhciBjbGllbnRzLiBUbyBtYWtlIHRoZXNlCi1tZWNoYW5pc21zIGFzIGZsZXhpYmxlIGFzIHBvc3NpYmxlLCB0aGV5IGFyZSBpbnZva2VkIGJ5IGRlZmluaW5nIGVudmlyb25tZW50Ci12YXJpYWJsZXMsIHR5cGljYWxseSB3aXRoIDxBIEhSRUY9bW9kL21vZF9icm93c2VyLmh0bWwjYnJvd3Nlcm1hdGNoPkJyb3dzZXJNYXRjaDwvQT4sIHRob3VnaCA8QSBIUkVGPW1vZC9tb2RfZW52Lmh0bWwjc2V0ZW52PlNldEVudjwvQT4gYW5kCi08QSBIUkVGPW1vZC9tb2RfZW52Lmh0bWwjcGFzc2Vudj5QYXNzRW52PC9BPiBjb3VsZCBhbHNvIGJlIHVzZWQsIGZvciBleGFtcGxlLjwvUD4KLTxIMj5ub2tlZXBhbGl2ZTwvSDI+Ci1UaGlzIGRpc2FibGVzIDxBIEhSRUY9bW9kL2NvcmUuaHRtbCNrZWVwYWxpdmU+S2VlcEFsaXZlPC9BPiB3aGVuIHNldC4gQmVjYXVzZQotb2YgcHJvYmxlbXMgd2l0aCBOZXRzY2FwZSAyLnggYW5kIEtlZXBBbGl2ZSwgd2UgcmVjb21tZW5kIHRoZSBmb2xsb3dpbmcKLWRpcmVjdGl2ZSBiZSB1c2VkOgotPEJMT0NLUVVPVEU+PENPREU+Ci1Ccm93c2VyTWF0Y2ggTW96aWxsYS8yIG5va2VlcGFsaXZlCi08L0NPREU+PC9CTE9DS1FVT1RFPgotPEgyPmZvcmNlLXJlc3BvbnNlLTEuMDwvSDI+Ci1UaGlzIGZvcmNlcyBhbiBIVFRQLzEuMCByZXNwb25zZSB3aGVuIHNldC4gSXQgd2FzIG9yaWdpbmFsbHkgaW1wbGVtZW50ZWQgYXMgYQotcmVzdWx0IG9mIGEgcHJvYmxlbSB3aXRoIEFPTCdzIHByb3hpZXMuIFNvbWUgY2xpZW50cyBtYXkgbm90IGJlaGF2ZSBjb3JyZWN0bHkKLXdoZW4gZ2l2ZW4gYW4gSFRUUC8xLjEgcmVzcG9uc2UsIGFuZCB0aGlzIGNhbiBiZSB1c2VkIHRvIGludGVyb3BlcmF0ZSB3aXRoCi10aGVtLgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvZmFxL2luZGV4Lmh0bWwgYi9kb2NzL21hbnVhbC9mYXEvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBjMTliNy4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9mYXEvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTwhLS0jaWYgZXhwcj0iJFFVRVJZX1NUUklORyA9IE9ORVBBR0UiIC0tPgotICA8IS0tI3NldCB2YXI9Ik9ORVBBR0UiIHZhbHVlPSJZRVMiIC0tPgotPCEtLSNlbHNlIC0tPgotICA8IS0tI3NldCB2YXI9Ik9ORVBBR0UiIHZhbHVlPSIiIC0tPgotPCEtLSNlbmRpZiAtLT4KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotIDxIRUFEPgotICA8VElUTEU+QXBhY2hlIFNlcnZlciBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvVElUTEU+Ci0gPC9IRUFEPgotIDxCT0RZCi0gIEJHQ09MT1I9IiNGRkZGRkYiCi0gIFRFWFQ9IiMwMDAwMDAiCi0gIExJTks9IiMwMDAwRkYiCi0gIFZMSU5LPSIjMDAwMDgwIgotICBBTElOSz0iI0ZGMDAwMCIKLSA+Ci0gIDwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci0gIDxIMSBBTElHTj0iQ0VOVEVSIj5GcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvSDE+Ci0KLSAgPFA+Ci0gIFRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIEZBUSBpcyBhbHdheXMgYXZhaWxhYmxlIGZyb20gdGhlIG1haW4KLSAgQXBhY2hlIHdlYiBzaXRlLCBhdCAmbHQ7PEEKLSAgSFJFRj0iaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvZG9jcy0yLjAvZmFxLyIgUkVMPSJIZWxwIgotICA+PFNBTVA+aHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvZG9jcy0yLjAvZmFxLzwvU0FNUD48L0E+Jmd0Oy4KLSAgPCEtLSNpZiBleHByPSIhJE9ORVBBR0UiIC0tPiBJbiBhZGRpdGlvbiwgeW91IGNhbiB2aWV3IHRoaXMgRkFRIDxhCi0gIGhyZWY9Ii4vP09ORVBBR0UiPmFsbCBpbiBvbmUgcGFnZTwvYT4gZm9yIGVhc3kgc2VhcmNoaW5nIGFuZAotICBwcmludGluZy48IS0tI2VuZGlmIC0tPgotICA8L1A+Ci0KLSAgPHA+U2luY2UgQXBhY2hlIDIuMCBpcyB2ZXJ5IG5ldywgd2UgZG9uJ3QgeWV0IGtub3cgd2hhdCB0aGUKLSAgPGVtPkZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC9lbT4gd2lsbCBiZS4gIFdoaWxlIHRoaXMgc2VjdGlvbgotICBmaWxscyB1cCwgeW91IHNob3VsZCBhbHNvIGNvbnN1bHQgdGhlIDxhCi0gIGhyZWY9Imh0dHA6Ly9odHRwZC5hcGFjaGUub3JnL2RvY3MvbWlzYy9GQVEuaHRtbCI+QXBhY2hlIDEuMyBGQVE8L2E+Ci0gIHRvIHNlZSBpZiB5b3VyIHF1ZXN0aW9uIGlzIGFuc3dlcmVkIHRoZXJlLjwvcD4KLQotCi0KLSAgPEgyPkNhdGVnb3JpZXM8L0gyPgotCi08IS0tI2lmIGV4cHI9IiEkT05FUEFHRSIgLS0+Ci0KLTxkbD4KLQotPGR0PjxhIGhyZWY9InN1cHBvcnQuaHRtbCI+U3VwcG9ydDwvYT48L2R0PgotPGRkPldoYXQgZG8gSSBkbyB3aGVuIEkgaGF2ZSBwcm9ibGVtcz88L2RkPgotCi08L2RsPgotCi08IS0tI2Vsc2UgLS0+Ci0KLTxkbD4KLQotPGR0PjxhIGhyZWY9IiNzdXBwb3J0Lmh0bWwiPlN1cHBvcnQ8L2E+PC9kdD4KLTxkZD5XaGF0IGRvIEkgZG8gd2hlbiBJIGhhdmUgcHJvYmxlbXM/PC9kZD4KLQotPC9kbD4KLQotPGhyPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0ic3VwcG9ydC5odG1sIiAtLT4KLQotPCEtLSNlbmRpZiAtLT4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2ZhcS9zdXBwb3J0Lmh0bWwgYi9kb2NzL21hbnVhbC9mYXEvc3VwcG9ydC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWFhNDIwLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2ZhcS9zdXBwb3J0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotPCEtLSNpZiBleHByPSIhJE9ORVBBR0UiIC0tPgotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci0gPEhFQUQ+Ci0gIDxUSVRMRT5TdXBwb3J0IC0gQXBhY2hlIFNlcnZlciBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvVElUTEU+Ci0gPC9IRUFEPgotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotIDxCT0RZCi0gIEJHQ09MT1I9IiNGRkZGRkYiCi0gIFRFWFQ9IiMwMDAwMDAiCi0gIExJTks9IiMwMDAwRkYiCi0gIFZMSU5LPSIjMDAwMDgwIgotICBBTElOSz0iI0ZGMDAwMCIKLSA+Ci0gIDwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci0gIDxIMSBBTElHTj0iQ0VOVEVSIj5BcGFjaGUgU2VydmVyIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC9IMT4KLTwhLS0jZW5kaWYgLS0+Ci0KLSAgPEgyPjxhIG5hbWU9InN1cHBvcnQuaHRtbCI+U3VwcG9ydDwvYT48L0gyPgotCi08VUw+Ci0gICA8TEk+PEEgSFJFRj0iI3doYXQyZG8iPiZxdW90O1doeSBjYW4ndCBJIC4uLj8gIFdoeSB3b24ndCAuLi4KLSAgICAgICAgd29yaz8mcXVvdDsgIFdoYXQgdG8gZG8gaW4gY2FzZSBvZiBwcm9ibGVtczwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI3N1cHBvcnQiPldob20gZG8gSSBjb250YWN0IGZvciBzdXBwb3J0PzwvQT4KLSAgIDwvTEk+Ci0KLTwvVUw+Ci0KLTxIUj4KLQotIDxIMz48QSBOQU1FPSJ3aGF0MmRvIj4mcXVvdDtXaHkgY2FuJ3QgSSAuLi4/ICBXaHkgd29uJ3QgLi4uIHdvcms/JnF1b3Q7ICAKLQlXaGF0IHRvIGRvIGluIGNhc2Ugb2YgcHJvYmxlbXM8L0E+PC9IMz4KLSAgPFA+Ci0gIElmIHlvdSBhcmUgaGF2aW5nIHRyb3VibGUgd2l0aCB5b3VyIEFwYWNoZSBzZXJ2ZXIgc29mdHdhcmUsIHlvdSBzaG91bGQKLSAgdGFrZSB0aGUgZm9sbG93aW5nIHN0ZXBzOgotICA8L1A+Ci0gIDxPTD4KLSAgIDxMST48U1RST05HPkNoZWNrIHRoZSBlcnJvcmxvZyE8L1NUUk9ORz4KLSAgICA8UD4KLSAgICBBcGFjaGUgdHJpZXMgdG8gYmUgaGVscGZ1bCB3aGVuIGl0IGVuY291bnRlcnMgYSBwcm9ibGVtLiAgSW4gbWFueQotICAgIGNhc2VzLCBpdCB3aWxsIHByb3ZpZGUgc29tZSBkZXRhaWxzIGJ5IHdyaXRpbmcgb25lIG9yIG1lc3NhZ2VzIHRvCi0gICAgdGhlIHNlcnZlciBlcnJvciBsb2cuICBTb21ldGltZXMgdGhpcyBpcyBlbm91Z2ggZm9yIHlvdSB0byBkaWFnbm9zZQotICAgICZhbXA7IGZpeCB0aGUgcHJvYmxlbSB5b3Vyc2VsZiAoc3VjaCBhcyBmaWxlIHBlcm1pc3Npb25zIG9yIHRoZSBsaWtlKS4KLSAgICBUaGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgZXJyb3IgbG9nIGlzCi0gICAgPFNBTVA+L3Vzci9sb2NhbC9hcGFjaGUvbG9ncy9lcnJvcl9sb2c8L1NBTVA+LCBidXQgc2VlIHRoZQotICAgIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjZXJyb3Jsb2ciPjxTQU1QPkVycm9yTG9nPC9TQU1QPjwvQT4KLSAgICBkaXJlY3RpdmUgaW4geW91ciBjb25maWcgZmlsZXMgZm9yIHRoZSBsb2NhdGlvbiBvbiB5b3VyIHNlcnZlci4KLSAgICA8L1A+Ci0gICA8L0xJPgotICAgPExJPjxTVFJPTkc+Q2hlY2sgdGhlCi0gICAgPEEgSFJFRj0iaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvZG9jcy9taXNjL0ZBUS5odG1sIj5GQVE8L0E+ITwvU1RST05HPgotICAgIDxQPgotICAgIFRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgQXBhY2hlIEZyZXF1ZW50bHktQXNrZWQgUXVlc3Rpb25zIGxpc3QgY2FuCi0gICAgYWx3YXlzIGJlIGZvdW5kIGF0IHRoZSBtYWluIEFwYWNoZSB3ZWIgc2l0ZS4KLSAgICA8L1A+Ci0gICA8L0xJPgotICAgPExJPjxTVFJPTkc+Q2hlY2sgdGhlIEFwYWNoZSBidWcgZGF0YWJhc2U8L1NUUk9ORz4KLSAgICA8UD4KLSAgICBNb3N0IHByb2JsZW1zIHRoYXQgZ2V0IHJlcG9ydGVkIHRvIFRoZSBBcGFjaGUgR3JvdXAgYXJlIHJlY29yZGVkIGluCi0gICAgdGhlCi0gICAgPEEgSFJFRj0iaHR0cDovL2J1Z3MuYXBhY2hlLm9yZy8iPmJ1ZyBkYXRhYmFzZTwvQT4uCi0gICAgPEVNPjxTVFJPTkc+UGxlYXNlPC9TVFJPTkc+IGNoZWNrIHRoZSBleGlzdGluZyByZXBvcnRzLCBvcGVuCi0gICAgPFNUUk9ORz5hbmQ8L1NUUk9ORz4gY2xvc2VkLCBiZWZvcmUgYWRkaW5nIG9uZS48L0VNPiAgSWYgeW91IGZpbmQKLSAgICB0aGF0IHlvdXIgaXNzdWUgaGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZCwgcGxlYXNlIDxFTT5kb24ndDwvRU0+IGFkZAotICAgIGEgJnF1b3Q7bWUsIHRvbyZxdW90OyByZXBvcnQuICBJZiB0aGUgb3JpZ2luYWwgcmVwb3J0IGlzbid0IGNsb3NlZAotICAgIHlldCwgd2Ugc3VnZ2VzdCB0aGF0IHlvdSBjaGVjayBpdCBwZXJpb2RpY2FsbHkuICBZb3UgbWlnaHQgYWxzbwotICAgIGNvbnNpZGVyIGNvbnRhY3RpbmcgdGhlIG9yaWdpbmFsIHN1Ym1pdHRlciwgYmVjYXVzZSB0aGVyZSBtYXkgYmUgYW4KLSAgICBlbWFpbCBleGNoYW5nZSBnb2luZyBvbiBhYm91dCB0aGUgaXNzdWUgdGhhdCBpc24ndCBnZXR0aW5nIHJlY29yZGVkCi0gICAgaW4gdGhlIGRhdGFiYXNlLgotICAgIDwvUD4KLSAgIDwvTEk+Ci0gICA8TEk+PFNUUk9ORz5Bc2sgaW4gdGhlIDxTQU1QPmNvbXAuaW5mb3N5c3RlbXMud3d3LnNlcnZlcnMudW5peDwvU0FNUD4KLSAgICBvciA8U0FNUD5jb21wLmluZm9zeXN0ZW1zLnd3dy5zZXJ2ZXJzLm1zLXdpbmRvd3M8L1NBTVA+IFVTRU5FVAotICAgIG5ld3Nncm91cCAoYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBwbGF0Zm9ybSB5b3UgdXNlKS48L1NUUk9ORz4KLSAgICA8UD4KLSAgICBBIGxvdCBvZiBjb21tb24gcHJvYmxlbXMgbmV2ZXIgbWFrZSBpdCB0byB0aGUgYnVnIGRhdGFiYXNlIGJlY2F1c2UKLSAgICB0aGVyZSdzIGFscmVhZHkgaGlnaCBRJmFtcDtBIHRyYWZmaWMgYWJvdXQgdGhlbSBpbiB0aGUKLSAgICA8QSBIUkVGPSJuZXdzOmNvbXAuaW5mb3N5c3RlbXMud3d3LnNlcnZlcnMudW5peCIKLSAgICA+PFNBTVA+Y29tcC5pbmZvc3lzdGVtcy53d3cuc2VydmVycy51bml4PC9TQU1QPjwvQT4KLSAgICBuZXdzZ3JvdXAuICBNYW55IEFwYWNoZSB1c2VycywgYW5kIHNvbWUgb2YgdGhlIGRldmVsb3BlcnMsIGNhbiBiZQotICAgIGZvdW5kIHJvYW1pbmcgaXRzIHZpcnR1YWwgaGFsbHMsIHNvIGl0IGlzIHN1Z2dlc3RlZCB0aGF0IHlvdSBzZWVrCi0gICAgd2lzZG9tIHRoZXJlLiAgVGhlIGNoYW5jZXMgYXJlIGdvb2QgdGhhdCB5b3UnbGwgZ2V0IGEgZmFzdGVyIGFuc3dlcgotICAgIHRoZXJlIHRoYW4gZnJvbSB0aGUgYnVnIGRhdGFiYXNlLCBldmVuIGlmIHlvdSA8RU0+ZG9uJ3Q8L0VNPiBzZWUKLSAgICB5b3VyIHF1ZXN0aW9uIGFscmVhZHkgcG9zdGVkLgotICAgIDwvUD4KLSAgIDwvTEk+Ci0gICA8TEk+PFNUUk9ORz5JZiBhbGwgZWxzZSBmYWlscywgcmVwb3J0IHRoZSBwcm9ibGVtIGluIHRoZSBidWcKLSAgICBkYXRhYmFzZTwvU1RST05HPgotICAgIDxQPgotICAgIElmIHlvdSd2ZSBnb25lIHRocm91Z2ggdGhvc2Ugc3RlcHMgYWJvdmUgdGhhdCBhcmUgYXBwcm9wcmlhdGUgYW5kCi0gICAgaGF2ZSBvYnRhaW5lZCBubyByZWxpZWYsIHRoZW4gcGxlYXNlIDxFTT5kbzwvRU0+IGxldCBUaGUgQXBhY2hlCi0gICAgR3JvdXAga25vdyBhYm91dCB0aGUgcHJvYmxlbSBieQotICAgIDxBIEhSRUY9Imh0dHA6Ly9odHRwZC5hcGFjaGUub3JnL2J1Z19yZXBvcnQuaHRtbCI+bG9nZ2luZyBhIGJ1ZyByZXBvcnQ8L0E+LgotICAgIDwvUD4KLSAgICA8UD4KLSAgICBJZiB5b3VyIHByb2JsZW0gaW52b2x2ZXMgdGhlIHNlcnZlciBjcmFzaGluZyBhbmQgZ2VuZXJhdGluZyBhIGNvcmUKLSAgICBkdW1wLCBwbGVhc2UgaW5jbHVkZSBhIGJhY2t0cmFjZSAoaWYgcG9zc2libGUpLiAgQXMgYW4gZXhhbXBsZSwKLSAgICA8L1A+Ci0gICAgPFA+Ci0gICAgPERMPgotICAgICA8REQ+PENPREU+IyBjZCA8RU0+U2VydmVyUm9vdDwvRU0+PEJSPgotICAgICAgIyBkYnggaHR0cGQgY29yZTxCUj4KLSAgICAgIChkYngpIHdoZXJlPC9DT0RFPgotICAgICA8L0REPgotICAgIDwvREw+Ci0gICAgPFA+PC9QPgotICAgIDxQPgotICAgIChTdWJzdGl0dXRlIHRoZSBhcHByb3ByaWF0ZSBsb2NhdGlvbnMgZm9yIHlvdXIKLSAgICA8U0FNUD5TZXJ2ZXJSb290PC9TQU1QPiBhbmQgeW91ciA8U0FNUD5odHRwZDwvU0FNUD4gYW5kCi0gICAgPFNBTVA+Y29yZTwvU0FNUD4gZmlsZXMuICBZb3UgbWF5IGhhdmUgdG8gdXNlIDxDT0RFPmdkYjwvQ09ERT4KLSAgICBpbnN0ZWFkIG9mIDxDT0RFPmRieDwvQ09ERT4uKQotICAgIDwvUD4KLSAgIDwvTEk+Ci0gIDwvT0w+Ci0gIDxIUj4KLQotIDxIMz48QSBOQU1FPSJzdXBwb3J0Ij5XaG9tIGRvIEkgY29udGFjdCBmb3Igc3VwcG9ydD88L0E+PC9IMz4KLSAgPFA+Ci0gIFRoZXJlIGlzIG5vIG9mZmljaWFsIHN1cHBvcnQgZm9yIEFwYWNoZS4gTm9uZSBvZiB0aGUgZGV2ZWxvcGVycyB3YW50IHRvCi0gIGJlIHN3YW1wZWQgYnkgYSBmbG9vZCBvZiB0cml2aWFsIHF1ZXN0aW9ucyB0aGF0IGNhbiBiZSByZXNvbHZlZCBlbHNld2hlcmUuCi0gIEJ1ZyByZXBvcnRzIGFuZCBzdWdnZXN0aW9ucyBzaG91bGQgYmUgc2VudCA8RU0+dmlhPC9FTT4KLSAgPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2J1Z19yZXBvcnQuaHRtbCI+dGhlIGJ1ZyByZXBvcnQgcGFnZTwvQT4uCi0gIE90aGVyIHF1ZXN0aW9ucyBzaG91bGQgYmUgZGlyZWN0ZWQgdG8gdGhlCi0gIDxBIEhSRUY9Im5ld3M6Y29tcC5pbmZvc3lzdGVtcy53d3cuc2VydmVycy51bml4IgotICA+Y29tcC5pbmZvc3lzdGVtcy53d3cuc2VydmVycy51bml4PC9BPiBvciA8QSBIUkVGPQotICAibmV3czpjb21wLmluZm9zeXN0ZW1zLnd3dy5zZXJ2ZXJzLm1zLXdpbmRvd3MiCi0gID5jb21wLmluZm9zeXN0ZW1zLnd3dy5zZXJ2ZXJzLm1zLXdpbmRvd3M8L0E+Ci0gIG5ld3Nncm91cCAoYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBwbGF0Zm9ybSB5b3UgdXNlKSwgd2hlcmUgc29tZSBvZiB0aGUgCi0gIEFwYWNoZSB0ZWFtIGx1cmssIGluIHRoZSBjb21wYW55IG9mIG1hbnkgb3RoZXIgaHR0cGQgZ3VydXMgd2hvIAotICBzaG91bGQgYmUgYWJsZSB0byBoZWxwLgotICA8L1A+Ci0gIDxQPgotICBDb21tZXJjaWFsIHN1cHBvcnQgZm9yIEFwYWNoZSBpcywgaG93ZXZlciwgYXZhaWxhYmxlIGZyb20gYSBudW1iZXIKLSAgb2YgdGhpcmQgcGFydGllcy4KLSAgPC9QPgotCi08IS0tI2lmIGV4cHI9IiEkT05FUEFHRSIgLS0+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+Ci08IS0tI2VuZGlmIC0tPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvZmlsdGVyLmh0bWwgYi9kb2NzL21hbnVhbC9maWx0ZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkY2IyMC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9maWx0ZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+RmlsdGVycyAtIEFwYWNoZSBIVFRQRDwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPkZpbHRlcnM8L0gxPgotCi08dGFibGUgYm9yZGVyPSIxIj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiPgotPHN0cm9uZz5SZWxhdGVkIE1vZHVsZXM8L3N0cm9uZz48YnI+PGJyPgotCi08YSBocmVmPSJtb2QvbW9kX2V4dF9maWx0ZXIuaHRtbCI+bW9kX2V4dF9maWx0ZXI8L2E+PGJyPgotPEEgSFJFRj0ibW9kL21vZF9pbmNsdWRlLmh0bWwiPm1vZF9pbmNsdWRlPC9BPjxicj4KLTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiPgotPHN0cm9uZz5SZWxhdGVkIERpcmVjdGl2ZXM8L3N0cm9uZz48YnI+PGJyPgotCi08YSBocmVmPSJtb2QvbW9kX2V4dF9maWx0ZXIuaHRtbCNleHRmaWx0ZXJkZWZpbmUiPkV4dEZpbHRlckRlZmluZTwvYT48L2JyPgotPGEgaHJlZj0ibW9kL21vZF9leHRfZmlsdGVyLmh0bWwjZXh0ZmlsdGVyb3B0aW9ucyI+RXh0RmlsdGVyT3B0aW9uczwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI3NldGlucHV0ZmlsdGVyIj5TZXRJbnB1dEZpbHRlcjwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI3NldG91dHB1dGZpbHRlciI+U2V0T3V0cHV0RmlsdGVyPC9hPjxicj4KLTwvdGQ+Ci08L3RyPjwvdGFibGU+Ci0KLQotPHA+QSA8ZW0+ZmlsdGVyPC9lbT4gaXMgYSBwcm9jZXNzIHdoaWNoIGlzIGFwcGxpZWQgdG8gZGF0YSB0aGF0IGlzCi1zZW50IG9yIHJlY2VpdmVkIGJ5IHRoZSBzZXJ2ZXIuICBEYXRhIHNlbnQgYnkgY2xpZW50cyB0byB0aGUgc2VydmVyCi1pcyBwcm9jZXNzZWQgYnkgPGVtPmlucHV0IGZpbHRlcnM8L2VtPiB3aGlsZSBkYXRhIHNlbnQgYnkgdGhlCi1zZXJ2ZXIgdG8gdGhlIGNsaWVudCBpcyBwcm9jZXNzZWQgYnkgPGVtPm91dHB1dCBmaWx0ZXJzPC9lbT4uCi1NdWx0aXBsZSBmaWx0ZXJzIGNhbiBiZSBhcHBsaWVkIHRvIHRoZSBkYXRhLCBhbmQgdGhlIG9yZGVyCi1vZiB0aGUgZmlsdGVycyBjYW4gYmUgZXhwbGljaXRseSBzcGVjaWZpZWQuICBJbiBhZGRpdGlvbiwKLXNpbmNlIGZpbHRlcnMgYXBwbHkgdG8gYWxsIGNvbnRlbnQsIHRoZXkgYWxsb3cgZm9yIGZsZXhpYmxlCi1tYW5pcHVsYXRpb24gb2YgZGF0YSBzdWNoIGFzIHByb2Nlc3NpbmcgdGhlIG91dHB1dCBvZiAKLUNHSSBzY3JpcHRzIGZvciBTZXJ2ZXIgU2lkZSBJbmNsdWRlcy48L3A+Ci0KLTxwPlRoZSBzZXQgb2YgZmlsdGVycyB3aGljaCBhcHBseSB0byBkYXRhIGNhbiBiZSBtYW5pcHVsYXRlZAotd2l0aCB0aGUgPGNvZGU+U2V0SW5wdXRGaWx0ZXI8L2NvZGU+IGFuZCA8Y29kZT5TZXRPdXRwdXRGaWx0ZXI8L2NvZGU+Ci1kaXJlY3RpdmVzLjwvcD4KLQotPHA+VGhlIG9ubHkgZmlsdGVyIGN1cnJlbnRseSBpbmNsdWRlZCB3aXRoIHRoZSBBcGFjaGUgZGlzdHJpYnV0aW9uCi1pcyB0aGUgPGNvZGU+SU5DTFVERTwvY29kZT4gZmlsdGVyIHdoaWNoIGlzIHByb3ZpZGVkIGJ5IAotPGEgaHJlZj0ibW9kL21vZF9pbmNsdWRlLmh0bWwiPm1vZF9pbmNsdWRlPC9hPiB0byBwcm9jZXNzIG91dHB1dAotZm9yIFNlcnZlciBTaWRlIEluY2x1ZGVzLiAgVGhlcmUgaXMgYWxzbyBhbiBleHBlcmltZW50YWwgbW9kdWxlCi1jYWxsZWQgPGEgaHJlZj0ibW9kL21vZF9leHRfZmlsdGVyLmh0bWwiPm1vZF9leHRfZmlsdGVyPC9hPgotd2hpY2ggYWxsb3dzIGZvciBleHRlcm5hbCBwcm9ncmFtcyB0byBiZSBkZWZpbmVkIGFzIGZpbHRlcnMuPC9wPgotCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2ZpbHRlci5odG1sLmVuIGIvZG9jcy9tYW51YWwvZmlsdGVyLmh0bWwuZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZGNiMjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvZmlsdGVyLmh0bWwuZW4KKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkZpbHRlcnMgLSBBcGFjaGUgSFRUUEQ8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5GaWx0ZXJzPC9IMT4KLQotPHRhYmxlIGJvcmRlcj0iMSI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIj4KLTxzdHJvbmc+UmVsYXRlZCBNb2R1bGVzPC9zdHJvbmc+PGJyPjxicj4KLQotPGEgaHJlZj0ibW9kL21vZF9leHRfZmlsdGVyLmh0bWwiPm1vZF9leHRfZmlsdGVyPC9hPjxicj4KLTxBIEhSRUY9Im1vZC9tb2RfaW5jbHVkZS5odG1sIj5tb2RfaW5jbHVkZTwvQT48YnI+Ci08L3RkPgotPHRkIHZhbGlnbj0idG9wIj4KLTxzdHJvbmc+UmVsYXRlZCBEaXJlY3RpdmVzPC9zdHJvbmc+PGJyPjxicj4KLQotPGEgaHJlZj0ibW9kL21vZF9leHRfZmlsdGVyLmh0bWwjZXh0ZmlsdGVyZGVmaW5lIj5FeHRGaWx0ZXJEZWZpbmU8L2E+PC9icj4KLTxhIGhyZWY9Im1vZC9tb2RfZXh0X2ZpbHRlci5odG1sI2V4dGZpbHRlcm9wdGlvbnMiPkV4dEZpbHRlck9wdGlvbnM8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNzZXRpbnB1dGZpbHRlciI+U2V0SW5wdXRGaWx0ZXI8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNzZXRvdXRwdXRmaWx0ZXIiPlNldE91dHB1dEZpbHRlcjwvYT48YnI+Ci08L3RkPgotPC90cj48L3RhYmxlPgotCi0KLTxwPkEgPGVtPmZpbHRlcjwvZW0+IGlzIGEgcHJvY2VzcyB3aGljaCBpcyBhcHBsaWVkIHRvIGRhdGEgdGhhdCBpcwotc2VudCBvciByZWNlaXZlZCBieSB0aGUgc2VydmVyLiAgRGF0YSBzZW50IGJ5IGNsaWVudHMgdG8gdGhlIHNlcnZlcgotaXMgcHJvY2Vzc2VkIGJ5IDxlbT5pbnB1dCBmaWx0ZXJzPC9lbT4gd2hpbGUgZGF0YSBzZW50IGJ5IHRoZQotc2VydmVyIHRvIHRoZSBjbGllbnQgaXMgcHJvY2Vzc2VkIGJ5IDxlbT5vdXRwdXQgZmlsdGVyczwvZW0+LgotTXVsdGlwbGUgZmlsdGVycyBjYW4gYmUgYXBwbGllZCB0byB0aGUgZGF0YSwgYW5kIHRoZSBvcmRlcgotb2YgdGhlIGZpbHRlcnMgY2FuIGJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkLiAgSW4gYWRkaXRpb24sCi1zaW5jZSBmaWx0ZXJzIGFwcGx5IHRvIGFsbCBjb250ZW50LCB0aGV5IGFsbG93IGZvciBmbGV4aWJsZQotbWFuaXB1bGF0aW9uIG9mIGRhdGEgc3VjaCBhcyBwcm9jZXNzaW5nIHRoZSBvdXRwdXQgb2YgCi1DR0kgc2NyaXB0cyBmb3IgU2VydmVyIFNpZGUgSW5jbHVkZXMuPC9wPgotCi08cD5UaGUgc2V0IG9mIGZpbHRlcnMgd2hpY2ggYXBwbHkgdG8gZGF0YSBjYW4gYmUgbWFuaXB1bGF0ZWQKLXdpdGggdGhlIDxjb2RlPlNldElucHV0RmlsdGVyPC9jb2RlPiBhbmQgPGNvZGU+U2V0T3V0cHV0RmlsdGVyPC9jb2RlPgotZGlyZWN0aXZlcy48L3A+Ci0KLTxwPlRoZSBvbmx5IGZpbHRlciBjdXJyZW50bHkgaW5jbHVkZWQgd2l0aCB0aGUgQXBhY2hlIGRpc3RyaWJ1dGlvbgotaXMgdGhlIDxjb2RlPklOQ0xVREU8L2NvZGU+IGZpbHRlciB3aGljaCBpcyBwcm92aWRlZCBieSAKLTxhIGhyZWY9Im1vZC9tb2RfaW5jbHVkZS5odG1sIj5tb2RfaW5jbHVkZTwvYT4gdG8gcHJvY2VzcyBvdXRwdXQKLWZvciBTZXJ2ZXIgU2lkZSBJbmNsdWRlcy4gIFRoZXJlIGlzIGFsc28gYW4gZXhwZXJpbWVudGFsIG1vZHVsZQotY2FsbGVkIDxhIGhyZWY9Im1vZC9tb2RfZXh0X2ZpbHRlci5odG1sIj5tb2RfZXh0X2ZpbHRlcjwvYT4KLXdoaWNoIGFsbG93cyBmb3IgZXh0ZXJuYWwgcHJvZ3JhbXMgdG8gYmUgZGVmaW5lZCBhcyBmaWx0ZXJzLjwvcD4KLQotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9oYW5kbGVyLmh0bWwgYi9kb2NzL21hbnVhbC9oYW5kbGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NzJiMzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvaGFuZGxlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgMi4wLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFwYWNoZSdzIEhhbmRsZXIgVXNlPC9USVRMRT4KLTwvSEVBRD4KLQotPEJPRFk+Ci08SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9zdWIuZ2lmIiBBTFQ9IiI+Ci08aDE+QXBhY2hlJ3MgSGFuZGxlciBVc2U8L2gxPgotCi08aDI+V2hhdCBpcyBhIEhhbmRsZXI8L2gyPgotCi08cD5BICJoYW5kbGVyIiBpcyBhbiBpbnRlcm5hbCBBcGFjaGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFjdGlvbiB0byBiZQotcGVyZm9ybWVkIHdoZW4gYSBmaWxlIGlzIGNhbGxlZC4gR2VuZXJhbGx5LCBmaWxlcyBoYXZlIGltcGxpY2l0Ci1oYW5kbGVycywgYmFzZWQgb24gdGhlIGZpbGUgdHlwZS4gTm9ybWFsbHksIGFsbCBmaWxlcyBhcmUgc2ltcGx5Ci1zZXJ2ZWQgYnkgdGhlIHNlcnZlciwgYnV0IGNlcnRhaW4gZmlsZSB0eXBlZCBhcmUgImhhbmRsZWQiCi1zZXBlcmF0ZWx5LiBGb3IgZXhhbXBsZSwgeW91IG1heSB1c2UgYSB0eXBlIG9mCi0iYXBwbGljYXRpb24veC1odHRwZC1jZ2kiIHRvIGludm9rZSBDR0kgc2NyaXB0cy48L3A+Ci0KLTxwPkFwYWNoZSAxLjEgYWRkcyB0aGUgYWRkaXRpb25hbCBhYmlsaXR5IHRvIHVzZSBoYW5kbGVycwotZXhwbGljaXRseS4gRWl0aGVyIGJhc2VkIG9uIGZpbGVuYW1lIGV4dGVuc2lvbnMgb3Igb24gbG9jYXRpb24sIHRoZXNlCi1oYW5kbGVycyBhcmUgdW5yZWxhdGVkIHRvIGZpbGUgdHlwZS4gVGhpcyBpcyBhZHZhbnRhZ2VvdXMgYm90aCBiZWNhdXNlCi1pdCBpcyBhIG1vcmUgZWxlZ2FudCBzb2x1dGlvbiwgYnV0IGl0IGFsc28gYWxsb3dzIGZvciBib3RoIGEgdHlwZQotPHN0cm9uZz5hbmQ8L3N0cm9uZz4gYSBoYW5kbGVyIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhIGZpbGUuPC9wPgotCi08cD5IYW5kbGVycyBjYW4gZWl0aGVyIGJlIGJ1aWx0IGludG8gdGhlIHNlcnZlciBvciB0byBhIG1vZHVsZSwgb3IKLXRoZXkgY2FuIGJlIGFkZGVkIHdpdGggdGhlIDxhCi1ocmVmPSJtb2RfYWN0aW9ucy5odG1sI2FjdGlvbiI+QWN0aW9uPC9hPiBkaXJlY3RpdmUuIFRoZSBidWlsdC1pbgotaGFuZGxlcnMgaW4gdGhlIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbiBhcmUgYXMgZm9sbG93czo8L3A+Ci0KLTx1bD4KLTxsaT48c3Ryb25nPnNlbmQtYXMtaXM8L3N0cm9uZz46Ci0gICAgU2VuZCBmaWxlIHdpdGggSFRUUCBoZWFkZXJzIGFzIGlzLgotICAgICg8YSBocmVmPSJtb2RfYXNpcy5odG1sIj5tb2RfYXNpczwvYT4pCi08bGk+PHN0cm9uZz5jZ2ktc2NyaXB0PC9zdHJvbmc+OgotICAgIFRyZWF0IHRoZSBmaWxlIGFzIGEgQ0dJIHNjcmlwdC4KLSAgICAoPGEgaHJlZj0ibW9kX2NnaS5odG1sIj5tb2RfY2dpPC9hPikKLTxsaT48c3Ryb25nPmltYXAtZmlsZTwvc3Ryb25nPjoKLSAgICBJbWFnZW1hcCBydWxlIGZpbGUuCi0gICAgKDxhIGhyZWY9Im1vZF9pbWFwLmh0bWwiPm1vZF9pbWFwPC9hPikKLTxsaT48c3Ryb25nPnNlcnZlci1pbmZvPC9zdHJvbmc+OgotICAgIEdldCB0aGUgc2VydmVyJ3MgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbgotICAgICg8YSBocmVmPSJtb2RfaW5mby5odG1sIj5tb2RfaW5mbzwvYT4pCi08bGk+PHN0cm9uZz5zZXJ2ZXItcGFyc2VkPC9zdHJvbmc+OgotICAgIFBhcnNlIGZvciBzZXJ2ZXItc2lkZSBpbmNsdWRlcwotICAgICg8YSBocmVmPSJtb2RfaW5jbHVkZS5odG1sIj5tb2RfaW5jbHVkZTwvYT4pCi08bGk+PHN0cm9uZz5zZXJ2ZXItc3RhdHVzPC9zdHJvbmc+OgotICAgIEdldCB0aGUgc2VydmVyJ3Mgc3RhdHVzIHJlcG9ydAotICAgICg8YSBocmVmPSJtb2Rfc3RhdHVzLmh0bWwiPm1vZF9zdGF0dXM8L2E+KQotPGxpPjxzdHJvbmc+dHlwZS1tYXA8L3N0cm9uZz46Ci0gICAgUGFyc2UgYXMgYSB0eXBlIG1hcCBmaWxlIGZvciBjb250ZW50IG5lZ290YXRpb24KLSAgICAoPGEgaHJlZj0ibW9kX25lZ290aWF0aW9uLmh0bWwiPm1vZF9uZWdvdGlhdGlvbjwvYT4pCi08L3VsPgotCi08cD4KLQotPGgyPkRpcmVjdGl2ZXM8L2gyPgotPHVsPgotPGxpPjxBIEhSRUY9IiNhZGRoYW5kbGVyIj5BZGRIYW5kbGVyPC9BPgotPGxpPjxBIEhSRUY9IiNzZXRoYW5kbGVyIj5TZXRIYW5kbGVyPC9BPgotPC91bD4KLQotPGhyPgotCi08aDI+PGEgbmFtZT0iYWRkaGFuZGxlciI+QWRkSGFuZGxlcjwvYT48L2gyPgotCi08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gJmx0O0FkZEhhbmRsZXIgPGVtPmhhbmRsZXItbmFtZSBleHRlbnRpb248L2VtPiZndDs8YnI+Ci08c3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3M8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gQmFzZTxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfbWltZQotCi08cD5BZGRIYW5kbGVyIG1hcHMgdGhlIGZpbGVuYW1lIGV4dGVuc2lvbiA8ZW0+ZXh0ZW5zaW9uPC9lbT4gdG8gdGhlCi1oYW5kbGVyIDxlbT5oYW5kbGVyLW5hbWU8L2VtPi4gRm9yIGV4YW1wbGUsIHRvIGFjdGl2YXRlIENHSSBzY3JpcHRzCi13aXRoIHRoZSBmaWxlIGV4dGVuc2lvbiAiPGNvZGU+LmNnaTwvY29kZT4iLCB5b3UgbWlnaHQgdXNlOgotPHByZT4KLSAgICBBZGRIYW5kbGVyIGNnaS1zY3JpcHQgY2dpCi08L3ByZT4KLQotPHA+T25jZSB0aGF0IGhhcyBiZWVuIHB1dCBpbnRvIHlvdXIgc3JtLmNvbmYgb3IgaHR0cGQuY29uZiBmaWxlLCBhbnkKLWZpbGUgZW5kaW5nIHdpdGggIjxjb2RlPi5jZ2k8L2NvZGU+IiB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBDR0kKLXByb2dyYW0uPC9wPgotCi08aHI+Ci0KLTxoMj48YSBuYW1lPSJzZXRoYW5kbGVyIj5TZXRIYW5kbGVyPC9hPjwvaDI+Ci0KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiAmbHQ7U2V0SGFuZGxlciA8ZW0+aGFuZGxlci1uYW1lPC9lbT4mZ3Q7PGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBkaXJlY3RvcnksIC5odGFjY2Vzczxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBCYXNlPGJyPgotPHN0cm9uZz5Nb2R1bGU6PC9zdHJvbmc+IG1vZF9taW1lCi0KLTxwPldoZW4gcGxhY2VkIGludG8gYW4gPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBmaWxlIG9yIGEKLTxjb2RlPiZsdDtEaXJlY3RvcnkmZ3Q7PC9jb2RlPiBvciA8Y29kZT4mbHQ7TG9jYXRpb248L2NvZGU+IHNlY3Rpb24sCi10aGlzIGRpcmVjdGl2ZSBmb3JjZXMgYWxsIG1hdGNoaW5nIGZpbGVzIHRvIGJlIHBhcnNlZCB0aHJvdWdoIHRoZQotaGFuZGxlciBnaXZlbiBieSA8ZW0+aGFuZGxlci1uYW1lPC9lbT4uIEZvciBleGFtcGxlLCBpZiB5b3UgaGFkIGEKLWRpcmVjdG9yeSB5b3Ugd2FudGVkIHRvIGJlIHBhcnNlZCBlbnRpcmVseSBhcyBpbWFnZW1hcCBydWxlIGZpbGVzLAotcmVnYXJkbGVzcyBvZiBleHRlbnNpb24sIHlvdSBtaWdodCBwdXQgdGhlIGZvbGxvd2luZyBpbnRvIGFuCi08Y29kZT4uaHRhY2Nlc3M8L2NvZGU+IGZpbGUgaW4gdGhhdCBkaXJlY3Rvcnk6Ci08cHJlPgotICAgIFNldEhhbmRsZXIgaW1hcC1maWxlCi08L3ByZT4KLTxwPkFub3RoZXIgZXhhbXBsZTogaWYgeW91IHdhbnRlZCB0byBoYXZlIHRoZSBzZXJ2ZXIgZGlzcGxheSBhIHN0YXR1cwotcmVwb3J0IHdoZW5ldmVyIGEgVVJMIG9mIDxjb2RlPmh0dHA6Ly9zZXJ2ZXJuYW1lL3N0YXR1czwvY29kZT4gd2FzCi1jYWxsZWQsIHlvdSBtaWdodCBwdXQgdGhlIGZvbGxvd2luZyBpbnRvIGFjY2Vzcy5jb25mOgotPHByZT4KLSAgICAmbHQ7TG9jYXRpb24gL3N0YXR1cyZndDsKLSAgICBTZXRIYW5kbGVyIHNlcnZlci1zdGF0dXMKLSAgICAmbHQ7L0xvY2F0aW9uJmd0OwotPC9wcmU+Ci0KLTxwPjxocj4KLQotPGgyPlByb2dyYW1tZXIncyBOb3RlPC9oMj4KLQotPHA+SW4gb3JkZXIgdG8gaW1wbGVtZW50IHRoZSBoYW5kbGVyIGZlYXR1cmVzLCBhbiBhZGRpdGlvbiBoYXMgYmVlbgotbWFkZSB0byB0aGUgPGEgaHJlZj0iQVBJLmh0bWwiPkFwYWNoZSBBUEk8L2E+IHRoYXQgeW91IG1heSB3aXNoIHRvCi1tYWtlIHVzZSBvZi4gU3BlY2lmaWNhbGx5LCBhIG5ldyByZWNvcmQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlCi08Y29kZT5yZXF1ZXN0X3JlYzwvY29kZT4gc3RydWN0dXJlOjwvcD4KLTxwcmU+Ci0gICAgY2hhciAqaGFuZGxlcgotPC9wcmU+Ci08cD5JZiB5b3Ugd2lzaCB0byBoYXZlIHlvdXIgbW9kdWxlIGVuZ2FnZSBhIGhhbmRsZXIsIHlvdSBuZWVkIG9ubHkgdG8KLXNldCA8Y29kZT5yLSZndDtoYW5kbGVyPC9jb2RlPiB0byB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlciBhdCBhbnkgdGltZQotcHJpb3IgdG8gdGhlIDxjb2RlPmludm9rZV9oYW5kbGVyPC9jb2RlPiBzdGFnZSBvZiB0aGUKLXJlcXVlc3QuIEhhbmRsZXJzIGFyZSBpbXBsZW1lbnRlZCBhcyB0aGV5IHdlcmUgYmVmb3JlLCBhbGJpZXQgdXNpbmcKLXRoZSBoYW5kbGVyIG5hbWUgaW5zdGVhZCBvZiBhIGNvbnRlbnQgdHlwZS4gV2hpbGUgaXQgaXMgbm90Ci1uZWNjZXNzYXJ5LCB0aGUgbmFtaW5nIGNvbnZlbnRpb24gZm9yIGhhbmRsZXJzIGlzIHRvIHVzZSBhCi1kYXNoLXNlcGVyYXRlZCB3b3JkLCB3aXRoIG5vIHNsYXNoZXMsIHNvIGFzIHRvIG5vdCBpbnZhZGUgdGhlIG1lZGlhCi10eXBlIG5hbWVzcGFjZS48L3A+Ci0KLTxocj4KLQotPEEgSFJFRj0iLi4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9ob21lLmdpZiIgQUxUPSJIb21lIj48L0E+Ci08QSBIUkVGPSIuLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfaW5kZXguZ2lmIiBBTFQ9IkluZGV4Ij48L0E+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvaGFuZGxlci5odG1sLmVuIGIvZG9jcy9tYW51YWwvaGFuZGxlci5odG1sLmVuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDcyYjMxLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2hhbmRsZXIuaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDIuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUncyBIYW5kbGVyIFVzZTwvVElUTEU+Ci08L0hFQUQ+Ci0KLTxCT0RZPgotPElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfc3ViLmdpZiIgQUxUPSIiPgotPGgxPkFwYWNoZSdzIEhhbmRsZXIgVXNlPC9oMT4KLQotPGgyPldoYXQgaXMgYSBIYW5kbGVyPC9oMj4KLQotPHA+QSAiaGFuZGxlciIgaXMgYW4gaW50ZXJuYWwgQXBhY2hlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhY3Rpb24gdG8gYmUKLXBlcmZvcm1lZCB3aGVuIGEgZmlsZSBpcyBjYWxsZWQuIEdlbmVyYWxseSwgZmlsZXMgaGF2ZSBpbXBsaWNpdAotaGFuZGxlcnMsIGJhc2VkIG9uIHRoZSBmaWxlIHR5cGUuIE5vcm1hbGx5LCBhbGwgZmlsZXMgYXJlIHNpbXBseQotc2VydmVkIGJ5IHRoZSBzZXJ2ZXIsIGJ1dCBjZXJ0YWluIGZpbGUgdHlwZWQgYXJlICJoYW5kbGVkIgotc2VwZXJhdGVseS4gRm9yIGV4YW1wbGUsIHlvdSBtYXkgdXNlIGEgdHlwZSBvZgotImFwcGxpY2F0aW9uL3gtaHR0cGQtY2dpIiB0byBpbnZva2UgQ0dJIHNjcmlwdHMuPC9wPgotCi08cD5BcGFjaGUgMS4xIGFkZHMgdGhlIGFkZGl0aW9uYWwgYWJpbGl0eSB0byB1c2UgaGFuZGxlcnMKLWV4cGxpY2l0bHkuIEVpdGhlciBiYXNlZCBvbiBmaWxlbmFtZSBleHRlbnNpb25zIG9yIG9uIGxvY2F0aW9uLCB0aGVzZQotaGFuZGxlcnMgYXJlIHVucmVsYXRlZCB0byBmaWxlIHR5cGUuIFRoaXMgaXMgYWR2YW50YWdlb3VzIGJvdGggYmVjYXVzZQotaXQgaXMgYSBtb3JlIGVsZWdhbnQgc29sdXRpb24sIGJ1dCBpdCBhbHNvIGFsbG93cyBmb3IgYm90aCBhIHR5cGUKLTxzdHJvbmc+YW5kPC9zdHJvbmc+IGEgaGFuZGxlciB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSBmaWxlLjwvcD4KLQotPHA+SGFuZGxlcnMgY2FuIGVpdGhlciBiZSBidWlsdCBpbnRvIHRoZSBzZXJ2ZXIgb3IgdG8gYSBtb2R1bGUsIG9yCi10aGV5IGNhbiBiZSBhZGRlZCB3aXRoIHRoZSA8YQotaHJlZj0ibW9kX2FjdGlvbnMuaHRtbCNhY3Rpb24iPkFjdGlvbjwvYT4gZGlyZWN0aXZlLiBUaGUgYnVpbHQtaW4KLWhhbmRsZXJzIGluIHRoZSBzdGFuZGFyZCBkaXN0cmlidXRpb24gYXJlIGFzIGZvbGxvd3M6PC9wPgotCi08dWw+Ci08bGk+PHN0cm9uZz5zZW5kLWFzLWlzPC9zdHJvbmc+OgotICAgIFNlbmQgZmlsZSB3aXRoIEhUVFAgaGVhZGVycyBhcyBpcy4KLSAgICAoPGEgaHJlZj0ibW9kX2FzaXMuaHRtbCI+bW9kX2FzaXM8L2E+KQotPGxpPjxzdHJvbmc+Y2dpLXNjcmlwdDwvc3Ryb25nPjoKLSAgICBUcmVhdCB0aGUgZmlsZSBhcyBhIENHSSBzY3JpcHQuCi0gICAgKDxhIGhyZWY9Im1vZF9jZ2kuaHRtbCI+bW9kX2NnaTwvYT4pCi08bGk+PHN0cm9uZz5pbWFwLWZpbGU8L3N0cm9uZz46Ci0gICAgSW1hZ2VtYXAgcnVsZSBmaWxlLgotICAgICg8YSBocmVmPSJtb2RfaW1hcC5odG1sIj5tb2RfaW1hcDwvYT4pCi08bGk+PHN0cm9uZz5zZXJ2ZXItaW5mbzwvc3Ryb25nPjoKLSAgICBHZXQgdGhlIHNlcnZlcidzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KLSAgICAoPGEgaHJlZj0ibW9kX2luZm8uaHRtbCI+bW9kX2luZm88L2E+KQotPGxpPjxzdHJvbmc+c2VydmVyLXBhcnNlZDwvc3Ryb25nPjoKLSAgICBQYXJzZSBmb3Igc2VydmVyLXNpZGUgaW5jbHVkZXMKLSAgICAoPGEgaHJlZj0ibW9kX2luY2x1ZGUuaHRtbCI+bW9kX2luY2x1ZGU8L2E+KQotPGxpPjxzdHJvbmc+c2VydmVyLXN0YXR1czwvc3Ryb25nPjoKLSAgICBHZXQgdGhlIHNlcnZlcidzIHN0YXR1cyByZXBvcnQKLSAgICAoPGEgaHJlZj0ibW9kX3N0YXR1cy5odG1sIj5tb2Rfc3RhdHVzPC9hPikKLTxsaT48c3Ryb25nPnR5cGUtbWFwPC9zdHJvbmc+OgotICAgIFBhcnNlIGFzIGEgdHlwZSBtYXAgZmlsZSBmb3IgY29udGVudCBuZWdvdGF0aW9uCi0gICAgKDxhIGhyZWY9Im1vZF9uZWdvdGlhdGlvbi5odG1sIj5tb2RfbmVnb3RpYXRpb248L2E+KQotPC91bD4KLQotPHA+Ci0KLTxoMj5EaXJlY3RpdmVzPC9oMj4KLTx1bD4KLTxsaT48QSBIUkVGPSIjYWRkaGFuZGxlciI+QWRkSGFuZGxlcjwvQT4KLTxsaT48QSBIUkVGPSIjc2V0aGFuZGxlciI+U2V0SGFuZGxlcjwvQT4KLTwvdWw+Ci0KLTxocj4KLQotPGgyPjxhIG5hbWU9ImFkZGhhbmRsZXIiPkFkZEhhbmRsZXI8L2E+PC9oMj4KLQotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+ICZsdDtBZGRIYW5kbGVyIDxlbT5oYW5kbGVyLW5hbWUgZXh0ZW50aW9uPC9lbT4mZ3Q7PGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IEJhc2U8YnI+Ci08c3Ryb25nPk1vZHVsZTo8L3N0cm9uZz4gbW9kX21pbWUKLQotPHA+QWRkSGFuZGxlciBtYXBzIHRoZSBmaWxlbmFtZSBleHRlbnNpb24gPGVtPmV4dGVuc2lvbjwvZW0+IHRvIHRoZQotaGFuZGxlciA8ZW0+aGFuZGxlci1uYW1lPC9lbT4uIEZvciBleGFtcGxlLCB0byBhY3RpdmF0ZSBDR0kgc2NyaXB0cwotd2l0aCB0aGUgZmlsZSBleHRlbnNpb24gIjxjb2RlPi5jZ2k8L2NvZGU+IiwgeW91IG1pZ2h0IHVzZToKLTxwcmU+Ci0gICAgQWRkSGFuZGxlciBjZ2ktc2NyaXB0IGNnaQotPC9wcmU+Ci0KLTxwPk9uY2UgdGhhdCBoYXMgYmVlbiBwdXQgaW50byB5b3VyIHNybS5jb25mIG9yIGh0dHBkLmNvbmYgZmlsZSwgYW55Ci1maWxlIGVuZGluZyB3aXRoICI8Y29kZT4uY2dpPC9jb2RlPiIgd2lsbCBiZSB0cmVhdGVkIGFzIGEgQ0dJCi1wcm9ncmFtLjwvcD4KLQotPGhyPgotCi08aDI+PGEgbmFtZT0ic2V0aGFuZGxlciI+U2V0SGFuZGxlcjwvYT48L2gyPgotCi08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gJmx0O1NldEhhbmRsZXIgPGVtPmhhbmRsZXItbmFtZTwvZW0+Jmd0Ozxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gZGlyZWN0b3J5LCAuaHRhY2Nlc3M8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gQmFzZTxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfbWltZQotCi08cD5XaGVuIHBsYWNlZCBpbnRvIGFuIDxjb2RlPi5odGFjY2VzczwvY29kZT4gZmlsZSBvciBhCi08Y29kZT4mbHQ7RGlyZWN0b3J5Jmd0OzwvY29kZT4gb3IgPGNvZGU+Jmx0O0xvY2F0aW9uPC9jb2RlPiBzZWN0aW9uLAotdGhpcyBkaXJlY3RpdmUgZm9yY2VzIGFsbCBtYXRjaGluZyBmaWxlcyB0byBiZSBwYXJzZWQgdGhyb3VnaCB0aGUKLWhhbmRsZXIgZ2l2ZW4gYnkgPGVtPmhhbmRsZXItbmFtZTwvZW0+LiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhZCBhCi1kaXJlY3RvcnkgeW91IHdhbnRlZCB0byBiZSBwYXJzZWQgZW50aXJlbHkgYXMgaW1hZ2VtYXAgcnVsZSBmaWxlcywKLXJlZ2FyZGxlc3Mgb2YgZXh0ZW5zaW9uLCB5b3UgbWlnaHQgcHV0IHRoZSBmb2xsb3dpbmcgaW50byBhbgotPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBmaWxlIGluIHRoYXQgZGlyZWN0b3J5OgotPHByZT4KLSAgICBTZXRIYW5kbGVyIGltYXAtZmlsZQotPC9wcmU+Ci08cD5Bbm90aGVyIGV4YW1wbGU6IGlmIHlvdSB3YW50ZWQgdG8gaGF2ZSB0aGUgc2VydmVyIGRpc3BsYXkgYSBzdGF0dXMKLXJlcG9ydCB3aGVuZXZlciBhIFVSTCBvZiA8Y29kZT5odHRwOi8vc2VydmVybmFtZS9zdGF0dXM8L2NvZGU+IHdhcwotY2FsbGVkLCB5b3UgbWlnaHQgcHV0IHRoZSBmb2xsb3dpbmcgaW50byBhY2Nlc3MuY29uZjoKLTxwcmU+Ci0gICAgJmx0O0xvY2F0aW9uIC9zdGF0dXMmZ3Q7Ci0gICAgU2V0SGFuZGxlciBzZXJ2ZXItc3RhdHVzCi0gICAgJmx0Oy9Mb2NhdGlvbiZndDsKLTwvcHJlPgotCi08cD48aHI+Ci0KLTxoMj5Qcm9ncmFtbWVyJ3MgTm90ZTwvaDI+Ci0KLTxwPkluIG9yZGVyIHRvIGltcGxlbWVudCB0aGUgaGFuZGxlciBmZWF0dXJlcywgYW4gYWRkaXRpb24gaGFzIGJlZW4KLW1hZGUgdG8gdGhlIDxhIGhyZWY9IkFQSS5odG1sIj5BcGFjaGUgQVBJPC9hPiB0aGF0IHlvdSBtYXkgd2lzaCB0bwotbWFrZSB1c2Ugb2YuIFNwZWNpZmljYWxseSwgYSBuZXcgcmVjb3JkIGhhcyBiZWVuIGFkZGVkIHRvIHRoZQotPGNvZGU+cmVxdWVzdF9yZWM8L2NvZGU+IHN0cnVjdHVyZTo8L3A+Ci08cHJlPgotICAgIGNoYXIgKmhhbmRsZXIKLTwvcHJlPgotPHA+SWYgeW91IHdpc2ggdG8gaGF2ZSB5b3VyIG1vZHVsZSBlbmdhZ2UgYSBoYW5kbGVyLCB5b3UgbmVlZCBvbmx5IHRvCi1zZXQgPGNvZGU+ci0mZ3Q7aGFuZGxlcjwvY29kZT4gdG8gdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIgYXQgYW55IHRpbWUKLXByaW9yIHRvIHRoZSA8Y29kZT5pbnZva2VfaGFuZGxlcjwvY29kZT4gc3RhZ2Ugb2YgdGhlCi1yZXF1ZXN0LiBIYW5kbGVycyBhcmUgaW1wbGVtZW50ZWQgYXMgdGhleSB3ZXJlIGJlZm9yZSwgYWxiaWV0IHVzaW5nCi10aGUgaGFuZGxlciBuYW1lIGluc3RlYWQgb2YgYSBjb250ZW50IHR5cGUuIFdoaWxlIGl0IGlzIG5vdAotbmVjY2Vzc2FyeSwgdGhlIG5hbWluZyBjb252ZW50aW9uIGZvciBoYW5kbGVycyBpcyB0byB1c2UgYQotZGFzaC1zZXBlcmF0ZWQgd29yZCwgd2l0aCBubyBzbGFzaGVzLCBzbyBhcyB0byBub3QgaW52YWRlIHRoZSBtZWRpYQotdHlwZSBuYW1lc3BhY2UuPC9wPgotCi08aHI+Ci0KLTxBIEhSRUY9Ii4uLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfaG9tZS5naWYiIEFMVD0iSG9tZSI+PC9BPgotPEEgSFJFRj0iLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2luZGV4LmdpZiIgQUxUPSJJbmRleCI+PC9BPgotCi08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2hhbmRsZXIuaHRtbC5qYS5qaXMgYi9kb2NzL21hbnVhbC9oYW5kbGVyLmh0bWwuamEuamlzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTdhYWJkLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2hhbmRsZXIuaHRtbC5qYS5qaXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BcGFjaGUgGyRCJE4lTyVzJUklaSROO0hNURsoQjwvdGl0bGU+Ci08L0hFQUQ+Ci08IS0tIEVuZ2xpc2ggcmV2aXNpb246IDEuMjIgLS0+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxib2R5Ci0gYmdjb2xvcj0iI0ZGRkZGRiIKLSB0ZXh0PSIjMDAwMDAwIgotIGxpbms9IiMwMDAwRkYiCi0gdmxpbms9IiMwMDAwODAiCi0gYWxpbms9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPGgxIGFsaWduPSJDRU5URVIiPkFwYWNoZSAbJEIkTiVPJXMlSSVpJE47SE1RGyhCPC9oMT4KLQotPHVsPgotPGxpPjxhIGhyZWY9IiNkZWZpbml0aW9uIj4bJEIlTyVzJUklaSRIJE8bKEI8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjZXhhbXBsZXMiPhskQk5jGyhCPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI3Byb2dyYW1tZXIiPhskQiVXJW0lMCVpJV44fiQxJE4lYSViGyhCPC9hPjwvbGk+Ci08L3VsPgotCi08aHI+Ci08aDI+PGEgbmFtZT0iZGVmaW5pdGlvbiI+GyRCJU8lcyVJJWkkSCRPGyhCPC9hPjwvaDI+Ci0KLTx0YWJsZSBib3JkZXI9IjEiPgotPHRyPjx0ZCB2YWxpZ249InRvcCI+Ci08c3Ryb25nPhskQjRYTyIlYiU4JWUhPCVrGyhCPC9zdHJvbmc+PGJyPjxicj4KLQotPGEgaHJlZj0ibW9kL21vZF9hY3Rpb25zLmh0bWwiPm1vZF9hY3Rpb25zPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9tb2RfYXNpcy5odG1sIj5tb2RfYXNpczwvYT48YnI+Ci08YSBocmVmPSJtb2QvbW9kX2NnaS5odG1sIj5tb2RfY2dpPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9tb2RfaW1hcC5odG1sIj5tb2RfaW1hcDwvYT48YnI+Ci08YSBocmVmPSJtb2QvbW9kX2luZm8uaHRtbCI+bW9kX2luZm88L2E+PGJyPgotPGEgaHJlZj0ibW9kL21vZF9taW1lLmh0bWwiPm1vZF9taW1lPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9tb2RfbmVnb3RpYXRpb24uaHRtbCI+bW9kX25lZ290aWF0aW9uPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9tb2Rfc3RhdHVzLmh0bWwiPm1vZF9zdGF0dXM8L2E+PGJyPgotPC90ZD4KLTx0ZCB2YWxpZ249InRvcCI+Ci08c3Ryb25nPhskQjRYTyIlRyUjJWwlLyVGJSMlVhsoQjwvc3Ryb25nPjxicj48YnI+Ci0KLTxhIGhyZWY9Im1vZC9tb2RfYWN0aW9ucy5odG1sI2FjdGlvbiI+QWN0aW9uPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9tb2RfbWltZS5odG1sI2FkZGhhbmRsZXIiPkFkZEhhbmRsZXI8L2E+PGJyPgotPGEgaHJlZj0ibW9kL21vZF9taW1lLmh0bWwjcmVtb3ZlaGFuZGxlciI+UmVtb3ZlSGFuZGxlcjwvYT48YnI+Ci08YSBocmVmPSJtb2QvbW9kX21pbWUuaHRtbCNzZXRoYW5kbGVyIj5TZXRIYW5kbGVyPC9hPjxicj4KLTwvdGQ+Ci08L3RyPjwvdGFibGU+Ci0KLQotPHA+GyRCIVYlTyVzJUklaSFXJEgkTyEiJVUlISUkJWskLDhGJFAkbCQ/JEgkLSRLPEI5VCQ1JGwka0YwOm4kThsoQiBBcGFjaGUgGyRCJEskKiQxJGsbKEIKLRskQkZiSXRJPTg9JEckOSEjREw+byEiJVUlISUkJWskTyVVJSElJCVrNz8kSzRwJEUkJCQ/MEVMWyROGyhCCi0bJEIlTyVzJUklaSQsJCIkaiReJDkhI0lhREwkTyQ5JFkkRiROJVUlISUkJWskT0MxJEslNSE8JVAkSzA3JG8kbCReJDkkLCEiGyhCCi0bJEIlVSUhJSQlayU/JSQlVyROQ2YkSyRPSkwkSyFWJU8lcyVJJWshVxsoQiAoGyRCTHVDbRsoQjogGyRCMDckJhsoQikgGyRCJDUkbCRrJGIkTiRiJCIkaiReJDkhIxsoQjwvcD4KLQotPHA+QXBhY2hlIDEuMSAbJEIkRyRPISIlTyVzJUklaSRyTEA8KEUqJEs7SE1RJDkkazUhRz0kLERJMkMkNSRsJF4kNyQ/ISMbKEIKLRskQiVVJSElJCVrJE4zSEQlO1IkZENWJCQkRiQkJGs+bD1qJEs0cCRFJCQkRiEiJVUlISUkJWs3PyRINFg3OCRKJC8lTyVzJUklaSRyGyhCCi0bJEI7WERqJDkkayQzJEgkLCRHJC0kXiQ5ISMkMyRsJE8kaCRqTSUybSRKMnI3aEshJEgkJCQmRUAkSCEiJVUlISUkJWskSxsoQgotGyRCJT8lJCVXGyhCPHN0cm9uZz4bJEIkSBsoQjwvc3Ryb25nPhskQiVPJXMlSSVpJE5OPkp9JHI0WE8iSVUkMSRrJDMkSCQsJEckLSRrJEgkJCQmGyhCCi0bJEJFQCRHTSUkbCRGJCQkXiQ5ISMbKEIgKDxhCi1ocmVmPSJtb2QvbW9kX21pbWUuaHRtbCNtdWx0aXBsZWV4dCI+GyRCSiM/dCROM0hEJTtSJE4kIiRrJVUlISUkJWsbKEI8L2E+Ci0bJEIkYjsyPkgkNyRGJC8kQCQ1JCQbKEIpGyRCISMbKEI8L3A+Ci0KLTxwPhskQiVPJXMlSSVpJE8lNSE8JVAkS0FIJF85fiRzJEAkaiEiJWIlOCVlITwlayRIJDckRjReJGEkPyRqISIbKEIKLTxhIGhyZWY9Im1vZC9tb2RfYWN0aW9ucy5odG1sI2FjdGlvbiI+QWN0aW9uPC9hPiAbJEIlRyUjJWwlLyVGJSMlViRIJDckRhsoQgotGyRCREkyQyQ3JD8kaiQ5JGskMyRIJCwkRyQtJF4kOSEjMEoyPCRPSTg9YEdbSVskS0FIJF85fiReJGwkRiQkJGslTyVzJUklaSRHJDkhIxsoQjwvcD4KLQotPHVsPgotPGxpPjxzdHJvbmc+ZGVmYXVsdC1oYW5kbGVyPC9zdHJvbmc+OgotICAgIDxjb2RlPmRlZmF1bHRfaGFuZGVscigpPC9jb2RlPiAbJEIkcjtIJEMkRiVVJSElJCVrJHJBdyRqJF4kOSEjGyhCCi0gICAgGyRCQEVFKiRKJTMlcyVGJXMlRCRyMDckJiRIJC0kSyVHJVUlKSVrJUgkRztITVEkNSRsJGslTyVzJUklaSRHJDkhIxsoQgotICAgIChjb3JlKQotPGxpPjxzdHJvbmc+c2VuZC1hcy1pczwvc3Ryb25nPjoKLSAgICBIVFRQIBskQiVYJUMlQCROJCIkayVVJSElJCVrJHIkPSROJF4kXkF3JGokXiQ5ISMbKEIKLSAgICAoPGEgaHJlZj0ibW9kL21vZF9hc2lzLmh0bWwiPm1vZF9hc2lzPC9hPikKLTxsaT48c3Ryb25nPmNnaS1zY3JpcHQ8L3N0cm9uZz46Ci0gICAgGyRCJVUlISUkJWskchsoQiBDR0kgGyRCJTklLyVqJVclSCRIJDckRjA3JCQkXiQ5ISMbKEIKLSAgICAoPGEgaHJlZj0ibW9kL21vZF9jZ2kuaHRtbCI+bW9kX2NnaTwvYT4pCi08bGk+PHN0cm9uZz5pbWFwLWZpbGU8L3N0cm9uZz46Ci0gICAgGyRCJSQlYSE8JTglXiVDJVckTiVrITwlayVVJSElJCVrJEgkNyRGMnJATyQ3JF4kOSEjGyhCCi0gICAgKDxhIGhyZWY9Im1vZC9tb2RfaW1hcC5odG1sIj5tb2RfaW1hcDwvYT4pCi08bGk+PHN0cm9uZz5zZXJ2ZXItaW5mbzwvc3Ryb25nPjoKLSAgICAbJEIlNSE8JVAkTkBfRGo+cEpzJHI8aEZAJDckXiQ5ISMbKEIKLSAgICAoPGEgaHJlZj0ibW9kL21vZF9pbmZvLmh0bWwiPm1vZF9pbmZvPC9hPikKLTxsaT48c3Ryb25nPnNlcnZlci1zdGF0dXM8L3N0cm9uZz46Ci0gICAgGyRCJTUhPCVQJE4+dUJWSnM5cCRyPGhGQCQ3JF4kOSEjGyhCCi0gICAgKDxhIGhyZWY9Im1vZC9tb2Rfc3RhdHVzLmh0bWwiPm1vZF9zdGF0dXM8L2E+KQotPGxpPjxzdHJvbmc+dHlwZS1tYXA8L3N0cm9uZz46Ci0gICAgGyRCJTMlcyVGJXMlSCVNJTQlNyUoITwlNyVnJXMkTiQ/JGEkTiU/JSQlVyVeJUMlVyRIJDckRjJyQE8kNyReJDkhIxsoQgotICAgICg8YSBocmVmPSJtb2QvbW9kX25lZ290aWF0aW9uLmh0bWwiPm1vZF9uZWdvdGlhdGlvbjwvYT4pCi08L3VsPgotCi08aHI+Ci0KLTxoMj48YSBuYW1lPSJleGFtcGxlcyI+GyRCTmMbKEI8L2E+PC9oMj4KLQotPGgzPkNHSSAbJEIlOSUvJWolVyVIJHJNUSQkJEZARUUqJEolMyVzJUYlcyVEJHJKUTk5JDkkaxsoQjwvaDM+Ci0KLTxwPhskQjBKMjwkTiVHJSMlbCUvJUYlIyVWJEskaCRDJEYhIjNIRCU7UiQsGyhCIDxjb2RlPmh0bWw8L2NvZGU+IBskQiRHJCIkayVVJSElJCVrJE8bKEIKLTxjb2RlPmZvb3Rlci5wbDwvY29kZT4gQ0dJIBskQiU5JS8laiVXJUgkcjUvRjAkOSRrJGgkJiRLJEokaiReJDkhIxsoQjwvcD4KLQotPHByZT4KLSAgICAgQWN0aW9uIGFkZC1mb290ZXIgL2NnaS1iaW4vZm9vdGVyLnBsCi0gICAgIEFkZEhhbmRsZXIgYWRkLWZvb3RlciAuaHRtbAotPC9wcmU+Ci0KLTxwPkNHSSAbJEIlOSUvJWolVyVIJE9LPiReJDckJD0kQDUkZERJMkMkcjlUJEokQyRGISI4NSE5TVc1YSQ1JGwkP0o4PXEbKEIKLSgbJEI0RDYtSlE/dBsoQiA8Y29kZT5QQVRIX1RSQU5TTEFURUQ8L2NvZGU+IBskQiRHO1gkNSRsJEYkJCReJDkbKEIpIBskQiRyQXcka0BVRyQkLCQiJGokXiQ5ISMbKEI8L3A+Ci0KLTxoMz5IVFRQIBskQiVYJUMlQCROJCIkayVVJSElJCVrGyhCPC9oMz4KLQotPHA+GyRCMEoyPCROJUclIyVsJS8lRiUjJVYkTxsoQiA8Y29kZT5zZW5kLWFzLWlzPC9jb2RlPiAbJEIlTyVzJUklaSRyO0hNUSQ5JGsbKEIKLRskQiRoJCYkSztYPCgkNyReJDkhIyQzJE4lTyVzJUklaSRPPCtKLDwrP0gkThsoQiBIVFRQIBskQiVYJUMlQCRyO30kQyRGJCQkayVVJSElJCVrJEsbKEIKLRskQjtITVEkNSRsJF4kOSEjJDMkMyRHJE8hIjNIRCU7UiRLNFgkbyRpJDohIhsoQjxjb2RlPi93ZWIvaHRkb2NzL2FzaXM8L2NvZGU+Ci0bJEIlRyUjJWwlLyVIJWokSyQiJGtBNCRGJE4lVSUhJSQlayRPGyhCIDxjb2RlPnNlbmQtYXMtaXM8L2NvZGU+IBskQiVPJXMlSSVpJEskaCRDJEYbKEIKLRskQjA3JG8kbCReJDkhIxsoQjwvcD4KLQotPHByZT4KLSAgICAmbHQ7RGlyZWN0b3J5IC93ZWIvaHRkb2NzL2FzaXMmZ3Q7Ci0gICAgU2V0SGFuZGxlciBzZW5kLWFzLWlzCi0gICAgJmx0Oy9EaXJlY3RvcnkmZ3Q7Ci08L3ByZT4KLQotPGhyPgotCi08aDI+PGEgbmFtZT0icHJvZ3JhbW1lciI+GyRCJVclbSUwJWklXjh+JDEkTiVhJWIbKEI8L2E+PC9oMj4KLQotPHA+GyRCJU8lcyVJJWkkTjUhRz0kcjxCQXUkOSRrJD8kYSRLISJNeE1RJDkkayRISlhNeCQrJGIkNyRsJEokJCRiJE4kLBsoQgotPGEgaHJlZj0ibWlzYy9BUEkuaHRtbCI+QXBhY2hlIEFQSTwvYT4gGyRCJEtESTJDJDUkbCReJDckPyEjGyhCCi0bJEI+XCQ3JC84QCQmJEghIhsoQjxjb2RlPnJlcXVlc3RfcmVjPC9jb2RlPiAbJEI5PUIkQk4kSz83JDckJCVsJTMhPCVJJCwbKEIKLRskQkRJMkMkNSRsJD8kSCQkJCYkMyRIJEckOSEjGyhCPC9wPgotPHByZT4KLSAgICBjaGFyICpoYW5kbGVyCi08L3ByZT4KLTxwPhskQiRiJDclYiU4JWUhPCVrJCwlTyVzJUklaSRLNFgkbyRqJD8kJD5sOWchIiRkJGkkSiQxJGwkUCRKJGkkSiQkJDMkSCRPISIbKEIKLRskQiVqJS8lKCU5JUgkLBsoQiA8Y29kZT5pbnZva2VfaGFuZGxlcjwvY29kZT4gGyRCJTklRiE8JTgkS0MjJDkkazBKQTAkSxsoQgotPGNvZGU+ci0mZ3Q7aGFuZGxlcjwvY29kZT4gGyRCJHJAX0RqJDkkayQzJEgkQCQxJEckOSEjGyhCCi0bJEIlTyVzJUklaSRPJTMlcyVGJXMlSCU/JSQlVyROQmUkbyRqJEslTyVzJUklaUw+JHI7SCQmJGgkJiRLJEokQyRGJCQkayQzJEgwSjMwJE8hIhsoQgotGyRCMEpBMCRIRjEkOCRoJCYkSzxCQXUkNSRsJEYkJCReJDkhI0ksJDpNVzVhJDUkbCRGJCQkayRvJDEkRyRPJCIkaiReJDskcyQsISIbKEIKLRskQiVhJUclIyUiJT8lJCVXJE5MPkEwNnU0ViRyPy8kNSRKJCQkaCQmJEshIiVPJXMlSSVpJE5MPkEwJEskTyU5JWklQyU3JWUbKEIKLRskQiRyNF4kXiRKJCQhIiVAJUMlNyVlGyhCICgbJEJMdUNtGyhCOiAiLSIpIBskQiRHSixOJSQ1JGwkP0w+QTAkcklVJDEkaz0sNDckSyRKJEMkRiQkJF4kOSEjGyhCPC9QPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvaG93dG8vYXV0aC5odG1sIGIvZG9jcy9tYW51YWwvaG93dG8vYXV0aC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzExZmZjLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2hvd3RvL2F1dGguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci0KLTxodG1sPgotICA8aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkhUTUwgVGlkeSwgc2VlIHd3dy53My5vcmciPgotCi0gICAgPHRpdGxlPkF1dGhlbnRpY2F0aW9uPC90aXRsZT4KLSAgICA8bGluayByZXY9Im1hZGUiIGhyZWY9Im1haWx0bzpyYm93ZW5AcmNib3dlbi5jb20iPgotICA8L2hlYWQ+Ci0gIDwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLQotICA8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB0ZXh0PSIjMDAwMDAwIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0KLSAgIiMwMDAwODAiIGFsaW5rPSIjRkYwMDAwIj4KLSAgICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotCi0gICAgPGgxIGFsaWduPSJDRU5URVIiPkF1dGhlbnRpY2F0aW9uPC9oMT4KLSAgICA8YSBuYW1lPSJfX2luZGV4X18iPjwvYT4gPCEtLSBJTkRFWCBCRUdJTiAtLT4KLSAgICAgCi0KLSAgICA8dWw+Ci0gICAgICA8bGk+PGEgaHJlZj0iI2ludHJvZHVjdGlvbiI+SW50cm9kdWN0aW9uPC9hPjwvbGk+Ci0KLSAgICAgIDxsaT48YSBocmVmPSIjdGhlIHByZXJlcXVpc2l0ZXMiPlRoZSBwcmVyZXF1aXNpdGVzPC9hPjwvbGk+Ci0KLSAgICAgIDxsaT48YSBocmVmPSIjZ2V0dGluZyBpdCB3b3JraW5nLiI+R2V0dGluZyBpdAotICAgICAgd29ya2luZy48L2E+PC9saT4KLQotICAgICAgPGxpPjxhIGhyZWY9IiNsZXR0aW5nIG1vcmUgdGhhbiBvbmUgcGVyc29uIGluIj5MZXR0aW5nIG1vcmUKLSAgICAgIHRoYW4gb25lIHBlcnNvbiBpbjwvYT48L2xpPgotCi0gICAgICA8bGk+PGEgaHJlZj0iI3Bvc3NpYmxlIHByb2JsZW1zIj5Qb3NzaWJsZSBwcm9ibGVtczwvYT48L2xpPgotCi0gICAgICA8bGk+PGEgaHJlZj0iI3doYXQgb3RoZXIgbmVhdCBzdHVmZiBjYW4gaSBkbyI+V2hhdCBvdGhlciBuZWF0Ci0gICAgICBzdHVmZiBjYW4gSSBkbz88L2E+PC9saT4KLQotICAgICAgPGxpPjxhIGhyZWY9IiNtb3JlIGluZm9ybWF0aW9uIj5Nb3JlIGluZm9ybWF0aW9uPC9hPjwvbGk+Ci0gICAgPC91bD4KLSAgICA8IS0tIElOREVYIEVORCAtLT4KLSAgICA8aHI+Ci0KLTx0YWJsZSBib3JkZXI9IjEiPgotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48c3Ryb25nPlJlbGF0ZWQgTW9kdWxlczwvc3Ryb25nPjxicj4KLTxicj4KLSA8YSBocmVmPSIuLi9tb2QvbW9kX2F1dGguaHRtbCI+bW9kX2F1dGg8L2E+PGJyPgotIDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiPjxzdHJvbmc+UmVsYXRlZCBEaXJlY3RpdmVzPC9zdHJvbmc+PGJyPgotPGJyPgotIDxhIGhyZWY9Ii4uL21vZC9tb2RfYWNjZXNzLmh0bWwjYWxsb3ciPkFsbG93PC9hPjxicj4KLSA8YSBocmVmPSIuLi9tb2QvbW9kX2F1dGguaHRtbCNhdXRoZ3JvdXBmaWxlIj5BdXRoR3JvdXBGaWxlPC9hPjxicj4KLSA8YSBocmVmPSIuLi9tb2QvY29yZS5odG1sI2F1dGhuYW1lIj5BdXRoTmFtZTwvYT48YnI+Ci0gPGEgaHJlZj0iLi4vbW9kL2NvcmUuaHRtbCNhdXRodHlwZSI+QXV0aFR5cGU8L2E+PGJyPgotIDxhIGhyZWY9Ii4uL21vZC9tb2RfYXV0aC5odG1sI2F1dGh1c2VyZmlsZSI+QXV0aFVzZXJGaWxlPC9hPjxicj4KLSA8YSBocmVmPSIuLi9tb2QvbW9kX2FjY2Vzcy5odG1sI2RlbnkiPkRlbnk8L2E+PGJyPgotIDxhIGhyZWY9Ii4uL21vZC9jb3JlLmh0bWwjb3B0aW9ucyI+T3B0aW9uczwvYT48YnI+Ci0gPGEgaHJlZj0iLi4vbW9kL2NvcmUuaHRtbCNyZXF1aXJlIj5SZXF1aXJlPC9hPjxicj4KLQotIDwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLSAgIAotCi0gICAgPGgxPjxhIG5hbWU9ImF1dGhlbnRpY2F0aW9uIj5BdXRoZW50aWNhdGlvbjwvYT48L2gxPgotCi0gICAgPHA+QXV0aGVudGljYXRpb24gaXMgYW55IHByb2Nlc3MgYnkgd2hpY2ggeW91IHZlcmlmeSB0aGF0Ci0gICAgc29tZW9uZSBpcyB3aG8gdGhleSBjbGFpbSB0aGV5IGFyZS4gQXV0aG9yaXphdGlvbiBpcyBhbnkKLSAgICBwcm9jZXNzIGJ5IHdoaWNoIHNvbWVvbmUgaXMgYWxsb3dlZCB0byBiZSB3aGVyZSB0aGV5IHdhbnQgdG8KLSAgICBnbywgb3IgdG8gaGF2ZSBpbmZvcm1hdGlvbiB0aGF0IHRoZXkgd2FudCB0byBoYXZlLjwvcD4KLQotICAgIDxoMj48YSBuYW1lPSJpbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbjwvYT48L2gyPgotCi0gICAgPHA+SWYgeW91IGhhdmUgaW5mb3JtYXRpb24gb24geW91ciB3ZWIgc2l0ZSB0aGF0IGlzIHNlbnNpdGl2ZQotICAgIG9yIGludGVuZGVkIGZvciBvbmx5IGEgc21hbGwgZ3JvdXAgb2YgcGVvcGxlLCB0aGUgdGVjaG5pcXVlcyBpbgotICAgIHRoaXMgYXJ0aWNsZSB3aWxsIGhlbHAgeW91IG1ha2Ugc3VyZSB0aGF0IHRoZSBwZW9wbGUgdGhhdCBzZWUKLSAgICB0aG9zZSBwYWdlcyBhcmUgdGhlIHBlb3BsZSB0aGF0IHlvdSB3YW50ZWQgdG8gc2VlIHRoZW0uPC9wPgotCi0gICAgPHA+VGhpcyBhcnRpY2xlIGNvdmVycyB0aGUgInN0YW5kYXJkIiB3YXkgb2YgcHJvdGVjdGluZyBwYXJ0cyBvZiB5b3VyCi0gICAgd2ViIHNpdGUgdGhhdCBtb3N0IG9mIHlvdSBhcmUgZ29pbmcgdG8gdXNlLjwvcD4KLQotICAgIDxoMj48YSBuYW1lPSJ0aGUgcHJlcmVxdWlzaXRlcyI+VGhlIHByZXJlcXVpc2l0ZXM8L2E+PC9oMj4KLQotICAgIDxwPlRoZSBkaXJlY3RpdmVzIGRpc2N1c3NlZCBpbiB0aGlzIGFydGljbGUgd2lsbCBuZWVkIHRvIGdvIGVpdGhlcgotICAgIGluIHlvdXIgbWFpbiBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlLCBvciBpbiBwZXItZGlyZWN0b3J5Ci0gICAgY29uZmlndXJhdGlvbiBmaWxlcyAoPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBmaWxlcykuPC9wPgotCi0gICAgPHA+SWYgeW91IHBsYW4gdG8gdXNlIDxjb2RlPi5odGFjY2VzczwvY29kZT4gZmlsZXMsIHlvdSB3aWxsIG5lZWQgdG8KLSAgICBoYXZlIGEgc2VydmVyIGNvbmZpZ3VyYXRpb24gdGhhdCBwZXJtaXRzIHB1dHRpbmcgYXV0aGVudGljYXRpb24KLSAgICBkaXJlY3RpdmVzIGluIHRoZXNlIGZpbGVzLiBUaGlzIGlzIGRvbmUgd2l0aCB0aGUgCi0gICAgPGNvZGU+PGEgaHJlZj0iLi4vbW9kL2NvcmUuaHRtbCNhbGxvd292ZXJyaWRlIj5BbGxvd092ZXJyaWRlPC9hPjwvY29kZT4KLSAgICBkaXJlY3RpdmUsIHdoaWNoIHNwZWNpZmllcyB3aGljaCBkaXJlY3RpdmVzLCBpZiBhbnksIG1heSBiZSBwdXQgaW4KLSAgICBwZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24gZmlsZXMuPC9wPgotCi0gICAgPHA+U2luY2Ugd2UncmUgdGFsa2luZyBoZXJlIGFib3V0IGF1dGhlbnRpY2F0aW9uLCB5b3Ugd2lsbCBuZWVkIGFuCi0gICAgPGNvZGU+QWxsb3dPdmVycmlkZTwvY29kZT4gZGlyZWN0aXZlIGxpa2UgdGhlIGZvbGxvd2luZzo8L3A+Ci0KLTxwcmU+Ci0gICAgQWxsb3dPdmVycmlkZSBBdXRoQ29uZmlnCi08L3ByZT4KLQotICAgIDxwPk9yLCBpZiB5b3UgYXJlIGp1c3QgZ29pbmcgdG8gcHV0IHRoZSBkaXJlY3RpdmVzIGRpcmVjdGx5IGluIHlvdXIKLSAgICBtYWluIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGUsIHlvdSB3aWxsIG9mIGNvdXJzZSBuZWVkIHRvIGhhdmUKLSAgICB3cml0ZSBwZXJtaXNzaW9uIHRvIHRoYXQgZmlsZS48L3A+Ci0KLSAgICA8cD5BbmQgeW91J2xsIG5lZWQgdG8ga25vdyBhIGxpdHRsZSBiaXQgYWJvdXQgdGhlIGRpcmVjdG9yeQotICAgIHN0cnVjdHVyZSBvZiB5b3VyIHNlcnZlciwgaW4gb3JkZXIgdG8ga25vdyB3aGVyZSBzb21lIGZpbGVzIGFyZQotICAgIGtlcHQuIFRoaXMgc2hvdWxkIG5vdCBiZSB0ZXJyaWJseSBkaWZmaWN1bHQsIGFuZCBJJ2xsIHRyeSB0bwotICAgIG1ha2UgdGhpcyBjbGVhciB3aGVuIHdlIGNvbWUgdG8gdGhhdCBwb2ludC48L3A+Ci0KLSAgICA8aDI+PGEgbmFtZT0iZ2V0dGluZyBpdCB3b3JraW5nLiI+R2V0dGluZyBpdCB3b3JraW5nLjwvYT48L2gyPgotCi0gICAgPHA+SGVyZSdzIHRoZSBiYXNpY3Mgb2YgcGFzc3dvcmQgcHJvdGVjdGluZyBhIGRpcmVjdG9yeSBvbiB5b3VyCi0gICAgc2VydmVyLjwvcD4KLQotICAgIDxwPllvdSdsbCBuZWVkIHRvIGNyZWF0ZSBhIHBhc3N3b3JkIGZpbGUuIFRoaXMgZmlsZSBzaG91bGQgYmUKLSAgICBwbGFjZWQgc29tZXdoZXJlIG91dHNpZGUgb2YgeW91ciBkb2N1bWVudCBkaXJlY3RvcnkuIFRoaXMgaXMgc28KLSAgICB0aGF0IGZvbGtzIGNhbm5vdCBkb3dubG9hZCB0aGUgcGFzc3dvcmQgZmlsZS4gRm9yIGV4YW1wbGUsIGlmCi0gICAgeW91ciBkb2N1bWVudHMgYXJlIHNlcnZlZCBvdXQgb2YKLSAgICA8Y29kZT4vdXNyL2xvY2FsL2FwYWNoZS9odGRvY3M8L2NvZGU+IHlvdSBtaWdodCB3YW50IHRvIHB1dCB0aGUKLSAgICBwYXNzd29yZCBmaWxlKHMpIGluIDxjb2RlPi91c3IvbG9jYWwvYXBhY2hlL3Bhc3N3ZDwvY29kZT4uPC9wPgotCi0gICAgPHA+VG8gY3JlYXRlIHRoZSBmaWxlLCB1c2UgdGhlIDxjb2RlPmh0cGFzc3dkPC9jb2RlPiB1dGlsaXR5Ci0gICAgdGhhdCBjYW1lIHdpdGggQXBhY2hlLiBUaGlzIGJlIGxvY2F0ZWQgaW4gdGhlIDxjb2RlPmJpbjwvY29kZT4KLSAgICBkaXJlY3Rvcnkgb2Ygd2hlcmV2ZXIgeW91IGluc3RhbGxlZCBBcGFjaGUuIFRvIGNyZWF0ZSB0aGUgZmlsZSwKLSAgICB0eXBlOjwvcD4KLTxwcmU+Ci0gICAgICAgIGh0cGFzc3dkIC1jIC91c3IvbG9jYWwvYXBhY2hlL3Bhc3N3ZC9wYXNzd29yZCByYm93ZW4KLTwvcHJlPgotCi0gICAgPHA+PGNvZGU+aHRwYXNzd2Q8L2NvZGU+IHdpbGwgYXNrIHlvdSBmb3IgdGhlIHBhc3N3b3JkLCBhbmQKLSAgICB0aGVuIGFzayB5b3UgdG8gdHlwZSBpdCBhZ2FpbiB0byBjb25maXJtIGl0OjwvcD4KLTxwcmU+Ci0gICAgICAgICMgaHRwYXNzd2QgLWMgL3Vzci9sb2NhbC9hcGFjaGUvcGFzc3dkL3Bhc3N3b3JkcyByYm93ZW4KLSAgICAgICAgTmV3IHBhc3N3b3JkOiBteXBhc3N3b3JkCi0gICAgICAgIFJlLXR5cGUgbmV3IHBhc3N3b3JkOiBteXBhc3N3b3JkCi0gICAgICAgIEFkZGluZyBwYXNzd29yZCBmb3IgdXNlciByYm93ZW4KLTwvcHJlPgotCi0gICAgPHA+SWYgPGNvZGU+aHRwYXNzd2Q8L2NvZGU+IGlzIG5vdCBpbiB5b3VyIHBhdGgsIG9mIGNvdXJzZQotICAgIHlvdSdsbCBoYXZlIHRvIHR5cGUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgZmlsZSB0byBnZXQgaXQgdG8gcnVuLgotICAgIE9uIG15IHNlcnZlciwgaXQncyBsb2NhdGVkIGF0Ci0gICAgPGNvZGU+L3Vzci9sb2NhbC9hcGFjaGUvYmluL2h0cGFzc3dkPC9jb2RlPjwvcD4KLQotICAgIDxwPk5leHQsIHlvdSdsbCBuZWVkIHRvIGNyZWF0ZSBhIGZpbGUgaW4gdGhlIGRpcmVjdG9yeSB5b3Ugd2FudAotICAgIHRvIHByb3RlY3QuIFRoaXMgZmlsZSBpcyB1c3VhbGx5IGNhbGxlZCA8Y29kZT4uaHRhY2Nlc3M8L2NvZGU+LAotICAgIGFsdGhvdWdoIG9uIFdpbmRvd3MgaXQncyBjYWxsZWQgPGNvZGU+aHRhY2Nlc3M8L2NvZGU+ICh3aXRob3V0Ci0gICAgdGhlIGxlYWRpbmcgcGVyaW9kLikgPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBuZWVkcyB0byBjb250YWluCi0gICAgdGhlIGZvbGxvd2luZyBsaW5lczo8L3A+Ci08cHJlPgotICAgICAgICBBdXRoVHlwZSBCYXNpYwotICAgICAgICBBdXRoTmFtZSAiQnkgSW52aXRhdGlvbiBPbmx5IgotICAgICAgICBBdXRoVXNlckZpbGUgL3Vzci9sb2NhbC9hcGFjaGUvcGFzc3dkL3Bhc3N3b3JkcwotICAgICAgICBBdXRoR3JvdXBGaWxlIC9kZXYvbnVsbAotICAgICAgICByZXF1aXJlIHVzZXIgcmJvd2VuCi08L3ByZT4KLQotICAgIDxwPlRoZSBuZXh0IHRpbWUgdGhhdCB5b3UgbG9hZCBhIGZpbGUgZnJvbSB0aGF0IGRpcmVjdG9yeSwgeW91Ci0gICAgc2hvdWxkIHNlZSB0aGUgZmFtaWxpYXIgdXNlcm5hbWUvcGFzc3dvcmQgZGlhbG9nIGJveCBwb3AgdXAuIElmCi0gICAgeW91IGRvbid0IGNoYW5jZXMgYXJlIHByZXR0eSBnb29kIHRoYXQgeW91IGFyZSBub3QgcGVybWl0dGVkIHRvCi0gICAgdXNlIDxjb2RlPi5odGFjY2VzczwvY29kZT4gZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSBpbgotICAgIHF1ZXN0aW9uLjwvcD4KLQotICAgIDxoMj48YSBuYW1lPSJsZXR0aW5nIG1vcmUgdGhhbiBvbmUgcGVyc29uIGluIj5MZXR0aW5nIG1vcmUgdGhhbgotICAgIG9uZSBwZXJzb24gaW48L2E+PC9oMj4KLQotICAgIDxwPlRoZSBkaXJlY3RpdmVzIGFib3ZlIG9ubHkgbGV0IG9uZSBwZXJzb24gKHNwZWNpZmljYWxseQotICAgIHNvbWVvbmUgd2l0aCBhIHVzZXJuYW1lIG9mIDxjb2RlPnJib3dlbjwvY29kZT4pIGludG8gdGhlCi0gICAgZGlyZWN0b3J5LiBJbiBtb3N0IGNhc2VzLCB5b3UnbGwgd2FudCB0byBsZXQgbW9yZSB0aGFuIG9uZQotICAgIHBlcnNvbiBpbi4gVGhpcyBpcyB3aGVyZSB0aGUgPGNvZGU+QXV0aEdyb3VwRmlsZTwvY29kZT4gY29tZXMKLSAgICBpbi4gSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHdlJ3ZlIHBvaW50ZWQKLSAgICA8Y29kZT5BdXRoR3JvdXBGaWxlPC9jb2RlPiB0byA8Y29kZT4vZGV2L251bGw8L2NvZGU+LCB3aGljaCBpcwotICAgIFVuaXgtc3BlYWsgZm9yICJub3doZXJlIiwgb3IgIm9mZiBpbnRvIHNwYWNlLiIgKFRoZSBXaW5kb3dzCi0gICAgTlQgZXF1aXZhbGVudCBvZiB0aGlzIGlzIDxjb2RlPm51bDwvY29kZT4uKTwvcD4KLQotICAgIDxwPklmIHlvdSB3YW50IHRvIGxldCBtb3JlIHRoYW4gb25lIHBlcnNvbiBpbiwgeW91J2xsIG5lZWQgdG8KLSAgICBjcmVhdGUgYSBncm91cCBmaWxlIHRoYXQgYXNzb2NpYXRlcyBncm91cCBuYW1lcyB3aXRoIGEgbGlzdCBvZgotICAgIHVzZXJzIGluIHRoYXQgZ3JvdXAuIFRoZSBmb3JtYXQgb2YgdGhpcyBmaWxlIGlzIHByZXR0eSBzaW1wbGUsCi0gICAgYW5kIHlvdSBjYW4gY3JlYXRlIGl0IHdpdGggeW91ciBmYXZvcml0ZSBlZGl0b3IuIFRoZSBjb250ZW50cwotICAgIG9mIHRoZSBmaWxlIHdpbGwgbG9vayBsaWtlIHRoaXM6PC9wPgotPHByZT4KLSAgICAgICAgR3JvdXBOYW1lOiByYm93ZW4gZHBpdHRzIHN1bmdvIHJzaGVyc2V5Ci08L3ByZT4KLQotICAgIDxwPlRoYXQncyBqdXN0IGEgbGlzdCBvZiB0aGUgbWVtYmVycyBvZiB0aGUgZ3JvdXAgaW4gYSBsb25nCi0gICAgbGluZSBzZXBhcmF0ZWQgYnkgc3BhY2VzLjwvcD4KLQotICAgIDxwPlRvIGFkZCBhIHVzZXIgdG8geW91ciBhbHJlYWR5IGV4aXN0aW5nIHBhc3N3b3JkIGZpbGUsCi0gICAgdHlwZTo8L3A+Ci08cHJlPgotICAgICAgICBodHBhc3N3ZCAvdXNyL2xvY2FsL2FwYWNoZS9wYXNzd2QvcGFzc3dvcmQgZHBpdHRzCi08L3ByZT4KLQotICAgIDxwPllvdSdsbCBnZXQgdGhlIHNhbWUgcmVzcG9uc2UgYXMgYmVmb3JlLCBidXQgaXQgd2lsbCBiZQotICAgIGFwcGVuZGVkIHRvIHRoZSBleGlzdGluZyBmaWxlLCByYXRoZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBmaWxlLgotICAgIChJdCdzIHRoZSA8Y29kZT4tYzwvY29kZT4gdGhhdCBtYWtlcyBpdCBjcmVhdGUgYSBuZXcgcGFzc3dvcmQKLSAgICBmaWxlLjwvcD4KLQotICAgIDxwPk5vdywgeW91IG5lZWQgdG8gbW9kaWZ5IHlvdXIgPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBmaWxlIHRvCi0gICAgbG9vayBsaWtlIHRoZSBmb2xsb3dpbmc6PC9wPgotPHByZT4KLSAgICAgICAgQXV0aFR5cGUgQmFzaWMKLSAgICAgICAgQXV0aE5hbWUgIkJ5IEludml0YXRpb24gT25seSIKLSAgICAgICAgQXV0aFVzZXJGaWxlIC91c3IvbG9jYWwvYXBhY2hlL3Bhc3N3ZC9wYXNzd29yZHMKLSAgICAgICAgQXV0aEdyb3VwRmlsZSAvdXNyL2xvY2FsL2FwYWNoZS9wYXNzd2QvZ3JvdXBzCi0gICAgICAgIHJlcXVpcmUgZ3JvdXAgR3JvdXBOYW1lCi08L3ByZT4KLQotICAgIDxwPk5vdywgYW55b25lIHRoYXQgaXMgbGlzdGVkIGluIHRoZSBncm91cAotICAgIDxjb2RlPkdyb3VwTmFtZTwvY29kZT4sIGFuZCBoYXMgYW4gZW50cnkgaW4gdGhlCi0gICAgPGNvZGU+cGFzc3dvcmQ8L2NvZGU+IGZpbGUsIHdpbGwgYmUgbGV0IGluLCBpZiB0aGV5IHR5cGUgdGhlCi0gICAgY29ycmVjdCBwYXNzd29yZC48L3A+Ci0KLSAgICA8cD5UaGVyZSdzIGFub3RoZXIgd2F5IHRvIGxldCBtdWx0aXBsZSB1c2VycyBpbiB0aGF0IGlzIGxlc3MKLSAgICBzcGVjaWZpYy4gUmF0aGVyIHRoYW4gY3JlYXRpbmcgYSBncm91cCBmaWxlLCB5b3UgY2FuIGp1c3QgdXNlCi0gICAgdGhlIGZvbGxvd2luZyBkaXJlY3RpdmU6PC9wPgotPHByZT4KLSAgICAgICAgcmVxdWlyZSB2YWxpZC11c2VyCi08L3ByZT4KLQotICAgIDxwPlVzaW5nIHRoYXQgcmF0aGVyIHRoYW4gdGhlIDxjb2RlPnJlcXVpcmUgdXNlciByYm93ZW48L2NvZGU+Ci0gICAgbGluZSB3aWxsIGFsbG93IGFueW9uZSBpbiB0aGF0IGlzIGxpc3RlZCBpbiB0aGUgcGFzc3dvcmQgZmlsZSwKLSAgICBhbmQgd2hvIGNvcnJlY3RseSBlbnRlcnMgdGhlaXIgcGFzc3dvcmQuIFlvdSBjYW4gZXZlbiBlbXVsYXRlCi0gICAgdGhlIGdyb3VwIGJlaGF2aW9yIGhlcmUsIGJ5IGp1c3Qga2VlcGluZyBhIHNlcGFyYXRlIHBhc3N3b3JkCi0gICAgZmlsZSBmb3IgZWFjaCBncm91cC4gVGhlIGFkdmFudGFnZSBvZiB0aGlzIGFwcHJvYWNoIGlzIHRoYXQKLSAgICBBcGFjaGUgb25seSBoYXMgdG8gY2hlY2sgb25lIGZpbGUsIHJhdGhlciB0aGFuIHR3by4gVGhlCi0gICAgZGlzYWR2YW50YWdlIGlzIHRoYXQgeW91IGhhdmUgdG8gbWFpbnRhaW4gYSBidW5jaCBvZiBwYXNzd29yZAotICAgIGZpbGVzLCBhbmQgcmVtZW1iZXIgdG8gcmVmZXJlbmNlIHRoIHJpZ2h0IG9uZSBpbiB0aGUKLSAgICA8Y29kZT5BdXRoVXNlckZpbGU8L2NvZGU+IGRpcmVjdGl2ZS48L3A+Ci0KLSAgICA8aDI+PGEgbmFtZT0icG9zc2libGUgcHJvYmxlbXMiPlBvc3NpYmxlIHByb2JsZW1zPC9hPjwvaDI+Ci0KLSAgICA8cD5CZWNhdXNlIG9mIHRoZSB3YXkgdGhhdCBCYXNpYyBhdXRoZW50aWNhdGlvbiBpcyBzcGVjaWZpZWQsCi0gICAgeW91ciB1c2VybmFtZSBhbmQgcGFzc3dvcmQgbXVzdCBiZSB2ZXJpZmllZCBldmVyeSB0aW1lIHlvdQotICAgIHJlcXVlc3QgYSBkb2N1bWVudCBmcm9tIHRoZSBzZXJ2ZXIuIFRoaXMgaXMgZXZlbiBpZiB5b3UncmUKLSAgICByZWxvYWRpbmcgdGhlIHNhbWUgcGFnZSwgYW5kIGZvciBldmVyeSBpbWFnZSBvbiB0aGUgcGFnZSAoaWYKLSAgICB0aGV5IGNvbWUgZnJvbSBhIHByb3RlY3RlZCBkaXJlY3RvcnkpLiBBcyB5b3UgY2FuIGltYWdpbmUsIHRoaXMKLSAgICBzbG93cyB0aGluZ3MgZG93biBhIGxpdHRsZS4gVGhlIGFtb3VudCB0aGF0IGl0IHNsb3dzIHRoaW5ncwotICAgIGRvd24gaXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBwYXNzd29yZCBmaWxlLCBiZWNhdXNlCi0gICAgaXQgaGFzIHRvIG9wZW4gdXAgdGhhdCBmaWxlLCBhbmQgZ28gZG93biB0aGUgbGlzdCBvZiB1c2VycwotICAgIHVudGlsIGl0IGdldHMgdG8geW91ciBuYW1lLiBBbmQgaXQgaGFzIHRvIGRvIHRoaXMgZXZlcnkgdGltZSBhCi0gICAgcGFnZSBpcyBsb2FkZWQuPC9wPgotCi0gICAgPHA+QSBjb25zZXF1ZW5jZSBvZiB0aGlzIGlzIHRoYXQgdGhlcmUncyBhIHByYWN0aWNhbCBsaW1pdCB0byBob3cgbWFueQotICAgIHVzZXJzIHlvdSBjYW4gcHV0IGluIG9uZSBwYXNzd29yZCBmaWxlLiBUaGlzIGxpbWl0IHdpbGwgdmFyeQotICAgIGRlcGVuZGluZyBvbiB0aGUgcGVyZm9ybWFuY2Ugb2YgeW91ciBwYXJ0aWN1bGFyIHNlcnZlciBtYWNoaW5lLCBidXQKLSAgICB5b3UgY2FuIGV4cGVjdCB0byBzZWUgc2xvd2Rvd25zIG9uY2UgeW91IGdldCBhYm92ZSBhIGZldyBodW5kcmVkCi0gICAgZW50cmllcywgYW5kIG1heSB3aXNoIHRvIGNvbnNpZGVyIGEgZGlmZmVyZW50IGF1dGhlbnRpY2F0aW9uIG1ldGhvZAotICAgIGF0IHRoYXQgdGltZS48L3A+Ci0KLSAgICA8aDI+PGEgbmFtZT0id2hhdCBvdGhlciBuZWF0IHN0dWZmIGNhbiBpIGRvIj5XaGF0IG90aGVyIG5lYXQKLSAgICBzdHVmZiBjYW4gSSBkbz88L2E+PC9oMj4KLQotICAgIDxwPkF1dGhlbnRpY2F0aW9uIGJ5IHVzZXJuYW1lIGFuZCBwYXNzd29yZCBpcyBvbmx5IHBhcnQgb2YgdGhlCi0gICAgc3RvcnkuIEZyZXF1ZW50bHkgeW91IHdhbnQgdG8gbGV0IHBlb3BsZSBpbiBiYXNlZCBvbiBzb21ldGhpbmcKLSAgICBvdGhlciB0aGFuIHdobyB0aGV5IGFyZS4gU29tZXRoaW5nIHN1Y2ggYXMgd2hlcmUgdGhleSBhcmUKLSAgICBjb21pbmcgZnJvbS48L3A+Ci0KLSAgICA8cD5UaGUgPGNvZGU+YWxsb3c8L2NvZGU+IGFuZCA8Y29kZT5kZW55PC9jb2RlPiBkaXJlY3RpdmVzIGxldAotICAgIHlvdSBhbGxvdyBhbmQgZGVueSBhY2Nlc3MgYmFzZWQgb24gdGhlIGhvc3QgbmFtZSwgb3IgaG9zdAotICAgIGFkZHJlc3MsIG9mIHRoZSBtYWNoaW5lIHJlcXVlc3RpbmcgYSBkb2N1bWVudC4gVGhlIGRpcmVjdGl2ZQotICAgIGdvZXMgaGFuZC1pbi1oYW5kIHdpdGggdGhlc2UgaXMgdGhlIDxjb2RlPm9yZGVyPC9jb2RlPgotICAgIGRpcmVjdGl2ZSwgd2hpY2ggdGVsbHMgQXBhY2hlIGluIHdoaWNoIG9yZGVyIHRvIGFwcGx5IHRoZQotICAgIGZpbHRlcnMuPC9wPgotCi0gICAgPHA+VGhlIHVzYWdlIG9mIHRoZXNlIGRpcmVjdGl2ZXMgaXM6PC9wPgotPHByZT4KLSAgICAgICAgYWxsb3cgZnJvbSBhZGRyZXNzCi08L3ByZT4KLQotICAgIDxwPndoZXJlIDxlbT5hZGRyZXNzPC9lbT4gaXMgYW4gSVAgYWRkcmVzcyAob3IgYSBwYXJ0aWFsIElQCi0gICAgYWRkcmVzcykgb3IgYSBmdWxseSBxdWFsaWZpZWQgZG9tYWluIG5hbWUgKG9yIGEgcGFydGlhbCBkb21haW4KLSAgICBuYW1lKS48L3A+Ci0KLSAgICA8cD5Gb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgc29tZW9uZSBzcGFtbWluZyB5b3VyIG1lc3NhZ2UKLSAgICBib2FyZCwgYW5kIHlvdSB3YW50IHRvIGtlZXAgdGhlbSBvdXQsIHlvdSBjb3VsZCBkbyB0aGUKLSAgICBmb2xsb3dpbmc6PC9wPgotPHByZT4KLSAgICAgICAgZGVueSBmcm9tIDIwNS4yNTIuNDYuMTY1Ci08L3ByZT4KLQotICAgIDxwPlZpc2l0b3JzIGNvbWluZyBmcm9tIHRoYXQgYWRkcmVzcyB3aWxsIG5vdCBiZSBhYmxlIHRvIHNlZQotICAgIHRoZSBjb250ZW50IGJlaGluZCB0aGlzIGRpcmVjdGl2ZS4gSWYsIGluc3RlYWQsIHlvdSBoYXZlIGEKLSAgICBtYWNoaW5lIG5hbWUsIHJhdGhlciB0aGFuIGFuIElQIGFkZHJlc3MsIHlvdSBjYW4gdXNlIHRoYXQuPC9wPgotPHByZT4KLSAgICAgICAgZGVueSBmcm9tIGhvc3QuZXhhbXBsZS5jb20KLTwvcHJlPgotCi0gICAgPHA+QW5kLCBpZiB5b3UnZCBsaWtlIHRvIGJsb2NrIGFjY2VzcyBmcm9tIGFuIGVudGlyZSBkb21haW4sCi0gICAgeW91IGNhbiBzcGVjaWZ5IGp1c3QgcGFydCBvZiBhbiBhZGRyZXNzIG9yIGRvbWFpbiBuYW1lOjwvcD4KLTxwcmU+Ci0gICAgICAgIGRlbnkgZnJvbSAxOTIuMTAxLjIwNQotICAgICAgICBkZW55IGZyb20gY3liZXJ0aHVncy5jb20KLSAgICAgICAgZGVueSBmcm9tIGtlCi08L3ByZT4KLQotICAgIDxwPlVzaW5nIDxjb2RlPm9yZGVyPC9jb2RlPiB3aWxsIGxldCB5b3UgYmUgc3VyZSB0aGF0IHlvdSBhcmUKLSAgICBhY3R1YWxseSByZXN0cmljdGluZyB0aGluZ3MgdG8gdGhlIGdyb3VwIHRoYXQgeW91IHdhbnQgdG8gbGV0Ci0gICAgaW4sIGJ5IGNvbWJpbmluZyBhIDxjb2RlPmRlbnk8L2NvZGU+IGFuZCBhbiA8Y29kZT5hbGxvdzwvY29kZT4KLSAgICBkaXJlY3RpdmU6PC9wPgotPHByZT4KLSAgICAgICAgb3JkZXIgZGVueSxhbGxvdwotICAgICAgICBkZW55IGZyb20gYWxsCi0gICAgICAgIGFsbG93IGZyb20gZGV2LmV4YW1wbGUuY29tCi08L3ByZT4KLQotICAgIDxwPkxpc3RpbmcganVzdCB0aGUgPGNvZGU+YWxsb3c8L2NvZGU+IGRpcmVjdGl2ZSB3b3VsZCBub3QgZG8KLSAgICB3aGF0IHlvdSB3YW50LCBiZWNhdXNlIGl0IHdpbGwgbGV0IGZvbGtzIGZyb20gdGhhdCBob3N0IGluLCBpbgotICAgIGFkZGl0aW9uIHRvIGxldHRpbmcgZXZlcnlvbmUgaW4uIFdoYXQgeW91IHdhbnQgaXMgdG8gbGV0Ci0gICAgPGVtPm9ubHk8L2VtPiB0aG9zZSBmb2xrcyBpbi48L3A+Ci0KLSAgICA8aDI+PGEgbmFtZT0ibW9yZSBpbmZvcm1hdGlvbiI+TW9yZSBpbmZvcm1hdGlvbjwvYT48L2gyPgotCi0gICAgPHA+WW91IHNob3VsZCBhbHNvIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yCi0gICAgPGNvZGU+PGEgaHJlZj0iLi4vbW9kL21vZF9hdXRoLmh0bWwiPm1vZF9hdXRoPC9hPjwvY29kZT4KLSAgICB3aGljaCBjb250YWlucwotICAgIHNvbWUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgdGhpcyBhbGwgd29ya3MuPC9wPgotICA8L2JvZHk+Ci08L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2hvd3RvL2F1dGguaHRtbC5lbiBiL2RvY3MvbWFudWFsL2hvd3RvL2F1dGguaHRtbC5lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMxMWZmYy4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9ob3d0by9hdXRoLmh0bWwuZW4KKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotCi08aHRtbD4KLSAgPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJIVE1MIFRpZHksIHNlZSB3d3cudzMub3JnIj4KLQotICAgIDx0aXRsZT5BdXRoZW50aWNhdGlvbjwvdGl0bGU+Ci0gICAgPGxpbmsgcmV2PSJtYWRlIiBocmVmPSJtYWlsdG86cmJvd2VuQHJjYm93ZW4uY29tIj4KLSAgPC9oZWFkPgotICA8IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci0KLSAgPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdGV4dD0iIzAwMDAwMCIgbGluaz0iIzAwMDBGRiIgdmxpbms9Ci0gICIjMDAwMDgwIiBhbGluaz0iI0ZGMDAwMCI+Ci0gICAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLQotICAgIDxoMSBhbGlnbj0iQ0VOVEVSIj5BdXRoZW50aWNhdGlvbjwvaDE+Ci0gICAgPGEgbmFtZT0iX19pbmRleF9fIj48L2E+IDwhLS0gSU5ERVggQkVHSU4gLS0+Ci0gICAgIAotCi0gICAgPHVsPgotICAgICAgPGxpPjxhIGhyZWY9IiNpbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbjwvYT48L2xpPgotCi0gICAgICA8bGk+PGEgaHJlZj0iI3RoZSBwcmVyZXF1aXNpdGVzIj5UaGUgcHJlcmVxdWlzaXRlczwvYT48L2xpPgotCi0gICAgICA8bGk+PGEgaHJlZj0iI2dldHRpbmcgaXQgd29ya2luZy4iPkdldHRpbmcgaXQKLSAgICAgIHdvcmtpbmcuPC9hPjwvbGk+Ci0KLSAgICAgIDxsaT48YSBocmVmPSIjbGV0dGluZyBtb3JlIHRoYW4gb25lIHBlcnNvbiBpbiI+TGV0dGluZyBtb3JlCi0gICAgICB0aGFuIG9uZSBwZXJzb24gaW48L2E+PC9saT4KLQotICAgICAgPGxpPjxhIGhyZWY9IiNwb3NzaWJsZSBwcm9ibGVtcyI+UG9zc2libGUgcHJvYmxlbXM8L2E+PC9saT4KLQotICAgICAgPGxpPjxhIGhyZWY9IiN3aGF0IG90aGVyIG5lYXQgc3R1ZmYgY2FuIGkgZG8iPldoYXQgb3RoZXIgbmVhdAotICAgICAgc3R1ZmYgY2FuIEkgZG8/PC9hPjwvbGk+Ci0KLSAgICAgIDxsaT48YSBocmVmPSIjbW9yZSBpbmZvcm1hdGlvbiI+TW9yZSBpbmZvcm1hdGlvbjwvYT48L2xpPgotICAgIDwvdWw+Ci0gICAgPCEtLSBJTkRFWCBFTkQgLS0+Ci0gICAgPGhyPgotCi08dGFibGUgYm9yZGVyPSIxIj4KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+PHN0cm9uZz5SZWxhdGVkIE1vZHVsZXM8L3N0cm9uZz48YnI+Ci08YnI+Ci0gPGEgaHJlZj0iLi4vbW9kL21vZF9hdXRoLmh0bWwiPm1vZF9hdXRoPC9hPjxicj4KLSA8L3RkPgotPHRkIHZhbGlnbj0idG9wIj48c3Ryb25nPlJlbGF0ZWQgRGlyZWN0aXZlczwvc3Ryb25nPjxicj4KLTxicj4KLSA8YSBocmVmPSIuLi9tb2QvbW9kX2FjY2Vzcy5odG1sI2FsbG93Ij5BbGxvdzwvYT48YnI+Ci0gPGEgaHJlZj0iLi4vbW9kL21vZF9hdXRoLmh0bWwjYXV0aGdyb3VwZmlsZSI+QXV0aEdyb3VwRmlsZTwvYT48YnI+Ci0gPGEgaHJlZj0iLi4vbW9kL2NvcmUuaHRtbCNhdXRobmFtZSI+QXV0aE5hbWU8L2E+PGJyPgotIDxhIGhyZWY9Ii4uL21vZC9jb3JlLmh0bWwjYXV0aHR5cGUiPkF1dGhUeXBlPC9hPjxicj4KLSA8YSBocmVmPSIuLi9tb2QvbW9kX2F1dGguaHRtbCNhdXRodXNlcmZpbGUiPkF1dGhVc2VyRmlsZTwvYT48YnI+Ci0gPGEgaHJlZj0iLi4vbW9kL21vZF9hY2Nlc3MuaHRtbCNkZW55Ij5EZW55PC9hPjxicj4KLSA8YSBocmVmPSIuLi9tb2QvY29yZS5odG1sI29wdGlvbnMiPk9wdGlvbnM8L2E+PGJyPgotIDxhIGhyZWY9Ii4uL21vZC9jb3JlLmh0bWwjcmVxdWlyZSI+UmVxdWlyZTwvYT48YnI+Ci0KLSA8L3RkPgotPC90cj4KLTwvdGFibGU+Ci0gICAKLQotICAgIDxoMT48YSBuYW1lPSJhdXRoZW50aWNhdGlvbiI+QXV0aGVudGljYXRpb248L2E+PC9oMT4KLQotICAgIDxwPkF1dGhlbnRpY2F0aW9uIGlzIGFueSBwcm9jZXNzIGJ5IHdoaWNoIHlvdSB2ZXJpZnkgdGhhdAotICAgIHNvbWVvbmUgaXMgd2hvIHRoZXkgY2xhaW0gdGhleSBhcmUuIEF1dGhvcml6YXRpb24gaXMgYW55Ci0gICAgcHJvY2VzcyBieSB3aGljaCBzb21lb25lIGlzIGFsbG93ZWQgdG8gYmUgd2hlcmUgdGhleSB3YW50IHRvCi0gICAgZ28sIG9yIHRvIGhhdmUgaW5mb3JtYXRpb24gdGhhdCB0aGV5IHdhbnQgdG8gaGF2ZS48L3A+Ci0KLSAgICA8aDI+PGEgbmFtZT0iaW50cm9kdWN0aW9uIj5JbnRyb2R1Y3Rpb248L2E+PC9oMj4KLQotICAgIDxwPklmIHlvdSBoYXZlIGluZm9ybWF0aW9uIG9uIHlvdXIgd2ViIHNpdGUgdGhhdCBpcyBzZW5zaXRpdmUKLSAgICBvciBpbnRlbmRlZCBmb3Igb25seSBhIHNtYWxsIGdyb3VwIG9mIHBlb3BsZSwgdGhlIHRlY2huaXF1ZXMgaW4KLSAgICB0aGlzIGFydGljbGUgd2lsbCBoZWxwIHlvdSBtYWtlIHN1cmUgdGhhdCB0aGUgcGVvcGxlIHRoYXQgc2VlCi0gICAgdGhvc2UgcGFnZXMgYXJlIHRoZSBwZW9wbGUgdGhhdCB5b3Ugd2FudGVkIHRvIHNlZSB0aGVtLjwvcD4KLQotICAgIDxwPlRoaXMgYXJ0aWNsZSBjb3ZlcnMgdGhlICJzdGFuZGFyZCIgd2F5IG9mIHByb3RlY3RpbmcgcGFydHMgb2YgeW91cgotICAgIHdlYiBzaXRlIHRoYXQgbW9zdCBvZiB5b3UgYXJlIGdvaW5nIHRvIHVzZS48L3A+Ci0KLSAgICA8aDI+PGEgbmFtZT0idGhlIHByZXJlcXVpc2l0ZXMiPlRoZSBwcmVyZXF1aXNpdGVzPC9hPjwvaDI+Ci0KLSAgICA8cD5UaGUgZGlyZWN0aXZlcyBkaXNjdXNzZWQgaW4gdGhpcyBhcnRpY2xlIHdpbGwgbmVlZCB0byBnbyBlaXRoZXIKLSAgICBpbiB5b3VyIG1haW4gc2VydmVyIGNvbmZpZ3VyYXRpb24gZmlsZSwgb3IgaW4gcGVyLWRpcmVjdG9yeQotICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMgKDxjb2RlPi5odGFjY2VzczwvY29kZT4gZmlsZXMpLjwvcD4KLQotICAgIDxwPklmIHlvdSBwbGFuIHRvIHVzZSA8Y29kZT4uaHRhY2Nlc3M8L2NvZGU+IGZpbGVzLCB5b3Ugd2lsbCBuZWVkIHRvCi0gICAgaGF2ZSBhIHNlcnZlciBjb25maWd1cmF0aW9uIHRoYXQgcGVybWl0cyBwdXR0aW5nIGF1dGhlbnRpY2F0aW9uCi0gICAgZGlyZWN0aXZlcyBpbiB0aGVzZSBmaWxlcy4gVGhpcyBpcyBkb25lIHdpdGggdGhlIAotICAgIDxjb2RlPjxhIGhyZWY9Ii4uL21vZC9jb3JlLmh0bWwjYWxsb3dvdmVycmlkZSI+QWxsb3dPdmVycmlkZTwvYT48L2NvZGU+Ci0gICAgZGlyZWN0aXZlLCB3aGljaCBzcGVjaWZpZXMgd2hpY2ggZGlyZWN0aXZlcywgaWYgYW55LCBtYXkgYmUgcHV0IGluCi0gICAgcGVyLWRpcmVjdG9yeSBjb25maWd1cmF0aW9uIGZpbGVzLjwvcD4KLQotICAgIDxwPlNpbmNlIHdlJ3JlIHRhbGtpbmcgaGVyZSBhYm91dCBhdXRoZW50aWNhdGlvbiwgeW91IHdpbGwgbmVlZCBhbgotICAgIDxjb2RlPkFsbG93T3ZlcnJpZGU8L2NvZGU+IGRpcmVjdGl2ZSBsaWtlIHRoZSBmb2xsb3dpbmc6PC9wPgotCi08cHJlPgotICAgIEFsbG93T3ZlcnJpZGUgQXV0aENvbmZpZwotPC9wcmU+Ci0KLSAgICA8cD5PciwgaWYgeW91IGFyZSBqdXN0IGdvaW5nIHRvIHB1dCB0aGUgZGlyZWN0aXZlcyBkaXJlY3RseSBpbiB5b3VyCi0gICAgbWFpbiBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlLCB5b3Ugd2lsbCBvZiBjb3Vyc2UgbmVlZCB0byBoYXZlCi0gICAgd3JpdGUgcGVybWlzc2lvbiB0byB0aGF0IGZpbGUuPC9wPgotCi0gICAgPHA+QW5kIHlvdSdsbCBuZWVkIHRvIGtub3cgYSBsaXR0bGUgYml0IGFib3V0IHRoZSBkaXJlY3RvcnkKLSAgICBzdHJ1Y3R1cmUgb2YgeW91ciBzZXJ2ZXIsIGluIG9yZGVyIHRvIGtub3cgd2hlcmUgc29tZSBmaWxlcyBhcmUKLSAgICBrZXB0LiBUaGlzIHNob3VsZCBub3QgYmUgdGVycmlibHkgZGlmZmljdWx0LCBhbmQgSSdsbCB0cnkgdG8KLSAgICBtYWtlIHRoaXMgY2xlYXIgd2hlbiB3ZSBjb21lIHRvIHRoYXQgcG9pbnQuPC9wPgotCi0gICAgPGgyPjxhIG5hbWU9ImdldHRpbmcgaXQgd29ya2luZy4iPkdldHRpbmcgaXQgd29ya2luZy48L2E+PC9oMj4KLQotICAgIDxwPkhlcmUncyB0aGUgYmFzaWNzIG9mIHBhc3N3b3JkIHByb3RlY3RpbmcgYSBkaXJlY3Rvcnkgb24geW91cgotICAgIHNlcnZlci48L3A+Ci0KLSAgICA8cD5Zb3UnbGwgbmVlZCB0byBjcmVhdGUgYSBwYXNzd29yZCBmaWxlLiBUaGlzIGZpbGUgc2hvdWxkIGJlCi0gICAgcGxhY2VkIHNvbWV3aGVyZSBvdXRzaWRlIG9mIHlvdXIgZG9jdW1lbnQgZGlyZWN0b3J5LiBUaGlzIGlzIHNvCi0gICAgdGhhdCBmb2xrcyBjYW5ub3QgZG93bmxvYWQgdGhlIHBhc3N3b3JkIGZpbGUuIEZvciBleGFtcGxlLCBpZgotICAgIHlvdXIgZG9jdW1lbnRzIGFyZSBzZXJ2ZWQgb3V0IG9mCi0gICAgPGNvZGU+L3Vzci9sb2NhbC9hcGFjaGUvaHRkb2NzPC9jb2RlPiB5b3UgbWlnaHQgd2FudCB0byBwdXQgdGhlCi0gICAgcGFzc3dvcmQgZmlsZShzKSBpbiA8Y29kZT4vdXNyL2xvY2FsL2FwYWNoZS9wYXNzd2Q8L2NvZGU+LjwvcD4KLQotICAgIDxwPlRvIGNyZWF0ZSB0aGUgZmlsZSwgdXNlIHRoZSA8Y29kZT5odHBhc3N3ZDwvY29kZT4gdXRpbGl0eQotICAgIHRoYXQgY2FtZSB3aXRoIEFwYWNoZS4gVGhpcyBiZSBsb2NhdGVkIGluIHRoZSA8Y29kZT5iaW48L2NvZGU+Ci0gICAgZGlyZWN0b3J5IG9mIHdoZXJldmVyIHlvdSBpbnN0YWxsZWQgQXBhY2hlLiBUbyBjcmVhdGUgdGhlIGZpbGUsCi0gICAgdHlwZTo8L3A+Ci08cHJlPgotICAgICAgICBodHBhc3N3ZCAtYyAvdXNyL2xvY2FsL2FwYWNoZS9wYXNzd2QvcGFzc3dvcmQgcmJvd2VuCi08L3ByZT4KLQotICAgIDxwPjxjb2RlPmh0cGFzc3dkPC9jb2RlPiB3aWxsIGFzayB5b3UgZm9yIHRoZSBwYXNzd29yZCwgYW5kCi0gICAgdGhlbiBhc2sgeW91IHRvIHR5cGUgaXQgYWdhaW4gdG8gY29uZmlybSBpdDo8L3A+Ci08cHJlPgotICAgICAgICAjIGh0cGFzc3dkIC1jIC91c3IvbG9jYWwvYXBhY2hlL3Bhc3N3ZC9wYXNzd29yZHMgcmJvd2VuCi0gICAgICAgIE5ldyBwYXNzd29yZDogbXlwYXNzd29yZAotICAgICAgICBSZS10eXBlIG5ldyBwYXNzd29yZDogbXlwYXNzd29yZAotICAgICAgICBBZGRpbmcgcGFzc3dvcmQgZm9yIHVzZXIgcmJvd2VuCi08L3ByZT4KLQotICAgIDxwPklmIDxjb2RlPmh0cGFzc3dkPC9jb2RlPiBpcyBub3QgaW4geW91ciBwYXRoLCBvZiBjb3Vyc2UKLSAgICB5b3UnbGwgaGF2ZSB0byB0eXBlIHRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGUgdG8gZ2V0IGl0IHRvIHJ1bi4KLSAgICBPbiBteSBzZXJ2ZXIsIGl0J3MgbG9jYXRlZCBhdAotICAgIDxjb2RlPi91c3IvbG9jYWwvYXBhY2hlL2Jpbi9odHBhc3N3ZDwvY29kZT48L3A+Ci0KLSAgICA8cD5OZXh0LCB5b3UnbGwgbmVlZCB0byBjcmVhdGUgYSBmaWxlIGluIHRoZSBkaXJlY3RvcnkgeW91IHdhbnQKLSAgICB0byBwcm90ZWN0LiBUaGlzIGZpbGUgaXMgdXN1YWxseSBjYWxsZWQgPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiwKLSAgICBhbHRob3VnaCBvbiBXaW5kb3dzIGl0J3MgY2FsbGVkIDxjb2RlPmh0YWNjZXNzPC9jb2RlPiAod2l0aG91dAotICAgIHRoZSBsZWFkaW5nIHBlcmlvZC4pIDxjb2RlPi5odGFjY2VzczwvY29kZT4gbmVlZHMgdG8gY29udGFpbgotICAgIHRoZSBmb2xsb3dpbmcgbGluZXM6PC9wPgotPHByZT4KLSAgICAgICAgQXV0aFR5cGUgQmFzaWMKLSAgICAgICAgQXV0aE5hbWUgIkJ5IEludml0YXRpb24gT25seSIKLSAgICAgICAgQXV0aFVzZXJGaWxlIC91c3IvbG9jYWwvYXBhY2hlL3Bhc3N3ZC9wYXNzd29yZHMKLSAgICAgICAgQXV0aEdyb3VwRmlsZSAvZGV2L251bGwKLSAgICAgICAgcmVxdWlyZSB1c2VyIHJib3dlbgotPC9wcmU+Ci0KLSAgICA8cD5UaGUgbmV4dCB0aW1lIHRoYXQgeW91IGxvYWQgYSBmaWxlIGZyb20gdGhhdCBkaXJlY3RvcnksIHlvdQotICAgIHNob3VsZCBzZWUgdGhlIGZhbWlsaWFyIHVzZXJuYW1lL3Bhc3N3b3JkIGRpYWxvZyBib3ggcG9wIHVwLiBJZgotICAgIHlvdSBkb24ndCBjaGFuY2VzIGFyZSBwcmV0dHkgZ29vZCB0aGF0IHlvdSBhcmUgbm90IHBlcm1pdHRlZCB0bwotICAgIHVzZSA8Y29kZT4uaHRhY2Nlc3M8L2NvZGU+IGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgaW4KLSAgICBxdWVzdGlvbi48L3A+Ci0KLSAgICA8aDI+PGEgbmFtZT0ibGV0dGluZyBtb3JlIHRoYW4gb25lIHBlcnNvbiBpbiI+TGV0dGluZyBtb3JlIHRoYW4KLSAgICBvbmUgcGVyc29uIGluPC9hPjwvaDI+Ci0KLSAgICA8cD5UaGUgZGlyZWN0aXZlcyBhYm92ZSBvbmx5IGxldCBvbmUgcGVyc29uIChzcGVjaWZpY2FsbHkKLSAgICBzb21lb25lIHdpdGggYSB1c2VybmFtZSBvZiA8Y29kZT5yYm93ZW48L2NvZGU+KSBpbnRvIHRoZQotICAgIGRpcmVjdG9yeS4gSW4gbW9zdCBjYXNlcywgeW91J2xsIHdhbnQgdG8gbGV0IG1vcmUgdGhhbiBvbmUKLSAgICBwZXJzb24gaW4uIFRoaXMgaXMgd2hlcmUgdGhlIDxjb2RlPkF1dGhHcm91cEZpbGU8L2NvZGU+IGNvbWVzCi0gICAgaW4uIEluIHRoZSBleGFtcGxlIGFib3ZlLCB3ZSd2ZSBwb2ludGVkCi0gICAgPGNvZGU+QXV0aEdyb3VwRmlsZTwvY29kZT4gdG8gPGNvZGU+L2Rldi9udWxsPC9jb2RlPiwgd2hpY2ggaXMKLSAgICBVbml4LXNwZWFrIGZvciAibm93aGVyZSIsIG9yICJvZmYgaW50byBzcGFjZS4iIChUaGUgV2luZG93cwotICAgIE5UIGVxdWl2YWxlbnQgb2YgdGhpcyBpcyA8Y29kZT5udWw8L2NvZGU+Lik8L3A+Ci0KLSAgICA8cD5JZiB5b3Ugd2FudCB0byBsZXQgbW9yZSB0aGFuIG9uZSBwZXJzb24gaW4sIHlvdSdsbCBuZWVkIHRvCi0gICAgY3JlYXRlIGEgZ3JvdXAgZmlsZSB0aGF0IGFzc29jaWF0ZXMgZ3JvdXAgbmFtZXMgd2l0aCBhIGxpc3Qgb2YKLSAgICB1c2VycyBpbiB0aGF0IGdyb3VwLiBUaGUgZm9ybWF0IG9mIHRoaXMgZmlsZSBpcyBwcmV0dHkgc2ltcGxlLAotICAgIGFuZCB5b3UgY2FuIGNyZWF0ZSBpdCB3aXRoIHlvdXIgZmF2b3JpdGUgZWRpdG9yLiBUaGUgY29udGVudHMKLSAgICBvZiB0aGUgZmlsZSB3aWxsIGxvb2sgbGlrZSB0aGlzOjwvcD4KLTxwcmU+Ci0gICAgICAgIEdyb3VwTmFtZTogcmJvd2VuIGRwaXR0cyBzdW5nbyByc2hlcnNleQotPC9wcmU+Ci0KLSAgICA8cD5UaGF0J3MganVzdCBhIGxpc3Qgb2YgdGhlIG1lbWJlcnMgb2YgdGhlIGdyb3VwIGluIGEgbG9uZwotICAgIGxpbmUgc2VwYXJhdGVkIGJ5IHNwYWNlcy48L3A+Ci0KLSAgICA8cD5UbyBhZGQgYSB1c2VyIHRvIHlvdXIgYWxyZWFkeSBleGlzdGluZyBwYXNzd29yZCBmaWxlLAotICAgIHR5cGU6PC9wPgotPHByZT4KLSAgICAgICAgaHRwYXNzd2QgL3Vzci9sb2NhbC9hcGFjaGUvcGFzc3dkL3Bhc3N3b3JkIGRwaXR0cwotPC9wcmU+Ci0KLSAgICA8cD5Zb3UnbGwgZ2V0IHRoZSBzYW1lIHJlc3BvbnNlIGFzIGJlZm9yZSwgYnV0IGl0IHdpbGwgYmUKLSAgICBhcHBlbmRlZCB0byB0aGUgZXhpc3RpbmcgZmlsZSwgcmF0aGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgZmlsZS4KLSAgICAoSXQncyB0aGUgPGNvZGU+LWM8L2NvZGU+IHRoYXQgbWFrZXMgaXQgY3JlYXRlIGEgbmV3IHBhc3N3b3JkCi0gICAgZmlsZS48L3A+Ci0KLSAgICA8cD5Ob3csIHlvdSBuZWVkIHRvIG1vZGlmeSB5b3VyIDxjb2RlPi5odGFjY2VzczwvY29kZT4gZmlsZSB0bwotICAgIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOjwvcD4KLTxwcmU+Ci0gICAgICAgIEF1dGhUeXBlIEJhc2ljCi0gICAgICAgIEF1dGhOYW1lICJCeSBJbnZpdGF0aW9uIE9ubHkiCi0gICAgICAgIEF1dGhVc2VyRmlsZSAvdXNyL2xvY2FsL2FwYWNoZS9wYXNzd2QvcGFzc3dvcmRzCi0gICAgICAgIEF1dGhHcm91cEZpbGUgL3Vzci9sb2NhbC9hcGFjaGUvcGFzc3dkL2dyb3VwcwotICAgICAgICByZXF1aXJlIGdyb3VwIEdyb3VwTmFtZQotPC9wcmU+Ci0KLSAgICA8cD5Ob3csIGFueW9uZSB0aGF0IGlzIGxpc3RlZCBpbiB0aGUgZ3JvdXAKLSAgICA8Y29kZT5Hcm91cE5hbWU8L2NvZGU+LCBhbmQgaGFzIGFuIGVudHJ5IGluIHRoZQotICAgIDxjb2RlPnBhc3N3b3JkPC9jb2RlPiBmaWxlLCB3aWxsIGJlIGxldCBpbiwgaWYgdGhleSB0eXBlIHRoZQotICAgIGNvcnJlY3QgcGFzc3dvcmQuPC9wPgotCi0gICAgPHA+VGhlcmUncyBhbm90aGVyIHdheSB0byBsZXQgbXVsdGlwbGUgdXNlcnMgaW4gdGhhdCBpcyBsZXNzCi0gICAgc3BlY2lmaWMuIFJhdGhlciB0aGFuIGNyZWF0aW5nIGEgZ3JvdXAgZmlsZSwgeW91IGNhbiBqdXN0IHVzZQotICAgIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlOjwvcD4KLTxwcmU+Ci0gICAgICAgIHJlcXVpcmUgdmFsaWQtdXNlcgotPC9wcmU+Ci0KLSAgICA8cD5Vc2luZyB0aGF0IHJhdGhlciB0aGFuIHRoZSA8Y29kZT5yZXF1aXJlIHVzZXIgcmJvd2VuPC9jb2RlPgotICAgIGxpbmUgd2lsbCBhbGxvdyBhbnlvbmUgaW4gdGhhdCBpcyBsaXN0ZWQgaW4gdGhlIHBhc3N3b3JkIGZpbGUsCi0gICAgYW5kIHdobyBjb3JyZWN0bHkgZW50ZXJzIHRoZWlyIHBhc3N3b3JkLiBZb3UgY2FuIGV2ZW4gZW11bGF0ZQotICAgIHRoZSBncm91cCBiZWhhdmlvciBoZXJlLCBieSBqdXN0IGtlZXBpbmcgYSBzZXBhcmF0ZSBwYXNzd29yZAotICAgIGZpbGUgZm9yIGVhY2ggZ3JvdXAuIFRoZSBhZHZhbnRhZ2Ugb2YgdGhpcyBhcHByb2FjaCBpcyB0aGF0Ci0gICAgQXBhY2hlIG9ubHkgaGFzIHRvIGNoZWNrIG9uZSBmaWxlLCByYXRoZXIgdGhhbiB0d28uIFRoZQotICAgIGRpc2FkdmFudGFnZSBpcyB0aGF0IHlvdSBoYXZlIHRvIG1haW50YWluIGEgYnVuY2ggb2YgcGFzc3dvcmQKLSAgICBmaWxlcywgYW5kIHJlbWVtYmVyIHRvIHJlZmVyZW5jZSB0aCByaWdodCBvbmUgaW4gdGhlCi0gICAgPGNvZGU+QXV0aFVzZXJGaWxlPC9jb2RlPiBkaXJlY3RpdmUuPC9wPgotCi0gICAgPGgyPjxhIG5hbWU9InBvc3NpYmxlIHByb2JsZW1zIj5Qb3NzaWJsZSBwcm9ibGVtczwvYT48L2gyPgotCi0gICAgPHA+QmVjYXVzZSBvZiB0aGUgd2F5IHRoYXQgQmFzaWMgYXV0aGVudGljYXRpb24gaXMgc3BlY2lmaWVkLAotICAgIHlvdXIgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIG11c3QgYmUgdmVyaWZpZWQgZXZlcnkgdGltZSB5b3UKLSAgICByZXF1ZXN0IGEgZG9jdW1lbnQgZnJvbSB0aGUgc2VydmVyLiBUaGlzIGlzIGV2ZW4gaWYgeW91J3JlCi0gICAgcmVsb2FkaW5nIHRoZSBzYW1lIHBhZ2UsIGFuZCBmb3IgZXZlcnkgaW1hZ2Ugb24gdGhlIHBhZ2UgKGlmCi0gICAgdGhleSBjb21lIGZyb20gYSBwcm90ZWN0ZWQgZGlyZWN0b3J5KS4gQXMgeW91IGNhbiBpbWFnaW5lLCB0aGlzCi0gICAgc2xvd3MgdGhpbmdzIGRvd24gYSBsaXR0bGUuIFRoZSBhbW91bnQgdGhhdCBpdCBzbG93cyB0aGluZ3MKLSAgICBkb3duIGlzIHByb3BvcnRpb25hbCB0byB0aGUgc2l6ZSBvZiB0aGUgcGFzc3dvcmQgZmlsZSwgYmVjYXVzZQotICAgIGl0IGhhcyB0byBvcGVuIHVwIHRoYXQgZmlsZSwgYW5kIGdvIGRvd24gdGhlIGxpc3Qgb2YgdXNlcnMKLSAgICB1bnRpbCBpdCBnZXRzIHRvIHlvdXIgbmFtZS4gQW5kIGl0IGhhcyB0byBkbyB0aGlzIGV2ZXJ5IHRpbWUgYQotICAgIHBhZ2UgaXMgbG9hZGVkLjwvcD4KLQotICAgIDxwPkEgY29uc2VxdWVuY2Ugb2YgdGhpcyBpcyB0aGF0IHRoZXJlJ3MgYSBwcmFjdGljYWwgbGltaXQgdG8gaG93IG1hbnkKLSAgICB1c2VycyB5b3UgY2FuIHB1dCBpbiBvbmUgcGFzc3dvcmQgZmlsZS4gVGhpcyBsaW1pdCB3aWxsIHZhcnkKLSAgICBkZXBlbmRpbmcgb24gdGhlIHBlcmZvcm1hbmNlIG9mIHlvdXIgcGFydGljdWxhciBzZXJ2ZXIgbWFjaGluZSwgYnV0Ci0gICAgeW91IGNhbiBleHBlY3QgdG8gc2VlIHNsb3dkb3ducyBvbmNlIHlvdSBnZXQgYWJvdmUgYSBmZXcgaHVuZHJlZAotICAgIGVudHJpZXMsIGFuZCBtYXkgd2lzaCB0byBjb25zaWRlciBhIGRpZmZlcmVudCBhdXRoZW50aWNhdGlvbiBtZXRob2QKLSAgICBhdCB0aGF0IHRpbWUuPC9wPgotCi0gICAgPGgyPjxhIG5hbWU9IndoYXQgb3RoZXIgbmVhdCBzdHVmZiBjYW4gaSBkbyI+V2hhdCBvdGhlciBuZWF0Ci0gICAgc3R1ZmYgY2FuIEkgZG8/PC9hPjwvaDI+Ci0KLSAgICA8cD5BdXRoZW50aWNhdGlvbiBieSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgaXMgb25seSBwYXJ0IG9mIHRoZQotICAgIHN0b3J5LiBGcmVxdWVudGx5IHlvdSB3YW50IHRvIGxldCBwZW9wbGUgaW4gYmFzZWQgb24gc29tZXRoaW5nCi0gICAgb3RoZXIgdGhhbiB3aG8gdGhleSBhcmUuIFNvbWV0aGluZyBzdWNoIGFzIHdoZXJlIHRoZXkgYXJlCi0gICAgY29taW5nIGZyb20uPC9wPgotCi0gICAgPHA+VGhlIDxjb2RlPmFsbG93PC9jb2RlPiBhbmQgPGNvZGU+ZGVueTwvY29kZT4gZGlyZWN0aXZlcyBsZXQKLSAgICB5b3UgYWxsb3cgYW5kIGRlbnkgYWNjZXNzIGJhc2VkIG9uIHRoZSBob3N0IG5hbWUsIG9yIGhvc3QKLSAgICBhZGRyZXNzLCBvZiB0aGUgbWFjaGluZSByZXF1ZXN0aW5nIGEgZG9jdW1lbnQuIFRoZSBkaXJlY3RpdmUKLSAgICBnb2VzIGhhbmQtaW4taGFuZCB3aXRoIHRoZXNlIGlzIHRoZSA8Y29kZT5vcmRlcjwvY29kZT4KLSAgICBkaXJlY3RpdmUsIHdoaWNoIHRlbGxzIEFwYWNoZSBpbiB3aGljaCBvcmRlciB0byBhcHBseSB0aGUKLSAgICBmaWx0ZXJzLjwvcD4KLQotICAgIDxwPlRoZSB1c2FnZSBvZiB0aGVzZSBkaXJlY3RpdmVzIGlzOjwvcD4KLTxwcmU+Ci0gICAgICAgIGFsbG93IGZyb20gYWRkcmVzcwotPC9wcmU+Ci0KLSAgICA8cD53aGVyZSA8ZW0+YWRkcmVzczwvZW0+IGlzIGFuIElQIGFkZHJlc3MgKG9yIGEgcGFydGlhbCBJUAotICAgIGFkZHJlc3MpIG9yIGEgZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lIChvciBhIHBhcnRpYWwgZG9tYWluCi0gICAgbmFtZSkuPC9wPgotCi0gICAgPHA+Rm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHNvbWVvbmUgc3BhbW1pbmcgeW91ciBtZXNzYWdlCi0gICAgYm9hcmQsIGFuZCB5b3Ugd2FudCB0byBrZWVwIHRoZW0gb3V0LCB5b3UgY291bGQgZG8gdGhlCi0gICAgZm9sbG93aW5nOjwvcD4KLTxwcmU+Ci0gICAgICAgIGRlbnkgZnJvbSAyMDUuMjUyLjQ2LjE2NQotPC9wcmU+Ci0KLSAgICA8cD5WaXNpdG9ycyBjb21pbmcgZnJvbSB0aGF0IGFkZHJlc3Mgd2lsbCBub3QgYmUgYWJsZSB0byBzZWUKLSAgICB0aGUgY29udGVudCBiZWhpbmQgdGhpcyBkaXJlY3RpdmUuIElmLCBpbnN0ZWFkLCB5b3UgaGF2ZSBhCi0gICAgbWFjaGluZSBuYW1lLCByYXRoZXIgdGhhbiBhbiBJUCBhZGRyZXNzLCB5b3UgY2FuIHVzZSB0aGF0LjwvcD4KLTxwcmU+Ci0gICAgICAgIGRlbnkgZnJvbSBob3N0LmV4YW1wbGUuY29tCi08L3ByZT4KLQotICAgIDxwPkFuZCwgaWYgeW91J2QgbGlrZSB0byBibG9jayBhY2Nlc3MgZnJvbSBhbiBlbnRpcmUgZG9tYWluLAotICAgIHlvdSBjYW4gc3BlY2lmeSBqdXN0IHBhcnQgb2YgYW4gYWRkcmVzcyBvciBkb21haW4gbmFtZTo8L3A+Ci08cHJlPgotICAgICAgICBkZW55IGZyb20gMTkyLjEwMS4yMDUKLSAgICAgICAgZGVueSBmcm9tIGN5YmVydGh1Z3MuY29tCi0gICAgICAgIGRlbnkgZnJvbSBrZQotPC9wcmU+Ci0KLSAgICA8cD5Vc2luZyA8Y29kZT5vcmRlcjwvY29kZT4gd2lsbCBsZXQgeW91IGJlIHN1cmUgdGhhdCB5b3UgYXJlCi0gICAgYWN0dWFsbHkgcmVzdHJpY3RpbmcgdGhpbmdzIHRvIHRoZSBncm91cCB0aGF0IHlvdSB3YW50IHRvIGxldAotICAgIGluLCBieSBjb21iaW5pbmcgYSA8Y29kZT5kZW55PC9jb2RlPiBhbmQgYW4gPGNvZGU+YWxsb3c8L2NvZGU+Ci0gICAgZGlyZWN0aXZlOjwvcD4KLTxwcmU+Ci0gICAgICAgIG9yZGVyIGRlbnksYWxsb3cKLSAgICAgICAgZGVueSBmcm9tIGFsbAotICAgICAgICBhbGxvdyBmcm9tIGRldi5leGFtcGxlLmNvbQotPC9wcmU+Ci0KLSAgICA8cD5MaXN0aW5nIGp1c3QgdGhlIDxjb2RlPmFsbG93PC9jb2RlPiBkaXJlY3RpdmUgd291bGQgbm90IGRvCi0gICAgd2hhdCB5b3Ugd2FudCwgYmVjYXVzZSBpdCB3aWxsIGxldCBmb2xrcyBmcm9tIHRoYXQgaG9zdCBpbiwgaW4KLSAgICBhZGRpdGlvbiB0byBsZXR0aW5nIGV2ZXJ5b25lIGluLiBXaGF0IHlvdSB3YW50IGlzIHRvIGxldAotICAgIDxlbT5vbmx5PC9lbT4gdGhvc2UgZm9sa3MgaW4uPC9wPgotCi0gICAgPGgyPjxhIG5hbWU9Im1vcmUgaW5mb3JtYXRpb24iPk1vcmUgaW5mb3JtYXRpb248L2E+PC9oMj4KLQotICAgIDxwPllvdSBzaG91bGQgYWxzbyByZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvcgotICAgIDxjb2RlPjxhIGhyZWY9Ii4uL21vZC9tb2RfYXV0aC5odG1sIj5tb2RfYXV0aDwvYT48L2NvZGU+Ci0gICAgd2hpY2ggY29udGFpbnMKLSAgICBzb21lIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRoaXMgYWxsIHdvcmtzLjwvcD4KLSAgPC9ib2R5PgotPC9odG1sPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9ob3d0by9jZ2kuaHRtbCBiL2RvY3MvbWFudWFsL2hvd3RvL2NnaS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWRiY2ViLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2hvd3RvL2NnaS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDk5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QXBhY2hlIFR1dG9yaWFsOiBEeW5hbWljIENvbnRlbnQgd2l0aCBDR0k8L3RpdGxlPgotPGxpbmsgcmV2PSJtYWRlIiBocmVmPSJtYWlsdG86cmJvd2VuQHJjYm93ZW4uY29tIj4KLTwvaGVhZD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxib2R5IGJnY29sb3I9IiNGRkZGRkYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjMDAwMDgwIgotYWxpbms9IiNGRjAwMDAiPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxoMSBhbGlnbj0iQ0VOVEVSIj5EeW5hbWljIENvbnRlbnQgd2l0aCBDR0k8L2gxPgotCi08YSBuYW1lPSJfX2luZGV4X18iPjwvYT4gPCEtLSBJTkRFWCBCRUdJTiAtLT4KLSAKLQotPHVsPgotPGxpPjxhIGhyZWY9IiNkeW5hbWljY29udGVudHdpdGhjZ2kiPkR5bmFtaWMgQ29udGVudCB3aXRoCi1DR0k8L2E+PC9saT4KLQotPGxpPjxhIGhyZWY9IiNjb25maWd1cmluZ2FwYWNoZXRvcGVybWl0Y2dpIj5Db25maWd1cmluZyBBcGFjaGUgdG8KLXBlcm1pdCBDR0k8L2E+Ci0KLTx1bD4KLTxsaT48YSBocmVmPSIjc2NyaXB0YWxpYXMiPlNjcmlwdEFsaWFzPC9hPjwvbGk+Ci0KLTxsaT48YSBocmVmPSIjY2dpb3V0c2lkZW9mc2NyaXB0YWxpYXNkaXJlY3RvcmllcyI+Q0dJIG91dHNpZGUgb2YKLVNjcmlwdEFsaWFzIGRpcmVjdG9yaWVzPC9hPgotCi08dWw+Ci08bGk+PGEgaHJlZj0iI2V4cGxpY2l0bHl1c2luZ29wdGlvbnN0b3Blcm1pdGNnaWV4ZWN1dGlvbiI+RXhwbGljaXRseSB1c2luZwotT3B0aW9ucyB0byBwZXJtaXQgQ0dJIGV4ZWN1dGlvbjwvYT48L2xpPgotCi08bGk+PGEgaHJlZj0iI2h0YWNjZXNzZmlsZXMiPi5odGFjY2VzcyBmaWxlczwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPC9saT4KLQotPGxpPjxhIGhyZWY9IiN3cml0aW5nYWNnaXByb2dyYW0iPldyaXRpbmcgYSBDR0kgcHJvZ3JhbTwvYT4KLQotPHVsPgotPGxpPjxhIGhyZWY9IiN5b3VyZmlyc3RjZ2lwcm9ncmFtIj5Zb3VyIGZpcnN0IENHSSBwcm9ncmFtPC9hPjwvbGk+Ci08L3VsPgotPC9saT4KLQotPGxpPjxhIGhyZWY9IiNidXRpdHNzdGlsbG5vdHdvcmtpbmciPkJ1dCBpdCdzIHN0aWxsIG5vdAotd29ya2luZyE8L2E+Ci0KLTx1bD4KLTxsaT48YSBocmVmPSIjZmlsZXBlcm1pc3Npb25zIj5GaWxlIHBlcm1pc3Npb25zPC9hPjwvbGk+Ci0KLTxsaT48YSBocmVmPSIjcGF0aGluZm9ybWF0aW9uIj5QYXRoIGluZm9ybWF0aW9uPC9hPjwvbGk+Ci0KLTxsaT48YSBocmVmPSIjc3ludGF4ZXJyb3JzIj5TeW50YXggZXJyb3JzPC9hPjwvbGk+Ci0KLTxsaT48YSBocmVmPSIjZXJyb3Jsb2dzIj5FcnJvciBsb2dzPC9hPjwvbGk+Ci08L3VsPgotPC9saT4KLQotPGxpPjxhIGhyZWY9IiN3aGF0c2dvaW5nb25iZWhpbmR0aGVzY2VuZXMiPldoYXQncyBnb2luZyBvbiBiZWhpbmQKLXRoZSBzY2VuZXM/PC9hPgotCi08dWw+Ci08bGk+PGEgaHJlZj0iI2Vudmlyb25tZW50dmFyaWFibGVzIj5FbnZpcm9ubWVudCB2YXJpYWJsZXM8L2E+PC9saT4KLQotPGxpPjxhIGhyZWY9IiNzdGRpbmFuZHN0ZG91dCI+U1RESU4gYW5kIFNURE9VVDwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci0KLTxsaT48YSBocmVmPSIjY2dpbW9kdWxlc2xpYnJhcmllcyI+Q0dJIG1vZHVsZXMvbGlicmFyaWVzPC9hPjwvbGk+Ci0KLTxsaT48YSBocmVmPSIjZm9ybW9yZWluZm9ybWF0aW9uIj5Gb3IgbW9yZSBpbmZvcm1hdGlvbjwvYT48L2xpPgotPC91bD4KLQotPCEtLSBJTkRFWCBFTkQgLS0+Ci08aHI+Ci08aDI+PGEgbmFtZT0iZHluYW1pY2NvbnRlbnR3aXRoY2dpIj5EeW5hbWljIENvbnRlbnQgd2l0aAotQ0dJPC9hPjwvaDI+Ci0KLTx0YWJsZSBib3JkZXI9IjEiPgotPHRyPjx0ZCB2YWxpZ249InRvcCI+Ci08c3Ryb25nPlJlbGF0ZWQgTW9kdWxlczwvc3Ryb25nPjxicj48YnI+Ci0KLTxhIGhyZWY9Ii4uL21vZC9tb2RfYWxpYXMuaHRtbCI+bW9kX2FsaWFzPC9hPjxicj4KLTxhIGhyZWY9Ii4uL21vZC9tb2RfY2dpLmh0bWwiPm1vZF9jZ2k8L2E+PGJyPgotCi08L3RkPjx0ZCB2YWxpZ249InRvcCI+Ci08c3Ryb25nPlJlbGF0ZWQgRGlyZWN0aXZlczwvc3Ryb25nPjxicj48YnI+Ci0KLTxhIGhyZWY9Ii4uL21vZC9tb2RfbWltZS5odG1sI2FkZGhhbmRsZXIiPkFkZEhhbmRsZXI8L2E+PGJyPgotPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNvcHRpb25zIj5PcHRpb25zPC9hPjxicj4KLTxhIGhyZWY9Ii4uL21vZC9tb2RfYWxpYXMuaHRtbCNzY3JpcHRhbGlhcyI+U2NyaXB0QWxpYXM8L2E+PGJyPgotCi08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+VGhlIENHSSAoQ29tbW9uIEdhdGV3YXkgSW50ZXJmYWNlKSBkZWZpbmVzIGEgd2F5IGZvciBhIHdlYiBzZXJ2ZXIKLXRvIGludGVyYWN0IHdpdGggZXh0ZXJuYWwgY29udGVudC1nZW5lcmF0aW5nIHByb2dyYW1zLCB3aGljaCBhcmUgb2Z0ZW4KLXJlZmVycmVkIHRvIGFzIENHSSBwcm9ncmFtcyBvciBDR0kgc2NyaXB0cy4gIEl0IGlzIHRoZSBzaW1wbGVzdCwgYW5kCi1tb3N0IGNvbW1vbiwgd2F5IHRvIHB1dCBkeW5hbWljIGNvbnRlbnQgb24geW91ciB3ZWIgc2l0ZS4gVGhpcwotZG9jdW1lbnQgd2lsbCBiZSBhbiBpbnRyb2R1Y3Rpb24gdG8gc2V0dGluZyB1cCBDR0kgb24geW91ciBBcGFjaGUgd2ViCi1zZXJ2ZXIsIGFuZCBnZXR0aW5nIHN0YXJ0ZWQgd3JpdGluZyBDR0kgcHJvZ3JhbXMuPC9wPgotCi08aHI+Ci08aDI+PGEgbmFtZT0iY29uZmlndXJpbmdhcGFjaGV0b3Blcm1pdGNnaSI+Q29uZmlndXJpbmcgQXBhY2hlIHRvCi1wZXJtaXQgQ0dJPC9hPjwvaDI+Ci0KLTxwPkluIG9yZGVyIHRvIGdldCB5b3VyIENHSSBwcm9ncmFtcyB0byB3b3JrIHByb3Blcmx5LCB5b3UnbGwgbmVlZCB0bwotaGF2ZSBBcGFjaGUgY29uZmlndXJlZCB0byBwZXJtaXQgQ0dJIGV4ZWN1dGlvbi4gVGhlcmUgYXJlIHNldmVyYWwgd2F5cwotdG8gZG8gdGhpcy48L3A+Ci0KLTxoMz48YSBuYW1lPSJzY3JpcHRhbGlhcyI+U2NyaXB0QWxpYXM8L2E+PC9oMz4KLQotPHA+VGhlIDxjb2RlPlNjcmlwdEFsaWFzPC9jb2RlPiBkaXJlY3RpdmUgdGVsbHMgQXBhY2hlIHRoYXQgYQotcGFydGljdWxhciBkaXJlY3RvcnkgaXMgc2V0IGFzaWRlIGZvciBDR0kgcHJvZ3JhbXMuIEFwYWNoZSB3aWxsIGFzc3VtZQotdGhhdCBldmVyeSBmaWxlIGluIHRoaXMgZGlyZWN0b3J5IGlzIGEgQ0dJIHByb2dyYW0sIGFuZCB3aWxsIGF0dGVtcHQgdG8KLWV4ZWN1dGUgaXQsIHdoZW4gdGhhdCBwYXJ0aWN1bGFyIHJlc291cmNlIGlzIHJlcXVlc3RlZCBieSBhIGNsaWVudC48L3A+Ci0KLTxwPlRoZSA8Y29kZT5TY3JpcHRBbGlhczwvY29kZT4gZGlyZWN0aXZlIGxvb2tzIGxpa2U6PC9wPgotCi08cHJlPgotICAgICAgICBTY3JpcHRBbGlhcyAvY2dpLWJpbi8gL3Vzci9sb2NhbC9hcGFjaGUvY2dpLWJpbi8KLTwvcHJlPgotCi08cD5UaGUgZXhhbXBsZSBzaG93biBpcyBmcm9tIHlvdXIgZGVmYXVsdCA8Y29kZT5odHRwZC5jb25mPC9jb2RlPgotY29uZmlndXJhdGlvbiBmaWxlLCBpZiB5b3UgaW5zdGFsbGVkIEFwYWNoZSBpbiB0aGUgZGVmYXVsdCBsb2NhdGlvbi4KLVRoZSA8Y29kZT5TY3JpcHRBbGlhczwvY29kZT4gZGlyZWN0aXZlIGlzIG11Y2ggbGlrZSB0aGUKLTxjb2RlPkFsaWFzPC9jb2RlPiBkaXJlY3RpdmUsIHdoaWNoIGRlZmluZXMgYSBVUkwgcHJlZml4IHRoYXQgaXMgdG8KLW1hcHBlZCB0byBhIHBhcnRpY3VsYXIgZGlyZWN0b3J5LiA8Y29kZT5BbGlhczwvY29kZT4gYW5kCi08Y29kZT5TY3JpcHRBbGlhczwvY29kZT4gYXJlIHVzdWFsbHkgdXNlZCBmb3IgZGlyZWN0b3JpZXMgdGhhdCBhcmUKLW91dHNpZGUgb2YgdGhlIDxjb2RlPkRvY3VtZW50Um9vdDwvY29kZT4gZGlyZWN0b3J5LiBUaGUgZGlmZmVyZW5jZQotYmV0d2VlbiA8Y29kZT5BbGlhczwvY29kZT4gYW5kIDxjb2RlPlNjcmlwdEFsaWFzPC9jb2RlPiBpcyB0aGF0Ci08Y29kZT5TY3JpcHRBbGlhczwvY29kZT4gaGFzIHRoZSBhZGRlZCBtZWFuaW5nIHRoYXQgZXZlcnl0aGluZyB1bmRlcgotdGhhdCBVUkwgcHJlZml4IHdpbGwgYmUgY29uc2lkZXJlZCBhIENHSSBwcm9ncmFtLiBTbywgdGhlIGV4YW1wbGUgYWJvdmUKLXRlbGxzIEFwYWNoZSB0aGF0IGFueSByZXF1ZXN0IGZvciBhIHJlc291cmNlIGJlZ2lubmluZyB3aXRoCi08Y29kZT4vY2dpLWJpbi88L2NvZGU+IHNob3VsZCBiZSBzZXJ2ZWQgZnJvbSB0aGUgZGlyZWN0b3J5Ci08Y29kZT4vdXNyL2xvY2FsL2FwYWNoZS9jZ2ktYmluLzwvY29kZT4sIGFuZCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIENHSQotcHJvZ3JhbS48L3A+Ci0KLTxwPkZvciBleGFtcGxlLCBpZiB0aGUgVVJMCi08Y29kZT5odHRwOi8vZGV2LnJjYm93ZW4uY29tL2NnaS1iaW4vdGVzdC5wbDwvY29kZT4gaXMgcmVxdWVzdGVkLAotQXBhY2hlIHdpbGwgYXR0ZW1wdCB0byBleGVjdXRlIHRoZSBmaWxlCi08Y29kZT4vdXNyL2xvY2FsL2FwYWNoZS9jZ2ktYmluL3Rlc3QucGw8L2NvZGU+IGFuZCByZXR1cm4gdGhlIG91dHB1dC4KLU9mIGNvdXJzZSwgdGhlIGZpbGUgd2lsbCBoYXZlIHRvIGV4aXN0LCBhbmQgYmUgZXhlY3V0YWJsZSwgYW5kIHJldHVybgotb3V0cHV0IGluIGEgcGFydGljdWxhciB3YXksIG9yIEFwYWNoZSB3aWxsIHJldHVybiBhbiBlcnJvciBtZXNzYWdlLjwvcD4KLQotPGgzPjxhIG5hbWU9ImNnaW91dHNpZGVvZnNjcmlwdGFsaWFzZGlyZWN0b3JpZXMiPkNHSSBvdXRzaWRlIG9mCi1TY3JpcHRBbGlhcyBkaXJlY3RvcmllczwvYT48L2gzPgotCi08cD5DR0kgcHJvZ3JhbXMgYXJlIG9mdGVuIHJlc3RyaWN0ZWQgdG8gPGNvZGU+U2NyaXB0QWxpYXM8L2NvZGU+J2VkCi1kaXJlY3RvcmllcyBmb3Igc2VjdXJpdHkgcmVhc29ucy4gIEluIHRoaXMgd2F5LCBhZG1pbmlzdHJhdG9ycyBjYW4KLXRpZ2h0bHkgY29udHJvbCB3aG8gaXMgYWxsb3dlZCB0byB1c2UgQ0dJIHByb2dyYW1zLiAgSG93ZXZlciwgaWYgdGhlCi1wcm9wZXIgc2VjdXJpdHkgcHJlY2F1dGlvbnMgYXJlIHRha2VuLCB0aGVyZSBpcyBubyByZWFzb24gd2h5Ci1DR0kgcHJvZ3JhbXMgY2Fubm90IGJlIHJ1biBmcm9tIGFyYml0cmFyeSBkaXJlY3Rvcmllcy4gIEZvciBleGFtcGxlLAoteW91IG1heSB3aXNoIHRvIGxldCB1c2VycyBoYXZlIHdlYiBjb250ZW50IGluIHRoZWlyIGhvbWUgZGlyZWN0b3JpZXMKLXdpdGggdGhlIDxjb2RlPlVzZXJEaXI8L2NvZGU+IGRpcmVjdGl2ZS4gSWYgdGhleSB3YW50IHRvIGhhdmUgdGhlaXIKLW93biBDR0kgcHJvZ3JhbXMsIGJ1dCBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgbWFpbgotPGNvZGU+Y2dpLWJpbjwvY29kZT4gZGlyZWN0b3J5LCB0aGV5IHdpbGwgbmVlZCB0byBiZSBhYmxlIHRvIHJ1biBDR0kKLXByb2dyYW1zIGVsc2V3aGVyZS48L3A+Ci0KLTxoMz48YSBuYW1lPSJleHBsaWNpdGx5dXNpbmdvcHRpb25zdG9wZXJtaXRjZ2lleGVjdXRpb24iPkV4cGxpY2l0bHkgdXNpbmcKLU9wdGlvbnMgdG8gcGVybWl0IENHSSBleGVjdXRpb248L2E+PC9oMz4KLQotPHA+WW91IGNvdWxkIGV4cGxpY2l0bHkgdXNlIHRoZSA8Y29kZT5PcHRpb25zPC9jb2RlPiBkaXJlY3RpdmUsIGluc2lkZQoteW91ciBtYWluIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGUsIHRvIHNwZWNpZnkgdGhhdCBDR0kgZXhlY3V0aW9uIHdhcwotcGVybWl0dGVkIGluIGEgcGFydGljdWxhciBkaXJlY3Rvcnk6PC9wPgotCi08cHJlPgotICAgICAgICAmbHQ7RGlyZWN0b3J5IC91c3IvbG9jYWwvYXBhY2hlL2h0ZG9jcy9zb21lZGlyJmd0OwotICAgICAgICAgICAgICAgIE9wdGlvbnMgK0V4ZWNDR0kKLSAgICAgICAgJmx0Oy9EaXJlY3RvcnkmZ3Q7Ci08L3ByZT4KLQotPHA+VGhlIGFib3ZlIGRpcmVjdGl2ZSB0ZWxscyBBcGFjaGUgdG8gcGVybWl0IHRoZSBleGVjdXRpb24gb2YgQ0dJCi1maWxlcy4gWW91IHdpbGwgYWxzbyBuZWVkIHRvIHRlbGwgdGhlIHNlcnZlciB3aGF0IGZpbGVzIGFyZSBDR0kgZmlsZXMuCi1UaGUgZm9sbG93aW5nIDxjb2RlPkFkZEhhbmRsZXI8L2NvZGU+IGRpcmVjdGl2ZSB0ZWxscyB0aGUgc2VydmVyCi10byB0cmVhdCBhbGwgZmlsZXMgd2l0aCB0aGUgPGNvZGU+Y2dpPC9jb2RlPiBvciA8Y29kZT5wbDwvY29kZT4KLWV4dGVuc2lvbiBhcyBDR0kgcHJvZ3JhbXM6PC9wPgotCi08cHJlPgotICAgICBBZGRIYW5kbGVyIGNnaS1zY3JpcHQgY2dpIHBsCi08L3ByZT4KLQotPGgzPjxhIG5hbWU9Imh0YWNjZXNzZmlsZXMiPi5odGFjY2VzcyBmaWxlczwvYT48L2gzPgotCi08cD5BIDxjb2RlPi5odGFjY2VzczwvY29kZT4gZmlsZSBpcyBhIHdheSB0byBzZXQgY29uZmlndXJhdGlvbgotZGlyZWN0aXZlcyBvbiBhIHBlci1kaXJlY3RvcnkgYmFzaXMuIFdoZW4gQXBhY2hlIHNlcnZlcyBhIHJlc291cmNlLCBpdAotbG9va3MgaW4gdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGl0IGlzIHNlcnZpbmcgYSBmaWxlIGZvciBhIGZpbGUKLWNhbGxlZCA8Y29kZT4uaHRhY2Nlc3M8L2NvZGU+LCBhbmQsIGlmIGl0IGZpbmRzIGl0LCBpdCB3aWxsIGFwcGx5Ci1kaXJlY3RpdmVzIGZvdW5kIHRoZXJlaW4uIDxjb2RlPi5odGFjY2VzczwvY29kZT4gZmlsZXMgY2FuIGJlIHBlcm1pdHRlZAotd2l0aCB0aGUgPGNvZGU+QWxsb3dPdmVycmlkZTwvY29kZT4gZGlyZWN0aXZlLCB3aGljaCBzcGVjaWZpZXMgd2hhdAotdHlwZXMgb2YgZGlyZWN0aXZlcyBjYW4gYXBwZWFyIGluIHRoZXNlIGZpbGVzLCBvciBpZiB0aGV5IGFyZSBub3QKLWFsbG93ZWQgYXQgYWxsLiBUbyBwZXJtaXQgdGhlIGRpcmVjdGl2ZSB3ZSB3aWxsIG5lZWQgZm9yIHRoaXMgcHVycG9zZSwKLXRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiB3aWxsIGJlIG5lZWRlZCBpbiB5b3VyIG1haW4gc2VydmVyCi1jb25maWd1cmF0aW9uOjwvcD4KLQotPHByZT4KLSAgICAgICAgQWxsb3dPdmVycmlkZSBPcHRpb25zCi08L3ByZT4KLQotPHA+SW4gdGhlIDxjb2RlPi5odGFjY2VzczwvY29kZT4gZmlsZSwgeW91J2xsIG5lZWQgdGhlIGZvbGxvd2luZwotZGlyZWN0aXZlOjwvcD4KLQotPHByZT4KLSAgICAgICAgT3B0aW9ucyArRXhlY0NHSQotPC9wcmU+Ci0KLTxwPndoaWNoIHRlbGxzIEFwYWNoZSB0aGF0IGV4ZWN1dGlvbiBvZiBDR0kgcHJvZ3JhbXMgaXMgcGVybWl0dGVkIGluCi10aGlzIGRpcmVjdG9yeS48L3A+Ci0KLTxocj4KLTxoMj48YSBuYW1lPSJ3cml0aW5nYWNnaXByb2dyYW0iPldyaXRpbmcgYSBDR0kgcHJvZ3JhbTwvYT48L2gyPgotCi08cD5UaGVyZSBhcmUgdHdvIG1haW4gZGlmZmVyZW5jZXMgYmV0d2VlbiBgYHJlZ3VsYXInJyBwcm9ncmFtbWluZywgYW5kCi1DR0kgcHJvZ3JhbW1pbmcuPC9wPgotCi08cD5GaXJzdCwgYWxsIG91dHB1dCBmcm9tIHlvdXIgQ0dJIHByb2dyYW0gbXVzdCBiZSBwcmVjZWRlZCBieSBhCi1NSU1FLXR5cGUgaGVhZGVyLiBUaGlzIGlzIEhUVFAgaGVhZGVyIHRoYXQgdGVsbHMgdGhlIGNsaWVudCB3aGF0IHNvcnQKLW9mIGNvbnRlbnQgaXQgaXMgcmVjZWl2aW5nLiBNb3N0IG9mIHRoZSB0aW1lLCB0aGlzIHdpbGwgbG9vayBsaWtlOjwvcD4KLQotPHByZT4KLSAgICAgICAgQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLTwvcHJlPgotCi08cD5TZWNvbmRseSwgeW91ciBvdXRwdXQgbmVlZHMgdG8gYmUgaW4gSFRNTCwgb3Igc29tZSBvdGhlciBmb3JtYXQgdGhhdAotYSBicm93c2VyIHdpbGwgYmUgYWJsZSB0byBkaXNwbGF5LiBNb3N0IG9mIHRoZSB0aW1lLCB0aGlzIHdpbGwgYmUgSFRNTCwKLWJ1dCBvY2Nhc2lvbmFsbHkgeW91IG1pZ2h0IHdyaXRlIGEgQ0dJIHByb2dyYW0gdGhhdCBvdXRwdXRzIGEgZ2lmCi1pbWFnZSwgb3Igb3RoZXIgbm9uLUhUTUwgY29udGVudC48L3A+Ci0KLTxwPkFwYXJ0IGZyb20gdGhvc2UgdHdvIHRoaW5ncywgd3JpdGluZyBhIENHSSBwcm9ncmFtIHdpbGwgbG9vayBhIGxvdAotbGlrZSBhbnkgb3RoZXIgcHJvZ3JhbSB0aGF0IHlvdSBtaWdodCB3cml0ZS48L3A+Ci0KLTxoMz48YSBuYW1lPSJ5b3VyZmlyc3RjZ2lwcm9ncmFtIj5Zb3VyIGZpcnN0IENHSSBwcm9ncmFtPC9hPjwvaDM+Ci0KLTxwPlRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBDR0kgcHJvZ3JhbSB0aGF0IHByaW50cyBvbmUgbGluZSB0byB5b3VyCi1icm93c2VyLiBUeXBlIGluIHRoZSBmb2xsb3dpbmcsIHNhdmUgaXQgdG8gYSBmaWxlIGNhbGxlZAotPGNvZGU+Zmlyc3QucGw8L2NvZGU+LCBhbmQgcHV0IGl0IGluIHlvdXIgPGNvZGU+Y2dpLWJpbjwvY29kZT4KLWRpcmVjdG9yeS48L3A+Ci0KLTxwcmU+Ci0gICAgICAgICMhL3Vzci9iaW4vcGVybAotICAgICAgICBwcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcclxuXHJcbiI7Ci0gICAgICAgIHByaW50ICJIZWxsbywgV29ybGQuIjsKLTwvcHJlPgotCi08cD5FdmVuIGlmIHlvdSBhcmUgbm90IGZhbWlsaWFyIHdpdGggUGVybCwgeW91IHNob3VsZCBiZSBhYmxlIHRvIHNlZQotd2hhdCBpcyBoYXBwZW5pbmcgaGVyZS4gVGhlIGZpcnN0IGxpbmUgdGVsbHMgQXBhY2hlIChvciB3aGF0ZXZlciBzaGVsbAoteW91IGhhcHBlbiB0byBiZSBydW5uaW5nIHVuZGVyKSB0aGF0IHRoaXMgcHJvZ3JhbSBjYW4gYmUgZXhlY3V0ZWQgYnkKLWZlZWRpbmcgdGhlIGZpbGUgdG8gdGhlIGludGVycHJldGVyIGZvdW5kIGF0IHRoZSBsb2NhdGlvbgotPGNvZGU+L3Vzci9iaW4vcGVybDwvY29kZT4uIFRoZSBzZWNvbmQgbGluZSBwcmludHMgdGhlIGNvbnRlbnQtdHlwZQotZGVjbGFyYXRpb24gd2UgdGFsa2VkIGFib3V0LCBmb2xsb3dlZCBieSB0d28gY2FycmlhZ2UtcmV0dXJuIG5ld2xpbmUKLXBhaXJzLiBUaGlzIHB1dHMgYSBibGFuayBsaW5lIGFmdGVyIHRoZSBoZWFkZXIsIHRvIGluZGljYXRlIHRoZSBlbmQgb2YKLXRoZSBIVFRQIGhlYWRlcnMsIGFuZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBib2R5LiBUaGUgdGhpcmQgbGluZSBwcmludHMKLXRoZSBzdHJpbmcgYGBIZWxsbywgV29ybGQuJycgQW5kIHRoYXQncyB0aGUgZW5kIG9mIGl0LjwvcD4KLQotPHA+SWYgeW91IG9wZW4geW91ciBmYXZvcml0ZSBicm93c2VyIGFuZCB0ZWxsIGl0IHRvIGdldCB0aGUgYWRkcmVzczwvcD4KLQotPHByZT4KLSAgICAgICAgaHR0cDovL3d3dy5leGFtcGxlLmNvbS9jZ2ktYmluL2ZpcnN0LnBsCi08L3ByZT4KLQotPHA+b3Igd2hlcmV2ZXIgeW91IHB1dCB5b3VyIGZpbGUsIHlvdSB3aWxsIHNlZSB0aGUgb25lIGxpbmUKLTxjb2RlPkhlbGxvLCBXb3JsZC48L2NvZGU+IGFwcGVhciBpbiB5b3VyIGJyb3dzZXIgd2luZG93LiBJdCdzIG5vdCB2ZXJ5Ci1leGNpdGluZywgYnV0IG9uY2UgeW91IGdldCB0aGF0IHdvcmtpbmcsIHlvdSdsbCBoYXZlIGEgZ29vZCBjaGFuY2Ugb2YKLWdldHRpbmcganVzdCBhYm91dCBhbnl0aGluZyB3b3JraW5nLjwvcD4KLQotPGhyPgotPGgyPjxhIG5hbWU9ImJ1dGl0c3N0aWxsbm90d29ya2luZyI+QnV0IGl0J3Mgc3RpbGwgbm90Ci13b3JraW5nITwvYT48L2gyPgotCi08cD5UaGVyZSBhcmUgZm91ciBiYXNpYyB0aGluZ3MgdGhhdCB5b3UgbWF5IHNlZSBpbiB5b3VyIGJyb3dzZXIgd2hlbgoteW91IHRyeSB0byBhY2Nlc3MgeW91ciBDR0kgcHJvZ3JhbSBmcm9tIHRoZSB3ZWI6PC9wPgotCi08ZGw+Ci08ZHQ+VGhlIG91dHB1dCBvZiB5b3VyIENHSSBwcm9ncmFtPC9kdD4KLTxkZD5HcmVhdCEgIFRoYXQgbWVhbnMgZXZlcnl0aGluZyB3b3JrZWQgZmluZS48YnI+PGJyPjwvZGQ+Ci0KLTxkdD5UaGUgc291cmNlIGNvZGUgb2YgeW91ciBDR0kgcHJvZ3JhbSBvciBhICJQT1NUIE1ldGhvZCBOb3QgQWxsb3dlZCIKLW1lc3NhZ2U8L2R0PiAKLTxkZD5UaGF0IG1lYW5zIHRoYXQgeW91IGhhdmUgbm90IHByb3Blcmx5IGNvbmZpZ3VyZWQKLUFwYWNoZSB0byBwcm9jZXNzIHlvdXIgQ0dJIHByb2dyYW0uICBSZXJlYWQgdGhlIHNlY3Rpb24gb24gPGEKLWhyZWY9IiNjb25maWd1cmluZ2FwYWNoZXRvcGVybWl0Y2dpIj5jb25maWd1cmluZyBBcGFjaGU8L2E+IGFuZCB0cnkgdG8KLWZpbmQgd2hhdCB5b3UgbWlzc2VkLjxicj48YnI+PC9kZD4KLQotPGR0PkEgbWVzc2FnZSBzdGFydGluZyB3aXRoICJGb3JiaWRkZW4iPC9kdD4gPGRkPlRoYXQgbWVhbnMgdGhhdCB0aGVyZQotaXMgYSBwZXJtaXNzaW9ucyBwcm9ibGVtLiAgQ2hlY2sgdGhlIDxhIGhyZWY9IiNlcnJvcmxvZ3MiPkFwYWNoZQotZXJyb3IgbG9nPC9hPiBhbmQgdGhlIHNlY3Rpb24gYmVsb3cgb24gPGEKLWhyZWY9IiNmaWxlcGVybWlzc2lvbnMiPmZpbGUgcGVybWlzc2lvbnM8L2E+Ljxicj48YnI+PC9kZD4KLQotPGR0PkEgbWVzc2FnZSBzYXlpbmcgIkludGVybmFsIFNlcnZlciBFcnJvciI8L2R0PiA8ZGQ+SWYgeW91IGNoZWNrIHRoZQotPGEgaHJlZj0iI2Vycm9ybG9ncyI+QXBhY2hlIGVycm9yIGxvZzwvYT4sIHlvdSB3aWxsIHByb2JhYmx5IGZpbmQKLXRoYXQgaXQgc2F5cyAiUHJlbWF0dXJlIGVuZCBvZiBzY3JpcHQgaGVhZGVycyIsIHBvc3NpYmx5IGFsb25nIHdpdGggYW4KLWVycm9yIG1lc3NhZ2UgZ2VuZXJhdGVkIGJ5IHlvdXIgQ0dJIHByb2dyYW0uICBJbiB0aGlzIGNhc2UsIHlvdSB3aWxsCi13YW50IHRvIGNoZWNrIGVhY2ggb2YgdGhlIGJlbG93IHNlY3Rpb25zIHRvIHNlZSB3aGF0IG1pZ2h0IGJlIHByZXZlbnRpbmcKLXlvdXIgQ0dJIHByb2dyYW0gZnJvbSBlbWl0dGluZyB0aGUgcHJvcGVyIEhUVFAgaGVhZGVycy48L2RkPgotPC9kbD4KLQotCi08aDM+PGEgbmFtZT0iZmlsZXBlcm1pc3Npb25zIj5GaWxlIHBlcm1pc3Npb25zPC9hPjwvaDM+Ci0KLTxwPlJlbWVtYmVyIHRoYXQgdGhlIHNlcnZlciBkb2VzIG5vdCBydW4gYXMgeW91LiBUaGF0IGlzLCB3aGVuIHRoZQotc2VydmVyIHN0YXJ0cyB1cCwgaXQgaXMgcnVubmluZyB3aXRoIHRoZSBwZXJtaXNzaW9ucyBvZiBhbiB1bnByaXZpbGVnZWQKLXVzZXIgLSB1c3VhbGx5IGBgbm9ib2R5JycsIG9yIGBgd3d3JycgLSBhbmQgc28gaXQgd2lsbCBuZWVkIGV4dHJhCi1wZXJtaXNzaW9ucyB0byBleGVjdXRlIGZpbGVzIHRoYXQgYXJlIG93bmVkIGJ5IHlvdS4gVXN1YWxseSwgdGhlIHdheSB0bwotZ2l2ZSBhIGZpbGUgc3VmZmljaWVudCBwZXJtaXNzaW9ucyB0byBiZSBleGVjdXRlZCBieSBgYG5vYm9keScnIGlzIHRvCi1naXZlIGV2ZXJ5b25lIGV4ZWN1dGUgcGVybWlzc2lvbiBvbiB0aGUgZmlsZTo8L3A+Ci0KLTxwcmU+Ci0gICAgICAgIGNobW9kIGEreCBmaXJzdC5wbAotPC9wcmU+Ci0KLTxwPkFsc28sIGlmIHlvdXIgcHJvZ3JhbSByZWFkcyBmcm9tLCBvciB3cml0ZXMgdG8sIGFueSBvdGhlciBmaWxlcywKLXRob3NlIGZpbGVzIHdpbGwgbmVlZCB0byBoYXZlIHRoZSBjb3JyZWN0IHBlcm1pc3Npb25zIHRvIHBlcm1pdAotdGhpcy48L3A+Ci0KLTxwPlRoZSBleGNlcHRpb24gdG8gdGhpcyBpcyB3aGVuIHRoZSBzZXJ2ZXIgaXMgY29uZmlndXJlZCB0byB1c2UgPGEKLWhyZWY9Ii4uL3N1ZXhlYy5odG1sIj5zdWV4ZWM8L2E+LiAgVGhpcyBwcm9ncmFtIGFsbG93cyBDR0kgcHJvZ3JhbXMgdG8KLWJlIHJ1biB1bmRlciBkaWZmZXJlbnQgdXNlciBwZXJtaXNzaW9ucywgZGVwZW5kaW5nIG9uIHdoaWNoIHZpcnR1YWwKLWhvc3Qgb3IgdXNlciBob21lIGRpcmVjdG9yeSB0aGV5IGFyZSBsb2NhdGVkIGluLiAgU3VleGVjIGhhcyB2ZXJ5Ci1zdHJpY3QgcGVybWlzc2lvbiBjaGVja2luZywgYW5kIGFueSBmYWlsdXJlIGluIHRoYXQgY2hlY2tpbmcgd2lsbAotcmVzdWx0IGluIHlvdXIgQ0dJIHByb2dyYW1zIGZhaWxpbmcgd2l0aCBhbiAiSW50ZXJuYWwgU2VydmVyIEVycm9yIi4KLUluIHRoaXMgY2FzZSwgeW91IHdpbGwgbmVlZCB0byBjaGVjayB0aGUgc3VleGVjIGxvZyBmaWxlIHRvIHNlZSB3aGF0Ci1zcGVjaWZpYyBzZWN1cml0eSBjaGVjayBpcyBmYWlsaW5nLjwvcD4KLQotPGgzPjxhIG5hbWU9InBhdGhpbmZvcm1hdGlvbiI+UGF0aCBpbmZvcm1hdGlvbjwvYT48L2gzPgotCi08cD5XaGVuIHlvdSBydW4gYSBwcm9ncmFtIGZyb20geW91ciBjb21tYW5kIGxpbmUsIHlvdSBoYXZlIGNlcnRhaW4KLWluZm9ybWF0aW9uIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBzaGVsbCB3aXRob3V0IHlvdSB0aGlua2luZyBhYm91dCBpdC4KLUZvciBleGFtcGxlLCB5b3UgaGF2ZSBhIHBhdGgsIHdoaWNoIHRlbGxzIHRoZSBzaGVsbCB3aGVyZSBpdCBjYW4gbG9vawotZm9yIGZpbGVzIHRoYXQgeW91IHJlZmVyZW5jZS48L3A+Ci0KLTxwPldoZW4gYSBwcm9ncmFtIHJ1bnMgdGhyb3VnaCB0aGUgd2ViIHNlcnZlciBhcyBhIENHSSBwcm9ncmFtLCBpdCBkb2VzCi1ub3QgaGF2ZSB0aGF0IHBhdGguIEFueSBwcm9ncmFtcyB0aGF0IHlvdSBpbnZva2UgaW4geW91ciBDR0kgcHJvZ3JhbQotKGxpa2UgJ3NlbmRtYWlsJywgZm9yIGV4YW1wbGUpIHdpbGwgbmVlZCB0byBiZSBzcGVjaWZpZWQgYnkgYSBmdWxsCi1wYXRoLCBzbyB0aGF0IHRoZSBzaGVsbCBjYW4gZmluZCB0aGVtIHdoZW4gaXQgYXR0ZW1wdHMgdG8gZXhlY3V0ZSB5b3VyCi1DR0kgcHJvZ3JhbS48L3A+Ci0KLTxwPkEgY29tbW9uIG1hbmlmZXN0YXRpb24gb2YgdGhpcyBpcyB0aGUgcGF0aCB0byB0aGUgc2NyaXB0IGludGVycHJldGVyCi0ob2Z0ZW4gPGNvZGU+cGVybDwvY29kZT4pIGluZGljYXRlZCBpbiB0aGUgZmlyc3QgbGluZSBvZiB5b3VyIENHSQotcHJvZ3JhbSwgd2hpY2ggd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlOjwvcD4KLQotPHByZT4KLSAgICAgIyEvdXNyL2Jpbi9wZXJsCi08L3ByZT4KLQotPHA+TWFrZSBzdXJlIHRoYXQgdGhpcyBpcyBpbiBmYWN0IHRoZSBwYXRoIHRvIHRoZSBpbnRlcnByZXRlci48L3A+Ci0KLTxoMz48YSBuYW1lPSJzeW50YXhlcnJvcnMiPlN5bnRheCBlcnJvcnM8L2E+PC9oMz4KLQotPHA+TW9zdCBvZiB0aGUgdGltZSB3aGVuIGEgQ0dJIHByb2dyYW0gZmFpbHMsIGl0J3MgYmVjYXVzZSBvZiBhIHByb2JsZW0KLXdpdGggdGhlIHByb2dyYW0gaXRzZWxmLiBUaGlzIGlzIHBhcnRpY3VsYXJseSB0cnVlIG9uY2UgeW91IGdldCB0aGUKLWhhbmcgb2YgdGhpcyBDR0kgc3R1ZmYsIGFuZCBubyBsb25nZXIgbWFrZSB0aGUgYWJvdmUgdHdvIG1pc3Rha2VzLgotQWx3YXlzIGF0dGVtcHQgdG8gcnVuIHlvdXIgcHJvZ3JhbSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYmVmb3JlIHlvdQotdGVzdCBpZiB2aWEgYSBicm93c2VyLiBUaGlzIHdpbGwgZWxpbWluYXRlIG1vc3Qgb2YgeW91ciBwcm9ibGVtcy48L3A+Ci0KLTxoMz48YSBuYW1lPSJlcnJvcmxvZ3MiPkVycm9yIGxvZ3M8L2E+PC9oMz4KLQotPHA+VGhlIGVycm9yIGxvZ3MgYXJlIHlvdXIgZnJpZW5kLiBBbnl0aGluZyB0aGF0IGdvZXMgd3JvbmcgZ2VuZXJhdGVzCi1tZXNzYWdlIGluIHRoZSBlcnJvciBsb2cuIFlvdSBzaG91bGQgYWx3YXlzIGxvb2sgdGhlcmUgZmlyc3QuIElmIHRoZQotcGxhY2Ugd2hlcmUgeW91IGFyZSBob3N0aW5nIHlvdXIgd2ViIHNpdGUgZG9lcyBub3QgcGVybWl0IHlvdSBhY2Nlc3MgdG8KLXRoZSBlcnJvciBsb2csIHlvdSBzaG91bGQgcHJvYmFibHkgaG9zdCB5b3VyIHNpdGUgc29tZXdoZXJlIGVsc2UuIExlYXJuCi10byByZWFkIHRoZSBlcnJvciBsb2dzLCBhbmQgeW91J2xsIGZpbmQgdGhhdCBhbG1vc3QgYWxsIG9mIHlvdXIKLXByb2JsZW1zIGFyZSBxdWlja2x5IGlkZW50aWZpZWQsIGFuZCBxdWlja2x5IHNvbHZlZC48L3A+Ci0KLTxocj4KLTxoMj48YSBuYW1lPSJ3aGF0c2dvaW5nb25iZWhpbmR0aGVzY2VuZXMiPldoYXQncyBnb2luZyBvbiBiZWhpbmQKLXRoZSBzY2VuZXM/PC9hPjwvaDI+Ci0KLTxwPkFzIHlvdSBiZWNvbWUgbW9yZSBhZHZhbmNlZCBpbiBDR0kgcHJvZ3JhbW1pbmcsIGl0IHdpbGwgYmVjb21lCi11c2VmdWwgdG8gdW5kZXJzdGFuZCBtb3JlIGFib3V0IHdoYXQncyBoYXBwZW5pbmcgYmVoaW5kIHRoZSBzY2VuZXMuCi1TcGVjaWZpY2FsbHksIGhvdyB0aGUgYnJvd3NlciBhbmQgc2VydmVyIGNvbW11bmljYXRlIHdpdGggb25lIGFub3RoZXIuCi1CZWNhdXNlIGFsdGhvdWdoIGl0J3MgYWxsIHZlcnkgd2VsbCB0byB3cml0ZSBhIHByb2dyYW0gdGhhdCBwcmludHMKLWBgSGVsbG8sIFdvcmxkLicnLCBpdCdzIG5vdCBwYXJ0aWN1bGFybHkgdXNlZnVsLjwvcD4KLQotPGgzPjxhIG5hbWU9ImVudmlyb25tZW50dmFyaWFibGVzIj5FbnZpcm9ubWVudCB2YXJpYWJsZXM8L2E+PC9oMz4KLQotPHA+RW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSB2YWx1ZXMgdGhhdCBmbG9hdCBhcm91bmQgeW91IGFzIHlvdSB1c2UKLXlvdXIgY29tcHV0ZXIuIFRoZXkgYXJlIHVzZWZ1bCB0aGluZ3MgbGlrZSB5b3VyIHBhdGggKHdoZXJlIHRoZQotY29tcHV0ZXIgc2VhcmNoZXMgZm9yIGEgdGhlIGFjdHVhbCBmaWxlIGltcGxlbWVudGluZyBhIGNvbW1hbmQgd2hlbiB5b3UKLXR5cGUgaXQpLCB5b3VyIHVzZXJuYW1lLCB5b3VyIHRlcm1pbmFsIHR5cGUsIGFuZCBzbyBvbi4gRm9yIGEgZnVsbCBsaXN0Ci1vZiB5b3VyIG5vcm1hbCwgZXZlcnkgZGF5IGVudmlyb25tZW50IHZhcmlhYmxlcywgdHlwZSA8Y29kZT5lbnY8L2NvZGU+Ci1hdCBhIGNvbW1hbmQgcHJvbXB0LjwvcD4KLQotPHA+RHVyaW5nIHRoZSBDR0kgdHJhbnNhY3Rpb24sIHRoZSBzZXJ2ZXIgYW5kIHRoZSBicm93c2VyIGFsc28gc2V0Ci1lbnZpcm9ubWVudCB2YXJpYWJsZXMsIHNvIHRoYXQgdGhleSBjYW4gY29tbXVuaWNhdGUgd2l0aCBvbmUgYW5vdGhlci4KLVRoZXNlIGFyZSB0aGluZ3MgbGlrZSB0aGUgYnJvd3NlciB0eXBlIChOZXRzY2FwZSwgSUUsIEx5bngpLCB0aGUgc2VydmVyCi10eXBlIChBcGFjaGUsIElJUywgV2ViU2l0ZSksIHRoZSBuYW1lIG9mIHRoZSBDR0kgcHJvZ3JhbSB0aGF0IGlzIGJlaW5nCi1ydW4sIGFuZCBzbyBvbi48L3A+Ci0KLTxwPlRoZXNlIHZhcmlhYmxlcyBhcmUgYXZhaWxhYmxlIHRvIHRoZSBDR0kgcHJvZ3JhbW1lciwgYW5kIGFyZSBoYWxmIG9mCi10aGUgc3Rvcnkgb2YgdGhlIGNsaWVudC1zZXJ2ZXIgY29tbXVuaWNhdGlvbi4gVGhlIGNvbXBsZXRlIGxpc3Qgb2YKLXJlcXVpcmVkIHZhcmlhYmxlcyBpcyBhdCA8YSBocmVmPQotImh0dHA6Ly9ob29ob28ubmNzYS51aXVjLmVkdS9jZ2kvZW52Lmh0bWwiPmh0dHA6Ly9ob29ob28ubmNzYS51aXVjLmVkdS9jZ2kvZW52Lmh0bWw8L2E+PC9wPgotCi08cD5UaGlzIHNpbXBsZSBQZXJsIENHSSBwcm9ncmFtIHdpbGwgZGlzcGxheSBhbGwgb2YgdGhlIGVudmlyb25tZW50Ci12YXJpYWJsZXMgdGhhdCBhcmUgYmVpbmcgcGFzc2VkIGFyb3VuZC4gIFR3byBzaW1pbGFyIHByb2dyYW1zIGFyZQotaW5jbHVkZWQgaW4gdGhlIDxjb2RlPmNnaS1iaW48L2NvZGU+IGRpcmVjdG9yeSBvZiB0aGUgQXBhY2hlCi1kaXN0cmlidXRpb24uIE5vdGUgdGhhdCBzb21lIHZhcmlhYmxlcyBhcmUgcmVxdWlyZWQsIHdoaWxlIG90aGVycyBhcmUKLW9wdGlvbmFsLCBzbyB5b3UgbWF5IHNlZSBzb21lIHZhcmlhYmxlcyBsaXN0ZWQgdGhhdCB3ZXJlIG5vdCBpbiB0aGUKLW9mZmljaWFsIGxpc3QuICBJbiBhZGRpdGlvbiwgQXBhY2hlIHByb3ZpZGVzIG1hbnkgZGlmZmVyZW50IHdheXMgZm9yCi15b3UgdG8gPGEgaHJlZj0iLi4vZW52Lmh0bWwiPmFkZCB5b3VyIG93biBlbnZpcm9ubWVudCB2YXJpYWJsZXM8L2E+IHRvCi10aGUgYmFzaWMgb25lcyBwcm92aWRlZCBieSBkZWZhdWx0LjwvcD4KLQotPHByZT4KLSAgICAgIyEvdXNyL2Jpbi9wZXJsCi0gICAgIHByaW50ICJDb250ZW50LXR5cGU6IHRleHQvaHRtbFxuXG4iOwotICAgICBmb3JlYWNoICRrZXkgKGtleXMgJUVOVikgewotICAgICAgICAgIHByaW50ICIka2V5IC0tJmd0OyAkRU5WeyRrZXl9Jmx0O2JyJmd0OyI7Ci0gICAgIH0KLTwvcHJlPgotCi08aDM+PGEgbmFtZT0ic3RkaW5hbmRzdGRvdXQiPlNURElOIGFuZCBTVERPVVQ8L2E+PC9oMz4KLQotPHA+T3RoZXIgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBzZXJ2ZXIgYW5kIHRoZSBjbGllbnQgaGFwcGVucyBvdmVyCi1zdGFuZGFyZCBpbnB1dCAoPGNvZGU+U1RESU48L2NvZGU+KSBhbmQgc3RhbmRhcmQgb3V0cHV0Ci0oPGNvZGU+U1RET1VUPC9jb2RlPikuIEluIG5vcm1hbCBldmVyeWRheSBjb250ZXh0LCA8Y29kZT5TVERJTjwvY29kZT4KLW1lYW5zIHRoZSBrZXlib2FyZCwgb3IgYSBmaWxlIHRoYXQgYSBwcm9ncmFtIGlzIGdpdmVuIHRvIGFjdCBvbiwgYW5kCi08Y29kZT5TVERPVVQ8L2NvZGU+IHVzdWFsbHkgbWVhbnMgdGhlIGNvbnNvbGUgb3Igc2NyZWVuLjwvcD4KLQotPHA+V2hlbiB5b3UgPGNvZGU+UE9TVDwvY29kZT4gYSB3ZWIgZm9ybSB0byBhIENHSSBwcm9ncmFtLCB0aGUgZGF0YSBpbgotdGhhdCBmb3JtIGlzIGJ1bmRsZWQgdXAgaW50byBhIHNwZWNpYWwgZm9ybWF0IGFuZCBnZXRzIGRlbGl2ZXJlZCB0bwoteW91ciBDR0kgcHJvZ3JhbSBvdmVyIDxjb2RlPlNURElOPC9jb2RlPi4gVGhlIHByb2dyYW0gdGhlbiBjYW4gcHJvY2VzcwotdGhhdCBkYXRhIGFzIHRob3VnaCBpdCB3YXMgY29taW5nIGluIGZyb20gdGhlIGtleWJvYXJkLCBvciBmcm9tIGEKLWZpbGU8L3A+Ci0KLTxwPlRoZSBgYHNwZWNpYWwgZm9ybWF0JycgaXMgdmVyeSBzaW1wbGUuIEEgZmllbGQgbmFtZSBhbmQgaXRzIHZhbHVlCi1hcmUgam9pbmVkIHRvZ2V0aGVyIHdpdGggYW4gZXF1YWxzICg9KSBzaWduLCBhbmQgcGFpcnMgb2YgdmFsdWVzIGFyZQotam9pbmVkIHRvZ2V0aGVyIHdpdGggYW4gYW1wZXJzYW5kICgmYW1wOykuIEluY29udmVuaWVudCBjaGFyYWN0ZXJzIGxpa2UKLXNwYWNlcywgYW1wZXJzYW5kcywgYW5kIGVxdWFscyBzaWducywgYXJlIGNvbnZlcnRlZCBpbnRvIHRoZWlyIGhleAotZXF1aXZhbGVudCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ3VtIHVwIHRoZSB3b3Jrcy4gVGhlIHdob2xlIGRhdGEgc3RyaW5nCi1taWdodCBsb29rIHNvbWV0aGluZyBsaWtlOjwvcD4KLQotPHByZT4KLSAgICAgbmFtZT1SaWNoJTIwQm93ZW4mYW1wO2NpdHk9TGV4aW5ndG9uJmFtcDtzdGF0ZT1LWSZhbXA7c2lkZWtpY2s9U3F1aXJyZWwlMjBNb25rZXkKLTwvcHJlPgotCi08cD5Zb3UnbGwgc29tZXRpbWVzIGFsc28gc2VlIHRoaXMgdHlwZSBvZiBzdHJpbmcgYXBwZW5kZWQgdG8gdGhlIGEgVVJMLgotV2hlbiB0aGF0IGlzIGRvbmUsIHRoZSBzZXJ2ZXIgcHV0cyB0aGF0IHN0cmluZyBpbnRvIHRoZSBlbnZpcm9ubWVudAotdmFyaWFibGUgY2FsbGVkIDxjb2RlPlFVRVJZX1NUUklORzwvY29kZT4uIFRoYXQncyBjYWxsZWQgYQotPGNvZGU+R0VUPC9jb2RlPiByZXF1ZXN0LiBZb3VyIEhUTUwgZm9ybSBzcGVjaWZpZXMgd2hldGhlciBhCi08Y29kZT5HRVQ8L2NvZGU+IG9yIGEgPGNvZGU+UE9TVDwvY29kZT4gaXMgdXNlZCB0byBkZWxpdmVyIHRoZSBkYXRhLCBieQotc2V0dGluZyB0aGUgPGNvZGU+TUVUSE9EPC9jb2RlPiBhdHRyaWJ1dGUgaW4gdGhlIDxjb2RlPkZPUk08L2NvZGU+Ci10YWcuPC9wPgotCi08cD5Zb3VyIHByb2dyYW0gaXMgdGhlbiByZXNwb25zaWJsZSBmb3Igc3BsaXR0aW5nIHRoYXQgc3RyaW5nIHVwIGludG8KLXVzZWZ1bCBpbmZvcm1hdGlvbi4gRm9ydHVuYXRlbHksIHRoZXJlIGFyZSBsaWJyYXJpZXMgYW5kIG1vZHVsZXMKLWF2YWlsYWJsZSB0byBoZWxwIHlvdSBwcm9jZXNzIHRoaXMgZGF0YSwgYXMgd2VsbCBhcyBoYW5kbGUgb3RoZXIgb2YgdGhlCi1hc3BlY3RzIG9mIHlvdXIgQ0dJIHByb2dyYW0uPC9wPgotCi08aHI+Ci08aDI+PGEgbmFtZT0iY2dpbW9kdWxlc2xpYnJhcmllcyI+Q0dJIG1vZHVsZXMvbGlicmFyaWVzPC9hPjwvaDI+Ci0KLTxwPldoZW4geW91IHdyaXRlIENHSSBwcm9ncmFtcywgeW91IHNob3VsZCBjb25zaWRlciB1c2luZyBhIGNvZGUKLWxpYnJhcnksIG9yIG1vZHVsZSwgdG8gZG8gbW9zdCBvZiB0aGUgZ3J1bnQgd29yayBmb3IgeW91LiBUaGlzIGxlYWRzIHRvCi1mZXdlciBlcnJvcnMsIGFuZCBmYXN0ZXIgZGV2ZWxvcG1lbnQuPC9wPgotCi08cD5JZiB5b3UncmUgd3JpdGluZyBDR0kgcHJvZ3JhbXMgaW4gUGVybCwgbW9kdWxlcyBhcmUgYXZhaWxhYmxlIG9uIDxhCi1ocmVmPSJodHRwOi8vd3d3LmNwYW4ub3JnLyI+Q1BBTjwvYT4uIFRoZSBtb3N0IHBvcHVsYXIgbW9kdWxlIGZvciB0aGlzCi1wdXJwb3NlIGlzIENHSS5wbS4gWW91IG1pZ2h0IGFsc28gY29uc2lkZXIgQ0dJOjpMaXRlLCB3aGljaCBpbXBsZW1lbnRzCi1hIG1pbmltYWwgc2V0IG9mIGZ1bmN0aW9uYWxpdHksIHdoaWNoIGlzIGFsbCB5b3UgbmVlZCBpbiBtb3N0Ci1wcm9ncmFtcy48L3A+Ci0KLTxwPklmIHlvdSdyZSB3cml0aW5nIENHSSBwcm9ncmFtcyBpbiBDLCB0aGVyZSBhcmUgYSB2YXJpZXR5IG9mIG9wdGlvbnMuCi1PbmUgb2YgdGhlc2UgaXMgdGhlIENHSUMgbGlicmFyeSwgZnJvbSA8YSBocmVmPQotImh0dHA6Ly93d3cuYm91dGVsbC5jb20vY2dpYy8iPmh0dHA6Ly93d3cuYm91dGVsbC5jb20vY2dpYy88L2E+PC9wPgotCi08aHI+Ci08aDI+PGEgbmFtZT0iZm9ybW9yZWluZm9ybWF0aW9uIj5Gb3IgbW9yZSBpbmZvcm1hdGlvbjwvYT48L2gyPgotCi08cD5UaGVyZSBhcmUgYSBsYXJnZSBudW1iZXIgb2YgQ0dJIHJlc291cmNlcyBvbiB0aGUgd2ViLiBZb3UgY2FuCi1kaXNjdXNzIENHSSBwcm9ibGVtcyB3aXRoIG90aGVyIHVzZXJzIG9uIHRoZSBVc2VuZXQgZ3JvdXAKLWNvbXAuaW5mb3N5c3RlbXMud3d3LmF1dGhvcmluZy5jZ2kuIEFuZCB0aGUgLXNlcnZlcnMgbWFpbGluZyBsaXN0IGZyb20KLXRoZSBIVE1MIFdyaXRlcnMgR3VpbGQgaXMgYSBncmVhdCBzb3VyY2Ugb2YgYW5zd2VycyB0byB5b3VyIHF1ZXN0aW9ucy4KLVlvdSBjYW4gZmluZCBvdXQgbW9yZSBhdCA8YSBocmVmPQotImh0dHA6Ly93d3cuaHdnLm9yZy9saXN0cy9od2ctc2VydmVycy8iPmh0dHA6Ly93d3cuaHdnLm9yZy9saXN0cy9od2ctc2VydmVycy88L2E+PC9wPgotCi08cD5BbmQsIG9mIGNvdXJzZSwgeW91IHNob3VsZCBwcm9iYWJseSByZWFkIHRoZSBDR0kgc3BlY2lmaWNhdGlvbiwKLXdoaWNoIGhhcyBhbGwgdGhlIGRldGFpbHMgb24gdGhlIG9wZXJhdGlvbiBvZiBDR0kgcHJvZ3JhbXMuICBZb3UgY2FuCi1maW5kIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIGF0IHRoZSA8YSBocmVmPQotImh0dHA6Ly9ob29ob28ubmNzYS51aXVjLmVkdS9jZ2kvaW50ZXJmYWNlLmh0bWwiPk5DU0E8L2E+IGFuZCB0aGVyZSBpcwotYW4gdXBkYXRlZCBkcmFmdCBhdCB0aGUgPGEKLWhyZWY9Imh0dHA6Ly93ZWIuZ29sdXguY29tL2NvYXIvY2dpLyI+Q29tbW9uIEdhdGV3YXkgSW50ZXJmYWNlIFJGQwotcHJvamVjdDwvYT4uPC9wPgotCi08cD5XaGVuIHlvdSBwb3N0IGEgcXVlc3Rpb24gYWJvdXQgYSBDR0kgcHJvYmxlbSB0aGF0IHlvdSdyZSBoYXZpbmcsCi13aGV0aGVyIHRvIGEgbWFpbGluZyBsaXN0LCBvciB0byBhIG5ld3Nncm91cCwgbWFrZSBzdXJlIHlvdSBwcm92aWRlCi1lbm91Z2ggaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBoYXBwZW5lZCwgd2hhdCB5b3UgZXhwZWN0ZWQgdG8gaGFwcGVuLAotYW5kIGhvdyB3aGF0IGFjdHVhbGx5IGhhcHBlbmVkIHdhcyBkaWZmZXJlbnQsIHdoYXQgc2VydmVyIHlvdSdyZQotcnVubmluZywgd2hhdCBsYW5ndWFnZSB5b3VyIENHSSBwcm9ncmFtIHdhcyBpbiwgYW5kLCBpZiBwb3NzaWJsZSwgdGhlCi1vZmZlbmRpbmcgY29kZS4gVGhpcyB3aWxsIG1ha2UgZmluZGluZyB5b3VyIHByb2JsZW0gbXVjaCBzaW1wbGVyLjwvcD4KLQotPHA+Tm90ZSB0aGF0IHF1ZXN0aW9ucyBhYm91dCBDR0kgcHJvYmxlbXMgc2hvdWxkIDxzdHJvbmc+bmV2ZXI8L3N0cm9uZz4KLWJlIHBvc3RlZCB0byB0aGUgQXBhY2hlIGJ1ZyBkYXRhYmFzZSB1bmxlc3MgeW91IGFyZSBzdXJlIHlvdSBoYXZlIGZvdW5kCi1hIHByb2JsZW0gaW4gdGhlIEFwYWNoZSBzb3VyY2UgY29kZS48L3A+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci0KLTwvYm9keT4KLTwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvaG93dG8vY2dpLmh0bWwuZW4gYi9kb2NzL21hbnVhbC9ob3d0by9jZ2kuaHRtbC5lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFkYmNlYi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9ob3d0by9jZ2kuaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDQ5OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFwYWNoZSBUdXRvcmlhbDogRHluYW1pYyBDb250ZW50IHdpdGggQ0dJPC90aXRsZT4KLTxsaW5rIHJldj0ibWFkZSIgaHJlZj0ibWFpbHRvOnJib3dlbkByY2Jvd2VuLmNvbSI+Ci08L2hlYWQ+Ci08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB0ZXh0PSIjMDAwMDAwIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzAwMDA4MCIKLWFsaW5rPSIjRkYwMDAwIj4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08aDEgYWxpZ249IkNFTlRFUiI+RHluYW1pYyBDb250ZW50IHdpdGggQ0dJPC9oMT4KLQotPGEgbmFtZT0iX19pbmRleF9fIj48L2E+IDwhLS0gSU5ERVggQkVHSU4gLS0+Ci0gCi0KLTx1bD4KLTxsaT48YSBocmVmPSIjZHluYW1pY2NvbnRlbnR3aXRoY2dpIj5EeW5hbWljIENvbnRlbnQgd2l0aAotQ0dJPC9hPjwvbGk+Ci0KLTxsaT48YSBocmVmPSIjY29uZmlndXJpbmdhcGFjaGV0b3Blcm1pdGNnaSI+Q29uZmlndXJpbmcgQXBhY2hlIHRvCi1wZXJtaXQgQ0dJPC9hPgotCi08dWw+Ci08bGk+PGEgaHJlZj0iI3NjcmlwdGFsaWFzIj5TY3JpcHRBbGlhczwvYT48L2xpPgotCi08bGk+PGEgaHJlZj0iI2NnaW91dHNpZGVvZnNjcmlwdGFsaWFzZGlyZWN0b3JpZXMiPkNHSSBvdXRzaWRlIG9mCi1TY3JpcHRBbGlhcyBkaXJlY3RvcmllczwvYT4KLQotPHVsPgotPGxpPjxhIGhyZWY9IiNleHBsaWNpdGx5dXNpbmdvcHRpb25zdG9wZXJtaXRjZ2lleGVjdXRpb24iPkV4cGxpY2l0bHkgdXNpbmcKLU9wdGlvbnMgdG8gcGVybWl0IENHSSBleGVjdXRpb248L2E+PC9saT4KLQotPGxpPjxhIGhyZWY9IiNodGFjY2Vzc2ZpbGVzIj4uaHRhY2Nlc3MgZmlsZXM8L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci0KLTxsaT48YSBocmVmPSIjd3JpdGluZ2FjZ2lwcm9ncmFtIj5Xcml0aW5nIGEgQ0dJIHByb2dyYW08L2E+Ci0KLTx1bD4KLTxsaT48YSBocmVmPSIjeW91cmZpcnN0Y2dpcHJvZ3JhbSI+WW91ciBmaXJzdCBDR0kgcHJvZ3JhbTwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci0KLTxsaT48YSBocmVmPSIjYnV0aXRzc3RpbGxub3R3b3JraW5nIj5CdXQgaXQncyBzdGlsbCBub3QKLXdvcmtpbmchPC9hPgotCi08dWw+Ci08bGk+PGEgaHJlZj0iI2ZpbGVwZXJtaXNzaW9ucyI+RmlsZSBwZXJtaXNzaW9uczwvYT48L2xpPgotCi08bGk+PGEgaHJlZj0iI3BhdGhpbmZvcm1hdGlvbiI+UGF0aCBpbmZvcm1hdGlvbjwvYT48L2xpPgotCi08bGk+PGEgaHJlZj0iI3N5bnRheGVycm9ycyI+U3ludGF4IGVycm9yczwvYT48L2xpPgotCi08bGk+PGEgaHJlZj0iI2Vycm9ybG9ncyI+RXJyb3IgbG9nczwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci0KLTxsaT48YSBocmVmPSIjd2hhdHNnb2luZ29uYmVoaW5kdGhlc2NlbmVzIj5XaGF0J3MgZ29pbmcgb24gYmVoaW5kCi10aGUgc2NlbmVzPzwvYT4KLQotPHVsPgotPGxpPjxhIGhyZWY9IiNlbnZpcm9ubWVudHZhcmlhYmxlcyI+RW52aXJvbm1lbnQgdmFyaWFibGVzPC9hPjwvbGk+Ci0KLTxsaT48YSBocmVmPSIjc3RkaW5hbmRzdGRvdXQiPlNURElOIGFuZCBTVERPVVQ8L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotCi08bGk+PGEgaHJlZj0iI2NnaW1vZHVsZXNsaWJyYXJpZXMiPkNHSSBtb2R1bGVzL2xpYnJhcmllczwvYT48L2xpPgotCi08bGk+PGEgaHJlZj0iI2Zvcm1vcmVpbmZvcm1hdGlvbiI+Rm9yIG1vcmUgaW5mb3JtYXRpb248L2E+PC9saT4KLTwvdWw+Ci0KLTwhLS0gSU5ERVggRU5EIC0tPgotPGhyPgotPGgyPjxhIG5hbWU9ImR5bmFtaWNjb250ZW50d2l0aGNnaSI+RHluYW1pYyBDb250ZW50IHdpdGgKLUNHSTwvYT48L2gyPgotCi08dGFibGUgYm9yZGVyPSIxIj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiPgotPHN0cm9uZz5SZWxhdGVkIE1vZHVsZXM8L3N0cm9uZz48YnI+PGJyPgotCi08YSBocmVmPSIuLi9tb2QvbW9kX2FsaWFzLmh0bWwiPm1vZF9hbGlhczwvYT48YnI+Ci08YSBocmVmPSIuLi9tb2QvbW9kX2NnaS5odG1sIj5tb2RfY2dpPC9hPjxicj4KLQotPC90ZD48dGQgdmFsaWduPSJ0b3AiPgotPHN0cm9uZz5SZWxhdGVkIERpcmVjdGl2ZXM8L3N0cm9uZz48YnI+PGJyPgotCi08YSBocmVmPSIuLi9tb2QvbW9kX21pbWUuaHRtbCNhZGRoYW5kbGVyIj5BZGRIYW5kbGVyPC9hPjxicj4KLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjb3B0aW9ucyI+T3B0aW9uczwvYT48YnI+Ci08YSBocmVmPSIuLi9tb2QvbW9kX2FsaWFzLmh0bWwjc2NyaXB0YWxpYXMiPlNjcmlwdEFsaWFzPC9hPjxicj4KLQotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPlRoZSBDR0kgKENvbW1vbiBHYXRld2F5IEludGVyZmFjZSkgZGVmaW5lcyBhIHdheSBmb3IgYSB3ZWIgc2VydmVyCi10byBpbnRlcmFjdCB3aXRoIGV4dGVybmFsIGNvbnRlbnQtZ2VuZXJhdGluZyBwcm9ncmFtcywgd2hpY2ggYXJlIG9mdGVuCi1yZWZlcnJlZCB0byBhcyBDR0kgcHJvZ3JhbXMgb3IgQ0dJIHNjcmlwdHMuICBJdCBpcyB0aGUgc2ltcGxlc3QsIGFuZAotbW9zdCBjb21tb24sIHdheSB0byBwdXQgZHluYW1pYyBjb250ZW50IG9uIHlvdXIgd2ViIHNpdGUuIFRoaXMKLWRvY3VtZW50IHdpbGwgYmUgYW4gaW50cm9kdWN0aW9uIHRvIHNldHRpbmcgdXAgQ0dJIG9uIHlvdXIgQXBhY2hlIHdlYgotc2VydmVyLCBhbmQgZ2V0dGluZyBzdGFydGVkIHdyaXRpbmcgQ0dJIHByb2dyYW1zLjwvcD4KLQotPGhyPgotPGgyPjxhIG5hbWU9ImNvbmZpZ3VyaW5nYXBhY2hldG9wZXJtaXRjZ2kiPkNvbmZpZ3VyaW5nIEFwYWNoZSB0bwotcGVybWl0IENHSTwvYT48L2gyPgotCi08cD5JbiBvcmRlciB0byBnZXQgeW91ciBDR0kgcHJvZ3JhbXMgdG8gd29yayBwcm9wZXJseSwgeW91J2xsIG5lZWQgdG8KLWhhdmUgQXBhY2hlIGNvbmZpZ3VyZWQgdG8gcGVybWl0IENHSSBleGVjdXRpb24uIFRoZXJlIGFyZSBzZXZlcmFsIHdheXMKLXRvIGRvIHRoaXMuPC9wPgotCi08aDM+PGEgbmFtZT0ic2NyaXB0YWxpYXMiPlNjcmlwdEFsaWFzPC9hPjwvaDM+Ci0KLTxwPlRoZSA8Y29kZT5TY3JpcHRBbGlhczwvY29kZT4gZGlyZWN0aXZlIHRlbGxzIEFwYWNoZSB0aGF0IGEKLXBhcnRpY3VsYXIgZGlyZWN0b3J5IGlzIHNldCBhc2lkZSBmb3IgQ0dJIHByb2dyYW1zLiBBcGFjaGUgd2lsbCBhc3N1bWUKLXRoYXQgZXZlcnkgZmlsZSBpbiB0aGlzIGRpcmVjdG9yeSBpcyBhIENHSSBwcm9ncmFtLCBhbmQgd2lsbCBhdHRlbXB0IHRvCi1leGVjdXRlIGl0LCB3aGVuIHRoYXQgcGFydGljdWxhciByZXNvdXJjZSBpcyByZXF1ZXN0ZWQgYnkgYSBjbGllbnQuPC9wPgotCi08cD5UaGUgPGNvZGU+U2NyaXB0QWxpYXM8L2NvZGU+IGRpcmVjdGl2ZSBsb29rcyBsaWtlOjwvcD4KLQotPHByZT4KLSAgICAgICAgU2NyaXB0QWxpYXMgL2NnaS1iaW4vIC91c3IvbG9jYWwvYXBhY2hlL2NnaS1iaW4vCi08L3ByZT4KLQotPHA+VGhlIGV4YW1wbGUgc2hvd24gaXMgZnJvbSB5b3VyIGRlZmF1bHQgPGNvZGU+aHR0cGQuY29uZjwvY29kZT4KLWNvbmZpZ3VyYXRpb24gZmlsZSwgaWYgeW91IGluc3RhbGxlZCBBcGFjaGUgaW4gdGhlIGRlZmF1bHQgbG9jYXRpb24uCi1UaGUgPGNvZGU+U2NyaXB0QWxpYXM8L2NvZGU+IGRpcmVjdGl2ZSBpcyBtdWNoIGxpa2UgdGhlCi08Y29kZT5BbGlhczwvY29kZT4gZGlyZWN0aXZlLCB3aGljaCBkZWZpbmVzIGEgVVJMIHByZWZpeCB0aGF0IGlzIHRvCi1tYXBwZWQgdG8gYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeS4gPGNvZGU+QWxpYXM8L2NvZGU+IGFuZAotPGNvZGU+U2NyaXB0QWxpYXM8L2NvZGU+IGFyZSB1c3VhbGx5IHVzZWQgZm9yIGRpcmVjdG9yaWVzIHRoYXQgYXJlCi1vdXRzaWRlIG9mIHRoZSA8Y29kZT5Eb2N1bWVudFJvb3Q8L2NvZGU+IGRpcmVjdG9yeS4gVGhlIGRpZmZlcmVuY2UKLWJldHdlZW4gPGNvZGU+QWxpYXM8L2NvZGU+IGFuZCA8Y29kZT5TY3JpcHRBbGlhczwvY29kZT4gaXMgdGhhdAotPGNvZGU+U2NyaXB0QWxpYXM8L2NvZGU+IGhhcyB0aGUgYWRkZWQgbWVhbmluZyB0aGF0IGV2ZXJ5dGhpbmcgdW5kZXIKLXRoYXQgVVJMIHByZWZpeCB3aWxsIGJlIGNvbnNpZGVyZWQgYSBDR0kgcHJvZ3JhbS4gU28sIHRoZSBleGFtcGxlIGFib3ZlCi10ZWxscyBBcGFjaGUgdGhhdCBhbnkgcmVxdWVzdCBmb3IgYSByZXNvdXJjZSBiZWdpbm5pbmcgd2l0aAotPGNvZGU+L2NnaS1iaW4vPC9jb2RlPiBzaG91bGQgYmUgc2VydmVkIGZyb20gdGhlIGRpcmVjdG9yeQotPGNvZGU+L3Vzci9sb2NhbC9hcGFjaGUvY2dpLWJpbi88L2NvZGU+LCBhbmQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBDR0kKLXByb2dyYW0uPC9wPgotCi08cD5Gb3IgZXhhbXBsZSwgaWYgdGhlIFVSTAotPGNvZGU+aHR0cDovL2Rldi5yY2Jvd2VuLmNvbS9jZ2ktYmluL3Rlc3QucGw8L2NvZGU+IGlzIHJlcXVlc3RlZCwKLUFwYWNoZSB3aWxsIGF0dGVtcHQgdG8gZXhlY3V0ZSB0aGUgZmlsZQotPGNvZGU+L3Vzci9sb2NhbC9hcGFjaGUvY2dpLWJpbi90ZXN0LnBsPC9jb2RlPiBhbmQgcmV0dXJuIHRoZSBvdXRwdXQuCi1PZiBjb3Vyc2UsIHRoZSBmaWxlIHdpbGwgaGF2ZSB0byBleGlzdCwgYW5kIGJlIGV4ZWN1dGFibGUsIGFuZCByZXR1cm4KLW91dHB1dCBpbiBhIHBhcnRpY3VsYXIgd2F5LCBvciBBcGFjaGUgd2lsbCByZXR1cm4gYW4gZXJyb3IgbWVzc2FnZS48L3A+Ci0KLTxoMz48YSBuYW1lPSJjZ2lvdXRzaWRlb2ZzY3JpcHRhbGlhc2RpcmVjdG9yaWVzIj5DR0kgb3V0c2lkZSBvZgotU2NyaXB0QWxpYXMgZGlyZWN0b3JpZXM8L2E+PC9oMz4KLQotPHA+Q0dJIHByb2dyYW1zIGFyZSBvZnRlbiByZXN0cmljdGVkIHRvIDxjb2RlPlNjcmlwdEFsaWFzPC9jb2RlPidlZAotZGlyZWN0b3JpZXMgZm9yIHNlY3VyaXR5IHJlYXNvbnMuICBJbiB0aGlzIHdheSwgYWRtaW5pc3RyYXRvcnMgY2FuCi10aWdodGx5IGNvbnRyb2wgd2hvIGlzIGFsbG93ZWQgdG8gdXNlIENHSSBwcm9ncmFtcy4gIEhvd2V2ZXIsIGlmIHRoZQotcHJvcGVyIHNlY3VyaXR5IHByZWNhdXRpb25zIGFyZSB0YWtlbiwgdGhlcmUgaXMgbm8gcmVhc29uIHdoeQotQ0dJIHByb2dyYW1zIGNhbm5vdCBiZSBydW4gZnJvbSBhcmJpdHJhcnkgZGlyZWN0b3JpZXMuICBGb3IgZXhhbXBsZSwKLXlvdSBtYXkgd2lzaCB0byBsZXQgdXNlcnMgaGF2ZSB3ZWIgY29udGVudCBpbiB0aGVpciBob21lIGRpcmVjdG9yaWVzCi13aXRoIHRoZSA8Y29kZT5Vc2VyRGlyPC9jb2RlPiBkaXJlY3RpdmUuIElmIHRoZXkgd2FudCB0byBoYXZlIHRoZWlyCi1vd24gQ0dJIHByb2dyYW1zLCBidXQgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIG1haW4KLTxjb2RlPmNnaS1iaW48L2NvZGU+IGRpcmVjdG9yeSwgdGhleSB3aWxsIG5lZWQgdG8gYmUgYWJsZSB0byBydW4gQ0dJCi1wcm9ncmFtcyBlbHNld2hlcmUuPC9wPgotCi08aDM+PGEgbmFtZT0iZXhwbGljaXRseXVzaW5nb3B0aW9uc3RvcGVybWl0Y2dpZXhlY3V0aW9uIj5FeHBsaWNpdGx5IHVzaW5nCi1PcHRpb25zIHRvIHBlcm1pdCBDR0kgZXhlY3V0aW9uPC9hPjwvaDM+Ci0KLTxwPllvdSBjb3VsZCBleHBsaWNpdGx5IHVzZSB0aGUgPGNvZGU+T3B0aW9uczwvY29kZT4gZGlyZWN0aXZlLCBpbnNpZGUKLXlvdXIgbWFpbiBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlLCB0byBzcGVjaWZ5IHRoYXQgQ0dJIGV4ZWN1dGlvbiB3YXMKLXBlcm1pdHRlZCBpbiBhIHBhcnRpY3VsYXIgZGlyZWN0b3J5OjwvcD4KLQotPHByZT4KLSAgICAgICAgJmx0O0RpcmVjdG9yeSAvdXNyL2xvY2FsL2FwYWNoZS9odGRvY3Mvc29tZWRpciZndDsKLSAgICAgICAgICAgICAgICBPcHRpb25zICtFeGVjQ0dJCi0gICAgICAgICZsdDsvRGlyZWN0b3J5Jmd0OwotPC9wcmU+Ci0KLTxwPlRoZSBhYm92ZSBkaXJlY3RpdmUgdGVsbHMgQXBhY2hlIHRvIHBlcm1pdCB0aGUgZXhlY3V0aW9uIG9mIENHSQotZmlsZXMuIFlvdSB3aWxsIGFsc28gbmVlZCB0byB0ZWxsIHRoZSBzZXJ2ZXIgd2hhdCBmaWxlcyBhcmUgQ0dJIGZpbGVzLgotVGhlIGZvbGxvd2luZyA8Y29kZT5BZGRIYW5kbGVyPC9jb2RlPiBkaXJlY3RpdmUgdGVsbHMgdGhlIHNlcnZlcgotdG8gdHJlYXQgYWxsIGZpbGVzIHdpdGggdGhlIDxjb2RlPmNnaTwvY29kZT4gb3IgPGNvZGU+cGw8L2NvZGU+Ci1leHRlbnNpb24gYXMgQ0dJIHByb2dyYW1zOjwvcD4KLQotPHByZT4KLSAgICAgQWRkSGFuZGxlciBjZ2ktc2NyaXB0IGNnaSBwbAotPC9wcmU+Ci0KLTxoMz48YSBuYW1lPSJodGFjY2Vzc2ZpbGVzIj4uaHRhY2Nlc3MgZmlsZXM8L2E+PC9oMz4KLQotPHA+QSA8Y29kZT4uaHRhY2Nlc3M8L2NvZGU+IGZpbGUgaXMgYSB3YXkgdG8gc2V0IGNvbmZpZ3VyYXRpb24KLWRpcmVjdGl2ZXMgb24gYSBwZXItZGlyZWN0b3J5IGJhc2lzLiBXaGVuIEFwYWNoZSBzZXJ2ZXMgYSByZXNvdXJjZSwgaXQKLWxvb2tzIGluIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCBpdCBpcyBzZXJ2aW5nIGEgZmlsZSBmb3IgYSBmaWxlCi1jYWxsZWQgPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiwgYW5kLCBpZiBpdCBmaW5kcyBpdCwgaXQgd2lsbCBhcHBseQotZGlyZWN0aXZlcyBmb3VuZCB0aGVyZWluLiA8Y29kZT4uaHRhY2Nlc3M8L2NvZGU+IGZpbGVzIGNhbiBiZSBwZXJtaXR0ZWQKLXdpdGggdGhlIDxjb2RlPkFsbG93T3ZlcnJpZGU8L2NvZGU+IGRpcmVjdGl2ZSwgd2hpY2ggc3BlY2lmaWVzIHdoYXQKLXR5cGVzIG9mIGRpcmVjdGl2ZXMgY2FuIGFwcGVhciBpbiB0aGVzZSBmaWxlcywgb3IgaWYgdGhleSBhcmUgbm90Ci1hbGxvd2VkIGF0IGFsbC4gVG8gcGVybWl0IHRoZSBkaXJlY3RpdmUgd2Ugd2lsbCBuZWVkIGZvciB0aGlzIHB1cnBvc2UsCi10aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBuZWVkZWQgaW4geW91ciBtYWluIHNlcnZlcgotY29uZmlndXJhdGlvbjo8L3A+Ci0KLTxwcmU+Ci0gICAgICAgIEFsbG93T3ZlcnJpZGUgT3B0aW9ucwotPC9wcmU+Ci0KLTxwPkluIHRoZSA8Y29kZT4uaHRhY2Nlc3M8L2NvZGU+IGZpbGUsIHlvdSdsbCBuZWVkIHRoZSBmb2xsb3dpbmcKLWRpcmVjdGl2ZTo8L3A+Ci0KLTxwcmU+Ci0gICAgICAgIE9wdGlvbnMgK0V4ZWNDR0kKLTwvcHJlPgotCi08cD53aGljaCB0ZWxscyBBcGFjaGUgdGhhdCBleGVjdXRpb24gb2YgQ0dJIHByb2dyYW1zIGlzIHBlcm1pdHRlZCBpbgotdGhpcyBkaXJlY3RvcnkuPC9wPgotCi08aHI+Ci08aDI+PGEgbmFtZT0id3JpdGluZ2FjZ2lwcm9ncmFtIj5Xcml0aW5nIGEgQ0dJIHByb2dyYW08L2E+PC9oMj4KLQotPHA+VGhlcmUgYXJlIHR3byBtYWluIGRpZmZlcmVuY2VzIGJldHdlZW4gYGByZWd1bGFyJycgcHJvZ3JhbW1pbmcsIGFuZAotQ0dJIHByb2dyYW1taW5nLjwvcD4KLQotPHA+Rmlyc3QsIGFsbCBvdXRwdXQgZnJvbSB5b3VyIENHSSBwcm9ncmFtIG11c3QgYmUgcHJlY2VkZWQgYnkgYQotTUlNRS10eXBlIGhlYWRlci4gVGhpcyBpcyBIVFRQIGhlYWRlciB0aGF0IHRlbGxzIHRoZSBjbGllbnQgd2hhdCBzb3J0Ci1vZiBjb250ZW50IGl0IGlzIHJlY2VpdmluZy4gTW9zdCBvZiB0aGUgdGltZSwgdGhpcyB3aWxsIGxvb2sgbGlrZTo8L3A+Ci0KLTxwcmU+Ci0gICAgICAgIENvbnRlbnQtdHlwZTogdGV4dC9odG1sCi08L3ByZT4KLQotPHA+U2Vjb25kbHksIHlvdXIgb3V0cHV0IG5lZWRzIHRvIGJlIGluIEhUTUwsIG9yIHNvbWUgb3RoZXIgZm9ybWF0IHRoYXQKLWEgYnJvd3NlciB3aWxsIGJlIGFibGUgdG8gZGlzcGxheS4gTW9zdCBvZiB0aGUgdGltZSwgdGhpcyB3aWxsIGJlIEhUTUwsCi1idXQgb2NjYXNpb25hbGx5IHlvdSBtaWdodCB3cml0ZSBhIENHSSBwcm9ncmFtIHRoYXQgb3V0cHV0cyBhIGdpZgotaW1hZ2UsIG9yIG90aGVyIG5vbi1IVE1MIGNvbnRlbnQuPC9wPgotCi08cD5BcGFydCBmcm9tIHRob3NlIHR3byB0aGluZ3MsIHdyaXRpbmcgYSBDR0kgcHJvZ3JhbSB3aWxsIGxvb2sgYSBsb3QKLWxpa2UgYW55IG90aGVyIHByb2dyYW0gdGhhdCB5b3UgbWlnaHQgd3JpdGUuPC9wPgotCi08aDM+PGEgbmFtZT0ieW91cmZpcnN0Y2dpcHJvZ3JhbSI+WW91ciBmaXJzdCBDR0kgcHJvZ3JhbTwvYT48L2gzPgotCi08cD5UaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgQ0dJIHByb2dyYW0gdGhhdCBwcmludHMgb25lIGxpbmUgdG8geW91cgotYnJvd3Nlci4gVHlwZSBpbiB0aGUgZm9sbG93aW5nLCBzYXZlIGl0IHRvIGEgZmlsZSBjYWxsZWQKLTxjb2RlPmZpcnN0LnBsPC9jb2RlPiwgYW5kIHB1dCBpdCBpbiB5b3VyIDxjb2RlPmNnaS1iaW48L2NvZGU+Ci1kaXJlY3RvcnkuPC9wPgotCi08cHJlPgotICAgICAgICAjIS91c3IvYmluL3BlcmwKLSAgICAgICAgcHJpbnQgIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sXHJcblxyXG4iOwotICAgICAgICBwcmludCAiSGVsbG8sIFdvcmxkLiI7Ci08L3ByZT4KLQotPHA+RXZlbiBpZiB5b3UgYXJlIG5vdCBmYW1pbGlhciB3aXRoIFBlcmwsIHlvdSBzaG91bGQgYmUgYWJsZSB0byBzZWUKLXdoYXQgaXMgaGFwcGVuaW5nIGhlcmUuIFRoZSBmaXJzdCBsaW5lIHRlbGxzIEFwYWNoZSAob3Igd2hhdGV2ZXIgc2hlbGwKLXlvdSBoYXBwZW4gdG8gYmUgcnVubmluZyB1bmRlcikgdGhhdCB0aGlzIHByb2dyYW0gY2FuIGJlIGV4ZWN1dGVkIGJ5Ci1mZWVkaW5nIHRoZSBmaWxlIHRvIHRoZSBpbnRlcnByZXRlciBmb3VuZCBhdCB0aGUgbG9jYXRpb24KLTxjb2RlPi91c3IvYmluL3Blcmw8L2NvZGU+LiBUaGUgc2Vjb25kIGxpbmUgcHJpbnRzIHRoZSBjb250ZW50LXR5cGUKLWRlY2xhcmF0aW9uIHdlIHRhbGtlZCBhYm91dCwgZm9sbG93ZWQgYnkgdHdvIGNhcnJpYWdlLXJldHVybiBuZXdsaW5lCi1wYWlycy4gVGhpcyBwdXRzIGEgYmxhbmsgbGluZSBhZnRlciB0aGUgaGVhZGVyLCB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mCi10aGUgSFRUUCBoZWFkZXJzLCBhbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYm9keS4gVGhlIHRoaXJkIGxpbmUgcHJpbnRzCi10aGUgc3RyaW5nIGBgSGVsbG8sIFdvcmxkLicnIEFuZCB0aGF0J3MgdGhlIGVuZCBvZiBpdC48L3A+Ci0KLTxwPklmIHlvdSBvcGVuIHlvdXIgZmF2b3JpdGUgYnJvd3NlciBhbmQgdGVsbCBpdCB0byBnZXQgdGhlIGFkZHJlc3M8L3A+Ci0KLTxwcmU+Ci0gICAgICAgIGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vY2dpLWJpbi9maXJzdC5wbAotPC9wcmU+Ci0KLTxwPm9yIHdoZXJldmVyIHlvdSBwdXQgeW91ciBmaWxlLCB5b3Ugd2lsbCBzZWUgdGhlIG9uZSBsaW5lCi08Y29kZT5IZWxsbywgV29ybGQuPC9jb2RlPiBhcHBlYXIgaW4geW91ciBicm93c2VyIHdpbmRvdy4gSXQncyBub3QgdmVyeQotZXhjaXRpbmcsIGJ1dCBvbmNlIHlvdSBnZXQgdGhhdCB3b3JraW5nLCB5b3UnbGwgaGF2ZSBhIGdvb2QgY2hhbmNlIG9mCi1nZXR0aW5nIGp1c3QgYWJvdXQgYW55dGhpbmcgd29ya2luZy48L3A+Ci0KLTxocj4KLTxoMj48YSBuYW1lPSJidXRpdHNzdGlsbG5vdHdvcmtpbmciPkJ1dCBpdCdzIHN0aWxsIG5vdAotd29ya2luZyE8L2E+PC9oMj4KLQotPHA+VGhlcmUgYXJlIGZvdXIgYmFzaWMgdGhpbmdzIHRoYXQgeW91IG1heSBzZWUgaW4geW91ciBicm93c2VyIHdoZW4KLXlvdSB0cnkgdG8gYWNjZXNzIHlvdXIgQ0dJIHByb2dyYW0gZnJvbSB0aGUgd2ViOjwvcD4KLQotPGRsPgotPGR0PlRoZSBvdXRwdXQgb2YgeW91ciBDR0kgcHJvZ3JhbTwvZHQ+Ci08ZGQ+R3JlYXQhICBUaGF0IG1lYW5zIGV2ZXJ5dGhpbmcgd29ya2VkIGZpbmUuPGJyPjxicj48L2RkPgotCi08ZHQ+VGhlIHNvdXJjZSBjb2RlIG9mIHlvdXIgQ0dJIHByb2dyYW0gb3IgYSAiUE9TVCBNZXRob2QgTm90IEFsbG93ZWQiCi1tZXNzYWdlPC9kdD4gCi08ZGQ+VGhhdCBtZWFucyB0aGF0IHlvdSBoYXZlIG5vdCBwcm9wZXJseSBjb25maWd1cmVkCi1BcGFjaGUgdG8gcHJvY2VzcyB5b3VyIENHSSBwcm9ncmFtLiAgUmVyZWFkIHRoZSBzZWN0aW9uIG9uIDxhCi1ocmVmPSIjY29uZmlndXJpbmdhcGFjaGV0b3Blcm1pdGNnaSI+Y29uZmlndXJpbmcgQXBhY2hlPC9hPiBhbmQgdHJ5IHRvCi1maW5kIHdoYXQgeW91IG1pc3NlZC48YnI+PGJyPjwvZGQ+Ci0KLTxkdD5BIG1lc3NhZ2Ugc3RhcnRpbmcgd2l0aCAiRm9yYmlkZGVuIjwvZHQ+IDxkZD5UaGF0IG1lYW5zIHRoYXQgdGhlcmUKLWlzIGEgcGVybWlzc2lvbnMgcHJvYmxlbS4gIENoZWNrIHRoZSA8YSBocmVmPSIjZXJyb3Jsb2dzIj5BcGFjaGUKLWVycm9yIGxvZzwvYT4gYW5kIHRoZSBzZWN0aW9uIGJlbG93IG9uIDxhCi1ocmVmPSIjZmlsZXBlcm1pc3Npb25zIj5maWxlIHBlcm1pc3Npb25zPC9hPi48YnI+PGJyPjwvZGQ+Ci0KLTxkdD5BIG1lc3NhZ2Ugc2F5aW5nICJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiPC9kdD4gPGRkPklmIHlvdSBjaGVjayB0aGUKLTxhIGhyZWY9IiNlcnJvcmxvZ3MiPkFwYWNoZSBlcnJvciBsb2c8L2E+LCB5b3Ugd2lsbCBwcm9iYWJseSBmaW5kCi10aGF0IGl0IHNheXMgIlByZW1hdHVyZSBlbmQgb2Ygc2NyaXB0IGhlYWRlcnMiLCBwb3NzaWJseSBhbG9uZyB3aXRoIGFuCi1lcnJvciBtZXNzYWdlIGdlbmVyYXRlZCBieSB5b3VyIENHSSBwcm9ncmFtLiAgSW4gdGhpcyBjYXNlLCB5b3Ugd2lsbAotd2FudCB0byBjaGVjayBlYWNoIG9mIHRoZSBiZWxvdyBzZWN0aW9ucyB0byBzZWUgd2hhdCBtaWdodCBiZSBwcmV2ZW50aW5nCi15b3VyIENHSSBwcm9ncmFtIGZyb20gZW1pdHRpbmcgdGhlIHByb3BlciBIVFRQIGhlYWRlcnMuPC9kZD4KLTwvZGw+Ci0KLQotPGgzPjxhIG5hbWU9ImZpbGVwZXJtaXNzaW9ucyI+RmlsZSBwZXJtaXNzaW9uczwvYT48L2gzPgotCi08cD5SZW1lbWJlciB0aGF0IHRoZSBzZXJ2ZXIgZG9lcyBub3QgcnVuIGFzIHlvdS4gVGhhdCBpcywgd2hlbiB0aGUKLXNlcnZlciBzdGFydHMgdXAsIGl0IGlzIHJ1bm5pbmcgd2l0aCB0aGUgcGVybWlzc2lvbnMgb2YgYW4gdW5wcml2aWxlZ2VkCi11c2VyIC0gdXN1YWxseSBgYG5vYm9keScnLCBvciBgYHd3dycnIC0gYW5kIHNvIGl0IHdpbGwgbmVlZCBleHRyYQotcGVybWlzc2lvbnMgdG8gZXhlY3V0ZSBmaWxlcyB0aGF0IGFyZSBvd25lZCBieSB5b3UuIFVzdWFsbHksIHRoZSB3YXkgdG8KLWdpdmUgYSBmaWxlIHN1ZmZpY2llbnQgcGVybWlzc2lvbnMgdG8gYmUgZXhlY3V0ZWQgYnkgYGBub2JvZHknJyBpcyB0bwotZ2l2ZSBldmVyeW9uZSBleGVjdXRlIHBlcm1pc3Npb24gb24gdGhlIGZpbGU6PC9wPgotCi08cHJlPgotICAgICAgICBjaG1vZCBhK3ggZmlyc3QucGwKLTwvcHJlPgotCi08cD5BbHNvLCBpZiB5b3VyIHByb2dyYW0gcmVhZHMgZnJvbSwgb3Igd3JpdGVzIHRvLCBhbnkgb3RoZXIgZmlsZXMsCi10aG9zZSBmaWxlcyB3aWxsIG5lZWQgdG8gaGF2ZSB0aGUgY29ycmVjdCBwZXJtaXNzaW9ucyB0byBwZXJtaXQKLXRoaXMuPC9wPgotCi08cD5UaGUgZXhjZXB0aW9uIHRvIHRoaXMgaXMgd2hlbiB0aGUgc2VydmVyIGlzIGNvbmZpZ3VyZWQgdG8gdXNlIDxhCi1ocmVmPSIuLi9zdWV4ZWMuaHRtbCI+c3VleGVjPC9hPi4gIFRoaXMgcHJvZ3JhbSBhbGxvd3MgQ0dJIHByb2dyYW1zIHRvCi1iZSBydW4gdW5kZXIgZGlmZmVyZW50IHVzZXIgcGVybWlzc2lvbnMsIGRlcGVuZGluZyBvbiB3aGljaCB2aXJ0dWFsCi1ob3N0IG9yIHVzZXIgaG9tZSBkaXJlY3RvcnkgdGhleSBhcmUgbG9jYXRlZCBpbi4gIFN1ZXhlYyBoYXMgdmVyeQotc3RyaWN0IHBlcm1pc3Npb24gY2hlY2tpbmcsIGFuZCBhbnkgZmFpbHVyZSBpbiB0aGF0IGNoZWNraW5nIHdpbGwKLXJlc3VsdCBpbiB5b3VyIENHSSBwcm9ncmFtcyBmYWlsaW5nIHdpdGggYW4gIkludGVybmFsIFNlcnZlciBFcnJvciIuCi1JbiB0aGlzIGNhc2UsIHlvdSB3aWxsIG5lZWQgdG8gY2hlY2sgdGhlIHN1ZXhlYyBsb2cgZmlsZSB0byBzZWUgd2hhdAotc3BlY2lmaWMgc2VjdXJpdHkgY2hlY2sgaXMgZmFpbGluZy48L3A+Ci0KLTxoMz48YSBuYW1lPSJwYXRoaW5mb3JtYXRpb24iPlBhdGggaW5mb3JtYXRpb248L2E+PC9oMz4KLQotPHA+V2hlbiB5b3UgcnVuIGEgcHJvZ3JhbSBmcm9tIHlvdXIgY29tbWFuZCBsaW5lLCB5b3UgaGF2ZSBjZXJ0YWluCi1pbmZvcm1hdGlvbiB0aGF0IGlzIHBhc3NlZCB0byB0aGUgc2hlbGwgd2l0aG91dCB5b3UgdGhpbmtpbmcgYWJvdXQgaXQuCi1Gb3IgZXhhbXBsZSwgeW91IGhhdmUgYSBwYXRoLCB3aGljaCB0ZWxscyB0aGUgc2hlbGwgd2hlcmUgaXQgY2FuIGxvb2sKLWZvciBmaWxlcyB0aGF0IHlvdSByZWZlcmVuY2UuPC9wPgotCi08cD5XaGVuIGEgcHJvZ3JhbSBydW5zIHRocm91Z2ggdGhlIHdlYiBzZXJ2ZXIgYXMgYSBDR0kgcHJvZ3JhbSwgaXQgZG9lcwotbm90IGhhdmUgdGhhdCBwYXRoLiBBbnkgcHJvZ3JhbXMgdGhhdCB5b3UgaW52b2tlIGluIHlvdXIgQ0dJIHByb2dyYW0KLShsaWtlICdzZW5kbWFpbCcsIGZvciBleGFtcGxlKSB3aWxsIG5lZWQgdG8gYmUgc3BlY2lmaWVkIGJ5IGEgZnVsbAotcGF0aCwgc28gdGhhdCB0aGUgc2hlbGwgY2FuIGZpbmQgdGhlbSB3aGVuIGl0IGF0dGVtcHRzIHRvIGV4ZWN1dGUgeW91cgotQ0dJIHByb2dyYW0uPC9wPgotCi08cD5BIGNvbW1vbiBtYW5pZmVzdGF0aW9uIG9mIHRoaXMgaXMgdGhlIHBhdGggdG8gdGhlIHNjcmlwdCBpbnRlcnByZXRlcgotKG9mdGVuIDxjb2RlPnBlcmw8L2NvZGU+KSBpbmRpY2F0ZWQgaW4gdGhlIGZpcnN0IGxpbmUgb2YgeW91ciBDR0kKLXByb2dyYW0sIHdoaWNoIHdpbGwgbG9vayBzb21ldGhpbmcgbGlrZTo8L3A+Ci0KLTxwcmU+Ci0gICAgICMhL3Vzci9iaW4vcGVybAotPC9wcmU+Ci0KLTxwPk1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgaW4gZmFjdCB0aGUgcGF0aCB0byB0aGUgaW50ZXJwcmV0ZXIuPC9wPgotCi08aDM+PGEgbmFtZT0ic3ludGF4ZXJyb3JzIj5TeW50YXggZXJyb3JzPC9hPjwvaDM+Ci0KLTxwPk1vc3Qgb2YgdGhlIHRpbWUgd2hlbiBhIENHSSBwcm9ncmFtIGZhaWxzLCBpdCdzIGJlY2F1c2Ugb2YgYSBwcm9ibGVtCi13aXRoIHRoZSBwcm9ncmFtIGl0c2VsZi4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdHJ1ZSBvbmNlIHlvdSBnZXQgdGhlCi1oYW5nIG9mIHRoaXMgQ0dJIHN0dWZmLCBhbmQgbm8gbG9uZ2VyIG1ha2UgdGhlIGFib3ZlIHR3byBtaXN0YWtlcy4KLUFsd2F5cyBhdHRlbXB0IHRvIHJ1biB5b3VyIHByb2dyYW0gZnJvbSB0aGUgY29tbWFuZCBsaW5lIGJlZm9yZSB5b3UKLXRlc3QgaWYgdmlhIGEgYnJvd3Nlci4gVGhpcyB3aWxsIGVsaW1pbmF0ZSBtb3N0IG9mIHlvdXIgcHJvYmxlbXMuPC9wPgotCi08aDM+PGEgbmFtZT0iZXJyb3Jsb2dzIj5FcnJvciBsb2dzPC9hPjwvaDM+Ci0KLTxwPlRoZSBlcnJvciBsb2dzIGFyZSB5b3VyIGZyaWVuZC4gQW55dGhpbmcgdGhhdCBnb2VzIHdyb25nIGdlbmVyYXRlcwotbWVzc2FnZSBpbiB0aGUgZXJyb3IgbG9nLiBZb3Ugc2hvdWxkIGFsd2F5cyBsb29rIHRoZXJlIGZpcnN0LiBJZiB0aGUKLXBsYWNlIHdoZXJlIHlvdSBhcmUgaG9zdGluZyB5b3VyIHdlYiBzaXRlIGRvZXMgbm90IHBlcm1pdCB5b3UgYWNjZXNzIHRvCi10aGUgZXJyb3IgbG9nLCB5b3Ugc2hvdWxkIHByb2JhYmx5IGhvc3QgeW91ciBzaXRlIHNvbWV3aGVyZSBlbHNlLiBMZWFybgotdG8gcmVhZCB0aGUgZXJyb3IgbG9ncywgYW5kIHlvdSdsbCBmaW5kIHRoYXQgYWxtb3N0IGFsbCBvZiB5b3VyCi1wcm9ibGVtcyBhcmUgcXVpY2tseSBpZGVudGlmaWVkLCBhbmQgcXVpY2tseSBzb2x2ZWQuPC9wPgotCi08aHI+Ci08aDI+PGEgbmFtZT0id2hhdHNnb2luZ29uYmVoaW5kdGhlc2NlbmVzIj5XaGF0J3MgZ29pbmcgb24gYmVoaW5kCi10aGUgc2NlbmVzPzwvYT48L2gyPgotCi08cD5BcyB5b3UgYmVjb21lIG1vcmUgYWR2YW5jZWQgaW4gQ0dJIHByb2dyYW1taW5nLCBpdCB3aWxsIGJlY29tZQotdXNlZnVsIHRvIHVuZGVyc3RhbmQgbW9yZSBhYm91dCB3aGF0J3MgaGFwcGVuaW5nIGJlaGluZCB0aGUgc2NlbmVzLgotU3BlY2lmaWNhbGx5LCBob3cgdGhlIGJyb3dzZXIgYW5kIHNlcnZlciBjb21tdW5pY2F0ZSB3aXRoIG9uZSBhbm90aGVyLgotQmVjYXVzZSBhbHRob3VnaCBpdCdzIGFsbCB2ZXJ5IHdlbGwgdG8gd3JpdGUgYSBwcm9ncmFtIHRoYXQgcHJpbnRzCi1gYEhlbGxvLCBXb3JsZC4nJywgaXQncyBub3QgcGFydGljdWxhcmx5IHVzZWZ1bC48L3A+Ci0KLTxoMz48YSBuYW1lPSJlbnZpcm9ubWVudHZhcmlhYmxlcyI+RW52aXJvbm1lbnQgdmFyaWFibGVzPC9hPjwvaDM+Ci0KLTxwPkVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgdmFsdWVzIHRoYXQgZmxvYXQgYXJvdW5kIHlvdSBhcyB5b3UgdXNlCi15b3VyIGNvbXB1dGVyLiBUaGV5IGFyZSB1c2VmdWwgdGhpbmdzIGxpa2UgeW91ciBwYXRoICh3aGVyZSB0aGUKLWNvbXB1dGVyIHNlYXJjaGVzIGZvciBhIHRoZSBhY3R1YWwgZmlsZSBpbXBsZW1lbnRpbmcgYSBjb21tYW5kIHdoZW4geW91Ci10eXBlIGl0KSwgeW91ciB1c2VybmFtZSwgeW91ciB0ZXJtaW5hbCB0eXBlLCBhbmQgc28gb24uIEZvciBhIGZ1bGwgbGlzdAotb2YgeW91ciBub3JtYWwsIGV2ZXJ5IGRheSBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIHR5cGUgPGNvZGU+ZW52PC9jb2RlPgotYXQgYSBjb21tYW5kIHByb21wdC48L3A+Ci0KLTxwPkR1cmluZyB0aGUgQ0dJIHRyYW5zYWN0aW9uLCB0aGUgc2VydmVyIGFuZCB0aGUgYnJvd3NlciBhbHNvIHNldAotZW52aXJvbm1lbnQgdmFyaWFibGVzLCBzbyB0aGF0IHRoZXkgY2FuIGNvbW11bmljYXRlIHdpdGggb25lIGFub3RoZXIuCi1UaGVzZSBhcmUgdGhpbmdzIGxpa2UgdGhlIGJyb3dzZXIgdHlwZSAoTmV0c2NhcGUsIElFLCBMeW54KSwgdGhlIHNlcnZlcgotdHlwZSAoQXBhY2hlLCBJSVMsIFdlYlNpdGUpLCB0aGUgbmFtZSBvZiB0aGUgQ0dJIHByb2dyYW0gdGhhdCBpcyBiZWluZwotcnVuLCBhbmQgc28gb24uPC9wPgotCi08cD5UaGVzZSB2YXJpYWJsZXMgYXJlIGF2YWlsYWJsZSB0byB0aGUgQ0dJIHByb2dyYW1tZXIsIGFuZCBhcmUgaGFsZiBvZgotdGhlIHN0b3J5IG9mIHRoZSBjbGllbnQtc2VydmVyIGNvbW11bmljYXRpb24uIFRoZSBjb21wbGV0ZSBsaXN0IG9mCi1yZXF1aXJlZCB2YXJpYWJsZXMgaXMgYXQgPGEgaHJlZj0KLSJodHRwOi8vaG9vaG9vLm5jc2EudWl1Yy5lZHUvY2dpL2Vudi5odG1sIj5odHRwOi8vaG9vaG9vLm5jc2EudWl1Yy5lZHUvY2dpL2Vudi5odG1sPC9hPjwvcD4KLQotPHA+VGhpcyBzaW1wbGUgUGVybCBDR0kgcHJvZ3JhbSB3aWxsIGRpc3BsYXkgYWxsIG9mIHRoZSBlbnZpcm9ubWVudAotdmFyaWFibGVzIHRoYXQgYXJlIGJlaW5nIHBhc3NlZCBhcm91bmQuICBUd28gc2ltaWxhciBwcm9ncmFtcyBhcmUKLWluY2x1ZGVkIGluIHRoZSA8Y29kZT5jZ2ktYmluPC9jb2RlPiBkaXJlY3Rvcnkgb2YgdGhlIEFwYWNoZQotZGlzdHJpYnV0aW9uLiBOb3RlIHRoYXQgc29tZSB2YXJpYWJsZXMgYXJlIHJlcXVpcmVkLCB3aGlsZSBvdGhlcnMgYXJlCi1vcHRpb25hbCwgc28geW91IG1heSBzZWUgc29tZSB2YXJpYWJsZXMgbGlzdGVkIHRoYXQgd2VyZSBub3QgaW4gdGhlCi1vZmZpY2lhbCBsaXN0LiAgSW4gYWRkaXRpb24sIEFwYWNoZSBwcm92aWRlcyBtYW55IGRpZmZlcmVudCB3YXlzIGZvcgoteW91IHRvIDxhIGhyZWY9Ii4uL2Vudi5odG1sIj5hZGQgeW91ciBvd24gZW52aXJvbm1lbnQgdmFyaWFibGVzPC9hPiB0bwotdGhlIGJhc2ljIG9uZXMgcHJvdmlkZWQgYnkgZGVmYXVsdC48L3A+Ci0KLTxwcmU+Ci0gICAgICMhL3Vzci9iaW4vcGVybAotICAgICBwcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcblxuIjsKLSAgICAgZm9yZWFjaCAka2V5IChrZXlzICVFTlYpIHsKLSAgICAgICAgICBwcmludCAiJGtleSAtLSZndDsgJEVOVnska2V5fSZsdDticiZndDsiOwotICAgICB9Ci08L3ByZT4KLQotPGgzPjxhIG5hbWU9InN0ZGluYW5kc3Rkb3V0Ij5TVERJTiBhbmQgU1RET1VUPC9hPjwvaDM+Ci0KLTxwPk90aGVyIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgc2VydmVyIGFuZCB0aGUgY2xpZW50IGhhcHBlbnMgb3Zlcgotc3RhbmRhcmQgaW5wdXQgKDxjb2RlPlNURElOPC9jb2RlPikgYW5kIHN0YW5kYXJkIG91dHB1dAotKDxjb2RlPlNURE9VVDwvY29kZT4pLiBJbiBub3JtYWwgZXZlcnlkYXkgY29udGV4dCwgPGNvZGU+U1RESU48L2NvZGU+Ci1tZWFucyB0aGUga2V5Ym9hcmQsIG9yIGEgZmlsZSB0aGF0IGEgcHJvZ3JhbSBpcyBnaXZlbiB0byBhY3Qgb24sIGFuZAotPGNvZGU+U1RET1VUPC9jb2RlPiB1c3VhbGx5IG1lYW5zIHRoZSBjb25zb2xlIG9yIHNjcmVlbi48L3A+Ci0KLTxwPldoZW4geW91IDxjb2RlPlBPU1Q8L2NvZGU+IGEgd2ViIGZvcm0gdG8gYSBDR0kgcHJvZ3JhbSwgdGhlIGRhdGEgaW4KLXRoYXQgZm9ybSBpcyBidW5kbGVkIHVwIGludG8gYSBzcGVjaWFsIGZvcm1hdCBhbmQgZ2V0cyBkZWxpdmVyZWQgdG8KLXlvdXIgQ0dJIHByb2dyYW0gb3ZlciA8Y29kZT5TVERJTjwvY29kZT4uIFRoZSBwcm9ncmFtIHRoZW4gY2FuIHByb2Nlc3MKLXRoYXQgZGF0YSBhcyB0aG91Z2ggaXQgd2FzIGNvbWluZyBpbiBmcm9tIHRoZSBrZXlib2FyZCwgb3IgZnJvbSBhCi1maWxlPC9wPgotCi08cD5UaGUgYGBzcGVjaWFsIGZvcm1hdCcnIGlzIHZlcnkgc2ltcGxlLiBBIGZpZWxkIG5hbWUgYW5kIGl0cyB2YWx1ZQotYXJlIGpvaW5lZCB0b2dldGhlciB3aXRoIGFuIGVxdWFscyAoPSkgc2lnbiwgYW5kIHBhaXJzIG9mIHZhbHVlcyBhcmUKLWpvaW5lZCB0b2dldGhlciB3aXRoIGFuIGFtcGVyc2FuZCAoJmFtcDspLiBJbmNvbnZlbmllbnQgY2hhcmFjdGVycyBsaWtlCi1zcGFjZXMsIGFtcGVyc2FuZHMsIGFuZCBlcXVhbHMgc2lnbnMsIGFyZSBjb252ZXJ0ZWQgaW50byB0aGVpciBoZXgKLWVxdWl2YWxlbnQgc28gdGhhdCB0aGV5IGRvbid0IGd1bSB1cCB0aGUgd29ya3MuIFRoZSB3aG9sZSBkYXRhIHN0cmluZwotbWlnaHQgbG9vayBzb21ldGhpbmcgbGlrZTo8L3A+Ci0KLTxwcmU+Ci0gICAgIG5hbWU9UmljaCUyMEJvd2VuJmFtcDtjaXR5PUxleGluZ3RvbiZhbXA7c3RhdGU9S1kmYW1wO3NpZGVraWNrPVNxdWlycmVsJTIwTW9ua2V5Ci08L3ByZT4KLQotPHA+WW91J2xsIHNvbWV0aW1lcyBhbHNvIHNlZSB0aGlzIHR5cGUgb2Ygc3RyaW5nIGFwcGVuZGVkIHRvIHRoZSBhIFVSTC4KLVdoZW4gdGhhdCBpcyBkb25lLCB0aGUgc2VydmVyIHB1dHMgdGhhdCBzdHJpbmcgaW50byB0aGUgZW52aXJvbm1lbnQKLXZhcmlhYmxlIGNhbGxlZCA8Y29kZT5RVUVSWV9TVFJJTkc8L2NvZGU+LiBUaGF0J3MgY2FsbGVkIGEKLTxjb2RlPkdFVDwvY29kZT4gcmVxdWVzdC4gWW91ciBIVE1MIGZvcm0gc3BlY2lmaWVzIHdoZXRoZXIgYQotPGNvZGU+R0VUPC9jb2RlPiBvciBhIDxjb2RlPlBPU1Q8L2NvZGU+IGlzIHVzZWQgdG8gZGVsaXZlciB0aGUgZGF0YSwgYnkKLXNldHRpbmcgdGhlIDxjb2RlPk1FVEhPRDwvY29kZT4gYXR0cmlidXRlIGluIHRoZSA8Y29kZT5GT1JNPC9jb2RlPgotdGFnLjwvcD4KLQotPHA+WW91ciBwcm9ncmFtIGlzIHRoZW4gcmVzcG9uc2libGUgZm9yIHNwbGl0dGluZyB0aGF0IHN0cmluZyB1cCBpbnRvCi11c2VmdWwgaW5mb3JtYXRpb24uIEZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgbGlicmFyaWVzIGFuZCBtb2R1bGVzCi1hdmFpbGFibGUgdG8gaGVscCB5b3UgcHJvY2VzcyB0aGlzIGRhdGEsIGFzIHdlbGwgYXMgaGFuZGxlIG90aGVyIG9mIHRoZQotYXNwZWN0cyBvZiB5b3VyIENHSSBwcm9ncmFtLjwvcD4KLQotPGhyPgotPGgyPjxhIG5hbWU9ImNnaW1vZHVsZXNsaWJyYXJpZXMiPkNHSSBtb2R1bGVzL2xpYnJhcmllczwvYT48L2gyPgotCi08cD5XaGVuIHlvdSB3cml0ZSBDR0kgcHJvZ3JhbXMsIHlvdSBzaG91bGQgY29uc2lkZXIgdXNpbmcgYSBjb2RlCi1saWJyYXJ5LCBvciBtb2R1bGUsIHRvIGRvIG1vc3Qgb2YgdGhlIGdydW50IHdvcmsgZm9yIHlvdS4gVGhpcyBsZWFkcyB0bwotZmV3ZXIgZXJyb3JzLCBhbmQgZmFzdGVyIGRldmVsb3BtZW50LjwvcD4KLQotPHA+SWYgeW91J3JlIHdyaXRpbmcgQ0dJIHByb2dyYW1zIGluIFBlcmwsIG1vZHVsZXMgYXJlIGF2YWlsYWJsZSBvbiA8YQotaHJlZj0iaHR0cDovL3d3dy5jcGFuLm9yZy8iPkNQQU48L2E+LiBUaGUgbW9zdCBwb3B1bGFyIG1vZHVsZSBmb3IgdGhpcwotcHVycG9zZSBpcyBDR0kucG0uIFlvdSBtaWdodCBhbHNvIGNvbnNpZGVyIENHSTo6TGl0ZSwgd2hpY2ggaW1wbGVtZW50cwotYSBtaW5pbWFsIHNldCBvZiBmdW5jdGlvbmFsaXR5LCB3aGljaCBpcyBhbGwgeW91IG5lZWQgaW4gbW9zdAotcHJvZ3JhbXMuPC9wPgotCi08cD5JZiB5b3UncmUgd3JpdGluZyBDR0kgcHJvZ3JhbXMgaW4gQywgdGhlcmUgYXJlIGEgdmFyaWV0eSBvZiBvcHRpb25zLgotT25lIG9mIHRoZXNlIGlzIHRoZSBDR0lDIGxpYnJhcnksIGZyb20gPGEgaHJlZj0KLSJodHRwOi8vd3d3LmJvdXRlbGwuY29tL2NnaWMvIj5odHRwOi8vd3d3LmJvdXRlbGwuY29tL2NnaWMvPC9hPjwvcD4KLQotPGhyPgotPGgyPjxhIG5hbWU9ImZvcm1vcmVpbmZvcm1hdGlvbiI+Rm9yIG1vcmUgaW5mb3JtYXRpb248L2E+PC9oMj4KLQotPHA+VGhlcmUgYXJlIGEgbGFyZ2UgbnVtYmVyIG9mIENHSSByZXNvdXJjZXMgb24gdGhlIHdlYi4gWW91IGNhbgotZGlzY3VzcyBDR0kgcHJvYmxlbXMgd2l0aCBvdGhlciB1c2VycyBvbiB0aGUgVXNlbmV0IGdyb3VwCi1jb21wLmluZm9zeXN0ZW1zLnd3dy5hdXRob3JpbmcuY2dpLiBBbmQgdGhlIC1zZXJ2ZXJzIG1haWxpbmcgbGlzdCBmcm9tCi10aGUgSFRNTCBXcml0ZXJzIEd1aWxkIGlzIGEgZ3JlYXQgc291cmNlIG9mIGFuc3dlcnMgdG8geW91ciBxdWVzdGlvbnMuCi1Zb3UgY2FuIGZpbmQgb3V0IG1vcmUgYXQgPGEgaHJlZj0KLSJodHRwOi8vd3d3Lmh3Zy5vcmcvbGlzdHMvaHdnLXNlcnZlcnMvIj5odHRwOi8vd3d3Lmh3Zy5vcmcvbGlzdHMvaHdnLXNlcnZlcnMvPC9hPjwvcD4KLQotPHA+QW5kLCBvZiBjb3Vyc2UsIHlvdSBzaG91bGQgcHJvYmFibHkgcmVhZCB0aGUgQ0dJIHNwZWNpZmljYXRpb24sCi13aGljaCBoYXMgYWxsIHRoZSBkZXRhaWxzIG9uIHRoZSBvcGVyYXRpb24gb2YgQ0dJIHByb2dyYW1zLiAgWW91IGNhbgotZmluZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBhdCB0aGUgPGEgaHJlZj0KLSJodHRwOi8vaG9vaG9vLm5jc2EudWl1Yy5lZHUvY2dpL2ludGVyZmFjZS5odG1sIj5OQ1NBPC9hPiBhbmQgdGhlcmUgaXMKLWFuIHVwZGF0ZWQgZHJhZnQgYXQgdGhlIDxhCi1ocmVmPSJodHRwOi8vd2ViLmdvbHV4LmNvbS9jb2FyL2NnaS8iPkNvbW1vbiBHYXRld2F5IEludGVyZmFjZSBSRkMKLXByb2plY3Q8L2E+LjwvcD4KLQotPHA+V2hlbiB5b3UgcG9zdCBhIHF1ZXN0aW9uIGFib3V0IGEgQ0dJIHByb2JsZW0gdGhhdCB5b3UncmUgaGF2aW5nLAotd2hldGhlciB0byBhIG1haWxpbmcgbGlzdCwgb3IgdG8gYSBuZXdzZ3JvdXAsIG1ha2Ugc3VyZSB5b3UgcHJvdmlkZQotZW5vdWdoIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgaGFwcGVuZWQsIHdoYXQgeW91IGV4cGVjdGVkIHRvIGhhcHBlbiwKLWFuZCBob3cgd2hhdCBhY3R1YWxseSBoYXBwZW5lZCB3YXMgZGlmZmVyZW50LCB3aGF0IHNlcnZlciB5b3UncmUKLXJ1bm5pbmcsIHdoYXQgbGFuZ3VhZ2UgeW91ciBDR0kgcHJvZ3JhbSB3YXMgaW4sIGFuZCwgaWYgcG9zc2libGUsIHRoZQotb2ZmZW5kaW5nIGNvZGUuIFRoaXMgd2lsbCBtYWtlIGZpbmRpbmcgeW91ciBwcm9ibGVtIG11Y2ggc2ltcGxlci48L3A+Ci0KLTxwPk5vdGUgdGhhdCBxdWVzdGlvbnMgYWJvdXQgQ0dJIHByb2JsZW1zIHNob3VsZCA8c3Ryb25nPm5ldmVyPC9zdHJvbmc+Ci1iZSBwb3N0ZWQgdG8gdGhlIEFwYWNoZSBidWcgZGF0YWJhc2UgdW5sZXNzIHlvdSBhcmUgc3VyZSB5b3UgaGF2ZSBmb3VuZAotYSBwcm9ibGVtIGluIHRoZSBBcGFjaGUgc291cmNlIGNvZGUuPC9wPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotCi08L2JvZHk+Ci08L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2hvd3RvL2NnaS5odG1sLmphLmppcyBiL2RvY3MvbWFudWFsL2hvd3RvL2NnaS5odG1sLmphLmppcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZiZjU4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9ob3d0by9jZ2kuaHRtbC5qYS5qaXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OTUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BcGFjaGUgVHV0b3JpYWw6IENHSSAbJEIkSyRoJGtGMEUqJTMlcyVGJXMlRBsoQjwvdGl0bGU+Ci08L2hlYWQ+Ci08IS0tIEVuZ2xpc2ggcmV2aXNpb246IDEuNiAtLT4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxib2R5IGJnY29sb3I9IiNGRkZGRkYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjMDAwMDgwIgotYWxpbms9IiNGRjAwMDAiPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxoMSBhbGlnbj0iQ0VOVEVSIj5DR0kgGyRCJEskaCRrRjBFKiUzJXMlRiVzJUQbKEI8L2gxPgotCi08YSBuYW1lPSJfX2luZGV4X18iPjwvYT4gPCEtLSBJTkRFWCBCRUdJTiAtLT4KLSAKLQotPHVsPgotPGxpPjxhIGhyZWY9IiNkeW5hbWljY29udGVudHdpdGhjZ2kiPkNHSSAbJEIkSyRoJGtGMEUqJTMlcyVGJXMlRBsoQjwvYT48L2xpPgotCi08bGk+PGEgaHJlZj0iI2NvbmZpZ3VyaW5nYXBhY2hldG9wZXJtaXRjZ2kiPkNHSSAbJEIkcjV2MkQkOSRrJGgkJiRLGyhCIEFwYWNoZSAbJEIkchsoQgotGyRCQF9EaiQ5JGsbKEI8L2E+Ci0KLTx1bD4KLTxsaT48YSBocmVmPSIjc2NyaXB0YWxpYXMiPlNjcmlwdEFsaWFzPC9hPjwvbGk+Ci0KLTxsaT48YSBocmVmPSIjY2dpb3V0c2lkZW9mc2NyaXB0YWxpYXNkaXJlY3RvcmllcyI+U2NyaXB0QWxpYXMgGyRCJUclIyVsJS8lSCVqMzAkThsoQgotQ0dJPC9hPgotCi08dWw+Ci08bGk+PGEgaHJlZj0iI2V4cGxpY2l0bHl1c2luZ29wdGlvbnN0b3Blcm1pdGNnaWV4ZWN1dGlvbiI+Q0dJIBskQiROPEI5VCRyMkRHPSRLGyhCCi0bJEIkOSRrJD8kYSRLGyhCIE9wdGlvbnMgGyRCJHJMQDwoRSokSztITVEkOSRrGyhCPC9hPjwvbGk+Ci0KLQotPGxpPjxhIGhyZWY9IiNodGFjY2Vzc2ZpbGVzIj4uaHRhY2Nlc3MgGyRCJVUlISUkJWsbKEI8L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci0KLTxsaT48YSBocmVmPSIjd3JpdGluZ2FjZ2lwcm9ncmFtIj5DR0kgGyRCJVclbSUwJWklYCRyPXEkLxsoQjwvYT4KLQotPHVsPgotPGxpPjxhIGhyZWY9IiN5b3VyZmlyc3RjZ2lwcm9ncmFtIj4bJEIkIiRKJD8kTjpHPWkkThsoQiBDR0kgGyRCJVclbSUwJWklYBsoQjwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci0KLTxsaT48YSBocmVmPSIjYnV0aXRzc3RpbGxub3R3b3JraW5nIj4bJEIkNyQrJDchIiReJEBGMCQrJEokJBsoQiAhPC9hPgotCi08dWw+Ci08bGk+PGEgaHJlZj0iI2ZpbGVwZXJtaXNzaW9ucyI+GyRCJVUlISUkJWskTiVRITwlXyVDJTclZyVzGyhCPC9hPjwvbGk+Ci0KLTxsaT48YSBocmVmPSIjcGF0aGluZm9ybWF0aW9uIj4bJEIlUSU5PnBKcxsoQjwvYT48L2xpPgotCi08bGk+PGEgaHJlZj0iI3N5bnRheGVycm9ycyI+GyRCOT1KOCUoJWkhPBsoQjwvYT48L2xpPgotCi08bGk+PGEgaHJlZj0iI2Vycm9ybG9ncyI+GyRCJSglaSE8JW0lMBsoQjwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci0KLTxsaT48YSBocmVmPSIjd2hhdHNnb2luZ29uYmVoaW5kdGhlc2NlbmVzIj4bJEJOIiRHMj8kLDUvJDMkQyRGJCQkayROJCsbKEI/PC9hPgotCi08dWw+Ci08bGk+PGEgaHJlZj0iI2Vudmlyb25tZW50dmFyaWFibGVzIj4bJEI0RDYtSlE/dBsoQjwvYT48L2xpPgotCi08bGk+PGEgaHJlZj0iI3N0ZGluYW5kc3Rkb3V0Ij4bJEJJOD1gRn49UE5PGyhCPC9hPjwvbGk+Ci08L3VsPgotPC9saT4KLQotPGxpPjxhIGhyZWY9IiNjZ2ltb2R1bGVzbGlicmFyaWVzIj5DR0kgGyRCJWIlOCVlITwlaxsoQi8bJEIlaSUkJVYlaSVqGyhCPC9hPjwvbGk+Ci0KLTxsaT48YSBocmVmPSIjZm9ybW9yZWluZm9ybWF0aW9uIj4bJEI5OSRKJGs+cEpzGyhCPC9hPjwvbGk+Ci08L3VsPgotCi08IS0tIElOREVYIEVORCAtLT4KLTxocj4KLTxoMj48YSBuYW1lPSJkeW5hbWljY29udGVudHdpdGhjZ2kiPkNHSSAbJEIkSyRoJGtGMEUqJTMlcyVGJXMlRBsoQjwvYT48L2gyPgotCi08dGFibGUgYm9yZGVyPSIxIj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiPgotPHN0cm9uZz4bJEI0WE8iJWIlOCVlITwlaxsoQjwvc3Ryb25nPjxicj48YnI+Ci0KLTxhIGhyZWY9Ii4uL21vZC9tb2RfYWxpYXMuaHRtbCI+bW9kX2FsaWFzPC9hPjxicj4KLTxhIGhyZWY9Ii4uL21vZC9tb2RfY2dpLmh0bWwiPm1vZF9jZ2k8L2E+PGJyPgotCi08L3RkPjx0ZCB2YWxpZ249InRvcCI+Ci08c3Ryb25nPhskQjRYTyIlRyUjJWwlLyVGJSMlVhsoQjwvc3Ryb25nPjxicj48YnI+Ci0KLTxhIGhyZWY9Ii4uL21vZC9tb2RfbWltZS5odG1sI2FkZGhhbmRsZXIiPkFkZEhhbmRsZXI8L2E+PGJyPgotPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNvcHRpb25zIj5PcHRpb25zPC9hPjxicj4KLTxhIGhyZWY9Ii4uL21vZC9tb2RfYWxpYXMuaHRtbCNzY3JpcHRhbGlhcyI+U2NyaXB0QWxpYXM8L2E+PGJyPgotCi08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+Q0dJIChDb21tb24gR2F0ZXdheSBJbnRlcmZhY2UpIBskQiRPISIlJiUnJVYlNSE8JVAkLCUzJXMlRiVzJURAOEAuJHIkOSRrGyhCCi0bJEIzMEl0JVclbSUwJWklYCRINihENCQ3JEZGMDpuJDkkayQ/JGEkTkp9SyEkckRqNUEkNyRGJCQkXiQ5ISMkPSROJVclbSUwJWklYCRPJDckUCQ3JFAbKEIKLUNHSSAbJEIlVyVtJTAlaSVgJGQbKEIgQ0dJIBskQiU5JS8laiVXJUgkSDhGJFAkbCReJDkhIxsoQkNHSSAbJEIkTyEiJSYlJyVWJTUlJCVIJEsbKEIKLRskQkYwRSokSiUzJXMlRiVzJUQkckNWJC8kPyRhJE46RyRiNEpDMSRHMGxITEUqJEpKfUshJEckOSEjJDMkTiVJJS0lZSVhJXMlSCRPISIbKEIKLUFwYWNoZSAbJEIlJiUnJVYlNSE8JVAkRxsoQiBDR0kgGyRCJHJAX0RqJDchIhsoQkNHSSAbJEIlVyVtJTAlaSVgJHI9cSQtO08kYSRrJD8kYSROGyhCCi0bJEJGfkxnPXEkSCRKJGskRyQ3JGckJiEjGyhCPC9wPgotCi08aHI+Ci08aDI+PGEgbmFtZT0iY29uZmlndXJpbmdhcGFjaGV0b3Blcm1pdGNnaSI+Q0dJIBskQiRyNXYyRCQ5JGskaCQmJEsbKEIgQXBhY2hlIBskQiRyGyhCCi0bJEJAX0RqJDkkaxsoQjwvYT48L2gyPgotCi08cD5DR0kgGyRCJVclbSUwJWklYCRyQDUkNyQvRjA6biQ1JDskayRLJE8hIhsoQkNHSSAbJEIkcjV2MkQkOSRrJGgkJiRLGyhCCi1BcGFjaGUgGyRCJE5AX0RqJHI5VCQmSSxNVyQsJCIkaiReJDkhIyQzJGwkcjlUJEokJiQ/JGEkTkp9SyEkLCQkJC8kRCQrGyhCCi0bJEIkIiRqJF4kOSEjGyhCPC9wPgotCi08aDM+PGEgbmFtZT0ic2NyaXB0YWxpYXMiPlNjcmlwdEFsaWFzPC9hPjwvaDM+Ci0KLTxwPjxjb2RlPlNjcmlwdEFsaWFzPC9jb2RlPiAbJEIlRyUjJWwlLyVGJSMlViRyO0hNUSQ3JEYhIhsoQkNHSSAbJEIlVyVtJTAlaSVgTVEkThsoQgotGyRCRkNKTCRKSkwlRyUjJWwlLyVIJWokchsoQiBBcGFjaGUgGyRCJEtAX0RqJDckXiQ5ISMbKEIKLUFwYWNoZSAbJEIkTyEiJDMkTiVHJSMlbCUvJUglakNmJE5BNCRGJE4lVSUhJSQlayRyGyhCIENHSSAbJEIlVyVtJTAlaSVgJEckIiRrJEgbKEIKLRskQjI+RGokNyReJDkhIyQ9JDckRiEiJDMkTkZDSkwkSiVqJT0hPCU5JCwlLyVpJSQlIiVzJUgkKyRpTVc1YSQ1JGwkayRIISIbKEIKLRskQiQ9JE4lVyVtJTAlaSVgJE48QjlUJHI7biRfJF4kOSEjGyhCPC9wPgotCi08cD48Y29kZT5TY3JpcHRBbGlhczwvY29kZT4gGyRCJUclIyVsJS8lRiUjJVYkTzBKMjwkTiRoJCYkSztITVEkNyReJDkbKEI6PC9wPgotCi08cHJlPgotICAgICAgICBTY3JpcHRBbGlhcyAvY2dpLWJpbi8gL3Vzci9sb2NhbC9hcGFjaGUvY2dpLWJpbi8KLTwvcHJlPgotCi08cD4bJEIlRyVVJSklayVIMExDViRLGyhCIEFwYWNoZSAbJEIkciUkJXMlOSVIITwlayQ3JD8kSiRpJFAhIhsoQgotGyRCJDMkTk5jJE8lRyVVJSklayVIPnVCViROGyhCIDxjb2RlPmh0dHBkLmNvbmY8L2NvZGU+IBskQkBfRGolVSUhJSQlaxsoQgotGyRCJEs0XiReJGwkRiQkJF4kOSEjGyhCCi08Y29kZT5TY3JpcHRBbGlhczwvY29kZT4gGyRCJUclIyVsJS8lRiUjJVYkTyEiGyhCVVJMIBskQiROQTAkS0lVMkMkOSRrJUclIyVsJS8lSCVqJHJEajVBJDkkaxsoQiA8Y29kZT5BbGlhczwvY29kZT4gGyRCJUclIyVsJS8lRiUjJVYkSCQrJEokajt3JEYkJCReJDkhIxsoQgotPGNvZGU+QWxpYXM8L2NvZGU+IBskQiRIGyhCIDxjb2RlPlNjcmlwdEFsaWFzPC9jb2RlPiAbJEIkT0RMPm8hIhsoQgotPGNvZGU+RG9jdW1lbnRSb290PC9jb2RlPiAbJEIlRyUjJWwlLyVIJWozMCROJUclIyVsJS8lSCVqJE4kPyRhJEs7SE1RJDUkbCReJDkhIxsoQgotPGNvZGU+QWxpYXM8L2NvZGU+IBskQiRIGyhCIDxjb2RlPlNjcmlwdEFsaWFzPC9jb2RlPiAbJEIkSCROOjkkTyEiGyhCCi08Y29kZT5TY3JpcHRBbGlhczwvY29kZT4gGyRCJCxAXEYsPC0kRztPJF4kayQ5JFkkRiROGyhCIFVSTCAbJEIkTxsoQiBDR0kgGyRCJVclbSUwJWklYCRIGyhCCi0bJEIkXyRKJDUkbCRrJEgkJCQmREkyQyROMFVMIyRyNF4kcyRHJCQkayQzJEgkRyQ5ISM9PiRDJEYhIhsoQgotGyRCPmU1LSROTmMkRyRPISIbKEI8Y29kZT4vY2dpLWJpbi88L2NvZGU+Ci0bJEIkRztPJF4kayVqJT0hPCU5JFgkTiQiJGkkZiRrJWolLyUoJTklSCRLQlAkNyRGISIlRyUjJWwlLyVIJWobKEIKLTxjb2RlPi91c3IvbG9jYWwvYXBhY2hlL2NnaS1iaW4vPC9jb2RlPgotGyRCJCskaURzNiEkNyEiJD0kbCRpJHIbKEIgQ0dJIBskQiVXJW0lMCVpJWAkSCQ3JEYwNyQmJGgkJhsoQiBBcGFjaGUgGyRCJEs8KCQ3JF4kOSEjGyhCPC9wPgotCi08cD4bJEJOYyQoJFAhIhsoQlVSTCA8Y29kZT5odHRwOi8vZGV2LnJjYm93ZW4uY29tL2NnaS1iaW4vdGVzdC5wbDwvY29kZT4KLRskQiQsTVc1YSQ1JGwkPz5sOWchIhsoQkFwYWNoZSAbJEIkTxsoQiAbJEIlVSUhJSQlaxsoQgotPGNvZGU+L3Vzci9sb2NhbC9hcGFjaGUvY2dpLWJpbi90ZXN0LnBsPC9jb2RlPiAbJEIkcjxCOVQkNyEiJD0kTj1QTk8kckpWJDkkMyRIJHIbKEIKLRskQjtuJF8kXiQ5ISMbKEIKLRskQiRiJEEkbSRzISIlVSUhJSQlayQsQjg6XyQ3ISI8QjlUMkRHPSRHJCIkaiEiN2gkYSRpJGwkP0p9SyEkRz1QTk8kckpWJDckXiQ5ISMbKEIKLRskQiQ9JCYkRyRKJDEkbCRQISIbKEJBcGFjaGUgGyRCJE8lKCVpITwlYSVDJTshPCU4JHJKViQ3JF4kOSEjGyhCCi0KLTxoMz48YSBuYW1lPSJjZ2lvdXRzaWRlb2ZzY3JpcHRhbGlhc2RpcmVjdG9yaWVzIj4KLVNjcmlwdEFsaWFzIBskQiVHJSMlbCUvJUglajMwJE4bKEIgQ0dJPC9hPjwvaDM+Ci0KLTxwPkNHSSAbJEIlVyVtJTAlaSVgJE8hIiU7JS0lZSVqJUYlIz5lJE5NfU0zJCskaRsoQgotPGNvZGU+U2NyaXB0QWxpYXM8L2NvZGU+IBskQiQ1JGwkPyVHJSMlbCUvJUglaiRLQCk4QiQ1JGwkayQzJEgkLCQ3JFAkNyRQJCIkaiReJDkhIxsoQgotGyRCJDMkTkp9SyEkSyRoJGohIhsoQkNHSSAbJEIlVyVtJTAlaSVgJHI7SE1RJEckLSRrJWYhPCU2JHI0SU19PFQkLDg3JDckL0ApOGYkOSRrGyhCCi0bJEIkMyRIJCwkRyQtJF4kOSEjGyhCCi0bJEIkNyQrJDckSiQsJGkhIkUsQFokSiU7JS0lZSVqJUYlIzt2QTBCUDp2JCwkSCRpJGwkayRKJGkkUCEiGyhCQ0dJIBskQiVXJW0lMCVpJWAbKEIKLRskQiRyRyQwVSROJUclIyVsJS8lSCVqJEc8QjlUJEckLSRKJCQkaCQmJEskOSRrTX1NMyRPJCIkaiReJDskcyEjGyhCCi0bJEJOYyQoJFAhIiVmITwlNiRLGyhCIDxjb2RlPlVzZXJEaXI8L2NvZGU+IBskQiVHJSMlbCUvJUYlIyVWJEcbKEIKLRskQkhgJGkkTiVbITwlYCVHJSMlbCUvJUglakdbMjwkSyUmJSclViUzJXMlRiVzJUQkcjt9JD8kOyQ/JCQkSCQ3JF4kOSEjGyhCCi0bJEIkYiQ3ISJIYCRpJCwbKEIgQ0dJIBskQiVXJW0lMCVpJWAkcjt9JEQkMyRIJHJLPiRzJEckJCRGJGIhIiVhJSQlcyROGyhCCi08Y29kZT5jZ2ktYmluPC9jb2RlPiAbJEIlRyUjJWwlLyVIJWokWCROJSIlLyU7JTkkLCRHJC0kSiQkPmw5ZyEiGyhCQ0dJIBskQiVXJW0lMCVpJWAkchsoQgotGyRCPEI5VCQ5JGskMyRIJCwkRyQtJGtCPiROPmw9aiQsSSxNVyRLJEokaiReJDkhIxsoQjwvcD4KLQotPGgzPjxhIG5hbWU9ImV4cGxpY2l0bHl1c2luZ29wdGlvbnN0b3Blcm1pdGNnaWV4ZWN1dGlvbiI+Ci1DR0kgGyRCJE48QjlUJHIyREc9JEskOSRrJD8kYSRLGyhCIE9wdGlvbnMgGyRCJHJMQDwoRSokSztITVEkOSRrGyhCPC9hPjwvaDM+Ci0KLTxwPhskQiU1ITwlUCROJWElJCVzJE5AX0RqJVUlISUkJWtDZiRHGyhCIDxjb2RlPk9wdGlvbnM8L2NvZGU+IBskQiVHJSMlbCUvJUYlIyVWJHIbKEIKLRskQkxAPChFKiRLO0hNUSQ5JGskMyRIJEchIkZDRGokTiVHJSMlbCUvJUglakdbMjwkRxsoQiBDR0kgGyRCJE48QjlUJHI1djJEJDkkayRoJCYkSxsoQgotGyRCO1hEaiQ5JGskMyRIJCwkRyQtJF4kORsoQjo8cD4KLQotPHByZT4KLSAgICAgICAgJmx0O0RpcmVjdG9yeSAvdXNyL2xvY2FsL2FwYWNoZS9odGRvY3Mvc29tZWRpciZndDsKLSAgICAgICAgICAgICAgICBPcHRpb25zICtFeGVjQ0dJCi0gICAgICAgICZsdDsvRGlyZWN0b3J5Jmd0OwotPC9wcmU+Ci0KLTxwPhskQj5lNS0lRyUjJWwlLyVGJSMlViRPISIbKEJDR0kgGyRCJVUlISUkJWskTjxCOVQkcjJERz0kSyQ5JGskaCQmGyhCIEFwYWNoZSAKLRskQiRLRUEkKCReJDkhIyReJD8hIiRJJE4lVSUhJSQlayQsGyhCIENHSSAbJEIlVSUhJSQlayQrJHIbKEIKLRskQiU1ITwlUCRLRUEkKCRrSSxNVyQsJCIkaiReJDkhIzwhJE4bKEIgPGNvZGU+QWRkSGFuZGxlcjwvY29kZT4KLRskQiVHJSMlbCUvJUYlIyVWJE5OYyRHJE8hIhsoQjxjb2RlPmNnaTwvY29kZT4gGyRCJF4kPyRPGyhCIDxjb2RlPnBsPC9jb2RlPiAbJEIkcjNIRCU7UiRLGyhCCi0bJEI7fSREJDkkWSRGJE4lVSUhJSQlayRyGyhCIENHSSAbJEIlVyVtJTAlaSVgJEgkNyRGJF8kSiQ5JDMkSCRyJTUhPCVQJEtFQSQoJF4kORsoQjo8cD4KLQotPHByZT4KLSAgICAgQWRkSGFuZGxlciBjZ2ktc2NyaXB0IGNnaSBwbAotPC9wcmU+Ci0KLTxoMz48YSBuYW1lPSJodGFjY2Vzc2ZpbGVzIj4uaHRhY2Nlc3MgGyRCJVUlISUkJWsbKEI8L2E+PC9oMz4KLQotPHA+PGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiAbJEIlVSUhJSQlayRPISIlRyUjJWwlLyVIJWpLaCRLGyhCCi0bJEIlRyUjJWwlLyVGJSMlViRyO1hEaiQ5JGtKfUshJEckOSEjGyhCCi1BcGFjaGUgGyRCJE8hIiVqJT0hPCU5JHJEczYhJDkkayRIJC0kSyEiRHM2ISQ5JGslVSUhJSQlayQsQ1YkKyRsJEYkJCRrGyhCCi0bJEIlRyUjJWwlLyVIJWpDZiROGyhCIDxjb2RlPi5odGFjY2VzczwvY29kZT4gGyRCJEgkJCQmJVUlISUkJWskcjsyPkgkNyReJDkhIxsoQgotGyRCJD0kTiVVJSElJCVrJHJILzgrJDckPyRpISIkPSROQ2YkR0gvOCskNSRsJD8lRyUjJWwlLyVGJSMlViQsRSxNUSQ1JGwkXiQ5ISMbKEIKLTxjb2RlPi5odGFjY2VzczwvY29kZT4gGyRCJVUlISUkJWskTyEiGyhCPGNvZGU+QWxsb3dPdmVycmlkZTwvY29kZT4gCi0bJEIlRyUjJWwlLyVGJSMlViROO1hEaiRLJGgkajtIJCgkayRoJCYkSyRKJGokXiQ5ISMbKEIKLTxjb2RlPkFsbG93T3ZlcnJpZGU8L2NvZGU+IBskQiVHJSMlbCUvJUYlIyVWJE8hIhsoQjxjb2RlPi5odGFjY2VzczwvY29kZT4gGyRCJVUlISUkJWskRxsoQgotGyRCQF9EaiRHJC0kayVHJSMlbCUvJUYlIyVWJE4lPyUkJVckcjtYRGokNyReJDkhIxsoQgotPGNvZGU+QWxsb3dPdmVycmlkZTwvY29kZT4gGyRCJUclIyVsJS8lRiUjJVYkTjtYRGokLCRKJCQ+bDlnISIkXiRDJD8kLztIJCgkXiQ7JHMhIxsoQgotQ0dJIBskQiROPEI5VCRyNXYyRCQ5JGskPyRhJEtJLE1XJEgkSiRrJUclIyVsJS8lRiUjJVYkcjtYRGoyREc9JEskOSRrJEskTyEiGyhCCi0bJEIwSjI8JE5AX0RqJCwlNSE8JVAkTiVhJSQlcyROQF9EaiRHSSxNVyRLJEokaiReJDkbKEI6PC9wPgotCi08cHJlPgotICAgICAgICBBbGxvd092ZXJyaWRlIE9wdGlvbnMKLTwvcHJlPgotCi08cD48Y29kZT4uaHRhY2Nlc3M8L2NvZGU+IBskQiVVJSElJCVrJEckTyEiPCEkTiVHJSMlbCUvJUYlIyVWJCxJLE1XJEgbKEIKLRskQiRKJGokXiQ5GyhCOjwvcD4KLQotPHByZT4KLSAgICAgICAgT3B0aW9ucyArRXhlY0NHSQotPC9wcmU+Ci0KLTxwPhskQiQzJE5AX0RqJEckTyEiJDMkTiVHJSMlbCUvJUglaiRLJCokMSRrGyhCIENHSSAbJEIlVyVtJTAlaSVgJE48QjlUJHI1djJEJDkkayRoJCYbKEIKLUFwYWNoZSAbJEIkS0VBJCgkXiQ5ISMbKEI8L3A+Ci0KLTxocj4KLTxoMj48YSBuYW1lPSJ3cml0aW5nYWNnaXByb2dyYW0iPkNHSSAbJEIlVyVtJTAlaSVgJHI9cSQvGyhCPC9hPjwvaDI+Ci0KLTxwPhskQkRMPm8kTiVXJW0lMCVpJV8lcyUwJEgbKEIgQ0dJIBskQiVXJW0lMCVpJV8lcyUwJE40ViRLJE88ZyRLRnMkRCROMGMkJCQsGyhCCi0bJEIkIiRqJF4kOSEjGyhCPC9wPgotCi08cD4bJEIwbCREJE8hIhsoQkNHSSAbJEIlVyVtJTAlaSVgJE4kOSRZJEYkTj1QTk8kSyRPGyhCIE1JTUUtdHlwZQotGyRCJVglQyVAJHJJVSQxJEokMSRsJFAkSiRqJF4kOyRzISMkMyRsJE8kSSROJGgkJiRKPG9OYCROJTMlcyVGJXMlRCRyPHUkMTxoJEMkRhsoQgotGyRCJCQkayQrJHIlLyVpJSQlIiVzJUgkSzwoJDkbKEIgSFRUUCAbJEIlWCVDJUAkRyQ5ISMkWyRIJHMkSSROPmw5ZyRHJE8hIhsoQgotGyRCPCEkTiRoJCYkSz1QTk8kNyReJDkbKEI6PC9wPgotCi08cHJlPgotICAgICAgICBDb250ZW50LXR5cGU6IHRleHQvaHRtbAotPC9wcmU+Ci0KLTxwPhskQiRiJCYwbCREJE8hIj1QTk8kchsoQiBIVE1MIBskQiQrISIlViVpJSYlNiQsST08KCQ5JGskMyRIJCwbKEIKLRskQiRHJC0kazI/JCtCPiRON0E8MCRLJDkka0ksTVckLCQiJGokXiQ5ISMbKEIKLRskQkJnRHEkTj5sOWckTxsoQiBIVE1MIBskQiRHJDckZyQmJCwhIhsoQkdJRiAbJEIlJCVhITwlOCRkQj4kTkhzGyhCIEhUTUwgCi0bJEIlMyVzJUYlcyVEJHI9UE5PJDkkaxsoQiBDR0kgGyRCJVclbSUwJWklYCRyPXEkLyQzJEgkYiQiJGskRyQ3JGckJiEjGyhCPC9wPgotCi08cD4bJEIkMyRsJGlGc0VAMEozMCRHJE8hIhsoQkNHSSAbJEIlVyVtJTAlaSVgJHI9cSQvJDMkSCRPISIkIiRKJD8kLD1xJCQkRiQkJGsbKEIKLRskQkI+JE4lVyVtJTAlaSVgJEhCZyQkJEs7dyRGJCQkayRHJDckZyQmISMbKEI8L3A+Ci0KLTxoMz48YSBuYW1lPSJ5b3VyZmlyc3RjZ2lwcm9ncmFtIj4bJEIkIiRKJD8kTjpHPWkkThsoQiBDR0kgGyRCJVclbSUwJWklYBsoQjwvYT48L2gzPgotCi08cD4bJEI8ISRLPCgkOSROJE8hIiVWJWklJiU2JEsbKEIgMSAbJEI5VDB1O3okOSRrGyhCIENHSSAbJEIlVyVtJTAlaSVgJE5OYyRHJDkhIxsoQgotGyRCMEoyPCRyRn5OTyQ3ISIbKEI8Y29kZT5maXJzdC5wbDwvY29kZT4gGyRCJEgkJCQmJVUlISUkJWskS0pdQjgkNyEiJD0kbCRyGyhCCi08Y29kZT5jZ2ktYmluPC9jb2RlPiAbJEIlRyUjJWwlLyVIJWokS0NWJCQkRiQvJEAkNSQkISMbKEI8L3A+Ci0KLTxwcmU+Ci0gICAgICAgICMhL3Vzci9iaW4vcGVybAotICAgICAgICBwcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcclxuXHJcbiI7Ci0gICAgICAgIHByaW50ICJIZWxsbywgV29ybGQuIjsKLTwvcHJlPgotCi08cD5QZXJsIBskQiRLQDpETCQ3JEYkJCRKJC8kRiRiISIyPyQsNS8kMyRrJCskchsoQgotGyRCTX0yciQ5JGskMyRIJE8kRyQtJGskTyQ6JEckOSEjGyhCCi0xIBskQjlUTFwkTyEiGyhCPGNvZGU+L3Vzci9iaW4vcGVybDwvY29kZT4gGyRCJEc4KyREJDEbKEIKLRskQiRpJGwkayUkJXMlPyVXJWolPyRLJDMkTiVVJSElJCVrJHI2ITVrJDkkayQzJEgkRyQzJE4lVyVtJTAlaSVgJCw8QjlUJDUkbCRrJDMkSCRyGyhCCi1BcGFjaGUgGyRCJEsbKEIgKBskQiU3JSclaz5lJEc8QjlUJDckaCQmJEgkNyRGJCQkayRKJGkkUCEiJD0kTiU3JSclayRLGyhCICkgGyRCPCgkNyReJDkhIxsoQgotMiAbJEI5VExcJE8hIkEwPVIkNyQ/JEgkKiRqGyhCIGNvbnRlbnQtdHlwZSAbJEIkTkRqNUEkcjB1O3okNyReJDkhIxsoQgotGyRCJDMkbCRLJE9JfDUiMn45VCRORnMkRCROQUgkcjhlJEtJVTJDJDckXiQ5ISMkMyRsJEskaCRqISIbKEIKLRskQiVYJUMlQCROPSokaiRLNnU5VCQsQ1YkKyRsISIbKEJIVFRQIBskQiVYJUMlQCROPSokaiRIJVwlRyUjJE47TyReJGokcjwoJDckXiQ5ISMbKEIKLTMgGyRCOVRMXCRPISIbKEJgYEhlbGxvLCBXb3JsZC4nJyAbJEIkSCQkJCZKODt6TnMkcjB1O3okNyEiJDMkbCRHPSokaiRIJEokaiReJDkhIxsoQjwvcD4KLQotPHA+GyRCOSUkXyROJVYlaSUmJTYkcjMrJC0hIiUiJUklbCU5GyhCPC9wPgotCi08cHJlPgotICAgICAgICBodHRwOi8vd3d3LmV4YW1wbGUuY29tL2NnaS1iaW4vZmlyc3QucGwKLTwvcHJlPgotCi08cD4bJEIkIiRrJCQkTyVVJSElJCVrJHJDViQkJD8lbSUxITwlNyVnJXMkcjtYRGokOSRrJEghIhsoQgotPGNvZGU+SGVsbG8sIFdvcmxkLjwvY29kZT4gGyRCJEgkJCQmGyhCIDEgGyRCOVQkLCVWJWklJiU2JSYlIyVzJUkkSzg9JGwkayRHJDckZyQmISMbKEIKLRskQiQ9JGwkTyQiJF4kaiUoJS0lNSUkJUYlIyVzJTAkSiQzJEgkRyRPJCIkaiReJDskcyEjGyhCCi0bJEIkNyQrJDchIiQzJGwkLCQmJF4kL0YwJDEkUCEiGyhCCi0bJEJCPiROJEkkTiRoJCYkSiRiJE4kRyRiRjAkKyQ5JDMkSCQsJEckLSRrJGgkJiRLJEokaiReJDkhIxsoQjwvcD4KLQotPGhyPgotPGgyPjxhIG5hbWU9ImJ1dGl0c3N0aWxsbm90d29ya2luZyI+GyRCJDckKyQ3ISIkXiRARjAkKyRKJCQbKEIgITwvYT48L2gyPgotCi08cD4bJEIlJiUnJVYkKyRpGyhCIENHSSAbJEIlVyVtJTAlaSVgJFgkTiUiJS8lOyU5JHI5VCRKJEMkPyRIJC0hIhsoQgotGyRCJVYlaSUmJTYkRzgrJGsyREc9QC0kLCQiJGs7TSREJE40cEtcRSokSiQzJEgkLCQiJGokXiQ5GyhCOjwvcD4KLQotPGRsPgotPGR0PkNHSSAbJEIlVyVtJTAlaSVgJE49UE5PGyhCPC9kdD4KLTxkZD4bJEJBR0AyJGkkNyQkGyhCICEgGyRCJD0kbCRPJDkkWSRGJCwkJiReJC9GMCQkJD8kMyRIJHIwVUwjJDckXiQ5ISMbKEI8YnI+PGJyPjwvZGQ+Ci0KLTxkdD5DR0kgGyRCJVclbSUwJWklYCROJT0hPCU5JTMhPCVJISIkXiQ/JE8bKEIgIlBPU1QgTWV0aG9kIE5vdCBBbGxvd2VkIiAKLRskQiRIJCQkJiVhJUMlOyE8JTgbKEI8L2R0PiAKLTxkZD4bJEIkMyRsJE8hIhsoQkNHSSAbJEIlVyVtJTAlaSVgJHI9aE19JEckLSRrJGgkJhsoQiBBcGFjaGUgGyRCJHJFLEBaJEtAX0RqJDckRhsoQgotGyRCJCQkSiQrJEMkPyQzJEgkcjBVTCMkNyReJDkhIxsoQgotPGEgaHJlZj0iI2NvbmZpZ3VyaW5nYXBhY2hldG9wZXJtaXRjZ2kiPhskQiFWGyhCQ0dJIBskQiRyNXYyRCQ5JGskaCQmJEsbKEIgQXBhY2hlIBskQiRyQF9EaiQ5JGshVxsoQjwvYT4bJEIkTj5PJHJGSSRfRD4kNyEiJCIkSiQ/JCwyPyRyNFYwYyQoJD8kKyRyGyhCCi0bJEJDNSQ3JEYkXyRGJC8kQCQ1JCQhIxsoQjxicj48YnI+PC9kZD4KLQotPGR0PhskQiVhJUMlOyE8JTgkLBsoQiAiRm9yYmlkZGVuIiAbJEIkRztPJF4kQyRGJCQkaxsoQjwvZHQ+Ci08ZGQ+GyRCJDMkbCRPJVEhPCVfJUMlNyVnJXMkTkxkQmokSCQkJCYkMyRIJHIwVUwjJDckXiQ5ISMbKEIKLTxhIGhyZWY9IiNlcnJvcmxvZ3MiPkFwYWNoZSAbJEIkTiUoJWkhPCVtJTAbKEI8L2E+GyRCJEghIjhlPVIkThsoQgotPGEgaHJlZj0iI2ZpbGVwZXJtaXNzaW9ucyI+GyRCIVYlVSUhJSQlayROJVEhPCVfJUMlNyVnJXMhVxsoQjwvYT4bJEIkTj5PJHIbKEIKLRskQiVBJSclQyUvJDckRiQvJEAkNSQkISMbKEIKLTxicj48YnI+PC9kZD4KLQotPGR0PiJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiIBskQiRIJCQkJiVhJUMlOyE8JTgbKEI8L2R0PgotPGRkPjxhIGhyZWY9IiNlcnJvcmxvZ3MiPkFwYWNoZSAbJEIkTiUoJWkhPCVtJTAbKEI8L2E+GyRCJHIlQSUnJUMlLyQ5JGskSCEiGyhCCi0iUHJlbWF0dXJlIGVuZCBvZiBzY3JpcHQgaGVhZGVycyIgGyRCJEgkJCQmJW0lMCQsNS1PPyQ1JGwkRiQkJGskSDtXJCQkXiQ5ISMbKEIKLRskQiQ9JDckRiEiJCokPSRpJC8bKEIgQ0dJIBskQiVXJW0lMCVpJWAkSyRoJEMkRkA4QC4kNSRsJD8lKCVpITwlYSVDJTshPCU4JGI1LU8/JDUkbCRGJCQkayRHJDckZyQmISMbKEIKLRskQiQzJE4+bDlnISIbKEJDR0kgGyRCJVclbSUwJWklYCQsRSxAWiRKGyhCIEhUVFAgGyRCJVglQyVAJHI9UE5PJEckLSRKJCQ4NjB4JHIbKEIKLRskQkNOJGskPyRhJEshIjBKMjwkTjNGPk8kRyVBJSclQyUvJDckRiRfJEYkLyRAJDUkJCEjGyhCPC9kZD4KLTwvZGw+Ci0KLTxoMz48YSBuYW1lPSJmaWxlcGVybWlzc2lvbnMiPhskQiVVJSElJCVrJE4lUSE8JV8lQyU3JWclcxsoQjwvYT48L2gzPgotCi08cD4bJEIlNSE8JVAkTyQiJEokPyROOCI4QiRHPEI5VCQ1JGwkRiQkJEokJCROJHJLOiRsJEokJCRoJCYkSyEjGyhCCi0bJEIkRCReJGohIjUvRjAkOSRrJEgkLSEiJTUhPCVQJE9GQzgiJHIkYiQ/JEokJCVmITwlNhsoQiAtIBskQkRMPm8bKEIgYGBub2JvZHknJyAbJEIkZBsoQiBgYHd3dycnIAotGyRCJE44IjhCJEc8QjlUJDUkbCReJDkhIyQ3JD8kLCRDJEYhIiQiJEokPyQsPWpNLSQ5JGslVSUhJSQlayRyGyhCCi0bJEI8QjlUJDkkayRLJE9KTCROJVEhPCVfJUMlNyVnJXMkLEksTVckSCRKJGokXiQ5ISMbKEIKLRskQkRMPm8hIhsoQmBgbm9ib2R5JycgGyRCJCw8QjlUJDkkayROJEs9PUosJEolUSE8JV8lQyU3JWclcyRyTT8kKCRrSn1LISRPISIlVSUhJSQlayRLGyhCCi0bJEJDLyRHJGI8QjlUMkRHPSRIJDkkayVRITwlXyVDJTclZyVzJHJNPyQoJGskMyRIJEckORsoQjo8L3A+Ci0KLTxwcmU+Ci0gICAgICAgIGNobW9kIGEreCBmaXJzdC5wbAotPC9wcmU+Ci0KLTxwPhskQiReJD8hIiRiJDckIiRKJD8kTiVXJW0lMCVpJWAkLEI+JE4lVSUhJSQlayRyRkkkXz1xJC0kOSRrJEokaSRQISIbKEIKLRskQiQ9JGwkaSROJVUlISUkJWskTyEiJDMkbCQsMkRHPSRIJEoka0A1JDckJCVRITwlXyVDJTclZyVzJHI7fSRDJEYkJCRrSSxNVyQsGyhCCi0bJEIkIiRqJF4kOSEjGyhCPC9wPgotCi08cD4bJEIkMyRsJEtCUCQ5JGtOYzMwJE8hIiU1ITwlUCQsGyhCIDxhIGhyZWY9Ii4uL3N1ZXhlYy5odG1sIj5zdWV4ZWM8L2E+IBskQiRyGyhCCi0bJEI7SE1RJDkkayRoJCZAX0RqJDUkbCRGJCQkaz5sOWckRyQ5ISMbKEIKLXN1ZXhlYyAbJEIkTyEiGyhCQ0dJIBskQiVXJW0lMCVpJWAkLENWJCskbCRGJCQkayVQITwlQSVjJWslWyU5JUgkXiQ/JE8lZiE8JTYkTiVbITwlYBsoQgotGyRCJUclIyVsJS8lSCVqJEskaCRDJEYhIjBbJEokayVmITwlNjgiOEIkRxsoQgotGyRCPEI5VCQ1JGwkayRoJCYkSyQ3JF4kOSEjGyhCCi1zdWV4ZWMgGyRCJE8kSCRGJGI4NyQ3JCQlUSE8JV8lQyU3JWclcyROJUElJyVDJS8kLCQiJGohIhsoQgotGyRCJD0kTiVBJSclQyUvJHJETDJhJEckLSRKJCQkSBsoQiAiSW50ZXJuYWwgU2VydmVyIEVycm9yIiAbJEIkSCRKJGohIhsoQgotGyRCJD0kThsoQiBDR0kgGyRCJVclbSUwJWklYCROPEI5VCRPPDpHVCQ3JF4kOSEjGyhCCi0bJEIkMyROPmw5ZyEiJEkkTiU7JS0lZSVqJUYlIyVBJSclQyUvJCw8OkdUJDckRiQkJGskTiQrJHJDTiRrGyhCCi0bJEIkPyRhJEsbKEIgc3VleGVjIBskQiVtJTAlVSUhJSQlayRyJUElJyVDJS8kOSRrSSxNVyQsJCIkaiReJDkhIxsoQjwvcD4KLQotPGgzPjxhIG5hbWU9InBhdGhpbmZvcm1hdGlvbiI+GyRCJVElOT5wSnMbKEI8L2E+PC9oMz4KLQotPHA+GyRCJTMlXiVzJUklaSUkJXMkKyRpJVclbSUwJWklYCRyPEI5VCQ5JGskSCQtISIwVTwxJDckSiQvJEYkYhsoQgotGyRCJTclJyVrJEtFTyQ1JGwkaz5wSnMkLCQiJGokXiQ5ISMbKEIKLRskQk5jJCgkUCEiOzI+SCQ5JGslVSUhJSQlayROJD8kYSRLJEkkMyRyOCE6dyQ3JD8kaSRoJCQkKyRyJTclJyVrJEtFQSQoJGslUSU5JCwbKEIKLRskQiQiJGokXiQ5ISMbKEI8L3A+Ci0KLTxwPhskQiVXJW0lMCVpJWAkLBsoQiBDR0kgGyRCJVclbSUwJWklYCRIJDckRiUmJSclViU1ITwlUCRLJGgkQyRGPEI5VCQ1JGwkayRIJC0hIhsoQgotGyRCJD0kbCRPJVElOSRyO30kQSReJDskcyEjGyhCCi1DR0kgGyRCJVclbSUwJWklYEZiJEc4RiRTPVAkOSQiJGkkZiRrJVclbSUwJWklYBsoQiAoGyRCTmMkKCRQISIbKEInc2VuZG1haWwnIBskQiROGyhCCi0bJEIkaCQmJEokYiROGyhCKSAbJEIkTyEiJVUlayVRJTkkRztYRGokOSRrSSxNVyQsJCIkayRHJDckZyQmISMbKEIKLRskQiQ9JGwkSyRoJGohIhsoQkNHSSAbJEIlVyVtJTAlaSVgJHI8QjlUJDckaCQmJEgkNyQ/JEgkLSEiJTclJyVrJE8kPSROJGgkJiRKJVclbSUwJWklYCRyGyhCCi0bJEI4KyREJDEkayQzJEgkLCRHJC0kXiQ5ISMbKEI8L3A+Ci0KLTxwPhskQkYxTU0kSiQzJEgkTyEiJTklLyVqJVclSCROJSQlcyU/JVclaiU/GyhCICgbJEIkNyRQJDckUBsoQiA8Y29kZT4gcGVybCA8L2NvZGU+KSAKLRskQiRYJE4lUSU5JEchIhsoQkNHSSAbJEIlVyVtJTAlaSVgJE4bKEIgMSAbJEI5VExcJEs8ISROJGgkJiRLPCgkNSRsJF4kORsoQjo8L3A+Ci0KLTxwcmU+Ci0gICAgICMhL3Vzci9iaW4vcGVybAotPC9wcmU+Ci0KLTxwPhskQiQzJGwkLCUkJXMlPyE8JVclaiU/JFgkTjxCOl0kTiVRJTkkRyQiJGskMyRIJHIzTjxCJEskNyRGJCokLSReJDkhIxsoQjwvcD4KLQotPGgzPjxhIG5hbWU9InN5bnRheGVycm9ycyI+GyRCOT1KOCUoJWkhPBsoQjwvYT48L2gzPgotCi08cD5DR0kgGyRCJVclbSUwJWklYCQsPDpHVCQ5JGskTiRPQmdEcSEiJVclbSUwJWklYDwrP0gkS0xkQmokLCQiJGs+bDlnJEckOSEjGyhCCi0bJEIwbEVZGyhCIENHSSAbJEIkTjtIJCRKfSRyTX0yciQ3ISJBMD1SJE5GcyREJE44bSRqJHJISCQ3JEYkJCRKJCQkSiRpJFAhIhsoQgotGyRCJF4kOjRWMGMkJCRKJC8kPSQmJEckNyRnJCYhIyVWJWklJiU2JHJETCQ3JEYlRiU5JUgkcjlUJCZBMCRLSSwkOiEiJTMlXiVzJUklaSUkJXMbKEIKLRskQiQrJGklVyVtJTAlaSVgJE48QjlUJHI7biQ3JEokNSQkISMkMyRsJEskaCRqISJCZ0RxJE5MZEJqJCw1LyQzJGkkSiQvJEokaiReJDkhIxsoQjwvcD4KLQotPGgzPjxhIG5hbWU9ImVycm9ybG9ncyI+GyRCJSglaSE8JW0lMBsoQjwvYT48L2gzPgotCi08cD4bJEIlKCVpITwlbSUwJE9NJ0MjJEckOSEjQTQkRiROJCYkXiQvJCQkKyRKJCQkMyRIJE8hIiUoJWkhPCVtJTAkSxsoQgotGyRCJWElQyU7ITwlOCRyQDhALiQ3JF4kOSEjSSwkOiQ9JGwkcjpHPWkkSzgrJGskWSQtJEckOSEjGyhCCi0bJEIkYiQ3ISIkIiRKJD8kLCUmJSclViU1JSQlSCRyPGc6RSQ3JEYkJCRrPmw9aiQsJSglaSE8JW0lMCROOzI+SCRyGyhCCi0bJEI1diQ3JEYkJCRKJCQkSiRpJFAhIiQtJEMkSEI+JE4lNSUkJUgkRzxnOkUkOSRrJFkkLSRHJDkhIxsoQgotGyRCJSglaSE8JW0lMCRORkkkX0p9JHIzWCRWJDMkSCRHISIkWyRIJHMkSUE0JEYkTkxkQmokLD9XQi4kSxsoQgotGyRCM05HJyQ1JGwhIj9XQi4kSzJyN2gkNSRsJGskSCQkJCYkMyRIJCxKLCQrJGskRyQ3JGckJiEjGyhCPC9wPgotCi08aHI+Ci08aDI+PGEgbmFtZT0id2hhdHNnb2luZ29uYmVoaW5kdGhlc2NlbmVzIj4bJEJOIiRHMj8kLDUvJDMkQyRGJCQkayROJCsbKEI/PC9hPjwvaDI+Ci0KLTxwPkNHSSAbJEIlVyVtJTAlaSVfJXMlMCRLPU9DIyQ5JGskSCEiTiIkRzUvJDMkQyRGJCQkaxsoQgotGyRCJDMkSCRLJEQkJCRGOTkkS019MnIkOSRrJDMkSCRPTS0xVyRLJEokayRHJDckZyQmISMlViVpJSYlNiRIGyhCCi0bJEIlNSE8JVAkLCRJJE4kaCQmJEtBajhfREw/LiQ5JGskKyRLJEQkJCRGJE9GQyRLJD0kJiRHJDkhIyRKJDwkSiRpISIbKEIKLWBgSGVsbG8sIFdvcmxkLicnIBskQiRyMHU7eiQ5JGslVyVtJTAlaSVgJHI9cSQvJDMkSCRPJF4kMyRIJEs3azk9JEckOSQsISIbKEIKLRskQiQ9JGwkT0ZDJEtNLTFXJEckTyQiJGokXiQ7JHMhIxsoQjwvcD4KLQotPGgzPjxhIG5hbWU9ImVudmlyb25tZW50dmFyaWFibGVzIj4bJEI0RDYtSlE/dBsoQjwvYT48L2gzPgotCi08cD4bJEI0RDYtSlE/dCRPISIkIiRKJD8kLCUzJXMlVCVlITwlPyRyO0gkJiRIJC0kS0pVJGokS0I4Ol8kNyRGJCQka0NNJEckOSEjGyhCCi0bJEIkPSRsJGkkTyEiJVElORsoQiAoGyRCJTMlXiVzJUkkciU/JSQlVyQ3JD8kSCQtJEs8QjlUJDkkazxCOl0kTiVVJSElJCVrJHIbKEIKLRskQkM1JDc9UCQ5JEgkMyRtGyhCKRskQiEiJWYhPCU2TD4hIkM8S3Y3PyRKJEkkTiRoJCYkSkpYTXgkSiRiJE4kRyQ5ISMbKEIKLRskQkRMPm8kTiEiS2hGfCRONEQ2LUpRP3QkTjQwQTQkSiVqJTklSCRyRDQkWSRrJEskTyEiJTMlXiVzJUklVyVtJXMlVyVIJEcbKEIgCi08Y29kZT5lbnY8L2NvZGU+IBskQiRyRn5OTyQ3JF4kOSEjGyhCPC9wPgotCi08cD5DR0kgGyRCJE49aE19Q2YhIiU1ITwlUCRIJVYlaSUmJTYkYjRENi1KUT90JHJAX0RqJDchIiQ9JGwkSyRoJGobKEIKLRskQkFqOF8kS0RMPy4kOSRrJDMkSCQsJEckLSRrJGgkJiRLJEokaiReJDkhIxsoQgotGyRCJD0kTjRENi1KUT90JE8hIiVWJWklJiU2JT8lJCVXGyhCIChOZXRzY2FwZSwgSUUsIEx5bngpGyRCISIbKEIKLRskQiU1ITwlUCU/JSQlVxsoQiAoQXBhY2hlLCBJSVMsIFdlYlNpdGUpGyRCISI8QjlUJDUkbCRGJCQkaxsoQiBDR0kgGyRCJVclbSUwJWklYCROTD5BMBsoQgotGyRCJEokSSROJGgkJiRKJGIkTiRHJDkhIxsoQjwvcD4KLQotPHA+GyRCJDMkbCRpJE5KUT90JE8bKEIgQ0dJIBskQiVXJW0lMCVpJV4kLDtITVEkOSRrJDMkSCQsJEckLSReJDkhIyQ9JDckRiEiGyhCCi0bJEIkPSRsJE8lLyVpJSQlIiVzJUgkSCU1ITwlUCROREw/LiROT0MkTkg+SiwkRyQ5ISNJLE1XJEpKUT90JE40MEE0JEolaiU5JUgkTxsoQgotPGEgaHJlZj0iaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS9lbnYuaHRtbCI+aHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS9lbnYuaHRtbDwvYT4KLRskQiRLJCIkaiReJDkhIxsoQjwvcD4KLQotPHA+GyRCMEoyPCROQzE9YyRKGyhCIFBlcmwgQ0dJIBskQiVXJW0lMCVpJWAkTyEiRU8kNSRsJGtBNCRGJE40RDYtSlE/dCRyGyhCCi0bJEJJPTwoJDckXiQ5ISNGMU1NJE4lVyVtJTAlaSVgJE8hIhsoQkFwYWNoZSAbJEIlRyUjJTklSCVqJVMlZSE8JTclZyVzJE4bKEIKLTxjb2RlPmNnaS1iaW48L2NvZGU+IBskQiVHJSMlbCUvJUglaiRLRnMkRDReJF4kbCRGJCQkXiQ5ISMbKEIKLRskQiQkJC8kRCQrJE5KUT90JCxJLD9cJEckIiRqISIkJCQvJEQkKyRPRyQwVSRHJCIkayQzJEgkS0NtMFUkNyRGJC8kQCQ1JCQhIxsoQgotGyRCJD0kNyRGISI4eDwwJE4laiU5JUgkSyRPJEokJCQkJC8kRCQrJE5KUT90JCxJPTwoJDUkbCRGJCQkayQrJGIkNyRsJF4kOyRzISMbKEIKLRskQiQ1JGkkSyEiGyhCQXBhY2hlIBskQiRPJUclVSUpJWslSCRHTVEwVSQ1JGwkRiQkJGs0cEtcRSokSiRiJE4kSxsoQgotPGEgaHJlZj0iLi4vZW52Lmh0bWwiPhskQiQiJEokPzwrP0gkTjRENi1KUT90JHIyQyQoJGsbKEI8L2E+Ci0bJEIkPyRhJE4hIkI/JC8kTjBbJEoka0p9SyEkck1RMFUkNyRGJDckXiQ5ISMbKEI8L3A+Ci0KLTxwcmU+Ci0gICAgICMhL3Vzci9iaW4vcGVybAotICAgICBwcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcblxuIjsKLSAgICAgZm9yZWFjaCAka2V5IChrZXlzICVFTlYpIHsKLSAgICAgICAgICBwcmludCAiJGtleSAtLSZndDsgJEVOVnska2V5fSZsdDticiZndDsiOwotICAgICB9Ci08L3ByZT4KLQotPGgzPjxhIG5hbWU9InN0ZGluYW5kc3Rkb3V0Ij5TVERJTiAbJEIkSBsoQiBTVERPVVQ8L2E+PC9oMz4KLQotPHA+GyRCJTUhPCVQJEglLyVpJSQlIiVzJUg0ViROJGIkJjBsJEQkTkRMPy4kTyEiSTg9YEZ+Tk8bKEIgKDxjb2RlPlNURElOPC9jb2RlPikbJEIkSBsoQgotGyRCSTg9YD1QTk8bKEIgKDxjb2RlPlNURE9VVDwvY29kZT4pIBskQiRyREwkOCRGOVQkSiRvJGwkXiQ5ISNETD5vJE5KOEwuJEskKiQkJEYhIhsoQgotPGNvZGU+U1RESU48L2NvZGU+IBskQiRPJS0hPCVcITwlSSRkJVclbSUwJWklYCQsRjA6biQ5JGskPyRhJEtNPyQoJGkkbCRrGyhCCi0bJEIlVSUhJSQlayRyMFVMIyQ3ISIbKEI8Y29kZT5TVERPVVQ8L2NvZGU+IBskQiRPREw+byUzJXMlPSE8JWskXiQ/JE8lOSUvJWohPCVzJHIbKEIKLRskQjBVTCMkNyReJDkhIxsoQjwvcD4KLQotPHA+GyRCJSYlJyVWJVUlKSE8JWAkKyRpGyhCIENHSSAbJEIlVyVtJTAlaSVgJFgbKEI8Y29kZT5QT1NUPC9jb2RlPiAbJEIkNyQ/JEgkLSEiGyhCCi0bJEIlVSUpITwlYCROJUchPCU/JE9GQ0pMJEolVSUpITwlXiVDJUgkR0IrJE0kaSRsISIbKEI8Y29kZT5TVERJTjwvY29kZT4gGyRCJHIbKEIKLRskQkRMJDckRiEiGyhCQ0dJIBskQiVXJW0lMCVpJWAkSzB6JC1FTyQ1JGwkXiQ5ISMlVyVtJTAlaSVgJE8lRyE8JT8kLCUtITwlXCE8JUkbKEIKLRskQiRiJDckLyRPJVUlISUkJWskKyRpTWgkRiQkJD8kKyROJGgkJiRLPWhNfSQ5JGskMyRIJCwkRyQtJF4kOSEjGyhCPC9wPgotCi08UD4bJEIhVkZDSkwkSiVVJSkhPCVeJUMlSCFXJE8kSCRGJGJDMT1jJEckOSEjJVUlIyE8JWslSUw+JEhDTSRPJSQlMyE8JWsbKEIKLSg9KSAbJEIkRzdrJFAkbCReJDkhIyQ9JDckRkNNJE5BSCRPJSIlcyVRJTUlcyVJGyhCICgmYW1wOykgGyRCJEcbKEIKLRskQjdrJFAkbCReJDkhIyU5JVohPCU5ISIlIiVzJVElNSVzJUkhIiUkJTMhPCVrJE4kaCQmJEpMTEVdJEpKODt6GyhCCi0bJEIkTyEiJD0kbCRpJCxGMDpuJHJCTExcJEskNyRKJCQkaCQmJEskPSROSjg7eiRLQWpFdiQ5JGsbKEIgMTYgGyRCP0okS0pRNDkkNSRsJF4kOSEjGyhCCi0bJEJBNCVHITwlP0o4O3pOcyRPISIwSjI8JE4kaCQmJEskSiRqJF4kORsoQjo8L3A+Ci0KLTxwcmU+Ci0gICAgIG5hbWU9UmljaCUyMEJvd2VuJmFtcDtjaXR5PUxleGluZ3RvbiZhbXA7c3RhdGU9S1kmYW1wO3NpZGVraWNrPVNxdWlycmVsJTIwTW9ua2V5Ci08L3ByZT4KLQotPHA+GyRCO34hOSEiJDMkTiRoJCYkSko4O3pOcyQsGyhCIFVSTCAbJEIkS0lVMkMkNSRsJGskTiRyOCskayRHJDckZyQmISMbKEIKLRskQiQ9JE4+bDlnISIlNSE8JVAkTxsoQiA8Y29kZT5RVUVSWV9TVFJJTkc8L2NvZGU+IBskQiRIJCQkJjRENi1KUT90JEskPSROGyhCCi0bJEJKODt6TnMkckZ+JGwkXiQ5ISMkPSRsJE8bKEIgPGNvZGU+R0VUPC9jb2RlPiAbJEIlaiUvJSglOSVIJEg4RiRQJGwkXiQ5ISMbKEIKLUhUTUwgGyRCJVUlKSE8JWAkRyRPISIlRyE8JT8kckVPJDkkPyRhJEsbKEIgPGNvZGU+R0VUPC9jb2RlPiAbJEIkSBsoQiA8Y29kZT5QT1NUPC9jb2RlPiAKLRskQiROJEkkQSRpJHI7SE1RJDkkayQrJHIhIhsoQgotPGNvZGU+Rk9STTwvY29kZT4bJEIlPyUwJE4bKEIgPGNvZGU+TUVUSE9EPC9jb2RlPiAbJEJCMEAtJE5AX0RqJEc7WERqJDckXiQ5ISMbKEI8L3A+Ci0KLTxwPkNHSSAbJEIlVyVtJTAlaSVgJE8hIiQ9JE5KODt6TnMkckxyJEtOKSREPnBKcyRLSiwzZCQ5JGtAVUckJCwkIiRqJF4kOSEjGyhCCi0bJEI5LCQkJEskYiEiJD0kTiVHITwlPz1oTX0kcj11JDEkayVpJSQlViVpJWokZCViJTglZSE8JWskLEI4Ol8kNyReJDkhIyQzJGwkaSRPISIbKEIKLUNHSSAbJEIlVyVtJTAlaSVgJE5CPiROTEwkRyRiRjFNTSRLTHIkS04pJEEkXiQ5ISMbKEI8L3A+Ci0KLTxocj4KLTxoMj48YSBuYW1lPSJjZ2ltb2R1bGVzbGlicmFyaWVzIj5DR0kgGyRCJWIlOCVlITwlaxsoQi8bJEIlaSUkJVYlaSVqGyhCPC9hPjwvaDI+Ci0KLTxwPkNHSSAbJEIlVyVtJTAlaSVgJHI9cSQvJEgkLSEiTExFXSRKO0U7diROQmdJdEosJHIkNyRGJC8kbCRrGyhCCi0bJEIlMyE8JUklaSUkJVYlaSVqJF4kPyRPJWIlOCVlITwlayRyO0gkJiQzJEgkcjghRiQkOSRZJC0kRyQ5ISMbKEIKLRskQiQzJGwkTyUoJWkhPCRyODokaSQ3ISJBYSQkMytILyRLJEQkSiQsJGokXiQ5ISMbKEI8L3A+Ci0KLTxwPlBlcmwgGyRCJEcbKEIgQ0dJIBskQiVXJW0lMCVpJWAkcj1xJCQkRiQkJGskSiRpISIlYiU4JWUhPCVrJE8bKEIKLTxhIGhyZWY9Imh0dHA6Ly93d3cuY3Bhbi5vcmcvIj5DUEFOPC9hPiAbJEIkR0RzNiEkNSRsJEYkJCReJDkhIyQzJE5MXEUqJE4kPyRhJE4bKEIKLRskQjpHJGJJYTVaJDckRiQkJGslYiU4JWUhPCVrJE8bKEIgQ0dJLnBtIBskQiRHJDkhIxsoQgotQ0dJOjpMaXRlIBskQiRiOCFGJCQ3JF4kNyRnJCYhIyQzJGwkTyEiJFskSCRzJEkkTiVXJW0lMCVpJWAkSyQqJCQkRkksTVckSCQ5JGskOSRZJEYkTjUhRz0kTjpHPi4lOyVDJUgkTjxCQXUkRyQ5ISMbKEI8L3A+Ci0KLTxwPkMgGyRCJEcbKEIgQ0dJIBskQiVXJW0lMCVpJWAkcj1xJCQkRiQkJGskSiRpISIkJCRtJCQkbSRKGyhCCi0bJEIlKiVXJTclZyVzJCwkIiRqJF4kOSEjJDMkbCRpJE5GYiROMGwkRCRPGyhCCi08YSBocmVmPSJodHRwOi8vd3d3LmJvdXRlbGwuY29tL2NnaWMvIj5odHRwOi8vd3d3LmJvdXRlbGwuY29tL2NnaWMvPC9hPgotGyRCJEdEczYhJDUkbCRGJCQkaxsoQiBDR0lDIBskQiVpJSQlViVpJWokRyQ5ISMbKEI8L3A+Ci0KLTxocj4KLTxoMj48YSBuYW1lPSJmb3Jtb3JlaW5mb3JtYXRpb24iPhskQjk5JEokaz5wSnMbKEI8L2E+PC9oMj4KLQotPHA+Q0dJIBskQiRLNFgkOSRrPnBKcyRPJSYlJyVWJEc/dEI/JC9EczYhJDUkbCRGJCQkXiQ5ISMbKEJDR0kgGyRCJE5MZEJqJEskRCQkJEYkTxsoQgotVXNlbmV0IBskQiROGyhCIGNvbXAuaW5mb3N5c3RlbXMud3d3LmF1dGhvcmluZy5jZ2kgGyRCJEchIkI+JE4lZiE8JTYkSBsoQgotGyRCT0A1RCQ5JGskMyRIJCwkRyQtJF4kOSEjGyhCSFRNTCBXcml0ZXJzIEd1aWRlIBskQiROGyhCIC1zZXJ2ZXJzGyRCJWEhPCVqJXMlMCVqJTklSBsoQgotGyRCJE8hIiQiJEokPyROPEFMZCRLMnNFeiQ3JEYkLyRsJGswTkJnJEolaiU9ITwlOSRHJDkhIxsoQgotPGEgaHJlZj0iaHR0cDovL3d3dy5od2cub3JnL2xpc3RzL2h3Zy1zZXJ2ZXJzLyI+aHR0cDovL3d3dy5od2cub3JnL2xpc3RzL2h3Zy1zZXJ2ZXJzLzwvYT4KLRskQiRHOTkkS0I/JC8kckM1JDc9UCQ5JDMkSCQsGyhCCi0bJEIkRyQtJF4kOSEjGyhCPC9wPgotCi08cD4bJEIkPSQ3JEYkYiRBJG0kcyEiJCokPSRpJC8bKEIgQ0dJIBskQiVXJW0lMCVpJWAkTkYwOm4kSzRYJDkkaz5cOlkkThsoQgotGyRCQTQkRiQsNS09UiQ1JGwkRiQkJGsbKEIgQ0dJIBskQiROO0VNTSRyRkkkYCRZJC0kRyQ5ISMlKiVqJTglSiVrJVAhPCU4JWclcyRyGyhCCi08YSBocmVmPSJodHRwOi8vaG9vaG9vLm5jc2EudWl1Yy5lZHUvY2dpL2ludGVyZmFjZS5odG1sIj5OQ1NBPC9hPiAbJEIkRyEiGyhCCi0bJEIlIiVDJVclRyE8JUgkNSRsJD8lSSVpJVUlSCRyGyhCCi08YSBocmVmPSJodHRwOi8vd2ViLmdvbHV4LmNvbS9jb2FyL2NnaS8iPkNvbW1vbiBHYXRld2F5IEludGVyZmFjZSBSRkMKLRskQiVXJW0lOCUnJS8lSBsoQjwvYT4bJEIkRzsyPkgkOSRrJDMkSCQsJEckLSReJDkhIxsoQjwvcD4KLQotPHA+Q0dJIBskQiROTGRCaiRLJEQkJCRGISIyQyRvJEMkRiQkJGslYSE8JWolcyUwJWolOSVIJF4kPyRPJUslZSE8JTkbKEIKLRskQiUwJWshPCVXJEs8QUxkJHJBdyRrJEgkLSEiNS8kMyRDJD8kYiROISI1LyQzJEMkRiRbJDckJCQzJEghIhsoQgotGyRCPEI6XSRLNS8kMyRDJD8kMyRIJCwkSSQmMGMkJiQrISI7SE1RJDckRiQkJGslNSE8JVAhIhsoQgotQ0dJIBskQiVXJW0lMCVpJWAkcjUtPVIkNyRGJCQkazhAOGwkSzRYJDkkaz09SiwkSj5wSnMkSCEiGyhCCi0bJEIyREc9JEckIiRsJFBMZEJqJE4lMyE8JUkkckRzNiEkOSRrJGgkJiRLJDckRiQvJEAkNSQkISMbKEIKLRskQiQ9JCYkOSRrJDMkSCRHISJMZEJqJCwkaCRqNFZDMSRLOCskRCQrJGskaCQmJEskSiRqJF4kOSEjGyhCPC9wPgotCi08cD5BcGFjaGUgGyRCJE4lPSE8JTklMyE8JUkkSyQqJCQkRkxkQmokckgvOCskNyQ/JDMkSCRyM04/LiQ3JEYkJCRKJCQbKEIKLRskQjhCJGohIhsoQkNHSSAbJEIkTkxkQmokSzRYJDkkazxBTGQkchsoQiBBcGFjaGUgGyRCJVAlMCVHITwlPyVZITwlOSRLQXckayRZJC0kRyRKJCQbKEIKLRskQiQzJEgkS0NtTFwkNyRGJC8kQCQ1JCQhIxsoQjwvcD4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLQotPC9ib2R5PgotPC9odG1sPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9ob3d0by9zc2kuaHRtbCBiL2RvY3MvbWFudWFsL2hvd3RvL3NzaS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmQyYTFmLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2hvd3RvL3NzaS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTE5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QXBhY2hlIFR1dG9yaWFsOiBJbnRyb2R1Y3Rpb24gdG8gU2VydmVyIFNpZGUgSW5jbHVkZXM8L3RpdGxlPgotPGxpbmsgcmV2PSJtYWRlIiBocmVmPSJtYWlsdG86cmJvd2VuQHJjYm93ZW4uY29tIj4KLTwvaGVhZD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxib2R5IGJnY29sb3I9IiNGRkZGRkYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjMDAwMDgwIgotYWxpbms9IiNGRjAwMDAiPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxoMSBhbGlnbj0iQ0VOVEVSIj5BcGFjaGUgVHV0b3JpYWw6IEludHJvZHVjdGlvbiB0byBTZXJ2ZXIgU2lkZQotSW5jbHVkZXM8L2gxPgotCi08YSBuYW1lPSJfX2luZGV4X18iPjwvYT4gPCEtLSBJTkRFWCBCRUdJTiAtLT4KLSAKLQotPHVsPgotPGxpPjxhIGhyZWY9Ci0iI2FwYWNoZXR1dG9yaWFsOmludHJvZHVjdGlvbnRvc2VydmVyc2lkZWluY2x1ZGVzIj5BcGFjaGUKLVR1dG9yaWFsOiBJbnRyb2R1Y3Rpb24gdG8gU2VydmVyIFNpZGUgSW5jbHVkZXM8L2E+PC9saT4KLQotPGxpPjxhIGhyZWY9IiN3aGF0YXJlc3NpIj5XaGF0IGFyZSBTU0k/PC9hPjwvbGk+Ci0KLTxsaT48YSBocmVmPSIjY29uZmlndXJpbmd5b3Vyc2VydmVydG9wZXJtaXRzc2kiPkNvbmZpZ3VyaW5nIHlvdXIKLXNlcnZlciB0byBwZXJtaXQgU1NJPC9hPjwvbGk+Ci0KLTxsaT48YSBocmVmPSIjYmFzaWNzc2lkaXJlY3RpdmVzIj5CYXNpYyBTU0kgZGlyZWN0aXZlczwvYT4KLQotPHVsPgotICA8bGk+PGEgaHJlZj0iI3RvZGF5J3NkYXRlIj5Ub2RheSdzIGRhdGU8L2E+PC9saT4KLQotICA8bGk+PGEgaHJlZj0iI21vZGlmaWNhdGlvbmRhdGVvZnRoZWZpbGUiPk1vZGlmaWNhdGlvbiBkYXRlIG9mIHRoZQotZmlsZTwvYT48L2xpPgotCi0gIDxsaT48YSBocmVmPSIjaW5jbHVkaW5ndGhlcmVzdWx0c29mYWNnaXByb2dyYW0iPkluY2x1ZGluZyB0aGUKLXJlc3VsdHMgb2YgYSBDR0kgcHJvZ3JhbTwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci0KLTxsaT48YSBocmVmPSIjYWRkaXRpb25hbGV4YW1wbGVzIj5BZGRpdGlvbmFsIGV4YW1wbGVzPC9hPgotCi08dWw+Ci08bGk+PGEgaHJlZj0iI3doZW53YXN0aGlzZG9jdW1lbnRtb2RpZmllZCI+V2hlbiB3YXMgdGhpcyBkb2N1bWVudAotbW9kaWZpZWQ/PC9hPjwvbGk+Ci0KLTxsaT48YSBocmVmPSIjaW5jbHVkaW5nYXN0YW5kYXJkZm9vdGVyIj5JbmNsdWRpbmcgYSBzdGFuZGFyZAotZm9vdGVyPC9hPjwvbGk+Ci0KLTxsaT48YSBocmVmPSIjd2hhdGVsc2VjYW5pY29uZmlnIj5XaGF0IGVsc2UgY2FuIEkgY29uZmlnPzwvYT48L2xpPgotCi08bGk+PGEgaHJlZj0iI2V4ZWN1dGluZ2NvbW1hbmRzIj5FeGVjdXRpbmcgY29tbWFuZHM8L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotCi08bGk+PGEgaHJlZj0iI2FkdmFuY2Vkc3NpdGVjaG5pcXVlcyI+QWR2YW5jZWQgU1NJIHRlY2huaXF1ZXM8L2E+Ci0KLTx1bD4KLTxsaT48YSBocmVmPSIjc2V0dGluZ3ZhcmlhYmxlcyI+U2V0dGluZyB2YXJpYWJsZXM8L2E+PC9saT4KLQotPGxpPjxhIGhyZWY9IiNjb25kaXRpb25hbGV4cHJlc3Npb25zIj5Db25kaXRpb25hbCBleHByZXNzaW9uczwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci0KLTxsaT48YSBocmVmPSIjY29uY2x1c2lvbiI+Q29uY2x1c2lvbjwvYT48L2xpPgotPC91bD4KLQotPCEtLSBJTkRFWCBFTkQgLS0+Ci08aHI+Ci08aDI+PGEgbmFtZT0KLSJhcGFjaGV0dXRvcmlhbDppbnRyb2R1Y3Rpb250b3NlcnZlcnNpZGVpbmNsdWRlcyI+QXBhY2hlCi1UdXRvcmlhbDogSW50cm9kdWN0aW9uIHRvIFNlcnZlciBTaWRlIEluY2x1ZGVzPC9hPjwvaDI+Ci0KLTx0YWJsZSBib3JkZXI9IjEiPgotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48c3Ryb25nPlJlbGF0ZWQgTW9kdWxlczwvc3Ryb25nPjxicj4KLTxicj4KLSA8YSBocmVmPSIuLi9tb2QvbW9kX2luY2x1ZGUuaHRtbCI+bW9kX2luY2x1ZGU8L2E+PGJyPgotPGEgaHJlZj0iLi4vbW9kL21vZF9jZ2kuaHRtbCI+bW9kX2NnaTwvYT48YnI+Ci08YSBocmVmPSIuLi9tb2QvbW9kX2V4cGlyZXMuaHRtbCI+bW9kX2V4cGlyZXM8L2E+PGJyPgotIDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiPjxzdHJvbmc+UmVsYXRlZCBEaXJlY3RpdmVzPC9zdHJvbmc+PGJyPgotPGJyPgotIDxhIGhyZWY9Ii4uL21vZC9jb3JlLmh0bWwjb3B0aW9ucyI+T3B0aW9uczwvYT48YnI+Ci08YSBocmVmPSIuLi9tb2QvbW9kX2luY2x1ZGUuaHRtbCN4Yml0aGFjayI+WEJpdEhhY2s8L2E+PGJyPgotPGEgaHJlZj0iLi4vbW9kL21vZF9taW1lLmh0bWwjYWRkdHlwZSI+QWRkVHlwZTwvYT48YnI+Ci08YSBocmVmPSIuLi9tb2QvbW9kX21pbWUuaHRtbCNhZGRoYW5kbGVyIj5BZGRIYW5kbGVyPC9hPjxicj4KLTxhIGhyZWY9Ci0iLi4vbW9kL21vZF9zZXRlbnZpZi5odG1sI0Jyb3dzZXJNYXRjaE5vQ2FzZSI+QnJvd3Nlck1hdGNoTm9DYXNlPC9hPjxicj4KLQotIDwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLQotPHA+VGhpcyBIT1dUTyBmaXJzdCBhcHBlYXJlZCBpbiBBcGFjaGUgVG9kYXkKLShodHRwOi8vd3d3LmFwYWNoZXRvZGF5LmNvbS8pIGFzIGEgc2VyaWVzIG9mIHRocmVlIGFydGljbGVzLiBUaGV5Ci1hcHBlYXIgaGVyZSBieSBhcnJhbmdlbWVudCB3aXRoIEFwYWNoZVRvZGF5IGFuZCBJbnRlcm5ldC5jb20uPC9wPgotCi08cD5UaGlzIGFydGljbGUgZGVhbHMgd2l0aCBTZXJ2ZXIgU2lkZSBJbmNsdWRlcywgdXN1YWxseSBjYWxsZWQgc2ltcGx5Ci1TU0kuIEluIHRoaXMgYXJ0aWNsZSwgSSdsbCB0YWxrIGFib3V0IGNvbmZpZ3VyaW5nIHlvdXIgc2VydmVyIHRvIHBlcm1pdAotU1NJLCBhbmQgaW50cm9kdWNlIHNvbWUgYmFzaWMgU1NJIHRlY2huaXF1ZXMgZm9yIGFkZGluZyBkeW5hbWljIGNvbnRlbnQKLXRvIHlvdXIgZXhpc3RpbmcgSFRNTCBwYWdlcy48L3A+Ci0KLTxwPkluIHRoZSBsYXR0ZXIgcGFydCBvZiB0aGUgYXJ0aWNsZSwgd2UnbGwgdGFsayBhYm91dCBzb21lIG9mIHRoZQotc29tZXdoYXQgbW9yZSBhZHZhbmNlZCB0aGluZ3MgdGhhdCBjYW4gYmUgZG9uZSB3aXRoIFNTSSwgc3VjaCBhcwotY29uZGl0aW9uYWwgc3RhdGVtZW50cyBpbiB5b3VyIFNTSSBkaXJlY3RpdmVzLjwvcD4KLQotPGhyPgotPGgyPjxhIG5hbWU9IndoYXRhcmVzc2kiPldoYXQgYXJlIFNTST88L2E+PC9oMj4KLQotPHA+U1NJIChTZXJ2ZXIgU2lkZSBJbmNsdWRlcykgYXJlIGRpcmVjdGl2ZXMgdGhhdCBhcmUgcGxhY2VkIGluIEhUTUwKLXBhZ2VzLCBhbmQgZXZhbHVhdGVkIG9uIHRoZSBzZXJ2ZXIgd2hpbGUgdGhlIHBhZ2VzIGFyZSBiZWluZyBzZXJ2ZWQuCi1UaGV5IGxldCB5b3UgYWRkIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBjb250ZW50IHRvIGFuIGV4aXN0aW5nIEhUTUwKLXBhZ2UsIHdpdGhvdXQgaGF2aW5nIHRvIHNlcnZlIHRoZSBlbnRpcmUgcGFnZSB2aWEgYSBDR0kgcHJvZ3JhbSwgb3IKLW90aGVyIGR5bmFtaWMgdGVjaG5vbG9neS48L3A+Ci0KLTxwPlRoZSBkZWNpc2lvbiBvZiB3aGVuIHRvIHVzZSBTU0ksIGFuZCB3aGVuIHRvIGhhdmUgeW91ciBwYWdlIGVudGlyZWx5Ci1nZW5lcmF0ZWQgYnkgc29tZSBwcm9ncmFtLCBpcyB1c3VhbGx5IGEgbWF0dGVyIG9mIGhvdyBtdWNoIG9mIHRoZSBwYWdlCi1pcyBzdGF0aWMsIGFuZCBob3cgbXVjaCBuZWVkcyB0byBiZSByZWNhbGN1bGF0ZWQgZXZlcnkgdGltZSB0aGUgcGFnZSBpcwotc2VydmVkLiBTU0kgaXMgYSBncmVhdCB3YXkgdG8gYWRkIHNtYWxsIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiwgc3VjaCBhcwotdGhlIGN1cnJlbnQgdGltZS4gQnV0IGlmIGEgbWFqb3JpdHkgb2YgeW91ciBwYWdlIGlzIGJlaW5nIGdlbmVyYXRlZCBhdAotdGhlIHRpbWUgdGhhdCBpdCBpcyBzZXJ2ZWQsIHlvdSBuZWVkIHRvIGxvb2sgZm9yIHNvbWUgb3RoZXIKLXNvbHV0aW9uLjwvcD4KLQotPGhyPgotPGgyPjxhIG5hbWU9ImNvbmZpZ3VyaW5neW91cnNlcnZlcnRvcGVybWl0c3NpIj5Db25maWd1cmluZyB5b3VyCi1zZXJ2ZXIgdG8gcGVybWl0IFNTSTwvYT48L2gyPgotCi08cD5UbyBwZXJtaXQgU1NJIG9uIHlvdXIgc2VydmVyLCB5b3UgbXVzdCBoYXZlIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlCi1laXRoZXIgaW4geW91ciA8Y29kZT5odHRwZC5jb25mPC9jb2RlPiBmaWxlLCBvciBpbiBhCi08Y29kZT4uaHRhY2Nlc3M8L2NvZGU+IGZpbGU6PC9wPgotCi08cHJlPgotICAgICAgICBPcHRpb25zICtJbmNsdWRlcwotPC9wcmU+Ci0KLTxwPlRoaXMgdGVsbHMgQXBhY2hlIHRoYXQgeW91IHdhbnQgdG8gcGVybWl0IGZpbGVzIHRvIGJlIHBhcnNlZCBmb3IgU1NJCi1kaXJlY3RpdmVzLjwvcD4KLQotPHA+Tm90IGp1c3QgYW55IGZpbGUgaXMgcGFyc2VkIGZvciBTU0kgZGlyZWN0aXZlcy4gWW91IGhhdmUgdG8gdGVsbAotQXBhY2hlIHdoaWNoIGZpbGVzIHNob3VsZCBiZSBwYXJzZWQuIFRoZXJlIGFyZSB0d28gd2F5cyB0byBkbyB0aGlzLiBZb3UKLWNhbiB0ZWxsIEFwYWNoZSB0byBwYXJzZSBhbnkgZmlsZSB3aXRoIGEgcGFydGljdWxhciBmaWxlIGV4dGVuc2lvbiwKLXN1Y2ggYXMgPGNvZGU+LnNodG1sPC9jb2RlPiwgd2l0aCB0aGUgZm9sbG93aW5nIGRpcmVjdGl2ZXM6PC9wPgotCi08cHJlPgotICAgICAgICBBZGRUeXBlIHRleHQvaHRtbCAuc2h0bWwKLSAgICAgICAgQWRkSGFuZGxlciBzZXJ2ZXItcGFyc2VkIC5zaHRtbAotPC9wcmU+Ci0KLTxwPk9uZSBkaXNhZHZhbnRhZ2UgdG8gdGhpcyBhcHByb2FjaCBpcyB0aGF0IGlmIHlvdSB3YW50ZWQgdG8gYWRkIFNTSQotZGlyZWN0aXZlcyB0byBhbiBleGlzdGluZyBwYWdlLCB5b3Ugd291bGQgaGF2ZSB0byBjaGFuZ2UgdGhlIG5hbWUgb2YKLXRoYXQgcGFnZSwgYW5kIGFsbCBsaW5rcyB0byB0aGF0IHBhZ2UsIGluIG9yZGVyIHRvIGdpdmUgaXQgYQotPGNvZGU+LnNodG1sPC9jb2RlPiBleHRlbnNpb24sIHNvIHRoYXQgdGhvc2UgZGlyZWN0aXZlcyB3b3VsZCBiZQotZXhlY3V0ZWQuPC9wPgotCi08cD5UaGUgb3RoZXIgbWV0aG9kIGlzIHRvIHVzZSB0aGUgPGNvZGU+WEJpdEhhY2s8L2NvZGU+IGRpcmVjdGl2ZTo8L3A+Ci0KLTxwcmU+Ci0gICAgICAgIFhCaXRIYWNrIG9uCi08L3ByZT4KLQotPHA+PGNvZGU+WEJpdEhhY2s8L2NvZGU+IHRlbGxzIEFwYWNoZSB0byBwYXJzZSBmaWxlcyBmb3IgU1NJIGRpcmVjdGl2ZXMKLWlmIHRoZXkgaGF2ZSB0aGUgZXhlY3V0ZSBiaXQgc2V0LiBTbywgdG8gYWRkIFNTSSBkaXJlY3RpdmVzIHRvIGFuCi1leGlzdGluZyBwYWdlLCByYXRoZXIgdGhhbiBoYXZpbmcgdG8gY2hhbmdlIHRoZSBmaWxlIG5hbWUsIHlvdSB3b3VsZAotanVzdCBuZWVkIHRvIG1ha2UgdGhlIGZpbGUgZXhlY3V0YWJsZSB1c2luZyA8Y29kZT5jaG1vZDwvY29kZT4uPC9wPgotCi08cHJlPgotICAgICAgICBjaG1vZCAreCBwYWdlbmFtZS5odG1sCi08L3ByZT4KLQotPHA+QSBicmllZiBjb21tZW50IGFib3V0IHdoYXQgbm90IHRvIGRvLiBZb3UnbGwgb2NjYXNpb25hbGx5IHNlZSBwZW9wbGUKLXJlY29tbWVuZGluZyB0aGF0IHlvdSBqdXN0IHRlbGwgQXBhY2hlIHRvIHBhcnNlIGFsbCA8Y29kZT4uaHRtbDwvY29kZT4KLWZpbGVzIGZvciBTU0ksIHNvIHRoYXQgeW91IGRvbid0IGhhdmUgdG8gbWVzcyB3aXRoIDxjb2RlPi5zaHRtbDwvY29kZT4KLWZpbGUgbmFtZXMuIFRoZXNlIGZvbGtzIGhhdmUgcGVyaGFwcyBub3QgaGVhcmQgYWJvdXQKLTxjb2RlPlhCaXRIYWNrPC9jb2RlPi4gVGhlIHRoaW5nIHRvIGtlZXAgaW4gbWluZCBpcyB0aGF0LCBieSBkb2luZwotdGhpcywgeW91J3JlIHJlcXVpcmluZyB0aGF0IEFwYWNoZSByZWFkIHRocm91Z2ggZXZlcnkgc2luZ2xlIGZpbGUgdGhhdAotaXQgc2VuZHMgb3V0IHRvIGNsaWVudHMsIGV2ZW4gaWYgdGhleSBkb24ndCBjb250YWluIGFueSBTU0kgZGlyZWN0aXZlcy4KLVRoaXMgY2FuIHNsb3cgdGhpbmdzIGRvd24gcXVpdGUgYSBiaXQsIGFuZCBpcyBub3QgYSBnb29kIGlkZWEuPC9wPgotCi08cD5PZiBjb3Vyc2UsIG9uIFdpbmRvd3MsIHRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgYXMgYW4gZXhlY3V0ZSBiaXQgdG8KLXNldCwgc28gdGhhdCBsaW1pdHMgeW91ciBvcHRpb25zIGEgbGl0dGxlLjwvcD4KLQotPHA+SW4gaXRzIGRlZmF1bHQgY29uZmlndXJhdGlvbiwgQXBhY2hlIGRvZXMgbm90IHNlbmQgdGhlIGxhc3QgbW9kaWZpZWQKLWRhdGUgb3IgY29udGVudCBsZW5ndGggSFRUUCBoZWFkZXJzIG9uIFNTSSBwYWdlcywgYmVjYXVzZSB0aGVzZSB2YWx1ZXMgYXJlCi1kaWZmaWN1bHQgdG8gY2FsY3VsYXRlIGZvciBkeW5hbWljIGNvbnRlbnQuICBUaGlzIGNhbiBwcmV2ZW50IHlvdXIKLWRvY3VtZW50IGZyb20gYmVpbmcgY2FjaGVkLCBhbmQgcmVzdWx0IGluIHNsb3dlciBwZXJjZWl2ZWQgY2xpZW50Ci1wZXJmb3JtYW5jZS4gIFRoZXJlIGFyZSB0d28gd2F5cyB0byBzb2x2ZSB0aGlzOjwvcD4KLQotPG9sPiAKLQotPGxpPlVzZSB0aGUgPGNvZGU+WEJpdEhhY2sgRnVsbDwvY29kZT4gY29uZmlndXJhdGlvbi4gIFRoaXMgdGVsbHMKLUFwYWNoZSB0byBkZXRlcm1pbmUgdGhlIGxhc3QgbW9kaWZpZWQgZGF0ZSBieSBsb29raW5nIG9ubHkgYXQgdGhlIGRhdGUKLW9mIHRoZSBvcmlnaW5hbGx5IHJlcXVlc3RlZCBmaWxlLCBpZ25vcmluZyB0aGUgbW9kaWZpY2F0aW9uIGRhdGUgb2YKLWFueSBpbmNsdWRlZCBmaWxlcy4gPC9saT4gCi0KLTxsaT5Vc2UgdGhlIGRpcmVjdGl2ZXMgcHJvdmlkZWQgYnkgPGEKLWhyZWY9Ii4uL21vZC9tb2RfZXhwaXJlcy5odG1sIj5tb2RfZXhwaXJlczwvYT4gdG8gc2V0IGFuIGV4cGxpY2l0Ci1leHBpcmF0aW9uIHRpbWUgb24geW91ciBmaWxlcywgdGhlcmVieSBsZXR0aW5nIGJyb3dzZXJzIGFuZCBwcm94aWVzCi1rbm93IHRoYXQgaXQgaXMgYWNjZXB0YWJsZSB0byBjYWNoZSB0aGVtLiA8L2xpPgotCi08L29sPgotCi0KLTxocj4KLTxoMj48YSBuYW1lPSJiYXNpY3NzaWRpcmVjdGl2ZXMiPkJhc2ljIFNTSSBkaXJlY3RpdmVzPC9hPjwvaDI+Ci0KLTxwPlNTSSBkaXJlY3RpdmVzIGhhdmUgdGhlIGZvbGxvd2luZyBzeW50YXg6PC9wPgotCi08cHJlPgotICAgICAgICAmbHQ7IS0tI2VsZW1lbnQgYXR0cmlidXRlPXZhbHVlIGF0dHJpYnV0ZT12YWx1ZSAuLi4gLS0mZ3Q7Ci08L3ByZT4KLQotPHA+SXQgaXMgZm9ybWF0dGVkIGxpa2UgYW4gSFRNTCBjb21tZW50LCBzbyBpZiB5b3UgZG9uJ3QgaGF2ZSBTU0kKLWNvcnJlY3RseSBlbmFibGVkLCB0aGUgYnJvd3NlciB3aWxsIGlnbm9yZSBpdCwgYnV0IGl0IHdpbGwgc3RpbGwgYmUKLXZpc2libGUgaW4gdGhlIEhUTUwgc291cmNlLiBJZiB5b3UgaGF2ZSBTU0kgY29ycmVjdGx5IGNvbmZpZ3VyZWQsIHRoZQotZGlyZWN0aXZlIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBpdHMgcmVzdWx0cy48L3A+Ci0KLTxwPlRoZSBlbGVtZW50IGNhbiBiZSBvbmUgb2YgYSBudW1iZXIgb2YgdGhpbmdzLCBhbmQgd2UnbGwgdGFsayBzb21lCi1tb3JlIGFib3V0IG1vc3Qgb2YgdGhlc2UgaW4gdGhlIG5leHQgaW5zdGFsbG1lbnQgb2YgdGhpcyBzZXJpZXMuIEZvcgotbm93LCBoZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIHdoYXQgeW91IGNhbiBkbyB3aXRoIFNTSTwvcD4KLQotPGgzPjxhIG5hbWU9InRvZGF5J3NkYXRlIj5Ub2RheSdzIGRhdGU8L2E+PC9oMz4KLQotPHByZT4KLSAgICAgICAgJmx0OyEtLSNlY2hvIHZhcj1EQVRFX0xPQ0FMIC0tJmd0OwotPC9wcmU+Ci0KLTxwPlRoZSA8Y29kZT5lY2hvPC9jb2RlPiBlbGVtZW50IGp1c3Qgc3BpdHMgb3V0IHRoZSB2YWx1ZSBvZiBhCi12YXJpYWJsZS4gVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHN0YW5kYXJkIHZhcmlhYmxlcywgd2hpY2ggaW5jbHVkZSB0aGUKLXdob2xlIHNldCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIENHSSBwcm9ncmFtcy4KLUFsc28sIHlvdSBjYW4gZGVmaW5lIHlvdXIgb3duIHZhcmlhYmxlcyB3aXRoIHRoZSA8Y29kZT5zZXQ8L2NvZGU+Ci1lbGVtZW50LjwvcD4KLQotPHA+SWYgeW91IGRvbid0IGxpa2UgdGhlIGZvcm1hdCBpbiB3aGljaCB0aGUgZGF0ZSBnZXRzIHByaW50ZWQsIHlvdSBjYW4KLXVzZSB0aGUgPGNvZGU+Y29uZmlnPC9jb2RlPiBlbGVtZW50LCB3aXRoIGEgPGNvZGU+dGltZWZtdDwvY29kZT4KLWF0dHJpYnV0ZSwgdG8gbW9kaWZ5IHRoYXQgZm9ybWF0dGluZy48L3A+Ci0KLTxwcmU+Ci0gICAgICAgICZsdDshLS0jY29uZmlnIHRpbWVmbXQ9IiVBICVCICVkLCAlWSIgLS0mZ3Q7Ci0gICAgICAgIFRvZGF5IGlzICZsdDshLS0jZWNobyB2YXI9REFURV9MT0NBTCAtLSZndDsKLTwvcHJlPgotCi08aDM+PGEgbmFtZT0ibW9kaWZpY2F0aW9uZGF0ZW9mdGhlZmlsZSI+TW9kaWZpY2F0aW9uIGRhdGUgb2YgdGhlCi1maWxlPC9hPjwvaDM+Ci0KLTxwcmU+Ci0gICAgICAgIFRoaXMgZG9jdW1lbnQgbGFzdCBtb2RpZmllZCAmbHQ7IS0tI2ZsYXN0bW9kIGZpbGU9ImluZGV4Lmh0bWwiIC0tJmd0OwotPC9wcmU+Ci0KLTxwPlRoaXMgZWxlbWVudCBpcyBhbHNvIHN1YmplY3QgdG8gPGNvZGU+dGltZWZtdDwvY29kZT4gZm9ybWF0Ci1jb25maWd1cmF0aW9ucy48L3A+Ci0KLTxoMz48YSBuYW1lPSJpbmNsdWRpbmd0aGVyZXN1bHRzb2ZhY2dpcHJvZ3JhbSI+SW5jbHVkaW5nIHRoZQotcmVzdWx0cyBvZiBhIENHSSBwcm9ncmFtPC9hPjwvaDM+Ci0KLTxwPlRoaXMgaXMgb25lIG9mIHRoZSBtb3JlIGNvbW1vbiB1c2VzIG9mIFNTSSAtIHRvIG91dHB1dCB0aGUgcmVzdWx0cwotb2YgYSBDR0kgcHJvZ3JhbSwgc3VjaCBhcyBldmVyeWJvZHkncyBmYXZvcml0ZSwgYSBgYGhpdCBjb3VudGVyLicnPC9wPgotCi08cHJlPgotICAgICAgICAmbHQ7IS0tI2luY2x1ZGUgdmlydHVhbD0iL2NnaS1iaW4vY291bnRlci5wbCIgLS0mZ3Q7Ci08L3ByZT4KLQotPGhyPgotPGgyPjxhIG5hbWU9ImFkZGl0aW9uYWxleGFtcGxlcyI+QWRkaXRpb25hbCBleGFtcGxlczwvYT48L2gyPgotCi08cD5Gb2xsb3dpbmcgYXJlIHNvbWUgc3BlY2lmaWMgZXhhbXBsZXMgb2YgdGhpbmdzIHlvdSBjYW4gZG8gaW4geW91cgotSFRNTCBkb2N1bWVudHMgd2l0aCBTU0kuPC9wPgotCi08aHI+Ci08aDI+PGEgbmFtZT0id2hlbndhc3RoaXNkb2N1bWVudG1vZGlmaWVkIj5XaGVuIHdhcyB0aGlzIGRvY3VtZW50Ci1tb2RpZmllZD88L2E+PC9oMj4KLQotPHA+RWFybGllciwgd2UgbWVudGlvbmVkIHRoYXQgeW91IGNvdWxkIHVzZSBTU0kgdG8gaW5mb3JtIHRoZSB1c2VyIHdoZW4KLXRoZSBkb2N1bWVudCB3YXMgbW9zdCByZWNlbnRseSBtb2RpZmllZC4gSG93ZXZlciwgdGhlIGFjdHVhbCBtZXRob2QgZm9yCi1kb2luZyB0aGF0IHdhcyBsZWZ0IHNvbWV3aGF0IGluIHF1ZXN0aW9uLiBUaGUgZm9sbG93aW5nIGNvZGUsIHBsYWNlZCBpbgoteW91ciBIVE1MIGRvY3VtZW50LCB3aWxsIHB1dCBzdWNoIGEgdGltZSBzdGFtcCBvbiB5b3VyIHBhZ2UuIE9mIGNvdXJzZSwKLXlvdSB3aWxsIGhhdmUgdG8gaGF2ZSBTU0kgY29ycmVjdGx5IGVuYWJsZWQsIGFzIGRpc2N1c3NlZCBhYm92ZS48L3A+Ci0KLTxwcmU+Ci0gICAgICAgICZsdDshLS0jY29uZmlnIHRpbWVmbXQ9IiVBICVCICVkLCAlWSIgLS0mZ3Q7Ci0gICAgICAgIFRoaXMgZmlsZSBsYXN0IG1vZGlmaWVkICZsdDshLS0jZmxhc3Rtb2QgZmlsZT0ic3NpLnNodG1sIiAtLSZndDsKLTwvcHJlPgotCi08cD5PZiBjb3Vyc2UsIHlvdSB3aWxsIG5lZWQgdG8gcmVwbGFjZSB0aGUgPGNvZGU+c3NpLnNodG1sPC9jb2RlPiB3aXRoCi10aGUgYWN0dWFsIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCB5b3UncmUgcmVmZXJyaW5nIHRvLiBUaGlzIGNhbiBiZQotaW5jb252ZW5pZW50IGlmIHlvdSdyZSBqdXN0IGxvb2tpbmcgZm9yIGEgZ2VuZXJpYyBwaWVjZSBvZiBjb2RlIHRoYXQKLXlvdSBjYW4gcGFzdGUgaW50byBhbnkgZmlsZSwgc28geW91IHByb2JhYmx5IHdhbnQgdG8gdXNlIHRoZQotPGNvZGU+TEFTVF9NT0RJRklFRDwvY29kZT4gdmFyaWFibGUgaW5zdGVhZDo8L3A+Ci0KLTxwcmU+Ci0gICAgICAgICZsdDshLS0jY29uZmlnIHRpbWVmbXQ9IiVEIiAtLSZndDsKLSAgICAgICAgVGhpcyBmaWxlIGxhc3QgbW9kaWZpZWQgJmx0OyEtLSNlY2hvIHZhcj0iTEFTVF9NT0RJRklFRCIgLS0mZ3Q7Ci08L3ByZT4KLQotPHA+Rm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgPGNvZGU+dGltZWZtdDwvY29kZT4gZm9ybWF0LCBnbyB0byB5b3VyCi1mYXZvcml0ZSBzZWFyY2ggc2l0ZSBhbmQgbG9vayBmb3IgPGNvZGU+Y3RpbWU8L2NvZGU+LiBUaGUgc3ludGF4IGlzIHRoZQotc2FtZS48L3A+Ci0KLTxocj4KLTxoMj48YSBuYW1lPSJpbmNsdWRpbmdhc3RhbmRhcmRmb290ZXIiPkluY2x1ZGluZyBhIHN0YW5kYXJkCi1mb290ZXI8L2E+PC9oMj4KLQotPHA+SWYgeW91IGFyZSBtYW5hZ2luZyBhbnkgc2l0ZSB0aGF0IGlzIG1vcmUgdGhhbiBhIGZldyBwYWdlcywgeW91IG1heQotZmluZCB0aGF0IG1ha2luZyBjaGFuZ2VzIHRvIGFsbCB0aG9zZSBwYWdlcyBjYW4gYmUgYSByZWFsIHBhaW4sCi1wYXJ0aWN1bGFybHkgaWYgeW91IGFyZSB0cnlpbmcgdG8gbWFpbnRhaW4gc29tZSBraW5kIG9mIHN0YW5kYXJkIGxvb2sKLWFjcm9zcyBhbGwgdGhvc2UgcGFnZXMuPC9wPgotCi08cD5Vc2luZyBhbiBpbmNsdWRlIGZpbGUgZm9yIGEgaGVhZGVyIGFuZC9vciBhIGZvb3RlciBjYW4gcmVkdWNlIHRoZQotYnVyZGVuIG9mIHRoZXNlIHVwZGF0ZXMuIFlvdSBqdXN0IGhhdmUgdG8gbWFrZSBvbmUgZm9vdGVyIGZpbGUsIGFuZAotdGhlbiBpbmNsdWRlIGl0IGludG8gZWFjaCBwYWdlIHdpdGggdGhlIDxjb2RlPmluY2x1ZGU8L2NvZGU+IFNTSQotY29tbWFuZC4gVGhlIDxjb2RlPmluY2x1ZGU8L2NvZGU+IGVsZW1lbnQgY2FuIGRldGVybWluZSB3aGF0IGZpbGUgdG8KLWluY2x1ZGUgd2l0aCBlaXRoZXIgdGhlIDxjb2RlPmZpbGU8L2NvZGU+IGF0dHJpYnV0ZSwgb3IgdGhlCi08Y29kZT52aXJ0dWFsPC9jb2RlPiBhdHRyaWJ1dGUuIFRoZSA8Y29kZT5maWxlPC9jb2RlPiBhdHRyaWJ1dGUgaXMgYQotZmlsZSBwYXRoLCA8ZW0+cmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5PC9lbT4uIFRoYXQgbWVhbnMgdGhhdAotaXQgY2Fubm90IGJlIGFuIGFic29sdXRlIGZpbGUgcGF0aCAoc3RhcnRpbmcgd2l0aCAvKSwgbm9yIGNhbiBpdAotY29udGFpbiAuLi8gYXMgcGFydCBvZiB0aGF0IHBhdGguIFRoZSA8Y29kZT52aXJ0dWFsPC9jb2RlPiBhdHRyaWJ1dGUgaXMKLXByb2JhYmx5IG1vcmUgdXNlZnVsLCBhbmQgc2hvdWxkIHNwZWNpZnkgYSBVUkwgcmVsYXRpdmUgdG8gdGhlIGRvY3VtZW50Ci1iZWluZyBzZXJ2ZWQuIEl0IGNhbiBzdGFydCB3aXRoIGEgLywgYnV0IG11c3QgYmUgb24gdGhlIHNhbWUgc2VydmVyIGFzCi10aGUgZmlsZSBiZWluZyBzZXJ2ZWQuPC9wPgotCi08cHJlPgotICAgICAgICAmbHQ7IS0tI2luY2x1ZGUgdmlydHVhbD0iL2Zvb3Rlci5odG1sIiAtLSZndDsKLTwvcHJlPgotCi08cD5JJ2xsIGZyZXF1ZW50bHkgY29tYmluZSB0aGUgbGFzdCB0d28gdGhpbmdzLCBwdXR0aW5nIGEKLTxjb2RlPkxBU1RfTU9ESUZJRUQ8L2NvZGU+IGRpcmVjdGl2ZSBpbnNpZGUgYSBmb290ZXIgZmlsZSB0byBiZQotaW5jbHVkZWQuIFNTSSBkaXJlY3RpdmVzIGNhbiBiZSBjb250YWluZWQgaW4gdGhlIGluY2x1ZGVkIGZpbGUsIGFuZAotaW5jbHVkZXMgY2FuIGJlIG5lc3RlZCAtIHRoYXQgaXMsIHRoZSBpbmNsdWRlZCBmaWxlIGNhbiBpbmNsdWRlIGFub3RoZXIKLWZpbGUsIGFuZCBzbyBvbi48L3A+Ci0KLTxocj4KLTxoMj48YSBuYW1lPSJ3aGF0ZWxzZWNhbmljb25maWciPldoYXQgZWxzZSBjYW4gSSBjb25maWc/PC9hPjwvaDI+Ci0KLTxwPkluIGFkZGl0aW9uIHRvIGJlaW5nIGFibGUgdG8gPGNvZGU+Y29uZmlnPC9jb2RlPiB0aGUgdGltZSBmb3JtYXQsCi15b3UgY2FuIGFsc28gPGNvZGU+Y29uZmlnPC9jb2RlPiB0d28gb3RoZXIgdGhpbmdzLjwvcD4KLQotPHA+VXN1YWxseSwgd2hlbiBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aXRoIHlvdXIgU1NJIGRpcmVjdGl2ZSwgeW91IGdldAotdGhlIG1lc3NhZ2U8L3A+Ci0KLTxwcmU+Ci0gICAgICAgIFthbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoaXMgZGlyZWN0aXZlXQotPC9wcmU+Ci0KLTxwPklmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGF0IG1lc3NhZ2UgdG8gc29tZXRoaW5nIGVsc2UsIHlvdSBjYW4gZG8gc28KLXdpdGggdGhlIDxjb2RlPmVycm1zZzwvY29kZT4gYXR0cmlidXRlIHRvIHRoZSA8Y29kZT5jb25maWc8L2NvZGU+Ci1lbGVtZW50OjwvcD4KLQotPHByZT4KLSAgICAgICAgJmx0OyEtLSNjb25maWcgZXJybXNnPSJbSXQgYXBwZWFycyB0aGF0IHlvdSBkb24ndCBrbm93IGhvdyB0byB1c2UgU1NJXSIgLS0mZ3Q7Ci08L3ByZT4KLQotPHA+SG9wZWZ1bGx5LCBlbmQgdXNlcnMgd2lsbCBuZXZlciBzZWUgdGhpcyBtZXNzYWdlLCBiZWNhdXNlIHlvdSB3aWxsCi1oYXZlIHJlc29sdmVkIGFsbCB0aGUgcHJvYmxlbXMgd2l0aCB5b3VyIFNTSSBkaXJlY3RpdmVzIGJlZm9yZSB5b3VyCi1zaXRlIGdvZXMgbGl2ZS4gKFJpZ2h0Pyk8L3A+Ci0KLTxwPkFuZCB5b3UgY2FuIDxjb2RlPmNvbmZpZzwvY29kZT4gdGhlIGZvcm1hdCBpbiB3aGljaCBmaWxlIHNpemVzIGFyZQotcmV0dXJuZWQgd2l0aCB0aGUgPGNvZGU+c2l6ZWZtdDwvY29kZT4gYXR0cmlidXRlLiBZb3UgY2FuIHNwZWNpZnkKLTxjb2RlPmJ5dGVzPC9jb2RlPiBmb3IgYSBmdWxsIGNvdW50IGluIGJ5dGVzLCBvciA8Y29kZT5hYmJyZXY8L2NvZGU+Ci1mb3IgYW4gYWJicmV2aWF0ZWQgbnVtYmVyIGluIEtiIG9yIE1iLCBhcyBhcHByb3ByaWF0ZS48L3A+Ci0KLTxocj4KLTxoMj48YSBuYW1lPSJleGVjdXRpbmdjb21tYW5kcyI+RXhlY3V0aW5nIGNvbW1hbmRzPC9hPjwvaDI+Ci0KLTxwPkkgZXhwZWN0IHRoYXQgSSdsbCBoYXZlIGFuIGFydGljbGUgc29tZSB0aW1lIGluIHRoZSBjb21pbmcgbW9udGhzCi1hYm91dCB1c2luZyBTU0kgd2l0aCBzbWFsbCBDR0kgcHJvZ3JhbXMuIEZvciBub3csIGhlcmUncyBzb21ldGhpbmcgZWxzZQotdGhhdCB5b3UgY2FuIGRvIHdpdGggdGhlIDxjb2RlPmV4ZWM8L2NvZGU+IGVsZW1lbnQuIFlvdSBjYW4gYWN0dWFsbHkKLWhhdmUgU1NJIGV4ZWN1dGUgYSBjb21tYW5kIHVzaW5nIHRoZSBzaGVsbCAoPGNvZGU+L2Jpbi9zaDwvY29kZT4sIHRvIGJlCi1wcmVjaXNlIC0gb3IgdGhlIERPUyBzaGVsbCwgaWYgeW91J3JlIG9uIFdpbjMyKS4gVGhlIGZvbGxvd2luZywgZm9yCi1leGFtcGxlLCB3aWxsIGdpdmUgeW91IGEgZGlyZWN0b3J5IGxpc3RpbmcuPC9wPgotCi08cHJlPgotICAgICAgICAmbHQ7cHJlJmd0OwotICAgICAgICAmbHQ7IS0tI2V4ZWMgY21kPSJscyIgLS0mZ3Q7Ci0gICAgICAgICZsdDsvcHJlJmd0OwotPC9wcmU+Ci0KLTxwPm9yLCBvbiBXaW5kb3dzPC9wPgotCi08cHJlPgotICAgICAgICAmbHQ7cHJlJmd0OwotICAgICAgICAmbHQ7IS0tI2V4ZWMgY21kPSJkaXIiIC0tJmd0OwotICAgICAgICAmbHQ7L3ByZSZndDsKLTwvcHJlPgotCi08cD5Zb3UgbWlnaHQgbm90aWNlIHNvbWUgc3RyYW5nZSBmb3JtYXR0aW5nIHdpdGggdGhpcyBkaXJlY3RpdmUgb24KLVdpbmRvd3MsIGJlY2F1c2UgdGhlIG91dHB1dCBmcm9tIDxjb2RlPmRpcjwvY29kZT4gY29udGFpbnMgdGhlIHN0cmluZwotYGAmbHQ7PGNvZGU+ZGlyPC9jb2RlPiZndDsnJyBpbiBpdCwgd2hpY2ggY29uZnVzZXMgYnJvd3NlcnMuPC9wPgotCi08cD5Ob3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIGV4Y2VlZGluZ2x5IGRhbmdlcm91cywgYXMgaXQgd2lsbCBleGVjdXRlCi13aGF0ZXZlciBjb2RlIGhhcHBlbnMgdG8gYmUgZW1iZWRkZWQgaW4gdGhlIDxjb2RlPmV4ZWM8L2NvZGU+IHRhZy4gSWYKLXlvdSBoYXZlIGFueSBzaXR1YXRpb24gd2hlcmUgdXNlcnMgY2FuIGVkaXQgY29udGVudCBvbiB5b3VyIHdlYiBwYWdlcywKLXN1Y2ggYXMgd2l0aCBhIGBgZ3Vlc3Rib29rJycsIGZvciBleGFtcGxlLCBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSB0aGlzCi1mZWF0dXJlIGRpc2FibGVkLiBZb3UgY2FuIGFsbG93IFNTSSwgYnV0IG5vdCB0aGUgPGNvZGU+ZXhlYzwvY29kZT4KLWZlYXR1cmUsIHdpdGggdGhlIDxjb2RlPkluY2x1ZGVzTk9FWEVDPC9jb2RlPiBhcmd1bWVudCB0byB0aGUKLTxjb2RlPk9wdGlvbnM8L2NvZGU+IGRpcmVjdGl2ZS48L3A+Ci0KLTxocj4KLTxoMj48YSBuYW1lPSJhZHZhbmNlZHNzaXRlY2huaXF1ZXMiPkFkdmFuY2VkIFNTSSB0ZWNobmlxdWVzPC9hPjwvaDI+Ci0KLTxwPkluIGFkZGl0aW9uIHRvIHNwaXR0aW5nIG91dCBjb250ZW50LCBBcGFjaGUgU1NJIGdpdmVzIHlvdSB0aGUgb3B0aW9uCi1vZiBzZXR0aW5nIHZhcmlhYmxlcywgYW5kIHVzaW5nIHRob3NlIHZhcmlhYmxlcyBpbiBjb21wYXJpc29ucyBhbmQKLWNvbmRpdGlvbmFscy48L3A+Ci0KLTxoMz48YSBuYW1lPSJjYXZlYXQiPkNhdmVhdDwvYT48L2gzPgotCi08cD5Nb3N0IG9mIHRoZSBmZWF0dXJlcyBkaXNjdXNzZWQgaW4gdGhpcyBhcnRpY2xlIGFyZSBvbmx5IGF2YWlsYWJsZSB0bwoteW91IGlmIHlvdSBhcmUgcnVubmluZyBBcGFjaGUgMS4yIG9yIGxhdGVyLiBPZiBjb3Vyc2UsIGlmIHlvdSBhcmUgbm90Ci1ydW5uaW5nIEFwYWNoZSAxLjIgb3IgbGF0ZXIsIHlvdSBuZWVkIHRvIHVwZ3JhZGUgaW1tZWRpYXRlbHksIGlmIG5vdAotc29vbmVyLiBHbyBvbi4gRG8gaXQgbm93LiBXZSdsbCB3YWl0LjwvcD4KLQotPGhyPgotPGgyPjxhIG5hbWU9InNldHRpbmd2YXJpYWJsZXMiPlNldHRpbmcgdmFyaWFibGVzPC9hPjwvaDI+Ci0KLTxwPlVzaW5nIHRoZSA8Y29kZT5zZXQ8L2NvZGU+IGRpcmVjdGl2ZSwgeW91IGNhbiBzZXQgdmFyaWFibGVzIGZvcgotbGF0ZXIgdXNlLiBXZSdsbCBuZWVkIHRoaXMgbGF0ZXIgaW4gdGhlIGRpc2N1c3Npb24sIHNvIHdlJ2xsIHRhbGsgYWJvdXQKLWl0IGhlcmUuIFRoZSBzeW50YXggb2YgdGhpcyBpcyBhcyBmb2xsb3dzOjwvcD4KLQotPHByZT4KLSAgICAgICAgJmx0OyEtLSNzZXQgdmFyPSJuYW1lIiB2YWx1ZT0iUmljaCIgLS0mZ3Q7Ci08L3ByZT4KLQotPHA+SW4gYWRkaXRpb24gdG8gbWVyZWx5IHNldHRpbmcgdmFsdWVzIGxpdGVyYWxseSBsaWtlIHRoYXQsIHlvdSBjYW4KLXVzZSBhbnkgb3RoZXIgdmFyaWFibGUsIGluY2x1ZGluZywgZm9yIGV4YW1wbGUsIGVudmlyb25tZW50IHZhcmlhYmxlcywKLW9yIHNvbWUgb2YgdGhlIHZhcmlhYmxlcyB3ZSBkaXNjdXNzZWQgaW4gdGhlIGxhc3QgYXJ0aWNsZSAobGlrZQotPGNvZGU+TEFTVF9NT0RJRklFRDwvY29kZT4sIGZvciBleGFtcGxlKSB0byBnaXZlIHZhbHVlcyB0byB5b3VyCi12YXJpYWJsZXMuIFlvdSB3aWxsIHNwZWNpZnkgdGhhdCBzb21ldGhpbmcgaXMgYSB2YXJpYWJsZSwgcmF0aGVyIHRoYW4gYQotbGl0ZXJhbCBzdHJpbmcsIGJ5IHVzaW5nIHRoZSBkb2xsYXIgc2lnbiAoJCkgYmVmb3JlIHRoZSBuYW1lIG9mIHRoZQotdmFyaWFibGUuPC9wPgotCi08cHJlPgotICAgICAgICAmbHQ7IS0tI3NldCB2YXI9Im1vZGlmaWVkIiB2YWx1ZT0iJExBU1RfTU9ESUZJRUQiIC0tJmd0OwotPC9wcmU+Ci0KLTxwPlRvIHB1dCBhIGxpdGVyYWwgZG9sbGFyIHNpZ24gaW50byB0aGUgdmFsdWUgb2YgeW91ciB2YXJpYWJsZSwgeW91Ci1uZWVkIHRvIGVzY2FwZSB0aGUgZG9sbGFyIHNpZ24gd2l0aCBhIGJhY2tzbGFzaC48L3A+Ci0KLTxwcmU+Ci0gICAgICAgICZsdDshLS0jc2V0IHZhcj0iY29zdCIgdmFsdWU9IlwkMTAwIiAtLSZndDsKLTwvcHJlPgotCi08cD5GaW5hbGx5LCBpZiB5b3Ugd2FudCB0byBwdXQgYSB2YXJpYWJsZSBpbiB0aGUgbWlkc3Qgb2YgYSBsb25nZXIKLXN0cmluZywgYW5kIHRoZXJlJ3MgYSBjaGFuY2UgdGhhdCB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgd2lsbCBydW4gdXAKLWFnYWluc3Qgc29tZSBvdGhlciBjaGFyYWN0ZXJzLCBhbmQgdGh1cyBiZSBjb25mdXNlZCB3aXRoIHRob3NlCi1jaGFyYWN0ZXJzLCB5b3UgY2FuIHBsYWNlIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBpbiBicmFjZXMsIHRvIHJlbW92ZQotdGhpcyBjb25mdXNpb24uIChJdCdzIGhhcmQgdG8gY29tZSB1cCB3aXRoIGEgcmVhbGx5IGdvb2QgZXhhbXBsZSBvZgotdGhpcywgYnV0IGhvcGVmdWxseSB5b3UnbGwgZ2V0IHRoZSBwb2ludC4pPC9wPgotCi08cHJlPgotICAgICAgICAmbHQ7IS0tI3NldCB2YXI9ImRhdGUiIHZhbHVlPSIke0RBVEVfTE9DQUx9XyR7REFURV9HTVR9IiAtLSZndDsKLTwvcHJlPgotCi08aHI+Ci08aDI+PGEgbmFtZT0iY29uZGl0aW9uYWxleHByZXNzaW9ucyI+Q29uZGl0aW9uYWwgZXhwcmVzc2lvbnM8L2E+PC9oMj4KLQotPHA+Tm93IHRoYXQgd2UgaGF2ZSB2YXJpYWJsZXMsIGFuZCBhcmUgYWJsZSB0byBzZXQgYW5kIGNvbXBhcmUgdGhlaXIKLXZhbHVlcywgd2UgY2FuIHVzZSB0aGVtIHRvIGV4cHJlc3MgY29uZGl0aW9uYWxzLiBUaGlzIGxldHMgU1NJIGJlIGEKLXRpbnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2Ugb2Ygc29ydHMuIDxjb2RlPm1vZF9pbmNsdWRlPC9jb2RlPiBwcm92aWRlcwotYW4gPGNvZGU+aWY8L2NvZGU+LCA8Y29kZT5lbGlmPC9jb2RlPiwgPGNvZGU+ZWxzZTwvY29kZT4sCi08Y29kZT5lbmRpZjwvY29kZT4gc3RydWN0dXJlIGZvciBidWlsZGluZyBjb25kaXRpb25hbCBzdGF0ZW1lbnRzLiBUaGlzCi1hbGxvd3MgeW91IHRvIGVmZmVjdGl2ZWx5IGdlbmVyYXRlIG11bHRpcGxlIGxvZ2ljYWwgcGFnZXMgb3V0IG9mIG9uZQotYWN0dWFsIHBhZ2UuPC9wPgotCi08cD5UaGUgc3RydWN0dXJlIG9mIHRoaXMgY29uZGl0aW9uYWwgY29uc3RydWN0IGlzOjwvcD4KLQotPHByZT4KLSAgICAgICAgJmx0OyEtLSNpZiBleHByPSJ0ZXN0X2NvbmRpdGlvbiIgLS0mZ3Q7Ci0gICAgJmx0OyEtLSNlbGlmIGV4cHI9InRlc3RfY29uZGl0aW9uIiAtLSZndDsKLSAgICAmbHQ7IS0tI2Vsc2UgLS0mZ3Q7Ci0gICAgJmx0OyEtLSNlbmRpZiAtLSZndDsKLTwvcHJlPgotCi08cD5BIDxlbT50ZXN0X2NvbmRpdGlvbjwvZW0+IGNhbiBiZSBhbnkgc29ydCBvZiBsb2dpY2FsIGNvbXBhcmlzb24gLQotZWl0aGVyIGNvbXBhcmluZyB2YWx1ZXMgdG8gb25lIGFub3RoZXIsIG9yIHRlc3RpbmcgdGhlIGBgdHJ1dGgnJyBvZiBhCi1wYXJ0aWN1bGFyIHZhbHVlLiAoQSBnaXZlbiBzdHJpbmcgaXMgdHJ1ZSBpZiBpdCBpcyBub25lbXB0eS4pIEZvciBhCi1mdWxsIGxpc3Qgb2YgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzIGF2YWlsYWJsZSB0byB5b3UsIHNlZSB0aGUKLTxjb2RlPm1vZF9pbmNsdWRlPC9jb2RlPiBkb2N1bWVudGF0aW9uLiBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIGhvdwotb25lIG1pZ2h0IHVzZSB0aGlzIGNvbnN0cnVjdC48L3A+Ci0KLTxwPkluIHlvdXIgY29uZmlndXJhdGlvbiBmaWxlLCB5b3UgY291bGQgcHV0IHRoZSBmb2xsb3dpbmcgbGluZTo8L3A+Ci0KLTxwcmU+Ci0gICAgICAgIEJyb3dzZXJNYXRjaE5vQ2FzZSBtYWNpbnRvc2ggTWFjCi0gICAgICAgIEJyb3dzZXJNYXRjaE5vQ2FzZSBNU0lFIEludGVybmV0RXhwbG9yZXIKLTwvcHJlPgotCi08cD5UaGlzIHdpbGwgc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBgYE1hYycnIGFuZCBgYEludGVybmV0RXhwbG9yZXInJwotdG8gdHJ1ZSwgaWYgdGhlIGNsaWVudCBpcyBydW5uaW5nIEludGVybmV0IEV4cGxvcmVyIG9uIGEgTWFjaW50b3NoLjwvcD4KLQotPHA+VGhlbiwgaW4geW91ciBTU0ktZW5hYmxlZCBkb2N1bWVudCwgeW91IG1pZ2h0IGRvIHRoZSBmb2xsb3dpbmc6PC9wPgotCi08cHJlPgotICAgICAgICAmbHQ7IS0tI2lmIGV4cHI9IiR7TWFjfSAmYW1wOyZhbXA7ICR7SW50ZXJuZXRFeHBsb3Jlcn0iIC0tJmd0OwotICAgICAgICBBcG9sb2dldGljIHRleHQgZ29lcyBoZXJlCi0gICAgICAgICZsdDshLS0jZWxzZSAtLSZndDsKLSAgICAgICAgQ29vbCBKYXZhU2NyaXB0IGNvZGUgZ29lcyBoZXJlCi0gICAgICAgICZsdDshLS0jZW5kaWYgLS0mZ3Q7Ci08L3ByZT4KLQotPHA+Tm90IHRoYXQgSSBoYXZlIGFueXRoaW5nIGFnYWluc3QgSUUgb24gTWFjcyAtIEkganVzdCBzdHJ1Z2dsZWQgZm9yIGEKLWZldyBob3VycyBsYXN0IHdlZWsgdHJ5aW5nIHRvIGdldCBzb21lIEphdmFTY3JpcHQgd29ya2luZyBvbiBJRSBvbiBhCi1NYWMsIHdoZW4gaXQgd2FzIHdvcmtpbmcgZXZlcnl3aGVyZSBlbHNlLiBUaGUgYWJvdmUgd2FzIHRoZSBpbnRlcmltCi13b3JrYXJvdW5kLjwvcD4KLQotPHA+QW55IG90aGVyIHZhcmlhYmxlIChlaXRoZXIgb25lcyB0aGF0IHlvdSBkZWZpbmUsIG9yIG5vcm1hbAotZW52aXJvbm1lbnQgdmFyaWFibGVzKSBjYW4gYmUgdXNlZCBpbiBjb25kaXRpb25hbCBzdGF0ZW1lbnRzLiBXaXRoCi1BcGFjaGUncyBhYmlsaXR5IHRvIHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2l0aCB0aGUKLTxjb2RlPlNldEVudklmPC9jb2RlPiBkaXJlY3RpdmVzLCBhbmQgb3RoZXIgcmVsYXRlZCBkaXJlY3RpdmVzLCB0aGlzCi1mdW5jdGlvbmFsaXR5IGNhbiBsZXQgeW91IGRvIHNvbWUgcHJldHR5IGludm9sdmVkIGR5bmFtaWMgc3R1ZmYgd2l0aG91dAotZXZlciByZXNvcnRpbmcgdG8gQ0dJLjwvcD4KLQotPGhyPgotPGgyPjxhIG5hbWU9ImNvbmNsdXNpb24iPkNvbmNsdXNpb248L2E+PC9oMj4KLQotPHA+U1NJIGlzIGNlcnRhaW5seSBub3QgYSByZXBsYWNlbWVudCBmb3IgQ0dJLCBvciBvdGhlciB0ZWNobm9sb2dpZXMKLXVzZWQgZm9yIGdlbmVyYXRpbmcgZHluYW1pYyB3ZWIgcGFnZXMuIEJ1dCBpdCBpcyBhIGdyZWF0IHdheSB0byBhZGQKLXNtYWxsIGFtb3VudHMgb2YgZHluYW1pYyBjb250ZW50IHRvIHBhZ2VzLCB3aXRob3V0IGRvaW5nIGEgbG90IG9mIGV4dHJhCi13b3JrLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvaG93dG8vc3NpLmh0bWwuZW4gYi9kb2NzL21hbnVhbC9ob3d0by9zc2kuaHRtbC5lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJkMmExZi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9ob3d0by9zc2kuaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDUxOSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFwYWNoZSBUdXRvcmlhbDogSW50cm9kdWN0aW9uIHRvIFNlcnZlciBTaWRlIEluY2x1ZGVzPC90aXRsZT4KLTxsaW5rIHJldj0ibWFkZSIgaHJlZj0ibWFpbHRvOnJib3dlbkByY2Jvd2VuLmNvbSI+Ci08L2hlYWQ+Ci08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB0ZXh0PSIjMDAwMDAwIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzAwMDA4MCIKLWFsaW5rPSIjRkYwMDAwIj4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08aDEgYWxpZ249IkNFTlRFUiI+QXBhY2hlIFR1dG9yaWFsOiBJbnRyb2R1Y3Rpb24gdG8gU2VydmVyIFNpZGUKLUluY2x1ZGVzPC9oMT4KLQotPGEgbmFtZT0iX19pbmRleF9fIj48L2E+IDwhLS0gSU5ERVggQkVHSU4gLS0+Ci0gCi0KLTx1bD4KLTxsaT48YSBocmVmPQotIiNhcGFjaGV0dXRvcmlhbDppbnRyb2R1Y3Rpb250b3NlcnZlcnNpZGVpbmNsdWRlcyI+QXBhY2hlCi1UdXRvcmlhbDogSW50cm9kdWN0aW9uIHRvIFNlcnZlciBTaWRlIEluY2x1ZGVzPC9hPjwvbGk+Ci0KLTxsaT48YSBocmVmPSIjd2hhdGFyZXNzaSI+V2hhdCBhcmUgU1NJPzwvYT48L2xpPgotCi08bGk+PGEgaHJlZj0iI2NvbmZpZ3VyaW5neW91cnNlcnZlcnRvcGVybWl0c3NpIj5Db25maWd1cmluZyB5b3VyCi1zZXJ2ZXIgdG8gcGVybWl0IFNTSTwvYT48L2xpPgotCi08bGk+PGEgaHJlZj0iI2Jhc2ljc3NpZGlyZWN0aXZlcyI+QmFzaWMgU1NJIGRpcmVjdGl2ZXM8L2E+Ci0KLTx1bD4KLSAgPGxpPjxhIGhyZWY9IiN0b2RheSdzZGF0ZSI+VG9kYXkncyBkYXRlPC9hPjwvbGk+Ci0KLSAgPGxpPjxhIGhyZWY9IiNtb2RpZmljYXRpb25kYXRlb2Z0aGVmaWxlIj5Nb2RpZmljYXRpb24gZGF0ZSBvZiB0aGUKLWZpbGU8L2E+PC9saT4KLQotICA8bGk+PGEgaHJlZj0iI2luY2x1ZGluZ3RoZXJlc3VsdHNvZmFjZ2lwcm9ncmFtIj5JbmNsdWRpbmcgdGhlCi1yZXN1bHRzIG9mIGEgQ0dJIHByb2dyYW08L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotCi08bGk+PGEgaHJlZj0iI2FkZGl0aW9uYWxleGFtcGxlcyI+QWRkaXRpb25hbCBleGFtcGxlczwvYT4KLQotPHVsPgotPGxpPjxhIGhyZWY9IiN3aGVud2FzdGhpc2RvY3VtZW50bW9kaWZpZWQiPldoZW4gd2FzIHRoaXMgZG9jdW1lbnQKLW1vZGlmaWVkPzwvYT48L2xpPgotCi08bGk+PGEgaHJlZj0iI2luY2x1ZGluZ2FzdGFuZGFyZGZvb3RlciI+SW5jbHVkaW5nIGEgc3RhbmRhcmQKLWZvb3RlcjwvYT48L2xpPgotCi08bGk+PGEgaHJlZj0iI3doYXRlbHNlY2FuaWNvbmZpZyI+V2hhdCBlbHNlIGNhbiBJIGNvbmZpZz88L2E+PC9saT4KLQotPGxpPjxhIGhyZWY9IiNleGVjdXRpbmdjb21tYW5kcyI+RXhlY3V0aW5nIGNvbW1hbmRzPC9hPjwvbGk+Ci08L3VsPgotPC9saT4KLQotPGxpPjxhIGhyZWY9IiNhZHZhbmNlZHNzaXRlY2huaXF1ZXMiPkFkdmFuY2VkIFNTSSB0ZWNobmlxdWVzPC9hPgotCi08dWw+Ci08bGk+PGEgaHJlZj0iI3NldHRpbmd2YXJpYWJsZXMiPlNldHRpbmcgdmFyaWFibGVzPC9hPjwvbGk+Ci0KLTxsaT48YSBocmVmPSIjY29uZGl0aW9uYWxleHByZXNzaW9ucyI+Q29uZGl0aW9uYWwgZXhwcmVzc2lvbnM8L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotCi08bGk+PGEgaHJlZj0iI2NvbmNsdXNpb24iPkNvbmNsdXNpb248L2E+PC9saT4KLTwvdWw+Ci0KLTwhLS0gSU5ERVggRU5EIC0tPgotPGhyPgotPGgyPjxhIG5hbWU9Ci0iYXBhY2hldHV0b3JpYWw6aW50cm9kdWN0aW9udG9zZXJ2ZXJzaWRlaW5jbHVkZXMiPkFwYWNoZQotVHV0b3JpYWw6IEludHJvZHVjdGlvbiB0byBTZXJ2ZXIgU2lkZSBJbmNsdWRlczwvYT48L2gyPgotCi08dGFibGUgYm9yZGVyPSIxIj4KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+PHN0cm9uZz5SZWxhdGVkIE1vZHVsZXM8L3N0cm9uZz48YnI+Ci08YnI+Ci0gPGEgaHJlZj0iLi4vbW9kL21vZF9pbmNsdWRlLmh0bWwiPm1vZF9pbmNsdWRlPC9hPjxicj4KLTxhIGhyZWY9Ii4uL21vZC9tb2RfY2dpLmh0bWwiPm1vZF9jZ2k8L2E+PGJyPgotPGEgaHJlZj0iLi4vbW9kL21vZF9leHBpcmVzLmh0bWwiPm1vZF9leHBpcmVzPC9hPjxicj4KLSA8L3RkPgotPHRkIHZhbGlnbj0idG9wIj48c3Ryb25nPlJlbGF0ZWQgRGlyZWN0aXZlczwvc3Ryb25nPjxicj4KLTxicj4KLSA8YSBocmVmPSIuLi9tb2QvY29yZS5odG1sI29wdGlvbnMiPk9wdGlvbnM8L2E+PGJyPgotPGEgaHJlZj0iLi4vbW9kL21vZF9pbmNsdWRlLmh0bWwjeGJpdGhhY2siPlhCaXRIYWNrPC9hPjxicj4KLTxhIGhyZWY9Ii4uL21vZC9tb2RfbWltZS5odG1sI2FkZHR5cGUiPkFkZFR5cGU8L2E+PGJyPgotPGEgaHJlZj0iLi4vbW9kL21vZF9taW1lLmh0bWwjYWRkaGFuZGxlciI+QWRkSGFuZGxlcjwvYT48YnI+Ci08YSBocmVmPQotIi4uL21vZC9tb2Rfc2V0ZW52aWYuaHRtbCNCcm93c2VyTWF0Y2hOb0Nhc2UiPkJyb3dzZXJNYXRjaE5vQ2FzZTwvYT48YnI+Ci0KLSA8L3RkPgotPC90cj4KLTwvdGFibGU+Ci0KLTxwPlRoaXMgSE9XVE8gZmlyc3QgYXBwZWFyZWQgaW4gQXBhY2hlIFRvZGF5Ci0oaHR0cDovL3d3dy5hcGFjaGV0b2RheS5jb20vKSBhcyBhIHNlcmllcyBvZiB0aHJlZSBhcnRpY2xlcy4gVGhleQotYXBwZWFyIGhlcmUgYnkgYXJyYW5nZW1lbnQgd2l0aCBBcGFjaGVUb2RheSBhbmQgSW50ZXJuZXQuY29tLjwvcD4KLQotPHA+VGhpcyBhcnRpY2xlIGRlYWxzIHdpdGggU2VydmVyIFNpZGUgSW5jbHVkZXMsIHVzdWFsbHkgY2FsbGVkIHNpbXBseQotU1NJLiBJbiB0aGlzIGFydGljbGUsIEknbGwgdGFsayBhYm91dCBjb25maWd1cmluZyB5b3VyIHNlcnZlciB0byBwZXJtaXQKLVNTSSwgYW5kIGludHJvZHVjZSBzb21lIGJhc2ljIFNTSSB0ZWNobmlxdWVzIGZvciBhZGRpbmcgZHluYW1pYyBjb250ZW50Ci10byB5b3VyIGV4aXN0aW5nIEhUTUwgcGFnZXMuPC9wPgotCi08cD5JbiB0aGUgbGF0dGVyIHBhcnQgb2YgdGhlIGFydGljbGUsIHdlJ2xsIHRhbGsgYWJvdXQgc29tZSBvZiB0aGUKLXNvbWV3aGF0IG1vcmUgYWR2YW5jZWQgdGhpbmdzIHRoYXQgY2FuIGJlIGRvbmUgd2l0aCBTU0ksIHN1Y2ggYXMKLWNvbmRpdGlvbmFsIHN0YXRlbWVudHMgaW4geW91ciBTU0kgZGlyZWN0aXZlcy48L3A+Ci0KLTxocj4KLTxoMj48YSBuYW1lPSJ3aGF0YXJlc3NpIj5XaGF0IGFyZSBTU0k/PC9hPjwvaDI+Ci0KLTxwPlNTSSAoU2VydmVyIFNpZGUgSW5jbHVkZXMpIGFyZSBkaXJlY3RpdmVzIHRoYXQgYXJlIHBsYWNlZCBpbiBIVE1MCi1wYWdlcywgYW5kIGV2YWx1YXRlZCBvbiB0aGUgc2VydmVyIHdoaWxlIHRoZSBwYWdlcyBhcmUgYmVpbmcgc2VydmVkLgotVGhleSBsZXQgeW91IGFkZCBkeW5hbWljYWxseSBnZW5lcmF0ZWQgY29udGVudCB0byBhbiBleGlzdGluZyBIVE1MCi1wYWdlLCB3aXRob3V0IGhhdmluZyB0byBzZXJ2ZSB0aGUgZW50aXJlIHBhZ2UgdmlhIGEgQ0dJIHByb2dyYW0sIG9yCi1vdGhlciBkeW5hbWljIHRlY2hub2xvZ3kuPC9wPgotCi08cD5UaGUgZGVjaXNpb24gb2Ygd2hlbiB0byB1c2UgU1NJLCBhbmQgd2hlbiB0byBoYXZlIHlvdXIgcGFnZSBlbnRpcmVseQotZ2VuZXJhdGVkIGJ5IHNvbWUgcHJvZ3JhbSwgaXMgdXN1YWxseSBhIG1hdHRlciBvZiBob3cgbXVjaCBvZiB0aGUgcGFnZQotaXMgc3RhdGljLCBhbmQgaG93IG11Y2ggbmVlZHMgdG8gYmUgcmVjYWxjdWxhdGVkIGV2ZXJ5IHRpbWUgdGhlIHBhZ2UgaXMKLXNlcnZlZC4gU1NJIGlzIGEgZ3JlYXQgd2F5IHRvIGFkZCBzbWFsbCBwaWVjZXMgb2YgaW5mb3JtYXRpb24sIHN1Y2ggYXMKLXRoZSBjdXJyZW50IHRpbWUuIEJ1dCBpZiBhIG1ham9yaXR5IG9mIHlvdXIgcGFnZSBpcyBiZWluZyBnZW5lcmF0ZWQgYXQKLXRoZSB0aW1lIHRoYXQgaXQgaXMgc2VydmVkLCB5b3UgbmVlZCB0byBsb29rIGZvciBzb21lIG90aGVyCi1zb2x1dGlvbi48L3A+Ci0KLTxocj4KLTxoMj48YSBuYW1lPSJjb25maWd1cmluZ3lvdXJzZXJ2ZXJ0b3Blcm1pdHNzaSI+Q29uZmlndXJpbmcgeW91cgotc2VydmVyIHRvIHBlcm1pdCBTU0k8L2E+PC9oMj4KLQotPHA+VG8gcGVybWl0IFNTSSBvbiB5b3VyIHNlcnZlciwgeW91IG11c3QgaGF2ZSB0aGUgZm9sbG93aW5nIGRpcmVjdGl2ZQotZWl0aGVyIGluIHlvdXIgPGNvZGU+aHR0cGQuY29uZjwvY29kZT4gZmlsZSwgb3IgaW4gYQotPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBmaWxlOjwvcD4KLQotPHByZT4KLSAgICAgICAgT3B0aW9ucyArSW5jbHVkZXMKLTwvcHJlPgotCi08cD5UaGlzIHRlbGxzIEFwYWNoZSB0aGF0IHlvdSB3YW50IHRvIHBlcm1pdCBmaWxlcyB0byBiZSBwYXJzZWQgZm9yIFNTSQotZGlyZWN0aXZlcy48L3A+Ci0KLTxwPk5vdCBqdXN0IGFueSBmaWxlIGlzIHBhcnNlZCBmb3IgU1NJIGRpcmVjdGl2ZXMuIFlvdSBoYXZlIHRvIHRlbGwKLUFwYWNoZSB3aGljaCBmaWxlcyBzaG91bGQgYmUgcGFyc2VkLiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gZG8gdGhpcy4gWW91Ci1jYW4gdGVsbCBBcGFjaGUgdG8gcGFyc2UgYW55IGZpbGUgd2l0aCBhIHBhcnRpY3VsYXIgZmlsZSBleHRlbnNpb24sCi1zdWNoIGFzIDxjb2RlPi5zaHRtbDwvY29kZT4sIHdpdGggdGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzOjwvcD4KLQotPHByZT4KLSAgICAgICAgQWRkVHlwZSB0ZXh0L2h0bWwgLnNodG1sCi0gICAgICAgIEFkZEhhbmRsZXIgc2VydmVyLXBhcnNlZCAuc2h0bWwKLTwvcHJlPgotCi08cD5PbmUgZGlzYWR2YW50YWdlIHRvIHRoaXMgYXBwcm9hY2ggaXMgdGhhdCBpZiB5b3Ugd2FudGVkIHRvIGFkZCBTU0kKLWRpcmVjdGl2ZXMgdG8gYW4gZXhpc3RpbmcgcGFnZSwgeW91IHdvdWxkIGhhdmUgdG8gY2hhbmdlIHRoZSBuYW1lIG9mCi10aGF0IHBhZ2UsIGFuZCBhbGwgbGlua3MgdG8gdGhhdCBwYWdlLCBpbiBvcmRlciB0byBnaXZlIGl0IGEKLTxjb2RlPi5zaHRtbDwvY29kZT4gZXh0ZW5zaW9uLCBzbyB0aGF0IHRob3NlIGRpcmVjdGl2ZXMgd291bGQgYmUKLWV4ZWN1dGVkLjwvcD4KLQotPHA+VGhlIG90aGVyIG1ldGhvZCBpcyB0byB1c2UgdGhlIDxjb2RlPlhCaXRIYWNrPC9jb2RlPiBkaXJlY3RpdmU6PC9wPgotCi08cHJlPgotICAgICAgICBYQml0SGFjayBvbgotPC9wcmU+Ci0KLTxwPjxjb2RlPlhCaXRIYWNrPC9jb2RlPiB0ZWxscyBBcGFjaGUgdG8gcGFyc2UgZmlsZXMgZm9yIFNTSSBkaXJlY3RpdmVzCi1pZiB0aGV5IGhhdmUgdGhlIGV4ZWN1dGUgYml0IHNldC4gU28sIHRvIGFkZCBTU0kgZGlyZWN0aXZlcyB0byBhbgotZXhpc3RpbmcgcGFnZSwgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIGNoYW5nZSB0aGUgZmlsZSBuYW1lLCB5b3Ugd291bGQKLWp1c3QgbmVlZCB0byBtYWtlIHRoZSBmaWxlIGV4ZWN1dGFibGUgdXNpbmcgPGNvZGU+Y2htb2Q8L2NvZGU+LjwvcD4KLQotPHByZT4KLSAgICAgICAgY2htb2QgK3ggcGFnZW5hbWUuaHRtbAotPC9wcmU+Ci0KLTxwPkEgYnJpZWYgY29tbWVudCBhYm91dCB3aGF0IG5vdCB0byBkby4gWW91J2xsIG9jY2FzaW9uYWxseSBzZWUgcGVvcGxlCi1yZWNvbW1lbmRpbmcgdGhhdCB5b3UganVzdCB0ZWxsIEFwYWNoZSB0byBwYXJzZSBhbGwgPGNvZGU+Lmh0bWw8L2NvZGU+Ci1maWxlcyBmb3IgU1NJLCBzbyB0aGF0IHlvdSBkb24ndCBoYXZlIHRvIG1lc3Mgd2l0aCA8Y29kZT4uc2h0bWw8L2NvZGU+Ci1maWxlIG5hbWVzLiBUaGVzZSBmb2xrcyBoYXZlIHBlcmhhcHMgbm90IGhlYXJkIGFib3V0Ci08Y29kZT5YQml0SGFjazwvY29kZT4uIFRoZSB0aGluZyB0byBrZWVwIGluIG1pbmQgaXMgdGhhdCwgYnkgZG9pbmcKLXRoaXMsIHlvdSdyZSByZXF1aXJpbmcgdGhhdCBBcGFjaGUgcmVhZCB0aHJvdWdoIGV2ZXJ5IHNpbmdsZSBmaWxlIHRoYXQKLWl0IHNlbmRzIG91dCB0byBjbGllbnRzLCBldmVuIGlmIHRoZXkgZG9uJ3QgY29udGFpbiBhbnkgU1NJIGRpcmVjdGl2ZXMuCi1UaGlzIGNhbiBzbG93IHRoaW5ncyBkb3duIHF1aXRlIGEgYml0LCBhbmQgaXMgbm90IGEgZ29vZCBpZGVhLjwvcD4KLQotPHA+T2YgY291cnNlLCBvbiBXaW5kb3dzLCB0aGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIGFuIGV4ZWN1dGUgYml0IHRvCi1zZXQsIHNvIHRoYXQgbGltaXRzIHlvdXIgb3B0aW9ucyBhIGxpdHRsZS48L3A+Ci0KLTxwPkluIGl0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIEFwYWNoZSBkb2VzIG5vdCBzZW5kIHRoZSBsYXN0IG1vZGlmaWVkCi1kYXRlIG9yIGNvbnRlbnQgbGVuZ3RoIEhUVFAgaGVhZGVycyBvbiBTU0kgcGFnZXMsIGJlY2F1c2UgdGhlc2UgdmFsdWVzIGFyZQotZGlmZmljdWx0IHRvIGNhbGN1bGF0ZSBmb3IgZHluYW1pYyBjb250ZW50LiAgVGhpcyBjYW4gcHJldmVudCB5b3VyCi1kb2N1bWVudCBmcm9tIGJlaW5nIGNhY2hlZCwgYW5kIHJlc3VsdCBpbiBzbG93ZXIgcGVyY2VpdmVkIGNsaWVudAotcGVyZm9ybWFuY2UuICBUaGVyZSBhcmUgdHdvIHdheXMgdG8gc29sdmUgdGhpczo8L3A+Ci0KLTxvbD4gCi0KLTxsaT5Vc2UgdGhlIDxjb2RlPlhCaXRIYWNrIEZ1bGw8L2NvZGU+IGNvbmZpZ3VyYXRpb24uICBUaGlzIHRlbGxzCi1BcGFjaGUgdG8gZGV0ZXJtaW5lIHRoZSBsYXN0IG1vZGlmaWVkIGRhdGUgYnkgbG9va2luZyBvbmx5IGF0IHRoZSBkYXRlCi1vZiB0aGUgb3JpZ2luYWxseSByZXF1ZXN0ZWQgZmlsZSwgaWdub3JpbmcgdGhlIG1vZGlmaWNhdGlvbiBkYXRlIG9mCi1hbnkgaW5jbHVkZWQgZmlsZXMuIDwvbGk+IAotCi08bGk+VXNlIHRoZSBkaXJlY3RpdmVzIHByb3ZpZGVkIGJ5IDxhCi1ocmVmPSIuLi9tb2QvbW9kX2V4cGlyZXMuaHRtbCI+bW9kX2V4cGlyZXM8L2E+IHRvIHNldCBhbiBleHBsaWNpdAotZXhwaXJhdGlvbiB0aW1lIG9uIHlvdXIgZmlsZXMsIHRoZXJlYnkgbGV0dGluZyBicm93c2VycyBhbmQgcHJveGllcwota25vdyB0aGF0IGl0IGlzIGFjY2VwdGFibGUgdG8gY2FjaGUgdGhlbS4gPC9saT4KLQotPC9vbD4KLQotCi08aHI+Ci08aDI+PGEgbmFtZT0iYmFzaWNzc2lkaXJlY3RpdmVzIj5CYXNpYyBTU0kgZGlyZWN0aXZlczwvYT48L2gyPgotCi08cD5TU0kgZGlyZWN0aXZlcyBoYXZlIHRoZSBmb2xsb3dpbmcgc3ludGF4OjwvcD4KLQotPHByZT4KLSAgICAgICAgJmx0OyEtLSNlbGVtZW50IGF0dHJpYnV0ZT12YWx1ZSBhdHRyaWJ1dGU9dmFsdWUgLi4uIC0tJmd0OwotPC9wcmU+Ci0KLTxwPkl0IGlzIGZvcm1hdHRlZCBsaWtlIGFuIEhUTUwgY29tbWVudCwgc28gaWYgeW91IGRvbid0IGhhdmUgU1NJCi1jb3JyZWN0bHkgZW5hYmxlZCwgdGhlIGJyb3dzZXIgd2lsbCBpZ25vcmUgaXQsIGJ1dCBpdCB3aWxsIHN0aWxsIGJlCi12aXNpYmxlIGluIHRoZSBIVE1MIHNvdXJjZS4gSWYgeW91IGhhdmUgU1NJIGNvcnJlY3RseSBjb25maWd1cmVkLCB0aGUKLWRpcmVjdGl2ZSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggaXRzIHJlc3VsdHMuPC9wPgotCi08cD5UaGUgZWxlbWVudCBjYW4gYmUgb25lIG9mIGEgbnVtYmVyIG9mIHRoaW5ncywgYW5kIHdlJ2xsIHRhbGsgc29tZQotbW9yZSBhYm91dCBtb3N0IG9mIHRoZXNlIGluIHRoZSBuZXh0IGluc3RhbGxtZW50IG9mIHRoaXMgc2VyaWVzLiBGb3IKLW5vdywgaGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiB3aGF0IHlvdSBjYW4gZG8gd2l0aCBTU0k8L3A+Ci0KLTxoMz48YSBuYW1lPSJ0b2RheSdzZGF0ZSI+VG9kYXkncyBkYXRlPC9hPjwvaDM+Ci0KLTxwcmU+Ci0gICAgICAgICZsdDshLS0jZWNobyB2YXI9REFURV9MT0NBTCAtLSZndDsKLTwvcHJlPgotCi08cD5UaGUgPGNvZGU+ZWNobzwvY29kZT4gZWxlbWVudCBqdXN0IHNwaXRzIG91dCB0aGUgdmFsdWUgb2YgYQotdmFyaWFibGUuIFRoZXJlIGFyZSBhIG51bWJlciBvZiBzdGFuZGFyZCB2YXJpYWJsZXMsIHdoaWNoIGluY2x1ZGUgdGhlCi13aG9sZSBzZXQgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byBDR0kgcHJvZ3JhbXMuCi1BbHNvLCB5b3UgY2FuIGRlZmluZSB5b3VyIG93biB2YXJpYWJsZXMgd2l0aCB0aGUgPGNvZGU+c2V0PC9jb2RlPgotZWxlbWVudC48L3A+Ci0KLTxwPklmIHlvdSBkb24ndCBsaWtlIHRoZSBmb3JtYXQgaW4gd2hpY2ggdGhlIGRhdGUgZ2V0cyBwcmludGVkLCB5b3UgY2FuCi11c2UgdGhlIDxjb2RlPmNvbmZpZzwvY29kZT4gZWxlbWVudCwgd2l0aCBhIDxjb2RlPnRpbWVmbXQ8L2NvZGU+Ci1hdHRyaWJ1dGUsIHRvIG1vZGlmeSB0aGF0IGZvcm1hdHRpbmcuPC9wPgotCi08cHJlPgotICAgICAgICAmbHQ7IS0tI2NvbmZpZyB0aW1lZm10PSIlQSAlQiAlZCwgJVkiIC0tJmd0OwotICAgICAgICBUb2RheSBpcyAmbHQ7IS0tI2VjaG8gdmFyPURBVEVfTE9DQUwgLS0mZ3Q7Ci08L3ByZT4KLQotPGgzPjxhIG5hbWU9Im1vZGlmaWNhdGlvbmRhdGVvZnRoZWZpbGUiPk1vZGlmaWNhdGlvbiBkYXRlIG9mIHRoZQotZmlsZTwvYT48L2gzPgotCi08cHJlPgotICAgICAgICBUaGlzIGRvY3VtZW50IGxhc3QgbW9kaWZpZWQgJmx0OyEtLSNmbGFzdG1vZCBmaWxlPSJpbmRleC5odG1sIiAtLSZndDsKLTwvcHJlPgotCi08cD5UaGlzIGVsZW1lbnQgaXMgYWxzbyBzdWJqZWN0IHRvIDxjb2RlPnRpbWVmbXQ8L2NvZGU+IGZvcm1hdAotY29uZmlndXJhdGlvbnMuPC9wPgotCi08aDM+PGEgbmFtZT0iaW5jbHVkaW5ndGhlcmVzdWx0c29mYWNnaXByb2dyYW0iPkluY2x1ZGluZyB0aGUKLXJlc3VsdHMgb2YgYSBDR0kgcHJvZ3JhbTwvYT48L2gzPgotCi08cD5UaGlzIGlzIG9uZSBvZiB0aGUgbW9yZSBjb21tb24gdXNlcyBvZiBTU0kgLSB0byBvdXRwdXQgdGhlIHJlc3VsdHMKLW9mIGEgQ0dJIHByb2dyYW0sIHN1Y2ggYXMgZXZlcnlib2R5J3MgZmF2b3JpdGUsIGEgYGBoaXQgY291bnRlci4nJzwvcD4KLQotPHByZT4KLSAgICAgICAgJmx0OyEtLSNpbmNsdWRlIHZpcnR1YWw9Ii9jZ2ktYmluL2NvdW50ZXIucGwiIC0tJmd0OwotPC9wcmU+Ci0KLTxocj4KLTxoMj48YSBuYW1lPSJhZGRpdGlvbmFsZXhhbXBsZXMiPkFkZGl0aW9uYWwgZXhhbXBsZXM8L2E+PC9oMj4KLQotPHA+Rm9sbG93aW5nIGFyZSBzb21lIHNwZWNpZmljIGV4YW1wbGVzIG9mIHRoaW5ncyB5b3UgY2FuIGRvIGluIHlvdXIKLUhUTUwgZG9jdW1lbnRzIHdpdGggU1NJLjwvcD4KLQotPGhyPgotPGgyPjxhIG5hbWU9IndoZW53YXN0aGlzZG9jdW1lbnRtb2RpZmllZCI+V2hlbiB3YXMgdGhpcyBkb2N1bWVudAotbW9kaWZpZWQ/PC9hPjwvaDI+Ci0KLTxwPkVhcmxpZXIsIHdlIG1lbnRpb25lZCB0aGF0IHlvdSBjb3VsZCB1c2UgU1NJIHRvIGluZm9ybSB0aGUgdXNlciB3aGVuCi10aGUgZG9jdW1lbnQgd2FzIG1vc3QgcmVjZW50bHkgbW9kaWZpZWQuIEhvd2V2ZXIsIHRoZSBhY3R1YWwgbWV0aG9kIGZvcgotZG9pbmcgdGhhdCB3YXMgbGVmdCBzb21ld2hhdCBpbiBxdWVzdGlvbi4gVGhlIGZvbGxvd2luZyBjb2RlLCBwbGFjZWQgaW4KLXlvdXIgSFRNTCBkb2N1bWVudCwgd2lsbCBwdXQgc3VjaCBhIHRpbWUgc3RhbXAgb24geW91ciBwYWdlLiBPZiBjb3Vyc2UsCi15b3Ugd2lsbCBoYXZlIHRvIGhhdmUgU1NJIGNvcnJlY3RseSBlbmFibGVkLCBhcyBkaXNjdXNzZWQgYWJvdmUuPC9wPgotCi08cHJlPgotICAgICAgICAmbHQ7IS0tI2NvbmZpZyB0aW1lZm10PSIlQSAlQiAlZCwgJVkiIC0tJmd0OwotICAgICAgICBUaGlzIGZpbGUgbGFzdCBtb2RpZmllZCAmbHQ7IS0tI2ZsYXN0bW9kIGZpbGU9InNzaS5zaHRtbCIgLS0mZ3Q7Ci08L3ByZT4KLQotPHA+T2YgY291cnNlLCB5b3Ugd2lsbCBuZWVkIHRvIHJlcGxhY2UgdGhlIDxjb2RlPnNzaS5zaHRtbDwvY29kZT4gd2l0aAotdGhlIGFjdHVhbCBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgeW91J3JlIHJlZmVycmluZyB0by4gVGhpcyBjYW4gYmUKLWluY29udmVuaWVudCBpZiB5b3UncmUganVzdCBsb29raW5nIGZvciBhIGdlbmVyaWMgcGllY2Ugb2YgY29kZSB0aGF0Ci15b3UgY2FuIHBhc3RlIGludG8gYW55IGZpbGUsIHNvIHlvdSBwcm9iYWJseSB3YW50IHRvIHVzZSB0aGUKLTxjb2RlPkxBU1RfTU9ESUZJRUQ8L2NvZGU+IHZhcmlhYmxlIGluc3RlYWQ6PC9wPgotCi08cHJlPgotICAgICAgICAmbHQ7IS0tI2NvbmZpZyB0aW1lZm10PSIlRCIgLS0mZ3Q7Ci0gICAgICAgIFRoaXMgZmlsZSBsYXN0IG1vZGlmaWVkICZsdDshLS0jZWNobyB2YXI9IkxBU1RfTU9ESUZJRUQiIC0tJmd0OwotPC9wcmU+Ci0KLTxwPkZvciBtb3JlIGRldGFpbHMgb24gdGhlIDxjb2RlPnRpbWVmbXQ8L2NvZGU+IGZvcm1hdCwgZ28gdG8geW91cgotZmF2b3JpdGUgc2VhcmNoIHNpdGUgYW5kIGxvb2sgZm9yIDxjb2RlPmN0aW1lPC9jb2RlPi4gVGhlIHN5bnRheCBpcyB0aGUKLXNhbWUuPC9wPgotCi08aHI+Ci08aDI+PGEgbmFtZT0iaW5jbHVkaW5nYXN0YW5kYXJkZm9vdGVyIj5JbmNsdWRpbmcgYSBzdGFuZGFyZAotZm9vdGVyPC9hPjwvaDI+Ci0KLTxwPklmIHlvdSBhcmUgbWFuYWdpbmcgYW55IHNpdGUgdGhhdCBpcyBtb3JlIHRoYW4gYSBmZXcgcGFnZXMsIHlvdSBtYXkKLWZpbmQgdGhhdCBtYWtpbmcgY2hhbmdlcyB0byBhbGwgdGhvc2UgcGFnZXMgY2FuIGJlIGEgcmVhbCBwYWluLAotcGFydGljdWxhcmx5IGlmIHlvdSBhcmUgdHJ5aW5nIHRvIG1haW50YWluIHNvbWUga2luZCBvZiBzdGFuZGFyZCBsb29rCi1hY3Jvc3MgYWxsIHRob3NlIHBhZ2VzLjwvcD4KLQotPHA+VXNpbmcgYW4gaW5jbHVkZSBmaWxlIGZvciBhIGhlYWRlciBhbmQvb3IgYSBmb290ZXIgY2FuIHJlZHVjZSB0aGUKLWJ1cmRlbiBvZiB0aGVzZSB1cGRhdGVzLiBZb3UganVzdCBoYXZlIHRvIG1ha2Ugb25lIGZvb3RlciBmaWxlLCBhbmQKLXRoZW4gaW5jbHVkZSBpdCBpbnRvIGVhY2ggcGFnZSB3aXRoIHRoZSA8Y29kZT5pbmNsdWRlPC9jb2RlPiBTU0kKLWNvbW1hbmQuIFRoZSA8Y29kZT5pbmNsdWRlPC9jb2RlPiBlbGVtZW50IGNhbiBkZXRlcm1pbmUgd2hhdCBmaWxlIHRvCi1pbmNsdWRlIHdpdGggZWl0aGVyIHRoZSA8Y29kZT5maWxlPC9jb2RlPiBhdHRyaWJ1dGUsIG9yIHRoZQotPGNvZGU+dmlydHVhbDwvY29kZT4gYXR0cmlidXRlLiBUaGUgPGNvZGU+ZmlsZTwvY29kZT4gYXR0cmlidXRlIGlzIGEKLWZpbGUgcGF0aCwgPGVtPnJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeTwvZW0+LiBUaGF0IG1lYW5zIHRoYXQKLWl0IGNhbm5vdCBiZSBhbiBhYnNvbHV0ZSBmaWxlIHBhdGggKHN0YXJ0aW5nIHdpdGggLyksIG5vciBjYW4gaXQKLWNvbnRhaW4gLi4vIGFzIHBhcnQgb2YgdGhhdCBwYXRoLiBUaGUgPGNvZGU+dmlydHVhbDwvY29kZT4gYXR0cmlidXRlIGlzCi1wcm9iYWJseSBtb3JlIHVzZWZ1bCwgYW5kIHNob3VsZCBzcGVjaWZ5IGEgVVJMIHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVudAotYmVpbmcgc2VydmVkLiBJdCBjYW4gc3RhcnQgd2l0aCBhIC8sIGJ1dCBtdXN0IGJlIG9uIHRoZSBzYW1lIHNlcnZlciBhcwotdGhlIGZpbGUgYmVpbmcgc2VydmVkLjwvcD4KLQotPHByZT4KLSAgICAgICAgJmx0OyEtLSNpbmNsdWRlIHZpcnR1YWw9Ii9mb290ZXIuaHRtbCIgLS0mZ3Q7Ci08L3ByZT4KLQotPHA+SSdsbCBmcmVxdWVudGx5IGNvbWJpbmUgdGhlIGxhc3QgdHdvIHRoaW5ncywgcHV0dGluZyBhCi08Y29kZT5MQVNUX01PRElGSUVEPC9jb2RlPiBkaXJlY3RpdmUgaW5zaWRlIGEgZm9vdGVyIGZpbGUgdG8gYmUKLWluY2x1ZGVkLiBTU0kgZGlyZWN0aXZlcyBjYW4gYmUgY29udGFpbmVkIGluIHRoZSBpbmNsdWRlZCBmaWxlLCBhbmQKLWluY2x1ZGVzIGNhbiBiZSBuZXN0ZWQgLSB0aGF0IGlzLCB0aGUgaW5jbHVkZWQgZmlsZSBjYW4gaW5jbHVkZSBhbm90aGVyCi1maWxlLCBhbmQgc28gb24uPC9wPgotCi08aHI+Ci08aDI+PGEgbmFtZT0id2hhdGVsc2VjYW5pY29uZmlnIj5XaGF0IGVsc2UgY2FuIEkgY29uZmlnPzwvYT48L2gyPgotCi08cD5JbiBhZGRpdGlvbiB0byBiZWluZyBhYmxlIHRvIDxjb2RlPmNvbmZpZzwvY29kZT4gdGhlIHRpbWUgZm9ybWF0LAoteW91IGNhbiBhbHNvIDxjb2RlPmNvbmZpZzwvY29kZT4gdHdvIG90aGVyIHRoaW5ncy48L3A+Ci0KLTxwPlVzdWFsbHksIHdoZW4gc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCB5b3VyIFNTSSBkaXJlY3RpdmUsIHlvdSBnZXQKLXRoZSBtZXNzYWdlPC9wPgotCi08cHJlPgotICAgICAgICBbYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGlzIGRpcmVjdGl2ZV0KLTwvcHJlPgotCi08cD5JZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhhdCBtZXNzYWdlIHRvIHNvbWV0aGluZyBlbHNlLCB5b3UgY2FuIGRvIHNvCi13aXRoIHRoZSA8Y29kZT5lcnJtc2c8L2NvZGU+IGF0dHJpYnV0ZSB0byB0aGUgPGNvZGU+Y29uZmlnPC9jb2RlPgotZWxlbWVudDo8L3A+Ci0KLTxwcmU+Ci0gICAgICAgICZsdDshLS0jY29uZmlnIGVycm1zZz0iW0l0IGFwcGVhcnMgdGhhdCB5b3UgZG9uJ3Qga25vdyBob3cgdG8gdXNlIFNTSV0iIC0tJmd0OwotPC9wcmU+Ci0KLTxwPkhvcGVmdWxseSwgZW5kIHVzZXJzIHdpbGwgbmV2ZXIgc2VlIHRoaXMgbWVzc2FnZSwgYmVjYXVzZSB5b3Ugd2lsbAotaGF2ZSByZXNvbHZlZCBhbGwgdGhlIHByb2JsZW1zIHdpdGggeW91ciBTU0kgZGlyZWN0aXZlcyBiZWZvcmUgeW91cgotc2l0ZSBnb2VzIGxpdmUuIChSaWdodD8pPC9wPgotCi08cD5BbmQgeW91IGNhbiA8Y29kZT5jb25maWc8L2NvZGU+IHRoZSBmb3JtYXQgaW4gd2hpY2ggZmlsZSBzaXplcyBhcmUKLXJldHVybmVkIHdpdGggdGhlIDxjb2RlPnNpemVmbXQ8L2NvZGU+IGF0dHJpYnV0ZS4gWW91IGNhbiBzcGVjaWZ5Ci08Y29kZT5ieXRlczwvY29kZT4gZm9yIGEgZnVsbCBjb3VudCBpbiBieXRlcywgb3IgPGNvZGU+YWJicmV2PC9jb2RlPgotZm9yIGFuIGFiYnJldmlhdGVkIG51bWJlciBpbiBLYiBvciBNYiwgYXMgYXBwcm9wcmlhdGUuPC9wPgotCi08aHI+Ci08aDI+PGEgbmFtZT0iZXhlY3V0aW5nY29tbWFuZHMiPkV4ZWN1dGluZyBjb21tYW5kczwvYT48L2gyPgotCi08cD5JIGV4cGVjdCB0aGF0IEknbGwgaGF2ZSBhbiBhcnRpY2xlIHNvbWUgdGltZSBpbiB0aGUgY29taW5nIG1vbnRocwotYWJvdXQgdXNpbmcgU1NJIHdpdGggc21hbGwgQ0dJIHByb2dyYW1zLiBGb3Igbm93LCBoZXJlJ3Mgc29tZXRoaW5nIGVsc2UKLXRoYXQgeW91IGNhbiBkbyB3aXRoIHRoZSA8Y29kZT5leGVjPC9jb2RlPiBlbGVtZW50LiBZb3UgY2FuIGFjdHVhbGx5Ci1oYXZlIFNTSSBleGVjdXRlIGEgY29tbWFuZCB1c2luZyB0aGUgc2hlbGwgKDxjb2RlPi9iaW4vc2g8L2NvZGU+LCB0byBiZQotcHJlY2lzZSAtIG9yIHRoZSBET1Mgc2hlbGwsIGlmIHlvdSdyZSBvbiBXaW4zMikuIFRoZSBmb2xsb3dpbmcsIGZvcgotZXhhbXBsZSwgd2lsbCBnaXZlIHlvdSBhIGRpcmVjdG9yeSBsaXN0aW5nLjwvcD4KLQotPHByZT4KLSAgICAgICAgJmx0O3ByZSZndDsKLSAgICAgICAgJmx0OyEtLSNleGVjIGNtZD0ibHMiIC0tJmd0OwotICAgICAgICAmbHQ7L3ByZSZndDsKLTwvcHJlPgotCi08cD5vciwgb24gV2luZG93czwvcD4KLQotPHByZT4KLSAgICAgICAgJmx0O3ByZSZndDsKLSAgICAgICAgJmx0OyEtLSNleGVjIGNtZD0iZGlyIiAtLSZndDsKLSAgICAgICAgJmx0Oy9wcmUmZ3Q7Ci08L3ByZT4KLQotPHA+WW91IG1pZ2h0IG5vdGljZSBzb21lIHN0cmFuZ2UgZm9ybWF0dGluZyB3aXRoIHRoaXMgZGlyZWN0aXZlIG9uCi1XaW5kb3dzLCBiZWNhdXNlIHRoZSBvdXRwdXQgZnJvbSA8Y29kZT5kaXI8L2NvZGU+IGNvbnRhaW5zIHRoZSBzdHJpbmcKLWBgJmx0Ozxjb2RlPmRpcjwvY29kZT4mZ3Q7JycgaW4gaXQsIHdoaWNoIGNvbmZ1c2VzIGJyb3dzZXJzLjwvcD4KLQotPHA+Tm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBleGNlZWRpbmdseSBkYW5nZXJvdXMsIGFzIGl0IHdpbGwgZXhlY3V0ZQotd2hhdGV2ZXIgY29kZSBoYXBwZW5zIHRvIGJlIGVtYmVkZGVkIGluIHRoZSA8Y29kZT5leGVjPC9jb2RlPiB0YWcuIElmCi15b3UgaGF2ZSBhbnkgc2l0dWF0aW9uIHdoZXJlIHVzZXJzIGNhbiBlZGl0IGNvbnRlbnQgb24geW91ciB3ZWIgcGFnZXMsCi1zdWNoIGFzIHdpdGggYSBgYGd1ZXN0Ym9vaycnLCBmb3IgZXhhbXBsZSwgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgdGhpcwotZmVhdHVyZSBkaXNhYmxlZC4gWW91IGNhbiBhbGxvdyBTU0ksIGJ1dCBub3QgdGhlIDxjb2RlPmV4ZWM8L2NvZGU+Ci1mZWF0dXJlLCB3aXRoIHRoZSA8Y29kZT5JbmNsdWRlc05PRVhFQzwvY29kZT4gYXJndW1lbnQgdG8gdGhlCi08Y29kZT5PcHRpb25zPC9jb2RlPiBkaXJlY3RpdmUuPC9wPgotCi08aHI+Ci08aDI+PGEgbmFtZT0iYWR2YW5jZWRzc2l0ZWNobmlxdWVzIj5BZHZhbmNlZCBTU0kgdGVjaG5pcXVlczwvYT48L2gyPgotCi08cD5JbiBhZGRpdGlvbiB0byBzcGl0dGluZyBvdXQgY29udGVudCwgQXBhY2hlIFNTSSBnaXZlcyB5b3UgdGhlIG9wdGlvbgotb2Ygc2V0dGluZyB2YXJpYWJsZXMsIGFuZCB1c2luZyB0aG9zZSB2YXJpYWJsZXMgaW4gY29tcGFyaXNvbnMgYW5kCi1jb25kaXRpb25hbHMuPC9wPgotCi08aDM+PGEgbmFtZT0iY2F2ZWF0Ij5DYXZlYXQ8L2E+PC9oMz4KLQotPHA+TW9zdCBvZiB0aGUgZmVhdHVyZXMgZGlzY3Vzc2VkIGluIHRoaXMgYXJ0aWNsZSBhcmUgb25seSBhdmFpbGFibGUgdG8KLXlvdSBpZiB5b3UgYXJlIHJ1bm5pbmcgQXBhY2hlIDEuMiBvciBsYXRlci4gT2YgY291cnNlLCBpZiB5b3UgYXJlIG5vdAotcnVubmluZyBBcGFjaGUgMS4yIG9yIGxhdGVyLCB5b3UgbmVlZCB0byB1cGdyYWRlIGltbWVkaWF0ZWx5LCBpZiBub3QKLXNvb25lci4gR28gb24uIERvIGl0IG5vdy4gV2UnbGwgd2FpdC48L3A+Ci0KLTxocj4KLTxoMj48YSBuYW1lPSJzZXR0aW5ndmFyaWFibGVzIj5TZXR0aW5nIHZhcmlhYmxlczwvYT48L2gyPgotCi08cD5Vc2luZyB0aGUgPGNvZGU+c2V0PC9jb2RlPiBkaXJlY3RpdmUsIHlvdSBjYW4gc2V0IHZhcmlhYmxlcyBmb3IKLWxhdGVyIHVzZS4gV2UnbGwgbmVlZCB0aGlzIGxhdGVyIGluIHRoZSBkaXNjdXNzaW9uLCBzbyB3ZSdsbCB0YWxrIGFib3V0Ci1pdCBoZXJlLiBUaGUgc3ludGF4IG9mIHRoaXMgaXMgYXMgZm9sbG93czo8L3A+Ci0KLTxwcmU+Ci0gICAgICAgICZsdDshLS0jc2V0IHZhcj0ibmFtZSIgdmFsdWU9IlJpY2giIC0tJmd0OwotPC9wcmU+Ci0KLTxwPkluIGFkZGl0aW9uIHRvIG1lcmVseSBzZXR0aW5nIHZhbHVlcyBsaXRlcmFsbHkgbGlrZSB0aGF0LCB5b3UgY2FuCi11c2UgYW55IG90aGVyIHZhcmlhYmxlLCBpbmNsdWRpbmcsIGZvciBleGFtcGxlLCBlbnZpcm9ubWVudCB2YXJpYWJsZXMsCi1vciBzb21lIG9mIHRoZSB2YXJpYWJsZXMgd2UgZGlzY3Vzc2VkIGluIHRoZSBsYXN0IGFydGljbGUgKGxpa2UKLTxjb2RlPkxBU1RfTU9ESUZJRUQ8L2NvZGU+LCBmb3IgZXhhbXBsZSkgdG8gZ2l2ZSB2YWx1ZXMgdG8geW91cgotdmFyaWFibGVzLiBZb3Ugd2lsbCBzcGVjaWZ5IHRoYXQgc29tZXRoaW5nIGlzIGEgdmFyaWFibGUsIHJhdGhlciB0aGFuIGEKLWxpdGVyYWwgc3RyaW5nLCBieSB1c2luZyB0aGUgZG9sbGFyIHNpZ24gKCQpIGJlZm9yZSB0aGUgbmFtZSBvZiB0aGUKLXZhcmlhYmxlLjwvcD4KLQotPHByZT4KLSAgICAgICAgJmx0OyEtLSNzZXQgdmFyPSJtb2RpZmllZCIgdmFsdWU9IiRMQVNUX01PRElGSUVEIiAtLSZndDsKLTwvcHJlPgotCi08cD5UbyBwdXQgYSBsaXRlcmFsIGRvbGxhciBzaWduIGludG8gdGhlIHZhbHVlIG9mIHlvdXIgdmFyaWFibGUsIHlvdQotbmVlZCB0byBlc2NhcGUgdGhlIGRvbGxhciBzaWduIHdpdGggYSBiYWNrc2xhc2guPC9wPgotCi08cHJlPgotICAgICAgICAmbHQ7IS0tI3NldCB2YXI9ImNvc3QiIHZhbHVlPSJcJDEwMCIgLS0mZ3Q7Ci08L3ByZT4KLQotPHA+RmluYWxseSwgaWYgeW91IHdhbnQgdG8gcHV0IGEgdmFyaWFibGUgaW4gdGhlIG1pZHN0IG9mIGEgbG9uZ2VyCi1zdHJpbmcsIGFuZCB0aGVyZSdzIGEgY2hhbmNlIHRoYXQgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHdpbGwgcnVuIHVwCi1hZ2FpbnN0IHNvbWUgb3RoZXIgY2hhcmFjdGVycywgYW5kIHRodXMgYmUgY29uZnVzZWQgd2l0aCB0aG9zZQotY2hhcmFjdGVycywgeW91IGNhbiBwbGFjZSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgaW4gYnJhY2VzLCB0byByZW1vdmUKLXRoaXMgY29uZnVzaW9uLiAoSXQncyBoYXJkIHRvIGNvbWUgdXAgd2l0aCBhIHJlYWxseSBnb29kIGV4YW1wbGUgb2YKLXRoaXMsIGJ1dCBob3BlZnVsbHkgeW91J2xsIGdldCB0aGUgcG9pbnQuKTwvcD4KLQotPHByZT4KLSAgICAgICAgJmx0OyEtLSNzZXQgdmFyPSJkYXRlIiB2YWx1ZT0iJHtEQVRFX0xPQ0FMfV8ke0RBVEVfR01UfSIgLS0mZ3Q7Ci08L3ByZT4KLQotPGhyPgotPGgyPjxhIG5hbWU9ImNvbmRpdGlvbmFsZXhwcmVzc2lvbnMiPkNvbmRpdGlvbmFsIGV4cHJlc3Npb25zPC9hPjwvaDI+Ci0KLTxwPk5vdyB0aGF0IHdlIGhhdmUgdmFyaWFibGVzLCBhbmQgYXJlIGFibGUgdG8gc2V0IGFuZCBjb21wYXJlIHRoZWlyCi12YWx1ZXMsIHdlIGNhbiB1c2UgdGhlbSB0byBleHByZXNzIGNvbmRpdGlvbmFscy4gVGhpcyBsZXRzIFNTSSBiZSBhCi10aW55IHByb2dyYW1taW5nIGxhbmd1YWdlIG9mIHNvcnRzLiA8Y29kZT5tb2RfaW5jbHVkZTwvY29kZT4gcHJvdmlkZXMKLWFuIDxjb2RlPmlmPC9jb2RlPiwgPGNvZGU+ZWxpZjwvY29kZT4sIDxjb2RlPmVsc2U8L2NvZGU+LAotPGNvZGU+ZW5kaWY8L2NvZGU+IHN0cnVjdHVyZSBmb3IgYnVpbGRpbmcgY29uZGl0aW9uYWwgc3RhdGVtZW50cy4gVGhpcwotYWxsb3dzIHlvdSB0byBlZmZlY3RpdmVseSBnZW5lcmF0ZSBtdWx0aXBsZSBsb2dpY2FsIHBhZ2VzIG91dCBvZiBvbmUKLWFjdHVhbCBwYWdlLjwvcD4KLQotPHA+VGhlIHN0cnVjdHVyZSBvZiB0aGlzIGNvbmRpdGlvbmFsIGNvbnN0cnVjdCBpczo8L3A+Ci0KLTxwcmU+Ci0gICAgICAgICZsdDshLS0jaWYgZXhwcj0idGVzdF9jb25kaXRpb24iIC0tJmd0OwotICAgICZsdDshLS0jZWxpZiBleHByPSJ0ZXN0X2NvbmRpdGlvbiIgLS0mZ3Q7Ci0gICAgJmx0OyEtLSNlbHNlIC0tJmd0OwotICAgICZsdDshLS0jZW5kaWYgLS0mZ3Q7Ci08L3ByZT4KLQotPHA+QSA8ZW0+dGVzdF9jb25kaXRpb248L2VtPiBjYW4gYmUgYW55IHNvcnQgb2YgbG9naWNhbCBjb21wYXJpc29uIC0KLWVpdGhlciBjb21wYXJpbmcgdmFsdWVzIHRvIG9uZSBhbm90aGVyLCBvciB0ZXN0aW5nIHRoZSBgYHRydXRoJycgb2YgYQotcGFydGljdWxhciB2YWx1ZS4gKEEgZ2l2ZW4gc3RyaW5nIGlzIHRydWUgaWYgaXQgaXMgbm9uZW1wdHkuKSBGb3IgYQotZnVsbCBsaXN0IG9mIHRoZSBjb21wYXJpc29uIG9wZXJhdG9ycyBhdmFpbGFibGUgdG8geW91LCBzZWUgdGhlCi08Y29kZT5tb2RfaW5jbHVkZTwvY29kZT4gZG9jdW1lbnRhdGlvbi4gSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBob3cKLW9uZSBtaWdodCB1c2UgdGhpcyBjb25zdHJ1Y3QuPC9wPgotCi08cD5JbiB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZSwgeW91IGNvdWxkIHB1dCB0aGUgZm9sbG93aW5nIGxpbmU6PC9wPgotCi08cHJlPgotICAgICAgICBCcm93c2VyTWF0Y2hOb0Nhc2UgbWFjaW50b3NoIE1hYwotICAgICAgICBCcm93c2VyTWF0Y2hOb0Nhc2UgTVNJRSBJbnRlcm5ldEV4cGxvcmVyCi08L3ByZT4KLQotPHA+VGhpcyB3aWxsIHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYGBNYWMnJyBhbmQgYGBJbnRlcm5ldEV4cGxvcmVyJycKLXRvIHRydWUsIGlmIHRoZSBjbGllbnQgaXMgcnVubmluZyBJbnRlcm5ldCBFeHBsb3JlciBvbiBhIE1hY2ludG9zaC48L3A+Ci0KLTxwPlRoZW4sIGluIHlvdXIgU1NJLWVuYWJsZWQgZG9jdW1lbnQsIHlvdSBtaWdodCBkbyB0aGUgZm9sbG93aW5nOjwvcD4KLQotPHByZT4KLSAgICAgICAgJmx0OyEtLSNpZiBleHByPSIke01hY30gJmFtcDsmYW1wOyAke0ludGVybmV0RXhwbG9yZXJ9IiAtLSZndDsKLSAgICAgICAgQXBvbG9nZXRpYyB0ZXh0IGdvZXMgaGVyZQotICAgICAgICAmbHQ7IS0tI2Vsc2UgLS0mZ3Q7Ci0gICAgICAgIENvb2wgSmF2YVNjcmlwdCBjb2RlIGdvZXMgaGVyZQotICAgICAgICAmbHQ7IS0tI2VuZGlmIC0tJmd0OwotPC9wcmU+Ci0KLTxwPk5vdCB0aGF0IEkgaGF2ZSBhbnl0aGluZyBhZ2FpbnN0IElFIG9uIE1hY3MgLSBJIGp1c3Qgc3RydWdnbGVkIGZvciBhCi1mZXcgaG91cnMgbGFzdCB3ZWVrIHRyeWluZyB0byBnZXQgc29tZSBKYXZhU2NyaXB0IHdvcmtpbmcgb24gSUUgb24gYQotTWFjLCB3aGVuIGl0IHdhcyB3b3JraW5nIGV2ZXJ5d2hlcmUgZWxzZS4gVGhlIGFib3ZlIHdhcyB0aGUgaW50ZXJpbQotd29ya2Fyb3VuZC48L3A+Ci0KLTxwPkFueSBvdGhlciB2YXJpYWJsZSAoZWl0aGVyIG9uZXMgdGhhdCB5b3UgZGVmaW5lLCBvciBub3JtYWwKLWVudmlyb25tZW50IHZhcmlhYmxlcykgY2FuIGJlIHVzZWQgaW4gY29uZGl0aW9uYWwgc3RhdGVtZW50cy4gV2l0aAotQXBhY2hlJ3MgYWJpbGl0eSB0byBzZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpdGggdGhlCi08Y29kZT5TZXRFbnZJZjwvY29kZT4gZGlyZWN0aXZlcywgYW5kIG90aGVyIHJlbGF0ZWQgZGlyZWN0aXZlcywgdGhpcwotZnVuY3Rpb25hbGl0eSBjYW4gbGV0IHlvdSBkbyBzb21lIHByZXR0eSBpbnZvbHZlZCBkeW5hbWljIHN0dWZmIHdpdGhvdXQKLWV2ZXIgcmVzb3J0aW5nIHRvIENHSS48L3A+Ci0KLTxocj4KLTxoMj48YSBuYW1lPSJjb25jbHVzaW9uIj5Db25jbHVzaW9uPC9hPjwvaDI+Ci0KLTxwPlNTSSBpcyBjZXJ0YWlubHkgbm90IGEgcmVwbGFjZW1lbnQgZm9yIENHSSwgb3Igb3RoZXIgdGVjaG5vbG9naWVzCi11c2VkIGZvciBnZW5lcmF0aW5nIGR5bmFtaWMgd2ViIHBhZ2VzLiBCdXQgaXQgaXMgYSBncmVhdCB3YXkgdG8gYWRkCi1zbWFsbCBhbW91bnRzIG9mIGR5bmFtaWMgY29udGVudCB0byBwYWdlcywgd2l0aG91dCBkb2luZyBhIGxvdCBvZiBleHRyYQotd29yay48L3A+Ci08L2JvZHk+Ci08L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2hvd3RvL3NzaS5odG1sLmphLmppcyBiL2RvY3MvbWFudWFsL2hvd3RvL3NzaS5odG1sLmphLmppcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFmYTMxNS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9ob3d0by9zc2kuaHRtbC5qYS5qaXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BcGFjaGUgGyRCJUElZSE8JUglaiUiJWsbKEI6IFNlcnZlciBTaWRlIEluY2x1ZGVzIBskQkZ+TGcbKEI8L3RpdGxlPgotPCEtLSBsaW5rIHJldj0ibWFkZSIgaHJlZj0ibWFpbHRvOnJib3dlbkByY2Jvd2VuLmNvbSIgLS0+Ci08L2hlYWQ+Ci08IS0tIEVuZ2xpc2ggcmV2aXNpb246IDEuNyAtLT4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxib2R5IGJnY29sb3I9IiNGRkZGRkYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjMDAwMDgwIgotYWxpbms9IiNGRjAwMDAiPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxoMSBhbGlnbj0iQ0VOVEVSIj5BcGFjaGUgGyRCJUElZSE8JUglaiUiJWsbKEI6IFNlcnZlciBTaWRlIEluY2x1ZGVzIBskQkZ+TGcbKEI8L2gxPgotCi08YSBuYW1lPSJfX2luZGV4X18iPjwvYT4gPCEtLSBJTkRFWCBCRUdJTiAtLT4KLSAKLQotPHVsPgotPGxpPjxhIGhyZWY9IiNhcGFjaGV0dXRvcmlhbDppbnRyb2R1Y3Rpb250b3NlcnZlcnNpZGVpbmNsdWRlcyI+QXBhY2hlCi0gGyRCJUElZSE8JUglaiUiJWsbKEI6IFNlcnZlciBTaWRlIEluY2x1ZGVzIBskQkZ+TGcbKEI8L2E+PC9saT4KLQotPGxpPjxhIGhyZWY9IiN3aGF0YXJlc3NpIj5TU0kgGyRCJEgkTxsoQj88L2E+PC9saT4KLQotPGxpPjxhIGhyZWY9IiNjb25maWd1cmluZ3lvdXJzZXJ2ZXJ0b3Blcm1pdHNzaSI+U1NJIBskQiRyNXYyRCQ5JGskPyRhJE4bKEIKLRskQiU1ITwlUCROQF9EahsoQjwvYT48L2xpPgotCi08bGk+PGEgaHJlZj0iI2Jhc2ljc3NpZGlyZWN0aXZlcyI+GyRCNHBLXEUqJEobKEIgU1NJIBskQiVHJSMlbCUvJUYlIyVWGyhCPC9hPgotCi08dWw+Ci0gIDxsaT48YSBocmVmPSIjdG9kYXknc2RhdGUiPhskQjojRnwkTkZ8SVUbKEI8L2E+PC9saT4KLQotICA8bGk+PGEgaHJlZj0iI21vZGlmaWNhdGlvbmRhdGVvZnRoZWZpbGUiPhskQiVVJSElJCVrJE5KUTk5RnwbKEI8L2E+PC9saT4KLQotICA8bGk+PGEgaHJlZj0iI2luY2x1ZGluZ3RoZXJlc3VsdHNvZmFjZ2lwcm9ncmFtIj5DR0kgGyRCJVclbSUwJWklYCRON2syTCRyGyhCCi0bJEI8aCRqOX4kYBsoQjwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci0KLTxsaT48YSBocmVmPSIjYWRkaXRpb25hbGV4YW1wbGVzIj4bJEJESTJDJE5OYxsoQjwvYT4KLQotPHVsPgotPGxpPjxhIGhyZWY9IiN3aGVud2FzdGhpc2RvY3VtZW50bW9kaWZpZWQiPhskQiQkJEQkMyROJUklLSVlJWElcyVIJE8bKEIKLRskQj0kQDUkNSRsJD8kTiQrGyhCPzwvYT48L2xpPgotCi08bGk+PGEgaHJlZj0iI2luY2x1ZGluZ2FzdGFuZGFyZGZvb3RlciI+GyRCSTg9YCROJVUlQyU/JHJBXkZ+JDkkaxsoQjwvYT48L2xpPgotCi08bGk+PGEgaHJlZj0iI3doYXRlbHNlY2FuaWNvbmZpZyI+GyRCQj4kSzI/JCxAX0RqJEckLSRrJE4kKxsoQj88L2E+PC9saT4KLQotPGxpPjxhIGhyZWY9IiNleGVjdXRpbmdjb21tYW5kcyI+GyRCJTMlXiVzJUkkTjxCOVQbKEI8L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotCi08bGk+PGEgaHJlZj0iI2FkdmFuY2Vkc3NpdGVjaG5pcXVlcyI+GyRCOWJFWSRKGyhCIFNTSSAbJEIlRiUvJUslQyUvGyhCPC9hPgotCi08dWw+Ci08bGk+PGEgaHJlZj0iI3NldHRpbmd2YXJpYWJsZXMiPhskQkpRP3QkckBfRGokOSRrGyhCPC9hPjwvbGk+Ci0KLTxsaT48YSBocmVmPSIjY29uZGl0aW9uYWxleHByZXNzaW9ucyI+GyRCPnI3bzwwGyhCPC9hPjwvbGk+Ci08L3VsPgotPC9saT4KLQotPGxpPjxhIGhyZWY9IiNjb25jbHVzaW9uIj4bJEI9KiRvJGokSxsoQjwvYT48L2xpPgotPC91bD4KLQotPCEtLSBJTkRFWCBFTkQgLS0+Ci08aHI+Ci08aDI+PGEgbmFtZT0KLSJhcGFjaGV0dXRvcmlhbDppbnRyb2R1Y3Rpb250b3NlcnZlcnNpZGVpbmNsdWRlcyI+QXBhY2hlCi0bJEIlQSVlITwlSCVqJSIlaxsoQjogU2VydmVyIFNpZGUgSW5jbHVkZXMgGyRCRn5MZxsoQjwvYT48L2gyPgotCi08dGFibGUgYm9yZGVyPSIxIj4KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+PHN0cm9uZz4bJEI0WE8iJWIlOCVlITwlaxsoQjwvc3Ryb25nPjxicj4KLTxicj4KLSA8YSBocmVmPSIuLi9tb2QvbW9kX2luY2x1ZGUuaHRtbCI+bW9kX2luY2x1ZGU8L2E+PGJyPgotPGEgaHJlZj0iLi4vbW9kL21vZF9jZ2kuaHRtbCI+bW9kX2NnaTwvYT48YnI+Ci08YSBocmVmPSIuLi9tb2QvbW9kX2V4cGlyZXMuaHRtbCI+bW9kX2V4cGlyZXM8L2E+PGJyPgotIDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiPjxzdHJvbmc+GyRCNFhPIiVHJSMlbCUvJUYlIyVWGyhCPC9zdHJvbmc+PGJyPgotPGJyPgotIDxhIGhyZWY9Ii4uL21vZC9jb3JlLmh0bWwjb3B0aW9ucyI+T3B0aW9uczwvYT48YnI+Ci08YSBocmVmPSIuLi9tb2QvbW9kX2luY2x1ZGUuaHRtbCN4Yml0aGFjayI+WEJpdEhhY2s8L2E+PGJyPgotPGEgaHJlZj0iLi4vbW9kL21vZF9taW1lLmh0bWwjYWRkdHlwZSI+QWRkVHlwZTwvYT48YnI+Ci08YSBocmVmPSIuLi9tb2QvbW9kX21pbWUuaHRtbCNhZGRoYW5kbGVyIj5BZGRIYW5kbGVyPC9hPjxicj4KLTxhIGhyZWY9Ci0iLi4vbW9kL21vZF9zZXRlbnZpZi5odG1sI0Jyb3dzZXJNYXRjaE5vQ2FzZSI+QnJvd3Nlck1hdGNoTm9DYXNlPC9hPjxicj4KLQotIDwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLQotPHA+GyRCJDMkTko4PXEkTzpHPWkhIhsoQkFwYWNoZSBUb2RheSAoaHR0cDovL3d3dy5hcGFjaGV0b2RheS5jb20vKSAbJEIkSzswMnMkTk8iOlw1LTt2JEgkNyRGN0c6XCQ1JGwkXiQ3JD8hIxsoQgotGyRCJDMkMyRHJE8hIhsoQkFwY2hlVG9kYXkgGyRCJEgbKEIgSW50ZXJuZXQuY29tIBskQiRIJE42KERqJEskaCRqOlwkOyRGJCQkXiQ5ISMbKEI8L3A+Ci0KLTxwPhskQiQzJE41LTt2JE8hIkRMPm8kT0MxJEsbKEIgU1NJIBskQiRIOEYkUCRsJGsbKEIgU2VydmVyIFNpZGUgSW5jbHVkZXMgGyRCJHIbKEIKLRskQjA3JCQkXiQ5ISMkMyRONS07diRLJCokJCRGJE8hIiU1ITwlUCRHJE4bKEIgU1NJIBskQiRyNXYyRCQ5JGskPyRhJE5AX0RqJEghIhsoQgotGyRCOD06XyROGyhCIEhUTUwgGyRCJVohPCU4JEtGMEUqJEolMyVzJUYlcyVEJHIyQyQoJGskPyRhJE4kJCQvJEQkKyRONHBLXEUqJEobKEIKLVNTSSAbJEI1Oz1RJHI+UjJwJDckXiQ5ISMbKEI8L3A+Ci0KLTxwPhskQjUtO3YkTjhlSD4kRyRPISIbKEJTU0kgGyRCJUclIyVsJS8lRiUjJVYkRxsoQgotU1NJIBskQiRINiYkSzxCOVQkOSRrJDMkSCQsJEckLSRrPnI3b0o4JE4kaCQmJEo0dkosOWJFWSRKO3ZKQSRLGyhCCi0bJEIkRCQkJEY9UiRZJEYkJCReJDkhIxsoQjwvcD4KLQotPGhyPgotPGgyPjxhIG5hbWU9IndoYXRhcmVzc2kiPlNTSSAbJEIkSCRPGyhCPzwvYT48L2gyPgotCi08cD5TU0kgKFNlcnZlciBTaWRlIEluY2x1ZGVzKSAbJEIkTyEiGyhCSFRNTCAbJEIlWiE8JThDZiRLR1tDViQ1JGwkayVHJSMlbCUvJUYlIyVWJEckIiRqISIbKEIKLRskQiU1ITwlUCRHJVohPCU4JHJEczYhJDkkazt+JEtJPjJBJDUkbCReJDkhIxsoQgotU1NJIBskQiRPISIbKEJDR0kgGyRCJVclbSUwJWklYCRkJD0kTkI+JE5GMEUqJEo1Oz1RJEdBNCRGJE4lWiE8JTgkckRzNiEbKEIKLRskQiQ7JDokSyEiRjBFKiRLQDhALiQ1JGwkPyUzJXMlRiVzJUQkcjg9Ol8kThsoQiBIVE1MIBskQiVaITwlOCRLGyhCCi0bJEIyQyQoJF4kOSEjGyhCPC9wPgotCi08cD4bJEIkSSQmJCQkJj5sOWckSxsoQiBTU0kgGyRCJHI7SCQkISIkSSQmJCQkJj5sOWckSyVXJW0lMCVpJWAkRyVaITwlOCRyNDBBNCRLQDhALiQ5JGskKxsoQgotGyRCJE8hIiVaITwlOCROJCYkQSRJJE5EeEVZJCxARUUqJEckIiRqISIlWiE8JTgkLERzNiEkNSRsJGskPyRTJEsbKEIKLRskQjpGN1c7OyQ5JGtJLE1XJCwkSSRORHhFWSQiJGskKyRHREw+byRPN2hEaiQ3JF4kOSEjGyhCU1NJIBskQiRPOD06Xzt+OW8kTiRoJCYkShsoQgotGyRCPi4kNSQkPnBKcyRyMkMkKCRrJEskTyQmJEMkRiREJDEkTkp9SyEkRyQ5ISMbKEIKLRskQiQ3JCskNyEiJD0kTiVaITwlOCROJFskSCRzJEkkTkl0SiwkLERzNiE7fiRLQDhALiQ1JGwkaz5sOWckTyEiGyhCCi0bJEJCPiROSn1LISRyQzUkOUksTVckLCQiJGokXiQ5ISMbKEI8L3A+Ci0KLTxocj4KLTxoMj48YSBuYW1lPSJjb25maWd1cmluZ3lvdXJzZXJ2ZXJ0b3Blcm1pdHNzaSI+U1NJIBskQiRyNXYyRCQ5JGskPyRhJE4bKEIKLRskQiU1ITwlUCROQF9EahsoQjwvYT48L2gyPgotCi08cD4bJEIlNSE8JVAkRxsoQiBTU0kgGyRCNXYyRCQ5JGskSyRPISIbKEI8Y29kZT5odHRwZC5jb25mPC9jb2RlPiAbJEIlVSUhJSQlaxsoQgotGyRCJF4kPyRPGyhCIDxjb2RlPi5odGFjY2VzczwvY29kZT4gGyRCJVUlISUkJWskSzwhJE4lRyUjJWwlLyVGJSMlViRyO1hEaiQ5JGtJLE1XJCwkIiRqJF4kORsoQjo8L3A+Ci0KLTxwcmU+Ci0gICAgICAgIE9wdGlvbnMgK0luY2x1ZGVzCi08L3ByZT4KLQotPHA+GyRCJDMkTjtYRGokTyEiJVUlISUkJWskchsoQiBTU0kgGyRCJUclIyVsJS8lRiUjJVYkRzJyQE8kNSQ7JGskMyRIJHI1djJEJDkkaxsoQgotGyRCJEgkJCQmJDMkSCRyGyhCIEFwYWNoZSAbJEIkS0VBJCgkXiQ5ISMbKEI8L3A+Ci0KLTxwPhskQkE0JEYkTiVVJSElJCVrJCwbKEIgU1NJIBskQiVHJSMlbCUvJUYlIyVWJEcyckBPJDUkbCRrJEgkJCQmJG8kMSRHJE8kIiRqJF4kOyRzISMbKEIKLRskQiRJJE4lVSUhJSQlayQsMnJATyQ1JGwkayQrJHIbKEIgQXBhY2hlIBskQiRLRUEkKCRrSSxNVyQsJCIkaiReJDkhIyQzJGwkchsoQgotGyRCOVQkSiQmJEskT0ZzJERKfUshJCwkIiRqJF4kOSEjPCEkTiVHJSMlbCUvJUYlIyVWJHI7SCQmJDMkSCRHISIbKEIKLRskQk5jJCgkUBsoQiA8Y29kZT4uc2h0bWw8L2NvZGU+IBskQiROJGgkJiRKRkNKTCRKJVUlISUkJWszSEQlO1Ikcjt9JEQlVSUhJSQlayRyGyhCCi0bJEIyckBPJDkkayRoJCYbKEIgQXBhY2hlIBskQiRLRUEkKCRrJDMkSCQsJEckLSReJDkbKEI6PC9wPgotCi08cHJlPgotICAgICAgICBBZGRUeXBlIHRleHQvaHRtbCAuc2h0bWwKLSAgICAgICAgQWRkSGFuZGxlciBzZXJ2ZXItcGFyc2VkIC5zaHRtbAotPC9wcmU+Ci0KLTxwPhskQiQzJE5KfUshJE43Z0VAJE8hIiRiJDc4PTpfJE4lWiE8JTgkSxsoQiBTU0kgCi0bJEIlRyUjJWwlLyVGJSMlViRyMkMkKCQ/JCQ+bDlnISIkPSRsJGkkTiVHJSMlbCUvJUYlIyVWJCw8QjlUJDUkbCRrGyhCCi0bJEIkaCQmJEsbKEIgPGNvZGU+LnNodG1sPC9jb2RlPiAbJEIzSEQlO1IkSyQ5JGskPyRhISIkPSROJVohPCU4JE5MPkEwJEghIhsoQgotGyRCJD0kTiVaITwlOCRYJE5BNCRGJE4laiVzJS8kckpROTkkNyRKJDEkbCRQJEokaSRKJCQkMyRIJEckOSEjGyhCPC9wPgotCi08cD4bJEIkYiQmMGwkRCROSn1LISRPISIbKEI8Y29kZT5YQml0SGFjazwvY29kZT4gGyRCJUclIyVsJS8lRiUjJVYkcjtITVEkOSRrJDMkSCRHJDkbKEI6PC9wPgotCi08cHJlPgotICAgICAgICBYQml0SGFjayBvbgotPC9wcmU+Ci0KLTxwPjxjb2RlPlhCaXRIYWNrPC9jb2RlPiAbJEIkTyEiJVUlISUkJWskTjxCOVQlUyVDJUgkLE4pJEMkRiQkJGs+bDlnISIbKEIKLVNTSSAbJEIlRyUjJWwlLyVGJSMlViRLJGgkajJyQE8kOSRrJDMkSCRyGyhCIEFwYWNoZSAbJEIkS0VBJCgkXiQ5ISM9PiRDJEYhIhsoQgotU1NJIBskQiVHJSMlbCUvJUYlIyVWJHI4PTpfJE4lWiE8JTgkSzJDJCgkayQ/JGEkSyRPISIlVSUhJSQla0w+JHJKUTk5JDckSiQvJEYkYiRoJC8hIhsoQgotGyRCQzEkSxsoQiA8Y29kZT5jaG1vZDwvY29kZT4gGyRCJHI7SE1RJDckRiVVJSElJCVrJHI8QjlUMkRHPSRLJDkkaxsoQgotGyRCJEAkMSRHOlEkXyReJDkhIxsoQjwvcD4KLQotPHByZT4KLSAgICAgICAgY2htb2QgK3ggcGFnZW5hbWUuaHRtbAotPC9wcmU+Ci0KLTxwPhskQjlUJEokJiRZJC0kRyRPJEokJCQzJEgkSzRYJDkka0M7JCQlMyVhJXMlSCEjO34hOUMvJCskLCEiGyhCCi0bJEJBNCRGJE4bKEIgPGNvZGU+Lmh0bWw8L2NvZGU+IBskQiVVJSElJCVrJHIbKEIgU1NJIBskQiRHMnJATyQ5JGskaCQmGyhCIEFwYWNoZSAbJEIkS0VBJCgkbCRQISIbKEIKLRskQiRvJDYkbyQ2GyhCIDxjb2RlPi5zaHRtbDwvY29kZT4gGyRCJEgkJCQmJVUlISUkJWtMPiRLJDkka0ksTVckLCRKJCQkSCQkJEMkRhsoQgotGyRCQSYkYSRrJE4kcjgrJGskMyRIJEckNyRnJCYhIyQzJCYkJCQmP00kPyRBJE8hIiQqJD0kaSQvGyhCIDxjb2RlPlhCaXRIYWNrPC9jb2RlPgotGyRCJEskRCQkJEZKOSQkJD8kMyRIJCwkSiQkJE4kRyQ3JGckJiEjJDMkTkp9SyEkSyREJCQkRkNtMFUkOSRrJDMkSCRPISIbKEIKLRskQiQ/JEgkKBsoQiBTU0kgGyRCJUclIyVsJS8lRiUjJVYkckE0JC80XiReJEokJD5sOWckRyRiISIbKEJBcGFjaGUgGyRCJCwlLyVpJSQlIiVzJUgkSxsoQgotGyRCQXcka0E0JEYkTiVVJSElJCVrJHI6RzhlJF4kR0ZJJF85fiReJDskayQzJEgkSyRKJGokXiQ5ISMbKEIKLRskQiQzJE5KfUshJE8kKyRKJGo9aE19JHJDWSQvJDkkayRiJE4kRyQiJGohIk5JJC8kSiQkJSIlJCVHJSIkRyQ5ISMbKEI8L3A+Ci0KLTxwPhskQiRiJEEkbSRzISIbKEJXaW5kb3dzIBskQiRHJE8kPSROJGgkJiRKPEI5VCVTJUMlSCRyJTslQyVIJDkkayRoJCYkSiRiJE4kTxsoQgotGyRCJCIkaiReJDskcyROJEclKiVXJTclZyVzJCw+LyQ3QCk4QiQ1JGwkRiQkJF4kOSEjGyhCPC9wPgotCi08cD4bJEIlRyVVJSklayVIJE5AX0RqJEckTyEiGyhCQXBhY2hlIBskQiRPGyhCIFNTSSAbJEIlWiE8JTgkSyREJCQkRjpHPSpKUTk5O345byRkGyhCCi0bJEIlMyVzJUYlcyVEJE5EOSQ1JHIbKEIgSFRUUCAbJEIlWCVDJUAkS0F3JGokXiQ7JHMhIxsoQgotGyRCRjBFKiRKJTMlcyVGJXMlRCRHJCIkayQ/JGEhIiQ9JGwkaSROQ00kcjdXOzskOSRrJE4kLEZxJDckJCQrJGkkRyQ5ISMbKEIKLRskQiQzJE4kPyRhJUklLSVlJWElcyVIJCwbKEIKLRskQiUtJWMlQyU3JWUkNSRsJEokLyRKJGohIjdrMkwkSCQ3JEYlLyVpJSQlIiVzJUgkTkAtRz0kLBsoQgotGyRCQ1kkLyRKJEMkPyRoJCYkSzQ2JDgkNSQ7JGskMyRIJEskSiRqJF4kOSEjGyhCCi0bJEIkMyRsJHIycjdoJDkka0p9SyEkLEZzJEQkIiRqJF4kORsoQjo8L3A+Ci0KLTxvbD4gCi0KLTxsaT48Y29kZT5YQml0SGFjayBGdWxsPC9jb2RlPiAbJEJAX0RqJHI7SE1RJDkkayEjJDMkTkBfRGokSyRoJGohIiRiJEgkYiRITVc1YSQ1JGwkPxsoQgotGyRCJVUlISUkJWskTjt+OW8kcjsyPkgkNyEiRkkkXzl+JF4kbCRrJVUlISUkJWskTkpROTk7fjlvJHIbKEIKLRskQkw1O2skNyRGOkc9KkpROTk7fjlvJHI3aERqJDkkayRoJCYbKEIgQXBhY2hlIBskQiRLRUEkKCReJDkhIxsoQjwvbGk+Ci0KLTxsaT48YSBocmVmPSIuLi9tb2QvbW9kX2V4cGlyZXMuaHRtbCI+bW9kX2V4cGlyZXM8L2E+IBskQiRHRHM2ISQ1JGwkRiQkJGslRyUjJWwlLyVGJSMlViRyO0hNUSQ3JEYhIhsoQgotGyRCJVUlISUkJWskLEw1OHokSyRKJGs7fjlvJHJMQDwoJDckXiQ5ISMbKEIKLRskQiQzJGwkSyRoJGohIiVWJWklJiU2JEglVyVtJS0lNyRLJS0lYyVDJTclZSQsTS04eiRHJCIkayQzJEgkckRMQ04kNyReJDkhIxsoQjwvbGk+Ci0KLTwvb2w+Ci0KLTxocj4KLTxoMj48YSBuYW1lPSJiYXNpY3NzaWRpcmVjdGl2ZXMiPhskQjRwS1xFKiRKGyhCIFNTSSAbJEIlRyUjJWwlLyVGJSMlVhsoQjwvYT48L2gyPgotCi08cD5TU0kgGyRCJUclIyVsJS8lRiUjJVYkTzBKMjwkTko4SyEkRzUtPVIkNyReJDkbKEI6PC9wPgotCi08cHJlPgotICAgICAgICAmbHQ7IS0tI2VsZW1lbnQgYXR0cmlidXRlPXZhbHVlIGF0dHJpYnV0ZT12YWx1ZSAuLi4gLS0mZ3Q7Ci08L3ByZT4KLQotPHA+SFRNTCAbJEIkTiUzJWElcyVIJE4kaCQmJEo9cTwwJHIkNyRGJCQkayROJEchIiRiJDcbKEIgU1NJIBskQiRyGyhCCi0bJEJANSQ3JC9GMDpuMkRHPSRLJDckSiQxJGwkUCEiJVYlaSUmJTYkTyQ9JGwkckw1O2skOSRrJEckNyRnJCYhIyQ3JCskNyEiGyhCCi1IVE1MIBskQiU9ITwlOUNmJEckTzgrJCgkXiQ5ISMkYiQ3GyhCIFNTSSAbJEIkckA1JDckL0BfRGokNyQ/JEokaSEiGyhCCi0bJEIlRyUjJWwlLyVGJSMlViRPJD0kTjdrMkwkSENWJC00OSQoJGkkbCReJDkhIxsoQjwvcD4KLQotPHA+ZWxlbWVudCAbJEIkTyQ/JC8kNSRzJCIkayRiJE4kKyRpMGwkRDtYRGokOSRrJDMkSCQsJEckLSReJDkhIxsoQgotGyRCO1hEaiRHJC0kayRiJE4kTkJnQj8/dCRLJEQkJCRGJE8hIjwhMnMkYiQmPi8kNz5cJDckL0BiTEAkNyReJDkhIxsoQgotGyRCJDMkMyRHJE8hIhsoQlNTSSAbJEIkRzlUJEokJiQzJEgkLCRHJC0ka05jJHIkJCQvJEQkKzwoJDckXiQ5ISMbKEI8L3A+Ci0KLTxoMz48YSBuYW1lPSJ0b2RheSdzZGF0ZSI+GyRCOiNGfCRORnxJVRsoQjwvYT48L2gzPgotCi08cHJlPgotICAgICAgICAmbHQ7IS0tI2VjaG8gdmFyPSJEQVRFX0xPQ0FMIiAtLSZndDsKLTwvcHJlPgotCi08cD48Y29kZT5lY2hvPC9jb2RlPiAbJEJNV0FHJE9DMSRLSlE/dCROQ00kcj1QTk8kNyReJDkhIxsoQkNHSSAbJEIlVyVtJTAlaSVgJEsbKEIKLRskQk14TVEyREc9JEo0RDYtSlE/dCROQTQkRiROJTslQyVIJHI0XiRgQj8kLyROSTg9YEpRP3QkLCQiJGokXiQ5ISMbKEIKLRskQiReJD8hIhsoQjxjb2RlPnNldDwvY29kZT4gGyRCTVdBRyRyTVEkJCRrJDMkSCRHISJGSDwrJE5KUT90JHJEajVBJDkkayQzJEgkLBsoQgotGyRCJEckLSReJDkhIxsoQjwvcD4KLQotPHA+GyRCPVBOTyQ1JGwka0Z8SVUkTj1xPDAkLDklJC0kRyRPJEokJD5sOWchIiQ9JE49cTwwJHIbKEIKLRskQj0kQDUkOSRrJD8kYSRLISIbKEI8Y29kZT5jb25maWc8L2NvZGU+IBskQk1XQUckSxsoQiA8Y29kZT50aW1lZm10PC9jb2RlPiAbJEJCMEAtJHIbKEIKLRskQjtITVEkOSRrJDMkSCQsJEckLSReJDkhIxsoQjwvcD4KLQotPHByZT4KLSAgICAgICAgJmx0OyEtLSNjb25maWcgdGltZWZtdD0iJUEgJUIgJWQsICVZIiAtLSZndDsKLSAgICAgICAgVG9kYXkgaXMgJmx0OyEtLSNlY2hvIHZhcj0iREFURV9MT0NBTCIgLS0mZ3Q7Ci08L3ByZT4KLQotPGgzPjxhIG5hbWU9Im1vZGlmaWNhdGlvbmRhdGVvZnRoZWZpbGUiPhskQiVVJSElJCVrJE5KUTk5RnwbKEI8L2E+PC9oMz4KLQotPHByZT4KLSAgICAgICAgVGhpcyBkb2N1bWVudCBsYXN0IG1vZGlmaWVkICZsdDshLS0jZmxhc3Rtb2QgZmlsZT0iaW5kZXguaHRtbCIgLS0mZ3Q7Ci08L3ByZT4KLQotPHA+GyRCJDMkTk1XQUckYhsoQiA8Y29kZT50aW1lZm10PC9jb2RlPiAbJEIlVSUpITwlXiVDJUgkTkBfRGokSz0+JCQkXiQ5ISMbKEI8L3A+Ci0KLTxoMz48YSBuYW1lPSJpbmNsdWRpbmd0aGVyZXN1bHRzb2ZhY2dpcHJvZ3JhbSI+Q0dJIBskQiVXJW0lMCVpJWAkTjdrMkwkcjxoJGo5fiRgGyhCCi08L2E+PC9oMz4KLQotPHA+GyRCJDMkbCRPISJBNCRGJE4/TSROJCo1JCRLRn4kaiRHJCIkaxsoQiBgYBskQiVSJUMlSCUrJSYlcyU/GyhCJycgGyRCJE4kaCQmJEobKEIgQ0dJIBskQiVXJW0lMCVpJWAkThsoQgotGyRCN2syTCRyPVBOTyQ5JGsbKEIgU1NJIBskQiROJGgkajBsSExFKiRKO0hNUSROJCYkQSROMGwkRCRHJDkhIxsoQjwvcD4KLQotPHByZT4KLSAgICAgICAgJmx0OyEtLSNpbmNsdWRlIHZpcnR1YWw9Ii9jZ2ktYmluL2NvdW50ZXIucGwiIC0tJmd0OwotPC9wcmU+Ci0KLTxocj4KLTxoMj48YSBuYW1lPSJhZGRpdGlvbmFsZXhhbXBsZXMiPhskQkRJMkMkTk5jGyhCPC9hPjwvaDI+Ci0KLTxwPhskQjBKMjwkTyEiGyhCU1NJIBskQiRyO0hNUSQ3JEYbKEIgSFRNTCAbJEIlSSUtJWUlYSVzJUgkSyQqJCQkRiRHJC0kayQzJEgkThsoQgotGyRCJCQkLyREJCskTkZDSkwkSk5jJEckOSEjGyhCPC9wPgotCi08aHI+Ci08aDI+PGEgbmFtZT0id2hlbndhc3RoaXNkb2N1bWVudG1vZGlmaWVkIj4bJEIkJCREJDMkTiVJJS0lZSVhJXMlSCRPPSRANSQ1JGwkPyROJCsbKEI/Ci08L2E+PC9oMj4KLQotPHA+GyRCQGgkSyEiJUklLSVlJWElcyVIJCw6RzhlJEtKUTk5JDUkbCQ/JE4kTyQkJEQkKyRyJWYhPCU2JEtETENOJDkkayQ/JGEkSxsoQiBTU0kgGyRCJHI7SE1RJDkkayQzJEgkLCRHJC0kayQzJEgkchsoQgotGyRCPVIkWSReJDckPyEjJDckKyQ3JEokLCRpISI8QjpdJE5KfUshJE8hIiQkJC8kViRzTGRCaiROJF4kXiRLJDckRiQqJC0kXiQ3JD8hIxsoQgotSFRNTCAbJEIlSSUtJWUlYSVzJUgkS0dbQ1YkNSRsJD88ISROJTMhPCVJJE8hIiVaITwlOCRLGyhCCi0bJEIkPSROJGgkJiRKJT8lJCVgJTklPyVzJVckckZ+JGwkayRHJDckZyQmISMkYiRBJG0kcyEiPmU9UiROGyhCCi0bJEIkaCQmJEshIhsoQlNTSSAbJEIkckA1JDckL0YwOm4yREc9JEskNyRGJCokL0ksTVckLCQiJGokXiQ5ISMbKEI8L3A+Ci0KLTxwcmU+Ci0gICAgICAgICZsdDshLS0jY29uZmlnIHRpbWVmbXQ9IiVBICVCICVkLCAlWSIgLS0mZ3Q7Ci0gICAgICAgIFRoaXMgZmlsZSBsYXN0IG1vZGlmaWVkICZsdDshLS0jZmxhc3Rtb2QgZmlsZT0ic3NpLnNodG1sIiAtLSZndDsKLTwvcHJlPgotCi08cD4bJEIkYiRBJG0kcyEiGyhCPGNvZGU+c3NpLnNodG1sPC9jb2RlPiAbJEIkTkl0SiwkcjxCOl0kTkV2MzolVSUhJSQla0w+JEgbKEIKLRskQkNWJC00OSQoJGtJLE1XJCwkIiRqJF4kOSEjJGIkNyEiJCIkaSRmJGslVSUhJSQlayRLRCUkayQzJEgkLBsoQgotGyRCJEckLSRrMGxITEUqJEolMyE8JUkkckM1JDckRiQkJGskSiRpISIkMyRsJE9JVEpYJEckIiRrJCskYiQ3JGwkXiQ7JHMhIxsoQgotGyRCJCokPSRpJC8kPSROPmw5ZyRPISIkPSQmJDkka0JlJG8kaiRLSlE/dBsoQiA8Y29kZT5MQVNUX01PRElGSUVEPC9jb2RlPgotGyRCJHI7SE1RJDckPyQkJEg5TSQoJGskRyQ3JGckJhsoQjo8L3A+Ci0KLTxwcmU+Ci0gICAgICAgICZsdDshLS0jY29uZmlnIHRpbWVmbXQ9IiVEIiAtLSZndDsKLSAgICAgICAgVGhpcyBmaWxlIGxhc3QgbW9kaWZpZWQgJmx0OyEtLSNlY2hvIHZhcj0iTEFTVF9NT0RJRklFRCIgLS0mZ3Q7Ci08L3ByZT4KLQotPHA+PGNvZGU+dGltZWZtdDwvY29kZT4gGyRCPXE8MCRLJEQkJCRGJE4kaCRqPlw6WSRLJEQkJCRGJE8hIhsoQgotGyRCJCo5JSRfJE44ITp3JTUlJCVIJEs5VCQtISIbKEI8Y29kZT5jdGltZTwvY29kZT4gGyRCJEc4ITp3JDckRiRfJEYkLyRAJDUkJCEjSjhLISRPRjEkOCRHJDkhIxsoQjwvcD4KLQotPGhyPgotPGgyPjxhIG5hbWU9ImluY2x1ZGluZ2FzdGFuZGFyZGZvb3RlciI+GyRCSTg9YCROJVUlQyU/JHJBXkZ+JDkkaxsoQjwvYT48L2gyPgotCi08cD4bJEIkYiQ3P3QlWiE8JTgkckQ2JCgkayVaITwlOCRyO30kRCU1JSQlSCRyNElNfSQ3JEYkJCRrJEokaSRQISIbKEIKLRskQkE0JVohPCU4JEtCUCQ3JEZKUTlgJHI5VCRKJCYkMyRIJCxLXEV2JEs2bERLJEgkSiRqRkAkayQzJEgkLEosJCskayRHJDckZyQmISMbKEIKLRskQkE0JEYkTiVaITwlOCRLRU8kQyRGJCIkazxvJE5JOD1gRSokSjMwNFEkcjBdO30kNyRoJCYkSBsoQgotGyRCJDckRiQkJGskSiRpJFBGQyRLJD0kJiRHJDckZyQmISMbKEI8L3A+Ci0KLTxwPhskQiVYJUMlQCRkJVUlQyU/TVEkTkFeRn5NUSVVJSElJCVrJHI7SE1RJDkkayQzJEgkRyEiJDMkTiRoJCYkShsoQgotGyRCOTk/NyRLJCskKyRrSWlDNCRyODokaSQ5JDMkSCQsJEckLSReJDkhIzBsJEQkTiVVJUMlPyVVJSElJCVrJHIbKEIKLRskQjpuQC4kNyEiJD0kbCRyGyhCIDxjb2RlPmluY2x1ZGU8L2NvZGU+IFNTSSAbJEIlMyVeJXMlSSRHM0YlWiE8JTgkSxsoQgotGyRCRn4kbCRrJEAkMSRHOlEkXyReJDkhIxsoQjxjb2RlPmluY2x1ZGU8L2NvZGU+IBskQk1XQUckTyEiGyhCPGNvZGU+ZmlsZTwvY29kZT4gGyRCQjBALRsoQgotGyRCJF4kPyRPGyhCIDxjb2RlPnZpcnR1YWw8L2NvZGU+IBskQkIwQC0kTiQkJDokbCQrJHI7SE1RJDckRiRJJE4lVSUhJSQlayRyQV5GfiQ5JGskKyRyGyhCCi0bJEI3aCRhJGskMyRIJCwkRyQtJF4kOSEjGyhCPGNvZGU+ZmlsZTwvY29kZT4gGyRCQjBALSRPISIbKEI8ZW0+GyRCJSslbCVzJUglRyUjJWwlLyVIJWokKyRpJE4bKEIKLRskQkFqQlAlUSU5JEc8KCQ1JGwkPxsoQjwvZW0+GyRCJVUlISUkJWslUSU5JEckOSEjJD0kbCRPGyhCCi0vIBskQiRHO08kXiRrQGRCUCVVJSElJCVrJVElOSRLJE8kRyQtJDohIiReJD8hIiQ9JE4lUSU5JE4wbEl0JEsbKEIgLi4vIBskQiRyGyhCCi0bJEI0XiRgJDMkSCQsJEckLSRKJCQkMyRIJHIwVUwjJDckXiQ5ISMbKEI8Y29kZT52aXJ0dWFsPC9jb2RlPiAbJEJCMEAtJE8hIiQqJD0kaSQvGyhCCi0bJEIkaCRqSlhNeCRAJEg7VyQkJF4kOSQsISJEczYhJDkkayVJJS0lZSVhJXMlSCQrJGkkTkFqQlAbKEIgVVJMIBskQiRHO1hEaiQ5JFkkLSRHJDkhIxsoQgotGyRCJD0kbCRPGyhCIC8gGyRCJEc7TyRhJGskMyRIJCwkRyQtJF4kOSQsISJEczYhJDkkayVVJSElJCVrJEhGMSQ4JTUhPCVQPmUkSxsoQgotGyRCQjg6XyQ3JEokLyRGJE8kSiRqJF4kOyRzISMbKEI8L3A+Ci0KLTxwcmU+Ci0gICAgICAgICZsdDshLS0jaW5jbHVkZSB2aXJ0dWFsPSIvZm9vdGVyLmh0bWwiIC0tJmd0OwotPC9wcmU+Ci0KLTxwPhskQjtkJE86RzhlJE5GcyREJHJBSCRfOWckbyQ7JEYhIhsoQjxjb2RlPkxBU1RfTU9ESUZJRUQ8L2NvZGU+IBskQiVHJSMlbCUvJUYlIyVWJHIbKEIKLRskQiVVJUMlPyVVJSElJCVrJE5DZiRLQ1YkLyQzJEgkLCRoJC8kIiRqJF4kOSEjGyhCCi1TU0kgGyRCJUclIyVsJS8lRiUjJVYkTyEiQV5Gfk1RJE4lVSUhJSQlayRLNF4kXiQ7JD8kaiEiGyhCCi0bJEJBXkZ+JVUlISUkJWskTiVNJTklSCRyJDckPyRqJDkkayQzJEgkLCRHJC0kXiQ5ISMkOSRKJG8kQSEiGyhCCi0bJEJBXkZ+TVEkTiVVJSElJCVrJE9CPiROJVUlISUkJWskcjpGNSJFKiRLQV5GfiQ5JGskMyRIJCwkRyQtJF4kOSEjGyhCPC9wPgotCi08aHI+Ci08aDI+PGEgbmFtZT0id2hhdGVsc2VjYW5pY29uZmlnIj4bJEJCPiRLMj8kLEBfRGokRyQtJGskTiQrGyhCPzwvYT48L2gyPgotCi08cD4bJEI7fjlvPXE8MCRyGyhCIDxjb2RlPmNvbmZpZzwvY29kZT4gGyRCJEdAX0RqJEckLSRrJDMkSCRLMkMkKCRGISIbKEIKLRskQjk5JEtGcyREGyhCIDxjb2RlPmNvbmZpZzwvY29kZT4gGyRCJEdAX0RqJDkkayQzJEgkLCRHJC0kXiQ5ISMbKEI8L3A+Ci0KLTxwPhskQkRMPm8hIhsoQlNTSSAbJEIlRyUjJWwlLyVGJSMlViRHMj8kKyQsJCYkXiQvJCQkKyRKJCQkSCQtJE8hIjwhJE4lYSVDJTshPCU4JCwbKEIKLRskQj1QTk8kNSRsJF4kOSEjGyhCPC9wPgotCi08cHJlPgotICAgICAgICBbYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGlzIGRpcmVjdGl2ZV0KLTwvcHJlPgotCi08cD4bJEIkMyROJWElQyU7ITwlOCRyQj4kTiRiJE4kSyQ3JD8kJD5sOWchIhsoQgotPGNvZGU+Y29uZmlnPC9jb2RlPiAbJEJNV0FHJE4bKEIgPGNvZGU+ZXJybXNnPC9jb2RlPiAbJEJCMEAtJEdKUTk5JDkkayQzJEgkLBsoQgotGyRCJEckLSReJDkbKEI6PHA+Ci0KLTxwcmU+Ci0gICAgICAgICZsdDshLS0jY29uZmlnIGVycm1zZz0iW0l0IGFwcGVhcnMgdGhhdCB5b3UgZG9uJ3Qga25vdyBob3cgdG8gdXNlIFNTSV0iIC0tJmd0OwotPC9wcmU+Ci0KLTxwPhskQiQqJD0kaSQvISIlKCVzJUklZiE8JTYkTyQzJE4lYSVDJTshPCU4JHI3aCQ3JEY4KyRrJDMkSCRPJCIkaiReJDskcyEjGyhCCi0bJEIkSiQ8JEokaSEiJD0kTiU1JSQlSCQsQDgkLSQ/PnVCViRLJEoka0EwJEsbKEIgU1NJIBskQiVHJSMlbCUvJUYlIyVWJEs0WCQ5JGsbKEIKLRskQkE0JEYkTkxkQmokcjJyN2gkNyRGJCQkayRPJDokQCQrJGkkRyQ5ISMbKEIoGyRCJD0kJiRHJDkkaCRNGyhCPyk8L3A+Ci0KLTxwPhskQiQ9JDckRiEiGyhCPGNvZGU+Y29uZmlnPC9jb2RlPiAbJEIkSyQqJCQkRhsoQiA8Y29kZT5zaXplZm10PC9jb2RlPiAbJEJCMEAtJHI7SE1RJDkkayQzJEgkRyEiGyhCCi0bJEJKViQ1JGwkayVVJSElJCVrJTUlJCU6JE49cTwwJHJAX0RqJDkkayQzJEgkLCRHJC0kXiQ5ISMbKEIKLRskQiVQJSQlSD90JEskTxsoQiA8Y29kZT5ieXRlczwvY29kZT4gGyRCJHIhIkUsRXYkSxsoQiBLYiAbJEIkZBsoQiBNYiAbJEIkSxsoQgotGyRCQzs9TCQ1JDskayRLJE8bKEIgPGNvZGU+YWJicmV2PC9jb2RlPiAbJEIkcjtYRGokOSRrJDMkSCQsJEckLSReJDkhIxsoQjwvcD4KLQotPGhyPgotPGgyPjxhIG5hbWU9ImV4ZWN1dGluZ2NvbW1hbmRzIj4bJEIlMyVeJXMlSSROPEI5VBsoQjwvYT48L2gyPgotCi08cD4bJEI6IzhlP3QldjduJE5GYiRLISI+LiQ1JEobKEIgQ0dJIBskQiVXJW0lMCVpJWAkSBsoQiBTU0kgGyRCJHI7SE1RJDkkaxsoQgotGyRCNS07diRyPVAkNyQ/JCQkSDlNJCgkRiQkJF4kOSEjJDMkMyRHJE8kPSRsJEgkT0pMJEshIhsoQgotPGNvZGU+ZXhlYzwvY29kZT4gGyRCTVdBRyRLJGgkQyRGOVQkSiQmJDMkSCQsJEckLSRrJDMkSCRyPCgkNyReJDkhIxsoQgotU1NJIBskQiRLJTclJyVrGyhCICgbJEJANTNOJEskTxsoQiA8Y29kZT4vYmluL3NoPC9jb2RlPhskQiEjGyhCV2luMzIgGyRCJEokaSRQGyhCIERPUyAbJEIlNyUnJWsbKEIpCi0bJEIkcjtITVEkNyRGJTMlXiVzJUkkcjxCOVQkNSQ7JGskMyRIJCwkRyQtJF4kOSEjMjw1LSROTmMkRyRPISIlRyUjJWwlLyVIJWobKEIKLRskQiVqJTklSD1QTk8kcjlUJEokJCReJDkhIxsoQjwvcD4KLQotPHByZT4KLSAgICAgICAgJmx0O3ByZSZndDsKLSAgICAgICAgJmx0OyEtLSNleGVjIGNtZD0ibHMiIC0tJmd0OwotICAgICAgICAmbHQ7L3ByZSZndDsKLTwvcHJlPgotCi08cD5XaW5kb3dzIBskQj5lJEckTyEiGyhCPC9wPgotCi08cHJlPgotICAgICAgICAmbHQ7cHJlJmd0OwotICAgICAgICAmbHQ7IS0tI2V4ZWMgY21kPSJkaXIiIC0tJmd0OwotICAgICAgICAmbHQ7L3ByZSZndDsKLTwvcHJlPgotCi08cD5XaW5kb3dzIBskQj5lJEckTyEiJDMkTiVHJSMlbCUvJUYlIyVWJEskaCRDJEYkJCQvJEQkKyRONHFMLyRKGyhCCi0bJEI9cTwwJEs1JCRFJC8kRyQ3JGckJiEjJEokPCRKJGkbKEIgPGNvZGU+ZGlyPC9jb2RlPiAbJEIkTj1QTk8kLBsoQgotGyRCSjg7ek5zGyhCIGBgJmx0Ozxjb2RlPmRpcjwvY29kZT4mZ3Q7JycgGyRCJHI0XiRfISIlViVpJSYlNiRyOi5NcCQ1JDskayQrJGkkRyQ5ISMbKEI8L1A+Ci0KLTxwPhskQiQzJE41IUc9JE9Icz5vJEs0bTgxJEckIiRqISIkSSRzJEolMyE8JUkkRyRiGyhCIDxjb2RlPmV4ZWM8L2NvZGU+IBskQiU/JTAkSxsoQgotGyRCS2QkYTl+JF4kbCRGJDckXiQoJFA8QjlUJDkkayQzJEgkS0NtMFUkNyRGJC8kQCQ1JCQhI05jJCgkUBsoQiAKLWBgIBskQiUyJTklSCVWJUMlLxsoQiAnJyAbJEIkTiRoJCYkSyEiJGIkNyEiJWYhPCU2JCwlWiE8JTgkTkZiTUYkchsoQgotGyRCSlQ9OCRHJC0kaz51NjckSyQiJGskSiRpJFAhIiQzJE41IUc9JHIzTjxCJEtNXkApJDckRiQvJEAkNSQkISMbKEIKLTxjb2RlPk9wdGlvbnM8L2NvZGU+IBskQiVHJSMlbCUvJUYlIyVWJE4bKEIgPGNvZGU+SW5jbHVkZXNOT0VYRUM8L2NvZGU+IBskQjB6P3QkcjtYRGokOSRrJDMkSCRHISIbKEIKLVNTSSAbJEIkTzV2MkQkOSRrJDEkbCRJGyhCIDxjb2RlPmV4ZWM8L2NvZGU+IBskQjUhRz0kTzV2MkQkNyRKJCQkaCQmJEskOSRrJDMkSCQsJEckLSReJDkhIxsoQjwvcD4KLQotPGhyPgotPGgyPjxhIG5hbWU9ImFkdmFuY2Vkc3NpdGVjaG5pcXVlcyI+GyRCOWJFWSRKGyhCIFNTSSAbJEIlRiUvJUslQyUvGyhCPC9hPjwvaDI+Ci0KLTxwPhskQiUzJXMlRiVzJUQkcj1QTk8kOSRrJDMkSCRLMkMkKCEiGyhCQXBhY2hlIFNTSSAbJEIkT0pRP3QkckBfRGokNyEiJD0kNyRGSGYzUxsoQgotGyRCJEg+cjdvSiw0dCRLJD0kTkpRP3QkcjtITVEkRyQtJGs1IUc9JHJEczYhJDckRiQkJF4kOSEjGyhCPC9wPgotCi08aDM+PGEgbmFtZT0iY2F2ZWF0Ij4bJEI3WTlwGyhCPC9hPjwvaDM+Ci0KLTxwPhskQiQzJE41LTt2JEc9UiRZJD9CZ0l0SiwkTjUhRz0kTyEiGyhCQXBhY2hlIDEuMiAbJEIwSjlfJHIbKEIKLRskQjtITVEkNyRGJCQkaz5sOWckTiRfTXhNUTJERz0kRyQ5ISMkYiRBJG0kcyEiJGIkNxsoQiBBcGFjaGUgMS4yIBskQjBKOV8kchsoQgotGyRCO0hNUSQ3JEYkSiQkPmw5ZyEiRD4kQSRLJSIlQyVXJTAlbCE8JUkkOSRrSSxNVyQsJCIkaiReJDkhIxsoQgotGyRCJDUkISEiOiMkPSRsJHI5VCRKJCQkSiQ1JCQhIyQ9JGwkXiRHQlQkQyRGJCQkXiQ5ISMbKEI8L3A+Ci0KLTxocj4KLTxoMj48YSBuYW1lPSJzZXR0aW5ndmFyaWFibGVzIj4bJEJKUT90JHJAX0RqJDkkaxsoQjwvYT48L2gyPgotCi08cD48Y29kZT5zZXQ8L2NvZGU+IBskQiVHJSMlbCUvJUYlIyVWJHI7SE1RJDckRiEiOGUkRztITVEkOSRrJD8kYSRLSlE/dCRyGyhCCi0bJEJAX0RqJDkkayQzJEgkLCRHJC0kXiQ5ISMkMyRsJE84ZSROQGJMQCRHSSxNVyRLJEokayROJEchIiQzJDMkRxsoQgotGyRCJD0kbCRLJEQkJCRGPVIkWSRGJCQkXiQ5ISNKOEshJE8wSjI8JE4kSCQqJGokRyQ5GyhCOjwvcD4KLQotPHByZT4KLSAgICAgICAgJmx0OyEtLSNzZXQgdmFyPSJuYW1lIiB2YWx1ZT0iUmljaCIgLS0mZ3Q7Ci08L3ByZT4KLQotPHA+GyRCJDMkTiRoJCYkS0MxPWMkS0o4O3okSSQqJGokS0BfRGokOSRrJDMkSCRLMkMkKCEiGyhCCi0bJEJOYyQoJFA0RDYtSlE/dCRkQTAkTjUtO3YkRz1SJFkkP0pRP3QbKEIgKBskQk5jJCgkUBsoQiA8Y29kZQotPkxBU1RfTU9ESUZJRUQ8L2NvZGU+IBskQiROJGgkJiRKGyhCKSAbJEIkcjReJGBCPiROJCIkaSRmJGtKUT90JHIbKEIKLRskQkNNJHJAX0RqJDkkayROJEs7SE1RJDkkayQzJEgkLBsoQgotGyRCJEckLSReJDkhI0pRP3RMPiROQTAkSyVJJWs1LTlmGyhCICgkKSAbJEIkcjtITVEkOSRrJDMkSCRHISIbKEIKLRskQiQ9JGwkLCVqJUYlaSVrSjg7ek5zJEckTyRKJC8kRkpRP3QkRyQiJGskMyRIJHI8KCQ3JF4kOSEjGyhCPC9wPgotCi08cHJlPgotICAgICAgICAmbHQ7IS0tI3NldCB2YXI9Im1vZGlmaWVkIiB2YWx1ZT0iJExBU1RfTU9ESUZJRUQiIC0tJmd0OwotPC9wcmU+Ci0KLTxwPhskQiVJJWs1LTlmGyhCICgkKSAbJEIkcko4O3okSCQ3JEZKUT90JE5DTSRLRn4kbCRrJEskTyEiJVAlQyUvJTklaSVDJTclZSRLJGgkQyRGGyhCCi0bJEIlSSVrNS05ZiRyJSglOSUxITwlVyQ5JGtJLE1XJCwkIiRqJF4kOSEjGyhCPC9wPgotCi08cHJlPgotICAgICAgICAmbHQ7IS0tI3NldCB2YXI9ImNvc3QiIHZhbHVlPSJcJDEwMCIgLS0mZ3Q7Ci08L3ByZT4KLQotPHA+GyRCOkc4ZSRLJEokaiReJDkkLCEiRDkkJEo4O3pOcyROQ2YkS0pRP3QkckNWJC0kPyQkPmw5ZyRHISIbKEIKLRskQkpRP3RMPiQsQj4kTko4O3okSCRWJEQkKyRrMkRHPUAtJCwkIiRqISIkPSRsJGkkTko4O3okSyREJCQkRhsoQgotGyRCOi5NcCQ3JEYkNyReJCY+bDlnISIkMyROOi5NcCRyPGgkaj18JC8kPyRhISJKUT90TD4kckNmM2c4TCRHGyhCCi0bJEIwTyRgJDMkSCQsJEckLSReJDkbKEIgKBskQiQzJGwkSyREJCQkRiROTkkkJE5jJHI8KCQ5JE4kT0ZxJDckJCROJEckOSQsISIbKEIKLRskQiQqJD0kaSQvSiwkKyRDJEYkJCQ/JEAkMSRrJEckNyRnJCYbKEIpGyRCISMbKEI8L1A+Ci0KLTxwcmU+Ci0gICAgICAgICZsdDshLS0jc2V0IHZhcj0iZGF0ZSIgdmFsdWU9IiR7REFURV9MT0NBTH1fJHtEQVRFX0dNVH0iIC0tJmd0OwotPC9wcmU+Ci0KLTxocj4KLTxoMj48YSBuYW1lPSJjb25kaXRpb25hbGV4cHJlc3Npb25zIj4bJEI+cjdvPDAbKEI8L2E+PC9oMj4KLQotPHA+GyRCJDUkRiEiSlE/dCRyO30kQyRGJCQkRiEiJD0kbCRpJE5DTSRyQF9EaiQ3JEZIZjNTJDkkayQzJEgkLCRHJC0kayROJEckOSQrJGkhIhsoQgotGyRCPnI3byRyST0kOSQ/JGEkSyQ9JGwkaSRyO0hNUSQ5JGskMyRIJCwkRyQtJF4kOSEjJDMkbCRLJGgkahsoQiBTU0kgGyRCJE8bKEIKLRskQiQiJGs8byROPi4kNSRKJVclbSUwJWklXyVzJTA4QDhsJEskSiRDJEYkJCReJDkhIxsoQjxjb2RlPm1vZF9pbmNsdWRlPC9jb2RlPiAbJEIkTxsoQgotGyRCPnI3byRyST04PSQ5JGskPyRhJEsbKEIgPGNvZGU+aWY8L2NvZGU+LCA8Y29kZT5lbGlmPC9jb2RlPiwgPGNvZGU+ZWxzZTwvY29kZT4sCi08Y29kZT5lbmRpZjwvY29kZT4gGyRCOT1CJCRyRHM2ISQ3JEYkJCReJDkhIyQzJGwkSyRoJEMkRiEiMGwkRCROPEI6XSROJVohPCU4JCskaRsoQgotGyRCSiM/dCROT0BNfSVaITwlOCRyOHoyTEUqJEtAOEAuJDkkayQzJEgkLCRHJC0kXiQ5ISMbKEI8L3A+Ci0KLTxwPhskQj5yN285PUIkJE8wSjI8JE4kSCQqJGokRyQ5GyhCOjwvcD4KLQotPHByZT4KLSAgICAgICAgJmx0OyEtLSNpZiBleHByPSJ0ZXN0X2NvbmRpdGlvbiIgLS0mZ3Q7Ci0gICAgICAgICZsdDshLS0jZWxpZiBleHByPSJ0ZXN0X2NvbmRpdGlvbiIgLS0mZ3Q7Ci0gICAgICAgICZsdDshLS0jZWxzZSAtLSZndDsKLSAgICAgICAgJmx0OyEtLSNlbmRpZiAtLSZndDsKLTwvcHJlPgotCi08cD48ZW0+dGVzdF9jb25kaXRpb248L2VtPiAbJEIkTyQiJGkkZiRrPG9OYCROT0BNfUUqSGYzUyRyJDkkayQzJEgkLCRHJC0kXiQ5ISMbKEIKLRskQkNNJHJIZjNTJDckPyRqISIkPSROQ00kLBsoQiBgYBskQj8/GyhCJycgGyRCJCskSSQmJCskckk+MkEkNyReJDkbKEIgKBskQjZ1JEckSiQkJEokaRsoQgotGyRCTT8kKCRpJGwkP0o4O3pOcyRPPz8kRyQ5GyhCKRskQiEjTXhNUTJERz0kSkhmM1MxaTs7O1IkTkE0JEYkTiVqJTklSCRLJEQkJCRGJE8hIhsoQgotPGNvZGU+bW9kX2luY2x1ZGU8L2NvZGU+IBskQiVJJS0lZSVhJXMlRiE8JTclZyVzJHI7Mj5IJDckRiQvJEAkNSQkISMbKEIKLRskQiQzJDMkRyRPISIkMyROOT1CJCRyJEkkJjtITVEkOSRrJCskTk5jJHIkJCQvJEQkKzwoJDckXiQ5ISMbKEI8L3A+Ci0KLTxwPhskQkBfRGolVSUhJSQlayRHPCEkTjlUJHI1LT1SJDckXiQ5GyhCOjwvUD4KLQotPHByZT4KLSAgICAgICAgQnJvd3Nlck1hdGNoTm9DYXNlIG1hY2ludG9zaCBNYWMKLSAgICAgICAgQnJvd3Nlck1hdGNoTm9DYXNlIE1TSUUgSW50ZXJuZXRFeHBsb3JlcgotPC9wcmU+Ci0KLTxwPhskQiQzJGwkTyUvJWklJCUiJXMlSCQsGyhCIE1hY2ludG9zaCAbJEI+ZSRHJSQlcyU/ITwlTSVDJUglKCUvJTklVyVtITwlaSQsGyhCCi0bJEJGMCQkJEYkJCRrPmw5ZyEiNEQ2LUpRP3QbKEIgYGBNYWMnJyAbJEIkSBsoQiBgYEludGVybmV0RXhwbG9yZXInJyAbJEIkcj8/JEhAX0RqJDckXiQ5ISMbKEI8L1A+Ci0KLTxwPhskQjwhJEshIhsoQlNTSSAbJEIkLDJERz0kSyRKJEMkPyVJJS0lZSVhJXMlSCRHMEoyPCRyOVQkSiQkJF4kORsoQjo8L3A+Ci0KLTxwcmU+Ci0gICAgICAgICZsdDshLS0jaWYgZXhwcj0iJHtNYWN9ICZhbXA7JmFtcDsgJHtJbnRlcm5ldEV4cGxvcmVyfSIgLS0mZ3Q7Ci0gICAgICAgIEFwb2xvZ2V0aWMgdGV4dCBnb2VzIGhlcmUKLSAgICAgICAgJmx0OyEtLSNlbHNlIC0tJmd0OwotICAgICAgICBDb29sIEphdmFTY3JpcHQgY29kZSBnb2VzIGhlcmUKLSAgICAgICAgJmx0OyEtLSNlbmRpZiAtLSZndDsKLTwvcHJlPgotCi08cD5NYWMgGyRCPmUkThsoQiBJRSAbJEIkS0JQJDckRjI/JCs7VyQmJEgkMyRtJCwkIiRrJG8kMSRHJCIkaiReJDskcyEjGyhCCi0bJEJCPiRHJE88QjlUJEckLSRGJCQkayQkJC8kRCQrJE4bKEIgSmF2YVNjcmlwdCAbJEIkchsoQiBNYWMgGyRCPmUkThsoQiBJRSAbJEIkRxsoQgotGyRCPEI5VCQ1JDskayROJEshIkBoPTU/dDt+NFY2bE8rJDckPyRIJCQkJiRAJDEkTiQzJEgkRyQ5ISMbKEIKLRskQj5lJE5OYyRPJD0kTjtDRGpFKiRKQlA9aEp9SyEkRyQ5ISMbKEI8L3A+Ci0KLTxwPhskQkI+JE4kSSRzJEpKUT90GyhCICgbJEIkIiRKJD8kLERqNUEkOSRrJGIkTiEiJF4kPyRPSWFETCRONEQ2LUpRP3QkTiQkJDokbCQrGyhCKSAbJEIkYiEiGyhCCi0bJEI+cjdvSjgkSztITVEkOSRrJDMkSCQsJEckLSReJDkhIxsoQkFwYWNoZSAbJEIkTxsoQiA8Y29kZT5TZXRFbnZJZjwvY29kZT4gCi0bJEIlRyUjJWwlLyVGJSMlViRkQj4kTjRYTyIlRyUjJWwlLyVGJSMlVjtITVEkNyRGNEQ2LUpRP3QkckBfRGokOSRrJDMkSCQsGyhCCi0bJEIkRyQtJF4kOSEjJDMkTjUhRz0kSyRoJGohIhsoQkNHSSAbJEIkS01qJGskMyRIJEokLyQrJEokakojOygkSkYwRSokSiQzJEgkciQ1JDskaxsoQgotGyRCJDMkSCQsJEckLSReJDkhIxsoQjwvcD4KLQotPGhyPgotPGgyPjxhIG5hbWU9ImNvbmNsdXNpb24iPhskQj0qJG8kaiRLGyhCPC9hPjwvaDI+Ci0KLTxwPlNTSSAbJEIkTzNOJCskSxsoQiBDR0kgGyRCJGRGMEUqJEolJiUnJVYlWiE8JTgkckA4QC4kOSRrQj4kTjU7PVEkS0JlJG8kayRiJE4bKEIKLRskQiRHJE8kIiRqJF4kOyRzISMkNyQrJDchIhsoQgotGyRCJD8kLyQ1JHMkTk0+SiwkSjpuNkgkciQ7JDokSyEiPi9OTCRORjBFKiRKJTMlcyVGJXMlRCRyMkMkKCRrJEskTxsoQgotGyRCJDkkMCRsJD9KfUshJEckOSEjGyhCPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9pbWFnZXMvYXBhY2hlX2hlYWRlci5naWYgYi9kb2NzL21hbnVhbC9pbWFnZXMvYXBhY2hlX2hlYWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MGU0MjEuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvaW1hZ2VzL2FwYWNoZV9oZWFkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvaW1hZ2VzL2N1c3RvbV9lcnJvcmRvY3MucG5nIGIvZG9jcy9tYW51YWwvaW1hZ2VzL2N1c3RvbV9lcnJvcmRvY3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTU1M2NiLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2ltYWdlcy9jdXN0b21fZXJyb3Jkb2NzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2ltYWdlcy9ob21lLmdpZiBiL2RvY3MvbWFudWFsL2ltYWdlcy9ob21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEyOTljMS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9pbWFnZXMvaG9tZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9pbWFnZXMvaW5kZXguZ2lmIGIvZG9jcy9tYW51YWwvaW1hZ2VzL2luZGV4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQxYzg5My4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9pbWFnZXMvaW5kZXguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvaW1hZ2VzL21vZF9yZXdyaXRlX2ZpZzEuZ2lmIGIvZG9jcy9tYW51YWwvaW1hZ2VzL21vZF9yZXdyaXRlX2ZpZzEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjRhYzFlLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2ltYWdlcy9tb2RfcmV3cml0ZV9maWcxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2ltYWdlcy9tb2RfcmV3cml0ZV9maWcxLnBuZyBiL2RvY3MvbWFudWFsL2ltYWdlcy9tb2RfcmV3cml0ZV9maWcxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNhNjhkOS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9pbWFnZXMvbW9kX3Jld3JpdGVfZmlnMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9pbWFnZXMvbW9kX3Jld3JpdGVfZmlnMi5naWYgYi9kb2NzL21hbnVhbC9pbWFnZXMvbW9kX3Jld3JpdGVfZmlnMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYThjYjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvaW1hZ2VzL21vZF9yZXdyaXRlX2ZpZzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvaW1hZ2VzL21vZF9yZXdyaXRlX2ZpZzIucG5nIGIvZG9jcy9tYW51YWwvaW1hZ2VzL21vZF9yZXdyaXRlX2ZpZzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzE0MWJlLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2ltYWdlcy9tb2RfcmV3cml0ZV9maWcyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2ltYWdlcy9waXhlbC5naWYgYi9kb2NzL21hbnVhbC9pbWFnZXMvcGl4ZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDgwMTQ3Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2ltYWdlcy9waXhlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9pbWFnZXMvc3ViLmdpZiBiL2RvY3MvbWFudWFsL2ltYWdlcy9zdWIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzA2MWM1Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2ltYWdlcy9zdWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvaW5kZXguaHRtbCBiL2RvY3MvbWFudWFsL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZmVmNzUuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QXBhY2hlLTIuMCBEb2N1bWVudGF0aW9uPC90aXRsZT4KLTwvaGVhZD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08aDI+TWFudWFsIEluZGV4IGZvciBBcGFjaGUtMi4wPC9oMj4KLTxwPlRoZSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIHNwbGl0IGludG8gMiBzZWN0aW9ucy4gIE9uZSBpcyBmb3IgcGVvcGxlIGluc3RhbGxpbmcgYW5kIGNvbmZpZ3VyaW5nIGFuIEFwYWNoZSBzZXJ2ZXIsIHRoZSBvdGhlciBpcyBmb3IgdGhvc2Ugd2hvIGFyZSBkZXZlbG9waW5nIHRoZSBzZXJ2ZXIuPC9wPgotPGgzIGFsaWduPSJjZW50ZXIiPldoZXJlIGRvIHlvdSB3YW50IHRvIGdvIHRvZGF5PzwvaDM+Ci08dGFibGUgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIHdpZHRoPSI1MCUiIGFsaWduPSJjZW50ZXIiPgotPGEgaHJlZj0idXNlci9pbmRleC5odG1sIj5JJ20gY29uZmlndXJpbmcvaW5zdGFsbGluZyBhIHNlcnZlcjwvYT4KLTwvdGQ+Ci08dGQgd2lkdGg9IjUwJSIgYWxpZ249ImNlbnRlciI+Ci08YSBocmVmPSJkZXZlbG9wZXIvaW5kZXguaHRtbCI+SSdtIGEgZGV2ZWxvcGVyPC9hPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPGhyPgotPGk+RGF2aWQgUmVpZCwgMTU8c3VwPnRoPC9zdXA+IEphbnVhcnkgMjAwMDwvaT4KLTwvYm9keT4KLTwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvaW5kZXguaHRtbC5lbiBiL2RvY3MvbWFudWFsL2luZGV4Lmh0bWwuZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZmVmNzUuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvaW5kZXguaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QXBhY2hlLTIuMCBEb2N1bWVudGF0aW9uPC90aXRsZT4KLTwvaGVhZD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08aDI+TWFudWFsIEluZGV4IGZvciBBcGFjaGUtMi4wPC9oMj4KLTxwPlRoZSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIHNwbGl0IGludG8gMiBzZWN0aW9ucy4gIE9uZSBpcyBmb3IgcGVvcGxlIGluc3RhbGxpbmcgYW5kIGNvbmZpZ3VyaW5nIGFuIEFwYWNoZSBzZXJ2ZXIsIHRoZSBvdGhlciBpcyBmb3IgdGhvc2Ugd2hvIGFyZSBkZXZlbG9waW5nIHRoZSBzZXJ2ZXIuPC9wPgotPGgzIGFsaWduPSJjZW50ZXIiPldoZXJlIGRvIHlvdSB3YW50IHRvIGdvIHRvZGF5PzwvaDM+Ci08dGFibGUgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIHdpZHRoPSI1MCUiIGFsaWduPSJjZW50ZXIiPgotPGEgaHJlZj0idXNlci9pbmRleC5odG1sIj5JJ20gY29uZmlndXJpbmcvaW5zdGFsbGluZyBhIHNlcnZlcjwvYT4KLTwvdGQ+Ci08dGQgd2lkdGg9IjUwJSIgYWxpZ249ImNlbnRlciI+Ci08YSBocmVmPSJkZXZlbG9wZXIvaW5kZXguaHRtbCI+SSdtIGEgZGV2ZWxvcGVyPC9hPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPGhyPgotPGk+RGF2aWQgUmVpZCwgMTU8c3VwPnRoPC9zdXA+IEphbnVhcnkgMjAwMDwvaT4KLTwvYm9keT4KLTwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvaW5kZXguaHRtbC5qYS5qaXMgYi9kb2NzL21hbnVhbC9pbmRleC5odG1sLmphLmppcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQyZWE5Zi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9pbmRleC5odG1sLmphLmppcworKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD48dGl0bGU+QXBhY2hlIEhUVFAgGyRCJTUhPCVQGyhCIBskQiVQITwlOCVnJXMbKEIgMi4wIBskQiVJJS0lZSVhJXMlSBsoQjwvdGl0bGU+PC9oZWFkPgotPCEtLSBFbmdsaXNoIHJldmlzaW9uOiAxLjIxIC0tPgotPGJvZHkKLSBiZ2NvbG9yPSIjRkZGRkZGIgotIHRleHQ9IiMwMDAwMDAiCi0gbGluaz0iIzAwMDBGRiIKLSB2bGluaz0iIzAwMDA4MCIKLSBhbGluaz0iI0ZGMDAwMCIKLT4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBib3JkZXI9IjAiIHdpZHRoPSI2MDAiPgotPHRyPgotPHRkIGFsaWduPSJjZW50ZXIiPgotICAgIDxpbWcgc3JjPSJpbWFnZXMvYXBhY2hlX2hlYWRlci5naWYiIHdpZHRoPTYwMCBoZWlnaHQ9NjIgYm9yZGVyPTAgYWx0PSJbQXBhY2hlIBskQiVJJS0lZSVhJXMlSBsoQl0iPjwvdGQ+Ci08L3RyPgotPHRyPgotPHRkIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiM0ZjRmNGYiPgotICAgIDx0YWJsZSBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiPgotICAgIDx0cj4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2JlYmViZSI+Ci0gICAgPGEgaHJlZj0ibWlzYy9GQVEuaHRtbCI+PHN0cm9uZz5GQVE8L3N0cm9uZz48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2JlYmViZSI+Ci0gICAgPGEgaHJlZj0ibW9kL2RpcmVjdGl2ZXMuaHRtbCI+PHN0cm9uZz4bJEIlRyUjJWwlLyVGJSMlVhsoQjwvc3Ryb25nPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjYmViZWJlIj4KLSAgICA8YSBocmVmPSJtb2QvIj48c3Ryb25nPhskQiViJTglZSE8JWsbKEI8L3N0cm9uZz48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2JlYmViZSI+Ci0gICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL3NlYXJjaC5odG1sIj48c3Ryb25nPhskQjghOncbKEI8L3N0cm9uZz48L2E+Ci0gICAgPC90ZD4KLSAgICA8L3RyPjwvdGFibGU+Ci08L3RkPgotPC90cj4KLTx0cj4KLTx0ZD4mbmJzcDs8L3RkPgotPC90cj48dHI+Ci08dGQgYWxpZ249ImNlbnRlciIgaGVpZ2h0PSIzMCI+Ci0JPGgzPkFwYWNoZSBIVFRQIFNlcnZlciBWZXJzaW9uIDIuMDwvaDM+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLQotPGRpdiBhbGlnbj0iY2VudGVyIj4KLQotPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYm9yZGVyPSIwIiB3aWR0aD0iNjAwIj4KLTx0cj48dGQgYWxpZ249ImNlbnRlciI+Ci0gICA8Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iaHR0cDovL3NlYXJjaC5hcGFjaGUub3JnLyI+Ci0gICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ3aGF0IiB2YWx1ZT0iaHR0cGQuYXBhY2hlLm9yZyI+Ci0gICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJyZXN1bHRzIiB2YWx1ZT0iMjAiPgotICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idmVyc2lvbiIgdmFsdWU9IjIiPgotICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImtleXdvcmQiIHNpemU9IjIwIj4KLSAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTZWFyY2giPgotICAgPC9mb3JtPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTwhLS0KLTx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGJvcmRlcj0iMCIgd2lkdGg9IjYwMCI+Ci08dHI+Ci08dGQgYWxpZ249ImNlbnRlciI+PGhyIHNpemU9IjEiIG5vc2hhZGUgd2lkdGg9IjEwMCUiPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotLS0+Ci0KLTx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGJvcmRlcj0iMCIgd2lkdGg9IjYwMCI+Ci08dHI+Ci08dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPgotPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIiBiZ2NvbG9yPSIjZmZmZmZmIiB3aWR0aD0iMjgwIj4KLTx0cj48dGQgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2U5ZTllOSI+Ci0gIDxzdHJvbmc+GyRCJWolaiE8JTklTiE8JUgbKEI8L3N0cm9uZz4KLTwvdGQ+PC90cj48dHI+PHRkPgotPGEgaHJlZj0ibmV3X2ZlYXR1cmVzXzJfMC5odG1sIj5BcGFjaGUgMi4wIBskQiROPzc1IUc9GyhCPC9hPgotPC90ZD48L3RyPjx0cj48dGQ+Ci08YSBocmVmPSJ1cGdyYWRpbmcuaHRtbCI+QXBhY2hlIDIuMCAbJEIkWCROJSIlQyVXJTAlbCE8JUkbKEI8L2E+Ci08L3RkPjwvdHI+PHRyPjx0ZD4KLTxhIGhyZWY9IkxJQ0VOU0UiPkFwYWNoZSAbJEIkTiVpJSQlOyVzJTkbKEI8L2E+Ci08L3RkPjwvdHI+Ci08L3RhYmxlPgotCi08cD4KLTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCIgYmdjb2xvcj0iI2ZmZmZmZiIgd2lkdGg9IjI4MCI+Ci08dHI+PHRkIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiNlOWU5ZTkiPgotPHN0cm9uZz4bJEIlaiVVJSElbCVzJTklXiVLJWUlIiVrGyhCPC9zdHJvbmc+Ci08L3RkPjwvdHI+PHRyPjx0ZD4KLTxhIGhyZWY9Imluc3RhbGwuaHRtbCI+GyRCJTMlcyVRJSQlayRIJSQlcyU5JUghPCVrGyhCPC9hPgotPC90ZD48L3RyPjx0cj48dGQ+Ci08YSBocmVmPSJpbnZva2luZy5odG1sIj4bJEI1L0YwGyhCPC9hPgotPC90ZD48L3RyPjx0cj48dGQ+Ci08YSBocmVmPSJzdG9wcGluZy5odG1sIj4bJEI9Kk47JF4kPyRPOkY1L0YwGyhCPC9hPgotPC90ZD48L3RyPjx0cj48dGQ+Ci08YSBocmVmPSJtb2QvZGlyZWN0aXZlcy5odG1sIj4bJEI8QjlUO34kTkBfRGpKfUshGyhCPC9hPgotPC90ZD48L3RyPjx0cj48dGQ+Ci0bJEIlYiU4JWUhPCVrGyhCOiA8YSBocmVmPSJtb2QvaW5kZXgtYnl0eXBlLmh0bWwiPhskQjxvTmBKTBsoQjwvYT4gGyRCJEgbKEIgCi0gICAgPGEgaHJlZj0ibW9kLyI+GyRCJSIlayVVJSElWSVDJUg9ZxsoQjwvYT4KLTwvdGQ+PC90cj48dHI+PHRkPgotPGEgaHJlZj0ibXBtLmh0bWwiPk11bHRpLVByb2Nlc3NpbmcgTW9kdWxlcyAoTVBNKTwvYT4KLTwvdGQ+PC90cj48dHI+PHRkPgotPGEgaHJlZj0icHJvZ3JhbXMvIj4bJEIlNSE8JVAkSCU1JV0hPCVIJVclbSUwJWklYBsoQjwvYT4KLTwvdGQ+PC90cj48dHI+PHRkPgotPGEgaHJlZj0iZHNvLmh0bWwiPkR5bmFtaWMgU2hhcmVkIE9iamVjdCAoRFNPKSAbJEIkTiU1JV0hPCVIGyhCPC9hPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPgotPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIiBiZ2NvbG9yPSIjZmZmZmZmIiB3aWR0aD0iMjgwIj4KLTx0cj48dGQgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2U5ZTllOSI+Ci08c3Ryb25nPhskQiVXJWklQyVIJVUlKSE8JWA4R00tJE4+cEpzGyhCPC9zdHJvbmc+Ci08L3RkPjwvdHI+PHRyPjx0ZD4KLTxhIGhyZWY9InBsYXRmb3JtL3dpbmRvd3MuaHRtbCI+TWljcm9zb2Z0IFdpbmRvd3M8L2E+Ci08L3RkPjwvdHI+PHRyPjx0ZD4KLTxhIGhyZWY9InBsYXRmb3JtLyI+GyRCQj4kTiVXJWklQyVIJVUlKSE8JWBGQ00tJE4+cEpzGyhCPC9hPgotPC90ZD48L3RyPjwvdGFibGU+Ci0JCi08L3RkPgotPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiBiZ2NvbG9yPSIjY2NjY2NjIj4KLTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYmdjb2xvcj0iI2NjY2NjYyI+PHRyPjx0ZAotIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSJpbWFnZXMvcGl4ZWwuZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIgotIGJvcmRlcj0iMCIgYWx0PSIuIj48L3RkPjwvdHI+PC90YWJsZT4KLTwvdGQ+Ci08dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPgotPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIiBiZ2NvbG9yPSIjZmZmZmZmIiB3aWR0aD0iMjgwIj4KLTx0cj48dGQgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2U5ZTllOSI+Ci08c3Ryb25nPkFwYWNoZSBIVFRQIBskQiU1ITwlUCRyO0gkJhsoQjwvc3Ryb25nPgotPC90ZD48L3RyPjx0cj48dGQ+Ci08YSBocmVmPSJjb25maWd1cmluZy5odG1sIj4bJEJAX0RqJVUlISUkJWsbKEI8L2E+Ci08L3RkPjwvdHI+PHRyPjx0ZD4KLTxhIGhyZWY9InNlcnZlci13aWRlLmh0bWwiPhskQiU1ITwlUEE0Qk4kTkBfRGobKEI8L2E+Ci08L3RkPjwvdHI+PHRyPjx0ZD4KLTxhIGhyZWY9InVybG1hcHBpbmcuaHRtbCI+VVJMIBskQiRyJVUlISUkJWslNyU5JUYlYCRLJV4lQyVXJDkkaxsoQjxhPgotPC90ZD48L3RyPjx0cj48dGQ+Ci08YSBocmVmPSJ2aG9zdHMvIj4bJEIlUCE8JUElYyVrJVslOSVIGyhCPC9hPgotPC90ZD48L3RyPjx0cj48dGQ+Ci08YSBocmVmPSJoYW5kbGVyLmh0bWwiPhskQiVPJXMlSSVpGyhCPC9hPgotPC90ZD48L3RyPjx0cj48dGQ+Ci08YSBocmVmPSJmaWx0ZXIuaHRtbCI+GyRCJVUlIyVrJT8bKEI8L2E+Ci08L3RkPjwvdHI+PHRyPjx0ZD4KLTxhIGhyZWY9ImNvbnRlbnQtbmVnb3RpYXRpb24uaHRtbCI+GyRCJTMlcyVGJXMlSCVNJTQlNyUoITwlNyVnJXMbKEI8L2E+Ci08L3RkPjwvdHI+PHRyPjx0ZD4KLTxhIGhyZWY9ImVudi5odG1sIj4bJEI0RDYtSlE/dBsoQjwvYT4KLTwvdGQ+PC90cj48dHI+PHRkPgotPGEgaHJlZj0ic3VleGVjLmh0bWwiPkNHSSAbJEIkRxsoQiBTZXRVc2VySUQgGyRCPEI5VCRyO0gkJhsoQjwvYT4KLTwvdGQ+PC90cj48dHI+PHRkPgotPGEgaHJlZj0ibWlzYy9wZXJmLXR1bmluZy5odG1sIj4bJEIwbEhMRSokSkAtRz0kSzRYJDkkayVSJXMlSBsoQjwvYT4KLTwvdGQ+PC90cj48dHI+PHRkPgotPGEgaHJlZj0ibWlzYy9zZWN1cml0eV90aXBzLmh0bWwiPhskQiU7JS0lZSVqJUYlIz5wSnMbKEI8L2E+Ci08L3RkPjwvdHI+PHRyPjx0ZD4KLTxhIGhyZWY9Im1pc2MvcmV3cml0ZWd1aWRlLmh0bWwiPlVSTCBSZXdyaXRpbmcgGyRCJE4lLCUkJUkbKEI8L2E+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+Ci08dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiIGJnY29sb3I9IiNmZmZmZmYiIHdpZHRoPSIyODAiPgotPHRyPjx0ZCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjZTllOWU5Ij4KLTxzdHJvbmc+GyRCJD0kTkI+GyhCPC9zdHJvbmc+Ci08L3RkPjwvdHI+PHRyPjx0ZD4KLTxhIGhyZWY9Im1pc2MvRkFRLmh0bWwiPkZBUTwvYT4KLTwvdGQ+PC90cj48dHI+PHRkPgotPGEgaHJlZj0ibWlzYy90dXRvcmlhbHMuaHRtbCI+GyRCJUElZSE8JUglaiUiJWsbKEI8L2E+Ci08L3RkPjwvdHI+PHRyPjx0ZD4KLTxhIGhyZWY9ImRldmVsb3Blci8iPhskQjMrSC88VCROJD8kYSROJUklLSVlJWElcyVIGyhCPC9hPgotPC90ZD48L3RyPjx0cj48dGQ+Ci08YSBocmVmPSJtaXNjLyI+GyRCJD0kTkI+GyhCPC9hPgotPC90ZD48L3RyPjwvdGFibGU+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci0KLTwvZGl2PgotCi08cCBhbGlnbj0iY2VudGVyIj48YQotaHJlZj0iaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvZG9jcy1wcm9qZWN0LyI+QXBhY2hlIEhUVFAgU2VydmVyCi1Eb2N1bWVudGF0aW9uIFByb2plY3Q8L2E+IBskQiRLJGgkaiVhJXMlRiVKJXMlOSQ1JGwkRiQkJF4kOSEjGyhCPC9wPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9ib2R5PgotPC9odG1sPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9pbnN0YWxsLmh0bWwgYi9kb2NzL21hbnVhbC9pbnN0YWxsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNTNiNzMuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvaW5zdGFsbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTwhLS0laHlwZXJ0ZXh0IC0tPgotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCAyLjAvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+Q29tcGlsaW5nIGFuZCBJbnN0YWxsaW5nIEFwYWNoZTwvVElUTEU+Ci08L0hFQUQ+Ci0KLTxCT0RZPgotPCEtLS8laHlwZXJ0ZXh0IC0tPgotCi08aDE+Q29tcGlsaW5nIGFuZCBJbnN0YWxsaW5nIEFwYWNoZTwvaDE+Ci08aDI+RG93bmxvYWRpbmcgQXBhY2hlPC9oMj4KLUluZm9ybWF0aW9uIG9uIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBBcGFjaGUgY2FuIGJlIGZvdW5kIG9uIHRoZSBBcGFjaGUKLXdlYiBzZXJ2ZXIgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnLy4gVGhpcyB3aWxsIGxpc3QgdGhlIGN1cnJlbnQgcmVsZWFzZSwKLWFueSBtb3JlIHJlY2VudCBiZXRhLXRlc3QgcmVsZWFzZSwgdG9nZXRoZXIgd2l0aCBkZXRhaWxzIG9mIG1pcnJvcgotd2ViIGFuZCBhbm9ueW1vdXMgZnRwIHNpdGVzLgotCi08aDI+Q29tcGlsaW5nIEFwYWNoZTwvaDI+Ci1UaGlzIHJlbGVhc2Ugb2YgQXBhY2hlIHN1cHBvcnRzIHRoZSBub3Rpb24gb2YgYG9wdGlvbmFsIG1vZHVsZXMnLgotSG93ZXZlciwgdGhlIHNlcnZlciBoYXMgdG8ga25vdyB3aGljaCBtb2R1bGVzIGFyZSBjb21waWxlZCBpbnRvIGl0LCBpbgotb3JkZXIgZm9yIHRob3NlIG1vZHVsZXMgdG8gYmUgZWZmZWN0aXZlOyB0aGlzIHJlcXVpcmVzIGdlbmVyYXRpb24gb2YgYQotc2hvcnQgYml0IG9mIGNvZGUgKGA8Y29kZT5tb2R1bGVzLmM8L2NvZGU+Jykgd2hpY2ggc2ltcGx5IGhhcyBhIGxpc3Qgb2YgdGhlbS4KLTxwPgotSWYgeW91IGFyZSBzYXRpc2ZpZWQgd2l0aCBvdXIgc3RhbmRhcmQgbW9kdWxlIHNldCwgYW5kIGV4cGVjdCB0bwotY29udGludWUgdG8gYmUgc2F0aXNmaWVkIHdpdGggaXQsIHRoZW4geW91IGNhbiBqdXN0IGVkaXQgdGhlIHN0b2NrCi08Y29kZT5NYWtlZmlsZTwvY29kZT4gYW5kIGNvbXBpbGUgYXMgeW91IGhhdmUgYmVlbiBkb2luZyBwcmV2aW91c2x5LiAgSWYgeW91Ci13b3VsZAotbGlrZSB0byBzZWxlY3Qgb3B0aW9uYWwgbW9kdWxlcywgaG93ZXZlciwgeW91IG5lZWQgdG8gcnVuIHRoZQotY29uZmlndXJhdGlvbiBzY3JpcHQuCi08cD4KLVRvIGRvIHRoaXM6Ci08b2w+Ci08bGk+RWRpdCB0aGUgZmlsZSBgPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4nLiAgVGhpcyBjb250YWlucyB0aGUgcGVyLW1hY2hpbmUKLWNvbmZpZyBzZXR0aW5ncyBvZiB0aGUgTWFrZWZpbGUsIGFuZCBhbHNvIGFuIGFkZGl0aW9uYWwgc2VjdGlvbiBhdAotdGhlIGJvdHRvbSB3aGljaCBsaXN0cyB0aGUgbW9kdWxlcyB3aGljaCBoYXZlIGJlZW4gY29tcGlsZWQgaW4sIGFuZAotYWxzbyBuYW1lcyB0aGUgZmlsZXMgY29udGFpbmluZyB0aGVtLiAgWW91IHdpbGwgbmVlZCB0bzoKLTxvbD4KLTxsaT4gU2VsZWN0IGEgY29tcGlsZXIgYW5kIGNvbXBpbGF0aW9uIG9wdGlvbnMgYXMgYXBwcm9wcmlhdGUgdG8KLXlvdXIgbWFjaGluZS4KLTxsaT4gVW5jb21tZW50IGxpbmVzIGNvcnJlc3BvbmRpbmcgdG8gdGhvc2Ugb3B0aW9uYWwgbW9kdWxlcyB5b3Ugd2lzaAotdG8gaW5jbHVkZSAoYW1vbmcgdGhlIE1vZHVsZSBsaW5lcyBhdCB0aGUgYm90dG9tIG9mIHRoZSBmaWxlKQotb3IgYWRkIG5ldyBsaW5lcyBjb3JyZXNwb25kaW5nIHRvIGN1c3RvbSBtb2R1bGVzIHlvdSBoYXZlIHdyaXR0ZW4uCi08cD4KLU5vdGUgdGhhdCBEQk0gYXV0aCBoYXMgdG8gYmUgZXhwbGljaXRseSBjb25maWd1cmVkIGluLCBpZiB5b3Ugd2FudAotaXQ7IGp1c3QgdW5jb21tZW50IHRoZSBjb3JyZXNwb25kaW5nIGxpbmUuCi08L29sPgotPGxpPiBSdW4gdGhlIGBDb25maWd1cmUnIHNjcmlwdDoKLTxibG9ja3F1b3RlPjxjb2RlPgotJSBDb25maWd1cmU8YnI+Ci1Vc2luZyAnQ29uZmlndXJhdGlvbicgYXMgY29uZmlnIGZpbGU8YnI+Ci0lPC9jb2RlPjwvYmxvY2txdW90ZT4KLQotVGhpcyBnZW5lcmF0ZXMgbmV3IHZlcnNpb25zIG9mIHRoZSBNYWtlZmlsZSBhbmQgb2YgbW9kdWxlcy5jLiAgSWYKLXlvdSB3YW50IHRvIG1haW50YWluIG11bHRpcGxlIGNvbmZpZ3VyYXRpb25zLCB5b3UgY2FuIHNheSwgZS5nLiwKLTxibG9ja3F1b3RlPjxjb2RlPgotJSBDb25maWd1cmUgLWZpbGUgQ29uZmlndXJhdGlvbi5haTxicj4KLVVzaW5nIGFsdGVybmF0ZSBjb25maWcgZmlsZSBDb25maWd1cmF0aW9uLmFpPGJyPgotJTwvY29kZT48L2Jsb2NrcXVvdGU+Ci0KLTxsaT5UeXBlIGBtYWtlJy4KLTxwPgotVGhlIG1vZHVsZXMgd2UgcGxhY2UgaW4gdGhlIEFwYWNoZSBkaXN0cmlidXRpb24gYXJlIHRoZSBvbmVzIHdlIGhhdmUKLXRlc3RlZCBhbmQgYXJlIHVzZWQgcmVndWxhcmx5IGJ5IHZhcmlvdXMgbWVtYmVycyBvZiB0aGUgQXBhY2hlCi1kZXZlbG9wbWVudCBncm91cC4gIEFkZGl0aW9uYWwgbW9kdWxlcyBjb250cmlidXRlZCBieSBtZW1iZXJzIG9yIHRoaXJkCi1wYXJ0aWVzIHdpdGggc3BlY2lmaWMgbmVlZHMgb3IgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgYXQKLTxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2NvbnRyaWIvbW9kdWxlcy8iPiZsdDtVUkw6aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvY29udHJpYi9tb2R1bGVzLyZndDs8L0E+LiAgVGhlcmUgYXJlIGluc3RydWN0aW9ucyBvbiB0aGF0IHBhZ2UgZm9yCi1saW5raW5nIHRoZXNlIG1vZHVsZXMgaW50byB0aGUgY29yZSBBcGFjaGUgY29kZS4KLTwvb2w+Ci0KLTxoMj5JbnN0YWxsaW5nIEFwYWNoZTwvaDI+Ci1BZnRlciBjb21waWxhdGlvbiwgeW91IHdpbGwgaGF2ZSBhIGJpbmFyeSBjYWxsZWQgYGh0dHBkJyBpbiB0aGUKLTxjb2RlPnNyYy88L2NvZGU+IGRpcmVjdG9yeS4gIEEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiBBcGFjaGUgd2lsbCBzdXBwbHkgdGhpcwotZmlsZS4KLTxwPgotVGhlIG5leHQgc3RlcCBpcyB0byBlZGl0IHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIGZvciB0aGUgc2VydmVyLiAgSW4KLXRoZSBzdWJkaXJlY3RvcnkgY2FsbGVkIGBjb25mJyB5b3Ugc2hvdWxkIGZpbmQgZGlzdHJpYnV0aW9uIHZlcnNpb25zCi1vZiB0aGUgdGhyZWUgY29uZmlndXJhdGlvbiBmaWxlczogPGNvZGU+c3JtLmNvbmYtZGlzdDwvY29kZT4sCi08Y29kZT5hY2Nlc3MuY29uZi1kaXN0PC9jb2RlPiBhbmQgPGNvZGU+aHR0cGQuY29uZi1kaXN0PC9jb2RlPi4gQ29weSB0aGVtIHRvCi08Y29kZT5zcm0uY29uZjwvY29kZT4sIDxjb2RlPmFjY2Vzcy5jb25mPC9jb2RlPiBhbmQgPGNvZGU+aHR0cGQuY29uZjwvY29kZT4KLXJlc3BlY3RpdmVseS4KLTxwPgotRmlyc3QgZWRpdCA8Y29kZT5odHRwZC5jb25mPC9jb2RlPi4gIFRoaXMgc2V0cyB1cCBnZW5lcmFsIGF0dHJpYnV0ZXMgYWJvdXQgdGhlCi1zZXJ2ZXI7IHRoZSBwb3J0IG51bWJlciwgdGhlIHVzZXIgaXQgcnVucyBhcywgZXRjLiAgTmV4dCBlZGl0IHRoZQotPGNvZGU+c3JtLmNvbmY8L2NvZGU+IGZpbGU7IHRoaXMgc2V0cyB1cCB0aGUgcm9vdCBvZiB0aGUgZG9jdW1lbnQgdHJlZSwKLXNwZWNpYWwgZnVuY3Rpb25zIGxpa2Ugc2VydmVyLXBhcnNlZCBIVE1MIG9yIGludGVybmFsIGltYWdlbWFwIHBhcnNpbmcsIGV0Yy4KLUZpbmFsbHksIGVkaXQgdGhlIDxjb2RlPmFjY2Vzcy5jb25mPC9jb2RlPiBmaWxlIHRvIGF0IGxlYXN0IHNldCB0aGUgYmFzZSBjYXNlcwotb2YgYWNjZXNzLgotPHA+Ci1GaW5hbGx5LCBtYWtlIGEgY2FsbCB0byBodHRwZCwgd2l0aCBhIC1mIHRvIHRoZSBmdWxsIHBhdGggdG8gdGhlCi1odHRwZC5jb25mIGZpbGUuICBJLmUuLCB0aGUgY29tbW9uIGNhc2U6Ci08YmxvY2txdW90ZT48Y29kZT4KLSAgL3Vzci9sb2NhbC9ldGMvYXBhY2hlL3NyYy9odHRwZCAtZiAvdXNyL2xvY2FsL2V0Yy9hcGFjaGUvY29uZi9odHRwZC5jb25mCi08L2NvZGU+PC9ibG9ja3F1b3RlPgotVGhlIHNlcnZlciBzaG91bGQgYmUgbm93IHJ1bm5pbmcuCi08cD4KLUJ5IGRlZmF1bHQgdGhlIDxjb2RlPnNybS5jb25mPC9jb2RlPiBhbmQgPGNvZGU+YWNjZXNzLmNvbmY8L2NvZGU+IGZpbGVzIGFyZQotbG9jYXRlZCBieSBuYW1lOyB0byBzcGVjaWZpY2FsbHkgY2FsbCB0aGVtIGJ5IG90aGVyIG5hbWVzLCB1c2UgdGhlCi08QSBIUkVGPSJjb3JlLmh0bWwjYWNjZXNzY29uZmlnIj5BY2Nlc3NDb25maWc8L0E+IGFuZAotPEEgSFJFRj0iY29yZS5odG1sI3Jlc291cmNlY29uZmlnIj5SZXNvdXJjZUNvbmZpZzwvQT4gZGlyZWN0aXZlcyBpbgotPGNvZGU+aHR0cGQuY29uZjwvY29kZT4uCi0KLTwhLS0laHlwZXJ0ZXh0IC0tPgotPGhyPgotPEEgSFJFRj0iLi4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9ob21lLmdpZiIgQUxUPSJIb21lIj48L0E+Ci08QSBIUkVGPSIuLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfaW5kZXguZ2lmIiBBTFQ9IkluZGV4Ij48L0E+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KLTwhLS0vJWh5cGVydGV4dCAtLT4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2luc3RhbGwuaHRtbC5lbiBiL2RvY3MvbWFudWFsL2luc3RhbGwuaHRtbC5lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1M2I3My4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9pbnN0YWxsLmh0bWwuZW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPCEtLSVoeXBlcnRleHQgLS0+Ci08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDIuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5Db21waWxpbmcgYW5kIEluc3RhbGxpbmcgQXBhY2hlPC9USVRMRT4KLTwvSEVBRD4KLQotPEJPRFk+Ci08IS0tLyVoeXBlcnRleHQgLS0+Ci0KLTxoMT5Db21waWxpbmcgYW5kIEluc3RhbGxpbmcgQXBhY2hlPC9oMT4KLTxoMj5Eb3dubG9hZGluZyBBcGFjaGU8L2gyPgotSW5mb3JtYXRpb24gb24gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIEFwYWNoZSBjYW4gYmUgZm91bmQgb24gdGhlIEFwYWNoZQotd2ViIHNlcnZlciBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvLiBUaGlzIHdpbGwgbGlzdCB0aGUgY3VycmVudCByZWxlYXNlLAotYW55IG1vcmUgcmVjZW50IGJldGEtdGVzdCByZWxlYXNlLCB0b2dldGhlciB3aXRoIGRldGFpbHMgb2YgbWlycm9yCi13ZWIgYW5kIGFub255bW91cyBmdHAgc2l0ZXMuCi0KLTxoMj5Db21waWxpbmcgQXBhY2hlPC9oMj4KLVRoaXMgcmVsZWFzZSBvZiBBcGFjaGUgc3VwcG9ydHMgdGhlIG5vdGlvbiBvZiBgb3B0aW9uYWwgbW9kdWxlcycuCi1Ib3dldmVyLCB0aGUgc2VydmVyIGhhcyB0byBrbm93IHdoaWNoIG1vZHVsZXMgYXJlIGNvbXBpbGVkIGludG8gaXQsIGluCi1vcmRlciBmb3IgdGhvc2UgbW9kdWxlcyB0byBiZSBlZmZlY3RpdmU7IHRoaXMgcmVxdWlyZXMgZ2VuZXJhdGlvbiBvZiBhCi1zaG9ydCBiaXQgb2YgY29kZSAoYDxjb2RlPm1vZHVsZXMuYzwvY29kZT4nKSB3aGljaCBzaW1wbHkgaGFzIGEgbGlzdCBvZiB0aGVtLgotPHA+Ci1JZiB5b3UgYXJlIHNhdGlzZmllZCB3aXRoIG91ciBzdGFuZGFyZCBtb2R1bGUgc2V0LCBhbmQgZXhwZWN0IHRvCi1jb250aW51ZSB0byBiZSBzYXRpc2ZpZWQgd2l0aCBpdCwgdGhlbiB5b3UgY2FuIGp1c3QgZWRpdCB0aGUgc3RvY2sKLTxjb2RlPk1ha2VmaWxlPC9jb2RlPiBhbmQgY29tcGlsZSBhcyB5b3UgaGF2ZSBiZWVuIGRvaW5nIHByZXZpb3VzbHkuICBJZiB5b3UKLXdvdWxkCi1saWtlIHRvIHNlbGVjdCBvcHRpb25hbCBtb2R1bGVzLCBob3dldmVyLCB5b3UgbmVlZCB0byBydW4gdGhlCi1jb25maWd1cmF0aW9uIHNjcmlwdC4KLTxwPgotVG8gZG8gdGhpczoKLTxvbD4KLTxsaT5FZGl0IHRoZSBmaWxlIGA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPicuICBUaGlzIGNvbnRhaW5zIHRoZSBwZXItbWFjaGluZQotY29uZmlnIHNldHRpbmdzIG9mIHRoZSBNYWtlZmlsZSwgYW5kIGFsc28gYW4gYWRkaXRpb25hbCBzZWN0aW9uIGF0Ci10aGUgYm90dG9tIHdoaWNoIGxpc3RzIHRoZSBtb2R1bGVzIHdoaWNoIGhhdmUgYmVlbiBjb21waWxlZCBpbiwgYW5kCi1hbHNvIG5hbWVzIHRoZSBmaWxlcyBjb250YWluaW5nIHRoZW0uICBZb3Ugd2lsbCBuZWVkIHRvOgotPG9sPgotPGxpPiBTZWxlY3QgYSBjb21waWxlciBhbmQgY29tcGlsYXRpb24gb3B0aW9ucyBhcyBhcHByb3ByaWF0ZSB0bwoteW91ciBtYWNoaW5lLgotPGxpPiBVbmNvbW1lbnQgbGluZXMgY29ycmVzcG9uZGluZyB0byB0aG9zZSBvcHRpb25hbCBtb2R1bGVzIHlvdSB3aXNoCi10byBpbmNsdWRlIChhbW9uZyB0aGUgTW9kdWxlIGxpbmVzIGF0IHRoZSBib3R0b20gb2YgdGhlIGZpbGUpCi1vciBhZGQgbmV3IGxpbmVzIGNvcnJlc3BvbmRpbmcgdG8gY3VzdG9tIG1vZHVsZXMgeW91IGhhdmUgd3JpdHRlbi4KLTxwPgotTm90ZSB0aGF0IERCTSBhdXRoIGhhcyB0byBiZSBleHBsaWNpdGx5IGNvbmZpZ3VyZWQgaW4sIGlmIHlvdSB3YW50Ci1pdDsganVzdCB1bmNvbW1lbnQgdGhlIGNvcnJlc3BvbmRpbmcgbGluZS4KLTwvb2w+Ci08bGk+IFJ1biB0aGUgYENvbmZpZ3VyZScgc2NyaXB0OgotPGJsb2NrcXVvdGU+PGNvZGU+Ci0lIENvbmZpZ3VyZTxicj4KLVVzaW5nICdDb25maWd1cmF0aW9uJyBhcyBjb25maWcgZmlsZTxicj4KLSU8L2NvZGU+PC9ibG9ja3F1b3RlPgotCi1UaGlzIGdlbmVyYXRlcyBuZXcgdmVyc2lvbnMgb2YgdGhlIE1ha2VmaWxlIGFuZCBvZiBtb2R1bGVzLmMuICBJZgoteW91IHdhbnQgdG8gbWFpbnRhaW4gbXVsdGlwbGUgY29uZmlndXJhdGlvbnMsIHlvdSBjYW4gc2F5LCBlLmcuLAotPGJsb2NrcXVvdGU+PGNvZGU+Ci0lIENvbmZpZ3VyZSAtZmlsZSBDb25maWd1cmF0aW9uLmFpPGJyPgotVXNpbmcgYWx0ZXJuYXRlIGNvbmZpZyBmaWxlIENvbmZpZ3VyYXRpb24uYWk8YnI+Ci0lPC9jb2RlPjwvYmxvY2txdW90ZT4KLQotPGxpPlR5cGUgYG1ha2UnLgotPHA+Ci1UaGUgbW9kdWxlcyB3ZSBwbGFjZSBpbiB0aGUgQXBhY2hlIGRpc3RyaWJ1dGlvbiBhcmUgdGhlIG9uZXMgd2UgaGF2ZQotdGVzdGVkIGFuZCBhcmUgdXNlZCByZWd1bGFybHkgYnkgdmFyaW91cyBtZW1iZXJzIG9mIHRoZSBBcGFjaGUKLWRldmVsb3BtZW50IGdyb3VwLiAgQWRkaXRpb25hbCBtb2R1bGVzIGNvbnRyaWJ1dGVkIGJ5IG1lbWJlcnMgb3IgdGhpcmQKLXBhcnRpZXMgd2l0aCBzcGVjaWZpYyBuZWVkcyBvciBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSBhdAotPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvY29udHJpYi9tb2R1bGVzLyI+Jmx0O1VSTDpodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9jb250cmliL21vZHVsZXMvJmd0OzwvQT4uICBUaGVyZSBhcmUgaW5zdHJ1Y3Rpb25zIG9uIHRoYXQgcGFnZSBmb3IKLWxpbmtpbmcgdGhlc2UgbW9kdWxlcyBpbnRvIHRoZSBjb3JlIEFwYWNoZSBjb2RlLgotPC9vbD4KLQotPGgyPkluc3RhbGxpbmcgQXBhY2hlPC9oMj4KLUFmdGVyIGNvbXBpbGF0aW9uLCB5b3Ugd2lsbCBoYXZlIGEgYmluYXJ5IGNhbGxlZCBgaHR0cGQnIGluIHRoZQotPGNvZGU+c3JjLzwvY29kZT4gZGlyZWN0b3J5LiAgQSBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIEFwYWNoZSB3aWxsIHN1cHBseSB0aGlzCi1maWxlLgotPHA+Ci1UaGUgbmV4dCBzdGVwIGlzIHRvIGVkaXQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIHRoZSBzZXJ2ZXIuICBJbgotdGhlIHN1YmRpcmVjdG9yeSBjYWxsZWQgYGNvbmYnIHlvdSBzaG91bGQgZmluZCBkaXN0cmlidXRpb24gdmVyc2lvbnMKLW9mIHRoZSB0aHJlZSBjb25maWd1cmF0aW9uIGZpbGVzOiA8Y29kZT5zcm0uY29uZi1kaXN0PC9jb2RlPiwKLTxjb2RlPmFjY2Vzcy5jb25mLWRpc3Q8L2NvZGU+IGFuZCA8Y29kZT5odHRwZC5jb25mLWRpc3Q8L2NvZGU+LiBDb3B5IHRoZW0gdG8KLTxjb2RlPnNybS5jb25mPC9jb2RlPiwgPGNvZGU+YWNjZXNzLmNvbmY8L2NvZGU+IGFuZCA8Y29kZT5odHRwZC5jb25mPC9jb2RlPgotcmVzcGVjdGl2ZWx5LgotPHA+Ci1GaXJzdCBlZGl0IDxjb2RlPmh0dHBkLmNvbmY8L2NvZGU+LiAgVGhpcyBzZXRzIHVwIGdlbmVyYWwgYXR0cmlidXRlcyBhYm91dCB0aGUKLXNlcnZlcjsgdGhlIHBvcnQgbnVtYmVyLCB0aGUgdXNlciBpdCBydW5zIGFzLCBldGMuICBOZXh0IGVkaXQgdGhlCi08Y29kZT5zcm0uY29uZjwvY29kZT4gZmlsZTsgdGhpcyBzZXRzIHVwIHRoZSByb290IG9mIHRoZSBkb2N1bWVudCB0cmVlLAotc3BlY2lhbCBmdW5jdGlvbnMgbGlrZSBzZXJ2ZXItcGFyc2VkIEhUTUwgb3IgaW50ZXJuYWwgaW1hZ2VtYXAgcGFyc2luZywgZXRjLgotRmluYWxseSwgZWRpdCB0aGUgPGNvZGU+YWNjZXNzLmNvbmY8L2NvZGU+IGZpbGUgdG8gYXQgbGVhc3Qgc2V0IHRoZSBiYXNlIGNhc2VzCi1vZiBhY2Nlc3MuCi08cD4KLUZpbmFsbHksIG1ha2UgYSBjYWxsIHRvIGh0dHBkLCB3aXRoIGEgLWYgdG8gdGhlIGZ1bGwgcGF0aCB0byB0aGUKLWh0dHBkLmNvbmYgZmlsZS4gIEkuZS4sIHRoZSBjb21tb24gY2FzZToKLTxibG9ja3F1b3RlPjxjb2RlPgotICAvdXNyL2xvY2FsL2V0Yy9hcGFjaGUvc3JjL2h0dHBkIC1mIC91c3IvbG9jYWwvZXRjL2FwYWNoZS9jb25mL2h0dHBkLmNvbmYKLTwvY29kZT48L2Jsb2NrcXVvdGU+Ci1UaGUgc2VydmVyIHNob3VsZCBiZSBub3cgcnVubmluZy4KLTxwPgotQnkgZGVmYXVsdCB0aGUgPGNvZGU+c3JtLmNvbmY8L2NvZGU+IGFuZCA8Y29kZT5hY2Nlc3MuY29uZjwvY29kZT4gZmlsZXMgYXJlCi1sb2NhdGVkIGJ5IG5hbWU7IHRvIHNwZWNpZmljYWxseSBjYWxsIHRoZW0gYnkgb3RoZXIgbmFtZXMsIHVzZSB0aGUKLTxBIEhSRUY9ImNvcmUuaHRtbCNhY2Nlc3Njb25maWciPkFjY2Vzc0NvbmZpZzwvQT4gYW5kCi08QSBIUkVGPSJjb3JlLmh0bWwjcmVzb3VyY2Vjb25maWciPlJlc291cmNlQ29uZmlnPC9BPiBkaXJlY3RpdmVzIGluCi08Y29kZT5odHRwZC5jb25mPC9jb2RlPi4KLQotPCEtLSVoeXBlcnRleHQgLS0+Ci08aHI+Ci08QSBIUkVGPSIuLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2hvbWUuZ2lmIiBBTFQ9IkhvbWUiPjwvQT4KLTxBIEhSRUY9Ii4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9pbmRleC5naWYiIEFMVD0iSW5kZXgiPjwvQT4KLQotPC9CT0RZPgotPC9IVE1MPgotPCEtLS8laHlwZXJ0ZXh0IC0tPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvaW52b2tpbmcuaHRtbCBiL2RvY3MvbWFudWFsL2ludm9raW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMGI2OGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvaW52b2tpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi08IS0tJWh5cGVydGV4dCAtLT4KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgMi4wLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPlN0YXJ0aW5nIEFwYWNoZTwvVElUTEU+Ci08L0hFQUQ+Ci0KLTxCT0RZPgotPCEtLS8laHlwZXJ0ZXh0IC0tPgotCi08aDE+U3RhcnRpbmcgQXBhY2hlPC9oMT4KLTxoMj5JbnZva2luZyBBcGFjaGU8L2gyPgotVGhlIDxjb2RlPmh0dHBkPC9jb2RlPiBwcm9ncmFtIGlzIGVpdGhlciBpbnZva2VkIGJ5IHRoZSBJbnRlcm5ldCAKLWRhZW1vbiA8Y29kZT5pbmV0ZDwvY29kZT4gZWFjaCB0aW1lIGEgY29ubmVjdGlvbiB0byB0aGUgSFRUUCBzZXJ2aWNlIGlzIG1hZGUsCi1vciBhbHRlcm5hdGl2ZWx5IGl0IG1heSBydW4gYXMgYSBkYWVtb24gd2hpY2ggZXhlY3V0ZXMgY29udGludW91c2x5LCBoYW5kbGluZwotcmVxdWVzdHMuIFdoYXRldmVyIG1ldGhvZCBpcyBjaG9zZW4sIHRoZQotPEEgSFJFRj0iY29yZS5odG1sI3NlcnZlcnR5cGUiPlNlcnZlclR5cGU8L0E+IGRpcmVjdGl2ZSBtdXN0IGJlIHNldAotdG8gdGVsbCB0aGUgc2VydmVyIGhvdyBpdCBpcyB0byBydW4uCi0KLTxoMj5Db21tYW5kIGxpbmUgb3B0aW9uczwvaDI+Ci1UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHJlY29nbmlzZWQgb24gdGhlIGh0dHBkIGNvbW1hbmQgbGluZToKLTxkbD4KLTxkdD48Y29kZT4tZDwvY29kZT4gPGVtPnNlcnZlcnJvb3Q8L2VtPgotPGRkPlNldCB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlCi08QSBIUkVGPSJjb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvQT4gdmFyaWFibGUgdG8KLTxlbT5zZXJ2ZXJyb290PC9lbT4uIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIFNlcnZlclJvb3QgY29tbWFuZCBpbiB0aGUKLWNvbmZpZ3VyYXRpb24gZmlsZS4gVGhlIGRlZmF1bHQgaXMgPGNvZGU+L3Vzci9sb2NhbC9ldGMvaHR0cGQ8L2NvZGU+LgotCi08ZHQ+PGNvZGU+LWY8L2NvZGU+IDxlbT5jb25maWc8L2VtPgotPGRkPkV4ZWN1dGUgdGhlIGNvbW1hbmRzIGluIHRoZSBmaWxlIDxlbT5jb25maWc8L2VtPiBvbiBzdGFydHVwLiBJZgotPGVtPmNvbmZpZzwvZW0+IGRvZXMgbm90IGJlZ2luIHdpdGggYSA8Y29kZT4vPC9jb2RlPiwgdGhlbiBpdCBpcyB0YWtlbiB0byBiZSBhCi1wYXRoIHJlbGF0aXZlIHRvIHRoZSA8QSBIUkVGPSJjb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvQT4uIFRoZQotZGVmYXVsdCBpcyA8Y29kZT5jb25mL2h0dHBkLmNvbmY8L2NvZGU+LgotCi08ZHQ+PGNvZGU+LVg8L2NvZGU+Ci08ZGQ+UnVuIGluIHNpbmdsZS1wcm9jZXNzIG1vZGUsIGZvciBpbnRlcm5hbCBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seTsgdGhlCi1kYWVtb24gZG9lcyBub3QgZGV0YWNoIGZyb20gdGhlIHRlcm1pbmFsIG9yIGZvcmsgYW55IGNoaWxkcmVuLiBEbyA8ZW0+Tk9UPC9lbT4KLXVzZSB0aGlzIG1vZGUgdG8gcHJvdmlkZSBvcmRpbmFyeSB3ZWIgc2VydmljZS4KLQotPGR0Pjxjb2RlPi12PC9jb2RlPgotPGRkPlByaW50IHRoZSB2ZXJzaW9uIG9mIGh0dHBkLCBhbmQgdGhlbiBleGl0LgotCi08ZHQ+PGNvZGU+LT88L2NvZGU+Ci08ZGQ+UHJpbnQgYSBsaXN0IG9mIHRoZSBodHRwZCBvcHRpb25zLCBhbmQgdGhlbiBleGl0LgotPC9kbD4KLQotPGgyPkNvbmZpZ3VyYXRpb24gZmlsZXM8L2gyPgotVGhlIHNlcnZlciB3aWxsIHJlYWQgdGhyZWUgZmlsZXMgZm9yIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcy4gQW55IGRpcmVjdGl2ZQotbWF5IGFwcGVhciBpbiBhbnkgb2YgdGhlc2UgZmlsZXMuIFRoZSB0aGUgbmFtZXMgb2YgdGhlc2UgZmlsZXMgYXJlIHRha2VuCi10byBiZSByZWxhdGl2ZSB0byB0aGUgc2VydmVyIHJvb3Q7IHRoaXMgaXMgc2V0IGJ5IHRoZQotPEEgSFJFRj0iY29yZS5odG1sI3NlcnZlcnJvb3QiPlNlcnZlclJvb3Q8L0E+IGRpcmVjdGl2ZSwgb3IgdGhlCi08Y29kZT4tZDwvY29kZT4gY29tbWFuZCBsaW5lIGZsYWcuCi0KLUNvbnZlbnRpb25hbGx5LCB0aGUgZmlsZXMgYXJlOgotPGRsPgotPGR0Pjxjb2RlPmNvbmYvaHR0cGQuY29uZjwvY29kZT4KLTxkZD5Db250YWlucyBkaXJlY3RpdmVzIHRoYXQgY29udHJvbCB0aGUgb3BlcmF0aW9uIG9mIHRoZSBzZXJ2ZXIgZGFlbW9uLgotVGhlIGZpbGVuYW1lIG1heSBiZSBvdmVycmlkZGVuIHdpdGggdGhlIDxjb2RlPi1mPC9jb2RlPiBjb21tYW5kIGxpbmUgZmxhZy4KLQotPGR0Pjxjb2RlPmNvbmYvc3JtLmNvbmY8L2NvZGU+Ci08ZGQ+Q29udGFpbnMgZGlyZWN0aXZlcyB0aGF0IGNvbnRyb2wgdGhlIHNwZWNpZmljYXRpb24gb2YgZG9jdW1lbnRzIHRoYXQKLXRoZSBzZXJ2ZXIgY2FuIHByb3ZpZGUgdG8gY2xpZW50cy4gVGhlIGZpbGVuYW1lIG1heSBiZSBvdmVycmlkZGVuIHdpdGgKLXRoZSA8QSBIUkVGPSJjb3JlLmh0bWwjcmVzb3VyY2Vjb25maWciPlJlc291cmNlQ29uZmlnPC9BPiBkaXJlY3RpdmUuCi0KLTxkdD48Y29kZT5jb25mL2FjY2VzLmNvbmY8L2NvZGU+Ci08ZGQ+Q29udGFpbnMgZGlyZWN0aXZlcyB0aGF0IGNvbnRyb2wgYWNjZXNzIHRvIGRvY3VtZW50cy4KLVRoZSBmaWxlbmFtZSBtYXkgYmUgb3ZlcnJpZGRlbiB3aXRoIHRoZQotPEEgSFJFRj0iY29yZS5odG1sI2FjY2Vzc2NvbmZpZyI+QWNjZXNzQ29uZmlnPC9BPiBkaXJlY3RpdmUuCi08L2RsPgotSG93ZXZlciwgdGhlc2UgY29udmVudGlvbnMgbmVlZCBub3QgYmUgYWRoZXJlZCB0by4KLTxwPgotVGhlIHNlcnZlciBhbHNvIHJlYWRzIGEgZmlsZSBjb250YWluaW5nIG1pbWUgZG9jdW1lbnQgdHlwZXM7IHRoZSBmaWxlbmFtZQotaXMgc2V0IGJ5IHRoZSA8QSBIUkVGPSJtb2RfbWltZS5odG1sI3R5cGVzY29uZmlnIj5UeXBlc0NvbmZpZzwvQT4gZGlyZWN0aXZlLAotYW5kIGlzIDxjb2RlPmNvbmYvbWltZS50eXBlczwvY29kZT4gYnkgZGVmYXVsdC4KLQotPGgyPkxvZyBmaWxlczwvaDI+Ci08aDM+cGlkIGZpbGU8L2gzPgotT24gZGFlbW9uIHN0YXJ0dXAsIGl0IHNhdmVzIHRoZSBwcm9jZXNzIGlkIG9mIHRoZSBwYXJlbnQgaHR0cGQgcHJvY2VzcyB0bwotdGhlIGZpbGUgPGNvZGU+bG9ncy9odHRwZC5waWQ8L2NvZGU+LiBUaGlzIGZpbGVuYW1lIGNhbiBiZSBjaGFuZ2VkIHdpdGggdGhlCi08QSBIUkVGPSJjb3JlLmh0bWwjcGlkZmlsZSI+UGlkRmlsZTwvQT4gZGlyZWN0aXZlLiBUaGUgcHJvY2Vzcy1pZCBpcyBmb3IKLXVzZSBieSB0aGUgYWRtaW5pc3RyYXRvciBpbiByZXN0YXJ0aW5nIGFuZCB0ZXJtaW5hdGluZyB0aGUgZGFlbW9uOwotQSBIVVAgc2lnbmFsIGNhdXNlcyB0aGUgZGFlbW9uIHRvIHJlLXJlYWQgaXRzIGNvbmZpZ3VyYXRpb24gZmlsZXMgYW5kCi1hIFRFUk0gc2lnbmFsIGNhdXNlcyBpdCB0byBkaWUgZ3JhY2VmdWxseS4KLTxwPgotSWYgdGhlIHByb2Nlc3MgZGllcyAob3IgaXMga2lsbGVkKSBhYm5vcm1hbGx5LCB0aGVuIGl0IHdpbGwgYmUgbmVjZXNzYXJ5IHRvCi1raWxsIHRoZSBjaGlsZHJlbiBodHRwZCBwcm9jZXNzZXMuCi0KLTxoMz5FcnJvciBsb2c8L2gzPgotVGhlIHNlcnZlciB3aWxsIGxvZyBlcnJvciBtZXNzYWdlcyB0byBhIGxvZyBmaWxlLCA8Y29kZT5sb2dzL2Vycm9yX2xvZzwvY29kZT4KLWJ5IGRlZmF1bHQuIFRoZSBmaWxlbmFtZSBjYW4gYmUgc2V0IHVzaW5nIHRoZQotPEEgSFJFRj0iY29yZS5odG1sI2Vycm9ybG9nIj5FcnJvckxvZzwvQT4gZGlyZWN0aXZlOyBkaWZmZXJlbnQgZXJyb3IgbG9ncyBjYW4KLWJlIHNldCBmb3IgZGlmZmVyZW50IDxBIEhSRUY9ImNvcmUuaHRtbCN2aXJ0dWFsaG9zdCI+dmlydHVhbCBob3N0czwvQT4uCi0KLTxoMz5UcmFuc2ZlciBsb2c8L2gzPgotVGhlIHNlcnZlciB3aWxsIHR5cGljYWxseSBsb2cgZWFjaCByZXF1ZXN0IHRvIGEgdHJhbnNmZXIgZmlsZSwKLTxjb2RlPmxvZ3MvYWNjZXNzX2xvZzwvY29kZT4gYnkgZGVmYXVsdC4gVGhlIGZpbGVuYW1lIGNhbiBiZSBzZXQgdXNpbmcgYQotPEEgSFJFRj0ibW9kX2xvZ19jb21tb24uaHRtbCN0cmFuc2ZlcmxvZyI+VHJhbnNmZXJMb2c8L0E+IGRpcmVjdGl2ZTsgZGlmZmVyZW50Ci10cmFuc2ZlciBsb2dzIGNhbiBiZSBzZXQgZm9yIGRpZmZlcmVudCA8QSBIUkVGPSJjb3JlLmh0bWwjdmlydHVhbGhvc3QiPnZpcnR1YWwKLWhvc3RzPC9BPi4KLQotPCEtLSVoeXBlcnRleHQgLS0+Ci08aHI+Ci08QSBIUkVGPSIuLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2hvbWUuZ2lmIiBBTFQ9IkhvbWUiPjwvQT4KLTxBIEhSRUY9Ii4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9pbmRleC5naWYiIEFMVD0iSW5kZXgiPjwvQT4KLQotPC9CT0RZPgotPC9IVE1MPgotPCEtLS8laHlwZXJ0ZXh0IC0tPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvaW52b2tpbmcuaHRtbC5lbiBiL2RvY3MvbWFudWFsL2ludm9raW5nLmh0bWwuZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMGI2OGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvaW52b2tpbmcuaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi08IS0tJWh5cGVydGV4dCAtLT4KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgMi4wLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPlN0YXJ0aW5nIEFwYWNoZTwvVElUTEU+Ci08L0hFQUQ+Ci0KLTxCT0RZPgotPCEtLS8laHlwZXJ0ZXh0IC0tPgotCi08aDE+U3RhcnRpbmcgQXBhY2hlPC9oMT4KLTxoMj5JbnZva2luZyBBcGFjaGU8L2gyPgotVGhlIDxjb2RlPmh0dHBkPC9jb2RlPiBwcm9ncmFtIGlzIGVpdGhlciBpbnZva2VkIGJ5IHRoZSBJbnRlcm5ldCAKLWRhZW1vbiA8Y29kZT5pbmV0ZDwvY29kZT4gZWFjaCB0aW1lIGEgY29ubmVjdGlvbiB0byB0aGUgSFRUUCBzZXJ2aWNlIGlzIG1hZGUsCi1vciBhbHRlcm5hdGl2ZWx5IGl0IG1heSBydW4gYXMgYSBkYWVtb24gd2hpY2ggZXhlY3V0ZXMgY29udGludW91c2x5LCBoYW5kbGluZwotcmVxdWVzdHMuIFdoYXRldmVyIG1ldGhvZCBpcyBjaG9zZW4sIHRoZQotPEEgSFJFRj0iY29yZS5odG1sI3NlcnZlcnR5cGUiPlNlcnZlclR5cGU8L0E+IGRpcmVjdGl2ZSBtdXN0IGJlIHNldAotdG8gdGVsbCB0aGUgc2VydmVyIGhvdyBpdCBpcyB0byBydW4uCi0KLTxoMj5Db21tYW5kIGxpbmUgb3B0aW9uczwvaDI+Ci1UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHJlY29nbmlzZWQgb24gdGhlIGh0dHBkIGNvbW1hbmQgbGluZToKLTxkbD4KLTxkdD48Y29kZT4tZDwvY29kZT4gPGVtPnNlcnZlcnJvb3Q8L2VtPgotPGRkPlNldCB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlCi08QSBIUkVGPSJjb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvQT4gdmFyaWFibGUgdG8KLTxlbT5zZXJ2ZXJyb290PC9lbT4uIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIFNlcnZlclJvb3QgY29tbWFuZCBpbiB0aGUKLWNvbmZpZ3VyYXRpb24gZmlsZS4gVGhlIGRlZmF1bHQgaXMgPGNvZGU+L3Vzci9sb2NhbC9ldGMvaHR0cGQ8L2NvZGU+LgotCi08ZHQ+PGNvZGU+LWY8L2NvZGU+IDxlbT5jb25maWc8L2VtPgotPGRkPkV4ZWN1dGUgdGhlIGNvbW1hbmRzIGluIHRoZSBmaWxlIDxlbT5jb25maWc8L2VtPiBvbiBzdGFydHVwLiBJZgotPGVtPmNvbmZpZzwvZW0+IGRvZXMgbm90IGJlZ2luIHdpdGggYSA8Y29kZT4vPC9jb2RlPiwgdGhlbiBpdCBpcyB0YWtlbiB0byBiZSBhCi1wYXRoIHJlbGF0aXZlIHRvIHRoZSA8QSBIUkVGPSJjb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvQT4uIFRoZQotZGVmYXVsdCBpcyA8Y29kZT5jb25mL2h0dHBkLmNvbmY8L2NvZGU+LgotCi08ZHQ+PGNvZGU+LVg8L2NvZGU+Ci08ZGQ+UnVuIGluIHNpbmdsZS1wcm9jZXNzIG1vZGUsIGZvciBpbnRlcm5hbCBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seTsgdGhlCi1kYWVtb24gZG9lcyBub3QgZGV0YWNoIGZyb20gdGhlIHRlcm1pbmFsIG9yIGZvcmsgYW55IGNoaWxkcmVuLiBEbyA8ZW0+Tk9UPC9lbT4KLXVzZSB0aGlzIG1vZGUgdG8gcHJvdmlkZSBvcmRpbmFyeSB3ZWIgc2VydmljZS4KLQotPGR0Pjxjb2RlPi12PC9jb2RlPgotPGRkPlByaW50IHRoZSB2ZXJzaW9uIG9mIGh0dHBkLCBhbmQgdGhlbiBleGl0LgotCi08ZHQ+PGNvZGU+LT88L2NvZGU+Ci08ZGQ+UHJpbnQgYSBsaXN0IG9mIHRoZSBodHRwZCBvcHRpb25zLCBhbmQgdGhlbiBleGl0LgotPC9kbD4KLQotPGgyPkNvbmZpZ3VyYXRpb24gZmlsZXM8L2gyPgotVGhlIHNlcnZlciB3aWxsIHJlYWQgdGhyZWUgZmlsZXMgZm9yIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcy4gQW55IGRpcmVjdGl2ZQotbWF5IGFwcGVhciBpbiBhbnkgb2YgdGhlc2UgZmlsZXMuIFRoZSB0aGUgbmFtZXMgb2YgdGhlc2UgZmlsZXMgYXJlIHRha2VuCi10byBiZSByZWxhdGl2ZSB0byB0aGUgc2VydmVyIHJvb3Q7IHRoaXMgaXMgc2V0IGJ5IHRoZQotPEEgSFJFRj0iY29yZS5odG1sI3NlcnZlcnJvb3QiPlNlcnZlclJvb3Q8L0E+IGRpcmVjdGl2ZSwgb3IgdGhlCi08Y29kZT4tZDwvY29kZT4gY29tbWFuZCBsaW5lIGZsYWcuCi0KLUNvbnZlbnRpb25hbGx5LCB0aGUgZmlsZXMgYXJlOgotPGRsPgotPGR0Pjxjb2RlPmNvbmYvaHR0cGQuY29uZjwvY29kZT4KLTxkZD5Db250YWlucyBkaXJlY3RpdmVzIHRoYXQgY29udHJvbCB0aGUgb3BlcmF0aW9uIG9mIHRoZSBzZXJ2ZXIgZGFlbW9uLgotVGhlIGZpbGVuYW1lIG1heSBiZSBvdmVycmlkZGVuIHdpdGggdGhlIDxjb2RlPi1mPC9jb2RlPiBjb21tYW5kIGxpbmUgZmxhZy4KLQotPGR0Pjxjb2RlPmNvbmYvc3JtLmNvbmY8L2NvZGU+Ci08ZGQ+Q29udGFpbnMgZGlyZWN0aXZlcyB0aGF0IGNvbnRyb2wgdGhlIHNwZWNpZmljYXRpb24gb2YgZG9jdW1lbnRzIHRoYXQKLXRoZSBzZXJ2ZXIgY2FuIHByb3ZpZGUgdG8gY2xpZW50cy4gVGhlIGZpbGVuYW1lIG1heSBiZSBvdmVycmlkZGVuIHdpdGgKLXRoZSA8QSBIUkVGPSJjb3JlLmh0bWwjcmVzb3VyY2Vjb25maWciPlJlc291cmNlQ29uZmlnPC9BPiBkaXJlY3RpdmUuCi0KLTxkdD48Y29kZT5jb25mL2FjY2VzLmNvbmY8L2NvZGU+Ci08ZGQ+Q29udGFpbnMgZGlyZWN0aXZlcyB0aGF0IGNvbnRyb2wgYWNjZXNzIHRvIGRvY3VtZW50cy4KLVRoZSBmaWxlbmFtZSBtYXkgYmUgb3ZlcnJpZGRlbiB3aXRoIHRoZQotPEEgSFJFRj0iY29yZS5odG1sI2FjY2Vzc2NvbmZpZyI+QWNjZXNzQ29uZmlnPC9BPiBkaXJlY3RpdmUuCi08L2RsPgotSG93ZXZlciwgdGhlc2UgY29udmVudGlvbnMgbmVlZCBub3QgYmUgYWRoZXJlZCB0by4KLTxwPgotVGhlIHNlcnZlciBhbHNvIHJlYWRzIGEgZmlsZSBjb250YWluaW5nIG1pbWUgZG9jdW1lbnQgdHlwZXM7IHRoZSBmaWxlbmFtZQotaXMgc2V0IGJ5IHRoZSA8QSBIUkVGPSJtb2RfbWltZS5odG1sI3R5cGVzY29uZmlnIj5UeXBlc0NvbmZpZzwvQT4gZGlyZWN0aXZlLAotYW5kIGlzIDxjb2RlPmNvbmYvbWltZS50eXBlczwvY29kZT4gYnkgZGVmYXVsdC4KLQotPGgyPkxvZyBmaWxlczwvaDI+Ci08aDM+cGlkIGZpbGU8L2gzPgotT24gZGFlbW9uIHN0YXJ0dXAsIGl0IHNhdmVzIHRoZSBwcm9jZXNzIGlkIG9mIHRoZSBwYXJlbnQgaHR0cGQgcHJvY2VzcyB0bwotdGhlIGZpbGUgPGNvZGU+bG9ncy9odHRwZC5waWQ8L2NvZGU+LiBUaGlzIGZpbGVuYW1lIGNhbiBiZSBjaGFuZ2VkIHdpdGggdGhlCi08QSBIUkVGPSJjb3JlLmh0bWwjcGlkZmlsZSI+UGlkRmlsZTwvQT4gZGlyZWN0aXZlLiBUaGUgcHJvY2Vzcy1pZCBpcyBmb3IKLXVzZSBieSB0aGUgYWRtaW5pc3RyYXRvciBpbiByZXN0YXJ0aW5nIGFuZCB0ZXJtaW5hdGluZyB0aGUgZGFlbW9uOwotQSBIVVAgc2lnbmFsIGNhdXNlcyB0aGUgZGFlbW9uIHRvIHJlLXJlYWQgaXRzIGNvbmZpZ3VyYXRpb24gZmlsZXMgYW5kCi1hIFRFUk0gc2lnbmFsIGNhdXNlcyBpdCB0byBkaWUgZ3JhY2VmdWxseS4KLTxwPgotSWYgdGhlIHByb2Nlc3MgZGllcyAob3IgaXMga2lsbGVkKSBhYm5vcm1hbGx5LCB0aGVuIGl0IHdpbGwgYmUgbmVjZXNzYXJ5IHRvCi1raWxsIHRoZSBjaGlsZHJlbiBodHRwZCBwcm9jZXNzZXMuCi0KLTxoMz5FcnJvciBsb2c8L2gzPgotVGhlIHNlcnZlciB3aWxsIGxvZyBlcnJvciBtZXNzYWdlcyB0byBhIGxvZyBmaWxlLCA8Y29kZT5sb2dzL2Vycm9yX2xvZzwvY29kZT4KLWJ5IGRlZmF1bHQuIFRoZSBmaWxlbmFtZSBjYW4gYmUgc2V0IHVzaW5nIHRoZQotPEEgSFJFRj0iY29yZS5odG1sI2Vycm9ybG9nIj5FcnJvckxvZzwvQT4gZGlyZWN0aXZlOyBkaWZmZXJlbnQgZXJyb3IgbG9ncyBjYW4KLWJlIHNldCBmb3IgZGlmZmVyZW50IDxBIEhSRUY9ImNvcmUuaHRtbCN2aXJ0dWFsaG9zdCI+dmlydHVhbCBob3N0czwvQT4uCi0KLTxoMz5UcmFuc2ZlciBsb2c8L2gzPgotVGhlIHNlcnZlciB3aWxsIHR5cGljYWxseSBsb2cgZWFjaCByZXF1ZXN0IHRvIGEgdHJhbnNmZXIgZmlsZSwKLTxjb2RlPmxvZ3MvYWNjZXNzX2xvZzwvY29kZT4gYnkgZGVmYXVsdC4gVGhlIGZpbGVuYW1lIGNhbiBiZSBzZXQgdXNpbmcgYQotPEEgSFJFRj0ibW9kX2xvZ19jb21tb24uaHRtbCN0cmFuc2ZlcmxvZyI+VHJhbnNmZXJMb2c8L0E+IGRpcmVjdGl2ZTsgZGlmZmVyZW50Ci10cmFuc2ZlciBsb2dzIGNhbiBiZSBzZXQgZm9yIGRpZmZlcmVudCA8QSBIUkVGPSJjb3JlLmh0bWwjdmlydHVhbGhvc3QiPnZpcnR1YWwKLWhvc3RzPC9BPi4KLQotPCEtLSVoeXBlcnRleHQgLS0+Ci08aHI+Ci08QSBIUkVGPSIuLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2hvbWUuZ2lmIiBBTFQ9IkhvbWUiPjwvQT4KLTxBIEhSRUY9Ii4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9pbmRleC5naWYiIEFMVD0iSW5kZXgiPjwvQT4KLQotPC9CT0RZPgotPC9IVE1MPgotPCEtLS8laHlwZXJ0ZXh0IC0tPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbG9ncy5odG1sIGIvZG9jcy9tYW51YWwvbG9ncy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2ViZjQ4Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2xvZ3MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkxvZyBGaWxlcyAtIEFwYWNoZSBIVFRQIFNlcnZlcjwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPGgxIGFsaWduPSJjZW50ZXIiPkxvZyBGaWxlczwvaDE+Ci0KLTxwPkluIG9yZGVyIHRvIGVmZmVjdGl2ZWx5IG1hbmFnZSBhIHdlYiBzZXJ2ZXIsIGl0IGlzIG5lY2Vzc2FyeSB0byBnZXQKLWZlZWRiYWNrIGFib3V0IHRoZSBhY3Rpdml0eSBhbmQgcGVyZm9ybWFuY2Ugb2YgdGhlIHNlcnZlciBhcyB3ZWxsIGFzCi1hbnkgcHJvYmxlbXMgdGhhdCBtYXkgYmUgb2NjdXJpbmcuICBUaGUgQXBhY2hlIEhUVFAgU2VydmVyIHByb3ZpZGVzCi12ZXJ5IGNvbXByZWhlbnNpdmUgYW5kIGZsZXhpYmxlIGxvZ2dpbmcgY2FwYWJpbGl0aWVzLiAgVGhpcyBkb2N1bWVudAotZGVzY3JpYmVzIGhvdyB0byBjb25maWd1cmUgdGhlIHZhcmlvdXMgbG9nIGZpbGVzLCBhbmQgaG93IHRvCi11bmRlcnN0YW5kIHdoYXQgdGhlIGxvZ3MgY29udGFpbi48L3A+Ci0KLTx1bD4KLTxsaT48YSBocmVmPSIjc2VjdXJpdHkiPlNlY3VyaXR5IFdhcm5pbmc8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjZXJyb3Jsb2ciPkVycm9yIExvZzwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNhY2Nlc3Nsb2ciPkFjY2VzcyBMb2c8L2E+Ci0gIDx1bD4KLSAgICA8bGk+PGEgaHJlZj0iI2NvbW1vbiI+Q29tbW9uIExvZyBGb3JtYXQ8L2E+PC9saT4KLSAgICA8bGk+PGEgaHJlZj0iI2NvbWJpbmVkIj5Db21iaW5lZCBMb2cgRm9ybWF0PC9hPjwvbGk+Ci0gICAgPGxpPjxhIGhyZWY9IiNtdWx0aXBsZSI+TXVsdGlwbGUgQWNjZXNzIExvZ3M8L2E+PC9saT4KLSAgICA8bGk+PGEgaHJlZj0iI2NvbmRpdGlvbmFsIj5Db25kaXRpb25hbCBMb2dnaW5nPC9hPjwvbGk+Ci0gIDwvdWw+PC9saT4KLTxsaT48YSBocmVmPSIjcm90YXRpb24iPkxvZyBSb3RhdGlvbjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNwaXBlZCI+UGlwZWQgTG9nczwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiN2aXJ0dWFsaG9zdHMiPlZpcnR1YWxIb3N0czwvYT4KLTxsaT48YSBocmVmPSIjb3RoZXIiPk90aGVyIExvZyBGaWxlczwvYT4KLSAgPHVsPgotICAgIDxsaT48YSBocmVmPSIjcGlkZmlsZSI+UElEIEZpbGU8L2E+PC9saT4KLSAgICA8bGk+PGEgaHJlZj0iI3NjcmlwdGxvZyI+U2NyaXB0IExvZzwvYT48L2xpPgotICAgIDxsaT48YSBocmVmPSIjcmV3cml0ZWxvZyI+UmV3cml0ZSBMb2c8L2E+PC9saT4KLSAgPC91bD48L2xpPgotPC91bD4KLQotPGhyPgotCi08aDI+PGEgbmFtZT0ic2VjdXJpdHkiPlNlY3VyaXR5IFdhcm5pbmc8L2E+PC9oMj4KLQotPHA+QW55b25lIHdobyBjYW4gd3JpdGUgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBBcGFjaGUgaXMgd3JpdGluZyBhCi1sb2cgZmlsZSBjYW4gYWxtb3N0IGNlcnRhaW5seSBnYWluIGFjY2VzcyB0byB0aGUgdWlkIHRoYXQgdGhlIHNlcnZlciBpcwotc3RhcnRlZCBhcywgd2hpY2ggaXMgbm9ybWFsbHkgcm9vdC4gIERvIDxFTT5OT1Q8L0VNPiBnaXZlIHBlb3BsZSB3cml0ZQotYWNjZXNzIHRvIHRoZSBkaXJlY3RvcnkgdGhlIGxvZ3MgYXJlIHN0b3JlZCBpbiB3aXRob3V0IGJlaW5nIGF3YXJlIG9mCi10aGUgY29uc2VxdWVuY2VzOyBzZWUgdGhlIDxBIEhSRUY9Im1pc2Mvc2VjdXJpdHlfdGlwcy5odG1sIj5zZWN1cml0eSB0aXBzPC9BPgotZG9jdW1lbnQgZm9yIGRldGFpbHMuPC9wPgotCi08cD5JbiBhZGRpdGlvbiwgbG9nIGZpbGVzIG1heSBjb250YWluIGluZm9ybWF0aW9uIHN1cHBsaWVkIGRpcmVjdGx5Ci1ieSB0aGUgY2xpZW50LCB3aXRob3V0IGVzY2FwaW5nLiAgVGhlcmVmb3JlLCBpdCBpcyBwb3NzaWJsZSBmb3IKLW1hbGljaW91cyBjbGllbnRzIHRvIGluc2VydCBjb250cm9sLWNoYXJhY3RlcnMgaW4gdGhlIGxvZyBmaWxlcywgc28KLWNhcmUgbXVzdCBiZSB0YWtlbiBpbiBkZWFsaW5nIHdpdGggcmF3IGxvZ3MuPC9wPgotCi08aHI+Ci0KLTxoMj48YSBuYW1lPSJlcnJvcmxvZyI+RXJyb3IgTG9nPC9hPjwvaDI+Ci0KLTx0YWJsZSBib3JkZXI9IjEiPgotPHRyPjx0ZCB2YWxpZ249InRvcCI+Ci08c3Ryb25nPlJlbGF0ZWQgRGlyZWN0aXZlczwvc3Ryb25nPjxicj48YnI+Ci0KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjZXJyb3Jsb2ciPkVycm9yTG9nPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjbG9nbGV2ZWwiPkxvZ0xldmVsPC9hPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPlRoZSBzZXJ2ZXIgZXJyb3IgbG9nLCB3aG9zZSBuYW1lIGFuZCBsb2NhdGlvbiBpcyBzZXQgYnkgdGhlIDxhCi1ocmVmPSJtb2QvY29yZS5odG1sI2Vycm9ybG9nIj5FcnJvckxvZzwvYT4gZGlyZWN0aXZlLCBpcyB0aGUgbW9zdAotaW1wb3J0YW50IGxvZyBmaWxlLiAgVGhpcyBpcyB0aGUgcGxhY2Ugd2hlcmUgQXBhY2hlIEhUVFBEIHdpbGwgc2VuZAotZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBhbmQgcmVjb3JkIGFueSBlcnJvcnMgdGhhdCBpdCBlbmNvdW50ZXJzIGluCi1wcm9jZXNzaW5nIHJlcXVlc3RzLiAgSXQgaXMgdGhlIGZpcnN0IHBsYWNlIHRvIGxvb2sgd2hlbiBhIHByb2JsZW0KLW9jY3VycyB3aXRoIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIgb3Igd2l0aCB0aGUgb3BlcmF0aW9uIG9mIHRoZSBzZXJ2ZXIsCi1zaW5jZSBpdCB3aWxsIG9mdGVuIGNvbnRhaW4gZGV0YWlscyBvZiB3aGF0IHdlbnQgd3JvbmcgYW5kIGhvdyB0byBmaXgKLWl0LjwvcD4KLQotPHA+VGhlIGVycm9yIGxvZyBpcyB1c3VhbGx5IHdyaXR0ZW4gdG8gYSBmaWxlICh0eXBpY2FsbHkKLTxjb2RlPmVycm9yX2xvZzwvY29kZT4gb24gdW5peCBzeXN0ZW1zIGFuZCA8Y29kZT5lcnJvci5sb2c8L2NvZGU+IG9uCi1XaW5kb3dzIGFuZCBPUy8yKS4gIE9uIHVuaXggc3lzdGVtcyBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGhhdmUgdGhlCi1zZXJ2ZXIgc2VuZCBlcnJvcnMgdG8gdGhlIDxjb2RlPnN5c2xvZzwvY29kZT4gb3IgPGEgaHJlZj0iI3BpcGUiPnBpcGUKLXRoZW0gdGhyb3VnaCBhIHByb2dyYW08L2E+LjwvcD4KLQotPHA+VGhlIGZvcm1hdCBvZiB0aGUgZXJyb3IgbG9nIGlzIHJlbGF0aXZlbHkgZnJlZS1mb3JtIGFuZAotZGVzY3JpcHRpdmUuICBCdXQgdGhlcmUgaXMgY2VydGFpbiBpbmZvcm1hdGlvbiB0aGF0IGlzIGNvbnRhaW5lZAotaW4gbW9zdCBlcnJvciBsb2cgZW50cmllcy4gIEZvciBleGFtcGxlLCBoZXJlIGlzIGEgdHlwaWNhbCBtZXNzYWdlLjwvcD4KLQotPGJsb2NrcXVvdGU+PGNvZGU+Ci1bV2VkIE9jdCAxMSAxNDozMjo1MiAyMDAwXSBbZXJyb3JdIFtjbGllbnQgMTI3LjAuMC4xXSBjbGllbnQgZGVuaWVkIGJ5IHNlcnZlciBjb25maWd1cmF0aW9uOiAvZXhwb3J0L2hvbWUvbGl2ZS9hcC9odGRvY3MvdGVzdAotPC9jb2RlPjwvYmxvY2txdW90ZT4KLQotPHA+VGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxvZyBlbnRyeSBpcyB0aGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUKLW1lc3NhZ2UuICBUaGUgc2Vjb25kIGVudHJ5IGxpc3RzIHRoZSBzZXZlcml0eSBvZiB0aGUgZXJyb3IgYmVpbmcKLXJlcG9ydGVkLiBUaGUgPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNsb2dsZXZlbCI+TG9nTGV2ZWw8L2E+IGRpcmVjdGl2ZQotaXMgdXNlZCB0byBjb250cm9sIHRoZSB0eXBlcyBvZiBlcnJvcnMgdGhhdCBhcmUgc2VudCB0byB0aGUgZXJyb3IgbG9nCi1ieSByZXN0cmljdGluZyB0aGUgc2V2ZXJpdHkgbGV2ZWwuICBUaGUgdGhpcmQgZW50cnkgZ2l2ZXMgdGhlIElQCi1hZGRyZXNzIG9mIHRoZSBjbGllbnQgdGhhdCBnZW5lcmF0ZWQgdGhlIGVycm9yLiAgQmV5b25kIHRoYXQgaXMgdGhlCi1tZXNzYWdlIGl0c2VsZiwgd2hpY2ggaW4gdGhpcyBjYXNlIGluZGljYXRlcyB0aGF0IHRoZSBzZXJ2ZXIgaGFzIGJlZW4KLWNvbmZpZ3VyZWQgdG8gZGVueSB0aGUgY2xpZW50IGFjY2Vzcy4gIFRoZSBzZXJ2ZXIgcmVwb3J0cyB0aGUKLWZpbGUtc3lzdGVtIHBhdGggKGFzIG9wcG9zZWQgdG8gdGhlIHdlYiBwYXRoKSBvZiB0aGUgcmVxdWVzdGVkCi1kb2N1bWVudC48L3A+Ci0KLTxwPkEgdmVyeSB3aWRlIHZhcmlldHkgb2YgZGlmZmVyZW50IG1lc3NhZ2VzIGNhbiBhcHBlYXIgaW4gdGhlIGVycm9yCi1sb2cuICBNb3N0IGxvb2sgc2ltaWxhciB0byB0aGUgZXhhbXBsZSBhYm92ZS4gIFRoZSBlcnJvciBsb2cgd2lsbCBhbHNvCi1jb250YWluIGRlYnVnZ2luZyBvdXRwdXQgZnJvbSBDR0kgc2NyaXB0cy4gIEFueSBpbmZvcm1hdGlvbiB3cml0dGVuIHRvCi08Y29kZT5zdGRlcnI8L2NvZGU+IGJ5IGEgQ0dJIHNjcmlwdCB3aWxsIGJlIGNvcGllZCBkaXJlY3RseSB0byB0aGUKLWVycm9yIGxvZy48L3A+Ci0KLTxwPkl0IGlzIG5vdCBwb3NzaWJsZSB0byBjdXN0b21pemUgdGhlIGVycm9yIGxvZyBieSBhZGRpbmcgb3IgcmVtb3ZpbmcKLWluZm9ybWF0aW9uLiAgSG93ZXZlciwgZXJyb3IgbG9nIGVudHJpZXMgZGVhbGluZyB3aXRoIHBhcnRpY3VsYXIKLXJlcXVlc3RzIGhhdmUgY29ycmVzcG9uZGluZyBlbnRyaWVzIGluIHRoZSA8YSBocmVmPSJhY2Nlc3Nsb2ciPmFjY2VzcwotbG9nPC9hPi4gIEZvciBleGFtcGxlLCB0aGUgYWJvdmUgZXhhbXBsZSBlbnRyeSBjb3JyZXNwb25kcyB0byBhbgotYWNjZXNzIGxvZyBlbnRyeSB3aXRoIHN0YXR1cyBjb2RlIDQwMy4gIFNpbmNlIGl0IGlzIHBvc3NpYmxlIHRvCi1jdXN0b21pemUgdGhlIGFjY2VzcyBsb2csIHlvdSBjYW4gb2J0YWluIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZXJyb3IKLWNvbmRpdGlvbnMgdXNpbmcgdGhhdCBsb2cgZmlsZS48L3A+Ci0KLTxwPkR1cmluZyB0ZXN0aW5nLCBpdCBpcyBvZnRlbiB1c2VmdWwgdG8gY29udGludW91c2x5IG1vbml0b3IgdGhlCi1lcnJvciBsb2cgZm9yIGFueSBwcm9ibGVtcy4gIE9uIHVuaXggc3lzdGVtcywgeW91IGNhbiBhY2NvbXBsaXNoIHRoaXMgCi11c2luZzo8L3A+Ci08YmxvY2txdW90ZT48Y29kZT4KLXRhaWwgLWYgZXJyb3JfbG9nCi08L2NvZGU+PC9ibG9ja3F1b3RlPgotCi08aHI+Ci0KLTxoMj48YSBuYW1lPSJhY2Nlc3Nsb2ciPkFjY2VzcyBMb2c8L2E+PC9oMj4KLQotPHRhYmxlIGJvcmRlcj0xPjx0cj48dGQgdmFsaWduPSJ0b3AiPgotPHN0cm9uZz5SZWxhdGVkIE1vZHVsZXM8L3N0cm9uZz48YnI+PGJyPgotCi08YSBocmVmPSJtb2QvbW9kX2xvZ19jb25maWcuaHRtbCI+bW9kX2xvZ19jb25maWc8L2E+PGJyPgotCi08L3RkPjx0ZCB2YWxpZ249InRvcCI+Ci08c3Ryb25nPlJlbGF0ZWQgRGlyZWN0aXZlczwvc3Ryb25nPjxicj48YnI+Ci0KLTxhIGhyZWY9Im1vZC9tb2RfbG9nX2NvbmZpZy5odG1sI2N1c3RvbWxvZyI+Q3VzdG9tTG9nPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9tb2RfbG9nX2NvbmZpZy5odG1sI2xvZ2Zvcm1hdCI+TG9nRm9ybWF0PC9hPjxicj4KLTxhIGhyZWY9Im1vZC9tb2Rfc2V0ZW52aWYuaHRtbCNzZXRlbnZpZiI+U2V0RW52SWY8L2E+Ci0KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD5UaGUgc2VydmVyIGFjY2VzcyBsb2cgcmVjb3JkcyBhbGwgcmVxdWVzdHMgcHJvY2Vzc2VkIGJ5IHRoZSBzZXJ2ZXIuCi1UaGUgbG9jYXRpb24gb2YgdGhlIGFjY2VzcyBsb2cgYXMgd2VsbCBhcyBpdHMgY29udGVudHMgYXJlIGNvbnRyb2xsZWQKLWJ5IHRoZSA8YSBocmVmPSJtb2QvbW9kX2xvZ19jb25maWcuaHRtbCNjdXN0b21sb2ciPkN1c3RvbUxvZzwvYT4KLWRpcmVjdGl2ZS4gIFRoZSA8YQotaHJlZj0ibW9kL21vZF9sb2dfY29uZmlnLmh0bWwjbG9nZm9ybWF0Ij5Mb2dGb3JtYXQ8L2E+IGRpcmVjdGl2ZSBjYW4KLWJlIHVzZWQgdG8gc2ltcGxpZnkgdGhlIHNlbGVjdGlvbiBvZiB0aGUgY29udGVudHMgb2YgdGhlIGxvZ3MuCi1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGhvdyB0byBjb25maWd1cmUgdGhlIHNlcnZlciB0byByZWNvcmQKLWluZm9ybWF0aW9uIGluIHRoZSBhY2Nlc3MgbG9nLjwvcD4KLQotPHA+T2YgY291cnNlLCBzdG9yaW5nIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgYWNjZXNzIGxvZyBpcyBvbmx5IHRoZQotc3RhcnQgb2YgbG9nIG1hbmFnZW1lbnQuICBUaGUgbmV4dCBzdGVwIGlzIHRvIGFuYWx5emUgdGhpcyBpbmZvcm1hdGlvbgotdG8gcHJvZHVjZSB1c2VmdWwgc3RhdGlzdGljcy4gIExvZyBhbmFseXNpcyBpbiBnZW5lcmFsIGlzIGJleW9uZCB0aGUKLXNjb3BlIG9mIHRoaXMgZG9jdW1lbnQsIGFuZCBub3QgcmVhbGx5IHBhcnQgb2YgdGhlIGpvYiBvZiB0aGUKLXdlYiBzZXJ2ZXIgaXRzZWxmLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0b3BpYywgYW5kIGZvcgotYXBwbGljYXRpb25zIHdoaWNoIHBlcmZvcm0gbG9nIGFuYWx5c2lzLCBjaGVjayB0aGUgPGEKLWhyZWY9Imh0dHA6Ly9kbW96Lm9yZy9Db21wdXRlcnMvU29mdHdhcmUvSW50ZXJuZXQvU2l0ZV9NYW5hZ2VtZW50L0xvZ19hbmFseXNpcy8iCi0+T3BlbiBEaXJlY3Rvcnk8L2E+IG9yIDxhCi1ocmVmPSJodHRwOi8vZGlyLnlhaG9vLmNvbS9Db21wdXRlcnNfYW5kX0ludGVybmV0L1NvZnR3YXJlL0ludGVybmV0L1dvcmxkX1dpZGVfV2ViL1NlcnZlcnMvTG9nX0FuYWx5c2lzX1Rvb2xzLyIKLT5ZYWhvbzwvYT4uPC9wPgotCi08cD5WYXJpb3VzIHZlcnNpb25zIG9mIEFwYWNoZSBIVFRQRCBoYXZlIHVzZWQgb3RoZXIgbW9kdWxlcyBhbmQKLWRpcmVjdGl2ZXMgdG8gY29udHJvbCBhY2Nlc3MgbG9nZ2luZywgaW5jbHVkaW5nIG1vZF9sb2dfcmVmZXJlciwKLW1vZF9sb2dfYWdlbnQsIGFuZCB0aGUgPGNvZGU+VHJhbnNmZXJMb2c8L2NvZGU+IGRpcmVjdGl2ZS4gIFRoZQotPGNvZGU+Q3VzdG9tTG9nPC9jb2RlPiBkaXJlY3RpdmUgbm93IHN1YnN1bWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFsbAotdGhlIG9sZGVyIGRpcmVjdGl2ZXMuPC9wPgotCi08cD5UaGUgZm9ybWF0IG9mIHRoZSBhY2Nlc3MgbG9nIGlzIGhpZ2hseSBjb25maWd1cmFibGUuICBUaGUgZm9ybWF0IGlzCi1zcGVjaWZpZWQgdXNpbmcgYSA8YSBocmVmPSJtb2QvbW9kX2xvZ19jb25maWcuaHRtbCNmb3JtYXQiPmZvcm1hdAotc3RyaW5nPC9hPiB0aGF0IGxvb2tzIG11Y2ggbGlrZSBhIEMtc3R5bGUgcHJpbnRmKDEpIGZvcm1hdCBzdHJpbmcuCi1Tb21lIGV4YW1wbGVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlIG5leHQgc2VjdGlvbnMuICBGb3IgYSBjb21wbGV0ZSBsaXN0Ci1vZiB0aGUgcG9zc2libGUgY29udGVudHMgb2YgdGhlIGZvcm1hdCBzdHJpbmcsIHNlZSB0aGUgPGEKLWhyZWY9Im1vZC9tb2RfbG9nX2NvbmZpZy5odG1sIj5tb2RfbG9nX2NvbmZpZyBkb2N1bWVudGF0aW9uPC9hPi48L3A+Ci0KLTxoMz48YSBuYW1lPSJjb21tb24iPkNvbW1vbiBMb2cgRm9ybWF0PC9hPjwvaDM+Ci0KLTxwPkEgdHlwaWNhbCBjb25maWd1cmF0aW9uIGZvciB0aGUgYWNjZXNzIGxvZyBtaWdodCBsb29rCi1hcyBmb2xsb3dzLjwvcD4KLQotPGJsb2NrcXVvdGU+PGNvZGU+Ci1Mb2dGb3JtYXQgIiVoICVsICV1ICV0IFwiJXJcIiAlPnMgJWIiIGNvbW1vbjxicj4KLUN1c3RvbUxvZyBsb2dzL2FjY2Vzc19sb2cgY29tbW9uCi08L2NvZGU+PC9ibG9ja3F1b3RlPgotCi08cD5UaGlzIGRlZmluZXMgdGhlIDxlbT5uaWNrbmFtZTwvZW0+IDxjb2RlPmNvbW1vbjwvY29kZT4gYW5kCi1hc3NvY2lhdGVzIGl0IHdpdGggYSBwYXJ0aWN1bGFyIGxvZyBmb3JtYXQgc3RyaW5nLiAgVGhlIGZvcm1hdCBzdHJpbmcKLWNvbnNpc3RzIG9mIHBlcmNlbnQgZGlyZWN0aXZlcywgZWFjaCBvZiB3aGljaCB0ZWxsIHRoZSBzZXJ2ZXIgdG8gbG9nIGEKLXBhcnRpY3VsYXIgcGllY2Ugb2YgaW5mb3JtYXRpb24uICBMaXRlcmFsIGNoYXJhY3RlcnMgbWF5IGFsc28gYmUKLXBsYWNlZCBpbiB0aGUgZm9ybWF0IHN0cmluZyBhbmQgd2lsbCBiZSBjb3BpZWQgZGlyZWN0bHkgaW50byB0aGUgbG9nCi1vdXRwdXQuICBUaGUgcXVvdGUgY2hhcmFjdGVyICg8Y29kZT4iPC9jb2RlPikgbXVzdCBiZSBlc2NhcGVkIGJ5Ci1wbGFjaW5nIGEgYmFjay1zbGFzaCBiZWZvcmUgaXQgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIGludGVycHJldGVkIGFzCi10aGUgZW5kIG9mIHRoZSBmb3JtYXQgc3RyaW5nLiAgVGhlIGZvcm1hdCBzdHJpbmcgbWF5IGFsc28gY29udGFpbiB0aGUKLXNwZWNpYWwgY29udHJvbCBjaGFyYWN0ZXJzICI8Y29kZT5cbjwvY29kZT4iIGZvciBuZXctbGluZSBhbmQKLSI8Y29kZT5cdDwvY29kZT4iIGZvciB0YWIuPC9wPgotCi08cD5UaGUgPGNvZGU+Q3VzdG9tTG9nPC9jb2RlPiBkaXJlY3RpdmUgc2V0cyB1cCBhIG5ldyBsb2cgZmlsZSB1c2luZwotdGhlIGRlZmluZWQgPGVtPm5pY2tuYW1lPC9lbT4uICBUaGUgZmlsZW5hbWUgZm9yIHRoZSBhY2Nlc3MgbG9nIGlzCi1yZWxhdGl2ZSB0byB0aGUgPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNzZXJ2ZXJyb290Ij5TZXJ2ZXJSb290PC9hPgotdW5sZXNzIGl0IGJlZ2lucyB3aXRoIGEgc2xhc2guPC9wPgotCi08cD5UaGUgYWJvdmUgY29uZmlndXJhdGlvbiB3aWxsIHdyaXRlIGxvZyBlbnRyaWVzIGluIGEgZm9ybWF0IGtub3duIGFzCi10aGUgQ29tbW9uIExvZyBGb3JtYXQgKENMRikuICBUaGlzIHN0YW5kYXJkIGZvcm1hdCBjYW4gYmUgcHJvZHVjZWQgYnkKLW1hbnkgZGlmZmVyZW50IHdlYiBzZXJ2ZXJzIGFuZCByZWFkIGJ5IG1hbnkgbG9nIGFuYWx5c2lzIHByb2dyYW1zLgotVGhlIGxvZyBmaWxlIGVudHJpZXMgcHJvZHVjZWQgaW4gQ0xGIHdpbGwgbG9vayBzb21ldGhpbmcgbGlrZQotdGhpczo8L3A+Ci0KLTxibG9ja3F1b3RlPjxjb2RlPgotMTI3LjAuMC4xIC0gZnJhbmsgWzEwL09jdC8yMDAwOjEzOjU1OjM2IC0wNzAwXSAiR0VUIC9hcGFjaGVfcGIuZ2lmIEhUVFAvMS4wIiAyMDAgMjMyNgotPC9jb2RlPjwvYmxvY2txdW90ZT4KLQotPHA+RWFjaCBwYXJ0IG9mIHRoaXMgbG9nIGVudHJ5IGlzIGRlc2NyaWJlZCBiZWxvdy48L3A+Ci0KLTxkbD4KLTxkdD48Y29kZT4xMjcuMC4wLjE8L2NvZGU+ICg8Y29kZT4laDwvY29kZT4pPC9kdD4gPGRkPlRoaXMgaXMgdGhlIElQCi1hZGRyZXNzIG9mIHRoZSBjbGllbnQgKHJlbW90ZSBob3N0KSB3aGljaCBtYWRlIHRoZSByZXF1ZXN0IHRvIHRoZQotc2VydmVyLiAgSWYgPGEKLWhyZWY9Im1vZC9jb3JlLmh0bWwjaG9zdG5hbWVsb29rdXBzIj5Ib3N0TmFtZUxvb2t1cHM8L2E+IGlzIHNldCB0bwotPGNvZGU+T248L2NvZGU+LCB0aGVuIHRoZSBzZXJ2ZXIgd2lsbCB0cnkgdG8gZGV0ZXJtaW5lIHRoZSBob3N0bmFtZQotYW5kIGxvZyBpdCBpbiBwbGFjZSBvZiB0aGUgSVAgYWRkcmVzcy4gIEhvd2V2ZXIsIHRoaXMgY29uZmlndXJhdGlvbiBpcwotbm90IHJlY29tbWVuZGVkIHNpbmNlIGl0IGNhbiBzaWduaWZpY2FudGx5IHNsb3cgdGhlIHNlcnZlci4gIEluc3RlYWQsCi1pdCBpcyBiZXN0IHRvIHVzZSBhIGxvZyBwb3N0LXByb2Nlc3NvciBzdWNoIGFzIDxhCi1ocmVmPSJwcm9ncmFtcy9sb2dyZXNvbHZlLmh0bWwiPmxvZ3Jlc29sdmU8L2E+IHRvIGRldGVybWluZSB0aGUKLWhvc3RuYW1lcy4gIFRoZSBJUCBhZGRyZXNzIHJlcG9ydGVkIGhlcmUgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZQotYWRkcmVzcyBvZiB0aGUgbWFjaGluZSBhdCB3aGljaCB0aGUgdXNlciBpcyBzaXR0aW5nLiAgSWYgYSBwcm94eQotc2VydmVyIGV4aXN0cyBiZXR3ZWVuIHRoZSB1c2VyIGFuZCB0aGUgc2VydmVyLCB0aGlzIGFkZHJlc3Mgd2lsbCBiZQotdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3h5LCByYXRoZXIgdGhhbiB0aGUgb3JpZ2luYXRpbmcgbWFjaGluZS48L2RkPgotCi08ZHQ+PGNvZGU+LTwvY29kZT4gKDxjb2RlPiVsPC9jb2RlPik8L2R0PiA8ZGQ+VGhlICJoeXBoZW4iIGluIHRoZQotb3V0cHV0IGluZGljYXRlcyB0aGF0IHRoZSByZXF1ZXN0ZWQgcGllY2Ugb2YgaW5mb3JtYXRpb24gaXMgbm90Ci1hdmFpbGFibGUuICBJbiB0aGlzIGNhc2UsIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGlzIG5vdCBhdmFpbGFibGUgaXMgdGhlCi1SRkMgMTQxMyBpZGVudGl0eSBvZiB0aGUgY2xpZW50IGRldGVybWluZWQgYnkgPGNvZGU+aWRlbnRkPC9jb2RlPiBvbgotdGhlIGNsaWVudHMgbWFjaGluZS4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaGlnaGx5IHVucmVsaWFibGUgYW5kIHNob3VsZAotYWxtb3N0IG5ldmVyIGJlIHVzZWQgZXhjZXB0IG9uIHRpZ2h0bHkgY29udHJvbGxlZCBpbnRlcm5hbCBuZXR3b3Jrcy4KLUFwYWNoZSBIVFRQRCB3aWxsIG5vdCBldmVuIGF0dGVtcHQgdG8gZGV0ZXJtaW5lIHRoaXMgaW5mb3JtYXRpb24KLXVubGVzcyA8YSBocmVmPSJtb2QvY29yZS5odG1sI2lkZW50aXR5Y2hlY2siPklkZW50aXR5Q2hlY2s8L2E+IGlzIHNldAotdG8gPGNvZGU+T248L2NvZGU+LjwvZGQ+Ci0KLTxkdD48Y29kZT5mcmFuazwvY29kZT4gKDxjb2RlPiV1PC9jb2RlPik8L2R0PiA8ZGQ+VGhpcyBpcyB0aGUgdXNlcmlkCi1vZiB0aGUgcGVyc29uIHJlcXVlc3RpbmcgdGhlIGRvY3VtZW50IGFzIGRldGVybWluZWQgYnkgSFRUUAotYXV0aGVudGljYXRpb24uICBUaGUgc2FtZSB2YWx1ZSBpcyB0eXBpY2FsbHkgcHJvdmlkZWQgdG8gQ0dJIHNjcmlwdHMKLWluIHRoZSA8Y29kZT5SRU1PVEVfVVNFUjwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUuICBJZiB0aGUgc3RhdHVzCi1jb2RlIGZvciB0aGUgcmVxdWVzdCAoc2VlIGJlbG93KSBpcyA0MDEsIHRoZW4gdGhpcyB2YWx1ZSBzaG91bGQgbm90IGJlCi10cnVzdGVkIGJlY2F1c2UgdGhlIHVzZXIgaXMgbm90IHlldCBhdXRoZW50aWNhdGVkLiAgSWYgdGhlIGRvY3VtZW50IGlzCi1ub3QgcGFzc3dvcmQgcHJvdGVjdGVkLCB0aGlzIGVudHJ5IHdpbGwgYmUgIjxjb2RlPi08L2NvZGU+IiBqdXN0IGxpa2UKLXRoZSBwcmV2aW91cyBvbmUuPC9kZD4KLQotPGR0Pjxjb2RlPlsxMC9PY3QvMjAwMDoxMzo1NTozNiAtMDcwMF08L2NvZGU+ICg8Y29kZT4ldDwvY29kZT4pPC9kdD4KLTxkZD5UaGUgdGltZSB0aGF0IHRoZSBzZXJ2ZXIgZmluaXNoZWQgcHJvY2Vzc2luZyB0aGUgcmVxdWVzdC4gIFRoZQotZm9ybWF0IGlzOgotPEJMT0NLUVVPVEU+PENPREU+IFtkYXkvbW9udGgveWVhcjpob3VyOm1pbnV0ZTpzZWNvbmQgem9uZV0gPEJSPgotZGF5ID0gMipkaWdpdDxCUj4KLW1vbnRoID0gMypsZXR0ZXI8QlI+Ci15ZWFyID0gNCpkaWdpdDxCUj4KLWhvdXIgPSAyKmRpZ2l0PEJSPgotbWludXRlID0gMipkaWdpdDxCUj4KLXNlY29uZCA9IDIqZGlnaXQ8QlI+Ci16b25lID0gKGArJyB8IGAtJykgNCpkaWdpdDwvQ09ERT48L0JMT0NLUVVPVEU+Ci1JdCBpcyBwb3NzaWJsZSB0byBoYXZlIHRoZSB0aW1lIGRpc3BsYXllZCBpbiBhbm90aGVyIGZvcm1hdAotYnkgc3BlY2lmeWluZyA8Y29kZT4le2Zvcm1hdH10PC9jb2RlPiBpbiB0aGUgbG9nIGZvcm1hdCBzdHJpbmcsIHdoZXJlCi08Y29kZT5mb3JtYXQ8L2NvZGU+IGlzIGFzIGluIDxjb2RlPnN0cmZ0aW1lKDMpPC9jb2RlPiBmcm9tIHRoZSBDIAotc3RhbmRhcmQgbGlicmFyeS4KLTwvZGQ+Ci0KLTxkdD48Y29kZT4iR0VUIC9hcGFjaGVfcGIuZ2lmIEhUVFAvMS4wIjwvY29kZT4KLSg8Y29kZT5cIiVyXCI8L2NvZGU+KTwvZHQ+IDxkZD5UaGUgcmVxdWVzdCBsaW5lIGZyb20gdGhlIGNsaWVudCBpcwotZ2l2ZW4gaW4gZG91YmxlIHF1b3Rlcy4gIFRoZSByZXF1ZXN0IGxpbmUgY29udGFpbnMgYSBncmVhdCBkZWFsIG9mCi11c2VmdWwgaW5mb3JtYXRpb24uICBGaXJzdCwgdGhlIG1ldGhvZCB1c2VkIGJ5IHRoZSBjbGllbnQgaXMKLTxjb2RlPkdFVDwvY29kZT4uICBTZWNvbmQsIHRoZSBjbGllbnQgcmVxdWVzdGVkIHRoZSByZXNvdXJjZQotPGNvZGU+L2FwYWNoZV9wYi5naWY8L2NvZGU+LCBhbmQgdGhpcmQsIHRoZSBjbGllbnQgdXNlZCB0aGUgcHJvdG9jb2wKLTxjb2RlPkhUVFAvMS4wPC9jb2RlPi48L2RkPiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGxvZyBvbmUgb3IgbW9yZQotcGFydHMgb2YgdGhlIHJlcXVlc3QgbGluZSBpbmRlcGVuZGVudGx5LiAgRm9yIGV4YW1wbGUsIHRoZSBmb3JtYXQKLXN0cmluZyAiPGNvZGU+JW0gJVUlcSAlSDwvY29kZT4iIHdpbGwgbG9nIHRoZSBtZXRob2QsIHBhdGgsCi1xdWVyeS1zdHJpbmcsIGFuZCBwcm90b2NvbCwgcmVzdWx0aW5nIGluIGV4YWN0bHkgdGhlIHNhbWUgb3V0cHV0IGFzCi0iPGNvZGU+JXI8L2NvZGU+Ii48L2RkPgotCi08ZHQ+PGNvZGU+MjAwPC9jb2RlPjwvZHQ+ICg8Y29kZT4lPnM8L2NvZGU+KSA8ZGQ+VGhpcyBpcyB0aGUgc3RhdHVzCi1jb2RlIHRoYXQgdGhlIHNlcnZlciBzZW5kcyBiYWNrIHRvIHRoZSBjbGllbnQuICBUaGlzIGluZm9ybWF0aW9uIGlzCi12ZXJ5IHZhbHVhYmxlLCBiZWNhdXNlIGl0IHJldmVhbHMgd2hldGhlciB0aGUgcmVxdWVzdCByZXN1bHRlZCBpbiBhCi1zdWNjZXNzZnVsIHJlc3BvbnNlIChjb2RlcyBiZWdpbm5pbmcgaW4gMiksIGEgcmVkaXJlY3Rpb24gKGNvZGVzCi1iZWdpbm5pbmcgaW4gMyksIGFuIGVycm9yIGNhdXNlZCBieSB0aGUgY2xpZW50IChjb2RlcyBiZWdpbm5pbmcgaW4gNCksCi1vciBhbiBlcnJvciBpbiB0aGUgc2VydmVyIChjb2RlcyBiZWdpbm5pbmcgaW4gNSkuIAotVGhlIGZ1bGwgbGlzdCBvZiBwb3NzaWJsZSBzdGF0dXMgY29kZXMgY2FuIGJlCi1mb3VuZCBpbiB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi50eHQiCi0+SFRUUCBzcGVjaWZpY2F0aW9uPC9hPiAoUkZDMjYxNiBzZWN0aW9uIDEwKS48L2RkPgotCi08ZHQ+PGNvZGU+MjMyNjwvY29kZT4gKDxjb2RlPiViPC9jb2RlPikKLTxkZD5UaGUgbGFzdCBlbnRyeSBpbmRpY2F0ZXMgdGhlIHNpemUgb2YgdGhlIG9iamVjdCByZXR1cm5lZCB0bwotdGhlIGNsaWVudCwgbm90IGluY2x1ZGluZyB0aGUgcmVzcG9uc2UgaGVhZGVycy4gIElmIG5vIGNvbnRlbnQKLXdhcyByZXR1cm5lZCB0byB0aGUgY2xpZW50LCB0aGlzIHZhbHVlIHdpbGwgYmUgIjxjb2RlPi08L2NvZGU+Ii4KLVRvIGxvZyAiPGNvZGU+MDwvY29kZT4iIGZvciBubyBjb250ZW50LCB1c2UgPGNvZGU+JUI8L2NvZGU+Ci1pbnN0ZWFkLjwvZGQ+Ci0KLTwvZGw+Ci0KLTxoND48YSBuYW1lPSJjb21iaW5lZCI+Q29tYmluZWQgTG9nIEZvcm1hdDwvYT48L2g0PgotCi08cD5Bbm90aGVyIGNvbW1vbmx5IHVzZWQgZm9ybWF0IHN0cmluZyBpcyBjYWxsZWQgdGhlCi1Db21iaW5lZCBMb2cgRm9ybWF0LiAgSXQgY2FuIGJlIHVzZWQgYXMgZm9sbG93cy48L3A+Ci0KLTxibG9ja3F1b3RlPjxjb2RlPgotTG9nRm9ybWF0ICIlaCAlbCAldSAldCBcIiVyXCIgJSZndDtzICViIFwiJXtSZWZlcmVyfWlcIiBcIiV7VXNlci1hZ2VudH1pXCIiIGNvbWJpbmVkPGJyPgotQ3VzdG9tTG9nIGxvZy9hY2Nlc19sb2cgY29tYmluZWQKLTwvY29kZT48L2Jsb2NrcXVvdGU+Ci0KLTxwPlRoaXMgZm9ybWF0IGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIENvbW1vbiBMb2cgRm9ybWF0LAotd2l0aCB0aGUgYWRkaXRpb24gb2YgdHdvIG1vcmUgZmllbGRzLiAgVGhlIGFjY2VzcyBsb2cgdW5kZXIgdGhpcwotZm9ybWF0IHdpbGwgbG9vayBsaWtlOjwvcD4KLQotPGJsb2NrcXVvdGU+PGNvZGU+Ci0xMjcuMC4wLjEgLSBmcmFuayBbMTAvT2N0LzIwMDA6MTM6NTU6MzYgLTA3MDBdICJHRVQgL2FwYWNoZV9wYi5naWYgSFRUUC8xLjAiIDIwMCAyMzI2ICJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3N0YXJ0Lmh0bWwiICJNb3ppbGxhLzQuMDggW2VuXSAoV2luOTg7IEkgO05hdikiCi08L2NvZGU+PC9ibG9ja3F1b3RlPgotCi08cD5UaGUgYWRkaXRpb25hbCBmaWVsZHMgYXJlOjwvcD4KLQotPGRsPgotCi08ZHQ+PGNvZGU+Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vc3RhcnQuaHRtbCI8L2NvZGU+Ci0oPGNvZGU+XCIle1JlZmVyZXJ9aVwiPC9jb2RlPik8L2R0PiA8ZGQ+VGhlICJSZWZlcmVyIiAoc2ljKSBIVFRQCi1yZXF1ZXN0IGhlYWRlci4gIFRoaXMgZ2l2ZXMgdGhlIHNpdGUgdGhhdCB0aGUgY2xpZW50IHJlcG9ydHMgaGF2aW5nCi1iZWVuIHJlZmVycmVkIGZyb20uICAoVGhpcyBzaG91bGQgYmUgdGhlIHBhZ2UgdGhhdCBsaW5rcyB0byBvciBpbmNsdWRlcwotPGNvZGU+L2FwYWNoZV9wYi5naWY8L2NvZGU+KS4KLQotPGR0Pjxjb2RlPiJNb3ppbGxhLzQuMDggW2VuXSAoV2luOTg7IEkgO05hdikiPC9jb2RlPgotKDxjb2RlPlwiJXtVc2VyLWFnZW50fWlcIjwvY29kZT4pPC9kdD4gPGRkPlRoZSBVc2VyLUFnZW50IEhUVFAgcmVxdWVzdAotaGVhZGVyLiAgVGhpcyBpcyB0aGUgaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gdGhhdCB0aGUgY2xpZW50IGJyb3dzZXIKLXJlcG9ydHMgYWJvdXQgaXRzZWxmLjwvZGQ+Ci0KLTwvZGw+Ci0KLTxoMz48YSBuYW1lPSJtdWx0aXBsZSI+TXVsdGlwbGUgQWNjZXNzIExvZ3M8L2E+PC9oMz4KLQotPHA+TXVsdGlwbGUgYWNjZXNzIGxvZ3MgY2FuIGJlIGNyZWF0ZWQgc2ltcGx5IGJ5IHNwZWNpZnlpbmcgbXVsdGlwbGUKLTxjb2RlPkN1c3RvbUxvZzwvY29kZT4gZGlyZWN0aXZlcyBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiAgRm9yCi1leGFtcGxlLCB0aGUgZm9sbG93aW5nIGRpcmVjdGl2ZXMgd2lsbCBjcmVhdGUgdGhyZWUgYWNjZXNzIGxvZ3MuICBUaGUKLWZpcnN0IGNvbnRhaW5zIHRoZSBiYXNpYyBDTEYgaW5mb3JtYXRpb24sIHdoaWxlIHRoZSBzZWNvbmQgYW5kIHRoaXJkCi1jb250YWluIHJlZmVyZXIgYW5kIGJyb3dzZXIgaW5mb3JtYXRpb24uICBUaGUgbGFzdCB0d28KLTxjb2RlPkN1c3RvbUxvZzwvY29kZT4gbGluZXMgc2hvdyBob3cgdG8gbWltaWMgdGhlIGVmZmVjdHMgb2YgdGhlCi08Y29kZT5SZWZlckxvZzwvY29kZT4gYW5kIDxjb2RlPkFnZW50TG9nPC9jb2RlPiBkaXJlY3RpdmVzLjwvcD4KLQotPGJsb2NrcXVvdGU+PGNvZGU+Ci1Mb2dGb3JtYXQgIiVoICVsICV1ICV0IFwiJXJcIiAlPnMgJWIiIGNvbW1vbjxicj4KLUN1c3RvbUxvZyBsb2dzL2FjY2Vzc19sb2cgY29tbW9uPGJyPgotQ3VzdG9tTG9nIGxvZ3MvcmVmZXJlcl9sb2cgIiV7UmVmZXJlcn1pIC0+ICVVIjxicj4KLUN1c3RvbUxvZyBsb2dzL2FnZW50X2xvZyAiJXtVc2VyLWFnZW50fWkiCi08L2NvZGU+PC9ibG9ja3F1b3RlPgotCi08cD5UaGlzIGV4YW1wbGUgYWxzbyBzaG93cyB0aGF0IGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZGVmaW5lIGEKLW5pY2tuYW1lIHdpdGggdGhlIDxjb2RlPkxvZ0Zvcm1hdDwvY29kZT4gZGlyZWN0aXZlLiAgSW5zdGVhZCwgdGhlIGxvZwotZm9ybWF0IGNhbiBiZSBzcGVjaWZpZWQgZGlyZWN0bHkgaW4gdGhlIDxjb2RlPkN1c3RvbUxvZzwvY29kZT4KLWRpcmVjdGl2ZS48L3A+Ci0KLTxoMz48YSBuYW1lPSJjb25kaXRpb25hbCI+Q29uZGl0aW9uYWwgTG9nZ2luZzwvYT48L2gzPgotCi08cD5UaGVyZSBhcmUgdGltZXMgd2hlbiBpdCBpcyBjb252ZW5pZW50IHRvIGV4Y2x1ZGUgY2VydGFpbiBlbnRyaWVzCi1mcm9tIHRoZSBhY2Nlc3MgbG9ncyBiYXNlZCBvbiBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGNsaWVudCByZXF1ZXN0LgotVGhpcyBpcyBlYXNpbHkgYWNjb21wbGlzaGVkIHdpdGggdGhlIGhlbHAgb2YgPGEKLWhyZWY9ImVudi5odG1sIj5lbnZpcm9ubWVudCB2YXJpYWJsZXM8L2E+LiAgRmlyc3QsIGFuIGVudmlyb25tZW50Ci12YXJpYWJsZSBtdXN0IGJlIHNldCB0byBpbmRpY2F0ZSB0aGF0IHRoZSByZXF1ZXN0IG1lZXRzIGNlcnRhaW4KLWNvbmRpdGlvbnMuICBUaGlzIGlzIHVzdWFsbHkgYWNjb21wbGlzaGVkIHdpdGggPGEKLWhyZWY9Im1vZC9tb2Rfc2V0ZW52aWYuaHRtbCNzZXRlbnZpZiI+U2V0RW52SWY8L2E+LiAgVGhlbiB0aGUKLTxjb2RlPmVudj08L2NvZGU+IGNsYXVzZSBvZiB0aGUgPGNvZGU+Q3VzdG9tTG9nPC9jb2RlPiBkaXJlY3RpdmUgaXMKLXVzZWQgdG8gaW5jbHVkZSBvciBleGNsdWRlIHJlcXVlc3RzIHdoZXJlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcwotc2V0LiAgU29tZSBleGFtcGxlczo8L3A+Ci0KLTxibG9ja3F1b3RlPjxjb2RlPgotIyBNYXJrIHJlcXVlc3RzIGZyb20gdGhlIGxvb3AtYmFjayBpbnRlcmZhY2U8YnI+Ci1TZXRFbnZJZiBSZW1vdGVfQWRkciAiMTI3XC4wXC4wXC4xIiBkb250bG9nPGJyPgotIyBNYXJrIHJlcXVlc3RzIGZvciB0aGUgcm9ib3RzLnR4dCBmaWxlPGJyPgotU2V0RW52SWYgUmVxdWVzdF9VUkkgIl4vcm9ib3RzXC50eHQkIiBkb250bG9nPGJyPgotIyBMb2cgd2hhdCByZW1haW5zPGJyPgotQ3VzdG9tTG9nIGxvZ3MvYWNjZXNzX2xvZyBjb21tb24gZW52PSFkb250bG9nCi08L2NvZGU+PC9ibG9ja3F1b3RlPgotCi08cD5BcyBhbm90aGVyIGV4YW1wbGUsIGNvbnNpZGVyIGxvZ2dpbmcgcmVxdWVzdHMgZnJvbSBlbmdsaXNoLXNwZWFrZXJzCi10byBvbmUgbG9nIGZpbGUsIGFuZCBub24tZW5nbGlzaCBzcGVha2VycyB0byBhIGRpZmZlcmVudCBsb2cgZmlsZS48L3A+Ci0KLTxibG9ja3F1b3RlPjxjb2RlPgotU2V0RW52SWYgQWNjZXB0LUxhbmd1YWdlICJlbiIgZW5nbGlzaDxicj4KLUN1c3RvbUxvZyBsb2dzL2VuZ2xpc2hfbG9nIGNvbW1vbiBlbnY9ZW5nbGlzaDxicj4KLUN1c3RvbUxvZyBsb2dzL25vbl9lbmdsaXNoX2xvZyBjb21tb24gZW52PSFlbmdsaXNoCi08L2NvZGU+PC9ibG9ja3F1b3RlPgotCi08cD5BbHRob3VnaCB3ZSBoYXZlIGp1c3Qgc2hvd24gdGhhdCBjb25kaXRpb25hbCBsb2dnaW5nIGlzIHZlcnkKLXBvd2VyZnVsIGFuZCBmbGV4aWJseSwgaXQgaXMgbm90IHRoZSBvbmx5IHdheSB0byBjb250cm9sIHRoZSBjb250ZW50cwotb2YgdGhlIGxvZ3MuICBMb2cgZmlsZXMgYXJlIG1vcmUgdXNlZnVsIHdoZW4gdGhleSBjb250YWluIGEgY29tcGxldGUKLXJlY29yZCBvZiBzZXJ2ZXIgYWN0aXZpdHkuICBJdCBpcyBvZnRlbiBlYXNpZXIgdG8gc2ltcGx5IHBvc3QtcHJvY2VzcwotdGhlIGxvZyBmaWxlcyB0byByZW1vdmUgcmVxdWVzdHMgdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gY29uc2lkZXIuPC9wPgotCi08aHI+Ci0KLTxoMj48YSBuYW1lPSJyb3RhdGlvbiI+TG9nIFJvdGF0aW9uPC9hPjwvaDI+Ci0KLTxwPk9uIGV2ZW4gYSBtb2RlcmF0ZWx5IGJ1c3kgc2VydmVyLCB0aGUgcXVhbnRpdHkgb2YgaW5mb3JtYXRpb24KLXN0b3JlZCBpbiB0aGUgbG9nIGZpbGVzIGlzIHZlcnkgbGFyZ2UuICBUaGUgYWNjZXNzIGxvZyBmaWxlIHR5cGljYWxseQotZ3Jvd3MgMSBNQiBvciBtb3JlIHBlciAxMCwwMDAgcmVxdWVzdHMuICBJdCB3aWxsIGNvbnNlcXVlbnRseSBiZQotbmVjZXNzYXJ5IHRvIHBlcmlvZGljYWxseSByb3RhdGUgdGhlIGxvZyBmaWxlcyBieSBtb3Zpbmcgb3IgZGVsZXRpbmcKLXRoZSBleGlzdGluZyBsb2dzLiAgVGhpcyBjYW5ub3QgYmUgZG9uZSB3aGlsZSB0aGUgc2VydmVyIGlzIHJ1bm5pbmcsCi1iZWNhdXNlIEFwYWNoZSB3aWxsIGNvbnRpbnVlIHdyaXRpbmcgdG8gdGhlIG9sZCBsb2cgZmlsZSBhcyBsb25nIGFzIGl0Ci1ob2xkcyB0aGUgZmlsZSBvcGVuLiAgSW5zdGVhZCwgdGhlIHNlcnZlciBtdXN0IGJlIDxhCi1ocmVmPSJzdG9wcGluZy5odG1sIj5yZXN0YXJ0ZWQ8L2E+IGFmdGVyIHRoZSBsb2cgZmlsZXMgYXJlIG1vdmVkIG9yCi1kZWxldGVkIHNvIHRoYXQgaXQgd2lsbCBvcGVuIG5ldyBsb2cgZmlsZXMuPC9wPgotCi08cD5CeSB1c2luZyBhIDxlbT5ncmFjZWZ1bDwvZW0+IHJlc3RhcnQsIHRoZSBzZXJ2ZXIgY2FuIGJlIGluc3RydWN0ZWQKLXRvIG9wZW4gbmV3IGxvZyBmaWxlcyB3aXRob3V0IGxvc2luZyBhbnkgZXhpc3Rpbmcgb3IgcGVuZGluZwotY29ubmVjdGlvbnMgZnJvbSBjbGllbnRzLiAgSG93ZXZlciwgaW4gb3JkZXIgdG8gYWNjb21wbGlzaCB0aGlzLCB0aGUKLXNlcnZlciBtdXN0IGNvbnRpbnVlIHRvIHdyaXRlIHRvIHRoZSBvbGQgbG9nIGZpbGVzIHdoaWxlIGl0IGZpbmlzaGVzCi1zZXJ2aW5nIG9sZCByZXF1ZXN0cy4gIEl0IGlzIHRoZXJlZm9yZSBuZWNlc3NhcnkgdG8gd2FpdCBmb3Igc29tZSB0aW1lCi1hZnRlciB0aGUgcmVzdGFydCBiZWZvcmUgZG9pbmcgYW55IHByb2Nlc3Npbmcgb24gdGhlIGxvZyBmaWxlcy4gIEEKLXR5cGljYWwgc2NlbmFyaW8gdGhhdCBzaW1wbHkgcm90YXRlcyB0aGUgbG9ncyBhbmQgY29tcHJlc3NlcyB0aGUgb2xkCi1sb2dzIHRvIHNhdmUgc3BhY2UgaXM6PC9wPgotCi08YmxvY2txdW90ZT48Y29kZT4KLW12IGFjY2Vzc19sb2cgYWNjZXNzX2xvZy5vbGQ8YnI+Ci1tdiBlcnJvcl9sb2cgZXJyb3JfbG9nLm9sZDxicj4KLWFwYWNoZWN0bCBncmFjZWZ1bDxicj4KLXNsZWVwIDYwMDxicj4KLWd6aXAgYWNjZXNzX2xvZy5vbGQgZXJyb3JfbG9nLm9sZAotPC9jb2RlPjwvYmxvY2txdW90ZT4KLQotPHA+QW5vdGhlciB3YXkgdG8gcGVyZm9ybSBsb2cgcm90YXRpb24gaXMgdXNpbmcgPGEgaHJlZj0iI3BpcGVkIj5waXBlZAotbG9nczwvYT4gYXMgZGlzY3Vzc2VkIGluIHRoZSBuZXh0IHNlY3Rpb24uPC9wPgotCi08aHI+Ci0KLTxoMj48YSBuYW1lPSJwaXBlZCI+UGlwZWQgTG9nczwvYT48L2gyPgotCi08cD5BcGFjaGUgSFRUUEQgaXMgY2FwYWJsZSBvZiB3cml0aW5nIGVycm9yIGFuZCBhY2Nlc3MgbG9nIGZpbGVzCi10aHJvdWdoIGEgcGlwZSB0byBhbm90aGVyIHByb2Nlc3MsIHJhdGhlciB0aGFuIGRpcmVjdGx5IHRvIGEgZmlsZS4KLVRoaXMgY2FwYWJpbGl0eSBkcmFtYXRpY2FsbHkgaW5jcmVhc2VzIHRoZSBmbGV4aWJpbGl0eSBvZiBsb2dnaW5nLAotd2l0aG91dCBhZGRpbmcgY29kZSB0byB0aGUgbWFpbiBzZXJ2ZXIuICBJbiBvcmRlciB0byB3cml0ZSBsb2dzIHRvIGEKLXBpcGUsIHNpbXBseSByZXBsYWNlIHRoZSBmaWxlbmFtZSB3aXRoIHRoZSBwaXBlIGNoYXJhY3RlcgotIjxjb2RlPnw8L2NvZGU+IiwgZm9sbG93ZWQgYnkgdGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgd2hpY2ggc2hvdWxkCi1hY2NlcHQgbG9nIGVudHJpZXMgb24gaXRzIHN0YW5kYXJkIGlucHV0LiAgQXBhY2hlIHdpbGwgc3RhcnQgdGhlCi1waXBlZC1sb2cgcHJvY2VzcyB3aGVuIHRoZSBzZXJ2ZXIgc3RhcnRzLCBhbmQgd2lsbCByZXN0YXJ0IGl0IGlmIGl0Ci1jcmFzaGVzIHdoaWxlIHRoZSBzZXJ2ZXIgaXMgcnVubmluZy4gIChUaGlzIGxhc3QgZmVhdHVyZSBpcyB3aHkgd2UgY2FuCi1yZWZlciB0byB0aGlzIHRlY2huaXF1ZSBhcyAicmVsaWFibGUgcGlwZWQgbG9nZ2luZyIuKTwvcD4KLQotPHA+UGlwZWQgbG9nIHByb2Nlc3NlcyBhcmUgc3Bhd25lZCBieSB0aGUgcGFyZW50IEFwYWNoZSBIVFRQRCBwcm9jZXNzLAotYW5kIGluaGVyaXQgdGhlIHVzZXJpZCBvZiB0aGF0IHByb2Nlc3MuICBUaGlzIG1lYW5zIHRoYXQgcGlwZWQgbG9nCi1wcm9ncmFtcyB1c3VhbGx5IHJ1biBhcyByb290LiAgSXQgaXMgdGhlcmVmb3JlIHZlcnkgaW1wb3J0YW50IHRvIGtlZXAKLXRoZSBwcm9ncmFtcyBzaW1wbGUgYW5kIHNlY3VyZS48L3A+Ci0KLTxwPlNvbWUgc2ltcGxlIGV4YW1wbGVzIHVzaW5nIHBpcGVkIGxvZ3M6PC9wPgotCi08YmxvY2txdW90ZT48Y29kZT4KLSMgY29tcHJlc3NlZCBsb2dzPGJyPgotQ3VzdG9tTG9nICJ8L3Vzci9iaW4vZ3ppcCAtYyA+PiAvdmFyL2xvZy9hY2Nlc3NfbG9nLmd6IiBjb21tb248YnI+Ci0jIGFsbW9zdC1yZWFsLXRpbWUgbmFtZSByZXNvbHV0aW9uPGJyPgotQ3VzdG9tTG9nICJ8L3Vzci9sb2NhbC9hcGFjaGUvYmluL2xvZ3Jlc29sdmUgPj4gL3Zhci9sb2cvYWNjZXNzX2xvZyIgY29tbW9uCi08L2NvZGU+PC9ibG9ja3F1b3RlPgotCi08cD5Ob3RpY2UgdGhhdCBxdW90ZXMgYXJlIHVzZWQgdG8gZW5jbG9zZSB0aGUgZW50aXJlIGNvbW1hbmQKLXRoYXQgd2lsbCBiZSBjYWxsZWQgZm9yIHRoZSBwaXBlLiAgQWx0aG91Z2ggdGhlc2UgZXhhbXBsZXMgYXJlCi1mb3IgdGhlIGFjY2VzcyBsb2csIHRoZSBzYW1lIHRlY2huaXF1ZSBjYW4gYmUgdXNlZCBmb3IgdGhlCi1lcnJvciBsb2cuPC9wPgotCi08cD5PbmUgaW1wb3J0YW50IHVzZSBvZiBwaXBlZCBsb2dzIGlzIHRvIGFsbG93IGxvZyByb3RhdGlvbiB3aXRob3V0Ci1oYXZpbmcgdG8gcmVzdGFydCB0aGUgc2VydmVyLiAgQXBhY2hlIEhUVFBEIGluY2x1ZGVzIGEgc2ltcGxlIHByb2dyYW0KLWNhbGxlZCA8YSBocmVmPSJwcm9ncmFtcy9yb3RhdGVsb2dzLmh0bWwiPnJvdGF0ZWxvZ3M8L2E+IGZvciB0aGlzCi1wdXJwb3NlLiAgRm9yIGV4YW1wbGUsIHRvIHJvdGF0ZSB0aGUgbG9ncyBldmVyeSAyNCBob3VycywgeW91IGNhbgotdXNlOjwvcD4KLQotPGJsb2NrcXVvdGU+PGNvZGU+Ci1DdXN0b21Mb2cgInwvdXNyL2xvY2FsL2FwYWNoZS9iaW4vcm90YXRlbG9ncyAvdmFyL2xvZy9hY2Nlc3NfbG9nIDg2NDAwIiBjb21tb24KLTwvY29kZT48L2Jsb2NrcXVvdGU+Ci0KLTxwPkEgc2ltaWxhciwgYnV0IG11Y2ggbW9yZSBmbGV4aWJsZSBsb2cgcm90YXRpb24gcHJvZ3JhbQotY2FsbGVkIDxhIGhyZWY9Imh0dHA6Ly93d3cuZm9yZC1tYXNvbi5jby51ay9yZXNvdXJjZXMvY3Jvbm9sb2cvIj5jcm9ub2xvZzwvYT4KLWlzIGF2YWlsYWJsZSBhdCBhbiBleHRlcm5hbCBzaXRlLjwvcD4KLQotPHA+QXMgd2l0aCBjb25kaXRpb25hbCBsb2dnaW5nLCBwaXBlZCBsb2dzIGFyZSBhIHZlcnkgcG93ZXJmdWwgdG9vbCwKLWJ1dCB0aGV5IHNob3VsZCBub3QgYmUgdXNlZCB3aGVyZSBhIHNpbXBsZXIgc29sdXRpb24gbGlrZQotb2ZmLWxpbmUgcG9zdC1wcm9jZXNzaW5nIGlzIGF2YWlsYWJsZS48L3A+Ci0KLTxocj4KLQotPGgyPjxhIG5hbWU9InZpcnR1YWxob3N0cyI+VmlydHVhbCBIb3N0czwvYT48L2gyPgotCi08cD5XaGVuIHJ1bm5pbmcgYSBzZXJ2ZXIgd2l0aCBtYW55IDxhIGhyZWY9InZob3N0cy8iPnZpcnR1YWwKLWhvc3RzPC9hPiwgdGhlcmUgYXJlIHNldmVyYWwgb3B0aW9ucyBmb3IgZGVhbGluZyB3aXRoIGxvZyBmaWxlcy4KLUZpcnN0LCBpdCBpcyBwb3NzaWJsZSB0byB1c2UgbG9ncyBleGFjdGx5IGFzIGluIGEgc2luZ2xlLWhvc3Qgc2VydmVyLgotU2ltcGx5IGJ5IHBsYWNpbmcgdGhlIGxvZ2dpbmcgZGlyZWN0aXZlcyBvdXRzaWRlIHRoZQotPGNvZGU+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvY29kZT4gc2VjdGlvbnMgaW4gdGhlIG1haW4gc2VydmVyIGNvbnRleHQsCi1pdCBpcyBwb3NzaWJsZSB0byBsb2cgYWxsIHJlcXVlc3RzIGluIHRoZSBzYW1lIGFjY2VzcyBsb2cgYW5kIGVycm9yCi1sb2cuICBUaGlzIHRlY2huaXF1ZSBkb2VzIG5vdCBhbGxvdyBmb3IgZWFzeSBjb2xsZWN0aW9uIG9mIHN0YXRpc3RpY3MKLW9uIGluZGl2aWR1YWwgdmlydHVhbCBob3N0cy48L3A+Ci0KLTxwPklmIDxjb2RlPkN1c3RvbUxvZzwvY29kZT4gb3IgPGNvZGU+RXJyb3JMb2c8L2NvZGU+IGRpcmVjdGl2ZXMgYXJlCi1wbGFjZWQgaW5zaWRlIGEgPGNvZGU+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvY29kZT4gc2VjdGlvbiwgYWxsIHJlcXVlc3RzCi1vciBlcnJvcnMgZm9yIHRoYXQgdmlydHVhbCBob3N0IHdpbGwgYmUgbG9nZ2VkIG9ubHkgdG8gdGhlIHNwZWNpZmllZAotZmlsZS4gIEFueSB2aXJ0dWFsIGhvc3Qgd2hpY2ggZG9lcyBub3QgaGF2ZSBsb2dnaW5nIGRpcmVjdGl2ZXMgd2lsbAotc3RpbGwgaGF2ZSBpdHMgcmVxdWVzdHMgc2VudCB0byB0aGUgbWFpbiBzZXJ2ZXIgbG9ncy4gIFRoaXMgdGVjaG5pcXVlCi1pcyB2ZXJ5IHVzZWZ1bCBmb3IgYSBzbWFsbCBudW1iZXIgb2YgdmlydHVhbCBob3N0cywgYnV0IGlmIHRoZSBudW1iZXIKLW9mIGhvc3RzIGlzIHZlcnkgbGFyZ2UsIGl0IGNhbiBiZSBjb21wbGljYXRlZCB0byBtYW5hZ2UuICBJbiBhZGRpdGlvbiwKLWl0IGNhbiBvZnRlbiBjcmVhdGUgcHJvYmxlbXMgd2l0aCA8YQotaHJlZj0idmhvc3RzL2ZkLWxpbWl0cy5odG1sIj5pbnN1ZmZpY2llbnQgZmlsZSBkZXNjcmlwdG9yczwvYT4uPC9wPgotCi08cD5Gb3IgdGhlIGFjY2VzcyBsb2csIHRoZXJlIGlzIGEgdmVyeSBnb29kIGNvbXByb21pc2UuICBCeSBhZGRpbmcKLWluZm9ybWF0aW9uIG9uIHRoZSB2aXJ0dWFsIGhvc3QgdG8gdGhlIGxvZyBmb3JtYXQgc3RyaW5nLAotaXQgaXMgcG9zc2libGUgdG8gbG9nIGFsbCBob3N0cyB0byB0aGUgc2FtZSBsb2csIGFuZCBsYXRlcgotc3BsaXQgdGhlIGxvZyBpbnRvIGluZGl2aWR1YWwgZmlsZXMuICBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlCi1mb2xsb3dpbmcgZGlyZWN0aXZlcy48L3A+Ci0KLTxibG9ja3F1b3RlPjxjb2RlPgotTG9nRm9ybWF0ICIldiAlbCAldSAldCBcIiVyXCIgJT5zICViIiBjb21vbnZob3N0PGJyPgotQ3VzdG9tTG9nIGxvZ3MvYWNjZXNzX2xvZyBjb21vbnZob3N0Ci08L2NvZGU+PC9ibG9ja3F1b3RlPgotCi08cD5UaGUgPGNvZGU+JXY8L2NvZGU+IGlzIHVzZWQgdG8gbG9nIHRoZSBuYW1lIG9mIHRoZSB2aXJ0dWFsIGhvc3QKLXRoYXQgaXMgc2VydmluZyB0aGUgcmVxdWVzdC4gIFRoZW4gYSBwcm9ncmFtIGxpa2UgPGEKLWhyZWY9InByb2dyYW1zL290aGVyLmh0bWwiPnNwbGl0LWxvZ2ZpbGU8L2E+IGNhbiBiZSB1c2VkIHRvCi1wb3N0LXByb2Nlc3MgdGhlIGFjY2VzcyBsb2cgaW4gb3JkZXIgdG8gc3BsaXQgaXQgaW50byBvbmUgZmlsZSBwZXIKLXZpcnR1YWwgaG9zdC48L3A+Ci0KLTxwPlVuZm9ydHVuYXRlbHksIG5vIHNpbWlsYXIgdGVjaG5pcXVlIGlzIGF2YWlsYWJsZSBmb3IgdGhlIGVycm9yIGxvZywKLXNvIHlvdSBtdXN0IGNob29zZSBiZXR3ZWVuIG1peGluZyBhbGwgdmlydHVhbCBob3N0cyBpbiB0aGUgc2FtZSBlcnJvcgotbG9nIGFuZCB1c2luZyBvbmUgZXJyb3IgbG9nIHBlciB2aXJ0dWFsIGhvc3QuPC9wPgotCi08aHI+Ci0KLTxoMj48YSBuYW1lPSJvdGhlciI+T3RoZXIgTG9nIEZpbGVzPC9hPjwvaDI+Ci0KLTx0YWJsZSBib3JkZXI9MT48dHI+PHRkIHZhbGlnbj0idG9wIj4KLTxzdHJvbmc+UmVsYXRlZCBNb2R1bGVzPC9zdHJvbmc+PGJyPjxicj4KLQotPGEgaHJlZj0ibW9kL21vZF9jZ2kuaHRtbCI+bW9kX2NnaTwvYT48YnI+Ci08YSBocmVmPSJtb2QvbW9kX3Jld3JpdGUuaHRtbCI+bW9kX3Jld3JpdGU8L2E+Ci0KLTwvdGQ+PHRkIHZhbGlnbj0idG9wIj4KLTxzdHJvbmc+UmVsYXRlZCBEaXJlY3RpdmVzPC9zdHJvbmc+PGJyPjxicj4KLQotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNwaWRmaWxlIj5QaWRGaWxlPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9tb2RfcmV3cml0ZS5odG1sI1Jld3JpdGVMb2ciPlJld3JpdGVMb2c8L2E+PC9icj4KLTxhIGhyZWY9Im1vZC9tb2RfcmV3cml0ZS5odG1sI1Jld3JpdGVMb2dMZXZlbCI+UmV3cml0ZUxvZ0xldmVsPC9hPjwvYnI+Ci08YSBocmVmPSJtb2QvbW9kX2NnaS5odG1sI3NjcmlwdGxvZyI+U2NyaXB0TG9nPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9tb2RfY2dpLmh0bWwjc2NyaXB0bG9nbGVuZ3RoIj5TY3JpcHRMb2dMZW5ndGg8L2E+PGJyPgotPGEgaHJlZj0ibW9kL21vZF9jZ2kuaHRtbCNzY3JpcHRsb2didWZmZXIiPlNjcmlwdExvZ0J1ZmZlcjwvYT4KLQotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxoMz48YSBuYW1lPSJwaWRmaWxlIj5QSUQgRmlsZTwvYT48L2gzPgotCi08cD5PbiBzdGFydHVwLCBBcGFjaGUgSFRUUEQgc2F2ZXMgdGhlIHByb2Nlc3MgaWQgb2YgdGhlIHBhcmVudCBodHRwZAotcHJvY2VzcyB0byB0aGUgZmlsZSA8Y29kZT5sb2dzL2h0dHBkLnBpZDwvY29kZT4uIFRoaXMgZmlsZW5hbWUgY2FuIGJlCi1jaGFuZ2VkIHdpdGggdGhlIDxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjcGlkZmlsZSI+UGlkRmlsZTwvQT4KLWRpcmVjdGl2ZS4gVGhlIHByb2Nlc3MtaWQgaXMgZm9yIHVzZSBieSB0aGUgYWRtaW5pc3RyYXRvciBpbgotcmVzdGFydGluZyBhbmQgdGVybWluYXRpbmcgdGhlIGRhZW1vbiBieSBzZW5kaW5nIHNpZ25hbHMKLXRvIHRoZSBwYXJlbnQgcHJvY2Vzczsgb24gV2luZG93cywgdXNlIHRoZSAtayBjb21tYW5kIGxpbmUKLW9wdGlvbiBpbnN0ZWFkLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSA8QQotSFJFRj0ic3RvcHBpbmcuaHRtbCI+U3RvcHBpbmcgYW5kIFJlc3RhcnRpbmc8L0E+IHBhZ2UuCi0KLTxoMz48YSBuYW1lPSJzY3JpcHRsb2ciPlNjcmlwdCBMb2c8L2E+PC9oMz4KLQotPHA+SW4gb3JkZXIgdG8gYWlkIGluIGRlYnVnZ2luZywgdGhlCi08YSBocmVmPSJtb2QvbW9kX2NnaS5odG1sI3NjcmlwdGxvZyI+U2NyaXB0TG9nPC9hPgotZGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gcmVjb3JkIHRoZSBpbnB1dCB0byBhbmQgb3V0cHV0IGZyb20KLUNHSSBzY3JpcHRzLiAgVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGluIHRlc3RpbmcgLSBub3QgZm9yCi1saXZlIHNlcnZlcnMuICBNb3JlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBpbiB0aGUKLTxhIGhyZWY9Im1vZC9tb2RfY2dpLmh0bWwiPm1vZF9jZ2kgZG9jdW1lbnRhdGlvbjwvYT4uCi0KLTxoMz48YSBuYW1lPSJyZXdyaXRlbG9nIj5SZXdyaXRlIExvZzwvYT48L2gzPgotCi08cD5XaGVuIHVzaW5nIHRoZSBwb3dlcmZ1bCBhbmQgY29tcGxleCBmZWF0dXJlcyBvZiA8YQotaHJlZj0ibW9kL21vZF9yZXdyaXRlLmh0bWwiPm1vZF9yZXdyaXRlPC9hPiwgaXQgaXMgYWxtb3N0IGFsd2F5cwotbmVjZXNzYXJ5IHRvIHVzZSB0aGUgPGEKLWhyZWY9Im1vZC9tb2RfcmV3cml0ZS5odG1sI1Jld3JpdGVMb2ciPlJld3JpdGVMb2c8L2E+IHRvIGhlbHAgaW4KLWRlYnVnZ2luZy4gIFRoaXMgbG9nIGZpbGUgcHJvZHVjZXMgYSBkZXRhaWxlZCBhbmFseXNpcyBvZiBob3cgdGhlCi1yZXdyaXRpbmcgZW5naW5lIHRyYW5zZm9ybXMgcmVxdWVzdHMuICBUaGUgbGV2ZWwgb2YgZGV0YWlsIGlzCi1jb250cm9sbGVkIGJ5IHRoZSA8YQotaHJlZj0ibW9kL21vZF9yZXdyaXRlLmh0bWwjUmV3cml0ZUxvZ0xldmVsIj5SZXdyaXRlTG9nTGV2ZWw8L2E+Ci1kaXJlY3RpdmUuPC9wPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbG9ncy5odG1sLmVuIGIvZG9jcy9tYW51YWwvbG9ncy5odG1sLmVuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2ViZjQ4Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2xvZ3MuaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDU4MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkxvZyBGaWxlcyAtIEFwYWNoZSBIVFRQIFNlcnZlcjwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPGgxIGFsaWduPSJjZW50ZXIiPkxvZyBGaWxlczwvaDE+Ci0KLTxwPkluIG9yZGVyIHRvIGVmZmVjdGl2ZWx5IG1hbmFnZSBhIHdlYiBzZXJ2ZXIsIGl0IGlzIG5lY2Vzc2FyeSB0byBnZXQKLWZlZWRiYWNrIGFib3V0IHRoZSBhY3Rpdml0eSBhbmQgcGVyZm9ybWFuY2Ugb2YgdGhlIHNlcnZlciBhcyB3ZWxsIGFzCi1hbnkgcHJvYmxlbXMgdGhhdCBtYXkgYmUgb2NjdXJpbmcuICBUaGUgQXBhY2hlIEhUVFAgU2VydmVyIHByb3ZpZGVzCi12ZXJ5IGNvbXByZWhlbnNpdmUgYW5kIGZsZXhpYmxlIGxvZ2dpbmcgY2FwYWJpbGl0aWVzLiAgVGhpcyBkb2N1bWVudAotZGVzY3JpYmVzIGhvdyB0byBjb25maWd1cmUgdGhlIHZhcmlvdXMgbG9nIGZpbGVzLCBhbmQgaG93IHRvCi11bmRlcnN0YW5kIHdoYXQgdGhlIGxvZ3MgY29udGFpbi48L3A+Ci0KLTx1bD4KLTxsaT48YSBocmVmPSIjc2VjdXJpdHkiPlNlY3VyaXR5IFdhcm5pbmc8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjZXJyb3Jsb2ciPkVycm9yIExvZzwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNhY2Nlc3Nsb2ciPkFjY2VzcyBMb2c8L2E+Ci0gIDx1bD4KLSAgICA8bGk+PGEgaHJlZj0iI2NvbW1vbiI+Q29tbW9uIExvZyBGb3JtYXQ8L2E+PC9saT4KLSAgICA8bGk+PGEgaHJlZj0iI2NvbWJpbmVkIj5Db21iaW5lZCBMb2cgRm9ybWF0PC9hPjwvbGk+Ci0gICAgPGxpPjxhIGhyZWY9IiNtdWx0aXBsZSI+TXVsdGlwbGUgQWNjZXNzIExvZ3M8L2E+PC9saT4KLSAgICA8bGk+PGEgaHJlZj0iI2NvbmRpdGlvbmFsIj5Db25kaXRpb25hbCBMb2dnaW5nPC9hPjwvbGk+Ci0gIDwvdWw+PC9saT4KLTxsaT48YSBocmVmPSIjcm90YXRpb24iPkxvZyBSb3RhdGlvbjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNwaXBlZCI+UGlwZWQgTG9nczwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiN2aXJ0dWFsaG9zdHMiPlZpcnR1YWxIb3N0czwvYT4KLTxsaT48YSBocmVmPSIjb3RoZXIiPk90aGVyIExvZyBGaWxlczwvYT4KLSAgPHVsPgotICAgIDxsaT48YSBocmVmPSIjcGlkZmlsZSI+UElEIEZpbGU8L2E+PC9saT4KLSAgICA8bGk+PGEgaHJlZj0iI3NjcmlwdGxvZyI+U2NyaXB0IExvZzwvYT48L2xpPgotICAgIDxsaT48YSBocmVmPSIjcmV3cml0ZWxvZyI+UmV3cml0ZSBMb2c8L2E+PC9saT4KLSAgPC91bD48L2xpPgotPC91bD4KLQotPGhyPgotCi08aDI+PGEgbmFtZT0ic2VjdXJpdHkiPlNlY3VyaXR5IFdhcm5pbmc8L2E+PC9oMj4KLQotPHA+QW55b25lIHdobyBjYW4gd3JpdGUgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBBcGFjaGUgaXMgd3JpdGluZyBhCi1sb2cgZmlsZSBjYW4gYWxtb3N0IGNlcnRhaW5seSBnYWluIGFjY2VzcyB0byB0aGUgdWlkIHRoYXQgdGhlIHNlcnZlciBpcwotc3RhcnRlZCBhcywgd2hpY2ggaXMgbm9ybWFsbHkgcm9vdC4gIERvIDxFTT5OT1Q8L0VNPiBnaXZlIHBlb3BsZSB3cml0ZQotYWNjZXNzIHRvIHRoZSBkaXJlY3RvcnkgdGhlIGxvZ3MgYXJlIHN0b3JlZCBpbiB3aXRob3V0IGJlaW5nIGF3YXJlIG9mCi10aGUgY29uc2VxdWVuY2VzOyBzZWUgdGhlIDxBIEhSRUY9Im1pc2Mvc2VjdXJpdHlfdGlwcy5odG1sIj5zZWN1cml0eSB0aXBzPC9BPgotZG9jdW1lbnQgZm9yIGRldGFpbHMuPC9wPgotCi08cD5JbiBhZGRpdGlvbiwgbG9nIGZpbGVzIG1heSBjb250YWluIGluZm9ybWF0aW9uIHN1cHBsaWVkIGRpcmVjdGx5Ci1ieSB0aGUgY2xpZW50LCB3aXRob3V0IGVzY2FwaW5nLiAgVGhlcmVmb3JlLCBpdCBpcyBwb3NzaWJsZSBmb3IKLW1hbGljaW91cyBjbGllbnRzIHRvIGluc2VydCBjb250cm9sLWNoYXJhY3RlcnMgaW4gdGhlIGxvZyBmaWxlcywgc28KLWNhcmUgbXVzdCBiZSB0YWtlbiBpbiBkZWFsaW5nIHdpdGggcmF3IGxvZ3MuPC9wPgotCi08aHI+Ci0KLTxoMj48YSBuYW1lPSJlcnJvcmxvZyI+RXJyb3IgTG9nPC9hPjwvaDI+Ci0KLTx0YWJsZSBib3JkZXI9IjEiPgotPHRyPjx0ZCB2YWxpZ249InRvcCI+Ci08c3Ryb25nPlJlbGF0ZWQgRGlyZWN0aXZlczwvc3Ryb25nPjxicj48YnI+Ci0KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjZXJyb3Jsb2ciPkVycm9yTG9nPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjbG9nbGV2ZWwiPkxvZ0xldmVsPC9hPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPlRoZSBzZXJ2ZXIgZXJyb3IgbG9nLCB3aG9zZSBuYW1lIGFuZCBsb2NhdGlvbiBpcyBzZXQgYnkgdGhlIDxhCi1ocmVmPSJtb2QvY29yZS5odG1sI2Vycm9ybG9nIj5FcnJvckxvZzwvYT4gZGlyZWN0aXZlLCBpcyB0aGUgbW9zdAotaW1wb3J0YW50IGxvZyBmaWxlLiAgVGhpcyBpcyB0aGUgcGxhY2Ugd2hlcmUgQXBhY2hlIEhUVFBEIHdpbGwgc2VuZAotZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBhbmQgcmVjb3JkIGFueSBlcnJvcnMgdGhhdCBpdCBlbmNvdW50ZXJzIGluCi1wcm9jZXNzaW5nIHJlcXVlc3RzLiAgSXQgaXMgdGhlIGZpcnN0IHBsYWNlIHRvIGxvb2sgd2hlbiBhIHByb2JsZW0KLW9jY3VycyB3aXRoIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIgb3Igd2l0aCB0aGUgb3BlcmF0aW9uIG9mIHRoZSBzZXJ2ZXIsCi1zaW5jZSBpdCB3aWxsIG9mdGVuIGNvbnRhaW4gZGV0YWlscyBvZiB3aGF0IHdlbnQgd3JvbmcgYW5kIGhvdyB0byBmaXgKLWl0LjwvcD4KLQotPHA+VGhlIGVycm9yIGxvZyBpcyB1c3VhbGx5IHdyaXR0ZW4gdG8gYSBmaWxlICh0eXBpY2FsbHkKLTxjb2RlPmVycm9yX2xvZzwvY29kZT4gb24gdW5peCBzeXN0ZW1zIGFuZCA8Y29kZT5lcnJvci5sb2c8L2NvZGU+IG9uCi1XaW5kb3dzIGFuZCBPUy8yKS4gIE9uIHVuaXggc3lzdGVtcyBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGhhdmUgdGhlCi1zZXJ2ZXIgc2VuZCBlcnJvcnMgdG8gdGhlIDxjb2RlPnN5c2xvZzwvY29kZT4gb3IgPGEgaHJlZj0iI3BpcGUiPnBpcGUKLXRoZW0gdGhyb3VnaCBhIHByb2dyYW08L2E+LjwvcD4KLQotPHA+VGhlIGZvcm1hdCBvZiB0aGUgZXJyb3IgbG9nIGlzIHJlbGF0aXZlbHkgZnJlZS1mb3JtIGFuZAotZGVzY3JpcHRpdmUuICBCdXQgdGhlcmUgaXMgY2VydGFpbiBpbmZvcm1hdGlvbiB0aGF0IGlzIGNvbnRhaW5lZAotaW4gbW9zdCBlcnJvciBsb2cgZW50cmllcy4gIEZvciBleGFtcGxlLCBoZXJlIGlzIGEgdHlwaWNhbCBtZXNzYWdlLjwvcD4KLQotPGJsb2NrcXVvdGU+PGNvZGU+Ci1bV2VkIE9jdCAxMSAxNDozMjo1MiAyMDAwXSBbZXJyb3JdIFtjbGllbnQgMTI3LjAuMC4xXSBjbGllbnQgZGVuaWVkIGJ5IHNlcnZlciBjb25maWd1cmF0aW9uOiAvZXhwb3J0L2hvbWUvbGl2ZS9hcC9odGRvY3MvdGVzdAotPC9jb2RlPjwvYmxvY2txdW90ZT4KLQotPHA+VGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxvZyBlbnRyeSBpcyB0aGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUKLW1lc3NhZ2UuICBUaGUgc2Vjb25kIGVudHJ5IGxpc3RzIHRoZSBzZXZlcml0eSBvZiB0aGUgZXJyb3IgYmVpbmcKLXJlcG9ydGVkLiBUaGUgPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNsb2dsZXZlbCI+TG9nTGV2ZWw8L2E+IGRpcmVjdGl2ZQotaXMgdXNlZCB0byBjb250cm9sIHRoZSB0eXBlcyBvZiBlcnJvcnMgdGhhdCBhcmUgc2VudCB0byB0aGUgZXJyb3IgbG9nCi1ieSByZXN0cmljdGluZyB0aGUgc2V2ZXJpdHkgbGV2ZWwuICBUaGUgdGhpcmQgZW50cnkgZ2l2ZXMgdGhlIElQCi1hZGRyZXNzIG9mIHRoZSBjbGllbnQgdGhhdCBnZW5lcmF0ZWQgdGhlIGVycm9yLiAgQmV5b25kIHRoYXQgaXMgdGhlCi1tZXNzYWdlIGl0c2VsZiwgd2hpY2ggaW4gdGhpcyBjYXNlIGluZGljYXRlcyB0aGF0IHRoZSBzZXJ2ZXIgaGFzIGJlZW4KLWNvbmZpZ3VyZWQgdG8gZGVueSB0aGUgY2xpZW50IGFjY2Vzcy4gIFRoZSBzZXJ2ZXIgcmVwb3J0cyB0aGUKLWZpbGUtc3lzdGVtIHBhdGggKGFzIG9wcG9zZWQgdG8gdGhlIHdlYiBwYXRoKSBvZiB0aGUgcmVxdWVzdGVkCi1kb2N1bWVudC48L3A+Ci0KLTxwPkEgdmVyeSB3aWRlIHZhcmlldHkgb2YgZGlmZmVyZW50IG1lc3NhZ2VzIGNhbiBhcHBlYXIgaW4gdGhlIGVycm9yCi1sb2cuICBNb3N0IGxvb2sgc2ltaWxhciB0byB0aGUgZXhhbXBsZSBhYm92ZS4gIFRoZSBlcnJvciBsb2cgd2lsbCBhbHNvCi1jb250YWluIGRlYnVnZ2luZyBvdXRwdXQgZnJvbSBDR0kgc2NyaXB0cy4gIEFueSBpbmZvcm1hdGlvbiB3cml0dGVuIHRvCi08Y29kZT5zdGRlcnI8L2NvZGU+IGJ5IGEgQ0dJIHNjcmlwdCB3aWxsIGJlIGNvcGllZCBkaXJlY3RseSB0byB0aGUKLWVycm9yIGxvZy48L3A+Ci0KLTxwPkl0IGlzIG5vdCBwb3NzaWJsZSB0byBjdXN0b21pemUgdGhlIGVycm9yIGxvZyBieSBhZGRpbmcgb3IgcmVtb3ZpbmcKLWluZm9ybWF0aW9uLiAgSG93ZXZlciwgZXJyb3IgbG9nIGVudHJpZXMgZGVhbGluZyB3aXRoIHBhcnRpY3VsYXIKLXJlcXVlc3RzIGhhdmUgY29ycmVzcG9uZGluZyBlbnRyaWVzIGluIHRoZSA8YSBocmVmPSJhY2Nlc3Nsb2ciPmFjY2VzcwotbG9nPC9hPi4gIEZvciBleGFtcGxlLCB0aGUgYWJvdmUgZXhhbXBsZSBlbnRyeSBjb3JyZXNwb25kcyB0byBhbgotYWNjZXNzIGxvZyBlbnRyeSB3aXRoIHN0YXR1cyBjb2RlIDQwMy4gIFNpbmNlIGl0IGlzIHBvc3NpYmxlIHRvCi1jdXN0b21pemUgdGhlIGFjY2VzcyBsb2csIHlvdSBjYW4gb2J0YWluIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZXJyb3IKLWNvbmRpdGlvbnMgdXNpbmcgdGhhdCBsb2cgZmlsZS48L3A+Ci0KLTxwPkR1cmluZyB0ZXN0aW5nLCBpdCBpcyBvZnRlbiB1c2VmdWwgdG8gY29udGludW91c2x5IG1vbml0b3IgdGhlCi1lcnJvciBsb2cgZm9yIGFueSBwcm9ibGVtcy4gIE9uIHVuaXggc3lzdGVtcywgeW91IGNhbiBhY2NvbXBsaXNoIHRoaXMgCi11c2luZzo8L3A+Ci08YmxvY2txdW90ZT48Y29kZT4KLXRhaWwgLWYgZXJyb3JfbG9nCi08L2NvZGU+PC9ibG9ja3F1b3RlPgotCi08aHI+Ci0KLTxoMj48YSBuYW1lPSJhY2Nlc3Nsb2ciPkFjY2VzcyBMb2c8L2E+PC9oMj4KLQotPHRhYmxlIGJvcmRlcj0xPjx0cj48dGQgdmFsaWduPSJ0b3AiPgotPHN0cm9uZz5SZWxhdGVkIE1vZHVsZXM8L3N0cm9uZz48YnI+PGJyPgotCi08YSBocmVmPSJtb2QvbW9kX2xvZ19jb25maWcuaHRtbCI+bW9kX2xvZ19jb25maWc8L2E+PGJyPgotCi08L3RkPjx0ZCB2YWxpZ249InRvcCI+Ci08c3Ryb25nPlJlbGF0ZWQgRGlyZWN0aXZlczwvc3Ryb25nPjxicj48YnI+Ci0KLTxhIGhyZWY9Im1vZC9tb2RfbG9nX2NvbmZpZy5odG1sI2N1c3RvbWxvZyI+Q3VzdG9tTG9nPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9tb2RfbG9nX2NvbmZpZy5odG1sI2xvZ2Zvcm1hdCI+TG9nRm9ybWF0PC9hPjxicj4KLTxhIGhyZWY9Im1vZC9tb2Rfc2V0ZW52aWYuaHRtbCNzZXRlbnZpZiI+U2V0RW52SWY8L2E+Ci0KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD5UaGUgc2VydmVyIGFjY2VzcyBsb2cgcmVjb3JkcyBhbGwgcmVxdWVzdHMgcHJvY2Vzc2VkIGJ5IHRoZSBzZXJ2ZXIuCi1UaGUgbG9jYXRpb24gb2YgdGhlIGFjY2VzcyBsb2cgYXMgd2VsbCBhcyBpdHMgY29udGVudHMgYXJlIGNvbnRyb2xsZWQKLWJ5IHRoZSA8YSBocmVmPSJtb2QvbW9kX2xvZ19jb25maWcuaHRtbCNjdXN0b21sb2ciPkN1c3RvbUxvZzwvYT4KLWRpcmVjdGl2ZS4gIFRoZSA8YQotaHJlZj0ibW9kL21vZF9sb2dfY29uZmlnLmh0bWwjbG9nZm9ybWF0Ij5Mb2dGb3JtYXQ8L2E+IGRpcmVjdGl2ZSBjYW4KLWJlIHVzZWQgdG8gc2ltcGxpZnkgdGhlIHNlbGVjdGlvbiBvZiB0aGUgY29udGVudHMgb2YgdGhlIGxvZ3MuCi1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGhvdyB0byBjb25maWd1cmUgdGhlIHNlcnZlciB0byByZWNvcmQKLWluZm9ybWF0aW9uIGluIHRoZSBhY2Nlc3MgbG9nLjwvcD4KLQotPHA+T2YgY291cnNlLCBzdG9yaW5nIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgYWNjZXNzIGxvZyBpcyBvbmx5IHRoZQotc3RhcnQgb2YgbG9nIG1hbmFnZW1lbnQuICBUaGUgbmV4dCBzdGVwIGlzIHRvIGFuYWx5emUgdGhpcyBpbmZvcm1hdGlvbgotdG8gcHJvZHVjZSB1c2VmdWwgc3RhdGlzdGljcy4gIExvZyBhbmFseXNpcyBpbiBnZW5lcmFsIGlzIGJleW9uZCB0aGUKLXNjb3BlIG9mIHRoaXMgZG9jdW1lbnQsIGFuZCBub3QgcmVhbGx5IHBhcnQgb2YgdGhlIGpvYiBvZiB0aGUKLXdlYiBzZXJ2ZXIgaXRzZWxmLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0b3BpYywgYW5kIGZvcgotYXBwbGljYXRpb25zIHdoaWNoIHBlcmZvcm0gbG9nIGFuYWx5c2lzLCBjaGVjayB0aGUgPGEKLWhyZWY9Imh0dHA6Ly9kbW96Lm9yZy9Db21wdXRlcnMvU29mdHdhcmUvSW50ZXJuZXQvU2l0ZV9NYW5hZ2VtZW50L0xvZ19hbmFseXNpcy8iCi0+T3BlbiBEaXJlY3Rvcnk8L2E+IG9yIDxhCi1ocmVmPSJodHRwOi8vZGlyLnlhaG9vLmNvbS9Db21wdXRlcnNfYW5kX0ludGVybmV0L1NvZnR3YXJlL0ludGVybmV0L1dvcmxkX1dpZGVfV2ViL1NlcnZlcnMvTG9nX0FuYWx5c2lzX1Rvb2xzLyIKLT5ZYWhvbzwvYT4uPC9wPgotCi08cD5WYXJpb3VzIHZlcnNpb25zIG9mIEFwYWNoZSBIVFRQRCBoYXZlIHVzZWQgb3RoZXIgbW9kdWxlcyBhbmQKLWRpcmVjdGl2ZXMgdG8gY29udHJvbCBhY2Nlc3MgbG9nZ2luZywgaW5jbHVkaW5nIG1vZF9sb2dfcmVmZXJlciwKLW1vZF9sb2dfYWdlbnQsIGFuZCB0aGUgPGNvZGU+VHJhbnNmZXJMb2c8L2NvZGU+IGRpcmVjdGl2ZS4gIFRoZQotPGNvZGU+Q3VzdG9tTG9nPC9jb2RlPiBkaXJlY3RpdmUgbm93IHN1YnN1bWVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFsbAotdGhlIG9sZGVyIGRpcmVjdGl2ZXMuPC9wPgotCi08cD5UaGUgZm9ybWF0IG9mIHRoZSBhY2Nlc3MgbG9nIGlzIGhpZ2hseSBjb25maWd1cmFibGUuICBUaGUgZm9ybWF0IGlzCi1zcGVjaWZpZWQgdXNpbmcgYSA8YSBocmVmPSJtb2QvbW9kX2xvZ19jb25maWcuaHRtbCNmb3JtYXQiPmZvcm1hdAotc3RyaW5nPC9hPiB0aGF0IGxvb2tzIG11Y2ggbGlrZSBhIEMtc3R5bGUgcHJpbnRmKDEpIGZvcm1hdCBzdHJpbmcuCi1Tb21lIGV4YW1wbGVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlIG5leHQgc2VjdGlvbnMuICBGb3IgYSBjb21wbGV0ZSBsaXN0Ci1vZiB0aGUgcG9zc2libGUgY29udGVudHMgb2YgdGhlIGZvcm1hdCBzdHJpbmcsIHNlZSB0aGUgPGEKLWhyZWY9Im1vZC9tb2RfbG9nX2NvbmZpZy5odG1sIj5tb2RfbG9nX2NvbmZpZyBkb2N1bWVudGF0aW9uPC9hPi48L3A+Ci0KLTxoMz48YSBuYW1lPSJjb21tb24iPkNvbW1vbiBMb2cgRm9ybWF0PC9hPjwvaDM+Ci0KLTxwPkEgdHlwaWNhbCBjb25maWd1cmF0aW9uIGZvciB0aGUgYWNjZXNzIGxvZyBtaWdodCBsb29rCi1hcyBmb2xsb3dzLjwvcD4KLQotPGJsb2NrcXVvdGU+PGNvZGU+Ci1Mb2dGb3JtYXQgIiVoICVsICV1ICV0IFwiJXJcIiAlPnMgJWIiIGNvbW1vbjxicj4KLUN1c3RvbUxvZyBsb2dzL2FjY2Vzc19sb2cgY29tbW9uCi08L2NvZGU+PC9ibG9ja3F1b3RlPgotCi08cD5UaGlzIGRlZmluZXMgdGhlIDxlbT5uaWNrbmFtZTwvZW0+IDxjb2RlPmNvbW1vbjwvY29kZT4gYW5kCi1hc3NvY2lhdGVzIGl0IHdpdGggYSBwYXJ0aWN1bGFyIGxvZyBmb3JtYXQgc3RyaW5nLiAgVGhlIGZvcm1hdCBzdHJpbmcKLWNvbnNpc3RzIG9mIHBlcmNlbnQgZGlyZWN0aXZlcywgZWFjaCBvZiB3aGljaCB0ZWxsIHRoZSBzZXJ2ZXIgdG8gbG9nIGEKLXBhcnRpY3VsYXIgcGllY2Ugb2YgaW5mb3JtYXRpb24uICBMaXRlcmFsIGNoYXJhY3RlcnMgbWF5IGFsc28gYmUKLXBsYWNlZCBpbiB0aGUgZm9ybWF0IHN0cmluZyBhbmQgd2lsbCBiZSBjb3BpZWQgZGlyZWN0bHkgaW50byB0aGUgbG9nCi1vdXRwdXQuICBUaGUgcXVvdGUgY2hhcmFjdGVyICg8Y29kZT4iPC9jb2RlPikgbXVzdCBiZSBlc2NhcGVkIGJ5Ci1wbGFjaW5nIGEgYmFjay1zbGFzaCBiZWZvcmUgaXQgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIGludGVycHJldGVkIGFzCi10aGUgZW5kIG9mIHRoZSBmb3JtYXQgc3RyaW5nLiAgVGhlIGZvcm1hdCBzdHJpbmcgbWF5IGFsc28gY29udGFpbiB0aGUKLXNwZWNpYWwgY29udHJvbCBjaGFyYWN0ZXJzICI8Y29kZT5cbjwvY29kZT4iIGZvciBuZXctbGluZSBhbmQKLSI8Y29kZT5cdDwvY29kZT4iIGZvciB0YWIuPC9wPgotCi08cD5UaGUgPGNvZGU+Q3VzdG9tTG9nPC9jb2RlPiBkaXJlY3RpdmUgc2V0cyB1cCBhIG5ldyBsb2cgZmlsZSB1c2luZwotdGhlIGRlZmluZWQgPGVtPm5pY2tuYW1lPC9lbT4uICBUaGUgZmlsZW5hbWUgZm9yIHRoZSBhY2Nlc3MgbG9nIGlzCi1yZWxhdGl2ZSB0byB0aGUgPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNzZXJ2ZXJyb290Ij5TZXJ2ZXJSb290PC9hPgotdW5sZXNzIGl0IGJlZ2lucyB3aXRoIGEgc2xhc2guPC9wPgotCi08cD5UaGUgYWJvdmUgY29uZmlndXJhdGlvbiB3aWxsIHdyaXRlIGxvZyBlbnRyaWVzIGluIGEgZm9ybWF0IGtub3duIGFzCi10aGUgQ29tbW9uIExvZyBGb3JtYXQgKENMRikuICBUaGlzIHN0YW5kYXJkIGZvcm1hdCBjYW4gYmUgcHJvZHVjZWQgYnkKLW1hbnkgZGlmZmVyZW50IHdlYiBzZXJ2ZXJzIGFuZCByZWFkIGJ5IG1hbnkgbG9nIGFuYWx5c2lzIHByb2dyYW1zLgotVGhlIGxvZyBmaWxlIGVudHJpZXMgcHJvZHVjZWQgaW4gQ0xGIHdpbGwgbG9vayBzb21ldGhpbmcgbGlrZQotdGhpczo8L3A+Ci0KLTxibG9ja3F1b3RlPjxjb2RlPgotMTI3LjAuMC4xIC0gZnJhbmsgWzEwL09jdC8yMDAwOjEzOjU1OjM2IC0wNzAwXSAiR0VUIC9hcGFjaGVfcGIuZ2lmIEhUVFAvMS4wIiAyMDAgMjMyNgotPC9jb2RlPjwvYmxvY2txdW90ZT4KLQotPHA+RWFjaCBwYXJ0IG9mIHRoaXMgbG9nIGVudHJ5IGlzIGRlc2NyaWJlZCBiZWxvdy48L3A+Ci0KLTxkbD4KLTxkdD48Y29kZT4xMjcuMC4wLjE8L2NvZGU+ICg8Y29kZT4laDwvY29kZT4pPC9kdD4gPGRkPlRoaXMgaXMgdGhlIElQCi1hZGRyZXNzIG9mIHRoZSBjbGllbnQgKHJlbW90ZSBob3N0KSB3aGljaCBtYWRlIHRoZSByZXF1ZXN0IHRvIHRoZQotc2VydmVyLiAgSWYgPGEKLWhyZWY9Im1vZC9jb3JlLmh0bWwjaG9zdG5hbWVsb29rdXBzIj5Ib3N0TmFtZUxvb2t1cHM8L2E+IGlzIHNldCB0bwotPGNvZGU+T248L2NvZGU+LCB0aGVuIHRoZSBzZXJ2ZXIgd2lsbCB0cnkgdG8gZGV0ZXJtaW5lIHRoZSBob3N0bmFtZQotYW5kIGxvZyBpdCBpbiBwbGFjZSBvZiB0aGUgSVAgYWRkcmVzcy4gIEhvd2V2ZXIsIHRoaXMgY29uZmlndXJhdGlvbiBpcwotbm90IHJlY29tbWVuZGVkIHNpbmNlIGl0IGNhbiBzaWduaWZpY2FudGx5IHNsb3cgdGhlIHNlcnZlci4gIEluc3RlYWQsCi1pdCBpcyBiZXN0IHRvIHVzZSBhIGxvZyBwb3N0LXByb2Nlc3NvciBzdWNoIGFzIDxhCi1ocmVmPSJwcm9ncmFtcy9sb2dyZXNvbHZlLmh0bWwiPmxvZ3Jlc29sdmU8L2E+IHRvIGRldGVybWluZSB0aGUKLWhvc3RuYW1lcy4gIFRoZSBJUCBhZGRyZXNzIHJlcG9ydGVkIGhlcmUgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZQotYWRkcmVzcyBvZiB0aGUgbWFjaGluZSBhdCB3aGljaCB0aGUgdXNlciBpcyBzaXR0aW5nLiAgSWYgYSBwcm94eQotc2VydmVyIGV4aXN0cyBiZXR3ZWVuIHRoZSB1c2VyIGFuZCB0aGUgc2VydmVyLCB0aGlzIGFkZHJlc3Mgd2lsbCBiZQotdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3h5LCByYXRoZXIgdGhhbiB0aGUgb3JpZ2luYXRpbmcgbWFjaGluZS48L2RkPgotCi08ZHQ+PGNvZGU+LTwvY29kZT4gKDxjb2RlPiVsPC9jb2RlPik8L2R0PiA8ZGQ+VGhlICJoeXBoZW4iIGluIHRoZQotb3V0cHV0IGluZGljYXRlcyB0aGF0IHRoZSByZXF1ZXN0ZWQgcGllY2Ugb2YgaW5mb3JtYXRpb24gaXMgbm90Ci1hdmFpbGFibGUuICBJbiB0aGlzIGNhc2UsIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGlzIG5vdCBhdmFpbGFibGUgaXMgdGhlCi1SRkMgMTQxMyBpZGVudGl0eSBvZiB0aGUgY2xpZW50IGRldGVybWluZWQgYnkgPGNvZGU+aWRlbnRkPC9jb2RlPiBvbgotdGhlIGNsaWVudHMgbWFjaGluZS4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaGlnaGx5IHVucmVsaWFibGUgYW5kIHNob3VsZAotYWxtb3N0IG5ldmVyIGJlIHVzZWQgZXhjZXB0IG9uIHRpZ2h0bHkgY29udHJvbGxlZCBpbnRlcm5hbCBuZXR3b3Jrcy4KLUFwYWNoZSBIVFRQRCB3aWxsIG5vdCBldmVuIGF0dGVtcHQgdG8gZGV0ZXJtaW5lIHRoaXMgaW5mb3JtYXRpb24KLXVubGVzcyA8YSBocmVmPSJtb2QvY29yZS5odG1sI2lkZW50aXR5Y2hlY2siPklkZW50aXR5Q2hlY2s8L2E+IGlzIHNldAotdG8gPGNvZGU+T248L2NvZGU+LjwvZGQ+Ci0KLTxkdD48Y29kZT5mcmFuazwvY29kZT4gKDxjb2RlPiV1PC9jb2RlPik8L2R0PiA8ZGQ+VGhpcyBpcyB0aGUgdXNlcmlkCi1vZiB0aGUgcGVyc29uIHJlcXVlc3RpbmcgdGhlIGRvY3VtZW50IGFzIGRldGVybWluZWQgYnkgSFRUUAotYXV0aGVudGljYXRpb24uICBUaGUgc2FtZSB2YWx1ZSBpcyB0eXBpY2FsbHkgcHJvdmlkZWQgdG8gQ0dJIHNjcmlwdHMKLWluIHRoZSA8Y29kZT5SRU1PVEVfVVNFUjwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUuICBJZiB0aGUgc3RhdHVzCi1jb2RlIGZvciB0aGUgcmVxdWVzdCAoc2VlIGJlbG93KSBpcyA0MDEsIHRoZW4gdGhpcyB2YWx1ZSBzaG91bGQgbm90IGJlCi10cnVzdGVkIGJlY2F1c2UgdGhlIHVzZXIgaXMgbm90IHlldCBhdXRoZW50aWNhdGVkLiAgSWYgdGhlIGRvY3VtZW50IGlzCi1ub3QgcGFzc3dvcmQgcHJvdGVjdGVkLCB0aGlzIGVudHJ5IHdpbGwgYmUgIjxjb2RlPi08L2NvZGU+IiBqdXN0IGxpa2UKLXRoZSBwcmV2aW91cyBvbmUuPC9kZD4KLQotPGR0Pjxjb2RlPlsxMC9PY3QvMjAwMDoxMzo1NTozNiAtMDcwMF08L2NvZGU+ICg8Y29kZT4ldDwvY29kZT4pPC9kdD4KLTxkZD5UaGUgdGltZSB0aGF0IHRoZSBzZXJ2ZXIgZmluaXNoZWQgcHJvY2Vzc2luZyB0aGUgcmVxdWVzdC4gIFRoZQotZm9ybWF0IGlzOgotPEJMT0NLUVVPVEU+PENPREU+IFtkYXkvbW9udGgveWVhcjpob3VyOm1pbnV0ZTpzZWNvbmQgem9uZV0gPEJSPgotZGF5ID0gMipkaWdpdDxCUj4KLW1vbnRoID0gMypsZXR0ZXI8QlI+Ci15ZWFyID0gNCpkaWdpdDxCUj4KLWhvdXIgPSAyKmRpZ2l0PEJSPgotbWludXRlID0gMipkaWdpdDxCUj4KLXNlY29uZCA9IDIqZGlnaXQ8QlI+Ci16b25lID0gKGArJyB8IGAtJykgNCpkaWdpdDwvQ09ERT48L0JMT0NLUVVPVEU+Ci1JdCBpcyBwb3NzaWJsZSB0byBoYXZlIHRoZSB0aW1lIGRpc3BsYXllZCBpbiBhbm90aGVyIGZvcm1hdAotYnkgc3BlY2lmeWluZyA8Y29kZT4le2Zvcm1hdH10PC9jb2RlPiBpbiB0aGUgbG9nIGZvcm1hdCBzdHJpbmcsIHdoZXJlCi08Y29kZT5mb3JtYXQ8L2NvZGU+IGlzIGFzIGluIDxjb2RlPnN0cmZ0aW1lKDMpPC9jb2RlPiBmcm9tIHRoZSBDIAotc3RhbmRhcmQgbGlicmFyeS4KLTwvZGQ+Ci0KLTxkdD48Y29kZT4iR0VUIC9hcGFjaGVfcGIuZ2lmIEhUVFAvMS4wIjwvY29kZT4KLSg8Y29kZT5cIiVyXCI8L2NvZGU+KTwvZHQ+IDxkZD5UaGUgcmVxdWVzdCBsaW5lIGZyb20gdGhlIGNsaWVudCBpcwotZ2l2ZW4gaW4gZG91YmxlIHF1b3Rlcy4gIFRoZSByZXF1ZXN0IGxpbmUgY29udGFpbnMgYSBncmVhdCBkZWFsIG9mCi11c2VmdWwgaW5mb3JtYXRpb24uICBGaXJzdCwgdGhlIG1ldGhvZCB1c2VkIGJ5IHRoZSBjbGllbnQgaXMKLTxjb2RlPkdFVDwvY29kZT4uICBTZWNvbmQsIHRoZSBjbGllbnQgcmVxdWVzdGVkIHRoZSByZXNvdXJjZQotPGNvZGU+L2FwYWNoZV9wYi5naWY8L2NvZGU+LCBhbmQgdGhpcmQsIHRoZSBjbGllbnQgdXNlZCB0aGUgcHJvdG9jb2wKLTxjb2RlPkhUVFAvMS4wPC9jb2RlPi48L2RkPiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGxvZyBvbmUgb3IgbW9yZQotcGFydHMgb2YgdGhlIHJlcXVlc3QgbGluZSBpbmRlcGVuZGVudGx5LiAgRm9yIGV4YW1wbGUsIHRoZSBmb3JtYXQKLXN0cmluZyAiPGNvZGU+JW0gJVUlcSAlSDwvY29kZT4iIHdpbGwgbG9nIHRoZSBtZXRob2QsIHBhdGgsCi1xdWVyeS1zdHJpbmcsIGFuZCBwcm90b2NvbCwgcmVzdWx0aW5nIGluIGV4YWN0bHkgdGhlIHNhbWUgb3V0cHV0IGFzCi0iPGNvZGU+JXI8L2NvZGU+Ii48L2RkPgotCi08ZHQ+PGNvZGU+MjAwPC9jb2RlPjwvZHQ+ICg8Y29kZT4lPnM8L2NvZGU+KSA8ZGQ+VGhpcyBpcyB0aGUgc3RhdHVzCi1jb2RlIHRoYXQgdGhlIHNlcnZlciBzZW5kcyBiYWNrIHRvIHRoZSBjbGllbnQuICBUaGlzIGluZm9ybWF0aW9uIGlzCi12ZXJ5IHZhbHVhYmxlLCBiZWNhdXNlIGl0IHJldmVhbHMgd2hldGhlciB0aGUgcmVxdWVzdCByZXN1bHRlZCBpbiBhCi1zdWNjZXNzZnVsIHJlc3BvbnNlIChjb2RlcyBiZWdpbm5pbmcgaW4gMiksIGEgcmVkaXJlY3Rpb24gKGNvZGVzCi1iZWdpbm5pbmcgaW4gMyksIGFuIGVycm9yIGNhdXNlZCBieSB0aGUgY2xpZW50IChjb2RlcyBiZWdpbm5pbmcgaW4gNCksCi1vciBhbiBlcnJvciBpbiB0aGUgc2VydmVyIChjb2RlcyBiZWdpbm5pbmcgaW4gNSkuIAotVGhlIGZ1bGwgbGlzdCBvZiBwb3NzaWJsZSBzdGF0dXMgY29kZXMgY2FuIGJlCi1mb3VuZCBpbiB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi50eHQiCi0+SFRUUCBzcGVjaWZpY2F0aW9uPC9hPiAoUkZDMjYxNiBzZWN0aW9uIDEwKS48L2RkPgotCi08ZHQ+PGNvZGU+MjMyNjwvY29kZT4gKDxjb2RlPiViPC9jb2RlPikKLTxkZD5UaGUgbGFzdCBlbnRyeSBpbmRpY2F0ZXMgdGhlIHNpemUgb2YgdGhlIG9iamVjdCByZXR1cm5lZCB0bwotdGhlIGNsaWVudCwgbm90IGluY2x1ZGluZyB0aGUgcmVzcG9uc2UgaGVhZGVycy4gIElmIG5vIGNvbnRlbnQKLXdhcyByZXR1cm5lZCB0byB0aGUgY2xpZW50LCB0aGlzIHZhbHVlIHdpbGwgYmUgIjxjb2RlPi08L2NvZGU+Ii4KLVRvIGxvZyAiPGNvZGU+MDwvY29kZT4iIGZvciBubyBjb250ZW50LCB1c2UgPGNvZGU+JUI8L2NvZGU+Ci1pbnN0ZWFkLjwvZGQ+Ci0KLTwvZGw+Ci0KLTxoND48YSBuYW1lPSJjb21iaW5lZCI+Q29tYmluZWQgTG9nIEZvcm1hdDwvYT48L2g0PgotCi08cD5Bbm90aGVyIGNvbW1vbmx5IHVzZWQgZm9ybWF0IHN0cmluZyBpcyBjYWxsZWQgdGhlCi1Db21iaW5lZCBMb2cgRm9ybWF0LiAgSXQgY2FuIGJlIHVzZWQgYXMgZm9sbG93cy48L3A+Ci0KLTxibG9ja3F1b3RlPjxjb2RlPgotTG9nRm9ybWF0ICIlaCAlbCAldSAldCBcIiVyXCIgJSZndDtzICViIFwiJXtSZWZlcmVyfWlcIiBcIiV7VXNlci1hZ2VudH1pXCIiIGNvbWJpbmVkPGJyPgotQ3VzdG9tTG9nIGxvZy9hY2Nlc19sb2cgY29tYmluZWQKLTwvY29kZT48L2Jsb2NrcXVvdGU+Ci0KLTxwPlRoaXMgZm9ybWF0IGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIENvbW1vbiBMb2cgRm9ybWF0LAotd2l0aCB0aGUgYWRkaXRpb24gb2YgdHdvIG1vcmUgZmllbGRzLiAgVGhlIGFjY2VzcyBsb2cgdW5kZXIgdGhpcwotZm9ybWF0IHdpbGwgbG9vayBsaWtlOjwvcD4KLQotPGJsb2NrcXVvdGU+PGNvZGU+Ci0xMjcuMC4wLjEgLSBmcmFuayBbMTAvT2N0LzIwMDA6MTM6NTU6MzYgLTA3MDBdICJHRVQgL2FwYWNoZV9wYi5naWYgSFRUUC8xLjAiIDIwMCAyMzI2ICJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3N0YXJ0Lmh0bWwiICJNb3ppbGxhLzQuMDggW2VuXSAoV2luOTg7IEkgO05hdikiCi08L2NvZGU+PC9ibG9ja3F1b3RlPgotCi08cD5UaGUgYWRkaXRpb25hbCBmaWVsZHMgYXJlOjwvcD4KLQotPGRsPgotCi08ZHQ+PGNvZGU+Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vc3RhcnQuaHRtbCI8L2NvZGU+Ci0oPGNvZGU+XCIle1JlZmVyZXJ9aVwiPC9jb2RlPik8L2R0PiA8ZGQ+VGhlICJSZWZlcmVyIiAoc2ljKSBIVFRQCi1yZXF1ZXN0IGhlYWRlci4gIFRoaXMgZ2l2ZXMgdGhlIHNpdGUgdGhhdCB0aGUgY2xpZW50IHJlcG9ydHMgaGF2aW5nCi1iZWVuIHJlZmVycmVkIGZyb20uICAoVGhpcyBzaG91bGQgYmUgdGhlIHBhZ2UgdGhhdCBsaW5rcyB0byBvciBpbmNsdWRlcwotPGNvZGU+L2FwYWNoZV9wYi5naWY8L2NvZGU+KS4KLQotPGR0Pjxjb2RlPiJNb3ppbGxhLzQuMDggW2VuXSAoV2luOTg7IEkgO05hdikiPC9jb2RlPgotKDxjb2RlPlwiJXtVc2VyLWFnZW50fWlcIjwvY29kZT4pPC9kdD4gPGRkPlRoZSBVc2VyLUFnZW50IEhUVFAgcmVxdWVzdAotaGVhZGVyLiAgVGhpcyBpcyB0aGUgaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gdGhhdCB0aGUgY2xpZW50IGJyb3dzZXIKLXJlcG9ydHMgYWJvdXQgaXRzZWxmLjwvZGQ+Ci0KLTwvZGw+Ci0KLTxoMz48YSBuYW1lPSJtdWx0aXBsZSI+TXVsdGlwbGUgQWNjZXNzIExvZ3M8L2E+PC9oMz4KLQotPHA+TXVsdGlwbGUgYWNjZXNzIGxvZ3MgY2FuIGJlIGNyZWF0ZWQgc2ltcGx5IGJ5IHNwZWNpZnlpbmcgbXVsdGlwbGUKLTxjb2RlPkN1c3RvbUxvZzwvY29kZT4gZGlyZWN0aXZlcyBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiAgRm9yCi1leGFtcGxlLCB0aGUgZm9sbG93aW5nIGRpcmVjdGl2ZXMgd2lsbCBjcmVhdGUgdGhyZWUgYWNjZXNzIGxvZ3MuICBUaGUKLWZpcnN0IGNvbnRhaW5zIHRoZSBiYXNpYyBDTEYgaW5mb3JtYXRpb24sIHdoaWxlIHRoZSBzZWNvbmQgYW5kIHRoaXJkCi1jb250YWluIHJlZmVyZXIgYW5kIGJyb3dzZXIgaW5mb3JtYXRpb24uICBUaGUgbGFzdCB0d28KLTxjb2RlPkN1c3RvbUxvZzwvY29kZT4gbGluZXMgc2hvdyBob3cgdG8gbWltaWMgdGhlIGVmZmVjdHMgb2YgdGhlCi08Y29kZT5SZWZlckxvZzwvY29kZT4gYW5kIDxjb2RlPkFnZW50TG9nPC9jb2RlPiBkaXJlY3RpdmVzLjwvcD4KLQotPGJsb2NrcXVvdGU+PGNvZGU+Ci1Mb2dGb3JtYXQgIiVoICVsICV1ICV0IFwiJXJcIiAlPnMgJWIiIGNvbW1vbjxicj4KLUN1c3RvbUxvZyBsb2dzL2FjY2Vzc19sb2cgY29tbW9uPGJyPgotQ3VzdG9tTG9nIGxvZ3MvcmVmZXJlcl9sb2cgIiV7UmVmZXJlcn1pIC0+ICVVIjxicj4KLUN1c3RvbUxvZyBsb2dzL2FnZW50X2xvZyAiJXtVc2VyLWFnZW50fWkiCi08L2NvZGU+PC9ibG9ja3F1b3RlPgotCi08cD5UaGlzIGV4YW1wbGUgYWxzbyBzaG93cyB0aGF0IGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZGVmaW5lIGEKLW5pY2tuYW1lIHdpdGggdGhlIDxjb2RlPkxvZ0Zvcm1hdDwvY29kZT4gZGlyZWN0aXZlLiAgSW5zdGVhZCwgdGhlIGxvZwotZm9ybWF0IGNhbiBiZSBzcGVjaWZpZWQgZGlyZWN0bHkgaW4gdGhlIDxjb2RlPkN1c3RvbUxvZzwvY29kZT4KLWRpcmVjdGl2ZS48L3A+Ci0KLTxoMz48YSBuYW1lPSJjb25kaXRpb25hbCI+Q29uZGl0aW9uYWwgTG9nZ2luZzwvYT48L2gzPgotCi08cD5UaGVyZSBhcmUgdGltZXMgd2hlbiBpdCBpcyBjb252ZW5pZW50IHRvIGV4Y2x1ZGUgY2VydGFpbiBlbnRyaWVzCi1mcm9tIHRoZSBhY2Nlc3MgbG9ncyBiYXNlZCBvbiBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGNsaWVudCByZXF1ZXN0LgotVGhpcyBpcyBlYXNpbHkgYWNjb21wbGlzaGVkIHdpdGggdGhlIGhlbHAgb2YgPGEKLWhyZWY9ImVudi5odG1sIj5lbnZpcm9ubWVudCB2YXJpYWJsZXM8L2E+LiAgRmlyc3QsIGFuIGVudmlyb25tZW50Ci12YXJpYWJsZSBtdXN0IGJlIHNldCB0byBpbmRpY2F0ZSB0aGF0IHRoZSByZXF1ZXN0IG1lZXRzIGNlcnRhaW4KLWNvbmRpdGlvbnMuICBUaGlzIGlzIHVzdWFsbHkgYWNjb21wbGlzaGVkIHdpdGggPGEKLWhyZWY9Im1vZC9tb2Rfc2V0ZW52aWYuaHRtbCNzZXRlbnZpZiI+U2V0RW52SWY8L2E+LiAgVGhlbiB0aGUKLTxjb2RlPmVudj08L2NvZGU+IGNsYXVzZSBvZiB0aGUgPGNvZGU+Q3VzdG9tTG9nPC9jb2RlPiBkaXJlY3RpdmUgaXMKLXVzZWQgdG8gaW5jbHVkZSBvciBleGNsdWRlIHJlcXVlc3RzIHdoZXJlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcwotc2V0LiAgU29tZSBleGFtcGxlczo8L3A+Ci0KLTxibG9ja3F1b3RlPjxjb2RlPgotIyBNYXJrIHJlcXVlc3RzIGZyb20gdGhlIGxvb3AtYmFjayBpbnRlcmZhY2U8YnI+Ci1TZXRFbnZJZiBSZW1vdGVfQWRkciAiMTI3XC4wXC4wXC4xIiBkb250bG9nPGJyPgotIyBNYXJrIHJlcXVlc3RzIGZvciB0aGUgcm9ib3RzLnR4dCBmaWxlPGJyPgotU2V0RW52SWYgUmVxdWVzdF9VUkkgIl4vcm9ib3RzXC50eHQkIiBkb250bG9nPGJyPgotIyBMb2cgd2hhdCByZW1haW5zPGJyPgotQ3VzdG9tTG9nIGxvZ3MvYWNjZXNzX2xvZyBjb21tb24gZW52PSFkb250bG9nCi08L2NvZGU+PC9ibG9ja3F1b3RlPgotCi08cD5BcyBhbm90aGVyIGV4YW1wbGUsIGNvbnNpZGVyIGxvZ2dpbmcgcmVxdWVzdHMgZnJvbSBlbmdsaXNoLXNwZWFrZXJzCi10byBvbmUgbG9nIGZpbGUsIGFuZCBub24tZW5nbGlzaCBzcGVha2VycyB0byBhIGRpZmZlcmVudCBsb2cgZmlsZS48L3A+Ci0KLTxibG9ja3F1b3RlPjxjb2RlPgotU2V0RW52SWYgQWNjZXB0LUxhbmd1YWdlICJlbiIgZW5nbGlzaDxicj4KLUN1c3RvbUxvZyBsb2dzL2VuZ2xpc2hfbG9nIGNvbW1vbiBlbnY9ZW5nbGlzaDxicj4KLUN1c3RvbUxvZyBsb2dzL25vbl9lbmdsaXNoX2xvZyBjb21tb24gZW52PSFlbmdsaXNoCi08L2NvZGU+PC9ibG9ja3F1b3RlPgotCi08cD5BbHRob3VnaCB3ZSBoYXZlIGp1c3Qgc2hvd24gdGhhdCBjb25kaXRpb25hbCBsb2dnaW5nIGlzIHZlcnkKLXBvd2VyZnVsIGFuZCBmbGV4aWJseSwgaXQgaXMgbm90IHRoZSBvbmx5IHdheSB0byBjb250cm9sIHRoZSBjb250ZW50cwotb2YgdGhlIGxvZ3MuICBMb2cgZmlsZXMgYXJlIG1vcmUgdXNlZnVsIHdoZW4gdGhleSBjb250YWluIGEgY29tcGxldGUKLXJlY29yZCBvZiBzZXJ2ZXIgYWN0aXZpdHkuICBJdCBpcyBvZnRlbiBlYXNpZXIgdG8gc2ltcGx5IHBvc3QtcHJvY2VzcwotdGhlIGxvZyBmaWxlcyB0byByZW1vdmUgcmVxdWVzdHMgdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gY29uc2lkZXIuPC9wPgotCi08aHI+Ci0KLTxoMj48YSBuYW1lPSJyb3RhdGlvbiI+TG9nIFJvdGF0aW9uPC9hPjwvaDI+Ci0KLTxwPk9uIGV2ZW4gYSBtb2RlcmF0ZWx5IGJ1c3kgc2VydmVyLCB0aGUgcXVhbnRpdHkgb2YgaW5mb3JtYXRpb24KLXN0b3JlZCBpbiB0aGUgbG9nIGZpbGVzIGlzIHZlcnkgbGFyZ2UuICBUaGUgYWNjZXNzIGxvZyBmaWxlIHR5cGljYWxseQotZ3Jvd3MgMSBNQiBvciBtb3JlIHBlciAxMCwwMDAgcmVxdWVzdHMuICBJdCB3aWxsIGNvbnNlcXVlbnRseSBiZQotbmVjZXNzYXJ5IHRvIHBlcmlvZGljYWxseSByb3RhdGUgdGhlIGxvZyBmaWxlcyBieSBtb3Zpbmcgb3IgZGVsZXRpbmcKLXRoZSBleGlzdGluZyBsb2dzLiAgVGhpcyBjYW5ub3QgYmUgZG9uZSB3aGlsZSB0aGUgc2VydmVyIGlzIHJ1bm5pbmcsCi1iZWNhdXNlIEFwYWNoZSB3aWxsIGNvbnRpbnVlIHdyaXRpbmcgdG8gdGhlIG9sZCBsb2cgZmlsZSBhcyBsb25nIGFzIGl0Ci1ob2xkcyB0aGUgZmlsZSBvcGVuLiAgSW5zdGVhZCwgdGhlIHNlcnZlciBtdXN0IGJlIDxhCi1ocmVmPSJzdG9wcGluZy5odG1sIj5yZXN0YXJ0ZWQ8L2E+IGFmdGVyIHRoZSBsb2cgZmlsZXMgYXJlIG1vdmVkIG9yCi1kZWxldGVkIHNvIHRoYXQgaXQgd2lsbCBvcGVuIG5ldyBsb2cgZmlsZXMuPC9wPgotCi08cD5CeSB1c2luZyBhIDxlbT5ncmFjZWZ1bDwvZW0+IHJlc3RhcnQsIHRoZSBzZXJ2ZXIgY2FuIGJlIGluc3RydWN0ZWQKLXRvIG9wZW4gbmV3IGxvZyBmaWxlcyB3aXRob3V0IGxvc2luZyBhbnkgZXhpc3Rpbmcgb3IgcGVuZGluZwotY29ubmVjdGlvbnMgZnJvbSBjbGllbnRzLiAgSG93ZXZlciwgaW4gb3JkZXIgdG8gYWNjb21wbGlzaCB0aGlzLCB0aGUKLXNlcnZlciBtdXN0IGNvbnRpbnVlIHRvIHdyaXRlIHRvIHRoZSBvbGQgbG9nIGZpbGVzIHdoaWxlIGl0IGZpbmlzaGVzCi1zZXJ2aW5nIG9sZCByZXF1ZXN0cy4gIEl0IGlzIHRoZXJlZm9yZSBuZWNlc3NhcnkgdG8gd2FpdCBmb3Igc29tZSB0aW1lCi1hZnRlciB0aGUgcmVzdGFydCBiZWZvcmUgZG9pbmcgYW55IHByb2Nlc3Npbmcgb24gdGhlIGxvZyBmaWxlcy4gIEEKLXR5cGljYWwgc2NlbmFyaW8gdGhhdCBzaW1wbHkgcm90YXRlcyB0aGUgbG9ncyBhbmQgY29tcHJlc3NlcyB0aGUgb2xkCi1sb2dzIHRvIHNhdmUgc3BhY2UgaXM6PC9wPgotCi08YmxvY2txdW90ZT48Y29kZT4KLW12IGFjY2Vzc19sb2cgYWNjZXNzX2xvZy5vbGQ8YnI+Ci1tdiBlcnJvcl9sb2cgZXJyb3JfbG9nLm9sZDxicj4KLWFwYWNoZWN0bCBncmFjZWZ1bDxicj4KLXNsZWVwIDYwMDxicj4KLWd6aXAgYWNjZXNzX2xvZy5vbGQgZXJyb3JfbG9nLm9sZAotPC9jb2RlPjwvYmxvY2txdW90ZT4KLQotPHA+QW5vdGhlciB3YXkgdG8gcGVyZm9ybSBsb2cgcm90YXRpb24gaXMgdXNpbmcgPGEgaHJlZj0iI3BpcGVkIj5waXBlZAotbG9nczwvYT4gYXMgZGlzY3Vzc2VkIGluIHRoZSBuZXh0IHNlY3Rpb24uPC9wPgotCi08aHI+Ci0KLTxoMj48YSBuYW1lPSJwaXBlZCI+UGlwZWQgTG9nczwvYT48L2gyPgotCi08cD5BcGFjaGUgSFRUUEQgaXMgY2FwYWJsZSBvZiB3cml0aW5nIGVycm9yIGFuZCBhY2Nlc3MgbG9nIGZpbGVzCi10aHJvdWdoIGEgcGlwZSB0byBhbm90aGVyIHByb2Nlc3MsIHJhdGhlciB0aGFuIGRpcmVjdGx5IHRvIGEgZmlsZS4KLVRoaXMgY2FwYWJpbGl0eSBkcmFtYXRpY2FsbHkgaW5jcmVhc2VzIHRoZSBmbGV4aWJpbGl0eSBvZiBsb2dnaW5nLAotd2l0aG91dCBhZGRpbmcgY29kZSB0byB0aGUgbWFpbiBzZXJ2ZXIuICBJbiBvcmRlciB0byB3cml0ZSBsb2dzIHRvIGEKLXBpcGUsIHNpbXBseSByZXBsYWNlIHRoZSBmaWxlbmFtZSB3aXRoIHRoZSBwaXBlIGNoYXJhY3RlcgotIjxjb2RlPnw8L2NvZGU+IiwgZm9sbG93ZWQgYnkgdGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgd2hpY2ggc2hvdWxkCi1hY2NlcHQgbG9nIGVudHJpZXMgb24gaXRzIHN0YW5kYXJkIGlucHV0LiAgQXBhY2hlIHdpbGwgc3RhcnQgdGhlCi1waXBlZC1sb2cgcHJvY2VzcyB3aGVuIHRoZSBzZXJ2ZXIgc3RhcnRzLCBhbmQgd2lsbCByZXN0YXJ0IGl0IGlmIGl0Ci1jcmFzaGVzIHdoaWxlIHRoZSBzZXJ2ZXIgaXMgcnVubmluZy4gIChUaGlzIGxhc3QgZmVhdHVyZSBpcyB3aHkgd2UgY2FuCi1yZWZlciB0byB0aGlzIHRlY2huaXF1ZSBhcyAicmVsaWFibGUgcGlwZWQgbG9nZ2luZyIuKTwvcD4KLQotPHA+UGlwZWQgbG9nIHByb2Nlc3NlcyBhcmUgc3Bhd25lZCBieSB0aGUgcGFyZW50IEFwYWNoZSBIVFRQRCBwcm9jZXNzLAotYW5kIGluaGVyaXQgdGhlIHVzZXJpZCBvZiB0aGF0IHByb2Nlc3MuICBUaGlzIG1lYW5zIHRoYXQgcGlwZWQgbG9nCi1wcm9ncmFtcyB1c3VhbGx5IHJ1biBhcyByb290LiAgSXQgaXMgdGhlcmVmb3JlIHZlcnkgaW1wb3J0YW50IHRvIGtlZXAKLXRoZSBwcm9ncmFtcyBzaW1wbGUgYW5kIHNlY3VyZS48L3A+Ci0KLTxwPlNvbWUgc2ltcGxlIGV4YW1wbGVzIHVzaW5nIHBpcGVkIGxvZ3M6PC9wPgotCi08YmxvY2txdW90ZT48Y29kZT4KLSMgY29tcHJlc3NlZCBsb2dzPGJyPgotQ3VzdG9tTG9nICJ8L3Vzci9iaW4vZ3ppcCAtYyA+PiAvdmFyL2xvZy9hY2Nlc3NfbG9nLmd6IiBjb21tb248YnI+Ci0jIGFsbW9zdC1yZWFsLXRpbWUgbmFtZSByZXNvbHV0aW9uPGJyPgotQ3VzdG9tTG9nICJ8L3Vzci9sb2NhbC9hcGFjaGUvYmluL2xvZ3Jlc29sdmUgPj4gL3Zhci9sb2cvYWNjZXNzX2xvZyIgY29tbW9uCi08L2NvZGU+PC9ibG9ja3F1b3RlPgotCi08cD5Ob3RpY2UgdGhhdCBxdW90ZXMgYXJlIHVzZWQgdG8gZW5jbG9zZSB0aGUgZW50aXJlIGNvbW1hbmQKLXRoYXQgd2lsbCBiZSBjYWxsZWQgZm9yIHRoZSBwaXBlLiAgQWx0aG91Z2ggdGhlc2UgZXhhbXBsZXMgYXJlCi1mb3IgdGhlIGFjY2VzcyBsb2csIHRoZSBzYW1lIHRlY2huaXF1ZSBjYW4gYmUgdXNlZCBmb3IgdGhlCi1lcnJvciBsb2cuPC9wPgotCi08cD5PbmUgaW1wb3J0YW50IHVzZSBvZiBwaXBlZCBsb2dzIGlzIHRvIGFsbG93IGxvZyByb3RhdGlvbiB3aXRob3V0Ci1oYXZpbmcgdG8gcmVzdGFydCB0aGUgc2VydmVyLiAgQXBhY2hlIEhUVFBEIGluY2x1ZGVzIGEgc2ltcGxlIHByb2dyYW0KLWNhbGxlZCA8YSBocmVmPSJwcm9ncmFtcy9yb3RhdGVsb2dzLmh0bWwiPnJvdGF0ZWxvZ3M8L2E+IGZvciB0aGlzCi1wdXJwb3NlLiAgRm9yIGV4YW1wbGUsIHRvIHJvdGF0ZSB0aGUgbG9ncyBldmVyeSAyNCBob3VycywgeW91IGNhbgotdXNlOjwvcD4KLQotPGJsb2NrcXVvdGU+PGNvZGU+Ci1DdXN0b21Mb2cgInwvdXNyL2xvY2FsL2FwYWNoZS9iaW4vcm90YXRlbG9ncyAvdmFyL2xvZy9hY2Nlc3NfbG9nIDg2NDAwIiBjb21tb24KLTwvY29kZT48L2Jsb2NrcXVvdGU+Ci0KLTxwPkEgc2ltaWxhciwgYnV0IG11Y2ggbW9yZSBmbGV4aWJsZSBsb2cgcm90YXRpb24gcHJvZ3JhbQotY2FsbGVkIDxhIGhyZWY9Imh0dHA6Ly93d3cuZm9yZC1tYXNvbi5jby51ay9yZXNvdXJjZXMvY3Jvbm9sb2cvIj5jcm9ub2xvZzwvYT4KLWlzIGF2YWlsYWJsZSBhdCBhbiBleHRlcm5hbCBzaXRlLjwvcD4KLQotPHA+QXMgd2l0aCBjb25kaXRpb25hbCBsb2dnaW5nLCBwaXBlZCBsb2dzIGFyZSBhIHZlcnkgcG93ZXJmdWwgdG9vbCwKLWJ1dCB0aGV5IHNob3VsZCBub3QgYmUgdXNlZCB3aGVyZSBhIHNpbXBsZXIgc29sdXRpb24gbGlrZQotb2ZmLWxpbmUgcG9zdC1wcm9jZXNzaW5nIGlzIGF2YWlsYWJsZS48L3A+Ci0KLTxocj4KLQotPGgyPjxhIG5hbWU9InZpcnR1YWxob3N0cyI+VmlydHVhbCBIb3N0czwvYT48L2gyPgotCi08cD5XaGVuIHJ1bm5pbmcgYSBzZXJ2ZXIgd2l0aCBtYW55IDxhIGhyZWY9InZob3N0cy8iPnZpcnR1YWwKLWhvc3RzPC9hPiwgdGhlcmUgYXJlIHNldmVyYWwgb3B0aW9ucyBmb3IgZGVhbGluZyB3aXRoIGxvZyBmaWxlcy4KLUZpcnN0LCBpdCBpcyBwb3NzaWJsZSB0byB1c2UgbG9ncyBleGFjdGx5IGFzIGluIGEgc2luZ2xlLWhvc3Qgc2VydmVyLgotU2ltcGx5IGJ5IHBsYWNpbmcgdGhlIGxvZ2dpbmcgZGlyZWN0aXZlcyBvdXRzaWRlIHRoZQotPGNvZGU+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvY29kZT4gc2VjdGlvbnMgaW4gdGhlIG1haW4gc2VydmVyIGNvbnRleHQsCi1pdCBpcyBwb3NzaWJsZSB0byBsb2cgYWxsIHJlcXVlc3RzIGluIHRoZSBzYW1lIGFjY2VzcyBsb2cgYW5kIGVycm9yCi1sb2cuICBUaGlzIHRlY2huaXF1ZSBkb2VzIG5vdCBhbGxvdyBmb3IgZWFzeSBjb2xsZWN0aW9uIG9mIHN0YXRpc3RpY3MKLW9uIGluZGl2aWR1YWwgdmlydHVhbCBob3N0cy48L3A+Ci0KLTxwPklmIDxjb2RlPkN1c3RvbUxvZzwvY29kZT4gb3IgPGNvZGU+RXJyb3JMb2c8L2NvZGU+IGRpcmVjdGl2ZXMgYXJlCi1wbGFjZWQgaW5zaWRlIGEgPGNvZGU+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvY29kZT4gc2VjdGlvbiwgYWxsIHJlcXVlc3RzCi1vciBlcnJvcnMgZm9yIHRoYXQgdmlydHVhbCBob3N0IHdpbGwgYmUgbG9nZ2VkIG9ubHkgdG8gdGhlIHNwZWNpZmllZAotZmlsZS4gIEFueSB2aXJ0dWFsIGhvc3Qgd2hpY2ggZG9lcyBub3QgaGF2ZSBsb2dnaW5nIGRpcmVjdGl2ZXMgd2lsbAotc3RpbGwgaGF2ZSBpdHMgcmVxdWVzdHMgc2VudCB0byB0aGUgbWFpbiBzZXJ2ZXIgbG9ncy4gIFRoaXMgdGVjaG5pcXVlCi1pcyB2ZXJ5IHVzZWZ1bCBmb3IgYSBzbWFsbCBudW1iZXIgb2YgdmlydHVhbCBob3N0cywgYnV0IGlmIHRoZSBudW1iZXIKLW9mIGhvc3RzIGlzIHZlcnkgbGFyZ2UsIGl0IGNhbiBiZSBjb21wbGljYXRlZCB0byBtYW5hZ2UuICBJbiBhZGRpdGlvbiwKLWl0IGNhbiBvZnRlbiBjcmVhdGUgcHJvYmxlbXMgd2l0aCA8YQotaHJlZj0idmhvc3RzL2ZkLWxpbWl0cy5odG1sIj5pbnN1ZmZpY2llbnQgZmlsZSBkZXNjcmlwdG9yczwvYT4uPC9wPgotCi08cD5Gb3IgdGhlIGFjY2VzcyBsb2csIHRoZXJlIGlzIGEgdmVyeSBnb29kIGNvbXByb21pc2UuICBCeSBhZGRpbmcKLWluZm9ybWF0aW9uIG9uIHRoZSB2aXJ0dWFsIGhvc3QgdG8gdGhlIGxvZyBmb3JtYXQgc3RyaW5nLAotaXQgaXMgcG9zc2libGUgdG8gbG9nIGFsbCBob3N0cyB0byB0aGUgc2FtZSBsb2csIGFuZCBsYXRlcgotc3BsaXQgdGhlIGxvZyBpbnRvIGluZGl2aWR1YWwgZmlsZXMuICBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlCi1mb2xsb3dpbmcgZGlyZWN0aXZlcy48L3A+Ci0KLTxibG9ja3F1b3RlPjxjb2RlPgotTG9nRm9ybWF0ICIldiAlbCAldSAldCBcIiVyXCIgJT5zICViIiBjb21vbnZob3N0PGJyPgotQ3VzdG9tTG9nIGxvZ3MvYWNjZXNzX2xvZyBjb21vbnZob3N0Ci08L2NvZGU+PC9ibG9ja3F1b3RlPgotCi08cD5UaGUgPGNvZGU+JXY8L2NvZGU+IGlzIHVzZWQgdG8gbG9nIHRoZSBuYW1lIG9mIHRoZSB2aXJ0dWFsIGhvc3QKLXRoYXQgaXMgc2VydmluZyB0aGUgcmVxdWVzdC4gIFRoZW4gYSBwcm9ncmFtIGxpa2UgPGEKLWhyZWY9InByb2dyYW1zL290aGVyLmh0bWwiPnNwbGl0LWxvZ2ZpbGU8L2E+IGNhbiBiZSB1c2VkIHRvCi1wb3N0LXByb2Nlc3MgdGhlIGFjY2VzcyBsb2cgaW4gb3JkZXIgdG8gc3BsaXQgaXQgaW50byBvbmUgZmlsZSBwZXIKLXZpcnR1YWwgaG9zdC48L3A+Ci0KLTxwPlVuZm9ydHVuYXRlbHksIG5vIHNpbWlsYXIgdGVjaG5pcXVlIGlzIGF2YWlsYWJsZSBmb3IgdGhlIGVycm9yIGxvZywKLXNvIHlvdSBtdXN0IGNob29zZSBiZXR3ZWVuIG1peGluZyBhbGwgdmlydHVhbCBob3N0cyBpbiB0aGUgc2FtZSBlcnJvcgotbG9nIGFuZCB1c2luZyBvbmUgZXJyb3IgbG9nIHBlciB2aXJ0dWFsIGhvc3QuPC9wPgotCi08aHI+Ci0KLTxoMj48YSBuYW1lPSJvdGhlciI+T3RoZXIgTG9nIEZpbGVzPC9hPjwvaDI+Ci0KLTx0YWJsZSBib3JkZXI9MT48dHI+PHRkIHZhbGlnbj0idG9wIj4KLTxzdHJvbmc+UmVsYXRlZCBNb2R1bGVzPC9zdHJvbmc+PGJyPjxicj4KLQotPGEgaHJlZj0ibW9kL21vZF9jZ2kuaHRtbCI+bW9kX2NnaTwvYT48YnI+Ci08YSBocmVmPSJtb2QvbW9kX3Jld3JpdGUuaHRtbCI+bW9kX3Jld3JpdGU8L2E+Ci0KLTwvdGQ+PHRkIHZhbGlnbj0idG9wIj4KLTxzdHJvbmc+UmVsYXRlZCBEaXJlY3RpdmVzPC9zdHJvbmc+PGJyPjxicj4KLQotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNwaWRmaWxlIj5QaWRGaWxlPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9tb2RfcmV3cml0ZS5odG1sI1Jld3JpdGVMb2ciPlJld3JpdGVMb2c8L2E+PC9icj4KLTxhIGhyZWY9Im1vZC9tb2RfcmV3cml0ZS5odG1sI1Jld3JpdGVMb2dMZXZlbCI+UmV3cml0ZUxvZ0xldmVsPC9hPjwvYnI+Ci08YSBocmVmPSJtb2QvbW9kX2NnaS5odG1sI3NjcmlwdGxvZyI+U2NyaXB0TG9nPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9tb2RfY2dpLmh0bWwjc2NyaXB0bG9nbGVuZ3RoIj5TY3JpcHRMb2dMZW5ndGg8L2E+PGJyPgotPGEgaHJlZj0ibW9kL21vZF9jZ2kuaHRtbCNzY3JpcHRsb2didWZmZXIiPlNjcmlwdExvZ0J1ZmZlcjwvYT4KLQotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxoMz48YSBuYW1lPSJwaWRmaWxlIj5QSUQgRmlsZTwvYT48L2gzPgotCi08cD5PbiBzdGFydHVwLCBBcGFjaGUgSFRUUEQgc2F2ZXMgdGhlIHByb2Nlc3MgaWQgb2YgdGhlIHBhcmVudCBodHRwZAotcHJvY2VzcyB0byB0aGUgZmlsZSA8Y29kZT5sb2dzL2h0dHBkLnBpZDwvY29kZT4uIFRoaXMgZmlsZW5hbWUgY2FuIGJlCi1jaGFuZ2VkIHdpdGggdGhlIDxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjcGlkZmlsZSI+UGlkRmlsZTwvQT4KLWRpcmVjdGl2ZS4gVGhlIHByb2Nlc3MtaWQgaXMgZm9yIHVzZSBieSB0aGUgYWRtaW5pc3RyYXRvciBpbgotcmVzdGFydGluZyBhbmQgdGVybWluYXRpbmcgdGhlIGRhZW1vbiBieSBzZW5kaW5nIHNpZ25hbHMKLXRvIHRoZSBwYXJlbnQgcHJvY2Vzczsgb24gV2luZG93cywgdXNlIHRoZSAtayBjb21tYW5kIGxpbmUKLW9wdGlvbiBpbnN0ZWFkLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSA8QQotSFJFRj0ic3RvcHBpbmcuaHRtbCI+U3RvcHBpbmcgYW5kIFJlc3RhcnRpbmc8L0E+IHBhZ2UuCi0KLTxoMz48YSBuYW1lPSJzY3JpcHRsb2ciPlNjcmlwdCBMb2c8L2E+PC9oMz4KLQotPHA+SW4gb3JkZXIgdG8gYWlkIGluIGRlYnVnZ2luZywgdGhlCi08YSBocmVmPSJtb2QvbW9kX2NnaS5odG1sI3NjcmlwdGxvZyI+U2NyaXB0TG9nPC9hPgotZGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gcmVjb3JkIHRoZSBpbnB1dCB0byBhbmQgb3V0cHV0IGZyb20KLUNHSSBzY3JpcHRzLiAgVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGluIHRlc3RpbmcgLSBub3QgZm9yCi1saXZlIHNlcnZlcnMuICBNb3JlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBpbiB0aGUKLTxhIGhyZWY9Im1vZC9tb2RfY2dpLmh0bWwiPm1vZF9jZ2kgZG9jdW1lbnRhdGlvbjwvYT4uCi0KLTxoMz48YSBuYW1lPSJyZXdyaXRlbG9nIj5SZXdyaXRlIExvZzwvYT48L2gzPgotCi08cD5XaGVuIHVzaW5nIHRoZSBwb3dlcmZ1bCBhbmQgY29tcGxleCBmZWF0dXJlcyBvZiA8YQotaHJlZj0ibW9kL21vZF9yZXdyaXRlLmh0bWwiPm1vZF9yZXdyaXRlPC9hPiwgaXQgaXMgYWxtb3N0IGFsd2F5cwotbmVjZXNzYXJ5IHRvIHVzZSB0aGUgPGEKLWhyZWY9Im1vZC9tb2RfcmV3cml0ZS5odG1sI1Jld3JpdGVMb2ciPlJld3JpdGVMb2c8L2E+IHRvIGhlbHAgaW4KLWRlYnVnZ2luZy4gIFRoaXMgbG9nIGZpbGUgcHJvZHVjZXMgYSBkZXRhaWxlZCBhbmFseXNpcyBvZiBob3cgdGhlCi1yZXdyaXRpbmcgZW5naW5lIHRyYW5zZm9ybXMgcmVxdWVzdHMuICBUaGUgbGV2ZWwgb2YgZGV0YWlsIGlzCi1jb250cm9sbGVkIGJ5IHRoZSA8YQotaHJlZj0ibW9kL21vZF9yZXdyaXRlLmh0bWwjUmV3cml0ZUxvZ0xldmVsIj5SZXdyaXRlTG9nTGV2ZWw8L2E+Ci1kaXJlY3RpdmUuPC9wPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbWlzYy9pbmRleC5odG1sIGIvZG9jcy9tYW51YWwvbWlzYy9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGQ3ZmJlLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21pc2MvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDIuMC8vRU4iPgotPEhUTUw+Ci0gPEhFQUQ+Ci0gIDxUSVRMRT5BcGFjaGUgTWlzY2VsbGFuZW91cyBEb2N1bWVudGF0aW9uPC9USVRMRT4KLSA8L0hFQUQ+Ci0KLSA8Qk9EWT4KLSAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLSAgPEgxPkFwYWNoZSBNaXNjZWxsYW5lb3VzIERvY3VtZW50YXRpb248L2gxPgotCi0gIDxQPgotICBCZWxvdyBpcyBhIGxpc3Qgb2YgYWRkaXRpb25hbCBkb2N1bWVudGF0aW9uIHBhZ2VzIHRoYXQgYXBwbHkgdG8gdGhlCi0gIEFwYWNoZSB3ZWIgc2VydmVyIGRldmVsb3BtZW50IHByb2plY3QuCi0gIDwvUD4KLSAgPERMPgotICAgPERUPjxBCi0gICAgICAgCUhSRUY9IkFQSS5odG1sIgotICAgICAgID5BUEk8L0E+Ci0gICA8L0RUPgotICAgPEREPkRlc2NyaXB0aW9uIG9mIEFwYWNoZSdzIEFwcGxpY2F0aW9uIFByb2dyYW1taW5nIEludGVyZmFjZS4KLSAgIDwvREQ+Ci0gICA8RFQ+PEEKLSAgICAgICAJSFJFRj0iRkFRLmh0bWwiCi0gICAgICAgPkZBUTwvQT4KLSAgIDwvRFQ+Ci0gICA8REQ+RnJlcXVlbnRseS1Bc2tlZCBRdWVzdGlvbnMgY29uY2VybmluZyB0aGUgQXBhY2hlIHByb2plY3QgYW5kIHNlcnZlcgotICAgPC9ERD4KLSAgIDxEVD48QQotICAgICAgIAlIUkVGPSJjbGllbnRfYmxvY2tfYXBpLmh0bWwiCi0gICAgICAgPlJlYWRpbmcgQ2xpZW50IElucHV0IGluIEFwYWNoZSAxLjI8L0E+Ci0gICA8L0RUPgotICAgPEREPkRlc2NyaWJlcyBkaWZmZXJlbmNlcyBiZXR3ZWVuIEFwYWNoZSAxLjEgYW5kIDEuMiBpbiBob3cgbW9kdWxlcwotICAgIHJlYWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgY2xpZW50Ci0gICA8L0REPgotICAgPERUPjxBCi0gICAgICAgCUhSRUY9ImNvbXBhdF9ub3Rlcy5odG1sIgotICAgICAgID5Db21wYXRpYmlsaXR5IHdpdGggTkNTQTwvQT4KLSAgIDwvRFQ+Ci0gICA8REQ+Tm90ZXMgYWJvdXQgQXBhY2hlJ3MgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBOQ1NBIHNlcnZlcgotICAgPC9ERD4KLSAgIDxEVD48QQotICAgICAgIAlIUkVGPSJmaW5fd2FpdF8yLmh0bWwiCi0gICAgICAgPjxTQU1QPkZJTl9XQUlUXzI8L1NBTVA+PC9BPgotICAgPC9EVD4KLSAgIDxERD5BIGRlc2NyaXB0aW9uIG9mIHRoZSBjYXVzZXMgb2YgQXBhY2hlIHByb2Nlc3NlcyBnb2luZyBpbnRvIHRoZQotICAgIDxTQU1QPkZJTl9XQUlUXzI8L1NBTVA+IHN0YXRlLCBhbmQgd2hhdCB5b3UgY2FuIGRvIGFib3V0IGl0Ci0gICA8L0REPgotICAgPERUPjxBCi0gICAgICAgCUhSRUY9Imhvd3RvLmh0bWwiCi0gICAgICAgPiZxdW90O0hvdy1UbyZxdW90OzwvQT4KLSAgIDwvRFQ+Ci0gICA8REQ+SW5zdHJ1Y3Rpb25zIGFib3V0IGhvdyB0byBhY2NvbXBsaXNoIHNvbWUgY29tbW9ubHktZGVzaXJlZCBzZXJ2ZXIKLSAgICBmdW5jdGlvbmFsaXR5IGNoYW5nZXMKLSAgIDwvREQ+Ci0gICA8RFQ+PEEKLSAgICAgICAJSFJFRj0ia25vd25fYnVncy5odG1sIgotICAgICAgID5Lbm93biBCdWdzPC9BPgotICAgPC9EVD4KLSAgIDxERD5KdXN0IHdoYXQgaXQgc2F5cyAtIGEgbGlzdCBvZiBrbm93biBidWdzIGluIGVhY2ggb2YgdGhlIEFwYWNoZSByZWxlYXNlcwotICAgPC9ERD4KLSAgIDxEVD48QQotICAgICAgIAlIUkVGPSJub3BncC5odG1sIgotICAgICAgID5ObyBQR1A8L0E+Ci0gICA8L0RUPgotICAgPEREPldoeSB3ZSB0b29rIFBFTSBhbmQgUEdQIHN1cHBvcnQgb3V0IG9mIHRoZSBiYXNlIEFwYWNoZSBkaXN0cmlidXRpb24KLSAgIDwvREQ+Ci0gICA8RFQ+PEEKLSAgICAgICAJSFJFRj0icGVyZi1ic2Q0NC5odG1sIgotICAgICAgID5QZXJmb3JtYW5jZSBOb3RlcyAoQlNEIDQuNCk8L0E+Ci0gICA8L0RUPgotICAgPEREPlNvbWUgbm90ZXMgYWJvdXQgd2F5cyB0byBpbXByb3ZlL29wdGltaXNlIEFwYWNoZSBwZXJmb3JtYW5jZSBvbgotICAgIEJTRCA0LjQgc3lzdGVtcwotICAgPC9ERD4KLSAgIDxEVD48QQotICAgICAgIAlIUkVGPSJwZXJmLWRlYy5odG1sIgotICAgICAgID5QZXJmb3JtYW5jZSBOb3RlcyAoRGlnaXRhbCBVTklYKTwvQT4KLSAgIDwvRFQ+Ci0gICA8REQ+RXh0cmFjdHMgb2YgVVNFTkVUIHBvc3RpbmdzIGRlc2NyaWJpbmcgaG93IHRvIG9wdGltaXNlIEFwYWNoZQotICAgIHBlcmZvcm1hbmNlIG9uIERpZ2l0YWwgVU5JWCBzeXN0ZW1zCi0gICA8L0REPgotICAgPERUPjxBCi0gICAgICAgCUhSRUY9InBlcmYuaHRtbCIKLSAgICAgICA+UGVyZm9ybWFuY2UgTm90ZXMgKEdlbmVyYWwpPC9BPgotICAgPC9EVD4KLSAgIDxERD5Tb21lIGdlbmVyaWMgbm90ZSBhYm91dCBob3cgdG8gaW1wcm92ZSBBcGFjaGUgcGVyZm9ybWFuY2UKLSAgIDwvREQ+Ci0gICA8RFQ+PEEKLSAgICAgICAJSFJFRj0ic2VjdXJpdHlfdGlwcy5odG1sIgotICAgICAgID5TZWN1cml0eSBUaXBzPC9BPgotICAgPC9EVD4KLSAgIDxERD5Tb21lICZxdW90O2RvJnF1b3Q7cyAgLSBhbmQgJnF1b3Q7ZG9uJ3QmcXVvdDtzIC0gZm9yIGtlZXBpbmcgeW91cgotICAgIEFwYWNoZSB3ZWIgc2l0ZSBzZWN1cmUKLSAgIDwvREQ+Ci0gICA8RFQ+PEEKLSAgICAgICAJSFJFRj0idmlmLWluZm8uaHRtbCIKLSAgICAgICA+VmlydHVhbCBIb3N0cyAoSVAtYmFzZWQpPC9BPgotICAgPC9EVD4KLSAgIDxERD5FeGNlcnB0cyBhbmQgbm90ZXMgYWJvdXQgY29uZmlndXJpbmcgYW5kIHVzaW5nIEFwYWNoZSBJUC1iYXNlZCB2aXJ0dWFsCi0gICAgaG9zdHMKLSAgIDwvREQ+Ci0gICA8RFQ+PEEKLSAgICAgICAJSFJFRj0id2luZG96X2tlZXBhbGl2ZS5odG1sIgotICAgICAgID5XaW5kb3dzIEJ1ZyB3aXRoIFdlYiBLZWVwYWxpdmU8L0E+Ci0gICA8L0RUPgotICAgPEREPkEgYnJpZWYgZGVzY3JpcHRpb24gb2YgYSBrbm93biBwcm9ibGVtIHdpdGggTWljcm9zb2Z0IFdpbmRvd3MgYW5kCi0gICAgd2ViIHNpdGVzIGFjY2Vzc2VkIHVzaW5nIGtlZXBhbGl2ZSBjb25uZWN0aW9ucwotICAgPC9ERD4KLSAgPC9ETD4KLQotICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotIDwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21pc2MvcGVyZi10dW5pbmcuaHRtbCBiL2RvY3MvbWFudWFsL21pc2MvcGVyZi10dW5pbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmOGM4My4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9taXNjL3BlcmYtdHVuaW5nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MjAgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BcGFjaGUgUGVyZm9ybWFuY2UgTm90ZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiIgdGV4dD0iIzAwMDAwMCIgbGluaz0iIzAwMDBmZiIgdmxpbms9IiMwMDAwODAiIGFsaW5rPSIjZmYwMDAwIj4KLQotPGgxPkFwYWNoZSBQZXJmb3JtYW5jZSBOb3RlczwvaDE+Ci0KLTxwPkF1dGhvcjogRGVhbiBHYXVkZXQKLQotPGgzPkludHJvZHVjdGlvbjwvaDM+Ci08cD5BcGFjaGUgaXMgYSBnZW5lcmFsIHdlYnNlcnZlciwgd2hpY2ggaXMgZGVzaWduZWQgdG8gYmUgY29ycmVjdCBmaXJzdCwgYW5kCi1mYXN0IHNlY29uZC4gIEV2ZW4gc28sIGl0J3MgcGVyZm9ybWFuY2UgaXMgcXVpdGUgc2F0aXNmYWN0b3J5LiAgTW9zdAotc2l0ZXMgaGF2ZSBsZXNzIHRoYW4gMTBNYml0cyBvZiBvdXRnb2luZyBiYW5kd2lkdGgsIHdoaWNoIEFwYWNoZSBjYW4KLWZpbGwgdXNpbmcgb25seSBhIGxvdyBlbmQgUGVudGl1bS1iYXNlZCB3ZWJzZXJ2ZXIuICBJbiBwcmFjdGljZSBzaXRlcwotd2l0aCBtb3JlIGJhbmR3aWR0aCByZXF1aXJlIG1vcmUgdGhhbiBvbmUgbWFjaGluZSB0byBmaWxsIHRoZSBiYW5kd2lkdGgKLWR1ZSB0byBvdGhlciBjb25zdHJhaW50cyAoc3VjaCBhcyBDR0kgb3IgZGF0YWJhc2UgdHJhbnNhY3Rpb24gb3ZlcmhlYWQpLgotRm9yIHRoZXNlIHJlYXNvbnMgdGhlIGRldmVsb3BtZW50IGZvY3VzIGhhcyBiZWVuIG1vc3RseSBvbiBjb3JyZWN0bmVzcwotYW5kIGNvbmZpZ3VyYWJpbGl0eS4KLQotPHA+VW5mb3J0dW5hdGVseSBtYW55IGZvbGtzIG92ZXJsb29rIHRoZXNlIGZhY3RzIGFuZCBjaXRlIHJhdyBwZXJmb3JtYW5jZQotbnVtYmVycyBhcyBpZiB0aGV5IGFyZSBzb21lIGluZGljYXRpb24gb2YgdGhlIHF1YWxpdHkgb2YgYSB3ZWIgc2VydmVyCi1wcm9kdWN0LiAgVGhlcmUgaXMgYSBiYXJlIG1pbmltdW0gcGVyZm9ybWFuY2UgdGhhdCBpcyBhY2NlcHRhYmxlLCBiZXlvbmQKLXRoYXQgZXh0cmEgc3BlZWQgb25seSBjYXRlcnMgdG8gYSBtdWNoIHNtYWxsZXIgc2VnbWVudCBvZiB0aGUgbWFya2V0LgotQnV0IGluIG9yZGVyIHRvIGF2b2lkIHRoaXMgaHVyZGxlIHRvIHRoZSBhY2NlcHRhbmNlIG9mIEFwYWNoZSBpbiBzb21lCi1tYXJrZXRzLCBlZmZvcnQgd2FzIHB1dCBpbnRvIEFwYWNoZSAxLjMgdG8gYnJpbmcgcGVyZm9ybWFuY2UgdXAgdG8gYQotcG9pbnQgd2hlcmUgdGhlIGRpZmZlcmVuY2Ugd2l0aCBvdGhlciBoaWdoLWVuZCB3ZWJzZXJ2ZXJzIGlzIG1pbmltYWwuCi0KLTxwPkZpbmFsbHkgdGhlcmUgYXJlIHRoZSBmb2xrcyB3aG8ganVzdCBwbGFpbiB3YW50IHRvIHNlZSBob3cgZmFzdCBzb21ldGhpbmcKLWNhbiBnby4gIFRoZSBhdXRob3IgZmFsbHMgaW50byB0aGlzIGNhdGVnb3J5LiAgVGhlIHJlc3Qgb2YgdGhpcyBkb2N1bWVudAotaXMgZGVkaWNhdGVkIHRvIHRoZXNlIGZvbGtzIHdobyB3YW50IHRvIHNxdWVlemUgZXZlcnkgbGFzdCBiaXQgb2YKLXBlcmZvcm1hbmNlIG91dCBvZiBBcGFjaGUncyBjdXJyZW50IG1vZGVsLCBhbmQgd2FudCB0byB1bmRlcnN0YW5kIHdoeQotaXQgZG9lcyBzb21lIHRoaW5ncyB3aGljaCBzbG93IGl0IGRvd24uCi0KLTxwPk5vdGUgdGhhdCB0aGlzIGlzIHRhaWxvcmVkIHRvd2FyZHMgQXBhY2hlIDEuMyBvbiBVbml4LiAgU29tZSBvZiBpdCBhcHBsaWVzCi10byBBcGFjaGUgb24gTlQuICBBcGFjaGUgb24gTlQgaGFzIG5vdCBiZWVuIHR1bmVkIGZvciBwZXJmb3JtYW5jZSB5ZXQsCi1pbiBmYWN0IGl0IHByb2JhYmx5IHBlcmZvcm1zIHZlcnkgcG9vcmx5IGJlY2F1c2UgTlQgcGVyZm9ybWFuY2UgcmVxdWlyZXMKLWEgZGlmZmVyZW50IHByb2dyYW1taW5nIG1vZGVsLgotCi08aDM+SGFyZHdhcmUgYW5kIE9wZXJhdGluZyBTeXN0ZW0gSXNzdWVzPC9oMz4KLQotPHA+VGhlIHNpbmdsZSBiaWdnZXN0IGhhcmR3YXJlIGlzc3VlIGFmZmVjdGluZyB3ZWJzZXJ2ZXIgcGVyZm9ybWFuY2UKLWlzIFJBTS4gIEEgd2Vic2VydmVyIHNob3VsZCBuZXZlciBldmVyIGhhdmUgdG8gc3dhcCwgc3dhcHBpbmcgaW5jcmVhc2VzCi10aGUgbGF0ZW5jeSBvZiBlYWNoIHJlcXVlc3QgYmV5b25kIGEgcG9pbnQgdGhhdCB1c2VycyBjb25zaWRlciAiZmFzdAotZW5vdWdoIi4gIFRoaXMgY2F1c2VzIHVzZXJzIHRvIGhpdCBzdG9wIGFuZCByZWxvYWQsIGZ1cnRoZXIgaW5jcmVhc2luZwotdGhlIGxvYWQuICBZb3UgY2FuLCBhbmQgc2hvdWxkLCBjb250cm9sIHRoZSA8Y29kZT5NYXhDbGllbnRzPC9jb2RlPgotc2V0dGluZyBzbyB0aGF0IHlvdXIgc2VydmVyIGRvZXMgbm90IHNwYXduIHNvIG1hbnkgY2hpbGRyZW4gaXQgc3RhcnRzCi1zd2FwcGluZy4KLQotPHA+QmV5b25kIHRoYXQgdGhlIHJlc3QgaXMgbXVuZGFuZTogIGdldCBhIGZhc3QgZW5vdWdoIENQVSwgYSBmYXN0IGVub3VnaAotbmV0d29yayBjYXJkLCBhbmQgZmFzdCBlbm91Z2ggZGlza3MsIHdoZXJlICJmYXN0IGVub3VnaCIgaXMgc29tZXRoaW5nCi10aGF0IG5lZWRzIHRvIGJlIGRldGVybWluZWQgYnkgZXhwZXJpbWVudGF0aW9uLgotCi08cD5PcGVyYXRpbmcgc3lzdGVtIGNob2ljZSBpcyBsYXJnZWx5IGEgbWF0dGVyIG9mIGxvY2FsIGNvbmNlcm5zLiAgQnV0Ci1hIGdlbmVyYWwgZ3VpZGVsaW5lIGlzIHRvIGFsd2F5cyBhcHBseSB0aGUgbGF0ZXN0IHZlbmRvciBUQ1AvSVAgcGF0Y2hlcy4KLUhUVFAgc2VydmluZyBjb21wbGV0ZWx5IGJyZWFrcyBtYW55IG9mIHRoZSBhc3N1bXB0aW9ucyBidWlsdCBpbnRvIFVuaXgKLWtlcm5lbHMgdXAgdGhyb3VnaCAxOTk0IGFuZCBldmVuIDE5OTUuICBHb29kIGNob2ljZXMgaW5jbHVkZQotcmVjZW50IEZyZWVCU0QsIGFuZCBMaW51eC4KLQotPGgzPlJ1bi1UaW1lIENvbmZpZ3VyYXRpb24gSXNzdWVzPC9oMz4KLQotPGg0Pkhvc3RuYW1lTG9va3VwczwvaDQ+Ci08cD5QcmlvciB0byBBcGFjaGUgMS4zLCA8Y29kZT5Ib3N0bmFtZUxvb2t1cHM8L2NvZGU+IGRlZmF1bHRlZCB0byBPbi4KLVRoaXMgYWRkcyBsYXRlbmN5Ci10byBldmVyeSByZXF1ZXN0IGJlY2F1c2UgaXQgcmVxdWlyZXMgYSBETlMgbG9va3VwIHRvIGNvbXBsZXRlIGJlZm9yZQotdGhlIHJlcXVlc3QgaXMgZmluaXNoZWQuICBJbiBBcGFjaGUgMS4zIHRoaXMgc2V0dGluZyBkZWZhdWx0cyB0byBPZmYuCi1Ib3dldmVyICgxLjMgb3IgbGF0ZXIpLCBpZiB5b3UgdXNlIGFueSA8Y29kZT5hbGxvdyBmcm9tIGRvbWFpbjwvY29kZT4gb3IKLTxjb2RlPmRlbnkgZnJvbSBkb21haW48L2NvZGU+IGRpcmVjdGl2ZXMgdGhlbiB5b3Ugd2lsbCBwYXkgZm9yIGEKLWRvdWJsZSByZXZlcnNlIEROUyBsb29rdXAgKGEgcmV2ZXJzZSwgZm9sbG93ZWQgYnkgYSBmb3J3YXJkIHRvIG1ha2Ugc3VyZQotdGhhdCB0aGUgcmV2ZXJzZSBpcyBub3QgYmVpbmcgc3Bvb2ZlZCkuICBTbyBmb3IgdGhlIGhpZ2hlc3QgcGVyZm9ybWFuY2UKLWF2b2lkIHVzaW5nIHRoZXNlIGRpcmVjdGl2ZXMgKGl0J3MgZmluZSB0byB1c2UgSVAgYWRkcmVzc2VzIHJhdGhlciB0aGFuCi1kb21haW4gbmFtZXMpLgotCi08cD5Ob3RlIHRoYXQgaXQncyBwb3NzaWJsZSB0byBzY29wZSB0aGUgZGlyZWN0aXZlcywgc3VjaCBhcyB3aXRoaW4KLWEgPGNvZGU+Jmx0O0xvY2F0aW9uIC9zZXJ2ZXItc3RhdHVzJmd0OzwvY29kZT4gc2VjdGlvbi4gIEluIHRoaXMKLWNhc2UgdGhlIEROUyBsb29rdXBzIGFyZSBvbmx5IHBlcmZvcm1lZCBvbiByZXF1ZXN0cyBtYXRjaGluZyB0aGUKLWNyaXRlcmlhLiAgSGVyZSdzIGFuIGV4YW1wbGUgd2hpY2ggZGlzYWJsZXMKLWxvb2t1cHMgZXhjZXB0IGZvciAuaHRtbCBhbmQgLmNnaSBmaWxlczoKLQotPGJsb2NrcXVvdGU+PHByZT4KLUhvc3RuYW1lTG9va3VwcyBvZmYKLSZsdDtGaWxlcyB+ICJcLihodG1sfGNnaSkkJmd0OwotICAgIEhvc3RuYW1lTG9va3VwcyBvbgotJmx0Oy9GaWxlcyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotQnV0IGV2ZW4gc3RpbGwsIGlmIHlvdSBqdXN0IG5lZWQgRE5TIG5hbWVzCi1pbiBzb21lIENHSXMgeW91IGNvdWxkIGNvbnNpZGVyIGRvaW5nIHRoZQotPGNvZGU+Z2V0aG9zdGJ5bmFtZTwvY29kZT4gY2FsbCBpbiB0aGUgc3BlY2lmaWMgQ0dJcyB0aGF0IG5lZWQgaXQuCi0KLTxoND5Gb2xsb3dTeW1MaW5rcyBhbmQgU3ltTGlua3NJZk93bmVyTWF0Y2g8L2g0PgotPHA+V2hlcmV2ZXIgaW4geW91ciBVUkwtc3BhY2UgeW91IGRvIG5vdCBoYXZlIGFuCi08Y29kZT5PcHRpb25zIEZvbGxvd1N5bUxpbmtzPC9jb2RlPiwgb3IgeW91IGRvIGhhdmUgYW4KLTxjb2RlPk9wdGlvbnMgU3ltTGlua3NJZk93bmVyTWF0Y2g8L2NvZGU+IEFwYWNoZSB3aWxsIGhhdmUgdG8KLWlzc3VlIGV4dHJhIHN5c3RlbSBjYWxscyB0byBjaGVjayB1cCBvbiBzeW1saW5rcy4gIE9uZSBleHRyYSBjYWxsIHBlcgotZmlsZW5hbWUgY29tcG9uZW50LiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYWQ6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci1Eb2N1bWVudFJvb3QgL3d3dy9odGRvY3MKLSZsdDtEaXJlY3RvcnkgLyZndDsKLSAgICBPcHRpb25zIFN5bUxpbmtzSWZPd25lck1hdGNoCi0mbHQ7L0RpcmVjdG9yeSZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotYW5kIGEgcmVxdWVzdCBpcyBtYWRlIGZvciB0aGUgVVJJIDxjb2RlPi9pbmRleC5odG1sPC9jb2RlPi4KLVRoZW4gQXBhY2hlIHdpbGwgcGVyZm9ybSA8Y29kZT5sc3RhdCgyKTwvY29kZT4gb24gPGNvZGU+L3d3dzwvY29kZT4sCi08Y29kZT4vd3d3L2h0ZG9jczwvY29kZT4sIGFuZCA8Y29kZT4vd3d3L2h0ZG9jcy9pbmRleC5odG1sPC9jb2RlPi4gIFRoZQotcmVzdWx0cyBvZiB0aGVzZSA8Y29kZT5sc3RhdHM8L2NvZGU+IGFyZSBuZXZlciBjYWNoZWQsCi1zbyB0aGV5IHdpbGwgb2NjdXIgb24gZXZlcnkgc2luZ2xlIHJlcXVlc3QuICBJZiB5b3UgcmVhbGx5IGRlc2lyZSB0aGUKLXN5bWxpbmtzIHNlY3VyaXR5IGNoZWNraW5nIHlvdSBjYW4gZG8gc29tZXRoaW5nIGxpa2UgdGhpczoKLQotPGJsb2NrcXVvdGU+PHByZT4KLURvY3VtZW50Um9vdCAvd3d3L2h0ZG9jcwotJmx0O0RpcmVjdG9yeSAvJmd0OwotICAgIE9wdGlvbnMgRm9sbG93U3ltTGlua3MKLSZsdDsvRGlyZWN0b3J5Jmd0OwotJmx0O0RpcmVjdG9yeSAvd3d3L2h0ZG9jcyZndDsKLSAgICBPcHRpb25zIC1Gb2xsb3dTeW1MaW5rcyArU3ltTGlua3NJZk93bmVyTWF0Y2gKLSZsdDsvRGlyZWN0b3J5Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1UaGlzIGF0IGxlYXN0IGF2b2lkcyB0aGUgZXh0cmEgY2hlY2tzIGZvciB0aGUgPGNvZGU+RG9jdW1lbnRSb290PC9jb2RlPgotcGF0aC4gIE5vdGUgdGhhdCB5b3UnbGwgbmVlZCB0byBhZGQgc2ltaWxhciBzZWN0aW9ucyBpZiB5b3UgaGF2ZSBhbnkKLTxjb2RlPkFsaWFzPC9jb2RlPiBvciA8Y29kZT5SZXdyaXRlUnVsZTwvY29kZT4gcGF0aHMgb3V0c2lkZSBvZiB5b3VyCi1kb2N1bWVudCByb290LiAgRm9yIGhpZ2hlc3QgcGVyZm9ybWFuY2UsIGFuZCBubyBzeW1saW5rIHByb3RlY3Rpb24sCi1zZXQgPGNvZGU+Rm9sbG93U3ltTGlua3M8L2NvZGU+IGV2ZXJ5d2hlcmUsIGFuZCBuZXZlciBzZXQKLTxjb2RlPlN5bUxpbmtzSWZPd25lck1hdGNoPC9jb2RlPi4KLQotPGg0PkFsbG93T3ZlcnJpZGU8L2g0PgotCi08cD5XaGVyZXZlciBpbiB5b3VyIFVSTC1zcGFjZSB5b3UgYWxsb3cgb3ZlcnJpZGVzICh0eXBpY2FsbHkKLTxjb2RlPi5odGFjY2VzczwvY29kZT4gZmlsZXMpIEFwYWNoZSB3aWxsIGF0dGVtcHQgdG8gb3BlbgotPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBmb3IgZWFjaCBmaWxlbmFtZSBjb21wb25lbnQuICBGb3IgZXhhbXBsZSwKLQotPGJsb2NrcXVvdGU+PHByZT4KLURvY3VtZW50Um9vdCAvd3d3L2h0ZG9jcwotJmx0O0RpcmVjdG9yeSAvJmd0OwotICAgIEFsbG93T3ZlcnJpZGUgYWxsCi0mbHQ7L0RpcmVjdG9yeSZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotYW5kIGEgcmVxdWVzdCBpcyBtYWRlIGZvciB0aGUgVVJJIDxjb2RlPi9pbmRleC5odG1sPC9jb2RlPi4gIFRoZW4KLUFwYWNoZSB3aWxsIGF0dGVtcHQgdG8gb3BlbiA8Y29kZT4vLmh0YWNjZXNzPC9jb2RlPiwKLTxjb2RlPi93d3cvLmh0YWNjZXNzPC9jb2RlPiwgYW5kIDxjb2RlPi93d3cvaHRkb2NzLy5odGFjY2VzczwvY29kZT4uCi1UaGUgc29sdXRpb25zIGFyZSBzaW1pbGFyIHRvIHRoZSBwcmV2aW91cyBjYXNlIG9mIDxjb2RlPk9wdGlvbnMKLUZvbGxvd1N5bUxpbmtzPC9jb2RlPi4gIEZvciBoaWdoZXN0IHBlcmZvcm1hbmNlIHVzZQotPGNvZGU+QWxsb3dPdmVycmlkZSBOb25lPC9jb2RlPiBldmVyeXdoZXJlIGluIHlvdXIgZmlsZXN5c3RlbS4KLQotPGg0Pk5lZ290aWF0aW9uPC9oND4KLQotPHA+SWYgYXQgYWxsIHBvc3NpYmxlLCBhdm9pZCBjb250ZW50LW5lZ290aWF0aW9uIGlmIHlvdSdyZSByZWFsbHkKLWludGVyZXN0ZWQgaW4gZXZlcnkgbGFzdCBvdW5jZSBvZiBwZXJmb3JtYW5jZS4gIEluIHByYWN0aWNlIHRoZQotYmVuZWZpdHMgb2YgbmVnb3RpYXRpb24gb3V0d2VpZ2ggdGhlIHBlcmZvcm1hbmNlIHBlbmFsdGllcy4gIFRoZXJlJ3MKLW9uZSBjYXNlIHdoZXJlIHlvdSBjYW4gc3BlZWQgdXAgdGhlIHNlcnZlci4gIEluc3RlYWQgb2YgdXNpbmcKLWEgd2lsZGNhcmQgc3VjaCBhczoKLQotPGJsb2NrcXVvdGU+PHByZT4KLURpcmVjdG9yeUluZGV4IGluZGV4Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVVzZSBhIGNvbXBsZXRlIGxpc3Qgb2Ygb3B0aW9uczoKLQotPGJsb2NrcXVvdGU+PHByZT4KLURpcmVjdG9yeUluZGV4IGluZGV4LmNnaSBpbmRleC5wbCBpbmRleC5zaHRtbCBpbmRleC5odG1sCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLXdoZXJlIHlvdSBsaXN0IHRoZSBtb3N0IGNvbW1vbiBjaG9pY2UgZmlyc3QuCi0KLTxoND5Qcm9jZXNzIENyZWF0aW9uPC9oND4KLQotPHA+UHJpb3IgdG8gQXBhY2hlIDEuMyB0aGUgPGNvZGU+TWluU3BhcmVTZXJ2ZXJzPC9jb2RlPiwKLTxjb2RlPk1heFNwYXJlU2VydmVyczwvY29kZT4sIGFuZCA8Y29kZT5TdGFydFNlcnZlcnM8L2NvZGU+IHNldHRpbmdzCi1hbGwgaGFkIGRyYXN0aWMgZWZmZWN0cyBvbiBiZW5jaG1hcmsgcmVzdWx0cy4gIEluIHBhcnRpY3VsYXIsIEFwYWNoZQotcmVxdWlyZWQgYSAicmFtcC11cCIgcGVyaW9kIGluIG9yZGVyIHRvIHJlYWNoIGEgbnVtYmVyIG9mIGNoaWxkcmVuCi1zdWZmaWNpZW50IHRvIHNlcnZlIHRoZSBsb2FkIGJlaW5nIGFwcGxpZWQuICBBZnRlciB0aGUgaW5pdGlhbAotc3Bhd25pbmcgb2YgPGNvZGU+U3RhcnRTZXJ2ZXJzPC9jb2RlPiBjaGlsZHJlbiwgb25seSBvbmUgY2hpbGQgcGVyCi1zZWNvbmQgd291bGQgYmUgY3JlYXRlZCB0byBzYXRpc2Z5IHRoZSA8Y29kZT5NaW5TcGFyZVNlcnZlcnM8L2NvZGU+Ci1zZXR0aW5nLiAgU28gYSBzZXJ2ZXIgYmVpbmcgYWNjZXNzZWQgYnkgMTAwIHNpbXVsdGFuZW91cyBjbGllbnRzLAotdXNpbmcgdGhlIGRlZmF1bHQgPGNvZGU+U3RhcnRTZXJ2ZXJzPC9jb2RlPiBvZiA1IHdvdWxkIHRha2Ugb24KLXRoZSBvcmRlciA5NSBzZWNvbmRzIHRvIHNwYXduIGVub3VnaCBjaGlsZHJlbiB0byBoYW5kbGUgdGhlIGxvYWQuICBUaGlzCi13b3JrcyBmaW5lIGluIHByYWN0aWNlIG9uIHJlYWwtbGlmZSBzZXJ2ZXJzLCBiZWNhdXNlIHRoZXkgYXJlbid0IHJlc3RhcnRlZAotZnJlcXVlbnRseS4gIEJ1dCBkb2VzIHJlYWxseSBwb29ybHkgb24gYmVuY2htYXJrcyB3aGljaCBtaWdodCBvbmx5IHJ1bgotZm9yIHRlbiBtaW51dGVzLgotCi08cD5UaGUgb25lLXBlci1zZWNvbmQgcnVsZSB3YXMgaW1wbGVtZW50ZWQgaW4gYW4gZWZmb3J0IHRvIGF2b2lkCi1zd2FtcGluZyB0aGUgbWFjaGluZSB3aXRoIHRoZSBzdGFydHVwIG9mIG5ldyBjaGlsZHJlbi4gIElmIHRoZSBtYWNoaW5lCi1pcyBidXN5IHNwYXduaW5nIGNoaWxkcmVuIGl0IGNhbid0IHNlcnZpY2UgcmVxdWVzdHMuICBCdXQgaXQgaGFzIHN1Y2gKLWEgZHJhc3RpYyBlZmZlY3Qgb24gdGhlIHBlcmNlaXZlZCBwZXJmb3JtYW5jZSBvZiBBcGFjaGUgdGhhdCBpdCBoYWQKLXRvIGJlIHJlcGxhY2VkLiAgQXMgb2YgQXBhY2hlIDEuMywKLXRoZSBjb2RlIHdpbGwgcmVsYXggdGhlIG9uZS1wZXItc2Vjb25kIHJ1bGUuICBJdAotd2lsbCBzcGF3biBvbmUsIHdhaXQgYSBzZWNvbmQsIHRoZW4gc3Bhd24gdHdvLCB3YWl0IGEgc2Vjb25kLCB0aGVuIHNwYXduCi1mb3VyLCBhbmQgaXQgd2lsbCBjb250aW51ZSBleHBvbmVudGlhbGx5IHVudGlsIGl0IGlzIHNwYXduaW5nIDMyIGNoaWxkcmVuCi1wZXIgc2Vjb25kLiAgSXQgd2lsbCBzdG9wIHdoZW5ldmVyIGl0IHNhdGlzZmllcyB0aGUKLTxjb2RlPk1pblNwYXJlU2VydmVyczwvY29kZT4gc2V0dGluZy4KLQotPHA+VGhpcyBhcHBlYXJzIHRvIGJlIHJlc3BvbnNpdmUgZW5vdWdoIHRoYXQgaXQncwotYWxtb3N0IHVubmVjZXNzYXJ5IHRvIHR3aWRkbGUgdGhlIDxjb2RlPk1pblNwYXJlU2VydmVyczwvY29kZT4sCi08Y29kZT5NYXhTcGFyZVNlcnZlcnM8L2NvZGU+IGFuZCA8Y29kZT5TdGFydFNlcnZlcnM8L2NvZGU+IGtub2JzLiAgV2hlbgotbW9yZSB0aGFuIDQgY2hpbGRyZW4gYXJlIHNwYXduZWQgcGVyIHNlY29uZCwgYSBtZXNzYWdlIHdpbGwgYmUgZW1pdHRlZAotdG8gdGhlIDxjb2RlPkVycm9yTG9nPC9jb2RlPi4gIElmIHlvdSBzZWUgYSBsb3Qgb2YgdGhlc2UgZXJyb3JzIHRoZW4KLWNvbnNpZGVyIHR1bmluZyB0aGVzZSBzZXR0aW5ncy4gIFVzZSB0aGUgPGNvZGU+bW9kX3N0YXR1czwvY29kZT4gb3V0cHV0Ci1hcyBhIGd1aWRlLgotCi08cD5SZWxhdGVkIHRvIHByb2Nlc3MgY3JlYXRpb24gaXMgcHJvY2VzcyBkZWF0aCBpbmR1Y2VkIGJ5IHRoZQotPGNvZGU+TWF4UmVxdWVzdHNQZXJDaGlsZDwvY29kZT4gc2V0dGluZy4gIEJ5IGRlZmF1bHQgdGhpcyBpcyAzMCwgd2hpY2gKLWlzIHByb2JhYmx5IGZhciB0b28gbG93IHVubGVzcyB5b3VyIHNlcnZlciBpcyB1c2luZyBhIG1vZHVsZSBzdWNoIGFzCi08Y29kZT5tb2RfcGVybDwvY29kZT4gd2hpY2ggY2F1c2VzIGNoaWxkcmVuIHRvIGhhdmUgYmxvYXRlZCBtZW1vcnkKLWltYWdlcy4gIElmIHlvdXIgc2VydmVyIGlzIHNlcnZpbmcgbW9zdGx5IHN0YXRpYyBwYWdlcyB0aGVuIGNvbnNpZGVyCi1yYWlzaW5nIHRoaXMgdmFsdWUgdG8gc29tZXRoaW5nIGxpa2UgMTAwMDAuICBUaGUgY29kZSBpcyByb2J1c3QgZW5vdWdoCi10aGF0IHRoaXMgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4KLQotPHA+V2hlbiBrZWVwLWFsaXZlcyBhcmUgaW4gdXNlLCBjaGlsZHJlbiB3aWxsIGJlIGtlcHQgYnVzeQotZG9pbmcgbm90aGluZyB3YWl0aW5nIGZvciBtb3JlIHJlcXVlc3RzIG9uIHRoZSBhbHJlYWR5IG9wZW4KLWNvbm5lY3Rpb24uICBUaGUgZGVmYXVsdCA8Y29kZT5LZWVwQWxpdmVUaW1lb3V0PC9jb2RlPiBvZgotMTUgc2Vjb25kcyBhdHRlbXB0cyB0byBtaW5pbWl6ZSB0aGlzIGVmZmVjdC4gIFRoZSB0cmFkZW9mZgotaGVyZSBpcyBiZXR3ZWVuIG5ldHdvcmsgYmFuZHdpZHRoIGFuZCBzZXJ2ZXIgcmVzb3VyY2VzLgotSW4gbm8gZXZlbnQgc2hvdWxkIHlvdSByYWlzZSB0aGlzIGFib3ZlIGFib3V0IDYwIHNlY29uZHMsIGFzCi08YSBocmVmPSJodHRwOi8vd3d3LnJlc2VhcmNoLmRpZ2l0YWwuY29tL3dybC90ZWNocmVwb3J0cy9hYnN0cmFjdHMvOTUuNC5odG1sIj4KLW1vc3Qgb2YgdGhlIGJlbmVmaXRzIGFyZSBsb3N0PC9hPi4KLQotPGgzPkNvbXBpbGUtVGltZSBDb25maWd1cmF0aW9uIElzc3VlczwvaDM+Ci0KLTxoND5tb2Rfc3RhdHVzIGFuZCBSdWxlIFNUQVRVUz15ZXM8L2g0PgotCi08cD5JZiB5b3UgaW5jbHVkZSA8Y29kZT5tb2Rfc3RhdHVzPC9jb2RlPgotYW5kIHlvdSBhbHNvIHNldCA8Y29kZT5SdWxlIFNUQVRVUz15ZXM8L2NvZGU+IHdoZW4gYnVpbGRpbmcKLUFwYWNoZSwgdGhlbiBvbiBldmVyeSByZXF1ZXN0IEFwYWNoZSB3aWxsIHBlcmZvcm0gdHdvIGNhbGxzIHRvCi08Y29kZT5nZXR0aW1lb2ZkYXkoMik8L2NvZGU+IChvciA8Y29kZT50aW1lcygyKTwvY29kZT4gZGVwZW5kaW5nCi1vbiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0pLCBhbmQgKHByZS0xLjMpIHNldmVyYWwgZXh0cmEgY2FsbHMgdG8KLTxjb2RlPnRpbWUoMik8L2NvZGU+LiAgVGhpcyBpcyBhbGwgZG9uZSBzbyB0aGF0IHRoZSBzdGF0dXMgcmVwb3J0Ci1jb250YWlucyB0aW1pbmcgaW5kaWNhdGlvbnMuICBGb3IgaGlnaGVzdCBwZXJmb3JtYW5jZSwgc2V0IDxjb2RlPlJ1bGUKLVNUQVRVUz1ubzwvY29kZT4uCi0KLTxoND5hY2NlcHQgU2VyaWFsaXphdGlvbiAtIG11bHRpcGxlIHNvY2tldHM8L2g0PgotCi08cD5UaGlzIGRpc2N1c3NlcyBhIHNob3J0Y29taW5nIGluIHRoZSBVbml4IHNvY2tldCBBUEkuCi1TdXBwb3NlIHlvdXIKLXdlYiBzZXJ2ZXIgdXNlcyBtdWx0aXBsZSA8Y29kZT5MaXN0ZW48L2NvZGU+IHN0YXRlbWVudHMgdG8gbGlzdGVuIG9uCi1laXRoZXIgbXVsdGlwbGUgcG9ydHMgb3IgbXVsdGlwbGUgYWRkcmVzc2VzLiAgSW4gb3JkZXIgdG8gdGVzdCBlYWNoCi1zb2NrZXQgdG8gc2VlIGlmIGEgY29ubmVjdGlvbiBpcyByZWFkeSBBcGFjaGUgdXNlcyA8Y29kZT5zZWxlY3QoMik8L2NvZGU+LgotPGNvZGU+c2VsZWN0KDIpPC9jb2RlPiBpbmRpY2F0ZXMgdGhhdCBhIHNvY2tldCBoYXMgPGk+bm9uZTwvaT4gb3IKLTxpPmF0IGxlYXN0IG9uZTwvaT4gY29ubmVjdGlvbiB3YWl0aW5nIG9uIGl0LiAgQXBhY2hlJ3MgbW9kZWwgaW5jbHVkZXMKLW11bHRpcGxlIGNoaWxkcmVuLCBhbmQgYWxsIHRoZSBpZGxlIG9uZXMgdGVzdCBmb3IgbmV3IGNvbm5lY3Rpb25zIGF0IHRoZQotc2FtZSB0aW1lLiAgQSBuYWl2ZSBpbXBsZW1lbnRhdGlvbiBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzCi0odGhlc2UgZXhhbXBsZXMgZG8gbm90IG1hdGNoIHRoZSBjb2RlLCB0aGV5J3JlIGNvbnRyaXZlZCBmb3IKLXBlZGFnb2dpY2FsIHB1cnBvc2VzKToKLQotPGJsb2NrcXVvdGU+PHByZT4KLSAgICBmb3IgKDs7KSB7Ci0JZm9yICg7OykgewotCSAgICBmZF9zZXQgYWNjZXB0X2ZkczsKLQotCSAgICBGRF9aRVJPICgmYWNjZXB0X2Zkcyk7Ci0JICAgIGZvciAoaSA9IGZpcnN0X3NvY2tldDsgaSAmbHQ7PSBsYXN0X3NvY2tldDsgKytpKSB7Ci0JCUZEX1NFVCAoaSwgJmFjY2VwdF9mZHMpOwotCSAgICB9Ci0JICAgIHJjID0gc2VsZWN0IChsYXN0X3NvY2tldCsxLCAmYWNjZXB0X2ZkcywgTlVMTCwgTlVMTCwgTlVMTCk7Ci0JICAgIGlmIChyYyAmbHQ7IDEpIGNvbnRpbnVlOwotCSAgICBuZXdfY29ubmVjdGlvbiA9IC0xOwotCSAgICBmb3IgKGkgPSBmaXJzdF9zb2NrZXQ7IGkgJmx0Oz0gbGFzdF9zb2NrZXQ7ICsraSkgewotCQlpZiAoRkRfSVNTRVQgKGksICZhY2NlcHRfZmRzKSkgewotCQkgICAgbmV3X2Nvbm5lY3Rpb24gPSBhY2NlcHQgKGksIE5VTEwsIE5VTEwpOwotCQkgICAgaWYgKG5ld19jb25uZWN0aW9uICE9IC0xKSBicmVhazsKLQkJfQotCSAgICB9Ci0JICAgIGlmIChuZXdfY29ubmVjdGlvbiAhPSAtMSkgYnJlYWs7Ci0JfQotCXByb2Nlc3MgdGhlIG5ld19jb25uZWN0aW9uOwotICAgIH0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotQnV0IHRoaXMgbmFpdmUgaW1wbGVtZW50YXRpb24gaGFzIGEgc2VyaW91cyBzdGFydmF0aW9uIHByb2JsZW0uICBSZWNhbGwKLXRoYXQgbXVsdGlwbGUgY2hpbGRyZW4gZXhlY3V0ZSB0aGlzIGxvb3AgYXQgdGhlIHNhbWUgdGltZSwgYW5kIHNvIG11bHRpcGxlCi1jaGlsZHJlbiB3aWxsIGJsb2NrIGF0IDxjb2RlPnNlbGVjdDwvY29kZT4gd2hlbiB0aGV5IGFyZSBpbiBiZXR3ZWVuCi1yZXF1ZXN0cy4gIEFsbCB0aG9zZSBibG9ja2VkIGNoaWxkcmVuIHdpbGwgYXdha2VuIGFuZCByZXR1cm4gZnJvbQotPGNvZGU+c2VsZWN0PC9jb2RlPiB3aGVuIGEgc2luZ2xlIHJlcXVlc3QgYXBwZWFycyBvbiBhbnkgc29ja2V0Ci0odGhlIG51bWJlciBvZiBjaGlsZHJlbiB3aGljaCBhd2FrZW4gdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgb3BlcmF0aW5nCi1zeXN0ZW0gYW5kIHRpbWluZyBpc3N1ZXMpLgotVGhleSB3aWxsIGFsbCB0aGVuIGZhbGwgZG93biBpbnRvIHRoZSBsb29wIGFuZCB0cnkgdG8gPGNvZGU+YWNjZXB0PC9jb2RlPgotdGhlIGNvbm5lY3Rpb24uICBCdXQgb25seSBvbmUgd2lsbCBzdWNjZWVkIChhc3N1bWluZyB0aGVyZSdzIHN0aWxsIG9ubHkKLW9uZSBjb25uZWN0aW9uIHJlYWR5KSwgdGhlIHJlc3Qgd2lsbCBiZSA8aT5ibG9ja2VkPC9pPiBpbiA8Y29kZT5hY2NlcHQ8L2NvZGU+LgotVGhpcyBlZmZlY3RpdmVseSBsb2NrcyB0aG9zZSBjaGlsZHJlbiBpbnRvIHNlcnZpbmcgcmVxdWVzdHMgZnJvbSB0aGF0Ci1vbmUgc29ja2V0IGFuZCBubyBvdGhlciBzb2NrZXRzLCBhbmQgdGhleSdsbCBiZSBzdHVjayB0aGVyZSB1bnRpbCBlbm91Z2gKLW5ldyByZXF1ZXN0cyBhcHBlYXIgb24gdGhhdCBzb2NrZXQgdG8gd2FrZSB0aGVtIGFsbCB1cC4KLVRoaXMgc3RhcnZhdGlvbiBwcm9ibGVtIHdhcyBmaXJzdCBkb2N1bWVudGVkIGluCi08YSBocmVmPSJodHRwOi8vYnVncy5hcGFjaGUub3JnL2luZGV4L2Z1bGwvNDY3Ij5QUiM0Njc8L2E+LiAgVGhlcmUKLWFyZSBhdCBsZWFzdCB0d28gc29sdXRpb25zLgotCi08cD5PbmUgc29sdXRpb24gaXMgdG8gbWFrZSB0aGUgc29ja2V0cyBub24tYmxvY2tpbmcuICBJbiB0aGlzIGNhc2UgdGhlCi08Y29kZT5hY2NlcHQ8L2NvZGU+IHdvbid0IGJsb2NrIHRoZSBjaGlsZHJlbiwgYW5kIHRoZXkgd2lsbCBiZSBhbGxvd2VkCi10byBjb250aW51ZSBpbW1lZGlhdGVseS4gIEJ1dCB0aGlzIHdhc3RlcyBDUFUgdGltZS4gIFN1cHBvc2UgeW91IGhhdmUKLXRlbiBpZGxlIGNoaWxkcmVuIGluIDxjb2RlPnNlbGVjdDwvY29kZT4sIGFuZCBvbmUgY29ubmVjdGlvbiBhcnJpdmVzLgotVGhlbiBuaW5lIG9mIHRob3NlIGNoaWxkcmVuIHdpbGwgd2FrZSB1cCwgdHJ5IHRvIDxjb2RlPmFjY2VwdDwvY29kZT4gdGhlCi1jb25uZWN0aW9uLCBmYWlsLCBhbmQgbG9vcCBiYWNrIGludG8gPGNvZGU+c2VsZWN0PC9jb2RlPiwgYWNjb21wbGlzaGluZwotbm90aGluZy4gIE1lYW53aGlsZSBub25lIG9mIHRob3NlIGNoaWxkcmVuIGFyZSBzZXJ2aWNpbmcgcmVxdWVzdHMgdGhhdAotb2NjdXJyZWQgb24gb3RoZXIgc29ja2V0cyB1bnRpbCB0aGV5IGdldCBiYWNrIHVwIHRvIHRoZSA8Y29kZT5zZWxlY3Q8L2NvZGU+Ci1hZ2Fpbi4gIE92ZXJhbGwgdGhpcyBzb2x1dGlvbiBkb2VzIG5vdCBzZWVtIHZlcnkgZnJ1aXRmdWwgdW5sZXNzIHlvdQotaGF2ZSBhcyBtYW55IGlkbGUgQ1BVcyAoaW4gYSBtdWx0aXByb2Nlc3NvciBib3gpIGFzIHlvdSBoYXZlIGlkbGUgY2hpbGRyZW4sCi1ub3QgYSB2ZXJ5IGxpa2VseSBzaXR1YXRpb24uCi0KLTxwPkFub3RoZXIgc29sdXRpb24sIHRoZSBvbmUgdXNlZCBieSBBcGFjaGUsIGlzIHRvIHNlcmlhbGl6ZSBlbnRyeSBpbnRvCi10aGUgaW5uZXIgbG9vcC4gIFRoZSBsb29wIGxvb2tzIGxpa2UgdGhpcyAoZGlmZmVyZW5jZXMgaGlnaGxpZ2h0ZWQpOgotCi08YmxvY2txdW90ZT48cHJlPgotICAgIGZvciAoOzspIHsKLQk8Yj5hY2NlcHRfbXV0ZXhfb24gKCk7PC9iPgotCWZvciAoOzspIHsKLQkgICAgZmRfc2V0IGFjY2VwdF9mZHM7Ci0KLQkgICAgRkRfWkVSTyAoJmFjY2VwdF9mZHMpOwotCSAgICBmb3IgKGkgPSBmaXJzdF9zb2NrZXQ7IGkgJmx0Oz0gbGFzdF9zb2NrZXQ7ICsraSkgewotCQlGRF9TRVQgKGksICZhY2NlcHRfZmRzKTsKLQkgICAgfQotCSAgICByYyA9IHNlbGVjdCAobGFzdF9zb2NrZXQrMSwgJmFjY2VwdF9mZHMsIE5VTEwsIE5VTEwsIE5VTEwpOwotCSAgICBpZiAocmMgJmx0OyAxKSBjb250aW51ZTsKLQkgICAgbmV3X2Nvbm5lY3Rpb24gPSAtMTsKLQkgICAgZm9yIChpID0gZmlyc3Rfc29ja2V0OyBpICZsdDs9IGxhc3Rfc29ja2V0OyArK2kpIHsKLQkJaWYgKEZEX0lTU0VUIChpLCAmYWNjZXB0X2ZkcykpIHsKLQkJICAgIG5ld19jb25uZWN0aW9uID0gYWNjZXB0IChpLCBOVUxMLCBOVUxMKTsKLQkJICAgIGlmIChuZXdfY29ubmVjdGlvbiAhPSAtMSkgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgICBpZiAobmV3X2Nvbm5lY3Rpb24gIT0gLTEpIGJyZWFrOwotCX0KLQk8Yj5hY2NlcHRfbXV0ZXhfb2ZmICgpOzwvYj4KLQlwcm9jZXNzIHRoZSBuZXdfY29ubmVjdGlvbjsKLSAgICB9Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLTxhIG5hbWU9InNlcmlhbGl6ZSI+PC9hPgotVGhlIGZ1bmN0aW9ucyA8Y29kZT5hY2NlcHRfbXV0ZXhfb248L2NvZGU+IGFuZCA8Y29kZT5hY2NlcHRfbXV0ZXhfb2ZmPC9jb2RlPgotaW1wbGVtZW50IGEgbXV0dWFsIGV4Y2x1c2lvbiBzZW1hcGhvcmUuICBPbmx5IG9uZSBjaGlsZCBjYW4gaGF2ZSB0aGUKLW11dGV4IGF0IGFueSB0aW1lLiAgVGhlcmUgYXJlIHNldmVyYWwgY2hvaWNlcyBmb3IgaW1wbGVtZW50aW5nIHRoZXNlCi1tdXRleGVzLiAgVGhlIGNob2ljZSBpcyBkZWZpbmVkIGluIDxjb2RlPnNyYy9jb25mLmg8L2NvZGU+IChwcmUtMS4zKSBvcgotPGNvZGU+c3JjL21haW4vY29uZi5oPC9jb2RlPiAoMS4zIG9yIGxhdGVyKS4gIFNvbWUgYXJjaGl0ZWN0dXJlcwotZG8gbm90IGhhdmUgYW55IGxvY2tpbmcgY2hvaWNlIG1hZGUsIG9uIHRoZXNlIGFyY2hpdGVjdHVyZXMgaXQgaXMgdW5zYWZlCi10byB1c2UgbXVsdGlwbGUgPGNvZGU+TGlzdGVuPC9jb2RlPiBkaXJlY3RpdmVzLgotCi08ZGw+Ci08ZHQ+PGNvZGU+VVNFX0ZMT0NLX1NFUklBTElaRURfQUNDRVBUPC9jb2RlPgotPGRkPlRoaXMgbWV0aG9kIHVzZXMgdGhlIDxjb2RlPmZsb2NrKDIpPC9jb2RlPiBzeXN0ZW0gY2FsbCB0byBsb2NrIGEKLWxvY2sgZmlsZSAobG9jYXRlZCBieSB0aGUgPGNvZGU+TG9ja0ZpbGU8L2NvZGU+IGRpcmVjdGl2ZSkuCi0KLTxkdD48Y29kZT5VU0VfRkNOVExfU0VSSUFMSVpFRF9BQ0NFUFQ8L2NvZGU+Ci08ZGQ+VGhpcyBtZXRob2QgdXNlcyB0aGUgPGNvZGU+ZmNudGwoMik8L2NvZGU+IHN5c3RlbSBjYWxsIHRvIGxvY2sgYQotbG9jayBmaWxlIChsb2NhdGVkIGJ5IHRoZSA8Y29kZT5Mb2NrRmlsZTwvY29kZT4gZGlyZWN0aXZlKS4KLQotPGR0Pjxjb2RlPlVTRV9TWVNWU0VNX1NFUklBTElaRURfQUNDRVBUPC9jb2RlPgotPGRkPigxLjMgb3IgbGF0ZXIpIFRoaXMgbWV0aG9kIHVzZXMgU3lzVi1zdHlsZSBzZW1hcGhvcmVzIHRvIGltcGxlbWVudCB0aGUKLW11dGV4LiAgVW5mb3J0dW5hdGVseSBTeXNWLXN0eWxlIHNlbWFwaG9yZXMgaGF2ZSBzb21lIGJhZCBzaWRlLWVmZmVjdHMuCi1PbmUgaXMgdGhhdCBpdCdzIHBvc3NpYmxlIEFwYWNoZSB3aWxsIGRpZSB3aXRob3V0IGNsZWFuaW5nIHVwIHRoZSBzZW1hcGhvcmUKLShzZWUgdGhlIDxjb2RlPmlwY3MoOCk8L2NvZGU+IG1hbiBwYWdlKS4gIFRoZSBvdGhlciBpcyB0aGF0IHRoZSBzZW1hcGhvcmUKLUFQSSBhbGxvd3MgZm9yIGEgZGVuaWFsIG9mIHNlcnZpY2UgYXR0YWNrIGJ5IGFueSBDR0lzIHJ1bm5pbmcgdW5kZXIgdGhlCi1zYW1lIHVpZCBhcyB0aGUgd2Vic2VydmVyIChpLmUuIGFsbCBDR0lzIHVubGVzcyB5b3UgdXNlIHNvbWV0aGluZwotbGlrZSBzdWV4ZWMgb3IgY2dpd3JhcHBlcikuICBGb3IgdGhlc2UgcmVhc29ucyB0aGlzIG1ldGhvZCBpcyBub3QgdXNlZAotb24gYW55IGFyY2hpdGVjdHVyZSBleGNlcHQgSVJJWCAod2hlcmUgdGhlIHByZXZpb3VzIHR3byBhcmUgcHJvaGliaXRpdmVseQotZXhwZW5zaXZlIG9uIG1vc3QgSVJJWCBib3hlcykuCi0KLTxkdD48Y29kZT5VU0VfVVNMT0NLX1NFUklBTElaRURfQUNDRVBUPC9jb2RlPgotPGRkPigxLjMgb3IgbGF0ZXIpIFRoaXMgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIG9uIElSSVgsIGFuZCB1c2VzCi08Y29kZT51c2NvbmZpZygyKTwvY29kZT4gdG8gY3JlYXRlIGEgbXV0ZXguICBXaGlsZSB0aGlzIG1ldGhvZCBhdm9pZHMKLXRoZSBoYXNzbGVzIG9mIFN5c1Ytc3R5bGUgc2VtYXBob3JlcywgaXQgaXMgbm90IHRoZSBkZWZhdWx0IGZvciBJUklYLgotVGhpcyBpcyBiZWNhdXNlIG9uIHNpbmdsZSBwcm9jZXNzb3IgSVJJWCBib3hlcyAoNS4zIG9yIDYuMikgdGhlCi11c2xvY2sgY29kZSBpcyB0d28gb3JkZXJzIG9mIG1hZ25pdHVkZSBzbG93ZXIgdGhhbiB0aGUgU3lzVi1zZW1hcGhvcmUKLWNvZGUuICBPbiBtdWx0aS1wcm9jZXNzb3IgSVJJWCBib3hlcyB0aGUgdXNsb2NrIGNvZGUgaXMgYW4gb3JkZXIgb2YgbWFnbml0dWRlCi1mYXN0ZXIgdGhhbiB0aGUgU3lzVi1zZW1hcGhvcmUgY29kZS4gIEtpbmQgb2YgYSBtZXNzZWQgdXAgc2l0dWF0aW9uLgotU28gaWYgeW91J3JlIHVzaW5nIGEgbXVsdGlwcm9jZXNzb3IgSVJJWCBib3ggdGhlbiB5b3Ugc2hvdWxkIHJlYnVpbGQgeW91cgotd2Vic2VydmVyIHdpdGggPGNvZGU+LURVU0VfVVNMT0NLX1NFUklBTElaRURfQUNDRVBUPC9jb2RlPiBvbiB0aGUKLTxjb2RlPkVYVFJBX0NGTEFHUzwvY29kZT4uCi0KLTxkdD48Y29kZT5VU0VfUFRIUkVBRFNfU0VSSUFMSVpFRF9BQ0NFUFQ8L2NvZGU+Ci08ZGQ+KDEuMyBvciBsYXRlcikgVGhpcyBtZXRob2QgdXNlcyBQT1NJWCBtdXRleGVzIGFuZCBzaG91bGQgd29yayBvbgotYW55IGFyY2hpdGVjdHVyZSBpbXBsZW1lbnRpbmcgdGhlIGZ1bGwgUE9TSVggdGhyZWFkcyBzcGVjaWZpY2F0aW9uLAotaG93ZXZlciBhcHBlYXJzIHRvIG9ubHkgd29yayBvbiBTb2xhcmlzICgyLjUgb3IgbGF0ZXIpLiAgVGhpcyBpcyB0aGUKLWRlZmF1bHQgZm9yIFNvbGFyaXMgMi41IG9yIGxhdGVyLgotPC9kbD4KLQotPHA+SWYgeW91ciBzeXN0ZW0gaGFzIGFub3RoZXIgbWV0aG9kIG9mIHNlcmlhbGl6YXRpb24gd2hpY2ggaXNuJ3QgaW4gdGhlCi1hYm92ZSBsaXN0IHRoZW4gaXQgbWF5IGJlIHdvcnRod2hpbGUgYWRkaW5nIGNvZGUgZm9yIGl0IChhbmQgc3VibWl0dGluZwotYSBwYXRjaCBiYWNrIHRvIEFwYWNoZSkuCi0KLTxwPkFub3RoZXIgc29sdXRpb24gdGhhdCBoYXMgYmVlbiBjb25zaWRlcmVkIGJ1dCBuZXZlciBpbXBsZW1lbnRlZCBpcwotdG8gcGFydGlhbGx5IHNlcmlhbGl6ZSB0aGUgbG9vcCAtLSB0aGF0IGlzLCBsZXQgaW4gYSBjZXJ0YWluIG51bWJlcgotb2YgcHJvY2Vzc2VzLiAgVGhpcyB3b3VsZCBvbmx5IGJlIG9mIGludGVyZXN0IG9uIG11bHRpcHJvY2Vzc29yIGJveGVzCi13aGVyZSBpdCdzIHBvc3NpYmxlIG11bHRpcGxlIGNoaWxkcmVuIGNvdWxkIHJ1biBzaW11bHRhbmVvdXNseSwgYW5kIHRoZQotc2VyaWFsaXphdGlvbiBhY3R1YWxseSBkb2Vzbid0IHRha2UgYWR2YW50YWdlIG9mIHRoZSBmdWxsIGJhbmR3aWR0aC4KLVRoaXMgaXMgYSBwb3NzaWJsZSBhcmVhIG9mIGZ1dHVyZSBpbnZlc3RpZ2F0aW9uLCBidXQgcHJpb3JpdHkgcmVtYWlucwotbG93IGJlY2F1c2UgaGlnaGx5IHBhcmFsbGVsIHdlYiBzZXJ2ZXJzIGFyZSBub3QgdGhlIG5vcm0uCi0KLTxwPklkZWFsbHkgeW91IHNob3VsZCBydW4gc2VydmVycyB3aXRob3V0IG11bHRpcGxlIDxjb2RlPkxpc3RlbjwvY29kZT4KLXN0YXRlbWVudHMgaWYgeW91IHdhbnQgdGhlIGhpZ2hlc3QgcGVyZm9ybWFuY2UuICBCdXQgcmVhZCBvbi4KLQotPGg0PmFjY2VwdCBTZXJpYWxpemF0aW9uIC0gc2luZ2xlIHNvY2tldDwvaDQ+Ci0KLTxwPlRoZSBhYm92ZSBpcyBmaW5lIGFuZCBkYW5keSBmb3IgbXVsdGlwbGUgc29ja2V0IHNlcnZlcnMsIGJ1dCB3aGF0Ci1hYm91dCBzaW5nbGUgc29ja2V0IHNlcnZlcnM/ICBJbiB0aGVvcnkgdGhleSBzaG91bGRuJ3QgZXhwZXJpZW5jZQotYW55IG9mIHRoZXNlIHNhbWUgcHJvYmxlbXMgYmVjYXVzZSBhbGwgY2hpbGRyZW4gY2FuIGp1c3QgYmxvY2sgaW4KLTxjb2RlPmFjY2VwdCgyKTwvY29kZT4gdW50aWwgYSBjb25uZWN0aW9uIGFycml2ZXMsIGFuZCBubyBzdGFydmF0aW9uCi1yZXN1bHRzLiAgSW4gcHJhY3RpY2UgdGhpcyBoaWRlcyBhbG1vc3QgdGhlIHNhbWUgInNwaW5uaW5nIiBiZWhhdmlvdXIKLWRpc2N1c3NlZCBhYm92ZSBpbiB0aGUgbm9uLWJsb2NraW5nIHNvbHV0aW9uLiAgVGhlIHdheSB0aGF0IG1vc3QgVENQCi1zdGFja3MgYXJlIGltcGxlbWVudGVkLCB0aGUga2VybmVsIGFjdHVhbGx5IHdha2VzIHVwIGFsbCBwcm9jZXNzZXMgYmxvY2tlZAotaW4gPGNvZGU+YWNjZXB0PC9jb2RlPiB3aGVuIGEgc2luZ2xlIGNvbm5lY3Rpb24gYXJyaXZlcy4gIE9uZSBvZiB0aG9zZQotcHJvY2Vzc2VzIGdldHMgdGhlIGNvbm5lY3Rpb24gYW5kIHJldHVybnMgdG8gdXNlci1zcGFjZSwgdGhlIHJlc3Qgc3BpbiBpbgotdGhlIGtlcm5lbCBhbmQgZ28gYmFjayB0byBzbGVlcCB3aGVuIHRoZXkgZGlzY292ZXIgdGhlcmUncyBubyBjb25uZWN0aW9uCi1mb3IgdGhlbS4gIFRoaXMgc3Bpbm5pbmcgaXMgaGlkZGVuIGZyb20gdGhlIHVzZXItbGFuZCBjb2RlLCBidXQgaXQncwotdGhlcmUgbm9uZXRoZWxlc3MuICBUaGlzIGNhbiByZXN1bHQgaW4gdGhlIHNhbWUgbG9hZC1zcGlraW5nIHdhc3RlZnVsCi1iZWhhdmlvdXIgdGhhdCBhIG5vbi1ibG9ja2luZyBzb2x1dGlvbiB0byB0aGUgbXVsdGlwbGUgc29ja2V0cyBjYXNlIGNhbi4KLQotPHA+Rm9yIHRoaXMgcmVhc29uIHdlIGhhdmUgZm91bmQgdGhhdCBtYW55IGFyY2hpdGVjdHVyZXMgYmVoYXZlIG1vcmUKLSJuaWNlbHkiIGlmIHdlIHNlcmlhbGl6ZSBldmVuIHRoZSBzaW5nbGUgc29ja2V0IGNhc2UuICBTbyB0aGlzIGlzCi1hY3R1YWxseSB0aGUgZGVmYXVsdCBpbiBhbG1vc3QgYWxsIGNhc2VzLiAgQ3J1ZGUgZXhwZXJpbWVudHMgdW5kZXIKLUxpbnV4ICgyLjAuMzAgb24gYSBkdWFsIFBlbnRpdW0gcHJvIDE2NiB3LzEyOE1iIFJBTSkgaGF2ZSBzaG93biB0aGF0Ci10aGUgc2VyaWFsaXphdGlvbiBvZiB0aGUgc2luZ2xlIHNvY2tldCBjYXNlIGNhdXNlcyBsZXNzIHRoYW4gYSAzJQotZGVjcmVhc2UgaW4gcmVxdWVzdHMgcGVyIHNlY29uZCBvdmVyIHVuc2VyaWFsaXplZCBzaW5nbGUtc29ja2V0LgotQnV0IHVuc2VyaWFsaXplZCBzaW5nbGUtc29ja2V0IHNob3dlZCBhbiBleHRyYSAxMDBtcyBsYXRlbmN5IG9uCi1lYWNoIHJlcXVlc3QuICBUaGlzIGxhdGVuY3kgaXMgcHJvYmFibHkgYSB3YXNoIG9uIGxvbmcgaGF1bCBsaW5lcywKLWFuZCBvbmx5IGFuIGlzc3VlIG9uIExBTnMuICBJZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgc2luZ2xlIHNvY2tldAotc2VyaWFsaXphdGlvbiB5b3UgY2FuIGRlZmluZSA8Y29kZT5TQUZFX1VOU0VSSUFMSVpFRF9BQ0NFUFQ8L2NvZGU+Ci1hbmQgdGhlbiBzaW5nbGUtc29ja2V0IHNlcnZlcnMgd2lsbCBub3Qgc2VyaWFsaXplIGF0IGFsbC4KLQotPGg0PkxpbmdlcmluZyBDbG9zZTwvaDQ+Ci0KLTxwPkFzIGRpc2N1c3NlZCBpbgotPGEgaHJlZj0iZnRwOi8vZHMuaW50ZXJuaWMubmV0L2ludGVybmV0LWRyYWZ0cy9kcmFmdC1pZXRmLWh0dHAtY29ubmVjdGlvbi0wMC50eHQiPmRyYWZ0LWlldGYtaHR0cC1jb25uZWN0aW9uLTAwLnR4dDwvYT4gc2VjdGlvbiA4LAotaW4gb3JkZXIgZm9yIGFuIEhUVFAgc2VydmVyIHRvIDxiPnJlbGlhYmx5PC9iPiBpbXBsZW1lbnQgdGhlIHByb3RvY29sCi1pdCBuZWVkcyB0byBzaHV0ZG93biBlYWNoIGRpcmVjdGlvbiBvZiB0aGUgY29tbXVuaWNhdGlvbiBpbmRlcGVuZGVudGx5Ci0ocmVjYWxsIHRoYXQgYSBUQ1AgY29ubmVjdGlvbiBpcyBiaS1kaXJlY3Rpb25hbCwgZWFjaCBoYWxmIGlzIGluZGVwZW5kZW50Ci1vZiB0aGUgb3RoZXIpLiAgVGhpcyBmYWN0IGlzIG9mdGVuIG92ZXJsb29rZWQgYnkgb3RoZXIgc2VydmVycywgYnV0Ci1pcyBjb3JyZWN0bHkgaW1wbGVtZW50ZWQgaW4gQXBhY2hlIGFzIG9mIDEuMi4KLQotPHA+V2hlbiB0aGlzIGZlYXR1cmUgd2FzIGFkZGVkIHRvIEFwYWNoZSBpdCBjYXVzZWQgYSBmbHVycnkgb2YKLXByb2JsZW1zIG9uIHZhcmlvdXMgdmVyc2lvbnMgb2YgVW5peCBiZWNhdXNlIG9mIGEgc2hvcnRzaWdodGVkbmVzcy4KLVRoZSBUQ1Agc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBzdGF0ZSB0aGF0IHRoZSBGSU5fV0FJVF8yIHN0YXRlIGhhcyBhCi10aW1lb3V0LCBidXQgaXQgZG9lc24ndCBwcm9oaWJpdCBpdC4gIE9uIHN5c3RlbXMgd2l0aG91dCB0aGUgdGltZW91dCwKLUFwYWNoZSAxLjIgaW5kdWNlcyBtYW55IHNvY2tldHMgc3R1Y2sgZm9yZXZlciBpbiB0aGUgRklOX1dBSVRfMiBzdGF0ZS4KLUluIG1hbnkgY2FzZXMgdGhpcyBjYW4gYmUgYXZvaWRlZCBieSBzaW1wbHkgdXBncmFkaW5nIHRvIHRoZSBsYXRlc3QKLVRDUC9JUCBwYXRjaGVzIHN1cHBsaWVkIGJ5IHRoZSB2ZW5kb3IsIGluIGNhc2VzIHdoZXJlIHRoZSB2ZW5kb3IgaGFzCi1uZXZlciByZWxlYXNlZCBwYXRjaGVzIChpLmUuICBTdW5PUzQgLS0gYWx0aG91Z2ggZm9sa3Mgd2l0aCBhIHNvdXJjZQotbGljZW5zZSBjYW4gcGF0Y2ggaXQgdGhlbXNlbHZlcykgd2UgaGF2ZSBkZWNpZGVkIHRvIGRpc2FibGUgdGhpcyBmZWF0dXJlLgotCi08cD5UaGVyZSBhcmUgdHdvIHdheXMgb2YgYWNjb21wbGlzaGluZyB0aGlzLiAgT25lIGlzIHRoZQotc29ja2V0IG9wdGlvbiA8Y29kZT5TT19MSU5HRVI8L2NvZGU+LiAgQnV0IGFzIGZhdGUgd291bGQgaGF2ZSBpdCwKLXRoaXMgaGFzIG5ldmVyIGJlZW4gaW1wbGVtZW50ZWQgcHJvcGVybHkgaW4gbW9zdCBUQ1AvSVAgc3RhY2tzLiAgRXZlbgotb24gdGhvc2Ugc3RhY2tzIHdpdGggYSBwcm9wZXIgaW1wbGVtZW50YXRpb24gKGkuZS4gTGludXggMi4wLjMxKSB0aGlzCi1tZXRob2QgcHJvdmVzIHRvIGJlIG1vcmUgZXhwZW5zaXZlIChjcHV0aW1lKSB0aGFuIHRoZSBuZXh0IHNvbHV0aW9uLgotCi08cD5Gb3IgdGhlIG1vc3QgcGFydCwgQXBhY2hlIGltcGxlbWVudHMgdGhpcyBpbiBhIGZ1bmN0aW9uIGNhbGxlZAotPGNvZGU+bGluZ2VyaW5nX2Nsb3NlPC9jb2RlPiAoaW4gPGNvZGU+aHR0cF9tYWluLmM8L2NvZGU+KS4gIFRoZQotZnVuY3Rpb24gbG9va3Mgcm91Z2hseSBsaWtlIHRoaXM6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0gICAgdm9pZCBsaW5nZXJpbmdfY2xvc2UgKGludCBzKQotICAgIHsKLQljaGFyIGp1bmtfYnVmZmVyWzIwNDhdOwotCi0JLyogc2h1dGRvd24gdGhlIHNlbmRpbmcgc2lkZSAqLwotCXNodXRkb3duIChzLCAxKTsKLQotCXNpZ25hbCAoU0lHQUxSTSwgbGluZ2VyaW5nX2RlYXRoKTsKLQlhbGFybSAoMzApOwotCi0JZm9yICg7OykgewotCSAgICBzZWxlY3QgKHMgZm9yIHJlYWRpbmcsIDIgc2Vjb25kIHRpbWVvdXQpOwotCSAgICBpZiAoZXJyb3IpIGJyZWFrOwotCSAgICBpZiAocyBpcyByZWFkeSBmb3IgcmVhZGluZykgewotCQlyZWFkIChzLCBqdW5rX2J1ZmZlciwgc2l6ZW9mIChqdW5rX2J1ZmZlcikpOwotCQkvKiBqdXN0IHRvc3MgYXdheSB3aGF0ZXZlciBpcyBoZXJlICovCi0JICAgIH0KLQl9Ci0KLQljbG9zZSAocyk7Ci0gICAgfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1UaGlzIG5hdHVyYWxseSBhZGRzIHNvbWUgZXhwZW5zZSBhdCB0aGUgZW5kIG9mIGEgY29ubmVjdGlvbiwgYnV0IGl0Ci1pcyByZXF1aXJlZCBmb3IgYSByZWxpYWJsZSBpbXBsZW1lbnRhdGlvbi4gIEFzIEhUVFAvMS4xIGJlY29tZXMgbW9yZQotcHJldmFsZW50LCBhbmQgYWxsIGNvbm5lY3Rpb25zIGFyZSBwZXJzaXN0ZW50LCB0aGlzIGV4cGVuc2Ugd2lsbCBiZQotYW1vcnRpemVkIG92ZXIgbW9yZSByZXF1ZXN0cy4gIElmIHlvdSB3YW50IHRvIHBsYXkgd2l0aCBmaXJlIGFuZAotZGlzYWJsZSB0aGlzIGZlYXR1cmUgeW91IGNhbiBkZWZpbmUgPGNvZGU+Tk9fTElOR0NMT1NFPC9jb2RlPiwgYnV0Ci10aGlzIGlzIG5vdCByZWNvbW1lbmRlZCBhdCBhbGwuICBJbiBwYXJ0aWN1bGFyLCBhcyBIVFRQLzEuMSBwaXBlbGluZWQKLXBlcnNpc3RlbnQgY29ubmVjdGlvbnMgY29tZSBpbnRvIHVzZSA8Y29kZT5saW5nZXJpbmdfY2xvc2U8L2NvZGU+Ci1pcyBhbiBhYnNvbHV0ZSBuZWNlc3NpdHkgKGFuZAotPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL0hUVFAvUGVyZm9ybWFuY2UvUGlwZWxpbmUuaHRtbCI+Ci1waXBlbGluZWQgY29ubmVjdGlvbnMgYXJlIGZhc3RlcjwvYT4sIHNvIHlvdQotd2FudCB0byBzdXBwb3J0IHRoZW0pLgotCi08aDQ+U2NvcmVib2FyZCBGaWxlPC9oND4KLQotPHA+QXBhY2hlJ3MgcGFyZW50IGFuZCBjaGlsZHJlbiBjb21tdW5pY2F0ZSB3aXRoIGVhY2ggb3RoZXIgdGhyb3VnaAotc29tZXRoaW5nIGNhbGxlZCB0aGUgc2NvcmVib2FyZC4gIElkZWFsbHkgdGhpcyBzaG91bGQgYmUgaW1wbGVtZW50ZWQKLWluIHNoYXJlZCBtZW1vcnkuICBGb3IgdGhvc2Ugb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCB3ZSBlaXRoZXIgaGF2ZQotYWNjZXNzIHRvLCBvciBoYXZlIGJlZW4gZ2l2ZW4gZGV0YWlsZWQgcG9ydHMgZm9yLCBpdCB0eXBpY2FsbHkgaXMKLWltcGxlbWVudGVkIHVzaW5nIHNoYXJlZCBtZW1vcnkuICBUaGUgcmVzdCBkZWZhdWx0IHRvIHVzaW5nIGFuCi1vbi1kaXNrIGZpbGUuICBUaGUgb24tZGlzayBmaWxlIGlzIG5vdCBvbmx5IHNsb3csIGJ1dCBpdCBpcyB1bnJlbGlhYmxlCi0oYW5kIGxlc3MgZmVhdHVyZWQpLiAgUGVydXNlIHRoZSA8Y29kZT5zcmMvbWFpbi9jb25mLmg8L2NvZGU+IGZpbGUKLWZvciB5b3VyIGFyY2hpdGVjdHVyZSBhbmQgbG9vayBmb3IgZWl0aGVyIDxjb2RlPkhBVkVfTU1BUDwvY29kZT4gb3IKLTxjb2RlPkhBVkVfU0hNR0VUPC9jb2RlPi4gIERlZmluaW5nIG9uZSBvZiB0aG9zZSB0d28gZW5hYmxlcyB0aGUKLXN1cHBsaWVkIHNoYXJlZCBtZW1vcnkgY29kZS4gIElmIHlvdXIgc3lzdGVtIGhhcyBhbm90aGVyIHR5cGUgb2YKLXNoYXJlZCBtZW1vcnkgdGhlbiBlZGl0IHRoZSBmaWxlIDxjb2RlPnNyYy9tYWluL2h0dHBfbWFpbi5jPC9jb2RlPiBhbmQKLWFkZCB0aGUgaG9va3MgbmVjZXNzYXJ5IHRvIHVzZSBpdCBpbiBBcGFjaGUuICAoU2VuZCB1cyBiYWNrIGEgcGF0Y2gKLXRvbyBwbGVhc2UuKQotCi08cD5IaXN0b3JpY2FsIG5vdGU6ICBUaGUgTGludXggcG9ydCBvZiBBcGFjaGUgZGlkbid0IHN0YXJ0IHRvIHVzZQotc2hhcmVkIG1lbW9yeSB1bnRpbCB2ZXJzaW9uIDEuMiBvZiBBcGFjaGUuICBUaGlzIG92ZXJzaWdodCByZXN1bHRlZAotaW4gcmVhbGx5IHBvb3IgYW5kIHVucmVsaWFibGUgYmVoYXZpb3VyIG9mIGVhcmxpZXIgdmVyc2lvbnMgb2YgQXBhY2hlCi1vbiBMaW51eC4KLQotPGg0Pjxjb2RlPkRZTkFNSUNfTU9EVUxFX0xJTUlUPC9jb2RlPjwvaDQ+Ci0KLTxwPklmIHlvdSBoYXZlIG5vIGludGVudGlvbiBvZiB1c2luZyBkeW5hbWljYWxseSBsb2FkZWQgbW9kdWxlcwotKHlvdSBwcm9iYWJseSBkb24ndCBpZiB5b3UncmUgcmVhZGluZyB0aGlzIGFuZCB0dW5pbmcgeW91cgotc2VydmVyIGZvciBldmVyeSBsYXN0IG91bmNlIG9mIHBlcmZvcm1hbmNlKSB0aGVuIHlvdSBzaG91bGQgYWRkCi08Y29kZT4tRERZTkFNSUNfTU9EVUxFX0xJTUlUPTA8L2NvZGU+IHdoZW4gYnVpbGRpbmcgeW91ciBzZXJ2ZXIuCi1UaGlzIHdpbGwgc2F2ZSBSQU0gdGhhdCdzIGFsbG9jYXRlZCBvbmx5IGZvciBzdXBwb3J0aW5nIGR5bmFtaWNhbGx5Ci1sb2FkZWQgbW9kdWxlcy4KLQotPGgzPkFwcGVuZGl4OiBEZXRhaWxlZCBBbmFseXNpcyBvZiBhIFRyYWNlPC9oMz4KLQotSGVyZSBpcyBhIHN5c3RlbSBjYWxsIHRyYWNlIG9mIEFwYWNoZSAxLjMgcnVubmluZyBvbiBMaW51eC4gIFRoZSBydW4tdGltZQotY29uZmlndXJhdGlvbiBmaWxlIGlzIGVzc2VudGlhbGx5IHRoZSBkZWZhdWx0IHBsdXM6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0mbHQ7RGlyZWN0b3J5IC8mZ3Q7Ci0gICAgQWxsb3dPdmVycmlkZSBub25lCi0gICAgT3B0aW9ucyBGb2xsb3dTeW1MaW5rcwotJmx0Oy9EaXJlY3RvcnkmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVRoZSBmaWxlIGJlaW5nIHJlcXVlc3RlZCBpcyBhIHN0YXRpYyA2SyBmaWxlIG9mIG5vIHBhcnRpY3VsYXIgY29udGVudC4KLVRyYWNlcyBvZiBub24tc3RhdGljIHJlcXVlc3RzIG9yIHJlcXVlc3RzIHdpdGggY29udGVudCBuZWdvdGlhdGlvbgotbG9vayB3aWxkbHkgZGlmZmVyZW50IChhbmQgcXVpdGUgdWdseSBpbiBzb21lIGNhc2VzKS4gIEZpcnN0IHRoZQotZW50aXJlIHRyYWNlLCB0aGVuIHdlJ2xsIGV4YW1pbmUgZGV0YWlscy4gIChUaGlzIHdhcyBnZW5lcmF0ZWQgYnkKLXRoZSA8Y29kZT5zdHJhY2U8L2NvZGU+IHByb2dyYW0sIG90aGVyIHNpbWlsYXIgcHJvZ3JhbXMgaW5jbHVkZQotPGNvZGU+dHJ1c3M8L2NvZGU+LCA8Y29kZT5rdHJhY2U8L2NvZGU+LCBhbmQgPGNvZGU+cGFyPC9jb2RlPi4pCi0KLTxibG9ja3F1b3RlPjxwcmU+Ci1hY2NlcHQoMTUsIHtzaW5fZmFtaWx5PUFGX0lORVQsIHNpbl9wb3J0PWh0b25zKDIyMjgzKSwgc2luX2FkZHI9aW5ldF9hZGRyKCIxMjcuMC4wLjEiKX0sIFsxNl0pID0gMwotZmxvY2soMTgsIExPQ0tfVU4pICAgICAgICAgICAgICAgICAgICAgID0gMAotc2lnYWN0aW9uKFNJR1VTUjEsIHtTSUdfSUdOfSwgezB4ODA1OTk1NCwgW10sIFNBX0lOVEVSUlVQVH0pID0gMAotZ2V0c29ja25hbWUoMywge3Npbl9mYW1pbHk9QUZfSU5FVCwgc2luX3BvcnQ9aHRvbnMoODA4MCksIHNpbl9hZGRyPWluZXRfYWRkcigiMTI3LjAuMC4xIil9LCBbMTZdKSA9IDAKLXNldHNvY2tvcHQoMywgSVBQUk9UT19UQ1AxLCBbMV0sIDQpICAgICA9IDAKLXJlYWQoMywgIkdFVCAvNmsgSFRUUC8xLjBcclxuVXNlci1BZ2VudDogIi4uLiwgNDA5NikgPSA2MAotc2lnYWN0aW9uKFNJR1VTUjEsIHtTSUdfSUdOfSwge1NJR19JR059KSA9IDAKLXRpbWUoTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDg3Mzk1OTk2MAotZ2V0dGltZW9mZGF5KHs4NzM5NTk5NjAsIDQwNDkzNX0sIE5VTEwpID0gMAotc3RhdCgiL2hvbWUvZGdhdWRldC9hcC9hcGFjaGVuL2h0ZG9jcy82ayIsIHtzdF9tb2RlPVNfSUZSRUd8MDY0NCwgc3Rfc2l6ZT02MTQ0LCAuLi59KSA9IDAKLW9wZW4oIi9ob21lL2RnYXVkZXQvYXAvYXBhY2hlbi9odGRvY3MvNmsiLCBPX1JET05MWSkgPSA0Ci1tbWFwKDAsIDYxNDQsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIDQsIDApID0gMHg0MDBlZTAwMAotd3JpdGV2KDMsIFt7IkhUVFAvMS4xIDIwMCBPS1xyXG5EYXRlOiBUaHUsIDExIi4uLiwgMjQ1fSwgeyJcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMCIuLi4sIDYxNDR9XSwgMikgPSA2Mzg5Ci1jbG9zZSg0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwCi10aW1lKE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NzM5NTk5NjAKLXdyaXRlKDE3LCAiMTI3LjAuMC4xIC0gLSBbMTAvU2VwLzE5OTc6MjM6MzkiLi4uLCA3MSkgPSA3MQotZ2V0dGltZW9mZGF5KHs4NzM5NTk5NjAsIDQxNzc0Mn0sIE5VTEwpID0gMAotdGltZXMoe3Rtc191dGltZT01LCB0bXNfc3RpbWU9MCwgdG1zX2N1dGltZT0wLCB0bXNfY3N0aW1lPTB9KSA9IDQ0Njc0Nwotc2h1dGRvd24oMywgMSAvKiBzZW5kICovKSAgICAgICAgICAgICAgID0gMAotb2xkc2VsZWN0KDQsIFszXSwgTlVMTCwgWzNdLCB7MiwgMH0pICAgID0gMSAoaW4gWzNdLCBsZWZ0IHsyLCAwfSkKLXJlYWQoMywgIiIsIDIwNDgpICAgICAgICAgICAgICAgICAgICAgICA9IDAKLWNsb3NlKDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAKLXNpZ2FjdGlvbihTSUdVU1IxLCB7MHg4MDU5OTU0LCBbXSwgU0FfSU5URVJSVVBUfSwge1NJR19JR059KSA9IDAKLW11bm1hcCgweDQwMGVlMDAwLCA2MTQ0KSAgICAgICAgICAgICAgICA9IDAKLWZsb2NrKDE4LCBMT0NLX0VYKSAgICAgICAgICAgICAgICAgICAgICA9IDAKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotPHA+Tm90aWNlIHRoZSBhY2NlcHQgc2VyaWFsaXphdGlvbjoKLQotPGJsb2NrcXVvdGU+PHByZT4KLWZsb2NrKDE4LCBMT0NLX1VOKSAgICAgICAgICAgICAgICAgICAgICA9IDAKLS4uLgotZmxvY2soMTgsIExPQ0tfRVgpICAgICAgICAgICAgICAgICAgICAgID0gMAotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1UaGVzZSB0d28gY2FsbHMgY2FuIGJlIHJlbW92ZWQgYnkgZGVmaW5pbmcKLTxjb2RlPlNBRkVfVU5TRVJJQUxJWkVEX0FDQ0VQVDwvY29kZT4gYXMgZGVzY3JpYmVkIGVhcmxpZXIuCi0KLTxwPk5vdGljZSB0aGUgPGNvZGU+U0lHVVNSMTwvY29kZT4gbWFuaXB1bGF0aW9uOgotCi08YmxvY2txdW90ZT48cHJlPgotc2lnYWN0aW9uKFNJR1VTUjEsIHtTSUdfSUdOfSwgezB4ODA1OTk1NCwgW10sIFNBX0lOVEVSUlVQVH0pID0gMAotLi4uCi1zaWdhY3Rpb24oU0lHVVNSMSwge1NJR19JR059LCB7U0lHX0lHTn0pID0gMAotLi4uCi1zaWdhY3Rpb24oU0lHVVNSMSwgezB4ODA1OTk1NCwgW10sIFNBX0lOVEVSUlVQVH0sIHtTSUdfSUdOfSkgPSAwCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVRoaXMgaXMgY2F1c2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBncmFjZWZ1bCByZXN0YXJ0cy4gIFdoZW4gdGhlCi1wYXJlbnQgcmVjZWl2ZXMgYSA8Y29kZT5TSUdVU1IxPC9jb2RlPiBpdCBzZW5kcyBhIDxjb2RlPlNJR1VTUjE8L2NvZGU+Ci10byBhbGwgb2YgaXRzIGNoaWxkcmVuIChhbmQgaXQgYWxzbyBpbmNyZW1lbnRzIGEgImdlbmVyYXRpb24gY291bnRlciIKLWluIHNoYXJlZCBtZW1vcnkpLiAgQW55IGNoaWxkcmVuIHRoYXQgYXJlIGlkbGUgKGJldHdlZW4gY29ubmVjdGlvbnMpCi13aWxsIGltbWVkaWF0ZWx5IGRpZQotb2ZmIHdoZW4gdGhleSByZWNlaXZlIHRoZSBzaWduYWwuICBBbnkgY2hpbGRyZW4gdGhhdCBhcmUgaW4ga2VlcC1hbGl2ZQotY29ubmVjdGlvbnMsIGJ1dCBhcmUgaW4gYmV0d2VlbiByZXF1ZXN0cyB3aWxsIGRpZSBvZmYgaW1tZWRpYXRlbHkuICBCdXQKLWFueSBjaGlsZHJlbiB0aGF0IGhhdmUgYSBjb25uZWN0aW9uIGFuZCBhcmUgc3RpbGwgd2FpdGluZyBmb3IgdGhlIGZpcnN0Ci1yZXF1ZXN0IHdpbGwgbm90IGRpZSBvZmYgaW1tZWRpYXRlbHkuCi0KLTxwPlRvIHNlZSB3aHkgdGhpcyBpcyBuZWNlc3NhcnksIGNvbnNpZGVyIGhvdyBhIGJyb3dzZXIgcmVhY3RzIHRvIGEgY2xvc2VkCi1jb25uZWN0aW9uLiAgSWYgdGhlIGNvbm5lY3Rpb24gd2FzIGEga2VlcC1hbGl2ZSBjb25uZWN0aW9uIGFuZCB0aGUgcmVxdWVzdAotYmVpbmcgc2VydmljZWQgd2FzIG5vdCB0aGUgZmlyc3QgcmVxdWVzdCB0aGVuIHRoZSBicm93c2VyIHdpbGwgcXVpZXRseQotcmVpc3N1ZSB0aGUgcmVxdWVzdCBvbiBhIG5ldyBjb25uZWN0aW9uLiAgSXQgaGFzIHRvIGRvIHRoaXMgYmVjYXVzZSB0aGUKLXNlcnZlciBpcyBhbHdheXMgZnJlZSB0byBjbG9zZSBhIGtlZXAtYWxpdmUgY29ubmVjdGlvbiBpbiBiZXR3ZWVuIHJlcXVlc3RzCi0oaS5lLiBkdWUgdG8gYSB0aW1lb3V0IG9yIGJlY2F1c2Ugb2YgYSBtYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cykuCi1CdXQsIGlmIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCBiZWZvcmUgdGhlIGZpcnN0IHJlc3BvbnNlIGhhcyBiZWVuCi1yZWNlaXZlZCB0aGUgdHlwaWNhbCBicm93c2VyIHdpbGwgZGlzcGxheSBhICJkb2N1bWVudCBjb250YWlucyBubyBkYXRhIgotZGlhbG9ndWUgKG9yIGEgYnJva2VuIGltYWdlIGljb24pLiAgVGhpcyBpcyBkb25lIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQKLXRoZSBzZXJ2ZXIgaXMgYnJva2VuIGluIHNvbWUgd2F5IChvciBtYXliZSB0b28gb3ZlcmxvYWRlZCB0byByZXNwb25kCi1hdCBhbGwpLiAgU28gQXBhY2hlIHRyaWVzIHRvIGF2b2lkIGV2ZXIgZGVsaWJlcmF0ZWx5IGNsb3NpbmcgdGhlIGNvbm5lY3Rpb24KLWJlZm9yZSBpdCBoYXMgc2VudCBhIHNpbmdsZSByZXNwb25zZS4gIFRoaXMgaXMgdGhlIGNhdXNlIG9mIHRob3NlCi08Y29kZT5TSUdVU1IxPC9jb2RlPiBtYW5pcHVsYXRpb25zLgotCi08cD5Ob3RlIHRoYXQgaXQgaXMgdGhlb3JldGljYWxseSBwb3NzaWJsZSB0byBlbGltaW5hdGUgYWxsIHRocmVlIG9mCi10aGVzZSBjYWxscy4gIEJ1dCBpbiByb3VnaCB0ZXN0cyB0aGUgZ2FpbiBwcm92ZWQgdG8gYmUgYWxtb3N0IHVubm90aWNlYWJsZS4KLQotPHA+SW4gb3JkZXIgdG8gaW1wbGVtZW50IHZpcnR1YWwgaG9zdHMsIEFwYWNoZSBuZWVkcyB0byBrbm93IHRoZQotbG9jYWwgc29ja2V0IGFkZHJlc3MgdXNlZCB0byBhY2NlcHQgdGhlIGNvbm5lY3Rpb246Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci1nZXRzb2NrbmFtZSgzLCB7c2luX2ZhbWlseT1BRl9JTkVULCBzaW5fcG9ydD1odG9ucyg4MDgwKSwgc2luX2FkZHI9aW5ldF9hZGRyKCIxMjcuMC4wLjEiKX0sIFsxNl0pID0gMAotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1JdCBpcyBwb3NzaWJsZSB0byBlbGltaW5hdGUgdGhpcyBjYWxsIGluIG1hbnkgc2l0dWF0aW9ucyAoc3VjaCBhcyB3aGVuCi10aGVyZSBhcmUgbm8gdmlydHVhbCBob3N0cywgb3Igd2hlbiA8Y29kZT5MaXN0ZW48L2NvZGU+IGRpcmVjdGl2ZXMgYXJlCi11c2VkIHdoaWNoIGRvIG5vdCBoYXZlIHdpbGRjYXJkIGFkZHJlc3NlcykuICBCdXQgbm8gZWZmb3J0IGhhcyB5ZXQgYmVlbgotbWFkZSB0byBkbyB0aGVzZSBvcHRpbWl6YXRpb25zLgotCi08cD5BcGFjaGUgdHVybnMgb2ZmIHRoZSBOYWdsZSBhbGdvcml0aG06Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci1zZXRzb2Nrb3B0KDMsIElQUFJPVE9fVENQMSwgWzFdLCA0KSAgICAgPSAwCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLWJlY2F1c2Ugb2YgcHJvYmxlbXMgZGVzY3JpYmVkIGluIAotPGEgaHJlZj0iaHR0cDovL3d3dy5pc2kuZWR1L35qb2huaC9QQVBFUlMvSGVpZGVtYW5uOTdhLmh0bWwiPmEKLXBhcGVyIGJ5IEpvaG4gSGVpZGVtYW5uPC9hPi4KLQotPHA+Tm90aWNlIHRoZSB0d28gPGNvZGU+dGltZTwvY29kZT4gY2FsbHM6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci10aW1lKE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NzM5NTk5NjAKLS4uLgotdGltZShOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODczOTU5OTYwCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLU9uZSBvZiB0aGVzZSBvY2N1cnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVxdWVzdCwgYW5kIHRoZSBvdGhlciBvY2N1cnMKLWFzIGEgcmVzdWx0IG9mIHdyaXRpbmcgdGhlIGxvZy4gIEF0IGxlYXN0IG9uZSBvZiB0aGVzZSBpcyByZXF1aXJlZCB0bwotcHJvcGVybHkgaW1wbGVtZW50IHRoZSBIVFRQIHByb3RvY29sLiAgVGhlIHNlY29uZCBvY2N1cnMgYmVjYXVzZSB0aGUKLUNvbW1vbiBMb2cgRm9ybWF0IGRpY3RhdGVzIHRoYXQgdGhlIGxvZyByZWNvcmQgaW5jbHVkZSBhIHRpbWVzdGFtcCBvZiB0aGUKLWVuZCBvZiB0aGUgcmVxdWVzdC4gIEEgY3VzdG9tIGxvZ2dpbmcgbW9kdWxlIGNvdWxkIGVsaW1pbmF0ZSBvbmUgb2YgdGhlCi1jYWxscy4KLQotPHA+QXMgZGVzY3JpYmVkIGVhcmxpZXIsIDxjb2RlPlJ1bGUgU1RBVFVTPXllczwvY29kZT4gY2F1c2VzIHR3bwotPGNvZGU+Z2V0dGltZW9mZGF5PC9jb2RlPiBjYWxscyBhbmQgYSBjYWxsIHRvIDxjb2RlPnRpbWVzPC9jb2RlPjoKLQotPGJsb2NrcXVvdGU+PHByZT4KLWdldHRpbWVvZmRheSh7ODczOTU5OTYwLCA0MDQ5MzV9LCBOVUxMKSA9IDAKLS4uLgotZ2V0dGltZW9mZGF5KHs4NzM5NTk5NjAsIDQxNzc0Mn0sIE5VTEwpID0gMAotdGltZXMoe3Rtc191dGltZT01LCB0bXNfc3RpbWU9MCwgdG1zX2N1dGltZT0wLCB0bXNfY3N0aW1lPTB9KSA9IDQ0Njc0NwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1UaGVzZSBjYW4gYmUgcmVtb3ZlZCBieSBlaXRoZXIgcmVtb3ZpbmcgPGNvZGU+bW9kX3N0YXR1czwvY29kZT4gb3IKLXNldHRpbmcgPGNvZGU+UnVsZSBTVEFUVVM9bm88L2NvZGU+LgotCi08cD5JdCBtaWdodCBzZWVtIG9kZCB0byBjYWxsIDxjb2RlPnN0YXQ8L2NvZGU+OgotCi08YmxvY2txdW90ZT48cHJlPgotc3RhdCgiL2hvbWUvZGdhdWRldC9hcC9hcGFjaGVuL2h0ZG9jcy82ayIsIHtzdF9tb2RlPVNfSUZSRUd8MDY0NCwgc3Rfc2l6ZT02MTQ0LCAuLi59KSA9IDAKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotVGhpcyBpcyBwYXJ0IG9mIHRoZSBhbGdvcml0aG0gd2hpY2ggY2FsY3VsYXRlcyB0aGUKLTxjb2RlPlBBVEhfSU5GTzwvY29kZT4gZm9yIHVzZSBieSBDR0lzLiAgSW4gZmFjdCBpZiB0aGUgcmVxdWVzdCBoYWQgYmVlbgotZm9yIHRoZSBVUkkgPGNvZGU+L2NnaS1iaW4vcHJpbnRlbnYvZm9vYmFyPC9jb2RlPiB0aGVuIHRoZXJlIHdvdWxkIGJlCi10d28gY2FsbHMgdG8gPGNvZGU+c3RhdDwvY29kZT4uICBUaGUgZmlyc3QgZm9yCi08Y29kZT4vaG9tZS9kZ2F1ZGV0L2FwL2FwYWNoZW4vY2dpLWJpbi9wcmludGVudi9mb29iYXI8L2NvZGU+Ci13aGljaCBkb2VzIG5vdCBleGlzdCwgYW5kIHRoZSBzZWNvbmQgZm9yCi08Y29kZT4vaG9tZS9kZ2F1ZGV0L2FwL2FwYWNoZW4vY2dpLWJpbi9wcmludGVudjwvY29kZT4sIHdoaWNoIGRvZXMgZXhpc3QuCi1SZWdhcmRsZXNzLCBhdCBsZWFzdCBvbmUgPGNvZGU+c3RhdDwvY29kZT4gY2FsbCBpcyBuZWNlc3Nhcnkgd2hlbgotc2VydmluZyBzdGF0aWMgZmlsZXMgYmVjYXVzZSB0aGUgZmlsZSBzaXplIGFuZCBtb2RpZmljYXRpb24gdGltZXMgYXJlCi11c2VkIHRvIGdlbmVyYXRlIEhUVFAgaGVhZGVycyAoc3VjaCBhcyA8Y29kZT5Db250ZW50LUxlbmd0aDwvY29kZT4sCi08Y29kZT5MYXN0LU1vZGlmaWVkPC9jb2RlPikgYW5kIGltcGxlbWVudCBwcm90b2NvbCBmZWF0dXJlcyAoc3VjaAotYXMgPGNvZGU+SWYtTW9kaWZpZWQtU2luY2U8L2NvZGU+KS4gIEEgc29tZXdoYXQgbW9yZSBjbGV2ZXIgc2VydmVyCi1jb3VsZCBhdm9pZCB0aGUgPGNvZGU+c3RhdDwvY29kZT4gd2hlbiBzZXJ2aW5nIG5vbi1zdGF0aWMgZmlsZXMsCi1ob3dldmVyIGRvaW5nIHNvIGluIEFwYWNoZSBpcyB2ZXJ5IGRpZmZpY3VsdCBnaXZlbiB0aGUgbW9kdWxhciBzdHJ1Y3R1cmUuCi0KLTxwPkFsbCBzdGF0aWMgZmlsZXMgYXJlIHNlcnZlZCB1c2luZyA8Y29kZT5tbWFwPC9jb2RlPjoKLQotPGJsb2NrcXVvdGU+PHByZT4KLW1tYXAoMCwgNjE0NCwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgNCwgMCkgPSAweDQwMGVlMDAwCi0uLi4KLW11bm1hcCgweDQwMGVlMDAwLCA2MTQ0KSAgICAgICAgICAgICAgICA9IDAKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotT24gc29tZSBhcmNoaXRlY3R1cmVzIGl0J3Mgc2xvd2VyIHRvIDxjb2RlPm1tYXA8L2NvZGU+IHNtYWxsCi1maWxlcyB0aGFuIGl0IGlzIHRvIHNpbXBseSA8Y29kZT5yZWFkPC9jb2RlPiB0aGVtLiAgVGhlIGRlZmluZQotPGNvZGU+TU1BUF9USFJFU0hPTEQ8L2NvZGU+IGNhbiBiZSBzZXQgdG8gdGhlIG1pbmltdW0gc2l6ZSByZXF1aXJlZCBiZWZvcmUKLXVzaW5nIDxjb2RlPm1tYXA8L2NvZGU+LiAgQnkgZGVmYXVsdCBpdCdzIHNldCB0byAwIChleGNlcHQgb24gU3VuT1M0Ci13aGVyZSBleHBlcmltZW50YXRpb24gaGFzIHNob3duIDgxOTIgdG8gYmUgYSBiZXR0ZXIgdmFsdWUpLiAgVXNpbmcgYQotdG9vbCBzdWNoIGFzCi08YSBocmVmPSJodHRwOi8vcmVhbGl0eS5zZ2kuY29tL2xtX2VuZ3IvbG1iZW5jaC9sbWJlbmNoLmh0bWwiPmxtYmVuY2g8L2E+Ci15b3UgY2FuIGRldGVybWluZSB0aGUgb3B0aW1hbCBzZXR0aW5nIGZvciB5b3VyCi1lbnZpcm9ubWVudC4gIEl0IG1heSBldmVuIGJlIHRoZSBjYXNlIHRoYXQgPGNvZGU+bW1hcDwvY29kZT4gaXNuJ3QgdXNlZAotb24geW91ciBhcmNoaXRlY3R1cmUsIGlmIHNvIHRoZW4gZGVmaW5pbmcgPGNvZGU+VVNFX01NQVBfRklMRVM8L2NvZGU+Ci1taWdodCB3b3JrIChpZiBpdCB3b3JrcyB0aGVuIHJlcG9ydCBiYWNrIHRvIHVzKS4KLQotCi08cD5BcGFjaGUgZG9lcyBpdHMgYmVzdCB0byBhdm9pZCBjb3B5aW5nIGJ5dGVzIGFyb3VuZCBpbiBtZW1vcnkuICBUaGUKLWZpcnN0IHdyaXRlIG9mIGFueSByZXF1ZXN0IHR5cGljYWxseSBpcyB0dXJuZWQgaW50byBhIDxjb2RlPndyaXRldjwvY29kZT4KLXdoaWNoIGNvbWJpbmVzIGJvdGggdGhlIGhlYWRlcnMgYW5kIHRoZSBmaXJzdCBodW5rIG9mIGRhdGE6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci13cml0ZXYoMywgW3siSFRUUC8xLjEgMjAwIE9LXHJcbkRhdGU6IFRodSwgMTEiLi4uLCAyNDV9LCB7IlwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwIi4uLiwgNjE0NH1dLCAyKSA9IDYzODkKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotV2hlbiBkb2luZyBIVFRQLzEuMSBjaHVua2VkIGVuY29kaW5nIEFwYWNoZSB3aWxsIGdlbmVyYXRlIHVwIHRvIGZvdXIKLWVsZW1lbnQgPGNvZGU+d3JpdGV2PC9jb2RlPnMuICBUaGUgZ29hbCBpcyB0byBwdXNoIHRoZSBieXRlIGNvcHlpbmcKLWludG8gdGhlIGtlcm5lbCwgd2hlcmUgaXQgdHlwaWNhbGx5IGhhcyB0byBoYXBwZW4gYW55aG93ICh0byBhc3NlbWJsZQotbmV0d29yayBwYWNrZXRzKS4gIE9uIHRlc3RpbmcsIHZhcmlvdXMgVW5peGVzIChCU0RJIDIueCwgU29sYXJpcyAyLjUsCi1MaW51eCAyLjAuMzErKSBwcm9wZXJseSBjb21iaW5lIHRoZSBlbGVtZW50cyBpbnRvIG5ldHdvcmsgcGFja2V0cy4KLVByZS0yLjAuMzEgTGludXggd2lsbCBub3QgY29tYmluZSwgYW5kIHdpbGwgY3JlYXRlIGEgcGFja2V0IGZvcgotZWFjaCBlbGVtZW50LCBzbyB1cGdyYWRpbmcgaXMgYSBnb29kIGlkZWEuICBEZWZpbmluZyA8Y29kZT5OT19XUklURVY8L2NvZGU+Ci13aWxsIGRpc2FibGUgdGhpcyBjb21iaW5pbmcsIGJ1dCByZXN1bHQgaW4gdmVyeSBwb29yIGNodW5rZWQgZW5jb2RpbmcKLXBlcmZvcm1hbmNlLgotCi08cD5UaGUgbG9nIHdyaXRlOgotCi08YmxvY2txdW90ZT48cHJlPgotd3JpdGUoMTcsICIxMjcuMC4wLjEgLSAtIFsxMC9TZXAvMTk5NzoyMzozOSIuLi4sIDcxKSA9IDcxCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLWNhbiBiZSBkZWZlcnJlZCBieSBkZWZpbmluZyA8Y29kZT5CVUZGRVJFRF9MT0dTPC9jb2RlPi4gIEluIHRoaXMgY2FzZQotdXAgdG8gPGNvZGU+UElQRV9CVUY8L2NvZGU+IGJ5dGVzIChhIFBPU0lYIGRlZmluZWQgY29uc3RhbnQpIG9mIGxvZyBlbnRyaWVzCi1hcmUgYnVmZmVyZWQgYmVmb3JlIHdyaXRpbmcuICBBdCBubyB0aW1lIGRvZXMgaXQgc3BsaXQgYSBsb2cgZW50cnkKLWFjcm9zcyBhIDxjb2RlPlBJUEVfQlVGPC9jb2RlPiBib3VuZGFyeSBiZWNhdXNlIHRob3NlIHdyaXRlcyBtYXkgbm90Ci1iZSBhdG9taWMuICAoaS5lLiBlbnRyaWVzIGZyb20gbXVsdGlwbGUgY2hpbGRyZW4gY291bGQgYmVjb21lIG1peGVkIHRvZ2V0aGVyKS4KLVRoZSBjb2RlIGRvZXMgaXQgYmVzdCB0byBmbHVzaCB0aGlzIGJ1ZmZlciB3aGVuIGEgY2hpbGQgZGllcy4KLQotPHA+VGhlIGxpbmdlcmluZyBjbG9zZSBjb2RlIGNhdXNlcyBmb3VyIHN5c3RlbSBjYWxsczoKLQotPGJsb2NrcXVvdGU+PHByZT4KLXNodXRkb3duKDMsIDEgLyogc2VuZCAqLykgICAgICAgICAgICAgICA9IDAKLW9sZHNlbGVjdCg0LCBbM10sIE5VTEwsIFszXSwgezIsIDB9KSAgICA9IDEgKGluIFszXSwgbGVmdCB7MiwgMH0pCi1yZWFkKDMsICIiLCAyMDQ4KSAgICAgICAgICAgICAgICAgICAgICAgPSAwCi1jbG9zZSgzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLXdoaWNoIHdlcmUgZGVzY3JpYmVkIGVhcmxpZXIuCi0KLTxwPkxldCdzIGFwcGx5IHNvbWUgb2YgdGhlc2Ugb3B0aW1pemF0aW9uczoKLTxjb2RlPi1EU0FGRV9VTlNFUklBTElaRURfQUNDRVBUIC1EQlVGRkVSRURfTE9HUzwvY29kZT4gYW5kCi08Y29kZT5SdWxlIFNUQVRVUz1ubzwvY29kZT4uICBIZXJlJ3MgdGhlIGZpbmFsIHRyYWNlOgotCi08YmxvY2txdW90ZT48cHJlPgotYWNjZXB0KDE1LCB7c2luX2ZhbWlseT1BRl9JTkVULCBzaW5fcG9ydD1odG9ucygyMjI4NiksIHNpbl9hZGRyPWluZXRfYWRkcigiMTI3LjAuMC4xIil9LCBbMTZdKSA9IDMKLXNpZ2FjdGlvbihTSUdVU1IxLCB7U0lHX0lHTn0sIHsweDgwNThjOTgsIFtdLCBTQV9JTlRFUlJVUFR9KSA9IDAKLWdldHNvY2tuYW1lKDMsIHtzaW5fZmFtaWx5PUFGX0lORVQsIHNpbl9wb3J0PWh0b25zKDgwODApLCBzaW5fYWRkcj1pbmV0X2FkZHIoIjEyNy4wLjAuMSIpfSwgWzE2XSkgPSAwCi1zZXRzb2Nrb3B0KDMsIElQUFJPVE9fVENQMSwgWzFdLCA0KSAgICAgPSAwCi1yZWFkKDMsICJHRVQgLzZrIEhUVFAvMS4wXHJcblVzZXItQWdlbnQ6ICIuLi4sIDQwOTYpID0gNjAKLXNpZ2FjdGlvbihTSUdVU1IxLCB7U0lHX0lHTn0sIHtTSUdfSUdOfSkgPSAwCi10aW1lKE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NzM5NjE5MTYKLXN0YXQoIi9ob21lL2RnYXVkZXQvYXAvYXBhY2hlbi9odGRvY3MvNmsiLCB7c3RfbW9kZT1TX0lGUkVHfDA2NDQsIHN0X3NpemU9NjE0NCwgLi4ufSkgPSAwCi1vcGVuKCIvaG9tZS9kZ2F1ZGV0L2FwL2FwYWNoZW4vaHRkb2NzLzZrIiwgT19SRE9OTFkpID0gNAotbW1hcCgwLCA2MTQ0LCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCA0LCAwKSA9IDB4NDAwZTMwMDAKLXdyaXRldigzLCBbeyJIVFRQLzEuMSAyMDAgT0tcclxuRGF0ZTogVGh1LCAxMSIuLi4sIDI0NX0sIHsiXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDAiLi4uLCA2MTQ0fV0sIDIpID0gNjM4OQotY2xvc2UoNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMAotdGltZShOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODczOTYxOTE2Ci1zaHV0ZG93bigzLCAxIC8qIHNlbmQgKi8pICAgICAgICAgICAgICAgPSAwCi1vbGRzZWxlY3QoNCwgWzNdLCBOVUxMLCBbM10sIHsyLCAwfSkgICAgPSAxIChpbiBbM10sIGxlZnQgezIsIDB9KQotcmVhZCgzLCAiIiwgMjA0OCkgICAgICAgICAgICAgICAgICAgICAgID0gMAotY2xvc2UoMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMAotc2lnYWN0aW9uKFNJR1VTUjEsIHsweDgwNThjOTgsIFtdLCBTQV9JTlRFUlJVUFR9LCB7U0lHX0lHTn0pID0gMAotbXVubWFwKDB4NDAwZTMwMDAsIDYxNDQpICAgICAgICAgICAgICAgID0gMAotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1UaGF0J3MgMTkgc3lzdGVtIGNhbGxzLCBvZiB3aGljaCA0IHJlbWFpbiByZWxhdGl2ZWx5IGVhc3kgdG8gcmVtb3ZlLAotYnV0IGRvbid0IHNlZW0gd29ydGggdGhlIGVmZm9ydC4KLQotPGgzPkFwcGVuZGl4OiBUaGUgUHJlLUZvcmtpbmcgTW9kZWw8L2gzPgotCi08cD5BcGFjaGUgKG9uIFVuaXgpIGlzIGEgPGk+cHJlLWZvcmtpbmc8L2k+IG1vZGVsIHNlcnZlci4gIFRoZQotPGk+cGFyZW50PC9pPiBwcm9jZXNzIGlzIHJlc3BvbnNpYmxlIG9ubHkgZm9yIGZvcmtpbmcgPGk+Y2hpbGQ8L2k+Ci1wcm9jZXNzZXMsIGl0IGRvZXMgbm90IHNlcnZlIGFueSByZXF1ZXN0cyBvciBzZXJ2aWNlIGFueSBuZXR3b3JrCi1zb2NrZXRzLiAgVGhlIGNoaWxkIHByb2Nlc3NlcyBhY3R1YWxseSBwcm9jZXNzIGNvbm5lY3Rpb25zLCB0aGV5IHNlcnZlCi1tdWx0aXBsZSBjb25uZWN0aW9ucyAob25lIGF0IGEgdGltZSkgYmVmb3JlIGR5aW5nLgotVGhlIHBhcmVudCBzcGF3bnMgbmV3IG9yIGtpbGxzIG9mZiBvbGQKLWNoaWxkcmVuIGluIHJlc3BvbnNlIHRvIGNoYW5nZXMgaW4gdGhlIGxvYWQgb24gdGhlIHNlcnZlciAoaXQgZG9lcyBzbwotYnkgbW9uaXRvcmluZyBhIHNjb3JlYm9hcmQgd2hpY2ggdGhlIGNoaWxkcmVuIGtlZXAgdXAgdG8gZGF0ZSkuCi0KLTxwPlRoaXMgbW9kZWwgZm9yIHNlcnZlcnMgb2ZmZXJzIGEgcm9idXN0bmVzcyB0aGF0IG90aGVyIG1vZGVscyBkbwotbm90LiAgSW4gcGFydGljdWxhciwgdGhlIHBhcmVudCBjb2RlIGlzIHZlcnkgc2ltcGxlLCBhbmQgd2l0aCBhIGhpZ2gKLWRlZ3JlZSBvZiBjb25maWRlbmNlIHRoZSBwYXJlbnQgd2lsbCBjb250aW51ZSB0byBkbyBpdHMgam9iIHdpdGhvdXQKLWVycm9yLiAgVGhlIGNoaWxkcmVuIGFyZSBjb21wbGV4LCBhbmQgd2hlbiB5b3UgYWRkIGluIHRoaXJkIHBhcnR5Ci1jb2RlIHZpYSBtb2R1bGVzLCB5b3UgcmlzayBzZWdtZW50YXRpb24gZmF1bHRzIGFuZCBvdGhlciBmb3JtcyBvZgotY29ycnVwdGlvbi4gIEV2ZW4gc2hvdWxkIHN1Y2ggYSB0aGluZyBoYXBwZW4sIGl0IG9ubHkgYWZmZWN0cyBvbmUKLWNvbm5lY3Rpb24gYW5kIHRoZSBzZXJ2ZXIgY29udGludWVzIHNlcnZpbmcgcmVxdWVzdHMuICBUaGUgcGFyZW50Ci1xdWlja2x5IHJlcGxhY2VzIHRoZSBkZWFkIGNoaWxkLgotCi08cD5QcmUtZm9ya2luZyBpcyBhbHNvIHZlcnkgcG9ydGFibGUgYWNyb3NzIGRpYWxlY3RzIG9mIFVuaXguCi1IaXN0b3JpY2FsbHkgdGhpcyBoYXMgYmVlbiBhbiBpbXBvcnRhbnQgZ29hbCBmb3IgQXBhY2hlLCBhbmQgaXQgY29udGludWVzCi10byByZW1haW4gc28uCi0KLTxwPlRoZSBwcmUtZm9ya2luZyBtb2RlbCBjb21lcyB1bmRlciBjcml0aWNpc20gZm9yIHZhcmlvdXMKLXBlcmZvcm1hbmNlIGFzcGVjdHMuICBPZiBwYXJ0aWN1bGFyIGNvbmNlcm4gYXJlIHRoZSBvdmVyaGVhZAotb2YgZm9ya2luZyBhIHByb2Nlc3MsIHRoZSBvdmVyaGVhZCBvZiBjb250ZXh0IHN3aXRjaGVzIGJldHdlZW4KLXByb2Nlc3NlcywgYW5kIHRoZSBtZW1vcnkgb3ZlcmhlYWQgb2YgaGF2aW5nIG11bHRpcGxlIHByb2Nlc3Nlcy4KLUZ1cnRoZXJtb3JlIGl0IGRvZXMgbm90IG9mZmVyIGFzIG1hbnkgb3Bwb3J0dW5pdGllcyBmb3IgZGF0YS1jYWNoaW5nCi1iZXR3ZWVuIHJlcXVlc3RzIChzdWNoIGFzIGEgcG9vbCBvZiA8Y29kZT5tbWFwcGVkPC9jb2RlPiBmaWxlcykuCi1WYXJpb3VzIG90aGVyIG1vZGVscyBleGlzdCBhbmQgZXh0ZW5zaXZlIGFuYWx5c2lzIGNhbiBiZSBmb3VuZCBpbiB0aGUKLTxhIGhyZWY9Imh0dHA6Ly93d3cuY3Mud3VzdGwuZWR1L35qeGgvcmVzZWFyY2gvcmVzZWFyY2guaHRtbCI+IHBhcGVycwotb2YgdGhlIEpBV1MgcHJvamVjdDwvYT4uICBJbiBwcmFjdGljZSBhbGwgb2YgdGhlc2UgY29zdHMgdmFyeSBkcmFzdGljYWxseQotZGVwZW5kaW5nIG9uIHRoZSBvcGVyYXRpbmcgc3lzdGVtLgotCi08cD5BcGFjaGUncyBjb3JlIGNvZGUgaXMgYWxyZWFkeSBtdWx0aXRocmVhZCBhd2FyZSwgYW5kIEFwYWNoZSB2ZXJzaW9uCi0xLjMgaXMgbXVsdGl0aHJlYWRlZCBvbiBOVC4gIFRoZXJlIGhhdmUgYmVlbiBhdCBsZWFzdCB0d28gb3RoZXIgZXhwZXJpbWVudGFsCi1pbXBsZW1lbnRhdGlvbnMgb2YgdGhyZWFkZWQgQXBhY2hlIChvbmUgdXNpbmcgdGhlIDEuMyBjb2RlIGJhc2Ugb24gRENFLAotYW5kIG9uZSB1c2luZyBhIGN1c3RvbSB1c2VyLWxldmVsIHRocmVhZHMgcGFja2FnZSBhbmQgdGhlIDEuMCBjb2RlIGJhc2UsCi1uZWl0aGVyIGFyZSBhdmFpbGFibGUgcHVibGljYWxseSkuICBQYXJ0IG9mIG91ciByZWRlc2lnbiBmb3IgdmVyc2lvbiAyLjAKLW9mIEFwYWNoZSB3aWxsIGluY2x1ZGUgYWJzdHJhY3Rpb25zIG9mIHRoZSBzZXJ2ZXIgbW9kZWwgc28gdGhhdCB3ZQotY2FuIGNvbnRpbnVlIHRvIHN1cHBvcnQgdGhlIHByZS1mb3JraW5nIG1vZGVsLCBhbmQgYWxzbyBzdXBwb3J0IHZhcmlvdXMKLXRocmVhZGVkIG1vZGVscy4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbWlzYy9yZXdyaXRlZ3VpZGUuaHRtbCBiL2RvY3MvbWFudWFsL21pc2MvcmV3cml0ZWd1aWRlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YzEwZTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbWlzYy9yZXdyaXRlZ3VpZGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MDUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+PEhFQUQ+Ci08VElUTEU+QXBhY2hlIDEuMyBVUkwgUmV3cml0aW5nIEd1aWRlPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTxCTE9DS1FVT1RFPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLQotPERJViBBTElHTj1DRU5URVI+Ci0KLTxIMT4KLUFwYWNoZSAxLjM8QlI+Ci1VUkwgUmV3cml0aW5nIEd1aWRlPEJSPgotPC9IMT4KLQotPEFERFJFU1M+T3JpZ2luYWxseSB3cml0dGVuIGJ5PEJSPgotUmFsZiBTLiBFbmdlbHNjaGFsbCAmbHQ7cnNlQGFwYWNoZS5vcmcmZ3Q8QlI+Ci1EZWNlbWJlciAxOTk3PC9BRERSRVNTPgotCi08L0RJVj4KLQotPFA+Ci1UaGlzIGRvY3VtZW50IHN1cHBsZW1lbnRzIHRoZSBtb2RfcmV3cml0ZSA8YQotaHJlZj0iLi4vbW9kL21vZF9yZXdyaXRlLmh0bWwiPnJlZmVyZW5jZSBkb2N1bWVudGF0aW9uPC9hPi4gSXQgZGVzY3JpYmVzCi1ob3cgb25lIGNhbiB1c2UgQXBhY2hlJ3MgbW9kX3Jld3JpdGUgdG8gc29sdmUgdHlwaWNhbCBVUkwtYmFzZWQgcHJvYmxlbXMKLXdlYm1hc3RlcnMgYXJlIHVzdWFsbHkgY29uZnJvbnRlZCB3aXRoIGluIHByYWN0aWNlLiBJIGdpdmUgZGV0YWlsZWQKLWRlc2NyaXB0aW9ucyBvbiBob3cgdG8gc29sdmUgZWFjaCBwcm9ibGVtIGJ5IGNvbmZpZ3VyaW5nIFVSTCByZXdyaXRpbmcKLXJ1bGVzZXRzLgotCi08SDI+PGEgbmFtZT0iVG9DMSI+SW50cm9kdWN0aW9uIHRvIG1vZF9yZXdyaXRlPC9hPjwvSDI+Ci0KLVRoZSBBcGFjaGUgbW9kdWxlIG1vZF9yZXdyaXRlIGlzIGEga2lsbGVyIG9uZSwgaS5lLiBpdCBpcyBhIHJlYWxseQotc29waGlzdGljYXRlZCBtb2R1bGUgd2hpY2ggcHJvdmlkZXMgYSBwb3dlcmZ1bCB3YXkgdG8gZG8gVVJMIG1hbmlwdWxhdGlvbnMuCi1XaXRoIGl0IHlvdSBjYW4gbmVhcmx5IGRvIGFsbCB0eXBlcyBvZiBVUkwgbWFuaXB1bGF0aW9ucyB5b3UgZXZlciBkcmVhbWVkCi1hYm91dC4gVGhlIHByaWNlIHlvdSBoYXZlIHRvIHBheSBpcyB0byBhY2NlcHQgY29tcGxleGl0eSwgYmVjYXVzZQotbW9kX3Jld3JpdGUncyBtYWpvciBkcmF3YmFjayBpcyB0aGF0IGl0IGlzIG5vdCBlYXN5IHRvIHVuZGVyc3RhbmQgYW5kIHVzZSBmb3IKLXRoZSBiZWdpbm5lci4gQW5kIGV2ZW4gQXBhY2hlIGV4cGVydHMgc29tZXRpbWVzIGRpc2NvdmVyIG5ldyBhc3BlY3RzIHdoZXJlCi1tb2RfcmV3cml0ZSBjYW4gaGVscC4KLTxQPgotSW4gb3RoZXIgd29yZHM6IFdpdGggbW9kX3Jld3JpdGUgeW91IGVpdGhlciBzaG9vdCB5b3Vyc2VsZiBpbiB0aGUgZm9vdCB0aGUKLWZpcnN0IHRpbWUgYW5kIG5ldmVyIHVzZSBpdCBhZ2FpbiBvciBsb3ZlIGl0IGZvciB0aGUgcmVzdCBvZiB5b3VyIGxpZmUgYmVjYXVzZQotb2YgaXRzIHBvd2VyLiBUaGlzIHBhcGVyIHRyaWVzIHRvIGdpdmUgeW91IGEgZmV3IGluaXRpYWwgc3VjY2VzcyBldmVudHMgdG8KLWF2b2lkIHRoZSBmaXJzdCBjYXNlIGJ5IHByZXNlbnRpbmcgYWxyZWFkeSBpbnZlbnRlZCBzb2x1dGlvbnMgdG8geW91LgotCi08SDI+PGEgbmFtZT0iVG9DMiI+UHJhY3RpY2FsIFNvbHV0aW9uczwvYT48L0gyPgotCi1IZXJlIGNvbWUgYSBsb3Qgb2YgcHJhY3RpY2FsIHNvbHV0aW9ucyBJJ3ZlIGVpdGhlciBpbnZlbnRlZCBteXNlbGYgb3IKLWNvbGxlY3RlZCBmcm9tIG90aGVyIHBlb3BsZXMgc29sdXRpb25zIGluIHRoZSBwYXN0LiBGZWVsIGZyZWUgdG8gbGVhcm4gdGhlCi1ibGFjayBtYWdpYyBvZiBVUkwgcmV3cml0aW5nIGZyb20gdGhlc2UgZXhhbXBsZXMuCi0KLTxQPgotQVRURU5USU9OOiBEZXBlbmRpbmcgb24geW91ciBzZXJ2ZXItY29uZmlndXJhdGlvbiBpdCBjYW4gYmUgbmVjZXNzYXJ5IHRvCi1zbGlnaHRseSBjaGFuZ2UgdGhlIGV4YW1wbGVzIGZvciB5b3VyIHNpdHVhdGlvbiwgZS5nLiBhZGRpbmcgdGhlIFtQVF0gZmxhZwotd2hlbiBhZGRpdGlvbmFsbHkgdXNpbmcgbW9kX2FsaWFzIGFuZCBtb2RfdXNlcmRpciwgZXRjLiBPciByZXdyaXRpbmcgYSBydWxlc2V0Ci10byBmaXQgaW4gPHR0Pi5odGFjY2VzczwvdHQ+IGNvbnRleHQgaW5zdGVhZCBvZiBwZXItc2VydmVyIGNvbnRleHQuIEFsd2F5cyB0cnkKLXRvIHVuZGVyc3RhbmQgd2hhdCBhIHBhcnRpY3VsYXIgcnVsZXNldCByZWFsbHkgZG9lcyBiZWZvcmUgeW91IHVzZSBpdC4gSXQKLWF2b2lkIHByb2JsZW1zLgotCi08SDE+VVJMIExheW91dDwvSDE+Ci0KLTxQPgotPEgyPkNhbm9uaWNhbCBVUkxzPC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLU9uIHNvbWUgd2Vic2VydmVycyB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBVUkwgZm9yIGEgcmVzb3VyY2UuICBVc3VhbGx5IHRoZXJlCi1hcmUgY2Fub25pY2FsIFVSTHMgKHdoaWNoIHNob3VsZCBiZSBhY3R1YWxseSB1c2VkIGFuZCBkaXN0cmlidXRlZCkgYW5kIHRob3NlCi13aGljaCBhcmUganVzdCBzaG9ydGN1dHMsIGludGVybmFsIG9uZXMsIGV0Yy4gIEluZGVwZW5kZWQgd2hpY2ggVVJMIHRoZSB1c2VyCi1zdXBwbGllZCB3aXRoIHRoZSByZXF1ZXN0IGhlIHNob3VsZCBmaW5hbGx5IHNlZSB0aGUgY2Fub25pY2FsIG9uZSBvbmx5LgotCi08UD4KLTxEVD48U1RST05HPlNvbHV0aW9uOjwvU1RST05HPgotPEREPgotV2UgZG8gYW4gZXh0ZXJuYWwgSFRUUCByZWRpcmVjdCBmb3IgYWxsIG5vbi1jYW5vbmljYWwgVVJMcyB0byBmaXggdGhlbSBpbiB0aGUKLWxvY2F0aW9uIHZpZXcgb2YgdGhlIEJyb3dzZXIgYW5kIGZvciBhbGwgc3Vic2VxdWVudCByZXF1ZXN0cy4gSW4gdGhlIGV4YW1wbGUKLXJ1bGVzZXQgYmVsb3cgd2UgcmVwbGFjZSA8dHQ+L351c2VyPC90dD4gYnkgdGhlIGNhbm9uaWNhbCA8dHQ+L3UvdXNlcjwvdHQ+IGFuZAotZml4IGEgbWlzc2luZyB0cmFpbGluZyBzbGFzaCBmb3IgPHR0Pi91L3VzZXI8L3R0Pi4KLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlUnVsZSAgIF4vPGI+fjwvYj4oW14vXSspLz8oLiopICAgIC88Yj51PC9iPi8kMS8kMiAgWzxiPlI8L2I+XQotUmV3cml0ZVJ1bGUgICBeLyhbdWdlXSkvKDxiPlteL10rPC9iPikkICAvJDEvJDI8Yj4vPC9iPiAgIFs8Yj5SPC9iPl0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08L0RMPgotCi08UD4KLTxIMj5DYW5vbmljYWwgSG9zdG5hbWVzPC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLS4uLgotCi08UD4KLTxEVD48U1RST05HPlNvbHV0aW9uOjwvU1RST05HPgotPEREPgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVDb25kICV7SFRUUF9IT1NUfSAgICFeZnVsbHlcLnF1YWxpZmllZFwuZG9tYWluXC5uYW1lIFtOQ10KLVJld3JpdGVDb25kICV7SFRUUF9IT1NUfSAgICFeJAotUmV3cml0ZUNvbmQgJXtTRVJWRVJfUE9SVH0gIV44MCQKLVJld3JpdGVSdWxlIF4vKC4qKSAgICAgICAgIGh0dHA6Ly9mdWxseS5xdWFsaWZpZWQuZG9tYWluLm5hbWU6JXtTRVJWRVJfUE9SVH0vJDEgW0wsUl0KLVJld3JpdGVDb25kICV7SFRUUF9IT1NUfSAgICFeZnVsbHlcLnF1YWxpZmllZFwuZG9tYWluXC5uYW1lIFtOQ10KLVJld3JpdGVDb25kICV7SFRUUF9IT1NUfSAgICFeJAotUmV3cml0ZVJ1bGUgXi8oLiopICAgICAgICAgaHR0cDovL2Z1bGx5LnF1YWxpZmllZC5kb21haW4ubmFtZS8kMSBbTCxSXQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTwvREw+Ci0KLTxQPgotPEgyPk1vdmVkIERvY3VtZW50Um9vdDwvSDI+Ci08UD4KLQotPERMPgotPERUPjxTVFJPTkc+RGVzY3JpcHRpb246PC9TVFJPTkc+Ci08REQ+Ci1Vc3VhbGx5IHRoZSBEb2N1bWVudFJvb3Qgb2YgdGhlIHdlYnNlcnZlciBkaXJlY3RseSByZWxhdGVzIHRvIHRoZSBVUkwKLWBgPHR0Pi88L3R0PicnLiBCdXQgb2Z0ZW4gdGhpcyBkYXRhIGlzIG5vdCByZWFsbHkgb2YgdG9wLWxldmVsIHByaW9yaXR5LCBpdCBpcwotcGVyaGFwcyBqdXN0IG9uZSBlbnRpdHkgb2YgYSBsb3Qgb2YgZGF0YSBwb29scy4gRm9yIGluc3RhbmNlIGF0IG91ciBJbnRyYW5ldAotc2l0ZXMgdGhlcmUgYXJlIDx0dD4vZS93d3cvPC90dD4gKHRoZSBob21lcGFnZSBmb3IgV1dXKSwgPHR0Pi9lL3N3dy88L3R0PiAodGhlCi1ob21lcGFnZSBmb3IgdGhlIEludHJhbmV0KSBldGMuIE5vdyBiZWNhdXNlIHRoZSBkYXRhIG9mIHRoZSBEb2N1bWVudFJvb3Qgc3RheXMKLWF0IDx0dD4vZS93d3cvPC90dD4gd2UgaGFkIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCBpbmxpbmVkIGltYWdlcyBhbmQgb3RoZXIKLXN0dWZmIGluc2lkZSB0aGlzIGRhdGEgcG9vbCB3b3JrIGZvciBzdWJzZXF1ZW50IHJlcXVlc3RzLiAKLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLVdlIGp1c3QgcmVkaXJlY3QgdGhlIFVSTCA8dHQ+LzwvdHQ+IHRvIDx0dD4vZS93d3cvPC90dD4uICBXaGlsZSBpcyBzZWVtcwotdHJpdmlhbCBpdCBpcyBhY3R1YWxseSB0cml2aWFsIHdpdGggbW9kX3Jld3JpdGUsIG9ubHkuICBCZWNhdXNlIHRoZSB0eXBpY2FsCi1vbGQgbWVjaGFuaXNtcyBvZiBVUkwgPGk+QWxpYXNlczwvaT4gKGFzIHByb3ZpZGVzIGJ5IG1vZF9hbGlhcyBhbmQgZnJpZW5kcykKLW9ubHkgdXNlZCA8aT5wcmVmaXg8L2k+IG1hdGNoaW5nLiBXaXRoIHRoaXMgeW91IGNhbm5vdCBkbyBzdWNoIGEgcmVkaXJlY3Rpb24KLWJlY2F1c2UgdGhlIERvY3VtZW50Um9vdCBpcyBhIHByZWZpeCBvZiBhbGwgVVJMcy4gV2l0aCBtb2RfcmV3cml0ZSBpdCBpcwotcmVhbGx5IHRyaXZpYWw6Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUVuZ2luZSBvbgotUmV3cml0ZVJ1bGUgICA8Yj5eLyQ8L2I+ICAvZS93d3cvICBbPGI+UjwvYj5dCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPC9ETD4KLQotPFA+Ci08SDI+VHJhaWxpbmcgU2xhc2ggUHJvYmxlbTwvSDI+Ci08UD4KLQotPERMPgotPERUPjxTVFJPTkc+RGVzY3JpcHRpb246PC9TVFJPTkc+Ci08REQ+Ci1FdmVyeSB3ZWJtYXN0ZXIgY2FuIHNpbmcgYSBzb25nIGFib3V0IHRoZSBwcm9ibGVtIG9mIHRoZSB0cmFpbGluZyBzbGFzaCBvbgotVVJMcyByZWZlcmVuY2luZyBkaXJlY3Rvcmllcy4gSWYgdGhleSBhcmUgbWlzc2luZywgdGhlIHNlcnZlciBkdW1wcyBhbiBlcnJvciwKLWJlY2F1c2UgaWYgeW91IHNheSA8dHQ+L35xdXV4L2ZvbzwvdHQ+IGluc3RlYWQgb2YKLTx0dD4vfnF1dXgvZm9vLzwvdHQ+IHRoZW4gdGhlIHNlcnZlciBzZWFyY2hlcyBmb3IgYSA8aT5maWxlPC9pPiBuYW1lZAotPHR0PmZvbzwvdHQ+LiBBbmQgYmVjYXVzZSB0aGlzIGZpbGUgaXMgYSBkaXJlY3RvcnkgaXQgY29tcGxhaW5zLiBBY3R1YWxseQotaXMgdHJpZXMgdG8gZml4IGl0IHRoZW1zZWxmIGluIG1vc3Qgb2YgdGhlIGNhc2VzLCBidXQgc29tZXRpbWVzIHRoaXMgbWVjaGFuaXNtCi1uZWVkIHRvIGJlIGVtdWxhdGVkIGJ5IHlvdS4gRm9yIGluc3RhbmNlIGFmdGVyIHlvdSBoYXZlIGRvbmUgYSBsb3Qgb2YKLWNvbXBsaWNhdGVkIFVSTCByZXdyaXRpbmdzIHRvIENHSSBzY3JpcHRzIGV0Yy4gCi0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci1UaGUgc29sdXRpb24gdG8gdGhpcyBzdWJ0bGUgcHJvYmxlbSBpcyB0byBsZXQgdGhlIHNlcnZlciBhZGQgdGhlIHRyYWlsaW5nCi1zbGFzaCBhdXRvbWF0aWNhbGx5LiBUbyBkbyB0aGlzIGNvcnJlY3RseSB3ZSBoYXZlIHRvIHVzZSBhbiBleHRlcm5hbCByZWRpcmVjdCwKLXNvIHRoZSBicm93c2VyIGNvcnJlY3RseSByZXF1ZXN0cyBzdWJzZXF1ZW50IGltYWdlcyBldGMuIElmIHdlIG9ubHkgZGlkIGEKLWludGVybmFsIHJld3JpdGUsIHRoaXMgd291bGQgb25seSB3b3JrIGZvciB0aGUgZGlyZWN0b3J5IHBhZ2UsIGJ1dCB3b3VsZCBnbwotd3Jvbmcgd2hlbiBhbnkgaW1hZ2VzIGFyZSBpbmNsdWRlZCBpbnRvIHRoaXMgcGFnZSB3aXRoIHJlbGF0aXZlIFVSTHMsIGJlY2F1c2UKLXRoZSBicm93c2VyIHdvdWxkIHJlcXVlc3QgYW4gaW4tbGluZWQgb2JqZWN0LiBGb3IgaW5zdGFuY2UsIGEgcmVxdWVzdCBmb3IKLTx0dD5pbWFnZS5naWY8L3R0PiBpbiA8dHQ+L35xdXV4L2Zvby9pbmRleC5odG1sPC90dD4gd291bGQgYmVjb21lCi08dHQ+L35xdXV4L2ltYWdlLmdpZjwvdHQ+IHdpdGhvdXQgdGhlIGV4dGVybmFsIHJlZGlyZWN0IQotPFA+Ci1TbywgdG8gZG8gdGhpcyB0cmljayB3ZSB3cml0ZToKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlRW5naW5lICBvbgotUmV3cml0ZUJhc2UgICAgL35xdXV4LwotUmV3cml0ZVJ1bGUgICAgXmZvbzxiPiQ8L2I+ICBmb288Yj4vPC9iPiAgWzxiPlI8L2I+XQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTxQPgotVGhlIGNyYXp5IGFuZCBsYXp5IGNhbiBldmVuIGRvIHRoZSBmb2xsb3dpbmcgaW4gdGhlIHRvcC1sZXZlbAotPHR0Pi5odGFjY2VzczwvdHQ+IGZpbGUgb2YgdGhlaXIgaG9tZWRpci4gQnV0IG5vdGljZSB0aGF0IHRoaXMgY3JlYXRlcyBzb21lCi1wcm9jZXNzaW5nIG92ZXJoZWFkLgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVFbmdpbmUgIG9uCi1SZXdyaXRlQmFzZSAgICAvfnF1dXgvCi1SZXdyaXRlQ29uZCAgICAle1JFUVVFU1RfRklMRU5BTUV9ICA8Yj4tZDwvYj4KLVJld3JpdGVSdWxlICAgIF4oLis8Yj5bXi9dPC9iPikkICAgICAgICAgICAkMTxiPi88L2I+ICBbUl0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08L0RMPgotCi08UD4KLTxIMj5XZWJjbHVzdGVyIHRocm91Z2ggSG9tb2dlbmVvdXMgVVJMIExheW91dDwvSDI+Ci08UD4KLQotPERMPgotPERUPjxTVFJPTkc+RGVzY3JpcHRpb246PC9TVFJPTkc+Ci08REQ+Ci1XZSB3YW50IHRvIGNyZWF0ZSBhIGhvbW9nZW5vdXMgYW5kIGNvbnNpc3RlbnQgVVJMIGxheW91dCBvdmVyIGFsbCBXV1cgc2VydmVycwotb24gYSBJbnRyYW5ldCB3ZWJjbHVzdGVyLCBpLmUuIGFsbCBVUkxzIChwZXIgZGVmaW5pdGlvbiBzZXJ2ZXIgbG9jYWwgYW5kIHRodXMKLXNlcnZlciBkZXBlbmRlbnQhKSBiZWNvbWUgYWN0dWFsbHkgc2VydmVyIDxpPmluZGVwZW5kZWQ8L2k+ISAgV2hhdCB3ZSB3YW50IGlzCi10byBnaXZlIHRoZSBXV1cgbmFtZXNwYWNlIGEgY29uc2lzdGVudCBzZXJ2ZXItaW5kZXBlbmRlbmQgbGF5b3V0OiBubyBVUkwKLXNob3VsZCBoYXZlIHRvIGluY2x1ZGUgYW55IHBoeXNpY2FsbHkgY29ycmVjdCB0YXJnZXQgc2VydmVyLiBUaGUgY2x1c3RlcgotaXRzZWxmIHNob3VsZCBkcml2ZSB1cyBhdXRvbWF0aWNhbGx5IHRvIHRoZSBwaHlzaWNhbCB0YXJnZXQgaG9zdC4KLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLUZpcnN0LCB0aGUga25vd2xlZGdlIG9mIHRoZSB0YXJnZXQgc2VydmVycyBjb21lIGZyb20gKGRpc3RyaWJ1dGVkKSBleHRlcm5hbAotbWFwcyB3aGljaCBjb250YWluIGluZm9ybWF0aW9uIHdoZXJlIG91ciB1c2VycywgZ3JvdXBzIGFuZCBlbnRpdGllcyBzdGF5LiAgCi1UaGUgaGF2ZSB0aGUgZm9ybQotCi08UD48UFJFPgotdXNlcjEgIHNlcnZlcl9vZl91c2VyMQotdXNlcjIgIHNlcnZlcl9vZl91c2VyMgotOiAgICAgIDoKLTwvUFJFPjxQPgotCi1XZSBwdXQgdGhlbSBpbnRvIGZpbGVzIDx0dD5tYXAueHh4LXRvLWhvc3Q8L3R0Pi4gIFNlY29uZCB3ZSBuZWVkIHRvIGluc3RydWN0Ci1hbGwgc2VydmVycyB0byByZWRpcmVjdCBVUkxzIG9mIHRoZSBmb3JtcwotCi08UD48UFJFPgotL3UvdXNlci9hbnlwYXRoCi0vZy9ncm91cC9hbnlwYXRoCi0vZS9lbnRpdHkvYW55cGF0aAotPC9QUkU+PFA+Ci0KLXRvCi0KLTxQPjxQUkU+Ci1odHRwOi8vcGh5c2ljYWwtaG9zdC91L3VzZXIvYW55cGF0aAotaHR0cDovL3BoeXNpY2FsLWhvc3QvZy9ncm91cC9hbnlwYXRoCi1odHRwOi8vcGh5c2ljYWwtaG9zdC9lL2VudGl0eS9hbnlwYXRoCi08L1BSRT48UD4KLQotd2hlbiB0aGUgVVJMIGlzIG5vdCBsb2NhbGx5IHZhbGlkIHRvIGEgc2VydmVyLiAgVGhlIGZvbGxvd2luZyBydWxlc2V0IGRvZXMKLXRoaXMgZm9yIHVzIGJ5IHRoZSBoZWxwIG9mIHRoZSBtYXAgZmlsZXMgKGFzc3VtaW5nIHRoYXQgc2VydmVyMCBpcyBhIGRlZmF1bHQKLXNlcnZlciB3aGljaCB3aWxsIGJlIHVzZWQgaWYgYSB1c2VyIGhhcyBubyBlbnRyeSBpbiB0aGUgbWFwKToKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlRW5naW5lIG9uCi0KLVJld3JpdGVNYXAgICAgICB1c2VyLXRvLWhvc3QgICB0eHQ6L3BhdGgvdG8vbWFwLnVzZXItdG8taG9zdAotUmV3cml0ZU1hcCAgICAgZ3JvdXAtdG8taG9zdCAgIHR4dDovcGF0aC90by9tYXAuZ3JvdXAtdG8taG9zdAotUmV3cml0ZU1hcCAgICBlbnRpdHktdG8taG9zdCAgIHR4dDovcGF0aC90by9tYXAuZW50aXR5LXRvLWhvc3QKLQotUmV3cml0ZVJ1bGUgICBeL3UvPGI+KFteL10rKTwvYj4vPyguKikgICBodHRwOi8vPGI+JHt1c2VyLXRvLWhvc3Q6JDF8c2VydmVyMH08L2I+L3UvJDEvJDIKLVJld3JpdGVSdWxlICAgXi9nLzxiPihbXi9dKyk8L2I+Lz8oLiopICBodHRwOi8vPGI+JHtncm91cC10by1ob3N0OiQxfHNlcnZlcjB9PC9iPi9nLyQxLyQyCi1SZXdyaXRlUnVsZSAgIF4vZS88Yj4oW14vXSspPC9iPi8/KC4qKSBodHRwOi8vPGI+JHtlbnRpdHktdG8taG9zdDokMXxzZXJ2ZXIwfTwvYj4vZS8kMS8kMgotCi1SZXdyaXRlUnVsZSAgIF4vKFt1Z2VdKS8oW14vXSspLz8kICAgICAgICAgIC8kMS8kMi8ud3d3LwotUmV3cml0ZVJ1bGUgICBeLyhbdWdlXSkvKFteL10rKS8oW14uXSsuKykgICAvJDEvJDIvLnd3dy8kM1wKLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08L0RMPgotCi08UD4KLTxIMj5Nb3ZlIEhvbWVkaXJzIHRvIERpZmZlcmVudCBXZWJzZXJ2ZXI8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotQSBsb3Qgb2Ygd2VibWFzdGVyIGFrc2VkIGZvciBhIHNvbHV0aW9uIHRvIHRoZSBmb2xsb3dpbmcgc2l0dWF0aW9uOiBUaGV5Ci13YW50ZWQgdG8gcmVkaXJlY3QganVzdCBhbGwgaG9tZWRpcnMgb24gYSB3ZWJzZXJ2ZXIgdG8gYW5vdGhlciB3ZWJzZXJ2ZXIuCi1UaGV5IHVzdWFsbHkgbmVlZCBzdWNoIHRoaW5ncyB3aGVuIGVzdGFibGlzaGluZyBhIG5ld2VyIHdlYnNlcnZlciB3aGljaCB3aWxsCi1yZXBsYWNlIHRoZSBvbGQgb25lIG92ZXIgdGltZS4KLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLVRoZSBzb2x1dGlvbiBpcyB0cml2aWFsIHdpdGggbW9kX3Jld3JpdGUuIE9uIHRoZSBvbGQgd2Vic2VydmVyIHdlIGp1c3QKLXJlZGlyZWN0IGFsbCA8dHQ+L351c2VyL2FueXBhdGg8L3R0PiBVUkxzIHRvCi08dHQ+aHR0cDovL25ld3NlcnZlci9+dXNlci9hbnlwYXRoPC90dD4uCi0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUVuZ2luZSBvbgotUmV3cml0ZVJ1bGUgICBeL34oLispICBodHRwOi8vPGI+bmV3c2VydmVyPC9iPi9+JDEgIFtSLExdCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPC9ETD4KLQotPFA+Ci08SDI+U3RydWN0dXJlZCBIb21lZGlyczwvSDI+Ci08UD4KLQotPERMPgotPERUPjxTVFJPTkc+RGVzY3JpcHRpb246PC9TVFJPTkc+Ci08REQ+Ci1Tb21lIHNpdGVzIHdpdGggdGhvdXNlbmQgb2YgdXNlcnMgdXN1YWxseSB1c2UgYSBzdHJ1Y3R1cmVkIGhvbWVkaXIgbGF5b3V0LAotaS5lLiAgZWFjaCBob21lZGlyIGlzIGluIGEgc3ViZGlyZWN0b3J5IHdoaWNoIGJlZ2lucyBmb3IgaW5zdGFuY2Ugd2l0aCB0aGUKLWZpcnN0IGNoYXJhY3RlciBvZiB0aGUgdXNlcm5hbWUuIFNvLCA8dHQ+L35mb28vYW55cGF0aDwvdHQ+IGlzCi08dHQ+L2hvbWUvPGI+ZjwvYj4vZm9vLy53d3cvYW55cGF0aDwvdHQ+IHdoaWxlIDx0dD4vfmJhci9hbnlwYXRoPC90dD4gaXMKLTx0dD4vaG9tZS88Yj5iPC9iPi9iYXIvLnd3dy9hbnlwYXRoPC90dD4uCi0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci1XZSB1c2UgdGhlIGZvbGxvd2luZyBydWxlc2V0IHRvIGV4cGFuZCB0aGUgdGlsZGUgVVJMcyBpbnRvIGV4YWN0bHkgdGhlIGFib3ZlCi1sYXlvdXQuCi0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUVuZ2luZSBvbgotUmV3cml0ZVJ1bGUgICBeL34oPGI+KFthLXpdKTwvYj5bYS16MC05XSspKC4qKSAgL2hvbWUvPGI+JDI8L2I+LyQxLy53d3ckMwotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTwvREw+Ci0KLTxQPgotPEgyPkZpbGVzeXN0ZW0gUmVvcmdhbmlzYXRpb248L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotVGhpcyByZWFsbHkgaXMgYSBoYXJkY29yZSBleGFtcGxlOiBhIGtpbGxlciBhcHBsaWNhdGlvbiB3aGljaCBoZWF2aWx5IHVzZXMKLXBlci1kaXJlY3RvcnkgPHR0PlJld3JpdGVSdWxlczwvdHQ+IHRvIGdldCBhIHNtb290aCBsb29rIGFuZCBmZWVsIG9uIHRoZSBXZWIKLXdoaWxlIGl0cyBkYXRhIHN0cnVjdHVyZSBpcyBuZXZlciB0b3VjaGVkIG9yIGFkanVzdGVkLgotCi1CYWNrZ3JvdW5kOiA8Yj48aT5uZXQuc3c8L2k+PC9iPiBpcyBteSBhcmNoaXZlIG9mIGZyZWVseSBhdmFpbGFibGUgVW5peAotc29mdHdhcmUgcGFja2FnZXMsIHdoaWNoIEkgc3RhcnRlZCB0byBjb2xsZWN0IGluIDE5OTIuIEl0IGlzIGJvdGggbXkgaG9iYnkgYW5kCi1qb2IgdG8gdG8gdGhpcywgYmVjYXVzZSB3aGlsZSBJJ20gc3R1ZHlpbmcgY29tcHV0ZXIgc2NpZW5jZSBJIGhhdmUgYWxzbyB3b3JrZWQKLWZvciBtYW55IHllYXJzIGFzIGEgc3lzdGVtIGFuZCBuZXR3b3JrIGFkbWluaXN0cmF0b3IgaW4gbXkgc3BhcmUgdGltZS4gRXZlcnkKLXdlZWsgSSBuZWVkIHNvbWUgc29ydCBvZiBzb2Z0d2FyZSBzbyBJIGNyZWF0ZWQgYSBkZWVwIGhpZXJhcmNoeSBvZgotZGlyZWN0b3JpZXMgd2hlcmUgSSBzdG9yZWQgdGhlIHBhY2thZ2VzOiAKLQotPFA+PFBSRT4KLWRyd3hyd3hyLXggICAyIG5ldHN3ICB1c2VycyAgICA1MTIgQXVnICAzIDE4OjM5IEF1ZGlvLwotZHJ3eHJ3eHIteCAgIDIgbmV0c3cgIHVzZXJzICAgIDUxMiBKdWwgIDkgMTQ6MzcgQmVuY2htYXJrLwotZHJ3eHJ3eHIteCAgMTIgbmV0c3cgIHVzZXJzICAgIDUxMiBKdWwgIDkgMDA6MzQgQ3J5cHRvLwotZHJ3eHJ3eHIteCAgIDUgbmV0c3cgIHVzZXJzICAgIDUxMiBKdWwgIDkgMDA6NDEgRGF0YWJhc2UvCi1kcnd4cnd4ci14ICAgNCBuZXRzdyAgdXNlcnMgICAgNTEyIEp1bCAzMCAxOToyNSBEaWN0cy8KLWRyd3hyd3hyLXggIDEwIG5ldHN3ICB1c2VycyAgICA1MTIgSnVsICA5IDAxOjU0IEdyYXBoaWMvCi1kcnd4cnd4ci14ICAgNSBuZXRzdyAgdXNlcnMgICAgNTEyIEp1bCAgOSAwMTo1OCBIYWNrZXJzLwotZHJ3eHJ3eHIteCAgIDggbmV0c3cgIHVzZXJzICAgIDUxMiBKdWwgIDkgMDM6MTkgSW5mb1N5cy8KLWRyd3hyd3hyLXggICAzIG5ldHN3ICB1c2VycyAgICA1MTIgSnVsICA5IDAzOjIxIE1hdGgvCi1kcnd4cnd4ci14ICAgMyBuZXRzdyAgdXNlcnMgICAgNTEyIEp1bCAgOSAwMzoyNCBNaXNjLwotZHJ3eHJ3eHIteCAgIDkgbmV0c3cgIHVzZXJzICAgIDUxMiBBdWcgIDEgMTY6MzMgTmV0d29yay8KLWRyd3hyd3hyLXggICAyIG5ldHN3ICB1c2VycyAgICA1MTIgSnVsICA5IDA1OjUzIE9mZmljZS8KLWRyd3hyd3hyLXggICA3IG5ldHN3ICB1c2VycyAgICA1MTIgSnVsICA5IDA5OjI0IFNvZnRFbmcvCi1kcnd4cnd4ci14ICAgNyBuZXRzdyAgdXNlcnMgICAgNTEyIEp1bCAgOSAxMjoxNyBTeXN0ZW0vCi1kcnd4cnd4ci14ICAxMiBuZXRzdyAgdXNlcnMgICAgNTEyIEF1ZyAgMyAyMDoxNSBUeXBlc2V0dGluZy8KLWRyd3hyd3hyLXggIDEwIG5ldHN3ICB1c2VycyAgICA1MTIgSnVsICA5IDE0OjA4IFgxMS8KLTwvUFJFPjxQPgotCi1JbiBKdWx5IDE5OTYgSSBkZWNpZGVkIHRvIG1ha2UgdGhpcyAzNTAgTUIgYXJjaGl2ZSBwdWJsaWMgdG8gdGhlIHdvcmxkIHZpYSBhCi1uaWNlIFdlYiBpbnRlcmZhY2UgKDxhIGhyZWY9Imh0dHA6Ly9uZXQuc3cuZW5nZWxzY2hhbGwuY29tL25ldC5zdy8iPjx0dD4KLWh0dHA6Ly9uZXQuc3cuZW5nZWxzY2hhbGwuY29tL25ldC5zdy88L3R0PjwvYT4pLiAiTmljZSIgbWVhbnMgdGhhdCBJIHdhbnRlZCB0bwotb2ZmZXIgYSBpbnRlcmZhY2Ugd2hlcmUgeW91IGNhbiBicm93c2UgZGlyZWN0bHkgdGhyb3VnaCB0aGUgYXJjaGl2ZSBoaWVyYXJjaHkuCi1BbmQgIm5pY2UiIG1lYW5zIHRoYXQgSSBkaWRuJ3Qgd2FudGVkIHRvIGNoYW5nZSBhbnl0aGluZyBpbnNpZGUgdGhpcyBoaWVyYXJjaHkKLS0gbm90IGV2ZW4gYnkgcHV0dGluZyBzb21lIENHSSBzY3JpcHRzIGF0IHRoZSB0b3Agb2YgaXQuICBXaHk/IEJlY2F1c2UgdGhlCi1hYm92ZSBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGxhdGVyIGFjY2Vzc2libGUgdmlhIEZUUCBhcyB3ZWxsLCBhbmQgSSBkaWRuJ3QKLXdhbnQgYW55IFdlYiBvciBDR0kgc3R1dWYgdG8gYmUgdGhlcmUuCi0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci1UaGUgc29sdXRpb24gaGFzIHR3byBwYXJ0czogVGhlIGZpcnN0IGlzIGEgc2V0IG9mIENHSSBzY3JpcHRzIHdoaWNoIGNyZWF0ZSBhbGwKLXRoZSBwYWdlcyBhdCBhbGwgZGlyZWN0b3J5IGxldmVscyBvbi10aGUtZmx5LiBJIHB1dCB0aGVtIHVuZGVyCi08dHQ+L2UvbmV0c3cvLnd3dy88L3R0PiBhcyBmb2xsb3dzOgotCi08UD48UFJFPgotLXJ3LXItLXItLSAgIDEgbmV0c3cgIHVzZXJzICAgIDEzMTggQXVnICAxIDE4OjEwIC53d3dhY2wKLWRyd3hyLXhyLXggIDE4IG5ldHN3ICB1c2VycyAgICAgNTEyIEF1ZyAgNSAxNTo1MSBEQVRBLwotLXJ3LXJ3LXJ3LSAgIDEgbmV0c3cgIHVzZXJzICAzNzI5ODIgQXVnICA1IDE2OjM1IExPR0ZJTEUKLS1ydy1yLS1yLS0gICAxIG5ldHN3ICB1c2VycyAgICAgNjU5IEF1ZyAgNCAwOToyNyBUT0RPCi0tcnctci0tci0tICAgMSBuZXRzdyAgdXNlcnMgICAgNTY5NyBBdWcgIDEgMTg6MDEgbmV0c3ctYWJvdXQuaHRtbAotLXJ3eHIteHIteCAgIDEgbmV0c3cgIHVzZXJzICAgICA1NzkgQXVnICAyIDEwOjMzIG5ldHN3LWFjY2Vzcy5wbAotLXJ3eHIteHIteCAgIDEgbmV0c3cgIHVzZXJzICAgIDE1MzIgQXVnICAxIDE3OjM1IG5ldHN3LWNoYW5nZXMuY2dpCi0tcnd4ci14ci14ICAgMSBuZXRzdyAgdXNlcnMgICAgMjg2NiBBdWcgIDUgMTQ6NDkgbmV0c3ctaG9tZS5jZ2kKLWRyd3hyLXhyLXggICAyIG5ldHN3ICB1c2VycyAgICAgNTEyIEp1bCAgOCAyMzo0NyBuZXRzdy1pbWcvCi0tcnd4ci14ci14ICAgMSBuZXRzdyAgdXNlcnMgICAyNDA1MCBBdWcgIDUgMTU6NDkgbmV0c3ctbHNkaXIuY2dpCi0tcnd4ci14ci14ICAgMSBuZXRzdyAgdXNlcnMgICAgMTU4OSBBdWcgIDMgMTg6NDMgbmV0c3ctc2VhcmNoLmNnaQotLXJ3eHIteHIteCAgIDEgbmV0c3cgIHVzZXJzICAgIDE4ODUgQXVnICAxIDE3OjQxIG5ldHN3LXRyZWUuY2dpCi0tcnctci0tci0tICAgMSBuZXRzdyAgdXNlcnMgICAgIDIzNCBKdWwgMzAgMTY6MzUgbmV0c3ctdW5saW1pdC5sc3QKLTwvUFJFPjxQPgotCi1UaGUgPHR0PkRBVEEvPC90dD4gc3ViZGlyZWN0b3J5IGhvbGRzIHRoZSBhYm92ZSBkaXJlY3Rvcnkgc3RydWN0dXJlLCBpLmUuICB0aGUKLXJlYWwgPGI+PGk+bmV0LnN3PC9pPjwvYj4gc3R1ZmYgYW5kIGdldHMgYXV0b21hdGljYWxseSB1cGRhdGVkIHZpYQotPHR0PnJkaXN0PC90dD4gZnJvbSB0aW1lIHRvIHRpbWUuIAotCi0gVGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBwcm9ibGVtIHJlbWFpbnM6IGhvdyB0byBsaW5rIHRoZXNlIHR3byBzdHJ1Y3R1cmVzCi10b2dldGhlciBpbnRvIG9uZSBzbW9vdGgtbG9va2luZyBVUkwgdHJlZT8gV2Ugd2FudCB0byBoaWRlIHRoZSA8dHQ+REFUQS88L3R0PgotZGlyZWN0b3J5IGZyb20gdGhlIHVzZXIgd2hpbGUgcnVubmluZyB0aGUgYXBwcm9wcmlhdGUgQ0dJIHNjcmlwdHMgZm9yIHRoZQotdmFyaW91cyBVUkxzLiAKLQotSGVyZSBpcyB0aGUgc29sdXRpb246IGZpcnN0IEkgcHV0IHRoZSBmb2xsb3dpbmcgaW50byB0aGUgcGVyLWRpcmVjdG9yeQotY29uZmlndXJhdGlvbiBmaWxlIGluIHRoZSBEb2N1bWVudCBSb290IG9mIHRoZSBzZXJ2ZXIgdG8gcmV3cml0ZSB0aGUgYW5ub3VuY2VkCi1VUkwgPHR0Pi9uZXQuc3cvPC90dD4gdG8gdGhlIGludGVybmFsIHBhdGggPHR0Pi9lL25ldHN3PC90dD46Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZVJ1bGUgIF5uZXQuc3ckICAgICAgIG5ldC5zdy8gICAgICAgIFtSXQotUmV3cml0ZVJ1bGUgIF5uZXQuc3cvKC4qKSQgIGUvbmV0c3cvJDEKLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08UD4KLVRoZSBmaXJzdCBydWxlIGlzIGZvciByZXF1ZXN0cyB3aGljaCBtaXNzIHRoZSB0cmFpbGluZyBzbGFzaCEgIFRoZSBzZWNvbmQgcnVsZQotZG9lcyB0aGUgcmVhbCB0aGluZy4gQW5kIHRoZW4gY29tZXMgdGhlIGtpbGxlciBjb25maWd1cmF0aW9uIHdoaWNoIHN0YXlzIGluCi10aGUgcGVyLWRpcmVjdG9yeSBjb25maWcgZmlsZSA8dHQ+L2UvbmV0c3cvLnd3dy8ud3d3YWNsPC90dD46Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotT3B0aW9ucyAgICAgICBFeGVjQ0dJIEZvbGxvd1N5bUxpbmtzIEluY2x1ZGVzIE11bHRpVmlld3MgCi0KLVJld3JpdGVFbmdpbmUgb24KLQotIyAgd2UgYXJlIHJlYWNoZWQgdmlhIC9uZXQuc3cvIHByZWZpeAotUmV3cml0ZUJhc2UgICAvbmV0LnN3LwotCi0jICBmaXJzdCB3ZSByZXdyaXRlIHRoZSByb290IGRpciB0byAKLSMgIHRoZSBoYW5kbGluZyBjZ2kgc2NyaXB0Ci1SZXdyaXRlUnVsZSAgIF4kICAgICAgICAgICAgICAgICAgICAgICBuZXRzdy1ob21lLmNnaSAgICAgW0xdCi1SZXdyaXRlUnVsZSAgIF5pbmRleFwuaHRtbCQgICAgICAgICAgICBuZXRzdy1ob21lLmNnaSAgICAgW0xdCi0KLSMgIHN0cmlwIG91dCB0aGUgc3ViZGlycyB3aGVuCi0jICB0aGUgYnJvd3NlciByZXF1ZXN0cyB1cyBmcm9tIHBlcmRpciBwYWdlcwotUmV3cml0ZVJ1bGUgICBeLisvKG5ldHN3LVteL10rLy4rKSQgICAgJDEgICAgICAgICAgICAgICAgIFtMXQotCi0jICBhbmQgbm93IGJyZWFrIHRoZSByZXdyaXRpbmcgZm9yIGxvY2FsIGZpbGVzCi1SZXdyaXRlUnVsZSAgIF5uZXRzdy1ob21lXC5jZ2kuKiAgICAgICAtICAgICAgICAgICAgICAgICAgW0xdCi1SZXdyaXRlUnVsZSAgIF5uZXRzdy1jaGFuZ2VzXC5jZ2kuKiAgICAtICAgICAgICAgICAgICAgICAgW0xdCi1SZXdyaXRlUnVsZSAgIF5uZXRzdy1zZWFyY2hcLmNnaS4qICAgICAtICAgICAgICAgICAgICAgICAgW0xdCi1SZXdyaXRlUnVsZSAgIF5uZXRzdy10cmVlXC5jZ2kkICAgICAgICAtICAgICAgICAgICAgICAgICAgW0xdCi1SZXdyaXRlUnVsZSAgIF5uZXRzdy1hYm91dFwuaHRtbCQgICAgICAtICAgICAgICAgICAgICAgICAgW0xdCi1SZXdyaXRlUnVsZSAgIF5uZXRzdy1pbWcvLiokICAgICAgICAgICAtICAgICAgICAgICAgICAgICAgW0xdCi0KLSMgIGFueXRoaW5nIGVsc2UgaXMgYSBzdWJkaXIgd2hpY2ggZ2V0cyBoYW5kbGVkCi0jICBieSBhbm90aGVyIGNnaSBzY3JpcHQKLVJld3JpdGVSdWxlICAgIV5uZXRzdy1sc2RpclwuY2dpLiogICAgIC0gICAgICAgICAgICAgICAgICBbQ10KLVJld3JpdGVSdWxlICAgKC4qKSAgICAgICAgICAgICAgICAgICAgIG5ldHN3LWxzZGlyLmNnaS8kMQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTxQPgotU29tZSBoaW50cyBmb3IgaW50ZXJwcmV0YXRpb246Ci0gICAgPG9sPgotICAgIDxsaT4gTm90aWNlIHRoZSBMIChsYXN0KSBmbGFnIGFuZCBubyBzdWJzdGl0dXRpb24gZmllbGQgKCctJykgaW4gdGhlCi0gICAgICAgICBmb3J0aCBwYXJ0Ci0gICAgPGxpPiBOb3RpY2UgdGhlICEgKG5vdCkgY2hhcmFjdGVyIGFuZCB0aGUgQyAoY2hhaW4pIGZsYWcKLSAgICAgICAgIGF0IHRoZSBmaXJzdCBydWxlIGluIHRoZSBsYXN0IHBhcnQKLSAgICA8bGk+IE5vdGljZSB0aGUgY2F0Y2gtYWxsIHBhdHRlcm4gaW4gdGhlIGxhc3QgcnVsZQotICAgIDwvb2w+Ci0KLTwvREw+Ci0KLTxQPgotPEgyPk5DU0EgaW1hZ2VtYXAgdG8gQXBhY2hlIG1vZF9pbWFwPC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLVdoZW4gc3dpdGNoaW5nIGZyb20gdGhlIE5DU0Egd2Vic2VydmVyIHRvIHRoZSBtb3JlIG1vZGVybiBBcGFjaGUgd2Vic2VydmVyIGEKLWxvdCBvZiBwZW9wbGUgd2FudCBhIHNtb290aCB0cmFuc2l0aW9uLiBTbyB0aGV5IHdhbnQgcGFnZXMgd2hpY2ggdXNlIHRoZWlyIG9sZAotTkNTQSA8dHQ+aW1hZ2VtYXA8L3R0PiBwcm9ncmFtIHRvIHdvcmsgdW5kZXIgQXBhY2hlIHdpdGggdGhlIG1vZGVybgotPHR0Pm1vZF9pbWFwPC90dD4uIFRoZSBwcm9ibGVtIGlzIHRoYXQgdGhlcmUgYXJlIGEgbG90IG9mCi1oeXBlcmxpbmtzIGFyb3VuZCB3aGljaCByZWZlcmVuY2UgdGhlIDx0dD5pbWFnZW1hcDwvdHQ+IHByb2dyYW0gdmlhCi08dHQ+L2NnaS1iaW4vaW1hZ2VtYXAvcGF0aC90by9wYWdlLm1hcDwvdHQ+LiBVbmRlciBBcGFjaGUgdGhpcwotaGFzIHRvIHJlYWQganVzdCA8dHQ+L3BhdGgvdG8vcGFnZS5tYXA8L3R0Pi4KLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLVdlIHVzZSBhIGdsb2JhbCBydWxlIHRvIHJlbW92ZSB0aGUgcHJlZml4IG9uLXRoZS1mbHkgZm9yIGFsbCByZXF1ZXN0czoKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlRW5naW5lICBvbgotUmV3cml0ZVJ1bGUgICAgXi9jZ2ktYmluL2ltYWdlbWFwKC4qKSAgJDEgIFtQVF0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08L0RMPgotCi08UD4KLTxIMj5TZWFyY2ggcGFnZXMgaW4gbW9yZSB0aGFuIG9uZSBkaXJlY3Rvcnk8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotU29tZXRpbWVzIGl0IGlzIG5lY2Nlc3NhcnkgdG8gbGV0IHRoZSB3ZWJzZXJ2ZXIgc2VhcmNoIGZvciBwYWdlcyBpbiBtb3JlIHRoYW4KLW9uZSBkaXJlY3RvcnkuIEhlcmUgTXVsdGlWaWV3cyBvciBvdGhlciB0ZWNobmlxdWVzIGNhbm5vdCBoZWxwLgotCi08UD4KLTxEVD48U1RST05HPlNvbHV0aW9uOjwvU1RST05HPgotPEREPgotV2UgcHJvZ3JhbSBhIGV4cGxpY2l0IHJ1bGVzZXQgd2hpY2ggc2VhcmNoZXMgZm9yIHRoZSBmaWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuCi0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUVuZ2luZSBvbgotCi0jICAgZmlyc3QgdHJ5IHRvIGZpbmQgaXQgaW4gY3VzdG9tLy4uLgotIyAgIC4uLmFuZCBpZiBmb3VuZCBzdG9wIGFuZCBiZSBoYXBweToKLVJld3JpdGVDb25kICAgICAgICAgL3lvdXIvZG9jcm9vdC88Yj5kaXIxPC9iPi8le1JFUVVFU1RfRklMRU5BTUV9ICAtZgotUmV3cml0ZVJ1bGUgIF4oLispICAveW91ci9kb2Nyb290LzxiPmRpcjE8L2I+LyQxICBbTF0KLQotIyAgIHNlY29uZCB0cnkgdG8gZmluZCBpdCBpbiBwdWIvLi4uCi0jICAgLi4uYW5kIGlmIGZvdW5kIHN0b3AgYW5kIGJlIGhhcHB5OgotUmV3cml0ZUNvbmQgICAgICAgICAveW91ci9kb2Nyb290LzxiPmRpcjI8L2I+LyV7UkVRVUVTVF9GSUxFTkFNRX0gIC1mCi1SZXdyaXRlUnVsZSAgXiguKykgIC95b3VyL2RvY3Jvb3QvPGI+ZGlyMjwvYj4vJDEgIFtMXQotCi0jICAgZWxzZSBnbyBvbiBmb3Igb3RoZXIgQWxpYXMgb3IgU2NyaXB0QWxpYXMgZGlyZWN0aXZlcywKLSMgICBldGMuCi1SZXdyaXRlUnVsZSAgIF4oLispICAtICBbUFRdCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPC9ETD4KLQotPFA+Ci08SDI+U2V0IEVudmlyb25tZW50IFZhcmlhYmxlcyBBY2NvcmRpbmcgVG8gVVJMIFBhcnRzPC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLVBlcmhhcHMgeW91IHdhbnQgdG8ga2VlcCBzdGF0dXMgaW5mb3JtYXRpb24gYmV0d2VlbiByZXF1ZXN0cyBhbmQgdXNlIHRoZSBVUkwKLXRvIGVuY29kZSBpdC4gQnV0IHlvdSBkb24ndCB3YW50IHRvIHVzZSBhIENHSSB3cmFwcGVyIGZvciBhbGwgcGFnZXMganVzdCB0bwotc3RyaXAgb3V0IHRoaXMgaW5mb3JtYXRpb24uCi0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci1XZSB1c2UgYSByZXdyaXRlIHJ1bGUgdG8gc3RyaXAgb3V0IHRoZSBzdGF0dXMgaW5mb3JtYXRpb24gYW5kIHJlbWVtYmVyIGl0IHZpYQotYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgd2hpY2ggY2FuIGJlIGxhdGVyIGRlcmVmZXJlbmNlZCBmcm9tIHdpdGhpbiBYU1NJIG9yCi1DR0kuIFRoaXMgd2F5IGEgVVJMIDx0dD4vZm9vL1M9amF2YS9iYXIvPC90dD4gZ2V0cyB0cmFuc2xhdGVkIHRvCi08dHQ+L2Zvby9iYXIvPC90dD4gYW5kIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lZCA8dHQ+U1RBVFVTPC90dD4gaXMgc2V0Ci10byB0aGUgdmFsdWUgImphdmEiLgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVFbmdpbmUgb24KLVJld3JpdGVSdWxlICAgXiguKikvPGI+Uz0oW14vXSspPC9iPi8oLiopICAgICQxLyQzIFtFPTxiPlNUQVRVUzokMjwvYj5dCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPC9ETD4KLQotPFA+Ci08SDI+VmlydHVhbCBVc2VyIEhvc3RzPC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLUFzc3VtZSB0aGF0IHlvdSB3YW50IHRvIHByb3ZpZGUgPHR0Pnd3dy48Yj51c2VybmFtZTwvYj4uaG9zdC5kb21haW4uY29tPC90dD4KLWZvciB0aGUgaG9tZXBhZ2Ugb2YgdXNlcm5hbWUgdmlhIGp1c3QgRE5TIEEgcmVjb3JkcyB0byB0aGUgc2FtZSBtYWNoaW5lIGFuZAotd2l0aG91dCBhbnkgdmlydHVhbGhvc3RzIG9uIHRoaXMgbWFjaGluZS4gCi0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci1Gb3IgSFRUUC8xLjAgcmVxdWVzdHMgdGhlcmUgaXMgbm8gc29sdXRpb24sIGJ1dCBmb3IgSFRUUC8xLjEgcmVxdWVzdHMgd2hpY2gKLWNvbnRhaW4gYSBIb3N0OiBIVFRQIGhlYWRlciB3ZSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgcnVsZXNldCB0byByZXdyaXRlCi08dHQ+aHR0cDovL3d3dy51c2VybmFtZS5ob3N0LmNvbS9hbnlwYXRoPC90dD4gaW50ZXJuYWxseSB0bwotPHR0Pi9ob21lL3VzZXJuYW1lL2FueXBhdGg8L3R0PjoKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlRW5naW5lIG9uCi1SZXdyaXRlQ29uZCAgICV7PGI+SFRUUF9IT1NUPC9iPn0gICAgICAgICAgICAgICAgIF53d3dcLjxiPlteLl0rPC9iPlwuaG9zdFwuY29tJAotUmV3cml0ZVJ1bGUgICBeKC4rKSAgICAgICAgICAgICAgICAgICAgICAgICV7SFRUUF9IT1NUfSQxICAgICAgICAgIFtDXQotUmV3cml0ZVJ1bGUgICBed3d3XC48Yj4oW14uXSspPC9iPlwuaG9zdFwuY29tKC4qKSAvaG9tZS88Yj4kMTwvYj4kMgotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTwvREw+Ci0KLTxQPgotPEgyPlJlZGlyZWN0IEhvbWVkaXJzIEZvciBGb3JlaWduZXJzPC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLVdlIHdhbnQgdG8gcmVkaXJlY3QgaG9tZWRpciBVUkxzIHRvIGFub3RoZXIgd2Vic2VydmVyCi08dHQ+d3d3LnNvbWV3aGVyZS5jb208L3R0PiB3aGVuIHRoZSByZXF1ZXN0aW5nIHVzZXIgZG9lcyBub3Qgc3RheSBpbiB0aGUgbG9jYWwKLWRvbWFpbiA8dHQ+b3VyZG9tYWluLmNvbTwvdHQ+LiBUaGlzIGlzIHNvbWV0aW1lcyB1c2VkIGluIHZpcnR1YWwgaG9zdAotY29udGV4dHMuCi0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci1KdXN0IGEgcmV3cml0ZSBjb25kaXRpb246Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUVuZ2luZSBvbgotUmV3cml0ZUNvbmQgICAle1JFTU9URV9IT1NUfSAgPGI+IV4uK1wub3VyZG9tYWluXC5jb20kPC9iPgotUmV3cml0ZVJ1bGUgICBeKC9+LispICAgICAgICAgaHR0cDovL3d3dy5zb21ld2hlcmUuY29tLyQxIFtSLExdCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPC9ETD4KLQotPFA+Ci08SDI+UmVkaXJlY3QgRmFpbGluZyBVUkxzIFRvIE90aGVyIFdlYnNlcnZlcjwvSDI+Ci08UD4KLQotPERMPgotPERUPjxTVFJPTkc+RGVzY3JpcHRpb246PC9TVFJPTkc+Ci08REQ+Ci1BIHR5cGljYWwgRkFRIGFib3V0IFVSTCByZXdyaXRpbmcgaXMgaG93IHRvIHJlZGlyZWN0IGZhaWxpbmcgcmVxdWVzdHMgb24KLXdlYnNlcnZlciBBIHRvIHdlYnNlcnZlciBCLiAgVXN1YWxseSB0aGlzIGlzIGRvbmUgdmlhIEVycm9yRG9jdW1lbnQKLUNHSS1zY3JpcHRzIGluIFBlcmwsIGJ1dCB0aGVyZSBpcyBhbHNvIGEgbW9kX3Jld3JpdGUgc29sdXRpb24uIEJ1dCBub3RpY2UgdGhhdAotdGhpcyBpcyBsZXNzIHBlcmZvcm1hbnQgdGhhbiB1c2luZyBhIEVycm9yRG9jdW1lbnQgQ0dJLXNjcmlwdCEKLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLVRoZSBmaXJzdCBzb2x1dGlvbiBoYXMgdGhlIGJlc3QgcGVyZm9ybWFuY2UgYnV0IGxlc3MgZmxleGliaWxpdHkgYW5kIGlzIGxlc3MKLWVycm9yIHNhZmU6Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUVuZ2luZSBvbgotUmV3cml0ZUNvbmQgICAveW91ci9kb2Nyb290LyV7UkVRVUVTVF9GSUxFTkFNRX0gPGI+IS1mPC9iPgotUmV3cml0ZVJ1bGUgICBeKC4rKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovLzxiPndlYnNlcnZlckI8L2I+LmRvbS8kMQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTxQPgotVGhlIHByb2JsZW0gaGVyZSBpcyB0aGF0IHRoaXMgd2lsbCBvbmx5IHdvcmsgZm9yIHBhZ2VzIGluc2lkZSB0aGUKLURvY3VtZW50Um9vdC4gV2hpbGUgeW91IGNhbiBhZGQgbW9yZSBDb25kaXRpb25zIChmb3IgaW5zdGFuY2UgdG8gYWxzbyBoYW5kbGUKLWhvbWVkaXJzLCBldGMuKSB0aGVyZSBpcyBiZXR0ZXIgdmFyaWFudDoKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlRW5naW5lIG9uCi1SZXdyaXRlQ29uZCAgICV7UkVRVUVTVF9VUkl9IDxiPiEtVTwvYj4KLVJld3JpdGVSdWxlICAgXiguKykgICAgICAgICAgaHR0cDovLzxiPndlYnNlcnZlckI8L2I+LmRvbS8kMQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTxQPgotVGhpcyB1c2VzIHRoZSBVUkwgbG9vay1haGVhZCBmZWF0dXJlIG9mIG1vZF9yZXdyaXRlLiBUaGUgcmVzdWx0IGlzIHRoYXQgdGhpcwotd2lsbCB3b3JrIGZvciBhbGwgdHlwZXMgb2YgVVJMcyBhbmQgaXMgYSBzYWZlIHdheS4gIEJ1dCBpdCBkb2VzIGEgcGVyZm9ybWFuY2UKLWltcGFjdCBvbiB0aGUgd2Vic2VydmVyLCBiZWNhdXNlIGZvciBldmVyeSByZXF1ZXN0IHRoZXJlIGlzIG9uZSBtb3JlIGludGVybmFsCi1zdWJyZXF1ZXN0LiBTbywgaWYgeW91ciB3ZWJzZXJ2ZXIgcnVucyBvbiBhIHBvd2VyZnVsIENQVSwgdXNlIHRoaXMgb25lLiBJZiBpdAotaXMgYSBzbG93IG1hY2hpbmUsIHVzZSB0aGUgZmlyc3QgYXBwcm9hY2ggb3IgYmV0dGVyIGEgRXJyb3JEb2N1bWVudAotQ0dJLXNjcmlwdC4KLQotPC9ETD4KLQotPFA+Ci08SDI+RXh0ZW5kZWQgUmVkaXJlY3Rpb248L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotU29tZXRpbWVzIHdlIG5lZWQgbW9yZSBjb250cm9sIChjb25jZXJuaW5nIHRoZSBjaGFyYWN0ZXIgZXNjYXBpbmcgbWVjaGFuaXNtKQotb2YgVVJMcyBvbiByZWRpcmVjdHMuIFVzdWFsbHkgdGhlIEFwYWNoZSBrZXJuZWxzIFVSTCBlc2NhcGUgZnVuY3Rpb24gYWxzbwotZXNjYXBlcyBhbmNob3JzLCBpLmUuIFVSTHMgbGlrZSAidXJsI2FuY2hvciIuIFlvdSBjYW5ub3QgdXNlIHRoaXMgZGlyZWN0bHkgb24KLXJlZGlyZWN0cyB3aXRoIG1vZF9yZXdyaXRlIGJlY2F1c2UgdGhlIHVyaV9lc2NhcGUoKSBmdW5jdGlvbiBvZiBBcGFjaGUgd291bGQKLWFsc28gZXNjYXBlIHRoZSBoYXNoIGNoYXJhY3Rlci4gSG93IGNhbiB3ZSByZWRpcmVjdCB0byBzdWNoIGEgVVJMPwotCi08UD4KLTxEVD48U1RST05HPlNvbHV0aW9uOjwvU1RST05HPgotPEREPgotV2UgaGF2ZSB0byB1c2UgYSBrbHVkZ2UgYnkgdGhlIHVzZSBvZiBhIE5QSC1DR0kgc2NyaXB0IHdoaWNoIGRvZXMgdGhlIHJlZGlyZWN0Ci1pdHNlbGYuIEJlY2F1c2UgaGVyZSBubyBlc2NhcGluZyBpcyBkb25lIChOUEg9bm9uLXBhcnNlYWJsZSBoZWFkZXJzKS4gIEZpcnN0Ci13ZSBpbnRyb2R1Y2UgYSBuZXcgVVJMIHNjaGVtZSA8dHQ+eHJlZGlyZWN0OjwvdHQ+IGJ5IHRoZSBmb2xsb3dpbmcgcGVyLXNlcnZlcgotY29uZmlnLWxpbmUgKHNob3VsZCBiZSBvbmUgb2YgdGhlIGxhc3QgcmV3cml0ZSBydWxlcyk6Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZVJ1bGUgXnhyZWRpcmVjdDooLispIC9wYXRoL3RvL25waC14cmVkaXJlY3QuY2dpLyQxIFwKLSAgICAgICAgICAgIFtUPWFwcGxpY2F0aW9uL3gtaHR0cGQtY2dpLExdCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPFA+Ci1UaGlzIGZvcmNlcyBhbGwgVVJMcyBwcmVmaXhlZCB3aXRoIDx0dD54cmVkaXJlY3Q6PC90dD4gdG8gYmUgcGlwZWQgdGhyb3VnaCB0aGUKLTx0dD5ucGgteHJlZGlyZWN0LmNnaTwvdHQ+IHByb2dyYW0uIEFuZCB0aGlzIHByb2dyYW0ganVzdCBsb29rcyBsaWtlOgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLTxQUkU+Ci0jIS9wYXRoL3RvL3BlcmwKLSMjCi0jIyAgbnBoLXhyZWRpcmVjdC5jZ2kgLS0gTlBIL0NHSSBzY3JpcHQgZm9yIGV4dGVuZGVkIHJlZGlyZWN0cwotIyMgIENvcHlyaWdodCAoYykgMTk5NyBSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSMjCi0KLSR8ID0gMTsKLSR1cmwgPSAkRU5WeydQQVRIX0lORk8nfTsKLQotcHJpbnQgIkhUVFAvMS4wIDMwMiBNb3ZlZCBUZW1wb3JhcmlseVxuIjsKLXByaW50ICJTZXJ2ZXI6ICRFTlZ7J1NFUlZFUl9TT0ZUV0FSRSd9XG4iOwotcHJpbnQgIkxvY2F0aW9uOiAkdXJsXG4iOwotcHJpbnQgIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sXG4iOwotcHJpbnQgIlxuIjsKLXByaW50ICImbHQ7aHRtbCZndDtcbiI7Ci1wcmludCAiJmx0O2hlYWQmZ3Q7XG4iOwotcHJpbnQgIiZsdDt0aXRsZSZndDszMDIgTW92ZWQgVGVtcG9yYXJpbHkgKEVYVEVOREVEKSZsdDsvdGl0bGUmZ3Q7XG4iOwotcHJpbnQgIiZsdDsvaGVhZCZndDtcbiI7Ci1wcmludCAiJmx0O2JvZHkmZ3Q7XG4iOwotcHJpbnQgIiZsdDtoMSZndDtNb3ZlZCBUZW1wb3JhcmlseSAoRVhURU5ERUQpJmx0Oy9oMSZndDtcbiI7Ci1wcmludCAiVGhlIGRvY3VtZW50IGhhcyBtb3ZlZCAmbHQ7YSBocmVmPVwiJHVybFwiJmd0O2hlcmUmbHQ7L2EmZ3Q7LiZsdDtwJmd0O1xuIjsKLXByaW50ICImbHQ7L2JvZHkmZ3Q7XG4iOwotcHJpbnQgIiZsdDsvaHRtbCZndDtcbiI7Ci0KLSMjRU9GIyMKLTwvUFJFPgotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTxQPgotVGhpcyBwcm92aWRlcyB5b3Ugd2l0aCB0aGUgZnVuY3Rpb25hbGl0eSB0byBkbyByZWRpcmVjdHMgdG8gYWxsIFVSTCBzY2hlbWVzLAotaS5lLiBpbmNsdWRpbmcgdGhlIG9uZSB3aGljaCBhcmUgbm90IGRpcmVjdGx5IGFjY2VwdGVkIGJ5IG1vZF9yZXdyaXRlLiBGb3IKLWluc3RhbmNlIHlvdSBjYW4gbm93IGFsc28gcmVkaXJlY3QgdG8gPHR0Pm5ld3M6bmV3c2dyb3VwPC90dD4gdmlhCi0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZVJ1bGUgXmFueXVybCAgeHJlZGlyZWN0Om5ld3M6bmV3c2dyb3VwCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPFA+Ci1Ob3RpY2U6IFlvdSBoYXZlIG5vdCB0byBwdXQgW1JdIG9yIFtSLExdIHRvIHRoZSBhYm92ZSBydWxlIGJlY2F1c2UgdGhlCi08dHQ+eHJlZGlyZWN0OjwvdHQ+IG5lZWQgdG8gYmUgZXhwYW5kZWQgbGF0ZXIgYnkgb3VyIHNwZWNpYWwgInBpcGUgdGhyb3VnaCIKLXJ1bGUgYWJvdmUuCi0KLTwvREw+Ci0KLTxQPgotPEgyPkFyY2hpdmUgQWNjZXNzIE11bHRpcGxleGVyPC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLURvIHlvdSBrbm93IHRoZSBncmVhdCBDUEFOIChDb21wcmVoZW5zaXZlIFBlcmwgQXJjaGl2ZSBOZXR3b3JrKSB1bmRlciA8YQotaHJlZj0iaHR0cDovL3d3dy5wZXJsLmNvbS9DUEFOIj5odHRwOi8vd3d3LnBlcmwuY29tL0NQQU48L2E+PyBUaGlzIGRvZXMgYQotcmVkaXJlY3QgdG8gb25lIG9mIHNldmVyYWwgRlRQIHNlcnZlcnMgYXJvdW5kIHRoZSB3b3JsZCB3aGljaCBjYXJyeSBhIENQQU4KLW1pcnJvciBhbmQgaXMgYXBwcm94aW1hdGVseSBuZWFyIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVxdWVzdGluZyBjbGllbnQuCi1BY3R1YWxseSB0aGlzIGNhbiBiZSBjYWxsZWQgYW4gRlRQIGFjY2VzcyBtdWx0aXBsZXhpbmcgc2VydmljZS4gV2hpbGUgQ1BBTgotcnVucyB2aWEgQ0dJIHNjcmlwdHMsIGhvdyBjYW4gYSBzaW1pbGFyIGFwcHJvYWNoIGltcGxlbWVudGVkIHZpYSBtb2RfcmV3cml0ZT8KLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLUZpcnN0IHdlIG5vdGljZSB0aGF0IGZyb20gdmVyc2lvbiAzLjAuMCBtb2RfcmV3cml0ZSBjYW4gYWxzbyB1c2UgdGhlICJmdHA6Igotc2NoZW1lIG9uIHJlZGlyZWN0cy4gQW5kIHNlY29uZCwgdGhlIGxvY2F0aW9uIGFwcHJveGltYXRpb24gY2FuIGJlIGRvbmUgYnkgYQotcmV3cml0ZW1hcCBvdmVyIHRoZSB0b3AtbGV2ZWwgZG9tYWluIG9mIHRoZSBjbGllbnQuIFdpdGggYSB0cmlja3kgY2hhaW5lZAotcnVsZXNldCB3ZSBjYW4gdXNlIHRoaXMgdG9wLWxldmVsIGRvbWFpbiBhcyBhIGtleSB0byBvdXIgbXVsdGlwbGV4aW5nIG1hcC4KLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlRW5naW5lIG9uCi1SZXdyaXRlTWFwICAgIG11bHRpcGxleCAgICAgICAgICAgICAgICB0eHQ6L3BhdGgvdG8vbWFwLmN4YW4KLVJld3JpdGVSdWxlICAgXi9DeEFOLyguKikgICAgICAgICAgICAgICV7UkVNT1RFX0hPU1R9OjokMSAgICAgICAgICAgICAgICAgW0NdCi1SZXdyaXRlUnVsZSAgIF4uK1wuPGI+KFthLXpBLVpdKyk8L2I+OjooLiopJCAgJHttdWx0aXBsZXg6PGI+JDE8L2I+fGZ0cC5kZWZhdWx0LmRvbX0kMiAgW1IsTF0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLSMjCi0jIyAgbWFwLmN4YW4gLS0gTXVsdGlwbGV4aW5nIE1hcCBmb3IgQ3hBTgotIyMKLQotZGUgICAgICAgIGZ0cDovL2Z0cC5jeGFuLmRlL0N4QU4vCi11ayAgICAgICAgZnRwOi8vZnRwLmN4YW4udWsvQ3hBTi8KLWNvbSAgICAgICBmdHA6Ly9mdHAuY3hhbi5jb20vQ3hBTi8KLSA6Ci0jI0VPRiMjCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPC9ETD4KLQotPFA+Ci08SDI+VGltZS1EZXBlbmRlbmQgUmV3cml0aW5nPC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLVdoZW4gdHJpY2tzIGxpa2UgdGltZS1kZXBlbmRlbmQgY29udGVudCBzaG91bGQgaGFwcGVuIGEgbG90IG9mIHdlYm1hc3RlcnMKLXN0aWxsIHVzZSBDR0kgc2NyaXB0cyB3aGljaCBkbyBmb3IgaW5zdGFuY2UgcmVkaXJlY3RzIHRvIHNwZWNpYWxpemVkIHBhZ2VzLgotSG93IGNhbiBpdCBiZSBkb25lIHZpYSBtb2RfcmV3cml0ZT8KLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLVRoZXJlIGFyZSBhIGxvdCBvZiB2YXJpYWJsZXMgbmFtZWQgPHR0PlRJTUVfeHh4PC90dD4gZm9yIHJld3JpdGUgY29uZGl0aW9ucy4KLUluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHNwZWNpYWwgbGV4aWNvZ3JhcGhpYyBjb21wYXJpc29uIHBhdHRlcm5zICZsdDtTVFJJTkcsCi0mZ3Q7U1RSSU5HIGFuZCA9U1RSSU5HIHdlIGNhbiBkbyB0aW1lLWRlcGVuZGVuZCByZWRpcmVjdHM6Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUVuZ2luZSBvbgotUmV3cml0ZUNvbmQgICAle1RJTUVfSE9VUn0le1RJTUVfTUlOfSAmZ3Q7MDcwMAotUmV3cml0ZUNvbmQgICAle1RJTUVfSE9VUn0le1RJTUVfTUlOfSAmbHQ7MTkwMAotUmV3cml0ZVJ1bGUgICBeZm9vXC5odG1sJCAgICAgICAgICAgICBmb28uZGF5Lmh0bWwKLVJld3JpdGVSdWxlICAgXmZvb1wuaHRtbCQgICAgICAgICAgICAgZm9vLm5pZ2h0Lmh0bWwKLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08UD4KLVRoaXMgcHJvdmlkZXMgdGhlIGNvbnRlbnQgb2YgPHR0PmZvby5kYXkuaHRtbDwvdHQ+IHVuZGVyIHRoZSBVUkwKLTx0dD5mb28uaHRtbDwvdHQ+IGZyb20gMDc6MDAtMTk6MDAgYW5kIGF0IHRoZSByZW1haW5pbmcgdGltZSB0aGUgY29udGVudHMgb2YKLTx0dD5mb28ubmlnaHQuaHRtbDwvdHQ+LiBKdXN0IGEgbmljZSBmZWF0dXJlIGZvciBhIGhvbWVwYWdlLi4uCi0KLTwvREw+Ci0KLTxQPgotPEgyPkJhY2t3YXJkIENvbXBhdGliaWxpdHkgZm9yIFlZWVkgdG8gWFhYWCBtaWdyYXRpb248L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotSG93IGNhbiB3ZSBtYWtlIFVSTHMgYmFja3dhcmQgY29tcGF0aWJsZSAoc3RpbGwgZXhpc3RpbmcgdmlydHVhbGx5KSBhZnRlcgotbWlncmF0aW5nIGRvY3VtZW50LllZWVkgdG8gZG9jdW1lbnQuWFhYWCwgZS5nLiBhZnRlciB0cmFuc2xhdGluZyBhIGJ1bmNoIG9mCi0uaHRtbCBmaWxlcyB0byAucGh0bWw/Ci0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci1XZSBqdXN0IHJld3JpdGUgdGhlIG5hbWUgdG8gaXRzIGJhc2VuYW1lIGFuZCB0ZXN0IGZvciBleGlzdGVuY2Ugb2YgdGhlIG5ldwotZXh0ZW5zaW9uLiBJZiBpdCBleGlzdHMsIHdlIHRha2UgdGhhdCBuYW1lLCBlbHNlIHdlIHJld3JpdGUgdGhlIFVSTCB0byBpdHMKLW9yaWdpbmFsIHN0YXRlLiAKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci0jICAgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBydWxlc2V0IGZvciAKLSMgICByZXdyaXRpbmcgZG9jdW1lbnQuaHRtbCB0byBkb2N1bWVudC5waHRtbAotIyAgIHdoZW4gYW5kIG9ubHkgd2hlbiBkb2N1bWVudC5waHRtbCBleGlzdHMKLSMgICBidXQgbm8gbG9uZ2VyIGRvY3VtZW50Lmh0bWwKLVJld3JpdGVFbmdpbmUgb24KLVJld3JpdGVCYXNlICAgL35xdXV4LwotIyAgIHBhcnNlIG91dCBiYXNlbmFtZSwgYnV0IHJlbWVtYmVyIHRoZSBmYWN0Ci1SZXdyaXRlUnVsZSAgIF4oLiopXC5odG1sJCAgICAgICAgICAgICAgJDEgICAgICBbQyxFPVdhc0hUTUw6eWVzXQotIyAgIHJld3JpdGUgdG8gZG9jdW1lbnQucGh0bWwgaWYgZXhpc3RzCi1SZXdyaXRlQ29uZCAgICV7UkVRVUVTVF9GSUxFTkFNRX0ucGh0bWwgLWYKLVJld3JpdGVSdWxlICAgXiguKikkICQxLnBodG1sICAgICAgICAgICAgICAgICAgIFtTPTFdCi0jICAgZWxzZSByZXZlcnNlIHRoZSBwcmV2aW91cyBiYXNlbmFtZSBjdXRvdXQKLVJld3JpdGVDb25kICAgJXtFTlY6V2FzSFRNTH0gICAgICAgICAgICBeeWVzJAotUmV3cml0ZVJ1bGUgICBeKC4qKSQgJDEuaHRtbAotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTwvREw+Ci0KLTxIMT5Db250ZW50IEhhbmRsaW5nPC9IMT4KLQotPFA+Ci08SDI+RnJvbSBPbGQgdG8gTmV3IChpbnRlcm4pPC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLUFzc3VtZSB3ZSBoYXZlIHJlY2VudGx5IHJlbmFtZWQgdGhlIHBhZ2UgPHR0PmJhci5odG1sPC90dD4gdG8KLTx0dD5mb28uaHRtbDwvdHQ+IGFuZCBub3cgd2FudCB0byBwcm92aWRlIHRoZSBvbGQgVVJMIGZvciBiYWNrd2FyZAotY29tcGF0aWJpbGl0eS4gQWN0dWFsbHkgd2Ugd2FudCB0aGF0IHVzZXJzIG9mIHRoZSBvbGQgVVJMIGV2ZW4gbm90IHJlY29nbml6ZQotdGhhdCB0aGUgcGFnZXMgd2FzIHJlbmFtZWQuCi0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci1XZSByZXdyaXRlIHRoZSBvbGQgVVJMIHRvIHRoZSBuZXcgb25lIGludGVybmFsbHkgdmlhIHRoZSBmb2xsb3dpbmcgcnVsZToKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlRW5naW5lICBvbgotUmV3cml0ZUJhc2UgICAgL35xdXV4LwotUmV3cml0ZVJ1bGUgICAgXjxiPmZvbzwvYj5cLmh0bWwkICA8Yj5iYXI8L2I+Lmh0bWwKLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08L0RMPgotCi08UD4KLTxIMj5Gcm9tIE9sZCB0byBOZXcgKGV4dGVybik8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotQXNzdW1lIGFnYWluIHRoYXQgd2UgaGF2ZSByZWNlbnRseSByZW5hbWVkIHRoZSBwYWdlIDx0dD5iYXIuaHRtbDwvdHQ+IHRvCi08dHQ+Zm9vLmh0bWw8L3R0PiBhbmQgbm93IHdhbnQgdG8gcHJvdmlkZSB0aGUgb2xkIFVSTCBmb3IgYmFja3dhcmQKLWNvbXBhdGliaWxpdHkuIEJ1dCB0aGlzIHRpbWUgd2Ugd2FudCB0aGF0IHRoZSB1c2VycyBvZiB0aGUgb2xkIFVSTCBnZXQgaGludGVkCi10byB0aGUgbmV3IG9uZSwgaS5lLiB0aGVpciBicm93c2VycyBMb2NhdGlvbiBmaWVsZCBzaG91bGQgY2hhbmdlLCB0b28uCi0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci1XZSBmb3JjZSBhIEhUVFAgcmVkaXJlY3QgdG8gdGhlIG5ldyBVUkwgd2hpY2ggbGVhZHMgdG8gYSBjaGFuZ2Ugb2YgdGhlCi1icm93c2VycyBhbmQgdGh1cyB0aGUgdXNlcnMgdmlldzoKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlRW5naW5lICBvbgotUmV3cml0ZUJhc2UgICAgL35xdXV4LwotUmV3cml0ZVJ1bGUgICAgXjxiPmZvbzwvYj5cLmh0bWwkICA8Yj5iYXI8L2I+Lmh0bWwgIFs8Yj5SPC9iPl0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08L0RMPgotCi08UD4KLTxIMj5Ccm93c2VyIERlcGVuZGVuZCBDb250ZW50PC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLUF0IGxlYXN0IGZvciBpbXBvcnRhbnQgdG9wLWxldmVsIHBhZ2VzIGl0IGlzIHNvbWV0aW1lcyBuZWNlc2FycnkgdG8gcHJvdmlkZQotdGhlIG9wdGltdW0gb2YgYnJvd3NlciBkZXBlbmRlbmQgY29udGVudCwgaS5lLiBvbmUgaGFzIHRvIHByb3ZpZGUgYSBtYXhpbXVtCi12ZXJzaW9uIGZvciB0aGUgbGF0ZXN0IE5ldHNjYXBlIHZhcmlhbnRzLCBhIG1pbmltdW0gdmVyc2lvbiBmb3IgdGhlIEx5bngKLWJyb3dzZXJzIGFuZCBhIGF2ZXJhZ2UgZmVhdHVyZSB2ZXJzaW9uIGZvciBhbGwgb3RoZXJzLgotCi08UD4KLTxEVD48U1RST05HPlNvbHV0aW9uOjwvU1RST05HPgotPEREPgotV2UgY2Fubm90IHVzZSBjb250ZW50IG5lZ290aWF0aW9uIGJlY2F1c2UgdGhlIGJyb3dzZXJzIGRvIG5vdCBwcm92aWRlIHRoZWlyCi10eXBlIGluIHRoYXQgZm9ybS4gSW5zdGVhZCB3ZSBoYXZlIHRvIGFjdCBvbiB0aGUgSFRUUCBoZWFkZXIgIlVzZXItQWdlbnQiLgotVGhlIGZvbGxvd2luZyBjb25kaWcgZG9lcyB0aGUgZm9sbG93aW5nOiBJZiB0aGUgSFRUUCBoZWFkZXIgIlVzZXItQWdlbnQiCi1iZWdpbnMgd2l0aCAiTW96aWxsYS8zIiwgdGhlIHBhZ2UgPHR0PmZvby5odG1sPC90dD4gaXMgcmV3cml0dGVuIHRvCi08dHQ+Zm9vLk5TLmh0bWw8L3R0PiBhbmQgYW5kIHRoZSByZXdyaXRpbmcgc3RvcHMuICBJZiB0aGUgYnJvd3NlciBpcyAiTHlueCIgb3IKLSJNb3ppbGxhIiBvZiB2ZXJzaW9uIDEgb3IgMiB0aGUgVVJMIGJlY29tZXMgPHR0PmZvby4yMC5odG1sPC90dD4uICBBbGwgb3RoZXIKLWJyb3dzZXJzIHJlY2VpdmUgcGFnZSA8dHQ+Zm9vLjMyLmh0bWw8L3R0Pi4gVGhpcyBpcyBkb25lIGJ5IHRoZSBmb2xsb3dpbmcKLXJ1bGVzZXQ6Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUNvbmQgJXtIVFRQX1VTRVJfQUdFTlR9ICBePGI+TW96aWxsYS8zPC9iPi4qCi1SZXdyaXRlUnVsZSBeZm9vXC5odG1sJCAgICAgICAgIGZvby48Yj5OUzwvYj4uaHRtbCAgICAgICAgICBbPGI+TDwvYj5dCi0KLVJld3JpdGVDb25kICV7SFRUUF9VU0VSX0FHRU5UfSAgXjxiPkx5bngvPC9iPi4qICAgICAgICAgW09SXQotUmV3cml0ZUNvbmQgJXtIVFRQX1VTRVJfQUdFTlR9ICBePGI+TW96aWxsYS9bMTJdPC9iPi4qCi1SZXdyaXRlUnVsZSBeZm9vXC5odG1sJCAgICAgICAgIGZvby48Yj4yMDwvYj4uaHRtbCAgICAgICAgICBbPGI+TDwvYj5dCi0KLVJld3JpdGVSdWxlIF5mb29cLmh0bWwkICAgICAgICAgZm9vLjxiPjMyPC9iPi5odG1sICAgICAgICAgIFs8Yj5MPC9iPl0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08L0RMPgotCi08UD4KLTxIMj5EeW5hbWljIE1pcnJvcjwvSDI+Ci08UD4KLQotPERMPgotPERUPjxTVFJPTkc+RGVzY3JpcHRpb246PC9TVFJPTkc+Ci08REQ+Ci1Bc3N1bWUgdGhlcmUgYXJlIG5pY2Ugd2VicGFnZXMgb24gcmVtb3RlIGhvc3RzIHdlIHdhbnQgdG8gYnJpbmcgaW50byBvdXIKLW5hbWVzcGFjZS4gRm9yIEZUUCBzZXJ2ZXJzIHdlIHdvdWxkIHVzZSB0aGUgPHR0Pm1pcnJvcjwvdHQ+IHByb2dyYW0gd2hpY2gKLWFjdHVhbGx5IG1haW50YWlucyBhbiBleHBsaWNpdCB1cC10by1kYXRlIGNvcHkgb2YgdGhlIHJlbW90ZSBkYXRhIG9uIHRoZSBsb2NhbAotbWFjaGluZS4gRm9yIGEgd2Vic2VydmVyIHdlIGNvdWxkIHVzZSB0aGUgcHJvZ3JhbSA8dHQ+d2ViY29weTwvdHQ+IHdoaWNoIGFjdHMKLXNpbWlsYXIgdmlhIEhUVFAuIEJ1dCBib3RoIHRlY2huaXF1ZXMgaGF2ZSBvbmUgbWFqb3IgZHJhd2JhY2s6IFRoZSBsb2NhbCBjb3B5Ci1pcyBhbHdheXMganVzdCBhcyB1cC10by1kYXRlIGFzIG9mdGVuIHdlIHJ1biB0aGUgcHJvZ3JhbS4gSXQgd291bGQgYmUgbXVjaAotYmV0dGVyIGlmIHRoZSBtaXJyb3IgaXMgbm90IGEgc3RhdGljIG9uZSB3ZSBoYXZlIHRvIGVzdGFibGlzaCBleHBsaWNpdGx5LgotSW5zdGVhZCB3ZSB3YW50IGEgZHluYW1pYyBtaXJyb3Igd2l0aCBkYXRhIHdoaWNoIGdldHMgdXBkYXRlZCBhdXRvbWF0aWNhbGx5Ci13aGVuIHRoZXJlIGlzIG5lZWQgKHVwZGF0ZWQgZGF0YSBvbiB0aGUgcmVtb3RlIGhvc3QpLgotCi08UD4KLTxEVD48U1RST05HPlNvbHV0aW9uOjwvU1RST05HPgotPEREPgotVG8gcHJvdmlkZSB0aGlzIGZlYXR1cmUgd2UgbWFwIHRoZSByZW1vdGUgd2VicGFnZSBvciBldmVuIHRoZSBjb21wbGV0ZSByZW1vdGUKLXdlYmFyZWEgdG8gb3VyIG5hbWVzcGFjZSBieSB0aGUgdXNlIG9mIHRoZSA8ST5Qcm94eSBUaHJvdWdocHV0PC9JPiBmZWF0dXJlCi0oZmxhZyBbUF0pOgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVFbmdpbmUgIG9uCi1SZXdyaXRlQmFzZSAgICAvfnF1dXgvCi1SZXdyaXRlUnVsZSAgICBePGI+aG90c2hlZXQvPC9iPiguKikkICA8Yj5odHRwOi8vd3d3LnRzdGltcHJlc28uY29tL2hvdHNoZWV0LzwvYj4kMSAgWzxiPlA8L2I+XQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUVuZ2luZSAgb24KLVJld3JpdGVCYXNlICAgIC9+cXV1eC8KLVJld3JpdGVSdWxlICAgIF48Yj51c2EtbmV3c1wuaHRtbDwvYj4kICAgPGI+aHR0cDovL3d3dy5xdXV4LWNvcnAuY29tL25ld3MvaW5kZXguaHRtbDwvYj4gIFs8Yj5QPC9iPl0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08L0RMPgotCi08UD4KLTxIMj5SZXZlcnNlIER5bmFtaWMgTWlycm9yPC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLS4uLgotCi08UD4KLTxEVD48U1RST05HPlNvbHV0aW9uOjwvU1RST05HPgotPEREPgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVFbmdpbmUgb24KLVJld3JpdGVDb25kICAgL21pcnJvci9vZi9yZW1vdGVzaXRlLyQxICAgICAgICAgICAtVSAKLVJld3JpdGVSdWxlICAgXmh0dHA6Ly93d3dcLnJlbW90ZXNpdGVcLmNvbS8oLiopJCAvbWlycm9yL29mL3JlbW90ZXNpdGUvJDEKLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08L0RMPgotCi08UD4KLTxIMj5SZXRyaWV2ZSBNaXNzaW5nIERhdGEgZnJvbSBJbnRyYW5ldDwvSDI+Ci08UD4KLQotPERMPgotPERUPjxTVFJPTkc+RGVzY3JpcHRpb246PC9TVFJPTkc+Ci08REQ+Ci1UaGlzIGlzIGEgdHJpY2t5IHdheSBvZiB2aXJ0dWFsbHkgcnVubmluZyBhIGNvcnBvcmF0ZXMgKGV4dGVybmFsKSBJbnRlcm5ldAotd2Vic2VydmVyICg8dHQ+d3d3LnF1dXgtY29ycC5kb208L3R0PiksIHdoaWxlIGFjdHVhbGx5IGtlZXBpbmcgYW5kIG1haW50YWluaW5nCi1pdHMgZGF0YSBvbiBhIChpbnRlcm5hbCkgSW50cmFuZXQgd2Vic2VydmVyCi0oPHR0Pnd3dzIucXV1eC1jb3JwLmRvbTwvdHQ+KSB3aGljaCBpcyBwcm90ZWN0ZWQgYnkgYSBmaXJld2FsbC4gIFRoZQotdHJpY2sgaXMgdGhhdCBvbiB0aGUgZXh0ZXJuYWwgd2Vic2VydmVyIHdlIHJldHJpZXZlIHRoZSByZXF1ZXN0ZWQgZGF0YQotb24tdGhlLWZseSBmcm9tIHRoZSBpbnRlcm5hbCBvbmUuCi0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci1GaXJzdCwgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCBvdXIgZmlyZXdhbGwgc3RpbGwgcHJvdGVjdHMgdGhlIGludGVybmFsCi13ZWJzZXJ2ZXIgYW5kIHRoYXQgb25seSB0aGUgZXh0ZXJuYWwgd2Vic2VydmVyIGlzIGFsbG93ZWQgdG8gcmV0cmlldmUgZGF0YQotZnJvbSBpdC4gRm9yIGEgcGFja2V0LWZpbHRlcmluZyBmaXJld2FsbCB3ZSBjb3VsZCBmb3IgaW5zdGFuY2UgY29uZmlndXJlIGEKLWZpcmV3YWxsIHJ1bGVzZXQgbGlrZSB0aGUgZm9sbG93aW5nOgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLTxiPkFMTE9XPC9iPiBIb3N0IHd3dy5xdXV4LWNvcnAuZG9tIFBvcnQgJmd0OzEwMjQgLS0mZ3Q7IEhvc3Qgd3d3Mi5xdXV4LWNvcnAuZG9tIFBvcnQgPGI+ODA8L2I+ICAKLTxiPkRFTlk8L2I+ICBIb3N0ICogICAgICAgICAgICAgICAgIFBvcnQgKiAgICAgLS0mZ3Q7IEhvc3Qgd3d3Mi5xdXV4LWNvcnAuZG9tIFBvcnQgPGI+ODA8L2I+Ci08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPFA+Ci1KdXN0IGFkanVzdCBpdCB0byB5b3VyIGFjdHVhbCBjb25maWd1cmF0aW9uIHN5bnRheC4gTm93IHdlIGNhbiBlc3RhYmxpc2ggdGhlCi1tb2RfcmV3cml0ZSBydWxlcyB3aGljaCByZXF1ZXN0IHRoZSBtaXNzaW5nIGRhdGEgaW4gdGhlIGJhY2tncm91bmQgdGhyb3VnaCB0aGUKLXByb3h5IHRocm91Z2hwdXQgZmVhdHVyZToKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlUnVsZSBeL34oW14vXSspLz8oLiopICAgICAgICAgIC9ob21lLyQxLy53d3cvJDIKLVJld3JpdGVDb25kICV7UkVRVUVTVF9GSUxFTkFNRX0gICAgICAgPGI+IS1mPC9iPgotUmV3cml0ZUNvbmQgJXtSRVFVRVNUX0ZJTEVOQU1FfSAgICAgICA8Yj4hLWQ8L2I+Ci1SZXdyaXRlUnVsZSBeL2hvbWUvKFteL10rKS8ud3d3Lz8oLiopIGh0dHA6Ly88Yj53d3cyPC9iPi5xdXV4LWNvcnAuZG9tL34kMS9wdWIvJDIgWzxiPlA8L2I+XQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTwvREw+Ci0KLTxQPgotPEgyPkxvYWQgQmFsYW5jaW5nPC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLVN1cHBvc2Ugd2Ugd2FudCB0byBsb2FkIGJhbGFuY2UgdGhlIHRyYWZmaWMgdG8gPHR0Pnd3dy5mb28uY29tPC90dD4gb3ZlcgotPHR0Pnd3d1swLTVdLmZvby5jb208L3R0PiAoYSB0b3RhbCBvZiA2IHNlcnZlcnMpLiBIb3cgY2FuIHRoaXMgYmUgZG9uZT8KLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLVRoZXJlIGFyZSBhIGxvdCBvZiBwb3NzaWJsZSBzb2x1dGlvbnMgZm9yIHRoaXMgcHJvYmxlbS4gV2Ugd2lsbCBkaXNjdXNzIGZpcnN0Ci1hIGNvbW1vbmx5IGtub3duIEROUy1iYXNlZCB2YXJpYW50IGFuZCB0aGVuIHRoZSBzcGVjaWFsIG9uZSB3aXRoIG1vZF9yZXdyaXRlOgotCi08b2w+Ci08bGk+PGI+RE5TIFJvdW5kLVJvYmluPC9iPgotCi08UD4KLVRoZSBzaW1wbGVzdCBtZXRob2QgZm9yIGxvYWQtYmFsYW5jaW5nIGlzIHRvIHVzZSB0aGUgRE5TIHJvdW5kLXJvYmluIGZlYXR1cmUKLW9mIEJJTkQuIEhlcmUgeW91IGp1c3QgY29uZmlndXJlIDx0dD53d3dbMC05XS5mb28uY29tPC90dD4gYXMgdXN1YWwgaW4geW91cgotRE5TIHdpdGggQShhZGRyZXNzKSByZWNvcmRzLCBlLmcuCi0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotd3d3MCAgIElOICBBICAgICAgIDEuMi4zLjEKLXd3dzEgICBJTiAgQSAgICAgICAxLjIuMy4yCi13d3cyICAgSU4gIEEgICAgICAgMS4yLjMuMwotd3d3MyAgIElOICBBICAgICAgIDEuMi4zLjQKLXd3dzQgICBJTiAgQSAgICAgICAxLjIuMy41Ci13d3c1ICAgSU4gIEEgICAgICAgMS4yLjMuNgotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTxQPgotVGhlbiB5b3UgYWRkaXRpb25hbGx5IGFkZCB0aGUgZm9sbG93aW5nIGVudHJ5OgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLXd3dyAgICBJTiAgQ05BTUUgICB3d3cwLmZvby5jb20uCi0gICAgICAgSU4gIENOQU1FICAgd3d3MS5mb28uY29tLgotICAgICAgIElOICBDTkFNRSAgIHd3dzIuZm9vLmNvbS4KLSAgICAgICBJTiAgQ05BTUUgICB3d3czLmZvby5jb20uCi0gICAgICAgSU4gIENOQU1FICAgd3d3NC5mb28uY29tLgotICAgICAgIElOICBDTkFNRSAgIHd3dzUuZm9vLmNvbS4KLSAgICAgICBJTiAgQ05BTUUgICB3d3c2LmZvby5jb20uCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPFA+Ci1Ob3RpY2UgdGhhdCB0aGlzIHNlZW1zIHdyb25nLCBidXQgaXMgYWN0dWFsbHkgYW4gaW50ZW5kZWQgZmVhdHVyZSBvZiBCSU5EIGFuZAotY2FuIGJlIHVzZWQgaW4gdGhpcyB3YXkuIEhvd2V2ZXIsIG5vdyB3aGVuIDx0dD53d3cuZm9vLmNvbTwvdHQ+IGdldHMgcmVzb2x2ZWQsCi1CSU5EIGdpdmVzIG91dCA8dHQ+d3d3MC13d3c2PC90dD4gLSBidXQgaW4gYSBzbGlnaHRseSBwZXJtdXRhdGVkL3JvdGF0ZWQgb3JkZXIKLWV2ZXJ5IHRpbWUuICBUaGlzIHdheSB0aGUgY2xpZW50cyBhcmUgc3ByZWFkIG92ZXIgdGhlIHZhcmlvdXMgc2VydmVycy4KLQotQnV0IG5vdGljZSB0aGF0IHRoaXMgbm90IGEgcGVyZmVjdCBsb2FkIGJhbGFuY2luZyBzY2hlbWUsIGJlY2F1c2UgRE5TIHJlc29sdmUKLWluZm9ybWF0aW9uIGdldHMgY2FjaGVkIGJ5IHRoZSBvdGhlciBuYW1lc2VydmVycyBvbiB0aGUgbmV0LCBzbyBvbmNlIGEgY2xpZW50Ci1oYXMgcmVzb2x2ZWQgPHR0Pnd3dy5mb28uY29tPC90dD4gdG8gYSBwYXJ0aWN1bGFyIDx0dD53d3dOLmZvby5jb208L3R0PiwgYWxsCi1zdWJzZXF1ZW50IHJlcXVlc3RzIGFsc28gZ28gdG8gdGhpcyBwYXJ0aWN1bGFyIG5hbWUgPHR0Pnd3d04uZm9vLmNvbTwvdHQ+LiBCdXQKLXRoZSBmaW5hbCByZXN1bHQgaXMgb2ssIGJlY2F1c2UgdGhlIHRvdGFsIHN1bSBvZiB0aGUgcmVxdWVzdHMgYXJlIHJlYWxseQotc3ByZWFkIG92ZXIgdGhlIHZhcmlvdXMgd2Vic2VydmVycy4KLQotPFA+Ci08bGk+PGI+RE5TIExvYWQtQmFsYW5jaW5nPC9iPgotCi08UD4KLUEgc29waGlzdGljYXRlZCBETlMtYmFzZWQgbWV0aG9kIGZvciBsb2FkLWJhbGFuY2luZyBpcyB0byB1c2UgdGhlIHByb2dyYW0KLTx0dD5sYm5hbWVkPC90dD4gd2hpY2ggY2FuIGJlIGZvdW5kIGF0IDxhCi1ocmVmPSJodHRwOi8vd3d3LnN0YW5mb3JkLmVkdS9+c2NoZW1lcnMvZG9jcy9sYm5hbWVkL2xibmFtZWQuaHRtbCI+aHR0cDovL3d3dy5zdGFuZm9yZC5lZHUvfnNjaGVtZXJzL2RvY3MvbGJuYW1lZC9sYm5hbWVkLmh0bWw8L2E+LgotSXQgaXMgYSBQZXJsIDUgcHJvZ3JhbSBpbiBjb25qdW5jdGlvbiB3aXRoIGF1eGlsbGlhcnkgdG9vbHMgd2hpY2ggcHJvdmlkZXMgYQotcmVhbCBsb2FkLWJhbGFuY2luZyBmb3IgRE5TLgotCi08UD4KLTxsaT48Yj5Qcm94eSBUaHJvdWdocHV0IFJvdW5kLVJvYmluPC9iPgotCi08UD4KLUluIHRoaXMgdmFyaWFudCB3ZSB1c2UgbW9kX3Jld3JpdGUgYW5kIGl0cyBwcm94eSB0aHJvdWdocHV0IGZlYXR1cmUuICBGaXJzdCB3ZQotZGVkaWNhdGUgPHR0Pnd3dzAuZm9vLmNvbTwvdHQ+IHRvIGJlIGFjdHVhbGx5IDx0dD53d3cuZm9vLmNvbTwvdHQ+IGJ5IHVzaW5nIGEKLXNpbmdsZQotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLXd3dyAgICBJTiAgQ05BTUUgICB3d3cwLmZvby5jb20uCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPFA+Ci1lbnRyeSBpbiB0aGUgRE5TLiBUaGVuIHdlIGNvbnZlcnQgPHR0Pnd3dzAuZm9vLmNvbTwvdHQ+IHRvIGEgcHJveHktb25seQotc2VydmVyLCBpLmUuIHdlIGNvbmZpZ3VyZSB0aGlzIG1hY2hpbmUgc28gYWxsIGFycml2aW5nIFVSTHMgYXJlIGp1c3QgcHVzaGVkCi10aHJvdWdoIHRoZSBpbnRlcm5hbCBwcm94eSB0byBvbmUgb2YgdGhlIDUgb3RoZXIgc2VydmVycyAoPHR0Pnd3dzEtd3d3NTwvdHQ+KS4KLVRvIGFjY29tcGxpc2ggdGhpcyB3ZSBmaXJzdCBlc3RhYmxpc2ggYSBydWxlc2V0IHdoaWNoIGNvbnRhY3RzIGEgbG9hZAotYmFsYW5jaW5nIHNjcmlwdCA8dHQ+bGIucGw8L3R0PiBmb3IgYWxsIFVSTHMuCi0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUVuZ2luZSBvbgotUmV3cml0ZU1hcCAgICBsYiAgICAgIHByZzovcGF0aC90by9sYi5wbAotUmV3cml0ZVJ1bGUgICBeLyguKykkICR7bGI6JDF9ICAgICAgICAgICBbUCxMXQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTxQPgotVGhlbiB3ZSB3cml0ZSA8dHQ+bGIucGw8L3R0PjoKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci0jIS9wYXRoL3RvL3BlcmwKLSMjCi0jIyAgbGIucGwgLS0gbG9hZCBiYWxhbmNpbmcgc2NyaXB0Ci0jIwotCi0kfCA9IDE7Ci0KLSRuYW1lICAgPSAid3d3IjsgICAgICMgdGhlIGhvc3RuYW1lIGJhc2UKLSRmaXJzdCAgPSAxOyAgICAgICAgICMgdGhlIGZpcnN0IHNlcnZlciAobm90IDAgaGVyZSwgYmVjYXVzZSAwIGlzIG15c2VsZikgCi0kbGFzdCAgID0gNTsgICAgICAgICAjIHRoZSBsYXN0IHNlcnZlciBpbiB0aGUgcm91bmQtcm9iaW4KLSRkb21haW4gPSAiZm9vLmRvbSI7ICMgdGhlIGRvbWFpbm5hbWUKLQotJGNudCA9IDA7Ci13aGlsZSAoJmx0O1NURElOJmd0OykgewotICAgICRjbnQgPSAoKCRjbnQrMSkgJSAoJGxhc3QrMS0kZmlyc3QpKTsKLSAgICAkc2VydmVyID0gc3ByaW50ZigiJXMlZC4lcyIsICRuYW1lLCAkY250KyRmaXJzdCwgJGRvbWFpbik7Ci0gICAgcHJpbnQgImh0dHA6Ly8kc2VydmVyLyRfIjsKLX0KLQotIyNFT0YjIwotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTxQPgotQSBsYXN0IG5vdGljZTogV2h5IGlzIHRoaXMgdXNlZnVsPyBTZWVtcyBsaWtlIDx0dD53d3cwLmZvby5jb208L3R0PiBzdGlsbCBpcwotb3ZlcmxvYWRlZD8gVGhlIGFuc3dlciBpcyB5ZXMsIGl0IGlzIG92ZXJsb2FkZWQsIGJ1dCB3aXRoIHBsYWluIHByb3h5Ci10aHJvdWdocHV0IHJlcXVlc3RzLCBvbmx5ISBBbGwgU1NJLCBDR0ksIGVQZXJsLCBldGMuIHByb2Nlc3NpbmcgaXMgY29tcGxldGVseQotZG9uZSBvbiB0aGUgb3RoZXIgbWFjaGluZXMuIFRoaXMgaXMgdGhlIGVzc2VudGlhbCBwb2ludC4KLQotPFA+Ci08bGk+PGI+SGFyZHdhcmUvVENQIFJvdW5kLVJvYmluPC9iPgotCi08UD4KLVRoZXJlIGlzIGEgaGFyZHdhcmUgc29sdXRpb24gYXZhaWxhYmxlLCB0b28uIENpc2NvIGhhcyBhIGJlYXN0IGNhbGxlZAotTG9jYWxEaXJlY3RvciB3aGljaCBkb2VzIGEgbG9hZCBiYWxhbmNpbmcgYXQgdGhlIFRDUC9JUCBsZXZlbC4gQWN0dWFsbHkgdGhpcwotaXMgc29tZSBzb3J0IG9mIGEgY2lyY3VpdCBsZXZlbCBnYXRld2F5IGluIGZyb250IG9mIGEgd2ViY2x1c3Rlci4gIElmIHlvdSBoYXZlCi1lbm91Z2ggbW9uZXkgYW5kIHJlYWxseSBuZWVkIGEgc29sdXRpb24gd2l0aCBoaWdoIHBlcmZvcm1hbmNlLCB1c2UgdGhpcyBvbmUuCi0KLTwvb2w+Ci0KLTwvREw+Ci0KLTxQPgotPEgyPlJldmVyc2UgUHJveHk8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotLi4uCi0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotIyMKLSMjICBhcGFjaGUtcnByb3h5LmNvbmYgLS0gQXBhY2hlIGNvbmZpZ3VyYXRpb24gZm9yIFJldmVyc2UgUHJveHkgVXNhZ2UKLSMjCi0KLSMgICBzZXJ2ZXIgdHlwZQotU2VydmVyVHlwZSAgICAgICAgICAgc3RhbmRhbG9uZQotUG9ydCAgICAgICAgICAgICAgICAgODAwMAotTWluU3BhcmVTZXJ2ZXJzICAgICAgMTYKLVN0YXJ0U2VydmVycyAgICAgICAgIDE2Ci1NYXhTcGFyZVNlcnZlcnMgICAgICAxNgotTWF4Q2xpZW50cyAgICAgICAgICAgMTYKLU1heFJlcXVlc3RzUGVyQ2hpbGQgIDEwMAotCi0jICAgc2VydmVyIG9wZXJhdGlvbiBwYXJhbWV0ZXJzCi1LZWVwQWxpdmUgICAgICAgICAgICBvbgotTWF4S2VlcEFsaXZlUmVxdWVzdHMgMTAwCi1LZWVwQWxpdmVUaW1lb3V0ICAgICAxNQotVGltZW91dCAgICAgICAgICAgICAgNDAwCi1JZGVudGl0eUNoZWNrICAgICAgICBvZmYKLUhvc3RuYW1lTG9va3VwcyAgICAgIG9mZgotCi0jICAgcGF0aHMgdG8gcnVudGltZSBmaWxlcwotUGlkRmlsZSAgICAgICAgICAgICAgL3BhdGgvdG8vYXBhY2hlLXJwcm94eS5waWQKLUxvY2tGaWxlICAgICAgICAgICAgIC9wYXRoL3RvL2FwYWNoZS1ycHJveHkubG9jawotRXJyb3JMb2cgICAgICAgICAgICAgL3BhdGgvdG8vYXBhY2hlLXJwcm94eS5lbG9nCi1DdXN0b21Mb2cgICAgICAgICAgICAvcGF0aC90by9hcGFjaGUtcnByb3h5LmRsb2cgIiV7JXYvJVR9dCAlaCAtJmd0OyAle1NFUlZFUn1lIFVSTDogJVUiCi0KLSMgICB1bnVzZWQgcGF0aHMKLVNlcnZlclJvb3QgICAgICAgICAgIC90bXAKLURvY3VtZW50Um9vdCAgICAgICAgIC90bXAKLUNhY2hlUm9vdCAgICAgICAgICAgIC90bXAKLVJld3JpdGVMb2cgICAgICAgICAgIC9kZXYvbnVsbAotVHJhbnNmZXJMb2cgICAgICAgICAgL2Rldi9udWxsCi1UeXBlc0NvbmZpZyAgICAgICAgICAvZGV2L251bGwKLUFjY2Vzc0NvbmZpZyAgICAgICAgIC9kZXYvbnVsbAotUmVzb3VyY2VDb25maWcgICAgICAgL2Rldi9udWxsCi0KLSMgICBzcGVlZCB1cCBhbmQgc2VjdXJlIHByb2Nlc3NpbmcKLSZsdDtEaXJlY3RvcnkgLyZndDsKLU9wdGlvbnMgLUZvbGxvd1N5bUxpbmtzIC1TeW1MaW5rc0lmT3duZXJNYXRjaAotQWxsb3dPdmVyd3JpdGUgTm9uZQotJmx0Oy9EaXJlY3RvcnkmZ3Q7Ci0KLSMgICB0aGUgc3RhdHVzIHBhZ2UgZm9yIG1vbml0b3JpbmcgdGhlIHJldmVyc2UgcHJveHkKLSZsdDtMb2NhdGlvbiAvcnByb3h5LXN0YXR1cyZndDsKLVNldEhhbmRsZXIgc2VydmVyLXN0YXR1cwotJmx0Oy9Mb2NhdGlvbiZndDsKLQotIyAgIGVuYWJsZSB0aGUgVVJMIHJld3JpdGluZyBlbmdpbmUKLVJld3JpdGVFbmdpbmUgICAgICAgIG9uCi1SZXdyaXRlTG9nTGV2ZWwgICAgICAwCi0KLSMgICBkZWZpbmUgYSByZXdyaXRpbmcgbWFwIHdpdGggdmFsdWUtbGlzdHMgd2hlcmUKLSMgICBtb2RfcmV3cml0ZSByYW5kb21seSBjaG9vc2VzIGEgcGFydGljdWxhciB2YWx1ZQotUmV3cml0ZU1hcCAgICAgc2VydmVyICBybmQ6L3BhdGgvdG8vYXBhY2hlLXJwcm94eS5jb25mLXNlcnZlcnMKLQotIyAgIG1ha2Ugc3VyZSB0aGUgc3RhdHVzIHBhZ2UgaXMgaGFuZGxlZCBsb2NhbGx5Ci0jICAgYW5kIG1ha2Ugc3VyZSBubyBvbmUgdXNlcyBvdXIgcHJveHkgZXhjZXB0IG91cnNlbGYKLVJld3JpdGVSdWxlICAgIF4vYXBhY2hlLXJwcm94eS1zdGF0dXMuKiAgLSAgW0xdCi1SZXdyaXRlUnVsZSAgICBeKGh0dHB8ZnRwKTovLy4qICAgICAgICAgIC0gIFtGXQotCi0jICAgbm93IGNob29zZSB0aGUgcG9zc2libGUgc2VydmVycyBmb3IgcGFydGljdWxhciBVUkwgdHlwZXMKLVJld3JpdGVSdWxlICAgIF4vKC4qXC4oY2dpfHNodG1sKSkkICB0bzovLyR7c2VydmVyOmR5bmFtaWN9LyQxICBbUz0xXQotUmV3cml0ZVJ1bGUgICAgXi8oLiopJCAgICAgICAgICAgICAgIHRvOi8vJHtzZXJ2ZXI6c3RhdGljfS8kMSAgCi0KLSMgICBhbmQgZGVsZWdhdGUgdGhlIGdlbmVyYXRlZCBVUkwgYnkgcGFzc2luZyBpdCAKLSMgICB0aHJvdWdoIHRoZSBwcm94eSBtb2R1bGUKLVJld3JpdGVSdWxlICAgIF50bzovLyhbXi9dKykvKC4qKSAgICBodHRwOi8vJDEvJDIgICBbRT1TRVJWRVI6JDEsUCxMXQotCi0jICAgYW5kIG1ha2UgcmVhbGx5IHN1cmUgYWxsIG90aGVyIHN0dWZmIGlzIGZvcmJpZGRlbiAKLSMgICB3aGVuIGl0IHNob3VsZCBzdXJ2aXZlIHRoZSBhYm92ZSBydWxlcy4uLgotUmV3cml0ZVJ1bGUgICAgLiogICAgICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgIFtGXQotCi0jICAgZW5hYmxlIHRoZSBQcm94eSBtb2R1bGUgd2l0aG91dCBjYWNoaW5nCi1Qcm94eVJlcXVlc3RzICAgICAgICBvbgotTm9DYWNoZSAgICAgICAgICAgICAgKgotCi0jICAgc2V0dXAgVVJMIHJldmVyc2UgbWFwcGluZyBmb3IgcmVkaXJlY3QgcmVwb25zZXMKLVByb3h5UGFzc1JldmVyc2UgIC8gIGh0dHA6Ly93d3cxLmZvby5kb20vCi1Qcm94eVBhc3NSZXZlcnNlICAvICBodHRwOi8vd3d3Mi5mb28uZG9tLwotUHJveHlQYXNzUmV2ZXJzZSAgLyAgaHR0cDovL3d3dzMuZm9vLmRvbS8KLVByb3h5UGFzc1JldmVyc2UgIC8gIGh0dHA6Ly93d3c0LmZvby5kb20vCi1Qcm94eVBhc3NSZXZlcnNlICAvICBodHRwOi8vd3d3NS5mb28uZG9tLwotUHJveHlQYXNzUmV2ZXJzZSAgLyAgaHR0cDovL3d3dzYuZm9vLmRvbS8KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLSMjCi0jIyAgYXBhY2hlLXJwcm94eS5jb25mLXNlcnZlcnMgLS0gQXBhY2hlL21vZF9yZXdyaXRlIHNlbGVjdGlvbiB0YWJsZQotIyMKLQotIyAgIGxpc3Qgb2YgYmFja2VuZCBzZXJ2ZXJzIHdoaWNoIHNlcnZlIHN0YXRpYwotIyAgIHBhZ2VzIChIVE1MIGZpbGVzIGFuZCBJbWFnZXMsIGV0Yy4pCi1zdGF0aWMgICAgd3d3MS5mb28uZG9tfHd3dzIuZm9vLmRvbXx3d3czLmZvby5kb218d3d3NC5mb28uZG9tCi0KLSMgICBsaXN0IG9mIGJhY2tlbmQgc2VydmVycyB3aGljaCBzZXJ2ZSBkeW5hbWljYWxseSAKLSMgICBnZW5lcmF0ZWQgcGFnZSAoQ0dJIHByb2dyYW1zIG9yIG1vZF9wZXJsIHNjcmlwdHMpCi1keW5hbWljICAgd3d3NS5mb28uZG9tfHd3dzYuZm9vLmRvbQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTwvREw+Ci0KLTxQPgotPEgyPk5ldyBNSU1FLXR5cGUsIE5ldyBTZXJ2aWNlPC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLU9uIHRoZSBuZXQgdGhlcmUgYXJlIGEgbG90IG9mIG5pZnR5IENHSSBwcm9ncmFtcy4gQnV0IHRoZWlyIHVzYWdlIGlzIHVzdWFsbHkKLWJvcmluZywgc28gYSBsb3Qgb2Ygd2VibWFzdGVyIGRvbid0IHVzZSB0aGVtLiAgRXZlbiBBcGFjaGUncyBBY3Rpb24gaGFuZGxlcgotZmVhdHVyZSBmb3IgTUlNRS10eXBlcyBpcyBvbmx5IGFwcHJvcHJpYXRlIHdoZW4gdGhlIENHSSBwcm9ncmFtcyBkb24ndCBuZWVkCi1zcGVjaWFsIFVSTHMgKGFjdHVhbGx5IFBBVEhfSU5GTyBhbmQgUVVFUllfU1RSSU5HUykgYXMgdGhlaXIgaW5wdXQuIAotCi1GaXJzdCwgbGV0IHVzIGNvbmZpZ3VyZSBhIG5ldyBmaWxlIHR5cGUgd2l0aCBleHRlbnNpb24gPHR0Pi5zY2dpPC90dD4KLShmb3Igc2VjdXJlIENHSSkgd2hpY2ggd2lsbCBiZSBwcm9jZXNzZWQgYnkgdGhlIHBvcHVsYXIgPHR0PmNnaXdyYXA8L3R0PgotcHJvZ3JhbS4gVGhlIHByb2JsZW0gaGVyZSBpcyB0aGF0IGZvciBpbnN0YW5jZSB3ZSB1c2UgYSBIb21vZ2VuZW91cyBVUkwgTGF5b3V0Ci0oc2VlIGFib3ZlKSBhIGZpbGUgaW5zaWRlIHRoZSB1c2VyIGhvbWVkaXJzIGhhcyB0aGUgVVJMCi08dHQ+L3UvdXNlci9mb28vYmFyLnNjZ2k8L3R0Pi4gQnV0IDx0dD5jZ2l3cmFwPC90dD4gbmVlZHMgdGhlIFVSTCBpbiB0aGUgZm9ybQotPHR0Pi9+dXNlci9mb28vYmFyLnNjZ2kvPC90dD4uIFRoZSBmb2xsb3dpbmcgcnVsZSBzb2x2ZXMgdGhlIHByb2JsZW06Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZVJ1bGUgXi9bdWdlXS88Yj4oW14vXSspPC9iPi9cLnd3dy8oLispXC5zY2dpKC4qKSAuLi4KLS4uLiAvaW50ZXJuYWwvY2dpL3VzZXIvY2dpd3JhcC9+PGI+JDE8L2I+LyQyLnNjZ2kkMyAgW05TLDxiPlQ9YXBwbGljYXRpb24veC1odHRwLWNnaTwvYj5dCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPFA+Ci1PciBhc3N1bWUgd2UgaGF2ZSBzb21lIG1vcmUgbmlmdHkgcHJvZ3JhbXM6Ci08dHQ+d3d3bG9nPC90dD4gKHdoaWNoIGRpc3BsYXlzIHRoZSA8dHQ+YWNjZXNzLmxvZzwvdHQ+IGZvciBhIFVSTCBzdWJ0cmVlIGFuZAotPHR0Pnd3d2lkeDwvdHQ+ICh3aGljaCBydW5zIEdsaW1wc2Ugb24gYSBVUkwgc3VidHJlZSkuIFdlIGhhdmUgdG8KLXByb3ZpZGUgdGhlIFVSTCBhcmVhIHRvIHRoZXNlIHByb2dyYW1zIHNvIHRoZXkga25vdyBvbiB3aGljaCBhcmVhCi10aGV5IGhhdmUgdG8gYWN0IG9uLiBCdXQgdXN1YWxseSB0aGlzIHVnbHksIGJlY2F1c2UgdGhleSBhcmUgYWxsIHRoZQotdGltZXMgc3RpbGwgcmVxdWVzdGVkIGZyb20gdGhhdCBhcmVhcywgaS5lLiB0eXBpY2FsbHkgd2Ugd291bGQgcnVuCi10aGUgPHR0PnN3d2lkeDwvdHQ+IHByb2dyYW0gZnJvbSB3aXRoaW4gPHR0Pi91L3VzZXIvZm9vLzwvdHQ+IHZpYQotaHlwZXJsaW5rIHRvCi0KLTxQPjxQUkU+Ci0vaW50ZXJuYWwvY2dpL3VzZXIvc3d3aWR4P2k9L3UvdXNlci9mb28vCi08L1BSRT48UD4KLQotd2hpY2ggaXMgdWdseS4gQmVjYXVzZSB3ZSBoYXZlIHRvIGhhcmQtY29kZSA8Yj5ib3RoPC9iPiB0aGUgbG9jYXRpb24gb2YgdGhlCi1hcmVhIDxiPmFuZDwvYj4gdGhlIGxvY2F0aW9uIG9mIHRoZSBDR0kgaW5zaWRlIHRoZSBoeXBlcmxpbmsuIFdoZW4gd2UgaGF2ZSB0bwotcmVvcmdhbmlzZSBvciBhcmVhLCB3ZSBzcGVuZCBhIGxvdCBvZiB0aW1lIGNoYW5naW5nIHRoZSB2YXJpb3VzIGh5cGVybGlua3MuCi0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci1UaGUgc29sdXRpb24gaGVyZSBpcyB0byBwcm92aWRlIGEgc3BlY2lhbCBuZXcgVVJMIGZvcm1hdCB3aGljaCBhdXRvbWF0aWNhbGx5Ci1sZWFkcyB0byB0aGUgcHJvcGVyIENHSSBpbnZvY2F0aW9uLiBXZSBjb25maWd1cmUgdGhlIGZvbGxvd2luZzoKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlUnVsZSAgIF4vKFt1Z2VdKS8oW14vXSspKC8/LiopL1wqICAvaW50ZXJuYWwvY2dpL3VzZXIvd3d3aWR4P2k9LyQxLyQyJDMvCi1SZXdyaXRlUnVsZSAgIF4vKFt1Z2VdKS8oW14vXSspKC8/LiopOmxvZyAvaW50ZXJuYWwvY2dpL3VzZXIvd3d3bG9nP2Y9LyQxLyQyJDMKLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08UD4KLU5vdyB0aGUgaHlwZXJsaW5rIHRvIHNlYXJjaCBhdCA8dHQ+L3UvdXNlci9mb28vPC90dD4gcmVhZHMgb25seQotCi08UD48UFJFPgotaHJlZj0iKiIKLTwvUFJFPjxQPgotCi13aGljaCBpbnRlcm5hbGx5IGdldHMgYXV0b21hdGljYWxseSB0cmFuc2Zvcm1lZCB0byAKLQotPFA+PFBSRT4KLS9pbnRlcm5hbC9jZ2kvdXNlci93d3dpZHg/aT0vdS91c2VyL2Zvby8KLTwvUFJFPjxQPgotCi1UaGUgc2FtZSBhcHByb2FjaCBsZWFkcyB0byBhbiBpbnZvY2F0aW9uIGZvciB0aGUgYWNjZXNzIGxvZyBDR0kKLXByb2dyYW0gd2hlbiB0aGUgaHlwZXJsaW5rIDx0dD46bG9nPC90dD4gZ2V0cyB1c2VkLgotCi08L0RMPgotCi08UD4KLTxIMj5Gcm9tIFN0YXRpYyB0byBEeW5hbWljPC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLUhvdyBjYW4gd2UgdHJhbnNmb3JtIGEgc3RhdGljIHBhZ2UgPHR0PmZvby5odG1sPC90dD4gaW50byBhIGR5bmFtaWMgdmFyaWFudAotPHR0PmZvby5jZ2k8L3R0PiBpbiBhIHNlZW1sZXNzIHdheSwgaS5lLiAgd2l0aG91dCBub3RpY2UgYnkgdGhlIGJyb3dzZXIvdXNlci4KLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLVdlIGp1c3QgcmV3cml0ZSB0aGUgVVJMIHRvIHRoZSBDR0ktc2NyaXB0IGFuZCBmb3JjZSB0aGUgY29ycmVjdCBNSU1FLXR5cGUgc28KLWl0IGdldHMgcmVhbGx5IHJ1biBhcyBhIENHSS1zY3JpcHQuIFRoaXMgd2F5IGEgcmVxdWVzdCB0bwotPHR0Pi9+cXV1eC9mb28uaHRtbDwvdHQ+IGludGVybmFsbHkgbGVhZHMgdG8gdGhlIGludm9rYXRpb24gb2YKLTx0dD4vfnF1dXgvZm9vLmNnaTwvdHQ+LgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVFbmdpbmUgIG9uCi1SZXdyaXRlQmFzZSAgICAvfnF1dXgvCi1SZXdyaXRlUnVsZSAgICBeZm9vXC48Yj5odG1sPC9iPiQgIGZvby48Yj5jZ2k8L2I+ICBbVD08Yj5hcHBsaWNhdGlvbi94LWh0dHBkLWNnaTwvYj5dCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPC9ETD4KLQotPFA+Ci08SDI+T24tdGhlLWZseSBDb250ZW50LVJlZ2VuZXJhdGlvbjwvSDI+Ci08UD4KLQotPERMPgotPERUPjxTVFJPTkc+RGVzY3JpcHRpb246PC9TVFJPTkc+Ci08REQ+Ci1IZXJlIGNvbWVzIGEgcmVhbGx5IGVzb3RlcmljIGZlYXR1cmU6IER5bmFtaWNhbGx5IGdlbmVyYXRlZCBidXQgc3RhdGljYWxseQotc2VydmVkIHBhZ2VzLCBpLmUuIHBhZ2VzIHNob3VsZCBiZSBkZWxpdmVyZWQgYXMgcHVyIHN0YXRpYyBwYWdlcyAocmVhZCBmcm9tCi10aGUgZmlsZXN5c3RlbSBhbmQganVzdCBwYXNzZWQgdGhyb3VnaCksIGJ1dCB0aGV5IGhhdmUgdG8gYmUgZ2VuZXJhdGVkCi1keW5hbWljYWxseSBieSB0aGUgd2Vic2VydmVyIGlmIG1pc3NpbmcuIFRoaXMgd2F5IHlvdSBjYW4gaGF2ZSBDR0ktZ2VuZXJhdGVkCi1wYWdlcyB3aGljaCBhcmUgc3RhdGljYWxseSB1bmxlc3Mgb25lIChvciBhIGNyb25qb2IpIHJlbW92ZXMgdGhlIHN0YXRpYwotY29udGVudHMuIFRoZW4gdGhlIGNvbnRlbnRzIGdldHMgcmVmcmVzaGVkLgotCi08UD4KLTxEVD48U1RST05HPlNvbHV0aW9uOjwvU1RST05HPgotPEREPgotVGhpcyBpcyBkb25lIHZpYSB0aGUgZm9sbG93aW5nIHJ1bGVzZXQ6Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUNvbmQgJXtSRVFVRVNUX0ZJTEVOQU1FfSAgIDxiPiEtczwvYj4KLVJld3JpdGVDb25kIF5wYWdlXC48Yj5odG1sPC9iPiQgICAgICAgICAgcGFnZS48Yj5jZ2k8L2I+ICAgW1Q9YXBwbGljYXRpb24veC1odHRwZC1jZ2ksTF0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08UD4KLUhlcmUgYSByZXF1ZXN0IHRvIDx0dD5wYWdlLmh0bWw8L3R0PiBsZWFkcyB0byBhIGludGVybmFsIHJ1biBvZiBhCi1jb3JyZXNwb25kaW5nIDx0dD5wYWdlLmNnaTwvdHQ+IGlmIDx0dD5wYWdlLmh0bWw8L3R0PiBpcyBzdGlsbCBtaXNzaW5nIG9yIGhhcwotZmlsZXNpemUgbnVsbC4gVGhlIHRyaWNrIGhlcmUgaXMgdGhhdCA8dHQ+cGFnZS5jZ2k8L3R0PiBpcyBhIHVzdWFsIENHSSBzY3JpcHQKLXdoaWNoIChhZGRpdGlvbmFsbHkgdG8gaXRzIFNURE9VVCkgd3JpdGVzIGl0cyBvdXRwdXQgdG8gdGhlIGZpbGUKLTx0dD5wYWdlLmh0bWw8L3R0Pi4gT25jZSBpdCB3YXMgcnVuLCB0aGUgc2VydmVyIHNlbmRzIG91dCB0aGUgZGF0YSBvZgotPHR0PnBhZ2UuaHRtbDwvdHQ+LiBXaGVuIHRoZSB3ZWJtYXN0ZXIgd2FudHMgdG8gZm9yY2UgYSByZWZyZXNoIHRoZSBjb250ZW50cywKLWhlIGp1c3QgcmVtb3ZlcyA8dHQ+cGFnZS5odG1sPC90dD4gKHVzdWFsbHkgZG9uZSBieSBhIGNyb25qb2IpLgotCi08L0RMPgotCi08UD4KLTxIMj5Eb2N1bWVudCBXaXRoIEF1dG9yZWZyZXNoPC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLVdvdWxkbid0IGl0IGJlIG5pY2Ugd2hpbGUgY3JlYXRpbmcgYSBjb21wbGV4IHdlYnBhZ2UgaWYgdGhlIHdlYmJyb3dzZXIgd291bGQKLWF1dG9tYXRpY2FsbHkgcmVmcmVzaCB0aGUgcGFnZSBldmVyeSB0aW1lIHdlIHdyaXRlIGEgbmV3IHZlcnNpb24gZnJvbSB3aXRoaW4KLW91ciBlZGl0b3I/IEltcG9zc2libGU/Ci0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci1ObyEgV2UganVzdCBjb21iaW5lIHRoZSBNSU1FIG11bHRpcGFydCBmZWF0dXJlLCB0aGUgd2Vic2VydmVyIE5QSCBmZWF0dXJlIGFuZAotdGhlIFVSTCBtYW5pcHVsYXRpb24gcG93ZXIgb2YgbW9kX3Jld3JpdGUuIEZpcnN0LCB3ZSBlc3RhYmxpc2ggYSBuZXcgVVJMCi1mZWF0dXJlOiBBZGRpbmcganVzdCA8dHQ+OnJlZnJlc2g8L3R0PiB0byBhbnkgVVJMIGNhdXNlcyB0aGlzIHRvIGJlIHJlZnJlc2hlZAotZXZlcnkgdGltZSBpdCBnZXRzIHVwZGF0ZWQgb24gdGhlIGZpbGVzeXN0ZW0uCi0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZVJ1bGUgICBeKC9bdWdlXS9bXi9dKy8/LiopOnJlZnJlc2ggIC9pbnRlcm5hbC9jZ2kvYXBhY2hlL25waC1yZWZyZXNoP2Y9JDEKLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08UD4KLU5vdyB3aGVuIHdlIHJlZmVyZW5jZSB0aGUgVVJMCi0KLTxQPjxQUkU+Ci0vdS9mb28vYmFyL3BhZ2UuaHRtbDpyZWZyZXNoCi08L1BSRT48UD4KLQotdGhpcyBsZWFkcyB0byB0aGUgaW50ZXJuYWwgaW52b2NhdGlvbiBvZiB0aGUgVVJMCi0KLTxQPjxQUkU+Ci0vaW50ZXJuYWwvY2dpL2FwYWNoZS9ucGgtcmVmcmVzaD9mPS91L2Zvby9iYXIvcGFnZS5odG1sCi08L1BSRT48UD4KLQotVGhlIG9ubHkgbWlzc2luZyBwYXJ0IGlzIHRoZSBOUEgtQ0dJIHNjcmlwdC4gQWx0aG91Z2ggb25lIHdvdWxkIHVzdWFsbHkgc2F5Ci0ibGVmdCBhcyBhbiBleGVyY2lzZSB0byB0aGUgcmVhZGVyIiA7LSkgSSB3aWxsIHByb3ZpZGUgdGhpcywgdG9vLgotCi08UD48UFJFPgotIyEvc3cvYmluL3BlcmwKLSMjCi0jIyAgbnBoLXJlZnJlc2ggLS0gTlBIL0NHSSBzY3JpcHQgZm9yIGF1dG8gcmVmcmVzaGluZyBwYWdlcwotIyMgIENvcHlyaWdodCAoYykgMTk5NyBSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSMjCi0kfCA9IDE7Ci0KLSMgICBzcGxpdCB0aGUgUVVFUllfU1RSSU5HIHZhcmlhYmxlCi1AcGFpcnMgPSBzcGxpdCgvJmFtcDsvLCAkRU5WeydRVUVSWV9TVFJJTkcnfSk7Ci1mb3JlYWNoICRwYWlyIChAcGFpcnMpIHsKLSAgICAoJG5hbWUsICR2YWx1ZSkgPSBzcGxpdCgvPS8sICRwYWlyKTsKLSAgICAkbmFtZSA9fiB0ci9BLVovYS16LzsKLSAgICAkbmFtZSA9ICdRU18nIC4gJG5hbWU7Ci0gICAgJHZhbHVlID1+IHMvJShbYS1mQS1GMC05XVthLWZBLUYwLTldKS9wYWNrKCJDIiwgaGV4KCQxKSkvZWc7Ci0gICAgZXZhbCAiXCQkbmFtZSA9IFwiJHZhbHVlXCIiOwotfQotJFFTX3MgPSAxIGlmICgkUVNfcyBlcSAnJyk7Ci0kUVNfbiA9IDM2MDAgaWYgKCRRU19uIGVxICcnKTsKLWlmICgkUVNfZiBlcSAnJykgewotICAgIHByaW50ICJIVFRQLzEuMCAyMDAgT0tcbiI7Ci0gICAgcHJpbnQgIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sXG5cbiI7Ci0gICAgcHJpbnQgIiZhbXA7bHQ7YiZhbXA7Z3Q7RVJST1ImYW1wO2x0Oy9iJmFtcDtndDs6IE5vIGZpbGUgZ2l2ZW5cbiI7Ci0gICAgZXhpdCgwKTsKLX0KLWlmICghIC1mICRRU19mKSB7Ci0gICAgcHJpbnQgIkhUVFAvMS4wIDIwMCBPS1xuIjsKLSAgICBwcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcblxuIjsKLSAgICBwcmludCAiJmFtcDtsdDtiJmFtcDtndDtFUlJPUiZhbXA7bHQ7L2ImYW1wO2d0OzogRmlsZSAkUVNfZiBub3QgZm91bmRcbiI7Ci0gICAgZXhpdCgwKTsKLX0KLQotc3ViIHByaW50X2h0dHBfaGVhZGVyc19tdWx0aXBhcnRfYmVnaW4gewotICAgIHByaW50ICJIVFRQLzEuMCAyMDAgT0tcbiI7Ci0gICAgJGJvdW5kID0gIlRoaXNSYW5kb21TdHJpbmcxMjM0NSI7Ci0gICAgcHJpbnQgIkNvbnRlbnQtdHlwZTogbXVsdGlwYXJ0L3gtbWl4ZWQtcmVwbGFjZTtib3VuZGFyeT0kYm91bmRcbiI7Ci0gICAgJmFtcDtwcmludF9odHRwX2hlYWRlcnNfbXVsdGlwYXJ0X25leHQ7Ci19Ci0KLXN1YiBwcmludF9odHRwX2hlYWRlcnNfbXVsdGlwYXJ0X25leHQgewotICAgIHByaW50ICJcbi0tJGJvdW5kXG4iOwotfQotCi1zdWIgcHJpbnRfaHR0cF9oZWFkZXJzX211bHRpcGFydF9lbmQgewotICAgIHByaW50ICJcbi0tJGJvdW5kLS1cbiI7Ci19Ci0KLXN1YiBkaXNwbGF5aHRtbCB7Ci0gICAgbG9jYWwoJGJ1ZmZlcikgPSBAXzsKLSAgICAkbGVuID0gbGVuZ3RoKCRidWZmZXIpOwotICAgIHByaW50ICJDb250ZW50LXR5cGU6IHRleHQvaHRtbFxuIjsKLSAgICBwcmludCAiQ29udGVudC1sZW5ndGg6ICRsZW5cblxuIjsKLSAgICBwcmludCAkYnVmZmVyOwotfQotCi1zdWIgcmVhZGZpbGUgewotICAgIGxvY2FsKCRmaWxlKSA9IEBfOwotICAgIGxvY2FsKCpGUCwgJHNpemUsICRidWZmZXIsICRieXRlcyk7Ci0gICAgKCR4LCAkeCwgJHgsICR4LCAkeCwgJHgsICR4LCAkc2l6ZSkgPSBzdGF0KCRmaWxlKTsKLSAgICAkc2l6ZSA9IHNwcmludGYoIiVkIiwgJHNpemUpOwotICAgIG9wZW4oRlAsICImYW1wO2x0OyRmaWxlIik7Ci0gICAgJGJ5dGVzID0gc3lzcmVhZChGUCwgJGJ1ZmZlciwgJHNpemUpOwotICAgIGNsb3NlKEZQKTsKLSAgICByZXR1cm4gJGJ1ZmZlcjsKLX0KLQotJGJ1ZmZlciA9ICZhbXA7cmVhZGZpbGUoJFFTX2YpOwotJmFtcDtwcmludF9odHRwX2hlYWRlcnNfbXVsdGlwYXJ0X2JlZ2luOwotJmFtcDtkaXNwbGF5aHRtbCgkYnVmZmVyKTsKLQotc3ViIG15c3RhdCB7Ci0gICAgbG9jYWwoJGZpbGUpID0gJF9bMF07Ci0gICAgbG9jYWwoJHRpbWUpOwotCi0gICAgKCR4LCAkeCwgJHgsICR4LCAkeCwgJHgsICR4LCAkeCwgJHgsICRtdGltZSkgPSBzdGF0KCRmaWxlKTsKLSAgICByZXR1cm4gJG10aW1lOwotfQotCi0kbXRpbWVMID0gJmFtcDtteXN0YXQoJFFTX2YpOwotJG10aW1lID0gJG10aW1lOwotZm9yICgkbiA9IDA7ICRuICZhbXA7bHQ7ICRRU19uOyAkbisrKSB7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgJG10aW1lID0gJmFtcDtteXN0YXQoJFFTX2YpOwotICAgICAgICBpZiAoJG10aW1lIG5lICRtdGltZUwpIHsKLSAgICAgICAgICAgICRtdGltZUwgPSAkbXRpbWU7Ci0gICAgICAgICAgICBzbGVlcCgyKTsKLSAgICAgICAgICAgICRidWZmZXIgPSAmYW1wO3JlYWRmaWxlKCRRU19mKTsKLSAgICAgICAgICAgICZhbXA7cHJpbnRfaHR0cF9oZWFkZXJzX211bHRpcGFydF9uZXh0OwotICAgICAgICAgICAgJmFtcDtkaXNwbGF5aHRtbCgkYnVmZmVyKTsKLSAgICAgICAgICAgIHNsZWVwKDUpOwotICAgICAgICAgICAgJG10aW1lTCA9ICZhbXA7bXlzdGF0KCRRU19mKTsKLSAgICAgICAgICAgIGxhc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgc2xlZXAoJFFTX3MpOwotICAgIH0KLX0KLQotJmFtcDtwcmludF9odHRwX2hlYWRlcnNfbXVsdGlwYXJ0X2VuZDsKLQotZXhpdCgwKTsKLQotIyNFT0YjIwotPC9QUkU+Ci0KLTwvREw+Ci0KLTxQPgotPEgyPk1hc3MgVmlydHVhbCBIb3N0aW5nPC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLVRoZSA8dHQ+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvdHQ+IGZlYXR1cmUgb2YgQXBhY2hlIGlzIG5pY2UgYW5kIHdvcmtzIGdyZWF0Ci13aGVuIHlvdSBqdXN0IGhhdmUgYSBmZXcgZG96ZW5zIHZpcnR1YWwgaG9zdHMuIEJ1dCB3aGVuIHlvdSBhcmUgYW4gSVNQIGFuZAotaGF2ZSBodW5kcmVkcyBvZiB2aXJ0dWFsIGhvc3RzIHRvIHByb3ZpZGUgdGhpcyBmZWF0dXJlIGlzIG5vdCB0aGUgYmVzdCBjaG9pY2UuCi0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci1UbyBwcm92aWRlIHRoaXMgZmVhdHVyZSB3ZSBtYXAgdGhlIHJlbW90ZSB3ZWJwYWdlIG9yIGV2ZW4gdGhlIGNvbXBsZXRlIHJlbW90ZQotd2ViYXJlYSB0byBvdXIgbmFtZXNwYWNlIGJ5IHRoZSB1c2Ugb2YgdGhlIDxJPlByb3h5IFRocm91Z2hwdXQ8L0k+IGZlYXR1cmUKLShmbGFnIFtQXSk6Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotIyMKLSMjICB2aG9zdC5tYXAgCi0jIyAKLXd3dy52aG9zdDEuZG9tOjgwICAvcGF0aC90by9kb2Nyb290L3Zob3N0MQotd3d3LnZob3N0Mi5kb206ODAgIC9wYXRoL3RvL2RvY3Jvb3Qvdmhvc3QyCi0gICAgIDoKLXd3dy52aG9zdE4uZG9tOjgwICAvcGF0aC90by9kb2Nyb290L3Zob3N0TgotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotIyMKLSMjICBodHRwZC5jb25mCi0jIwotICAgIDoKLSMgICB1c2UgdGhlIGNhbm9uaWNhbCBob3N0bmFtZSBvbiByZWRpcmVjdHMsIGV0Yy4KLVVzZUNhbm9uaWNhbE5hbWUgb24KLQotICAgIDoKLSMgICBhZGQgdGhlIHZpcnR1YWwgaG9zdCBpbiBmcm9udCBvZiB0aGUgQ0xGLWZvcm1hdAotQ3VzdG9tTG9nICAvcGF0aC90by9hY2Nlc3NfbG9nICAiJXtWSE9TVH1lICVoICVsICV1ICV0IFwiJXJcIiAlJmd0O3MgJWIiCi0gICAgOgotCi0jICAgZW5hYmxlIHRoZSByZXdyaXRpbmcgZW5naW5lIGluIHRoZSBtYWluIHNlcnZlcgotUmV3cml0ZUVuZ2luZSBvbgotCi0jICAgZGVmaW5lIHR3byBtYXBzOiBvbmUgZm9yIGZpeGluZyB0aGUgVVJMIGFuZCBvbmUgd2hpY2ggZGVmaW5lcwotIyAgIHRoZSBhdmFpbGFibGUgdmlydHVhbCBob3N0cyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcKLSMgICBEb2N1bWVudFJvb3QuCi1SZXdyaXRlTWFwICAgIGxvd2VyY2FzZSAgICBpbnQ6dG9sb3dlcgotUmV3cml0ZU1hcCAgICB2aG9zdCAgICAgICAgdHh0Oi9wYXRoL3RvL3Zob3N0Lm1hcAotCi0jICAgTm93IGRvIHRoZSBhY3R1YWwgdmlydHVhbCBob3N0IG1hcHBpbmcKLSMgICB2aWEgYSBodWdlIGFuZCBjb21wbGljYXRlZCBzaW5nbGUgcnVsZToKLSMKLSMgICAxLiBtYWtlIHN1cmUgd2UgZG9uJ3QgbWFwIGZvciBjb21tb24gbG9jYXRpb25zCi1SZXdyaXRlQ29uZCAgICV7UkVRVUVTVF9VUkx9ICAhXi9jb21tb251cmwxLy4qCi1SZXdyaXRlQ29uZCAgICV7UkVRVUVTVF9VUkx9ICAhXi9jb21tb251cmwyLy4qCi0gICAgOgotUmV3cml0ZUNvbmQgICAle1JFUVVFU1RfVVJMfSAgIV4vY29tbW9udXJsTi8uKgotIwotIyAgIDIuIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgSG9zdCBoZWFkZXIsIGJlY2F1c2UKLSMgICAgICBjdXJyZW50bHkgb3VyIGFwcHJvYWNoIG9ubHkgc3VwcG9ydHMgCi0jICAgICAgdmlydHVhbCBob3N0aW5nIHRocm91Z2ggdGhpcyBoZWFkZXIKLVJld3JpdGVDb25kICAgJXtIVFRQX0hPU1R9ICAhXiQKLSMKLSMgICAzLiBsb3dlcmNhc2UgdGhlIGhvc3RuYW1lCi1SZXdyaXRlQ29uZCAgICR7bG93ZXJjYXNlOiV7SFRUUF9IT1NUfXxOT05FfSAgXiguKykkCi0jCi0jICAgNC4gbG9va3VwIHRoaXMgaG9zdG5hbWUgaW4gdmhvc3QubWFwIGFuZAotIyAgICAgIHJlbWVtYmVyIGl0IG9ubHkgd2hlbiBpdCBpcyBhIHBhdGggCi0jICAgICAgKGFuZCBub3QgIk5PTkUiIGZyb20gYWJvdmUpCi1SZXdyaXRlQ29uZCAgICR7dmhvc3Q6JTF9ICBeKC8uKikkCi0jCi0jICAgNS4gZmluYWxseSB3ZSBjYW4gbWFwIHRoZSBVUkwgdG8gaXRzIGRvY3Jvb3QgbG9jYXRpb24gCi0jICAgICAgYW5kIHJlbWVtYmVyIHRoZSB2aXJ0dWFsIGhvc3QgZm9yIGxvZ2dpbmcgcHVwb3NlcwotUmV3cml0ZVJ1bGUgICBeLyguKikkICAgJTEvJDEgIFtFPVZIT1NUOiR7bG93ZXJjYXNlOiV7SFRUUF9IT1NUfX1dCi0gICAgOiAKLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08L0RMPgotCi08SDE+QWNjZXNzIFJlc3RyaWN0aW9uPC9IMT4KLQotPFA+Ci08SDI+QmxvY2tpbmcgb2YgUm9ib3RzPC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLUhvdyBjYW4gd2UgYmxvY2sgYSByZWFsbHkgYW5ub3lpbmcgcm9ib3QgZnJvbSByZXRyaWV2aW5nIHBhZ2VzIG9mIGEgc3BlY2lmaWMKLXdlYmFyZWE/IEEgPHR0Pi9yb2JvdHMudHh0PC90dD4gZmlsZSBjb250YWluaW5nIGVudHJpZXMgb2YgdGhlICJSb2JvdAotRXhjbHVzaW9uIFByb3RvY29sIiBpcyB0eXBpY2FsbHkgbm90IGVub3VnaCB0byBnZXQgcmlkIG9mIHN1Y2ggYSByb2JvdC4KLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLVdlIHVzZSBhIHJ1bGVzZXQgd2hpY2ggZm9yYmlkcyB0aGUgVVJMcyBvZiB0aGUgd2ViYXJlYQotPHR0Pi9+cXV1eC9mb28vYXJjLzwvdHQ+IChwZXJoYXBzIGEgdmVyeSBkZWVwIGRpcmVjdG9yeSBpbmRleGVkIGFyZWEgd2hlcmUgdGhlCi1yb2JvdCB0cmF2ZXJzYWwgd291bGQgY3JlYXRlIGJpZyBzZXJ2ZXIgbG9hZCkuICAgV2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB3ZQotZm9yYmlkIGFjY2VzcyBvbmx5IHRvIHRoZSBwYXJ0aWN1bGFyIHJvYm90LCBpLmUuIGp1c3QgZm9yYmlkZGluZyB0aGUgaG9zdAotd2hlcmUgdGhlIHJvYm90IHJ1bnMgaXMgbm90IGVub3VnaC4gVGhpcyB3b3VsZCBibG9jayB1c2VycyBmcm9tIHRoaXMgaG9zdCwKLXRvby4gV2UgYWNjb21wbGlzaCB0aGlzIGJ5IGFsc28gbWF0Y2hpbmcgdGhlIFVzZXItQWdlbnQgSFRUUCBoZWFkZXIKLWluZm9ybWF0aW9uLgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVDb25kICV7SFRUUF9VU0VSX0FHRU5UfSAgIF48Yj5OYW1lT2ZCYWRSb2JvdDwvYj4uKiAgICAgIAotUmV3cml0ZUNvbmQgJXtSRU1PVEVfQUREUn0gICAgICAgXjxiPjEyM1wuNDVcLjY3XC5bOC05XTwvYj4kCi1SZXdyaXRlUnVsZSBePGI+L35xdXV4L2Zvby9hcmMvPC9iPi4rICAgLSAgIFs8Yj5GPC9iPl0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08L0RMPgotCi08UD4KLTxIMj5CbG9ja2VkIElubGluZS1JbWFnZXM8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotQXNzdW1lIHdlIGhhdmUgdW5kZXIgaHR0cDovL3d3dy5xdXV4LWNvcnAuZGUvfnF1dXgvIHNvbWUgcGFnZXMgd2l0aCBpbmxpbmVkCi1HSUYgZ3JhcGhpY3MuIFRoZXNlIGdyYXBoaWNzIGFyZSBuaWNlLCBzbyBvdGhlcnMgZGlyZWN0bHkgaW5jb3Jwb3JhdGUgdGhlbSB2aWEKLWh5cGVybGlua3MgdG8gdGhlaXIgcGFnZXMuIFdlIGRvbid0IGxpa2UgdGhpcyBwcmFjdGljZSBiZWNhdXNlIGl0IGFkZHMgdXNlbGVzcwotdHJhZmZpYyB0byBvdXIgc2VydmVyLgotCi08UD4KLTxEVD48U1RST05HPlNvbHV0aW9uOjwvU1RST05HPgotPEREPgotV2hpbGUgd2UgY2Fubm90IDEwMCUgcHJvdGVjdCB0aGUgaW1hZ2VzIGZyb20gaW5jbHVzaW9uLCB3ZQotY2FuIGF0IGxlYXN0IHJlc3RyaWN0IHRoZSBjYXNlcyB3aGVyZSB0aGUgYnJvd3NlciBzZW5kcwotYSBIVFRQIFJlZmVyZXIgaGVhZGVyLgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVDb25kICV7SFRUUF9SRUZFUkVSfSA8Yj4hXiQ8L2I+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotUmV3cml0ZUNvbmQgJXtIVFRQX1JFRkVSRVJ9ICFeaHR0cDovL3d3dy5xdXV4LWNvcnAuZGUvfnF1dXgvLiokIFtOQ10KLVJld3JpdGVSdWxlIDxiPi4qXC5naWYkPC9iPiAgICAgICAgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtGXQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUNvbmQgJXtIVFRQX1JFRkVSRVJ9ICAgICAgICAgIV4kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotUmV3cml0ZUNvbmQgJXtIVFRQX1JFRkVSRVJ9ICAgICAgICAgIS4qL2Zvby13aXRoLWdpZlwuaHRtbCQKLVJld3JpdGVSdWxlIDxiPl5pbmxpbmVkLWluLWZvb1wuZ2lmJDwvYj4gICAtICAgICAgICAgICAgICAgICAgICAgICAgW0ZdCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPC9ETD4KLQotPFA+Ci08SDI+SG9zdCBEZW55PC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLUhvdyBjYW4gd2UgZm9yYmlkIGEgbGlzdCBvZiBleHRlcm5hbGx5IGNvbmZpZ3VyZWQgaG9zdHMgZnJvbSB1c2luZyBvdXIgc2VydmVyPwotCi08UD4KLTxEVD48U1RST05HPlNvbHV0aW9uOjwvU1RST05HPgotPEREPgotCi1Gb3IgQXBhY2hlICZndDs9IDEuM2I2OgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVFbmdpbmUgb24KLVJld3JpdGVNYXAgICAgaG9zdHMtZGVueSAgdHh0Oi9wYXRoL3RvL2hvc3RzLmRlbnkKLVJld3JpdGVDb25kICAgJHtob3N0cy1kZW55OiV7UkVNT1RFX0hPU1R9fE5PVC1GT1VORH0gIT1OT1QtRk9VTkQgW09SXQotUmV3cml0ZUNvbmQgICAke2hvc3RzLWRlbnk6JXtSRU1PVEVfQUREUn18Tk9ULUZPVU5EfSAhPU5PVC1GT1VORAotUmV3cml0ZVJ1bGUgICBeLy4qICAtICBbRl0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPjxQPgotCi1Gb3IgQXBhY2hlICZsdDs9IDEuM2I2OgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVFbmdpbmUgb24KLVJld3JpdGVNYXAgICAgaG9zdHMtZGVueSAgdHh0Oi9wYXRoL3RvL2hvc3RzLmRlbnkKLVJld3JpdGVSdWxlICAgXi8oLiopJCAke2hvc3RzLWRlbnk6JXtSRU1PVEVfSE9TVH18Tk9ULUZPVU5EfS8kMQotUmV3cml0ZVJ1bGUgICAhXk5PVC1GT1VORC8uKiAtIFtGXQotUmV3cml0ZVJ1bGUgICBeTk9ULUZPVU5ELyguKikkICR7aG9zdHMtZGVueTole1JFTU9URV9BRERSfXxOT1QtRk9VTkR9LyQxIAotUmV3cml0ZVJ1bGUgICAhXk5PVC1GT1VORC8uKiAtIFtGXQotUmV3cml0ZVJ1bGUgICBeTk9ULUZPVU5ELyguKikkIC8kMQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotIyMKLSMjICBob3N0cy5kZW55IAotIyMKLSMjICBBVFRFTlRJT04hIFRoaXMgaXMgYSBtYXAsIG5vdCBhIGxpc3QsIGV2ZW4gd2hlbiB3ZSB0cmVhdCBpdCBhcyBzdWNoLgotIyMgICAgICAgICAgICAgbW9kX3Jld3JpdGUgcGFyc2VzIGl0IGZvciBrZXkvdmFsdWUgcGFpcnMsIHNvIGF0IGxlYXN0IGEKLSMjICAgICAgICAgICAgIGR1bW15IHZhbHVlICItIiBtdXN0IGJlIHByZXNlbnQgZm9yIGVhY2ggZW50cnkuCi0jIwotCi0xOTMuMTAyLjE4MC40MSAtCi1ic2R0aTEuc2RtLmRlICAtCi0xOTIuNzYuMTYyLjQwICAtCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPC9ETD4KLQotPFA+Ci08SDI+UHJveHkgRGVueTwvSDI+Ci08UD4KLQotPERMPgotPERUPjxTVFJPTkc+RGVzY3JpcHRpb246PC9TVFJPTkc+Ci08REQ+Ci1Ib3cgY2FuIHdlIGZvcmJpZCBhIGNlcnRhaW4gaG9zdCBvciBldmVuIGEgdXNlciBvZiBhIHNwZWNpYWwgaG9zdCBmcm9tIHVzaW5nCi10aGUgQXBhY2hlIHByb3h5PwotCi08UD4KLTxEVD48U1RST05HPlNvbHV0aW9uOjwvU1RST05HPgotPEREPgotV2UgZmlyc3QgaGF2ZSB0byBtYWtlIHN1cmUgbW9kX3Jld3JpdGUgaXMgYmVsb3coISkgbW9kX3Byb3h5IGluIHRoZQotPHR0PkNvbmZpZ3VyYXRpb248L3R0PiBmaWxlIHdoZW4gY29tcGlsaW5nIHRoZSBBcGFjaGUgd2Vic2VydmVyLiAgVGhpcyB3YXkgaXQKLWdldHMgY2FsbGVkIF9iZWZvcmVfIG1vZF9wcm94eS4gVGhlbiB3ZSBjb25maWd1cmUgdGhlIGZvbGxvd2luZyBmb3IgYQotaG9zdC1kZXBlbmRlbmQgZGVueS4uLgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVDb25kICV7UkVNT1RFX0hPU1R9IDxiPl5iYWRob3N0XC5teWRvbWFpblwuY29tJDwvYj4gCi1SZXdyaXRlUnVsZSAhXmh0dHA6Ly9bXi8uXVwubXlkb21haW4uY29tLiogIC0gW0ZdCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPFA+Li4uYW5kIHRoaXMgb25lIGZvciBhIHVzZXJAaG9zdC1kZXBlbmRlbmQgZGVueToKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlQ29uZCAle1JFTU9URV9JREVOVH1AJXtSRU1PVEVfSE9TVH0gIDxiPl5iYWRndXlAYmFkaG9zdFwubXlkb21haW5cLmNvbSQ8L2I+Ci1SZXdyaXRlUnVsZSAhXmh0dHA6Ly9bXi8uXVwubXlkb21haW4uY29tLiogIC0gW0ZdCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPC9ETD4KLQotPFA+Ci08SDI+U3BlY2lhbCBBdXRoZW50aWNhdGlvbiBWYXJpYW50PC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLVNvbWV0aW1lcyBhIHZlcnkgc3BlY2lhbCBhdXRoZW50aWNhdGlvbiBpcyBuZWVkZWQsIGZvciBpbnN0YW5jZSBhCi1hdXRoZW50aWNhdGlvbiB3aGljaCBjaGVja3MgZm9yIGEgc2V0IG9mIGV4cGxpY2l0bHkgY29uZmlndXJlZCB1c2Vycy4gT25seQotdGhlc2Ugc2hvdWxkIHJlY2VpdmUgYWNjZXNzIGFuZCB3aXRob3V0IGV4cGxpY2l0IHByb21wdGluZyAod2hpY2ggd291bGQgb2NjdXIKLXdoZW4gdXNpbmcgdGhlIEJhc2ljIEF1dGggdmlhIG1vZF9hY2Nlc3MpLgotCi08UD4KLTxEVD48U1RST05HPlNvbHV0aW9uOjwvU1RST05HPgotPEREPgotV2UgdXNlIGEgbGlzdCBvZiByZXdyaXRlIGNvbmRpdGlvbnMgdG8gZXhjbHVkZSBhbGwgZXhjZXB0IG91ciBmcmllbmRzOgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVDb25kICV7UkVNT1RFX0lERU5UfUAle1JFTU9URV9IT1NUfSA8Yj4hXmZyaWVuZDFAY2xpZW50MS5xdXV4LWNvcnBcLmNvbSQ8L2I+IAotUmV3cml0ZUNvbmQgJXtSRU1PVEVfSURFTlR9QCV7UkVNT1RFX0hPU1R9IDxiPiFeZnJpZW5kMjwvYj5AY2xpZW50Mi5xdXV4LWNvcnBcLmNvbSQgCi1SZXdyaXRlQ29uZCAle1JFTU9URV9JREVOVH1AJXtSRU1PVEVfSE9TVH0gPGI+IV5mcmllbmQzPC9iPkBjbGllbnQzLnF1dXgtY29ycFwuY29tJCAKLVJld3JpdGVSdWxlIF4vfnF1dXgvb25seS1mb3ItZnJpZW5kcy8gICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ZdCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPC9ETD4KLQotPFA+Ci08SDI+UmVmZXJlci1iYXNlZCBEZWZsZWN0b3I8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotSG93IGNhbiB3ZSBwcm9ncmFtIGEgZmxleGlibGUgVVJMIERlZmxlY3RvciB3aGljaCBhY3RzIG9uIHRoZSAiUmVmZXJlciIgSFRUUAotaGVhZGVyIGFuZCBjYW4gYmUgY29uZmlndXJlZCB3aXRoIGFzIG1hbnkgcmVmZXJyaW5nIHBhZ2VzIGFzIHdlIGxpa2U/Ci0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci1Vc2UgdGhlIGZvbGxvd2luZyByZWFsbHkgdHJpY2t5IHJ1bGVzZXQuLi4KLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlTWFwICBkZWZsZWN0b3IgdHh0Oi9wYXRoL3RvL2RlZmxlY3Rvci5tYXAKLQotUmV3cml0ZUNvbmQgJXtIVFRQX1JFRkVSRVJ9ICE9IiIKLVJld3JpdGVDb25kICR7ZGVmbGVjdG9yOiV7SFRUUF9SRUZFUkVSfX0gXi0kCi1SZXdyaXRlUnVsZSBeLiogJXtIVFRQX1JFRkVSRVJ9IFtSLExdCi0KLVJld3JpdGVDb25kICV7SFRUUF9SRUZFUkVSfSAhPSIiCi1SZXdyaXRlQ29uZCAke2RlZmxlY3Rvcjole0hUVFBfUkVGRVJFUn18Tk9ULUZPVU5EfSAhPU5PVC1GT1VORAotUmV3cml0ZVJ1bGUgXi4qICR7ZGVmbGVjdG9yOiV7SFRUUF9SRUZFUkVSfX0gW1IsTF0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08UD4uLi4KLWluIGNvbmp1bmN0aW9uIHdpdGggYSBjb3JyZXNwb25kaW5nIHJld3JpdGUgbWFwOgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLSMjCi0jIyAgZGVmbGVjdG9yLm1hcAotIyMKLQotaHR0cDovL3d3dy5iYWRndXlzLmNvbS9iYWQvaW5kZXguaHRtbCAgICAtCi1odHRwOi8vd3d3LmJhZGd1eXMuY29tL2JhZC9pbmRleDIuaHRtbCAgIC0KLWh0dHA6Ly93d3cuYmFkZ3V5cy5jb20vYmFkL2luZGV4My5odG1sICAgaHR0cDovL3NvbWV3aGVyZS5jb20vCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPFA+Ci1UaGlzIGF1dG9tYXRpY2FsbHkgcmVkaXJlY3RzIHRoZSByZXF1ZXN0IGJhY2sgdG8gdGhlIHJlZmVycmluZyBwYWdlICh3aGVuICItIgotaXMgdXNlZCBhcyB0aGUgdmFsdWUgaW4gdGhlIG1hcCkgb3IgdG8gYSBzcGVjaWZpYyBVUkwgKHdoZW4gYW4gVVJMIGlzCi1zcGVjaWZpZWQgaW4gdGhlIG1hcCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50KS4KLQotPC9ETD4KLQotPEgxPk90aGVyPC9IMT4KLQotPFA+Ci08SDI+RXh0ZXJuYWwgUmV3cml0aW5nIEVuZ2luZTwvSDI+Ci08UD4KLQotPERMPgotPERUPjxTVFJPTkc+RGVzY3JpcHRpb246PC9TVFJPTkc+Ci08REQ+Ci1BIEZBUTogSG93IGNhbiB3ZSBzb2x2ZSB0aGUgRk9PL0JBUi9RVVVYL2V0Yy4gcHJvYmxlbT8gVGhlcmUgc2VlbXMgbm8gc29sdXRpb24KLWJ5IHRoZSB1c2Ugb2YgbW9kX3Jld3JpdGUuLi4KLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLVVzZSBhbiBleHRlcm5hbCByZXdyaXRlIG1hcCwgaS5lLiBhIHByb2dyYW0gd2hpY2ggYWN0cyBsaWtlIGEgcmV3cml0ZSBtYXAuICBJdAotaXMgcnVuIG9uY2Ugb24gc3RhcnR1cCBvZiBBcGFjaGUgcmVjZWl2ZXMgdGhlIHJlcXVlc3RlZCBVUkxzIG9uIFNURElOIGFuZCBoYXMKLXRvIHB1dCB0aGUgcmVzdWx0aW5nICh1c3VhbGx5IHJld3JpdHRlbikgVVJMIG9uIFNURE9VVCAoc2FtZSBvcmRlciEpLgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVFbmdpbmUgb24KLVJld3JpdGVNYXAgICAgcXV1eC1tYXAgICAgICAgPGI+cHJnOjwvYj4vcGF0aC90by9tYXAucXV1eC5wbAotUmV3cml0ZVJ1bGUgICBeL35xdXV4LyguKikkICAvfnF1dXgvPGI+JHtxdXV4LW1hcDokMX08L2I+Ci08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci0jIS9wYXRoL3RvL3BlcmwKLQotIyAgIGRpc2FibGUgYnVmZmVyZWQgSS9PIHdoaWNoIHdvdWxkIGxlYWQgCi0jICAgdG8gZGVhZGxvb3BzIGZvciB0aGUgQXBhY2hlIHNlcnZlcgotJHwgPSAxOwotCi0jICAgcmVhZCBVUkxzIG9uZSBwZXIgbGluZSBmcm9tIHN0ZGluIGFuZAotIyAgIGdlbmVyYXRlIHN1YnN0aXR1dGlvbiBVUkwgb24gc3Rkb3V0Ci13aGlsZSAoJmx0OyZndDspIHsKLSAgICBzfF5mb28vfGJhci98OwotICAgIHByaW50ICRfOwotfQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTxQPgotVGhpcyBpcyBhIGRlbW9uc3RyYXRpb24tb25seSBleGFtcGxlIGFuZCBqdXN0IHJld3JpdGVzIGFsbCBVUkxzCi08dHQ+L35xdXV4L2Zvby8uLi48L3R0PiB0byA8dHQ+L35xdXV4L2Jhci8uLi48L3R0Pi4gQWN0dWFsbHkgeW91IGNhbiBwcm9ncmFtCi13aGF0ZXZlciB5b3UgbGlrZS4gQnV0IG5vdGljZSB0aGF0IHdoaWxlIHN1Y2ggbWFwcyBjYW4gYmUgPGI+dXNlZDwvYj4gYWxzbyBieQotYW4gYXZlcmFnZSB1c2VyLCBvbmx5IHRoZSBzeXN0ZW0gYWRtaW5pc3RyYXRvciBjYW4gPGI+ZGVmaW5lPC9iPiBpdC4KLQotPC9ETD4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQkxPQ0tRVU9URT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21pc2Mvc2VjdXJpdHlfdGlwcy5odG1sIGIvZG9jcy9tYW51YWwvbWlzYy9zZWN1cml0eV90aXBzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MDVkOGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbWlzYy9zZWN1cml0eV90aXBzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDIuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgSFRUUCBTZXJ2ZXIgRG9jdW1lbnRhdGlvbjwvVElUTEU+Ci08L0hFQUQ+Ci0KLTxCT0RZPgotPElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfc3ViLmdpZiIgQUxUPSIiPgotPEgxPlNlY3VyaXR5IHRpcHMgZm9yIHNlcnZlciBjb25maWd1cmF0aW9uPC9IMT4KLQotPGhyPgotCi08UD5Tb21lIGhpbnRzIGFuZCB0aXBzIG9uIHNlY3VyaXR5IGlzc3VlcyBpbiBzZXR0aW5nIHVwIGEgd2ViIHNlcnZlci4gU29tZSBvZgotdGhlIHN1Z2dlc3Rpb25zIHdpbGwgYmUgZ2VuZXJhbCwgb3RoZXIsIHNwZWNpZmljIHRvIEFwYWNoZQotCi08SFI+Ci0KLTxIMj5TZXJ2ZXIgU2lkZSBJbmNsdWRlczwvSDI+Ci08UD5TZXJ2ZXIgc2lkZSBpbmNsdWRlcyAoU1NJKSBjYW4gYmUgY29uZmlndXJlZCBzbyB0aGF0IHVzZXJzIGNhbiBleGVjdXRlCi1hcmJpdHJhcnkgcHJvZ3JhbXMgb24gdGhlIHNlcnZlci4gVGhhdCB0aG91Z2h0IGFsb25lIHNob3VsZCBzZW5kIGEgc2hpdmVyCi1kb3duIHRoZSBzcGluZSBvZiBhbnkgc3lzLWFkbWluLjxwPgotCi1PbmUgc29sdXRpb24gaXMgdG8gZGlzYWJsZSB0aGF0IHBhcnQgb2YgU1NJLiBUbyBkbyB0aGF0IHlvdSB1c2UgdGhlCi1JbmNsdWRlc05PRVhFQyBvcHRpb24gdG8gdGhlIDxBIEhSRUY9ImNvcmUuaHRtbCNvcHRpb25zIj5PcHRpb25zPC9BPgotZGlyZWN0aXZlLjxwPgotCi08SFI+Ci0KLTxIMj5Ob24gU2NyaXB0IEFsaWFzZWQgQ0dJPC9IMj4KLTxQPkFsbG93aW5nIHVzZXJzIHRvIGV4ZWN1dGUgPEI+Q0dJPC9CPiBzY3JpcHRzIGluIGFueSBkaXJlY3Rvcnkgc2hvdWxkIG9ubHkKLWJlIGNvbnNpZGVyZWQgaWY7Ci08T0w+Ci0gPExJPllvdSB0cnVzdCB5b3VyIHVzZXJzIG5vdCB0byB3cml0ZSBzY3JpcHRzIHdoaWNoIHdpbGwgZGVsaWJlcmF0ZWx5IG9yCi1hY2NpZGVudGFsbHkgZXhwb3NlIHlvdXIgc3lzdGVtIHRvIGFuIGF0dGFjay4KLSA8TEk+WW91IGNvbnNpZGVyIHNlY3VyaXR5IGF0IHlvdXIgc2l0ZSB0byBiZSBzbyBmZWVibGUgaW4gb3RoZXIgYXJlYXMsIGFzIHRvCi1tYWtlIG9uZSBtb3JlIHBvdGVudGlhbCBob2xlIGlycmVsZXZhbnQuCi0gPExJPllvdSBoYXZlIG5vIHVzZXJzLCBhbmQgbm9ib2R5IGV2ZXIgdmlzaXRzIHlvdXIgc2VydmVyLgotPC9PTD48cD4KLTxIUj4KLQotPEgyPlNjcmlwdCBBbGlhcydlZCBDR0k8L0gyPgotPFA+TGltaXRpbmcgPEI+Q0dJPC9CPiB0byBzcGVjaWFsIGRpcmVjdG9yaWVzIGdpdmVzIHRoZSBhZG1pbiBjb250cm9sIG92ZXIKLXdoYXQgZ29lcyBpbnRvIHRob3NlIGRpcmVjdG9yaWVzLiBUaGlzIGlzIGluZXZpdGFibHkgbW9yZSBzZWN1cmUgdGhhbgotbm9uIHNjcmlwdCBhbGlhc2VkIENHSSwgYnV0IDxzdHJvbmc+b25seSBpZiB1c2VycyB3aXRoIHdyaXRlIGFjY2VzcyB0byB0aGUKLWRpcmVjdG9yaWVzIGFyZSB0cnVzdGVkPC9zdHJvbmc+IG9yIHRoZSBhZG1pbiBpcyB3aWxsaW5nIHRvIHRlc3QgZWFjaCBuZXcgQ0dJCi1zY3JpcHQvcHJvZ3JhbSBmb3IgcG90ZW50aWFsIHNlY3VyaXR5IGhvbGVzLjxQPgotCi1Nb3N0IHNpdGVzIGNob29zZSB0aGlzIG9wdGlvbiBvdmVyIHRoZSBub24gc2NyaXB0IGFsaWFzZWQgQ0dJIGFwcHJvYWNoLjxwPgotCi08SFI+Ci08SDI+Q0dJIGluIGdlbmVyYWw8L0gyPgotPFA+QWx3YXlzIHJlbWVtYmVyIHRoYXQgeW91IG11c3QgdHJ1c3QgdGhlIHdyaXRlcnMgb2YgdGhlIENHSSBzY3JpcHQvcHJvZ3JhbXMKLW9yIHlvdXIgYWJpbGl0eSB0byBzcG90IHBvdGVudGlhbCBzZWN1cml0eSBob2xlcyBpbiBDR0ksIHdoZXRoZXIgdGhleSB3ZXJlCi1kZWxpYmVyYXRlIG9yIGFjY2lkZW50YWwuPHA+Ci0KLUFsbCB0aGUgQ0dJIHNjcmlwdHMgd2lsbCBydW4gYXMgdGhlIHNhbWUgdXNlciwgc28gdGhleSBoYXZlIHBvdGVudGlhbCB0bwotY29uZmxpY3QgKGFjY2lkZW50YWxseSBvciBkZWxpYmVyYXRlbHkpIHdpdGggb3RoZXIgc2NyaXB0cyBlLmcuIFVzZXIgQSBoYXRlcwotVXNlciBCLCBzbyBoZSB3cml0ZXMgYSBzY3JpcHQgdG8gdHJhc2ggVXNlciBCJ3MgQ0dJIGRhdGFiYXNlLjxQPgotCi08SFI+Ci0KLVBsZWFzZSBzZW5kIGFueSBvdGhlciB1c2VmdWwgc2VjdXJpdHkgdGlwcyB0bwotPEEgSFJFRj0ibWFpbHRvOmFwYWNoZS1idWdzQG1haWwuYXBhY2hlLm9yZyI+YXBhY2hlLWJ1Z3NAbWFpbC5hcGFjaGUub3JnPC9BPgotPHA+Ci08SFI+Ci0KLTxIMj5TdG9wcGluZyB1c2VycyBvdmVycmlkaW5nIHN5c3RlbSB3aWRlIHNldHRpbmdzLi4uPC9IMj4KLTxQPlRvIHJ1biBhIHJlYWxseSB0aWdodCBzaGlwLCB5b3UnbGwgd2FudCB0byBzdG9wIHVzZXJzIGZyb20gc2V0dGluZwotdXAgPENPREU+Lmh0YWNjZXNzPC9DT0RFPiBmaWxlcyB3aGljaCBjYW4gb3ZlcnJpZGUgc2VjdXJpdHkgZmVhdHVyZXMKLXlvdSd2ZSBjb25maWd1cmVkLiBIZXJlJ3Mgb25lIHdheSB0byBkbyBpdC4uLjxwPgotCi1JbiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gZmlsZSwgcHV0Ci08YmxvY2txdW90ZT48Y29kZT4KLSZsdDtEaXJlY3RvcnkmZ3Q7IDxicj4KLUFsbG93T3ZlcnJpZGUgTm9uZSA8YnI+Ci1PcHRpb25zIE5vbmUgPGJyPgotJmx0O0xpbWl0IEdFVCBQVVQgUE9TVCZndDsgPGJyPgotYWxsb3cgZnJvbSBhbGwgPGJyPgotJmx0Oy9MaW1pdCZndDsgPGJyPgotJmx0Oy9EaXJlY3RvcnkmZ3Q7IDxicj4KLTwvY29kZT48L2Jsb2NrcXVvdGU+Ci0KLVRoZW4gc2V0dXAgZm9yIHNwZWNpZmljIGRpcmVjdG9yaWVzPFA+Ci0KLVRoaXMgc3RvcHMgYWxsIG92ZXJyaWRlcywgSW5jbHVkZXMgYW5kIGFjY2Vzc2VzIGluIGFsbCBkaXJlY3RvcmllcyBhcGFydAotZnJvbSB0aG9zZSBuYW1lZC48cD48aHI+Ci0KLTxBIEhSRUY9Ii4uLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfaG9tZS5naWYiIEFMVD0iSG9tZSI+PC9BPgotPEEgSFJFRj0iLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2luZGV4LmdpZiIgQUxUPSJJbmRleCI+PC9BPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvYWxsbW9kdWxlcy54bWwgYi9kb2NzL21hbnVhbC9tb2QvYWxsbW9kdWxlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZjU1N2QuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL2FsbG1vZHVsZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPG1vZHVsZWxpc3Q+Ci08bW9kdWxlZmlsZT5jb3JlLnhtbDwvbW9kdWxlZmlsZT4KLTxtb2R1bGVmaWxlPm1vZF9hY2Nlc3MueG1sPC9tb2R1bGVmaWxlPgotPG1vZHVsZWZpbGU+bW9kX2FjdGlvbnMueG1sPC9tb2R1bGVmaWxlPgotPG1vZHVsZWZpbGU+bW9kX2FsaWFzLnhtbDwvbW9kdWxlZmlsZT4KLTxtb2R1bGVmaWxlPm1vZF9hc2lzLnhtbDwvbW9kdWxlZmlsZT4KLTxtb2R1bGVmaWxlPm1vZF9hdXRoLnhtbDwvbW9kdWxlZmlsZT4KLTxtb2R1bGVmaWxlPm1vZF9hdXRoX2Fub24ueG1sPC9tb2R1bGVmaWxlPgotPG1vZHVsZWZpbGU+bW9kX2F1dGhfZGJtLnhtbDwvbW9kdWxlZmlsZT4KLTxtb2R1bGVmaWxlPm1vZF9hdXRoX2RpZ2VzdC54bWw8L21vZHVsZWZpbGU+Ci08bW9kdWxlZmlsZT5tb2RfYXV0b2luZGV4LnhtbDwvbW9kdWxlZmlsZT4KLTxtb2R1bGVmaWxlPm1vZF9jZXJuX21ldGEueG1sPC9tb2R1bGVmaWxlPgotPG1vZHVsZWZpbGU+bW9kX2NnaS54bWw8L21vZHVsZWZpbGU+Ci08bW9kdWxlZmlsZT5tb2RfY2dpZC54bWw8L21vZHVsZWZpbGU+Ci08bW9kdWxlZmlsZT5tb2RfY2hhcnNldF9saXRlLnhtbDwvbW9kdWxlZmlsZT4KLTxtb2R1bGVmaWxlPm1vZF9kYXYueG1sPC9tb2R1bGVmaWxlPgotPG1vZHVsZWZpbGU+bW9kX2RlZmxhdGUueG1sPC9tb2R1bGVmaWxlPgotPG1vZHVsZWZpbGU+bW9kX2Rpci54bWw8L21vZHVsZWZpbGU+Ci08bW9kdWxlZmlsZT5tb2RfZW52LnhtbDwvbW9kdWxlZmlsZT4KLTxtb2R1bGVmaWxlPm1vZF9leGFtcGxlLnhtbDwvbW9kdWxlZmlsZT4KLTxtb2R1bGVmaWxlPm1vZF9leHRfZmlsdGVyLnhtbDwvbW9kdWxlZmlsZT4KLTxtb2R1bGVmaWxlPm1vZF9maWxlX2NhY2hlLnhtbDwvbW9kdWxlZmlsZT4KLTxtb2R1bGVmaWxlPm1vZF9oZWFkZXJzLnhtbDwvbW9kdWxlZmlsZT4KLTxtb2R1bGVmaWxlPm1vZF9pbWFwLnhtbDwvbW9kdWxlZmlsZT4KLTxtb2R1bGVmaWxlPm1vZF9pbmNsdWRlLnhtbDwvbW9kdWxlZmlsZT4KLTxtb2R1bGVmaWxlPm1vZF9pbmZvLnhtbDwvbW9kdWxlZmlsZT4KLTxtb2R1bGVmaWxlPm1vZF9pc2FwaS54bWw8L21vZHVsZWZpbGU+Ci08bW9kdWxlZmlsZT5tb2RfbG9nX2NvbmZpZy54bWw8L21vZHVsZWZpbGU+Ci08bW9kdWxlZmlsZT5tb2RfbWltZS54bWw8L21vZHVsZWZpbGU+Ci08bW9kdWxlZmlsZT5tb2RfbWltZV9tYWdpYy54bWw8L21vZHVsZWZpbGU+Ci08bW9kdWxlZmlsZT5tb2RfbmVnb3RpYXRpb24ueG1sPC9tb2R1bGVmaWxlPgotPG1vZHVsZWZpbGU+bW9kX3Byb3h5LnhtbDwvbW9kdWxlZmlsZT4KLTxtb2R1bGVmaWxlPm1vZF9yZXdyaXRlLnhtbDwvbW9kdWxlZmlsZT4KLTxtb2R1bGVmaWxlPm1vZF9zZXRlbnZpZi54bWw8L21vZHVsZWZpbGU+Ci08bW9kdWxlZmlsZT5tb2Rfc28ueG1sPC9tb2R1bGVmaWxlPgotPG1vZHVsZWZpbGU+bW9kX3NwZWxpbmcueG1sPC9tb2R1bGVmaWxlPgotPG1vZHVsZWZpbGU+bW9kX3N0YXR1cy54bWw8L21vZHVsZWZpbGU+Ci08bW9kdWxlZmlsZT5tb2Rfc3VleGVjLnhtbDwvbW9kdWxlZmlsZT4KLTxtb2R1bGVmaWxlPm1vZF91bmlxdWVfaWQueG1sPC9tb2R1bGVmaWxlPgotPG1vZHVsZWZpbGU+bW9kX3VzZXJkaXIueG1sPC9tb2R1bGVmaWxlPgotPG1vZHVsZWZpbGU+bW9kX3VzZXJ0cmFjay54bWw8L21vZHVsZWZpbGU+Ci08bW9kdWxlZmlsZT5tb2Rfdmhvc3RfYWxpYXMueG1sPC9tb2R1bGVmaWxlPgotPG1vZHVsZWZpbGU+bXBtX2NvbW1vbi54bWw8L21vZHVsZWZpbGU+Ci08bW9kdWxlZmlsZT5tcG1fd2lubnQueG1sPC9tb2R1bGVmaWxlPgotPG1vZHVsZWZpbGU+cHJlZm9yay54bWw8L21vZHVsZWZpbGU+Ci08L21vZHVsZWxpc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL2NvcmUuaHRtbCBiL2RvY3MvbWFudWFsL21vZC9jb3JlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MjI1ZDcuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL2NvcmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk0NiArMCwwIEBACi08IS0tJWh5cGVydGV4dCAtLT4KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgMi4wLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFwYWNoZSBDb3JlIEZlYXR1cmVzPC9USVRMRT4KLTwvSEVBRD4KLQotPEJPRFk+Ci08SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9zdWIuZ2lmIiBBTFQ9IiI+Ci08IS0tLyVoeXBlcnRleHQgLS0+Ci08SDE+QXBhY2hlIENvcmUgRmVhdHVyZXM8L2gxPgotCi1UaGVzZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgY29udHJvbCB0aGUgY29yZSBBcGFjaGUgZmVhdHVyZXMsIGFuZCBhcmUKLWFsd2F5cyBhdmFpbGFibGUuCi0KLTwhLS0laHlwZXJ0ZXh0IC0tPgotPHVsPgotPGxpPjxBIEhSRUY9IiNhY2Nlc3Njb25maWciPkFjY2Vzc0NvbmZpZzwvQT4KLTxsaT48QSBIUkVGPSIjYWNjZXNzZmlsZW5hbWUiPkFjY2Vzc0ZpbGVOYW1lPC9BPgotPGxpPjxBIEhSRUY9IiNhbGxvd292ZXJyaWRlIj5BbGxvd092ZXJyaWRlPC9BPgotPGxpPjxBIEhSRUY9IiNhdXRobmFtZSI+QXV0aE5hbWU8L0E+Ci08bGk+PEEgSFJFRj0iI2F1dGh0eXBlIj5BdXRoVHlwZTwvQT4KLTxsaT48QSBIUkVGPSIjYmluZGFkZHJlc3MiPkJpbmRBZHJlc3M8L0E+Ci08bGk+PEEgSFJFRj0iI2RlZmF1bHR0eXBlIj5EZWZhdWx0VHlwZTwvQT4KLTxsaT48QSBIUkVGPSIjZGlyZWN0b3J5Ij4mbHQ7RGlyZWN0b3J5Jmd0OzwvQT4KLTxsaT48QSBIUkVGPSIjZG9jdW1lbnRyb290Ij5Eb2N1bWVudFJvb3Q8L0E+Ci08bGk+PEEgSFJFRj0iI2Vycm9yZG9jdW1lbnQiPkVycm9yRG9jdW1lbnQ8L0E+Ci08bGk+PEEgSFJFRj0iI2Vycm9ybG9nIj5FcnJvckxvZzwvQT4KLTxsaT48QSBIUkVGPSIjZ3JvdXAiPkdyb3VwPC9BPgotPGxpPjxBIEhSRUY9IiNpZGVudGl0eWNoZWNrIj5JZGVudGl0eUNoZWNrPC9BPgotPGxpPjxBIEhSRUY9IiNrZWVwYWxpdmUiPktlZXBBbGl2ZTwvQT4KLTxsaT48QSBIUkVGPSIja2VlcGFsaXZldGltZW91dCI+S2VlcEFsaXZlVGltZW91dDwvQT4KLTxsaT48QSBIUkVGPSIjbGltaXQiPiZsdDtMaW1pdCZndDs8L0E+Ci08bGk+PEEgSFJFRj0iI2xpc3RlbiI+TGlzdGVuOzwvQT4KLTxsaT48QSBIUkVGPSIjbG9jYXRpb24iPiZsdDtMb2NhdGlvbiZndDs8L0E+Ci08bGk+PEEgSFJFRj0iI21heGNsaWVudHMiPk1heENsaWVudHM8L0E+Ci08bGk+PEEgSFJFRj0iI21heHJlcXVlc3RzcGVyY2hpbGQiPk1heFJlcXVlc3RzUGVyQ2hpbGQ8L0E+Ci08bGk+PEEgSFJFRj0iI21heHNwYXJlc2VydmVycyI+TWF4U3BhcmVTZXJ2ZXJzPC9BPgotPGxpPjxBIEhSRUY9IiNtaW5zcGFyZXNlcnZlcnMiPk1pblNwYXJlU2VydmVyczwvQT4KLTxsaT48QSBIUkVGPSIjb3B0aW9ucyI+T3B0aW9uczwvQT4KLTxsaT48QSBIUkVGPSIjcGlkZmlsZSI+UGlkRmlsZTwvQT4KLTxsaT48QSBIUkVGPSIjcG9ydCI+UG9ydDwvQT4KLTxsaT48QSBIUkVGPSIjcmVxdWlyZSI+cmVxdWlyZTwvQT4KLTxsaT48QSBIUkVGPSIjcmVzb3VyY2Vjb25maWciPlJlc291cmNlQ29uZmlnPC9BPgotPGxpPjxBIEhSRUY9IiNzZXJ2ZXJhZG1pbiI+U2VydmVyQWRtaW48L0E+Ci08bGk+PEEgSFJFRj0iI3NlcnZlcmFsaWFzIj5TZXJ2ZXJBbGlhczwvQT4KLTxsaT48QSBIUkVGPSIjc2VydmVybmFtZSI+U2VydmVyTmFtZTwvQT4KLTxsaT48QSBIUkVGPSIjc2VydmVycGF0aCI+U2VydmVyUGF0aDwvQT4KLTxsaT48QSBIUkVGPSIjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvQT4KLTxsaT48QSBIUkVGPSIjc2VydmVydHlwZSI+U2VydmVyVHlwZTwvQT4KLTxsaT48QSBIUkVGPSIjc3RhcnRzZXJ2ZXJzIj5TdGFydFNlcnZlcnM8L0E+Ci08bGk+PEEgSFJFRj0iI3RpbWVvdXQiPlRpbWVPdXQ8L0E+Ci08bGk+PEEgSFJFRj0iI3VzZXIiPlVzZXI8L0E+Ci08bGk+PEEgSFJFRj0iI3ZpcnR1YWxob3N0Ij4mbHQ7VmlydHVhbEhvc3QmZ3Q7PC9BPgotPC91bD4KLTxocj4KLTwhLS0vJWh5cGVydGV4dCAtLT4KLQotPEEgbmFtZT0iYWNjZXNzY29uZmlnIj48aDI+QWNjZXNzQ29uZmlnIGRpcmVjdGl2ZTwvaDI+PC9BPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEFjY2Vzc0NvbmZpZ30gZGlyZWN0aXZlJmd0OyAtLT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBBY2Nlc3NDb25maWcgPGVtPmZpbGVuYW1lPC9lbT48YnI+Ci08c3Ryb25nPkRlZmF1bHQ6PC9zdHJvbmc+IDxjb2RlPkFjY2Vzc0NvbmZpZyBjb25mL2FjY2Vzcy5jb25mPC9jb2RlPjxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IGNvcmU8cD4KLQotVGhlIHNlcnZlciB3aWxsIHJlYWQgdGhpcyBmaWxlIGZvciBtb3JlIGRpcmVjdGl2ZXMgYWZ0ZXIgcmVhZGluZyB0aGUKLTxBIEhSRUY9IiNyZXNvdXJjZWNvbmZpZyI+UmVzb3VyY2VDb25maWc8L0E+IGZpbGUuIDxlbT5GaWxlbmFtZTwvZW0+IGlzCi1yZWxhdGl2ZSB0byB0aGUgPEEgSFJFRj0iI3NlcnZlcnJvb3QiPlNlcnZlclJvb3Q8L0E+LgotVGhpcyBmZWF0dXJlIGNhbiBiZSBkaXNhYmxlZCB1c2luZzoKLTxibG9ja3F1b3RlPjxjb2RlPkFjY2Vzc0NvbmZpZyAvZGV2L251bGw8L2NvZGU+PC9ibG9ja3F1b3RlPgotSGlzdG9yaWNhbGx5LCB0aGlzIGZpbGUgb25seSBjb250YWluZWQKLTxBIEhSRUY9IiNkaXJlY3RvcnkiPiZsdDtEaXJlY3RvcnkmZ3Q7PC9BPiBzZWN0aW9uczsgaW4gZmFjdCBpdCBjYW4gbm93Ci1jb250YWluIGFueSBzZXJ2ZXIgZGlyZWN0aXZlIGFsbG93ZWQgaW4gdGhlIDxlbT5zZXJ2ZXIgY29uZmlnPC9lbT4gY29udGV4dC4KLTxwPjxocj4KLQotPEEgbmFtZT0iYWNjZXNzZmlsZW5hbWUiPjxoMj5BY2Nlc3NGaWxlTmFtZSBkaXJlY3RpdmU8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBBY2Nlc3NGaWxlTmFtZX0gZGlyZWN0aXZlJmd0OyAtLT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBBY2Nlc3NGaWxlTmFtZSA8ZW0+ZmlsZW5hbWU8L2VtPjxicj4KLTxzdHJvbmc+RGVmYXVsdDo8L3N0cm9uZz4gPGNvZGU+QWNjZXNzRmlsZU5hbWUgLmh0YWNjZXNzPC9jb2RlPjxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IGNvcmU8cD4KLQotV2hlbiByZXR1cm5pbmcgYSBkb2N1bWVudCB0byB0aGUgY2xpZW50IHRoZSBzZXJ2ZXIgbG9va3MgZm9yIGFuCi1hY2Nlc3MgY29udHJvbCBmaWxlIHdpdGggdGhpcyBuYW1lIGluIGV2ZXJ5IGRpcmVjdG9yeSBvZiB0aGUgcGF0aCB0bwotdGhlIGRvY3VtZW50LCBpZiBhY2Nlc3MgY29udHJvbCBmaWxlcyBhcmUgZW5hYmxlZCBmb3IgdGhhdCBkaXJlY3RvcnkuCi0KLUZvciBleGFtcGxlOgotPGJsb2NrcXVvdGU+PGNvZGU+QWNjZXNzRmlsZU5hbWUgLmFjbDwvY29kZT48L2Jsb2NrcXVvdGU+Ci1iZWZvcmUgcmV0dXJuaW5nIHRoZSBkb2N1bWVudCAvdXNyL2xvY2FsL3dlYi9pbmRleC5odG1sLCB0aGUKLXNlcnZlciB3aWxsIHJlYWQgLy5hY2wsIC91c3IvLmFjbCwgL3Vzci9sb2NhbC8uYWNsIGFuZCAvdXNyL2xvY2FsL3dlYi8uYWNsCi1mb3IgZGlyZWN0aXZlcywgdW5sZXNzIHRoZXkgaGF2ZSBiZWVuIGRpc2FibGVkIHdpdGgKLTxibG9ja3F1b3RlPjxjb2RlPgotJmx0O0RpcmVjdG9yeSAvJmd0Ozxicj4KLUFsbG93T3ZlcnJpZGUgTm9uZTxicj4KLSZsdDsvRGlyZWN0b3J5Jmd0OzwvY29kZT48L2Jsb2NrcXVvdGU+PHA+PGhyPgotCi08QSBuYW1lPSJhbGxvd292ZXJyaWRlIj48aDI+QWxsb3dPdmVycmlkZSBkaXJlY3RpdmU8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBBbGxvd092ZXJyaWRlfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IEFsbG93T3ZlcnJpZGUgPGVtPm92ZXJyaWRlIG92ZXJyaWRlIC4uLjwvZW0+PGJyPgotPHN0cm9uZz5EZWZhdWx0Ojwvc3Ryb25nPiA8Y29kZT5BbGxvd092ZXJyaWRlIEFsbDwvY29kZT48YnI+Ci08c3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IGRpcmVjdG9yeTxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBjb3JlPHA+Ci0KLVdoZW4gdGhlIHNlcnZlciBmaW5kcyBhbiAuaHRhY2Nlc3MgZmlsZSAoYXMgc3BlY2lmaWVkIGJ5Ci08QSBIUkVGPSIjYWNjZXNzZmlsZW5hbWUiPkFjY2Vzc0ZpbGVOYW1lPC9BPikgaXQgbmVlZHMgdG8ga25vdyB3aGljaAotZGlyZWN0aXZlcyBkZWNsYXJlZCBpbiB0aGF0IGZpbGUgY2FuIG92ZXJyaWRlIGVhcmxpZXIgYWNjZXNzIGluZm9ybWF0aW9uLjxwPgotCi08ZW0+T3ZlcnJpZGU8L2VtPiBjYW4gYmUgc2V0IHRvIDxjb2RlPk5vbmU8L2NvZGU+LCBpbiB3aGljaCBjYXNlIHRoZSBzZXJ2ZXIKLXdpbGwgbm90IHJlYWQgdGhlIGZpbGUsIDxjb2RlPkFsbDwvY29kZT4gaW4gd2hpY2ggY2FzZSB0aGUgc2VydmVyIHdpbGwKLWFsbG93IGFsbCB0aGUgZGlyZWN0aXZlcywgb3Igb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZzoKLTxkbD4KLTxkdD5BdXRoQ29uZmlnCi08ZGQ+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgQXV0aENvbmZpZ30gb3ZlcnJpZGUmZ3Q7IC0tPgotQWxsb3cgdXNlIG9mIHRoZSBhdXRob3JpemF0aW9uIGRpcmVjdGl2ZXMKLSg8QSBIUkVGPSJtb2RfYXV0aF9kYm0uaHRtbCNhdXRoZGJtZ3JvdXBmaWxlIj5BdXRoREJNR3JvdXBGaWxlPC9BPiwKLTxBIEhSRUY9Im1vZF9hdXRoX2RibS5odG1sI2F1dGhkYm11c2VyZmlsZSI+QXV0aERCTVVzZXJGaWxlPC9BPiwKLTxBIEhSRUY9Im1vZF9hdXRoLmh0bWwjYXV0aGdyb3VwZmlsZSI+QXV0aEdyb3VwRmlsZTwvQT4sCi08QSBIUkVGPSIjYXV0aG5hbWUiPkF1dGhOYW1lPC9BPiwgPEEgSFJFRj0iI2F1dGh0eXBlIj5BdXRoVHlwZTwvQT4sCi08QSBIUkVGPSJtb2RfYXV0aC5odG1sI2F1dGh1c2VyZmlsZSI+QXV0aFVzZXJGaWxlPC9BPiBhbmQKLTxBIEhSRUY9IiNyZXF1aXJlIj5yZXF1aXJlPC9BPikuCi08ZHQ+RmlsZUluZm8KLTxkZD4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBGaWxlSW5mb30gb3ZlcnJpZGUmZ3Q7IC0tPgotQWxsb3cgdXNlIG9mIHRoZSBkaXJlY3RpdmVzIGNvbnRyb2xsaW5nIGRvY3VtZW50IHR5cGVzCi0oPEEgSFJFRj0ibW9kX21pbWUuaHRtbCNhZGRlbmNvZGluZyI+QWRkRW5jb2Rpbmc8L0E+LAotPEEgSFJFRj0ibW9kX21pbWUuaHRtbCNhZGRsYW5ndWFnZSI+QWRkTGFuZ3VhZ2U8L0E+LAotPEEgSFJFRj0ibW9kX21pbWUuaHRtbCNhZGR0eXBlIj5BZGRUeXBlPC9BPiwKLTxBIEhSRUY9IiNkZWZhdWx0dHlwZSI+RGVmYXVsdFR5cGU8L0E+IGFuZAotPEEgSFJFRj0ibW9kX25lZ290aWF0aW9uLmh0bWwjbGFuZ3VhZ2Vwcmlvcml0eSI+TGFuZ3VhZ2VQcmlvcml0eTwvQT4pLgotPGR0PkluZGV4ZXMKLTxkZD4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBJbmRleGVzfSBvdmVycmlkZSZndDsgLS0+Ci1BbGxvdyB1c2Ugb2YgdGhlIGRpcmVjdGl2ZXMgY29udHJvbGxpbmcgZGlyZWN0b3J5IGluZGV4aW5nCi0oPEEgSFJFRj0ibW9kX2Rpci5odG1sI2FkZGRlc2NyaXB0aW9uIj5BZGREZXNjcmlwdGlvbjwvQT4sCi08QSBIUkVGPSJtb2RfZGlyLmh0bWwjYWRkaWNvbiI+QWRkSWNvbjwvQT4sCi08QSBIUkVGPSJtb2RfZGlyLmh0bWwjYWRkaWNvbmJ5ZW5jb2RpbmciPkFkZEljb25CeUVuY29kaW5nPC9BPiwKLTxBIEhSRUY9Im1vZF9kaXIuaHRtbCNhZGRpY29uYnl0eXBlIj5BZGRJY29uQnlUeXBlPC9BPiwKLTxBIEhSRUY9Im1vZF9kaXIuaHRtbCNkZWZhdWx0aWNvbiI+RGVmYXVsdEljb248L0E+LAotPEEgSFJFRj0ibW9kX2Rpci5odG1sI2RpcmVjdG9yeWluZGV4Ij5EaXJlY3RvcnlJbmRleDwvQT4sCi08QSBIUkVGPSJtb2RfZGlyLmh0bWwjZmFuY3lpbmRleGluZyI+RmFuY3lJbmRleGluZzwvQT4sCi08QSBIUkVGPSJtb2RfZGlyLmh0bWwjaGVhZGVybmFtZSI+SGVhZGVyTmFtZTwvQT4sCi08QSBIUkVGPSJtb2RfZGlyLmh0bWwjaW5kZXhpZ25vcmUiPkluZGV4SWdub3JlPC9BPiwKLTxBIEhSRUY9Im1vZF9kaXIuaHRtbCNpbmRleG9wdGlvbnMiPkluZGV4T3B0aW9uczwvQT4gYW5kCi08QSBIUkVGPSJtb2RfZGlyLmh0bWwjcmVhZG1lbmFtZSI+UmVhZG1lTmFtZTwvQT4pLgotPGR0PkxpbWl0Ci08ZGQ+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgTGltaXR9IG92ZXJyaWRlJmd0OyAtLT4KLUFsbG93IHVzZSBvZiB0aGUgZGlyZWN0aXZlcyBjb250cm9sbGluZyBob3N0IGFjY2VzcyAoYWxsb3csIGRlbnkgYW5kIG9yZGVyKS4KLTxkdD5PcHRpb25zCi08ZGQ+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgT3B0aW9uc30gb3ZlcnJpZGUmZ3Q7IC0tPgotQWxsb3cgdXNlIG9mIHRoZSBkaXJlY3RpdmVzIGNvbnRyb2xsaW5nIHNwZWNpZmljIGRpcmVjdG9yeSBmZWF0dXJlcwotKDxBIEhSRUY9IiNvcHRpb25zIj5PcHRpb25zPC9BPiBhbmQKLTxBIEhSRUY9Im1vZF9pbmNsdWRlLmh0bWwjeGJpdGhhY2siPlhCaXRIYWNrPC9BPikuCi08L2RsPjxwPjxocj4KLQotPEEgbmFtZT0iYXV0aG5hbWUiPjxoMj5BdXRoTmFtZSBkaXJlY3RpdmU8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBBdXRoTmFtZX0gZGlyZWN0aXZlJmd0OyAtLT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBBdXRoTmFtZSA8ZW0+YXV0aC1kb21haW48L2VtPjxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gZGlyZWN0b3J5LCAuaHRhY2Nlc3M8YnI+Ci08c3Ryb25nPk92ZXJyaWRlOjwvc3Ryb25nPiBBdXRoQ29uZmlnPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IGNvcmU8cD4KLQotVGhpcyBkaXJlY3RpdmUgc2V0cyB0aGUgbmFtZSBvZiB0aGUgYXV0aG9yaXphdGlvbiByZWFsbSBmb3IgYSBkaXJlY3RvcnkuCi1UaGlzIHJlYWxtIGlzIGdpdmVuIHRvIHRoZSBjbGllbnQgc28gdGhhdCB0aGUgdXNlciBrbm93cyB3aGljaCB1c2VybmFtZSBhbmQKLXBhc3N3b3JkIHRvIHNlbmQuCi1JdCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IDxBIEhSRUY9IiNhdXRodHlwZSI+QXV0aFR5cGU8L0E+IGFuZAotPEEgSFJFRj0iI3JlcXVpcmUiPnJlcXVpcmU8L0E+IGRpcmVjdGl2ZXMsIGFuZCBkaXJlY3RpdmVzIHN1Y2ggYXMKLTxBIEhSRUY9Im1vZF9hdXRoLmh0bWwjYXV0aHVzZXJmaWxlIj5BdXRoVXNlckZpbGU8L0E+IGFuZAotPEEgSFJFRj0ibW9kX2F1dGguaHRtbCNhdXRoZ3JvdXBmaWxlIj5BdXRoR3JvdXBGaWxlPC9BPiB0byB3b3JrLjxwPjxocj4KLQotPEEgbmFtZT0iYXV0aHR5cGUiPjxoMj5BdXRoVHlwZSBkaXJlY3RpdmU8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBBdXRoVHlwZX0gZGlyZWN0aXZlJmd0OyAtLT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBBdXRoVHlwZSA8ZW0+dHlwZTwvZW0+PGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBkaXJlY3RvcnksIC5odGFjY2Vzczxicj4KLTxzdHJvbmc+T3ZlcnJpZGU6PC9zdHJvbmc+IEF1dGhDb25maWc8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gY29yZTxwPgotCi1UaGlzIGRpcmVjdGl2ZSBzZWxlY3RzIHRoZSB0eXBlIG9mIHVzZXIgYXV0aGVudGljYXRpb24gZm9yIGEgZGlyZWN0b3J5LgotT25seSA8Y29kZT5CYXNpYzwvY29kZT4gaXMgY3VycmVudGx5IGltcGxlbWVudGVkLgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEJhc2ljfSBhdXRoZW50aWNhdGlvbiBzY2hlbWUmZ3Q7IC0tPgotSXQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSA8QSBIUkVGPSIjYXV0aG5hbWUiPkF1dGhOYW1lPC9BPiBhbmQKLTxBIEhSRUY9IiNyZXF1aXJlIj5yZXF1aXJlPC9BPiBkaXJlY3RpdmVzLCBhbmQgZGlyZWN0aXZlcyBzdWNoIGFzCi08QSBIUkVGPSJtb2RfYXV0aC5odG1sI2F1dGh1c2VyZmlsZSI+QXV0aFVzZXJGaWxlPC9BPiBhbmQKLTxBIEhSRUY9Im1vZF9hdXRoLmh0bWwjYXV0aGdyb3VwZmlsZSI+QXV0aEdyb3VwRmlsZTwvQT4gdG8gd29yay48cD48aHI+Ci0KLQotPEEgbmFtZT0iYmluZGFkZHJlc3MiPjxoMj5CaW5kQWRkcmVzcyBkaXJlY3RpdmU8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBCaW5kQWRkcmVzc30gZGlyZWN0aXZlJmd0OyAtLT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBCaW5kQWRkcmVzcyA8ZW0+c2FkZHI8L2VtPjxicj4KLTxzdHJvbmc+RGVmYXVsdDo8L3N0cm9uZz4gPGNvZGU+QmluZEFkZHJlc3MgKjwvY29kZT48YnI+Ci08c3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWc8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gY29yZTxwPgotCi1BIFVuaXgmIzE3NDsgaHR0cCBzZXJ2ZXIgY2FuIGVpdGhlciBsaXN0ZW4gb24gZm9yIGNvbm5lY3Rpb25zIHRvIGV2ZXJ5Ci1JUCBhZGRyZXNzIG9mIHRoZSBzZXJ2ZXIgbWFjaGluZSwgb3IganVzdCBvbmUgSVAgYWRkcmVzcyBvZiB0aGUgc2VydmVyCi1tYWNoaW5lLiA8ZW0+U2FkZHI8L2VtPiBjYW4gYmUKLQotPG1lbnU+Ci08bGk+KgotPGxpPkFuIElQIGFkZHJlc3MKLTxsaT5BIGZ1bGx5LXF1YWxpZmllZCBpbnRlcm5ldCBkb21haW4gbmFtZQotPC9tZW51PgotSWYgdGhlIHZhbHVlIGlzICosIHRoZW4gdGhlIHNlcnZlciB3aWxsIGxpc3RlbiBmb3IgY29ubmVjdGlvbnMgb24KLWV2ZXJ5IElQIGFkZHJlc3MsIG90aGVyd2lzZSBpdCB3aWxsIG9ubHkgbGlzdGVuIG9uIHRoZSBJUCBhZGRyZXNzCi1zcGVjaWZpZWQuIDxwPgotCi1UaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSBtZXRob2QgZm9yIHN1cHBvcnRpbmcKLTxBIEhSRUY9InZpcnR1YWwtaG9zdC5odG1sIj52aXJ0dWFsIGhvc3RzPC9BPiBpbnN0ZWFkIG9mIHVzaW5nCi08QSBIUkVGPSIjdmlydHVhbGhvc3QiPiZsdDtWaXJ0dWFsSG9zdCZndDs8L0E+IHNlY3Rpb25zLjxwPjxocj4KLQotPHA+PHN0cm9uZz5TZWUgQWxzbzo8L3N0cm9uZz4KLTxhIGhyZWY9ImJpbmQuaHRtbCI+U2V0dGluZyB3aGljaCBhZGRyZXNzZXMgYW5kIHBvcnRzIEFwYWNoZSB1c2VzPC9hPjwvcD4KLQotPEEgbmFtZT0iZGVmYXVsdHR5cGUiPjxoMj5EZWZhdWx0VHlwZSBkaXJlY3RpdmU8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBEZWZhdWx0VHlwZX0gZGlyZWN0aXZlJmd0OyAtLT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBEZWZhdWx0VHlwZSA8ZW0+bWltZS10eXBlPC9lbT48YnI+Ci08c3Ryb25nPkRlZmF1bHQ6PC9zdHJvbmc+IDxjb2RlPkRlZmF1bHRUeXBlIHRleHQvaHRtbDwvY29kZT48YnI+Ci08c3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3M8YnI+Ci08c3Ryb25nPk92ZXJyaWRlOjwvc3Ryb25nPiBGaWxlSW5mbzxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBjb3JlPHA+Ci0KLVRoZXJlIHdpbGwgYmUgdGltZXMgd2hlbiB0aGUgc2VydmVyIGlzIGFza2VkIHRvIHByb3ZpZGUgYSBkb2N1bWVudAotd2hvc2UgdHlwZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBieSBpdHMgTUlNRSB0eXBlcyBtYXBwaW5ncy48cD4KLQotVGhlIHNlcnZlciBtdXN0IGluZm9ybSB0aGUgY2xpZW50IG9mIHRoZSBjb250ZW50LXR5cGUgb2YgdGhlIGRvY3VtZW50LCBzbyBpbgotdGhlIGV2ZW50IG9mIGFuIHVua25vd24gdHlwZSBpdCB1c2VzIHRoZSA8Q09ERT5EZWZhdWx0VHlwZTwvQ09ERT4uIEZvcgotZXhhbXBsZToKLTxibG9ja3F1b3RlPjxjb2RlPkRlZmF1bHRUeXBlIGltYWdlL2dpZjwvY29kZT48L2Jsb2NrcXVvdGU+Ci13b3VsZCBiZSBhcHByb3ByaWF0ZSBmb3IgYSBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbmVkIG1hbnkgZ2lmIGltYWdlcwotd2l0aCBmaWxlbmFtZXMgbWlzc2luZyB0aGUgLmdpZiBleHRlbnNpb24uPHA+PGhyPgotCi08QSBuYW1lPSJkaXJlY3RvcnkiPjxoMj4mbHQ7RGlyZWN0b3J5Jmd0OyBkaXJlY3RpdmU8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBEaXJlY3Rvcnl9IHNlY3Rpb24gZGlyZWN0aXZlJmd0OyAtLT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiAmbHQ7RGlyZWN0b3J5IDxlbT5kaXJlY3Rvcnk8L2VtPiZndDsgLi4uCi0mbHQ7L0RpcmVjdG9yeSZndDsgPGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gQ29yZS4gPHA+Ci0KLSZsdDtEaXJlY3RvcnkmZ3Q7IGFuZCAmbHQ7L0RpcmVjdG9yeSZndDsgYXJlIHVzZWQgdG8gZW5jbG9zZSBhIGdyb3VwIG9mCi1kaXJlY3RpdmVzIHdoaWNoIHdpbGwgYXBwbHkgb25seSB0byB0aGUgbmFtZWQgZGlyZWN0b3J5IGFuZCBzdWItZGlyZWN0b3JpZXMKLW9mIHRoYXQgZGlyZWN0b3J5LiBBbnkgZGlyZWN0aXZlIHdoaWNoIGlzIGFsbG93ZWQgaW4gYSBkaXJlY3RvcnkKLWNvbnRleHQgbWF5IGJlIHVzZWQuIDxlbT5EaXJlY3Rvcnk8L2VtPiBpcyBlaXRoZXIgdGhlIGZ1bGwgcGF0aCB0byBhIGRpcmVjdG9yeSwKLW9yIGEgd2lsZGNhcmQgc3RyaW5nLiBJbiBhIHdpbGRjYXJkIHN0cmluZywgYD8nIG1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIsCi1hbmQgYConIG1hdGNoZXMgYW55IHNlcXVlbmNlcyBvZiBjaGFyYWN0ZXJzLiBFeGFtcGxlOgotPGJsb2NrcXVvdGU+Ci08Y29kZT4KLSZsdDtEaXJlY3RvcnkgL3Vzci9sb2NhbC9odHRwZC9odGRvY3MmZ3Q7PGJyPgotT3B0aW9ucyBJbmRleGVzIEZvbGxvd1N5bUxpbmtzPGJyPgotJmx0Oy9EaXJlY3RvcnkmZ3Q7PC9jb2RlPjwvYmxvY2txdW90ZT4KLUlmIG11bHRpcGxlIGRpcmVjdG9yeSBzZWN0aW9ucyBtYXRjaCB0aGUgZGlyZWN0b3J5IChvciBpdHMgcGFyZW50cykgY29udGFpbmluZwotYSBkb2N1bWVudCwgdGhlbiB0aGUgZGlyZWN0aXZlcyBhcmUgYXBwbGllZCBpbiB0aGUgb3JkZXIgb2Ygc2hvcnRlc3QgbWF0Y2gKLWZpcnN0LCBpbnRlcnNwZXJzZWQgd2l0aCB0aGUgZGlyZWN0aXZlcyBmcm9tIHRoZQotPEEgSFJFRj0iI2FjY2Vzc2ZpbGVuYW1lIj4uaHRhY2Nlc3M8L0E+IGZpbGVzLiBGb3IgZXhhbXBsZSwgd2l0aAotPGJsb2NrcXVvdGU+PGNvZGU+Ci0mbHQ7RGlyZWN0b3J5IC8mZ3Q7PGJyPgotQWxsb3dPdmVycmlkZSBOb25lPGJyPgotJmx0Oy9EaXJlY3RveSZndDs8YnI+PGJyPgotJmx0O0RpcmVjdG9yeSAvaG9tZS8qJmd0Ozxicj4KLUFsbG93T3ZlcnJpZGUgRmlsZUluZm88YnI+Ci0mbHQ7L0RpcmVjdG9yeSZndDs8L2NvZGU+PC9ibG9ja3F1b3RlPgotVGhlIGZvciBhY2Nlc3MgdG8gdGhlIGRvY3VtZW50IDxjb2RlPi9ob21lL3dlYi9kaXIvZG9jLmh0bWw8L2NvZGU+IHRoZQotc3RlcHMgYXJlOgotPG1lbnU+Ci08bGk+QXBwbHkgZGlyZWN0aXZlIDxjb2RlPkFsbG93T3ZlcnJpZGUgTm9uZTwvY29kZT4gKGRpc2FibGluZwotPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBmaWxlcykuCi08bGk+QXBwbHkgZGlyZWN0aXZlIDxjb2RlPkFsbG93T3ZlcnJpZGUgRmlsZUluZm88L2NvZGU+IChmb3IgZGlyZWN0b3J5Ci08Y29kZT4vaG9tZS93ZWI8L2NvZGU+KS4KLTxsaT5BcHBseSBhbnkgRmlsZUluZm8gZGlyZWN0aXZlcyBpbiA8Y29kZT4vaG9tZS93ZWIvLmh0YWNjZXNzPC9jb2RlPgotPC9tZW51PgotCi1UaGUgZGlyZWN0b3J5IHNlY3Rpb25zIHR5cGljYWxseSBvY2N1ciBpbiB0aGUgYWNjZXNzLmNvbmYgZmlsZSwgYnV0IHRoZXkKLW1heSBhcHBlYXIgaW4gYW55IGNvbmZpZ3VyYXRpb24gZmlsZS4gJmx0O0RpcmVjdG9yeSZndDsgZGlyZWN0aXZlcyBjYW5ub3QKLW5lc3QsIGFuZCBjYW5ub3QgYXBwZWFyIGluIGEgPEEgSFJFRj0iI2xpbWl0Ij4mbHQ7TGltaXQmZ3Q7PC9BPiBzZWN0aW9uLgotPHA+PGhyPgotCi08QSBOQU1FPSJkb2N1bWVudHJvb3QiPjxoMj5Eb2N1bWVudFJvb3QgZGlyZWN0aXZlPC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgRG9jdW1lbnRSb290fSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IERvY3VtZW50Um9vdCA8ZW0+ZGlyZWN0b3J5LWZpbGVuYW1lPC9lbT48YnI+Ci08c3Ryb25nPkRlZmF1bHQ6PC9zdHJvbmc+IDxjb2RlPkRvY3VtZW50Um9vdAotL3Vzci9sb2NhbC9ldGMvaHR0cGQvaHRkb2NzPC9jb2RlPjxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IGNvcmU8cD4KLQotVGhpcyBkaXJlY3RpdmUgc2V0cyB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggaHR0cGQgd2lsbCBzZXJ2ZSBmaWxlcy4KLVVubGVzcyBtYXRjaGVkIGJ5IGEgZGlyZWN0aXZlIGxpa2UgQWxpYXMsIHRoZSBzZXJ2ZXIgYXBwZW5kcyB0aGUgcGF0aAotZnJvbSB0aGUgcmVxdWVzdGVkIFVSTCB0byB0aGUgZG9jdW1lbnQgcm9vdCB0byBtYWtlIHRoZSBwYXRoIHRvIHRoZQotZG9jdW1lbnQuIEV4YW1wbGU6Ci08YmxvY2txdW90ZT48Y29kZT5Eb2N1bWVudFJvb3QgL3Vzci93ZWI8L2NvZGU+PC9ibG9ja3F1b3RlPgotdGhlbiBhbiBhY2Nlc3MgdG8gPGNvZGU+aHR0cDovL3d3dy5teS5ob3N0LmNvbS9pbmRleC5odG1sPC9jb2RlPiByZWZlcnMKLXRvIDxjb2RlPi91c3Ivd2ViL2luZGV4Lmh0bWw8L2NvZGU+LgotCi08UD5UaGVyZSBhcHBlYXJzIHRvIGJlIGEgYnVnIGluIG1vZF9kaXIgd2hpY2ggY2F1c2VzIHByb2JsZW1zIHdoZW4gdGhlCi1Eb2N1bWVudFJvb3QgaGFzIGEgdHJhaWxpbmcgc2xhc2ggKGkuZS4gIkRvY3VtZW50Um9vdCAvdXNyL3dlYi8iKSBzbwotcGxlYXNlIGF2b2lkIHRoYXQuCi0KLTxwPjxocj4KLQotPEEgbmFtZT0iZXJyb3Jkb2N1bWVudCI+PGgyPkVycm9yRG9jdW1lbnQgZGlyZWN0aXZlPC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgRXJyb3JEb2N1bWVudH0gZGlyZWN0aXZlJmd0OyAtLT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBFcnJvckRvY3VtZW50IDxlbT5lcnJvci1jb2RlIGRvY3VtZW50PC9lbT48YnI+Ci08c3Ryb25nPkNvbnRleHQ8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2Vzczxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBjb3JlPGJyPgotPHN0cm9uZz5Db21wYXRpYmlsaXR5Ojwvc3Ryb25nPiBUaGUgZGlyZWN0b3J5IGFuZCAuaHRhY2Nlc3MgY29udGV4dHMKLWFyZSBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUgMS4xIGFuZCBsYXRlci48cD4KLQotSW4gdGhlIGV2ZW50IG9mIGEgcHJvYmxlbSBvciBlcnJvciwgQXBhY2hlIGNhbiBiZSBjb25maWd1cmVkIHRvIGRvCi1vbmUgb2YgZm91ciB0aGluZ3MsCi0KLTxPTD4KLTxMST5iZWhhdmUgbGlrZSBOQ1NBIGh0dHBkIDEuMwotPExJPm91dHB1dCBhIGN1c3RvbWl6ZWQgbWVzc2FnZQotPExJPnJlZGlyZWN0IHRvIGEgbG9jYWwgVVJMIHRvIGhhbmRsZSB0aGUgcHJvYmxlbS9lcnJvcgotPExJPnJlZGlyZWN0IHRvIGFuIGV4dGVybmFsIFVSTCB0byBoYW5kbGUgdGhlIHByb2JsZW0vZXJyb3IKLTwvT0w+Ci0KLTxQPjItNCBhcmUgY29uZmlndXJlZCB1c2luZyA8Q09ERT5FcnJvckRvY3VtZW50PC9DT0RFPiwgd2hpY2gKLWlzIGZvbGxvd2VkIGJ5IHRoZSBIVFRQIHJlc3BvbnNlIGNvZGUgYW5kIGEgbWVzc2FnZSBvciBVUkwuCi0KLTxQPjxlbT5NZXNzYWdlczwvZW0+IGluIHRoaXMgY29udGV4dCwgYmVnaW4gd2l0aCBhIHNpbmdsZSBxdW90ZQotKDxjb2RlPiI8L2NvZGU+KSwgd2hpY2ggZG9lcyBub3QgZm9ybSBwYXJ0IG9mIHRoZSBtZXNzYWdlIGl0c2VsZi4gQXBhY2hlIHdpbGwKLXNvbWV0aW1lIG9mZmVyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBwcm9ibGVtL2Vycm9yLiBUaGlzIGNhbiBiZQotZW1iZWRkZWQgaW50byB0aGUgbWVzc2FnZSB1c2luZyA8Y29kZT4lczwvY29kZT4KLQotPFA+VVJMcyB3aWxsIGJlZ2luIHdpdGggYSBzbGFzaCAoLykgZm9yIGxvY2FsIFVSTHMsIG9yIHdpbGwgYmUgYSBmdWxsCi1VUkwgd2hpY2ggdGhlIGNsaWVudCBjYW4gcmVzb2x2ZS4gRXhhbXBsZXM6Ci08YmxvY2txdW90ZT48Y29kZT4KLUVycm9yRG9jdW1lbnQgNTAwIC9jZ2ktYmluL3Rlc3Rlcjxicj4KLUVycm9yRG9jdW1lbnQgNDA0IC9jZ2ktYmluL2JhZF91cmxzLnBsPGJyPgotRXJyb3JEb2N1bWVudCA0MDEgaHR0cDovL3d3dzIuZm9vLmJhci9zdWJzY3JpcHRpb25faW5mby5odG1sPGJyPgotRXJyb3JEb2N1bWVudCA0MDMgIlNvcnJ5IGNhbid0IGFsbG93IHlvdSBhY2Nlc3MgdG9kYXkKLTwvY29kZT48L2Jsb2NrcXVvdGU+Ci0KLVNlZSBBbHNvOiA8QSBIUkVGPSJjdXN0b20tZXJyb3IuaHRtbCI+ZG9jdW1lbnRhdGlvbiBvZiBjdXN0b21pemFibGUKLXJlc3BvbnNlcy48L0E+PHA+PGhyPgotCi08QSBuYW1lPSJlcnJvcmxvZyI+PGgyPkVycm9yTG9nIGRpcmVjdGl2ZTwvaDI+PC9BPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEVycm9yTG9nfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IEVycm9yTG9nIDxlbT5maWxlbmFtZTwvZW0+PGJyPgotPHN0cm9uZz5EZWZhdWx0Ojwvc3Ryb25nPiA8Y29kZT5FcnJvckxvZyBsb2dzL2Vycm9yX2xvZzwvY29kZT48YnI+Ci08c3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBjb3JlPHA+Ci0KLVRoZSBlcnJvciBsb2cgZGlyZWN0aXZlIHNldHMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gd2hpY2ggdGhlIHNlcnZlciB3aWxsIGxvZwotYW55IGVycm9ycyBpdCBlbmNvdW50ZXJzLiBJZiB0aGUgZmlsZW5hbWUgZG9lcyBub3QgYmVnaW4gd2l0aCBhIHNsYXNoICgvKQotdGhlbiBpdCBpcyBhc3N1bWVkIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSA8QSBIUkVGPSIjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvQT4uCi1FeGFtcGxlOgotPGJsb2NrcXVvdGU+PGNvZGU+RXJyb3JMb2cgL2Rldi9udWxsPC9jb2RlPjwvYmxvY2txdW90ZT4KLVRoaXMgZWZmZWN0aXZlbHkgdHVybnMgb2ZmIGVycm9yIGxvZ2dpbmcuPHA+PGhyPgotCi08QSBuYW1lPSJncm91cCI+PGgyPkdyb3VwIGRpcmVjdGl2ZTwvaDI+PC9BPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEdyb3VwfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IEdyb3VwIDxlbT51bml4LWdyb3VwPC9lbT48YnI+Ci08c3Ryb25nPkRlZmF1bHQ6PC9zdHJvbmc+IDxjb2RlPkdyb3VwICMtMTwvY29kZT48YnI+Ci08c3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWc8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gY29yZTxwPgotCi1UaGUgR3JvdXAgZGlyZWN0aXZlIHNldHMgdGhlIGdyb3VwIHVuZGVyIHdoaWNoIHRoZSBzZXJ2ZXIgd2lsbCBhbnN3ZXIgcmVxdWVzdHMuCi1JbiBvcmRlciB0byB1c2UgdGhpcyBkaXJlY3RpdmUsIHRoZSBzdGFuZGFsb25lIHNlcnZlciBtdXN0IGJlIHJ1biBpbml0aWFsbHkKLWFzIHJvb3QuIDxlbT5Vbml4LWdyb3VwPC9lbT4gaXMgb25lIG9mOgotPGRsPgotPGR0PkEgZ3JvdXAgbmFtZQotPGRkPlJlZmVycyB0byB0aGUgZ2l2ZW4gZ3JvdXAgYnkgbmFtZS4KLTxkdD4jIGZvbGxvd2VkIGJ5IGEgZ3JvdXAgbnVtYmVyLgotPGRkPlJlZmVycyB0byBhIGdyb3VwIGJ5IGl0cyBudW1iZXIuCi08L2RsPgotCi1JdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBzZXQgdXAgYSBuZXcgZ3JvdXAgc3BlY2lmaWNhbGx5IGZvciBydW5uaW5nIHRoZQotc2VydmVyLiBTb21lIGFkbWlucyB1c2UgdXNlciA8Y29kZT5ub2JvZHk8L2NvZGU+LCBidXQgdGhpcyBpcyBub3QgYWx3YXlzCi1wb3NzaWJsZSBvciBkZXNpcmFibGUuPHA+Ci0KLU5vdGU6IGlmIHlvdSBzdGFydCB0aGUgc2VydmVyIGFzIGEgbm9uLXJvb3QgdXNlciwgaXQgd2lsbCBmYWlsIHRvIGNoYW5nZQotdG8gdGhlIHNwZWNpZmllZCwgYW5kIHdpbGwgaW5zdGVhZCBjb250aW51ZSB0byBydW4gYXMgdGhlIGdyb3VwIG9mIHRoZQotb3JpZ2luYWwgdXNlci4gPHA+Ci0KLVNFQ1VSSVRZOiBTZWUgPEEgSFJFRj0iI3VzZXIiPlVzZXI8L0E+IGZvciBhIGRpc2N1c3Npb24gb2YgdGhlIHNlY3VyaXR5Ci1jb25zaWRlcmF0aW9ucy48cD48aHI+Ci0KLTxBIG5hbWU9ImlkZW50aXR5Y2hlY2siPjxoMj5JZGVudGl0eUNoZWNrIGRpcmVjdGl2ZTwvaDI+PC9BPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IElkZW50aXR5Q2hlY2t9IGRpcmVjdGl2ZSZndDsgLS0+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gSWRlbnRpdHlDaGVjayA8ZW0+Ym9vbGVhbjwvZW0+PGJyPgotPHN0cm9uZz5EZWZhdWx0Ojwvc3Ryb25nPiA8Y29kZT5JZGVudGl0eUNoZWNrIG9mZjwvY29kZT48YnI+Ci08c3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3M8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gY29yZTxwPgotCi1UaGlzIGRpcmVjdGl2ZSBlbmFibGVzIFJGQzkzMS1jb21wbGlhbnQgbG9nZ2luZyBvZiB0aGUgcmVtb3RlIHVzZXIgbmFtZQotZm9yIGVhY2ggY29ubmVjdGlvbiwgd2hlcmUgdGhlIGNsaWVudCBtYWNoaW5lIHJ1bnMgaWRlbnRkIG9yIHNvbWV0aGluZyBzaW1pbGFyLgotVGhpcyBpbmZvcm1hdGlvbiBpcyBsb2dnZWQgaW4gdGhlIGFjY2VzcyBsb2cuIDxlbT5Cb29sZWFuPC9lbT4gaXMgZWl0aGVyCi08Y29kZT5vbjwvY29kZT4gb3IgPGNvZGU+b2ZmPC9jb2RlPi48cD4KLQotVGhlIGluZm9ybWF0aW9uIHNob3VsZCBub3QgdHJ1c3RlZCBpbiBhbnkgd2F5IGV4Y2VwdCBmb3IgcnVkaW1lbnRhcnkgdXNhZ2UKLXRyYWNraW5nLjxwPjxocj4KLQotPGgyPjxhIG5hbWU9ImtlZXBhbGl2ZSI+S2VlcEFsaXZlPC9hPjwvaDI+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gS2VlcEFsaXZlIDxlbT5tYXgtcmVxdWVzdHM8L2VtPjxicj4KLTxzdHJvbmc+RGVmYXVsdDo8L3N0cm9uZz4gPGNvZGU+S2VlcEFsaXZlIDU8L2NvZGU+PGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IENvcmU8YnI+Ci08c3Ryb25nPkNvbXBhdGliaWxpdHk6PC9zdHJvbmc+IEtlZXBBbGl2ZSBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUKLTEuMSBhbmQgbGF0ZXIuPHA+Ci0KLVRoaXMgZGlyZWN0aXZlIGVuYWJsZXMKLTxhIGhyZWY9ImtlZXBhbGl2ZS5odG1sIj5LZWVwLUFsaXZlPC9hPgotc3VwcG9ydC4gU2V0IDxlbT5tYXgtcmVxdWVzdHM8L2VtPgotdG8gdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIHlvdSB3YW50IEFwYWNoZSB0byBlbnRlcnRhaW4gcGVyCi1yZXF1ZXN0LiBBIGxpbWl0IGlzIGltcG9zZWQgdG8gcHJldmVudCBhIGNsaWVudCBmcm9tIGhvZ2dpbmcgeW91cgotc2VydmVyIHJlc291cmNlcy4gU2V0IHRoaXMgdG8gPGNvZGU+MDwvY29kZT4gdG8gZGlzYWJsZSBzdXBwb3J0LgotCi08aDI+PGEgbmFtZT0ia2VlcGFsaXZldGltZW91dCI+S2VlcEFsaXZlVGltZW91dDwvYT48L2gyPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IEtlZXBBbGl2ZVRpbWVvdXQgPGVtPnNlY29uZHM8L2VtPjxicj4KLTxzdHJvbmc+RGVmYXVsdDo8L3N0cm9uZz4gPGNvZGU+S2VlcEFsaXZlVGltZW91dCAxNTwvY29kZT48YnI+Ci08c3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWc8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gQ29yZTxicj4KLTxzdHJvbmc+Q29tcGF0aWJpbGl0eTo8L3N0cm9uZz4gS2VlcEFsaXZlVGltZW91dCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUKLTEuMSBhbmQgbGF0ZXIuPHA+Ci0KLVRoZSBudW1iZXIgb2Ygc2Vjb25kcyBBcGFjaGUgd2lsbCB3YWl0IGZvciBhIHN1YnNlcXVlbnQgcmVxdWVzdCBiZWZvcmUKLWNsb3NpbmcgdGhlIGNvbm5lY3Rpb24uIE9uY2UgYSByZXF1ZXN0IGhhcyBiZWVuIHJlY2VpdmVkLCB0aGUgdGltZW91dAotdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZSA8YQotaHJlZj0iLi4vY29yZS5odG1sI3RpbWVvdXQiPjxjb2RlPlRpbWVvdXQ8L2NvZGU+PC9hPiBkaXJlY3RpdmUKLWFwcGxpZXMuCi0KLQotPEEgbmFtZT0ibGlzdGVuIj48aDI+TGlzdGVuPC9oMj48L0E+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4KLUxpc3RlbiBbPGVtPklQIGFkZHJlc3M8L2VtPjpdPGVtPnBvcnQgbnVtYmVyPC9lbT48YnI+Ci08c3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWc8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gY29yZTxicj4KLTxzdHJvbmc+Q29tcGF0aWJpbGl0eTo8L3N0cm9uZz4gTGlzdGVuIGlzIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZQotMS4xIGFuZCBsYXRlci48cD4KLQotPHA+VGhlIExpc3RlbiBkaXJlY3RpdmUgaW5zdHJ1Y3RzIEFwYWNoZSB0byBsaXN0ZW4gdG8gbW9yZSB0aGFuIG9uZSBJUAotYWRkcmVzcyBvciBwb3J0OyBieSBkZWZhdWx0IGl0IHJlc3BvbmRzIHRvIHJlcXVlc3RzIG9uIGFsbCBJUAotaW50ZXJmYWNlcywgYnV0IG9ubHkgb24gdGhlIHBvcnQgZ2l2ZW4gYnkgdGhlIDxhIGhyZWY9IiNwb3J0Ij5Qb3J0PC9hPgotZGlyZWN0aXZlLjwvcD4KLQotPHA+PHN0cm9uZz5TZWUgQWxzbzwvc3Ryb25nPjoKLTxhIGhyZWY9ImJpbmQuaHRtbCI+U2V0dGluZyB3aGljaCBhZGRyZXNzZXMgYW5kIHBvcnRzIEFwYWNoZSB1c2VzPC9hPjwvcD4KLQotPEEgbmFtZT0ibGltaXQiPjxoMj4mbHQ7TGltaXQmZ3Q7IGRpcmVjdGl2ZTwvaDI+PC9BPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IExpbWl0fSBzZWN0aW9uIGRpcmVjdGl2ZSZndDsgLS0+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4KLSAmbHQ7TGltaXQgPGVtPm1ldGhvZCBtZXRob2Q8L2VtPiAuLi4gJmd0OyAuLi4gJmx0Oy9MaW1pdCZndDs8YnI+Ci08c3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IGFueTxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBjb3JlPHA+Ci0KLSZsdDtMaW1pdCZndDsgYW5kICZsdDsvTGltaXQmZ3Q7IGFyZSB1c2VkIHRvIGVuY2xvc2UgYSBncm91cCBvZgotYWNjZXNzIGNvbnRyb2wgZGlyZWN0aXZlcyB3aGljaCB3aWxsIHRoZW4gYXBwbHkgb25seSB0byB0aGUgc3BlY2lmaWVkCi1hY2Nlc3MgbWV0aG9kcywgd2hlcmUgPGVtPm1ldGhvZDwvZW0+IGlzIGFueSB2YWxpZCBIVFRQIG1ldGhvZC4KLUFueSBkaXJlY3RpdmUgZXhjZXB0IGFub3RoZXIgJmx0O0xpbWl0Jmd0OyBvcgotPEEgSFJFRj0iI2RpcmVjdG9yeSI+Jmx0O0RpcmVjdG9yeSZndDs8L0E+IG1heSBiZSB1c2VkOyB0aGUgbWFqb3JpdHkgd2lsbCBiZQotdW5hZmZlY3RlZCBieSB0aGUgJmx0O0xpbWl0Jmd0Oy4gRXhhbXBsZToKLTxibG9ja3F1b3RlPjxjb2RlPgotJmx0O0xpbWl0IEdFVCBQT1NUJmd0Ozxicj4KLXJlcXVpcmUgdmFsaWQtdXNlcjxicj4KLSZsdDsvTGltaXQmZ3Q7PC9jb2RlPjwvYmxvY2txdW90ZT4KLUlmIGFuIGFjY2VzcyBjb250cm9sIGRpcmVjdGl2ZSBhcHBlYXJzIG91dHNpZGUgYSAmbHQ7TGltaXQmZ3Q7IGRpcmVjdGl2ZSwKLXRoZW4gaXQgYXBwbGllcyB0byBhbGwgYWNjZXNzIG1ldGhvZHMuPHA+PGhyPgotCi08aDI+PGEgbmFtZT0ibG9jYXRpb24iPiZsdDtMb2NhdGlvbiZndDs8L2E+PC9oMj4KLQotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+ICZsdDtMb2NhdGlvbiA8ZW0+VVJMIHByZWZpeDwvZW0+Jmd0Ozxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IGNvcmU8YnI+Ci08c3Ryb25nPkNvbXBhdGliaWxpdHk6PC9zdHJvbmc+IExvY2F0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZQotMS4xIGFuZCBsYXRlci48cD4KLQotPHA+VGhlICZsdDtMb2NhdGlvbiZndDsgZGlyZWN0aXZlIHByb3ZpZGVzIGZvciBhY2Nlc3MgY29udHJvbCBieQotVVJMLiBJdCBpcyBjb21wcmFibGUgdG8gdGhlIDxhCi1ocmVmPSIjZGlyZWN0b3J5Ij4mbHQ7RGlyZWN0b3J5Jmd0OzwvYT4gZGlyZWN0aXZlLCBhbmQKLXNob3VsZCBiZSBtYXRjaGVkIHdpdGggYSAmbHQ7L0xvY2F0aW9uJmd0OyBkaXJlY3RpdmUuIERpcmVjdGl2ZXMgdGhhdAotYXBwbHkgdG8gdGhlIFVSTCBnaXZlbiBzaG91bGQgYmUgbGlzdGVuCi13aXRoaW4uIDxjb2RlPiZsdDtMb2NhdGlvbiZndDs8L2NvZGU+IHNlY3Rpb25zIGFyZSBwcm9jZXNzZWQgaW4gdGhlCi1vcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLCBhZnRlciB0aGUKLSZsdDtEaXJlY3RvcnkmZ3Q7IHNlY3Rpb25zIGFuZCA8Y29kZT4uaHRhY2Nlc3M8L2NvZGU+IGZpbGVzIGFyZQotcmVhZC48L3A+Ci0KLTxwPk5vdGUgdGhhdCwgZHVlIHRvIHRoZSB3YXkgSFRUUCBmdW5jdGlvbnMsIDxlbT5VUkwgcHJlZml4PC9lbT4KLXNob3VsZCwgc2F2ZSBmb3IgcHJveHkgcmVxdWVzdHMsIGJlIG9mIHRoZSBmb3JtIDxjb2RlPi9wYXRoLzwvY29kZT4sCi1hbmQgc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSA8Y29kZT5odHRwOi8vc2VydmVybmFtZTwvY29kZT4uIEl0IGRvZXNuJ3QKLW5lY2Nlc3NhcmlseSBoYXZlIHRvIHByb3RlY3QgYSBkaXJlY3RvcnkgKGl0IGNhbiBiZSBhbiBpbmRpdmlkdWFsCi1maWxlLCBvciBhIG51bWJlciBvZiBmaWxlcyksIGFuZCBjYW4gaW5jbHVkZSB3aWxkY2FyZHMuICBJbiBhIHdpbGRjYXJkCi1zdHJpbmcsIGA/JyBtYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyLCBhbmQgYConIG1hdGNoZXMgYW55Ci1zZXF1ZW5jZXMgb2YgY2hhcmFjdGVycy4KLQotPHA+VGhpcyBmdW5jdGlvbmFsaXR5IGlzIGVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gY29tYmluZWQgd2l0aCB0aGUKLTxjb2RlPjxhIGhyZWY9Im1vZF9taW1lLmh0bWwjc2V0aGFuZGxlciI+U2V0SGFuZGxlcjwvYT48L2NvZGU+Ci1kaXJlY3RpdmUuIEZvciBleGFtcGxlLCB0byBlbmFibGUgc3RhdHVzIHJlcXVlc3RzLCBidXQgYWxsb3cgdGhlbSBvbmx5Ci1mcm9tIGJyb3dzZXJzIGF0IGZvby5jb20sIHlvdSBtaWdodCB1c2U6Ci0KLTxwcmU+Ci0gICAgJmx0O0xvY2F0aW9uIC9zdGF0dXMmZ3Q7Ci0gICAgU2V0SGFuZGxlciBzZXJ2ZXItc3RhdHVzCi0gICAgPExpbWl0IEdFVD4KLSAgICBvcmRlciBkZW55LGFsbG93Ci0gICAgZGVueSBmcm9tIGFsbAotICAgIGFsbG93IGZyb20gLmZvby5jb20KLSAgICA8L0xpbWl0PgotICAgICZsdDsvTG9jYXRpb24mZ3Q7Ci08L3ByZT4KLQotCi08QSBuYW1lPSJtYXhjbGllbnRzIj48aDI+TWF4Q2xpZW50cyBkaXJlY3RpdmU8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBNYXhDbGllbnRzfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IE1heENsaWVudHMgPGVtPm51bWJlcjwvZW0+PGJyPgotPHN0cm9uZz5EZWZhdWx0Ojwvc3Ryb25nPiA8Y29kZT5NYXhDbGllbnRzIDE1MDwvY29kZT48YnI+Ci08c3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWc8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gY29yZTxwPgotCi1UaGUgTWF4Q2xpZW50cyBkaXJlY3RpdmUgc2V0cyB0aGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBzaW11bHRhbmVvdXMKLXJlcXVlc3RzIHRoYXQgY2FuIGJlIHN1cHBvcnRlZDsgbm90IG1vcmUgdGhhbiB0aGlzIG51bWJlciBvZiBjaGlsZCBzZXJ2ZXIKLXByb2Nlc3NlcyB3aWxsIGJlIGNyZWF0ZWQuPHA+PGhyPgotCi08QSBuYW1lPSJtYXhyZXF1ZXN0c3BlcmNoaWxkIj48aDI+TWF4UmVxdWVzdHNQZXJDaGlsZCBkaXJlY3RpdmU8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBNYXhSZXF1ZXN0c1BlckNoaWxkfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IE1heFJlcXVlc3RzUGVyQ2hpbGQgPGVtPm51bWJlcjwvZW0+PGJyPgotPHN0cm9uZz5EZWZhdWx0Ojwvc3Ryb25nPiA8Y29kZT5NYXhSZXF1ZXN0c1BlckNoaWxkIDA8L2NvZGU+PGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IGNvcmU8cD4KLQotVGhlIE1heFJlcXVlc3RzUGVyQ2hpbGQgZGlyZWN0aXZlIHNldHMgdGhlIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgcmVxdWVzdHMKLXRoYXQgYW4gaW5kaXZpZHVhbCBjaGlsZCBzZXJ2ZXIgcHJvY2VzcyB3aWxsIGhhbmRsZS4gQWZ0ZXIgTWF4UmVxdWVzdHNQZXJDaGlsZAotcmVxdWVzdHMsIHRoZSBjaGlsZCBwcm9jZXNzIHdpbGwgZGllLiBJZiBNYXhSZXF1ZXN0c1BlckNoaWxkIGlzIDAsIHRoZW4KLXRoZSBwcm9jZXNzIHdpbGwgbmV2ZXIgZXhwaXJlLjxwPgotCi1TZXR0aW5nIE1heFJlcXVlc3RzUGVyQ2hpbGQgdG8gYSBub24temVybyBsaW1pdCBoYXMgdHdvIGJlbmVmaWNpYWwgZWZmZWN0czoKLTx1bD4KLTxsaT5pdCBsaW1pdHMgdGhlIGFtb3VudCBvZiBtZW1vcnkgdGhhdCBwcm9jZXNzIGNhbiBjb25zdW1lIGJ5IChhY2NpZGVudGFsKQotbWVtb3J5IGxlYWthZ2U7Ci08bGk+IGJ5IGdpdmluZyBwcm9jZXNzZXMgYSBmaW5pdGUgbGlmZXRpbWUsIGl0IGhlbHBzIHJlZHVjZSB0aGUKLW51bWJlciBvZiBwcm9jZXNzZXMgd2hlbiB0aGUgc2VydmVyIGxvYWQgcmVkdWNlcy4KLTwvdWw+PHA+PGhyPgotCi08QSBuYW1lPSJtYXhzcGFyZXNlcnZlcnMiPjxoMj5NYXhTcGFyZVNlcnZlcnMgZGlyZWN0aXZlPC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgTWF4U3BhcmVTZXJ2ZXJzfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IE1heFNwYXJlU2VydmVycyA8ZW0+bnVtYmVyPC9lbT48YnI+Ci08c3Ryb25nPkRlZmF1bHQ6PC9zdHJvbmc+IDxjb2RlPk1heFNwYXJlU2VydmVycyAxMDwvY29kZT48YnI+Ci08c3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWc8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gY29yZTxwPgotCi1UaGUgTWF4U3BhcmVTZXJ2ZXJzIGRpcmVjdGl2ZSBzZXRzIHRoZSBkZXNpcmVkIG1heGltdW0gbnVtYmVyIG9mIDxlbT5pZGxlPC9lbT4KLWNoaWxkIHNlcnZlciBwcm9jZXNzZXMuIEFuIGlkbGUgcHJvY2VzcyBpcyBvbmUgd2hpY2ggaXMgbm90IGhhbmRsaW5nCi1hIHJlcXVlc3QuIElmIHRoZXJlIGFyZSBtb3JlIHRoYW4gTWF4U3BhcmVTZXJ2ZXJzIGlkbGUsIHRoZW4gdGhlIHBhcmVudAotcHJvY2VzcyB3aWxsIGtpbGwgb2ZmIHRoZSBleGNlc3MgcHJvY2Vzc2VzLjxwPgotCi1UdW5pbmcgb2YgdGhpcyBwYXJhbWV0ZXIgc2hvdWxkIG9ubHkgYmUgbmVjZXNzYXJ5IG9uIHZlcnkgYnVzeSBzaXRlcy4KLVNldHRpbmcgdGhpcyBwYXJhbWV0ZXIgdG8gYSBsYXJnZSBudW1iZXIgaXMgYWxtb3N0IGFsd2F5cyBhIGJhZCBpZGVhLjxwPgotCi1TZWUgYWxzbyA8QSBIUkVGPSIjbWluc3BhcmVzZXJ2ZXJzIj5NaW5TcGFyZVNlcnZlcnM8L0E+IGFuZAotPEEgSFJFRj0iI3N0YXJ0c2VydmVycyI+U3RhcnRTZXJ2ZXJzPC9BPi48cD48aHI+Ci0KLTxBIG5hbWU9Im1pbnNwYXJlc2VydmVycyI+PGgyPk1pblNwYXJlU2VydmVycyBkaXJlY3RpdmU8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBNaW5TcGFyZVNlcnZlcnN9IGRpcmVjdGl2ZSZndDsgLS0+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gTWluU3BhcmVTZXJ2ZXJzIDxlbT5udW1iZXI8L2VtPjxicj4KLTxzdHJvbmc+RGVmYXVsdDo8L3N0cm9uZz4gPGNvZGU+TWluU3BhcmVTZXJ2ZXJzIDU8L2NvZGU+PGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IGNvcmU8cD4KLQotVGhlIE1pblNwYXJlU2VydmVycyBkaXJlY3RpdmUgc2V0cyB0aGUgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiA8ZW0+aWRsZTwvZW0+Ci1jaGlsZCBzZXJ2ZXIgcHJvY2Vzc2VzLiBBbiBpZGxlIHByb2Nlc3MgaXMgb25lIHdoaWNoIGlzIG5vdCBoYW5kbGluZwotYSByZXF1ZXN0LiBJZiB0aGVyZSBhcmUgZmV3ZXIgdGhhbiBNaW5TcGFyZVNlcnZlcnMgaWRsZSwgdGhlbiB0aGUgcGFyZW50Ci1wcm9jZXNzIGNyZWF0ZXMgbmV3IGNoaWxkcmVuIGF0IGEgbWF4aW11bSByYXRlIG9mIDEgcGVyIHNlY29uZC48cD4KLQotVHVuaW5nIG9mIHRoaXMgcGFyYW1ldGVyIHNob3VsZCBvbmx5IGJlIG5lY2Vzc2FyeSBvbiB2ZXJ5IGJ1c3kgc2l0ZXMuCi1TZXR0aW5nIHRoaXMgcGFyYW1ldGVyIHRvIGEgbGFyZ2UgbnVtYmVyIGlzIGFsbW9zdCBhbHdheXMgYSBiYWQgaWRlYS48cD4KLQotU2VlIGFsc28gPEEgSFJFRj0iI21heHNwYXJlc2VydmVycyI+TWF4U3BhcmVTZXJ2ZXJzPC9BPiBhbmQKLTxBIEhSRUY9IiNzdGFydHNlcnZlcnMiPlN0YXJ0U2VydmVyczwvQT4uPHA+PGhyPgotCi08QSBuYW1lPSJvcHRpb25zIj48aDI+T3B0aW9ucyBkaXJlY3RpdmU8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBPcHRpb25zfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IE9wdGlvbnMgPGVtPm9wdGlvbiBvcHRpb24gLi4uPC9lbT48YnI+Ci08c3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3M8YnI+Ci08c3Ryb25nPk92ZXJyaWRlOjwvc3Ryb25nPiBPcHRpb25zPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IGNvcmU8cD4KLQotVGhlIE9wdGlvbnMgZGlyZWN0aXZlIGNvbnRyb2xzIHdoaWNoIHNlcnZlciBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlIGluCi1hIHBhcnRpY3VsYXIgZGlyZWN0b3J5LjxwPgotPGVtPm9wdGlvbjwvZW0+IGNhbiBiZSBzZXQgdG8gPGNvZGU+Tm9uZTwvY29kZT4sIGluIHdoaWNoIGNhc2Ugbm9uZSBvZgotdGhlIGV4dHJhIGZlYXR1cmVzIGFyZSBlbmFibGVkLCBvciBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nOgotPGRsPgotPGR0PkFsbAotPGRkPkFsbCBvcHRpb25zIGV4Y2VwdCBmb3IgTXVsdGlWaWV3cy4KLTxkdD5FeGVjQ0dJCi08ZGQ+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgRXhlY0NHSX0gb3B0aW9uJmd0OyAtLT4KLUV4ZWN1dGlvbiBvZiBDR0kgc2NyaXB0cyBpcyBwZXJtaXR0ZWQuCi08ZHQ+Rm9sbG93U3ltTGlua3MKLTxkZD4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBGb2xsb3dTeW1MaW5rc30gb3B0aW9uJmd0OyAtLT4KLVRoZSBzZXJ2ZXIgd2lsbCBmb2xsb3cgc3ltYm9saWMgbGlua3MgaW4gdGhpcyBkaXJlY3RvcnkuCi08ZHQ+SW5jbHVkZXMKLTxkZD4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBJbmNsdWRlc30gb3B0aW9uJmd0OyAtLT4KLVNlcnZlci1zaWRlIGluY2x1ZGVzIGFyZSBwZXJtaXR0ZWQuCi08ZHQ+SW5jbHVkZXNOT0VYRUMKLTxkZD4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBJbmNsdWRlc05PRVhFQ30gb3B0aW9uJmd0OyAtLT4KLVNlcnZlci1zaWRlIGluY2x1ZGVzIGFyZSBwZXJtaXR0ZWQsIGJ1dCB0aGUgI2V4ZWMgY29tbWFuZCBhbmQKLSNpbmNsdWRlIG9mIENHSSBzY3JpcHRzIGFyZSBkaXNhYmxlZC4KLTxkdD5JbmRleGVzCi08ZGQ+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgSW5kZXhlc30gb3B0aW9uJmd0OyAtLT4KLUlmIGEgVVJMIHdoaWNoIG1hcHMgdG8gYSBkaXJlY3RvcnkgaXMgcmVxdWVzdGVkLCBhbmQgdGhlIHRoZXJlIGlzIG5vCi1EaXJlY3RvcnlJbmRleCAoZS5nLiBpbmRleC5odG1sKSBpbiB0aGF0IGRpcmVjdG9yeSwgdGhlbiB0aGUgc2VydmVyIHdpbGwKLXJldHVybiBhIGZvcm1hdHRlZCBsaXN0aW5nIG9mIHRoZSBkaXJlY3RvcnkuCi08ZHQ+TXVsdGlWaWV3cwotPGRkPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IE11bHRpVmlld3N9IG9wdGlvbiZndDsgLS0+Ci08QSBIUkVGPSJjb250ZW50LW5lZ290aWF0aW9uLmh0bWwiPkNjb250ZW50IG5lZ290aWF0YWQ8L0E+IE11bHRpVmlld3MgYXJlCi1hbGxvd2VkLgotPGR0PlN5bUxpbmtzSWZPd25lck1hdGNoCi08ZGQ+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgU3ltTGlua3NJZk93bmVyTWF0Y2h9IG9wdGlvbiZndDsgLS0+Ci1UaGUgc2VydmVyIHdpbGwgb25seSBmb2xsb3cgc3ltYm9saWMgbGlua3MgZm9yIHdoaWNoIHRoZSB0YXJnZXQKLWZpbGUgb3IgZGlyZWN0b3J5IGlzIG93bmVkIGJ5IHRoZSBzYW1lIHVzZXIgaWQgYXMgdGhlIGxpbmsuCi08L2RsPgotCi1JZiBtdWx0aXBsZSBPcHRpb25zIGNvdWxkIGFwcGx5IHRvIGEgZGlyZWN0b3J5LCB0aGVuIHRoZSBtb3N0IHNwZWNpZmljIG9uZSBpcwotdGFrZW4gY29tcGxldGU7IHRoZSBvcHRpb25zIGFyZSBub3QgbWVyZ2VkLiBGb3IgZXhhbXBsZToKLTxibG9ja3F1b3RlPjxjb2RlPgotJmx0O0RpcmVjdG9yeSAvd2ViL2RvY3MmZ3Q7IDxicj4KLU9wdGlvbnMgSW5kZXhlcyBGb2xsb3dTeW1MaW5rczxicj4KLSZsdDsvRGlyZWN0b3J5Jmd0Ozxicj4KLSZsdDtEaXJlY3RvcnkgL3dlYi9kb2NzL3NwZWMmZ3Q7IDxicj4KLU9wdGlvbnMgSW5jbHVkZXM8YnI+Ci0mbHQ7L0RpcmVjdG9yeSZndDsKLTwvY29kZT48L2Jsb2NrcXVvdGU+Ci10aGVuIG9ubHkgPGNvZGU+SW5jbHVkZXM8L2NvZGU+IHdpbGwgYmUgc2V0IGZvciB0aGUgL3dlYi9kb2NzL3NwZWMKLWRpcmVjdG9yeS48cD48aHI+Ci0KLTxBIG5hbWU9InBpZGZpbGUiPjxoMj5QaWRGaWxlIGRpcmVjdGl2ZTwvaDI+PC9BPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IFBpZEZpbGV9IGRpcmVjdGl2ZSZndDsgLS0+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gUGlkRmlsZSA8ZW0+ZmlsZW5hbWU8L2VtPjxicj4KLTxzdHJvbmc+RGVmYXVsdDo8L3N0cm9uZz4gPGNvZGU+UGlkRmlsZSBsb2dzL2h0dHBkLnBpZDwvY29kZT48YnI+Ci08c3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWc8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gY29yZTxwPgotCi1UaGUgUGlkRmlsZSBkaXJlY3RpdmUgc2V0cyB0aGUgZmlsZSB0byB3aGljaCB0aGUgc2VydmVyIHJlY29yZHMgdGhlCi1wcm9jZXNzIGlkIG9mIHRoZSBkYWVtb24uIElmIHRoZSBmaWxlbmFtZSBkb2VzIG5vdCBiZWdpbiB3aXRoIGEgc2xhc2ggKC8pCi10aGVuIGl0IGlzIGFzc3VtZWQgdG8gYmUgcmVsYXRpdmUgdG8gdGhlIDxBIEhSRUY9IiNzZXJ2ZXJyb290Ij5TZXJ2ZXJSb290PC9BPi4KLVRoZSBQaWRGaWxlIGlzIG9ubHkgdXNlZCBpbiA8QSBIUkVGPSIjc2VydmVydHlwZSI+c3RhbmRhbG9uZTwvQT4gbW9kZS48cD4KLQotSXQgaXMgb2Z0ZW4gdXNlZnVsIHRvIGJlIGFibGUgdG8gc2VuZCB0aGUgc2VydmVyIGEgc2lnbmFsLCBzbyB0aGF0IGl0IGNsb3NlcwotYW5kIHRoZW4gcmVvcGVucyBpdHMgPEEgSFJFRj0iI2Vycm9ybG9nIj5FcnJvckxvZzwvQT4gYW5kIFRyYW5zZmVyTG9nLCBhbmQKLXJlLXJlYWRzIGl0cyBjb25maWd1cmF0aW9uIGZpbGVzLiBUaGlzIGlzIGRvbmUgYnkgc2VuZGluZyBhIFNJR0hVUCAoa2lsbCAtMSkKLXNpZ25hbCB0byB0aGUgcHJvY2VzcyBpZCBsaXN0ZWQgaW4gdGhlIFBpZEZpbGUuPHA+PGhyPgotCi08QSBuYW1lPSJwb3J0Ij48aDI+UG9ydCBkaXJlY3RpdmU8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBQb3J0fSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IFBvcnQgPGVtPm51bWJlcjwvZW0+PGJyPgotPHN0cm9uZz5EZWZhdWx0Ojwvc3Ryb25nPiA8Y29kZT5Qb3J0IDgwPC9jb2RlPjxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZzxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBjb3JlPHA+Ci0KLVRoZSBQb3J0IGRpcmVjdGl2ZSBzZXRzIHRoZSBuZXR3b3JrIHBvcnQgb24gd2hpY2ggdGhlIHNlcnZlciBsaXN0ZW5zLgotPGVtPk51bTwvZW0+IGlzIGEgbnVtYmVyIGZyb20gMCB0byA2NTUzNTsgc29tZSBwb3J0IG51bWJlcnMgKGVzcGVjaWFsbHkgYmVsb3cKLTEwMjQpIGFyZSByZXNlcnZlZCBmb3IgcGFydGljdWxhciBwcm90b2NvbHMuIFNlZSA8Y29kZT4vZXRjL3NlcnZpY2VzPC9jb2RlPgotZm9yIGEgbGlzdCBvZiBzb21lIGRlZmluZWQgcG9ydHM7IHRoZSBzdGFuZGFyZCBwb3J0IGZvciB0aGUgaHR0cCBwcm90b2NvbAotaXMgODAuPHA+Ci0KLVBvcnQgODAgaXMgb25lIG9mIFVuaXgncyBzcGVjaWFsIHBvcnRzLiBBbGwgcG9ydHMgbnVtYmVyZWQKLWJlbG93IDEwMjQgYXJlIHJlc2VydmVkIGZvciBzeXN0ZW0gdXNlLCBpLmUuIHJlZ3VsYXIgKG5vbi1yb290KSB1c2VycyBjYW5ub3QKLW1ha2UgdXNlIG9mIHRoZW07IGluc3RlYWQgdGhleSBjYW4gb25seSB1c2UgaGlnaGVyIHBvcnQgbnVtYmVycy48cD4KLQotVG8gdXNlIHBvcnQgODAsIHlvdSBtdXN0IHN0YXJ0IHRoZSBzZXJ2ZXIgZnJvbSB0aGUgcm9vdCBhY2NvdW50LgotQWZ0ZXIgYmluZGluZyB0byB0aGUgcG9ydCBhbmQgYmVmb3JlIGFjY2VwdGluZyByZXF1ZXN0cywgQXBhY2hlIHdpbGwgY2hhbmdlCi10byBhIGxvdyBwcml2aWxlZ2VkIHVzZXIgYXMgc2V0IGJ5IHRoZSA8QSBIUkVGPSIjdXNlciI+VXNlciBkaXJlY3RpdmU8L0E+LjxwPgotCi1JZiB5b3UgY2Fubm90IHVzZSBwb3J0IDgwLCBjaG9vc2UgYW55IG90aGVyIHVudXNlZCBwb3J0LiBOb24tcm9vdCB1c2Vycwotd2lsbCBoYXZlIHRvIGNob29zZSBhIHBvcnQgbnVtYmVyIGhpZ2hlciB0aGFuIDEwMjMsIHN1Y2ggYXMgODAwMC48cD4KLQotU0VDVVJJVFk6IGlmIHlvdSBkbyBzdGFydCB0aGUgc2VydmVyIGFzIHJvb3QsIGJlIHN1cmUKLW5vdCB0byBzZXQgPEEgSFJFRj0iI3VzZXIiPlVzZXI8L0E+IHRvIHJvb3QuIElmIHlvdSBydW4gdGhlIHNlcnZlciBhcwotcm9vdCB3aGlsc3QgaGFuZGxpbmcgY29ubmVjdGlvbnMsIHlvdXIgc2l0ZSBtYXkgYmUgb3BlbiB0byBhIG1ham9yIHNlY3VyaXR5Ci1hdHRhY2suPHA+PGhyPgotCi08QSBuYW1lPSJyZXF1aXJlIj48aDI+cmVxdWlyZSBkaXJlY3RpdmU8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCByZXF1aXJlfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IHJlcXVpcmUgPGVtPmVudGl0eS1uYW1lIGVudGl0eSBlbnRpdHkuLi48L2VtPjxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gZGlyZWN0b3J5LCAuaHRhY2Nlc3M8YnI+Ci08c3Ryb25nPk92ZXJyaWRlOjwvc3Ryb25nPiBBdXRoQ29uZmlnPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IGNvcmU8cD4KLQotVGhpcyBkaXJlY3RpdmUgc2VsZWN0cyB3aGljaCBhdXRoZW50aWNhdGVkIHVzZXJzIGNhbiBhY2Nlc3MgYSBkaXJlY3RvcnkuCi1UaGUgYWxsb3dlZCBzeW50YXhlcyBhcmU6Ci08dWw+Ci08bGk+cmVxdWlyZSB1c2VyIDxlbT51c2VyaWQgdXNlcmlkIC4uLjwvZW0+PHA+Ci1Pbmx5IHRoZSBuYW1lZCB1c2VycyBjYW4gYWNjZXNzIHRoZSBkaXJlY3RvcnkuPHA+Ci08bGk+cmVxdWlyZSBncm91cCA8ZW0+Z3JvdXAtbmFtZSBncm91cC1uYW1lIC4uLjwvZW0+PHA+Ci1Pbmx5IHVzZXJzIGluIHRoZSBuYW1lZCBncm91cHMgY2FuIGFjY2VzcyB0aGUgZGlyZWN0b3J5LjxwPgotPGxpPnJlcXVpcmUgdmFsaWQtdXNlcjxwPgotQWxsIHZhbGlkIHVzZXJzIGNhbiBhY2Nlc3MgdGhlIGRpcmVjdG9yeS4KLTwvdWw+Ci08cD4KLUlmIDxjb2RlPnJlcXVpcmU8L2NvZGU+IGFwcGVhcnMgaW4gYSA8QSBIUkVGPSIjbGltaXQiPiZsdDtMaW1pdCZndDs8L0E+Ci1zZWN0aW9uLCB0aGVuIGl0IHJlc3RyaWN0cyBhY2Nlc3MgdG8gdGhlIG5hbWVkIG1ldGhvZHMsIG90aGVyd2lzZQotaXQgcmVzdHJpY3RzIGFjY2VzcyBmb3IgYWxsIG1ldGhvZHMuIEV4YW1wbGU6Ci08YmxvY2txdW90ZT48Y29kZT4KLUF1dGhUeXBlIEJhc2ljPGJyPgotQXV0aE5hbWUgc29tZWRvbWFpbjxicj4KLUF1dGhVc2VyRmlsZSAvd2ViL3VzZXJzPGJyPgotQXV0aEdyb3VwRmlsZSAvd2ViL2dyb3Vwczxicj4KLUxpbWl0ICZsdDtHRVQgUE9TVCZndDs8YnI+Ci1yZXF1aXJlIGdyb3VwIGFkbWluPGJyPgotJmx0Oy9MaW1pdCZndDsKLTwvY29kZT48L2Jsb2NrcXVvdGU+Ci0KLVJlcXVpcmUgbXVzdCBiZSBhY2NvbXBhbmllZCBieSA8QSBIUkVGPSIjYXV0aG5hbWUiPkF1dGhOYW1lPC9BPiBhbmQKLTxBIEhSRUY9IiNhdXRodHlwZSI+QXV0aFR5cGU8L0E+IGRpcmVjdGl2ZXMsIGFuZCBkaXJlY3RpdmVzIHN1Y2ggYXMKLTxBIEhSRUY9Im1vZF9hdXRoLmh0bWwjYXV0aHVzZXJmaWxlIj5BdXRoVXNlckZpbGU8L0E+IGFuZAotPEEgSFJFRj0ibW9kX2F1dGguaHRtbCNhdXRoZ3JvdXBmaWxlIj5BdXRoR3JvdXBGaWxlPC9BPiAodG8gZGVmaW5lIHVzZXJzIGFuZAotZ3JvdXBzKSBpbiBvcmRlciB0byB3b3JrIGNvcnJlY3RseS48cD48aHI+Ci0KLTxBIG5hbWU9InJlc291cmNlY29uZmlnIj48aDI+UmVzb3VyY2VDb25maWcgZGlyZWN0aXZlPC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgUmVzb3VyY2VDb25maWd9IGRpcmVjdGl2ZSZndDsgLS0+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gUmVzb3VyY2VDb25maWcgPGVtPmZpbGVuYW1lPC9lbT48YnI+Ci08c3Ryb25nPkRlZmF1bHQ6PC9zdHJvbmc+IDxjb2RlPlJlc291cmNlQ29uZmlnIGNvbmYvc3JtLmNvbmY8L2NvZGU+PGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gY29yZTxwPgotCi1UaGUgc2VydmVyIHdpbGwgcmVhZCB0aGlzIGZpbGUgZm9yIG1vcmUgZGlyZWN0aXZlcyBhZnRlciByZWFkaW5nIHRoZQotaHR0cGQuY29uZiBmaWxlLiA8ZW0+RmlsZW5hbWU8L2VtPiBpcyByZWxhdGl2ZSB0byB0aGUKLTxBIEhSRUY9IiNzZXJ2ZXJyb290Ij5TZXJ2ZXJSb290PC9BPi4KLVRoaXMgZmVhdHVyZSBjYW4gYmUgZGlzYWJsZWQgdXNpbmc6Ci08YmxvY2txdW90ZT48Y29kZT5SZXNvdXJjZUNvbmZpZyAvZGV2L251bGw8L2NvZGU+PC9ibG9ja3F1b3RlPgotSGlzdG9yaWNhbGx5LCB0aGlzIGZpbGUgY29udGFpbmVkIG1vc3QgZGlyZWN0aXZlcyBleGNlcHQgZm9yIHNlcnZlcgotY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzIGFuZCA8QSBIUkVGPSIjZGlyZWN0b3J5Ij4mbHQ7RGlyZWN0b3J5Jmd0OzwvQT4uCi1zZWN0aW9uczsgaW4gZmFjdCBpdCBjYW4gbm93IGNvbnRhaW4gYW55IHNlcnZlciBkaXJlY3RpdmUgYWxsb3dlZCBpbiB0aGUKLTxlbT5zZXJ2ZXIgY29uZmlnPC9lbT4gY29udGV4dC48cD4KLQotU2VlIGFsc28gPEEgSFJFRj0iI2FjY2Vzc2NvbmZpZyI+QWNjZXNzQ29uZmlnPC9BPi48cD48aHI+Ci0KLTxBIG5hbWU9InNlcnZlcmFkbWluIj48aDI+U2VydmVyQWRtaW4gZGlyZWN0aXZlPC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgU2VydmVyQWRtaW59IGRpcmVjdGl2ZSZndDsgLS0+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gU2VydmVyQWRtaW4gPGVtPmVtYWlsLWFkZHJlc3M8L2VtPjxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IGNvcmU8cD4KLQotVGhlIFNlcnZlckFkbWluIHNldHMgdGhlIGUtbWFpbCBhZGRyZXNzIHRoYXQgdGhlIHNlcnZlciBpbmNsdWRlcyBpbiBhbnkKLWVycm9yIG1lc3NhZ2VzIGl0IHJldHVybnMgdG8gdGhlIGNsaWVudC48cD4KLQotSXQgbWF5IGJlIHdvcnRoIHNldHRpbmcgdXAgYSBkZWRpY2F0ZWQgYWRkcmVzcyBmb3IgdGhpcywgZS5nLgotPGJsb2NrcXVvdGU+PGNvZGU+U2VydmVyQWRtaW4gd3d3LWFkbWluQGZvby5iYXIuY29tPC9jb2RlPjwvYmxvY2txdW90ZT4KLWFzIHVzZXJzIGRvIG5vdCBhbHdheXMgbWVudGlvbiB0aGF0IHRoZXkgYXJlIHRhbGtpbmcgYWJvdXQgdGhlIHNlcnZlciE8cD48aHI+Ci0KLTxBIG5hbWU9InNlcnZlcmFsaWFzIj48aDI+U2VydmVyQWxpYXMgZGlyZWN0aXZlPC9oMj48L0E+Ci0KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBTZXJ2ZXJBbGlhcyA8ZW0+aG9zdDEgaG9zdDIgLi4uPC9lbT48YnI+Ci08c3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHZpcnR1YWwgaG9zdDxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBjb3JlPGJyPgotPHN0cm9uZz5Db21wYXRpYmlsaXR5Ojwvc3Ryb25nPiBTZXJ2ZXJBbGlhcyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUKLTEuMSBhbmQgbGF0ZXIuPHA+Ci0KLVRoZSBTZXJ2ZXJBbGlhcyBkaXJlY3RpdmUgc2V0cyB0aGUgYWx0ZXJuYXRlIG5hbWVzIGZvciBhIGhvc3QsIGZvciB1c2UKLXdpdGgKLTxhIGhyZWY9Imhvc3QuaHRtbCI+SG9zdC1oZWFkZXIgYmFzZWQgdmlydHVhbCBob3N0czwvYT4uCi0KLTxwPjxocj4KLQotPEEgbmFtZT0ic2VydmVybmFtZSI+PGgyPlNlcnZlck5hbWUgZGlyZWN0aXZlPC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgU2VydmVyTmFtZX0gZGlyZWN0aXZlJmd0OyAtLT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBTZXJ2ZXJOYW1lIDxlbT5mdWxseS1xdWFsaWZpZWQgZG9tYWluIG5hbWU8L2VtPjxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IGNvcmU8cD4KLQotVGhlIFNlcnZlck5hbWUgZGlyZWN0aXZlIHNldHMgdGhlIGhvc3RuYW1lIG9mIHRoZSBzZXJ2ZXI7IHRoaXMgaXMgb25seQotdXNlZCB3aGVuIGNyZWF0aW5nIHJlZGlyZWN0aW9uIFVSTHMuIElmIGl0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhlCi1zZXJ2ZXIgYXR0ZW1wdHMgdG8gZGVkdWNlIGl0IGZyb20gaXRzIG93biBJUCBhZGRyZXNzOyBob3dldmVyIHRoaXMgbWF5Ci1ub3Qgd29yayByZWxpYWJseSwgb3IgbWF5IG5vdCByZXR1cm4gdGhlIHByZWZlcnJlZCBob3N0bmFtZS4gRm9yIGV4YW1wbGU6Ci08YmxvY2txdW90ZT48Y29kZT5TZXJ2ZXJOYW1lIHd3dy53aWJibGUuY29tPC9jb2RlPjwvYmxvY2txdW90ZT4KLXdvdWxkIGJlIHVzZWQgaWYgdGhlIGNhbm9uaWNhbCAobWFpbikgbmFtZSBvZiB0aGUgYWN0dWFsIG1hY2hpbmUKLXdlcmUgPGNvZGU+bW9uc3Rlci53aWJibGUuY29tPC9jb2RlPi48cD48aHI+Ci0KLTxBIG5hbWU9InNlcnZlcnBhdGgiPjxoMj5TZXJ2ZXJQYXRoIGRpcmVjdGl2ZTwvaDI+PC9BPgotCi08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gU2VydmVyUGF0aCA8ZW0+cGF0aG5hbWU8L2VtPjxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gdmlydHVhbCBob3N0PGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IGNvcmU8YnI+Ci08c3Ryb25nPkNvbXBhdGliaWxpdHk6PC9zdHJvbmc+IFNlcnZlclBhdGggaXMgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlCi0xLjEgYW5kIGxhdGVyLjxwPgotCi1UaGUgU2VydmVyQWxpYXMgZGlyZWN0aXZlIHNldHMgdGhlIGxlZ2FjeSBVUkwgcGF0aG5hbWUgZm9yIGEgaG9zdCwgZm9yCi11c2Ugd2l0aCA8YSBocmVmPSJob3N0Lmh0bWwiPkhvc3QtaGVhZGVyIGJhc2VkIHZpcnR1YWwgaG9zdHM8L2E+LgotCi08QSBuYW1lPSJzZXJ2ZXJyb290Ij48aDI+U2VydmVyUm9vdCBkaXJlY3RpdmU8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBTZXJ2ZXJSb290fSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IFNlcnZlclJvb3QgPGVtPmRpcmVjdG9yeS1maWxlbmFtZTwvZW0+PGJyPgotPHN0cm9uZz5EZWZhdWx0Ojwvc3Ryb25nPiA8Y29kZT5TZXJ2ZXJSb290IC91c3IvbG9jYWwvZXRjL2h0dHBkPC9jb2RlPjxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZzxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBjb3JlPHA+Ci0KLVRoZSBTZXJ2ZXJSb290IGRpcmVjdGl2ZSBzZXRzIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIHNlcnZlciBsaXZlcy4KLVR5cGljYWxseSBpdCB3aWxsIGNvbnRhaW4gdGhlIHN1YmRpcmVjdG9yaWVzIDxjb2RlPmNvbmYvPC9jb2RlPiBhbmQKLTxjb2RlPmxvZ3MvPC9jb2RlPi4gUmVsYXRpdmUgcGF0aHMgZm9yIG90aGVyIGNvbmZpZ3VyYXRpb24gZmlsZXMgYXJlIHRha2VuCi1hcyByZWxhdGl2ZSB0byB0aGlzIGRpcmVjdG9yeS48cD48aHI+Ci0KLTxBIG5hbWU9InNlcnZlcnR5cGUiPjxoMj5TZXJ2ZXJUeXBlIGRpcmVjdGl2ZTwvaDI+PC9BPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IFNlcnZlclR5cGV9IGRpcmVjdGl2ZSZndDsgLS0+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gU2VydmVyVHlwZSA8ZW0+dHlwZTwvZW0+PGJyPgotPHN0cm9uZz5EZWZhdWx0Ojwvc3Ryb25nPiA8Y29kZT5TZXJ2ZXJUeXBlIHN0YW5kYWxvbmU8L2NvZGU+PGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IGNvcmU8cD4KLQotVGhlIFNlcnZlclR5cGUgZGlyZWN0aXZlIHNldHMgaG93IHRoZSBzZXJ2ZXIgaXMgZXhlY3V0ZWQgYnkgdGhlIHN5c3RlbS4KLTxlbT5UeXBlPC9lbT4gaXMgb25lIG9mCi08ZGw+Ci08ZHQ+aW5ldGQKLTxkZD5UaGUgc2VydmVyIHdpbGwgYmUgcnVuIGZyb20gdGhlIHN5c3RlbSBwcm9jZXNzIGluZXRkOyB0aGUgY29tbWFuZCB0byBzdGFydAotdGhlIHNlcnZlciBpcyBhZGRlZCB0byA8Y29kZT4vZXRjL2luZXRkLmNvbmY8L2NvZGU+Ci08ZHQ+c3RhbmRhbG9uZQotPGRkPlRoZSBzZXJ2ZXIgd2lsbCBydW4gYXMgYSBkYWVtb24gcHJvY2VzczsgdGhlIGNvbW1hbmQgdG8gc3RhcnQgdGhlIHNlcnZlcgotaXMgYWRkZWQgdG8gdGhlIHN5c3RlbSBzdGFydHVwIHNjcmlwdHMuICg8Y29kZT4vZXRjL3JjLmxvY2FsPC9jb2RlPiBvcgotPGNvZGU+L2V0Yy9yYzMuZC8uLi48L2NvZGU+LikKLTwvZGw+Ci0KLUluZXRkIGlzIHRoZSBsZXNzZXIgdXNlZCBvZiB0aGUgdHdvIG9wdGlvbnMuIEZvciBlYWNoIGh0dHAKLWNvbm5lY3Rpb24gcmVjZWl2ZWQsIGEgbmV3IGNvcHkgb2YgdGhlIHNlcnZlciBpcyBzdGFydGVkIGZyb20gc2NyYXRjaDsKLWFmdGVyIHRoZSBjb25uZWN0aW9uIGlzIGNvbXBsZXRlLCB0aGlzIHByb2dyYW0gZXhpdHMuIFRoZXJlIGlzIGEgaGlnaCBwcmljZSB0bwotcGF5IHBlciBjb25uZWN0aW9uLCBidXQgZm9yIHNlY3VyaXR5IHJlYXNvbnMsIHNvbWUgYWRtaW5zIHByZWZlciB0aGlzIG9wdGlvbi4KLTxwPgotCi1TdGFuZGFsb25lIGlzIHRoZSBtb3N0IGNvbW1vbiBzZXR0aW5nIGZvciBTZXJ2ZXJUeXBlIHNpbmNlCi1pdCBpcyBmYXIgbW9yZSBlZmZpY2llbnQuIFRoZSBzZXJ2ZXIgaXMgc3RhcnRlZCBvbmNlLCBhbmQgc2VydmljZXMgYWxsCi1zdWJzZXF1ZW50IGNvbm5lY3Rpb25zLiBJZiB5b3UgaW50ZW5kIHJ1bm5pbmcgQXBhY2hlIHRvIHNlcnZlIGEgYnVzeSBzaXRlLAotc3RhbmRhbG9uZSB3aWxsIHByb2JhYmx5IGJlIHlvdXIgb25seSBvcHRpb24uPHA+Ci0KLVNFQ1VSSVRZOiBpZiB5b3UgYXJlIHBhcmFub2lkIGFib3V0IHNlY3VyaXR5LCBydW4gaW4gaW5ldGQgbW9kZS4gU2VjdXJpdHkKLWNhbm5vdCBiZSBndWFyYW50ZWVkIGluIGVpdGhlciwgYnV0IHdoaWxzdCBtb3N0IHBlb3BsZSBhcmUgaGFwcHkgdG8gdXNlCi1zdGFuZGFsb25lLCBpbmV0ZCBpcyBwcm9iYWJseSBsZWFzdCBwcm9uZSB0byBhdHRhY2suPHA+PGhyPgotCi08QSBuYW1lPSJzdGFydHNlcnZlcnMiPjxoMj5TdGFydFNlcnZlcnMgZGlyZWN0aXZlPC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgU3RhcnRTZXJ2ZXJzfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IFN0YXJ0U2VydmVycyA8ZW0+bnVtYmVyPC9lbT48YnI+Ci08c3Ryb25nPkRlZmF1bHQ6PC9zdHJvbmc+IDxjb2RlPlN0YXJ0U2VydmVycyA1PC9jb2RlPjxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZzxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBjb3JlPHA+Ci0KLVRoZSBTdGFydFNlcnZlcnMgZGlyZWN0aXZlIHNldHMgdGhlIG51bWJlciBvZiBjaGlsZCBzZXJ2ZXIgcHJvY2Vzc2VzIGNyZWF0ZWQKLW9uIHN0YXJ0dXAuIEFzIHRoZSBudW1iZXIgb2YgcHJvY2Vzc2VzIGlzIGR5bmFtaWNhbGx5IGNvbnRyb2xsZWQgZGVwZW5kaW5nCi1vbiB0aGUgbG9hZCwgdGhlcmUgaXMgdXN1YWxseSBsaXR0bGUgcmVhc29uIHRvIGFkanVzdCB0aGlzIHBhcmFtZXRlci48cD4KLQotU2VlIGFsc28gPEEgSFJFRj0iI21pbnNwYXJlc2VydmVycyI+TWluU3BhcmVTZXJ2ZXJzPC9BPiBhbmQKLTxBIEhSRUY9IiNtYXhzcGFyZXNlcnZlcnMiPk1heFNwYXJlU2VydmVyczwvQT4uPHA+PGhyPgotCi08QSBuYW1lPSJ0aW1lb3V0Ij48aDI+VGltZU91dCBkaXJlY3RpdmU8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBUaW1lT3V0fSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IFRpbWVPdXQgPGVtPm51bWJlcjwvZW0+PGJyPgotPHN0cm9uZz5EZWZhdWx0Ojwvc3Ryb25nPiA8Y29kZT5UaW1lT3V0IDEyMDA8L2NvZGU+PGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IGNvcmU8cD4KLQotVGhlIFRpbWVPdXQgZGlyZWN0aXZlIHNldHMgdGhlIG1heGltdW0gdGltZSB0aGF0IHRoZSBzZXJ2ZXIgd2lsbCB3YWl0Ci1mb3IgdGhlIHJlY2VpcHQgb2YgYSByZXF1ZXN0IGFuZCB0aGUgY29tcGxldGlvbiBvZiBhIHJlcXVlc3QsIGluIHNlY29uZHMuCi1TbyBpZiBpdCB0YWtlcyBtb3JlIHRoYW4gVGltZU91dCBzZWNvbmRzIGZvciBhIGNsaWVudCB0byBzZW5kIGEgcmVxdWVzdCBvcgotcmVjZWl2ZSBhIHJlc3BvbnNlLCB0aGUgc2VydmVyIHdpbGwgYnJlYWsgb2ZmIHRoZSBjb25uZWN0aW9uLiBUaHVzIFRpbWVPdXQKLWxpbWl0cyB0aGUgbWF4aW11bSBhIHRyYW5zZmVyIGNhbiB0YWtlOyBmb3IgbGFyZ2UgZmlsZXMsIGFuZCBzbG93IG5ldHdvcmtzCi10cmFuc2ZlciB0aW1lcyBjYW4gYmUgbGFyZ2UuCi08cD48aHI+Ci0KLTxBIG5hbWU9InVzZXIiPjxoMj5Vc2VyIGRpcmVjdGl2ZTwvaDI+PC9BPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IFVzZXJ9IGRpcmVjdGl2ZSZndDsgLS0+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gVXNlciA8ZW0+dW5peC11c2VyaWQ8L2VtPjxicj4KLTxzdHJvbmc+RGVmYXVsdDo8L3N0cm9uZz4gPGNvZGU+VXNlciAjLTE8L2NvZGU+PGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IGNvcmU8cD4KLQotVGhlIFVzZXIgZGlyZWN0aXZlIHNldHMgdGhlIHVzZXJpZCBhcyB3aGljaCB0aGUgc2VydmVyIHdpbGwgYW5zd2VyIHJlcXVlc3RzLgotSW4gb3JkZXIgdG8gdXNlIHRoaXMgZGlyZWN0aXZlLCB0aGUgc3RhbmRhbG9uZSBzZXJ2ZXIgbXVzdCBiZSBydW4gaW5pdGlhbGx5Ci1hcyByb290LiA8ZW0+VW5peC11c2VyaWQ8L2VtPiBpcyBvbmUgb2Y6Ci08ZGw+Ci08ZHQ+QSB1c2VybmFtZQotPGRkPlJlZmVycyB0byB0aGUgZ2l2ZW4gdXNlciBieSBuYW1lLgotPGR0PiMgZm9sbG93ZWQgYnkgYSB1c2VyIG51bWJlci4KLTxkZD5SZWZlcnMgdG8gYSB1c2VyIGJ5IHRoZWlyIG51bWJlci4KLTwvZGw+Ci0KLVRoZSB1c2VyIHNob3VsZCBoYXZlIG5vIHByaXZpbGVnZXMgd2hpY2ggcmVzdWx0IGluIGl0IGJlaW5nIGFibGUgdG8gYWNjZXNzCi1maWxlcyB3aGljaCBhcmUgbm90IGludGVuZGVkIHRvIGJlIHZpc2libGUgdG8gdGhlIG91dHNpZGUgd29ybGQsIGFuZAotc2ltaWxhcmx5LCB0aGUgdXNlciBzaG91bGQgbm90IGJlIGFibGUgdG8gZXhlY3V0ZSBjb2RlIHdoaWNoIGlzIG5vdAotbWVhbnQgZm9yIGh0dHBkIHJlcXVlc3RzLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBzZXQgdXAgYSBuZXcgdXNlciBhbmQKLWdyb3VwIHNwZWNpZmljYWxseSBmb3IgcnVubmluZyB0aGUgc2VydmVyLiBTb21lIGFkbWlucyB1c2UgdXNlcgotPGNvZGU+bm9ib2R5PC9jb2RlPiwgYnV0IHRoaXMgaXMgbm90IGFsd2F5cyBwb3NzaWJsZSBvciBkZXNpcmFibGUuPHA+Ci0KLU5vdGVzOiBJZiB5b3Ugc3RhcnQgdGhlIHNlcnZlciBhcyBhIG5vbi1yb290IHVzZXIsIGl0IHdpbGwgZmFpbCB0byBjaGFuZ2UKLXRvIHRoZSBsZXNzZXIgcHJpdmlsZWdlZCB1c2VyLCBhbmQgd2lsbCBpbnN0ZWFkIGNvbnRpbnVlIHRvIHJ1biBhcwotdGhhdCBvcmlnaW5hbCB1c2VyLiBJZiB5b3UgZG8gc3RhcnQgdGhlIHNlcnZlciBhcyByb290LCB0aGVuIGl0IGlzIG5vcm1hbAotZm9yIHRoZSBwYXJlbnQgcHJvY2VzcyB0byByZW1haW4gcnVubmluZyBhcyByb290LjxwPgotCi1TRUNVUklUWTogRG9uJ3Qgc2V0IFVzZXIgKG9yIDxBIEhSRUY9IiNncm91cCI+R3JvdXA8L0E+KSB0bwotPGNvZGU+cm9vdDwvY29kZT4gdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkgd2hhdCB5b3UgYXJlIGRvaW5nLCBhbmQgd2hhdCB0aGUKLWRhbmdlcnMgYXJlLjxwPjxocj4KLQotPEEgbmFtZT0idmlydHVhbGhvc3QiPjxoMj4mbHQ7VmlydHVhbEhvc3QmZ3Q7IGRpcmVjdGl2ZTwvaDI+PC9BPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IFZpcnR1YWxIb3N0fSBzZWN0aW9uIGRpcmVjdGl2ZSZndDsgLS0+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gJmx0O1ZpcnR1YWxIb3N0IDxlbT5hZGRyPC9lbT5bOjxlbT5wb3J0PC9lbT5dJmd0OyAuLi4KLSZsdDsvVmlydHVhbEhvc3QmZ3Q7IDxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZzxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBDb3JlLiA8cD4KLQotJmx0O1ZpcnR1YWxIb3N0Jmd0OyBhbmQgJmx0Oy9WaXJ0dWFsSG9zdCZndDsgYXJlIHVzZWQgdG8gZW5jbG9zZSBhIGdyb3VwIG9mCi1kaXJlY3RpdmVzIHdoaWNoIHdpbGwgYXBwbHkgb25seSB0byBhIHBhcnRpY3VsYXIgdmlydHVhbCBob3N0LgotQW55IGRpcmVjdGl2ZSB3aGljaCBpcyBhbGxvd2VkIGluIGEgdmlydHVhbCBob3N0IGNvbnRleHQgbWF5IGJlIHVzZWQuIAotV2hlbiB0aGUgc2VydmVyIHJlY2VpdmVzIGEgcmVxdWVzdCBmb3IgYSBkb2N1bWVudCBvbiBhIHBhcnRpY3VsYXIgdmlydHVhbAotaG9zdCwgaXQgdXNlcyB0aGUgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzIGVuY2xvc2VkIGluIHRoZSAmbHQ7VmlydHVhbEhvc3QmZ3Q7Ci1zZWN0aW9uLiA8ZW0+QWRkcjwvZW0+IGNhbiBiZQotPG1lbnU+Ci08bGk+VGhlIElQIGFkZHJlc3Mgb2YgdGhlIHZpcnR1YWwgaG9zdAotPGxpPkEgZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lIGZvciB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgdmlydHVhbCBob3N0LgotPC9tZW51PiBFeGFtcGxlOgotPGJsb2NrcXVvdGU+Ci08Y29kZT4KLSZsdDtWaXJ0dWFsSG9zdCBob3N0LmZvby5jb20mZ3Q7IDxicj4KLVNlcnZlckFkbWluIHdlYm1hc3RlckBob3N0LmZvby5jb20gPGJyPgotRG9jdW1lbnRSb290IC93d3cvZG9jcy9ob3N0LmZvby5jb20gPGJyPgotU2VydmVyTmFtZSBob3N0LmZvby5jb20gPGJyPgotRXJyb3JMb2cgbG9ncy9ob3N0LmZvby5jb20tZXJyb3JfbG9nIDxicj4KLVRyYW5zZmVyTG9nIGxvZ3MvaG9zdC5mb28uY29tLWFjY2Vzc19sb2cgPGJyPgotJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLTwvY29kZT48L2Jsb2NrcXVvdGU+Ci0KLUN1cnJlbnRseSwgZWFjaCBWaXJ0dWFsSG9zdCBtdXN0IGNvcnJlc3BvbmQgdG8gYSBkaWZmZXJlbnQgSVAgYWRkcmVzcyBmb3IKLXRoZSBzZXJ2ZXIsIHNvIHRoZSBzZXJ2ZXIgbWFjaGluZSBtdXN0IGJlIGNvbmZpZ3VyZWQgdG8gYWNjZXB0IElQIHBhY2tldHMgZm9yCi1tdWx0aXBsZSBhZGRyZXNzZXMuIElmIHRoZSBtYWNoaW5lIGRvZXMgbm90IGhhdmUgbXVsdGlwbGUgbmV0d29yayBpbnRlcmZhY2VzLAotdGhlbiB0aGlzIGNhbiBiZSBhY2NvbXBsaXNoZWQgd2l0aCB0aGUgPGNvZGU+aWZjb25maWcgYWxpYXM8L2NvZGU+IGNvbW1hbmQKLShpZiB5b3VyIE9TIHN1cHBvcnRzIGl0KSwgb3Igd2l0aCBrZXJuZWwgcGF0Y2hlcyBsaWtlCi08QSBIUkVGPSJ2aWYuaW5mby50eHQiPlZJRjwvQT4gKGZvciBTdW5PUyhUTSkgNC4xLngpLjxwPgotCi08IS0tJWh5cGVydGV4dCAtLT4KLTxwPjxzdHJvbmc+U2VlIGFsc286PC9zdHJvbmc+Ci08QSBIUkVGPSJ2aXJ0dWFsLWhvc3QuaHRtbCI+SW5mb3JtYXRpb24gb24gVmlydHVhbCBIb3N0cy4KLShtdWx0aWhvbWUpPC9BPjxicj4KLTxzdHJvbmc+U2VlIGFsc286PC9zdHJvbmc+Ci08YSBocmVmPSJob3N0Lmh0bWwiPk5vbi1JUCBhZGRyZXNzLWJhc2VkIFZpcnR1YWwgSG9zdHM8L2E+Ci08IS0tLyVoeXBlcnRleHQgLS0+PC9wPgotCi08aHI+Ci0KLTwhLS0laHlwZXJ0ZXh0IC0tPgotPEEgSFJFRj0iLi4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9ob21lLmdpZiIgQUxUPSJIb21lIj48L0E+Ci08QSBIUkVGPSIuLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfaW5kZXguZ2lmIiBBTFQ9IkluZGV4Ij48L0E+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KLTwhLS0vJWh5cGVydGV4dCAtLT4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9jb3JlLnhtbCBiL2RvY3MvbWFudWFsL21vZC9jb3JlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViNjUyNy4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvY29yZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIHhtbDptYW51YWwgWyA8IUVOVElUWSBuYnNwICImIzE2MDsiPiBdPgotPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iLi4vc3R5bGUvbWFudWFsLnhzbCI/PgotPG1vZHVsZXN5bm9wc2lzPgotCi08bmFtZT5jb3JlPC9uYW1lPgotPHN0YXR1cz5Db3JlPC9zdGF0dXM+Ci08ZGVzY3JpcHRpb24+Q29yZSBBcGFjaGUgSFRUUCBTZXJ2ZXIgZmVhdHVyZXMgdGhhdCBhcmUgYWx3YXlzCi1hdmFpbGFibGU8L2Rlc2NyaXB0aW9uPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5BY2NlcHRQYXRoSW5mbzwvbmFtZT4KLTxkZXNjcmlwdGlvbj5Db250cm9scyB3aGV0aGVyIHJlcXVlc3RzIGNhbiBjb250YWluIHRyYWlsaW5nIHBhdGhuYW1lIGluZm9ybWF0aW9uPC9kZXNjcmlwdGlvbj4gICAgCi08c3ludGF4PkFjY2VwdFBhdGhJbmZvIE9ufE9mZnxEZWZhdWx0PC9zeW50YXg+Ci08ZGVmYXVsdD5BY2NlcHRQYXRoSW5mbyBEZWZhdWx0PC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+Ci08Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+PGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0PgotPGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci08Y29tcGF0aWJpbGl0eT5BdmFpbGFibGUgaW4gQXBhY2hlIDIuMC4zMCBhbmQgbGF0ZXI8L2NvbXBhdGliaWxpdHk+Ci0KLTx1c2FnZT4KLQotICAgIDxwPlRoaXMgZGlyZWN0aXZlIGNvbnRyb2xzIHdoZXRoZXIgcmVxdWVzdHMgdGhhdCBjb250YWluIHRyYWlsaW5nCi0gICAgcGF0aG5hbWUgaW5mb3JtYXRpb24gdGhhdCBmb2xsb3dzIGFuIGFjdHVhbCBmaWxlbmFtZSAob3IKLSAgICBub24tZXhpc3RlbnQgZmlsZSBpbiBhbiBleGlzdGluZyBkaXJlY3RvcnkpIHdpbGwgYmUgYWNjZXB0ZWQgb3IKLSAgICByZWplY3RlZC4gIFRoZSB0cmFpbGluZyBwYXRobmFtZSBpbmZvcm1hdGlvbiBjYW4gYmUgbWFkZQotICAgIGF2YWlsYWJsZSB0byBzY3JpcHRzIGluIHRoZSBQQVRIX0lORk8gZW52aXJvbm1lbnQgdmFyaWFibGUuPC9wPgotCi0gICAgPHA+Rm9yIGV4YW1wbGUsIGFzc3VtZSB0aGUgbG9jYXRpb24gPGNvZGU+L3Rlc3QvPC9jb2RlPiBwb2ludHMgdG8KLSAgICBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIHNpbmdsZSBmaWxlCi0gICAgPGNvZGU+aGVyZS5odG1sPC9jb2RlPi4gIFRoZW4gcmVxdWVzdHMgZm9yCi0gICAgPGNvZGU+L3Rlc3QvaGVyZS5odG1sL21vcmU8L2NvZGU+IGFuZAotICAgIDxjb2RlPi90ZXN0L25vdGhlcmUuaHRtbC9tb3JlPC9jb2RlPiBib3RoIGNvbGxlY3QKLSAgICA8Y29kZT4vbW9yZTwvY29kZT4gYXMgUEFUSF9JTkZPLjwvcD4KLQotICAgIDxwPlRoZSB0aHJlZSBwb3NzaWJsZSBhcmd1bWVudHMgZm9yIHRoZQotICAgIDxkaXJlY3RpdmU+QWNjZXB0UGF0aEluZm88L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIGFyZTo8L3A+Ci0gICAgPGRsPgotICAgIDxkdD48Y29kZT5vZmY8L2NvZGU+PC9kdD48ZGQ+QSByZXF1ZXN0IHdpbGwgb25seSBiZSBhY2NlcHRlZCBpZiBpdAotICAgIG1hcHMgdG8gYSBsaXRlcmFsIHBhdGggdGhhdCBleGlzdHMuICBUaGVyZWZvcmUgYSByZXF1ZXN0IHdpdGgKLSAgICB0cmFpbGluZyBwYXRobmFtZSBpbmZvcm1hdGlvbiBhZnRlciB0aGUgdHJ1ZSBmaWxlbmFtZSBzdWNoIGFzCi0gICAgPGNvZGU+L3Rlc3QvaGVyZS5odG1sL21vcmU8L2NvZGU+IGluIHRoZSBhYm92ZSBleGFtcGxlIHdpbGwgcmV0dXJuCi0gICAgYSA0MDQgTk9UIEZPVU5EIGVycm9yLjwvZGQ+Ci0KLSAgICA8ZHQ+PGNvZGU+b248L2NvZGU+PC9kdD48ZGQ+QSByZXF1ZXN0IHdpbGwgYmUgYWNjZXB0ZWQgaWYgYQotICAgIGxlYWRpbmcgcGF0aCBjb21wb25lbnQgbWFwcyB0byBhIGZpbGUgdGhhdCBleGlzdHMuICBUaGUgYWJvdmUKLSAgICBleGFtcGxlIDxjb2RlPi90ZXN0L2hlcmUuaHRtbC9tb3JlPC9jb2RlPiB3aWxsIGJlIGFjY2VwdGVkIGlmCi0gICAgPGNvZGU+L3Rlc3QvaGVyZS5odG1sPC9jb2RlPiBtYXBzIHRvIGEgdmFsaWQgZmlsZS48L2RkPgotICAgIAotICAgIDxkdD48Y29kZT5kZWZhdWx0PC9jb2RlPjwvZHQ+PGRkPlRoZSB0cmVhdG1lbnQgb2YgcmVxdWVzdHMgd2l0aAotICAgIHRyYWlsaW5nIHBhdGhuYW1lIGluZm9ybWF0aW9uIGlzIGRldGVybWluZWQgYnkgdGhlIDxhCi0gICAgaHJlZj0iLi4vaGFuZGxlci5odG1sIj5oYW5kbGVyPC9hPiByZXNwb25zaWJsZSBmb3IgdGhlIHJlcXVlc3QuCi0gICAgVGhlIGNvcmUgaGFuZGxlciBmb3Igbm9ybWFsIGZpbGVzIGRlZmF1bHRzIHRvIHJlamVjdGluZyBQQVRIX0lORk8uCi0gICAgSGFuZGxlcnMgdGhhdCBzZXJ2ZSBzY3JpcHRzLCBzdWNoIGFzIDxhCi0gICAgaHJlZj0ibW9kX2NnaS5odG1sIj5jZ2ktc2NyaXB0PC9hPiBhbmQgPGEKLSAgICBocmVmPSJtb2RfaXNhcGkuaHRtbCI+aXNhcGktaXNhPC9hPiwgZ2VuZXJhbGx5IGFjY2VwdCBQQVRIX0lORk8gYnkKLSAgICBkZWZhdWx0LjwvZGQ+Ci0gICAgPC9kbD4KLQotICAgIDxwPlRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhlIDxjb2RlPkFjY2VwdFBhdGhJbmZvPC9jb2RlPgotICAgIGRpcmVjdGl2ZSBpcyB0byBhbGxvdyB5b3UgdG8gb3ZlcnJpZGUgdGhlIGhhbmRsZXIncyBjaG9pY2Ugb2YKLSAgICBhY2NlcHRpbmcgb3IgcmVqZWN0aW5nIFBBVEhfSU5GTy4gIFRoaXMgb3ZlcnJpZGUgaXMgcmVxdWlyZWQsIGZvcgotICAgIGV4YW1wbGUsIHdoZW4geW91IHVzZSBhIDxhIGhyZWY9Ii4uL2ZpbHRlci5odG1sIj5maWx0ZXI8L2E+LCBzdWNoCi0gICAgYXMgPGEgaHJlZj0ibW9kX2luY2x1ZGUuaHRtbCI+SU5DTFVERVM8L2E+LCB0byBnZW5lcmF0ZSBjb250ZW50Ci0gICAgYmFzZWQgb24gUEFUSF9JTkZPLiAgVGhlIGNvcmUgaGFuZGxlciB3b3VsZCB1c3VhbGx5IHJlamVjdCB0aGUKLSAgICByZXF1ZXN0LCBzbyB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gdG8gZW5hYmxlCi0gICAgc3VjaCBhIHNjcmlwdDo8L3A+Ci08ZXhhbXBsZT4KLSZsdDtGaWxlcyAibXlwYXRocy5zaHRtbCImZ3Q7PGJyIC8+Ci0gICAgT3B0aW9ucyArSW5jbHVkZXM8YnIgLz4KLSAgICBTZXRPdXRwdXRGaWx0ZXIgSU5DTFVERVM8YnIgLz4KLSAgICBBY2NlcHRQYXRoSW5mbyBvbjxiciAvPgotJmx0Oy9GaWxlcyZndDsKLTwvZXhhbXBsZT4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5BY2Nlc3NGaWxlTmFtZTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5TZXRzIHRoZSBuYW1lIG9mIHRoZSAuaHRhY2Nlc3MgZmlsZTwvZGVzY3JpcHRpb24+Ci08c3ludGF4PkFjY2Vzc0ZpbGVOYW1lIDxlbT5maWxlbmFtZTwvZW0+IFs8ZW0+ZmlsZW5hbWU8L2VtPl0gLi4uPC9zeW50YXg+Ci08ZGVmYXVsdD5BY2Nlc3NGaWxlTmFtZSAuaHRhY2Nlc3M8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+V2hlbiByZXR1cm5pbmcgYSBkb2N1bWVudCB0byB0aGUgY2xpZW50IHRoZSBzZXJ2ZXIgbG9va3MgZm9yCi0gICAgdGhlIGZpcnN0IGV4aXN0aW5nIGFjY2VzcyBjb250cm9sIGZpbGUgZnJvbSB0aGlzIGxpc3Qgb2YgbmFtZXMKLSAgICBpbiBldmVyeSBkaXJlY3Rvcnkgb2YgdGhlIHBhdGggdG8gdGhlIGRvY3VtZW50LCBpZiBhY2Nlc3MKLSAgICBjb250cm9sIGZpbGVzIGFyZSBlbmFibGVkIGZvciB0aGF0IGRpcmVjdG9yeS4gRm9yIGV4YW1wbGU6PC9wPgotCi08ZXhhbXBsZT4KLUFjY2Vzc0ZpbGVOYW1lIC5hY2wKLTwvZXhhbXBsZT4KLQotICAgIDxwPmJlZm9yZSByZXR1cm5pbmcgdGhlIGRvY3VtZW50Ci0gICAgPGNvZGU+L3Vzci9sb2NhbC93ZWIvaW5kZXguaHRtbDwvY29kZT4sIHRoZSBzZXJ2ZXIgd2lsbCByZWFkCi0gICAgPGNvZGU+Ly5hY2w8L2NvZGU+LCA8Y29kZT4vdXNyLy5hY2w8L2NvZGU+LAotICAgIDxjb2RlPi91c3IvbG9jYWwvLmFjbDwvY29kZT4gYW5kIDxjb2RlPi91c3IvbG9jYWwvd2ViLy5hY2w8L2NvZGU+Ci0gICAgZm9yIGRpcmVjdGl2ZXMsIHVubGVzcyB0aGV5IGhhdmUgYmVlbiBkaXNhYmxlZCB3aXRoPC9wPgotCi08ZXhhbXBsZT4KLSZsdDtEaXJlY3RvcnkgLyZndDs8YnIgLz4KLSZuYnNwOyZuYnNwO0FsbG93T3ZlcnJpZGUgTm9uZTxiciAvPgotJmx0Oy9EaXJlY3RvcnkmZ3Q7Ci08L2V4YW1wbGU+Ci08L3VzYWdlPgotPHNlZWFsc28+PGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiPkFsbG93T3ZlcnJpZGU8L2RpcmVjdGl2ZT48L3NlZWFsc28+Ci08c2VlYWxzbz48YSBocmVmPSIuLi9jb25maWd1cmluZy5odG1sIj5Db25maWd1cmF0aW9uIEZpbGVzPC9hPjwvc2VlYWxzbz4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkFkZERlZmF1bHRDaGFyc2V0PC9uYW1lPgotPGRlc2NyaXB0aW9uPlNwZWNpZmllcyB0aGUgZGVmYXVsdCBjaGFyYWN0ZXIgc2V0IHRvIGJlIGFkZGVkIGZvciBhCi1yZXNwb25zZSB3aXRob3V0IGFuIGV4cGxpY2l0IGNoYXJhY3RlciBzZXQ8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5BZGREZWZhdWx0Q2hhcnNldCBPbnxPZmZ8PGVtPmNoYXJzZXQ8L2VtPjwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+Ci08Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+PGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0PgotPGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci08ZGVmYXVsdD5BZGREZWZhdWx0Q2hhcnNldCBPZmY8L2RlZmF1bHQ+Ci0KLTx1c2FnZT4KLQotICAgIDxwPlRoaXMgZGlyZWN0aXZlIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgY2hhcmFjdGVyIHNldCB0aGF0Ci0gICAgd2lsbCBiZSBhZGRlZCB0byBhbnkgcmVzcG9uc2UgdGhhdCBkb2VzIG5vdCBoYXZlIGFueSBwYXJhbWV0ZXIgb24KLSAgICB0aGUgY29udGVudCB0eXBlIGluIHRoZSBIVFRQIGhlYWRlcnMuIFRoaXMgd2lsbCBvdmVycmlkZSBhbnkKLSAgICBjaGFyYWN0ZXIgc2V0IHNwZWNpZmllZCBpbiB0aGUgYm9keSBvZiB0aGUgZG9jdW1lbnQgdmlhIGEKLSAgICA8Y29kZT5NRVRBPC9jb2RlPiB0YWcuIEEgc2V0dGluZyBvZiA8Y29kZT5BZGREZWZhdWx0Q2hhcnNldAotICAgIE9mZjwvY29kZT4gZGlzYWJsZXMgdGhpcwotICAgIGZ1bmN0aW9uYWxpdHkuIDxjb2RlPkFkZERlZmF1bHRDaGFyc2V0IE9uPC9jb2RlPiBlbmFibGVzCi0gICAgQXBhY2hlJ3MgaW50ZXJuYWwgZGVmYXVsdCBjaGFyc2V0IG9mIDxjb2RlPmlzby04ODU5LTE8L2NvZGU+IGFzCi0gICAgcmVxdWlyZWQgYnkgdGhlIGRpcmVjdGl2ZS4gWW91IGNhbiBhbHNvIHNwZWNpZnkgYW4gYWx0ZXJuYXRlCi0gICAgPGVtPmNoYXJzZXQ8L2VtPiB0byBiZSB1c2VkLiBGb3IgZXhhbXBsZTo8L3A+Ci0KLTxleGFtcGxlPgotICAgIEFkZERlZmF1bHRDaGFyc2V0IHV0Zi04Ci08L2V4YW1wbGU+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+QWRkTW9kdWxlPC9uYW1lPgotPHN5bnRheD5BZGRNb2R1bGUgPGVtPm1vZHVsZTwvZW0+IFs8ZW0+bW9kdWxlPC9lbT5dIC4uLjwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoZSBzZXJ2ZXIgY2FuIGhhdmUgbW9kdWxlcyBjb21waWxlZCBpbiB3aGljaCBhcmUgbm90Ci0gICAgYWN0aXZlbHkgaW4gdXNlLiBUaGlzIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBlbmFibGUgdGhlIHVzZQotICAgIG9mIHRob3NlIG1vZHVsZXMuIFRoZSBzZXJ2ZXIgY29tZXMgd2l0aCBhIHByZS1sb2FkZWQgbGlzdCBvZgotICAgIGFjdGl2ZSBtb2R1bGVzOyB0aGlzIGxpc3QgY2FuIGJlIGNsZWFyZWQgd2l0aCB0aGUgPGRpcmVjdGl2ZQotICAgIG1vZHVsZT0iY29yZSI+Q2xlYXJNb2R1bGVMaXN0PC9kaXJlY3RpdmU+IGRpcmVjdGl2ZS48L3A+Ci0KLSAgICA8cD5Gb3IgZXhhbXBsZTo8L3A+Ci08ZXhhbXBsZT4KLUFkZERlZmF1bHRDaGFyc2V0IHV0Zi04Ci08L2V4YW1wbGU+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+QWxsb3dPdmVycmlkZTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5TZXRzIHRoZSB0eXBlcyBvZiBkaXJlY3RpdmVzIHRoYXQgYXJlIGFsbG93ZWQgaW4KLS5odGFjY2VzcyBmaWxlczwvZGVzY3JpcHRpb24+Ci08c3ludGF4PkFsbG93T3ZlcnJpZGUgQWxsfE5vbmV8PGVtPmRpcmVjdGl2ZS10eXBlPC9lbT4gWzxlbT5kaXJlY3RpdmUtdHlwZTwvZW0+XSAuLi48L3N5bnRheD4KLTxkZWZhdWx0PkFsbG93T3ZlcnJpZGUgQWxsPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+V2hlbiB0aGUgc2VydmVyIGZpbmRzIGFuIC5odGFjY2VzcyBmaWxlIChhcyBzcGVjaWZpZWQgYnkgPGRpcmVjdGl2ZQotICAgIG1vZHVsZT0iY29yZSI+QWNjZXNzRmlsZU5hbWU8L2RpcmVjdGl2ZT4pIGl0IG5lZWRzIHRvIGtub3cKLSAgICB3aGljaCBkaXJlY3RpdmVzIGRlY2xhcmVkIGluIHRoYXQgZmlsZSBjYW4gb3ZlcnJpZGUgZWFybGllcgotICAgIGFjY2VzcyBpbmZvcm1hdGlvbi48L3A+Ci0KLSAgICA8cD5XaGVuIHRoaXMgZGlyZWN0aXZlIGlzIHNldCB0byA8Y29kZT5Ob25lPC9jb2RlPiwgdGhlbgotICAgIC5odGFjY2VzcyBmaWxlcyBhcmUgY29tcGxldGVseSBpZ25vcmVkLiBJbiB0aGlzIGNhc2UsIHRoZQotICAgIHNlcnZlciB3aWxsIG5vdCBldmVuIGF0dGVtcHQgdG8gcmVhZCAuaHRhY2Nlc3MgZmlsZXMgaW4gdGhlCi0gICAgZmlsZXN5c3RlbS48L3A+Ci0KLSAgICA8cD5XaGVuIHRoaXMgZGlyZWN0aXZlIGlzIHNldCB0byA8Y29kZT5BbGw8L2NvZGU+LCB0aGVuIGFueQotICAgIGRpcmVjdGl2ZSB3aGljaCBoYXMgdGhlIC5odGFjY2VzcyA8YQotICAgIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCI+Q29udGV4dDwvYT4gaXMgYWxsb3dlZCBpbgotICAgIC5odGFjY2VzcyBmaWxlcy48L3A+Ci0KLSAgICA8cD5UaGUgPGVtPmRpcmVjdGl2ZS10eXBlPC9lbT4gY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nCi0gICAgZ3JvdXBpbmdzIG9mIGRpcmVjdGl2ZXMuPC9wPgotCi0gICAgPGRsPgotICAgICAgPGR0PkF1dGhDb25maWc8L2R0PgotCi0gICAgICA8ZGQ+Ci0KLSAgICAgIEFsbG93IHVzZSBvZiB0aGUgYXV0aG9yaXphdGlvbiBkaXJlY3RpdmVzICg8ZGlyZWN0aXZlCi0gICAgICBtb2R1bGU9Im1vZF9hdXRoX2RibSI+QXV0aERCTUdyb3VwRmlsZTwvZGlyZWN0aXZlPiwKLSAgICAgIDxkaXJlY3RpdmUgbW9kdWxlPSJtb2RfYXV0aF9kYm0iPkF1dGhEQk1Vc2VyRmlsZTwvZGlyZWN0aXZlPiwKLSAgICAgIDxkaXJlY3RpdmUgbW9kdWxlPSJtb2RfYXV0aCI+QXV0aEdyb3VwRmlsZTwvZGlyZWN0aXZlPiwKLSAgICAgIDxkaXJlY3RpdmUgbW9kdWxlPSJjb3JlIj5BdXRoTmFtZTwvZGlyZWN0aXZlPiwgCi0gICAgICA8ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSI+QXV0aFR5cGU8L2RpcmVjdGl2ZT4sIDxkaXJlY3RpdmUKLSAgICAgIG1vZHVsZT0ibW9kX2F1dGgiPkF1dGhVc2VyRmlsZTwvZGlyZWN0aXZlPiwgPGRpcmVjdGl2ZQotICAgICAgbW9kdWxlPSJjb3JlIj5SZXF1aXJlPC9kaXJlY3RpdmU+LCA8ZW0+ZXRjLjwvZW0+KS48L2RkPgotCi0gICAgICA8ZHQ+RmlsZUluZm88L2R0PgotCi0gICAgICA8ZGQ+Ci0gICAgICBBbGxvdyB1c2Ugb2YgdGhlIGRpcmVjdGl2ZXMgY29udHJvbGxpbmcgZG9jdW1lbnQgdHlwZXMgKDxkaXJlY3RpdmUKLSAgICAgIG1vZHVsZT0iY29yZSI+RGVmYXVsdFR5cGU8L2RpcmVjdGl2ZT4sIDxkaXJlY3RpdmUKLSAgICAgIG1vZHVsZT0iY29yZSI+RXJyb3JEb2N1bWVudDwvZGlyZWN0aXZlPiwgPGRpcmVjdGl2ZQotICAgICAgbW9kdWxlPSJjb3JlIj5Gb3JjZVR5cGU8L2RpcmVjdGl2ZT4sIDxkaXJlY3RpdmUKLSAgICAgIG1vZHVsZT0ibW9kX25lZ290aWF0aW9uIj5MYW5ndWFnZVByaW9yaXR5PC9kaXJlY3RpdmU+LAotICAgICAgPGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiPlNldEhhbmRsZXI8L2RpcmVjdGl2ZT4sIDxkaXJlY3RpdmUKLSAgICAgIG1vZHVsZT0iY29yZSI+U2V0SW5wdXRGaWx0ZXI8L2RpcmVjdGl2ZT4sIDxkaXJlY3RpdmUKLSAgICAgIG1vZHVsZT0iY29yZSI+U2V0T3V0cHV0RmlsdGVyPC9kaXJlY3RpdmU+LCBhbmQgCi0gICAgICA8bW9kdWxlPm1vZF9taW1lPC9tb2R1bGU+IEFkZCogYW5kIFJlbW92ZSoKLSAgICAgIGRpcmVjdGl2ZXMsIDxlbT5ldGMuPC9lbT4pLjwvZGQ+Ci0KLSAgICAgIDxkdD5JbmRleGVzPC9kdD4KLQotICAgICAgPGRkPgotICAgICAgQWxsb3cgdXNlIG9mIHRoZSBkaXJlY3RpdmVzIGNvbnRyb2xsaW5nIGRpcmVjdG9yeSBpbmRleGluZwotICAgICAgKDxkaXJlY3RpdmUKLSAgICAgIG1vZHVsZT0ibW9kX2F1dG9pbmRleCI+QWRkRGVzY3JpcHRpb248L2RpcmVjdGl2ZT4sCi0gICAgICA8ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX2F1dG9pbmRleCI+QWRkSWNvbjwvZGlyZWN0aXZlPiwgPGRpcmVjdGl2ZQotICAgICAgbW9kdWxlPSJtb2RfYXV0b2luZGV4Ij5BZGRJY29uQnlFbmNvZGluZzwvZGlyZWN0aXZlPiwKLSAgICAgIDxkaXJlY3RpdmUgbW9kdWxlPSJtb2RfYXV0b2luZGV4Ij5BZGRJY29uQnlUeXBlPC9kaXJlY3RpdmU+LAotICAgICAgPGRpcmVjdGl2ZSBtb2R1bGU9Im1vZF9hdXRvaW5kZXgiPkRlZmF1bHRJY29uPC9kaXJlY3RpdmU+LCA8ZGlyZWN0aXZlCi0gICAgICBtb2R1bGU9Im1vZF9kaXIiPkRpcmVjdG9yeUluZGV4PC9kaXJlY3RpdmU+LCA8ZGlyZWN0aXZlCi0gICAgICBtb2R1bGU9Im1vZF9hdXRvaW5kZXgiPkZhbmN5SW5kZXhpbmc8L2RpcmVjdGl2ZT4sIDxkaXJlY3RpdmUKLSAgICAgIG1vZHVsZT0ibW9kX2F1dG9pbmRleCI+SGVhZGVyTmFtZTwvZGlyZWN0aXZlPiwgPGRpcmVjdGl2ZQotICAgICAgbW9kdWxlPSJtb2RfYXV0b2luZGV4Ij5JbmRleElnbm9yZTwvZGlyZWN0aXZlPiwgPGRpcmVjdGl2ZQotICAgICAgbW9kdWxlPSJtb2RfYXV0b2luZGV4Ij5JbmRleE9wdGlvbnM8L2RpcmVjdGl2ZT4sIDxkaXJlY3RpdmUKLSAgICAgIG1vZHVsZT0ibW9kX2F1dG9pbmRleCI+UmVhZG1lTmFtZTwvZGlyZWN0aXZlPiwKLSAgICAgIDxlbT5ldGMuPC9lbT4pLjwvZGQ+Ci0KLSAgICAgIDxkdD5MaW1pdDwvZHQ+Ci0KLSAgICAgIDxkZD4KLSAgICAgIEFsbG93IHVzZSBvZiB0aGUgZGlyZWN0aXZlcyBjb250cm9sbGluZyBob3N0IGFjY2VzcyAoPGRpcmVjdGl2ZQotICAgICAgbW9kdWxlPSJtb2RfYWNjZXNzIj5BbGxvdzwvZGlyZWN0aXZlPiwgPGRpcmVjdGl2ZQotICAgICAgbW9kdWxlPSJtb2RfYWNjZXNzIj5EZW55PC9kaXJlY3RpdmU+IGFuZCA8ZGlyZWN0aXZlCi0gICAgICBtb2R1bGU9Im1vZF9hY2Nlc3MiPk9yZGVyPC9kaXJlY3RpdmU+KS48L2RkPgotCi0gICAgICA8ZHQ+T3B0aW9uczwvZHQ+Ci0KLSAgICAgIDxkZD4KLSAgICAgIEFsbG93IHVzZSBvZiB0aGUgZGlyZWN0aXZlcyBjb250cm9sbGluZyBzcGVjaWZpYyBkaXJlY3RvcnkKLSAgICAgIGZlYXR1cmVzICg8ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSI+T3B0aW9uczwvZGlyZWN0aXZlPiBhbmQKLSAgICAgIDxkaXJlY3RpdmUgbW9kdWxlPSJtb2RfaW5jbHVkZSI+WEJpdEhhY2s8L2RpcmVjdGl2ZT4pLjwvZGQ+Ci0gICAgPC9kbD4KLQotICAgIDxwPkV4YW1wbGU6PC9wPgotCi0gICAgPGV4YW1wbGU+QWxsb3dPdmVycmlkZSBBdXRoQ29uZmlnIEluZGV4ZXM8L2V4YW1wbGU+Ci08L3VzYWdlPgotCi08c2VlYWxzbz48ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSI+QWNjZXNzRmlsZU5hbWU8L2RpcmVjdGl2ZT48L3NlZWFsc28+Ci08c2VlYWxzbz48YSBocmVmPSIuLi9jb25maWd1cmluZy5odG1sIj5Db25maWd1cmF0aW9uIEZpbGVzPC9hPjwvc2VlYWxzbz4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkF1dGhOYW1lPC9uYW1lPgotPGRlc2NyaXB0aW9uPlNldHMgdGhlIGF1dGhvcml6YXRpb24gcmVhbG0gZm9yIHVzZSBpbiBIVFRQCi1hdXRoZW50aWNhdGlvbjwvZGVzY3JpcHRpb24+Ci08c3ludGF4PkF1dGhOYW1lIDxlbT5hdXRoLWRvbWFpbjwvZW0+PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0Pjxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+QXV0aENvbmZpZzwvb3ZlcnJpZGU+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGlzIGRpcmVjdGl2ZSBzZXRzIHRoZSBuYW1lIG9mIHRoZSBhdXRob3JpemF0aW9uIHJlYWxtIGZvciBhCi0gICAgZGlyZWN0b3J5LiBUaGlzIHJlYWxtIGlzIGdpdmVuIHRvIHRoZSBjbGllbnQgc28gdGhhdCB0aGUgdXNlcgotICAgIGtub3dzIHdoaWNoIHVzZXJuYW1lIGFuZCBwYXNzd29yZCB0byBzZW5kLgotICAgIDxkaXJlY3RpdmU+QXV0aE5hbWU8L2RpcmVjdGl2ZT4gdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQ7IGlmIHRoZQotICAgIHJlYWxtIG5hbWUgY29udGFpbnMgc3BhY2VzLCBpdCBtdXN0IGJlIGVuY2xvc2VkIGluIHF1b3RhdGlvbgotICAgIG1hcmtzLiAgSXQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJjb3JlIj5BdXRoVHlwZTwvZGlyZWN0aXZlPiBhbmQgPGRpcmVjdGl2ZQotICAgIG1vZHVsZT0iY29yZSI+UmVxdWlyZTwvZGlyZWN0aXZlPiBkaXJlY3RpdmVzLCBhbmQgZGlyZWN0aXZlcyBzdWNoCi0gICAgYXMgPGRpcmVjdGl2ZSBtb2R1bGU9Im1vZF9hdXRoIj5BdXRoVXNlckZpbGU8L2RpcmVjdGl2ZT4gYW5kCi0gICAgPGRpcmVjdGl2ZSBtb2R1bGU9Im1vZF9hdXRoIj5BdXRoR3JvdXBGaWxlPC9kaXJlY3RpdmU+IHRvCi0gICAgd29yay48L3A+Ci0KLSAgIDxwPkZvciBleGFtcGxlOjwvcD4KLQotICAgPGV4YW1wbGU+QXV0aE5hbWUgIlRvcCBTZWNyZXQiPC9leGFtcGxlPgotCi0gICAgPHA+VGhlIHN0cmluZyBwcm92aWRlZCBmb3IgdGhlIDxjb2RlPkF1dGhSZWFsbTwvY29kZT4gaXMgd2hhdCB3aWxsCi0gICAgYXBwZWFyIGluIHRoZSBwYXNzd29yZCBkaWFsb2cgcHJvdmlkZWQgYnkgbW9zdCBicm93c2Vycy48L3A+Ci08L3VzYWdlPgotPHNlZWFsc28+PGEgCi0gICAgaHJlZj0iLi4vaG93dG8vYXV0aC5odG1sIj5BdXRoZW50aWNhdGlvbiwgQXV0aG9yaXphdGlvbiwgYW5kIAotICAgIEFjY2VzcyBDb250cm9sPC9hPjwvc2VlYWxzbz4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkF1dGhUeXBlPC9uYW1lPgotPGRlc2NyaXB0aW9uPlNlbGVjdHMgdGhlIHR5cGUgb2YgdXNlciBhdXRoZW50aWNhdGlvbjwvZGVzY3JpcHRpb24+Ci08c3ludGF4PkF1dGhUeXBlIEJhc2ljfERpZ2VzdDwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08b3ZlcnJpZGU+QXV0aENvbmZpZzwvb3ZlcnJpZGU+PC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoaXMgZGlyZWN0aXZlIHNlbGVjdHMgdGhlIHR5cGUgb2YgdXNlciBhdXRoZW50aWNhdGlvbiBmb3IgYQotICAgIGRpcmVjdG9yeS4gT25seSA8Y29kZT5CYXNpYzwvY29kZT4gYW5kIDxjb2RlPkRpZ2VzdDwvY29kZT4gYXJlCi0gICAgY3VycmVudGx5IGltcGxlbWVudGVkLiAKLQotICAgICBJdCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IDxkaXJlY3RpdmUKLSAgICAgbW9kdWxlPSJjb3JlIj5BdXRoTmFtZTwvZGlyZWN0aXZlPiBhbmQgPGRpcmVjdGl2ZQotICAgICBtb2R1bGU9ImNvcmUiPlJlcXVpcmU8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlcywgYW5kIGRpcmVjdGl2ZXMgc3VjaAotICAgICBhcyA8ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX2F1dGgiPkF1dGhVc2VyRmlsZTwvZGlyZWN0aXZlPiBhbmQKLSAgICAgPGRpcmVjdGl2ZSBtb2R1bGU9Im1vZF9hdXRoIj5BdXRoR3JvdXBGaWxlPC9kaXJlY3RpdmU+IHRvCi0gICAgIHdvcmsuPC9wPgotPC91c2FnZT4KLTxzZWVhbHNvPjxhIGhyZWY9Ii4uL2hvd3RvL2F1dGguaHRtbCI+QXV0aGVudGljYXRpb24sIEF1dGhvcml6YXRpb24sCi1hbmQgQWNjZXNzIENvbnRyb2w8L2E+PC9zZWVhbHNvPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+Q29udGVudERpZ2VzdDwvbmFtZT4KLTxkZXNjcmlwdGlvbj5FbmFibGVzIHRoZSBnZW5lcmF0aW9uIG9mIENvbnRlbnQtTUQ1IEhUVFAgUmVzcG9uc2UKLWhlYWRlcnM8L2Rlc2NyaXB0aW9uPiAKLTxzeW50YXg+Q29udGVudERpZ2VzdCBvbnxvZmY8L3N5bnRheD4KLTxkZWZhdWx0PkNvbnRlbnREaWdlc3Qgb2ZmPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0Pjxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+T3B0aW9uczwvb3ZlcnJpZGU+Ci08c3RhdHVzPkV4cGVyaW1lbnRhbDwvc3RhdHVzPgotPGNvbXBhdGliaWxpdHk+QXZhaWxhYmxlIGluIEFwYWNoZSAxLjEgYW5kIGxhdGVyPC9jb21wYXRpYmlsaXR5PgotCi08dXNhZ2U+Ci0gICAgPHA+VGhpcyBkaXJlY3RpdmUgZW5hYmxlcyB0aGUgZ2VuZXJhdGlvbiBvZgotICAgIDxjb2RlPkNvbnRlbnQtTUQ1PC9jb2RlPiBoZWFkZXJzIGFzIGRlZmluZWQgaW4gUkZDMTg2NAotICAgIHJlc3BlY3RpdmVseSBSRkMyMDY4LjwvcD4KLQotICAgIDxwPk1ENSBpcyBhbiBhbGdvcml0aG0gZm9yIGNvbXB1dGluZyBhICJtZXNzYWdlIGRpZ2VzdCIKLSAgICAoc29tZXRpbWVzIGNhbGxlZCAiZmluZ2VycHJpbnQiKSBvZiBhcmJpdHJhcnktbGVuZ3RoIGRhdGEsIHdpdGgKLSAgICBhIGhpZ2ggZGVncmVlIG9mIGNvbmZpZGVuY2UgdGhhdCBhbnkgYWx0ZXJhdGlvbnMgaW4gdGhlIGRhdGEKLSAgICB3aWxsIGJlIHJlZmxlY3RlZCBpbiBhbHRlcmF0aW9ucyBpbiB0aGUgbWVzc2FnZSBkaWdlc3QuPC9wPgotCi0gICAgPHA+VGhlIDxjb2RlPkNvbnRlbnQtTUQ1PC9jb2RlPiBoZWFkZXIgcHJvdmlkZXMgYW4gZW5kLXRvLWVuZAotICAgIG1lc3NhZ2UgaW50ZWdyaXR5IGNoZWNrIChNSUMpIG9mIHRoZSBlbnRpdHktYm9keS4gQSBwcm94eSBvcgotICAgIGNsaWVudCBtYXkgY2hlY2sgdGhpcyBoZWFkZXIgZm9yIGRldGVjdGluZyBhY2NpZGVudGFsCi0gICAgbW9kaWZpY2F0aW9uIG9mIHRoZSBlbnRpdHktYm9keSBpbiB0cmFuc2l0LiBFeGFtcGxlIGhlYWRlcjo8L3A+Ci08ZXhhbXBsZT4KLSAgIENvbnRlbnQtTUQ1OiBBdUxiN0RwMXJxdFJ0eHoybTlrUnBBPT0KLTwvZXhhbXBsZT4KLQotICAgIDxwPk5vdGUgdGhhdCB0aGlzIGNhbiBjYXVzZSBwZXJmb3JtYW5jZSBwcm9ibGVtcyBvbiB5b3VyIHNlcnZlcgotICAgIHNpbmNlIHRoZSBtZXNzYWdlIGRpZ2VzdCBpcyBjb21wdXRlZCBvbiBldmVyeSByZXF1ZXN0ICh0aGUKLSAgICB2YWx1ZXMgYXJlIG5vdCBjYWNoZWQpLjwvcD4KLQotICAgIDxwPjxjb2RlPkNvbnRlbnQtTUQ1PC9jb2RlPiBpcyBvbmx5IHNlbnQgZm9yIGRvY3VtZW50cyBzZXJ2ZWQKLSAgICBieSB0aGUgY29yZSwgYW5kIG5vdCBieSBhbnkgbW9kdWxlLiBGb3IgZXhhbXBsZSwgU1NJIGRvY3VtZW50cywKLSAgICBvdXRwdXQgZnJvbSBDR0kgc2NyaXB0cywgYW5kIGJ5dGUgcmFuZ2UgcmVzcG9uc2VzIGRvIG5vdCBoYXZlCi0gICAgdGhpcyBoZWFkZXIuPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkRlZmF1bHRUeXBlPC9uYW1lPgotPGRlc2NyaXB0aW9uPlNldHMgdGhlIE1JTUUgY29udGVudC10eXBlIHRoYXQgd2lsbCBiZSBzZW50IGlmIHRoZQotc2VydmVyIGNhbm5vdCBkZXRlcm1pbmUgYSB0eXBlIGluIGFueSBvdGhlciB3YXk8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5EZWZhdWx0VHlwZSA8ZW0+TUlNRS10eXBlPC9lbT48L3N5bnRheD4KLTxkZWZhdWx0PkRlZmF1bHRUeXBlIHRleHQvaHRtbDwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPkZpbGVJbmZvPC9vdmVycmlkZT4KLQotPHVzYWdlPgotICAgIDxwPlRoZXJlIHdpbGwgYmUgdGltZXMgd2hlbiB0aGUgc2VydmVyIGlzIGFza2VkIHRvIHByb3ZpZGUgYQotICAgIGRvY3VtZW50IHdob3NlIHR5cGUgY2Fubm90IGJlIGRldGVybWluZWQgYnkgaXRzIE1JTUUgdHlwZXMKLSAgICBtYXBwaW5ncy48L3A+Ci0KLSAgICA8cD5UaGUgc2VydmVyIG11c3QgaW5mb3JtIHRoZSBjbGllbnQgb2YgdGhlIGNvbnRlbnQtdHlwZSBvZiB0aGUKLSAgICBkb2N1bWVudCwgc28gaW4gdGhlIGV2ZW50IG9mIGFuIHVua25vd24gdHlwZSBpdCB1c2VzIHRoZQotICAgIDxjb2RlPkRlZmF1bHRUeXBlPC9jb2RlPi4gRm9yIGV4YW1wbGU6PC9wPgotCi08ZXhhbXBsZT4KLSAgICAgIDxjb2RlPkRlZmF1bHRUeXBlIGltYWdlL2dpZjwvY29kZT4KLTwvZXhhbXBsZT4KLSAgICB3b3VsZCBiZSBhcHByb3ByaWF0ZSBmb3IgYSBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbmVkIG1hbnkgZ2lmCi0gICAgaW1hZ2VzIHdpdGggZmlsZW5hbWVzIG1pc3NpbmcgdGhlIC5naWYgZXh0ZW5zaW9uLiAKLQotICAgIDxwPk5vdGUgdGhhdCB1bmxpa2UgPGRpcmVjdGl2ZQotICAgIG1vZHVsZT0iY29yZSI+Rm9yY2VUeXBlPC9kaXJlY3RpdmU+LCB0aGlzIGRpcmVjdGl2ZSBpcyBvbmx5Ci0gICAgcHJvdmlkZXMgdGhlIGRlZmF1bHQgbWltZS10eXBlLiBBbGwgb3RoZXIgbWltZS10eXBlIGRlZmluaXRpb25zLAotICAgIGluY2x1ZGluZyBmaWxlbmFtZSBleHRlbnNpb25zLCB0aGF0IG1pZ2h0IGlkZW50aWZ5IHRoZSBtZWRpYSB0eXBlCi0gICAgd2lsbCBvdmVycmlkZSB0aGlzIGRlZmF1bHQuPC9wPiAKLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXMgdHlwZT0ic2VjdGlvbiI+Ci08bmFtZT5EaXJlY3Rvcnk8L25hbWU+Ci08ZGVzY3JpcHRpb24+RW5jbG9zZSBhIGdyb3VwIG9mIGRpcmVjdGl2ZXMgdGhhdCBhcHBseSBvbmx5IHRvIHRoZQotbmFtZWQgZmlsZS1zeXN0ZW0gZGlyZWN0b3J5IGFuZCBzdWItZGlyZWN0b3JpZXM8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD4mbHQ7RGlyZWN0b3J5IDxlbT5kaXJlY3RvcnktcGF0aDwvZW0+Jmd0OwotLi4uICZsdDsvRGlyZWN0b3J5Jmd0Ozwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPjxkaXJlY3RpdmUgdHlwZT0ic2VjdGlvbiI+RGlyZWN0b3J5PC9kaXJlY3RpdmU+IGFuZAotICAgIDxjb2RlPiZsdDsvRGlyZWN0b3J5Jmd0OzwvY29kZT4gYXJlIHVzZWQgdG8gZW5jbG9zZSBhIGdyb3VwIG9mCi0gICAgZGlyZWN0aXZlcyB3aGljaCB3aWxsIGFwcGx5IG9ubHkgdG8gdGhlIG5hbWVkIGRpcmVjdG9yeSBhbmQKLSAgICBzdWItZGlyZWN0b3JpZXMgb2YgdGhhdCBkaXJlY3RvcnkuIEFueSBkaXJlY3RpdmUgd2hpY2ggaXMgYWxsb3dlZAotICAgIGluIGEgZGlyZWN0b3J5IGNvbnRleHQgbWF5IGJlIHVzZWQuICA8ZW0+RGlyZWN0b3J5LXBhdGg8L2VtPiBpcwotICAgIGVpdGhlciB0aGUgZnVsbCBwYXRoIHRvIGEgZGlyZWN0b3J5LCBvciBhIHdpbGQtY2FyZCBzdHJpbmcuIEluIGEKLSAgICB3aWxkLWNhcmQgc3RyaW5nLCBgPycgbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciwgYW5kIGAqJwotICAgIG1hdGNoZXMgYW55IHNlcXVlbmNlcyBvZiBjaGFyYWN0ZXJzLiAgWW91IG1heQotICAgIGFsc28gdXNlIGBbXScgY2hhcmFjdGVyIHJhbmdlcyBsaWtlIGluIHRoZSBzaGVsbC4gQWxzbyBhcyBvZgotICAgIEFwYWNoZSAxLjMgbm9uZSBvZiB0aGUgd2lsZGNhcmRzIG1hdGNoIGEgYC8nIGNoYXJhY3Rlciwgd2hpY2ggbW9yZQotICAgIGNsb3NlbHkgbWltaWNzIHRoZSBiZWhhdmlvciBvZiBVbml4IHNoZWxscy4gRXhhbXBsZTo8L3A+Ci08ZXhhbXBsZT4KLSAgICZsdDtEaXJlY3RvcnkgL3Vzci9sb2NhbC9odHRwZC9odGRvY3MmZ3Q7PGJyIC8+Ci0mbmJzcDsmbmJzcDtPcHRpb25zIEluZGV4ZXMgRm9sbG93U3ltTGlua3M8YnIgLz4KLSAgICZsdDsvRGlyZWN0b3J5Jmd0OzxiciAvPgotPC9leGFtcGxlPgotCi0gICAgPHA+RXh0ZW5kZWQgcmVndWxhcgotICAgIGV4cHJlc3Npb25zIGNhbiBhbHNvIGJlIHVzZWQsIHdpdGggdGhlIGFkZGl0aW9uIG9mIHRoZQotICAgIDxjb2RlPn48L2NvZGU+IGNoYXJhY3Rlci4gRm9yIGV4YW1wbGU6PC9wPgotPGV4YW1wbGU+Ci0gICAmbHQ7RGlyZWN0b3J5IH4gIl4vd3d3Ly4qL1swLTldezN9IiZndDsKLTwvZXhhbXBsZT4KLSAgICB3b3VsZCBtYXRjaCBkaXJlY3RvcmllcyBpbiAvd3d3LyB0aGF0IGNvbnNpc3RlZCBvZiB0aHJlZQotICAgIG51bWJlcnMuIAotCi0gICAgPHA+SWYgbXVsdGlwbGUgKG5vbi1yZWd1bGFyIGV4cHJlc3Npb24pIGRpcmVjdG9yeSBzZWN0aW9ucwotICAgIG1hdGNoIHRoZSBkaXJlY3RvcnkgKG9yIGl0cyBwYXJlbnRzKSBjb250YWluaW5nIGEgZG9jdW1lbnQsCi0gICAgdGhlbiB0aGUgZGlyZWN0aXZlcyBhcmUgYXBwbGllZCBpbiB0aGUgb3JkZXIgb2Ygc2hvcnRlc3QgbWF0Y2gKLSAgICBmaXJzdCwgaW50ZXJzcGVyc2VkIHdpdGggdGhlIGRpcmVjdGl2ZXMgZnJvbSB0aGUgPGEKLSAgICBocmVmPSIjYWNjZXNzZmlsZW5hbWUiPi5odGFjY2VzczwvYT4gZmlsZXMuIEZvciBleGFtcGxlLAotICAgIHdpdGg8L3A+Ci0KLTxleGFtcGxlPgotICAgICAgJmx0O0RpcmVjdG9yeSAvJmd0OzxiciAvPgotICAgICAgICZuYnNwOyZuYnNwO0FsbG93T3ZlcnJpZGUgTm9uZTxiciAvPgotICAgICAgICZsdDsvRGlyZWN0b3J5Jmd0OzxiciAvPgotICAgICAgPGJyIC8+Ci0gICAgICAgJmx0O0RpcmVjdG9yeSAvaG9tZS8qJmd0OzxiciAvPgotICAgICAgICZuYnNwOyZuYnNwO0FsbG93T3ZlcnJpZGUgRmlsZUluZm88YnIgLz4KLSAgICAgICAmbHQ7L0RpcmVjdG9yeSZndDsKLTwvZXhhbXBsZT4KLSAgICA8cD5mb3IgYWNjZXNzIHRvIHRoZSBkb2N1bWVudCA8Y29kZT4vaG9tZS93ZWIvZGlyL2RvYy5odG1sPC9jb2RlPgotICAgIHRoZSBzdGVwcyBhcmU6PC9wPgotCi0gICAgPHVsPgotICAgICAgPGxpPkFwcGx5IGRpcmVjdGl2ZSA8Y29kZT5BbGxvd092ZXJyaWRlIE5vbmU8L2NvZGU+Ci0gICAgICAoZGlzYWJsaW5nIDxjb2RlPi5odGFjY2VzczwvY29kZT4gZmlsZXMpLjwvbGk+Ci0KLSAgICAgIDxsaT5BcHBseSBkaXJlY3RpdmUgPGNvZGU+QWxsb3dPdmVycmlkZSBGaWxlSW5mbzwvY29kZT4gKGZvcgotICAgICAgZGlyZWN0b3J5IDxjb2RlPi9ob21lL3dlYjwvY29kZT4pLjwvbGk+Ci0KLSAgICAgIDxsaT5BcHBseSBhbnkgRmlsZUluZm8gZGlyZWN0aXZlcyBpbgotICAgICAgPGNvZGU+L2hvbWUvd2ViLy5odGFjY2VzczwvY29kZT48L2xpPgotICAgIDwvdWw+Ci0KLSAgICA8cD5SZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBub3QgY29uc2lkZXJlZCB1bnRpbCBhZnRlciBhbGwgb2YgdGhlCi0gICAgbm9ybWFsIHNlY3Rpb25zIGhhdmUgYmVlbiBhcHBsaWVkLiBUaGVuIGFsbCBvZiB0aGUgcmVndWxhcgotICAgIGV4cHJlc3Npb25zIGFyZSB0ZXN0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyZWQgaW4gdGhlCi0gICAgY29uZmlndXJhdGlvbiBmaWxlLiBGb3IgZXhhbXBsZSwgd2l0aDwvcD4KLQotPGV4YW1wbGU+Jmx0O0RpcmVjdG9yeSB+IGFiYyQmZ3Q7PGJyIC8+Ci0gICAgICAgLi4uIGRpcmVjdGl2ZXMgaGVyZSAuLi48YnIgLz4KLSAgICAgICAmbHQ7L0RpcmVjdG9yeSZndDs8YnIgLz4KLTwvZXhhbXBsZT4KLQotICAgIDxwPlRoZSByZWd1bGFyIGV4cHJlc3Npb24gc2VjdGlvbiB3b24ndCBiZSBjb25zaWRlcmVkIHVudGlsIGFmdGVyCi0gICAgYWxsIG5vcm1hbCAmbHQ7RGlyZWN0b3J5Jmd0O3MgYW5kIDxjb2RlPi5odGFjY2VzczwvY29kZT4gZmlsZXMKLSAgICBoYXZlIGJlZW4gYXBwbGllZC4gVGhlbiB0aGUgcmVndWxhciBleHByZXNzaW9uIHdpbGwgbWF0Y2ggb24KLSAgICA8Y29kZT4vaG9tZS9hYmMvcHVibGljX2h0bWwvYWJjPC9jb2RlPiBhbmQgYmUgYXBwbGllZC48L3A+Ci0KLSAgIDxwPjxzdHJvbmc+Tm90ZSB0aGF0IHRoZSBkZWZhdWx0IEFwYWNoZSBhY2Nlc3MgZm9yCi0gICAgJmx0O0RpcmVjdG9yeSAvJmd0OyBpcyA8c2FtcD5BbGxvdyBmcm9tIEFsbDwvc2FtcD4uIFRoaXMgbWVhbnMKLSAgICB0aGF0IEFwYWNoZSB3aWxsIHNlcnZlIGFueSBmaWxlIG1hcHBlZCBmcm9tIGFuIFVSTC4gSXQgaXMKLSAgICByZWNvbW1lbmRlZCB0aGF0IHlvdSBjaGFuZ2UgdGhpcyB3aXRoIGEgYmxvY2sgc3VjaAotICAgIGFzPC9zdHJvbmc+PC9wPgotCi08ZXhhbXBsZT4KLSAmbHQ7RGlyZWN0b3J5IC8mZ3Q7PGJyIC8+Ci0gICAgICZuYnNwOyZuYnNwO09yZGVyIERlbnksQWxsb3c8YnIgLz4KLSAgICAgJm5ic3A7Jm5ic3A7RGVueSBmcm9tIEFsbDxiciAvPgotICZsdDsvRGlyZWN0b3J5Jmd0OwotPC9leGFtcGxlPgotCi0gICAgPHA+PHN0cm9uZz5hbmQgdGhlbiBvdmVycmlkZSB0aGlzIGZvciBkaXJlY3RvcmllcyB5b3UKLSAgICA8ZW0+d2FudDwvZW0+IGFjY2Vzc2libGUuIFNlZSB0aGUgPGEKLSAgICBocmVmPSIuLi9taXNjL3NlY3VyaXR5X3RpcHMuaHRtbCI+U2VjdXJpdHkgVGlwczwvYT4gcGFnZSBmb3IgbW9yZQotICAgIGRldGFpbHMuPC9zdHJvbmc+PC9wPiAKLQotICAgIDxwPlRoZSBkaXJlY3Rvcnkgc2VjdGlvbnMgdHlwaWNhbGx5IG9jY3VyIGluCi0gICAgdGhlIGFjY2Vzcy5jb25mIGZpbGUsIGJ1dCB0aGV5IG1heSBhcHBlYXIgaW4gYW55IGNvbmZpZ3VyYXRpb24KLSAgICBmaWxlLiAgPGRpcmVjdGl2ZSB0eXBlPSJzZWN0aW9uIj5EaXJlY3Rvcnk8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlcwotICAgIGNhbm5vdCBuZXN0LCBhbmQgY2Fubm90IGFwcGVhciBpbiBhIDxkaXJlY3RpdmUgbW9kdWxlPSJjb3JlIgotICAgIHR5cGU9InNlY3Rpb24iPkxpbWl0PC9kaXJlY3RpdmU+IG9yIDxkaXJlY3RpdmUgbW9kdWxlPSJjb3JlIgotICAgIHR5cGU9InNlY3Rpb24iPkxpbWl0RXhjZXB0PC9kaXJlY3RpdmU+IHNlY3Rpb24uPC9wPgotPC91c2FnZT4KLTxzZWVhbHNvPjxhIGhyZWY9Ii4uL3NlY3Rpb25zLmh0bWwiPkhvdwotICAgIERpcmVjdG9yeSwgTG9jYXRpb24gYW5kIEZpbGVzIHNlY3Rpb25zIHdvcms8L2E+IGZvciBhbgotICAgIGV4cGxhbmF0aW9uIG9mIGhvdyB0aGVzZSBkaWZmZXJlbnQgc2VjdGlvbnMgYXJlIGNvbWJpbmVkIHdoZW4gYQotICAgIHJlcXVlc3QgaXMgcmVjZWl2ZWQ8L3NlZWFsc28+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXMgdHlwZT0ic2VjdGlvbiI+Ci08bmFtZT5EaXJlY3RvcnlNYXRjaDwvbmFtZT4KLTxkZXNjcmlwdGlvbj5FbmNsb3NlIGEgZ3JvdXAgb2YgZGlyZWN0aXZlcyB0aGF0IGFwcGx5IG9ubHkgdG8gCi1maWxlLXN5c3RlbSBkaXJlY3RvcmllcyB0aGF0IG1hdGNoIGEgcmVndWxhciBleHByZXNzaW9uIGFuZCB0aGVpcgotc3ViZGlyZWN0b3JpZXM8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD4mbHQ7RGlyZWN0b3J5IDxlbT5yZWdleDwvZW0+Jmd0OwotLi4uICZsdDsvRGlyZWN0b3J5Jmd0Ozwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPjxkaXJlY3RpdmUgdHlwZT0ic2VjdGlvbiI+RGlyZWN0b3J5TWF0Y2g8L2RpcmVjdGl2ZT4gYW5kCi0gICAgPGNvZGU+Jmx0Oy9EaXJlY3RvcnlNYXRjaCZndDs8L2NvZGU+IGFyZSB1c2VkIHRvIGVuY2xvc2UgYSBncm91cAotICAgIG9mIGRpcmVjdGl2ZXMgd2hpY2ggd2lsbCBhcHBseSBvbmx5IHRvIHRoZSBuYW1lZCBkaXJlY3RvcnkgYW5kCi0gICAgc3ViLWRpcmVjdG9yaWVzIG9mIHRoYXQgZGlyZWN0b3J5LCB0aGUgc2FtZSBhcyA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJjb3JlIiB0eXBlPSJzZWN0aW9uIj5EaXJlY3Rvcnk8L2RpcmVjdGl2ZT4uIEhvd2V2ZXIsIGl0Ci0gICAgdGFrZXMgYXMgYW4gYXJndW1lbnQgYSByZWd1bGFyIGV4cHJlc3Npb24uIEZvciBleGFtcGxlOjwvcD4KLTxleGFtcGxlPgotICAgJmx0O0RpcmVjdG9yeU1hdGNoICJeL3d3dy8uKi9bMC05XXszfSImZ3Q7Ci08L2V4YW1wbGU+Ci0KLSAgICA8cD53b3VsZCBtYXRjaCBkaXJlY3RvcmllcyBpbiA8Y29kZT4vd3d3LzwvY29kZT4gdGhhdCBjb25zaXN0ZWQgb2YgdGhyZWUKLSAgICBudW1iZXJzLjwvcD4KLTwvdXNhZ2U+Ci08c2VlYWxzbz48ZGlyZWN0aXZlIHR5cGU9InNlY3Rpb24iIG1vZHVsZT0iY29yZSI+RGlyZWN0b3J5PC9kaXJlY3RpdmU+IGZvcgotYSBkZXNjcmlwdGlvbiBvZiBob3cgcmVndWxhciBleHByZXNzaW9ucyBhcmUgbWl4ZWQgaW4gd2l0aCBub3JtYWwKLTxjb2RlPiZsdDtEaXJlY3RvcnkmZ3Q7PC9jb2RlPnM8L3NlZWFsc28+Ci08c2VlYWxzbz48YQotaHJlZj0iLi4vc2VjdGlvbnMuaHRtbCI+SG93IERpcmVjdG9yeSwgTG9jYXRpb24gYW5kIEZpbGVzIHNlY3Rpb25zCi13b3JrPC9hPiBmb3IgYW4gZXhwbGFuYXRpb24gb2YgaG93IHRoZXNlIGRpZmZlcmVudCBzZWN0aW9ucyBhcmUKLWNvbWJpbmVkIHdoZW4gYSByZXF1ZXN0IGlzIHJlY2VpdmVkPC9zZWVhbHNvPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+RG9jdW1lbnRSb290PC9uYW1lPgotPGRlc2NyaXB0aW9uPlNldHMgdGhlIGRpcmVjdG9yeSB0aGF0IGZvcm1zIHRoZSBtYWluIGRvY3VtZW50IHRyZWUgdmlzaWJsZQotZnJvbSB0aGUgd2ViPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+RG9jdW1lbnRSb290IDxlbT5kaXJlY3RvcnktcGF0aDwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5Eb2N1bWVudFJvb3QgL3Vzci9sb2NhbC9hcGFjaGUvaHRkb2NzPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoaXMgZGlyZWN0aXZlIHNldHMgdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGh0dHBkIHdpbGwKLSAgICBzZXJ2ZSBmaWxlcy4gVW5sZXNzIG1hdGNoZWQgYnkgYSBkaXJlY3RpdmUgbGlrZSBBbGlhcywgdGhlCi0gICAgc2VydmVyIGFwcGVuZHMgdGhlIHBhdGggZnJvbSB0aGUgcmVxdWVzdGVkIFVSTCB0byB0aGUgZG9jdW1lbnQKLSAgICByb290IHRvIG1ha2UgdGhlIHBhdGggdG8gdGhlIGRvY3VtZW50LiBFeGFtcGxlOjwvcD4KLTxleGFtcGxlPgotICAgRG9jdW1lbnRSb290IC91c3Ivd2ViCi08L2V4YW1wbGU+Ci0gICAgPHA+dGhlbiBhbiBhY2Nlc3MgdG8KLSAgICA8Y29kZT5odHRwOi8vd3d3Lm15Lmhvc3QuY29tL2luZGV4Lmh0bWw8L2NvZGU+IHJlZmVycyB0bwotICAgIDxjb2RlPi91c3Ivd2ViL2luZGV4Lmh0bWw8L2NvZGU+LjwvcD4KLQotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPkRvY3VtZW50Um9vdDwvZGlyZWN0aXZlPiBzaG91bGQgYmUgc3BlY2lmaWVkIHdpdGhvdXQKLSAgICBhIHRyYWlsaW5nIHNsYXNoLjwvcD4KLTwvdXNhZ2U+Ci08c2VlYWxzbz48YSBocmVmPSIuLi91cmxtYXBwaW5nLmh0bWwiPk1hcHBpbmcgVVJMcyB0byBGaWxlc3lzdGVtCi1Mb2NhdGlvbjwvYT48L3NlZWFsc28+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5FcnJvckRvY3VtZW50PC9uYW1lPgotPGRlc2NyaXB0aW9uPlNwZWNpZmllcyB3aGF0IHRoZSBzZXJ2ZXIgd2lsbCByZXR1cm4gdG8gdGhlIGNsaWVudAotaW4gY2FzZSBvZiBhbiBlcnJvcjwvZGVzY3JpcHRpb24+Ci08c3ludGF4PkVycm9yRG9jdW1lbnQgPGVtPmVycm9yLWNvZGUgZG9jdW1lbnQ8L2VtPjwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0Pjxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+RmlsZUluZm88L292ZXJyaWRlPgotPGNvbXBhdGliaWxpdHk+UXVvdGluZyBzeW50YXggZm9yIHRleHQgbWVzc2FnZXMgaXMgZGlmZmVyZW50IGluIEFwYWNoZQotMi4wPC9jb21wYXRpYmlsaXR5PgotCi08dXNhZ2U+Ci0gICAgPHA+SW4gdGhlIGV2ZW50IG9mIGEgcHJvYmxlbSBvciBlcnJvciwgQXBhY2hlIGNhbiBiZSBjb25maWd1cmVkCi0gICAgdG8gZG8gb25lIG9mIGZvdXIgdGhpbmdzLDwvcD4KLQotICAgIDxvbD4KLSAgICAgIDxsaT5vdXRwdXQgYSBzaW1wbGUgaGFyZGNvZGVkIGVycm9yIG1lc3NhZ2U8L2xpPgotCi0gICAgICA8bGk+b3V0cHV0IGEgY3VzdG9taXplZCBtZXNzYWdlPC9saT4KLQotICAgICAgPGxpPnJlZGlyZWN0IHRvIGEgbG9jYWwgPGVtPlVSTC1wYXRoPC9lbT4gdG8gaGFuZGxlIHRoZQotICAgICAgcHJvYmxlbS9lcnJvcjwvbGk+Ci0KLSAgICAgIDxsaT5yZWRpcmVjdCB0byBhbiBleHRlcm5hbCA8ZW0+VVJMPC9lbT4gdG8gaGFuZGxlIHRoZQotICAgICAgcHJvYmxlbS9lcnJvcjwvbGk+Ci0gICAgPC9vbD4KLQotICAgIDxwPlRoZSBmaXJzdCBvcHRpb24gaXMgdGhlIGRlZmF1bHQsIHdoaWxlIG9wdGlvbnMgMi00IGFyZQotICAgIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIDxkaXJlY3RpdmU+RXJyb3JEb2N1bWVudDwvZGlyZWN0aXZlPgotICAgIGRpcmVjdGl2ZSwgd2hpY2ggaXMgZm9sbG93ZWQgYnkgdGhlIEhUVFAgcmVzcG9uc2UgY29kZSBhbmQgYSBVUkwKLSAgICBvciBhIG1lc3NhZ2UuIEFwYWNoZSB3aWxsIHNvbWV0aW1lcyBvZmZlciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIHRoZSBwcm9ibGVtL2Vycm9yLjwvcD4KLQotICAgIDxwPlVSTHMgY2FuIGJlZ2luIHdpdGggYSBzbGFzaCAoLykgZm9yIGxvY2FsIFVSTHMsIG9yIGJlIGEgZnVsbAotICAgIFVSTCB3aGljaCB0aGUgY2xpZW50IGNhbiByZXNvbHZlLiBBbHRlcm5hdGl2ZWx5LCBhIG1lc3NhZ2UgY2FuCi0gICAgYmUgcHJvdmlkZWQgdG8gYmUgZGlzcGxheWVkIGJ5IHRoZSBicm93c2VyLiBFeGFtcGxlczo8L3A+Ci0KLTxleGFtcGxlPgotICAgICAgRXJyb3JEb2N1bWVudCA1MDAKLSAgICAgIGh0dHA6Ly9mb28uZXhhbXBsZS5jb20vY2dpLWJpbi90ZXN0ZXI8YnIgLz4KLSAgICAgICBFcnJvckRvY3VtZW50IDQwNCAvY2dpLWJpbi9iYWRfdXJscy5wbDxiciAvPgotICAgICAgIEVycm9yRG9jdW1lbnQgNDAxIC9zdWJzY3JpcHRpb25faW5mby5odG1sPGJyIC8+Ci0gICAgICAgRXJyb3JEb2N1bWVudCA0MDMgIlNvcnJ5IGNhbid0IGFsbG93IHlvdSBhY2Nlc3MKLSAgICAgIHRvZGF5IgotPC9leGFtcGxlPgotCi0gICAgPHA+Tm90ZSB0aGF0IHdoZW4geW91IHNwZWNpZnkgYW4gPGRpcmVjdGl2ZT5FcnJvckRvY3VtZW50PC9kaXJlY3RpdmU+Ci0gICAgdGhhdCBwb2ludHMgdG8gYSByZW1vdGUgVVJMIChpZS4gYW55dGhpbmcgd2l0aCBhIG1ldGhvZCBzdWNoIGFzCi0gICAgImh0dHAiIGluIGZyb250IG9mIGl0KSwgQXBhY2hlIHdpbGwgc2VuZCBhIHJlZGlyZWN0IHRvIHRoZQotICAgIGNsaWVudCB0byB0ZWxsIGl0IHdoZXJlIHRvIGZpbmQgdGhlIGRvY3VtZW50LCBldmVuIGlmIHRoZQotICAgIGRvY3VtZW50IGVuZHMgdXAgYmVpbmcgb24gdGhlIHNhbWUgc2VydmVyLiBUaGlzIGhhcyBzZXZlcmFsCi0gICAgaW1wbGljYXRpb25zLCB0aGUgbW9zdCBpbXBvcnRhbnQgYmVpbmcgdGhhdCB0aGUgY2xpZW50IHdpbGwgbm90Ci0gICAgcmVjZWl2ZSB0aGUgb3JpZ2luYWwgZXJyb3Igc3RhdHVzIGNvZGUsIGJ1dCBpbnN0ZWFkIHdpbGwKLSAgICByZWNlaXZlIGEgcmVkaXJlY3Qgc3RhdHVzIGNvZGUuIFRoaXMgaW4gdHVybiBjYW4gY29uZnVzZSB3ZWIKLSAgICByb2JvdHMgYW5kIG90aGVyIGNsaWVudHMgd2hpY2ggdHJ5IHRvIGRldGVybWluZSBpZiBhIFVSTCBpcwotICAgIHZhbGlkIHVzaW5nIHRoZSBzdGF0dXMgY29kZS4gSW4gYWRkaXRpb24sIGlmIHlvdSB1c2UgYSByZW1vdGUKLSAgICBVUkwgaW4gYW4gPGNvZGU+RXJyb3JEb2N1bWVudCA0MDE8L2NvZGU+LCB0aGUgY2xpZW50IHdpbGwgbm90Ci0gICAga25vdyB0byBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgcGFzc3dvcmQgc2luY2UgaXQgd2lsbCBub3QKLSAgICByZWNlaXZlIHRoZSA0MDEgc3RhdHVzIGNvZGUuIFRoZXJlZm9yZSwgPHN0cm9uZz5pZiB5b3UgdXNlIGFuCi0gICAgIkVycm9yRG9jdW1lbnQgNDAxIiBkaXJlY3RpdmUgdGhlbiBpdCBtdXN0IHJlZmVyIHRvIGEgbG9jYWwKLSAgICBkb2N1bWVudC48L3N0cm9uZz48L3A+Ci0KLSAgICA8cD5QcmlvciB0byB2ZXJzaW9uIDIuMCwgbWVzc2FnZXMgd2VyZSBpbmRpY2F0ZWQgYnkgcHJlZml4aW5nCi0gICAgdGhlbSB3aXRoIGEgc2luZ2xlIHVubWF0Y2hlZCBkb3VibGUgcXVvdGUgY2hhcmFjdGVyLjwvcD4KLTwvdXNhZ2U+Ci0KLTxzZWVhbHNvPjxhIGhyZWY9Ii4uL2N1c3RvbS1lcnJvci5odG1sIj5kb2N1bWVudGF0aW9uIG9mCi0gICAgY3VzdG9taXphYmxlIHJlc3BvbnNlczwvYT48L3NlZWFsc28+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5FcnJvckxvZzwvbmFtZT4KLTxkZXNjcmlwdGlvbj5TZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHdoaWNoIHRoZSBzZXJ2ZXIKLXdpbGwgbG9nIGVycm9yczwvZGVzY3JpcHRpb24+ICAgIAotPHN5bnRheD4gRXJyb3JMb2cgPGVtPmZpbGUtcGF0aDwvZW0+fHN5c2xvZ1s6PGVtPmZhY2lsaXR5PC9lbT5dPC9zeW50YXg+Ci08ZGVmYXVsdD5FcnJvckxvZyBsb2dzL2Vycm9yX2xvZyAoVW5peCkKLUVycm9yTG9nIGxvZ3MvZXJyb3IubG9nIChXaW5kb3dzIGFuZCBPUy8yKTwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5FcnJvckxvZzwvZGlyZWN0aXZlPiBkaXJlY3RpdmUgc2V0cyB0aGUgbmFtZSBvZgotICAgIHRoZSBmaWxlIHRvIHdoaWNoIHRoZSBzZXJ2ZXIgd2lsbCBsb2cgYW55IGVycm9ycyBpdCBlbmNvdW50ZXJzLiBJZgotICAgIHRoZSA8ZW0+ZmlsZS1wYXRoPC9lbT4gZG9lcyBub3QgYmVnaW4gd2l0aCBhIHNsYXNoICgvKSB0aGVuIGl0IGlzCi0gICAgYXNzdW1lZCB0byBiZSByZWxhdGl2ZSB0byB0aGUgPGRpcmVjdGl2ZQotICAgIG1vZHVsZT0iY29yZSI+U2VydmVyUm9vdDwvZGlyZWN0aXZlPi4gSWYgdGhlIDxlbT5maWxlLXBhdGg8L2VtPgotICAgIGJlZ2lucyB3aXRoIGEgcGlwZSAofCkgdGhlbiBpdCBpcyBhc3N1bWVkIHRvIGJlIGEgY29tbWFuZCB0byBzcGF3bgotICAgIHRvIGhhbmRsZSB0aGUgZXJyb3IgbG9nLjwvcD4KLQotICAgIDxwPlVzaW5nIDxjb2RlPnN5c2xvZzwvY29kZT4gaW5zdGVhZCBvZiBhIGZpbGVuYW1lIGVuYWJsZXMgbG9nZ2luZwotICAgIHZpYSBzeXNsb2dkKDgpIGlmIHRoZSBzeXN0ZW0gc3VwcG9ydHMgaXQuIFRoZSBkZWZhdWx0IGlzIHRvIHVzZQotICAgIHN5c2xvZyBmYWNpbGl0eSA8Y29kZT5sb2NhbDc8L2NvZGU+LCBidXQgeW91IGNhbiBvdmVycmlkZSB0aGlzIGJ5Ci0gICAgdXNpbmcgdGhlIDxjb2RlPnN5c2xvZzo8L2NvZGU+PGVtPmZhY2lsaXR5PC9lbT4gc3ludGF4IHdoZXJlCi0gICAgPGVtPmZhY2lsaXR5PC9lbT4gY2FuIGJlIG9uZSBvZiB0aGUgbmFtZXMgdXN1YWxseSBkb2N1bWVudGVkIGluCi0gICAgc3lzbG9nKDEpLjwvcD4KLQotICAgIDxwPlNFQ1VSSVRZOiBTZWUgdGhlIDxhCi0gICAgaHJlZj0iLi4vbWlzYy9zZWN1cml0eV90aXBzLmh0bWwjc2VydmVycm9vdCI+c2VjdXJpdHkgdGlwczwvYT4KLSAgICBkb2N1bWVudCBmb3IgZGV0YWlscyBvbiB3aHkgeW91ciBzZWN1cml0eSBjb3VsZCBiZSBjb21wcm9taXNlZAotICAgIGlmIHRoZSBkaXJlY3Rvcnkgd2hlcmUgbG9nZmlsZXMgYXJlIHN0b3JlZCBpcyB3cml0YWJsZSBieQotICAgIGFueW9uZSBvdGhlciB0aGFuIHRoZSB1c2VyIHRoYXQgc3RhcnRzIHRoZSBzZXJ2ZXIuPC9wPgotPC91c2FnZT4KLTxzZWVhbHNvPjxkaXJlY3RpdmUgbW9kdWxlPSJjb3JlIj5Mb2dMZXZlbDwvZGlyZWN0aXZlPjwvc2VlYWxzbz4KLTxzZWVhbHNvPjxhIGhyZWY9Ii4uL2xvZ3MuaHRtbCI+QXBhY2hlIExvZyBGaWxlczwvYT48L3NlZWFsc28+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5GaWxlRVRhZzwvbmFtZT4KLTxkZXNjcmlwdGlvbj5Db25maWd1cmVzIHRoZSBmaWxlIGF0dHJpYnV0ZXMgdXNlZCB0byBjcmVhdGUgdGhlIEVUYWcKLUhUVFAgcmVzcG9uc2UgaGVhZGVyPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+RmlsZUVUYWcgPGVtPmNvbXBvbmVudDwvZW0+IC4uLjwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0Pjxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+RmlsZUluZm88L292ZXJyaWRlPgotCi08dXNhZ2U+Ci0gICAgPHA+Ci0gICAgVGhlIDxkaXJlY3RpdmU+RmlsZUVUYWc8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIGNvbmZpZ3VyZXMgdGhlIGZpbGUKLSAgICBhdHRyaWJ1dGVzIHRoYXQgYXJlIHVzZWQgdG8gY3JlYXRlIHRoZSBFVGFnIChlbnRpdHkgdGFnKSByZXNwb25zZQotICAgIGhlYWRlciBmaWVsZCB3aGVuIHRoZSBkb2N1bWVudCBpcyBiYXNlZCBvbiBhIGZpbGUuICAoVGhlIEVUYWcKLSAgICB2YWx1ZSBpcyB1c2VkIGluIGNhY2hlIG1hbmFnZW1lbnQgdG8gc2F2ZSBuZXR3b3JrIGJhbmR3aWR0aC4pICBJbgotICAgIEFwYWNoZSAxLjMuMjIgYW5kIGVhcmxpZXIsIHRoZSBFVGFnIHZhbHVlIHdhcyA8ZW0+YWx3YXlzPC9lbT4gZm9ybWVkCi0gICAgZnJvbSB0aGUgZmlsZSdzIGlub2RlLCBzaXplLCBhbmQgbGFzdC1tb2RpZmllZCB0aW1lIChtdGltZSkuICBUaGUKLSAgICBGaWxlRVRhZyBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0byBjaG9vc2Ugd2hpY2ggb2YgdGhlc2UgLS0gaWYgYW55Ci0gICAgLS0gc2hvdWxkIGJlIHVzZWQuICBUaGUgcmVjb2duaXplZCBrZXl3b3JkcyBhcmU6Ci0gICAgPC9wPgotICAgIDxkbCBjb21wYWN0PSJjb21wYWN0Ij4KLSAgICAgPGR0PjxiPklOb2RlPC9iPjwvZHQ+Ci0gICAgIDxkZD5UaGUgZmlsZSdzIGktbm9kZSBudW1iZXIgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb248L2RkPgotICAgICA8ZHQ+PGI+TVRpbWU8L2I+PC9kdD4KLSAgICAgPGRkPlRoZSBkYXRlIGFuZCB0aW1lIHRoZSBmaWxlIHdhcyBsYXN0IG1vZGlmaWVkIHdpbGwgYmUgaW5jbHVkZWQ8L2RkPgotICAgICA8ZHQ+PGI+U2l6ZTwvYj48L2R0PgotICAgICA8ZGQ+VGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgZmlsZSB3aWxsIGJlIGluY2x1ZGVkPC9kZD4KLSAgICAgPGR0PjxiPkFsbDwvYj48L2R0PgotICAgICA8ZGQ+QWxsIGF2YWlsYWJsZSBmaWVsZHMgd2lsbCBiZSB1c2VkIChlcXVpdmFsZW50IHRvCi0gICAgICAnPGNvZGU+RmlsZUVUYWcmbmJzcDtJTm9kZSZuYnNwO01UaW1lJm5ic3A7U2l6ZTwvY29kZT4nKTwvZGQ+Ci0gICAgIDxkdD48Yj5Ob25lPC9iPjwvZHQ+Ci0gICAgIDxkZD5JZiBhIGRvY3VtZW50IGlzIGZpbGUtYmFzZWQsIG5vIEVUYWcgZmllbGQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUKLSAgICAgIHJlc3BvbnNlPC9kZD4KLSAgICA8L2RsPgotICAgIDxwPgotICAgIFRoZSBJTm9kZSwgTVRpbWUsIGFuZCBTaXplIGtleXdvcmRzIG1heSBiZSBwcmVmaXhlZCB3aXRoIGVpdGhlciAnKycKLSAgICBvciAnLScsIHdoaWNoIGFsbG93IGNoYW5nZXMgdG8gYmUgbWFkZSB0byB0aGUgZGVmYXVsdCBzZXR0aW5nCi0gICAgaW5oZXJpdGVkIGZyb20gYSBicm9hZGVyIHNjb3BlLiAgQW55IGtleXdvcmQgYXBwZWFyaW5nIHdpdGhvdXQKLSAgICBzdWNoIGEgcHJlZml4IGltbWVkaWF0ZWx5IGFuZCBjb21wbGV0ZWx5IGNhbmNlbHMgdGhlIGluaGVyaXRlZAotICAgIHNldHRpbmcuCi0gICAgPC9wPgotICAgIDxwPgotICAgIElmIGEgZGlyZWN0b3J5J3MgY29uZmlndXJhdGlvbiBpbmNsdWRlcwotICAgICc8Y29kZT5GaWxlRVRhZyZuYnNwO0lOb2RlJm5ic3A7TVRpbWUmbmJzcDtTaXplPC9jb2RlPicsIGFuZCBhCi0gICAgc3ViZGlyZWN0b3J5J3MgaW5jbHVkZXMgJzxjb2RlPkZpbGVFVGFnJm5ic3A7LUlOb2RlPC9jb2RlPicsCi0gICAgdGhlIHNldHRpbmcgZm9yIHRoYXQgc3ViZGlyZWN0b3J5ICh3aGljaCB3aWxsIGJlIGluaGVyaXRlZCBieQotICAgIGFueSBzdWItc3ViZGlyZWN0b3JpZXMgdGhhdCBkb24ndCBvdmVycmlkZSBpdCkgd2lsbCBiZSBlcXVpdmFsZW50IHRvCi0gICAgJzxjb2RlPkZpbGVFVGFnJm5ic3A7TVRpbWUmbmJzcDtTaXplPC9jb2RlPicuCi0gICAgPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcyB0eXBlPSJzZWN0aW9uIj4KLTxuYW1lPkZpbGVzPC9uYW1lPgotPGRlc2NyaXB0aW9uPkNvbnRhaW5zIHRoYXQgZGlyZWN0aXZlcyB0aGF0IGFwcGx5IHRvIG1hdGNoZWQKLWZpbGVuYW1lczwvZGVzY3JpcHRpb24+Ci08c3ludGF4PiZsdDtGaWxlcyA8ZW0+ZmlsZW5hbWU8L2VtPiZndDsgLi4uICZsdDsvRmlsZXMmZ3Q7PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8ZGlyZWN0aXZlIHR5cGU9InNlY3Rpb24iPkZpbGVzPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZQotICAgIHByb3ZpZGVzIGZvciBhY2Nlc3MgY29udHJvbCBieSBmaWxlbmFtZS4gSXQgaXMgY29tcGFyYWJsZSB0byB0aGUKLSAgICA8ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSIgdHlwZT0iZGlyZWN0aXZlIj5EaXJlY3Rvcnk8L2RpcmVjdGl2ZT4KLSAgICBkaXJlY3RpdmUgYW5kIDxkaXJlY3RpdmUgbW9kdWxlPSJjb3JlIgotICAgIHR5cGU9ImRpcmVjdGl2ZSI+TG9jYXRpb248L2RpcmVjdGl2ZT4gZGlyZWN0aXZlcy4gSXQgc2hvdWxkIGJlCi0gICAgbWF0Y2hlZCB3aXRoIGEgPGNvZGU+Jmx0Oy9GaWxlcyZndDs8L2NvZGU+IGRpcmVjdGl2ZS4gVGhlCi0gICAgZGlyZWN0aXZlcyBnaXZlbiB3aXRoaW4gdGhpcyBzZWN0aW9uIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgb2JqZWN0Ci0gICAgd2l0aCBhIGJhc2VuYW1lIChsYXN0IGNvbXBvbmVudCBvZiBmaWxlbmFtZSkgbWF0Y2hpbmcgdGhlCi0gICAgc3BlY2lmaWVkIGZpbGVuYW1lLiA8ZGlyZWN0aXZlIHR5cGU9InNlY3Rpb24iPkZpbGVzPC9kaXJlY3RpdmU+Ci0gICAgc2VjdGlvbnMgYXJlIHByb2Nlc3NlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlCi0gICAgY29uZmlndXJhdGlvbiBmaWxlLCBhZnRlciB0aGUgPGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiCi0gICAgdHlwZT0ic2VjdGlvbiI+RGlyZWN0b3J5PC9kaXJlY3RpdmU+IHNlY3Rpb25zIGFuZAotICAgIDxjb2RlPi5odGFjY2VzczwvY29kZT4gZmlsZXMgYXJlIHJlYWQsIGJ1dCBiZWZvcmUgPGRpcmVjdGl2ZQotICAgIHR5cGU9InNlY3Rpb24iIG1vZHVsZT0iY29yZSI+TG9jYXRpb248L2RpcmVjdGl2ZT4gc2VjdGlvbnMuIE5vdGUKLSAgICB0aGF0IDxkaXJlY3RpdmUgdHlwZT0ic2VjdGlvbiI+RmlsZXM8L2RpcmVjdGl2ZT4gY2FuIGJlIG5lc3RlZAotICAgIGluc2lkZSA8ZGlyZWN0aXZlIHR5cGU9InNlY3Rpb24iCi0gICAgbW9kdWxlPSJjb3JlIj5EaXJlY3Rvcnk8L2RpcmVjdGl2ZT4gc2VjdGlvbnMgdG8gcmVzdHJpY3QgdGhlCi0gICAgcG9ydGlvbiBvZiB0aGUgZmlsZXN5c3RlbSB0aGV5IGFwcGx5IHRvLjwvcD4KLQotICAgIDxwPlRoZSA8ZW0+ZmlsZW5hbWU8L2VtPiBhcmd1bWVudCBzaG91bGQgaW5jbHVkZSBhIGZpbGVuYW1lLCBvcgotICAgIGEgd2lsZC1jYXJkIHN0cmluZywgd2hlcmUgYD8nIG1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIsIGFuZAotICAgIGAqJyBtYXRjaGVzIGFueSBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycy4gRXh0ZW5kZWQgcmVndWxhcgotICAgIGV4cHJlc3Npb25zIGNhbiBhbHNvIGJlIHVzZWQsIHdpdGggdGhlIGFkZGl0aW9uIG9mIHRoZQotICAgIDxjb2RlPn48L2NvZGU+IGNoYXJhY3Rlci4gRm9yIGV4YW1wbGU6PC9wPgotPGV4YW1wbGU+Ci0gICAmbHQ7RmlsZXMgfiAiXC4oZ2lmfGpwZT9nfHBuZykkIiZndDsKLTwvZXhhbXBsZT4KLSAgICA8cD53b3VsZCBtYXRjaCBtb3N0IGNvbW1vbiBJbnRlcm5ldCBncmFwaGljcyBmb3JtYXRzLiBJbiBBcGFjaGUgMS4zCi0gICAgYW5kIGxhdGVyLCA8ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSIKLSAgICB0eXBlPSJzZWN0aW9uIj5GaWxlc01hdGNoPC9kaXJlY3RpdmU+IGlzIHByZWZlcnJlZCwgaG93ZXZlci48L3A+Ci0KLSAgICA8cD5Ob3RlIHRoYXQgdW5saWtlIDxkaXJlY3RpdmUgdHlwZT0ic2VjdGlvbiIKLSAgICBtb2R1bGU9ImNvcmUiPkRpcmVjdG9yeTwvZGlyZWN0aXZlPiBhbmQgPGRpcmVjdGl2ZSB0eXBlPSJzZWN0aW9uIgotICAgIG1vZHVsZT0iY29yZSI+TG9jYXRpb248L2RpcmVjdGl2ZT4gc2VjdGlvbnMsIDxkaXJlY3RpdmUKLSAgICB0eXBlPSJzZWN0aW9uIj5GaWxlczwvZGlyZWN0aXZlPiBzZWN0aW9ucyBjYW4gYmUgdXNlZCBpbnNpZGUKLSAgICAuaHRhY2Nlc3MgZmlsZXMuIFRoaXMgYWxsb3dzIHVzZXJzIHRvIGNvbnRyb2wgYWNjZXNzIHRvIHRoZWlyIG93bgotICAgIGZpbGVzLCBhdCBhIGZpbGUtYnktZmlsZSBsZXZlbC48L3A+Ci0KLTwvdXNhZ2U+Ci08c2VlYWxzbz48YSBocmVmPSIuLi9zZWN0aW9ucy5odG1sIj5Ib3cKLSAgICBEaXJlY3RvcnksIExvY2F0aW9uIGFuZCBGaWxlcyBzZWN0aW9ucyB3b3JrPC9hPiBmb3IgYW4KLSAgICBleHBsYW5hdGlvbiBvZiBob3cgdGhlc2UgZGlmZmVyZW50IHNlY3Rpb25zIGFyZSBjb21iaW5lZCB3aGVuIGEKLSAgICByZXF1ZXN0IGlzIHJlY2VpdmVkPC9zZWVhbHNvPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzIHR5cGU9InNlY3Rpb24iPgotPG5hbWU+RmlsZXNNYXRjaDwvbmFtZT4KLTxkZXNjcmlwdGlvbj5Db250YWlucyB0aGF0IGRpcmVjdGl2ZXMgdGhhdCBhcHBseSB0byByZWd1bGFyLWV4cHJlc3Npb24gbWF0Y2hlZAotZmlsZW5hbWVzPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+Jmx0O0ZpbGVzTWF0Y2ggPGVtPnJlZ2V4PC9lbT4mZ3Q7IC4uLiAmbHQ7L0ZpbGVzTWF0Y2gmZ3Q7PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8ZGlyZWN0aXZlIHR5cGU9InNlY3Rpb24iPkZpbGVzTWF0Y2g8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlCi0gICAgcHJvdmlkZXMgZm9yIGFjY2VzcyBjb250cm9sIGJ5IGZpbGVuYW1lLCBqdXN0IGFzIHRoZSA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJjb3JlIiB0eXBlPSJzZWN0aW9uIj5GaWxlczwvZGlyZWN0aXZlPiBkaXJlY3RpdmUKLSAgICBkb2VzLiBIb3dldmVyLCBpdCBhY2NlcHRzIGEgcmVndWxhciBleHByZXNzaW9uLiBGb3IgZXhhbXBsZTo8L3A+Ci08ZXhhbXBsZT4KLSAgICZsdDtGaWxlc01hdGNoICJcLihnaWZ8anBlP2d8cG5nKSQiJmd0OwotPC9leGFtcGxlPgotCi0gICAgPHA+d291bGQgbWF0Y2ggbW9zdCBjb21tb24gSW50ZXJuZXQgZ3JhcGhpY3MgZm9ybWF0cy48L3A+Ci08L3VzYWdlPgotCi08c2VlYWxzbz48YSBocmVmPSIuLi9zZWN0aW9ucy5odG1sIj5Ib3cKLSAgICBEaXJlY3RvcnksIExvY2F0aW9uIGFuZCBGaWxlcyBzZWN0aW9ucyB3b3JrPC9hPiBmb3IgYW4KLSAgICBleHBsYW5hdGlvbiBvZiBob3cgdGhlc2UgZGlmZmVyZW50IHNlY3Rpb25zIGFyZSBjb21iaW5lZCB3aGVuIGEKLSAgICByZXF1ZXN0IGlzIHJlY2VpdmVkPC9zZWVhbHNvPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+Rm9yY2VUeXBlPC9uYW1lPgotPGRlc2NyaXB0aW9uPkZvcmNlcyBhbGwgbWF0Y2hpbmcgZmlsZXMgdG8gYmUgc2VydmVkIHdpdGggdGhlIHNwZWNpZmllZAotTUlNRSBjb250ZW50LXR5cGU8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5Gb3JjZVR5cGUgPGVtPm1pbWUtdHlwZTwvZW0+PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0Pjxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08Y29tcGF0aWJpbGl0eT5Nb3ZlZCB0byB0aGUgY29yZSBpbiBBcGFjaGUgMi4wPC9jb21wYXRpYmlsaXR5PgotCi08dXNhZ2U+Ci0gICAgPHA+V2hlbiBwbGFjZWQgaW50byBhbiA8Y29kZT4uaHRhY2Nlc3M8L2NvZGU+IGZpbGUgb3IgYQotICAgIDxkaXJlY3RpdmUgdHlwZT0ic2VjdGlvbiIgbW9kdWxlPSJjb3JlIj5EaXJlY3Rvcnk8L2RpcmVjdGl2ZT4sIG9yCi0gICAgPGRpcmVjdGl2ZSB0eXBlPSJzZWN0aW9uIiBtb2R1bGU9ImNvcmUiPkxvY2F0aW9uPC9kaXJlY3RpdmU+IG9yIAotICAgIDxkaXJlY3RpdmUgdHlwZT0ic2VjdGlvbiIgbW9kdWxlPSJjb3JlIj5GaWxlczwvZGlyZWN0aXZlPgotICAgIHNlY3Rpb24sIHRoaXMgZGlyZWN0aXZlIGZvcmNlcyBhbGwgbWF0Y2hpbmcgZmlsZXMgdG8gYmUgc2VydmVkCi0gICAgd2l0aCB0aGUgY29udGVudCB0eXBlIGlkZW50aWZpY2F0aW9uIGdpdmVuIGJ5Ci0gICAgPGVtPm1pbWUtdHlwZTwvZW0+LiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhZCBhIGRpcmVjdG9yeSBmdWxsIG9mCi0gICAgR0lGIGZpbGVzLCBidXQgZGlkIG5vdCB3YW50IHRvIGxhYmVsIHRoZW0gYWxsIHdpdGggIi5naWYiLCB5b3UKLSAgICBtaWdodCB3YW50IHRvIHVzZTo8L3A+Ci08ZXhhbXBsZT4KLSAgICBGb3JjZVR5cGUgaW1hZ2UvZ2lmCi08L2V4YW1wbGU+Ci0KLSAgICA8cD5Ob3RlIHRoYXQgdW5saWtlIDxkaXJlY3RpdmUgbW9kdWxlPSJjb3JlIj5EZWZhdWx0VHlwZTwvZGlyZWN0aXZlPiwKLSAgICB0aGlzIGRpcmVjdGl2ZSBvdmVycmlkZXMgYWxsIG1pbWUtdHlwZSBhc3NvY2lhdGlvbnMsIGluY2x1ZGluZwotICAgIGZpbGVuYW1lIGV4dGVuc2lvbnMsIHRoYXQgbWlnaHQgaWRlbnRpZnkgdGhlIG1lZGlhIHR5cGUuPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkhvc3RuYW1lTG9va3VwczwvbmFtZT4KLTxkZXNjcmlwdGlvbj5FbmFibGVzIEROUyBsb29rdXBzIG9uIGNsaWVudCBJUCBhZGRyZXNzZXM8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5Ib3N0bmFtZUxvb2t1cHMgb258b2ZmfGRvdWJsZTwvc3ludGF4PgotPGRlZmF1bHQ+SG9zdG5hbWVMb29rdXBzIG9mZjwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+VGhpcyBkaXJlY3RpdmUgZW5hYmxlcyBETlMgbG9va3VwcyBzbyB0aGF0IGhvc3QgbmFtZXMgY2FuIGJlCi0gICAgbG9nZ2VkIChhbmQgcGFzc2VkIHRvIENHSXMvU1NJcyBpbiA8Y29kZT5SRU1PVEVfSE9TVDwvY29kZT4pLgotICAgIFRoZSB2YWx1ZSA8Y29kZT5kb3VibGU8L2NvZGU+IHJlZmVycyB0byBkb2luZyBkb3VibGUtcmV2ZXJzZQotICAgIEROUy4gVGhhdCBpcywgYWZ0ZXIgYSByZXZlcnNlIGxvb2t1cCBpcyBwZXJmb3JtZWQsIGEgZm9yd2FyZAotICAgIGxvb2t1cCBpcyB0aGVuIHBlcmZvcm1lZCBvbiB0aGF0IHJlc3VsdC4gQXQgbGVhc3Qgb25lIG9mIHRoZSBpcAotICAgIGFkZHJlc3NlcyBpbiB0aGUgZm9yd2FyZCBsb29rdXAgbXVzdCBtYXRjaCB0aGUgb3JpZ2luYWwKLSAgICBhZGRyZXNzLiAoSW4gInRjcHdyYXBwZXJzIiB0ZXJtaW5vbG9neSB0aGlzIGlzIGNhbGxlZAotICAgIDxjb2RlPlBBUkFOT0lEPC9jb2RlPi4pPC9wPgotCi0gICAgPHA+UmVnYXJkbGVzcyBvZiB0aGUgc2V0dGluZywgd2hlbiA8bW9kdWxlPm1vZF9hY2Nlc3M8L21vZHVsZT4gaXMKLSAgICB1c2VkIGZvciBjb250cm9sbGluZyBhY2Nlc3MgYnkgaG9zdG5hbWUsIGEgZG91YmxlIHJldmVyc2UgbG9va3VwCi0gICAgd2lsbCBiZSBwZXJmb3JtZWQuICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3Igc2VjdXJpdHkuIE5vdGUgdGhhdCB0aGUKLSAgICByZXN1bHQgb2YgdGhpcyBkb3VibGUtcmV2ZXJzZSBpc24ndCBnZW5lcmFsbHkgYXZhaWxhYmxlIHVubGVzcyB5b3UKLSAgICBzZXQgPGNvZGU+SG9zdG5hbWVMb29rdXBzIGRvdWJsZTwvY29kZT4uIEZvciBleGFtcGxlLCBpZiBvbmx5Ci0gICAgPGNvZGU+SG9zdG5hbWVMb29rdXBzIG9uPC9jb2RlPiBhbmQgYSByZXF1ZXN0IGlzIG1hZGUgdG8gYW4gb2JqZWN0Ci0gICAgdGhhdCBpcyBwcm90ZWN0ZWQgYnkgaG9zdG5hbWUgcmVzdHJpY3Rpb25zLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIKLSAgICB0aGUgZG91YmxlLXJldmVyc2UgZmFpbHMgb3Igbm90LCBDR0lzIHdpbGwgc3RpbGwgYmUgcGFzc2VkIHRoZQotICAgIHNpbmdsZS1yZXZlcnNlIHJlc3VsdCBpbiA8Y29kZT5SRU1PVEVfSE9TVDwvY29kZT4uPC9wPgotCi0gICAgPHA+VGhlIGRlZmF1bHQgaXMgb2ZmIGluIG9yZGVyIHRvIHNhdmUgdGhlIG5ldHdvcmsKLSAgICB0cmFmZmljIGZvciB0aG9zZSBzaXRlcyB0aGF0IGRvbid0IHRydWx5IG5lZWQgdGhlIHJldmVyc2UKLSAgICBsb29rdXBzIGRvbmUuIEl0IGlzIGFsc28gYmV0dGVyIGZvciB0aGUgZW5kIHVzZXJzIGJlY2F1c2UgdGhleQotICAgIGRvbid0IGhhdmUgdG8gc3VmZmVyIHRoZSBleHRyYSBsYXRlbmN5IHRoYXQgYSBsb29rdXAgZW50YWlscy4KLSAgICBIZWF2aWx5IGxvYWRlZCBzaXRlcyBzaG91bGQgbGVhdmUgdGhpcyBkaXJlY3RpdmUKLSAgICA8Y29kZT5vZmY8L2NvZGU+LCBzaW5jZSBETlMgbG9va3VwcyBjYW4gdGFrZSBjb25zaWRlcmFibGUKLSAgICBhbW91bnRzIG9mIHRpbWUuIFRoZSB1dGlsaXR5IDxhCi0gICAgaHJlZj0iLi4vcHJvZ3JhbXMvbG9ncmVzb2x2ZS5odG1sIj5sb2dyZXNvbHZlPC9hPiwgcHJvdmlkZWQgaW4KLSAgICB0aGUgPGVtPi9zdXBwb3J0PC9lbT4gZGlyZWN0b3J5LCBjYW4gYmUgdXNlZCB0byBsb29rIHVwIGhvc3QKLSAgICBuYW1lcyBmcm9tIGxvZ2dlZCBJUCBhZGRyZXNzZXMgb2ZmbGluZS48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+SWRlbnRpdHlDaGVjazwvbmFtZT4KLTxkZXNjcmlwdGlvbj5FbmFibGVzIGxvZ2dpbmcgb2YgdGhlIFJGQzE0MTMgaWRlbnRpdHkgb2YgdGhlIHJlbW90ZSAKLXVzZXI8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5JZGVudGl0eUNoZWNrIG9ufG9mZjwvc3ludGF4PgotPGRlZmF1bHQ+SWRlbnRpdHlDaGVjayBvZmY8L2RlZmF1bHQ+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGlzIGRpcmVjdGl2ZSBlbmFibGVzIFJGQzE0MTMtY29tcGxpYW50IGxvZ2dpbmcgb2YgdGhlCi0gICAgcmVtb3RlIHVzZXIgbmFtZSBmb3IgZWFjaCBjb25uZWN0aW9uLCB3aGVyZSB0aGUgY2xpZW50IG1hY2hpbmUKLSAgICBydW5zIGlkZW50ZCBvciBzb21ldGhpbmcgc2ltaWxhci4gVGhpcyBpbmZvcm1hdGlvbiBpcyBsb2dnZWQgaW4KLSAgICB0aGUgYWNjZXNzIGxvZy48L3A+Ci0KLSAgICA8cD5UaGUgaW5mb3JtYXRpb24gc2hvdWxkIG5vdCBiZSB0cnVzdGVkIGluIGFueSB3YXkgZXhjZXB0IGZvcgotICAgIHJ1ZGltZW50YXJ5IHVzYWdlIHRyYWNraW5nLjwvcD4KLQotICAgIDxwPk5vdGUgdGhhdCB0aGlzIGNhbiBjYXVzZSBzZXJpb3VzIGxhdGVuY3kgcHJvYmxlbXMgYWNjZXNzaW5nCi0gICAgeW91ciBzZXJ2ZXIgc2luY2UgZXZlcnkgcmVxdWVzdCByZXF1aXJlcyBvbmUgb2YgdGhlc2UgbG9va3VwcwotICAgIHRvIGJlIHBlcmZvcm1lZC4gV2hlbiBmaXJld2FsbHMgYXJlIGludm9sdmVkIGVhY2ggbG9va3VwIG1pZ2h0Ci0gICAgcG9zc2libHkgZmFpbCBhbmQgYWRkIDMwIHNlY29uZHMgb2YgbGF0ZW5jeSB0byBlYWNoIGhpdC4gU28gaW4KLSAgICBnZW5lcmFsIHRoaXMgaXMgbm90IHZlcnkgdXNlZnVsIG9uIHB1YmxpYyBzZXJ2ZXJzIGFjY2Vzc2libGUKLSAgICBmcm9tIHRoZSBJbnRlcm5ldC48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzIHR5cGU9InNlY3Rpb24iPgotPG5hbWU+SWZEZWZpbmU8L25hbWU+Ci08ZGVzY3JpcHRpb24+RW5jbG9zZXMgZGlyZWN0aXZlcyB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkIG9ubHkKLWlmIGEgdGVzdCBpcyB0cnVlIGF0IHN0YXJ0dXA8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD4mbHQ7SWZEZWZpbmUgWyFdPGVtPnBhcmFtZXRlci1uYW1lPC9lbT4mZ3Q7IDxlbT4uLi48L2VtPgotICAgICZsdDsvSWZEZWZpbmUmZ3Q7PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8Y29kZT4mbHQ7SWZEZWZpbmUKLSAgICA8ZW0+dGVzdDwvZW0+Jmd0Oy4uLiZsdDsvSWZEZWZpbmUmZ3Q7PC9jb2RlPiBzZWN0aW9uIGlzIHVzZWQgdG8KLSAgICBtYXJrIGRpcmVjdGl2ZXMgdGhhdCBhcmUgY29uZGl0aW9uYWwuIFRoZSBkaXJlY3RpdmVzIHdpdGhpbiBhbgotICAgIDxkaXJlY3RpdmUgdHlwZT0ic2VjdGlvbiI+SWZEZWZpbmU8L2RpcmVjdGl2ZT4gc2VjdGlvbiBhcmUgb25seQotICAgIHByb2Nlc3NlZCBpZiB0aGUgPGVtPnRlc3Q8L2VtPiBpcyB0cnVlLiBJZiA8ZW0+dGVzdDwvZW0+IGlzIGZhbHNlLAotICAgIGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCBtYXJrZXJzIGlzIGlnbm9yZWQuPC9wPgotCi0gICAgPHA+VGhlIDxlbT50ZXN0PC9lbT4gaW4gdGhlIDxkaXJlY3RpdmUKLSAgICB0eXBlPSJzZWN0aW9uIj5JZkRlZmluZTwvZGlyZWN0aXZlPiBzZWN0aW9uIGRpcmVjdGl2ZSBjYW4gYmUgb25lCi0gICAgb2YgdHdvIGZvcm1zOjwvcD4KLQotICAgIDx1bD4KLSAgICAgIDxsaT48ZW0+cGFyYW1ldGVyLW5hbWU8L2VtPjwvbGk+Ci0KLSAgICAgIDxsaT48Y29kZT4hPC9jb2RlPjxlbT5wYXJhbWV0ZXItbmFtZTwvZW0+PC9saT4KLSAgICA8L3VsPgotCi0gICAgPHA+SW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgZGlyZWN0aXZlcyBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kCi0gICAgbWFya2VycyBhcmUgb25seSBwcm9jZXNzZWQgaWYgdGhlIHBhcmFtZXRlciBuYW1lZAotICAgIDxlbT5wYXJhbWV0ZXItbmFtZTwvZW0+IGlzIGRlZmluZWQuIFRoZSBzZWNvbmQgZm9ybWF0IHJldmVyc2VzCi0gICAgdGhlIHRlc3QsIGFuZCBvbmx5IHByb2Nlc3NlcyB0aGUgZGlyZWN0aXZlcyBpZgotICAgIDxlbT5wYXJhbWV0ZXItbmFtZTwvZW0+IGlzIDxzdHJvbmc+bm90PC9zdHJvbmc+IGRlZmluZWQuPC9wPgotCi0gICAgPHA+VGhlIDxlbT5wYXJhbWV0ZXItbmFtZTwvZW0+IGFyZ3VtZW50IGlzIGEgZGVmaW5lIGFzIGdpdmVuIG9uCi0gICAgdGhlIDxjb2RlPmh0dHBkPC9jb2RlPiBjb21tYW5kIGxpbmUgdmlhCi0gICAgPGNvZGU+LUQ8L2NvZGU+PGVtPnBhcmFtZXRlci08L2VtPiwgYXQgdGhlIHRpbWUgdGhlIHNlcnZlciB3YXMKLSAgICBzdGFydGVkLjwvcD4KLQotICAgIDxwPjxkaXJlY3RpdmUgdHlwZT0ic2VjdGlvbiI+SWZEZWZpbmU8L2RpcmVjdGl2ZT4gc2VjdGlvbnMgYXJlCi0gICAgbmVzdC1hYmxlLCB3aGljaCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgc2ltcGxlCi0gICAgbXVsdGlwbGUtcGFyYW1ldGVyIHRlc3RzLiBFeGFtcGxlOjwvcD4KLTxleGFtcGxlPjxwcmU+Ci0gICQgaHR0cGQgLURSZXZlcnNlUHJveHkgLi4uCi0KLSAgIyBodHRwZC5jb25mCi0gICZsdDtJZkRlZmluZSBSZXZlcnNlUHJveHkmZ3Q7Ci0gIExvYWRNb2R1bGUgcmV3cml0ZV9tb2R1bGUgbW9kdWxlcy9tb2RfcmV3cml0ZS5zbwotICBMb2FkTW9kdWxlIHByb3h5X21vZHVsZSAgIG1vZHVsZXMvbGlicHJveHkuc28KLSAgJmx0Oy9JZkRlZmluZSZndDsKLTwvcHJlPjwvZXhhbXBsZT4KLQotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcyB0eXBlPSJzZWN0aW9uIj4KLTxuYW1lPklmTW9kdWxlPC9uYW1lPgotPGRlc2NyaXB0aW9uPkVuY2xvc2VzIGRpcmVjdGl2ZXMgdGhhdCBhcmUgcHJvY2Vzc2VkIGNvbmRpdGlvbmFsIG9uIHRoZQotcHJlc2VuY2Ugb2YgYWJzZW5jZSBvZiBhIHNwZWNpZmljIG1vZHVsZTwvZGVzY3JpcHRpb24+Ci08c3ludGF4PiZsdDtJZk1vZHVsZSBbIV08ZW0+bW9kdWxlLW5hbWU8L2VtPiZndDsgPGVtPi4uLjwvZW0+Ci0gICAgJmx0Oy9JZk1vZHVsZSZndDs8L3N5bnRheD4gICAgIAotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0Pjxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgPGNvZGU+Jmx0O0lmTW9kdWxlCi0gICAgPGVtPnRlc3Q8L2VtPiZndDsuLi4mbHQ7L0lmTW9kdWxlJmd0OzwvY29kZT4gc2VjdGlvbiBpcyB1c2VkIHRvCi0gICAgbWFyayBkaXJlY3RpdmVzIHRoYXQgYXJlIGNvbmRpdGlvbmFsLiBUaGUgZGlyZWN0aXZlcyB3aXRoaW4gYW4KLSAgICA8ZGlyZWN0aXZlIHR5cGU9InNlY3Rpb24iPklmTW9kdWxlPC9kaXJlY3RpdmU+IHNlY3Rpb24gYXJlIG9ubHkKLSAgICBwcm9jZXNzZWQgaWYgdGhlIDxlbT50ZXN0PC9lbT4gaXMgdHJ1ZS4gSWYgPGVtPnRlc3Q8L2VtPiBpcyBmYWxzZSwKLSAgICBldmVyeXRoaW5nIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgbWFya2VycyBpcyBpZ25vcmVkLjwvcD4KLQotICAgIDxwPlRoZSA8ZW0+dGVzdDwvZW0+IGluIHRoZSA8ZGlyZWN0aXZlCi0gICAgdHlwZT0ic2VjdGlvbiI+SWZNb2R1bGU8L2RpcmVjdGl2ZT4gc2VjdGlvbiBkaXJlY3RpdmUgY2FuIGJlIG9uZQotICAgIG9mIHR3byBmb3Jtczo8L3A+Ci0KLSAgICA8dWw+Ci0gICAgICA8bGk+PGVtPm1vZHVsZSBuYW1lPC9lbT48L2xpPgotCi0gICAgICA8bGk+ITxlbT5tb2R1bGUgbmFtZTwvZW0+PC9saT4KLSAgICA8L3VsPgotCi0gICAgPHA+SW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgZGlyZWN0aXZlcyBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kCi0gICAgbWFya2VycyBhcmUgb25seSBwcm9jZXNzZWQgaWYgdGhlIG1vZHVsZSBuYW1lZCA8ZW0+bW9kdWxlCi0gICAgbmFtZTwvZW0+IGlzIGluY2x1ZGVkIGluIEFwYWNoZSAtLSBlaXRoZXIgY29tcGlsZWQgaW4gb3IKLSAgICBkeW5hbWljYWxseSBsb2FkZWQgdXNpbmcgPGRpcmVjdGl2ZSBtb2R1bGU9Im1vZF9zbyIKLSAgICA+TG9hZE1vZHVsZTwvZGlyZWN0aXZlPi4gVGhlIHNlY29uZCBmb3JtYXQKLSAgICByZXZlcnNlcyB0aGUgdGVzdCwgYW5kIG9ubHkgcHJvY2Vzc2VzIHRoZSBkaXJlY3RpdmVzIGlmIDxlbT5tb2R1bGUKLSAgICBuYW1lPC9lbT4gaXMgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gaW5jbHVkZWQuPC9wPgotCi0gICAgPHA+VGhlIDxlbT5tb2R1bGUgbmFtZTwvZW0+IGFyZ3VtZW50IGlzIHRoZSBmaWxlIG5hbWUgb2YgdGhlCi0gICAgbW9kdWxlLCBhdCB0aGUgdGltZSBpdCB3YXMgY29tcGlsZWQuCi0gICAgRm9yIGV4YW1wbGUsIDxjb2RlPm1vZF9yZXdyaXRlLmM8L2NvZGU+LjwvcD4KLQotICAgIDxwPjxkaXJlY3RpdmUgdHlwZT0ic2VjdGlvbiI+SWZNb2R1bGU8L2RpcmVjdGl2ZT4gc2VjdGlvbnMgYXJlCi0gICAgbmVzdC1hYmxlLCB3aGljaCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgc2ltcGxlIG11bHRpcGxlLW1vZHVsZQotICAgIHRlc3RzLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5JbmNsdWRlPC9uYW1lPgotPGRlc2NyaXB0aW9uPkluY2x1ZGVzIG90aGVyIGNvbmZpZ3VyYXRpb24gZmlsZXMgZnJvbSB3aXRoaW4KLXRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlczwvZGVzY3JpcHRpb24+Ci08c3ludGF4PkluY2x1ZGUgPGVtPmZpbGUtcGF0aDwvZW0+fDxlbT5kaXJlY3RvcnktcGF0aDwvZW0+PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+VGhpcyBkaXJlY3RpdmUgYWxsb3dzIGluY2x1c2lvbiBvZiBvdGhlciBjb25maWd1cmF0aW9uIGZpbGVzCi0gICAgZnJvbSB3aXRoaW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGVzLjwvcD4KLQotICAgIDxwPklmIDxkaXJlY3RpdmU+SW5jbHVkZTwvZGlyZWN0aXZlPiBwb2ludHMgdG8gYSBkaXJlY3RvcnksIHJhdGhlciB0aGFuIGEKLSAgICBmaWxlLCBBcGFjaGUgd2lsbCByZWFkIGFsbCBmaWxlcyBpbiB0aGF0IGRpcmVjdG9yeSwgYW5kIGFueQotICAgIHN1YmRpcmVjdG9yeSwgYW5kIHBhcnNlIHRob3NlIGFzIGNvbmZpZ3VyYXRpb24gZmlsZXMuPC9wPgotCi0gICAgPHA+VGhlIGZpbGUgcGF0aCBzcGVjaWZpZWQgbWF5IGJlIGEgZnVsbHkgcXVhbGlmaWVkIHBhdGggKGkuZS4KLSAgICBzdGFydGluZyB3aXRoIGEgc2xhc2gpLCBvciBtYXkgYmUgcmVsYXRpdmUgdG8gdGhlIAotICAgIDxkaXJlY3RpdmUgbW9kdWxlPSJjb3JlIj5TZXJ2ZXJSb290PC9kaXJlY3RpdmU+IGRpcmVjdG9yeS48L3A+Ci0KLSAgICA8cD5FeGFtcGxlczo8L3A+Ci0KLTxleGFtcGxlPgotICAgICBJbmNsdWRlIC91c3IvbG9jYWwvYXBhY2hlL2NvbmYvc3NsLmNvbmY8YnIgLz4KLSAgICAgSW5jbHVkZSAvdXNyL2xvY2FsL2FwYWNoZS9jb25mL3Zob3N0cy8KLTwvZXhhbXBsZT4KLQotICAgICA8cD5PciwgcHJvdmlkaW5nIHBhdGhzIHJlbGF0aXZlIHRvIHlvdXIgPGNvZGU+U2VydmVyUm9vdDwvY29kZT4KLSAgICAgZGlyZWN0b3J5OjwvcD4KLQotPGV4YW1wbGU+Ci0gICAgIEluY2x1ZGUgY29uZi9zc2wuY29uZjxiciAvPgotICAgICBJbmNsdWRlIGNvbmYvdmhvc3RzLwotPC9leGFtcGxlPgotCi0gICAgIDxwPk1ha2Ugc3VyZSB0aGF0IGFuIGluY2x1ZGVkIGRpcmVjdG9yeSBkb2VzIG5vdCBjb250YWluIGFueSBzdHJheQotICAgICBmaWxlcywgc3VjaCBhcyBlZGl0b3IgdGVtcG9yYXJ5IGZpbGVzLCBmb3IgZXhhbXBsZSwgYXMgQXBhY2hlIHdpbGwKLSAgICAgYXR0ZW1wdCB0byByZWFkIHRoZW0gaW4gYW5kIHVzZSB0aGUgY29udGVudHMgYXMgY29uZmlndXJhdGlvbgotICAgICBkaXJlY3RpdmVzLCB3aGljaCBtYXkgY2F1c2UgdGhlIHNlcnZlciB0byBmYWlsIG9uIHN0YXJ0IHVwLgotICAgICBSdW5uaW5nIDxjb2RlPmFwYWNoZWN0bCBjb25maWd0ZXN0PC9jb2RlPiB3aWxsIGdpdmUgeW91IGEgbGlzdCBvZgotICAgICB0aGUgZmlsZXMgdGhhdCBhcmUgYmVpbmcgcHJvY2Vzc2VkIGR1cmluZyB0aGUgY29uZmlndXJhdGlvbgotICAgICBjaGVjazo8L3A+Ci0KLTxleGFtcGxlPjxwcmU+Ci0gcm9vdEBob3N0IyBhcGFjaGVjdGwgY29uZmlndGVzdAotICBQcm9jZXNzaW5nIGNvbmZpZyBkaXJlY3Rvcnk6IC91c3IvbG9jYWwvYXBhY2hlL2NvbmYvdmhvc3RzCi0gIFByb2Nlc3NpbmcgY29uZmlnIGZpbGU6IC91c3IvbG9jYWwvYXBhY2hlL2NvbmYvdmhvc3RzL3Zob3N0MQotICBQcm9jZXNzaW5nIGNvbmZpZyBmaWxlOiAvdXNyL2xvY2FsL2FwYWNoZS9jb25mL3Zob3N0cy92aG9zdDIKLSBTeW50YXggT0sKLTwvcHJlPjwvZXhhbXBsZT4KLQotICAgICA8cD5UaGlzIHdpbGwgaGVscCBpbiB2ZXJpZnlpbmcgdGhhdCB5b3UgYXJlIGdldHRpbmcgb25seSB0aGUgZmlsZXMKLSAgICAgdGhhdCB5b3UgaW50ZW5kZWQgYXMgcGFydCBvZiB5b3VyIGNvbmZpZ3VyYXRpb24uPC9wPgotPC91c2FnZT4KLQotPHNlZWFsc28+PGEgaHJlZj0iLi4vcHJvZ3JhbXMvYXBhY2hlY3RsLmh0bWwiPmFwYWNoZWN0bDwvYT48L3NlZWFsc28+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5LZWVwQWxpdmU8L25hbWU+Ci08ZGVzY3JpcHRpb24+VHVybnMgb24gb3Igb2ZmIEhUVFAgcGVyc2lzdGVudCBjb25uZWN0aW9ucy48L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5LZWVwQWxpdmUgb258b2ZmPC9zeW50YXg+Ci08ZGVmYXVsdD5LZWVwQWxpdmUgT248L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIEtlZXAtQWxpdmUgZXh0ZW5zaW9uIHRvIEhUVFAvMS4wIGFuZCB0aGUgcGVyc2lzdGVudAotICAgIGNvbm5lY3Rpb24gZmVhdHVyZSBvZiBIVFRQLzEuMSBwcm92aWRlIGxvbmctbGl2ZWQgSFRUUCBzZXNzaW9ucwotICAgIHdoaWNoIGFsbG93IG11bHRpcGxlIHJlcXVlc3RzIHRvIGJlIHNlbnQgb3ZlciB0aGUgc2FtZSBUQ1AKLSAgICBjb25uZWN0aW9uLiBJbiBzb21lIGNhc2VzIHRoaXMgaGFzIGJlZW4gc2hvd24gdG8gcmVzdWx0IGluIGFuCi0gICAgYWxtb3N0IDUwJSBzcGVlZHVwIGluIGxhdGVuY3kgdGltZXMgZm9yIEhUTUwgZG9jdW1lbnRzIHdpdGgKLSAgICBtYW55IGltYWdlcy4gVG8gZW5hYmxlIEtlZXAtQWxpdmUgY29ubmVjdGlvbnMgaW4gQXBhY2hlIDEuMiBhbmQKLSAgICBsYXRlciwgc2V0IDxjb2RlPktlZXBBbGl2ZSBPbjwvY29kZT4uPC9wPgotCi0gICAgPHA+Rm9yIEhUVFAvMS4wIGNsaWVudHMsIEtlZXAtQWxpdmUgY29ubmVjdGlvbnMgd2lsbCBvbmx5IGJlCi0gICAgdXNlZCBpZiB0aGV5IGFyZSBzcGVjaWZpY2FsbHkgcmVxdWVzdGVkIGJ5IGEgY2xpZW50LiBJbgotICAgIGFkZGl0aW9uLCBhIEtlZXAtQWxpdmUgY29ubmVjdGlvbiB3aXRoIGFuIEhUVFAvMS4wIGNsaWVudCBjYW4KLSAgICBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgbGVuZ3RoIG9mIHRoZSBjb250ZW50IGlzIGtub3duIGluCi0gICAgYWR2YW5jZS4gVGhpcyBpbXBsaWVzIHRoYXQgZHluYW1pYyBjb250ZW50IHN1Y2ggYXMgQ0dJIG91dHB1dCwKLSAgICBTU0kgcGFnZXMsIGFuZCBzZXJ2ZXItZ2VuZXJhdGVkIGRpcmVjdG9yeSBsaXN0aW5ncyB3aWxsCi0gICAgZ2VuZXJhbGx5IG5vdCB1c2UgS2VlcC1BbGl2ZSBjb25uZWN0aW9ucyB0byBIVFRQLzEuMCBjbGllbnRzLgotICAgIEZvciBIVFRQLzEuMSBjbGllbnRzLCBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIGFyZSB0aGUgZGVmYXVsdAotICAgIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiBJZiB0aGUgY2xpZW50IHJlcXVlc3RzIGl0LCBjaHVua2VkCi0gICAgZW5jb2Rpbmcgd2lsbCBiZSB1c2VkIGluIG9yZGVyIHRvIHNlbmQgY29udGVudCBvZiB1bmtub3duCi0gICAgbGVuZ3RoIG92ZXIgcGVyc2lzdGVudCBjb25uZWN0aW9ucy48L3A+Ci08L3VzYWdlPgotCi08c2VlYWxzbz48ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSI+TWF4S2VlcEFsaXZlUmVxdWVzdHM8L2RpcmVjdGl2ZT48L3NlZWFsc28+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5LZWVwQWxpdmVUaW1lb3V0PC9uYW1lPgotPGRlc2NyaXB0aW9uPlNldHMgdGhlIGFtb3VudCBvZiB0aW1lIHRoZSBzZXJ2ZXIgd2lsbCB3YWl0IGZvciBzdWJzZXF1ZW50Ci1yZXF1ZXN0cyBvbiBhIHBlcnNpc3RlbnQgY29ubmVjdGlvbjwvZGVzY3JpcHRpb24+Ci08c3ludGF4PktlZXBBbGl2ZVRpbWVvdXQgPGVtPnNlY29uZHM8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+S2VlcEFsaXZlVGltZW91dCAxNTwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgbnVtYmVyIG9mIHNlY29uZHMgQXBhY2hlIHdpbGwgd2FpdCBmb3IgYSBzdWJzZXF1ZW50Ci0gICAgcmVxdWVzdCBiZWZvcmUgY2xvc2luZyB0aGUgY29ubmVjdGlvbi4gT25jZSBhIHJlcXVlc3QgaGFzIGJlZW4KLSAgICByZWNlaXZlZCwgdGhlIHRpbWVvdXQgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZQotICAgIDxkaXJlY3RpdmUgbW9kdWxlPSJjb3JlIj5UaW1lb3V0PC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBhcHBsaWVzLjwvcD4KLQotICAgIDxwPlNldHRpbmcgPGRpcmVjdGl2ZT5LZWVwQWxpdmVUaW1lb3V0PC9kaXJlY3RpdmU+IHRvIGEgaGlnaCB2YWx1ZQotICAgIG1heSBjYXVzZSBwZXJmb3JtYW5jZSBwcm9ibGVtcyBpbiBoZWF2aWx5IGxvYWRlZCBzZXJ2ZXJzLiBUaGUKLSAgICBoaWdoZXIgdGhlIHRpbWVvdXQsIHRoZSBtb3JlIHNlcnZlciBwcm9jZXNzZXMgd2lsbCBiZSBrZXB0Ci0gICAgb2NjdXBpZWQgd2FpdGluZyBvbiBjb25uZWN0aW9ucyB3aXRoIGlkbGUgY2xpZW50cy48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzIHR5cGU9InNlY3Rpb24iPgotPG5hbWU+TGltaXQ8L25hbWU+Ci08ZGVzY3JpcHRpb24+UmVzdHJpY3QgYWNjZXNzIGNvbnRyb2xzIHRvIG9ubHkgY2VydGFpbiBIVFRQCi1tZXRob2RzPC9kZXNjcmlwdGlvbj4gICAgCi08c3ludGF4PiZsdDtMaW1pdCA8ZW0+bWV0aG9kPC9lbT4gWzxlbT5tZXRob2Q8L2VtPl0gLi4uICZndDsgLi4uCi0gICAgJmx0Oy9MaW1pdCZndDs8L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+QWNjZXNzIGNvbnRyb2xzIGFyZSBub3JtYWxseSBlZmZlY3RpdmUgZm9yCi0gICAgPHN0cm9uZz5hbGw8L3N0cm9uZz4gYWNjZXNzIG1ldGhvZHMsIGFuZCB0aGlzIGlzIHRoZSB1c3VhbAotICAgIGRlc2lyZWQgYmVoYXZpb3IuIDxzdHJvbmc+SW4gdGhlIGdlbmVyYWwgY2FzZSwgYWNjZXNzIGNvbnRyb2wKLSAgICBkaXJlY3RpdmVzIHNob3VsZCBub3QgYmUgcGxhY2VkIHdpdGhpbiBhCi0gICAgPGRpcmVjdGl2ZSB0eXBlPSJzZWN0aW9uIj5saW1pdDwvZGlyZWN0aXZlPiBzZWN0aW9uLjwvc3Ryb25nPjwvcD4KLQotICAgIDxwPlRoZSBwdXJwb3NlIG9mIHRoZSA8ZGlyZWN0aXZlIHR5cGU9InNlY3Rpb24iPkxpbWl0PC9kaXJlY3RpdmU+Ci0gICAgZGlyZWN0aXZlIGlzIHRvIHJlc3RyaWN0IHRoZSBlZmZlY3Qgb2YgdGhlIGFjY2VzcyBjb250cm9scyB0byB0aGUKLSAgICBub21pbmF0ZWQgSFRUUCBtZXRob2RzLiBGb3IgYWxsIG90aGVyIG1ldGhvZHMsIHRoZSBhY2Nlc3MKLSAgICByZXN0cmljdGlvbnMgdGhhdCBhcmUgZW5jbG9zZWQgaW4gdGhlIDxjb2RlPiZsdDtMaW1pdCZndDs8L2NvZGU+Ci0gICAgYnJhY2tldCA8c3Ryb25nPndpbGwgaGF2ZSBubyBlZmZlY3Q8L3N0cm9uZz4uIFRoZSBmb2xsb3dpbmcKLSAgICBleGFtcGxlIGFwcGxpZXMgdGhlIGFjY2VzcyBjb250cm9sIG9ubHkgdG8gdGhlIG1ldGhvZHMgUE9TVCwgUFVULAotICAgIGFuZCBERUxFVEUsIGxlYXZpbmcgYWxsIG90aGVyIG1ldGhvZHMgdW5wcm90ZWN0ZWQ6PC9wPgotCi08ZXhhbXBsZT4KLSAgICAgIDxjb2RlPiZsdDtMaW1pdCBQT1NUIFBVVCBERUxFVEUmZ3Q7PGJyIC8+Ci0gICAgICAgJm5ic3A7Jm5ic3A7UmVxdWlyZSB2YWxpZC11c2VyPGJyIC8+Ci0gICAgICAgJmx0Oy9MaW1pdCZndDs8L2NvZGU+Ci08L2V4YW1wbGU+Ci0gICAgPHA+VGhlIG1ldGhvZCBuYW1lcyBsaXN0ZWQgY2FuIGJlIG9uZSBvciBtb3JlIG9mOiBHRVQsIFBPU1QsIFBVVCwKLSAgICBERUxFVEUsIENPTk5FQ1QsIE9QVElPTlMsIFRSQUNFLCBQQVRDSCwgUFJPUEZJTkQsIFBST1BQQVRDSCwKLSAgICBNS0NPTCwgQ09QWSwgTU9WRSwgTE9DSywgYW5kIFVOTE9DSy4gPHN0cm9uZz5UaGUgbWV0aG9kIG5hbWUgaXMKLSAgICBjYXNlLXNlbnNpdGl2ZS48L3N0cm9uZz4gSWYgR0VUIGlzIHVzZWQgaXQgd2lsbCBhbHNvIHJlc3RyaWN0Ci0gICAgSEVBRCByZXF1ZXN0cy48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzIHR5cGU9InNlY3Rpb24iPgotPG5hbWU+TGltaXRFeGNlcHQ8L25hbWU+Ci08ZGVzY3JpcHRpb24+UmVzdHJpY3QgYWNjZXNzIGNvbnRyb2xzIHRvIGFsbCBIVFRQIG1ldGhvZHMKLWV4Y2VwdCB0aGUgbmFtZWQgb25lczwvZGVzY3JpcHRpb24+ICAgIAotPHN5bnRheD4mbHQ7TGltaXRFeGNlcHQgPGVtPm1ldGhvZDwvZW0+IFs8ZW0+bWV0aG9kPC9lbT5dIC4uLiAmZ3Q7IC4uLgotICAgICZsdDsvTGltaXRFeGNlcHQmZ3Q7PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPjxkaXJlY3RpdmUgdHlwZT0ic2VjdGlvbiI+TGltaXRFeGNlcHQ8L2RpcmVjdGl2ZT4gYW5kCi0gICAgPGNvZGU+Jmx0Oy9MaW1pdEV4Y2VwdCZndDs8L2NvZGU+IGFyZSB1c2VkIHRvIGVuY2xvc2UgYSBncm91cCBvZgotICAgIGFjY2VzcyBjb250cm9sIGRpcmVjdGl2ZXMgd2hpY2ggd2lsbCB0aGVuIGFwcGx5IHRvIGFueSBIVFRQIGFjY2VzcwotICAgIG1ldGhvZCA8c3Ryb25nPm5vdDwvc3Ryb25nPiBsaXN0ZWQgaW4gdGhlIGFyZ3VtZW50czsgaS5lLiwgaXQgaXMKLSAgICB0aGUgb3Bwb3NpdGUgb2YgYSA8ZGlyZWN0aXZlIHR5cGU9InNlY3Rpb24iCi0gICAgbW9kdWxlPSJjb3JlIj5MaW1pdDwvZGlyZWN0aXZlPiBzZWN0aW9uIGFuZCBjYW4gYmUgdXNlZCB0byBjb250cm9sCi0gICAgYm90aCBzdGFuZGFyZCBhbmQgbm9uc3RhbmRhcmQvdW5yZWNvZ25pemVkIG1ldGhvZHMuIFNlZSB0aGUKLSAgICBkb2N1bWVudGF0aW9uIGZvciA8ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSIKLSAgICB0eXBlPSJzZWN0aW9uIj5MaW1pdDwvZGlyZWN0aXZlPiBmb3IgbW9yZSBkZXRhaWxzLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5MaW1pdFJlcXVlc3RCb2R5PC9uYW1lPgotPGRlc2NyaXB0aW9uPlJlc3RyaWN0cyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgSFRUUCByZXF1ZXN0IGJvZHkgc2VudAotZnJvbSB0aGUgY2xpZW50PC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+TGltaXRSZXF1ZXN0Qm9keSA8ZW0+Ynl0ZXM8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+TGltaXRSZXF1ZXN0Qm9keSAwPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0Pjxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGlzIGRpcmVjdGl2ZSBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiA8ZW0+Ynl0ZXM8L2VtPiBmcm9tIDAKLSAgICAobWVhbmluZyB1bmxpbWl0ZWQpIHRvIDIxNDc0ODM2NDcgKDJHQikgdGhhdCBhcmUgYWxsb3dlZCBpbiBhCi0gICAgcmVxdWVzdCBib2R5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBkZWZpbmVkIGJ5IHRoZSBjb21waWxlLXRpbWUKLSAgICBjb25zdGFudCA8Y29kZT5ERUZBVUxUX0xJTUlUX1JFUVVFU1RfQk9EWTwvY29kZT4gKDAgYXMKLSAgICBkaXN0cmlidXRlZCkuPC9wPgotCi0gICAgPHA+VGhlIDxkaXJlY3RpdmU+TGltaXRSZXF1ZXN0Qm9keTwvZGlyZWN0aXZlPiBkaXJlY3RpdmUgYWxsb3dzCi0gICAgdGhlIHVzZXIgdG8gc2V0IGEgbGltaXQgb24gdGhlIGFsbG93ZWQgc2l6ZSBvZiBhbiBIVFRQIHJlcXVlc3QKLSAgICBtZXNzYWdlIGJvZHkgd2l0aGluIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBkaXJlY3RpdmUgaXMgZ2l2ZW4KLSAgICAoc2VydmVyLCBwZXItZGlyZWN0b3J5LCBwZXItZmlsZSBvciBwZXItbG9jYXRpb24pLiBJZiB0aGUgY2xpZW50Ci0gICAgcmVxdWVzdCBleGNlZWRzIHRoYXQgbGltaXQsIHRoZSBzZXJ2ZXIgd2lsbCByZXR1cm4gYW4gZXJyb3IKLSAgICByZXNwb25zZSBpbnN0ZWFkIG9mIHNlcnZpY2luZyB0aGUgcmVxdWVzdC4gVGhlIHNpemUgb2YgYSBub3JtYWwKLSAgICByZXF1ZXN0IG1lc3NhZ2UgYm9keSB3aWxsIHZhcnkgZ3JlYXRseSBkZXBlbmRpbmcgb24gdGhlIG5hdHVyZSBvZgotICAgIHRoZSByZXNvdXJjZSBhbmQgdGhlIG1ldGhvZHMgYWxsb3dlZCBvbiB0aGF0IHJlc291cmNlLiBDR0kgc2NyaXB0cwotICAgIHR5cGljYWxseSB1c2UgdGhlIG1lc3NhZ2UgYm9keSBmb3IgcGFzc2luZyBmb3JtIGluZm9ybWF0aW9uIHRvIHRoZQotICAgIHNlcnZlci4gSW1wbGVtZW50YXRpb25zIG9mIHRoZSBQVVQgbWV0aG9kIHdpbGwgcmVxdWlyZSBhIHZhbHVlIGF0Ci0gICAgbGVhc3QgYXMgbGFyZ2UgYXMgYW55IHJlcHJlc2VudGF0aW9uIHRoYXQgdGhlIHNlcnZlciB3aXNoZXMgdG8KLSAgICBhY2NlcHQgZm9yIHRoYXQgcmVzb3VyY2UuPC9wPgotCi0gICAgPHA+VGhpcyBkaXJlY3RpdmUgZ2l2ZXMgdGhlIHNlcnZlciBhZG1pbmlzdHJhdG9yIGdyZWF0ZXIKLSAgICBjb250cm9sIG92ZXIgYWJub3JtYWwgY2xpZW50IHJlcXVlc3QgYmVoYXZpb3IsIHdoaWNoIG1heSBiZQotICAgIHVzZWZ1bCBmb3IgYXZvaWRpbmcgc29tZSBmb3JtcyBvZiBkZW5pYWwtb2Ytc2VydmljZQotICAgIGF0dGFja3MuPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkxpbWl0UmVxdWVzdEZpZWxkczwvbmFtZT4KLTxkZXNjcmlwdGlvbj5MaW1pdHMgdGhlIG51bWJlciBvZiBIVFRQIHJlcXVlc3QgaGVhZGVyIGZpZWxkcyB0aGF0IAotd2lsbCBiZSBhY2NlcHRlZCBmcm9tIHRoZSBjbGllbnQ8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5MaW1pdFJlcXVlc3RGaWVsZHMgPGVtPm51bWJlcjwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5MaW1pdFJlcXVlc3RGaWVsZHMgMTAwPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPjxlbT5OdW1iZXI8L2VtPiBpcyBhbiBpbnRlZ2VyIGZyb20gMCAobWVhbmluZyB1bmxpbWl0ZWQpIHRvCi0gICAgMzI3NjcuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGRlZmluZWQgYnkgdGhlIGNvbXBpbGUtdGltZQotICAgIGNvbnN0YW50IDxjb2RlPkRFRkFVTFRfTElNSVRfUkVRVUVTVF9GSUVMRFM8L2NvZGU+ICgxMDAgYXMKLSAgICBkaXN0cmlidXRlZCkuPC9wPgotCi0gICAgPHA+VGhlIDxkaXJlY3RpdmU+TGltaXRSZXF1ZXN0RmllbGRzPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBhbGxvd3MKLSAgICB0aGUgc2VydmVyIGFkbWluaXN0cmF0b3IgdG8gbW9kaWZ5IHRoZSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mCi0gICAgcmVxdWVzdCBoZWFkZXIgZmllbGRzIGFsbG93ZWQgaW4gYW4gSFRUUCByZXF1ZXN0LiBBIHNlcnZlciBuZWVkcwotICAgIHRoaXMgdmFsdWUgdG8gYmUgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBmaWVsZHMgdGhhdCBhIG5vcm1hbAotICAgIGNsaWVudCByZXF1ZXN0IG1pZ2h0IGluY2x1ZGUuIFRoZSBudW1iZXIgb2YgcmVxdWVzdCBoZWFkZXIgZmllbGRzCi0gICAgdXNlZCBieSBhIGNsaWVudCByYXJlbHkgZXhjZWVkcyAyMCwgYnV0IHRoaXMgbWF5IHZhcnkgYW1vbmcKLSAgICBkaWZmZXJlbnQgY2xpZW50IGltcGxlbWVudGF0aW9ucywgb2Z0ZW4gZGVwZW5kaW5nIHVwb24gdGhlIGV4dGVudAotICAgIHRvIHdoaWNoIGEgdXNlciBoYXMgY29uZmlndXJlZCB0aGVpciBicm93c2VyIHRvIHN1cHBvcnQgZGV0YWlsZWQKLSAgICBjb250ZW50IG5lZ290aWF0aW9uLiBPcHRpb25hbCBIVFRQIGV4dGVuc2lvbnMgYXJlIG9mdGVuIGV4cHJlc3NlZAotICAgIHVzaW5nIHJlcXVlc3QgaGVhZGVyIGZpZWxkcy48L3A+Ci0KLSAgICA8cD5UaGlzIGRpcmVjdGl2ZSBnaXZlcyB0aGUgc2VydmVyIGFkbWluaXN0cmF0b3IgZ3JlYXRlcgotICAgIGNvbnRyb2wgb3ZlciBhYm5vcm1hbCBjbGllbnQgcmVxdWVzdCBiZWhhdmlvciwgd2hpY2ggbWF5IGJlCi0gICAgdXNlZnVsIGZvciBhdm9pZGluZyBzb21lIGZvcm1zIG9mIGRlbmlhbC1vZi1zZXJ2aWNlIGF0dGFja3MuCi0gICAgVGhlIHZhbHVlIHNob3VsZCBiZSBpbmNyZWFzZWQgaWYgbm9ybWFsIGNsaWVudHMgc2VlIGFuIGVycm9yCi0gICAgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIHRoYXQgaW5kaWNhdGVzIHRvbyBtYW55IGZpZWxkcyB3ZXJlCi0gICAgc2VudCBpbiB0aGUgcmVxdWVzdC48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+TGltaXRSZXF1ZXN0RmllbGRTaXplPC9uYW1lPgotPGRlc2NyaXB0aW9uPkxpbWl0cyB0aGUgc2l6ZSBvZiB0aGUgSFRUUCByZXF1ZXN0IGhlYWRlciBhbGxvd2VkIGZyb20gdGhlCi1jbGllbnQ8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5MaW1pdFJlcXVlc3RGaWVsZHNpemUgPGVtPmJ5dGVzPC9lbT48L3N5bnRheD4KLTxkZWZhdWx0PkxpbWl0UmVxdWVzdEZpZWxkc2l6ZSA4MTkwPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoaXMgZGlyZWN0aXZlIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIDxlbT5ieXRlczwvZW0+IGZyb20gMAotICAgIHRvIHRoZSB2YWx1ZSBvZiB0aGUgY29tcGlsZS10aW1lIGNvbnN0YW50Ci0gICAgPGNvZGU+REVGQVVMVF9MSU1JVF9SRVFVRVNUX0ZJRUxEU0laRTwvY29kZT4gKDgxOTAgYXMKLSAgICBkaXN0cmlidXRlZCkgdGhhdCB3aWxsIGJlIGFsbG93ZWQgaW4gYW4gSFRUUCByZXF1ZXN0Ci0gICAgaGVhZGVyLjwvcD4KLQotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPkxpbWl0UmVxdWVzdEZpZWxkc2l6ZTwvZGlyZWN0aXZlPiBkaXJlY3RpdmUKLSAgICBhbGxvd3MgdGhlIHNlcnZlciBhZG1pbmlzdHJhdG9yIHRvIHJlZHVjZSB0aGUgbGltaXQgb24gdGhlIGFsbG93ZWQKLSAgICBzaXplIG9mIGFuIEhUVFAgcmVxdWVzdCBoZWFkZXIgZmllbGQgYmVsb3cgdGhlIG5vcm1hbCBpbnB1dCBidWZmZXIKLSAgICBzaXplIGNvbXBpbGVkIHdpdGggdGhlIHNlcnZlci4gQSBzZXJ2ZXIgbmVlZHMgdGhpcyB2YWx1ZSB0byBiZQotICAgIGxhcmdlIGVub3VnaCB0byBob2xkIGFueSBvbmUgaGVhZGVyIGZpZWxkIGZyb20gYSBub3JtYWwgY2xpZW50Ci0gICAgcmVxdWVzdC4gVGhlIHNpemUgb2YgYSBub3JtYWwgcmVxdWVzdCBoZWFkZXIgZmllbGQgd2lsbCB2YXJ5Ci0gICAgZ3JlYXRseSBhbW9uZyBkaWZmZXJlbnQgY2xpZW50IGltcGxlbWVudGF0aW9ucywgb2Z0ZW4gZGVwZW5kaW5nCi0gICAgdXBvbiB0aGUgZXh0ZW50IHRvIHdoaWNoIGEgdXNlciBoYXMgY29uZmlndXJlZCB0aGVpciBicm93c2VyIHRvCi0gICAgc3VwcG9ydCBkZXRhaWxlZCBjb250ZW50IG5lZ290aWF0aW9uLjwvcD4KLQotICAgIDxwPlRoaXMgZGlyZWN0aXZlIGdpdmVzIHRoZSBzZXJ2ZXIgYWRtaW5pc3RyYXRvciBncmVhdGVyCi0gICAgY29udHJvbCBvdmVyIGFibm9ybWFsIGNsaWVudCByZXF1ZXN0IGJlaGF2aW9yLCB3aGljaCBtYXkgYmUKLSAgICB1c2VmdWwgZm9yIGF2b2lkaW5nIHNvbWUgZm9ybXMgb2YgZGVuaWFsLW9mLXNlcnZpY2UgYXR0YWNrcy4KLSAgICBVbmRlciBub3JtYWwgY29uZGl0aW9ucywgdGhlIHZhbHVlIHNob3VsZCBub3QgYmUgY2hhbmdlZCBmcm9tCi0gICAgdGhlIGRlZmF1bHQuPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkxpbWl0UmVxdWVzdExpbmU8L25hbWU+Ci08ZGVzY3JpcHRpb24+TGltaXQgdGhlIHNpemUgb2YgdGhlIEhUVFAgcmVxdWVzdCBsaW5lIHRoYXQgd2lsbCBiZSBhY2NlcHRlZAotZnJvbSB0aGUgY2xpZW50PC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+TGltaXRSZXF1ZXN0TGluZSA8ZW0+Ynl0ZXM8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+TGltaXRSZXF1ZXN0TGluZSA4MTkwPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoaXMgZGlyZWN0aXZlIHNldHMgdGhlIG51bWJlciBvZiA8ZW0+Ynl0ZXM8L2VtPiBmcm9tIDAgdG8KLSAgICB0aGUgdmFsdWUgb2YgdGhlIGNvbXBpbGUtdGltZSBjb25zdGFudAotICAgIDxjb2RlPkRFRkFVTFRfTElNSVRfUkVRVUVTVF9MSU5FPC9jb2RlPiAoODE5MCBhcyBkaXN0cmlidXRlZCkKLSAgICB0aGF0IHdpbGwgYmUgYWxsb3dlZCBvbiB0aGUgSFRUUCByZXF1ZXN0LWxpbmUuPC9wPgotCi0gICAgPHA+VGhlIDxkaXJlY3RpdmU+TGltaXRSZXF1ZXN0TGluZTwvZGlyZWN0aXZlPiBkaXJlY3RpdmUgYWxsb3dzCi0gICAgdGhlIHNlcnZlciBhZG1pbmlzdHJhdG9yIHRvIHJlZHVjZSB0aGUgbGltaXQgb24gdGhlIGFsbG93ZWQgc2l6ZQotICAgIG9mIGEgY2xpZW50J3MgSFRUUCByZXF1ZXN0LWxpbmUgYmVsb3cgdGhlIG5vcm1hbCBpbnB1dCBidWZmZXIgc2l6ZQotICAgIGNvbXBpbGVkIHdpdGggdGhlIHNlcnZlci4gU2luY2UgdGhlIHJlcXVlc3QtbGluZSBjb25zaXN0cyBvZiB0aGUKLSAgICBIVFRQIG1ldGhvZCwgVVJJLCBhbmQgcHJvdG9jb2wgdmVyc2lvbiwgdGhlCi0gICAgPGRpcmVjdGl2ZT5MaW1pdFJlcXVlc3RMaW5lPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBwbGFjZXMgYQotICAgIHJlc3RyaWN0aW9uIG9uIHRoZSBsZW5ndGggb2YgYSByZXF1ZXN0LVVSSSBhbGxvd2VkIGZvciBhIHJlcXVlc3QKLSAgICBvbiB0aGUgc2VydmVyLiBBIHNlcnZlciBuZWVkcyB0aGlzIHZhbHVlIHRvIGJlIGxhcmdlIGVub3VnaCB0bwotICAgIGhvbGQgYW55IG9mIGl0cyByZXNvdXJjZSBuYW1lcywgaW5jbHVkaW5nIGFueSBpbmZvcm1hdGlvbiB0aGF0Ci0gICAgbWlnaHQgYmUgcGFzc2VkIGluIHRoZSBxdWVyeSBwYXJ0IG9mIGEgR0VUIHJlcXVlc3QuPC9wPgotCi0gICAgPHA+VGhpcyBkaXJlY3RpdmUgZ2l2ZXMgdGhlIHNlcnZlciBhZG1pbmlzdHJhdG9yIGdyZWF0ZXIKLSAgICBjb250cm9sIG92ZXIgYWJub3JtYWwgY2xpZW50IHJlcXVlc3QgYmVoYXZpb3IsIHdoaWNoIG1heSBiZQotICAgIHVzZWZ1bCBmb3IgYXZvaWRpbmcgc29tZSBmb3JtcyBvZiBkZW5pYWwtb2Ytc2VydmljZSBhdHRhY2tzLgotICAgIFVuZGVyIG5vcm1hbCBjb25kaXRpb25zLCB0aGUgdmFsdWUgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGZyb20KLSAgICB0aGUgZGVmYXVsdC48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+TGltaXRYTUxSZXF1ZXN0Qm9keTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5MaW1pdHMgdGhlIHNpemUgb2YgYW4gWE1MLWJhc2VkIHJlcXVlc3QgYm9keTwvZGVzY3JpcHRpb24+Ci08c3ludGF4PkxpbWl0WE1MUmVxdWVzdEJvZHkgPGVtPm51bWJlcjwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5MaW1pdFhNTFJlcXVlc3RCb2R5IDEwMDAwMDA8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+TGltaXQgKGluIGJ5dGVzKSBvbiBtYXhpbXVtIHNpemUgb2YgYW4gWE1MLWJhc2VkIHJlcXVlc3QKLSAgICBib2R5LiBBIHZhbHVlIG9mIDxjb2RlPjA8L2NvZGU+IHdpbGwgZGlzYWJsZSBhbnkgY2hlY2tpbmcuPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcyB0eXBlPSJzZWN0aW9uIj4KLTxuYW1lPkxvY2F0aW9uPC9uYW1lPgotPGRlc2NyaXB0aW9uPkFwcGxpZXMgdGhlIGVuY2xvc2VkIGRpcmVjdGl2ZXMgb25seSB0byBtYXRjaGluZwotVVJMczwvZGVzY3JpcHRpb24+Ci08c3ludGF4PiZsdDtMb2NhdGlvbgotICAgIDxlbT5VUkwtcGF0aDwvZW0+fDxlbT5VUkw8L2VtPiZndDsgLi4uICZsdDsvTG9jYXRpb24mZ3Q7PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIDxkaXJlY3RpdmUgdHlwZT0ic2VjdGlvbiI+TG9jYXRpb248L2RpcmVjdGl2ZT4gZGlyZWN0aXZlCi0gICAgcHJvdmlkZXMgZm9yIGFjY2VzcyBjb250cm9sIGJ5IFVSTC4gSXQgaXMgc2ltaWxhciB0byB0aGUKLSAgICA8ZGlyZWN0aXZlIHR5cGU9InNlY3Rpb24iIG1vZHVsZT0iY29yZSI+RGlyZWN0b3J5PC9kaXJlY3RpdmU+Ci0gICAgZGlyZWN0aXZlLCBhbmQgc3RhcnRzIGEgc3Vic2VjdGlvbiB3aGljaCBpcyB0ZXJtaW5hdGVkIHdpdGggYQotICAgIDxjb2RlPiZsdDsvTG9jYXRpb24mZ3Q7PC9jb2RlPiBkaXJlY3RpdmUuIDxkaXJlY3RpdmUKLSAgICB0eXBlPSJzZWN0aW9uIj5Mb2NhdGlvbjwvZGlyZWN0aXZlPiBzZWN0aW9ucyBhcmUgcHJvY2Vzc2VkIGluIHRoZQotICAgIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUsIGFmdGVyIHRoZSA8ZGlyZWN0aXZlCi0gICAgdHlwZT0ic2VjdGlvbiIgbW9kdWxlPSJjb3JlIj5EaXJlY3Rvcnk8L2RpcmVjdGl2ZT4gc2VjdGlvbnMgYW5kCi0gICAgPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBmaWxlcyBhcmUgcmVhZCwgYW5kIGFmdGVyIHRoZSA8ZGlyZWN0aXZlCi0gICAgdHlwZT0ic2VjdGlvbiIgbW9kdWxlPSJjb3JlIj5GaWxlczwvZGlyZWN0aXZlPiBzZWN0aW9ucy48L3A+Ci0KLSAgICA8cD5Ob3RlIHRoYXQgVVJMcyBkbyBub3QgaGF2ZSB0byBsaW5lIHVwIHdpdGggdGhlIGZpbGVzeXN0ZW0gYXQKLSAgICBhbGwsIGl0IHNob3VsZCBiZSBlbXBoYXNpemVkIHRoYXQgJmx0O0xvY2F0aW9uJmd0OyBvcGVyYXRlcwotICAgIGNvbXBsZXRlbHkgb3V0c2lkZSB0aGUgZmlsZXN5c3RlbS48L3A+Ci0KLSAgICA8cD5Gb3IgYWxsIG9yaWdpbiAobm9uLXByb3h5KSByZXF1ZXN0cywgdGhlIFVSTCB0byBiZSBtYXRjaGVkCi0gICAgaXMgb2YgdGhlIGZvcm0gPGNvZGU+L3BhdGgvPC9jb2RlPiwgYW5kIHlvdSBzaG91bGQgbm90IGluY2x1ZGUKLSAgICBhbnkgPGNvZGU+aHR0cDovL3NlcnZlcm5hbWU8L2NvZGU+IHByZWZpeC4gRm9yIHByb3h5IHJlcXVlc3RzLAotICAgIHRoZSBVUkwgdG8gYmUgbWF0Y2hlZCBpcyBvZiB0aGUgZm9ybQotICAgIDxjb2RlPnNjaGVtZTovL3NlcnZlcm5hbWUvcGF0aDwvY29kZT4sIGFuZCB5b3UgbXVzdCBpbmNsdWRlIHRoZQotICAgIHByZWZpeC48L3A+Ci0KLSAgICA8cD5UaGUgVVJMIG1heSB1c2Ugd2lsZGNhcmRzIEluIGEgd2lsZC1jYXJkIHN0cmluZywgYD8nIG1hdGNoZXMKLSAgICBhbnkgc2luZ2xlIGNoYXJhY3RlciwgYW5kIGAqJyBtYXRjaGVzIGFueSBzZXF1ZW5jZXMgb2YKLSAgICBjaGFyYWN0ZXJzLjwvcD4KLQotICAgIDxwPkV4dGVuZGVkIHJlZ3VsYXIKLSAgICBleHByZXNzaW9ucyBjYW4gYWxzbyBiZSB1c2VkLCB3aXRoIHRoZSBhZGRpdGlvbiBvZiB0aGUKLSAgICA8Y29kZT5+PC9jb2RlPiBjaGFyYWN0ZXIuIEZvciBleGFtcGxlOjwvcD4KLTxleGFtcGxlPgotICAgJmx0O0xvY2F0aW9uIH4gIi8oZXh0cmF8c3BlY2lhbCkvZGF0YSImZ3Q7Ci08L2V4YW1wbGU+Ci0KLSAgICA8cD53b3VsZCBtYXRjaCBVUkxzIHRoYXQgY29udGFpbmVkIHRoZSBzdWJzdHJpbmcgIi9leHRyYS9kYXRhIiBvcgotICAgICIvc3BlY2lhbC9kYXRhIi4gSW4gQXBhY2hlIDEuMyBhbmQgYWJvdmUsIGEgbmV3IGRpcmVjdGl2ZQotICAgIDxkaXJlY3RpdmUgdHlwZT0ic2VjdGlvbiIgbW9kdWxlPSJjb3JlIj5Mb2NhdGlvbk1hdGNoPC9kaXJlY3RpdmU+Ci0gICAgZXhpc3RzIHdoaWNoIGJlaGF2ZXMgaWRlbnRpY2FsIHRvIHRoZSByZWdleCB2ZXJzaW9uIG9mCi0gICAgPGRpcmVjdGl2ZSB0eXBlPSJzZWN0aW9uIj5Mb2NhdGlvbjwvZGlyZWN0aXZlPi48L3A+Ci0KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZSB0eXBlPSJzZWN0aW9uIj5Mb2NhdGlvbjwvZGlyZWN0aXZlPgotICAgIGZ1bmN0aW9uYWxpdHkgaXMgZXNwZWNpYWxseSB1c2VmdWwgd2hlbiBjb21iaW5lZCB3aXRoIHRoZQotICAgIDxkaXJlY3RpdmUgbW9kdWxlPSJjb3JlIj5TZXRIYW5kbGVyPC9kaXJlY3RpdmU+Ci0gICAgZGlyZWN0aXZlLiBGb3IgZXhhbXBsZSwgdG8gZW5hYmxlIHN0YXR1cyByZXF1ZXN0cywgYnV0IGFsbG93IHRoZW0KLSAgICBvbmx5IGZyb20gYnJvd3NlcnMgYXQgZm9vLmNvbSwgeW91IG1pZ2h0IHVzZTo8L3A+Ci08ZXhhbXBsZT4KLSAgICAmbHQ7TG9jYXRpb24gL3N0YXR1cyZndDs8YnIgLz4KLSAgICBTZXRIYW5kbGVyIHNlcnZlci1zdGF0dXM8YnIgLz4KLSAgICBPcmRlciBEZW55LEFsbG93PGJyIC8+Ci0gICAgRGVueSBmcm9tIGFsbDxiciAvPgotICAgIEFsbG93IGZyb20gLmZvby5jb208YnIgLz4KLSAgICAmbHQ7L0xvY2F0aW9uJmd0OwotPC9leGFtcGxlPgotCi08bm90ZT48dGl0bGU+Tm90ZSBhYm91dCAvIChzbGFzaCk8L3RpdGxlPiA8cD5UaGUgc2xhc2ggY2hhcmFjdGVyIGhhcwotc3BlY2lhbCBtZWFuaW5nIGRlcGVuZGluZyBvbiB3aGVyZSBpbiBhIFVSTCBpdCBhcHBlYXJzLiBQZW9wbGUgbWF5IGJlCi11c2VkIHRvIGl0cyBiZWhhdmlvciBpbiB0aGUgZmlsZXN5c3RlbSB3aGVyZSBtdWx0aXBsZSBhZGphY2VudCBzbGFzaGVzCi1hcmUgZnJlcXVlbnRseSBjb2xsYXBzZWQgdG8gYSBzaW5nbGUgc2xhc2ggKDxlbT5pLmUuPC9lbT4sCi08Y29kZT4vaG9tZS8vL2ZvbzwvY29kZT4gaXMgdGhlIHNhbWUgYXMgPGNvZGU+L2hvbWUvZm9vPC9jb2RlPikuIEluCi1VUkwtc3BhY2UgdGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgdHJ1ZS4gVGhlIDxkaXJlY3RpdmUgdHlwZT0ic2VjdGlvbiIKLW1vZHVsZT0iY29yZSI+TG9jYXRpb25NYXRjaDwvZGlyZWN0aXZlPiBkaXJlY3RpdmUgYW5kIHRoZSByZWdleAotdmVyc2lvbiBvZiA8ZGlyZWN0aXZlIHR5cGU9InNlY3Rpb24iPkxvY2F0aW9uPC9kaXJlY3RpdmU+IHJlcXVpcmUgeW91Ci10byBleHBsaWNpdGx5IHNwZWNpZnkgbXVsdGlwbGUgc2xhc2hlcyBpZiB0aGF0IGlzIHlvdXIgaW50ZW50aW9uLiAgRm9yCi1leGFtcGxlLCA8Y29kZT4mbHQ7TG9jYXRpb25NYXRjaCBeL2FiYyZndDs8L2NvZGU+IHdvdWxkIG1hdGNoIHRoZQotcmVxdWVzdCBVUkwgPGNvZGU+L2FiYzwvY29kZT4gYnV0IG5vdCB0aGUgcmVxdWVzdCBVUkwKLTxjb2RlPi8vYWJjPC9jb2RlPi4gVGhlIChub24tcmVnZXgpIDxkaXJlY3RpdmUKLXR5cGU9InNlY3Rpb24iPkxvY2F0aW9uPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBiZWhhdmVzIHNpbWlsYXJseSB3aGVuCi11c2VkIGZvciBwcm94eSByZXF1ZXN0cy4gQnV0IHdoZW4gKG5vbi1yZWdleCkgPGRpcmVjdGl2ZQotdHlwZT0ic2VjdGlvbiI+TG9jYXRpb248L2RpcmVjdGl2ZT4gaXMgdXNlZCBmb3Igbm9uLXByb3h5IHJlcXVlc3RzIGl0Ci13aWxsIGltcGxpY2l0bHkgbWF0Y2ggbXVsdGlwbGUgc2xhc2hlcyB3aXRoIGEgc2luZ2xlIHNsYXNoLiBGb3IKLWV4YW1wbGUsIGlmIHlvdSBzcGVjaWZ5IDxjb2RlPiZsdDtMb2NhdGlvbiAvYWJjL2RlZiZndDs8L2NvZGU+IGFuZCB0aGUKLXJlcXVlc3QgaXMgdG8gPGNvZGU+L2FiYy8vZGVmPC9jb2RlPiB0aGVuIGl0IHdpbGwgbWF0Y2guPC9wPgotPC9ub3RlPgotPC91c2FnZT4KLTxzZWVhbHNvPjxhIGhyZWY9Ii4uL3NlY3Rpb25zLmh0bWwiPkhvdwotICAgIERpcmVjdG9yeSwgTG9jYXRpb24gYW5kIEZpbGVzIHNlY3Rpb25zIHdvcms8L2E+IGZvciBhbgotICAgIGV4cGxhbmF0aW9uIG9mIGhvdyB0aGVzZSBkaWZmZXJlbnQgc2VjdGlvbnMgYXJlIGNvbWJpbmVkIHdoZW4gYQotICAgIHJlcXVlc3QgaXMgcmVjZWl2ZWQ8L3NlZWFsc28+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXMgdHlwZT0ic2VjdGlvbiI+Ci08bmFtZT5Mb2NhdGlvbk1hdGNoPC9uYW1lPgotPGRlc2NyaXB0aW9uPkFwcGxpZXMgdGhlIGVuY2xvc2VkIGRpcmVjdGl2ZXMgb25seSB0byByZWd1bGFyLWV4cHJlc3Npb24gCi1tYXRjaGluZyBVUkxzPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+Jmx0O0xvY2F0aW9uTWF0Y2gKLSAgICA8ZW0+cmVnZXg8L2VtPiZndDsgLi4uICZsdDsvTG9jYXRpb24mZ3Q7PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIDxkaXJlY3RpdmUgdHlwZT0ic2VjdGlvbiI+TG9jYXRpb25NYXRjaDwvZGlyZWN0aXZlPiBkaXJlY3RpdmUKLSAgICBwcm92aWRlcyBmb3IgYWNjZXNzIGNvbnRyb2wgYnkgVVJMLCBpbiBhbiBpZGVudGljYWwgbWFubmVyIHRvCi0gICAgPGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiCi0gICAgdHlwZT0ic2VjdGlvbiI+TG9jYXRpb248L2RpcmVjdGl2ZT4uIEhvd2V2ZXIsIGl0IHRha2VzIGEgcmVndWxhcgotICAgIGV4cHJlc3Npb24gYXMgYW4gYXJndW1lbnQgaW5zdGVhZCBvZiBhIHNpbXBsZSBzdHJpbmcuICBGb3IKLSAgICBleGFtcGxlOjwvcD4KLTxleGFtcGxlPgotICAgJmx0O0xvY2F0aW9uTWF0Y2ggIi8oZXh0cmF8c3BlY2lhbCkvZGF0YSImZ3Q7Ci08L2V4YW1wbGU+Ci0KLSAgICA8cD53b3VsZCBtYXRjaCBVUkxzIHRoYXQgY29udGFpbmVkIHRoZSBzdWJzdHJpbmcgIi9leHRyYS9kYXRhIgotICAgIG9yICIvc3BlY2lhbC9kYXRhIi48L3A+Ci08L3VzYWdlPgotCi08c2VlYWxzbz48YSBocmVmPSIuLi9zZWN0aW9ucy5odG1sIj5Ib3cKLSAgICBEaXJlY3RvcnksIExvY2F0aW9uIGFuZCBGaWxlcyBzZWN0aW9ucyB3b3JrPC9hPiBmb3IgYW4KLSAgICBleHBsYW5hdGlvbiBvZiBob3cgdGhlc2UgZGlmZmVyZW50IHNlY3Rpb25zIGFyZSBjb21iaW5lZCB3aGVuIGEKLSAgICByZXF1ZXN0IGlzIHJlY2VpdmVkPC9zZWVhbHNvPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+TG9nTGV2ZWw8L25hbWU+Ci08ZGVzY3JpcHRpb24+Q29udHJvbHMgdGhlIHZlcmJvc2l0eSBvZiB0aGUgRXJyb3JMb2c8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5Mb2dMZXZlbCA8ZW0+bGV2ZWw8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+TG9nTGV2ZWwgd2FybjwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD48ZGlyZWN0aXZlPkxvZ0xldmVsPC9kaXJlY3RpdmU+IGFkanVzdHMgdGhlIHZlcmJvc2l0eSBvZiB0aGUKLSAgICBtZXNzYWdlcyByZWNvcmRlZCBpbiB0aGUgZXJyb3IgbG9ncyAoc2VlIDxkaXJlY3RpdmUKLSAgICBtb2R1bGU9ImNvcmUiPkVycm9yTG9nPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSkuIFRoZSBmb2xsb3dpbmcKLSAgICA8ZW0+bGV2ZWw8L2VtPnMgYXJlIGF2YWlsYWJsZSwgaW4gb3JkZXIgb2YgZGVjcmVhc2luZwotICAgIHNpZ25pZmljYW5jZTo8L3A+Ci0KLSAgICA8dGFibGU+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0aCBhbGlnbj0iTEVGVCI+PHN0cm9uZz5MZXZlbDwvc3Ryb25nPiA8L3RoPgotCi0gICAgICAgIDx0aCBhbGlnbj0iTEVGVCI+PHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPiA8L3RoPgotICAgICAgPC90cj4KLQotICAgICAgPHRyPgotICAgICAgICA8dGg+Ci0gICAgICAgIDwvdGg+Ci0KLSAgICAgICAgPHRoIGFsaWduPSJMRUZUIj48c3Ryb25nPkV4YW1wbGU8L3N0cm9uZz4gPC90aD4KLSAgICAgIDwvdHI+Ci0KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjxjb2RlPmVtZXJnPC9jb2RlPiA8L3RkPgotCi0gICAgICAgIDx0ZD5FbWVyZ2VuY2llcyAtIHN5c3RlbSBpcyB1bnVzYWJsZS48L3RkPgotICAgICAgPC90cj4KLQotICAgICAgPHRyPgotICAgICAgICA8dGQ+Ci0gICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgPHRkPiJDaGlsZCBjYW5ub3Qgb3BlbiBsb2NrIGZpbGUuIEV4aXRpbmciPC90ZD4KLSAgICAgIDwvdHI+Ci0KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjxjb2RlPmFsZXJ0PC9jb2RlPiA8L3RkPgotCi0gICAgICAgIDx0ZD5BY3Rpb24gbXVzdCBiZSB0YWtlbiBpbW1lZGlhdGVseS48L3RkPgotICAgICAgPC90cj4KLQotICAgICAgPHRyPgotICAgICAgICA8dGQ+Ci0gICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgPHRkPiJnZXRwd3VpZDogY291bGRuJ3QgZGV0ZXJtaW5lIHVzZXIgbmFtZSBmcm9tIHVpZCI8L3RkPgotICAgICAgPC90cj4KLQotICAgICAgPHRyPgotICAgICAgICA8dGQ+PGNvZGU+Y3JpdDwvY29kZT4gPC90ZD4KLQotICAgICAgICA8dGQ+Q3JpdGljYWwgQ29uZGl0aW9ucy48L3RkPgotICAgICAgPC90cj4KLQotICAgICAgPHRyPgotICAgICAgICA8dGQ+Ci0gICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgPHRkPiJzb2NrZXQ6IEZhaWxlZCB0byBnZXQgYSBzb2NrZXQsIGV4aXRpbmcgY2hpbGQiPC90ZD4KLSAgICAgIDwvdHI+Ci0KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjxjb2RlPmVycm9yPC9jb2RlPiA8L3RkPgotCi0gICAgICAgIDx0ZD5FcnJvciBjb25kaXRpb25zLjwvdGQ+Ci0gICAgICA8L3RyPgotCi0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgPC90ZD4KLQotICAgICAgICA8dGQ+IlByZW1hdHVyZSBlbmQgb2Ygc2NyaXB0IGhlYWRlcnMiPC90ZD4KLSAgICAgIDwvdHI+Ci0KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjxjb2RlPndhcm48L2NvZGU+IDwvdGQ+Ci0KLSAgICAgICAgPHRkPldhcm5pbmcgY29uZGl0aW9ucy48L3RkPgotICAgICAgPC90cj4KLQotICAgICAgPHRyPgotICAgICAgICA8dGQ+Ci0gICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgPHRkPiJjaGlsZCBwcm9jZXNzIDEyMzQgZGlkIG5vdCBleGl0LCBzZW5kaW5nIGFub3RoZXIKLSAgICAgICAgU0lHSFVQIjwvdGQ+Ci0gICAgICA8L3RyPgotCi0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD48Y29kZT5ub3RpY2U8L2NvZGU+IDwvdGQ+Ci0KLSAgICAgICAgPHRkPk5vcm1hbCBidXQgc2lnbmlmaWNhbnQgY29uZGl0aW9uLjwvdGQ+Ci0gICAgICA8L3RyPgotCi0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgPC90ZD4KLQotICAgICAgICA8dGQ+Imh0dHBkOiBjYXVnaHQgU0lHQlVTLCBhdHRlbXB0aW5nIHRvIGR1bXAgY29yZSBpbgotICAgICAgICAuLi4iPC90ZD4KLSAgICAgIDwvdHI+Ci0KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjxjb2RlPmluZm88L2NvZGU+IDwvdGQ+Ci0KLSAgICAgICAgPHRkPkluZm9ybWF0aW9uYWwuPC90ZD4KLSAgICAgIDwvdHI+Ci0KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPgotICAgICAgICA8L3RkPgotCi0gICAgICAgIDx0ZD4iU2VydmVyIHNlZW1zIGJ1c3ksICh5b3UgbWF5IG5lZWQgdG8gaW5jcmVhc2UKLSAgICAgICAgU3RhcnRTZXJ2ZXJzLCBvciBNaW4vTWF4U3BhcmVTZXJ2ZXJzKS4uLiI8L3RkPgotICAgICAgPC90cj4KLQotICAgICAgPHRyPgotICAgICAgICA8dGQ+PGNvZGU+ZGVidWc8L2NvZGU+IDwvdGQ+Ci0KLSAgICAgICAgPHRkPkRlYnVnLWxldmVsIG1lc3NhZ2VzPC90ZD4KLSAgICAgIDwvdHI+Ci0KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPgotICAgICAgICA8L3RkPgotCi0gICAgICAgIDx0ZD4iT3BlbmluZyBjb25maWcgZmlsZSAuLi4iPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLQotICAgIDxwPldoZW4gYSBwYXJ0aWN1bGFyIGxldmVsIGlzIHNwZWNpZmllZCwgbWVzc2FnZXMgZnJvbSBhbGwKLSAgICBvdGhlciBsZXZlbHMgb2YgaGlnaGVyIHNpZ25pZmljYW5jZSB3aWxsIGJlIHJlcG9ydGVkIGFzIHdlbGwuCi0gICAgPGVtPkUuZy48L2VtPiwgd2hlbiA8Y29kZT5Mb2dMZXZlbCBpbmZvPC9jb2RlPiBpcyBzcGVjaWZpZWQsCi0gICAgdGhlbiBtZXNzYWdlcyB3aXRoIGxvZyBsZXZlbHMgb2YgPGNvZGU+bm90aWNlPC9jb2RlPiBhbmQKLSAgICA8Y29kZT53YXJuPC9jb2RlPiB3aWxsIGFsc28gYmUgcG9zdGVkLjwvcD4KLQotICAgIDxwPlVzaW5nIGEgbGV2ZWwgb2YgYXQgbGVhc3QgPGNvZGU+Y3JpdDwvY29kZT4gaXMKLSAgICByZWNvbW1lbmRlZC48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+TWF4S2VlcEFsaXZlUmVxdWVzdHM8L25hbWU+Ci08ZGVzY3JpcHRpb24+U2V0cyB0aGUgbnVtYmVyIG9mIHJlcXVlc3RzIGFsbG93ZWQgb24gYSBwZXJzaXN0ZW50IAotY29ubmVjdGlvbjwvZGVzY3JpcHRpb24+Ci08c3ludGF4Pk1heEtlZXBBbGl2ZVJlcXVlc3RzIDxlbT5udW1iZXI8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+TWF4S2VlcEFsaXZlUmVxdWVzdHMgMTAwPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPk1heEtlZXBBbGl2ZVJlcXVlc3RzPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZQotICAgIGxpbWl0cyB0aGUgbnVtYmVyIG9mIHJlcXVlc3RzIGFsbG93ZWQgcGVyIGNvbm5lY3Rpb24gd2hlbgotICAgIDxkaXJlY3RpdmUgbW9kdWxlPSJjb3JlIiA+S2VlcEFsaXZlPC9kaXJlY3RpdmU+IGlzIG9uLiBJZiBpdCBpcwotICAgIHNldCB0byAiPGNvZGU+MDwvY29kZT4iLCB1bmxpbWl0ZWQgcmVxdWVzdHMgd2lsbCBiZSBhbGxvd2VkLiBXZQotICAgIHJlY29tbWVuZCB0aGF0IHRoaXMgc2V0dGluZyBiZSBrZXB0IHRvIGEgaGlnaCB2YWx1ZSBmb3IgbWF4aW11bQotICAgIHNlcnZlciBwZXJmb3JtYW5jZS48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+TmFtZVZpcnR1YWxIb3N0PC9uYW1lPgotPGRlc2NyaXB0aW9uPkNvbmZpZ3VyZXMgYW4gSVAgYWRkcmVzcyBmb3IgbmFtZS12aXJ0dWFsCi1ob3N0aW5nPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+TmFtZVZpcnR1YWxIb3N0IDxlbT5hZGRyPC9lbT5bOjxlbT5wb3J0PC9lbT5dPC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIDxkaXJlY3RpdmU+TmFtZVZpcnR1YWxIb3N0PC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBpcyBhCi0gICAgcmVxdWlyZWQgZGlyZWN0aXZlIGlmIHlvdSB3YW50IHRvIGNvbmZpZ3VyZSA8YQotICAgIGhyZWY9Ii4uL3Zob3N0cy8iPm5hbWUtYmFzZWQgdmlydHVhbCBob3N0czwvYT4uPC9wPgotCi0gICAgPHA+QWx0aG91Z2ggPGVtPmFkZHI8L2VtPiBjYW4gYmUgaG9zdG5hbWUgaXQgaXMgcmVjb21tZW5kZWQKLSAgICB0aGF0IHlvdSBhbHdheXMgdXNlIGFuIElQIGFkZHJlc3MsIDxlbT5lLmcuPC9lbT48L3A+Ci0KLTxleGFtcGxlPk5hbWVWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQ8L2V4YW1wbGU+Ci0KLSAgICA8cD5XaXRoIHRoZSA8ZGlyZWN0aXZlPk5hbWVWaXJ0dWFsSG9zdDwvZGlyZWN0aXZlPiBkaXJlY3RpdmUgeW91Ci0gICAgc3BlY2lmeSB0aGUgSVAgYWRkcmVzcyBvbiB3aGljaCB0aGUgc2VydmVyIHdpbGwgcmVjZWl2ZSByZXF1ZXN0cwotICAgIGZvciB0aGUgbmFtZS1iYXNlZCB2aXJ0dWFsIGhvc3RzLiBUaGlzIHdpbGwgdXN1YWxseSBiZSB0aGUgYWRkcmVzcwotICAgIHRvIHdoaWNoIHlvdXIgbmFtZS1iYXNlZCB2aXJ0dWFsIGhvc3QgbmFtZXMgcmVzb2x2ZS4gSW4gY2FzZXMKLSAgICB3aGVyZSBhIGZpcmV3YWxsIG9yIG90aGVyIHByb3h5IHJlY2VpdmVzIHRoZSByZXF1ZXN0cyBhbmQgZm9yd2FyZHMKLSAgICB0aGVtIG9uIGEgZGlmZmVyZW50IElQIGFkZHJlc3MgdG8gdGhlIHNlcnZlciwgeW91IG11c3Qgc3BlY2lmeSB0aGUKLSAgICBJUCBhZGRyZXNzIG9mIHRoZSBwaHlzaWNhbCBpbnRlcmZhY2Ugb24gdGhlIG1hY2hpbmUgd2hpY2ggd2lsbCBiZQotICAgIHNlcnZpY2luZyB0aGUgcmVxdWVzdHMuIElmIHlvdSBoYXZlIG11bHRpcGxlIG5hbWUtYmFzZWQgaG9zdHMgb24KLSAgICBtdWx0aXBsZSBhZGRyZXNzZXMsIHJlcGVhdCB0aGUgZGlyZWN0aXZlIGZvciBlYWNoIGFkZHJlc3MuPC9wPgotCi0gICAgPHA+Tm90ZTogdGhlICJtYWluIHNlcnZlciIgYW5kIGFueSBfZGVmYXVsdF8gc2VydmVycyB3aWxsCi0gICAgPHN0cm9uZz5uZXZlcjwvc3Ryb25nPiBiZSBzZXJ2ZWQgZm9yIGEgcmVxdWVzdCB0byBhCi0gICAgPGRpcmVjdGl2ZT5OYW1lVmlydHVhbEhvc3Q8L2RpcmVjdGl2ZT4gSVAgQWRkcmVzcyAodW5sZXNzIGZvciBzb21lCi0gICAgcmVhc29uIHlvdSBzcGVjaWZ5IDxkaXJlY3RpdmU+TmFtZVZpcnR1YWxIb3N0PC9kaXJlY3RpdmU+IGJ1dCB0aGVuCi0gICAgZG9uJ3QgZGVmaW5lIGFueSBWaXJ0dWFsSG9zdHMgZm9yIHRoYXQgYWRkcmVzcykuPC9wPgotCi0gICAgPHA+T3B0aW9uYWxseSB5b3UgY2FuIHNwZWNpZnkgYSBwb3J0IG51bWJlciBvbiB3aGljaCB0aGUKLSAgICBuYW1lLWJhc2VkIHZpcnR1YWwgaG9zdHMgc2hvdWxkIGJlIHVzZWQsIDxlbT5lLmcuPC9lbT48L3A+Ci0KLTxleGFtcGxlPk5hbWVWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQ6ODA4MDwvZXhhbXBsZT4KLQotICAgICA8cD5JUHY2IGFkZHJlc3NlcyBtdXN0IGJlIGVuY2xvc2VkIGluIHNxdWFyZSBicmFja2V0cywgYXMgc2hvd24KLSAgICAgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOjwvcD4KLSAKLTxleGFtcGxlPk5hbWVWaXJ0dWFsSG9zdCBbZmU4MDo6YTAwOjIwZmY6ZmVhNzpjY2VhXTo4MDgwPC9leGFtcGxlPgotCi08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+T3B0aW9uczwvbmFtZT4KLTxkZXNjcmlwdGlvbj5Db25maWd1cmVzIHdoYXQgZmVhdHVyZXMgYXJlIGF2YWlsYWJsZSBpbiBhIHBhcnRpY3VsYXIKLWRpcmVjdG9yeTwvZGVzY3JpcHRpb24+Ci08c3ludGF4Pk9wdGlvbnMKLSAgICBbK3wtXTxlbT5vcHRpb248L2VtPiBbWyt8LV08ZW0+b3B0aW9uPC9lbT5dIC4uLjwvc3ludGF4PgotPGRlZmF1bHQ+T3B0aW9ucyBBbGw8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT5PcHRpb25zPC9vdmVycmlkZT4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPk9wdGlvbnM8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIGNvbnRyb2xzIHdoaWNoCi0gICAgc2VydmVyIGZlYXR1cmVzIGFyZSBhdmFpbGFibGUgaW4gYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeS48L3A+Ci0KLSAgICA8cD48ZW0+b3B0aW9uPC9lbT4gY2FuIGJlIHNldCB0byA8Y29kZT5Ob25lPC9jb2RlPiwgaW4gd2hpY2gKLSAgICBjYXNlIG5vbmUgb2YgdGhlIGV4dHJhIGZlYXR1cmVzIGFyZSBlbmFibGVkLCBvciBvbmUgb3IgbW9yZSBvZgotICAgIHRoZSBmb2xsb3dpbmc6PC9wPgotCi0gICAgPGRsPgotICAgICAgPGR0PkFsbDwvZHQ+Ci0KLSAgICAgIDxkZD5BbGwgb3B0aW9ucyBleGNlcHQgZm9yIE11bHRpVmlld3MuIFRoaXMgaXMgdGhlIGRlZmF1bHQKLSAgICAgIHNldHRpbmcuPC9kZD4KLQotICAgICAgPGR0PkV4ZWNDR0k8L2R0PgotCi0gICAgICA8ZGQ+Ci0gICAgICBFeGVjdXRpb24gb2YgQ0dJIHNjcmlwdHMgaXMgcGVybWl0dGVkLjwvZGQ+Ci0KLSAgICAgIDxkdD5Gb2xsb3dTeW1MaW5rczwvZHQ+Ci0KLSAgICAgIDxkZD4KLQotICAgICAgVGhlIHNlcnZlciB3aWxsIGZvbGxvdyBzeW1ib2xpYyBsaW5rcyBpbiB0aGlzIGRpcmVjdG9yeS48YnIgLz4KLSAgICAgIDxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogZXZlbiB0aG91Z2ggdGhlIHNlcnZlciBmb2xsb3dzIHRoZQotICAgICAgc3ltbGluayBpdCBkb2VzIDxlbT5ub3Q8L2VtPiBjaGFuZ2UgdGhlIHBhdGhuYW1lIHVzZWQgdG8gbWF0Y2gKLSAgICAgIGFnYWluc3QgPGRpcmVjdGl2ZSB0eXBlPSJzZWN0aW9uIgotICAgICAgbW9kdWxlPSJjb3JlIj5EaXJlY3Rvcnk8L2RpcmVjdGl2ZT4gc2VjdGlvbnMuPGJyIC8+Ci0gICAgICA8c3Ryb25nPk5vdGU8L3N0cm9uZz46IHRoaXMgb3B0aW9uIGdldHMgaWdub3JlZCBpZiBzZXQgaW5zaWRlIGEKLSAgICAgIDxkaXJlY3RpdmUgdHlwZT0ic2VjdGlvbiIgbW9kdWxlPSJjb3JlIj5Mb2NhdGlvbjwvZGlyZWN0aXZlPgotICAgICAgc2VjdGlvbi48L2RkPgotCi0gICAgICA8ZHQ+SW5jbHVkZXM8L2R0PgotCi0gICAgICA8ZGQ+Ci0gICAgICBTZXJ2ZXItc2lkZSBpbmNsdWRlcyBhcmUgcGVybWl0dGVkLjwvZGQ+Ci0KLSAgICAgIDxkdD5JbmNsdWRlc05PRVhFQzwvZHQ+Ci0KLSAgICAgIDxkZD4KLQotICAgICAgU2VydmVyLXNpZGUgaW5jbHVkZXMgYXJlIHBlcm1pdHRlZCwgYnV0IHRoZSAjZXhlYyBjb21tYW5kIGFuZAotICAgICAgI2V4ZWMgQ0dJIGFyZSBkaXNhYmxlZC4gSXQgaXMgc3RpbGwgcG9zc2libGUgdG8gI2luY2x1ZGUKLSAgICAgIHZpcnR1YWwgQ0dJIHNjcmlwdHMgZnJvbSBTY3JpcHRBbGlhc2UnZCBkaXJlY3Rvcmllcy48L2RkPgotCi0gICAgICA8ZHQ+SW5kZXhlczwvZHQ+Ci0KLSAgICAgIDxkZD4KLSAgICAgIElmIGEgVVJMIHdoaWNoIG1hcHMgdG8gYSBkaXJlY3RvcnkgaXMgcmVxdWVzdGVkLCBhbmQgdGhlCi0gICAgICB0aGVyZSBpcyBubyBEaXJlY3RvcnlJbmRleCAoPGVtPmUuZy48L2VtPiwgaW5kZXguaHRtbCkgaW4KLSAgICAgIHRoYXQgZGlyZWN0b3J5LCB0aGVuIHRoZSBzZXJ2ZXIgd2lsbCByZXR1cm4gYSBmb3JtYXR0ZWQKLSAgICAgIGxpc3Rpbmcgb2YgdGhlIGRpcmVjdG9yeS48L2RkPgotCi0gICAgICA8ZHQ+TXVsdGlWaWV3czwvZHQ+Ci0KLSAgICAgIDxkZD4KLSAgICAgIDxhIGhyZWY9Ii4uL2NvbnRlbnQtbmVnb3RpYXRpb24uaHRtbCI+Q29udGVudCBuZWdvdGlhdGVkPC9hPgotICAgICAgTXVsdGlWaWV3cyBhcmUgYWxsb3dlZC48L2RkPgotCi0gICAgICA8ZHQ+U3ltTGlua3NJZk93bmVyTWF0Y2g8L2R0PgotCi0gICAgICA8ZGQ+Ci0KLSAgICAgIFRoZSBzZXJ2ZXIgd2lsbCBvbmx5IGZvbGxvdyBzeW1ib2xpYyBsaW5rcyBmb3Igd2hpY2ggdGhlIHRhcmdldAotICAgICAgZmlsZSBvciBkaXJlY3RvcnkgaXMgb3duZWQgYnkgdGhlIHNhbWUgdXNlciBpZCBhcyB0aGUgbGluay48YnIKLSAgICAgIC8+IDxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogdGhpcyBvcHRpb24gZ2V0cyBpZ25vcmVkIGlmIHNldCBpbnNpZGUKLSAgICAgIGEgPGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiIHR5cGU9InNlY3Rpb24iPkxvY2F0aW9uPC9kaXJlY3RpdmU+Ci0gICAgICBzZWN0aW9uLjwvZGQ+Ci0gICAgPC9kbD4KLSAgICA8cD5Ob3JtYWxseSwgaWYgbXVsdGlwbGUgPGRpcmVjdGl2ZT5PcHRpb25zPC9kaXJlY3RpdmU+IGNvdWxkIGFwcGx5IHRvIGEKLSAgICBkaXJlY3RvcnksIHRoZW4gdGhlIG1vc3Qgc3BlY2lmaWMgb25lIGlzIHRha2VuIGNvbXBsZXRlOyB0aGUKLSAgICBvcHRpb25zIGFyZSBub3QgbWVyZ2VkLiBIb3dldmVyIGlmIDxlbT5hbGw8L2VtPiB0aGUgb3B0aW9ucyBvbgotICAgIHRoZSA8ZGlyZWN0aXZlPk9wdGlvbnM8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIGFyZSBwcmVjZWRlZCBieSBhICsgb3IgLQotICAgIHN5bWJvbCwgdGhlIG9wdGlvbnMgYXJlIG1lcmdlZC4gQW55IG9wdGlvbnMgcHJlY2VkZWQgYnkgYSArIGFyZQotICAgIGFkZGVkIHRvIHRoZSBvcHRpb25zIGN1cnJlbnRseSBpbiBmb3JjZSwgYW5kIGFueSBvcHRpb25zCi0gICAgcHJlY2VkZWQgYnkgYSAtIGFyZSByZW1vdmVkIGZyb20gdGhlIG9wdGlvbnMgY3VycmVudGx5IGluCi0gICAgZm9yY2UuIDwvcD4KLQotICAgIDxwPkZvciBleGFtcGxlLCB3aXRob3V0IGFueSArIGFuZCAtIHN5bWJvbHM6PC9wPgotCi0KLTxleGFtcGxlPiZsdDtEaXJlY3RvcnkgL3dlYi9kb2NzJmd0OzxiciAvPgotICAgICAgIE9wdGlvbnMgSW5kZXhlcyBGb2xsb3dTeW1MaW5rczxiciAvPgotICAgICAgICZsdDsvRGlyZWN0b3J5Jmd0OzxiciAvPgotICAgICAgICZsdDtEaXJlY3RvcnkgL3dlYi9kb2NzL3NwZWMmZ3Q7PGJyIC8+Ci0gICAgICAgT3B0aW9ucyBJbmNsdWRlczxiciAvPgotICAgICAgICZsdDsvRGlyZWN0b3J5Jmd0OwotPC9leGFtcGxlPgotICAgIDxwPnRoZW4gb25seSA8Y29kZT5JbmNsdWRlczwvY29kZT4gd2lsbCBiZSBzZXQgZm9yIHRoZQotICAgIC93ZWIvZG9jcy9zcGVjIGRpcmVjdG9yeS4gSG93ZXZlciBpZiB0aGUgc2Vjb25kCi0gICAgPGRpcmVjdGl2ZT5PcHRpb25zPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSB1c2VzIHRoZSArIGFuZCAtIHN5bWJvbHM6PC9wPiAKLQotPGV4YW1wbGU+Ci0gICAgICAmbHQ7RGlyZWN0b3J5IC93ZWIvZG9jcyZndDs8YnIgLz4KLSAgICAgICBPcHRpb25zIEluZGV4ZXMgRm9sbG93U3ltTGlua3M8YnIgLz4KLSAgICAgICAmbHQ7L0RpcmVjdG9yeSZndDs8YnIgLz4KLSAgICAgICAmbHQ7RGlyZWN0b3J5IC93ZWIvZG9jcy9zcGVjJmd0OzxiciAvPgotICAgICAgIE9wdGlvbnMgK0luY2x1ZGVzIC1JbmRleGVzPGJyIC8+Ci0gICAgICAgJmx0Oy9EaXJlY3RvcnkmZ3Q7Ci08L2V4YW1wbGU+Ci0gICAgPHA+dGhlbiB0aGUgb3B0aW9ucyA8Y29kZT5Gb2xsb3dTeW1MaW5rczwvY29kZT4gYW5kCi0gICAgPGNvZGU+SW5jbHVkZXM8L2NvZGU+IGFyZSBzZXQgZm9yIHRoZSAvd2ViL2RvY3Mvc3BlYyBkaXJlY3RvcnkuPC9wPgotICAgIAotCi0gICAgPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBVc2luZyA8Y29kZT4tSW5jbHVkZXNOT0VYRUM8L2NvZGU+IG9yCi0gICAgPGNvZGU+LUluY2x1ZGVzPC9jb2RlPiBkaXNhYmxlcyBzZXJ2ZXItc2lkZSBpbmNsdWRlcyBjb21wbGV0ZWx5Ci0gICAgcmVnYXJkbGVzcyBvZiB0aGUgcHJldmlvdXMgc2V0dGluZy48L3A+Ci0KLSAgICA8cD5UaGUgZGVmYXVsdCBpbiB0aGUgYWJzZW5jZSBvZiBhbnkgb3RoZXIgc2V0dGluZ3MgaXMKLSAgICA8Y29kZT5BbGw8L2NvZGU+LjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5SZXF1aXJlPC9uYW1lPgotPGRlc2NyaXB0aW9uPlNlbGVjdHMgd2hpY2ggYXV0aGVudGljYXRlZCB1c2VycyBjYW4gYWNjZXNzCi1hIHJlc291cmNlPC9kZXNjcmlwdGlvbj4gICAgCi08c3ludGF4PlJlcXVpcmUgPGVtPmVudGl0eS1uYW1lPC9lbT4gWzxlbT5lbnRpdHktbmFtZTwvZW0+XSAuLi48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT5BdXRoQ29uZmlnPC9vdmVycmlkZT4KLQotPHVzYWdlPgotICAgIDxwPlRoaXMgZGlyZWN0aXZlIHNlbGVjdHMgd2hpY2ggYXV0aGVudGljYXRlZCB1c2VycyBjYW4gYWNjZXNzCi0gICAgYSBkaXJlY3RvcnkuIFRoZSBhbGxvd2VkIHN5bnRheGVzIGFyZTo8L3A+Ci0KLSAgICA8dWw+Ci0gICAgICA8bGk+Ci0gICAgICAgIFJlcXVpcmUgdXNlciA8ZW0+dXNlcmlkPC9lbT4gWzxlbT51c2VyaWQ8L2VtPl0gLi4uIAotCi0gICAgICAgIDxwPk9ubHkgdGhlIG5hbWVkIHVzZXJzIGNhbiBhY2Nlc3MgdGhlIGRpcmVjdG9yeS48L3A+Ci0gICAgICA8L2xpPgotCi0gICAgICA8bGk+Ci0gICAgICAgIFJlcXVpcmUgZ3JvdXAgPGVtPmdyb3VwLW5hbWU8L2VtPiBbPGVtPmdyb3VwLW5hbWU8L2VtPl0gLi4uCi0gICAgICAgIAotCi0gICAgICAgIDxwPk9ubHkgdXNlcnMgaW4gdGhlIG5hbWVkIGdyb3VwcyBjYW4gYWNjZXNzIHRoZQotICAgICAgICBkaXJlY3RvcnkuPC9wPgotICAgICAgPC9saT4KLQotICAgICAgPGxpPgotICAgICAgICBSZXF1aXJlIHZhbGlkLXVzZXIgCi0KLSAgICAgICAgPHA+QWxsIHZhbGlkIHVzZXJzIGNhbiBhY2Nlc3MgdGhlIGRpcmVjdG9yeS48L3A+Ci0gICAgICA8L2xpPgotICAgIDwvdWw+Ci0KLSAgICA8cD48ZGlyZWN0aXZlPlJlcXVpcmU8L2RpcmVjdGl2ZT4gbXVzdCBiZSBhY2NvbXBhbmllZCBieQotICAgIDxkaXJlY3RpdmUgbW9kdWxlPSJjb3JlIj5BdXRoTmFtZTwvZGlyZWN0aXZlPiBhbmQgPGRpcmVjdGl2ZQotICAgIG1vZHVsZT0iY29yZSI+QXV0aFR5cGU8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlcywgYW5kIGRpcmVjdGl2ZXMgc3VjaAotICAgIGFzIDxkaXJlY3RpdmUgbW9kdWxlPSJtb2RfYXV0aCI+QXV0aFVzZXJGaWxlPC9kaXJlY3RpdmU+Ci0gICAgYW5kIDxkaXJlY3RpdmUgbW9kdWxlPSJtb2RfYXV0aCI+QXV0aEdyb3VwRmlsZTwvZGlyZWN0aXZlPiAodG8KLSAgICBkZWZpbmUgdXNlcnMgYW5kIGdyb3VwcykgaW4gb3JkZXIgdG8gd29yayBjb3JyZWN0bHkuIEV4YW1wbGU6PC9wPgotCi08ZXhhbXBsZT4KLSAgICAgICBBdXRoVHlwZSBCYXNpYzxiciAvPgotICAgICAgIEF1dGhOYW1lICJSZXN0cmljdGVkIERpcmVjdG9yeSI8YnIgLz4KLSAgICAgICBBdXRoVXNlckZpbGUgL3dlYi91c2VyczxiciAvPgotICAgICAgIEF1dGhHcm91cEZpbGUgL3dlYi9ncm91cHM8YnIgLz4KLSAgICAgICBSZXF1aXJlIGdyb3VwIGFkbWluPGJyIC8+Ci08L2V4YW1wbGU+Ci0KLSAgICA8cD5BY2Nlc3MgY29udHJvbHMgd2hpY2ggYXJlIGFwcGxpZWQgaW4gdGhpcyB3YXkgYXJlIGVmZmVjdGl2ZSBmb3IKLSAgICA8c3Ryb25nPmFsbDwvc3Ryb25nPiBtZXRob2RzLiA8c3Ryb25nPlRoaXMgaXMgd2hhdCBpcyBub3JtYWxseQotICAgIGRlc2lyZWQuPC9zdHJvbmc+IElmIHlvdSB3aXNoIHRvIGFwcGx5IGFjY2VzcyBjb250cm9scyBvbmx5IHRvCi0gICAgc3BlY2lmaWMgbWV0aG9kcywgd2hpbGUgbGVhdmluZyBvdGhlciBtZXRob2RzIHVucHJvdGVjdGVkLCB0aGVuCi0gICAgcGxhY2UgdGhlIDxkaXJlY3RpdmU+UmVxdWlyZTwvZGlyZWN0aXZlPiBzdGF0ZW1lbnQgaW50byBhCi0gICAgPGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiIHR5cGU9InNlY3Rpb24iPkxpbWl0PC9kaXJlY3RpdmU+Ci0gICAgc2VjdGlvbi48L3A+Ci08L3VzYWdlPgotPHNlZWFsc28+PGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiPlNhdGlzZnk8L2RpcmVjdGl2ZT48L3NlZWFsc28+Ci08c2VlYWxzbz48bW9kdWxlPm1vZF9hY2Nlc3M8L21vZHVsZT48L3NlZWFsc28+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5STGltaXRDUFU8L25hbWU+Ci08ZGVzY3JpcHRpb24+TGltaXRzIHRoZSBDUFUgY29uc3VtcHRpb24gb2YgcHJvY2Vzc2VzIGxhdW5jaGVkCi1ieSBBcGFjaGUgY2hpbGRyZW48L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5STGltaXRDUFUgPGVtPm51bWJlcjwvZW0+fG1heCBbPGVtPm51bWJlcjwvZW0+fG1heF08L3N5bnRheD4KLTxkZWZhdWx0PlVuc2V0OyB1c2VzIG9wZXJhdGluZyBzeXN0ZW0gZGVmYXVsdHM8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLTxjb21wYXRpYmlsaXR5Pk1vdmVkIGluIHZlcnNpb24gMi4wIHRvCi0gICAgdGhlIDxhIGhyZWY9Ii4uL21wbS5odG1sIj5NUE1zPC9hPjwvY29tcGF0aWJpbGl0eT4KLQotPHVzYWdlPgotICAgIDxwPlRha2VzIDEgb3IgMiBwYXJhbWV0ZXJzLiBUaGUgZmlyc3QgcGFyYW1ldGVyIHNldHMgdGhlIHNvZnQKLSAgICByZXNvdXJjZSBsaW1pdCBmb3IgYWxsIHByb2Nlc3NlcyBhbmQgdGhlIHNlY29uZCBwYXJhbWV0ZXIgc2V0cwotICAgIHRoZSBtYXhpbXVtIHJlc291cmNlIGxpbWl0LiBFaXRoZXIgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciwKLSAgICBvciA8ZW0+bWF4PC9lbT4gdG8gaW5kaWNhdGUgdG8gdGhlIHNlcnZlciB0aGF0IHRoZSBsaW1pdCBzaG91bGQKLSAgICBiZSBzZXQgdG8gdGhlIG1heGltdW0gYWxsb3dlZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbQotICAgIGNvbmZpZ3VyYXRpb24uIFJhaXNpbmcgdGhlIG1heGltdW0gcmVzb3VyY2UgbGltaXQgcmVxdWlyZXMgdGhhdAotICAgIHRoZSBzZXJ2ZXIgaXMgcnVubmluZyBhcyByb290LCBvciBpbiB0aGUgaW5pdGlhbCBzdGFydHVwCi0gICAgcGhhc2UuPC9wPgotCi0gICAgPHA+VGhpcyBhcHBsaWVzIHRvIHByb2Nlc3NlcyBmb3JrZWQgb2ZmIGZyb20gQXBhY2hlIGNoaWxkcmVuCi0gICAgc2VydmljaW5nIHJlcXVlc3RzLCBub3QgdGhlIEFwYWNoZSBjaGlsZHJlbiB0aGVtc2VsdmVzLiBUaGlzCi0gICAgaW5jbHVkZXMgQ0dJIHNjcmlwdHMgYW5kIFNTSSBleGVjIGNvbW1hbmRzLCBidXQgbm90IGFueQotICAgIHByb2Nlc3NlcyBmb3JrZWQgb2ZmIGZyb20gdGhlIEFwYWNoZSBwYXJlbnQgc3VjaCBhcyBwaXBlZAotICAgIGxvZ3MuPC9wPgotCi0gICAgPHA+Q1BVIHJlc291cmNlIGxpbWl0cyBhcmUgZXhwcmVzc2VkIGluIHNlY29uZHMgcGVyCi0gICAgcHJvY2Vzcy48L3A+Ci08L3VzYWdlPgotPHNlZWFsc28+PGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiPlJMaW1pdE1FTTwvZGlyZWN0aXZlPjwvc2VlYWxzbz4KLTxzZWVhbHNvPjxkaXJlY3RpdmUgbW9kdWxlPSJjb3JlIj5STGltaXROUFJPQzwvZGlyZWN0aXZlPjwvc2VlYWxzbz4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlJMaW1pdE1FTTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5MaW1pdHMgdGhlIG1lbW9yeSBjb25zdW1wdGlvbiBvZiBwcm9jZXNzZXMgbGF1bmNoZWQKLWJ5IEFwYWNoZSBjaGlsZHJlbjwvZGVzY3JpcHRpb24+Ci08c3ludGF4PlJMaW1pdE1FTSA8ZW0+bnVtYmVyPC9lbT58bWF4IFs8ZW0+bnVtYmVyPC9lbT58bWF4XTwvc3ludGF4PgotPGRlZmF1bHQ+VW5zZXQ7IHVzZXMgb3BlcmF0aW5nIHN5c3RlbSBkZWZhdWx0czwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08Y29tcGF0aWJpbGl0eT5Nb3ZlZCBpbiB2ZXJzaW9uIDIuMCB0byB0aGUgPGEKLWhyZWY9Ii4uL21wbS5odG1sIj5NUE1zPC9hPi48L2NvbXBhdGliaWxpdHk+Ci0KLTx1c2FnZT4KLSAgICA8cD5UYWtlcyAxIG9yIDIgcGFyYW1ldGVycy4gVGhlIGZpcnN0IHBhcmFtZXRlciBzZXRzIHRoZSBzb2Z0Ci0gICAgcmVzb3VyY2UgbGltaXQgZm9yIGFsbCBwcm9jZXNzZXMgYW5kIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHNldHMKLSAgICB0aGUgbWF4aW11bSByZXNvdXJjZSBsaW1pdC4gRWl0aGVyIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIsCi0gICAgb3IgPGVtPm1heDwvZW0+IHRvIGluZGljYXRlIHRvIHRoZSBzZXJ2ZXIgdGhhdCB0aGUgbGltaXQgc2hvdWxkCi0gICAgYmUgc2V0IHRvIHRoZSBtYXhpbXVtIGFsbG93ZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0KLSAgICBjb25maWd1cmF0aW9uLiBSYWlzaW5nIHRoZSBtYXhpbXVtIHJlc291cmNlIGxpbWl0IHJlcXVpcmVzIHRoYXQKLSAgICB0aGUgc2VydmVyIGlzIHJ1bm5pbmcgYXMgcm9vdCwgb3IgaW4gdGhlIGluaXRpYWwgc3RhcnR1cAotICAgIHBoYXNlLjwvcD4KLQotICAgIDxwPlRoaXMgYXBwbGllcyB0byBwcm9jZXNzZXMgZm9ya2VkIG9mZiBmcm9tIEFwYWNoZSBjaGlsZHJlbgotICAgIHNlcnZpY2luZyByZXF1ZXN0cywgbm90IHRoZSBBcGFjaGUgY2hpbGRyZW4gdGhlbXNlbHZlcy4gVGhpcwotICAgIGluY2x1ZGVzIENHSSBzY3JpcHRzIGFuZCBTU0kgZXhlYyBjb21tYW5kcywgYnV0IG5vdCBhbnkKLSAgICBwcm9jZXNzZXMgZm9ya2VkIG9mZiBmcm9tIHRoZSBBcGFjaGUgcGFyZW50IHN1Y2ggYXMgcGlwZWQKLSAgICBsb2dzLjwvcD4KLQotICAgIDxwPk1lbW9yeSByZXNvdXJjZSBsaW1pdHMgYXJlIGV4cHJlc3NlZCBpbiBieXRlcyBwZXIKLSAgICBwcm9jZXNzLjwvcD4KLTwvdXNhZ2U+Ci08c2VlYWxzbz48ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSI+UkxpbWl0Q1BVPC9kaXJlY3RpdmU+PC9zZWVhbHNvPgotPHNlZWFsc28+PGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiPlJMaW1pdE5QUk9DPC9kaXJlY3RpdmU+PC9zZWVhbHNvPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+UkxpbWl0TlBST0M8L25hbWU+Ci08ZGVzY3JpcHRpb24+TGltaXRzIHRoZSBudW1iZXIgb2YgcHJvY2Vzc2VzIHRoYXQgY2FuIGJlIGxhdW5jaGVkIGJ5IAotcHJvY2Vzc2VzIGxhdW5jaGVkIGJ5IEFwYWNoZSBjaGlsZHJlbjwvZGVzY3JpcHRpb24+Ci08c3ludGF4PlJMaW1pdE5QUk9DIDxlbT5udW1iZXI8L2VtPnxtYXggWzxlbT5udW1iZXI8L2VtPnxtYXhdPC9zeW50YXg+Ci08ZGVmYXVsdD5VbnNldDsgdXNlcyBvcGVyYXRpbmcgc3lzdGVtIGRlZmF1bHRzPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLTxjb21wYXRpYmlsaXR5Pk1vdmVkIGluIHZlcnNpb24gMi4wIHRvIHRoZSA8YQotaHJlZj0iLi4vbXBtLmh0bWwiPk1QTXM8L2E+LjwvY29tcGF0aWJpbGl0eT4KLQotPHVzYWdlPgotICAgIDxwPlRha2VzIDEgb3IgMiBwYXJhbWV0ZXJzLiBUaGUgZmlyc3QgcGFyYW1ldGVyIHNldHMgdGhlIHNvZnQKLSAgICByZXNvdXJjZSBsaW1pdCBmb3IgYWxsIHByb2Nlc3NlcyBhbmQgdGhlIHNlY29uZCBwYXJhbWV0ZXIgc2V0cwotICAgIHRoZSBtYXhpbXVtIHJlc291cmNlIGxpbWl0LiBFaXRoZXIgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciwKLSAgICBvciA8Y29kZT5tYXg8L2NvZGU+IHRvIGluZGljYXRlIHRvIHRoZSBzZXJ2ZXIgdGhhdCB0aGUgbGltaXQKLSAgICBzaG91bGQgYmUgc2V0IHRvIHRoZSBtYXhpbXVtIGFsbG93ZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0KLSAgICBjb25maWd1cmF0aW9uLiBSYWlzaW5nIHRoZSBtYXhpbXVtIHJlc291cmNlIGxpbWl0IHJlcXVpcmVzIHRoYXQKLSAgICB0aGUgc2VydmVyIGlzIHJ1bm5pbmcgYXMgcm9vdCwgb3IgaW4gdGhlIGluaXRpYWwgc3RhcnR1cAotICAgIHBoYXNlLjwvcD4KLQotICAgIDxwPlRoaXMgYXBwbGllcyB0byBwcm9jZXNzZXMgZm9ya2VkIG9mZiBmcm9tIEFwYWNoZSBjaGlsZHJlbgotICAgIHNlcnZpY2luZyByZXF1ZXN0cywgbm90IHRoZSBBcGFjaGUgY2hpbGRyZW4gdGhlbXNlbHZlcy4gVGhpcwotICAgIGluY2x1ZGVzIENHSSBzY3JpcHRzIGFuZCBTU0kgZXhlYyBjb21tYW5kcywgYnV0IG5vdCBhbnkKLSAgICBwcm9jZXNzZXMgZm9ya2VkIG9mZiBmcm9tIHRoZSBBcGFjaGUgcGFyZW50IHN1Y2ggYXMgcGlwZWQKLSAgICBsb2dzLjwvcD4KLQotICAgIDxwPlByb2Nlc3MgbGltaXRzIGNvbnRyb2wgdGhlIG51bWJlciBvZiBwcm9jZXNzZXMgcGVyIHVzZXIuPC9wPgotCi0gICAgPHA+Tm90ZTogSWYgQ0dJIHByb2Nlc3NlcyBhcmUgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gcnVubmluZwotICAgIHVuZGVyIHVzZXJpZHMgb3RoZXIgdGhhbiB0aGUgd2ViIHNlcnZlciB1c2VyaWQsIHRoaXMgZGlyZWN0aXZlCi0gICAgd2lsbCBsaW1pdCB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlcyB0aGF0IHRoZSBzZXJ2ZXIgaXRzZWxmIGNhbgotICAgIGNyZWF0ZS4gRXZpZGVuY2Ugb2YgdGhpcyBzaXR1YXRpb24gd2lsbCBiZSBpbmRpY2F0ZWQgYnkKLSAgICA8c3Ryb25nPjxlbT5jYW5ub3QgZm9yazwvZW0+PC9zdHJvbmc+IG1lc3NhZ2VzIGluIHRoZQotICAgIGVycm9yX2xvZy48L3A+Ci08L3VzYWdlPgotPHNlZWFsc28+PGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiPlJMaW1pdE1FTTwvZGlyZWN0aXZlPjwvc2VlYWxzbz4KLTxzZWVhbHNvPjxkaXJlY3RpdmUgbW9kdWxlPSJjb3JlIj5STGltaXRDUFU8L2RpcmVjdGl2ZT48L3NlZWFsc28+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5TYXRpc2Z5PC9uYW1lPgotPGRlc2NyaXB0aW9uPkNvbmZpZ3VyZXMgaG93IGhvc3QtbGV2ZWwgYWNjZXNzIGNvbnRyb2wgYW5kIHVzZXIgYXV0aGVudGljYXRpb24KLWludGVyYWN0PC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+U2F0aXNmeSBhbnl8YWxsPC9zeW50YXg+Ci08ZGVmYXVsdD5TYXRpc2Z5IGFsbDwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPkFjY2VzcyBwb2xpY3kgaWYgYm90aCA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJjb3JlIj5BbGxvdzwvZGlyZWN0aXZlPiBhbmQgPGRpcmVjdGl2ZQotICAgIG1vZHVsZT0iY29yZSI+UmVxdWlyZTwvZGlyZWN0aXZlPiB1c2VkLiBUaGUgcGFyYW1ldGVyIGNhbiBiZQotICAgIGVpdGhlciA8ZW0+J2FsbCc8L2VtPiBvciA8ZW0+J2FueSc8L2VtPi4gVGhpcyBkaXJlY3RpdmUgaXMgb25seQotICAgIHVzZWZ1bCBpZiBhY2Nlc3MgdG8gYSBwYXJ0aWN1bGFyIGFyZWEgaXMgYmVpbmcgcmVzdHJpY3RlZCBieSBib3RoCi0gICAgdXNlcm5hbWUvcGFzc3dvcmQgPGVtPmFuZDwvZW0+IGNsaWVudCBob3N0IGFkZHJlc3MuIEluIHRoaXMgY2FzZQotICAgIHRoZSBkZWZhdWx0IGJlaGF2aW9yICgiYWxsIikgaXMgdG8gcmVxdWlyZSB0aGF0IHRoZSBjbGllbnQgcGFzc2VzCi0gICAgdGhlIGFkZHJlc3MgYWNjZXNzIHJlc3RyaWN0aW9uIDxlbT5hbmQ8L2VtPiBlbnRlcnMgYSB2YWxpZAotICAgIHVzZXJuYW1lIGFuZCBwYXNzd29yZC4gV2l0aCB0aGUgImFueSIgb3B0aW9uIHRoZSBjbGllbnQgd2lsbCBiZQotICAgIGdyYW50ZWQgYWNjZXNzIGlmIHRoZXkgZWl0aGVyIHBhc3MgdGhlIGhvc3QgcmVzdHJpY3Rpb24gb3IgZW50ZXIgYQotICAgIHZhbGlkIHVzZXJuYW1lIGFuZCBwYXNzd29yZC4gVGhpcyBjYW4gYmUgdXNlZCB0byBwYXNzd29yZCByZXN0cmljdAotICAgIGFuIGFyZWEsIGJ1dCB0byBsZXQgY2xpZW50cyBmcm9tIHBhcnRpY3VsYXIgYWRkcmVzc2VzIGluIHdpdGhvdXQKLSAgICBwcm9tcHRpbmcgZm9yIGEgcGFzc3dvcmQuPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlNjcmlwdEludGVycHJldGVyU291cmNlPC9uYW1lPgotPGRlc2NyaXB0aW9uPkNvbnRyb2xzIGhvdyB0aGUgaW50ZXJwcmV0ZXIgZm9yIENHSSBzY3JpcHRzIGlzCi1sb2NhdGVkPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+U2NyaXB0SW50ZXJwcmV0ZXJTb3VyY2UgcmVnaXN0cnl8c2NyaXB0PC9zeW50YXg+Ci08ZGVmYXVsdD5TY3JpcHRJbnRlcnByZXRlclNvdXJjZSBzY3JpcHQ8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0Pjxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08Y29tcGF0aWJpbGl0eT5XaW4zMiBvbmx5PC9jb21wYXRpYmlsaXR5PgotCi08dXNhZ2U+Ci0gICAgPHA+VGhpcyBkaXJlY3RpdmUgaXMgdXNlZCB0byBjb250cm9sIGhvdyBBcGFjaGUgZmluZHMgdGhlCi0gICAgaW50ZXJwcmV0ZXIgdXNlZCB0byBydW4gQ0dJIHNjcmlwdHMuIFRoZSBkZWZhdWx0IHRlY2huaXF1ZSBpcyB0bwotICAgIHVzZSB0aGUgaW50ZXJwcmV0ZXIgcG9pbnRlZCB0byBieSB0aGUgIyEgbGluZSBpbiB0aGUKLSAgICBzY3JpcHQuIFNldHRpbmcgPGNvZGU+U2NyaXB0SW50ZXJwcmV0ZXJTb3VyY2UgcmVnaXN0cnk8L2NvZGU+IHdpbGwKLSAgICBjYXVzZSB0aGUgV2luZG93cyBSZWdpc3RyeSB0byBiZSBzZWFyY2hlZCB1c2luZyB0aGUgc2NyaXB0IGZpbGUKLSAgICBleHRlbnNpb24gKGUuZy4sIC5wbCkgYXMgYSBzZWFyY2gga2V5LjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5TZXJ2ZXJBZG1pbjwvbmFtZT4KLTxkZXNjcmlwdGlvbj5TZXRzIHRoZSBlbWFpbCBhZGRyZXNzIHRoYXQgdGhlIHNlcnZlciBpbmNsdWRlcyBpbiBlcnJvcgotbWVzc2FnZXMgc2VudCB0byB0aGUgY2xpZW50PC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+U2VydmVyQWRtaW4gPGVtPmVtYWlsLWFkZHJlc3M8L2VtPjwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPlNlcnZlckFkbWluPC9kaXJlY3RpdmU+IHNldHMgdGhlIGUtbWFpbCBhZGRyZXNzCi0gICAgdGhhdCB0aGUgc2VydmVyIGluY2x1ZGVzIGluIGFueSBlcnJvciBtZXNzYWdlcyBpdCByZXR1cm5zIHRvIHRoZQotICAgIGNsaWVudC48L3A+Ci0KLSAgICA8cD5JdCBtYXkgYmUgd29ydGggc2V0dGluZyB1cCBhIGRlZGljYXRlZCBhZGRyZXNzIGZvciB0aGlzLAotICAgIDxlbT5lLmcuPC9lbT48L3A+Ci08ZXhhbXBsZT5TZXJ2ZXJBZG1pbiB3d3ctYWRtaW5AZm9vLmJhci5jb208L2V4YW1wbGU+Ci0gICAgPHA+YXMgdXNlcnMgZG8gbm90IGFsd2F5cyBtZW50aW9uIHRoYXQgdGhleSBhcmUgdGFsa2luZyBhYm91dCB0aGUKLSAgICBzZXJ2ZXIhPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlNlcnZlckFsaWFzPC9uYW1lPgotPGRlc2NyaXB0aW9uPlNldHMgYWx0ZXJuYXRlIG5hbWVzIGZvciBhIGhvc3QgdXNlZCB3aGVuIG1hdGNoaW5nIHJlcXVlc3RzCi10byBuYW1lLXZpcnR1YWwgaG9zdHM8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5TZXJ2ZXJBbGlhcyA8ZW0+aG9zdG5hbWU8L2VtPiBbPGVtPmhvc3RuYW1lPC9lbT5dIC4uLjwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIDxkaXJlY3RpdmU+U2VydmVyQWxpYXM8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIHNldHMgdGhlCi0gICAgYWx0ZXJuYXRlIG5hbWVzIGZvciBhIGhvc3QsIGZvciB1c2Ugd2l0aCA8YQotICAgIGhyZWY9Ii4uL3Zob3N0cy9uYW1lLWJhc2VkLmh0bWwiPm5hbWUtYmFzZWQgdmlydHVhbCBob3N0czwvYT4uPC9wPgotCi08ZXhhbXBsZT4KLSAgICAmbHQ7VmlydHVhbEhvc3QgKiZndDs8YnIgLz4KLSAgICBTZXJ2ZXJOYW1lIHNlcnZlci5kb21haW4uY29tPGJyIC8+Ci0gICAgU2VydmVyQWxpYXMgc2VydmVyIHNlcnZlcjIuZG9tYWluLmNvbSBzZXJ2ZXIyPGJyIC8+Ci0gICAgLi4uPGJyIC8+Ci0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLTwvZXhhbXBsZT4KLTwvdXNhZ2U+Ci08c2VlYWxzbz48YSBocmVmPSIuLi92aG9zdHMvIj5BcGFjaGUgVmlydHVhbCBIb3N0IGRvY3VtZW50YXRpb248L2E+PC9zZWVhbHNvPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U2VydmVyTmFtZTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5TZXRzIHRoZSBob3N0bmFtZSBhbmQgcG9ydCB0aGF0IHRoZSBzZXJ2ZXIgdXNlcyB0byBpZGVudGlmeQotaXRzZWxmPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+U2VydmVyTmFtZSA8ZW0+ZnVsbHktcXVhbGlmaWVkLWRvbWFpbi1uYW1lWzpwb3J0XTwvZW0+PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPGNvbXBhdGliaWxpdHk+SW4gdmVyc2lvbiAyLjAsIHRoaXMKLSAgICAgZGlyZWN0aXZlIHN1cGVyc2VkZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIDxkaXJlY3RpdmU+UG9ydDwvZGlyZWN0aXZlPgotICAgICBkaXJlY3RpdmUgZnJvbSB2ZXJzaW9uIDEuMy48L2NvbXBhdGliaWxpdHk+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5TZXJ2ZXJOYW1lPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBzZXRzIHRoZSBob3N0bmFtZSBhbmQKLSAgICBwb3J0IHRoYXQgdGhlIHNlcnZlciB1c2VzIHRvIGlkZW50aWZ5IGl0c2VsZi4gIFRoaXMgaXMgdXNlZCB3aGVuCi0gICAgY3JlYXRpbmcgcmVkaXJlY3Rpb24gVVJMcy4gIEZvciBleGFtcGxlLCBpZiB0aGUgbmFtZSBvZiB0aGUKLSAgICBtYWNoaW5lIGhvc3RpbmcgdGhlIHdlYnNlcnZlciBpcyA8Y29kZT5zaW1wbGUuZXhhbXBsZS5jb208L2NvZGU+LAotICAgIGJ1dCB0aGUgbWFjaGluZSBhbHNvIGhhcyB0aGUgRE5TIGFsaWFzIDxjb2RlPnd3dy5leGFtcGxlLmNvbTwvY29kZT4KLSAgICBhbmQgeW91IHdpc2ggdGhlIHdlYnNlcnZlciB0byBiZSBzbyBpZGVudGlmaWVkLCB0aGUgZm9sbG93aW5nCi0gICAgZGlyZWN0aXZlIHNob3VsZCBiZSB1c2VkOjwvcD4KLQotPGV4YW1wbGU+U2VydmVyTmFtZSB3d3cuZXhhbXBsZS5jb206ODA8L2V4YW1wbGU+Ci0KLSAgICA8cD5JZiBubyA8ZGlyZWN0aXZlPlNlcnZlck5hbWU8L2RpcmVjdGl2ZT4gaXMgc3BlY2lmaWVkLCB0aGVuIHRoZQotICAgIHNlcnZlciBhdHRlbXB0cyB0byBkZWR1Y2UgdGhlIGhvc3RuYW1lIGJ5IHBlcmZvcm1pbmcgYSByZXZlcnNlCi0gICAgbG9va3VwIG9uIHRoZSBJUCBhZGRyZXNzLiAgSWYgbm8gcG9ydCBpcyBzcGVjaWZpZWQgaW4gdGhlCi0gICAgc2VydmVybmFtZSwgdGhlbiB0aGUgc2VydmVyIHdpbGwgdXNlIHRoZSBwb3J0IGZyb20gdGhlIGluY29taW5nCi0gICAgcmVxdWVzdC4gIEZvciBvcHRpbWFsIHJlbGlhYmlsaXR5IGFuZCBwcmVkaWN0YWJpbGl0eSwgeW91IHNob3VsZAotICAgIHNwZWNpZnkgYW4gZXhwbGljaXQgaG9zdG5hbWUgYW5kIHBvcnQgdXNpbmcgdGhlCi0gICAgPGRpcmVjdGl2ZT5TZXJ2ZXJOYW1lPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZS48L3A+Ci0KLSAgICA8cD5JZiB5b3UgYXJlIHVzaW5nIDxhCi0gICAgaHJlZj0iLi4vdmhvc3RzL25hbWUtYmFzZWQuaHRtbCI+bmFtZS1iYXNlZCB2aXJ0dWFsIGhvc3RzPC9hPiwKLSAgICB0aGUgPGRpcmVjdGl2ZT5TZXJ2ZXJOYW1lPC9kaXJlY3RpdmU+IGluc2lkZSBhCi0gICAgPGRpcmVjdGl2ZSB0eXBlPSJzZWN0aW9uIiBtb2R1bGU9ImNvcmUiPlZpcnR1YWxIb3N0PC9kaXJlY3RpdmU+Ci0gICAgc2VjdGlvbiBzcGVjaWZpZXMgd2hhdCBob3N0bmFtZSBtdXN0IGFwcGVhciBpbiB0aGUgcmVxdWVzdCdzCi0gICAgPGNvZGU+SG9zdDo8L2NvZGU+IGhlYWRlciB0byBtYXRjaCB0aGlzIHZpcnR1YWwgaG9zdC48L3A+Ci0KLSAgICA8cD5TZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZQotICAgIDxkaXJlY3RpdmUgbW9kdWxlPSJjb3JlIj5Vc2VDYW5vbmljYWxOYW1lPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBmb3IKLSAgICBzZXR0aW5ncyB3aGljaCBkZXRlcm1pbmUgd2hldGhlciBzZWxmLXJlZmVyZW50aWFsIFVSTCdzIChlLmcuLCBieSB0aGUKLSAgICA8bW9kdWxlPm1vZF9kaXI8L21vZHVsZT4gbW9kdWxlKSB3aWxsIHJlZmVyIHRvIHRoZQotICAgIHNwZWNpZmllZCBwb3J0LCBvciB0byB0aGUgcG9ydCBudW1iZXIgZ2l2ZW4gaW4gdGhlIGNsaWVudCdzIHJlcXVlc3QuCi0gICAgPC9wPgotPC91c2FnZT4KLQotPHNlZWFsc28+PGEgaHJlZj0iLi4vZG5zLWNhdmVhdHMuaHRtbCI+RE5TIElzc3VlczwvYT48L3NlZWFsc28+Ci08c2VlYWxzbz48YSBocmVmPSIuLi92aG9zdHMvIj5BcGFjaGUgdmlydHVhbCBob3N0Ci0gICAgZG9jdW1lbnRhdGlvbjwvYT48L3NlZWFsc28+Ci08c2VlYWxzbz48ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSI+VXNlQ2Fub25pY2FsTmFtZTwvZGlyZWN0aXZlPjwvc2VlYWxzbz4KLTxzZWVhbHNvPjxkaXJlY3RpdmUgbW9kdWxlPSJjb3JlIj5OYW1lVmlydHVhbEhvc3Q8L2RpcmVjdGl2ZT48L3NlZWFsc28+Ci08c2VlYWxzbz48ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSI+U2VydmVyQWxpYXM8L2RpcmVjdGl2ZT48L3NlZWFsc28+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5TZXJ2ZXJQYXRoPC9uYW1lPgotPGRlc2NyaXB0aW9uPlNldHMgdGhlIGxlZ2FjeSBVUkwgcGF0aG5hbWUgZm9yIGEgbmFtZS12aXJ0dWFsIGhvc3QgdGhhdAotaXMgYWNjZXNzZWQgYnkgYW4gaW5jb21wYXRpYmxlIGJyb3dzZXI8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5TZXJ2ZXJQYXRoIDxlbT5kaXJlY3RvcnktcGF0aDwvZW0+PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5TZXJ2ZXJQYXRoPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBzZXRzIHRoZSBsZWdhY3kKLSAgICBVUkwgcGF0aG5hbWUgZm9yIGEgaG9zdCwgZm9yIHVzZSB3aXRoIDxhCi0gICAgaHJlZj0iLi4vdmhvc3RzLyI+bmFtZS1iYXNlZCB2aXJ0dWFsIGhvc3RzPC9hPi48L3A+Ci08L3VzYWdlPgotPHNlZWFsc28+PGEgaHJlZj0iLi4vdmhvc3RzLyI+QXBhY2hlIFZpcnR1YWwgSG9zdCBkb2N1bWVudGF0aW9uPC9hPjwvc2VlYWxzbz4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlNlcnZlclJvb3Q8L25hbWU+Ci08ZGVzY3JpcHRpb24+U2V0cyB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIHRoZSBzZXJ2ZXIgaW5zdGFsbGF0aW9uPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+U2VydmVyUm9vdCA8ZW0+ZGlyZWN0b3J5LXBhdGg8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+U2VydmVyUm9vdCAvdXNyL2xvY2FsL2FwYWNoZTwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5TZXJ2ZXJSb290PC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBzZXRzIHRoZQotICAgIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgc2VydmVyIGxpdmVzLiBUeXBpY2FsbHkgaXQgd2lsbCBjb250YWluIHRoZQotICAgIHN1YmRpcmVjdG9yaWVzIDxjb2RlPmNvbmYvPC9jb2RlPiBhbmQgPGNvZGU+bG9ncy88L2NvZGU+LiBSZWxhdGl2ZQotICAgIHBhdGhzIGZvciBvdGhlciBjb25maWd1cmF0aW9uIGZpbGVzIGFyZSB0YWtlbiBhcyByZWxhdGl2ZSB0byB0aGlzCi0gICAgZGlyZWN0b3J5LjwvcD4KLTwvdXNhZ2U+Ci08c2VlYWxzbz48YSBocmVmPSIuLi9pbnZva2luZy5odG1sIj50aGUgPGNvZGU+LWQ8L2NvZGU+Ci0gICAgb3B0aW9uIHRvIDxjb2RlPmh0dHBkPC9jb2RlPjwvYT48L3NlZWFsc28+Ci08c2VlYWxzbz48YSBocmVmPSIuLi9taXNjL3NlY3VyaXR5X3RpcHMuaHRtbCNzZXJ2ZXJyb290Ij50aGUKLSAgICBzZWN1cml0eSB0aXBzPC9hPiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIHByb3Blcmx5IHNldAotICAgIHBlcm1pc3Npb25zIG9uIHRoZSBTZXJ2ZXJSb290PC9zZWVhbHNvPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U2VydmVyU2lnbmF0dXJlPC9uYW1lPgotPGRlc2NyaXB0aW9uPkNvbmZpZ3VyZXMgdGhlIGZvb3RlciBvbiBzZXJ2ZXItZ2VuZXJhdGVkIGRvY3VtZW50czwvZGVzY3JpcHRpb24+Ci08c3ludGF4PlNlcnZlclNpZ25hdHVyZSBPbnxPZmZ8RU1haWw8L3N5bnRheD4KLTxkZWZhdWx0PlNlcnZlclNpZ25hdHVyZSBPZmY8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPlNlcnZlclNpZ25hdHVyZTwvZGlyZWN0aXZlPiBkaXJlY3RpdmUgYWxsb3dzIHRoZQotICAgIGNvbmZpZ3VyYXRpb24gb2YgYSB0cmFpbGluZyBmb290ZXIgbGluZSB1bmRlciBzZXJ2ZXItZ2VuZXJhdGVkCi0gICAgZG9jdW1lbnRzIChlcnJvciBtZXNzYWdlcywgbW9kX3Byb3h5IGZ0cCBkaXJlY3RvcnkgbGlzdGluZ3MsCi0gICAgbW9kX2luZm8gb3V0cHV0LCAuLi4pLiBUaGUgcmVhc29uIHdoeSB5b3Ugd291bGQgd2FudCB0byBlbmFibGUKLSAgICBzdWNoIGEgZm9vdGVyIGxpbmUgaXMgdGhhdCBpbiBhIGNoYWluIG9mIHByb3hpZXMsIHRoZSB1c2VyIG9mdGVuCi0gICAgaGFzIG5vIHBvc3NpYmlsaXR5IHRvIHRlbGwgd2hpY2ggb2YgdGhlIGNoYWluZWQgc2VydmVycyBhY3R1YWxseQotICAgIHByb2R1Y2VkIGEgcmV0dXJuZWQgZXJyb3IgbWVzc2FnZS48YnIgLz4gVGhlIDxzYW1wPk9mZjwvc2FtcD4KLSAgICBzZXR0aW5nLCB3aGljaCBpcyB0aGUgZGVmYXVsdCwgc3VwcHJlc3NlcyB0aGUgZXJyb3IgbGluZSAoYW5kIGlzCi0gICAgdGhlcmVmb3JlIGNvbXBhdGlibGUgd2l0aCB0aGUgYmVoYXZpb3Igb2YgQXBhY2hlLTEuMiBhbmQKLSAgICBiZWxvdykuIFRoZSA8c2FtcD5Pbjwvc2FtcD4gc2V0dGluZyBzaW1wbHkgYWRkcyBhIGxpbmUgd2l0aCB0aGUKLSAgICBzZXJ2ZXIgdmVyc2lvbiBudW1iZXIgYW5kIDxkaXJlY3RpdmUKLSAgICBtb2R1bGU9ImNvcmUiPlNlcnZlck5hbWU8L2RpcmVjdGl2ZT4gb2YgdGhlIHNlcnZpbmcgdmlydHVhbCBob3N0LAotICAgIGFuZCB0aGUgPHNhbXA+RU1haWw8L3NhbXA+IHNldHRpbmcgYWRkaXRpb25hbGx5IGNyZWF0ZXMgYQotICAgICJtYWlsdG86IiByZWZlcmVuY2UgdG8gdGhlIDxkaXJlY3RpdmUKLSAgICBtb2R1bGU9ImNvcmUiPlNlcnZlckFkbWluPC9kaXJlY3RpdmU+IG9mIHRoZSByZWZlcmVuY2VkCi0gICAgZG9jdW1lbnQuPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlNlcnZlclRva2VuczwvbmFtZT4KLTxkZXNjcmlwdGlvbj5Db25maWd1cmVzIHRoZSBTZXJ2ZXIgSFRUUCByZXNwb25zZSBoZWFkZXI8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5TZXJ2ZXJUb2tlbnMgTWluaW1hbHxQcm9kdWN0T25seXxPU3xGdWxsPC9zeW50YXg+Ci08ZGVmYXVsdD5TZXJ2ZXJUb2tlbnMgRnVsbDwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGlzIGRpcmVjdGl2ZSBjb250cm9scyB3aGV0aGVyIDxzYW1wPlNlcnZlcjwvc2FtcD4gcmVzcG9uc2UKLSAgICBoZWFkZXIgZmllbGQgd2hpY2ggaXMgc2VudCBiYWNrIHRvIGNsaWVudHMgaW5jbHVkZXMgYQotICAgIGRlc2NyaXB0aW9uIG9mIHRoZSBnZW5lcmljIE9TLXR5cGUgb2YgdGhlIHNlcnZlciBhcyB3ZWxsIGFzCi0gICAgaW5mb3JtYXRpb24gYWJvdXQgY29tcGlsZWQtaW4gbW9kdWxlcy48L3A+Ci0KLSAgICA8ZGw+Ci0gICAgICA8ZHQ+PGNvZGU+U2VydmVyVG9rZW5zIFByb2RbdWN0T25seV08L2NvZGU+PC9kdD4KLQotICAgICAgPGRkPlNlcnZlciBzZW5kcyAoPGVtPmUuZy48L2VtPik6IDxzYW1wPlNlcnZlcjoKLSAgICAgIEFwYWNoZTwvc2FtcD48L2RkPgotCi0gICAgICA8ZHQ+PGNvZGU+U2VydmVyVG9rZW5zIE1pbltpbWFsXTwvY29kZT48L2R0PgotCi0gICAgICA8ZGQ+U2VydmVyIHNlbmRzICg8ZW0+ZS5nLjwvZW0+KTogPHNhbXA+U2VydmVyOgotICAgICAgQXBhY2hlLzEuMy4wPC9zYW1wPjwvZGQ+Ci0KLSAgICAgIDxkdD48Y29kZT5TZXJ2ZXJUb2tlbnMgT1M8L2NvZGU+PC9kdD4KLQotICAgICAgPGRkPlNlcnZlciBzZW5kcyAoPGVtPmUuZy48L2VtPik6IDxzYW1wPlNlcnZlcjogQXBhY2hlLzEuMy4wCi0gICAgICAoVW5peCk8L3NhbXA+PC9kZD4KLQotICAgICAgPGR0Pjxjb2RlPlNlcnZlclRva2VucyBGdWxsPC9jb2RlPiAob3Igbm90IHNwZWNpZmllZCk8L2R0PgotCi0gICAgICA8ZGQ+U2VydmVyIHNlbmRzICg8ZW0+ZS5nLjwvZW0+KTogPHNhbXA+U2VydmVyOiBBcGFjaGUvMS4zLjAKLSAgICAgIChVbml4KSBQSFAvMy4wIE15TW9kLzEuMjwvc2FtcD48L2RkPgotICAgIDwvZGw+Ci0KLSAgICA8cD5UaGlzIHNldHRpbmcgYXBwbGllcyB0byB0aGUgZW50aXJlIHNlcnZlciwgYW5kIGNhbm5vdCBiZQotICAgIGVuYWJsZWQgb3IgZGlzYWJsZWQgb24gYSB2aXJ0dWFsaG9zdC1ieS12aXJ0dWFsaG9zdCBiYXNpcy48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U2V0SGFuZGxlcjwvbmFtZT4KLTxkZXNjcmlwdGlvbj5Gb3JjZXMgYWxsIG1hdGNoaW5nIGZpbGVzIHRvIGJlIHByb2Nlc3NlZCBieSBhCi1oYW5kbGVyPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+U2V0SGFuZGxlciA8ZW0+aGFuZGxlci1uYW1lPC9lbT48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPGNvbXBhdGliaWxpdHk+TW92ZWQgaW50byB0aGUgY29yZSBpbiBBcGFjaGUgMi4wPC9jb21wYXRpYmlsaXR5PgotCi08dXNhZ2U+Ci0gICAgPHA+V2hlbiBwbGFjZWQgaW50byBhbiA8Y29kZT4uaHRhY2Nlc3M8L2NvZGU+IGZpbGUgb3IgYQotICAgIDxkaXJlY3RpdmUgdHlwZT0ic2VjdGlvbiIgbW9kdWxlPSJjb3JlIj5EaXJlY3Rvcnk8L2RpcmVjdGl2ZT4gb3IgCi0gICAgPGRpcmVjdGl2ZSB0eXBlPSJzZWN0aW9uIiBtb2R1bGU9ImNvcmUiPkxvY2F0aW9uPC9kaXJlY3RpdmU+Ci0gICAgc2VjdGlvbiwgdGhpcyBkaXJlY3RpdmUgZm9yY2VzIGFsbCBtYXRjaGluZyBmaWxlcyB0byBiZSBwYXJzZWQKLSAgICB0aHJvdWdoIHRoZSA8YSBocmVmPSIuLi9oYW5kbGVyLmh0bWwiPmhhbmRsZXI8L2E+IGdpdmVuIGJ5Ci0gICAgPGVtPmhhbmRsZXItbmFtZTwvZW0+LiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhZCBhIGRpcmVjdG9yeSB5b3UKLSAgICB3YW50ZWQgdG8gYmUgcGFyc2VkIGVudGlyZWx5IGFzIGltYWdlbWFwIHJ1bGUgZmlsZXMsIHJlZ2FyZGxlc3MKLSAgICBvZiBleHRlbnNpb24sIHlvdSBtaWdodCBwdXQgdGhlIGZvbGxvd2luZyBpbnRvIGFuCi0gICAgPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBmaWxlIGluIHRoYXQgZGlyZWN0b3J5OjwvcD4KLTxleGFtcGxlPgotICAgIFNldEhhbmRsZXIgaW1hcC1maWxlCi08L2V4YW1wbGU+Ci0KLSAgICA8cD5Bbm90aGVyIGV4YW1wbGU6IGlmIHlvdSB3YW50ZWQgdG8gaGF2ZSB0aGUgc2VydmVyIGRpc3BsYXkgYQotICAgIHN0YXR1cyByZXBvcnQgd2hlbmV2ZXIgYSBVUkwgb2YKLSAgICA8Y29kZT5odHRwOi8vc2VydmVybmFtZS9zdGF0dXM8L2NvZGU+IHdhcyBjYWxsZWQsIHlvdSBtaWdodCBwdXQKLSAgICB0aGUgZm9sbG93aW5nIGludG8gaHR0cGQuY29uZjo8L3A+Ci08ZXhhbXBsZT4KLSAgICAmbHQ7TG9jYXRpb24gL3N0YXR1cyZndDs8YnIgLz4KLSAgICBTZXRIYW5kbGVyIHNlcnZlci1zdGF0dXM8YnIgLz4KLSAgICAmbHQ7L0xvY2F0aW9uJmd0OwotPC9leGFtcGxlPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlNldElucHV0RmlsdGVyPC9uYW1lPgotPGRlc2NyaXB0aW9uPlNldHMgdGhlIGZpbHRlcnMgdGhhdCB3aWxsIHByb2Nlc3MgY2xpZW50IHJlcXVlc3RzIGFuZCBQT1NUCi1pbnB1dDwvZGVzY3JpcHRpb24+Ci08c3ludGF4PlNldElucHV0RmlsdGVyIDxlbT5maWx0ZXI8L2VtPls8ZW0+O2ZpbHRlcjwvZW0+Li4uXTwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0Pjxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5TZXRJbnB1dEZpbHRlcjwvZGlyZWN0aXZlPiBkaXJlY3RpdmUgc2V0cyB0aGUKLSAgICBmaWx0ZXIgb3IgZmlsdGVycyB3aGljaCB3aWxsIHByb2Nlc3MgY2xpZW50IHJlcXVlc3RzIGFuZCBQT1NUCi0gICAgaW5wdXQgd2hlbiB0aGV5IGFyZSByZWNlaXZlZCBieSB0aGUgc2VydmVyLiBUaGlzIGlzIGluIGFkZGl0aW9uIHRvCi0gICAgYW55IGZpbHRlcnMgZGVmaW5lZCBlbHNld2hlcmUsIGluY2x1ZGluZyB0aGUKLSAgICA8ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX21pbWUiPkFkZElucHV0RmlsdGVyPC9kaXJlY3RpdmU+Ci0gICAgZGlyZWN0aXZlLjwvcD4KLQotICAgIDxwPklmIG1vcmUgdGhhbiBvbmUgZmlsdGVyIGlzIHNwZWNpZmllZCwgdGhleSBtdXN0IGJlIHNlcGFyYXRlZAotICAgIGJ5IHNlbWljb2xvbnMgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgc2hvdWxkIHByb2Nlc3MgdGhlCi0gICAgY29udGVudC48L3A+Ci08L3VzYWdlPgotPHNlZWFsc28+PGEgaHJlZj0iLi4vZmlsdGVyLmh0bWwiPkZpbHRlcnM8L2E+IGRvY3VtZW50YXRpb248L3NlZWFsc28+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5TZXRPdXRwdXRGaWx0ZXI8L25hbWU+Ci08ZGVzY3JpcHRpb24+U2V0cyB0aGUgZmlsdGVycyB0aGF0IHdpbGwgcHJvY2VzcyByZXNwb25zZXMgZnJvbSB0aGUKLXNlcnZlcjwvZGVzY3JpcHRpb24+Ci08c3ludGF4PlNldE91dHB1dEZpbHRlciA8ZW0+ZmlsdGVyPC9lbT4gWzxlbT5maWx0ZXI8L2VtPl0gLi4uPC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPlNldE91dHB1dEZpbHRlcjwvZGlyZWN0aXZlPiBkaXJlY3RpdmUgc2V0cyB0aGUgZmlsdGVycwotICAgIHdoaWNoIHdpbGwgcHJvY2VzcyByZXNwb25zZXMgZnJvbSB0aGUgc2VydmVyIGJlZm9yZSB0aGV5IGFyZQotICAgIHNlbnQgdG8gdGhlIGNsaWVudC4gVGhpcyBpcyBpbiBhZGRpdGlvbiB0byBhbnkgZmlsdGVycyBkZWZpbmVkCi0gICAgZWxzZXdoZXJlLCBpbmNsdWRpbmcgdGhlCi0gICAgPGRpcmVjdGl2ZSBtb2R1bGU9Im1vZF9taW1lIj5BZGRPdXRwdXRGaWx0ZXI8L2RpcmVjdGl2ZT4KLSAgICBkaXJlY3RpdmUuPC9wPgotCi0gICAgPHA+Rm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiB3aWxsIHByb2Nlc3MgYWxsIGZpbGVzCi0gICAgaW4gdGhlIDxjb2RlPi93d3cvZGF0YS88L2NvZGU+IGRpcmVjdG9yeSBmb3Igc2VydmVyLXNpZGUKLSAgICBpbmNsdWRlcy48L3A+Ci08ZXhhbXBsZT4KLSZsdDtEaXJlY3RvcnkgL3d3dy9kYXRhLyZndDs8YnIgLz4KLSZuYnNwOyZuYnNwO1NldE91dHB1dEZpbHRlciBJTkNMVURFUzxiciAvPgotJmx0Oy9EaXJlY3RvcnkmZ3Q7Ci08L2V4YW1wbGU+Ci0KLSAgICA8cD5JZiBtb3JlIHRoYW4gb25lIGZpbHRlciBpcyBzcGVjaWZpZWQsIHRoZXkgbXVzdCBiZSBzZXBhcmF0ZWQKLSAgICBieSBzZW1pY29sb25zIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHNob3VsZCBwcm9jZXNzIHRoZQotICAgIGNvbnRlbnQuPC9wPgotPC91c2FnZT4KLTxzZWVhbHNvPjxhIGhyZWY9Ii4uL2ZpbHRlci5odG1sIj5GaWx0ZXJzPC9hPiBkb2N1bWVudGF0aW9uPC9zZWVhbHNvPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+VGltZU91dDwvbmFtZT4KLTxkZXNjcmlwdGlvbj5EZWZpbmVzIHRoZSBhbW91bnQgb2YgdGltZSB0aGUgc2VydmVyIHdpbGwgd2FpdCBmb3IKLWNlcnRhaW4gZXZlbnRzIGJlZm9yZSBmYWlsaW5nIGEgcmVxdWVzdDwvZGVzY3JpcHRpb24+Ci08c3ludGF4PlRpbWVPdXQgPGVtPm51bWJlcjwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5UaW1lT3V0IDMwMDwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5UaW1lT3V0PC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBjdXJyZW50bHkgZGVmaW5lcwotICAgIHRoZSBhbW91bnQgb2YgdGltZSBBcGFjaGUgd2lsbCB3YWl0IGZvciB0aHJlZSB0aGluZ3M6PC9wPgotCi0gICAgPG9sPgotICAgICAgPGxpPlRoZSB0b3RhbCBhbW91bnQgb2YgdGltZSBpdCB0YWtlcyB0byByZWNlaXZlIGEgR0VUCi0gICAgICByZXF1ZXN0LjwvbGk+Ci0KLSAgICAgIDxsaT5UaGUgYW1vdW50IG9mIHRpbWUgYmV0d2VlbiByZWNlaXB0IG9mIFRDUCBwYWNrZXRzIG9uIGEKLSAgICAgIFBPU1Qgb3IgUFVUIHJlcXVlc3QuPC9saT4KLQotICAgICAgPGxpPlRoZSBhbW91bnQgb2YgdGltZSBiZXR3ZWVuIEFDS3Mgb24gdHJhbnNtaXNzaW9ucyBvZiBUQ1AKLSAgICAgIHBhY2tldHMgaW4gcmVzcG9uc2VzLjwvbGk+Ci0gICAgPC9vbD4KLSAgICAKLSAgICA8cD5XZSBwbGFuIG9uIG1ha2luZyB0aGVzZSBzZXBhcmF0ZWx5IGNvbmZpZ3VyYWJsZSBhdCBzb21lIHBvaW50Ci0gICAgZG93biB0aGUgcm9hZC4gVGhlIHRpbWVyIHVzZWQgdG8gZGVmYXVsdCB0byAxMjAwIGJlZm9yZSAxLjIsCi0gICAgYnV0IGhhcyBiZWVuIGxvd2VyZWQgdG8gMzAwIHdoaWNoIGlzIHN0aWxsIGZhciBtb3JlIHRoYW4KLSAgICBuZWNlc3NhcnkgaW4gbW9zdCBzaXR1YXRpb25zLiBJdCBpcyBub3Qgc2V0IGFueSBsb3dlciBieQotICAgIGRlZmF1bHQgYmVjYXVzZSB0aGVyZSBtYXkgc3RpbGwgYmUgb2RkIHBsYWNlcyBpbiB0aGUgY29kZSB3aGVyZQotICAgIHRoZSB0aW1lciBpcyBub3QgcmVzZXQgd2hlbiBhIHBhY2tldCBpcyBzZW50LiA8L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+VXNlQ2Fub25pY2FsTmFtZTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5Db25maWd1cmVzIGhvdyB0aGUgc2VydmVyIGRldGVybWluZXMgaXRzIG93biBuYW1lIGFuZAotcG9ydDwvZGVzY3JpcHRpb24+Ci08c3ludGF4PlVzZUNhbm9uaWNhbE5hbWUgb258b2ZmfGRuczwvc3ludGF4PgotPGRlZmF1bHQ+VXNlQ2Fub25pY2FsTmFtZSBvbjwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT5PcHRpb25zPC9vdmVycmlkZT4KLQotPHVzYWdlPgotICAgIDxwPkluIG1hbnkgc2l0dWF0aW9ucyBBcGFjaGUgaGFzIHRvIGNvbnN0cnVjdCBhCi0gICAgPGVtPnNlbGYtcmVmZXJlbnRpYWw8L2VtPiBVUkwuIFRoYXQgaXMsIGEgVVJMIHdoaWNoIHJlZmVycyBiYWNrIHRvCi0gICAgdGhlIHNhbWUgc2VydmVyLiBXaXRoIDxjb2RlPlVzZUNhbm9uaWNhbE5hbWUgb248L2NvZGU+IEFwYWNoZSB3aWxsCi0gICAgdXNlIHRoZSBob3N0bmFtZSBhbmQgcG9ydCBzcGVjaWZpZWQgaW4gdGhlIDxkaXJlY3RpdmUKLSAgICBtb2R1bGU9ImNvcmUiPlNlcnZlck5hbWU8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIHRvIGNvbnN0cnVjdCBhIGNhbm9uaWNhbAotICAgIG5hbWUgZm9yIHRoZSBzZXJ2ZXIuIFRoaXMgbmFtZSBpcyB1c2VkIGluIGFsbCBzZWxmLXJlZmVyZW50aWFsCi0gICAgVVJMcywgYW5kIGZvciB0aGUgdmFsdWVzIG9mIDxjb2RlPlNFUlZFUl9OQU1FPC9jb2RlPiBhbmQKLSAgICA8Y29kZT5TRVJWRVJfUE9SVDwvY29kZT4gaW4gQ0dJcy48L3A+Ci0KLSAgICA8cD5XaXRoIDxjb2RlPlVzZUNhbm9uaWNhbE5hbWUgb2ZmPC9jb2RlPiBBcGFjaGUgd2lsbCBmb3JtCi0gICAgc2VsZi1yZWZlcmVudGlhbCBVUkxzIHVzaW5nIHRoZSBob3N0bmFtZSBhbmQgcG9ydCBzdXBwbGllZCBieQotICAgIHRoZSBjbGllbnQgaWYgYW55IGFyZSBzdXBwbGllZCAob3RoZXJ3aXNlIGl0IHdpbGwgdXNlIHRoZQotICAgIGNhbm9uaWNhbCBuYW1lKS4gVGhlc2UgdmFsdWVzIGFyZSB0aGUgc2FtZSB0aGF0IGFyZSB1c2VkIHRvCi0gICAgaW1wbGVtZW50IDxhIGhyZWY9Ii4uL3Zob3N0cy9uYW1lLWJhc2VkLmh0bWwiPm5hbWUgYmFzZWQKLSAgICB2aXJ0dWFsIGhvc3RzPC9hPiwgYW5kIGFyZSBhdmFpbGFibGUgd2l0aCB0aGUgc2FtZSBjbGllbnRzLiBUaGUKLSAgICBDR0kgdmFyaWFibGVzIDxjb2RlPlNFUlZFUl9OQU1FPC9jb2RlPiBhbmQKLSAgICA8Y29kZT5TRVJWRVJfUE9SVDwvY29kZT4gd2lsbCBiZSBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBjbGllbnQKLSAgICBzdXBwbGllZCB2YWx1ZXMgYXMgd2VsbC48L3A+Ci0KLSAgICA8cD5BbiBleGFtcGxlIHdoZXJlIHRoaXMgbWF5IGJlIHVzZWZ1bCBpcyBvbiBhbiBpbnRyYW5ldCBzZXJ2ZXIKLSAgICB3aGVyZSB5b3UgaGF2ZSB1c2VycyBjb25uZWN0aW5nIHRvIHRoZSBtYWNoaW5lIHVzaW5nIHNob3J0Ci0gICAgbmFtZXMgc3VjaCBhcyA8Y29kZT53d3c8L2NvZGU+LiBZb3UnbGwgbm90aWNlIHRoYXQgaWYgdGhlIHVzZXJzCi0gICAgdHlwZSBhIHNob3J0bmFtZSwgYW5kIGEgVVJMIHdoaWNoIGlzIGEgZGlyZWN0b3J5LCBzdWNoIGFzCi0gICAgPGNvZGU+aHR0cDovL3d3dy9zcGxhdDwvY29kZT4sIDxlbT53aXRob3V0IHRoZSB0cmFpbGluZwotICAgIHNsYXNoPC9lbT4gdGhlbiBBcGFjaGUgd2lsbCByZWRpcmVjdCB0aGVtIHRvCi0gICAgPGNvZGU+aHR0cDovL3d3dy5kb21haW4uY29tL3NwbGF0LzwvY29kZT4uIElmIHlvdSBoYXZlCi0gICAgYXV0aGVudGljYXRpb24gZW5hYmxlZCwgdGhpcyB3aWxsIGNhdXNlIHRoZSB1c2VyIHRvIGhhdmUgdG8KLSAgICByZWF1dGhlbnRpY2F0ZSB0d2ljZSAob25jZSBmb3IgPGNvZGU+d3d3PC9jb2RlPiBhbmQgb25jZSBhZ2FpbgotICAgIGZvciA8Y29kZT53d3cuZG9tYWluLmNvbTwvY29kZT4pLiBCdXQgaWYKLSAgICA8ZGlyZWN0aXZlPlVzZUNhbm9uaWNhbE5hbWU8L2RpcmVjdGl2ZT4gaXMgc2V0IG9mZiwgdGhlbiBBcGFjaGUgd2lsbAotICAgIHJlZGlyZWN0IHRvIDxjb2RlPmh0dHA6Ly93d3cvc3BsYXQvPC9jb2RlPi48L3A+Ci0KLSAgICA8cD5UaGVyZSBpcyBhIHRoaXJkIG9wdGlvbiwgPGNvZGU+VXNlQ2Fub25pY2FsTmFtZSBETlM8L2NvZGU+LAotICAgIHdoaWNoIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBtYXNzIElQLWJhc2VkIHZpcnR1YWwgaG9zdGluZyB0bwotICAgIHN1cHBvcnQgYW5jaWVudCBjbGllbnRzIHRoYXQgZG8gbm90IHByb3ZpZGUgYQotICAgIDxjb2RlPkhvc3Q6PC9jb2RlPiBoZWFkZXIuIFdpdGggdGhpcyBvcHRpb24gQXBhY2hlIGRvZXMgYQotICAgIHJldmVyc2UgRE5TIGxvb2t1cCBvbiB0aGUgc2VydmVyIElQIGFkZHJlc3MgdGhhdCB0aGUgY2xpZW50Ci0gICAgY29ubmVjdGVkIHRvIGluIG9yZGVyIHRvIHdvcmsgb3V0IHNlbGYtcmVmZXJlbnRpYWwgVVJMcy48L3A+Ci0KLSAgICA8cD48c3Ryb25nPldhcm5pbmc6PC9zdHJvbmc+IGlmIENHSXMgbWFrZSBhc3N1bXB0aW9ucyBhYm91dCB0aGUKLSAgICB2YWx1ZXMgb2YgPGNvZGU+U0VSVkVSX05BTUU8L2NvZGU+IHRoZXkgbWF5IGJlIGJyb2tlbiBieSB0aGlzCi0gICAgb3B0aW9uLiBUaGUgY2xpZW50IGlzIGVzc2VudGlhbGx5IGZyZWUgdG8gZ2l2ZSB3aGF0ZXZlciB2YWx1ZQotICAgIHRoZXkgd2FudCBhcyBhIGhvc3RuYW1lLiBCdXQgaWYgdGhlIENHSSBpcyBvbmx5IHVzaW5nCi0gICAgPGNvZGU+U0VSVkVSX05BTUU8L2NvZGU+IHRvIGNvbnN0cnVjdCBzZWxmLXJlZmVyZW50aWFsIFVSTHMKLSAgICB0aGVuIGl0IHNob3VsZCBiZSBqdXN0IGZpbmUuPC9wPgotPC91c2FnZT4KLTxzZWVhbHNvPjxkaXJlY3RpdmUgbW9kdWxlPSJjb3JlIj5TZXJ2ZXJOYW1lPC9kaXJlY3RpdmU+PC9zZWVhbHNvPgotPHNlZWFsc28+PGRpcmVjdGl2ZSBtb2R1bGU9Im1wbV9jb21tb24iPkxpc3RlbjwvZGlyZWN0aXZlPjwvc2VlYWxzbz4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcyB0eXBlPSJzZWN0aW9uIj4KLTxuYW1lPlZpcnR1YWxIb3N0PC9uYW1lPgotPGRlc2NyaXB0aW9uPkNvbnRhaW5zIGRpcmVjdGl2ZXMgdGhhdCBhcHBseSBvbmx5IHRvIGEgc3BlY2lmaWMKLWhvc3RuYW1lIG9yIElQIGFkZHJlc3M8L2Rlc2NyaXB0aW9uPiAgICAKLTxzeW50YXg+Jmx0O1ZpcnR1YWxIb3N0Ci0gICAgPGVtPmFkZHI8L2VtPls6PGVtPnBvcnQ8L2VtPl0gWzxlbT5hZGRyPC9lbT5bOjxlbT5wb3J0PC9lbT5dXQotICAgIC4uLiZndDsgLi4uICZsdDsvVmlydHVhbEhvc3QmZ3Q7PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+PGRpcmVjdGl2ZSB0eXBlPSJzZWN0aW9uIj5WaXJ0dWFsSG9zdDwvZGlyZWN0aXZlPiBhbmQKLSAgICA8Y29kZT4mbHQ7L1ZpcnR1YWxIb3N0Jmd0OzwvY29kZT4gYXJlIHVzZWQgdG8gZW5jbG9zZSBhIGdyb3VwIG9mCi0gICAgZGlyZWN0aXZlcyB3aGljaCB3aWxsIGFwcGx5IG9ubHkgdG8gYSBwYXJ0aWN1bGFyIHZpcnR1YWwgaG9zdC4gQW55Ci0gICAgZGlyZWN0aXZlIHdoaWNoIGlzIGFsbG93ZWQgaW4gYSB2aXJ0dWFsIGhvc3QgY29udGV4dCBtYXkgYmUKLSAgICB1c2VkLiBXaGVuIHRoZSBzZXJ2ZXIgcmVjZWl2ZXMgYSByZXF1ZXN0IGZvciBhIGRvY3VtZW50IG9uIGEKLSAgICBwYXJ0aWN1bGFyIHZpcnR1YWwgaG9zdCwgaXQgdXNlcyB0aGUgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzCi0gICAgZW5jbG9zZWQgaW4gdGhlIDxkaXJlY3RpdmUgdHlwZT0ic2VjdGlvbiI+VmlydHVhbEhvc3Q8L2RpcmVjdGl2ZT4KLSAgICBzZWN0aW9uLiA8ZW0+QWRkcjwvZW0+IGNhbiBiZTwvcD4KLQotICAgIDx1bD4KLSAgICAgIDxsaT5UaGUgSVAgYWRkcmVzcyBvZiB0aGUgdmlydHVhbCBob3N0PC9saT4KLQotICAgICAgPGxpPkEgZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lIGZvciB0aGUgSVAgYWRkcmVzcyBvZiB0aGUKLSAgICAgIHZpcnR1YWwgaG9zdC48L2xpPgotICAgIDwvdWw+Ci0gICAgRXhhbXBsZTogCi0KLTxleGFtcGxlPiZsdDtWaXJ0dWFsSG9zdCAxMC4xLjIuMyZndDs8YnIgLz4KLSAgICAgICBTZXJ2ZXJBZG1pbiB3ZWJtYXN0ZXJAaG9zdC5mb28uY29tPGJyIC8+Ci0gICAgICAgRG9jdW1lbnRSb290IC93d3cvZG9jcy9ob3N0LmZvby5jb208YnIgLz4KLSAgICAgICBTZXJ2ZXJOYW1lIGhvc3QuZm9vLmNvbTxiciAvPgotICAgICAgIEVycm9yTG9nIGxvZ3MvaG9zdC5mb28uY29tLWVycm9yX2xvZzxiciAvPgotICAgICAgIFRyYW5zZmVyTG9nIGxvZ3MvaG9zdC5mb28uY29tLWFjY2Vzc19sb2c8YnIgLz4KLSAgICAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotPC9leGFtcGxlPgotCi0gCi0gICAgIDxwPklQdjYgYWRkcmVzc2VzIG11c3QgYmUgc3BlY2lmaWVkIGluIHNxdWFyZSBicmFja2V0cyBiZWNhdXNlCi0gICAgIHRoZSBvcHRpb25hbCBwb3J0IG51bWJlciBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCBvdGhlcndpc2UuICBBbgotICAgICBJUHY2IGV4YW1wbGUgaXMgc2hvd24gYmVsb3c6PC9wPgotCi08ZXhhbXBsZT4gICAgIAotJmx0O1ZpcnR1YWxIb3N0IFtmZTgwOjphMDA6MjBmZjpmZWE3OmNjZWFdJmd0OzxiciAvPgotICAgICAgICBTZXJ2ZXJBZG1pbiB3ZWJtYXN0ZXJAaG9zdC5mb28uY29tPGJyIC8+Ci0gICAgICAgIERvY3VtZW50Um9vdCAvd3d3L2RvY3MvaG9zdC5mb28uY29tPGJyIC8+Ci0gICAgICAgIFNlcnZlck5hbWUgaG9zdC5mb28uY29tPGJyIC8+Ci0gICAgICAgRXJyb3JMb2cgbG9ncy9ob3N0LmZvby5jb20tZXJyb3JfbG9nPGJyIC8+Ci0gICAgICAgIFRyYW5zZmVyTG9nIGxvZ3MvaG9zdC5mb28uY29tLWFjY2Vzc19sb2c8YnIgLz4KLSAgICAgICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLTwvZXhhbXBsZT4gIAotCi0gICAgPHA+RWFjaCBWaXJ0dWFsIEhvc3QgbXVzdCBjb3JyZXNwb25kIHRvIGEgZGlmZmVyZW50IElQIGFkZHJlc3MsCi0gICAgZGlmZmVyZW50IHBvcnQgbnVtYmVyIG9yIGEgZGlmZmVyZW50IGhvc3QgbmFtZSBmb3IgdGhlIHNlcnZlciwKLSAgICBpbiB0aGUgZm9ybWVyIGNhc2UgdGhlIHNlcnZlciBtYWNoaW5lIG11c3QgYmUgY29uZmlndXJlZCB0bwotICAgIGFjY2VwdCBJUCBwYWNrZXRzIGZvciBtdWx0aXBsZSBhZGRyZXNzZXMuIChJZiB0aGUgbWFjaGluZSBkb2VzCi0gICAgbm90IGhhdmUgbXVsdGlwbGUgbmV0d29yayBpbnRlcmZhY2VzLCB0aGVuIHRoaXMgY2FuIGJlCi0gICAgYWNjb21wbGlzaGVkIHdpdGggdGhlIDxjb2RlPmlmY29uZmlnIGFsaWFzPC9jb2RlPiBjb21tYW5kIChpZgotICAgIHlvdXIgT1Mgc3VwcG9ydHMgaXQpLCBvciB3aXRoIGtlcm5lbCBwYXRjaGVzIGxpa2UgPGEKLSAgICBocmVmPSIuLi9taXNjL3ZpZi1pbmZvLmh0bWwiPlZJRjwvYT4gKGZvciBTdW5PUyhUTSkgNC4xLngpKS48L3A+Ci0KLSAgICA8cD5UaGUgc3BlY2lhbCBuYW1lIDxjb2RlPl9kZWZhdWx0XzwvY29kZT4gY2FuIGJlIHNwZWNpZmllZCBpbgotICAgIHdoaWNoIGNhc2UgdGhpcyB2aXJ0dWFsIGhvc3Qgd2lsbCBtYXRjaCBhbnkgSVAgYWRkcmVzcyB0aGF0IGlzCi0gICAgbm90IGV4cGxpY2l0bHkgbGlzdGVkIGluIGFub3RoZXIgdmlydHVhbCBob3N0LiBJbiB0aGUgYWJzZW5jZQotICAgIG9mIGFueSBfZGVmYXVsdF8gdmlydHVhbCBob3N0IHRoZSAibWFpbiIgc2VydmVyIGNvbmZpZywKLSAgICBjb25zaXN0aW5nIG9mIGFsbCB0aG9zZSBkZWZpbml0aW9ucyBvdXRzaWRlIGFueSBWaXJ0dWFsSG9zdAotICAgIHNlY3Rpb24sIGlzIHVzZWQgd2hlbiBubyBtYXRjaCBvY2N1cnMuPC9wPgotCi0gICAgPHA+WW91IGNhbiBzcGVjaWZ5IGEgPGNvZGU+OnBvcnQ8L2NvZGU+IHRvIGNoYW5nZSB0aGUgcG9ydCB0aGF0IGlzCi0gICAgbWF0Y2hlZC4gSWYgdW5zcGVjaWZpZWQgdGhlbiBpdCBkZWZhdWx0cyB0byB0aGUgc2FtZSBwb3J0IGFzIHRoZQotICAgIG1vc3QgcmVjZW50IDxkaXJlY3RpdmUgbW9kdWxlPSJtcG1fY29tbW9uIj5MaXN0ZW48L2RpcmVjdGl2ZT4KLSAgICBzdGF0ZW1lbnQgb2YgdGhlIG1haW4gc2VydmVyLiBZb3UgbWF5IGFsc28gc3BlY2lmeSA8Y29kZT46KjwvY29kZT4KLSAgICB0byBtYXRjaCBhbGwgcG9ydHMgb24gdGhhdCBhZGRyZXNzLiAoVGhpcyBpcyByZWNvbW1lbmRlZCB3aGVuIHVzZWQKLSAgICB3aXRoIDxjb2RlPl9kZWZhdWx0XzwvY29kZT4uKTwvcD4KLQotICAgIDxwPjxzdHJvbmc+U0VDVVJJVFk8L3N0cm9uZz46IFNlZSB0aGUgPGEKLSAgICBocmVmPSIuLi9taXNjL3NlY3VyaXR5X3RpcHMuaHRtbCI+c2VjdXJpdHkgdGlwczwvYT4gZG9jdW1lbnQKLSAgICBmb3IgZGV0YWlscyBvbiB3aHkgeW91ciBzZWN1cml0eSBjb3VsZCBiZSBjb21wcm9taXNlZCBpZiB0aGUKLSAgICBkaXJlY3Rvcnkgd2hlcmUgbG9nZmlsZXMgYXJlIHN0b3JlZCBpcyB3cml0YWJsZSBieSBhbnlvbmUgb3RoZXIKLSAgICB0aGFuIHRoZSB1c2VyIHRoYXQgc3RhcnRzIHRoZSBzZXJ2ZXIuPC9wPgotCi0gICAgPHA+PHN0cm9uZz5OT1RFPC9zdHJvbmc+OiBUaGUgdXNlIG9mIDxkaXJlY3RpdmUKLSAgICB0eXBlPSJzZWN0aW9uIj5WaXJ0dWFsSG9zdDwvZGlyZWN0aXZlPiBkb2VzIDxzdHJvbmc+bm90PC9zdHJvbmc+Ci0gICAgYWZmZWN0IHdoYXQgYWRkcmVzc2VzIEFwYWNoZSBsaXN0ZW5zIG9uLiAgWW91IG1heSBuZWVkIHRvIGVuc3VyZQotICAgIHRoYXQgQXBhY2hlIGlzIGxpc3RlbmluZyBvbiB0aGUgY29ycmVjdCBhZGRyZXNzZXMgdXNpbmcgPGRpcmVjdGl2ZQotICAgIG1vZHVsZT0ibXBtX2NvbW1vbiI+TGlzdGVuPC9kaXJlY3RpdmU+LjwvcD4KLTwvdXNhZ2U+Ci08c2VlYWxzbz48YSBocmVmPSIuLi92aG9zdHMvIj5BcGFjaGUgVmlydHVhbCBIb3N0IGRvY3VtZW50YXRpb248L2E+PC9zZWVhbHNvPgotPHNlZWFsc28+PGEgaHJlZj0iLi4vZG5zLWNhdmVhdHMuaHRtbCI+V2FybmluZ3MgYWJvdXQgRE5TIGFuZAotICAgIEFwYWNoZTwvYT48L3NlZWFsc28+Ci08c2VlYWxzbz48YSBocmVmPSIuLi9iaW5kLmh0bWwiPlNldHRpbmcKLSAgICB3aGljaCBhZGRyZXNzZXMgYW5kIHBvcnRzIEFwYWNoZSB1c2VzPC9hPjwvc2VlYWxzbz4KLTxzZWVhbHNvPjxhIGhyZWY9Ii4uL3NlY3Rpb25zLmh0bWwiPkhvdwotICAgIERpcmVjdG9yeSwgTG9jYXRpb24gYW5kIEZpbGVzIHNlY3Rpb25zIHdvcms8L2E+IGZvciBhbgotICAgIGV4cGxhbmF0aW9uIG9mIGhvdyB0aGVzZSBkaWZmZXJlbnQgc2VjdGlvbnMgYXJlIGNvbWJpbmVkIHdoZW4gYQotICAgIHJlcXVlc3QgaXMgcmVjZWl2ZWQ8L3NlZWFsc28+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08L21vZHVsZXN5bm9wc2lzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9kaXJlY3RpdmUtZGljdC5odG1sIGIvZG9jcy9tYW51YWwvbW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MGFjM2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+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+IGNvbnRhaW5lcnMgaW4gdGhlIHNlcnZlcgotICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0gICAgPFA+Ci0gICAgPC9QPgotICAgPC9ERD4KLSAgIDxEVD48U1RST05HPi5odGFjY2VzczwvU1RST05HPgotICAgPC9EVD4KLSAgIDxERD5JZiBhIGRpcmVjdGl2ZSBpcyB2YWxpZCBpbiB0aGlzIGNvbnRleHQsIGl0IG1lYW5zIHRoYXQgaXQgY2FuCi0gICAgYXBwZWFyIGluc2lkZSA8RU0+cGVyPC9FTT4tZGlyZWN0b3J5IDxTQU1QPi5odGFjY2VzczwvU0FNUD4gZmlsZXMuCi0gICAgSXQgbWF5IG5vdCBiZSBwcm9jZXNzZWQsIHRob3VnaCBkZXBlbmRpbmcgdXBvbiB0aGUKLSAgICA8QQotICAgICBIUkVGPSIjT3ZlcnJpZGUiCi0gICAgIFJFTD0iSGVscCIKLSAgICA+b3ZlcnJpZGVzPC9BPgotICAgIGN1cnJlbnRseSBhY3RpdmUuCi0gICAgPFA+Ci0gICAgPC9QPgotICAgPC9ERD4KLSAgPC9ETD4KLSAgPFA+Ci0gIFRoZSBkaXJlY3RpdmUgaXMgPEVNPm9ubHk8L0VNPiBhbGxvd2VkIHdpdGhpbiB0aGUgZGVzaWduYXRlZCBjb250ZXh0OwotICBpZiB5b3UgdHJ5IHRvIHVzZSBpdCBlbHNld2hlcmUsIHlvdSdsbCBnZXQgYSBjb25maWd1cmF0aW9uIGVycm9yIHRoYXQKLSAgd2lsbCBlaXRoZXIgcHJldmVudCB0aGUgc2VydmVyIGZyb20gaGFuZGxpbmcgcmVxdWVzdHMgaW4gdGhhdCBjb250ZXh0Ci0gIGNvcnJlY3RseSwgb3Igd2lsbCBrZWVwIHRoZSBzZXJ2ZXIgZnJvbSBvcGVyYXRpbmcgYXQgYWxsIC0tCi0gIDxFTT5pLmUuPC9FTT4sIHRoZSBzZXJ2ZXIgd29uJ3QgZXZlbiBzdGFydC4KLSAgPC9QPgotICA8UD4KLSAgVGhlIHZhbGlkIGxvY2F0aW9ucyBmb3IgdGhlIGRpcmVjdGl2ZSBhcmUgYWN0dWFsbHkgdGhlIHJlc3VsdCBvZiBhCi0gIEJvb2xlYW4gT1Igb2YgYWxsIG9mIHRoZSBsaXN0ZWQgY29udGV4dHMuICBJbiBvdGhlciB3b3JkcywgYSBkaXJlY3RpdmUKLSAgdGhhdCBpcyBtYXJrZWQgYXMgYmVpbmcgdmFsaWQgaW4gJnF1b3Q7PFNBTVA+c2VydmVyIGNvbmZpZywKLSAgLmh0YWNjZXNzPC9TQU1QPiZxdW90OyBjYW4gYmUgdXNlZCBpbiB0aGUgPFNBTVA+aHR0cGQuY29uZjwvU0FNUD4gZmlsZQotICBhbmQgaW4gPFNBTVA+Lmh0YWNjZXNzPC9TQU1QPiBmaWxlcywgYnV0IG5vdCB3aXRoaW4gYW55Ci0gICZsdDtEaXJlY3RvcnkmZ3Q7IG9yICZsdDtWaXJ0dWFsSG9zdCZndDsgY29udGFpbmVycy4KLSAgPC9QPgotCi0gIDxIUj4KLSAgPEgyPjxBIE5BTUU9Ik92ZXJyaWRlIj5PdmVycmlkZTwvQT48L0gyPgotICA8UD4KLSAgVGhpcyBkaXJlY3RpdmUgYXR0cmlidXRlIGluZGljYXRlcyB3aGljaCBjb25maWd1cmF0aW9uIG92ZXJyaWRlIG11c3QKLSAgYmUgYWN0aXZlIGluIG9yZGVyIGZvciB0aGUgZGlyZWN0aXZlIHRvIGJlIHByb2Nlc3NlZCB3aGVuIGl0IGFwcGVhcnMKLSAgaW4gYSA8U0FNUD4uaHRhY2Nlc3M8L1NBTVA+IGZpbGUuICBJZiB0aGUgZGlyZWN0aXZlJ3MKLSAgPEEKLSAgIEhSRUY9IiNDb250ZXh0IgotICAgUkVMPSJIZWxwIgotICA+Y29udGV4dDwvQT4KLSAgZG9lc24ndCBwZXJtaXQgaXQgdG8gYXBwZWFyIGluIDxTQU1QPi5odGFjY2VzczwvU0FNUD4gZmlsZXMsIHRoaXMKLSAgYXR0cmlidXRlIHNob3VsZCBzYXkgJnF1b3Q7PEVNPk5vdCBhcHBsaWNhYmxlPC9FTT4mcXVvdDsuCi0gIDwvUD4KLSAgPFA+Ci0gIE92ZXJyaWRlcyBhcmUgYWN0aXZhdGVkIGJ5IHRoZQotICA8QQotICAgSFJFRj0iY29yZS5odG1sI2FsbG93b3ZlcnJpZGVzIgotICAgUkVMPSJIZWxwIgotICA+PFNBTVA+QWxsb3dPdmVycmlkZXM8L1NBTVA+PC9BPgotICBkaXJlY3RpdmUsIGFuZCBhcHBseSB0byBhIHBhcnRpY3VsYXIgc2NvcGUgKHN1Y2ggYXMgYSBkaXJlY3RvcnkpIGFuZAotICBhbGwgZGVzY2VuZGFudHMsIHVubGVzcyBmdXJ0aGVyIG1vZGlmaWVkIGJ5IG90aGVyCi0gIDxTQU1QPkFsbG93T3ZlcnJpZGVzPC9TQU1QPiBkaXJlY3RpdmVzIGF0IGxvd2VyIGxldmVscy4gIFRoZQotICBkb2N1bWVudGF0aW9uIGZvciB0aGF0IGRpcmVjdGl2ZSBhbHNvIGxpc3RzIHRoZSBwb3NzaWJsZSBvdmVycmlkZQotICBuYW1lcyBhdmFpbGFibGUuCi0gIDwvUD4KLQotICA8SFI+Ci0gIDxIMj48QSBOQU1FPSJTdGF0dXMiPlN0YXR1czwvQT48L0gyPgotICA8UD4KLSAgVGhpcyBpbmRpY2F0ZXMgaG93IHRpZ2h0bHkgYm91bmQgaW50byB0aGUgQXBhY2hlIFdlYiBzZXJ2ZXIgdGhlCi0gIGRpcmVjdGl2ZSBpczsgaW4gb3RoZXIgd29yZHMsIHlvdSBtYXkgbmVlZCB0byByZWNvbXBpbGUgdGhlIHNlcnZlcgotICB3aXRoIGFuIGVuaGFuY2VkIHNldCBvZiBtb2R1bGVzIGluIG9yZGVyIHRvIGdhaW4gYWNjZXNzIHRvIHRoZQotICBkaXJlY3RpdmUgYW5kIGl0cyBmdW5jdGlvbmFsaXR5LiAgUG9zc2libGUgdmFsdWVzIGZvciB0aGlzIGF0dHJpYnV0ZQotICBhcmU6Ci0gIDwvUD4KLSAgPERMPgotICAgPERUPjxTVFJPTkc+Q29yZTwvU1RST05HPgotICAgPC9EVD4KLSAgIDxERD5JZiBhIGRpcmVjdGl2ZSBpcyBsaXN0ZWQgYXMgaGF2aW5nICZxdW90O0NvcmUmcXVvdDsgc3RhdHVzLCB0aGF0Ci0gICAgbWVhbnMgaXQgaXMgcGFydCBvZiB0aGUgaW5uZXJtb3N0IHBvcnRpb25zIG9mIHRoZSBBcGFjaGUgV2ViIHNlcnZlciwKLSAgICBhbmQgaXMgYWx3YXlzIGF2YWlsYWJsZS4KLSAgICA8UD4KLSAgICA8L1A+Ci0gICA8L0REPgotICAgPERUPjxTVFJPTkc+QmFzZTwvU1RST05HPgotICAgPC9EVD4KLSAgIDxERD5BIGRpcmVjdGl2ZSBsYWJlbGVkIGFzIGhhdmluZyAmcXVvdDtCYXNlJnF1b3Q7IHN0YXR1cyBpcwotICAgIHN1cHBvcnRlZCBieSBvbmUgb2YgdGhlIHN0YW5kYXJkIEFwYWNoZSBtb2R1bGVzIHdoaWNoIGlzIGNvbXBpbGVkCi0gICAgaW50byB0aGUgc2VydmVyIGJ5IGRlZmF1bHQsIGFuZCBpcyB0aGVyZWZvcmUgbm9ybWFsbHkgYXZhaWxhYmxlCi0gICAgdW5sZXNzIHlvdSd2ZSB0YWtlbiBzdGVwcyB0byByZW1vdmUgdGhlIG1vZHVsZSBmcm9tIHlvdXIgY29uZmlndXJhdGlvbi4KLSAgICA8UD4KLSAgICA8L1A+Ci0gICA8L0REPgotICAgPERUPjxTVFJPTkc+RXh0ZW5zaW9uPC9TVFJPTkc+Ci0gICA8L0RUPgotICAgPEREPkEgZGlyZWN0aXZlIHdpdGggJnF1b3Q7RXh0ZW5zaW9uJnF1b3Q7IHN0YXR1cyBpcyBwcm92aWRlZCBieSBvbmUKLSAgICBvZiB0aGUgbW9kdWxlcyBpbmNsdWRlZCB3aXRoIHRoZSBBcGFjaGUgc2VydmVyIGtpdCwgYnV0IHRoZSBtb2R1bGUKLSAgICBpc24ndCBub3JtYWxseSBjb21waWxlZCBpbnRvIHRoZSBzZXJ2ZXIuICBUbyBlbmFibGUgdGhlIGRpcmVjdGl2ZQotICAgIGFuZCBpdHMgZnVuY3Rpb25hbGl0eSwgeW91IHdpbGwgbmVlZCB0byBjaGFuZ2UgdGhlIHNlcnZlciBidWlsZAotICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMgYW5kIHJlLWNvbXBpbGUgQXBhY2hlLgotICAgIDxQPgotICAgIDwvUD4KLSAgIDwvREQ+Ci0gICA8RFQ+PFNUUk9ORz5FeHBlcmltZW50YWw8L1NUUk9ORz4KLSAgIDwvRFQ+Ci0gICA8REQ+JnF1b3Q7RXhwZXJpbWVudGFsJnF1b3Q7IHN0YXR1cyBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlyZWN0aXZlIGlzCi0gICAgYXZhaWxhYmxlIGFzIHBhcnQgb2YgdGhlIEFwYWNoZSBraXQsIGJ1dCB5b3UncmUgb24geW91ciBvd24gaWYgeW91Ci0gICAgdHJ5IHRvIHVzZSBpdC4gIFRoZSBkaXJlY3RpdmUgaXMgYmVpbmcgZG9jdW1lbnRlZCBmb3IgY29tcGxldGVuZXNzLAotICAgIGFuZCBpcyBub3QgbmVjZXNzYXJpbHkgc3VwcG9ydGVkLiAgVGhlIG1vZHVsZSB3aGljaCBwcm92aWRlcyB0aGUKLSAgICBkaXJlY3RpdmUgbWF5IG9yIG1heSBub3QgYmUgY29tcGlsZWQgaW4gYnkgZGVmYXVsdDsgY2hlY2sgdGhlIHRvcCBvZgotICAgIHRoZSBwYWdlIHdoaWNoIGRlc2NyaWJlcyB0aGUgZGlyZWN0aXZlIGFuZCBpdHMgbW9kdWxlIHRvIHNlZSBpZiBpdAotICAgIHJlbWFya3Mgb24gdGhlIGF2YWlsYWJpbGl0eS4KLSAgICA8UD4KLSAgICA8L1A+Ci0gICA8L0REPgotICA8L0RMPgotCi0gIDxIUj4KLSAgPEgyPjxBIE5BTUU9Ik1vZHVsZSI+TW9kdWxlPC9BPjwvSDI+Ci0gIDxQPgotICBUaGlzIHF1aXRlIHNpbXBseSBsaXN0cyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIG1vZHVsZSB3aGljaCBkZWZpbmVzCi0gIHRoZSBkaXJlY3RpdmUuCi0gIDwvUD4KLQotICA8SFI+Ci0gIDxIMj48QSBOQU1FPSJDb21wYXRpYmlsaXR5Ij5Db21wYXRpYmlsaXR5PC9BPjwvSDI+Ci0gIDxQPgotICBJZiB0aGUgZGlyZWN0aXZlIHdhc24ndCBwYXJ0IG9mIHRoZSBvcmlnaW5hbCBBcGFjaGUgdmVyc2lvbiAxCi0gIGRpc3RyaWJ1dGlvbiwgdGhlIHZlcnNpb24gaW4gd2hpY2ggaXQgd2FzIGludHJvZHVjZWQgc2hvdWxkIGJlIGxpc3RlZAotICBoZXJlLiAgSWYgdGhlIGRpcmVjdGl2ZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyBvbmUgZnJvbSB0aGUgTkNTQSBIVFRQZAotICBzZXJ2ZXIsIGFueSBpbmNvbnNpc3RlbmNpZXMgaW4gYmVoYXZpb3VyIGJldHdlZW4gdGhlIHR3byBzaG91bGQgYWxzbwotICBiZSBtZW50aW9uZWQuICBPdGhlcndpc2UsIHRoaXMgYXR0cmlidXRlIHNob3VsZCBzYXkgJnF1b3Q7PEVNPk5vCi0gIGNvbXBhdGliaWxpdHkgaXNzdWVzLjwvRU0+JnF1b3Q7Ci0gIDwvUD4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci0gPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwuZW4gYi9kb2NzL21hbnVhbC9tb2QvZGlyZWN0aXZlLWRpY3QuaHRtbC5lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwYWMzYS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvZGlyZWN0aXZlLWRpY3QuaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+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+QSBkaXJlY3RpdmUgbWFya2VkIGFzIGJlaW5nIHZhbGlkIGluIHRoaXMgY29udGV4dCBtYXkgYmUgdXNlZAotICAgIGluc2lkZSA8U0FNUD4mbHQ7RGlyZWN0b3J5Jmd0OzwvU0FNUD4gY29udGFpbmVycyBpbiB0aGUgc2VydmVyCi0gICAgY29uZmlndXJhdGlvbiBmaWxlcy4KLSAgICA8UD4KLSAgICA8L1A+Ci0gICA8L0REPgotICAgPERUPjxTVFJPTkc+Lmh0YWNjZXNzPC9TVFJPTkc+Ci0gICA8L0RUPgotICAgPEREPklmIGEgZGlyZWN0aXZlIGlzIHZhbGlkIGluIHRoaXMgY29udGV4dCwgaXQgbWVhbnMgdGhhdCBpdCBjYW4KLSAgICBhcHBlYXIgaW5zaWRlIDxFTT5wZXI8L0VNPi1kaXJlY3RvcnkgPFNBTVA+Lmh0YWNjZXNzPC9TQU1QPiBmaWxlcy4KLSAgICBJdCBtYXkgbm90IGJlIHByb2Nlc3NlZCwgdGhvdWdoIGRlcGVuZGluZyB1cG9uIHRoZQotICAgIDxBCi0gICAgIEhSRUY9IiNPdmVycmlkZSIKLSAgICAgUkVMPSJIZWxwIgotICAgID5vdmVycmlkZXM8L0E+Ci0gICAgY3VycmVudGx5IGFjdGl2ZS4KLSAgICA8UD4KLSAgICA8L1A+Ci0gICA8L0REPgotICA8L0RMPgotICA8UD4KLSAgVGhlIGRpcmVjdGl2ZSBpcyA8RU0+b25seTwvRU0+IGFsbG93ZWQgd2l0aGluIHRoZSBkZXNpZ25hdGVkIGNvbnRleHQ7Ci0gIGlmIHlvdSB0cnkgdG8gdXNlIGl0IGVsc2V3aGVyZSwgeW91J2xsIGdldCBhIGNvbmZpZ3VyYXRpb24gZXJyb3IgdGhhdAotICB3aWxsIGVpdGhlciBwcmV2ZW50IHRoZSBzZXJ2ZXIgZnJvbSBoYW5kbGluZyByZXF1ZXN0cyBpbiB0aGF0IGNvbnRleHQKLSAgY29ycmVjdGx5LCBvciB3aWxsIGtlZXAgdGhlIHNlcnZlciBmcm9tIG9wZXJhdGluZyBhdCBhbGwgLS0KLSAgPEVNPmkuZS48L0VNPiwgdGhlIHNlcnZlciB3b24ndCBldmVuIHN0YXJ0LgotICA8L1A+Ci0gIDxQPgotICBUaGUgdmFsaWQgbG9jYXRpb25zIGZvciB0aGUgZGlyZWN0aXZlIGFyZSBhY3R1YWxseSB0aGUgcmVzdWx0IG9mIGEKLSAgQm9vbGVhbiBPUiBvZiBhbGwgb2YgdGhlIGxpc3RlZCBjb250ZXh0cy4gIEluIG90aGVyIHdvcmRzLCBhIGRpcmVjdGl2ZQotICB0aGF0IGlzIG1hcmtlZCBhcyBiZWluZyB2YWxpZCBpbiAmcXVvdDs8U0FNUD5zZXJ2ZXIgY29uZmlnLAotICAuaHRhY2Nlc3M8L1NBTVA+JnF1b3Q7IGNhbiBiZSB1c2VkIGluIHRoZSA8U0FNUD5odHRwZC5jb25mPC9TQU1QPiBmaWxlCi0gIGFuZCBpbiA8U0FNUD4uaHRhY2Nlc3M8L1NBTVA+IGZpbGVzLCBidXQgbm90IHdpdGhpbiBhbnkKLSAgJmx0O0RpcmVjdG9yeSZndDsgb3IgJmx0O1ZpcnR1YWxIb3N0Jmd0OyBjb250YWluZXJzLgotICA8L1A+Ci0KLSAgPEhSPgotICA8SDI+PEEgTkFNRT0iT3ZlcnJpZGUiPk92ZXJyaWRlPC9BPjwvSDI+Ci0gIDxQPgotICBUaGlzIGRpcmVjdGl2ZSBhdHRyaWJ1dGUgaW5kaWNhdGVzIHdoaWNoIGNvbmZpZ3VyYXRpb24gb3ZlcnJpZGUgbXVzdAotICBiZSBhY3RpdmUgaW4gb3JkZXIgZm9yIHRoZSBkaXJlY3RpdmUgdG8gYmUgcHJvY2Vzc2VkIHdoZW4gaXQgYXBwZWFycwotICBpbiBhIDxTQU1QPi5odGFjY2VzczwvU0FNUD4gZmlsZS4gIElmIHRoZSBkaXJlY3RpdmUncwotICA8QQotICAgSFJFRj0iI0NvbnRleHQiCi0gICBSRUw9IkhlbHAiCi0gID5jb250ZXh0PC9BPgotICBkb2Vzbid0IHBlcm1pdCBpdCB0byBhcHBlYXIgaW4gPFNBTVA+Lmh0YWNjZXNzPC9TQU1QPiBmaWxlcywgdGhpcwotICBhdHRyaWJ1dGUgc2hvdWxkIHNheSAmcXVvdDs8RU0+Tm90IGFwcGxpY2FibGU8L0VNPiZxdW90Oy4KLSAgPC9QPgotICA8UD4KLSAgT3ZlcnJpZGVzIGFyZSBhY3RpdmF0ZWQgYnkgdGhlCi0gIDxBCi0gICBIUkVGPSJjb3JlLmh0bWwjYWxsb3dvdmVycmlkZXMiCi0gICBSRUw9IkhlbHAiCi0gID48U0FNUD5BbGxvd092ZXJyaWRlczwvU0FNUD48L0E+Ci0gIGRpcmVjdGl2ZSwgYW5kIGFwcGx5IHRvIGEgcGFydGljdWxhciBzY29wZSAoc3VjaCBhcyBhIGRpcmVjdG9yeSkgYW5kCi0gIGFsbCBkZXNjZW5kYW50cywgdW5sZXNzIGZ1cnRoZXIgbW9kaWZpZWQgYnkgb3RoZXIKLSAgPFNBTVA+QWxsb3dPdmVycmlkZXM8L1NBTVA+IGRpcmVjdGl2ZXMgYXQgbG93ZXIgbGV2ZWxzLiAgVGhlCi0gIGRvY3VtZW50YXRpb24gZm9yIHRoYXQgZGlyZWN0aXZlIGFsc28gbGlzdHMgdGhlIHBvc3NpYmxlIG92ZXJyaWRlCi0gIG5hbWVzIGF2YWlsYWJsZS4KLSAgPC9QPgotCi0gIDxIUj4KLSAgPEgyPjxBIE5BTUU9IlN0YXR1cyI+U3RhdHVzPC9BPjwvSDI+Ci0gIDxQPgotICBUaGlzIGluZGljYXRlcyBob3cgdGlnaHRseSBib3VuZCBpbnRvIHRoZSBBcGFjaGUgV2ViIHNlcnZlciB0aGUKLSAgZGlyZWN0aXZlIGlzOyBpbiBvdGhlciB3b3JkcywgeW91IG1heSBuZWVkIHRvIHJlY29tcGlsZSB0aGUgc2VydmVyCi0gIHdpdGggYW4gZW5oYW5jZWQgc2V0IG9mIG1vZHVsZXMgaW4gb3JkZXIgdG8gZ2FpbiBhY2Nlc3MgdG8gdGhlCi0gIGRpcmVjdGl2ZSBhbmQgaXRzIGZ1bmN0aW9uYWxpdHkuICBQb3NzaWJsZSB2YWx1ZXMgZm9yIHRoaXMgYXR0cmlidXRlCi0gIGFyZToKLSAgPC9QPgotICA8REw+Ci0gICA8RFQ+PFNUUk9ORz5Db3JlPC9TVFJPTkc+Ci0gICA8L0RUPgotICAgPEREPklmIGEgZGlyZWN0aXZlIGlzIGxpc3RlZCBhcyBoYXZpbmcgJnF1b3Q7Q29yZSZxdW90OyBzdGF0dXMsIHRoYXQKLSAgICBtZWFucyBpdCBpcyBwYXJ0IG9mIHRoZSBpbm5lcm1vc3QgcG9ydGlvbnMgb2YgdGhlIEFwYWNoZSBXZWIgc2VydmVyLAotICAgIGFuZCBpcyBhbHdheXMgYXZhaWxhYmxlLgotICAgIDxQPgotICAgIDwvUD4KLSAgIDwvREQ+Ci0gICA8RFQ+PFNUUk9ORz5CYXNlPC9TVFJPTkc+Ci0gICA8L0RUPgotICAgPEREPkEgZGlyZWN0aXZlIGxhYmVsZWQgYXMgaGF2aW5nICZxdW90O0Jhc2UmcXVvdDsgc3RhdHVzIGlzCi0gICAgc3VwcG9ydGVkIGJ5IG9uZSBvZiB0aGUgc3RhbmRhcmQgQXBhY2hlIG1vZHVsZXMgd2hpY2ggaXMgY29tcGlsZWQKLSAgICBpbnRvIHRoZSBzZXJ2ZXIgYnkgZGVmYXVsdCwgYW5kIGlzIHRoZXJlZm9yZSBub3JtYWxseSBhdmFpbGFibGUKLSAgICB1bmxlc3MgeW91J3ZlIHRha2VuIHN0ZXBzIHRvIHJlbW92ZSB0aGUgbW9kdWxlIGZyb20geW91ciBjb25maWd1cmF0aW9uLgotICAgIDxQPgotICAgIDwvUD4KLSAgIDwvREQ+Ci0gICA8RFQ+PFNUUk9ORz5FeHRlbnNpb248L1NUUk9ORz4KLSAgIDwvRFQ+Ci0gICA8REQ+QSBkaXJlY3RpdmUgd2l0aCAmcXVvdDtFeHRlbnNpb24mcXVvdDsgc3RhdHVzIGlzIHByb3ZpZGVkIGJ5IG9uZQotICAgIG9mIHRoZSBtb2R1bGVzIGluY2x1ZGVkIHdpdGggdGhlIEFwYWNoZSBzZXJ2ZXIga2l0LCBidXQgdGhlIG1vZHVsZQotICAgIGlzbid0IG5vcm1hbGx5IGNvbXBpbGVkIGludG8gdGhlIHNlcnZlci4gIFRvIGVuYWJsZSB0aGUgZGlyZWN0aXZlCi0gICAgYW5kIGl0cyBmdW5jdGlvbmFsaXR5LCB5b3Ugd2lsbCBuZWVkIHRvIGNoYW5nZSB0aGUgc2VydmVyIGJ1aWxkCi0gICAgY29uZmlndXJhdGlvbiBmaWxlcyBhbmQgcmUtY29tcGlsZSBBcGFjaGUuCi0gICAgPFA+Ci0gICAgPC9QPgotICAgPC9ERD4KLSAgIDxEVD48U1RST05HPkV4cGVyaW1lbnRhbDwvU1RST05HPgotICAgPC9EVD4KLSAgIDxERD4mcXVvdDtFeHBlcmltZW50YWwmcXVvdDsgc3RhdHVzIGluZGljYXRlcyB0aGF0IHRoZSBkaXJlY3RpdmUgaXMKLSAgICBhdmFpbGFibGUgYXMgcGFydCBvZiB0aGUgQXBhY2hlIGtpdCwgYnV0IHlvdSdyZSBvbiB5b3VyIG93biBpZiB5b3UKLSAgICB0cnkgdG8gdXNlIGl0LiAgVGhlIGRpcmVjdGl2ZSBpcyBiZWluZyBkb2N1bWVudGVkIGZvciBjb21wbGV0ZW5lc3MsCi0gICAgYW5kIGlzIG5vdCBuZWNlc3NhcmlseSBzdXBwb3J0ZWQuICBUaGUgbW9kdWxlIHdoaWNoIHByb3ZpZGVzIHRoZQotICAgIGRpcmVjdGl2ZSBtYXkgb3IgbWF5IG5vdCBiZSBjb21waWxlZCBpbiBieSBkZWZhdWx0OyBjaGVjayB0aGUgdG9wIG9mCi0gICAgdGhlIHBhZ2Ugd2hpY2ggZGVzY3JpYmVzIHRoZSBkaXJlY3RpdmUgYW5kIGl0cyBtb2R1bGUgdG8gc2VlIGlmIGl0Ci0gICAgcmVtYXJrcyBvbiB0aGUgYXZhaWxhYmlsaXR5LgotICAgIDxQPgotICAgIDwvUD4KLSAgIDwvREQ+Ci0gIDwvREw+Ci0KLSAgPEhSPgotICA8SDI+PEEgTkFNRT0iTW9kdWxlIj5Nb2R1bGU8L0E+PC9IMj4KLSAgPFA+Ci0gIFRoaXMgcXVpdGUgc2ltcGx5IGxpc3RzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgbW9kdWxlIHdoaWNoIGRlZmluZXMKLSAgdGhlIGRpcmVjdGl2ZS4KLSAgPC9QPgotCi0gIDxIUj4KLSAgPEgyPjxBIE5BTUU9IkNvbXBhdGliaWxpdHkiPkNvbXBhdGliaWxpdHk8L0E+PC9IMj4KLSAgPFA+Ci0gIElmIHRoZSBkaXJlY3RpdmUgd2Fzbid0IHBhcnQgb2YgdGhlIG9yaWdpbmFsIEFwYWNoZSB2ZXJzaW9uIDEKLSAgZGlzdHJpYnV0aW9uLCB0aGUgdmVyc2lvbiBpbiB3aGljaCBpdCB3YXMgaW50cm9kdWNlZCBzaG91bGQgYmUgbGlzdGVkCi0gIGhlcmUuICBJZiB0aGUgZGlyZWN0aXZlIGhhcyB0aGUgc2FtZSBuYW1lIGFzIG9uZSBmcm9tIHRoZSBOQ1NBIEhUVFBkCi0gIHNlcnZlciwgYW55IGluY29uc2lzdGVuY2llcyBpbiBiZWhhdmlvdXIgYmV0d2VlbiB0aGUgdHdvIHNob3VsZCBhbHNvCi0gIGJlIG1lbnRpb25lZC4gIE90aGVyd2lzZSwgdGhpcyBhdHRyaWJ1dGUgc2hvdWxkIHNheSAmcXVvdDs8RU0+Tm8KLSAgY29tcGF0aWJpbGl0eSBpc3N1ZXMuPC9FTT4mcXVvdDsKLSAgPC9QPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLSA8L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvZGlyZWN0aXZlcy5odG1sIGIvZG9jcy9tYW51YWwvbW9kL2RpcmVjdGl2ZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U1NTA4OS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvZGlyZWN0aXZlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgMi4wLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFwYWNoZSBkaXJlY3RpdmVzPC9USVRMRT4KLTwvSEVBRD4KLQotPEJPRFk+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxPkFwYWNoZSBkaXJlY3RpdmVzPC9IMT4KLQotPHVsPgotPGxpPjxBIEhSRUY9ImNvcmUuaHRtbCNhY2Nlc3Njb25maWciPkFjY2Vzc0NvbmZpZzwvQT4KLTxsaT48QSBIUkVGPSJjb3JlLmh0bWwjYWNjZXNzZmlsZW5hbWUiPkFjY2Vzc0ZpbGVOYW1lPC9BPgotPGxpPjxBIEhSRUY9Im1vZF9hY3Rpb25zLmh0bWwjYWN0aW9uIj5BY3Rpb248L0E+Ci08bGk+PEEgSFJFRj0ibW9kX2Rpci5odG1sI2FkZGRlc2NyaXB0aW9uIj5BZGREZXNjcmlwdGlvbjwvQT4KLTxsaT48QSBIUkVGPSJtb2RfbWltZS5odG1sI2FkZGVuY29kaW5nIj5BZGRFbmNvZGluZzwvQT4KLTxsaT48QSBIUkVGPSJtb2RfbWltZS5odG1sI2FkZGhhbmRsZXIiPkFkZEhhbmRsZXI8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX2Rpci5odG1sI2FkZGljb24iPkFkZEljb248L0E+Ci08bGk+PEEgSFJFRj0ibW9kX2Rpci5odG1sI2FkZGljb25ieWVuY29kaW5nIj5BZGRJY29uQnlFbmNvZGluZzwvQT4KLTxsaT48QSBIUkVGPSJtb2RfZGlyLmh0bWwjYWRkaWNvbmJ5dHlwZSI+QWRkSWNvbkJ5VHlwZTwvQT4KLTxsaT48QSBIUkVGPSJtb2RfbWltZS5odG1sI2FkZGxhbmd1YWdlIj5BZGRMYW5ndWFnZTwvQT4KLTxsaT48QSBIUkVGPSJtb2RfbWltZS5odG1sI2FkZHR5cGUiPkFkZFR5cGU8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX2FsaWFzLmh0bWwjYWxpYXMiPkFsaWFzPC9BPgotPGxpPjxBIEhSRUY9Im1vZF9sb2dfYWdlbnQuaHRtbCNhZ2VudGxvZyI+QWdlbnRMb2c8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX2FjY2Vzcy5odG1sI2FsbG93Ij5hbGxvdzwvQT4KLTxsaT48QSBIUkVGPSJjb3JlLmh0bWwjYWxsb3dvdmVycmlkZSI+QWxsb3dPdmVycmlkZTwvQT4KLTxsaT48QSBIUkVGPSJtb2RfYXV0aF9hbm9uLmh0bWwjYW5vbnltb3VzIj5Bbm9ueW1vdXM8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX2F1dGhfYW5vbi5odG1sI0xvZ0VtYWlsIj5Bbm9ueW1vdXNfTG9nRW1haWw8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX2F1dGhfYW5vbi5odG1sI1ZlcmlmeUVtYWlsIj5Bbm9ueW1vdXNfVmVyaWZ5RW1haWw8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX2F1dGhfYW5vbi5odG1sI05vVXNlciI+QW5vbnltb3VzX05vVXNlcjwvQT4KLTxsaT48QSBIUkVGPSJtb2RfYXV0aF9hbm9uLmh0bWwjQXV0aG9yYXRpdmUiPkFub255bW91c19BdXRob3JhdGl2ZTwvQT4KLTxsaT48QSBIUkVGPSJtb2RfZGlnZXN0Lmh0bWwjYXV0aGRpZ2VzdGZpbGUiPkF1dGhEaWdlc3RGaWxlPC9BPgotPGxpPjxBIEhSRUY9Im1vZF9hdXRoX2RibS5odG1sI2F1dGhkYmdyb3VwZmlsZSI+QXV0aERCR3JvdXBGaWxlPC9BPgotPGxpPjxBIEhSRUY9Im1vZF9hdXRoX2RibS5odG1sI2F1dGhkYnVzZXJmaWxlIj5BdXRoREJVc2VyRmlsZTwvQT4KLTxsaT48QSBIUkVGPSJtb2RfYXV0aF9kYm0uaHRtbCNhdXRoZGJtZ3JvdXBmaWxlIj5BdXRoREJNR3JvdXBGaWxlPC9BPgotPGxpPjxBIEhSRUY9Im1vZF9hdXRoX2RibS5odG1sI2F1dGhkYm11c2VyZmlsZSI+QXV0aERCTVVzZXJGaWxlPC9BPgotPGxpPjxBIEhSRUY9Im1vZF9hdXRoLmh0bWwjYXV0aGdyb3VwZmlsZSI+QXV0aEdyb3VwRmlsZTwvQT4KLTxsaT48QSBIUkVGPSJtb2RfYXV0aC5odG1sI2F1dGh1c2VyZmlsZSI+QXV0aFVzZXJGaWxlPC9BPgotPGxpPjxBIEhSRUY9ImNvcmUuaHRtbCNhdXRobmFtZSI+QXV0aE5hbWU8L0E+Ci08bGk+PEEgSFJFRj0iY29yZS5odG1sI2F1dGh0eXBlIj5BdXRoVHlwZTwvQT4KLTxsaT48QSBIUkVGPSJjb3JlLmh0bWwjYmluZGFkZHJlc3MiPkJpbmRBZHJlc3M8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX3Byb3h5Lmh0bWwjY2FjaGVkZWZhdWx0ZXhwaXJlIj5DYWNoZURlZmF1bHRFeHBpcmU8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX3Byb3h5Lmh0bWwjY2FjaGVnY2ludGVydmFsIj5DYWNoZUdjSW50ZXJ2YWw8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX3Byb3h5Lmh0bWwjY2FjaGVsYXN0bW9kZmllZCI+Q2FjaGVMYXN0TW9kaWZpZWQ8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX3Byb3h5Lmh0bWwjY2FjaGVtYXhleHBpcmUiPkNhY2hlTWF4RXhwaXJlPC9BPgotPGxpPjxBIEhSRUY9Im1vZF9uZWdvdGlhdGlvbi5odG1sI2NhY2hlbmVnb3RpYXRlZGRvY3MiPkNhY2hlTmVnb3RpYXRlZERvY3M8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX3Byb3h5Lmh0bWwjY2FjaGVyb290Ij5DYWNoZVJvb3Q8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX3Byb3h5Lmh0bWwjY2FjaGVzaXplIj5DYWNoZVNpemU8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX2Nvb2tpZXMuaHRtbCNjb29raWVsb2ciPkNvb2tpZUxvZzwvQT4KLTxsaT48QSBIUkVGPSJtb2RfZGlyLmh0bWwjZGVmYXVsdGljb24iPkRlZmF1bHRJY29uPC9BPgotPGxpPjxBIEhSRUY9ImNvcmUuaHRtbCNkZWZhdWx0dHlwZSI+RGVmYXVsdFR5cGU8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX2FjY2Vzcy5odG1sI2RlbnkiPmRlbnk8L0E+Ci08bGk+PEEgSFJFRj0iY29yZS5odG1sI2RpcmVjdG9yeSI+Jmx0O0RpcmVjdG9yeSZndDs8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX2Rpci5odG1sI2RpcmVjdG9yeWluZGV4Ij5EaXJlY3RvcnlJbmRleDwvQT4KLTxsaT48QSBIUkVGPSJjb3JlLmh0bWwjZG9jdW1lbnRyb290Ij5Eb2N1bWVudFJvb3Q8L0E+Ci08bGk+PEEgSFJFRj0iY29yZS5odG1sI2Vycm9yZG9jdW1lbnQiPkVycm9yRG9jdW1lbnQ8L0E+Ci08bGk+PEEgSFJFRj0iY29yZS5odG1sI2Vycm9ybG9nIj5FcnJvckxvZzwvQT4KLTxsaT48QSBIUkVGPSJtb2RfZGlyLmh0bWwjZmFuY3lpbmRleGluZyI+RmFuY3lJbmRleGluZzwvQT4KLTxsaT48QSBIUkVGPSJtb2RfbWltZS5odG1sI2ZvcmNldHlwZSI+Rm9yY2VUeXBlPC9BPgotPGxpPjxBIEhSRUY9ImNvcmUuaHRtbCNncm91cCI+R3JvdXA8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX2Rpci5odG1sI2hlYWRlcm5hbWUiPkhlYWRlck5hbWU8L0E+Ci08bGk+PEEgSFJFRj0iY29yZS5odG1sI2lkZW50aXR5Y2hlY2siPklkZW50aXR5Q2hlY2s8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX2ltYXAuaHRtbCNpbWFwYmFzZSI+SW1hcEJhc2U8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX2ltYXAuaHRtbCNpbWFwZGVmYXVsdCI+SW1hcERlZmF1bHQ8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX2ltYXAuaHRtbCNpbWFwbWVudSI+SW1hcE1lbnU8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX2Rpci5odG1sI2luZGV4aWdub3JlIj5JbmRleElnbm9yZTwvQT4KLTxsaT48QSBIUkVGPSJtb2RfZGlyLmh0bWwjaW5kZXhvcHRpb25zIj5JbmRleE9wdGlvbnM8L0E+Ci08bGk+PEEgSFJFRj0iY29yZS5odG1sI2tlZXBhbGl2ZSI+S2VlcEFsaXZlPC9BPgotPGxpPjxBIEhSRUY9ImNvcmUuaHRtbCNrZWVwYWxpdmV0aW1lb3V0Ij5LZWVwQWxpdmVUaW1lb3V0PC9BPgotPGxpPjxBIEhSRUY9Im1vZF9uZWdvdGlhdGlvbi5odG1sI2xhbmd1YWdlcHJpb3JpdHkiPkxhbmd1YWdlUHJpb3JpdHk8L0E+Ci08bGk+PEEgSFJFRj0iY29yZS5odG1sI2xpbWl0Ij4mbHQ7TGltaXQmZ3Q7PC9BPgotPGxpPjxBIEhSRUY9ImNvcmUuaHRtbCNsaXN0ZW4iPkxpc3RlbjwvQT4KLTxsaT48QSBIUkVGPSJtb2RfZGxkLmh0bWwjbG9hZGZpbGUiPkxvYWRGaWxlPC9BPgotPGxpPjxBIEhSRUY9Im1vZF9kbGQuaHRtbCNsb2FkbW9kdWxlIj5Mb2FkTW9kdWxlPC9BPgotPGxpPjxBIEhSRUY9ImNvcmUuaHRtbCNsb2NhdGlvbiI+Jmx0O0xvY2F0aW9uJmd0OzwvQT4KLTxsaT48QSBIUkVGPSJtb2RfbG9nX2NvbmZpZy5odG1sI2xvZ2Zvcm1hdCI+TG9nRm9ybWF0PC9BPgotPGxpPjxBIEhSRUY9ImNvcmUuaHRtbCNtYXhjbGllbnRzIj5NYXhDbGllbnRzPC9BPgotPGxpPjxBIEhSRUY9ImNvcmUuaHRtbCNtYXhyZXF1ZXN0c3BlcmNoaWxkIj5NYXhSZXF1ZXN0c1BlckNoaWxkPC9BPgotPGxpPjxBIEhSRUY9ImNvcmUuaHRtbCNtYXhzcGFyZXNlcnZlcnMiPk1heFNwYXJlU2VydmVyczwvQT4KLTxsaT48QSBIUkVGPSJtb2RfY2Vybl9tZXRhLmh0bWwjbWV0YWRpciI+TWV0YURpcjwvQT4KLTxsaT48QSBIUkVGPSJtb2RfY2Vybl9tZXRhLmh0bWwjbWV0YXN1ZmZpeCI+TWV0YVN1ZmZpeDwvQT4KLTxsaT48QSBIUkVGPSJjb3JlLmh0bWwjbWluc3BhcmVzZXJ2ZXJzIj5NaW5TcGFyZVNlcnZlcnM8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX3Byb3h5Lmh0bWwjbm9jYWNoZSI+Tm9DYWNoZTwvQT4KLTxsaT48QSBIUkVGPSJjb3JlLmh0bWwjb3B0aW9ucyI+T3B0aW9uczwvQT4KLTxsaT48QSBIUkVGPSJtb2RfYWNjZXNzLmh0bWwjb3JkZXIiPm9yZGVyPC9BPgotPGxpPjxBIEhSRUY9Im1vZF9lbnYuaHRtbCNwYXNzZW52Ij5QYXNzRW52PC9BPgotPGxpPjxBIEhSRUY9ImNvcmUuaHRtbCNwaWRmaWxlIj5QaWRGaWxlPC9BPgotPGxpPjxBIEhSRUY9ImNvcmUuaHRtbCNwb3J0Ij5Qb3J0PC9BPgotPGxpPjxBIEhSRUY9Im1vZF9wcm94eS5odG1sI3Byb3h5cmVxdWVzdHMiPlByb3h5UmVxdWVzdHM8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX3Byb3h5Lmh0bWwjcHJveHlyZW1vdGUiPlByb3h5UmVtb3RlPC9BPgotPGxpPjxBIEhSRUY9Im1vZF9wcm94eS5odG1sI3Byb3h5cGFzcyI+UHJveHlQYXNzPC9BPgotPGxpPjxBIEhSRUY9Im1vZF9kaXIuaHRtbCNyZWFkbWVuYW1lIj5SZWFkbWVOYW1lPC9BPgotPGxpPjxBIEhSRUY9Im1vZF9sb2dfcmVmZXJlci5odG1sI3JlZmVyZXJpZ25vcmUiPlJlZmVyZXJJZ25vcmU8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX2xvZ19yZWZlcmVyLmh0bWwjcmVmZXJlcmxvZyI+UmVmZXJlckxvZzwvQT4KLTxsaT48QSBIUkVGPSJjb3JlLmh0bWwjcmVxdWlyZSI+cmVxdWlyZTwvQT4KLTxsaT48QSBIUkVGPSJtb2RfYWxpYXMuaHRtbCNyZWRpcmVjdCI+UmVkaXJlY3Q8L0E+Ci08bGk+PEEgSFJFRj0iY29yZS5odG1sI3Jlc291cmNlY29uZmlnIj5SZXNvdXJjZUNvbmZpZzwvQT4KLTxsaT48QSBIUkVGPSJtb2RfYWN0aW9ucy5odG1sI3NjcmlwdCI+U2NyaXB0PC9BPgotPGxpPjxBIEhSRUY9Im1vZF9hbGlhcy5odG1sI3NjcmlwdGFsaWFzIj5TY3JpcHRBbGlhczwvQT4KLTxsaT48QSBIUkVGPSJjb3JlLmh0bWwjc2VydmVyYWRtaW4iPlNlcnZlckFkbWluPC9BPgotPGxpPjxBIEhSRUY9ImNvcmUuaHRtbCNzZXJ2ZXJhbGlhcyI+U2VydmVyQWxpYXM8L0E+Ci08bGk+PEEgSFJFRj0iY29yZS5odG1sI3NlcnZlcm5hbWUiPlNlcnZlck5hbWU8L0E+Ci08bGk+PEEgSFJFRj0iY29yZS5odG1sI3NlcnZlcnBhdGgiPlNlcnZlclBhdGg8L0E+Ci08bGk+PEEgSFJFRj0iY29yZS5odG1sI3NlcnZlcnJvb3QiPlNlcnZlclJvb3Q8L0E+Ci08bGk+PEEgSFJFRj0iY29yZS5odG1sI3NlcnZlcnR5cGUiPlNlcnZlclR5cGU8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX2Vudi5odG1sI3NldGVudiI+U2V0RW52PC9BPgotPGxpPjxBIEhSRUY9Im1vZF9taW1lLmh0bWwjc2V0aGFuZGxlciI+U2V0SGFuZGxlcjwvQT4KLTxsaT48QSBIUkVGPSJjb3JlLmh0bWwjc3RhcnRzZXJ2ZXJzIj5TdGFydFNlcnZlcnM8L0E+Ci08bGk+PEEgSFJFRj0iY29yZS5odG1sI3RpbWVvdXQiPlRpbWVPdXQ8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX2xvZ19jb21tb24uaHRtbCN0cmFuc2ZlcmxvZyI+VHJhbnNmZXJMb2c8L0E+IChtb2RfbG9nX2NvbW1vbikKLTxsaT48QSBIUkVGPSJtb2RfbG9nX2NvbmZpZy5odG1sI3RyYW5zZmVybG9nIj5UcmFuc2ZlckxvZzwvQT4gKG1vZF9sb2dfY29uZmlnKQotPGxpPjxBIEhSRUY9Im1vZF9taW1lLmh0bWwjdHlwZXNjb25maWciPlR5cGVzQ29uZmlnPC9BPgotPGxpPjxBIEhSRUY9ImNvcmUuaHRtbCN1c2VyIj5Vc2VyPC9BPgotPGxpPjxBIEhSRUY9Im1vZF91c2VyZGlyLmh0bWwjdXNlcmRpciI+VXNlckRpcjwvQT4KLTxsaT48QSBIUkVGPSJjb3JlLmh0bWwjdmlydHVhbGhvc3QiPiZsdDtWaXJ0dWFsSG9zdCZndDs8L0E+Ci08bGk+PEEgSFJFRj0ibW9kX2luY2x1ZGUuaHRtbCN4Yml0aGFjayI+WEJpdEhhY2s8L0E+Ci08L3VsPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL2RpcmVjdGl2ZXMueG1sIGIvZG9jcy9tYW51YWwvbW9kL2RpcmVjdGl2ZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWY4MjIwLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9kaXJlY3RpdmVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIGRpcmVjdGl2ZWluZGV4IFsKLSAgICA8IUVOVElUWSBhbGxtb2R1bGVzIFNZU1RFTSAiYWxsbW9kdWxlcy54bWwiPgotXT4KLQotPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iLi4vc3R5bGUvbWFudWFsLnhzbCI/PgotPGRpcmVjdGl2ZWluZGV4PgotPHRpdGxlPkRpcmVjdGl2ZSBJbmRleDwvdGl0bGU+Ci08c3VtbWFyeT4KLSAgICA8cD5FYWNoIEFwYWNoZSBkaXJlY3RpdmUgYXZhaWxhYmxlIGluIHRoZSBzdGFuZGFyZCBBcGFjaGUKLSAgICBkaXN0cmlidXRpb24gaXMgbGlzdGVkIGhlcmUuIFRoZXkgYXJlIGRlc2NyaWJlZCB1c2luZyBhCi0gICAgY29uc2lzdGVudCBmb3JtYXQsIGFuZCB0aGVyZSBpcyA8YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sIgotICAgIHJlbD0iR2xvc3NhcnkiPmEgZGljdGlvbmFyeTwvYT4gb2YgdGhlIHRlcm1zIHVzZWQgaW4gdGhlaXIKLSAgICBkZXNjcmlwdGlvbnMgYXZhaWxhYmxlLjwvcD4KLTwvc3VtbWFyeT4KLSZhbGxtb2R1bGVzOwotPC9kaXJlY3RpdmVpbmRleD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvaW5kZXguaHRtbCBiL2RvY3MvbWFudWFsL21vZC9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTRmY2ZkLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCAyLjAvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIG1vZHVsZXM8L1RJVExFPgotPC9IRUFEPgotCi08Qk9EWT4KLTxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX3N1Yi5naWYiIEFMVD0iIj4KLTxIMT5BcGFjaGUgbW9kdWxlczwvaDE+Ci0KLTxkbD4KLTxkdD48QSBIUkVGPSJjb3JlLmh0bWwiPkNvcmU8L0E+Ci08ZGQ+Q29yZSBBcGFjaGUgZmVhdHVyZXMuCi08ZHQ+PEEgSFJFRj0ibW9kX2FjY2Vzcy5odG1sIj5tb2RfYWNjZXNzPC9BPgotPGRkPkhvc3QgYmFzZWQgYWNjZXNzIGNvbnRyb2wuCi08ZHQ+PEEgSFJFRj0ibW9kX2FjdGlvbnMuaHRtbCI+bW9kX2FjdGlvbnM8L0E+IEFwYWNoZSAxLjEgYW5kIGxhdGVyLgotPGRkPkZpbGV0eXBlL21ldGhvZC1iYXNlZCBzY3JpcHQgZXhlY3V0aW9uCi08ZHQ+PEEgSFJFRj0ibW9kX2FsaWFzLmh0bWwiPm1vZF9hbGlhczwvQT4KLTxkZD5BbGlhc2UgYW5kIHJlZGlyZWN0cy4KLTxkdD48QSBIUkVGPSJtb2RfYXNpcy5odG1sIj5tb2RfYXNpczwvQT4KLTxkZD5UaGUgLmFzaXMgZmlsZSBoYW5kbGVyLgotPGR0PjxBIEhSRUY9Im1vZF9hdXRoLmh0bWwiPm1vZF9hdXRoPC9BPgotPGRkPlVzZXIgYXV0aGVudGljYXRpb24gdXNpbmcgdGV4dCBmaWxlcy4KLTxkdD48QSBIUkVGPSJtb2RfYXV0aF9hbm9uLmh0bWwiPm1vZF9hdXRoX2Fub248L0E+Ci08ZGQ+QW5vbnltb3VzIHVzZXIgYXV0aGVudGljYXRpb24sIEZUUC1zdHlsZS4KLTxkdD48QSBIUkVGPSJtb2RfYXV0aF9kYi5odG1sIj5tb2RfYXV0aF9kYjwvQT4KLTxkZD5Vc2VyIGF1dGhlbnRpY2F0aW9uIHVzaW5nIEJlcmtlbGV5IERCIGZpbGVzLgotPGR0PjxBIEhSRUY9Im1vZF9hdXRoX2RibS5odG1sIj5tb2RfYXV0aF9kYm08L0E+Ci08ZGQ+VXNlciBhdXRoZW50aWNhdGlvbiB1c2luZyBEQk0gZmlsZXMuCi08ZHQ+PEEgSFJFRj0ibW9kX2F1dGhfbXNxbC5odG1sIj5tb2RfYXV0aF9tc3FsPC9BPgotPGRkPlVzZXIgYXV0aGVudGljYXRpb24gdXNpbmcgbVNRTCBmaWxlcy4KLTxkdD48QSBIUkVGPSJtb2RfY2Vybl9tZXRhLmh0bWwiPm1vZF9jZXJuX21ldGE8L2E+Ci08ZGQ+U3VwcG9ydCBmb3IgSFRUUCBoZWFkZXIgbWV0YWZpbGVzLgotPGR0PjxBIEhSRUY9Im1vZF9jZ2kuaHRtbCI+bW9kX2NnaTwvQT4KLTxkZD5JbnZva2luZyBDR0kgc2NyaXB0cy4KLTxkdD48QSBIUkVGPSJtb2RfY29va2llcy5odG1sIj5tb2RfY29va2llczwvQT4KLTxkZD5TdXBwb3J0IGZvciBOZXRzY2FwZS1saWtlIGNvb2tpZXMuCi08ZHQ+PEEgSFJFRj0ibW9kX2RpZ2VzdC5odG1sIj5tb2RfZGlnZXN0PC9BPgotPGRkPk1ENSBhdXRoZW50aWNhdGlvbgotPGR0PjxBIEhSRUY9Im1vZF9kaXIuaHRtbCI+bW9kX2RpcjwvQT4KLTxkZD5BdXRvbWF0aWMgZGlyZWN0b3J5IGxpc3RpbmdzLgotPGR0PjxBIEhSRUY9Im1vZF9lbnYuaHRtbCI+bW9kX2VudjwvQT4KLTxkZD5QYXNzaW5nIG9mIGVudmlyb25tZW50cyB0byBDR0kgc2NyaXB0cwotPGR0PjxBIEhSRUY9Im1vZF9kbGQuaHRtbCI+bW9kX2RsZDwvQT4KLTxkZD5TdGFydC10aW1lIGxpbmtpbmcgd2l0aCB0aGUgR05VIGxpYmRsZC4KLTxkdD48QSBIUkVGPSJtb2RfaW1hcC5odG1sIj5tb2RfaW1hcDwvQT4KLTxkZD5UaGUgaW1hZ2VtYXAgZmlsZSBoYW5kbGVyLgotPGR0PjxBIEhSRUY9Im1vZF9pbmNsdWRlLmh0bWwiPm1vZF9pbmNsdWRlPC9BPgotPGRkPlNlcnZlci1wYXJzZWQgZG9jdW1lbnRzLgotPGR0PjxBIEhSRUY9Im1vZF9pbmZvLmh0bWwiPm1vZF9pbmZvPC9hPgotPGRkPlNlcnZlciBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCi08ZHQ+PEEgSFJFRj0ibW9kX2xvZ19hZ2VudC5odG1sIj5tb2RfbG9nX2FnZW50PC9BPgotPGRkPkxvZ2dpbmcgb2YgVXNlciBBZ2VudHMuCi08ZHQ+PEEgSFJFRj0ibW9kX2xvZ19jb21tb24uaHRtbCI+bW9kX2xvZ19jb21tb248L0E+Ci08ZGQ+U3RhbmRhcmQgbG9nZ2luZyBpbiB0aGUgQ29tbW9uIExvZ2ZpbGUgRm9ybWF0LgotPGR0PjxBIEhSRUY9Im1vZF9sb2dfY29uZmlnLmh0bWwiPm1vZF9sb2dfY29uZmlnPC9BPgotPGRkPlVzZXItY29uZmlndXJhYmxlIGxvZ2dpbmcgcmVwbGFjZW1lbnQgZm9yIG1vZF9sb2dfY29tbW9uLgotPGR0PjxBIEhSRUY9Im1vZF9sb2dfcmVmZXJlci5odG1sIj5tb2RfbG9nX3JlZmVyZXI8L0E+Ci08ZGQ+TG9nZ2luZyBvZiBkb2N1bWVudCByZWZlcmVuY2VzLgotPGR0PjxBIEhSRUY9Im1vZF9taW1lLmh0bWwiPm1vZF9taW1lPC9BPgotPGRkPkRldGVybWluaW5nIGRvY3VtZW50IHR5cGVzLgotPGR0PjxBIEhSRUY9Im1vZF9uZWdvdGlhdGlvbi5odG1sIj5tb2RfbmVnb3RpYXRpb248L0E+Ci08ZGQ+Q29udGVudCBuZWdvdGF0aW9uLgotPGR0PjxBIEhSRUY9Im1vZF9wcm94eS5odG1sIj5tb2RfcHJveHk8L0E+Ci08ZGQ+Q2FjaGluZyBwcm94eSBhYmlsaXRpZXMKLTxkdD48QSBIUkVGPSJtb2Rfc3RhdHVzLmh0bWwiPm1vZF9zdGF0dXM8L2E+Ci08ZGQ+U2VydmVyIHN0YXR1cyBkaXNwbGF5Ci08ZHQ+PEEgSFJFRj0ibW9kX3VzZXJkaXIuaHRtbCI+bW9kX3VzZXJkaXI8L0E+Ci08ZGQ+VXNlciBob21lIGRpcmVjdG9yaWVzLgotPC9kbD4KLQotPGhyPgotCi08QSBIUkVGPSIuLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2hvbWUuZ2lmIiBBTFQ9IkhvbWUiPjwvQT4KLTxBIEhSRUY9Ii4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9pbmRleC5naWYiIEFMVD0iSW5kZXgiPjwvQT4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL2luZGV4LnhtbCBiL2RvY3MvbWFudWFsL21vZC9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MDljMmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIGRpcmVjdGl2ZWluZGV4IFsKLSAgICA8IUVOVElUWSBhbGxtb2R1bGVzIFNZU1RFTSAiYWxsbW9kdWxlcy54bWwiPgotXT4KLQotPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iLi4vc3R5bGUvbWFudWFsLnhzbCI/PgotPG1vZHVsZWluZGV4PgotPHRpdGxlPk1vZHVsZSBJbmRleDwvdGl0bGU+Ci08c3VtbWFyeT4KLQotICAgIDxwPkJlbG93IGlzIGEgbGlzdCBvZiBhbGwgb2YgdGhlIG1vZHVsZXMgdGhhdCBjb21lIGFzIHBhcnQgb2YKLSAgICB0aGUgQXBhY2hlIGRpc3RyaWJ1dGlvbi4gIFNlZSBhbHNvIHRoZSBjb21wbGV0ZQotICAgIGFscGhhYmV0aWNhbCBsaXN0IG9mIDxhIGhyZWY9ImRpcmVjdGl2ZXMuaHRtbCI+YWxsIEFwYWNoZQotICAgIGRpcmVjdGl2ZXM8L2E+LjwvcD4KLQotPC9zdW1tYXJ5PgotJmFsbG1vZHVsZXM7Ci08L21vZHVsZWluZGV4PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfYWN0aW9ucy5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9hY3Rpb25zLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5N2RmMTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9hY3Rpb25zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDIuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9hY3Rpb25zPC9USVRMRT4KLTwvSEVBRD4KLQotPEJPRFk+Ci08SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9zdWIuZ2lmIiBBTFQ9IiI+Ci08SDE+QXBhY2hlIG1vZHVsZSBtb2RfYWN0aW9uczwvaDE+Ci0KLVRoaXMgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+bW9kX2FjdGlvbnMuYzwvY29kZT4gZmlsZSwgYW5kCi1pcyBjb21waWxlZCBpbiBieSBkZWZhdWx0LiBJdCBwcm92aWRlcyBmb3IKLWV4ZWN1dGluZyBDR0kgc2NyaXB0cyBiYXNlZCBvbiBtZWRpYSB0eXBlIG9yIHJlcXVlc3QgbWV0aG9kLiBJdCBpcyBub3QKLXByZXNlbnQgaW4gdmVyc2lvbnMgcHJpb3IgdG8gQXBhY2hlIDEuMS4KLQotPGgyPlN1bW1hcnk8L2gyPgotCi1UaGlzIG1vZHVsZSBsZXRzIHlvdSBydW4gQ0dJIHNjcmlwdHMgd2hlbmV2ZXIgYSBmaWxlIG9mIGEgY2VydGFpbiB0eXBlCi1pcyByZXF1ZXN0ZWQuIFRoaXMgbWFrZXMgaXQgbXVjaCBlYXNpZXIgdG8gZXhlY3V0ZSBzY3JpcHRzIHRoYXQKLXByb2Nlc3MgZmlsZXMuCi0KLTxoMj5EaXJlY3RpdmVzPC9oMj4KLTx1bD4KLTxsaT48QSBIUkVGPSIjYWN0aW9uIj5BY3Rpb248L0E+Ci08bGk+PEEgSFJFRj0iI3NjcmlwdCI+U2NyaXB0PC9BPgotPC91bD4KLQotPGhyPgotCi08QSBuYW1lPSJhY3Rpb24iPjxoMj5BY3Rpb248L2gyPjwvQT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBBY3Rpb24gPGVtPm1pbWUtdHlwZSBjZ2ktc2NyaXB0PC9lbT48YnI+Ci08c3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWcsIHZpcnV0YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3M8YnI+Ci08c3Ryb25nPk92ZXJyaWRlOjwvc3Ryb25nPiBGaWxlSW5mbzxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBCYXNlPGJyPgotPHN0cm9uZz5Nb2R1bGU6PC9zdHJvbmc+IG1vZF9hY3Rpb25zPGJyPgotPHN0cm9uZz5Db21wYXRpYmlsaXR5Ojwvc3Ryb25nPiBBY3Rpb24gaXMgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDEuMQotYW5kIGxhdGVyPHA+Ci0KLVRoaXMgZGlyZWN0aXZlIGFkZHMgYW4gYWN0aW9uLCB3aGljaCB3aWxsIGFjdGl2YXRlIDxlbT5jZ2ktc2NyaXB0PC9lbT4gd2hlbgotYSBmaWxlIG9mIGNvbnRlbnQgdHlwZSA8ZW0+bWltZS10eXBlPC9lbT4gaXMgcmVxdWVzdGVkLiBJdCBzZW5kcyB0aGUKLVVSTCBhbmQgZmlsZSBwYXRoIG9mIHRoZSByZXF1ZXN0ZWQgZG9jdW1lbnQgdXNpbmcgdGhlIHN0YW5kYXJkCi1DR0kgUEFUSF9JTkZPIGFuZCBQQVRIX1RSQU5TTEFURUQgZW52aXJvbm1lbnQgdmFyaWFibGVzLgotCi08aHI+Ci0KLTxBIG5hbWU9InNjcmlwdCI+PGgyPlNjcmlwdDwvaDI+PC9BPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IFNjcmlwdCA8ZW0+bWV0aG9kIGNnaS1zY3JpcHQ8L2VtPjxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydXRhbCBob3N0LCBkaXJlY3Rvcnk8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gQmFzZTxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfYWN0aW9uczxicj4KLTxzdHJvbmc+Q29tcGF0aWJpbGl0eTo8L3N0cm9uZz4gU2NyaXB0IGlzIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZSAxLjEKLWFuZCBsYXRlcjxwPgotCi08cD5UaGlzIGRpcmVjdGl2ZSBhZGRzIGFuIGFjdGlvbiwgd2hpY2ggd2lsbCBhY3RpdmF0ZSA8ZW0+Y2dpLXNjcmlwdDwvZW0+IHdoZW4KLWEgZmlsZSBpcyByZXF1ZXN0ZWQgdXNpbmcgdGhlIG1ldGhvZCBvZiA8ZW0+bWV0aG9kPC9lbT4sIHdoaWNoIGNhbiBiZQotb25lIG9mIDxjb2RlPkdFVDwvY29kZT4sIDxjb2RlPlBPU1Q8L2NvZGU+LCA8Y29kZT5QVVQ8L2NvZGU+IG9yCi08Y29kZT5ERUxFVEU8L2NvZGU+LiBJdCBzZW5kcyB0aGUKLVVSTCBhbmQgZmlsZSBwYXRoIG9mIHRoZSByZXF1ZXN0ZWQgZG9jdW1lbnQgdXNpbmcgdGhlIHN0YW5kYXJkCi1DR0kgUEFUSF9JTkZPIGFuZCBQQVRIX1RSQU5TTEFURUQgZW52aXJvbm1lbnQgdmFyaWFibGVzLiAKLQotPHA+Tm90ZSB0aGF0IHRoZSBTY3JpcHQgY29tbWFuZCBkZWZpbmVzIGRlZmF1bHQgYWN0aW9ucyBvbmx5LiBJZiBhIENHSQotc2NyaXB0IGlzIGNhbGxlZCwgb3Igc29tZSBvdGhlciByZXNvdXJjZSB0aGF0IGlzIGNhcGFibGUgb2YgaGFuZGxpbmcKLXRoZSByZXF1ZXN0ZWQgbWV0aG9kIGludGVybmFsbHksIGl0IHdpbGwgZG8gc28uIEFsc28gbm90ZSB0aGF0IHNjcmlwdAotd2l0aCBhIG1ldGhvZCBvZiA8Y29kZT5HRVQ8L2NvZGU+IHdpbGwgb25seSBiZSBjYWxsZWQgaWYgdGhlcmUgYXJlCi1xdWVyeSBhcmd1bWVudHMgcHJlc2VudCAoZS5nLiBmb28uaHRtbD9oaSkuIE90aGVyd2lzZSwgdGhlIHJlcXVlc3QKLXdpbGwgcHJvY2VlZCBub3JtYWxseS4KLQotPHA+RXhhbXBsZXM6Ci08cHJlPgotICAgIFNjcmlwdCBHRVQgL2NnaS1iaW4vc2VhcmNoICAgICAjZS5nLiBmb3IgJmx0O0lTSU5ERVgmZ3Q7LXN0eWxlIHNlYXJjaGluZwotICAgIFNjcmlwdCBQVVQgL35ib2IvcHV0LmNnaQotPC9wcmU+Ci0KLTxwPjxocj4KLQotPEEgSFJFRj0iLi4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9ob21lLmdpZiIgQUxUPSJIb21lIj48L0E+Ci08QSBIUkVGPSIuLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfaW5kZXguZ2lmIiBBTFQ9IkluZGV4Ij48L0E+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9hY3Rpb25zLnhtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfYWN0aW9ucy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MDJkYmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9hY3Rpb25zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSB4bWw6bWFudWFsIFsgPCFFTlRJVFkgbmJzcCAiJiMxNjA7Ij4gXT4KLTw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9Ii4uL3N0eWxlL21hbnVhbC54c2wiPz4KLTxtb2R1bGVzeW5vcHNpcz4KLQotPG5hbWU+bW9kX2FjdGlvbnM8L25hbWU+IAotCi08ZGVzY3JpcHRpb24+VGhpcyBtb2R1bGUgcHJvdmlkZXMgZm9yIGV4ZWN1dGluZyBDR0kgc2NyaXB0cyBiYXNlZCBvbgotbWVkaWEgdHlwZSBvciByZXF1ZXN0IG1ldGhvZC48L2Rlc2NyaXB0aW9uPgotCi08c3RhdHVzPkJhc2U8L3N0YXR1cz4KLTxzb3VyY2VmaWxlPm1vZF9hY3Rpb25zLmM8L3NvdXJjZWZpbGU+Ci08aWRlbnRpZmllcj5hY3Rpb25zX21vZHVsZTwvaWRlbnRpZmllcj4KLQotPHN1bW1hcnk+Ci0gICAgPHA+VGhpcyBtb2R1bGUgaGFzIHR3byBkaXJlY3RpdmVzLiBUaGUgPGRpcmVjdGl2ZQotICAgIG1vZHVsZT0ibW9kX2FjdGlvbnMiPkFjdGlvbjwvZGlyZWN0aXZlPiBkaXJlY3RpdmUgbGV0cyB5b3UgcnVuIENHSQotICAgIHNjcmlwdHMgd2hlbmV2ZXIgYSBmaWxlIG9mIGEgY2VydGFpbiB0eXBlIGlzIHJlcXVlc3RlZC4gVGhlCi0gICAgPGRpcmVjdGl2ZSBtb2R1bGU9Im1vZF9hY3Rpb25zIj5TY3JpcHQ8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIGxldHMKLSAgICB5b3UgcnVuIENHSSBzY3JpcHRzIHdoZW5ldmVyIGEgcGFydGljdWxhciBtZXRob2QgaXMgdXNlZCBpbiBhCi0gICAgcmVxdWVzdC4gVGhpcyBtYWtlcyBpdCBtdWNoIGVhc2llciB0byBleGVjdXRlIHNjcmlwdHMgdGhhdCBwcm9jZXNzCi0gICAgZmlsZXMuPC9wPgotPC9zdW1tYXJ5PgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxuYW1lPkFjdGlvbjwvbmFtZT4KLQotPGRlc2NyaXB0aW9uPkFjdGl2YXRlcyBhIENHSSBzY3JpcHQgZm9yIGEgcGFydGljdWxhciBoYW5kbGVyIG9yCi1jb250ZW50LXR5cGU8L2Rlc2NyaXB0aW9uPgotCi08c3ludGF4PkFjdGlvbiA8ZW0+YWN0aW9uLXR5cGUgY2dpLXNjcmlwdDwvZW0+PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+Ci08Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPkZpbGVJbmZvPC9vdmVycmlkZT4KLQotPHVzYWdlPgotICAgIDxwPlRoaXMgZGlyZWN0aXZlIGFkZHMgYW4gYWN0aW9uLCB3aGljaCB3aWxsIGFjdGl2YXRlCi0gICAgPGVtPmNnaS1zY3JpcHQ8L2VtPiB3aGVuIDxlbT5hY3Rpb24tdHlwZTwvZW0+IGlzIHRyaWdnZXJlZCBieQotICAgIHRoZSByZXF1ZXN0LiBUaGUgPGVtPmFjdGlvbi10eXBlPC9lbT4gY2FuIGJlIGVpdGhlciBhIDxhCi0gICAgaHJlZj0iLi4vaGFuZGxlci5odG1sIj5oYW5kbGVyPC9hPiBvciBhIE1JTUUgY29udGVudCB0eXBlLiBJdAotICAgIHNlbmRzIHRoZSBVUkwgYW5kIGZpbGUgcGF0aCBvZiB0aGUgcmVxdWVzdGVkIGRvY3VtZW50IHVzaW5nIHRoZQotICAgIHN0YW5kYXJkIENHSSBQQVRIX0lORk8gYW5kIFBBVEhfVFJBTlNMQVRFRCBlbnZpcm9ubWVudAotICAgIHZhcmlhYmxlcy48L3A+Ci0KLTxleGFtcGxlPgotPHRpdGxlPkV4YW1wbGVzPC90aXRsZT4KLQotICAgICMgUmVxdWVzdHMgZm9yIGZpbGVzIG9mIGEgcGFydGljdWxhciB0eXBlOjxiciAvPgotICAgIEFjdGlvbiBpbWFnZS9naWYgL2NnaS1iaW4vaW1hZ2VzLmNnaTxiciAvPgotPGJyIC8+Ci0gICAgIyBGaWxlcyBvZiBhIHBhcnRpY3VsYXIgZmlsZSBleHRlbnNpb248YnIgLz4KLSAgICBBZGRIYW5kbGVyIG15LWZpbGUtdHlwZSAueHl6PGJyIC8+Ci0gICAgQWN0aW9uIG15LWZpbGUtdHlwZSAvY2dpLWJpbi9wcm9ncmFtLmNnaTxiciAvPgotPC9leGFtcGxlPgotCi0gICAgPHA+SW4gdGhlIGZpcnN0IGV4YW1wbGUsIHJlcXVlc3RzIGZvciBmaWxlcyB3aXRoIGEgTUlNRSBjb250ZW50Ci0gICAgdHlwZSBvZiA8Y29kZT5pbWFnZS9naWY8L2NvZGU+IHdpbGwgaW5zdGVhZCBiZSBoYW5kbGVkIGJ5IHRoZQotICAgIHNwZWNpZmllZCBjZ2kgc2NyaXB0IDxjb2RlPi9jZ2ktYmluL2ltYWdlcy5jZ2k8L2NvZGU+LjwvcD4KLQotICAgIDxwPkluIHRoZSBzZWNvbmQgZXhhbXBsZSwgcmVxdWVzdHMgZm9yIGZpbGVzIHdpdGggYSBmaWxlIGV4dGVuc2lvbiBvZgotICAgIDxjb2RlPi54eXo8L2NvZGU+IGFyZSBoYW5kbGVkIGluc3RlYWQgYnkgdGhlIHNwZWNpZmllZCBjZ2kgc2NyaXB0IAotICAgIDxjb2RlPi9jZ2ktYmluL3Byb2dyYW0uY2dpPC9jb2RlPi48L3A+Ci08L3VzYWdlPgotCi08c2VlYWxzbz48ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX21pbWUiPkFkZEhhbmRsZXI8L2RpcmVjdGl2ZT48L3NlZWFsc28+Ci0KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLQotPG5hbWU+U2NyaXB0PC9uYW1lPgotCi08ZGVzY3JpcHRpb24+QWN0aXZhdGVzIGEgQ0dJIHNjcmlwdCBmb3IgYSBwYXJ0aWN1bGFyIHJlcXVlc3QKLW1ldGhvZC48L2Rlc2NyaXB0aW9uPgotPHN5bnRheD4gU2NyaXB0IDxlbT5tZXRob2QgY2dpLXNjcmlwdDwvZW0+PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+Ci08Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPHVzYWdlPgotICAgIDxwPlRoaXMgZGlyZWN0aXZlIGFkZHMgYW4gYWN0aW9uLCB3aGljaCB3aWxsIGFjdGl2YXRlCi0gICAgPGVtPmNnaS1zY3JpcHQ8L2VtPiB3aGVuIGEgZmlsZSBpcyByZXF1ZXN0ZWQgdXNpbmcgdGhlIG1ldGhvZCBvZgotICAgIDxlbT5tZXRob2Q8L2VtPi4gSXQgc2VuZHMgdGhlIFVSTCBhbmQgZmlsZSBwYXRoIG9mIHRoZSByZXF1ZXN0ZWQKLSAgICBkb2N1bWVudCB1c2luZyB0aGUgc3RhbmRhcmQgQ0dJIFBBVEhfSU5GTyBhbmQgUEFUSF9UUkFOU0xBVEVECi0gICAgZW52aXJvbm1lbnQgdmFyaWFibGVzLjwvcD4KLQotPG5vdGU+Ci0gICAgICBBbnkgYXJiaXRyYXJ5IG1ldGhvZCBuYW1lIG1heSBiZSB1c2VkLiA8c3Ryb25nPk1ldGhvZCBuYW1lcyBhcmUKLSAgICAgIGNhc2Utc2Vuc2l0aXZlPC9zdHJvbmc+LCBzbyA8Y29kZT5TY3JpcHQmbmJzcDtQVVQ8L2NvZGU+IGFuZAotICAgICAgPGNvZGU+U2NyaXB0Jm5ic3A7cHV0PC9jb2RlPiBoYXZlIHR3byBlbnRpcmVseSBkaWZmZXJlbnQKLSAgICAgIGVmZmVjdHMuCi08L25vdGU+Ci0KLSAgICA8cD5Ob3RlIHRoYXQgdGhlIFNjcmlwdCBjb21tYW5kIGRlZmluZXMgZGVmYXVsdCBhY3Rpb25zIG9ubHkuCi0gICAgSWYgYSBDR0kgc2NyaXB0IGlzIGNhbGxlZCwgb3Igc29tZSBvdGhlciByZXNvdXJjZSB0aGF0IGlzCi0gICAgY2FwYWJsZSBvZiBoYW5kbGluZyB0aGUgcmVxdWVzdGVkIG1ldGhvZCBpbnRlcm5hbGx5LCBpdCB3aWxsIGRvCi0gICAgc28uIEFsc28gbm90ZSB0aGF0IFNjcmlwdCB3aXRoIGEgbWV0aG9kIG9mIDxjb2RlPkdFVDwvY29kZT4KLSAgICB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIHRoZXJlIGFyZSBxdWVyeSBhcmd1bWVudHMgcHJlc2VudAotICAgICg8ZW0+ZS5nLjwvZW0+LCBmb28uaHRtbD9oaSkuIE90aGVyd2lzZSwgdGhlIHJlcXVlc3Qgd2lsbAotICAgIHByb2NlZWQgbm9ybWFsbHkuPC9wPgotCi08ZXhhbXBsZT4KLTx0aXRsZT5FeGFtcGxlczwvdGl0bGU+Ci0gICAgIyBGb3IgJmx0O0lTSU5ERVgmZ3Q7LXN0eWxlIHNlYXJjaGluZzxiciAvPgotICAgIFNjcmlwdCBHRVQgL2NnaS1iaW4vc2VhcmNoPGJyIC8+Ci0gICAgIyBBIENHSSBQVVQgaGFuZGxlcjxiciAvPgotICAgIFNjcmlwdCBQVVQgL35ib2IvcHV0LmNnaTxiciAvPgotPC9leGFtcGxlPgotPC91c2FnZT4KLQotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPC9tb2R1bGVzeW5vcHNpcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2FsaWFzLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2FsaWFzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMTcwNTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9hbGlhcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPCEtLSVoeXBlcnRleHQgLS0+Ci08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDIuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9hbGlhczwvVElUTEU+Ci08L0hFQUQ+Ci0KLTxCT0RZPgotPElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfc3ViLmdpZiIgQUxUPSIiPgotPCEtLS8laHlwZXJ0ZXh0IC0tPgotPEgxPk1vZHVsZSBtb2RfYWxpYXM8L2gxPgotCi1UaGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4gdGhlIDxjb2RlPm1vZF9hbGlhcy5jPC9jb2RlPiBmaWxlLCBhbmQKLWlzIGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuIEl0IHByb3ZpZGVzIGZvciBtYXBwaW5nIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUKLWhvc3QgZmlsZXN5c3RlbSBpbiB0aGUgdGhlIGRvY3VtZW50IHRyZWUsIGFuZCBmb3IgVVJMIHJlZGlyZWN0aW9uLgotCi08IS0tJWh5cGVydGV4dCAtLT4KLTxtZW51PgotPGxpPjxBIEhSRUY9IiNhbGlhcyI+QWxpYXM8L0E+Ci08bGk+PEEgSFJFRj0iI3JlZGlyZWN0Ij5SZWRpcmVjdDwvQT4KLTxsaT48QSBIUkVGPSIjc2NyaXB0YWxpYXMiPlNjcmlwdEFsaWFzPC9BPgotPC9tZW51PgotPGhyPgotPCEtLS8laHlwZXJ0ZXh0IC0tPgotCi08QSBuYW1lPSJhbGlhcyI+PGgyPkFsaWFzPC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgQWxpYXN9IGRpcmVjdGl2ZSZndDsgLS0+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gQWxpYXMgPGVtPnVybC1wYXRoIGRpcmVjdG9yeS1maWxlbmFtZTwvZW0+PGJyPgotPFN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gQmFzZTxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfYWxpYXM8YnI+Ci08c3Ryb25nPkNvbXBhdGliaWxpdHk6PC9zdHJvbmc+IEFsaWFzIGlzIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZSAxLjEKLWFuZCBsYXRlcjxwPgotCi1UaGUgQWxpYXMgZGlyZWN0aXZlIGFsbG93cyBkb2N1bWVudHMgdG8gYmUgc3RvcmVkIGluIHRoZSBsb2NhbCBmaWxlc3lzdGVtCi1vdGhlciB0aGFuIHVuZGVyIHRoZSA8QSBIUkVGPSJjb3JlLmh0bWwjZG9jdW1lbnRyb290Ij5Eb2N1bWVudFJvb3Q8L0E+LgotVVJMcyB3aXRoIGEgKCUtZGVjb2RlZCkgcGF0aCBiZWdpbm5pbmcgd2l0aCA8ZW0+dXJsLXBhdGg8L2VtPiB3aWxsIGJlCi1tYXBwZWQgdG8gbG9jYWwgZmlsZXMgYmVnaW5uaW5nIHdpdGggPGVtPmRpcmVjdG9yeS1maWxlbmFtZTwvZW0+LgotRXhhbXBsZToKLTxibG9ja3F1b3RlPjxjb2RlPkFsaWFzIC9pbWFnZSAvZnRwL3B1Yi9pbWFnZTwvY29kZT48L2Jsb2NrcXVvdGU+Ci1BIHJlcXVlc3QgZm9yIGh0dHA6Ly9teXNlcnZlci9pbWFnZS9mb28uZ2lmIHdvdWxkIGNhdXNlIHRoZSBzZXJ2ZXIgdG8KLXJldHVybiB0aGUgZmlsZSAvZnRwL3B1Yi9pbWFnZS9mb28uZ2lmLjxwPgotU2VlIGFsc28gPEEgSFJFRj0iI3NjcmlwdGFsaWFzIj5TY3JpcHRBbGlhczwvQT4uPHA+PGhyPgotCi08QSBuYW1lPSJyZWRpcmVjdCI+PGgyPlJlZGlyZWN0PC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgUmVkaXJlY3R9IGRpcmVjdGl2ZSZndDsgLS0+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gUmVkaXJlY3QgPGVtPnVybC1wYXRoIHVybDwvZW0+PGJyPgotPFN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IEJhc2U8YnI+Ci08c3Ryb25nPk1vZHVsZTo8L3N0cm9uZz4gbW9kX2FsaWFzPGJyPgotPHN0cm9uZz5Db21wYXRpYmlsaXR5Ojwvc3Ryb25nPiBUaGUgZGlyZWN0b3J5IGFuZCAuaHRhY2Nlc3MgY29udGV4dCdzCi1hcmUgb25seSBhdmFpbGFibGUgaW4gdmVyc2lvbnMgMS4xIGFuZCBsYXRlcjxwPgotCi1UaGUgUmVkaXJlY3QgZGlyZWN0aXZlIG1hcHMgYW4gb2xkIFVSTCBpbnRvIGEgbmV3IG9uZS4gVGhlIG5ldyBVUkwgaXMgcmV0dXJuZWQKLXRvIHRoZSBjbGllbnQgd2hpY2ggYXR0ZW1wdHMgdG8gZmV0Y2ggaXQgYWdhaW4gd2l0aCB0aGUgbmV3IGFkZHJlc3MuCi08ZW0+VXJsLXBhdGg8L2VtPiBhICglLWRlY29kZWQpIHBhdGg7IGFueSByZXF1ZXN0cyBmb3IgZG9jdW1lbnRzIGJlZ2lubmluZyB3aXRoCi10aGlzIHBhdGggd2lsbCBiZSByZXR1cm5lZCBhIHJlZGlyZWN0IGVycm9yIHRvIGEgbmV3ICglLWVuY29kZWQpIHVybAotYmVnaW5uaW5nIHdpdGggPGVtPnVybDwvZW0+LiBFeGFtcGxlOgotPGJsb2NrcXVvdGU+PGNvZGU+UmVkaXJlY3QgL3NlcnZpY2UKLWh0dHA6Ly9mb28yLmJhci5jb20vc2VydmljZTwvY29kZT48L2Jsb2NrcXVvdGU+Ci1JZiB0aGUgY2xpZW50IHJlcXVlc3RzIGh0dHA6Ly9teXNlcnZlci9zZXJ2aWNlL2Zvby50eHQsIGl0IHdpbGwgYmUgdG9sZCB0bwotYWNjZXNzIGh0dHA6Ly9mb28yLmJhci5jb20vc2VydmljZS9mb28udHh0IGluc3RlYWQuPHA+Ci1Ob3RlOiBSZWRpcmVjdCBkaXJlY3RpdmVzIHRha2UgcHJlY2VkZW5jZSBvdmVyIEFsaWFzIGFuZCBTY3JpcHRBbGlhcwotZGlyZWN0aXZlcywgaXJyZXNwZWN0aXZlIG9mIHRoZWlyIG9yZGVyaW5nIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuPHA+PGhyPgotCi08QSBuYW1lPSJzY3JpcHRhbGlhcyI+PGgyPlNjcmlwdEFsaWFzPC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgU2NyaXB0QWxpYXN9IGRpcmVjdGl2ZSZndDsgLS0+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gU2NyaXB0QWxpYXMgPGVtPnVybC1wYXRoIGRpcmVjdG9yeS1maWxlbmFtZTwvZW0+PGJyPgotPFN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gQmFzZTxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfYWxpYXM8YnI+Ci08c3Ryb25nPkNvbXBhdGliaWxpdHk6PC9zdHJvbmc+IFNjcmlwdEFsaWFzIGlzIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZSAxLjEKLWFuZCBsYXRlcjxwPgotCi1UaGUgU2NyaXB0QWxpYXMgZGlyZWN0aXZlIGhhcyB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgdGhlCi08QSBIUkVGPSIjYWxpYXMiPkFsaWFzPC9BPiBkaXJlY3RpdmUsIGV4Y2VwdCB0aGF0IGluIGFkZGl0aW9uIGl0Ci1tYXJrcyB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBhcyBjb250YWluaW5nIENHSSBzY3JpcHRzLgotVVJMcyB3aXRoIGEgKCUtZGVjb2RlZCkgcGF0aCBiZWdpbm5pbmcgd2l0aCA8ZW0+dXJsLXBhdGg8L2VtPiB3aWxsIGJlCi1tYXBwZWQgdG8gc2NyaXB0cyBiZWdpbm5pbmcgd2l0aCA8ZW0+ZGlyZWN0b3J5LWZpbGVuYW1lPC9lbT4uCi1FeGFtcGxlOgotPGJsb2NrcXVvdGU+PGNvZGU+U2NyaXB0QWxpYXMgL2NnaS1iaW4vIC93ZWIvY2dpLWJpbi88L2NvZGU+PC9ibG9ja3F1b3RlPgotQSByZXF1ZXN0IGZvciBodHRwOi8vbXlzZXJ2ZXIvY2dpLWJpbi9mb28gd291bGQgY2F1c2UgdGhlIHNlcnZlciB0bwotcnVuIHRoZSBzY3JpcHQgL3dlYi9jZ2ktYmluL2Zvby48cD4KLQotPCEtLSVoeXBlcnRleHQgLS0+Ci08aHI+Ci0KLTxBIEhSRUY9Ii4uLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfaG9tZS5naWYiIEFMVD0iSG9tZSI+PC9BPgotPEEgSFJFRj0iLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2luZGV4LmdpZiIgQUxUPSJJbmRleCI+PC9BPgotCi08L0JPRFk+Ci08L0hUTUw+Ci08IS0tLyVoeXBlcnRleHQgLS0+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2FsaWFzLnhtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfYWxpYXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGRiMTFkLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfYWxpYXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iLi4vc3R5bGUvbWFudWFsLnhzbCI/PgotPG1vZHVsZXN5bm9wc2lzPgotCi08bmFtZT5tb2RfYWxpYXM8L25hbWU+Ci08ZGVzY3JpcHRpb24+UHJvdmlkZXMgZm9yIG1hcHBpbmcgZGlmZmVyZW50IHBhcnRzIG9mIHRoZSBob3N0Ci0gICAgZmlsZXN5c3RlbSBpbiB0aGUgZG9jdW1lbnQgdHJlZSBhbmQgZm9yIFVSTCByZWRpcmVjdGlvbjwvZGVzY3JpcHRpb24+Ci08c3RhdHVzPkJhc2U8L3N0YXR1cz4KLTxzb3VyY2VmaWxlPm1vZF9hbGlhcy5jPC9zb3VyY2VmaWxlPgotPGlkZW50aWZpZXI+YWxpYXNfbW9kdWxlPC9pZGVudGlmaWVyPgotCi08c3VtbWFyeT4KLSAgICA8cD5UaGUgZGlyZWN0aXZlcyBjb250YWluZWQgaW4gdGhpcyBtb2R1bGUgYWxsb3cgZm9yIG1hbmlwdWxhdGlvbgotICAgIGFuZCBjb250cm9sIG9mIFVSTHMgYXMgcmVxdWVzdHMgYXJyaXZlIGF0IHRoZSBzZXJ2ZXIuIFRoZQotICAgIDxkaXJlY3RpdmUgbW9kdWxlPSJtb2RfYWxpYXMiPkFsaWFzPC9kaXJlY3RpdmU+IGFuZCA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJtb2RfYWxpYXMiPlNjcmlwdEFsaWFzPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZXMgYXJlIHVzZWQgdG8KLSAgICBtYXAgYmV0d2VlbiBVUkxzIGFuZCBmaWxlc3lzdGVtIHBhdGhzLiAgVGhpcyBhbGxvd3MgZm9yIGNvbnRlbnQKLSAgICB3aGljaCBpcyBub3QgZGlyZWN0bHkgdW5kZXIgdGhlIDxkaXJlY3RpdmUKLSAgICBtb2R1bGU9ImNvcmUiPkRvY3VtZW50Um9vdDwvZGlyZWN0aXZlPiBzZXJ2ZWQgYXMgcGFydCBvZiB0aGUgd2ViCi0gICAgZG9jdW1lbnQgdHJlZS4gVGhlIDxkaXJlY3RpdmUKLSAgICBtb2R1bGU9Im1vZF9hbGlhcyI+U2NyaXB0QWxpYXM8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIGhhcyB0aGUKLSAgICBhZGRpdGlvbmFsIGVmZmVjdCBvZiBtYXJraW5nIHRoZSB0YXJnZXQgZGlyZWN0b3J5IGFzIGNvbnRhaW5pbmcKLSAgICBvbmx5IENHSSBzY3JpcHRzLjwvcD4KLQotICAgIDxwPlRoZSA8ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX2FsaWFzIj5SZWRpcmVjdDwvZGlyZWN0aXZlPgotICAgIGRpcmVjdGl2ZXMgYXJlIHVzZWQgdG8gaW5zdHJ1Y3QgY2xpZW50cyB0byBtYWtlIGEgbmV3IHJlcXVlc3Qgd2l0aAotICAgIGEgZGlmZmVyZW50IFVSTC4gVGhleSBhcmUgb2Z0ZW4gdXNlZCB3aGVuIGEgcmVzb3VyY2UgaGFzIG1vdmVkIHRvCi0gICAgYSBuZXcgbG9jYXRpb24uPC9wPgotCi0gICAgPHA+QSBtb3JlIHBvd2VyZnVsIGFuZCBmbGV4aWJsZSBzZXQgb2YgZGlyZWN0aXZlcyBmb3IKLSAgICBtYW5pcHVsYXRpbmcgVVJMcyBpcyBjb250YWluZWQgaW4gdGhlIDxtb2R1bGU+bW9kX3Jld3JpdGU8L21vZHVsZT4KLSAgICBtb2R1bGUuPC9wPgotPC9zdW1tYXJ5PgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5BbGlhczwvbmFtZT4KLTxkZXNjcmlwdGlvbj5NYXBzIFVSTHMgdG8gZmlsZXN5c3RlbSBsb2NhdGlvbnM8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD4gQWxpYXMgPGVtPlVSTC1wYXRoCi0gICAgZmlsZS1wYXRoPC9lbT58PGVtPmRpcmVjdG9yeS1wYXRoPC9lbT48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLQotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPkFsaWFzPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBhbGxvd3MgZG9jdW1lbnRzIHRvCi0gICAgYmUgc3RvcmVkIGluIHRoZSBsb2NhbCBmaWxlc3lzdGVtIG90aGVyIHRoYW4gdW5kZXIgdGhlIAotICAgIDxkaXJlY3RpdmUgbW9kdWxlPSJjb3JlIj5Eb2N1bWVudFJvb3Q8L2RpcmVjdGl2ZT4uIFVSTHMgd2l0aCBhCi0gICAgKCUtZGVjb2RlZCkgcGF0aCBiZWdpbm5pbmcgd2l0aCA8ZW0+dXJsLXBhdGg8L2VtPiB3aWxsIGJlIG1hcHBlZAotICAgIHRvIGxvY2FsIGZpbGVzIGJlZ2lubmluZyB3aXRoIDxlbT5kaXJlY3RvcnktZmlsZW5hbWU8L2VtPi48L3A+Ci0KLSAgICA8cD5FeGFtcGxlOjwvcD4KLQotPGV4YW1wbGU+QWxpYXMgL2ltYWdlIC9mdHAvcHViL2ltYWdlPC9leGFtcGxlPgotCi0gICAgPHA+QSByZXF1ZXN0IGZvciBodHRwOi8vbXlzZXJ2ZXIvaW1hZ2UvZm9vLmdpZiB3b3VsZCBjYXVzZSB0aGUKLSAgICBzZXJ2ZXIgdG8gcmV0dXJuIHRoZSBmaWxlIC9mdHAvcHViL2ltYWdlL2Zvby5naWYuPC9wPgotCi0gICAgPHA+Tm90ZSB0aGF0IGlmIHlvdSBpbmNsdWRlIGEgdHJhaWxpbmcgLyBvbiB0aGUKLSAgICA8ZW0+dXJsLXBhdGg8L2VtPiB0aGVuIHRoZSBzZXJ2ZXIgd2lsbCByZXF1aXJlIGEgdHJhaWxpbmcgLyBpbgotICAgIG9yZGVyIHRvIGV4cGFuZCB0aGUgYWxpYXMuIFRoYXQgaXMsIGlmIHlvdSB1c2UgPGNvZGU+QWxpYXMKLSAgICAvaWNvbnMvIC91c3IvbG9jYWwvYXBhY2hlL2ljb25zLzwvY29kZT4gdGhlbiB0aGUgdXJsCi0gICAgPGNvZGU+L2ljb25zPC9jb2RlPiB3aWxsIG5vdCBiZSBhbGlhc2VkLjwvcD4KLQotICAgIDxwPk5vdGUgdGhhdCB5b3UgbWF5IG5lZWQgdG8gc3BlY2lmeSBhZGRpdGlvbmFsIDxkaXJlY3RpdmUKLSAgICBtb2R1bGU9ImNvcmUiPiZsdDtEaXJlY3RvcnkmZ3Q7PC9kaXJlY3RpdmU+IHNlY3Rpb25zIHdoaWNoIGNvdmVyCi0gICAgdGhlIDxlbT5kZXN0aW5hdGlvbjwvZW0+IG9mIGFsaWFzZXMuICBBbGlhc2luZyBvY2N1cnMgYmVmb3JlCi0gICAgPGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiPiZsdDtEaXJlY3RvcnkmZ3Q7PC9kaXJlY3RpdmU+IHNlY3Rpb25zCi0gICAgYXJlIGNoZWNrZWQsIHNvIG9ubHkgdGhlIGRlc3RpbmF0aW9uIG9mIGFsaWFzZXMgYXJlIGFmZmVjdGVkLgotICAgIChOb3RlIGhvd2V2ZXIgPGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiPiZsdDtMb2NhdGlvbiZndDs8L2RpcmVjdGl2ZT4KLSAgICBzZWN0aW9ucyBhcmUgcnVuIHRocm91Z2ggb25jZSBiZWZvcmUgYWxpYXNlcyBhcmUgcGVyZm9ybWVkLCBzbwotICAgIHRoZXkgd2lsbCBhcHBseS4pPC9wPgotCi08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+QWxpYXNNYXRjaDwvbmFtZT4KLTxkZXNjcmlwdGlvbj5NYXBzIFVSTHMgdG8gZmlsZXN5c3RlbSBsb2NhdGlvbnMgdXNpbmcgcmVndWxhciAKLWV4cHJlc3Npb25zPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+QWxpYXNNYXRjaCA8ZW0+cmVnZXgKLSAgICBmaWxlLXBhdGg8L2VtPnw8ZW0+ZGlyZWN0b3J5LXBhdGg8L2VtPjwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoaXMgZGlyZWN0aXZlIGlzIGVxdWl2YWxlbnQgdG8gPGRpcmVjdGl2ZQotICAgIG1vZHVsZT0ibW9kX2FsaWFzIj5BbGlhczwvZGlyZWN0aXZlPiwgYnV0IG1ha2VzIHVzZSBvZiBzdGFuZGFyZAotICAgIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGluc3RlYWQgb2Ygc2ltcGxlIHByZWZpeCBtYXRjaGluZy4gVGhlCi0gICAgc3VwcGxpZWQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgVVJMLXBhdGgsIGFuZAotICAgIGlmIGl0IG1hdGNoZXMsIHRoZSBzZXJ2ZXIgd2lsbCBzdWJzdGl0dXRlIGFueSBwYXJlbnRoZXNpemVkCi0gICAgbWF0Y2hlcyBpbnRvIHRoZSBnaXZlbiBzdHJpbmcgYW5kIHVzZSBpdCBhcyBhIGZpbGVuYW1lLiBGb3IKLSAgICBleGFtcGxlLCB0byBhY3RpdmF0ZSB0aGUgPGNvZGU+L2ljb25zPC9jb2RlPiBkaXJlY3RvcnksIG9uZSBtaWdodAotICAgIHVzZTo8L3A+Ci08ZXhhbXBsZT4KLSAgICBBbGlhc01hdGNoIF4vaWNvbnMoLiopIC91c3IvbG9jYWwvYXBhY2hlL2ljb25zJDEKLTwvZXhhbXBsZT4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5SZWRpcmVjdDwvbmFtZT4KLTxkZXNjcmlwdGlvbj5TZW5kcyBhbiBleHRlcm5hbCByZWRpcmVjdCBhc2tpbmcgdGhlIGNsaWVudCB0byBmZXRjaAotYSBkaWZmZXJlbnQgVVJMPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+UmVkaXJlY3QgWzxlbT5zdGF0dXM8L2VtPl0gPGVtPlVSTC1wYXRoIFVSTDwvZW0+PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+RmlsZUluZm88L292ZXJyaWRlPgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIFJlZGlyZWN0IGRpcmVjdGl2ZSBtYXBzIGFuIG9sZCBVUkwgaW50byBhIG5ldyBvbmUuIFRoZQotICAgIG5ldyBVUkwgaXMgcmV0dXJuZWQgdG8gdGhlIGNsaWVudCB3aGljaCBhdHRlbXB0cyB0byBmZXRjaCBpdAotICAgIGFnYWluIHdpdGggdGhlIG5ldyBhZGRyZXNzLiA8ZW0+VVJMLXBhdGg8L2VtPiBhICglLWRlY29kZWQpCi0gICAgcGF0aDsgYW55IHJlcXVlc3RzIGZvciBkb2N1bWVudHMgYmVnaW5uaW5nIHdpdGggdGhpcyBwYXRoIHdpbGwKLSAgICBiZSByZXR1cm5lZCBhIHJlZGlyZWN0IGVycm9yIHRvIGEgbmV3ICglLWVuY29kZWQpIFVSTCBiZWdpbm5pbmcKLSAgICB3aXRoIDxlbT5VUkw8L2VtPi48L3A+Ci0KLSAgICA8cD5FeGFtcGxlOjwvcD4KLQotPGV4YW1wbGU+UmVkaXJlY3QgL3NlcnZpY2UgaHR0cDovL2ZvbzIuYmFyLmNvbS9zZXJ2aWNlPC9leGFtcGxlPgotCi0gICAgPHA+SWYgdGhlIGNsaWVudCByZXF1ZXN0cyBodHRwOi8vbXlzZXJ2ZXIvc2VydmljZS9mb28udHh0LCBpdAotICAgIHdpbGwgYmUgdG9sZCB0byBhY2Nlc3MgaHR0cDovL2ZvbzIuYmFyLmNvbS9zZXJ2aWNlL2Zvby50eHQKLSAgICBpbnN0ZWFkLjwvcD4KLQotPG5vdGU+PHRpdGxlPk5vdGU8L3RpdGxlPiA8cD5SZWRpcmVjdCBkaXJlY3RpdmVzIHRha2UgcHJlY2VkZW5jZSBvdmVyCi1BbGlhcyBhbmQgU2NyaXB0QWxpYXMgZGlyZWN0aXZlcywgaXJyZXNwZWN0aXZlIG9mIHRoZWlyIG9yZGVyaW5nIGluCi10aGUgY29uZmlndXJhdGlvbiBmaWxlLiBBbHNvLCA8ZW0+VVJMLXBhdGg8L2VtPiBtdXN0IGJlIGFuIGFic29sdXRlCi1wYXRoLCBub3QgYSByZWxhdGl2ZSBwYXRoLCBldmVuIHdoZW4gdXNlZCB3aXRoIC5odGFjY2VzcyBmaWxlcyBvcgotaW5zaWRlIG9mIDxkaXJlY3RpdmUgbW9kdWxlPSJjb3JlIj4mbHQ7RGlyZWN0b3J5Jmd0OzwvZGlyZWN0aXZlPgotc2VjdGlvbnMuPC9wPjwvbm90ZT4KLQotICAgIDxwPklmIG5vIDxlbT5zdGF0dXM8L2VtPiBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIHJlZGlyZWN0IHdpbGwKLSAgICBiZSAidGVtcG9yYXJ5IiAoSFRUUCBzdGF0dXMgMzAyKS4gVGhpcyBpbmRpY2F0ZXMgdG8gdGhlIGNsaWVudAotICAgIHRoYXQgdGhlIHJlc291cmNlIGhhcyBtb3ZlZCB0ZW1wb3JhcmlseS4gVGhlIDxlbT5zdGF0dXM8L2VtPgotICAgIGFyZ3VtZW50IGNhbiBiZSB1c2VkIHRvIHJldHVybiBvdGhlciBIVFRQIHN0YXR1cyBjb2Rlczo8L3A+Ci0KLSAgICA8ZGw+Ci0gICAgICA8ZHQ+cGVybWFuZW50PC9kdD4KLQotICAgICAgPGRkPlJldHVybnMgYSBwZXJtYW5lbnQgcmVkaXJlY3Qgc3RhdHVzICgzMDEpIGluZGljYXRpbmcgdGhhdAotICAgICAgdGhlIHJlc291cmNlIGhhcyBtb3ZlZCBwZXJtYW5lbnRseS48L2RkPgotCi0gICAgICA8ZHQ+dGVtcDwvZHQ+Ci0KLSAgICAgIDxkZD5SZXR1cm5zIGEgdGVtcG9yYXJ5IHJlZGlyZWN0IHN0YXR1cyAoMzAyKS4gVGhpcyBpcyB0aGUKLSAgICAgIGRlZmF1bHQuPC9kZD4KLQotICAgICAgPGR0PnNlZW90aGVyPC9kdD4KLQotICAgICAgPGRkPlJldHVybnMgYSAiU2VlIE90aGVyIiBzdGF0dXMgKDMwMykgaW5kaWNhdGluZyB0aGF0IHRoZQotICAgICAgcmVzb3VyY2UgaGFzIGJlZW4gcmVwbGFjZWQuPC9kZD4KLQotICAgICAgPGR0PmdvbmU8L2R0PgotCi0gICAgICA8ZGQ+UmV0dXJucyBhICJHb25lIiBzdGF0dXMgKDQxMCkgaW5kaWNhdGluZyB0aGF0IHRoZQotICAgICAgcmVzb3VyY2UgaGFzIGJlZW4gcGVybWFuZW50bHkgcmVtb3ZlZC4gV2hlbiB0aGlzIHN0YXR1cyBpcwotICAgICAgdXNlZCB0aGUgPGVtPnVybDwvZW0+IGFyZ3VtZW50IHNob3VsZCBiZSBvbWl0dGVkLjwvZGQ+Ci0gICAgPC9kbD4KLQotICAgIDxwPk90aGVyIHN0YXR1cyBjb2RlcyBjYW4gYmUgcmV0dXJuZWQgYnkgZ2l2aW5nIHRoZSBudW1lcmljCi0gICAgc3RhdHVzIGNvZGUgYXMgdGhlIHZhbHVlIG9mIDxlbT5zdGF0dXM8L2VtPi4gSWYgdGhlIHN0YXR1cyBpcwotICAgIGJldHdlZW4gMzAwIGFuZCAzOTksIHRoZSA8ZW0+dXJsPC9lbT4gYXJndW1lbnQgbXVzdCBiZSBwcmVzZW50LAotICAgIG90aGVyd2lzZSBpdCBtdXN0IGJlIG9taXR0ZWQuIE5vdGUgdGhhdCB0aGUgc3RhdHVzIG11c3QgYmUKLSAgICBrbm93biB0byB0aGUgQXBhY2hlIGNvZGUgKHNlZSB0aGUgZnVuY3Rpb24KLSAgICA8Y29kZT5zZW5kX2Vycm9yX3Jlc3BvbnNlPC9jb2RlPiBpbiBodHRwX3Byb3RvY29sLmMpLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5SZWRpcmVjdE1hdGNoPC9uYW1lPgotPGRlc2NyaXB0aW9uPlNlbmRzIGFuIGV4dGVybmFsIHJlZGlyZWN0IGFza2luZyB0aGUgY2xpZW50IHRvIGZldGNoCi1hIGRpZmZlcmVudCBVUkwgYmFzZWQgb24gYSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2ggb2YgdGhlIAotY3VycmVudCBVUkw8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5SZWRpcmVjdE1hdGNoIFs8ZW0+c3RhdHVzPC9lbT5dIDxlbT5yZWdleCBVUkw8L2VtPjwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0Pjxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPkZpbGVJbmZvPC9vdmVycmlkZT4KLQotPHVzYWdlPgotICAgIDxwPlRoaXMgZGlyZWN0aXZlIGlzIGVxdWl2YWxlbnQgdG8gPGRpcmVjdGl2ZQotICAgIG1vZHVsZT0ibW9kX2FsaWFzIj5SZWRpcmVjdDwvZGlyZWN0aXZlPiwgYnV0IG1ha2VzIHVzZSBvZiBzdGFuZGFyZAotICAgIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGluc3RlYWQgb2Ygc2ltcGxlIHByZWZpeCBtYXRjaGluZy4gVGhlCi0gICAgc3VwcGxpZWQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgVVJMLXBhdGgsIGFuZAotICAgIGlmIGl0IG1hdGNoZXMsIHRoZSBzZXJ2ZXIgd2lsbCBzdWJzdGl0dXRlIGFueSBwYXJlbnRoZXNpemVkCi0gICAgbWF0Y2hlcyBpbnRvIHRoZSBnaXZlbiBzdHJpbmcgYW5kIHVzZSBpdCBhcyBhIGZpbGVuYW1lLiBGb3IKLSAgICBleGFtcGxlLCB0byByZWRpcmVjdCBhbGwgR0lGIGZpbGVzIHRvIGxpa2UtbmFtZWQgSlBFRyBmaWxlcyBvbgotICAgIGFub3RoZXIgc2VydmVyLCBvbmUgbWlnaHQgdXNlOjwvcD4KLTxleGFtcGxlPgotICAgIFJlZGlyZWN0TWF0Y2ggKC4qKVwuZ2lmJCBodHRwOi8vd3d3LmFub3RoZXJzZXJ2ZXIuY29tJDEuanBnCi08L2V4YW1wbGU+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+UmVkaXJlY3RUZW1wPC9uYW1lPgotPGRlc2NyaXB0aW9uPlNlbmRzIGFuIGV4dGVybmFsIHRlbXBvcmFyeSByZWRpcmVjdCBhc2tpbmcgdGhlIGNsaWVudCB0byBmZXRjaAotYSBkaWZmZXJlbnQgVVJMPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+UmVkaXJlY3RUZW1wIDxlbT5VUkwtcGF0aCBVUkw8L2VtPjwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0Pjxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPkZpbGVJbmZvPC9vdmVycmlkZT4KLQotPHVzYWdlPgotICAgIDxwPlRoaXMgZGlyZWN0aXZlIG1ha2VzIHRoZSBjbGllbnQga25vdyB0aGF0IHRoZSBSZWRpcmVjdCBpcwotICAgIG9ubHkgdGVtcG9yYXJ5IChzdGF0dXMgMzAyKS4gRXhhY3RseSBlcXVpdmFsZW50IHRvCi0gICAgPGNvZGU+UmVkaXJlY3QgdGVtcDwvY29kZT4uPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlJlZGlyZWN0UGVybWFuZW50PC9uYW1lPgotPGRlc2NyaXB0aW9uPlNlbmRzIGFuIGV4dGVybmFsIHBlcm1hbmVudCByZWRpcmVjdCBhc2tpbmcgdGhlIGNsaWVudCB0byBmZXRjaAotYSBkaWZmZXJlbnQgVVJMPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+UmVkaXJlY3RQZXJtYW5lbnQgPGVtPlVSTC1wYXRoIFVSTDwvZW0+PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+RmlsZUluZm88L292ZXJyaWRlPgotCi08dXNhZ2U+Ci0gICAgPHA+VGhpcyBkaXJlY3RpdmUgbWFrZXMgdGhlIGNsaWVudCBrbm93IHRoYXQgdGhlIFJlZGlyZWN0IGlzCi0gICAgcGVybWFuZW50IChzdGF0dXMgMzAxKS4gRXhhY3RseSBlcXVpdmFsZW50IHRvIDxjb2RlPlJlZGlyZWN0Ci0gICAgcGVybWFuZW50PC9jb2RlPi48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U2NyaXB0QWxpYXM8L25hbWU+Ci08ZGVzY3JpcHRpb24+TWFwcyBhIFVSTCB0byBhIGZpbGVzeXN0ZW0gbG9jYXRpb24gYW5kIGRlc2lnbmF0ZXMgdGhlCi10YXJnZXQgYXMgYSBDR0kgc2NyaXB0PC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+U2NyaXB0QWxpYXMgCi08ZW0+VVJMLXBhdGggZmlsZS1wYXRoPC9lbT58PGVtPmRpcmVjdG9yeS1wYXRoPC9lbT48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5TY3JpcHRBbGlhczwvZGlyZWN0aXZlPiBkaXJlY3RpdmUgaGFzIHRoZSBzYW1lCi0gICAgYmVoYXZpb3IgYXMgdGhlIDxkaXJlY3RpdmUgbW9kdWxlPSJtb2RfYWxpYXMiPkFsaWFzPC9kaXJlY3RpdmU+Ci0gICAgZGlyZWN0aXZlLCBleGNlcHQgdGhhdCBpbiBhZGRpdGlvbiBpdCBtYXJrcyB0aGUgdGFyZ2V0IGRpcmVjdG9yeQotICAgIGFzIGNvbnRhaW5pbmcgQ0dJIHNjcmlwdHMgdGhhdCB3aWxsIGJlIHByb2Nlc3NlZCBieSA8bW9kdWxlCi0gICAgPm1vZF9jZ2k8L21vZHVsZT4ncyBjZ2ktc2NyaXB0IGhhbmRsZXIuIFVSTHMgd2l0aCBhCi0gICAgKCUtZGVjb2RlZCkgcGF0aCBiZWdpbm5pbmcgd2l0aCA8ZW0+VVJMLXBhdGg8L2VtPiB3aWxsIGJlIG1hcHBlZAotICAgIHRvIHNjcmlwdHMgYmVnaW5uaW5nIHdpdGggdGhlIHNlY29uZCBhcmd1bWVudCB3aGljaCBpcyBhIGZ1bGwKLSAgICBwYXRobmFtZSBpbiB0aGUgbG9jYWwgZmlsZXN5c3RlbS48L3A+Ci0KLSAgICA8cD5FeGFtcGxlOjwvcD4KLQotPGV4YW1wbGU+U2NyaXB0QWxpYXMgL2NnaS1iaW4vIC93ZWIvY2dpLWJpbi88L2V4YW1wbGU+Ci0KLSAgICA8cD5BIHJlcXVlc3QgZm9yIDxjb2RlPmh0dHA6Ly9teXNlcnZlci9jZ2ktYmluL2ZvbzwvY29kZT4gd291bGQgY2F1c2UgdGhlCi0gICAgc2VydmVyIHRvIHJ1biB0aGUgc2NyaXB0IDxjb2RlPi93ZWIvY2dpLWJpbi9mb288L2NvZGU+LjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5TY3JpcHRBbGlhc01hdGNoPC9uYW1lPgotPGRlc2NyaXB0aW9uPk1hcHMgYSBVUkwgdG8gYSBmaWxlc3lzdGVtIGxvY2F0aW9uIHVzaW5nIGEgcmVndWxhciBleHByZXNzaW9uCi1hbmQgZGVzaWduYXRlcyB0aGUgdGFyZ2V0IGFzIGEgQ0dJIHNjcmlwdDwvZGVzY3JpcHRpb24+Ci08c3ludGF4PlNjcmlwdEFsaWFzTWF0Y2gKLTxlbT5yZWdleCBmaWxlLXBhdGg8L2VtPnw8ZW0+ZGlyZWN0b3J5LXBhdGg8L2VtPjwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoaXMgZGlyZWN0aXZlIGlzIGVxdWl2YWxlbnQgdG8gPGRpcmVjdGl2ZSBtb2R1bGU9Im1vZF9hbGlhcyIKLSAgICA+U2NyaXB0QWxpYXM8L2RpcmVjdGl2ZT4sIGJ1dCBtYWtlcyB1c2Ugb2Ygc3RhbmRhcmQKLSAgICByZWd1bGFyIGV4cHJlc3Npb25zLCBpbnN0ZWFkIG9mIHNpbXBsZSBwcmVmaXggbWF0Y2hpbmcuIFRoZQotICAgIHN1cHBsaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIFVSTC1wYXRoLAotICAgIGFuZCBpZiBpdCBtYXRjaGVzLCB0aGUgc2VydmVyIHdpbGwgc3Vic3RpdHV0ZSBhbnkgcGFyZW50aGVzaXplZAotICAgIG1hdGNoZXMgaW50byB0aGUgZ2l2ZW4gc3RyaW5nIGFuZCB1c2UgaXQgYXMgYSBmaWxlbmFtZS4gRm9yCi0gICAgZXhhbXBsZSwgdG8gYWN0aXZhdGUgdGhlIHN0YW5kYXJkIDxjb2RlPi9jZ2ktYmluPC9jb2RlPiwgb25lCi0gICAgbWlnaHQgdXNlOjwvcD4KLTxleGFtcGxlPgotICAgIFNjcmlwdEFsaWFzTWF0Y2ggXi9jZ2ktYmluKC4qKSAvdXNyL2xvY2FsL2FwYWNoZS9jZ2ktYmluJDEKLTwvZXhhbXBsZT4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08L21vZHVsZXN5bm9wc2lzPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2FzaXMuaHRtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfYXNpcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTk3ZTE2Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfYXNpcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPCEtLSVoeXBlcnRleHQgLS0+Ci08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDIuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9hc2lzPC9USVRMRT4KLTwvSEVBRD4KLQotPEJPRFk+Ci08SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9zdWIuZ2lmIiBBTFQ9IiI+Ci08IS0tLyVoeXBlcnRleHQgLS0+Ci08SDE+TW9kdWxlIG1vZF9hc2lzPC9oMT4KLQotVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5tb2RfYXNpcy5jPC9jb2RlPiBmaWxlLCBhbmQKLWlzIGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuIEl0IHByb3ZpZGVzIGZvciA8Y29kZT4uYXNpczwvY29kZT4gZmlsZXMuIEFueQotZG9jdW1lbnQgd2l0aCBtaW1lIHR5cGUgPGNvZGU+aHR0cGQvc2VuZC1hcy1pczwvY29kZT4gd2lsbCBiZSBwcm9jZXNzZWQgYnkKLXRoaXMgbW9kdWxlLgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IGh0dHBkL3NlbmQtYXMtaXN9IG1pbWUgdHlwZSZndDsgLS0+Ci0KLTxoMj5QdXJwb3NlPC9oMj4KLVRvIGFsbG93IGZpbGUgdHlwZXMgdG8gYmUgZGVmaW5lZCBzdWNoIHRoYXQgQXBhY2hlIHNlbmRzIHRoZW0gd2l0aG91dAotYWRkaW5nIEhUVFAgaGVhZGVycy48UD4KLQotVGhpcyBjYW4gYmUgdXNlZCB0byBzZW5kIGFueSBraW5kIG9mIGRhdGEgZnJvbSB0aGUgc2VydmVyLCBpbmNsdWRpbmcgcmVkaXJlY3RzCi1hbmQgb3RoZXIgc3BlY2lhbCBIVFRQIHJlc3BvbnNlcywgd2l0aG91dCByZXF1aXJpbmcgYSBjZ2ktc2NyaXB0IG9yIGFuIG5waAotc2NyaXB0LgotPGgyPlVzYWdlPC9oMj4KLUluIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlLCBkZWZpbmUgYSBuZXcgbWltZSB0eXBlIGNhbGxlZAotPGNvZGU+aHR0cGQvc2VuZC1hcy1pczwvY29kZT4gZS5nLgotPGJsb2NrcXVvdGU+PGNvZGU+QWRkVHlwZSBodHRwZC9zZW5kLWFzLWlzIGFzaXM8L2NvZGU+PC9ibG9ja3F1b3RlPgotdGhpcyBkZWZpbmVzIHRoZSA8Y29kZT4uYXNpczwvY29kZT4gZmlsZSBleHRlbnNpb24gYXMgYmVpbmcgb2YgdGhlIG5ldwotPGNvZGU+aHR0cGQvc2VuZC1hcy1pczwvY29kZT4gbWltZSB0eXBlLiBUaGUgY29udGVudHMgb2YgYW55IGZpbGUgd2l0aCBhCi08Y29kZT4uYXNpczwvY29kZT4gZXh0ZW5zaW9uIHdpbGwgdGhlbiBiZSBzZW50IGJ5IEFwYWNoZSB0byB0aGUgY2xpZW50IHdpdGgKLWFsbW9zdCBubyBjaGFuZ2VzLiBDbGllbnRzIHdpbGwgbmVlZCBIVFRQIGhlYWRlcnMgdG8gYmUgYXR0YWNoZWQsIHNvIGRvIG5vdAotZm9yZ2V0IHRoZW0uIEEgU3RhdHVzOiBoZWFkZXIgaXMgYWxzbyByZXF1aXJlZDsgdGhlIGRhdGEgc2hvdWxkIGJlIHRoZQotMy1kaWdpdCBIVFRQIHJlc3BvbnNlIGNvZGUsIGZvbGxvd2VkIGJ5IGEgdGV4dHVhbCBtZXNzYWdlLjxwPgotCi1IZXJlJ3MgYW4gZXhhbXBsZSBvZiBhIGZpbGUgd2hvc2UgY29udGVudHMgYXJlIHNlbnQgPGVtPmFzIGlzPC9lbT4gc28gYXMgdG8KLXRlbGwgdGhlIGNsaWVudCB0aGF0IGEgZmlsZSBoYXMgcmVkaXJlY3RlZC4KLTxibG9ja3F1b3RlPjxjb2RlPgotU3RhdHVzOiAzMDIgTm93IHdoZXJlIGRpZCBJIGxlYXZlIHRoYXQgVVJMIDxicj4KLUxvY2F0aW9uOiBodHRwOi8veHl6LmFiYy5jb20vZm9vL2Jhci5odG1sIDxicj4KLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sIDxicj4KLTxicj4KLSZsdDtIVE1MJmd0OyA8YnI+Ci0mbHQ7SEVBRCZndDsgPGJyPgotJmx0O1RJVExFJmd0O0xhbWUgZXhjdXNlcydSJ3VzJmx0Oy9USVRMRSZndDsgPGJyPgotJmx0Oy9IRUFEJmd0OyA8YnI+Ci0mbHQ7Qk9EWSZndDsgPGJyPgotJmx0O0gxJmd0O0ZyZWQncyBleGNlcHRpb25hbGx5IHdvbmRlcmZ1bCBwYWdlIGhhcyBtb3ZlZCB0byA8YnI+Ci0mbHQ7QSBIUkVGPSJodHRwOi8veHl6LmFiYy5jb20vZm9vL2Jhci5odG1sIiZndDtKb2UncyZsdDsvQSZndDsgc2l0ZS4gIDxicj4KLSZsdDsvSDEmZ3Q7IDxicj4KLSZsdDsvQk9EWSZndDsgPGJyPgotJmx0Oy9IVE1MJmd0OwotPC9jb2RlPjwvYmxvY2txdW90ZT4KLU5vdGVzOiB0aGUgc2VydmVyIGFsd2F5cyBhZGRzIGEgRGF0ZTogYW5kIFNlcnZlcjogaGVhZGVyIHRvIHRoZSBkYXRhIHJldHVybmVkCi10byB0aGUgY2xpZW50LCBzbyB0aGVzZSBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBmaWxlLgotVGhlIHNlcnZlciBkb2VzIDxlbT5ub3Q8L2VtPiBhZGQgYSBMYXN0LU1vZGlmaWVkIGhlYWRlcjsgaXQgcHJvYmFibHkgc2hvdWxkLgotPFA+Ci0KLTwhLS0laHlwZXJ0ZXh0IC0tPgotPEhSPgotCi08QSBIUkVGPSIuLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2hvbWUuZ2lmIiBBTFQ9IkhvbWUiPjwvQT4KLTxBIEhSRUY9Ii4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9pbmRleC5naWYiIEFMVD0iSW5kZXgiPjwvQT4KLTwvQk9EWT4KLTwvSFRNTD4KLTwhLS0vJWh5cGVydGV4dCAtLT4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfYXNpcy54bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2FzaXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzFlMmI2Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfYXNpcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9Ii4uL3N0eWxlL21hbnVhbC54c2wiPz4KLTxtb2R1bGVzeW5vcHNpcz4KLQotPG5hbWU+bW9kX2FzaXM8L25hbWU+Ci08ZGVzY3JpcHRpb24+U2VuZHMgZmlsZXMgdGhhdCBjb250YWluIHRoZWlyIG93bgotSFRUUCBoZWFkZXJzPC9kZXNjcmlwdGlvbj4KLTxzdGF0dXM+QmFzZTwvc3RhdHVzPgotPHNvdXJjZWZpbGU+bW9kX2FzaXMuYzwvc291cmNlZmlsZT4KLTxpZGVudGlmaWVyPmFzaXNfbW9kdWxlPC9pZGVudGlmaWVyPgotCi08c3VtbWFyeT4KLSAgICA8cD5UaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgaGFuZGxlciA8Y29kZT5zZW5kLWFzLWlzPC9jb2RlPgotICAgIHdoaWNoIGNhdXNlcyBBcGFjaGUgdG8gc2VuZCB0aGUgZG9jdW1lbnQgd2l0aG91dCBhZGRpbmcgbW9zdCBvZgotICAgIHRoZSB1c3VhbCBIVFRQIGhlYWRlcnMuPC9wPgotCi0gICAgPHA+VGhpcyBjYW4gYmUgdXNlZCB0byBzZW5kIGFueSBraW5kIG9mIGRhdGEgZnJvbSB0aGUgc2VydmVyLAotICAgIGluY2x1ZGluZyByZWRpcmVjdHMgYW5kIG90aGVyIHNwZWNpYWwgSFRUUCByZXNwb25zZXMsIHdpdGhvdXQKLSAgICByZXF1aXJpbmcgYSBjZ2ktc2NyaXB0IG9yIGFuIG5waCBzY3JpcHQuPC9wPgotCi0gICAgPHA+Rm9yIGhpc3RvcmljYWwgcmVhc29ucywgdGhpcyBtb2R1bGUgd2lsbCBhbHNvIHByb2Nlc3MgYW55Ci0gICAgZmlsZSB3aXRoIHRoZSBtaW1lIHR5cGUgPGNvZGU+aHR0cGQvc2VuZC1hcy1pczwvY29kZT4uPC9wPgotPC9zdW1tYXJ5PgotCi08c2VjdGlvbj48dGl0bGU+VXNhZ2U8L3RpdGxlPgotCi0gICAgPHA+SW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGUsIGFzc29jaWF0ZSBmaWxlcyB3aXRoIHRoZQotICAgIDxjb2RlPnNlbmQtYXMtaXM8L2NvZGU+IGhhbmRsZXIgPGVtPmUuZy48L2VtPjwvcD4KLQotPGV4YW1wbGU+QWRkSGFuZGxlciBzZW5kLWFzLWlzIGFzaXM8L2V4YW1wbGU+Ci0KLSAgICA8cD5UaGUgY29udGVudHMgb2YgYW55IGZpbGUgd2l0aCBhIDxjb2RlPi5hc2lzPC9jb2RlPiBleHRlbnNpb24KLSAgICB3aWxsIHRoZW4gYmUgc2VudCBieSBBcGFjaGUgdG8gdGhlIGNsaWVudCB3aXRoIGFsbW9zdCBubwotICAgIGNoYW5nZXMuIENsaWVudHMgd2lsbCBuZWVkIEhUVFAgaGVhZGVycyB0byBiZSBhdHRhY2hlZCwgc28gZG8KLSAgICBub3QgZm9yZ2V0IHRoZW0uIEEgU3RhdHVzOiBoZWFkZXIgaXMgYWxzbyByZXF1aXJlZDsgdGhlIGRhdGEKLSAgICBzaG91bGQgYmUgdGhlIDMtZGlnaXQgSFRUUCByZXNwb25zZSBjb2RlLCBmb2xsb3dlZCBieSBhIHRleHR1YWwKLSAgICBtZXNzYWdlLjwvcD4KLQotICAgIDxwPkhlcmUncyBhbiBleGFtcGxlIG9mIGEgZmlsZSB3aG9zZSBjb250ZW50cyBhcmUgc2VudCA8ZW0+YXMKLSAgICBpczwvZW0+IHNvIGFzIHRvIHRlbGwgdGhlIGNsaWVudCB0aGF0IGEgZmlsZSBoYXMKLSAgICByZWRpcmVjdGVkLjwvcD4KLQotCi08ZXhhbXBsZT5TdGF0dXM6IDMwMSBOb3cgd2hlcmUgZGlkIEkgbGVhdmUgdGhhdCBVUkw8YnIgLz4KLSAgICAgICBMb2NhdGlvbjogaHR0cDovL3h5ei5hYmMuY29tL2Zvby9iYXIuaHRtbDxiciAvPgotICAgICAgIENvbnRlbnQtdHlwZTogdGV4dC9odG1sPGJyIC8+Ci0gICAgICA8YnIgLz4KLSAgICAgICAmbHQ7SFRNTCZndDs8YnIgLz4KLSAgICAgICAmbHQ7SEVBRCZndDs8YnIgLz4KLSAgICAgICAmbHQ7VElUTEUmZ3Q7TGFtZSBleGN1c2VzJ1IndXMmbHQ7L1RJVExFJmd0OzxiciAvPgotICAgICAgICZsdDsvSEVBRCZndDs8YnIgLz4KLSAgICAgICAmbHQ7Qk9EWSZndDs8YnIgLz4KLSAgICAgICAmbHQ7SDEmZ3Q7RnJlZCdzIGV4Y2VwdGlvbmFsbHkgd29uZGVyZnVsIHBhZ2UgaGFzIG1vdmVkCi0gICAgICB0bzxiciAvPgotICAgICAgICZsdDtBCi0gICAgICBIUkVGPSJodHRwOi8veHl6LmFiYy5jb20vZm9vL2Jhci5odG1sIiZndDtKb2UncyZsdDsvQSZndDsKLSAgICAgIHNpdGUuPGJyIC8+Ci0gICAgICAgJmx0Oy9IMSZndDs8YnIgLz4KLSAgICAgICAmbHQ7L0JPRFkmZ3Q7PGJyIC8+Ci0gICAgICAgJmx0Oy9IVE1MJmd0OwotPC9leGFtcGxlPgotCi0gICAgPHA+Tm90ZXM6IHRoZSBzZXJ2ZXIgYWx3YXlzIGFkZHMgYSBEYXRlOiBhbmQgU2VydmVyOiBoZWFkZXIgdG8KLSAgICB0aGUgZGF0YSByZXR1cm5lZCB0byB0aGUgY2xpZW50LCBzbyB0aGVzZSBzaG91bGQgbm90IGJlCi0gICAgaW5jbHVkZWQgaW4gdGhlIGZpbGUuIFRoZSBzZXJ2ZXIgZG9lcyA8ZW0+bm90PC9lbT4gYWRkIGEKLSAgICBMYXN0LU1vZGlmaWVkIGhlYWRlcjsgaXQgcHJvYmFibHkgc2hvdWxkLiA8L3A+Ci08L3NlY3Rpb24+Ci0KLTwvbW9kdWxlc3lub3BzaXM+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2F1dGhfZGlnZXN0Lmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2F1dGhfZGlnZXN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YzdmMDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9hdXRoX2RpZ2VzdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+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+PC9BPiBBdmFpbGFibGUgaW4gQXBhY2hlIDEuMy44IGFuZCBsYXRlcgotCi08UD5UaGUgQXV0aERpZ2VzdERvbWFpbiBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIFVSSXMKLXdoaWNoIGFyZSBpbiB0aGUgc2FtZSBwcm90ZWN0aW9uIHNwYWNlIChpLmUuIHVzZSB0aGUgc2FtZSByZWFsbSBhbmQKLXVzZXJuYW1lL3Bhc3N3b3JkIGluZm8pLiBUaGUgc3BlY2lmaWVkIFVSSXMgYXJlIHByZWZpeGVzLCBpLmUuIHRoZSBjbGllbnQKLXdpbGwgYXNzdW1lIHRoYXQgYWxsIFVSSXMgImJlbG93IiB0aGVzZSBhcmUgYWxzbyBwcm90ZWN0ZWQgYnkgdGhlIHNhbWUKLXVzZXJuYW1lL3Bhc3N3b3JkLiBUaGUgVVJJcyBtYXkgYmUgZWl0aGVyIGFic29sdXRlIFVSSXMgKGkuZS4gaW5sdWRpbmcgYQotc2NoZW1lLCBob3N0LCBwb3J0LCBldGMpIG9yIHJlbGF0aXZlIFVSSXMuCi0KLTxQPlRoaXMgZGlyZWN0aXZlIDxlbT5zaG91bGQ8L2VtPiBhbHdheXMgYmUgc3BlY2lmaWVkIGFuZCBjb250YWluIGF0IGxlYXN0Ci10aGUgKHNldCBvZikgcm9vdCBVUkkocykgZm9yIHRoaXMgc3BhY2UuIE9taXRpbmcgdG8gZG8gc28gd2lsbCBjYXVzZSB0aGUKLWNsaWVudCB0byBzZW5kIHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBmb3IgPGVtPmV2ZXJ5IHJlcXVlc3Q8L2VtPiBzZW50IHRvCi10aGlzIHNlcnZlci4gQXBhcnQgZnJvbSBpbmNyZWFzaW5nIHRoZSBzaXplIG9mIHRoZSByZXF1ZXN0LCBpdCBtYXkgYWxzbwotaGF2ZSBhIGRldHJpbWVudGFsIGVmZmVjdCBvbiBwZXJmb3JtYW5jZSBpZiAiQXV0aERpZ2VzdE5jQ2hlY2siIGlzIG9uLgotCi08UD5UaGUgVVJJcyBzcGVjaWZpZWQgY2FuIGFsc28gcG9pbnQgdG8gZGlmZmVyZW50IHNlcnZlcnMsIGluIHdoaWNoIGNhc2UKLWNsaWVudHMgKHdoaWNoIHVuZGVyc3RhbmQgdGhpcykgd2lsbCB0aGVuIHNoYXJlIHVzZXJuYW1lL3Bhc3N3b3JkIGluZm8KLWFjcm9zcyBtdWx0aXBsZSBzZXJ2ZXJzIHdpdGhvdXQgcHJvbXB0aW5nIHRoZSB1c2VyIGVhY2ggdGltZS4KLQotCi08SFI+Ci0KLTxIMz48QSBOQU1FPSJ1c2luZ2RpZ2VzdCI+VXNpbmcgRGlnZXN0IEF1dGhlbnRpY2F0aW9uPC9BPjwvSDM+Ci0KLTxQPlVzaW5nIE1ENSBEaWdlc3QgYXV0aGVudGljYXRpb24gaXMgdmVyeSBzaW1wbGUuIFNpbXBseSBzZXQgdXAKLWF1dGhlbnRpY2F0aW9uIG5vcm1hbGx5LCB1c2luZyAiQXV0aFR5cGUgRGlnZXN0IiBhbmQgIkF1dGhEaWdlc3RGaWxlIgotaW5zdGVhZCBvZiB0aGUgbm9ybWFsICJBdXRoVHlwZSBCYXNpYyIgYW5kICJBdXRoVXNlckZpbGUiOyBhbHNvLAotcmVwbGFjZSBhbnkgIkF1dGhHcm91cEZpbGUiIHdpdGggIkF1dGhEaWdlc3RHcm91cEZpbGUiLiBUaGVuIGFkZCBhCi0iQXV0aERpZ2VzdERvbWFpbiIgZGlyZWN0aXZlIGNvbnRhaW5pbmcgYXQgbGVhc3QgdGhlIHJvb3QgVVJJKHMpIGZvcgotdGhpcyBwcm90ZWN0aW9uIHNwYWNlLiBFeGFtcGxlOgotCi08UFJFPgotICAmbHQ7TG9jYXRpb24gL3ByaXZhdGUvJmd0OwotICBBdXRoVHlwZSBEaWdlc3QKLSAgQXV0aE5hbWUgInByaXZhdGUgYXJlYSIKLSAgQXV0aERpZ2VzdERvbWFpbiAvcHJpdmF0ZS8gaHR0cDovL21pcnJvci5teS5kb20vcHJpdmF0ZTIvCi0gIEF1dGhEaWdlc3RGaWxlIC93ZWIvYXV0aC8uZGlnZXN0X3B3Ci0gIHJlcXVpcmUgdmFsaWQtdXNlcgotICAmbHQ7L0xvY2F0aW9uJmd0OwotPC9QUkU+Ci0KLTxQPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gTUQ1IGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVzIGEgbW9yZSBzZWN1cmUKLXBhc3N3b3JkIHN5c3RlbSB0aGFuIEJhc2ljIGF1dGhlbnRpY2F0aW9uLCBidXQgb25seSB3b3JrcyB3aXRoIHN1cHBvcnRpbmcKLWJyb3dzZXJzLiBBcyBvZiB0aGlzIHdyaXRpbmcgKEp1bHkgMTk5OSksIHRoZSBvbmx5IG1ham9yIGJyb3dzZXJzIHdoaWNoCi1zdXBwb3J0IGRpZ2VzdCBhdXRoZW50aWNhdGlvbiBhcmUgPEEKLUhSRUY9Imh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS93aW5kb3dzL2llLyI+SW50ZXJuZXQgRXhwbG9kZXIgNS4wPC9BPiBhbmQKLTxBIEhSRUY9Imh0dHA6Ly93d3cudzMub3JnL0FtYXlhLyI+QW1heWE8L0E+LiBUaGVyZWZvcmUsIHdlIGRvIG5vdAotcmVjb21tZW5kIHVzaW5nIHRoaXMgZmVhdHVyZSBvbiBhIGxhcmdlIEludGVybmV0IHNpdGUuIEhvd2V2ZXIsIGZvcgotcGVyc29uYWwgYW5kIGludHJhLW5ldCB1c2UsIHdoZXJlIGJyb3dzZXIgdXNlcnMgY2FuIGJlIGNvbnRyb2xsZWQsIGl0IGlzCi1pZGVhbC4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9hdXRoX2RpZ2VzdC54bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2F1dGhfZGlnZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QzYzU0NC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX2F1dGhfZGlnZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9Ii4uL3N0eWxlL21hbnVhbC54c2wiPz4KLTxtb2R1bGVzeW5vcHNpcz4KLTxuYW1lPm1vZF9hdXRoX2RpZ2VzdDwvbmFtZT4KLTxkZXNjcmlwdGlvbj5Vc2VyIGF1dGhlbnRpY2F0aW9uIHVzaW5nIE1ENQotICAgIERpZ2VzdCBBdXRoZW50aWNhdGlvbi48L2Rlc2NyaXB0aW9uPgotPHN0YXR1cz5FeHBlcmltZW50YWw8L3N0YXR1cz4KLTxzb3VyY2VmaWxlPm1vZF9hdXRoX2RpZ2VzdC5jPC9zb3VyY2VmaWxlPgotPGlkZW50aWZpZXI+YXV0aF9kaWdlc3RfbW9kdWxlPC9pZGVudGlmaWVyPgotCi08c3VtbWFyeT4KLSAgICA8cD5UaGlzIG1vZHVsZSBpbXBsZW1lbnRzIEhUVFAgRGlnZXN0IEF1dGhlbnRpY2F0aW9uLiAgSG93ZXZlciwgaXQKLSAgICBoYXMgbm90IGJlZW4gZXh0ZW5zaXZlbHkgdGVzdGVkIGFuZCBpcyB0aGVyZWZvcmUgbWFya2VkCi0gICAgZXhwZXJpbWVudGFsLjwvcD4KLTwvc3VtbWFyeT4KLQotPHNlZWFsc28+PGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiPkF1dGhOYW1lPC9kaXJlY3RpdmU+PC9zZWVhbHNvPgotPHNlZWFsc28+PGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiPkF1dGhUeXBlPC9kaXJlY3RpdmU+PC9zZWVhbHNvPgotPHNlZWFsc28+PGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiPlJlcXVpcmU8L2RpcmVjdGl2ZT48L3NlZWFsc28+Ci08c2VlYWxzbz48ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSI+U2F0aXNmeTwvZGlyZWN0aXZlPjwvc2VlYWxzbz4KLQotPHNlY3Rpb24+PHRpdGxlPlVzaW5nIERpZ2VzdCBBdXRoZW50aWNhdGlvbjwvdGl0bGU+Ci0KLSAgICA8cD5Vc2luZyBNRDUgRGlnZXN0IGF1dGhlbnRpY2F0aW9uIGlzIHZlcnkgc2ltcGxlLiBTaW1wbHkgc2V0Ci0gICAgdXAgYXV0aGVudGljYXRpb24gbm9ybWFsbHksIHVzaW5nICJBdXRoVHlwZSBEaWdlc3QiIGFuZAotICAgICJBdXRoRGlnZXN0RmlsZSIgaW5zdGVhZCBvZiB0aGUgbm9ybWFsICJBdXRoVHlwZSBCYXNpYyIgYW5kCi0gICAgIkF1dGhVc2VyRmlsZSI7IGFsc28sIHJlcGxhY2UgYW55ICJBdXRoR3JvdXBGaWxlIiB3aXRoCi0gICAgIkF1dGhEaWdlc3RHcm91cEZpbGUiLiBUaGVuIGFkZCBhICJBdXRoRGlnZXN0RG9tYWluIiBkaXJlY3RpdmUKLSAgICBjb250YWluaW5nIGF0IGxlYXN0IHRoZSByb290IFVSSShzKSBmb3IgdGhpcyBwcm90ZWN0aW9uIHNwYWNlLgotICAgIEV4YW1wbGU6PC9wPgotPGV4YW1wbGU+Ci0gICZsdDtMb2NhdGlvbiAvcHJpdmF0ZS8mZ3Q7PGJyIC8+Ci0gIEF1dGhUeXBlIERpZ2VzdDxiciAvPgotICBBdXRoTmFtZSAicHJpdmF0ZSBhcmVhIjxiciAvPgotICBBdXRoRGlnZXN0RG9tYWluIC9wcml2YXRlLyBodHRwOi8vbWlycm9yLm15LmRvbS9wcml2YXRlMi88YnIgLz4KLSAgQXV0aERpZ2VzdEZpbGUgL3dlYi9hdXRoLy5kaWdlc3RfcHc8YnIgLz4KLSAgUmVxdWlyZSB2YWxpZC11c2VyPGJyIC8+Ci0gICZsdDsvTG9jYXRpb24mZ3Q7Ci08L2V4YW1wbGU+Ci0KLTxub3RlPjx0aXRsZT5Ob3RlPC90aXRsZT4KLSAgICA8cD5NRDUgYXV0aGVudGljYXRpb24gcHJvdmlkZXMgYSBtb3JlCi0gICAgc2VjdXJlIHBhc3N3b3JkIHN5c3RlbSB0aGFuIEJhc2ljIGF1dGhlbnRpY2F0aW9uLCBidXQgb25seQotICAgIHdvcmtzIHdpdGggc3VwcG9ydGluZyBicm93c2Vycy4gQXMgb2YgdGhpcyB3cml0aW5nIChPY3RvYmVyIDIwMDEpLAotICAgIHRoZSBvbmx5IG1ham9yIGJyb3dzZXJzIHdoaWNoIHN1cHBvcnQgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIGFyZQotICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cub3BlcmEuY29tLyI+T3BlcmEgNC4wPC9hPiwKLSAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vd2luZG93cy9pZS8iPk1TIEludGVybmV0Ci0gICAgRXhwbG9yZXIgNS4wPC9hPiBhbmQgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQW1heWEvIj5BbWF5YTwvYT4uCi0gICAgVGhlcmVmb3JlLCB3ZSBkbyBub3QgeWV0IHJlY29tbWVuZCB1c2luZyB0aGlzIGZlYXR1cmUgb24gYSBsYXJnZQotICAgIEludGVybmV0IHNpdGUuIEhvd2V2ZXIsIGZvciBwZXJzb25hbCBhbmQgaW50cmEtbmV0IHVzZSwgd2hlcmUKLSAgICBicm93c2VyIHVzZXJzIGNhbiBiZSBjb250cm9sbGVkLCBpdCBpcyBpZGVhbC48L3A+Ci08L25vdGU+Ci08L3NlY3Rpb24+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkF1dGhEaWdlc3RGaWxlPC9uYW1lPgotPGRlc2NyaXB0aW9uPkxvY2F0aW9uIG9mIHRoZSB0ZXh0IGZpbGUgY29udGFpbmluZyB0aGUgbGlzdAotb2YgdXNlcnMgYW5kIGVuY29kZWQgcGFzc3dvcmRzIGZvciBkaWdlc3QgYXV0aGVudGljYXRpb248L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5BdXRoRGlnZXN0RmlsZSA8ZW0+ZmlsZS1wYXRoPC9lbT48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT5BdXRoQ29uZmlnPC9vdmVycmlkZT4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPkF1dGhEaWdlc3RGaWxlPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBzZXRzIHRoZQotICAgIG5hbWUgb2YgYSB0ZXh0dWFsIGZpbGUgY29udGFpbmluZyB0aGUgbGlzdCBvZiB1c2VycyBhbmQgZW5jb2RlZAotICAgIHBhc3N3b3JkcyBmb3IgZGlnZXN0IGF1dGhlbnRpY2F0aW9uLiA8ZW0+RmlsZS1wYXRoPC9lbT4gaXMgdGhlCi0gICAgYWJzb2x1dGUgcGF0aCB0byB0aGUgdXNlciBmaWxlLjwvcD4KLQotICAgIDxwPlRoZSBkaWdlc3QgZmlsZSB1c2VzIGEgc3BlY2lhbCBmb3JtYXQuIEZpbGVzIGluIHRoaXMgZm9ybWF0Ci0gICAgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIDxhCi0gICAgaHJlZj0iLi4vcHJvZ3JhbXMvaHRkaWdlc3QuaHRtbCI+aHRkaWdlc3Q8L2E+IHV0aWxpdHkgZm91bmQgaW4KLSAgICB0aGUgc3VwcG9ydC8gc3ViZGlyZWN0b3J5IG9mIHRoZSBBcGFjaGUgZGlzdHJpYnV0aW9uLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5BdXRoRGlnZXN0R3JvdXBGaWxlPC9uYW1lPgotPGRlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIHRleHQgZmlsZSBjb250YWluaW5nIHRoZSBsaXN0IG9mIGdyb3VwcwotZm9yIGRpZ2VzdCBhdXRoZW50aWNhdGlvbjwvZGVzY3JpcHRpb24+Ci08c3ludGF4PkF1dGhEaWdlc3RHcm91cEZpbGUgPGVtPmZpbGUtcGF0aDwvZW0+PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0Pjxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+QXV0aENvbmZpZzwvb3ZlcnJpZGU+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5BdXRoRGlnZXN0R3JvdXBGaWxlPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBzZXRzCi0gICAgdGhlIG5hbWUgb2YgYSB0ZXh0dWFsIGZpbGUgY29udGFpbmluZyB0aGUgbGlzdCBvZiBncm91cHMgYW5kIHRoZWlyCi0gICAgbWVtYmVycyAodXNlciBuYW1lcykuIDxlbT5GaWxlLXBhdGg8L2VtPiBpcyB0aGUgYWJzb2x1dGUgcGF0aCB0bwotICAgIHRoZSBncm91cCBmaWxlLjwvcD4KLQotICAgIDxwPkVhY2ggbGluZSBvZiB0aGUgZ3JvdXAgZmlsZSBjb250YWlucyBhIGdyb3VwbmFtZSBmb2xsb3dlZCBieQotICAgIGEgY29sb24sIGZvbGxvd2VkIGJ5IHRoZSBtZW1iZXIgdXNlcm5hbWVzIHNlcGFyYXRlZCBieSBzcGFjZXMuCi0gICAgRXhhbXBsZTo8L3A+Ci0KLTxleGFtcGxlPm15Z3JvdXA6IGJvYiBqb2UgYW5uZTwvZXhhbXBsZT4KLQotICAgIDxwPk5vdGUgdGhhdCBzZWFyY2hpbmcgbGFyZ2UgdGV4dCBmaWxlcyBpcyA8ZW0+dmVyeTwvZW0+Ci0gICAgaW5lZmZpY2llbnQuPC9wPgotCi0gICAgPHA+U2VjdXJpdHk6IG1ha2Ugc3VyZSB0aGF0IHRoZSBBdXRoR3JvdXBGaWxlIGlzIHN0b3JlZCBvdXRzaWRlCi0gICAgdGhlIGRvY3VtZW50IHRyZWUgb2YgdGhlIHdlYi1zZXJ2ZXI7IGRvIDxlbT5ub3Q8L2VtPiBwdXQgaXQgaW4KLSAgICB0aGUgZGlyZWN0b3J5IHRoYXQgaXQgcHJvdGVjdHMuIE90aGVyd2lzZSwgY2xpZW50cyB3aWxsIGJlIGFibGUKLSAgICB0byBkb3dubG9hZCB0aGUgQXV0aEdyb3VwRmlsZS48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+QXV0aERpZ2VzdFFvcDwvbmFtZT4KLTxkZXNjcmlwdGlvbj5EZXRlcm1pbmVzIHRoZSBxdWFsaXR5LW9mLXByb3RlY3Rpb24gdG8gdXNlIGluIGRpZ2VzdAotYXV0aGVudGljYXRpb248L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5BdXRoRGlnZXN0UW9wIG5vbmV8YXV0aHxhdXRoLWludCBbYXV0aHxhdXRoLWludF08L3N5bnRheD4KLTxkZWZhdWx0PkF1dGhEaWdlc3RRb3AgYXV0aDwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT5BdXRoQ29uZmlnPC9vdmVycmlkZT4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPkF1dGhEaWdlc3RRb3A8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIGRldGVybWluZXMKLSAgICB0aGUgcXVhbGl0eS1vZi1wcm90ZWN0aW9uIHRvIHVzZS4gPGVtPmF1dGg8L2VtPiB3aWxsIG9ubHkgZG8KLSAgICBhdXRoZW50aWNhdGlvbiAodXNlcm5hbWUvcGFzc3dvcmQpOyA8ZW0+YXV0aC1pbnQ8L2VtPiBpcwotICAgIGF1dGhlbnRpY2F0aW9uIHBsdXMgaW50ZWdyaXR5IGNoZWNraW5nIChhbiBNRDUgaGFzaCBvZiB0aGUgZW50aXR5Ci0gICAgaXMgYWxzbyBjb21wdXRlZCBhbmQgY2hlY2tlZCk7IDxlbT5ub25lPC9lbT4gd2lsbCBjYXVzZSB0aGUgbW9kdWxlCi0gICAgdG8gdXNlIHRoZSBvbGQgUkZDLTIwNjkgZGlnZXN0IGFsZ29yaXRobSAod2hpY2ggZG9lcyBub3QgaW5jbHVkZQotICAgIGludGVncml0eSBjaGVja2luZykuIEJvdGggPGVtPmF1dGg8L2VtPiBhbmQgPGVtPmF1dGgtaW50PC9lbT4gbWF5Ci0gICAgYmUgc3BlY2lmaWVkLCBpbiB3aGljaCB0aGUgY2FzZSB0aGUgYnJvd3NlciB3aWxsIGNob29zZSB3aGljaCBvZgotICAgIHRoZXNlIHRvIHVzZS4gPGVtPm5vbmU8L2VtPiBzaG91bGQgb25seSBiZSB1c2VkIGlmIHRoZSBicm93c2VyIGZvcgotICAgIHNvbWUgcmVhc29uIGRvZXMgbm90IGxpa2UgdGhlIGNoYWxsZW5nZSBpdCByZWNlaXZlcyBvdGhlcndpc2UuPC9wPgotCi0gICAgPHA+PHN0cm9uZz48ZW0+YXV0aC1pbnQ8L2VtPiBpcyBub3QgaW1wbGVtZW50ZWQKLSAgICB5ZXQ8L3N0cm9uZz4uPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkF1dGhEaWdlc3ROb25jZUxpZmV0aW1lPC9uYW1lPgotPGRlc2NyaXB0aW9uPkhvdyBsb25nIHRoZSBzZXJ2ZXIgbm9uY2UgaXMgdmFsaWQ8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5BdXRoRGlnZXN0Tm9uY2VMaWZldGltZSA8ZW0+c2Vjb25kczwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5BdXRoRGlnZXN0Tm9uY2VMaWZldGltZSAzMDA8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0Pjxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+QXV0aENvbmZpZzwvb3ZlcnJpZGU+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5BdXRoRGlnZXN0Tm9uY2VMaWZldGltZTwvZGlyZWN0aXZlPiBkaXJlY3RpdmUKLSAgICBjb250cm9scyBob3cgbG9uZyB0aGUgc2VydmVyIG5vbmNlIGlzIHZhbGlkLiBXaGVuIHRoZSBjbGllbnQKLSAgICBjb250YWN0cyB0aGUgc2VydmVyIHVzaW5nIGFuIGV4cGlyZWQgbm9uY2UgdGhlIHNlcnZlciB3aWxsIHNlbmQKLSAgICBiYWNrIGEgNDAxIHdpdGggPGNvZGU+c3RhbGU9dHJ1ZTwvY29kZT4uIElmIDxlbT5zZWNvbmRzPC9lbT4gaXMKLSAgICBncmVhdGVyIHRoYW4gMCB0aGVuIGl0IHNwZWNpZmllcyB0aGUgYW1vdW50IG9mIHRpbWUgZm9yIHdoaWNoIHRoZQotICAgIG5vbmNlIGlzIHZhbGlkOyB0aGlzIHNob3VsZCBwcm9iYWJseSBuZXZlciBiZSBzZXQgdG8gbGVzcyB0aGFuIDEwCi0gICAgc2Vjb25kcy4gSWYgPGVtPnNlY29uZHM8L2VtPiBpcyBsZXNzIHRoYW4gMCB0aGVuIHRoZSBub25jZSBuZXZlcgotICAgIGV4cGlyZXMuIDwhLS0gTm90IGltcGxlbWVudGVkIHlldCBJZiA8RU0+c2Vjb25kczwvRU0+IGlzIDAgdGhlbgotICAgIHRoZSBub25jZSBtYXkgYmUgdXNlZCBleGFjdGx5IG9uY2UgYnkgdGhlIGNsaWVudC4gTm90ZSB0aGF0IHdoaWxlCi0gICAgb25lLXRpbWUtbm9uY2VzIHByb3ZpZGUgaGlnaGVyIHNlY3VyaXR5IGFnYWluc3QgcmVwbGF5IGF0dGFja3MsCi0gICAgdGhleSBhbHNvIGhhdmUgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zLCBhcyB0aGUKLSAgICBicm93c2VyIGNhbm5vdCBwaXBlbGluZSBvciBtdWx0aXBsZSBjb25uZWN0aW9ucyBmb3IgdGhlCi0gICAgcmVxdWVzdHMuIEJlY2F1c2UgYnJvd3NlcnMgY2Fubm90IGVhc2lseSBkZXRlY3QgdGhhdAotICAgIG9uZS10aW1lLW5vbmNlcyBhcmUgYmVpbmcgdXNlZCwgdGhpcyBtYXkgbGVhZCB0byBicm93c2VycyB0cnlpbmcKLSAgICB0byBwaXBlbGluZSByZXF1ZXN0cyBhbmQgcmVjZWl2aW5nIDQwMSByZXNwb25zZXMgZm9yIGFsbCBidXQgdGhlCi0gICAgZmlyc3QgcmVxdWVzdCwgcmVxdWlyaW5nIHRoZSBicm93c2VyIHRvIHJlc2VuZCB0aGUgcmVxdWVzdHMuIE5vdGUKLSAgICBhbHNvIHRoYXQgdGhlIHByb3RlY3Rpb24gYWdhaW5zdCByZXBseSBhdHRhY2tzIG9ubHkgbWFrZXMgc2Vuc2UKLSAgICBmb3IgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIGNvbnRlbnQgYW5kIHRoaW5ncyBsaWtlIFBPU1QgcmVxdWVzdHM7Ci0gICAgZm9yIHN0YXRpYyBjb250ZW50IHRoZSBhdHRhY2tlciBtYXkgYWxyZWFkeSBoYXZlIHRoZSBjb21wbGV0ZQotICAgIHJlc3BvbnNlLCBzbyBvbmUtdGltZS1ub25jZXMgZG8gbm90IG1ha2Ugc2Vuc2UgaGVyZS4gIC0tPgotICAgIDwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5BdXRoRGlnZXN0Tm9uY2VGb3JtYXQ8L25hbWU+Ci08ZGVzY3JpcHRpb24+RGV0ZXJtaW5lcyBob3cgdGhlIG5vbmNlIGlzIGdlbmVyYXRlZDwvZGVzY3JpcHRpb24+Ci08c3ludGF4Pj8/Pzwvc3ludGF4PgotPGRlZmF1bHQ+Pz8/PC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPkF1dGhDb25maWc8L292ZXJyaWRlPgotCi08dXNhZ2U+Ci0gICAgPHA+PHN0cm9uZz5Ob3QgaW1wbGVtZW50ZWQgeWV0Ljwvc3Ryb25nPiA8IS0tCi0gICAgICAgICAgICA8UD5UaGUgQXV0aERpZ2VzdE5vbmNlRm9ybWF0IGRpcmVjdGl2ZSBkZXRlcm1pbmVzIGhvdyB0aGUgbm9uY2UgaXMKLSAgICAgICAgICAgIGdlbmVyYXRlZC4KLSAgICAgICAgICAgIC0tPgotICAgIDwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5BdXRoRGlnZXN0TmNDaGVjazwvbmFtZT4KLTxkZXNjcmlwdGlvbj5FbmFibGVzIG9yIGRpc2FibGVzIGNoZWNraW5nIG9mIHRoZSBub25jZS1jb3VudCBzZW50IGJ5IHRoZQotc2VydmVyPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+QXV0aERpZ2VzdE5jQ2hlY2sgT258T2ZmPC9zeW50YXg+Ci08ZGVmYXVsdD5BdXRoRGlnZXN0TmNDaGVjayBPZmY8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+PHN0cm9uZz5Ob3QgaW1wbGVtZW50ZWQgeWV0Ljwvc3Ryb25nPiA8IS0tCi0gICAgICAgICAgICA8UD5UaGUgQXV0aERpZ2VzdE5jQ2hlY2sgZGlyZWN0aXZlIGVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGNoZWNraW5nIG9mIHRoZQotICAgICAgICAgICAgbm9uY2UtY291bnQgc2VudCBieSB0aGUgc2VydmVyLgotCi0gICAgICAgICAgICA8UD5XaGlsZSByZWNvbW1lbmRlZCBmcm9tIGEgc2VjdXJpdHkgc3RhbmRwb2ludCwgdHVybmluZyB0aGlzIGRpcmVjdGl2ZQotICAgICAgICAgICAgT24gaGFzIG9uZSBpbXBvcnRhbnQgcGVyZm9ybWFuY2UgaW1wbGljYXRpb24uIFRvIGNoZWNrIHRoZSBub25jZS1jb3VudAotICAgICAgICAgICAgKmFsbCogcmVxdWVzdHMgKHdoaWNoIGhhdmUgYW4gQXV0aG9yaXphdGlvbiBoZWFkZXIsIGlycmVzcGVjdGl2ZSBvZgotICAgICAgICAgICAgd2hldGhlciB0aGV5IHJlcXVpcmUgZGlnZXN0IGF1dGhlbnRpY2F0aW9uKSBtdXN0IGJlIHNlcmlhbGl6ZWQgdGhyb3VnaAotICAgICAgICAgICAgYSBjcml0aWNhbCBzZWN0aW9uLiBJZiB0aGUgc2VydmVyIGlzIGhhbmRsaW5nIGEgbGFyZ2UgbnVtYmVyIG9mCi0gICAgICAgICAgICByZXF1ZXN0cyB3aGljaCBjb250YWluIHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciB0aGVuIHRoaXMgbWF5IG5vdGljZWFibHkKLSAgICAgICAgICAgIGltcGFjdCBwZXJmb3JtYW5jZS4KLSAgICAgICAgICAgIC0tPgotICAgIDwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5BdXRoRGlnZXN0QWxnb3JpdGhtPC9uYW1lPgotPGRlc2NyaXB0aW9uPlNlbGVjdHMgdGhlIGFsZ29yaXRobSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgY2hhbGxlbmdlIGFuZAotcmVzcG9uc2UgaGFzZXMgaW4gZGlnZXN0IGF1dGhlbnRpY2F0aW9uPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+QXV0aERpZ2VzdEFsZ29yaXRobSBNRDV8TUQ1LXNlc3M8L3N5bnRheD4KLTxkZWZhdWx0PkF1dGhEaWdlc3RBbGdvcml0aG0gTUQ1PC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPkF1dGhDb25maWc8L292ZXJyaWRlPgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIDxkaXJlY3RpdmU+QXV0aERpZ2VzdEFsZ29yaXRobTwvZGlyZWN0aXZlPiBkaXJlY3RpdmUKLSAgICBzZWxlY3RzIHRoZSBhbGdvcml0aG0gdXNlZCB0byBjYWxjdWxhdGUgdGhlIGNoYWxsZW5nZSBhbmQgcmVzcG9uc2UKLSAgICBoYXNoZXMuPC9wPgotCi0gICAgPHA+PHN0cm9uZz48ZW0+TUQ1LXNlc3M8L2VtPiBpcyBub3QgY29ycmVjdGx5IGltcGxlbWVudGVkCi0gICAgeWV0PC9zdHJvbmc+LiA8IS0tCi0gICAgICAgICAgICA8UD5UbyB1c2UgPEVNPk1ENS1zZXNzPC9FTT4geW91IG11c3QgZmlyc3QgY29kZSB1cCB0aGUKLSAgICAgICAgICAgIDxWQVI+Z2V0X3VzZXJwd19oYXNoKCk8L1ZBUj4gZnVuY3Rpb24gaW4gPFZBUj5tb2RfYXV0aF9kaWdlc3QuYzwvVkFSPiAuCi0gICAgICAgICAgICAtLT4KLSAgICA8L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+QXV0aERpZ2VzdERvbWFpbjwvbmFtZT4KLTxkZXNjcmlwdGlvbj5VUklzIHRoYXQgYXJlIGluIHRoZSBzYW1lIHByb3RlY3Rpb24gc3BhY2UgZm9yIGRpZ2VzdAotYXV0aGVudGljYXRpb248L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5BdXRoRGlnZXN0RG9tYWluIDxlbT5VUkk8L2VtPiBbPGVtPlVSSTwvZW0+XSAuLi48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT5BdXRoQ29uZmlnPC9vdmVycmlkZT4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPkF1dGhEaWdlc3REb21haW48L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIGFsbG93cwotICAgIHlvdSB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIFVSSXMgd2hpY2ggYXJlIGluIHRoZSBzYW1lIHByb3RlY3Rpb24KLSAgICBzcGFjZSAoaS5lLiB1c2UgdGhlIHNhbWUgcmVhbG0gYW5kIHVzZXJuYW1lL3Bhc3N3b3JkIGluZm8pLiBUaGUKLSAgICBzcGVjaWZpZWQgVVJJcyBhcmUgcHJlZml4ZXMsIGkuZS4gdGhlIGNsaWVudCB3aWxsIGFzc3VtZSB0aGF0IGFsbAotICAgIFVSSXMgImJlbG93IiB0aGVzZSBhcmUgYWxzbyBwcm90ZWN0ZWQgYnkgdGhlIHNhbWUKLSAgICB1c2VybmFtZS9wYXNzd29yZC4gVGhlIFVSSXMgbWF5IGJlIGVpdGhlciBhYnNvbHV0ZSBVUklzCi0gICAgKGkuZS4gaW5sdWRpbmcgYSBzY2hlbWUsIGhvc3QsIHBvcnQsIGV0Yykgb3IgcmVsYXRpdmUgVVJJcy48L3A+Ci0KLSAgICA8cD5UaGlzIGRpcmVjdGl2ZSA8ZW0+c2hvdWxkPC9lbT4gYWx3YXlzIGJlIHNwZWNpZmllZCBhbmQKLSAgICBjb250YWluIGF0IGxlYXN0IHRoZSAoc2V0IG9mKSByb290IFVSSShzKSBmb3IgdGhpcyBzcGFjZS4KLSAgICBPbWl0dGluZyB0byBkbyBzbyB3aWxsIGNhdXNlIHRoZSBjbGllbnQgdG8gc2VuZCB0aGUKLSAgICBBdXRob3JpemF0aW9uIGhlYWRlciBmb3IgPGVtPmV2ZXJ5IHJlcXVlc3Q8L2VtPiBzZW50IHRvIHRoaXMKLSAgICBzZXJ2ZXIuIEFwYXJ0IGZyb20gaW5jcmVhc2luZyB0aGUgc2l6ZSBvZiB0aGUgcmVxdWVzdCwgaXQgbWF5Ci0gICAgYWxzbyBoYXZlIGEgZGV0cmltZW50YWwgZWZmZWN0IG9uIHBlcmZvcm1hbmNlIGlmCi0gICAgIkF1dGhEaWdlc3ROY0NoZWNrIiBpcyBvbi48L3A+Ci0KLSAgICA8cD5UaGUgVVJJcyBzcGVjaWZpZWQgY2FuIGFsc28gcG9pbnQgdG8gZGlmZmVyZW50IHNlcnZlcnMsIGluCi0gICAgd2hpY2ggY2FzZSBjbGllbnRzICh3aGljaCB1bmRlcnN0YW5kIHRoaXMpIHdpbGwgdGhlbiBzaGFyZQotICAgIHVzZXJuYW1lL3Bhc3N3b3JkIGluZm8gYWNyb3NzIG11bHRpcGxlIHNlcnZlcnMgd2l0aG91dAotICAgIHByb21wdGluZyB0aGUgdXNlciBlYWNoIHRpbWUuIDwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08L21vZHVsZXN5bm9wc2lzPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2F1dG9pbmRleC5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9hdXRvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYwYzg5Y2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9hdXRvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi08IS0tJWh5cGVydGV4dCAtLT4KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgMi4wLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFwYWNoZSBtb2R1bGUgbW9kX2RpcjwvVElUTEU+Ci08L0hFQUQ+Ci0KLTxCT0RZPgotPElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfc3ViLmdpZiIgQUxUPSIiPgotPCEtLS8laHlwZXJ0ZXh0IC0tPgotPEgxPk1vZHVsZSBtb2RfZGlyPC9oMT4KLQotVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5tb2RfZGlyLmM8L2NvZGU+IGZpbGUsIGFuZAotaXMgY29tcGlsZWQgaW4gYnkgZGVmYXVsdC4gSXQgcHJvdmlkZXMgZm9yIGRpcmVjdG9yeSBpbmRleGluZy4KLQotPGgyPlN1bW1hcnk8L2gyPgotVGhpcyBtb2R1bGUgY29udHJvbHMgdGhlIGRpcmVjdG9yeSBpbmRleGluZy4gVGhlIGluZGV4IG9mIGEgZGlyZWN0b3J5Ci1jYW4gY29tZSBmcm9tIG9uZSBvZiB0d28gc291cmNlczoKLTx1bD4KLTxsaT5BIGZpbGUgd3JpdHRlbiBieSB0aGUgdXNlciwgdHlwaWNhbGx5IGNhbGxlZCA8Y29kZT5pbmRleC5odG1sPC9jb2RlPi4KLVRoZSA8QSBIUkVGPSIjZGlyZWN0b3J5aW5kZXgiPkRpcmVjdG9yeUluZGV4PC9BPiBkaXJlY3RpdmUgc2V0cyB0aGUgbmFtZQotb2YgdGhpcyBmaWxlLgotPGxpPk90aGVyd2lzZSwgYSBsaXN0aW5nIGdlbmVyYXRlZCBieSB0aGUgc2VydmVyLiBUaGUgb3RoZXIgZGlyZWN0aXZlcwotY29udHJvbCB0aGUgZm9ybWF0IG9mIHRoaXMgbGlzdGluZy4gVGhlIDxBIEhSRUY9IiNhZGRpY29uIj5BZGRJY29uPC9BPiwKLTxBIEhSRUY9IiNhZGRpY29uYnllbmNvZGluZyI+QWRkSWNvbkJ5RW5jb2Rpbmc8L0E+IGFuZAotPEEgSFJFRj0iI2FkZGljb25ieXR5cGUiPkFkZEljb25CeVR5cGU8L0E+IGFyZSB1c2VkIHRvIHNldCBhIGxpc3Qgb2YKLWljb25zIHRvIGRpc3BsYXkgZm9yIHZhcmlvdXMgZmlsZSB0eXBlczsgZm9yIGVhY2ggZmlsZSBsaXN0ZWQsIHRoZQotZmlyc3QgaWNvbiBsaXN0ZWQgdGhhdCBtYXRjaGVzIHRoZSBmaWxlIGlzIGRpc3BsYXllZC4KLTwvdWw+Ci0KLTwhLS0laHlwZXJ0ZXh0IC0tPgotPGgyPkRpcmVjdGl2ZXM8L2gyPgotCi08bWVudT4KLTxsaT48QSBIUkVGPSIjYWRkZGVzY3JpcHRpb24iPkFkZERlc2NyaXB0aW9uPC9BPgotPGxpPjxBIEhSRUY9IiNhZGRpY29uIj5BZGRJY29uPC9BPgotPGxpPjxBIEhSRUY9IiNhZGRpY29uYnllbmNvZGluZyI+QWRkSWNvbkJ5RW5jb2Rpbmc8L0E+Ci08bGk+PEEgSFJFRj0iI2FkZGljb25ieXR5cGUiPkFkZEljb25CeVR5cGU8L0E+Ci08bGk+PEEgSFJFRj0iI2RlZmF1bHRpY29uIj5EZWZhdWx0SWNvbjwvQT4KLTxsaT48QSBIUkVGPSIjZGlyZWN0b3J5aW5kZXgiPkRpcmVjdG9yeUluZGV4PC9BPgotPGxpPjxBIEhSRUY9IiNmYW5jeWluZGV4aW5nIj5GYW5jeUluZGV4aW5nPC9BPgotPGxpPjxBIEhSRUY9IiNoZWFkZXJuYW1lIj5IZWFkZXJOYW1lPC9BPgotPGxpPjxBIEhSRUY9IiNpbmRleGlnbm9yZSI+SW5kZXhJZ25vcmU8L0E+Ci08bGk+PEEgSFJFRj0iI2luZGV4b3B0aW9ucyI+SW5kZXhPcHRpb25zPC9BPgotPGxpPjxBIEhSRUY9IiNyZWFkbWVuYW1lIj5SZWFkbWVOYW1lPC9BPgotPC9tZW51PgotPGhyPgotPCEtLS8laHlwZXJ0ZXh0IC0tPgotCi08QSBuYW1lPSJhZGRkZXNjcmlwdGlvbiI+PGgyPkFkZERlc2NyaXB0aW9uPC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgQWRkRGVzY3JpcHRpb259IGRpcmVjdGl2ZSZndDsgLS0+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gQWRkRGVzY3JpcHRpb24gPGVtPnN0cmluZyBmaWxlIGZpbGUuLi48L2VtPjxicj4KLTxTdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2Vzczxicj4KLTxTdHJvbmc+T3ZlcnJpZGU6PC9zdHJvbmc+IEluZGV4ZXM8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gQmFzZTxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfZGlyPHA+Ci0KLVRoaXMgc2V0cyB0aGUgZGVzY3JpcHRpb24gdG8gZGlzcGxheSBmb3IgYSBmaWxlLCBmb3IKLTxBIEhSRUY9IiNmYW5jeWluZGV4aW5nIj5GYW5jeUluZGV4aW5nPC9BPi4gPGVtPkZpbGU8L2VtPiBpcyBhIGZpbGUKLWV4dGVuc2lvbiwgcGFydGlhbCBmaWxlbmFtZSwgd2lsZGNhcmQgZXhwcmVzc2lvbiBvciBmdWxsIGZpbGVuYW1lIGZvciBmaWxlcwotdG8gZGVzY3JpYmUuIDxlbT5TdHJpbmc8L2VtPiBpcyBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzCi0oPGNvZGU+JnF1b3Q7PC9jb2RlPikuIEV4YW1wbGU6Ci08YmxvY2txdW90ZT48Y29kZT5BZGREZXNjcmlwdGlvbiAiVGhlIHBsYW5ldCBNYXJzIiAvd2ViL3BpY3MvbWFycy5naWYKLTwvY29kZT48L2Jsb2NrcXVvdGU+PHA+PGhyPgotCi08QSBuYW1lPSJhZGRpY29uIj48aDI+QWRkSWNvbjwvaDI+PC9BPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEFkZEljb259IGRpcmVjdGl2ZSZndDsgLS0+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gQWRkSWNvbiA8ZW0+aWNvbiBuYW1lIG5hbWUgLi4uPC9lbT48YnI+Ci08U3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3M8YnI+Ci08U3Ryb25nPk92ZXJyaWRlOjwvc3Ryb25nPiBJbmRleGVzPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IEJhc2U8YnI+Ci08c3Ryb25nPk1vZHVsZTo8L3N0cm9uZz4gbW9kX2RpcjxwPgotCi1UaGlzIHNldHMgdGhlIGljb24gdG8gZGlzcGxheSBuZXh0IHRvIGEgZmlsZSBlbmRpbmcgaW4gPGVtPm5hbWU8L2VtPiBmb3IKLTxBIEhSRUY9IiNmYW5jeWluZGV4aW5nIj5GYW5jeUluZGV4aW5nPC9BPi4gPGVtPkljb248L2VtPiBpcyBlaXRoZXIgYQotKCUtZXNjYXBlZCkgcmVsYXRpdmUgVVJMIHRvIHRoZSBpY29uLCBvciBvZiB0aGUgZm9ybWF0Ci0oPGVtPmFsdHRleHQ8L2VtPiw8ZW0+dXJsPC9lbT4pIHdoZXJlIDxlbT5hbHR0ZXh0PC9lbT4gaXMgdGhlIHRleHQgdGFnIGdpdmVuCi1mb3IgYW4gaWNvbiBmb3Igbm9uLWdyYXBoaWNhbCBicm93c2Vycy48cD4KLQotPGVtPk5hbWU8L2VtPiBpcyBlaXRoZXIgXl5ESVJFQ1RPUlleXiBmb3IgZGlyZWN0b3JpZXMsIF5eQkxBTktJQ09OXl4gZm9yCi1ibGFuayBsaW5lcyAodG8gZm9ybWF0IHRoZSBsaXN0IGNvcnJlY3RseSksIGEgZmlsZSBleHRlbnNpb24sIGEgd2lsZGNhcmQKLWV4cHJlc3Npb24sIGEgcGFydGlhbCBmaWxlbmFtZSBvciBhIGNvbXBsZXRlIGZpbGVuYW1lLiBFeGFtcGxlczoKLTxibG9ja3F1b3RlPjxjb2RlPgotQWRkSWNvbiAoSU1HLC9pY29ucy9pbWFnZS54Ym0pIC5naWYgLmpwZyAueGJtIDxicj4KLUFkZEljb24gL2ljb25zL2Rpci54Ym0gXl5ESVJFQ1RPUlleXiA8YnI+Ci1BZGRJY29uIC9pY29ucy9iYWNrdXAueGJtICp+Ci08L2NvZGU+PC9ibG9ja3F1b3RlPgotPEEgSFJFRj0iI2FkZGljb25ieXR5cGUiPkFkZEljb25CeVR5cGU8L0E+IHNob3VsZCBiZSB1c2VkIGluIHByZWZlcmVuY2UgdG8KLUFkZEljb24sIHdoZW4gcG9zc2libGUuPHA+PGhyPgotCi08QSBuYW1lPSJhZGRpY29uYnllbmNvZGluZyI+PGgyPkFkZEljb25CeUVuY29kaW5nPC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgQWRkSWNvbkJ5RW5jb2Rpbmd9IGRpcmVjdGl2ZSZndDsgLS0+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gQWRkSWNvbkJ5RW5jb2RpbmcgPGVtPmljb24gbWltZS1lbmNvZGluZyBtaW1lLWVuY29kaW5nCi0uLi48L2VtPjxicj4KLTxTdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2Vzczxicj4KLTxTdHJvbmc+T3ZlcnJpZGU6PC9zdHJvbmc+IEluZGV4ZXM8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gQmFzZTxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfZGlyPHA+Ci0KLVRoaXMgc2V0cyB0aGUgaWNvbiB0byBkaXNwbGF5IG5leHQgdG8gZmlsZXMgd2l0aAotPGVtPm1pbWUtZW5jb2Rpbmc8L2VtPiBmb3IgPEEgSFJFRj0iI2ZhbmN5aW5kZXhpbmciPkZhbmN5SW5kZXhpbmc8L0E+LgotPGVtPkljb248L2VtPiBpcyBlaXRoZXIgYSAoJS1lc2NhcGVkKSByZWxhdGl2ZSBVUkwgdG8gdGhlIGljb24sIG9yIG9mIHRoZQotZm9ybWF0ICg8ZW0+YWx0dGV4dDwvZW0+LDxlbT51cmw8L2VtPikgd2hlcmUgPGVtPmFsdHRleHQ8L2VtPiBpcyB0aGUgdGV4dCB0YWcKLWdpdmVuIGZvciBhbiBpY29uIGZvciBub24tZ3JhcGhpY2FsIGJyb3dzZXJzLjxwPgotCi08ZW0+TWltZS1lbmNvZGluZzwvZW0+IGlzIGEgd2lsZGNhcmQgZXhwcmVzc2lvbiBtYXRjaGluZyByZXF1aXJlZCB0aGUgCi1jb250ZW50LWVuY29kaW5nLiBFeGFtcGxlczoKLTxibG9ja3F1b3RlPjxjb2RlPgotQWRkSWNvbkJ5RW5jb2RpbmcgL2ljb25zL2NvbXByZXNzLnhibSB4LWNvbXByZXNzCi08L2NvZGU+PC9ibG9ja3F1b3RlPjxwPjxocj4KLQotPEEgbmFtZT0iYWRkaWNvbmJ5dHlwZSI+PGgyPkFkZEljb25CeVR5cGU8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBBZGRJY29uQnlUeXBlfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IEFkZEljb25CeVR5cGUgPGVtPmljb24gbWltZS10eXBlIG1pbWUtdHlwZSAuLi48L2VtPjxicj4KLTxTdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2Vzczxicj4KLTxTdHJvbmc+T3ZlcnJpZGU6PC9zdHJvbmc+IEluZGV4ZXM8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gQmFzZTxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfZGlyPHA+Ci0KLVRoaXMgc2V0cyB0aGUgaWNvbiB0byBkaXNwbGF5IG5leHQgdG8gZmlsZXMgb2YgdHlwZSA8ZW0+bWltZS10eXBlPC9lbT4gZm9yCi08QSBIUkVGPSIjZmFuY3lpbmRleGluZyI+RmFuY3lJbmRleGluZzwvQT4uIDxlbT5JY29uPC9lbT4gaXMgZWl0aGVyIGEKLSglLWVzY2FwZWQpIHJlbGF0aXZlIFVSTCB0byB0aGUgaWNvbiwgb3Igb2YgdGhlIGZvcm1hdAotKDxlbT5hbHR0ZXh0PC9lbT4sPGVtPnVybDwvZW0+KSB3aGVyZSA8ZW0+YWx0dGV4dDwvZW0+IGlzIHRoZSB0ZXh0IHRhZyBnaXZlbgotZm9yIGFuIGljb24gZm9yIG5vbi1ncmFwaGljYWwgYnJvd3NlcnMuPHA+Ci08ZW0+TWltZS10eXBlPC9lbT4gaXMgYSB3aWxkY2FyZCBleHByZXNzaW9uIG1hdGNoaW5nIHJlcXVpcmVkIHRoZSBtaW1lIHR5cGVzLgotRXhhbXBsZXM6Ci08YmxvY2txdW90ZT48Y29kZT4KLUFkZEljb25CeVR5cGUgKElNRywvaWNvbnMvaW1hZ2UueGJtKSBpbWFnZS8qCi08L2NvZGU+PC9ibG9ja3F1b3RlPjxwPjxocj4KLQotPEEgbmFtZT0iZGVmYXVsdGljb24iPjxoMj5EZWZhdWx0SWNvbjwvaDI+PC9BPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IERlZmF1bHRJY29ufSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IERlZmF1bHRJY29uIDxlbT51cmw8L2VtPjxicj4KLTxTdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2Vzczxicj4KLTxTdHJvbmc+T3ZlcnJpZGU6PC9zdHJvbmc+IEluZGV4ZXM8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gQmFzZTxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfZGlyPHA+Ci0KLVRoZSBEZWZhdWx0SWNvbiBkaXJlY3RpdmUgc2V0cyB0aGUgaWNvbiB0byBkaXNwbGF5IGZvciBmaWxlcyB3aGVuIG5vCi1zcGVjaWZpYyBpY29uIGlzIGtub3duLCBmb3IgPEEgSFJFRj0iI2ZhbmN5aW5kZXhpbmciPkZhbmN5SW5kZXhpbmc8L0E+LgotPGVtPlVybDwvZW0+IGlzIGEgKCUtZXNjYXBlZCkgcmVsYXRpdmUgVVJMIHRvIHRoZSBpY29uLiBFeGFtcGxlczoKLTxibG9ja3F1b3RlPjxjb2RlPgotRGVmYXVsdEljb24gL2ljb24vdW5rbm93bi54Ym0KLTwvY29kZT48L2Jsb2NrcXVvdGU+PHA+PGhyPgotCi08QSBuYW1lPSJkaXJlY3RvcnlpbmRleCI+PGgyPkRpcmVjdG9yeUluZGV4PC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgRGlyZWN0b3J5SW5kZXh9IGRpcmVjdGl2ZSZndDsgLS0+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gRGlyZWN0b3J5SW5kZXggPGVtPmxvY2FsLXVybCBsb2NhbC11cmwgLi4uPC9lbT48YnI+Ci08c3Ryb25nPkRlZmF1bHQ6PC9zdHJvbmc+IDxjb2RlPkRpcmVjdG9yeUluZGV4IGluZGV4Lmh0bWw8L2NvZGU+PGJyPgotPFN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPGJyPgotPFN0cm9uZz5PdmVycmlkZTo8L3N0cm9uZz4gSW5kZXhlczxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBCYXNlPGJyPgotPHN0cm9uZz5Nb2R1bGU6PC9zdHJvbmc+IG1vZF9kaXI8cD4KLQotVGhlIERpcmVjdG9yeUluZGV4IGRpcmVjdGl2ZSBzZXRzIHRoZSBsaXN0IG9mIHJlc291cmNlcyB0byBsb29rIGZvciwgd2hlbgotdGhlIGNsaWVudCByZXF1ZXN0cyBhbiBpbmRleCBvZiB0aGUgZGlyZWN0b3J5IGJ5IHNwZWNpZnlpbmcgYSBOVUxMIGZpbGUKLWF0IHRoZSBlbmQgb2YgdGhlIGEgZGlyZWN0b3J5IG5hbWUuIDxlbT5Mb2NhbC11cmw8L2VtPiBpcyB0aGUgKCUtZW5jb2RlZCkgVVJMCi1vZiBhIGRvY3VtZW50IG9uIHRoZSBzZXJ2ZXIgcmVsYXRpdmUgdG8gdGhlIHJlcXVlc3RlZCBkaXJlY3Rvcnk7IGl0IGlzIHVzdWFsbHkKLXRoZSBuYW1lIG9mIGEgZmlsZSBpbiB0aGUgZGlyZWN0b3J5LiBTZXZlcmFsIFVSTHMgbWF5IGJlIGdpdmVuOyB0aGUgc2VydmVyCi13aWxsIHJldHVybiB0aGUgZmlyc3Qgb25lIHRoYXQgaXQgZmluZHMuIElmIG5vbmUgb2YgdGhlIHJlc291cmNlcyBleGlzdCwKLXRoZW4gdGhlIHNlcnZlciB3aWxsIGdlbmVyYXRlIGl0cyBvd24gbGlzdGluZyBvZiB0aGUgZGlyZWN0b3J5LgotRXhhbXBsZToKLTxibG9ja3F1b3RlPjxjb2RlPgotRGlyZWN0b3J5SW5kZXggaW5kZXguaHRtbAotPC9jb2RlPjwvYmxvY2txdW90ZT4KLXRoZW4gYSByZXF1ZXN0IGZvciA8Y29kZT5odHRwOi8vbXlzZXJ2ZXIvZG9jcy88L2NvZGU+IHdvdWxkIHJldHVybgotPGNvZGU+aHR0cDovL215c2VydmVyL2RvY3MvaW5kZXguaHRtbDwvY29kZT4gaWYgaXQgZXhpc3RzLCBvciB3b3VsZCBsaXN0Ci10aGUgZGlyZWN0b3J5IGlmIGl0IGRpZCBub3QuIDxwPgotCi1Ob3RlIHRoYXQgdGhlIGRvY3VtZW50cyBkbyBub3QgbmVlZCB0byBiZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5OwotPGJsb2NrcXVvdGU+PGNvZGU+Ci1EaXJlY3RvcnlJbmRleCBpbmRleC5odG1sIGluZGV4LnR4dCAvY2dpLWJpbi9pbmRleC5wbDwvY29kZT48L2Jsb2NrcXVvdGU+Ci13b3VsZCBjYXVzZSB0aGUgQ0dJIHNjcmlwdCA8Y29kZT4vY2dpLWJpbi9pbmRleC5wbDwvY29kZT4gdG8gYmUgZXhlY3V0ZWQKLWlmIG5laXRoZXIgPGNvZGU+aW5kZXguaHRtbDwvY29kZT4gb3IgPGNvZGU+aW5kZXgudHh0PC9jb2RlPiBleGlzdGVkIGluCi1hIGRpcmVjdG9yeS48cD48aHI+Ci0KLTxBIG5hbWU9ImZhbmN5aW5kZXhpbmciPjxoMj5GYW5jeUluZGV4aW5nPC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgRmFuY3lJbmRleGluZ30gZGlyZWN0aXZlJmd0OyAtLT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBGYW5jeUluZGV4aW5nIDxlbT5ib29sZWFuPC9lbT48YnI+Ci08U3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3M8YnI+Ci08U3Ryb25nPk92ZXJyaWRlOjwvc3Ryb25nPiBJbmRleGVzPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IEJhc2U8YnI+Ci08c3Ryb25nPk1vZHVsZTo8L3N0cm9uZz4gbW9kX2RpcjxwPgotCi1UaGUgRmFuY3lJbmRleGluZyBkaXJlY3RpdmUgc2V0cyB0aGUgRmFuY3lJbmRleGluZyBvcHRpb24gZm9yIGEgZGlyZWN0b3J5LgotPGVtPkJvb2xlYW48L2VtPiBjYW4gYmUgPGNvZGU+b248L2NvZGU+IG9yIDxjb2RlPm9mZjwvY29kZT4uIFRoZQotPEEgSFJFRj0iI2luZGV4b3B0aW9ucyI+SW5kZXhPcHRpb25zPC9BPiBkaXJlY3RpdmUgc2hvdWxkIGJlIHVzZWQgaW4KLXByZWZlcmVuY2UuPHA+PGhyPgotCi08QSBuYW1lPSJoZWFkZXJuYW1lIj48aDI+SGVhZGVyTmFtZTwvaDI+PC9BPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEhlYWRlck5hbWV9IGRpcmVjdGl2ZSZndDsgLS0+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gSGVhZGVyTmFtZSA8ZW0+ZmlsZW5hbWU8L2VtPjxicj4KLTxTdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2Vzczxicj4KLTxTdHJvbmc+T3ZlcnJpZGU6PC9zdHJvbmc+IEluZGV4ZXM8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gQmFzZTxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfZGlyPHA+Ci0KLVRoZSBIZWFkZXJOYW1lIGRpcmVjdGl2ZSBzZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgd2lsbCBiZSBpbnNlcnRlZAotYXQgdGhlIHRvcCBvZiB0aGUgaW5kZXggbGlzdGluZy4gPGVtPkZpbGVuYW1lPC9lbT4gaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUKLXRvIGluY2x1ZGUsIGFuZCBpcyB0YWtlbiB0byBiZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGJlaW5nIGluZGV4ZWQuCi1UaGUgc2VydmVyIGZpcnN0IGF0dGVtcHRzIHRvIGluY2x1ZGUgPGVtPmZpbGVuYW1lPC9lbT48Y29kZT4uaHRtbDwvY29kZT4KLWFzIGFuIEhUTUwgZG9jdW1lbnQsIG90aGVyd2lzZSBpdCB3aWxsIGluY2x1ZGUgPGVtPmZpbGVuYW1lPC9lbT4gYXMgcGxhaW4KLXRleHQuIEV4YW1wbGU6Ci08YmxvY2txdW90ZT48Y29kZT5IZWFkZXJOYW1lIEhFQURFUjwvY29kZT48L2Jsb2NrcXVvdGU+Ci13aGVuIGluZGV4aW5nIHRoZSBkaXJlY3RvcnkgPGNvZGU+L3dlYjwvY29kZT4sIHRoZSBzZXJ2ZXIgd2lsbCBmaXJzdCBsb29rIGZvcgotdGhlIEhUTUwgZmlsZSA8Y29kZT4vd2ViL0hFQURFUi5odG1sPC9jb2RlPiBhbmQgaW5jbHVkZSBpdCBpZiBmb3VuZCwgb3RoZXJ3aXNlCi1pdCB3aWxsIGluY2x1ZGUgdGhlIHBsYWluIHRleHQgZmlsZSA8Y29kZT4vd2ViL0hFQURFUjwvY29kZT4sIGlmIGl0IGV4aXN0cy4KLQotPHA+U2VlIGFsc28gPEEgSFJFRj0iI3JlYWRtZW5hbWUiPlJlYWRtZU5hbWU8L0E+LjxwPjxocj4KLQotPEEgbmFtZT0iaW5kZXhpZ25vcmUiPjxoMj5JbmRleElnbm9yZTwvaDI+PC9BPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEluZGV4SWdub3JlfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IEluZGV4SWdub3JlIDxlbT5maWxlIGZpbGUgLi4uPC9lbT48YnI+Ci08U3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3M8YnI+Ci08U3Ryb25nPk92ZXJyaWRlOjwvc3Ryb25nPiBJbmRleGVzPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IEJhc2U8YnI+Ci08c3Ryb25nPk1vZHVsZTo8L3N0cm9uZz4gbW9kX2RpcjxwPgotCi1UaGUgSW5kZXhJZ25vcmUgZGlyZWN0aXZlIGFkZHMgdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gaGlkZSB3aGVuIGxpc3RpbmcKLWEgZGlyZWN0b3J5LiA8ZW0+RmlsZTwvZW0+IGlzIGEgZmlsZSBleHRlbnNpb24sIHBhcnRpYWwgZmlsZW5hbWUsCi13aWxkY2FyZCBleHByZXNzaW9uIG9yIGZ1bGwgZmlsZW5hbWUgZm9yIGZpbGVzIHRvIGlnbm9yZS4gTXVsdGlwbGUKLUluZGV4SWdub3JlIGRpcmVjdGl2ZXMgYWRkIHRvIHRoZSBsaXN0LCByYXRoZXIgdGhhbiB0aGUgcmVwbGFjaW5nIHRoZSBsaXN0Ci1vZiBpZ25vcmVkIGZpbGVzLiBCeSBkZWZhdWx0LCB0aGUgbGlzdCBjb250YWlucyBgPGNvZGU+LjwvY29kZT4nLiBFeGFtcGxlOgotPGJsb2NrcXVvdGU+PGNvZGU+Ci1JbmRleElnbm9yZSBSRUFETUUgLmh0YWNjZXNzICp+Ci08L2NvZGU+PC9ibG9ja3F1b3RlPjxwPjxocj4KLQotPEEgbmFtZT0iaW5kZXhvcHRpb25zIj48aDI+SW5kZXhPcHRpb25zPC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgSW5kZXhPcHRpb25zfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IEluZGV4T3B0aW9ucyA8ZW0+b3B0aW9uIG9wdGlvbiAuLi48L2VtPjxicj4KLTxTdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2Vzczxicj4KLTxTdHJvbmc+T3ZlcnJpZGU6PC9zdHJvbmc+IEluZGV4ZXM8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gQmFzZTxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfZGlyPHA+Ci0KLVRoZSBJbmRleE9wdGlvbnMgZGlyZWN0aXZlIHNwZWNpZmllcyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBkaXJlY3RvcnkgaW5kZXhpbmcuCi08ZW0+T3B0aW9uPC9lbT4gY2FuIGJlIG9uZSBvZgotPGRsPgotPGR0PkZhbmN5SW5kZXhpbmcKLTxkZD48IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgRmFuY3lJbmRleGluZ30gaW5kZXggb3B0aW9uJmd0OyAtLT4KLVRoaXMgdHVybnMgb24gZmFuY3kgaW5kZXhpbmcgb2YgZGlyZWN0b3JpZXMuCi08ZHQ+SWNvbnNBcmVMaW5rcwotPGRkPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEljb25zQXJlTGlua3N9IGluZGV4IG9wdGlvbiZndDsgLS0+Ci1UaGlzIG1ha2VzIHRoZSBpY29ucyBwYXJ0IG9mIHRoZSBhbmNob3IgZm9yIHRoZSBmaWxlbmFtZSwgZm9yCi1mYW5jeSBpbmRleGluZy4KLTxkdD5TY2FuSFRNTFRpdGxlcwotPGRkPjwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBTY2FuSFRNTFRpdGxlc30gaW5kZXggb3B0aW9uJmd0OyAtLT4KLVRoaXMgZW5hYmxlcyB0aGUgZXh0cmFjdGlvbiBvZiB0aGUgdGl0bGUgZnJvbSBIVE1MIGRvY3VtZW50cyBmb3IgZmFuY3kKLWluZGV4aW5nLiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBoYXZlIGEgZGVzY3JpcHRpb24gZ2l2ZW4gYnkKLTxBIEhSRUY9IiNhZGRkZXNjcmlwdGlvbiI+QWRkRGVzY3JpcHRpb248L0E+IHRoZW4gaHR0cGQgd2lsbCByZWFkIHRoZQotZG9jdW1lbnQgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgVElUTEUgdGFnLiAgVGhpcyBpcyBDUFUgYW5kIGRpc2sgaW50ZW5zaXZlLgotPGR0PlN1cHByZXNzTGFzdE1vZGlmaWVkCi08ZGQ+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgU3VwcHJlc3NMYXN0TW9kaWZpZWR9IGluZGV4IG9wdGlvbiZndDsgLS0+Ci1UaGlzIHdpbGwgc3VwcHJlc3MgdGhlIGRpc3BsYXkgb2YgdGhlIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUsIGluIGZhbmN5Ci1pbmRleGluZyBsaXN0aW5ncy4KLTxkdD5TdXBwcmVzc1NpemUKLTxkZD4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBTdXBwcmVzc1NpemV9IGluZGV4IG9wdGlvbiZndDsgLS0+Ci1UaGlzIHdpbGwgc3VwcHJlc3MgdGhlIGZpbGUgc2l6ZSBpbiBmYW5jeSBpbmRleGluZyBsaXN0aW5ncy4KLTxkdD5TdXBwcmVzc0Rlc2NyaXB0aW9uCi08ZGQ+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgU3VwcHJlc3NEZXNjcmlwdGlvbn0gaW5kZXggb3B0aW9uJmd0OyAtLT4KLVRoaXMgd2lsbCBzdXBwcmVzcyB0aGUgZmlsZSBkZXNjcmlwdGlvbiBpbiBmYW5jeSBpbmRleGluZyBsaXN0aW5ncy4KLTwvZGw+Ci1UaGlzIGRlZmF1bHQgaXMgdGhhdCBubyBvcHRpb25zIGFyZSBlbmFibGVkLiBJZiBtdWx0aXBsZSBJbmRleE9wdGlvbnMKLWNvdWxkIGFwcGx5IHRvIGEgZGlyZWN0b3J5LCB0aGVuIHRoZSBtb3N0IHNwZWNpZmljIG9uZSBpcyB0YWtlbiBjb21wbGV0ZTsKLXRoZSBvcHRpb25zIGFyZSBub3QgbWVyZ2VkLiBGb3IgZXhhbXBsZToKLTxibG9ja3F1b3RlPjxjb2RlPgotJmx0O0RpcmVjdG9yeSAvd2ViL2RvY3MmZ3Q7IDxicj4KLUluZGV4T3B0aW9ucyBGYW5jeUluZGV4aW5nIDxicj4KLSZsdDsvRGlyZWN0b3J5Jmd0Ozxicj4KLSZsdDtEaXJlY3RvcnkgL3dlYi9kb2NzL3NwZWMmZ3Q7IDxicj4KLUluZGV4T3B0aW9ucyBTY2FuSFRNTFRpdGxlcyA8YnI+Ci0mbHQ7L0RpcmVjdG9yeSZndDsKLTwvY29kZT48L2Jsb2NrcXVvdGU+Ci10aGVuIG9ubHkgPGNvZGU+U2NhbkhUTUxUaXRsZXM8L2NvZGU+IHdpbGwgYmUgc2V0IGZvciB0aGUgL3dlYi9kb2NzL3NwZWMKLWRpcmVjdG9yeS48cD48aHI+Ci0KLTxBIG5hbWU9InJlYWRtZW5hbWUiPjxoMj5SZWFkbWVOYW1lPC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgUmVhZG1lTmFtZX0gZGlyZWN0aXZlJmd0OyAtLT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBSZWFkbWVOYW1lIDxlbT5maWxlbmFtZTwvZW0+PGJyPgotPFN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPGJyPgotPFN0cm9uZz5PdmVycmlkZTo8L3N0cm9uZz4gSW5kZXhlczxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBCYXNlPGJyPgotPHN0cm9uZz5Nb2R1bGU6PC9zdHJvbmc+IG1vZF9kaXI8cD4KLQotVGhlIFJlYWRtZU5hbWUgZGlyZWN0aXZlIHNldHMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCB3aWxsIGJlIGFwcGVuZGVkCi10byB0aGUgZW5kIG9mIHRoZSBpbmRleCBsaXN0aW5nLiA8ZW0+RmlsZW5hbWU8L2VtPiBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZQotdG8gaW5jbHVkZSwgYW5kIGlzIHRha2VuIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgYmVpbmcgaW5kZXhlZC4KLVRoZSBzZXJ2ZXIgZmlyc3QgYXR0ZW1wdHMgdG8gaW5jbHVkZSA8ZW0+ZmlsZW5hbWU8L2VtPjxjb2RlPi5odG1sPC9jb2RlPgotYXMgYW4gSFRNTCBkb2N1bWVudCwgb3RoZXJ3aXNlIGl0IHdpbGwgaW5jbHVkZSA8ZW0+ZmlsZW5hbWU8L2VtPiBhcyBwbGFpbgotdGV4dC4gRXhhbXBsZToKLTxibG9ja3F1b3RlPjxjb2RlPlJlYWRtZU5hbWUgUkVBRE1FPC9jb2RlPjwvYmxvY2txdW90ZT4KLXdoZW4gaW5kZXhpbmcgdGhlIGRpcmVjdG9yeSA8Y29kZT4vd2ViPC9jb2RlPiwgdGhlIHNlcnZlciB3aWxsIGZpcnN0IGxvb2sgZm9yCi10aGUgSFRNTCBmaWxlIDxjb2RlPi93ZWIvUkVBRE1FLmh0bWw8L2NvZGU+IGFuZCBpbmNsdWRlIGl0IGlmIGZvdW5kLCBvdGhlcndpc2UKLWl0IHdpbGwgaW5jbHVkZSB0aGUgcGxhaW4gdGV4dCBmaWxlIDxjb2RlPi93ZWIvUkVBRE1FPC9jb2RlPiwgaWYgaXQgZXhpc3RzLgotCi08cD5TZWUgYWxzbyA8QSBIUkVGPSIjaGVhZGVybmFtZSI+SGVhZGVyTmFtZTwvQT4uPHA+Ci0KLTwhLS0laHlwZXJ0ZXh0IC0tPgotPGhyPgotPEEgSFJFRj0iLi4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9ob21lLmdpZiIgQUxUPSJIb21lIj48L0E+Ci08QSBIUkVGPSIuLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfaW5kZXguZ2lmIiBBTFQ9IkluZGV4Ij48L0E+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KLTwhLS0vJWh5cGVydGV4dCAtLT4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfYXV0b2luZGV4LnhtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfYXV0b2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNhZWI3ZC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX2F1dG9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgeG1sOm1hbnVhbCBbIDwhRU5USVRZIG5ic3AgIiYjMTYwOyI+IF0+Ci08P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveHNsIiBocmVmPSIuLi9zdHlsZS9tYW51YWwueHNsIj8+Ci08bW9kdWxlc3lub3BzaXM+Ci08bmFtZT5tb2RfYXV0b2luZGV4PC9uYW1lPgotCi08ZGVzY3JpcHRpb24+R2VuZXJhdGVzIGRpcmVjdG9yeSBpbmRleGVzLAotICAgIGF1dG9tYXRpY2FsbHksIHNpbWlsYXIgdG8gdGhlIFVuaXggPGVtPmxzPC9lbT4gY29tbWFuZCBvciB0aGUKLSAgICBXaW4zMiA8ZW0+ZGlyPC9lbT4gc2hlbGwgY29tbWFuZDwvZGVzY3JpcHRpb24+Ci08c3RhdHVzPkJhc2U8L3N0YXR1cz4KLTxzb3VyY2VmaWxlPm1vZF9hdXRvaW5kZXguYzwvc291cmNlZmlsZT4KLTxpZGVudGlmaWVyPmF1dG9pbmRleF9tb2R1bGU8L2lkZW50aWZpZXI+Ci0KLTxzdW1tYXJ5PiAKLSAgICAgIDxwPlRoZSBpbmRleCBvZiBhIGRpcmVjdG9yeSBjYW4gY29tZSBmcm9tIG9uZSBvZiB0d28KLSAgICAgIHNvdXJjZXM6PC9wPgotCi0gICAgPHVsPgotICAgICAgPGxpPkEgZmlsZSB3cml0dGVuIGJ5IHRoZSB1c2VyLCB0eXBpY2FsbHkgY2FsbGVkCi0gICAgICA8Y29kZT5pbmRleC5odG1sPC9jb2RlPi4gVGhlIDxkaXJlY3RpdmUKLSAgICAgIG1vZHVsZT0ibW9kX2RpciI+RGlyZWN0b3J5SW5kZXg8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIHNldHMgdGhlCi0gICAgICBuYW1lIG9mIHRoaXMgZmlsZS4gVGhpcyBpcyBjb250cm9sbGVkIGJ5Ci0gICAgICA8bW9kdWxlPm1vZF9kaXI8L21vZHVsZT4uPC9saT4KLQotICAgICAgPGxpPk90aGVyd2lzZSwgYSBsaXN0aW5nIGdlbmVyYXRlZCBieSB0aGUgc2VydmVyLiBUaGUgb3RoZXIKLSAgICAgIGRpcmVjdGl2ZXMgY29udHJvbCB0aGUgZm9ybWF0IG9mIHRoaXMgbGlzdGluZy4gVGhlIDxkaXJlY3RpdmUKLSAgICAgIG1vZHVsZT0ibW9kX2F1dG9pbmRleCI+QWRkSWNvbjwvZGlyZWN0aXZlPiwgPGRpcmVjdGl2ZQotICAgICAgbW9kdWxlPSJtb2RfYXV0b2luZGV4Ij5BZGRJY29uQnlFbmNvZGluZzwvZGlyZWN0aXZlPiBhbmQKLSAgICAgIDxkaXJlY3RpdmUgbW9kdWxlPSJtb2RfYXV0b2luZGV4Ij5BZGRJY29uQnlUeXBlPC9kaXJlY3RpdmU+IGFyZQotICAgICAgdXNlZCB0byBzZXQgYSBsaXN0IG9mIGljb25zIHRvIGRpc3BsYXkgZm9yIHZhcmlvdXMgZmlsZSB0eXBlczsKLSAgICAgIGZvciBlYWNoIGZpbGUgbGlzdGVkLCB0aGUgZmlyc3QgaWNvbiBsaXN0ZWQgdGhhdCBtYXRjaGVzIHRoZQotICAgICAgZmlsZSBpcyBkaXNwbGF5ZWQuIFRoZXNlIGFyZSBjb250cm9sbGVkIGJ5Ci0gICAgICA8bW9kdWxlPm1vZF9hdXRvaW5kZXg8L21vZHVsZT4uPC9saT4KLSAgICA8L3VsPgotICAgIDxwPlRoZSB0d28gZnVuY3Rpb25zIGFyZSBzZXBhcmF0ZWQgc28gdGhhdCB5b3UgY2FuIGNvbXBsZXRlbHkKLSAgICByZW1vdmUgKG9yIHJlcGxhY2UpIGF1dG9tYXRpYyBpbmRleCBnZW5lcmF0aW9uIHNob3VsZCB5b3Ugd2FudAotICAgIHRvLjwvcD4gCi0KLSAgICA8cD5BdXRvbWF0aWMgaW5kZXggZ2VuZXJhdGlvbiBpcyBlbmFibGVkIHdpdGggdXNpbmcKLSAgICA8Y29kZT5PcHRpb25zICtJbmRleGVzPC9jb2RlPi4gU2VlIHRoZSAKLSAgICA8ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSI+T3B0aW9uczwvZGlyZWN0aXZlPiBkaXJlY3RpdmUgZm9yCi0gICAgbW9yZSBkZXRhaWxzLjwvcD4KLQotICAgIDxwPklmIHRoZSA8ZGlyZWN0aXZlIG1vZHVsZT0iYXV0b2luZGV4Ij5GYW5jeUluZGV4aW5nPC9kaXJlY3RpdmU+Ci0gICAgb3B0aW9uIGlzIGdpdmVuIHdpdGggdGhlIDxkaXJlY3RpdmUgbW9kdWxlPSJhdXRvaW5kZXgiCi0gICAgPkluZGV4T3B0aW9uczwvZGlyZWN0aXZlPiBkaXJlY3RpdmUsCi0gICAgdGhlIGNvbHVtbiBoZWFkZXJzIGFyZSBsaW5rcyB0aGF0IGNvbnRyb2wgdGhlIG9yZGVyIG9mIHRoZQotICAgIGRpc3BsYXkuIElmIHlvdSBzZWxlY3QgYSBoZWFkZXIgbGluaywgdGhlIGxpc3Rpbmcgd2lsbCBiZQotICAgIHJlZ2VuZXJhdGVkLCBzb3J0ZWQgYnkgdGhlIHZhbHVlcyBpbiB0aGF0IGNvbHVtbi4gU2VsZWN0aW5nIHRoZQotICAgIHNhbWUgaGVhZGVyIHJlcGVhdGVkbHkgdG9nZ2xlcyBiZXR3ZWVuIGFzY2VuZGluZyBhbmQgZGVzY2VuZGluZwotICAgIG9yZGVyLiBUaGVzZSBjb2x1bW4gaGVhZGVyIGxpbmtzIGFyZSBzdXBwcmVzc2VkIHdpdGgKLSAgICA8ZGlyZWN0aXZlIG1vZHVsZT0iYXV0b2luZGV4Ij5JbmRleE9wdGlvbnM8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlJ3MKLSAgICA8c2FtcD5TdXBwcmVzc0NvbHVtblNvcnRpbmc8L3NhbXA+IG9wdGlvbi48L3A+Ci0KLSAgICA8cD5Ob3RlIHRoYXQgd2hlbiB0aGUgZGlzcGxheSBpcyBzb3J0ZWQgYnkgIlNpemUiLCBpdCdzIHRoZQotICAgIDxlbT5hY3R1YWw8L2VtPiBzaXplIG9mIHRoZSBmaWxlcyB0aGF0J3MgdXNlZCwgbm90IHRoZQotICAgIGRpc3BsYXllZCB2YWx1ZSAtIHNvIGEgMTAxMC1ieXRlIGZpbGUgd2lsbCBhbHdheXMgYmUgZGlzcGxheWVkCi0gICAgYmVmb3JlIGEgMTAxMS1ieXRlIGZpbGUgKGlmIGluIGFzY2VuZGluZyBvcmRlcikgZXZlbiB0aG91Z2gKLSAgICB0aGV5IGJvdGggYXJlIHNob3duIGFzICIxSyIuPC9wPgotPC9zdW1tYXJ5PgotCi08c2VjdGlvbj48dGl0bGU+QXV0b2luZGV4IFJlcXVlc3QgUXVlcnkgQXJndW1lbnRzPC90aXRsZT4KLQotICAgIDxwPkFwYWNoZSAyLjAuMjMgcmVvcmdhbml6ZWQgdGhlIFF1ZXJ5IEFyZ3VtZW50cyBmb3IgQ29sdW1uCi0gICAgU29ydGluZywgYW5kIGludHJvZHVjZWQgYW4gZW50aXJlIGdyb3VwIG9mIG5ldyBxdWVyeSBvcHRpb25zLgotICAgIFRvIGVmZmVjdGl2ZWx5IGVsaW1pbmF0ZSBhbGwgY2xpZW50IGNvbnRyb2wgb3ZlciB0aGUgb3V0cHV0LAotICAgIHRoZSA8Y29kZT48YSBocmVmPSIjaW5kZXhvcHRpb25zOmlnbm9yZWNsaWVudCI+SW5kZXhPcHRpb25zCi0gICAgSWdub3JlQ2xpZW50PC9hPjwvY29kZT4gb3B0aW9uIHdhcyBpbnRyb2R1Y2VkLjwvcD4KLQotICAgIDxwPlRoZSBjb2x1bW4gc29ydGluZyBoZWFkZXJzIHRoZW1zZWx2ZXMgYXJlIHNlbGYtcmVmZXJlbmNpbmcKLSAgICBoeXBlcmxpbmtzIHRoYXQgYWRkIHRoZSBzb3J0IHF1ZXJ5IG9wdGlvbnMgc2hvd24gYmVsb3cuIEFueQotICAgIG9wdGlvbiBiZWxvdyBtYXkgYmUgYWRkZWQgdG8gYW55IHJlcXVlc3QgZm9yIHRoZSBkaXJlY3RvcnkKLSAgICByZXNvdXJjZS48L3A+Ci0KLSAgICA8dWw+Ci0gICAgICA8bGk+PHNhbXA+Qz1OPC9zYW1wPiBzb3J0cyB0aGUgZGlyZWN0b3J5IGJ5IGZpbGUgbmFtZTwvbGk+Ci0KLSAgICAgIDxsaT48c2FtcD5DPU08L3NhbXA+IHNvcnRzIHRoZSBkaXJlY3RvcnkgYnkgbGFzdC1tb2RpZmllZAotICAgICAgZGF0ZSwgdGhlbiBmaWxlIG5hbWU8L2xpPgotCi0gICAgICA8bGk+PHNhbXA+Qz1TPC9zYW1wPiBzb3J0cyB0aGUgZGlyZWN0b3J5IGJ5IHNpemUsIHRoZW4gZmlsZQotICAgICAgbmFtZTwvbGk+Ci0KLSAgICAgIDxsaT48c2FtcD5DPUQ8L3NhbXA+IHNvcnRzIHRoZSBkaXJlY3RvcnkgYnkgZGVzY3JpcHRpb24sIHRoZW4KLSAgICAgIGZpbGUgbmFtZTxiciAvPgotICAgICAgICZuYnNwOzwvbGk+Ci0KLSAgICAgIDxsaT48c2FtcD5PPUE8L3NhbXA+IHNvcnRzIHRoZSBsaXN0aW5nIGluIEFzY2VuZGluZwotICAgICAgT3JkZXI8L2xpPgotCi0gICAgICA8bGk+PHNhbXA+Tz1EPC9zYW1wPiBzb3J0cyB0aGUgbGlzdGluZyBpbiBEZXNjZW5kaW5nCi0gICAgICBPcmRlcjxiciAvPgotICAgICAgICZuYnNwOzwvbGk+Ci0KLSAgICAgIDxsaT48c2FtcD5GPTA8L3NhbXA+IGZvcm1hdHMgdGhlIGxpc3RpbmcgYXMgYSBzaW1wbGUgbGlzdAotICAgICAgKG5vdCBGYW5jeUluZGV4ZWQpPC9saT4KLQotICAgICAgPGxpPjxzYW1wPkY9MTwvc2FtcD4gZm9ybWF0cyB0aGUgbGlzdGluZyBhcyBhIEZhbmN5SW5kZXhlZAotICAgICAgbGlzdDwvbGk+Ci0KLSAgICAgIDxsaT48c2FtcD5GPTI8L3NhbXA+IGZvcm1hdHMgdGhlIGxpc3RpbmcgYXMgYW4gSFRNTFRhYmxlCi0gICAgICBGYW5jeUluZGV4ZWQgbGlzdDxiciAvPgotICAgICAgICZuYnNwOzwvbGk+Ci0KLSAgICAgIDxsaT48c2FtcD5WPTA8L3NhbXA+IGRpc2FibGVzIHZlcnNpb24gc29ydGluZzwvbGk+Ci0KLSAgICAgIDxsaT48c2FtcD5WPTE8L3NhbXA+IGVuYWJsZXMgdmVyc2lvbiBzb3J0aW5nPGJyIC8+Ci0gICAgICAgJm5ic3A7PC9saT4KLQotICAgICAgPGxpPjxzYW1wPlA9PGVtPnBhdHRlcm48L2VtPjwvc2FtcD4gbGlzdHMgb25seSBmaWxlcyBtYXRjaGluZwotICAgICAgdGhlIGdpdmVuIDxlbT5wYXR0ZXJuPC9lbT48L2xpPgotICAgIDwvdWw+Ci0KLSAgICA8cD5Ob3RlIHRoYXQgdGhlICdQJ2F0dGVybiBxdWVyeSBhcmd1bWVudCBpcyB0ZXN0ZWQKLSAgICA8ZW0+YWZ0ZXI8L2VtPiB0aGUgdXN1YWwgSW5kZXhJZ25vcmUgZGlyZWN0aXZlcyBhcmUgcHJvY2Vzc2VkLAotICAgIGFuZCBhbGwgZmlsZSBuYW1lcyBhcmUgc3RpbGwgc3ViamVjdGVkIHRvIHRoZSBzYW1lIGNyaXRlcmlhIGFzCi0gICAgYW55IG90aGVyIGF1dG9pbmRleCBsaXN0aW5nLiBUaGUgUXVlcnkgQXJndW1lbnRzIHBhcnNlciBpbgotICAgIG1vZF9hdXRvaW5kZXggd2lsbCBzdG9wIGFicnVwdGx5IHdoZW4gYW4gdW5yZWNvZ25pemVkIG9wdGlvbiBpcwotICAgIGVuY291bnRlcmVkLiBUaGUgUXVlcnkgQXJndW1lbnRzIG11c3QgYmUgd2VsbCBmb3JtZWQsIGFjY29yZGluZwotICAgIHRvIHRoZSB0YWJsZSBhYm92ZS48L3A+Ci0KLSAgICA8cD5UaGUgc2ltcGxlIGV4YW1wbGUgYmVsb3csIHdoaWNoIGNhbiBiZSBjbGlwcGVkIGFuZCBzYXZlZCBpbgotICAgIGEgaGVhZGVyLmh0bWwgZmlsZSwgaWxsdXN0cmF0ZXMgdGhlc2UgcXVlcnkgb3B0aW9ucy4gTm90ZSB0aGF0Ci0gICAgdGhlIHVua25vd24gIlgiIGFyZ3VtZW50LCBmb3IgdGhlIHN1Ym1pdCBidXR0b24sIGlzIGxpc3RlZCBsYXN0Ci0gICAgdG8gYXNzdXJlIHRoZSBhcmd1bWVudHMgYXJlIGFsbCBwYXJzZWQgYmVmb3JlIG1vZF9hdXRvaW5kZXgKLSAgICBlbmNvdW50ZXJzIHRoZSBYPUdvIGlucHV0LjwvcD4KLQotPGV4YW1wbGU+Ci0mbHQ7Rk9STSBNRVRIT0Q9IkdFVCImZ3Q7PGJyIC8+Ci0mbmJzcDsmbmJzcDtTaG93IG1lIGEgJmx0O1NFTEVDVCBOQU1FPSJGIiZndDs8YnIgLz4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtPUFRJT04gVkFMVUU9IjAiJmd0OyBQbGFpbiBsaXN0IDxiciAvPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O09QVElPTiBWQUxVRT0iMSIgU0VMRUNURUQmZ3Q7IEZhbmN5IGxpc3Q8YnIgLz4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtPUFRJT04gVkFMVUU9IjIiJmd0OyBUYWJsZSBsaXN0PGJyIC8+Ci0mbmJzcDsmbmJzcDsmbHQ7L1NFTEVDVCZndDs8YnIgLz4KLSZuYnNwOyZuYnNwO1NvcnRlZCBieSAmbHQ7U0VMRUNUIE5BTUU9IkMiJmd0OzxiciAvPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O09QVElPTiBWQUxVRT0iTiIgU0VMRUNURUQmZ3Q7IE5hbWU8YnIgLz4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtPUFRJT04gVkFMVUU9Ik0iJmd0OyBEYXRlIE1vZGlmaWVkPGJyIC8+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7T1BUSU9OIFZBTFVFPSJTIiZndDsgU2l6ZTxiciAvPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O09QVElPTiBWQUxVRT0iRCImZ3Q7IERlc2NyaXB0aW9uPGJyIC8+Ci0mbmJzcDsmbmJzcDsmbHQ7L1NFTEVDVCZndDs8YnIgLz4KLSZuYnNwOyZuYnNwOyZsdDtTRUxFQ1QgTkFNRT0iTyImZ3Q7PGJyIC8+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7T1BUSU9OIFZBTFVFPSJBIiBTRUxFQ1RFRCZndDsgQXNjZW5kaW5nPGJyIC8+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7T1BUSU9OIFZBTFVFPSJEIiZndDsgRGVzY2VuZGluZzxiciAvPgotJm5ic3A7Jm5ic3A7Jmx0Oy9TRUxFQ1QmZ3Q7PGJyIC8+Ci0mbmJzcDsmbmJzcDsmbHQ7U0VMRUNUIE5BTUU9IlYiJmd0OzxiciAvPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O09QVElPTiBWQUxVRT0iMCIgU0VMRUNURUQmZ3Q7IGluIE5vcm1hbCBvcmRlcjxiciAvPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O09QVElPTiBWQUxVRT0iMSImZ3Q7IGluIFZlcnNpb24gb3JkZXI8YnIgLz4KLSZuYnNwOyZuYnNwOyZsdDsvU0VMRUNUJmd0OzxiciAvPgotJm5ic3A7Jm5ic3A7TWF0Y2hpbmcgJmx0O0lOUFVUIFRZUEU9InRleHQiIE5BTUU9IlAiIFZBTFVFPSIqIiZndDs8YnIgLz4KLSZuYnNwOyZuYnNwOyZsdDtJTlBVVCBUWVBFPSJzdWJtaXQiIE5BTUU9IlgiIFZBTFVFPSJHbyImZ3Q7PGJyIC8+Ci0mbHQ7L0ZPUk0mZ3Q7Ci08L2V4YW1wbGU+Ci0KLTwvc2VjdGlvbj4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+QWRkQWx0PC9uYW1lPgotPGRlc2NyaXB0aW9uPkFsdGVybmF0ZSB0ZXh0IHRvIGRpc3BsYXkgZm9yIGEgZmlsZSwgaW5zdGVhZCBvZiBhbgotaWNvbiBzZWxlY3RlZCBieSBmaWxlbmFtZTwvZGVzY3JpcHRpb24+Ci08c3ludGF4PkFkZEFsdCA8ZW0+c3RyaW5nIGZpbGU8L2VtPiBbPGVtPmZpbGU8L2VtPl0gLi4uPC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT5JbmRleGVzPC9vdmVycmlkZT4KLQotPHVzYWdlPgotICAgIDxwPjxkaXJlY3RpdmU+QWRkQWx0PC9kaXJlY3RpdmU+IHByb3ZpZGVzIHRoZSBhbHRlcm5hdGUgdGV4dCB0bwotICAgIGRpc3BsYXkgZm9yIGEgZmlsZSwgaW5zdGVhZCBvZiBhbiBpY29uLCBmb3IgPGNvZGU+PGEKLSAgICBocmVmPSIjaW5kZXhvcHRpb25zOmZhbmN5aW5kZXhpbmciPkZhbmN5SW5kZXhpbmc8L2E+PC9jb2RlPi4KLSAgICA8ZW0+RmlsZTwvZW0+IGlzIGEgZmlsZSBleHRlbnNpb24sIHBhcnRpYWwgZmlsZW5hbWUsIHdpbGQtY2FyZAotICAgIGV4cHJlc3Npb24gb3IgZnVsbCBmaWxlbmFtZSBmb3IgZmlsZXMgdG8gZGVzY3JpYmUuCi0gICAgPGVtPlN0cmluZzwvZW0+IGlzIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMgKDxjb2RlPiI8L2NvZGU+KS4KLSAgICBUaGlzIGFsdGVybmF0ZSB0ZXh0IGlzIGRpc3BsYXllZCBpZiB0aGUgY2xpZW50IGlzIGltYWdlLWluY2FwYWJsZSwKLSAgICBoYXMgaW1hZ2UgbG9hZGluZyBkaXNhYmxlZCwgb3IgZmFpbHMgdG8gcmV0cmlldmUgdGhlIGljb24uPC9wPgotCi0gICAgPHA+RXhhbXBsZXM6PC9wPgotPGV4YW1wbGU+Ci0gICAgQWRkQWx0ICJQREYiICoucGRmPGJyIC8+Ci0gICAgQWRkQWx0ICJDb21wcmVzc2VkIiAqLmd6ICouemlwICouWgotPC9leGFtcGxlPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkFkZEFsdEJ5RW5jb2Rpbmc8L25hbWU+Ci08ZGVzY3JpcHRpb24+QWx0ZXJuYXRlIHRleHQgdG8gZGlzcGxheSBmb3IgYSBmaWxlIGluc3RlYWQgb2YgYW4gaWNvbgotc2VsZWN0ZWQgYnkgTUlNRS1lbmNvZGluZzwvZGVzY3JpcHRpb24+Ci08c3ludGF4PkFkZEFsdEJ5RW5jb2RpbmcgPGVtPnN0cmluZyBNSU1FLWVuY29kaW5nPC9lbT4KLVs8ZW0+TUlNRS1lbmNvZGluZzwvZW0+XSAuLi48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPkluZGV4ZXM8L292ZXJyaWRlPgotCi08dXNhZ2U+Ci0gICAgPHA+PGRpcmVjdGl2ZT5BZGRBbHRCeUVuY29kaW5nPC9kaXJlY3RpdmU+IHByb3ZpZGVzIHRoZSBhbHRlcm5hdGUKLSAgICB0ZXh0IHRvIGRpc3BsYXkgZm9yIGEgZmlsZSwgaW5zdGVhZCBvZiBhbiBpY29uLCBmb3IgPGNvZGU+PGEKLSAgICBocmVmPSIjaW5kZXhvcHRpb25zOmZhbmN5aW5kZXhpbmciPkZhbmN5SW5kZXhpbmc8L2E+PC9jb2RlPi4KLSAgICA8ZW0+TUlNRS1lbmNvZGluZzwvZW0+IGlzIGEgdmFsaWQgY29udGVudC1lbmNvZGluZywgc3VjaCBhcwotICAgIDxjb2RlPngtY29tcHJlc3M8L2NvZGU+LiA8ZW0+U3RyaW5nPC9lbT4gaXMgZW5jbG9zZWQgaW4gZG91YmxlCi0gICAgcXVvdGVzICg8Y29kZT4iPC9jb2RlPikuIFRoaXMgYWx0ZXJuYXRlIHRleHQgaXMgZGlzcGxheWVkIGlmIHRoZQotICAgIGNsaWVudCBpcyBpbWFnZS1pbmNhcGFibGUsIGhhcyBpbWFnZSBsb2FkaW5nIGRpc2FibGVkLCBvciBmYWlscyB0bwotICAgIHJldHJpZXZlIHRoZSBpY29uLjwvcD4KLQotICAgIDxwPkV4YW1wbGU6PC9wPgotPGV4YW1wbGU+Ci0gICAgQWRkQWx0QnlFbmNvZGluZyAiZ3ppcCIgeC1nemlwCi08L2V4YW1wbGU+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+QWRkQWx0QnlUeXBlPC9uYW1lPgotPGRlc2NyaXB0aW9uPkFsdGVybmF0ZSB0ZXh0IHRvIGRpc3BsYXkgZm9yIGEgZmlsZSwgaW5zdGVhZCBvZiBhbgotaWNvbiBzZWxlY3RlZCBieSBNSU1FIGNvbnRlbnQtdHlwZTwvZGVzY3JpcHRpb24+Ci08c3ludGF4PkFkZEFsdEJ5VHlwZSA8ZW0+c3RyaW5nCi0gICAgTUlNRS10eXBlPC9lbT4gWzxlbT5NSU1FLXR5cGU8L2VtPl0gLi4uPC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT5JbmRleGVzPC9vdmVycmlkZT4KLQotPHVzYWdlPgotICAgIDxwPjxkaXJlY3RpdmU+QWRkQWx0QnlUeXBlPC9kaXJlY3RpdmU+IHNldHMgdGhlIGFsdGVybmF0ZSB0ZXh0IHRvCi0gICAgZGlzcGxheSBmb3IgYSBmaWxlLCBpbnN0ZWFkIG9mIGFuIGljb24sIGZvciA8Y29kZT48YQotICAgIGhyZWY9IiNpbmRleG9wdGlvbnM6ZmFuY3lpbmRleGluZyI+RmFuY3lJbmRleGluZzwvYT48L2NvZGU+LgotICAgIDxlbT5NSU1FLXR5cGU8L2VtPiBpcyBhIHZhbGlkIGNvbnRlbnQtdHlwZSwgc3VjaCBhcwotICAgIDxjb2RlPnRleHQvaHRtbDwvY29kZT4uIDxlbT5TdHJpbmc8L2VtPiBpcyBlbmNsb3NlZCBpbiBkb3VibGUKLSAgICBxdW90ZXMgKDxjb2RlPiI8L2NvZGU+KS4gVGhpcyBhbHRlcm5hdGUgdGV4dCBpcyBkaXNwbGF5ZWQgaWYgdGhlCi0gICAgY2xpZW50IGlzIGltYWdlLWluY2FwYWJsZSwgaGFzIGltYWdlIGxvYWRpbmcgZGlzYWJsZWQsIG9yIGZhaWxzIHRvCi0gICAgcmV0cmlldmUgdGhlIGljb24uPC9wPgotCi0gICAgPHA+RXhhbXBsZTo8L3A+Ci08ZXhhbXBsZT4KLSAgICBBZGRBbHRCeVR5cGUgIlRYVCIgdGV4dC9wbGFpbgotPC9leGFtcGxlPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkFkZERlc2NyaXB0aW9uPC9uYW1lPgotPHN5bnRheD5BZGREZXNjcmlwdGlvbgotICAgIDxlbT5zdHJpbmcgZmlsZTwvZW0+IFs8ZW0+ZmlsZTwvZW0+XSAuLi48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPkluZGV4ZXM8L292ZXJyaWRlPgotCi08dXNhZ2U+Ci0gICAgPHA+VGhpcyBzZXRzIHRoZSBkZXNjcmlwdGlvbiB0byBkaXNwbGF5IGZvciBhIGZpbGUsIGZvcgotICAgIDxjb2RlPjxhCi0gICAgaHJlZj0iI2luZGV4b3B0aW9uczpmYW5jeWluZGV4aW5nIj5GYW5jeUluZGV4aW5nPC9hPjwvY29kZT4uCi0gICAgPGVtPkZpbGU8L2VtPiBpcyBhIGZpbGUgZXh0ZW5zaW9uLCBwYXJ0aWFsIGZpbGVuYW1lLCB3aWxkLWNhcmQKLSAgICBleHByZXNzaW9uIG9yIGZ1bGwgZmlsZW5hbWUgZm9yIGZpbGVzIHRvIGRlc2NyaWJlLgotICAgIDxlbT5TdHJpbmc8L2VtPiBpcyBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzICg8Y29kZT4iPC9jb2RlPikuCi0gICAgRXhhbXBsZTo8L3A+Ci0KLTxleGFtcGxlPkFkZERlc2NyaXB0aW9uICJUaGUgcGxhbmV0IE1hcnMiCi0gICAgICAvd2ViL3BpY3MvbWFycy5naWY8L2V4YW1wbGU+Ci0KLSAgICA8cD5UaGUgdHlwaWNhbCwgZGVmYXVsdCBkZXNjcmlwdGlvbiBmaWVsZCBpcyAyMyBieXRlcyB3aWRlLiA2Ci0gICAgbW9yZSBieXRlcyBhcmUgYWRkZWQgYnkgdGhlCi0gICAgPGNvZGU+SW5kZXhPcHRpb25zJm5ic3A7U3VwcHJlc3NJY29uPC9jb2RlPiBvcHRpb24sIDcgYnl0ZXMgYXJlCi0gICAgYWRkZWQgYnkgdGhlIDxjb2RlPkluZGV4T3B0aW9ucyZuYnNwO1N1cHByZXNzU2l6ZTwvY29kZT4KLSAgICBvcHRpb24sIGFuZCAxOSBieXRlcyBhcmUgYWRkZWQgYnkgdGhlCi0gICAgPGNvZGU+SW5kZXhPcHRpb25zJm5ic3A7U3VwcHJlc3NMYXN0TW9kaWZpZWQ8L2NvZGU+IG9wdGlvbi4KLSAgICBUaGVyZWZvcmUsIHRoZSB3aWRlc3QgZGVmYXVsdCB0aGUgZGVzY3JpcHRpb24gY29sdW1uIGlzIGV2ZXIKLSAgICBhc3NpZ25lZCBpcyA1NSBieXRlcy48L3A+Ci0KLSAgICA8cD5TZWUgdGhlIDxhCi0gICAgaHJlZj0iI2luZGV4b3B0aW9uczpkZXNjcmlwdGlvbndpZHRoIj5EZXNjcmlwdGlvbldpZHRoPC9hPgotICAgIDxkaXJlY3RpdmUgbW9kdWxlPSJtb2RfYXV0b2luZGV4Ij5JbmRleE9wdGlvbnM8L2RpcmVjdGl2ZT4ga2V5d29yZAotICAgIGZvciBkZXRhaWxzIG9uIG92ZXJyaWRpbmcgdGhlIHNpemUgb2YgdGhpcyBjb2x1bW4sIG9yIGFsbG93aW5nCi0gICAgZGVzY3JpcHRpb25zIG9mIHVubGltaXRlZCBsZW5ndGguPC9wPgotCi08bm90ZT48dGl0bGU+Q2F1dGlvbjwvdGl0bGU+IDxwPkRlc2NyaXB0aXZlIHRleHQgZGVmaW5lZCB3aXRoCi0gICAgICA8ZGlyZWN0aXZlPkFkZERlc2NyaXB0aW9uPC9kaXJlY3RpdmU+IG1heSBjb250YWluIEhUTUwgbWFya3VwLCBzdWNoIGFzCi0gICAgICB0YWdzIGFuZCBjaGFyYWN0ZXIgZW50aXRpZXMuIElmIHRoZSB3aWR0aCBvZiB0aGUgZGVzY3JpcHRpb24KLSAgICAgIGNvbHVtbiBzaG91bGQgaGFwcGVuIHRvIHRydW5jYXRlIGEgdGFnZ2VkIGVsZW1lbnQgKHN1Y2ggYXMKLSAgICAgIGN1dHRpbmcgb2ZmIHRoZSBlbmQgb2YgYSBib2xkZWQgcGhyYXNlKSwgdGhlIHJlc3VsdHMgbWF5Ci0gICAgICBhZmZlY3QgdGhlIHJlc3Qgb2YgdGhlIGRpcmVjdG9yeSBsaXN0aW5nLjwvcD4KLTwvbm90ZT4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5BZGRJY29uPC9uYW1lPgotPGRlc2NyaXB0aW9uPkljb24gdG8gZGlzcGxheSBmb3IgYSBmaWxlIHNlbGVjdGVkIGJ5IG5hbWU8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5BZGRJY29uIDxlbT5pY29uCi0gICAgbmFtZTwvZW0+IFs8ZW0+bmFtZTwvZW0+XSAuLi48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPkluZGV4ZXM8L292ZXJyaWRlPgotCi08dXNhZ2U+Ci0gICAgPHA+VGhpcyBzZXRzIHRoZSBpY29uIHRvIGRpc3BsYXkgbmV4dCB0byBhIGZpbGUgZW5kaW5nIGluCi0gICAgPGVtPm5hbWU8L2VtPiBmb3IgPGNvZGU+PGEKLSAgICBocmVmPSIjaW5kZXhvcHRpb25zOmZhbmN5aW5kZXhpbmciPkZhbmN5SW5kZXhpbmc8L2E+PC9jb2RlPi4KLSAgICA8ZW0+SWNvbjwvZW0+IGlzIGVpdGhlciBhICglLWVzY2FwZWQpIHJlbGF0aXZlIFVSTCB0byB0aGUgaWNvbiwKLSAgICBvciBvZiB0aGUgZm9ybWF0ICg8ZW0+YWx0dGV4dDwvZW0+LDxlbT51cmw8L2VtPikgd2hlcmUKLSAgICA8ZW0+YWx0dGV4dDwvZW0+IGlzIHRoZSB0ZXh0IHRhZyBnaXZlbiBmb3IgYW4gaWNvbiBmb3IKLSAgICBub24tZ3JhcGhpY2FsIGJyb3dzZXJzLjwvcD4KLQotICAgIDxwPjxlbT5OYW1lPC9lbT4gaXMgZWl0aGVyIF5eRElSRUNUT1JZXl4gZm9yIGRpcmVjdG9yaWVzLAotICAgIF5eQkxBTktJQ09OXl4gZm9yIGJsYW5rIGxpbmVzICh0byBmb3JtYXQgdGhlIGxpc3QgY29ycmVjdGx5KSwgYQotICAgIGZpbGUgZXh0ZW5zaW9uLCBhIHdpbGRjYXJkIGV4cHJlc3Npb24sIGEgcGFydGlhbCBmaWxlbmFtZSBvciBhCi0gICAgY29tcGxldGUgZmlsZW5hbWUuIEV4YW1wbGVzOjwvcD4KLQotPGV4YW1wbGU+Ci0gICAgICBBZGRJY29uIChJTUcsL2ljb25zL2ltYWdlLnhibSkgLmdpZiAuanBnIC54Ym08YnIgLz4KLSAgICAgICBBZGRJY29uIC9pY29ucy9kaXIueGJtIF5eRElSRUNUT1JZXl48YnIgLz4KLSAgICAgICBBZGRJY29uIC9pY29ucy9iYWNrdXAueGJtICp+Ci08L2V4YW1wbGU+Ci0gICAgCi0gICAgPHA+PGRpcmVjdGl2ZSBtb2R1bGU9Im1vZF9hdXRvaW5kZXgiPkFkZEljb25CeVR5cGU8L2RpcmVjdGl2ZT4KLSAgICBzaG91bGQgYmUgdXNlZCBpbiBwcmVmZXJlbmNlIHRvIDxkaXJlY3RpdmU+QWRkSWNvbjwvZGlyZWN0aXZlPiwKLSAgICB3aGVuIHBvc3NpYmxlLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5BZGRJY29uQnlFbmNvZGluZzwvbmFtZT4KLTxkZXNjcmlwdGlvbj5JY29uIHRvIGRpc3BsYXkgbmV4dCB0byBmaWxlcyBzZWxlY3RlZCBieSBNSU1FIAotY29udGVudC1lbmNvZGluZzwvZGVzY3JpcHRpb24+Ci08c3ludGF4PkFkZEljb25CeUVuY29kaW5nCi0gICAgPGVtPmljb24gTUlNRS1lbmNvZGluZzwvZW0+IFs8ZW0+TUlNRS1lbmNvZGluZzwvZW0+XSAuLi48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPkluZGV4ZXM8L292ZXJyaWRlPgotCi08dXNhZ2U+Ci0gICAgPHA+VGhpcyBzZXRzIHRoZSBpY29uIHRvIGRpc3BsYXkgbmV4dCB0byBmaWxlcyB3aXRoIDxjb2RlPjxhCi0gICAgaHJlZj0iI2luZGV4b3B0aW9uczpmYW5jeWluZGV4aW5nIj5GYW5jeUluZGV4aW5nPC9hPjwvY29kZT4uCi0gICAgPGVtPkljb248L2VtPiBpcyBlaXRoZXIgYSAoJS1lc2NhcGVkKSByZWxhdGl2ZSBVUkwgdG8gdGhlIGljb24sCi0gICAgb3Igb2YgdGhlIGZvcm1hdCAoPGVtPmFsdHRleHQ8L2VtPiw8ZW0+dXJsPC9lbT4pIHdoZXJlCi0gICAgPGVtPmFsdHRleHQ8L2VtPiBpcyB0aGUgdGV4dCB0YWcgZ2l2ZW4gZm9yIGFuIGljb24gZm9yCi0gICAgbm9uLWdyYXBoaWNhbCBicm93c2Vycy48L3A+Ci0KLSAgICA8cD48ZW0+TWltZS1lbmNvZGluZzwvZW0+IGlzIGEgd2lsZGNhcmQgZXhwcmVzc2lvbiBtYXRjaGluZwotICAgIHJlcXVpcmVkIHRoZSBjb250ZW50LWVuY29kaW5nLiBFeGFtcGxlczo8L3A+Ci0KLTxleGFtcGxlPkFkZEljb25CeUVuY29kaW5nIC9pY29ucy9jb21wcmVzcy54Ym0geC1jb21wcmVzczwvZXhhbXBsZT4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5BZGRJY29uQnlUeXBlPC9uYW1lPgotPGRlc2NyaXB0aW9uPkljb24gdG8gZGlzcGxheSBuZXh0IHRvIGZpbGVzIHNlbGVjdGVkIGJ5IE1JTUUgCi1jb250ZW50LXR5cGU8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5BZGRJY29uQnlUeXBlCi0gICAgPGVtPmljb24gTUlNRS10eXBlPC9lbT4gWzxlbT5NSU1FLXR5cGU8L2VtPl0gLi4uPC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT5JbmRleGVzPC9vdmVycmlkZT4KLQotPHVzYWdlPgotICAgIDxwPlRoaXMgc2V0cyB0aGUgaWNvbiB0byBkaXNwbGF5IG5leHQgdG8gZmlsZXMgb2YgdHlwZQotICAgIDxlbT5NSU1FLXR5cGU8L2VtPiBmb3IgPGNvZGU+PGEKLSAgICBocmVmPSIjaW5kZXhvcHRpb25zOmZhbmN5aW5kZXhpbmciPkZhbmN5SW5kZXhpbmc8L2E+PC9jb2RlPi4KLSAgICA8ZW0+SWNvbjwvZW0+IGlzIGVpdGhlciBhICglLWVzY2FwZWQpIHJlbGF0aXZlIFVSTCB0byB0aGUgaWNvbiwKLSAgICBvciBvZiB0aGUgZm9ybWF0ICg8ZW0+YWx0dGV4dDwvZW0+LDxlbT51cmw8L2VtPikgd2hlcmUKLSAgICA8ZW0+YWx0dGV4dDwvZW0+IGlzIHRoZSB0ZXh0IHRhZyBnaXZlbiBmb3IgYW4gaWNvbiBmb3IKLSAgICBub24tZ3JhcGhpY2FsIGJyb3dzZXJzLjwvcD4KLQotICAgIDxwPjxlbT5NaW1lLXR5cGU8L2VtPiBpcyBhIHdpbGRjYXJkIGV4cHJlc3Npb24gbWF0Y2hpbmcKLSAgICByZXF1aXJlZCB0aGUgbWltZSB0eXBlcy4gRXhhbXBsZXM6PC9wPgotCi08ZXhhbXBsZT5BZGRJY29uQnlUeXBlIChJTUcsL2ljb25zL2ltYWdlLnhibSkgaW1hZ2UvKjwvZXhhbXBsZT4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5EZWZhdWx0SWNvbjwvbmFtZT4KLTxkZXNjcmlwdGlvbj5JY29uIHRvIGRpc3BsYXkgZm9yIGZpbGVzIHdoZW4gbm8gc3BlY2lmaWMgaWNvbiBpcwotY29uZmlndXJlZDwvZGVzY3JpcHRpb24+Ci08c3ludGF4PkRlZmF1bHRJY29uIDxlbT51cmwtcGF0aDwvZW0+PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT5JbmRleGVzPC9vdmVycmlkZT4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPkRlZmF1bHRJY29uPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBzZXRzIHRoZSBpY29uCi0gICAgdG8gZGlzcGxheSBmb3IgZmlsZXMgd2hlbiBubyBzcGVjaWZpYyBpY29uIGlzIGtub3duLCBmb3IgPGNvZGU+PGEKLSAgICBocmVmPSIjaW5kZXhvcHRpb25zOmZhbmN5aW5kZXhpbmciPkZhbmN5SW5kZXhpbmc8L2E+PC9jb2RlPi4KLSAgICA8ZW0+VXJsPC9lbT4gaXMgYSAoJS1lc2NhcGVkKSByZWxhdGl2ZSBVUkwgdG8gdGhlIGljb24uCi0gICAgRXhhbXBsZXM6PC9wPgotPGV4YW1wbGU+RGVmYXVsdEljb24gL2ljb24vdW5rbm93bi54Ym08L2V4YW1wbGU+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+SGVhZGVyTmFtZTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5OYW1lIG9mIHRoZSBmaWxlIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCBhdCB0aGUgdG9wCi1vZiB0aGUgaW5kZXggbGlzdGluZzwvZGVzY3JpcHRpb24+Ci08c3ludGF4PkhlYWRlck5hbWUgPGVtPmZpbGVuYW1lPC9lbT48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPkluZGV4ZXM8L292ZXJyaWRlPgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIDxkaXJlY3RpdmU+SGVhZGVyTmFtZTwvZGlyZWN0aXZlPiBkaXJlY3RpdmUgc2V0cyB0aGUgbmFtZQotICAgIG9mIHRoZSBmaWxlIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCBhdCB0aGUgdG9wIG9mIHRoZSBpbmRleAotICAgIGxpc3RpbmcuIDxlbT5GaWxlbmFtZTwvZW0+IGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGluY2x1ZGUuPC9wPgotCi08bm90ZT4KLSAgICAgIDxwPkJvdGggSGVhZGVyTmFtZSBhbmQgPGRpcmVjdGl2ZQotICAgICAgbW9kdWxlPSJtb2RfYXV0b2luZGV4Ij5SZWFkbWVOYW1lPC9kaXJlY3RpdmU+IG5vdyB0cmVhdAotICAgICAgPGVtPkZpbGVuYW1lPC9lbT4gYXMgYSBVUkkgcGF0aCByZWxhdGl2ZSB0byB0aGUgb25lIHVzZWQgdG8KLSAgICAgIGFjY2VzcyB0aGUgZGlyZWN0b3J5IGJlaW5nIGluZGV4ZWQuIDxlbT5GaWxlbmFtZTwvZW0+IG11c3QKLSAgICAgIHJlc29sdmUgdG8gYSBkb2N1bWVudCB3aXRoIGEgbWFqb3IgY29udGVudCB0eXBlIG9mCi0gICAgICAiPGNvZGU+dGV4dC8qPC9jb2RlPiIgKDxlbT5lLmcuPC9lbT4sIDxjb2RlPnRleHQvaHRtbDwvY29kZT4sCi0gICAgICA8Y29kZT50ZXh0L3BsYWluPC9jb2RlPiwgPGVtPmV0Yy48L2VtPikuIFRoaXMgbWVhbnMgdGhhdAotICAgICAgPGVtPmZpbGVuYW1lPC9lbT4gbWF5IHJlZmVyIHRvIGEgQ0dJIHNjcmlwdCBpZiB0aGUgc2NyaXB0J3MKLSAgICAgIGFjdHVhbCBmaWxlIHR5cGUgKGFzIG9wcG9zZWQgdG8gaXRzIG91dHB1dCkgaXMgbWFya2VkIGFzCi0gICAgICA8Y29kZT50ZXh0L2h0bWw8L2NvZGU+IHN1Y2ggYXMgd2l0aCBhIGRpcmVjdGl2ZSBsaWtlOjwvcD4KLTxleGFtcGxlPgotICAgIEFkZFR5cGUgdGV4dC9odG1sIC5jZ2kKLTwvZXhhbXBsZT4KLSAgICAgIDxwPjxhIGhyZWY9Ii4uL2NvbnRlbnQtbmVnb3RpYXRpb24uaHRtbCI+Q29udGVudCBuZWdvdGlhdGlvbjwvYT4KLSAgICAgIHdpbGwgYmUgcGVyZm9ybWVkIGlmIHRoZSA8Y29kZT5NdWx0aVZpZXdzPC9jb2RlPiA8ZGlyZWN0aXZlCi0gICAgICBtb2R1bGU9ImNvcmUiPk9wdGlvbjwvZGlyZWN0aXZlPiBpcyBlbmFibGVkLiBJZgotICAgICAgPGVtPmZpbGVuYW1lPC9lbT4gcmVzb2x2ZXMgdG8gYSBzdGF0aWMgPGNvZGU+dGV4dC9odG1sPC9jb2RlPgotICAgICAgZG9jdW1lbnQgKG5vdCBhIENHSSBzY3JpcHQpIGFuZCB0aGUgPGNvZGU+SW5jbHVkZXM8L2NvZGU+Ci0gICAgICA8ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSI+b3B0aW9uPC9kaXJlY3RpdmU+IGlzIGVuYWJsZWQsIHRoZSBmaWxlCi0gICAgICB3aWxsIGJlIHByb2Nlc3NlZCBmb3Igc2VydmVyLXNpZGUgaW5jbHVkZXMgKHNlZSB0aGUKLSAgICAgIDxtb2R1bGU+bW9kX2luY2x1ZGU8L21vZHVsZT4gZG9jdW1lbnRhdGlvbikuPC9wPgotPC9ub3RlPgotCi0gICAgPHA+SWYgdGhlIGZpbGUgc3BlY2lmaWVkIGJ5IDxkaXJlY3RpdmU+SGVhZGVyTmFtZTwvZGlyZWN0aXZlPiBjb250YWlucwotICAgIHRoZSBiZWdpbm5pbmdzIG9mIGFuIEhUTUwgZG9jdW1lbnQgKCZsdDtIVE1MJmd0OywgJmx0O0hFQUQmZ3Q7LAotICAgIGV0YykgdGhlbiB5b3Ugd2lsbCBwcm9iYWJseSB3YW50IHRvIHNldCA8YQotICAgIGhyZWY9IiNpbmRleG9wdGlvbnM6c3VwcHJlc3NodG1scHJlYW1ibGUiPjxjb2RlPkluZGV4T3B0aW9ucwotICAgICtTdXBwcmVzc0hUTUxQcmVhbWJsZTwvY29kZT48L2E+LCBzbyB0aGF0IHRoZXNlIHRhZ3MgYXJlIG5vdAotICAgIHJlcGVhdGVkLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5JbmRleElnbm9yZTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5BZGRzIHRvIHRoZSBsaXN0IG9mIGZpbGVzIHRvIGhpZGUgd2hlbiBsaXN0aW5nIAotYSBkaXJlY3Rvcnk8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5JbmRleElnbm9yZSA8ZW0+ZmlsZTwvZW0+IFs8ZW0+ZmlsZTwvZW0+XSAuLi48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPkluZGV4ZXM8L292ZXJyaWRlPgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIDxkaXJlY3RpdmU+SW5kZXhJZ25vcmU8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIGFkZHMgdG8gdGhlCi0gICAgbGlzdCBvZiBmaWxlcyB0byBoaWRlIHdoZW4gbGlzdGluZyBhIGRpcmVjdG9yeS4gPGVtPkZpbGU8L2VtPiBpcyBhCi0gICAgZmlsZSBleHRlbnNpb24sIHBhcnRpYWwgZmlsZW5hbWUsIHdpbGRjYXJkIGV4cHJlc3Npb24gb3IgZnVsbAotICAgIGZpbGVuYW1lIGZvciBmaWxlcyB0byBpZ25vcmUuIE11bHRpcGxlIEluZGV4SWdub3JlIGRpcmVjdGl2ZXMgYWRkCi0gICAgdG8gdGhlIGxpc3QsIHJhdGhlciB0aGFuIHRoZSByZXBsYWNpbmcgdGhlIGxpc3Qgb2YgaWdub3JlZAotICAgIGZpbGVzLiBCeSBkZWZhdWx0LCB0aGUgbGlzdCBjb250YWlucwotICAgIGA8Y29kZT4uPC9jb2RlPicuIEV4YW1wbGU6PC9wPgotCi08ZXhhbXBsZT5JbmRleElnbm9yZSBSRUFETUUgLmh0YWNjZXNzICp+PC9leGFtcGxlPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkluZGV4T3B0aW9uczwvbmFtZT4KLTxkZXNjcmlwdGlvbj5WYXJpb3VzIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIGRpcmVjdG9yeSAKLWluZGV4aW5nPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+SW5kZXhPcHRpb25zICBbK3wtXTxlbT5vcHRpb248L2VtPiBbWyt8LV08ZW0+b3B0aW9uPC9lbT5dIC4uLjwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0Pjxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+SW5kZXhlczwvb3ZlcnJpZGU+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5JbmRleE9wdGlvbnM8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIHNwZWNpZmllcyB0aGUKLSAgICBiZWhhdmlvciBvZiB0aGUgZGlyZWN0b3J5IGluZGV4aW5nLiA8ZW0+T3B0aW9uPC9lbT4gY2FuIGJlIG9uZQotICAgIG9mPC9wPgotCi0gICAgPGRsPgotICAgICAgPGR0PjxhIGlkPSJpbmRleG9wdGlvbnM6ZGVzY3JpcHRpb253aWR0aCIKLSAgICAgIG5hbWU9ImluZGV4b3B0aW9uczpkZXNjcmlwdGlvbndpZHRoIj5EZXNjcmlwdGlvbldpZHRoPVs8ZW0+bjwvZW0+Ci0gICAgICB8ICpdICg8ZW0+QXBhY2hlIDEuMy4xMCBvciAyLjAuMjMgYW5kIGxhdGVyPC9lbT4pPC9hPjwvZHQ+Ci0KLSAgICAgIDxkZD5UaGUgPGNvZGU+RGVzY3JpcHRpb25XaWR0aDwvY29kZT4ga2V5d29yZCBhbGxvd3MgeW91IHRvCi0gICAgICBzcGVjaWZ5IHRoZSB3aWR0aCBvZiB0aGUgZGVzY3JpcHRpb24gY29sdW1uIGluCi0gICAgICBjaGFyYWN0ZXJzLjwvZGQ+Ci0KLSAgICAgIDxkZD48Y29kZT4tRGVzY3JpcHRpb25XaWR0aDwvY29kZT4gKG9yIHVuc2V0KSBhbGxvd3MKLSAgICAgIG1vZF9hdXRvaW5kZXggdG8gY2FsY3VsYXRlIHRoZSBiZXN0IHdpZHRoLjwvZGQ+Ci0KLSAgICAgIDxkZD48Y29kZT5EZXNjcmlwdGlvbldpZHRoPW48L2NvZGU+IGZpeGVzIHRoZSBjb2x1bW4gd2lkdGggdG8KLSAgICAgIG4gYnl0ZXMgd2lkZS48L2RkPgotCi0gICAgICA8ZGQ+PGNvZGU+RGVzY3JpcHRpb25XaWR0aD0qPC9jb2RlPiBncm93cyB0aGUgY29sdW1uIHRvIHRoZQotICAgICAgd2lkdGggbmVjZXNzYXJ5IHRvIGFjY29tbW9kYXRlIHRoZSBsb25nZXN0IGRlc2NyaXB0aW9uCi0gICAgICBzdHJpbmcuPC9kZD4KLQotICAgICAgPGRkPjxiPlNlZSB0aGUgc2VjdGlvbiBvbiA8ZGlyZWN0aXZlCi0gICAgICBtb2R1bGU9Im1vZF9hdXRvaW5kZXgiPkFkZERlc2NyaXB0aW9uPC9kaXJlY3RpdmU+IGZvciBkYW5nZXJzCi0gICAgICBpbmhlcmVudCBpbiB0cnVuY2F0aW5nIGRlc2NyaXB0aW9ucy48L2I+PC9kZD4KLQotICAgICAgPGR0PjxhIGlkPSJpbmRleG9wdGlvbnM6ZmFuY3lpbmRleGluZyIKLSAgICAgIG5hbWU9ImluZGV4b3B0aW9uczpmYW5jeWluZGV4aW5nIj5GYW5jeUluZGV4aW5nPC9hPjwvZHQ+Ci0KLSAgICAgIDxkZD4KLSAgICAgIFRoaXMgdHVybnMgb24gZmFuY3kgaW5kZXhpbmcgb2YgZGlyZWN0b3JpZXMuPC9kZD4KLQotICAgICAgPGR0PjxhIGlkPSJpbmRleG9wdGlvbnM6Zm9sZGVyc2ZpcnN0IgotICAgICAgbmFtZT0iaW5kZXhvcHRpb25zOmZvbGRlcnNmaXJzdCI+Rm9sZGVyc0ZpcnN0ICg8aT5BcGFjaGUKLSAgICAgIDEuMy4xMCBvciAyLjAuMjMgYW5kIGxhdGVyPC9pPik8L2E+PC9kdD4KLQotICAgICAgPGRkPklmIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQsIHN1YmRpcmVjdG9yeSBsaXN0aW5ncyB3aWxsCi0gICAgICA8aT5hbHdheXM8L2k+IGFwcGVhciBmaXJzdCwgZm9sbG93ZWQgYnkgbm9ybWFsIGZpbGVzIGluIHRoZQotICAgICAgZGlyZWN0b3J5LiBUaGUgbGlzdGluZyBpcyBiYXNpY2FsbHkgYnJva2VuIGludG8gdHdvCi0gICAgICBjb21wb25lbnRzLCB0aGUgZmlsZXMgYW5kIHRoZSBzdWJkaXJlY3RvcmllcywgYW5kIGVhY2ggaXMKLSAgICAgIHNvcnRlZCBzZXBhcmF0ZWx5IGFuZCB0aGVuIGRpc3BsYXllZCBzdWJkaXJlY3Rvcmllcy1maXJzdC4KLSAgICAgIEZvciBpbnN0YW5jZSwgaWYgdGhlIHNvcnQgb3JkZXIgaXMgZGVzY2VuZGluZyBieSBuYW1lLCBhbmQKLSAgICAgIDxjb2RlPkZvbGRlcnNGaXJzdDwvY29kZT4gaXMgZW5hYmxlZCwgc3ViZGlyZWN0b3J5Ci0gICAgICA8Y29kZT5aZWQ8L2NvZGU+IHdpbGwgYmUgbGlzdGVkIGJlZm9yZSBzdWJkaXJlY3RvcnkKLSAgICAgIDxjb2RlPkJldGE8L2NvZGU+LCB3aGljaCB3aWxsIGJlIGxpc3RlZCBiZWZvcmUgbm9ybWFsIGZpbGVzCi0gICAgICA8Y29kZT5HYW1tYTwvY29kZT4gYW5kIDxjb2RlPkFscGhhPC9jb2RlPi4gPGI+VGhpcyBvcHRpb24KLSAgICAgIG9ubHkgaGFzIGFuIGVmZmVjdCBpZiA8YQotICAgICAgaHJlZj0iI2luZGV4b3B0aW9uczpmYW5jeWluZGV4aW5nIj48Y29kZT5GYW5jeUluZGV4aW5nPC9jb2RlPjwvYT4KLSAgICAgIGlzIGFsc28gZW5hYmxlZC48L2I+PC9kZD4KLQotICAgICAgPGR0PjxhIGlkPSJpbmRleG9wdGlvbnM6aHRtbHRhYmxlIgotICAgICAgbmFtZT0iaW5kZXhvcHRpb25zOmh0bWx0YWJsZSI+SFRNTFRhYmxlPC9hPiA8aT4oRXhwZXJpbWVudGFsLAotICAgICAgQXBhY2hlIDIuMC4yMyBhbmQgbGF0ZXIpPC9pPjwvZHQ+Ci0KLSAgICAgIDxkZD4KLSAgICAgIFRoaXMgZXhwZXJpbWVudGFsIG9wdGlvbiB3aXRoIEZhbmN5SW5kZXhpbmcgY29uc3RydWN0cyBhCi0gICAgICBzaW1wbGUgdGFibGUgZm9yIHRoZSBmYW5jeSBkaXJlY3RvcnkgbGlzdGluZy4gTm90ZSB0aGlzIHdpbGwKLSAgICAgIGNvbmZ1c2Ugb2xkZXIgYnJvd3NlcnMuIEl0IGlzIHBhcnRpY3VsYXJseSBuZWNlc3NhcnkgaWYgZmlsZQotICAgICAgbmFtZXMgb3IgZGVzY3JpcHRpb24gdGV4dCB3aWxsIGFsdGVybmF0ZSBiZXR3ZWVuCi0gICAgICBsZWZ0LXRvLXJpZ2h0IGFuZCByaWdodC10by1sZWZ0IHJlYWRpbmcgb3JkZXIsIGFzIGNhbiBoYXBwZW4KLSAgICAgIG9uIFdpbk5UIG9yIG90aGVyIHV0Zi04IGVuYWJsZWQgcGxhdGZvcm1zLjwvZGQ+Ci0KLSAgICAgIDxkdD48YSBpZD0iaW5kZXhvcHRpb25zOmljb25zYXJlbGlua3MiCi0gICAgICBuYW1lPSJpbmRleG9wdGlvbnM6aWNvbnNhcmVsaW5rcyI+SWNvbnNBcmVMaW5rczwvYT48L2R0PgotCi0gICAgICA8ZGQ+Ci0gICAgICBUaGlzIG1ha2VzIHRoZSBpY29ucyBwYXJ0IG9mIHRoZSBhbmNob3IgZm9yIHRoZSBmaWxlbmFtZSwgZm9yCi0gICAgICBmYW5jeSBpbmRleGluZy48L2RkPgotCi0gICAgICA8ZHQ+PGEgaWQ9ImluZGV4b3B0aW9uczppY29uaGVpZ2h0IgotICAgICAgbmFtZT0iaW5kZXhvcHRpb25zOmljb25oZWlnaHQiPkljb25IZWlnaHRbPXBpeGVsc10KLSAgICAgICg8ZW0+QXBhY2hlIDEuMyBhbmQgbGF0ZXI8L2VtPik8L2E+PC9kdD4KLQotICAgICAgPGRkPgotICAgICAgUHJlc2VuY2Ugb2YgdGhpcyBvcHRpb24sIHdoZW4gdXNlZCB3aXRoIEljb25XaWR0aCwgd2lsbCBjYXVzZQotICAgICAgdGhlIHNlcnZlciB0byBpbmNsdWRlIDxjb2RlPkhFSUdIVDwvY29kZT4gYW5kCi0gICAgICA8Y29kZT5XSURUSDwvY29kZT4gYXR0cmlidXRlcyBpbiB0aGUgPGNvZGU+SU1HPC9jb2RlPiB0YWcgZm9yCi0gICAgICB0aGUgZmlsZSBpY29uLiBUaGlzIGFsbG93cyBicm93c2VyIHRvIHByZWNhbGN1bGF0ZSB0aGUgcGFnZQotICAgICAgbGF5b3V0IHdpdGhvdXQgaGF2aW5nIHRvIHdhaXQgdW50aWwgYWxsIHRoZSBpbWFnZXMgaGF2ZSBiZWVuCi0gICAgICBsb2FkZWQuIElmIG5vIHZhbHVlIGlzIGdpdmVuIGZvciB0aGUgb3B0aW9uLCBpdCBkZWZhdWx0cyB0bwotICAgICAgdGhlIHN0YW5kYXJkIGhlaWdodCBvZiB0aGUgaWNvbnMgc3VwcGxpZWQgd2l0aCB0aGUgQXBhY2hlCi0gICAgICBzb2Z0d2FyZS48L2RkPgotCi0gICAgICA8ZHQ+PGEgaWQ9ImluZGV4b3B0aW9uczppY29ud2lkdGgiCi0gICAgICBuYW1lPSJpbmRleG9wdGlvbnM6aWNvbndpZHRoIj5JY29uV2lkdGhbPXBpeGVsc10gKDxlbT5BcGFjaGUKLSAgICAgIDEuMyBhbmQgbGF0ZXI8L2VtPik8L2E+PC9kdD4KLQotICAgICAgPGRkPgotICAgICAgUHJlc2VuY2Ugb2YgdGhpcyBvcHRpb24sIHdoZW4gdXNlZCB3aXRoIEljb25IZWlnaHQsIHdpbGwKLSAgICAgIGNhdXNlIHRoZSBzZXJ2ZXIgdG8gaW5jbHVkZSA8Y29kZT5IRUlHSFQ8L2NvZGU+IGFuZAotICAgICAgPGNvZGU+V0lEVEg8L2NvZGU+IGF0dHJpYnV0ZXMgaW4gdGhlIDxjb2RlPklNRzwvY29kZT4gdGFnIGZvcgotICAgICAgdGhlIGZpbGUgaWNvbi4gVGhpcyBhbGxvd3MgYnJvd3NlciB0byBwcmVjYWxjdWxhdGUgdGhlIHBhZ2UKLSAgICAgIGxheW91dCB3aXRob3V0IGhhdmluZyB0byB3YWl0IHVudGlsIGFsbCB0aGUgaW1hZ2VzIGhhdmUgYmVlbgotICAgICAgbG9hZGVkLiBJZiBubyB2YWx1ZSBpcyBnaXZlbiBmb3IgdGhlIG9wdGlvbiwgaXQgZGVmYXVsdHMgdG8KLSAgICAgIHRoZSBzdGFuZGFyZCB3aWR0aCBvZiB0aGUgaWNvbnMgc3VwcGxpZWQgd2l0aCB0aGUgQXBhY2hlCi0gICAgICBzb2Z0d2FyZS48L2RkPgotCi0gICAgICA8ZHQ+PGEgaWQ9ImluZGV4b3B0aW9uczppZ25vcmVjbGllbnQiCi0gICAgICBuYW1lPSJpbmRleG9wdGlvbnM6aWdub3JlY2xpZW50Ij5JZ25vcmVDbGllbnQ8L2E+PC9kdD4KLQotICAgICAgPGRkPgotICAgICAgVGhpcyBvcHRpb24gY2F1c2VzIG1vZF9hdXRvaW5kZXggdG8gaWdub3JlIGFsbCBxdWVyeQotICAgICAgdmFyaWFibGVzIGZyb20gdGhlIGNsaWVudCwgaW5jbHVkaW5nIHNvcnQgb3JkZXIgKGltcGxpZXMKLSAgICAgIDxjb2RlPjxhCi0gICAgICBocmVmPSIjaW5kZXhvcHRpb25zOnN1cHByZXNzY29sdW1uc29ydGluZyI+U3VwcHJlc3NDb2x1bW5Tb3J0aW5nPC9hPjwvY29kZT4uKTwvZGQ+Ci0KLSAgICAgIDxkdD48YSBpZD0iaW5kZXhvcHRpb25zOm5hbWV3aWR0aCIKLSAgICAgIG5hbWU9ImluZGV4b3B0aW9uczpuYW1ld2lkdGgiPk5hbWVXaWR0aD1bPGVtPm48L2VtPiB8ICpdCi0gICAgICAoPGVtPkFwYWNoZSAxLjMuMiBhbmQgbGF0ZXI8L2VtPik8L2E+PC9kdD4KLQotICAgICAgPGRkPlRoZSBOYW1lV2lkdGgga2V5d29yZCBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIHdpZHRoIG9mCi0gICAgICB0aGUgZmlsZW5hbWUgY29sdW1uIGluIGJ5dGVzLjwvZGQ+Ci0KLSAgICAgIDxkZD48Y29kZT4tTmFtZVdpZHRoPC9jb2RlPiAob3IgdW5zZXQpIGFsbG93cyBtb2RfYXV0b2luZGV4Ci0gICAgICB0byBjYWxjdWxhdGUgdGhlIGJlc3Qgd2lkdGguPC9kZD4KLQotICAgICAgPGRkPjxjb2RlPk5hbWVXaWR0aD1uPC9jb2RlPiBmaXhlcyB0aGUgY29sdW1uIHdpZHRoIHRvIG4KLSAgICAgIGJ5dGVzIHdpZGUuPC9kZD4KLQotICAgICAgPGRkPjxjb2RlPk5hbWVXaWR0aD0qPC9jb2RlPiBncm93cyB0aGUgY29sdW1uIHRvIHRoZQotICAgICAgbmVjZXNzYXJ5IHdpZHRoLjwvZGQ+Ci0KLSAgICAgIDxkdD48YSBpZD0iaW5kZXhvcHRpb25zOnNjYW5odG1sdGl0bGVzIgotICAgICAgbmFtZT0iaW5kZXhvcHRpb25zOnNjYW5odG1sdGl0bGVzIj5TY2FuSFRNTFRpdGxlczwvYT48L2R0PgotCi0gICAgICA8ZGQ+Ci0gICAgICBUaGlzIGVuYWJsZXMgdGhlIGV4dHJhY3Rpb24gb2YgdGhlIHRpdGxlIGZyb20gSFRNTCBkb2N1bWVudHMKLSAgICAgIGZvciBmYW5jeSBpbmRleGluZy4gSWYgdGhlIGZpbGUgZG9lcyBub3QgaGF2ZSBhIGRlc2NyaXB0aW9uCi0gICAgICBnaXZlbiBieSA8YSBocmVmPSIjYWRkZGVzY3JpcHRpb24iPkFkZERlc2NyaXB0aW9uPC9hPiB0aGVuCi0gICAgICBodHRwZCB3aWxsIHJlYWQgdGhlIGRvY3VtZW50IGZvciB0aGUgdmFsdWUgb2YgdGhlIFRJVExFIHRhZy4KLSAgICAgIFRoaXMgaXMgQ1BVIGFuZCBkaXNrIGludGVuc2l2ZS48L2RkPgotCi0gICAgICA8ZHQ+PGEgaWQ9ImluZGV4b3B0aW9uczpzdXBwcmVzc2NvbHVtbnNvcnRpbmciCi0gICAgICBuYW1lPSJpbmRleG9wdGlvbnM6c3VwcHJlc3Njb2x1bW5zb3J0aW5nIj5TdXBwcmVzc0NvbHVtblNvcnRpbmc8L2E+Ci0gICAgICAoPGVtPkFwYWNoZSAxLjMgYW5kIGxhdGVyPC9lbT4pPC9kdD4KLQotICAgICAgPGRkPgotICAgICAgSWYgc3BlY2lmaWVkLCBBcGFjaGUgd2lsbCBub3QgbWFrZSB0aGUgY29sdW1uIGhlYWRpbmdzIGluIGEKLSAgICAgIEZhbmN5SW5kZXhlZCBkaXJlY3RvcnkgbGlzdGluZyBpbnRvIGxpbmtzIGZvciBzb3J0aW5nLiBUaGUKLSAgICAgIGRlZmF1bHQgYmVoYXZpb3IgaXMgZm9yIHRoZW0gdG8gYmUgbGlua3M7IHNlbGVjdGluZyB0aGUKLSAgICAgIGNvbHVtbiBoZWFkaW5nIHdpbGwgc29ydCB0aGUgZGlyZWN0b3J5IGxpc3RpbmcgYnkgdGhlIHZhbHVlcwotICAgICAgaW4gdGhhdCBjb2x1bW4uIDxzdHJvbmc+UHJpb3IgdG8gQXBhY2hlIDIuMC4yMywgdGhpcyBhbHNvCi0gICAgICBkaXNhYmxlZCBwYXJzaW5nIHRoZSBRdWVyeSBBcmd1bWVudHMgZm9yIHRoZSBzb3J0Ci0gICAgICBzdHJpbmcuPC9zdHJvbmc+IFRoYXQgYmVoYXZpb3IgaXMgbm93IGNvbnRyb2xsZWQgYnkgPGEKLSAgICAgIGhyZWY9IiNpbmRleG9wdGlvbnM6aWdub3JlY2xpZW50Ij5JbmRleE9wdGlvbnMKLSAgICAgIElnbm9yZUNsaWVudDwvYT4gaW4gQXBhY2hlIDIuMC4yMy48L2RkPgotCi0gICAgICA8ZHQ+PGEgaWQ9ImluZGV4b3B0aW9uczpzdXBwcmVzc2Rlc2NyaXB0aW9uIgotICAgICAgbmFtZT0iaW5kZXhvcHRpb25zOnN1cHByZXNzZGVzY3JpcHRpb24iPlN1cHByZXNzRGVzY3JpcHRpb248L2E+PC9kdD4KLQotICAgICAgPGRkPgotICAgICAgVGhpcyB3aWxsIHN1cHByZXNzIHRoZSBmaWxlIGRlc2NyaXB0aW9uIGluIGZhbmN5IGluZGV4aW5nCi0gICAgICBsaXN0aW5ncy4gQnkgZGVmYXVsdCwgbm8gZmlsZSBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQsIGFuZAotICAgICAgc28gdGhlIHVzZSBvZiB0aGlzIG9wdGlvbiB3aWxsIHJlZ2FpbiAyMyBjaGFyYWN0ZXJzIG9mIHNjcmVlbgotICAgICAgc3BhY2UgdG8gdXNlIGZvciBzb21ldGhpbmcgZWxzZS4gU2VlIDxhCi0gICAgICBocmVmPSIjYWRkZGVzY3JpcHRpb24iPjxjb2RlPkFkZERlc2NyaXB0aW9uPC9jb2RlPjwvYT4gZm9yCi0gICAgICBpbmZvcm1hdGlvbiBhYm91dCBzZXR0aW5nIHRoZSBmaWxlIGRlc2NyaXB0aW9uLiBTZWUgYWxzbyB0aGUKLSAgICAgIDxhCi0gICAgICBocmVmPSIjaW5kZXhvcHRpb25zOmRlc2NyaXB0aW9ud2lkdGgiPjxjb2RlPkRlc2NyaXB0aW9uV2lkdGg8L2NvZGU+PC9hPgotICAgICAgaW5kZXggb3B0aW9uIHRvIGxpbWl0IHRoZSBzaXplIG9mIHRoZSBkZXNjcmlwdGlvbgotICAgICAgY29sdW1uLjwvZGQ+Ci0KLSAgICAgIDxkdD48YSBpZD0iaW5kZXhvcHRpb25zOnN1cHByZXNzaHRtbHByZWFtYmxlIgotICAgICAgbmFtZT0iaW5kZXhvcHRpb25zOnN1cHByZXNzaHRtbHByZWFtYmxlIj5TdXBwcmVzc0hUTUxQcmVhbWJsZTwvYT4KLSAgICAgICg8ZW0+QXBhY2hlIDEuMyBhbmQgbGF0ZXI8L2VtPik8L2R0PgotCi0gICAgICA8ZGQ+Ci0gICAgICBJZiB0aGUgZGlyZWN0b3J5IGFjdHVhbGx5IGNvbnRhaW5zIGEgZmlsZSBzcGVjaWZpZWQgYnkgdGhlCi0gICAgICA8ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX2F1dG9pbmRleCI+SGVhZGVyTmFtZTwvZGlyZWN0aXZlPgotICAgICAgZGlyZWN0aXZlLCB0aGUgbW9kdWxlIHVzdWFsbHkgaW5jbHVkZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlCi0gICAgICBhZnRlciBhIHN0YW5kYXJkIEhUTUwgcHJlYW1ibGUgKCZsdDtIVE1MJmd0OywgJmx0O0hFQUQmZ3Q7LAotICAgICAgPGVtPmV0IGNldGVyYTwvZW0+KS4gVGhlIFN1cHByZXNzSFRNTFByZWFtYmxlIG9wdGlvbiBkaXNhYmxlcwotICAgICAgdGhpcyBiZWhhdmlvdXIsIGNhdXNpbmcgdGhlIG1vZHVsZSB0byBzdGFydCB0aGUgZGlzcGxheSB3aXRoIHRoZQotICAgICAgaGVhZGVyIGZpbGUgY29udGVudHMuIFRoZSBoZWFkZXIgZmlsZSBtdXN0IGNvbnRhaW4gYXBwcm9wcmlhdGUKLSAgICAgIEhUTUwgaW5zdHJ1Y3Rpb25zIGluIHRoaXMgY2FzZS4gSWYgdGhlcmUgaXMgbm8gaGVhZGVyIGZpbGUsIHRoZQotICAgICAgcHJlYW1ibGUgaXMgZ2VuZXJhdGVkIGFzIHVzdWFsLjwvZGQ+Ci0KLSAgICAgIDxkdD48YSBpZD0iaW5kZXhvcHRpb25zOnN1cHByZXNzaWNvbiIKLSAgICAgIG5hbWU9ImluZGV4b3B0aW9uczpzdXBwcmVzc2ljb24iPlN1cHByZXNzSWNvbjwvYT4gKDxlbT5BcGFjaGUKLSAgICAgIDIuMC4yMyBhbmQgbGF0ZXI8L2VtPik8L2R0PgotCi0gICAgICA8ZGQ+Ci0gICAgICBUaGlzIHdpbGwgc3VwcHJlc3MgdGhlIGljb24gaW4gZmFuY3kgaW5kZXhpbmcgbGlzdGluZ3MuCi0gICAgICBDb21iaW5pbmcgYm90aCA8ZW0+U3VwcHJlc3NJY29uPC9lbT4gYW5kCi0gICAgICA8ZW0+U3VwcHJlc3NSdWxlczwvZW0+IHlpZWxkcyBwcm9wZXIgSFRNTCAzLjIgb3V0cHV0LCB3aGljaAotICAgICAgYnkgdGhlIGZpbmFsIHNwZWNpZmljYXRpb24gcHJvaGliaXRzIElNRyBhbmQgSFIgdGFncyBmcm9tIHRoZQotICAgICAgUFJFIGJsb2NrICh1c2VkIHRvIGZvcm1hdCBGYW5jeUluZGV4ZWQgbGlzdGluZ3MuKTwvZGQ+Ci0KLSAgICAgIDxkdD48YSBpZD0iaW5kZXhvcHRpb25zOnN1cHByZXNzbGFzdG1vZGlmaWVkIgotICAgICAgbmFtZT0iaW5kZXhvcHRpb25zOnN1cHByZXNzbGFzdG1vZGlmaWVkIj5TdXBwcmVzc0xhc3RNb2RpZmllZDwvYT48L2R0PgotCi0gICAgICA8ZGQ+Ci0gICAgICBUaGlzIHdpbGwgc3VwcHJlc3MgdGhlIGRpc3BsYXkgb2YgdGhlIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUsCi0gICAgICBpbiBmYW5jeSBpbmRleGluZyBsaXN0aW5ncy48L2RkPgotCi0gICAgICA8ZHQ+PGEgaWQ9ImluZGV4b3B0aW9uczpzdXBwcmVzc3J1bGVzIgotICAgICAgbmFtZT0iaW5kZXhvcHRpb25zOnN1cHByZXNzcnVsZXMiPlN1cHByZXNzUnVsZXM8L2E+Ci0gICAgICAoPGVtPkFwYWNoZSAyLjAuMjMgYW5kIGxhdGVyPC9lbT4pPC9kdD4KLQotICAgICAgPGRkPgotICAgICAgVGhpcyB3aWxsIHN1cHByZXNzIHRoZSBob3Jpem9udGFsIHJ1bGUgbGluZXMgKEhSIHRhZ3MpIGluCi0gICAgICBkaXJlY3RvcnkgbGlzdGluZ3MuIENvbWJpbmluZyBib3RoIDxlbT5TdXBwcmVzc0ljb248L2VtPiBhbmQKLSAgICAgIDxlbT5TdXBwcmVzc1J1bGVzPC9lbT4geWVpbGRzIHByb3BlciBIVE1MIDMuMiBvdXRwdXQsIHdoaWNoCi0gICAgICBieSB0aGUgZmluYWwgc3BlY2lmaWNhdGlvbiBwcm9oaWJpdHMgSU1HIGFuZCBIUiB0YWdzIGZyb20gdGhlCi0gICAgICBQUkUgYmxvY2sgKHVzZWQgdG8gZm9ybWF0IEZhbmN5SW5kZXhlZCBsaXN0aW5ncy4pPC9kZD4KLQotICAgICAgPGR0PjxhIGlkPSJpbmRleG9wdGlvbnM6c3VwcHJlc3NzaXplIgotICAgICAgbmFtZT0iaW5kZXhvcHRpb25zOnN1cHByZXNzc2l6ZSI+U3VwcHJlc3NTaXplPC9hPjwvZHQ+Ci0KLSAgICAgIDxkZD4KLSAgICAgIFRoaXMgd2lsbCBzdXBwcmVzcyB0aGUgZmlsZSBzaXplIGluIGZhbmN5IGluZGV4aW5nCi0gICAgICBsaXN0aW5ncy48L2RkPgotCi0gICAgICA8ZHQ+PGEgaWQ9ImluZGV4b3B0aW9uczp0cmFja21vZGlmaWVkIgotICAgICAgbmFtZT0iaW5kZXhvcHRpb25zOnRyYWNrbW9kaWZpZWQiPlRyYWNrTW9kaWZpZWQgKDxlbT5BcGFjaGUKLSAgICAgIDEuMy4xNSBvciAyLjAuMjMgYW5kIGxhdGVyPC9lbT4pPC9hPjwvZHQ+Ci0KLSAgICAgIDxkZD4KLSAgICAgIFRoaXMgcmV0dXJucyB0aGUgTGFzdC1Nb2RpZmllZCBhbmQgRVRhZyB2YWx1ZXMgZm9yIHRoZSBsaXN0ZWQKLSAgICAgIGRpcmVjdG9yeSBpbiB0aGUgSFRUUCBoZWFkZXIuIEl0IGlzIG9ubHkgdmFsaWQgaWYgdGhlCi0gICAgICBvcGVyYXRpbmcgc3lzdGVtIGFuZCBmaWxlIHN5c3RlbSByZXR1cm4gYXBwcm9wcmlhdGUgc3RhdCgpCi0gICAgICByZXN1bHRzLiBTb21lIFVuaXggc3lzdGVtcyBkbyBzbywgYXMgZG8gT1MyJ3MgSkZTIGFuZCBXaW4zMidzCi0gICAgICBOVEZTIHZvbHVtZXMuIE9TMiBhbmQgV2luMzIgRkFUIHZvbHVtZXMsIGZvciBleGFtcGxlLCBkbyBub3QuCi0gICAgICBPbmNlIHRoaXMgZmVhdHVyZSBpcyBlbmFibGVkLCB0aGUgY2xpZW50IG9yIHByb3h5IGNhbiB0cmFjawotICAgICAgY2hhbmdlcyB0byB0aGUgbGlzdCBvZiBmaWxlcyB3aGVuIHRoZXkgcGVyZm9ybSBhIEhFQUQKLSAgICAgIHJlcXVlc3QuIE5vdGUgc29tZSBvcGVyYXRpbmcgc3lzdGVtcyBjb3JyZWN0bHkgdHJhY2sgbmV3IGFuZAotICAgICAgcmVtb3ZlZCBmaWxlcywgYnV0IGRvIG5vdCB0cmFjayBjaGFuZ2VzIGZvciBzaXplcyBvciBkYXRlcyBvZgotICAgICAgdGhlIGZpbGVzIHdpdGhpbiB0aGUgZGlyZWN0b3J5LiA8c3Ryb25nPkNoYW5nZXMgdG8gdGhlIHNpemUKLSAgICAgIG9yIGRhdGUgc3RhbXAgb2YgYW4gZXhpc3RpbmcgZmlsZSB3aWxsIG5vdCB1cGRhdGUgdGhlCi0gICAgICBMYXN0LU1vZGlmaWVkIGhlYWRlciBvbiBhbGwgVW5peCBwbGF0Zm9ybXMuPC9zdHJvbmc+IElmIHRoaXMKLSAgICAgIGlzIGEgY29uY2VybiwgbGVhdmUgdGhpcyBvcHRpb24gZGlzYWJsZWQuPC9kZD4KLQotICAgICAgPGR0PjxhIGlkPSJpbmRleG9wdGlvbnM6dmVyc2lvbnNvcnQiCi0gICAgICBuYW1lPSJpbmRleG9wdGlvbnM6dmVyc2lvbnNvcnQiPlZlcnNpb25Tb3J0ICg8ZW0+QXBhY2hlIDIuMGEzCi0gICAgICBhbmQgbGF0ZXI8L2VtPik8L2E+PC9kdD4KLQotICAgICAgPGRkPgotICAgICAgICBUaGUgVmVyc2lvblNvcnQga2V5d29yZCBjYXVzZXMgZmlsZXMgY29udGFpbmluZyB2ZXJzaW9uCi0gICAgICAgIG51bWJlcnMgdG8gc29ydCBpbiBhIG5hdHVyYWwgd2F5LiBTdHJpbmdzIGFyZSBzb3J0ZWQgYXMKLSAgICAgICAgdXN1YWwsIGV4Y2VwdCB0aGF0IHN1YnN0cmluZ3Mgb2YgZGlnaXRzIGluIHRoZSBuYW1lIGFuZAotICAgICAgICBkZXNjcmlwdGlvbiBhcmUgY29tcGFyZWQgYWNjb3JkaW5nIHRvIHRoZWlyIG51bWVyaWMgdmFsdWUuCi0gICAgICAgIEZvciBleGFtcGxlOiAKLQotPGV4YW1wbGU+Ci1mb28tMS43PGJyIC8+Ci1mb28tMS43LjI8YnIgLz4KLWZvby0xLjcuMTI8YnIgLz4KLWZvby0xLjguMjxiciAvPgotZm9vLTEuOC4yYTxiciAvPgotZm9vLTEuMTI8YnIgLz4KLTwvZXhhbXBsZT4KLSAgICAgICAgSWYgdGhlIG51bWJlciBzdGFydHMgd2l0aCBhIHplcm8sIHRoZW4gaXQgaXMgY29uc2lkZXJlZCB0bwotICAgICAgICBiZSBhIGZyYWN0aW9uOiAKLQotPGV4YW1wbGU+Ci1mb28tMS4wMDE8YnIgLz4KLWZvby0xLjAwMjxiciAvPgotZm9vLTEuMDMwPGJyIC8+Ci1mb28tMS4wNAotPC9leGFtcGxlPgotICAgICAgPC9kZD4KLQotICAgICAgPGRkPgotICAgICAgICA8aDM+SW5jcmVtZW50YWwgSW5kZXhPcHRpb25zPC9oMz4KLSAgICAgIDwvZGQ+Ci0KLSAgICAgIDxkZD4KLSAgICAgICAgQXBhY2hlIDEuMy4zIGludHJvZHVjZWQgc29tZSBzaWduaWZpY2FudCBjaGFuZ2VzIGluIHRoZQotICAgICAgICBoYW5kbGluZyBvZiA8ZGlyZWN0aXZlPkluZGV4T3B0aW9uczwvZGlyZWN0aXZlPiBkaXJlY3RpdmVzLiBJbgotICAgICAgICBwYXJ0aWN1bGFyLDxiciAvPgotICAgICAgICA8YnIgLz4KLSAgICAgICAgIAotCi0gICAgICAgIDx1bD4KLSAgICAgICAgICA8bGk+TXVsdGlwbGUgPGRpcmVjdGl2ZT5JbmRleE9wdGlvbnM8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlcyBmb3IgYQotICAgICAgICAgIHNpbmdsZSBkaXJlY3RvcnkgYXJlIG5vdyBtZXJnZWQgdG9nZXRoZXIuIFRoZSByZXN1bHQgb2YKLSAgICAgICAgICB0aGUgZXhhbXBsZSBhYm92ZSB3aWxsIG5vdyBiZSB0aGUgZXF1aXZhbGVudCBvZgotICAgICAgICAgIDxjb2RlPkluZGV4T3B0aW9ucyZuYnNwO0ZhbmN5SW5kZXhpbmcmbmJzcDtTY2FuSFRNTFRpdGxlczwvY29kZT4uPC9saT4KLQotICAgICAgICAgIDxsaT5UaGUgYWRkaXRpb24gb2YgdGhlIGluY3JlbWVudGFsIHN5bnRheAotICAgICAgICAgICg8ZW0+aS5lLjwvZW0+LCBwcmVmaXhpbmcga2V5d29yZHMgd2l0aCAnKycgb3IgJy0nKS48L2xpPgotICAgICAgICA8L3VsPgotICAgICAgICA8YnIgLz4KLSAgICAgICAgIFdoZW5ldmVyIGEgJysnIG9yICctJyBwcmVmaXhlZCBrZXl3b3JkIGlzIGVuY291bnRlcmVkLCBpdAotICAgICAgICBpcyBhcHBsaWVkIHRvIHRoZSBjdXJyZW50IDxkaXJlY3RpdmU+SW5kZXhPcHRpb25zPC9kaXJlY3RpdmU+Ci0gICAgICAgIHNldHRpbmdzICh3aGljaCBtYXkgaGF2ZSBiZWVuIGluaGVyaXRlZCBmcm9tIGFuIHVwcGVyLWxldmVsCi0gICAgICAgIGRpcmVjdG9yeSkuIEhvd2V2ZXIsIHdoZW5ldmVyIGFuIHVucHJlZml4ZWQga2V5d29yZCBpcwotICAgICAgICBwcm9jZXNzZWQsIGl0IGNsZWFycyBhbGwgaW5oZXJpdGVkIG9wdGlvbnMgYW5kIGFueQotICAgICAgICBpbmNyZW1lbnRhbCBzZXR0aW5ncyBlbmNvdW50ZXJlZCBzbyBmYXIuIENvbnNpZGVyIHRoZQotICAgICAgICBmb2xsb3dpbmcgZXhhbXBsZTogCi0KLTxleGFtcGxlPkluZGV4T3B0aW9ucyArU2NhbkhUTUxUaXRsZXMgLUljb25zQXJlTGlua3MKLSAgICAgICAgICBGYW5jeUluZGV4aW5nPGJyIC8+Ci0gICAgICAgICAgIEluZGV4T3B0aW9ucyArU3VwcHJlc3NTaXplPGJyIC8+Ci08L2V4YW1wbGU+Ci0gICAgICAgIFRoZSBuZXQgZWZmZWN0IGlzIGVxdWl2YWxlbnQgdG8KLSAgICAgICAgPGNvZGU+SW5kZXhPcHRpb25zJm5ic3A7RmFuY3lJbmRleGluZyZuYnNwOytTdXBwcmVzc1NpemU8L2NvZGU+LAotICAgICAgICBiZWNhdXNlIHRoZSB1bnByZWZpeGVkIDxjb2RlPkZhbmN5SW5kZXhpbmc8L2NvZGU+IGRpc2NhcmRlZAotICAgICAgICB0aGUgaW5jcmVtZW50YWwga2V5d29yZHMgYmVmb3JlIGl0LCBidXQgYWxsb3dlZCB0aGVtIHRvCi0gICAgICAgIHN0YXJ0IGFjY3VtdWxhdGluZyBhZ2FpbiBhZnRlcndhcmQuPGJyIC8+Ci0gICAgICAgIDxiciAvPgotICAgICAgICAgVG8gdW5jb25kaXRpb25hbGx5IHNldCB0aGUgPGRpcmVjdGl2ZT5JbmRleE9wdGlvbnM8L2RpcmVjdGl2ZT4gZm9yIGEKLSAgICAgICAgcGFydGljdWxhciBkaXJlY3RvcnksIGNsZWFyaW5nIHRoZSBpbmhlcml0ZWQgc2V0dGluZ3MsCi0gICAgICAgIHNwZWNpZnkga2V5d29yZHMgd2l0aG91dCBhbnkgJysnIG9yICctJyBwcmVmaXhlcy4KLSAgICAgIDwvZGQ+Ci0gICAgPC9kbD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5JbmRleE9yZGVyRGVmYXVsdDwvbmFtZT4KLTxkZXNjcmlwdGlvbj5TZXRzIHRoZSBkZWZhdWx0IG9yZGVyaW5nIG9mIHRoZSBkaXJlY3RvcnkgaW5kZXg8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5JbmRleE9yZGVyRGVmYXVsdAotQXNjZW5kaW5nfERlc2NlbmRpbmcgTmFtZXxEYXRlfFNpemV8RGVzY3JpcHRpb248L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPkluZGV4ZXM8L292ZXJyaWRlPgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIDxkaXJlY3RpdmU+SW5kZXhPcmRlckRlZmF1bHQ8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIGlzIHVzZWQKLSAgICBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSA8YQotICAgIGhyZWY9IiNpbmRleG9wdGlvbnM6ZmFuY3lpbmRleGluZyI+PGNvZGU+RmFuY3lJbmRleGluZzwvY29kZT48L2E+Ci0gICAgaW5kZXggb3B0aW9uLiBCeSBkZWZhdWx0LCBmYW5jeWluZGV4ZWQgZGlyZWN0b3J5IGxpc3RpbmdzIGFyZQotICAgIGRpc3BsYXllZCBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgZmlsZW5hbWU7IHRoZQotICAgIDxkaXJlY3RpdmU+SW5kZXhPcmRlckRlZmF1bHQ8L2RpcmVjdGl2ZT4gYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhpcyBpbml0aWFsCi0gICAgZGlzcGxheSBvcmRlci48L3A+Ci0KLSAgICA8cD48ZGlyZWN0aXZlPkluZGV4T3JkZXJEZWZhdWx0PC9kaXJlY3RpdmU+IHRha2VzIHR3bwotICAgIGFyZ3VtZW50cy4gVGhlIGZpcnN0IG11c3QgYmUgZWl0aGVyIDxjb2RlPkFzY2VuZGluZzwvY29kZT4gb3IKLSAgICA8Y29kZT5EZXNjZW5kaW5nPC9jb2RlPiwgaW5kaWNhdGluZyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBzb3J0LgotICAgIFRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGtleXdvcmRzIDxjb2RlPk5hbWU8L2NvZGU+LAotICAgIDxjb2RlPkRhdGU8L2NvZGU+LCA8Y29kZT5TaXplPC9jb2RlPiwgb3IgPGNvZGU+RGVzY3JpcHRpb248L2NvZGU+LAotICAgIGFuZCBpZGVudGlmaWVzIHRoZSBwcmltYXJ5IGtleS4gVGhlIHNlY29uZGFyeSBrZXkgaXMKLSAgICA8ZW0+YWx3YXlzPC9lbT4gdGhlIGFzY2VuZGluZyBmaWxlbmFtZS48L3A+Ci0KLSAgICA8cD5Zb3UgY2FuIGZvcmNlIGEgZGlyZWN0b3J5IGxpc3RpbmcgdG8gb25seSBiZSBkaXNwbGF5ZWQgaW4gYQotICAgIHBhcnRpY3VsYXIgb3JkZXIgYnkgY29tYmluaW5nIHRoaXMgZGlyZWN0aXZlIHdpdGggdGhlIDxhCi0gICAgaHJlZj0iI2luZGV4b3B0aW9uczpzdXBwcmVzc2NvbHVtbnNvcnRpbmciPjxjb2RlPlN1cHByZXNzQ29sdW1uU29ydGluZzwvY29kZT48L2E+Ci0gICAgaW5kZXggb3B0aW9uOyB0aGlzIHdpbGwgcHJldmVudCB0aGUgY2xpZW50IGZyb20gcmVxdWVzdGluZyB0aGUKLSAgICBkaXJlY3RvcnkgbGlzdGluZyBpbiBhIGRpZmZlcmVudCBvcmRlci48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+UmVhZG1lTmFtZTwvbmFtZT4KLTxzeW50YXg+UmVhZG1lTmFtZSA8ZW0+ZmlsZW5hbWU8L2VtPjwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0Pjxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+SW5kZXhlczwvb3ZlcnJpZGU+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5SZWFkbWVOYW1lPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBzZXRzIHRoZSBuYW1lCi0gICAgb2YgdGhlIGZpbGUgdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGluZGV4Ci0gICAgbGlzdGluZy4gPGVtPkZpbGVuYW1lPC9lbT4gaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gaW5jbHVkZSwgYW5kCi0gICAgaXMgdGFrZW4gdG8gYmUgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIGJlaW5nIGluZGV4ZWQuPC9wPgotCi0gICAgPHA+U2VlIGFsc28gPGRpcmVjdGl2ZQotICAgIG1vZHVsZT0ibW9kX2F1dG9pbmRleCI+SGVhZGVyTmFtZTwvZGlyZWN0aXZlPiwgd2hlcmUgdGhpcyBiZWhhdmlvcgotICAgIGlzIGRlc2NyaWJlZCBpbiBncmVhdGVyIGRldGFpbC48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPC9tb2R1bGVzeW5vcHNpcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2Nlcm5fbWV0YS5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9jZXJuX21ldGEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ4ZGZmZi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX2Nlcm5fbWV0YS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCAyLjAvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIG1vZHVsZSBtb2RfY2Vybl9tZXRhPC9USVRMRT4KLTwvSEVBRD4KLQotPEJPRFk+Ci08SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9zdWIuZ2lmIiBBTFQ9IiI+Ci08SDE+QXBhY2hlIG1vZHVsZSBtb2RfY2Vybl9tZXRhPC9oMT4KLQotVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5tb2RfY2Vybl9tZXRhLmM8L2NvZGU+IGZpbGUsIGFuZAotaXMgbm90IGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuIEl0IHByb3ZpZGVzIGZvciBDRVJOIGh0dHBkIG1ldGFmaWxlCi1zZW1hbnRpY3MuIEl0IGlzIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZSAxLjEgYW5kIGxhdGVyLgotCi08aDI+U3VtbWFyeTwvaDI+Ci0KLUVtdWxhdGUgdGhlIENFUk4gSFRUUEQgTWV0YSBmaWxlIHNlbWFudGljcy4gIE1ldGEgZmlsZXMgYXJlIEhUVFAgCi1oZWFkZXJzIHRoYXQgY2FuIGJlIG91dHB1dCBpbiBhZGRpdGlvbiB0byB0aGUgbm9ybWFsIHJhbmdlIG9mIGhlYWRlcnMKLWZvciBlYWNoIGZpbGUgYWNjZXNzZWQuICBUaGV5IGFwcGVhciByYXRoZXIgbGlrZSB0aGUgQXBhY2hlCi0uYXNpcyBmaWxlcywgYW5kIGFyZSBhYmxlIHRvIHByb3ZpZGUgYSBjcnVkZSB3YXkgb2YgaW5mbHVlbmNpbmcKLXRoZSBFeHBpcmVzOiBoZWFkZXIsIGFzIHdlbGwgYXMgcHJvdmlkaW5nIG90aGVyIGN1cmlvc2l0aWVzLgotVGhlcmUgYXJlIG1hbnkgd2F5cyB0byBtYW5hZ2UgbWV0YSBpbmZvcm1hdGlvbiwgdGhpcyBvbmUgd2FzCi1jaG9zZW4gYmVjYXVzZSB0aGVyZSBpcyBhbHJlYWR5IGEgbGFyZ2UgbnVtYmVyIG9mIENFUk4gdXNlcnMKLXdobyBjYW4gZXhwbG9pdCB0aGlzIG1vZHVsZS4gCi0KLTxwPk1vcmUgaW5mb3JtYXRpb24gb24gdGhlCi08YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9oeXBlcnRleHQvV1dXL0RhZW1vbi9Vc2VyL0NvbmZpZy9HZW5lcmFsLmh0bWwjTWV0YURpcgotIj5DRVJOIG1ldGFmaWxlIHNlbWFudGljczwvYT4gaXMgYXZhaWxhYmxlLgotCi08aDI+RGlyZWN0aXZlczwvaDI+Ci08dWw+Ci08bGk+PEEgSFJFRj0iI21ldGFkaXIiPk1ldGFEaXI8L0E+Ci08bGk+PEEgSFJFRj0iI21ldGFzdWZmaXgiPk1ldGFTdWZmaXg8L0E+Ci08L3VsPgotCi08aHI+Ci0KLTxBIG5hbWU9Im1ldGFkaXIiPjxoMj5NZXRhRGlyPC9oMj48L0E+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gTWV0YURpciA8ZW0+ZGlyZWN0b3J5IG5hbWU8L2VtPjxicj4KLTxzdHJvbmc+RGVmYXVsdDo8L3N0cm9uZz4gPGNvZGU+TWV0YURpciAud2ViPC9jb2RlPjxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZzxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBCYXNlPGJyPgotPHN0cm9uZz5Nb2R1bGU6PC9zdHJvbmc+IG1vZF9jZXJuX21ldGE8YnI+Ci08c3Ryb25nPkNvbXBhdGliaWxpdHk6PC9zdHJvbmc+IE1ldGFEaXIgaXMgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDEuMQotYW5kIGxhdGVyLjxwPgotCi1TcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBBcGFjaGUgY2FuIGZpbmQKLW1ldGEgaW5mb3JtYXRpb24gZmlsZXMuICBUaGUgZGlyZWN0b3J5IGlzIHVzdWFsbHkgYSAnaGlkZGVuJwotc3ViZGlyZWN0b3J5IG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0aGUgZmlsZSBiZWluZwotYWNjZXNzZWQuIFNldCB0byAiPGNvZGU+LjwvY29kZT4iIHRvIGxvb2sgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZQotZmlsZS4KLQotPEEgbmFtZT0ibWV0YWRpciI+PGgyPk1ldGFTdWZmaXg8L2gyPjwvQT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBNZXRhU3VmZml4IDxlbT5zdWZmaXg8L2VtPjxicj4KLTxzdHJvbmc+RGVmYXVsdDo8L3N0cm9uZz4gPGNvZGU+TWV0YVN1ZmZpeCAubWV0YTwvY29kZT48YnI+Ci08c3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWc8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gQmFzZTxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfY2Vybl9tZXRhPGJyPgotPHN0cm9uZz5Db21wYXRpYmlsaXR5Ojwvc3Ryb25nPiBNZXRhU3VmZml4IGlzIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZSAxLjEKLWFuZCBsYXRlci48cD4KLQotU3BlY2lmaWVzIHRoZSBmaWxlIG5hbWUgc3VmZml4IGZvciB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotbWV0YSBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUsIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHR3bwotZGlyZWN0aXZlcyB3aWxsIGNhdXNlIGEgcmVxdWVzdCB0byA8Y29kZT4KLURPQ1VNRU5UX1JPT1Qvc29tZWRpci9pbmRleC5odG1sPC9jb2RlPiB0byBsb29rIGluCi08Y29kZT5ET0NVTUVOVF9ST09UL3NvbWVkaXIvLndlYi9pbmRleC5odG1sLm1ldGE8L2NvZGU+IGFuZCAgd2lsbCB1c2UKLWl0cyBjb250ZW50cyB0byBnZW5lcmF0ZSBhZGRpdGlvbmFsIE1JTUUgaGVhZGVyIGluZm9ybWF0aW9uLgotCi08cD48aHI+Ci0KLTxBIEhSRUY9Ii4uLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfaG9tZS5naWYiIEFMVD0iSG9tZSI+PC9BPgotPEEgSFJFRj0iLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2luZGV4LmdpZiIgQUxUPSJJbmRleCI+PC9BPgotCi08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfY2Vybl9tZXRhLnhtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfY2Vybl9tZXRhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU5N2M4Mi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX2Nlcm5fbWV0YS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSB4bWw6bWFudWFsIFsgPCFFTlRJVFkgbmJzcCAiJiMxNjA7Ij4gXT4KLTw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9Ii4uL3N0eWxlL21hbnVhbC54c2wiPz4KLTxtb2R1bGVzeW5vcHNpcz4KLQotPG5hbWU+bW9kX2Nlcm5fbWV0YTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5DRVJOIGh0dHBkIG1ldGFmaWxlIHNlbWFudGljczwvZGVzY3JpcHRpb24+Ci08c3RhdHVzPkV4dGVuc2lvbjwvc3RhdHVzPgotPHNvdXJjZWZpbGU+bW9kX2Nlcm5fbWV0YS5jPC9zb3VyY2VmaWxlPgotPGlkZW50aWZpZXI+Y2Vybl9tZXRhX21vZHVsZTwvaWRlbnRpZmllcj4KLQotPHN1bW1hcnk+Ci0gICAgPCEtLSBYWFg6IFNob3VsZCBtZW50aW9uIG90aGVyIHBvc3NpYmlsaXRpZXMgaW4gQXBhY2hlOiBtb2RfaGVhZGVyIC0tPgotICAgIDxwPkVtdWxhdGUgdGhlIENFUk4gSFRUUEQgTWV0YSBmaWxlIHNlbWFudGljcy4gTWV0YSBmaWxlcyBhcmUgSFRUUAotICAgIGhlYWRlcnMgdGhhdCBjYW4gYmUgb3V0cHV0IGluIGFkZGl0aW9uIHRvIHRoZSBub3JtYWwgcmFuZ2Ugb2YKLSAgICBoZWFkZXJzIGZvciBlYWNoIGZpbGUgYWNjZXNzZWQuIFRoZXkgYXBwZWFyIHJhdGhlciBsaWtlIHRoZQotICAgIEFwYWNoZSAuYXNpcyBmaWxlcywgYW5kIGFyZSBhYmxlIHRvIHByb3ZpZGUgYSBjcnVkZSB3YXkgb2YKLSAgICBpbmZsdWVuY2luZyB0aGUgRXhwaXJlczogaGVhZGVyLCBhcyB3ZWxsIGFzIHByb3ZpZGluZyBvdGhlcgotICAgIGN1cmlvc2l0aWVzLiBUaGVyZSBhcmUgbWFueSB3YXlzIHRvIG1hbmFnZSBtZXRhIGluZm9ybWF0aW9uLAotICAgIHRoaXMgb25lIHdhcyBjaG9zZW4gYmVjYXVzZSB0aGVyZSBpcyBhbHJlYWR5IGEgbGFyZ2UgbnVtYmVyIG9mCi0gICAgQ0VSTiB1c2VycyB3aG8gY2FuIGV4cGxvaXQgdGhpcyBtb2R1bGUuPC9wPgotCi0gICAgPHA+TW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgPGEKLSAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9wdWIvV1dXL0RhZW1vbi9Vc2VyL0NvbmZpZy9HZW5lcmFsLmh0bWwjTWV0YURpciI+Ci0gICAgQ0VSTiBtZXRhZmlsZSBzZW1hbnRpY3M8L2E+IGlzIGF2YWlsYWJsZS48L3A+Ci08L3N1bW1hcnk+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPk1ldGFGaWxlczwvbmFtZT4KLTxkZXNjcmlwdGlvbj5BY3RpdmF0ZXMgQ0VSTiBtZXRhLWZpbGUgcHJvY2Vzc2luZzwvZGVzY3JpcHRpb24+Ci08c3ludGF4Pk1ldGFGaWxlcyBvbnxvZmY8L3N5bnRheD4KLTxkZWZhdWx0Pk1ldGFGaWxlcyBvZmY8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5UdXJucyBvbi9vZmYgTWV0YSBmaWxlIHByb2Nlc3Npbmcgb24gYSBwZXItZGlyZWN0b3J5IGJhc2lzLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5NZXRhRGlyPC9uYW1lPgotPGRlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0byBmaW5kIENFUk4tc3R5bGUgbWV0YSBpbmZvcm1hdGlvbgotZmlsZXM8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5NZXRhRGlyIDxlbT5kaXJlY3Rvcnk8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+TWV0YURpciAud2ViPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+U3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggQXBhY2hlIGNhbiBmaW5kCi0gICAgbWV0YSBpbmZvcm1hdGlvbiBmaWxlcy4gVGhlIGRpcmVjdG9yeSBpcyB1c3VhbGx5IGEgJ2hpZGRlbicKLSAgICBzdWJkaXJlY3Rvcnkgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSBmaWxlIGJlaW5nCi0gICAgYWNjZXNzZWQuIFNldCB0byAiPGNvZGU+LjwvY29kZT4iIHRvIGxvb2sgaW4gdGhlIHNhbWUgZGlyZWN0b3J5Ci0gICAgYXMgdGhlIGZpbGUuPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPk1ldGFTdWZmaXg8L25hbWU+Ci08ZGVzY3JpcHRpb24+RmlsZSBuYW1lIHN1ZmZpeCBmb3IgdGhlIGZpbGUgY29udGFpbmcgQ0VSTi1zdHlsZQotbWV0YSBpbmZvcm1hdGlvbjwvZGVzY3JpcHRpb24+Ci08c3ludGF4Pk1ldGFTdWZmaXggPGVtPnN1ZmZpeDwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5NZXRhU3VmZml4IC5tZXRhPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+U3BlY2lmaWVzIHRoZSBmaWxlIG5hbWUgc3VmZml4IGZvciB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgIG1ldGEgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlLCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSB0d28KLSAgICBkaXJlY3RpdmVzIHdpbGwgY2F1c2UgYSByZXF1ZXN0IHRvCi0gICAgPGNvZGU+RE9DVU1FTlRfUk9PVC9zb21lZGlyL2luZGV4Lmh0bWw8L2NvZGU+IHRvIGxvb2sgaW4KLSAgICA8Y29kZT5ET0NVTUVOVF9ST09UL3NvbWVkaXIvLndlYi9pbmRleC5odG1sLm1ldGE8L2NvZGU+IGFuZAotICAgIHdpbGwgdXNlIGl0cyBjb250ZW50cyB0byBnZW5lcmF0ZSBhZGRpdGlvbmFsIE1JTUUgaGVhZGVyCi0gICAgaW5mb3JtYXRpb24uPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTwvbW9kdWxlc3lub3BzaXM+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2NnaS5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9jZ2kuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJmNmVhNy4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX2NnaS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPCEtLSVoeXBlcnRleHQgLS0+Ci08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDIuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BcGFjaGUgbW9kdWxlIG1vZF9jZ2k8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX3N1Yi5naWYiIEFMVD0iIj4KLTwhLS0vJWh5cGVydGV4dCAtLT4KLTxoMT5Nb2R1bGUgbW9kX2NnaTwvaDE+Ci0KLVRoaXMgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+bW9kX2NnaS5jPC9jb2RlPiBmaWxlLCBhbmQKLWlzIGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuIEl0IHByb3ZpZGVzIGZvciBleGVjdXRpb24gb2YgQ0dJIHNjcmlwdHMuCi1BbnkgZmlsZSB3aXRoIG1pbWUgdHlwZSA8Y29kZT5hcHBsaWNhdGlvbi94LWh0dHBkLWNnaTwvY29kZT4gd2lsbCBiZQotcHJvY2Vzc2VkIGJ5IHRoaXMgbW9kdWxlLgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IGFwcGxpY2F0aW9uL3gtaHR0cGQtY2dpfSBtaW1lIHR5cGUmZ3Q7IC0tPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCBDR0kgc2NyaXB0cyZndDsgLS0+Ci0KLTxoMj5TdW1tYXJ5PC9oMj4KLUFueSBmaWxlIHRoYXQgaGFzIHRoZSBtaW1lIHR5cGUgPGNvZGU+YXBwbGljYXRpb24veC1odHRwZC1jZ2k8L2NvZGU+Ci13aWxsIGJlIHRyZWF0ZWQgYXMgYSBDR0kgc2NyaXB0LCBhbmQgcnVuIGJ5IHRoZSBzZXJ2ZXIsIHdpdGggaXRzIG91dHB1dAotYmVpbmcgcmV0dXJuZWQgdG8gdGhlIGNsaWVudC4gRmlsZXMgYWNxdWlyZSB0aGlzIHR5cGUgZWl0aGVyIGJ5Ci1oYXZpbmcgYSBuYW1lIGVuZGluZyBpbiBhbiBleHRlbnNpb24gZGVmaW5lZCBieSB0aGUKLTxBIEhSRUY9Im1vZF9taW1lLmh0bWwjYWRkdHlwZSI+QWRkVHlwZTwvQT4gZGlyZWN0aXZlLCBvciBieSBiZWluZyBpbgotYSA8QSBIUkVGPSJtb2RfYWxpYXMuaHRtbCNzY3JpcHRhbGlhcyI+U2NyaXB0QWxpYXM8L0E+IGRpcmVjdG9yeS4gPHA+Ci0KLVdoZW4gdGhlIHNlcnZlciBpbnZva2VzIGEgQ0dJIHNjcmlwdCwgaXQgd2lsbCBhZGQgYSB2YXJpYWJsZSBjYWxsZWQKLTxjb2RlPkRPQ1VNRU5UX1JPT1Q8L2NvZGU+IHRvIHRoZSBlbnZpcm9ubWVudC4gVGhpcyB2YXJpYWJsZSB3aWxsIGNvbnRhaW4gdGhlCi12YWx1ZSBvZiB0aGUgPEEgSFJFRj0iY29yZS5odG1sI2RvY3VtZW50cm9vdCI+RG9jdW1lbnRSb290PC9BPgotY29uZmlndXJhdGlvbiB2YXJpYWJsZS4KLQotPGgyPkNHSSBFbnZpcm9ubWVudCB2YXJpYWJsZXM8L2gyPgotVGhlIHNlcnZlciB3aWxsIHNldCB0aGUgQ0dJIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBkZXNjcmliZWQgaW4gdGhlIENHSQotc3BlY2lmaWNhdGlvbiwgd2l0aCB0aGUgZm9sbG93aW5nIHByb3Zpc29zOgotPGRsPgotPGR0PlJFTU9URV9IT1NUCi08ZGQ+VGhpcyB3aWxsIG9ubHkgYmUgc2V0IGlmIHRoZSBzZXJ2ZXIgaGFzIG5vdCBiZWVuIGNvbXBpbGVkIHdpdGgKLTxjb2RlPk1JTklNQUxfRE5TPC9jb2RlPi4KLTxkdD5SRU1PVEVfSURFTlQKLTxkZD5UaGlzIHdpbGwgb25seSBiZSBzZXQgaWYKLTxBIEhSRUY9ImNvcmUuaHRtbCNpZGVudGl0eWNoZWNrIj5JZGVudGl0eUNoZWNrPC9BPiBpcyBzZXQgdG8gPGNvZGU+b248L2NvZGU+LgotPGR0PlJFTU9URV9VU0VSCi08ZGQ+VGhpcyB3aWxsIG9ubHkgYmUgc2V0IGlmIHRoZSBDR0kgc2NyaXB0IGlzIHN1YmplY3QgdG8gYXV0aGVudGljYXRpb24uCi08L2RsPgotPFA+Ci08IS0tJWh5cGVydGV4dCAtLT4KLTxIUj4KLTxBIEhSRUY9Ii4uLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfaG9tZS5naWYiIEFMVD0iSG9tZSI+PC9BPgotPEEgSFJFRj0iLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2luZGV4LmdpZiIgQUxUPSJJbmRleCI+PC9BPgotPC9CT0RZPgotPC9IVE1MPgotPCEtLS8laHlwZXJ0ZXh0IC0tPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9jZ2kueG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9jZ2kueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzNlYTljLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfY2dpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSB4bWw6bWFudWFsIFsgPCFFTlRJVFkgbmJzcCAiJiMxNjA7Ij4gXT4KLTw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9Ii4uL3N0eWxlL21hbnVhbC54c2wiPz4KLTxtb2R1bGVzeW5vcHNpcz4KLQotPG5hbWU+bW9kX2NnaTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5FeGVjdXRpb24gb2YgQ0dJIHNjcmlwdHM8L2Rlc2NyaXB0aW9uPgotPHN0YXR1cz5CYXNlPC9zdGF0dXM+Ci08c291cmNlZmlsZT5tb2RfY2dpLmM8L3NvdXJjZWZpbGU+Ci08aWRlbnRpZmllcj5jZ2lfbW9kdWxlPC9pZGVudGlmaWVyPgotCi08c3VtbWFyeT4KLSAgICA8IS0tIFhYWDogU2hvdWxkIGhhdmUgcmVmZXJlbmNlcyB0byBDR0kgZGVmaW5pdGlvbi9SRkMgLS0+Ci0gICAgPCEtLSBYWFg6IFNob3VsZCBtZW50aW9uIE9wdGlvbnMgRXhlY0NHSSAgLS0+Ci0gICAgPCEtLSBYWFg6IFNob3VsZCBtZW50aW9uIEFjY2VwdFBhdGhJbmZvICAgLS0+Ci0KLSAgICA8cD5BbnkgZmlsZSB0aGF0IGhhcyB0aGUgbWltZSB0eXBlCi0gICAgPGNvZGU+YXBwbGljYXRpb24veC1odHRwZC1jZ2k8L2NvZGU+IG9yIGhhbmRsZXIKLSAgICA8Y29kZT5jZ2ktc2NyaXB0PC9jb2RlPiAoQXBhY2hlIDEuMSBvciBsYXRlcikgd2lsbCBiZSB0cmVhdGVkCi0gICAgYXMgYSBDR0kgc2NyaXB0LCBhbmQgcnVuIGJ5IHRoZSBzZXJ2ZXIsIHdpdGggaXRzIG91dHB1dCBiZWluZwotICAgIHJldHVybmVkIHRvIHRoZSBjbGllbnQuIEZpbGVzIGFjcXVpcmUgdGhpcyB0eXBlIGVpdGhlciBieQotICAgIGhhdmluZyBhIG5hbWUgY29udGFpbmluZyBhbiBleHRlbnNpb24gZGVmaW5lZCBieSB0aGUgCi0gICAgPGRpcmVjdGl2ZSBtb2R1bGU9Im1vZF9taW1lIj5BZGRUeXBlPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSwgb3IgYnkgYmVpbmcKLSAgICBpbiBhIDxkaXJlY3RpdmUgbW9kdWxlPSJtb2RfYWxpYXMiPlNjcmlwdEFsaWFzPC9kaXJlY3RpdmU+Ci0gICAgZGlyZWN0b3J5LjwvcD4KLQotICAgIDxwPldoZW4gdGhlIHNlcnZlciBpbnZva2VzIGEgQ0dJIHNjcmlwdCwgaXQgd2lsbCBhZGQgYSB2YXJpYWJsZQotICAgIGNhbGxlZCA8Y29kZT5ET0NVTUVOVF9ST09UPC9jb2RlPiB0byB0aGUgZW52aXJvbm1lbnQuIFRoaXMKLSAgICB2YXJpYWJsZSB3aWxsIGNvbnRhaW4gdGhlIHZhbHVlIG9mIHRoZQotICAgIDxkaXJlY3RpdmUgbW9kdWxlPSJjb3JlLmh0bWwiPkRvY3VtZW50Um9vdDwvZGlyZWN0aXZlPiBjb25maWd1cmF0aW9uCi0gICAgdmFyaWFibGUuPC9wPgotCi0gICAgPHA+Rm9yIGFuIGludHJvZHVjdGlvbiB0byB1c2luZyBDR0kgc2NyaXB0cyB3aXRoIEFwYWNoZSwgc2VlCi0gICAgb3VyIHR1dG9yaWFsIG9uIDxhIGhyZWY9Ii4uL2hvd3RvL2NnaS5odG1sIj5EeW5hbWljIENvbnRlbnQKLSAgICBXaXRoIENHSTwvYT4uPC9wPgotCi0gICAgPHA+V2hlbiB1c2luZyBhIG11bHRpLXRocmVhZGVkIE1QTSB1bmRlciB1bml4LCB0aGUgbW9kdWxlIAotICAgIDxtb2R1bGU+bW9kX2NnaWQ8L21vZHVsZT4gc2hvdWxkIGJlIHVzZWQgaW4gcGxhY2Ugb2YKLSAgICB0aGlzIG1vZHVsZS4gQXQgdGhlIHVzZXIgbGV2ZWwsIHRoZSB0d28gbW9kdWxlcyBhcmUgZXNzZW50aWFsbHkKLSAgICBpZGVudGljYWwuPC9wPgotPC9zdW1tYXJ5PgotCi08c2VlYWxzbz48ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSI+T3B0aW9uczwvZGlyZWN0aXZlPjwvc2VlYWxzbz4KLTxzZWVhbHNvPjxkaXJlY3RpdmUgbW9kdWxlPSJtb2RfYWxpYXMiPlNjcmlwdEFsaWFzPC9kaXJlY3RpdmU+PC9zZWVhbHNvPgotPHNlZWFsc28+PGRpcmVjdGl2ZSBtb2R1bGU9Im1vZF9taW1lIj5BZGRIYW5kbGVyPC9kaXJlY3RpdmU+PC9zZWVhbHNvPgotCi08c2VjdGlvbj48dGl0bGU+Q0dJIEVudmlyb25tZW50IHZhcmlhYmxlczwvdGl0bGU+Ci0gICAgPHA+VGhlIHNlcnZlciB3aWxsIHNldCB0aGUgQ0dJIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBkZXNjcmliZWQKLSAgICBpbiB0aGUgPGEgaHJlZj0iaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS8iPkNHSQotICAgIHNwZWNpZmljYXRpb248L2E+LCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvdmlzaW9uczo8L3A+Ci0KLSAgICA8ZGw+Ci0gICAgICA8ZHQ+UEFUSF9JTkZPPC9kdD4KLQotICAgICAgPGRkPlRoaXMgd2lsbCBub3QgYmUgYXZhaWxhYmxlIGlmIHRoZSA8ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSIKLSAgICAgID5BY2NlcHRQYXRoSW5mbzwvZGlyZWN0aXZlPiBkaXJlY3RpdmUgaXMgZXhwbGljaXRseSBzZXQgdG8KLSAgICAgIDxjb2RlPm9mZjwvY29kZT4uICBUaGUgZGVmYXVsdCBiZWhhdmlvciwgaWYgQWNjZXB0UGF0aEluZm8gaXMKLSAgICAgIG5vdCBnaXZlbiwgaXMgdGhhdCBtb2RfY2dpIHdpbGwgYWNjZXB0IHBhdGggaW5mbyAodHJhaWxpbmcKLSAgICAgIC9tb3JlL3BhdGgvaW5mbyBmb2xsb3dpbmcgdGhlIHNjcmlwdCBmaWxlbmFtZSBpbiB0aGUgVVJJKSwgd2hpbGUKLSAgICAgIHRoZSBjb3JlIHNlcnZlciB3aWxsIHJldHVybiBhIDQwNCBOT1QgRk9VTkQgZXJyb3IgZm9yIHJlcXVlc3RzCi0gICAgICB3aXRoIGFkZGl0aW9uYWwgcGF0aCBpbmZvLiAgT21pdHRpbmcgdGhlIEFjY2VwdFBhdGhJbmZvCi0gICAgICBkaXJlY3RpdmUgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBzZXR0aW5nIGl0IDxjb2RlPm9uPC9jb2RlPiBmb3IKLSAgICAgIG1vZF9jZ2kgcmVxdWVzdHMuPC9kZD4KLQotICAgICAgPGR0PlJFTU9URV9IT1NUPC9kdD4KLQotICAgICAgPGRkPlRoaXMgd2lsbCBvbmx5IGJlIHNldCBpZiA8ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSIKLSAgICAgID5Ib3N0bmFtZUxvb2t1cHM8L2RpcmVjdGl2ZT4gaXMgc2V0IHRvIDxjb2RlPm9uPC9jb2RlPiAoaXQKLSAgICAgIGlzIG9mZiBieSBkZWZhdWx0KSwgYW5kIGlmIGEgcmV2ZXJzZSBETlMgbG9va3VwIG9mIHRoZSBhY2Nlc3NpbmcKLSAgICAgIGhvc3QncyBhZGRyZXNzIGluZGVlZCBmaW5kcyBhIGhvc3QgbmFtZS48L2RkPgotCi0gICAgICA8ZHQ+UkVNT1RFX0lERU5UPC9kdD4KLQotICAgICAgPGRkPlRoaXMgd2lsbCBvbmx5IGJlIHNldCBpZiA8ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSIKLSAgICAgID5JZGVudGl0eUNoZWNrPC9kaXJlY3RpdmU+IGlzIHNldCB0bwotICAgICAgPGNvZGU+b248L2NvZGU+IGFuZCB0aGUgYWNjZXNzaW5nIGhvc3Qgc3VwcG9ydHMgdGhlIGlkZW50Ci0gICAgICBwcm90b2NvbC4gTm90ZSB0aGF0IHRoZSBjb250ZW50cyBvZiB0aGlzIHZhcmlhYmxlIGNhbm5vdCBiZQotICAgICAgcmVsaWVkIHVwb24gYmVjYXVzZSBpdCBjYW4gZWFzaWx5IGJlIGZha2VkLCBhbmQgaWYgdGhlcmUgaXMgYQotICAgICAgcHJveHkgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLCBpdCBpcyB1c3VhbGx5Ci0gICAgICB0b3RhbGx5IHVzZWxlc3MuPC9kZD4KLQotICAgICAgPGR0PlJFTU9URV9VU0VSPC9kdD4KLQotICAgICAgPGRkPlRoaXMgd2lsbCBvbmx5IGJlIHNldCBpZiB0aGUgQ0dJIHNjcmlwdCBpcyBzdWJqZWN0IHRvCi0gICAgICBhdXRoZW50aWNhdGlvbi48L2RkPgotICAgIDwvZGw+Ci08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uIGlkPSJjZ2lfZGVidWciPjx0aXRsZT5DR0kgRGVidWdnaW5nPC90aXRsZT4KLSAgICA8cD5EZWJ1Z2dpbmcgQ0dJIHNjcmlwdHMgaGFzIHRyYWRpdGlvbmFsbHkgYmVlbiBkaWZmaWN1bHQsIG1haW5seQotICAgIGJlY2F1c2UgaXQgaGFzIG5vdCBiZWVuIHBvc3NpYmxlIHRvIHN0dWR5IHRoZSBvdXRwdXQgKHN0YW5kYXJkCi0gICAgb3V0cHV0IGFuZCBlcnJvcikgZm9yIHNjcmlwdHMgd2hpY2ggYXJlIGZhaWxpbmcgdG8gcnVuCi0gICAgcHJvcGVybHkuIFRoZXNlIGRpcmVjdGl2ZXMsIGluY2x1ZGVkIGluIEFwYWNoZSAxLjIgYW5kIGxhdGVyLAotICAgIHByb3ZpZGUgbW9yZSBkZXRhaWxlZCBsb2dnaW5nIG9mIGVycm9ycyB3aGVuIHRoZXkgb2NjdXIuIDwvcD4KLQotPHNlY3Rpb24+PHRpdGxlPkNHSSBMb2dmaWxlIEZvcm1hdDwvdGl0bGU+Ci0gICAgPHA+V2hlbiBjb25maWd1cmVkLCB0aGUgQ0dJIGVycm9yIGxvZyBsb2dzIGFueSBDR0kgd2hpY2ggZG9lcyBub3QKLSAgICBleGVjdXRlIHByb3Blcmx5LiBFYWNoIENHSSBzY3JpcHQgd2hpY2ggZmFpbHMgdG8gb3BlcmF0ZSBjYXVzZXMKLSAgICBzZXZlcmFsIGxpbmVzIG9mIGluZm9ybWF0aW9uIHRvIGJlIGxvZ2dlZC4gVGhlIGZpcnN0IHR3byBsaW5lcwotICAgIGFyZSBhbHdheXMgb2YgdGhlIGZvcm1hdDo8L3A+Ci08ZXhhbXBsZT4KLSAgJSUgWzxlbT50aW1lPC9lbT5dIDxlbT5yZXF1ZXN0LWxpbmU8L2VtPjxiciAvPgotICAlJSA8ZW0+SFRUUC1zdGF0dXM8L2VtPiA8ZW0+Q0dJLXNjcmlwdC1maWxlbmFtZTwvZW0+Ci08L2V4YW1wbGU+Ci0gICAgPHA+SWYgdGhlIGVycm9yIGlzIHRoYXQgQ0dJIHNjcmlwdCBjYW5ub3QgYmUgcnVuLCB0aGUgbG9nIGZpbGUKLSAgICB3aWxsIGNvbnRhaW4gYW4gZXh0cmEgdHdvIGxpbmVzOjwvcD4KLTxleGFtcGxlPgotICAlJWVycm9yPGJyIC8+Ci0gIDxlbT5lcnJvci1tZXNzYWdlPC9lbT4KLTwvZXhhbXBsZT4KLSAgICA8cD5BbHRlcm5hdGl2ZWx5LCBpZiB0aGUgZXJyb3IgaXMgdGhlIHJlc3VsdCBvZiB0aGUgc2NyaXB0Ci0gICAgcmV0dXJuaW5nIGluY29ycmVjdCBoZWFkZXIgaW5mb3JtYXRpb24gKG9mdGVuIGR1ZSB0byBhIGJ1ZyBpbgotICAgIHRoZSBzY3JpcHQpLCB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGlzIGxvZ2dlZDogPC9wPgotPGV4YW1wbGU+Ci0gICVyZXF1ZXN0PGJyIC8+Ci0gIDxlbT5BbGwgSFRUUCByZXF1ZXN0IGhlYWRlcnMgcmVjZWl2ZWQ8L2VtPjxiciAvPgotICA8ZW0+UE9TVCBvciBQVVQgZW50aXR5IChpZiBhbnkpPC9lbT48YnIgLz4KLSAgJXJlc3BvbnNlPGJyIC8+Ci0gIDxlbT5BbGwgaGVhZGVycyBvdXRwdXQgYnkgdGhlIENHSSBzY3JpcHQ8L2VtPjxiciAvPgotICAlc3Rkb3V0PGJyIC8+Ci0gIDxlbT5DR0kgc3RhbmRhcmQgb3V0cHV0PC9lbT48YnIgLz4KLSAgJXN0ZGVycjxiciAvPgotICA8ZW0+Q0dJIHN0YW5kYXJkIGVycm9yPC9lbT48YnIgLz4KLTwvZXhhbXBsZT4KLSAgICA8cD4oVGhlICVzdGRvdXQgYW5kICVzdGRlcnIgcGFydHMgbWF5IGJlIG1pc3NpbmcgaWYgdGhlIHNjcmlwdCBkaWQKLSAgICBub3Qgb3V0cHV0IGFueXRoaW5nIG9uIHN0YW5kYXJkIG91dHB1dCBvciBzdGFuZGFyZCBlcnJvcikuIDwvcD4KLTwvc2VjdGlvbj4KLTwvc2VjdGlvbj4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U2NyaXB0TG9nPC9uYW1lPgotPGRlc2NyaXB0aW9uPkxvY2F0aW9uIG9mIHRoZSBDR0kgc2NyaXB0IGVycm9yIGxvZ2ZpbGU8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5TY3JpcHRMb2cgPGVtPmZpbGUtcGF0aDwvZW0+PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPG1vZHVsZWxpc3Q+PG1vZHVsZT5tb2RfY2dpPC9tb2R1bGU+PG1vZHVsZT5tb2RfY2dpZDwvbW9kdWxlPgotPC9tb2R1bGVsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIDxkaXJlY3RpdmU+U2NyaXB0TG9nPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBzZXRzIHRoZSBDR0kKLSAgICBzY3JpcHQgZXJyb3IgbG9nZmlsZS4gSWYgbm8gU2NyaXB0TG9nIGlzIGdpdmVuLCBubyBlcnJvciBsb2cgaXMKLSAgICBjcmVhdGVkLiBJZiBnaXZlbiwgYW55IENHSSBlcnJvcnMgYXJlIGxvZ2dlZCBpbnRvIHRoZSBmaWxlbmFtZQotICAgIGdpdmVuIGFzIGFyZ3VtZW50LiBJZiB0aGlzIGlzIGEgcmVsYXRpdmUgZmlsZSBvciBwYXRoIGl0IGlzIHRha2VuCi0gICAgcmVsYXRpdmUgdG8gdGhlIHNlcnZlciByb290LjwvcD4KLQotICAgIDxwPlRoaXMgbG9nIHdpbGwgYmUgb3BlbmVkIGFzIHRoZSB1c2VyIHRoZSBjaGlsZCBwcm9jZXNzZXMgcnVuCi0gICAgYXMsIGllLiB0aGUgdXNlciBzcGVjaWZpZWQgaW4gdGhlIG1haW4gPGRpcmVjdGl2ZSBtb2R1bGU9Im1wbV9jb21tb24iCi0gICAgPlVzZXI8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlLiBUaGlzIG1lYW5zIHRoYXQKLSAgICBlaXRoZXIgdGhlIGRpcmVjdG9yeSB0aGUgc2NyaXB0IGxvZyBpcyBpbiBuZWVkcyB0byBiZSB3cml0YWJsZQotICAgIGJ5IHRoYXQgdXNlciBvciB0aGUgZmlsZSBuZWVkcyB0byBiZSBtYW51YWxseSBjcmVhdGVkIGFuZCBzZXQKLSAgICB0byBiZSB3cml0YWJsZSBieSB0aGF0IHVzZXIuIElmIHlvdSBwbGFjZSB0aGUgc2NyaXB0IGxvZyBpbgotICAgIHlvdXIgbWFpbiBsb2dzIGRpcmVjdG9yeSwgZG8gPHN0cm9uZz5OT1Q8L3N0cm9uZz4gY2hhbmdlIHRoZQotICAgIGRpcmVjdG9yeSBwZXJtaXNzaW9ucyB0byBtYWtlIGl0IHdyaXRhYmxlIGJ5IHRoZSB1c2VyIHRoZSBjaGlsZAotICAgIHByb2Nlc3NlcyBydW4gYXMuPC9wPgotCi0gICAgPHA+Tm90ZSB0aGF0IHNjcmlwdCBsb2dnaW5nIGlzIG1lYW50IHRvIGJlIGEgZGVidWdnaW5nIGZlYXR1cmUKLSAgICB3aGVuIHdyaXRpbmcgQ0dJIHNjcmlwdHMsIGFuZCBpcyBub3QgbWVhbnQgdG8gYmUgYWN0aXZhdGVkCi0gICAgY29udGludW91c2x5IG9uIHJ1bm5pbmcgc2VydmVycy4gSXQgaXMgbm90IG9wdGltaXplZCBmb3Igc3BlZWQKLSAgICBvciBlZmZpY2llbmN5LCBhbmQgbWF5IGhhdmUgc2VjdXJpdHkgcHJvYmxlbXMgaWYgdXNlZCBpbiBhCi0gICAgbWFubmVyIG90aGVyIHRoYW4gdGhhdCBmb3Igd2hpY2ggaXQgd2FzIGRlc2lnbmVkLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5TY3JpcHRMb2dMZW5ndGg8L25hbWU+Ci08ZGVzY3JpcHRpb24+U2l6ZSBsaW1pdCBvZiB0aGUgQ0dJIHNjcmlwdCBsb2dmaWxlPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+U2NyaXB0TG9nTGVuZ3RoIDxlbT5ieXRlczwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5TY3JpcHRMb2dMZW5ndGggMTAzODU3NjA8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPG1vZHVsZWxpc3Q+PG1vZHVsZT5tb2RfY2dpPC9tb2R1bGU+PG1vZHVsZT5tb2RfY2dpZDwvbW9kdWxlPgotPC9tb2R1bGVsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+PGRpcmVjdGl2ZT5TY3JpcHRMb2dMZW5ndGg8L2RpcmVjdGl2ZT4gY2FuIGJlIHVzZWQgdG8gbGltaXQgdGhlCi0gICAgc2l6ZSBvZiB0aGUgQ0dJIHNjcmlwdCBsb2dmaWxlLiBTaW5jZSB0aGUgbG9nZmlsZSBsb2dzIGEgbG90IG9mCi0gICAgaW5mb3JtYXRpb24gcGVyIENHSSBlcnJvciAoYWxsIHJlcXVlc3QgaGVhZGVycywgYWxsIHNjcmlwdCBvdXRwdXQpCi0gICAgaXQgY2FuIGdyb3cgdG8gYmUgYSBiaWcgZmlsZS4gVG8gcHJldmVudCBwcm9ibGVtcyBkdWUgdG8gdW5ib3VuZGVkCi0gICAgZ3Jvd3RoLCB0aGlzIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBzZXQgYW4gbWF4aW11bSBmaWxlLXNpemUgZm9yCi0gICAgdGhlIENHSSBsb2dmaWxlLiBJZiB0aGUgZmlsZSBleGNlZWRzIHRoaXMgc2l6ZSwgbm8gbW9yZQotICAgIGluZm9ybWF0aW9uIHdpbGwgYmUgd3JpdHRlbiB0byBpdC48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U2NyaXB0TG9nQnVmZmVyPC9uYW1lPgotPGRlc2NyaXB0aW9uPk1heGltdW0gYW1vdW50IG9mIFBVVCBvciBQT1NUIHJlcXVlc3RzIHRoYXQgd2lsbCBiZSByZWNvcmRlZAotaW4gdGhlIHNjcmlwdGxvZzwvZGVzY3JpcHRpb24+Ci08c3ludGF4PlNjcmlwdExvZ0J1ZmZlciA8ZW0+Ynl0ZXM8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+U2NyaXB0TG9nQnVmZmVyIDEwMjQ8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPG1vZHVsZWxpc3Q+PG1vZHVsZT5tb2RfY2dpPC9tb2R1bGU+PG1vZHVsZT5tb2RfY2dpZDwvbW9kdWxlPgotPC9tb2R1bGVsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIHNpemUgb2YgYW55IFBVVCBvciBQT1NUIGVudGl0eSBib2R5IHRoYXQgaXMgbG9nZ2VkIHRvCi0gICAgdGhlIGZpbGUgaXMgbGltaXRlZCwgdG8gcHJldmVudCB0aGUgbG9nIGZpbGUgZ3Jvd2luZyB0b28gYmlnCi0gICAgdG9vIHF1aWNrbHkgaWYgbGFyZ2UgYm9kaWVzIGFyZSBiZWluZyByZWNlaXZlZC4gQnkgZGVmYXVsdCwgdXAKLSAgICB0byAxMDI0IGJ5dGVzIGFyZSBsb2dnZWQsIGJ1dCB0aGlzIGNhbiBiZSBjaGFuZ2VkIHdpdGggdGhpcwotICAgIGRpcmVjdGl2ZS48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPC9tb2R1bGVzeW5vcHNpcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2NnaWQuaHRtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfY2dpZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTZkNjA4Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfY2dpZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIG1vZHVsZSBtb2RfY2dpPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci0KLTxIMSBBTElHTj0iQ0VOVEVSIj5Nb2R1bGUgbW9kX2NnaWQ8L0gxPgotCi08cD5UaGlzIG1vZHVsZSBwcm92aWRlcyBmb3IgZXhlY3V0aW9uIG9mIENHSSBzY3JpcHRzIHVzaW5nIGFuIGV4dGVybmFsCi1DR0kgZGFlbW9uLjwvcD4KLQotPFA+PEEKLUhSRUY9Im1vZHVsZS1kaWN0Lmh0bWwjU3RhdHVzIgotUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZSAodW5peCB0aHJlYWRlZCBNUE1zIG9ubHkpCi08QlI+Ci08QQotSFJFRj0ibW9kdWxlLWRpY3QuaHRtbCNTb3VyY2VGaWxlIgotUkVMPSJIZWxwIgotPjxTVFJPTkc+U291cmNlIEZpbGU6PC9TVFJPTkc+PC9BPiBtb2RfY2dpZC5jCi08QlI+Ci08QQotSFJFRj0ibW9kdWxlLWRpY3QuaHRtbCNNb2R1bGVJZGVudGlmaWVyIgotUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlIElkZW50aWZpZXI6PC9TVFJPTkc+PC9BPiBjZ2lkX21vZHVsZQotPC9QPgotCi0KLTxIMj5TdW1tYXJ5PC9IMj4KLQotPHA+T24gY2VydGFpbiB1bml4IG9wZXJhdGluZyBzeXN0ZW1zLCBmb3JraW5nIGEgcHJvY2VzcyBmcm9tIGEKLW11bHRpLXRocmVhZGVkIHNlcnZlciBpcyBhIHZlcnkgZXhwZW5zaXZlIG9wZXJhdGlvbiBiZWNhdXNlIHRoZSBuZXcKLXByb2Nlc3Mgd2lsbCByZXBsaWNhdGUgYWxsIHRoZSB0aHJlYWRzIG9mIHRoZSBwYXJlbnQgcHJvY2Vzcy4gIEluCi1vcmRlciB0byBhdm9pZCBpbmN1cnJpbmcgdGhpcyBleHBlbnNlIG9uIGVhY2ggQ0dJIGludm9jYXRpb24sIG1vZF9jZ2lkCi1jcmVhdGVzIGFuIGV4dGVybmFsIGRhZW1vbiB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciBmb3JraW5nIGNoaWxkCi1wcm9jZXNzZXMgdG8gcnVuIENHSSBzY3JpcHRzLiAgVGhlIG1haW4gc2VydmVyIGNvbW11bmljYXRlcyB3aXRoIHRoaXMKLWRhZW1vbiB1c2luZyBhIHVuaXggZG9tYWluIHNvY2tldC48L3A+Ci0KLTxwPlRoaXMgbW9kdWxlIGlzIHVzZWQgYnkgZGVmYXVsdCB3aGVuZXZlciBhIG11bHRpLXRocmVhZGVkIE1QTSBpcwotc2VsZWN0ZWQgZHVyaW5nIHRoZSBjb21waWxhdGlvbiBwcm9jZXNzLiAgQXQgdGhlIHVzZXIgbGV2ZWwsIHRoaXMKLW1vZHVsZSBpcyBpZGVudGljYWwgaW4gY29uZmlndXJhdGlvbiBhbmQgb3BlcmF0aW9uIHRvIDxhCi1ocmVmPSJtb2RfY2dpLmh0bWwiPm1vZF9jZ2k8L2E+LiAgVGhlIG9ubHkgZXhjZXB0aW9uIGlzIHRoZSBhZGRpdGlvbmFsCi1kaXJlY3RpdmUgPGNvZGU+U2NyaXB0U29jazwvY29kZT4gd2hpY2ggZ2l2ZXMgdGhlIG5hbWUgb2YgdGhlIHNvY2tldAotdG8gdXNlIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGNnaSBkYWVtb24uPC9wPgotCi08aDI+RGlyZWN0aXZlczwvaDI+Ci0KLTx1bD4KLTxsaT48YSBocmVmPSJtb2RfY2dpLmh0bWwjc2NyaXB0bG9nIj5TY3JpcHRMb2c8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2RfY2dpLmh0bWwjc2NyaXB0bG9nbGVuZ3RoIj5TY3JpcHRMb2dMZW5ndGg8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2RfY2dpLmh0bWwjc2NyaXB0bG9nYnVmZmVyIj5TY3JpcHRMb2dCdWZmZXI8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjc2NyaXB0c29jayI+U2NyaXB0U29jazwvYT48L2xpPgotPC91bD4KLQotPGhyPgotCi08SDM+PEEgTkFNRT0ic2NyaXB0c29jayI+U2NyaXB0U29jazwvQT4gZGlyZWN0aXZlPC9IMz4KLQotPHA+PEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBTY3JpcHRzb2NrIDxFTT5maWxlbmFtZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IGxvZ3MvY2dpc29jazxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPGJyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfY2dpZDwvcD4KLQotPHA+VGhpcyBkaXJlY3RpdmUgc2V0cyB0aGUgbmFtZSBvZiB0aGUgc29ja2V0IHRvIHVzZSBmb3IgY29tbXVuaWNhdGlvbgotd2l0aCB0aGUgQ0dJIGRhZW1vbi4gIFRoZSBzb2NrZXQgd2lsbCBiZSBvcGVuZWQgdXNpbmcgdGhlIHBlcm1pc3Npb25zCi1vZiB0aGUgdXNlciB3aG8gc3RhcnRzIEFwYWNoZSAodXN1YWxseSByb290KS4gIFRvIG1haW50YWluIHRoZSBzZWN1cml0eQotb2YgY29tbXVuaWNhdGlvbnMgd2l0aCBDR0kgc2NyaXB0cywgaXQgaXMgaW1wb3J0YW50IHRoYXQgbm8gb3RoZXIKLXVzZXIgaGFzIHBlcm1pc3Npb24gdG8gd3JpdGUgaW4gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgc29ja2V0IGlzCi1sb2NhdGVkLjwvcD4KLQotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2NnaWQueG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9jZ2lkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmViZWE0Zi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX2NnaWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgeG1sOm1hbnVhbCBbIDwhRU5USVRZIG5ic3AgIiYjMTYwOyI+IF0+Ci08P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveHNsIiBocmVmPSIuLi9zdHlsZS9tYW51YWwueHNsIj8+Ci08bW9kdWxlc3lub3BzaXM+Ci0KLTxuYW1lPm1vZF9jZ2lkPC9uYW1lPgotPGRlc2NyaXB0aW9uPkV4ZWN1dGlvbiBvZiBDR0kgc2NyaXB0cyB1c2luZyBhbgotICAgIGV4dGVybmFsIENHSSBkYWVtb248L2Rlc2NyaXB0aW9uPgotPHN0YXR1cz5CYXNlPC9zdGF0dXM+Ci08c291cmNlZmlsZT5tb2RfY2dpZC5jPC9zb3VyY2VmaWxlPgotPGlkZW50aWZpZXI+Y2dpZF9tb2R1bGU8L2lkZW50aWZpZXI+Ci08Y29tcGF0aWJpbGl0eT5Vbml4IHRocmVhZGVkIE1QTXMgb25seTwvY29tcGF0aWJpbGl0eT4KLQotPHN1bW1hcnk+Ci0gICAgPHA+RXhjZXB0IGZvciB0aGUgb3B0aW1pemF0aW9ucyBhbmQgdGhlIGFkZGl0aW9uYWwgPGRpcmVjdGl2ZQotICAgIG1vZHVsZT0ibW9kX2NnaWQiPlNjcmlwdFNvY2s8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIG5vdGVkIGJlbG93LAotICAgIG1vZF9jZ2lkIGJlaGF2ZXMgc2ltaWxhcmx5IHRvIG1vZF9jZ2kuICA8c3Ryb25nPlNlZSB0aGUKLSAgICA8bW9kdWxlPm1vZF9jZ2k8L21vZHVsZT4gU3VtbWFyeSBmb3IgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0Ci0gICAgQXBhY2hlIGFuZCBDR0kuPC9zdHJvbmc+PC9wPgotCi0gICAgPHA+T24gY2VydGFpbiB1bml4IG9wZXJhdGluZyBzeXN0ZW1zLCBmb3JraW5nIGEgcHJvY2VzcyBmcm9tIGEKLSAgICBtdWx0aS10aHJlYWRlZCBzZXJ2ZXIgaXMgYSB2ZXJ5IGV4cGVuc2l2ZSBvcGVyYXRpb24gYmVjYXVzZSB0aGUKLSAgICBuZXcgcHJvY2VzcyB3aWxsIHJlcGxpY2F0ZSBhbGwgdGhlIHRocmVhZHMgb2YgdGhlIHBhcmVudAotICAgIHByb2Nlc3MuIEluIG9yZGVyIHRvIGF2b2lkIGluY3VycmluZyB0aGlzIGV4cGVuc2Ugb24gZWFjaCBDR0kKLSAgICBpbnZvY2F0aW9uLCBtb2RfY2dpZCBjcmVhdGVzIGFuIGV4dGVybmFsIGRhZW1vbiB0aGF0IGlzCi0gICAgcmVzcG9uc2libGUgZm9yIGZvcmtpbmcgY2hpbGQgcHJvY2Vzc2VzIHRvIHJ1biBDR0kgc2NyaXB0cy4gVGhlCi0gICAgbWFpbiBzZXJ2ZXIgY29tbXVuaWNhdGVzIHdpdGggdGhpcyBkYWVtb24gdXNpbmcgYSB1bml4IGRvbWFpbgotICAgIHNvY2tldC48L3A+Ci0KLSAgICA8cD5UaGlzIG1vZHVsZSBpcyB1c2VkIGJ5IGRlZmF1bHQgd2hlbmV2ZXIgYSBtdWx0aS10aHJlYWRlZCBNUE0KLSAgICBpcyBzZWxlY3RlZCBkdXJpbmcgdGhlIGNvbXBpbGF0aW9uIHByb2Nlc3MuIEF0IHRoZSB1c2VyIGxldmVsLAotICAgIHRoaXMgbW9kdWxlIGlzIGlkZW50aWNhbCBpbiBjb25maWd1cmF0aW9uIGFuZCBvcGVyYXRpb24gdG8KLSAgICA8bW9kdWxlPm1vZF9jZ2k8L21vZHVsZT4uIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyB0aGUKLSAgICBhZGRpdGlvbmFsIGRpcmVjdGl2ZSA8Y29kZT5TY3JpcHRTb2NrPC9jb2RlPiB3aGljaCBnaXZlcyB0aGUKLSAgICBuYW1lIG9mIHRoZSBzb2NrZXQgdG8gdXNlIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGNnaQotICAgIGRhZW1vbi48L3A+Ci08L3N1bW1hcnk+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibW9kX2NnaSI+Ci08bmFtZT5TY3JpcHRMb2c8L25hbWU+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXMgbG9jYXRpb249Im1vZF9jZ2kiPgotPG5hbWU+U2NyaXB0TG9nTGVuZ3RoPC9uYW1lPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzIGxvY2F0aW9uPSJtb2RfY2dpIj4KLTxuYW1lPlNjcmlwdExvZ0J1ZmZlcjwvbmFtZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlNjcmlwdFNvY2s8L25hbWU+Ci08c3ludGF4PlNjcmlwdFNvY2sgPGVtPmZpbGUtcGF0aDwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5TY3JpcHRTb2NrIGxvZ3MvY2dpc29jazwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGlzIGRpcmVjdGl2ZSBzZXRzIHRoZSBuYW1lIG9mIHRoZSBzb2NrZXQgdG8gdXNlIGZvcgotICAgIGNvbW11bmljYXRpb24gd2l0aCB0aGUgQ0dJIGRhZW1vbi4gVGhlIHNvY2tldCB3aWxsIGJlIG9wZW5lZAotICAgIHVzaW5nIHRoZSBwZXJtaXNzaW9ucyBvZiB0aGUgdXNlciB3aG8gc3RhcnRzIEFwYWNoZSAodXN1YWxseQotICAgIHJvb3QpLiBUbyBtYWludGFpbiB0aGUgc2VjdXJpdHkgb2YgY29tbXVuaWNhdGlvbnMgd2l0aCBDR0kKLSAgICBzY3JpcHRzLCBpdCBpcyBpbXBvcnRhbnQgdGhhdCBubyBvdGhlciB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvCi0gICAgd3JpdGUgaW4gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgc29ja2V0IGlzIGxvY2F0ZWQuPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTwvbW9kdWxlc3lub3BzaXM+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfY2hhcnNldF9saXRlLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2NoYXJzZXRfbGl0ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWUzZTQ5Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfY2hhcnNldF9saXRlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci0gPEhFQUQ+Ci0gIDxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9jaGFyc2V0X2xpdGU8L1RJVExFPgotIDwvSEVBRD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLSA8Qk9EWQotICBCR0NPTE9SPSIjRkZGRkZGIgotICBURVhUPSIjMDAwMDAwIgotICBMSU5LPSIjMDAwMEZGIgotICBWTElOSz0iIzAwMDA4MCIKLSAgQUxJTks9IiNGRjAwMDAiCi0gPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLSAgPEgxIEFMSUdOPSJDRU5URVIiPk1vZHVsZSBtb2RfY2hhcnNldF9saXRlPC9IMT4KLQotICA8UD4KLSAgVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Q09ERT5tb2RfY2hhcnNldF9saXRlLmM8L0NPREU+IGZpbGUsIHdpdGgKLSAgQXBhY2hlIDIuMCBhbmQgbGF0ZXIuIEl0IHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIHNwZWNpZnkgY2hhcmFjdGVyIHNldAotICB0cmFuc2xhdGlvbiwgb3IgcmVjb2RpbmcsIGJ5IGRpcmVjdG9yeSBvciBsb2NhdGlvbiBvciB2aXJ0dWFsIHNlcnZlci4gIEl0Ci0gIGlzIG5vdCBjb21waWxlZCBpbnRvIHRoZSBzZXJ2ZXIgYnkgZGVmYXVsdC4gIDxDT0RFPm1vZF9jaGFyc2V0X2xpdGU8L0NPREU+Ci0gIHJlcXVpcmVzIHRoYXQgQXBhY2hlIGlzIGNvbXBpbGVkIHdpdGggQVBBQ0hFX1hMQVRFIGRlZmluZWQuCi0gIDwvUD4KLQotICA8UD4KLSAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBzbWFsbCBzdWJzZXQgb2YgY29uZmlndXJhdGlvbiBtZWNoYW5pc21zCi0gIGltcGxlbWVudGVkIGJ5IFJ1c3NpYW4gQXBhY2hlIGFuZCBpdHMgYXNzb2NpYXRlZCA8Q09ERT5tb2RfY2hhcnNldDwvQ09ERT4uCi0gIDwvUD4KLQotICA8SDI+U3VtbWFyeTwvSDI+Ci0gIDxQPgotICBUaGlzIGlzIGFuIDxTVFJPTkc+ZXhwZXJpbWVudGFsPC9TVFJPTkc+IG1vZHVsZSBhbmQgc2hvdWxkIGJlIHVzZWQgd2l0aAotICBjYXJlLiAgRXhwZXJpbWVudCB3aXRoIHlvdXIgPENPREU+bW9kX2NoYXJzZXRfbGl0ZTwvQ09ERT4gY29uZmlndXJhdGlvbiB0bwotICBlbnN1cmUgdGhhdCBpdCBwZXJmb3JtcyB0aGUgZGVzaXJlZCBmdW5jdGlvbi4KLSAgPC9QPgotICA8UD4KLSAgPENPREU+bW9kX2NoYXJzZXRfbGl0ZTwvQ09ERT4gYWxsb3dzIHRoZSBhZG1pbmlzdHJhdG9yIHRvIHNwZWNpZnkgdGhlCi0gIHNvdXJjZSBjaGFyYWN0ZXIgc2V0IG9mIG9iamVjdHMgYXMgd2VsbCBhcyB0aGUgY2hhcmFjdGVyIHNldCB0aGV5IHNob3VsZCAKLSAgYmUgdHJhbnNsYXRlZCBpbnRvIGJlZm9yZSBzZW5kaW5nIHRvIHRoZSBjbGllbnQuICAKLSAgPENPREU+bW9kX2NoYXJzZXRfbGl0ZTwvQ09ERT4gZG9lcyBub3QgdHJhbnNsYXRlIHRoZSBkYXRhIGl0c2VsZiBidXQKLSAgaW5zdGVhZCB0ZWxscyBBcGFjaGUgd2hhdCB0cmFuc2xhdGlvbiB0byBwZXJmb3JtLiAgCi0gIDxDT0RFPm1vZF9jaGFyc2V0X2xpdGU8L0NPREU+IGlzIGFwcGxpY2FibGUgdG8gRUJDRElDIGFuZCBBU0NJSSAKLSAgaG9zdCBlbnZpcm9ubWVudHMuICBJbiBhbiBFQkNESUMgZW52aXJvbm1lbnQsIEFwYWNoZSBub3JtYWxseSB0cmFuc2xhdGVzIAotICB0ZXh0IGNvbnRlbnQgZnJvbSB0aGUgY29kZSBwYWdlIG9mIHRoZSBBcGFjaGUgcHJvY2VzcyBsb2NhbGUgdG8gCi0gIElTTy04ODU5LTEuICA8Q09ERT5tb2RfY2hhcnNldF9saXRlPC9DT0RFPiBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoYXQKLSAgYSBkaWZmZXJlbnQgdHJhbnNsYXRpb24gaXMgdG8gYmUgcGVyZm9ybWVkLiAgSW4gYW4gQVNDSUkgZW52aXJvbm1lbnQsCi0gIEFwYWNoZSBub3JtYWxseSBwZXJmb3JtcyBubyB0cmFuc2xhdGlvbiwgc28gPENPREU+bW9kX2NoYXJzZXRfbGl0ZTwvQ09ERT4KLSAgaXMgbmVlZGVkIGluIG9yZGVyIGZvciBhbnkgdHJhbnNsYXRpb24gdG8gdGFrZSBwbGFjZS4KLSAgPC9QPgotCi0gIDxIMj5EaXJlY3RpdmVzPC9IMj4KLSAgPFVMPgotICAgPExJPjxBIEhSRUY9IiNjaGFyc2V0c291cmNlZW5jIj5DaGFyc2V0U291cmNlRW5jPC9BPgotICAgPExJPjxBIEhSRUY9IiNjaGFyc2V0ZGVmYXVsdCI+Q2hhcnNldERlZmF1bHQ8L0E+Ci0gICA8TEk+PEEgSFJFRj0iI2NoYXJzZXRkZWJ1ZyI+Q2hhcnNldERlYnVnPC9BPgotICAgPC9MST4KLSAgPC9VTD4KLQotICA8SFI+Ci0KLSAgPEgyPjxBIE5BTUU9ImNoYXJzZXRzb3VyY2VlbmMiPkNoYXJzZXRTb3VyY2VFbmM8L0E+PC9IMj4KLSAgPFA+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQ2hhcnNldFNvdXJjZUVuYyA8RU0+Y2hhcnNldDwvRU0+Ci0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxFTT5Ob25lPC9FTT4KLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gZGlyZWN0b3J5LCB2aXJ0dWFsIGhvc3QKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiA8RU0+RmlsZUluZm88L0VNPgotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gRXhwZXJpbWVudGFsCi0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfY2hhcnNldF9saXRlCi0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IE9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZSAyLjAgb3IgbGF0ZXIKLQotICA8UD4KLSAgVGhlIDxDT0RFPkNoYXJzZXRTb3VyY2VFbmM8L0NPREU+IGRpcmVjdGl2ZSBzcGVjaWZpZXMgdGhlIHNvdXJjZSBjaGFyc2V0Ci0gIG9mIGZpbGVzIGluIHRoZSBhc3NvY2lhdGVkIGNvbnRhaW5lci4KLSAgPC9QPgotCi0gIDxQPgotICBUaGUgdmFsdWUgb2YgdGhlIDxFTT5jaGFyc2V0PC9FTT4gYXJndW1lbnQgbXVzdCBiZSBhY2NlcHRlZCBhcyBhIHZhbGlkCi0gIGNoYXJhY3RlciBzZXQgbmFtZSBieSB0aGUgY2hhcmFjdGVyIHNldCBzdXBwb3J0IGluIEFQUi4gIEdlbmVyYWxseSwgdGhpcwotICBtZWFucyB0aGF0IGl0IG11c3QgYmUgc3VwcG9ydGVkIGJ5IGljb252LgotICA8L1A+Ci0KLSAgRXhhbXBsZToKLQotICA8UFJFPgotICAgICZsdDtEaXJlY3RvcnkgIi9leHBvcnQvaG9tZS90cmF3aWNrL2FwYWNoZWluc3QvaHRkb2NzL2NvbnZlcnQiJmd0OwotICAgIENoYXJzZXRTb3VyY2VFbmMgIFVURi0xNkJFCi0gICAgQ2hhcnNldERlZmF1bHQgICAgSVNPODg1OS0xCi0gICAgJmx0Oy9EaXJlY3RvcnkmZ3Q7Ci0gIDwvUFJFPgotCi0gIFRoZSBjaGFyYWN0ZXIgc2V0IG5hbWVzIGluIHRoaXMgZXhhbXBsZSB3b3JrIHdpdGggdGhlIGljb252Ci0gIHRyYW5zbGF0aW9uIHN1cHBvcnQgaW4gU29sYXJpcyA4LgotICA8UD4KLQotICA8SDI+PEEgTkFNRT0iY2hhcnNldGRlZmF1bHQiPkNoYXJzZXREZWZhdWx0PC9BPjwvSDI+Ci0gIDxQPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IENoYXJzZXREZWZhdWx0IDxFTT5jaGFyc2V0PC9FTT4KLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPEVNPk5vbmU8L0VNPgotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBkaXJlY3RvcnksIHZpcnR1YWwgaG9zdAotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IDxFTT5GaWxlSW5mbzwvRU0+Ci0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBFeHBlcmltZW50YWwKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9jaGFyc2V0X2xpdGUKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gT25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDIuMCBvciBsYXRlcgotCi0gIDxQPgotICBUaGUgPENPREU+Q2hhcnNldERlZmF1bHQ8L0NPREU+IGRpcmVjdGl2ZSBzcGVjaWZpZXMgdGhlIGNoYXJzZXQgdGhhdAotICBjb250ZW50IGluIHRoZSBhc3NvY2lhdGVkIGNvbnRhaW5lciBzaG91bGQgYmUgdHJhbnNsYXRlZCB0by4KLSAgPC9QPgotCi0gIDxQPgotICBUaGUgdmFsdWUgb2YgdGhlIDxFTT5jaGFyc2V0PC9FTT4gYXJndW1lbnQgbXVzdCBiZSBhY2NlcHRlZCBhcyBhIHZhbGlkCi0gIGNoYXJhY3RlciBzZXQgbmFtZSBieSB0aGUgY2hhcmFjdGVyIHNldCBzdXBwb3J0IGluIEFQUi4gIEdlbmVyYWxseSwgdGhpcwotICBtZWFucyB0aGF0IGl0IG11c3QgYmUgc3VwcG9ydGVkIGJ5IGljb252LgotICA8L1A+Ci0KLSAgRXhhbXBsZToKLQotICA8UFJFPgotICAgICZsdDtEaXJlY3RvcnkgIi9leHBvcnQvaG9tZS90cmF3aWNrL2FwYWNoZWluc3QvaHRkb2NzL2NvbnZlcnQiJmd0OwotICAgIENoYXJzZXRTb3VyY2VFbmMgIFVURi0xNkJFCi0gICAgQ2hhcnNldERlZmF1bHQgICAgSVNPODg1OS0xCi0gICAgJmx0Oy9EaXJlY3RvcnkmZ3Q7Ci0gIDwvUFJFPgotCi0gIDxQPgotCi0gIDxIMj48QSBOQU1FPSJjaGFyc2V0ZGVidWciPkNoYXJzZXREZWJ1ZzwvQT48L0gyPgotICA8UD4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBDaGFyc2V0RGVidWcgPEVNPm9uL29mZjwvRU0+Ci0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxFTT5vZmY8L0VNPgotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBkaXJlY3RvcnksIHZpcnR1YWwgaG9zdAotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IDxFTT5GaWxlSW5mbzwvRU0+Ci0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBFeHBlcmltZW50YWwKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9jaGFyc2V0X2xpdGUKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gT25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDIuMCBvciBsYXRlcgotCi0gIDxQPgotICBUaGUgPENPREU+Q2hhcnNldERlYnVnPC9DT0RFPiBkaXJlY3RpdmUgc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IAotICB2ZXJib3NlIGxvZ2dpbmcgc2hvdWxkIGJlIHBlcmZvcm1lZCBieSA8Q09ERT5tb2RfY2hhcnNldF9saXRlPC9DT0RFPi4KLSAgU3VjaCBsb2dnaW5nIGlzIHdyaXR0ZW4gdG8gdGhlIEFwYWNoZSBlcnJvciBsb2cgd2l0aCBsZXZlbCAKLSAgPEVNPmRlYnVnPC9FTT4uCi0gIDwvUD4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLSA8L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2NoYXJzZXRfbGl0ZS54bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2NoYXJzZXRfbGl0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZjE5ZjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9jaGFyc2V0X2xpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iLi4vc3R5bGUvbWFudWFsLnhzbCI/PgotPG1vZHVsZXN5bm9wc2lzPgotCi08bmFtZT5tb2RfY2hhcnNldF9saXRlPC9uYW1lPgotPGRlc2NyaXB0aW9uPnNwZWNpZnkgY2hhcmFjdGVyIHNldCB0cmFuc2xhdGlvbiBvciByZWNvZGluZzwvZGVzY3JpcHRpb24+Ci08c3RhdHVzPkV4cGVyaW1lbnRhbDwvc3RhdHVzPgotPHNvdXJjZWZpbGU+bW9kX2NoYXJzZXRfbGl0ZS5jPC9zb3VyY2VmaWxlPgotPGlkZW50aWZpZXI+Y2hhcnNldF9saXRlX21vZHVsZTwvaWRlbnRpZmllcj4KLQotPHN1bW1hcnk+Ci0gICAgPHA+VGhpcyBpcyBhbiA8c3Ryb25nPmV4cGVyaW1lbnRhbDwvc3Ryb25nPiBtb2R1bGUgYW5kIHNob3VsZAotICAgIGJlIHVzZWQgd2l0aCBjYXJlLiBFeHBlcmltZW50IHdpdGggeW91cgotICAgIDxjb2RlPm1vZF9jaGFyc2V0X2xpdGU8L2NvZGU+IGNvbmZpZ3VyYXRpb24gdG8gZW5zdXJlIHRoYXQgaXQKLSAgICBwZXJmb3JtcyB0aGUgZGVzaXJlZCBmdW5jdGlvbi48L3A+Ci0KLSAgICA8cD48bW9kdWxlPm1vZF9jaGFyc2V0X2xpdGU8L21vZHVsZT4gYWxsb3dzIHRoZSBhZG1pbmlzdHJhdG9yIHRvCi0gICAgc3BlY2lmeSB0aGUgc291cmNlIGNoYXJhY3RlciBzZXQgb2Ygb2JqZWN0cyBhcyB3ZWxsIGFzIHRoZQotICAgIGNoYXJhY3RlciBzZXQgdGhleSBzaG91bGQgYmUgdHJhbnNsYXRlZCBpbnRvIGJlZm9yZSBzZW5kaW5nIHRvIHRoZQotICAgIGNsaWVudC4gPG1vZHVsZT5tb2RfY2hhcnNldF9saXRlPC9tb2R1bGU+IGRvZXMgbm90IHRyYW5zbGF0ZSB0aGUKLSAgICBkYXRhIGl0c2VsZiBidXQgaW5zdGVhZCB0ZWxscyBBcGFjaGUgd2hhdCB0cmFuc2xhdGlvbiB0bwotICAgIHBlcmZvcm0uIDxtb2R1bGU+bW9kX2NoYXJzZXRfbGl0ZTwvbW9kdWxlPiBpcyBhcHBsaWNhYmxlIHRvIEVCQ0RJQwotICAgIGFuZCBBU0NJSSBob3N0IGVudmlyb25tZW50cy4gSW4gYW4gRUJDRElDIGVudmlyb25tZW50LCBBcGFjaGUKLSAgICBub3JtYWxseSB0cmFuc2xhdGVzIHRleHQgY29udGVudCBmcm9tIHRoZSBjb2RlIHBhZ2Ugb2YgdGhlIEFwYWNoZQotICAgIHByb2Nlc3MgbG9jYWxlIHRvIElTTy04ODU5LTEuICA8bW9kdWxlPm1vZF9jaGFyc2V0X2xpdGU8L21vZHVsZT4KLSAgICBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoYXQgYSBkaWZmZXJlbnQgdHJhbnNsYXRpb24gaXMgdG8gYmUKLSAgICBwZXJmb3JtZWQuIEluIGFuIEFTQ0lJIGVudmlyb25tZW50LCBBcGFjaGUgbm9ybWFsbHkgcGVyZm9ybXMgbm8KLSAgICB0cmFuc2xhdGlvbiwgc28gPG1vZHVsZT5tb2RfY2hhcnNldF9saXRlPC9tb2R1bGU+IGlzIG5lZWRlZCBpbgotICAgIG9yZGVyIGZvciBhbnkgdHJhbnNsYXRpb24gdG8gdGFrZSBwbGFjZS48L3A+Ci0KLSAgICA8cD5UaGlzIG1vZHVsZSBwcm92aWRlcyBhIHNtYWxsIHN1YnNldCBvZiBjb25maWd1cmF0aW9uCi0gICAgbWVjaGFuaXNtcyBpbXBsZW1lbnRlZCBieSBSdXNzaWFuIEFwYWNoZSBhbmQgaXRzIGFzc29jaWF0ZWQKLSAgICA8Y29kZT5tb2RfY2hhcnNldDwvY29kZT4uPC9wPgotPC9zdW1tYXJ5PgotCi08c2VjdGlvbj48dGl0bGU+Q29tbW9uIFByb2JsZW1zPC90aXRsZT4KLQotPHNlY3Rpb24+PHRpdGxlPkludmFsaWQgY2hhcmFjdGVyIHNldCBuYW1lczwvdGl0bGU+Ci0KLSAgICA8cD5UaGUgY2hhcmFjdGVyIHNldCBuYW1lIHBhcmFtZXRlcnMgb2YgPGRpcmVjdGl2ZQotICAgIG1vZHVsZT0ibW9kX2NoYXJzZXRfbGl0ZSI+Q2hhcnNldFNvdXJjZUVuYzwvZGlyZWN0aXZlPiBhbmQKLSAgICA8ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX2NoYXJzZXRfbGl0ZSI+Q2hhcnNldERlZmF1bHQ8L2RpcmVjdGl2ZT4KLSAgICBtdXN0IGJlIGFjY2VwdGFibGUgdG8gdGhlIHRyYW5zbGF0aW9uIG1lY2hhbmlzbSB1c2VkIGJ5IEFQUiBvbiB0aGUKLSAgICBzeXN0ZW0gd2hlcmUgPG1vZHVsZT5tb2RfY2hhcnNldF9saXRlPC9tb2R1bGU+IGlzIGRlcGxveWVkLiAgVGhlc2UKLSAgICBjaGFyYWN0ZXIgc2V0IG5hbWVzIGFyZSBub3Qgc3RhbmRhcmRpemVkIGFuZCBhcmUgdXN1YWxseSBub3QgdGhlCi0gICAgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgdXNlZCBpbiBodHRwIGhlYWRlcnMuICBDdXJyZW50bHksCi0gICAgQVBSIGNhbiBvbmx5IHVzZSBpY29udigzKSwgc28geW91IGNhbiBlYXNpbHkgdGVzdCB5b3VyIGNoYXJhY3RlcgotICAgIHNldCBuYW1lcyB1c2luZyB0aGUgaWNvbnYoMSkgcHJvZ3JhbSwgYXMgZm9sbG93czo8L3A+Ci08ZXhhbXBsZT4KLSAgaWNvbnYgLWYgY2hhcnNldHNvdXJjZWVuYy12YWx1ZSAtdCBjaGFyc2V0ZGVmYXVsdC12YWx1ZQotPC9leGFtcGxlPgotPC9zZWN0aW9uPgotCi08c2VjdGlvbj48dGl0bGU+TWlzbWF0Y2ggYmV0d2VlbiBjaGFyYWN0ZXIgc2V0IG9mIGNvbnRlbnQgYW5kIHRyYW5zbGF0aW9uCi0gICAgcnVsZXM8L3RpdGxlPgotCi0gICAgPHA+SWYgdGhlIHRyYW5zbGF0aW9uIHJ1bGVzIGRvbid0IG1ha2Ugc2Vuc2UgZm9yIHRoZSBjb250ZW50LAotICAgIHRyYW5zbGF0aW9uIGNhbiBmYWlsIGluIHZhcmlvdXMgd2F5cywgaW5jbHVkaW5nOjwvcD4KLQotICAgIDx1bD4KLSAgICAgIDxsaT5UaGUgdHJhbnNsYXRpb24gbWVjaGFuaXNtIG1heSByZXR1cm4gYSBiYWQgcmV0dXJuIGNvZGUsCi0gICAgICBhbmQgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBhYm9ydGVkLjwvbGk+Ci0KLSAgICAgIDxsaT5UaGUgdHJhbnNsYXRpb24gbWVjaGFuaXNtIG1heSBzaWxlbnRseSBwbGFjZSBzcGVjaWFsCi0gICAgICBjaGFyYWN0ZXJzIChlLmcuLCBxdWVzdGlvbiBtYXJrcykgaW4gdGhlIG91dHB1dCBidWZmZXIgd2hlbgotICAgICAgaXQgY2Fubm90IHRyYW5zbGF0ZSB0aGUgaW5wdXQgYnVmZmVyLjwvbGk+Ci0gICAgPC91bD4KLTwvc2VjdGlvbj4KLTwvc2VjdGlvbj4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+Q2hhcnNldFNvdXJjZUVuYzwvbmFtZT4KLTxzeW50YXg+Q2hhcnNldFNvdXJjZUVuYyA8ZW0+Y2hhcnNldDwvZW0+PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD48Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+Ci08Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPkZpbGVJbmZvPC9vdmVycmlkZT4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPkNoYXJzZXRTb3VyY2VFbmM8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIHNwZWNpZmllcyB0aGUKLSAgICBzb3VyY2UgY2hhcnNldCBvZiBmaWxlcyBpbiB0aGUgYXNzb2NpYXRlZCBjb250YWluZXIuPC9wPgotCi0gICAgPHA+VGhlIHZhbHVlIG9mIHRoZSA8ZW0+Y2hhcnNldDwvZW0+IGFyZ3VtZW50IG11c3QgYmUgYWNjZXB0ZWQKLSAgICBhcyBhIHZhbGlkIGNoYXJhY3RlciBzZXQgbmFtZSBieSB0aGUgY2hhcmFjdGVyIHNldCBzdXBwb3J0IGluCi0gICAgQVBSLiBHZW5lcmFsbHksIHRoaXMgbWVhbnMgdGhhdCBpdCBtdXN0IGJlIHN1cHBvcnRlZCBieQotICAgIGljb252LjwvcD4KLSAgICBFeGFtcGxlOiAKLTxleGFtcGxlPgotICAgICZsdDtEaXJlY3RvcnkgIi9leHBvcnQvaG9tZS90cmF3aWNrL2FwYWNoZWluc3QvaHRkb2NzL2NvbnZlcnQiJmd0OzxiciAvPgotICAgIENoYXJzZXRTb3VyY2VFbmMgIFVURi0xNkJFPGJyIC8+Ci0gICAgQ2hhcnNldERlZmF1bHQgICAgSVNPODg1OS0xPGJyIC8+Ci0gICAgJmx0Oy9EaXJlY3RvcnkmZ3Q7Ci08L2V4YW1wbGU+Ci0gICAgPHA+VGhlIGNoYXJhY3RlciBzZXQgbmFtZXMgaW4gdGhpcyBleGFtcGxlIHdvcmsgd2l0aCB0aGUgaWNvbnYKLSAgICB0cmFuc2xhdGlvbiBzdXBwb3J0IGluIFNvbGFyaXMgOC48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+Q2hhcnNldERlZmF1bHQ8L25hbWU+Ci08c3ludGF4PkNoYXJzZXREZWZhdWx0IDxlbT5jaGFyc2V0PC9lbT48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PgotPGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0Pjxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD4KLTxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+RmlsZUluZm88L292ZXJyaWRlPgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIDxkaXJlY3RpdmU+Q2hhcnNldERlZmF1bHQ8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIHNwZWNpZmllcyB0aGUKLSAgICBjaGFyc2V0IHRoYXQgY29udGVudCBpbiB0aGUgYXNzb2NpYXRlZCBjb250YWluZXIgc2hvdWxkIGJlCi0gICAgdHJhbnNsYXRlZCB0by48L3A+Ci0KLSAgICA8cD5UaGUgdmFsdWUgb2YgdGhlIDxlbT5jaGFyc2V0PC9lbT4gYXJndW1lbnQgbXVzdCBiZSBhY2NlcHRlZAotICAgIGFzIGEgdmFsaWQgY2hhcmFjdGVyIHNldCBuYW1lIGJ5IHRoZSBjaGFyYWN0ZXIgc2V0IHN1cHBvcnQgaW4KLSAgICBBUFIuIEdlbmVyYWxseSwgdGhpcyBtZWFucyB0aGF0IGl0IG11c3QgYmUgc3VwcG9ydGVkIGJ5Ci0gICAgaWNvbnYuPC9wPgotICAgIEV4YW1wbGU6IAotPGV4YW1wbGU+Ci0gICAgJmx0O0RpcmVjdG9yeSAiL2V4cG9ydC9ob21lL3RyYXdpY2svYXBhY2hlaW5zdC9odGRvY3MvY29udmVydCImZ3Q7PGJyIC8+Ci0gICAgQ2hhcnNldFNvdXJjZUVuYyAgVVRGLTE2QkU8YnIgLz4KLSAgICBDaGFyc2V0RGVmYXVsdCAgICBJU084ODU5LTE8YnIgLz4KLSAgICAmbHQ7L0RpcmVjdG9yeSZndDsKLTwvZXhhbXBsZT4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5DaGFyc2V0T3B0aW9uczwvbmFtZT4KLTxzeW50YXg+Q2hhcnNldE9wdGlvbnMgPGVtPm9wdGlvbjwvZW0+IFs8ZW0+b3B0aW9uPC9lbT5dIC4uLjwvc3ludGF4PgotPGRlZmF1bHQ+Q2hhcnNldE9wdGlvbnMgPGVtPkRlYnVnTGV2ZWw9MDwvZW0+IAotPGVtPk5vSW1wbGljaXRBZGQ8L2VtPjwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PgotPGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0Pjxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD4KLTxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+RmlsZUluZm88L292ZXJyaWRlPgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIDxkaXJlY3RpdmU+Q2hhcnNldE9wdGlvbnM8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIGNvbmZpZ3VyZXMgY2VydGFpbgotICAgIGJlaGF2aW9ycyBvZiA8bW9kdWxlPm1vZF9jaGFyc2V0X2xpdGU8L21vZHVsZT4uIDxlbT5PcHRpb248L2VtPiBjYW4KLSAgICBiZSBvbmUgb2Y8L3A+Ci0KLSAgICA8ZGw+Ci0gICAgICA8ZHQ+RGVidWdMZXZlbD08ZW0+bjwvZW0+PC9kdD4KLQotICAgICAgPGRkPlRoZSA8Y29kZT5EZWJ1Z0xldmVsPC9jb2RlPiBrZXl3b3JkIGFsbG93cyB5b3UgdG8gc3BlY2lmeQotICAgICAgdGhlIGxldmVsIG9mIGRlYnVnIG1lc3NhZ2VzIGdlbmVyYXRlZCBieQotICAgICAgPG1vZHVsZT5tb2RfY2hhcnNldF9saXRlPC9tb2R1bGU+LiBCeSBkZWZhdWx0LCBubyBtZXNzYWdlcyBhcmUKLSAgICAgIGdlbmVyYXRlZC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIDxjb2RlPkRlYnVnTGV2ZWw9MDwvY29kZT4uCi0gICAgICBXaXRoIGhpZ2hlciBudW1iZXJzLCBtb3JlIGRlYnVnIG1lc3NhZ2VzIGFyZSBnZW5lcmF0ZWQsIGFuZAotICAgICAgc2VydmVyIHBlcmZvcm1hbmNlIHdpbGwgYmUgZGVncmFkZWQuIFRoZSBhY3R1YWwgbWVhbmluZ3Mgb2YKLSAgICAgIHRoZSBudW1lcmljIHZhbHVlcyBhcmUgZGVzY3JpYmVkIHdpdGggdGhlIGRlZmluaXRpb25zIG9mIHRoZQotICAgICAgREJHTFZMXyBjb25zdGFudHMgbmVhciB0aGUgYmVnaW5uaW5nIG9mCi0gICAgICA8Y29kZT5tb2RfY2hhcnNldF9saXRlLmM8L2NvZGU+LjwvZGQ+Ci0KLSAgICAgIDxkdD5JbXBsaWNpdEFkZCB8IE5vSW1wbGljaXRBZGQ8L2R0PgotCi0gICAgICA8ZGQ+VGhlIDxjb2RlPkltcGxpY2l0QWRkPC9jb2RlPiBrZXl3b3JkIHNwZWNpZmllcyB0aGF0Ci0gICAgICA8bW9kdWxlPm1vZF9jaGFyc2V0X2xpdGU8L21vZHVsZT4gc2hvdWxkIGltcGxpY2l0bHkgaW5zZXJ0IGl0cwotICAgICAgZmlsdGVyIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVzIHRoYXQgdGhlIGNoYXJhY3RlcgotICAgICAgc2V0IG9mIGNvbnRlbnQgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuIElmIHRoZSBmaWx0ZXIgY2hhaW4gaXMKLSAgICAgIGV4cGxpY2l0bHkgY29uZmlndXJlZCB1c2luZyB0aGUgQWRkT3V0cHV0RmlsdGVyIGRpcmVjdGl2ZSwKLSAgICAgIDxjb2RlPk5vSW1wbGljaXRBZGQ8L2NvZGU+IHNob3VsZCBiZSBzcGVjaWZpZWQgc28gdGhhdAotICAgICAgPG1vZHVsZT5tb2RfY2hhcnNldF9saXRlPC9tb2R1bGU+IGRvZXNuJ3QgYWRkIGl0cyBmaWx0ZXIuPC9kZD4KLSAgICA8L2RsPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTwvbW9kdWxlc3lub3BzaXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9kYXYuaHRtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfZGF2Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNDEwOTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9kYXYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFwYWNoZSBtb2R1bGUgbW9kX2RhdjwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPk1vZHVsZSBtb2RfZGF2PC9IMT4KLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgY2xhc3MgMSBhbmQgY2xhc3MgMiAKLTxBIEhSRUY9Imh0dHA6Ly93d3cud2ViZGF2Lm9yZyI+V2ViREFWPC9BPiAoJ1dlYi1iYXNlZAotRGlzdHJpYnV0ZWQgQXV0aG9yaW5nIGFuZCBWZXJzaW9uaW5nJykgZnVuY3Rpb25hbGl0eSBmb3IgQXBhY2hlLiAKLVRoaXMgZXh0ZW5zaW9uIHRvIHRoZSBIVFRQIHByb3RvY29sIGFsbG93cyBjcmVhdGluZywgbW92aW5nLAotY29weWluZywgYW5kIGRlbGV0aW5nIHJlc291cmNlcyBhbmQgY29sbGVjdGlvbnMgb24gYSByZW1vdGUgd2ViCi1zZXJ2ZXIuICAKLQotPEgyPkRpcmVjdGl2ZXM8L0gyPgotPFVMPgotPExJPjxBIEhSRUY9IiNEQVYiPkRhdjwvQT4KLTxMST48QSBIUkVGPSIjREFWTG9ja0RCIj5EYXZMb2NrREI8L0E+Ci08TEk+PEEgSFJFRj0iI0RBVk1pblRpbWVvdXQiPkRhdk1pblRpbWVvdXQ8L0E+Ci08TEk+PEEgSFJFRj0iI0RBVkRlcHRoSW5maW5pdHkiPkRhdkRlcHRoSW5maW5pdHk8L0E+Ci08TEk+PEEgSFJFRj0iI0xpbWl0WE1MUmVxdWVzdEJvZHkiPkxpbWl0WE1MUmVxdWVzdEJvZHk8L0E+Ci08L1VMPgotPEhSPgotPFA+Ci1UbyBlbmFibGUgbW9kX2RhdiwgYWRkIHRoZSBmb2xsb3dpbmcgdG8gYSBjb250YWluZXIgaW4geW91ciA8Q09ERT5odHRwZC5jb25mPC9DT0RFPiBmaWxlOjxQPgotCi08Q09ERT5EYXYgT248L0NPREU+PFA+Ci0KLUFsc28sIHNwZWNpZnkgYSB2YWxpZCBmaWxlbmFtZSBmb3IgdGhlIERBViBsb2NrIGRhdGFiYXNlIGJ5IGFkZGluZyB0aGUgZm9sbG93aW5nIHRvIHRoZSBnbG9iYWwgc2VjdGlvbiBpbiB5b3VyIDxDT0RFPmh0dHBkLmNvbmY8L0NPREU+IGZpbGU6PFA+Ci0KLTxDT0RFPkRhdkxvY2tEQiAvdG1wL0RhdkxvY2smbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L0NPREU+PEVNPihBbnkgd2ViLXNlcnZlciB3cml0ZWFibGUgZmlsZW5hbWUsIHdpdGhvdXQgYW4gZXh0ZW5zaW9uKTwvRU0+PFA+Ci08SFI+Ci0KLTxIMj48QSBOQU1FPSJEQVYiPkRhdjwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBEYXYgJmx0O29uIHwgb2ZmJmd0OzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPgotICAgIDxDT0RFPkRhdiBvZmY8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IGRpcmVjdG9yeTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gZXh0ZW5zaW9uPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfZGF2PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IEFwYWNoZSAxLjMuNCBhbmQgYWJvdmU8UD4KLQotVXNlIHRoZSA8Q09ERT5EYXY8L0NPREU+IGRpcmVjdGl2ZSB0byBlbmFibGUgdGhlIFdlYkRBViBIVFRQIG1ldGhvZHMKLWZvciB0aGUgZ2l2ZW4gY29udGFpbmVyLgotWW91IG1heSB3aXNoIHRvIGFkZCBhCi08QQotIEhSRUY9ImNvcmUuaHRtbCNsaW1pdCIKLT4mbHQ7TGltaXQmZ3Q7PC9BPgotY2xhdXNlIGluc2lkZSB0aGUKLTxBCi0gSFJFRj0iY29yZS5odG1sI2xvY2F0aW9uIgotPmxvY2F0aW9uPC9BPgotZGlyZWN0aXZlIHRvIGxpbWl0IGFjY2VzcyB0byBEQVYtZW5hYmxlZCBsb2NhdGlvbnMuPFA+Ci0KLTxUQUJMRSBXSURUSD0iNzAlIiBCT1JERVI9MCBCR0NPTE9SPSIjRTBFMEYwIiBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTEwPgotPFRSPjxURD4KLTxTVFJPTkc+RXhhbXBsZTwvU1RST05HPjo8QlI+PEJSPiAKLTxDT0RFPkRhdkxvY2tEQiAvdG1wL0RhdkxvY2s8QlI+Ci08QlI+Ci0mbHQ7TG9jYXRpb24gL2ZvbyZndDs8QlI+Ci1EYXYgT248QlI+Ci08QlI+Ci1BdXRoVHlwZSAgICAgQmFzaWM8QlI+Ci1BdXRoTmFtZSAgICAgREFWPEJSPgotQXV0aFVzZXJGaWxlIHVzZXIucGFzc3dkPEJSPgotPEJSPgotJm5ic3A7Jm5ic3A7Jmx0O0xpbWl0RXhjZXB0IEdFVCBIRUFEIE9QVElPTlMmZ3Q7PEJSPgotJm5ic3A7Jm5ic3A7cmVxdWlyZSB1c2VyIGFkbWluPEJSPgotJm5ic3A7Jm5ic3A7Jmx0Oy9MaW1pdEV4Y2VwdCZndDs8QlI+Ci0mbHQ7L0xvY2F0aW9uJmd0OzxCUj4KLTwvQ09ERT4KLTwvVEQ+PC9UUj4KLTwvVEFCTEU+Ci0KLTxCUj4KLTxIUj4KLQotPEgyPjxBIE5BTUU9IkRhdkxvY2tEQiI+RGF2TG9ja0RCPC9BPjwvSDI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IERhdkxvY2tEQiAmbHQ7RnVsbCBwYXRoIHRvIGxvY2sgZGF0YWJhc2UmZ3Q7PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+Ci0gICAgPEVNPk5vbmU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGV4dGVuc2lvbjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2RhdjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBBcGFjaGUgMS4zLjQgYW5kIGFib3ZlPFA+Ci0KLVVzZSB0aGUgPENPREU+RGF2TG9ja0RCPC9DT0RFPiBkaXJlY3RpdmUgdG8gc3BlY2lmeSB0aGUgZnVsbCBwYXRoIHRvIHRoZQotbG9jayBkYXRhYmFzZSwgZXhjbHVkaW5nIGFuIGV4dGVuc2lvbi4gIFRoZSBkZWZhdWx0IChmaWxlIHN5c3RlbSkKLWltcGxlbWVudGF0aW9uIG9mIG1vZF9kYXYgdXNlcyBhIFNEQk0gZGF0YWJhc2UgdG8gdHJhY2sgdXNlciBsb2Nrcy4KLVRoZSB1dGlsaXR5IDxDT0RFPm1vZHVsZXMvZGF2L3V0aWwvbG9ja3ZpZXc8L0NPREU+IGNhbiBiZQotdXNlZCBmcm9tIHRoZSBzZXJ2ZXIgdG8gZGlzcGxheSBhbGwgbG9ja3MgaW4gYSBsb2NrIGRhdGFiYXNlLjxQPgotCi08VEFCTEUgV0lEVEg9IjcwJSIgQk9SREVSPTAgQkdDT0xPUj0iI0UwRTBGMCIgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0xMD4KLTxUUj48VEQ+Ci08U1RST05HPkV4YW1wbGU8L1NUUk9ORz46PEJSPjxCUj4gCi08Q09ERT5EYXZMb2NrREIgL3RtcC9EYXZMb2NrPEJSPgotPEJSPgotPC9DT0RFPgotPC9URD48L1RSPgotPC9UQUJMRT4KLQotPEJSPgotPEhSPgotCi08SDI+PEEgTkFNRT0iRGF2TWluVGltZW91dCI+RGF2TWluVGltZW91dDwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBEYXZNaW5UaW1lb3V0ICZsdDtzZWNvbmRzJmd0OzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPgotICAgIDxDT0RFPkRhdk1pblRpbWVvdXQgMDwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gZGlyZWN0b3J5PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBleHRlbnNpb248QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9kYXY8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gQXBhY2hlIDEuMy40IGFuZCBhYm92ZTxQPgotCi1XaGVuIGEgY2xpZW50IHJlcXVlc3RzIGEgREFWIHJlc291cmNlIGxvY2ssIGl0IGNhbiBhbHNvIHNwZWNpZnkgYSB0aW1lCi13aGVuIHRoZSBsb2NrIHdpbGwgYmUgYXV0b21hdGljYWxseSByZW1vdmVkIGJ5IHRoZSBzZXJ2ZXIuICBUaGlzIHZhbHVlCi1pcyBvbmx5IGEgcmVxdWVzdCwgYW5kIHRoZSBzZXJ2ZXIgY2FuIGlnbm9yZSBpdCBvciBpbmZvcm0gdGhlIGNsaWVudAotb2YgYW4gYXJiaXRyYXJ5IHZhbHVlLjxQPgotCi1Vc2UgdGhlIDxDT0RFPkRhdk1pblRpbWVvdXQ8L0NPREU+IGRpcmVjdGl2ZSB0byBzcGVjaWZ5LCBpbiBzZWNvbmRzLAotdGhlIG1pbmltdW0gbG9jayB0aW1lb3V0IHRvIHJldHVybiB0byBhIGNsaWVudC4gIE1pY3Jvc29mdCBXZWIgRm9sZGVycwotZGVmYXVsdHMgdG8gYSB0aW1lb3V0IG9mIDEyMCBzZWNvbmRzOyB0aGUgPENPREU+RGF2TWluVGltZW91dDwvQ09ERT4KLWNhbiBvdmVycmlkZSB0aGlzIHRvIGEgaGlnaGVyIHZhbHVlIChsaWtlIDYwMCBzZWNvbmRzKSB0byByZWR1Y2UgdGhlIGNoYW5jZQotb2YgdGhlIGNsaWVudCBsb3NpbmcgdGhlIGxvY2sgZHVlIHRvIG5ldHdvcmsgbGF0ZW5jeS48UD4KLQotPFRBQkxFIFdJRFRIPSI3MCUiIEJPUkRFUj0wIEJHQ09MT1I9IiNFMEUwRjAiIENFTExTUEFDSU5HPTAgQ0VMTFBBRERJTkc9MTA+Ci08VFI+PFREPgotPFNUUk9ORz5FeGFtcGxlPC9TVFJPTkc+OjxCUj48QlI+IAotPENPREU+Jmx0O0xvY2F0aW9uIC9NU1dvcmQmZ3Q7PEJSPgotRGF2TWluVGltZW91dCA2MDA8QlI+Ci0mbHQ7L0xvY2F0aW9uJmd0OzxCUj4KLTxCUj4KLTwvQ09ERT4KLTwvVEQ+PC9UUj4KLTwvVEFCTEU+Ci0KLTxCUj4KLTxIUj4KLQotPEgyPjxBIE5BTUU9IkRhdkRlcHRoSW5maW5pdHkiPkRhdkRlcHRoSW5maW5pdHk8L0E+PC9IMj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gRGF2RGVwdGhJbmZpbml0eSAmbHQ7b24gfCBvZmYmZ3Q7PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+Ci0gICAgPENPREU+RGF2RGVwdGhJbmZpbml0eSBvZmY8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IGRpcmVjdG9yeTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gZXh0ZW5zaW9uPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfZGF2PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IEFwYWNoZSAxLjMuNCBhbmQgYWJvdmU8UD4KLQotVXNlIHRoZSA8Q09ERT5EYXZEZXB0aEluZmluaXR5PC9DT0RFPiBkaXJlY3RpdmUgdG8gYWxsb3cgdGhlIHByb2Nlc3NpbmcKLW9mIFBST1BGSU5EIHJlcXVlc3RzIGNvbnRhaW5pbmcgdGhlIGhlYWRlciAnRGVwdGg6IEluZmluaXR5Jy4KLUJlY2F1c2UgdGhpcyB0eXBlIG9mIHJlcXVlc3QgY291bGQgY29uc3RpdHV0ZSBhIGRlbmlhbC1vZi1zZXJ2aWNlIGF0dGFjaywKLWJ5IGRlZmF1bHQgaXQgaXMgbm90IGFsbG93ZWQuCi08UD4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0iTGltaXRYTUxSZXF1ZXN0Qm9keSI+TGltaXRYTUxSZXF1ZXN0Qm9keTwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBMaW1pdFhNTFJlcXVlc3RCb2R5ICAmbHQ7c2l6ZSBpbiBieXRlcyZndDs8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4KLSAgICA8Q09ERT5MaW1pdFhNTFJlcXVlc3RCb2R5IDEwMDAwMDA8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IGRpcmVjdG9yeTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gZXh0ZW5zaW9uPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfZGF2PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IEFwYWNoZSAxLjMuNCBhbmQgYWJvdmU8UD4KLQotVXNlIHRoZSA8Q09ERT5MaW1pdFhNTFJlcXVlc3RCb2R5PC9DT0RFPiBkaXJlY3RpdmUgdG8gbGltaXQgdGhlCi1zaXplIG9mIGFuIFhNTCByZXF1ZXN0IHdoaWNoIG1vZF9kYXYgd2lsbCBhdHRlbXB0IHRvIHBhcnNlLiAgU3BlY2lmeQotYSBzaXplIGdyZWF0ZXIgdGhhbiB6ZXJvLgotPFA+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2Rhdi54bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2Rhdi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YjhmM2YuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9kYXYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIHhtbDptYW51YWwgWyA8IUVOVElUWSBuYnNwICImIzE2MDsiPiBdPgotPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iLi4vc3R5bGUvbWFudWFsLnhzbCI/PgotPG1vZHVsZXN5bm9wc2lzPgotCi08bmFtZT5tb2RfZGF2PC9uYW1lPiAKLTxkZXNjcmlwdGlvbj5EaXN0cmlidXRlZCBBdXRob3JpbmcgYW5kIFZlcnNpb25pbmcKLSg8YSBocmVmPSJodHRwOi8vd3d3LndlYmRhdi5vcmcvIj5XZWJEQVY8L2E+KSBmdW5jdGlvbmFsaXR5LjwvZGVzY3JpcHRpb24+Ci08c3RhdHVzPkV4dGVuc2lvbjwvc3RhdHVzPgotPHNvdXJjZWZpbGU+bW9kX2Rhdi5jPC9zb3VyY2VmaWxlPgotPGlkZW50aWZpZXI+ZGF2X21vZHVsZTwvaWRlbnRpZmllcj4KLQotPHN1bW1hcnk+Ci0gICAgPHA+VGhpcyBtb2R1bGUgcHJvdmlkZXMgY2xhc3MgMSBhbmQgY2xhc3MgMiA8YQotICAgIGhyZWY9Imh0dHA6Ly93d3cud2ViZGF2Lm9yZyI+V2ViREFWPC9hPiAoJ1dlYi1iYXNlZCBEaXN0cmlidXRlZAotICAgIEF1dGhvcmluZyBhbmQgVmVyc2lvbmluZycpIGZ1bmN0aW9uYWxpdHkgZm9yIEFwYWNoZS4gVGhpcwotICAgIGV4dGVuc2lvbiB0byB0aGUgSFRUUCBwcm90b2NvbCBhbGxvd3MgY3JlYXRpbmcsIG1vdmluZywKLSAgICBjb3B5aW5nLCBhbmQgZGVsZXRpbmcgcmVzb3VyY2VzIGFuZCBjb2xsZWN0aW9ucyBvbiBhIHJlbW90ZSB3ZWIKLSAgICBzZXJ2ZXIuPC9wPgotCi0gICAgPHA+VG8gZW5hYmxlIG1vZF9kYXYsIGFkZCB0aGUgZm9sbG93aW5nIHRvIGEgY29udGFpbmVyIGluIHlvdXIKLSAgICA8Y29kZT5odHRwZC5jb25mPC9jb2RlPiBmaWxlOjwvcD4KLQotPGV4YW1wbGU+RGF2IE9uPC9leGFtcGxlPgotCi0gICAgPHA+QWxzbywgc3BlY2lmeSBhIHZhbGlkIGZpbGVuYW1lIGZvciB0aGUgREFWIGxvY2sgZGF0YWJhc2UgYnkKLSAgICBhZGRpbmcgdGhlIGZvbGxvd2luZyB0byB0aGUgZ2xvYmFsIHNlY3Rpb24gaW4geW91cgotICAgIDxjb2RlPmh0dHBkLmNvbmY8L2NvZGU+IGZpbGU6PC9wPgotCi08ZXhhbXBsZT5EYXZMb2NrREIgL3RtcC9EYXZMb2NrJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICA8ZW0+KEFueSB3ZWItc2VydmVyIHdyaXRhYmxlIGZpbGVuYW1lLCB3aXRob3V0IGFuCi0gICAgICBleHRlbnNpb24pPC9lbT4KLTwvZXhhbXBsZT4KLTwvc3VtbWFyeT4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+RGF2PC9uYW1lPgotPGRlc2NyaXB0aW9uPkVuYWJsZSBXZWJEQVYgSFRUUCBtZXRob2RzPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+RGF2IG9ufG9mZjwvc3ludGF4PgotPGRlZmF1bHQ+RGF2IG9mZjwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlVzZSB0aGUgPGRpcmVjdGl2ZT5EYXY8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIHRvIGVuYWJsZSB0aGUKLSAgICBXZWJEQVYgSFRUUCBtZXRob2RzIGZvciB0aGUgZ2l2ZW4gY29udGFpbmVyLiBZb3UgbWF5IHdpc2ggdG8gYWRkIGEKLSAgICA8ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSIgdHlwZT0ic2VjdGlvbiI+TGltaXQ8L2RpcmVjdGl2ZT4gY2xhdXNlCi0gICAgaW5zaWRlIHRoZSA8ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSIKLSAgICB0eXBlPSJzZWN0aW9uIj5sb2NhdGlvbjwvZGlyZWN0aXZlPiBkaXJlY3RpdmUgdG8gbGltaXQgYWNjZXNzIHRvCi0gICAgREFWLWVuYWJsZWQgbG9jYXRpb25zLjwvcD4KLQotPGV4YW1wbGU+PHRpdGxlPkV4YW1wbGU8L3RpdGxlPgotICAgICAgICBEYXZMb2NrREIgL3RtcC9EYXZMb2NrPGJyIC8+Ci0gICAgICAgIDxiciAvPgotICAgICAgICAgJmx0O0xvY2F0aW9uIC9mb28mZ3Q7PGJyIC8+Ci0gICAgICAgICBEYXYgT248YnIgLz4KLSAgICAgICAgPGJyIC8+Ci0gICAgICAgICBBdXRoVHlwZSBCYXNpYzxiciAvPgotICAgICAgICAgQXV0aE5hbWUgREFWPGJyIC8+Ci0gICAgICAgICBBdXRoVXNlckZpbGUgdXNlci5wYXNzd2Q8YnIgLz4KLSAgICAgICAgPGJyIC8+Ci0gICAgICAgICAmbmJzcDsmbmJzcDsmbHQ7TGltaXRFeGNlcHQgR0VUIEhFQUQgT1BUSU9OUyZndDs8YnIgLz4KLSAgICAgICAgICZuYnNwOyZuYnNwO3JlcXVpcmUgdXNlciBhZG1pbjxiciAvPgotICAgICAgICAgJm5ic3A7Jm5ic3A7Jmx0Oy9MaW1pdEV4Y2VwdCZndDs8YnIgLz4KLSAgICAgICAgICZsdDsvTG9jYXRpb24mZ3Q7PGJyIC8+Ci08L2V4YW1wbGU+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPGRlc2NyaXB0aW9uPkxvY2F0aW9uIG9mIHRoZSBEQVYgbG9jayBkYXRhYmFzZTwvZGVzY3JpcHRpb24+Ci08bmFtZT5EYXZMb2NrREI8L25hbWU+Ci08c3ludGF4PkRhdkxvY2tEQiA8ZW0+ZmlsZS1wYXRoPC9lbT48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5Vc2UgdGhlIDxkaXJlY3RpdmU+RGF2TG9ja0RCPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSB0byBzcGVjaWZ5Ci0gICAgdGhlIGZ1bGwgcGF0aCB0byB0aGUgbG9jayBkYXRhYmFzZSwgZXhjbHVkaW5nIGFuIGV4dGVuc2lvbi4gVGhlCi0gICAgZGVmYXVsdCAoZmlsZSBzeXN0ZW0pIGltcGxlbWVudGF0aW9uIG9mIG1vZF9kYXYgdXNlcyBhIFNEQk0KLSAgICBkYXRhYmFzZSB0byB0cmFjayB1c2VyIGxvY2tzLiBUaGUgdXRpbGl0eQotICAgIDxjb2RlPm1vZHVsZXMvZGF2L3V0aWwvbG9ja3ZpZXc8L2NvZGU+IGNhbiBiZSB1c2VkIGZyb20gdGhlIHNlcnZlcgotICAgIHRvIGRpc3BsYXkgYWxsIGxvY2tzIGluIGEgbG9jayBkYXRhYmFzZS48L3A+Ci0KLTxleGFtcGxlPjx0aXRsZT5FeGFtcGxlPC90aXRsZT4KLURhdkxvY2tEQiAvdG1wL0RhdkxvY2sKLTwvZXhhbXBsZT4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5EYXZNaW5UaW1lb3V0PC9uYW1lPgotPGRlc2NyaXB0aW9uPk1pbmltdW0gYW1vdW50IG9mIHRpbWUgdGhlIHNlcnZlciBob2xkcyBhIGxvY2sgb24KLWEgREFWIHJlc291cmNlPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+RGF2TWluVGltZW91dCA8ZW0+c2Vjb25kczwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5EYXZNaW5UaW1lb3V0IDA8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5XaGVuIGEgY2xpZW50IHJlcXVlc3RzIGEgREFWIHJlc291cmNlIGxvY2ssIGl0IGNhbiBhbHNvCi0gICAgc3BlY2lmeSBhIHRpbWUgd2hlbiB0aGUgbG9jayB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBieQotICAgIHRoZSBzZXJ2ZXIuIFRoaXMgdmFsdWUgaXMgb25seSBhIHJlcXVlc3QsIGFuZCB0aGUgc2VydmVyIGNhbgotICAgIGlnbm9yZSBpdCBvciBpbmZvcm0gdGhlIGNsaWVudCBvZiBhbiBhcmJpdHJhcnkgdmFsdWUuPC9wPgotCi0gICAgPHA+VXNlIHRoZSA8ZGlyZWN0aXZlPkRhdk1pblRpbWVvdXQ8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIHRvIHNwZWNpZnksIGluCi0gICAgc2Vjb25kcywgdGhlIG1pbmltdW0gbG9jayB0aW1lb3V0IHRvIHJldHVybiB0byBhIGNsaWVudC4KLSAgICBNaWNyb3NvZnQgV2ViIEZvbGRlcnMgZGVmYXVsdHMgdG8gYSB0aW1lb3V0IG9mIDEyMCBzZWNvbmRzOyB0aGUKLSAgICA8ZGlyZWN0aXZlPkRhdk1pblRpbWVvdXQ8L2RpcmVjdGl2ZT4gY2FuIG92ZXJyaWRlIHRoaXMgdG8gYSBoaWdoZXIgdmFsdWUKLSAgICAobGlrZSA2MDAgc2Vjb25kcykgdG8gcmVkdWNlIHRoZSBjaGFuY2Ugb2YgdGhlIGNsaWVudCBsb3NpbmcKLSAgICB0aGUgbG9jayBkdWUgdG8gbmV0d29yayBsYXRlbmN5LjwvcD4KLQotPGV4YW1wbGU+PHRpdGxlPkV4YW1wbGU8L3RpdGxlPgotICAgICAgICAgJmx0O0xvY2F0aW9uIC9NU1dvcmQmZ3Q7PGJyIC8+Ci0gICAgICAgICBEYXZNaW5UaW1lb3V0IDYwMDxiciAvPgotICAgICAgICAgJmx0Oy9Mb2NhdGlvbiZndDs8YnIgLz4KLTwvZXhhbXBsZT4KLTwvdXNhZ2U+ICAgICAKLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkRhdkRlcHRoSW5maW5pdHk8L25hbWU+Ci08ZGVzY3JpcHRpb24+QWxsb3cgUFJPUEZJTkQsIERlcHRoOiBJbmZpbml0eSByZXF1ZXN0czwvZGVzY3JpcHRpb24+Ci08c3ludGF4PkRhdkRlcHRoSW5maW5pdHkgb258b2ZmPC9zeW50YXg+Ci08ZGVmYXVsdD5EYXZEZXB0aEluZmluaXR5IG9mZjwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlVzZSB0aGUgPGRpcmVjdGl2ZT5EYXZEZXB0aEluZmluaXR5PC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSB0bwotICAgIGFsbG93IHRoZSBwcm9jZXNzaW5nIG9mIFBST1BGSU5EIHJlcXVlc3RzIGNvbnRhaW5pbmcgdGhlIGhlYWRlcgotICAgICdEZXB0aDogSW5maW5pdHknLiBCZWNhdXNlIHRoaXMgdHlwZSBvZiByZXF1ZXN0IGNvdWxkIGNvbnN0aXR1dGUgYQotICAgIGRlbmlhbC1vZi1zZXJ2aWNlIGF0dGFjaywgYnkgZGVmYXVsdCBpdCBpcyBub3QgYWxsb3dlZC48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPC9tb2R1bGVzeW5vcHNpcz4KLQotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2RlZmxhdGUuaHRtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfZGVmbGF0ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OGMxOTBmLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfZGVmbGF0ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci0gIDxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iSFRNTCBUaWR5LCBzZWUgd3d3LnczLm9yZyIgLz4KLQotICAgIDx0aXRsZT5BcGFjaGUgbW9kdWxlIG1vZF9kZWZsYXRlPC90aXRsZT4KLSAgPC9oZWFkPgotICA8IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci0KLSAgPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdGV4dD0iIzAwMDAwMCIgbGluaz0iIzAwMDBGRiIKLSAgdmxpbms9IiMwMDAwODAiIGFsaW5rPSIjRkYwMDAwIj4KLSAgICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotCi0gICAgPGgxIGFsaWduPSJDRU5URVIiPk1vZHVsZSBtb2RfZGVmbGF0ZTwvaDE+Ci0KLSAgICA8cD5UaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBzZXQgZW52aXJvbm1lbnQKLSAgICB2YXJpYWJsZXMgYmFzZWQgdXBvbiBhdHRyaWJ1dGVzIG9mIHRoZSByZXF1ZXN0LjwvcD4KLQotICAgIDxwPjxhIGhyZWY9Im1vZHVsZS1kaWN0Lmh0bWwjU3RhdHVzIgotICAgIHJlbD0iSGVscCI+PHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+PC9hPiBFeHBlcmltZW50YWw8YnIgLz4KLSAgICAgPGEgaHJlZj0ibW9kdWxlLWRpY3QuaHRtbCNTb3VyY2VGaWxlIgotICAgIHJlbD0iSGVscCI+PHN0cm9uZz5Tb3VyY2UgRmlsZTo8L3N0cm9uZz48L2E+Ci0gICAgbW9kX2RlZmxhdGUuYzxiciAvPgotICAgICA8YSBocmVmPSJtb2R1bGUtZGljdC5odG1sI01vZHVsZUlkZW50aWZpZXIiCi0gICAgcmVsPSJIZWxwIj48c3Ryb25nPk1vZHVsZSBJZGVudGlmaWVyOjwvc3Ryb25nPjwvYT4KLSAgICBkZWZsYXRlX21vZHVsZTxiciAvPgotICAgICA8YSBocmVmPSJtb2R1bGUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gICAgcmVsPSJIZWxwIj48c3Ryb25nPkNvbXBhdGliaWxpdHk6PC9zdHJvbmc+PC9hPiBBdmFpbGFibGUgaW4KLSAgICBBcGFjaGUgMi4wIGFuZCBsYXRlci48L3A+Ci0KLSAgICA8aDI+U3VtbWFyeTwvaDI+Ci0KLSAgICA8cD5UaGUgZXhwZXJpbWVudGFsIDxzYW1wPm1vZF9kZWZsYXRlPC9zYW1wPiBtb2R1bGUgYWxsb3dzIAotICAgIG91dHB1dCBmcm9tIHlvdXIgc2VydmVyIHRvIGJlIGNvbXByZXNzZWQgYmVmb3JlIGJlaW5nIHNlbnQKLSAgICB0byB0aGUgY2xpZW50IG92ZXIgdGhlIG5ldHdvcmsuPC9wPgotCi0gICAgPGgyPkRpcmVjdGl2ZXM8L2gyPgotCi0gICAgPHVsPgotICAgICAgPGxpPjxhIGhyZWY9IiNEZWZsYXRlRmlsdGVyTm90ZSI+RGVmbGF0ZUZpbHRlck5vdGU8L2E+PC9saT4KLQotICAgICAgPGxpPjxhIGhyZWY9IiNEZWZsYXRlV2luZG93U2l6ZSI+RGVmbGF0ZVdpbmRvd1NpemU8L2E+PC9saT4KLQotICAgICAgPGxpPjxhIGhyZWY9IiNEZWZsYXRlTWVtTGV2ZWwiPkRlZmxhdGVNZW1MZXZlbDwvYT48L2xpPgotICAgIDwvdWw+Ci0gICAgPGhyIC8+Ci0gICAgPCEtLSB0aGUgSFIgaXMgcGFydCBvZiB0aGUgZGlyZWN0aXZlIGRlc2NyaXB0aW9uIC0tPgotCi0gICAgPGgyPjxhIGlkPSJEZWZsYXRlRmlsdGVyTm90ZSIgbmFtZT0iRGVmbGF0ZUZpbHRlck5vdGUiPkRlZmxhdGVGaWx0ZXJOb3RlCi0gICAgZGlyZWN0aXZlPC9hPjwvaDI+Ci0KLSAgICA8cD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSAgICByZWw9IkhlbHAiPjxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPjwvYT4gRGVmbGF0ZUZpbHRlck5vdGUgPGVtPm5vdGVuYW1lCi0gICAgPC9lbT48YnIgLz4KLSAgICAgPGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotICAgIHJlbD0iSGVscCI+PHN0cm9uZz5EZWZhdWx0Ojwvc3Ryb25nPjwvYT4gPGk+bm9uZTwvaT48YnIgLz4KLSAgICAgPGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotICAgIHJlbD0iSGVscCI+PHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPjwvYT4gc2VydmVyIGNvbmZpZzxiciAvPgotICAgICA8YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotICAgIHJlbD0iSGVscCI+PHN0cm9uZz5PdmVycmlkZTo8L3N0cm9uZz48L2E+IG5vbmU8YnIgLz4KLSAgICAgPGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gICAgcmVsPSJIZWxwIj48c3Ryb25nPlN0YXR1czo8L3N0cm9uZz48L2E+IEV4cGVyaW1lbnRhbDxiciAvPgotICAgICA8YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSAgICByZWw9IkhlbHAiPjxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPjwvYT4gbW9kX2RlZmxhdGU8YnIgLz4KLSAgICAgPGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotICAgIHJlbD0iSGVscCI+PHN0cm9uZz5Db21wYXRpYmlsaXR5Ojwvc3Ryb25nPjwvYT4gQXBhY2hlIDIuMCBhbmQKLSAgICBhYm92ZTwvcD4KLQotICAgIDxwPlRoZSBEZWZsYXRlRmlsdGVyTm90ZSBkaXJlY3RpdmUgc3BlY2lmaWVzIHRoYXQgYSBub3RlIGFib3V0Ci0gICAgY29tcHJlc3Npb24gcmF0aW9zIHNob3VsZCBiZSBhdHRhY2hlZCB0byB0aGUgcmVxdWVzdC4gIFRoZSBuYW1lCi0gICAgb2YgdGhlIG5vdGUgaXMgdGhlIHZhbHVlIHNwZWNpZmllZCBmb3IgdGhlIGRpcmVjdGl2ZS48L3A+Ci0KLSAgICA8aHIgLz4KLSAgICA8IS0tIHRoZSBIUiBpcyBwYXJ0IG9mIHRoZSBkaXJlY3RpdmUgZGVzY3JpcHRpb24gLS0+Ci0KLSAgICA8aDI+PGEgaWQ9IkRlZmxhdGVXaW5kb3dTaXplIgotICAgIG5hbWU9IkRlZmxhdGVXaW5kb3dTaXplIj5EZWZsYXRlV2luZG93U2l6ZSBkaXJlY3RpdmU8L2E+PC9oMj4KLQotICAgIDxwPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotICAgIHJlbD0iSGVscCI+PHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+PC9hPiBEZWZsYXRlV2luZG93U2l6ZQotICAgIDxlbT52YWx1ZTwvZW0+PGJyIC8+Ci0gICAgIDxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSAgICByZWw9IkhlbHAiPjxzdHJvbmc+RGVmYXVsdDo8L3N0cm9uZz48L2E+IDxlbT5ub25lPC9lbT48YnIgLz4KLSAgICAgPGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotICAgIHJlbD0iSGVscCI+PHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPjwvYT4gc2VydmVyIGNvbmZpZzxiciAvPgotICAgICA8YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotICAgIHJlbD0iSGVscCI+PHN0cm9uZz5PdmVycmlkZTo8L3N0cm9uZz48L2E+IG5vbmU8YnIgLz4KLSAgICAgPGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gICAgcmVsPSJIZWxwIj48c3Ryb25nPlN0YXR1czo8L3N0cm9uZz48L2E+IEV4cGVyaW1lbnRhbDxiciAvPgotICAgICA8YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSAgICByZWw9IkhlbHAiPjxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPjwvYT4gbW9kX2RlZmxhdGU8YnIgLz4KLSAgICAgPGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotICAgIHJlbD0iSGVscCI+PHN0cm9uZz5Db21wYXRpYmlsaXR5Ojwvc3Ryb25nPjwvYT4gQXBhY2hlIDIuMCBhbmQKLSAgICBhYm92ZTwvcD4KLQotICAgIDxwPlRoZSA8c2FtcD5EZWZsYXRlV2luZG93U2l6ZTwvc2FtcD4gZGlyZWN0aXZlIHNwZWNpZmllcyB0aGUKLSAgICB6bGliIGNvbXByZXNzaW9uIHdpbmRvdyBzaXplLjwvcD4KLQotICAgIDxociAvPgotICAgIDwhLS0gdGhlIEhSIGlzIHBhcnQgb2YgdGhlIGRpcmVjdGl2ZSBkZXNjcmlwdGlvbiAtLT4KLQotICAgIDxoMj48YSBpZD0iRGVmbGF0ZU1lbUxldmVsIiBuYW1lPSJEZWZsYXRlTWVtTGV2ZWwiPkRlZmxhdGVNZW1MZXZlbAotICAgIGRpcmVjdGl2ZTwvYT48L2gyPgotCi0gICAgPHA+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gICAgcmVsPSJIZWxwIj48c3Ryb25nPlN5bnRheDo8L3N0cm9uZz48L2E+IERlZmxhdGVNZW1MZXZlbAotICAgIDxlbT52YWx1ZTwvZW0+PGJyIC8+Ci0gICAgIDxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSAgICByZWw9IkhlbHAiPjxzdHJvbmc+RGVmYXVsdDo8L3N0cm9uZz48L2E+IDxlbT5ub25lPC9lbT48YnIgLz4KLSAgICAgPGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotICAgIHJlbD0iSGVscCI+PHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPjwvYT4gc2VydmVyIGNvbmZpZzxiciAvPgotICAgICA8YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotICAgIHJlbD0iSGVscCI+PHN0cm9uZz5PdmVycmlkZTo8L3N0cm9uZz48L2E+IG5vbmU8YnIgLz4KLSAgICAgPGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gICAgcmVsPSJIZWxwIj48c3Ryb25nPlN0YXR1czo8L3N0cm9uZz48L2E+IEV4cGVyaW1lbnRhbDxiciAvPgotICAgICA8YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSAgICByZWw9IkhlbHAiPjxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPjwvYT4gbW9kX2RlZmxhdGU8YnIgLz4KLSAgICAgPGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotICAgIHJlbD0iSGVscCI+PHN0cm9uZz5Db21wYXRpYmlsaXR5Ojwvc3Ryb25nPjwvYT4gQXBhY2hlIDIuMCBhbmQKLSAgICBhYm92ZTwvcD4KLQotICAgIDxwPlRoZSBEZWZsYXRlTWVtTGV2ZWwgZGlyZWN0aXZlIHNwZWNpZmllcyB0aGUgYW1vdW50IG9mCi0gICAgbWVtb3J5IGF2YWlsYWJsZSB0byB6bGliIGZvciBjb21wcmVzc2lvbi48L3A+Ci0gICAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLSAgPC9ib2R5PgotPC9odG1sPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2RlZmxhdGUueG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9kZWZsYXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRiNWVmZC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX2RlZmxhdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgeG1sOm1hbnVhbCBbIDwhRU5USVRZIG5ic3AgIiYjMTYwOyI+IF0+Ci08P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveHNsIiBocmVmPSIuLi9zdHlsZS9tYW51YWwueHNsIj8+Ci08bW9kdWxlc3lub3BzaXM+Ci0KLTxuYW1lPm1vZF9kZWZsYXRlPC9uYW1lPgotPGRlc2NyaXB0aW9uPkNvbXByZXNzIGNvbnRlbnQgYmVmb3JlCi0gICAgaXQgaXMgZGVsaXZlcmVkIHRvIHRoZSBjbGllbnQ8L2Rlc2NyaXB0aW9uPgotPHN0YXR1cz5leHBlcmltZW50YWw8L3N0YXR1cz4KLTxzb3VyY2VmaWxlPm1vZF9kZWZsYXRlLmM8L3NvdXJjZWZpbGU+Ci08aWRlbnRpZmllcj5kZWZsYXRlX21vZHVsZTwvaWRlbnRpZmllcj4KLQotPHN1bW1hcnk+Ci0gICAgPHA+VGhlIGV4cGVyaW1lbnRhbCA8bW9kdWxlPm1vZF9kZWZsYXRlPC9tb2R1bGU+IG1vZHVsZSBwcm92aWRlcwotICAgIHRoZSA8Y29kZT5ERUZMQVRFPC9jb2RlPiBvdXRwdXQgZmlsdGVyIHRoYXQgYWxsb3dzIG91dHB1dCBmcm9tCi0gICAgeW91ciBzZXJ2ZXIgdG8gYmUgY29tcHJlc3NlZCBiZWZvcmUgYmVpbmcgc2VudCB0byB0aGUgY2xpZW50IG92ZXIKLSAgICB0aGUgbmV0d29yay48L3A+Ci08L3N1bW1hcnk+Ci08c2VlYWxzbz48ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX21pbWUiPkFkZE91dHB1dEZpbHRlcjwvZGlyZWN0aXZlPjwvc2VlYWxzbz4KLTxzZWVhbHNvPjxkaXJlY3RpdmUgbW9kdWxlPSJjb3JlIj5TZXRPdXRwdXRGaWx0ZXI8L2RpcmVjdGl2ZT48L3NlZWFsc28+Ci0KLTxzZWN0aW9uPjx0aXRsZT5FbmFibGluZyBDb21wcmVzc2lvbjwvdGl0bGU+Ci0KLSAgICA8cD5Db21wcmVzc2lvbiBpcyBpbXBsZW1lbnRlZCBieSB0aGUgPGNvZGU+REVGTEFURTwvY29kZT4KLSAgICA8YSBocmVmPSIuLi9maWx0ZXIuaHRtbCI+ZmlsdGVyPC9hPi4gIFRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlCi0gICAgd2lsbCBlbmFibGUgY29tcHJlc3Npb24gZm9yIGRvY3VtZW50cyBpbiB0aGUgY29udGFpbmVyIHdoZXJlIGl0Ci0gICAgaXMgcGxhY2VkOjwvcD4KLSAgICA8cD48c3Ryb25nPk1vc3QgcG9wdWxhciBicm93c2VycyBjYW4gbm90IGhhbmRsZSBjb21wcmVzc2lvbiBvZiBhbGwgY29udGVudAotICAgICAgICBzbyB5b3UgbWF5IHdhbnQgdG8gZW5hYmxlIHRoZSAnZ3ppcC1vbmx5LXRleHQvaHRtbCcgbm90ZSAoc2VlIGJlbG93KQotICAgIDwvc3Ryb25nPjwvcD4KLQotPGV4YW1wbGU+U2V0RW52IGd6aXAtb25seS10ZXh0L2h0bWwgMTxiciAvPgotU2V0T3V0cHV0RmlsdGVyIERFRkxBVEUKLTwvZXhhbXBsZT4KLQotICAgIDxwPkhlcmUgaXMgYW4gZXhhbXBsZSBvZiBlbmFibGluZyBjb21wcmVzc2lvbiBmb3IgdGhlIEFwYWNoZQotICAgIGRvY3VtZW50YXRpb246PC9wPgotCi08ZXhhbXBsZT4KLSZsdDtEaXJlY3RvcnkgIi95b3VyLXNlcnZlci1yb290L21hbnVhbCImZ3Q7PGJyIC8+Ci0gICAgICBTZXRFbnYgZ3ppcC1vbmx5LXRleHQvaHRtbCAxPGJyIC8+Ci0gICAgICBTZXRPdXRwdXRGaWx0ZXIgREVGTEFURTxiciAvPgotJmx0Oy9EaXJlY3RvcnkmZ3Q7Ci08L2V4YW1wbGU+Ci08L3NlY3Rpb24+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkRlZmxhdGVGaWx0ZXJOb3RlPC9uYW1lPgotPGRlc2NyaXB0aW9uPlBsYWNlcyB0aGUgY29tcHJlc3Npb24gcmF0aW8gaW4gYSBub3RlIGZvciBsb2dnaW5nPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+RGVmbGF0ZUZpbHRlck5vdGUgPGVtPm5vdGVuYW1lPC9lbT48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5EZWZsYXRlRmlsdGVyTm90ZTwvZGlyZWN0aXZlPiBkaXJlY3RpdmUKLSAgICBzcGVjaWZpZXMgdGhhdCBhIG5vdGUgYWJvdXQgY29tcHJlc3Npb24gcmF0aW9zIHNob3VsZCBiZSBhdHRhY2hlZAotICAgIHRvIHRoZSByZXF1ZXN0LiAgVGhlIG5hbWUgb2YgdGhlIG5vdGUgaXMgdGhlIHZhbHVlIHNwZWNpZmllZCBmb3IKLSAgICB0aGUgZGlyZWN0aXZlLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5EZWZsYXRlV2luZG93U2l6ZTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5abGliIGNvbXByZXNzaW9uIHdpbmRvdyBzaXplPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+RGVmbGF0ZVdpbmRvd1NpemUgPGVtPnZhbHVlPC9lbT48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8IS0tIFhYWDogVW1tbS4uLiBXaGF0IHVuaXQ/Pz8gLS0+Ci0gICAgPHA+VGhlIDxkaXJlY3RpdmU+RGVmbGF0ZVdpbmRvd1NpemU8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIHNwZWNpZmllcyB0aGUKLSAgICB6bGliIGNvbXByZXNzaW9uIHdpbmRvdyBzaXplLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5EZWZsYXRlTWVtTGV2ZWw8L25hbWU+Ci08ZGVzY3JpcHRpb24+QW1vdW50IG9mIG1lbW9yeSBhdmFpbGFibGUgdG8gemxpYiBmb3IgY29tcHJlc3Npb248L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5EZWZsYXRlTWVtTGV2ZWwgPGVtPnZhbHVlPC9lbT48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8IS0tIFhYWDogVW1tbS4uLiBXaGF0IHVuaXQ/Pz8gLS0+Ci0gICAgPHA+VGhlIDxkaXJlY3RpdmU+RGVmbGF0ZU1lbUxldmVsPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBzcGVjaWZpZXMKLSAgICB0aGUgYW1vdW50IG9mIG1lbW9yeSBhdmFpbGFibGUgdG8gemxpYiBmb3IgY29tcHJlc3Npb24uPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTwvbW9kdWxlc3lub3BzaXM+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfZGlyLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2Rpci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjBjODljYS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX2Rpci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzA5ICswLDAgQEAKLTwhLS0laHlwZXJ0ZXh0IC0tPgotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCAyLjAvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIG1vZHVsZSBtb2RfZGlyPC9USVRMRT4KLTwvSEVBRD4KLQotPEJPRFk+Ci08SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9zdWIuZ2lmIiBBTFQ9IiI+Ci08IS0tLyVoeXBlcnRleHQgLS0+Ci08SDE+TW9kdWxlIG1vZF9kaXI8L2gxPgotCi1UaGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4gdGhlIDxjb2RlPm1vZF9kaXIuYzwvY29kZT4gZmlsZSwgYW5kCi1pcyBjb21waWxlZCBpbiBieSBkZWZhdWx0LiBJdCBwcm92aWRlcyBmb3IgZGlyZWN0b3J5IGluZGV4aW5nLgotCi08aDI+U3VtbWFyeTwvaDI+Ci1UaGlzIG1vZHVsZSBjb250cm9scyB0aGUgZGlyZWN0b3J5IGluZGV4aW5nLiBUaGUgaW5kZXggb2YgYSBkaXJlY3RvcnkKLWNhbiBjb21lIGZyb20gb25lIG9mIHR3byBzb3VyY2VzOgotPHVsPgotPGxpPkEgZmlsZSB3cml0dGVuIGJ5IHRoZSB1c2VyLCB0eXBpY2FsbHkgY2FsbGVkIDxjb2RlPmluZGV4Lmh0bWw8L2NvZGU+LgotVGhlIDxBIEhSRUY9IiNkaXJlY3RvcnlpbmRleCI+RGlyZWN0b3J5SW5kZXg8L0E+IGRpcmVjdGl2ZSBzZXRzIHRoZSBuYW1lCi1vZiB0aGlzIGZpbGUuCi08bGk+T3RoZXJ3aXNlLCBhIGxpc3RpbmcgZ2VuZXJhdGVkIGJ5IHRoZSBzZXJ2ZXIuIFRoZSBvdGhlciBkaXJlY3RpdmVzCi1jb250cm9sIHRoZSBmb3JtYXQgb2YgdGhpcyBsaXN0aW5nLiBUaGUgPEEgSFJFRj0iI2FkZGljb24iPkFkZEljb248L0E+LAotPEEgSFJFRj0iI2FkZGljb25ieWVuY29kaW5nIj5BZGRJY29uQnlFbmNvZGluZzwvQT4gYW5kCi08QSBIUkVGPSIjYWRkaWNvbmJ5dHlwZSI+QWRkSWNvbkJ5VHlwZTwvQT4gYXJlIHVzZWQgdG8gc2V0IGEgbGlzdCBvZgotaWNvbnMgdG8gZGlzcGxheSBmb3IgdmFyaW91cyBmaWxlIHR5cGVzOyBmb3IgZWFjaCBmaWxlIGxpc3RlZCwgdGhlCi1maXJzdCBpY29uIGxpc3RlZCB0aGF0IG1hdGNoZXMgdGhlIGZpbGUgaXMgZGlzcGxheWVkLgotPC91bD4KLQotPCEtLSVoeXBlcnRleHQgLS0+Ci08aDI+RGlyZWN0aXZlczwvaDI+Ci0KLTxtZW51PgotPGxpPjxBIEhSRUY9IiNhZGRkZXNjcmlwdGlvbiI+QWRkRGVzY3JpcHRpb248L0E+Ci08bGk+PEEgSFJFRj0iI2FkZGljb24iPkFkZEljb248L0E+Ci08bGk+PEEgSFJFRj0iI2FkZGljb25ieWVuY29kaW5nIj5BZGRJY29uQnlFbmNvZGluZzwvQT4KLTxsaT48QSBIUkVGPSIjYWRkaWNvbmJ5dHlwZSI+QWRkSWNvbkJ5VHlwZTwvQT4KLTxsaT48QSBIUkVGPSIjZGVmYXVsdGljb24iPkRlZmF1bHRJY29uPC9BPgotPGxpPjxBIEhSRUY9IiNkaXJlY3RvcnlpbmRleCI+RGlyZWN0b3J5SW5kZXg8L0E+Ci08bGk+PEEgSFJFRj0iI2ZhbmN5aW5kZXhpbmciPkZhbmN5SW5kZXhpbmc8L0E+Ci08bGk+PEEgSFJFRj0iI2hlYWRlcm5hbWUiPkhlYWRlck5hbWU8L0E+Ci08bGk+PEEgSFJFRj0iI2luZGV4aWdub3JlIj5JbmRleElnbm9yZTwvQT4KLTxsaT48QSBIUkVGPSIjaW5kZXhvcHRpb25zIj5JbmRleE9wdGlvbnM8L0E+Ci08bGk+PEEgSFJFRj0iI3JlYWRtZW5hbWUiPlJlYWRtZU5hbWU8L0E+Ci08L21lbnU+Ci08aHI+Ci08IS0tLyVoeXBlcnRleHQgLS0+Ci0KLTxBIG5hbWU9ImFkZGRlc2NyaXB0aW9uIj48aDI+QWRkRGVzY3JpcHRpb248L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBBZGREZXNjcmlwdGlvbn0gZGlyZWN0aXZlJmd0OyAtLT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBBZGREZXNjcmlwdGlvbiA8ZW0+c3RyaW5nIGZpbGUgZmlsZS4uLjwvZW0+PGJyPgotPFN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPGJyPgotPFN0cm9uZz5PdmVycmlkZTo8L3N0cm9uZz4gSW5kZXhlczxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBCYXNlPGJyPgotPHN0cm9uZz5Nb2R1bGU6PC9zdHJvbmc+IG1vZF9kaXI8cD4KLQotVGhpcyBzZXRzIHRoZSBkZXNjcmlwdGlvbiB0byBkaXNwbGF5IGZvciBhIGZpbGUsIGZvcgotPEEgSFJFRj0iI2ZhbmN5aW5kZXhpbmciPkZhbmN5SW5kZXhpbmc8L0E+LiA8ZW0+RmlsZTwvZW0+IGlzIGEgZmlsZQotZXh0ZW5zaW9uLCBwYXJ0aWFsIGZpbGVuYW1lLCB3aWxkY2FyZCBleHByZXNzaW9uIG9yIGZ1bGwgZmlsZW5hbWUgZm9yIGZpbGVzCi10byBkZXNjcmliZS4gPGVtPlN0cmluZzwvZW0+IGlzIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMKLSg8Y29kZT4mcXVvdDs8L2NvZGU+KS4gRXhhbXBsZToKLTxibG9ja3F1b3RlPjxjb2RlPkFkZERlc2NyaXB0aW9uICJUaGUgcGxhbmV0IE1hcnMiIC93ZWIvcGljcy9tYXJzLmdpZgotPC9jb2RlPjwvYmxvY2txdW90ZT48cD48aHI+Ci0KLTxBIG5hbWU9ImFkZGljb24iPjxoMj5BZGRJY29uPC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgQWRkSWNvbn0gZGlyZWN0aXZlJmd0OyAtLT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBBZGRJY29uIDxlbT5pY29uIG5hbWUgbmFtZSAuLi48L2VtPjxicj4KLTxTdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2Vzczxicj4KLTxTdHJvbmc+T3ZlcnJpZGU6PC9zdHJvbmc+IEluZGV4ZXM8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gQmFzZTxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfZGlyPHA+Ci0KLVRoaXMgc2V0cyB0aGUgaWNvbiB0byBkaXNwbGF5IG5leHQgdG8gYSBmaWxlIGVuZGluZyBpbiA8ZW0+bmFtZTwvZW0+IGZvcgotPEEgSFJFRj0iI2ZhbmN5aW5kZXhpbmciPkZhbmN5SW5kZXhpbmc8L0E+LiA8ZW0+SWNvbjwvZW0+IGlzIGVpdGhlciBhCi0oJS1lc2NhcGVkKSByZWxhdGl2ZSBVUkwgdG8gdGhlIGljb24sIG9yIG9mIHRoZSBmb3JtYXQKLSg8ZW0+YWx0dGV4dDwvZW0+LDxlbT51cmw8L2VtPikgd2hlcmUgPGVtPmFsdHRleHQ8L2VtPiBpcyB0aGUgdGV4dCB0YWcgZ2l2ZW4KLWZvciBhbiBpY29uIGZvciBub24tZ3JhcGhpY2FsIGJyb3dzZXJzLjxwPgotCi08ZW0+TmFtZTwvZW0+IGlzIGVpdGhlciBeXkRJUkVDVE9SWV5eIGZvciBkaXJlY3RvcmllcywgXl5CTEFOS0lDT05eXiBmb3IKLWJsYW5rIGxpbmVzICh0byBmb3JtYXQgdGhlIGxpc3QgY29ycmVjdGx5KSwgYSBmaWxlIGV4dGVuc2lvbiwgYSB3aWxkY2FyZAotZXhwcmVzc2lvbiwgYSBwYXJ0aWFsIGZpbGVuYW1lIG9yIGEgY29tcGxldGUgZmlsZW5hbWUuIEV4YW1wbGVzOgotPGJsb2NrcXVvdGU+PGNvZGU+Ci1BZGRJY29uIChJTUcsL2ljb25zL2ltYWdlLnhibSkgLmdpZiAuanBnIC54Ym0gPGJyPgotQWRkSWNvbiAvaWNvbnMvZGlyLnhibSBeXkRJUkVDVE9SWV5eIDxicj4KLUFkZEljb24gL2ljb25zL2JhY2t1cC54Ym0gKn4KLTwvY29kZT48L2Jsb2NrcXVvdGU+Ci08QSBIUkVGPSIjYWRkaWNvbmJ5dHlwZSI+QWRkSWNvbkJ5VHlwZTwvQT4gc2hvdWxkIGJlIHVzZWQgaW4gcHJlZmVyZW5jZSB0bwotQWRkSWNvbiwgd2hlbiBwb3NzaWJsZS48cD48aHI+Ci0KLTxBIG5hbWU9ImFkZGljb25ieWVuY29kaW5nIj48aDI+QWRkSWNvbkJ5RW5jb2Rpbmc8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBBZGRJY29uQnlFbmNvZGluZ30gZGlyZWN0aXZlJmd0OyAtLT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBBZGRJY29uQnlFbmNvZGluZyA8ZW0+aWNvbiBtaW1lLWVuY29kaW5nIG1pbWUtZW5jb2RpbmcKLS4uLjwvZW0+PGJyPgotPFN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPGJyPgotPFN0cm9uZz5PdmVycmlkZTo8L3N0cm9uZz4gSW5kZXhlczxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBCYXNlPGJyPgotPHN0cm9uZz5Nb2R1bGU6PC9zdHJvbmc+IG1vZF9kaXI8cD4KLQotVGhpcyBzZXRzIHRoZSBpY29uIHRvIGRpc3BsYXkgbmV4dCB0byBmaWxlcyB3aXRoCi08ZW0+bWltZS1lbmNvZGluZzwvZW0+IGZvciA8QSBIUkVGPSIjZmFuY3lpbmRleGluZyI+RmFuY3lJbmRleGluZzwvQT4uCi08ZW0+SWNvbjwvZW0+IGlzIGVpdGhlciBhICglLWVzY2FwZWQpIHJlbGF0aXZlIFVSTCB0byB0aGUgaWNvbiwgb3Igb2YgdGhlCi1mb3JtYXQgKDxlbT5hbHR0ZXh0PC9lbT4sPGVtPnVybDwvZW0+KSB3aGVyZSA8ZW0+YWx0dGV4dDwvZW0+IGlzIHRoZSB0ZXh0IHRhZwotZ2l2ZW4gZm9yIGFuIGljb24gZm9yIG5vbi1ncmFwaGljYWwgYnJvd3NlcnMuPHA+Ci0KLTxlbT5NaW1lLWVuY29kaW5nPC9lbT4gaXMgYSB3aWxkY2FyZCBleHByZXNzaW9uIG1hdGNoaW5nIHJlcXVpcmVkIHRoZSAKLWNvbnRlbnQtZW5jb2RpbmcuIEV4YW1wbGVzOgotPGJsb2NrcXVvdGU+PGNvZGU+Ci1BZGRJY29uQnlFbmNvZGluZyAvaWNvbnMvY29tcHJlc3MueGJtIHgtY29tcHJlc3MKLTwvY29kZT48L2Jsb2NrcXVvdGU+PHA+PGhyPgotCi08QSBuYW1lPSJhZGRpY29uYnl0eXBlIj48aDI+QWRkSWNvbkJ5VHlwZTwvaDI+PC9BPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEFkZEljb25CeVR5cGV9IGRpcmVjdGl2ZSZndDsgLS0+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gQWRkSWNvbkJ5VHlwZSA8ZW0+aWNvbiBtaW1lLXR5cGUgbWltZS10eXBlIC4uLjwvZW0+PGJyPgotPFN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPGJyPgotPFN0cm9uZz5PdmVycmlkZTo8L3N0cm9uZz4gSW5kZXhlczxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBCYXNlPGJyPgotPHN0cm9uZz5Nb2R1bGU6PC9zdHJvbmc+IG1vZF9kaXI8cD4KLQotVGhpcyBzZXRzIHRoZSBpY29uIHRvIGRpc3BsYXkgbmV4dCB0byBmaWxlcyBvZiB0eXBlIDxlbT5taW1lLXR5cGU8L2VtPiBmb3IKLTxBIEhSRUY9IiNmYW5jeWluZGV4aW5nIj5GYW5jeUluZGV4aW5nPC9BPi4gPGVtPkljb248L2VtPiBpcyBlaXRoZXIgYQotKCUtZXNjYXBlZCkgcmVsYXRpdmUgVVJMIHRvIHRoZSBpY29uLCBvciBvZiB0aGUgZm9ybWF0Ci0oPGVtPmFsdHRleHQ8L2VtPiw8ZW0+dXJsPC9lbT4pIHdoZXJlIDxlbT5hbHR0ZXh0PC9lbT4gaXMgdGhlIHRleHQgdGFnIGdpdmVuCi1mb3IgYW4gaWNvbiBmb3Igbm9uLWdyYXBoaWNhbCBicm93c2Vycy48cD4KLTxlbT5NaW1lLXR5cGU8L2VtPiBpcyBhIHdpbGRjYXJkIGV4cHJlc3Npb24gbWF0Y2hpbmcgcmVxdWlyZWQgdGhlIG1pbWUgdHlwZXMuCi1FeGFtcGxlczoKLTxibG9ja3F1b3RlPjxjb2RlPgotQWRkSWNvbkJ5VHlwZSAoSU1HLC9pY29ucy9pbWFnZS54Ym0pIGltYWdlLyoKLTwvY29kZT48L2Jsb2NrcXVvdGU+PHA+PGhyPgotCi08QSBuYW1lPSJkZWZhdWx0aWNvbiI+PGgyPkRlZmF1bHRJY29uPC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgRGVmYXVsdEljb259IGRpcmVjdGl2ZSZndDsgLS0+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gRGVmYXVsdEljb24gPGVtPnVybDwvZW0+PGJyPgotPFN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPGJyPgotPFN0cm9uZz5PdmVycmlkZTo8L3N0cm9uZz4gSW5kZXhlczxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBCYXNlPGJyPgotPHN0cm9uZz5Nb2R1bGU6PC9zdHJvbmc+IG1vZF9kaXI8cD4KLQotVGhlIERlZmF1bHRJY29uIGRpcmVjdGl2ZSBzZXRzIHRoZSBpY29uIHRvIGRpc3BsYXkgZm9yIGZpbGVzIHdoZW4gbm8KLXNwZWNpZmljIGljb24gaXMga25vd24sIGZvciA8QSBIUkVGPSIjZmFuY3lpbmRleGluZyI+RmFuY3lJbmRleGluZzwvQT4uCi08ZW0+VXJsPC9lbT4gaXMgYSAoJS1lc2NhcGVkKSByZWxhdGl2ZSBVUkwgdG8gdGhlIGljb24uIEV4YW1wbGVzOgotPGJsb2NrcXVvdGU+PGNvZGU+Ci1EZWZhdWx0SWNvbiAvaWNvbi91bmtub3duLnhibQotPC9jb2RlPjwvYmxvY2txdW90ZT48cD48aHI+Ci0KLTxBIG5hbWU9ImRpcmVjdG9yeWluZGV4Ij48aDI+RGlyZWN0b3J5SW5kZXg8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBEaXJlY3RvcnlJbmRleH0gZGlyZWN0aXZlJmd0OyAtLT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBEaXJlY3RvcnlJbmRleCA8ZW0+bG9jYWwtdXJsIGxvY2FsLXVybCAuLi48L2VtPjxicj4KLTxzdHJvbmc+RGVmYXVsdDo8L3N0cm9uZz4gPGNvZGU+RGlyZWN0b3J5SW5kZXggaW5kZXguaHRtbDwvY29kZT48YnI+Ci08U3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3M8YnI+Ci08U3Ryb25nPk92ZXJyaWRlOjwvc3Ryb25nPiBJbmRleGVzPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IEJhc2U8YnI+Ci08c3Ryb25nPk1vZHVsZTo8L3N0cm9uZz4gbW9kX2RpcjxwPgotCi1UaGUgRGlyZWN0b3J5SW5kZXggZGlyZWN0aXZlIHNldHMgdGhlIGxpc3Qgb2YgcmVzb3VyY2VzIHRvIGxvb2sgZm9yLCB3aGVuCi10aGUgY2xpZW50IHJlcXVlc3RzIGFuIGluZGV4IG9mIHRoZSBkaXJlY3RvcnkgYnkgc3BlY2lmeWluZyBhIE5VTEwgZmlsZQotYXQgdGhlIGVuZCBvZiB0aGUgYSBkaXJlY3RvcnkgbmFtZS4gPGVtPkxvY2FsLXVybDwvZW0+IGlzIHRoZSAoJS1lbmNvZGVkKSBVUkwKLW9mIGEgZG9jdW1lbnQgb24gdGhlIHNlcnZlciByZWxhdGl2ZSB0byB0aGUgcmVxdWVzdGVkIGRpcmVjdG9yeTsgaXQgaXMgdXN1YWxseQotdGhlIG5hbWUgb2YgYSBmaWxlIGluIHRoZSBkaXJlY3RvcnkuIFNldmVyYWwgVVJMcyBtYXkgYmUgZ2l2ZW47IHRoZSBzZXJ2ZXIKLXdpbGwgcmV0dXJuIHRoZSBmaXJzdCBvbmUgdGhhdCBpdCBmaW5kcy4gSWYgbm9uZSBvZiB0aGUgcmVzb3VyY2VzIGV4aXN0LAotdGhlbiB0aGUgc2VydmVyIHdpbGwgZ2VuZXJhdGUgaXRzIG93biBsaXN0aW5nIG9mIHRoZSBkaXJlY3RvcnkuCi1FeGFtcGxlOgotPGJsb2NrcXVvdGU+PGNvZGU+Ci1EaXJlY3RvcnlJbmRleCBpbmRleC5odG1sCi08L2NvZGU+PC9ibG9ja3F1b3RlPgotdGhlbiBhIHJlcXVlc3QgZm9yIDxjb2RlPmh0dHA6Ly9teXNlcnZlci9kb2NzLzwvY29kZT4gd291bGQgcmV0dXJuCi08Y29kZT5odHRwOi8vbXlzZXJ2ZXIvZG9jcy9pbmRleC5odG1sPC9jb2RlPiBpZiBpdCBleGlzdHMsIG9yIHdvdWxkIGxpc3QKLXRoZSBkaXJlY3RvcnkgaWYgaXQgZGlkIG5vdC4gPHA+Ci0KLU5vdGUgdGhhdCB0aGUgZG9jdW1lbnRzIGRvIG5vdCBuZWVkIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3Rvcnk7Ci08YmxvY2txdW90ZT48Y29kZT4KLURpcmVjdG9yeUluZGV4IGluZGV4Lmh0bWwgaW5kZXgudHh0IC9jZ2ktYmluL2luZGV4LnBsPC9jb2RlPjwvYmxvY2txdW90ZT4KLXdvdWxkIGNhdXNlIHRoZSBDR0kgc2NyaXB0IDxjb2RlPi9jZ2ktYmluL2luZGV4LnBsPC9jb2RlPiB0byBiZSBleGVjdXRlZAotaWYgbmVpdGhlciA8Y29kZT5pbmRleC5odG1sPC9jb2RlPiBvciA8Y29kZT5pbmRleC50eHQ8L2NvZGU+IGV4aXN0ZWQgaW4KLWEgZGlyZWN0b3J5LjxwPjxocj4KLQotPEEgbmFtZT0iZmFuY3lpbmRleGluZyI+PGgyPkZhbmN5SW5kZXhpbmc8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBGYW5jeUluZGV4aW5nfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IEZhbmN5SW5kZXhpbmcgPGVtPmJvb2xlYW48L2VtPjxicj4KLTxTdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2Vzczxicj4KLTxTdHJvbmc+T3ZlcnJpZGU6PC9zdHJvbmc+IEluZGV4ZXM8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gQmFzZTxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfZGlyPHA+Ci0KLVRoZSBGYW5jeUluZGV4aW5nIGRpcmVjdGl2ZSBzZXRzIHRoZSBGYW5jeUluZGV4aW5nIG9wdGlvbiBmb3IgYSBkaXJlY3RvcnkuCi08ZW0+Qm9vbGVhbjwvZW0+IGNhbiBiZSA8Y29kZT5vbjwvY29kZT4gb3IgPGNvZGU+b2ZmPC9jb2RlPi4gVGhlCi08QSBIUkVGPSIjaW5kZXhvcHRpb25zIj5JbmRleE9wdGlvbnM8L0E+IGRpcmVjdGl2ZSBzaG91bGQgYmUgdXNlZCBpbgotcHJlZmVyZW5jZS48cD48aHI+Ci0KLTxBIG5hbWU9ImhlYWRlcm5hbWUiPjxoMj5IZWFkZXJOYW1lPC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgSGVhZGVyTmFtZX0gZGlyZWN0aXZlJmd0OyAtLT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBIZWFkZXJOYW1lIDxlbT5maWxlbmFtZTwvZW0+PGJyPgotPFN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPGJyPgotPFN0cm9uZz5PdmVycmlkZTo8L3N0cm9uZz4gSW5kZXhlczxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBCYXNlPGJyPgotPHN0cm9uZz5Nb2R1bGU6PC9zdHJvbmc+IG1vZF9kaXI8cD4KLQotVGhlIEhlYWRlck5hbWUgZGlyZWN0aXZlIHNldHMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCB3aWxsIGJlIGluc2VydGVkCi1hdCB0aGUgdG9wIG9mIHRoZSBpbmRleCBsaXN0aW5nLiA8ZW0+RmlsZW5hbWU8L2VtPiBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZQotdG8gaW5jbHVkZSwgYW5kIGlzIHRha2VuIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgYmVpbmcgaW5kZXhlZC4KLVRoZSBzZXJ2ZXIgZmlyc3QgYXR0ZW1wdHMgdG8gaW5jbHVkZSA8ZW0+ZmlsZW5hbWU8L2VtPjxjb2RlPi5odG1sPC9jb2RlPgotYXMgYW4gSFRNTCBkb2N1bWVudCwgb3RoZXJ3aXNlIGl0IHdpbGwgaW5jbHVkZSA8ZW0+ZmlsZW5hbWU8L2VtPiBhcyBwbGFpbgotdGV4dC4gRXhhbXBsZToKLTxibG9ja3F1b3RlPjxjb2RlPkhlYWRlck5hbWUgSEVBREVSPC9jb2RlPjwvYmxvY2txdW90ZT4KLXdoZW4gaW5kZXhpbmcgdGhlIGRpcmVjdG9yeSA8Y29kZT4vd2ViPC9jb2RlPiwgdGhlIHNlcnZlciB3aWxsIGZpcnN0IGxvb2sgZm9yCi10aGUgSFRNTCBmaWxlIDxjb2RlPi93ZWIvSEVBREVSLmh0bWw8L2NvZGU+IGFuZCBpbmNsdWRlIGl0IGlmIGZvdW5kLCBvdGhlcndpc2UKLWl0IHdpbGwgaW5jbHVkZSB0aGUgcGxhaW4gdGV4dCBmaWxlIDxjb2RlPi93ZWIvSEVBREVSPC9jb2RlPiwgaWYgaXQgZXhpc3RzLgotCi08cD5TZWUgYWxzbyA8QSBIUkVGPSIjcmVhZG1lbmFtZSI+UmVhZG1lTmFtZTwvQT4uPHA+PGhyPgotCi08QSBuYW1lPSJpbmRleGlnbm9yZSI+PGgyPkluZGV4SWdub3JlPC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgSW5kZXhJZ25vcmV9IGRpcmVjdGl2ZSZndDsgLS0+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gSW5kZXhJZ25vcmUgPGVtPmZpbGUgZmlsZSAuLi48L2VtPjxicj4KLTxTdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2Vzczxicj4KLTxTdHJvbmc+T3ZlcnJpZGU6PC9zdHJvbmc+IEluZGV4ZXM8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gQmFzZTxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfZGlyPHA+Ci0KLVRoZSBJbmRleElnbm9yZSBkaXJlY3RpdmUgYWRkcyB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byBoaWRlIHdoZW4gbGlzdGluZwotYSBkaXJlY3RvcnkuIDxlbT5GaWxlPC9lbT4gaXMgYSBmaWxlIGV4dGVuc2lvbiwgcGFydGlhbCBmaWxlbmFtZSwKLXdpbGRjYXJkIGV4cHJlc3Npb24gb3IgZnVsbCBmaWxlbmFtZSBmb3IgZmlsZXMgdG8gaWdub3JlLiBNdWx0aXBsZQotSW5kZXhJZ25vcmUgZGlyZWN0aXZlcyBhZGQgdG8gdGhlIGxpc3QsIHJhdGhlciB0aGFuIHRoZSByZXBsYWNpbmcgdGhlIGxpc3QKLW9mIGlnbm9yZWQgZmlsZXMuIEJ5IGRlZmF1bHQsIHRoZSBsaXN0IGNvbnRhaW5zIGA8Y29kZT4uPC9jb2RlPicuIEV4YW1wbGU6Ci08YmxvY2txdW90ZT48Y29kZT4KLUluZGV4SWdub3JlIFJFQURNRSAuaHRhY2Nlc3MgKn4KLTwvY29kZT48L2Jsb2NrcXVvdGU+PHA+PGhyPgotCi08QSBuYW1lPSJpbmRleG9wdGlvbnMiPjxoMj5JbmRleE9wdGlvbnM8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBJbmRleE9wdGlvbnN9IGRpcmVjdGl2ZSZndDsgLS0+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gSW5kZXhPcHRpb25zIDxlbT5vcHRpb24gb3B0aW9uIC4uLjwvZW0+PGJyPgotPFN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPGJyPgotPFN0cm9uZz5PdmVycmlkZTo8L3N0cm9uZz4gSW5kZXhlczxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBCYXNlPGJyPgotPHN0cm9uZz5Nb2R1bGU6PC9zdHJvbmc+IG1vZF9kaXI8cD4KLQotVGhlIEluZGV4T3B0aW9ucyBkaXJlY3RpdmUgc3BlY2lmaWVzIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGRpcmVjdG9yeSBpbmRleGluZy4KLTxlbT5PcHRpb248L2VtPiBjYW4gYmUgb25lIG9mCi08ZGw+Ci08ZHQ+RmFuY3lJbmRleGluZwotPGRkPjwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBGYW5jeUluZGV4aW5nfSBpbmRleCBvcHRpb24mZ3Q7IC0tPgotVGhpcyB0dXJucyBvbiBmYW5jeSBpbmRleGluZyBvZiBkaXJlY3Rvcmllcy4KLTxkdD5JY29uc0FyZUxpbmtzCi08ZGQ+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgSWNvbnNBcmVMaW5rc30gaW5kZXggb3B0aW9uJmd0OyAtLT4KLVRoaXMgbWFrZXMgdGhlIGljb25zIHBhcnQgb2YgdGhlIGFuY2hvciBmb3IgdGhlIGZpbGVuYW1lLCBmb3IKLWZhbmN5IGluZGV4aW5nLgotPGR0PlNjYW5IVE1MVGl0bGVzCi08ZGQ+PCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IFNjYW5IVE1MVGl0bGVzfSBpbmRleCBvcHRpb24mZ3Q7IC0tPgotVGhpcyBlbmFibGVzIHRoZSBleHRyYWN0aW9uIG9mIHRoZSB0aXRsZSBmcm9tIEhUTUwgZG9jdW1lbnRzIGZvciBmYW5jeQotaW5kZXhpbmcuIElmIHRoZSBmaWxlIGRvZXMgbm90IGhhdmUgYSBkZXNjcmlwdGlvbiBnaXZlbiBieQotPEEgSFJFRj0iI2FkZGRlc2NyaXB0aW9uIj5BZGREZXNjcmlwdGlvbjwvQT4gdGhlbiBodHRwZCB3aWxsIHJlYWQgdGhlCi1kb2N1bWVudCBmb3IgdGhlIHZhbHVlIG9mIHRoZSBUSVRMRSB0YWcuICBUaGlzIGlzIENQVSBhbmQgZGlzayBpbnRlbnNpdmUuCi08ZHQ+U3VwcHJlc3NMYXN0TW9kaWZpZWQKLTxkZD4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBTdXBwcmVzc0xhc3RNb2RpZmllZH0gaW5kZXggb3B0aW9uJmd0OyAtLT4KLVRoaXMgd2lsbCBzdXBwcmVzcyB0aGUgZGlzcGxheSBvZiB0aGUgbGFzdCBtb2RpZmljYXRpb24gZGF0ZSwgaW4gZmFuY3kKLWluZGV4aW5nIGxpc3RpbmdzLgotPGR0PlN1cHByZXNzU2l6ZQotPGRkPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IFN1cHByZXNzU2l6ZX0gaW5kZXggb3B0aW9uJmd0OyAtLT4KLVRoaXMgd2lsbCBzdXBwcmVzcyB0aGUgZmlsZSBzaXplIGluIGZhbmN5IGluZGV4aW5nIGxpc3RpbmdzLgotPGR0PlN1cHByZXNzRGVzY3JpcHRpb24KLTxkZD4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBTdXBwcmVzc0Rlc2NyaXB0aW9ufSBpbmRleCBvcHRpb24mZ3Q7IC0tPgotVGhpcyB3aWxsIHN1cHByZXNzIHRoZSBmaWxlIGRlc2NyaXB0aW9uIGluIGZhbmN5IGluZGV4aW5nIGxpc3RpbmdzLgotPC9kbD4KLVRoaXMgZGVmYXVsdCBpcyB0aGF0IG5vIG9wdGlvbnMgYXJlIGVuYWJsZWQuIElmIG11bHRpcGxlIEluZGV4T3B0aW9ucwotY291bGQgYXBwbHkgdG8gYSBkaXJlY3RvcnksIHRoZW4gdGhlIG1vc3Qgc3BlY2lmaWMgb25lIGlzIHRha2VuIGNvbXBsZXRlOwotdGhlIG9wdGlvbnMgYXJlIG5vdCBtZXJnZWQuIEZvciBleGFtcGxlOgotPGJsb2NrcXVvdGU+PGNvZGU+Ci0mbHQ7RGlyZWN0b3J5IC93ZWIvZG9jcyZndDsgPGJyPgotSW5kZXhPcHRpb25zIEZhbmN5SW5kZXhpbmcgPGJyPgotJmx0Oy9EaXJlY3RvcnkmZ3Q7PGJyPgotJmx0O0RpcmVjdG9yeSAvd2ViL2RvY3Mvc3BlYyZndDsgPGJyPgotSW5kZXhPcHRpb25zIFNjYW5IVE1MVGl0bGVzIDxicj4KLSZsdDsvRGlyZWN0b3J5Jmd0OwotPC9jb2RlPjwvYmxvY2txdW90ZT4KLXRoZW4gb25seSA8Y29kZT5TY2FuSFRNTFRpdGxlczwvY29kZT4gd2lsbCBiZSBzZXQgZm9yIHRoZSAvd2ViL2RvY3Mvc3BlYwotZGlyZWN0b3J5LjxwPjxocj4KLQotPEEgbmFtZT0icmVhZG1lbmFtZSI+PGgyPlJlYWRtZU5hbWU8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBSZWFkbWVOYW1lfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IFJlYWRtZU5hbWUgPGVtPmZpbGVuYW1lPC9lbT48YnI+Ci08U3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3M8YnI+Ci08U3Ryb25nPk92ZXJyaWRlOjwvc3Ryb25nPiBJbmRleGVzPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IEJhc2U8YnI+Ci08c3Ryb25nPk1vZHVsZTo8L3N0cm9uZz4gbW9kX2RpcjxwPgotCi1UaGUgUmVhZG1lTmFtZSBkaXJlY3RpdmUgc2V0cyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IHdpbGwgYmUgYXBwZW5kZWQKLXRvIHRoZSBlbmQgb2YgdGhlIGluZGV4IGxpc3RpbmcuIDxlbT5GaWxlbmFtZTwvZW0+IGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlCi10byBpbmNsdWRlLCBhbmQgaXMgdGFrZW4gdG8gYmUgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBiZWluZyBpbmRleGVkLgotVGhlIHNlcnZlciBmaXJzdCBhdHRlbXB0cyB0byBpbmNsdWRlIDxlbT5maWxlbmFtZTwvZW0+PGNvZGU+Lmh0bWw8L2NvZGU+Ci1hcyBhbiBIVE1MIGRvY3VtZW50LCBvdGhlcndpc2UgaXQgd2lsbCBpbmNsdWRlIDxlbT5maWxlbmFtZTwvZW0+IGFzIHBsYWluCi10ZXh0LiBFeGFtcGxlOgotPGJsb2NrcXVvdGU+PGNvZGU+UmVhZG1lTmFtZSBSRUFETUU8L2NvZGU+PC9ibG9ja3F1b3RlPgotd2hlbiBpbmRleGluZyB0aGUgZGlyZWN0b3J5IDxjb2RlPi93ZWI8L2NvZGU+LCB0aGUgc2VydmVyIHdpbGwgZmlyc3QgbG9vayBmb3IKLXRoZSBIVE1MIGZpbGUgPGNvZGU+L3dlYi9SRUFETUUuaHRtbDwvY29kZT4gYW5kIGluY2x1ZGUgaXQgaWYgZm91bmQsIG90aGVyd2lzZQotaXQgd2lsbCBpbmNsdWRlIHRoZSBwbGFpbiB0ZXh0IGZpbGUgPGNvZGU+L3dlYi9SRUFETUU8L2NvZGU+LCBpZiBpdCBleGlzdHMuCi0KLTxwPlNlZSBhbHNvIDxBIEhSRUY9IiNoZWFkZXJuYW1lIj5IZWFkZXJOYW1lPC9BPi48cD4KLQotPCEtLSVoeXBlcnRleHQgLS0+Ci08aHI+Ci08QSBIUkVGPSIuLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2hvbWUuZ2lmIiBBTFQ9IkhvbWUiPjwvQT4KLTxBIEhSRUY9Ii4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9pbmRleC5naWYiIEFMVD0iSW5kZXgiPjwvQT4KLQotPC9CT0RZPgotPC9IVE1MPgotPCEtLS8laHlwZXJ0ZXh0IC0tPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9kaXIueG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9kaXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTBhYTYzLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfZGlyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iLi4vc3R5bGUvbWFudWFsLnhzbCI/PgotPG1vZHVsZXN5bm9wc2lzPgotCi08bmFtZT5tb2RfZGlyPC9uYW1lPgotPGRlc2NyaXB0aW9uPlByb3ZpZGVzIGZvciAidHJhaWxpbmcgc2xhc2giIHJlZGlyZWN0cyBhbmQKLSAgICBzZXJ2aW5nIGRpcmVjdG9yeSBpbmRleCBmaWxlcy48L2Rlc2NyaXB0aW9uPgotPHN0YXR1cz5CYXNlPC9zdGF0dXM+Ci08c291cmNlZmlsZT5tb2RfZGlyLmM8L3NvdXJjZWZpbGU+Ci08aWRlbnRpZmllcj5kaXJfbW9kdWxlPC9pZGVudGlmaWVyPgotCi08c3VtbWFyeT4KLSAgICA8cD5UaGUgaW5kZXggb2YgYSBkaXJlY3RvcnkgY2FuIGNvbWUgZnJvbSBvbmUgb2YgdHdvIHNvdXJjZXM6PC9wPgotCi0gICAgPHVsPgotICAgICAgPGxpPkEgZmlsZSB3cml0dGVuIGJ5IHRoZSB1c2VyLCB0eXBpY2FsbHkgY2FsbGVkCi0gICAgICA8Y29kZT5pbmRleC5odG1sPC9jb2RlPi4gVGhlIDxkaXJlY3RpdmUgbW9kdWxlPSJtb2RfZGlyIgotICAgICAgPkRpcmVjdG9yeUluZGV4PC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBzZXRzIHRoZQotICAgICAgbmFtZSBvZiB0aGlzIGZpbGUuIFRoaXMgaXMgY29udHJvbGxlZCBieQotICAgICAgPG1vZHVsZT5tb2RfZGlyPC9tb2R1bGU+LjwvbGk+Ci0KLSAgICAgIDxsaT5PdGhlcndpc2UsIGEgbGlzdGluZyBnZW5lcmF0ZWQgYnkgdGhlIHNlcnZlci4gVGhpcyBpcwotICAgICAgcHJvdmlkZWQgYnkgPG1vZHVsZT5tb2RfYXV0b2luZGV4PC9tb2R1bGU+LjwvbGk+Ci0gICAgPC91bD4KLSAgICA8cD5UaGUgdHdvIGZ1bmN0aW9ucyBhcmUgc2VwYXJhdGVkIHNvIHRoYXQgeW91IGNhbiBjb21wbGV0ZWx5Ci0gICAgcmVtb3ZlIChvciByZXBsYWNlKSBhdXRvbWF0aWMgaW5kZXggZ2VuZXJhdGlvbiBzaG91bGQgeW91IHdhbnQKLSAgICB0by48L3A+IAotCi0gICAgPHA+QSAidHJhaWxpbmcgc2xhc2giIHJlZGlyZWN0IGlzIGlzc3VlZCB3aGVuIHRoZSBzZXJ2ZXIKLSAgICByZWNlaXZlcyBhIHJlcXVlc3QgZm9yIGEgVVJMCi0gICAgPGNvZGU+aHR0cDovL3NlcnZlcm5hbWUvZm9vL2Rpcm5hbWU8L2NvZGU+IHdoZXJlCi0gICAgPGNvZGU+ZGlybmFtZTwvY29kZT4gaXMgYSBkaXJlY3RvcnkuIERpcmVjdG9yaWVzIHJlcXVpcmUgYQotICAgIHRyYWlsaW5nIHNsYXNoLCBzbyA8bW9kdWxlPm1vZF9kaXI8L21vZHVsZT4gaXNzdWVzIGEgcmVkaXJlY3QgdG8KLSAgICA8Y29kZT5odHRwOi8vc2VydmVybmFtZS9mb28vZGlybmFtZS88L2NvZGU+LjwvcD4KLTwvc3VtbWFyeT4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPGRlc2NyaXB0aW9uPkxpc3Qgb2YgcmVzb3VyY2VzIHRvIGxvb2sgZm9yIHdoZW4gdGhlIGNsaWVudCByZXF1ZXN0cwotYSBkaXJlY3Rvcnk8L2Rlc2NyaXB0aW9uPgotPG5hbWU+RGlyZWN0b3J5SW5kZXg8L25hbWU+Ci08c3ludGF4PkRpcmVjdG9yeUluZGV4Ci0gICAgPGVtPmxvY2FsLXVybDwvZW0+IFs8ZW0+bG9jYWwtdXJsPC9lbT5dIC4uLjwvc3ludGF4PgotPGRlZmF1bHQ+RGlyZWN0b3J5SW5kZXggaW5kZXguaHRtbDwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PgotPGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0PgotPGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT5JbmRleGVzPC9vdmVycmlkZT4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPkRpcmVjdG9yeUluZGV4PC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBzZXRzIHRoZQotICAgIGxpc3Qgb2YgcmVzb3VyY2VzIHRvIGxvb2sgZm9yLCB3aGVuIHRoZSBjbGllbnQgcmVxdWVzdHMgYW4gaW5kZXgKLSAgICBvZiB0aGUgZGlyZWN0b3J5IGJ5IHNwZWNpZnlpbmcgYSAvIGF0IHRoZSBlbmQgb2YgdGhlIGEgZGlyZWN0b3J5Ci0gICAgbmFtZS4gIDxlbT5Mb2NhbC11cmw8L2VtPiBpcyB0aGUgKCUtZW5jb2RlZCkgVVJMIG9mIGEgZG9jdW1lbnQgb24KLSAgICB0aGUgc2VydmVyIHJlbGF0aXZlIHRvIHRoZSByZXF1ZXN0ZWQgZGlyZWN0b3J5OyBpdCBpcyB1c3VhbGx5IHRoZQotICAgIG5hbWUgb2YgYSBmaWxlIGluIHRoZSBkaXJlY3RvcnkuIFNldmVyYWwgVVJMcyBtYXkgYmUgZ2l2ZW4sIGluCi0gICAgd2hpY2ggY2FzZSB0aGUgc2VydmVyIHdpbGwgcmV0dXJuIHRoZSBmaXJzdCBvbmUgdGhhdCBpdCBmaW5kcy4gIElmCi0gICAgbm9uZSBvZiB0aGUgcmVzb3VyY2VzIGV4aXN0IGFuZCB0aGUgPGNvZGU+SW5kZXhlczwvY29kZT4gb3B0aW9uIGlzCi0gICAgc2V0LCB0aGUgc2VydmVyIHdpbGwgZ2VuZXJhdGUgaXRzIG93biBsaXN0aW5nIG9mIHRoZQotICAgIGRpcmVjdG9yeS48L3A+Ci0KLTxleGFtcGxlPjx0aXRsZT5FeGFtcGxlPC90aXRsZT4KLURpcmVjdG9yeUluZGV4IGluZGV4Lmh0bWwKLTwvZXhhbXBsZT4KLQotICAgIDxwPnRoZW4gYSByZXF1ZXN0IGZvciA8Y29kZT5odHRwOi8vbXlzZXJ2ZXIvZG9jcy88L2NvZGU+IHdvdWxkCi0gICAgcmV0dXJuIDxjb2RlPmh0dHA6Ly9teXNlcnZlci9kb2NzL2luZGV4Lmh0bWw8L2NvZGU+IGlmIGl0Ci0gICAgZXhpc3RzLCBvciB3b3VsZCBsaXN0IHRoZSBkaXJlY3RvcnkgaWYgaXQgZGlkIG5vdC48L3A+Ci0KLSAgICA8cD5Ob3RlIHRoYXQgdGhlIGRvY3VtZW50cyBkbyBub3QgbmVlZCB0byBiZSByZWxhdGl2ZSB0byB0aGUKLSAgICBkaXJlY3Rvcnk7PC9wPgotCi08ZXhhbXBsZT5EaXJlY3RvcnlJbmRleCBpbmRleC5odG1sIGluZGV4LnR4dCAgL2NnaS1iaW4vaW5kZXgucGw8L2V4YW1wbGU+Ci0gICAgPHA+d291bGQgY2F1c2UgdGhlIENHSSBzY3JpcHQgPGNvZGU+L2NnaS1iaW4vaW5kZXgucGw8L2NvZGU+IHRvIGJlCi0gICAgZXhlY3V0ZWQgaWYgbmVpdGhlciA8Y29kZT5pbmRleC5odG1sPC9jb2RlPiBvcgotICAgIDxjb2RlPmluZGV4LnR4dDwvY29kZT4gZXhpc3RlZCBpbiBhIGRpcmVjdG9yeS48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPC9tb2R1bGVzeW5vcHNpcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2Vudi5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9lbnYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UzMmQyNi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX2Vudi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCAyLjAvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIG1vZHVsZSBtb2RfZW52PC9USVRMRT4KLTwvSEVBRD4KLQotPEJPRFk+Ci08SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9zdWIuZ2lmIiBBTFQ9IiI+Ci08SDE+QXBhY2hlIG1vZHVsZSBtb2RfZW52PC9oMT4KLQotVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5tb2RfZW52LmM8L2NvZGU+IGZpbGUsIGFuZAotaXMgbm90IGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuIEl0IHByb3ZpZGVzIGZvcgotcGFzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gQ0dJL1NTSSBzY3JpcHRzLiBJcyBpcyBvbmx5IGF2YWlsYWJsZQotaW4gQXBhY2hlIDEuMSBhbmQgbGF0ZXIuCi0KLTxoMj5TdW1tYXJ5PC9oMj4KLQotVGhpcyBtb2R1bGUgYWxsb3dzIEFwYWNoZSdzIENHSSBhbmQgU1NJIGVudmlyb25tZW50IHRvIGluaGVyaXQKLWVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHRoZSBzaGVsbCB3aGljaCBpbnZva2VkIHRoZSBodHRwZCBwcm9jZXNzLgotQ0VSTiB3ZWJzZXJ2ZXJzIGFyZSBhYmxlIHRvIGRvIHRoaXMsIHNvIHRoaXMgbW9kdWxlIGlzIGVzcGVjaWFsbHkKLXVzZWZ1bCB0byB3ZWJhZG1pbnMgd2hvIHdpc2ggdG8gbWlncmF0ZSBmcm9tIENFUk4gdG8gQXBhY2hlIHdpdGhvdXQKLXJld3JpdGluZyBhbGwgdGhlaXIgc2NyaXB0cwotIAotPGgyPkRpcmVjdGl2ZXM8L2gyPgotPHVsPgotPGxpPjxBIEhSRUY9IiNwYXNzZW52Ij5QYXNzRW52PC9BPgotPGxpPjxBIEhSRUY9IiNzZXRlbnYiPlNldEVudjwvQT4KLTwvdWw+Ci0KLTxocj4KLQotPEEgbmFtZT0icGFzc2VudiI+PGgyPlBhc3NFbnY8L2gyPjwvQT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBQYXNzRW52IDxlbT52YXJpYWJsZTwvZW0+PGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gQmFzZTxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfZW52PGJyPgotPHN0cm9uZz5Db21wYXRpYmlsaXR5Ojwvc3Ryb25nPiBQYXNzRW52IGlzIG9ubHkgYXZhaWxhYmxlIGluCi1BcGFjaGUgMS4xIGFuZCBsYXRlci48cD4KLQotUGFzc2VzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIENHSSBzY3JpcHRzIGZyb20gdGhlIHNlcnZlcnMncyBvd24KLWVudmlyb25tZW50LiBFeGFtcGxlOgotPHByZT4KLSAgICBQYXNzRW52IExEX0xJQlJBUllfUEFUSAotPC9wcmU+Ci0KLQotPEEgbmFtZT0ic2V0ZW52Ij48aDI+U2V0RW52PC9oMj48L0E+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gU2V0RW52IDxlbT52YXJpYWJsZSB2YWx1ZTwvZW0+PGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gQmFzZTxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfZW52PGJyPgotPHN0cm9uZz5Db21wYXRpYmlsaXR5Ojwvc3Ryb25nPiBTZXRFbnYgaXMgb25seSBhdmFpbGFibGUgaW4KLUFwYWNoZSAxLjEgYW5kIGxhdGVyLjxwPgotCi1TZXRzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLCB3aGljaCBpcyB0aGVuIHBhc3NlZCBvbiB0byBDR0kKLXNjcmlwdHMuIEV4YW1wbGU6Ci08cHJlPgotICAgIFNldEVudiBTUEVDSUFMX1BBVEggL2Zvby9iaW4KLTwvcHJlPgotCi08cD48aHI+Ci0KLTxBIEhSRUY9Ii4uLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfaG9tZS5naWYiIEFMVD0iSG9tZSI+PC9BPgotPEEgSFJFRj0iLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2luZGV4LmdpZiIgQUxUPSJJbmRleCI+PC9BPgotCi08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfZW52LnhtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfZW52LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUwMmZiNS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX2Vudi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9Ii4uL3N0eWxlL21hbnVhbC54c2wiPz4KLTxtb2R1bGVzeW5vcHNpcz4KLQotPG5hbWU+bW9kX2VudjwvbmFtZT4KLSAgPGRlc2NyaXB0aW9uPk1vZGlmaWVzIHRoZSBlbnZpcm9ubWVudCB3aGljaCBpcwotICAgIHBhc3NlZCB0byBDR0kgc2NyaXB0cyBhbmQgU1NJIHBhZ2VzPC9kZXNjcmlwdGlvbj4KLSAgPHN0YXR1cz5CYXNlPC9zdGF0dXM+Ci0gIDxzb3VyY2VmaWxlPm1vZF9lbnYuYzwvc291cmNlZmlsZT4KLSAgPGlkZW50aWZpZXI+ZW52X21vZHVsZTwvaWRlbnRpZmllcj4KLSAgPHN1bW1hcnk+Ci0gICAgPHA+VGhpcyBtb2R1bGUgYWxsb3dzIGZvciBjb250cm9sIG9mIHRoZSBlbnZpcm9ubWVudCB0aGF0IHdpbGwKLSAgICBiZSBwcm92aWRlZCB0byBDR0kgc2NyaXB0cyBhbmQgU1NJIHBhZ2VzLiBFbnZpcm9ubWVudCB2YXJpYWJsZXMKLSAgICBtYXkgYmUgcGFzc2VkIGZyb20gdGhlIHNoZWxsIHdoaWNoIGludm9rZWQgdGhlIGh0dHBkIHByb2Nlc3MuCi0gICAgQWx0ZXJuYXRpdmVseSwgZW52aXJvbm1lbnQgdmFyaWFibGVzIG1heSBiZSBzZXQgb3IgdW5zZXQgd2l0aGluCi0gICAgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcy48L3A+Ci0gIDwvc3VtbWFyeT4KLSAgPHNlZWFsc28+PGEgaHJlZj0iLi4vZW52Lmh0bWwiPkVudmlyb25tZW50IFZhcmlhYmxlczwvYT48L3NlZWFsc28+Ci0KLSAgPGRpcmVjdGl2ZXN5bm9wc2lzPgotICAgIDxuYW1lPlBhc3NFbnY8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPlBhc3NlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSB0aGUgc2hlbGw8L2Rlc2NyaXB0aW9uPgotICAgIDxzeW50YXg+UGFzc0VudgotICAgIDxlbT5lbnYtdmFyaWFibGU8L2VtPiBbPGVtPmVudi12YXJpYWJsZTwvZW0+XSAuLi48L3N5bnRheD4KLSAgICA8Y29udGV4dGxpc3Q+Ci0gICAgICA8Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLSAgICAgIDxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci0gICAgPC9jb250ZXh0bGlzdD4KLSAgICA8b3ZlcnJpZGU+RmlsZUluZm88L292ZXJyaWRlPgotCi08dXNhZ2U+Ci0gICAgPHA+U3BlY2lmaWVzIG9uZSBvciBtb3JlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBwYXNzIHRvIENHSQotICAgIHNjcmlwdHMgYW5kIFNTSSBwYWdlcyBmcm9tIHRoZSBlbnZpcm9ubWVudCBvZiB0aGUgc2hlbGwgd2hpY2gKLSAgICBpbnZva2VkIHRoZSBodHRwZCBwcm9jZXNzLiBFeGFtcGxlOjwvcD4KLTxleGFtcGxlPgotICAgIFBhc3NFbnYgTERfTElCUkFSWV9QQVRICi08L2V4YW1wbGU+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U2V0RW52PC9uYW1lPgotPGRlc2NyaXB0aW9uPlNldHMgZW52aXJvbm1lbnQgdmFyaWFibGVzPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+U2V0RW52IDxlbT5lbnYtdmFyaWFibGUgdmFsdWU8L2VtPjwvc3ludGF4PgotPGNvbnRleHRsaXN0PgotPGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT5GaWxlSW5mbzwvb3ZlcnJpZGU+Ci0KLTx1c2FnZT4KLSAgICA8cD5TZXRzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLCB3aGljaCBpcyB0aGVuIHBhc3NlZCBvbiB0byBDR0kKLSAgICBzY3JpcHRzIGFuZCBTU0kgcGFnZXMuIEV4YW1wbGU6PC9wPgotPGV4YW1wbGU+Ci0gICAgU2V0RW52IFNQRUNJQUxfUEFUSCAvZm9vL2JpbgotPC9leGFtcGxlPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlVuc2V0RW52PC9uYW1lPgotPGRlc2NyaXB0aW9uPlJlbW92ZXMgdmFyaWFibGVzIGZyb20gdGhlIGVudmlyb25tZW50PC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+VW5zZXRFbnYgPGVtPmVudi12YXJpYWJsZTwvZW0+IFs8ZW0+ZW52LXZhcmlhYmxlPC9lbT5dIC4uLjwvc3ludGF4PgotPGNvbnRleHRsaXN0PgotPGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT5GaWxlSW5mbzwvb3ZlcnJpZGU+Ci0KLTx1c2FnZT4KLSAgICA8cD5SZW1vdmVzIG9uZSBvciBtb3JlIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHRob3NlIHBhc3NlZAotICAgIG9uIHRvIENHSSBzY3JpcHRzIGFuZCBTU0kgcGFnZXMuIEV4YW1wbGU6PC9wPgotPGV4YW1wbGU+Ci0gICAgVW5zZXRFbnYgTERfTElCUkFSWV9QQVRICi08L2V4YW1wbGU+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPC9tb2R1bGVzeW5vcHNpcz4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9leGFtcGxlLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2V4YW1wbGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmYjhlZi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX2V4YW1wbGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDIuMC8vRU4iPgotPEhUTUw+Ci0gPEhFQUQ+Ci0gIDxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9leGFtcGxlPC9USVRMRT4KLSA8L0hFQUQ+Ci0gPEJPRFk+Ci0gIDwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci0gIDxIMT5Nb2R1bGUgbW9kX2V4YW1wbGU8L2gxPgotICA8UD4KLSAgVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Q09ERT5tb2R1bGVzL21vZF9leGFtcGxlLmM8L0NPREU+IGZpbGUsIGFuZAotICA8U1RST05HPmlzIG5vdDwvU1RST05HPiBjb21waWxlZCBpbiBieSBkZWZhdWx0LiAgSXQgaWxsdXN0cmF0ZXMgbWFueSBvZgotICB0aGUgYXNwZWN0cyBvZiB0aGUKLSAgPEEKLSAgIEhSRUY9Ii4uL21pc2MvQVBJLmh0bWwiCi0gICBSRUw9IkhlbHAiCi0gID5BcGFjaGUgMS4yIEFQSTwvQT4KLSAgYW5kLCB3aGVuIHVzZWQsIGRlbW9uc3RyYXRlcyB0aGUgbWFubmVyIGluIHdoaWNoIG1vZHVsZSBjYWxsYmFja3MgYXJlCi0gIHRyaWdnZXJlZCBieSB0aGUgc2VydmVyLgotICA8L1A+Ci0gIDxIMj5TdW1tYXJ5PC9IMj4KLSAgPFA+Ci0gIFRoZSBmaWxlcyBpbiB0aGUgPENPREU+c3JjL21vZHVsZXMvZXhhbXBsZSBkaXJlY3Rvcnk8L0NPREU+IHVuZGVyIHRoZQotICBBcGFjaGUgZGlzdHJpYnV0aW9uIGRpcmVjdG9yeSB0cmVlIGFyZSBwcm92aWRlZCBhcyBhbiBleGFtcGxlIHRvIHRob3NlCi0gIHRoYXQgd2lzaCB0byB3cml0ZSBtb2R1bGVzIHRoYXQgdXNlIHRoZSBBcGFjaGUgQVBJLgotICA8L1A+Ci0gIDxQPgotICBUaGUgbWFpbiBmaWxlIGlzIDxDT0RFPm1vZF9leGFtcGxlLmM8L0NPREU+LCB3aGljaCBpbGx1c3RyYXRlcyBhbGwKLSAgdGhlIGRpZmZlcmVudCBjYWxsYmFjayBtZWNoYW5pc21zIGFuZCBjYWxsIHN5bnRhY2VzLiAgQnkgbm8gbWVhbnMgZG9lcwotICBhbiBhZGQtb24gbW9kdWxlIG5lZWQgdG8gaW5jbHVkZSByb3V0aW5lcyBmb3IgYWxsIG9mIHRoZSBjYWxsYmFja3MgLQotICBxdWl0ZSB0aGUgY29udHJhcnkhCi0gIDwvUD4KLSAgPFA+Ci0gIFRoZSBleGFtcGxlIG1vZHVsZSBpcyBhbiBhY3R1YWwgd29ya2luZyBtb2R1bGUuICBJZiB5b3UgbGluayBpdCBpbnRvCi0gIHlvdXIgc2VydmVyLCBlbmFibGUgdGhlICJleGFtcGxlLWhhbmRsZXIiIGhhbmRsZXIgZm9yIGEgbG9jYXRpb24sIGFuZAotICB0aGVuIGJyb3dzZSB0byB0aGF0IGxvY2F0aW9uLCB5b3Ugd2lsbCBzZWUgYSBkaXNwbGF5IG9mCi0gIHNvbWUgb2YgdGhlIHRyYWNpbmcgdGhlIGV4YW1wbGUgbW9kdWxlIGRpZCBhcyB0aGUgdmFyaW91cyBjYWxsYmFja3MKLSAgd2VyZSBtYWRlLgotICA8L1A+Ci0gIDxQPgotICBUbyBpbmNsdWRlIHRoZSBleGFtcGxlIG1vZHVsZSBpbiB5b3VyIHNlcnZlciwgZm9sbG93IHRoZSBzdGVwcyBiZWxvdzoKLSAgPC9QPgotICA8T0w+Ci0gICA8TEk+VW5jb21tZW50IHRoZSAiTW9kdWxlIGV4YW1wbGVfbW9kdWxlIiBsaW5lIG5lYXIgdGhlIGJvdHRvbSBvZgotICAgIHRoZSA8Q09ERT5zcmMvQ29uZmlndXJhdGlvbjwvQ09ERT4gZmlsZS4gIElmIHRoZXJlIGlzbid0IG9uZSwgYWRkCi0gICAgaXQ7IGl0IHNob3VsZCBsb29rIGxpa2UgdGhpczoKLSAgICA8UFJFPgotICAgICBNb2R1bGUgZXhhbXBsZV9tb2R1bGUgICAgICAgIG1vZHVsZXMvZXhhbXBsZS9tb2RfZXhhbXBsZS5vCi0gICAgPC9QUkU+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+Ci0gIDwvUD4KLSAgPEhSPgotICA8QSBOQU1FPSJleGFtcGxlIj4KLSAgIDxIMj5FeGFtcGxlPC9IMj4KLSAgPC9BPgotICA8UD4KLSAgPFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+IEV4YW1wbGUKLSAgPEJSPgotICA8U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+IE5vbmUKLSAgPEJSPgotICA8U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3MKLSAgPEJSPgotICA8U1RST05HPk92ZXJyaWRlOjwvU1RST05HPiBPcHRpb25zCi0gIDxCUj4KLSAgPFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+IEV4dGVuc2lvbgotICA8QlI+Ci0gIDxTVFJPTkc+TW9kdWxlOjwvU1RST05HPiBtb2RfZXhhbXBsZQotICA8L1A+Ci0gIDxQPgotICBUaGUgRXhhbXBsZSBkaXJlY3RpdmUgYWN0aXZhdGVzIHRoZSBleGFtcGxlIG1vZHVsZSdzIGNvbnRlbnQgaGFuZGxlcgotICBmb3IgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uIG9yIGZpbGUgdHlwZS4gIEl0IHRha2VzIG5vIGFyZ3VtZW50cy4gIElmCi0gIHlvdSBicm93c2UgdG8gYW4gVVJMIHRvIHdoaWNoIHRoZSBleGFtcGxlIGNvbnRlbnQtaGFuZGxlciBhcHBsaWVzLCB5b3UKLSAgd2lsbCBnZXQgYSBkaXNwbGF5IG9mIHRoZSByb3V0aW5lcyB3aXRoaW4gdGhlIG1vZHVsZSBhbmQgaG93IGFuZCBpbgotICB3aGF0IG9yZGVyIHRoZXkgd2VyZSBjYWxsZWQgdG8gc2VydmljZSB0aGUgZG9jdW1lbnQgcmVxdWVzdC4KLSAgPC9QPgotICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotIDwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfZXhhbXBsZS54bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2V4YW1wbGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2JkNzJmLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfZXhhbXBsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgbW9kdWxlc3lub3BzaXMgU1lTVEVNICIuLi9zdHlsZS9tb2R1bGVzeW5vcHNpcy5kdGQiPgotPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iLi4vc3R5bGUvbWFudWFsLnhzbCI/PgotPG1vZHVsZXN5bm9wc2lzPgotCi08bmFtZT5tb2RfZXhhbXBsZTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5JbGx1c3RyYXRlcyB0aGUgQXBhY2hlIG1vZHVsZSBBUEk8L2Rlc2NyaXB0aW9uPgotPHN0YXR1cz5FeHBlcmltZW50YWw8L3N0YXR1cz4KLTxzb3VyY2VmaWxlPm1vZF9leGFtcGxlLmM8L3NvdXJjZWZpbGU+Ci08aWRlbnRpZmllcj5leGFtcGxlX21vZHVsZTwvaWRlbnRpZmllcj4KLQotPHN1bW1hcnk+Ci08bm90ZSB0eXBlPSJ3YXJuaW5nIj4KLSAgICAgIFRoaXMgZG9jdW1lbnQgaGFzIG5vdCBiZWVuIHVwZGF0ZWQKLSAgICAgIHRvIHRha2UgaW50byBhY2NvdW50IGNoYW5nZXMgbWFkZSBpbiB0aGUgMi4wIHZlcnNpb24gb2YgdGhlCi0gICAgICBBcGFjaGUgSFRUUCBTZXJ2ZXIuIFNvbWUgb2YgdGhlIGluZm9ybWF0aW9uIG1heSBzdGlsbCBiZQotICAgICAgcmVsZXZhbnQsIGJ1dCBwbGVhc2UgdXNlIGl0IHdpdGggY2FyZS4KLTwvbm90ZT4KLQotICAgIDxwPlRoZSBmaWxlcyBpbiB0aGUgPGNvZGU+c3JjL21vZHVsZXMvZXhhbXBsZSBkaXJlY3Rvcnk8L2NvZGU+Ci0gICAgdW5kZXIgdGhlIEFwYWNoZSBkaXN0cmlidXRpb24gZGlyZWN0b3J5IHRyZWUgYXJlIHByb3ZpZGVkIGFzIGFuCi0gICAgZXhhbXBsZSB0byB0aG9zZSB0aGF0IHdpc2ggdG8gd3JpdGUgbW9kdWxlcyB0aGF0IHVzZSB0aGUgQXBhY2hlCi0gICAgQVBJLjwvcD4KLQotICAgIDxwPlRoZSBtYWluIGZpbGUgaXMgPGNvZGU+bW9kX2V4YW1wbGUuYzwvY29kZT4sIHdoaWNoCi0gICAgaWxsdXN0cmF0ZXMgYWxsIHRoZSBkaWZmZXJlbnQgY2FsbGJhY2sgbWVjaGFuaXNtcyBhbmQgY2FsbAotICAgIHN5bnRheGVzLiBCeSBubyBtZWFucyBkb2VzIGFuIGFkZC1vbiBtb2R1bGUgbmVlZCB0byBpbmNsdWRlCi0gICAgcm91dGluZXMgZm9yIGFsbCBvZiB0aGUgY2FsbGJhY2tzIC0gcXVpdGUgdGhlIGNvbnRyYXJ5ITwvcD4KLQotICAgIDxwPlRoZSBleGFtcGxlIG1vZHVsZSBpcyBhbiBhY3R1YWwgd29ya2luZyBtb2R1bGUuIElmIHlvdSBsaW5rCi0gICAgaXQgaW50byB5b3VyIHNlcnZlciwgZW5hYmxlIHRoZSAiZXhhbXBsZS1oYW5kbGVyIiBoYW5kbGVyIGZvciBhCi0gICAgbG9jYXRpb24sIGFuZCB0aGVuIGJyb3dzZSB0byB0aGF0IGxvY2F0aW9uLCB5b3Ugd2lsbCBzZWUgYQotICAgIGRpc3BsYXkgb2Ygc29tZSBvZiB0aGUgdHJhY2luZyB0aGUgZXhhbXBsZSBtb2R1bGUgZGlkIGFzIHRoZQotICAgIHZhcmlvdXMgY2FsbGJhY2tzIHdlcmUgbWFkZS48L3A+Ci08L3N1bW1hcnk+Ci0KLTxzZWN0aW9uPjx0aXRsZT5Db21waWxpbmcgdGhlIGV4YW1wbGUgbW9kdWxlPC90aXRsZT4KLQotICAgIDxwPlRvIGluY2x1ZGUgdGhlIGV4YW1wbGUgbW9kdWxlIGluIHlvdXIgc2VydmVyLCBmb2xsb3cgdGhlCi0gICAgc3RlcHMgYmVsb3c6PC9wPgotCi0gICAgPG9sPgotICAgICAgPGxpPgotICAgICAgICBVbmNvbW1lbnQgdGhlICJBZGRNb2R1bGUgbW9kdWxlcy9leGFtcGxlL21vZF9leGFtcGxlIiBsaW5lCi0gICAgICAgIG5lYXIgdGhlIGJvdHRvbSBvZiB0aGUgPGNvZGU+c3JjL0NvbmZpZ3VyYXRpb248L2NvZGU+IGZpbGUuCi0gICAgICAgIElmIHRoZXJlIGlzbid0IG9uZSwgYWRkIGl0OyBpdCBzaG91bGQgbG9vayBsaWtlIHRoaXM6IAotPGV4YW1wbGU+Ci0gICAgIEFkZE1vZHVsZSBtb2R1bGVzL2V4YW1wbGUvbW9kX2V4YW1wbGUubwotPC9leGFtcGxlPgotICAgICAgPC9saT4KLQotICAgICAgPGxpPlJ1biB0aGUgPGNvZGU+c3JjL0NvbmZpZ3VyZTwvY29kZT4gc2NyaXB0Ci0gICAgICAoIjxjb2RlPmNkJm5ic3A7c3JjOyZuYnNwOy4vQ29uZmlndXJlPC9jb2RlPiIpLiBUaGlzIHdpbGwKLSAgICAgIGJ1aWxkIHRoZSBNYWtlZmlsZSBmb3IgdGhlIHNlcnZlciBpdHNlbGYsIGFuZCB1cGRhdGUgdGhlCi0gICAgICA8Y29kZT5zcmMvbW9kdWxlcy9NYWtlZmlsZTwvY29kZT4gZm9yIGFueSBhZGRpdGlvbmFsIG1vZHVsZXMKLSAgICAgIHlvdSBoYXZlIHJlcXVlc3RlZCBmcm9tIGJlbmVhdGggdGhhdCBzdWJkaXJlY3RvcnkuPC9saT4KLQotICAgICAgPGxpPk1ha2UgdGhlIHNlcnZlciAocnVuICI8Y29kZT5tYWtlPC9jb2RlPiIgaW4gdGhlCi0gICAgICA8Y29kZT5zcmM8L2NvZGU+IGRpcmVjdG9yeSkuPC9saT4KLSAgICA8L29sPgotCi0gICAgPHA+VG8gYWRkIGFub3RoZXIgbW9kdWxlIG9mIHlvdXIgb3duOjwvcD4KLQotICAgIDxvbCB0eXBlPSJBIj4KLSAgICAgIDxsaT48Y29kZT5ta2RpciBzcmMvbW9kdWxlcy88ZW0+bXltb2R1bGU8L2VtPjwvY29kZT48L2xpPgotCi0gICAgICA8bGk+PGNvZGU+Y3Agc3JjL21vZHVsZXMvZXhhbXBsZS8qCi0gICAgICBzcmMvbW9kdWxlcy88ZW0+bXltb2R1bGU8L2VtPjwvY29kZT48L2xpPgotCi0gICAgICA8bGk+TW9kaWZ5IHRoZSBmaWxlcyBpbiB0aGUgbmV3IGRpcmVjdG9yeS48L2xpPgotCi0gICAgICA8bGk+Rm9sbG93IHN0ZXBzIFsxXSB0aHJvdWdoIFszXSBhYm92ZSwgd2l0aCBhcHByb3ByaWF0ZQotICAgICAgY2hhbmdlcy48L2xpPgotICAgIDwvb2w+Ci08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uPjx0aXRsZT5Vc2luZyB0aGUgPGNvZGU+bW9kX2V4YW1wbGU8L2NvZGU+IE1vZHVsZTwvdGl0bGU+Ci0KLSAgICA8cD5UbyBhY3RpdmF0ZSB0aGUgZXhhbXBsZSBtb2R1bGUsIGluY2x1ZGUgYSBibG9jayBzaW1pbGFyIHRvCi0gICAgdGhlIGZvbGxvd2luZyBpbiB5b3VyIDxjb2RlPnNybS5jb25mPC9jb2RlPiBmaWxlOjwvcD4KLTxleGFtcGxlPgotICAgJmx0O0xvY2F0aW9uIC9leGFtcGxlLWluZm8mZ3Q7PGJyIC8+Ci0gICAgICAgU2V0SGFuZGxlciBleGFtcGxlLWhhbmRsZXI8YnIgLz4KLSAgICZsdDsvTG9jYXRpb24mZ3Q7Ci08L2V4YW1wbGU+Ci0KLSAgICA8cD5BcyBhbiBhbHRlcm5hdGl2ZSwgeW91IGNhbiBwdXQgdGhlIGZvbGxvd2luZyBpbnRvIGEgPGEKLSAgICBocmVmPSJjb3JlLmh0bWwjYWNjZXNzZmlsZW5hbWUiPjxjb2RlPi5odGFjY2VzczwvY29kZT48L2E+IGZpbGUKLSAgICBhbmQgdGhlbiByZXF1ZXN0IHRoZSBmaWxlICJ0ZXN0LmV4YW1wbGUiIGZyb20gdGhhdCBsb2NhdGlvbjo8L3A+Ci08ZXhhbXBsZT4KLSAgIEFkZEhhbmRsZXIgZXhhbXBsZS1oYW5kbGVyIC5leGFtcGxlCi08L2V4YW1wbGU+Ci0KLSAgICA8cD5BZnRlciByZWxvYWRpbmcvcmVzdGFydGluZyB5b3VyIHNlcnZlciwgeW91IHNob3VsZCBiZSBhYmxlCi0gICAgdG8gYnJvd3NlIHRvIHRoaXMgbG9jYXRpb24gYW5kIHNlZSB0aGUgYnJpZWYgZGlzcGxheSBtZW50aW9uZWQKLSAgICBlYXJsaWVyLjwvcD4KLTwvc2VjdGlvbj4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+RXhhbXBsZTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5EZW1vbnN0cmF0aW9uIGRpcmVjdGl2ZSB0byBpbGx1c3RyYXRlIHRoZSBBcGFjaGUgbW9kdWxlCi1BUEk8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5FeGFtcGxlPC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD48Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+Ci08Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPkV4YW1wbGU8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIGp1c3Qgc2V0cyBhIGRlbW9uc3RyYXRpb24KLSAgICBmbGFnIHdoaWNoIHRoZSBleGFtcGxlIG1vZHVsZSdzIGNvbnRlbnQgaGFuZGxlciBkaXNwbGF5cy4gSXQKLSAgICB0YWtlcyBubyBhcmd1bWVudHMuIElmIHlvdSBicm93c2UgdG8gYW4gVVJMIHRvIHdoaWNoIHRoZQotICAgIGV4YW1wbGUgY29udGVudC1oYW5kbGVyIGFwcGxpZXMsIHlvdSB3aWxsIGdldCBhIGRpc3BsYXkgb2YgdGhlCi0gICAgcm91dGluZXMgd2l0aGluIHRoZSBtb2R1bGUgYW5kIGhvdyBhbmQgaW4gd2hhdCBvcmRlciB0aGV5IHdlcmUKLSAgICBjYWxsZWQgdG8gc2VydmljZSB0aGUgZG9jdW1lbnQgcmVxdWVzdC4gVGhlIGVmZmVjdCBvZiB0aGlzCi0gICAgZGlyZWN0aXZlIG9uZSBjYW4gb2JzZXJ2ZSB1bmRlciB0aGUgcG9pbnQgIjxjb2RlPkV4YW1wbGUKLSAgICBkaXJlY3RpdmUgZGVjbGFyZWQgaGVyZTogWUVTL05PPC9jb2RlPiIuPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTwvbW9kdWxlc3lub3BzaXM+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2V4cGlyZXMuaHRtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfZXhwaXJlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGJhYjVmLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfZXhwaXJlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgMi4wLy9FTiI+Ci08SFRNTD4KLSA8SEVBRD4KLSAgPFRJVExFPkFwYWNoZSBtb2R1bGUgbW9kX2V4cGlyZXM8L1RJVExFPgotIDwvSEVBRD4KLSA8Qk9EWT4KLSAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLSAgPEgxPk1vZHVsZSBtb2RfZXhwaXJlczwvSDE+Ci0gIDxQPgotICBUaGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4gdGhlIDxDT0RFPm1vZF9leHBpcmVzLmM8L0NPREU+IGZpbGUsIGFuZAotICBpcyA8U1RST05HPm5vdDwvU1RST05HPiBjb21waWxlZCBpbiBieSBkZWZhdWx0LiAgSXQgcHJvdmlkZXMgZm9yIHRoZQotICBnZW5lcmF0aW9uIG9mIDxDT0RFPkV4cGlyZXM8L0NPREU+IGhlYWRlcnMgYWNjb3JkaW5nIHRvIHVzZXItc3BlY2lmaWVkCi0gIGNyaXRlcmlhLgotICA8L1A+Ci0gIDxIMj5TdW1tYXJ5PC9IMj4KLSAgPFA+Ci0gIFRoaXMgbW9kdWxlIGNvbnRyb2xzIHRoZSBzZXR0aW5nIG9mIHRoZSA8Q09ERT5FeHBpcmVzPC9DT0RFPiBIVFRQCi0gIGhlYWRlciBpbiBzZXJ2ZXIgcmVzcG9uc2VzLiAgVGhlIGV4cGlyYXRpb24gZGF0ZSBjYW4gc2V0IHRvIGJlCi0gIHJlbGF0aXZlIHRvIGVpdGhlciB0aGUgdGltZSB0aGUgc291cmNlIGZpbGUgd2FzIGxhc3QgbW9kaWZpZWQsIG9yIHRvCi0gIHRoZSB0aW1lIG9mIHRoZSBjbGllbnQgYWNjZXNzLgotICA8L1A+Ci0gIDxQPgotICBUaGUgPENPREU+RXhwaXJlczwvQ09ERT4gSFRUUCBoZWFkZXIgaXMgYW4gaW5zdHJ1Y3Rpb24gdG8gdGhlIGNsaWVudAotICBhYm91dCB0aGUgZG9jdW1lbnQncyB2YWxpZGl0eSBhbmQgcGVyc2lzdGVuY2UuICBJZiBjYWNoZWQsIHRoZSBkb2N1bWVudAotICBtYXkgYmUgZmV0Y2hlZCBmcm9tIHRoZSBjYWNoZSByYXRoZXIgdGhhbiBmcm9tIHRoZSBzb3VyY2UgdW50aWwgdGhpcwotICB0aW1lIGhhcyBwYXNzZWQuICBBZnRlciB0aGF0LCB0aGUgY2FjaGUgY29weSBpcyBjb25zaWRlcmVkCi0gICZxdW90O2V4cGlyZWQmcXVvdDsgYW5kIGludmFsaWQsIGFuZCBhIG5ldyBjb3B5IG11c3QgYmUgb2J0YWluZWQgZnJvbQotICB0aGUgc291cmNlLgotICA8L1A+Ci0gIDxIMj5EaXJlY3RpdmVzPC9IMj4KLSAgPFA+Ci0gIDxNRU5VPgotICAgPExJPjxBCi0gICAgICAgIEhSRUY9IiNleHBpcmVzYWN0aXZlIgotICAgICAgID5FeHBpcmVzQWN0aXZlPC9BPgotICAgPC9MST4KLSAgIDxMST48QQotICAgICAgICBIUkVGPSIjZXhwaXJlc2J5dHlwZSIKLSAgICAgICA+RXhwaXJlc0J5VHlwZTwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEKLSAgICAgICAgSFJFRj0iI2V4cGlyZXNkZWZhdWx0IgotICAgICAgID5FeHBpcmVzRGVmYXVsdDwvQT4KLSAgIDwvTEk+Ci0gIDwvTUVOVT4KLSAgPEhSPgotICA8QSBOQU1FPSJleHBpcmVzYWN0aXZlIj4KLSAgIDxIMj5FeHBpcmVzQWN0aXZlIGRpcmVjdGl2ZTwvSDI+Ci0gIDwvQT4KLSAgPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEV4cGlyZXNBY3RpdmV9IGRpcmVjdGl2ZSZndDsgLS0+Ci0gIDxQPgotICA8U1RST05HPlN5bnRheDo8L1NUUk9ORz4gRXhwaXJlc0FjdGl2ZSA8RU0+Ym9vbGVhbjwvRU0+Ci0gIDxCUj4KLSAgPFNUUk9ORz5Db250ZXh0OjwvU1RST05HPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzCi0gIDxicj4KLSAgPFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz4gSW5kZXhlcwotICA8YnI+Ci0gIDxTVFJPTkc+U3RhdHVzOjwvU1RST05HPiBFeHRlbnNpb24KLSAgPGJyPgotICA8U1RST05HPk1vZHVsZTo8L1NUUk9ORz4gbW9kX2V4cGlyZXMKLSAgPC9QPgotICA8UD4KLSAgVGhpcyBkaXJlY3RpdmUgZW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUKLSAgPENPREU+RXhwaXJlczwvQ09ERT4gaGVhZGVyIGZvciB0aGUgZG9jdW1lbnQgcmVhbG0gaW4gcXVlc3Rpb24uICAoVGhhdAotICBpcywgaWYgZm91bmQgaW4gYW4gPENPREU+Lmh0YWNjZXNzPC9DT0RFPiBmaWxlLCBmb3IgaW5zdGFuY2UsIGl0Ci0gIGFwcGxpZXMgb25seSB0byBkb2N1bWVudHMgZ2VuZXJhdGVkIGZyb20gdGhhdCBkaXJlY3RvcnkuKSAgSWYgc2V0IHRvCi0gIDxFTT48Q09ERT5PZmY8L0NPREU+PC9FTT4sIG5vIDxDT0RFPkV4cGlyZXM8L0NPREU+IGhlYWRlciB3aWxsIGJlCi0gIGdlbmVyYXRlZCBmb3IgYW55IGRvY3VtZW50IGluIHRoZSByZWFsbSAodW5sZXNzIG92ZXJyaWRkZW4gYXQgYSBsb3dlcgotICBsZXZlbCwgc3VjaCBhcyBhbiA8Q09ERT4uaHRhY2Nlc3M8L0NPREU+IGZpbGUgb3ZlcnJpZGluZyBhIHNlcnZlcgotICBjb25maWcgZmlsZSkuICBJZiBzZXQgdG8gPEVNPjxDT0RFPk9uPC9DT0RFPjwvRU0+LCB0aGUgaGVhZGVyIHdpbGwgYmUKLSAgYWRkZWQgdG8gc2VydmVkIGRvY3VtZW50cyBhY2NvcmRpbmcgdG8gdGhlIGNyaXRlcmlhIGRlZmluZWQgYnkgdGhlCi0gIDxBCi0gICBIUkVGPSJleHBpcmVzYnl0eXBlIgotICA+RXhwaXJlc0J5VHlwZTwvQT4KLSAgYW5kCi0gIDxBCi0gICBIUkVGPSIjZXhwaXJlc2RlZmF1bHQiCi0gID5FeHBpcmVzRGVmYXVsdDwvQT4KLSAgZGlyZWN0aXZlcyAoPEVNPnEudi48L0VNPikuCi0gIDwvUD4KLSAgPFA+Ci0gIE5vdGUgdGhhdCB0aGlzIGRpcmVjdGl2ZSBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCBhbgotICA8Q09ERT5FeHBpcmVzPC9DT0RFPiBoZWFkZXIgd2lsbCBiZSBnZW5lcmF0ZWQuICBJZiB0aGUgY3JpdGVyaWEgYXJlbid0Ci0gIG1ldCwgbm8gaGVhZGVyIHdpbGwgYmUgc2VudCwgYW5kIHRoZSBlZmZlY3Qgd2lsbCBiZSBhcyB0aG91Z2ggdGhpcwotICBkaXJlY3RpdmUgd2Fzbid0IGV2ZW4gc3BlY2lmaWVkLgotICA8L1A+Ci0gIDxIUj4KLSAgPEEgTkFNRT0iZXhwaXJlc2J5dHlwZSI+Ci0gICA8SDI+RXhwaXJlc0J5VHlwZSBkaXJlY3RpdmU8L0gyPgotICA8L0E+Ci0gIDwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBFeHBpcmVzQnlUeXBlfSBkaXJlY3RpdmUmZ3Q7IC0tPgotICA8UD4KLSAgPFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+IEV4cGlyZXNCeVR5cGUgPEVNPm1pbWUtdHlwZSAmbHQ7Y29kZSZndDtzZWNvbmRzPC9FTT4KLSAgPEJSPgotICA8U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3MKLSAgPGJyPgotICA8U1RST05HPk92ZXJyaWRlOjwvU1RST05HPiBJbmRleGVzCi0gIDxicj4KLSAgPFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+IEV4dGVuc2lvbgotICA8YnI+Ci0gIDxTVFJPTkc+TW9kdWxlOjwvU1RST05HPiBtb2RfZXhwaXJlcwotICA8L1A+Ci0gIDxQPgotICBUaGlzIGRpcmVjdGl2ZSBkZWZpbmVzIHRoZSB2YWx1ZSBvZiB0aGUgPENPREU+RXhwaXJlczwvQ09ERT4gaGVhZGVyCi0gIGdlbmVyYXRlZCBmb3IgZG9jdW1lbnRzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSAoPEVNPmUuZy48L0VNPiwKLSAgPENPREU+dGV4dC9odG1sPC9DT0RFPikuICBUaGUgc2Vjb25kIGFyZ3VtZW50IHNldHMgdGhlIG51bWJlciBvZgotICBzZWNvbmRzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byBhIGJhc2UgdGltZSB0byBjb25zdHJ1Y3QgdGhlIGV4cGlyYXRpb24KLSAgZGF0ZS4KLSAgPC9QPgotICA8UD4KLSAgVGhlIGJhc2UgdGltZSBpcyBlaXRoZXIgdGhlIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIGZpbGUsIG9yIHRoZQotICB0aW1lIG9mIHRoZSBjbGllbnQncyBhY2Nlc3MgdG8gdGhlIGRvY3VtZW50LiAgV2hpY2ggc2hvdWxkIGJlIHVzZWQgaXMKLSAgc3BlY2lmaWVkIGJ5IHRoZSA8Q09ERT48RU0+Jmx0O2NvZGUmZ3Q7PC9FTT48L0NPREU+IGZpZWxkOwotICA8U1RST05HPk08L1NUUk9ORz4gbWVhbnMgdGhhdCB0aGUgZmlsZSdzIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgc2hvdWxkCi0gIGJlIHVzZWQgYXMgdGhlIGJhc2UgdGltZSwgYW5kIDxTVFJPTkc+QTwvU1RST05HPiBtZWFucyB0aGUgY2xpZW50J3MKLSAgYWNjZXNzIHRpbWUgc2hvdWxkIGJlIHVzZWQuCi0gIDwvUD4KLSAgPFA+Ci0gIFRoZSBkaWZmZXJlbmNlIGluIGVmZmVjdCBpcyBzdWJ0bGUuICBJZiA8RU0+TTwvRU0+IGlzIHVzZWQsIGFsbCBjdXJyZW50Ci0gIGNvcGllcyBvZiB0aGUgZG9jdW1lbnQgaW4gYWxsIGNhY2hlcyB3aWxsIGV4cGlyZSBhdCB0aGUgc2FtZSB0aW1lLAotICB3aGljaCBjYW4gYmUgZ29vZCBmb3Igc29tZXRoaW5nIGxpa2UgYSB3ZWVrbHkgbm90aWNlIHRoYXQncyBhbHdheXMKLSAgZm91bmQgYXQgdGhlIHNhbWUgVVJMLiAgSWYgPEVNPkE8L0VNPiBpcyB1c2VkLCB0aGUgZGF0ZSBvZiBleHBpcmF0aW9uCi0gIGlzIGRpZmZlcmVudCBmb3IgZWFjaCBjbGllbnQ7IHRoaXMgY2FuIGJlIGdvb2QgZm9yIGltYWdlIGZpbGVzIHRoYXQKLSAgZG9uJ3QgY2hhbmdlIHZlcnkgb2Z0ZW4sIHBhcnRpY3VsYXJseSBmb3IgYSBzZXQgb2YgcmVsYXRlZCBkb2N1bWVudHMKLSAgdGhhdCBhbGwgcmVmZXIgdG8gdGhlIHNhbWUgaW1hZ2VzICg8RU0+aS5lLjwvRU0+LCB0aGUgaW1hZ2VzIHdpbGwgYmUKLSAgYWNjZXNzZWQgcmVwZWF0ZWRseSB3aXRoaW4gYSByZWxhdGl2ZWx5IHNob3J0IHRpbWVzcGFuKS4KLSAgPC9QPgotICA8UD4KLSAgPFNUUk9ORz5FeGFtcGxlOjwvU1RST05HPgotICA8L1A+Ci0gIDxQPgotICA8UFJFPgotICAgRXhwaXJlc0FjdGl2ZSBPbiAgICAgICAgICAgICAgICAgICMgZW5hYmxlIGV4cGlyYXRpb25zCi0gICBFeHBpcmVzQnlUeXBlIGltYWdlL2dpZiBBMjU5MjAwMCAgIyBleHBpcmUgR0lGIGltYWdlcyBhZnRlciBhIG1vbnRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgaW4gdGhlIGNsaWVudCdzIGNhY2hlCi0gICBFeHBpcmVzQnlUeXBlIHRleHQvaHRtbCBNNjA0ODAwICAgIyBIVE1MIGRvY3VtZW50cyBhcmUgZ29vZCBmb3IgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIHdlZWsgZnJvbSB0aGUgdGltZSB0aGV5IHdlcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBjaGFuZ2VkLCBwZXJpb2QKLSAgPC9QUkU+Ci0gIDwvUD4KLSAgPFA+Ci0gIE5vdGUgdGhhdCB0aGlzIGRpcmVjdGl2ZSBvbmx5IGhhcyBlZmZlY3QgaWYgPENPREU+RXhwaXJlc0FjdGl2ZQotICBPbjwvQ09ERT4gaGFzIGJlZW4gc3BlY2lmaWVkLiAgSXQgb3ZlcnJpZGVzLCBmb3IgdGhlIHNwZWNpZmllZCBNSU1FCi0gIHR5cGUgPEVNPm9ubHk8L0VNPiwgYW55IGV4cGlyYXRpb24gZGF0ZSBzZXQgYnkgdGhlCi0gIDxBCi0gICBIUkVGPSIjZXhwaXJlc2RlZmF1bHQiCi0gID5FeHBpcmVzRGVmYXVsdDwvQT4KLSAgZGlyZWN0aXZlLgotICA8L1A+Ci0gIDxIUj4KLSAgPEEgTkFNRT0iZXhwaXJlc2RlZmF1bHQiPgotICAgPEgyPkV4cGlyZXNEZWZhdWx0IGRpcmVjdGl2ZTwvSDI+Ci0gIDwvQT4KLSAgPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEV4cGlyZXNEZWZhdWx0fSBkaXJlY3RpdmUmZ3Q7IC0tPgotICA8UD4KLSAgPFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+IEV4cGlyZXNEZWZhdWx0IDxFTT4mbHQ7Y29kZSZndDtzZWNvbmRzPC9FTT4KLSAgPEJSPgotICA8U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3MKLSAgPGJyPgotICA8U1RST05HPk92ZXJyaWRlOjwvU1RST05HPiBJbmRleGVzCi0gIDxicj4KLSAgPFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+IEV4dGVuc2lvbgotICA8YnI+Ci0gIDxTVFJPTkc+TW9kdWxlOjwvU1RST05HPiBtb2RfZXhwaXJlcwotICA8L1A+Ci0gIDxQPgotICBUaGlzIGRpcmVjdGl2ZSBzZXRzIHRoZSBkZWZhdWx0IGFsZ29yaXRobSBmb3IgY2FsY3VsYXRpbmcgdGhlCi0gIGV4cGlyYXRpb24gdGltZSBmb3IgYWxsIGRvY3VtZW50cyBpbiB0aGUgYWZmZWN0ZWQgcmVhbG0uICBJdCBjYW4gYmUKLSAgb3ZlcnJpZGRlbiBvbiBhIHR5cGUtYnktdHlwZSBiYXNpcyBieSB0aGUKLSAgPEEKLSAgIEhSRUY9IiNleHBpcmVzYnl0eXBlIgotICA+RXhwaXJlc0J5VHlwZTwvQT4KLSAgZGlyZWN0aXZlLiAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGF0IGRpcmVjdGl2ZSBmb3IgZGV0YWlscyBhYm91dAotICB0aGUgc3ludGF4IG9mIHRoZSBhcmd1bWVudC4KLSAgPC9QPgotICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotIDwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfZXhwaXJlcy54bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2V4cGlyZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGRkYmUzLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfZXhwaXJlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgbW9kdWxlc3lub3BzaXMgU1lTVEVNICIuLi9zdHlsZS9tb2R1bGVzeW5vcHNpcy5kdGQiPgotPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iLi4vc3R5bGUvbWFudWFsLnhzbCI/PgotPG1vZHVsZXN5bm9wc2lzPgotCi08bmFtZT5tb2RfZXhwaXJlczwvbmFtZT4KLTxkZXNjcmlwdGlvbj5HZW5lcmF0aW9uIG9mCi0gICAgPGNvZGU+RXhwaXJlczwvY29kZT4gSFRUUCBoZWFkZXJzIGFjY29yZGluZyB0byB1c2VyLXNwZWNpZmllZAotICAgIGNyaXRlcmlhPC9kZXNjcmlwdGlvbj4KLTxzdGF0dXM+RXh0ZW5zaW9uPC9zdGF0dXM+Ci08c291cmNlZmlsZT5tb2RfZXhwaXJlcy5jPC9zb3VyY2VmaWxlPgotPGlkZW50aWZpZXI+ZXhwaXJlc19tb2R1bGU8L2lkZW50aWZpZXI+Ci0KLTxzdW1tYXJ5PgotICAgIDxwPlRoaXMgbW9kdWxlIGNvbnRyb2xzIHRoZSBzZXR0aW5nIG9mIHRoZSA8Y29kZT5FeHBpcmVzPC9jb2RlPgotICAgIEhUVFAgaGVhZGVyIGluIHNlcnZlciByZXNwb25zZXMuIFRoZSBleHBpcmF0aW9uIGRhdGUgY2FuIHNldCB0bwotICAgIGJlIHJlbGF0aXZlIHRvIGVpdGhlciB0aGUgdGltZSB0aGUgc291cmNlIGZpbGUgd2FzIGxhc3QKLSAgICBtb2RpZmllZCwgb3IgdG8gdGhlIHRpbWUgb2YgdGhlIGNsaWVudCBhY2Nlc3MuPC9wPgotCi0gICAgPHA+VGhlIDxjb2RlPkV4cGlyZXM8L2NvZGU+IEhUVFAgaGVhZGVyIGlzIGFuIGluc3RydWN0aW9uIHRvCi0gICAgdGhlIGNsaWVudCBhYm91dCB0aGUgZG9jdW1lbnQncyB2YWxpZGl0eSBhbmQgcGVyc2lzdGVuY2UuIElmCi0gICAgY2FjaGVkLCB0aGUgZG9jdW1lbnQgbWF5IGJlIGZldGNoZWQgZnJvbSB0aGUgY2FjaGUgcmF0aGVyIHRoYW4KLSAgICBmcm9tIHRoZSBzb3VyY2UgdW50aWwgdGhpcyB0aW1lIGhhcyBwYXNzZWQuIEFmdGVyIHRoYXQsIHRoZQotICAgIGNhY2hlIGNvcHkgaXMgY29uc2lkZXJlZCAiZXhwaXJlZCIgYW5kIGludmFsaWQsIGFuZCBhIG5ldyBjb3B5Ci0gICAgbXVzdCBiZSBvYnRhaW5lZCBmcm9tIHRoZSBzb3VyY2UuPC9wPgotPC9zdW1tYXJ5PgotCi08c2VjdGlvbiBpZD0iQWx0U3luIj48dGl0bGU+QWx0ZXJuYXRlIEludGVydmFsCi0gICAgU3ludGF4PC90aXRsZT4KLQotICAgIDxwPlRoZSA8ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX2V4cGlyZXMiPkV4cGlyZXNEZWZhdWx0PC9kaXJlY3RpdmU+IGFuZCAKLSAgICA8ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX2V4cGlyZXMiPkV4cGlyZXNCeVR5cGU8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlcwotICAgIGNhbiBhbHNvIGJlIGRlZmluZWQgaW4gYSBtb3JlIHJlYWRhYmxlIHN5bnRheCBvZiB0aGUgZm9ybTo8L3A+Ci0KLTxleGFtcGxlPgotICAgICAgIEV4cGlyZXNEZWZhdWx0ICImbHQ7YmFzZSZndDsgW3BsdXNdIHsmbHQ7bnVtJmd0OwotICAgICAgJmx0O3R5cGUmZ3Q7fSoiPGJyIC8+Ci0gICAgICAgRXhwaXJlc0J5VHlwZSB0eXBlL2VuY29kaW5nICImbHQ7YmFzZSZndDsgW3BsdXNdCi0gICAgICB7Jmx0O251bSZndDsgJmx0O3R5cGUmZ3Q7fSoiCi08L2V4YW1wbGU+Ci0KLSAgICA8cD53aGVyZSAmbHQ7YmFzZSZndDsgaXMgb25lIG9mOjwvcD4KLQotICAgIDx1bD4KLSAgICAgIDxsaT48Y29kZT5hY2Nlc3M8L2NvZGU+PC9saT4KLQotICAgICAgPGxpPjxjb2RlPm5vdzwvY29kZT4gKGVxdWl2YWxlbnQgdG8KLSAgICAgICc8Y29kZT5hY2Nlc3M8L2NvZGU+Jyk8L2xpPgotCi0gICAgICA8bGk+PGNvZGU+bW9kaWZpY2F0aW9uPC9jb2RlPjwvbGk+Ci0gICAgPC91bD4KLQotICAgIDxwPlRoZSAnPGNvZGU+cGx1czwvY29kZT4nIGtleXdvcmQgaXMgb3B0aW9uYWwuICZsdDtudW0mZ3Q7Ci0gICAgc2hvdWxkIGJlIGFuIGludGVnZXIgdmFsdWUgW2FjY2VwdGFibGUgdG8gPGNvZGU+YXRvaSgpPC9jb2RlPl0sCi0gICAgYW5kICZsdDt0eXBlJmd0OyBpcyBvbmUgb2Y6PC9wPgotCi0gICAgPHVsPgotICAgICAgPGxpPjxjb2RlPnllYXJzPC9jb2RlPjwvbGk+Ci0KLSAgICAgIDxsaT48Y29kZT5tb250aHM8L2NvZGU+PC9saT4KLQotICAgICAgPGxpPjxjb2RlPndlZWtzPC9jb2RlPjwvbGk+Ci0KLSAgICAgIDxsaT48Y29kZT5kYXlzPC9jb2RlPjwvbGk+Ci0KLSAgICAgIDxsaT48Y29kZT5ob3VyczwvY29kZT48L2xpPgotCi0gICAgICA8bGk+PGNvZGU+bWludXRlczwvY29kZT48L2xpPgotCi0gICAgICA8bGk+PGNvZGU+c2Vjb25kczwvY29kZT48L2xpPgotICAgIDwvdWw+Ci0KLSAgICA8cD5Gb3IgZXhhbXBsZSwgYW55IG9mIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlcyBjYW4gYmUgdXNlZCB0bwotICAgIG1ha2UgZG9jdW1lbnRzIGV4cGlyZSAxIG1vbnRoIGFmdGVyIGJlaW5nIGFjY2Vzc2VkLCBieQotICAgIGRlZmF1bHQ6PC9wPgotCi08ZXhhbXBsZT4KLSAgICAgICBFeHBpcmVzRGVmYXVsdCAiYWNjZXNzIHBsdXMgMSBtb250aCI8YnIgLz4KLSAgICAgICBFeHBpcmVzRGVmYXVsdCAiYWNjZXNzIHBsdXMgNCB3ZWVrcyI8YnIgLz4KLSAgICAgICBFeHBpcmVzRGVmYXVsdCAiYWNjZXNzIHBsdXMgMzAgZGF5cyIKLTwvZXhhbXBsZT4KLQotICAgIDxwPlRoZSBleHBpcnkgdGltZSBjYW4gYmUgZmluZS10dW5lZCBieSBhZGRpbmcgc2V2ZXJhbAotICAgICcmbHQ7bnVtJmd0OyAmbHQ7dHlwZSZndDsnIGNsYXVzZXM6PC9wPgotCi08ZXhhbXBsZT4KLUV4cGlyZXNCeVR5cGUgdGV4dC9odG1sICJhY2Nlc3MgcGx1cyAxIG1vbnRoIDE1Ci0gICAgICBkYXlzIDIgaG91cnMiPGJyIC8+Ci0gICAgICAgRXhwaXJlc0J5VHlwZSBpbWFnZS9naWYgIm1vZGlmaWNhdGlvbiBwbHVzIDUgaG91cnMgMwotICAgICAgbWludXRlcyIKLTwvZXhhbXBsZT4KLQotICAgIDxwPk5vdGUgdGhhdCBpZiB5b3UgdXNlIGEgbW9kaWZpY2F0aW9uIGRhdGUgYmFzZWQgc2V0dGluZywgdGhlCi0gICAgRXhwaXJlcyBoZWFkZXIgd2lsbCA8c3Ryb25nPm5vdDwvc3Ryb25nPiBiZSBhZGRlZCB0byBjb250ZW50Ci0gICAgdGhhdCBkb2VzIG5vdCBjb21lIGZyb20gYSBmaWxlIG9uIGRpc2suIFRoaXMgaXMgZHVlIHRvIHRoZSBmYWN0Ci0gICAgdGhhdCB0aGVyZSBpcyBubyBtb2RpZmljYXRpb24gdGltZSBmb3Igc3VjaCBjb250ZW50LjwvcD4KLTwvc2VjdGlvbj4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+RXhwaXJlc0FjdGl2ZTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5FbmFibGVzIGdlbmVyYXRpb24gb2YgPGNvZGU+RXhwaXJlczwvY29kZT4gaGVhZGVyczwvZGVzY3JpcHRpb24+Ci08c3ludGF4PkV4cGlyZXNBY3RpdmUgT258T2ZmPC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD48Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+Ci08Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT5JbmRleGVzPC9vdmVycmlkZT4KLQotPHVzYWdlPgotICAgIDxwPlRoaXMgZGlyZWN0aXZlIGVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGdlbmVyYXRpb24gb2YgdGhlCi0gICAgPGNvZGU+RXhwaXJlczwvY29kZT4gaGVhZGVyIGZvciB0aGUgZG9jdW1lbnQgcmVhbG0gaW4gcXVlc3Rpb24uCi0gICAgKFRoYXQgaXMsIGlmIGZvdW5kIGluIGFuIDxjb2RlPi5odGFjY2VzczwvY29kZT4gZmlsZSwgZm9yCi0gICAgaW5zdGFuY2UsIGl0IGFwcGxpZXMgb25seSB0byBkb2N1bWVudHMgZ2VuZXJhdGVkIGZyb20gdGhhdAotICAgIGRpcmVjdG9yeS4pIElmIHNldCB0byA8ZW0+PGNvZGU+T2ZmPC9jb2RlPjwvZW0+LCBubwotICAgIDxjb2RlPkV4cGlyZXM8L2NvZGU+IGhlYWRlciB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgYW55IGRvY3VtZW50Ci0gICAgaW4gdGhlIHJlYWxtICh1bmxlc3Mgb3ZlcnJpZGRlbiBhdCBhIGxvd2VyIGxldmVsLCBzdWNoIGFzIGFuCi0gICAgPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBmaWxlIG92ZXJyaWRpbmcgYSBzZXJ2ZXIgY29uZmlnIGZpbGUpLgotICAgIElmIHNldCB0byA8ZW0+PGNvZGU+T248L2NvZGU+PC9lbT4sIHRoZSBoZWFkZXIgd2lsbCBiZSBhZGRlZCB0bwotICAgIHNlcnZlZCBkb2N1bWVudHMgYWNjb3JkaW5nIHRvIHRoZSBjcml0ZXJpYSBkZWZpbmVkIGJ5IHRoZSAKLSAgICA8ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX2V4cGlyZXMiPkV4cGlyZXNCeVR5cGU8L2RpcmVjdGl2ZT4gYW5kIAotICAgIDxkaXJlY3RpdmUgbW9kdWxlPSJtb2RfZXhwaXJlcyI+RXhwaXJlc0RlZmF1bHQ8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlcwotICAgICg8ZW0+cS52LjwvZW0+KS48L3A+Ci0KLSAgICA8cD5Ob3RlIHRoYXQgdGhpcyBkaXJlY3RpdmUgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgYW4KLSAgICA8Y29kZT5FeHBpcmVzPC9jb2RlPiBoZWFkZXIgd2lsbCBiZSBnZW5lcmF0ZWQuIElmIHRoZSBjcml0ZXJpYQotICAgIGFyZW4ndCBtZXQsIG5vIGhlYWRlciB3aWxsIGJlIHNlbnQsIGFuZCB0aGUgZWZmZWN0IHdpbGwgYmUgYXMKLSAgICB0aG91Z2ggdGhpcyBkaXJlY3RpdmUgd2Fzbid0IGV2ZW4gc3BlY2lmaWVkLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5FeHBpcmVzQnlUeXBlPC9uYW1lPgotPGRlc2NyaXB0aW9uPlZhbHVlIG9mIHRoZSA8Y29kZT5FeHBpcmVzPC9jb2RlPiBoZWFkZXIgY29uZmlndXJlZAotYnkgTUlNRSB0eXBlPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+RXhwaXJlc0J5VHlwZQotICAgIDxlbT5NSU1FLXR5cGUgJmx0O2NvZGUmZ3Q7c2Vjb25kczwvZW0+PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD48Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+Ci08Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT5JbmRleGVzPC9vdmVycmlkZT4KLQotPHVzYWdlPgotICAgIDxwPlRoaXMgZGlyZWN0aXZlIGRlZmluZXMgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5FeHBpcmVzPC9jb2RlPgotICAgIGhlYWRlciBnZW5lcmF0ZWQgZm9yIGRvY3VtZW50cyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUKLSAgICAoPGVtPmUuZy48L2VtPiwgPGNvZGU+dGV4dC9odG1sPC9jb2RlPikuIFRoZSBzZWNvbmQgYXJndW1lbnQKLSAgICBzZXRzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gYSBiYXNlIHRpbWUgdG8KLSAgICBjb25zdHJ1Y3QgdGhlIGV4cGlyYXRpb24gZGF0ZS48L3A+Ci0KLSAgICA8cD5UaGUgYmFzZSB0aW1lIGlzIGVpdGhlciB0aGUgbGFzdCBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUKLSAgICBmaWxlLCBvciB0aGUgdGltZSBvZiB0aGUgY2xpZW50J3MgYWNjZXNzIHRvIHRoZSBkb2N1bWVudC4gV2hpY2gKLSAgICBzaG91bGQgYmUgdXNlZCBpcyBzcGVjaWZpZWQgYnkgdGhlCi0gICAgPGNvZGU+PGVtPiZsdDtjb2RlJmd0OzwvZW0+PC9jb2RlPiBmaWVsZDsgPHN0cm9uZz5NPC9zdHJvbmc+Ci0gICAgbWVhbnMgdGhhdCB0aGUgZmlsZSdzIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgc2hvdWxkIGJlIHVzZWQgYXMKLSAgICB0aGUgYmFzZSB0aW1lLCBhbmQgPHN0cm9uZz5BPC9zdHJvbmc+IG1lYW5zIHRoZSBjbGllbnQncyBhY2Nlc3MKLSAgICB0aW1lIHNob3VsZCBiZSB1c2VkLjwvcD4KLQotICAgIDxwPlRoZSBkaWZmZXJlbmNlIGluIGVmZmVjdCBpcyBzdWJ0bGUuIElmIDxlbT5NPC9lbT4gaXMgdXNlZCwKLSAgICBhbGwgY3VycmVudCBjb3BpZXMgb2YgdGhlIGRvY3VtZW50IGluIGFsbCBjYWNoZXMgd2lsbCBleHBpcmUgYXQKLSAgICB0aGUgc2FtZSB0aW1lLCB3aGljaCBjYW4gYmUgZ29vZCBmb3Igc29tZXRoaW5nIGxpa2UgYSB3ZWVrbHkKLSAgICBub3RpY2UgdGhhdCdzIGFsd2F5cyBmb3VuZCBhdCB0aGUgc2FtZSBVUkwuIElmIDxlbT5BPC9lbT4gaXMKLSAgICB1c2VkLCB0aGUgZGF0ZSBvZiBleHBpcmF0aW9uIGlzIGRpZmZlcmVudCBmb3IgZWFjaCBjbGllbnQ7IHRoaXMKLSAgICBjYW4gYmUgZ29vZCBmb3IgaW1hZ2UgZmlsZXMgdGhhdCBkb24ndCBjaGFuZ2UgdmVyeSBvZnRlbiwKLSAgICBwYXJ0aWN1bGFybHkgZm9yIGEgc2V0IG9mIHJlbGF0ZWQgZG9jdW1lbnRzIHRoYXQgYWxsIHJlZmVyIHRvCi0gICAgdGhlIHNhbWUgaW1hZ2VzICg8ZW0+aS5lLjwvZW0+LCB0aGUgaW1hZ2VzIHdpbGwgYmUgYWNjZXNzZWQKLSAgICByZXBlYXRlZGx5IHdpdGhpbiBhIHJlbGF0aXZlbHkgc2hvcnQgdGltZXNwYW4pLjwvcD4KLQotICAgIDxwPjxzdHJvbmc+RXhhbXBsZTo8L3N0cm9uZz48L3A+Ci08ZXhhbXBsZT4KLSMgZW5hYmxlIGV4cGlyYXRpb25zPGJyIC8+Ci1FeHBpcmVzQWN0aXZlIE9uPGJyIC8+Ci0jIGV4cGlyZSBHSUYgaW1hZ2VzIGFmdGVyIGEgbW9udGggaW4gdGhlIGNsaWVudCdzIGNhY2hlPGJyIC8+Ci1FeHBpcmVzQnlUeXBlIGltYWdlL2dpZiBBMjU5MjAwMDxiciAvPgotIyBIVE1MIGRvY3VtZW50cyBhcmUgZ29vZCBmb3IgYSB3ZWVrIGZyb20gdGhlIHRpbWUgdGhleSB3ZXJlIGNoYW5nZWQ8YnIgLz4KLUV4cGlyZXNCeVR5cGUgdGV4dC9odG1sIE02MDQ4MDAKLTwvZXhhbXBsZT4KLQotICAgIDxwPk5vdGUgdGhhdCB0aGlzIGRpcmVjdGl2ZSBvbmx5IGhhcyBlZmZlY3QgaWYKLSAgICA8Y29kZT5FeHBpcmVzQWN0aXZlIE9uPC9jb2RlPiBoYXMgYmVlbiBzcGVjaWZpZWQuIEl0IG92ZXJyaWRlcywKLSAgICBmb3IgdGhlIHNwZWNpZmllZCBNSU1FIHR5cGUgPGVtPm9ubHk8L2VtPiwgYW55IGV4cGlyYXRpb24gZGF0ZQotICAgIHNldCBieSB0aGUgPGRpcmVjdGl2ZSBtb2R1bGU9Im1vZF9leHBpcmVzIj5FeHBpcmVzRGVmYXVsdDwvZGlyZWN0aXZlPgotICAgIGRpcmVjdGl2ZS48L3A+Ci0KLSAgICA8cD5Zb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgZXhwaXJhdGlvbiB0aW1lIGNhbGN1bGF0aW9uIHVzaW5nCi0gICAgYW4gPGEgaHJlZj0iI0FsdFN5biI+YWx0ZXJuYXRlIHN5bnRheDwvYT4sIGRlc2NyaWJlZCBlYXJsaWVyIGluCi0gICAgdGhpcyBkb2N1bWVudC48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+RXhwaXJlc0RlZmF1bHQ8L25hbWU+Ci08ZGVzY3JpcHRpb24+RGVmYXVsdCBhbGdvcml0aG0gZm9yIGNhbGN1bGF0aW5nIGV4cGlyYXRpb24gdGltZTwvZGVzY3JpcHRpb24+Ci08c3ludGF4PkV4cGlyZXNEZWZhdWx0IDxlbT4mbHQ7Y29kZSZndDtzZWNvbmRzPC9lbT48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PgotPGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0Pjxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD4KLTxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPkluZGV4ZXM8L292ZXJyaWRlPgotCi08dXNhZ2U+Ci0gICAgPHA+VGhpcyBkaXJlY3RpdmUgc2V0cyB0aGUgZGVmYXVsdCBhbGdvcml0aG0gZm9yIGNhbGN1bGF0aW5nIHRoZQotICAgIGV4cGlyYXRpb24gdGltZSBmb3IgYWxsIGRvY3VtZW50cyBpbiB0aGUgYWZmZWN0ZWQgcmVhbG0uIEl0IGNhbiBiZQotICAgIG92ZXJyaWRkZW4gb24gYSB0eXBlLWJ5LXR5cGUgYmFzaXMgYnkgdGhlIDxkaXJlY3RpdmUKLSAgICBtb2R1bGU9Im1vZF9leHBpcmVzIj5FeHBpcmVzQnlUeXBlPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZS4gU2VlIHRoZQotICAgIGRlc2NyaXB0aW9uIG9mIHRoYXQgZGlyZWN0aXZlIGZvciBkZXRhaWxzIGFib3V0IHRoZSBzeW50YXggb2YgdGhlCi0gICAgYXJndW1lbnQsIGFuZCB0aGUgPGEgaHJlZj0iI0FsdFN5biI+YWx0ZXJuYXRlIHN5bnRheDwvYT4KLSAgICBkZXNjcmlwdGlvbiBhcyB3ZWxsLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotPC9tb2R1bGVzeW5vcHNpcz4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9leHRfZmlsdGVyLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2V4dF9maWx0ZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg4Njc4Mi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX2V4dF9maWx0ZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLSA8SEVBRD4KLSAgPFRJVExFPkFwYWNoZSBtb2R1bGUgbW9kX2V4dF9maWx0ZXI8L1RJVExFPgotIDwvSEVBRD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLSA8Qk9EWQotICBCR0NPTE9SPSIjRkZGRkZGIgotICBURVhUPSIjMDAwMDAwIgotICBMSU5LPSIjMDAwMEZGIgotICBWTElOSz0iIzAwMDA4MCIKLSAgQUxJTks9IiNGRjAwMDAiCi0gPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLSAgPEgxIEFMSUdOPSJDRU5URVIiPk1vZHVsZSBtb2RfZXh0X2ZpbHRlcjwvSDE+Ci0KLSAgPFA+Ci0gIFRoaXMgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbiB0aGUgPENPREU+bW9kX2V4dF9maWx0ZXIuYzwvQ09ERT4gZmlsZSwgd2l0aAotICBBcGFjaGUgMi4wIGFuZCBsYXRlci4gSXQgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gcGFzcyB0aGUgcmVzcG9uc2UgYm9keQotICB0aHJvdWdoIGFuIGV4dGVybmFsIHByb2dyYW0gYmVmb3JlIGRlbGl2ZXJpbmcgdG8gdGhlIGNsaWVudC4KLSAgPENPREU+bW9kX2V4dF9maWx0ZXI8L0NPREU+IGlzIG5vdCBjb21waWxlZCBpbnRvIHRoZSBzZXJ2ZXIgYnkgZGVmYXVsdC4KLSAgPC9QPgotCi0gIDxIMj5TdW1tYXJ5PC9IMj4KLSAgPFA+Ci0gIFRoaXMgaXMgYW4gPFNUUk9ORz5leHBlcmltZW50YWw8L1NUUk9ORz4gbW9kdWxlIGFuZCBzaG91bGQgYmUgdXNlZCB3aXRoCi0gIGNhcmUuICBUZXN0IHlvdXIgPENPREU+bW9kX2V4dF9maWx0ZXI8L0NPREU+IGNvbmZpZ3VyYXRpb24gY2FyZWZ1bGx5IHRvCi0gIGVuc3VyZSB0aGF0IGl0IHBlcmZvcm1zIHRoZSBkZXNpcmVkIGZ1bmN0aW9uLiAgWW91IG1heSB3aXNoIHRvIHJldmlldwotICBYWFggZm9yIGJhY2tncm91bmQgb24gdGhlIEFwYWNoZSBmaWx0ZXJpbmcgbW9kZWwuCi0gIDwvUD4KLQotICA8UD4KLSAgPENPREU+bW9kX2V4dF9maWx0ZXI8L0NPREU+IHByZXNlbnRzIGEgc2ltcGxlIGFuZCBmYW1pbGlhciBwcm9ncmFtbWluZyAKLSAgbW9kZWwgZm9yIGZpbHRlcnMuICBXaXRoIHRoaXMgbW9kdWxlLCBhIHByb2dyYW0gd2hpY2ggcmVhZHMgZnJvbSBzdGRpbiBhbmQgCi0gIHdyaXRlcyB0byBzdGRvdXQgKGkuZS4sIGEgVW5peC1zdHlsZSBmaWx0ZXIgY29tbWFuZCkgY2FuIGJlIGEgZmlsdGVyIGZvciAKLSAgQXBhY2hlLiAgVGhpcyBmaWx0ZXJpbmcgbWVjaGFuaXNtIGlzIG11Y2ggc2xvd2VyIHRoYW4gdXNpbmcgYSBmaWx0ZXIgd2hpY2gKLSAgaXMgc3BlY2lhbGx5IHdyaXR0ZW4gZm9yIHRoZSBBcGFjaGUgQVBJIGFuZCBydW5zIGluc2lkZSBvZiB0aGUgQXBhY2hlIAotICBzZXJ2ZXIgcHJvY2VzcywgYnV0IGl0IGRvZXMgaGF2ZSB0aGUgZm9sbG93aW5nIGJlbmVmaXRzOgotICA8L1A+Ci0KLSAgPFVMPgotICAgIDxMST50aGUgcHJvZ3JhbW1pbmcgbW9kZWwgaXMgbXVjaCBzaW1wbGVyCi0gICAgPExJPmFueSBwcm9ncmFtbWluZy9zY3JpcHRpbmcgbGFuZ3VhZ2UgY2FuIGJlIHVzZWQsIHByb3ZpZGVkIHRoYXQKLSAgICBpdCBhbGxvd3MgdGhlIHByb2dyYW0gdG8gcmVhZCBmcm9tIHN0YW5kYXJkIGlucHV0IGFuZCB3cml0ZSB0byBzdGFuZGFyZCAKLSAgICBvdXRwdXQKLSAgICA8TEk+ZXhpc3RpbmcgcHJvZ3JhbXMgY2FuIGJlIHVzZWQgdW5tb2RpZmllZCBhcyBBcGFjaGUgZmlsdGVycwotICA8L1VMPgotCi0gIDxQPgotICBFdmVuIHdoZW4gdGhlIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcyBhcmUgbm90IHN1aXRhYmxlIGZvciBwcm9kdWN0aW9uCi0gIHVzZSwgPENPREU+bW9kX2V4dF9maWx0ZXI8L0NPREU+IGNhbiBiZSB1c2VkIGFzIGEgcHJvdG90eXBlIGVudmlyb25tZW50Ci0gIGZvciBmaWx0ZXJzLgotICA8L1A+Ci0KLSAgPEgyPkRpcmVjdGl2ZXM8L0gyPgotICA8VUw+Ci0gICA8TEk+PEEgSFJFRj0iI2V4dGZpbHRlcmRlZmluZSI+RXh0RmlsdGVyRGVmaW5lPC9BPgotICAgPExJPjxBIEhSRUY9IiNleHRmaWx0ZXJvcHRpb25zIj5FeHRGaWx0ZXJPcHRpb25zPC9BPgotICAgPC9MST4KLSAgPC9VTD4KLQotICA8SFI+Ci0KLSAgPEgyPjxBIE5BTUU9ImV4dGZpbHRlcmRlZmluZSI+RXh0RmlsdGVyRGVmaW5lPC9BPjwvSDI+Ci0gIDxQPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEV4dEZpbHRlckRlZmluZSA8RU0+ZmlsdGVybmFtZTwvRU0+IDxFTT5wYXJhbWV0ZXJzPC9FTT4KLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPEVNPk5vbmU8L0VNPgotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBub25lCi0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBFeHBlcmltZW50YWwKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9leHRfZmlsdGVyCi0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IE9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZSAyLjAgb3IgbGF0ZXIKLQotICA8UD4KLSAgVGhlIDxDT0RFPkV4dEZpbHRlckRlZmluZTwvQ09ERT4gZGlyZWN0aXZlIGRlZmluZXMgdGhlIGNoYXJhY3RlcmlzdGljcyBvZgotICBhbiBleHRlcm5hbCBmaWx0ZXIsIGluY2x1ZGluZyB0aGUgcHJvZ3JhbSB0byBydW4gYW5kIGl0cyBhcmd1bWVudHMuCi0gIDwvUD4KLQotICA8UD4KLSAgPEVNPmZpbHRlcm5hbWU8L0VNPiBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGZpbHRlciBiZWluZyBkZWZpbmVkLiAgVGhpcyBuYW1lIAotICBjYW4gdGhlbiBiZSB1c2VkIGluIEFkZE91dHB1dEZpbHRlciBkaXJlY3RpdmVzLiAgSXQgbXVzdCBiZSB1bmlxdWUgYW1vbmcgYWxsCi0gIHJlZ2lzdGVyZWQgZmlsdGVycy4gIDxFTT5BdCB0aGUgcHJlc2VudCB0aW1lLCBubyBlcnJvciBpcyByZXBvcnRlZCBieSB0aGUKLSAgcmVnaXN0ZXItZmlsdGVyIEFQSSwgc28gYSBwcm9ibGVtIHdpdGggZHVwbGljYXRlIG5hbWVzIGlzbid0IHJlcG9ydGVkIHRvIHRoZSAKLSAgdXNlci48L0VNPgotICA8L1A+Ci0KLSAgPFA+Ci0gIFN1YnNlcXVlbnQgcGFyYW1ldGVycyBjYW4gYXBwZWFyIGluIGFueSBvcmRlciBhbmQgZGVmaW5lIHRoZSBleHRlcm5hbCBjb21tYW5kIAotICB0byBydW4gYW5kIGNlcnRhaW4gb3RoZXIgY2hhcmFjdGVyaXN0aWNzLiAgVGhlIG9ubHkgcmVxdWlyZWQgcGFyYW1ldGVyIGlzCi0gIDxFTT5jbWQ9PC9FTT4uICBUaGVzZSBwYXJhbWV0ZXJzIGFyZToKLSAgPC9QPgotCi0gIDxETD4KLSAgPERUPmNtZD08RU0+Y21kbGluZTwvRU0+Ci0gIDxERD4KLSAgVGhlIDxTQU1QPmNtZD08L1NBTVA+IGtleXdvcmQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBleHRlcm5hbCBjb21tYW5kCi0gIHRvIHJ1bi4gIElmIHRoZXJlIGFyZSBhcmd1bWVudHMgYWZ0ZXIgdGhlIHByb2dyYW0gbmFtZSwgdGhlIGNvbW1hbmQgbGluZQotICBzaG91bGQgYmUgc3Vycm91bmRlZCBpbiBxdW90YXRpb24gbWFya3MuCi0gIDxEVD5tb2RlPTxFTT5tb2RlPC9FTT4KLSAgPEREPgotICA8RU0+bW9kZTwvRU0+IHNob3VsZCBiZSA8RU0+b3V0cHV0PC9FTT4gZm9yIG5vdyAodGhlIGRlZmF1bHQpLiAgSW4gdGhlIAotICBmdXR1cmUsIDxFTT5tb2RlPWlucHV0PC9FTT4gd2lsbCBiZSB1c2VkIHRvIHNwZWNpZnkgYSBmaWx0ZXIgZm9yIHJlcXVlc3QKLSAgYm9kaWVzLgotICA8RFQ+aW50eXBlPTxFTT5pbXQ8L0VNPgotICA8REQ+Ci0gIFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgaW50ZXJuZXQgbWVkaWEKLSAgdHlwZSAoaS5lLiwgTUlNRSB0eXBlKSBvZiBkb2N1bWVudHMgd2hpY2ggc2hvdWxkIGJlIGZpbHRlcmVkLiAgQnkgZGVmYXVsdCwKLSAgYWxsIGRvY3VtZW50cyBhcmUgZmlsdGVyZWQuICBJZiA8Q09ERT5pbnR5cGU9PC9DT0RFPiBpcyBzcGVjaWZpZWQsCi0gIHRoZSBmaWx0ZXIgd2lsbCBiZSBkaXNhYmxlZCBmb3IgZG9jdW1lbnRzIG9mIG90aGVyIHR5cGVzLgotICA8RFQ+b3V0dHlwZT08RU0+aW10PC9FTT4KLSAgPEREPgotICBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGludGVybmV0IG1lZGlhCi0gIHR5cGUgKGkuZS4sIE1JTUUgdHlwZSkgb2YgZmlsdGVyZWQgZG9jdW1lbnRzLiAgSXQgaXMgdXNlZnVsIHdoZW4gdGhlIGZpbHRlcgotICBjaGFuZ2VzIHRoZSBpbnRlcm5ldCBtZWRpYSB0eXBlIGFzIHBhcnQgb2YgdGhlIGZpbHRlcmluZyBvcGVyYXRpb24uICBCeSAKLSAgZGVmYXVsdCwgdGhlIGludGVybmV0IG1lZGlhIHR5cGUgaXMgdW5jaGFuZ2VkLgotICA8RFQ+UHJlc2VydmVzQ29udGVudExlbmd0aAotICA8REQ+Ci0gIFRoZSA8U0FNUD5QcmVzZXJ2ZXNDb250ZW50TGVuZ3RoPC9TQU1QPiBrZXl3b3JkIHNwZWNpZmllcyB0aGF0IHRoZSBmaWx0ZXIKLSAgcHJlc2VydmVzIHRoZSBjb250ZW50IGxlbmd0aC4gIFRoaXMgaXMgbm90IHRoZSBkZWZhdWx0LCBhcyBtb3N0IGZpbHRlcnMgCi0gIGNoYW5nZSB0aGUgY29udGVudCBsZW5ndGguICBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgZmlsdGVyIGRvZXNuJ3QgbW9kaWZ5IHRoZQotICBsZW5ndGgsIHRoaXMga2V5d29yZCBzaG91bGQgYmUgc3BlY2lmaWVkLgotICA8L0RMPgotCi0gIDxIMj48QSBOQU1FPSJleHRmaWx0ZXJvcHRpb25zIj5FeHRGaWx0ZXJPcHRpb25zPC9BPjwvSDI+Ci0gIDxQPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEV4dEZpbHRlck9wdGlvbnMgPEVNPm9wdGlvbiBvcHRpb24gLi4uPC9FTT4KLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPEVNPkRlYnVnTGV2ZWw9MDwvRU0+IDxFTT5Ob0xvZ1N0ZGVycjwvRU0+Ci0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IGRpcmVjdG9yeQotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IG5vbmUKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEV4cGVyaW1lbnRhbAotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2V4dF9maWx0ZXIKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gT25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDIuMCBvciBsYXRlcgotCi0gIDxQPgotICBUaGUgPENPREU+RXh0RmlsdGVyT3B0aW9uczwvQ09ERT4gZGlyZWN0aXZlIHNwZWNpZmllcyBzcGVjaWFsIHByb2Nlc3NpbmcKLSAgb3B0aW9ucyBmb3IgPENPREU+bW9kX2V4dF9maWx0ZXI8L0NPREU+LiAgPEVNPk9wdGlvbjwvRU0+IGNhbiBiZSBvbmUgb2YKLSAgPERMPgotICA8RFQ+RGVidWdMZXZlbD08RU0+bjwvRU0+Ci0gIDxERD4KLSAgVGhlIDxTQU1QPkRlYnVnTGV2ZWw8L1NBTVA+IGtleXdvcmQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBsZXZlbCBvZgotICBkZWJ1ZyBtZXNzYWdlcyBnZW5lcmF0ZWQgYnkgPENPREU+bW9kX2V4dF9maWx0ZXI8L0NPREU+LiAgQnkgZGVmYXVsdCwgbm8KLSAgZGVidWcgbWVzc2FnZXMgYXJlIGdlbmVyYXRlZC4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byAKLSAgPFNBTVA+RGVidWdMZXZlbD0wPC9TQU1QPi4gIFdpdGggaGlnaGVyIG51bWJlcnMsIG1vcmUgZGVidWcgbWVzc2FnZXMgYXJlIAotICBnZW5lcmF0ZWQsIGFuZCBzZXJ2ZXIgcGVyZm9ybWFuY2Ugd2lsbCBiZSBkZWdyYWRlZC4gIFRoZSBhY3R1YWwgbWVhbmluZ3MgCi0gIG9mIHRoZSBudW1lcmljIHZhbHVlcyBhcmUgZGVzY3JpYmVkIHdpdGggdGhlIGRlZmluaXRpb25zIG9mIHRoZSBEQkdMVkxfIAotICBjb25zdGFudHMgbmVhciB0aGUgYmVnaW5uaW5nIG9mIDxDT0RFPm1vZF9leHRfZmlsdGVyLmM8L0NPREU+LgotICA8UD4KLSAgTm90ZTogVGhlIGNvcmUgZGlyZWN0aXZlIExvZ0xldmVsIHNob3VsZCBiZSB1c2VkIHRvIGNhdXNlIGRlYnVnIG1lc3NhZ2VzIAotICB0byBiZSBzdG9yZWQgaW4gdGhlIEFwYWNoZSBlcnJvciBsb2cuCi0gIDxEVD5Mb2dTdGRlcnIgfCBOb0xvZ1N0ZGVycgotICA8REQ+Ci0gIFRoZSA8U0FNUD5Mb2dTdGRlcnI8L1NBTVA+IGtleXdvcmQgc3BlY2lmaWVzIHRoYXQgbWVzc2FnZXMgd3JpdHRlbiB0bwotICBzdGFuZGFyZCBlcnJvciBieSB0aGUgZXh0ZXJuYWwgZmlsdGVyIHByb2dyYW0gd2lsbCBiZSBzYXZlZCBpbiB0aGUgQXBhY2hlCi0gIGVycm9yIGxvZy4gIDxTQU1QPk5vTG9nU3RkZXJyPC9TQU1QPiBkaXNhYmxlcyB0aGlzIGZlYXR1cmUuCi0gIDwvREw+Ci0gIDwvUD4KLQotICBFeGFtcGxlOgotCi0gIDxQUkU+Ci0gICAgRXh0RmlsdGVyT3B0aW9ucyAgTG9nU3RkZXJyIERlYnVnTGV2ZWw9MAotICA8L1BSRT4KLQotICBNZXNzYWdlcyB3cml0dGVuIHRvIHRoZSBmaWx0ZXIncyBzdGFuZGFyZCBlcnJvciB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgQXBhY2hlIAotICBlcnJvciBsb2cuICBObyBkZWJ1ZyBtZXNzYWdlcyB3aWxsIGJlIGdlbmVyYXRlZCBieSAKLSAgPENPREU+bW9kX2V4dF9maWx0ZXI8L0NPREU+LgotCi0gIDxQPgotCi0gIDxIMj5FeGFtcGxlczwvSDI+Ci0KLSAgPEgzPkdlbmVyYXRpbmcgSFRNTCBmcm9tIHNvbWUgb3RoZXIgdHlwZSBvZiByZXNwb25zZTwvSDM+Ci0KLSAgPFBSRT4KLSAgICAjIG1vZF9leHRfZmlsdGVyIGRpcmVjdGl2ZSB0byBkZWZpbmUgYSBmaWx0ZXIgdG8gSFRNTC1pemUgdGV4dC9jIGZpbGVzIAotICAgICMgdXNpbmcgdGhlIGV4dGVybmFsIHByb2dyYW0gL3Vzci9iaW4vZW5zY3JpcHQsIHdpdGggdGhlIHR5cGUgb2YgdGhlIAotICAgICMgcmVzdWx0IHNldCB0byB0ZXh0L2h0bWwKLSAgICBFeHRGaWx0ZXJEZWZpbmUgYy10by1odG1sIG1vZGU9b3V0cHV0IGludHlwZT10ZXh0L2Mgb3V0dHlwZT10ZXh0L2h0bWwgXAotICAgICAgICAgICAgICAgICAgICBjbWQ9Ii91c3IvYmluL2Vuc2NyaXB0IC0tY29sb3IgLVcgaHRtbCAtRWMgLW8gLSAtIgotCi0gICAgJmx0O0RpcmVjdG9yeSAiL2V4cG9ydC9ob21lL3RyYXdpY2svYXBhY2hlaW5zdC9odGRvY3MvYyImZ3Q7Ci0KLSAgICAjIGNvcmUgZGlyZWN0aXZlIHRvIGNhdXNlIHRoZSBuZXcgZmlsdGVyIHRvIGJlIHJ1biBvbiBvdXRwdXQKLSAgICBBZGRPdXRwdXRGaWx0ZXIgYy10by1oZW1sCi0KLSAgICAjIG1vZF9taW1lIGRpcmVjdGl2ZSB0byBzZXQgdGhlIHR5cGUgb2YgLmMgZmlsZXMgdG8gdGV4dC9jCi0gICAgQWRkVHlwZSB0ZXh0L2MgLmMKLQotICAgICMgbW9kX2V4dF9maWx0ZXIgZGlyZWN0aXZlIHRvIHNldCB0aGUgZGVidWcgbGV2ZWwganVzdCBoaWdoIAotICAgICMgZW5vdWdoIHRvIHNlZSBhIGxvZyBtZXNzYWdlIHBlciByZXF1ZXN0IHNob3dpbmcgdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAjIGluIGZvcmNlCi0gICAgRXh0RmlsdGVyT3B0aW9ucyBEZWJ1Z0xldmVsPTEKLQotICAgICZsdDsvRGlyZWN0b3J5Jmd0OwotICA8L1BSRT4KLQotICA8SDM+SW1wbGVtZW50aW5nIGEgY29udGVudCBlbmNvZGluZyBmaWx0ZXI8L0gzPgotCi0gIDxQUkU+Ci0gICMgbW9kX2V4dF9maWx0ZXIgZGlyZWN0aXZlIHRvIGRlZmluZSB0aGUgZXh0ZXJuYWwgZmlsdGVyCi0gIEV4dEZpbHRlckRlZmluZSBnemlwIG1vZGU9b3V0cHV0IGNtZD0vYmluL2d6aXAKLQotICAmbHQ7TG9jYXRpb24gL2d6aXBwZWQmZ3Q7Ci0KLSAgIyBjb3JlIGRpcmVjdGl2ZSB0byBjYXVzZSB0aGUgZ3ppcCBmaWx0ZXIgdG8gYmUgcnVuIG9uIG91dHB1dAotICBBZGRPdXRwdXRGaWx0ZXIgZ3ppcAotCi0gICMgbW9kX2hlYWRlciBkaXJlY3RpdmUgdG8gYWRkICJDb250ZW50LUVuY29kaW5nOiBnemlwIiBoZWFkZXIgZmllbGQKLSAgSGVhZGVyIHNldCBDb250ZW50LUVuY29kaW5nIGd6aXAKLQotICAmbHQ7L0xvY2F0aW9uJmd0OwotICA8L1BSRT4KLQotICA8SDM+U2xvd2luZyBkb3duIHRoZSBzZXJ2ZXI8L0gzPgotICA8UFJFPgotICAjIG1vZF9leHRfZmlsdGVyIGRpcmVjdGl2ZSB0byBkZWZpbmUgYSBmaWx0ZXIgd2hpY2ggcnVucyBldmVyeXRoaW5nIAotICAjIHRocm91Z2ggY2F0OyBjYXQgZG9lc24ndCBtb2RpZnkgYW55dGhpbmc7IGl0IGp1c3QgaW50cm9kdWNlcyBleHRyYQotICAjIHBhdGhsZW5ndGggYW5kIGNvbnN1bWVzIG1vcmUgcmVzb3VyY2VzCi0gIEV4dEZpbHRlckRlZmluZSBzbG93ZG93biBtb2RlPW91dHB1dCBjbWQ9L2Jpbi9jYXQgcHJlc2VydmVzY29udGVudGxlbmd0aAotCi0gICZsdDtMb2NhdGlvbiAvJmd0OwotCi0gICMgY29yZSBkaXJlY3RpdmUgdG8gY2F1c2UgdGhlIHNsb3dkb3duIGZpbHRlciB0byBiZSBydW4gc2V2ZXJhbCB0aW1lcyBvbiAKLSAgIyBvdXRwdXQKLSAgQWRkT3V0cHV0RmlsdGVyIHNsb3dkb3duIHNsb3dkb3duIHNsb3dkb3duCi0KLSAgJmx0Oy9Mb2NhdGlvbiZndDsKLSAgPC9QUkU+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci0gPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9leHRfZmlsdGVyLnhtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfZXh0X2ZpbHRlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZGQ0NTguLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9leHRfZmlsdGVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBtb2R1bGVzeW5vcHNpcyBTWVNURU0gIi4uL3N0eWxlL21vZHVsZXN5bm9wc2lzLmR0ZCI+Ci08P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveHNsIiBocmVmPSIuLi9zdHlsZS9tYW51YWwueHNsIj8+Ci08bW9kdWxlc3lub3BzaXM+Ci0KLTxuYW1lPm1vZF9leHRfZmlsdGVyPC9uYW1lPgotPGRlc2NyaXB0aW9uPlBhc3MgdGhlIHJlc3BvbnNlIGJvZHkKLSAgICB0aHJvdWdoIGFuIGV4dGVybmFsIHByb2dyYW0gYmVmb3JlIGRlbGl2ZXJ5IHRvIHRoZQotICAgIGNsaWVudDwvZGVzY3JpcHRpb24+Ci08c3RhdHVzPkV4cGVyaW1lbnRhbDwvc3RhdHVzPgotPHNvdXJjZWZpbGU+bW9kX2V4dF9maWx0ZXIuYzwvc291cmNlZmlsZT4KLTxpZGVudGlmaWVyPmV4dF9maWx0ZXJfbW9kdWxlPC9pZGVudGlmaWVyPgotCi08c3VtbWFyeT4KLSAgICA8cD5UaGlzIGlzIGFuIDxzdHJvbmc+ZXhwZXJpbWVudGFsPC9zdHJvbmc+IG1vZHVsZSBhbmQgc2hvdWxkCi0gICAgYmUgdXNlZCB3aXRoIGNhcmUuIFRlc3QgeW91ciA8bW9kdWxlPm1vZF9leHRfZmlsdGVyPC9tb2R1bGU+Ci0gICAgY29uZmlndXJhdGlvbiBjYXJlZnVsbHkgdG8gZW5zdXJlIHRoYXQgaXQgcGVyZm9ybXMgdGhlIGRlc2lyZWQKLSAgICBmdW5jdGlvbi4gWW91IG1heSB3aXNoIHRvIHJldmlldyA8YSBocmVmPSIuLi9maWx0ZXIuaHRtbCI+Ci0gICAgdGhpcyBpbmZvcm1hdGlvbjwvYT4gZm9yIGJhY2tncm91bmQgb24gdGhlIEFwYWNoZSBmaWx0ZXJpbmcgCi0gICAgbW9kZWwuPC9wPgotCi0gICAgPHA+PG1vZHVsZT5tb2RfZXh0X2ZpbHRlcjwvbW9kdWxlPiBwcmVzZW50cyBhIHNpbXBsZSBhbmQgZmFtaWxpYXIKLSAgICBwcm9ncmFtbWluZyBtb2RlbCBmb3IgZmlsdGVycy4gV2l0aCB0aGlzIG1vZHVsZSwgYSBwcm9ncmFtCi0gICAgd2hpY2ggcmVhZHMgZnJvbSBzdGRpbiBhbmQgd3JpdGVzIHRvIHN0ZG91dCAoaS5lLiwgYSBVbml4LXN0eWxlCi0gICAgZmlsdGVyIGNvbW1hbmQpIGNhbiBiZSBhIGZpbHRlciBmb3IgQXBhY2hlLiBUaGlzIGZpbHRlcmluZwotICAgIG1lY2hhbmlzbSBpcyBtdWNoIHNsb3dlciB0aGFuIHVzaW5nIGEgZmlsdGVyIHdoaWNoIGlzIHNwZWNpYWxseQotICAgIHdyaXR0ZW4gZm9yIHRoZSBBcGFjaGUgQVBJIGFuZCBydW5zIGluc2lkZSBvZiB0aGUgQXBhY2hlIHNlcnZlcgotICAgIHByb2Nlc3MsIGJ1dCBpdCBkb2VzIGhhdmUgdGhlIGZvbGxvd2luZyBiZW5lZml0czo8L3A+Ci0KLSAgICA8dWw+Ci0gICAgICA8bGk+dGhlIHByb2dyYW1taW5nIG1vZGVsIGlzIG11Y2ggc2ltcGxlcjwvbGk+Ci0KLSAgICAgIDxsaT5hbnkgcHJvZ3JhbW1pbmcvc2NyaXB0aW5nIGxhbmd1YWdlIGNhbiBiZSB1c2VkLCBwcm92aWRlZAotICAgICAgdGhhdCBpdCBhbGxvd3MgdGhlIHByb2dyYW0gdG8gcmVhZCBmcm9tIHN0YW5kYXJkIGlucHV0IGFuZAotICAgICAgd3JpdGUgdG8gc3RhbmRhcmQgb3V0cHV0PC9saT4KLQotICAgICAgPGxpPmV4aXN0aW5nIHByb2dyYW1zIGNhbiBiZSB1c2VkIHVubW9kaWZpZWQgYXMgQXBhY2hlCi0gICAgICBmaWx0ZXJzPC9saT4KLSAgICA8L3VsPgotCi0gICAgPHA+RXZlbiB3aGVuIHRoZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3MgYXJlIG5vdCBzdWl0YWJsZQotICAgIGZvciBwcm9kdWN0aW9uIHVzZSwgPGNvZGU+bW9kX2V4dF9maWx0ZXI8L2NvZGU+IGNhbiBiZSB1c2VkIGFzCi0gICAgYSBwcm90b3R5cGUgZW52aXJvbm1lbnQgZm9yIGZpbHRlcnMuPC9wPgotPC9zdW1tYXJ5PgotCi08c2VjdGlvbj48dGl0bGU+RXhhbXBsZXM8L3RpdGxlPgotCi08c2VjdGlvbj48dGl0bGU+R2VuZXJhdGluZyBIVE1MIGZyb20gc29tZSBvdGhlciB0eXBlIG9mIHJlc3BvbnNlPC90aXRsZT4KLTxleGFtcGxlPgotPHByZT4KLSAgICAjIG1vZF9leHRfZmlsdGVyIGRpcmVjdGl2ZSB0byBkZWZpbmUgYSBmaWx0ZXIgdG8gSFRNTC1pemUgdGV4dC9jIGZpbGVzIAotICAgICMgdXNpbmcgdGhlIGV4dGVybmFsIHByb2dyYW0gL3Vzci9iaW4vZW5zY3JpcHQsIHdpdGggdGhlIHR5cGUgb2YgdGhlIAotICAgICMgcmVzdWx0IHNldCB0byB0ZXh0L2h0bWwKLSAgICBFeHRGaWx0ZXJEZWZpbmUgYy10by1odG1sIG1vZGU9b3V0cHV0IGludHlwZT10ZXh0L2Mgb3V0dHlwZT10ZXh0L2h0bWwgXAotICAgICAgICAgICAgICAgICAgICBjbWQ9Ii91c3IvYmluL2Vuc2NyaXB0IC0tY29sb3IgLVcgaHRtbCAtRWMgLW8gLSAtIgotCi0gICAgJmx0O0RpcmVjdG9yeSAiL2V4cG9ydC9ob21lL3RyYXdpY2svYXBhY2hlaW5zdC9odGRvY3MvYyImZ3Q7Ci0KLSAgICAjIGNvcmUgZGlyZWN0aXZlIHRvIGNhdXNlIHRoZSBuZXcgZmlsdGVyIHRvIGJlIHJ1biBvbiBvdXRwdXQKLSAgICBTZXRPdXRwdXRGaWx0ZXIgYy10by1odG1sCi0KLSAgICAjIG1vZF9taW1lIGRpcmVjdGl2ZSB0byBzZXQgdGhlIHR5cGUgb2YgLmMgZmlsZXMgdG8gdGV4dC9jCi0gICAgQWRkVHlwZSB0ZXh0L2MgLmMKLQotICAgICMgbW9kX2V4dF9maWx0ZXIgZGlyZWN0aXZlIHRvIHNldCB0aGUgZGVidWcgbGV2ZWwganVzdCBoaWdoIAotICAgICMgZW5vdWdoIHRvIHNlZSBhIGxvZyBtZXNzYWdlIHBlciByZXF1ZXN0IHNob3dpbmcgdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAjIGluIGZvcmNlCi0gICAgRXh0RmlsdGVyT3B0aW9ucyBEZWJ1Z0xldmVsPTEKLQotICAgICZsdDsvRGlyZWN0b3J5Jmd0OwotPC9wcmU+Ci08L2V4YW1wbGU+Ci08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uPjx0aXRsZT5JbXBsZW1lbnRpbmcgYSBjb250ZW50IGVuY29kaW5nIGZpbHRlcjwvdGl0bGU+Ci08ZXhhbXBsZT4KLTxwcmU+Ci0gICMgbW9kX2V4dF9maWx0ZXIgZGlyZWN0aXZlIHRvIGRlZmluZSB0aGUgZXh0ZXJuYWwgZmlsdGVyCi0gIEV4dEZpbHRlckRlZmluZSBnemlwIG1vZGU9b3V0cHV0IGNtZD0vYmluL2d6aXAKLQotICAmbHQ7TG9jYXRpb24gL2d6aXBwZWQmZ3Q7Ci0KLSAgIyBjb3JlIGRpcmVjdGl2ZSB0byBjYXVzZSB0aGUgZ3ppcCBmaWx0ZXIgdG8gYmUgcnVuIG9uIG91dHB1dAotICBTZXRPdXRwdXRGaWx0ZXIgZ3ppcAotCi0gICMgbW9kX2hlYWRlciBkaXJlY3RpdmUgdG8gYWRkICJDb250ZW50LUVuY29kaW5nOiBnemlwIiBoZWFkZXIgZmllbGQKLSAgSGVhZGVyIHNldCBDb250ZW50LUVuY29kaW5nIGd6aXAKLQotICAmbHQ7L0xvY2F0aW9uJmd0OwotPC9wcmU+Ci08L2V4YW1wbGU+Ci0KLSAgPHA+Tm90ZTogdGhpcyBnemlwIGV4YW1wbGUgaXMganVzdCBmb3IgdGhlIHB1cnBvc2VzIG9mIGlsbHVzdHJhdGlvbi4KLSAgUGxlYXNlIHJlZmVyIHRvIDxtb2R1bGU+bW9kX2RlZmxhdGU8L21vZHVsZT4gZm9yIGEgcHJhY3RpY2FsCi0gIGltcGxlbWVudGF0aW9uLjwvcD4KLTwvc2VjdGlvbj4KLQotPHNlY3Rpb24+PHRpdGxlPlNsb3dpbmcgZG93biB0aGUgc2VydmVyPC90aXRsZT4KLTxleGFtcGxlPgotPHByZT4KLSAgIyBtb2RfZXh0X2ZpbHRlciBkaXJlY3RpdmUgdG8gZGVmaW5lIGEgZmlsdGVyIHdoaWNoIHJ1bnMgZXZlcnl0aGluZyAKLSAgIyB0aHJvdWdoIGNhdDsgY2F0IGRvZXNuJ3QgbW9kaWZ5IGFueXRoaW5nOyBpdCBqdXN0IGludHJvZHVjZXMgZXh0cmEKLSAgIyBwYXRobGVuZ3RoIGFuZCBjb25zdW1lcyBtb3JlIHJlc291cmNlcwotICBFeHRGaWx0ZXJEZWZpbmUgc2xvd2Rvd24gbW9kZT1vdXRwdXQgY21kPS9iaW4vY2F0IHByZXNlcnZlc2NvbnRlbnRsZW5ndGgKLQotICAmbHQ7TG9jYXRpb24gLyZndDsKLQotICAjIGNvcmUgZGlyZWN0aXZlIHRvIGNhdXNlIHRoZSBzbG93ZG93biBmaWx0ZXIgdG8gYmUgcnVuIHNldmVyYWwgdGltZXMgb24gCi0gICMgb3V0cHV0Ci0gIFNldE91dHB1dEZpbHRlciBzbG93ZG93biBzbG93ZG93biBzbG93ZG93bgotCi0gICZsdDsvTG9jYXRpb24mZ3Q7Ci08L3ByZT4KLTwvZXhhbXBsZT4KLTwvc2VjdGlvbj4KLQotPC9zZWN0aW9uPiA8IS0tIEV4YW1wbGVzIC0tPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5FeHRGaWx0ZXJEZWZpbmU8L25hbWU+Ci08c3ludGF4PkV4dEZpbHRlckRlZmluZSA8ZW0+ZmlsdGVybmFtZTwvZW0+IDxlbT5wYXJhbWV0ZXJzPC9lbT48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5FeHRGaWx0ZXJEZWZpbmU8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIGRlZmluZXMgdGhlCi0gICAgY2hhcmFjdGVyaXN0aWNzIG9mIGFuIGV4dGVybmFsIGZpbHRlciwgaW5jbHVkaW5nIHRoZSBwcm9ncmFtIHRvCi0gICAgcnVuIGFuZCBpdHMgYXJndW1lbnRzLjwvcD4KLQotICAgIDxwPjxlbT5maWx0ZXJuYW1lPC9lbT4gc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBmaWx0ZXIgYmVpbmcKLSAgICBkZWZpbmVkLiBUaGlzIG5hbWUgY2FuIHRoZW4gYmUgdXNlZCBpbiBTZXRPdXRwdXRGaWx0ZXIKLSAgICBkaXJlY3RpdmVzLiBJdCBtdXN0IGJlIHVuaXF1ZSBhbW9uZyBhbGwgcmVnaXN0ZXJlZCBmaWx0ZXJzLgotICAgIDxlbT5BdCB0aGUgcHJlc2VudCB0aW1lLCBubyBlcnJvciBpcyByZXBvcnRlZCBieSB0aGUKLSAgICByZWdpc3Rlci1maWx0ZXIgQVBJLCBzbyBhIHByb2JsZW0gd2l0aCBkdXBsaWNhdGUgbmFtZXMgaXNuJ3QKLSAgICByZXBvcnRlZCB0byB0aGUgdXNlci48L2VtPjwvcD4KLQotICAgIDxwPlN1YnNlcXVlbnQgcGFyYW1ldGVycyBjYW4gYXBwZWFyIGluIGFueSBvcmRlciBhbmQgZGVmaW5lIHRoZQotICAgIGV4dGVybmFsIGNvbW1hbmQgdG8gcnVuIGFuZCBjZXJ0YWluIG90aGVyIGNoYXJhY3RlcmlzdGljcy4gVGhlCi0gICAgb25seSByZXF1aXJlZCBwYXJhbWV0ZXIgaXMgPGVtPmNtZD08L2VtPi4gVGhlc2UgcGFyYW1ldGVycwotICAgIGFyZTo8L3A+Ci0KLSAgICA8ZGw+Ci0gICAgICA8ZHQ+Y21kPTxlbT5jbWRsaW5lPC9lbT48L2R0PgotCi0gICAgICA8ZGQ+VGhlIDxjb2RlPmNtZD08L2NvZGU+IGtleXdvcmQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQotICAgICAgZXh0ZXJuYWwgY29tbWFuZCB0byBydW4uIElmIHRoZXJlIGFyZSBhcmd1bWVudHMgYWZ0ZXIgdGhlCi0gICAgICBwcm9ncmFtIG5hbWUsIHRoZSBjb21tYW5kIGxpbmUgc2hvdWxkIGJlIHN1cnJvdW5kZWQgaW4KLSAgICAgIHF1b3RhdGlvbiBtYXJrcy48L2RkPgotCi0gICAgICA8ZHQ+bW9kZT08ZW0+bW9kZTwvZW0+PC9kdD4KLQotICAgICAgPGRkPjxlbT5tb2RlPC9lbT4gc2hvdWxkIGJlIDxlbT5vdXRwdXQ8L2VtPiBmb3Igbm93ICh0aGUKLSAgICAgIGRlZmF1bHQpLiBJbiB0aGUgZnV0dXJlLCA8ZW0+bW9kZT1pbnB1dDwvZW0+IHdpbGwgYmUgdXNlZCB0bwotICAgICAgc3BlY2lmeSBhIGZpbHRlciBmb3IgcmVxdWVzdCBib2RpZXMuPC9kZD4KLQotICAgICAgPGR0PmludHlwZT08ZW0+aW10PC9lbT48L2R0PgotCi0gICAgICA8ZGQ+VGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBpbnRlcm5ldCBtZWRpYSB0eXBlIChpLmUuLAotICAgICAgTUlNRSB0eXBlKSBvZiBkb2N1bWVudHMgd2hpY2ggc2hvdWxkIGJlIGZpbHRlcmVkLiBCeSBkZWZhdWx0LAotICAgICAgYWxsIGRvY3VtZW50cyBhcmUgZmlsdGVyZWQuIElmIDxjb2RlPmludHlwZT08L2NvZGU+IGlzCi0gICAgICBzcGVjaWZpZWQsIHRoZSBmaWx0ZXIgd2lsbCBiZSBkaXNhYmxlZCBmb3IgZG9jdW1lbnRzIG9mIG90aGVyCi0gICAgICB0eXBlcy48L2RkPgotCi0gICAgICA8ZHQ+b3V0dHlwZT08ZW0+aW10PC9lbT48L2R0PgotCi0gICAgICA8ZGQ+VGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBpbnRlcm5ldCBtZWRpYSB0eXBlIChpLmUuLAotICAgICAgTUlNRSB0eXBlKSBvZiBmaWx0ZXJlZCBkb2N1bWVudHMuIEl0IGlzIHVzZWZ1bCB3aGVuIHRoZQotICAgICAgZmlsdGVyIGNoYW5nZXMgdGhlIGludGVybmV0IG1lZGlhIHR5cGUgYXMgcGFydCBvZiB0aGUKLSAgICAgIGZpbHRlcmluZyBvcGVyYXRpb24uIEJ5IGRlZmF1bHQsIHRoZSBpbnRlcm5ldCBtZWRpYSB0eXBlIGlzCi0gICAgICB1bmNoYW5nZWQuPC9kZD4KLQotICAgICAgPGR0PlByZXNlcnZlc0NvbnRlbnRMZW5ndGg8L2R0PgotCi0gICAgICA8ZGQ+VGhlIDxjb2RlPlByZXNlcnZlc0NvbnRlbnRMZW5ndGg8L2NvZGU+IGtleXdvcmQgc3BlY2lmaWVzCi0gICAgICB0aGF0IHRoZSBmaWx0ZXIgcHJlc2VydmVzIHRoZSBjb250ZW50IGxlbmd0aC4gVGhpcyBpcyBub3QgdGhlCi0gICAgICBkZWZhdWx0LCBhcyBtb3N0IGZpbHRlcnMgY2hhbmdlIHRoZSBjb250ZW50IGxlbmd0aC4gSW4gdGhlCi0gICAgICBldmVudCB0aGF0IHRoZSBmaWx0ZXIgZG9lc24ndCBtb2RpZnkgdGhlIGxlbmd0aCwgdGhpcyBrZXl3b3JkCi0gICAgICBzaG91bGQgYmUgc3BlY2lmaWVkLjwvZGQ+Ci0gICAgPC9kbD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5FeHRGaWx0ZXJPcHRpb25zPC9uYW1lPgotPHN5bnRheD5FeHRGaWx0ZXJPcHRpb25zCi0gICAgPGVtPm9wdGlvbjwvZW0+IFs8ZW0+b3B0aW9uPC9lbT5dIC4uLjwvc3ludGF4PgotPGRlZmF1bHQ+RXh0RmlsdGVyT3B0aW9ucyBEZWJ1Z0xldmVsPTAgTm9Mb2dTdGRlcnI8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5FeHRGaWx0ZXJPcHRpb25zPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBzcGVjaWZpZXMKLSAgICBzcGVjaWFsIHByb2Nlc3Npbmcgb3B0aW9ucyBmb3IgPGNvZGU+bW9kX2V4dF9maWx0ZXI8L2NvZGU+LgotICAgIDxlbT5PcHRpb248L2VtPiBjYW4gYmUgb25lIG9mPC9wPgotCi0gICAgPGRsPgotICAgICAgPGR0PkRlYnVnTGV2ZWw9PGVtPm48L2VtPjwvZHQ+Ci0KLSAgICAgIDxkZD4KLSAgICAgICAgVGhlIDxjb2RlPkRlYnVnTGV2ZWw8L2NvZGU+IGtleXdvcmQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5Ci0gICAgICAgIHRoZSBsZXZlbCBvZiBkZWJ1ZyBtZXNzYWdlcyBnZW5lcmF0ZWQgYnkKLSAgICAgICAgPGNvZGU+bW9kX2V4dF9maWx0ZXI8L2NvZGU+LiBCeSBkZWZhdWx0LCBubyBkZWJ1ZyBtZXNzYWdlcwotICAgICAgICBhcmUgZ2VuZXJhdGVkLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KLSAgICAgICAgPGNvZGU+RGVidWdMZXZlbD0wPC9jb2RlPi4gV2l0aCBoaWdoZXIgbnVtYmVycywgbW9yZSBkZWJ1ZwotICAgICAgICBtZXNzYWdlcyBhcmUgZ2VuZXJhdGVkLCBhbmQgc2VydmVyIHBlcmZvcm1hbmNlIHdpbGwgYmUKLSAgICAgICAgZGVncmFkZWQuIFRoZSBhY3R1YWwgbWVhbmluZ3Mgb2YgdGhlIG51bWVyaWMgdmFsdWVzIGFyZQotICAgICAgICBkZXNjcmliZWQgd2l0aCB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIERCR0xWTF8gY29uc3RhbnRzCi0gICAgICAgIG5lYXIgdGhlIGJlZ2lubmluZyBvZiA8Y29kZT5tb2RfZXh0X2ZpbHRlci5jPC9jb2RlPi4gCi0KLSAgICAgICAgPHA+Tm90ZTogVGhlIGNvcmUgZGlyZWN0aXZlIExvZ0xldmVsIHNob3VsZCBiZSB1c2VkIHRvCi0gICAgICAgIGNhdXNlIGRlYnVnIG1lc3NhZ2VzIHRvIGJlIHN0b3JlZCBpbiB0aGUgQXBhY2hlIGVycm9yCi0gICAgICAgIGxvZy48L3A+Ci0gICAgICA8L2RkPgotCi0gICAgICA8ZHQ+TG9nU3RkZXJyIHwgTm9Mb2dTdGRlcnI8L2R0PgotCi0gICAgICA8ZGQ+VGhlIDxjb2RlPkxvZ1N0ZGVycjwvY29kZT4ga2V5d29yZCBzcGVjaWZpZXMgdGhhdAotICAgICAgbWVzc2FnZXMgd3JpdHRlbiB0byBzdGFuZGFyZCBlcnJvciBieSB0aGUgZXh0ZXJuYWwgZmlsdGVyCi0gICAgICBwcm9ncmFtIHdpbGwgYmUgc2F2ZWQgaW4gdGhlIEFwYWNoZSBlcnJvciBsb2cuCi0gICAgICA8Y29kZT5Ob0xvZ1N0ZGVycjwvY29kZT4gZGlzYWJsZXMgdGhpcyBmZWF0dXJlLjwvZGQ+Ci0gICAgPC9kbD4KLQotICAgICA8cD5FeGFtcGxlOjwvcD4KLTxleGFtcGxlPgotICAgIEV4dEZpbHRlck9wdGlvbnMgIExvZ1N0ZGVyciBEZWJ1Z0xldmVsPTAKLTwvZXhhbXBsZT4KLQotICAgIDxwPk1lc3NhZ2VzIHdyaXR0ZW4gdG8gdGhlIGZpbHRlcidzIHN0YW5kYXJkIGVycm9yIHdpbGwgYmUgc3RvcmVkCi0gICAgaW4gdGhlIEFwYWNoZSBlcnJvciBsb2cuIE5vIGRlYnVnIG1lc3NhZ2VzIHdpbGwgYmUgZ2VuZXJhdGVkIGJ5Ci0gICAgPG1vZHVsZT5tb2RfZXh0X2ZpbHRlcjwvbW9kdWxlPi4gPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTwvbW9kdWxlc3lub3BzaXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9maWxlX2NhY2hlLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2ZpbGVfY2FjaGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFiYmRjYi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX2ZpbGVfY2FjaGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLSA8SEVBRD4KLSAgPFRJVExFPkFwYWNoZSBtb2R1bGUgbW9kX2ZpbGVfY2FjaGU8L1RJVExFPgotIDwvSEVBRD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLSA8Qk9EWQotICBCR0NPTE9SPSIjRkZGRkZGIgotICBURVhUPSIjMDAwMDAwIgotICBMSU5LPSIjMDAwMEZGIgotICBWTElOSz0iIzAwMDA4MCIKLSAgQUxJTks9IiNGRjAwMDAiCi0gPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLSAgPEgxIEFMSUdOPSJDRU5URVIiPk1vZHVsZSBtb2RfZmlsZV9jYWNoZTwvSDE+Ci0gIDxQPgotICA8U1RST05HPlRoaXMgbW9kdWxlIHNob3VsZCBiZSB1c2VkIHdpdGggY2FyZS4gIFlvdSBjYW4gZWFzaWx5IGNyZWF0ZSBhCi0gIGJyb2tlbiBzaXRlIHVzaW5nIG1vZF9maWxlX2NhY2hlLCBzbyByZWFkIHRoaXMgZG9jdW1lbnQKLSAgY2FyZWZ1bGx5LjwvU1RST05HPgotICA8L1A+Ci0KLSAgPFA+Ci0gIDxFTT5DYWNoaW5nPC9FTT4gZnJlcXVlbnRseSByZXF1ZXN0ZWQgZmlsZXMgdGhhdCBjaGFuZ2UgdmVyeQotICBpbmZyZXF1ZW50bHkgaXMgYSB0ZWNobmlxdWUgZm9yIHJlZHVjaW5nIHNlcnZlciBsb2FkLiBtb2RfZmlsZV9jYWNoZQotICBwcm92aWRlcyB0d28gdGVjaG5pcXVlcyBmb3IgY2FjaGluZyBmcmVxdWVudGx5IHJlcXVlc3RlZAotICA8RU0+c3RhdGljPC9FTT4gZmlsZXMuCi0gIFRocm91Z2ggY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzLCB5b3UgY2FuIGRpcmVjdCBtb2RfZmlsZV9jYWNoZQotICB0byBlaXRoZXIgb3BlbiB0aGVuIG1tYXAoKWEgZmlsZSwgb3IgdG8gcHJlLW9wZW4gYSBmaWxlIGFuZCBzYXZlCi0gIHRoZSBmaWxlJ3Mgb3BlbiA8RU0+ZmlsZSBoYW5kbGU8L0VNPi4gQm90aCB0ZWNobmlxdWVzIHJlZHVjZSBzZXJ2ZXIKLSAgbG9hZCB3aGVuIHByb2Nlc3NpbmcgcmVxdWVzdHMgZm9yIHRoZXNlIGZpbGVzIGJ5IGRvaW5nIHBhcnQgb2YgdGhlCi0gIHdvcmsgKHNwZWNpZmljYWxseSwgdGhlIGZpbGUgSS9PKSBmb3Igc2VydmluZyB0aGUgZmlsZSB3aGVuIHRoZSBzZXJ2ZXIKLSAgaXMgc3RhcnRlZCByYXRoZXIgdGhhbiBkdXJpbmcgZWFjaCByZXF1ZXN0LiAKLSAgPC9QPgotCi0gIDxQPgotICA8Q09ERT5tb2RfZmlsZV9jYWNoZTwvQ09ERT4gaXMgbm90IGNvbXBpbGVkIGludG8gdGhlIHNlcnZlciBieQotICBkZWZhdWx0LiBUbyB1c2UgPENPREU+bW9kX2ZpbGVfY2FjaGU8L0NPREU+IHlvdSBoYXZlIHRvIGVuYWJsZSB0aGUKLSAgZm9sbG93aW5nIGxpbmUgaW4gdGhlIHNlcnZlciBidWlsZCA8Q09ERT5Db25maWd1cmF0aW9uPC9DT0RFPiBmaWxlOgotICA8UFJFPgotICAgIEFkZE1vZHVsZSAgbW9kdWxlcy9leHBlcmltZW50YWwvbW9kX2ZpbGVfY2FjaGUubwotICA8L1BSRT4KLSAgPC9QPgotCi0gIDxQPgotICBOb3RpY2U6IFlvdSBjYW5ub3QgdXNlIHRoaXMgZm9yIHNwZWVkaW5nIHVwIENHSSBwcm9ncmFtcyBvciBvdGhlciBmaWxlcwotICB3aGljaCBhcmUgc2VydmVkIGJ5IHNwZWNpYWwgY29udGVudCBoYW5kbGVycy4gSXQgY2FuIG9ubHkgYmUgdXNlZCBmb3IKLSAgcmVndWxhciBmaWxlcyB3aGljaCBhcmUgdXN1YWxseSBzZXJ2ZWQgYnkgdGhlIEFwYWNoZSBjb3JlIGNvbnRlbnQgaGFuZGxlci4KLSAgPC9QPgotCi0gIDxQPgotICBUaGlzIG1vZHVsZSBpcyBhbiBleHRlbnNpb24gb2YgYW5kIGJvcnJvd3MgaGVhdmlseSBmcm9tIHRoZQotICBtb2RfbW1hcF9zdGF0aWMgbW9kdWxlIGluIEFwYWNoZSAxLjMuCi0gIDwvUD4KLSAgPEgyPlN1bW1hcnk8L0gyPgotICA8UD4KLSAgPENPREU+bW9kX2ZpbGVfY2FjaGU8L0NPREU+IGNhY2hlcyBhIGxpc3Qgb2Ygc3RhdGljYWxseSBjb25maWd1cmVkCi0gIGZpbGVzIHZpYSA8Q09ERT5NTWFwRmlsZTwvQ09ERT4gb3IgPENPREU+Q2FjaGVGaWxlPC9DT0RFPiBkaXJlY3RpdmVzCi0gIGluIHRoZSBtYWluIHNlcnZlciBjb25maWd1cmF0aW9uLgotICA8L1A+Ci0KLSAgPFA+Ci0gIE5vdCBhbGwgcGxhdGZvcm1zIHN1cHBvcnQgYm90aCBkaXJlY3RpdmVzLiBGb3IKLSAgZXhhbXBsZSwgQXBhY2hlIG9uIFdpbmRvd3MgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgdGhlIE1NYXBTdGF0aWMKLSAgZGlyZWN0aXZlLCB3aGlsZSBvdGhlciBwbGF0Zm9ybXMsIGxpa2UgQUlYLCBzdXBwb3J0IGJvdGguIFlvdSB3aWxsCi0gIHJlY2VpdmUgYW4gZXJyb3IgbWVzc2FnZSBpbiB0aGUgc2VydmVyIGVycm9yIGxvZyBpZiB5b3UgYXR0ZW1wdCB0bwotICB1c2UgYW4gdW5zdXBwb3J0ZWQgZGlyZWN0aXZlLiBJZiBnaXZlbiBhbiB1bnN1cHBvcnRlZCBkaXJlY3RpdmUsIHRoZQotICBzZXJ2ZXIgd2lsbCBzdGFydCBidXQgdGhlIGZpbGUgd2lsbCBub3QgYmUgY2FjaGVkLiBPbiBwbGF0Zm9ybXMgdGhhdAotICBzdXBwb3J0IGJvdGggZGlyZWN0aXZlcywgeW91IHNob3VsZCBleHBlcmltZW50IHdpdGggYm90aCB0byBzZWUKLSAgd2hpY2ggd29ya3MgYmVzdCBmb3IgeW91LgotICA8L1A+Ci0KLSAgPEgzPjxDT0RFPk1tYXBGaWxlPC9DT0RFPiBEaXJlY3RpdmUgPC9IMz4KLSAgPFA+Ci0gIFRoZSA8Q09ERT5NbWFwRmlsZTwvQ09ERT4gZGlyZWN0aXZlIG9mIDxDT0RFPm1vZF9maWxlX2NhY2hlPC9DT0RFPgotICBtYXBzIGEgbGlzdCBvZiBzdGF0aWNhbGx5IGNvbmZpZ3VyZWQgZmlsZXMgaW50byBtZW1vcnkgdGhyb3VnaCB0aGUKLSAgc3lzdGVtIGNhbGwgPENPREU+bW1hcCgpPC9DT0RFPi4gIFRoaXMgc3lzdGVtIGNhbGwgaXMgYXZhaWxhYmxlIG9uCi0gIG1vc3QgbW9kZXJuIFVuaXggZGVyaXZhdGVzLCBidXQgbm90IG9uIGFsbC4gIFRoZXJlIGFyZSBzb21ldGltZXMKLSAgc3lzdGVtLXNwZWNpZmljIGxpbWl0cyBvbiB0aGUgc2l6ZSBhbmQgbnVtYmVyIG9mIGZpbGVzIHRoYXQgY2FuIGJlCi0gIG1tYXAoKWQsIGV4cGVyaW1lbnRhdGlvbiBpcyBwcm9iYWJseSB0aGUgZWFzaWVzdCB3YXkgdG8gZmluZCBvdXQuCi0gIDwvUD4KLSAgPFA+Ci0gIFRoaXMgbW1hcCgpaW5nIGlzIGRvbmUgb25jZSBhdCBzZXJ2ZXIgc3RhcnQgb3IgcmVzdGFydCwgb25seS4gU28gd2hlbmV2ZXIKLSAgb25lIG9mIHRoZSBtYXBwZWQgZmlsZXMgY2hhbmdlcyBvbiB0aGUgZmlsZXN5c3RlbSB5b3UgPEVNPmhhdmU8L0VNPiB0bwotICByZXN0YXJ0IHRoZSBzZXJ2ZXIgKHNlZSB0aGUgPEEgSFJFRj0iLi4vc3RvcHBpbmcuaHRtbCI+U3RvcHBpbmcgYW5kCi0gIFJlc3RhcnRpbmc8L0E+IGRvY3VtZW50YXRpb24pLiAgVG8gcmVpdGVyYXRlIHRoYXQgcG9pbnQ6ICBpZiB0aGUKLSAgZmlsZXMgYXJlIG1vZGlmaWVkIDxFTT5pbiBwbGFjZTwvRU0+IHdpdGhvdXQgcmVzdGFydGluZyB0aGUgc2VydmVyCi0gIHlvdSBtYXkgZW5kIHVwIHNlcnZpbmcgcmVxdWVzdHMgdGhhdCBhcmUgY29tcGxldGVseSBib2d1cy4gIFlvdQotICBzaG91bGQgdXBkYXRlIGZpbGVzIGJ5IHVubGlua2luZyB0aGUgb2xkIGNvcHkgYW5kIHB1dHRpbmcgYSBuZXcKLSAgY29weSBpbiBwbGFjZS4gTW9zdCB0b29scyBzdWNoIGFzIDxDT0RFPnJkaXN0PC9DT0RFPiBhbmQKLSAgPENPREU+bXY8L0NPREU+IGRvIHRoaXMuIFRoZSByZWFzb24gd2h5IHRoaXMgbW9kdWxlcyBkb2Vzbid0IHRha2UKLSAgY2FyZSBvZiBjaGFuZ2VzIHRvIHRoZSBmaWxlcyBpcyB0aGF0IHRoaXMgY2hlY2sgd291bGQgbmVlZCBhbiBleHRyYQotICA8Q09ERT5zdGF0KCk8L0NPREU+IGV2ZXJ5IHRpbWUgd2hpY2ggaXMgYSB3YXN0ZSBhbmQgYWdhaW5zdCB0aGUKLSAgaW50ZW50IG9mIEkvTyByZWR1Y3Rpb24uCi0gIDwvUD4KLQotICA8SDM+PENPREU+Q2FjaGVGaWxlPC9DT0RFPiBEaXJlY3RpdmUgPC9IMz4KLSAgPFA+Ci0gIFRoZSA8Q09ERT5DYWNoZUZpbGU8L0NPREU+IGRpcmVjdGl2ZSBvZiA8Q09ERT5tb2RfZmlsZV9jYWNoZTwvQ09ERT4KLSAgb3BlbnMgYW4gYWN0aXZlIDxFTT5oYW5kbGU8L0VNPiBvciA8RU0+ZmlsZSBkZXNjcmlwdG9yPC9FTT4gdG8gdGhlCi0gIGZpbGUgKG9yIGZpbGVzKSBsaXN0ZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlIGFuZCBwbGFjZXMKLSAgdGhlc2Ugb3BlbiBmaWxlIGhhbmRsZXMgaW4gdGhlIGNhY2hlLiAgV2hlbiB0aGUgZmlsZSBpcyByZXF1ZXN0ZWQsCi0gIHRoZSBzZXJ2ZXIgcmV0cmlldmVzIHRoZSBoYW5kbGUgZnJvbSB0aGUgY2FjaGUgYW5kIHBhc3NlcyBpdCB0byB0aGUKLSAgc2VuZGZpbGUoKSAob3IgVHJhbnNtaXRGaWxlKCkgb24gV2luZG93cyksIHNvY2tldCBBUEkuIAotICA8L1A+Ci0gIDxQPgotICBJbnNlcnQgbW9yZSBkZXRhaWxzIGFib3V0IHNlbmRmaWxlIEFQSS4uLgotICA8L1A+Ci0gIDxQPgotICBUaGlzIGZpbGUgaGFuZGxlIGNhY2hpbmcgaXMgZG9uZSBvbmNlIGF0IHNlcnZlciBzdGFydCBvciByZXN0YXJ0LAotICBvbmx5LiBTbyB3aGVuZXZlciBvbmUgb2YgdGhlIGNhY2hlZCBmaWxlcyBjaGFuZ2VzIG9uIHRoZSBmaWxlc3lzdGVtCi0gIHlvdSA8RU0+aGF2ZTwvRU0+IHRvIHJlc3RhcnQgdGhlIHNlcnZlciAoc2VlIHRoZSA8QQotICBIUkVGPSIuLi9zdG9wcGluZy5odG1sIj5TdG9wcGluZyBhbmQgUmVzdGFydGluZzwvQT4gZG9jdW1lbnRhdGlvbikuCi0gIFRvIHJlaXRlcmF0ZSB0aGF0IHBvaW50OiAgaWYgdGhlIGZpbGVzIGFyZSBtb2RpZmllZCA8RU0+aW4KLSAgcGxhY2U8L0VNPiB3aXRob3V0IHJlc3RhcnRpbmcgdGhlIHNlcnZlciB5b3UgbWF5IGVuZCB1cCBzZXJ2aW5nCi0gIHJlcXVlc3RzIHRoYXQgYXJlIGNvbXBsZXRlbHkgYm9ndXMuICBZb3Ugc2hvdWxkIHVwZGF0ZSBmaWxlcyBieQotICB1bmxpbmtpbmcgdGhlIG9sZCBjb3B5IGFuZCBwdXR0aW5nIGEgbmV3IGNvcHkgaW4gcGxhY2UuIE1vc3QgdG9vbHMKLSAgc3VjaCBhcyA8Q09ERT5yZGlzdDwvQ09ERT4gYW5kIDxDT0RFPm12PC9DT0RFPiBkbyB0aGlzLgotICA8L1A+Ci0KLSAgPEgyPkRpcmVjdGl2ZXM8L0gyPgotICA8VUw+Ci0gICA8TEk+PEEgSFJFRj0iI21tYXBmaWxlIj5NTWFwRmlsZTwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI2NhY2hlZmlsZSI+Q2FjaGVGaWxlPC9BPgotICAgPC9MST4KLSAgPC9VTD4KLQotICA8SFI+Ci0KLSAgPEgyPjxBIE5BTUU9Im1tYXBmaWxlIj5NTWFwRmlsZTwvQT48L0gyPgotICA8UD4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBNTWFwRmlsZSA8RU0+ZmlsZW5hbWUgLi4uPC9FTT4KLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPEVNPk5vbmU8L0VNPgotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXItY29uZmlnCi0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gPEVNPk5vdCBhcHBsaWNhYmxlPC9FTT4KLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEV4cGVyaW1lbnRhbAotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2ZpbGVfY2FjaGUKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gT25seSBpbiBBcGFjaGUgMS4zICh2aWEKLSAgbW9kX21tYXBfc3RhdGlzKSBvciBsYXRlci4KLQotICA8UD4KLSAgVGhlIDxDT0RFPk1NYXBGaWxlPC9DT0RFPiBkaXJlY3RpdmUgbWFwcyBvbmUgb3IgbW9yZSBmaWxlcyAoZ2l2ZW4gYXMKLSAgd2hpdGVzcGFjZSBzZXBhcmF0ZWQgYXJndW1lbnRzKSBpbnRvIG1lbW9yeSBhdCBzZXJ2ZXIgc3RhcnR1cCB0aW1lLiAgVGhleQotICBhcmUgYXV0b21hdGljYWxseSB1bm1hcHBlZCBvbiBhIHNlcnZlciBzaHV0ZG93bi4gV2hlbiB0aGUgZmlsZXMgaGF2ZSBjaGFuZ2VkCi0gIG9uIHRoZSBmaWxlc3lzdGVtIGF0IGxlYXN0IGEgSFVQIG9yIFVTUjEgc2lnbmFsIHNob3VsZCBiZSBzZW5kIHRvIHRoZSBzZXJ2ZXIKLSAgdG8gcmUtbW1hcCB0aGVtLgotICA8L1A+Ci0KLSAgPFA+Ci0gIEJlIGNhcmVmdWwgd2l0aCB0aGUgPEVNPmZpbGVuYW1lPC9FTT4gYXJndW1lbnRzOiBUaGV5IGhhdmUgdG8gbGl0ZXJhbGx5Ci0gIG1hdGNoIHRoZSBmaWxlc3lzdGVtIHBhdGggQXBhY2hlJ3MgVVJMLXRvLWZpbGVuYW1lIHRyYW5zbGF0aW9uIGhhbmRsZXJzCi0gIGNyZWF0ZS4gV2UgY2Fubm90IGNvbXBhcmUgaW5vZGVzIG9yIG90aGVyIHN0dWZmIHRvIG1hdGNoIHBhdGhzIHRocm91Z2gKLSAgc3ltYm9saWMgbGlua3MgPEVNPmV0Yy48L0VNPiBiZWNhdXNlIHRoYXQgYWdhaW4gd291bGQgY29zdCBleHRyYSA8Q09ERT5zdGF0KCk8L0NPREU+Ci0gIHN5c3RlbSBjYWxscyB3aGljaCBpcyBub3QgYWNjZXB0YWJsZS4gIFRoaXMgbW9kdWxlIG1heSBvciBtYXkgbm90IHdvcmsKLSAgd2l0aCBmaWxlbmFtZXMgcmV3cml0dGVuIGJ5IDxDT0RFPm1vZF9hbGlhczwvQ09ERT4gb3IKLSAgPENPREU+bW9kX3Jld3JpdGU8L0NPREU+LgotICA8L1A+Ci0KLSAgRXhhbXBsZToKLQotICA8UFJFPgotICBNTWFwRmlsZSAvdXNyL2xvY2FsL2FwYWNoZS9odGRvY3MvaW5kZXguaHRtbAotICA8L1BSRT4KLQotCi0gIDxIMj48QSBOQU1FPSJjYWNoZWZpbGUiPkNhY2hlRmlsZTwvQT48L0gyPgotICA8UD4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBDYWNoZUZpbGUgPEVNPmZpbGVuYW1lIC4uLjwvRU0+Ci0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxFTT5Ob25lPC9FTT4KLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyLWNvbmZpZwotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IDxFTT5Ob3QgYXBwbGljYWJsZTwvRU0+Ci0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBFeHBlcmltZW50YWwKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9maWxlX2NhY2hlCi0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IE9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZSAyLjAgb3IgbGF0ZXIuCi0KLSAgPFA+Ci0gIFRoZSA8Q09ERT5DYWNoZUZpbGU8L0NPREU+IGRpcmVjdGl2ZSBvcGVucyBoYW5kbGVzIHRvIG9uZSBvciBtb3JlCi0gIGZpbGVzIChnaXZlbiBhcyB3aGl0ZXNwYWNlIHNlcGFyYXRlZCBhcmd1bWVudHMpIGFuZCBwbGFjZXMgdGhlc2UKLSAgaGFuZGxlcyBpbnRvIHRoZSBjYWNoZSBhdCBzZXJ2ZXIgc3RhcnR1cCB0aW1lLiAgSGFuZGxlcyB0byBjYWNoZWQKLSAgZmlsZXMgYXJlIGF1dG9tYXRpY2FsbHkgY2xvc2VkIG9uIGEgc2VydmVyIHNodXRkb3duLiBXaGVuIHRoZSBmaWxlcwotICBoYXZlIGNoYW5nZWQgb24gdGhlIGZpbGVzeXN0ZW0sIHRoZSBzZXJ2ZXIgc2hvdWxkIGJlIHJlc3RhcnRlZCB0bwotICB0byByZS1jYWNoZSB0aGVtLgotICA8L1A+Ci0KLSAgPFA+Ci0gIEJlIGNhcmVmdWwgd2l0aCB0aGUgPEVNPmZpbGVuYW1lPC9FTT4gYXJndW1lbnRzOiBUaGV5IGhhdmUgdG8gbGl0ZXJhbGx5Ci0gIG1hdGNoIHRoZSBmaWxlc3lzdGVtIHBhdGggQXBhY2hlJ3MgVVJMLXRvLWZpbGVuYW1lIHRyYW5zbGF0aW9uIGhhbmRsZXJzCi0gIGNyZWF0ZS4gV2UgY2Fubm90IGNvbXBhcmUgaW5vZGVzIG9yIG90aGVyIHN0dWZmIHRvIG1hdGNoIHBhdGhzIHRocm91Z2gKLSAgc3ltYm9saWMgbGlua3MgPEVNPmV0Yy48L0VNPiBiZWNhdXNlIHRoYXQgYWdhaW4gd291bGQgY29zdCBleHRyYSA8Q09ERT5zdGF0KCk8L0NPREU+Ci0gIHN5c3RlbSBjYWxscyB3aGljaCBpcyBub3QgYWNjZXB0YWJsZS4gIFRoaXMgbW9kdWxlIG1heSBvciBtYXkgbm90IHdvcmsKLSAgd2l0aCBmaWxlbmFtZXMgcmV3cml0dGVuIGJ5IDxDT0RFPm1vZF9hbGlhczwvQ09ERT4gb3IKLSAgPENPREU+bW9kX3Jld3JpdGU8L0NPREU+LgotICA8L1A+Ci0KLSAgRXhhbXBsZToKLQotICA8UFJFPgotICBDYWNoZUZpbGUgL3Vzci9sb2NhbC9hcGFjaGUvaHRkb2NzL2luZGV4Lmh0bWwKLSAgPC9QUkU+Ci0KLSAgPFA+Ci0gIDxTVFJPTkc+Tm90ZTwvU1RST05HPjogZG9uJ3QgYm90aGVyIGFza2luZyBmb3IgYSBmb3IgYSBkaXJlY3RpdmUgd2hpY2gKLSAgcmVjdXJzaXZlbHkgY2FjaGVzIGFsbCB0aGUgZmlsZXMgaW4gYSBkaXJlY3RvcnkuIFRyeSB0aGlzCi0gIGluc3RlYWQuLi4gCi0gIFNlZSB0aGUgPEEgSFJFRj0iY29yZS5odG1sI2luY2x1ZGUiPkluY2x1ZGU8L0E+IGRpcmVjdGl2ZSwgYW5kIGNvbnNpZGVyIHRoaXMgY29tbWFuZDoKLSAgPFBSRT4KLSAgZmluZCAvd3d3L2h0ZG9jcyAtdHlwZSBmIC1wcmludCBcCi0gIHwgc2VkIC1lICdzLy4qL21tYXBmaWxlICZhbXA7LycgJmd0OyAvd3d3L2NvbmYvbW1hcC5jb25mCi0gIDwvUFJFPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotIDwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfZmlsZV9jYWNoZS54bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2ZpbGVfY2FjaGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTZmNGE0Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfZmlsZV9jYWNoZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgbW9kdWxlc3lub3BzaXMgU1lTVEVNICIuLi9zdHlsZS9tb2R1bGVzeW5vcHNpcy5kdGQiPgotPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iLi4vc3R5bGUvbWFudWFsLnhzbCI/PgotPG1vZHVsZXN5bm9wc2lzPgotCi08bmFtZT5tb2RfZmlsZV9jYWNoZTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5DYWNoZXMgYSBzdGF0aWMgbGlzdCBvZiBmaWxlcyBpbiBtZW1vcnk8L2Rlc2NyaXB0aW9uPgotPHN0YXR1cz5FeHBlcmltZW50YWw8L3N0YXR1cz4KLTxzb3VyY2VmaWxlPm1vZF9maWxlX2NhY2hlLmM8L3NvdXJjZWZpbGU+Ci08aWRlbnRpZmllcj5maWxlX2NhY2hlX21vZHVsZTwvaWRlbnRpZmllcj4KLQotPHN1bW1hcnk+Ci0KLTxub3RlIHR5cGU9Indhcm5pbmciPgotVGhpcyBtb2R1bGUgc2hvdWxkIGJlIHVzZWQgd2l0aCBjYXJlLiBZb3UgY2FuIGVhc2lseQotICAgIGNyZWF0ZSBhIGJyb2tlbiBzaXRlIHVzaW5nIG1vZF9maWxlX2NhY2hlLCBzbyByZWFkIHRoaXMKLSAgICBkb2N1bWVudCBjYXJlZnVsbHkuCi08L25vdGU+Ci0KLSAgICA8cD48ZW0+Q2FjaGluZzwvZW0+IGZyZXF1ZW50bHkgcmVxdWVzdGVkIGZpbGVzIHRoYXQgY2hhbmdlIHZlcnkKLSAgICBpbmZyZXF1ZW50bHkgaXMgYSB0ZWNobmlxdWUgZm9yIHJlZHVjaW5nIHNlcnZlciBsb2FkLgotICAgIG1vZF9maWxlX2NhY2hlIHByb3ZpZGVzIHR3byB0ZWNobmlxdWVzIGZvciBjYWNoaW5nIGZyZXF1ZW50bHkKLSAgICByZXF1ZXN0ZWQgPGVtPnN0YXRpYzwvZW0+IGZpbGVzLiBUaHJvdWdoIGNvbmZpZ3VyYXRpb24KLSAgICBkaXJlY3RpdmVzLCB5b3UgY2FuIGRpcmVjdCBtb2RfZmlsZV9jYWNoZSB0byBlaXRoZXIgb3BlbiB0aGVuCi0gICAgbW1hcCgpYSBmaWxlLCBvciB0byBwcmUtb3BlbiBhIGZpbGUgYW5kIHNhdmUgdGhlIGZpbGUncyBvcGVuCi0gICAgPGVtPmZpbGUgaGFuZGxlPC9lbT4uIEJvdGggdGVjaG5pcXVlcyByZWR1Y2Ugc2VydmVyIGxvYWQgd2hlbgotICAgIHByb2Nlc3NpbmcgcmVxdWVzdHMgZm9yIHRoZXNlIGZpbGVzIGJ5IGRvaW5nIHBhcnQgb2YgdGhlIHdvcmsKLSAgICAoc3BlY2lmaWNhbGx5LCB0aGUgZmlsZSBJL08pIGZvciBzZXJ2aW5nIHRoZSBmaWxlIHdoZW4gdGhlCi0gICAgc2VydmVyIGlzIHN0YXJ0ZWQgcmF0aGVyIHRoYW4gZHVyaW5nIGVhY2ggcmVxdWVzdC48L3A+Ci0KLSAgICA8cD5Ob3RpY2U6IFlvdSBjYW5ub3QgdXNlIHRoaXMgZm9yIHNwZWVkaW5nIHVwIENHSSBwcm9ncmFtcyBvcgotICAgIG90aGVyIGZpbGVzIHdoaWNoIGFyZSBzZXJ2ZWQgYnkgc3BlY2lhbCBjb250ZW50IGhhbmRsZXJzLiBJdAotICAgIGNhbiBvbmx5IGJlIHVzZWQgZm9yIHJlZ3VsYXIgZmlsZXMgd2hpY2ggYXJlIHVzdWFsbHkgc2VydmVkIGJ5Ci0gICAgdGhlIEFwYWNoZSBjb3JlIGNvbnRlbnQgaGFuZGxlci48L3A+Ci0KLSAgICA8cD5UaGlzIG1vZHVsZSBpcyBhbiBleHRlbnNpb24gb2YgYW5kIGJvcnJvd3MgaGVhdmlseSBmcm9tIHRoZQotICAgIG1vZF9tbWFwX3N0YXRpYyBtb2R1bGUgaW4gQXBhY2hlIDEuMy48L3A+Ci08L3N1bW1hcnk+Ci0KLTxzZWN0aW9uPjx0aXRsZT5Vc2luZyBtb2RfZmlsZV9jYWNoZTwvdGl0bGU+Ci0KLSAgICA8cD48bW9kdWxlPm1vZF9maWxlX2NhY2hlPC9tb2R1bGU+IGNhY2hlcyBhIGxpc3Qgb2Ygc3RhdGljYWxseQotICAgIGNvbmZpZ3VyZWQgZmlsZXMgdmlhIDxkaXJlY3RpdmUKLSAgICBtb2R1bGU9Im1vZF9maWxlX2NhY2hlIj5NTWFwRmlsZTwvZGlyZWN0aXZlPiBvciA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJtb2RfZmlsZV9jYWNoZSI+Q2FjaGVGaWxlPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZXMgaW4gdGhlCi0gICAgbWFpbiBzZXJ2ZXIgY29uZmlndXJhdGlvbi48L3A+Ci0KLSAgICA8cD5Ob3QgYWxsIHBsYXRmb3JtcyBzdXBwb3J0IGJvdGggZGlyZWN0aXZlcy4gRm9yIGV4YW1wbGUsIEFwYWNoZQotICAgIG9uIFdpbmRvd3MgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgdGhlIDxkaXJlY3RpdmUKLSAgICBtb2R1bGU9Im1vZF9maWxlX2NhY2hlIj5NTWFwU3RhdGljPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSwgd2hpbGUKLSAgICBvdGhlciBwbGF0Zm9ybXMsIGxpa2UgQUlYLCBzdXBwb3J0IGJvdGguIFlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IKLSAgICBtZXNzYWdlIGluIHRoZSBzZXJ2ZXIgZXJyb3IgbG9nIGlmIHlvdSBhdHRlbXB0IHRvIHVzZSBhbgotICAgIHVuc3VwcG9ydGVkIGRpcmVjdGl2ZS4gSWYgZ2l2ZW4gYW4gdW5zdXBwb3J0ZWQgZGlyZWN0aXZlLCB0aGUKLSAgICBzZXJ2ZXIgd2lsbCBzdGFydCBidXQgdGhlIGZpbGUgd2lsbCBub3QgYmUgY2FjaGVkLiBPbiBwbGF0Zm9ybXMKLSAgICB0aGF0IHN1cHBvcnQgYm90aCBkaXJlY3RpdmVzLCB5b3Ugc2hvdWxkIGV4cGVyaW1lbnQgd2l0aCBib3RoIHRvCi0gICAgc2VlIHdoaWNoIHdvcmtzIGJlc3QgZm9yIHlvdS48L3A+Ci0KLTxzZWN0aW9uPjx0aXRsZT5NbWFwRmlsZSBEaXJlY3RpdmU8L3RpdGxlPgotCi0gICAgPHA+VGhlIDxkaXJlY3RpdmUgbW9kdWxlPSJtb2RfZmlsZV9jYWNoZSI+TW1hcEZpbGU8L2RpcmVjdGl2ZT4KLSAgICBkaXJlY3RpdmUgb2YgPG1vZHVsZT5tb2RfZmlsZV9jYWNoZTwvbW9kdWxlPiBtYXBzIGEgbGlzdCBvZgotICAgIHN0YXRpY2FsbHkgY29uZmlndXJlZCBmaWxlcyBpbnRvIG1lbW9yeSB0aHJvdWdoIHRoZSBzeXN0ZW0gY2FsbAotICAgIDxjb2RlPm1tYXAoKTwvY29kZT4uIFRoaXMgc3lzdGVtIGNhbGwgaXMgYXZhaWxhYmxlIG9uIG1vc3QgbW9kZXJuCi0gICAgVW5peCBkZXJpdmF0ZXMsIGJ1dCBub3Qgb24gYWxsLiBUaGVyZSBhcmUgc29tZXRpbWVzCi0gICAgc3lzdGVtLXNwZWNpZmljIGxpbWl0cyBvbiB0aGUgc2l6ZSBhbmQgbnVtYmVyIG9mIGZpbGVzIHRoYXQgY2FuIGJlCi0gICAgbW1hcCgpZCwgZXhwZXJpbWVudGF0aW9uIGlzIHByb2JhYmx5IHRoZSBlYXNpZXN0IHdheSB0byBmaW5kCi0gICAgb3V0LjwvcD4KLQotICAgIDxwPlRoaXMgbW1hcCgpaW5nIGlzIGRvbmUgb25jZSBhdCBzZXJ2ZXIgc3RhcnQgb3IgcmVzdGFydCwKLSAgICBvbmx5LiBTbyB3aGVuZXZlciBvbmUgb2YgdGhlIG1hcHBlZCBmaWxlcyBjaGFuZ2VzIG9uIHRoZQotICAgIGZpbGVzeXN0ZW0geW91IDxlbT5oYXZlPC9lbT4gdG8gcmVzdGFydCB0aGUgc2VydmVyIChzZWUgdGhlIDxhCi0gICAgaHJlZj0iLi4vc3RvcHBpbmcuaHRtbCI+U3RvcHBpbmcgYW5kIFJlc3RhcnRpbmc8L2E+Ci0gICAgZG9jdW1lbnRhdGlvbikuIFRvIHJlaXRlcmF0ZSB0aGF0IHBvaW50OiBpZiB0aGUgZmlsZXMgYXJlCi0gICAgbW9kaWZpZWQgPGVtPmluIHBsYWNlPC9lbT4gd2l0aG91dCByZXN0YXJ0aW5nIHRoZSBzZXJ2ZXIgeW91Ci0gICAgbWF5IGVuZCB1cCBzZXJ2aW5nIHJlcXVlc3RzIHRoYXQgYXJlIGNvbXBsZXRlbHkgYm9ndXMuIFlvdQotICAgIHNob3VsZCB1cGRhdGUgZmlsZXMgYnkgdW5saW5raW5nIHRoZSBvbGQgY29weSBhbmQgcHV0dGluZyBhIG5ldwotICAgIGNvcHkgaW4gcGxhY2UuIE1vc3QgdG9vbHMgc3VjaCBhcyA8Y29kZT5yZGlzdDwvY29kZT4gYW5kCi0gICAgPGNvZGU+bXY8L2NvZGU+IGRvIHRoaXMuIFRoZSByZWFzb24gd2h5IHRoaXMgbW9kdWxlcyBkb2Vzbid0Ci0gICAgdGFrZSBjYXJlIG9mIGNoYW5nZXMgdG8gdGhlIGZpbGVzIGlzIHRoYXQgdGhpcyBjaGVjayB3b3VsZCBuZWVkCi0gICAgYW4gZXh0cmEgPGNvZGU+c3RhdCgpPC9jb2RlPiBldmVyeSB0aW1lIHdoaWNoIGlzIGEgd2FzdGUgYW5kCi0gICAgYWdhaW5zdCB0aGUgaW50ZW50IG9mIEkvTyByZWR1Y3Rpb24uPC9wPgotPC9zZWN0aW9uPgotCi08c2VjdGlvbj48dGl0bGU+Q2FjaGVGaWxlIERpcmVjdGl2ZTwvdGl0bGU+Ci0KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZSBtb2R1bGU9Im1vZF9maWxlX2NhY2hlIj5DYWNoZUZpbGU8L2RpcmVjdGl2ZT4KLSAgICBkaXJlY3RpdmUgb2YgPG1vZHVsZT5tb2RfZmlsZV9jYWNoZTwvbW9kdWxlPiBvcGVucyBhbiBhY3RpdmUKLSAgICA8ZW0+aGFuZGxlPC9lbT4gb3IgPGVtPmZpbGUgZGVzY3JpcHRvcjwvZW0+IHRvIHRoZSBmaWxlIChvciBmaWxlcykKLSAgICBsaXN0ZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlIGFuZCBwbGFjZXMgdGhlc2Ugb3BlbiBmaWxlCi0gICAgaGFuZGxlcyBpbiB0aGUgY2FjaGUuIFdoZW4gdGhlIGZpbGUgaXMgcmVxdWVzdGVkLCB0aGUgc2VydmVyCi0gICAgcmV0cmlldmVzIHRoZSBoYW5kbGUgZnJvbSB0aGUgY2FjaGUgYW5kIHBhc3NlcyBpdCB0byB0aGUKLSAgICBzZW5kZmlsZSgpIChvciBUcmFuc21pdEZpbGUoKSBvbiBXaW5kb3dzKSwgc29ja2V0IEFQSS48L3A+Ci0KLSAgICA8cD5JbnNlcnQgbW9yZSBkZXRhaWxzIGFib3V0IHNlbmRmaWxlIEFQSS4uLjwvcD4KLQotICAgIDxwPlRoaXMgZmlsZSBoYW5kbGUgY2FjaGluZyBpcyBkb25lIG9uY2UgYXQgc2VydmVyIHN0YXJ0IG9yCi0gICAgcmVzdGFydCwgb25seS4gU28gd2hlbmV2ZXIgb25lIG9mIHRoZSBjYWNoZWQgZmlsZXMgY2hhbmdlcyBvbgotICAgIHRoZSBmaWxlc3lzdGVtIHlvdSA8ZW0+aGF2ZTwvZW0+IHRvIHJlc3RhcnQgdGhlIHNlcnZlciAoc2VlIHRoZQotICAgIDxhIGhyZWY9Ii4uL3N0b3BwaW5nLmh0bWwiPlN0b3BwaW5nIGFuZCBSZXN0YXJ0aW5nPC9hPgotICAgIGRvY3VtZW50YXRpb24pLiBUbyByZWl0ZXJhdGUgdGhhdCBwb2ludDogaWYgdGhlIGZpbGVzIGFyZQotICAgIG1vZGlmaWVkIDxlbT5pbiBwbGFjZTwvZW0+IHdpdGhvdXQgcmVzdGFydGluZyB0aGUgc2VydmVyIHlvdQotICAgIG1heSBlbmQgdXAgc2VydmluZyByZXF1ZXN0cyB0aGF0IGFyZSBjb21wbGV0ZWx5IGJvZ3VzLiBZb3UKLSAgICBzaG91bGQgdXBkYXRlIGZpbGVzIGJ5IHVubGlua2luZyB0aGUgb2xkIGNvcHkgYW5kIHB1dHRpbmcgYSBuZXcKLSAgICBjb3B5IGluIHBsYWNlLiBNb3N0IHRvb2xzIHN1Y2ggYXMgPGNvZGU+cmRpc3Q8L2NvZGU+IGFuZAotICAgIDxjb2RlPm12PC9jb2RlPiBkbyB0aGlzLjwvcD4KLTwvc2VjdGlvbj4KLQotPG5vdGU+PHRpdGxlPk5vdGU8L3RpdGxlPiBEb24ndCBib3RoZXIgYXNraW5nIGZvciBhIGZvciBhCi0gICAgZGlyZWN0aXZlIHdoaWNoIHJlY3Vyc2l2ZWx5IGNhY2hlcyBhbGwgdGhlIGZpbGVzIGluIGEKLSAgICBkaXJlY3RvcnkuIFRyeSB0aGlzIGluc3RlYWQuLi4gU2VlIHRoZSAKLSAgICA8ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSI+SW5jbHVkZTwvZGlyZWN0aXZlPiBkaXJlY3RpdmUsIGFuZCBjb25zaWRlcgotICAgIHRoaXMgY29tbWFuZDoKLTxleGFtcGxlPgotICBmaW5kIC93d3cvaHRkb2NzIC10eXBlIGYgLXByaW50IFwgPGJyIC8+Ci0gIHwgc2VkIC1lICdzLy4qL21tYXBmaWxlICZhbXA7LycgJmd0OyAvd3d3L2NvbmYvbW1hcC5jb25mCi08L2V4YW1wbGU+Ci08L25vdGU+Ci0KLTwvc2VjdGlvbj4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+TU1hcEZpbGU8L25hbWU+Ci08c3ludGF4Pk1NYXBGaWxlIDxlbT5maWxlLXBhdGg8L2VtPiBbPGVtPmZpbGUtcGF0aDwvZW0+XSAuLi48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5NTWFwRmlsZTwvZGlyZWN0aXZlPiBkaXJlY3RpdmUgbWFwcyBvbmUgb3IgbW9yZSBmaWxlcwotICAgIChnaXZlbiBhcyB3aGl0ZXNwYWNlIHNlcGFyYXRlZCBhcmd1bWVudHMpIGludG8gbWVtb3J5IGF0IHNlcnZlcgotICAgIHN0YXJ0dXAgdGltZS4gVGhleSBhcmUgYXV0b21hdGljYWxseSB1bm1hcHBlZCBvbiBhIHNlcnZlcgotICAgIHNodXRkb3duLiBXaGVuIHRoZSBmaWxlcyBoYXZlIGNoYW5nZWQgb24gdGhlIGZpbGVzeXN0ZW0gYXQKLSAgICBsZWFzdCBhIEhVUCBvciBVU1IxIHNpZ25hbCBzaG91bGQgYmUgc2VuZCB0byB0aGUgc2VydmVyIHRvCi0gICAgcmUtbW1hcCB0aGVtLjwvcD4KLQotICAgIDxwPkJlIGNhcmVmdWwgd2l0aCB0aGUgPGVtPmZpbGUtcGF0aDwvZW0+IGFyZ3VtZW50czogVGhleSBoYXZlCi0gICAgdG8gbGl0ZXJhbGx5IG1hdGNoIHRoZSBmaWxlc3lzdGVtIHBhdGggQXBhY2hlJ3MgVVJMLXRvLWZpbGVuYW1lCi0gICAgdHJhbnNsYXRpb24gaGFuZGxlcnMgY3JlYXRlLiBXZSBjYW5ub3QgY29tcGFyZSBpbm9kZXMgb3Igb3RoZXIKLSAgICBzdHVmZiB0byBtYXRjaCBwYXRocyB0aHJvdWdoIHN5bWJvbGljIGxpbmtzIDxlbT5ldGMuPC9lbT4KLSAgICBiZWNhdXNlIHRoYXQgYWdhaW4gd291bGQgY29zdCBleHRyYSA8Y29kZT5zdGF0KCk8L2NvZGU+IHN5c3RlbQotICAgIGNhbGxzIHdoaWNoIGlzIG5vdCBhY2NlcHRhYmxlLiBUaGlzIG1vZHVsZSBtYXkgb3IgbWF5IG5vdCB3b3JrCi0gICAgd2l0aCBmaWxlbmFtZXMgcmV3cml0dGVuIGJ5IDxtb2R1bGU+bW9kX2FsaWFzPC9tb2R1bGU+IG9yCi0gICAgPG1vZHVsZT5tb2RfcmV3cml0ZTwvbW9kdWxlPi48L3A+Ci0KLTxleGFtcGxlPjx0aXRsZT5FeGFtcGxlPC90aXRsZT4KLSAgTU1hcEZpbGUgL3Vzci9sb2NhbC9hcGFjaGUvaHRkb2NzL2luZGV4Lmh0bWwKLTwvZXhhbXBsZT4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5DYWNoZUZpbGU8L25hbWU+Ci08c3ludGF4PkNhY2hlRmlsZQotICAgIDxlbT5maWxlLXBhdGg8L2VtPiBbPGVtPmZpbGUtcGF0aDwvZW0+XSAuLi48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5DYWNoZUZpbGU8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIG9wZW5zIGhhbmRsZXMgdG8KLSAgICBvbmUgb3IgbW9yZSBmaWxlcyAoZ2l2ZW4gYXMgd2hpdGVzcGFjZSBzZXBhcmF0ZWQgYXJndW1lbnRzKSBhbmQKLSAgICBwbGFjZXMgdGhlc2UgaGFuZGxlcyBpbnRvIHRoZSBjYWNoZSBhdCBzZXJ2ZXIgc3RhcnR1cAotICAgIHRpbWUuIEhhbmRsZXMgdG8gY2FjaGVkIGZpbGVzIGFyZSBhdXRvbWF0aWNhbGx5IGNsb3NlZCBvbiBhIHNlcnZlcgotICAgIHNodXRkb3duLiAgV2hlbiB0aGUgZmlsZXMgaGF2ZSBjaGFuZ2VkIG9uIHRoZSBmaWxlc3lzdGVtLCB0aGUKLSAgICBzZXJ2ZXIgc2hvdWxkIGJlIHJlc3RhcnRlZCB0byB0byByZS1jYWNoZSB0aGVtLjwvcD4KLQotICAgIDxwPkJlIGNhcmVmdWwgd2l0aCB0aGUgPGVtPmZpbGUtcGF0aDwvZW0+IGFyZ3VtZW50czogVGhleSBoYXZlCi0gICAgdG8gbGl0ZXJhbGx5IG1hdGNoIHRoZSBmaWxlc3lzdGVtIHBhdGggQXBhY2hlJ3MgVVJMLXRvLWZpbGVuYW1lCi0gICAgdHJhbnNsYXRpb24gaGFuZGxlcnMgY3JlYXRlLiBXZSBjYW5ub3QgY29tcGFyZSBpbm9kZXMgb3Igb3RoZXIKLSAgICBzdHVmZiB0byBtYXRjaCBwYXRocyB0aHJvdWdoIHN5bWJvbGljIGxpbmtzIDxlbT5ldGMuPC9lbT4KLSAgICBiZWNhdXNlIHRoYXQgYWdhaW4gd291bGQgY29zdCBleHRyYSA8Y29kZT5zdGF0KCk8L2NvZGU+IHN5c3RlbQotICAgIGNhbGxzIHdoaWNoIGlzIG5vdCBhY2NlcHRhYmxlLiBUaGlzIG1vZHVsZSBtYXkgb3IgbWF5IG5vdCB3b3JrCi0gICAgd2l0aCBmaWxlbmFtZXMgcmV3cml0dGVuIGJ5IDxtb2R1bGU+bW9kX2FsaWFzPC9tb2R1bGU+IG9yCi0gICAgPG1vZHVsZT5tb2RfcmV3cml0ZTwvbW9kdWxlPi48L3A+Ci0KLTxleGFtcGxlPjx0aXRsZT5FeGFtcGxlPC90aXRsZT4KLSAgQ2FjaGVGaWxlIC91c3IvbG9jYWwvYXBhY2hlL2h0ZG9jcy9pbmRleC5odG1sCi08L2V4YW1wbGU+Ci08L3VzYWdlPgotCi08L2RpcmVjdGl2ZXN5bm9wc2lzPgotPC9tb2R1bGVzeW5vcHNpcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2hlYWRlcnMuaHRtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfaGVhZGVycy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjI1MjcxLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfaGVhZGVycy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCAyLjAvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIG1vZHVsZSBtb2RfaGVhZGVyczwvVElUTEU+Ci08L0hFQUQ+Ci0KLTxCT0RZPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxoMT5IZWFkZXJzIE1vZHVsZTwvaDE+Ci0KLVRoZSBvcHRpb25hbCBoZWFkZXJzIG1vZHVsZSBhbGxvd3MgZm9yIHRoZSBjdXN0b21pc2F0aW9uIG9mIEhUVFAKLXJlc3BvbnNlIGhlYWRlcnMuIEhlYWRlcnMgY2FuIGJlIG1lcmdlZCwgcmVwbGFjZWQgb3IgcmVtb3ZlZC4gVGhlCi1kaXJlY3RpdmVzIGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50IGFyZSBvbmx5IGF2YWlsYWJsZSBpZiBBcGFjaGUgaXMKLWNvbXBpbGVkIHdpdGggPGI+bW9kX2hlYWRlcnMuYzwvYj4uCi0KLTxocj4KLQotPGgyPkRpcmVjdGl2ZTwvaDI+Ci08dWw+Ci08bGk+PEEgSFJFRj0iI2hlYWRlciI+SGVhZGVyPC9BPgotPC91bD4KLQotPGhyPgotCi08QSBuYW1lPSJoZWFkZXIiPjxoMj5IZWFkZXI8L2gyPjwvQT4KLTxzdHJvbmc+U3l0bmF4Ojwvc3Ryb25nPiBIZWFkZXIgWyBzZXQgfCBhcHBlbmQgfCBhZGQgXSA8ZW0+aGVhZGVyPC9lbT4gPGVtPnZhbHVlPC9lbT48YnI+Ci08c3Ryb25nPlN5dG5heDo8L3N0cm9uZz4gSGVhZGVyIHVuc2V0IDxlbT5oZWFkZXI8L2VtPjxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBhY2Nlc3MuY29uZiwgLmh0YWNjZXNzPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IG9wdGlvbmFsPGJyPgotPHN0cm9uZz5Nb2R1bGU6PC9zdHJvbmc+IG1vZF9oZWFkZXI8cD4KLQotVGhpcyBkaXJlY3RpdmUgY2FuIHJlcGxhY2UsIG1lcmdlIG9yIHJlbW92ZSBIVFRQIHJlc3BvbnNlIGhlYWRlcnMuIFRoZQotYWN0aW9uIGl0IHBlcmZvcm1zIGlzIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFyZ3VtZW50LiBUaGlzIGNhbiBiZSBvbmUKLW9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotCi08dWw+Ci08bGk+PGI+c2V0PC9iPjxicj4KLSAgVGhlIHJlc3BvbnNlIGhlYWRlciBpcyBzZXQsIHJlcGxhY2luZyBhbnkgcHJldmlvdXMgaGVhZGVyIHdpdGggdGhpcyBuYW1lCi0KLTxsaT48Yj5hcHBlbmQ8L2I+PGJyPgotICBUaGUgcmVzcG9uc2UgaGVhZGVyIGlzIGFwcGVuZGVkIHRvIGFueSBleGlzdGluZyBoZWFkZXIgb2YgdGhlIHNhbWUKLSAgbmFtZS4gV2hlbiBhIG5ldyB2YWx1ZSBpcyBtZXJnZWQgb250byBhbiBleGlzdGluZyBoZWFkZXIgaXQgaXMKLSAgc2VwYXJhdGVkIGZyb20gdGhlIGV4aXN0aW5nIGhlYWRlciB3aXRoIGEgY29tbWEuIFRoaXMgaXMgdGhlIEhUVFAgc3RhbmRhcmQKLSAgd2F5IG9mIGdpdmluZyBhIGhlYWRlciBtdWx0aXBsZSB2YWx1ZXMuCi0KLTxsaT48Yj5hZGQ8L2I+PGJyPgotICBUaGUgcmVzcG9uc2UgaGVhZGVyIGlzIGFkZGVkIHRvIHRoZSBleGlzdGluZyBzZXQgb2YgaGVhZGVycywgZXZlbiBpZgotICB0aGlzIGhlYWRlciBhbHJlYWR5IGV4aXN0cy4gVGhpcyBjYW4gcmVzdWx0IGluIHR3byAob3IgbW9yZSkgaGVhZGVycwotICBoYXZpbmcgdGhlIHNhbWUgbmFtZS4gVGhpcyBjYW4gbGVhZCB0byB1bmZvcnNlZW4gY29uc2VxdWVuY2VzLCBhbmQgaW4KLSAgZ2VuZXJhbCAiYXBwZW5kIiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgotCi08bGk+PGI+dW5zZXQ8L2I+PGJyPgotICBUaGUgcmVzcG9uc2UgaGVhZGVyIG9mIHRoaXMgbmFtZSBpcyByZW1vdmVkLCBpZiBpdCBleGlzdHMuIElmIHRoZXJlIGFyZQotICBtdWx0aXBsZSBoZWFkZXJzIG9mIHRoZSBzYW1lIG5hbWUsIG9ubHkgdGhlIGZpcnN0IG9uZSBzZXQgd2lsbCBiZSByZW1vdmVkLgotPC91bD4KLQotVGhpcyBhcmd1bWVudCBpcyBmb2xsb3dlZCBieSBhIGhlYWRlciBuYW1lLCB3aGljaCBjYW4gaW5jbHVkZSB0aGUKLWZpbmFsIGNvbG9uLCBidXQgaXQgaXMgbm90IHJlcXVpcmVkLiBDYXNlIGlzIGlnbm9yZWQuIEZvcgotYWRkLCBhcHBlbmQgYW5kIHNldCBhIHZhbHVlIGlzIGdpdmVuIGFzIHRoZSB0aGlyZCBhcmd1bWVudC4gSWYgdGhpcwotdmFsdWUgY29udGFpbnMgc3BhY2VzLCBpdCBzaG91bGQgYmUgc3Vycm91bmRlZCBieSBkb3VibGUgcXVvdGVzLgotRm9yIHVuc2V0LCBubyB2YWx1ZSBzaG91bGQgYmUgZ2l2ZW4uCi0KLTxoMz5PcmRlciBvZiBQcm9jZXNzaW5nPC9oMz4KLQotVGhlIEhlYWRlciBkaXJlY3RpdmUgY2FuIG9jY3VyIGFsbW9zdCBhbnl3aGVyZSB3aXRoaW4gdGhlIHNlcnZlcgotY29uZmlndXJhdGlvbi4gSXQgaXMgdmFsaWQgaW4gdGhlIG1haW4gc2VydmVyIGNvbmZpZyBhbmQgdmlydHVhbCBob3N0Ci1zZWN0aW9ucywgaW5zaWRlICZsdDtEaXJlY3RvcnkmZ3Q7LCAmbHQ7TG9jYXRpb24mZ3Q7IGFuZCAmbHQ7RmlsZXMmZ3Q7Ci1zZWN0aW9ucywgYW5kIHdpdGhpbiAuaHRhY2Nlc3MgZmlsZXMuCi08cD4KLVRoZSBIZWFkZXIgZGlyZWN0aXZlcyBhcmUgcHJvY2Vzc2VkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci08b2w+Ci08bGk+bWFpbiBzZXJ2ZXIKLTxsaT52aXJ0dWFsIGhvc3QKLTxsaT4mbHQ7RGlyZWN0b3J5Jmd0OyBzZWN0aW9ucyBhbmQgLmh0YWNjZXNzCi08bGk+Jmx0O0xvY2F0aW9uJmd0OwotPGxpPiZsdDtGaWxlcyZndDsKLTwvb2w+Ci0KLU9yZGVyIGlzIGltcG9ydGFudC4gVGhlc2UgdHdvIGhlYWRlcnMgaGF2ZSBhIGRpZmZlcmVudCBlZmZlY3QgaWYgcmV2ZXJzZWQ6Ci08cHJlPgotSGVhZGVyIGFwcGVuZCBBdXRob3IgIkpvaG4gUC4gRG9lIgotSGVhZGVyIHVuc2V0IEF1dGhvcgotPC9wcmU+Ci0KLVRoaXMgd2F5IHJvdW5kLCB0aGUgQXV0aG9yIGhlYWRlciBpcyBub3Qgc2V0LiBJZiByZXZlcnNlZCwgdGhlIEF1dGhvcgotaGVhZGVyIGlzIHNldCB0byAiSm9obiBQLiBEb2UiLgotPHA+Ci0KLVRoZSBIZWFkZXIgZGlyZWN0aXZlcyBhcmUgcHJvY2Vzc2VkIGp1c3QgYmVmb3JlIHRoZSByZXNwb25zZSBpcyBzZW50Ci1ieSBpdHMgaGFuZGxlci4gVGhlc2UgbWVhbnMgdGhhdCBzb21lIGhlYWRlcnMgdGhhdCBhcmUgYWRkZWQganVzdAotYmVmb3JlIHRoZSByZXNwb25zZSBpcyBzZW50IGNhbm5vdCBiZSB1bnNldCBvciBvdmVycmlkZGVuLiBUaGlzCi1pbmNsdWRlcyBoZWFkZXJzIHN1Y2ggYXMgIkRhdGUiIGFuZCAiU2VydmVyIi4KLTxQPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9oZWFkZXJzLnhtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfaGVhZGVycy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MTg4NWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9oZWFkZXJzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBtb2R1bGVzeW5vcHNpcyBTWVNURU0gIi4uL3N0eWxlL21vZHVsZXN5bm9wc2lzLmR0ZCI+Ci08P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveHNsIiBocmVmPSIuLi9zdHlsZS9tYW51YWwueHNsIj8+Ci08bW9kdWxlc3lub3BzaXM+Ci0KLTxuYW1lPm1vZF9oZWFkZXJzPC9uYW1lPgotPGRlc2NyaXB0aW9uPkN1c3RvbWl6YXRpb24gb2YgSFRUUCByZXF1ZXN0Ci0gICAgYW5kIHJlc3BvbnNlIGhlYWRlcnM8L2Rlc2NyaXB0aW9uPgotPHN0YXR1cz5FeHRlbnNpb248L3N0YXR1cz4KLTxzb3VyY2VmaWxlPm1vZF9oZWFkZXJzLmM8L3NvdXJjZWZpbGU+Ci08aWRlbnRpZmllcj5oZWFkZXJzX21vZHVsZTwvaWRlbnRpZmllcj4KLTxjb21wYXRpYmlsaXR5PlJlcXVlc3RIZWFkZXIgaXMgYXZhaWxhYmxlIG9ubHkgaW4gQXBhY2hlIDIuMDwvY29tcGF0aWJpbGl0eT4KLQotPHN1bW1hcnk+Ci0gICAgPHA+VGhpcyBtb2R1bGUgcHJvdmlkZXMgZGlyZWN0aXZlcyB0byBjb250cm9sIGFuZCBtb2RpZnkgSFRUUAotICAgIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGhlYWRlcnMuIEhlYWRlcnMgY2FuIGJlIG1lcmdlZCwgcmVwbGFjZWQKLSAgICBvciByZW1vdmVkLjwvcD4KLTwvc3VtbWFyeT4KLQotPHNlY3Rpb24+PHRpdGxlPk9yZGVyIG9mIFByb2Nlc3Npbmc8L3RpdGxlPgotCi0gICAgPHA+VGhlIGRpcmVjdGl2ZXMgcHJvdmlkZWQgYnkgbW9kX2hlYWRlciBjYW4gb2NjdXIgYWxtb3N0Ci0gICAgYW55d2hlcmUgd2l0aGluIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbi4gVGhleSBhcmUgdmFsaWQgaW4gdGhlCi0gICAgbWFpbiBzZXJ2ZXIgY29uZmlnIGFuZCB2aXJ0dWFsIGhvc3Qgc2VjdGlvbnMsIGluc2lkZQotICAgICZsdDtEaXJlY3RvcnkmZ3Q7LCAmbHQ7TG9jYXRpb24mZ3Q7IGFuZCAmbHQ7RmlsZXMmZ3Q7IHNlY3Rpb25zLAotICAgIGFuZCB3aXRoaW4gLmh0YWNjZXNzIGZpbGVzLjwvcD4KLQotICAgIDxwPlRoZSBkaXJlY3RpdmVzIGFyZSBwcm9jZXNzZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjo8L3A+Ci0KLSAgICA8b2w+Ci0gICAgICA8bGk+bWFpbiBzZXJ2ZXI8L2xpPgotCi0gICAgICA8bGk+dmlydHVhbCBob3N0PC9saT4KLQotICAgICAgPGxpPiZsdDtEaXJlY3RvcnkmZ3Q7IHNlY3Rpb25zIGFuZCAuaHRhY2Nlc3M8L2xpPgotCi0gICAgICA8bGk+Jmx0O0xvY2F0aW9uJmd0OzwvbGk+Ci0KLSAgICAgIDxsaT4mbHQ7RmlsZXMmZ3Q7PC9saT4KLSAgICA8L29sPgotCi0gICAgPHA+T3JkZXIgaXMgaW1wb3J0YW50LiBUaGVzZSB0d28gaGVhZGVycyBoYXZlIGEgZGlmZmVyZW50Ci0gICAgZWZmZWN0IGlmIHJldmVyc2VkOjwvcD4KLQotPGV4YW1wbGU+Ci1SZXF1ZXN0SGVhZGVyIGFwcGVuZCBNaXJyb3JJRCAibWlycm9yIDEyIjxiciAvPgotICAgICAgIFJlcXVlc3RIZWFkZXIgdW5zZXQgTWlycm9ySUQKLTwvZXhhbXBsZT4KLQotICAgIDxwPlRoaXMgd2F5IHJvdW5kLCB0aGUgTWlycm9ySUQgaGVhZGVyIGlzIG5vdCBzZXQuIElmIHJldmVyc2VkLAotICAgIHRoZSBNaXJyb3JJRCBoZWFkZXIgaXMgc2V0IHRvICJtaXJyb3IgMTIiLjwvcD4KLTwvc2VjdGlvbj4KLQotPHNlY3Rpb24+PHRpdGxlPkV4YW1wbGU8L3RpdGxlPgotCi0gICAgPG9sPgotICAgICAgPGxpPkNvcHkgYWxsIHJlcXVlc3QgaGVhZGVycyB0aGF0IGJlZ2luIHdpdGggIlRTIiB0byB0aGUKLSAgICAgIHJlc3BvbnNlIGhlYWRlcnM6Ci0KLTxleGFtcGxlPgotICAgSGVhZGVyIGVjaG8gXlRTKgotPC9leGFtcGxlPjwvbGk+Ci0KLSAgICAgIDxsaT5BZGQgYSBoZWFkZXIsIE15SGVhZGVyLCB0byB0aGUgcmVzcG9uc2UgaW5jbHVkaW5nIGEKLSAgICAgIHRpbWVzdGFtcCBmb3Igd2hlbiB0aGUgcmVxdWVzdCB3YXMgcmVjZWl2ZWQgYW5kIGhvdyBsb25nIGl0Ci0gICAgICB0b29rIHRvIGJlZ2luIHNlcnZpbmcgdGhlIHJlcXVlc3QuIFRoaXMgaGVhZGVyIGNhbiBiZSB1c2VkIGJ5Ci0gICAgICB0aGUgY2xpZW50IHRvIGludHVpdCBsb2FkIG9uIHRoZSBzZXJ2ZXIgb3IgaW4gaXNvbGF0aW5nCi0gICAgICBib3R0bGVuZWNrcyBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0KLTxleGFtcGxlPgotICAgSGVhZGVyIGFkZCBNeUhlYWRlciAiJUQgJXQiCi08L2V4YW1wbGU+Ci0gICAgICAgIHJlc3VsdHMgaW4gdGhpcyBoZWFkZXIgYmVpbmcgYWRkZWQgdG8gdGhlIHJlc3BvbnNlOgotPGV4YW1wbGU+Ci0gICBNeUhlYWRlcjogRD0zNzc1NDI4IHQ9OTkxNDI0NzA0NDQ3MjU2Ci08L2V4YW1wbGU+Ci0gICAgICA8L2xpPgotCi0gICAgICA8bGk+U2F5IGhlbGxvIHRvIEpvZQotCi08ZXhhbXBsZT4KLSAgIEhlYWRlciBhZGQgTXlIZWFkZXIgIkhlbGxvIEpvZS4gSXQgdG9vayAlRCBtaWNyb3NlY29uZHMgZm9yIEFwYWNoZSB0byBzZXJ2ZSB0aGlzIHJlcXVlc3QuIgotPC9leGFtcGxlPgotICAgICAgICByZXN1bHRzIGluIHRoaXMgaGVhZGVyIGJlaW5nIGFkZGVkIHRvIHRoZSByZXNwb25zZTogCi08ZXhhbXBsZT4KLSAgIE15SGVhZGVyOiBIZWxsbyBKb2UuIEl0IHRvb2sgRD0zNzc1NDI4IG1pY3Jvc2Vjb25kcyBmb3IgQXBhY2hlIHRvIHNlcnZlIHRoaXMgcmVxdWVzdC4KLTwvZXhhbXBsZT4KLSAgICAgIDwvbGk+Ci0KLSAgICAgIDxsaT5Db25kaXRpb25hbGx5IHNlbmQgTXlIZWFkZXIgb24gdGhlIHJlc3BvbnNlIGlmIGFuZCBvbmx5Ci0gICAgICBpZiBoZWFkZXIgIk15UmVxdWVzdEhlYWRlciIgaXMgcHJlc2VudCBvbiB0aGUgcmVxdWVzdC4gVGhpcwotICAgICAgaXMgdXNlZnVsIGZvciBjb25zdHJ1Y3RpbmcgaGVhZGVycyBpbiByZXNwb25zZSB0byBzb21lIGNsaWVudAotICAgICAgc3RpbXVsdXMuIE5vdGUgdGhhdCB0aGlzIGV4YW1wbGUgcmVxdWlyZXMgdGhlIHNlcnZpY2VzIG9mIHRoZQotICAgICAgbW9kX3NldGVudmlmIG1vZHVsZS4KLQotPGV4YW1wbGU+Ci0gICBTZXRFbnZJZiBNeVJlcXVlc3RIZWFkZXIgdmFsdWUgSEFWRV9NeVJlcXVlc3RIZWFkZXI8YnIgLz4KLSAgIEhlYWRlciBhZGQgTXlIZWFkZXIgIiVEICV0IG15dGV4dCIgZW52PUhBVkVfTXlSZXF1ZXN0SGVhZGVyCi08L2V4YW1wbGU+Ci0gICAgICAgIElmIHRoZSBoZWFkZXIgIk15UmVxdWVzdEhlYWRlcjogdmFsdWUiIGlzIHByZXNlbnQgb24gdGhlCi0gICAgICAgIEhUVFAgcmVxdWVzdCwgdGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiB0aGUgZm9sbG93aW5nCi0gICAgICAgIGhlYWRlcjogCi08ZXhhbXBsZT4KLSAgIE15SGVhZGVyOiBEPTM3NzU0MjggdD05OTE0MjQ3MDQ0NDcyNTYgbXl0ZXh0Ci08L2V4YW1wbGU+Ci0gICAgICA8L2xpPgotICAgIDwvb2w+Ci08L3NlY3Rpb24+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlJlcXVlc3RIZWFkZXI8L25hbWU+Ci08ZGVzY3JpcHRpb24+Q29uZmlndXJlIEhUVFAgcmVxdWVzdCBoZWFkZXJzPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+UmVxdWVzdEhlYWRlciAgIHNldHxhcHBlbmR8YWRkfHVuc2V0IDxlbT5oZWFkZXI8L2VtPiAKLVs8ZW0+dmFsdWU8L2VtPl08L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PgotPGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0PgotPGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+RmlsZUluZm88L292ZXJyaWRlPgotCi08dXNhZ2U+Ci0gICAgPHA+VGhpcyBkaXJlY3RpdmUgY2FuIHJlcGxhY2UsIG1lcmdlIG9yIHJlbW92ZSBIVFRQIHJlcXVlc3QKLSAgICBoZWFkZXJzLiBUaGUgaGVhZGVyIGlzIG1vZGlmaWVkIGp1c3QgYmVmb3JlIHRoZSBjb250ZW50IGhhbmRsZXIKLSAgICBpcyBydW4sIGFsbG93aW5nIGluY29taW5nIGhlYWRlcnMgdG8gYmUgbW9kaWZpZWQuIFRoZSBhY3Rpb24gaXQKLSAgICBwZXJmb3JtcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcmd1bWVudC4gVGhpcyBjYW4gYmUgb25lCi0gICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6PC9wPgotCi0gICAgPHVsPgotICAgICAgPGxpPjxzdHJvbmc+c2V0PC9zdHJvbmc+PGJyIC8+Ci0gICAgICAgVGhlIHJlcXVlc3QgaGVhZGVyIGlzIHNldCwgcmVwbGFjaW5nIGFueSBwcmV2aW91cyBoZWFkZXIKLSAgICAgIHdpdGggdGhpcyBuYW1lPC9saT4KLQotICAgICAgPGxpPjxzdHJvbmc+YXBwZW5kPC9zdHJvbmc+PGJyIC8+Ci0gICAgICAgVGhlIHJlcXVlc3QgaGVhZGVyIGlzIGFwcGVuZGVkIHRvIGFueSBleGlzdGluZyBoZWFkZXIgb2YgdGhlCi0gICAgICBzYW1lIG5hbWUuIFdoZW4gYSBuZXcgdmFsdWUgaXMgbWVyZ2VkIG9udG8gYW4gZXhpc3RpbmcgaGVhZGVyCi0gICAgICBpdCBpcyBzZXBhcmF0ZWQgZnJvbSB0aGUgZXhpc3RpbmcgaGVhZGVyIHdpdGggYSBjb21tYS4gVGhpcwotICAgICAgaXMgdGhlIEhUVFAgc3RhbmRhcmQgd2F5IG9mIGdpdmluZyBhIGhlYWRlciBtdWx0aXBsZQotICAgICAgdmFsdWVzLjwvbGk+Ci0KLSAgICAgIDxsaT48c3Ryb25nPmFkZDwvc3Ryb25nPjxiciAvPgotICAgICAgIFRoZSByZXF1ZXN0IGhlYWRlciBpcyBhZGRlZCB0byB0aGUgZXhpc3Rpbmcgc2V0IG9mIGhlYWRlcnMsCi0gICAgICBldmVuIGlmIHRoaXMgaGVhZGVyIGFscmVhZHkgZXhpc3RzLiBUaGlzIGNhbiByZXN1bHQgaW4gdHdvCi0gICAgICAob3IgbW9yZSkgaGVhZGVycyBoYXZpbmcgdGhlIHNhbWUgbmFtZS4gVGhpcyBjYW4gbGVhZCB0bwotICAgICAgdW5mb3Jlc2VlbiBjb25zZXF1ZW5jZXMsIGFuZCBpbiBnZW5lcmFsICJhcHBlbmQiIHNob3VsZCBiZQotICAgICAgdXNlZCBpbnN0ZWFkLjwvbGk+Ci0KLSAgICAgIDxsaT48c3Ryb25nPnVuc2V0PC9zdHJvbmc+PGJyIC8+Ci0gICAgICAgVGhlIHJlcXVlc3QgaGVhZGVyIG9mIHRoaXMgbmFtZSBpcyByZW1vdmVkLCBpZiBpdCBleGlzdHMuIElmCi0gICAgICB0aGVyZSBhcmUgbXVsdGlwbGUgaGVhZGVycyBvZiB0aGUgc2FtZSBuYW1lLCBhbGwgd2lsbCBiZQotICAgICAgcmVtb3ZlZC48L2xpPgotICAgIDwvdWw+Ci0KLSAgICA8cD5UaGlzIGFyZ3VtZW50IGlzIGZvbGxvd2VkIGJ5IGEgaGVhZGVyIG5hbWUsIHdoaWNoIGNhbgotICAgIGluY2x1ZGUgdGhlIGZpbmFsIGNvbG9uLCBidXQgaXQgaXMgbm90IHJlcXVpcmVkLiBDYXNlIGlzCi0gICAgaWdub3JlZC4gRm9yIDxjb2RlPmFkZDwvY29kZT4sIDxjb2RlPmFwcGVuZDwvY29kZT4gYW5kCi0gICAgPGNvZGU+c2V0PC9jb2RlPiBhIHZhbHVlIGlzIGdpdmVuIGFzIHRoZSB0aGlyZCBhcmd1bWVudC4gSWYKLSAgICB0aGlzIHZhbHVlIGNvbnRhaW5zIHNwYWNlcywgaXQgc2hvdWxkIGJlIHN1cnJvdW5kZWQgYnkgZG91YmxlCi0gICAgcXVvdGVzLiBGb3IgdW5zZXQsIG5vIHZhbHVlIHNob3VsZCBiZSBnaXZlbi48L3A+Ci0KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5SZXF1ZXN0SGVhZGVyPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBpcyBwcm9jZXNzZWQKLSAgICBqdXN0IGJlZm9yZSB0aGUgcmVxdWVzdCBpcyBydW4gYnkgaXRzIGhhbmRsZXIgaW4gdGhlIGZpeHVwIHBoYXNlLgotICAgIFRoaXMgc2hvdWxkIGFsbG93IGhlYWRlcnMgZ2VuZXJhdGVkIGJ5IHRoZSBicm93c2VyLCBvciBieSBBcGFjaGUKLSAgICBpbnB1dCBmaWx0ZXJzIHRvIGJlIG92ZXJyaWRkZW4gb3IgbW9kaWZpZWQuPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkhlYWRlcjwvbmFtZT4KLTxkZXNjcmlwdGlvbj5Db25maWd1cmUgSFRUUCByZXNwb25zZSBoZWFkZXJzPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+SGVhZGVyIHNldHxhcHBlbmR8YWRkfHVuc2V0fGVjaG8gIDxlbT5oZWFkZXI8L2VtPiAKLVs8ZW0+dmFsdWU8L2VtPl08L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PgotPGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0PgotPGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+RmlsZUluZm88L292ZXJyaWRlPgotCi08dXNhZ2U+Ci0gICAgPHA+VGhpcyBkaXJlY3RpdmUgY2FuIHJlcGxhY2UsIG1lcmdlIG9yIHJlbW92ZSBIVFRQIHJlc3BvbnNlCi0gICAgaGVhZGVycy4gVGhlIGhlYWRlciBpcyBtb2RpZmllZCBqdXN0IGFmdGVyIHRoZSBjb250ZW50IGhhbmRsZXIKLSAgICBhbmQgb3V0cHV0IGZpbHRlcnMgYXJlIHJ1biwgYWxsb3dpbmcgb3V0Z29pbmcgaGVhZGVycyB0byBiZQotICAgIG1vZGlmaWVkLiBUaGUgYWN0aW9uIGl0IHBlcmZvcm1zIGlzIGRldGVybWluZWQgYnkgdGhlIGZpcnN0Ci0gICAgYXJndW1lbnQuIFRoaXMgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczo8L3A+Ci0KLSAgICA8dWw+Ci0gICAgICA8bGk+PHN0cm9uZz5zZXQ8L3N0cm9uZz48YnIgLz4KLSAgICAgICBUaGUgcmVzcG9uc2UgaGVhZGVyIGlzIHNldCwgcmVwbGFjaW5nIGFueSBwcmV2aW91cyBoZWFkZXIKLSAgICAgIHdpdGggdGhpcyBuYW1lLiBUaGUgPGVtPnZhbHVlPC9lbT4gbWF5IGJlIGEgZm9ybWF0Ci0gICAgICBzdHJpbmcuPC9saT4KLQotICAgICAgPGxpPjxzdHJvbmc+YXBwZW5kPC9zdHJvbmc+PGJyIC8+Ci0gICAgICAgVGhlIHJlc3BvbnNlIGhlYWRlciBpcyBhcHBlbmRlZCB0byBhbnkgZXhpc3RpbmcgaGVhZGVyIG9mCi0gICAgICB0aGUgc2FtZSBuYW1lLiBXaGVuIGEgbmV3IHZhbHVlIGlzIG1lcmdlZCBvbnRvIGFuIGV4aXN0aW5nCi0gICAgICBoZWFkZXIgaXQgaXMgc2VwYXJhdGVkIGZyb20gdGhlIGV4aXN0aW5nIGhlYWRlciB3aXRoIGEgY29tbWEuCi0gICAgICBUaGlzIGlzIHRoZSBIVFRQIHN0YW5kYXJkIHdheSBvZiBnaXZpbmcgYSBoZWFkZXIgbXVsdGlwbGUKLSAgICAgIHZhbHVlcy48L2xpPgotCi0gICAgICA8bGk+PHN0cm9uZz5hZGQ8L3N0cm9uZz48YnIgLz4KLSAgICAgICBUaGUgcmVzcG9uc2UgaGVhZGVyIGlzIGFkZGVkIHRvIHRoZSBleGlzdGluZyBzZXQgb2YgaGVhZGVycywKLSAgICAgIGV2ZW4gaWYgdGhpcyBoZWFkZXIgYWxyZWFkeSBleGlzdHMuIFRoaXMgY2FuIHJlc3VsdCBpbiB0d28KLSAgICAgIChvciBtb3JlKSBoZWFkZXJzIGhhdmluZyB0aGUgc2FtZSBuYW1lLiBUaGlzIGNhbiBsZWFkIHRvCi0gICAgICB1bmZvcmVzZWVuIGNvbnNlcXVlbmNlcywgYW5kIGluIGdlbmVyYWwgImFwcGVuZCIgc2hvdWxkIGJlCi0gICAgICB1c2VkIGluc3RlYWQuPC9saT4KLQotICAgICAgPGxpPjxzdHJvbmc+dW5zZXQ8L3N0cm9uZz48YnIgLz4KLSAgICAgICBUaGUgcmVzcG9uc2UgaGVhZGVyIG9mIHRoaXMgbmFtZSBpcyByZW1vdmVkLCBpZiBpdCBleGlzdHMuCi0gICAgICBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgaGVhZGVycyBvZiB0aGUgc2FtZSBuYW1lLCBhbGwgd2lsbCBiZQotICAgICAgcmVtb3ZlZC48L2xpPgotCi0gICAgICA8bGk+PHN0cm9uZz5lY2hvPC9zdHJvbmc+PGJyIC8+Ci0gICAgICAgUmVxdWVzdCBoZWFkZXJzIHdpdGggdGhpcyBuYW1lIGFyZSBlY2hvZWQgYmFjayBpbiB0aGUKLSAgICAgIHJlc3BvbnNlIGhlYWRlcnMuIDxlbT5oZWFkZXI8L2VtPiBtYXkgYmUgYSByZWd1bGFyCi0gICAgICBleHByZXNzaW9uLjwvbGk+Ci0gICAgPC91bD4KLQotICAgIDxwPlRoaXMgYXJndW1lbnQgaXMgZm9sbG93ZWQgYnkgYSA8ZW0+aGVhZGVyPC9lbT4gbmFtZSwgd2hpY2gKLSAgICBjYW4gaW5jbHVkZSB0aGUgZmluYWwgY29sb24sIGJ1dCBpdCBpcyBub3QgcmVxdWlyZWQuIENhc2UgaXMKLSAgICBpZ25vcmVkIGZvciBzZXQsIGFwcGVuZCwgYWRkIGFuZCB1bnNldC4gVGhlIDxlbT5oZWFkZXI8L2VtPgotICAgIG5hbWUgZm9yIGVjaG8gaXMgY2FzZSBzZW5zaXRpdmUgYW5kIG1heSBiZSBhIHJlZ3VsYXIKLSAgICBleHByZXNzaW9uLjwvcD4KLQotICAgIDxwPkZvciA8Y29kZT5hZGQ8L2NvZGU+LCA8Y29kZT5hcHBlbmQ8L2NvZGU+IGFuZAotICAgIDxjb2RlPnNldDwvY29kZT4gYSA8ZW0+dmFsdWU8L2VtPiBpcyBzcGVjaWZpZWQgYXMgdGhlIHRoaXJkCi0gICAgYXJndW1lbnQuIElmIDxlbT52YWx1ZTwvZW0+IGNvbnRhaW5zIHNwYWNlcywgaXQgc2hvdWxkIGJlCi0gICAgc3Vycm91bmRlZCBieSBkb3VibGVxdW90ZXMuIDxlbT52YWx1ZTwvZW0+IG1heSBiZSBhIGNoYXJhY3RlcgotICAgIHN0cmluZywgYSBzdHJpbmcgY29udGFpbmluZyBmb3JtYXQgc3BlY2lmaWVycyBvciBhIGNvbWJpbmF0aW9uCi0gICAgb2YgYm90aC4gVGhlIGZvbGxvd2luZyBmb3JtYXQgc3BlY2lmaWVycyBhcmUgc3VwcG9ydGVkIGluCi0gICAgPGVtPnZhbHVlPC9lbT46PC9wPgotPHRhYmxlPgotPHRyPjx0ZD4ldDogPC90ZD4gPHRkPlRoZSB0aW1lIHRoZSByZXF1ZXN0IHdhcyByZWNlaXZlZCBpbiBVbml2ZXJzYWwKLUNvb3JkaW5hdGVkIFRpbWUgc2luY2UgdGhlIGVwb2NoIChKYW4uIDEsIDE5NzApIG1lYXN1cmVkIGluCi1taWNyb3NlY29uZHMuIFRoZSB2YWx1ZSBpcyBwcmVjZWRlZCBieSAidD0iLjwvdGQ+PC90cj4KLQotPHRyPjx0ZD4lRDogPC90ZD4gPHRkPlRoZSB0aW1lIGZyb20gd2hlbiB0aGUgcmVxdWVzdCB3YXMgcmVjZWl2ZWQgdG8KLXRoZSB0aW1lIHRoZSBoZWFkZXJzIGFyZSBzZW50IG9uIHRoZSB3aXJlLiBUaGlzIGlzIGEgbWVhc3VyZSBvZiB0aGUKLWR1cmF0aW9uIG9mIHRoZSByZXF1ZXN0LiBUaGUgdmFsdWUgaXMgcHJlY2VkZWQgYnkgIkQ9Ii48L3RkPjwvdHI+Ci0KLTx0cj48dGQ+JXtGT09CQVJ9ZTo8L3RkPiA8dGQ+VGhlIGNvbnRlbnRzIG9mIHRoZSA8YSBocmVmPSIuLi9lbnYuaHRtbCI+ZW52aXJvbm1lbnQKLXZhcmlhYmxlPC9hPiBGT09CQVIuPC90ZD48L3RyPgotPC90YWJsZT4KLQotICAgIDxwPldoZW4gdGhlIDxkaXJlY3RpdmU+SGVhZGVyPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBpcyB1c2VkIHdpdGggdGhlCi0gICAgPGNvZGU+YWRkPC9jb2RlPiwgPGNvZGU+YXBwZW5kPC9jb2RlPiwgb3IgPGNvZGU+c2V0PC9jb2RlPgotICAgIGFyZ3VtZW50LCBhIGZvdXJ0aCBhcmd1bWVudCBtYXkgYmUgdXNlZCB0byBzcGVjaWZ5IGNvbmRpdGlvbnMKLSAgICB1bmRlciB3aGljaCB0aGUgYWN0aW9uIHdpbGwgYmUgdGFrZW4uIElmIHRoZSA8YQotICAgIGhyZWY9Ii4uL2Vudi5odG1sIj5lbnZpcm9ubWVudCB2YXJpYWJsZTwvYT4gc3BlY2lmaWVkIGluIHRoZQotICAgIDxjb2RlPmVudj0uLi48L2NvZGU+IGFyZ3VtZW50IGV4aXN0cyAob3IgaWYgdGhlIGVudmlyb25tZW50Ci0gICAgdmFyaWFibGUgZG9lcyBub3QgZXhpc3QgYW5kIDxjb2RlPmVudj0hLi4uPC9jb2RlPiBpcyBzcGVjaWZpZWQpCi0gICAgdGhlbiB0aGUgYWN0aW9uIHNwZWNpZmllZCBieSB0aGUgPGRpcmVjdGl2ZT5IZWFkZXI8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlCi0gICAgd2lsbCB0YWtlIGVmZmVjdC4gT3RoZXJ3aXNlLCB0aGUgZGlyZWN0aXZlIHdpbGwgaGF2ZSBubyBlZmZlY3QKLSAgICBvbiB0aGUgcmVxdWVzdC48L3A+Ci0KLSAgICA8cD5UaGUgSGVhZGVyIGRpcmVjdGl2ZXMgYXJlIHByb2Nlc3NlZCBqdXN0IGJlZm9yZSB0aGUgcmVzcG9uc2UKLSAgICBpcyBzZW50IHRvIHRoZSBuZXR3b3JrLiBUaGVzZSBtZWFucyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIHNldAotICAgIGFuZC9vciBvdmVycmlkZSBtb3N0IGhlYWRlcnMsIGV4Y2VwdCBmb3IgdGhvc2UgaGVhZGVycyBhZGRlZCBieQotICAgIHRoZSBoZWFkZXIgZmlsdGVyLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08L21vZHVsZXN5bm9wc2lzPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2ltYXAuaHRtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfaW1hcC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTVhZTM3Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfaW1hcC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLTwhLS0laHlwZXJ0ZXh0IC0tPgotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCAyLjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QXBhY2hlIG1vZHVsZSBtb2RfaW1hcDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfc3ViLmdpZiIgQUxUPSIiPgotPCEtLS8laHlwZXJ0ZXh0IC0tPgotPGgxPk1vZHVsZSBtb2RfaW1hcDwvaDE+Ci0KLVRoaXMgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+bW9kX2ltYXAuYzwvY29kZT4gZmlsZSwgYW5kCi1pcyBjb21waWxlZCBpbiBieSBkZWZhdWx0LiBJdCBwcm92aWRlcyBmb3IgPGNvZGU+Lm1hcDwvY29kZT4gZmlsZXMsCi1yZXBsYWNpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIDxjb2RlPmltYWdlbWFwPC9jb2RlPiBDR0kgcHJvZ3JhbS4gQW55Ci1kaXJlY3Rvcnkgb3IgZG9jdW1lbnQgdHlwZSBjb25maWd1cmVkIHRvIHVzZSB0aGUgaGFuZGxlciA8Y29kZT5pbWFwLWZpbGU8L2NvZGU+Ci0odXNpbmcgZWl0aGVyIDxjb2RlPjxBCi1IUkVGPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZG9jcy9tb2RfbWltZS5odG1sI2FkZGhhbmRsZXIiPkFkZEhhbmRsZXI8L0E+Ci08L2NvZGU+IG9yIDxjb2RlPjxBCi1IUkVGPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZG9jcy9tb2RfbWltZS5odG1sI3NldGhhbmRsZXIiPlNldEhhbmRsZXI8L0E+PC9jb2RlPikKLQotd2lsbCBiZQotcHJvY2Vzc2VkIGJ5IHRoaXMgbW9kdWxlLgotCi08aDI+U3VtbWFyeTwvaDI+Ci0KLVRoaXMgbW9kdWxlIGlzIGluIHRoZSBkZWZhdWx0IEFwYWNoZSBkaXN0cmlidXRpb24uIFRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlIHdpbGwKLWFjdGl2YXRlIGZpbGVzIGVuZGluZyB3aXRoIDxjb2RlPi5tYXA8L2NvZGU+IGFzIGltYWdlbWFwIGZpbGVzOgotCi08YmxvY2txdW90ZT48Y29kZT5BZGRIYW5kbGVyIGltYXAtZmlsZSBtYXA8L2NvZGU+PC9ibG9ja3F1b3RlPgotCi1Ob3RlIHRoYXQgdGhlIGZvbGxvd2luZyBpcyBzdGlsbCBzdXBwb3J0ZWQ6Ci0KLSA8YmxvY2txdW90ZT48Y29kZT5BZGRUeXBlIGFwcGxpY2F0aW9uL3gtaHR0cGQtaW1hcCBtYXA8L2NvZGU+PC9ibG9ja3F1b3RlPgotCi1Ib3dldmVyLCB3ZSBhcmUgdHJ5aW5nIHRvIHBoYXNlIG91dCAibWFnaWMgTUlNRSB0eXBlcyIgc28gd2UgYXJlIGRlcHJlY2F0aW5nCi10aGlzIG1ldGhvZC4KLQotPEgyPk5ldyBGZWF0dXJlczwvSDI+Ci1UaGUgaW1hZ2VtYXAgbW9kdWxlIGFkZHMgc29tZSBuZXcgZmVhdHVyZXMgdGhhdCB3ZXJlIG5vdAotcG9zc2libGUgd2l0aCBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIGltYWdlbWFwIHByb2dyYW1zLjxQPgotCi08dWw+Ci08TEk+VVJMIHJlZmVyZW5jZXMgcmVsYXRpdmUgdG8gdGhlIFJlZmVyZXI6IGluZm9ybWF0aW9uLgotPExJPkRlZmF1bHQgJmx0O0JBU0UmZ3Q7IGFzc2lnbm1lbnQgdGhyb3VnaCBhIG5ldyBtYXAgZGlyZWN0aXZlCi08Y29kZT5iYXNlPC9jb2RlPi4KLTxMST5ObyBuZWVkIGZvciA8Y29kZT5pbWFnZW1hcC5jb25mPC9jb2RlPiBmaWxlLgotPExJPlBvaW50IHJlZmVyZW5jZXMuCi08TEk+Q29uZmlndXJhYmxlIGdlbmVyYXRpb24gb2YgaW1hZ2VtYXAgbWVudXMuCi08L3VsPgotPFA+Ci0KLTxoMj5Db25maWd1cmF0aW9uIERpcmVjdGl2ZXM8L2gyPgotPHVsPgotPGxpPjxBIEhSRUY9IiNpbWFwbWVudSI+SW1hcE1lbnU8L0E+Ci08bGk+PEEgSFJFRj0iI2ltYXBkZWZhdWx0Ij5JbWFwRGVmYXVsdDwvQT4KLTxsaT48QSBIUkVGPSIjaW1hcGJhc2UiPkltYXBCYXNlPC9BPgotPC91bD4KLQotCi08cD4KLQotPEEgbmFtZT0iaW1hcG1lbnUiPjxoMz5JbWFwTWVudTwvaDM+PC9BPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IEltYXBNZW51IDxjb2RlPntub25lLCBmb3JtYXR0ZWQsIHNlbWlmb3JtYXR0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmZvcm1hdHRlZH08L2NvZGU+PGJyPgotPFN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPGJyPgotPFN0cm9uZz5PdmVycmlkZTo8L3N0cm9uZz4gSW5kZXhlczxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfaW1hcC5jPGJyPgotPHN0cm9uZz5Db21wYXRpYmlsaXR5Ojwvc3Ryb25nPiBJbWFwTWVudSBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUKLTEuMSBhbmQgbGF0ZXIuPHA+Ci0KLVRoZSBJbWFwTWVudSBkaXJlY3RpdmUgZGV0ZXJtaW5lcyB0aGUgYWN0aW9uIHRha2VuIGlmIGFuIGltYWdlbWFwIGZpbGUKLWlzIGNhbGxlZCB3aXRob3V0IHZhbGlkIGNvb3JkaW5hdGVzLgotPGRsPgotICA8ZHQ+PGNvZGU+bm9uZTwvY29kZT4KLSAgPGRkPklmIEltYXBNZW51IGlzCi0gICAgICAgPGNvZGU+bm9uZTwvY29kZT4sIG5vIG1lbnUgaXMgZ2VuZXJhdGVkLCBhbmQgdGhlIDxjb2RlPmRlZmF1bHQ8L2NvZGU+Ci0gICAgICAgYWN0aW9uIGlzIHBlcmZvcm1lZC4gIAotICA8ZHQ+PGNvZGU+Zm9ybWF0dGVkPC9jb2RlPgotICA8ZGQ+QSA8Y29kZT5mb3JtYXR0ZWQ8L2NvZGU+IG1lbnUgaXMgdGhlIHNpbXBsZXN0IG1lbnUuICBDb21tZW50cwotICAgICAgIGluIHRoZSBpbWFnZW1hcCBmaWxlIGFyZSBpZ25vcmVkLiAgQSBsZXZlbCBvbmUgaGVhZGVyIGlzCi0gICAgICAgcHJpbnRlZCwgdGhlbiBhbiBocnVsZSwgdGhlbiB0aGUgbGlua3MgZWFjaCBvbiBhIHNlcGFyYXRlIGxpbmUuCi0gICAgICAgVGhlIG1lbnUgaGFzIGEgY29uc2lzdGVudCwgcGxhaW4gbG9vayBjbG9zZSB0byB0aGF0IG9mCi0gICAgICAgYSBkaXJlY3RvcnkgbGlzdGluZy4KLSAgPGR0Pjxjb2RlPnNlbWlmb3JtYXR0ZWQ8L2NvZGU+Ci0gIDxkZD5JbiB0aGUgPGNvZGU+c2VtaWZvcm1hdHRlZDwvY29kZT4gbWVudSwgY29tbWVudHMgYXJlIHByaW50ZWQKLSAgICAgICB3aGVyZSB0aGV5IG9jY3VyIGluIHRoZSBpbWFnZW1hcCBmaWxlLiAgQmxhbmsgbGluZXMgYXJlIHR1cm5lZAotICAgICAgIGludG8gSFRNTCBicmVha3MuICBObyBoZWFkZXIgb3IgaHJ1bGUgaXMgcHJpbnRlZCwgYnV0IG90aGVyd2lzZQotICAgICAgIHRoZSBtZW51IGlzIHRoZSBzYW1lIGFzIGEgPGNvZGU+Zm9ybWF0dGVkPC9jb2RlPiBtZW51LgotICA8ZHQ+PGNvZGU+dW5mb3JtYXR0ZWQ8L2NvZGU+Ci0gIDxkZD5Db21tZW50cyBhcmUgcHJpbnRlZCwgYmxhbmsgbGluZXMgYXJlIGlnbm9yZWQuICBOb3RoaW5nIGlzCi0gICAgICAgcHJpbnRlZCB0aGF0IGRvZXMgbm90IGFwcGVhciBpbiB0aGUgaW1hZ2VtYXAgZmlsZS4gIEFsbCBicmVha3MKLSAgICAgICBhbmQgaGVhZGVycyBtdXN0IGJlIGluY2x1ZGVkIGFzIGNvbW1lbnRzIGluIHRoZSBpbWFnZW1hcCBmaWxlLgotICAgICAgIFRoaXMgZ2l2ZXMgeW91IHRoZSBtb3N0IGZsZXhpYmlsaXR5IG92ZXIgdGhlIGFwcGVhcmFuY2Ugb2YgeW91cgotICAgICAgIG1lbnVzLCBidXQgcmVxdWlyZXMgeW91IHRvIHRyZWF0IHlvdXIgbWFwIGZpbGVzIGFzIEhUTUwgaW5zdGVhZAotICAgICAgIG9mIHBsYWludGV4dC4KLTwvZGw+Ci0KLTxwPgotCi08QSBuYW1lPSJpbWFwZGVmYXVsdCI+PGgzPkltYXBEZWZhdWx0PC9oMz48L0E+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gSW1hcERlZmF1bHQgPGNvZGU+e2Vycm9yLCBub2NvbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLCByZWZlcmVyLCBVUkx9PC9jb2RlPjxicj4KLTxTdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2Vzczxicj4KLTxTdHJvbmc+T3ZlcnJpZGU6PC9zdHJvbmc+IEluZGV4ZXM8YnI+Ci08c3Ryb25nPk1vZHVsZTo8L3N0cm9uZz4gbW9kX2ltYXAuYzxicj4KLTxzdHJvbmc+Q29tcGF0aWJpbGl0eTo8L3N0cm9uZz4gSW1hcERlZmF1bHQgaXMgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlCi0xLjEgYW5kIGxhdGVyLjxwPgotCi0KLVRoZSBJbWFwRGVmYXVsdCBkaXJlY3RpdmUgc2V0cyB0aGUgZGVmYXVsdCA8Y29kZT5kZWZhdWx0PC9jb2RlPiB1c2VkIGluCi10aGUgaW1hZ2VtYXAgZmlsZXMuICBJdCdzIHZhbHVlIGlzIG92ZXJyaWRkZW4gYnkgYSA8Y29kZT5kZWZhdWx0PC9jb2RlPgotZGlyZWN0aXZlIHdpdGhpbiB0aGUgaW1hZ2VtYXAgZmlsZS4gIElmIG5vdCBwcmVzZW50LCB0aGUKLTxjb2RlPmRlZmF1bHQ8L2NvZGU+IGFjdGlvbiBpcyA8Y29kZT5ub2NvbnRlbnQ8L2NvZGU+LCB3aGljaCBtZWFucwotdGhhdCBhIDxjb2RlPjIwNCBObyBDb250ZW50PC9jb2RlPiBpcyBzZW50IHRvIHRoZSBjbGllbnQuICBJbiB0aGlzCi1jYXNlLCB0aGUgY2xpZW50IHNob3VsZCBjb250aW51ZSB0byBkaXNwbGF5IHRoZSBvcmlnaW5hbCBwYWdlLgotCi08cD4KLQotPEEgbmFtZT0iaW1hcGJhc2UiPjxoMz5JbWFwQmFzZTwvaDM+PC9BPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IEltYXBCYXNlIDxjb2RlPnttYXAsIHJlZmVyZXIsIFVSTH08L2NvZGU+PGJyPgotPFN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPGJyPgotPFN0cm9uZz5PdmVycmlkZTo8L3N0cm9uZz4gSW5kZXhlczxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfaW1hcC5jPGJyPgotPHN0cm9uZz5Db21wYXRpYmlsaXR5Ojwvc3Ryb25nPiBJbWFwQmFzZSBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUKLTEuMSBhbmQgbGF0ZXIuPHA+Ci0KLVRoZSBJbWFwQmFzZSBkaXJlY3RpdmUgc2V0cyB0aGUgZGVmYXVsdCA8Y29kZT5iYXNlPC9jb2RlPiB1c2VkIGluCi10aGUgaW1hZ2VtYXAgZmlsZXMuICBJdCdzIHZhbHVlIGlzIG92ZXJyaWRkZW4gYnkgYSA8Y29kZT5iYXNlPC9jb2RlPgotZGlyZWN0aXZlIHdpdGhpbiB0aGUgaW1hZ2VtYXAgZmlsZS4gIElmIG5vdCBwcmVzZW50LCB0aGUKLTxjb2RlPmJhc2U8L2NvZGU+IGRlZmF1bHRzIHRvIDxjb2RlPmh0dHA6Ly9zZXJ2ZXJuYW1lLzwvY29kZT4uCi0KLTxocj4KLTxwPgotCi08aDI+SW1hZ2VtYXAgRmlsZTwvaDI+Ci1UaGUgbGluZXMgaW4gdGhlIGltYWdlbWFwIGZpbGVzIGNhbiBoYXZlIG9uZSBvZiBzZXZlcmFsIGZvcm1hdHM6Ci08YmxvY2txdW90ZT4KLTxjb2RlPmRpcmVjdGl2ZSB2YWx1ZSBbeCx5IC4uLl08L2NvZGU+PGJyPgotPGNvZGU+ZGlyZWN0aXZlIHZhbHVlICJNZW51IHRleHQiIFt4LHkgLi4uXTwvY29kZT48YnI+Ci08Y29kZT5kaXJlY3RpdmUgdmFsdWUgeCx5IC4uLiAiTWVudSB0ZXh0IjwvY29kZT48YnI+Ci08L2Jsb2NrcXVvdGU+Ci1UaGUgZGlyZWN0aXZlIGlzIG9uZSBvZiA8Y29kZT5iYXNlPC9jb2RlPiwgPGNvZGU+ZGVmYXVsdDwvY29kZT4sCi08Y29kZT5wb2x5PC9jb2RlPiwgPGNvZGU+Y2lyY2xlPC9jb2RlPiwgPGNvZGU+cmVjdDwvY29kZT4sIG9yCi08Y29kZT5wb2ludDwvY29kZT4uICBUaGUgdmFsdWUgaXMgYW4gYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMLCBvciBvbmUKLW9mIHRoZSBzcGVjaWFsIHZhbHVlcyBsaXN0ZWQgYmVsb3cuICBUaGUgY29vcmRpbmF0ZXMgYXJlCi08Y29kZT54LHk8L2NvZGU+IHBhaXJzIHNlcGVyYXRlZCBieSB3aGl0ZXNwYWNlLiAgVGhlIHF1b3RlZCB0ZXh0IGlzCi11c2VkIGFzIHRoZSB0ZXh0IG9mIHRoZSBsaW5rIGlmIGEgaW1hZ2VtYXAgbWVudSBpcyBnZW5lcmF0ZWQuICBMaW5lcwotYmVnaW5uaW5nIHdpdGggJyMnIGFyZSBjb21tZW50cy4KLQotPGgzPkltYWdlbWFwIEZpbGUgRGlyZWN0aXZlczwvaDM+Ci1UaGVyZSBhcmUgc2l4IGRpcmVjdGl2ZXMgYWxsb3dlZCBpbiB0aGUgaW1hZ2VtYXAgZmlsZS4gIFRoZSBkaXJlY3RpdmVzCi1jYW4gY29tZSBpbiBhbnkgb3JkZXIsIGJ1dCBhcmUgcHJvY2Vzc2VkIGluIHRoZSBvcmRlciB0aGV5IGFyZSBmb3VuZAotaW4gdGhlIGltYWdlbWFwIGZpbGUuICAKLTxkbD4gIAotPGR0Pjxjb2RlPmJhc2U8L2NvZGU+IERpcmVjdGl2ZQotPGRkPkhhcyB0aGUgZWZmZWN0IG9mIDxjb2RlPiZsdDtCQVNFIGhyZWY9InZhbHVlIiZndDs8L2NvZGU+LiAgVGhlCi0gICAgIG5vbi1hYnNvbHV0ZSBVUkxzIG9mIHRoZSBtYXBmaWxlIGFyZSB0YWtlbiByZWxhdGl2ZSB0byB0aGlzIHZhbHVlLgotICAgICBUaGUgPGNvZGU+YmFzZTwvY29kZT4gZGlyZWN0aXZlIG92ZXJyaWRlcyBJbWFwQmFzZSBhcyBzZXQgaW4gYQotICAgICAuaHRhY2Nlc3MgZmlsZSBvciBpbiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gZmlsZXMuICBJbiB0aGUgYWJzZW5jZQotICAgICBvZiBhbiBJbWFwQmFzZSBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZSwgPGNvZGU+YmFzZTwvY29kZT4gZGVmYXVsdHMgdG8KLSAgICAgPGNvZGU+aHR0cDovL3NlcnZlcl9uYW1lLzwvY29kZT4uIDxicj4KLSAgICAgPGNvZGU+YmFzZV91cmk8L2NvZGU+IGlzIHN5bm9ueW1vdXMgd2l0aCA8Y29kZT5iYXNlPC9jb2RlPi4gIE5vdGUgdGhhdAotICAgICBhIHRyYWlsaW5nIHNsYXNoIG9uIHRoZSBVUkwgaXMgc2lnbmlmaWNhbnQuCi08cD4KLTxkdD48Y29kZT5kZWZhdWx0PC9jb2RlPiBEaXJlY3RpdmUKLTxkZD5UaGUgYWN0aW9uIHRha2VuIGlmIHRoZSBjb29yZGluYXRlcyBnaXZlbiBkbyBub3QgZml0IGFueSBvZiB0aGUKLSAgICAgPGNvZGU+cG9seTwvY29kZT4sIDxjb2RlPmNpcmNsZTwvY29kZT4gb3IgPGNvZGU+cmVjdDwvY29kZT4KLSAgICAgZGlyZWN0aXZlcywgYW5kIHRoZXJlIGFyZSBubyA8Y29kZT5wb2ludDwvY29kZT4gZGlyZWN0aXZlcy4gIERlZmF1bHRzCi0gICAgIHRvIDxjb2RlPm5vY29udGVudDwvY29kZT4gaW4gdGhlIGFic2VuY2Ugb2YgYW4gSW1hcERlZmF1bHQKLSAgICAgY29uZmlndXJhdGlvbiBzZXR0aW5nLCBjYXVzaW5nIGEgc3RhdHVzIGNvZGUgb2YgPGNvZGU+MjA0IE5vCi0gICAgIENvbnRlbnQ8L2NvZGU+IHRvIGJlIHJldHVybmVkLiAgVGhlIGNsaWVudCBzaG91bGQga2VlcCB0aGUgc2FtZQotICAgICBwYWdlIGRpc3BsYXllZC4KLTxwPgotPGR0Pjxjb2RlPnBvbHk8L2NvZGU+IERpcmVjdGl2ZQotPGRkPlRha2VzIHRocmVlIHRvIG9uZS1odW5kcmVkIHBvaW50cywgYW5kIGlzIG9iZXllZCBpZiB0aGUgdXNlciBzZWxlY3RlZAotICAgICBjb29yZGluYXRlcyBmYWxsIHdpdGhpbiB0aGUgcG9seWdvbiBkZWZpbmVkIGJ5IHRoZXNlIHBvaW50cy4KLTxwPgotPGR0Pjxjb2RlPmNpcmNsZTwvY29kZT4KLTxkZD5UYWtlcyB0aGUgY2VudGVyIGNvb3JkaW5hdGVzIG9mIGEgY2lyY2xlIGFuZCBhIHBvaW50IG9uIHRoZSBjaXJjbGUuIElzCi0gICAgIG9iZXllZCBpZiB0aGUgdXNlciBzZWxlY3RlZCBwb2ludCBpcyB3aXRoIHRoZSBjaXJjbGUuCi08cD4KLTxkdD48Y29kZT5yZWN0PC9jb2RlPiBEaXJlY3RpdmUKLTxkZD5UYWtlcyB0aGUgY29vcmRpbmF0ZXMgb2YgdHdvIG9wcG9zaW5nIGNvcm5lcnMgb2YgYSByZWN0YW5nbGUuICBPYmV5ZWQKLSAgICAgaWYgdGhlIHBvaW50IHNlbGVjdGVkIGlzIHdpdGhpbiB0aGlzIHJlY3RhbmdsZS4KLTxwPgotPGR0Pjxjb2RlPnBvaW50PC9jb2RlPiBEaXJlY3RpdmUKLTxkZD5UYWtlcyBhIHNpbmdsZSBwb2ludC4gIFRoZSBwb2ludCBkaXJlY3RpdmUgY2xvc2VzdCB0byB0aGUgdXNlcgotICAgICBzZWxlY3RlZCBwb2ludCBpcyBvYmV5ZWQgaWYgbm8gb3RoZXIgZGlyZWN0aXZlcyBhcmUgc2F0aXNmaWVkLgotICAgICBOb3RlIHRoYXQgPGNvZGU+ZGVmYXVsdDwvY29kZT4gd2lsbCBub3QgYmUgZm9sbG93ZWQgaWYgYQotICAgICA8Y29kZT5wb2ludDwvY29kZT4gZGlyZWN0aXZlIGlzIHByZXNlbnQgYW5kIHZhbGlkIGNvb3JkaW5hdGVzIGFyZQotICAgICBnaXZlbi4KLTwvZGw+Ci0KLQotCi08aDM+VmFsdWVzPC9oMz4KLVRoZSB2YWx1ZXMgZm9yIGVhY2ggb2YgdGhlIGRpcmVjdGl2ZXMgY2FuIGFueSBvZiB0aGUgZm9sbG93aW5nOgotPGRsPgotICA8ZHQ+YSBVUkwKLSAgPGRkPlRoZSBVUkwgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlIFVSTC4gIFJlbGF0aXZlIFVSTHMgY2FuCi0gICAgICAgY29udGFpbiAnLi4nIHN5bnRheCBhbmQgd2lsbCBiZSByZXNvbHZlZCByZWxhdGl2ZSB0byB0aGUKLSAgICAgICA8Y29kZT5iYXNlPC9jb2RlPiB2YWx1ZS4gPGJyPgotICAgICAgIDxjb2RlPmJhc2U8L2NvZGU+IGl0c2VsZiB3aWxsIG5vdCByZXNvbHZlZCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQKLSAgICAgICB2YWx1ZS4gQSBzdGF0ZW1lbnQgPGNvZGU+YmFzZSBtYWlsdG86PC9jb2RlPiB3aWxsIHdvcmsgcHJvcGVybHksIHRob3VnaC4KLTxwPgotICA8ZHQ+PGNvZGU+bWFwPC9jb2RlPgotICA8ZGQ+RXF1aXZhbGVudCB0byB0aGUgVVJMIG9mIHRoZSBpbWFnZW1hcCBmaWxlIGl0c2VsZi4gIE5vCi0gICAgICAgY29vcmRpbmF0ZXMgYXJlIHNlbnQgd2l0aCB0aGlzLCBzbyBhIG1lbnUgd2lsbCBiZSBnZW5lcmF0ZWQKLSAgICAgICB1bmxlc3MgSW1hcE1lbnUgaXMgc2V0IHRvICdub25lJy4KLTxwPgotICA8ZHQ+PGNvZGU+bWVudTwvY29kZT4KLSAgPGRkPlN5bm9ueW1vdXMgd2l0aCA8Y29kZT5tYXA8L2NvZGU+LgotPHA+Ci0gIDxkdD48Y29kZT5yZWZlcmVyPC9jb2RlPgotICA8ZGQ+RXF1aXZhbGVudCB0byB0aGUgVVJMIG9mIHRoZSByZWZlcmluZyBkb2N1bWVudC4KLSAgICAgICBEZWZhdWx0cyB0byA8Y29kZT5odHRwOi8vc2VydmVybmFtZS88L2NvZGU+IGlmIG5vIFJlZmVyZXI6Ci0gICAgICAgaGVhZGVyIHdhcyBwcmVzZW50LiAKLTxwPgotICA8ZHQ+PGNvZGU+bm9jb250ZW50PC9jb2RlPgotICA8ZGQ+U2VuZHMgYSBzdGF0dXMgY29kZSBvZiA8Y29kZT4yMDQgTm8gQ29udGVudDwvY29kZT4sCi0gICAgICAgdGVsbGluZyB0aGUgY2xpZW50IHRvIGtlZXAgdGhlIHNhbWUgcGFnZSBkaXNwbGF5ZWQuICBWYWxpZCBmb3IKLSAgICAgICBhbGwgYnV0IDxjb2RlPmJhc2U8L2NvZGU+LgotPHA+Ci0gIDxkdD48Y29kZT5lcnJvcjwvY29kZT4KLSAgPGRkPkZhaWxzIHdpdGggYSA8Y29kZT41MDAgU2VydmVyIEVycm9yPC9jb2RlPi4gIFZhbGlkIGZvciBhbGwgYnV0Ci0gICAgICAgPGNvZGU+YmFzZTwvY29kZT4sIGJ1dCBzb3J0IG9mIHNpbGx5IGZvciBhbnl0aGluZyBidXQKLSAgICAgICA8Y29kZT5kZWZhdWx0PC9jb2RlPi4gCi08L2RsPgotCi08aDM+Q29vcmRpbmF0ZXM8L2gzPgotPGRsPgotICA8ZHQ+PGNvZGU+MCwwIDIwMCwyMDA8L2NvZGU+Ci0gIDxkZD5BIGNvb3JkaW5hdGUgY29uc2lzdHMgb2YgYW4gPHR0Png8L3R0PiBhbmQgYSA8dHQ+eTwvdHQ+IHZhbHVlCi0gICAgICAgc2VwYXJhdGVkIGJ5IGEgY29tbWEuICBUaGUgY29vcmRpbmF0ZXMgYXJlIHNlcGFyYXRlZCBmcm9tIGVhY2ggb3RoZXIKLSAgICAgICBieSB3aGl0ZXNwYWNlLiAgVG8gYWNjb21vZGF0ZSB0aGUgd2F5IEx5bnggaGFuZGxlcyBpbWFnZW1hcHMsIHNob3VsZCBhCi0gICAgICAgdXNlciBzZWxlY3QgdGhlIGNvb3JkaW5hdGUgPGNvZGU+MCwwPC9jb2RlPiwgaXQgaXMgYXMgaWYKLSAgICAgICBubyBjb29yZGluYXRlIGhhZCBiZWVuIHNlbGVjdGVkLiAgIAotPC9kbD4KLQotPGgzPlF1b3RlZCBUZXh0PC9oMz4KLTxkbD4KLSAgPGR0Pjxjb2RlPiJNZW51IFRleHQiPC9jb2RlPgotICA8ZGQ+QWZ0ZXIgdGhlIHZhbHVlIG9yIGFmdGVyIHRoZSBjb29yZGluYXRlcywgdGhlIGxpbmUgb3B0aW9uYWxseSBtYXkgCi0gICAgICAgY29udGFpbiB0ZXh0IHdpdGhpbiBkb3VibGUgcXVvdGVzLiAgVGhpcyBzdHJpbmcgaXMgdXNlZCBhcyB0aGUKLSAgICAgICB0ZXh0IGZvciB0aGUgbGluayBpZiBhIG1lbnUgaXMgZ2VuZXJhdGVkOjxicj4KLSAgICAgPGNvZGU+Jmx0O2EgaHJlZj0iaHR0cDovL2Zvby5jb20vIiZndDtNZW51IHRleHQmbHQ7L2EmZ3Q7PC9jb2RlPjxicj4KLSAgICAgICBJZiBubyBxdW90ZWQgdGV4dCBpcyBwcmVzZW50LCB0aGUgbmFtZSBvZiB0aGUgbGluayB3aWxsIGJlIHVzZWQKLSAgICAgICBhcyB0aGUgdGV4dDo8YnI+Ci0gICAgIDxjb2RlPiZsdDthIGhyZWY9Imh0dHA6Ly9mb28uY29tLyImZ3Q7aHR0cDovL2Zvby5jb20mbHQ7L2EmZ3Q7PC9jb2RlPjxicj4KLSAgICAgICBJdCBpcyBpbXBvc3NpYmxlIHRvIGVzY2FwZSBkb3VibGUgcXVvdGVzIHdpdGhpbiB0aGlzIHRleHQuCi08L2RsPgotCi08aHI+Ci0KLTxoMj5FeGFtcGxlIE1hcGZpbGU8L2gyPgotPGJsb2NrcXVvdGU+PGNvZGU+Ci0jQ29tbWVudHMgYXJlIHByaW50ZWQgaW4gYSAnZm9ybWF0dGVkJyBvciAnc2VtaWZvcm1hdHRlZCcgbWVudS4gPGJyPgotI0FuZCBjYW4gY29udGFpbiBodG1sIHRhZ3MuICZsdDtociZndDsgPGJyPgotYmFzZSByZWZlcmVyICA8YnI+Ci1wb2x5IG1hcCAiQ291bGQgSSBoYXZlIGEgbWVudSwgcGxlYXNlPyIgIDAsMCAwLDEwIDEwLDEwIDEwLDAgPGJyPgotcmVjdCAuLiAwLDAgNzcsMjcgInRoZSBkaXJlY3Rvcnkgb2YgdGhlIHJlZmVyZXIiPGJyPgotY2lyY2xlIGh0dHA6Ly93d3cuaW5ldG5lYnIuY29tL2xpbmNvbG4vZmVlZGJhY2svIDE5NSwwIDMwNSwyNyA8YnI+Ci1yZWN0IGFub3RoZXJfZmlsZSAiaW4gc2FtZSBkaXJlY3RvcnkgYXMgcmVmZXJlciIgMzA2LDAgNDE5LDI3ICA8YnI+Ci1wb2ludCBodHRwOi8vd3d3Lnp5enp5dmEuY29tLyAxMDAsMTAwIDxicj4KLXBvaW50IGh0dHA6Ly93d3cudHJpcG9kLmNvbS8gIDIwMCwyMDAgPGJyPgotcmVjdCBtYWlsdG86bmF0ZUB0cmlwb2QuY29tIDEwMCwxNTAgMjAwLDAgIkJ1Z3M/IiA8YnI+Ci08L2NvZGU+PC9ibG9ja3F1b3RlPgotPFA+Ci0KLTxoMj5SZWZlcmVuY2luZyB5b3VyIG1hcGZpbGU8L2gyPgotPGJsb2NrcXVvdGU+PGNvZGU+Ci0mbHQ7QSBIUkVGPSIvbWFwcy9pbWFnbWFwMS5tYXAiJmd0OyA8YnI+Ci0mbHQ7SU1HIElTTUFQIFNSQz0iL2ltYWdlcy9pbWFnZW1hcDEuZ2lmIiZndDsgPGJyPgotJmx0Oy9BJmd0OwotPC9jb2RlPjwvYmxvY2txdW90ZT48cD4KLTwhLS0laHlwZXJ0ZXh0IC0tPgotPEhSPgotPEEgSFJFRj0iLi4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9ob21lLmdpZiIgQUxUPSJIb21lIj48L0E+Ci08QSBIUkVGPSIuLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfaW5kZXguZ2lmIiBBTFQ9IkluZGV4Ij48L0E+Ci08L0JPRFk+Ci08L0hUTUw+Ci08IS0tLyVoeXBlcnRleHQgLS0+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfaW1hcC54bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2ltYXAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODlhMjA1Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfaW1hcC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgbW9kdWxlc3lub3BzaXMgU1lTVEVNICIuLi9zdHlsZS9tb2R1bGVzeW5vcHNpcy5kdGQiPgotPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iLi4vc3R5bGUvbWFudWFsLnhzbCI/PgotPG1vZHVsZXN5bm9wc2lzPgotCi08bmFtZT5tb2RfaW1hcDwvbmFtZT4KLTxkZXNjcmlwdGlvbj5TZXJ2ZXItc2lkZSBpbWFnZW1hcCBwcm9jZXNzaW5nPC9kZXNjcmlwdGlvbj4KLTxzdGF0dXM+QmFzZTwvc3RhdHVzPgotPHNvdXJjZWZpbGU+bW9kX2ltYXAuYzwvc291cmNlZmlsZT4KLTxpZGVudGlmaWVyPmltYXBfbW9kdWxlPC9pZGVudGlmaWVyPgotCi08c3VtbWFyeT4KLSAgICA8cD5UaGlzIG1vZHVsZSBwcm9jZXNzZXMgPGNvZGU+Lm1hcDwvY29kZT4gZmlsZXMsIHRoZXJlYnkKLSAgICByZXBsYWNpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIDxjb2RlPmltYWdlbWFwPC9jb2RlPiBDR0kKLSAgICBwcm9ncmFtLiBBbnkgZGlyZWN0b3J5IG9yIGRvY3VtZW50IHR5cGUgY29uZmlndXJlZCB0byB1c2UgdGhlCi0gICAgaGFuZGxlciA8Y29kZT5pbWFwLWZpbGU8L2NvZGU+ICh1c2luZyBlaXRoZXIgCi0gICAgPGRpcmVjdGl2ZSBtb2R1bGU9Im1vZF9taW1lIj5BZGRIYW5kbGVyPC9kaXJlY3RpdmU+IG9yCi0gICAgPGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiPlNldEhhbmRsZXI8L2RpcmVjdGl2ZT4pCi0gICAgd2lsbCBiZSBwcm9jZXNzZWQgYnkgdGhpcyBtb2R1bGUuPC9wPgotCi0gICAgPHA+VGhlIGZvbGxvd2luZyBkaXJlY3RpdmUgd2lsbCBhY3RpdmF0ZSBmaWxlcyBlbmRpbmcgd2l0aAotICAgIDxjb2RlPi5tYXA8L2NvZGU+IGFzIGltYWdlbWFwIGZpbGVzOjwvcD4KLQotPGV4YW1wbGU+QWRkSGFuZGxlciBpbWFwLWZpbGUgbWFwPC9leGFtcGxlPgotCi0gICAgPHA+Tm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgaXMgc3RpbGwgc3VwcG9ydGVkOjwvcD4KLQotPGV4YW1wbGU+QWRkVHlwZSBhcHBsaWNhdGlvbi94LWh0dHBkLWltYXAgbWFwPC9leGFtcGxlPgotCi0gICAgPHA+SG93ZXZlciwgd2UgYXJlIHRyeWluZyB0byBwaGFzZSBvdXQgIm1hZ2ljIE1JTUUgdHlwZXMiIHNvIHdlCi0gICAgYXJlIGRlcHJlY2F0aW5nIHRoaXMgbWV0aG9kLjwvcD4KLTwvc3VtbWFyeT4KLQotPHNlY3Rpb24+PHRpdGxlPk5ldyBGZWF0dXJlczwvdGl0bGU+Ci0KLSAgICA8cD5UaGUgaW1hZ2VtYXAgbW9kdWxlIGFkZHMgc29tZSBuZXcgZmVhdHVyZXMgdGhhdCB3ZXJlIG5vdAotICAgIHBvc3NpYmxlIHdpdGggcHJldmlvdXNseSBkaXN0cmlidXRlZCBpbWFnZW1hcCBwcm9ncmFtcy48L3A+Ci0KLSAgICA8dWw+Ci0gICAgICA8bGk+VVJMIHJlZmVyZW5jZXMgcmVsYXRpdmUgdG8gdGhlIFJlZmVyZXI6IGluZm9ybWF0aW9uLjwvbGk+Ci0KLSAgICAgIDxsaT5EZWZhdWx0ICZsdDtCQVNFJmd0OyBhc3NpZ25tZW50IHRocm91Z2ggYSBuZXcgbWFwCi0gICAgICBkaXJlY3RpdmUgPGNvZGU+YmFzZTwvY29kZT4uPC9saT4KLQotICAgICAgPGxpPk5vIG5lZWQgZm9yIDxjb2RlPmltYWdlbWFwLmNvbmY8L2NvZGU+IGZpbGUuPC9saT4KLQotICAgICAgPGxpPlBvaW50IHJlZmVyZW5jZXMuPC9saT4KLQotICAgICAgPGxpPkNvbmZpZ3VyYWJsZSBnZW5lcmF0aW9uIG9mIGltYWdlbWFwIG1lbnVzLjwvbGk+Ci0gICAgPC91bD4KLTwvc2VjdGlvbj4KLQotPHNlY3Rpb24+PHRpdGxlPkltYWdlbWFwIEZpbGU8L3RpdGxlPgotCi0gICAgPHA+VGhlIGxpbmVzIGluIHRoZSBpbWFnZW1hcCBmaWxlcyBjYW4gaGF2ZSBvbmUgb2Ygc2V2ZXJhbAotICAgIGZvcm1hdHM6PC9wPgotCi08ZXhhbXBsZT4KLSAgICAgIGRpcmVjdGl2ZSB2YWx1ZSBbeCx5IC4uLl08YnIgLz4KLSAgICAgIGRpcmVjdGl2ZSB2YWx1ZSAiTWVudSB0ZXh0IiBbeCx5IC4uLl08YnIgLz4KLSAgICAgIGRpcmVjdGl2ZSB2YWx1ZSB4LHkgLi4uICJNZW51IHRleHQiCi08L2V4YW1wbGU+Ci0gICAgPHA+VGhlIGRpcmVjdGl2ZSBpcyBvbmUgb2YgPGNvZGU+YmFzZTwvY29kZT4sCi0gICAgPGNvZGU+ZGVmYXVsdDwvY29kZT4sIDxjb2RlPnBvbHk8L2NvZGU+LCA8Y29kZT5jaXJjbGU8L2NvZGU+LAotICAgIDxjb2RlPnJlY3Q8L2NvZGU+LCBvciA8Y29kZT5wb2ludDwvY29kZT4uIFRoZSB2YWx1ZSBpcyBhbgotICAgIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCwgb3Igb25lIG9mIHRoZSBzcGVjaWFsIHZhbHVlcyBsaXN0ZWQKLSAgICBiZWxvdy4gVGhlIGNvb3JkaW5hdGVzIGFyZSA8Y29kZT54LHk8L2NvZGU+IHBhaXJzIHNlcGFyYXRlZCBieQotICAgIHdoaXRlc3BhY2UuIFRoZSBxdW90ZWQgdGV4dCBpcyB1c2VkIGFzIHRoZSB0ZXh0IG9mIHRoZSBsaW5rIGlmCi0gICAgYSBpbWFnZW1hcCBtZW51IGlzIGdlbmVyYXRlZC4gTGluZXMgYmVnaW5uaW5nIHdpdGggJyMnIGFyZQotICAgIGNvbW1lbnRzLjwvcD4KLQotPHNlY3Rpb24+PHRpdGxlPkltYWdlbWFwIEZpbGUgRGlyZWN0aXZlczwvdGl0bGU+Ci0gICAgPHA+VGhlcmUgYXJlIHNpeCBkaXJlY3RpdmVzIGFsbG93ZWQgaW4gdGhlIGltYWdlbWFwIGZpbGUuIFRoZQotICAgIGRpcmVjdGl2ZXMgY2FuIGNvbWUgaW4gYW55IG9yZGVyLCBidXQgYXJlIHByb2Nlc3NlZCBpbiB0aGUKLSAgICBvcmRlciB0aGV5IGFyZSBmb3VuZCBpbiB0aGUgaW1hZ2VtYXAgZmlsZS48L3A+Ci0KLSAgICA8ZGw+Ci0gICAgICA8ZHQ+PGNvZGU+YmFzZTwvY29kZT4gRGlyZWN0aXZlPC9kdD4KLQotICAgICAgPGRkPkhhcyB0aGUgZWZmZWN0IG9mIDxjb2RlPiZsdDtCQVNFIEhSRUY9InZhbHVlIiZndDs8L2NvZGU+LgotICAgICAgVGhlIG5vbi1hYnNvbHV0ZSBVUkxzIG9mIHRoZSBtYXAtZmlsZSBhcmUgdGFrZW4gcmVsYXRpdmUgdG8KLSAgICAgIHRoaXMgdmFsdWUuIFRoZSA8Y29kZT5iYXNlPC9jb2RlPiBkaXJlY3RpdmUgb3ZlcnJpZGVzCi0gICAgICBJbWFwQmFzZSBhcyBzZXQgaW4gYSAuaHRhY2Nlc3MgZmlsZSBvciBpbiB0aGUgc2VydmVyCi0gICAgICBjb25maWd1cmF0aW9uIGZpbGVzLiBJbiB0aGUgYWJzZW5jZSBvZiBhbiBJbWFwQmFzZQotICAgICAgY29uZmlndXJhdGlvbiBkaXJlY3RpdmUsIDxjb2RlPmJhc2U8L2NvZGU+IGRlZmF1bHRzIHRvCi0gICAgICA8Y29kZT5odHRwOi8vc2VydmVyX25hbWUvPC9jb2RlPi48YnIgLz4KLSAgICAgICA8Y29kZT5iYXNlX3VyaTwvY29kZT4gaXMgc3lub255bW91cyB3aXRoIDxjb2RlPmJhc2U8L2NvZGU+LgotICAgICAgTm90ZSB0aGF0IGEgdHJhaWxpbmcgc2xhc2ggb24gdGhlIFVSTCBpcyBzaWduaWZpY2FudC48L2RkPgotCi0gICAgICA8ZHQ+PGNvZGU+ZGVmYXVsdDwvY29kZT4gRGlyZWN0aXZlPC9kdD4KLQotICAgICAgPGRkPlRoZSBhY3Rpb24gdGFrZW4gaWYgdGhlIGNvb3JkaW5hdGVzIGdpdmVuIGRvIG5vdCBmaXQgYW55Ci0gICAgICBvZiB0aGUgPGNvZGU+cG9seTwvY29kZT4sIDxjb2RlPmNpcmNsZTwvY29kZT4gb3IKLSAgICAgIDxjb2RlPnJlY3Q8L2NvZGU+IGRpcmVjdGl2ZXMsIGFuZCB0aGVyZSBhcmUgbm8KLSAgICAgIDxjb2RlPnBvaW50PC9jb2RlPiBkaXJlY3RpdmVzLiBEZWZhdWx0cyB0bwotICAgICAgPGNvZGU+bm9jb250ZW50PC9jb2RlPiBpbiB0aGUgYWJzZW5jZSBvZiBhbiBJbWFwRGVmYXVsdAotICAgICAgY29uZmlndXJhdGlvbiBzZXR0aW5nLCBjYXVzaW5nIGEgc3RhdHVzIGNvZGUgb2YgPGNvZGU+MjA0IE5vCi0gICAgICBDb250ZW50PC9jb2RlPiB0byBiZSByZXR1cm5lZC4gVGhlIGNsaWVudCBzaG91bGQga2VlcCB0aGUKLSAgICAgIHNhbWUgcGFnZSBkaXNwbGF5ZWQuPC9kZD4KLQotICAgICAgPGR0Pjxjb2RlPnBvbHk8L2NvZGU+IERpcmVjdGl2ZTwvZHQ+Ci0KLSAgICAgIDxkZD5UYWtlcyB0aHJlZSB0byBvbmUtaHVuZHJlZCBwb2ludHMsIGFuZCBpcyBvYmV5ZWQgaWYgdGhlCi0gICAgICB1c2VyIHNlbGVjdGVkIGNvb3JkaW5hdGVzIGZhbGwgd2l0aGluIHRoZSBwb2x5Z29uIGRlZmluZWQgYnkKLSAgICAgIHRoZXNlIHBvaW50cy48L2RkPgotCi0gICAgICA8ZHQ+PGNvZGU+Y2lyY2xlPC9jb2RlPjwvZHQ+Ci0KLSAgICAgIDxkZD5UYWtlcyB0aGUgY2VudGVyIGNvb3JkaW5hdGVzIG9mIGEgY2lyY2xlIGFuZCBhIHBvaW50IG9uCi0gICAgICB0aGUgY2lyY2xlLiBJcyBvYmV5ZWQgaWYgdGhlIHVzZXIgc2VsZWN0ZWQgcG9pbnQgaXMgd2l0aCB0aGUKLSAgICAgIGNpcmNsZS48L2RkPgotCi0gICAgICA8ZHQ+PGNvZGU+cmVjdDwvY29kZT4gRGlyZWN0aXZlPC9kdD4KLQotICAgICAgPGRkPlRha2VzIHRoZSBjb29yZGluYXRlcyBvZiB0d28gb3Bwb3NpbmcgY29ybmVycyBvZiBhCi0gICAgICByZWN0YW5nbGUuIE9iZXllZCBpZiB0aGUgcG9pbnQgc2VsZWN0ZWQgaXMgd2l0aGluIHRoaXMKLSAgICAgIHJlY3RhbmdsZS48L2RkPgotCi0gICAgICA8ZHQ+PGNvZGU+cG9pbnQ8L2NvZGU+IERpcmVjdGl2ZTwvZHQ+Ci0KLSAgICAgIDxkZD5UYWtlcyBhIHNpbmdsZSBwb2ludC4gVGhlIHBvaW50IGRpcmVjdGl2ZSBjbG9zZXN0IHRvIHRoZQotICAgICAgdXNlciBzZWxlY3RlZCBwb2ludCBpcyBvYmV5ZWQgaWYgbm8gb3RoZXIgZGlyZWN0aXZlcyBhcmUKLSAgICAgIHNhdGlzZmllZC4gTm90ZSB0aGF0IDxjb2RlPmRlZmF1bHQ8L2NvZGU+IHdpbGwgbm90IGJlCi0gICAgICBmb2xsb3dlZCBpZiBhIDxjb2RlPnBvaW50PC9jb2RlPiBkaXJlY3RpdmUgaXMgcHJlc2VudCBhbmQKLSAgICAgIHZhbGlkIGNvb3JkaW5hdGVzIGFyZSBnaXZlbi48L2RkPgotICAgIDwvZGw+Ci08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uPjx0aXRsZT5WYWx1ZXM8L3RpdGxlPgotCi0gICAgPHA+VGhlIHZhbHVlcyBmb3IgZWFjaCBvZiB0aGUgZGlyZWN0aXZlcyBjYW4gYW55IG9mIHRoZSBmb2xsb3dpbmc6PC9wPgotICAgIAotCi0gICAgPGRsPgotICAgICAgPGR0PmEgVVJMPC9kdD4KLQotICAgICAgPGRkPlRoZSBVUkwgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlIFVSTC4gUmVsYXRpdmUgVVJMcwotICAgICAgY2FuIGNvbnRhaW4gJy4uJyBzeW50YXggYW5kIHdpbGwgYmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlCi0gICAgICA8Y29kZT5iYXNlPC9jb2RlPiB2YWx1ZS48YnIgLz4KLSAgICAgICA8Y29kZT5iYXNlPC9jb2RlPiBpdHNlbGYgd2lsbCBub3QgcmVzb2x2ZWQgYWNjb3JkaW5nIHRvIHRoZQotICAgICAgY3VycmVudCB2YWx1ZS4gQSBzdGF0ZW1lbnQgPGNvZGU+YmFzZSBtYWlsdG86PC9jb2RlPiB3aWxsCi0gICAgICB3b3JrIHByb3Blcmx5LCB0aG91Z2guPC9kZD4KLQotICAgICAgPGR0Pjxjb2RlPm1hcDwvY29kZT48L2R0PgotCi0gICAgICA8ZGQ+RXF1aXZhbGVudCB0byB0aGUgVVJMIG9mIHRoZSBpbWFnZW1hcCBmaWxlIGl0c2VsZi4gTm8KLSAgICAgIGNvb3JkaW5hdGVzIGFyZSBzZW50IHdpdGggdGhpcywgc28gYSBtZW51IHdpbGwgYmUgZ2VuZXJhdGVkCi0gICAgICB1bmxlc3MgSW1hcE1lbnUgaXMgc2V0IHRvICdub25lJy48L2RkPgotCi0gICAgICA8ZHQ+PGNvZGU+bWVudTwvY29kZT48L2R0PgotCi0gICAgICA8ZGQ+U3lub255bW91cyB3aXRoIDxjb2RlPm1hcDwvY29kZT4uPC9kZD4KLQotICAgICAgPGR0Pjxjb2RlPnJlZmVyZXI8L2NvZGU+PC9kdD4KLQotICAgICAgPGRkPkVxdWl2YWxlbnQgdG8gdGhlIFVSTCBvZiB0aGUgcmVmZXJyaW5nIGRvY3VtZW50LiBEZWZhdWx0cwotICAgICAgdG8gPGNvZGU+aHR0cDovL3NlcnZlcm5hbWUvPC9jb2RlPiBpZiBubyBSZWZlcmVyOiBoZWFkZXIgd2FzCi0gICAgICBwcmVzZW50LjwvZGQ+Ci0KLSAgICAgIDxkdD48Y29kZT5ub2NvbnRlbnQ8L2NvZGU+PC9kdD4KLQotICAgICAgPGRkPlNlbmRzIGEgc3RhdHVzIGNvZGUgb2YgPGNvZGU+MjA0IE5vIENvbnRlbnQ8L2NvZGU+LAotICAgICAgdGVsbGluZyB0aGUgY2xpZW50IHRvIGtlZXAgdGhlIHNhbWUgcGFnZSBkaXNwbGF5ZWQuIFZhbGlkIGZvcgotICAgICAgYWxsIGJ1dCA8Y29kZT5iYXNlPC9jb2RlPi48L2RkPgotCi0gICAgICA8ZHQ+PGNvZGU+ZXJyb3I8L2NvZGU+PC9kdD4KLQotICAgICAgPGRkPkZhaWxzIHdpdGggYSA8Y29kZT41MDAgU2VydmVyIEVycm9yPC9jb2RlPi4gVmFsaWQgZm9yIGFsbAotICAgICAgYnV0IDxjb2RlPmJhc2U8L2NvZGU+LCBidXQgc29ydCBvZiBzaWxseSBmb3IgYW55dGhpbmcgYnV0Ci0gICAgICA8Y29kZT5kZWZhdWx0PC9jb2RlPi48L2RkPgotICAgIDwvZGw+Ci08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uPjx0aXRsZT5Db29yZGluYXRlczwvdGl0bGU+Ci0KLSAgICA8ZGw+Ci0gICAgICA8ZHQ+PGNvZGU+MCwwIDIwMCwyMDA8L2NvZGU+PC9kdD4KLQotICAgICAgPGRkPkEgY29vcmRpbmF0ZSBjb25zaXN0cyBvZiBhbiA8Y29kZT54PC9jb2RlPiBhbmQgYSA8Y29kZT55PC9jb2RlPgotICAgICAgdmFsdWUgc2VwYXJhdGVkIGJ5IGEgY29tbWEuIFRoZSBjb29yZGluYXRlcyBhcmUgc2VwYXJhdGVkCi0gICAgICBmcm9tIGVhY2ggb3RoZXIgYnkgd2hpdGVzcGFjZS4gVG8gYWNjb21tb2RhdGUgdGhlIHdheSBMeW54Ci0gICAgICBoYW5kbGVzIGltYWdlbWFwcywgc2hvdWxkIGEgdXNlciBzZWxlY3QgdGhlIGNvb3JkaW5hdGUKLSAgICAgIDxjb2RlPjAsMDwvY29kZT4sIGl0IGlzIGFzIGlmIG5vIGNvb3JkaW5hdGUgaGFkIGJlZW4KLSAgICAgIHNlbGVjdGVkLjwvZGQ+Ci0gICAgPC9kbD4KLQotPC9zZWN0aW9uPgotCi08c2VjdGlvbj48dGl0bGU+UXVvdGVkIFRleHQ8L3RpdGxlPgotCi0gICAgPGRsPgotICAgICAgPGR0Pjxjb2RlPiJNZW51IFRleHQiPC9jb2RlPjwvZHQ+Ci0KLSAgICAgIDxkZD5BZnRlciB0aGUgdmFsdWUgb3IgYWZ0ZXIgdGhlIGNvb3JkaW5hdGVzLCB0aGUgbGluZQotICAgICAgb3B0aW9uYWxseSBtYXkgY29udGFpbiB0ZXh0IHdpdGhpbiBkb3VibGUgcXVvdGVzLiBUaGlzIHN0cmluZwotICAgICAgaXMgdXNlZCBhcyB0aGUgdGV4dCBmb3IgdGhlIGxpbmsgaWYgYSBtZW51IGlzCi0gICAgICBnZW5lcmF0ZWQ6PGJyIC8+Ci0gICAgICAgPGNvZGU+Jmx0O2EgSFJFRj0iaHR0cDovL2Zvby5jb20vIiZndDtNZW51Ci0gICAgICB0ZXh0Jmx0Oy9hJmd0OzwvY29kZT48YnIgLz4KLSAgICAgICBJZiBubyBxdW90ZWQgdGV4dCBpcyBwcmVzZW50LCB0aGUgbmFtZSBvZiB0aGUgbGluayB3aWxsIGJlCi0gICAgICB1c2VkIGFzIHRoZSB0ZXh0OjxiciAvPgotICAgICAgIDxjb2RlPiZsdDthCi0gICAgICBIUkVGPSJodHRwOi8vZm9vLmNvbS8iJmd0O2h0dHA6Ly9mb28uY29tJmx0Oy9hJmd0OzwvY29kZT48YnIgLz4KLSAgICAgICBJdCBpcyBpbXBvc3NpYmxlIHRvIGVzY2FwZSBkb3VibGUgcXVvdGVzIHdpdGhpbiB0aGlzCi0gICAgICB0ZXh0LjwvZGQ+Ci0gICAgPC9kbD4KLTwvc2VjdGlvbj4KLTwvc2VjdGlvbj4KLQotPHNlY3Rpb24+PHRpdGxlPkV4YW1wbGUgTWFwZmlsZTwvdGl0bGU+Ci0KLTxleGFtcGxlPgotICAgICAgI0NvbW1lbnRzIGFyZSBwcmludGVkIGluIGEgJ2Zvcm1hdHRlZCcgb3IKLSAgICAgICdzZW1pZm9ybWF0dGVkJyBtZW51LjxiciAvPgotICAgICAgICNBbmQgY2FuIGNvbnRhaW4gaHRtbCB0YWdzLiAmbHQ7aHImZ3Q7PGJyIC8+Ci0gICAgICAgYmFzZSByZWZlcmVyPGJyIC8+Ci0gICAgICAgcG9seSBtYXAgIkNvdWxkIEkgaGF2ZSBhIG1lbnUsIHBsZWFzZT8iIDAsMCAwLDEwIDEwLDEwCi0gICAgICAxMCwwPGJyIC8+Ci0gICAgICAgcmVjdCAuLiAwLDAgNzcsMjcgInRoZSBkaXJlY3Rvcnkgb2YgdGhlIHJlZmVyZXIiPGJyIC8+Ci0gICAgICAgY2lyY2xlIGh0dHA6Ly93d3cuaW5ldG5lYnIuY29tL2xpbmNvbG4vZmVlZGJhY2svIDE5NSwwCi0gICAgICAzMDUsMjc8YnIgLz4KLSAgICAgICByZWN0IGFub3RoZXJfZmlsZSAiaW4gc2FtZSBkaXJlY3RvcnkgYXMgcmVmZXJlciIgMzA2LDAKLSAgICAgIDQxOSwyNzxiciAvPgotICAgICAgIHBvaW50IGh0dHA6Ly93d3cuenl6enl2YS5jb20vIDEwMCwxMDA8YnIgLz4KLSAgICAgICBwb2ludCBodHRwOi8vd3d3LnRyaXBvZC5jb20vIDIwMCwyMDA8YnIgLz4KLSAgICAgICByZWN0IG1haWx0bzpuYXRlQHRyaXBvZC5jb20gMTAwLDE1MCAyMDAsMCAiQnVncz8iPGJyIC8+Ci08L2V4YW1wbGU+Ci0KLTwvc2VjdGlvbj4KLQotPHNlY3Rpb24+PHRpdGxlPlJlZmVyZW5jaW5nIHlvdXIgbWFwZmlsZTwvdGl0bGU+Ci0KLTxleGFtcGxlPgotICAgICAgJmx0O0EgSFJFRj0iL21hcHMvaW1hZ2VtYXAxLm1hcCImZ3Q7PGJyIC8+Ci0gICAgICAgJmx0O0lNRyBJU01BUCBTUkM9Ii9pbWFnZXMvaW1hZ2VtYXAxLmdpZiImZ3Q7PGJyIC8+Ci0gICAgICAgJmx0Oy9BJmd0OwotPC9leGFtcGxlPgotPC9zZWN0aW9uPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5JbWFwTWVudTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5BY3Rpb24gaWYgbm8gY29vcmRpbmF0ZXMgYXJlIGdpdmVuIHdoZW4gY2FsbGluZwotYW4gaW1hZ2VtYXA8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5JbWFwTWVudQotICAgIG5vbmV8Zm9ybWF0dGVkfHNlbWlmb3JtYXR0ZWR8dW5mb3JtYXR0ZWQ8L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PgotPGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0PgotPGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+SW5kZXhlczwvb3ZlcnJpZGU+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5JbWFwTWVudTwvZGlyZWN0aXZlPiBkaXJlY3RpdmUgZGV0ZXJtaW5lcyB0aGUKLSAgICBhY3Rpb24gdGFrZW4gaWYgYW4gaW1hZ2VtYXAgZmlsZSBpcyBjYWxsZWQgd2l0aG91dCB2YWxpZAotICAgIGNvb3JkaW5hdGVzLjwvcD4KLQotICAgIDxkbD4KLSAgICAgIDxkdD48Y29kZT5ub25lPC9jb2RlPjwvZHQ+Ci0KLSAgICAgIDxkZD5JZiBJbWFwTWVudSBpcyA8Y29kZT5ub25lPC9jb2RlPiwgbm8gbWVudSBpcyBnZW5lcmF0ZWQsCi0gICAgICBhbmQgdGhlIDxjb2RlPmRlZmF1bHQ8L2NvZGU+IGFjdGlvbiBpcyBwZXJmb3JtZWQuPC9kZD4KLQotICAgICAgPGR0Pjxjb2RlPmZvcm1hdHRlZDwvY29kZT48L2R0PgotCi0gICAgICA8ZGQ+QSA8Y29kZT5mb3JtYXR0ZWQ8L2NvZGU+IG1lbnUgaXMgdGhlIHNpbXBsZXN0IG1lbnUuCi0gICAgICBDb21tZW50cyBpbiB0aGUgaW1hZ2VtYXAgZmlsZSBhcmUgaWdub3JlZC4gQSBsZXZlbCBvbmUgaGVhZGVyCi0gICAgICBpcyBwcmludGVkLCB0aGVuIGFuIGhydWxlLCB0aGVuIHRoZSBsaW5rcyBlYWNoIG9uIGEgc2VwYXJhdGUKLSAgICAgIGxpbmUuIFRoZSBtZW51IGhhcyBhIGNvbnNpc3RlbnQsIHBsYWluIGxvb2sgY2xvc2UgdG8gdGhhdCBvZgotICAgICAgYSBkaXJlY3RvcnkgbGlzdGluZy48L2RkPgotCi0gICAgICA8ZHQ+PGNvZGU+c2VtaWZvcm1hdHRlZDwvY29kZT48L2R0PgotCi0gICAgICA8ZGQ+SW4gdGhlIDxjb2RlPnNlbWlmb3JtYXR0ZWQ8L2NvZGU+IG1lbnUsIGNvbW1lbnRzIGFyZQotICAgICAgcHJpbnRlZCB3aGVyZSB0aGV5IG9jY3VyIGluIHRoZSBpbWFnZW1hcCBmaWxlLiBCbGFuayBsaW5lcwotICAgICAgYXJlIHR1cm5lZCBpbnRvIEhUTUwgYnJlYWtzLiBObyBoZWFkZXIgb3IgaHJ1bGUgaXMgcHJpbnRlZCwKLSAgICAgIGJ1dCBvdGhlcndpc2UgdGhlIG1lbnUgaXMgdGhlIHNhbWUgYXMgYQotICAgICAgPGNvZGU+Zm9ybWF0dGVkPC9jb2RlPiBtZW51LjwvZGQ+Ci0KLSAgICAgIDxkdD48Y29kZT51bmZvcm1hdHRlZDwvY29kZT48L2R0PgotCi0gICAgICA8ZGQ+Q29tbWVudHMgYXJlIHByaW50ZWQsIGJsYW5rIGxpbmVzIGFyZSBpZ25vcmVkLiBOb3RoaW5nIGlzCi0gICAgICBwcmludGVkIHRoYXQgZG9lcyBub3QgYXBwZWFyIGluIHRoZSBpbWFnZW1hcCBmaWxlLiBBbGwgYnJlYWtzCi0gICAgICBhbmQgaGVhZGVycyBtdXN0IGJlIGluY2x1ZGVkIGFzIGNvbW1lbnRzIGluIHRoZSBpbWFnZW1hcAotICAgICAgZmlsZS4gVGhpcyBnaXZlcyB5b3UgdGhlIG1vc3QgZmxleGliaWxpdHkgb3ZlciB0aGUgYXBwZWFyYW5jZQotICAgICAgb2YgeW91ciBtZW51cywgYnV0IHJlcXVpcmVzIHlvdSB0byB0cmVhdCB5b3VyIG1hcCBmaWxlcyBhcwotICAgICAgSFRNTCBpbnN0ZWFkIG9mIHBsYWludGV4dC48L2RkPgotICAgIDwvZGw+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+SW1hcERlZmF1bHQ8L25hbWU+Ci08ZGVzY3JpcHRpb24+RGVmYXVsdCBhY3Rpb24gd2hlbiBhbiBpbWFnZW1hcCBpcyBjYWxsZWQgd2l0aCBjb29yZGluYXRlcwotdGhhdCBhcmUgbm90IGV4cGxpY2l0bHkgbWFwcGVkPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+SW1hcERlZmF1bHQgZXJyb3J8bm9jb250ZW50fG1hcHxyZWZlcmVyfDxlbT5VUkw8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+SW1hcERlZmF1bHQgbm9jb250ZW50PC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+Ci08Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+Ci08Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT5JbmRleGVzPC9vdmVycmlkZT4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPkltYXBEZWZhdWx0PC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBzZXRzIHRoZSBkZWZhdWx0Ci0gICAgPGNvZGU+ZGVmYXVsdDwvY29kZT4gdXNlZCBpbiB0aGUgaW1hZ2VtYXAgZmlsZXMuIEl0cyB2YWx1ZSBpcwotICAgIG92ZXJyaWRkZW4gYnkgYSA8Y29kZT5kZWZhdWx0PC9jb2RlPiBkaXJlY3RpdmUgd2l0aGluIHRoZQotICAgIGltYWdlbWFwIGZpbGUuIElmIG5vdCBwcmVzZW50LCB0aGUgPGNvZGU+ZGVmYXVsdDwvY29kZT4gYWN0aW9uCi0gICAgaXMgPGNvZGU+bm9jb250ZW50PC9jb2RlPiwgd2hpY2ggbWVhbnMgdGhhdCBhIDxjb2RlPjIwNCBObwotICAgIENvbnRlbnQ8L2NvZGU+IGlzIHNlbnQgdG8gdGhlIGNsaWVudC4gSW4gdGhpcyBjYXNlLCB0aGUgY2xpZW50Ci0gICAgc2hvdWxkIGNvbnRpbnVlIHRvIGRpc3BsYXkgdGhlIG9yaWdpbmFsIHBhZ2UuPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkltYXBCYXNlPC9uYW1lPgotPGRlc2NyaXB0aW9uPkRlZmF1bHQgPGNvZGU+YmFzZTwvY29kZT4gZm9yIGltYWdlbWFwIGZpbGVzPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+SW1hcEJhc2UgbWFwfHJlZmVyZXJ8PGVtPlVSTDwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5JbWFwQmFzZSBodHRwOi8vc2VydmVybmFtZS88L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD4KLTxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPkluZGV4ZXM8L292ZXJyaWRlPgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIDxkaXJlY3RpdmU+SW1hcEJhc2U8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIHNldHMgdGhlIGRlZmF1bHQKLSAgICA8Y29kZT5iYXNlPC9jb2RlPiB1c2VkIGluIHRoZSBpbWFnZW1hcCBmaWxlcy4gSXRzIHZhbHVlIGlzCi0gICAgb3ZlcnJpZGRlbiBieSBhIDxjb2RlPmJhc2U8L2NvZGU+IGRpcmVjdGl2ZSB3aXRoaW4gdGhlIGltYWdlbWFwCi0gICAgZmlsZS4gSWYgbm90IHByZXNlbnQsIHRoZSA8Y29kZT5iYXNlPC9jb2RlPiBkZWZhdWx0cyB0bwotICAgIDxjb2RlPmh0dHA6Ly9zZXJ2ZXJuYW1lLzwvY29kZT4uPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTwvbW9kdWxlc3lub3BzaXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9pbmNsdWRlLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2luY2x1ZGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcwYThlMi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX2luY2x1ZGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi08IS0tJWh5cGVydGV4dCAtLT4KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgMi4wLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFwYWNoZSBtb2R1bGUgbW9kX2luY2x1ZGU8L1RJVExFPgotPC9IRUFEPgotCi08Qk9EWT4KLTxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX3N1Yi5naWYiIEFMVD0iIj4KLTwhLS0vJWh5cGVydGV4dCAtLT4KLTxIMT5Nb2R1bGUgbW9kX2luY2x1ZGU8L2gxPgotCi1UaGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4gdGhlIDxjb2RlPm1vZF9pbmNsdWRlLmM8L2NvZGU+IGZpbGUsIGFuZAotaXMgY29tcGlsZWQgaW4gYnkgZGVmYXVsdC4gSXQgcHJvdmlkZXMgZm9yIHNlcnZlci1wYXJzZWQgaHRtbCBkb2N1bWVudHMsCi1rbm93biBhcyBTUE1MIGRvY3VtZW50cy4KLUFueSBkb2N1bWVudCB3aXRoIG1pbWUgdHlwZSA8Y29kZT50ZXh0L3gtc2VydmVyLXBhcnNlZC1odG1sPC9jb2RlPiBvcgotPGNvZGU+dGV4dC94LXNlcnZlci1wYXJzZWQtaHRtbDM8L2NvZGU+IHdpbGwgYmUgcGFyc2VkIGJ5IHRoaXMgbW9kdWxlLAotd2l0aCB0aGUgcmVzdWx0aW5nIG91dHB1dCBnaXZlbiB0aGUgbWltZSB0eXBlIDxjb2RlPnRleHQvaHRtbDwvY29kZT4uCi08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgdGV4dC94LXNlcnZlci1wYXJzZWQtaHRtbH0gbWltZSB0eXBlJmd0OyAtLT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCB0ZXh0L3gtc2VydmVyLXBhcnNlZC1odG1sM30gbWltZSB0eXBlJmd0OyAtLT4KLQotPGgyPlNQTUwgLS0gSW5jbHVkZSBmaWxlIEZvcm1hdDwvaDI+Ci0KLVRoZSBkb2N1bWVudCBpcyBwYXJzZWQgYXMgYW4gSFRNTCBkb2N1bWVudCwgd2l0aCBzcGVjaWFsIGNvbW1hbmRzIGVtYmVkZGVkCi1hcyBTR01MIGNvbW1lbnRzLiBBIGNvbW1hbmQgaGFzIHRoZSBzeW50YXg6Ci08YmxvY2txdW90ZT48Y29kZT4KLSZsdDshLS0jPC9jb2RlPjxlbT5lbGVtZW50IGF0dHJpYnV0ZT12YWx1ZSBhdHRyaWJ1dGU9dmFsdWUgLi4uPC9lbT4gPGNvZGU+LS0mZ3Q7Ci08L2NvZGU+PC9ibG9ja3F1b3RlPgotVGhlIHZhbHVlIHdpbGwgb2Z0ZW4gYmUgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RlczsgbWFueSBjb21tYW5kcyBvbmx5IGFsbG93Ci1hIHNpbmdsZSBhdHRyaWJ1dGUtdmFsdWUgcGFpci4KLTxwPgotVGhlIGFsbG93ZWQgZWxlbWVudHMgYXJlOjxwPgotPGRsPgotPGR0PjxzdHJvbmc+Y29uZmlnPC9zdHJvbmc+Ci08ZGQ+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgY29uZmlnfSBTUE1MIGVsZW1lbnQmZ3Q7IC0tPgotVGhpcyBjb21tYW5kIGNvbnRyb2xzIHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgcGFyc2luZy4gVGhlIHZhbGlkIGF0dHJpYnV0ZXMKLWFyZToKLTxkbD4KLTxkdD5lcnJtc2cKLTxkZD5UaGUgdmFsdWUgaXMgYSBtZXNzYWdlIHRoYXQgaXMgc2VudCBiYWNrIHRvIHRoZSBjbGllbnQgaWYgYW4gZXJyb3Igb2NjdXJzCi13aGlsc3QgcGFyc2luZyB0aGUgZG9jdW1lbnQuCi08ZHQ+c2l6ZWZtdAotPGRkPlRoZSB2YWx1ZSBzZXRzIHRoZSBmb3JtYXQgdG8gYmUgdXNlZCB3aGljaCBkaXNwbGF5aW5nIHRoZSBzaXplIG9mIGEgZmlsZS4KLVZhbGlkIHZhbHVlcyBhcmUgPGNvZGU+Ynl0ZXM8L2NvZGU+IGZvciBhIGNvdW50IGluIGJ5dGVzLCBvcgotPGNvZGU+YWJicmV2PC9jb2RlPiBmb3IgYSBjb3VudCBpbiBLYiBvciBNYiBhcyBhcHByb3ByaWF0ZS4KLTxkdD50aW1lZm10Ci08ZGQ+VGhlIHZhbHVlIGlzIGEgc3RyaW5nIHRvIGJlIHVzZWQgYnkgdGhlIDxjb2RlPnN0cmZ0aW1lKDMpPC9jb2RlPiBsaWJyYXJ5Ci1yb3V0aW5lIHdoZW4gcHJpbnRpbmcgZGF0ZXMuCi08L2RsPgotCi08ZHQ+PHN0cm9uZz5lY2hvPC9zdHJvbmc+Ci08ZGQ+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgZWNob30gU1BNTCBlbGVtZW50Jmd0OyAtLT4KLVRoaXMgY29tbWFuZCBwcmludHMgb25lIG9mIHRoZSBpbmNsdWRlIHZhcmlhYmxlcywgZGVmaW5lZCBiZWxvdy4KLUlmIHRoZSB2YXJpYWJsZSBpcyB1bnNldCwgaXQgaXMgcHJpbnRlZCBhcyA8Y29kZT4obm9uZSk8L2NvZGU+LgotQW55IGRhdGVzIHByaW50ZWQgYXJlIHN1YmplY3QgdG8gdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIDxjb2RlPnRpbWVmbXQ8L2NvZGU+LgotQXR0cmlidXRlczoKLTxkbD4KLTxkdD52YXIKLTxkZD5UaGUgdmFsdWUgaXMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHByaW50LgotPC9kbD4KLQotPGR0PjxzdHJvbmc+ZXhlYzwvc3Ryb25nPgotPGRkPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IGV4ZWN9IFNQTUwgZWxlbWVudCZndDsgLS0+Ci1UaGUgZXhlYyBjb21tYW5kIGV4ZWN1dGVzIGEgZ2l2ZW4gc2hlbGwgY29tbWFuZCBvciBDR0kgc2NyaXB0LgotVGhlIEluY2x1ZGVzTk9FWEVDIDxBIEhSRUY9ImNvcmUuaHRtbCNvcHRpb25zIj5PcHRpb248L0E+IGRpc2FibGVzIHRoaXMgY29tbWFuZAotY29tcGxldGVseS4gVGhlIHZhbGlkIGF0dHJpYnV0ZXMgYXJlOgotPGRsPgotPGR0PmNnaQotPGRkPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCBDR0kgc2NyaXB0cywge1x0dCBleGVjfSBlbGVtZW50IGFuZCZndDsgLS0+Ci1UaGUgdmFsdWUgc3BlY2lmaWVzIGEgKCUtZW5jb2RlZCkgVVJMIHJlbGF0aXZlIHBhdGggdG8gdGhlIENHSSBzY3JpcHQuCi1JZiB0aGUgcGF0aCBkb2VzIG5vdCBiZWdpbiB3aXRoIGEgKC8pLCB0aGVuIGl0IGlzIHRha2VuIHRvIGJlIHJlbGF0aXZlIHRvCi10aGUgY3VycmVudCBkb2N1bWVudC4gVGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhpcyBwYXRoIGlzIGludm9rZWQKLWFzIGEgQ0dJIHNjcmlwdCwgZXZlbiBpZiB0aGUgc2VydmVyIHdvdWxkIG5vdCBub3JtYWxseSByZWNvZ25pc2UgaXQgYXMKLXN1Y2guIEhvd2V2ZXIsIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgc2NyaXB0IG11c3QgYmUgZW5hYmxlZCBmb3IKLUNHSSBzY3JpcHRzICh3aXRoIDxBIEhSRUY9Im1vZF9hbGlhcy5odG1sI3NjcmlwdGFsaWFzIj5TY3JpcHRBbGlhczwvQT4KLW9yIHRoZSBFeGVjQ0dJIDxBIEhSRUY9ImNvcmUuaHRtbCNvcHRpb25zIj5PcHRpb248L0E+KS48cD4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVggUEFUSFxfSU5GTyBDR0kgdmFyaWFibGUmZ3Q7IC0tPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCBRVUVSWVxfU1RSSU5HIENHSSB2YXJpYWJsZSZndDsgLS0+Ci1UaGUgQ0dJIHNjcmlwdCBpcyBnaXZlbiB0aGUgUEFUSF9JTkZPIGFuZCBxdWVyeSBzdHJpbmcgKFFVRVJZX1NUUklORykgb2YgdGhlCi1vcmlnaW5hbCByZXF1ZXN0IGZyb20gdGhlIGNsaWVudDsgdGhlc2UgY2Fubm90IGJlIHNwZWNpZmllZCBpbiB0aGUgVVJMIHBhdGguCi1UaGUgaW5jbHVkZSB2YXJpYWJsZXMgd2lsbCBiZSBhdmFpbGFibGUgdG8gdGhlIHNjcmlwdCBpbiBhZGRpdGlvbiB0byB0aGUKLXN0YW5kYXJkIDxBIEhSRUY9Im1vZF9jZ2kuaHRtbCI+Q0dJPC9BPiBlbnZpcm9ubWVudC48cD4KLUlmIHRoZSBzY3JpcHQgcmV0dXJucyBhIExvY2F0aW9uOiBoZWFkZXIgaW5zdGVhZCBvZiBvdXRwdXQsIHRoZW4gdGhpcwotd2lsbCBiZSB0cmFuc2xhdGVkIGludG8gYW4gSFRNTCBhbmNob3IuPHA+Ci1UaGUgPGNvZGU+aW5jbHVkZSB2aXJ0dWFsPC9jb2RlPiBlbGVtZW50IHNob3VsZCBiZSB1c2VkIGluIHByZWZlcmVuY2UgdG8KLTxjb2RlPmV4ZWMgY2dpPC9jb2RlPi4KLTxkdD5jbWQKLTxkZD5UaGUgc2VydmVyIHdpbGwgZXhlY3V0ZSB0aGUgZ2l2ZW4gc3RyaW5nIHVzaW5nIDxjb2RlPi9iaW4vc2g8L2NvZGU+LgotVGhlIGluY2x1ZGUgdmFyaWFibGVzIGFyZSBhdmFpbGFibGUgdG8gdGhlIGNvbW1hbmQuCi08L2RsPgotCi08ZHQ+PHN0cm9uZz5mc2l6ZTwvc3Ryb25nPgotPGRkPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IGZzaXplfSBTUE1MIGVsZW1lbnQmZ3Q7IC0tPgotVGhpcyBjb21tYW5kIHByaW50cyB0aGUgc2l6ZSBvZiB0aGUgc3BlY2lmaWVkIGZpbGUsIHN1YmplY3QgdG8gdGhlCi08Y29kZT5zaXplZm10PC9jb2RlPiBmb3JtYXQgc3BlY2lmaWNhdGlvbi4gQXR0cmlidXRlczoKLTxkbD4KLTxkdD5maWxlCi08ZGQ+VGhlIHZhbHVlIGlzIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQKLWRvY3VtZW50IGJlaW5nIHBhcnNlZC4KLTxkdD52aXJ0dWFsCi08ZGQ+VGhlIHZhbHVlIGlzIGEgKCUtZW5jb2RlZCkgVVJMLXBhdGggcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZG9jdW1lbnQgYmVpbmcKLXBhcnNlZC4gSWYgaXQgZG9lcyBub3QgYmVnaW4gd2l0aCBhIHNsYXNoICgvKSB0aGVuIGl0IGlzIHRha2VuIHRvIGJlIHJlbGF0aXZlCi10byB0aGUgY3VycmVudCBkb2N1bWVudC4KLTwvZGw+Ci0KLTxkdD48c3Ryb25nPmZsYXN0bW9kPC9zdHJvbmc+Ci08ZGQ+PCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IGV4ZWN9IGZsYXN0bW9kIGVsZW1lbnQmZ3Q7IC0tPgotVGhpcyBjb21tYW5kIHByaW50cyB0aGUgbGFzdCBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGZpbGUsCi1zdWJqZWN0IHRvIHRoZSA8Y29kZT50aW1lZm10PC9jb2RlPiBmb3JtYXQgc3BlY2lmaWNhdGlvbi4gVGhlIGF0dHJpYnV0ZXMgYXJlCi10aGUgc2FtZSBhcyBmb3IgdGhlIDxjb2RlPmZzaXplPC9jb2RlPiBjb21tYW5kLgotCi08ZHQ+PHN0cm9uZz5pbmNsdWRlPC9zdHJvbmc+Ci08ZGQ+PCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IGluY2x1ZGV9IFNQTUwgZWxlbWVudCZndDsgLS0+Ci1UaGlzIGNvbW1hbmQgaW5zZXJ0cyB0aGUgdGV4dCBvZiBhbm90aGVyIGRvY3VtZW50IG9yIGZpbGUgaW50byB0aGUgcGFyc2VkCi1maWxlLiBBbnkgaW5jbHVkZWQgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB1c3VhbCBhY2Nlc3MgY29udHJvbC4gSWYgdGhlCi1kaXJlY3RvcnkgY29udGFpbmluZyB0aGUgcGFyc2VkIGZpbGUgaGFzIHRoZQotPEEgSFJFRj0iY29yZS5odG1sI29wdGlvbnMiPk9wdGlvbjwvQT4KLUluY2x1ZGVzTk9FWEVDIHNldCwgYW5kIHRoZSBpbmNsdWRpbmcgdGhlIGRvY3VtZW50IHdvdWxkIGNhdXNlIGEgcHJvZ3JhbQotdG8gYmUgZXhlY3V0ZWQsIHRoZW4gaXQgd2lsbCBub3QgYmUgaW5jbHVkZWQ7IHRoaXMgcHJldmVudHMgdGhlIGV4ZWN1dGlvbiBvZgotQ0dJIHNjcmlwdHMuIE90aGVyd2lzZSBDR0kgc2NyaXB0cyBhcmUgaW52b2tlZCBhcyBub3JtYWwgdXNpbmcgdGhlIGNvbXBsZXRlCi1VUkwgZ2l2ZW4gaW4gdGhlIGNvbW1hbmQsIGluY2x1ZGluZyBhbnkgcXVlcnkgc3RyaW5nLgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCBDR0kgc2NyaXB0cywge1x0dCBpbmNsdWRlfSBlbGVtZW50IGFuZCZndDsgLS0+Ci08cD4KLQotQW4gYXR0cmlidXRlIGRlZmluZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBkb2N1bWVudDsgdGhlIGluY2x1c2lvbiBpcyBkb25lIGZvcgotZWFjaCBhdHRyaWJ1dGUgZ2l2ZW4gdG8gdGhlIGluY2x1ZGUgY29tbWFuZC4gVGhlIHZhbGlkIGF0dHJpYnV0ZXMgYXJlOgotPGRsPgotPGR0PmZpbGUKLTxkZD5UaGUgdmFsdWUgaXMgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgY3VycmVudAotZG9jdW1lbnQgYmVpbmcgcGFyc2VkLiBJdCBjYW5ub3QgY29udGFpbiA8Y29kZT4uLi88L2NvZGU+LCBub3IgY2FuIGl0IGJlIGFuCi1hYnNvbHV0ZSBwYXRoLiBUaGUgPGNvZGU+dmlydHVhbDwvY29kZT4gYXR0cmlidXRlIHNob3VsZCBhbHdheXMgYmUgdXNlZAotaW4gcHJlZmVyZW5jZSB0byB0aGlzIG9uZS4KLTxkdD52aXJ0dWFsCi08ZGQ+VGhlIHZhbHVlIGlzIGEgKCUtZW5jb2RlZCkgVVJMIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRvY3VtZW50IGJlaW5nCi1wYXJzZWQuIFRoZSBVUkwgY2Fubm90IGNvbnRhaW4gYSBzY2hlbWUgb3IgaG9zdG5hbWUsIG9ubHkgYSBwYXRoIGFuZAotYW4gb3B0aW9uYWwgcXVlcnkgc3RyaW5nLiBJZiBpdCBkb2VzIG5vdCBiZWdpbiB3aXRoIGEgc2xhc2ggKC8pIHRoZW4gaXQKLWlzIHRha2VuIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRvY3VtZW50LgotPC9kbD4KLUEgVVJMIGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIGF0dHJpYnV0ZSwgYW5kIHRoZSBvdXRwdXQgdGhlIHNlcnZlcgotd291bGQgcmV0dXJuIGlmIHRoZSBVUkwgd2VyZSBhY2Nlc3NlZCBieSB0aGUgY2xpZW50IGlzIGluY2x1ZGVkIGluIHRoZSBwYXJzZWQKLW91dHB1dC4gVGh1cyBpbmNsdWRlZCBmaWxlcyBjYW4gYmUgbmVzdGVkLgotPC9kbD4KLQotPGgyPkluY2x1ZGUgdmFyaWFibGVzPC9oMj4KLVRoZXNlIGFyZSBhdmFpbGFibGUgZm9yIHRoZSA8Y29kZT5lY2hvPC9jb2RlPiBjb21tYW5kLCBhbmQgdG8gYW55IHByb2dyYW0KLWludm9rZWQgYnkgdGhlIGRvY3VtZW50LgotPGRsPgotPGR0PkRBVEVfR01UCi08ZGQ+VGhlIGN1cnJlbnQgZGF0ZSBpbiBHcmVlbndpY2ggTWVhbiBUaW1lLgotPGR0PkRBVEVfTE9DQUwKLTxkZD5UaGUgY3VycmVudCBkYXRlIGluIHRoZSBsb2NhbCB0aW1lIHpvbmUuCi08ZHQ+RE9DVU1FTlRfTkFNRQotPGRkPlRoZSBmaWxlbmFtZSAoZXhjbHVkaW5nIGRpcmVjdG9yaWVzKSBvZiB0aGUgZG9jdW1lbnQgcmVxdWVzdGVkIGJ5IHRoZQotdXNlci4KLTxkdD5ET0NVTUVOVF9VUkkKLTxkZD5UaGUgKCUtZGVjb2RlZCkgVVJMIHBhdGggb2YgdGhlIGRvY3VtZW50IHJlcXVlc3RlZCBieSB0aGUgdXNlci4gTm90ZSB0aGF0Ci1pbiB0aGUgY2FzZSBvZiBuZXN0ZWQgaW5jbHVkZSBmaWxlcywgdGhpcyBpcyA8ZW0+bm90PC9lbT4gdGhlbiBVUkwgZm9yIHRoZQotY3VycmVudCBkb2N1bWVudC4KLTxkdD5MQVNUX01PRElGSUVECi08ZGQ+VGhlIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUgb2YgdGhlIGRvY3VtZW50IHJlcXVlc3RlZCBieSB0aGUgdXNlci4KLTwvZGw+Ci08cD4KLQotPCEtLSVoeXBlcnRleHQgLS0+Ci08aHI+Ci08aDI+RGlyZWN0aXZlczwvaDI+Ci08dWw+Ci08bGk+PEEgSFJFRj0iI3hiaXRoYWNrIj5YQml0SGFjazwvQT4KLTwvdWw+Ci08aHI+Ci08IS0tLyVoeXBlcnRleHQgLS0+Ci0KLTxBIG5hbWU9InhiaXRoYWNrIj48aDI+WEJpdEhhY2s8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBYQml0SGFja30gZGlyZWN0aXZlJmd0OyAtLT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBYQml0SGFjayA8ZW0+c3RhdHVzPC9lbT48YnI+Ci08c3Ryb25nPkRlZmF1bHQ6PC9zdHJvbmc+IDxjb2RlPlhCaXRIYWNrIG9mZjwvY29kZT48YnI+Ci08U3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3M8YnI+Ci08U3Ryb25nPk92ZXJyaWRlOjwvc3Ryb25nPiBPcHRpb25zPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IEJhc2U8YnI+Ci08c3Ryb25nPk1vZHVsZTo8L3N0cm9uZz4gbW9kX2luY2x1ZGU8cD4KLQotVGhlIFhCaXRIYWNrIGRpcmVjdGl2ZXMgY29udHJvbHMgdGhlIHBhcnNpbmcgb2Ygb3JkaW5hcnkgaHRtbCBkb2N1bWVudHMuCi08ZW0+U3RhdHVzPC9lbT4gY2FuIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci08ZGw+Ci08ZHQ+b2ZmCi08ZGQ+Tm8gc3BlY2lhbCB0cmVhdG1lbnQgb2YgZXhlY3V0YWJsZSBmaWxlcy4KLTxkdD5vbgotPGRkPkFueSBmaWxlIHRoYXQgaGFzIHRoZSB1c2VyLWV4ZWN1dGUgYml0IHNldCB3aWxsIGJlIHRyZWF0ZWQgYXMgYQotc2VydmVyLXBhcnNlZCBodG1sIGRvY3VtZW50LgotPGR0PmZ1bGwKLTxkZD5BcyBmb3IgPGNvZGU+b248L2NvZGU+IGJ1dCBhbHNvIHRlc3QgdGhlIGdyb3VwLWV4ZWN1dGUgYml0LiBJZiBpdAotaXMgc2V0LCB0aGVuIHNldCB0aGUgTGFzdC1tb2RpZmllZCBkYXRlIG9mIHRoZSByZXR1cm5lZCBmaWxlIHRvIGJlIHRoZQotbGFzdCBtb2RpZmllZCB0aW1lIG9mIHRoZSBmaWxlLiBJZiBpdCBpcyBub3Qgc2V0LCB0aGVuIG5vIGxhc3QtbW9kaWZpZWQgZGF0ZQotaXMgc2VudC4gU2V0dGluZyB0aGlzIGJpdCBhbGxvd3MgY2xpZW50cyBhbmQgcHJveGllcyB0byBjYWNoZSB0aGUgcmVzdWx0IG9mCi10aGUgcmVxdWVzdC4KLTwvZGw+Ci08cD4KLTwhLS0laHlwZXJ0ZXh0IC0tPgotPGhyPgotCi08QSBIUkVGPSIuLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2hvbWUuZ2lmIiBBTFQ9IkhvbWUiPjwvQT4KLTxBIEhSRUY9Ii4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9pbmRleC5naWYiIEFMVD0iSW5kZXgiPjwvQT4KLQotPC9CT0RZPgotPC9IVE1MPgotPCEtLS8laHlwZXJ0ZXh0IC0tPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9pbmNsdWRlLnhtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfaW5jbHVkZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjRkYWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9pbmNsdWRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9Ii4uL3N0eWxlL21hbnVhbC54c2wiPz4KLTxtb2R1bGVzeW5vcHNpcz4KLQotPG5hbWU+bW9kX2luY2x1ZGU8L25hbWU+Ci08c3RhdHVzPkJhc2U8L3N0YXR1cz4KLTxpZGVudGlmaWVyPmluY2x1ZGVfbW9kdWxlPC9pZGVudGlmaWVyPgotPHNvdXJjZT5tb2RfaW5jbHVkZS5jPC9zb3VyY2U+Ci08Y29tcGF0aWJpbGl0eT48L2NvbXBhdGliaWxpdHk+Ci08ZGVzY3JpcHRpb24+VGhpcyBtb2R1bGUgcHJvdmlkZXMgZm9yIHNlcnZlci1wYXJzZWQgaHRtbAotZG9jdW1lbnRzLjwvZGVzY3JpcHRpb24+Ci0KLTxzdW1tYXJ5PgotCi0gICAgPHA+VGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBmaWx0ZXIgd2hpY2ggd2lsbCBwcm9jZXNzIGZpbGVzCi0gICAgYmVmb3JlIHRoZXkgYXJlIHNlbnQgdG8gdGhlIGNsaWVudC4gVGhlIHByb2Nlc3NpbmcgaXMKLSAgICBjb250cm9sbGVkIGJ5IHNwZWNpYWxseSBmb3JtYXRlZCBTR01MIGNvbW1lbnRzLCByZWZlcnJlZCB0byBhcwotICAgIDxlbT5lbGVtZW50czwvZW0+LiBUaGVzZSBlbGVtZW50cyBhbGxvdyBjb25kaXRpb25hbCB0ZXh0LCB0aGUKLSAgICBpbmNsdXNpb24gb3RoZXIgZmlsZXMgb3IgcHJvZ3JhbXMsIGFzIHdlbGwgYXMgdGhlIHNldHRpbmcgYW5kCi0gICAgcHJpbnRpbmcgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzLjwvcD4KLQotICAgIDxzZWVhbHNvPjxzdHJvbmc+U2VlIGFsc288L3N0cm9uZz46Ci0gICAgPGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiPk9wdGlvbnM8L2RpcmVjdGl2ZT4sCi0gICAgPGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiPlNldE91dHB1dEZpbHRlcjwvZGlyZWN0aXZlPgotICAgIGFuZCA8ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSI+QWNjZXB0UGF0aEluZm88L2RpcmVjdGl2ZT4uPC9zZWVhbHNvPgotCi08L3N1bW1hcnk+Ci0KLTxzZWN0aW9uIGlkPSJlbmFibGluZyI+Ci0gICAgPHRpdGxlPkVuYWJsaW5nIFNlcnZlci1TaWRlIEluY2x1ZGVzPC90aXRsZT4KLQotICAgIDxwPlNlcnZlciBTaWRlIEluY2x1ZGVzIGFyZSBpbXBsZW1lbnRlZCBieSB0aGUKLSAgICA8Y29kZT5JTkNMVURFUzwvY29kZT4gPGEgaHJlZj0iLi4vZmlsdGVyLmh0bWwiPmZpbHRlcjwvYT4uIElmCi0gICAgZG9jdW1lbnRzIGNvbnRhaW5pbmcgc2VydmVyLXNpZGUgaW5jbHVkZSBkaXJlY3RpdmVzIGFyZSBnaXZlbgotICAgIHRoZSBleHRlbnNpb24gLnNodG1sLCB0aGUgZm9sbG93aW5nIGRpcmVjdGl2ZXMgd2lsbCBtYWtlIEFwYWNoZQotICAgIHBhcnNlIHRoZW0gYW5kIGFzc2lnbiB0aGUgcmVzdWx0aW5nIGRvY3VtZW50IHRoZSBtaW1lIHR5cGUgb2YKLSAgICA8Y29kZT50ZXh0L2h0bWw8L2NvZGU+OjwvcD4KLQotICAgIDxleGFtcGxlPgotICAgICAgQWRkVHlwZSB0ZXh0L2h0bWwgLnNodG1sPGJyIC8+Ci0gICAgICBBZGRPdXRwdXRGaWx0ZXIgSU5DTFVERVMgLnNodG1sCi0gICAgPC9leGFtcGxlPgotCi0gICAgPHA+VGhlIGZvbGxvd2luZyBkaXJlY3RpdmUgbXVzdCBiZSBnaXZlbiBmb3IgdGhlIGRpcmVjdG9yaWVzCi0gICAgY29udGFpbmluZyB0aGUgc2h0bWwgZmlsZXMgKHR5cGljYWxseSBpbiBhCi0gICAgPGNvZGU+Jmx0O0RpcmVjdG9yeSZndDs8L2NvZGU+IHNlY3Rpb24sIGJ1dCB0aGlzIGRpcmVjdGl2ZSBpcwotICAgIGFsc28gdmFsaWQgLmh0YWNjZXNzIGZpbGVzIGlmIDxjb2RlPkFsbG93T3ZlcnJpZGUKLSAgICBPcHRpb25zPC9jb2RlPiBpcyBzZXQpOjwvcD4KLQotICAgIDxleGFtcGxlPgotICAgICAgT3B0aW9ucyArSW5jbHVkZXMKLSAgICA8L2V4YW1wbGU+Ci0KLSAgICA8cD5Gb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHRoZSA8Y29kZT5zZXJ2ZXItcGFyc2VkPC9jb2RlPgotICAgIDxhIGhyZWY9Ii4uL2hhbmRsZXIuaHRtbCI+aGFuZGxlcjwvYT4gYWxzbyBhY3RpdmF0ZXMgdGhlCi0gICAgSU5DTFVERVMgZmlsdGVyLiBBcyB3ZWxsLCBBcGFjaGUgd2lsbCBhY3RpdmF0ZSB0aGUgSU5DTFVERVMKLSAgICBmaWx0ZXIgZm9yIGFueSBkb2N1bWVudCB3aXRoIG1pbWUgdHlwZQotICAgIDxjb2RlPnRleHQveC1zZXJ2ZXItcGFyc2VkLWh0bWw8L2NvZGU+IG9yCi0gICAgPGNvZGU+dGV4dC94LXNlcnZlci1wYXJzZWQtaHRtbDM8L2NvZGU+IChhbmQgdGhlIHJlc3VsdGluZwotICAgIG91dHB1dCB3aWxsIGhhdmUgdGhlIG1pbWUgdHlwZSA8Y29kZT50ZXh0L2h0bWw8L2NvZGU+KS48L3A+Ci0KLSAgICA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIG91ciA8YQotICAgIGhyZWY9Ii4uL2hvd3RvL3NzaS5odG1sIj5UdXRvcmlhbCBvbiBTZXJ2ZXIgU2lkZQotICAgIEluY2x1ZGVzPC9hPi48L3A+Ci08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uIGlkPSJiYXNpYyI+Ci0gICAgPHRpdGxlPkJhc2ljIEVsZW1lbnRzPC90aXRsZT4KLSAgICA8cD5UaGUgZG9jdW1lbnQgaXMgcGFyc2VkIGFzIGFuIEhUTUwgZG9jdW1lbnQsIHdpdGggc3BlY2lhbAotICAgIGNvbW1hbmRzIGVtYmVkZGVkIGFzIFNHTUwgY29tbWVudHMuIEEgY29tbWFuZCBoYXMgdGhlIHN5bnRheDogPC9wPgotCi0gICAgPGV4YW1wbGU+Ci0gICAgICA8Y29kZT4mbHQ7IS0tIzwvY29kZT48ZW0+ZWxlbWVudCBhdHRyaWJ1dGU9dmFsdWUKLSAgICAgIGF0dHJpYnV0ZT12YWx1ZSAuLi48L2VtPiA8Y29kZT4tLSZndDs8L2NvZGU+Ci0gICAgPC9leGFtcGxlPgotCi0gICAgPHA+VGhlIHZhbHVlIHdpbGwgb2Z0ZW4gYmUgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RlczsgbWFueQotICAgIGNvbW1hbmRzIG9ubHkgYWxsb3cgYSBzaW5nbGUgYXR0cmlidXRlLXZhbHVlIHBhaXIuIE5vdGUgdGhhdAotICAgIHRoZSBjb21tZW50IHRlcm1pbmF0b3IgKDxzYW1wPi0tJmd0Ozwvc2FtcD4pIHNob3VsZCBiZSBwcmVjZWRlZAotICAgIGJ5IHdoaXRlc3BhY2UgdG8gZW5zdXJlIHRoYXQgaXQgaXNuJ3QgY29uc2lkZXJlZCBwYXJ0IG9mIGFuIFNTSQotICAgIHRva2VuLiA8L3A+Ci0KLSAgICA8cD5UaGUgYWxsb3dlZCBlbGVtZW50cyBhcmU6PC9wPgotCi0gICAgPGRsPgotICAgICAgPGR0PjxzdHJvbmc+Y29uZmlnPC9zdHJvbmc+PC9kdD4KLQotICAgICAgPGRkPgotICAgICAgICBUaGlzIGNvbW1hbmQgY29udHJvbHMgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSBwYXJzaW5nLiBUaGUKLSAgICAgICAgdmFsaWQgYXR0cmlidXRlcyBhcmU6IAotCi0gICAgICAgIDxkbD4KLSAgICAgICAgICA8ZHQ+PHN0cm9uZz5lcnJtc2c8L3N0cm9uZz48L2R0PgotCi0gICAgICAgICAgPGRkPlRoZSB2YWx1ZSBpcyBhIG1lc3NhZ2UgdGhhdCBpcyBzZW50IGJhY2sgdG8gdGhlCi0gICAgICAgICAgY2xpZW50IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsc3QgcGFyc2luZyB0aGUKLSAgICAgICAgICBkb2N1bWVudC48L2RkPgotCi0gICAgICAgICAgPGR0PjxzdHJvbmc+c2l6ZWZtdDwvc3Ryb25nPjwvZHQ+Ci0KLSAgICAgICAgICA8ZGQ+VGhlIHZhbHVlIHNldHMgdGhlIGZvcm1hdCB0byBiZSB1c2VkIHdoaWNoIGRpc3BsYXlpbmcKLSAgICAgICAgICB0aGUgc2l6ZSBvZiBhIGZpbGUuIFZhbGlkIHZhbHVlcyBhcmUgPGNvZGU+Ynl0ZXM8L2NvZGU+Ci0gICAgICAgICAgZm9yIGEgY291bnQgaW4gYnl0ZXMsIG9yIDxjb2RlPmFiYnJldjwvY29kZT4gZm9yIGEgY291bnQKLSAgICAgICAgICBpbiBLYiBvciBNYiBhcyBhcHByb3ByaWF0ZS48L2RkPgotCi0gICAgICAgICAgPGR0PjxzdHJvbmc+dGltZWZtdDwvc3Ryb25nPjwvZHQ+Ci0KLSAgICAgICAgICA8ZGQ+VGhlIHZhbHVlIGlzIGEgc3RyaW5nIHRvIGJlIHVzZWQgYnkgdGhlCi0gICAgICAgICAgPGNvZGU+c3RyZnRpbWUoMyk8L2NvZGU+IGxpYnJhcnkgcm91dGluZSB3aGVuIHByaW50aW5nCi0gICAgICAgICAgZGF0ZXMuPC9kZD4KLSAgICAgICAgPC9kbD4KLSAgICAgIDwvZGQ+Ci0KLSAgICAgIDxkdD48c3Ryb25nPjxhIGlkPSJlY2hvIiBuYW1lPSJlY2hvIj5lY2hvPC9hPjwvc3Ryb25nPjwvZHQ+Ci0KLSAgICAgIDxkZD4KLSAgICAgICAgVGhpcyBjb21tYW5kIHByaW50cyBvbmUgb2YgdGhlIDxhIGhyZWY9IiNpbmNsdWRldmFycyI+aW5jbHVkZQotICAgICAgICB2YXJpYWJsZXM8L2E+LCBkZWZpbmVkCi0gICAgICAgIGJlbG93LiBJZiB0aGUgdmFyaWFibGUgaXMgdW5zZXQsIGl0IGlzIHByaW50ZWQgYXMKLSAgICAgICAgPGNvZGU+KG5vbmUpPC9jb2RlPi4gQW55IGRhdGVzIHByaW50ZWQgYXJlIHN1YmplY3QgdG8gdGhlCi0gICAgICAgIGN1cnJlbnRseSBjb25maWd1cmVkIDxjb2RlPnRpbWVmbXQ8L2NvZGU+LiBBdHRyaWJ1dGVzOiAKLQotICAgICAgICA8ZGw+Ci0gICAgICAgICAgPGR0PjxzdHJvbmc+dmFyPC9zdHJvbmc+PC9kdD4KLQotICAgICAgICAgIDxkZD5UaGUgdmFsdWUgaXMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHByaW50LjwvZGQ+Ci0KLSAgICAgICAgICA8ZHQ+PHN0cm9uZz5lbmNvZGluZzwvc3Ryb25nPjwvZHQ+Ci0KLSAgICAgICAgICA8ZGQ+U3BlY2lmaWVzIGhvdyBBcGFjaGUgc2hvdWxkIGVuY29kZSBzcGVjaWFsIGNoYXJhY3RlcnMKLSAgICAgICAgICBjb250YWluZWQgaW4gdGhlIHZhcmlhYmxlIGJlZm9yZSBvdXRwdXR0aW5nIHRoZW0uIElmIHNldAotICAgICAgICAgIHRvICJub25lIiwgbm8gZW5jb2Rpbmcgd2lsbCBiZSBkb25lLiBJZiBzZXQgdG8gInVybCIsCi0gICAgICAgICAgdGhlbiBVUkwgZW5jb2RpbmcgKGFsc28ga25vd24gYXMgJS1lbmNvZGluZzsgdGhpcyBpcwotICAgICAgICAgIGFwcHJvcHJpYXRlIGZvciB1c2Ugd2l0aGluIFVSTHMgaW4gbGlua3MsIGV0Yy4pIHdpbGwgYmUKLSAgICAgICAgICBwZXJmb3JtZWQuIEF0IHRoZSBzdGFydCBvZiBhbiA8Y29kZT5lY2hvPC9jb2RlPiBlbGVtZW50LAotICAgICAgICAgIHRoZSBkZWZhdWx0IGlzIHNldCB0byAiZW50aXR5IiwgcmVzdWx0aW5nIGluIGVudGl0eQotICAgICAgICAgIGVuY29kaW5nICh3aGljaCBpcyBhcHByb3ByaWF0ZSBpbiB0aGUgY29udGV4dCBvZiBhCi0gICAgICAgICAgYmxvY2stbGV2ZWwgSFRNTCBlbGVtZW50LCBlZy4gYSBwYXJhZ3JhcGggb2YgdGV4dCkuIFRoaXMKLSAgICAgICAgICBjYW4gYmUgY2hhbmdlZCBieSBhZGRpbmcgYW4gPGNvZGU+ZW5jb2Rpbmc8L2NvZGU+Ci0gICAgICAgICAgYXR0cmlidXRlLCB3aGljaCB3aWxsIHJlbWFpbiBpbiBlZmZlY3QgdW50aWwgdGhlIG5leHQKLSAgICAgICAgICA8Y29kZT5lbmNvZGluZzwvY29kZT4gYXR0cmlidXRlIGlzIGVuY291bnRlcmVkIG9yIHRoZQotICAgICAgICAgIGVsZW1lbnQgZW5kcywgd2hpY2hldmVyIGNvbWVzIGZpcnN0LiBOb3RlIHRoYXQgdGhlCi0gICAgICAgICAgPGNvZGU+ZW5jb2Rpbmc8L2NvZGU+IGF0dHJpYnV0ZSBtdXN0IDxlbT5wcmVjZWRlPC9lbT4gdGhlCi0gICAgICAgICAgY29ycmVzcG9uZGluZyA8Y29kZT52YXI8L2NvZGU+IGF0dHJpYnV0ZSB0byBiZSBlZmZlY3RpdmUsCi0gICAgICAgICAgYW5kIHRoYXQgb25seSBzcGVjaWFsIGNoYXJhY3RlcnMgYXMgZGVmaW5lZCBpbiB0aGUKLSAgICAgICAgICBJU08tODg1OS0xIGNoYXJhY3RlciBlbmNvZGluZyB3aWxsIGJlIGVuY29kZWQuIFRoaXMKLSAgICAgICAgICBlbmNvZGluZyBwcm9jZXNzIG1heSBub3QgaGF2ZSB0aGUgZGVzaXJlZCByZXN1bHQgaWYgYQotICAgICAgICAgIGRpZmZlcmVudCBjaGFyYWN0ZXIgZW5jb2RpbmcgaXMgaW4gdXNlLiBBcGFjaGUgMS4zLjEyIGFuZAotICAgICAgICAgIGFib3ZlOyBwcmV2aW91cyB2ZXJzaW9ucyBkbyBubyBlbmNvZGluZy48L2RkPgotICAgICAgICA8L2RsPgotICAgICAgPC9kZD4KLQotICAgICAgPGR0PjxzdHJvbmc+ZXhlYzwvc3Ryb25nPjwvZHQ+Ci0KLSAgICAgIDxkZD4KLSAgICAgICAgVGhlIGV4ZWMgY29tbWFuZCBleGVjdXRlcyBhIGdpdmVuIHNoZWxsIGNvbW1hbmQgb3IgQ0dJCi0gICAgICAgIHNjcmlwdC4gVGhlIEluY2x1ZGVzTk9FWEVDIDxhCi0gICAgICAgIGhyZWY9ImNvcmUuaHRtbCNvcHRpb25zIj5PcHRpb248L2E+IGRpc2FibGVzIHRoaXMgY29tbWFuZAotICAgICAgICBjb21wbGV0ZWx5LiBUaGUgdmFsaWQgYXR0cmlidXRlcyBhcmU6IAotCi0gICAgICAgIDxkbD4KLSAgICAgICAgICA8ZHQ+PHN0cm9uZz5jZ2k8L3N0cm9uZz48L2R0PgotCi0gICAgICAgICAgPGRkPgotICAgICAgICAgICAgVGhlIHZhbHVlIHNwZWNpZmllcyBhICglLWVuY29kZWQpIFVSTCByZWxhdGl2ZSBwYXRoIHRvCi0gICAgICAgICAgICB0aGUgQ0dJIHNjcmlwdC4gSWYgdGhlIHBhdGggZG9lcyBub3QgYmVnaW4gd2l0aCBhICgvKSwKLSAgICAgICAgICAgIHRoZW4gaXQgaXMgdGFrZW4gdG8gYmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQKLSAgICAgICAgICAgIGRvY3VtZW50LiBUaGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGlzIHBhdGggaXMKLSAgICAgICAgICAgIGludm9rZWQgYXMgYSBDR0kgc2NyaXB0LCBldmVuIGlmIHRoZSBzZXJ2ZXIgd291bGQgbm90Ci0gICAgICAgICAgICBub3JtYWxseSByZWNvZ25pemUgaXQgYXMgc3VjaC4gSG93ZXZlciwgdGhlIGRpcmVjdG9yeQotICAgICAgICAgICAgY29udGFpbmluZyB0aGUgc2NyaXB0IG11c3QgYmUgZW5hYmxlZCBmb3IgQ0dJIHNjcmlwdHMKLSAgICAgICAgICAgICh3aXRoIDxhCi0gICAgICAgICAgICBocmVmPSJtb2RfYWxpYXMuaHRtbCNzY3JpcHRhbGlhcyI+U2NyaXB0QWxpYXM8L2E+IG9yCi0gICAgICAgICAgICB0aGUgRXhlY0NHSSA8YSBocmVmPSJjb3JlLmh0bWwjb3B0aW9ucyI+T3B0aW9uPC9hPikuIAotCi0gICAgICAgICAgICA8cD5UaGUgQ0dJIHNjcmlwdCBpcyBnaXZlbiB0aGUgUEFUSF9JTkZPIGFuZCBxdWVyeQotICAgICAgICAgICAgc3RyaW5nIChRVUVSWV9TVFJJTkcpIG9mIHRoZSBvcmlnaW5hbCByZXF1ZXN0IGZyb20gdGhlCi0gICAgICAgICAgICBjbGllbnQ7IHRoZXNlIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gdGhlIFVSTCBwYXRoLiBUaGUKLSAgICAgICAgICAgIGluY2x1ZGUgdmFyaWFibGVzIHdpbGwgYmUgYXZhaWxhYmxlIHRvIHRoZSBzY3JpcHQgaW4KLSAgICAgICAgICAgIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCA8YSBocmVmPSJtb2RfY2dpLmh0bWwiPkNHSTwvYT4KLSAgICAgICAgICAgIGVudmlyb25tZW50LjwvcD4KLQotICAgICAgICAgICAgPHA+Rm9yIGV4YW1wbGU6PC9wPgotCi0gIDxjb2RlPiZsdDshLS0jZXhlYyBjZ2k9Ii9jZ2ktYmluL2V4YW1wbGUuY2dpIiAtLSZndDs8L2NvZGU+Ci0KLSAgICAgICAgICAgIDxwPklmIHRoZSBzY3JpcHQgcmV0dXJucyBhIExvY2F0aW9uOiBoZWFkZXIgaW5zdGVhZCBvZgotICAgICAgICAgICAgb3V0cHV0LCB0aGVuIHRoaXMgd2lsbCBiZSB0cmFuc2xhdGVkIGludG8gYW4gSFRNTAotICAgICAgICAgICAgYW5jaG9yLjwvcD4KLQotICAgICAgICAgICAgPHA+VGhlIDxjb2RlPjxhIGhyZWY9IiNpbmNsdWRldmlydHVhbCI+aW5jbHVkZQotICAgICAgICAgICAgdmlydHVhbDwvYT48L2NvZGU+IGVsZW1lbnQgc2hvdWxkIGJlCi0gICAgICAgICAgICB1c2VkIGluIHByZWZlcmVuY2UgdG8gPGNvZGU+ZXhlYyBjZ2k8L2NvZGU+LiBJbiBwYXJ0aWN1bGFyLAotICAgICAgICAgICAgaWYgeW91IG5lZWQgdG8gcGFzcyBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBhIENHSSBwcm9ncmFtLAotICAgICAgICAgICAgdXNpbmcgdGhlIHF1ZXJ5IHN0cmluZywgdGhpcyBjYW5ub3QgYmUgZG9uZSB3aXRoIDxjb2RlPmV4ZWMKLSAgICAgICAgICAgIGNnaTwvY29kZT4sIGJ1dCBjYW4gYmUgZG9uZSB3aXRoIDxjb2RlPmluY2x1ZGUKLSAgICAgICAgICAgIHZpcnR1YWw8L2NvZGU+LCBhcyBzaG93biBoZXJlOjwvcD4KLQotICA8Y29kZT4mbHQ7IS0tI2luY2x1ZGUgdmlydHVhbD0iL2NnaS1iaW4vZXhhbXBsZS5jZ2k/YXJndW1lbnQ9dmFsdWUiIC0tJmd0OzwvY29kZT4KLSAgICAgICAgICA8L2RkPgotCi0gICAgICAgICAgPGR0PjxzdHJvbmc+Y21kPC9zdHJvbmc+PC9kdD4KLQotICAgICAgICAgIDxkZD4KLSAgICAgICAgICA8cD5UaGUgc2VydmVyIHdpbGwgZXhlY3V0ZSB0aGUgZ2l2ZW4gc3RyaW5nIHVzaW5nCi0gICAgICAgICAgPGNvZGU+L2Jpbi9zaDwvY29kZT4uIFRoZSA8YSAKLSAgICAgICAgICBocmVmPSIjaW5jbHVkZXZhcnMiPmluY2x1ZGUgdmFyaWFibGVzPC9hPiBhcmUgYXZhaWxhYmxlCi0gICAgICAgICAgdG8gdGhlIGNvbW1hbmQsIGluIGFkZGl0aW9uIHRvIHRoZSB1c3VhbCBzZXQgb2YgQ0dJIAotICAgICAgICAgIHZhcmlhYmxlcy48L3A+Ci0KLSAgICAgICAgPHA+VGhlIHVzZSBvZiA8Y29kZT48YSBocmVmPSIjaW5jbHVkZXZpcnR1YWwiPiNpbmNsdWRlIAotICAgICAgICB2aXJ0dWFsPC9hPjwvY29kZT4gaXMgYWxtb3N0IGFsd2F5cwotICAgICAgICBwcmVmZXJlZCB0byB1c2luZyBlaXRoZXIgPGNvZGU+I2V4ZWMgY2dpPC9jb2RlPiBvciA8Y29kZT4jZXhlYwotICAgICAgICBjbWQ8L2NvZGU+LiBUaGUgZm9ybWVyICg8Y29kZT4jaW5jbHVkZSB2aXJ0dWFsPC9jb2RlPikgdXNlZCB0aGUKLSAgICAgICAgc3RhbmRhcmQgQXBhY2hlIHN1Yi1yZXF1ZXN0IG1lY2hhbmlzbSB0byBpbmNsdWRlIGZpbGVzIG9yCi0gICAgICAgIHNjcmlwdHMuIEl0IGlzIG11Y2ggYmV0dGVyIHRlc3RlZCBhbmQgbWFpbnRhaW5lZC48L3A+Ci0KLSAgICAgICAgICA8cD5JbiBhZGRpdGlvbiwgb24gc29tZSBwbGF0Zm9ybXMsIGxpa2UgV2luMzIsIGFuZCBvbiB1bml4Ci0gICAgICAgICAgd2hlbiB1c2luZyBzdWV4ZWMsIHlvdSBjYW5ub3QgcGFzcyBhcmd1bWVudHMgdG8gYSBjb21tYW5kIGluIAotICAgICAgICAgIGFuIDxjb2RlPmV4ZWM8L2NvZGU+IGRpcmVjdGl2ZSwgb3Igb3RoZXJ3aXNlIGluY2x1ZGUgc3BhY2VzIGluCi0gICAgICAgICAgdGhlIGNvbW1hbmQuIFRodXMsIHdoaWxlIHRoZSBmb2xsb3dpbmcgd2lsbCB3b3JrIHVuZGVyIGEKLSAgICAgICAgICBub24tc3VleGVjIGNvbmZpZ3VyYXRpb24gb24gdW5peCwgaXQgd2lsbCBub3QgcHJvZHVjZSB0aGUKLSAgICAgICAgICBkZXNpcmVkIHJlc3VsdCB1bmRlciBXaW4zMiwgb3Igd2hlbiBydW5uaW5nIHN1ZXhlYzo8L3A+Ci0KLSAgIDxjb2RlPiZsdDshLS0jZXhlYyBjbWQ9InBlcmwgL3BhdGgvdG8vcGVybHNjcmlwdCBhcmcxIGFyZzIiIC0tJmd0OzwvY29kZT4KLQotICAgICAgICAgIDwvZGQ+Ci0gICAgICAgIDwvZGw+Ci0gICAgICA8L2RkPgotCi0gICAgICA8ZHQ+PHN0cm9uZz5mc2l6ZTwvc3Ryb25nPjwvZHQ+Ci0KLSAgICAgIDxkZD4KLSAgICAgICAgVGhpcyBjb21tYW5kIHByaW50cyB0aGUgc2l6ZSBvZiB0aGUgc3BlY2lmaWVkIGZpbGUsIHN1YmplY3QKLSAgICAgICAgdG8gdGhlIDxjb2RlPnNpemVmbXQ8L2NvZGU+IGZvcm1hdCBzcGVjaWZpY2F0aW9uLgotICAgICAgICBBdHRyaWJ1dGVzOiAKLQotICAgICAgICA8ZGw+Ci0gICAgICAgICAgPGR0PjxzdHJvbmc+ZmlsZTwvc3Ryb25nPjwvZHQ+Ci0KLSAgICAgICAgICA8ZGQ+VGhlIHZhbHVlIGlzIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5Ci0gICAgICAgICAgY29udGFpbmluZyB0aGUgY3VycmVudCBkb2N1bWVudCBiZWluZyBwYXJzZWQuPC9kZD4KLQotICAgICAgICAgIDxkdD48c3Ryb25nPnZpcnR1YWw8L3N0cm9uZz48L2R0PgotCi0gICAgICAgICAgPGRkPlRoZSB2YWx1ZSBpcyBhICglLWVuY29kZWQpIFVSTC1wYXRoIHJlbGF0aXZlIHRvIHRoZQotICAgICAgICAgIGN1cnJlbnQgZG9jdW1lbnQgYmVpbmcgcGFyc2VkLiBJZiBpdCBkb2VzIG5vdCBiZWdpbiB3aXRoCi0gICAgICAgICAgYSBzbGFzaCAoLykgdGhlbiBpdCBpcyB0YWtlbiB0byBiZSByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgICBjdXJyZW50IGRvY3VtZW50LjwvZGQ+Ci0gICAgICAgIDwvZGw+Ci0gICAgICA8L2RkPgotCi0gICAgICA8ZHQ+PHN0cm9uZz5mbGFzdG1vZDwvc3Ryb25nPjwvZHQ+Ci0KLSAgICAgIDxkZD5UaGlzIGNvbW1hbmQgcHJpbnRzIHRoZSBsYXN0IG1vZGlmaWNhdGlvbiBkYXRlIG9mIHRoZQotICAgICAgc3BlY2lmaWVkIGZpbGUsIHN1YmplY3QgdG8gdGhlIDxjb2RlPnRpbWVmbXQ8L2NvZGU+IGZvcm1hdAotICAgICAgc3BlY2lmaWNhdGlvbi4gVGhlIGF0dHJpYnV0ZXMgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUKLSAgICAgIDxjb2RlPmZzaXplPC9jb2RlPiBjb21tYW5kLjwvZGQ+Ci0KLSAgICAgIDxkdD48c3Ryb25nPmluY2x1ZGU8L3N0cm9uZz48L2R0PgotCi0gICAgICA8ZGQ+Ci0gICAgICAgIFRoaXMgY29tbWFuZCBpbnNlcnRzIHRoZSB0ZXh0IG9mIGFub3RoZXIgZG9jdW1lbnQgb3IgZmlsZQotICAgICAgICBpbnRvIHRoZSBwYXJzZWQgZmlsZS4gQW55IGluY2x1ZGVkIGZpbGUgaXMgc3ViamVjdCB0byB0aGUKLSAgICAgICAgdXN1YWwgYWNjZXNzIGNvbnRyb2wuIElmIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUKLSAgICAgICAgcGFyc2VkIGZpbGUgaGFzIHRoZSA8YSBocmVmPSJjb3JlLmh0bWwjb3B0aW9ucyI+T3B0aW9uPC9hPgotICAgICAgICBJbmNsdWRlc05PRVhFQyBzZXQsIGFuZCB0aGUgaW5jbHVkaW5nIHRoZSBkb2N1bWVudCB3b3VsZAotICAgICAgICBjYXVzZSBhIHByb2dyYW0gdG8gYmUgZXhlY3V0ZWQsIHRoZW4gaXQgd2lsbCBub3QgYmUKLSAgICAgICAgaW5jbHVkZWQ7IHRoaXMgcHJldmVudHMgdGhlIGV4ZWN1dGlvbiBvZiBDR0kgc2NyaXB0cy4KLSAgICAgICAgT3RoZXJ3aXNlIENHSSBzY3JpcHRzIGFyZSBpbnZva2VkIGFzIG5vcm1hbCB1c2luZyB0aGUKLSAgICAgICAgY29tcGxldGUgVVJMIGdpdmVuIGluIHRoZSBjb21tYW5kLCBpbmNsdWRpbmcgYW55IHF1ZXJ5Ci0gICAgICAgIHN0cmluZy4gCi0KLSAgICAgICAgPHA+QW4gYXR0cmlidXRlIGRlZmluZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBkb2N1bWVudDsgdGhlCi0gICAgICAgIGluY2x1c2lvbiBpcyBkb25lIGZvciBlYWNoIGF0dHJpYnV0ZSBnaXZlbiB0byB0aGUgaW5jbHVkZQotICAgICAgICBjb21tYW5kLiBUaGUgdmFsaWQgYXR0cmlidXRlcyBhcmU6PC9wPgotCi0gICAgICAgIDxkbD4KLSAgICAgICAgICA8ZHQ+PHN0cm9uZz5maWxlPC9zdHJvbmc+PC9kdD4KLQotICAgICAgICAgIDxkZD5UaGUgdmFsdWUgaXMgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkKLSAgICAgICAgICBjb250YWluaW5nIHRoZSBjdXJyZW50IGRvY3VtZW50IGJlaW5nIHBhcnNlZC4gSXQgY2Fubm90Ci0gICAgICAgICAgY29udGFpbiA8Y29kZT4uLi88L2NvZGU+LCBub3IgY2FuIGl0IGJlIGFuIGFic29sdXRlIHBhdGguCi0gICAgICAgICAgVGhlcmVmb3JlLCB5b3UgY2Fubm90IGluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgb3V0c2lkZSBvZiB0aGUKLSAgICAgICAgICBkb2N1bWVudCByb290LCBvciBhYm92ZSB0aGUgY3VycmVudCBkb2N1bWVudCBpbiB0aGUgZGlyZWN0b3J5Ci0gICAgICAgICAgc3RydWN0dXJlLgotICAgICAgICAgIFRoZSA8Y29kZT52aXJ0dWFsPC9jb2RlPiBhdHRyaWJ1dGUgc2hvdWxkIGFsd2F5cyBiZSB1c2VkCi0gICAgICAgICAgaW4gcHJlZmVyZW5jZSB0byB0aGlzIG9uZS48L2RkPgotCi0gICAgICAgICAgPGR0PjxzdHJvbmc+PGEgbmFtZT0iaW5jbHVkZXZpcnR1YWwiPnZpcnR1YWw8L2E+PC9zdHJvbmc+PC9kdD4KLQotICAgICAgICAgPGRkPgotICAgICAgICAgIDxwPlRoZSB2YWx1ZSBpcyBhICglLWVuY29kZWQpIFVSTCByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgICBjdXJyZW50IGRvY3VtZW50IGJlaW5nIHBhcnNlZC4gVGhlIFVSTCBjYW5ub3QgY29udGFpbiBhCi0gICAgICAgICAgc2NoZW1lIG9yIGhvc3RuYW1lLCBvbmx5IGEgcGF0aCBhbmQgYW4gb3B0aW9uYWwgcXVlcnkKLSAgICAgICAgICBzdHJpbmcuIElmIGl0IGRvZXMgbm90IGJlZ2luIHdpdGggYSBzbGFzaCAoLykgdGhlbiBpdCBpcwotICAgICAgICAgIHRha2VuIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRvY3VtZW50LjwvcD4KLQotICAgICAgICAgIDxwPkEgVVJMIGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIGF0dHJpYnV0ZSwgYW5kIHRoZSBvdXRwdXQgdGhlCi0gICAgICAgIHNlcnZlciB3b3VsZCByZXR1cm4gaWYgdGhlIFVSTCB3ZXJlIGFjY2Vzc2VkIGJ5IHRoZSBjbGllbnQKLSAgICAgICAgaXMgaW5jbHVkZWQgaW4gdGhlIHBhcnNlZCBvdXRwdXQuIFRodXMgaW5jbHVkZWQgZmlsZXMgY2FuCi0gICAgICAgICAgIGJlIG5lc3RlZC48L3A+Ci0KLSAgICAgICAgICAgPHA+SWYgdGhlIHNwZWNpZmllZCBVUkwgaXMgYSBDR0kgcHJvZ3JhbSwgdGhlIHByb2dyYW0gd2lsbAotICAgICAgICAgICBiZSBleGVjdXRlZCBhbmQgaXRzIG91dHB1dCBpbnNlcnRlZCBpbiBwbGFjZSBvZiB0aGUgZGlyZWN0aXZlCi0gICAgICAgICAgIGluIHRoZSBwYXJzZWQgZmlsZS4gWW91IG1heSBpbmNsdWRlIGEgcXVlcnkgc3RyaW5nIGluIGEgQ0dJCi0gICAgICAgICAgIHVybDo8L3A+Ci0gICAgIAotICAgICA8Y29kZT4mbHQ7IS0tI2luY2x1ZGUgdmlydHVhbD0iL2NnaS1iaW4vZXhhbXBsZS5jZ2k/YXJndW1lbnQ9dmFsdWUiIC0tJmd0OzwvY29kZT4KLSAgICAgICAgICAgCi0gICAgICAgICAgIDxwPjxjb2RlPmluY2x1ZGUgdmlydHVhbDwvY29kZT4gc2hvdWxkIGJlIHVzZWQgaW4gcHJlZmVyZW5jZQotICAgICAgICAgICB0byA8Y29kZT5leGVjIGNnaTwvY29kZT4gdG8gaW5jbHVkZSB0aGUgb3V0cHV0IG9mIENHSQotICAgICAgICAgICBwcm9ncmFtcyBpbnRvIGFuIEhUTUwgZG9jdW1lbnQuPC9wPgotICAgICAgICAgIDwvZGQ+Ci0gICAgICAgIDwvZGw+Ci0gICAgICA8L2RkPgotCi0gICAgICA8ZHQ+PHN0cm9uZz5wcmludGVudjwvc3Ryb25nPjwvZHQ+Ci0KLSAgICAgIDxkZD4KLSAgICAgIDxwPlRoaXMgcHJpbnRzIG91dCBhIGxpc3Rpbmcgb2YgYWxsIGV4aXN0aW5nIHZhcmlhYmxlcyBhbmQKLSAgICAgIHRoZWlyIHZhbHVlcy4gU3RhcnRpbmcgd2l0aCBBcGFjaGUgMS4zLjEyLCBzcGVjaWFsIGNoYXJhY3RlcnMKLSAgICAgIGFyZSBlbnRpdHkgZW5jb2RlZCAoc2VlIHRoZSA8YQotICAgICAgaHJlZj0iI2VjaG8iPjxjb2RlPmVjaG88L2NvZGU+PC9hPiBlbGVtZW50IGZvciBkZXRhaWxzKQotICAgICAgYmVmb3JlIGJlaW5nIG91dHB1dC4gVGhlcmUgYXJlIG5vIGF0dHJpYnV0ZXMuPC9wPgotCi0gICAgICA8cD5Gb3IgZXhhbXBsZTo8L3A+Ci0KLSAgICAgIDxwPjxjb2RlPiZsdDshLS0jcHJpbnRlbnYgLS0mZ3Q7PC9jb2RlPjwvcD4KLQotICAgICAgPHA+VGhlIDxzdHJvbmc+cHJpbnRlbnY8L3N0cm9uZz4gZWxlbWVudCBpcyBhdmFpbGFibGUgb25seSBpbgotICAgICAgQXBhY2hlIDEuMiBhbmQgYWJvdmUuPC9wPgotICAgIDwvZGQ+Ci0gICAgICA8ZHQ+PHN0cm9uZz5zZXQ8L3N0cm9uZz48L2R0PgotCi0gICAgICA8ZGQ+Ci0gICAgICAgIFRoaXMgc2V0cyB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZS4gQXR0cmlidXRlczogCi0KLSAgICAgICAgPGRsPgotICAgICAgICAgIDxkdD48c3Ryb25nPnZhcjwvc3Ryb25nPjwvZHQ+Ci0KLSAgICAgICAgICA8ZGQ+VGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHNldC48L2RkPgotCi0gICAgICAgICAgPGR0PjxzdHJvbmc+dmFsdWU8L3N0cm9uZz48L2R0PgotCi0gICAgICAgICAgPGRkPlRoZSB2YWx1ZSB0byBnaXZlIGEgdmFyaWFibGUuPC9kZD4KLSAgICAgICAgPC9kbD4KLSAgICAgICAgPHA+Ci0gICAgICAgIEZvciBleGFtcGxlOiA8Y29kZT4mbHQ7IS0tI3NldCB2YXI9ImNhdGVnb3J5IiB2YWx1ZT0iaGVscCIKLSAgICAgICAgLS0mZ3Q7PC9jb2RlPjwvcD4KLQotICAgICAgPHA+VGhlIDxzdHJvbmc+c2V0PC9zdHJvbmc+IGVsZW1lbnQgaXMgYXZhaWxhYmxlIG9ubHkgaW4KLSAgICAgIEFwYWNoZSAxLjIgYW5kIGFib3ZlLjwvcD4KLSAgICAgIDwvZGQ+Ci0gICAgPC9kbD4KLTwvc2VjdGlvbj4KLQotPHNlY3Rpb24gaWQ9ImluY2x1ZGV2YXJzIj4KLSAgICA8dGl0bGU+SW5jbHVkZSBWYXJpYWJsZXM8L3RpdGxlPgotCi0gICAgSW4gYWRkaXRpb24gdG8gdGhlIHZhcmlhYmxlcyBpbiB0aGUgc3RhbmRhcmQgQ0dJIGVudmlyb25tZW50LAotICAgIHRoZXNlIGFyZSBhdmFpbGFibGUgZm9yIHRoZSA8Y29kZT5lY2hvPC9jb2RlPiBjb21tYW5kLCBmb3IKLSAgICA8Y29kZT5pZjwvY29kZT4gYW5kIDxjb2RlPmVsaWY8L2NvZGU+LCBhbmQgdG8gYW55IHByb2dyYW0KLSAgICBpbnZva2VkIGJ5IHRoZSBkb2N1bWVudC4gCi0KLSAgICA8ZGw+Ci0gICAgICA8ZHQ+REFURV9HTVQ8L2R0PgotCi0gICAgICA8ZGQ+VGhlIGN1cnJlbnQgZGF0ZSBpbiBHcmVlbndpY2ggTWVhbiBUaW1lLjwvZGQ+Ci0KLSAgICAgIDxkdD5EQVRFX0xPQ0FMPC9kdD4KLQotICAgICAgPGRkPlRoZSBjdXJyZW50IGRhdGUgaW4gdGhlIGxvY2FsIHRpbWUgem9uZS48L2RkPgotCi0gICAgICA8ZHQ+RE9DVU1FTlRfTkFNRTwvZHQ+Ci0KLSAgICAgIDxkZD5UaGUgZmlsZW5hbWUgKGV4Y2x1ZGluZyBkaXJlY3Rvcmllcykgb2YgdGhlIGRvY3VtZW50Ci0gICAgICByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIuPC9kZD4KLQotICAgICAgPGR0PkRPQ1VNRU5UX1VSSTwvZHQ+Ci0KLSAgICAgIDxkZD5UaGUgKCUtZGVjb2RlZCkgVVJMIHBhdGggb2YgdGhlIGRvY3VtZW50IHJlcXVlc3RlZCBieSB0aGUKLSAgICAgIHVzZXIuIE5vdGUgdGhhdCBpbiB0aGUgY2FzZSBvZiBuZXN0ZWQgaW5jbHVkZSBmaWxlcywgdGhpcyBpcwotICAgICAgPGVtPm5vdDwvZW0+IHRoZW4gVVJMIGZvciB0aGUgY3VycmVudCBkb2N1bWVudC48L2RkPgotCi0gICAgICA8ZHQ+TEFTVF9NT0RJRklFRDwvZHQ+Ci0KLSAgICAgIDxkZD5UaGUgbGFzdCBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGUgZG9jdW1lbnQgcmVxdWVzdGVkIGJ5Ci0gICAgICB0aGUgdXNlci48L2RkPgotICAgIDwvZGw+Ci08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uPgotICAgIDx0aXRsZT5WYXJpYWJsZSBTdWJzdGl0dXRpb248L3RpdGxlPgotCi0gICAgPHA+VmFyaWFibGUgc3Vic3RpdHV0aW9uIGlzIGRvbmUgd2l0aGluIHF1b3RlZCBzdHJpbmdzIGluIG1vc3QKLSAgICBjYXNlcyB3aGVyZSB0aGV5IG1heSByZWFzb25hYmx5IG9jY3VyIGFzIGFuIGFyZ3VtZW50IHRvIGFuIFNTSQotICAgIGRpcmVjdGl2ZS4gVGhpcyBpbmNsdWRlcyB0aGUgPHNhbXA+Y29uZmlnPC9zYW1wPiwKLSAgICA8c2FtcD5leGVjPC9zYW1wPiwgPHNhbXA+Zmxhc3Rtb2Q8L3NhbXA+LCA8c2FtcD5mc2l6ZTwvc2FtcD4sCi0gICAgPHNhbXA+aW5jbHVkZTwvc2FtcD4sIGFuZCA8c2FtcD5zZXQ8L3NhbXA+IGRpcmVjdGl2ZXMsIGFzIHdlbGwKLSAgICBhcyB0aGUgYXJndW1lbnRzIHRvIGNvbmRpdGlvbmFsIG9wZXJhdG9ycy4gWW91IGNhbiBpbnNlcnQgYQotICAgIGxpdGVyYWwgZG9sbGFyIHNpZ24gaW50byB0aGUgc3RyaW5nIHVzaW5nIGJhY2tzbGFzaAotICAgIHF1b3Rpbmc6PC9wPgotPHByZT4KLSAgICAmbHQ7IS0tI2lmIGV4cHI9IiRhID0gXCR0ZXN0IiAtLSZndDsKLTwvcHJlPgotCi0gICAgPHA+SWYgYSB2YXJpYWJsZSByZWZlcmVuY2UgbmVlZHMgdG8gYmUgc3Vic3RpdHV0ZWQgaW4gdGhlCi0gICAgbWlkZGxlIG9mIGEgY2hhcmFjdGVyIHNlcXVlbmNlIHRoYXQgbWlnaHQgb3RoZXJ3aXNlIGJlCi0gICAgY29uc2lkZXJlZCBhIHZhbGlkIGlkZW50aWZpZXIgaW4gaXRzIG93biByaWdodCwgaXQgY2FuIGJlCi0gICAgZGlzYW1iaWd1YXRlZCBieSBlbmNsb3NpbmcgdGhlIHJlZmVyZW5jZSBpbiBicmFjZXMsCi0gICAgPGVtPmEgbGE8L2VtPiBzaGVsbCBzdWJzdGl0dXRpb246PC9wPgotPHByZT4KLSAgICAmbHQ7IS0tI3NldCB2YXI9IlplZCIgdmFsdWU9IiR7UkVNT1RFX0hPU1R9XyR7UkVRVUVTVF9NRVRIT0R9IiAtLSZndDsKLTwvcHJlPgotCi0gICAgPHA+VGhpcyB3aWxsIHJlc3VsdCBpbiB0aGUgPHNhbXA+WmVkPC9zYW1wPiB2YXJpYWJsZSBiZWluZyBzZXQKLSAgICB0byAiPHNhbXA+WF9ZPC9zYW1wPiIgaWYgPHNhbXA+UkVNT1RFX0hPU1Q8L3NhbXA+IGlzCi0gICAgIjxzYW1wPlg8L3NhbXA+IiBhbmQgPHNhbXA+UkVRVUVTVF9NRVRIT0Q8L3NhbXA+IGlzCi0gICAgIjxzYW1wPlk8L3NhbXA+Ii48L3A+Ci0KLSAgICA8cD5FWEFNUExFOiB0aGUgYmVsb3cgZXhhbXBsZSB3aWxsIHByaW50ICJpbiBmb28iIGlmIHRoZQotICAgIERPQ1VNRU5UX1VSSSBpcyAvZm9vL2ZpbGUuaHRtbCwgImluIGJhciIgaWYgaXQgaXMKLSAgICAvYmFyL2ZpbGUuaHRtbCBhbmQgImluIG5laXRoZXIiIG90aGVyd2lzZTo8L3A+Ci08cHJlPgotICAgICZsdDshLS0jaWYgZXhwcj0iXCIkRE9DVU1FTlRfVVJJXCIgPSBcIi9mb28vZmlsZS5odG1sXCIiIC0tJmd0OwotICAgIGluIGZvbwotICAgICZsdDshLS0jZWxpZiBleHByPSJcIiRET0NVTUVOVF9VUklcIiA9IFwiL2Jhci9maWxlLmh0bWxcIiIgLS0mZ3Q7Ci0gICAgaW4gYmFyCi0gICAgJmx0OyEtLSNlbHNlIC0tJmd0OwotICAgIGluIG5laXRoZXIKLSAgICAmbHQ7IS0tI2VuZGlmIC0tJmd0OwotPC9wcmU+Ci08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uPgotICAgIDx0aXRsZSBpZD0iZmxvd2N0cmwiPkZsb3cgQ29udHJvbCBFbGVtZW50czwvdGl0bGU+Ci0KLSAgICBUaGVzZSBhcmUgYXZhaWxhYmxlIGluIEFwYWNoZSAxLjIgYW5kIGFib3ZlLiBUaGUgYmFzaWMgZmxvdwotICAgIGNvbnRyb2wgZWxlbWVudHMgYXJlOiAKLTxwcmU+Ci0gICAgJmx0OyEtLSNpZiBleHByPSI8ZW0+dGVzdF9jb25kaXRpb248L2VtPiIgLS0mZ3Q7Ci0gICAgJmx0OyEtLSNlbGlmIGV4cHI9IjxlbT50ZXN0X2NvbmRpdGlvbjwvZW0+IiAtLSZndDsKLSAgICAmbHQ7IS0tI2Vsc2UgLS0mZ3Q7Ci0gICAgJmx0OyEtLSNlbmRpZiAtLSZndDsKLTwvcHJlPgotCi0gICAgPHA+VGhlIDxzdHJvbmc+PGNvZGU+aWY8L2NvZGU+PC9zdHJvbmc+IGVsZW1lbnQgd29ya3MgbGlrZSBhbgotICAgIGlmIHN0YXRlbWVudCBpbiBhIHByb2dyYW1taW5nIGxhbmd1YWdlLiBUaGUgdGVzdCBjb25kaXRpb24gaXMKLSAgICBldmFsdWF0ZWQgYW5kIGlmIHRoZSByZXN1bHQgaXMgdHJ1ZSwgdGhlbiB0aGUgdGV4dCB1bnRpbCB0aGUKLSAgICBuZXh0IDxzdHJvbmc+PGNvZGU+ZWxpZjwvY29kZT48L3N0cm9uZz4sCi0gICAgPHN0cm9uZz48Y29kZT5lbHNlPC9jb2RlPjwvc3Ryb25nPi4gb3IKLSAgICA8c3Ryb25nPjxjb2RlPmVuZGlmPC9jb2RlPjwvc3Ryb25nPiBlbGVtZW50IGlzIGluY2x1ZGVkIGluIHRoZQotICAgIG91dHB1dCBzdHJlYW0uPC9wPgotCi0gICAgPHA+VGhlIDxzdHJvbmc+PGNvZGU+ZWxpZjwvY29kZT48L3N0cm9uZz4gb3IKLSAgICA8c3Ryb25nPjxjb2RlPmVsc2U8L2NvZGU+PC9zdHJvbmc+IHN0YXRlbWVudHMgYXJlIGJlIHVzZWQgdGhlCi0gICAgcHV0IHRleHQgaW50byB0aGUgb3V0cHV0IHN0cmVhbSBpZiB0aGUgb3JpZ2luYWwgdGVzdF9jb25kaXRpb24KLSAgICB3YXMgZmFsc2UuIFRoZXNlIGVsZW1lbnRzIGFyZSBvcHRpb25hbC48L3A+Ci0KLSAgICA8cD5UaGUgPHN0cm9uZz48Y29kZT5lbmRpZjwvY29kZT48L3N0cm9uZz4gZWxlbWVudCBlbmRzIHRoZQotICAgIDxzdHJvbmc+PGNvZGU+aWY8L2NvZGU+PC9zdHJvbmc+IGVsZW1lbnQgYW5kIGlzIHJlcXVpcmVkLjwvcD4KLQotICAgIDxwPjxlbT50ZXN0X2NvbmRpdGlvbjwvZW0+IGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOjwvcD4KLQotICAgIDxkbD4KLSAgICAgIDxkdD48ZW0+c3RyaW5nPC9lbT48L2R0PgotCi0gICAgICA8ZGQ+dHJ1ZSBpZiA8ZW0+c3RyaW5nPC9lbT4gaXMgbm90IGVtcHR5PC9kZD4KLQotICAgICAgPGR0PjxlbT5zdHJpbmcxPC9lbT4gPSA8ZW0+c3RyaW5nMjwvZW0+PGJyIC8+Ci0gICAgICAgPGVtPnN0cmluZzE8L2VtPiAhPSA8ZW0+c3RyaW5nMjwvZW0+PGJyIC8+Ci0gICAgICAgPGVtPnN0cmluZzE8L2VtPiAmbHQ7IDxlbT5zdHJpbmcyPC9lbT48YnIgLz4KLSAgICAgICA8ZW0+c3RyaW5nMTwvZW0+ICZsdDs9IDxlbT5zdHJpbmcyPC9lbT48YnIgLz4KLSAgICAgICA8ZW0+c3RyaW5nMTwvZW0+ICZndDsgPGVtPnN0cmluZzI8L2VtPjxiciAvPgotICAgICAgIDxlbT5zdHJpbmcxPC9lbT4gJmd0Oz0gPGVtPnN0cmluZzI8L2VtPjwvZHQ+Ci0KLSAgICAgIDxkZD5Db21wYXJlIHN0cmluZzEgd2l0aCBzdHJpbmcgMi4gSWYgc3RyaW5nMiBoYXMgdGhlIGZvcm0KLSAgICAgIDxlbT4vc3RyaW5nLzwvZW0+IHRoZW4gaXQgaXMgY29tcGFyZWQgYXMgYSByZWd1bGFyCi0gICAgICBleHByZXNzaW9uLiBSZWd1bGFyIGV4cHJlc3Npb25zIGhhdmUgdGhlIHNhbWUgc3ludGF4IGFzIHRob3NlCi0gICAgICBmb3VuZCBpbiB0aGUgVW5peCA8c2FtcD5lZ3JlcDwvc2FtcD4gY29tbWFuZC48L2RkPgotCi0gICAgICA8ZHQ+KCA8ZW0+dGVzdF9jb25kaXRpb248L2VtPiApPC9kdD4KLQotICAgICAgPGRkPnRydWUgaWYgPGVtPnRlc3RfY29uZGl0aW9uPC9lbT4gaXMgdHJ1ZTwvZGQ+Ci0KLSAgICAgIDxkdD4hIDxlbT50ZXN0X2NvbmRpdGlvbjwvZW0+PC9kdD4KLQotICAgICAgPGRkPnRydWUgaWYgPGVtPnRlc3RfY29uZGl0aW9uPC9lbT4gaXMgZmFsc2U8L2RkPgotCi0gICAgICA8ZHQ+PGVtPnRlc3RfY29uZGl0aW9uMTwvZW0+ICZhbXA7JmFtcDsKLSAgICAgIDxlbT50ZXN0X2NvbmRpdGlvbjI8L2VtPjwvZHQ+Ci0KLSAgICAgIDxkZD50cnVlIGlmIGJvdGggPGVtPnRlc3RfY29uZGl0aW9uMTwvZW0+IGFuZAotICAgICAgPGVtPnRlc3RfY29uZGl0aW9uMjwvZW0+IGFyZSB0cnVlPC9kZD4KLQotICAgICAgPGR0PjxlbT50ZXN0X2NvbmRpdGlvbjE8L2VtPiB8fCA8ZW0+dGVzdF9jb25kaXRpb24yPC9lbT48L2R0PgotCi0gICAgICA8ZGQ+dHJ1ZSBpZiBlaXRoZXIgPGVtPnRlc3RfY29uZGl0aW9uMTwvZW0+IG9yCi0gICAgICA8ZW0+dGVzdF9jb25kaXRpb24yPC9lbT4gaXMgdHJ1ZTwvZGQ+Ci0gICAgPC9kbD4KLQotICAgIDxwPiI8ZW0+PTwvZW0+IiBhbmQgIjxlbT4hPTwvZW0+IiBiaW5kIG1vcmUgdGlnaHRseSB0aGFuCi0gICAgIjxlbT4mYW1wOyZhbXA7PC9lbT4iIGFuZCAiPGVtPnx8PC9lbT4iLiAiPGVtPiE8L2VtPiIgYmluZHMKLSAgICBtb3N0IHRpZ2h0bHkuIFRodXMsIHRoZSBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6PC9wPgotPHByZT4KLSAgICAmbHQ7IS0tI2lmIGV4cHI9IiRhID0gdGVzdDEgJmFtcDsmYW1wOyAkYiA9IHRlc3QyIiAtLSZndDsKLSAgICAmbHQ7IS0tI2lmIGV4cHI9IigkYSA9IHRlc3QxKSAmYW1wOyZhbXA7ICgkYiA9IHRlc3QyKSIgLS0mZ3Q7Ci08L3ByZT4KLQotICAgIDxwPkFueXRoaW5nIHRoYXQncyBub3QgcmVjb2duaXplZCBhcyBhIHZhcmlhYmxlIG9yIGFuIG9wZXJhdG9yCi0gICAgaXMgdHJlYXRlZCBhcyBhIHN0cmluZy4gU3RyaW5ncyBjYW4gYWxzbyBiZSBxdW90ZWQ6Ci0gICAgPGVtPidzdHJpbmcnPC9lbT4uIFVucXVvdGVkIHN0cmluZ3MgY2FuJ3QgY29udGFpbiB3aGl0ZXNwYWNlCi0gICAgKGJsYW5rcyBhbmQgdGFicykgYmVjYXVzZSBpdCBpcyB1c2VkIHRvIHNlcGFyYXRlIHRva2VucyBzdWNoIGFzCi0gICAgdmFyaWFibGVzLiBJZiBtdWx0aXBsZSBzdHJpbmdzIGFyZSBmb3VuZCBpbiBhIHJvdywgdGhleSBhcmUKLSAgICBjb25jYXRlbmF0ZWQgdXNpbmcgYmxhbmtzLiBTbyw8L3A+Ci08cHJlPgotICAgICA8ZW0+c3RyaW5nMSAgICBzdHJpbmcyPC9lbT4gIHJlc3VsdHMgaW4gPGVtPnN0cmluZzEgc3RyaW5nMjwvZW0+Ci0gICAgPGVtPidzdHJpbmcxICAgIHN0cmluZzInPC9lbT4gcmVzdWx0cyBpbiA8ZW0+c3RyaW5nMSAgICBzdHJpbmcyPC9lbT4KLTwvcHJlPgotCi08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uPgotICAgIDx0aXRsZT5Vc2luZyBTZXJ2ZXIgU2lkZSBJbmNsdWRlcyBmb3IgRXJyb3JEb2N1bWVudHM8L3RpdGxlPgotCi0gICAgVGhlcmUgaXMgPGEgaHJlZj0iLi4vbWlzYy9jdXN0b21fZXJyb3Jkb2NzLmh0bWwiPmEgZG9jdW1lbnQ8L2E+Ci0gICAgd2hpY2ggZGVzY3JpYmVzIGhvdyB0byB1c2UgdGhlIGZlYXR1cmVzIG9mIG1vZF9pbmNsdWRlIHRvIG9mZmVyCi0gICAgaW50ZXJuYXRpb25hbGl6ZWQgY3VzdG9taXplZCBzZXJ2ZXIgZXJyb3IgZG9jdW1lbnRzLiAKLQotICAgIDxoMj5QQVRIX0lORk8gd2l0aCBTZXJ2ZXIgU2lkZSBJbmNsdWRlczwvaDI+Ci0KLSAgICA8cD5GaWxlcyBwcm9jZXNzZWQgZm9yIHNlcnZlci1zaWRlIGluY2x1ZGVzIG5vIGxvbmdlciBhY2NlcHQKLSAgICByZXF1ZXN0cyB3aXRoIFBBVEhfSU5GTyAodHJhaWxpbmcgcGF0aG5hbWUgaW5mb3JtYXRpb24pIGJ5Ci0gICAgZGVmYXVsdC4gIFlvdSBjYW4gdXNlIHRoZSA8YQotICAgIGhyZWY9ImNvcmUuaHRtbCNBY2NlcHRQYXRoSW5mbyI+QWNjZXB0UGF0aEluZm88L2E+IGRpcmVjdGl2ZSB0bwotICAgIGNvbmZpZ3VyZSB0aGUgc2VydmVyIHRvIGFjY2VwdCByZXF1ZXN0cyB3aXRoIFBBVEhfSU5GTy48L3A+Ci0KLTwvc2VjdGlvbj4KLQotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5TU0lFbmRUYWc8L25hbWU+Ci08ZGVzY3JpcHRpb24+Q2hhbmdlcyB0aGUgc3RyaW5nIHRoYXQgbW9kX2luY2x1ZGUgbG9va3MgZm9yIHRvIGVuZCBhbgotaW5jbHVkZSBjb21tYW5kLjwvZGVzY3JpcHRpb24+Ci08c3ludGF4PlNTSUVuZFRhZyA8ZW0+dGFnPC9lbT48L3N5bnRheD4KLTxkZWZhdWx0PlNTSUVuZFRhZyAmcXVvdDstLSZndDsmcXVvdDs8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPkZpbGVJbmZvPC9vdmVycmlkZT4KLTxjb21wYXRpYmlsaXR5PkFwYWNoZSAxLjIgYW5kIEF2YWlsYWJsZSBpbiB2ZXJzaW9uIDIuMC4zMCBhbmQgbGF0ZXIuCi08L2NvbXBhdGliaWxpdHk+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGlzIGRpcmVjdGl2ZSBjaGFuZ2VzIHRoZSBzdHJpbmcgdGhhdCBtb2RfaW5jbHVkZSBsb29rcyBmb3IgCi0gICAgdG8gbWFyayB0aGUgZW5kIG9mIGEgaW5jbHVkZSBjb21tYW5kLjwvcD4KLQotICAgIDxzZWVhbHNvPlNlZSBhbHNvOiA8ZGlyZWN0aXZlPlNTSVN0YXJ0VGFnPC9kaXJlY3RpdmU+Ljwvc2VlYWxzbz4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5TU0lFcnJvck1zZzwvbmFtZT4KLTxkZXNjcmlwdGlvbj5DaGFuZ2VzIHRoZSBlcnJvciBtZXNzYWdlIGRpc3BsYXllZCB3aGVuIHRoZXJlIGlzIGFuIGVycm9yPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+U1NJRXJyb3JNc2cgPGVtPm1lc3NhZ2U8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+U1NJRXJyb3JNc2cgCi0mcXVvdDtbYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGlzIGRpcmVjdGl2ZV0mcXVvdDs8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+Ci08Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PgotPGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0PgotPGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT48L292ZXJyaWRlPgotPGNvbXBhdGliaWxpdHk+QXZhaWxhYmxlIGluIHZlcnNpb24gMi4wLjMwIGFuZCBsYXRlci48L2NvbXBhdGliaWxpdHk+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgU1NJRXJyb3JNc2cgZGlyZWN0aXZlIGNoYW5nZXMgdGhlIGVycm9yIG1lc3NhZ2UgZGlzcGxheWVkCi0gICAgd2hlbiBtb2RfaW5jbHVkZSBlbmNvdW50ZXJzIGFuIGVycm9yLiBGb3IgcHJvZHVjdGlvbiBzZXJ2ZXJzIHlvdQotICAgIG1heSBjb25zaWRlciBjaGFuZ2luZyB0aGUgZGVmYXVsdCBlcnJvciBtZXNzYWdlIHRvCi0gICAgPGNvZGU+JnF1b3Q7Jmx0Oy0tIEVycm9yIC0tJmd0OyZxdW90OzwvY29kZT4gc28gdGhhdCB0aGUgbWVzc2FnZQotICAgIGlzIG5vdCBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuCi0gICAgPC9wPgotICAgIDxwPlRoaXMgZGlyZWN0aXZlIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgdGhlIDxjb2RlPiZsdDstLSNjb25maWcKLSAgICBlcnJtc2c9PGVtPm1lc3NhZ2U8L2VtPiAtLSZndDs8L2NvZGU+IGVsZW1lbnQuPC9wPgotCi08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U1NJU3RhcnRUYWc8L25hbWU+Ci08ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+Q2hhbmdlcyB0aGUgc3RyaW5nIHRoYXQgbW9kX2luY2x1ZGUgbG9va3MgZm9yIHRvIHN0YXJ0IGFuCi1pbmNsdWRlIGVsZW1lbnQ8L3N5bnRheD4KLTxkZWZhdWx0PlNTSVN0YXJ0VGFnICZxdW90OyZsdDstLSEmcXVvdDs8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+Ci08Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PgotPGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT48L292ZXJyaWRlPgotPGNvbXBhdGliaWxpdHk+QXZhaWxhYmxlIGluIHZlcnNpb24gMi4wLjMwIGFuZCBsYXRlci48L2NvbXBhdGliaWxpdHk+Ci0KLTx1c2FnZT4KLQotICAgIDxwPlRoaXMgZGlyZWN0aXZlIGNoYW5nZXMgdGhlIHN0cmluZyB0aGF0IG1vZF9pbmNsdWRlIGxvb2tzIGZvciAKLSAgICB0byBtYXJrIGFuIGluY2x1ZGUgZWxlbWVudCB0byBwcm9jZXNzLjwvcD4KLQotICAgIDxwPllvdSBtYXkgd2FudCB0byB1c2UgdGhpcyBvcHRpb24gaWYgaGF2ZSAyIHNlcnZlcnMgcGFyc2luZyB0aGUKLSAgICBvdXRwdXQgb2YgYSBmaWxlIGVhY2ggcHJvY2Vzc2luZyBkaWZmZXJlbnQgY29tbWFuZHMgKHBvc3NpYmx5IGF0Ci0gICAgZGlmZmVyZW50IHRpbWVzKS48L3A+IAotCi0gICAgPHNlZWFsc28+U2VlIGFsc286IDxkaXJlY3RpdmU+U1NJRW5kVGFnPC9kaXJlY3RpdmU+PC9zZWVhbHNvPgotCi08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U1NJVGltZUZvcm1hdDwvbmFtZT4KLTxkZXNjcmlwdGlvbj5Db25maWd1cmVzIHRoZSBmb3JtYXQgaW4gd2hpY2ggZGF0ZSBzdHJpbmdzIGFyZSAKLWRpc3BsYXllZDwvZGVzY3JpcHRpb24+Ci08c3ludGF4PlNTSVRpbWVGb3JtYXQgPGVtPmZvcm1hdHN0cmluZzwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5TU0lUaW1lRm9ybWF0ICZxdW90OyVBLCAlZC0lYi0lWSAlSDolTTolUyAlWiZxdW90OzwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD4KLTxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+Ci08Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+Ci08Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPjwvb3ZlcnJpZGU+Ci08Y29tcGF0aWJpbGl0eT5BdmFpbGFibGUgaW4gdmVyc2lvbiAyLjAuMzAgYW5kIGxhdGVyLjwvY29tcGF0aWJpbGl0eT4KLQotPHVzYWdlPgotPHA+VGhpcyBkaXJlY3RpdmUgY2hhbmdlcyB0aGUgZm9ybWF0IGluIHdoaWNoIGRhdGUgc3RyaW5ncyBhcmUgZGlzcGxheWVkIAotICAgIHdoZW4gZWNob2luZyBEQVRFIGVudmlyb25tZW50IHZhcmlhYmxlcy4gIFRoZSA8ZW0+Zm9ybWF0c3RyaW5nPC9lbT4KLSAgICBpcyBhcyBpbiBzdHJmdGltZSgzKSBmcm9tIHRoZSBDIHN0YW5kYXJkIGxpYnJhcnkuPC9wPgotCi0gICAgPHA+VGhpcyBkaXJlY3RpdmUgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyB0aGUgPGNvZGU+Jmx0Oy0tI2NvbmZpZwotICAgIHRpbWVmbXQ9PGVtPmZvcm1hdHN0cmluZzwvZW0+IC0tJmd0OzwvY29kZT4gZWxlbWVudC48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+WEJpdEhhY2s8L25hbWU+Ci08c3ludGF4PlhCaXRIYWNrIG9ufG9mZnxmdWxsPC9zeW50YXg+Ci08ZGVmYXVsdD5YQml0SGFjayBvZmY8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+Ci08Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PgotPGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0PgotPGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT5PcHRpb25zPC9vdmVycmlkZT4KLTxjb21wYXRpYmlsaXR5PjwvY29tcGF0aWJpbGl0eT4KLTxkZXNjcmlwdGlvbj5QYXJzZSBTU0kgZGlyZWN0aXZlcyBpbiBmaWxlcyB3aXRoIHRoZSBleGVjdXRlIAotYml0IHNldDwvZGVzY3JpcHRpb24+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgWEJpdEhhY2sgZGlyZWN0aXZlcyBjb250cm9scyB0aGUgcGFyc2luZyBvZiBvcmRpbmFyeQotICAgIGh0bWwgZG9jdW1lbnRzLiBUaGlzIGRpcmVjdGl2ZSBvbmx5IGFmZmVjdHMgZmlsZXMgYXNzb2NpYXRlZAotICAgIHdpdGggdGhlIE1JTUUgdHlwZSA8Y29kZT50ZXh0L2h0bWw8L2NvZGU+LiBYQml0SGFjayBjYW4gdGFrZSBvbgotICAgIHRoZSBmb2xsb3dpbmcgdmFsdWVzOjwvcD4KLQotICAgIDxkbD4KLSAgICAgIDxkdD5vZmY8L2R0PgotCi0gICAgICA8ZGQ+Tm8gc3BlY2lhbCB0cmVhdG1lbnQgb2YgZXhlY3V0YWJsZSBmaWxlcy48L2RkPgotCi0gICAgICA8ZHQ+b248L2R0PgotCi0gICAgICA8ZGQ+QW55IHRleHQvaHRtbCBmaWxlIHRoYXQgaGFzIHRoZSB1c2VyLWV4ZWN1dGUgYml0IHNldCB3aWxsIAotICAgICAgYmUgdHJlYXRlZCBhcyBhIHNlcnZlci1wYXJzZWQgaHRtbCBkb2N1bWVudC48L2RkPgotCi0gICAgICA8ZHQ+ZnVsbDwvZHQ+Ci0KLSAgICAgIDxkZD4KLSAgICAgICAgQXMgZm9yIDxjb2RlPm9uPC9jb2RlPiBidXQgYWxzbyB0ZXN0IHRoZSBncm91cC1leGVjdXRlIGJpdC4KLSAgICAgICAgSWYgaXQgaXMgc2V0LCB0aGVuIHNldCB0aGUgTGFzdC1tb2RpZmllZCBkYXRlIG9mIHRoZQotICAgICAgICByZXR1cm5lZCBmaWxlIHRvIGJlIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgb2YgdGhlIGZpbGUuIElmCi0gICAgICAgIGl0IGlzIG5vdCBzZXQsIHRoZW4gbm8gbGFzdC1tb2RpZmllZCBkYXRlIGlzIHNlbnQuIFNldHRpbmcKLSAgICAgICAgdGhpcyBiaXQgYWxsb3dzIGNsaWVudHMgYW5kIHByb3hpZXMgdG8gY2FjaGUgdGhlIHJlc3VsdCBvZgotICAgICAgICB0aGUgcmVxdWVzdC4gCi0KLSAgICAgICAgPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiB5b3Ugd291bGQgbm90IHdhbnQgdG8gdXNlIHRoZSBmdWxsCi0gICAgICAgIG9wdGlvbiwgdW5sZXNzIHlvdSBhc3N1cmUgdGhlIGdyb3VwLWV4ZWN1dGUgYml0IGlzIHVuc2V0IGZvcgotICAgICAgICBldmVyeSBTU0kgc2NyaXB0IHdoaWNoIG1pZ2h0IDxjb2RlPiNpbmNsdWRlPC9jb2RlPiBhIENHSSAKLSAgICAgICAgb3Igb3RoZXJ3aXNlIHByb2R1Y2VzIGRpZmZlcmVudCBvdXRwdXQgb24gZWFjaCBoaXQgKG9yIGNvdWxkIAotICAgICAgICBwb3RlbnRpYWxseSBjaGFuZ2Ugb24gc3Vic2VxdWVudCByZXF1ZXN0cykuPC9wPgotICAgICAgPC9kZD4KLSAgICA8L2RsPgotCi0gICAgPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTwvbW9kdWxlc3lub3BzaXM+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfaW5mby5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9pbmZvLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNjFmNWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9pbmZvLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDIuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BcGFjaGUgbW9kdWxlIG1vZF9pbmZvPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9zdWIuZ2lmIiBBTFQ9IiI+Ci08aDE+TW9kdWxlIG1vZF9pbmZvPC9oMT4KLQotVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5tb2RfaW5mby5jPC9jb2RlPiBmaWxlLiAgSXQKLXByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSBvdmVydmlldyBvZiB0aGUgY3VycmVudCBzZXJ2ZXIgY29uZmlndXJhdGlvbgotaW5jbHVkaW5nIGFsbCBpbnN0YWxsZWQgbW9kdWxlcy4gIFRoaXMgbW9kdWxlIGlzIG5vdCBjb21waWxlZCBpbnRvIHRoZQotc2VydmVyIGJ5IGRlZmF1bHQuICBJdCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUgMS4xIGFuZCBsYXRlci4gVG8KLWVuYWJsZSBpdCwgYWRkIHRoZSBmb2xsb3dpbmcgbGluZSB0byB0aGUgc2VydmVyIGJ1aWxkIENvbmZpZ3VyYXRpb24KLWZpbGUsIGFuZCByZWJ1aWxkIHRoZSBzZXJ2ZXI6Ci0KLTxQUkU+Ci1Nb2R1bGUgaW5mb19tb2R1bGUgICBtb2RfaW5mby5vCi08L1BSRT4KLQotPEhSPgotPFA+Ci1UbyBjb25maWd1cmUgaXQsIGFkZCB0aGUgZm9sbG93aW5nIHRvIHlvdXIgPGNvZGU+YWNjZXNzLmNvbmY8L2NvZGU+IGZpbGUuCi0KLTxQUkU+Ci0mbHQ7TG9jYXRpb24gL3NlcnZlci1pbmZvJmd0OwotU2V0SGFuZGxlciBzZXJ2ZXItaW5mbwotJmx0Oy9Mb2NhdGlvbiZndDsKLTwvUFJFPgotCi1Zb3UgbWF5IHdpc2ggdG8gYWRkIGEgbGltaXQgY2xhdXNlIGluc2lkZSB0aGUgbG9jYXRpb24gZGlyZWN0aXZlIHRvIGxpbWl0Ci1hY2Nlc3MgdG8geW91ciBzZXJ2ZXIgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi48cD4KLU9uY2UgY29uZmlndXJlZCwgdGhlIHNlcnZlciBpbmZvcm1hdGlvbiBpcyBvYnRhaW5lZCBieSBhY2Nlc3NpbmcKLTx0dD5odHRwOi8veW91ci5ob3N0LmRvbS9zZXJ2ZXItaW5mbzwvdHQ+PHA+Ci0KLTwhLS0laHlwZXJ0ZXh0IC0tPgotPGhyPgotPEEgSFJFRj0iLi4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9ob21lLmdpZiIgQUxUPSJIb21lIj48L0E+Ci08QSBIUkVGPSIuLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfaW5kZXguZ2lmIiBBTFQ9IkluZGV4Ij48L0E+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KLTwhLS0vJWh5cGVydGV4dCAtLT4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfaW5mby54bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2luZm8ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDg2YTg5Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfaW5mby54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9Ii4uL3N0eWxlL21hbnVhbC54c2wiPz4KLTxtb2R1bGVzeW5vcHNpcz4KLQotPG5hbWU+bW9kX2luZm88L25hbWU+Ci08c3RhdHVzPkV4dGVuc2lvbjwvc3RhdHVzPgotPGRlc2NyaXB0aW9uPlRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSBvdmVydmlldyBvZiB0aGUgc2VydmVyCi1jb25maWd1cmF0aW9uIGluY2x1ZGluZyBhbGwgaW5zdGFsbGVkIG1vZHVsZXMgYW5kIGRpcmVjdGl2ZXMgaW4gdGhlCi1jb25maWd1cmF0aW9uIGZpbGVzLjwvZGVzY3JpcHRpb24+Ci08aWRlbnRpZmllcj5pbmZvX21vZHVsZTwvaWRlbnRpZmllcj4KLTxzb3VyY2VmaWxlPm1vZF9pbmZvLmM8L3NvdXJjZWZpbGU+Ci08Y29tcGF0aWJpbGl0eT5BdmFpbGFibGUgaW4gQXBhY2hlIDEuMSBhbmQgbGF0ZXI8L2NvbXBhdGliaWxpdHk+Ci0KLQotPHN1bW1hcnk+Ci0KLSAgICA8aDI+VXNpbmcgbW9kX2luZm88L2gyPgotCi0gICAgPHA+VG8gY29uZmlndXJlIGl0LCBhZGQgdGhlIGZvbGxvd2luZyB0byB5b3VyCi0gICAgPGNvZGU+aHR0cGQuY29uZjwvY29kZT4gZmlsZS48L3A+Ci0KLTxleGFtcGxlPgotJmx0O0xvY2F0aW9uIC9zZXJ2ZXItaW5mbyZndDs8YnIgLz4KLVNldEhhbmRsZXIgc2VydmVyLWluZm88YnIgLz4KLSZsdDsvTG9jYXRpb24mZ3Q7PGJyIC8+Ci08L2V4YW1wbGU+Ci0KLSAgICBZb3UgbWF5IHdpc2ggdG8gYWRkIGEgCi0gICAgPGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiPiZsdDtMaW1pdCZndDs8L2RpcmVjdGl2ZT4gCi0gICAgY2xhdXNlIGluc2lkZSB0aGUgCi0gICAgPGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiPiZsdDtsb2NhdGlvbiZndDs8L2RpcmVjdGl2ZT4KLSAgICBkaXJlY3RpdmUgdG8gbGltaXQgYWNjZXNzIHRvIHlvdXIgc2VydmVyIGNvbmZpZ3VyYXRpb24gCi0gICAgaW5mb3JtYXRpb24uIAotCi0gICAgPHA+T25jZSBjb25maWd1cmVkLCB0aGUgc2VydmVyIGluZm9ybWF0aW9uIGlzIG9idGFpbmVkIGJ5Ci0gICAgYWNjZXNzaW5nIDxjb2RlPmh0dHA6Ly95b3VyLmhvc3QuZG9tL3NlcnZlci1pbmZvPC9jb2RlPjwvcD4KLQotICAgIDxub3RlPgotICAgICAgTm90ZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIGFyZSByZWFkIGJ5IHRoZQotICAgICAgbW9kdWxlIGF0IHJ1bi10aW1lLCBhbmQgdGhlcmVmb3JlIHRoZSBkaXNwbGF5IG1heQotICAgICAgPGVtPm5vdDwvZW0+IHJlZmxlY3QgdGhlIHJ1bm5pbmcgc2VydmVyJ3MgYWN0aXZlCi0gICAgICBjb25maWd1cmF0aW9uIGlmIHRoZSBmaWxlcyBoYXZlIGJlZW4gY2hhbmdlZCBzaW5jZSB0aGUgc2VydmVyCi0gICAgICB3YXMgbGFzdCByZWxvYWRlZC4gQWxzbywgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgbXVzdCBiZQotICAgICAgcmVhZGFibGUgYnkgdGhlIHVzZXIgYXMgd2hpY2ggdGhlIHNlcnZlciBpcyBydW5uaW5nIChzZWUgdGhlCi0gICAgICA8ZGlyZWN0aXZlIG1vZHVsZT0ibXBtX2NvbW1vbiI+VXNlcjwvZGlyZWN0aXZlPiBkaXJlY3RpdmUpLCBvcgotICAgICAgZWxzZSB0aGUgZGlyZWN0aXZlIHNldHRpbmdzIHdpbGwgbm90IGJlIGxpc3RlZC4KLQotICAgICAgPHA+SXQgc2hvdWxkIGFsc28gYmUgbm90ZWQgdGhhdCBpZgotICAgICAgPG1vZHVsZT5tb2RfaW5mbzwvbW9kdWxlPiBpcyBjb21waWxlZCBpbnRvIHRoZSBzZXJ2ZXIsIGl0cwotICAgICAgaGFuZGxlciBjYXBhYmlsaXR5IGlzIGF2YWlsYWJsZSBpbiA8ZW0+YWxsPC9lbT4gY29uZmlndXJhdGlvbgotICAgICAgZmlsZXMsIGluY2x1ZGluZyA8ZW0+cGVyPC9lbT4tZGlyZWN0b3J5IGZpbGVzICg8ZW0+ZS5nLjwvZW0+LAotICAgICAgPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPikuIFRoaXMgbWF5IGhhdmUgc2VjdXJpdHktcmVsYXRlZAotICAgICAgcmFtaWZpY2F0aW9ucyBmb3IgeW91ciBzaXRlLjwvcD4KLSAgICA8L25vdGU+Ci08L3N1bW1hcnk+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkFkZE1vZHVsZUluZm88L25hbWU+Ci08ZGVzY3JpcHRpb24+QWxsb3dzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gYmUgYWRkZWQgdG8gdGhlIG1vZHVsZQotaW5mb3JtYXRpb24gZGlzcGxheWVkIGJ5IHRoZSBzZXJ2ZXItaW5mbyBoYW5kbGVyPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+QWRkTW9kdWxlSW5mbyA8ZW0+bW9kdWxlLW5hbWUgc3RyaW5nPC9lbT48L3N5bnRheD4KLTxkZWZhdWx0PjxlbT5ub25lPC9lbT48L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4gPGNvbnRleHQ+dmlydHVhbAotaG9zdDwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPGNvbXBhdGliaWxpdHk+QXBhY2hlIDEuMyBhbmQgYWJvdmU8L2NvbXBhdGliaWxpdHk+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGlzIGFsbG93cyB0aGUgY29udGVudCBvZiA8ZW0+c3RyaW5nPC9lbT4gdG8gYmUgc2hvd24gYXMKLSAgICBIVE1MIGludGVycHJldGVkLCA8c3Ryb25nPkFkZGl0aW9uYWwgSW5mb3JtYXRpb248L3N0cm9uZz4gZm9yCi0gICAgdGhlIG1vZHVsZSA8ZW0+bW9kdWxlLW5hbWU8L2VtPi4gRXhhbXBsZTo8L3A+Ci0KLTxleGFtcGxlPgotQWRkTW9kdWxlSW5mbyBtb2RfYXV0aC5jICdTZWUgJmx0O0EgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvbW9kL21vZF9hdXRoLmh0bWwiJmd0O2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzL21vZC9tb2RfYXV0aC5odG1sJmx0Oy9BJmd0OycKLTwvZXhhbXBsZT4KLTwvdXNhZ2U+Ci0KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci08L21vZHVsZXN5bm9wc2lzPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2lzYXBpLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2lzYXBpLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZGUwOGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9pc2FwaS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9pc2FwaTwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotCi08SDEgQUxJR049IkNFTlRFUiI+TW9kdWxlIG1vZF9pc2FwaTwvaDE+Ci0KLTxwPlRoaXMgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+bW9kX2lzYXBpLmM8L2NvZGU+IGZpbGUsIGFuZCBpcwotICAgY29tcGlsZWQgaW4gYnkgZGVmYXVsdC4gSXQgcHJvdmlkZXMgc3VwcG9ydCBmb3IgSVNBUEkgRXh0ZW5zaW9ucyB3aGVuCi0gICBydW5uaW5nIHVuZGVyIE1pY3Jvc29mdCBXaW5kb3dzLiBBbnkgZG9jdW1lbnQgd2l0aCBhIGhhbmRsZXIgb2YKLSAgIDxjb2RlPmlzYXBpLWlzYTwvY29kZT4gd2lsbCBiZSBwcm9jZXNzZWQgYnkgdGhpcyBtb2R1bGUuCi0KLTxoMj5QdXJwb3NlPC9oMj4KLQotPHA+VGhpcyBtb2R1bGUgaW1wbGVtZW50cyB0aGUgPGEKLSAgIGhyZWY9Imh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS93aW4zMmRldi9hcGlleHQvaXNhcGltcmcuaHRtIj5JU0FQSQotICAgRXh0ZW5zaW9uPC9hPiBBUEkuIEl0IGFsbG93cyBJbnRlcm5ldCBTZXJ2ZXIgQXBwbGljYXRpb25zIChpLmUuLCBJU0FQSQotICAgRXh0ZW5zaW9ucykgdG8gYmUgdXNlZCB3aXRoIEFwYWNoZSBmb3IgV2luZG93cy4KLQotPGgyPlVzYWdlPC9oMj4KLQotPHA+SW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGUsIGFkZCBhIGhhbmRsZXIgY2FsbGVkCi0gICA8Y29kZT5pc2FwaS1pc2E8L2NvZGU+LCBhbmQgbWFwIGl0IHRvIGZpbGVzIHdpdGggYSA8Y29kZT4uRExMPC9jb2RlPgotICAgZXh0ZW5zaW9uLiBJbiBvdGhlciB3b3Jkczo8L3A+Ci08cHJlPgotICAgIEFkZEhhbmRsZXIgaXNhcGktaXNhIGRsbAotPC9wcmU+Ci08cD5Ob3cgc2ltcGx5IHBsYWNlIHRoZSBJU0EgRExMcyBpbnRvIHlvdXIgZG9jdW1lbnQgcm9vdCwgYW5kIHRoZXkgd2lsbAotICAgYmUgbG9hZGVkIHdoZW4gdGhlaXIgVVJMcyBhcmUgYWNjZXNzZWQuPC9wPgotCi08cD5JU0FQSSBFeHRlbnNpb25zIGFyZSBnb3Zlcm5lZCBieSB0aGUgc2FtZSByZXN0cmljdGlvbnMgYXMgQ0dJCi0gICBzY3JpcHRzLiBUaGF0IGlzLCA8Y29kZT5PcHRpb25zIEV4ZWNDR0k8L2NvZGU+IG11c3QgYmUgYWN0aXZlIGluIHRoZQotICAgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlIElTQS48L3A+Ci0KLTxoMj5Ob3RlczwvaDI+Ci0KLTxwPkFwYWNoZSdzIElTQVBJIGltcGxlbWVudGF0aW9uIGNvbmZvcm1zIHRvIGFsbCBvZiB0aGUgSVNBUEkgMi4wCi0gICBzcGVjaWZpY2F0aW9uLCBleGNlcHQgZm9yIHRoZSAiTWljcm9zb2Z0LXNwZWNpZmljIiBleHRlbnNpb25zIGRlYWxpbmcKLSAgIHdpdGggYXNjeW5jaHJvbm91cyBJL08uIEFwYWNoZSdzIEkvTyBtb2RlbCBkb2VzIG5vdCBhbGxvdyBhc3luY2hyb25vdXMKLSAgIHJlYWRpbmcgYW5kIHdyaXRpbmcgaW4gYSBtYW5uZXIgdGhhdCB0aGUgSVNBUEkgY291bGQgYWNjZXNzLiBJZiBhbiBJU0EKLSAgIHRyaWVzIHRvIGFjY2VzcyBhc3luYyBJL08sIGEgbWVzc2FnZSB3aWxsIGJlIHBsYWNlIGluIHRoZSBlcnJvciBsb2csCi0gICB0byBoZWxwIHdpdGggZGVidWdnaW5nLgotCi08cD5Tb21lIHNlcnZlcnMsIGxpa2UgTWljcm9zb2Z0IElJUywgbG9hZCB0aGUgSVNBIGludG8gdGhlIHNlcnZlciwgYW5kCi0gICBrZWVwIGl0IGxvYWRlZCB1bnRpbCBtZW1vcnkgdXNhZ2UgaXMgdG9vIGhpZ2gsIGFuZCBpdCBpcwotICAgdW5sb2FkZWQuIEFwYWNoZSBjdXJyZW50bHkgbG9hZHMgYW5kIHVubG9hZHMgdGhlIElTQSBmb3IgZWFjaAotICAgcmVxdWVzdC4gVGhpcyBpcyBpbmVmZmljaWVudCwgYnV0IEFwYWNoZSdzIHJlcXVlc3QgbW9kZWwgbWFrZXMgdGhpcwotICAgbWV0aG9kIHRoZSBvbmx5IG1ldGhvZCB0aGF0IGN1cnJlbnRseSB3b3Jrcy4gQSBmdXR1cmUgcmVsZWFzZSBtYXkgdXNlCi0gICBhIG1vcmUgZWZmZWN0aXZlIGxvYWRpbmcgbWV0aG9kLgotCi08cD5BcGFjaGUgMS4zYTEgY3VycmVudGx5IGxpbWl0cyBQT1NUIGFuZCBQVVQgaW5wdXQgdG8gNDhrIHBlcgotICAgcmVxdWVzdC4gVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBhIHByb2JsZW0gd2l0aCB0aGUgSVNBUEkgaW1wbGVtZW50YXRpb24KLSAgIHRoYXQgY291bGQgcmVzdWx0IGluIGEgZGVuaWFsIG9mIHNlcnZpY2UgYXR0YWNrLiBJdCBpcyBleHBlY3RlZCB0aGF0Ci0gICBzdXBwb3J0IGZvciBsYXJnZXIgdXBsb2FkcyB3aWxsIGJlIGFkZGVkIHNvb24uCi0KLTxwPkFsc28sIHJlbWVtYmVyIHRoYXQgd2hpbGUgQXBhY2hlIHN1cHBvcnRzIElTQVBJIEV4dGVuc2lvbnMsIGl0IGRvZXMKLSAgIG5vdCBzdXBwb3J0IElTQVBJIEZpbHRlcnMuIFN1cHBvcnQgZm9yIGZpbHRlcnMgbWF5IGJlIGFkZGVkIGF0IGEgbGF0ZXIKLSAgIGRhdGUsIGJ1dCBubyBzdXBwb3J0IGlzIHBsYW5uZWQgYXQgdGhpcyB0aW1lLjwvcD4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfaXNhcGkueG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9pc2FwaS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NGNiZDAuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9pc2FwaS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgbW9kdWxlc3lub3BzaXMgU1lTVEVNICIuLi9zdHlsZS9tb2R1bGVzeW5vcHNpcy5kdGQiPgotPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iLi4vc3R5bGUvbWFudWFsLnhzbCI/PgotPG1vZHVsZXN5bm9wc2lzPgotCi08bmFtZT5tb2RfaXNhcGk8L25hbWU+Ci08ZGVzY3JpcHRpb24+SVNBUEkgRXh0ZW5zaW9ucyB3aXRoaW4gQXBhY2hlIGZvciBXaW5kb3dzPC9kZXNjcmlwdGlvbj4KLTxzdGF0dXM+QmFzZTwvc3RhdHVzPgotPHNvdXJjZWZpbGU+bW9kX2lzYXBpLmM8L3NvdXJjZWZpbGU+Ci08aWRlbnRpZmllcj5pc2FwaV9tb2R1bGU8L2lkZW50aWZpZXI+Ci08Y29tcGF0aWJpbGl0eT5XaW4zMiBvbmx5PC9jb21wYXRpYmlsaXR5PgotCi08c3VtbWFyeT4KLSAgICA8cD5UaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBJbnRlcm5ldCBTZXJ2ZXIgZXh0ZW5zaW9uIEFQSS4gSXQKLSAgICBhbGxvd3MgSW50ZXJuZXQgU2VydmVyIGV4dGVuc2lvbnMgKDxlbT5lLmcuPC9lbT4gSVNBUEkgLmRsbAotICAgIG1vZHVsZXMpIHRvIGJlIHNlcnZlZCBieSBBcGFjaGUgZm9yIFdpbmRvd3MsIHN1YmplY3QgdG8gdGhlCi0gICAgbm90ZWQgcmVzdHJpY3Rpb25zLjwvcD4KLQotICAgIDxwPklTQVBJIGV4dGVuc2lvbiBtb2R1bGVzICguZGxsIGZpbGVzKSBhcmUgd3JpdHRlbiBieSB0aGlyZAotICAgIHBhcnRpZXMuIFRoZSBBcGFjaGUgR3JvdXAgZG9lcyBub3QgYXV0aG9yIHRoZXNlIG1vZHVsZXMsIHNvIHdlCi0gICAgcHJvdmlkZSBubyBzdXBwb3J0IGZvciB0aGVtLiBQbGVhc2UgY29udGFjdCB0aGUgSVNBUEkncyBhdXRob3IKLSAgICBkaXJlY3RseSBpZiB5b3UgYXJlIGV4cGVyaWVuY2luZyBwcm9ibGVtcyBydW5uaW5nIHRoZWlyIElTQVBJCi0gICAgZXh0ZW50aW9uLiA8c3Ryb25nPlBsZWFzZSA8ZW0+ZG8gbm90PC9lbT4gcG9zdCBzdWNoIHByb2JsZW1zIHRvCi0gICAgQXBhY2hlJ3MgbGlzdHMgb3IgYnVnIHJlcG9ydGluZyBwYWdlcy48L3N0cm9uZz48L3A+Ci08L3N1bW1hcnk+Ci0KLTxzZWN0aW9uPjx0aXRsZT5Vc2FnZTwvdGl0bGU+IDxwPkluIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlLCB1c2UKLXRoZSA8ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX21pbWUiPkFkZEhhbmRsZXI8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIHRvCi1hc3NvY2lhdGUgSVNBUEkgZmlsZXMgd2l0aCB0aGUgPGNvZGU+aXNhcGktaXNhPC9jb2RlPiBoYW5kbGVyLCBhbmQgbWFwCi1pdCB0byB0aGUgd2l0aCB0aGVpciBmaWxlIGV4dGVuc2lvbnMuIFRvIGVuYWJsZSBhbnkgLmRsbCBmaWxlIHRvIGJlCi1wcm9jZXNzZWQgYXMgYW4gSVNBUEkgZXh0ZW50aW9uLCBlZGl0IHRoZSBodHRwZC5jb25mIGZpbGUgYW5kIGFkZCB0aGUKLWZvbGxvd2luZyBsaW5lOjwvcD4KLTxleGFtcGxlPgotICAgIEFkZEhhbmRsZXIgaXNhcGktaXNhIC5kbGwKLTwvZXhhbXBsZT4KLQotICAgIDxwPlRoZXJlIGlzIG5vIGNhcGFiaWxpdHkgd2l0aGluIHRoZSBBcGFjaGUgc2VydmVyIHRvIGxlYXZlIGEKLSAgICByZXF1ZXN0ZWQgbW9kdWxlIGxvYWRlZC4gSG93ZXZlciwgeW91IG1heSBwcmVsb2FkIGFuZCBrZWVwIGEKLSAgICBzcGVjaWZpYyBtb2R1bGUgbG9hZGVkIGJ5IHVzaW5nIHRoZSBmb2xsb3dpbmcgc3ludGF4IGluIHlvdXIKLSAgICBodHRwZC5jb25mOjwvcD4KLTxleGFtcGxlPgotICAgIElTQVBJQ2FjaGVGaWxlIGM6L1dlYldvcmsvU2NyaXB0cy9JU0FQSS9teXRlc3QuZGxsCi08L2V4YW1wbGU+Ci0KLSAgICA8cD5XaGV0aGVyIG9yIG5vdCB5b3UgaGF2ZSBwcmVsb2FkZWQgYW4gSVNBUEkgZXh0ZW5zaW9uLCBhbGwKLSAgICBJU0FQSSBleHRlbnNpb25zIGFyZSBnb3Zlcm5lZCBieSB0aGUgc2FtZSBwZXJtaXNzaW9ucyBhbmQKLSAgICByZXN0cmljdGlvbnMgYXMgQ0dJIHNjcmlwdHMuIFRoYXQgaXMsIDxjb2RlPk9wdGlvbnMKLSAgICBFeGVjQ0dJPC9jb2RlPiBtdXN0IGJlIHNldCBmb3IgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZQotICAgIElTQVBJIC5kbGwgZmlsZS48L3A+Ci0KLSAgICA8cD5SZXZpZXcgdGhlIDxhIGhyZWY9IiNub3RlcyI+QWRkaXRpb25hbCBOb3RlczwvYT4gYW5kIHRoZSA8YQotICAgIGhyZWY9IiNqb3VybmFsIj5Qcm9ncmFtbWVyJ3MgSm91cm5hbDwvYT4gZm9yIGFkZGl0aW9uYWwgZGV0YWlscwotICAgIGFuZCBjbGFyaWZpY2F0aW9uIG9mIHRoZSBzcGVjaWZpYyBJU0FQSSBzdXBwb3J0IG9mZmVyZWQgYnkKLSAgICBtb2RfaXNhcGkuPC9wPgotPC9zZWN0aW9uPgotCi08c2VjdGlvbiBpZD0ibm90ZXMiPjx0aXRsZT5BZGRpdGlvbmFsIE5vdGVzPC90aXRsZT4KLQotICAgIDxwPkFwYWNoZSdzIElTQVBJIGltcGxlbWVudGF0aW9uIGNvbmZvcm1zIHRvIGFsbCBvZiB0aGUgSVNBUEkKLSAgICAyLjAgc3BlY2lmaWNhdGlvbiwgZXhjZXB0IGZvciBzb21lICJNaWNyb3NvZnQtc3BlY2lmaWMiCi0gICAgZXh0ZW5zaW9ucyBkZWFsaW5nIHdpdGggYXN5bmNocm9ub3VzIEkvTy4gQXBhY2hlJ3MgSS9PIG1vZGVsCi0gICAgZG9lcyBub3QgYWxsb3cgYXN5bmNocm9ub3VzIHJlYWRpbmcgYW5kIHdyaXRpbmcgaW4gYSBtYW5uZXIKLSAgICB0aGF0IHRoZSBJU0FQSSBjb3VsZCBhY2Nlc3MuIElmIGFuIElTQSB0cmllcyB0byBhY2Nlc3MKLSAgICB1bnN1cHBvcnRlZCBmZWF0dXJlcywgaW5jbHVkaW5nIGFzeW5jIEkvTywgYSBtZXNzYWdlIGlzIHBsYWNlZAotICAgIGluIHRoZSBlcnJvciBsb2cgdG8gaGVscCB3aXRoIGRlYnVnZ2luZy4gU2luY2UgdGhlc2UgbWVzc2FnZXMKLSAgICBjYW4gYmVjb21lIGEgZmxvb2QsIHRoZSBkaXJlY3RpdmUgPGNvZGU+SVNBUElMb2dOb3RTdXBwb3J0ZWQKLSAgICBPZmY8L2NvZGU+IGV4aXN0cyB0byBxdWlldCB0aGlzIG5vaXNlLjwvcD4KLQotICAgIDxwPlNvbWUgc2VydmVycywgbGlrZSBNaWNyb3NvZnQgSUlTLCBsb2FkIHRoZSBJU0FQSSBleHRlbnNpb24KLSAgICBpbnRvIHRoZSBzZXJ2ZXIgYW5kIGtlZXAgaXQgbG9hZGVkIHVudGlsIG1lbW9yeSB1c2FnZSBpcyB0b28KLSAgICBoaWdoLCBvciB1bmxlc3MgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBzcGVjaWZpZWQuIEFwYWNoZQotICAgIGN1cnJlbnRseSBsb2FkcyBhbmQgdW5sb2FkcyB0aGUgSVNBUEkgZXh0ZW5zaW9uIGVhY2ggdGltZSBpdCBpcwotICAgIHJlcXVlc3RlZCwgdW5sZXNzIHRoZSBJU0FQSUNhY2hlRmlsZSBkaXJlY3RpdmUgaXMgc3BlY2lmaWVkLgotICAgIFRoaXMgaXMgaW5lZmZpY2llbnQsIGJ1dCBBcGFjaGUncyBtZW1vcnkgbW9kZWwgbWFrZXMgdGhpcyB0aGUKLSAgICBtb3N0IGVmZmVjdGl2ZSBtZXRob2QuIE1hbnkgSVNBUEkgbW9kdWxlcyBhcmUgc3VidGx5Ci0gICAgaW5jb21wYXRpYmxlIHdpdGggdGhlIEFwYWNoZSBzZXJ2ZXIsIGFuZCB1bmxvYWRpbmcgdGhlc2UKLSAgICBtb2R1bGVzIGhlbHBzIHRvIGVuc3VyZSB0aGUgc3RhYmlsaXR5IG9mIHRoZSBzZXJ2ZXIuPC9wPgotCi0gICAgPHA+QWxzbywgcmVtZW1iZXIgdGhhdCB3aGlsZSBBcGFjaGUgc3VwcG9ydHMgSVNBUEkgRXh0ZW5zaW9ucywKLSAgICBpdCA8c3Ryb25nPmRvZXMgbm90IHN1cHBvcnQgSVNBUEkgRmlsdGVycy48L3N0cm9uZz4gU3VwcG9ydCBmb3IKLSAgICBmaWx0ZXJzIG1heSBiZSBhZGRlZCBhdCBhIGxhdGVyIGRhdGUsIGJ1dCBubyBzdXBwb3J0IGlzIHBsYW5uZWQKLSAgICBhdCB0aGlzIHRpbWUuPC9wPgotPC9zZWN0aW9uPgotCi08c2VjdGlvbiBpZD0iam91cm5hbCI+PHRpdGxlPlByb2dyYW1tZXIncyBKb3VybmFsPC90aXRsZT4KLQotICAgIDxwPklmIHlvdSBhcmUgcHJvZ3JhbW1pbmcgQXBhY2hlIDIuMCA8bW9kdWxlPm1vZF9pc2FwaTwvbW9kdWxlPgotICAgIG1vZHVsZXMsIHlvdSBtdXN0IGxpbWl0IHlvdXIgY2FsbHMgdG8gU2VydmVyU3VwcG9ydEZ1bmN0aW9uIHRvIHRoZQotICAgIGZvbGxvd2luZyBkaXJlY3RpdmVzOjwvcD4KLQotICAgIDxkbD4KLSAgICAgIDxkdD5IU0VfUkVRX1NFTkRfVVJMX1JFRElSRUNUX1JFU1A8L2R0PgotCi0gICAgICA8ZGQ+UmVkaXJlY3QgdGhlIHVzZXIgdG8gYW5vdGhlciBsb2NhdGlvbi48YnIgLz4KLSAgICAgICBUaGlzIG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgVVJMIChlLmcuCi0gICAgICBodHRwOi8vc2VydmVyL2xvY2F0aW9uKS48L2RkPgotCi0gICAgICA8ZHQ+SFNFX1JFUV9TRU5EX1VSTDwvZHQ+Ci0KLSAgICAgIDxkZD5SZWRpcmVjdCB0aGUgdXNlciB0byBhbm90aGVyIGxvY2F0aW9uLjxiciAvPgotICAgICAgIFRoaXMgY2Fubm90IGJlIGEgZnVsbHkgcXVhbGlmaWVkIFVSTCwgeW91IGFyZSBub3QgYWxsb3dlZCB0bwotICAgICAgcGFzcyB0aGUgcHJvdG9jb2wgb3IgYSBzZXJ2ZXIgbmFtZSAoZS5nLiBzaW1wbHkKLSAgICAgIC9sb2NhdGlvbikuPGJyIC8+Ci0gICAgICAgVGhpcyByZWRpcmVjdGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBzZXJ2ZXIsIG5vdCB0aGUKLSAgICAgIGJyb3dzZXIuPGJyIC8+Ci0gICAgICAgPHN0cm9uZz5XYXJuaW5nOjwvc3Ryb25nPiBpbiB0aGVpciByZWNlbnQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIE1pY3Jvc29mdCBhcHBlYXJzIHRvIGhhdmUgYWJhbmRvbmVkIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuCi0gICAgICB0aGUgdHdvIEhTRV9SRVFfU0VORF9VUkwgZnVuY3Rpb25zLiBBcGFjaGUgY29udGludWVzIHRvIHRyZWF0Ci0gICAgICB0aGVtIGFzIHR3byBkaXN0aW5jdCBmdW5jdGlvbnMgd2l0aCBkaWZmZXJlbnQgcmVxdWlyZW1lbnRzCi0gICAgICBhbmQgYmVoYXZpb3JzLjwvZGQ+Ci0KLSAgICAgIDxkdD5IU0VfUkVRX1NFTkRfUkVTUE9OU0VfSEVBREVSPC9kdD4KLQotICAgICAgPGRkPkFwYWNoZSBhY2NlcHRzIGEgcmVzcG9uc2UgYm9keSBmb2xsb3dpbmcgdGhlIGhlYWRlciBpZiBpdAotICAgICAgZm9sbG93cyB0aGUgYmxhbmsgbGluZSAodHdvIGNvbnNlY3V0aXZlIG5ld2xpbmVzKSBpbiB0aGUKLSAgICAgIGhlYWRlcnMgc3RyaW5nIGFyZ3VtZW50LiBUaGlzIGJvZHkgY2Fubm90IGNvbnRhaW4gTlVMTHMsCi0gICAgICBzaW5jZSB0aGUgaGVhZGVycyBhcmd1bWVudCBpcyBOVUxMIHRlcm1pbmF0ZWQuPC9kZD4KLQotICAgICAgPGR0PkhTRV9SRVFfRE9ORV9XSVRIX1NFU1NJT048L2R0PgotCi0gICAgICA8ZGQ+QXBhY2hlIGNvbnNpZGVycyB0aGlzIGEgbm8tb3AsIHNpbmNlIHRoZSBzZXNzaW9uIHdpbGwgYmUKLSAgICAgIGZpbmlzaGVkIHdoZW4gdGhlIElTQVBJIHJldHVybnMgZnJvbSBwcm9jZXNzaW5nLjwvZGQ+Ci0KLSAgICAgIDxkdD5IU0VfUkVRX01BUF9VUkxfVE9fUEFUSDwvZHQ+Ci0KLSAgICAgIDxkZD5BcGFjaGUgd2lsbCB0cmFuc2xhdGUgYSB2aXJ0dWFsIG5hbWUgdG8gYSBwaHlzaWNhbAotICAgICAgbmFtZS48L2RkPgotCi0gICAgICA8ZHQ+SFNFX0FQUEVORF9MT0dfUEFSQU1FVEVSPC9kdD4KLQotICAgICAgPGRkPgotICAgICAgICBUaGlzIGxvZ2dlZCBtZXNzYWdlIG1heSBiZSBjYXB0dXJlZCBpbiBhbnkgb2YgdGhlIGZvbGxvd2luZwotICAgICAgICBsb2dzOiAKLQotICAgICAgICA8dWw+Ci0gICAgICAgICAgPGxpPmluIHRoZSBcIiV7aXNhcGktcGFyYW1ldGVyfW5cIiBjb21wb25lbnQgaW4gYQotICAgICAgICAgIEN1c3RvbUxvZyBkaXJlY3RpdmU8L2xpPgotCi0gICAgICAgICAgPGxpPmluIHRoZSAlcSBsb2cgY29tcG9uZW50IHdpdGggdGhlCi0gICAgICAgICAgSVNBUElBcHBlbmRMb2dUb1F1ZXJ5IE9uIGRpcmVjdGl2ZTwvbGk+Ci0KLSAgICAgICAgICA8bGk+aW4gdGhlIGVycm9yIGxvZyB3aXRoIHRoZSBJU0FQSUFwcGVuZExvZ1RvRXJyb3JzIE9uCi0gICAgICAgICAgZGlyZWN0aXZlPC9saT4KLSAgICAgICAgPC91bD4KLSAgICAgICAgVGhlIGZpcnN0IG9wdGlvbiwgdGhlICV7aXNhcGktcGFyYW1ldGVyfW4gY29tcG9uZW50LCBpcwotICAgICAgICBhbHdheXMgYXZhaWxhYmxlIGFuZCBwcmVmZXJlZC4KLSAgICAgIDwvZGQ+Ci0KLSAgICAgIDxkdD5IU0VfUkVRX0lTX0tFRVBfQ09OTjwvZHQ+Ci0KLSAgICAgIDxkZD5XaWxsIHJldHVybiB0aGUgbmVnb3RpYXRlZCBLZWVwLUFsaXZlIHN0YXR1cy48L2RkPgotCi0gICAgICA8ZHQ+SFNFX1JFUV9TRU5EX1JFU1BPTlNFX0hFQURFUl9FWDwvZHQ+Ci0KLSAgICAgIDxkZD5XaWxsIGJlaGF2ZSBhcyBkb2N1bWVudGVkLCBhbHRob3VnaCB0aGUgZktlZXBDb25uIGZsYWcgaXMKLSAgICAgIGlnbm9yZWQuPC9kZD4KLQotICAgICAgPGR0PkhTRV9SRVFfSVNfQ09OTkVDVEVEPC9kdD4KLQotICAgICAgPGRkPldpbGwgcmVwb3J0IGZhbHNlIGlmIHRoZSByZXF1ZXN0IGhhcyBiZWVuIGFib3J0ZWQuPC9kZD4KLSAgICA8L2RsPgotCi0gICAgPHA+QXBhY2hlIHJldHVybnMgRkFMU0UgdG8gYW55IHVuc3VwcG9ydGVkIGNhbGwgdG8KLSAgICBTZXJ2ZXJTdXBwb3J0RnVuY3Rpb24sIGFuZCBzZXRzIHRoZSBHZXRMYXN0RXJyb3IgdmFsdWUgdG8KLSAgICBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUi48L3A+Ci0KLSAgICA8cD5SZWFkQ2xpZW50IHJldHJpZXZlcyB0aGUgcmVxdWVzdCBib2R5IGV4Y2VlZGluZyB0aGUgaW5pdGlhbAotICAgIGJ1ZmZlciAoZGVmaW5lZCBieSBJU0FQSVJlYWRBaGVhZEJ1ZmZlcikuIEJhc2VkIG9uIHRoZQotICAgIElTQVBJUmVhZEFoZWFkQnVmZmVyIHNldHRpbmcgKG51bWJlciBvZiBieXRlcyB0byBidWZmZXIgcHJpb3IKLSAgICB0byBjYWxsaW5nIHRoZSBJU0FQSSBoYW5kbGVyKSBzaG9ydGVyIHJlcXVlc3RzIGFyZSBzZW50Ci0gICAgY29tcGxldGUgdG8gdGhlIGV4dGVuc2lvbiB3aGVuIGl0IGlzIGludm9rZWQuIElmIHRoZSByZXF1ZXN0IGlzCi0gICAgbG9uZ2VyLCB0aGUgSVNBUEkgZXh0ZW5zaW9uIG11c3QgdXNlIFJlYWRDbGllbnQgdG8gcmV0cmlldmUgdGhlCi0gICAgcmVtYWluaW5nIHJlcXVlc3QgYm9keS48L3A+Ci0KLSAgICA8cD5Xcml0ZUNsaWVudCBpcyBzdXBwb3J0ZWQsIGJ1dCBvbmx5IHdpdGggdGhlIEhTRV9JT19TWU5DIGZsYWcKLSAgICBvciBubyBvcHRpb24gZmxhZyAodmFsdWUgb2YgMCkuIEFueSBvdGhlciBXcml0ZUNsaWVudCByZXF1ZXN0Ci0gICAgd2lsbCBiZSByZWplY3RlZCB3aXRoIGEgcmV0dXJuIHZhbHVlIG9mIEZBTFNFLCBhbmQgYQotICAgIEdldExhc3RFcnJvciB2YWx1ZSBvZiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUi48L3A+Ci0KLSAgICA8cD5HZXRTZXJ2ZXJWYXJpYWJsZSBpcyBzdXBwb3J0ZWQsIGFsdGhvdWdoIGV4dGVuZGVkIHNlcnZlcgotICAgIHZhcmlhYmxlcyBkbyBub3QgZXhpc3QgKGFzIGRlZmluZWQgYnkgb3RoZXIgc2VydmVycy4pIEFsbCB0aGUKLSAgICB1c3VhbCBBcGFjaGUgQ0dJIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgYXZhaWxhYmxlIGZyb20KLSAgICBHZXRTZXJ2ZXJWYXJpYWJsZSwgYXMgd2VsbCBhcyB0aGUgQUxMX0hUVFAgYW5kIEFMTF9SQVcKLSAgICB2YWx1ZXMuPC9wPgotCi0gICAgPHA+QXBhY2hlIDIuMCA8bW9kdWxlPm1vZF9pc2FwaTwvbW9kdWxlPiBzdXBwb3J0cyBhZGRpdGlvbmFsCi0gICAgZmVhdHVyZXMgaW50cm9kdWNlZCBpbiBsYXRlciB2ZXJzaW9ucyBvZiB0aGUgSVNBUEkgc3BlY2lmaWNhdGlvbiwKLSAgICBhcyB3ZWxsIGFzIGxpbWl0ZWQgZW11bGF0aW9uIG9mIGFzeW5jIEkvTyBhbmQgdGhlIFRyYW5zbWl0RmlsZQotICAgIHNlbWFudGljcy4gIEFwYWNoZSBhbHNvIHN1cHBvcnRzIHByZWxvYWRpbmcgSVNBUEkgLmRsbHMgZm9yCi0gICAgcGVyZm9ybWFuY2UsIG5laXRoZXIgb2Ygd2hpY2ggd2VyZSBub3QgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSAxLjMKLSAgICBtb2RfaXNhcGkuPC9wPgotPC9zZWN0aW9uPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5JU0FQSUZpbGVDaGFjaGU8L25hbWU+Ci08ZGVzY3JpcHRpb24+SVNBUEkgLmRsbCBmaWxlcyB0byBiZSBsb2FkZWQgYXQgc3RhcnR1cDwvZGVzY3JpcHRpb24+Ci08c3ludGF4PklTQVBJRmlsZUNhY2hlIDxlbT5maWxlLXBhdGg8L2VtPiBbPGVtPmZpbGUtcGF0aDwvZW0+XSAuLi48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5TcGVjaWZpZXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBmaWxlIG5hbWVzIHRvIGJlIGxvYWRlZAotICAgIHdoZW4gdGhlIEFwYWNoZSBzZXJ2ZXIgaXMgbGF1bmNoZWQsIGFuZCByZW1haW4gbG9hZGVkIHVudGlsIHRoZQotICAgIHNlcnZlciBpcyBzaHV0IGRvd24uIFRoaXMgZGlyZWN0aXZlIG1heSBiZSByZXBlYXRlZCBmb3IgZXZlcnkKLSAgICBJU0FQSSAuZGxsIGZpbGUgZGVzaXJlZC4gVGhlIGZ1bGwgcGF0aCBuYW1lIG9mIGVhY2ggZmlsZSBzaG91bGQKLSAgICBiZSBzcGVjaWZpZWQuPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPklTQVBJUmVhZEFoZWFkQnVmZmVyPC9uYW1lPgotPGRlc2NyaXB0aW9uPlNpemUgb2YgdGhlIFJlYWQgQWhlYWQgQnVmZmVyIHNlbnQgdG8gSVNBUEkgCi1leHRlbnNpb25zPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+SVNBUElSZWFkQWhlYWRCdWZmZXIgPGVtPnNpemU8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+SVNBUElSZWFkQWhlYWRCdWZmZXIgNDkxNTI8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+RGVmaW5lcyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBSZWFkIEFoZWFkIEJ1ZmZlciBzZW50IHRvCi0gICAgSVNBUEkgZXh0ZW5zaW9ucyB3aGVuIHRoZXkgYXJlIGluaXRpYWxseSBpbnZva2VkLiBBbGwgcmVtYWluaW5nCi0gICAgZGF0YSBtdXN0IGJlIHJldHJpZXZlZCB1c2luZyB0aGUgUmVhZENsaWVudCBjYWxsYmFjazsgc29tZQotICAgIElTQVBJIGV4dGVuc2lvbnMgbWF5IG5vdCBzdXBwb3J0IHRoZSBSZWFkQ2xpZW50IGZ1bmN0aW9uLiBSZWZlcgotICAgIHF1ZXN0aW9ucyB0byB0aGUgSVNBUEkgZXh0ZW5zaW9uJ3MgYXV0aG9yLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5JU0FQSUxvZ05vdFN1cHBvcnRlZDwvbmFtZT4KLTxkZXNjcmlwdGlvbj5Mb2cgdW5zdXBwb3J0ZWQgZmVhdHVyZSByZXF1ZXN0cyBmcm9tIElTQVBJCi1leHRlbnNpb25zPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+SVNBUElMb2dOb3RTdXBwb3J0ZWQgb258b2ZmPC9zeW50YXg+Ci08ZGVmYXVsdD5JU0FQSUxvZ05vdFN1cHBvcnRlZCBvbjwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5Mb2dzIGFsbCByZXF1ZXN0cyBmb3IgdW5zdXBwb3J0ZWQgZmVhdHVyZXMgZnJvbSBJU0FQSQotICAgIGV4dGVuc2lvbnMgaW4gdGhlIHNlcnZlciBlcnJvciBsb2cuIFdoaWxlIHRoaXMgc2hvdWxkIGJlIHR1cm5lZAotICAgIG9mZiBvbmNlIGFsbCBkZXNpcmVkIElTQVBJIG1vZHVsZXMgYXJlIGZ1bmN0aW9uaW5nLCBpdCBkZWZhdWx0cwotICAgIHRvIG9uIHRvIGhlbHAgYWRtaW5pc3RyYXRvcnMgdHJhY2sgZG93biBwcm9ibGVtcy48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+SVNBUElBcHBlbmRMb2dUb0Vycm9yczwvbmFtZT4KLTxkZXNjcmlwdGlvbj5SZWNvcmQgSFNFX0FQUEVORF9MT0dfUEFSQU1FVEVSIHJlcXVlc3RzIGZyb20gSVNBUEkKLWV4dGVuc2lvbnMgdG8gdGhlIGVycm9yIGxvZzwvZGVzY3JpcHRpb24+Ci08c3ludGF4PklTQVBJQXBwZW5kTG9nVG9FcnJvcnMgb258b2ZmPC9zeW50YXg+Ci08ZGVmYXVsdD5JU0FQSUFwcGVuZExvZ1RvRXJyb3JzIG9mZjwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5SZWNvcmQgSFNFX0FQUEVORF9MT0dfUEFSQU1FVEVSIHJlcXVlc3RzIGZyb20gSVNBUEkKLSAgICBleHRlbnNpb25zIHRvIHRoZSBzZXJ2ZXIgZXJyb3IgbG9nLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5JU0FQSUFwcGVuZExvZ1RvUXVlcnk8L25hbWU+Ci08ZGVzY3JpcHRpb24+UmVjb3JkIEhTRV9BUFBFTkRfTE9HX1BBUkFNRVRFUiByZXF1ZXN0cyBmcm9tIElTQVBJCi1leHRlbnNpb25zIHRvIHRoZSBxdWVyeSBmaWVsZDwvZGVzY3JpcHRpb24+Ci08c3ludGF4PklTQVBJQXBwZW5kTG9nVG9RdWVyeSBvbnxvZmY8L3N5bnRheD4KLTxkZWZhdWx0PklTQVBJQXBwZW5kTG9nVG9RdWVyeSBvZmY8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+UmVjb3JkIEhTRV9BUFBFTkRfTE9HX1BBUkFNRVRFUiByZXF1ZXN0cyBmcm9tIElTQVBJCi0gICAgZXh0ZW5zaW9ucyB0byB0aGUgcXVlcnkgZmllbGQgKGFwcGVuZGVkIHRvIHRoZSBDdXN0b21Mb2cgJXEKLSAgICBjb21wb25lbnQpLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08L21vZHVsZXN5bm9wc2lzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfbG9nX2NvbmZpZy5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9sb2dfY29uZmlnLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NTVlYzUuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9sb2dfY29uZmlnLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotPCEtLSVoeXBlcnRleHQgLS0+Ci08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDIuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9sb2dfY29uZmlnPC9USVRMRT4KLTwvSEVBRD4KLQotPEJPRFk+Ci08SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9zdWIuZ2lmIiBBTFQ9IiI+Ci08IS0tLyVoeXBlcnRleHQgLS0+Ci08SDE+TW9kdWxlIG1vZF9sb2dfY29uZmlnPC9oMT4KLQotVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5tb2RfbG9nX2NvbmZpZy5jPC9jb2RlPiBmaWxlLCBhbmQgaXMgbm90Ci1jb21waWxlZCBpbiBieSBkZWZhdWx0LiBJdCBwcm92aWRlcyBmb3IgbG9nZ2luZyBvZiB0aGUgcmVxdWVzdHMgbWFkZSB0bwotdGhlIHNlcnZlciwgdXNpbmcgYSB1c2VyLXNwZWNpZmllZCBmb3JtYXQuCi0KLTxoMj5TdW1tYXJ5PC9oMj4KLVRoaXMgaXMgYW4gRVhQRVJJTUVOVEFMIG1vZHVsZSwgd2hpY2ggaW1wbGVtZW50cyB0aGUgVHJhbnNmZXJMb2cgZGlyZWN0aXZlCi0oc2FtZSBhcyB0aGUgY29tbW9uIGxvZyBtb2R1bGUpLCBhbmQgYW4gYWRkaXRpb25hbCBkaXJlY3RpdmUsIExvZ0Zvcm1hdC4KLUJ1Z3Mgd291bGQgbm90IHN1cnByaXNlIG1lLjxQPgotCi1UaGUgYXJndW1lbnQgdG8gdGhlIDxBIEhSRUY9IiNsb2dmb3JtYXQiPkxvZ0Zvcm1hdDwvQT4gaXMgYSBzdHJpbmcsIHdoaWNoIGNhbgotaW5jbHVkZSBsaXRlcmFsIGNoYXJhY3RlcnMgY29waWVkIGludG8gdGhlIGxvZyBmaWxlcywgYW5kIGAlJyBkaXJlY3RpdmVzIGFzCi1mb2xsb3dzOgotCi08UFJFPgotJS4uLmg6ICAgICAgICAgIFJlbW90ZSBob3N0Ci0lLi4ubDogICAgICAgICAgUmVtb3RlIGxvZ25hbWUgKGZyb20gaWRlbnRkLCBpZiBzdXBwbGllZCkKLSUuLi51OiAgICAgICAgICBSZW1vdGUgdXNlciAoZnJvbSBhdXRoOyBtYXkgYmUgYm9ndXMgaWYgcmV0dXJuIAotICAgICAgICAgICAgICAgIHN0YXR1cyAoJXMpIGlzIDQwMSkKLSUuLi50OiAgICAgICAgICBUaW1lLCBpbiBjb21tb24gbG9nIGZvcm1hdCB0aW1lIGZvcm1hdAotJS4uLnI6ICAgICAgICAgIEZpcnN0IGxpbmUgb2YgcmVxdWVzdAotJS4uLnM6ICAgICAgICAgIFN0YXR1cy4gIEZvciByZXF1ZXN0cyB0aGF0IGdvdCBpbnRlcm5hbGx5IHJlZGlyZWN0ZWQsIAotICAgICAgICAgICAgICAgIHRoaXMgaXMgc3RhdHVzIG9mIHRoZSA8Yj5vcmlnaW5hbDwvYj4gcmVxdWVzdCAtLS0gJS4uLj5zIAotICAgICAgICAgICAgICAgIGZvciB0aGUgbGFzdC4KLSUuLi5iOiAgICAgICAgICBCeXRlcyBzZW50LgotJS4uLntGb29iYXJ9aTogIFRoZSBjb250ZW50cyBvZiBGb29iYXI6IGhlYWRlciBsaW5lKHMpIGluIHRoZSByZXF1ZXN0Ci0gICAgICAgICAgICAgICAgc2VudCB0byB0aGUgY2xpZW50LgotJS4uLntGb29iYXJ9bzogIFRoZSBjb250ZW50cyBvZiBGb29iYXI6IGhlYWRlciBsaW5lKHMpIGluIHRoZSByZXBseS4KLTwvUFJFPgotCi1UaGUgYC4uLicgY2FuIGJlIG5vdGhpbmcgYXQgYWxsIChlLmcuIDxjb2RlPiIlaCAldSAlciAlcyAlYiI8L2NvZGU+KSwgb3IgaXQgY2FuCi1pbmRpY2F0ZSBjb25kaXRpb25zIGZvciBpbmNsdXNpb24gb2YgdGhlIGl0ZW0gKHdoaWNoIHdpbGwgY2F1c2UgaXQKLXRvIGJlIHJlcGxhY2VkIHdpdGggYC0nIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IG1ldCkuICBOb3RlIHRoYXQKLXRoZXJlIGlzIG5vIGVzY2FwaW5nIHBlcmZvcm1lZCBvbiB0aGUgc3RyaW5ncyBmcm9tICVyLCAlLi4uaSBhbmQKLSUuLi5vOyBzb21lIHdpdGggbG9uZyBtZW1vcmllcyBtYXkgcmVtZW1iZXIgdGhhdCBJIHRob3VnaHQgdGhpcyB3YXMKLWEgYmFkIGlkZWEsIG9uY2UgdXBvbiBhIHRpbWUsIGFuZCBJJ20gc3RpbGwgbm90IGNvbWZvcnRhYmxlIHdpdGgKLWl0LCBidXQgaXQgaXMgZGlmZmljdWx0IHRvIHNlZSBob3cgdG8gYGRvIHRoZSByaWdodCB0aGluZycgd2l0aCBhbGwKLW9mIGAlLi5pJywgdW5sZXNzIHdlIFVSTC1lc2NhcGUgZXZlcnl0aGluZyBhbmQgYnJlYWsgd2l0aCBDTEYuCi0KLTxQPgotCi1UaGUgZm9ybXMgb2YgY29uZGl0aW9uIGFyZSBhIGxpc3Qgb2YgSFRUUCBzdGF0dXMgY29kZXMsIHdoaWNoIG1heQotb3IgbWF5IG5vdCBiZSBwcmVjZWRlZCBieSBgIScuICBUaHVzLCBgJTQwMCw1MDF7VXNlci1hZ2VudH1pJyBsb2dzCi1Vc2VyLWFnZW50OiBvbiA0MDAgZXJyb3JzIGFuZCA1MDEgZXJyb3JzIChCYWQgUmVxdWVzdCwgTm90Ci1JbXBsZW1lbnRlZCkgb25seTsgYCUhMjAwLDMwNCwzMDJ7UmVmZXJlcn1pJyBsb2dzIFJlZmVyZXI6IG9uIGFsbAotcmVxdWVzdHMgd2hpY2ggZGlkIDxiPm5vdDwvYj4gcmV0dXJuIHNvbWUgc29ydCBvZiBub3JtYWwgc3RhdHVzLgotCi08UD4KLQotVGhlIGRlZmF1bHQgTG9nRm9ybWF0IHJlcHJvZHVjZXMgQ0xGOyBzZWUgYmVsb3cuCi0KLTxQPgotCi1UaGUgd2F5IHRoaXMgaXMgc3VwcG9zZWQgdG8gd29yayB3aXRoIHZpcnR1YWwgaG9zdHMgaXMgYXMgZm9sbG93czoKLWEgdmlydHVhbCBob3N0IGNhbiBoYXZlIGl0cyBvd24gTG9nRm9ybWF0LCBvciBpdHMgb3duIFRyYW5zZmVyTG9nLgotSWYgaXQgZG9lc24ndCBoYXZlIGl0cyBvd24gTG9nRm9ybWF0LCBpdCBpbmhlcml0cyBmcm9tIHRoZSBtYWluCi1zZXJ2ZXIuICBJZiBpdCBkb2Vzbid0IGhhdmUgaXRzIG93biBUcmFuc2ZlckxvZywgaXQgd3JpdGVzIHRvIHRoZQotc2FtZSBkZXNjcmlwdG9yIChtZWFuaW5nIHRoZSBzYW1lIHByb2Nlc3MgZm9yIGB8IC4uLicpLgotCi08UD4KLQotVGhhdCBtZWFucyB0aGF0IHlvdSBjYW4gZG8gdGhpbmdzIGxpa2U6Ci0KLTxibG9ja3F1b3RlPjxjb2RlPgotJmx0O1ZpcnR1YWxIb3N0IGhvc3RhLmNvbSZndDs8YnI+Ci1Mb2dGb3JtYXQgImhvc3RhIC4uLiI8YnI+Ci0uLi48YnI+Ci0mbHQ7L1ZpcnR1YWxIb3N0Jmd0Ozxicj4KLTxicj4KLSZsdDtWaXJ0dWFsSG9zdCBob3N0YS5jb20mZ3Q7PGJyPgotTG9nRm9ybWF0ICJob3N0YiAuLi4iPGJyPgotLi4uPGJyPgotJmx0Oy9WaXJ0dWFsSG9zdCZndDs8L2NvZGU+PC9ibG9ja3F1b3RlPgotCi0uLi4gdG8gaGF2ZSBkaWZmZXJlbnQgdmlydHVhbCBzZXJ2ZXJzIHdyaXRlIGludG8gdGhlIHNhbWUgbG9nIGZpbGUsCi1idXQgaGF2ZSBzb21lIGluZGljYXRpb24gd2hpY2ggaG9zdCB0aGV5IGNhbWUgZnJvbSwgdGhvdWdoIGEgJXYKLWRpcmVjdGl2ZSBtYXkgd2VsbCBiZSBhIGJldHRlciB3YXkgdG8gaGFuZGxlIHRoaXMuICBMb29rIGZvciBtb3JlCi1jaGFuZ2VzIHRvIGNvbWUgdG8gdGhpcyBmb3JtYXQuPHA+Ci0KLQotPCEtLSVoeXBlcnRleHQgLS0+Ci0KLTxoMj5EaXJlY3RpdmVzPC9oMj4KLQotPHVsPgotPGxpPjxBIEhSRUY9IiNsb2dmb3JtYXQiPkxvZ0Zvcm1hdDwvQT4KLTxsaT48QSBIUkVGPSIjdHJhbnNmZXJsb2ciPlRyYW5zZmVyTG9nPC9BPgotPC91bD4KLTxocj4KLTwhLS0vJWh5cGVydGV4dCAtLT4KLQotPEEgbmFtZT0ibG9nZm9ybWF0Ij48aDI+TG9nRm9ybWF0PC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgTG9nRm9ybWF0fSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IExvZ0Zvcm1hdCA8ZW0+c3RyaW5nPC9lbT48YnI+Ci08c3Ryb25nPkRlZmF1bHQ6PC9zdHJvbmc+IDxjb2RlPkxvZ0Zvcm1hdCAmcXVvdDslaCAlbCAldSAldCBcJnF1b3Q7JXJcJnF1b3Q7Ci0lcyAlYiZxdW90OzwvY29kZT48YnI+Ci08U3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBFeHBlcmltZW50YWw8YnI+Ci08c3Ryb25nPk1vZHVsZTo8L3N0cm9uZz4gbW9kX2xvZ19jb25maWc8cD4KLQotVGhpcyBzZXRzIHRoZSBmb3JtYXQgb2YgdGhlIGxvZ2ZpbGUuPHA+PGhyPgotCi0KLTxBIG5hbWU9InRyYW5zZmVybG9nIj48aDI+VHJhbnNmZXJMb2c8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBUcmFuc2ZlckxvZ30gZGlyZWN0aXZlJmd0OyAtLT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBUcmFuc2ZlckxvZyA8ZW0+ZmlsZS1waXBlPC9lbT48YnI+Ci08c3Ryb25nPkRlZmF1bHQ6PC9zdHJvbmc+IDxjb2RlPlRyYW5zZmVyTG9nIGxvZ3MvdHJhbnNmZXJfbG9nPC9jb2RlPjxicj4KLTxTdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IEV4cGVyaW1lbnRhbDxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfbG9nX2NvbmZpZzxwPgotCi1UaGUgVHJhbnNmZXJMb2cgZGlyZWN0aXZlIHNldHMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gd2hpY2ggdGhlIHNlcnZlciB3aWxsCi1sb2cgdGhlIGluY29taW5nIHJlcXVlc3RzLiA8ZW0+RmlsZS1waXBlPC9lbT4gaXMgb25lCi1vZgotPGRsPjxkdD5BIGZpbGVuYW1lCi08ZGQ+QSBmaWxlbmFtZSByZWxhdGl2ZSB0byB0aGUgPEEgSFJFRj0iY29yZS5odG1sI3NlcnZlcnJvb3QiPlNlcnZlclJvb3Q8L0E+LgotPGR0PiBgfCcgZm9sbG93ZWQgYnkgYSBjb21tYW5kCi08ZGQ+QSBwcm9ncmFtIHRvIHJlY2VpdmUgdGhlIGFnZW50IGxvZyBpbmZvcm1hdGlvbiBvbiBpdHMgc3RhbmRhcmQgaW5wdXQuCi1Ob3RlIHRoZSBhIG5ldyBwcm9ncmFtIHdpbGwgbm90IGJlIHN0YXJ0ZWQgZm9yIGEgVmlydHVhbEhvc3QgaWYgaXQgaW5oZXJpdHMKLXRoZSBUcmFuc2ZlckxvZyBmcm9tIHRoZSBtYWluIHNlcnZlci4KLTwvZGw+Ci08c3Ryb25nPlNlY3VyaXR5Ojwvc3Ryb25nPiBpZiBhIHByb2dyYW0gaXMgdXNlZCwgdGhlbiBpdCB3aWxsIGJlCi1ydW4gdW5kZXIgdGhlIHVzZXIgd2hvIHN0YXJ0ZWQgaHR0cGQuIFRoaXMgd2lsbCBiZSByb290IGlmIHRoZSBzZXJ2ZXIKLXdhcyBzdGFydGVkIGJ5IHJvb3Q7IGJlIHN1cmUgdGhhdCB0aGUgcHJvZ3JhbSBpcyBzZWN1cmUuPHA+Ci0KLTwhLS0laHlwZXJ0ZXh0IC0tPgotPGhyPgotPEEgSFJFRj0iLi4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9ob21lLmdpZiIgQUxUPSJIb21lIj48L0E+Ci08QSBIUkVGPSIuLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfaW5kZXguZ2lmIiBBTFQ9IkluZGV4Ij48L0E+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KLTwhLS0vJWh5cGVydGV4dCAtLT4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfbG9nX2NvbmZpZy54bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2xvZ19jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2MzODA5Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfbG9nX2NvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveHNsIiBocmVmPSIuLi9zdHlsZS9tYW51YWwueHNsIj8+Ci08bW9kdWxlc3lub3BzaXM+Ci0KLTxuYW1lPm1vZF9sb2dfY29uZmlnPC9uYW1lPgotPHN0YXR1cz5CYXNlPC9zdGF0dXM+Ci08aWRlbnRpZmllcj5sb2dfY29uZmlnX21vZHVsZTwvaWRlbnRpZmllcj4KLTxjb21wYXRpYmlsaXR5PjwvY29tcGF0aWJpbGl0eT4KLQotPGRlc2NyaXB0aW9uPlRoaXMgbW9kdWxlIHByb3ZpZGVzIGZvciBsb2dnaW5nIG9mIHRoZSByZXF1ZXN0cyAKLW1hZGUgdG8gdGhlIHNlcnZlciwgdXNpbmcgdGhlIENvbW1vbiBMb2cgRm9ybWF0IG9yIGEgCi11c2VyLXNwZWNpZmllZCBmb3JtYXQuPC9kZXNjcmlwdGlvbj4KLQotPHN1bW1hcnk+Ci0KLSAgICA8cD5UaGlzIG1vZHVsZSBwcm92aWRlcyBmb3IgZmxleGlibGUgbG9nZ2luZyBvZiBjbGllbnQKLSAgICByZXF1ZXN0cy4gTG9ncyBhcmUgd3JpdHRlbiBpbiBhIGN1c3RvbWl6YWJsZSBmb3JtYXQsIGFuZCBtYXkgYmUKLSAgICB3cml0dGVuIGRpcmVjdGx5IHRvIGEgZmlsZSwgb3IgdG8gYW4gZXh0ZXJuYWwgcHJvZ3JhbS4KLSAgICBDb25kaXRpb25hbCBsb2dnaW5nIGlzIHByb3ZpZGVkIHNvIHRoYXQgaW5kaXZpZHVhbCByZXF1ZXN0cyBtYXkKLSAgICBiZSBpbmNsdWRlZCBvciBleGNsdWRlZCBmcm9tIHRoZSBsb2dzIGJhc2VkIG9uIGNoYXJhY3RlcmlzdGljcwotICAgIG9mIHRoZSByZXF1ZXN0LjwvcD4KLQotICAgIDxwPlRocmVlIGRpcmVjdGl2ZXMgYXJlIHByb3ZpZGVkIGJ5IHRoaXMgbW9kdWxlOgotICAgIDxjb2RlPlRyYW5zZmVyTG9nPC9jb2RlPiB0byBjcmVhdGUgYSBsb2cgZmlsZSwKLSAgICA8Y29kZT5Mb2dGb3JtYXQ8L2NvZGU+IHRvIHNldCBhIGN1c3RvbSBmb3JtYXQsIGFuZAotICAgIDxjb2RlPkN1c3RvbUxvZzwvY29kZT4gdG8gZGVmaW5lIGEgbG9nIGZpbGUgYW5kIGZvcm1hdCBpbiBvbmUKLSAgICBzdGVwLiBUaGUgPGNvZGU+VHJhbnNmZXJMb2c8L2NvZGU+IGFuZCA8Y29kZT5DdXN0b21Mb2c8L2NvZGU+Ci0gICAgZGlyZWN0aXZlcyBjYW4gYmUgdXNlZCBtdWx0aXBsZSB0aW1lcyBpbiBlYWNoIHNlcnZlciB0byBjYXVzZQotICAgIGVhY2ggcmVxdWVzdCB0byBiZSBsb2dnZWQgdG8gbXVsdGlwbGUgZmlsZXMuPC9wPgotCi08c2VlYWxzbz48c3Ryb25nPlNlZSBhbHNvPC9zdHJvbmc+OiAKLTxhIGhyZWY9Ii4uL2xvZ3MuaHRtbCI+QXBhY2hlIExvZyBGaWxlczwvYT4uPC9zZWVhbHNvPgotCi08c2VjdGlvbj4KLTx0aXRsZT5DdXN0b20gTG9nIEZvcm1hdHM8L3RpdGxlPgotCi0gICAgPHA+VGhlIGZvcm1hdCBhcmd1bWVudCB0byB0aGUgPGNvZGU+TG9nRm9ybWF0PC9jb2RlPiBhbmQKLSAgICA8Y29kZT5DdXN0b21Mb2c8L2NvZGU+IGRpcmVjdGl2ZXMgaXMgYSBzdHJpbmcuIFRoaXMgc3RyaW5nIGlzCi0gICAgbG9nZ2VkIHRvIHRoZSBsb2cgZmlsZSBmb3IgZWFjaCByZXF1ZXN0LiBJdCBjYW4gY29udGFpbiBsaXRlcmFsCi0gICAgY2hhcmFjdGVycyBjb3BpZWQgaW50byB0aGUgbG9nIGZpbGVzIGFuZCB0aGUgYy10eXBlIGNvbnRyb2wKLSAgICBjaGFyYWN0ZXJzICJcbiIgYW5kICJcdCIgdG8gcmVwcmVzZW50IG5ldy1saW5lcyBhbmQgdGFicy4KLSAgICBMaXRlcmFsIHF1b3RlcyBhbmQgYmFjay1zbGFzaGVzIHNob3VsZCBiZSBlc2NhcGVkIHdpdGgKLSAgICBiYWNrLXNsYXNoZXMuPC9wPgotCi0gICAgPHA+VGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgcmVxdWVzdCBpdHNlbGYgYXJlIGxvZ2dlZCBieQotICAgIHBsYWNpbmcgIiUiIGRpcmVjdGl2ZXMgaW4gdGhlIGZvcm1hdCBzdHJpbmcsIHdoaWNoIGFyZSByZXBsYWNlZAotICAgIGluIHRoZSBsb2cgZmlsZSBieSB0aGUgdmFsdWVzIGFzIGZvbGxvd3M6PC9wPgotCi08dGFibGU+Ci0KLTx0cj48dGQ+JS4uLmE6PC90ZD4gICAgICAgICAgCi08dGQ+UmVtb3RlIElQLWFkZHJlc3M8L3RkPjwvdHI+Ci0KLTx0cj48dGQ+JS4uLkE6PC90ZD4gICAgICAgICAgCi08dGQ+TG9jYWwgSVAtYWRkcmVzczwvdGQ+PC90cj4KLQotPHRyPjx0ZD4lLi4uQjo8L3RkPiAgICAgICAgICAKLTx0ZD5CeXRlcyBzZW50LCBleGNsdWRpbmcgSFRUUCBoZWFkZXJzLjwvdGQ+PC90cj4KLQotPHRyPjx0ZD4lLi4uYjo8L3RkPiAgICAgICAgICAKLTx0ZD5CeXRlcyBzZW50LCBleGNsdWRpbmcgSFRUUCBoZWFkZXJzLiBJbiBDTEYgZm9ybWF0Ci1pLmUuIGEgJy0nIHJhdGhlciB0aGFuIGEgMCB3aGVuIG5vIGJ5dGVzIGFyZSBzZW50LjwvdGQ+PC90cj4KLQotPHRyPjx0ZD4lLi4ue0Zvb2Jhcn1DOjwvdGQ+ICAKLTx0ZD5UaGUgY29udGVudHMgb2YgY29va2llICJGb29iYXIiIGluIHRoZSByZXF1ZXN0IHNlbnQgdG8gdGhlIHNlcnZlci48L3RkPjwvdHI+Ci0KLTx0cj48dGQ+JS4uLkQ6PC90ZD4gICAgICAgICAgCi08dGQ+VGhlIHRpbWUgdGFrZW4gdG8gc2VydmUgdGhlIHJlcXVlc3QsIGluIG1pY3Jvc2Vjb25kcy48L3RkPjwvdHI+Ci0KLTx0cj48dGQ+JS4uLntGT09CQVJ9ZTo8L3RkPiAgCi08dGQ+VGhlIGNvbnRlbnRzIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBGT09CQVI8L3RkPjwvdHI+Ci0KLTx0cj48dGQ+JS4uLmY6PC90ZD4gICAgICAgICAgCi08dGQ+RmlsZW5hbWU8L3RkPjwvdHI+Ci0KLTx0cj48dGQ+JS4uLmg6PC90ZD4gICAgICAgICAgCi08dGQ+UmVtb3RlIGhvc3Q8L3RkPjwvdHI+Ci0KLTx0cj48dGQ+JS4uLkg8L3RkPiAgICAgICAgICAKLTx0ZD5UaGUgcmVxdWVzdCBwcm90b2NvbDwvdGQ+PC90cj4KLQotPHRyPjx0ZD4lLi4ue0Zvb2Jhcn1pOjwvdGQ+ICAKLTx0ZD5UaGUgY29udGVudHMgb2YgRm9vYmFyOiBoZWFkZXIgbGluZShzKSBpbiB0aGUgcmVxdWVzdAotc2VudCB0byB0aGUgc2VydmVyLjwvdGQ+PC90cj4KLQotPHRyPjx0ZD4lLi4ubDo8L3RkPiAgICAgICAgICAKLTx0ZD5SZW1vdGUgbG9nbmFtZSAoZnJvbSBpZGVudGQsIGlmIHN1cHBsaWVkKTwvdGQ+PC90cj4KLQotPHRyPjx0ZD4lLi4ubTo8L3RkPiAgICAgICAgICAKLTx0ZD5UaGUgcmVxdWVzdCBtZXRob2Q8L3RkPjwvdHI+Ci0KLTx0cj48dGQ+JS4uLntGb29iYXJ9bjo8L3RkPiAgCi08dGQ+VGhlIGNvbnRlbnRzIG9mIG5vdGUgIkZvb2JhciIgZnJvbSBhbm90aGVyIG1vZHVsZS48L3RkPjwvdHI+Ci0KLTx0cj48dGQ+JS4uLntGb29iYXJ9bzo8L3RkPiAgCi08dGQ+VGhlIGNvbnRlbnRzIG9mIEZvb2JhcjogaGVhZGVyIGxpbmUocykgaW4gdGhlIHJlcGx5LjwvdGQ+PC90cj4KLQotPHRyPjx0ZD4lLi4ucDo8L3RkPiAgICAgICAgICAKLTx0ZD5UaGUgY2Fub25pY2FsIFBvcnQgb2YgdGhlIHNlcnZlciBzZXJ2aW5nIHRoZSByZXF1ZXN0PC90ZD48L3RyPgotCi08dHI+PHRkPiUuLi5QOjwvdGQ+ICAgICAgICAgIAotPHRkPlRoZSBwcm9jZXNzIElEIG9mIHRoZSBjaGlsZCB0aGF0IHNlcnZpY2VkIHRoZSByZXF1ZXN0LjwvdGQ+PC90cj4KLQotPHRyPjx0ZD4lLi4ucTo8L3RkPiAgICAgICAgICAKLTx0ZD5UaGUgcXVlcnkgc3RyaW5nIChwcmVwZW5kZWQgd2l0aCBhID8gaWYgYSBxdWVyeSBzdHJpbmcgZXhpc3RzLAotb3RoZXJ3aXNlIGFuIGVtcHR5IHN0cmluZyk8L3RkPjwvdHI+Ci0KLTx0cj48dGQ+JS4uLnI6PC90ZD4gICAgICAgICAgCi08dGQ+Rmlyc3QgbGluZSBvZiByZXF1ZXN0PC90ZD48L3RyPgotCi08dHI+PHRkPiUuLi5zOjwvdGQ+ICAgICAgICAgIAotPHRkPlN0YXR1cy4gIEZvciByZXF1ZXN0cyB0aGF0IGdvdCBpbnRlcm5hbGx5IHJlZGlyZWN0ZWQsIHRoaXMgaXMKLXRoZSBzdGF0dXMgb2YgdGhlICpvcmlnaW5hbCogcmVxdWVzdCAtLS0gJS4uLiZndDtzIGZvciB0aGUgbGFzdC48L3RkPjwvdHI+Ci0KLTx0cj48dGQ+JS4uLnQ6PC90ZD4gICAgICAgICAgCi08dGQ+VGltZSwgaW4gY29tbW9uIGxvZyBmb3JtYXQgdGltZSBmb3JtYXQgKHN0YW5kYXJkIGVuZ2xpc2ggZm9ybWF0KTwvdGQ+PC90cj4KLQotPHRyPjx0ZD4lLi4ue2Zvcm1hdH10OjwvdGQ+ICAKLTx0ZD5UaGUgdGltZSwgaW4gdGhlIGZvcm0gZ2l2ZW4gYnkgZm9ybWF0LCB3aGljaCBzaG91bGQKLWJlIGluIHN0cmZ0aW1lKDMpIGZvcm1hdC4gKHBvdGVudGlhbGx5IGxvY2FsaXplZCk8L3RkPjwvdHI+Ci0KLTx0cj48dGQ+JS4uLlQ6PC90ZD4gICAgICAgICAgCi08dGQ+VGhlIHRpbWUgdGFrZW4gdG8gc2VydmUgdGhlIHJlcXVlc3QsIGluIHNlY29uZHMuPC90ZD48L3RyPgotCi08dHI+PHRkPiUuLi51OjwvdGQ+ICAgICAgICAgIAotPHRkPlJlbW90ZSB1c2VyIChmcm9tIGF1dGg7IG1heSBiZSBib2d1cyBpZiByZXR1cm4gc3RhdHVzICglcykgaXMgNDAxKTwvdGQ+PC90cj4KLQotPHRyPjx0ZD4lLi4uVTo8L3RkPiAgICAgICAgICAKLTx0ZD5UaGUgVVJMIHBhdGggcmVxdWVzdGVkLCBub3QgaW5jbHVkaW5nIGFueSBxdWVyeSBzdHJpbmcuPC90ZD48L3RyPgotCi08dHI+PHRkPiUuLi52OjwvdGQ+ICAgICAgICAgIAotPHRkPlRoZSBjYW5vbmljYWwgU2VydmVyTmFtZSBvZiB0aGUgc2VydmVyIHNlcnZpbmcgdGhlIHJlcXVlc3QuPC90ZD48L3RyPgotCi08dHI+PHRkPiUuLi5WOjwvdGQ+ICAgICAgICAgIAotPHRkPlRoZSBzZXJ2ZXIgbmFtZSBhY2NvcmRpbmcgdG8gdGhlIFVzZUNhbm9uaWNhbE5hbWUgc2V0dGluZy48L3RkPjwvdHI+Ci0KLTx0cj48dGQ+JS4uLlg6PC90ZD4gICAgICAgICAgCi08dGQ+Q29ubmVjdGlvbiBzdGF0dXMgd2hlbiByZXNwb25zZSBpcyBjb21wbGV0ZWQuCi08ZXhhbXBsZT4KLSdYJyA9IGNvbm5lY3Rpb24gYWJvcnRlZCBiZWZvcmUgdGhlIHJlc3BvbnNlIGNvbXBsZXRlZC48YnIgLz4KLScrJyA9IGNvbm5lY3Rpb24gbWF5IGJlIGtlcHQgYWxpdmUgYWZ0ZXIgdGhlIHJlc3BvbnNlIGlzIHNlbnQuPGJyIC8+Ci0nLScgPSBjb25uZWN0aW9uIHdpbGwgYmUgY2xvc2VkIGFmdGVyIHRoZSByZXNwb25zZSBpcyBzZW50LgotPC9leGFtcGxlPgotKFRoaXMgZGlyZWN0aXZlIHdhcyAlLi4uYyBpbiBsYXRlIHZlcnNpb25zIG9mIEFwYWNoZSAxLjMsIGJ1dAotdGhpcyBjb25mbGljdGVkIHdpdGggdGhlIGhpc3RvcmljYWwgc3NsICUuLi57dmFyfWMgc3ludGF4Lik8L3RkPjwvdHI+Ci0KLTwvdGFibGU+Ci0KLSAgICA8cD5UaGUgIi4uLiIgY2FuIGJlIG5vdGhpbmcgYXQgYWxsICg8ZW0+ZS5nLjwvZW0+LCA8Y29kZT4iJWggJXUKLSAgICAlciAlcyAlYiI8L2NvZGU+KSwgb3IgaXQgY2FuIGluZGljYXRlIGNvbmRpdGlvbnMgZm9yIGluY2x1c2lvbgotICAgIG9mIHRoZSBpdGVtICh3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGJlIHJlcGxhY2VkIHdpdGggIi0iIGlmIHRoZQotICAgIGNvbmRpdGlvbiBpcyBub3QgbWV0KS4gVGhlIGZvcm1zIG9mIGNvbmRpdGlvbiBhcmUgYSBsaXN0IG9mCi0gICAgSFRUUCBzdGF0dXMgY29kZXMsIHdoaWNoIG1heSBvciBtYXkgbm90IGJlIHByZWNlZGVkIGJ5ICIhIi4KLSAgICBUaHVzLCAiJTQwMCw1MDF7VXNlci1hZ2VudH1pIiBsb2dzIFVzZXItYWdlbnQ6IG9uIDQwMCBlcnJvcnMKLSAgICBhbmQgNTAxIGVycm9ycyAoQmFkIFJlcXVlc3QsIE5vdCBJbXBsZW1lbnRlZCkgb25seTsKLSAgICAiJSEyMDAsMzA0LDMwMntSZWZlcmVyfWkiIGxvZ3MgUmVmZXJlcjogb24gYWxsIHJlcXVlc3RzIHdoaWNoCi0gICAgZGlkIDxzdHJvbmc+bm90PC9zdHJvbmc+IHJldHVybiBzb21lIHNvcnQgb2Ygbm9ybWFsIHN0YXR1cy48L3A+Ci0KLSAgICA8cD5Ob3RlIHRoYXQgdGhlcmUgaXMgbm8gZXNjYXBpbmcgcGVyZm9ybWVkIG9uIHRoZSBzdHJpbmdzIGZyb20KLSAgICAlLi4uciwgJS4uLmkgYW5kICUuLi5vLiBUaGlzIGlzIG1haW5seSB0byBjb21wbHkgd2l0aCB0aGUKLSAgICByZXF1aXJlbWVudHMgb2YgdGhlIENvbW1vbiBMb2cgRm9ybWF0LiBUaGlzIGltcGxpZXMgdGhhdAotICAgIGNsaWVudHMgY2FuIGluc2VydCBjb250cm9sIGNoYXJhY3RlcnMgaW50byB0aGUgbG9nLCBzbyBjYXJlCi0gICAgc2hvdWxkIGJlIHRha2VuIHdoZW4gZGVhbGluZyB3aXRoIHJhdyBsb2cgZmlsZXMuPC9wPgotCi0gICAgPHA+U29tZSBjb21tb25seSB1c2VkIGxvZyBmb3JtYXQgc3RyaW5ncyBhcmU6PC9wPgotCi0gICAgPGRsPgotICAgICAgPGR0PkNvbW1vbiBMb2cgRm9ybWF0IChDTEYpPC9kdD4KLQotICAgICAgPGRkPjxjb2RlPiIlaCAlbCAldSAldCBcIiVyXCIgJSZndDtzICViIjwvY29kZT48L2RkPgotCi0gICAgICA8ZHQ+Q29tbW9uIExvZyBGb3JtYXQgd2l0aCBWaXJ0dWFsIEhvc3Q8L2R0PgotCi0gICAgICA8ZGQ+PGNvZGU+IiV2ICVoICVsICV1ICV0IFwiJXJcIiAlJmd0O3MgJWIiPC9jb2RlPjwvZGQ+Ci0KLSAgICAgIDxkdD5OQ1NBIGV4dGVuZGVkL2NvbWJpbmVkIGxvZyBmb3JtYXQ8L2R0PgotCi0gICAgICA8ZGQ+PGNvZGU+IiVoICVsICV1ICV0IFwiJXJcIiAlJmd0O3MgJWIgXCIle1JlZmVyZXJ9aVwiCi0gICAgICBcIiV7VXNlci1hZ2VudH1pXCIiPC9jb2RlPjwvZGQ+Ci0KLSAgICAgIDxkdD5SZWZlcmVyIGxvZyBmb3JtYXQ8L2R0PgotCi0gICAgICA8ZGQ+PGNvZGU+IiV7UmVmZXJlcn1pIC0mZ3Q7ICVVIjwvY29kZT48L2RkPgotCi0gICAgICA8ZHQ+QWdlbnQgKEJyb3dzZXIpIGxvZyBmb3JtYXQ8L2R0PgotCi0gICAgICA8ZGQ+PGNvZGU+IiV7VXNlci1hZ2VudH1pIjwvY29kZT48L2RkPgotICAgIDwvZGw+Ci0KLSAgICA8cD5Ob3RlIHRoYXQgdGhlIGNhbm9uaWNhbCA8YQotICAgIGhyZWY9ImNvcmUuaHRtbCNzZXJ2ZXJuYW1lIj5TZXJ2ZXJOYW1lPC9hPiBhbmQgPGEKLSAgICBocmVmPSJtcG1fY29tbW9uLmh0bWwjbGlzdGVuIj5MaXN0ZW48L2E+IG9mIHRoZSBzZXJ2ZXIgc2VydmluZyB0aGUKLSAgICByZXF1ZXN0IGFyZSB1c2VkIGZvciA8Y29kZT4ldjwvY29kZT4gYW5kIDxjb2RlPiVwPC9jb2RlPgotICAgIHJlc3BlY3RpdmVseS4gVGhpcyBoYXBwZW5zIHJlZ2FyZGxlc3Mgb2YgdGhlIDxhCi0gICAgaHJlZj0iY29yZS5odG1sI3VzZWNhbm9uaWNhbG5hbWUiPlVzZUNhbm9uaWNhbE5hbWU8L2E+IHNldHRpbmcKLSAgICBiZWNhdXNlIG90aGVyd2lzZSBsb2cgYW5hbHlzaXMgcHJvZ3JhbXMgd291bGQgaGF2ZSB0byBkdXBsaWNhdGUKLSAgICB0aGUgZW50aXJlIHZob3N0IG1hdGNoaW5nIGFsZ29yaXRobSBpbiBvcmRlciB0byBkZWNpZGUgd2hhdAotICAgIGhvc3QgcmVhbGx5IHNlcnZlZCB0aGUgcmVxdWVzdC48L3A+Ci0gICAgPC9zZWN0aW9uPgotCi0gICAgPHNlY3Rpb24+Ci0KLSAgICA8dGl0bGU+U2VjdXJpdHkgQ29uc2lkZXJhdGlvbnM8L3RpdGxlPgotCi0gICAgPHA+U2VlIHRoZSA8YQotICAgIGhyZWY9Ii4uL21pc2Mvc2VjdXJpdHlfdGlwcy5odG1sI3NlcnZlcnJvb3QiPnNlY3VyaXR5IHRpcHM8L2E+Ci0gICAgZG9jdW1lbnQgZm9yIGRldGFpbHMgb24gd2h5IHlvdXIgc2VjdXJpdHkgY291bGQgYmUgY29tcHJvbWlzZWQKLSAgICBpZiB0aGUgZGlyZWN0b3J5IHdoZXJlIGxvZ2ZpbGVzIGFyZSBzdG9yZWQgaXMgd3JpdGFibGUgYnkKLSAgICBhbnlvbmUgb3RoZXIgdGhhbiB0aGUgdXNlciB0aGF0IHN0YXJ0cyB0aGUgc2VydmVyLjwvcD4KLQotICAgIDwvc2VjdGlvbj4KLQotPC9zdW1tYXJ5PgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5Db29raWVMb2c8L25hbWU+Ci08ZGVzY3JpcHRpb24+U2V0cyBmaWxlbmFtZSBmb3IgdGhlIGxvZ2dpbmcgb2YgY29va2llczwvZGVzY3JpcHRpb24+Ci08c3ludGF4PkNvb2tpZUxvZyA8ZW0+ZmlsZW5hbWU8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+PGk+bm9uZTwvaT48L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsCi1ob3N0PC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci08Y29tcGF0aWJpbGl0eT5Pbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUgMS4yIGFuZCBhYm92ZTwvY29tcGF0aWJpbGl0eT4KLQotPHVzYWdlPgotCi0gICAgPHA+VGhlIDxkaXJlY3RpdmU+Q29va2llTG9nPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBzZXRzIHRoZSAKLSAgICBmaWxlbmFtZSBmb3IgbG9nZ2luZyBvZiBjb29raWVzLiBUaGUgZmlsZW5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlCi0gICAgPGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiPnNlcnZlcnJvb3Q8L2RpcmVjdGl2ZT4uIFRoaXMgZGlyZWN0aXZlIGlzCi0gICAgaW5jbHVkZWQgb25seSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIDxtb2R1bGU+bW9kX2Nvb2tpZXM8L21vZHVsZT4sCi0gICAgYW5kIGlzIGRlcHJlY2F0ZWQuPC9wPgotPC91c2FnZT4KLQotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+Q3VzdG9tTG9nPC9uYW1lPgotPGRlc2NyaXB0aW9uPlNldHMgZmlsZW5hbWUgYW5kIGZvcm1hdCBvZiBsb2cgZmlsZTwvZGVzY3JpcHRpb24+Ci08c3ludGF4PkN1c3RvbUxvZyAKLSAgICA8ZW0+ZmlsZTwvZW0+fDxlbT5waXBlPC9lbT4gPGVtPmZvcm1hdDwvZW0+fDxlbT5uaWNrbmFtZTwvZW0+Ci0gICAgW2Vudj1bIV08ZW0+ZW52aXJvbm1lbnQtdmFyaWFibGU8L2VtPl08L3N5bnRheD4KLTxkZWZhdWx0PjxpPm5vbmU8L2k+PC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PGNvbnRleHQ+dmlydHVhbAotaG9zdDwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPGNvbXBhdGliaWxpdHk+Tmlja25hbWUgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDEuMyBvciBsYXRlci4KLUNvbmRpdGlvbmFsIGxvZ2dpbmcgYXZhaWxhYmxlIGluIDEuMy41IG9yIGxhdGVyLjwvY29tcGF0aWJpbGl0eT4KLQotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIDxkaXJlY3RpdmU+Q3VzdG9tTG9nPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBpcyB1c2VkIHRvCi0gICAgbG9nIHJlcXVlc3RzIHRvIHRoZSBzZXJ2ZXIuIEEgbG9nIGZvcm1hdCBpcyBzcGVjaWZpZWQsIGFuZCB0aGUKLSAgICBsb2dnaW5nIGNhbiBvcHRpb25hbGx5IGJlIG1hZGUgY29uZGl0aW9uYWwgb24gcmVxdWVzdAotICAgIGNoYXJhY3RlcmlzdGljcyB1c2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuPC9wPgotCi0gICAgPHA+VGhlIGZpcnN0IGFyZ3VtZW50LCB3aGljaCBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIHRvIHdoaWNoCi0gICAgdGhlIGxvZ3Mgd2lsbCBiZSB3cml0dGVuLCBjYW4gdGFrZSBvbiBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28KLSAgICB0eXBlcyBvZiB2YWx1ZXM6PC9wPgotCi0gICAgPGRsPgotICAgICAgPGR0PjxlbT5maWxlPC9lbT48L2R0PgotCi0gICAgICA8ZGQ+QSBmaWxlbmFtZSwgcmVsYXRpdmUgdG8gdGhlIDxhCi0gICAgICBocmVmPSJjb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvYT4uPC9kZD4KLQotICAgICAgPGR0PjxlbT5waXBlPC9lbT48L2R0PgotCi0gICAgICA8ZGQ+VGhlIHBpcGUgY2hhcmFjdGVyICI8Y29kZT58PC9jb2RlPiIsIGZvbGxvd2VkIGJ5IHRoZSBwYXRoCi0gICAgICB0byBhIHByb2dyYW0gdG8gcmVjZWl2ZSB0aGUgbG9nIGluZm9ybWF0aW9uIG9uIGl0cyBzdGFuZGFyZAotICAgICAgaW5wdXQuIDxzdHJvbmc+U2VjdXJpdHk6PC9zdHJvbmc+IGlmIGEgcHJvZ3JhbSBpcyB1c2VkLCB0aGVuCi0gICAgICBpdCB3aWxsIGJlIHJ1biB1bmRlciB0aGUgdXNlciB3aG8gc3RhcnRlZCBodHRwZC4gVGhpcyB3aWxsIGJlCi0gICAgICByb290IGlmIHRoZSBzZXJ2ZXIgd2FzIHN0YXJ0ZWQgYnkgcm9vdDsgYmUgc3VyZSB0aGF0IHRoZQotICAgICAgcHJvZ3JhbSBpcyBzZWN1cmUuPC9kZD4KLSAgICA8L2RsPgotCi0gICAgPHA+VGhlIHNlY29uZCBhcmd1bWVudCBzcGVjaWZpZXMgd2hhdCB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlCi0gICAgbG9nIGZpbGUuIEl0IGNhbiBzcGVjaWZ5IGVpdGhlciBhIDxlbT5uaWNrbmFtZTwvZW0+IGRlZmluZWQgYnkKLSAgICBhIHByZXZpb3VzIDxhIGhyZWY9IiNsb2dmb3JtYXQiPkxvZ0Zvcm1hdDwvYT4gZGlyZWN0aXZlLCBvciBpdAotICAgIGNhbiBiZSBhbiBleHBsaWNpdCA8ZW0+Zm9ybWF0PC9lbT4gc3RyaW5nIGFzIGRlc2NyaWJlZCBpbiB0aGUKLSAgICA8YSBocmVmPSIjZm9ybWF0cyI+bG9nIGZvcm1hdHM8L2E+IHNlY3Rpb24uPC9wPgotCi0gICAgPHA+Rm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgdHdvIHNldHMgb2YgZGlyZWN0aXZlcyBoYXZlCi0gICAgZXhhY3RseSB0aGUgc2FtZSBlZmZlY3Q6PC9wPgotCi08ZXhhbXBsZT4KLSAgICAgIyBDdXN0b21Mb2cgd2l0aCBmb3JtYXQgbmlja25hbWU8YnIgLz4KLSAgICAgTG9nRm9ybWF0ICIlaCAlbCAldSAldCBcIiVyXCIgJSZndDtzICViIiBjb21tb248YnIgLz4KLSAgICAgQ3VzdG9tTG9nIGxvZ3MvYWNjZXNzX2xvZyBjb21tb248YnIgLz4KLTxiciAvPgotICAgICAjIEN1c3RvbUxvZyB3aXRoIGV4cGxpY2l0IGZvcm1hdCBzdHJpbmc8YnIgLz4KLSAgICAgQ3VzdG9tTG9nIGxvZ3MvYWNjZXNzX2xvZyAiJWggJWwgJXUgJXQgXCIlclwiICUmZ3Q7cyAlYiI8YnIgLz4KLTwvZXhhbXBsZT4KLQotICAgIDxwPlRoZSB0aGlyZCBhcmd1bWVudCBpcyBvcHRpb25hbCBhbmQgYWxsb3dzIHRoZSBkZWNpc2lvbiBvbgotICAgIHdoZXRoZXIgb3Igbm90IHRvIGxvZyBhIHBhcnRpY3VsYXIgcmVxdWVzdCB0byBiZSBiYXNlZCBvbiB0aGUKLSAgICBwcmVzZW5jZSBvciBhYnNlbmNlIG9mIGEgcGFydGljdWxhciB2YXJpYWJsZSBpbiB0aGUgc2VydmVyCi0gICAgZW52aXJvbm1lbnQuIElmIHRoZSBzcGVjaWZpZWQgPGEgaHJlZj0iLi4vZW52Lmh0bWwiPmVudmlyb25tZW50Ci0gICAgdmFyaWFibGU8L2E+IGlzIHNldCBmb3IgdGhlIHJlcXVlc3QgKG9yIGlzIG5vdCBzZXQsIGluIHRoZSBjYXNlCi0gICAgb2YgYSAnPGNvZGU+ZW52PSE8ZW0+bmFtZTwvZW0+PC9jb2RlPicgY2xhdXNlKSwgdGhlbiB0aGUKLSAgICByZXF1ZXN0IHdpbGwgYmUgbG9nZ2VkLjwvcD4KLQotICAgIDxwPkVudmlyb25tZW50IHZhcmlhYmxlcyBjYW4gYmUgc2V0IG9uIGEgPGVtPnBlcjwvZW0+LXJlcXVlc3QKLSAgICBiYXNpcyB1c2luZyB0aGUgPG1vZHVsZT5tb2Rfc2V0ZW52aWY8L21vZHVsZT4KLSAgICBhbmQvb3IgPG1vZHVsZT5tb2RfcmV3cml0ZTwvbW9kdWxlPiBtb2R1bGVzLiBGb3IKLSAgICBleGFtcGxlLCBpZiB5b3UgZG9uJ3Qgd2FudCB0byByZWNvcmQgcmVxdWVzdHMgZm9yIGFsbCBHSUYKLSAgICBpbWFnZXMgb24geW91ciBzZXJ2ZXIgaW4gYSBzZXBhcmF0ZSBsb2dmaWxlIGJ1dCBub3QgeW91ciBtYWluCi0gICAgbG9nLCB5b3UgY2FuIHVzZTo8L3A+Ci0gICAgCi08ZXhhbXBsZT4KLSAgICBTZXRFbnZJZiBSZXF1ZXN0X1VSSSBcLmdpZiQgZ2lmLWltYWdlPGJyIC8+Ci0gICAgQ3VzdG9tTG9nIGdpZi1yZXF1ZXN0cy5sb2cgY29tbW9uIGVudj1naWYtaW1hZ2U8YnIgLz4KLSAgICBDdXN0b21Mb2cgbm9uZ2lmLXJlcXVlc3RzLmxvZyBjb21tb24gZW52PSFnaWYtaW1hZ2UKLTwvZXhhbXBsZT4KLTwvdXNhZ2U+Ci0KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkxvZ0Zvcm1hdDwvbmFtZT4KLTxkZXNjcmlwdGlvbj5EZXNjcmliZXMgYSBmb3JtYXQgZm9yIHVzZSBpbiBhIGxvZyBmaWxlPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+TG9nRm9ybWF0Ci0gICAgPGVtPmZvcm1hdDwvZW0+fDxlbT5uaWNrbmFtZTwvZW0+IFs8ZW0+bmlja25hbWU8L2VtPl08L3N5bnRheD4KLTxkZWZhdWx0PjxpPm5vbmU8L2k+PC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PGNvbnRleHQ+dmlydHVhbAotaG9zdDwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPGNvbXBhdGliaWxpdHk+Tmlja25hbWUgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDEuMyBvciBsYXRlci4KLTwvY29tcGF0aWJpbGl0eT4KLQotPHVzYWdlPgotICAgIDxwPlRoaXMgZGlyZWN0aXZlIHNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIHRoZSBhY2Nlc3MgbG9nCi0gICAgZmlsZS48L3A+Ci0KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5Mb2dGb3JtYXQ8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIGNhbiB0YWtlIG9uZSBvZiB0d28KLSAgICBmb3Jtcy4gSW4gdGhlIGZpcnN0IGZvcm0sIHdoZXJlIG9ubHkgb25lIGFyZ3VtZW50IGlzIHNwZWNpZmllZCwKLSAgICB0aGlzIGRpcmVjdGl2ZSBzZXRzIHRoZSBsb2cgZm9ybWF0IHdoaWNoIHdpbGwgYmUgdXNlZCBieSBsb2dzCi0gICAgc3BlY2lmaWVkIGluIHN1YnNlcXVlbnQgPGRpcmVjdGl2ZT5UcmFuc2ZlckxvZzwvZGlyZWN0aXZlPgotICAgIGRpcmVjdGl2ZXMuIFRoZSBzaW5nbGUgYXJndW1lbnQgY2FuIHNwZWNpZnkgYW4gZXhwbGljaXQKLSAgICA8ZW0+Zm9ybWF0PC9lbT4gYXMgZGlzY3Vzc2VkIGluIDxhIGhyZWY9IiNmb3JtYXRzIj5jdXN0b20gbG9nCi0gICAgZm9ybWF0czwvYT4gc2VjdGlvbiBhYm92ZS4gQWx0ZXJuYXRpdmVseSwgaXQgY2FuIHVzZSBhCi0gICAgPGVtPm5pY2tuYW1lPC9lbT4gdG8gcmVmZXIgdG8gYSBsb2cgZm9ybWF0IGRlZmluZWQgaW4gYQotICAgIHByZXZpb3VzIDxkaXJlY3RpdmU+TG9nRm9ybWF0PC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBhcyBkZXNjcmliZWQKLSAgICBiZWxvdy48L3A+Ci0KLSAgICA8cD5UaGUgc2Vjb25kIGZvcm0gb2YgdGhlIDxkaXJlY3RpdmU+TG9nRm9ybWF0PC9kaXJlY3RpdmU+IAotICAgIGRpcmVjdGl2ZSBhc3NvY2lhdGVzIGFuIGV4cGxpY2l0IDxlbT5mb3JtYXQ8L2VtPiB3aXRoIGEKLSAgICA8ZW0+bmlja25hbWU8L2VtPi4gVGhpcyA8ZW0+bmlja25hbWU8L2VtPiBjYW4gdGhlbiBiZSB1c2VkIGluCi0gICAgc3Vic2VxdWVudCA8ZGlyZWN0aXZlPkxvZ0Zvcm1hdDwvZGlyZWN0aXZlPiBvcgotICAgIDxkaXJlY3RpdmU+Q3VzdG9tTG9nPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZXMgcmF0aGVyIHRoYW4KLSAgICByZXBlYXRpbmcgdGhlIGVudGlyZSBmb3JtYXQgc3RyaW5nLiBBCi0gICAgPGRpcmVjdGl2ZT5Mb2dGb3JtYXQ8L2RpcmVjdGl2ZT4KLSAgICBkaXJlY3RpdmUgd2hpY2ggZGVmaW5lcyBhIG5pY2tuYW1lIDxzdHJvbmc+ZG9lcyBub3RoaW5nCi0gICAgZWxzZTwvc3Ryb25nPiAtLSB0aGF0IGlzLCBpdCA8ZW0+b25seTwvZW0+IGRlZmluZXMgdGhlCi0gICAgbmlja25hbWUsIGl0IGRvZXNuJ3QgYWN0dWFsbHkgYXBwbHkgdGhlIGZvcm1hdCBhbmQgbWFrZSBpdCB0aGUKLSAgICBkZWZhdWx0LiBUaGVyZWZvcmUsIGl0IHdpbGwgbm90IGFmZmVjdCBzdWJzZXF1ZW50Ci0gICAgPGRpcmVjdGl2ZT5UcmFuc2ZlckxvZzwvZGlyZWN0aXZlPiBkaXJlY3RpdmVzLjwvcD4KLQotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLQotPG5hbWU+VHJhbnNmZXJMb2c8L25hbWU+Ci08ZGVzY3JpcHRpb24+U3BlY2lmbHkgbG9jYXRpb24gb2YgYSBsb2cgZmlsZTwvZGVzY3JpcHRpb24+Ci08c3ludGF4PlRyYW5zZmVyTG9nIDxlbT5maWxlPC9lbT58PGVtPnBpcGU8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+PGk+bm9uZTwvaT48L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsCi1ob3N0PC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci08Y29tcGF0aWJpbGl0eT48L2NvbXBhdGliaWxpdHk+Ci0KLTx1c2FnZT4KLQotICAgIDxwPlRoaXMgZGlyZWN0aXZlIGhhcyBleGFjdGx5IHRoZSBzYW1lIGFyZ3VtZW50cyBhbmQgZWZmZWN0IGFzCi0gICAgdGhlIDxkaXJlY3RpdmU+Q3VzdG9tTG9nPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSwgd2l0aCB0aGUKLSAgICBleGNlcHRpb24gdGhhdCBpdCBkb2VzIG5vdCBhbGxvdyB0aGUgbG9nIGZvcm1hdCB0byBiZSBzcGVjaWZpZWQKLSAgICBleHBsaWNpdGx5IG9yIGZvciBjb25kaXRpb25hbCBsb2dnaW5nIG9mIHJlcXVlc3RzLiBJbnN0ZWFkLCB0aGUKLSAgICBsb2cgZm9ybWF0IGlzIGRldGVybWluZWQgYnkgdGhlIG1vc3QgcmVjZW50bHkgc3BlY2lmaWVkCi0gICAgc3BlY2lmaWVkIDxkaXJlY3RpdmU+TG9nRm9ybWF0PC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSAod2hpY2gKLSAgICBkb2VzIG5vdCBkZWZpbmUgYSBuaWNrbmFtZSkuIENvbW1vbiBMb2cgRm9ybWF0IGlzIHVzZWQgaWYgbm8KLSAgICBvdGhlciBmb3JtYXQgaGFzIGJlZW4gc3BlY2lmaWVkLjwvcD4KLQotICAgIDxwPkV4YW1wbGU6PC9wPgotPGV4YW1wbGU+Ci0gICBMb2dGb3JtYXQgIiVoICVsICV1ICV0IFwiJXJcIiAlJmd0O3MgJWIgXCIle1JlZmVyZXJ9aVwiIFwiJXtVc2VyLWFnZW50fWlcIiI8YnIgLz4KLSAgIFRyYW5zZmVyTG9nIGxvZ3MvYWNjZXNzX2xvZwotPC9leGFtcGxlPgotCi08L3VzYWdlPgotCi08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08L21vZHVsZXN5bm9wc2lzPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9taW1lLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX21pbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNkYzE0YS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX21pbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi08IS0tJWh5cGVydGV4dCAtLT4KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgMi4wLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFwYWNoZSBtb2R1bGUgbW9kX21pbWU8L1RJVExFPgotPC9IRUFEPgotCi08Qk9EWT4KLTxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX3N1Yi5naWYiIEFMVD0iIj4KLTwhLS0vJWh5cGVydGV4dCAtLT4KLTxIMT5Nb2R1bGUgbW9kX21pbWU8L2gxPgotCi1UaGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4gdGhlIDxjb2RlPm1vZF9taW1lLmM8L2NvZGU+IGZpbGUsIGFuZCBpcwotY29tcGlsZWQgaW4gYnkgZGVmYXVsdC4gSXQgcHJvdmlkZXMgZm9yIGRldGVybWluaW5nIHRoZSB0eXBlcyBvZiBmaWxlcwotZnJvbSB0aGUgZmlsZW5hbWUuCi0KLTxoMj5TdW1tYXJ5PC9oMj4KLVRoaXMgbW9kdWxlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBtaW1lIHR5cGVzIG9mIGRvY3VtZW50cy4gU29tZSBtaW1lCi10eXBlcyBpbmRpY2F0ZSBzcGVjaWFsIHByb2Nlc3NpbmcgdG8gYmUgcGVyZm9ybWVkIGJ5IHRoZSBzZXJ2ZXIsIG90aGVyd2lzZQotdGhlIHR5cGUgaXMgcmV0dXJuZWQgdG8gdGhlIGNsaWVudCBzbyB0aGF0IHRoZSBicm93c2VyIGNhbiBkZWFsIHdpdGgKLXRoZSBkb2N1bWVudCBhcHByb3ByaWF0ZWx5LjxwPgotCi1UaGUgZmlsZW5hbWUgb2YgYSBkb2N1bWVudCBpcyB0cmVhdGVkIGFzIGJlaW5nIGNvbXBvc2VkIG9mIGEgYmFzZW5hbWUgZm9sbG93ZWQKLWJ5IHNvbWUgZXh0ZW5zaW9ucywgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKLTxibG9ja3F1b3RlPjxlbT5iYXNlLnR5cGUubGFuZ3VhZ2UuZW5jPC9lbT48L2Jsb2NrcXVvdGU+Ci1UaGUgPGVtPnR5cGU8L2VtPiBleHRlbnNpb24gc2V0cyB0aGUgdHlwZSBvZiB0aGUgZG9jdW1lbnQ7IHR5cGVzIGFyZSBkZWZpbmVkCi1pbiB0aGUgPEEgSFJFRj0iI3R5cGVzY29uZmlnIj5UeXBlc0NvbmZpZzwvQT4gZmlsZSBhbmQgYnkgdGhlCi08QSBIUkVGPSIjYWRkdHlwZSI+QWRkVHlwZTwvQT4gZGlyZWN0aXZlLiBUaGUgPGVtPmxhbmd1YWdlPC9lbT4gZXh0ZW5zaW9uCi1zZXRzIHRoZSBsYW5ndWFnZSBvZiB0aGUgZG9jdW1lbnQsIGFzIGRlZmluZWQgYnkgdGhlCi08QSBIUkVGPSIjYWRkbGFuZ3VhZ2UiPkFkZExhbmd1YWdlPC9BPiBkaXJlY3RpdmUuIEZpbmFsbHksIHRoZQotPGVtPmVuYzwvZW0+IGRpcmVjdGl2ZSBzZXRzIHRoZSBlbmNvZGluZyBvZiB0aGUgZG9jdW1lbnQsIGFzIGRlZmluZWQgYnkKLXRoZSA8QSBIUkVGPSIjYWRkZW5jb2RpbmciPkFkZEVuY29kaW5nPC9BPiBkaXJlY3RpdmUuCi0KLTwhLS0laHlwZXJ0ZXh0IC0tPgotPGgyPiBEaXJlY3RpdmVzPC9oMj4KLTx1bD4KLTxsaT48QSBIUkVGPSIjYWRkZW5jb2RpbmciPkFkZEVuY29kaW5nPC9BPgotPGxpPjxBIEhSRUY9IiNhZGRoYW5kbGVyIj5BZGRIYW5kbGVyPC9BPgotPGxpPjxBIEhSRUY9IiNhZGRsYW5ndWFnZSI+QWRkTGFuZ3VhZ2U8L0E+Ci08bGk+PEEgSFJFRj0iI2FkZHR5cGUiPkFkZFR5cGU8L0E+Ci08bGk+PEEgSFJFRj0iI2ZvcmNldHlwZSI+Rm9yY2VUeXBlPC9BPgotPGxpPjxBIEhSRUY9IiNzZXRoYW5kbGVyIj5TZXRIYW5kbGVyPC9BPgotPGxpPjxBIEhSRUY9IiN0eXBlc2NvbmZpZyI+VHlwZXNDb25maWc8L0E+Ci08L3VsPgotPGhyPgotPCEtLS8laHlwZXJ0ZXh0IC0tPgotCi08QSBuYW1lPSJhZGRlbmNvZGluZyI+PGgyPkFkZEVuY29kaW5nPC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgQWRkRW5jb2Rpbmd9IGRpcmVjdGl2ZSZndDsgLS0+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gQWRkRW5jb2RpbmcgPGVtPm1pbWUtZW5jIGV4dGVuc2lvbiBleHRlbnNpb24uLi48L2VtPjxicj4KLTxTdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2Vzczxicj4KLTxTdHJvbmc+T3ZlcnJpZGU6PC9zdHJvbmc+IEZpbGVJbmZvPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IEJhc2U8YnI+Ci08c3Ryb25nPk1vZHVsZTo8L3N0cm9uZz4gbW9kX21pbWU8cD4KLQotVGhlIEFkZEVuY29kaW5nIGRpcmVjdGl2ZSBhZGRzIHRvIHRoZSBsaXN0IG9mIGZpbGVuYW1lIGV4dGVuc2lvbnMgd2hpY2gKLWZpbGVuYW1lcyBtYXkgZW5kIGluIGZvciB0aGUgc3BlY2lmaWVkIGVuY29kaW5nIHR5cGUuIDxlbT5NaW1lLWVuYzwvZW0+Ci1pcyB0aGUgbWltZSBlbmNvZGluZyB0byB1c2UgZm9yIGRvY3VtZW50cyBlbmRpbmcgaW4gPGVtPmV4dGVuc2lvbjwvZW0+LgotRXhhbXBsZToKLTxibG9ja3F1b3RlPjxjb2RlPgotQWRkRW5jb2RpbmcgeC1nemlwIGd6PGJyPgotQWRkRW5jb2RpbmcgeC1jb21wcmVzcyBaCi08L2NvZGU+PC9ibG9ja3F1b3RlPgotCi1UaGlzIHdpbGwgY2F1c2UgZmlsZXMgZW5kaW5nIGluIC5neiB0byBiZSBtYXJrZWQgYXMgZW5jb2RlZCB1c2luZyB0aGUgeC1nemlwCi1lbmNvZGluZywgYW5kIC5aIGZpbGVzIHRvIGJlIG1hcmtlZCBhcyBlbmNvZGVkIHdpdGggeC1jb21wcmVzcy48cD48aHI+Ci0KLTxoMj48YSBuYW1lPSJhZGRoYW5kbGVyIj5BZGRIYW5kbGVyPC9hPjwvaDI+Ci0KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiAmbHQ7QWRkSGFuZGxlciA8ZW0+aGFuZGxlci1uYW1lIGV4dGVudGlvbjwvZW0+Jmd0Ozxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2Vzczxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBCYXNlPGJyPgotPHN0cm9uZz5Nb2R1bGU6PC9zdHJvbmc+IG1vZF9taW1lPGJyPgotPHN0cm9uZz5Db21wYXRpYmlsaXR5Ojwvc3Ryb25nPiBBZGRIYW5kbGVyIGlzIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZQotMS4xIGFuZCBsYXRlcjxwPgotCi08cD5BZGRIYW5kbGVyIG1hcHMgdGhlIGZpbGVuYW1lIGV4dGVuc2lvbiA8ZW0+ZXh0ZW5zaW9uPC9lbT4gdG8gdGhlCi08YSBocmVmPSJoYW5kbGVyLmh0bWwiPmhhbmRsZXI8L2E+Ci08ZW0+aGFuZGxlci1uYW1lPC9lbT4uIEZvciBleGFtcGxlLCB0byBhY3RpdmF0ZSBDR0kgc2NyaXB0cwotd2l0aCB0aGUgZmlsZSBleHRlbnNpb24gIjxjb2RlPi5jZ2k8L2NvZGU+IiwgeW91IG1pZ2h0IHVzZToKLTxwcmU+Ci0gICAgQWRkSGFuZGxlciBjZ2ktc2NyaXB0IGNnaQotPC9wcmU+Ci0KLTxwPk9uY2UgdGhhdCBoYXMgYmVlbiBwdXQgaW50byB5b3VyIHNybS5jb25mIG9yIGh0dHBkLmNvbmYgZmlsZSwgYW55Ci1maWxlIGVuZGluZyB3aXRoICI8Y29kZT4uY2dpPC9jb2RlPiIgd2lsbCBiZSB0cmVhdGVkIGFzIGEgQ0dJCi1wcm9ncmFtLjwvcD4KLQotCi08QSBuYW1lPSJhZGRsYW5ndWFnZSI+PGgyPkFkZExhbmd1YWdlPC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgQWRkTGFuZ3VhZ2V9IGRpcmVjdGl2ZSZndDsgLS0+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gQWRkTGFuZ3VhZ2UgPGVtPm1pbWUtbGFuZyBleHRlbnNpb24gZXh0ZW5zaW9uLi4uPC9lbT48YnI+Ci08U3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3M8YnI+Ci08U3Ryb25nPk92ZXJyaWRlOjwvc3Ryb25nPiBGaWxlSW5mbzxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBCYXNlPGJyPgotPHN0cm9uZz5Nb2R1bGU6PC9zdHJvbmc+IG1vZF9taW1lPHA+Ci0KLVRoZSBBZGRMYW5ndWFnZSBkaXJlY3RpdmUgYWRkcyB0byB0aGUgbGlzdCBvZiBmaWxlbmFtZSBleHRlbnNpb25zIHdoaWNoCi1maWxlbmFtZXMgbWF5IGVuZCBpbiBmb3IgdGhlIHNwZWNpZmllZCBjb250ZW50IGxhbmd1YWdlLiA8ZW0+TWltZS1sYW5nPC9lbT4KLWlzIHRoZSBtaW1lIGxhbmd1YWdlIG9mIGZpbGVzIHdpdGggbmFtZXMgZW5kaW5nIDxlbT5leHRlbnNpb248L2VtPiwKLWFmdGVyIGFueSBjb250ZW50IGVuY29kaW5nIGV4dGVuc2lvbnMgaGF2ZSBiZWVuIHJlbW92ZWQuIEV4YW1wbGU6Ci08YmxvY2txdW90ZT48Y29kZT4KLUFkZEVuY29kaW5nIHgtY29tcHJlc3MgWjxicj4KLUFkZExhbmd1YWdlIGVuIC5lbjxicj4KLUFkZExhbmd1YWdlIGZyIC5mcjxicj4KLTwvY29kZT48L2Jsb2NrcXVvdGU+Ci0KLVRoZW4gdGhlIGRvY3VtZW50IDxjb2RlPnh4eHguZW4uWjwvY29kZT4gd2lsbCBiZSB0cmVhdGVkIGFzIGJlaW5nIGEgY29tcHJlc3NlZAotRW5nbGlzaCBkb2N1bWVudC4gQWx0aG91Z2ggdGhlIGNvbnRlbnQgbGFuZ3VhZ2UgaXMgcmVwb3J0ZWQgdG8gdGhlIGNsaWVudCwKLXRoZSBicm93c2VyIGlzIHVubGlrZWx5IHRvIHVzZSB0aGlzIGluZm9ybWF0aW9uLiBUaGUgQWRkTGFuZ3VhZ2UgZGlyZWN0aXZlCi1pcyBtb3JlIHVzZWZ1bCBmb3IgY29udGVudCBuZWdvdGlhdGlvbiwgd2hlcmUgdGhlIHNlcnZlciByZXR1cm5zIG9uZQotZnJvbSBzZXZlcmFsIGRvY3VtZW50cyBiYXNlZCBvbiB0aGUgY2xpZW50J3MgbGFuZ3VhZ2UgcHJlZmVyZW5jZS48cD48aHI+Ci0KLTxBIG5hbWU9ImFkZHR5cGUiPjxoMj5BZGRUeXBlPC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgQWRkVHlwZX0gZGlyZWN0aXZlJmd0OyAtLT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBBZGRUeXBlIDxlbT5taW1lLXR5cGUgZXh0ZW5zaW9uIGV4dGVuc2lvbi4uLjwvZW0+PGJyPgotPFN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPGJyPgotPFN0cm9uZz5PdmVycmlkZTo8L3N0cm9uZz4gRmlsZUluZm88YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gQmFzZTxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfbWltZTxwPgotCi1UaGUgQWRkVHlwZSBkaXJlY3RpdmUgYWRkcyB0byB0aGUgbGlzdCBvZiBmaWxlbmFtZSBleHRlbnNpb25zIHdoaWNoCi1maWxlbmFtZXMgbWF5IGVuZCBpbiBmb3IgdGhlIHNwZWNpZmllZCBjb250ZW50IHR5cGUuIDxlbT5NaW1lLWVuYzwvZW0+Ci1pcyB0aGUgbWltZSB0eXBlIHRvIHVzZSBmb3IgZG9jdW1lbnRzIGVuZGluZyBpbiA8ZW0+ZXh0ZW5zaW9uPC9lbT4uCi1hZnRlciBjb250ZW50LWVuY29kaW5nIGFuZCBsYW5ndWFnZSBleHRlbnNpb25zIGhhdmUgYmVlbiByZW1vdmVkLiBFeGFtcGxlOgotPGJsb2NrcXVvdGU+PGNvZGU+Ci1BZGRUeXBlIGltYWdlL2dpZiBHSUYKLTwvY29kZT48L2Jsb2NrcXVvdGU+Ci1JdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5ldyBtaW1lIHR5cGVzIGJlIGFkZGVkIHVzaW5nIHRoZSBBZGRUeXBlIGRpcmVjdGl2ZQotcmF0aGVyIHRoYW4gY2hhbmdpbmcgdGhlIDxBIEhSRUY9IiN0eXBlc2NvbmZpZyI+VHlwZXNDb25maWc8L0E+IGZpbGUuPHA+Ci1Ob3RlIHRoYXQsIHVubGlrZSB0aGUgTkNTQSBodHRwZCwgdGhpcyBkaXJlY3RpdmUgY2Fubm90IGJlIHVzZWQgdG8gc2V0IHRoZQotdHlwZSBvZiBwYXJ0aWN1bGFyIGZpbGVzLjxwPjxocj4KLQotPGgyPjxhIG5hbWU9InNldGhhbmRsZXIiPkZvcmNlVHlwZTwvYT48L2gyPgotCi08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gJmx0O0ZvcmNlVHlwZSA8ZW0+bWVkaWEgdHlwZTwvZW0+Jmd0Ozxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gZGlyZWN0b3J5LCAuaHRhY2Nlc3M8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gQmFzZTxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfbWltZTxicj4KLTxzdHJvbmc+Q29tcGF0aWJpbGl0eTo8L3N0cm9uZz4gRm9yY2VUeXBlIGlzIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZQotMS4xIGFuZCBsYXRlci48cD4KLQotPHA+V2hlbiBwbGFjZWQgaW50byBhbiA8Y29kZT4uaHRhY2Nlc3M8L2NvZGU+IGZpbGUgb3IgYQotPGNvZGU+Jmx0O0RpcmVjdG9yeSZndDs8L2NvZGU+IG9yIDxjb2RlPiZsdDtMb2NhdGlvbjwvY29kZT4gc2VjdGlvbiwKLXRoaXMgZGlyZWN0aXZlIGZvcmNlcyBhbGwgbWF0Y2hpbmcgZmlsZXMgdG8gYmUgc2VydmVkCi1hcyB0aGUgY29udGVudCB0eXBlIGdpdmVuIGJ5IDxlbT5tZWRpYSB0eXBlPC9lbT4uIEZvciBleGFtcGxlLCBpZiB5b3UKLWhhZCBhIGRpcmVjdG9yeSBmdWxsIG9mIEdJRiBmaWxlcywgYnV0IGRpZCBub3Qgd2FudCB0byBsYWJlbCB0aGVtIGFsbCB3aXRoCi0iLmdpZiIsIHlvdSBtaWdodCB3YW50IHRvIHVzZToKLTxwcmU+Ci0gICAgRm9yY2VUeXBlIGltYWdlL2dpZgotPC9wcmU+Ci08cD5Ob3RlIHRoYXQgdGhpcyB3aWxsIG92ZXJyaWRlIGFueSBmaWxlbmFtZSBleHRlbnNpb25zIHRoYXQgbWlnaHQKLW1lZGlhIHR5cGUuPC9wPgotCi08aDI+PGEgbmFtZT0ic2V0aGFuZGxlciI+U2V0SGFuZGxlcjwvYT48L2gyPgotCi08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gJmx0O1NldEhhbmRsZXIgPGVtPmhhbmRsZXItbmFtZTwvZW0+Jmd0Ozxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gZGlyZWN0b3J5LCAuaHRhY2Nlc3M8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gQmFzZTxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfbWltZTxicj4KLTxzdHJvbmc+Q29tcGF0aWJpbGl0eTo8L3N0cm9uZz4gU2V0SGFuZGxlciBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUKLTEuMSBhbmQgbGF0ZXIuPHA+Ci0KLTxwPldoZW4gcGxhY2VkIGludG8gYW4gPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBmaWxlIG9yIGEKLTxjb2RlPiZsdDtEaXJlY3RvcnkmZ3Q7PC9jb2RlPiBvciA8Y29kZT4mbHQ7TG9jYXRpb248L2NvZGU+IHNlY3Rpb24sCi10aGlzIGRpcmVjdGl2ZSBmb3JjZXMgYWxsIG1hdGNoaW5nIGZpbGVzIHRvIGJlIHBhcnNlZCB0aHJvdWdoIHRoZQotPGEgaHJlZj0iaGFuZGxlci5odG1sIj5oYW5kbGVyPC9hPgotZ2l2ZW4gYnkgPGVtPmhhbmRsZXItbmFtZTwvZW0+LiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhZCBhCi1kaXJlY3RvcnkgeW91IHdhbnRlZCB0byBiZSBwYXJzZWQgZW50aXJlbHkgYXMgaW1hZ2VtYXAgcnVsZSBmaWxlcywKLXJlZ2FyZGxlc3Mgb2YgZXh0ZW5zaW9uLCB5b3UgbWlnaHQgcHV0IHRoZSBmb2xsb3dpbmcgaW50byBhbgotPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBmaWxlIGluIHRoYXQgZGlyZWN0b3J5OgotPHByZT4KLSAgICBTZXRIYW5kbGVyIGltYXAtZmlsZQotPC9wcmU+Ci0KLTxwPkFub3RoZXIgZXhhbXBsZTogaWYgeW91IHdhbnRlZCB0byBoYXZlIHRoZSBzZXJ2ZXIgZGlzcGxheSBhIHN0YXR1cwotcmVwb3J0IHdoZW5ldmVyIGEgVVJMIG9mIDxjb2RlPmh0dHA6Ly9zZXJ2ZXJuYW1lL3N0YXR1czwvY29kZT4gd2FzCi1jYWxsZWQsIHlvdSBtaWdodCBwdXQgdGhlIGZvbGxvd2luZyBpbnRvIGFjY2Vzcy5jb25mOgotPHByZT4KLSAgICAmbHQ7TG9jYXRpb24gL3N0YXR1cyZndDsKLSAgICBTZXRIYW5kbGVyIHNlcnZlci1zdGF0dXMKLSAgICAmbHQ7L0xvY2F0aW9uJmd0OwotPC9wcmU+Ci0KLQotPEEgbmFtZT0idHlwZXNjb25maWciPjxoMj5UeXBlc0NvbmZpZzwvaDI+PC9BPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IFR5cGVzQ29uZmlnfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IFR5cGVzQ29uZmlnIDxlbT5maWxlbmFtZTwvZW0+PGJyPgotPHN0cm9uZz5EZWZhdWx0Ojwvc3Ryb25nPiA8Y29kZT5UeXBlc0NvbmZpZyBjb25mL21pbWUudHlwZXM8L2NvZGU+PGJyPgotPFN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IEJhc2U8YnI+Ci08c3Ryb25nPk1vZHVsZTo8L3N0cm9uZz4gbW9kX21pbWU8cD4KLQotVGhlIFR5cGVzQ29uZmlnIGRpcmVjdGl2ZSBzZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgbWltZSB0eXBlcyBjb25maWd1cmF0aW9uCi1maWxlLiA8ZW0+RmlsZW5hbWU8L2VtPiBpcyByZWxhdGl2ZSB0byB0aGUKLTxBIEhSRUY9IiNzZXJ2ZXJyb290Ij5TZXJ2ZXJSb290PC9BPi4gVGhpcyBmaWxlIHNldHMgdGhlIGRlZmF1bHQgbGlzdCBvZgotbWFwcGluZ3MgZnJvbSBmaWxlbmFtZSBleHRlbnNpb25zIHRvIGNvbnRlbnQgdHlwZXM7IGNoYW5naW5nIHRoaXMgZmlsZSBpcyBub3QKLXJlY29tbWVuZGVkLiBVc2UgdGhlIDxBIEhSRUY9IiNhZGR0eXBlIj5BZGRUeXBlPC9BPiBkaXJlY3RpdmUgaW5zdGVhZC4gVGhlCi1maWxlIGNvbnRhaW5zIGxpbmVzIGluIHRoZSBmb3JtYXQgb2YgdGhlIGFyZ3VtZW50cyB0byBhbiBBZGRUeXBlIGNvbW1hbmQ6Ci08YmxvY2txdW90ZT48ZW0+bWltZS10eXBlIGV4dGVuc2lvbiBleHRlbnNpb24gLi4uPC9lbT48L2Jsb2NrcXVvdGU+Ci1UaGUgZXh0ZW5zaW9ucyBhcmUgbG93ZXItY2FzZWQuIEJsYW5rIGxpbmVzLCBhbmQgbGluZXMgYmVnaW5uaW5nIHdpdGggYSBoYXNoCi1jaGFyYWN0ZXIgKGAjJykgYXJlIGlnbm9yZWQuPHA+Ci08IS0tJWh5cGVydGV4dCAtLT4KLTxocj4KLTxBIEhSRUY9Ii4uLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfaG9tZS5naWYiIEFMVD0iSG9tZSI+PC9BPgotPEEgSFJFRj0iLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2luZGV4LmdpZiIgQUxUPSJJbmRleCI+PC9BPgotCi08L0JPRFk+Ci08L0hUTUw+Ci08IS0tLyVoeXBlcnRleHQgLS0+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX21pbWUueG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9taW1lLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdiZjY0Yi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX21pbWUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIG1vZHVsZXN5bm9wc2lzIFNZU1RFTSAiLi4vc3R5bGUvbW9kdWxlc3lub3BzaXMuZHRkIj4KLTw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9Ii4uL3N0eWxlL21hbnVhbC54c2wiPz4KLTxtb2R1bGVzeW5vcHNpcz4KLQotPG5hbWU+bW9kX21pbWU8L25hbWU+Ci08ZGVzY3JpcHRpb24+VGhpcyBtb2R1bGUgYXNzb2NpYXRlcyB0aGUgcmVxdWVzdCBmaWxlbmFtZSdzIGV4dGVuc2lvbnMKLSAgICAoZS5nLiAuaHRtbCkgd2l0aCB0aGUgZmlsZSdzIGJlaGF2aW9yIChoYW5kbGVycyBhbmQgZmlsdGVycykKLSAgICBhbmQgY29udGVudCAobWltZS10eXBlLCBsYW5ndWFnZSwgY2hhcmFjdGVyIHNldCBhbmQKLSAgICBlbmNvZGluZy4pCi08L2Rlc2NyaXB0aW9uPgotPHNvdXJjZWZpbGU+bW9kX21pbWUuYzwvc291cmNlZmlsZT4KLTxpZGVudGlmaWVyPm1pbWVfbW9kdWxlPC9pZGVudGlmaWVyPgotPHN0YXR1cz5CYXNlPC9zdGF0dXM+Ci0KLTxzdW1tYXJ5PgotICAgIDxwPlRoaXMgbW9kdWxlIGlzIHVzZWQgdG8gYXNzb2NpYXRlIHZhcmlvdXMgYml0cyBvZiAibWV0YQotICAgIGluZm9ybWF0aW9uIiB3aXRoIGZpbGVzIGJ5IHRoZWlyIGZpbGVuYW1lIGV4dGVuc2lvbnMuIFRoaXMKLSAgICBpbmZvcm1hdGlvbiByZWxhdGVzIHRoZSBmaWxlbmFtZSBvZiB0aGUgZG9jdW1lbnQgdG8gaXQncwotICAgIG1pbWUtdHlwZSwgbGFuZ3VhZ2UsIGNoYXJhY3RlciBzZXQgYW5kIGVuY29kaW5nLiBUaGlzCi0gICAgaW5mb3JtYXRpb24gaXMgc2VudCB0byB0aGUgYnJvd3NlciwgYW5kIHBhcnRpY2lwYXRlcyBpbiBjb250ZW50Ci0gICAgbmVnb3RpYXRpb24sIHNvIHRoZSB1c2VyJ3MgcHJlZmVyZW5jZXMgYXJlIHJlc3BlY3RlZCB3aGVuCi0gICAgY2hvb3Npbmcgb25lIG9mIHNldmVyYWwgcG9zc2libGUgZmlsZXMgdG8gc2VydmUuIFNlZQotICAgIDxtb2R1bGU+bW9kX25lZ290aWF0aW9uPC9tb2R1bGU+IGZvciBtb3JlIGluZm9ybWF0aW9uCi0gICAgYWJvdXQgY29udGVudCBuZWdvdGlhdGlvbi4gPC9wPgotCi0gICAgPHA+VGhlIGRpcmVjdGl2ZXMgPGRpcmVjdGl2ZT5BZGRDaGFyc2V0PC9kaXJlY3RpdmU+LAotICAgIDxkaXJlY3RpdmU+QWRkRW5jb2Rpbmc8L2RpcmVjdGl2ZT4sCi0gICAgPGRpcmVjdGl2ZT5BZGRMYW5ndWFnZTwvZGlyZWN0aXZlPiBhbmQKLSAgICA8ZGlyZWN0aXZlPkFkZFR5cGU8L2RpcmVjdGl2ZT4gYWxsIHVzZWQgdG8gbWFwIGZpbGUgZXh0ZW5zaW9ucwotICAgIG9udG8gdGhlIG1ldGEtaW5mb3JtYXRpb24gZm9yIHRoYXQgZmlsZS4gUmVzcGVjdGl2ZWx5IHRoZXkgc2V0Ci0gICAgdGhlIGNoYXJhY3RlciBzZXQsIGNvbnRlbnQtZW5jb2RpbmcsIGNvbnRlbnQtbGFuZ3VhZ2UsIGFuZAotICAgIE1JTUUtdHlwZSAoY29udGVudC10eXBlKSBvZiBkb2N1bWVudHMuPC9wPgotCi0gICAgPHA+SW4gYWRkaXRpb24sIG1vZF9taW1lIG1heSBkZWZpbmUgdGhlICJoYW5kbGVyIiBmb3IgYQotICAgIGRvY3VtZW50LCB3aGljaCBjb250cm9scyB3aGljaCBtb2R1bGUgb3Igc2NyaXB0IHdpbGwgc2VydmUgdGhlCi0gICAgZG9jdW1lbnQuIFdpdGggdGhlIGludHJvZHVjdGlvbiBvZiAiZmlsdGVycyIgaW4gQXBhY2hlIDIuMCwKLSAgICBtb2RfbWltZSBjYW4gYWxzbyBkZWZpbmUgdGhlIGZpbHRlcnMgdGhhdCB0aGUgdGhlIGNvbnRlbnQKLSAgICBzaG91bGQgYmUgcHJvY2Vzc2VkIHRocm91Z2ggKGUuZy4gdGhlIEluY2x1ZGVzIG91dHB1dCBmaWx0ZXIKLSAgICBmb3Igc2VydmVyIHNpZGUgc2NyaXB0aW5nKSBhbmQgd2hhdCBmaWx0ZXJzIHRoZSBjbGllbnQgcmVxdWVzdAotICAgIGFuZCBQT1NUIGNvbnRlbnQgc2hvdWxkIGJlIHByb2Nlc3NlZCB0aHJvdWdoICh0aGUgaW5wdXQKLSAgICBmaWx0ZXJzLik8L3A+Ci0KLSAgICA8cD5UaGUgZGlyZWN0aXZlcyA8ZGlyZWN0aXZlPkFkZEhhbmRsZXI8L2RpcmVjdGl2ZT4sCi0gICAgPGRpcmVjdGl2ZT5BZGRPdXRwdXRGaWx0ZXI8L2RpcmVjdGl2ZT4sIGFuZAotICAgIDxkaXJlY3RpdmU+QWRkSW5wdXRGaWx0ZXI8L2RpcmVjdGl2ZT4gY29udHJvbCB0aGUgbW9kdWxlcwotICAgIG9yIHNjcmlwdHMgdGhhdCBzZXJ2ZSB0aGUgZG9jdW1lbnQuICBUaGUgCi0gICAgPGRpcmVjdGl2ZT5NdWx0aXZpZXdzTWF0Y2g8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIGFsbG93cwotICAgIDxkaXJlY3RpdmU+bW9kX25lZ290aWF0aW9uPC9kaXJlY3RpdmU+IHRvIGNvbnNpZGVyIHRoZXNlCi0gICAgZmlsZSBleHRlbnNpb25zIHRvIGluY2x1ZGVkIHdoZW4gdGVzdGluZyBNdWx0aXZpZXdzIG1hdGNoZXMuPC9wPgotCi0gICAgPHA+VGhlIGRpcmVjdGl2ZSA8ZGlyZWN0aXZlPlR5cGVzQ29uZmlnPC9kaXJlY3RpdmU+IGlzIHVzZWQKLSAgICB0byBzcGVjaWZ5IGEgZmlsZSB3aGljaCBhbHNvIG1hcHMgZXh0ZW5zaW9ucyBvbnRvIE1JTUUgdHlwZXMuCi0gICAgTW9zdCBhZG1pbmlzdHJhdG9ycyB1c2UgdGhlIHByb3ZpZGVkIG1pbWUudHlwZXMgZmlsZSB3aGljaAotICAgIGFzc29jaWF0ZXMgY29tbW9uIGZpbGVuYW1lIGV4dGVuc2lvbnMgd2l0aCBJQU5BIHJlZ2lzdGVyZWQKLSAgICBjb250ZW50IHR5cGVzLiBUaGUgY3VycmVudCBsaXN0IGlzIG1haW50YWluZWQgYXQKLSAgICA8Y29kZT5odHRwOi8vd3d3LmlzaS5lZHUvaW4tbm90ZXMvaWFuYS9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9tZWRpYS10eXBlczwvY29kZT4KLSAgICBhbHRob3VnaCBpdCBtYXkgYmUgbWlycm9yZWQgZWxzZXdoZXJlKS4gVGhpcyBzaW1wbGlmaWVzIHRoZQotICAgIGh0dHBkLmNvbmYgZmlsZSBieSBwcm92aWRpbmcgdGhlIG1ham9yaXR5IG9mIG1lZGlhLXR5cGUKLSAgICBkZWZpbml0aW9ucywgYW5kIHRoZXkgbWF5IGJlIG92ZXJyaWRkZW4gYnkgCi0gICAgPGRpcmVjdGl2ZT5BZGRUeXBlPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZXMgYXMgbmVlZGVkLjwvcD4KLQotICAgIDxub3RlPlBsZWFzZSBkbyBub3Qgc2VuZCByZXF1ZXN0cyB0byB0aGUgQXBhY2hlIGh0dHBkIFByb2plY3QKLSAgICB0byBhZGQgYW55IG5ldyBlbnRyaWVzIGluIHRoZSBkaXN0cmlidXRlZCBtaW1lLnR5cGVzIGZpbGUKLSAgICB1bmxlc3MgKDEpIHRoZXkgYXJlIGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIElBTkEsIGFuZCAoMikgdGhleQotICAgIHVzZSB3aWRlbHkgYWNjZXB0ZWQsIG5vbi1jb25mbGljdGluZyBmaWxlbmFtZSBleHRlbnNpb25zIGFjcm9zcwotICAgIHBsYXRmb3Jtcy4gY2F0ZWdvcnkveC1zdWJ0eXBlIHJlcXVlc3RzIHdpbGwgYmUgYXV0b21hdGljYWxseQotICAgIHJlamVjdGVkLCBhcyB3aWxsIGFueSBuZXcgdHdvLWxldHRlciBleHRlbnNpb25zIGFzIHRoZXkgd2lsbAotICAgIGxpa2VseSBjb25mbGljdCBsYXRlciB3aXRoIHRoZSBhbHJlYWR5IGNyb3dkZWQgbGFuZ3VhZ2UgYW5kCi0gICAgY2hhcmFjdGVyIHNldCBuYW1lc3BhY2UuPC9ub3RlPgotCi0gICAgPHA+VGhlIGNvcmUgZGlyZWN0aXZlcyA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJjb3JlIj5Gb3JjZVR5cGU8L2RpcmVjdGl2ZT4gYW5kCi0gICAgPGRpcmVjdGl2ZT5TZXRIYW5kbGVyPC9kaXJlY3RpdmU+IGFyZSB1c2VkIHRvCi0gICAgYXNzb2NpYXRlIGFsbCB0aGUgZmlsZXMgaW4gYSBnaXZlbiBjb250YWluZXIgKDxlbT5lLmcuPC9lbT4sCi0gICAgJmx0O2xvY2F0aW9uJmd0OywgJmx0O2RpcmVjdG9yeSZndDssIG9yICZsdDtGaWxlcyZndDspIHdpdGggYQotICAgIHBhcnRpY3VsYXIgTUlNRS10eXBlIG9yIGhhbmRsZXIuIFRoZXNlIHNldHRpbmdzIG92ZXJyaWRlIGFueQotICAgIGZpbGVuYW1lIGV4dGVuc2lvbiBtYXBwaW5ncyBkZWZpbmVkIGluIG1vZF9taW1lLjwvcD4KLQotICAgIDxwPk5vdGUgdGhhdCBjaGFuZ2luZyB0aGUgdHlwZSBvciBlbmNvZGluZyBvZiBhIGZpbGUgZG9lcyBub3QKLSAgICBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5MYXN0LU1vZGlmaWVkPC9jb2RlPiBoZWFkZXIuCi0gICAgVGh1cywgcHJldmlvdXNseSBjYWNoZWQgY29waWVzIG1heSBzdGlsbCBiZSB1c2VkIGJ5IGEgY2xpZW50IG9yCi0gICAgcHJveHksIHdpdGggdGhlIHByZXZpb3VzIGhlYWRlcnMuIElmIHlvdSBjaGFuZ2UgdGhlCi0gICAgbWV0YS1pbmZvcm1hdGlvbiAobGFuZ3VhZ2UsIGNvbnRlbnQgdHlwZSwgY2hhcmFjdGVyIHNldCBvcgotICAgIGVuY29kaW5nKSB5b3UgbWF5IG5lZWQgdG8gJ3RvdWNoJyBhZmZlY3RlZCBmaWxlcyAodXBkYXRpbmcKLSAgICB0aGVpciBsYXN0IG1vZGlmaWVkIGRhdGUpIHRvIGVuc3VyZSB0aGF0IGFsbCB2aXNpdG9ycyBhcmUKLSAgICByZWNlaXZlIHRoZSBjb3JyZWN0ZWQgY29udGVudCBoZWFkZXJzLjwvcD4KLTwvc3VtbWFyeT4KLQotICAgIDxzZWVhbHNvPlNlZSBhbHNvOiA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJtb2RfbWltZV9tYWdpYyI+TWltZU1hZ2ljRmlsZTwvZGlyZWN0aXZlPjwvc2VlYWxzbz4KLQotPHNlY3Rpb24+Ci08dGl0bGUgaWQ9Im11bHRpcGxlZXh0Ij5GaWxlcyB3aXRoIE11bHRpcGxlIEV4dGVuc2lvbnM8L3RpdGxlPgotCi0gICAgPHA+RmlsZXMgY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSBleHRlbnNpb24sIGFuZCB0aGUgb3JkZXIgb2YgdGhlCi0gICAgZXh0ZW5zaW9ucyBpcyA8ZW0+bm9ybWFsbHk8L2VtPiBpcnJlbGV2YW50LiBGb3IgZXhhbXBsZSwgaWYgdGhlCi0gICAgZmlsZSA8Y29kZT53ZWxjb21lLmh0bWwuZnI8L2NvZGU+IG1hcHMgb250byBjb250ZW50IHR5cGUKLSAgICB0ZXh0L2h0bWwgYW5kIGxhbmd1YWdlIEZyZW5jaCB0aGVuIHRoZSBmaWxlIDxjb2RlPndlbGNvbWUuZnIuaHRtbDwvY29kZT4gCi0gICAgd2lsbCBtYXAgb250byBleGFjdGx5IHRoZSBzYW1lIGluZm9ybWF0aW9uLiAgSWYgbW9yZSB0aGFuIG9uZSAKLSAgICBleHRlbnNpb24gaXMgZ2l2ZW4gd2hpY2ggbWFwcyBvbnRvIHRoZSBzYW1lCi0gICAgdHlwZSBvZiBtZXRhLWluZm9ybWF0aW9uLCB0aGVuIHRoZSBvbmUgdG8gdGhlIHJpZ2h0IHdpbGwgYmUKLSAgICB1c2VkLiBGb3IgZXhhbXBsZSwgaWYgIi5naWYiIG1hcHMgdG8gdGhlIE1JTUUtdHlwZSBpbWFnZS9naWYKLSAgICBhbmQgIi5odG1sIiBtYXBzIHRvIHRoZSBNSU1FLXR5cGUgdGV4dC9odG1sLCB0aGVuIHRoZSBmaWxlCi0gICAgPGNvZGU+d2VsY29tZS5naWYuaHRtbDwvY29kZT4gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlCi0gICAgTUlNRS10eXBlICJ0ZXh0L2h0bWwiLjwvcD4KLQotICAgIDxwPkNhcmUgc2hvdWxkIGJlIHRha2VuIHdoZW4gYSBmaWxlIHdpdGggbXVsdGlwbGUgZXh0ZW5zaW9ucwotICAgIGdldHMgYXNzb2NpYXRlZCB3aXRoIGJvdGggYSBNSU1FLXR5cGUgYW5kIGEgaGFuZGxlci4gVGhpcyB3aWxsCi0gICAgdXN1YWxseSByZXN1bHQgaW4gdGhlIHJlcXVlc3QgYmVpbmcgYnkgdGhlIG1vZHVsZSBhc3NvY2lhdGVkCi0gICAgd2l0aCB0aGUgaGFuZGxlci4gRm9yIGV4YW1wbGUsIGlmIHRoZSA8Y29kZT4uaW1hcDwvY29kZT4KLSAgICBleHRlbnNpb24gaXMgbWFwcGVkIHRvIHRoZSBoYW5kbGVyICJpbWFwLWZpbGUiIChmcm9tIG1vZF9pbWFwKQotICAgIGFuZCB0aGUgPGNvZGU+Lmh0bWw8L2NvZGU+IGV4dGVuc2lvbiBpcyBtYXBwZWQgdG8gdGhlIE1JTUUtdHlwZQotICAgICJ0ZXh0L2h0bWwiLCB0aGVuIHRoZSBmaWxlIDxjb2RlPndvcmxkLmltYXAuaHRtbDwvY29kZT4gd2lsbCBiZQotICAgIGFzc29jaWF0ZWQgd2l0aCBib3RoIHRoZSAiaW1hcC1maWxlIiBoYW5kbGVyIGFuZCAidGV4dC9odG1sIgotICAgIE1JTUUtdHlwZS4gV2hlbiBpdCBpcyBwcm9jZXNzZWQsIHRoZSAiaW1hcC1maWxlIiBoYW5kbGVyIHdpbGwKLSAgICBiZSB1c2VkLCBhbmQgc28gaXQgd2lsbCBiZSB0cmVhdGVkIGFzIGEgbW9kX2ltYXAgaW1hZ2VtYXAKLSAgICBmaWxlLjwvcD4KLTwvc2VjdGlvbj4KLQotPHNlY3Rpb24+PHRpdGxlIGlkPSJjb250ZW50ZW5jb2RpbmciPkNvbnRlbnQgZW5jb2Rpbmc8L3RpdGxlPgotCi0gICAgPHA+QSBmaWxlIG9mIGEgcGFydGljdWxhciBNSU1FIHR5cGUgY2FuIGFkZGl0aW9uYWxseSBiZSBlbmNvZGVkIGEKLSAgICBwYXJ0aWN1bGFyIHdheSB0byBzaW1wbGlmeSB0cmFuc21pc3Npb24gb3ZlciB0aGUgSW50ZXJuZXQuCi0gICAgV2hpbGUgdGhpcyB1c3VhbGx5IHdpbGwgcmVmZXIgdG8gY29tcHJlc3Npb24sIHN1Y2ggYXMKLSAgICA8c2FtcD5nemlwPC9zYW1wPiwgaXQgY2FuIGFsc28gcmVmZXIgdG8gZW5jcnlwdGlvbiwgc3VjaCBhCi0gICAgPHNhbXA+cGdwPC9zYW1wPiBvciB0byBhbiBlbmNvZGluZyBzdWNoIGFzIFVVZW5jb2RpbmcsIHdoaWNoIGlzCi0gICAgZGVzaWduZWQgZm9yIHRyYW5zbWl0dGluZyBhIGJpbmFyeSBmaWxlIGluIGFuIEFTQ0lJICh0ZXh0KQotICAgIGZvcm1hdC48L3A+Ci0KLSAgICA8cD5UaGUgTUlNRSBSRkMgcHV0cyBpdCB0aGlzIHdheTo8L3A+Ci0KLSAgICA8bm90ZT4KLSAgICAgIFRoZSBDb250ZW50LUVuY29kaW5nIGVudGl0eS1oZWFkZXIgZmllbGQgaXMgdXNlZCBhcyBhCi0gICAgICBtb2RpZmllciB0byB0aGUgbWVkaWEtdHlwZS4gV2hlbiBwcmVzZW50LCBpdHMgdmFsdWUgaW5kaWNhdGVzCi0gICAgICB3aGF0IGFkZGl0aW9uYWwgY29udGVudCBjb2RpbmcgaGFzIGJlZW4gYXBwbGllZCB0byB0aGUKLSAgICAgIHJlc291cmNlLCBhbmQgdGh1cyB3aGF0IGRlY29kaW5nIG1lY2hhbmlzbSBtdXN0IGJlIGFwcGxpZWQgaW4KLSAgICAgIG9yZGVyIHRvIG9idGFpbiB0aGUgbWVkaWEtdHlwZSByZWZlcmVuY2VkIGJ5IHRoZSBDb250ZW50LVR5cGUKLSAgICAgIGhlYWRlciBmaWVsZC4gVGhlIENvbnRlbnQtRW5jb2RpbmcgaXMgcHJpbWFyaWx5IHVzZWQgdG8gYWxsb3cKLSAgICAgIGEgZG9jdW1lbnQgdG8gYmUgY29tcHJlc3NlZCB3aXRob3V0IGxvc2luZyB0aGUgaWRlbnRpdHkgb2YKLSAgICAgIGl0cyB1bmRlcmx5aW5nIG1lZGlhIHR5cGUuCi0gICAgPC9ub3RlPgotCi0gICAgPHA+QnkgdXNpbmcgbW9yZSB0aGFuIG9uZSBmaWxlIGV4dGVuc2lvbiAoc2VlIDxhCi0gICAgaHJlZj0iI211bHRpcGxlZXh0Ij5zZWN0aW9uIGFib3ZlIGFib3V0IG11bHRpcGxlIGZpbGUKLSAgICBleHRlbnNpb25zPC9hPiksIHlvdSBjYW4gaW5kaWNhdGUgdGhhdCBhIGZpbGUgaXMgb2YgYQotICAgIHBhcnRpY3VsYXIgPGVtPnR5cGU8L2VtPiwgYW5kIGFsc28gaGFzIGEgcGFydGljdWxhcgotICAgIDxlbT5lbmNvZGluZzwvZW0+LiA8L3A+Ci0KLSAgICA8cD5Gb3IgZXhhbXBsZSwgeW91IG1heSBoYXZlIGEgZmlsZSB3aGljaCBpcyBhIE1pY3Jvc29mdCBXb3JkCi0gICAgZG9jdW1lbnQsIHdoaWNoIGlzIHBremlwcGVkIHRvIHJlZHVjZSBpdHMgc2l6ZS4gSWYgdGhlCi0gICAgPHNhbXA+LmRvYzwvc2FtcD4gZXh0ZW5zaW9uIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgTWljcm9zb2Z0Ci0gICAgV29yZCBmaWxlIHR5cGUsIGFuZCB0aGUgPHNhbXA+LnppcDwvc2FtcD4gZXh0ZW5zaW9uIGlzCi0gICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBwa3ppcCBmaWxlIGVuY29kaW5nLCB0aGVuIHRoZSBmaWxlCi0gICAgPHNhbXA+UmVzdW1lLmRvYy56aXA8L3NhbXA+d291bGQgYmUga25vd24gdG8gYmUgYSBwa3ppcCdlZCBXb3JkCi0gICAgZG9jdW1lbnQuPC9wPgotCi0gICAgPHA+QXBhY2hlIHNlbmQgYSA8c2FtcD5Db250ZW50LWVuY29kaW5nPC9zYW1wPiBoZWFkZXIgd2l0aCB0aGUKLSAgICByZXNvdXJjZSwgaW4gb3JkZXIgdG8gdGVsbCB0aGUgY2xpZW50IGJyb3dzZXIgYWJvdXQgdGhlCi0gICAgZW5jb2RpbmcgbWV0aG9kLjwvcD4KLQotICAgIDxleGFtcGxlPkNvbnRlbnQtZW5jb2Rpbmc6IHBremlwPC9leGFtcGxlPgotCi08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uPgotCi08dGl0bGU+Q2hhcmFjdGVyIHNldHMgYW5kIGxhbmd1YWdlczwvdGl0bGU+Ci0KLSAgICA8cD5JbiBhZGRpdGlvbiB0byBmaWxlIHR5cGUgYW5kIHRoZSBmaWxlIGVuY29kaW5nLAotICAgIGFub3RoZXIgaW1wb3J0YW50IHBpZWNlIG9mIGluZm9ybWF0aW9uIGlzIHdoYXQgbGFuZ3VhZ2UgYQotICAgIHBhcnRpY3VsYXIgZG9jdW1lbnQgaXMgaW4sIGFuZCBpbiB3aGF0IGNoYXJhY3RlciBzZXQgdGhlIGZpbGUKLSAgICBzaG91bGQgYmUgZGlzcGxheWVkLiBGb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50IG1pZ2h0IGJlIHdyaXR0ZW4KLSAgICBpbiB0aGUgVmlldG5hbWVzZSBhbHBoYWJldCwgb3IgaW4gQ3lyaWxsaWMsIGFuZCBzaG91bGQgYmUKLSAgICBkaXNwbGF5ZWQgYXMgc3VjaC4gVGhpcyBpbmZvcm1hdGlvbiwgYWxzbywgaXMgdHJhbnNtaXR0ZWQgaW4KLSAgICBIVFRQIGhlYWRlcnMuPC9wPgotCi0gICAgPHA+VGhlIGNoYXJhY3RlciBzZXQsIGxhbmd1YWdlIGVuY29kaW5nIGFuZCBtaW1lIHR5cGUgYXJlIGFsbCAKLSAgICB1c2VkIGluIHRoZSBwcm9jZXNzIG9mIGNvbnRlbnQgbmVnb3RpYXRpb24gKFNlZSAKLSAgICA8bW9kdWxlPm1vZF9uZWdvdGlhdGlvbjwvbW9kdWxlPikgdG8gZGV0ZXJtaW5lCi0gICAgd2hpY2ggZG9jdW1lbnQgdG8gZ2l2ZSB0byB0aGUgY2xpZW50LCB3aGVuIHRoZXJlIGFyZQotICAgIGFsdGVybmF0aXZlIGRvY3VtZW50cyBpbiBtb3JlIHRoYW4gb25lIGNoYXJhY3RlciBzZXQsIGxhbmd1YWdlLCAKLSAgICBlbmNvZGluZyBvciBtaW1lIHR5cGUuICBBbGwgZmlsZW5hbWUgZXh0ZW5zaW9ucyBhc3NvY2lhdGlvbnMKLSAgICBjcmVhdGVkIHdpdGggPG1vZHVsZT5BZGRDaGFyc2V0PC9tb2R1bGU+LCA8bW9kdWxlPkFkZEVuY29kaW5nPC9tb2R1bGU+LCAKLSAgICA8bW9kdWxlPkFkZExhbmd1YWdlPC9tb2R1bGU+IGFuZCA8bW9kdWxlPkFkZFR5cGU8L21vZHVsZT4gZGlyZWN0aXZlcwotICAgIChhbmQgZXh0ZW5zaW9ucyBsaXN0ZWQgaW4gdGhlIDxtb2R1bGU+TWltZU1hZ2ljRmlsZTwvbW9kdWxlPikKLSAgICBwYXJ0aWNpcGF0ZSBpbiB0aGlzIHNlbGVjdCBwcm9jZXNzLiAgRmlsZW5hbWUgZXh0ZW5zaW9ucyB0aGF0Ci0gICAgYXJlIG9ubHkgYXNzb2NpYXRlZCB1c2luZyB0aGUgPG1vZHVsZT5BZGRIYW5kbGVyPC9tb2R1bGU+LAotICAgIDxtb2R1bGU+QWRkSW5wdXRGaWx0ZXI8L21vZHVsZT4gb3IgPG1vZHVsZT5BZGRPdXRwdXRGaWx0ZXI8L21vZHVsZT4KLSAgICBkaXJlY3RpdmVzIG1heSBiZSBpbmNsdWRlZCBvciBleGNsdWRlZCBmcm9tIG1hdGNoaW5nIGJ5IHVzaW5nIAotICAgIHRoZSA8ZGlyZWN0aXZlPk11bHRpdmlld3NNYXRjaDwvZGlyZWN0aXZlPiBkaXJlY3RpdmUuPC9wPgotCi08c2VjdGlvbj4KLTx0aXRsZT5DaGFyc2V0PC90aXRsZT4KLQotICAgIDxwPlRvIGNvbnZleSB0aGlzIGZ1cnRoZXIgaW5mb3JtYXRpb24sIEFwYWNoZSBvcHRpb25hbGx5IHNlbmRzCi0gICAgYSA8c2FtcD5Db250ZW50LUxhbmd1YWdlPC9zYW1wPiBoZWFkZXIsIHRvIHNwZWNpZnkgdGhlIGxhbmd1YWdlCi0gICAgdGhhdCB0aGUgZG9jdW1lbnQgaXMgaW4sIGFuZCBjYW4gYXBwZW5kIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICBvbnRvIHRoZSA8c2FtcD5Db250ZW50LVR5cGU8L3NhbXA+IGhlYWRlciB0byBpbmRpY2F0ZSB0aGUKLSAgICBwYXJ0aWN1bGFyIGNoYXJhY3RlciBzZXQgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBjb3JyZWN0bHkKLSAgICByZW5kZXIgdGhlIGluZm9ybWF0aW9uLjwvcD4KLQotPGV4YW1wbGU+Ci1Db250ZW50LUxhbmd1YWdlOiBlbiwgZnI8YnIgLz4KLUNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0yCi08L2V4YW1wbGU+Ci0KLSAgICA8cD5UaGUgbGFuZ3VhZ2Ugc3BlY2lmaWNhdGlvbiBpcyB0aGUgdHdvLWxldHRlciBhYmJyZXZpYXRpb24KLSAgICBmb3IgdGhlIGxhbmd1YWdlLiBUaGUgPHNhbXA+Y2hhcnNldDwvc2FtcD4gaXMgdGhlIG5hbWUgb2YgdGhlCi0gICAgcGFydGljdWxhciBjaGFyYWN0ZXIgc2V0IHdoaWNoIHNob3VsZCBiZSB1c2VkLjwvcD4KLTwvc2VjdGlvbj4KLTwvc2VjdGlvbj4KLQotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5BZGRDaGFyc2V0PC9uYW1lPgotPHN5bnRheD5BZGRDaGFyc2V0IDxlbT5jaGFyc2V0IGV4dGVuc2lvbjwvZW0+IAotWzxlbT5leHRlbnNpb248L2VtPl0gLi4uPC9zeW50YXg+Ci08ZGVmYXVsdD5Ob25lPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0PgotPGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD4KLTxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+RmlsZUluZm88L292ZXJyaWRlPgotPGNvbXBhdGliaWxpdHk+QWRkQ2hhcnNldCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUgCi0xLjMuMTAgYW5kIGxhdGVyPC9jb21wYXRpYmlsaXR5PgotPGRlc2NyaXB0aW9uPk1hcHMgdGhlIGdpdmVuIGZpbGVuYW1lIGV4dGVuc2lvbnMKLSAgICB0byB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgY2hhcnNldDwvZGVzY3JpcHRpb24+Ci0KLTx1c2FnZT4KLSAgICAKLSAgICA8cD5UaGUgQWRkQ2hhcnNldCBkaXJlY3RpdmUgbWFwcyB0aGUgZ2l2ZW4gZmlsZW5hbWUgZXh0ZW5zaW9ucwotICAgIHRvIHRoZSBzcGVjaWZpZWQgY29udGVudCBjaGFyc2V0LiA8aT5jaGFyc2V0PC9pPiBpcyB0aGUgTUlNRQotICAgIGNoYXJzZXQgcGFyYW1ldGVyIG9mIGZpbGVuYW1lcyBjb250YWluaW5nIDxpPmV4dGVuc2lvbjwvaT4uCi0gICAgVGhpcyBtYXBwaW5nIGlzIGFkZGVkIHRvIGFueSBhbHJlYWR5IGluIGZvcmNlLCBvdmVycmlkaW5nIGFueQotICAgIG1hcHBpbmdzIHRoYXQgYWxyZWFkeSBleGlzdCBmb3IgdGhlIHNhbWUgPGk+ZXh0ZW5zaW9uPC9pPi48L3A+Ci0KLSAgICA8cD5FeGFtcGxlOjwvcD4KLTxleGFtcGxlPgotICAgIEFkZExhbmd1YWdlIGphIC5qYTxiciAvPgotICAgIEFkZENoYXJzZXQgRVVDLUpQIC5ldWM8YnIgLz4KLSAgICBBZGRDaGFyc2V0IElTTy0yMDIyLUpQIC5qaXM8YnIgLz4KLSAgICBBZGRDaGFyc2V0IFNISUZUX0pJUyAuc2ppcwotPC9leGFtcGxlPgotCi0gICAgPHA+VGhlbiB0aGUgZG9jdW1lbnQgPGNvZGU+eHh4eC5qYS5qaXM8L2NvZGU+IHdpbGwgYmUgdHJlYXRlZAotICAgIGFzIGJlaW5nIGEgSmFwYW5lc2UgZG9jdW1lbnQgd2hvc2UgY2hhcnNldCBpcyBJU08tMjAyMi1KUCAoYXMKLSAgICB3aWxsIHRoZSBkb2N1bWVudCA8Y29kZT54eHh4Lmppcy5qYTwvY29kZT4pLiBUaGUgQWRkQ2hhcnNldAotICAgIGRpcmVjdGl2ZSBpcyB1c2VmdWwgZm9yIGJvdGggdG8gaW5mb3JtIHRoZSBjbGllbnQgYWJvdXQgdGhlCi0gICAgY2hhcmFjdGVyIGVuY29kaW5nIG9mIHRoZSBkb2N1bWVudCBzbyB0aGF0IHRoZSBkb2N1bWVudCBjYW4gYmUKLSAgICBpbnRlcnByZXRlZCBhbmQgZGlzcGxheWVkIGFwcHJvcHJpYXRlbHksIGFuZCBmb3IgPGEKLSAgICBocmVmPSIuLi9jb250ZW50LW5lZ290aWF0aW9uLmh0bWwiPmNvbnRlbnQgbmVnb3RpYXRpb248L2E+LAotICAgIHdoZXJlIHRoZSBzZXJ2ZXIgcmV0dXJucyBvbmUgZnJvbSBzZXZlcmFsIGRvY3VtZW50cyBiYXNlZCBvbgotICAgIHRoZSBjbGllbnQncyBjaGFyc2V0IHByZWZlcmVuY2UuPC9wPgotCi0gICAgPHA+VGhlIDxlbT5leHRlbnNpb248L2VtPiBhcmd1bWVudCBpcyBjYXNlLWluc2Vuc2l0aXZlLCBhbmQgY2FuCi0gICAgYmUgc3BlY2lmaWVkIHdpdGggb3Igd2l0aG91dCBhIGxlYWRpbmcgZG90LjwvcD4KLQotICAgIDxzZWVhbHNvPjxzdHJvbmc+U2VlIGFsc288L3N0cm9uZz46Ci0gICAgPG1vZHVsZT5tb2RfbmVnb3RpYXRpb248L21vZHVsZT48L3NlZWFsc28+Ci0KLTwvdXNhZ2U+Ci0KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkFkZEVuY29kaW5nPC9uYW1lPgotPHN5bnRheD5BZGRFbmNvZGluZwotICAgIDxlbT5NSU1FLWVuYyBleHRlbnNpb248L2VtPiBbPGVtPmV4dGVuc2lvbjwvZW0+XSAuLi48L3N5bnRheD4KLTxkZWZhdWx0Pk5vbmU8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+Ci08Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PgotPGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0PgotPGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPG92ZXJyaWRlPkZpbGVJbmZvPC9vdmVycmlkZT4KLTwvY29udGV4dGxpc3Q+Ci08ZGVzY3JpcHRpb24+TWFwcyB0aGUgZ2l2ZW4gZmlsZW5hbWUgZXh0ZW5zaW9ucwotICAgIHRvIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcgdHlwZTwvZGVzY3JpcHRpb24+Ci0KLTx1c2FnZT4KLQotICAgIDxwPlRoZSBBZGRFbmNvZGluZyBkaXJlY3RpdmUgbWFwcyB0aGUgZ2l2ZW4gZmlsZW5hbWUgZXh0ZW5zaW9ucwotICAgIHRvIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcgdHlwZS4gPGVtPk1JTUUtZW5jPC9lbT4gaXMgdGhlIE1JTUUKLSAgICBlbmNvZGluZyB0byB1c2UgZm9yIGRvY3VtZW50cyBjb250YWluaW5nIHRoZQotICAgIDxlbT5leHRlbnNpb248L2VtPi4gVGhpcyBtYXBwaW5nIGlzIGFkZGVkIHRvIGFueSBhbHJlYWR5IGluCi0gICAgZm9yY2UsIG92ZXJyaWRpbmcgYW55IG1hcHBpbmdzIHRoYXQgYWxyZWFkeSBleGlzdCBmb3IgdGhlIHNhbWUKLSAgICA8ZW0+ZXh0ZW5zaW9uPC9lbT4uIEV4YW1wbGU6PC9wPgotCi0gICAgPGV4YW1wbGU+Ci0gICAgICBBZGRFbmNvZGluZyB4LWd6aXAgLmd6PGJyIC8+Ci0gICAgICBBZGRFbmNvZGluZyB4LWNvbXByZXNzIC5aCi0gICAgPC9leGFtcGxlPgotCi0gICAgPHA+VGhpcyB3aWxsIGNhdXNlIGZpbGVuYW1lcyBjb250YWluaW5nIHRoZSAuZ3ogZXh0ZW5zaW9uIHRvIGJlCi0gICAgbWFya2VkIGFzIGVuY29kZWQgdXNpbmcgdGhlIHgtZ3ppcCBlbmNvZGluZywgYW5kIGZpbGVuYW1lcwotICAgIGNvbnRhaW5pbmcgdGhlIC5aIGV4dGVuc2lvbiB0byBiZSBtYXJrZWQgYXMgZW5jb2RlZCB3aXRoCi0gICAgeC1jb21wcmVzcy4gPC9wPgotCi0gICAgPHA+T2xkIGNsaWVudHMgZXhwZWN0IDxjb2RlPngtZ3ppcDwvY29kZT4gYW5kCi0gICAgPGNvZGU+eC1jb21wcmVzczwvY29kZT4sIGhvd2V2ZXIgdGhlIHN0YW5kYXJkIGRpY3RhdGVzIHRoYXQKLSAgICB0aGV5J3JlIGVxdWl2YWxlbnQgdG8gPGNvZGU+Z3ppcDwvY29kZT4gYW5kCi0gICAgPGNvZGU+Y29tcHJlc3M8L2NvZGU+IHJlc3BlY3RpdmVseS4gQXBhY2hlIGRvZXMgY29udGVudAotICAgIGVuY29kaW5nIGNvbXBhcmlzb25zIGJ5IGlnbm9yaW5nIGFueSBsZWFkaW5nIDxjb2RlPngtPC9jb2RlPi4KLSAgICBXaGVuIHJlc3BvbmRpbmcgd2l0aCBhbiBlbmNvZGluZyBBcGFjaGUgd2lsbCB1c2Ugd2hhdGV2ZXIgZm9ybQotICAgICg8ZW0+aS5lLjwvZW0+LCA8Y29kZT54LWZvbzwvY29kZT4gb3IgPGNvZGU+Zm9vPC9jb2RlPikgdGhlCi0gICAgY2xpZW50IHJlcXVlc3RlZC4gSWYgdGhlIGNsaWVudCBkaWRuJ3Qgc3BlY2lmaWNhbGx5IHJlcXVlc3QgYQotICAgIHBhcnRpY3VsYXIgZm9ybSBBcGFjaGUgd2lsbCB1c2UgdGhlIGZvcm0gZ2l2ZW4gYnkgdGhlCi0gICAgPGNvZGU+QWRkRW5jb2Rpbmc8L2NvZGU+IGRpcmVjdGl2ZS4gVG8gbWFrZSB0aGlzIGxvbmcgc3RvcnkKLSAgICBzaG9ydCwgeW91IHNob3VsZCBhbHdheXMgdXNlIDxjb2RlPngtZ3ppcDwvY29kZT4gYW5kCi0gICAgPGNvZGU+eC1jb21wcmVzczwvY29kZT4gZm9yIHRoZXNlIHR3byBzcGVjaWZpYyBlbmNvZGluZ3MuIE1vcmUKLSAgICByZWNlbnQgZW5jb2RpbmdzLCBzdWNoIGFzIDxjb2RlPmRlZmxhdGU8L2NvZGU+IHNob3VsZCBiZQotICAgIHNwZWNpZmllZCB3aXRob3V0IHRoZSA8Y29kZT54LTwvY29kZT4uPC9wPgotCi0gICAgPHA+VGhlIDxlbT5leHRlbnNpb248L2VtPiBhcmd1bWVudCBpcyBjYXNlLWluc2Vuc2l0aXZlLCBhbmQgY2FuCi0gICAgYmUgc3BlY2lmaWVkIHdpdGggb3Igd2l0aG91dCBhIGxlYWRpbmcgZG90LjwvcD4KLQotICAgIDxzZWVhbHNvPjxzdHJvbmc+U2VlIGFsc288L3N0cm9uZz46IDxhIGhyZWY9IiNtdWx0aXBsZWV4dCI+RmlsZXMgd2l0aAotICAgIG11bHRpcGxlIGV4dGVuc2lvbnM8L2E+PC9zZWVhbHNvPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkFkZEhhbmRsZXI8L25hbWU+Ci08c3ludGF4PkFkZEhhbmRsZXIKLSAgICA8ZW0+aGFuZGxlci1uYW1lIGV4dGVuc2lvbjwvZW0+IFs8ZW0+ZXh0ZW5zaW9uPC9lbT5dIC4uLjwvc3ludGF4PgotPGRlZmF1bHQ+Tm9uZTwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD4KLTxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+Ci08Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+Ci08Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPkZpbGVJbmZvPC9vdmVycmlkZT4KLTxjb21wYXRpYmlsaXR5PjwvY29tcGF0aWJpbGl0eT4KLTxkZXNjcmlwdGlvbj5BZGRIYW5kbGVyIG1hcHMgdGhlIGZpbGVuYW1lIGV4dGVuc2lvbnMgPGVtPmV4dGVuc2lvbjwvZW0+Ci10byB0aGUgPGEgaHJlZj0iLi4vaGFuZGxlci5odG1sIj5oYW5kbGVyPC9hPiA8ZW0+aGFuZGxlci1uYW1lPC9lbT4uCi08L2Rlc2NyaXB0aW9uPgotCi08dXNhZ2U+Ci08cD5UaGlzIG1hcHBpbmcgaXMgYWRkZWQgdG8gYW55IGFscmVhZHkgaW4KLSAgICBmb3JjZSwgb3ZlcnJpZGluZyBhbnkgbWFwcGluZ3MgdGhhdCBhbHJlYWR5IGV4aXN0IGZvciB0aGUgc2FtZQotICAgIDxlbT5leHRlbnNpb248L2VtPi4gRm9yIGV4YW1wbGUsIHRvIGFjdGl2YXRlIENHSSBzY3JpcHRzIHdpdGgKLSAgICB0aGUgZmlsZSBleHRlbnNpb24gIjxjb2RlPi5jZ2k8L2NvZGU+IiwgeW91IG1pZ2h0IHVzZTo8L3A+Ci0KLTxleGFtcGxlPgotICAgIEFkZEhhbmRsZXIgY2dpLXNjcmlwdCAuY2dpCi08L2V4YW1wbGU+Ci0KLSAgICA8cD5PbmNlIHRoYXQgaGFzIGJlZW4gcHV0IGludG8geW91ciBzcm0uY29uZiBvciBodHRwZC5jb25mCi0gICAgZmlsZSwgYW55IGZpbGUgY29udGFpbmluZyB0aGUgIjxjb2RlPi5jZ2k8L2NvZGU+IiBleHRlbnNpb24KLSAgICB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBDR0kgcHJvZ3JhbS48L3A+Ci0KLSAgICA8cD5UaGUgPGVtPmV4dGVuc2lvbjwvZW0+IGFyZ3VtZW50IGlzIGNhc2UtaW5zZW5zaXRpdmUsIGFuZCBjYW4KLSAgICBiZSBzcGVjaWZpZWQgd2l0aCBvciB3aXRob3V0IGEgbGVhZGluZyBkb3QuPC9wPgotCi0gICAgPHNlZWFsc28+PHN0cm9uZz5TZWUgYWxzbzwvc3Ryb25nPjogPGEgaHJlZj0iI211bHRpcGxlZXh0Ij5GaWxlcyB3aXRoCi0gICAgbXVsdGlwbGUgZXh0ZW5zaW9uczwvYT48L3NlZWFsc28+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+QWRkSW5wdXRGaWx0ZXI8L25hbWU+Ci08c3ludGF4PkFkZElucHV0RmlsdGVyCi0gICAgPGVtPmZpbHRlcjwvZW0+WzxlbT47ZmlsdGVyPC9lbT4uLi5dIGV4dGVuc2lvbgotICAgIFs8ZW0+ZXh0ZW5zaW9uPC9lbT4gLi4uXTwvc3ludGF4PgotPGRlZmF1bHQ+Tm9uZTwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD4KLTxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+Ci08Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+Ci08Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPGNvbXBhdGliaWxpdHk+QWRkSW5wdXRGaWx0ZXIKLSAgICBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUgMi4wLjI2IGFuZCBsYXRlci48L2NvbXBhdGliaWxpdHk+Ci08ZGVzY3JpcHRpb24+TWFwcyB0aGUgZmlsZW5hbWUgZXh0ZW5zaW9ucwotICAgIDxlbT5leHRlbnNpb248L2VtPiB0byB0aGUgZmlsdGVyIG9yIGZpbHRlcnMgd2hpY2ggd2lsbCBwcm9jZXNzCi0gICAgY2xpZW50IHJlcXVlc3RzIGFuZCBQT1NUIGlucHV0IHdoZW4gdGhleSBhcmUgcmVjZWl2ZWQgYnkgdGhlCi0gICAgc2VydmVyLjwvZGVzY3JpcHRpb24+Ci0KLTx1c2FnZT4KLQotICAgIDxwPkFkZElucHV0RmlsdGVyIG1hcHMgdGhlIGZpbGVuYW1lIGV4dGVuc2lvbnMKLSAgICA8ZW0+ZXh0ZW5zaW9uPC9lbT4gdG8gdGhlIGZpbHRlciBvciBmaWx0ZXJzIHdoaWNoIHdpbGwgcHJvY2VzcwotICAgIGNsaWVudCByZXF1ZXN0cyBhbmQgUE9TVCBpbnB1dCB3aGVuIHRoZXkgYXJlIHJlY2VpdmVkIGJ5IHRoZQotICAgIHNlcnZlci4gVGhpcyBpcyBpbiBhZGRpdGlvbiB0byBhbnkgZmlsdGVycyBkZWZpbmVkIGVsc2V3aGVyZSwKLSAgICBpbmNsdWRpbmcgdGhlIDxhCi0gICAgaHJlZj0iY29yZS5odG1sI3NldGlucHV0ZmlsdGVyIj5TZXRJbnB1dEZpbHRlcjwvYT4gZGlyZWN0aXZlLgotICAgIFRoaXMgbWFwcGluZyBpcyBtZXJnZWQgb3ZlciBhbnkgYWxyZWFkeSBpbiBmb3JjZSwgb3ZlcnJpZGluZwotICAgIGFueSBtYXBwaW5ncyB0aGF0IGFscmVhZHkgZXhpc3QgZm9yIHRoZSBzYW1lCi0gICAgPGVtPmV4dGVuc2lvbjwvZW0+LjwvcD4KLQotICAgIDxwPklmIG1vcmUgdGhhbiBvbmUgZmlsdGVyIGlzIHNwZWNpZmllZCwgdGhleSBtdXN0IGJlIHNlcGFyYXRlZAotICAgIGJ5IHNlbWljb2xvbnMgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgc2hvdWxkIHByb2Nlc3MgdGhlCi0gICAgY29udGVudC4gQm90aCB0aGUgZmlsdGVyIGFuZCA8ZW0+ZXh0ZW5zaW9uPC9lbT4gYXJndW1lbnRzIGFyZQotICAgIGNhc2UtaW5zZW5zaXRpdmUsIGFuZCB0aGUgZXh0ZW5zaW9uIG1heSBiZSBzcGVjaWZpZWQgd2l0aCBvcgotICAgIHdpdGhvdXQgYSBsZWFkaW5nIGRvdC48L3A+Ci0KLSAgICA8c2VlYWxzbz5TZWUgYWxzbyB0aGUgPGEgaHJlZj0iLi4vZmlsdGVyLmh0bWwiPkZpbHRlcnM8L2E+Ci0gICAgZG9jdW1lbnRhdGlvbi48L3NlZWFsc28+Ci08L3VzYWdlPgotCi08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkFkZExhbmd1YWdlPC9uYW1lPgotPHN5bnRheD5BZGRMYW5ndWFnZQotICAgIDxlbT5NSU1FLWxhbmcgZXh0ZW5zaW9uPC9lbT4gWzxlbT5leHRlbnNpb248L2VtPl0gLi4uPC9zeW50YXg+Ci08ZGVmYXVsdD5Ob25lPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0PgotPGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD4KLTxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+RmlsZUluZm88L292ZXJyaWRlPgotPGRlc2NyaXB0aW9uPm1hcHMgdGhlIGdpdmVuIGZpbGVuYW1lIGV4dGVuc2lvbgotdG8gdGhlIHNwZWNpZmllZCBjb250ZW50IGxhbmd1YWdlLjwvZGVzY3JpcHRpb24+Ci0KLTx1c2FnZT4KLQotICAgIDxwPlRoZSBBZGRMYW5ndWFnZSBkaXJlY3RpdmUgbWFwcyB0aGUgZ2l2ZW4gZmlsZW5hbWUgZXh0ZW5zaW9uCi0gICAgdG8gdGhlIHNwZWNpZmllZCBjb250ZW50IGxhbmd1YWdlLiA8ZW0+TUlNRS1sYW5nPC9lbT4gaXMgdGhlCi0gICAgTUlNRSBsYW5ndWFnZSBvZiBmaWxlbmFtZXMgY29udGFpbmluZyA8ZW0+ZXh0ZW5zaW9uPC9lbT4uIFRoaXMKLSAgICBtYXBwaW5nIGlzIGFkZGVkIHRvIGFueSBhbHJlYWR5IGluIGZvcmNlLCBvdmVycmlkaW5nIGFueQotICAgIG1hcHBpbmdzIHRoYXQgYWxyZWFkeSBleGlzdCBmb3IgdGhlIHNhbWUKLSAgICA8ZW0+ZXh0ZW5zaW9uPC9lbT4uPC9wPgotCi0gICAgPHA+RXhhbXBsZTo8L3A+Ci0KLSAgICA8ZXhhbXBsZT4KLSAgICAgIEFkZEVuY29kaW5nIHgtY29tcHJlc3MgLlo8YnIgLz4KLSAgICAgICBBZGRMYW5ndWFnZSBlbiAuZW48YnIgLz4KLSAgICAgICBBZGRMYW5ndWFnZSBmciAuZnIKLSAgICA8L2V4YW1wbGU+Ci0KLSAgICA8cD5UaGVuIHRoZSBkb2N1bWVudCA8Y29kZT54eHh4LmVuLlo8L2NvZGU+IHdpbGwgYmUgdHJlYXRlZCBhcwotICAgIGJlaW5nIGEgY29tcHJlc3NlZCBFbmdsaXNoIGRvY3VtZW50IChhcyB3aWxsIHRoZSBkb2N1bWVudAotICAgIDxjb2RlPnh4eHguWi5lbjwvY29kZT4pLiBBbHRob3VnaCB0aGUgY29udGVudCBsYW5ndWFnZSBpcwotICAgIHJlcG9ydGVkIHRvIHRoZSBjbGllbnQsIHRoZSBicm93c2VyIGlzIHVubGlrZWx5IHRvIHVzZSB0aGlzCi0gICAgaW5mb3JtYXRpb24uIFRoZSBBZGRMYW5ndWFnZSBkaXJlY3RpdmUgaXMgbW9yZSB1c2VmdWwgZm9yIDxhCi0gICAgaHJlZj0iLi4vY29udGVudC1uZWdvdGlhdGlvbi5odG1sIj5jb250ZW50IG5lZ290aWF0aW9uPC9hPiwKLSAgICB3aGVyZSB0aGUgc2VydmVyIHJldHVybnMgb25lIGZyb20gc2V2ZXJhbCBkb2N1bWVudHMgYmFzZWQgb24KLSAgICB0aGUgY2xpZW50J3MgbGFuZ3VhZ2UgcHJlZmVyZW5jZS48L3A+Ci0KLSAgICA8cD5JZiBtdWx0aXBsZSBsYW5ndWFnZSBhc3NpZ25tZW50cyBhcmUgbWFkZSBmb3IgdGhlIHNhbWUKLSAgICBleHRlbnNpb24sIHRoZSBsYXN0IG9uZSBlbmNvdW50ZXJlZCBpcyB0aGUgb25lIHRoYXQgaXMgdXNlZC4KLSAgICBUaGF0IGlzLCBmb3IgdGhlIGNhc2Ugb2Y6PC9wPgotCi08ZXhhbXBsZT4KLSAgICBBZGRMYW5ndWFnZSBlbiAuZW48YnIgLz4KLSAgICBBZGRMYW5ndWFnZSBlbi11ayAuZW48YnIgLz4KLSAgICBBZGRMYW5ndWFnZSBlbi11cyAuZW4KLTwvZXhhbXBsZT4KLQotICAgIDxwPmRvY3VtZW50cyB3aXRoIHRoZSBleHRlbnNpb24gIjxjb2RlPi5lbjwvY29kZT4iIHdvdWxkIGJlCi0gICAgdHJlYXRlZCBhcyBiZWluZyAiPGNvZGU+ZW4tdXM8L2NvZGU+Ii48L3A+Ci0KLSAgICA8cD5UaGUgPGVtPmV4dGVuc2lvbjwvZW0+IGFyZ3VtZW50IGlzIGNhc2UtaW5zZW5zaXRpdmUsIGFuZCBjYW4KLSAgICBiZSBzcGVjaWZpZWQgd2l0aCBvciB3aXRob3V0IGEgbGVhZGluZyBkb3QuPC9wPgotCi0gICAgPHNlZWFsc28+PHN0cm9uZz5TZWUgYWxzbzwvc3Ryb25nPjogPGEgaHJlZj0iI211bHRpcGxlZXh0Ij5GaWxlcyB3aXRoCi0gICAgbXVsdGlwbGUgZXh0ZW5zaW9uczwvYT4sIDxtb2R1bGU+bW9kX25lZ290aWF0aW9uPC9tb2R1bGU+PC9zZWVhbHNvPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkFkZE91dHB1dEZpbHRlcjwvbmFtZT4KLTxzeW50YXg+QWRkT3V0cHV0RmlsdGVyCi0gICAgPGVtPmZpbHRlcjwvZW0+WzxlbT47ZmlsdGVyPC9lbT4uLi5dIGV4dGVuc2lvbgotICAgIFs8ZW0+ZXh0ZW5zaW9uPC9lbT4gLi4uXTwvc3ludGF4PgotPGRlZmF1bHQ+Tm9uZTwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD4KLTxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+Ci08Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+Ci08Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPjwvb3ZlcnJpZGU+Ci08Y29tcGF0aWJpbGl0eT5BZGRPdXRwdXRGaWx0ZXIKLSAgICBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUgMi4wLjI2IGFuZCBsYXRlci48L2NvbXBhdGliaWxpdHk+Ci08ZGVzY3JpcHRpb24+bWFwcyB0aGUgZmlsZW5hbWUKLWV4dGVuc2lvbnMgPGVtPmV4dGVuc2lvbjwvZW0+IHRvIHRoZSBmaWx0ZXJzIHdoaWNoIHdpbGwgcHJvY2VzcwotcmVzcG9uc2VzIGZyb20gdGhlIHNlcnZlciBiZWZvcmUgdGhleSBhcmUgc2VudCB0byB0aGUgCi1jbGllbnQuPC9kZXNjcmlwdGlvbj4KLQotPHVzYWdlPgotCi0gICAgPHA+VGhlIDxkaXJlY3RpdmU+QWRkT3V0cHV0RmlsdGVyPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBtYXBzIHRoZSBmaWxlbmFtZQotICAgIGV4dGVuc2lvbnMgPGVtPmV4dGVuc2lvbjwvZW0+IHRvIHRoZSBmaWx0ZXJzIHdoaWNoIHdpbGwgcHJvY2VzcwotICAgIHJlc3BvbnNlcyBmcm9tIHRoZSBzZXJ2ZXIgYmVmb3JlIHRoZXkgYXJlIHNlbnQgdG8gdGhlIGNsaWVudC4KLSAgICBUaGlzIGlzIGluIGFkZGl0aW9uIHRvIGFueSBmaWx0ZXJzIGRlZmluZWQgZWxzZXdoZXJlLCBpbmNsdWRpbmcKLSAgICB0aGUgPGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiPlNldE91dHB1dEZpbHRlcjwvZGlyZWN0aXZlPgotICAgIGRpcmVjdGl2ZS4gVGhpcyBtYXBwaW5nIGlzIG1lcmdlZCBvdmVyIGFueSBhbHJlYWR5IGluIGZvcmNlLAotICAgIG92ZXJyaWRpbmcgYW55IG1hcHBpbmdzIHRoYXQgYWxyZWFkeSBleGlzdCBmb3IgdGhlIHNhbWUKLSAgICA8ZW0+ZXh0ZW5zaW9uPC9lbT4uPC9wPgotCi0gICAgPHA+Rm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiB3aWxsIHByb2Nlc3MgYWxsCi0gICAgLnNodG1sIGZpbGVzIGZvciBzZXJ2ZXItc2lkZSBpbmNsdWRlcy48L3A+Ci0gICAgIAotCi0gICAgPGV4YW1wbGU+Ci0gICAgICAmbmJzcDsmbmJzcDtBZGRPdXRwdXRGaWx0ZXIgSU5DTFVERVMgc2h0bWwKLSAgICA8L2V4YW1wbGU+Ci0KLSAgICA8cD5JZiBtb3JlIHRoYW4gb25lIGZpbHRlciBpcyBzcGVjaWZpZWQsIHRoZXkgbXVzdCBiZSBzZXBhcmF0ZWQKLSAgICBieSBzZW1pY29sb25zIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHNob3VsZCBwcm9jZXNzIHRoZQotICAgIGNvbnRlbnQuIEJvdGggdGhlIGZpbHRlciBhbmQgPGVtPmV4dGVuc2lvbjwvZW0+IGFyZ3VtZW50cyBhcmUKLSAgICBjYXNlLWluc2Vuc2l0aXZlLCBhbmQgdGhlIGV4dGVuc2lvbiBtYXkgYmUgc3BlY2lmaWVkIHdpdGggb3IKLSAgICB3aXRob3V0IGEgbGVhZGluZyBkb3QuPC9wPgotCi0gICAgPHNlZWFsc28+U2VlIGFsc28gdGhlIDxhIGhyZWY9Ii4uL2ZpbHRlci5odG1sIj5GaWx0ZXJzPC9hPgotICAgIGRvY3VtZW50YXRpb24uPC9zZWVhbHNvPgotCi08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+QWRkVHlwZTwvbmFtZT4KLTxzeW50YXg+QWRkVHlwZSA8ZW0+TUlNRS10eXBlCi0gICAgZXh0ZW5zaW9uPC9lbT4gWzxlbT5leHRlbnNpb248L2VtPl0gLi4uPC9zeW50YXg+Ci08ZGVmYXVsdD5Ob25lPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0PgotPGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD4KLTxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+RmlsZUluZm88L292ZXJyaWRlPgotPGRlc2NyaXB0aW9uPm1hcHMgdGhlIGdpdmVuIGZpbGVuYW1lIGV4dGVuc2lvbnMKLW9udG8gdGhlIHNwZWNpZmllZCBjb250ZW50IHR5cGUuPC9kZXNjcmlwdGlvbj4KLQotPHVzYWdlPgotCi0gICAgPHA+VGhlIEFkZFR5cGUgZGlyZWN0aXZlIG1hcHMgdGhlIGdpdmVuIGZpbGVuYW1lIGV4dGVuc2lvbnMKLSAgICBvbnRvIHRoZSBzcGVjaWZpZWQgY29udGVudCB0eXBlLiA8ZW0+TUlNRS10eXBlPC9lbT4gaXMgdGhlIE1JTUUKLSAgICB0eXBlIHRvIHVzZSBmb3IgZmlsZW5hbWVzIGNvbnRhaW5pbmcgPGVtPmV4dGVuc2lvbjwvZW0+LiBUaGlzCi0gICAgbWFwcGluZyBpcyBhZGRlZCB0byBhbnkgYWxyZWFkeSBpbiBmb3JjZSwgb3ZlcnJpZGluZyBhbnkKLSAgICBtYXBwaW5ncyB0aGF0IGFscmVhZHkgZXhpc3QgZm9yIHRoZSBzYW1lIDxlbT5leHRlbnNpb248L2VtPi4KLSAgICBUaGlzIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBhZGQgbWFwcGluZ3Mgbm90IGxpc3RlZCBpbiB0aGUKLSAgICBNSU1FIHR5cGVzIGZpbGUgKHNlZSB0aGUgPGRpcmVjdGl2ZT5UeXBlc0NvbmZpZzwvZGlyZWN0aXZlPgotICAgIGRpcmVjdGl2ZSkuPC9wPgotICAgIAotICAgIDxwPkV4YW1wbGU6PC9wPgotCi0gICAgPGV4YW1wbGU+Ci0gICAgICBBZGRUeXBlIGltYWdlL2dpZiAuZ2lmCi0gICAgPC9leGFtcGxlPgotCi0gICAgPG5vdGU+SXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuZXcgTUlNRSB0eXBlcyBiZSBhZGRlZCB1c2luZyB0aGUKLSAgICBBZGRUeXBlIGRpcmVjdGl2ZSByYXRoZXIgdGhhbiBjaGFuZ2luZyB0aGUgCi0gICAgPGRpcmVjdGl2ZT5UeXBlc0NvbmZpZzwvZGlyZWN0aXZlPiBmaWxlLiA8L25vdGU+Ci0KLSAgICA8bm90ZT5Ob3RlIHRoYXQsIHVubGlrZSB0aGUgTkNTQSBodHRwZCwgdGhpcyBkaXJlY3RpdmUgY2Fubm90IGJlCi0gICAgdXNlZCB0byBzZXQgdGhlIHR5cGUgb2YgcGFydGljdWxhciBmaWxlcy48L25vdGU+Ci0KLSAgICA8cD5UaGUgPGVtPmV4dGVuc2lvbjwvZW0+IGFyZ3VtZW50IGlzIGNhc2UtaW5zZW5zaXRpdmUsIGFuZCBjYW4KLSAgICBiZSBzcGVjaWZpZWQgd2l0aCBvciB3aXRob3V0IGEgbGVhZGluZyBkb3QuPC9wPgotCi0gICAgPHNlZWFsc28+PHN0cm9uZz5TZWUgYWxzbzwvc3Ryb25nPjogPGEgaHJlZj0iI211bHRpcGxlZXh0Ij5GaWxlcyB3aXRoCi0gICAgbXVsdGlwbGUgZXh0ZW5zaW9uczwvYT48L3NlZWFsc28+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+TXVsdGl2aWV3c01hdGNoPC9uYW1lPgotPHN5bnRheD5NdWx0aXZpZXdzTWF0Y2gKLSAgICA8ZW0+W05lZ290aWF0ZWRPbmx5XSBbSGFuZGxlcnNdIFtGaWx0ZXJzXSBbQW55XTwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5Ob25lPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0PgotPGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD4KLTxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+RmlsZUluZm88L292ZXJyaWRlPgotPGNvbXBhdGliaWxpdHk+b25seSBhdmFpbGFibGUgCi0gICAgaW4gQXBhY2hlIDIuMC4yNiBhbmQgbGF0ZXIuPC9jb21wYXRpYmlsaXR5PgotCi08dXNhZ2U+Ci0KLSAgICA8cD5NdWx0aXZpZXdzTWF0Y2ggcGVybWl0cyB0aHJlZSBkaWZmZXJlbnQgYmVoYXZpb3JzIGZvcgotICAgIDxhIGhyZWY9Im1vZF9uZWdvdGlhdGlvbi5odG1sIj5tb2RfbmVnb3RpYXRpb248L2E+J3MgTXVsdGl2aWV3cyAKLSAgICBmZWF0dXJlLiAgTXVsdGl2aWV3cyBhbGxvd3MgYSByZXF1ZXN0IGZvciBhIGZpbGUsIGUuZy4gaW5kZXguaHRtbCwKLSAgICB0byBtYXRjaCBhbnkgbmVnb3RpYXRlZCBleHRlbnNpb25zIGZvbGxvd2luZyB0aGUgYmFzZSByZXF1ZXN0LAotICAgIGUuZy4gaW5kZXguaHRtbC5lbiwgaW5kZXguaHRtbCxmciwgb3IgaW5kZXguaHRtbC5nei48L3A+Ci0KLSAgICA8cD5UaGUgTmVnb3RpYXRlZE9ubHkgb3B0aW9uIHByb3ZpZGVzIHRoYXQgZXZlcnkgZXh0ZW5zaW9uIGZvbGxvd2luZwotICAgIHRoZSBiYXNlIG5hbWUgbXVzdCBjb3JyZWxhdGUgdG8gYSByZWNvZ25pemVkIG1vZF9taW1lIGV4dGVuc2lvbiBmb3IKLSAgICBjb250ZW50IG5lZ290YXRpb24sIGUuZy4gQ2hhcnNldCwgQ29udGVudC1UeXBlLCBMYW5ndWFnZSwgb3IgCi0gICAgRW5jb2RpbmcuICBUaGlzIGlzIHRoZSBzdHJpY3Rlc3QgaW1wbGVtZW50YXRpb24gd2l0aCB0aGUgZmV3ZXN0Ci0gICAgdW5leHBlY3RlZCBzaWRlIGVmZmVjdHMsIGFuZCBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvci48L3A+Ci0KLSAgICA8cD5UbyBpbmNsdWRlIGV4dGVuc2lvbnMgYXNzb2NpYXRlZCB3aXRoIEhhbmRsZXJzIGFuZC9vciBGaWx0ZXJzLAotICAgIHNldCB0aGUgTXVsdGl2aWV3c01hdGNoIGRpcmVjdGl2ZSB0byBlaXRoZXIgSGFuZGxlcnMsIEZpbHRlcnMsIG9yCi0gICAgYm90aCBvcHRpb24ga2V5d29yZHMuICBJZiBhbGwgb3RoZXIgZmFjdG9ycyBhcmUgZXF1YWwsIHRoZSBzbWFsbGVzdAotICAgIGZpbGUgd2lsbCBiZSBzZXJ2ZWQsIGUuZy4gaW4gZGVjaWRpbmcgYmV0d2VlbiBpbmRleC5odG1sLmNnaSBvZiA1MDAKLSAgICBjaGFyYWN0ZXJzIGFuZCBpbmRleC5odG1sLnBsIG9mIDEwMDAgYnl0ZXMsIHRoZSAuY2dpIGZpbGUgd291bGQgd2luCi0gICAgaW4gdGhpcyBleGFtcGxlLiAgVXNlcnMgb2YgLmFzaXMgZmlsZXMgbWlnaHQgcHJlZmVyIHRvIHVzZSB0aGUKLSAgICBIYW5kbGVyIG9wdGlvbiwgaWYgLmFzaXMgZmlsZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNpcy1oYW5kbGVyLjwvcD4KLQotICAgIDxwPllvdSBtYXkgZmluYWxseSBhbGxvdyBBbnkgZXh0ZW5zaW9ucyB0byBtYXRjaCwgZXZlbiBpZiBtb2RfbWltZSAKLSAgICBkb2Vzbid0IHJlY29nbml6ZSB0aGUgZXh0ZW5zaW9uLiAgVGhpcyB3YXMgdGhlIGJlaGF2aW9yIGluIEFwYWNoZSAxLjMsCi0gICAgYW5kIGNhbiBjYXVzZSB1bnByZWRpY2F0YWJsZSByZXN1bHRzLCBzdWNoIGFzIHNlcnZpbmcgLm9sZCBvciAuYmFrCi0gICAgZmlsZXMgdGhlIHdlYm1hc3RlciBuZXZlciBleHBlY3RlZCB0byBiZSBzZXJ2ZWQuPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkRlZmF1bHRMYW5ndWFnZTwvbmFtZT4KLTxzeW50YXg+RGVmYXVsdExhbmd1YWdlCi0gICAgPGVtPk1JTUUtbGFuZzwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5Ob25lPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0PgotPGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD4KLTxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+RmlsZUluZm88L292ZXJyaWRlPgotPGNvbXBhdGliaWxpdHk+RGVmYXVsdExhbmd1YWdlCi0gICAgaXMgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDEuMy40IGFuZCBsYXRlci48L2NvbXBhdGliaWxpdHk+Ci08ZGVzY3JpcHRpb24+U2V0cyBhbGwgZmlsZXMgaW4gdGhlIGdpdmVuIHNjb3BlIHRvIHRoZSAKLXNwZWNpZmllZCBsYW5ndWFnZTwvZGVzY3JpcHRpb24+Ci0KLTx1c2FnZT4KLQotICAgIDxwPlRoZSBEZWZhdWx0TGFuZ3VhZ2UgZGlyZWN0aXZlIHRlbGxzIEFwYWNoZSB0aGF0IGFsbCBmaWxlcyBpbgotICAgIHRoZSBkaXJlY3RpdmUncyBzY29wZSAoPGVtPmUuZy48L2VtPiwgYWxsIGZpbGVzIGNvdmVyZWQgYnkgdGhlCi0gICAgY3VycmVudCA8Y29kZT4mbHQ7RGlyZWN0b3J5Jmd0OzwvY29kZT4gY29udGFpbmVyKSB0aGF0IGRvbid0Ci0gICAgaGF2ZSBhbiBleHBsaWNpdCBsYW5ndWFnZSBleHRlbnNpb24gKHN1Y2ggYXMgPHNhbXA+LmZyPC9zYW1wPgotICAgIG9yIDxzYW1wPi5kZTwvc2FtcD4gYXMgY29uZmlndXJlZCBieSA8c2FtcD5BZGRMYW5ndWFnZTwvc2FtcD4pCi0gICAgc2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgaW4gdGhlIHNwZWNpZmllZCA8ZW0+TUlNRS1sYW5nPC9lbT4KLSAgICBsYW5ndWFnZS4gVGhpcyBhbGxvd3MgZW50aXJlIGRpcmVjdG9yaWVzIHRvIGJlIG1hcmtlZCBhcwotICAgIGNvbnRhaW5pbmcgRHV0Y2ggY29udGVudCwgZm9yIGluc3RhbmNlLCB3aXRob3V0IGhhdmluZyB0bwotICAgIHJlbmFtZSBlYWNoIGZpbGUuIE5vdGUgdGhhdCB1bmxpa2UgdXNpbmcgZXh0ZW5zaW9ucyB0byBzcGVjaWZ5Ci0gICAgbGFuZ3VhZ2VzLCA8c2FtcD5EZWZhdWx0TGFuZ3VhZ2U8L3NhbXA+IGNhbiBvbmx5IHNwZWNpZnkgYQotICAgIHNpbmdsZSBsYW5ndWFnZS48L3A+Ci0KLSAgICA8cD5JZiBubyA8c2FtcD5EZWZhdWx0TGFuZ3VhZ2U8L3NhbXA+IGRpcmVjdGl2ZSBpcyBpbiBmb3JjZSwKLSAgICBhbmQgYSBmaWxlIGRvZXMgbm90IGhhdmUgYW55IGxhbmd1YWdlIGV4dGVuc2lvbnMgYXMgY29uZmlndXJlZAotICAgIGJ5IDxzYW1wPkFkZExhbmd1YWdlPC9zYW1wPiwgdGhlbiB0aGF0IGZpbGUgd2lsbCBiZSBjb25zaWRlcmVkCi0gICAgdG8gaGF2ZSBubyBsYW5ndWFnZSBhdHRyaWJ1dGUuPC9wPgotCi0gICAgPHNlZWFsc28+PHN0cm9uZz5TZWUgYWxzbzwvc3Ryb25nPjogPGEgaHJlZj0iI211bHRpcGxlZXh0Ij5GaWxlcyB3aXRoCi0gICAgbXVsdGlwbGUgZXh0ZW5zaW9uczwvYT4sIDxtb2R1bGU+bW9kX25lZ290aWF0aW9uPC9tb2R1bGU+PC9zZWVhbHNvPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+UmVtb3ZlQ2hhcnNldDwvbmFtZT4KLTxzeW50YXg+UmVtb3ZlQ2hhcnNldAotICAgIDxlbT5leHRlbnNpb248L2VtPiBbPGVtPmV4dGVuc2lvbjwvZW0+XSAuLi48L3N5bnRheD4KLTxkZWZhdWx0Pk5vbmU8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+Ci08Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPGNvbXBhdGliaWxpdHk+UmVtb3ZlQ2hhcnNldCBpcwotICAgIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZSAyLjAuMjQgYW5kIGxhdGVyLjwvY29tcGF0aWJpbGl0eT4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8c2FtcD5SZW1vdmVDaGFyc2V0PC9zYW1wPiBkaXJlY3RpdmUgcmVtb3ZlcyBhbnkKLSAgICBjaGFyYWN0ZXIgc2V0IGFzc29jaWF0aW9ucyBmb3IgZmlsZXMgd2l0aCB0aGUgZ2l2ZW4gZXh0ZW5zaW9ucy4KLSAgICBUaGlzIGFsbG93cyA8Y29kZT4uaHRhY2Nlc3M8L2NvZGU+IGZpbGVzIGluIHN1YmRpcmVjdG9yaWVzIHRvCi0gICAgdW5kbyBhbnkgYXNzb2NpYXRpb25zIGluaGVyaXRlZCBmcm9tIHBhcmVudCBkaXJlY3RvcmllcyBvciB0aGUKLSAgICBzZXJ2ZXIgY29uZmlnIGZpbGVzLjwvcD4KLQotICAgIDxwPlRoZSA8ZW0+ZXh0ZW5zaW9uPC9lbT4gYXJndW1lbnQgaXMgY2FzZS1pbnNlbnNpdGl2ZSwgYW5kIGNhbgotICAgIGJlIHNwZWNpZmllZCB3aXRoIG9yIHdpdGhvdXQgYSBsZWFkaW5nIGRvdC48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+UmVtb3ZlRW5jb2Rpbmc8L25hbWU+Ci08c3ludGF4PlJlbW92ZUVuY29kaW5nCi0gICAgPGVtPmV4dGVuc2lvbjwvZW0+IFs8ZW0+ZXh0ZW5zaW9uPC9lbT5dIC4uLjwvc3ludGF4PgotPGRlZmF1bHQ+Tm9uZTwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD4KLTxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08Y29tcGF0aWJpbGl0eT5SZW1vdmVFbmNvZGluZwotICAgIGlzIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZSAxLjMuMTMgYW5kIGxhdGVyLjwvY29tcGF0aWJpbGl0eT4KLQotPHVzYWdlPgotCi0gICAgPHA+VGhlIDxzYW1wPlJlbW92ZUVuY29kaW5nPC9zYW1wPiBkaXJlY3RpdmUgcmVtb3ZlcyBhbnkKLSAgICBlbmNvZGluZyBhc3NvY2lhdGlvbnMgZm9yIGZpbGVzIHdpdGggdGhlIGdpdmVuIGV4dGVuc2lvbnMuIFRoaXMKLSAgICBhbGxvd3MgPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBmaWxlcyBpbiBzdWJkaXJlY3RvcmllcyB0byB1bmRvCi0gICAgYW55IGFzc29jaWF0aW9ucyBpbmhlcml0ZWQgZnJvbSBwYXJlbnQgZGlyZWN0b3JpZXMgb3IgdGhlCi0gICAgc2VydmVyIGNvbmZpZyBmaWxlcy4gQW4gZXhhbXBsZSBvZiBpdHMgdXNlIG1pZ2h0IGJlOjwvcD4KLQotCi08ZXhhbXBsZT4KLSAgICA8ZGw+Ci0gICAgICA8ZHQ+PGNvZGU+L2Zvby8uaHRhY2Nlc3M6PC9jb2RlPjwvZHQ+Ci0gICAgICA8ZGQ+PGNvZGU+QWRkRW5jb2RpbmcgeC1nemlwIC5nejwvY29kZT48YnIgLz4KLSAgICAgICA8Y29kZT5BZGRUeXBlIHRleHQvcGxhaW4gLmFzYzwvY29kZT48YnIgLz4KLSAgICAgICA8Y29kZT4mbHQ7RmlsZXMgKi5nei5hc2MmZ3Q7PC9jb2RlPjxiciAvPgotICAgICAgIDxjb2RlPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JlbW92ZUVuY29kaW5nCi0gICAgICAuZ3o8L2NvZGU+PGJyIC8+Ci0gICAgICAgPGNvZGU+Jmx0Oy9GaWxlcyZndDs8L2NvZGU+PC9kZD4KLSAgICA8L2RsPgotPC9leGFtcGxlPgotCi0gICAgPHA+VGhpcyB3aWxsIGNhdXNlIDxjb2RlPmZvby5nejwvY29kZT4gdG8gYmUgbWFya2VkIGFzIGJlaW5nCi0gICAgZW5jb2RlZCB3aXRoIHRoZSBnemlwIG1ldGhvZCwgYnV0IDxjb2RlPmZvby5nei5hc2M8L2NvZGU+IGFzIGFuCi0gICAgdW5lbmNvZGVkIHBsYWludGV4dCBmaWxlLjwvcD4KLQotICAgIDxwPjxiPk5vdGU6PC9iPlJlbW92ZUVuY29kaW5nIGRpcmVjdGl2ZXMgYXJlIHByb2Nlc3NlZAotICAgIDxpPmFmdGVyPC9pPiBhbnkgQWRkRW5jb2RpbmcgZGlyZWN0aXZlcywgc28gaXQgaXMgcG9zc2libGUgdGhleQotICAgIG1heSB1bmRvIHRoZSBlZmZlY3RzIG9mIHRoZSBsYXR0ZXIgaWYgYm90aCBvY2N1ciB3aXRoaW4gdGhlCi0gICAgc2FtZSBkaXJlY3RvcnkgY29uZmlndXJhdGlvbi48L3A+Ci0KLSAgICA8cD5UaGUgPGVtPmV4dGVuc2lvbjwvZW0+IGFyZ3VtZW50IGlzIGNhc2UtaW5zZW5zaXRpdmUsIGFuZCBjYW4KLSAgICBiZSBzcGVjaWZpZWQgd2l0aCBvciB3aXRob3V0IGEgbGVhZGluZyBkb3QuPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+UmVtb3ZlSGFuZGxlcjwvbmFtZT4KLTxzeW50YXg+UmVtb3ZlSGFuZGxlcgotICAgIDxlbT5leHRlbnNpb248L2VtPiBbPGVtPmV4dGVuc2lvbjwvZW0+XSAuLi48L3N5bnRheD4KLTxkZWZhdWx0Pk5vbmU8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+Ci08Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPGNvbXBhdGliaWxpdHk+UmVtb3ZlSGFuZGxlciBpcwotICAgIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZSAxLjMuNCBhbmQgbGF0ZXIuPC9jb21wYXRpYmlsaXR5PgotCi08dXNhZ2U+Ci0KLSAgICA8cD5UaGUgPHNhbXA+UmVtb3ZlSGFuZGxlcjwvc2FtcD4gZGlyZWN0aXZlIHJlbW92ZXMgYW55IGhhbmRsZXIKLSAgICBhc3NvY2lhdGlvbnMgZm9yIGZpbGVzIHdpdGggdGhlIGdpdmVuIGV4dGVuc2lvbnMuIFRoaXMgYWxsb3dzCi0gICAgPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBmaWxlcyBpbiBzdWJkaXJlY3RvcmllcyB0byB1bmRvIGFueQotICAgIGFzc29jaWF0aW9ucyBpbmhlcml0ZWQgZnJvbSBwYXJlbnQgZGlyZWN0b3JpZXMgb3IgdGhlIHNlcnZlcgotICAgIGNvbmZpZyBmaWxlcy4gQW4gZXhhbXBsZSBvZiBpdHMgdXNlIG1pZ2h0IGJlOjwvcD4KLQotPGV4YW1wbGU+Ci0gICAgPGRsPgotICAgICAgPGR0Pjxjb2RlPi9mb28vLmh0YWNjZXNzOjwvY29kZT48L2R0PgotCi0gICAgICA8ZGQ+PGNvZGU+QWRkSGFuZGxlciBzZXJ2ZXItcGFyc2VkIC5odG1sPC9jb2RlPjwvZGQ+Ci0KLSAgICAgIDxkdD48Y29kZT4vZm9vL2Jhci8uaHRhY2Nlc3M6PC9jb2RlPjwvZHQ+Ci0KLSAgICAgIDxkZD48Y29kZT5SZW1vdmVIYW5kbGVyIC5odG1sPC9jb2RlPjwvZGQ+Ci0gICAgPC9kbD4KLTwvZXhhbXBsZT4KLQotICAgIDxwPlRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgcmV0dXJuaW5nIDxzYW1wPi5odG1sPC9zYW1wPiBmaWxlcyBpbgotICAgIHRoZSA8c2FtcD4vZm9vL2Jhcjwvc2FtcD4gZGlyZWN0b3J5IHRvIGJlaW5nIHRyZWF0ZWQgYXMgbm9ybWFsCi0gICAgZmlsZXMsIHJhdGhlciB0aGFuIGFzIGNhbmRpZGF0ZXMgZm9yIHBhcnNpbmcgKHNlZSB0aGUgPGEKLSAgICBocmVmPSJtb2RfaW5jbHVkZS5odG1sIj48c2FtcD5tb2RfaW5jbHVkZTwvc2FtcD48L2E+Ci0gICAgbW9kdWxlKS48L3A+Ci0KLSAgICA8cD5UaGUgPGVtPmV4dGVuc2lvbjwvZW0+IGFyZ3VtZW50IGlzIGNhc2UtaW5zZW5zaXRpdmUsIGFuZCBjYW4KLSAgICBiZSBzcGVjaWZpZWQgd2l0aCBvciB3aXRob3V0IGEgbGVhZGluZyBkb3QuPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+UmVtb3ZlSW5wdXRGaWx0ZXI8L25hbWU+Ci08c3ludGF4PlJlbW92ZUlucHV0RmlsdGVyCi0gICAgPGVtPmV4dGVuc2lvbjwvZW0+IFs8ZW0+ZXh0ZW5zaW9uPC9lbT5dIC4uLjwvc3ludGF4PgotPGRlZmF1bHQ+Tm9uZTwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD4KLTxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08Y29tcGF0aWJpbGl0eT5SZW1vdmVJbnB1dEZpbHRlciBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUgCi0yLjAuMjYgYW5kIGxhdGVyLjwvY29tcGF0aWJpbGl0eT4KLQotPHVzYWdlPiAgIAotCi0gICAgPHA+VGhlIDxzYW1wPlJlbW92ZUlucHV0RmlsdGVyPC9zYW1wPiBkaXJlY3RpdmUgcmVtb3ZlcyBhbnkKLSAgICBpbnB1dCBmaWx0ZXIgYXNzb2NpYXRpb25zIGZvciBmaWxlcyB3aXRoIHRoZSBnaXZlbiBleHRlbnNpb25zLgotICAgIFRoaXMgYWxsb3dzIDxjb2RlPi5odGFjY2VzczwvY29kZT4gZmlsZXMgaW4gc3ViZGlyZWN0b3JpZXMgdG8KLSAgICB1bmRvIGFueSBhc3NvY2lhdGlvbnMgaW5oZXJpdGVkIGZyb20gcGFyZW50IGRpcmVjdG9yaWVzIG9yIHRoZQotICAgIHNlcnZlciBjb25maWcgZmlsZXMuPC9wPgotCi0gICAgPHA+VGhlIDxlbT5leHRlbnNpb248L2VtPiBhcmd1bWVudCBpcyBjYXNlLWluc2Vuc2l0aXZlLCBhbmQgY2FuCi0gICAgYmUgc3BlY2lmaWVkIHdpdGggb3Igd2l0aG91dCBhIGxlYWRpbmcgZG90LjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5SZW1vdmVMYW5ndWFnZTwvbmFtZT4KLTxzeW50YXg+UmVtb3ZlTGFuZ3VhZ2UKLSAgICA8ZW0+ZXh0ZW5zaW9uPC9lbT4gWzxlbT5leHRlbnNpb248L2VtPl0gLi4uPC9zeW50YXg+Ci08ZGVmYXVsdD5Ob25lPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0PgotPGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0PgotPGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLTxjb21wYXRpYmlsaXR5PlJlbW92ZUxhbmd1YWdlCi0gICAgaXMgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDIuMC4yNCBhbmQgbGF0ZXIuPC9jb21wYXRpYmlsaXR5PgotCi0KLTx1c2FnZT4KLQotICAgIDxwPlRoZSA8c2FtcD5SZW1vdmVMYW5ndWFnZTwvc2FtcD4gZGlyZWN0aXZlIHJlbW92ZXMgYW55Ci0gICAgbGFuZ3VhZ2UgYXNzb2NpYXRpb25zIGZvciBmaWxlcyB3aXRoIHRoZSBnaXZlbiBleHRlbnNpb25zLiBUaGlzCi0gICAgYWxsb3dzIDxjb2RlPi5odGFjY2VzczwvY29kZT4gZmlsZXMgaW4gc3ViZGlyZWN0b3JpZXMgdG8gdW5kbwotICAgIGFueSBhc3NvY2lhdGlvbnMgaW5oZXJpdGVkIGZyb20gcGFyZW50IGRpcmVjdG9yaWVzIG9yIHRoZQotICAgIHNlcnZlciBjb25maWcgZmlsZXMuPC9wPgotCi0gICAgPHA+VGhlIDxlbT5leHRlbnNpb248L2VtPiBhcmd1bWVudCBpcyBjYXNlLWluc2Vuc2l0aXZlLCBhbmQgY2FuCi0gICAgYmUgc3BlY2lmaWVkIHdpdGggb3Igd2l0aG91dCBhIGxlYWRpbmcgZG90LjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5SZW1vdmVPdXRwdXRGaWx0ZXI8L25hbWU+Ci08c3ludGF4PlJlbW92ZU91dHB1dEZpbHRlcgotICAgIDxlbT5leHRlbnNpb248L2VtPiBbPGVtPmV4dGVuc2lvbjwvZW0+XSAuLi48L3N5bnRheD4KLTxkZWZhdWx0PjwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD4KLTxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+PC9vdmVycmlkZT4KLTxjb21wYXRpYmlsaXR5PlJlbW92ZU91dHB1dEZpbHRlciBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUgCi0yLjAuMjYgYW5kIGxhdGVyLjwvY29tcGF0aWJpbGl0eT4KLQotPHVzYWdlPiAgICAKLQotICAgIDxwPlRoZSA8c2FtcD5SZW1vdmVPdXRwdXRGaWx0ZXI8L3NhbXA+IGRpcmVjdGl2ZSByZW1vdmVzIGFueQotICAgIG91dHB1dCBmaWx0ZXIgYXNzb2NpYXRpb25zIGZvciBmaWxlcyB3aXRoIHRoZSBnaXZlbiBleHRlbnNpb25zLgotICAgIFRoaXMgYWxsb3dzIDxjb2RlPi5odGFjY2VzczwvY29kZT4gZmlsZXMgaW4gc3ViZGlyZWN0b3JpZXMgdG8KLSAgICB1bmRvIGFueSBhc3NvY2lhdGlvbnMgaW5oZXJpdGVkIGZyb20gcGFyZW50IGRpcmVjdG9yaWVzIG9yIHRoZQotICAgIHNlcnZlciBjb25maWcgZmlsZXMuPC9wPgotCi0gICAgPHA+VGhlIDxlbT5leHRlbnNpb248L2VtPiBhcmd1bWVudCBpcyBjYXNlLWluc2Vuc2l0aXZlLCBhbmQgY2FuCi0gICAgYmUgc3BlY2lmaWVkIHdpdGggb3Igd2l0aG91dCBhIGxlYWRpbmcgZG90LjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlJlbW92ZVR5cGU8L25hbWU+Ci08c3ludGF4PlJlbW92ZVR5cGUKLSAgICA8ZW0+ZXh0ZW5zaW9uPC9lbT4gWzxlbT5leHRlbnNpb248L2VtPl0gLi4uPC9zeW50YXg+Ci08ZGVmYXVsdD48L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+Ci08Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPjwvb3ZlcnJpZGU+Ci08Y29tcGF0aWJpbGl0eT5SZW1vdmVUeXBlIGlzCi0gICAgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDEuMy4xMyBhbmQgbGF0ZXIuPC9jb21wYXRpYmlsaXR5PgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIDxkaXJlY3RpdmU+UmVtb3ZlVHlwZTwvZGlyZWN0aXZlPiBkaXJlY3RpdmUgcmVtb3ZlcyBhbnkgTUlNRSB0eXBlCi0gICAgYXNzb2NpYXRpb25zIGZvciBmaWxlcyB3aXRoIHRoZSBnaXZlbiBleHRlbnNpb25zLiBUaGlzIGFsbG93cwotICAgIDxjb2RlPi5odGFjY2VzczwvY29kZT4gZmlsZXMgaW4gc3ViZGlyZWN0b3JpZXMgdG8gdW5kbyBhbnkKLSAgICBhc3NvY2lhdGlvbnMgaW5oZXJpdGVkIGZyb20gcGFyZW50IGRpcmVjdG9yaWVzIG9yIHRoZSBzZXJ2ZXIKLSAgICBjb25maWcgZmlsZXMuIEFuIGV4YW1wbGUgb2YgaXRzIHVzZSBtaWdodCBiZTo8L3A+Ci0KLTxleGFtcGxlPgotICAgIDxkbD4KLSAgICAgIDxkdD48Y29kZT4vZm9vLy5odGFjY2Vzczo8L2NvZGU+PC9kdD4KLQotICAgICAgPGRkPjxjb2RlPlJlbW92ZVR5cGUgLmNnaTwvY29kZT48L2RkPgotICAgIDwvZGw+Ci08L2V4YW1wbGU+Ci0KLSAgICA8cD5UaGlzIHdpbGwgcmVtb3ZlIGFueSBzcGVjaWFsIGhhbmRsaW5nIG9mIDxjb2RlPi5jZ2k8L2NvZGU+Ci0gICAgZmlsZXMgaW4gdGhlIDxjb2RlPi9mb28vPC9jb2RlPiBkaXJlY3RvcnkgYW5kIGFueSBiZW5lYXRoIGl0LAotICAgIGNhdXNpbmcgdGhlIGZpbGVzIHRvIGJlIHRyZWF0ZWQgYXMgYmVpbmcgb2YgdGhlIDxhCi0gICAgaHJlZj0iY29yZS5odG1sI2RlZmF1bHR0eXBlIj5kZWZhdWx0IHR5cGU8L2E+LjwvcD4KLQotICAgIDxub3RlPjxiPk5vdGU6PC9iPjxtb2R1bGU+UmVtb3ZlVHlwZTwvbW9kdWxlPiBkaXJlY3RpdmVzIGFyZSBwcm9jZXNzZWQKLSAgICA8aT5hZnRlcjwvaT4gYW55IDxtb2R1bGU+QWRkVHlwZTwvbW9kdWxlPiBkaXJlY3RpdmVzLCBzbyBpdCBpcwotICAgIHBvc3NpYmxlIHRoZXkgbWF5IHVuZG8gdGhlIGVmZmVjdHMgb2YgdGhlIGxhdHRlciBpZiBib3RoIG9jY3VyCi0gICAgd2l0aGluIHRoZSBzYW1lIGRpcmVjdG9yeSBjb25maWd1cmF0aW9uLjwvbm90ZT4KLQotICAgIDxwPlRoZSA8ZW0+ZXh0ZW5zaW9uPC9lbT4gYXJndW1lbnQgaXMgY2FzZS1pbnNlbnNpdGl2ZSwgYW5kIGNhbgotICAgIGJlIHNwZWNpZmllZCB3aXRoIG9yIHdpdGhvdXQgYSBsZWFkaW5nIGRvdC48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotCi0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlR5cGVzQ29uZmlnPC9uYW1lPgotPHN5bnRheD5UeXBlc0NvbmZpZyA8ZW0+ZmlsZS1wYXRoPC9lbT48L3N5bnRheD4KLTxkZWZhdWx0PlR5cGVzQ29uZmlnIGNvbmYvbWltZS50eXBlczwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD4KLTxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci0KLSAgICA8cD5UaGUgVHlwZXNDb25maWcgZGlyZWN0aXZlIHNldHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBNSU1FCi0gICAgdHlwZXMgY29uZmlndXJhdGlvbiBmaWxlLiA8ZW0+RmlsZW5hbWU8L2VtPiBpcyByZWxhdGl2ZSB0byB0aGUKLSAgICA8YSBocmVmPSJjb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvYT4uIFRoaXMgZmlsZSBzZXRzCi0gICAgdGhlIGRlZmF1bHQgbGlzdCBvZiBtYXBwaW5ncyBmcm9tIGZpbGVuYW1lIGV4dGVuc2lvbnMgdG8KLSAgICBjb250ZW50IHR5cGVzOyBjaGFuZ2luZyB0aGlzIGZpbGUgaXMgbm90IHJlY29tbWVuZGVkLiBVc2UgdGhlCi0gICAgPGEgaHJlZj0iI2FkZHR5cGUiPkFkZFR5cGU8L2E+IGRpcmVjdGl2ZSBpbnN0ZWFkLiBUaGUgZmlsZQotICAgIGNvbnRhaW5zIGxpbmVzIGluIHRoZSBmb3JtYXQgb2YgdGhlIGFyZ3VtZW50cyB0byBhbiBBZGRUeXBlCi0gICAgY29tbWFuZDo8L3A+Ci0KLSAgICA8ZXhhbXBsZT4KLSAgICAgIE1JTUUtdHlwZSBleHRlbnNpb24gZXh0ZW5zaW9uIC4uLgotICAgIDwvZXhhbXBsZT4KLQotICAgIDxwPgotICAgIFRoZSBleHRlbnNpb25zIGFyZSBsb3dlci1jYXNlZC4gQmxhbmsgbGluZXMsIGFuZCBsaW5lcwotICAgIGJlZ2lubmluZyB3aXRoIGEgaGFzaCBjaGFyYWN0ZXIgKGAjJykgYXJlIGlnbm9yZWQuIDwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotPC9tb2R1bGVzeW5vcHNpcz4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9taW1lX21hZ2ljLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX21pbWVfbWFnaWMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmYWRlOC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX21pbWVfbWFnaWMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLSA8SEVBRD4KLSAgPFRJVExFPkFwYWNoZSBtb2R1bGUgbW9kX21pbWVfbWFnaWM8L1RJVExFPgotIDwvSEVBRD4KLSA8IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci0gPEJPRFkKLSAgQkdDT0xPUj0iI0ZGRkZGRiIKLSAgVEVYVD0iIzAwMDAwMCIKLSAgTElOSz0iIzAwMDBGRiIKLSAgVkxJTks9IiMwMDAwODAiCi0gIEFMSU5LPSIjRkYwMDAwIgotID4KLSAgPGgxIGFsaWduPSJDRU5URVIiPk1vZHVsZSBtb2RfbWltZV9tYWdpYzwvaDE+Ci0KLSAgVGhpcyBtb2R1bGUgaXMgYW4gb3B0aW9uYWwgZXh0ZW5zaW9uIHRvIHRoZSBBcGFjaGUgSFRUUEQgc2VydmVyLgotICBUaGUgY3VycmVudCB2ZXJzaW9uIGNhbiBiZSBvYnRhaW5lZCBmcm9tCi0gIDxhIGhyZWY9Imh0dHA6Ly93d3cuZW1wbG95ZWVzLm9yZy9+aWtsdWZ0L2FwYWNoZS9tb2RfbWltZV9tYWdpYy8iPgotICBodHRwOi8vd3d3LmVtcGxveWVlcy5vcmcvfmlrbHVmdC9hcGFjaGUvbW9kX21pbWVfbWFnaWMvPC9hPi4KLQotICA8aDI+U3VtbWFyeTwvaDI+Ci0KLSAgVGhpcyBtb2R1bGUgaXMgZGVyaXZlZCBmcm9tIGEgZnJlZSB2ZXJzaW9uIG9mIHRoZSA8Y29kZT5maWxlKDEpPC9jb2RlPgotICBjb21tYW5kIGZvciBVbml4LAotICB3aGljaCB1c2VzICJtYWdpYyBudW1iZXJzIiBhbmQgb3RoZXIgaGludHMgZnJvbSBhIGZpbGUncyBjb250ZW50cyB0bwotICBmaWd1cmUgb3V0IHdoYXQgdGhlIGNvbnRlbnRzIGFyZS4KLSAgSW4gdGhlIGNhc2Ugb2YgdGhpcyBtb2R1bGUsCi0gIGl0IHRyaWVzIHRvIGZpZ3VyZSBvdXQgdGhlIE1JTUUgdHlwZSBvZiB0aGUgZmlsZS4KLSAgPHA+Ci0gIFRoaXMgbW9kdWxlIGlzIG9ubHkgYWN0aXZlIGlmIHRoZSBtYWdpYyBmaWxlIGV4aXN0cyBhbmQKLSAgd2FzIHN1Y2Nlc3NmdWxseSBvcGVuZWQgYXQgc2VydmVyLWNvbmZpZ3VyYXRpb24gdGltZS4KLSAgVGhlIG1hZ2ljIGZpbGUgY2FuIGJlIG5hbWVkIGJ5IHRoZQotICA8QSBIUkVGPSIjbWltZW1hZ2ljZmlsZSI+PGNvZGU+TWltZU1hZ2ljRmlsZTwvY29kZT48L2E+Ci0gIGRpcmVjdGl2ZSBvciBkZWZhdWx0cyB0byBjb25mL21hZ2ljLgotICA8cD4KLSAgVGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGFyZSBwbGFpbiBBU0NJSSB0ZXh0IGluIDQtNSBjb2x1bW5zLgotICBCbGFuayBsaW5lcyBhcmUgYWxsb3dlZCBidXQgaWdub3JlZC4KLSAgQ29tbWVudGVkIGxpbmVzIHVzZSBhIGhhc2ggbWFyayAiIyIuCi0gIFRoZSByZW1haW5pbmcgbGluZXMgYXJlIHBhcnNlZCBmb3IgdGhlIGZvbGxvd2luZyBjb2x1bW5zOgotICA8dGFibGUgYm9yZGVyPTE+Ci0gIDx0ciB2YWxpZ249dG9wPgotICA8dGg+Q29sdW1uPC90aD4KLSAgPHRoPkRlc2NyaXB0aW9uPC90aD4KLSAgPC90cj4KLSAgPHRyIHZhbGlnbj10b3A+Ci0gIDx0ZD4xPC90ZD4KLSAgPHRkPmJ5dGUgbnVtYmVyIHRvIGJlZ2luIGNoZWNraW5nIGZyb20KLSAgPGJyPgotICAiJmd0OyIgaW5kaWNhdGVzIGEgZGVwZW5kZW5jeSB1cG9uIHRoZSBwcmV2aW91cyBub24tIiZndDsiIGxpbmU8L3RkPgotICA8L3RyPjx0ciB2YWxpZ249dG9wPgotICA8dGQ+MjwvdGQ+Ci0gIDx0ZD50eXBlIG9mIGRhdGEgdG8gbWF0Y2gKLSAgICA8dGFibGUgYm9yZGVyPTE+Ci0gICAgPHRyPjx0ZD5ieXRlPC90ZD48dGQ+c2luZ2xlIGNoYXJhY3RlcjwvdGQ+PC90cj4KLSAgICA8dHI+PHRkPnNob3J0PC90ZD48dGQ+bWFjaGluZS1vcmRlciAxNi1iaXQgaW50ZWdlcjwvdGQ+PC90cj4KLSAgICA8dHI+PHRkPmxvbmc8L3RkPjx0ZD5tYWNoaW5lLW9yZGVyIDMyLWJpdCBpbnRlZ2VyPC90ZD48L3RyPgotICAgIDx0cj48dGQ+c3RyaW5nPC90ZD48dGQ+YXJiaXRyYXJ5LWxlbmd0aCBzdHJpbmc8L3RkPjwvdHI+Ci0gICAgPHRyPjx0ZD5kYXRlPC90ZD48dGQ+bG9uZyBpbnRlZ2VyIGRhdGUKLSAgICAgIChzZWNvbmRzIHNpbmNlIFVuaXggZXBvY2gvMTk3MCk8L3RkPjwvdHI+Ci0gICAgPHRyPjx0ZD5iZXNob3J0PC90ZD48dGQ+YmlnLWVuZGlhbiAxNi1iaXQgaW50ZWdlcjwvdGQ+PC90cj4KLSAgICA8dHI+PHRkPmJlbG9uZzwvdGQ+PHRkPmJpZy1lbmRpYW4gMzItYml0IGludGVnZXI8L3RkPjwvdHI+Ci0gICAgPHRyPjx0ZD5iZWRhdGU8L3RkPjx0ZD5iaWctZW5kaWFuIDMyLWJpdCBpbnRlZ2VyIGRhdGU8L3RkPjwvdHI+Ci0gICAgPHRyPjx0ZD5sZXNob3J0PC90ZD48dGQ+bGl0dGxlLWVuZGlhbiAxNi1iaXQgaW50ZWdlcjwvdGQ+PC90cj4KLSAgICA8dHI+PHRkPmxlbG9uZzwvdGQ+PHRkPmxpdHRsZS1lbmRpYW4gMzItYml0IGludGVnZXI8L3RkPjwvdHI+Ci0gICAgPHRyPjx0ZD5sZWRhdGU8L3RkPjx0ZD5saXR0bGUtZW5kaWFuIDMyLWJpdCBpbnRlZ2VyIGRhdGU8L3RkPjwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPC90ZD4KLSAgPC90cj48dHIgdmFsaWduPXRvcD4KLSAgPHRkPjM8L3RkPgotICA8dGQ+Y29udGVudHMgb2YgZGF0YSB0byBtYXRjaDwvdGQ+Ci0gIDwvdHI+PHRyIHZhbGlnbj10b3A+Ci0gIDx0ZD40PC90ZD4KLSAgPHRkPk1JTUUgdHlwZSBpZiBtYXRjaGVkPC90ZD4KLSAgPC90cj48dHIgdmFsaWduPXRvcD4KLSAgPHRkPjU8L3RkPgotICA8dGQ+TUlNRSBlbmNvZGluZyBpZiBtYXRjaGVkIChvcHRpb25hbCk8L3RkPgotICA8L3RyPgotICA8L3RhYmxlPgotCi0gIDxwPgotICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBtYWdpYyBmaWxlIGxpbmVzCi0gIHdvdWxkIHJlY29nbml6ZSBzb21lIGF1ZGlvIGZvcm1hdHMuCi0KLTxwcmU+Ci0jIFN1bi9OZVhUIGF1ZGlvIGRhdGEKLTAgICAgICAgc3RyaW5nICAgICAgICAgIC5zbmQKLSZndDsxMiAgICAgYmVsb25nICAgICAgICAgIDEgICAgICAgICAgICAgICBhdWRpby9iYXNpYwotJmd0OzEyICAgICBiZWxvbmcgICAgICAgICAgMiAgICAgICAgICAgICAgIGF1ZGlvL2Jhc2ljCi0mZ3Q7MTIgICAgIGJlbG9uZyAgICAgICAgICAzICAgICAgICAgICAgICAgYXVkaW8vYmFzaWMKLSZndDsxMiAgICAgYmVsb25nICAgICAgICAgIDQgICAgICAgICAgICAgICBhdWRpby9iYXNpYwotJmd0OzEyICAgICBiZWxvbmcgICAgICAgICAgNSAgICAgICAgICAgICAgIGF1ZGlvL2Jhc2ljCi0mZ3Q7MTIgICAgIGJlbG9uZyAgICAgICAgICA2ICAgICAgICAgICAgICAgYXVkaW8vYmFzaWMKLSZndDsxMiAgICAgYmVsb25nICAgICAgICAgIDcgICAgICAgICAgICAgICBhdWRpby9iYXNpYwotJmd0OzEyICAgICBiZWxvbmcgICAgICAgICAgMjMgICAgICAgICAgICAgIGF1ZGlvL3gtYWRwY20KLTwvcHJlPgotCi0gIE9yIHRoZXNlIHdvdWxkIHJlY29nbml6ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuICIqLmRvYyIgZmlsZXMgY29udGFpbmluZwotICBNaWNyb3NvZnQgV29yZCBvciBGcmFtZU1ha2VyIGRvY3VtZW50cy4gIChUaGVzZSBhcmUgaW5jb21wYXRpYmxlIGZpbGUKLSAgZm9ybWF0cyB3aGljaCB1c2UgdGhlIHNhbWUgZmlsZSBzdWZmaXguKQotCi08cHJlPgotIyBGcmFtZQotMCAgICAgICBzdHJpbmcgICAgICAgICAgXCZsdDtNYWtlckZpbGUgICAgIGFwcGxpY2F0aW9uL3gtZnJhbWUKLTAgICAgICAgc3RyaW5nICAgICAgICAgIFwmbHQ7TUlGRmlsZSAgICAgICBhcHBsaWNhdGlvbi94LWZyYW1lCi0wICAgICAgIHN0cmluZyAgICAgICAgICBcJmx0O01ha2VyRGljdGlvbmFyeSAgICAgICBhcHBsaWNhdGlvbi94LWZyYW1lCi0wICAgICAgIHN0cmluZyAgICAgICAgICBcJmx0O01ha2VyU2NyZWVuRm9uICAgICAgICBhcHBsaWNhdGlvbi94LWZyYW1lCi0wICAgICAgIHN0cmluZyAgICAgICAgICBcJmx0O01NTCAgICAgICAgICAgYXBwbGljYXRpb24veC1mcmFtZQotMCAgICAgICBzdHJpbmcgICAgICAgICAgXCZsdDtCb29rICAgICAgICAgIGFwcGxpY2F0aW9uL3gtZnJhbWUKLTAgICAgICAgc3RyaW5nICAgICAgICAgIFwmbHQ7TWFrZXIgICAgICAgICBhcHBsaWNhdGlvbi94LWZyYW1lCi0KLSMgTVMtV29yZAotMCAgICAgICBzdHJpbmcgICAgICAgICAgXDM3NlwwNjdcMFwwNDMgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbi9tc3dvcmQKLTAgICAgICAgc3RyaW5nICAgICAgICAgIFwzMjBcMzE3XDAyMVwzNDBcMjQxXDI2MSAgICAgICAgYXBwbGljYXRpb24vbXN3b3JkCi0wICAgICAgIHN0cmluZyAgICAgICAgICBcMzMzXDI0NS1cMFwwXDAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uL21zd29yZAotPC9wcmU+Ci0KLSAgQW4gb3B0aW9uYWwgTUlNRSBlbmNvZGluZyBjYW4gYmUgaW5jbHVkZWQgYXMgYSBmaWZ0aCBjb2x1bW4uCi0gIEZvciBleGFtcGxlLCB0aGlzIGNhbiByZWNvZ25pemUgZ3ppcHBlZCBmaWxlcyBhbmQgc2V0IHRoZSBlbmNvZGluZwotICBmb3IgdGhlbS4KLQotPHByZT4KLSMgZ3ppcCAoR05VIHppcCwgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggW0luZm8tWklQL1BLV0FSRV0gemlwIGFyY2hpdmVyKQotMCAgICAgICBzdHJpbmcgICAgICAgICAgXDAzN1wyMTMgICAgICAgIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSAgICAgICAgeC1nemlwCi08L3ByZT4KLQotICA8aDM+UGVyZm9ybWFuY2UgSXNzdWVzPC9oMz4KLQotICBUaGlzIG1vZHVsZSBpcyBub3QgZm9yIGV2ZXJ5IHN5c3RlbS4gIElmIHlvdXIgc3lzdGVtIGlzIGJhcmVseSBrZWVwaW5nCi0gIHVwIHdpdGggaXRzIGxvYWQgb3IgaWYgeW91J3JlIHBlcmZvcm1pbmcgYSB3ZWIgc2VydmVyIGJlbmNobWFyaywKLSAgeW91IG1heSBub3Qgd2FudCB0byBlbmFibGUgdGhpcyBiZWNhdXNlIHRoZSBwcm9jZXNzaW5nIGlzIG5vdCBmcmVlLgotICA8cD4KLSAgSG93ZXZlciwgYW4gZWZmb3J0IHdhcyBtYWRlIHRvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBvcmlnaW5hbAotICBmaWxlKDEpIGNvZGUgdG8gbWFrZSBpdCBmaXQgaW4gYSBidXN5IHdlYiBzZXJ2ZXIuCi0gIEl0IHdhcyBkZXNpZ25lZCBmb3IgYSBzZXJ2ZXIgd2hlcmUgdGhlcmUgYXJlIHRob3VzYW5kcyBvZiB1c2VycyB3aG8KLSAgcHVibGlzaCB0aGVpciBvd24gZG9jdW1lbnRzLgotICBUaGlzIGlzIHByb2JhYmx5IHZlcnkgY29tbW9uIG9uIGludHJhbmV0cy4KLSAgTWFueSB0aW1lcywgaXQncyBoZWxwZnVsCi0gIGlmIHRoZSBzZXJ2ZXIgY2FuIG1ha2UgbW9yZSBpbnRlbGxpZ2VudCBkZWNpc2lvbnMgYWJvdXQgYSBmaWxlJ3MKLSAgY29udGVudHMgdGhhbiB0aGUgZmlsZSBuYW1lIGFsbG93cwotICAuLi5ldmVuIGlmIGp1c3QgdG8gcmVkdWNlIHRoZSAid2h5IGRvZXNuJ3QgbXkgcGFnZSB3b3JrIiBjYWxscwotICB3aGVuIHVzZXJzIGltcHJvcGVybHkgbmFtZSB0aGVpciBvd24gZmlsZXMuCi0gIFlvdSBoYXZlIHRvIGRlY2lkZSBpZiB0aGUgZXh0cmEgd29yayBzdWl0cyB5b3VyIGVudmlyb25tZW50LgotICA8cD4KLSAgV2hlbiBjb21waWxpbmcgYW4gQXBhY2hlIHNlcnZlciwgdGhpcyBtb2R1bGUgc2hvdWxkIGJlIGF0IG9yIG5lYXIgdGhlCi0gIHRvcCBvZiB0aGUgbGlzdCBvZiBtb2R1bGVzIGluIHRoZSBDb25maWd1cmF0aW9uIGZpbGUuICBUaGUgbW9kdWxlcyBhcmUKLSAgbGlzdGVkIGluIGluY3JlYXNpbmcgcHJpb3JpdHkgc28gdGhhdCB3aWxsIG1lYW4gdGhpcyBvbmUgaXMgdXNlZCBvbmx5Ci0gIGFzIGEgbGFzdCByZXNvcnQsIGp1c3QgbGlrZSBpdCB3YXMgZGVzaWduZWQgdG8uCi0KLSAgPGgyPkRpcmVjdGl2ZXM8L2gyPgotICA8cD4KLSAgPFVMPgotICAgPExJPjxBIEhSRUY9IiNtaW1lbWFnaWNmaWxlIj5NaW1lTWFnaWNGaWxlPC9BPgotICAgPC9MST4KLSAgPC9VTD4KLSAgPC9QPgotICA8SFI+Ci0gIDxIMj48QSBOQU1FPSJtaW1lbWFnaWNmaWxlIj4KLSAgIE1pbWVNYWdpY0ZpbGUKLSAgPC9BPjwvSDI+Ci0gIDxQPgotICA8U1RST05HPlN5bnRheDo8L1NUUk9ORz4gTWltZU1hZ2ljRmlsZSA8ZW0+bWFnaWMtZmlsZS1uYW1lPC9lbT4KLSAgPEJSPgotICA8U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+IGNvbmYvbWFnaWMKLSAgPEJSPgotICA8U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdAotICA8QlI+Ci0gIDxTVFJPTkc+U3RhdHVzOjwvU1RST05HPiBFeHRlbnNpb24KLSAgPEJSPgotICA8U1RST05HPk1vZHVsZTo8L1NUUk9ORz4gbW9kX21pbWVfbWFnaWMKLSAgPHA+Ci0KLSAgVGhlIE1pbWVNYWdpY0ZpbGUgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgbG9jYXRpb24gb2YgdGhlCi0gIG1hZ2ljIGZpbGUgZnJvbSBpdHMgZGVmYXVsdCBsb2NhdGlvbiBhdCA8Y29kZT5jb25mL21hZ2ljPC9jb2RlPi4KLSAgTm9uLXJvb3RlZCBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIFNlcnZlclJvb3QuCi0gIDxwPgotICA8SFI+Ci0KLSAgPGgyPjxhIG5hbWU9Im5vdGVzIj5Ob3RlczwvYT48L2gyPgotCi0gIFBhdGNoZXMgYW5kIHN1Z2dlc3Rpb25zIGZvciBtb2RfbWltZV9tYWdpYyBzaG91bGQgYmUgc2VudCB0bwotICBJYW4gS2x1ZnQgJmx0O2lrbHVmdDwhLS0tIGNvbW1lbnQgaW5zZXJ0ZWQgdG8gZGlzY291cmFnZSBzcGFtIC0tLT5AY2lzY28uY29tJmd0Oy4KLSAgTm90ZSB0aGF0IGVuaGFuY2VtZW50cyBhcmUgZG9uZSBvbiBhIHZvbHVudGVlciBiYXNpcyBzbyBubyB0aW1ldGFibGUgY2FuCi0gIGJlIGNvbW1pdHRlZCBmb3IgYW55IHBhcnRpY3VsYXIgcmVxdWVzdC4KLSAgT2J2aW91c2x5LCBwYXRjaGVzIGFyZSBnaXZlbiBtdWNoIGhpZ2hlciBwcmlvcml0eSBvdmVyIHBsYWluIHJlcXVlc3RzLgotICA8cD4KLSAgVGhlIGZvbGxvd2luZyBub3RlcyBhcHBseSB0byB0aGUgbW9kX21pbWVfbWFnaWMgbW9kdWxlIGFuZCBhcmUKLSAgaW5jbHVkZWQgaGVyZSBmb3IgY29tcGxpYW5jZSB3aXRoIGNvbnRyaWJ1dG9ycycgY29weXJpZ2h0IHJlc3RyaWN0aW9ucwotICB0aGF0IHJlcXVpcmUgdGhlaXIgYWNrbm93bGVkZ2VtZW50LgotCi08cHJlPgotLyoKLSAqIG1vZF9taW1lX21hZ2ljOiBNSU1FIHR5cGUgbG9va3VwIHZpYSBmaWxlIG1hZ2ljIG51bWJlcnMKLSAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk3IENpc2NvIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIHdhcyBzdWJtaXR0ZWQgYnkgQ2lzY28gU3lzdGVtcyB0byB0aGUgQXBhY2hlIEdyb3VwIGluIEp1bHkKLSAqIDE5OTcuICBGdXR1cmUgcmV2aXNpb25zIGFuZCBkZXJpdmF0aXZlcyBvZiB0aGlzIHNvdXJjZSBjb2RlIG11c3QKLSAqIGFja25vd2xlZGdlIENpc2NvIFN5c3RlbXMgYXMgdGhlIG9yaWdpbmFsIGNvbnRyaWJ1dG9yIG9mIHRoaXMgbW9kdWxlLgotICogQWxsIG90aGVyIGxpY2Vuc2luZyBhbmQgdXNhZ2UgY29uZGl0aW9ucyBhcmUgdGhvc2Ugb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBTb21lIG9mIHRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIGZyZWUgdmVyc2lvbiBvZiB0aGUgZmlsZSBjb21tYW5kCi0gKiBvcmlnaW5hbGx5IHBvc3RlZCB0byBjb21wLnNvdXJjZXMudW5peC4gIENvcHlyaWdodCBpbmZvIGZvciB0aGF0IHByb2dyYW0KLSAqIGlzIGluY2x1ZGVkIGJlbG93IGFzIHJlcXVpcmVkLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAtIENvcHlyaWdodCAoYykgSWFuIEYuIERhcndpbiwgMTk4Ny4gV3JpdHRlbiBieSBJYW4gRi4gRGFyd2luLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbm90IHN1YmplY3QgdG8gYW55IGxpY2Vuc2Ugb2YgdGhlIEFtZXJpY2FuIFRlbGVwaG9uZSBhbmQKLSAqIFRlbGVncmFwaCBDb21wYW55IG9yIG9mIHRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKgotICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2Ugb24gYW55Ci0gKiBjb21wdXRlciBzeXN0ZW0sIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0IGZyZWVseSwgc3ViamVjdCB0bwotICogdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0gKgotICogMS4gVGhlIGF1dGhvciBpcyBub3QgcmVzcG9uc2libGUgZm9yIHRoZSBjb25zZXF1ZW5jZXMgb2YgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLCBubyBtYXR0ZXIgaG93IGF3ZnVsLCBldmVuIGlmIHRoZXkgYXJpc2UgZnJvbSBmbGF3cyBpbiBpdC4KLSAqCi0gKiAyLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQsIGVpdGhlciBieQotICogZXhwbGljaXQgY2xhaW0gb3IgYnkgb21pc3Npb24uICBTaW5jZSBmZXcgdXNlcnMgZXZlciByZWFkIHNvdXJjZXMsIGNyZWRpdHMKLSAqIG11c3QgYXBwZWFyIGluIHRoZSBkb2N1bWVudGF0aW9uLgotICoKLSAqIDMuIEFsdGVyZWQgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAqIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gIFNpbmNlIGZldyB1c2VycyBldmVyIHJlYWQKLSAqIHNvdXJjZXMsIGNyZWRpdHMgbXVzdCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24uCi0gKgotICogNC4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogRm9yIGNvbXBsaWNhbmNlIHdpdGggTXIgRGFyd2luJ3MgdGVybXM6IHRoaXMgaGFzIGJlZW4gdmVyeSBzaWduaWZpY2FudGx5Ci0gKiBtb2RpZmllZCBmcm9tIHRoZSBmcmVlICJmaWxlIiBjb21tYW5kLgotICogLSBhbGwtaW4tb25lIGZpbGUgZm9yIGNvbXBpbGF0aW9uIGNvbnZlbmllbmNlIHdoZW4gbW92aW5nIGZyb20gb25lCi0gKiAgIHZlcnNpb24gb2YgQXBhY2hlIHRvIHRoZSBuZXh0LgotICogLSBNZW1vcnkgYWxsb2NhdGlvbiBpcyBkb25lIHRocm91Z2ggdGhlIEFwYWNoZSBBUEkncyBwb29sIHN0cnVjdHVyZS4KLSAqIC0gQWxsIGZ1bmN0aW9ucyBoYXZlIGhhZCBuZWNlc3NhcnkgQXBhY2hlIEFQSSByZXF1ZXN0IG9yIHNlcnZlcgotICogICBzdHJ1Y3R1cmVzIHBhc3NlZCB0byB0aGVtIHdoZXJlIG5lY2Vzc2FyeSB0byBjYWxsIG90aGVyIEFwYWNoZSBBUEkKLSAqICAgcm91dGluZXMuICAoaS5lLiB1c3VhbGx5IGZvciBsb2dnaW5nLCBmaWxlcywgb3IgbWVtb3J5IGFsbG9jYXRpb24gaW4KLSAqICAgaXRzZWxmIG9yIGEgY2FsbGVkIGZ1bmN0aW9uLikKLSAqIC0gc3RydWN0IG1hZ2ljIGhhcyBiZWVuIGNvbnZlcnRlZCBmcm9tIGFuIGFycmF5IHRvIGEgc2luZ2xlLWVuZGVkIGxpbmtlZAotICogICBsaXN0IGJlY2F1c2UgaXQgb25seSBncm93cyBvbmUgcmVjb3JkIGF0IGEgdGltZSwgaXQncyBvbmx5IGFjY2Vzc2VkCi0gKiAgIHNlcXVlbnRpYWxseSwgYW5kIHRoZSBBcGFjaGUgQVBJIGhhcyBubyBlcXVpdmFsZW50IG9mIHJlYWxsb2MoKS4KLSAqIC0gRnVuY3Rpb25zIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIGdldCB0aGVpciBwYXJhbWV0ZXJzIGZyb20gdGhlIHNlcnZlcgotICogICBjb25maWd1cmF0aW9uIGluc3RlYWQgb2YgZ2xvYmFscy4gIChJdCBzaG91bGQgYmUgcmVlbnRyYW50IG5vdyBidXQgaGFzCi0gKiAgIG5vdCBiZWVuIHRlc3RlZCBpbiBhIHRocmVhZGVkIGVudmlyb25tZW50LikKLSAqIC0gUGxhY2VzIHdoZXJlIGl0IHVzZWQgdG8gcHJpbnQgcmVzdWx0cyB0byBzdGRvdXQgbm93IHNhdmVzIHRoZW0gaW4gYQotICogICBsaXN0IHdoZXJlIHRoZXkncmUgdXNlZCB0byBzZXQgdGhlIE1JTUUgdHlwZSBpbiB0aGUgQXBhY2hlIHJlcXVlc3QKLSAqICAgcmVjb3JkLgotICogLSBDb21tYW5kLWxpbmUgZmxhZ3MgaGF2ZSBiZWVuIHJlbW92ZWQgc2luY2UgdGhleSB3aWxsIG5ldmVyIGJlIHVzZWQgaGVyZS4KLSAqCi0gKi8KLTwvcHJlPgotCi0gPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9taW1lX21hZ2ljLnhtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfbWltZV9tYWdpYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZjIyMTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9taW1lX21hZ2ljLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBtb2R1bGVzeW5vcHNpcyBTWVNURU0gIi4uL3N0eWxlL21vZHVsZXN5bm9wc2lzLmR0ZCI+Ci08P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveHNsIiBocmVmPSIuLi9zdHlsZS9tYW51YWwueHNsIj8+Ci08bW9kdWxlc3lub3BzaXM+Ci0KLTxuYW1lPm1vZF9taW1lX21hZ2ljPC9uYW1lPgotPGRlc2NyaXB0aW9uPkRldGVybWluZXMgdGhlIE1JTUUgdHlwZSBvZiBhIGZpbGUKLSAgICBieSBsb29raW5nIGF0IGEgZmV3IGJ5dGVzIG9mIGl0cyBjb250ZW50czwvZGVzY3JpcHRpb24+Ci08c3RhdHVzPkV4dGVuc2lvbjwvc3RhdHVzPgotPHNvdXJjZWZpbGU+bW9kX21pbWVfbWFnaWMuYzwvc291cmNlZmlsZT4KLTxpZGVudGlmaWVyPm1pbWVfbWFnaWNfbW9kdWxlPC9pZGVudGlmaWVyPgotCi08c3VtbWFyeT4KLSAgICA8cD5UaGlzIG1vZHVsZSBkZXRlcm1pbmVzIHRoZSBNSU1FIHR5cGUgb2YgZmlsZXMgaW4gdGhlIHNhbWUKLSAgICB3YXkgdGhlIFVuaXggZmlsZSgxKSBjb21tYW5kIHdvcmtzOiBpdCBsb29rcyBhdCB0aGUgZmlyc3QgZmV3Ci0gICAgYnl0ZXMgb2YgdGhlIGZpbGUuIEl0IGlzIGludGVuZGVkIGFzIGEgInNlY29uZCBsaW5lIG9mIGRlZmVuc2UiCi0gICAgZm9yIGNhc2VzIHRoYXQgPG1vZHVsZT5tb2RfbWltZTwvbW9kdWxlPiBjYW4ndAotICAgIHJlc29sdmUuIFRvIGFzc3VyZSB0aGF0IG1vZF9taW1lIGdldHMgZmlyc3QgdHJ5IGF0IGRldGVybWluaW5nCi0gICAgYSBmaWxlJ3MgTUlNRSB0eXBlLCBiZSBzdXJlIHRvIGxpc3QgbW9kX21pbWVfbWFnaWMKLSAgICA8c3Ryb25nPmJlZm9yZTwvc3Ryb25nPiBtb2RfbWltZSBpbiB0aGUgY29uZmlndXJhdGlvbi48L3A+Ci0KLSAgICA8cD5UaGlzIG1vZHVsZSBpcyBkZXJpdmVkIGZyb20gYSBmcmVlIHZlcnNpb24gb2YgdGhlCi0gICAgPGNvZGU+ZmlsZSgxKTwvY29kZT4gY29tbWFuZCBmb3IgVW5peCwgd2hpY2ggdXNlcyAibWFnaWMKLSAgICBudW1iZXJzIiBhbmQgb3RoZXIgaGludHMgZnJvbSBhIGZpbGUncyBjb250ZW50cyB0byBmaWd1cmUgb3V0Ci0gICAgd2hhdCB0aGUgY29udGVudHMgYXJlLiBUaGlzIG1vZHVsZSBpcyBhY3RpdmUgb25seSBpZiB0aGUgbWFnaWMKLSAgICBmaWxlIGlzIHNwZWNpZmllZCBieSB0aGUgPGRpcmVjdGl2ZSBtb2R1bGU9Im1vZF9taW1lX21hZ2ljIgotICAgID5NaW1lTWFnaWNGaWxlPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZS48L3A+Ci08L3N1bW1hcnk+Ci0KLTxzZWN0aW9uPjx0aXRsZT5Gb3JtYXQgb2YgdGhlIE1hZ2ljIEZpbGU8L3RpdGxlPgotCi0gICAgPHA+VGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGFyZSBwbGFpbiBBU0NJSSB0ZXh0IGluIDQtNQotICAgIGNvbHVtbnMuIEJsYW5rIGxpbmVzIGFyZSBhbGxvd2VkIGJ1dCBpZ25vcmVkLiBDb21tZW50ZWQgbGluZXMKLSAgICB1c2UgYSBoYXNoIG1hcmsgIiMiLiBUaGUgcmVtYWluaW5nIGxpbmVzIGFyZSBwYXJzZWQgZm9yIHRoZQotICAgIGZvbGxvd2luZyBjb2x1bW5zOjwvcD4KLQotICAgIDx0YWJsZSBib3JkZXI9IjEiPgotICAgICAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICAgICAgPHRoPkNvbHVtbjwvdGg+Ci0KLSAgICAgICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KLSAgICAgIDwvdHI+Ci0KLSAgICAgIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgICAgIDx0ZD4xPC90ZD4KLQotICAgICAgICA8dGQ+Ynl0ZSBudW1iZXIgdG8gYmVnaW4gY2hlY2tpbmcgZnJvbTxiciAvPgotICAgICAgICAgIiZndDsiIGluZGljYXRlcyBhIGRlcGVuZGVuY3kgdXBvbiB0aGUgcHJldmlvdXMgbm9uLSImZ3Q7IgotICAgICAgICBsaW5lPC90ZD4KLSAgICAgIDwvdHI+Ci0KLSAgICAgIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgICAgIDx0ZD4yPC90ZD4KLQotICAgICAgICA8dGQ+Ci0gICAgICAgICAgdHlwZSBvZiBkYXRhIHRvIG1hdGNoIAotCi0gICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMSI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZD5ieXRlPC90ZD4KLQotICAgICAgICAgICAgICA8dGQ+c2luZ2xlIGNoYXJhY3RlcjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotCi0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZD5zaG9ydDwvdGQ+Ci0KLSAgICAgICAgICAgICAgPHRkPm1hY2hpbmUtb3JkZXIgMTYtYml0IGludGVnZXI8L3RkPgotICAgICAgICAgICAgPC90cj4KLQotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+bG9uZzwvdGQ+Ci0KLSAgICAgICAgICAgICAgPHRkPm1hY2hpbmUtb3JkZXIgMzItYml0IGludGVnZXI8L3RkPgotICAgICAgICAgICAgPC90cj4KLQotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+c3RyaW5nPC90ZD4KLQotICAgICAgICAgICAgICA8dGQ+YXJiaXRyYXJ5LWxlbmd0aCBzdHJpbmc8L3RkPgotICAgICAgICAgICAgPC90cj4KLQotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+ZGF0ZTwvdGQ+Ci0KLSAgICAgICAgICAgICAgPHRkPmxvbmcgaW50ZWdlciBkYXRlIChzZWNvbmRzIHNpbmNlIFVuaXgKLSAgICAgICAgICAgICAgZXBvY2gvMTk3MCk8L3RkPgotICAgICAgICAgICAgPC90cj4KLQotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+YmVzaG9ydDwvdGQ+Ci0KLSAgICAgICAgICAgICAgPHRkPmJpZy1lbmRpYW4gMTYtYml0IGludGVnZXI8L3RkPgotICAgICAgICAgICAgPC90cj4KLQotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+YmVsb25nPC90ZD4KLQotICAgICAgICAgICAgICA8dGQ+YmlnLWVuZGlhbiAzMi1iaXQgaW50ZWdlcjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotCi0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZD5iZWRhdGU8L3RkPgotCi0gICAgICAgICAgICAgIDx0ZD5iaWctZW5kaWFuIDMyLWJpdCBpbnRlZ2VyIGRhdGU8L3RkPgotICAgICAgICAgICAgPC90cj4KLQotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+bGVzaG9ydDwvdGQ+Ci0KLSAgICAgICAgICAgICAgPHRkPmxpdHRsZS1lbmRpYW4gMTYtYml0IGludGVnZXI8L3RkPgotICAgICAgICAgICAgPC90cj4KLQotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+bGVsb25nPC90ZD4KLQotICAgICAgICAgICAgICA8dGQ+bGl0dGxlLWVuZGlhbiAzMi1iaXQgaW50ZWdlcjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotCi0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZD5sZWRhdGU8L3RkPgotCi0gICAgICAgICAgICAgIDx0ZD5saXR0bGUtZW5kaWFuIDMyLWJpdCBpbnRlZ2VyIGRhdGU8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLQotICAgICAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICAgICAgPHRkPjM8L3RkPgotCi0gICAgICAgIDx0ZD5jb250ZW50cyBvZiBkYXRhIHRvIG1hdGNoPC90ZD4KLSAgICAgIDwvdHI+Ci0KLSAgICAgIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgICAgIDx0ZD40PC90ZD4KLQotICAgICAgICA8dGQ+TUlNRSB0eXBlIGlmIG1hdGNoZWQ8L3RkPgotICAgICAgPC90cj4KLQotICAgICAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICAgICAgPHRkPjU8L3RkPgotCi0gICAgICAgIDx0ZD5NSU1FIGVuY29kaW5nIGlmIG1hdGNoZWQgKG9wdGlvbmFsKTwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0KLSAgICA8cD5Gb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBtYWdpYyBmaWxlIGxpbmVzIHdvdWxkIHJlY29nbml6ZQotICAgIHNvbWUgYXVkaW8gZm9ybWF0cy48L3A+Ci08ZXhhbXBsZT4KLTxwcmU+Ci0jIFN1bi9OZVhUIGF1ZGlvIGRhdGEKLTAgICAgICAgc3RyaW5nICAgICAgICAgIC5zbmQKLSZndDsxMiAgICAgYmVsb25nICAgICAgICAgIDEgICAgICAgICAgICAgICBhdWRpby9iYXNpYwotJmd0OzEyICAgICBiZWxvbmcgICAgICAgICAgMiAgICAgICAgICAgICAgIGF1ZGlvL2Jhc2ljCi0mZ3Q7MTIgICAgIGJlbG9uZyAgICAgICAgICAzICAgICAgICAgICAgICAgYXVkaW8vYmFzaWMKLSZndDsxMiAgICAgYmVsb25nICAgICAgICAgIDQgICAgICAgICAgICAgICBhdWRpby9iYXNpYwotJmd0OzEyICAgICBiZWxvbmcgICAgICAgICAgNSAgICAgICAgICAgICAgIGF1ZGlvL2Jhc2ljCi0mZ3Q7MTIgICAgIGJlbG9uZyAgICAgICAgICA2ICAgICAgICAgICAgICAgYXVkaW8vYmFzaWMKLSZndDsxMiAgICAgYmVsb25nICAgICAgICAgIDcgICAgICAgICAgICAgICBhdWRpby9iYXNpYwotJmd0OzEyICAgICBiZWxvbmcgICAgICAgICAgMjMgICAgICAgICAgICAgIGF1ZGlvL3gtYWRwY20KLTwvcHJlPgotPC9leGFtcGxlPgotICAgIDxwPk9yIHRoZXNlIHdvdWxkIHJlY29nbml6ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuICIqLmRvYyIgZmlsZXMKLSAgICBjb250YWluaW5nIE1pY3Jvc29mdCBXb3JkIG9yIEZyYW1lTWFrZXIgZG9jdW1lbnRzLiAoVGhlc2UgYXJlCi0gICAgaW5jb21wYXRpYmxlIGZpbGUgZm9ybWF0cyB3aGljaCB1c2UgdGhlIHNhbWUgZmlsZSBzdWZmaXguKTwvcD4KLTxleGFtcGxlPgotPHByZT4KLSMgRnJhbWUKLTAgICAgICAgc3RyaW5nICAgICAgICAgIFwmbHQ7TWFrZXJGaWxlICAgICBhcHBsaWNhdGlvbi94LWZyYW1lCi0wICAgICAgIHN0cmluZyAgICAgICAgICBcJmx0O01JRkZpbGUgICAgICAgYXBwbGljYXRpb24veC1mcmFtZQotMCAgICAgICBzdHJpbmcgICAgICAgICAgXCZsdDtNYWtlckRpY3Rpb25hcnkgICAgICAgYXBwbGljYXRpb24veC1mcmFtZQotMCAgICAgICBzdHJpbmcgICAgICAgICAgXCZsdDtNYWtlclNjcmVlbkZvbiAgICAgICAgYXBwbGljYXRpb24veC1mcmFtZQotMCAgICAgICBzdHJpbmcgICAgICAgICAgXCZsdDtNTUwgICAgICAgICAgIGFwcGxpY2F0aW9uL3gtZnJhbWUKLTAgICAgICAgc3RyaW5nICAgICAgICAgIFwmbHQ7Qm9vayAgICAgICAgICBhcHBsaWNhdGlvbi94LWZyYW1lCi0wICAgICAgIHN0cmluZyAgICAgICAgICBcJmx0O01ha2VyICAgICAgICAgYXBwbGljYXRpb24veC1mcmFtZQotCi0jIE1TLVdvcmQKLTAgICAgICAgc3RyaW5nICAgICAgICAgIFwzNzZcMDY3XDBcMDQzICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24vbXN3b3JkCi0wICAgICAgIHN0cmluZyAgICAgICAgICBcMzIwXDMxN1wwMjFcMzQwXDI0MVwyNjEgICAgICAgIGFwcGxpY2F0aW9uL21zd29yZAotMCAgICAgICBzdHJpbmcgICAgICAgICAgXDMzM1wyNDUtXDBcMFwwICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbi9tc3dvcmQKLTwvcHJlPgotPC9leGFtcGxlPgotICAgIDxwPkFuIG9wdGlvbmFsIE1JTUUgZW5jb2RpbmcgY2FuIGJlIGluY2x1ZGVkIGFzIGEgZmlmdGggY29sdW1uLgotICAgIEZvciBleGFtcGxlLCB0aGlzIGNhbiByZWNvZ25pemUgZ3ppcHBlZCBmaWxlcyBhbmQgc2V0IHRoZQotICAgIGVuY29kaW5nIGZvciB0aGVtLjwvcD4KLTxleGFtcGxlPgotPHByZT4KLSMgZ3ppcCAoR05VIHppcCwgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggW0luZm8tWklQL1BLV0FSRV0gemlwIGFyY2hpdmVyKQotMCAgICAgICBzdHJpbmcgICAgICAgICAgXDAzN1wyMTMgICAgICAgIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSAgICAgICAgeC1nemlwCi08L3ByZT4KLTwvZXhhbXBsZT4KLTwvc2VjdGlvbj4KLQotPHNlY3Rpb24+PHRpdGxlPlBlcmZvcm1hbmNlIElzc3VlczwvdGl0bGU+Ci0gICAgPHA+VGhpcyBtb2R1bGUgaXMgbm90IGZvciBldmVyeSBzeXN0ZW0uIElmIHlvdXIgc3lzdGVtIGlzIGJhcmVseQotICAgIGtlZXBpbmcgdXAgd2l0aCBpdHMgbG9hZCBvciBpZiB5b3UncmUgcGVyZm9ybWluZyBhIHdlYiBzZXJ2ZXIKLSAgICBiZW5jaG1hcmssIHlvdSBtYXkgbm90IHdhbnQgdG8gZW5hYmxlIHRoaXMgYmVjYXVzZSB0aGUKLSAgICBwcm9jZXNzaW5nIGlzIG5vdCBmcmVlLjwvcD4KLQotICAgIDxwPkhvd2V2ZXIsIGFuIGVmZm9ydCB3YXMgbWFkZSB0byBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZgotICAgIHRoZSBvcmlnaW5hbCBmaWxlKDEpIGNvZGUgdG8gbWFrZSBpdCBmaXQgaW4gYSBidXN5IHdlYiBzZXJ2ZXIuCi0gICAgSXQgd2FzIGRlc2lnbmVkIGZvciBhIHNlcnZlciB3aGVyZSB0aGVyZSBhcmUgdGhvdXNhbmRzIG9mIHVzZXJzCi0gICAgd2hvIHB1Ymxpc2ggdGhlaXIgb3duIGRvY3VtZW50cy4gVGhpcyBpcyBwcm9iYWJseSB2ZXJ5IGNvbW1vbgotICAgIG9uIGludHJhbmV0cy4gTWFueSB0aW1lcywgaXQncyBoZWxwZnVsIGlmIHRoZSBzZXJ2ZXIgY2FuIG1ha2UKLSAgICBtb3JlIGludGVsbGlnZW50IGRlY2lzaW9ucyBhYm91dCBhIGZpbGUncyBjb250ZW50cyB0aGFuIHRoZQotICAgIGZpbGUgbmFtZSBhbGxvd3MgLi4uZXZlbiBpZiBqdXN0IHRvIHJlZHVjZSB0aGUgIndoeSBkb2Vzbid0IG15Ci0gICAgcGFnZSB3b3JrIiBjYWxscyB3aGVuIHVzZXJzIGltcHJvcGVybHkgbmFtZSB0aGVpciBvd24gZmlsZXMuCi0gICAgWW91IGhhdmUgdG8gZGVjaWRlIGlmIHRoZSBleHRyYSB3b3JrIHN1aXRzIHlvdXIKLSAgICBlbnZpcm9ubWVudC48L3A+Ci0KLSAgICA8cD5XaGVuIGNvbXBpbGluZyBhbiBBcGFjaGUgc2VydmVyLCB0aGlzIG1vZHVsZSBzaG91bGQgYmUgYXQgb3IKLSAgICBuZWFyIHRoZSB0b3Agb2YgdGhlIGxpc3Qgb2YgbW9kdWxlcyBpbiB0aGUgQ29uZmlndXJhdGlvbiBmaWxlLgotICAgIFRoZSBtb2R1bGVzIGFyZSBsaXN0ZWQgaW4gaW5jcmVhc2luZyBwcmlvcml0eSBzbyB0aGF0IHdpbGwgbWVhbgotICAgIHRoaXMgb25lIGlzIHVzZWQgb25seSBhcyBhIGxhc3QgcmVzb3J0LCBqdXN0IGxpa2UgaXQgd2FzCi0gICAgZGVzaWduZWQgdG8uPC9wPgotCi08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uIGlkPSJub3RlcyI+PHRpdGxlPk5vdGVzPC90aXRsZT4KLQotICAgIDxwPlRoZSBmb2xsb3dpbmcgbm90ZXMgYXBwbHkgdG8gdGhlIG1vZF9taW1lX21hZ2ljIG1vZHVsZSBhbmQgYXJlCi0gICAgaW5jbHVkZWQgaGVyZSBmb3IgY29tcGxpYW5jZSB3aXRoIGNvbnRyaWJ1dG9ycycgY29weXJpZ2h0Ci0gICAgcmVzdHJpY3Rpb25zIHRoYXQgcmVxdWlyZSB0aGVpciBhY2tub3dsZWRnbWVudC4gPC9wPgotPHByZT4KLS8qCi0gKiBtb2RfbWltZV9tYWdpYzogTUlNRSB0eXBlIGxvb2t1cCB2aWEgZmlsZSBtYWdpYyBudW1iZXJzCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5NyBDaXNjbyBTeXN0ZW1zLCBJbmMuCi0gKgotICogVGhpcyBzb2Z0d2FyZSB3YXMgc3VibWl0dGVkIGJ5IENpc2NvIFN5c3RlbXMgdG8gdGhlIEFwYWNoZSBHcm91cCBpbiBKdWx5Ci0gKiAxOTk3LiAgRnV0dXJlIHJldmlzaW9ucyBhbmQgZGVyaXZhdGl2ZXMgb2YgdGhpcyBzb3VyY2UgY29kZSBtdXN0Ci0gKiBhY2tub3dsZWRnZSBDaXNjbyBTeXN0ZW1zIGFzIHRoZSBvcmlnaW5hbCBjb250cmlidXRvciBvZiB0aGlzIG1vZHVsZS4KLSAqIEFsbCBvdGhlciBsaWNlbnNpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMgYXJlIHRob3NlIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogU29tZSBvZiB0aGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBmcmVlIHZlcnNpb24gb2YgdGhlIGZpbGUgY29tbWFuZAotICogb3JpZ2luYWxseSBwb3N0ZWQgdG8gY29tcC5zb3VyY2VzLnVuaXguICBDb3B5cmlnaHQgaW5mbyBmb3IgdGhhdCBwcm9ncmFtCi0gKiBpcyBpbmNsdWRlZCBiZWxvdyBhcyByZXF1aXJlZC4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogLSBDb3B5cmlnaHQgKGMpIElhbiBGLiBEYXJ3aW4sIDE5ODcuIFdyaXR0ZW4gYnkgSWFuIEYuIERhcndpbi4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIG5vdCBzdWJqZWN0IHRvIGFueSBsaWNlbnNlIG9mIHRoZSBBbWVyaWNhbiBUZWxlcGhvbmUgYW5kCi0gKiBUZWxlZ3JhcGggQ29tcGFueSBvciBvZiB0aGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICoKLSAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlIG9uIGFueQotICogY29tcHV0ZXIgc3lzdGVtLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdCBmcmVlbHksIHN1YmplY3QgdG8KLSAqIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotICoKLSAqIDEuIFRoZSBhdXRob3IgaXMgbm90IHJlc3BvbnNpYmxlIGZvciB0aGUgY29uc2VxdWVuY2VzIG9mIHVzZSBvZiB0aGlzCi0gKiBzb2Z0d2FyZSwgbm8gbWF0dGVyIGhvdyBhd2Z1bCwgZXZlbiBpZiB0aGV5IGFyaXNlIGZyb20gZmxhd3MgaW4gaXQuCi0gKgotICogMi4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkLCBlaXRoZXIgYnkKLSAqIGV4cGxpY2l0IGNsYWltIG9yIGJ5IG9taXNzaW9uLiAgU2luY2UgZmV3IHVzZXJzIGV2ZXIgcmVhZCBzb3VyY2VzLCBjcmVkaXRzCi0gKiBtdXN0IGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KLSAqCi0gKiAzLiBBbHRlcmVkIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCi0gKiBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuICBTaW5jZSBmZXcgdXNlcnMgZXZlciByZWFkCi0gKiBzb3VyY2VzLCBjcmVkaXRzIG11c3QgYXBwZWFyIGluIHRoZSBkb2N1bWVudGF0aW9uLgotICoKLSAqIDQuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIEZvciBjb21wbGlhbmNlIHdpdGggTXIgRGFyd2luJ3MgdGVybXM6IHRoaXMgaGFzIGJlZW4gdmVyeSBzaWduaWZpY2FudGx5Ci0gKiBtb2RpZmllZCBmcm9tIHRoZSBmcmVlICJmaWxlIiBjb21tYW5kLgotICogLSBhbGwtaW4tb25lIGZpbGUgZm9yIGNvbXBpbGF0aW9uIGNvbnZlbmllbmNlIHdoZW4gbW92aW5nIGZyb20gb25lCi0gKiAgIHZlcnNpb24gb2YgQXBhY2hlIHRvIHRoZSBuZXh0LgotICogLSBNZW1vcnkgYWxsb2NhdGlvbiBpcyBkb25lIHRocm91Z2ggdGhlIEFwYWNoZSBBUEkncyBwb29sIHN0cnVjdHVyZS4KLSAqIC0gQWxsIGZ1bmN0aW9ucyBoYXZlIGhhZCBuZWNlc3NhcnkgQXBhY2hlIEFQSSByZXF1ZXN0IG9yIHNlcnZlcgotICogICBzdHJ1Y3R1cmVzIHBhc3NlZCB0byB0aGVtIHdoZXJlIG5lY2Vzc2FyeSB0byBjYWxsIG90aGVyIEFwYWNoZSBBUEkKLSAqICAgcm91dGluZXMuICAoPGVtPmkuZS48L2VtPiwgdXN1YWxseSBmb3IgbG9nZ2luZywgZmlsZXMsIG9yIG1lbW9yeSBhbGxvY2F0aW9uIGluCi0gKiAgIGl0c2VsZiBvciBhIGNhbGxlZCBmdW5jdGlvbi4pCi0gKiAtIHN0cnVjdCBtYWdpYyBoYXMgYmVlbiBjb252ZXJ0ZWQgZnJvbSBhbiBhcnJheSB0byBhIHNpbmdsZS1lbmRlZCBsaW5rZWQKLSAqICAgbGlzdCBiZWNhdXNlIGl0IG9ubHkgZ3Jvd3Mgb25lIHJlY29yZCBhdCBhIHRpbWUsIGl0J3Mgb25seSBhY2Nlc3NlZAotICogICBzZXF1ZW50aWFsbHksIGFuZCB0aGUgQXBhY2hlIEFQSSBoYXMgbm8gZXF1aXZhbGVudCBvZiByZWFsbG9jKCkuCi0gKiAtIEZ1bmN0aW9ucyBoYXZlIGJlZW4gY2hhbmdlZCB0byBnZXQgdGhlaXIgcGFyYW1ldGVycyBmcm9tIHRoZSBzZXJ2ZXIKLSAqICAgY29uZmlndXJhdGlvbiBpbnN0ZWFkIG9mIGdsb2JhbHMuICAoSXQgc2hvdWxkIGJlIHJlZW50cmFudCBub3cgYnV0IGhhcwotICogICBub3QgYmVlbiB0ZXN0ZWQgaW4gYSB0aHJlYWRlZCBlbnZpcm9ubWVudC4pCi0gKiAtIFBsYWNlcyB3aGVyZSBpdCB1c2VkIHRvIHByaW50IHJlc3VsdHMgdG8gc3Rkb3V0IG5vdyBzYXZlcyB0aGVtIGluIGEKLSAqICAgbGlzdCB3aGVyZSB0aGV5J3JlIHVzZWQgdG8gc2V0IHRoZSBNSU1FIHR5cGUgaW4gdGhlIEFwYWNoZSByZXF1ZXN0Ci0gKiAgIHJlY29yZC4KLSAqIC0gQ29tbWFuZC1saW5lIGZsYWdzIGhhdmUgYmVlbiByZW1vdmVkIHNpbmNlIHRoZXkgd2lsbCBuZXZlciBiZSB1c2VkIGhlcmUuCi0gKgotICovCi08L3ByZT4KLTwvc2VjdGlvbj4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+TWltZU1hZ2ljRmlsZTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5FbmFibGUgTUlNRS10eXBlIGRldGVybWluYXRpb24gYmFzZWQgb24gZmlsZSBjb250ZW50cwotdXNpbmcgdGhlIHNwZWNpZmllZCBtYWdpYyBmaWxlPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+TWltZU1hZ2ljRmlsZSA8ZW0+ZmlsZS1wYXRoPC9lbT48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PgotPGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5NaW1lTWFnaWNGaWxlPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0bwotICAgIGVuYWJsZSB0aGlzIG1vZHVsZSwgdGhlIGRlZmF1bHQgZmlsZSBpcyBkaXN0cmlidXRlZCBhdAotICAgIDxjb2RlPmNvbmYvbWFnaWM8L2NvZGU+LiBOb24tcm9vdGVkIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUKLSAgICBTZXJ2ZXJSb290LiBWaXJ0dWFsIGhvc3RzIHdpbGwgdXNlIHRoZSBzYW1lIGZpbGUgYXMgdGhlIG1haW4KLSAgICBzZXJ2ZXIgdW5sZXNzIGEgbW9yZSBzcGVjaWZpYyBzZXR0aW5nIGlzIHVzZWQsIGluIHdoaWNoIGNhc2UKLSAgICB0aGUgbW9yZSBzcGVjaWZpYyBzZXR0aW5nIG92ZXJyaWRlcyB0aGUgbWFpbiBzZXJ2ZXIncyBmaWxlLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotPC9tb2R1bGVzeW5vcHNpcz4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9uZWdvdGlhdGlvbi5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9uZWdvdGlhdGlvbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjhhYzZlLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfbmVnb3RpYXRpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08IS0tJWh5cGVydGV4dCAtLT4KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgMi4wLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFwYWNoZSBtb2R1bGUgbW9kX25lZ290aWF0aW9uPC9USVRMRT4KLTwvSEVBRD4KLQotPEJPRFk+Ci08SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9zdWIuZ2lmIiBBTFQ9IiI+Ci08IS0tLyVoeXBlcnRleHQgLS0+Ci08SDE+TW9kdWxlIG1vZF9uZWdvdGlhdGlvbjwvaDE+Ci0KLVRoaXMgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+bW9kX25lZ290aWF0aW9uLmM8L2NvZGU+IGZpbGUsIGFuZAotaXMgY29tcGlsZWQgaW4gYnkgZGVmYXVsdC4gSXQgcHJvdmlkZXMgZm9yCi08QSBIUkVGPSJjb250ZW50LW5lZ290aWF0aW9uLmh0bWwiPmNvbnRlbnQgbmVnb3RpYXRpb248L0E+LiBBbnkgZG9jdW1lbnQgd2l0aAotbWltZSB0eXBlIDxjb2RlPmFwcGxpY2F0aW9uL3gtdHlwZS1tYXA8L2NvZGU+IHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IHRoaXMgbW9kdWxlLgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IGFwcGxpY2F0aW9uL3gtdHlwZS1tYXB9IG1pbWUgdHlwZSZndDsgLS0+Ci0KLTxoMj5TdW1tYXJ5PC9oMj4KLUNvbnRlbnQgbmVnb3RpYXRpb24sIG9yIG1vcmUgYWNjdXJhdGVseSBjb250ZW50IHNlbGVjdGlvbiwgaXMgdGhlCi1zZWxlY3Rpb24gb2YgdGhlIGRvY3VtZW50IHRoYXQgYmVzdCBtYXRjaGVzIHRoZSBjbGllbnRzCi1jYXBhYmlsaXRpZXMsIGZyb20gb25lIG9mIHNldmVyYWwgYXZhaWxhYmxlIGRvY3VtZW50cy4KLVRoZXJlIGFyZSB0d28gaW1wbGVtZW50YXRpb25zIG9mIHRoaXMuCi08dWw+Ci08bGk+IEEgdHlwZSBtYXAgKGEgZmlsZSB3aXRoIHRoZSBtaW1lIHR5cGUgPGNvZGU+YXBwbGljYXRpb24veC10eXBlLW1hcDwvY29kZT4pCi13aGljaCBleHBsaWNpdGx5IGxpc3RzIHRoZSBmaWxlcyBjb250YWluaW5nIHRoZSB2YXJpYW50cy4KLTxsaT4gQSBNdWx0aVZpZXdzIHNlYXJjaCAoZW5hYmxlZCBieSB0aGUgTXVsdGlWaWV3cwotPEEgSFJFRj0iY29yZS5odG1sI29wdGlvbnMiPk9wdGlvbjwvQT4sIHdoZXJlIHRoZSBzZXJ2ZXIgZG9lcyBhbiBpbXBsaWNpdAotZmlsZW5hbWUgcGF0dGVybiBtYXRjaCwgYW5kIGNob29zZSBmcm9tIGFtb25nc3QgdGhlIHJlc3VsdHMuCi08L3VsPgotCi08aDM+VHlwZSBtYXBzPC9oMz4KLUEgdHlwZSBtYXAgaGFzIHRoZSBzYW1lIGZvcm1hdCBhcyBSRkM4MjIgbWFpbCBoZWFkZXJzLiBJdCBjb250YWlucyBkb2N1bWVudAotZGVzY3JpcHRpb25zIHNlcGFyYXRlZCBieSBibGFuayBsaW5lcywgd2l0aCBsaW5lcyBiZWdpbm5pbmcgd2l0aCBhIGhhc2gKLWNoYXJhY3RlciAoJyMnKSB0cmVhdGVkIGFzIGNvbW1lbnRzLiBBIGRvY3VtZW50IGRlc2NyaXB0aW9uIGNvbnNpc3RzIG9mCi1zZXZlcmFsIGhlYWRlciByZWNvcmRzOyByZWNvcmRzIG1heSBiZSBjb250aW51ZWQgb24gbXVsdGlwbGUgbGluZXMgaWYgdGhlCi1jb250aW51YXRpb24gbGluZXMgc3RhcnQgd2l0aCBzcGFjZXMuIFRoZSBsZWFkaW5nIHNwYWNlIHdpbGwgYmUgZGVsZXRlZAotYW5kIHRoZSBsaW5lcyBjb25jYXRlbmF0ZWQuIEEgaGVhZGVyIHJlY29yZCBjb25zaXN0cyBvZiBhIGtleXdvcmQKLW5hbWUsIHdoaWNoIGFsd2F5cyBlbmRzIGluIGEgY29sb24sIGZvbGxvd2VkIGJ5IGEgdmFsdWUuIFdoaXRlc3BhY2UgaXMgYWxsb3dlZAotYmV0d2VlbiB0aGUgaGVhZGVyIG5hbWUgYW5kIHZhbHVlLCBhbmQgYmV0d2VlbiB0aGUgdG9rZW5zIG9mIHZhbHVlLgotCi1UaGUgaGVhZGVycwotYWxsb3dlZCBhcmU6Ci0KLTxkbD4KLTxkdD5Db250ZW50LUVuY29kaW5nOgotPGRkPlRoZSBlbmNvZGluZyBvZiB0aGUgZmlsZS4gQ3VycmVudGx5IG9ubHkgdHdvIGVuY29kaW5ncyBhcmUgcmVjb2duaXNlZAotYnkgaHR0cDsgPGNvZGU+eC1jb21wcmVzczwvY29kZT4gZm9yIGNvbXByZXNzZWQgZmlsZXMsIGFuZCA8Y29kZT54LWd6aXA8L2NvZGU+Ci1mb3IgZ3ppcHBlZCBmaWxlcy4KLTxkdD5Db250ZW50LUxhbmd1YWdlOgotPGRkPlRoZSBsYW5ndWFnZSBvZiB0aGUgdmFyaWFudCwgYXMgYW4gSW50ZXJuZXQgc3RhbmRhcmQgbGFuZ3VhZ2UgY29kZSwgc3VjaAotYXMgPGNvZGU+ZW48L2NvZGU+LgotPGR0PkNvbnRlbnQtTGVuZ3RoOgotPGRkPlRoZSBsZW5ndGggb2YgdGhlIGZpbGUsIGluIGJ5dGVzLiBJZiB0aGlzIGhlYWRlciBpcyBub3QgcHJlc2VudCwgdGhlbgotdGhlIGFjdHVhbCBsZW5ndGggb2YgdGhlIGZpbGUgaXMgdXNlZC4KLTxkdD5Db250ZW50LVR5cGU6Ci08ZGQ+VGhlIE1JTUUgbWVkaWEgdHlwZSBvZiB0aGUgZG9jdW1lbnQsIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycy4gCi1wYXJhbWV0ZXJzIGFyZSBzZXBhcmF0ZWQgZnJvbSB0aGUgbWVkaWEgdHlwZSBhbmQgZnJvbSBvbmUgYW5vdGhlciBieQotc2VtaS1jb2xvbnMuIFBhcmFtZXRlciBzeW50YXggaXMgbmFtZT12YWx1ZTsgYWxsb3dlZCBwYXJhbWV0ZXJzIGFyZToKLTxkbD4KLTxkdD5sZXZlbAotPGRkPnRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLCB3aGljaCBzcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgdGhlIG1lZGlhIHR5cGUuCi1Gb3IgPGNvZGU+dGV4dC9odG1sPC9jb2RlPiB0aGlzIGRlZmF1bHRzIHRvIDIsIG90aGVyd2lzZSAwLgotPGR0PnFzCi08ZGQ+dGhlIHZhbHVlIGlzIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIHdpdGggdmFsdWUgYmV0d2VlbiAwLiBhbmQgMS4KLUl0IGluZGljYXRpb25zIHRoZSAncXVhbGl0eScgb2YgdGhpcyB2YXJpYW50LgotPC9kbD4KLUV4YW1wbGU6Ci08YmxvY2txdW90ZT48Y29kZT5Db250ZW50LVR5cGU6IGltYWdlL2pwZWc7IHFzPTAuODwvY29kZT48L2Jsb2NrcXVvdGU+Ci08ZHQ+VVJJOgotPGRkPlRoZSBwYXRoIHRvIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhpcyB2YXJpYW50LCByZWxhdGl2ZSB0byB0aGUgbWFwIGZpbGUuCi08L2RsPgotCi08aDM+TXVsdGlWaWV3czwvaDM+Ci1BIE11bHRpVmlld3Mgc2VhcmNoIGlzIGVuYWJsZWQgYnkgdGhlIE11bHRpVmlld3MKLTxBIEhSRUY9ImNvcmUuaHRtbCNvcHRpb25zIj5PcHRpb248L0E+LgotSWYgdGhlIHNlcnZlciByZWNlaXZlcyBhIHJlcXVlc3QgZm9yIDxjb2RlPi9zb21lL2Rpci9mb288L2NvZGU+IGFuZAotPGNvZGU+L3NvbWUvZGlyL2ZvbzwvY29kZT4gZG9lcyA8ZW0+bm90PC9lbT4gZXhpc3QsIHRoZW4gdGhlIHNlcnZlciByZWFkcyB0aGUKLWRpcmVjdG9yeSBsb29raW5nIGZvciBhbGwgZmlsZXMgbmFtZWQgPGNvZGU+Zm9vLio8L2NvZGU+LCBhbmQgZWZmZWN0aXZlbHkKLWZha2VzIHVwIGEgdHlwZSBtYXAgd2hpY2ggbmFtZXMgYWxsIHRob3NlIGZpbGVzLCBhc3NpZ25pbmcgdGhlbSB0aGUgc2FtZSBtZWRpYQotdHlwZXMgYW5kIGNvbnRlbnQtZW5jb2RpbmdzIGl0IHdvdWxkIGhhdmUgaWYgdGhlIGNsaWVudCBoYWQgYXNrZWQgZm9yCi1vbmUgb2YgdGhlbSBieSBuYW1lLiAgSXQgdGhlbiBjaG9vc2VzIHRoZSBiZXN0IG1hdGNoIHRvIHRoZSBjbGllbnQncwotcmVxdWlyZW1lbnRzLCBhbmQgcmV0dXJucyB0aGF0IGRvY3VtZW50LjxwPgotCi0KLTwhLS0laHlwZXJ0ZXh0IC0tPgotPGgyPkRpcmVjdGl2ZXM8L2gyPgotPHVsPgotPGxpPjxBIGhyZWY9IiNjYWNoZW5lZ290aWF0ZWRkb2NzIj5DYWNoZU5lZ290aWF0ZWREb2NzPC9hPgotPGxpPjxBIEhSRUY9IiNsYW5ndWFnZXByaW9yaXR5Ij5MYW5ndWFnZVByaW9yaXR5PC9BPgotPC91bD4KLTxocj4KLTwhLS0vJWh5cGVydGV4dCAtLT4KLQotPEEgbmFtZT0iY2FjaGVuZWdvdGlhdGVkZG9jcyI+PGgyPkNhY2hlTmVnb3RpYXRlZERvY3M8L2gyPjwvQT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBDYWNoZU5lZ290aWF0ZWREb2NzPGJyPgotPFN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IEJhc2U8YnI+Ci08c3Ryb25nPk1vZHVsZTo8L3N0cm9uZz4gbW9kX25lZ290aWF0aW9uPGJyPgotPHN0cm9uZz5Db21wYXRpYmlsaXR5Ojwvc3Ryb25nPiBDYWNoZU5lZ290aWF0ZWREb2NzIGlzIG9ubHkgYXZhaWxhYmxlCi1pbiBBcGFjaGUgMS4xIGFuZCBsYXRlci48cD4KLQotPHA+SWYgc2V0LCB0aGlzIGRpcmVjdGl2ZSBhbGxvd3MgY29udGVudC1uZWdvdGlhdGVkIGRvY3VtZW50cyB0byBiZSBjYWNoZWQKLWJ5Ci1wcm94eSBzZXJ2ZXJzLiBUaGlzIGNvdWxkIG1lYW4gdGhhdCBjbGllbnRzIGJlaGluZCB0aG9zZSBwcm94eXMgY291bGQKLXJldHJpZXZlIHZlcnNpb25zIG9mIHRoZSBkb2N1bWVudHMgdGhhdCBhcmUgbm90IHRoZSBiZXN0IG1hdGNoIGZvcgotdGhlaXIgYWJpbGl0aWVzLCBidXQgaXQgd2lsbCBtYWtlIGNhY2hpbmcgbW9yZSBlZmZpY2llbnQuPC9wPgotCi08IS0tJWh5cGVydGV4dCAtLT4KLTxBIG5hbWU9Imxhbmd1YWdlcHJpb3JpdHkiPjxoMj5MYW5ndWFnZVByaW9yaXR5PC9oMj48L0E+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgTGFuZ3VhZ2VQcmlvcml0eX0gZGlyZWN0aXZlJmd0OyAtLT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBMYW5ndWFnZVByaW9yaXR5IDxlbT5taW1lLWxhbmcgbWltZS1sYW5nLi4uPC9lbT48YnI+Ci08U3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3M8YnI+Ci08U3Ryb25nPk92ZXJyaWRlOjwvc3Ryb25nPiBGaWxlSW5mbzxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBCYXNlPGJyPgotPHN0cm9uZz5Nb2R1bGU6PC9zdHJvbmc+IG1vZF9uZWdvdGlhdGlvbjxwPgotCi1UaGUgTGFuZ3VhZ2VQcmlvcml0eSBzZXRzIHRoZSBwcmVjZWRlbmNlIG9mIGxhbmd1YWdlIHZhcmlhbnRzIGZvciB0aGUgY2FzZQotd2hlcmUgdGhlIGNsaWVudCBkb2VzIG5vdCBleHByZXNzIGEgcHJlZmVyZW5jZSwgd2hlbiBoYW5kbGluZyBhCi1NdWx0aVZpZXdzIHJlcXVlc3QuIFRoZSBsaXN0IG9mIDxlbT5taW1lLWxhbmc8L2VtPiBhcmUgaW4gb3JkZXIgb2YgZGVjcmVhc2luZwotcHJlZmVyZW5jZS4gRXhhbXBsZToKLTxibG9ja3F1b3RlPjxjb2RlPkxhbmd1YWdlUHJpb3JpdHkgZW4gZnIgZGU8L2NvZGU+PC9ibG9ja3F1b3RlPgotRm9yIGEgcmVxdWVzdCBmb3IgPGNvZGU+Zm9vLmh0bWw8L2NvZGU+LCB3aGVyZSA8Y29kZT5mb28uaHRtbC5mcjwvY29kZT4KLWFuZCA8Y29kZT5mb28uaHRtbC5kZTwvY29kZT4gYm90aCBleGlzdGVkLCBidXQgdGhlIGJyb3dzZXIgZGlkIG5vdCBleHByZXNzCi1hIGxhbmd1YWdlIHByZWZlcmVuY2UsIHRoZW4gPGNvZGU+Zm9vLmh0bWwuZnI8L2NvZGU+IHdvdWxkIGJlIHJldHVybmVkLjxwPgotPCEtLSVoeXBlcnRleHQgLS0+Ci08aHI+Ci0KLTxBIEhSRUY9Ii4uLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfaG9tZS5naWYiIEFMVD0iSG9tZSI+PC9BPgotPEEgSFJFRj0iLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2luZGV4LmdpZiIgQUxUPSJJbmRleCI+PC9BPgotCi08L0JPRFk+Ci08L0hUTUw+Ci08IS0tLyVoeXBlcnRleHQgLS0+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX25lZ290aWF0aW9uLnhtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfbmVnb3RpYXRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjkwNDQ0Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfbmVnb3RpYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIG1vZHVsZXN5bm9wc2lzIFNZU1RFTSAiLi4vc3R5bGUvbW9kdWxlc3lub3BzaXMuZHRkIj4KLTw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9Ii4uL3N0eWxlL21hbnVhbC54c2wiPz4KLTxtb2R1bGVzeW5vcHNpcz4KLQotPG5hbWU+bW9kX25lZ290aWF0aW9uPC9uYW1lPgotPGRlc2NyaXB0aW9uPlByb3ZpZGVzIGZvciA8YQotICAgIGhyZWY9Ii4uL2NvbnRlbnQtbmVnb3RpYXRpb24uaHRtbCI+Y29udGVudCBuZWdvdGlhdGlvbjwvYT48L2Rlc2NyaXB0aW9uPgotPHN0YXR1cz5CYXNlPC9zdGF0dXM+Ci08c291cmNlZmlsZT5tb2RfbmVnb3RpYXRpb24uYzwvc291cmNlZmlsZT4KLTxpZGVudGlmaWVyPm5lZ290aWF0aW9uX21vZHVsZTwvaWRlbnRpZmllcj4KLQotPHN1bW1hcnk+Ci0gICAgPHA+Q29udGVudCBuZWdvdGlhdGlvbiwgb3IgbW9yZSBhY2N1cmF0ZWx5IGNvbnRlbnQgc2VsZWN0aW9uLCBpcwotICAgIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGRvY3VtZW50IHRoYXQgYmVzdCBtYXRjaGVzIHRoZSBjbGllbnRzCi0gICAgY2FwYWJpbGl0aWVzLCBmcm9tIG9uZSBvZiBzZXZlcmFsIGF2YWlsYWJsZSBkb2N1bWVudHMuIFRoZXJlCi0gICAgYXJlIHR3byBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcy48L3A+Ci0KLSAgICA8dWw+Ci0gICAgICA8bGk+QSB0eXBlIG1hcCAoYSBmaWxlIHdpdGggdGhlIGhhbmRsZXIKLSAgICAgIDxjb2RlPnR5cGUtbWFwPC9jb2RlPikgd2hpY2ggZXhwbGljaXRseSBsaXN0cyB0aGUgZmlsZXMKLSAgICAgIGNvbnRhaW5pbmcgdGhlIHZhcmlhbnRzLjwvbGk+Ci0KLSAgICAgIDxsaT5BIE11bHRpVmlld3Mgc2VhcmNoIChlbmFibGVkIGJ5IHRoZSBNdWx0aVZpZXdzIDxkaXJlY3RpdmUKLSAgICAgIG1vZHVsZT0iY29yZS5odG1sIj5PcHRpb25zPC9kaXJlY3RpdmU+LCB3aGVyZSB0aGUgc2VydmVyIGRvZXMgYW4KLSAgICAgIGltcGxpY2l0IGZpbGVuYW1lIHBhdHRlcm4gbWF0Y2gsIGFuZCBjaG9vc2UgZnJvbSBhbW9uZ3N0IHRoZQotICAgICAgcmVzdWx0cy48L2xpPgotICAgIDwvdWw+Ci08L3N1bW1hcnk+Ci0KLTxzZWVhbHNvPjxkaXJlY3RpdmUgbW9kdWxlPSJtb2RfbWltZSI+RGVmYXVsdExhbmdhdWdlPC9kaXJlY3RpdmU+PC9zZWVhbHNvPgotPHNlZWFsc28+PGRpcmVjdGl2ZSBtb2R1bGU9Im1vZF9taW1lIj5BZGRFbmNvZGluZzwvZGlyZWN0aXZlPjwvc2VlYWxzbz4KLTxzZWVhbHNvPjxkaXJlY3RpdmUgbW9kdWxlPSJtb2RfbWltZSI+QWRkTGFuZ3VhZ2U8L2RpcmVjdGl2ZT48L3NlZWFsc28+Ci08c2VlYWxzbz48ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX21pbWUiPkFkZFR5cGU8L2RpcmVjdGl2ZT48L3NlZWFsc28+Ci0KLTxzZWN0aW9uPjx0aXRsZT5UeXBlIG1hcHM8L3RpdGxlPgotICAgIDxwPkEgdHlwZSBtYXAgaGFzIHRoZSBzYW1lIGZvcm1hdCBhcyBSRkM4MjIgbWFpbCBoZWFkZXJzLiBJdAotICAgIGNvbnRhaW5zIGRvY3VtZW50IGRlc2NyaXB0aW9ucyBzZXBhcmF0ZWQgYnkgYmxhbmsgbGluZXMsIHdpdGgKLSAgICBsaW5lcyBiZWdpbm5pbmcgd2l0aCBhIGhhc2ggY2hhcmFjdGVyICgnIycpIHRyZWF0ZWQgYXMKLSAgICBjb21tZW50cy4gQSBkb2N1bWVudCBkZXNjcmlwdGlvbiBjb25zaXN0cyBvZiBzZXZlcmFsIGhlYWRlcgotICAgIHJlY29yZHM7IHJlY29yZHMgbWF5IGJlIGNvbnRpbnVlZCBvbiBtdWx0aXBsZSBsaW5lcyBpZiB0aGUKLSAgICBjb250aW51YXRpb24gbGluZXMgc3RhcnQgd2l0aCBzcGFjZXMuIFRoZSBsZWFkaW5nIHNwYWNlIHdpbGwgYmUKLSAgICBkZWxldGVkIGFuZCB0aGUgbGluZXMgY29uY2F0ZW5hdGVkLiBBIGhlYWRlciByZWNvcmQgY29uc2lzdHMgb2YKLSAgICBhIGtleXdvcmQgbmFtZSwgd2hpY2ggYWx3YXlzIGVuZHMgaW4gYSBjb2xvbiwgZm9sbG93ZWQgYnkgYQotICAgIHZhbHVlLiBXaGl0ZXNwYWNlIGlzIGFsbG93ZWQgYmV0d2VlbiB0aGUgaGVhZGVyIG5hbWUgYW5kIHZhbHVlLAotICAgIGFuZCBiZXR3ZWVuIHRoZSB0b2tlbnMgb2YgdmFsdWUuIFRoZSBoZWFkZXJzIGFsbG93ZWQgYXJlOiA8L3A+Ci0KLSAgICA8ZGw+Ci0gICAgICA8ZHQ+Q29udGVudC1FbmNvZGluZzo8L2R0PgotCi0gICAgICA8ZGQ+VGhlIGVuY29kaW5nIG9mIHRoZSBmaWxlLiBBcGFjaGUgb25seSByZWNvZ25pemVzCi0gICAgICBlbmNvZGluZ3MgdGhhdCBhcmUgZGVmaW5lZCBieSBhbiA8ZGlyZWN0aXZlCi0gICAgICBtb2R1bGU9Im1vZF9taW1lIj5BZGRFbmNvZGluZzwvZGlyZWN0aXZlPiBkaXJlY3RpdmUuCi0gICAgICBUaGlzIG5vcm1hbGx5IGluY2x1ZGVzIHRoZSBlbmNvZGluZ3MgPGNvZGU+eC1jb21wcmVzczwvY29kZT4KLSAgICAgIGZvciBjb21wcmVzcydkIGZpbGVzLCBhbmQgPGNvZGU+eC1nemlwPC9jb2RlPiBmb3IgZ3ppcCdkCi0gICAgICBmaWxlcy4gVGhlIDxjb2RlPngtPC9jb2RlPiBwcmVmaXggaXMgaWdub3JlZCBmb3IgZW5jb2RpbmcKLSAgICAgIGNvbXBhcmlzb25zLjwvZGQ+Ci0KLSAgICAgIDxkdD5Db250ZW50LUxhbmd1YWdlOjwvZHQ+Ci0KLSAgICAgIDxkZD5UaGUgbGFuZ3VhZ2Ugb2YgdGhlIHZhcmlhbnQsIGFzIGFuIEludGVybmV0IHN0YW5kYXJkCi0gICAgICBsYW5ndWFnZSB0YWcgKFJGQyAxNzY2KS4gQW4gZXhhbXBsZSBpcyA8Y29kZT5lbjwvY29kZT4sCi0gICAgICBtZWFuaW5nIEVuZ2xpc2guPC9kZD4KLQotICAgICAgPGR0PkNvbnRlbnQtTGVuZ3RoOjwvZHQ+Ci0KLSAgICAgIDxkZD5UaGUgbGVuZ3RoIG9mIHRoZSBmaWxlLCBpbiBieXRlcy4gSWYgdGhpcyBoZWFkZXIgaXMgbm90Ci0gICAgICBwcmVzZW50LCB0aGVuIHRoZSBhY3R1YWwgbGVuZ3RoIG9mIHRoZSBmaWxlIGlzIHVzZWQuPC9kZD4KLQotICAgICAgPGR0PkNvbnRlbnQtVHlwZTo8L2R0PgotCi0gICAgICA8ZGQ+Ci0gICAgICAgIFRoZSBNSU1FIG1lZGlhIHR5cGUgb2YgdGhlIGRvY3VtZW50LCB3aXRoIG9wdGlvbmFsCi0gICAgICAgIHBhcmFtZXRlcnMuIFBhcmFtZXRlcnMgYXJlIHNlcGFyYXRlZCBmcm9tIHRoZSBtZWRpYSB0eXBlCi0gICAgICAgIGFuZCBmcm9tIG9uZSBhbm90aGVyIGJ5IGEgc2VtaS1jb2xvbiwgd2l0aCBhIHN5bnRheCBvZgotICAgICAgICA8Y29kZT5uYW1lPXZhbHVlPC9jb2RlPi4gQ29tbW9uIHBhcmFtZXRlcnMgaW5jbHVkZTogCi0KLSAgICAgICAgPGRsPgotICAgICAgICAgIDxkdD5sZXZlbDwvZHQ+Ci0KLSAgICAgICAgICA8ZGQ+YW4gaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBtZWRpYSB0eXBlLgotICAgICAgICAgIEZvciA8Y29kZT50ZXh0L2h0bWw8L2NvZGU+IHRoaXMgZGVmYXVsdHMgdG8gMiwgb3RoZXJ3aXNlCi0gICAgICAgICAgMC48L2RkPgotCi0gICAgICAgICAgPGR0PnFzPC9kdD4KLQotICAgICAgICAgIDxkZD5hIGZsb2F0aW5nLXBvaW50IG51bWJlciB3aXRoIGEgdmFsdWUgaW4gdGhlIHJhbmdlIDAuMAotICAgICAgICAgIHRvIDEuMCwgaW5kaWNhdGluZyB0aGUgcmVsYXRpdmUgJ3F1YWxpdHknIG9mIHRoaXMgdmFyaWFudAotICAgICAgICAgIGNvbXBhcmVkIHRvIHRoZSBvdGhlciBhdmFpbGFibGUgdmFyaWFudHMsIGluZGVwZW5kZW50IG9mCi0gICAgICAgICAgdGhlIGNsaWVudCdzIGNhcGFiaWxpdGllcy4gRm9yIGV4YW1wbGUsIGEganBlZyBmaWxlIGlzCi0gICAgICAgICAgdXN1YWxseSBvZiBoaWdoZXIgc291cmNlIHF1YWxpdHkgdGhhbiBhbiBhc2NpaSBmaWxlIGlmIGl0Ci0gICAgICAgICAgaXMgYXR0ZW1wdGluZyB0byByZXByZXNlbnQgYSBwaG90b2dyYXBoLiBIb3dldmVyLCBpZiB0aGUKLSAgICAgICAgICByZXNvdXJjZSBiZWluZyByZXByZXNlbnRlZCBpcyBhc2NpaSBhcnQsIHRoZW4gYW4gYXNjaWkKLSAgICAgICAgICBmaWxlIHdvdWxkIGhhdmUgYSBoaWdoZXIgc291cmNlIHF1YWxpdHkgdGhhbiBhIGpwZWcgZmlsZS4KLSAgICAgICAgICBBbGwgcXMgdmFsdWVzIGFyZSB0aGVyZWZvcmUgc3BlY2lmaWMgdG8gYSBnaXZlbgotICAgICAgICAgIHJlc291cmNlLjwvZGQ+Ci0gICAgICAgIDwvZGw+Ci0gICAgICAgIEV4YW1wbGU6IAotCi0gICAgICAgIDxibG9ja3F1b3RlPgotICAgICAgICAgIDxjb2RlPkNvbnRlbnQtVHlwZTogaW1hZ2UvanBlZzsgcXM9MC44PC9jb2RlPgotICAgICAgICA8L2Jsb2NrcXVvdGU+Ci0gICAgICA8L2RkPgotCi0gICAgICA8ZHQ+VVJJOjwvZHQ+Ci0KLSAgICAgIDxkZD5UaGUgcGF0aCB0byB0aGUgZmlsZSBjb250YWluaW5nIHRoaXMgdmFyaWFudCwgcmVsYXRpdmUgdG8KLSAgICAgIHRoZSBtYXAgZmlsZS48L2RkPgotICAgIDwvZGw+Ci08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uPjx0aXRsZT5NdWx0aVZpZXdzPC90aXRsZT4KLQotICAgIDxwPkEgTXVsdGlWaWV3cyBzZWFyY2ggaXMgZW5hYmxlZCBieSB0aGUgTXVsdGlWaWV3cyA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJjb3JlIj5PcHRpb25zPC9kaXJlY3RpdmU+LiBJZiB0aGUgc2VydmVyIHJlY2VpdmVzIGEKLSAgICByZXF1ZXN0IGZvciA8Y29kZT4vc29tZS9kaXIvZm9vPC9jb2RlPiBhbmQKLSAgICA8Y29kZT4vc29tZS9kaXIvZm9vPC9jb2RlPiBkb2VzIDxlbT5ub3Q8L2VtPiBleGlzdCwgdGhlbiB0aGUKLSAgICBzZXJ2ZXIgcmVhZHMgdGhlIGRpcmVjdG9yeSBsb29raW5nIGZvciBhbGwgZmlsZXMgbmFtZWQKLSAgICA8Y29kZT5mb28uKjwvY29kZT4sIGFuZCBlZmZlY3RpdmVseSBmYWtlcyB1cCBhIHR5cGUgbWFwIHdoaWNoCi0gICAgbmFtZXMgYWxsIHRob3NlIGZpbGVzLCBhc3NpZ25pbmcgdGhlbSB0aGUgc2FtZSBtZWRpYSB0eXBlcyBhbmQKLSAgICBjb250ZW50LWVuY29kaW5ncyBpdCB3b3VsZCBoYXZlIGlmIHRoZSBjbGllbnQgaGFkIGFza2VkIGZvciBvbmUKLSAgICBvZiB0aGVtIGJ5IG5hbWUuIEl0IHRoZW4gY2hvb3NlcyB0aGUgYmVzdCBtYXRjaCB0byB0aGUgY2xpZW50J3MKLSAgICByZXF1aXJlbWVudHMsIGFuZCByZXR1cm5zIHRoYXQgZG9jdW1lbnQuPC9wPgotPC9zZWN0aW9uPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5DYWNoZU5lZ290aWF0ZWREb2NzPC9uYW1lPgotPGRlc2NyaXB0aW9uPkFsbG93cyBjb250ZW50LW5lZ290aWF0ZWQgZG9jdW1lbnRzIHRvIGJlIAotY2FjaGVkIGJ5IHByb3h5IHNlcnZlcnM8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5DYWNoZU5lZ290aWF0ZWREb2NzIG9ufG9mZjwvc3ludGF4PgotPGRlZmF1bHQ+Q2FjaGVOZWdvdGlhdGVkRG9jcyBvZmY8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPGNvbXBhdGliaWxpdHk+VGhlIHN5bnRheCBjaGFuZ2VkIGluIHZlcnNpb24gMi4wLjwvY29tcGF0aWJpbGl0eT4KLQotPHVzYWdlPgotICAgIDxwPklmIHNldCwgdGhpcyBkaXJlY3RpdmUgYWxsb3dzIGNvbnRlbnQtbmVnb3RpYXRlZCBkb2N1bWVudHMKLSAgICB0byBiZSBjYWNoZWQgYnkgcHJveHkgc2VydmVycy4gVGhpcyBjb3VsZCBtZWFuIHRoYXQgY2xpZW50cwotICAgIGJlaGluZCB0aG9zZSBwcm94eXMgY291bGQgcmV0cmlldmUgdmVyc2lvbnMgb2YgdGhlIGRvY3VtZW50cwotICAgIHRoYXQgYXJlIG5vdCB0aGUgYmVzdCBtYXRjaCBmb3IgdGhlaXIgYWJpbGl0aWVzLCBidXQgaXQgd2lsbAotICAgIG1ha2UgY2FjaGluZyBtb3JlIGVmZmljaWVudC48L3A+Ci0KLSAgICA8cD5UaGlzIGRpcmVjdGl2ZSBvbmx5IGFwcGxpZXMgdG8gcmVxdWVzdHMgd2hpY2ggY29tZSBmcm9tCi0gICAgSFRUUC8xLjAgYnJvd3NlcnMuIEhUVFAvMS4xIHByb3ZpZGVzIG11Y2ggYmV0dGVyIGNvbnRyb2wgb3ZlcgotICAgIHRoZSBjYWNoaW5nIG9mIG5lZ290aWF0ZWQgZG9jdW1lbnRzLCBhbmQgdGhpcyBkaXJlY3RpdmUgaGFzIG5vCi0gICAgZWZmZWN0IGluIHJlc3BvbnNlcyB0byBIVFRQLzEuMSByZXF1ZXN0cy48L3A+Ci0KLSAgICA8cD5QcmlvciB0byB2ZXJzaW9uIDIuMCwKLSAgICA8ZGlyZWN0aXZlPkNhY2hlTmVnb3RpYXRlZERvY3M8L2RpcmVjdGl2ZT4gZGlkIG5vdCB0YWtlIGFuCi0gICAgYXJndW1lbnQ7IGl0IHdhcyB0dXJuZWQgb24gYnkgdGhlIHByZXNlbmNlIG9mIHRoZSBkaXJlY3RpdmUgYnkKLSAgICBpdHNlbGYuPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkZvcmNlTGFuZ2F1Z2VQcmlvcml0eTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5BY3Rpb24gdG8gdGFrZSBpZiBhIHNpbmdsZSBhY2NlcHRhYmxlIGRvY3VtZW50IGlzIG5vdCAKLWZvdW5kPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+Rm9yY2VMYW5ndWFnZVByaW9yaXR5IE5vbmV8UHJlZmVyfEZhbGxiYWNrIFtQcmVmZXJ8RmFsbGJhY2tdPC9zeW50YXg+Ci08ZGVmYXVsdD5Gb3JjZUxhbmdhdWdlUHJpb3JpdHkgTm9uZTwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PgotPGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0PgotPGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT5GaWxlSW5mbzwvb3ZlcnJpZGU+Ci08Y29tcGF0aWJpbGl0eT5BdmFpbGFibGUgaW4gdmVyc2lvbiAyLjAuMzAgYW5kIGxhdGVyPC9jb21wYXRpYmlsaXR5PgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIDxkaXJlY3RpdmU+Rm9yY2VMYW5ndWFnZVByaW9yaXR5PC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSB1c2VzCi0gICAgdGhlIGdpdmVuIDxkaXJlY3RpdmUKLSAgICBtb2R1bGU9Im1vZF9uZWdvdGlhdGlvbiI+TGFuZ3VhZ2VQcmlvcml0eTwvZGlyZWN0aXZlPiB0byBzYXRpc2Z5Ci0gICAgbmVnb3RhdGlvbiB3aGVyZSB0aGUgc2VydmVyIGNvdWxkIG90aGVyd2lzZSBub3QgcmV0dXJuIGEgc2luZ2xlCi0gICAgbWF0Y2hpbmcgZG9jdW1lbnQuPC9wPgotCi0gICAgPHA+PGNvZGU+Rm9yY2VMYW5ndWFnZVByaW9yaXR5IFByZWZlcjwvY29kZT4gdXNlcwotICAgIDxjb2RlPkxhbmd1YWdlUHJpb3JpdHk8L2NvZGU+IHRvIHNlcnZlIGEgb25lIHZhbGlkIHJlc3VsdCwgcmF0aGVyCi0gICAgdGhhbiByZXR1cm5pbmcgYW4gSFRUUCByZXN1bHQgMzAwIChNVUxUSVBMRSBDSE9JQ0VTKSB3aGVuIHRoZXJlCi0gICAgYXJlIHNldmVyYWwgZXF1YWxseSB2YWxpZCBjaG9pY2VzLiAgSWYgdGhlIGRpcmVjdGl2ZXMgYmVsb3cgd2VyZQotICAgIGdpdmVuLCBhbmQgdGhlIHVzZXIncyBBY2NlcHQtTGFuZ3VhZ2UgaGVhZGVyIGFzc2lnbmVkIGVuIGFuZCBkZQotICAgIGVhY2ggYXMgcXVhbGl0eSAuNTAwIChlcXVhbGx5IGFjY2VwdGFibGUpIHRoZW4gdGhlbiBmaXJzdCBtYXRjaGluZwotICAgIHZhcmlhbnQsIGVuLCB3aWxsIGJlIHNlcnZlZC48L3A+Ci0KLTxleGFtcGxlPgotICAgICAgTGFuZ3VhZ2VQcmlvcml0eSBlbiBmciBkZTxiciAvPgotICAgICAgRm9yY2VMYW5ndWFnZVByaW9yaXR5IFByZWZlcgotPC9leGFtcGxlPgotCi0gICAgPHA+PGNvZGU+Rm9yY2VMYW5ndWFnZVByaW9yaXR5IEZhbGxiYWNrPC9jb2RlPiB1c2VzCi0gICAgPGNvZGU+TGFuZ3VhZ2VQcmlvcml0eTwvY29kZT4gdG8gc2VydmUgYSB2YWxpZCByZXN1bHQsIHJhdGhlciB0aGFuCi0gICAgcmV0dXJuaW5nIGFuIEhUVFAgcmVzdWx0IDQwNiAoTk9UIEFDQ0VQVEFCTEUpLiAgSWYgdGhlIGRpcmVjdGl2ZXMKLSAgICBiZWxvdyB3ZXJlIGdpdmVuLCBhbmQgdGhlIHVzZXIncyBBY2NlcHQtTGFuZ3VhZ2Ugb25seSBwZXJtaXR0ZWQgYW4KLSAgICBlcyBsYW5nYXVnZSByZXNwb25zZSwgYnV0IHN1Y2ggYSB2YXJpYW50IGlzbid0IGZvdW5kLCB0aGVuIHRoZQotICAgIGZpcnN0IHZhcmlhbnQgZnJvbSB0aGUgTGFuZ3VhZ2VQcmlvcml0eSBsaXN0IGJlbG93IHdpbGwgYmUKLSAgICBzZXJ2ZWQuPC9wPgotCi08ZXhhbXBsZT4KLSAgICAgIExhbmd1YWdlUHJpb3JpdHkgZW4gZnIgZGU8YnIgLz4KLSAgICAgIEZvcmNlTGFuZ3VhZ2VQcmlvcml0eSBGYWxsYmFjawotPC9leGFtcGxlPgotCi0gICAgPHA+Qm90aCBvcHRpb25zLCBQcmVmZXIgYW5kIEZhbGxiYWNrLCBtYXkgYmUgc3BlY2lmaWVkLCBzbyBlaXRoZXIgdGhlCi0gICAgZmlyc3QgbWF0Y2hpbmcgdmFyaWFudCBmcm9tIExhbmd1YWdlUHJpb3JpdHkgd2lsbCBiZSBzZXJ2ZWQgaWYgbW9yZQotICAgIHRoYXQgb25lIHZhcmlhbnQgaXMgYWNjZXB0YWJsZSwgb3IgZmlyc3QgYXZhaWxhYmxlIGRvY3VtZW50IHdpbGwgYmUKLSAgICBzZXJ2ZWQgaWYgbm9uZSBvZiB0aGUgdmFyaWFudHMgbWF0Y2hlZCB0aGUgY2xpZW50J3MgYWNjZXB0YWJsZSBsaXN0IG9mCi0gICAgbGFuZ3VhZ2VzLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5MYW5ndWFnZVByaW9yaXR5PC9uYW1lPgotPGRlc2NyaXB0aW9uPlRoZSBwcmVjZW5kZW5jZSBvZiBsYW5ndWFnZSB2YXJpYW50cyBmb3IgY2FzZXMgd2hlcmUKLXRoZSBjbGllbnQgZG9lcyBub3QgZXhwcmVzcyBhIHByZWZlcmVuY2U8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5MYW5ndWFnZVByaW9yaXR5IDxlbT5NSU1FLWxhbmc8L2VtPiBbPGVtPk1JTUUtbGFuZzwvZW0+XSAuLi48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PgotPGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0PgotPGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT5GaWxlSW5mbzwvb3ZlcnJpZGU+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5MYW5ndWFnZVByaW9yaXR5PC9kaXJlY3RpdmU+IHNldHMgdGhlIHByZWNlZGVuY2UKLSAgICBvZiBsYW5ndWFnZSB2YXJpYW50cyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGNsaWVudCBkb2VzIG5vdAotICAgIGV4cHJlc3MgYSBwcmVmZXJlbmNlLCB3aGVuIGhhbmRsaW5nIGEgTXVsdGlWaWV3cyByZXF1ZXN0LiBUaGUgbGlzdAotICAgIG9mIDxlbT5NSU1FLWxhbmc8L2VtPiBhcmUgaW4gb3JkZXIgb2YgZGVjcmVhc2luZyBwcmVmZXJlbmNlLgotICAgIEV4YW1wbGU6PC9wPgotCi08ZXhhbXBsZT5MYW5ndWFnZVByaW9yaXR5IGVuIGZyIGRlPC9leGFtcGxlPgotCi0gICAgPHA+Rm9yIGEgcmVxdWVzdCBmb3IgPGNvZGU+Zm9vLmh0bWw8L2NvZGU+LCB3aGVyZQotICAgIDxjb2RlPmZvby5odG1sLmZyPC9jb2RlPiBhbmQgPGNvZGU+Zm9vLmh0bWwuZGU8L2NvZGU+IGJvdGgKLSAgICBleGlzdGVkLCBidXQgdGhlIGJyb3dzZXIgZGlkIG5vdCBleHByZXNzIGEgbGFuZ3VhZ2UgcHJlZmVyZW5jZSwKLSAgICB0aGVuIDxjb2RlPmZvby5odG1sLmZyPC9jb2RlPiB3b3VsZCBiZSByZXR1cm5lZC48L3A+Ci0KLSAgICA8cD5Ob3RlIHRoYXQgdGhpcyBkaXJlY3RpdmUgb25seSBoYXMgYW4gZWZmZWN0IGlmIGEgJ2Jlc3QnCi0gICAgbGFuZ3VhZ2UgY2Fubm90IGJlIGRldGVybWluZWQgYnkgYW55IG90aGVyIG1lYW5zIG9yIHRoZSA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJtb2RfbmVnb3RpYXRpb24iPkZvcmNlTGFuZ3VhZ2VQcmlvcml0eTwvZGlyZWN0aXZlPiBkaXJlY3RpdmUKLSAgICBpcyBub3QgPGNvZGU+Tm9uZTwvY29kZT4uIENvcnJlY3RseSBpbXBsZW1lbnRlZCBIVFRQLzEuMSByZXF1ZXN0cwotICAgIHdpbGwgbWVhbiB0aGlzIGRpcmVjdGl2ZSBoYXMgbm8gZWZmZWN0LjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08L21vZHVsZXN5bm9wc2lzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfcHJveHkuaHRtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfcHJveHkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY0ZGNkOS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX3Byb3h5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCAyLjAvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIG1vZHVsZSBtb2RfcHJveHk8L1RJVExFPgotPC9IRUFEPgotCi08Qk9EWT4KLTxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX3N1Yi5naWYiIEFMVD0iIj4KLTxIMT5BcGFjaGUgbW9kdWxlIG1vZF9wcm94eTwvaDE+Ci0KLVRoaXMgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+bW9kX3Byb3h5LmM8L2NvZGU+IGZpbGUsIGFuZAotaXMgbm90IGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuIEl0IHByb3ZpZGVzIGZvciBhIGNhY2hpbmcgcHJveHkgc2VydmVyLgotSXQgaXMgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDEuMSBhbmQgbGF0ZXIuCi0KLTxoMz5Ob3RlOjwvaDM+Ci08cD5UaGlzIG1vZHVsZSBpcyBleHBlcmltZW50YWwuIFVzZSBhdCB5b3VyIG93biByaXNrLjwvcD4KLQotPGgyPlN1bW1hcnk8L2gyPgotCi1UaGlzIG1vZHVsZSBpbXBsZW1lbnRzIGEgcHJveHkvY2FjaGUgZm9yIEFwYWNoZS4gSXQgaW1wbGVtZW50cwotcHJveHlpbmcgY2FwYWJpbGl0eSBmb3IgCi08Y29kZT5GVFA8L2NvZGU+LAotPGNvZGU+SFRUUC8wLjk8L2NvZGU+LCBhbmQKLTxjb2RlPkhUVFAvMS4wPC9jb2RlPi4KLVRoZSBtb2R1bGUgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gY29ubmVjdCB0byBvdGhlciBwcm94eSBtb2R1bGVzIGZvciB0aGVzZQotYW5kIG90aGVyIHByb3RvY29scy4KLQotPGgyPkRpcmVjdGl2ZXM8L2gyPgotPHVsPgotPGxpPjxhIGhyZWY9IiNwcm94eXJlcXVlc3RzIj5Qcm94eVJlcXVlc3RzPC9hPgotPGxpPjxhIGhyZWY9IiNwcm94eXJlbW90ZSI+UHJveHlSZW1vdGU8L2E+Ci08bGk+PGEgaHJlZj0iI3Byb3h5cGFzcyI+UHJveHlQYXNzPC9hPgotPGxpPjxhIGhyZWY9IiNjYWNoZXJvb3QiPkNhY2hlUm9vdDwvYT4KLTxsaT48YSBocmVmPSIjY2FjaGVzaXplIj5DYWNoZVNpemU8L2E+Ci08bGk+PGEgaHJlZj0iI2NhY2hlZ2NpbnRlcnZhbCI+Q2FjaGVHY0ludGVydmFsPC9hPgotPGxpPjxhIGhyZWY9IiNjYWNoZW1heGV4cGlyZSI+Q2FjaGVNYXhFeHBpcmU8L2E+Ci08bGk+PGEgaHJlZj0iI2NhY2hlbGFzdG1vZGlmaWVkZmFjdG9yIj5DYWNoZUxhc3RNb2RpZmllZEZhY3RvcjwvYT4KLTxsaT48YSBocmVmPSIjY2FjaGVkZWZhdWx0ZXhwaXJlIj5DYWNoZURlZmF1bHRFeHBpcmU8L2E+Ci08bGk+PGEgaHJlZj0iI25vY2FjaGUiPk5vQ2FjaGU8L2E+Ci08L3VsPgotCi08aHI+Ci0KLTxBIG5hbWU9InByb3h5cmVxdWVzdHMiPjxoMj5Qcm94eVJlcXVlc3RzPC9oMj48L0E+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gUHJveHlSZXF1ZXN0cyA8ZW0+b24vb2ZmPC9lbT48YnI+Ci08c3Ryb25nPkRlZmF1bHQ6PC9zdHJvbmc+IDxjb2RlPlByb3h5UmVxdWVzdHMgT2ZmPC9jb2RlPjxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZzxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBCYXNlPGJyPgotPHN0cm9uZz5Nb2R1bGU6PC9zdHJvbmc+IG1vZF9wcm94eTxicj4KLTxzdHJvbmc+Q29tcGF0aWJpbGl0eTo8L3N0cm9uZz4gUHJveHlSZXF1ZXN0IGlzIG9ubHkgYXZhaWxhYmxlIGluCi1BcGFjaGUgMS4xIGFuZCBsYXRlci48cD4KLQotVGhpcyBhbGxvd3Mgb3IgcHJldmVudHMgQXBhY2hlIGZyb20gZnVuY3Rpb25pbmcgYXMgYSBwcm94eQotc2VydmVyLiBTZXR0aW5nIFByb3h5UmVxdWVzdHMgdG8gJ29mZicgZG9lcyBub3QgZGlzYWJsZSB1c2Ugb2YgdGhlIDxhCi1ocmVmPSIjcHJveHlwYXNzIj5Qcm94eVBhc3M8L2E+IGRpcmVjdGl2ZS4KLQotPEEgbmFtZT0icHJveHlyZW1vdGUiPjxoMj5Qcm94eVJlbW90ZTwvaDI+PC9BPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IFByb3h5UmVtb3RlIDxlbT4mbHQ7bWF0Y2gmZ3Q7ICZsdDtyZW1vdGUtc2VydmVyJmd0OzwvZW0+PGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IEJhc2U8YnI+Ci08c3Ryb25nPk1vZHVsZTo8L3N0cm9uZz4gbW9kX3Byb3h5PGJyPgotPHN0cm9uZz5Db21wYXRpYmlsaXR5Ojwvc3Ryb25nPiBQcm94eVJlbW90ZSBpcyBvbmx5IGF2YWlsYWJsZSBpbgotQXBhY2hlIDEuMSBhbmQgbGF0ZXIuPHA+Ci0KLVRoaXMgZGVmaW5lcyByZW1vdGUgcHJveGllcyB0byB0aGlzIHByb3h5LiAmbHQ7bWF0Y2gmZ3Q7IGlzIGVpdGhlciB0aGUKLW5hbWUgb2YgYSBVUkwtc2NoZW1lIHRoYXQgdGhlIHJlbW90ZSBzZXJ2ZXIgc3VwcG9ydHMsIG9yIGEgcGFydGlhbCBVUkwKLWZvciB3aGljaCB0aGUgcmVtb3RlIHNlcnZlciBzaG91bGQgYmUgdXNlZCwgb3IgJyQnIHRvIGluZGljYXRlIHRoZQotc2VydmVyIHNob3VsZCBiZSBjb250YWN0ZWQgZm9yIGFsbCByZXF1ZXN0cy4gJmx0O3JlbW90ZS1zZXJ2ZXImZ3Q7IGlzIGEKLXBhcnRpYWwgVVJMIGZvciB0aGUgcmVtb3RlIHNlcnZlci4gU3ludGF4OgotCi08cHJlPgotICAmbHQ7cmVtb3RlLXNlcnZlciZndDsgPSAmbHQ7cHJvdG9jb2wmZ3Q7Oi8vJmx0O2hvc3RuYW1lJmd0O1s6cG9ydF0KLTwvcHJlPgotJmx0O3Byb3RvY29sJmd0OyBpcyB0aGUgcHJvdG9jb2wgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZQotcmVtb3RlCi1zZXJ2ZXI7IG9ubHkgImh0dHAiIGlzIHN1cHBvcnRlZCBieSB0aGlzIG1vZHVsZS4KLQotRXhhbXBsZToKLTxwcmU+Ci0gIFByb3h5UmVtb3RlIGZ0cCBodHRwOi8vZnRwcHJveHkubXlkb21haW4uY29tOjgwODAKLSAgUHJveHlSZW1vdGUgaHR0cDovL2dvb2RndXlzLmNvbS8gaHR0cDovL21pcnJvcmd1eXMuY29tOjgwMDAKLSAgUHJveHlSZW1vdGUgKiBodHRwOi8vY2xldmVyc2l0ZS5jb20KLTwvcHJlPgotCi08QSBuYW1lPSJwcm94eXBhc3MiPjxoMj5Qcm94eVBhc3M8L2gyPjwvQT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBQcm94eVBhc3MgPGVtPiZsdDtwYXRoJmd0OyAmbHQ7dXJsJmd0OzwvZW0+PGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IEJhc2U8YnI+Ci08c3Ryb25nPk1vZHVsZTo8L3N0cm9uZz4gbW9kX3Byb3h5PGJyPgotPHN0cm9uZz5Db21wYXRpYmlsaXR5Ojwvc3Ryb25nPiBQcm94eVBhc3MgaXMgb25seSBhdmFpbGFibGUgaW4KLUFwYWNoZSAxLjEgYW5kIGxhdGVyLjxwPgotCi1UaGlzIGRpcmVjdGl2ZSBhbGxvd3MgcmVtb3RlIHNlcnZlcnMgdG8gYmUgbWFwcGVkIGludG8gdGhlIHNwYWNlIG9mIHRoZSBsb2NhbAotc2VydmVyOyB0aGUgbG9jYWwgc2VydmVyIGRvZXMgbm90IGFjdCBhcyBhIHByb3h5IGluIHRoZSBjb252ZW50aW9uYWwgc2Vuc2UsCi1idXQgYXBwZWFycyB0byBiZSBhIG1pcnJvciBvZiB0aGUgcmVtb3RlIHNlcnZlci4gJmx0O3BhdGgmZ3Q7IGlzIHRoZSBuYW1lIG9mCi1hIGxvY2FsIHZpcnR1YWwgcGF0aDsgJmx0O3VybCZndDsgaXMgYSBwYXJ0aWFsIFVSTCBmb3IgdGhlIHJlbW90ZSBzZXJ2ZXIuCi0KLVN1cHBvc2UgdGhlIGxvY2FsIHNlcnZlciBoYXMgYWRkcmVzcyBodHRwOi8vd2liYmxlLm9yZzsgdGhlbgotPHByZT4KLSAgIFByb3h5UGFzcyAvbWlycm9yL2ZvbyBodHRwOi8vZm9vLmNvbQotPC9wcmU+Ci1XaWxsIGNhdXNlIGEgbG9jYWwgcmVxdWVzdCBmb3IgdGhlIGh0dHA6Ly93aWJibGUub3JnL21pcnJvci9mb28vYmFyIHRvIGJlCi1pbnRlcm5hbGx5IGNvbnZlcnRlZCBpbnRvIGEgcHJveHkgcmVxdWVzdCB0byBodHRwOi8vZm9vLmNvbS9iYXIKLQotPEEgbmFtZT0iY2FjaGVyb290Ij48aDI+Q2FjaGVSb290PC9oMj48L0E+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gQ2FjaGVSb290IDxlbT4mbHQ7ZGlyZWN0b3J5Jmd0OzwvZW0+PGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IEJhc2U8YnI+Ci08c3Ryb25nPk1vZHVsZTo8L3N0cm9uZz4gbW9kX3Byb3h5PGJyPgotPHN0cm9uZz5Db21wYXRpYmlsaXR5Ojwvc3Ryb25nPiBDYWNoZVJvb3QgaXMgb25seSBhdmFpbGFibGUgaW4KLUFwYWNoZSAxLjEgYW5kIGxhdGVyLjxwPgotCi1TZXRzIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdG8gY29udGFpbiBjYWNoZSBmaWxlczsgdGhpcyBtdXN0IGJlCi13cml0YWJsZQotYnkgdGhlIGh0dHBkIHNlcnZlci4KLQotPEEgbmFtZT0iY2FjaGVzaXplIj48aDI+Q2FjaGVTaXplPC9oMj48L0E+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gQ2FjaGVTaXplIDxlbT4mbHQ7c2l6ZSZndDs8L2VtPjxicj4KLTxzdHJvbmc+RGVmYXVsdDo8L3N0cm9uZz4gPGNvZGU+Q2FjaGVTaXplIDU8L2NvZGU+PGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IEJhc2U8YnI+Ci08c3Ryb25nPk1vZHVsZTo8L3N0cm9uZz4gbW9kX3Byb3h5PGJyPgotPHN0cm9uZz5Db21wYXRpYmlsaXR5Ojwvc3Ryb25nPiBDYWNoZVNpemUgaXMgb25seSBhdmFpbGFibGUgaW4KLUFwYWNoZSAxLjEgYW5kIGxhdGVyLjxwPgotCi1TZXRzIHRoZSBkZXNpcmVkIHNwYWNlIHVzYWdlIG9mIHRoZSBjYWNoZSwgaW4gS2IgKDEwMjQgYnl0ZSB1bml0cykuIEFsdGhvdWdoCi11c2FnZSBtYXkgZ3JvdyBhYm92ZSB0aGlzIHNldHRpbmcsIHRoZSBnYXJiYWdlIGNvbGxlY3Rpb24gd2lsbCBkZWxldGUgZmlsZXMKLXVudGlsIHRoZSB1c2FnZSBpcyBhdCBvciBiZWxvdyB0aGlzIHNldHRpbmcuCi0KLTxBIG5hbWU9ImNhY2hlZ2NpbnRlcnZhbCI+PGgyPkNhY2hlR2NJbnRlcnZhbDwvaDI+PC9BPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IENhY2hlR2NJbnRlcnZhbCA8ZW0+Jmx0O3RpbWUmZ3Q7PC9lbT48YnI+Ci08c3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWc8YnI+Ci08c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gQmFzZTxicj4KLTxzdHJvbmc+TW9kdWxlOjwvc3Ryb25nPiBtb2RfcHJveHk8YnI+Ci08c3Ryb25nPkNvbXBhdGliaWxpdHk6PC9zdHJvbmc+IENhY2hlR2NpbnRlcnZhbCBpcyBvbmx5IGF2YWlsYWJsZSBpbgotQXBhY2hlIDEuMSBhbmQgbGF0ZXIuPHA+Ci0KLUNoZWNrIHRoZSBjYWNoZSBldmVyeSAmbHQ7dGltZSZndDsgaG91cnMsIGFuZCBkZWxldGUgZmlsZXMgaWYgdGhlIHNwYWNlCi11c2FnZSBpcyBncmVhdGVyIHRoYW4gdGhhdCBzZXQgYnkgQ2FjaGVTaXplLgotCi08QSBuYW1lPSJjYWNoZW1heGV4cGlyZSI+PGgyPkNhY2hlTWF4RXhwaXJlPC9oMj48L0E+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gQ2FjaGVNYXhFeHBpcmUgPGVtPiZsdDt0aW1lJmd0OzwvZW0+PGJyPgotPHN0cm9uZz5EZWZhdWx0Ojwvc3Ryb25nPiA8L2NvZGU+Q2FjaGVNYXhFeHBpcmUgMjQ8L2NvZGU+PGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IEJhc2U8YnI+Ci08c3Ryb25nPk1vZHVsZTo8L3N0cm9uZz4gbW9kX3Byb3h5PGJyPgotPHN0cm9uZz5Db21wYXRpYmlsaXR5Ojwvc3Ryb25nPiBDYWNoZU1heEV4cGlyZSBpcyBvbmx5IGF2YWlsYWJsZSBpbgotQXBhY2hlIDEuMSBhbmQgbGF0ZXIuPHA+Ci0KLUNhY2hhYmxlIEhUVFAgZG9jdW1lbnRzIHdpbGwgYmUgcmV0YWluZWQgZm9yIGF0IG1vc3QgJmx0O3RpbWUmZ3Q7IGhvdXJzIHdpdGhvdXQKLWNoZWNraW5nIHRoZSBvcmlnaW4gc2VydmVyLiBUaHVzIGRvY3VtZW50cyBjYW4gYmUgYXQgbW9zdCAmbHQ7dGltZSZndDsKLWhvdXJzIG91dCBvZiBkYXRlLiBUaGlzIHJlc3RyaWN0aW9uIGlzIGVuZm9yY2VkIGV2ZW4gaWYgYW4gZXhwaXJ5IGRhdGUKLXdhcyBzdXBwbGllZCB3aXRoIHRoZSBkb2N1bWVudC4KLQotPEEgbmFtZT0iY2FjaGVsYXN0bW9kaWZpZWRmYWN0b3IiPjxoMj5DYWNoZUxhc3RNb2RpZmllZEZhY3RvcjwvaDI+PC9BPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IENhY2hlTGFzdE1vZGlmaWVkRmFjdG9yIDxlbT4mbHQ7ZmFjdG9yJmd0OzwvZW0+PGJyPgotPHN0cm9uZz5EZWZhdWx0Ojwvc3Ryb25nPiA8L2NvZGU+Q2FjaGVMYXN0TW9kaWZpZWRGYWN0b3IgMC4xPC9jb2RlPjxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZzxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBCYXNlPGJyPgotPHN0cm9uZz5Nb2R1bGU6PC9zdHJvbmc+IG1vZF9wcm94eTxicj4KLTxzdHJvbmc+Q29tcGF0aWJpbGl0eTo8L3N0cm9uZz4gQ2FjaGVMYXN0TW9kaWZpZWQgaXMgb25seSBhdmFpbGFibGUgaW4KLUFwYWNoZSAxLjEgYW5kIGxhdGVyLjxwPgotCi1JZiB0aGUgb3JpZ2luIEhUVFAgc2VydmVyIGRpZCBub3Qgc3VwcGx5IGFuIGV4cGlyeSBkYXRlIGZvciB0aGUKLWRvY3VtZW50LCB0aGVuIGVzdGltYXRlIG9uIHVzaW5nIHRoZSBmb3JtdWxhCi08cHJlPgotICBleHBpcnktcGVyaW9kID0gdGltZS1zaW5jZS1sYXN0LW1vZGlmaWNhdGlvbiAqICZsdDtmYWN0b3ImZ3Q7Ci08L3ByZT4KLUZvciBleGFtcGxlLCBpZiB0aGUgZG9jdW1lbnQgd2FzIGxhc3QgbW9kaWZpZWQgMTAgaG91cnMgYWdvLCBhbmQKLSZsdDtmYWN0b3ImZ3Q7IGlzIDAuMSwgdGhlbiB0aGUgZXhwaXJ5IHBlcmlvZCB3aWwgYmUgc2V0IHRvIDEwKjAuMSA9IDEgaG91ci4KLQotPHA+SWYgdGhlIGV4cGlyeS1wZXJpb2Qgd291bGQgYmUgbG9uZ2VyIHRoYW4gdGhhdCBzZXQgYnkgQ2FjaGVNYXhFeHBpcmUsCi10aGVuIHRoZSBsYXR0ZXIgdGFrZXMgcHJlY2VkZW5jZS4KLQotPEEgbmFtZT0iY2FjaGVkZWZhdWx0ZXhwaXJlIj48aDI+Q2FjaGVEZWZhdWx0RXhwaXJlPC9oMj48L0E+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gQ2FjaGVEZWZhdWx0RXhwaXJlIDxlbT4mbHQ7dGltZSZndDs8L2VtPjxicj4KLTxzdHJvbmc+RGVmYXVsdDo8L3N0cm9uZz4gPC9jb2RlPkNhY2hlRGVmYXVsdEV4cGlyZSAxPC9jb2RlPjxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZzxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBCYXNlPGJyPgotPHN0cm9uZz5Nb2R1bGU6PC9zdHJvbmc+IG1vZF9wcm94eTxicj4KLTxzdHJvbmc+Q29tcGF0aWJpbGl0eTo8L3N0cm9uZz4gQ2FjaGVEZWZhdWx0RXhwaXJlIGlzIG9ubHkgYXZhaWxhYmxlIGluCi1BcGFjaGUgMS4xIGFuZCBsYXRlci48cD4KLQotSWYgdGhlIGRvY3VtZW50IGlzIGZldGNoZWQgdmlhIGEgcHJvdG9jb2wgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IGV4cGlyeXRpbWVzLAotdGhlbiB1c2UgJmx0O3RpbWUmZ3Q7IGFzIHRoZSBleHBpcnkgdGltZS4KLTxhIGhyZWY9IiNjYWNoZW1heGV4cGlyZSI+Q2FjaGVNYXhFeHBpcmU8L2E+IGRvZXMgPHN0cm9uZz5ub3Q8L3N0cm9uZz4KLW92ZXJyaWRlLgotCi08QSBuYW1lPSJub2NhY2hlIj48aDI+Tm9DYWNoZTwvaDI+PC9BPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IE5vQ2FjaGUgPGVtPiZsdDtob3N0L2RvbWFpbiBsaXN0Jmd0OzwvZW0+PGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnPGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IEJhc2U8YnI+Ci08c3Ryb25nPk1vZHVsZTo8L3N0cm9uZz4gbW9kX3Byb3h5PGJyPgotPHN0cm9uZz5Db21wYXRpYmlsaXR5Ojwvc3Ryb25nPiBOb0NhY2hlIGlzIG9ubHkgYXZhaWxhYmxlIGluCi1BcGFjaGUgMS4xIGFuZCBsYXRlci48cD4KLQotVGhlIE5vQ2FjaGUgZGlyZWN0aXZlIHNwZWNpZmllcyBhIGxpc3Qgb2YgaG9zdHMgYW5kL29yIGRvbWFpbnMsIHNlcGFyYXRlZAotYnkgc3BhY2VzLiBIVFRQIGRvY3VtZW50cyBmcm9tIGhvc3RzIG9yIGRvbWFpbnMgaW4gdGhlIGxpc3QgYXJlIDxlbT5ub3Q8L2VtPgotY2FjaGVkIGJ5IHRoZSBwcm94eSBzZXJ2ZXIuIEV4YW1wbGU6Ci0KLTxwcmU+Ci0gIE5vQ2FjaGUgam9lcy5nYXJhZ2UuY29tIHNvbWUuaG9zdC5jby51ayB3b3RzYW1hdHRhdS5lZHUKLTwvcHJlPgotCi08cD48aHI+Ci0KLTxBIEhSRUY9Ii4uLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfaG9tZS5naWYiIEFMVD0iSG9tZSI+PC9BPgotPEEgSFJFRj0iLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2luZGV4LmdpZiIgQUxUPSJJbmRleCI+PC9BPgotCi08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfcHJveHkueG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9wcm94eS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZDc1NTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9wcm94eS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgbW9kdWxlc3lub3BzaXMgU1lTVEVNICIuLi9zdHlsZS9tb2R1bGVzeW5vcHNpcy5kdGQiPgotPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iLi4vc3R5bGUvbWFudWFsLnhzbCI/PgotPG1vZHVsZXN5bm9wc2lzPgotCi08bmFtZT5tb2RfcHJveHk8L25hbWU+Ci08ZGVzY3JpcHRpb24+SFRUUC8xLjEgcHJveHkvZ2F0ZXdheSBzZXJ2ZXI8L2Rlc2NyaXB0aW9uPgotPHN0YXR1cz5FeHRlbnNpb248L3N0YXR1cz4KLTxzb3VyY2VmaWxlPm1vZF9wcm94eS5jPC9zb3VyY2VmaWxlPgotPGlkZW50aWZpZXI+cHJveHlfbW9kdWxlPC9pZGVudGlmaWVyPgotCi08c3VtbWFyeT4KLTxub3RlIHR5cGU9Indhcm5pbmciPjx0aXRsZT5XYXJuaW5nPC90aXRsZT4KLVRoaXMgZG9jdW1lbnQgaGFzIGJlZW4gdXBkYXRlZCB0byB0YWtlIGludG8gYWNjb3VudCBjaGFuZ2VzCi1tYWRlIGluIHRoZSAyLjAgdmVyc2lvbiBvZiB0aGUgQXBhY2hlIEhUVFAgU2VydmVyLiAgU29tZSBvZiB0aGUKLWluZm9ybWF0aW9uIG1heSBzdGlsbCBiZSBpbmFjY3VyYXRlLCBwbGVhc2UgdXNlIGl0Ci13aXRoIGNhcmUuCi08L25vdGU+Ci0KLTxwPlRoaXMgbW9kdWxlIGltcGxlbWVudHMgYSBwcm94eS9nYXRld2F5IGZvciBBcGFjaGUuIEl0IGltcGxlbWVudHMKLXByb3h5aW5nIGNhcGFiaWxpdHkgZm9yCi08Y29kZT5GVFA8L2NvZGU+LAotPGNvZGU+Q09OTkVDVDwvY29kZT4gKGZvciBTU0wpLAotPGNvZGU+SFRUUC8wLjk8L2NvZGU+LAotPGNvZGU+SFRUUC8xLjA8L2NvZGU+LCBhbmQKLTxjb2RlPkhUVFAvMS4xPC9jb2RlPi4KLVRoZSBtb2R1bGUgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gY29ubmVjdCB0byBvdGhlciBwcm94eSBtb2R1bGVzIGZvciB0aGVzZQotYW5kIG90aGVyIHByb3RvY29scy48L3A+Ci0KLTxwPlRoaXMgbW9kdWxlIHdhcyBleHBlcmltZW50YWwgaW4gQXBhY2hlIDEuMS54LiBJbXByb3ZlbWVudHMgYW5kIGJ1Z2ZpeGVzCi13ZXJlIG1hZGUgaW4gQXBhY2hlIHYxLjIueCBhbmQgQXBhY2hlIHYxLjMueCwgdGhlbiB0aGUgbW9kdWxlIHVuZGVyd2VudCBhIG1ham9yCi1vdmVyaGF1bCBmb3IgQXBhY2hlIHYyLjAuIFRoZSBwcm90b2NvbCBzdXBwb3J0IHdhcyB1cGdyYWRlZCB0byBIVFRQLzEuMSwKLWFuZCBmaWx0ZXIgc3VwcG9ydCB3YXMgZW5hYmxlZC48L3A+Ci0KLTxwPlBsZWFzZSBub3RlIHRoYXQgdGhlIDxzdHJvbmc+Y2FjaGluZzwvc3Ryb25nPiBmdW5jdGlvbiBwcmVzZW50IGluCi1tb2RfcHJveHkgdXAgdG8gQXBhY2hlIHYxLjMueCBoYXMgYmVlbiA8c3Ryb25nPnJlbW92ZWQ8L3N0cm9uZz4gZnJvbQotbW9kX3Byb3h5IGFuZCB3aWxsIGJlIGluY29ycG9yYXRlZCBpbnRvIGEgbmV3IG1vZHVsZSwgbW9kX2NhY2hlLjwvcD4KLTwvc3VtbWFyeT4KLQotPHNlY3Rpb24gaWQ9ImNvbmZpZ3MiPjx0aXRsZT5Db21tb24gY29uZmlndXJhdGlvbiB0b3BpY3M8L3RpdGxlPgotCi08dWw+Ci08bGk+PGEgaHJlZj0iI2ZvcndhcmRyZXZlcnNlIj5Gb3J3YXJkIGFuZCBSZXZlcnNlIFByb3hpZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjYWNjZXNzIj5Db250cm9sbGluZyBhY2Nlc3MgdG8geW91ciBwcm94eTwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNzaG9ydG5hbWUiPlVzaW5nIE5ldHNjYXBlIGhvc3RuYW1lIHNob3J0Y3V0czwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNtaW1ldHlwZXMiPldoeSBkb2Vzbid0IGZpbGUgdHlwZSA8ZW0+eHh4PC9lbT4gZG93bmxvYWQgdmlhIEZUUD88L2E+PC9saT4KLTxsaT48YSBocmVmPSIjdHlwZSI+SG93IGNhbiBJIGZvcmNlIGFuIEZUUCBBU0NJSSBkb3dubG9hZCBvZiBGaWxlIDxlbT54eHg8L2VtPj88L2E+PC9saT4KLTxsaT48YSBocmVmPSIjcGVyY2VudDJmaGFjayI+SG93IGNhbiBJIGFjY2VzcyBGVFAgZmlsZXMgb3V0c2lkZSBvZiBteSBob21lIGRpcmVjdG9yeT88L2E+PC9saT4KLTxsaT48YSBocmVmPSIjZnRwcGFzcyI+SG93IGNhbiBJIGhpZGUgdGhlIEZUUCBjbGVhcnRleHQgcGFzc3dvcmQgaW4gbXkgYnJvd3NlcidzIFVSTCBsaW5lPzwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNzdGFydHVwIj5XaHkgZG9lcyBBcGFjaGUgc3RhcnQgbW9yZSBzbG93bHkgd2hlbiB1c2luZyB0aGUKLSAgICAgICAgcHJveHkgbW9kdWxlPzwvYT48L2xpPgotPCEtLTxsaT48YSBocmVmPSIjc29ja3MiPkNhbiBJIHVzZSB0aGUgQXBhY2hlIHByb3h5IG1vZHVsZSB3aXRoIG15IFNPQ0tTIHByb3h5PzwvYT4tLT4KLTxsaT48YSBocmVmPSIjaW50cmFuZXQiPldoYXQgb3RoZXIgZnVuY3Rpb25zIGFyZSB1c2VmdWwgZm9yIGFuIGludHJhbmV0IHByb3h5IHNlcnZlcj88L2E+PC9saT4KLTwvdWw+Ci0KLTxzZWN0aW9uIGlkPSJmb3J3YXJkcmV2ZXJzZSI+PHRpdGxlPkZvcndhcmQgYW5kIFJldmVyc2UgUHJveGllczwvdGl0bGU+Ci0KLTxwPkFwYWNoZSBjYW4gYmUgY29uZmlndXJlZCBpbiBib3RoIGEgPGVtPmZvcndhcmQ8L2VtPiBhbmQgPGVtPnJldmVyc2U8L2VtPgotcHJveHkgY29uZmlndXJhdGlvbi48L3A+Ci0KLTxwPkEgPGVtPmZvcndhcmQgcHJveHk8L2VtPiBpcyBhbiBpbnRlcm1lZGlhdGUgc3lzdGVtIHRoYXQgZW5hYmxlcyBhIGJyb3dzZXIgdG8gY29ubmVjdCB0byBhCi1yZW1vdGUgbmV0d29yayB0byB3aGljaCBpdCBub3JtYWxseSBkb2VzIG5vdCBoYXZlIGFjY2Vzcy4gQSBmb3J3YXJkIHByb3h5Ci1jYW4gYWxzbyBiZSB1c2VkIHRvIGNhY2hlIGRhdGEsIHJlZHVjaW5nIGxvYWQgb24gdGhlIG5ldHdvcmtzIGJldHdlZW4gdGhlCi1mb3J3YXJkIHByb3h5IGFuZCB0aGUgcmVtb3RlIHdlYnNlcnZlci48L3A+Ci0KLTxwPkFwYWNoZSdzIG1vZF9wcm94eSBjYW4gYmUgZmlndXJlZCB0byBiZWhhdmUgbGlrZSBhIGZvcndhcmQgcHJveHkKLXVzaW5nIHRoZSA8ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX3Byb3h5Ij5Qcm94eVJlbW90ZTwvZGlyZWN0aXZlPgotZGlyZWN0aXZlLiBJbiBhZGRpdGlvbiwgY2FjaGluZyBvZiBkYXRhIGNhbiBiZSBhY2hpZXZlZCBieSBjb25maWd1cmluZwotQXBhY2hlIDxtb2R1bGU+bW9kX2NhY2hlPC9tb2R1bGU+LiBPdGhlciBkZWRpY2F0ZWQgZm9yd2FyZCBwcm94eQotcGFja2FnZXMgaW5jbHVkZSA8YSBocmVmPSJodHRwOi8vd3d3LnNxdWlkLm9yZyI+U3F1aWQ8L2E+LjwvcD4KLQotPHA+QSA8ZW0+cmV2ZXJzZSBwcm94eTwvZW0+IGlzIGEgd2Vic2VydmVyIHN5c3RlbSB0aGF0IGlzIGNhcGFibGUgb2Ygc2VydmluZyB3ZWJwYWdlcwotc291cmNlZCBmcm9tIG90aGVyIHdlYnNlcnZlcnMgLSBpbiBhZGRpdGlvbiB0byB3ZWJwYWdlcyBvbiBkaXNrIG9yIGdlbmVyYXRlZAotZHluYW1pY2FsbHkgYnkgQ0dJIC0gbWFraW5nIHRoZXNlIHBhZ2VzIGxvb2sgbGlrZSB0aGV5IG9yaWdpbmF0ZWQgYXQgdGhlCi1yZXZlcnNlIHByb3h5LjwvcD4KLQotPHA+V2hlbiBjb25maWd1cmVkIHdpdGggdGhlIG1vZF9jYWNoZSBtb2R1bGUgdGhlIHJldmVyc2UKLXByb3h5IGNhbiBhY3QgYXMgYSBjYWNoZSBmb3Igc2xvd2VyIGJhY2tlbmQgd2Vic2VydmVycy4gVGhlIHJldmVyc2UgcHJveHkKLWNhbiBhbHNvIGVuYWJsZSBhZHZhbmNlZCBVUkwgc3RyYXRlZ2llcyBhbmQgbWFuYWdlbWVudCB0ZWNobmlxdWVzLCBhbGxvd2luZwotd2VicGFnZXMgc2VydmVkIHVzaW5nIGRpZmZlcmVudCB3ZWJzZXJ2ZXIgc3lzdGVtcyBvciBhcmNoaXRlY3R1cmVzIHRvCi1jb2V4aXN0IGluc2lkZSB0aGUgc2FtZSBVUkwgc3BhY2UuIFJldmVyc2UgcHJveHkgc3lzdGVtcyBhcmUgYWxzbyBpZGVhbCBmb3IKLWltcGxlbWVudGluZyBjZW50cmFsaXNlZCBsb2dnaW5nIHdlYnNpdGVzIHdpdGggbWFueSBvciBkaXZlcnNlIHdlYnNpdGUKLWJhY2tlbmRzLiBDb21wbGV4IG11bHRpLXRpZXIgd2Vic2VydmVyIHN5c3RlbXMgY2FuIGJlIGNvbnN0cnVjdGVkIHVzaW5nIGFuCi1BcGFjaGUgbW9kX3Byb3h5IGZyb250ZW5kIGFuZCBhbnkgbnVtYmVyIG9mIGJhY2tlbmQgd2Vic2VydmVycy48L3A+Ci0KLTxwPlRoZSByZXZlcnNlIHByb3h5IGlzIGNvbmZpZ3VyZWQgdXNpbmcgdGhlCi08ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX3Byb3h5Ij5Qcm94eVBhc3M8L2RpcmVjdGl2ZT4gYW5kIDxkaXJlY3RpdmUKLW1vZHVsZT0ibW9kX3Byb3h5Ij5Qcm94eVBhc3NSZXZlcnNlPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZXMuIENhY2hpbmcgY2FuIGJlCi1lbmFibGVkIHVzaW5nIG1vZF9jYWNoZSBhcyB3aXRoIHRoZSBmb3J3YXJkIHByb3h5LjwvcD4KLQotPC9zZWN0aW9uPgotCi08c2VjdGlvbiBpZD0iYWNjZXNzIj48dGl0bGU+Q29udHJvbGxpbmcgYWNjZXNzIHRvIHlvdXIgcHJveHk8L3RpdGxlPgotCi08cD5Zb3UgY2FuIGNvbnRyb2wgd2hvIGNhbiBhY2Nlc3MgeW91ciBwcm94eSB2aWEgdGhlIG5vcm1hbCA8ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSIgdHlwZT0ic2VjdGlvbiI+RGlyZWN0b3J5PC9kaXJlY3RpdmU+Ci1jb250cm9sIGJsb2NrIHVzaW5nIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTo8L3A+Ci0KLTxleGFtcGxlPgotJmx0O0RpcmVjdG9yeSBwcm94eToqJmd0OzxiciAvPgotT3JkZXIgRGVueSxBbGxvdzxiciAvPgotRGVueSBmcm9tIGFsbDxiciAvPgotQWxsb3cgZnJvbSAxOTIuMTY4LjA8YnIgLz4KLSZsdDsvRGlyZWN0b3J5Jmd0OwotPC9leGFtcGxlPgotCi08cD5BIDxkaXJlY3RpdmUgbW9kdWxlPSJjb3JlIiB0eXBlPSJzZWN0aW9uIj5GaWxlczwvZGlyZWN0aXZlPiBibG9jawotd2lsbCBhbHNvIHdvcmssIGFuZCBpcyB0aGUgb25seSBtZXRob2Qga25vd24gdG8gd29yayBmb3IgYWxsIHBvc3NpYmxlCi1VUkxzIGluIEFwYWNoZSB2ZXJzaW9ucyBlYXJsaWVyIHRoYW4gMS4yYjEwLjwvcD4KLQotPHA+V2hlbiBjb25maWd1cmluZyBhIHJldmVyc2UgcHJveHksIGFjY2VzcyBjb250cm9sIHRha2VzIG9uIHRoZQotYXR0cmlidXRlcyBvZiB0aGUgbm9ybWFsIHNlcnZlciA8ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSIKLXR5cGU9InNlY3Rpb24iPmRpcmVjdG9yeTwvZGlyZWN0aXZlPiBjb25maWd1cmF0aW9uLjwvcD4KLQotCi08IS0tPGgyPjxhIG5hbWU9InNob3J0bmFtZSI+VXNpbmcgTmV0c2NhcGUgaG9zdG5hbWUgc2hvcnRjdXRzPC9hPjwvaDI+Ci0KLVRoZXJlIGlzIGFuIG9wdGlvbmFsIHBhdGNoIHRvIHRoZSBwcm94eSBtb2R1bGUgdG8gYWxsb3cgTmV0c2NhcGUtbGlrZQotaG9zdG5hbWUgc2hvcnRjdXRzIHRvIGJlIHVzZWQuIEl0J3MgYXZhaWxhYmxlIGZyb20gdGhlCi08YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9jb250cmliL3BhdGNoZXMvMS4yL25ldHNjYXBlaG9zdC5wYXRjaCIKLT48Y29kZT5jb250cmliL3BhdGNoZXMvMS4yPC9jb2RlPjwvYT4gZGlyZWN0b3J5IG9uIHRoZSBBcGFjaGUgV2ViCi1zaXRlLjxwPi0tPgotCi08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uIGlkPSJtaW1ldHlwZXMiPjx0aXRsZT5XaHkgZG9lc24ndCBmaWxlIHR5cGUgPGVtPnh4eDwvZW0+Ci1kb3dubG9hZCB2aWEgRlRQPzwvdGl0bGU+Ci0KLTxwPllvdSBwcm9iYWJseSBkb24ndCBoYXZlIHRoYXQgcGFydGljdWxhciBmaWxlIHR5cGUgZGVmaW5lZCBhcwotPGVtPmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTwvZW0+IGluIHlvdXIgcHJveHkncyBtaW1lLnR5cGVzIGNvbmZpZ3VyYXRpb24KLWZpbGUuIEEgdXNlZnVsIGxpbmUgY2FuIGJlPC9wPgotCi08ZXhhbXBsZT4KLWFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSAgICAgICAgYmluIGRtcyBsaGEgbHpoIGV4ZSBjbGFzcyB0Z3ogdGF6Ci08L2V4YW1wbGU+Ci08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uIGlkPSJ0eXBlIj48dGl0bGU+SG93IGNhbiBJIGZvcmNlIGFuIEZUUCBBU0NJSSBkb3dubG9hZCBvZgotRmlsZSA8ZW0+eHh4PC9lbT4/PC90aXRsZT4KLQotPHA+SW4gdGhlIHJhcmUgc2l0dWF0aW9uIHdoZXJlIHlvdSBtdXN0IGRvd25sb2FkIGEgc3BlY2lmaWMgZmlsZSB1c2luZyB0aGUgRlRQCi08c3Ryb25nPkFTQ0lJPC9zdHJvbmc+IHRyYW5zZmVyIG1ldGhvZCAod2hpbGUgdGhlIGRlZmF1bHQgdHJhbnNmZXIgaXMgaW4KLTxzdHJvbmc+YmluYXJ5PC9zdHJvbmc+IG1vZGUpLCB5b3UgY2FuIG92ZXJyaWRlIG1vZF9wcm94eSdzIGRlZmF1bHQgYnkKLXN1ZmZpeGluZyB0aGUgcmVxdWVzdCB3aXRoIDxjb2RlPjt0eXBlPWE8L2NvZGU+IHRvIGZvcmNlIGFuIEFTQ0lJIHRyYW5zZmVyLgotKEZUUCBEaXJlY3RvcnkgbGlzdGluZ3MgYXJlIGFsd2F5cyBleGVjdXRlZCBpbiBBU0NJSSBtb2RlLCBob3dldmVyLik8L3A+Ci08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uIGlkPSJwZXJjZW50MmZoY2siPjx0aXRsZT5Ib3cgY2FuIEkgYWNjZXNzIEZUUCBmaWxlcyBvdXRzaWRlCi1vZiBteSBob21lIGRpcmVjdG9yeT88L3RpdGxlPgotCi08cD4KLUFuIEZUUCBVUkkgaXMgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIGhvbWUgZGlyZWN0b3J5IG9mIHRoZSB1c2VyCi13aG8gaXMgbG9nZ2luZyBpbi4gQWxhcywgdG8gcmVhY2ggaGlnaGVyIGRpcmVjdG9yeSBsZXZlbHMgeW91IGNhbm5vdAotdXNlIC8uLi8sIGFzIHRoZSBkb3RzIGFyZSBpbnRlcnByZXRlZCBieSB0aGUgYnJvd3NlciBhbmQgbm90IGFjdHVhbGx5Ci1zZW50IHRvIHRoZSBGVFAgc2VydmVyLiBUbyBhZGRyZXNzIHRoaXMgcHJvYmxlbSwgdGhlIHNvIGNhbGxlZCAiU3F1aWQKLSUyZiBoYWNrIiB3YXMgaW1wbGVtZW50ZWQgaW4gdGhlIEFwYWNoZSBGVFAgcHJveHk7IGl0IGlzIGlzIGEgc29sdXRpb24KLXdoaWNoIGlzIGFsc28gdXNlZCBieSBvdGhlciBwb3B1bGFyIHByb3h5IHNlcnZlcnMgbGlrZSB0aGUgPGEKLWhyZWY9Imh0dHA6Ly93d3cuc3F1aWQtY2FjaGUub3JnLyI+U3F1aWQgUHJveHkgQ2FjaGU8L2E+LiAgQnkKLXByZXBlbmRpbmcgLyUyZiB0byB0aGUgcGF0aCBvZiB5b3VyIHJlcXVlc3QsIHlvdSBjYW4gbWFrZSBzdWNoIGEgcHJveHkKLWNoYW5nZSB0aGUgRlRQIHN0YXJ0aW5nIGRpcmVjdG9yeSB0byAvIChpbnN0ZWFkIG9mIHRoZSBob21lCi1kaXJlY3RvcnkpLiA8L3A+IAotCi08cD48c3Ryb25nPkV4YW1wbGU6PC9zdHJvbmc+IFRvIHJldHJpZXZlIHRoZSBmaWxlCi08Y29kZT4vZXRjL21vdGQ8L2NvZGU+LCB5b3Ugd291bGQgdXNlIHRoZSBVUkw8L3A+Ci08ZXhhbXBsZT5mdHA6Ly88ZW0+dXNlckBob3N0PC9lbT4vJTJmL2V0Yy9tb3RkPC9leGFtcGxlPgotPC9zZWN0aW9uPgotCi08c2VjdGlvbiBpZD0iZnRwcGFzcyI+PHRpdGxlPkhvdyBjYW4gSSBoaWRlIHRoZSBGVFAgY2xlYXJ0ZXh0IHBhc3N3b3JkCi1pbiBteSBicm93c2VyJ3MgVVJMIGxpbmU/PC90aXRsZT4KLQotPHA+Ci1UbyBsb2cgaW4gdG8gYW4gRlRQIHNlcnZlciBieSB1c2VybmFtZSBhbmQgcGFzc3dvcmQsIEFwYWNoZQotdXNlcyBkaWZmZXJlbnQgc3RyYXRlZ2llcy4KLUluIGFic2Vuc2Ugb2YgYSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIGluIHRoZSBVUkwgYWx0b2dldGhlciwKLUFwYWNoZSBzZW5kcyBhbiBhbm9teW1vdXMgbG9naW4gdG8gdGhlIEZUUCBzZXJ2ZXIsIGkuZS4sPC9wPgotPGV4YW1wbGU+Ci11c2VyOiBhbm9ueW1vdXM8YnIgLz4KLXBhc3N3b3JkOiBhcGFjaGVfcHJveHlACi08L2V4YW1wbGU+Ci08cD5UaGlzIHdvcmtzIGZvciBhbGwgcG9wdWxhciBGVFAgc2VydmVycyB3aGljaCBhcmUgY29uZmlndXJlZCBmb3IKLWFub255bW91cyBhY2Nlc3MuPC9wPgotCi08cD5Gb3IgYSBwZXJzb25hbCBsb2dpbiB3aXRoIGEgc3BlY2lmaWMgdXNlcm5hbWUsIHlvdSBjYW4gZW1iZWQKLXRoZSB1c2VyIG5hbWUgaW50byB0aGUgVVJMLCBsaWtlIGluOgotPGNvZGU+ZnRwOi8vPGVtPnVzZXJuYW1lQGhvc3Q8L2VtPi9teWZpbGU8L2NvZGU+LiBJZiB0aGUgRlRQIHNlcnZlcgotYXNrcyBmb3IgYSBwYXNzd29yZCB3aGVuIGdpdmVuIHRoaXMgdXNlcm5hbWUgKHdoaWNoIGl0IHNob3VsZCksCi10aGVuIEFwYWNoZSB3aWxsIHJlcGx5IHdpdGggYSBbNDAxIEF1dGhvcml6YXRpb24gcmVxdWlyZWRdIHJlc3BvbnNlLAotd2hpY2ggY2F1c2VzIHRoZSBCcm93c2VyIHRvIHBvcCB1cCB0aGUgdXNlcm5hbWUvcGFzc3dvcmQgZGlhbG9nLgotVXBvbiBlbnRlcmluZyB0aGUgcGFzc3dvcmQsIHRoZSBjb25uZWN0aW9uIGF0dGVtcHQgaXMgcmV0cmllZCwKLWFuZCBpZiBzdWNjZXNzZnVsLCB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGlzIHByZXNlbnRlZC4KLVRoZSBhZHZhbnRhZ2Ugb2YgdGhpcyBwcm9jZWR1cmUgaXMgdGhhdCB5b3VyIGJyb3dzZXIgZG9lcyBub3QKLWRpc3BsYXkgdGhlIHBhc3N3b3JkIGluIGNsZWFydGV4dCAod2hpY2ggaXQgd291bGQgaWYgeW91IGhhZCB1c2VkCi08Y29kZT5mdHA6Ly88ZW0+dXNlcm5hbWU6cGFzc3dvcmRAaG9zdDwvZW0+L215ZmlsZTwvY29kZT4gaW4KLXRoZSBmaXJzdCBwbGFjZSkuPC9wPgotCi08bm90ZT48dGl0bGU+Tm90ZTwvdGl0bGU+Ci1UaGUgcGFzc3dvcmQgd2hpY2ggaXMgdHJhbnNtaXR0ZWQgaW4gc3VjaCBhIHdheQotaXMgbm90IGVuY3J5cHRlZCBvbiBpdHMgd2F5LiBJdCB0cmF2ZWxzIGJldHdlZW4geW91ciBicm93c2VyIGFuZAotdGhlIEFwYWNoZSBwcm94eSBzZXJ2ZXIgaW4gYSBiYXNlNjQtZW5jb2RlZCBjbGVhcnRleHQgc3RyaW5nLCBhbmQKLWJldHdlZW4gdGhlIEFwYWNoZSBwcm94eSBhbmQgdGhlIEZUUCBzZXJ2ZXIgYXMgcGxhaW50ZXh0LiBZb3Ugc2hvdWxkCi10aGVyZWZvcmUgdGhpbmsgdHdpY2UgYmVmb3JlIGFjY2Vzc2luZyB5b3VyIEZUUCBzZXJ2ZXIgdmlhIEhUVFAKLShvciBiZWZvcmUgYWNjZXNzaW5nIHlvdXIgcGVyc29uYWwgZmlsZXMgdmlhIEZUUCBhdCBhbGwhKSBXaGVuCi11c2luZyB1bnNlY3VyZSBjaGFubmVscywgYW4gZWF2ZXNkcm9wcGVyIG1pZ2h0IGludGVyY2VwdCB5b3VyCi1wYXNzd29yZCBvbiBpdHMgd2F5LgotPC9ub3RlPgotPC9zZWN0aW9uPgotCi08c2VjdGlvbiBpZD0ic3RhcnR1cCI+PHRpdGxlPldoeSBkb2VzIEFwYWNoZSBzdGFydCBtb3JlIHNsb3dseSB3aGVuCi11c2luZyB0aGUgcHJveHkgbW9kdWxlPzwvdGl0bGU+Ci0KLTxwPklmIHlvdSdyZSB1c2luZyB0aGUgPGRpcmVjdGl2ZSBtb2R1bGU9Im1vZF9wcm94eSI+UHJveHlCbG9jazwvZGlyZWN0aXZlPgotZGlyZWN0aXZlLCBob3N0bmFtZXMnIElQIGFkZHJlc3NlcyBhcmUgbG9va2VkIHVwIGFuZCBjYWNoZWQgZHVyaW5nCi1zdGFydHVwIGZvciBsYXRlciBtYXRjaCB0ZXN0LiBUaGlzIG1heSB0YWtlIGEgZmV3IHNlY29uZHMgKG9yIG1vcmUpCi1kZXBlbmRpbmcgb24gdGhlIHNwZWVkIHdpdGggd2hpY2ggdGhlIGhvc3RuYW1lIGxvb2t1cHMgb2NjdXIuPC9wPgotPC9zZWN0aW9uPgotCi08IS0tPGgyPjxhIG5hbWU9InNvY2tzIj5DYW4gSSB1c2UgdGhlIEFwYWNoZSBwcm94eSBtb2R1bGUgd2l0aCBteSBTT0NLUyBwcm94eT88L2E+PC9oMj4KLQotWWVzLiBKdXN0IGJ1aWxkIEFwYWNoZSB3aXRoIHRoZSBydWxlIDxjb2RlPlNPQ0tTND15ZXM8L2NvZGU+IGluIHlvdXIKLTxlbT5Db25maWd1cmF0aW9uPC9lbT4gZmlsZSwgYW5kIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIHRoZXJlLiBTT0NLUzUKLWNhcGFiaWxpdHkgY2FuIGJlIGFkZGVkIGluIGEgc2ltaWxhciB3YXkgKHRoZXJlJ3Mgbm8gPGNvZGU+U09DS1M1PC9jb2RlPgotcnVsZSB5ZXQpLCBzbyB1c2UgdGhlIDxjb2RlPkVYVFJBX0xERkxBR1M8L2NvZGU+IGRlZmluaXRpb24sIG9yIGJ1aWxkIEFwYWNoZQotbm9ybWFsbHkgYW5kIHJ1biBpdCB3aXRoIHRoZSA8ZW0+cnVuc29ja3M8L2VtPiB3cmFwcGVyIHByb3ZpZGVkIHdpdGggU09DS1M1LAotaWYgeW91ciBPUyBzdXBwb3J0cyBkeW5hbWljYWxseSBsaW5rZWQgbGlicmFyaWVzLjxwPgotCi1Tb21lIHVzZXJzIGhhdmUgcmVwb3J0ZWQgcHJvYmxlbXMgd2hlbiB1c2luZyBTT0NLUyB2ZXJzaW9uIDQuMiBvbiBTb2xhcmlzLgotVGhlIHByb2JsZW0gd2FzIHNvbHZlZCBieSB1cGdyYWRpbmcgdG8gU09DS1MgNC4zLjxwPgotCi1SZW1lbWJlciB0aGF0IHlvdSdsbCBhbHNvIGhhdmUgdG8gZ3JhbnQgYWNjZXNzIHRvIHlvdXIgQXBhY2hlIHByb3h5IG1hY2hpbmUgYnkKLXBlcm1pdHRpbmcgY29ubmVjdGlvbnMgb24gdGhlIGFwcHJvcHJpYXRlIHBvcnRzIGluIHlvdXIgU09DS1MgZGFlbW9uJ3MKLWNvbmZpZ3VyYXRpb24uPHA+Ci0tLT4KLQotPHNlY3Rpb24gaWQ9ImludHJhbmV0Ij48dGl0bGU+V2hhdCBvdGhlciBmdW5jdGlvbnMgYXJlIHVzZWZ1bCBmb3IgYW4KLWludHJhbmV0IHByb3h5IHNlcnZlcj88L3RpdGxlPgotCi08cD5BbiBBcGFjaGUgcHJveHkgc2VydmVyIHNpdHVhdGVkIGluIGFuIGludHJhbmV0IG5lZWRzIHRvIGZvcndhcmQKLWV4dGVybmFsIHJlcXVlc3RzIHRocm91Z2ggdGhlIGNvbXBhbnkncyBmaXJld2FsbC4gSG93ZXZlciwgd2hlbiBpdCBoYXMKLXRvIGFjY2VzcyByZXNvdXJjZXMgd2l0aGluIHRoZSBpbnRyYW5ldCwgaXQgY2FuIGJ5cGFzcyB0aGUgZmlyZXdhbGwKLXdoZW4gYWNjZXNzaW5nIGhvc3RzLiBUaGUgPGRpcmVjdGl2ZQotbW9kdWxlPSJtb2RfcHJveHkiPk5vUHJveHk8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIGlzIHVzZWZ1bCBmb3IKLXNwZWNpZnlpbmcgd2hpY2ggaG9zdHMgYmVsb25nIHRvIHRoZSBpbnRyYW5ldCBhbmQgc2hvdWxkIGJlIGFjY2Vzc2VkCi1kaXJlY3RseS48L3A+Ci0KLTxwPlVzZXJzIHdpdGhpbiBhbiBpbnRyYW5ldCB0ZW5kIHRvIG9taXQgdGhlIGxvY2FsIGRvbWFpbiBuYW1lIGZyb20gdGhlaXIKLVdXVyByZXF1ZXN0cywgdGh1cyByZXF1ZXN0aW5nICJodHRwOi8vc29tZWhvc3QvIiBpbnN0ZWFkIG9mCi0iaHR0cDovL3NvbWVob3N0Lm15LmRvbS5haW4vIi4gU29tZSBjb21tZXJjaWFsIHByb3h5IHNlcnZlcnMgbGV0IHRoZW0gZ2V0Ci1hd2F5IHdpdGggdGhpcyBhbmQgc2ltcGx5IHNlcnZlIHRoZSByZXF1ZXN0LCBpbXBseWluZyBhIGNvbmZpZ3VyZWQKLWxvY2FsIGRvbWFpbi4gV2hlbiB0aGUgPGRpcmVjdGl2ZSBtb2R1bGU9Im1vZF9wcm94eSI+UHJveHlEb21haW48L2RpcmVjdGl2ZT4gZGlyZWN0aXZlCi1pcyB1c2VkIGFuZCB0aGUgc2VydmVyIGlzIDxhIGhyZWY9IiNwcm94eXJlcXVlc3RzIj5jb25maWd1cmVkIGZvcgotcHJveHkgc2VydmljZTwvYT4sIEFwYWNoZSBjYW4gcmV0dXJuIGEgcmVkaXJlY3QgcmVzcG9uc2UgYW5kIHNlbmQgdGhlIGNsaWVudAotdG8gdGhlIGNvcnJlY3QsIGZ1bGx5IHF1YWxpZmllZCwgc2VydmVyIGFkZHJlc3MuIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBtZXRob2QKLXNpbmNlIHRoZSB1c2VyJ3MgYm9va21hcmsgZmlsZXMgd2lsbCB0aGVuIGNvbnRhaW4gZnVsbHkgcXVhbGlmaWVkIGhvc3RzLjwvcD4KLTwvc2VjdGlvbj4KLQotPC9zZWN0aW9uPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5Qcm94eVByZXNlcnZlSG9zdDwvbmFtZT4KLTxzeW50YXg+UHJveHlQcmVzZXJ2ZUhvc3Qgb258b2ZmPC9zeW50YXg+Ci08ZGVmYXVsdD5Qcm94eVByZXNlcnZlSG9zdCBPZmY8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08Y29tcGF0aWJpbGl0eT5BdmFpbGFibGUgaW4KLUFwYWNoZSAyLjAuMzEgYW5kIGxhdGVyLjwvY29tcGF0aWJpbGl0eT4KLQotPHVzYWdlPgotPHA+V2hlbiBlbmFibGVkLCB0aGlzIG9wdGlvbiB3aWxsIHBhc3MgdGhlIEhvc3Q6IGxpbmUgZnJvbSB0aGUKLWluY29taW5nIHJlcXVlc3QgdG8gdGhlIHByb3hpZWQgaG9zdCwgaW5zdGVhZCBvZiB0aGUgaG9zdG5hbWUKLXNwZWNpZmllZCBpbiB0aGUgcHJveHlwYXNzIGxpbmUuCi08L3A+Ci08cD5UaGlzIG9wdGlvbiBzaG91bGQgbm9ybWFsbHkgYmUgdHVybmVkICdvZmYnLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5Qcm94eVJlcXVlc3RzPC9uYW1lPgotPHN5bnRheD5Qcm94eVJlcXVlc3RzIG9ufG9mZjwvc3ludGF4PgotPGRlZmF1bHQ+UHJveHlSZXF1ZXN0cyBPZmY8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLTxwPlRoaXMgYWxsb3dzIG9yIHByZXZlbnRzIEFwYWNoZSBmcm9tIGZ1bmN0aW9uaW5nIGFzIGEgZm9yd2FyZCBwcm94eQotc2VydmVyLiAoU2V0dGluZyBQcm94eVJlcXVlc3RzIHRvICdvZmYnIGRvZXMgbm90IGRpc2FibGUgdXNlIG9mIHRoZSAKLTxkaXJlY3RpdmUgbW9kdWxlPSJtb2RfcHJveHkiPlByb3h5UGFzczwvZGlyZWN0aXZlPiBkaXJlY3RpdmUuKTwvcD4KLQotPHA+SW4gYSB0eXBpY2FsIHJldmVyc2UgcHJveHkgY29uZmlndXJhdGlvbiwgdGhpcyBvcHRpb24gc2hvdWxkIGJlIHNldCB0bwotJ29mZicuPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlByb3h5UmVtb3RlPC9uYW1lPgotPHN5bnRheD5Qcm94eVJlbW90ZSA8ZW0+bWF0Y2ggcmVtb3RlLXNlcnZlcjwvZW0+PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLTxwPlRoaXMgZGVmaW5lcyByZW1vdGUgcHJveGllcyB0byB0aGlzIHByb3h5LiA8ZW0+bWF0Y2g8L2VtPiBpcyBlaXRoZXIgdGhlCi1uYW1lIG9mIGEgVVJMLXNjaGVtZSB0aGF0IHRoZSByZW1vdGUgc2VydmVyIHN1cHBvcnRzLCBvciBhIHBhcnRpYWwgVVJMCi1mb3Igd2hpY2ggdGhlIHJlbW90ZSBzZXJ2ZXIgc2hvdWxkIGJlIHVzZWQsIG9yICcqJyB0byBpbmRpY2F0ZSB0aGUKLXNlcnZlciBzaG91bGQgYmUgY29udGFjdGVkIGZvciBhbGwgcmVxdWVzdHMuIDxlbT5yZW1vdGUtc2VydmVyPC9lbT4gaXMgYQotcGFydGlhbCBVUkwgZm9yIHRoZSByZW1vdGUgc2VydmVyLiBTeW50YXg6PC9wPgotCi08cHJlPgotICByZW1vdGUtc2VydmVyID0gcHJvdG9jb2w6Ly9ob3N0bmFtZVs6cG9ydF0KLTwvcHJlPgotCi08cD48ZW0+cHJvdG9jb2w8L2VtPiBpcyB0aGUgcHJvdG9jb2wgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBjb21tdW5pY2F0ZQotd2l0aCB0aGUgcmVtb3RlIHNlcnZlcjsgb25seSAiaHR0cCIgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgbW9kdWxlLjwvcD4KLQotPHA+Ci1FeGFtcGxlOjwvcD4KLTxleGFtcGxlPgotICBQcm94eVJlbW90ZSBodHRwOi8vZ29vZGd1eXMuY29tLyBodHRwOi8vbWlycm9yZ3V5cy5jb206ODAwMDxiciAvPgotICBQcm94eVJlbW90ZSAqIGh0dHA6Ly9jbGV2ZXJzaXRlLmNvbTxiciAvPgotICBQcm94eVJlbW90ZSBmdHAgaHR0cDovL2Z0cHByb3h5Lm15ZG9tYWluLmNvbTo4MDgwCi08L2V4YW1wbGU+Ci0KLTxwPkluIHRoZSBsYXN0IGV4YW1wbGUsIHRoZSBwcm94eSB3aWxsIGZvcndhcmQgRlRQIHJlcXVlc3RzLCBlbmNhcHN1bGF0ZWQKLWFzIHlldCBhbm90aGVyIEhUVFAgcHJveHkgcmVxdWVzdCwgdG8gYW5vdGhlciBwcm94eSB3aGljaCBjYW4gaGFuZGxlCi10aGVtLjwvcD4KLQotPHA+VGhpcyBvcHRpb24gYWxzbyBzdXBwb3J0cyByZXZlcnNlIHByb3h5IGNvbmZpZ3VyYXRpb24gLSBhIGJhY2tlbmQKLXdlYnNlcnZlciBjYW4gYmUgZW1iZWRkZWQgd2l0aGluIGEgdmlydHVhbGhvc3QgVVJMIHNwYWNlIGV2ZW4gaWYgdGhhdAotc2VydmVyIGlzIGhpZGRlbiBieSBhbm90aGVyIGZvcndhcmQgcHJveHkuPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlByb3h5UGFzczwvbmFtZT4KLTxzeW50YXg+UHJveHlQYXNzIFs8ZW0+cGF0aDwvZW0+XSAhfDxlbT51cmw8L2VtPjwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+Ci08Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci08IS0tIFhYWDogTmVlZCB0byBkb2N1bWVudCB0aGF0IHRoZSBwYXRoIGlzIG5vdCB1c2VkIHdoZW4gcGxhY2VkIGluCi1hIGxvY2F0aW9uIHNlY3Rpb24gLS0+Ci08cD5UaGlzIGRpcmVjdGl2ZSBhbGxvd3MgcmVtb3RlIHNlcnZlcnMgdG8gYmUgbWFwcGVkIGludG8gdGhlIHNwYWNlIG9mCi10aGUgbG9jYWwgc2VydmVyOyB0aGUgbG9jYWwgc2VydmVyIGRvZXMgbm90IGFjdCBhcyBhIHByb3h5IGluIHRoZQotY29udmVudGlvbmFsIHNlbnNlLCBidXQgYXBwZWFycyB0byBiZSBhIG1pcnJvciBvZiB0aGUgcmVtb3RlCi1zZXJ2ZXIuIDxlbT5wYXRoPC9lbT4gaXMgdGhlIG5hbWUgb2YgYSBsb2NhbCB2aXJ0dWFsIHBhdGg7Ci08ZW0+dXJsPC9lbT4gaXMgYSBwYXJ0aWFsIFVSTCBmb3IgdGhlIHJlbW90ZSBzZXJ2ZXIuPC9wPgotCi08cD5TdXBwb3NlIHRoZSBsb2NhbCBzZXJ2ZXIgaGFzIGFkZHJlc3MgPGNvZGU+aHR0cDovL3dpYmJsZS5vcmcvPC9jb2RlPjsgCi10aGVuPC9wPgotPGV4YW1wbGU+Ci0gICBQcm94eVBhc3MgL21pcnJvci9mb28vIGh0dHA6Ly9mb28uY29tLwotPC9leGFtcGxlPgotPHA+d2lsbCBjYXVzZSBhIGxvY2FsIHJlcXVlc3QgZm9yIHRoZQotJmx0Ozxjb2RlPmh0dHA6Ly93aWJibGUub3JnL21pcnJvci9mb28vYmFyPC9jb2RlPiZndDsgdG8gYmUKLWludGVybmFsbHkgY29udmVydGVkIGludG8gYSBwcm94eSByZXF1ZXN0IHRvCi0mbHQ7PGNvZGU+aHR0cDovL2Zvby5jb20vYmFyPC9jb2RlPiZndDsuPC9wPgotPHA+Ci1UaGUgISBkaXJlY3RpdmUgaXMgdXNlZnVsIGluIHNpdHVhdGlvbnMgd2hlcmUgeW91IGRvbid0IHdhbnQgdG8gcmV2ZXJzZS1wcm94eQotYSBzdWJkaXJlY3RvcnkuIGVnLjwvcD4KLTxleGFtcGxlPgotICAgICAgICBQcm94eVBhc3MgL21pcnJvci9mb28vaSAhPGJyIC8+Ci0gICAgICAgIFByb3h5UGFzcyAvbWlycm9yL2ZvbyBodHRwOi8vZm9vLmNvbQotPC9leGFtcGxlPgotPHA+d2lsbCBwcm94eSBhbGwgcmVxdWVzdHMgdG8gL21pcnJvci9mb28gdG8gZm9vLmNvbSBFWENFUFQgcmVxdWVzdHMgbWFkZSB0byAvbWlycm9yL2Zvby9pPC9wPgotCi08bm90ZT5OQjogb3JkZXIgaXMgaW1wb3J0YW50LiB5b3UgbmVlZCB0byBwdXQgdGhlIGV4Y2x1c2lvbnMgQkVGT1JFIHRoZSBnZW5lcmFsIHByb3h5cGFzcyBkaXJlY3RpdmU8L25vdGU+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+UHJveHlQYXNzUmV2ZXJzZTwvbmFtZT4KLTxzeW50YXg+UHJveHlQYXNzUmV2ZXJzZSBbPGVtPnBhdGg8L2VtPl0gPGVtPnVybDwvZW0+PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLTwhLS0gWFhYOiBOZWVkIHRvIGRvY3VtZW50IHRoYXQgdGhlIHBhdGggaXMgbm90IHVzZWQgd2hlbiBwbGFjZWQgaW4KLWEgbG9jYXRpb24gc2VjdGlvbiAtLT4KLTxwPlRoaXMgZGlyZWN0aXZlIGxldHMgQXBhY2hlIGFkanVzdCB0aGUgVVJMIGluIHRoZSA8Y29kZT5Mb2NhdGlvbjwvY29kZT4sCi08Y29kZT5Db250ZW50LUxvY2F0aW9uPC9jb2RlPiBhbmQgPGNvZGU+VVJJPC9jb2RlPiBoZWFkZXJzIG9uCi1IVFRQIHJlZGlyZWN0IHJlc3BvbnNlcy4gVGhpcyBpcyBlc3NlbnRpYWwgd2hlbiBBcGFjaGUgaXMgdXNlZCBhcwotYSByZXZlcnNlIHByb3h5IHRvIGF2b2lkIGJ5LXBhc3NpbmcgdGhlIHJldmVyc2UgcHJveHkgYmVjYXVzZSBvZiBIVFRQCi1yZWRpcmVjdHMgb24gdGhlIGJhY2tlbmQgc2VydmVycyB3aGljaCBzdGF5IGJlaGluZCB0aGUgcmV2ZXJzZSBwcm94eS48L3A+Ci0KLTxwPjxlbT5wYXRoPC9lbT4gaXMgdGhlIG5hbWUgb2YgYSBsb2NhbCB2aXJ0dWFsIHBhdGguPGJyIC8+Ci08ZW0+dXJsPC9lbT4gaXMgYSBwYXJ0aWFsIFVSTCBmb3IgdGhlIHJlbW90ZSBzZXJ2ZXIgLSB0aGUgc2FtZSB3YXkgdGhleSBhcmUKLXVzZWQgZm9yIHRoZSA8ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX3Byb3h5Ij5Qcm94eVBhc3M8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlLjwvcD4KLQotPHA+Ci1FeGFtcGxlOjxiciAvPgotU3VwcG9zZSB0aGUgbG9jYWwgc2VydmVyIGhhcyBhZGRyZXNzIDxjb2RlPmh0dHA6Ly93aWJibGUub3JnLzwvY29kZT47IHRoZW48L3A+Ci08ZXhhbXBsZT4KLSAgIFByb3h5UGFzcyAgICAgICAgIC9taXJyb3IvZm9vLyBodHRwOi8vZm9vLmNvbS88YnIgLz4KLSAgIFByb3h5UGFzc1JldmVyc2UgIC9taXJyb3IvZm9vLyBodHRwOi8vZm9vLmNvbS8KLTwvZXhhbXBsZT4KLTxwPndpbGwgbm90IG9ubHkgY2F1c2UgYSBsb2NhbCByZXF1ZXN0IGZvciB0aGUKLSZsdDs8Y29kZT5odHRwOi8vd2liYmxlLm9yZy9taXJyb3IvZm9vL2JhcjwvY29kZT4mZ3Q7IHRvIGJlIGludGVybmFsbHkKLWNvbnZlcnRlZCBpbnRvIGEgcHJveHkgcmVxdWVzdCB0byAmbHQ7PGNvZGU+aHR0cDovL2Zvby5jb20vYmFyPC9jb2RlPiZndDsgKHRoZQotZnVuY3Rpb25hbGl0eSA8Y29kZT5Qcm94eVBhc3M8L2NvZGU+IHByb3ZpZGVzIGhlcmUpLiBJdCBhbHNvIHRha2VzIGNhcmUgb2YKLXJlZGlyZWN0cyB0aGUgc2VydmVyIGZvby5jb20gc2VuZHM6IHdoZW4gPGNvZGU+aHR0cDovL2Zvby5jb20vYmFyPC9jb2RlPiBpcwotcmVkaXJlY3RlZCBieSBoaW0gdG8gPGNvZGU+aHR0cDovL2Zvby5jb20vcXV1eDwvY29kZT4gQXBhY2hlIGFkanVzdHMgdGhpcyB0bwotPGNvZGU+aHR0cDovL3dpYmJsZS5vcmcvbWlycm9yL2Zvby9xdXV4PC9jb2RlPiBiZWZvcmUgZm9yd2FyZGluZyB0aGUgSFRUUAotcmVkaXJlY3QgcmVzcG9uc2UgdG8gdGhlIGNsaWVudC4gPC9wPgotPHA+Ci1Ob3RlIHRoYXQgdGhpcyA8ZGlyZWN0aXZlPlByb3h5UGFzc1JldmVyc2U8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIGNhbgotYWxzbyBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHByb3h5IHBhc3MtdGhyb3VnaCBmZWF0dXJlCi0oIjxjb2RlPlJld3JpdGVSdWxlIC4uLiAgW1BdPC9jb2RlPiIpIGZyb20KLTxtb2R1bGU+bW9kX3Jld3JpdGU8L21vZHVsZT4gYmVjYXVzZSBpdHMgZG9lc24ndCBkZXBlbmQgb24gYQotY29ycmVzcG9uZGluZyA8ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX3Byb3h5Ij5Qcm94eVBhc3M8L2RpcmVjdGl2ZT4KLWRpcmVjdGl2ZS48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+QWxsb3dDT05ORUNUPC9uYW1lPgotPHN5bnRheD5BbGxvd0NPTk5FQ1QgPGVtPnBvcnQ8L2VtPiBbPGVtPnBvcnQ8L2VtPl0gLi4uPC9zeW50YXg+Ci08ZGVmYXVsdD5BbGxvd0NPTk5FQ1QgNDQzIDU2MzwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PgotPGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotPHA+VGhlIDxkaXJlY3RpdmU+QWxsb3dDT05ORUNUPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBzcGVjaWZpZXMgYSBsaXN0Ci1vZiBwb3J0IG51bWJlcnMgdG8gd2hpY2ggdGhlIHByb3h5IDxjb2RlPkNPTk5FQ1Q8L2NvZGU+IG1ldGhvZCBtYXkKLWNvbm5lY3QuICBUb2RheSdzIGJyb3dzZXJzIHVzZSB0aGlzIG1ldGhvZCB3aGVuIGEgPGVtPmh0dHBzPC9lbT4KLWNvbm5lY3Rpb24gaXMgcmVxdWVzdGVkIGFuZCBwcm94eSB0dW5uZWxpbmcgb3ZlciA8ZW0+aHR0cDwvZW0+IGlzIGluCi1lZmZlY3QuPGJyIC8+IEJ5IGRlZmF1bHQsIG9ubHkgdGhlIGRlZmF1bHQgaHR0cHMgcG9ydCAoNDQzKSBhbmQgdGhlCi1kZWZhdWx0IHNuZXdzIHBvcnQgKDU2MykgYXJlIGVuYWJsZWQuIFVzZSB0aGUKLTxkaXJlY3RpdmU+QWxsb3dDT05ORUNUPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSB0byBvdmVycnJpZGUgdGhpcyBkZWZhdWx0IGFuZAotYWxsb3cgY29ubmVjdGlvbnMgdG8gdGhlIGxpc3RlZCBwb3J0cyBvbmx5LjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5Qcm94eUJsb2NrPC9uYW1lPgotPHN5bnRheD5Qcm94eUJsb2NrICp8PGVtPndvcmR8aG9zdHxkb21haW48L2VtPgotWzxlbT53b3JkfGhvc3R8ZG9tYWluPC9lbT5dIC4uLjwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+Ci08Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci08cD5UaGUgPGRpcmVjdGl2ZT5Qcm94eUJsb2NrPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBzcGVjaWZpZXMgYSBsaXN0IG9mCi13b3JkcywgaG9zdHMgYW5kL29yIGRvbWFpbnMsIHNlcGFyYXRlZCBieSBzcGFjZXMuICBIVFRQLCBIVFRQUywgYW5kCi1GVFAgZG9jdW1lbnQgcmVxdWVzdHMgdG8gc2l0ZXMgd2hvc2UgbmFtZXMgY29udGFpbiBtYXRjaGVkIHdvcmRzLAotaG9zdHMgb3IgZG9tYWlucyBhcmUgPGVtPmJsb2NrZWQ8L2VtPiBieSB0aGUgcHJveHkgc2VydmVyLiBUaGUgcHJveHkKLW1vZHVsZSB3aWxsIGFsc28gYXR0ZW1wdCB0byBkZXRlcm1pbmUgSVAgYWRkcmVzc2VzIG9mIGxpc3QgaXRlbXMgd2hpY2gKLW1heSBiZSBob3N0bmFtZXMgZHVyaW5nIHN0YXJ0dXAsIGFuZCBjYWNoZSB0aGVtIGZvciBtYXRjaCB0ZXN0IGFzCi13ZWxsLiBFeGFtcGxlOjwvcD4KLQotPGV4YW1wbGU+Ci0gIFByb3h5QmxvY2sgam9lcy1nYXJhZ2UuY29tIHNvbWUtaG9zdC5jby51ayByb2NreS53b3RzYW1hdHRhdS5lZHUKLTwvZXhhbXBsZT4KLQotPHA+J3JvY2t5LndvdHNhbWF0dGF1LmVkdScgd291bGQgYWxzbyBiZSBtYXRjaGVkIGlmIHJlZmVyZW5jZWQgYnkgSVAKLWFkZHJlc3MuPC9wPgotCi08cD5Ob3RlIHRoYXQgJ3dvdHNhbWF0dGF1JyB3b3VsZCBhbHNvIGJlIHN1ZmZpY2llbnQgdG8gbWF0Y2gKLSd3b3RzYW1hdHRhdS5lZHUnLjwvcD4KLQotPHA+Tm90ZSBhbHNvIHRoYXQ8L3A+Ci0KLTxleGFtcGxlPgotUHJveHlCbG9jayAqCi08L2V4YW1wbGU+Ci0KLTxwPmJsb2NrcyBjb25uZWN0aW9ucyB0byBhbGwgc2l0ZXMuPC9wPgotCi08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+UHJveHlSZWNlaXZlQnVmZmVyU2l6ZTwvbmFtZT4KLTxzeW50YXg+UHJveHlSZWNlaXZlQnVmZmVyU2l6ZSA8ZW0+Ynl0ZXM8L2VtPjwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+Ci08Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci08cD5UaGUgPGRpcmVjdGl2ZT5Qcm94eVJlY2VpdmVCdWZmZXJTaXplPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZQotc3BlY2lmaWVzIGFuIGV4cGxpY2l0IG5ldHdvcmsgYnVmZmVyIHNpemUgZm9yIG91dGdvaW5nIEhUVFAgYW5kIEZUUAotY29ubmVjdGlvbnMsIGZvciBpbmNyZWFzZWQgdGhyb3VnaHB1dC4gIEl0IGhhcyB0byBiZSBncmVhdGVyIHRoYW4gNTEyCi1vciBzZXQgdG8gMCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBzeXN0ZW0ncyBkZWZhdWx0IGJ1ZmZlciBzaXplIHNob3VsZAotYmUgdXNlZC48L3A+Ci08ZXhhbXBsZT48dGl0bGU+RXhhbXBsZTwvdGl0bGU+Ci0gIFByb3h5UmVjZWl2ZUJ1ZmZlclNpemUgMjA0OAotPC9leGFtcGxlPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlByb3h5TWF4Rm9yd2FyZHM8L25hbWU+Ci08c3ludGF4PlByb3h5TWF4Rm9yd2FyZHMgPGVtPm51bWJlcjwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5Qcm94eU1heEZvcndhcmRzIDEwPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+Ci08Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPGNvbXBhdGliaWxpdHk+QXZhaWxhYmxlIGluIEFwYWNoZSAyLjAgYW5kIGxhdGVyPC9jb21wYXRpYmlsaXR5PgotCi08dXNhZ2U+Ci08cD5UaGUgPGRpcmVjdGl2ZT5Qcm94eU1heEZvcndhcmRzPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBzcGVjaWZpZXMgdGhlCi1tYXhpbXVtIG51bWJlciBvZiBwcm94aWVzIHRocm91Z2ggd2hpY2ggYSByZXF1ZXN0IG1heSBwYXNzLiBUaGlzIGlzCi1zZXQgdG8gcHJldmVudCBpbmZpbml0ZSBwcm94eSBsb29wcywgb3IgYSBEb1MgYXR0YWNrLjwvcD4KLQotPGV4YW1wbGU+PHRpdGxlPkV4YW1wbGU8L3RpdGxlPgotICBQcm94eU1heEZvcndhcmRzIDEwCi08L2V4YW1wbGU+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+Tm9Qcm94eTwvbmFtZT4KLTxzeW50YXg+Tm9Qcm94eSAKLSA8ZW0+RG9tYWluPC9lbT58Ci0gPGVtPlN1Yk5ldDwvZW0+fAotIDxlbT5JcEFkZHI8L2VtPnwgCi0gPGVtPkhvc3RuYW1lPC9lbT4KLVs8ZW0+RG9tYWluPC9lbT58IAotIDxlbT5TdWJOZXQ8L2VtPnwKLSA8ZW0+SXBBZGRyPC9lbT58IAotIDxlbT5Ib3N0bmFtZTwvZW0+XSAuLi48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PgotPGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotPHA+VGhpcyBkaXJlY3RpdmUgaXMgb25seSB1c2VmdWwgZm9yIEFwYWNoZSBwcm94eSBzZXJ2ZXJzIHdpdGhpbgotaW50cmFuZXRzLiAgVGhlIDxkaXJlY3RpdmU+Tm9Qcm94eTwvZGlyZWN0aXZlPiBkaXJlY3RpdmUgc3BlY2lmaWVzIGEKLWxpc3Qgb2Ygc3VibmV0cywgSVAgYWRkcmVzc2VzLCBob3N0cyBhbmQvb3IgZG9tYWlucywgc2VwYXJhdGVkIGJ5Ci1zcGFjZXMuIEEgcmVxdWVzdCB0byBhIGhvc3Qgd2hpY2ggbWF0Y2hlcyBvbmUgb3IgbW9yZSBvZiB0aGVzZSBpcwotYWx3YXlzIHNlcnZlZCBkaXJlY3RseSwgd2l0aG91dCBmb3J3YXJkaW5nIHRvIHRoZSBjb25maWd1cmVkCi08ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX3Byb3h5Ij5Qcm94eVJlbW90ZTwvZGlyZWN0aXZlPiBwcm94eSBzZXJ2ZXIocykuPC9wPgotCi08ZXhhbXBsZT48dGl0bGU+RXhhbXBsZTwvdGl0bGU+Ci0gIFByb3h5UmVtb3RlICAqICBodHRwOi8vZmlyZXdhbGwubXljb21wYW55LmNvbTo4MTxiciAvPgotICBOb1Byb3h5ICAgICAgICAgLm15Y29tcGFueS5jb20gMTkyLjE2OC4xMTIuMC8yMSAKLTwvZXhhbXBsZT4KLQotPHA+VGhlIGFyZ3VtZW50cyB0byB0aGUgTm9Qcm94eSBkaXJlY3RpdmUgYXJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGUgbGlzdDo8L3A+Ci0gICA8ZGw+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gRG9tYWluID09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxkdD48YSBuYW1lPSJkb21haW4iPgotICAgIDxlbT5Eb21haW48L2VtPjwvYT48L2R0PgotICAgIDxkZD5BIDxlbT5Eb21haW48L2VtPiBpcyBhIHBhcnRpYWxseSBxdWFsaWZpZWQgRE5TIGRvbWFpbiBuYW1lLCBwcmVjZWRlZAotICAgICAgICBieSBhIHBlcmlvZC4KLSAgICAgICAgSXQgcmVwcmVzZW50cyBhIGxpc3Qgb2YgaG9zdHMgd2hpY2ggbG9naWNhbGx5IGJlbG9uZyB0byB0aGUgc2FtZSBETlMKLSAgICAgICAgZG9tYWluIG9yIHpvbmUgKDxlbT5pLmUuPC9lbT4sIHRoZSBzdWZmaXhlcyBvZiB0aGUgaG9zdG5hbWVzIGFyZSBhbGwgZW5kaW5nIGluIAotICAgICAgICA8ZW0+RG9tYWluPC9lbT4pLjxiciAvPgotCQlFeGFtcGxlczogPGNvZGU+LmNvbTwvY29kZT4gICA8Y29kZT4uYXBhY2hlLm9yZy48L2NvZGU+PGJyIC8+Ci0gICAgICAgIFRvIGRpc3Rpbmd1aXNoIDxlbT5Eb21haW48L2VtPnMgZnJvbSA8YSBocmVmPSIjaG9zdG5hbWUiPjxlbT5Ib3N0bmFtZTwvZW0+PC9hPnMgKGJvdGgKLSAgICAgICAgc3ludGFjdGljYWxseSBhbmQgc2VtYW50aWNhbGx5OyBhIEROUyBkb21haW4gY2FuIGhhdmUgYSBETlMgQSByZWNvcmQsCi0gICAgICAgIHRvbyEpLCA8ZW0+RG9tYWluPC9lbT5zIGFyZSBhbHdheXMgd3JpdHRlbgotICAgICAgICB3aXRoIGEgbGVhZGluZyBwZXJpb2QuPGJyIC8+Ci0gICAgICAgIE5vdGU6IERvbWFpbiBuYW1lIGNvbXBhcmlzb25zIGFyZSBkb25lIHdpdGhvdXQgcmVnYXJkIHRvIHRoZSBjYXNlLAotICAgICAgICBhbmQgPGVtPkRvbWFpbjwvZW0+cyBhcmUgYWx3YXlzIGFzc3VtZWQgdG8gYmUgYW5jaG9yZWQgaW4gdGhlIHJvb3QgCi0gICAgICAgIG9mIHRoZSBETlMgdHJlZSwgdGhlcmVmb3JlIHR3byBkb21haW5zIDxjb2RlPi5NeURvbWFpbi5jb208L2NvZGU+IGFuZAotICAgICAgICA8Y29kZT4ubXlkb21haW4uY29tLjwvY29kZT4gKG5vdGUgdGhlIHRyYWlsaW5nIHBlcmlvZCkgYXJlCi0gICAgICAgIGNvbnNpZGVyZWQgZXF1YWwuIFNpbmNlIGEgZG9tYWluIGNvbXBhcmlzb24gZG9lcyBub3QgaW52b2x2ZSBhIEROUwotCWxvb2t1cCwgaXQgaXMgbXVjaCBtb3JlIGVmZmljaWVudCB0aGFuIHN1Ym5ldCBjb21wYXJpc29uLjwvZGQ+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PSBTdWJOZXQgPT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPGR0PjxhIG5hbWU9InN1Ym5ldCI+Ci0gICAgPGVtPlN1Yk5ldDwvZW0+PC9hPjwvZHQ+Ci0gICAgPGRkPkEgPGVtPlN1Yk5ldDwvZW0+IGlzIGEgcGFydGlhbGx5IHF1YWxpZmllZCBpbnRlcm5ldCBhZGRyZXNzIGluCi0gICAgICAgIG51bWVyaWMgKGRvdHRlZCBxdWFkKSBmb3JtLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgc2xhc2ggYW5kIHRoZQotICAgICAgICBuZXRtYXNrLCBzcGVjaWZpZWQgYXMgdGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBiaXRzIGluIHRoZQotICAgICAgICA8ZW0+U3ViTmV0PC9lbT4uIEl0IGlzIHVzZWQgdG8gcmVwcmVzZW50IGEgc3VibmV0IG9mIGhvc3RzIHdoaWNoIGNhbgotICAgICAgICBiZSByZWFjaGVkIG92ZXIgYSBjb21tb24gbmV0d29yayBpbnRlcmZhY2UuIEluIHRoZSBhYnNlbmNlIG9mIHRoZQotICAgICAgICBleHBsaWNpdCBuZXQgbWFzayBpdCBpcyBhc3N1bWVkIHRoYXQgb21pdHRlZCAob3IgemVybyB2YWx1ZWQpCi0gICAgICAgIHRyYWlsaW5nIGRpZ2l0cyBzcGVjaWZ5IHRoZSBtYXNrLiAoSW4gdGhpcyBjYXNlLCB0aGUgbmV0bWFzayBjYW4KLSAgICAgICAgb25seSBiZSBtdWx0aXBsZXMgb2YgOCBiaXRzIHdpZGUuKTxiciAvPgotICAgICAgICBFeGFtcGxlczoKLSAgICAgICAgPGRsPgotICAgICAgICAgPGR0Pjxjb2RlPjE5Mi4xNjg8L2NvZGU+IG9yIDxjb2RlPjE5Mi4xNjguMC4wPC9jb2RlPjwvZHQ+Ci0gICAgICAgICA8ZGQ+dGhlIHN1Ym5ldCAxOTIuMTY4LjAuMCB3aXRoIGFuIGltcGxpZWQgbmV0bWFzayBvZiAxNiB2YWxpZCBiaXRzCi0gICAgICAgICAgICAgKHNvbWV0aW1lcyB1c2VkIGluIHRoZSBuZXRtYXNrIGZvcm0gPGNvZGU+MjU1LjI1NS4wLjA8L2NvZGU+KTwvZGQ+Ci0gICAgICAgICA8ZHQ+PGNvZGU+MTkyLjE2OC4xMTIuMC8yMTwvY29kZT48L2R0PgotICAgICAgICAgPGRkPnRoZSBzdWJuZXQgPGNvZGU+MTkyLjE2OC4xMTIuMC8yMTwvY29kZT4gd2l0aCBhIG5ldG1hc2sgb2YgMjEKLSAgICAgICAgICAgICB2YWxpZCBiaXRzIChhbHNvIHVzZWQgaW4gdGhlIGZvcm0gMjU1LjI1NS4yNDguMCk8L2RkPgotICAgICAgICA8L2RsPgotCQlBcyBhIGRlZ2VuZXJhdGUgY2FzZSwgYSA8ZW0+U3ViTmV0PC9lbT4gd2l0aCAzMiB2YWxpZCBiaXRzIGlzIHRoZQotICAgICAgICBlcXVpdmFsZW50IHRvIGFuIDxlbT5JUEFkZHI8L2VtPiwgd2hpbGUgYSA8ZW0+U3ViTmV0PC9lbT4gd2l0aCB6ZXJvCi0gICAgICAgIHZhbGlkIGJpdHMgKDxlbT5lLmcuPC9lbT4sIDAuMC4wLjAvMCkgaXMgdGhlIHNhbWUgYXMgdGhlIGNvbnN0YW50Ci0gICAgICAgIDxlbT5fRGVmYXVsdF88L2VtPiwgbWF0Y2hpbmcgYW55IElQIGFkZHJlc3MuIDwvZGQ+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PSBJUEFkZHIgPT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPGR0PjxhIG5hbWU9ImlwYWRkciI+Ci0gICAgPGVtPklQQWRkcjwvZW0+PC9hPjwvZHQ+Ci0gICAgPGRkPkEgPGVtPklQQWRkcjwvZW0+IHJlcHJlc2VudHMgYSBmdWxseSBxdWFsaWZpZWQgaW50ZXJuZXQgYWRkcmVzcyBpbgotICAgICAgICBudW1lcmljIChkb3R0ZWQgcXVhZCkgZm9ybS4gVXN1YWxseSwgdGhpcyBhZGRyZXNzIHJlcHJlc2VudHMgYQotICAgICAgICBob3N0LCBidXQgdGhlcmUgbmVlZCBub3QgbmVjZXNzYXJpbHkgYmUgYSBETlMgZG9tYWluIG5hbWUKLSAgICAgICAgY29ubmVjdGVkIHdpdGggdGhlIGFkZHJlc3MuPGJyIC8+Ci0JCUV4YW1wbGU6IDE5Mi4xNjguMTIzLjc8YnIgLz4KLSAgICAgICAgTm90ZTogQW4gPGVtPklQQWRkcjwvZW0+IGRvZXMgbm90IG5lZWQgdG8gYmUgcmVzb2x2ZWQgYnkgdGhlIEROUwotCXN5c3RlbSwgc28gaXQgY2FuIHJlc3VsdCBpbiBtb3JlIGVmZmVjdGl2ZSBhcGFjaGUgcGVyZm9ybWFuY2UuPC9kZD4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IEhvc3RuYW1lID09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxkdD48YSBuYW1lPSJob3N0bmFtZSI+Ci0gICAgPGVtPkhvc3RuYW1lPC9lbT48L2E+PC9kdD4KLSAgICA8ZGQ+QSA8ZW0+SG9zdG5hbWU8L2VtPiBpcyBhIGZ1bGx5IHF1YWxpZmllZCBETlMgZG9tYWluIG5hbWUgd2hpY2ggY2FuCi0gICAgICAgIGJlIHJlc29sdmVkIHRvIG9uZSBvciBtb3JlIDxhCi0JaHJlZj0iI2lwYWRkciI+PGVtPklQQWRkcnM8L2VtPjwvYT4gdmlhIHRoZSBETlMgZG9tYWluIG5hbWUgc2VydmljZS4gCi0gICAgICAgIEl0IHJlcHJlc2VudHMgYSBsb2dpY2FsIGhvc3QgKGluIGNvbnRyYXN0IHRvCi0JPGEgaHJlZj0iI2RvbWFpbiI+PGVtPkRvbWFpbjwvZW0+PC9hPnMsIHNlZSAKLSAgICAgICAgYWJvdmUpIGFuZCBtdXN0IGJlIHJlc29sdmFibGUgdG8gYXQgbGVhc3Qgb25lIDxhCi0JaHJlZj0iI2lwYWRkciI+PGVtPklQQWRkcjwvZW0+PC9hPiAob3Igb2Z0ZW4gdG8gYSBsaXN0IG9mIGhvc3RzCi0Jd2l0aCBkaWZmZXJlbnQgPGEgaHJlZj0iI2lwYWRkciI+PGVtPklQQWRkcjwvZW0+PC9hPidzKS48YnIgLz4gCi0JCUV4YW1wbGVzOiA8Y29kZT5wcmVwLmFpLm1pdC5lZHU8L2NvZGU+Ci0gICAgICAgICAgICAgICAgICA8Y29kZT53d3cuYXBhY2hlLm9yZy48L2NvZGU+PGJyIC8+Ci0gICAgICAgIE5vdGU6IEluIG1hbnkgc2l0dWF0aW9ucywgaXQgaXMgbW9yZSBlZmZlY3RpdmUgdG8gc3BlY2lmeSBhbgotICAgICAgICA8YSBocmVmPSIjaXBhZGRyIj48ZW0+SVBBZGRyPC9lbT48L2E+IGluIHBsYWNlIG9mIGEKLQk8ZW0+SG9zdG5hbWU8L2VtPiBzaW5jZSBhIEROUyBsb29rdXAgCi0gICAgICAgIGNhbiBiZSBhdm9pZGVkLiBOYW1lIHJlc29sdXRpb24gaW4gQXBhY2hlIGNhbiB0YWtlIGEgcmVtYXJrYWJsZSBkZWFsCi0gICAgICAgIG9mIHRpbWUgd2hlbiB0aGUgY29ubmVjdGlvbiB0byB0aGUgbmFtZSBzZXJ2ZXIgdXNlcyBhIHNsb3cgUFBQCi0gICAgICAgIGxpbmsuPGJyIC8+Ci0gICAgICAgIE5vdGU6IDxlbT5Ib3N0bmFtZTwvZW0+IGNvbXBhcmlzb25zIGFyZSBkb25lIHdpdGhvdXQgcmVnYXJkIHRvIHRoZSBjYXNlLAotICAgICAgICBhbmQgPGVtPkhvc3RuYW1lPC9lbT5zIGFyZSBhbHdheXMgYXNzdW1lZCB0byBiZSBhbmNob3JlZCBpbiB0aGUgcm9vdAotICAgICAgICBvZiB0aGUgRE5TIHRyZWUsIHRoZXJlZm9yZSB0d28gaG9zdHMgPGNvZGU+V1dXLk15RG9tYWluLmNvbTwvY29kZT4KLSAgICAgICAgYW5kIDxjb2RlPnd3dy5teWRvbWFpbi5jb20uPC9jb2RlPiAobm90ZSB0aGUgdHJhaWxpbmcgcGVyaW9kKSBhcmUKLSAgICAgICAgY29uc2lkZXJlZCBlcXVhbC48L2RkPgotPC9kbD4KLTwvdXNhZ2U+Ci08c2VlYWxzbz48YSBocmVmPSIuLi9kbnMtY2F2ZWF0cy5odG1sIj5ETlMgSXNzdWVzPC9hPjwvc2VlYWxzbz4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlByb3h5VGltZW91dDwvbmFtZT4KLTxzeW50YXg+UHJveHlUaW1lb3V0IDxlbT5zZWNvbmRzPC9lbT48L3N5bnRheD4KLTxkZWZhdWx0PlByb3h5VGltZW91dCAzMDA8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08Y29tcGF0aWJpbGl0eT5BdmFpbGFibGUgaW4KLUFwYWNoZSAyLjAuMzEgYW5kIGxhdGVyPC9jb21wYXRpYmlsaXR5PgotCi08dXNhZ2U+Ci08cD5UaGlzIGRpcmVjdGl2ZSBhbGxvd3MgYSB1c2VyIHRvIHNwZWNpZml5IGEgdGltZW91dCBvbiBwcm94eSByZXF1ZXN0cy4KLVRoaXMgaXMgdXNlZnVsbCB3aGVuIHlvdSBoYXZlIGEgc2xvdy9idWdneSBhcHBzZXJ2ZXIgd2hpY2ggaGFuZ3MsCi1hbmQgeW91IHdvdWxkIHJhdGhlciBqdXN0IHJldHVybiBhIHRpbWVvdXQgYW5kIGZhaWwgZ3JhY2VmdWxseSBpbnN0ZWFkCi1vZiB3YWl0aW5nIGhvd2V2ZXIgbG9uZyBpdCB0YWtlcyB0aGUgc2VydmVyIHRvIHJldHVybgotPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlByb3h5RG9tYWluPC9uYW1lPgotPHN5bnRheD5Qcm94eURvbWFpbiA8ZW0+RG9tYWluPC9lbT48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PgotPGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotPHA+VGhpcyBkaXJlY3RpdmUgaXMgb25seSB1c2VmdWwgZm9yIEFwYWNoZSBwcm94eSBzZXJ2ZXJzIHdpdGhpbgotaW50cmFuZXRzLiAgVGhlIDxkaXJlY3RpdmU+UHJveHlEb21haW48L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIHNwZWNpZmllcwotdGhlIGRlZmF1bHQgZG9tYWluIHdoaWNoIHRoZSBhcGFjaGUgcHJveHkgc2VydmVyIHdpbGwgYmVsb25nIHRvLiBJZiBhCi1yZXF1ZXN0IHRvIGEgaG9zdCB3aXRob3V0IGEgZG9tYWluIG5hbWUgaXMgZW5jb3VudGVyZWQsIGEgcmVkaXJlY3Rpb24KLXJlc3BvbnNlIHRvIHRoZSBzYW1lIGhvc3Qgd2l0aCB0aGUgY29uZmlndXJlZCA8ZW0+RG9tYWluPC9lbT4gYXBwZW5kZWQKLXdpbGwgYmUgZ2VuZXJhdGVkLjwvcD4KLQotPGV4YW1wbGU+PHRpdGxlPkV4YW1wbGU8L3RpdGxlPgotICBQcm94eVJlbW90ZSAgKiAgaHR0cDovL2ZpcmV3YWxsLm15Y29tcGFueS5jb206ODE8YnIgLz4KLSAgTm9Qcm94eSAgICAgICAgIC5teWNvbXBhbnkuY29tIDE5Mi4xNjguMTEyLjAvMjE8YnIgLz4KLSAgUHJveHlEb21haW4gICAgIC5teWNvbXBhbnkuY29tCi08L2V4YW1wbGU+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+UHJveHlWaWE8L25hbWU+Ci08c3ludGF4PlByb3h5VmlhIG9ufG9mZnxmdWxsfGJsb2NrPC9zeW50YXg+Ci08ZGVmYXVsdD5Qcm94eVZpYSBvZmY8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLTxwPlRoaXMgZGlyZWN0aXZlIGNvbnRyb2xzIHRoZSB1c2Ugb2YgdGhlIDxjb2RlPlZpYTo8L2NvZGU+IEhUVFAKLWhlYWRlciBieSB0aGUgcHJveHkuIEl0cyBpbnRlbmRlZCB1c2UgaXMgdG8gY29udHJvbCB0aGUgZmxvdyBvZiBvZgotcHJveHkgcmVxdWVzdHMgYWxvbmcgYSBjaGFpbiBvZiBwcm94eSBzZXJ2ZXJzLiAgU2VlIFJGQzIwNjggKEhUVFAvMS4xKQotZm9yIGFuIGV4cGxhbmF0aW9uIG9mIDxjb2RlPlZpYTo8L2NvZGU+IGhlYWRlciBsaW5lcy48L3A+Ci0KLTx1bD4gPGxpPklmIHNldAotdG8gPGVtPm9mZjwvZW0+LCB3aGljaCBpcyB0aGUgZGVmYXVsdCwgbm8gc3BlY2lhbCBwcm9jZXNzaW5nIGlzCi1wZXJmb3JtZWQuIElmIGEgcmVxdWVzdCBvciByZXBseSBjb250YWlucyBhIDxjb2RlPlZpYTo8L2NvZGU+IGhlYWRlciwKLWl0IGlzIHBhc3NlZCB0aHJvdWdoIHVuY2hhbmdlZC48L2xpPgotCi08bGk+SWYgc2V0IHRvIDxlbT5vbjwvZW0+LCBlYWNoCi1yZXF1ZXN0IGFuZCByZXBseSB3aWxsIGdldCBhIDxjb2RlPlZpYTo8L2NvZGU+IGhlYWRlciBsaW5lIGFkZGVkIGZvcgotdGhlIGN1cnJlbnQgaG9zdC48L2xpPgotCi08bGk+SWYgc2V0IHRvIDxlbT5mdWxsPC9lbT4sIGVhY2ggZ2VuZXJhdGVkIDxjb2RlPlZpYTo8L2NvZGU+IGhlYWRlcgotbGluZSB3aWxsIGFkZGl0aW9uYWxseSBoYXZlIHRoZSBBcGFjaGUgc2VydmVyIHZlcnNpb24gc2hvd24gYXMgYQotPGNvZGU+VmlhOjwvY29kZT4gY29tbWVudCBmaWVsZC48L2xpPgotCi08bGk+SWYgc2V0IHRvIDxlbT5ibG9jazwvZW0+LCBldmVyeQotcHJveHkgcmVxdWVzdCB3aWxsIGhhdmUgYWxsIGl0cyA8Y29kZT5WaWE6PC9jb2RlPiBoZWFkZXIgbGluZXMKLXJlbW92ZWQuIE5vIG5ldyA8Y29kZT5WaWE6PC9jb2RlPiBoZWFkZXIgd2lsbCBiZSBnZW5lcmF0ZWQuPC9saT4KLTwvdWw+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+UHJveHlFcnJvck92ZXJyaWRlPC9uYW1lPgotPHN5bnRheD5Qcm94eUVycm9yT3ZlcnJpZGUgT258T2ZmPC9zeW50YXg+Ci08ZGVmYXVsdD5Qcm94eUVycm9yT3ZlcnJpZGUgT2ZmPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+Ci08Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPGNvbXBhdGliaWxpdHk+QXZhaWxhYmxlIGluIHZlcnNpb24gMi4wIGFuZCBsYXRlcjwvY29tcGF0aWJpbGl0eT4KLQotPHVzYWdlPgotPHA+VGhpcyBkaXJlY3RpdmUgaXMgdXNlZnVsIGZvciByZXZlcnNlLXByb3h5IHNldHVwcywgd2hlcmUgeW91IHdhbnQgdG8gCi1oYXZlIGEgY29tbW9uIGxvb2sgYW5kIGZlZWwgb24gdGhlIGVycm9yIHBhZ2VzIHNlZW4gYnkgdGhlIGVuZCB1c2VyLiAKLVRoaXMgYWxzbyBhbGxvd3MgZm9yIGluY2x1ZGVkIGZpbGVzICh2aWEgbW9kX2luY2x1ZGUncyBTU0kpIHRvIGdldAotdGhlIGVycm9yIGNvZGUgYW5kIGFjdCBhY2NvcmRpbmdseSAoZGVmYXVsdCBiZWhhdmlvciB3b3VsZCBkaXNwbGF5Ci10aGUgZXJyb3IgcGFnZSBvZiB0aGUgcHJveGllZCBzZXJ2ZXIsIHR1cm5pbmcgdGhpcyBvbiBzaG93cyB0aGUgU1NJCi1FcnJvciBtZXNzYWdlKS48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLTwvbW9kdWxlc3lub3BzaXM+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX3Jld3JpdGUuaHRtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfcmV3cml0ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2M0ZTYzLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfcmV3cml0ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA4MyArMCwwIEBACi08IS0tJWh5cGVydGV4dCAtLT4KLTwhLS0gbW9kX3Jld3JpdGUuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBEb2N1bWVudGF0aW9uIGZvciB0aGUgbW9kX3Jld3JpdGUgQXBhY2hlIG1vZHVsZSAgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFwYWNoZSBtb2R1bGUgbW9kX3Jld3JpdGU8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08aDE+TW9kdWxlIG1vZF9yZXdyaXRlIChWZXJzaW9uIDIuMyk8L2gxPgotCi1UaGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4gdGhlIDxjb2RlPm1vZF9yZXdyaXRlLmM8L2NvZGU+IGZpbGUsIHdpdGgKLUFwYWNoZSAxLjIgYW5kIGxhdGVyLiAgSXQgcHJvdmlkZXMKLWEgcnVsZS1iYXNlZCByZXdyaXRpbmcgZW5naW5lIHRvIHJld3JpdGUgcmVxdWVzdGVkIFVSTHMgb24gdGhlIGZseS4gCi08Y29kZT5tb2RfcmV3cml0ZTwvY29kZT4gaXMgbm90IGNvbXBpbGVkIGludG8gdGhlIHNlcnZlciBieQotZGVmYXVsdC4gVG8gdXNlIDxjb2RlPm1vZF9yZXdyaXRlPC9jb2RlPiB5b3UgaGF2ZSB0byBlbmFibGUgdGhlIGZvbGxvd2luZwotbGluZSBpbiB0aGUgc2VydmVyIGJ1aWxkIENvbmZpZ3VyYXRpb24gZmlsZToKLTxwcmU+Ci0gICAgTW9kdWxlICByZXdyaXRlX21vZHVsZSAgIG1vZF9yZXdyaXRlLm8KLTwvcHJlPgotCi08aDI+U3VtbWFyeTwvaDI+Ci0KLVRoaXMgbW9kdWxlIHVzZXMgYSBydWxlLWJhc2VkIHJld3JpdGluZyBlbmdpbmUgKGJhc2VkIG9uIGEKLXJlZ3VsYXItZXhwcmVzc2lvbiBwYXJzZXIpIHRvIHJld3JpdGUgcmVxdWVzdGVkIFVSTHMgb24gdGhlIGZseS4gCi0KLTxwPgotSXQgc3VwcG9ydHMgYW4gdW5saW1pdGVkIG51bWJlciBvZiBhZGRpdGlvbmFsIHJ1bGUgY29uZGl0aW9ucyAod2hpY2ggY2FuCi1vcGVyYXRlIG9uIGEgbG90IG9mIHZhcmlhYmxlcywgaW5jbHVkaW5nIEhUVFAgaGVhZGVycykgZm9yIGdyYW51bGFyCi1tYXRjaGluZyBhbmQgZXh0ZXJuYWwgZGF0YWJhc2UgbG9va3VwcyAoZWl0aGVyIHZpYSBwbGFpbiB0ZXh0Ci10YWJsZXMsIERCTSBoYXNoIGZpbGVzIG9yIGV4dGVybmFsIHByb2Nlc3NlcykgZm9yIGFkdmFuY2VkIFVSTAotc3Vic3RpdHV0aW9uLgotCi08cD4KLUl0IG9wZXJhdGVzIG9uIHRoZSBmdWxsIFVSTHMgKGluY2x1ZGluZyB0aGUgUEFUSF9JTkZPIHBhcnQpIGJvdGggaW4KLXBlci1zZXJ2ZXIgY29udGV4dCAoaHR0cGQuY29uZikgYW5kIHBlci1kaXIgY29udGV4dCAoLmh0YWNjZXNzKSBhbmQgZXZlbgotY2FuIGdlbmVyYXRlIFFVRVJZX1NUUklORyBwYXJ0cyBvbiByZXN1bHQuICAgVGhlIHJld3JpdHR0ZW4gcmVzdWx0IGNhbiBsZWFkIHRvIGludGVybmFsIHN1Yi1wcm9jZXNzaW5nLCBleHRlcm5hbCByZXF1ZXN0IHJlZGlyZWN0aW9uIG9yIHRvIGludGVybmFsIHByb3h5IHRocm91Z2hwdXQuCi08L2I+Ci0KLTxwPgotVGhlIGxhdGVzdCB2ZXJzaW9uIGNhbiBiZSBmb3VuZCBvbjxicj4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuZW5nZWxzY2hhbGwuY29tL3N3L21vZF9yZXdyaXRlLyI+Ci08Y29kZT48Yj5odHRwOi8vd3d3LmVuZ2Vsc2NoYWxsLmNvbS9zdy9tb2RfcmV3cml0ZS88L2I+PC9jb2RlPjwvYT4KLQotPHA+Ci1Db3B5cmlnaHQgJmNvcHk7IDE5OTYgPGI+VGhlIEFwYWNoZSBHcm91cDwvYj4sIEFsbCByaWdodHMgcmVzZXJ2ZWQuPGJyPgotQ29weXJpZ2h0ICZjb3B5OyAxOTk2IDxpPlJhbGYgUy4gRW5nZWxzY2hhbGw8L2k+LCBBbGwgcmlnaHRzIHJlc2VydmVkLgotPHA+Ci1Xcml0dGVuIGZvciA8Yj5UaGUgQXBhY2hlIEdyb3VwPC9iPiBieQotPGJsb2NrcXVvdGU+Ci0gICAgPGk+UmFsZiBTLiBFbmdlbHNjaGFsbDwvaT48YnI+Ci0gICAgPGEgaHJlZj0ibWFpbHRvOnJzZUBlbmdlbHNjaGFsbC5jb20iPjx0dD5yc2VAZW5nZWxzY2hhbGwuY29tPC90dD48L2E+PGJyPgotICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuZW5nZWxzY2hhbGwuY29tL35yc2UiPjx0dD5odHRwOi8vd3d3LmVuZ2Vsc2NoYWxsLmNvbS9+cnNlPC9pPjwvYT4gCi08L2Jsb2NrcXVvdGU+Ci0KLTwhLS0laHlwZXJ0ZXh0IC0tPgotPEhSPgotPCEtLS8laHlwZXJ0ZXh0IC0tPgotCi08cD4KLTxoMj5EaXJlY3RpdmVzPC9oMj4KLQotPHVsPgotICAgIDxsaT48YSBocmVmPSIjUmV3cml0ZUVuZ2luZSI+UmV3cml0ZUVuZ2luZTwvYT4KLSAgICA8bGk+PGEgaHJlZj0iI1Jld3JpdGVPcHRpb25zIj5SZXdyaXRlT3B0aW9uczwvYT4KLSAgICA8bGk+PGEgaHJlZj0iI1Jld3JpdGVMb2ciPlJld3JpdGVMb2c8L2E+Ci0gICAgPGxpPjxhIGhyZWY9IiNSZXdyaXRlTG9nTGV2ZWwiPlJld3JpdGVMb2dMZXZlbDwvYT4KLSAgICA8bGk+PGEgaHJlZj0iI1Jld3JpdGVNYXAiPlJld3JpdGVNYXA8L2E+Ci0gICAgPGxpPjxhIGhyZWY9IiNSZXdyaXRlQmFzZSI+UmV3cml0ZUJhc2U8L2E+Ci0gICAgPGxpPjxhIGhyZWY9IiNSZXdyaXRlQ29uZCI+UmV3cml0ZUNvbmQ8L2E+Ci0gICAgPGxpPjxhIGhyZWY9IiNSZXdyaXRlUnVsZSI+UmV3cml0ZVJ1bGU8L2E+Ci08L3VsPgotCi08IS0tJWh5cGVydGV4dCAtLT4KLTxocj4KLTwhLS0vJWh5cGVydGV4dCAtLT4KLQotCi08Y2VudGVyPgotPGEgbmFtZT0iQ29uZmlndXJhdGlvbiI+Ci08aDE+Q29uZmlndXJhdGlvbiBEaXJlY3RpdmVzPC9oMT4KLTwvYT4KLTwvY2VudGVyPgotCi08YSBuYW1lPSJSZXdyaXRlRW5naW5lIj48aDM+UmV3cml0ZUVuZ2luZTwvaDM+PC9hPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IDxjb2RlPlJld3JpdGVFbmdpbmU8L2NvZGU+IHs8Y29kZT5vbixvZmY8L2NvZGU+fTxicj4KLTxzdHJvbmc+RGVmYXVsdDo8L3N0cm9uZz4gPHN0cm9uZz48Y29kZT5SZXdyaXRlRW5naW5lIG9mZjwvY29kZT48L3N0cm9uZz48YnI+Ci08c3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgcGVyLWRpcmVjdG9yeSBjb25maWc8YnI+Ci08cD4KLQotVGhlIDx0dD5SZXdyaXRlRW5naW5lPC90dD4gZGlyZWN0aXZlIGVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlCi1ydW50aW1lIHJld3JpdGluZyBlbmdpbmUuIElmIGl0IGlzIHNldCB0byA8Y29kZT5vZmY8L2NvZGU+IHRoaXMgbW9kdWxlIGRvZXMKLW5vIHJ1bnRpbWUgcHJvY2Vzc2luZyBhdCBhbGwuIEl0IGRvZXMgbm90IGV2ZW4gdXBkYXRlIHRoZSA8dHQ+U0NSSVBUX1VSeDwvdHQ+Ci1lbnZpcm9ubWVudCB2YXJpYWJsZXMuIAotCi08cD4KLVVzZSB0aGlzIGRpcmVjdGl2ZSB0byBkaXNhYmxlIHRoZSBtb2R1bGUgaW5zdGVhZCBvZiBjb21tZW50aW5nIG91dAotYWxsIDx0dD5SZXdyaXRlUnVsZTwvdHQ+IGRpcmVjdGl2ZXMhCi0KLTxwPgotPGhyIG5vc2hhZGUgc2l6ZT0xPgotPHA+Ci0KLTxhIG5hbWU9IlJld3JpdGVPcHRpb25zIj48aDM+UmV3cml0ZU9wdGlvbnM8L2gzPjwvYT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiA8Y29kZT5SZXdyaXRlT3B0aW9uczwvY29kZT4gPGVtPk9wdGlvbjwvZW0+IC4uLjxicj4KLTxzdHJvbmc+RGVmYXVsdDo8L3N0cm9uZz4gLTxlbT5Ob25lPC9lbT4tPGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIHBlci1kaXJlY3RvcnkgY29uZmlnPGJyPgotPHA+Ci0KLVRoZSA8dHQ+UmV3cml0ZU9wdGlvbjwvdHQ+IGRpcmVjdGl2ZSBzZXRzIHNvbWUgc3BlY2lhbCBvcHRpb25zIGZvciB0aGUKLWN1cnJlbnQgcGVyLXNlcnZlciBvciBwZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24uIFRoZSA8ZW0+T3B0aW9uPC9lbT4KLXN0cmluZ3MgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi08dWw+Ci08bGk+JzxzdHJvbmc+PGNvZGU+aW5oZXJpdDwvY29kZT48L3N0cm9uZz4nPGJyPgotCVRoaXMgZm9yY2VzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gdG8gaW5oZXJpdCB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUKLQlwYXJlbnQuIEluIHBlci12aXJ0dWFsLXNlcnZlciBjb250ZXh0IHRoaXMgbWVhbnMgdGhhdCB0aGUgbWFwcywKLQljb25kaXRpb25zIGFuZCBydWxlcyBvZiB0aGUgbWFpbiBzZXJ2ZXIgZ2V0cyBpbmhlcml0ZWQuIEluIHBlci1kaXJlY3RvcnkKLQljb250ZXh0IHRoaXMgbWVhbnMgdGhhdCBjb25kaXRpb25zIGFuZCBydWxlcyBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeSdzCi0JPHR0Pi5odGFjY2VzczwvdHQ+IGNvbmZpZ3VyYXRpb24gZ2V0cyBpbmhlcml0ZWQuCi08cD4KLTwvdWw+Ci0KLTxwPgotPGhyIG5vc2hhZGUgc2l6ZT0xPgotPHA+Ci0KLTxhIG5hbWU9IlJld3JpdGVMb2ciPjxoMz5SZXdyaXRlTG9nPC9oMz48L2E+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gPGNvZGU+UmV3cml0ZUxvZzwvY29kZT4gPGVtPkZpbGVuYW1lPC9lbT48YnI+Ci08c3Ryb25nPkRlZmF1bHQ6PC9zdHJvbmc+IC08ZW0+Tm9uZTwvZW0+LTxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PGJyPgotPHA+Ci0KLVRoZSA8dHQ+UmV3cml0ZUxvZzwvdHQ+IGRpcmVjdGl2ZSBzZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHdoaWNoIHRoZQotc2VydmVyIGxvZ3MgYW55IHJld3JpdGluZyBhY3Rpb25zIGl0IHBlcmZvcm1zLiBJZiB0aGUgbmFtZSBkb2VzIG5vdCBiZWdpbgotd2l0aCBhIHNsYXNoICgnPHR0Pi88L3R0PicpIHRoZW4gaXQgaXMgYXNzdW1lZCB0byBiZSByZWxhdGl2ZSB0byB0aGUKLTxlbT5TZXJ2ZXIgUm9vdDwvZW0+LiAgVGhlIGRpcmVjdGl2ZSBzaG91bGQgb2NjdXIgb25seSBvbmNlIHBlciBzZXJ2ZXIKLWNvbmZpZy4gCi0KLTxwPgotPHRhYmxlIHdpZHRoPTcwJSBib3JkZXI9MiBiZ2NvbG9yPSIjYzBjMGUwIiBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTEwPgotPHRyPjx0ZD4KLVRvIGRpc2FibGUgdGhlIGxvZ2dpbmcgb2YgcmV3cml0aW5nIGFjdGlvbnMgaXQgaXMgbm90IHJlY29tbWVuZGVkCi10byBzZXQgPGVtPkZpbGVuYW1lPC9lbT4KLXRvIDxjb2RlPi9kZXYvbnVsbDwvY29kZT4sIGJlY2F1c2UgYWx0aG91Z2ggdGhlIHJld3JpdGluZyBlbmdpbmUgZG9lcwotbm90IGNyZWF0ZSBvdXRwdXQgdG8gYSBsb2dmaWxlIGl0IHN0aWxsIGNyZWF0ZXMgdGhlIGxvZ2ZpbGUKLW91dHB1dCBpbnRlcm5hbGx5LiA8Yj5UaGlzIHdpbGwgc2xvdyBkb3duIHRoZSBzZXJ2ZXIgd2l0aCBubyBhZHZhbnRhZ2UgdG8gdGhlCi1hZG1pbmlzdHJhdG9yITwvYj4KLVRvIGRpc2FibGUgbG9nZ2luZyBlaXRoZXIgcmVtb3ZlIG9yIGNvbW1lbnQgb3V0IHRoZQotPHR0PlJld3JpdGVMb2c8L3R0PiBkaXJlY3RpdmUgb3IgdXNlIDx0dD5SZXdyaXRlTG9nTGV2ZWwgMDwvdHQ+IQotPC90ZD48L3RyPgotPC90YWJsZT4KLQotPHA+Ci08Yj5FeGFtcGxlOjwvYj4KLTxibG9ja3F1b3RlPgotPHByZT4KLVJld3JpdGVMb2cgIi91c3IvbG9jYWwvdmFyL2FwYWNoZS9sb2dzL3Jld3JpdGUubG9nIgotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KLTxwPgotPGhyIG5vc2hhZGUgc2l6ZT0xPgotPHA+Ci0KLTxhIG5hbWU9IlJld3JpdGVMb2dMZXZlbCI+PGgzPlJld3JpdGVMb2dMZXZlbDwvaDM+PC9hPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IDxjb2RlPlJld3JpdGVMb2dMZXZlbDwvY29kZT4gPGVtPkxldmVsPC9lbT48YnI+Ci08c3Ryb25nPkRlZmF1bHQ6PC9zdHJvbmc+IDxzdHJvbmc+PGNvZGU+UmV3cml0ZUxvZ0xldmVsIDA8L2NvZGU+PC9zdHJvbmc+PGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8YnI+Ci08cD4KLQotVGhlIDx0dD5SZXdyaXRlTG9nTGV2ZWw8L3R0PiBkaXJlY3RpdmUgc2V0IHRoZSB2ZXJib3NpdHkgbGV2ZWwgb2YgdGhlIHJld3JpdGluZwotbG9nZmlsZS4gIFRoZSBkZWZhdWx0IGxldmVsIDAgbWVhbnMgbm8gbG9nZ2luZywgd2hpbGUgOSBvciBtb3JlIG1lYW5zCi10aGF0IHByYWN0aWNhbGx5IGFsbCBhY3Rpb25zIGFyZSBsb2dnZWQuCi0KLTxwPgotVG8gZGlzYWJsZSB0aGUgbG9nZ2luZyBvZiByZXdyaXRpbmcgYWN0aW9ucyBzaW1wbHkgc2V0IDxlbT5MZXZlbDwvZW0+IHRvIDAuCi1UaGlzIGRpc2FibGVzIGFsbCByZXdyaXRlIGFjdGlvbiBsb2dzLgotCi08cD4KLTx0YWJsZSB3aWR0aD03MCUgYm9yZGVyPTIgYmdjb2xvcj0iI2MwYzBlMCIgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0xMD4KLTx0cj48dGQ+Ci08Yj5Ob3RpY2U6PC9iPiBVc2luZyBhIGhpZ2ggdmFsdWUgZm9yIDxpPkxldmVsPC9pPiB3aWxsIHNsb3cgZG93biB5b3VyIEFwYWNoZQotc2VydmVyIGRyYW1hdGljYWxseSEgVXNlIHRoZSByZXdyaXRpbmcgbG9nZmlsZSBvbmx5IGZvciBkZWJ1Z2dpbmcgb3IgYXQgbGVhc3QKLWF0IDxlbT5MZXZlbDwvZW0+IG5vdCBncmVhdGVyIHRoYW4gMiEKLTwvdGQ+PC90cj4KLTwvdGFibGU+Ci0KLQotPHA+Ci08Yj5FeGFtcGxlOjwvYj4KLTxibG9ja3F1b3RlPgotPHByZT4KLVJld3JpdGVMb2dMZXZlbCAzCi08L3ByZT4KLTwvYmxvY2txdW90ZT4KLQotPHA+Ci08aHIgbm9zaGFkZSBzaXplPTE+Ci08cD4KLQotPGEgbmFtZT0iUmV3cml0ZU1hcCI+PGgzPlJld3JpdGVNYXA8L2gzPjwvYT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiA8Y29kZT5SZXdyaXRlTWFwPC9jb2RlPiA8ZW0+TWFwbmFtZTwvZW0+IDxjb2RlPnt0eHQsZGJtLHByZ306PC9jb2RlPjxlbT5GaWxlbmFtZTwvZW0+PGJyPgotPHN0cm9uZz5EZWZhdWx0Ojwvc3Ryb25nPiBub3QgdXNlZCBwZXIgZGVmYXVsdDxicj4KLTxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PGJyPgotPHA+Ci0KLVRoZSA8dHQ+UmV3cml0ZU1hcDwvdHQ+IGRpcmVjdGl2ZSBkZWZpbmVzIGFuIGV4dGVybmFsIDxlbT5SZXdyaXRpbmcgTWFwPC9lbT4KLXdoaWNoIGNhbiBiZSB1c2VkIGluc2lkZSBydWxlIHN1YnN0aXR1dGlvbiBzdHJpbmdzIGJ5IHRoZSBtYXBwaW5nLWZ1bmN0aW9ucwotdG8gaW5zZXJ0L3N1YnN0aXR1dGUgZmllbGRzIHRocm91Z2ggYSBrZXkgbG9va3VwLgotPHA+Ci0KLVRoZSA8YSBuYW1lPSJtYXBmdW5jIj48ZW0+TWFwbmFtZTwvZW0+PC9hPiBpcyB0aGUgbmFtZSBvZiB0aGUgbWFwIGFuZCB3aWxsCi1iZSB1c2VkIHRvIHNwZWNpZnkgYSBtYXBwaW5nLWZ1bmN0aW9uIGZvciB0aGUgc3Vic3RpdHV0aW9uIHN0cmluZ3Mgb2YgYQotcmV3cml0aW5nIHJ1bGUgdmlhCi0KLTxibG9ja3F1b3RlPjxzdHJvbmc+Ci08Y29kZT4kezwvY29kZT4gPGVtPk1hcG5hbWU8L2VtPiA8Y29kZT46PC9jb2RlPiA8ZW0+TG9va3VwS2V5PC9lbT4KLTxjb2RlPnw8L2NvZGU+IDxlbT5EZWZhdWx0VmFsdWU8L2VtPiA8Y29kZT59PC9jb2RlPgotPC9zdHJvbmc+PC9ibG9ja3F1b3RlPgotCi1XaGVuIHN1Y2ggYSBkaXJlY3RpdmUgb2NjdXJzIHRoZSBtYXAgPGVtPk1hcG5hbWU8L2VtPgotaXMgY29uc3VsdGVkIGFuZCB0aGUga2V5IDxlbT5Mb29rdXBLZXk8L2VtPiBpcyBsb29rZWQtdXAuIElmIHRoZSBrZXkgaXMKLWZvdW5kLCB0aGUgbWFwLWZ1bmN0aW9uIGRpcmVjdGl2ZSBpcyBzdWJzdGl0dXRlZCBieSA8ZW0+U3Vic3RWYWx1ZTwvZW0+LiBJZgotdGhlIGtleSBpcyBub3QgZm91bmQgdGhlbiBpdCBpcyBzdWJzdGl0dXRlZCBieSA8ZW0+RGVmYXVsdFZhbHVlPC9lbT4uCi0KLTxwPgotVGhlIDxlbT5GaWxlbmFtZTwvZW0+IG11c3QgYmUgYSB2YWxpZCBVbml4IGZpbGVwYXRoLCBjb250YWluaW5nIG9uZQotb2YgdGhlIGZvbGxvd2luZyBmb3JtYXRzOgotCi08b2w+Ci08bGk+PGI+UGxhaW4gVGV4dCBGb3JtYXQ8L2I+Ci0gICAgPHA+Ci0gICAgVGhpcyBpcyBhIEFTQ0lJIGZpbGUgd2hpY2ggY29udGFpbnMgZWl0aGVyIGJsYW5rIGxpbmVzLCBjb21tZW50IGxpbmVzCi0gICAgKHN0YXJ0aW5nIHdpdGggYSAnIycgY2hhcmFjdGVyKSBvcgotCi0gICAgPGJsb2NrcXVvdGU+PHN0cm9uZz4KLSAgICA8ZW0+TWF0Y2hpbmdLZXk8L2VtPiAgPGVtPlN1YnN0VmFsdWU8L2VtPgotICAgIDwvc3Ryb25nPjwvYmxvY2txdW90ZT4KLQotICAgIHBhaXJzIC0gb25lIHBlciBsaW5lLiBZb3UgY2FuIGNyZWF0ZSBzdWNoIGZpbGVzIGVpdGhlciBtYW51YWxseSwKLSAgICB1c2luZyB5b3VyIGZhdm9yaXRlIGVkaXRvciwgb3IgYnkgdXNpbmcgdGhlIHByb2dyYW1zCi0gICAgPHR0Pm1hcGNvbGxlY3Q8L3R0PiBhbmQgPHR0Pm1hcG1lcmdlPC90dD4gZnJvbSB0aGUgPHR0PnN1cHBvcnQ8L3R0PgotICAgIGRpcmVjdG9yeSBvZiB0aGUgPGI+bW9kX3Jld3JpdGU8L2I+IGRpc3RyaWJ1dGlvbi4KLSAgICA8cD4KLSAgICBUbyBkZWNsYXJlIHN1Y2ggYSBtYXAgcHJlZml4LCA8ZW0+RmlsZW5hbWU8L2VtPiB3aXRoIGEgPGNvZGU+dHh0OjwvY29kZT4KLSAgICBzdHJpbmcgYXMgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgotCi08cD4KLTx0YWJsZSBib3JkZXI9MiBjZWxsc3BhY2luZz0xIGNlbGxwYWRkaW5nPTUgYmdjb2xvcj0iI2QwZDBkMCI+Ci08dHI+PHRkPjxwcmU+Ci0jCi0jICAgbWFwLnJlYWwtdG8tdXNlciAtLSBtYXBzIHJlYWxuYW1lcyB0byB1c2VybmFtZXMKLSMKLQotUmFsZi5TLkVuZ2Vsc2NoYWxsICAgIHJzZSAgICMgQmFzdGFyZCBPcGVyYXRvciBGcm9tIEhlbGwgCi1Eci5GcmVkLktsYWJ1c3RlciAgICAgZnJlZCAgIyBNci4gREFVCi08L3ByZT48L3RkPjwvdHI+Ci08L3RhYmxlPgotCi08cD4KLTx0YWJsZSBib3JkZXI9MiBjZWxsc3BhY2luZz0xIGNlbGxwYWRkaW5nPTUgYmdjb2xvcj0iI2QwZDBkMCI+Ci08dHI+PHRkPjxwcmU+Ci1SZXdyaXRlTWFwIHJlYWwtdG8taG9zdCB0eHQ6L3BhdGgvdG8vZmlsZS9tYXAucmVhbC10by11c2VyCi08L3ByZT48L3RkPjwvdHI+Ci08L3RhYmxlPgotCi08cD4KLTxsaT48Yj5EQk0gSGFzaGZpbGUgRm9ybWF0PC9iPgotICAgIDxwPgotICAgIFRoaXMgaXMgYSBiaW5hcnkgTkRCTSBmb3JtYXQgZmlsZSBjb250YWluaW5nIHRoZQotICAgIHNhbWUgY29udGVudHMgYXMgdGhlIDxlbT5QbGFpbiBUZXh0IEZvcm1hdDwvYj4gZmlsZXMuIFlvdSBjYW4gY3JlYXRlCi0gICAgc3VjaCBhIGZpbGUgd2l0aCBhbnkgTkRCTSB0b29sIG9yIHdpdGggdGhlIDx0dD5kYm1tYW5hZ2U8L3R0PiBwcm9ncmFtCi0gICAgZnJvbSB0aGUgPHR0PnN1cHBvcnQ8L3R0PiBkaXJlY3Rvcnkgb2YgdGhlIEFwYWNoZSBkaXN0cmlidXRpb24uCi0gICAgPHA+Ci0gICAgVG8gZGVjbGFyZSBzdWNoIGEgbWFwIHByZWZpeCA8ZW0+RmlsZW5hbWU8L2VtPiB3aXRoIGEgPGNvZGU+ZGJtOjwvY29kZT4KLSAgICBzdHJpbmcuCi08cD4KLTxsaT48Yj5Qcm9ncmFtIEZvcm1hdDwvYj4KLSAgICA8cD4KLSAgICBUaGlzIGlzIGEgVW5peCBleGVjdXRhYmxlLCBub3QgYSBsb29rdXAgZmlsZS4gIFRvIGNyZWF0ZSBpdCB5b3UgY2FuIHVzZQotICAgIHRoZSBsYW5ndWFnZSBvZiB5b3VyIGNob2ljZSwgYnV0IHRoZSByZXN1bHQgaGFzIHRvIGJlIGEgcnVuYWJsZSBVbml4Ci0gICAgYmluYXJ5IChpLmUuIGVpdGhlciBvYmplY3QtY29kZSBvciBhIHNjcmlwdCB3aXRoIHRoZQotICAgIG1hZ2ljIGNvb2tpZSB0cmljayAnPHR0PiMhL3BhdGgvdG8vaW50ZXJwcmV0ZXI8L3R0PicgYXMgdGhlIGZpcnN0IGxpbmUpLgotICAgIDxwPgotICAgIFRoaXMgcHJvZ3JhbSBnZXRzIHN0YXJ0ZWQgb25jZSBhdCBzdGFydHVwIG9mIHRoZSBBcGFjaGUgc2VydmVycyBhbmQgdGhlbgotICAgIGNvbW11bmljYXRlcyB3aXRoIHRoZSByZXdyaXRpbmcgZW5naW5lIG92ZXIgaXRzIDx0dD5zdGRpbjwvdHQ+IGFuZAotICAgIDx0dD5zdGRvdXQ8L3R0PiBmaWxlaGFuZGxlcy4gIEZvciBlYWNoIG1hcC1mdW5jdGlvbiBsb29rdXAgaXQgd2lsbAotICAgIHJlY2VpdmUgdGhlIGtleSB0byBsb29rdXAgYXMgYSBuZXdsaW5lLXRlcm1pbmF0ZWQgc3RyaW5nIG9uCi0gICAgPHR0PnN0ZGluPC90dD4uIEl0IHRoZW4gaGFzIHRvIGdpdmUgYmFjayB0aGUgbG9va2VkLXVwIHZhbHVlIGFzIGEKLSAgICBuZXdsaW5lLXRlcm1pbmF0ZWQgc3RyaW5nIG9uIDx0dD5zdGRvdXQ8L3R0PiBvciB0aGUgZm91ci1jaGFyYWN0ZXIgc3RyaW5nCi0gICAgYGA8dHQ+TlVMTDwvdHQ+JycgaWYgaXQgZmFpbHMgKGkuZS4gdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyB2YWx1ZQotICAgIGZvciB0aGUgZ2l2ZW4ga2V5KS4gQSB0cml2aWFsIHByb2dyYW0gd2hpY2ggd2lsbCBpbXBsZW1lbnQgYSAxOjEgbWFwCi0gICAgKGkuZS4ga2V5ID09IHZhbHVlKSBjb3VsZCBiZToKLSAgICA8cD4KLTx0YWJsZSBib3JkZXI9MiBjZWxsc3BhY2luZz0xIGNlbGxwYWRkaW5nPTUgYmdjb2xvcj0iI2QwZDBkMCI+Ci08dHI+PHRkPjxwcmU+Ci0jIS91c3IvYmluL3BlcmwKLSR8ID0gMTsKLXdoaWxlICgmbHQ7U1RESU4mZ3Q7KSB7Ci0gICAgIyAuLi5oZXJlIGFueSB0cmFuc2Zvcm1hdGlvbnMgCi0gICAgIyBvciBsb29rdXBzIHNob3VsZCBvY2N1ci4uLgotICAgIHByaW50ICRfOwotfQotPC9wcmU+PC90ZD48L3RyPgotPC90YWJsZT4KLSAgICA8cD4KLSAgICA8Yj5CdXQgYmUgdmVyeSBjYXJlZnVsOjwvYj48YnI+Ci0gICAgPG9sPgotICAgIDxsaT5gYDxpPktlZXAgdGhlIHByb2dyYW0gc2ltcGxlLCBzdHVwaWQ8L2k+JycgKEtJU1MpLCBiZWNhdXNlCi0gICAgICAgIGlmIHRoaXMgcHJvZ3JhbSBoYW5ncyBpdCB3aWxsIGxlYWQgdG8gYSBoYW5nIG9mIHRoZSBBcGFjaGUgc2VydmVyCi0gICAgICAgIHdoZW4gdGhlIHJ1bGUgb2NjdXJzLgotICAgIDxsaT5Bdm9pZCBvbmUgY29tbW9uIG1pc3Rha2U6IG5ldmVyIGRvIGJ1ZmZlcmVkIEkvTyBvbiA8dHQ+c3Rkb3V0PC90dD4hCi0gICAgVGhpcyB3aWxsIGNhdXNlIGEgZGVhZGxvb3AhIEhlbmNlIHRoZSBgYDx0dD4kfD0xPC90dD4nJyBpbiB0aGUgYWJvdmUKLSAgICBleGFtcGxlLi4uCi0gICAgPC9vbD4KLSAgICA8cD4KLSAgICBUbyBkZWNsYXJlIHN1Y2ggYSBtYXAgcHJlZml4IDxlbT5GaWxlbmFtZTwvZW0+IHdpdGggYSA8Y29kZT5wcmc6PC9jb2RlPgotICAgIHN0cmluZy4KLTwvb2w+Ci0KLVRoZSA8dHQ+UmV3cml0ZU1hcDwvdHQ+IGRpcmVjdGl2ZSBjYW4gb2NjdXIgbW9yZSB0aGFuIG9uY2UuIEZvciBlYWNoCi1tYXBwaW5nLWZ1bmN0aW9uIHVzZSBvbmUgPHR0PlJld3JpdGVNYXA8L3R0PiBkaXJlY3RpdmUgdG8gZGVjbGFyZSBpdHMKLXJld3JpdGluZyBtYXBmaWxlLiBXaGlsZSB5b3UgY2Fubm90IDxiPmRlY2xhcmU8L2I+IGEgbWFwIGluIHBlci1kaXJlY3RvcnkKLWNvbnRleHQgaXQgaXMgb2YgY291cnNlIHBvc3NpYmxlIHRvIDxiPnVzZTwvYj4gdGhpcyBtYXAgaW4gcGVyLWRpcmVjdG9yeQotY29udGV4dC4gIAotCi08cD4KLTx0YWJsZSB3aWR0aD03MCUgYm9yZGVyPTIgYmdjb2xvcj0iI2MwYzBlMCIgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0xMD4KLTx0cj48dGQ+Ci1Gb3IgcGxhaW4gdGV4dCBhbmQgREJNIGZvcm1hdCBmaWxlcyB0aGUgbG9va2VkLXVwIGtleXMgYXJlIGNhY2hlZCBpbi1jb3JlCi11bnRpbCB0aGUgPHR0Pm10aW1lPC90dD4gb2YgdGhlIG1hcGZpbGUgY2hhbmdlcyBvciB0aGUgc2VydmVyIGRvZXMgYQotcmVzdGFydC4gVGhpcyB3YXkgeW91IGNhbiBoYXZlIG1hcC1mdW5jdGlvbnMgaW4gcnVsZXMgd2hpY2ggYXJlIHVzZWQKLWZvciA8Yj5ldmVyeTwvYj4gcmVxdWVzdC4gVGhpcyBpcyBubyBwcm9ibGVtLCBiZWNhdXNlIHRoZSBleHRlcm5hbCBsb29rdXAKLW9ubHkgaGFwcGVucyBvbmNlIQotPC90ZD48L3RyPgotPC90YWJsZT4KLQotCi08cD4KLTxociBub3NoYWRlIHNpemU9MT4KLTxwPgotCi08YSBuYW1lPSJSZXdyaXRlQmFzZSI+PGgzPlJld3JpdGVCYXNlPC9oMz48L2E+Ci08c3Ryb25nPlN5bnRheDo8L3N0cm9uZz4gPGNvZGU+UmV3cml0ZUJhc2U8L2NvZGU+IDxlbT5CYXNlVVJMPC9lbT48YnI+Ci08c3Ryb25nPkRlZmF1bHQ6PC9zdHJvbmc+IDxlbT5kZWZhdWx0IGlzIHRoZSBwaHlzaWNhbCBkaXJlY3RvcnkgcGF0aDwvZW0+PGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBwZXItZGlyZWN0b3J5IGNvbmZpZzxicj4KLTxwPgotCi1UaGUgPHR0PlJld3JpdGVCYXNlPC90dD4gZGlyZWN0aXZlIGV4cGxpY2l0bHkgc2V0cyB0aGUgYmFzZSBVUkwgZm9yCi1wZXItZGlyZWN0b3J5IHJld3JpdGVzLiBBcyB5b3Ugd2lsbCBzZWUgYmVsb3csIDx0dD5SZXdyaXRlUnVsZTwvdHQ+IGNhbiBiZQotdXNlZCBpbiBwZXItZGlyZWN0b3J5IGNvbmZpZyBmaWxlcyAoPHR0Pi5odGFjY2VzczwvdHQ+KS4gVGhlcmUgaXQgd2lsbCBhY3QKLWxvY2FsbHksIGkuZS4gdGhlIGxvY2FsIGRpcmVjdG9yeSBwcmVmaXggaXMgc3RyaXBwZWQgYXQgdGhpcyBzdGFnZSBvZgotcHJvY2Vzc2luZyBhbmQgeW91ciByZXdyaXRpbmcgcnVsZXMgYWN0IG9ubHkgb24gdGhlIHJlbWFpbmRlci4gQXQgdGhlIGVuZAotaXQgaXMgYXV0b21hdGljYWxseSBhZGRlZC4KLQotPHA+Ci1XaGVuIGEgc3Vic3RpdHV0aW9uIG9jY3VycyBmb3IgYSBuZXcgVVJMLCB0aGlzIG1vZHVsZSBoYXMgdG8KLXJlLWluamVjdCB0aGUgVVJMIGludG8gdGhlIHNlcnZlciBwcm9jZXNzaW5nLiBUbyBiZSBhYmxlIHRvIGRvIHRoaXMgaXQgbmVlZHMKLXRvIGtub3cgd2hhdCB0aGUgY29ycmVzcG9uZGluZyBVUkwtcHJlZml4IG9yIFVSTC1iYXNlIGlzLiBCeSBkZWZhdWx0IHRoaXMKLXByZWZpeCBpcyB0aGUgY29ycmVzcG9uZGluZyBmaWxlcGF0aCBpdHNlbGYuIDxiPkJ1dCBhdCBtb3N0IHdlYnNpdGVzIFVSTHMgYXJlCi08Yj5OT1Q8L2I+IGRpcmVjdGx5IHJlbGF0ZWQgdG8gcGh5c2ljYWwgZmlsZW5hbWUgcGF0aHMsIHNvIHRoaXMgYXNzdW1wdGlvbgotd2lsbCBiZSB1c3VhbGx5IGJlIHdyb25nITwvYj4gVGhlcmUgeW91IGhhdmUgdG8gdXNlIHRoZSA8dHQ+UmV3cml0ZUJhc2U8L3R0PgotZGlyZWN0aXZlIHRvIHNwZWNpZnkgdGhlIGNvcnJlY3QgVVJMLXByZWZpeC4gCi0KLTxwPgotPHRhYmxlIHdpZHRoPTcwJSBib3JkZXI9MiBiZ2NvbG9yPSIjYzBjMGUwIiBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTEwPgotPHRyPjx0ZD4KLVNvLCBpZiB5b3VyIHdlYnNlcnZlcidzIFVSTHMgYXJlIDxiPm5vdDwvYj4gZGlyZWN0bHkKLXJlbGF0ZWQgdG8gcGh5c2ljYWwgZmlsZSBwYXRocywgeW91IGhhdmUgdG8gdXNlIDx0dD5SZXdyaXRlQmFzZTwvdHQ+IGluIGV2ZXJ5Ci08dHQ+Lmh0YWNjZXNzPC90dD4gZmlsZXMgd2hlcmUgeW91IHdhbnQgdG8gdXNlIDx0dD5SZXdyaXRlUnVsZTwvdHQ+Ci1kaXJlY3RpdmVzLgotPC90ZD48L3RyPgotPC90YWJsZT4KLQotPHA+Ci08Yj5FeGFtcGxlOjwvYj4KLQotPGJsb2NrcXVvdGU+Ci0gICBBc3N1bWUgdGhlIGZvbGxvd2luZyBwZXItZGlyZWN0b3J5IGNvbmZpZyBmaWxlOgotCi08cD4KLTx0YWJsZSBib3JkZXI9MiBjZWxsc3BhY2luZz0xIGNlbGxwYWRkaW5nPTUgYmdjb2xvcj0iI2QwZDBkMCI+Ci08dHI+PHRkPjxwcmU+Ci0jCi0jICAvYWJjL2RlZi8uaHRhY2Nlc3MgLS0gcGVyLWRpciBjb25maWcgZmlsZSBmb3IgZGlyZWN0b3J5IC9hYmMvZGVmCi0jICBSZW1lbWJlcjogL2FiYy9kZWYgaXMgdGhlIHBoeXNpY2FsIHBhdGggb2YgL3h5eiwgaS5lLiB0aGUgc2VydmVyCi0jICAgICAgICAgICAgaGFzIGEgJ0FsaWFzIC94eXogL2FiYy9kZWYnIGRpcmVjdGl2ZSBlLmcuCi0jCi0KLVJld3JpdGVFbmdpbmUgT24KLQotIyAgbGV0IHRoZSBzZXJ2ZXIga25vdyB0aGF0IHdlIGFyZSByZWFjaGVkIHZpYSAveHl6IGFuZCBub3QgCi0jICB2aWEgdGhlIHBoeXNpY2FsIHBhdGggcHJlZml4IC9hYmMvZGVmCi1SZXdyaXRlQmFzZSAgIC94eXoKLQotIyAgbm93IHRoZSByZXdyaXRpbmcgcnVsZXMKLVJld3JpdGVSdWxlICAgXm9sZHN0dWZmXC5odG1sJCAgbmV3c3R1ZmYuaHRtbAotPC9wcmU+PC90ZD48L3RyPgotPC90YWJsZT4KLQotPHA+Ci1JbiB0aGUgYWJvdmUgZXhhbXBsZSwgYSByZXF1ZXN0IHRvIDx0dD4veHl6L29sZHN0dWZmLmh0bWw8L3R0PiBnZXRzIGNvcnJlY3RseQotcmV3cml0dGVuIHRvIHRoZSBwaHlzaWNhbCBmaWxlIDx0dD4vYWJjL2RlZi9uZXdzdHVmZi5odG1sPC90dD4uIAotCi08cD4KLTx0YWJsZSB3aWR0aD03MCUgYm9yZGVyPTIgYmdjb2xvcj0iI2MwYzBlMCIgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0xMD4KLTx0cj48dGQ+Ci08Zm9udCBzaXplPS0xPgotPGI+Rm9yIHRoZSBBcGFjaGUgaGFja2Vyczo8L2I+PGJyPgotVGhlIGZvbGxvd2luZyBsaXN0IGdpdmVzIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnRlcm5hbAotcHJvY2Vzc2luZyBzdGVwczoKLQotPHA+Ci08cHJlPgotUmVxdWVzdDoKLSAgL3h5ei9vbGRzdHVmZi5odG1sCi0KLUludGVybmFsIFByb2Nlc3Npbmc6Ci0gIC94eXovb2xkc3R1ZmYuaHRtbCAgICAgLT4gL2FiYy9kZWYvb2xkc3R1ZmYuaHRtbCAgICAocGVyLXNlcnZlciBBbGlhcykKLSAgL2FiYy9kZWYvb2xkc3R1ZmYuaHRtbCAtPiAvYWJjL2RlZi9uZXdzdHVmZi5odG1sICAgIChwZXItZGlyICAgIFJld3JpdGVSdWxlKQotICAvYWJjL2RlZi9uZXdzdHVmZi5odG1sIC0+IC94eXovbmV3c3R1ZmYuaHRtbCAgICAgICAgKHBlci1kaXIgICAgUmV3cml0ZUJhc2UpCi0gIC94eXovbmV3c3R1ZmYuaHRtbCAgICAgLT4gL2FiYy9kZWYvbmV3c3R1ZmYuaHRtbCAgICAocGVyLXNlcnZlciBBbGlhcykKLQotUmVzdWx0OgotICAvYWJjL2RlZi9uZXdzdHVmZi5odG1sCi08L3ByZT4KLQotVGhpcyBzZWVtcyB2ZXJ5IGNvbXBsaWNhdGVkIGJ1dCBpcyB0aGUgY29ycmVjdCBBcGFjaGUgaW50ZXJuYWwgcHJvY2Vzc2luZywKLWJlY2F1c2UgdGhlIHBlci1kaXJlY3RvcnkgcmV3cml0aW5nIGNvbWVzIHRvbyBsYXRlIGluIHRoZSBwcm9jZXNzLiAgU28sCi13aGVuIGl0IG9jY3VycyB0aGUgKHJld3JpdHRlbikgcmVxdWVzdCBoYXMgdG8gYmUgcmUtaW5qZWN0ZWQgaW50byB0aGUgQXBhY2hlCi1rZXJuZWwhIEJVVDogV2hpbGUgdGhpcyBzZWVtcyBsaWtlIGEgc2VyaW91cyBvdmVyaGVhZCwgaXQgcmVhbGx5IGlzbid0LCBiZWNhdXNlCi10aGlzIHJlLWluamVjdGlvbiBoYXBwZW5zIGZ1bGx5IGludGVybmFsIHRvIHRoZSBBcGFjaGUgc2VydmVyIGFuZCB0aGUgc2FtZQotcHJvY2VkdXJlIGlzIHVzZWQgYnkgbWFueSBvdGhlciBvcGVyYXRpb25zIGluc2lkZSBBcGFjaGUuIFNvLCB5b3UgY2FuIGJlIAotc3VyZSB0aGUgZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBpcyBjb3JyZWN0LgotPC9mb250PgotPC90ZD48L3RyPgotPC90YWJsZT4KLQotPC9ibG9ja3F1b3RlPgotCi0KLTxwPgotPGhyIG5vc2hhZGUgc2l6ZT0xPgotPHA+Ci0KLTxhIG5hbWU9IlJld3JpdGVDb25kIj48aDM+UmV3cml0ZUNvbmQ8L2gzPjwvYT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiA8Y29kZT5SZXdyaXRlQ29uZDwvY29kZT4gPGVtPlRlc3RTdHJpbmc8L2VtPiA8ZW0+Q29uZFBhdHRlcm48L2VtPjxicj4KLTxzdHJvbmc+RGVmYXVsdDo8L3N0cm9uZz4gLTxlbT5Ob25lPC9lbT4tPGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIHBlci1kaXJlY3RvcnkgY29uZmlnPGJyPgotPHA+Ci0KLVRoZSA8dHQ+UmV3cml0ZUNvbmQ8L3R0PiBkaXJlY3RpdmUgZGVmaW5lcyBhIHJ1bGUgY29uZGl0aW9uLiBQcmVjZWRlIGEKLTx0dD5SZXdyaXRlUnVsZTwvdHQ+IGRpcmVjdGl2ZSB3aXRoIG9uZSBvcmUgbW9yZSA8dD5SZXdyaXRlQ29uZDwvdHQ+Ci1kaXJlY3RpdmVzLgotCi1UaGUgZm9sbG93aW5nIHJld3JpdGluZyBydWxlIGlzIG9ubHkgdXNlZCBpZiBpdHMgcGF0dGVybiBtYXRjaGVzIHRoZSBjdXJyZW50Ci1zdGF0ZSBvZiB0aGUgVVJJIDxiPkFORDwvYj4gaWYgdGhlc2UgYWRkaXRpb25hbCBjb25kaXRpb25zIGFwcGx5LCB0b28uCi0KLTxwPgotPGVtPlRlc3RTdHJpbmc8L2VtPiBpcyBhIHN0cmluZyB3aGljaCBjb250YWlucyBzZXJ2ZXItdmFyaWFibGVzIG9mIHRoZSBmb3JtCi0KLTxibG9ja3F1b3RlPjxzdHJvbmc+Ci08dHQ+JXs8L3R0PiA8ZW0+TkFNRV9PRl9WQVJJQUJMRTwvZW0+IDx0dD59PC90dD4gCi08L3N0cm9uZz48L2Jsb2NrcXVvdGU+Ci0KLXdoZXJlIDxlbT5OQU1FX09GX1ZBUklBQkxFPC9lbT4gY2FuIGJlIGEgc3RyaW5nCi1vZiB0aGUgZm9sbG93aW5nIGxpc3Q6Ci0KLTxwPgotPHRhYmxlIGJnY29sb3I9IiNkMGQwZDAiIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRpbmc9NT4KLTx0cj4KLTx0ZCB2YWxpZ249dG9wPgotPGI+SFRUUCBoZWFkZXJzOjwvYj48cD4KLTxmb250IHNpemU9LTE+Ci1IVFRQX1VTRVJfQUdFTlQ8YnI+Ci1IVFRQX1JFRkVSRVI8YnI+Ci1IVFRQX0NPT0tJRTxicj4KLUhUVFBfRk9SV0FSREVEPGJyPgotSFRUUF9IT1NUPGJyPgotSFRUUF9QUk9YWV9DT05ORUNUSU9OPGJyPgotSFRUUF9BQ0NFUFQ8YnI+Ci08L2ZvbnQ+Ci08L3RkPgotCi08dGQgdmFsaWduPXRvcD4KLTxiPmNvbm5lY3Rpb24gJmFtcDsgcmVxdWVzdDo8L2I+PHA+Ci08Zm9udCBzaXplPS0xPgotUkVNT1RFX0FERFI8YnI+Ci1SRU1PVEVfSE9TVDxicj4KLVJFTU9URV9VU0VSPGJyPgotUkVNT1RFX0lERU5UPGJyPgotUkVRVUVTVF9NRVRIT0Q8YnI+Ci1TQ1JJUFRfRklMRU5BTUU8YnI+Ci1QQVRIX0lORk88YnI+Ci1RVUVSWV9TVFJJTkc8YnI+Ci1BVVRIX1RZUEU8YnI+Ci08L2ZvbnQ+Ci08L3RkPgotCi08L3RyPgotPHRyPgotCi08dGQgdmFsaWduPXRvcD4KLTxiPnNlcnZlciBpbnRlcm5hbHM6PC9iPjxwPgotPGZvbnQgc2l6ZT0tMT4KLURPQ1VNRU5UX1JPT1Q8YnI+Ci1TRVJWRVJfQURNSU48YnI+Ci1TRVJWRVJfTkFNRTxicj4KLVNFUlZFUl9QT1JUPGJyPgotU0VSVkVSX1BST1RPQ09MPGJyPgotU0VSVkVSX1NPRlRXQVJFPGJyPgotU0VSVkVSX1ZFUlNJT048YnI+Ci08L2ZvbnQ+Ci08L3RkPgotCi08dGQgdmFsaWduPXRvcD4KLTxiPnN5c3RlbSBzdHVmZjo8L2I+PHA+Ci08Zm9udCBzaXplPS0xPgotVElNRV9ZRUFSPGJyPgotVElNRV9NT048YnI+Ci1USU1FX0RBWTxicj4KLVRJTUVfSE9VUjxicj4KLVRJTUVfTUlOPGJyPgotVElNRV9TRUM8YnI+Ci1USU1FX1dEQVk8YnI+Ci08L2ZvbnQ+Ci08L3RkPgotCi08dGQgdmFsaWduPXRvcD4KLTxiPnNwZWNpYWxzOjwvYj48cD4KLTxmb250IHNpemU9LTE+Ci1BUElfVkVSU0lPTjxicj4KLVRIRV9SRVFVRVNUPGJyPgotUkVRVUVTVF9VUkk8YnI+Ci1SRVFVRVNUX0ZJTEVOQU1FPGJyPgotPC9mb250PgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotCi08cD4KLTx0YWJsZSB3aWR0aD03MCUgYm9yZGVyPTIgYmdjb2xvcj0iI2MwYzBlMCIgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0xMD4KLTx0cj48dGQ+Ci1UaGVzZSB2YXJpYWJsZXMgYWxsIGNvcnJlc3BvbmQgdG8gdGhlIHNpbWlsYXIgbmFtZWQgSFRUUCBNSU1FLWhlYWRlcnMsIEMKLXZhcmlhYmxlcyBvZiB0aGUgQXBhY2hlIHNlcnZlciBvciA8dHQ+c3RydWN0IHRtPC90dD4gZmllbGRzIG9mIHRoZSBVbml4Ci1zeXN0ZW0uCi08L3RkPjwvdHI+Ci08L3RhYmxlPgotCi08cD4KLVNwZWNpYWwgTm90ZXM6Ci08b2w+Ci08bGk+VGhlIHZhcmlhYmxlcyBTQ1JJUFRfRklMRU5BTUUgYW5kIFJFUVVFU1RfRklMRU5BTUUgY29udGFpbiB0aGUgc2FtZQotdmFsdWUsIGkuZS4gdGhlIHZhbHVlIG9mIHRoZSA8dHQ+ZmlsZW5hbWU8L3R0PiBmaWVsZCBvZiB0aGUgaW50ZXJuYWwKLTx0dD5yZXF1ZXN0X3JlYzwvdHQ+IHN0cnVjdHVyZSBvZiB0aGUgQXBhY2hlIHNlcnZlci4gVGhlIGZpcnN0IG5hbWUgaXMganVzdCB0aGUKLWNvbW1vbmx5IGtub3duIENHSSB2YXJpYWJsZSBuYW1lIHdoaWxlIHRoZSBzZWNvbmQgaXMgdGhlIGNvbnNpc3RlbnQKLWNvdW50ZXJwYXJ0IHRvIFJFUVVFU1RfVVJJICh3aGljaCBjb250YWlucyB0aGUgdmFsdWUgb2YgdGhlIDx0dD51cmk8L3R0PgotZmllbGQgb2YgPHR0PnJlcXVlc3RfcmVjPC90dD4pLgotCi08cD4KLTxsaT5UaGVyZSBpcyBhbiBhZGRpdGlvbmFsIGZvcm1hdDogPHR0PiV7RU5WOnZhcmlhYmxlfTwvdHQ+IHdoZXJlCi08aT52YXJpYWJsZTwvaT4gY2FuIGJlIGFueSBVbml4IGVudmlyb25tZW50IHZhcmlhYmxlLiBUaGlzIGlzIGxvb2tlZC11cAotdmlhIDx0dD5nZXRlbnYoKTwvdHQ+IGZyb20gdGhlIEFwYWNoZSBzZXJ2ZXIgcHJvY2Vzcy4KLQotPHA+Ci08bGk+VGhlcmUgaXMgb25lIG1vcmUgYWRkaXRpb25hbCBmb3JtYXQ6IDx0dD4le0hUVFA6aGVhZGVyfTwvdHQ+IHdoZXJlCi08aT5oZWFkZXI8L2k+IGNhbiBiZSBhbnkgSFRUUCBNSU1FLWhlYWRlciBuYW1lLiBUaGlzIGlzIGxvb2tlZC11cAotZnJvbSB0aGUgSFRUUCByZXF1ZXN0LiBFeGFtcGxlOiA8dHQ+JXtIVFRQOlByb3h5LUNvbm5lY3Rpb259PC90dD4KLWlzIHRoZSB2YWx1ZSBvZiB0aGUgSFRUUCBoZWFkZXIgYGA8dHQ+UHJveHktQ29ubmVjdGlvbjo8L3R0PicnLgotPC9vbD4KLQotCi08cD4KLTxlbT5Db25kUGF0dGVybjwvZW0+IGlzIHRoZSBjb25kaXRpb24gcGF0dGVybiwgaS5lLiBhIHJlZ3VsYXIgZXhwcmVzc2lvbgotd2hpY2ggZ2V0cyBhcHBsaWVkIHRvIHRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoZSA8ZW0+VGVzdFN0cmluZzwvZW0+LCBpLmUuCi08ZW0+VGVzdFN0cmluZzwvZW0+IGdldHMgZXZhbHVhdGVkIGFuZCB0aGVuIG1hdGNoZWQgYWdhaW5zdAotPGVtPkNvbmRQYXR0ZXJuPC9lbT4uIAotCi08cD4KLTxiPlJlbWVtYmVyOjwvYj4gPGVtPkNvbmRQYXR0ZXJuPC9lbT4gaXMgYSBzdGFuZGFyZAotPGVtPkV4dGVuZGVkIFJlZ3VsYXIgRXhwcmVzc2lvbjwvZW0+IHdpdGggc29tZSBhZGRpdGlvbnM6Ci0KLTxvbD4KLTxsaT5Zb3UgY2FuIHByZWNlZGUgdGhlIHBhdHRlcm4gc3RyaW5nIHdpdGggYSAnPHR0PiE8L3R0PicgY2hhcmFjdGVyCi0oZXhjbGFtYXRpb24gbWFyaykgdG8gc3BlY2lmeSBhIDxiPm5vbjwvYj4tbWF0Y2hpbmcgcGF0dGVybi4KLQotPHA+Ci08bGk+Ci1UaGVyZSBhcmUgc29tZSBzcGVjaWFsIHZhcmlhbnRzIG9mIDxlbT5Db25kUGF0dGVybnM8L2VtPi4gSW5zdGVhZCBvZiByZWFsCi1yZWd1bGFyIGV4cHJlc3Npb24gc3RyaW5ncyB5b3UgY2FuIGFsc28gdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotPHA+Ci08dWw+Ci08bGk+JzxiPi1kPC9iPicgKGlzIDxiPmQ8L2I+aXJlY3RvcnkpPGJyPgotVHJlYXRzIHRoZSA8aT5UZXN0U3RyaW5nPC9pPiBhcyBhIHBhdGhuYW1lIGFuZAotdGVzdHMgaWYgaXQgZXhpc3RzIGFuZCBpcyBhIGRpcmVjdG9yeS4KLTxwPgotPGxpPic8Yj4tZjwvYj4nIChpcyByZWd1bGFyIDxiPmY8L2I+aWxlKTxicj4KLVRyZWF0cyB0aGUgPGk+VGVzdFN0cmluZzwvaT4gYXMgYSBwYXRobmFtZSBhbmQKLXRlc3RzIGlmIGl0IGV4aXN0cyBhbmQgaXMgYSByZWd1bGFyIGZpbGUuCi08cD4KLTxsaT4nPGI+LXM8L2I+JyAoaXMgcmVndWxhciBmaWxlIHdpdGggPGI+czwvYj5pemUpPGJyPgotVHJlYXRzIHRoZSA8aT5UZXN0U3RyaW5nPC9pPiBhcyBhIHBhdGhuYW1lIGFuZAotdGVzdHMgaWYgaXQgZXhpc3RzIGFuZCBpcyBhIHJlZ3VsYXIgZmlsZSB3aXRoIHNpemUgZ3JlYXRlciB0aGVuIHplcm8uCi08cD4KLTxsaT4nPGI+LWw8L2I+JyAoaXMgc3ltYm9saWMgPGI+bDwvYj5pbmspPGJyPgotVHJlYXRzIHRoZSA8aT5UZXN0U3RyaW5nPC9pPiBhcyBhIHBhdGhuYW1lIGFuZAotdGVzdHMgaWYgaXQgZXhpc3RzIGFuZCBpcyBhIHN5bWJvbGljIGxpbmsuCi08L3VsPgotPHA+Ci1Ob3RpY2U6IEFsbCBvZiB0aGVzZSB0ZXN0cyBjYW4gYWxzbyBiZSBwcmVmaXhlZCBieSBhIG5vdCAoJyEnKSBjaGFyYWN0ZXIKLXRvIG5lZ2F0ZSB0aGVpciBtZWFuaW5nLgotPC9vbD4KLQotPHA+Ci1BZGRpdGlvbmFsbHkgeW91IGNhbiBzZXQgc3BlY2lhbCBmbGFncyBmb3IgPGVtPkNvbmRQYXR0ZXJuPC9lbT4gYnkgYXBwZW5kaW5nCi0KLTxibG9ja3F1b3RlPjxzdHJvbmc+Ci08Y29kZT5bPC9jb2RlPjxlbT5mbGFnczwvZW0+PGNvZGU+XTwvY29kZT4KLTwvc3Ryb25nPjwvYmxvY2txdW90ZT4KLQotYXMgdGhlIHRoaXJkIGFyZ3VtZW50IHRvIHRoZSA8dHQ+UmV3cml0ZUNvbmQ8L3R0PiBkaXJlY3RpdmUuIDxlbT5GbGFnczwvZW0+Ci1pcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6Ci0KLTx1bD4KLTxsaT4nPHN0cm9uZz48Y29kZT5ub2Nhc2V8TkM8L2NvZGU+PC9zdHJvbmc+JyAoPGI+bjwvYj5vIDxiPmM8L2I+YXNlKTxicj4KLSAgICBUaGlzIG1ha2VzIHRoZSBjb25kaXRpb24gdGVzdCBjYXNlLWluc2Vuc2l0aXZlLCBpLmUuIHRoZXJlIGlzCi0gICAgbm8gZGlmZmVyZW5jZSBiZXR3ZWVuICdBLVonIGFuZCAnYS16JyBib3RoIGluIHRoZSBleHBhbmRlZAotICAgIDxlbT5UZXN0U3RyaW5nPC9lbT4gYW5kIHRoZSA8ZW0+Q29uZFBhdHRlcm48L2VtPi4KLTxwPgotPGxpPic8c3Ryb25nPjxjb2RlPm9ybmV4dHxPUjwvY29kZT48L3N0cm9uZz4nICg8Yj5vcjwvYj4gbmV4dCBjb25kaXRpb24pPGJyPgotCVVzZSB0aGlzIHRvIGNvbWJpbmUgcnVsZSBjb25kaXRpb25zIHdpdGggYSBsb2NhbCBPUiBpbnN0ZWFkIG9mIHRoZQotCWltcGxpY2l0IEFORC4gVHlwaWNhbCBleGFtcGxlOgotCTxwPgotPGJsb2NrcXVvdGU+PHByZT4KLVJld3JpdGVDb25kICV7UkVNT1RFX0hPU1R9ICBeaG9zdDEuKiAgW09SXQotUmV3cml0ZUNvbmQgJXtSRU1PVEVfSE9TVH0gIF5ob3N0Mi4qICBbT1JdCi1SZXdyaXRlQ29uZCAle1JFTU9URV9IT1NUfSAgXmhvc3QzLiogIAotUmV3cml0ZVJ1bGUgLi4uc29tZSBzcGVjaWFsIHN0dWZmIGZvciBhbnkgb2YgdGhlc2UgaG9zdHMuLi4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLSAgICBXaXRob3V0IHRoaXMgZmxhZyB5b3UgaGFkIHRvIHdyaXRlIGRvd24gdGhlIGNvbmQvcnVsZSB0aHJlZSB0aW1lcy4KLTxwPgotPC91bD4KLQotPHA+Ci08Yj5FeGFtcGxlOjwvYj4KLTxibG9ja3F1b3RlPgotCi1UbyByZXdyaXRlIHRoZSBIb21lcGFnZSBvZiBhIHNpdGUgYWNjb3JkaW5nIHRvIHRoZSBgYDx0dD5Vc2VyLUFnZW50OjwvdHQ+JycKLWhlYWRlciBvZiB0aGUgcmVxdWVzdCwgeW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZzoKLQotPGJsb2NrcXVvdGU+PHByZT4KLVJld3JpdGVDb25kICAle0hUVFBfVVNFUl9BR0VOVH0gIF5Nb3ppbGxhLioKLVJld3JpdGVSdWxlICBeLyQgICAgICAgICAgICAgICAgIC9ob21lcGFnZS5tYXguaHRtbCAgW0xdCi0KLVJld3JpdGVDb25kICAle0hUVFBfVVNFUl9BR0VOVH0gIF5MeW54LioKLVJld3JpdGVSdWxlICBeLyQgICAgICAgICAgICAgICAgIC9ob21lcGFnZS5taW4uaHRtbCAgW0xdCi0KLVJld3JpdGVSdWxlICBeLyQgICAgICAgICAgICAgICAgIC9ob21lcGFnZS5zdGQuaHRtbCAgW0xdCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLUludGVycHJldGF0aW9uOiBJZiB5b3UgdXNlIE5ldHNjYXBlIE5hdmlnYXRvciBhcyB5b3VyIGJyb3dzZXIgKHdoaWNoIGlkZW50aWZpZXMKLWl0c2VsZiBhcyAnTW96aWxsYScpLCB0aGVuIHlvdSBnZXQgdGhlIG1heCBob21lcGFnZSwgd2hpY2ggaW5jbHVkZXMKLUZyYW1lcywgZXRjLiBJZiB5b3UgdXNlIHRoZSBMeW54IGJyb3dzZXIgKHdoaWNoIGlzIFRlcm1pbmFsLWJhc2VkKSwgdGhlbiB5b3UKLWdldCB0aGUgbWluIGhvbWVwYWdlLCB3aGljaCBjb250YWlucyBubyBpbWFnZXMsIG5vIHRhYmxlcywgZXRjLiAgSWYgeW91Ci11c2UgYW55IG90aGVyIGJyb3dzZXIgeW91IGdldCB0aGUgc3RhbmRhcmQgaG9tZXBhZ2UuCi08L2Jsb2NrcXVvdGU+Ci08cD4KLQotPHA+Ci08aHIgbm9zaGFkZSBzaXplPTE+Ci08cD4KLQotPGEgbmFtZT0iUmV3cml0ZVJ1bGUiPjxoMz5SZXdyaXRlUnVsZTwvaDM+PC9hPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IDxjb2RlPlJld3JpdGVSdWxlPC9jb2RlPiA8ZW0+UGF0dGVybjwvZW0+IDxlbT5TdWJzdGl0dXRpb248L2VtPjxicj4KLTxzdHJvbmc+RGVmYXVsdDo8L3N0cm9uZz4gLTxlbT5Ob25lPC9lbT4tPGJyPgotPHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIHBlci1kaXJlY3RvcnkgY29uZmlnPGJyPgotCi08cD4KLVRoZSA8dHQ+UmV3cml0ZVJ1bGU8L3R0PiBkaXJlY3RpdmUgaXMgdGhlIHJlYWwgcmV3cml0aW5nIHdvcmtob3JzZS4gIFRoZQotZGlyZWN0aXZlIGNhbiBvY2N1ciBtb3JlIHRoYW4gb25jZS4gRWFjaCBkaXJlY3RpdmUgdGhlbiBkZWZpbmVzIG9uZSBzaW5nbGUKLXJld3JpdGluZyBydWxlLiAgVGhlIDxiPmRlZmluaXRpb24gb3JkZXI8L2I+IG9mIHRoZXNlIHJ1bGVzIGlzCi08Yj5pbXBvcnRhbnQ8L2I+LCBiZWNhdXNlIHRoaXMgb3JkZXIgaXMgdXNlZCB3aGVuIGFwcGx5aW5nIHRoZSBydWxlcyBhdAotcnVuLXRpbWUuCi0KLTxwPgotPGEgbmFtZT0icGF0dGVybnMiPjxlbT5QYXR0ZXJuPC9lbT48L2E+IGNhbiBiZSAoZm9yIEFwYWNoZSAxLjEueCBhIFN5c3RlbQotVjggYW5kIGZvciBBcGFjaGUgMS4yLnggYSBQT1NJWCkgPGEgbmFtZT0icmVnZXhwIj5yZWd1bGFyIGV4cHJlc3Npb248L2E+Ci13aGljaCBnZXRzIGFwcGxpZWQgdG8gdGhlIGN1cnJlbnQgVVJMLiBIZXJlIGBgY3VycmVudCcnIG1lYW5zIHRoZSB2YWx1ZSBvZiB0aGUKLVVSTCB3aGVuIHRoaXMgcnVsZSBnZXRzIGFwcGxpZWQuIFRoaXMgbWF5IG5vdCBiZSB0aGUgb3JpZ2luYWwgcmVxdWVzdGVkCi1VUkwsIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgYW55IG51bWJlciBvZiBydWxlcyBiZWZvcmUgd2hpY2ggYWxyZWFkeSBtYXRjaGVkCi1hbmQgbWFkZSBhbHRlcmF0aW9ucyB0byBpdC4KLQotPHA+Ci1Tb21lIGhpbnRzIGFib3V0IHRoZSBzeW50YXggb2YgcmVndWxhciBleHByZXNzaW9uczoKLQotPHA+Ci08dGFibGUgYmdjb2xvcj0iI2QwZDBkMCIgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz01PgotPHRyPgotPHRkIHZhbGlnbj10b3A+Ci08cHJlPgotPHN0cm9uZz48Y29kZT5ePC9jb2RlPjwvc3Ryb25nPiAgICAgICAgICAgU3RhcnQgb2YgbGluZQotPHN0cm9uZz48Y29kZT4kPC9jb2RlPjwvc3Ryb25nPiAgICAgICAgICAgRW5kIG9mIGxpbmUKLTxzdHJvbmc+PGNvZGU+LjwvY29kZT48L3N0cm9uZz4gICAgICAgICAgIEFueSBzaW5nbGUgY2hhcmFjdGVyCi08c3Ryb25nPjxjb2RlPls8L2NvZGU+PC9zdHJvbmc+Y2hhcnM8c3Ryb25nPjxjb2RlPl08L2NvZGU+PC9zdHJvbmc+ICAgICBPbmUgb2YgY2hhcnMgCi08c3Ryb25nPjxjb2RlPltePC9jb2RlPjwvc3Ryb25nPmNoYXJzPHN0cm9uZz48Y29kZT5dPC9jb2RlPjwvc3Ryb25nPiAgICBOb25lIG9mIGNoYXJzIAotCi08c3Ryb25nPjxjb2RlPj88L2NvZGU+PC9zdHJvbmc+ICAgICAgICAgICAwIG9yIDEgb2YgdGhlIHByZWNlZGluZyBjaGFyCi08c3Ryb25nPjxjb2RlPio8L2NvZGU+PC9zdHJvbmc+ICAgICAgICAgICAwIG9yIE4gb2YgdGhlIHByZWNlZGluZyBjaGFyCi08c3Ryb25nPjxjb2RlPis8L2NvZGU+PC9zdHJvbmc+ICAgICAgICAgICAxIG9yIE4gb2YgdGhlIHByZWNlZGluZyBjaGFyCi0KLTxzdHJvbmc+PGNvZGU+XDwvY29kZT48L3N0cm9uZz5jaGFyICAgICAgIGVzY2FwZSB0aGF0IHNwZWNpZmljIGNoYXIgCi0gICAgICAgICAgICAoZS5nLiBmb3Igc3BlY2lmeWluZyB0aGUgY2hhcnMgIjxjb2RlPi5bXSgpPC9jb2RlPiIgZXRjLikKLQotPHN0cm9uZz48Y29kZT4oPC9jb2RlPjwvc3Ryb25nPnN0cmluZzxzdHJvbmc+PGNvZGU+KTwvY29kZT48L3N0cm9uZz4gICAgR3JvdXBpbmcgb2YgY2hhcnMgKHRoZSA8Yj5OPC9iPnRoIGdyb3VwIGNhbiBiZSB1c2VkIG9uIHRoZSBSSFMgd2l0aCA8Y29kZT4kPC9jb2RlPjxiPk48L2I+KQotPC9wcmU+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci0KLTxwPgotQWRkaXRpb25hbGx5IHRoZSBOT1QgY2hhcmFjdGVyICgnPHR0PiE8L3R0PicpIGlzIGEgcG9zc2libGUgcGF0dGVybgotcHJlZml4LiBUaGlzIGdpdmVzIHlvdSB0aGUgYWJpbGl0eSB0byBuZWdhdGUgYSBwYXR0ZXJuOyB0byBzYXksIGZvciBpbnN0YW5jZTogYGA8aT5pZgotdGhlIGN1cnJlbnQgVVJMIGRvZXMgPGI+Tk9UPC9iPiBtYXRjaCB0byB0aGlzIHBhdHRlcm48L2k+JycuIFRoaXMgY2FuIGJlIHVzZWQKLWZvciBzcGVjaWFsIGNhc2VzIHdoZXJlIGl0IGlzIGJldHRlciB0byBtYXRjaCB0aGUgbmVnYXRpdmUgcGF0dGVybiBvciBhcyBhCi1sYXN0IGRlZmF1bHQgcnVsZS4KLQotPHA+Ci08dGFibGUgd2lkdGg9NzAlIGJvcmRlcj0yIGJnY29sb3I9IiNjMGMwZTAiIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRpbmc9MTA+Ci08dHI+PHRkPgotPGI+Tm90aWNlITwvYj4gV2hlbiB1c2luZyB0aGUgTk9UIGNoYXJhY3RlciB0byBuZWdhdGUgYSBwYXR0ZXJuIHlvdSBjYW5ub3QKLWhhdmUgZ3JvdXBlZCB3aWxkY2FyZCBwYXJ0cyBpbiB0aGUgcGF0dGVybi4gVGhpcyBpcyBpbXBvc3NpYmxlIGJlY2F1c2Ugd2hlbgotdGhlIHBhdHRlcm4gZG9lcyBOT1QgbWF0Y2gsIHRoZXJlIGFyZSBubyBjb250ZW50cyBmb3IgdGhlIGdyb3Vwcy4gSW4KLWNvbnNlcXVlbmNlLCBpZiBuZWdhdGVkIHBhdHRlcm5zIGFyZSB1c2VkLCB5b3UgY2Fubm90IHVzZSA8dHQ+JE48L3R0PiBpbiB0aGUKLXN1YnN0aXR1dGlvbiBzdHJpbmchCi08L3RkPjwvdHI+Ci08L3RhYmxlPgotCi08cD4KLTxhIG5hbWU9InJocyI+PGVtPlN1YnN0aXR1dGlvbjwvZW0+PC9hPiBvZiBhIHJld3JpdGluZyBydWxlIGlzIHRoZSBzdHJpbmcKLXdoaWNoIGlzIHN1YnN0aXR1dGVkIGZvciAob3IgcmVwbGFjZXMpIHRoZSBvcmlnaW5hbCBVUkwgZm9yIHdoaWNoCi08ZW0+UGF0dGVybjwvZW0+IG1hdGNoZWQuICBCZXNpZGUgcGxhaW4gdGV4dCB5b3UgY2FuIHVzZSAKLQotPG9sPgotPGxpPnBhdHRlcm4tZ3JvdXAgYmFjay1yZWZlcmVuY2VzICg8Y29kZT4kTjwvY29kZT4pCi08bGk+c2VydmVyLXZhcmlhYmxlcyBhcyBpbiBydWxlIGNvbmRpdGlvbiB0ZXN0LXN0cmluZ3MgKDxjb2RlPiV7VkFSTkFNRX08L2NvZGU+KQotPGxpPjxhIGhyZWY9IiNtYXBmdW5jIj5tYXBwaW5nLWZ1bmN0aW9uPC9hPiBjYWxscyAoPGNvZGU+JHttYXBuYW1lOmtleXxkZWZhdWx0fTwvY29kZT4pCi08L29sPgotCi1CYWNrLXJlZmVyZW5jZXMgYXJlIDxjb2RlPiQ8L2NvZGU+PGI+TjwvYj4gKDxiPk48L2I+PTEuLjkpIGlkZW50aWZpZXJzIHdoaWNoCi13aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBjb250ZW50cyBvZiB0aGUgPGI+TjwvYj50aCBncm91cCBvZiB0aGUgbWF0Y2hlZAotPGVtPlBhdHRlcm48L2VtPi4gVGhlIHNlcnZlci12YXJpYWJsZXMgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUKLTxlbT5UZXN0U3RyaW5nPC9lbT4gb2YgYSA8dHQ+UmV3cml0ZUNvbmQ8L3R0PiBkaXJlY3RpdmUuIFRoZQotbWFwcGluZy1mdW5jdGlvbnMgY29tZSBmcm9tIHRoZSA8dHQ+UmV3cml0ZU1hcDwvdHQ+IGRpcmVjdGl2ZSBhbmQgYXJlCi1leHBsYWluZWQgdGhlcmUuIFRoZXNlIHRocmVlIHR5cGVzIG9mIHZhcmlhYmxlcyBhcmUgZXhwYW5kZWQgaW4gdGhlIG9yZGVyIG9mCi10aGUgYWJvdmUgbGlzdC4KLQotPHA+Ci1BcyBhbHJlYWR5IG1lbnRpb25lZCBhYm92ZSwgYWxsIHRoZSByZXdyaXRpbmcgcnVsZXMgYXJlIGFwcGxpZWQgdG8gdGhlCi08ZW0+U3Vic3RpdHV0aW9uPC9lbT4gKGluIHRoZSBvcmRlciBvZiBkZWZpbml0aW9uIGluIHRoZSBjb25maWcgZmlsZSkuICBUaGUKLVVSTCBpcyA8Yj5jb21wbGV0ZWx5IHJlcGxhY2VkPC9iPiBieSB0aGUgPGVtPlN1YnN0aXR1dGlvbjwvZW0+IGFuZCB0aGUKLXJld3JpdGluZyBwcm9jZXNzIGdvZXMgb24gdW50aWwgdGhlcmUgYXJlIG5vIG1vcmUgcnVsZXMgKHVubGVzcyBleHBsaWNpdGx5Ci10ZXJtaW5hdGVkIGJ5IGEgPGNvZGU+PGI+TDwvYj48L2NvZGU+IGZsYWcgLSBzZWUgYmVsb3cpLgotCi08cD4KLVRoZXJlIGlzIGEgc3BlY2lhbCBzdWJzdGl0dXRpb24gc3RyaW5nIG5hbWVkICc8dHQ+LTwvdHQ+JyB3aGljaCBtZWFuczoKLTxiPk5PIHN1YnN0aXR1dGlvbjwvYj4hIFNvdW5kcyBzaWxseT8gTm8sIGl0IGlzIHVzZWZ1bCB0byBwcm92aWRlIHJld3JpdGluZwotcnVsZXMgd2hpY2ggPGI+b25seTwvYj4gbWF0Y2ggc29tZSBVUkxzIGJ1dCBkbyBubyBzdWJzdGl0dXRpb24sIGUuZy4gaW4KLWNvbmp1bmN0aW9uIHdpdGggdGhlIDxiPkM8L2I+IChjaGFpbikgZmxhZyB0byBiZSBhYmxlIHRvIGhhdmUgbW9yZSB0aGFuIG9uZQotcGF0dGVybiB0byBiZSBhcHBsaWVkIGJlZm9yZSBhIHN1YnN0aXR1dGlvbiBvY2N1cnMuCi0KLTxwPgotPHRhYmxlIHdpZHRoPTcwJSBib3JkZXI9MiBiZ2NvbG9yPSIjYzBjMGUwIiBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTEwPgotPHRyPjx0ZD4KLTxiPk5vdGljZTwvYj46IFRoZXJlIGlzIGEgc3BlY2lhbCBmZWF0dXJlLiBXaGVuIHlvdSBwcmVmaXggYSBzdWJzdGl0dXRpb24KLWZpZWxkIHdpdGggPHR0Pmh0dHA6Ly88L3R0PjxlbT50aGlzaG9zdDwvZW0+WzxlbT46dGhpc3BvcnQ8L2VtPl0gdGhlbgotPGI+bW9kX3Jld3JpdGU8L2I+IGF1dG9tYXRpY2FsbHkgc3RyaXBzIGl0IG91dC4gICBUaGlzIGF1dG8tcmVkdWN0aW9uIG9uCi1pbXBsaWNpdCBleHRlcm5hbCByZWRpcmVjdCBVUkxzIGlzIGEgdXNlZnVsIGFuZCBpbXBvcnRhbnQgZmVhdHVyZSB3aGVuCi11c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggYSBtYXBwaW5nLWZ1bmN0aW9uIHdoaWNoIGdlbmVyYXRlcyB0aGUgaG9zdG5hbWUKLXBhcnQuICBIYXZlIGEgbG9vayBhdCB0aGUgZmlyc3QgZXhhbXBsZSBpbiB0aGUgZXhhbXBsZSBzZWN0aW9uIGJlbG93IHRvCi11bmRlcnN0YW5kIHRoaXMuCi08cD4KLTxiPlJlbWVtYmVyOjwvYj4gQW4gdW5jb25kaXRpb25hbCBleHRlcm5hbCByZWRpcmVjdCB0byB5b3VyIG93biBzZXJ2ZXIgd2lsbAotbm90IHdvcmsgd2l0aCB0aGUgcHJlZml4IDx0dD5odHRwOi8vdGhpc2hvc3Q8L3R0PiBiZWNhdXNlIG9mIHRoaXMgZmVhdHVyZS4KLVRvIGFjaGlldmUgc3VjaCBhIHNlbGYtcmVkaXJlY3QsIHlvdSBoYXZlIHRvIHVzZSB0aGUgPGI+UjwvYj4tZmxhZyAoc2VlCi1iZWxvdykuCi08L3RkPjwvdHI+Ci08L3RhYmxlPgotCi08cD4KLUFkZGl0aW9uYWxseSB5b3UgY2FuIHNldCBzcGVjaWFsIGZsYWdzIGZvciA8ZW0+U3Vic3RpdHV0aW9uPC9lbT4gYnkgYXBwZW5kaW5nCi0KLTxibG9ja3F1b3RlPjxzdHJvbmc+Ci08Y29kZT5bPC9jb2RlPjxlbT5mbGFnczwvZW0+PGNvZGU+XTwvY29kZT4KLTwvc3Ryb25nPjwvYmxvY2txdW90ZT4KLQotYXMgdGhlIHRoaXJkIGFyZ3VtZW50IHRvIHRoZSA8dHQ+UmV3cml0ZVJ1bGU8L3R0PiBkaXJlY3RpdmUuIDxlbT5GbGFnczwvZW0+IGlzIGEKLWNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6Ci0KLTx1bD4KLTxsaT4nPHN0cm9uZz48Y29kZT5yZWRpcmVjdHxSPC9jb2RlPjwvc3Ryb25nPicgKGZvcmNlIDxhIG5hbWU9InJlZGlyZWN0Ij48Yj5yPC9iPmVkaXJlY3Q8L2E+KTxicj4KLSAgICBQcmVmaXggPGVtPlN1YnN0aXR1dGlvbjwvZW0+IAotICAgIHdpdGggPGNvZGU+aHR0cDovL3RoaXNob3N0LzwvY29kZT4gKHdoaWNoIG1ha2VzIHRoZSBuZXcgVVJMIGEgVVJJKSB0bwotICAgIGZvcmNlIGEgZXh0ZXJuYWwgcmVkaXJlY3Rpb24uIFVzZSBpdCBmb3IgcnVsZXMgd2hpY2ggc2hvdWxkIAotCWNhbm9uaWNhbGl6ZSB0aGUgVVJMIGFuZCBnaXZlcyBpdCBiYWNrIHRvIHRoZSBjbGllbnQsIGUuZy4gdHJhbnNsYXRlCi0gICAgYGA8Y29kZT4vfjwvY29kZT4nJyBpbnRvIGBgPGNvZGU+L3UvPC9jb2RlPicnIG9yIGFsd2F5cyBhcHBlbmQgYSBzbGFzaCB0bwotICAgIDxjb2RlPi91LzwvY29kZT48ZW0+dXNlcjwvZW0+LCBldGMuPGJyPgotICAgIDxiPk5vdGljZTo8L2I+IFdoZW4geW91IHVzZSB0aGlzIGZsYWcsIG1ha2Ugc3VyZSB0aGF0IHRoZQotICAgIHN1YnN0aXR1dGlvbiBmaWVsZCBpcyBhIHZhbGlkIFVSTCEgSWYgbm90LCB5b3UgYXJlIHJlZGlyZWN0aW5nIHRvIGFuIGludmFsaWQKLSAgICBsb2NhdGlvbiE8L2I+Ci08cD4KLTxsaT4nPHN0cm9uZz48Y29kZT5wcm94eXxQPC9jb2RlPjwvc3Ryb25nPicgKGZvcmNlIDxiPnA8L2I+cm94eSk8YnI+Ci0gICAgVGhpcyBmbGFnIGZvcmNlcyB0aGUgc3Vic3RpdHV0aW9uIHBhcnQgdG8gYmUgaW50ZXJuYWxseSBmb3JjZWQgYXMgYSBwcm94eQotICAgIHJlcXVlc3QgYW5kIGltbWVkaWF0ZWx5IChpLmUuIHJld3JpdGluZyBydWxlIHByb2Nlc3Npbmcgc3RvcHMgaGVyZSkgcHV0Ci0gICAgdGhyb3VnaCB0aGUgcHJveHkgbW9kdWxlLiBZb3UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc3Vic3RpdHV0aW9uCi0gICAgc3RyaW5nIGlzIGEgdmFsaWQgVVJJIChlLmcuIHR5cGljYWxseSA8dHQ+aHR0cDovLzwvdHQ+KSB3aGljaCBjYW4KLSAgICBiZSBoYW5kbGVkIGJ5IHRoZSBBcGFjaGUgcHJveHkgbW9kdWxlLiBJZiBub3QgeW91IGdldCBhbiBlcnJvciBmcm9tCi0gICAgdGhlIHByb3h5IG1vZHVsZS4gVXNlIHRoaXMgZmxhZyB0byBhY2hpZXZlIGEgbW9yZSBwb3dlcmZ1bCBpbXBsZW1lbnRhdGlvbgotICAgIG9mIHRoZSA8dHQ+bW9kX3Byb3h5PC90dD4gZGlyZWN0aXZlIDx0dD5Qcm94eVBhc3M8L3R0PiwgdG8gbWFwCi0gICAgc29tZSByZW1vdGUgc3R1ZmYgaW50byB0aGUgbmFtZXNwYWNlIG9mIHRoZSBsb2NhbCBzZXJ2ZXIuCi08cD4KLTxsaT4nPHN0cm9uZz48Y29kZT5sYXN0fEw8L2NvZGU+PC9zdHJvbmc+JyAoPGI+bDwvYj5hc3QgcnVsZSk8YnI+Ci0gICAgU3RvcCB0aGUgcmV3cml0aW5nIHByb2Nlc3MgaGVyZSBhbmQKLSAgICBkb24ndCBhcHBseSBhbnkgbW9yZSByZXdyaXRpbmcgcnVsZXMuIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIFBlcmwKLSAgICA8Y29kZT5sYXN0PC9jb2RlPiBjb21tYW5kIG9yIHRoZSA8Y29kZT5icmVhazwvY29kZT4gY29tbWFuZCBmcm9tIHRoZSBDCi0gICAgbGFuZ3VhZ2UuIFVzZSB0aGlzIGZsYWcgdG8gcHJldmVudCB0aGUgY3VycmVudGx5IHJld3JpdHRlbiBVUkwgZnJvbSBiZWluZwotICAgIHJld3JpdHRlbiBmdXJ0aGVyIGJ5IGZvbGxvd2luZyBydWxlcyB3aGljaCBtYXkgYmUgd3JvbmcuIEZvcgotICAgIGV4YW1wbGUsIHVzZSBpdCB0byByZXdyaXRlIHRoZSByb290LXBhdGggVVJMICgnPGNvZGU+LzwvY29kZT4nKSB0byBhIHJlYWwKLSAgICBvbmUsIGUuZy4gJzxjb2RlPi9lL3d3dy88L2NvZGU+Jy4KLTxwPgotPGxpPic8c3Ryb25nPjxjb2RlPm5leHR8TjwvY29kZT48L3N0cm9uZz4nICg8Yj5uPC9iPmV4dCByb3VuZCk8YnI+Ci0gICAgUmUtcnVuIHRoZSByZXdyaXRpbmcgcHJvY2VzcyAoc3RhcnRpbmcgYWdhaW4gd2l0aCB0aGUgZmlyc3QgcmV3cml0aW5nCi0gICAgcnVsZSkuIEhlcmUgdGhlIFVSTCB0byBtYXRjaCBpcyBhZ2FpbiBub3QgdGhlIG9yaWdpbmFsIFVSTCBidXQgdGhlIFVSTAotICAgIGZyb20gdGhlIGxhc3QgcmV3cml0aW5nIHJ1bGUuICBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBQZXJsCi0gICAgPGNvZGU+bmV4dDwvY29kZT4gY29tbWFuZCBvciB0aGUgPGNvZGU+Y29udGludWU8L2NvZGU+IGNvbW1hbmQgZnJvbSB0aGUgQwotICAgIGxhbmd1YWdlLiBVc2UgdGhpcyBmbGFnIHRvIHJlc3RhcnQgdGhlIHJld3JpdGluZyBwcm9jZXNzLCBpLmUuICB0bwotICAgIGltbWVkaWF0ZWx5IGdvIHRvIHRoZSB0b3Agb2YgdGhlIGxvb3AuIDxicj4gCi0gICAgPGI+QnV0IGJlIGNhcmVmdWwgbm90IHRvIGNyZWF0ZSBhIGRlYWRsb29wITwvYj4KLTxwPgotPGxpPic8c3Ryb25nPjxjb2RlPmNoYWlufEM8L2NvZGU+PC9zdHJvbmc+JyAoPGI+YzwvYj5oYWluZWQgd2l0aCBuZXh0IHJ1bGUpPGJyPgotICAgIFRoaXMgZmxhZyBjaGFpbnMgdGhlIGN1cnJlbnQgcnVsZSB3aXRoIHRoZSBuZXh0IHJ1bGUgKHdoaWNoIGl0c2VsZiBjYW4KLSAgICBhbHNvIGJlIGNoYWluZWQgd2l0aCBpdHMgZm9sbG93aW5nIHJ1bGUsIGV0Yy4pLiBUaGlzIGhhcyB0aGUgZm9sbG93aW5nCi0gICAgZWZmZWN0OiBpZiBhIHJ1bGUgbWF0Y2hlcywgdGhlbiBwcm9jZXNzaW5nIGNvbnRpbnVlcyBhcyB1c3VhbCwgaS5lLiB0aGUKLSAgICBmbGFnIGhhcyBubyBlZmZlY3QuIElmIHRoZSBydWxlIGRvZXMgPGI+bm90PC9iPiBtYXRjaCwgdGhlbiBhbGwgZm9sbG93aW5nCi0gICAgY2hhaW5lZCBydWxlcyBhcmUgc2tpcHBlZC4gICBGb3IgaW5zdGFuY2UsIHVzZSBpdCB0byByZW1vdmUgdGhlCi0gICAgYGA8dHQ+Lnd3dzwvdHQ+JycgcGFydCBpbnNpZGUgYSBwZXItZGlyZWN0b3J5IHJ1bGUgc2V0IHdoZW4geW91IGxldCBhbgotICAgIGV4dGVybmFsIHJlZGlyZWN0IGhhcHBlbiAod2hlcmUgdGhlIGBgPHR0Pi53d3c8L3R0PicnIHBhcnQgc2hvdWxkIG5vdCB0bwotICAgIG9jY3VyISkuCi08cD4KLTxsaT4nPHN0cm9uZz48Y29kZT50eXBlfFQ8L2NvZGU+PC9zdHJvbmc+PTxlbT5taW1lLXR5cGU8L2VtPicgKGZvcmNlIE1JTUUgPGI+dDwvYj55cGUpPGJyPgotICAgIEZvcmNlIHRoZSBNSU1FLXR5cGUgb2YgdGhlIHRhcmdldCBmaWxlIHRvIGJlIDxlbT5taW1lLXR5cGU8L2VtPi4gRm9yCi0gICAgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIHVzZWQgdG8gc2ltdWxhdGUgdGhlIG9sZCA8dHQ+bW9kX2FsaWFzPC90dD4KLSAgICBkaXJlY3RpdmUgPHR0PlNjcmlwdEFsaWFzPC90dD4gd2hpY2ggaW50ZXJuYWxseSBmb3JjZXMgYWxsIGZpbGVzIGluc2lkZQotICAgIHRoZSBtYXBwZWQgZGlyZWN0b3J5IHRvIGhhdmUgYSBNSU1FIHR5cGUgb2YKLSAgICBgYDx0dD5hcHBsaWNhdGlvbi94LWh0dHBkLWNnaTwvdHQ+JycuCi08cD4KLTxsaT4nPHN0cm9uZz48Y29kZT5ub3N1YnJlcXxOUzwvY29kZT48L3N0cm9uZz4nICh1c2VkIG9ubHkgaWYgPGI+bjwvYj5vIGludGVybmFsIDxiPnM8L2I+dWItcmVxdWVzdCk8YnI+Ci0gICAgVGhpcyBmbGFnIGZvcmNlcyB0aGUgcmV3cml0aW5nIGVuZ2luZSB0byBza2lwIGEgcmV3cml0aW5nIHJ1bGUgaWYgdGhlCi0gICAgY3VycmVudCByZXF1ZXN0IGlzIGFuIGludGVybmFsIHN1Yi1yZXF1ZXN0LiBGb3IgaW5zdGFuY2UsIHN1Yi1yZXF1ZXN0cwotICAgIG9jY3VyIGludGVybmFsbHkgaW4gQXBhY2hlIHdoZW4gPHR0Pm1vZF9pbmNsdWRlPC90dD4gdHJpZXMgdG8gZmluZCBvdXQKLSAgICBpbmZvcm1hdGlvbiBhYm91dCBwb3NzaWJsZSBkaXJlY3RvcnkgZGVmYXVsdCBmaWxlcyAoPHR0PmluZGV4Lnh4eDwvdHQ+KS4KLSAgICBPbiBzdWItcmVxdWVzdHMgaXQgaXMgbm90IGFsd2F5cyB1c2VmdWwgYW5kIGV2ZW4gc29tZXRpbWVzIGNhdXNlcyBhIGZhaWx1cmUgdG8KLSAgICBpZiB0aGUgY29tcGxldGUgc2V0IG9mIHJ1bGVzIGFyZSBhcHBsaWVkLiBVc2UgdGhpcyBmbGFnIHRvIGV4Y2x1ZGUgc29tZSBydWxlcy48YnI+Ci0gICAgPHA+Ci0gICAgVXNlIHRoZSBmb2xsb3dpbmcgcnVsZSBmb3IgeW91ciBkZWNpc2lvbjogd2hlbmV2ZXIgeW91IHByZWZpeCBzb21lIFVSTHMKLSAgICB3aXRoIENHSS1zY3JpcHRzIHRvIGZvcmNlIHRoZW0gdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSBDR0ktc2NyaXB0LCB0aGUKLSAgICBjaGFuY2UgaXMgaGlnaCB0aGF0IHlvdSB3aWxsIHJ1biBpbnRvIHByb2JsZW1zIChvciBldmVuIG92ZXJoZWFkKSBvbiBzdWItcmVxdWVzdHMuCi0gICAgSW4gdGhlc2UgY2FzZXMsIHVzZSB0aGlzIGZsYWcuCi08cD4KLTxsaT4nPHN0cm9uZz48Y29kZT5wYXNzdGhyb3VnaHxQVDwvY29kZT48L3N0cm9uZz4nICg8Yj5wPC9iPmFzcyA8Yj50PC9iPmhyb3VnaCB0byBuZXh0IGhhbmRsZXIpPGJyPgotICAgIFRoaXMgZmxhZyBmb3JjZXMgdGhlIHJld3JpdGluZyBlbmdpbmUgdG8gc2V0IHRoZSA8Y29kZT51cmk8L2NvZGU+IGZpZWxkCi0gICAgb2YgdGhlIGludGVybmFsIDxjb2RlPnJlcXVlc3RfcmVjPC9jb2RlPiBzdHJ1Y3R1cmUgdG8gdGhlIHZhbHVlCi0gICAgb2YgdGhlIDxjb2RlPmZpbGVuYW1lPC9jb2RlPiBmaWVsZC4gIFRoaXMgZmxhZyBpcyBqdXN0IGEgaGFjayB0byBiZSBhYmxlCi0gICAgdG8gcG9zdC1wcm9jZXNzIHRoZSBvdXRwdXQgb2YgPHR0PlJld3JpdGVSdWxlPC90dD4gZGlyZWN0aXZlcyBieQotICAgIDx0dD5BbGlhczwvdHQ+LCA8dHQ+U2NyaXB0QWxpYXM8L3R0PiwgPHR0PlJlZGlyZWN0PC90dD4sIGV0Yy4gZGlyZWN0aXZlcwotICAgIGZyb20gb3RoZXIgVVJJLXRvLWZpbGVuYW1lIHRyYW5zbGF0b3JzLiBBIHRyaXZpYWwgZXhhbXBsZSB0byBzaG93IHRoZQotICAgIHNlbWFudGljczoKLSAgICBJZiB5b3Ugd2FudCB0byByZXdyaXRlIDx0dD4vYWJjPC90dD4gdG8gPHR0Pi9kZWY8L3R0PiB2aWEgdGhlIHJld3JpdGluZwotICAgIGVuZ2luZSBvZiA8dHQ+bW9kX3Jld3JpdGU8L3R0PiBhbmQgdGhlbiA8dHQ+L2RlZjwvdHQ+IHRvIDx0dD4vZ2hpPC90dD4KLSAgICB3aXRoIDx0dD5tb2RfYWxpYXM8L3R0PjoKLSAgICA8cHJlPgotICAgIFJld3JpdGVSdWxlIF4vYWJjKC4qKSAgL2RlZiQxIFtQVF0KLSAgICBBbGlhcyAgICAgICAvZGVmICAgICAgIC9naGkgICAKLSAgICA8L3ByZT4KLSAgICBJZiB5b3Ugb21pdCB0aGUgPHR0PlBUPC90dD4gZmxhZyB0aGVuIDx0dD5tb2RfcmV3cml0ZTwvdHQ+Ci0gICAgd2lsbCBkbyBpdHMgam9iIGZpbmUsIGkuZS4gaXQgcmV3cml0ZXMgPHR0PnVyaT0vYWJjLy4uLjwvdHQ+IHRvCi0gICAgPHR0PmZpbGVuYW1lPS9kZWYvLi4uPC90dD4gYXMgYSBmdWxsIEFQSS1jb21wbGlhbnQgVVJJLXRvLWZpbGVuYW1lCi0gICAgdHJhbnNsYXRvciBzaG91bGQgZG8uIFRoZW4gPHR0Pm1vZF9hbGlhczwvdHQ+IGNvbWVzIGFuZCB0cmllcyB0byBkbyBhCi0gICAgVVJJLXRvLWZpbGVuYW1lIHRyYW5zaXRpb24gd2hpY2ggd2lsbCBub3Qgd29yay4KLSAgICA8cD4KLSAgICBOb3RpY2U6IDxiPllvdSBoYXZlIHRvIHVzZSB0aGlzIGZsYWcgaWYgeW91IHdhbnQgdG8gaW50ZXJtaXggZGlyZWN0aXZlcwotICAgIG9mIGRpZmZlcmVudCBtb2R1bGVzIHdoaWNoIGNvbnRhaW4gVVJMLXRvLWZpbGVuYW1lIHRyYW5zbGF0b3JzPC9iPi4gVGhlCi0gICAgdHlwaWNhbCBleGFtcGxlIGlzIHRoZSB1c2Ugb2YgPHR0Pm1vZF9hbGlhczwvdHQ+IGFuZAotICAgIDx0dD5tb2RfcmV3cml0ZTwvdHQ+Li4KLQotPHA+Ci08dGFibGUgd2lkdGg9NzAlIGJvcmRlcj0yIGJnY29sb3I9IiNjMGMwZTAiIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRpbmc9MTA+Ci08dHI+PHRkPgotPGZvbnQgc2l6ZT0tMT4KLSAgICA8Yj5Gb3IgdGhlIEFwYWNoZSBoYWNrZXJzOjwvYj48YnI+Ci0gICAgSWYgdGhlIGN1cnJlbnQgQXBhY2hlIEFQSSBoYWQgYQotICAgIGZpbGVuYW1lLXRvLWZpbGVuYW1lIGhvb2sgYWRkaXRpb25hbGx5IHRvIHRoZSBVUkktdG8tZmlsZW5hbWUgaG9vayB0aGVuCi0gICAgd2Ugd291bGRuJ3QgbmVlZCB0aGlzIGZsYWchICBCdXQgd2l0aG91dCAgc3VjaCBhIGhvb2sgdGhpcyBmbGFnIGlzIHRoZQotICAgIG9ubHkgc29sdXRpb24uIFRoZSBBcGFjaGUgR3JvdXAgaGFzIGRpc2N1c3NlZCB0aGlzIHByb2JsZW0gYW5kIHdpbGwKLSAgICBhZGQgc3VjaCBob29rcyBpbnRvIEFwYWNoZSB2ZXJzaW9uIDIuMC4KLTwvZm9udD4KLTwvdGQ+PC90cj4KLTwvdGFibGU+Ci08cD4KLTxsaT4nPHN0cm9uZz48Y29kZT5za2lwfFM8L2NvZGU+PC9zdHJvbmc+PTxlbT5udW08L2VtPicgKDxiPnM8L2I+a2lwIG5leHQgcnVsZShzKSk8YnI+Ci0gICAgVGhpcyBmbGFnIGZvcmNlcyB0aGUgcmV3cml0aW5nIGVuZ2luZSB0byBza2lwIHRoZSBuZXh0IDxlbT5udW08L2VtPiBydWxlcwotICAgIGluIHNlcXVlbmNlIHdoZW4gdGhlIGN1cnJlbnQgcnVsZSBtYXRjaGVzLiBVc2UgdGhpcyB0byBtYWtlIHBzZXVkbwotICAgIGlmLXRoZW4tZWxzZSBjb25zdHJ1Y3RzOiBUaGUgbGFzdCBydWxlIG9mIHRoZSB0aGVuLWNsYXVzZSBiZWNvbWVzCi0gICAgYSA8dHQ+c2tpcD1OPC90dD4gd2hlcmUgTiBpcyB0aGUgbnVtYmVyIG9mIHJ1bGVzIGluIHRoZSBlbHNlLWNsYXVzZS4KLSAgICAoVGhpcyBpcyA8Yj5ub3Q8L2I+IHRoZSBzYW1lIGFzIHRoZSAnY2hhaW58QycgZmxhZyEpCi08cD4KLTwvdWw+Ci0KLTxwPgotPHRhYmxlIHdpZHRoPTcwJSBib3JkZXI9MiBiZ2NvbG9yPSIjYzBjMGUwIiBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTEwPgotPHRyPjx0ZD4KLVJlbWVtYmVyOiBOZXZlciBmb3JnZXQgdGhhdCA8ZW0+UGF0dGVybjwvZW0+IGdldHMgYXBwbGllZCB0byBhIGNvbXBsZXRlIFVSTAotaW4gcGVyLXNlcnZlciBjb25maWd1cmF0aW9uIGZpbGVzLiA8Yj5CdXQgaW4gcGVyLWRpcmVjdG9yeSBjb25maWd1cmF0aW9uCi1maWxlcywgdGhlIHBlci1kaXJlY3RvcnkgcHJlZml4ICh3aGljaCBhbHdheXMgaXMgdGhlIHNhbWUgZm9yIGEgc3BlY2lmaWMKLWRpcmVjdG9yeSEpIGdldHMgYXV0b21hdGljYWxseSA8ZW0+cmVtb3ZlZDwvZW0+IGZvciB0aGUgcGF0dGVybiBtYXRjaGluZyBhbmQKLWF1dG9tYXRpY2FsbHkgPGVtPmFkZGVkPC9lbT4gYWZ0ZXIgdGhlIHN1YnN0aXR1dGlvbiBoYXMgYmVlbiBkb25lLjwvYj4gVGhpcyBmZWF0dXJlIGlzCi1lc3NlbnRpYWwgZm9yIG1hbnkgc29ydHMgb2YgcmV3cml0aW5nLCBiZWNhdXNlIHdpdGhvdXQgdGhpcyBwcmVmaXggc3RyaXBwaW5nCi15b3UgaGF2ZSB0byBtYXRjaCB0aGUgcGFyZW50IGRpcmVjdG9yeSB3aGljaCBpcyBub3QgYWx3YXlzIHBvc3NpYmxlLgotPHA+Ci1UaGVyZSBpcyBvbmUgZXhjZXB0aW9uOiBJZiBhIHN1YnN0aXR1dGlvbiBzdHJpbmcgc3RhcnRzIHdpdGgKLWBgPHR0Pmh0dHA6Ly88L3R0PicnIHRoZW4gdGhlIGRpcmVjdG9yeSBwcmVmaXggd2lsbCBiZSA8Yj5ub3Q8L2I+IGFkZGVkIGFuZCBhCi1leHRlcm5hbCByZWRpcmVjdCBvciBwcm94eSB0aHJvdWdocHV0IChpZiBmbGFnIDxiPlA8L2I+IGlzIHVzZWQhKSBpcyBmb3JjZWQhCi08L3RkPjwvdHI+Ci08L3RhYmxlPgotCi08cD4KLTx0YWJsZSB3aWR0aD03MCUgYm9yZGVyPTIgYmdjb2xvcj0iI2MwYzBlMCIgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0xMD4KLTx0cj48dGQ+Ci1Ob3RpY2UhICBUbyBlbmFibGUgdGhlIHJld3JpdGluZyBlbmdpbmUgZm9yIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiBmaWxlcwoteW91IG5lZWQgdG8gc2V0IGBgPHR0PlJld3JpdGVFbmdpbmUgT248L3R0PicnIGluIHRoZXNlIGZpbGVzIDxiPmFuZDwvYj4KLWBgPHR0Pk9wdGlvbiBGb2xsb3dTeW1MaW5rczwvdHQ+JycgZW5hYmxlZC4gSWYgeW91ciBhZG1pbmlzdHJhdG9yIGhhcwotZGlzYWJsZWQgb3ZlcnJpZGUgb2YgPHR0PkZvbGxvd1N5bUxpbmtzPC90dD4gZm9yIGEgdXNlcidzIGRpcmVjdG9yeSwgdGhlbgoteW91IGNhbm5vdCB1c2UgdGhlIHJld3JpdGluZyBlbmdpbmUuICBUaGlzIHJlc3RyaWN0aW9uIGlzIG5lZWRlZCBmb3IKLXNlY3VyaXR5IHJlYXNvbnMuCi08L3RkPjwvdHI+Ci08L3RhYmxlPgotCi08cD4KLUhlcmUgYXJlIGFsbCBwb3NzaWJsZSBzdWJzdGl0dXRpb24gY29tYmluYXRpb25zIGFuZCB0aGVpciBtZWFuaW5nczoKLQotPHA+Ci08Yj5JbnNpZGUgcGVyLXNlcnZlciBjb25maWd1cmF0aW9uICg8dHQ+aHR0cGQuY29uZjwvdHQ+KTxicj4KLWZvciByZXF1ZXN0IGBgPHR0PkdFVCAvc29tZXBhdGgvcGF0aGluZm88L3R0PicnOjwvYj48YnI+Ci0KLTxwPgotPHRhYmxlIGJnY29sb3I9IiNkMGQwZDAiIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRpbmc9NT4KLTx0cj4KLTx0ZD4KLTxwcmU+Ci08Yj5HaXZlbiBSdWxlPC9iPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+UmVzdWx0aW5nIFN1YnN0aXR1dGlvbjwvYj4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLV4vc29tZXBhdGgoLiopIG90aGVycGF0aCQxICAgICAgICAgICAgICAgICAgICAgIG5vdCBzdXBwb3J0ZWQsIGJlY2F1c2UgaW52YWxpZCEKLQotXi9zb21lcGF0aCguKikgb3RoZXJwYXRoJDEgIFtSXSAgICAgICAgICAgICAgICAgbm90IHN1cHBvcnRlZCwgYmVjYXVzZSBpbnZhbGlkIQotCi1eL3NvbWVwYXRoKC4qKSBvdGhlcnBhdGgkMSAgW1BdICAgICAgICAgICAgICAgICBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIGludmFsaWQhCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1eL3NvbWVwYXRoKC4qKSAvb3RoZXJwYXRoJDEgICAgICAgICAgICAgICAgICAgICAvb3RoZXJwYXRoL3BhdGhpbmZvCi0KLV4vc29tZXBhdGgoLiopIC9vdGhlcnBhdGgkMSBbUl0gICAgICAgICAgICAgICAgIGh0dHA6Ly90aGlzaG9zdC9vdGhlcnBhdGgvcGF0aGluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYSBleHRlcm5hbCByZWRpcmVjdGlvbgotCi1eL3NvbWVwYXRoKC4qKSAvb3RoZXJwYXRoJDEgW1BdICAgICAgICAgICAgICAgICBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIHNpbGx5IQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotXi9zb21lcGF0aCguKikgaHR0cDovL3RoaXNob3N0L290aGVycGF0aCQxICAgICAgL290aGVycGF0aC9wYXRoaW5mbwotCi1eL3NvbWVwYXRoKC4qKSBodHRwOi8vdGhpc2hvc3Qvb3RoZXJwYXRoJDEgW1JdICBodHRwOi8vdGhpc2hvc3Qvb3RoZXJwYXRoL3BhdGhpbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWEgZXh0ZXJuYWwgcmVkaXJlY3Rpb24KLQotXi9zb21lcGF0aCguKikgaHR0cDovL3RoaXNob3N0L290aGVycGF0aCQxIFtQXSAgbm90IHN1cHBvcnRlZCwgYmVjYXVzZSBzaWxseSEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLV4vc29tZXBhdGgoLiopIGh0dHA6Ly9vdGhlcmhvc3Qvb3RoZXJwYXRoJDEgICAgIGh0dHA6Ly9vdGhlcmhvc3Qvb3RoZXJwYXRoL3BhdGhpbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWEgZXh0ZXJuYWwgcmVkaXJlY3Rpb24KLQotXi9zb21lcGF0aCguKikgaHR0cDovL290aGVyaG9zdC9vdGhlcnBhdGgkMSBbUl0gaHR0cDovL290aGVyaG9zdC9vdGhlcnBhdGgvcGF0aGluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYSBleHRlcm5hbCByZWRpcmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoZSBbUl0gZmxhZyBpcyByZWR1bmRhbnQpCi0KLV4vc29tZXBhdGgoLiopIGh0dHA6Ly9vdGhlcmhvc3Qvb3RoZXJwYXRoJDEgW1BdIGh0dHA6Ly9vdGhlcmhvc3Qvb3RoZXJwYXRoL3BhdGhpbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWEgaW50ZXJuYWwgcHJveHkKLTwvcHJlPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotCi08cD4KLTxiPkluc2lkZSBwZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24gZm9yIDx0dD4vc29tZXBhdGg8L3R0Pjxicj4KLShpLmUuIGZpbGUgPHR0Pi5odGFjY2VzczwvdHQ+IGluIGRpciA8dHQ+L3BoeXNpY2FsL3BhdGgvdG8vc29tZXBhdGg8L3R0PiBjb250YWluaW5nCi08dHQ+UmV3cml0ZUJhc2UgL3NvbWVwYXRoPC90dD4pPGJyPiBmb3IKLXJlcXVlc3QgYGA8dHQ+R0VUIC9zb21lcGF0aC9sb2NhbHBhdGgvcGF0aGluZm88L3R0PicnOjwvYj48YnI+Ci0KLTxwPgotPHRhYmxlIGJnY29sb3I9IiNkMGQwZDAiIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRpbmc9NT4KLTx0cj4KLTx0ZD4KLTxwcmU+Ci08Yj5HaXZlbiBSdWxlPC9iPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+UmVzdWx0aW5nIFN1YnN0aXR1dGlvbjwvYj4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLV5sb2NhbHBhdGgoLiopIG90aGVycGF0aCQxICAgICAgICAgICAgICAgICAgICAgIC9zb21lcGF0aC9vdGhlcnBhdGgvcGF0aGluZm8KLQotXmxvY2FscGF0aCguKikgb3RoZXJwYXRoJDEgIFtSXSAgICAgICAgICAgICAgICAgaHR0cDovL3RoaXNob3N0L3NvbWVwYXRoL290aGVycGF0aC9wYXRoaW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlhIGV4dGVybmFsIHJlZGlyZWN0aW9uCi0KLV5sb2NhbHBhdGgoLiopIG90aGVycGF0aCQxICBbUF0gICAgICAgICAgICAgICAgIG5vdCBzdXBwb3J0ZWQsIGJlY2F1c2Ugc2lsbHkhCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1ebG9jYWxwYXRoKC4qKSAvb3RoZXJwYXRoJDEgICAgICAgICAgICAgICAgICAgICAvb3RoZXJwYXRoL3BhdGhpbmZvCi0KLV5sb2NhbHBhdGgoLiopIC9vdGhlcnBhdGgkMSBbUl0gICAgICAgICAgICAgICAgIGh0dHA6Ly90aGlzaG9zdC9vdGhlcnBhdGgvcGF0aGluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYSBleHRlcm5hbCByZWRpcmVjdGlvbgotCi1ebG9jYWxwYXRoKC4qKSAvb3RoZXJwYXRoJDEgW1BdICAgICAgICAgICAgICAgICBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIHNpbGx5IQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotXmxvY2FscGF0aCguKikgaHR0cDovL3RoaXNob3N0L290aGVycGF0aCQxICAgICAgL290aGVycGF0aC9wYXRoaW5mbwotCi1ebG9jYWxwYXRoKC4qKSBodHRwOi8vdGhpc2hvc3Qvb3RoZXJwYXRoJDEgW1JdICBodHRwOi8vdGhpc2hvc3Qvb3RoZXJwYXRoL3BhdGhpbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWEgZXh0ZXJuYWwgcmVkaXJlY3Rpb24KLQotXmxvY2FscGF0aCguKikgaHR0cDovL3RoaXNob3N0L290aGVycGF0aCQxIFtQXSAgbm90IHN1cHBvcnRlZCwgYmVjYXVzZSBzaWxseSEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLV5sb2NhbHBhdGgoLiopIGh0dHA6Ly9vdGhlcmhvc3Qvb3RoZXJwYXRoJDEgICAgIGh0dHA6Ly9vdGhlcmhvc3Qvb3RoZXJwYXRoL3BhdGhpbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWEgZXh0ZXJuYWwgcmVkaXJlY3Rpb24KLQotXmxvY2FscGF0aCguKikgaHR0cDovL290aGVyaG9zdC9vdGhlcnBhdGgkMSBbUl0gaHR0cDovL290aGVyaG9zdC9vdGhlcnBhdGgvcGF0aGluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYSBleHRlcm5hbCByZWRpcmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoZSBbUl0gZmxhZyBpcyByZWR1bmRhbnQpCi0KLV5sb2NhbHBhdGgoLiopIGh0dHA6Ly9vdGhlcmhvc3Qvb3RoZXJwYXRoJDEgW1BdIGh0dHA6Ly9vdGhlcmhvc3Qvb3RoZXJwYXRoL3BhdGhpbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWEgaW50ZXJuYWwgcHJveHkKLTwvcHJlPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotCi0KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLQotPHA+Ci08Yj5FeGFtcGxlOjwvYj4KLTxwPgotPGJsb2NrcXVvdGU+Ci1XZSB3YW50IHRvIHJld3JpdGUgVVJMcyBvZiB0aGUgZm9ybQotPGJsb2NrcXVvdGU+Ci08Y29kZT4vPC9jb2RlPiA8ZW0+TGFuZ3VhZ2U8L2VtPgotPGNvZGU+L348L2NvZGU+IDxlbT5SZWFsbmFtZTwvZW0+Ci08Y29kZT4vLi4uLzwvY29kZT4gPGVtPkZpbGU8L2VtPgotPC9ibG9ja3F1b3RlPgotaW50bwotPGJsb2NrcXVvdGU+Ci08Y29kZT4vdS88L2NvZGU+IDxlbT5Vc2VybmFtZTwvZW0+Ci08Y29kZT4vLi4uLzwvY29kZT4gPGVtPkZpbGU8L2VtPgotPGNvZGU+LjwvY29kZT4gPGVtPkxhbmd1YWdlPC9lbT4KLTwvYmxvY2txdW90ZT4KLTxwPgotV2UgdGFrZSB0aGUgcmV3cml0ZSBtYXBmaWxlIGZyb20gYWJvdmUgYW5kIHNhdmUgaXQgdW5kZXIKLTxjb2RlPi9hbnl3aGVyZS9tYXAucmVhbC10by11c2VyPC9jb2RlPi4gVGhlbiB3ZSBvbmx5IGhhdmUgdG8gYWRkIHRoZQotZm9sbG93aW5nIGxpbmVzIHRvIHRoZSBBcGFjaGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gZmlsZToKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotUmV3cml0ZUxvZyAgIC9hbnl3aGVyZS9yZXdyaXRlLmxvZwotUmV3cml0ZU1hcCAgIHJlYWwtdG8tdXNlciAgICAgICAgICAgICAgIHR4dDovYW55d2hlcmUvbWFwLnJlYWwtdG8taG9zdAotUmV3cml0ZVJ1bGUgIF4vKFteL10rKS9+KFteL10rKS8oLiopJCAgIC91LyR7cmVhbC10by11c2VyOiQyfG5vYm9keX0vJDMuJDEKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPC9ibG9ja3F1b3RlPgotCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9yZXdyaXRlLnhtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfcmV3cml0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMzFlMTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9yZXdyaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3OTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgeG1sOm1hbnVhbCBbIDwhRU5USVRZIG5ic3AgIiYjMTYwOyI+IF0+Ci08P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveHNsIiBocmVmPSIuLi9zdHlsZS9tYW51YWwueHNsIj8+Ci08bW9kdWxlc3lub3BzaXM+Ci0KLTxuYW1lPm1vZF9yZXdyaXRlPC9uYW1lPiAKLQotPGRlc2NyaXB0aW9uPlByb3ZpZGVzIGEgcnVsZS1iYXNlZCByZXdyaXRpbmcgZW5naW5lIHRvIHJld3JpdGUgcmVxdWVzdGVkCi1VUkxzIG9uIHRoZSBmbHk8L2Rlc2NyaXB0aW9uPgotCi08c3RhdHVzPkV4dGVuc2lvbjwvc3RhdHVzPgotPHNvdXJjZWZpbGU+bW9kX3Jld3JpdGUuYzwvc291cmNlZmlsZT4KLTxpZGVudGlmaWVyPnJld3JpdGVfbW9kdWxlPC9pZGVudGlmaWVyPgotPGNvbXBhdGliaWxpdHk+QXZhaWxhYmxlIGluIEFwYWNoZSAxLjMgYW5kIGxhdGVyPC9jb21wYXRpYmlsaXR5PgotCi08c3VtbWFyeT4KLSAgICAgIDxibG9ja3F1b3RlPgotICAgICAgICAgICAgPGVtPmBgVGhlIGdyZWF0IHRoaW5nIGFib3V0IG1vZF9yZXdyaXRlIGlzIGl0IGdpdmVzIHlvdQotICAgICAgICAgICAgYWxsIHRoZSBjb25maWd1cmFiaWxpdHkgYW5kIGZsZXhpYmlsaXR5IG9mIFNlbmRtYWlsLgotICAgICAgICAgICAgVGhlIGRvd25zaWRlIHRvIG1vZF9yZXdyaXRlIGlzIHRoYXQgaXQgZ2l2ZXMgeW91IGFsbAotICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYWJpbGl0eSBhbmQgZmxleGliaWxpdHkgb2YgU2VuZG1haWwuJyc8L2VtPgotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIDxkaXYgYWxpZ249IlJJR0hUIj4KLSAgICAgICAgICAgICAgLS0gQnJpYW4gQmVobGVuZG9yZjxiciAvPgotICAgICAgICAgICAgICAgQXBhY2hlIEdyb3VwCi0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgIDwvYmxvY2txdW90ZT4KLQotICAgICAgPGJsb2NrcXVvdGU+Ci0gICAgICAgICAgICA8ZW0+YGAgRGVzcGl0ZSB0aGUgdG9ucyBvZiBleGFtcGxlcyBhbmQgZG9jcywKLSAgICAgICAgICAgIG1vZF9yZXdyaXRlIGlzIHZvb2Rvby4gRGFtbmVkIGNvb2wgdm9vZG9vLCBidXQgc3RpbGwKLSAgICAgICAgICAgIHZvb2Rvby4gJyc8L2VtPiAKLQotICAgICAgICAgICAgPGRpdiBhbGlnbj0iUklHSFQiPgotICAgICAgICAgICAgICAtLSBCcmlhbiBNb29yZTxiciAvPgotICAgICAgICAgICAgICAgYmVtQG5ld3MuY21jLm5ldAotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC9ibG9ja3F1b3RlPgotCi0KLSAgICAgIDxwPldlbGNvbWUgdG8gbW9kX3Jld3JpdGUsIHRoZSBTd2lzcyBBcm15IEtuaWZlIG9mIFVSTAotICAgICAgbWFuaXB1bGF0aW9uITwvcD4KLQotICAgICAgPHA+VGhpcyBtb2R1bGUgdXNlcyBhIHJ1bGUtYmFzZWQgcmV3cml0aW5nIGVuZ2luZSAoYmFzZWQgb24gYQotICAgICAgcmVndWxhci1leHByZXNzaW9uIHBhcnNlcikgdG8gcmV3cml0ZSByZXF1ZXN0ZWQgVVJMcyBvbiB0aGUKLSAgICAgIGZseS4gSXQgc3VwcG9ydHMgYW4gdW5saW1pdGVkIG51bWJlciBvZiBydWxlcyBhbmQgYW4KLSAgICAgIHVubGltaXRlZCBudW1iZXIgb2YgYXR0YWNoZWQgcnVsZSBjb25kaXRpb25zIGZvciBlYWNoIHJ1bGUgdG8KLSAgICAgIHByb3ZpZGUgYSByZWFsbHkgZmxleGlibGUgYW5kIHBvd2VyZnVsIFVSTCBtYW5pcHVsYXRpb24KLSAgICAgIG1lY2hhbmlzbS4gVGhlIFVSTCBtYW5pcHVsYXRpb25zIGNhbiBkZXBlbmQgb24gdmFyaW91cyB0ZXN0cywKLSAgICAgIGZvciBpbnN0YW5jZSBzZXJ2ZXIgdmFyaWFibGVzLCBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIEhUVFAKLSAgICAgIGhlYWRlcnMsIHRpbWUgc3RhbXBzIGFuZCBldmVuIGV4dGVybmFsIGRhdGFiYXNlIGxvb2t1cHMgaW4KLSAgICAgIHZhcmlvdXMgZm9ybWF0cyBjYW4gYmUgdXNlZCB0byBhY2hpZXZlIGEgcmVhbGx5IGdyYW51bGFyIFVSTAotICAgICAgbWF0Y2hpbmcuPC9wPgotCi0gICAgICA8cD5UaGlzIG1vZHVsZSBvcGVyYXRlcyBvbiB0aGUgZnVsbCBVUkxzIChpbmNsdWRpbmcgdGhlCi0gICAgICBwYXRoLWluZm8gcGFydCkgYm90aCBpbiBwZXItc2VydmVyIGNvbnRleHQKLSAgICAgICg8Y29kZT5odHRwZC5jb25mPC9jb2RlPikgYW5kIHBlci1kaXJlY3RvcnkgY29udGV4dAotICAgICAgKDxjb2RlPi5odGFjY2VzczwvY29kZT4pIGFuZCBjYW4gZXZlbiBnZW5lcmF0ZSBxdWVyeS1zdHJpbmcKLSAgICAgIHBhcnRzIG9uIHJlc3VsdC4gVGhlIHJld3JpdHRlbiByZXN1bHQgY2FuIGxlYWQgdG8gaW50ZXJuYWwKLSAgICAgIHN1Yi1wcm9jZXNzaW5nLCBleHRlcm5hbCByZXF1ZXN0IHJlZGlyZWN0aW9uIG9yIGV2ZW4gdG8gYW4KLSAgICAgIGludGVybmFsIHByb3h5IHRocm91Z2hwdXQuPC9wPgotCi0gICAgICA8cD5CdXQgYWxsIHRoaXMgZnVuY3Rpb25hbGl0eSBhbmQgZmxleGliaWxpdHkgaGFzIGl0cwotICAgICAgZHJhd2JhY2s6IGNvbXBsZXhpdHkuIFNvIGRvbid0IGV4cGVjdCB0byB1bmRlcnN0YW5kIHRoaXMKLSAgICAgIGVudGlyZSBtb2R1bGUgaW4ganVzdCBvbmUgZGF5LjwvcD4KLQotICAgICAgPHA+VGhpcyBtb2R1bGUgd2FzIGludmVudGVkIGFuZCBvcmlnaW5hbGx5IHdyaXR0ZW4gaW4gQXByaWwKLSAgICAgIDE5OTYgYW5kIGdpZnRlZCBleGNsdXNpdmVseSB0byB0aGUgVGhlIEFwYWNoZSBHcm91cCBpbiBKdWx5IDE5OTcKLSAgICAgIGJ5PC9wPgotCi0gICAgICA8YmxvY2txdW90ZT4KLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5lbmdlbHNjaGFsbC5jb20vIj48Y29kZT5SYWxmIFMuCi0gICAgICAgIEVuZ2Vsc2NoYWxsPC9jb2RlPjwvYT48YnIgLz4KLSAgICAgICAgIDxhCi0gICAgICAgIGhyZWY9Im1haWx0bzpyc2VAZW5nZWxzY2hhbGwuY29tIj48Y29kZT5yc2VAZW5nZWxzY2hhbGwuY29tPC9jb2RlPjwvYT48YnIgLz4KLSAgICAgICAgIDxhCi0gICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuZW5nZWxzY2hhbGwuY29tLyI+PGNvZGU+d3d3LmVuZ2Vsc2NoYWxsLmNvbTwvY29kZT48L2E+Ci0gICAgICA8L2Jsb2NrcXVvdGU+Ci08L3N1bW1hcnk+Ci0KLTxzZWN0aW9uIGlkPSJJbnRlcm5hbCI+PHRpdGxlPkludGVyYWwgUHJvY2Vzc2luZzwvdGl0bGU+Ci0KLSAgICAgIDxwPlRoZSBpbnRlcm5hbCBwcm9jZXNzaW5nIG9mIHRoaXMgbW9kdWxlIGlzIHZlcnkgY29tcGxleCBidXQKLSAgICAgIG5lZWRzIHRvIGJlIGV4cGxhaW5lZCBvbmNlIGV2ZW4gdG8gdGhlIGF2ZXJhZ2UgdXNlciB0byBhdm9pZAotICAgICAgY29tbW9uIG1pc3Rha2VzIGFuZCB0byBsZXQgeW91IGV4cGxvaXQgaXRzIGZ1bGwKLSAgICAgIGZ1bmN0aW9uYWxpdHkuPC9wPgotCi08c2VjdGlvbiBpZD0iSW50ZXJuYWxBUEkiPjx0aXRsZT5BUEkgUGhhc2VzPC90aXRsZT4KLQotICAgICAgPHA+Rmlyc3QgeW91IGhhdmUgdG8gdW5kZXJzdGFuZCB0aGF0IHdoZW4gQXBhY2hlIHByb2Nlc3NlcyBhCi0gICAgICBIVFRQIHJlcXVlc3QgaXQgZG9lcyB0aGlzIGluIHBoYXNlcy4gQSBob29rIGZvciBlYWNoIG9mIHRoZXNlCi0gICAgICBwaGFzZXMgaXMgcHJvdmlkZWQgYnkgdGhlIEFwYWNoZSBBUEkuIE1vZF9yZXdyaXRlIHVzZXMgdHdvIG9mCi0gICAgICB0aGVzZSBob29rczogdGhlIFVSTC10by1maWxlbmFtZSB0cmFuc2xhdGlvbiBob29rIHdoaWNoIGlzCi0gICAgICB1c2VkIGFmdGVyIHRoZSBIVFRQIHJlcXVlc3QgaGFzIGJlZW4gcmVhZCBidXQgYmVmb3JlIGFueQotICAgICAgYXV0aG9yaXphdGlvbiBzdGFydHMgYW5kIHRoZSBGaXh1cCBob29rIHdoaWNoIGlzIHRyaWdnZXJlZAotICAgICAgYWZ0ZXIgdGhlIGF1dGhvcml6YXRpb24gcGhhc2VzIGFuZCBhZnRlciB0aGUgcGVyLWRpcmVjdG9yeQotICAgICAgY29uZmlnIGZpbGVzICg8Y29kZT4uaHRhY2Nlc3M8L2NvZGU+KSBoYXZlIGJlZW4gcmVhZCwgYnV0Ci0gICAgICBiZWZvcmUgdGhlIGNvbnRlbnQgaGFuZGxlciBpcyBhY3RpdmF0ZWQuPC9wPgotCi0gICAgICA8cD5TbywgYWZ0ZXIgYSByZXF1ZXN0IGNvbWVzIGluIGFuZCBBcGFjaGUgaGFzIGRldGVybWluZWQgdGhlCi0gICAgICBjb3JyZXNwb25kaW5nIHNlcnZlciAob3IgdmlydHVhbCBzZXJ2ZXIpIHRoZSByZXdyaXRpbmcgZW5naW5lCi0gICAgICBzdGFydHMgcHJvY2Vzc2luZyBvZiBhbGwgbW9kX3Jld3JpdGUgZGlyZWN0aXZlcyBmcm9tIHRoZQotICAgICAgcGVyLXNlcnZlciBjb25maWd1cmF0aW9uIGluIHRoZSBVUkwtdG8tZmlsZW5hbWUgcGhhc2UuIEEgZmV3Ci0gICAgICBzdGVwcyBsYXRlciB3aGVuIHRoZSBmaW5hbCBkYXRhIGRpcmVjdG9yaWVzIGFyZSBmb3VuZCwgdGhlCi0gICAgICBwZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcyBvZiBtb2RfcmV3cml0ZSBhcmUKLSAgICAgIHRyaWdnZXJlZCBpbiB0aGUgRml4dXAgcGhhc2UuIEluIGJvdGggc2l0dWF0aW9ucyBtb2RfcmV3cml0ZQotICAgICAgcmV3cml0ZXMgVVJMcyBlaXRoZXIgdG8gbmV3IFVSTHMgb3IgdG8gZmlsZW5hbWVzLCBhbHRob3VnaAotICAgICAgdGhlcmUgaXMgbm8gb2J2aW91cyBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRoZW0uIFRoaXMgaXMgYSB1c2FnZQotICAgICAgb2YgdGhlIEFQSSB3aGljaCB3YXMgbm90IGludGVuZGVkIHRvIGJlIHRoaXMgd2F5IHdoZW4gdGhlIEFQSQotICAgICAgd2FzIGRlc2lnbmVkLCBidXQgYXMgb2YgQXBhY2hlIDEueCB0aGlzIGlzIHRoZSBvbmx5IHdheQotICAgICAgbW9kX3Jld3JpdGUgY2FuIG9wZXJhdGUuIFRvIG1ha2UgdGhpcyBwb2ludCBtb3JlIGNsZWFyCi0gICAgICByZW1lbWJlciB0aGUgZm9sbG93aW5nIHR3byBwb2ludHM6PC9wPgotCi0gICAgICA8b2w+Ci0gICAgICAgIDxsaT5BbHRob3VnaCBtb2RfcmV3cml0ZSByZXdyaXRlcyBVUkxzIHRvIFVSTHMsIFVSTHMgdG8KLSAgICAgICAgZmlsZW5hbWVzIGFuZCBldmVuIGZpbGVuYW1lcyB0byBmaWxlbmFtZXMsIHRoZSBBUEkKLSAgICAgICAgY3VycmVudGx5IHByb3ZpZGVzIG9ubHkgYSBVUkwtdG8tZmlsZW5hbWUgaG9vay4gSW4gQXBhY2hlCi0gICAgICAgIDIuMCB0aGUgdHdvIG1pc3NpbmcgaG9va3Mgd2lsbCBiZSBhZGRlZCB0byBtYWtlIHRoZQotICAgICAgICBwcm9jZXNzaW5nIG1vcmUgY2xlYXIuIEJ1dCB0aGlzIHBvaW50IGhhcyBubyBkcmF3YmFja3MgZm9yCi0gICAgICAgIHRoZSB1c2VyLCBpdCBpcyBqdXN0IGEgZmFjdCB3aGljaCBzaG91bGQgYmUgcmVtZW1iZXJlZDoKLSAgICAgICAgQXBhY2hlIGRvZXMgbW9yZSBpbiB0aGUgVVJMLXRvLWZpbGVuYW1lIGhvb2sgdGhhbiB0aGUgQVBJCi0gICAgICAgIGludGVuZHMgZm9yIGl0LjwvbGk+Ci0KLSAgICAgICAgPGxpPgotICAgICAgICAgIFVuYmVsaWV2YWJseSBtb2RfcmV3cml0ZSBwcm92aWRlcyBVUkwgbWFuaXB1bGF0aW9ucyBpbgotICAgICAgICAgIHBlci1kaXJlY3RvcnkgY29udGV4dCwgPGVtPmkuZS48L2VtPiwgd2l0aGluCi0gICAgICAgICAgPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBmaWxlcywgYWx0aG91Z2ggdGhlc2UgYXJlIHJlYWNoZWQKLSAgICAgICAgICBhIHZlcnkgbG9uZyB0aW1lIGFmdGVyIHRoZSBVUkxzIGhhdmUgYmVlbiB0cmFuc2xhdGVkIHRvCi0gICAgICAgICAgZmlsZW5hbWVzLiBJdCBoYXMgdG8gYmUgdGhpcyB3YXkgYmVjYXVzZQotICAgICAgICAgIDxjb2RlPi5odGFjY2VzczwvY29kZT4gZmlsZXMgbGl2ZSBpbiB0aGUgZmlsZXN5c3RlbSwgc28KLSAgICAgICAgICBwcm9jZXNzaW5nIGhhcyBhbHJlYWR5IHJlYWNoZWQgdGhpcyBzdGFnZS4gSW4gb3RoZXIKLSAgICAgICAgICB3b3JkczogQWNjb3JkaW5nIHRvIHRoZSBBUEkgcGhhc2VzIGF0IHRoaXMgdGltZSBpdCBpcyB0b28KLSAgICAgICAgICBsYXRlIGZvciBhbnkgVVJMIG1hbmlwdWxhdGlvbnMuIFRvIG92ZXJjb21lIHRoaXMgY2hpY2tlbgotICAgICAgICAgIGFuZCBlZ2cgcHJvYmxlbSBtb2RfcmV3cml0ZSB1c2VzIGEgdHJpY2s6IFdoZW4geW91Ci0gICAgICAgICAgbWFuaXB1bGF0ZSBhIFVSTC9maWxlbmFtZSBpbiBwZXItZGlyZWN0b3J5IGNvbnRleHQKLSAgICAgICAgICBtb2RfcmV3cml0ZSBmaXJzdCByZXdyaXRlcyB0aGUgZmlsZW5hbWUgYmFjayB0byBpdHMKLSAgICAgICAgICBjb3JyZXNwb25kaW5nIFVSTCAod2hpY2ggaXMgdXN1YWxseSBpbXBvc3NpYmxlLCBidXQgc2VlCi0gICAgICAgICAgdGhlIDxjb2RlPlJld3JpdGVCYXNlPC9jb2RlPiBkaXJlY3RpdmUgYmVsb3cgZm9yIHRoZQotICAgICAgICAgIHRyaWNrIHRvIGFjaGlldmUgdGhpcykgYW5kIHRoZW4gaW5pdGlhdGVzIGEgbmV3IGludGVybmFsCi0gICAgICAgICAgc3ViLXJlcXVlc3Qgd2l0aCB0aGUgbmV3IFVSTC4gVGhpcyByZXN0YXJ0cyBwcm9jZXNzaW5nIG9mCi0gICAgICAgICAgdGhlIEFQSSBwaGFzZXMuIAotCi0gICAgICAgICAgPHA+QWdhaW4gbW9kX3Jld3JpdGUgdHJpZXMgaGFyZCB0byBtYWtlIHRoaXMgY29tcGxpY2F0ZWQKLSAgICAgICAgICBzdGVwIHRvdGFsbHkgdHJhbnNwYXJlbnQgdG8gdGhlIHVzZXIsIGJ1dCB5b3Ugc2hvdWxkCi0gICAgICAgICAgcmVtZW1iZXIgaGVyZTogV2hpbGUgVVJMIG1hbmlwdWxhdGlvbnMgaW4gcGVyLXNlcnZlcgotICAgICAgICAgIGNvbnRleHQgYXJlIHJlYWxseSBmYXN0IGFuZCBlZmZpY2llbnQsIHBlci1kaXJlY3RvcnkKLSAgICAgICAgICByZXdyaXRlcyBhcmUgc2xvdyBhbmQgaW5lZmZpY2llbnQgZHVlIHRvIHRoaXMgY2hpY2tlbiBhbmQKLSAgICAgICAgICBlZ2cgcHJvYmxlbS4gQnV0IG9uIHRoZSBvdGhlciBoYW5kIHRoaXMgaXMgdGhlIG9ubHkgd2F5Ci0gICAgICAgICAgbW9kX3Jld3JpdGUgY2FuIHByb3ZpZGUgKGxvY2FsbHkgcmVzdHJpY3RlZCkgVVJMCi0gICAgICAgICAgbWFuaXB1bGF0aW9ucyB0byB0aGUgYXZlcmFnZSB1c2VyLjwvcD4KLSAgICAgICAgPC9saT4KLSAgICAgIDwvb2w+Ci0KLSAgICAgIDxwPkRvbid0IGZvcmdldCB0aGVzZSB0d28gcG9pbnRzITwvcD4KLTwvc2VjdGlvbj4KLQotPHNlY3Rpb24gaWQ9IkludGVybmFsUnVsZXNldCI+PHRpdGxlPlJ1bGVzZXQgUHJvY2Vzc2luZzwvdGl0bGU+Ci0gCi0gICAgICA8cD5Ob3cgd2hlbiBtb2RfcmV3cml0ZSBpcyB0cmlnZ2VyZWQgaW4gdGhlc2UgdHdvIEFQSSBwaGFzZXMsIGl0Ci0gICAgICByZWFkcyB0aGUgY29uZmlndXJlZCBydWxlc2V0cyBmcm9tIGl0cyBjb25maWd1cmF0aW9uCi0gICAgICBzdHJ1Y3R1cmUgKHdoaWNoIGl0c2VsZiB3YXMgZWl0aGVyIGNyZWF0ZWQgb24gc3RhcnR1cCBmb3IKLSAgICAgIHBlci1zZXJ2ZXIgY29udGV4dCBvciBkdXJpbmcgdGhlIGRpcmVjdG9yeSB3YWxrIG9mIHRoZSBBcGFjaGUKLSAgICAgIGtlcm5lbCBmb3IgcGVyLWRpcmVjdG9yeSBjb250ZXh0KS4gVGhlbiB0aGUgVVJMIHJld3JpdGluZwotICAgICAgZW5naW5lIGlzIHN0YXJ0ZWQgd2l0aCB0aGUgY29udGFpbmVkIHJ1bGVzZXQgKG9uZSBvciBtb3JlCi0gICAgICBydWxlcyB0b2dldGhlciB3aXRoIHRoZWlyIGNvbmRpdGlvbnMpLiBUaGUgb3BlcmF0aW9uIG9mIHRoZQotICAgICAgVVJMIHJld3JpdGluZyBlbmdpbmUgaXRzZWxmIGlzIGV4YWN0bHkgdGhlIHNhbWUgZm9yIGJvdGgKLSAgICAgIGNvbmZpZ3VyYXRpb24gY29udGV4dHMuIE9ubHkgdGhlIGZpbmFsIHJlc3VsdCBwcm9jZXNzaW5nIGlzCi0gICAgICBkaWZmZXJlbnQuIDwvcD4KLQotICAgICAgPHA+VGhlIG9yZGVyIG9mIHJ1bGVzIGluIHRoZSBydWxlc2V0IGlzIGltcG9ydGFudCBiZWNhdXNlIHRoZQotICAgICAgcmV3cml0aW5nIGVuZ2luZSBwcm9jZXNzZXMgdGhlbSBpbiBhIHNwZWNpYWwgKGFuZCBub3QgdmVyeQotICAgICAgb2J2aW91cykgb3JkZXIuIFRoZSBydWxlIGlzIHRoaXM6IFRoZSByZXdyaXRpbmcgZW5naW5lIGxvb3BzCi0gICAgICB0aHJvdWdoIHRoZSBydWxlc2V0IHJ1bGUgYnkgcnVsZSAoPGRpcmVjdGl2ZQotICAgICAgbW9kdWxlPSJtb2RfcmV3cml0ZSI+UmV3cml0ZVJ1bGU8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlcykgYW5kCi0gICAgICB3aGVuIGEgcGFydGljdWxhciBydWxlIG1hdGNoZXMgaXQgb3B0aW9uYWxseSBsb29wcyB0aHJvdWdoCi0gICAgICBleGlzdGluZyBjb3JyZXNwb25kaW5nIGNvbmRpdGlvbnMgKDxjb2RlPlJld3JpdGVDb25kPC9jb2RlPgotICAgICAgZGlyZWN0aXZlcykuIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMgdGhlIGNvbmRpdGlvbnMgYXJlIGdpdmVuCi0gICAgICBmaXJzdCwgYW5kIHNvIHRoZSBjb250cm9sIGZsb3cgaXMgYSBsaXR0bGUgYml0IGxvbmctd2luZGVkLiBTZWUKLSAgICAgIEZpZ3VyZSAxIGZvciBtb3JlIGRldGFpbHMuPC9wPgotCi0gICAgICA8ZGl2IGFsaWduPSJDRU5URVIiPgotICAgICAgICA8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiBib3JkZXI9IjAiPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjQ0NDQ0NDIj48aW1nCi0gICAgICAgICAgICBzcmM9Ii4uL2ltYWdlcy9tb2RfcmV3cml0ZV9maWcxLmdpZiIgd2lkdGg9IjQyOCIKLSAgICAgICAgICAgIGhlaWdodD0iMzg1IgotICAgICAgICAgICAgYWx0PSJbTmVlZHMgZ3JhcGhpY3MgY2FwYWJpbGl0eSB0byBkaXNwbGF5XSIgLz48L3RkPgotICAgICAgICAgIDwvdHI+Ci0KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgYWxpZ249IkNFTlRFUiI+PHN0cm9uZz5GaWd1cmUgMTo8L3N0cm9uZz4gVGhlCi0gICAgICAgICAgICBjb250cm9sIGZsb3cgdGhyb3VnaCB0aGUgcmV3cml0aW5nIHJ1bGVzZXQ8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L2Rpdj4KLQotICAgICAgPHA+QXMgeW91IGNhbiBzZWUsIGZpcnN0IHRoZSBVUkwgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZQotICAgICAgPGVtPlBhdHRlcm48L2VtPiBvZiBlYWNoIHJ1bGUuIFdoZW4gaXQgZmFpbHMgbW9kX3Jld3JpdGUKLSAgICAgIGltbWVkaWF0ZWx5IHN0b3BzIHByb2Nlc3NpbmcgdGhpcyBydWxlIGFuZCBjb250aW51ZXMgd2l0aCB0aGUKLSAgICAgIG5leHQgcnVsZS4gSWYgdGhlIDxlbT5QYXR0ZXJuPC9lbT4gbWF0Y2hlcywgbW9kX3Jld3JpdGUgbG9va3MKLSAgICAgIGZvciBjb3JyZXNwb25kaW5nIHJ1bGUgY29uZGl0aW9ucy4gSWYgbm9uZSBhcmUgcHJlc2VudCwgaXQKLSAgICAgIGp1c3Qgc3Vic3RpdHV0ZXMgdGhlIFVSTCB3aXRoIGEgbmV3IHZhbHVlIHdoaWNoIGlzCi0gICAgICBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBzdHJpbmcgPGVtPlN1YnN0aXR1dGlvbjwvZW0+IGFuZCBnb2VzIG9uCi0gICAgICB3aXRoIGl0cyBydWxlLWxvb3BpbmcuIEJ1dCBpZiBjb25kaXRpb25zIGV4aXN0LCBpdCBzdGFydHMgYW4KLSAgICAgIGlubmVyIGxvb3AgZm9yIHByb2Nlc3NpbmcgdGhlbSBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFyZQotICAgICAgbGlzdGVkLiBGb3IgY29uZGl0aW9ucyB0aGUgbG9naWMgaXMgZGlmZmVyZW50OiB3ZSBkb24ndCBtYXRjaAotICAgICAgYSBwYXR0ZXJuIGFnYWluc3QgdGhlIGN1cnJlbnQgVVJMLiBJbnN0ZWFkIHdlIGZpcnN0IGNyZWF0ZSBhCi0gICAgICBzdHJpbmcgPGVtPlRlc3RTdHJpbmc8L2VtPiBieSBleHBhbmRpbmcgdmFyaWFibGVzLAotICAgICAgYmFjay1yZWZlcmVuY2VzLCBtYXAgbG9va3VwcywgPGVtPmV0Yy48L2VtPiBhbmQgdGhlbiB3ZSB0cnkKLSAgICAgIHRvIG1hdGNoIDxlbT5Db25kUGF0dGVybjwvZW0+IGFnYWluc3QgaXQuIElmIHRoZSBwYXR0ZXJuCi0gICAgICBkb2Vzbid0IG1hdGNoLCB0aGUgY29tcGxldGUgc2V0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotICAgICAgY29ycmVzcG9uZGluZyBydWxlIGZhaWxzLiBJZiB0aGUgcGF0dGVybiBtYXRjaGVzLCB0aGVuIHRoZQotICAgICAgbmV4dCBjb25kaXRpb24gaXMgcHJvY2Vzc2VkIHVudGlsIG5vIG1vcmUgY29uZGl0aW9ucyBhcmUKLSAgICAgIGF2YWlsYWJsZS4gSWYgYWxsIGNvbmRpdGlvbnMgbWF0Y2gsIHByb2Nlc3NpbmcgaXMgY29udGludWVkCi0gICAgICB3aXRoIHRoZSBzdWJzdGl0dXRpb24gb2YgdGhlIFVSTCB3aXRoCi0gICAgICA8ZW0+U3Vic3RpdHV0aW9uPC9lbT4uPC9wPgotCi08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uIGlkPSJxdW90aW5nIj48dGl0bGU+UXVvdGluZyBTcGVjaWFsIENoYXJhY3RlcnM8L3RpdGxlPgotCi0gICAgICA8cD5BcyBvZiBBcGFjaGUgMS4zLjIwLCBzcGVjaWFsIGNoYXJhY3RlcnMgaW4KLSAgICAgIDxpPlRlc3RTdHJpbmc8L2k+IGFuZCA8aT5TdWJzdGl0dXRpb248L2k+IHN0cmluZ3MgY2FuIGJlCi0gICAgICBlc2NhcGVkICh0aGF0IGlzLCB0cmVhdGVkIGFzIG5vcm1hbCBjaGFyYWN0ZXJzIHdpdGhvdXQgdGhlaXIKLSAgICAgIHVzdWFsIHNwZWNpYWwgbWVhbmluZykgYnkgcHJlZml4aW5nIHRoZW0gd2l0aCBhIHNsb3NoICgnXCcpCi0gICAgICBjaGFyYWN0ZXIuIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuIGluY2x1ZGUgYW4gYWN0dWFsCi0gICAgICBkb2xsYXItc2lnbiBjaGFyYWN0ZXIgaW4gYSA8aT5TdWJzdGl0dXRpb248L2k+IHN0cmluZyBieQotICAgICAgdXNpbmcgJzxjb2RlPlwkPC9jb2RlPic7IHRoaXMga2VlcHMgbW9kX3Jld3JpdGUgZnJvbSB0cnlpbmcKLSAgICAgIHRvIHRyZWF0IGl0IGFzIGEgYmFja3JlZmVyZW5jZS48L3A+Ci08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uIGlkPSJJbnRlcm5hbEJhY2tSZWZzIj48dGl0bGU+UmVnZXggQmFjay1SZWZlcmVuY2UgQXZhaWxhYmlsaXR5PC90aXRsZT4KLQotICAgICAgPHA+T25lIGltcG9ydGFudCB0aGluZyBoZXJlIGhhcyB0byBiZSByZW1lbWJlcmVkOiBXaGVuZXZlciB5b3UKLSAgICAgIHVzZSBwYXJlbnRoZXNlcyBpbiA8ZW0+UGF0dGVybjwvZW0+IG9yIGluIG9uZSBvZiB0aGUKLSAgICAgIDxlbT5Db25kUGF0dGVybjwvZW0+LCBiYWNrLXJlZmVyZW5jZXMgYXJlIGludGVybmFsbHkgY3JlYXRlZAotICAgICAgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCB0aGUgc3RyaW5ncyA8Y29kZT4kTjwvY29kZT4gYW5kCi0gICAgICA8Y29kZT4lTjwvY29kZT4gKHNlZSBiZWxvdykuIFRoZXNlIGFyZSBhdmFpbGFibGUgZm9yIGNyZWF0aW5nCi0gICAgICB0aGUgc3RyaW5ncyA8ZW0+U3Vic3RpdHV0aW9uPC9lbT4gYW5kIDxlbT5UZXN0U3RyaW5nPC9lbT4uCi0gICAgICBGaWd1cmUgMiBzaG93cyB0byB3aGljaCBsb2NhdGlvbnMgdGhlIGJhY2stcmVmZXJlbmNlcyBhcmUKLSAgICAgIHRyYW5zZmVyZWQgZm9yIGV4cGFuc2lvbi48L3A+Ci0KLSAgICAgIDxkaXYgYWxpZ249IkNFTlRFUiI+Ci0gICAgICAgIDx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIGJvcmRlcj0iMCI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGJnY29sb3I9IiNDQ0NDQ0MiPjxpbWcKLSAgICAgICAgICAgIHNyYz0iLi4vaW1hZ2VzL21vZF9yZXdyaXRlX2ZpZzIuZ2lmIiB3aWR0aD0iMzgxIgotICAgICAgICAgICAgaGVpZ2h0PSIxNzkiCi0gICAgICAgICAgICBhbHQ9IltOZWVkcyBncmFwaGljcyBjYXBhYmlsaXR5IHRvIGRpc3BsYXldIiAvPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLQotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBhbGlnbj0iQ0VOVEVSIj48c3Ryb25nPkZpZ3VyZSAyOjwvc3Ryb25nPiBUaGUKLSAgICAgICAgICAgIGJhY2stcmVmZXJlbmNlIGZsb3cgdGhyb3VnaCBhIHJ1bGU8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L2Rpdj4KLQotICAgICAgPHA+V2Uga25vdyB0aGlzIHdhcyBhIGNyYXNoIGNvdXJzZSBvbiBtb2RfcmV3cml0ZSdzIGludGVybmFsCi0gICAgICBwcm9jZXNzaW5nLiBCdXQgeW91IHdpbGwgYmVuZWZpdCBmcm9tIHRoaXMga25vd2xlZGdlIHdoZW4KLSAgICAgIHJlYWRpbmcgdGhlIGZvbGxvd2luZyBkb2N1bWVudGF0aW9uIG9mIHRoZSBhdmFpbGFibGUKLSAgICAgIGRpcmVjdGl2ZXMuPC9wPgotCi08L3NlY3Rpb24+Ci08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uIGlkPSJFbnZWYXIiPjx0aXRsZT5FbnZpcm9ubWVudCBWYXJpYWJsZXM8L3RpdGxlPgotCi0gICAgICA8cD5UaGlzIG1vZHVsZSBrZWVwcyB0cmFjayBvZiB0d28gYWRkaXRpb25hbCAobm9uLXN0YW5kYXJkKQotICAgICAgQ0dJL1NTSSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbmFtZWQgPGNvZGU+U0NSSVBUX1VSTDwvY29kZT4KLSAgICAgIGFuZCA8Y29kZT5TQ1JJUFRfVVJJPC9jb2RlPi4gVGhlc2UgY29udGFpbiB0aGUKLSAgICAgIDxlbT5sb2dpY2FsPC9lbT4gV2ViLXZpZXcgdG8gdGhlIGN1cnJlbnQgcmVzb3VyY2UsIHdoaWxlIHRoZQotICAgICAgc3RhbmRhcmQgQ0dJL1NTSSB2YXJpYWJsZXMgPGNvZGU+U0NSSVBUX05BTUU8L2NvZGU+IGFuZAotICAgICAgPGNvZGU+U0NSSVBUX0ZJTEVOQU1FPC9jb2RlPiBjb250YWluIHRoZSA8ZW0+cGh5c2ljYWw8L2VtPgotICAgICAgU3lzdGVtLXZpZXcuIDwvcD4KLQotICAgICAgPHA+Tm90aWNlOiBUaGVzZSB2YXJpYWJsZXMgaG9sZCB0aGUgVVJJL1VSTCA8ZW0+YXMgdGhleSB3ZXJlCi0gICAgICBpbml0aWFsbHkgcmVxdWVzdGVkPC9lbT4sIDxlbT5pLmUuPC9lbT4sIDxlbT5iZWZvcmU8L2VtPiBhbnkKLSAgICAgIHJld3JpdGluZy4gVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGUgcmV3cml0aW5nIHByb2Nlc3MgaXMKLSAgICAgIHByaW1hcmlseSB1c2VkIHRvIHJld3JpdGUgbG9naWNhbCBVUkxzIHRvIHBoeXNpY2FsCi0gICAgICBwYXRobmFtZXMuPC9wPgotCi0gICAgICA8cD48c3Ryb25nPkV4YW1wbGU6PC9zdHJvbmc+PC9wPgotCi08ZXhhbXBsZT4KLTxwcmU+Ci1TQ1JJUFRfTkFNRT0vc3cvbGliL3czcy90cmVlL2dsb2JhbC91L3JzZS8ud3d3L2luZGV4Lmh0bWwKLVNDUklQVF9GSUxFTkFNRT0vdS9yc2UvLnd3dy9pbmRleC5odG1sCi1TQ1JJUFRfVVJMPS91L3JzZS8KLVNDUklQVF9VUkk9aHR0cDovL2VuMS5lbmdlbHNjaGFsbC5jb20vdS9yc2UvCi08L3ByZT4KLTwvZXhhbXBsZT4KLQotPC9zZWN0aW9uPgotCi08c2VjdGlvbiBpZD0iU29sdXRpb25zIj48dGl0bGU+UHJhY3RpY2FsIFNvbHV0aW9uczwvdGl0bGU+Ci0KLSAgICAgIDxwPldlIGFsc28gaGF2ZSBhbiA8YSBocmVmPSIuLi9taXNjL3Jld3JpdGVndWlkZS5odG1sIj5VUkwKLSAgICAgIFJld3JpdGluZyBHdWlkZTwvYT4gYXZhaWxhYmxlLCB3aGljaCBwcm92aWRlcyBhIGNvbGxlY3Rpb24gb2YKLSAgICAgIHByYWN0aWNhbCBzb2x1dGlvbnMgZm9yIFVSTC1iYXNlZCBwcm9ibGVtcy4gVGhlcmUgeW91IGNhbgotICAgICAgZmluZCByZWFsLWxpZmUgcnVsZXNldHMgYW5kIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQKLSAgICAgIG1vZF9yZXdyaXRlLjwvcD4KLTwvc2VjdGlvbj4KLQotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxuYW1lPlJld3JpdGVFbmdpbmU8L25hbWU+Ci0KLTxzdW1tYXJ5PkVuYWJsZXMgb3IgZGlzYWJsZXMgcnVudGltZSByZXdyaXRpbmcgZW5naW5lPC9zdW1tYXJ5PgotCi08c3ludGF4PlJld3JpdGVFbmdpbmUgb258b2ZmPC9zeW50YXg+Ci08ZGVmYXVsdD5SZXdyaXRlRW5naW5lIG9mZjwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT5GaWxlSW5mbzwvb3ZlcnJpZGU+Ci0KLTx1c2FnZT4gICAgICAgCi0KLSAgICAgIDxwPlRoZSA8ZGlyZWN0aXZlPlJld3JpdGVFbmdpbmU8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIGVuYWJsZXMgb3IKLSAgICAgIGRpc2FibGVzIHRoZSBydW50aW1lIHJld3JpdGluZyBlbmdpbmUuIElmIGl0IGlzIHNldCB0bwotICAgICAgPGNvZGU+b2ZmPC9jb2RlPiB0aGlzIG1vZHVsZSBkb2VzIG5vIHJ1bnRpbWUgcHJvY2Vzc2luZyBhdAotICAgICAgYWxsLiBJdCBkb2VzIG5vdCBldmVuIHVwZGF0ZSB0aGUgPGNvZGU+U0NSSVBUX1VSeDwvY29kZT4KLSAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlcy48L3A+Ci0KLSAgICAgIDxwPlVzZSB0aGlzIGRpcmVjdGl2ZSB0byBkaXNhYmxlIHRoZSBtb2R1bGUgaW5zdGVhZCBvZgotICAgICAgY29tbWVudGluZyBvdXQgYWxsIHRoZSA8ZGlyZWN0aXZlCi0gICAgICBtb2R1bGU9Im1vZF9yZXdyaXRlIj5SZXdyaXRlUnVsZTwvZGlyZWN0aXZlPiBkaXJlY3RpdmVzITwvcD4KLQotICAgICAgPHA+Tm90ZSB0aGF0LCBieSBkZWZhdWx0LCByZXdyaXRlIGNvbmZpZ3VyYXRpb25zIGFyZSBub3QKLSAgICAgIGluaGVyaXRlZC4gVGhpcyBtZWFucyB0aGF0IHlvdSBuZWVkIHRvIGhhdmUgYQotICAgICAgPGNvZGU+UmV3cml0ZUVuZ2luZSBvbjwvY29kZT4gZGlyZWN0aXZlIGZvciBlYWNoIHZpcnR1YWwgaG9zdAotICAgICAgaW4gd2hpY2ggeW91IHdpc2ggdG8gdXNlIGl0LjwvcD4KLTwvdXNhZ2U+Ci0KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlJld3JpdGVPcHRpb25zPC9uYW1lPgotPGRlc2NyaXB0aW9uPlNldHMgc29tZSBzcGVjaWFsIG9wdGlvbnMgZm9yIHRoZSByZXdyaXRlIGVuZ2luZTwvZGVzY3JpcHRpb24+Ci08c3ludGF4PlJld3JpdGVPcHRpb25zIDxlbT5PcHRpb25zPC9lbT48L3N5bnRheD4KLTxkZWZhdWx0Pk5vbmU8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLQotICAgICAgPHA+VGhlIDxkaXJlY3RpdmU+UmV3cml0ZU9wdGlvbnM8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIHNldHMgc29tZQotICAgICAgc3BlY2lhbCBvcHRpb25zIGZvciB0aGUgY3VycmVudCBwZXItc2VydmVyIG9yIHBlci1kaXJlY3RvcnkKLSAgICAgIGNvbmZpZ3VyYXRpb24uIFRoZSA8ZW0+T3B0aW9uPC9lbT4gc3RyaW5ncyBjYW4gYmUgb25lIG9mIHRoZQotICAgICAgZm9sbG93aW5nOjwvcD4KLQotICAgICAgPHVsPgotICAgICAgICA8bGk+JzxzdHJvbmc+PGNvZGU+aW5oZXJpdDwvY29kZT48L3N0cm9uZz4nPGJyIC8+Ci0gICAgICAgICBUaGlzIGZvcmNlcyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHRvIGluaGVyaXQgdGhlCi0gICAgICAgIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHBhcmVudC4gSW4gcGVyLXZpcnR1YWwtc2VydmVyIGNvbnRleHQKLSAgICAgICAgdGhpcyBtZWFucyB0aGF0IHRoZSBtYXBzLCBjb25kaXRpb25zIGFuZCBydWxlcyBvZiB0aGUgbWFpbgotICAgICAgICBzZXJ2ZXIgYXJlIGluaGVyaXRlZC4gSW4gcGVyLWRpcmVjdG9yeSBjb250ZXh0IHRoaXMgbWVhbnMKLSAgICAgICAgdGhhdCBjb25kaXRpb25zIGFuZCBydWxlcyBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeSdzCi0gICAgICAgIDxjb2RlPi5odGFjY2VzczwvY29kZT4gY29uZmlndXJhdGlvbiBhcmUgaW5oZXJpdGVkLjwvbGk+Ci0gICAgICA8L3VsPgotPC91c2FnZT4KLQotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+UmV3cml0ZUxvZzwvbmFtZT4KLTxkZXNjcmlwdGlvbj5TZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHVzZWQgZm9yIGxvZ2dpbmcgcmV3cml0ZSBlbmdpbmUKLXByb2Nlc3Npbmc8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5SZXdyaXRlTG9nIDxlbT5maWxlLXBhdGg8L2VtPjwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgICAgPHA+VGhlIDxkaXJlY3RpdmU+UmV3cml0ZUxvZzwvZGlyZWN0aXZlPiBkaXJlY3RpdmUgc2V0cyB0aGUgbmFtZQotICAgICAgb2YgdGhlIGZpbGUgdG8gd2hpY2ggdGhlIHNlcnZlciBsb2dzIGFueSByZXdyaXRpbmcgYWN0aW9ucyBpdAotICAgICAgcGVyZm9ybXMuIElmIHRoZSBuYW1lIGRvZXMgbm90IGJlZ2luIHdpdGggYSBzbGFzaAotICAgICAgKCc8Y29kZT4vPC9jb2RlPicpIHRoZW4gaXQgaXMgYXNzdW1lZCB0byBiZSByZWxhdGl2ZSB0byB0aGUKLSAgICAgIDxlbT5TZXJ2ZXIgUm9vdDwvZW0+LiBUaGUgZGlyZWN0aXZlIHNob3VsZCBvY2N1ciBvbmx5IG9uY2UgcGVyCi0gICAgICBzZXJ2ZXIgY29uZmlnLjwvcD4KLQotPG5vdGU+ICAgIFRvIGRpc2FibGUgdGhlIGxvZ2dpbmcgb2YKLSAgICAgICAgICByZXdyaXRpbmcgYWN0aW9ucyBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gc2V0Ci0gICAgICAgICAgPGVtPkZpbGVuYW1lPC9lbT4gdG8gPGNvZGU+L2Rldi9udWxsPC9jb2RlPiwgYmVjYXVzZQotICAgICAgICAgIGFsdGhvdWdoIHRoZSByZXdyaXRpbmcgZW5naW5lIGRvZXMgbm90IHRoZW4gb3V0cHV0IHRvIGEKLSAgICAgICAgICBsb2dmaWxlIGl0IHN0aWxsIGNyZWF0ZXMgdGhlIGxvZ2ZpbGUgb3V0cHV0IGludGVybmFsbHkuCi0gICAgICAgICAgPHN0cm9uZz5UaGlzIHdpbGwgc2xvdyBkb3duIHRoZSBzZXJ2ZXIgd2l0aCBubyBhZHZhbnRhZ2UKLSAgICAgICAgICB0byB0aGUgYWRtaW5pc3RyYXRvciE8L3N0cm9uZz4gVG8gZGlzYWJsZSBsb2dnaW5nIGVpdGhlcgotICAgICAgICAgIHJlbW92ZSBvciBjb21tZW50IG91dCB0aGUgPGRpcmVjdGl2ZT5SZXdyaXRlTG9nPC9kaXJlY3RpdmU+Ci0gICAgICAgICAgZGlyZWN0aXZlIG9yIHVzZSA8Y29kZT5SZXdyaXRlTG9nTGV2ZWwgMDwvY29kZT4hCi08L25vdGU+Ci0KLTxub3RlPjx0aXRsZT5TZWN1cml0eTwvdGl0bGU+Ci0KLVNlZSB0aGUgPGEgaHJlZj0iLi4vbWlzYy9zZWN1cml0eV90aXBzLmh0bWwiPkFwYWNoZSBTZWN1cml0eSBUaXBzPC9hPgotZG9jdW1lbnQgZm9yIGRldGFpbHMgb24gd2h5IHlvdXIgc2VjdXJpdHkgY291bGQgYmUgY29tcHJvbWlzZWQgaWYgdGhlCi1kaXJlY3Rvcnkgd2hlcmUgbG9nZmlsZXMgYXJlIHN0b3JlZCBpcyB3cml0YWJsZSBieSBhbnlvbmUgb3RoZXIgdGhhbgotdGhlIHVzZXIgdGhhdCBzdGFydHMgdGhlIHNlcnZlci4KLTwvbm90ZT4KLQotPGV4YW1wbGU+PHRpdGxlPkV4YW1wbGU8L3RpdGxlPgotUmV3cml0ZUxvZyAiL3Vzci9sb2NhbC92YXIvYXBhY2hlL2xvZ3MvcmV3cml0ZS5sb2ciCi08L2V4YW1wbGU+Ci0KLTwvdXNhZ2U+Ci0KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlJld3JpdGVMb2dMZXZlbDwvbmFtZT4KLTxkZXNjcmlwdGlvbj5TZXRzIHRoZSB2ZXJib3NpdHkgb2YgdGhlIGxvZyBmaWxlIHVzZWQgYnkgdGhlIHJld3JpdGUKLWVuZ2luZTwvZGVzY3JpcHRpb24+Ci08c3ludGF4PlJld3JpdGVMb2dMZXZlbCA8ZW0+TGV2ZWw8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+UmVyd2l0ZUxvZ0xldmVsIDA8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci0gICAgICA8cD5UaGUgPGRpcmVjdGl2ZT5SZXdyaXRlTG9nTGV2ZWw8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIHNldHMgdGhlCi0gICAgICB2ZXJib3NpdHkgbGV2ZWwgb2YgdGhlIHJld3JpdGluZyBsb2dmaWxlLiBUaGUgZGVmYXVsdCBsZXZlbCAwCi0gICAgICBtZWFucyBubyBsb2dnaW5nLCB3aGlsZSA5IG9yIG1vcmUgbWVhbnMgdGhhdCBwcmFjdGljYWxseSBhbGwKLSAgICAgIGFjdGlvbnMgYXJlIGxvZ2dlZC48L3A+Ci0KLSAgICAgIDxwPlRvIGRpc2FibGUgdGhlIGxvZ2dpbmcgb2YgcmV3cml0aW5nIGFjdGlvbnMgc2ltcGx5IHNldAotICAgICAgPGVtPkxldmVsPC9lbT4gdG8gMC4gVGhpcyBkaXNhYmxlcyBhbGwgcmV3cml0ZSBhY3Rpb24KLSAgICAgIGxvZ3MuPC9wPgotCi08bm90ZT4gVXNpbmcgYSBoaWdoIHZhbHVlIGZvcgotICAgICAgICAgIDxlbT5MZXZlbDwvZW0+IHdpbGwgc2xvdyBkb3duIHlvdXIgQXBhY2hlIHNlcnZlcgotICAgICAgICAgIGRyYW1hdGljYWxseSEgVXNlIHRoZSByZXdyaXRpbmcgbG9nZmlsZSBhdCBhCi0gICAgICAgICAgPGVtPkxldmVsPC9lbT4gZ3JlYXRlciB0aGFuIDIgb25seSBmb3IgZGVidWdnaW5nIQotPC9ub3RlPgotCi08ZXhhbXBsZT48dGl0bGU+RXhhbXBsZTwvdGl0bGU+Ci1SZXdyaXRlTG9nTGV2ZWwgMwotPC9leGFtcGxlPgotCi08L3VzYWdlPgotCi08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5SZXdyaXRlTG9jazwvbmFtZT4KLTxkZXNjcmlwdGlvbj5TZXRzIHRoZSBuYW1lIG9mIHRoZSBsb2NrIGZpbGUgdXNlZCBmb3IgPGRpcmVjdGl2ZQotbW9kdWxlPSJtb2RfcmV3cml0ZSI+UmV3cml0ZU1hcDwvZGlyZWN0aXZlPgotc3luY2hyb25pemF0aW9uPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+UmV3cml0ZUxvY2sgPGVtPmZpbGUtcGF0aDwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5Ob25lPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgICAgPHA+VGhpcyBkaXJlY3RpdmUgc2V0cyB0aGUgZmlsZW5hbWUgZm9yIGEgc3luY2hyb25pemF0aW9uCi0gICAgICBsb2NrZmlsZSB3aGljaCBtb2RfcmV3cml0ZSBuZWVkcyB0byBjb21tdW5pY2F0ZSB3aXRoIDxkaXJlY3RpdmUKLSAgICAgIG1vZHVsZT0ibW9kX3Jld3JpdGUiPlJld3JpdGVNYXA8L2RpcmVjdGl2ZT4KLSAgICAgIDxlbT5wcm9ncmFtczwvZW0+LiBTZXQgdGhpcyBsb2NrZmlsZSB0byBhIGxvY2FsIHBhdGggKG5vdCBvbiBhCi0gICAgICBORlMtbW91bnRlZCBkZXZpY2UpIHdoZW4geW91IHdhbnQgdG8gdXNlIGEgcmV3cml0aW5nCi0gICAgICBtYXAtcHJvZ3JhbS4gSXQgaXMgbm90IHJlcXVpcmVkIGZvciBvdGhlciB0eXBlcyBvZiByZXdyaXRpbmcKLSAgICAgIG1hcHMuPC9wPgotPC91c2FnZT4KLQotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+UmV3cml0ZU1hcDwvbmFtZT4KLTxkZXNjcmlwdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBmdW5jdGlvbiBmb3Iga2V5LWxvb2t1cDwvZGVzY3JpcHRpb24+Ci08c3ludGF4PlJld3JpdGVNYXAgPGVtPk1hcE5hbWU8L2VtPiA8ZW0+TWFwVHlwZTwvZW0+OjxlbT5NYXBTb3VyY2U8L2VtPgotPC9zeW50YXg+Ci08ZGVmYXVsdD5Ob25lPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgICAgPHA+VGhlIDxkaXJlY3RpdmU+UmV3cml0ZU1hcDwvZGlyZWN0aXZlPiBkaXJlY3RpdmUgZGVmaW5lcyBhCi0gICAgICA8ZW0+UmV3cml0aW5nIE1hcDwvZW0+IHdoaWNoIGNhbiBiZSB1c2VkIGluc2lkZSBydWxlCi0gICAgICBzdWJzdGl0dXRpb24gc3RyaW5ncyBieSB0aGUgbWFwcGluZy1mdW5jdGlvbnMgdG8KLSAgICAgIGluc2VydC9zdWJzdGl0dXRlIGZpZWxkcyB0aHJvdWdoIGEga2V5IGxvb2t1cC4gVGhlIHNvdXJjZSBvZgotICAgICAgdGhpcyBsb29rdXAgY2FuIGJlIG9mIHZhcmlvdXMgdHlwZXMuPC9wPgotCi0gICAgICA8cD5UaGUgPGEgaWQ9Im1hcGZ1bmMiIG5hbWU9Im1hcGZ1bmMiPjxlbT5NYXBOYW1lPC9lbT48L2E+IGlzCi0gICAgICB0aGUgbmFtZSBvZiB0aGUgbWFwIGFuZCB3aWxsIGJlIHVzZWQgdG8gc3BlY2lmeSBhCi0gICAgICBtYXBwaW5nLWZ1bmN0aW9uIGZvciB0aGUgc3Vic3RpdHV0aW9uIHN0cmluZ3Mgb2YgYSByZXdyaXRpbmcKLSAgICAgIHJ1bGUgdmlhIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbnN0cnVjdHM6PC9wPgotCi0gICAgICA8YmxvY2txdW90ZT4KLSAgICAgICAgPHN0cm9uZz48Y29kZT4kezwvY29kZT4gPGVtPk1hcE5hbWU8L2VtPiA8Y29kZT46PC9jb2RlPgotICAgICAgICA8ZW0+TG9va3VwS2V5PC9lbT4gPGNvZGU+fTwvY29kZT48YnIgLz4KLSAgICAgICAgIDxjb2RlPiR7PC9jb2RlPiA8ZW0+TWFwTmFtZTwvZW0+IDxjb2RlPjo8L2NvZGU+Ci0gICAgICAgIDxlbT5Mb29rdXBLZXk8L2VtPiA8Y29kZT58PC9jb2RlPiA8ZW0+RGVmYXVsdFZhbHVlPC9lbT4KLSAgICAgICAgPGNvZGU+fTwvY29kZT48L3N0cm9uZz4KLSAgICAgIDwvYmxvY2txdW90ZT4KLQotICAgICAgPHA+V2hlbiBzdWNoIGEgY29uc3RydWN0IG9jY3VycyB0aGUgbWFwIDxlbT5NYXBOYW1lPC9lbT4gaXMKLSAgICAgIGNvbnN1bHRlZCBhbmQgdGhlIGtleSA8ZW0+TG9va3VwS2V5PC9lbT4gaXMgbG9va2VkLXVwLiBJZiB0aGUKLSAgICAgIGtleSBpcyBmb3VuZCwgdGhlIG1hcC1mdW5jdGlvbiBjb25zdHJ1Y3QgaXMgc3Vic3RpdHV0ZWQgYnkKLSAgICAgIDxlbT5TdWJzdFZhbHVlPC9lbT4uIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kIHRoZW4gaXQgaXMKLSAgICAgIHN1YnN0aXR1dGVkIGJ5IDxlbT5EZWZhdWx0VmFsdWU8L2VtPiBvciBieSB0aGUgZW1wdHkgc3RyaW5nCi0gICAgICBpZiBubyA8ZW0+RGVmYXVsdFZhbHVlPC9lbT4gd2FzIHNwZWNpZmllZC48L3A+Ci0KLSAgICAgIDxwPlRoZSBmb2xsb3dpbmcgY29tYmluYXRpb25zIGZvciA8ZW0+TWFwVHlwZTwvZW0+IGFuZAotICAgICAgPGVtPk1hcFNvdXJjZTwvZW0+IGNhbiBiZSB1c2VkOjwvcD4KLQotICAgICAgPHVsPgotICAgICAgICA8bGk+Ci0gICAgICAgICAgPHN0cm9uZz5TdGFuZGFyZCBQbGFpbiBUZXh0PC9zdHJvbmc+PGJyIC8+Ci0gICAgICAgICAgIE1hcFR5cGU6IDxjb2RlPnR4dDwvY29kZT4sIE1hcFNvdXJjZTogVW5peCBmaWxlc3lzdGVtCi0gICAgICAgICAgcGF0aCB0byB2YWxpZCByZWd1bGFyIGZpbGUgCi0KLSAgICAgICAgICA8cD5UaGlzIGlzIHRoZSBzdGFuZGFyZCByZXdyaXRpbmcgbWFwIGZlYXR1cmUgd2hlcmUgdGhlCi0gICAgICAgICAgPGVtPk1hcFNvdXJjZTwvZW0+IGlzIGEgcGxhaW4gQVNDSUkgZmlsZSBjb250YWluaW5nCi0gICAgICAgICAgZWl0aGVyIGJsYW5rIGxpbmVzLCBjb21tZW50IGxpbmVzIChzdGFydGluZyB3aXRoIGEgJyMnCi0gICAgICAgICAgY2hhcmFjdGVyKSBvciBwYWlycyBsaWtlIHRoZSBmb2xsb3dpbmcgLSBvbmUgcGVyCi0gICAgICAgICAgbGluZS48L3A+Ci0KLSAgICAgICAgICA8YmxvY2txdW90ZT4KLSAgICAgICAgICAgIDxzdHJvbmc+PGVtPk1hdGNoaW5nS2V5PC9lbT4KLSAgICAgICAgICAgIDxlbT5TdWJzdFZhbHVlPC9lbT48L3N0cm9uZz4KLSAgICAgICAgICA8L2Jsb2NrcXVvdGU+Ci0KLTxleGFtcGxlPjx0aXRsZT5FeGFtcGxlPC90aXRsZT4KLTxwcmU+Ci0jIwotIyMgIG1hcC50eHQgLS0gcmV3cml0aW5nIG1hcAotIyMKLQotUmFsZi5TLkVuZ2Vsc2NoYWxsICAgIHJzZSAgICMgQmFzdGFyZCBPcGVyYXRvciBGcm9tIEhlbGwKLU1yLkpvZS5BdmVyYWdlICAgICAgICBqb2UgICAjIE1yLiBBdmVyYWdlCi08L3ByZT4KLTwvZXhhbXBsZT4KLQotPGV4YW1wbGU+Ci1SZXdyaXRlTWFwIHJlYWwtdG8tdXNlciB0eHQ6L3BhdGgvdG8vZmlsZS9tYXAudHh0Ci08L2V4YW1wbGU+Ci0gICAgICAgIDwvbGk+Ci0KLSAgICAgICAgPGxpPgotICAgICAgICAgIDxzdHJvbmc+UmFuZG9taXplZCBQbGFpbiBUZXh0PC9zdHJvbmc+PGJyIC8+Ci0gICAgICAgICAgIE1hcFR5cGU6IDxjb2RlPnJuZDwvY29kZT4sIE1hcFNvdXJjZTogVW5peCBmaWxlc3lzdGVtCi0gICAgICAgICAgcGF0aCB0byB2YWxpZCByZWd1bGFyIGZpbGUgCi0KLSAgICAgICAgICA8cD5UaGlzIGlzIGlkZW50aWNhbCB0byB0aGUgU3RhbmRhcmQgUGxhaW4gVGV4dCB2YXJpYW50Ci0gICAgICAgICAgYWJvdmUgYnV0IHdpdGggYSBzcGVjaWFsIHBvc3QtcHJvY2Vzc2luZyBmZWF0dXJlOiBBZnRlcgotICAgICAgICAgIGxvb2tpbmcgdXAgYSB2YWx1ZSBpdCBpcyBwYXJzZWQgYWNjb3JkaW5nIHRvIGNvbnRhaW5lZAotICAgICAgICAgIGBgPGNvZGU+fDwvY29kZT4nJyBjaGFyYWN0ZXJzIHdoaWNoIGhhdmUgdGhlIG1lYW5pbmcgb2YKLSAgICAgICAgICBgYG9yJycuIEluIG90aGVyIHdvcmRzIHRoZXkgaW5kaWNhdGUgYSBzZXQgb2YKLSAgICAgICAgICBhbHRlcm5hdGl2ZXMgZnJvbSB3aGljaCB0aGUgYWN0dWFsIHJldHVybmVkIHZhbHVlIGlzCi0gICAgICAgICAgY2hvc2VuIHJhbmRvbWx5LiBBbHRob3VnaCB0aGlzIHNvdW5kcyBjcmF6eSBhbmQgdXNlbGVzcywKLSAgICAgICAgICBpdCB3YXMgYWN0dWFsbHkgZGVzaWduZWQgZm9yIGxvYWQgYmFsYW5jaW5nIGluIGEgcmV2ZXJzZQotICAgICAgICAgIHByb3h5IHNpdHVhdGlvbiB3aGVyZSB0aGUgbG9va2VkIHVwIHZhbHVlcyBhcmUgc2VydmVyCi0gICAgICAgICAgbmFtZXMuIEV4YW1wbGU6PC9wPgotCi08ZXhhbXBsZT4KLTxwcmU+Ci0jIwotIyMgIG1hcC50eHQgLS0gcmV3cml0aW5nIG1hcAotIyMKLQotc3RhdGljICAgd3d3MXx3d3cyfHd3dzN8d3d3NAotZHluYW1pYyAgd3d3NXx3d3c2Ci08L3ByZT4KLTwvZXhhbXBsZT4KLQotPGV4YW1wbGU+Ci1SZXdyaXRlTWFwIHNlcnZlcnMgcm5kOi9wYXRoL3RvL2ZpbGUvbWFwLnR4dAotPC9leGFtcGxlPgotICAgICAgICA8L2xpPgotCi0gICAgICAgIDxsaT4KLSAgICAgICAgICA8c3Ryb25nPkhhc2ggRmlsZTwvc3Ryb25nPjxiciAvPgotICAgICAgICAgICBNYXBUeXBlOiA8Y29kZT5kYm08L2NvZGU+LCBNYXBTb3VyY2U6IFVuaXggZmlsZXN5c3RlbQotICAgICAgICAgIHBhdGggdG8gdmFsaWQgcmVndWxhciBmaWxlIAotCi0gICAgICAgICAgPHA+SGVyZSB0aGUgc291cmNlIGlzIGEgYmluYXJ5IE5EQk0gZm9ybWF0IGZpbGUKLSAgICAgICAgICBjb250YWluaW5nIHRoZSBzYW1lIGNvbnRlbnRzIGFzIGEgPGVtPlBsYWluIFRleHQ8L2VtPgotICAgICAgICAgIGZvcm1hdCBmaWxlLCBidXQgaW4gYSBzcGVjaWFsIHJlcHJlc2VudGF0aW9uIHdoaWNoIGlzCi0gICAgICAgICAgb3B0aW1pemVkIGZvciByZWFsbHkgZmFzdCBsb29rdXBzLiBZb3UgY2FuIGNyZWF0ZSBzdWNoIGEKLSAgICAgICAgICBmaWxlIHdpdGggYW55IE5EQk0gdG9vbCBvciB3aXRoIHRoZSBmb2xsb3dpbmcgUGVybAotICAgICAgICAgIHNjcmlwdDo8L3A+Ci0KLTxleGFtcGxlPgotPHByZT4KLSMhL3BhdGgvdG8vYmluL3BlcmwKLSMjCi0jIyAgdHh0MmRibSAtLSBjb252ZXJ0IHR4dCBtYXAgdG8gZGJtIGZvcm1hdAotIyMKLQotdXNlIE5EQk1fRmlsZTsKLXVzZSBGY250bDsKLQotKCR0eHRtYXAsICRkYm1tYXApID0gQEFSR1Y7Ci0KLW9wZW4oVFhULCAiJmx0OyR0eHRtYXAiKSBvciBkaWUgIkNvdWxkbid0IG9wZW4gJHR4dG1hcCFcbiI7Ci10aWUgKCVEQiwgJ05EQk1fRmlsZScsICRkYm1tYXAsT19SRFdSfE9fVFJVTkN8T19DUkVBVCwgMDY0NCkgb3IgZGllICJDb3VsZG4ndCBjcmVhdGUgJGRibW1hcCFcbiI7Ci0KLXdoaWxlICgmbHQ7VFhUJmd0OykgewotICBuZXh0IGlmICgvXlxzKiMvIG9yIC9eXHMqJC8pOwotICAkREJ7JDF9ID0gJDIgaWYgKC9eXHMqKFxTKylccysoXFMrKS8pOwotfQotCi11bnRpZSAlREI7Ci1jbG9zZShUWFQpOwotPC9wcmU+Ci08L2V4YW1wbGU+Ci0KLTxleGFtcGxlPgotJCB0eHQyZGJtIG1hcC50eHQgbWFwLmRiCi08L2V4YW1wbGU+Ci0gICAgICAgIDwvbGk+Ci0KLSAgICAgICAgPGxpPgotICAgICAgICAgIDxzdHJvbmc+SW50ZXJuYWwgRnVuY3Rpb248L3N0cm9uZz48YnIgLz4KLSAgICAgICAgICAgTWFwVHlwZTogPGNvZGU+aW50PC9jb2RlPiwgTWFwU291cmNlOiBJbnRlcm5hbCBBcGFjaGUKLSAgICAgICAgICBmdW5jdGlvbiAKLQotICAgICAgICAgIDxwPkhlcmUgdGhlIHNvdXJjZSBpcyBhbiBpbnRlcm5hbCBBcGFjaGUgZnVuY3Rpb24uCi0gICAgICAgICAgQ3VycmVudGx5IHlvdSBjYW5ub3QgY3JlYXRlIHlvdXIgb3duLCBidXQgdGhlIGZvbGxvd2luZwotICAgICAgICAgIGZ1bmN0aW9ucyBhbHJlYWR5IGV4aXN0czo8L3A+Ci0KLSAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICA8bGk+PHN0cm9uZz50b3VwcGVyPC9zdHJvbmc+OjxiciAvPgotICAgICAgICAgICAgIENvbnZlcnRzIHRoZSBsb29rZWQgdXAga2V5IHRvIGFsbCB1cHBlciBjYXNlLjwvbGk+Ci0KLSAgICAgICAgICAgIDxsaT48c3Ryb25nPnRvbG93ZXI8L3N0cm9uZz46PGJyIC8+Ci0gICAgICAgICAgICAgQ29udmVydHMgdGhlIGxvb2tlZCB1cCBrZXkgdG8gYWxsIGxvd2VyIGNhc2UuPC9saT4KLQotICAgICAgICAgICAgPGxpPjxzdHJvbmc+ZXNjYXBlPC9zdHJvbmc+OjxiciAvPgotICAgICAgICAgICAgIFRyYW5zbGF0ZXMgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHRoZSBsb29rZWQgdXAga2V5IHRvCi0gICAgICAgICAgICBoZXgtZW5jb2RpbmdzLjwvbGk+Ci0KLSAgICAgICAgICAgIDxsaT48c3Ryb25nPnVuZXNjYXBlPC9zdHJvbmc+OjxiciAvPgotICAgICAgICAgICAgIFRyYW5zbGF0ZXMgaGV4LWVuY29kaW5ncyBpbiB0aGUgbG9va2VkIHVwIGtleSBiYWNrIHRvCi0gICAgICAgICAgICBzcGVjaWFsIGNoYXJhY3RlcnMuPC9saT4KLSAgICAgICAgICA8L3VsPgotICAgICAgICA8L2xpPgotCi0gICAgICAgIDxsaT4KLSAgICAgICAgICA8c3Ryb25nPkV4dGVybmFsIFJld3JpdGluZyBQcm9ncmFtPC9zdHJvbmc+PGJyIC8+Ci0gICAgICAgICAgIE1hcFR5cGU6IDxjb2RlPnByZzwvY29kZT4sIE1hcFNvdXJjZTogVW5peCBmaWxlc3lzdGVtCi0gICAgICAgICAgcGF0aCB0byB2YWxpZCByZWd1bGFyIGZpbGUgCi0KLSAgICAgICAgICA8cD5IZXJlIHRoZSBzb3VyY2UgaXMgYSBwcm9ncmFtLCBub3QgYSBtYXAgZmlsZS4gVG8KLSAgICAgICAgICBjcmVhdGUgaXQgeW91IGNhbiB1c2UgdGhlIGxhbmd1YWdlIG9mIHlvdXIgY2hvaWNlLCBidXQKLSAgICAgICAgICB0aGUgcmVzdWx0IGhhcyB0byBiZSBhIGV4ZWN1dGFibGUgKDxlbT5pLmUuPC9lbT4sIGVpdGhlcgotICAgICAgICAgIG9iamVjdC1jb2RlIG9yIGEgc2NyaXB0IHdpdGggdGhlIG1hZ2ljIGNvb2tpZSB0cmljawotICAgICAgICAgICc8Y29kZT4jIS9wYXRoL3RvL2ludGVycHJldGVyPC9jb2RlPicgYXMgdGhlIGZpcnN0Ci0gICAgICAgICAgbGluZSkuPC9wPgotCi0gICAgICAgICAgPHA+VGhpcyBwcm9ncmFtIGlzIHN0YXJ0ZWQgb25jZSBhdCBzdGFydHVwIG9mIHRoZSBBcGFjaGUKLSAgICAgICAgICBzZXJ2ZXJzIGFuZCB0aGVuIGNvbW11bmljYXRlcyB3aXRoIHRoZSByZXdyaXRpbmcgZW5naW5lCi0gICAgICAgICAgb3ZlciBpdHMgPGNvZGU+c3RkaW48L2NvZGU+IGFuZCA8Y29kZT5zdGRvdXQ8L2NvZGU+Ci0gICAgICAgICAgZmlsZS1oYW5kbGVzLiBGb3IgZWFjaCBtYXAtZnVuY3Rpb24gbG9va3VwIGl0IHdpbGwKLSAgICAgICAgICByZWNlaXZlIHRoZSBrZXkgdG8gbG9va3VwIGFzIGEgbmV3bGluZS10ZXJtaW5hdGVkIHN0cmluZwotICAgICAgICAgIG9uIDxjb2RlPnN0ZGluPC9jb2RlPi4gSXQgdGhlbiBoYXMgdG8gZ2l2ZSBiYWNrIHRoZQotICAgICAgICAgIGxvb2tlZC11cCB2YWx1ZSBhcyBhIG5ld2xpbmUtdGVybWluYXRlZCBzdHJpbmcgb24KLSAgICAgICAgICA8Y29kZT5zdGRvdXQ8L2NvZGU+IG9yIHRoZSBmb3VyLWNoYXJhY3RlciBzdHJpbmcKLSAgICAgICAgICBgYDxjb2RlPk5VTEw8L2NvZGU+JycgaWYgaXQgZmFpbHMgKDxlbT5pLmUuPC9lbT4sIHRoZXJlCi0gICAgICAgICAgaXMgbm8gY29ycmVzcG9uZGluZyB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSkuIEEgdHJpdmlhbAotICAgICAgICAgIHByb2dyYW0gd2hpY2ggd2lsbCBpbXBsZW1lbnQgYSAxOjEgbWFwICg8ZW0+aS5lLjwvZW0+LAotICAgICAgICAgIGtleSA9PSB2YWx1ZSkgY291bGQgYmU6PC9wPgotCi08ZXhhbXBsZT4KLTxwcmU+Ci0jIS91c3IvYmluL3BlcmwKLSR8ID0gMTsKLXdoaWxlICgmbHQ7U1RESU4mZ3Q7KSB7Ci0gICAgIyAuLi5wdXQgaGVyZSBhbnkgdHJhbnNmb3JtYXRpb25zIG9yIGxvb2t1cHMuLi4KLSAgICBwcmludCAkXzsKLX0KLTwvcHJlPgotPC9leGFtcGxlPgotCi0gICAgICAgICAgPHA+QnV0IGJlIHZlcnkgY2FyZWZ1bDo8L3A+Ci0KLSAgICAgICAgICA8b2w+Ci0gICAgICAgICAgICA8bGk+YGA8ZW0+S2VlcCBpdCBzaW1wbGUsIHN0dXBpZDwvZW0+JycgKEtJU1MpLCBiZWNhdXNlCi0gICAgICAgICAgICBpZiB0aGlzIHByb2dyYW0gaGFuZ3MgaXQgd2lsbCBoYW5nIHRoZSBBcGFjaGUgc2VydmVyCi0gICAgICAgICAgICB3aGVuIHRoZSBydWxlIG9jY3Vycy48L2xpPgotCi0gICAgICAgICAgICA8bGk+QXZvaWQgb25lIGNvbW1vbiBtaXN0YWtlOiBuZXZlciBkbyBidWZmZXJlZCBJL08gb24KLSAgICAgICAgICAgIDxjb2RlPnN0ZG91dDwvY29kZT4hIFRoaXMgd2lsbCBjYXVzZSBhIGRlYWRsb29wISBIZW5jZQotICAgICAgICAgICAgdGhlIGBgPGNvZGU+JHw9MTwvY29kZT4nJyBpbiB0aGUgYWJvdmUgZXhhbXBsZS4uLjwvbGk+Ci0KLSAgICAgICAgICAgIDxsaT5Vc2UgdGhlIDxkaXJlY3RpdmUKLSAgICAgICAgICAgIG1vZHVsZT0ibW9kX3Jld3JpdGUiPlJld3JpdGVMb2NrPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSB0bwotICAgICAgICAgICAgZGVmaW5lIGEgbG9ja2ZpbGUgbW9kX3Jld3JpdGUgY2FuIHVzZSB0byBzeW5jaHJvbml6ZSB0aGUKLSAgICAgICAgICAgIGNvbW11bmljYXRpb24gdG8gdGhlIHByb2dyYW0uIEJ5IGRlZmF1bHQgbm8gc3VjaAotICAgICAgICAgICAgc3luY2hyb25pemF0aW9uIHRha2VzIHBsYWNlLjwvbGk+Ci0gICAgICAgICAgPC9vbD4KLSAgICAgICAgPC9saT4KLSAgICAgIDwvdWw+Ci0gICAgICBUaGUgPGRpcmVjdGl2ZT5SZXdyaXRlTWFwPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBjYW4gb2NjdXIgbW9yZSB0aGFuCi0gICAgICBvbmNlLiBGb3IgZWFjaCBtYXBwaW5nLWZ1bmN0aW9uIHVzZSBvbmUKLSAgICAgIDxkaXJlY3RpdmU+UmV3cml0ZU1hcDwvZGlyZWN0aXZlPiBkaXJlY3RpdmUgdG8gZGVjbGFyZSBpdHMgcmV3cml0aW5nCi0gICAgICBtYXBmaWxlLiBXaGlsZSB5b3UgY2Fubm90IDxzdHJvbmc+ZGVjbGFyZTwvc3Ryb25nPiBhIG1hcCBpbgotICAgICAgcGVyLWRpcmVjdG9yeSBjb250ZXh0IGl0IGlzIG9mIGNvdXJzZSBwb3NzaWJsZSB0bwotICAgICAgPHN0cm9uZz51c2U8L3N0cm9uZz4gdGhpcyBtYXAgaW4gcGVyLWRpcmVjdG9yeSBjb250ZXh0LiAKLQotPG5vdGU+PHRpdGxlPk5vdGU8L3RpdGxlPiBGb3IgcGxhaW4gdGV4dCBhbmQgREJNIGZvcm1hdCBmaWxlcyB0aGUKLWxvb2tlZC11cCBrZXlzIGFyZSBjYWNoZWQgaW4tY29yZSB1bnRpbCB0aGUgPGNvZGU+bXRpbWU8L2NvZGU+IG9mIHRoZQotbWFwZmlsZSBjaGFuZ2VzIG9yIHRoZSBzZXJ2ZXIgZG9lcyBhIHJlc3RhcnQuIFRoaXMgd2F5IHlvdSBjYW4gaGF2ZQotbWFwLWZ1bmN0aW9ucyBpbiBydWxlcyB3aGljaCBhcmUgdXNlZCBmb3IgPHN0cm9uZz5ldmVyeTwvc3Ryb25nPgotcmVxdWVzdC4gIFRoaXMgaXMgbm8gcHJvYmxlbSwgYmVjYXVzZSB0aGUgZXh0ZXJuYWwgbG9va3VwIG9ubHkgaGFwcGVucwotb25jZSEKLTwvbm90ZT4KLQotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlJld3JpdGVCYXNlPC9uYW1lPgotPGRlc2NyaXB0aW9uPlNldHMgdGhlIGJhc2UgVVJMIGZvciBwZXItZGlyZWN0b3J5IHJld3JpdGVzPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+UmV3cml0ZUJhc2UgPGVtPlVSTC1wYXRoPC9lbT48L3N5bnRheD4KLTxkZWZhdWx0PlJld3JpdGVCYXNlIDxlbT5waHlzaWNhbC1kaXJlY3RvcnktcGF0aDwvZW0+PC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPkZpbGVJbmZvPC9vdmVycmlkZT4KLQotPHVzYWdlPgotICAgICAgPHA+VGhlIDxkaXJlY3RpdmU+UmV3cml0ZUJhc2U8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIGV4cGxpY2l0bHkKLSAgICAgIHNldHMgdGhlIGJhc2UgVVJMIGZvciBwZXItZGlyZWN0b3J5IHJld3JpdGVzLiBBcyB5b3Ugd2lsbCBzZWUKLSAgICAgIGJlbG93LCA8ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX3Jld3JpdGUiPlJld3JpdGVSdWxlPC9kaXJlY3RpdmU+Ci0gICAgICBjYW4gYmUgdXNlZCBpbiBwZXItZGlyZWN0b3J5IGNvbmZpZyBmaWxlcwotICAgICAgKDxjb2RlPi5odGFjY2VzczwvY29kZT4pLiBUaGVyZSBpdCB3aWxsIGFjdCBsb2NhbGx5LAotICAgICAgPGVtPmkuZS48L2VtPiwgdGhlIGxvY2FsIGRpcmVjdG9yeSBwcmVmaXggaXMgc3RyaXBwZWQgYXQgdGhpcwotICAgICAgc3RhZ2Ugb2YgcHJvY2Vzc2luZyBhbmQgeW91ciByZXdyaXRpbmcgcnVsZXMgYWN0IG9ubHkgb24gdGhlCi0gICAgICByZW1haW5kZXIuIEF0IHRoZSBlbmQgaXQgaXMgYXV0b21hdGljYWxseSBhZGRlZCBiYWNrIHRvIHRoZQotICAgICAgcGF0aC48L3A+Ci0KLSAgICAgIDxwPldoZW4gYSBzdWJzdGl0dXRpb24gb2NjdXJzIGZvciBhIG5ldyBVUkwsIHRoaXMgbW9kdWxlIGhhcwotICAgICAgdG8gcmUtaW5qZWN0IHRoZSBVUkwgaW50byB0aGUgc2VydmVyIHByb2Nlc3NpbmcuIFRvIGJlIGFibGUKLSAgICAgIHRvIGRvIHRoaXMgaXQgbmVlZHMgdG8ga25vdyB3aGF0IHRoZSBjb3JyZXNwb25kaW5nIFVSTC1wcmVmaXgKLSAgICAgIG9yIFVSTC1iYXNlIGlzLiBCeSBkZWZhdWx0IHRoaXMgcHJlZml4IGlzIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgICBmaWxlcGF0aCBpdHNlbGYuIDxzdHJvbmc+QnV0IGF0IG1vc3Qgd2Vic2l0ZXMgVVJMcyBhcmUgTk9UCi0gICAgICBkaXJlY3RseSByZWxhdGVkIHRvIHBoeXNpY2FsIGZpbGVuYW1lIHBhdGhzLCBzbyB0aGlzCi0gICAgICBhc3N1bXB0aW9uIHdpbGwgdXN1YWxseSBiZSB3cm9uZyE8L3N0cm9uZz4gVGhlcmUgeW91IGhhdmUgdG8KLSAgICAgIHVzZSB0aGUgPGNvZGU+UmV3cml0ZUJhc2U8L2NvZGU+IGRpcmVjdGl2ZSB0byBzcGVjaWZ5IHRoZQotICAgICAgY29ycmVjdCBVUkwtcHJlZml4LjwvcD4KLQotPG5vdGU+IElmIHlvdXIgd2Vic2VydmVyJ3MgVVJMcyBhcmUgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gZGlyZWN0bHkKLXJlbGF0ZWQgdG8gcGh5c2ljYWwgZmlsZSBwYXRocywgeW91IGhhdmUgdG8gdXNlCi08ZGlyZWN0aXZlPlJld3JpdGVCYXNlPC9kaXJlY3RpdmU+IGluIGV2ZXJ5IDxjb2RlPi5odGFjY2VzczwvY29kZT4KLWZpbGVzIHdoZXJlIHlvdSB3YW50IHRvIHVzZSA8ZGlyZWN0aXZlCi1tb2R1bGU9Im1vZF9yZXdyaXRlIj5SZXdyaXRlUnVsZTwvZGlyZWN0aXZlPiBkaXJlY3RpdmVzLgotPC9ub3RlPgotCi0gICAgICAgIDxwPiBGb3IgZXhhbXBsZSwgYXNzdW1lIHRoZSBmb2xsb3dpbmcgcGVyLWRpcmVjdG9yeSBjb25maWcgZmlsZTo8L3A+Ci0KLTxleGFtcGxlPgotPHByZT4KLSMKLSMgIC9hYmMvZGVmLy5odGFjY2VzcyAtLSBwZXItZGlyIGNvbmZpZyBmaWxlIGZvciBkaXJlY3RvcnkgL2FiYy9kZWYKLSMgIFJlbWVtYmVyOiAvYWJjL2RlZiBpcyB0aGUgcGh5c2ljYWwgcGF0aCBvZiAveHl6LCA8ZW0+aS5lLjwvZW0+LCB0aGUgc2VydmVyCi0jICAgICAgICAgICAgaGFzIGEgJ0FsaWFzIC94eXogL2FiYy9kZWYnIGRpcmVjdGl2ZSA8ZW0+ZS5nLjwvZW0+Ci0jCi0KLVJld3JpdGVFbmdpbmUgT24KLQotIyAgbGV0IHRoZSBzZXJ2ZXIga25vdyB0aGF0IHdlIHdlcmUgcmVhY2hlZCB2aWEgL3h5eiBhbmQgbm90Ci0jICB2aWEgdGhlIHBoeXNpY2FsIHBhdGggcHJlZml4IC9hYmMvZGVmCi1SZXdyaXRlQmFzZSAgIC94eXoKLQotIyAgbm93IHRoZSByZXdyaXRpbmcgcnVsZXMKLVJld3JpdGVSdWxlICAgXm9sZHN0dWZmXC5odG1sJCAgbmV3c3R1ZmYuaHRtbAotPC9wcmU+Ci08L2V4YW1wbGU+Ci0KLSAgICAgICAgPHA+SW4gdGhlIGFib3ZlIGV4YW1wbGUsIGEgcmVxdWVzdCB0bwotICAgICAgICA8Y29kZT4veHl6L29sZHN0dWZmLmh0bWw8L2NvZGU+IGdldHMgY29ycmVjdGx5IHJld3JpdHRlbiB0bwotICAgICAgICB0aGUgcGh5c2ljYWwgZmlsZSA8Y29kZT4vYWJjL2RlZi9uZXdzdHVmZi5odG1sPC9jb2RlPi48L3A+Ci0KLTxub3RlPjx0aXRsZT5Gb3IgQXBhY2hlIEhhY2tlcnM8L3RpdGxlPgotPHA+VGhlIGZvbGxvd2luZyBsaXN0IGdpdmVzIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0Ci0gICAgICAgICAgICAgIHRoZSBpbnRlcm5hbCBwcm9jZXNzaW5nIHN0ZXBzOjwvcD4KLTxwcmU+Ci08Zm9udCBzaXplPSItMSI+UmVxdWVzdDoKLSAgL3h5ei9vbGRzdHVmZi5odG1sCi0KLUludGVybmFsIFByb2Nlc3Npbmc6Ci0gIC94eXovb2xkc3R1ZmYuaHRtbCAgICAgLSZndDsgL2FiYy9kZWYvb2xkc3R1ZmYuaHRtbCAgKHBlci1zZXJ2ZXIgQWxpYXMpCi0gIC9hYmMvZGVmL29sZHN0dWZmLmh0bWwgLSZndDsgL2FiYy9kZWYvbmV3c3R1ZmYuaHRtbCAgKHBlci1kaXIgICAgUmV3cml0ZVJ1bGUpCi0gIC9hYmMvZGVmL25ld3N0dWZmLmh0bWwgLSZndDsgL3h5ei9uZXdzdHVmZi5odG1sICAgICAgKHBlci1kaXIgICAgUmV3cml0ZUJhc2UpCi0gIC94eXovbmV3c3R1ZmYuaHRtbCAgICAgLSZndDsgL2FiYy9kZWYvbmV3c3R1ZmYuaHRtbCAgKHBlci1zZXJ2ZXIgQWxpYXMpCi0KLVJlc3VsdDoKLSAgL2FiYy9kZWYvbmV3c3R1ZmYuaHRtbAotPC9mb250PgotPC9wcmU+Ci0gICAgICAgICAgICAgIDxwPjxmb250IHNpemU9Ii0xIj5UaGlzIHNlZW1zIHZlcnkgY29tcGxpY2F0ZWQgYnV0IGlzCi0gICAgICAgICAgICAgIHRoZSBjb3JyZWN0IEFwYWNoZSBpbnRlcm5hbCBwcm9jZXNzaW5nLCBiZWNhdXNlIHRoZQotICAgICAgICAgICAgICBwZXItZGlyZWN0b3J5IHJld3JpdGluZyBjb21lcyB0b28gbGF0ZSBpbiB0aGUKLSAgICAgICAgICAgICAgcHJvY2Vzcy4gU28sIHdoZW4gaXQgb2NjdXJzIHRoZSAocmV3cml0dGVuKSByZXF1ZXN0Ci0gICAgICAgICAgICAgIGhhcyB0byBiZSByZS1pbmplY3RlZCBpbnRvIHRoZSBBcGFjaGUga2VybmVsISBCVVQ6Ci0gICAgICAgICAgICAgIFdoaWxlIHRoaXMgc2VlbXMgbGlrZSBhIHNlcmlvdXMgb3ZlcmhlYWQsIGl0IHJlYWxseQotICAgICAgICAgICAgICBpc24ndCwgYmVjYXVzZSB0aGlzIHJlLWluamVjdGlvbiBoYXBwZW5zIGZ1bGx5Ci0gICAgICAgICAgICAgIGludGVybmFsbHkgdG8gdGhlIEFwYWNoZSBzZXJ2ZXIgYW5kIHRoZSBzYW1lCi0gICAgICAgICAgICAgIHByb2NlZHVyZSBpcyB1c2VkIGJ5IG1hbnkgb3RoZXIgb3BlcmF0aW9ucyBpbnNpZGUKLSAgICAgICAgICAgICAgQXBhY2hlLiBTbywgeW91IGNhbiBiZSBzdXJlIHRoZSBkZXNpZ24gYW5kCi0gICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGlzIGNvcnJlY3QuPC9mb250PjwvcD4KLTwvbm90ZT4KLQotPC91c2FnZT4KLQotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+UmV3cml0ZUNvbmQ8L25hbWU+Ci08ZGVzY3JpcHRpb24+RGVmaW5lcyBhIGNvbmRpdGlvbiB1bmRlciB3aGljaCByZXdyaXRpbmcgd2lsbCB0YWtlIHBsYWNlCi08L2Rlc2NyaXB0aW9uPgotPHN5bnRheD4gUmV3cml0ZUNvbmQKLSAgICAgIDxlbT5UZXN0U3RyaW5nPC9lbT4gPGVtPkNvbmRQYXR0ZXJuPC9lbT48L3N5bnRheD4KLTxkZWZhdWx0Pk5vbmU8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+PGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+RmlsZUluZm88L292ZXJyaWRlPgotCi08dXNhZ2U+Ci0gICAgICA8cD5UaGUgPGRpcmVjdGl2ZT5SZXdyaXRlQ29uZDwvZGlyZWN0aXZlPiBkaXJlY3RpdmUgZGVmaW5lcyBhCi0gICAgICBydWxlIGNvbmRpdGlvbi4gUHJlY2VkZSBhIDxkaXJlY3RpdmUKLSAgICAgIG1vZHVsZT0ibW9kX3Jld3JpdGUiPlJld3JpdGVSdWxlPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSB3aXRoIG9uZQotICAgICAgb3IgbW9yZSA8ZGlyZWN0aXZlPlJld3JpdGVDb25kPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZXMuIFRoZSBmb2xsb3dpbmcKLSAgICAgIHJld3JpdGluZyBydWxlIGlzIG9ubHkgdXNlZCBpZiBpdHMgcGF0dGVybiBtYXRjaGVzIHRoZSBjdXJyZW50Ci0gICAgICBzdGF0ZSBvZiB0aGUgVVJJIDxzdHJvbmc+YW5kPC9zdHJvbmc+IGlmIHRoZXNlIGFkZGl0aW9uYWwKLSAgICAgIGNvbmRpdGlvbnMgYXBwbHkgdG9vLjwvcD4KLQotICAgICAgPHA+PGVtPlRlc3RTdHJpbmc8L2VtPiBpcyBhIHN0cmluZyB3aGljaCBjYW4gY29udGFpbnMgdGhlCi0gICAgICBmb2xsb3dpbmcgZXhwYW5kZWQgY29uc3RydWN0cyBpbiBhZGRpdGlvbiB0byBwbGFpbiB0ZXh0OjwvcD4KLQotICAgICAgPHVsPgotICAgICAgICA8bGk+Ci0gICAgICAgICAgPHN0cm9uZz5SZXdyaXRlUnVsZSBiYWNrcmVmZXJlbmNlczwvc3Ryb25nPjogVGhlc2UgYXJlCi0gICAgICAgICAgYmFja3JlZmVyZW5jZXMgb2YgdGhlIGZvcm0gCi0KLSAgICAgICAgICA8YmxvY2txdW90ZT4KLSAgICAgICAgICAgIDxzdHJvbmc+PGNvZGU+JE48L2NvZGU+PC9zdHJvbmc+Ci0gICAgICAgICAgPC9ibG9ja3F1b3RlPgotICAgICAgICAgICgwICZsdDs9IE4gJmx0Oz0gOSkgd2hpY2ggcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIGdyb3VwZWQKLSAgICAgICAgICBwYXJ0cyAocGFyZW50aGVzaXMhKSBvZiB0aGUgcGF0dGVybiBmcm9tIHRoZQotICAgICAgICAgIGNvcnJlc3BvbmRpbmcgPGNvZGU+UmV3cml0ZVJ1bGU8L2NvZGU+IGRpcmVjdGl2ZSAodGhlIG9uZQotICAgICAgICAgIGZvbGxvd2luZyB0aGUgY3VycmVudCBidW5jaCBvZiA8Y29kZT5SZXdyaXRlQ29uZDwvY29kZT4KLSAgICAgICAgICBkaXJlY3RpdmVzKS4KLSAgICAgICAgPC9saT4KLQotICAgICAgICA8bGk+Ci0gICAgICAgICAgPHN0cm9uZz5SZXdyaXRlQ29uZCBiYWNrcmVmZXJlbmNlczwvc3Ryb25nPjogVGhlc2UgYXJlCi0gICAgICAgICAgYmFja3JlZmVyZW5jZXMgb2YgdGhlIGZvcm0gCi0KLSAgICAgICAgICA8YmxvY2txdW90ZT4KLSAgICAgICAgICAgIDxzdHJvbmc+PGNvZGU+JU48L2NvZGU+PC9zdHJvbmc+Ci0gICAgICAgICAgPC9ibG9ja3F1b3RlPgotICAgICAgICAgICgxICZsdDs9IE4gJmx0Oz0gOSkgd2hpY2ggcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIGdyb3VwZWQKLSAgICAgICAgICBwYXJ0cyAocGFyZW50aGVzZXMhKSBvZiB0aGUgcGF0dGVybiBmcm9tIHRoZSBsYXN0IG1hdGNoZWQKLSAgICAgICAgICA8Y29kZT5SZXdyaXRlQ29uZDwvY29kZT4gZGlyZWN0aXZlIGluIHRoZSBjdXJyZW50IGJ1bmNoCi0gICAgICAgICAgb2YgY29uZGl0aW9ucy4KLSAgICAgICAgPC9saT4KLQotICAgICAgICA8bGk+Ci0gICAgICAgICAgPHN0cm9uZz5SZXdyaXRlTWFwIGV4cGFuc2lvbnM8L3N0cm9uZz46IFRoZXNlIGFyZQotICAgICAgICAgIGV4cGFuc2lvbnMgb2YgdGhlIGZvcm0gCi0KLSAgICAgICAgICA8YmxvY2txdW90ZT4KLSAgICAgICAgICAgIDxzdHJvbmc+PGNvZGU+JHttYXBuYW1lOmtleXxkZWZhdWx0fTwvY29kZT48L3N0cm9uZz4KLSAgICAgICAgICA8L2Jsb2NrcXVvdGU+Ci0gICAgICAgICAgU2VlIDxhIGhyZWY9IiNtYXBmdW5jIj50aGUgZG9jdW1lbnRhdGlvbiBmb3IKLSAgICAgICAgICBSZXdyaXRlTWFwPC9hPiBmb3IgbW9yZSBkZXRhaWxzLgotICAgICAgICA8L2xpPgotCi0gICAgICAgIDxsaT4KLSAgICAgICAgICA8c3Ryb25nPlNlcnZlci1WYXJpYWJsZXM8L3N0cm9uZz46IFRoZXNlIGFyZSB2YXJpYWJsZXMgb2YKLSAgICAgICAgICB0aGUgZm9ybSAKLQotICAgICAgICAgIDxibG9ja3F1b3RlPgotICAgICAgICAgICAgPHN0cm9uZz48Y29kZT4lezwvY29kZT4gPGVtPk5BTUVfT0ZfVkFSSUFCTEU8L2VtPgotICAgICAgICAgICAgPGNvZGU+fTwvY29kZT48L3N0cm9uZz4KLSAgICAgICAgICA8L2Jsb2NrcXVvdGU+Ci0gICAgICAgICAgd2hlcmUgPGVtPk5BTUVfT0ZfVkFSSUFCTEU8L2VtPiBjYW4gYmUgYSBzdHJpbmcgdGFrZW4KLSAgICAgICAgICBmcm9tIHRoZSBmb2xsb3dpbmcgbGlzdDogCi0KLSAgICAgICAgICA8dGFibGUgYmdjb2xvcj0iI0YwRjBGMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI1Ij4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIHZhbGlnbj0iVE9QIj4KLSAgICAgICAgICAgICAgICA8c3Ryb25nPkhUVFAgaGVhZGVyczo8L3N0cm9uZz4gCi0KLSAgICAgICAgICAgICAgICA8cD48Zm9udCBzaXplPSItMSI+SFRUUF9VU0VSX0FHRU5UPGJyIC8+Ci0gICAgICAgICAgICAgICAgIEhUVFBfUkVGRVJFUjxiciAvPgotICAgICAgICAgICAgICAgICBIVFRQX0NPT0tJRTxiciAvPgotICAgICAgICAgICAgICAgICBIVFRQX0ZPUldBUkRFRDxiciAvPgotICAgICAgICAgICAgICAgICBIVFRQX0hPU1Q8YnIgLz4KLSAgICAgICAgICAgICAgICAgSFRUUF9QUk9YWV9DT05ORUNUSU9OPGJyIC8+Ci0gICAgICAgICAgICAgICAgIEhUVFBfQUNDRVBUPGJyIC8+Ci0gICAgICAgICAgICAgICAgPC9mb250PjwvcD4KLSAgICAgICAgICAgICAgPC90ZD4KLQotICAgICAgICAgICAgICA8dGQgdmFsaWduPSJUT1AiPgotICAgICAgICAgICAgICAgIDxzdHJvbmc+Y29ubmVjdGlvbiAmYW1wOyByZXF1ZXN0Ojwvc3Ryb25nPiAKLQotICAgICAgICAgICAgICAgIDxwPjxmb250IHNpemU9Ii0xIj5SRU1PVEVfQUREUjxiciAvPgotICAgICAgICAgICAgICAgICBSRU1PVEVfSE9TVDxiciAvPgotICAgICAgICAgICAgICAgICBSRU1PVEVfVVNFUjxiciAvPgotICAgICAgICAgICAgICAgICBSRU1PVEVfSURFTlQ8YnIgLz4KLSAgICAgICAgICAgICAgICAgUkVRVUVTVF9NRVRIT0Q8YnIgLz4KLSAgICAgICAgICAgICAgICAgU0NSSVBUX0ZJTEVOQU1FPGJyIC8+Ci0gICAgICAgICAgICAgICAgIFBBVEhfSU5GTzxiciAvPgotICAgICAgICAgICAgICAgICBRVUVSWV9TVFJJTkc8YnIgLz4KLSAgICAgICAgICAgICAgICAgQVVUSF9UWVBFPGJyIC8+Ci0gICAgICAgICAgICAgICAgPC9mb250PjwvcD4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIHZhbGlnbj0iVE9QIj4KLSAgICAgICAgICAgICAgICA8c3Ryb25nPnNlcnZlciBpbnRlcm5hbHM6PC9zdHJvbmc+IAotCi0gICAgICAgICAgICAgICAgPHA+PGZvbnQgc2l6ZT0iLTEiPkRPQ1VNRU5UX1JPT1Q8YnIgLz4KLSAgICAgICAgICAgICAgICAgU0VSVkVSX0FETUlOPGJyIC8+Ci0gICAgICAgICAgICAgICAgIFNFUlZFUl9OQU1FPGJyIC8+Ci0gICAgICAgICAgICAgICAgIFNFUlZFUl9BRERSPGJyIC8+Ci0gICAgICAgICAgICAgICAgIFNFUlZFUl9QT1JUPGJyIC8+Ci0gICAgICAgICAgICAgICAgIFNFUlZFUl9QUk9UT0NPTDxiciAvPgotICAgICAgICAgICAgICAgICBTRVJWRVJfU09GVFdBUkU8YnIgLz4KLSAgICAgICAgICAgICAgICA8L2ZvbnQ+PC9wPgotICAgICAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgICAgIDx0ZCB2YWxpZ249IlRPUCI+Ci0gICAgICAgICAgICAgICAgPHN0cm9uZz5zeXN0ZW0gc3R1ZmY6PC9zdHJvbmc+IAotCi0gICAgICAgICAgICAgICAgPHA+PGZvbnQgc2l6ZT0iLTEiPlRJTUVfWUVBUjxiciAvPgotICAgICAgICAgICAgICAgICBUSU1FX01PTjxiciAvPgotICAgICAgICAgICAgICAgICBUSU1FX0RBWTxiciAvPgotICAgICAgICAgICAgICAgICBUSU1FX0hPVVI8YnIgLz4KLSAgICAgICAgICAgICAgICAgVElNRV9NSU48YnIgLz4KLSAgICAgICAgICAgICAgICAgVElNRV9TRUM8YnIgLz4KLSAgICAgICAgICAgICAgICAgVElNRV9XREFZPGJyIC8+Ci0gICAgICAgICAgICAgICAgIFRJTUU8YnIgLz4KLSAgICAgICAgICAgICAgICA8L2ZvbnQ+PC9wPgotICAgICAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgICAgIDx0ZCB2YWxpZ249IlRPUCI+Ci0gICAgICAgICAgICAgICAgPHN0cm9uZz5zcGVjaWFsczo8L3N0cm9uZz4gCi0KLSAgICAgICAgICAgICAgICA8cD48Zm9udCBzaXplPSItMSI+QVBJX1ZFUlNJT048YnIgLz4KLSAgICAgICAgICAgICAgICAgVEhFX1JFUVVFU1Q8YnIgLz4KLSAgICAgICAgICAgICAgICAgUkVRVUVTVF9VUkk8YnIgLz4KLSAgICAgICAgICAgICAgICAgUkVRVUVTVF9GSUxFTkFNRTxiciAvPgotICAgICAgICAgICAgICAgICBJU19TVUJSRVE8YnIgLz4KLSAgICAgICAgICAgICAgICA8L2ZvbnQ+PC9wPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L3RhYmxlPgotCi08bm90ZT4KLSAgICAgICAgICAgICAgICA8cD5UaGVzZSB2YXJpYWJsZXMgYWxsCi0gICAgICAgICAgICAgICAgY29ycmVzcG9uZCB0byB0aGUgc2ltaWxhcmx5IG5hbWVkIEhUVFAKLSAgICAgICAgICAgICAgICBNSU1FLWhlYWRlcnMsIEMgdmFyaWFibGVzIG9mIHRoZSBBcGFjaGUgc2VydmVyIG9yCi0gICAgICAgICAgICAgICAgPGNvZGU+c3RydWN0IHRtPC9jb2RlPiBmaWVsZHMgb2YgdGhlIFVuaXggc3lzdGVtLgotICAgICAgICAgICAgICAgIE1vc3QgYXJlIGRvY3VtZW50ZWQgZWxzZXdoZXJlIGluIHRoZSBNYW51YWwgb3IgaW4KLSAgICAgICAgICAgICAgICB0aGUgQ0dJIHNwZWNpZmljYXRpb24uIFRob3NlIHRoYXQgYXJlIHNwZWNpYWwgdG8KLSAgICAgICAgICAgICAgICBtb2RfcmV3cml0ZSBpbmNsdWRlOjwvcD4KLQotICAgICAgICAgICAgICAgIDxkbD4KLSAgICAgICAgICAgICAgICAgIDxkdD48Y29kZT5JU19TVUJSRVE8L2NvZGU+PC9kdD4KLQotICAgICAgICAgICAgICAgICAgPGRkPldpbGwgY29udGFpbiB0aGUgdGV4dCAidHJ1ZSIgaWYgdGhlIHJlcXVlc3QKLSAgICAgICAgICAgICAgICAgIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQgaXMgYSBzdWItcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICJmYWxzZSIgb3RoZXJ3aXNlLiBTdWItcmVxdWVzdHMgbWF5IGJlIGdlbmVyYXRlZAotICAgICAgICAgICAgICAgICAgYnkgbW9kdWxlcyB0aGF0IG5lZWQgdG8gcmVzb2x2ZSBhZGRpdGlvbmFsIGZpbGVzCi0gICAgICAgICAgICAgICAgICBvciBVUklzIGluIG9yZGVyIHRvIGNvbXBsZXRlIHRoZWlyIHRhc2tzLjwvZGQ+Ci0KLSAgICAgICAgICAgICAgICAgIDxkdD48Y29kZT5BUElfVkVSU0lPTjwvY29kZT48L2R0PgotCi0gICAgICAgICAgICAgICAgICA8ZGQ+VGhpcyBpcyB0aGUgdmVyc2lvbiBvZiB0aGUgQXBhY2hlIG1vZHVsZSBBUEkKLSAgICAgICAgICAgICAgICAgICh0aGUgaW50ZXJuYWwgaW50ZXJmYWNlIGJldHdlZW4gc2VydmVyIGFuZAotICAgICAgICAgICAgICAgICAgbW9kdWxlKSBpbiB0aGUgY3VycmVudCBodHRwZCBidWlsZCwgYXMgZGVmaW5lZCBpbgotICAgICAgICAgICAgICAgICAgaW5jbHVkZS9hcF9tbW4uaC4gVGhlIG1vZHVsZSBBUEkgdmVyc2lvbgotICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIHZlcnNpb24gb2YgQXBhY2hlIGluIHVzZSAoaW4KLSAgICAgICAgICAgICAgICAgIHRoZSByZWxlYXNlIHZlcnNpb24gb2YgQXBhY2hlIDEuMy4xNCwgZm9yCi0gICAgICAgICAgICAgICAgICBpbnN0YW5jZSwgaXQgaXMgMTk5OTAzMjA6MTApLCBidXQgaXMgbWFpbmx5IG9mCi0gICAgICAgICAgICAgICAgICBpbnRlcmVzdCB0byBtb2R1bGUgYXV0aG9ycy48L2RkPgotCi0gICAgICAgICAgICAgICAgICA8ZHQ+PGNvZGU+VEhFX1JFUVVFU1Q8L2NvZGU+PC9kdD4KLQotICAgICAgICAgICAgICAgICAgPGRkPlRoZSBmdWxsIEhUVFAgcmVxdWVzdCBsaW5lIHNlbnQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICBicm93c2VyIHRvIHRoZSBzZXJ2ZXIgKGUuZy4sICI8Y29kZT5HRVQKLSAgICAgICAgICAgICAgICAgIC9pbmRleC5odG1sIEhUVFAvMS4xPC9jb2RlPiIpLiBUaGlzIGRvZXMgbm90Ci0gICAgICAgICAgICAgICAgICBpbmNsdWRlIGFueSBhZGRpdGlvbmFsIGhlYWRlcnMgc2VudCBieSB0aGUKLSAgICAgICAgICAgICAgICAgIGJyb3dzZXIuPC9kZD4KLQotICAgICAgICAgICAgICAgICAgPGR0Pjxjb2RlPlJFUVVFU1RfVVJJPC9jb2RlPjwvZHQ+Ci0KLSAgICAgICAgICAgICAgICAgIDxkZD5UaGUgcmVzb3VyY2UgcmVxdWVzdGVkIGluIHRoZSBIVFRQIHJlcXVlc3QKLSAgICAgICAgICAgICAgICAgIGxpbmUuIChJbiB0aGUgZXhhbXBsZSBhYm92ZSwgdGhpcyB3b3VsZCBiZQotICAgICAgICAgICAgICAgICAgIi9pbmRleC5odG1sIi4pPC9kZD4KLQotICAgICAgICAgICAgICAgICAgPGR0Pjxjb2RlPlJFUVVFU1RfRklMRU5BTUU8L2NvZGU+PC9kdD4KLQotICAgICAgICAgICAgICAgICAgPGRkPlRoZSBmdWxsIGxvY2FsIGZpbGVzeXN0ZW0gcGF0aCB0byB0aGUgZmlsZSBvcgotICAgICAgICAgICAgICAgICAgc2NyaXB0IG1hdGNoaW5nIHRoZSByZXF1ZXN0LjwvZGQ+Ci0gICAgICAgICAgICAgICAgPC9kbD4KLTwvbm90ZT4KLSAgICAgICAgPC9saT4KLSAgICAgIDwvdWw+Ci0KLSAgICAgIDxwPlNwZWNpYWwgTm90ZXM6PC9wPgotCi0gICAgICA8b2w+Ci0gICAgICAgIDxsaT5UaGUgdmFyaWFibGVzIFNDUklQVF9GSUxFTkFNRSBhbmQgUkVRVUVTVF9GSUxFTkFNRQotICAgICAgICBjb250YWluIHRoZSBzYW1lIHZhbHVlLCA8ZW0+aS5lLjwvZW0+LCB0aGUgdmFsdWUgb2YgdGhlCi0gICAgICAgIDxjb2RlPmZpbGVuYW1lPC9jb2RlPiBmaWVsZCBvZiB0aGUgaW50ZXJuYWwKLSAgICAgICAgPGNvZGU+cmVxdWVzdF9yZWM8L2NvZGU+IHN0cnVjdHVyZSBvZiB0aGUgQXBhY2hlIHNlcnZlci4KLSAgICAgICAgVGhlIGZpcnN0IG5hbWUgaXMganVzdCB0aGUgY29tbW9ubHkga25vd24gQ0dJIHZhcmlhYmxlIG5hbWUKLSAgICAgICAgd2hpbGUgdGhlIHNlY29uZCBpcyB0aGUgY29uc2lzdGVudCBjb3VudGVycGFydCB0bwotICAgICAgICBSRVFVRVNUX1VSSSAod2hpY2ggY29udGFpbnMgdGhlIHZhbHVlIG9mIHRoZQotICAgICAgICA8Y29kZT51cmk8L2NvZGU+IGZpZWxkIG9mIDxjb2RlPnJlcXVlc3RfcmVjPC9jb2RlPikuPC9saT4KLQotICAgICAgICA8bGk+VGhlcmUgaXMgdGhlIHNwZWNpYWwgZm9ybWF0OgotICAgICAgICA8Y29kZT4le0VOVjp2YXJpYWJsZX08L2NvZGU+IHdoZXJlIDxlbT52YXJpYWJsZTwvZW0+IGNhbiBiZQotICAgICAgICBhbnkgZW52aXJvbm1lbnQgdmFyaWFibGUuIFRoaXMgaXMgbG9va2VkLXVwIHZpYSBpbnRlcm5hbAotICAgICAgICBBcGFjaGUgc3RydWN0dXJlcyBhbmQgKGlmIG5vdCBmb3VuZCB0aGVyZSkgdmlhCi0gICAgICAgIDxjb2RlPmdldGVudigpPC9jb2RlPiBmcm9tIHRoZSBBcGFjaGUgc2VydmVyIHByb2Nlc3MuPC9saT4KLQotICAgICAgICA8bGk+VGhlcmUgaXMgdGhlIHNwZWNpYWwgZm9ybWF0OgotICAgICAgICA8Y29kZT4le0hUVFA6aGVhZGVyfTwvY29kZT4gd2hlcmUgPGVtPmhlYWRlcjwvZW0+IGNhbiBiZQotICAgICAgICBhbnkgSFRUUCBNSU1FLWhlYWRlciBuYW1lLiBUaGlzIGlzIGxvb2tlZC11cCBmcm9tIHRoZSBIVFRQCi0gICAgICAgIHJlcXVlc3QuIEV4YW1wbGU6IDxjb2RlPiV7SFRUUDpQcm94eS1Db25uZWN0aW9ufTwvY29kZT4gaXMKLSAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBIVFRQIGhlYWRlcgotICAgICAgICBgYDxjb2RlPlByb3h5LUNvbm5lY3Rpb246PC9jb2RlPicnLjwvbGk+Ci0KLSAgICAgICAgPGxpPlRoZXJlIGlzIHRoZSBzcGVjaWFsIGZvcm1hdAotICAgICAgICA8Y29kZT4le0xBLVU6dmFyaWFibGV9PC9jb2RlPiBmb3IgbG9vay1haGVhZHMgd2hpY2ggcGVyZm9ybQotICAgICAgICBhbiBpbnRlcm5hbCAoVVJMLWJhc2VkKSBzdWItcmVxdWVzdCB0byBkZXRlcm1pbmUgdGhlIGZpbmFsCi0gICAgICAgIHZhbHVlIG9mIDxlbT52YXJpYWJsZTwvZW0+LiBVc2UgdGhpcyB3aGVuIHlvdSB3YW50IHRvIHVzZSBhCi0gICAgICAgIHZhcmlhYmxlIGZvciByZXdyaXRpbmcgd2hpY2ggaXMgYWN0dWFsbHkgc2V0IGxhdGVyIGluIGFuCi0gICAgICAgIEFQSSBwaGFzZSBhbmQgdGh1cyBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSBjdXJyZW50IHN0YWdlLgotICAgICAgICBGb3IgaW5zdGFuY2Ugd2hlbiB5b3Ugd2FudCB0byByZXdyaXRlIGFjY29yZGluZyB0byB0aGUKLSAgICAgICAgPGNvZGU+UkVNT1RFX1VTRVI8L2NvZGU+IHZhcmlhYmxlIGZyb20gd2l0aGluIHRoZQotICAgICAgICBwZXItc2VydmVyIGNvbnRleHQgKDxjb2RlPmh0dHBkLmNvbmY8L2NvZGU+IGZpbGUpIHlvdSBoYXZlCi0gICAgICAgIHRvIHVzZSA8Y29kZT4le0xBLVU6UkVNT1RFX1VTRVJ9PC9jb2RlPiBiZWNhdXNlIHRoaXMKLSAgICAgICAgdmFyaWFibGUgaXMgc2V0IGJ5IHRoZSBhdXRob3JpemF0aW9uIHBoYXNlcyB3aGljaCBjb21lCi0gICAgICAgIDxlbT5hZnRlcjwvZW0+IHRoZSBVUkwgdHJhbnNsYXRpb24gcGhhc2Ugd2hlcmUgbW9kX3Jld3JpdGUKLSAgICAgICAgb3BlcmF0ZXMuIE9uIHRoZSBvdGhlciBoYW5kLCBiZWNhdXNlIG1vZF9yZXdyaXRlIGltcGxlbWVudHMKLSAgICAgICAgaXRzIHBlci1kaXJlY3RvcnkgY29udGV4dCAoPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBmaWxlKSB2aWEKLSAgICAgICAgdGhlIEZpeHVwIHBoYXNlIG9mIHRoZSBBUEkgYW5kIGJlY2F1c2UgdGhlIGF1dGhvcml6YXRpb24KLSAgICAgICAgcGhhc2VzIGNvbWUgPGVtPmJlZm9yZTwvZW0+IHRoaXMgcGhhc2UsIHlvdSBqdXN0IGNhbiB1c2UKLSAgICAgICAgPGNvZGU+JXtSRU1PVEVfVVNFUn08L2NvZGU+IHRoZXJlLjwvbGk+Ci0KLSAgICAgICAgPGxpPlRoZXJlIGlzIHRoZSBzcGVjaWFsIGZvcm1hdDoKLSAgICAgICAgPGNvZGU+JXtMQS1GOnZhcmlhYmxlfTwvY29kZT4gd2hpY2ggcGVyZm9ybXMgYW4gaW50ZXJuYWwKLSAgICAgICAgKGZpbGVuYW1lLWJhc2VkKSBzdWItcmVxdWVzdCB0byBkZXRlcm1pbmUgdGhlIGZpbmFsIHZhbHVlCi0gICAgICAgIG9mIDxlbT52YXJpYWJsZTwvZW0+LiBNb3N0IG9mIHRoZSB0aW1lIHRoaXMgaXMgdGhlIHNhbWUgYXMKLSAgICAgICAgTEEtVSBhYm92ZS48L2xpPgotICAgICAgPC9vbD4KLQotICAgICAgPHA+PGVtPkNvbmRQYXR0ZXJuPC9lbT4gaXMgdGhlIGNvbmRpdGlvbiBwYXR0ZXJuLAotICAgICAgPGVtPmkuZS48L2VtPiwgYSByZWd1bGFyIGV4cHJlc3Npb24gd2hpY2ggaXMgYXBwbGllZCB0byB0aGUKLSAgICAgIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlIDxlbT5UZXN0U3RyaW5nPC9lbT4sIDxlbT5pLmUuPC9lbT4sCi0gICAgICA8ZW0+VGVzdFN0cmluZzwvZW0+IGlzIGV2YWx1YXRlZCBhbmQgdGhlbiBtYXRjaGVkIGFnYWluc3QKLSAgICAgIDxlbT5Db25kUGF0dGVybjwvZW0+LjwvcD4KLQotICAgICAgPHA+PHN0cm9uZz5SZW1lbWJlcjo8L3N0cm9uZz4gPGVtPkNvbmRQYXR0ZXJuPC9lbT4gaXMgYQotICAgICAgc3RhbmRhcmQgPGVtPkV4dGVuZGVkIFJlZ3VsYXIgRXhwcmVzc2lvbjwvZW0+IHdpdGggc29tZQotICAgICAgYWRkaXRpb25zOjwvcD4KLQotICAgICAgPG9sPgotICAgICAgICA8bGk+WW91IGNhbiBwcmVmaXggdGhlIHBhdHRlcm4gc3RyaW5nIHdpdGggYQotICAgICAgICAnPGNvZGU+ITwvY29kZT4nIGNoYXJhY3RlciAoZXhjbGFtYXRpb24gbWFyaykgdG8gc3BlY2lmeSBhCi0gICAgICAgIDxzdHJvbmc+bm9uPC9zdHJvbmc+LW1hdGNoaW5nIHBhdHRlcm4uPC9saT4KLQotICAgICAgICA8bGk+Ci0gICAgICAgICAgVGhlcmUgYXJlIHNvbWUgc3BlY2lhbCB2YXJpYW50cyBvZiA8ZW0+Q29uZFBhdHRlcm5zPC9lbT4uCi0gICAgICAgICAgSW5zdGVhZCBvZiByZWFsIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdHJpbmdzIHlvdSBjYW4gYWxzbwotICAgICAgICAgIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZzogCi0KLSAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICA8bGk+JzxzdHJvbmc+Jmx0O0NvbmRQYXR0ZXJuPC9zdHJvbmc+JyAoaXMgbGV4aWNhbGx5Ci0gICAgICAgICAgICBsb3dlcik8YnIgLz4KLSAgICAgICAgICAgICBUcmVhdHMgdGhlIDxlbT5Db25kUGF0dGVybjwvZW0+IGFzIGEgcGxhaW4gc3RyaW5nIGFuZAotICAgICAgICAgICAgY29tcGFyZXMgaXQgbGV4aWNhbGx5IHRvIDxlbT5UZXN0U3RyaW5nPC9lbT4uIFRydWUgaWYKLSAgICAgICAgICAgIDxlbT5UZXN0U3RyaW5nPC9lbT4gaXMgbGV4aWNhbGx5IGxvd2VyIHRoYW4KLSAgICAgICAgICAgIDxlbT5Db25kUGF0dGVybjwvZW0+LjwvbGk+Ci0KLSAgICAgICAgICAgIDxsaT4nPHN0cm9uZz4mZ3Q7Q29uZFBhdHRlcm48L3N0cm9uZz4nIChpcyBsZXhpY2FsbHkKLSAgICAgICAgICAgIGdyZWF0ZXIpPGJyIC8+Ci0gICAgICAgICAgICAgVHJlYXRzIHRoZSA8ZW0+Q29uZFBhdHRlcm48L2VtPiBhcyBhIHBsYWluIHN0cmluZyBhbmQKLSAgICAgICAgICAgIGNvbXBhcmVzIGl0IGxleGljYWxseSB0byA8ZW0+VGVzdFN0cmluZzwvZW0+LiBUcnVlIGlmCi0gICAgICAgICAgICA8ZW0+VGVzdFN0cmluZzwvZW0+IGlzIGxleGljYWxseSBncmVhdGVyIHRoYW4KLSAgICAgICAgICAgIDxlbT5Db25kUGF0dGVybjwvZW0+LjwvbGk+Ci0KLSAgICAgICAgICAgIDxsaT4nPHN0cm9uZz49Q29uZFBhdHRlcm48L3N0cm9uZz4nIChpcyBsZXhpY2FsbHkKLSAgICAgICAgICAgIGVxdWFsKTxiciAvPgotICAgICAgICAgICAgIFRyZWF0cyB0aGUgPGVtPkNvbmRQYXR0ZXJuPC9lbT4gYXMgYSBwbGFpbiBzdHJpbmcgYW5kCi0gICAgICAgICAgICBjb21wYXJlcyBpdCBsZXhpY2FsbHkgdG8gPGVtPlRlc3RTdHJpbmc8L2VtPi4gVHJ1ZSBpZgotICAgICAgICAgICAgPGVtPlRlc3RTdHJpbmc8L2VtPiBpcyBsZXhpY2FsbHkgZXF1YWwgdG8KLSAgICAgICAgICAgIDxlbT5Db25kUGF0dGVybjwvZW0+LCBpLmUgdGhlIHR3byBzdHJpbmdzIGFyZSBleGFjdGx5Ci0gICAgICAgICAgICBlcXVhbCAoY2hhcmFjdGVyIGJ5IGNoYXJhY3RlcikuIElmIDxlbT5Db25kUGF0dGVybjwvZW0+Ci0gICAgICAgICAgICBpcyBqdXN0IDxzYW1wPiIiPC9zYW1wPiAodHdvIHF1b3RhdGlvbiBtYXJrcykgdGhpcwotICAgICAgICAgICAgY29tcGFyZXMgPGVtPlRlc3RTdHJpbmc8L2VtPiB0byB0aGUgZW1wdHkgc3RyaW5nLjwvbGk+Ci0KLSAgICAgICAgICAgIDxsaT4nPHN0cm9uZz4tZDwvc3Ryb25nPicgKGlzCi0gICAgICAgICAgICA8c3Ryb25nPmQ8L3N0cm9uZz5pcmVjdG9yeSk8YnIgLz4KLSAgICAgICAgICAgICBUcmVhdHMgdGhlIDxlbT5UZXN0U3RyaW5nPC9lbT4gYXMgYSBwYXRobmFtZSBhbmQgdGVzdHMKLSAgICAgICAgICAgIGlmIGl0IGV4aXN0cyBhbmQgaXMgYSBkaXJlY3RvcnkuPC9saT4KLQotICAgICAgICAgICAgPGxpPic8c3Ryb25nPi1mPC9zdHJvbmc+JyAoaXMgcmVndWxhcgotICAgICAgICAgICAgPHN0cm9uZz5mPC9zdHJvbmc+aWxlKTxiciAvPgotICAgICAgICAgICAgIFRyZWF0cyB0aGUgPGVtPlRlc3RTdHJpbmc8L2VtPiBhcyBhIHBhdGhuYW1lIGFuZCB0ZXN0cwotICAgICAgICAgICAgaWYgaXQgZXhpc3RzIGFuZCBpcyBhIHJlZ3VsYXIgZmlsZS48L2xpPgotCi0gICAgICAgICAgICA8bGk+JzxzdHJvbmc+LXM8L3N0cm9uZz4nIChpcyByZWd1bGFyIGZpbGUgd2l0aAotICAgICAgICAgICAgPHN0cm9uZz5zPC9zdHJvbmc+aXplKTxiciAvPgotICAgICAgICAgICAgIFRyZWF0cyB0aGUgPGVtPlRlc3RTdHJpbmc8L2VtPiBhcyBhIHBhdGhuYW1lIGFuZCB0ZXN0cwotICAgICAgICAgICAgaWYgaXQgZXhpc3RzIGFuZCBpcyBhIHJlZ3VsYXIgZmlsZSB3aXRoIHNpemUgZ3JlYXRlcgotICAgICAgICAgICAgdGhhbiB6ZXJvLjwvbGk+Ci0KLSAgICAgICAgICAgIDxsaT4nPHN0cm9uZz4tbDwvc3Ryb25nPicgKGlzIHN5bWJvbGljCi0gICAgICAgICAgICA8c3Ryb25nPmw8L3N0cm9uZz5pbmspPGJyIC8+Ci0gICAgICAgICAgICAgVHJlYXRzIHRoZSA8ZW0+VGVzdFN0cmluZzwvZW0+IGFzIGEgcGF0aG5hbWUgYW5kIHRlc3RzCi0gICAgICAgICAgICBpZiBpdCBleGlzdHMgYW5kIGlzIGEgc3ltYm9saWMgbGluay48L2xpPgotCi0gICAgICAgICAgICA8bGk+JzxzdHJvbmc+LUY8L3N0cm9uZz4nIChpcyBleGlzdGluZyBmaWxlIHZpYQotICAgICAgICAgICAgc3VicmVxdWVzdCk8YnIgLz4KLSAgICAgICAgICAgICBDaGVja3MgaWYgPGVtPlRlc3RTdHJpbmc8L2VtPiBpcyBhIHZhbGlkIGZpbGUgYW5kCi0gICAgICAgICAgICBhY2Nlc3NpYmxlIHZpYSBhbGwgdGhlIHNlcnZlcidzIGN1cnJlbnRseS1jb25maWd1cmVkCi0gICAgICAgICAgICBhY2Nlc3MgY29udHJvbHMgZm9yIHRoYXQgcGF0aC4gVGhpcyB1c2VzIGFuIGludGVybmFsCi0gICAgICAgICAgICBzdWJyZXF1ZXN0IHRvIGRldGVybWluZSB0aGUgY2hlY2ssIHNvIHVzZSBpdCB3aXRoIGNhcmUKLSAgICAgICAgICAgIGJlY2F1c2UgaXQgZGVjcmVhc2VzIHlvdXIgc2VydmVycyBwZXJmb3JtYW5jZSE8L2xpPgotCi0gICAgICAgICAgICA8bGk+JzxzdHJvbmc+LVU8L3N0cm9uZz4nIChpcyBleGlzdGluZyBVUkwgdmlhCi0gICAgICAgICAgICBzdWJyZXF1ZXN0KTxiciAvPgotICAgICAgICAgICAgIENoZWNrcyBpZiA8ZW0+VGVzdFN0cmluZzwvZW0+IGlzIGEgdmFsaWQgVVJMIGFuZAotICAgICAgICAgICAgYWNjZXNzaWJsZSB2aWEgYWxsIHRoZSBzZXJ2ZXIncyBjdXJyZW50bHktY29uZmlndXJlZAotICAgICAgICAgICAgYWNjZXNzIGNvbnRyb2xzIGZvciB0aGF0IHBhdGguIFRoaXMgdXNlcyBhbiBpbnRlcm5hbAotICAgICAgICAgICAgc3VicmVxdWVzdCB0byBkZXRlcm1pbmUgdGhlIGNoZWNrLCBzbyB1c2UgaXQgd2l0aCBjYXJlCi0gICAgICAgICAgICBiZWNhdXNlIGl0IGRlY3JlYXNlcyB5b3VyIHNlcnZlcidzIHBlcmZvcm1hbmNlITwvbGk+Ci0gICAgICAgICAgPC91bD4KLQotPG5vdGU+PHRpdGxlPk5vdGljZTwvdGl0bGU+Ci0gICAgICAgICAgICAgIEFsbCBvZiB0aGVzZSB0ZXN0cyBjYW4KLSAgICAgICAgICAgICAgYWxzbyBiZSBwcmVmaXhlZCBieSBhbiBleGNsYW1hdGlvbiBtYXJrICgnIScpIHRvCi0gICAgICAgICAgICAgIG5lZ2F0ZSB0aGVpciBtZWFuaW5nLgotPC9ub3RlPgotICAgICAgICA8L2xpPgotICAgICAgPC9vbD4KLQotICAgICAgPHA+QWRkaXRpb25hbGx5IHlvdSBjYW4gc2V0IHNwZWNpYWwgZmxhZ3MgZm9yCi0gICAgICA8ZW0+Q29uZFBhdHRlcm48L2VtPiBieSBhcHBlbmRpbmc8L3A+Ci0KLSAgICAgIDxibG9ja3F1b3RlPgotICAgICAgICA8c3Ryb25nPjxjb2RlPls8L2NvZGU+PGVtPmZsYWdzPC9lbT48Y29kZT5dPC9jb2RlPjwvc3Ryb25nPgotICAgICAgPC9ibG9ja3F1b3RlPgotICAgICAgYXMgdGhlIHRoaXJkIGFyZ3VtZW50IHRvIHRoZSA8Y29kZT5SZXdyaXRlQ29uZDwvY29kZT4KLSAgICAgIGRpcmVjdGl2ZS4gPGVtPkZsYWdzPC9lbT4gaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUKLSAgICAgIGZvbGxvd2luZyBmbGFnczogCi0KLSAgICAgIDx1bD4KLSAgICAgICAgPGxpPic8c3Ryb25nPjxjb2RlPm5vY2FzZXxOQzwvY29kZT48L3N0cm9uZz4nCi0gICAgICAgICg8c3Ryb25nPm48L3N0cm9uZz5vIDxzdHJvbmc+Yzwvc3Ryb25nPmFzZSk8YnIgLz4KLSAgICAgICAgIFRoaXMgbWFrZXMgdGhlIHRlc3QgY2FzZS1pbnNlbnNpdGl2ZSwgPGVtPmkuZS48L2VtPiwgdGhlcmUKLSAgICAgICAgaXMgbm8gZGlmZmVyZW5jZSBiZXR3ZWVuICdBLVonIGFuZCAnYS16JyBib3RoIGluIHRoZQotICAgICAgICBleHBhbmRlZCA8ZW0+VGVzdFN0cmluZzwvZW0+IGFuZCB0aGUgPGVtPkNvbmRQYXR0ZXJuPC9lbT4uCi0gICAgICAgIFRoaXMgZmxhZyBpcyBlZmZlY3RpdmUgb25seSBmb3IgY29tcGFyaXNvbnMgYmV0d2VlbgotICAgICAgICA8ZW0+VGVzdFN0cmluZzwvZW0+IGFuZCA8ZW0+Q29uZFBhdHRlcm48L2VtPi4gSXQgaGFzIG5vCi0gICAgICAgIGVmZmVjdCBvbiBmaWxlc3lzdGVtIGFuZCBzdWJyZXF1ZXN0IGNoZWNrcy48L2xpPgotCi0gICAgICAgIDxsaT4KLSAgICAgICAgICAnPHN0cm9uZz48Y29kZT5vcm5leHR8T1I8L2NvZGU+PC9zdHJvbmc+JwotICAgICAgICAgICg8c3Ryb25nPm9yPC9zdHJvbmc+IG5leHQgY29uZGl0aW9uKTxiciAvPgotICAgICAgICAgICBVc2UgdGhpcyB0byBjb21iaW5lIHJ1bGUgY29uZGl0aW9ucyB3aXRoIGEgbG9jYWwgT1IKLSAgICAgICAgICBpbnN0ZWFkIG9mIHRoZSBpbXBsaWNpdCBBTkQuIFR5cGljYWwgZXhhbXBsZTogCi0KLTxleGFtcGxlPgotPHByZT4KLVJld3JpdGVDb25kICV7UkVNT1RFX0hPU1R9ICBeaG9zdDEuKiAgW09SXQotUmV3cml0ZUNvbmQgJXtSRU1PVEVfSE9TVH0gIF5ob3N0Mi4qICBbT1JdCi1SZXdyaXRlQ29uZCAle1JFTU9URV9IT1NUfSAgXmhvc3QzLioKLVJld3JpdGVSdWxlIC4uLnNvbWUgc3BlY2lhbCBzdHVmZiBmb3IgYW55IG9mIHRoZXNlIGhvc3RzLi4uCi08L3ByZT4KLTwvZXhhbXBsZT4KLQotICAgICAgICAgIFdpdGhvdXQgdGhpcyBmbGFnIHlvdSB3b3VsZCBoYXZlIHRvIHdyaXRlIHRoZSBjb25kL3J1bGUKLSAgICAgICAgICB0aHJlZSB0aW1lcy4KLSAgICAgICAgPC9saT4KLSAgICAgIDwvdWw+Ci0KLSAgICAgIDxwPjxzdHJvbmc+RXhhbXBsZTo8L3N0cm9uZz48L3A+Ci0KLSAgICAgICA8cD5UbyByZXdyaXRlIHRoZSBIb21lcGFnZSBvZiBhIHNpdGUgYWNjb3JkaW5nIHRvIHRoZQotICAgICAgICBgYDxjb2RlPlVzZXItQWdlbnQ6PC9jb2RlPicnIGhlYWRlciBvZiB0aGUgcmVxdWVzdCwgeW91IGNhbgotICAgICAgICB1c2UgdGhlIGZvbGxvd2luZzogPC9wPgotCi08ZXhhbXBsZT4KLTxwcmU+Ci1SZXdyaXRlQ29uZCAgJXtIVFRQX1VTRVJfQUdFTlR9ICBeTW96aWxsYS4qCi1SZXdyaXRlUnVsZSAgXi8kICAgICAgICAgICAgICAgICAvaG9tZXBhZ2UubWF4Lmh0bWwgIFtMXQotCi1SZXdyaXRlQ29uZCAgJXtIVFRQX1VTRVJfQUdFTlR9ICBeTHlueC4qCi1SZXdyaXRlUnVsZSAgXi8kICAgICAgICAgICAgICAgICAvaG9tZXBhZ2UubWluLmh0bWwgIFtMXQotCi1SZXdyaXRlUnVsZSAgXi8kICAgICAgICAgICAgICAgICAvaG9tZXBhZ2Uuc3RkLmh0bWwgIFtMXQotPC9wcmU+Ci08L2V4YW1wbGU+Ci0KLSAgICAgICAgPHA+SW50ZXJwcmV0YXRpb246IElmIHlvdSB1c2UgTmV0c2NhcGUgTmF2aWdhdG9yIGFzIHlvdXIKLSAgICAgICAgYnJvd3NlciAod2hpY2ggaWRlbnRpZmllcyBpdHNlbGYgYXMgJ01vemlsbGEnKSwgdGhlbiB5b3UKLSAgICAgICAgZ2V0IHRoZSBtYXggaG9tZXBhZ2UsIHdoaWNoIGluY2x1ZGVzIEZyYW1lcywgPGVtPmV0Yy48L2VtPgotICAgICAgICBJZiB5b3UgdXNlIHRoZSBMeW54IGJyb3dzZXIgKHdoaWNoIGlzIFRlcm1pbmFsLWJhc2VkKSwgdGhlbgotICAgICAgICB5b3UgZ2V0IHRoZSBtaW4gaG9tZXBhZ2UsIHdoaWNoIGNvbnRhaW5zIG5vIGltYWdlcywgbm8KLSAgICAgICAgdGFibGVzLCA8ZW0+ZXRjLjwvZW0+IElmIHlvdSB1c2UgYW55IG90aGVyIGJyb3dzZXIgeW91IGdldAotICAgICAgICB0aGUgc3RhbmRhcmQgaG9tZXBhZ2UuPC9wPgotCi08L3VzYWdlPgotCi08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5SZXdyaXRlUnVsZTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5EZWZpbmVzIHJ1bGVzIGZvciB0aGUgcmV3cml0aW5nIGVuZ2luZTwvZGVzY3JpcHRpb24+Ci08c3ludGF4PlJld3JpdGVSdWxlCi0gICAgICA8ZW0+UGF0dGVybjwvZW0+IDxlbT5TdWJzdGl0dXRpb248L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+Tm9uZTwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD48Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT5GaWxlSW5mbzwvb3ZlcnJpZGU+Ci0KLTx1c2FnZT4KLSAgICAgIDxwPlRoZSA8ZGlyZWN0aXZlPlJld3JpdGVSdWxlPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBpcyB0aGUgcmVhbAotICAgICAgcmV3cml0aW5nIHdvcmtob3JzZS4gVGhlIGRpcmVjdGl2ZSBjYW4gb2NjdXIgbW9yZSB0aGFuIG9uY2UuCi0gICAgICBFYWNoIGRpcmVjdGl2ZSB0aGVuIGRlZmluZXMgb25lIHNpbmdsZSByZXdyaXRpbmcgcnVsZS4gVGhlCi0gICAgICA8c3Ryb25nPmRlZmluaXRpb24gb3JkZXI8L3N0cm9uZz4gb2YgdGhlc2UgcnVsZXMgaXMKLSAgICAgIDxzdHJvbmc+aW1wb3J0YW50PC9zdHJvbmc+LCBiZWNhdXNlIHRoaXMgb3JkZXIgaXMgdXNlZCB3aGVuCi0gICAgICBhcHBseWluZyB0aGUgcnVsZXMgYXQgcnVuLXRpbWUuPC9wPgotCi0gICAgICA8cD48YSBpZD0icGF0dGVybnMiIG5hbWU9InBhdHRlcm5zIj48ZW0+UGF0dGVybjwvZW0+PC9hPiBjYW4KLSAgICAgIGJlIChmb3IgQXBhY2hlIDEuMS54IGEgU3lzdGVtIFY4IGFuZCBmb3IgQXBhY2hlIDEuMi54IGFuZAotICAgICAgbGF0ZXIgYSBQT1NJWCkgPGEgaWQ9InJlZ2V4cCIgbmFtZT0icmVnZXhwIj5yZWd1bGFyCi0gICAgICBleHByZXNzaW9uPC9hPiB3aGljaCBnZXRzIGFwcGxpZWQgdG8gdGhlIGN1cnJlbnQgVVJMLiBIZXJlCi0gICAgICBgYGN1cnJlbnQnJyBtZWFucyB0aGUgdmFsdWUgb2YgdGhlIFVSTCB3aGVuIHRoaXMgcnVsZSBnZXRzCi0gICAgICBhcHBsaWVkLiBUaGlzIG1heSBub3QgYmUgdGhlIG9yaWdpbmFsbHkgcmVxdWVzdGVkIFVSTCwKLSAgICAgIGJlY2F1c2UgYW55IG51bWJlciBvZiBydWxlcyBtYXkgYWxyZWFkeSBoYXZlIG1hdGNoZWQgYW5kIG1hZGUKLSAgICAgIGFsdGVyYXRpb25zIHRvIGl0LjwvcD4KLQotICAgICAgPHA+U29tZSBoaW50cyBhYm91dCB0aGUgc3ludGF4IG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnM6PC9wPgotCi0gICAgICA8dGFibGUgYmdjb2xvcj0iI0YwRjBGMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI1Ij4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249IlRPUCI+Ci08cHJlPgotPHN0cm9uZz5UZXh0Ojwvc3Ryb25nPgotICA8c3Ryb25nPjxjb2RlPi48L2NvZGU+PC9zdHJvbmc+ICAgICAgICAgICBBbnkgc2luZ2xlIGNoYXJhY3RlcgotICA8c3Ryb25nPjxjb2RlPls8L2NvZGU+PC9zdHJvbmc+Y2hhcnM8c3Ryb25nPjxjb2RlPl08L2NvZGU+PC9zdHJvbmc+ICAgICBDaGFyYWN0ZXIgY2xhc3M6IE9uZSAgb2YgY2hhcnMKLSAgPHN0cm9uZz48Y29kZT5bXjwvY29kZT48L3N0cm9uZz5jaGFyczxzdHJvbmc+PGNvZGU+XTwvY29kZT48L3N0cm9uZz4gICAgQ2hhcmFjdGVyIGNsYXNzOiBOb25lIG9mIGNoYXJzCi0gIHRleHQxPHN0cm9uZz48Y29kZT58PC9jb2RlPjwvc3Ryb25nPnRleHQyIEFsdGVybmF0aXZlOiB0ZXh0MSBvciB0ZXh0MgotCi08c3Ryb25nPlF1YW50aWZpZXJzOjwvc3Ryb25nPgotICA8c3Ryb25nPjxjb2RlPj88L2NvZGU+PC9zdHJvbmc+ICAgICAgICAgICAwIG9yIDEgb2YgdGhlIHByZWNlZGluZyB0ZXh0Ci0gIDxzdHJvbmc+PGNvZGU+KjwvY29kZT48L3N0cm9uZz4gICAgICAgICAgIDAgb3IgTiBvZiB0aGUgcHJlY2VkaW5nIHRleHQgKE4gJmd0OyAwKQotICA8c3Ryb25nPjxjb2RlPis8L2NvZGU+PC9zdHJvbmc+ICAgICAgICAgICAxIG9yIE4gb2YgdGhlIHByZWNlZGluZyB0ZXh0IChOICZndDsgMSkKLQotPHN0cm9uZz5Hcm91cGluZzo8L3N0cm9uZz4KLSAgPHN0cm9uZz48Y29kZT4oPC9jb2RlPjwvc3Ryb25nPnRleHQ8c3Ryb25nPjxjb2RlPik8L2NvZGU+PC9zdHJvbmc+ICAgICAgR3JvdXBpbmcgb2YgdGV4dAotICAgICAgICAgICAgICAoZWl0aGVyIHRvIHNldCB0aGUgYm9yZGVycyBvZiBhbiBhbHRlcm5hdGl2ZSBvcgotICAgICAgICAgICAgICBmb3IgbWFraW5nIGJhY2tyZWZlcmVuY2VzIHdoZXJlIHRoZSA8c3Ryb25nPk48L3N0cm9uZz50aCBncm91cCBjYW4gCi0gICAgICAgICAgICAgIGJlIHVzZWQgb24gdGhlIFJIUyBvZiBhIFJld3JpdGVSdWxlIHdpdGggPGNvZGU+JDwvY29kZT48c3Ryb25nPk48L3N0cm9uZz4pCi0KLTxzdHJvbmc+QW5jaG9yczo8L3N0cm9uZz4KLSAgPHN0cm9uZz48Y29kZT5ePC9jb2RlPjwvc3Ryb25nPiAgICAgICAgICAgU3RhcnQgb2YgbGluZSBhbmNob3IKLSAgPHN0cm9uZz48Y29kZT4kPC9jb2RlPjwvc3Ryb25nPiAgICAgICAgICAgRW5kICAgb2YgbGluZSBhbmNob3IKLQotPHN0cm9uZz5Fc2NhcGluZzo8L3N0cm9uZz4KLSAgPHN0cm9uZz48Y29kZT5cPC9jb2RlPjwvc3Ryb25nPmNoYXIgICAgICAgZXNjYXBlIHRoYXQgcGFydGljdWxhciBjaGFyCi0gICAgICAgICAgICAgIChmb3IgaW5zdGFuY2UgdG8gc3BlY2lmeSB0aGUgY2hhcnMgIjxjb2RlPi5bXSgpPC9jb2RlPiIgPGVtPmV0Yy48L2VtPikKLTwvcHJlPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotCi0gICAgICA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCByZWd1bGFyIGV4cHJlc3Npb25zIGVpdGhlciBoYXZlCi0gICAgICBhIGxvb2sgYXQgeW91ciBsb2NhbCByZWdleCgzKSBtYW5wYWdlIG9yIGl0cwotICAgICAgPGNvZGU+c3JjL3JlZ2V4L3JlZ2V4LjM8L2NvZGU+IGNvcHkgaW4gdGhlIEFwYWNoZSAxLjMKLSAgICAgIGRpc3RyaWJ1dGlvbi4gSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIG1vcmUgZGV0YWlsZWQKLSAgICAgIGluZm9ybWF0aW9uIGFib3V0IHJlZ3VsYXIgZXhwcmVzc2lvbnMgYW5kIHRoZWlyIHZhcmlhbnRzCi0gICAgICAoUE9TSVggcmVnZXgsIFBlcmwgcmVnZXgsIDxlbT5ldGMuPC9lbT4pIGhhdmUgYSBsb29rIGF0IHRoZQotICAgICAgZm9sbG93aW5nIGRlZGljYXRlZCBib29rIG9uIHRoaXMgdG9waWM6PC9wPgotCi0gICAgICA8YmxvY2txdW90ZT4KLSAgICAgICAgPGVtPk1hc3RlcmluZyBSZWd1bGFyIEV4cHJlc3Npb25zPC9lbT48YnIgLz4KLSAgICAgICAgIEplZmZyZXkgRS5GLiBGcmllZGw8YnIgLz4KLSAgICAgICAgIE51dHNoZWxsIEhhbmRib29rIFNlcmllczxiciAvPgotICAgICAgICAgTydSZWlsbHkgJmFtcDsgQXNzb2NpYXRlcywgSW5jLiAxOTk3PGJyIC8+Ci0gICAgICAgICBJU0JOIDEtNTY1OTItMjU3LTM8YnIgLz4KLSAgICAgIDwvYmxvY2txdW90ZT4KLQotICAgICAgPHA+QWRkaXRpb25hbGx5IGluIG1vZF9yZXdyaXRlIHRoZSBOT1QgY2hhcmFjdGVyCi0gICAgICAoJzxjb2RlPiE8L2NvZGU+JykgaXMgYSBwb3NzaWJsZSBwYXR0ZXJuIHByZWZpeC4gVGhpcyBnaXZlcwotICAgICAgeW91IHRoZSBhYmlsaXR5IHRvIG5lZ2F0ZSBhIHBhdHRlcm47IHRvIHNheSwgZm9yIGluc3RhbmNlOgotICAgICAgYGA8ZW0+aWYgdGhlIGN1cnJlbnQgVVJMIGRvZXMgPHN0cm9uZz5OT1Q8L3N0cm9uZz4gbWF0Y2ggdGhpcwotICAgICAgcGF0dGVybjwvZW0+JycuIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGV4Y2VwdGlvbmFsIGNhc2VzLCB3aGVyZQotICAgICAgaXQgaXMgZWFzaWVyIHRvIG1hdGNoIHRoZSBuZWdhdGl2ZSBwYXR0ZXJuLCBvciBhcyBhIGxhc3QKLSAgICAgIGRlZmF1bHQgcnVsZS48L3A+Ci0KLTxub3RlPjx0aXRsZT5Ob3RpY2U8L3RpdGxlPgotV2hlbiB1c2luZyB0aGUgTk9UIGNoYXJhY3RlcgotICAgICAgICAgIHRvIG5lZ2F0ZSBhIHBhdHRlcm4geW91IGNhbm5vdCBoYXZlIGdyb3VwZWQgd2lsZGNhcmQKLSAgICAgICAgICBwYXJ0cyBpbiB0aGUgcGF0dGVybi4gVGhpcyBpcyBpbXBvc3NpYmxlIGJlY2F1c2Ugd2hlbiB0aGUKLSAgICAgICAgICBwYXR0ZXJuIGRvZXMgTk9UIG1hdGNoLCB0aGVyZSBhcmUgbm8gY29udGVudHMgZm9yIHRoZQotICAgICAgICAgIGdyb3Vwcy4gSW4gY29uc2VxdWVuY2UsIGlmIG5lZ2F0ZWQgcGF0dGVybnMgYXJlIHVzZWQsIHlvdQotICAgICAgICAgIGNhbm5vdCB1c2UgPGNvZGU+JE48L2NvZGU+IGluIHRoZSBzdWJzdGl0dXRpb24KLSAgICAgICAgICBzdHJpbmchCi08L25vdGU+Ci0KLSAgICAgIDxwPjxhIGlkPSJyaHMiIG5hbWU9InJocyI+PGVtPlN1YnN0aXR1dGlvbjwvZW0+PC9hPiBvZiBhCi0gICAgICByZXdyaXRpbmcgcnVsZSBpcyB0aGUgc3RyaW5nIHdoaWNoIGlzIHN1YnN0aXR1dGVkIGZvciAob3IKLSAgICAgIHJlcGxhY2VzKSB0aGUgb3JpZ2luYWwgVVJMIGZvciB3aGljaCA8ZW0+UGF0dGVybjwvZW0+Ci0gICAgICBtYXRjaGVkLiBCZXNpZGUgcGxhaW4gdGV4dCB5b3UgY2FuIHVzZTwvcD4KLQotICAgICAgPG9sPgotICAgICAgICA8bGk+YmFjay1yZWZlcmVuY2VzIDxjb2RlPiROPC9jb2RlPiB0byB0aGUgUmV3cml0ZVJ1bGUKLSAgICAgICAgcGF0dGVybjwvbGk+Ci0KLSAgICAgICAgPGxpPmJhY2stcmVmZXJlbmNlcyA8Y29kZT4lTjwvY29kZT4gdG8gdGhlIGxhc3QgbWF0Y2hlZAotICAgICAgICBSZXdyaXRlQ29uZCBwYXR0ZXJuPC9saT4KLQotICAgICAgICA8bGk+c2VydmVyLXZhcmlhYmxlcyBhcyBpbiBydWxlIGNvbmRpdGlvbiB0ZXN0LXN0cmluZ3MKLSAgICAgICAgKDxjb2RlPiV7VkFSTkFNRX08L2NvZGU+KTwvbGk+Ci0KLSAgICAgICAgPGxpPjxhIGhyZWY9IiNtYXBmdW5jIj5tYXBwaW5nLWZ1bmN0aW9uPC9hPiBjYWxscwotICAgICAgICAoPGNvZGU+JHttYXBuYW1lOmtleXxkZWZhdWx0fTwvY29kZT4pPC9saT4KLSAgICAgIDwvb2w+Ci0gICAgICBCYWNrLXJlZmVyZW5jZXMgYXJlIDxjb2RlPiQ8L2NvZGU+PHN0cm9uZz5OPC9zdHJvbmc+Ci0gICAgICAoPHN0cm9uZz5OPC9zdHJvbmc+PTAuLjkpIGlkZW50aWZpZXJzIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQKLSAgICAgIGJ5IHRoZSBjb250ZW50cyBvZiB0aGUgPHN0cm9uZz5OPC9zdHJvbmc+dGggZ3JvdXAgb2YgdGhlCi0gICAgICBtYXRjaGVkIDxlbT5QYXR0ZXJuPC9lbT4uIFRoZSBzZXJ2ZXItdmFyaWFibGVzIGFyZSB0aGUgc2FtZQotICAgICAgYXMgZm9yIHRoZSA8ZW0+VGVzdFN0cmluZzwvZW0+IG9mIGEgPGNvZGU+UmV3cml0ZUNvbmQ8L2NvZGU+Ci0gICAgICBkaXJlY3RpdmUuIFRoZSBtYXBwaW5nLWZ1bmN0aW9ucyBjb21lIGZyb20gdGhlCi0gICAgICA8Y29kZT5SZXdyaXRlTWFwPC9jb2RlPiBkaXJlY3RpdmUgYW5kIGFyZSBleHBsYWluZWQgdGhlcmUuCi0gICAgICBUaGVzZSB0aHJlZSB0eXBlcyBvZiB2YXJpYWJsZXMgYXJlIGV4cGFuZGVkIGluIHRoZSBvcmRlciBvZgotICAgICAgdGhlIGFib3ZlIGxpc3QuIAotCi0gICAgICA8cD5BcyBhbHJlYWR5IG1lbnRpb25lZCBhYm92ZSwgYWxsIHRoZSByZXdyaXRpbmcgcnVsZXMgYXJlCi0gICAgICBhcHBsaWVkIHRvIHRoZSA8ZW0+U3Vic3RpdHV0aW9uPC9lbT4gKGluIHRoZSBvcmRlciBvZgotICAgICAgZGVmaW5pdGlvbiBpbiB0aGUgY29uZmlnIGZpbGUpLiBUaGUgVVJMIGlzIDxzdHJvbmc+Y29tcGxldGVseQotICAgICAgcmVwbGFjZWQ8L3N0cm9uZz4gYnkgdGhlIDxlbT5TdWJzdGl0dXRpb248L2VtPiBhbmQgdGhlCi0gICAgICByZXdyaXRpbmcgcHJvY2VzcyBnb2VzIG9uIHVudGlsIHRoZXJlIGFyZSBubyBtb3JlIHJ1bGVzCi0gICAgICB1bmxlc3MgZXhwbGljaXRseSB0ZXJtaW5hdGVkIGJ5IGEKLSAgICAgIDxjb2RlPjxzdHJvbmc+TDwvc3Ryb25nPjwvY29kZT4gZmxhZyAtIHNlZSBiZWxvdy48L3A+Ci0KLSAgICAgIDxwPlRoZXJlIGlzIGEgc3BlY2lhbCBzdWJzdGl0dXRpb24gc3RyaW5nIG5hbWVkCi0gICAgICAnPGNvZGU+LTwvY29kZT4nIHdoaWNoIG1lYW5zOiA8c3Ryb25nPk5PCi0gICAgICBzdWJzdGl0dXRpb248L3N0cm9uZz4hIFNvdW5kcyBzaWxseT8gTm8sIGl0IGlzIHVzZWZ1bCB0bwotICAgICAgcHJvdmlkZSByZXdyaXRpbmcgcnVsZXMgd2hpY2ggPHN0cm9uZz5vbmx5PC9zdHJvbmc+IG1hdGNoCi0gICAgICBzb21lIFVSTHMgYnV0IGRvIG5vIHN1YnN0aXR1dGlvbiwgPGVtPmUuZy48L2VtPiwgaW4KLSAgICAgIGNvbmp1bmN0aW9uIHdpdGggdGhlIDxzdHJvbmc+Qzwvc3Ryb25nPiAoY2hhaW4pIGZsYWcgdG8gYmUKLSAgICAgIGFibGUgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIHBhdHRlcm4gdG8gYmUgYXBwbGllZCBiZWZvcmUgYQotICAgICAgc3Vic3RpdHV0aW9uIG9jY3Vycy48L3A+Ci0KLSAgICAgIDxwPk9uZSBtb3JlIG5vdGU6IFlvdSBjYW4gZXZlbiBjcmVhdGUgVVJMcyBpbiB0aGUKLSAgICAgIHN1YnN0aXR1dGlvbiBzdHJpbmcgY29udGFpbmluZyBhIHF1ZXJ5IHN0cmluZyBwYXJ0LiBKdXN0IHVzZQotICAgICAgYSBxdWVzdGlvbiBtYXJrIGluc2lkZSB0aGUgc3Vic3RpdHV0aW9uIHN0cmluZyB0byBpbmRpY2F0ZQotICAgICAgdGhhdCB0aGUgZm9sbG93aW5nIHN0dWZmIHNob3VsZCBiZSByZS1pbmplY3RlZCBpbnRvIHRoZQotICAgICAgUVVFUllfU1RSSU5HLiBXaGVuIHlvdSB3YW50IHRvIGVyYXNlIGFuIGV4aXN0aW5nIHF1ZXJ5Ci0gICAgICBzdHJpbmcsIGVuZCB0aGUgc3Vic3RpdHV0aW9uIHN0cmluZyB3aXRoIGp1c3QgdGhlIHF1ZXN0aW9uCi0gICAgICBtYXJrLjwvcD4KLQotPG5vdGU+PHRpdGxlPk5vdGU8L3RpdGxlPgotVGhlcmUgaXMgYSBzcGVjaWFsIGZlYXR1cmU6Ci0gICAgICAgICAgV2hlbiB5b3UgcHJlZml4IGEgc3Vic3RpdHV0aW9uIGZpZWxkIHdpdGgKLSAgICAgICAgICA8Y29kZT5odHRwOi8vPC9jb2RlPjxlbT50aGlzaG9zdDwvZW0+WzxlbT46dGhpc3BvcnQ8L2VtPl0KLSAgICAgICAgICB0aGVuIDxzdHJvbmc+bW9kX3Jld3JpdGU8L3N0cm9uZz4gYXV0b21hdGljYWxseSBzdHJpcHMgaXQKLSAgICAgICAgICBvdXQuIFRoaXMgYXV0by1yZWR1Y3Rpb24gb24gaW1wbGljaXQgZXh0ZXJuYWwgcmVkaXJlY3QKLSAgICAgICAgICBVUkxzIGlzIGEgdXNlZnVsIGFuZCBpbXBvcnRhbnQgZmVhdHVyZSB3aGVuIHVzZWQgaW4KLSAgICAgICAgICBjb21iaW5hdGlvbiB3aXRoIGEgbWFwcGluZy1mdW5jdGlvbiB3aGljaCBnZW5lcmF0ZXMgdGhlCi0gICAgICAgICAgaG9zdG5hbWUgcGFydC4gSGF2ZSBhIGxvb2sgYXQgdGhlIGZpcnN0IGV4YW1wbGUgaW4gdGhlCi0gICAgICAgICAgZXhhbXBsZSBzZWN0aW9uIGJlbG93IHRvIHVuZGVyc3RhbmQgdGhpcy4KLTwvbm90ZT4KLQotPG5vdGU+PHRpdGxlPlJlbWVtYmVyPC90aXRsZT4KLSBBbiB1bmNvbmRpdGlvbmFsIGV4dGVybmFsCi0gICAgICAgICAgcmVkaXJlY3QgdG8geW91ciBvd24gc2VydmVyIHdpbGwgbm90IHdvcmsgd2l0aCB0aGUgcHJlZml4Ci0gICAgICAgICAgPGNvZGU+aHR0cDovL3RoaXNob3N0PC9jb2RlPiBiZWNhdXNlIG9mIHRoaXMgZmVhdHVyZS4gVG8KLSAgICAgICAgICBhY2hpZXZlIHN1Y2ggYSBzZWxmLXJlZGlyZWN0LCB5b3UgaGF2ZSB0byB1c2UgdGhlCi0gICAgICAgICAgPHN0cm9uZz5SPC9zdHJvbmc+LWZsYWcgKHNlZSBiZWxvdykuCi08L25vdGU+Ci0KLSAgICAgIDxwPkFkZGl0aW9uYWxseSB5b3UgY2FuIHNldCBzcGVjaWFsIGZsYWdzIGZvcgotICAgICAgPGVtPlN1YnN0aXR1dGlvbjwvZW0+IGJ5IGFwcGVuZGluZzwvcD4KLQotICAgICAgPGJsb2NrcXVvdGU+Ci0gICAgICAgIDxzdHJvbmc+PGNvZGU+WzwvY29kZT48ZW0+ZmxhZ3M8L2VtPjxjb2RlPl08L2NvZGU+PC9zdHJvbmc+Ci0gICAgICA8L2Jsb2NrcXVvdGU+Ci0gICAgICBhcyB0aGUgdGhpcmQgYXJndW1lbnQgdG8gdGhlIDxjb2RlPlJld3JpdGVSdWxlPC9jb2RlPgotICAgICAgZGlyZWN0aXZlLiA8ZW0+RmxhZ3M8L2VtPiBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZQotICAgICAgZm9sbG93aW5nIGZsYWdzOiAKLQotICAgICAgPHVsPgotICAgICAgICA8bGk+Ci0gICAgICAgICAgJzxzdHJvbmc+PGNvZGU+cmVkaXJlY3R8UjwvY29kZT4KLSAgICAgICAgICBbPTxlbT5jb2RlPC9lbT5dPC9zdHJvbmc+JyAoZm9yY2UgPGEgaWQ9InJlZGlyZWN0IgotICAgICAgICAgIG5hbWU9InJlZGlyZWN0Ij48c3Ryb25nPnI8L3N0cm9uZz5lZGlyZWN0PC9hPik8YnIgLz4KLSAgICAgICAgICAgUHJlZml4IDxlbT5TdWJzdGl0dXRpb248L2VtPiB3aXRoCi0gICAgICAgICAgPGNvZGU+aHR0cDovL3RoaXNob3N0Wzp0aGlzcG9ydF0vPC9jb2RlPiAod2hpY2ggbWFrZXMgdGhlCi0gICAgICAgICAgbmV3IFVSTCBhIFVSSSkgdG8gZm9yY2UgYSBleHRlcm5hbCByZWRpcmVjdGlvbi4gSWYgbm8KLSAgICAgICAgICA8ZW0+Y29kZTwvZW0+IGlzIGdpdmVuIGEgSFRUUCByZXNwb25zZSBvZiAzMDIgKE1PVkVECi0gICAgICAgICAgVEVNUE9SQVJJTFkpIGlzIHVzZWQuIElmIHlvdSB3YW50IHRvIHVzZSBvdGhlciByZXNwb25zZQotICAgICAgICAgIGNvZGVzIGluIHRoZSByYW5nZSAzMDAtNDAwIGp1c3Qgc3BlY2lmeSB0aGVtIGFzIGEgbnVtYmVyCi0gICAgICAgICAgb3IgdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN5bWJvbGljIG5hbWVzOgotICAgICAgICAgIDxjb2RlPnRlbXA8L2NvZGU+IChkZWZhdWx0KSwgPGNvZGU+cGVybWFuZW50PC9jb2RlPiwKLSAgICAgICAgICA8Y29kZT5zZWVvdGhlcjwvY29kZT4uIFVzZSBpdCBmb3IgcnVsZXMgd2hpY2ggc2hvdWxkCi0gICAgICAgICAgY2Fub25pY2FsaXplIHRoZSBVUkwgYW5kIGdpdmUgaXQgYmFjayB0byB0aGUgY2xpZW50LAotICAgICAgICAgIDxlbT5lLmcuPC9lbT4sIHRyYW5zbGF0ZSBgYDxjb2RlPi9+PC9jb2RlPicnIGludG8KLSAgICAgICAgICBgYDxjb2RlPi91LzwvY29kZT4nJyBvciBhbHdheXMgYXBwZW5kIGEgc2xhc2ggdG8KLSAgICAgICAgICA8Y29kZT4vdS88L2NvZGU+PGVtPnVzZXI8L2VtPiwgZXRjLjxiciAvPgotICAgICAgICAgICAKLQotICAgICAgICAgIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gV2hlbiB5b3UgdXNlIHRoaXMgZmxhZywgbWFrZQotICAgICAgICAgIHN1cmUgdGhhdCB0aGUgc3Vic3RpdHV0aW9uIGZpZWxkIGlzIGEgdmFsaWQgVVJMISBJZiBub3QsCi0gICAgICAgICAgeW91IGFyZSByZWRpcmVjdGluZyB0byBhbiBpbnZhbGlkIGxvY2F0aW9uISBBbmQgcmVtZW1iZXIKLSAgICAgICAgICB0aGF0IHRoaXMgZmxhZyBpdHNlbGYgb25seSBwcmVmaXhlcyB0aGUgVVJMIHdpdGgKLSAgICAgICAgICA8Y29kZT5odHRwOi8vdGhpc2hvc3RbOnRoaXNwb3J0XS88L2NvZGU+LCByZXdyaXRpbmcKLSAgICAgICAgICBjb250aW51ZXMuIFVzdWFsbHkgeW91IGFsc28gd2FudCB0byBzdG9wIGFuZCBkbyB0aGUKLSAgICAgICAgICByZWRpcmVjdGlvbiBpbW1lZGlhdGVseS4gVG8gc3RvcCB0aGUgcmV3cml0aW5nIHlvdSBhbHNvCi0gICAgICAgICAgaGF2ZSB0byBwcm92aWRlIHRoZSAnTCcgZmxhZy48L3A+Ci0gICAgICAgIDwvbGk+Ci0KLSAgICAgICAgPGxpPic8c3Ryb25nPjxjb2RlPmZvcmJpZGRlbnxGPC9jb2RlPjwvc3Ryb25nPicgKGZvcmNlIFVSTAotICAgICAgICB0byBiZSA8c3Ryb25nPmY8L3N0cm9uZz5vcmJpZGRlbik8YnIgLz4KLSAgICAgICAgIFRoaXMgZm9yY2VzIHRoZSBjdXJyZW50IFVSTCB0byBiZSBmb3JiaWRkZW4sCi0gICAgICAgIDxlbT5pLmUuPC9lbT4sIGl0IGltbWVkaWF0ZWx5IHNlbmRzIGJhY2sgYSBIVFRQIHJlc3BvbnNlIG9mCi0gICAgICAgIDQwMyAoRk9SQklEREVOKS4gVXNlIHRoaXMgZmxhZyBpbiBjb25qdW5jdGlvbiB3aXRoCi0gICAgICAgIGFwcHJvcHJpYXRlIFJld3JpdGVDb25kcyB0byBjb25kaXRpb25hbGx5IGJsb2NrIHNvbWUKLSAgICAgICAgVVJMcy48L2xpPgotCi0gICAgICAgIDxsaT4nPHN0cm9uZz48Y29kZT5nb25lfEc8L2NvZGU+PC9zdHJvbmc+JyAoZm9yY2UgVVJMIHRvIGJlCi0gICAgICAgIDxzdHJvbmc+Zzwvc3Ryb25nPm9uZSk8YnIgLz4KLSAgICAgICAgIFRoaXMgZm9yY2VzIHRoZSBjdXJyZW50IFVSTCB0byBiZSBnb25lLCA8ZW0+aS5lLjwvZW0+LCBpdAotICAgICAgICBpbW1lZGlhdGVseSBzZW5kcyBiYWNrIGEgSFRUUCByZXNwb25zZSBvZiA0MTAgKEdPTkUpLiBVc2UKLSAgICAgICAgdGhpcyBmbGFnIHRvIG1hcmsgcGFnZXMgd2hpY2ggbm8gbG9uZ2VyIGV4aXN0IGFzIGdvbmUuPC9saT4KLQotICAgICAgICA8bGk+Ci0gICAgICAgICAgJzxzdHJvbmc+PGNvZGU+cHJveHl8UDwvY29kZT48L3N0cm9uZz4nIChmb3JjZQotICAgICAgICAgIDxzdHJvbmc+cDwvc3Ryb25nPnJveHkpPGJyIC8+Ci0gICAgICAgICAgIFRoaXMgZmxhZyBmb3JjZXMgdGhlIHN1YnN0aXR1dGlvbiBwYXJ0IHRvIGJlIGludGVybmFsbHkKLSAgICAgICAgICBmb3JjZWQgYXMgYSBwcm94eSByZXF1ZXN0IGFuZCBpbW1lZGlhdGVseSAoPGVtPmkuZS48L2VtPiwKLSAgICAgICAgICByZXdyaXRpbmcgcnVsZSBwcm9jZXNzaW5nIHN0b3BzIGhlcmUpIHB1dCB0aHJvdWdoIHRoZSA8YQotICAgICAgICAgIGhyZWY9Im1vZF9wcm94eS5odG1sIj5wcm94eSBtb2R1bGU8L2E+LiBZb3UgaGF2ZSB0byBtYWtlCi0gICAgICAgICAgc3VyZSB0aGF0IHRoZSBzdWJzdGl0dXRpb24gc3RyaW5nIGlzIGEgdmFsaWQgVVJJCi0gICAgICAgICAgKDxlbT5lLmcuPC9lbT4sIHR5cGljYWxseSBzdGFydGluZyB3aXRoCi0gICAgICAgICAgPGNvZGU+aHR0cDovLzwvY29kZT48ZW0+aG9zdG5hbWU8L2VtPikgd2hpY2ggY2FuIGJlCi0gICAgICAgICAgaGFuZGxlZCBieSB0aGUgQXBhY2hlIHByb3h5IG1vZHVsZS4gSWYgbm90IHlvdSBnZXQgYW4KLSAgICAgICAgICBlcnJvciBmcm9tIHRoZSBwcm94eSBtb2R1bGUuIFVzZSB0aGlzIGZsYWcgdG8gYWNoaWV2ZSBhCi0gICAgICAgICAgbW9yZSBwb3dlcmZ1bCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGEKLSAgICAgICAgICBocmVmPSJtb2RfcHJveHkuaHRtbCNwcm94eXBhc3MiPlByb3h5UGFzczwvYT4gZGlyZWN0aXZlLAotICAgICAgICAgIHRvIG1hcCBzb21lIHJlbW90ZSBzdHVmZiBpbnRvIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIGxvY2FsCi0gICAgICAgICAgc2VydmVyLiAKLQotICAgICAgICAgIDxwPk5vdGljZTogVG8gdXNlIHRoaXMgZnVuY3Rpb25hbGl0eSBtYWtlIHN1cmUgeW91IGhhdmUKLSAgICAgICAgICB0aGUgcHJveHkgbW9kdWxlIGNvbXBpbGVkIGludG8geW91ciBBcGFjaGUgc2VydmVyCi0gICAgICAgICAgcHJvZ3JhbS4gSWYgeW91IGRvbid0IGtub3cgcGxlYXNlIGNoZWNrIHdoZXRoZXIKLSAgICAgICAgICA8Y29kZT5tb2RfcHJveHkuYzwvY29kZT4gaXMgcGFydCBvZiB0aGUgYGA8Y29kZT5odHRwZAotICAgICAgICAgIC1sPC9jb2RlPicnIG91dHB1dC4gSWYgeWVzLCB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMKLSAgICAgICAgICBhdmFpbGFibGUgdG8gbW9kX3Jld3JpdGUuIElmIG5vdCwgdGhlbiB5b3UgZmlyc3QgaGF2ZSB0bwotICAgICAgICAgIHJlYnVpbGQgdGhlIGBgPGNvZGU+aHR0cGQ8L2NvZGU+JycgcHJvZ3JhbSB3aXRoIG1vZF9wcm94eQotICAgICAgICAgIGVuYWJsZWQuPC9wPgotICAgICAgICA8L2xpPgotCi0gICAgICAgIDxsaT4nPHN0cm9uZz48Y29kZT5sYXN0fEw8L2NvZGU+PC9zdHJvbmc+JwotICAgICAgICAoPHN0cm9uZz5sPC9zdHJvbmc+YXN0IHJ1bGUpPGJyIC8+Ci0gICAgICAgICBTdG9wIHRoZSByZXdyaXRpbmcgcHJvY2VzcyBoZXJlIGFuZCBkb24ndCBhcHBseSBhbnkgbW9yZQotICAgICAgICByZXdyaXRpbmcgcnVsZXMuIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIFBlcmwKLSAgICAgICAgPGNvZGU+bGFzdDwvY29kZT4gY29tbWFuZCBvciB0aGUgPGNvZGU+YnJlYWs8L2NvZGU+IGNvbW1hbmQKLSAgICAgICAgZnJvbSB0aGUgQyBsYW5ndWFnZS4gVXNlIHRoaXMgZmxhZyB0byBwcmV2ZW50IHRoZSBjdXJyZW50bHkKLSAgICAgICAgcmV3cml0dGVuIFVSTCBmcm9tIGJlaW5nIHJld3JpdHRlbiBmdXJ0aGVyIGJ5IGZvbGxvd2luZwotICAgICAgICBydWxlcy4gRm9yIGV4YW1wbGUsIHVzZSBpdCB0byByZXdyaXRlIHRoZSByb290LXBhdGggVVJMCi0gICAgICAgICgnPGNvZGU+LzwvY29kZT4nKSB0byBhIHJlYWwgb25lLCA8ZW0+ZS5nLjwvZW0+LAotICAgICAgICAnPGNvZGU+L2Uvd3d3LzwvY29kZT4nLjwvbGk+Ci0KLSAgICAgICAgPGxpPic8c3Ryb25nPjxjb2RlPm5leHR8TjwvY29kZT48L3N0cm9uZz4nCi0gICAgICAgICg8c3Ryb25nPm48L3N0cm9uZz5leHQgcm91bmQpPGJyIC8+Ci0gICAgICAgICBSZS1ydW4gdGhlIHJld3JpdGluZyBwcm9jZXNzIChzdGFydGluZyBhZ2FpbiB3aXRoIHRoZQotICAgICAgICBmaXJzdCByZXdyaXRpbmcgcnVsZSkuIEhlcmUgdGhlIFVSTCB0byBtYXRjaCBpcyBhZ2FpbiBub3QKLSAgICAgICAgdGhlIG9yaWdpbmFsIFVSTCBidXQgdGhlIFVSTCBmcm9tIHRoZSBsYXN0IHJld3JpdGluZyBydWxlLgotICAgICAgICBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBQZXJsIDxjb2RlPm5leHQ8L2NvZGU+IGNvbW1hbmQgb3IKLSAgICAgICAgdGhlIDxjb2RlPmNvbnRpbnVlPC9jb2RlPiBjb21tYW5kIGZyb20gdGhlIEMgbGFuZ3VhZ2UuIFVzZQotICAgICAgICB0aGlzIGZsYWcgdG8gcmVzdGFydCB0aGUgcmV3cml0aW5nIHByb2Nlc3MsIDxlbT5pLmUuPC9lbT4sCi0gICAgICAgIHRvIGltbWVkaWF0ZWx5IGdvIHRvIHRoZSB0b3Agb2YgdGhlIGxvb3AuPGJyIC8+Ci0gICAgICAgICA8c3Ryb25nPkJ1dCBiZSBjYXJlZnVsIG5vdCB0byBjcmVhdGUgYW4gaW5maW5pdGUKLSAgICAgICAgbG9vcCE8L3N0cm9uZz48L2xpPgotCi0gICAgICAgIDxsaT4nPHN0cm9uZz48Y29kZT5jaGFpbnxDPC9jb2RlPjwvc3Ryb25nPicKLSAgICAgICAgKDxzdHJvbmc+Yzwvc3Ryb25nPmhhaW5lZCB3aXRoIG5leHQgcnVsZSk8YnIgLz4KLSAgICAgICAgIFRoaXMgZmxhZyBjaGFpbnMgdGhlIGN1cnJlbnQgcnVsZSB3aXRoIHRoZSBuZXh0IHJ1bGUKLSAgICAgICAgKHdoaWNoIGl0c2VsZiBjYW4gYmUgY2hhaW5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcnVsZSwKLSAgICAgICAgPGVtPmV0Yy48L2VtPikuIFRoaXMgaGFzIHRoZSBmb2xsb3dpbmcgZWZmZWN0OiBpZiBhIHJ1bGUKLSAgICAgICAgbWF0Y2hlcywgdGhlbiBwcm9jZXNzaW5nIGNvbnRpbnVlcyBhcyB1c3VhbCwgPGVtPmkuZS48L2VtPiwKLSAgICAgICAgdGhlIGZsYWcgaGFzIG5vIGVmZmVjdC4gSWYgdGhlIHJ1bGUgZG9lcwotICAgICAgICA8c3Ryb25nPm5vdDwvc3Ryb25nPiBtYXRjaCwgdGhlbiBhbGwgZm9sbG93aW5nIGNoYWluZWQKLSAgICAgICAgcnVsZXMgYXJlIHNraXBwZWQuIEZvciBpbnN0YW5jZSwgdXNlIGl0IHRvIHJlbW92ZSB0aGUKLSAgICAgICAgYGA8Y29kZT4ud3d3PC9jb2RlPicnIHBhcnQgaW5zaWRlIGEgcGVyLWRpcmVjdG9yeSBydWxlIHNldAotICAgICAgICB3aGVuIHlvdSBsZXQgYW4gZXh0ZXJuYWwgcmVkaXJlY3QgaGFwcGVuICh3aGVyZSB0aGUKLSAgICAgICAgYGA8Y29kZT4ud3d3PC9jb2RlPicnIHBhcnQgc2hvdWxkIG5vdCB0byBvY2N1ciEpLjwvbGk+Ci0KLSAgICAgICAgPGxpPgotICAgICAgICAnPHN0cm9uZz48Y29kZT50eXBlfFQ8L2NvZGU+PC9zdHJvbmc+PTxlbT5NSU1FLXR5cGU8L2VtPicKLSAgICAgICAgKGZvcmNlIE1JTUUgPHN0cm9uZz50PC9zdHJvbmc+eXBlKTxiciAvPgotICAgICAgICAgRm9yY2UgdGhlIE1JTUUtdHlwZSBvZiB0aGUgdGFyZ2V0IGZpbGUgdG8gYmUKLSAgICAgICAgPGVtPk1JTUUtdHlwZTwvZW0+LiBGb3IgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIHVzZWQgdG8KLSAgICAgICAgc2ltdWxhdGUgdGhlIDxjb2RlPm1vZF9hbGlhczwvY29kZT4gZGlyZWN0aXZlCi0gICAgICAgIDxjb2RlPlNjcmlwdEFsaWFzPC9jb2RlPiB3aGljaCBpbnRlcm5hbGx5IGZvcmNlcyBhbGwgZmlsZXMKLSAgICAgICAgaW5zaWRlIHRoZSBtYXBwZWQgZGlyZWN0b3J5IHRvIGhhdmUgYSBNSU1FIHR5cGUgb2YKLSAgICAgICAgYGA8Y29kZT5hcHBsaWNhdGlvbi94LWh0dHBkLWNnaTwvY29kZT4nJy48L2xpPgotCi0gICAgICAgIDxsaT4KLSAgICAgICAgICAnPHN0cm9uZz48Y29kZT5ub3N1YnJlcXxOUzwvY29kZT48L3N0cm9uZz4nICh1c2VkIG9ubHkgaWYKLSAgICAgICAgICA8c3Ryb25nPm48L3N0cm9uZz5vIGludGVybmFsCi0gICAgICAgICAgPHN0cm9uZz5zPC9zdHJvbmc+dWItcmVxdWVzdCk8YnIgLz4KLSAgICAgICAgICAgVGhpcyBmbGFnIGZvcmNlcyB0aGUgcmV3cml0aW5nIGVuZ2luZSB0byBza2lwIGEKLSAgICAgICAgICByZXdyaXRpbmcgcnVsZSBpZiB0aGUgY3VycmVudCByZXF1ZXN0IGlzIGFuIGludGVybmFsCi0gICAgICAgICAgc3ViLXJlcXVlc3QuIEZvciBpbnN0YW5jZSwgc3ViLXJlcXVlc3RzIG9jY3VyIGludGVybmFsbHkKLSAgICAgICAgICBpbiBBcGFjaGUgd2hlbiA8Y29kZT5tb2RfaW5jbHVkZTwvY29kZT4gdHJpZXMgdG8gZmluZCBvdXQKLSAgICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCBwb3NzaWJsZSBkaXJlY3RvcnkgZGVmYXVsdCBmaWxlcwotICAgICAgICAgICg8Y29kZT5pbmRleC54eHg8L2NvZGU+KS4gT24gc3ViLXJlcXVlc3RzIGl0IGlzIG5vdAotICAgICAgICAgIGFsd2F5cyB1c2VmdWwgYW5kIGV2ZW4gc29tZXRpbWVzIGNhdXNlcyBhIGZhaWx1cmUgdG8gaWYKLSAgICAgICAgICB0aGUgY29tcGxldGUgc2V0IG9mIHJ1bGVzIGFyZSBhcHBsaWVkLiBVc2UgdGhpcyBmbGFnIHRvCi0gICAgICAgICAgZXhjbHVkZSBzb21lIHJ1bGVzLjxiciAvPgotICAgICAgICAgICAKLQotICAgICAgICAgIDxwPlVzZSB0aGUgZm9sbG93aW5nIHJ1bGUgZm9yIHlvdXIgZGVjaXNpb246IHdoZW5ldmVyIHlvdQotICAgICAgICAgIHByZWZpeCBzb21lIFVSTHMgd2l0aCBDR0ktc2NyaXB0cyB0byBmb3JjZSB0aGVtIHRvIGJlCi0gICAgICAgICAgcHJvY2Vzc2VkIGJ5IHRoZSBDR0ktc2NyaXB0LCB0aGUgY2hhbmNlIGlzIGhpZ2ggdGhhdCB5b3UKLSAgICAgICAgICB3aWxsIHJ1biBpbnRvIHByb2JsZW1zIChvciBldmVuIG92ZXJoZWFkKSBvbgotICAgICAgICAgIHN1Yi1yZXF1ZXN0cy4gSW4gdGhlc2UgY2FzZXMsIHVzZSB0aGlzIGZsYWcuPC9wPgotICAgICAgICA8L2xpPgotCi0gICAgICAgIDxsaT4nPHN0cm9uZz48Y29kZT5ub2Nhc2V8TkM8L2NvZGU+PC9zdHJvbmc+JwotICAgICAgICAoPHN0cm9uZz5uPC9zdHJvbmc+byA8c3Ryb25nPmM8L3N0cm9uZz5hc2UpPGJyIC8+Ci0gICAgICAgICBUaGlzIG1ha2VzIHRoZSA8ZW0+UGF0dGVybjwvZW0+IGNhc2UtaW5zZW5zaXRpdmUsCi0gICAgICAgIDxlbT5pLmUuPC9lbT4sIHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiAnQS1aJyBhbmQKLSAgICAgICAgJ2Eteicgd2hlbiA8ZW0+UGF0dGVybjwvZW0+IGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgY3VycmVudAotICAgICAgICBVUkwuPC9saT4KLQotICAgICAgICA8bGk+JzxzdHJvbmc+PGNvZGU+cXNhcHBlbmR8UVNBPC9jb2RlPjwvc3Ryb25nPicKLSAgICAgICAgKDxzdHJvbmc+cTwvc3Ryb25nPnVlcnkgPHN0cm9uZz5zPC9zdHJvbmc+dHJpbmcKLSAgICAgICAgPHN0cm9uZz5hPC9zdHJvbmc+cHBlbmQpPGJyIC8+Ci0gICAgICAgICBUaGlzIGZsYWcgZm9yY2VzIHRoZSByZXdyaXRpbmcgZW5naW5lIHRvIGFwcGVuZCBhIHF1ZXJ5Ci0gICAgICAgIHN0cmluZyBwYXJ0IGluIHRoZSBzdWJzdGl0dXRpb24gc3RyaW5nIHRvIHRoZSBleGlzdGluZyBvbmUKLSAgICAgICAgaW5zdGVhZCBvZiByZXBsYWNpbmcgaXQuIFVzZSB0aGlzIHdoZW4geW91IHdhbnQgdG8gYWRkIG1vcmUKLSAgICAgICAgZGF0YSB0byB0aGUgcXVlcnkgc3RyaW5nIHZpYSBhIHJld3JpdGUgcnVsZS48L2xpPgotCi0gICAgICAgIDxsaT4KLSAgICAgICAgICAnPHN0cm9uZz48Y29kZT5ub2VzY2FwZXxORTwvY29kZT48L3N0cm9uZz4nCi0gICAgICAgICAgKDxzdHJvbmc+bjwvc3Ryb25nPm8gVVJJIDxzdHJvbmc+ZTwvc3Ryb25nPnNjYXBpbmcgb2YKLSAgICAgICAgICBvdXRwdXQpPGJyIC8+Ci0gICAgICAgICAgIFRoaXMgZmxhZyBrZWVwcyBtb2RfcmV3cml0ZSBmcm9tIGFwcGx5aW5nIHRoZSB1c3VhbCBVUkkKLSAgICAgICAgICBlc2NhcGluZyBydWxlcyB0byB0aGUgcmVzdWx0IG9mIGEgcmV3cml0ZS4gT3JkaW5hcmlseSwKLSAgICAgICAgICBzcGVjaWFsIGNoYXJhY3RlcnMgKHN1Y2ggYXMgJyUnLCAnJCcsICc7JywgYW5kIHNvIG9uKQotICAgICAgICAgIHdpbGwgYmUgZXNjYXBlZCBpbnRvIHRoZWlyIGhleGNvZGUgZXF1aXZhbGVudHMgKCclMjUnLAotICAgICAgICAgICclMjQnLCBhbmQgJyUzQicsIHJlc3BlY3RpdmVseSk7IHRoaXMgZmxhZyBwcmV2ZW50cyB0aGlzCi0gICAgICAgICAgZnJvbSBiZWluZyBkb25lLiBUaGlzIGFsbG93cyBwZXJjZW50IHN5bWJvbHMgdG8gYXBwZWFyIGluCi0gICAgICAgICAgdGhlIG91dHB1dCwgYXMgaW4gCi08ZXhhbXBsZT4KLSAgICBSZXdyaXRlUnVsZSAvZm9vLyguKikgL2Jhcj9hcmc9UDFcJTNkJDEgW1IsTkVdCi08L2V4YW1wbGU+Ci0KLSAgICAgICAgICB3aGljaCB3b3VsZCB0dXJuICc8Y29kZT4vZm9vL3plZDwvY29kZT4nIGludG8gYSBzYWZlCi0gICAgICAgICAgcmVxdWVzdCBmb3IgJzxjb2RlPi9iYXI/YXJnPVAxPXplZDwvY29kZT4nLiAKLSAgICAgICAgPC9saT4KLQotICAgICAgICA8bGk+Ci0gICAgICAgICAgJzxzdHJvbmc+PGNvZGU+cGFzc3Rocm91Z2h8UFQ8L2NvZGU+PC9zdHJvbmc+JwotICAgICAgICAgICg8c3Ryb25nPnA8L3N0cm9uZz5hc3MgPHN0cm9uZz50PC9zdHJvbmc+aHJvdWdoIHRvIG5leHQKLSAgICAgICAgICBoYW5kbGVyKTxiciAvPgotICAgICAgICAgICBUaGlzIGZsYWcgZm9yY2VzIHRoZSByZXdyaXRpbmcgZW5naW5lIHRvIHNldCB0aGUKLSAgICAgICAgICA8Y29kZT51cmk8L2NvZGU+IGZpZWxkIG9mIHRoZSBpbnRlcm5hbAotICAgICAgICAgIDxjb2RlPnJlcXVlc3RfcmVjPC9jb2RlPiBzdHJ1Y3R1cmUgdG8gdGhlIHZhbHVlIG9mIHRoZQotICAgICAgICAgIDxjb2RlPmZpbGVuYW1lPC9jb2RlPiBmaWVsZC4gVGhpcyBmbGFnIGlzIGp1c3QgYSBoYWNrIHRvCi0gICAgICAgICAgYmUgYWJsZSB0byBwb3N0LXByb2Nlc3MgdGhlIG91dHB1dCBvZgotICAgICAgICAgIDxjb2RlPlJld3JpdGVSdWxlPC9jb2RlPiBkaXJlY3RpdmVzIGJ5Ci0gICAgICAgICAgPGNvZGU+QWxpYXM8L2NvZGU+LCA8Y29kZT5TY3JpcHRBbGlhczwvY29kZT4sCi0gICAgICAgICAgPGNvZGU+UmVkaXJlY3Q8L2NvZGU+LCA8ZW0+ZXRjLjwvZW0+IGRpcmVjdGl2ZXMgZnJvbQotICAgICAgICAgIG90aGVyIFVSSS10by1maWxlbmFtZSB0cmFuc2xhdG9ycy4gQSB0cml2aWFsIGV4YW1wbGUgdG8KLSAgICAgICAgICBzaG93IHRoZSBzZW1hbnRpY3M6IElmIHlvdSB3YW50IHRvIHJld3JpdGUKLSAgICAgICAgICA8Y29kZT4vYWJjPC9jb2RlPiB0byA8Y29kZT4vZGVmPC9jb2RlPiB2aWEgdGhlIHJld3JpdGluZwotICAgICAgICAgIGVuZ2luZSBvZiA8Y29kZT5tb2RfcmV3cml0ZTwvY29kZT4gYW5kIHRoZW4KLSAgICAgICAgICA8Y29kZT4vZGVmPC9jb2RlPiB0byA8Y29kZT4vZ2hpPC9jb2RlPiB3aXRoCi0gICAgICAgICAgPGNvZGU+bW9kX2FsaWFzPC9jb2RlPjogCi08ZXhhbXBsZT4KLSAgICBSZXdyaXRlUnVsZSBeL2FiYyguKikgIC9kZWYkMSBbUFRdPGJyIC8+Ci0gICAgQWxpYXMgICAgICAgL2RlZiAgICAgICAvZ2hpCi08L2V4YW1wbGU+Ci0gICAgICAgICAgSWYgeW91IG9taXQgdGhlIDxjb2RlPlBUPC9jb2RlPiBmbGFnIHRoZW4KLSAgICAgICAgICA8Y29kZT5tb2RfcmV3cml0ZTwvY29kZT4gd2lsbCBkbyBpdHMgam9iIGZpbmUsCi0gICAgICAgICAgPGVtPmkuZS48L2VtPiwgaXQgcmV3cml0ZXMgPGNvZGU+dXJpPS9hYmMvLi4uPC9jb2RlPiB0bwotICAgICAgICAgIDxjb2RlPmZpbGVuYW1lPS9kZWYvLi4uPC9jb2RlPiBhcyBhIGZ1bGwgQVBJLWNvbXBsaWFudAotICAgICAgICAgIFVSSS10by1maWxlbmFtZSB0cmFuc2xhdG9yIHNob3VsZCBkby4gVGhlbgotICAgICAgICAgIDxjb2RlPm1vZF9hbGlhczwvY29kZT4gY29tZXMgYW5kIHRyaWVzIHRvIGRvIGEKLSAgICAgICAgICBVUkktdG8tZmlsZW5hbWUgdHJhbnNpdGlvbiB3aGljaCB3aWxsIG5vdCB3b3JrLiAKLQotICAgICAgICAgIDxwPk5vdGU6IDxzdHJvbmc+WW91IGhhdmUgdG8gdXNlIHRoaXMgZmxhZyBpZiB5b3Ugd2FudCB0bwotICAgICAgICAgIGludGVybWl4IGRpcmVjdGl2ZXMgb2YgZGlmZmVyZW50IG1vZHVsZXMgd2hpY2ggY29udGFpbgotICAgICAgICAgIFVSTC10by1maWxlbmFtZSB0cmFuc2xhdG9yczwvc3Ryb25nPi4gVGhlIHR5cGljYWwgZXhhbXBsZQotICAgICAgICAgIGlzIHRoZSB1c2Ugb2YgPGNvZGU+bW9kX2FsaWFzPC9jb2RlPiBhbmQKLSAgICAgICAgICA8Y29kZT5tb2RfcmV3cml0ZTwvY29kZT4uLjwvcD4KLQotPG5vdGU+PHRpdGxlPkZvciBBcGFjaGUgaGFja2VyczwvdGl0bGU+Ci0gICAgICAgICAgICAgICBJZiB0aGUgY3VycmVudCBBcGFjaGUgQVBJIGhhZCBhIGZpbGVuYW1lLXRvLWZpbGVuYW1lCi0gICAgICAgICAgICAgIGhvb2sgYWRkaXRpb25hbGx5IHRvIHRoZSBVUkktdG8tZmlsZW5hbWUgaG9vayB0aGVuIHdlCi0gICAgICAgICAgICAgIHdvdWxkbid0IG5lZWQgdGhpcyBmbGFnISBCdXQgd2l0aG91dCBzdWNoIGEgaG9vayB0aGlzCi0gICAgICAgICAgICAgIGZsYWcgaXMgdGhlIG9ubHkgc29sdXRpb24uIFRoZSBBcGFjaGUgR3JvdXAgaGFzCi0gICAgICAgICAgICAgIGRpc2N1c3NlZCB0aGlzIHByb2JsZW0gYW5kIHdpbGwgYWRkIHN1Y2ggYSBob29rIGluCi0gICAgICAgICAgICAgIEFwYWNoZSB2ZXJzaW9uIDIuMC4KLTwvbm90ZT4KLSAgICAgICAgPC9saT4KLQotICAgICAgICA8bGk+JzxzdHJvbmc+PGNvZGU+c2tpcHxTPC9jb2RlPjwvc3Ryb25nPj08ZW0+bnVtPC9lbT4nCi0gICAgICAgICg8c3Ryb25nPnM8L3N0cm9uZz5raXAgbmV4dCBydWxlKHMpKTxiciAvPgotICAgICAgICAgVGhpcyBmbGFnIGZvcmNlcyB0aGUgcmV3cml0aW5nIGVuZ2luZSB0byBza2lwIHRoZSBuZXh0Ci0gICAgICAgIDxlbT5udW08L2VtPiBydWxlcyBpbiBzZXF1ZW5jZSB3aGVuIHRoZSBjdXJyZW50IHJ1bGUKLSAgICAgICAgbWF0Y2hlcy4gVXNlIHRoaXMgdG8gbWFrZSBwc2V1ZG8gaWYtdGhlbi1lbHNlIGNvbnN0cnVjdHM6Ci0gICAgICAgIFRoZSBsYXN0IHJ1bGUgb2YgdGhlIHRoZW4tY2xhdXNlIGJlY29tZXMKLSAgICAgICAgPGNvZGU+c2tpcD1OPC9jb2RlPiB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgcnVsZXMgaW4gdGhlCi0gICAgICAgIGVsc2UtY2xhdXNlLiAoVGhpcyBpcyA8c3Ryb25nPm5vdDwvc3Ryb25nPiB0aGUgc2FtZSBhcyB0aGUKLSAgICAgICAgJ2NoYWlufEMnIGZsYWchKTwvbGk+Ci0KLSAgICAgICAgPGxpPgotICAgICAgICAnPHN0cm9uZz48Y29kZT5lbnZ8RT08L2NvZGU+PC9zdHJvbmc+PGVtPlZBUjwvZW0+OjxlbT5WQUw8L2VtPicKLSAgICAgICAgKHNldCA8c3Ryb25nPmU8L3N0cm9uZz5udmlyb25tZW50IHZhcmlhYmxlKTxiciAvPgotICAgICAgICAgVGhpcyBmb3JjZXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZWQgPGVtPlZBUjwvZW0+IHRvCi0gICAgICAgIGJlIHNldCB0byB0aGUgdmFsdWUgPGVtPlZBTDwvZW0+LCB3aGVyZSA8ZW0+VkFMPC9lbT4gY2FuCi0gICAgICAgIGNvbnRhaW4gcmVnZXhwIGJhY2tyZWZlcmVuY2VzIDxjb2RlPiROPC9jb2RlPiBhbmQKLSAgICAgICAgPGNvZGU+JU48L2NvZGU+IHdoaWNoIHdpbGwgYmUgZXhwYW5kZWQuIFlvdSBjYW4gdXNlIHRoaXMKLSAgICAgICAgZmxhZyBtb3JlIHRoYW4gb25jZSB0byBzZXQgbW9yZSB0aGFuIG9uZSB2YXJpYWJsZS4gVGhlCi0gICAgICAgIHZhcmlhYmxlcyBjYW4gYmUgbGF0ZXIgZGVyZWZlcmVuY2VkIGluIG1hbnkgc2l0dWF0aW9ucywgYnV0Ci0gICAgICAgIHVzdWFsbHkgZnJvbSB3aXRoaW4gWFNTSSAodmlhIDxjb2RlPiZsdDshLS0jZWNobwotICAgICAgICB2YXI9IlZBUiItLSZndDs8L2NvZGU+KSBvciBDR0kgKDxlbT5lLmcuPC9lbT4KLSAgICAgICAgPGNvZGU+JEVOVnsnVkFSJ308L2NvZGU+KS4gQWRkaXRpb25hbGx5IHlvdSBjYW4gZGVyZWZlcmVuY2UKLSAgICAgICAgaXQgaW4gYSBmb2xsb3dpbmcgUmV3cml0ZUNvbmQgcGF0dGVybiB2aWEKLSAgICAgICAgPGNvZGU+JXtFTlY6VkFSfTwvY29kZT4uIFVzZSB0aGlzIHRvIHN0cmlwIGJ1dCByZW1lbWJlcgotICAgICAgICBpbmZvcm1hdGlvbiBmcm9tIFVSTHMuPC9saT4KLSAgICAgIDwvdWw+Ci0KLTxub3RlPjx0aXRsZT5Ob3RlPC90aXRsZT4gTmV2ZXIgZm9yZ2V0IHRoYXQgPGVtPlBhdHRlcm48L2VtPiBpcwotYXBwbGllZCB0byBhIGNvbXBsZXRlIFVSTCBpbiBwZXItc2VydmVyIGNvbmZpZ3VyYXRpb24KLWZpbGVzLiA8c3Ryb25nPkJ1dCBpbiBwZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24gZmlsZXMsIHRoZQotcGVyLWRpcmVjdG9yeSBwcmVmaXggKHdoaWNoIGFsd2F5cyBpcyB0aGUgc2FtZSBmb3IgYSBzcGVjaWZpYwotZGlyZWN0b3J5ISkgaXMgYXV0b21hdGljYWxseSA8ZW0+cmVtb3ZlZDwvZW0+IGZvciB0aGUgcGF0dGVybiBtYXRjaGluZwotYW5kIGF1dG9tYXRpY2FsbHkgPGVtPmFkZGVkPC9lbT4gYWZ0ZXIgdGhlIHN1YnN0aXR1dGlvbiBoYXMgYmVlbgotZG9uZS48L3N0cm9uZz4gVGhpcyBmZWF0dXJlIGlzIGVzc2VudGlhbCBmb3IgbWFueSBzb3J0cyBvZiByZXdyaXRpbmcsCi1iZWNhdXNlIHdpdGhvdXQgdGhpcyBwcmVmaXggc3RyaXBwaW5nIHlvdSBoYXZlIHRvIG1hdGNoIHRoZSBwYXJlbnQKLWRpcmVjdG9yeSB3aGljaCBpcyBub3QgYWx3YXlzIHBvc3NpYmxlLgotCi0gICAgICAgICAgICA8cD5UaGVyZSBpcyBvbmUgZXhjZXB0aW9uOiBJZiBhIHN1YnN0aXR1dGlvbiBzdHJpbmcKLSAgICAgICAgICAgIHN0YXJ0cyB3aXRoIGBgPGNvZGU+aHR0cDovLzwvY29kZT4nJyB0aGVuIHRoZSBkaXJlY3RvcnkKLSAgICAgICAgICAgIHByZWZpeCB3aWxsIDxzdHJvbmc+bm90PC9zdHJvbmc+IGJlIGFkZGVkIGFuZCBhbgotICAgICAgICAgICAgZXh0ZXJuYWwgcmVkaXJlY3Qgb3IgcHJveHkgdGhyb3VnaHB1dCAoaWYgZmxhZwotICAgICAgICAgICAgPHN0cm9uZz5QPC9zdHJvbmc+IGlzIHVzZWQhKSBpcyBmb3JjZWQhPC9wPgotPC9ub3RlPgotCi08bm90ZT48dGl0bGU+Tm90ZTwvdGl0bGU+Ci0gVG8gZW5hYmxlIHRoZSByZXdyaXRpbmcgZW5naW5lCi0gICAgICAgICAgZm9yIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiBmaWxlcyB5b3UgbmVlZCB0byBzZXQKLSAgICAgICAgICBgYDxjb2RlPlJld3JpdGVFbmdpbmUgT248L2NvZGU+JycgaW4gdGhlc2UgZmlsZXMKLSAgICAgICAgICA8c3Ryb25nPmFuZDwvc3Ryb25nPiBgYDxjb2RlPk9wdGlvbnMKLSAgICAgICAgICBGb2xsb3dTeW1MaW5rczwvY29kZT4nJyBtdXN0IGJlIGVuYWJsZWQuIElmIHlvdXIKLSAgICAgICAgICBhZG1pbmlzdHJhdG9yIGhhcyBkaXNhYmxlZCBvdmVycmlkZSBvZgotICAgICAgICAgIDxjb2RlPkZvbGxvd1N5bUxpbmtzPC9jb2RlPiBmb3IgYSB1c2VyJ3MgZGlyZWN0b3J5LCB0aGVuCi0gICAgICAgICAgeW91IGNhbm5vdCB1c2UgdGhlIHJld3JpdGluZyBlbmdpbmUuIFRoaXMgcmVzdHJpY3Rpb24gaXMKLSAgICAgICAgICBuZWVkZWQgZm9yIHNlY3VyaXR5IHJlYXNvbnMuCi08L25vdGU+Ci0KLSAgICAgIDxwPkhlcmUgYXJlIGFsbCBwb3NzaWJsZSBzdWJzdGl0dXRpb24gY29tYmluYXRpb25zIGFuZCB0aGVpcgotICAgICAgbWVhbmluZ3M6PC9wPgotCi0gICAgICA8cD48c3Ryb25nPkluc2lkZSBwZXItc2VydmVyIGNvbmZpZ3VyYXRpb24KLSAgICAgICg8Y29kZT5odHRwZC5jb25mPC9jb2RlPik8YnIgLz4KLSAgICAgICBmb3IgcmVxdWVzdCBgYDxjb2RlPkdFVAotICAgICAgL3NvbWVwYXRoL3BhdGhpbmZvPC9jb2RlPicnOjwvc3Ryb25nPjxiciAvPgotICAgICAgPC9wPgotCi0gICAgICA8dGFibGUgYmdjb2xvcj0iI0YwRjBGMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI1Ij4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD4KLTxwcmU+Ci08c3Ryb25nPkdpdmVuIFJ1bGU8L3N0cm9uZz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+UmVzdWx0aW5nIFN1YnN0aXR1dGlvbjwvc3Ryb25nPgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotXi9zb21lcGF0aCguKikgb3RoZXJwYXRoJDEgICAgICAgICAgICAgICAgICAgICAgbm90IHN1cHBvcnRlZCwgYmVjYXVzZSBpbnZhbGlkIQotCi1eL3NvbWVwYXRoKC4qKSBvdGhlcnBhdGgkMSAgW1JdICAgICAgICAgICAgICAgICBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIGludmFsaWQhCi0KLV4vc29tZXBhdGgoLiopIG90aGVycGF0aCQxICBbUF0gICAgICAgICAgICAgICAgIG5vdCBzdXBwb3J0ZWQsIGJlY2F1c2UgaW52YWxpZCEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLV4vc29tZXBhdGgoLiopIC9vdGhlcnBhdGgkMSAgICAgICAgICAgICAgICAgICAgIC9vdGhlcnBhdGgvcGF0aGluZm8KLQotXi9zb21lcGF0aCguKikgL290aGVycGF0aCQxIFtSXSAgICAgICAgICAgICAgICAgaHR0cDovL3RoaXNob3N0L290aGVycGF0aC9wYXRoaW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlhIGV4dGVybmFsIHJlZGlyZWN0aW9uCi0KLV4vc29tZXBhdGgoLiopIC9vdGhlcnBhdGgkMSBbUF0gICAgICAgICAgICAgICAgIG5vdCBzdXBwb3J0ZWQsIGJlY2F1c2Ugc2lsbHkhCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1eL3NvbWVwYXRoKC4qKSBodHRwOi8vdGhpc2hvc3Qvb3RoZXJwYXRoJDEgICAgICAvb3RoZXJwYXRoL3BhdGhpbmZvCi0KLV4vc29tZXBhdGgoLiopIGh0dHA6Ly90aGlzaG9zdC9vdGhlcnBhdGgkMSBbUl0gIGh0dHA6Ly90aGlzaG9zdC9vdGhlcnBhdGgvcGF0aGluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYSBleHRlcm5hbCByZWRpcmVjdGlvbgotCi1eL3NvbWVwYXRoKC4qKSBodHRwOi8vdGhpc2hvc3Qvb3RoZXJwYXRoJDEgW1BdICBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIHNpbGx5IQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotXi9zb21lcGF0aCguKikgaHR0cDovL290aGVyaG9zdC9vdGhlcnBhdGgkMSAgICAgaHR0cDovL290aGVyaG9zdC9vdGhlcnBhdGgvcGF0aGluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYSBleHRlcm5hbCByZWRpcmVjdGlvbgotCi1eL3NvbWVwYXRoKC4qKSBodHRwOi8vb3RoZXJob3N0L290aGVycGF0aCQxIFtSXSBodHRwOi8vb3RoZXJob3N0L290aGVycGF0aC9wYXRoaW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlhIGV4dGVybmFsIHJlZGlyZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhlIFtSXSBmbGFnIGlzIHJlZHVuZGFudCkKLQotXi9zb21lcGF0aCguKikgaHR0cDovL290aGVyaG9zdC9vdGhlcnBhdGgkMSBbUF0gaHR0cDovL290aGVyaG9zdC9vdGhlcnBhdGgvcGF0aGluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYSBpbnRlcm5hbCBwcm94eQotPC9wcmU+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0KLSAgICAgIDxwPjxzdHJvbmc+SW5zaWRlIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiBmb3IKLSAgICAgIDxjb2RlPi9zb21lcGF0aDwvY29kZT48YnIgLz4KLSAgICAgICAoPGVtPmkuZS48L2VtPiwgZmlsZSA8Y29kZT4uaHRhY2Nlc3M8L2NvZGU+IGluIGRpcgotICAgICAgPGNvZGU+L3BoeXNpY2FsL3BhdGgvdG8vc29tZXBhdGg8L2NvZGU+IGNvbnRhaW5pbmcKLSAgICAgIDxjb2RlPlJld3JpdGVCYXNlIC9zb21lcGF0aDwvY29kZT4pPGJyIC8+Ci0gICAgICAgZm9yIHJlcXVlc3QgYGA8Y29kZT5HRVQKLSAgICAgIC9zb21lcGF0aC9sb2NhbHBhdGgvcGF0aGluZm88L2NvZGU+Jyc6PC9zdHJvbmc+PGJyIC8+IAotICAgICA8L3A+Ci0KLSAgICAgIDx0YWJsZSBiZ2NvbG9yPSIjRjBGMEYwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjUiPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkPgotPHByZT4KLTxzdHJvbmc+R2l2ZW4gUnVsZTwvc3Ryb25nPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5SZXN1bHRpbmcgU3Vic3RpdHV0aW9uPC9zdHJvbmc+Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1ebG9jYWxwYXRoKC4qKSBvdGhlcnBhdGgkMSAgICAgICAgICAgICAgICAgICAgICAvc29tZXBhdGgvb3RoZXJwYXRoL3BhdGhpbmZvCi0KLV5sb2NhbHBhdGgoLiopIG90aGVycGF0aCQxICBbUl0gICAgICAgICAgICAgICAgIGh0dHA6Ly90aGlzaG9zdC9zb21lcGF0aC9vdGhlcnBhdGgvcGF0aGluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYSBleHRlcm5hbCByZWRpcmVjdGlvbgotCi1ebG9jYWxwYXRoKC4qKSBvdGhlcnBhdGgkMSAgW1BdICAgICAgICAgICAgICAgICBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIHNpbGx5IQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotXmxvY2FscGF0aCguKikgL290aGVycGF0aCQxICAgICAgICAgICAgICAgICAgICAgL290aGVycGF0aC9wYXRoaW5mbwotCi1ebG9jYWxwYXRoKC4qKSAvb3RoZXJwYXRoJDEgW1JdICAgICAgICAgICAgICAgICBodHRwOi8vdGhpc2hvc3Qvb3RoZXJwYXRoL3BhdGhpbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWEgZXh0ZXJuYWwgcmVkaXJlY3Rpb24KLQotXmxvY2FscGF0aCguKikgL290aGVycGF0aCQxIFtQXSAgICAgICAgICAgICAgICAgbm90IHN1cHBvcnRlZCwgYmVjYXVzZSBzaWxseSEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLV5sb2NhbHBhdGgoLiopIGh0dHA6Ly90aGlzaG9zdC9vdGhlcnBhdGgkMSAgICAgIC9vdGhlcnBhdGgvcGF0aGluZm8KLQotXmxvY2FscGF0aCguKikgaHR0cDovL3RoaXNob3N0L290aGVycGF0aCQxIFtSXSAgaHR0cDovL3RoaXNob3N0L290aGVycGF0aC9wYXRoaW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlhIGV4dGVybmFsIHJlZGlyZWN0aW9uCi0KLV5sb2NhbHBhdGgoLiopIGh0dHA6Ly90aGlzaG9zdC9vdGhlcnBhdGgkMSBbUF0gIG5vdCBzdXBwb3J0ZWQsIGJlY2F1c2Ugc2lsbHkhCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1ebG9jYWxwYXRoKC4qKSBodHRwOi8vb3RoZXJob3N0L290aGVycGF0aCQxICAgICBodHRwOi8vb3RoZXJob3N0L290aGVycGF0aC9wYXRoaW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlhIGV4dGVybmFsIHJlZGlyZWN0aW9uCi0KLV5sb2NhbHBhdGgoLiopIGh0dHA6Ly9vdGhlcmhvc3Qvb3RoZXJwYXRoJDEgW1JdIGh0dHA6Ly9vdGhlcmhvc3Qvb3RoZXJwYXRoL3BhdGhpbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWEgZXh0ZXJuYWwgcmVkaXJlY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGUgW1JdIGZsYWcgaXMgcmVkdW5kYW50KQotCi1ebG9jYWxwYXRoKC4qKSBodHRwOi8vb3RoZXJob3N0L290aGVycGF0aCQxIFtQXSBodHRwOi8vb3RoZXJob3N0L290aGVycGF0aC9wYXRoaW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlhIGludGVybmFsIHByb3h5Ci08L3ByZT4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KLQotICAgICAgPHA+PHN0cm9uZz5FeGFtcGxlOjwvc3Ryb25nPjwvcD4KLQotICAgICAgPHA+V2Ugd2FudCB0byByZXdyaXRlIFVSTHMgb2YgdGhlIGZvcm0gPC9wPgotCi0gICAgICAgIDxibG9ja3F1b3RlPgotICAgICAgICAgIDxjb2RlPi88L2NvZGU+IDxlbT5MYW5ndWFnZTwvZW0+IDxjb2RlPi9+PC9jb2RlPgotICAgICAgICAgIDxlbT5SZWFsbmFtZTwvZW0+IDxjb2RlPi8uLi4vPC9jb2RlPiA8ZW0+RmlsZTwvZW0+Ci0gICAgICAgIDwvYmxvY2txdW90ZT4KLSAgICAgICAgaW50byAKLQotICAgICAgICA8YmxvY2txdW90ZT4KLSAgICAgICAgICA8Y29kZT4vdS88L2NvZGU+IDxlbT5Vc2VybmFtZTwvZW0+IDxjb2RlPi8uLi4vPC9jb2RlPgotICAgICAgICAgIDxlbT5GaWxlPC9lbT4gPGNvZGU+LjwvY29kZT4gPGVtPkxhbmd1YWdlPC9lbT4KLSAgICAgICAgPC9ibG9ja3F1b3RlPgotCi0gICAgICAgIDxwPldlIHRha2UgdGhlIHJld3JpdGUgbWFwZmlsZSBmcm9tIGFib3ZlIGFuZCBzYXZlIGl0IHVuZGVyCi0gICAgICAgIDxjb2RlPi9wYXRoL3RvL2ZpbGUvbWFwLnR4dDwvY29kZT4uIFRoZW4gd2Ugb25seSBoYXZlIHRvCi0gICAgICAgIGFkZCB0aGUgZm9sbG93aW5nIGxpbmVzIHRvIHRoZSBBcGFjaGUgc2VydmVyIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgZmlsZTo8L3A+Ci0KLTxleGFtcGxlPgotPHByZT4KLVJld3JpdGVMb2cgICAvcGF0aC90by9maWxlL3Jld3JpdGUubG9nCi1SZXdyaXRlTWFwICAgcmVhbC10by11c2VyICAgICAgICAgICAgICAgdHh0Oi9wYXRoL3RvL2ZpbGUvbWFwLnR4dAotUmV3cml0ZVJ1bGUgIF4vKFteL10rKS9+KFteL10rKS8oLiopJCAgIC91LyR7cmVhbC10by11c2VyOiQyfG5vYm9keX0vJDMuJDEKLTwvcHJlPgotPC9leGFtcGxlPgotCi08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPC9tb2R1bGVzeW5vcHNpcz4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9zZXRlbnZpZi5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9zZXRlbnZpZi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDg5ZmEzLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2Rfc2V0ZW52aWYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLSA8SEVBRD4KLSAgPFRJVExFPkFwYWNoZSBtb2R1bGUgbW9kX3NldGVudmlmPC9USVRMRT4KLSA8L0hFQUQ+Ci08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci0gPEJPRFkKLSAgQkdDT0xPUj0iI0ZGRkZGRiIKLSAgVEVYVD0iIzAwMDAwMCIKLSAgTElOSz0iIzAwMDBGRiIKLSAgVkxJTks9IiMwMDAwODAiCi0gIEFMSU5LPSIjRkYwMDAwIgotID4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci0gIDxIMSBBTElHTj0iQ0VOVEVSIj5Nb2R1bGUgbW9kX3NldGVudmlmPC9IMT4KLSAgPFA+Ci0gIFRoaXMgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbiB0aGUgPFNBTVA+bW9kX3NldGVudmlmLmM8L1NBTVA+IGZpbGUsIGFuZAotICA8U1RST05HPmlzPC9TVFJPTkc+IGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuIEl0IHByb3ZpZGVzIGZvcgotICB0aGUgYWJpbGl0eSB0byBzZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJhc2VkIHVwb24gYXR0cmlidXRlcyBvZiB0aGUKLSAgcmVxdWVzdC4KLSAgPC9QPgotICA8SDI+U3VtbWFyeTwvSDI+Ci0gIDxQPgotICBUaGUgPFNBTVA+bW9kX3NldGVudmlmPC9TQU1QPiBtb2R1bGUgYWxsb3dzIHlvdSB0byBzZXQgZW52aXJvbm1lbnQKLSAgdmFyaWFibGVzIGFjY29yZGluZyB0byB3aGV0aGVyIGRpZmZlcmVudCBhc3BlY3RzIG9mIHRoZSByZXF1ZXN0IG1hdGNoCi0gIHJlZ3VsYXIgZXhwcmVzc2lvbnMgeW91IHNwZWNpZnkuICBUaGVzZSBlbnZhcmlhYmxlcyBjYW4gYmUgdXNlZCBieQotICBvdGhlciBwYXJ0cyBvZiB0aGUgc2VydmVyIHRvIG1ha2UgZGVjaXNpb25zIGFib3V0IGFjdGlvbnMgdG8gYmUgdGFrZW4uCi0gIDwvUD4KLSAgPEgyPkRpcmVjdGl2ZXM8L0gyPgotICA8VUw+Ci0gICA8TEk+PEEgSFJFRj0iI0Jyb3dzZXJNYXRjaCI+QnJvd3Nlck1hdGNoPC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjQnJvd3Nlck1hdGNoTm9DYXNlIj5Ccm93c2VyTWF0Y2hOb0Nhc2U8L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNTZXRFbnZJZiI+U2V0RW52SWY8L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNTZXRFbnZJZk5vQ2FzZSI+U2V0RW52SWZOb0Nhc2U8L0E+Ci0gICA8L0xJPgotICA8L1VMPgotCi0gIDxIUj4gPCEtLSB0aGUgSFIgaXMgcGFydCBvZiB0aGUgZGlyZWN0aXZlIGRlc2NyaXB0aW9uIC0tPgotICA8SDI+PEEgTkFNRT0iQnJvd3Nlck1hdGNoIj5UaGUgPFNBTVA+QnJvd3Nlck1hdGNoPC9TQU1QPiBEaXJlY3RpdmU8L0E+PC9IMj4KLSAgPFA+Ci0gIDxTVFJPTkc+U3ludGF4OjwvU1RST05HPiBCcm93c2VyTWF0Y2ggPEVNPnJlZ2V4IGVudmFyWz12YWx1ZV0gWy4uLl08L0VNPgotICA8QlI+Ci0gIDxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz4gPEVNPm5vbmU8L0VNPgotICA8QlI+Ci0gIDxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz4gc2VydmVyIGNvbmZpZwotICA8QlI+Ci0gIDxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+IDxFTT5ub25lPC9FTT4KLSAgPEJSPgotICA8U1RST05HPlN0YXR1czo8L1NUUk9ORz4gQmFzZQotICA8QlI+Ci0gIDxTVFJPTkc+TW9kdWxlOjwvU1RST05HPiBtb2Rfc2V0ZW52aWYKLSAgPEJSPgotICA8U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+IEFwYWNoZSAxLjIgYW5kIGFib3ZlCi0gIDwvUD4KLSAgPFA+Ci0gIFRoZSBCcm93c2VyTWF0Y2ggZGlyZWN0aXZlIGRlZmluZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJhc2VkIG9uIHRoZQotICA8U0FNUD5Vc2VyLUFnZW50PC9TQU1QPiBIVFRQIHJlcXVlc3QgaGVhZGVyIGZpZWxkLiBUaGUgZmlyc3QgYXJndW1lbnQKLSAgc2hvdWxkIGJlIGEgUE9TSVguMiBleHRlbmRlZCByZWd1bGFyIGV4cHJlc3Npb24gKHNpbWlsYXIgdG8gYW4KLSAgPFNBTVA+ZWdyZXA8L1NBTVA+LXN0eWxlIHJlZ2V4KS4gIFRoZSByZXN0IG9mIHRoZSBhcmd1bWVudHMgZ2l2ZSB0aGUKLSAgbmFtZXMgb2YgdmFyaWFibGVzIHRvIHNldCwgYW5kIG9wdGlvbmFsbHkgdmFsdWVzIHRvIHdoaWNoIHRoZXkgc2hvdWxkCi0gIGJlIHNldC4gVGhlc2UgdGFrZSB0aGUgZm9ybSBvZgotICA8L1A+Ci0gIDxPTD4KLSAgIDxMST48U0FNUD48RU0+dmFybmFtZTwvRU0+PC9TQU1QPiwgb3IKLSAgIDwvTEk+Ci0gICA8TEk+PFNBTVA+ITxFTT52YXJuYW1lPC9FTT48L1NBTVA+LCBvcgotICAgPC9MST4KLSAgIDxMST48U0FNUD48RU0+dmFybmFtZTwvRU0+PTxFTT52YWx1ZTwvRU0+PC9TQU1QPgotICAgPC9MST4KLSAgPC9PTD4KLSAgPFA+Ci0gIEluIHRoZSBmaXJzdCBmb3JtLCB0aGUgdmFsdWUgd2lsbCBiZSBzZXQgdG8gJnF1b3Q7MSZxdW90Oy4gVGhlIHNlY29uZAotICB3aWxsIHJlbW92ZSB0aGUgZ2l2ZW4gdmFyaWFibGUgaWYgYWxyZWFkeSBkZWZpbmVkLCBhbmQgdGhlIHRoaXJkIHdpbGwKLSAgc2V0IHRoZSB2YXJpYWJsZSB0byB0aGUgdmFsdWUgZ2l2ZW4gYnkgPFNBTVA+PEVNPnZhbHVlPC9FTT48L1NBTVA+LiBJZiBhCi0gIDxTQU1QPlVzZXItQWdlbnQ8L1NBTVA+IHN0cmluZyBtYXRjaGVzIG1vcmUgdGhhbiBvbmUgZW50cnksIHRoZXkgd2lsbAotICBiZSBtZXJnZWQuICBFbnRyaWVzIGFyZSBwcm9jZXNzZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyLAotICBhbmQgbGF0ZXIgZW50cmllcyBjYW4gb3ZlcnJpZGUgZWFybGllciBvbmVzLgotICA8L1A+Ci0gIDxQPgotICBGb3IgZXhhbXBsZToKLSAgPC9QPgotICA8UFJFPgotICAgIEJyb3dzZXJNYXRjaCBeTW96aWxsYSBmb3JtcyBqcGVnPXllcyBicm93c2VyPW5ldHNjYXBlCi0gICAgQnJvd3Nlck1hdGNoICJeTW96aWxsYS9bMi0zXSIgdGFibGVzIGFnaWYgZnJhbWVzIGphdmFzY3JpcHQKLSAgICBCcm93c2VyTWF0Y2ggTVNJRSAhamF2YXNjcmlwdAotICA8L1BSRT4KLSAgPFA+Ci0gIE5vdGUgdGhhdCB0aGUgcmVndWxhciBleHByZXNzaW9uIHN0cmluZyBpcwotICA8U1RST05HPmNhc2Utc2Vuc2l0aXZlPC9TVFJPTkc+LiAgRm9yIGNhbmUtSU5zZW5zaXRpdmUgbWF0Y2hpbmcsIHNlZQotICB0aGUKLSAgPEEKLSAgIEhSRUY9IiNCcm93c2VyTWF0Y2hOb0Nhc2UiCi0gID48U0FNUD5Ccm93c2VyTWF0Y2hOb0Nhc2U8L1NBTVA+PC9BPgotICBkaXJlY3RpdmUuCi0gIDwvUD4KLSAgPFA+Ci0gIFRoZSA8U0FNUD5Ccm93c2VyTWF0Y2g8L1NBTVA+IGFuZCA8U0FNUD5Ccm93c2VyTWF0Y2hOb0Nhc2U8L1NBTVA+Ci0gIGRpcmVjdGl2ZXMgYXJlIHNwZWNpYWwgY2FzZXMgb2YgdGhlCi0gIDxBCi0gICBIUkVGPSIjU2V0RW52SWYiCi0gID48U0FNUD5TZXRFbnZJZjwvU0FNUD48L0E+Ci0gIGFuZAotICA8QQotICAgSFJFRj0iI1NldEVudklmTm9DYXNlIgotICA+PFNBTVA+U2V0RW52SWZOb0Nhc2U8L1NBTVA+PC9BPgotICBkaXJlY3RpdmVzLiAgVGhlIGZvbGxvd2luZyB0d28gbGluZXMgaGF2ZSB0aGUgc2FtZSBlZmZlY3Q6Ci0gIDwvUD4KLSAgPFBSRT4KLSAgIEJyb3dzZXJNYXRjaE5vQ2FzZSBSb2JvdCBpc19hX3JvYm90Ci0gICBTZXRFbnZJZk5vQ2FzZSBVc2VyLUFnZW50IFJvYm90IGlzX2Ffcm9ib3QKLSAgPC9QUkU+Ci0KLSAgPEhSPiA8IS0tIHRoZSBIUiBpcyBwYXJ0IG9mIHRoZSBkaXJlY3RpdmUgZGVzY3JpcHRpb24gLS0+Ci0gIDxIMj4KLSAgIDxBIE5BTUU9IkJyb3dzZXJNYXRjaE5vQ2FzZSI+Ci0gICAgVGhlIDxTQU1QPkJyb3dzZXJNYXRjaE5vQ2FzZTwvU0FNUD4gRGlyZWN0aXZlCi0gICA8L0E+Ci0gIDwvSDI+Ci0gIDxQPgotICA8U1RST05HPlN5bnRheDo8L1NUUk9ORz4gQnJvd3Nlck1hdGNoTm9DYXNlIDxFTT5yZWdleCBlbnZhcls9dmFsdWVdIFsuLi5dPC9FTT4KLSAgPEJSPgotICA8U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+IDxFTT5ub25lPC9FTT4KLSAgPEJSPgotICA8U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+IHNlcnZlciBjb25maWcKLSAgPEJSPgotICA8U1RST05HPk92ZXJyaWRlOjwvU1RST05HPiA8RU0+bm9uZTwvRU0+Ci0gIDxCUj4KLSAgPFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+IEJhc2UKLSAgPEJSPgotICA8U1RST05HPk1vZHVsZTo8L1NUUk9ORz4gbW9kX3NldGVudmlmCi0gIDxCUj4KLSAgPFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPiBBcGFjaGUgMS4yIGFuZCBhYm92ZQotICA8L1A+Ci0gIDxQPgotICBUaGUgPFNBTVA+QnJvd3Nlck1hdGNoTm9DYXNlPC9TQU1QPiBkaXJlY3RpdmUgaXMgc2VtYW50aWNhbGx5IGlkZW50aWNhbCB0bwotICB0aGUKLSAgPEEKLSAgIEhSRUY9IiNCcm93c2VyTWF0Y2giCi0gID48U0FNUD5Ccm93c2VyTWF0Y2g8L1NBTVA+PC9BPgotICBkaXJlY3RpdmUuIEhvd2V2ZXIsIGl0IHByb3ZpZGVzIGZvciBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nLiBGb3IKLSAgZXhhbXBsZToKLSAgPC9QPgotICA8UFJFPgotICAgIEJyb3dzZXJNYXRjaE5vQ2FzZSBtYWMgcGxhdGZvcm09bWFjaW50b3NoCi0gICAgQnJvd3Nlck1hdGNoTm9DYXNlIHdpbiBwbGF0Zm9ybT13aW5kb3dzCi0gIDwvUFJFPgotICA8UD4KLSAgVGhlIDxTQU1QPkJyb3dzZXJNYXRjaDwvU0FNUD4gYW5kIDxTQU1QPkJyb3dzZXJNYXRjaE5vQ2FzZTwvU0FNUD4KLSAgZGlyZWN0aXZlcyBhcmUgc3BlY2lhbCBjYXNlcyBvZiB0aGUKLSAgPEEKLSAgIEhSRUY9IiNTZXRFbnZJZiIKLSAgPjxTQU1QPlNldEVudklmPC9TQU1QPjwvQT4KLSAgYW5kCi0gIDxBCi0gICBIUkVGPSIjU2V0RW52SWZOb0Nhc2UiCi0gID48U0FNUD5TZXRFbnZJZk5vQ2FzZTwvU0FNUD48L0E+Ci0gIGRpcmVjdGl2ZXMuICBUaGUgZm9sbG93aW5nIHR3byBsaW5lcyBoYXZlIHRoZSBzYW1lIGVmZmVjdDoKLSAgPC9QPgotICA8UFJFPgotICAgQnJvd3Nlck1hdGNoTm9DYXNlIFJvYm90IGlzX2Ffcm9ib3QKLSAgIFNldEVudklmTm9DYXNlIFVzZXItQWdlbnQgUm9ib3QgaXNfYV9yb2JvdAotICA8L1BSRT4KLQotICA8SFI+IDwhLS0gdGhlIEhSIGlzIHBhcnQgb2YgdGhlIGRpcmVjdGl2ZSBkZXNjcmlwdGlvbiAtLT4KLSAgPEgyPgotICAgPEEgTkFNRT0iU2V0RW52SWYiPgotICAgIFRoZSA8U0FNUD5TZXRFbnZJZjwvU0FNUD4gRGlyZWN0aXZlCi0gICA8L0E+Ci0gIDwvSDI+Ci0gIDxQPgotICA8U1RST05HPlN5bnRheDo8L1NUUk9ORz4gU2V0RW52SWYgPEVNPiBhdHRyaWJ1dGUgcmVnZXggZW52YXJbPXZhbHVlXSBbLi4uXTwvRU0+Ci0gIDxCUj4KLSAgPFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPiA8RU0+bm9uZTwvRU0+Ci0gIDxCUj4KLSAgPFNUUk9ORz5Db250ZXh0OjwvU1RST05HPiBzZXJ2ZXIgY29uZmlnCi0gIDxCUj4KLSAgPFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz4gPEVNPm5vbmU8L0VNPgotICA8QlI+Ci0gIDxTVFJPTkc+U3RhdHVzOjwvU1RST05HPiBCYXNlCi0gIDxCUj4KLSAgPFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+IG1vZF9zZXRlbnZpZgotICA8QlI+Ci0gIDxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz4gQXBhY2hlIDEuMyBhbmQgYWJvdmUKLSAgPC9QPgotICA8UD4KLSAgVGhlIDxTQU1QPlNldEVudklmPC9TQU1QPiBkaXJlY3RpdmUgZGVmaW5lcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLSAgYmFzZWQgb24gYXR0cmlidXRlcyBvZiB0aGUgcmVxdWVzdC4gIFRoZXNlIGF0dHJpYnV0ZXMgY2FuIGJlIHRoZQotICB2YWx1ZXMgb2YgdmFyaW91cyBIVFRQIHJlcXVlc3QgaGVhZGVyIGZpZWxkcyAoc2VlCi0gIDxBCi0gICBIUkVGPSJodHRwOi8vZHMuaW50ZXJuaWMubmV0L3JmYy9yZmMyMDY4LnR4dCIKLSAgPlJGQzIwNjg8L0E+Ci0gIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZXNlKSwgb3Igb2Ygb3RoZXIgYXNwZWN0cyBvZiB0aGUgcmVxdWVzdCwKLSAgaW5jbHVkaW5nIHRoZSBmb2xsb3dpbmc6Ci0gIDwvUD4KLSAgPFVMPgotICAgPExJPjxTQU1QPlJlbW90ZV9Ib3N0PC9TQU1QPiAtIHRoZSBob3N0bmFtZSAoaWYgYXZhaWxhYmxlKSBvZiB0aGUKLSAgICBjbGllbnQgbWFraW5nIHRoZSByZXF1ZXN0Ci0gICA8L0xJPgotICAgPExJPjxTQU1QPlJlbW90ZV9BZGRyPC9TQU1QPiAtIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBjbGllbnQgbWFraW5nCi0gICAgdGhlIHJlcXVlc3QKLSAgIDwvTEk+Ci0gICA8TEk+PFNBTVA+UmVtb3RlX1VzZXI8L1NBTVA+IC0gdGhlIGF1dGhlbnRpY2F0ZWQgdXNlcm5hbWUgKGlmCi0gICAgYXZhaWxhYmxlKQotICAgPC9MST4KLSAgIDxMST48U0FNUD5SZXF1ZXN0X01ldGhvZDwvU0FNUD4gLSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGJlaW5nIHVzZWQKLSAgICAoPFNBTVA+R0VUPC9TQU1QPiwgPFNBTVA+UE9TVDwvU0FNUD4sIDxFTT5ldCBjZXRlcmE8L0VNPikKLSAgIDwvTEk+Ci0gICA8TEk+PFNBTVA+UmVxdWVzdF9VUkk8L1NBTVA+IC0gdGhlIHBvcnRpb24gb2YgdGhlIFVSTCBmb2xsb3dpbmcgdGhlCi0gICAgc2NoZW1lIGFuZCBob3N0IHBvcnRpb24KLSAgIDwvTEk+Ci0gIDwvVUw+Ci0gIDxQPgotICBTb21lIG9mIHRoZSBtb3JlIGNvbW1vbmx5IHVzZWQgcmVxdWVzdCBoZWFkZXIgZmllbGQgbmFtZXMgaW5jbHVkZQotICA8U0FNUD5Ib3N0PC9TQU1QPiwgPFNBTVA+VXNlci1BZ2VudDwvU0FNUD4sIGFuZCA8U0FNUD5SZWZlcmVyPC9TQU1QPi4KLSAgPC9QPgotICA8UD4KLSAgRXhhbXBsZToKLSAgPC9QPgotICA8UFJFPgotICAgU2V0RW52SWYgUmVxdWVzdF9VUkkgIlwuKGdpZil8KGpwZyl8KHhibSkkIiBvYmplY3RfaXNfaW1hZ2UKLSAgIFNldEVudklmIFJlZmVyZXIgd3d3XC5teWRvbWFpblwuY29tIGludHJhX3NpdGVfcmVmZXJyYWwKLSAgPC9QUkU+Ci0gIDxQPgotICBUaGUgZmlyc3Qgd2lsbCBzZXQgdGhlIGVudmFyaWFibGUgPFNBTVA+b2JqZWN0X2lzX2ltYWdlPC9TQU1QPiBpZiB0aGUKLSAgcmVxdWVzdCB3YXMgZm9yIGFuIGltYWdlIGZpbGUsIGFuZCB0aGUgc2Vjb25kIHNldHMKLSAgPFNBTVA+aW50cmFfc2l0ZV9yZWZlcnJhbDwvU0FNUD4gaWYgdGhlIHJlZmVycmluZyBwYWdlIHdhcyBzb21ld2hlcmUKLSAgb24gdGhlIDxTQU1QPnd3dy5teWRvbWFpbi5jb208L1NBTVA+IFdlYiBzaXRlLgotICA8L1A+Ci0KLSAgPEhSPiA8IS0tIHRoZSBIUiBpcyBwYXJ0IG9mIHRoZSBkaXJlY3RpdmUgZGVzY3JpcHRpb24gLS0+Ci0gIDxIMj4KLSAgIDxBIE5BTUU9IlNldEVudklmTm9DYXNlIj4KLSAgICBUaGUgPFNBTVA+U2V0RW52SWZOb0Nhc2U8L1NBTVA+IERpcmVjdGl2ZQotICAgPC9BPgotICA8L0gyPgotICA8UD4KLSAgPFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+IFNldEVudklmTm9DYXNlCi0gICA8RU0+IGF0dHJpYnV0ZSByZWdleCBlbnZhcls9dmFsdWVdIFsuLi5dPC9FTT4KLSAgPEJSPgotICA8U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+IDxFTT5ub25lPC9FTT4KLSAgPEJSPgotICA8U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+IHNlcnZlciBjb25maWcKLSAgPEJSPgotICA8U1RST05HPk92ZXJyaWRlOjwvU1RST05HPiA8RU0+bm9uZTwvRU0+Ci0gIDxCUj4KLSAgPFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+IEJhc2UKLSAgPEJSPgotICA8U1RST05HPk1vZHVsZTo8L1NUUk9ORz4gbW9kX3NldGVudmlmCi0gIDxCUj4KLSAgPFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPiBBcGFjaGUgMS4zIGFuZCBhYm92ZQotICA8L1A+Ci0gIDxQPgotICBUaGUgPFNBTVA+U2V0RW52SWZOb0Nhc2U8L1NBTVA+IGlzIHNlbWFudGljYWxseSBpZGVudGljYWwgdG8gdGhlCi0gIDxBCi0gICBIUkVGPSIjU2V0RW52SWYiCi0gID48U0FNUD5TZXRFbnZJZjwvU0FNUD48L0E+Ci0gIGRpcmVjdGl2ZSwgYW5kIGRpZmZlcnMgb25seSBpbiB0aGF0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgaXMKLSAgcGVyZm9ybWVkIGluIGEgY2FzZS1pbnNlbnNpdGl2ZSBtYW5uZXIuIEZvciBleGFtcGxlOgotICA8L1A+Ci0gIDxQUkU+Ci0gICBTZXRFbnZJZk5vQ2FzZSBIb3N0IEFwYWNoZVwuT3JnIHNpdGU9YXBhY2hlCi0gIDwvUFJFPgotICA8UD4KLSAgVGhpcyB3aWxsIGNhdXNlIHRoZSA8U0FNUD5zaXRlPC9TQU1QPiBlbnZhcmlhYmxlIHRvIGJlIHNldCB0bwotICAmcXVvdDs8U0FNUD5hcGFjaGU8L1NBTVA+JnF1b3Q7IGlmIHRoZSBIVFRQIHJlcXVlc3QgaGVhZGVyIGZpZWxkCi0gIDxTQU1QPkhvc3Q6PC9TQU1QPiB3YXMgaW5jbHVkZWQgYW5kIGNvbnRhaW5lZCA8U0FNUD5BcGFjaGUuT3JnPC9TQU1QPiwKLSAgPFNBTVA+YXBhY2hlLm9yZzwvU0FNUD4sIG9yIGFueSBvdGhlciBjb21iaW5hdGlvbi4KLSAgPC9QPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotIDwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2Rfc2V0ZW52aWYueG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9zZXRlbnZpZi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYmM0ZGQuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9zZXRlbnZpZi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveHNsIiBocmVmPSIuLi9zdHlsZS9tYW51YWwueHNsIj8+Ci08bW9kdWxlc3lub3BzaXM+Ci0KLTxuYW1lPm1vZF9zZXRlbnZpZjwvbmFtZT4KLTxzdGF0dXM+QmFzZTwvc3RhdHVzPgotPGlkZW50aWZpZXI+c2V0ZW52aWZfbW9kdWxlPC9pZGVudGlmaWVyPgotPHNvdXJjZWZpbGU+bW9kX3NldGVudmlmLmM8L3NvdXJjZWZpbGU+Ci08Y29tcGF0aWJpbGl0eT5BdmFpbGFibGUgaW4gQXBhY2hlIDEuMyBhbmQgbGF0ZXI8L2NvbXBhdGliaWxpdHk+Ci0KLTxkZXNjcmlwdGlvbj5BbGxvd3MgdGhlIHNldHRpbmcgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJhc2VkCi1vbiBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHJlcXVlc3Q8L2Rlc2NyaXB0aW9uPgotCi08c3VtbWFyeT4KLQotICAgIDxwPlRoZSA8bW9kdWxlPm1vZF9zZXRlbnZpZjwvbW9kdWxlPiBtb2R1bGUgYWxsb3dzIHlvdSB0byBzZXQKLSAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYWNjb3JkaW5nIHRvIHdoZXRoZXIgZGlmZmVyZW50IGFzcGVjdHMgb2YKLSAgICB0aGUgcmVxdWVzdCBtYXRjaCByZWd1bGFyIGV4cHJlc3Npb25zIHlvdSBzcGVjaWZ5LiBUaGVzZQotICAgIGVudmlyb25tZW50IHZhcmlhYmxlcyBjYW4gYmUgdXNlZCBieSBvdGhlciBwYXJ0cyBvZiB0aGUgc2VydmVyCi0gICAgdG8gbWFrZSBkZWNpc2lvbnMgYWJvdXQgYWN0aW9ucyB0byBiZSB0YWtlbi48L3A+Ci0KLSAgICA8cD5UaGUgZGlyZWN0aXZlcyBhcmUgY29uc2lkZXJlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4KLSAgICB0aGUgY29uZmlndXJhdGlvbiBmaWxlcy4gU28gbW9yZSBjb21wbGV4IHNlcXVlbmNlcyBjYW4gYmUgdXNlZCwKLSAgICBzdWNoIGFzIHRoaXMgZXhhbXBsZSwgd2hpY2ggc2V0cyA8Y29kZT5uZXRzY2FwZTwvY29kZT4gaWYgdGhlCi0gICAgYnJvd3NlciBpcyBtb3ppbGxhIGJ1dCBub3QgTVNJRS48L3A+Ci0KLTxleGFtcGxlPgotICBCcm93c2VyTWF0Y2ggXk1vemlsbGEgbmV0c2NhcGU8YnIgLz4KLSAgQnJvd3Nlck1hdGNoIE1TSUUgIW5ldHNjYXBlPGJyIC8+Ci08L2V4YW1wbGU+Ci08L3N1bW1hcnk+Ci0KLTxzZWVhbHNvPjxhIGhyZWY9Ii4uL2Vudi5odG1sIj5FbnZpcm9ubWVudCBWYXJpYWJsZXMgaW4gQXBhY2hlPC9hPjwvc2VlYWxzbz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+QnJvd3Nlck1hdGNoPC9uYW1lPgotPGRlc2NyaXB0aW9uPlNldHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGNvbmRpdGlvbmFsIG9uIEhUVFAgVXNlci1BZ2VudAotPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+QnJvd3Nlck1hdGNoIDxlbT5yZWdleCBlbnYtdmFyaWFibGU8L2VtPls9PGVtPnZhbHVlPC9lbT5dCi1bPGVtPmVudi12YXJpYWJsZTwvZW0+Wz08ZW0+dmFsdWU8L2VtPl1dIC4uLjwvc3ludGF4PgotPGRlZmF1bHQ+PGk+bm9uZTwvaT48L2RlZmF1bHQ+Ci08Y29udGV4dD5zZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPC9jb250ZXh0PgotPG92ZXJyaWRlPkZpbGVJbmZvPC9vdmVycmlkZT4KLTxjb21wYXRpYmlsaXR5PkFwYWNoZSAxLjIgYW5kCi0gICAgYWJvdmUgKGluIEFwYWNoZSAxLjIgdGhpcyBkaXJlY3RpdmUgd2FzIGZvdW5kIGluIHRoZQotICAgIG5vdy1vYnNvbGV0ZSBtb2RfYnJvd3NlciBtb2R1bGUpPC9jb21wYXRpYmlsaXR5PgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIDxkaXJlY3RpdmU+QnJvd3Nlck1hdGNoPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBkZWZpbmVzCi0gICAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJhc2VkIG9uIHRoZSA8Y29kZT5Vc2VyLUFnZW50PC9jb2RlPiBIVFRQCi0gICAgcmVxdWVzdCBoZWFkZXIgZmllbGQuICBUaGUgZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIGEgUE9TSVguMgotICAgIGV4dGVuZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiAoc2ltaWxhciB0byBhbgotICAgIDxjb2RlPmVncmVwPC9jb2RlPi1zdHlsZSByZWdleCkuIFRoZSByZXN0IG9mIHRoZSBhcmd1bWVudHMgZ2l2ZQotICAgIHRoZSBuYW1lcyBvZiB2YXJpYWJsZXMgdG8gc2V0LCBhbmQgb3B0aW9uYWxseSB2YWx1ZXMgdG8gd2hpY2ggdGhleQotICAgIHNob3VsZCBiZSBzZXQuIFRoZXNlIHRha2UgdGhlIGZvcm0gb2Y8L3A+Ci0KLSAgICA8b2w+Ci0gICAgICA8bGk+PGNvZGU+PGVtPnZhcm5hbWU8L2VtPjwvY29kZT4sIG9yPC9saT4KLQotICAgICAgPGxpPjxjb2RlPiE8ZW0+dmFybmFtZTwvZW0+PC9jb2RlPiwgb3I8L2xpPgotCi0gICAgICA8bGk+PGNvZGU+PGVtPnZhcm5hbWU8L2VtPj08ZW0+dmFsdWU8L2VtPjwvY29kZT48L2xpPgotICAgIDwvb2w+Ci0KLSAgICA8cD5JbiB0aGUgZmlyc3QgZm9ybSwgdGhlIHZhbHVlIHdpbGwgYmUgc2V0IHRvICIxIi4gVGhlIHNlY29uZAotICAgIHdpbGwgcmVtb3ZlIHRoZSBnaXZlbiB2YXJpYWJsZSBpZiBhbHJlYWR5IGRlZmluZWQsIGFuZCB0aGUKLSAgICB0aGlyZCB3aWxsIHNldCB0aGUgdmFyaWFibGUgdG8gdGhlIHZhbHVlIGdpdmVuIGJ5Ci0gICAgPGNvZGU+PGVtPnZhbHVlPC9lbT48L2NvZGU+LiBJZiBhIDxjb2RlPlVzZXItQWdlbnQ8L2NvZGU+Ci0gICAgc3RyaW5nIG1hdGNoZXMgbW9yZSB0aGFuIG9uZSBlbnRyeSwgdGhleSB3aWxsIGJlIG1lcmdlZC4KLSAgICBFbnRyaWVzIGFyZSBwcm9jZXNzZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyLCBhbmQKLSAgICBsYXRlciBlbnRyaWVzIGNhbiBvdmVycmlkZSBlYXJsaWVyIG9uZXMuPC9wPgotCi0gICAgPHA+Rm9yIGV4YW1wbGU6PC9wPgotPGV4YW1wbGU+Ci0gICAgQnJvd3Nlck1hdGNoIF5Nb3ppbGxhIGZvcm1zIGpwZWc9eWVzIGJyb3dzZXI9bmV0c2NhcGU8YnIgLz4KLSAgICBCcm93c2VyTWF0Y2ggIl5Nb3ppbGxhL1syLTNdIiB0YWJsZXMgYWdpZiBmcmFtZXMgamF2YXNjcmlwdDxiciAvPgotICAgIEJyb3dzZXJNYXRjaCBNU0lFICFqYXZhc2NyaXB0PGJyIC8+Ci08L2V4YW1wbGU+Ci0gCi0gICAgPHA+Tm90ZSB0aGF0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gc3RyaW5nIGlzCi0gICAgPHN0cm9uZz5jYXNlLXNlbnNpdGl2ZTwvc3Ryb25nPi4gRm9yIGNhc2UtSU5zZW5zaXRpdmUgbWF0Y2hpbmcsCi0gICAgc2VlIHRoZSA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJtb2Rfc2V0ZW52aWYiPkJyb3dzZXJNYXRjaE5vQ2FzZTwvZGlyZWN0aXZlPgotICAgIGRpcmVjdGl2ZS48L3A+Ci0KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5Ccm93c2VyTWF0Y2g8L2RpcmVjdGl2ZT4gYW5kCi0gICAgPGRpcmVjdGl2ZT5Ccm93c2VyTWF0Y2hOb0Nhc2U8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlcyBhcmUgc3BlY2lhbCBjYXNlcyBvZgotICAgIHRoZSA8ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX3NldGVudmlmIj5TZXRFbnZJZjwvZGlyZWN0aXZlPiBhbmQgPGRpcmVjdGl2ZQotICAgIG1vZHVsZT0ibW9kX3NldGVudmlmIj5TZXRFbnZJZk5vQ2FzZTwvZGlyZWN0aXZlPgotICAgIGRpcmVjdGl2ZXMuIFRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzIGhhdmUgdGhlIHNhbWUgZWZmZWN0OjwvcD4KLTxleGFtcGxlPgotICAgQnJvd3Nlck1hdGNoTm9DYXNlIFJvYm90IGlzX2Ffcm9ib3Q8YnIgLz4KLSAgIFNldEVudklmTm9DYXNlIFVzZXItQWdlbnQgUm9ib3QgaXNfYV9yb2JvdDxiciAvPgotPC9leGFtcGxlPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkJyb3dzZXJNYXRjaE5vQ2FzZTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5TZXRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBjb25kaXRpb25hbCBvbiBVc2VyLUFnZW50IHdpdGhvdXQKLXJlc3BlY3QgdG8gY2FzZTwvZGVzY3JpcHRpb24+Ci08c3ludGF4PkJyb3dzZXJNYXRjaE5vQ2FzZSAgPGVtPnJlZ2V4IGVudi12YXJpYWJsZTwvZW0+Wz08ZW0+dmFsdWU8L2VtPl0KLSAgICBbPGVtPmVudi12YXJpYWJsZTwvZW0+Wz08ZW0+dmFsdWU8L2VtPl1dIC4uLjwvc3ludGF4PgotPGRlZmF1bHQ+PGVtPm5vbmU8L2VtPjwvZGVmYXVsdD4KLTxjb250ZXh0PnNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3M8L2NvbnRleHQ+Ci08b3ZlcnJpZGU+RmlsZUluZm88L292ZXJyaWRlPgotPGNvbXBhdGliaWxpdHk+QXBhY2hlIDEuMiBhbmQKLSAgICBhYm92ZSAoaW4gQXBhY2hlIDEuMiB0aGlzIGRpcmVjdGl2ZSB3YXMgZm91bmQgaW4gdGhlCi0gICAgbm93LW9ic29sZXRlIG1vZF9icm93c2VyIG1vZHVsZSk8L2NvbXBhdGliaWxpdHk+Ci0KLTx1c2FnZT4KLQotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPkJyb3dzZXJNYXRjaE5vQ2FzZTwvZGlyZWN0aXZlPiBkaXJlY3RpdmUgaXMKLSAgICBzZW1hbnRpY2FsbHkgaWRlbnRpY2FsIHRvIHRoZSA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJtb2Rfc2V0ZW52aWYiPkJyb3dzZXJNYXRjaDwvZGlyZWN0aXZlPiBkaXJlY3RpdmUuCi0gICAgSG93ZXZlciwgaXQgcHJvdmlkZXMgZm9yIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcuIEZvcgotICAgIGV4YW1wbGU6PC9wPgotPGV4YW1wbGU+Ci0gICAgQnJvd3Nlck1hdGNoTm9DYXNlIG1hYyBwbGF0Zm9ybT1tYWNpbnRvc2g8YnIgLz4KLSAgICBCcm93c2VyTWF0Y2hOb0Nhc2Ugd2luIHBsYXRmb3JtPXdpbmRvd3M8YnIgLz4KLTwvZXhhbXBsZT4KLQotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPkJyb3dzZXJNYXRjaDwvZGlyZWN0aXZlPiBhbmQKLSAgICA8ZGlyZWN0aXZlPkJyb3dzZXJNYXRjaE5vQ2FzZTwvZGlyZWN0aXZlPiBkaXJlY3RpdmVzIGFyZSBzcGVjaWFsIGNhc2VzIG9mCi0gICAgdGhlIDxkaXJlY3RpdmUgbW9kdWxlPSJtb2Rfc2V0ZW52aWYiPlNldEVudklmPC9kaXJlY3RpdmU+IGFuZCA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJtb2Rfc2V0ZW52aWYiPlNldEVudklmTm9DYXNlPC9kaXJlY3RpdmU+Ci0gICAgZGlyZWN0aXZlcy4gVGhlIGZvbGxvd2luZyB0d28gbGluZXMgaGF2ZSB0aGUgc2FtZSBlZmZlY3Q6PC9wPgotPGV4YW1wbGU+Ci0gICBCcm93c2VyTWF0Y2hOb0Nhc2UgUm9ib3QgaXNfYV9yb2JvdDxiciAvPgotICAgU2V0RW52SWZOb0Nhc2UgVXNlci1BZ2VudCBSb2JvdCBpc19hX3JvYm90PGJyIC8+Ci08L2V4YW1wbGU+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U2V0RW52SWY8L25hbWU+Ci08ZGVzY3JpcHRpb24+U2V0cyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYmFzZWQgb24gYXR0cmlidXRlcyBvZiB0aGUgcmVxdWVzdAotPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+U2V0RW52SWYgPGVtPmF0dHJpYnV0ZQotICAgIHJlZ2V4IGVudi12YXJpYWJsZTwvZW0+Wz08ZW0+dmFsdWU8L2VtPl0KLSAgICBbPGVtPmVudi12YXJpYWJsZTwvZW0+Wz08ZW0+dmFsdWU8L2VtPl1dIC4uLjwvc3ludGF4PgotPGRlZmF1bHQ+PGVtPm5vbmU8L2VtPjwvZGVmYXVsdD4KLTxjb250ZXh0PiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPC9jb250ZXh0PgotPG92ZXJyaWRlPkZpbGVJbmZvPC9vdmVycmlkZT4KLTxjb21wYXRpYmlsaXR5PkFwYWNoZSAxLjMgYW5kCi0gICAgYWJvdmU7IHRoZSBSZXF1ZXN0X1Byb3RvY29sIGtleXdvcmQgYW5kIGVudmlyb25tZW50LXZhcmlhYmxlCi0gICAgbWF0Y2hpbmcgYXJlIG9ubHkgYXZhaWxhYmxlIHdpdGggMS4zLjcgYW5kIGxhdGVyPC9jb21wYXRpYmlsaXR5PgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIDxkaXJlY3RpdmU+U2V0RW52SWY8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIGRlZmluZXMgZW52aXJvbm1lbnQKLSAgICB2YXJpYWJsZXMgYmFzZWQgb24gYXR0cmlidXRlcyBvZiB0aGUgcmVxdWVzdC4gVGhlc2UgYXR0cmlidXRlcwotICAgIGNhbiBiZSB0aGUgdmFsdWVzIG9mIHZhcmlvdXMgSFRUUCByZXF1ZXN0IGhlYWRlciBmaWVsZHMgKHNlZSA8YQotICAgIGhyZWY9Imh0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzI2MTYudHh0Ij5SRkMyNjE2PC9hPgotICAgIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZXNlKSwgb3Igb2Ygb3RoZXIgYXNwZWN0cyBvZiB0aGUKLSAgICByZXF1ZXN0LCBpbmNsdWRpbmcgdGhlIGZvbGxvd2luZzo8L3A+Ci0KLSAgICA8dWw+Ci0gICAgICA8bGk+PGNvZGU+UmVtb3RlX0hvc3Q8L2NvZGU+IC0gdGhlIGhvc3RuYW1lIChpZiBhdmFpbGFibGUpIG9mCi0gICAgICB0aGUgY2xpZW50IG1ha2luZyB0aGUgcmVxdWVzdDwvbGk+Ci0KLSAgICAgIDxsaT48Y29kZT5SZW1vdGVfQWRkcjwvY29kZT4gLSB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgY2xpZW50Ci0gICAgICBtYWtpbmcgdGhlIHJlcXVlc3Q8L2xpPgotCi0gICAgICA8bGk+PGNvZGU+UmVtb3RlX1VzZXI8L2NvZGU+IC0gdGhlIGF1dGhlbnRpY2F0ZWQgdXNlcm5hbWUgKGlmCi0gICAgICBhdmFpbGFibGUpPC9saT4KLQotICAgICAgPGxpPjxjb2RlPlJlcXVlc3RfTWV0aG9kPC9jb2RlPiAtIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QKLSAgICAgIGJlaW5nIHVzZWQgKDxjb2RlPkdFVDwvY29kZT4sIDxjb2RlPlBPU1Q8L2NvZGU+LCA8ZW0+ZXQKLSAgICAgIGNldGVyYTwvZW0+KTwvbGk+Ci0KLSAgICAgIDxsaT48Y29kZT5SZXF1ZXN0X1Byb3RvY29sPC9jb2RlPiAtIHRoZSBuYW1lIGFuZCB2ZXJzaW9uIG9mCi0gICAgICB0aGUgcHJvdG9jb2wgd2l0aCB3aGljaCB0aGUgcmVxdWVzdCB3YXMgbWFkZSAoPGVtPmUuZy48L2VtPiwKLSAgICAgICJIVFRQLzAuOSIsICJIVFRQLzEuMSIsIDxlbT5ldGMuPC9lbT4pPC9saT4KLQotICAgICAgPGxpPjxjb2RlPlJlcXVlc3RfVVJJPC9jb2RlPiAtIHRoZSBwb3J0aW9uIG9mIHRoZSBVUkwKLSAgICAgIGZvbGxvd2luZyB0aGUgc2NoZW1lIGFuZCBob3N0IHBvcnRpb248L2xpPgotICAgIDwvdWw+Ci0KLSAgICA8cD5Tb21lIG9mIHRoZSBtb3JlIGNvbW1vbmx5IHVzZWQgcmVxdWVzdCBoZWFkZXIgZmllbGQgbmFtZXMKLSAgICBpbmNsdWRlIDxjb2RlPkhvc3Q8L2NvZGU+LCA8Y29kZT5Vc2VyLUFnZW50PC9jb2RlPiwgYW5kCi0gICAgPGNvZGU+UmVmZXJlcjwvY29kZT4uPC9wPgotCi0gICAgPHA+SWYgdGhlIDxlbT5hdHRyaWJ1dGU8L2VtPiBuYW1lIGRvZXNuJ3QgbWF0Y2ggYW55IG9mIHRoZQotICAgIHNwZWNpYWwga2V5d29yZHMsIG5vciBhbnkgb2YgdGhlIHJlcXVlc3QncyBoZWFkZXIgZmllbGQgbmFtZXMsCi0gICAgaXQgaXMgdGVzdGVkIGFzIHRoZSBuYW1lIG9mIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIGluIHRoZSBsaXN0Ci0gICAgb2YgdGhvc2UgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0LiBUaGlzIGFsbG93cwotICAgIDxkaXJlY3RpdmU+U2V0RW52SWY8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlcyB0byB0ZXN0IGFnYWluc3QgdGhlIHJlc3VsdCBvZgotICAgIHByaW9yIG1hdGNoZXMuPC9wPgotCi08bm90ZT4KLSAgICAgIDxzdHJvbmc+T25seSB0aG9zZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZGVmaW5lZCBieSBlYXJsaWVyCi0gICAgICA8Y29kZT5TZXRFbnZJZltOb0Nhc2VdPC9jb2RlPiBkaXJlY3RpdmVzIGFyZSBhdmFpbGFibGUgZm9yCi0gICAgICB0ZXN0aW5nIGluIHRoaXMgbWFubmVyLiAnRWFybGllcicgbWVhbnMgdGhhdCB0aGV5IHdlcmUKLSAgICAgIGRlZmluZWQgYXQgYSBicm9hZGVyIHNjb3BlIChzdWNoIGFzIHNlcnZlci13aWRlKSBvcgotICAgICAgcHJldmlvdXNseSBpbiB0aGUgY3VycmVudCBkaXJlY3RpdmUncyBzY29wZS48L3N0cm9uZz4KLTwvbm90ZT4KLQotICAgIDxwPjxlbT5hdHRyaWJ1dGU8L2VtPiBtYXkgYmUgYSByZWd1bGFyIGV4cHJlc3Npb24gd2hlbiB1c2VkIHRvCi0gICAgbWF0Y2ggYSByZXF1ZXN0IGhlYWRlci4gSWYgPGVtPmF0dHJpYnV0ZTwvZW0+IGlzIGEgcmVndWxhcgotICAgIGV4cHJlc3Npb24gYW5kIGl0IGRvZXNuJ3QgbWF0Y2ggYW55IG9mIHRoZSByZXF1ZXN0J3MgaGVhZGVyCi0gICAgbmFtZXMsIHRoZW4gPGVtPmF0dHJpYnV0ZTwvZW0+IGlzIG5vdCB0ZXN0ZWQgYWdhaW5zdCB0aGUKLSAgICByZXF1ZXN0J3MgZW52aXJvbm1lbnQgdmFyaWFibGUgbGlzdC48L3A+Ci0KLTxleGFtcGxlPgotPHRpdGxlPkV4YW1wbGU6PC90aXRsZT4KLSAgIFNldEVudklmIFJlcXVlc3RfVVJJICJcLmdpZiQiIG9iamVjdF9pc19pbWFnZT1naWY8YnIgLz4KLSAgIFNldEVudklmIFJlcXVlc3RfVVJJICJcLmpwZyQiIG9iamVjdF9pc19pbWFnZT1qcGc8YnIgLz4KLSAgIFNldEVudklmIFJlcXVlc3RfVVJJICJcLnhibSQiIG9iamVjdF9pc19pbWFnZT14Ym08YnIgLz4KLSAgICAgICAgOjxiciAvPgotICAgU2V0RW52SWYgUmVmZXJlciB3d3dcLm15ZG9tYWluXC5jb20gaW50cmFfc2l0ZV9yZWZlcnJhbDxiciAvPgotICAgICAgICA6PGJyIC8+Ci0gICBTZXRFbnZJZiBvYmplY3RfaXNfaW1hZ2UgeGJtIFhCSVRfUFJPQ0VTU0lORz0xPGJyIC8+Ci0gICAgICAgIDo8YnIgLz4KLSAgIFNldEVudklmIF5UUyogIF5bYS16XS4qICBIQVZFX1RTPGJyIC8+Ci08L2V4YW1wbGU+Ci0KLSAgICA8cD5UaGUgZmlyc3QgdGhyZWUgd2lsbCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi0gICAgPGNvZGU+b2JqZWN0X2lzX2ltYWdlPC9jb2RlPiBpZiB0aGUgcmVxdWVzdCB3YXMgZm9yIGFuIGltYWdlCi0gICAgZmlsZSwgYW5kIHRoZSBmb3VydGggc2V0cyA8Y29kZT5pbnRyYV9zaXRlX3JlZmVycmFsPC9jb2RlPiBpZgotICAgIHRoZSByZWZlcnJpbmcgcGFnZSB3YXMgc29tZXdoZXJlIG9uIHRoZQotICAgIDxjb2RlPnd3dy5teWRvbWFpbi5jb208L2NvZGU+IFdlYiBzaXRlLjwvcD4KLQotICAgIDxwPlRoZSBsYXN0IGV4YW1wbGUgd2lsbCBzZXQgZW52aXJvbm1lbnQgdmFyaWFibGUKLSAgICA8Y29kZT5IQVZFX1RTPC9jb2RlPiBpZiB0aGUgcmVxdWVzdCBjb250YWlucyBhbnkgaGVhZGVycyB0aGF0Ci0gICAgYmVnaW4gd2l0aCAiVFMiIHdob3NlIHZhbHVlcyBiZWdpbnMgd2l0aCBhbnkgY2hhcmFjdGVyIGluIHRoZQotICAgIHNldCBbYS16XS48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U2V0RW52SWZOb0Nhc2U8L25hbWU+Ci08ZGVzY3JpcHRpb24+U2V0cyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYmFzZWQgb24gYXR0cmlidXRlcyBvZiB0aGUgcmVxdWVzdAotd2l0aG91dCByZXNwZWN0IHRvIGNhc2U8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5TZXRFbnZJZk5vQ2FzZSA8ZW0+YXR0cmlidXRlIHJlZ2V4IGVudi12YXJpYWJsZTwvZW0+Wz08ZW0+dmFsdWU8L2VtPl0KLSAgICBbPGVtPmVudi12YXJpYWJsZTwvZW0+Wz08ZW0+dmFsdWU8L2VtPl1dIC4uLjwvc3ludGF4PgotPGRlZmF1bHQ+PGVtPm5vbmU8L2VtPjwvZGVmYXVsdD4KLTxjb250ZXh0PnNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3M8L2NvbnRleHQ+Ci08b3ZlcnJpZGU+RmlsZUluZm88L292ZXJyaWRlPgotPGNvbXBhdGliaWxpdHk+QXBhY2hlIDEuMyBhbmQgYWJvdmU8L2NvbXBhdGliaWxpdHk+Ci0KLTx1c2FnZT4KLQotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPlNldEVudklmTm9DYXNlPC9kaXJlY3RpdmU+IGlzIHNlbWFudGljYWxseSBpZGVudGljYWwgdG8KLSAgICB0aGUgPGRpcmVjdGl2ZSBtb2R1bGU9Im1vZF9zZXRlbnZpZiI+U2V0RW52SWY8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlLAotICAgIGFuZCBkaWZmZXJzIG9ubHkgaW4gdGhhdCB0aGUgcmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nIGlzCi0gICAgcGVyZm9ybWVkIGluIGEgY2FzZS1pbnNlbnNpdGl2ZSBtYW5uZXIuIEZvciBleGFtcGxlOjwvcD4KLTxleGFtcGxlPgotICAgU2V0RW52SWZOb0Nhc2UgSG9zdCBBcGFjaGVcLk9yZyBzaXRlPWFwYWNoZQotPC9leGFtcGxlPgotCi0gICAgPHA+VGhpcyB3aWxsIGNhdXNlIHRoZSA8Y29kZT5zaXRlPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZQotICAgIHRvIGJlIHNldCB0byAiPGNvZGU+YXBhY2hlPC9jb2RlPiIgaWYgdGhlIEhUVFAgcmVxdWVzdCBoZWFkZXIKLSAgICBmaWVsZCA8Y29kZT5Ib3N0OjwvY29kZT4gd2FzIGluY2x1ZGVkIGFuZCBjb250YWluZWQKLSAgICA8Y29kZT5BcGFjaGUuT3JnPC9jb2RlPiwgPGNvZGU+YXBhY2hlLm9yZzwvY29kZT4sIG9yIGFueSBvdGhlcgotICAgIGNvbWJpbmF0aW9uLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotPC9tb2R1bGVzeW5vcHNpcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX3NvLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX3NvLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZWVmZWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9zby5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9zbzwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPk1vZHVsZSBtb2Rfc288L0gxPgotCi1UaGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4gdGhlIDxDT0RFPm1vZF9zby5jPC9DT0RFPiBmaWxlLCBhbmQgaXMgbm90Ci1jb21waWxlZCBpbiBieSBkZWZhdWx0LiBJdCBwcm92aWRlcyBmb3IgbG9hZGluZyBvZiBleGVjdXRhYmxlIGNvZGUgYW5kCi1tb2R1bGVzIGludG8gdGhlIHNlcnZlciBhdCBzdGFydC11cCB0aW1lLCBvbiBVbml4IHN5c3RlbXMuIFdpbjMyCi1zeXN0ZW1zIHVzZSA8QSBIUkVGPSJtb2RfZGxsLmh0bWwiPm1vZF9kbGw8L0E+IGluc3RlYWQuIFRoaXMgbW9kdWxlIGlzCi1vbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUgMS4zIGFuZCB1cC4KLQotPGgyPlN1bW1hcnk8L2gyPgotCi1UaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBtb2R1bGUuIE9uIHNlbGVjdGVkIG9wZXJhdGluZyBzeXN0ZW1zIGl0IGNhbgotYmUgdXNlZCB0byBsb2FkIG1vZHVsZXMgaW50byBBcGFjaGUgYXQgcnVudGltZSwgcmF0aGVyIHRoYW4gcmVxdWlyaW5nCi1hIHJlY29tcGlsYXRpb24uCi0KLQotPGgyPkRpcmVjdGl2ZXM8L2gyPgotPFVMPgotPExJPjxBIEhSRUY9IiNsb2FkZmlsZSI+TG9hZEZpbGU8L0E+Ci08TEk+PEEgSFJFRj0iI2xvYWRtb2R1bGUiPkxvYWRNb2R1bGU8L0E+Ci08L1VMPgotPEhSPgotCi0KLTxoMj48QSBuYW1lPSJsb2FkZmlsZSI+TG9hZEZpbGU8L0E+PC9oMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBMb2FkRmlsZX0gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gTG9hZEZpbGUgPEVNPmZpbGVuYW1lIGZpbGVuYW1lIC4uLjwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEV4cGVyaW1lbnRhbDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX3NvPFA+Ci0KLVRoZSBMb2FkRmlsZSBkaXJlY3RpdmUgbGlua3MgaW4gdGhlIG5hbWVkIG9iamVjdCBmaWxlcyBvciBsaWJyYXJpZXMgd2hlbgotdGhlIHNlcnZlciBpcyBzdGFydGVkOyB0aGlzIGlzIHVzZWQgdG8gbG9hZCBhZGRpdGlvbmFsIGNvZGUgd2hpY2gKLW1heSBiZSByZXF1aXJlZCBmb3Igc29tZSBtb2R1bGUgdG8gd29yay4gPEVNPkZpbGVuYW1lPC9FTT4gaXMgcmVsYXRpdmUKLXRvIDxBIEhSRUY9ImNvcmUuaHRtbCNzZXJ2ZXJyb290Ij5TZXJ2ZXJSb290PC9BPi48UD48SFI+Ci0KLTxoMj48QSBuYW1lPSJsb2FkbW9kdWxlIj5Mb2FkTW9kdWxlPC9BPjwvaDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgTG9hZE1vZHVsZX0gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gTG9hZE1vZHVsZSA8RU0+bW9kdWxlIGZpbGVuYW1lPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gRXhwZXJpbWVudGFsPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2Rfc288UD4KLQotVGhlIExvYWRNb2R1bGUgZGlyZWN0aXZlIGxpbmtzIGluIHRoZSBvYmplY3QgZmlsZSBvciBsaWJyYXJ5IDxFTT5maWxlbmFtZTwvRU0+Ci1hbmQgYWRkcyB0aGUgbW9kdWxlIHN0cnVjdHVyZSBuYW1lZCA8RU0+bW9kdWxlPC9FTT4gdG8gdGhlIGxpc3Qgb2YgYWN0aXZlCi1tb2R1bGVzLiA8RU0+TW9kdWxlPC9FTT4gaXMgdGhlIG5hbWUgb2YgdGhlIGV4dGVybmFsIHZhcmlhYmxlIG9mIHR5cGUKLTxDT0RFPm1vZHVsZTwvQ09ERT4gaW4gdGhlIGZpbGUuIEV4YW1wbGU6Ci08QkxPQ0tRVU9URT48Q09ERT4KLUxvYWRNb2R1bGUgc3RhdHVzX21vZHVsZSBtb2R1bGVzL21vZF9zdGF0dXMuc28KLTwvQ09ERT48L0JMT0NLUVVPVEU+Ci1sb2FkcyB0aGUgbW9kdWxlIGluIHRoZSBtb2R1bGVzIHN1YmRpcmVjdG9yeSBvZiB0aGUgU2VydmVyUm9vdC48UD4KLQotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX3NvLnhtbCBiL2RvY3MvbWFudWFsL21vZC9tb2Rfc28ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYzUxMGI5Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2Rfc28ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iLi4vc3R5bGUvbWFudWFsLnhzbCI/PgotPG1vZHVsZXN5bm9wc2lzPgotCi08bmFtZT5tb2Rfc288L25hbWU+Ci08c3RhdHVzPkJhc2UgKFdpbmRvd3M+OyBPcHRpb25hbCAoVW5peCk8L3N0YXR1cz4KLTxpZGVudGlmaWVyPnNvX21vZHVsZTwvaWRlbnRpZmllcj4KLTxzb3VyY2VmaWxlPm1vZF9zby5jPC9zb3VyY2VmaWxlPgotPGNvbXBhdGliaWxpdHk+QXZhaWxhYmxlIGluIEFwYWNoZSAxLjMgYW5kIGxhdGVyLjwvY29tcGF0aWJpbGl0eT4KLQotPGRlc2NyaXB0aW9uPgotVGhpcyBtb2R1bGUgcHJvdmlkZXMgZm9yIGxvYWRpbmcgb2YgZXhlY3V0YWJsZSBjb2RlIGFuZAotbW9kdWxlcyBpbnRvIHRoZSBzZXJ2ZXIgYXQgc3RhcnQtdXAgb3IgcmVzdGFydCB0aW1lLjwvZGVzY3JpcHRpb24+Ci0KLTxzdW1tYXJ5PgotCi0gICAgPHA+T24gc2VsZWN0ZWQgb3BlcmF0aW5nIHN5c3RlbXMgdGhpcyBtb2R1bGUgY2FuIGJlIHVzZWQgdG8KLSAgICBsb2FkIG1vZHVsZXMgaW50byBBcGFjaGUgYXQgcnVudGltZSB2aWEgdGhlIDxhCi0gICAgaHJlZj0iLi4vZHNvLmh0bWwiPkR5bmFtaWMgU2hhcmVkIE9iamVjdDwvYT4gKERTTykgbWVjaGFuaXNtLAotICAgIHJhdGhlciB0aGFuIHJlcXVpcmluZyBhIHJlY29tcGlsYXRpb24uPC9wPgotCi0gICAgPHA+T24gVW5peCwgdGhlIGxvYWRlZCBjb2RlIHR5cGljYWxseSBjb21lcyBmcm9tIHNoYXJlZCBvYmplY3QKLSAgICBmaWxlcyAodXN1YWxseSB3aXRoIDxzYW1wPi5zbzwvc2FtcD4gZXh0ZW5zaW9uKSwgb24gV2luZG93cwotICAgIHRoaXMgbWF5IGVpdGhlciB0aGUgPHNhbXA+LnNvPC9zYW1wPiBvciA8c2FtcD4uZGxsPC9zYW1wPgotICAgIGV4dGVuc2lvbi4gVGhpcyBtb2R1bGUgaXMgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDEuMyBhbmQKLSAgICB1cC48L3A+Ci0KLSAgICA8cD5JbiBwcmV2aW91cyByZWxlYXNlcywgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhpcyBtb2R1bGUgd2FzCi0gICAgcHJvdmlkZWQgZm9yIFVuaXggYnkgbW9kX2RsZCwgYW5kIGZvciBXaW5kb3dzIGJ5IG1vZF9kbGwuIE9uCi0gICAgV2luZG93cywgbW9kX2RsbCB3YXMgdXNlZCBpbiBiZXRhIHJlbGVhc2UgMS4zYjEgdGhyb3VnaCAxLjNiNS4KLSAgICBtb2Rfc28gY29tYmluZXMgdGhlc2UgdHdvIG1vZHVsZXMgaW50byBhIHNpbmdsZSBtb2R1bGUgZm9yIGFsbAotICAgIG9wZXJhdGluZyBzeXN0ZW1zLjwvcD4KLQotICAgIDxwPjxzdHJvbmc+V2FybmluZzogQXBhY2hlIDEuMyBtb2R1bGVzIGNhbm5vdCBiZSBkaXJlY3RseSB1c2VkCi0gICAgd2l0aCBBcGFjaGUgMi4wIC0gdGhlIG1vZHVsZSBtdXN0IGJlIG1vZGlmaWVkIHRvIGR5bmFtaWNhbGx5Ci0gICAgbG9hZCBvciBjb21waWxlIGludG8gQXBhY2hlIDIuMDwvc3Ryb25nPi48L3A+Ci08L3N1bW1hcnk+Ci0KLTxzZWN0aW9uPjx0aXRsZSBpZD0iY3JlYXRpbmciPkNyZWF0aW5nIExvYWRhYmxlIE1vZHVsZXMKLWZvciBXaW5kb3dzPC90aXRsZT4KLQotICAgIDxwPjxub3RlPk5vdGU6IHRoZSBtb2R1bGUgbmFtZSBmb3JtYXQgY2hhbmdlZCBmb3IgV2luZG93cwotICAgIHdpdGggQXBhY2hlIDEuMy4xNSBhbmQgMi4wIC0gdGhlIG1vZHVsZXMgYXJlIG5vdyBuYW1lZCBhcwotICAgIG1vZF9mb28uc288L25vdGU+LiBXaGlsZSBtb2Rfc28gc3RpbGwgbG9hZHMgbW9kdWxlcyB3aXRoCi0gICAgQXBhY2hlTW9kdWxlRm9vLmRsbCBuYW1lcywgdGhlIG5ldyBuYW1pbmcgY29udmVudGlvbiBpcwotICAgIHByZWZlcnJlZDsgaWYgeW91IGFyZSBjb252ZXJ0aW5nIHlvdXIgbG9hZGFibGUgbW9kdWxlIGZvciAyLjAsCi0gICAgcGxlYXNlIGZpeCB0aGUgbmFtZSB0byB0aGlzIDIuMCBjb252ZW50aW9uLjwvcD4KLQotICAgIDxwPlRoZSBBcGFjaGUgbW9kdWxlIEFQSSBpcyB1bmNoYW5nZWQgYmV0d2VlbiB0aGUgVW5peCBhbmQKLSAgICBXaW5kb3dzIHZlcnNpb25zLiBNYW55IG1vZHVsZXMgd2lsbCBydW4gb24gV2luZG93cyB3aXRoIG5vIG9yCi0gICAgbGl0dGxlIGNoYW5nZSBmcm9tIFVuaXgsIGFsdGhvdWdoIG90aGVycyByZWx5IG9uIGFzcGVjdHMgb2YgdGhlCi0gICAgVW5peCBhcmNoaXRlY3R1cmUgd2hpY2ggYXJlIG5vdCBwcmVzZW50IGluIFdpbmRvd3MsIGFuZCB3aWxsCi0gICAgbm90IHdvcmsuPC9wPgotCi0gICAgPHA+V2hlbiBhIG1vZHVsZSBkb2VzIHdvcmssIGl0IGNhbiBiZSBhZGRlZCB0byB0aGUgc2VydmVyIGluCi0gICAgb25lIG9mIHR3byB3YXlzLiBBcyB3aXRoIFVuaXgsIGl0IGNhbiBiZSBjb21waWxlZCBpbnRvIHRoZQotICAgIHNlcnZlci4gQmVjYXVzZSBBcGFjaGUgZm9yIFdpbmRvd3MgZG9lcyBub3QgaGF2ZSB0aGUKLSAgICA8Y29kZT5Db25maWd1cmU8L2NvZGU+IHByb2dyYW0gb2YgQXBhY2hlIGZvciBVbml4LCB0aGUgbW9kdWxlJ3MKLSAgICBzb3VyY2UgZmlsZSBtdXN0IGJlIGFkZGVkIHRvIHRoZSBBcGFjaGVDb3JlIHByb2plY3QgZmlsZSwgYW5kCi0gICAgaXRzIHN5bWJvbHMgbXVzdCBiZSBhZGRlZCB0byB0aGUKLSAgICA8Y29kZT5vc1x3aW4zMlxtb2R1bGVzLmM8L2NvZGU+IGZpbGUuPC9wPgotCi0gICAgPHA+VGhlIHNlY29uZCB3YXkgaXMgdG8gY29tcGlsZSB0aGUgbW9kdWxlIGFzIGEgRExMLCBhIHNoYXJlZAotICAgIGxpYnJhcnkgdGhhdCBjYW4gYmUgbG9hZGVkIGludG8gdGhlIHNlcnZlciBhdCBydW50aW1lLCB1c2luZwotICAgIHRoZSA8Y29kZT48ZGlyZWN0aXZlPkxvYWRNb2R1bGU8L2RpcmVjdGl2ZT48L2NvZGU+Ci0gICAgZGlyZWN0aXZlLiBUaGVzZSBtb2R1bGUgRExMcyBjYW4gYmUgZGlzdHJpYnV0ZWQgYW5kIHJ1biBvbiBhbnkKLSAgICBBcGFjaGUgZm9yIFdpbmRvd3MgaW5zdGFsbGF0aW9uLCB3aXRob3V0IHJlY29tcGlsYXRpb24gb2YgdGhlCi0gICAgc2VydmVyLjwvcD4KLQotICAgIDxwPlRvIGNyZWF0ZSBhIG1vZHVsZSBETEwsIGEgc21hbGwgY2hhbmdlIGlzIG5lY2Vzc2FyeSB0byB0aGUKLSAgICBtb2R1bGUncyBzb3VyY2UgZmlsZTogVGhlIG1vZHVsZSByZWNvcmQgbXVzdCBiZSBleHBvcnRlZCBmcm9tCi0gICAgdGhlIERMTCAod2hpY2ggd2lsbCBiZSBjcmVhdGVkIGxhdGVyOyBzZWUgYmVsb3cpLiBUbyBkbyB0aGlzLAotICAgIGFkZCB0aGUgPGNvZGU+QVBfTU9EVUxFX0RFQ0xBUkVfREFUQTwvY29kZT4gKGRlZmluZWQgaW4gdGhlCi0gICAgQXBhY2hlIGhlYWRlciBmaWxlcykgdG8geW91ciBtb2R1bGUncyBtb2R1bGUgcmVjb3JkIGRlZmluaXRpb24uCi0gICAgRm9yIGV4YW1wbGUsIGlmIHlvdXIgbW9kdWxlIGhhczo8L3A+Ci0KLTxleGFtcGxlPgotICAgIG1vZHVsZSBmb29fbW9kdWxlOwotPC9leGFtcGxlPgotCi0gICAgPHA+UmVwbGFjZSB0aGUgYWJvdmUgd2l0aDo8L3A+Ci08ZXhhbXBsZT4KLSAgICBtb2R1bGUgQVBfTU9EVUxFX0RFQ0xBUkVfREFUQSBmb29fbW9kdWxlOwotPC9leGFtcGxlPgotCi0gICAgPHA+Tm90ZSB0aGF0IHRoaXMgd2lsbCBvbmx5IGJlIGFjdGl2YXRlZCBvbiBXaW5kb3dzLCBzbyB0aGUKLSAgICBtb2R1bGUgY2FuIGNvbnRpbnVlIHRvIGJlIHVzZWQsIHVuY2hhbmdlZCwgd2l0aCBVbml4IGlmIG5lZWRlZC4KLSAgICBBbHNvLCBpZiB5b3UgYXJlIGZhbWlsaWFyIHdpdGggPGNvZGU+LkRFRjwvY29kZT4gZmlsZXMsIHlvdSBjYW4KLSAgICBleHBvcnQgdGhlIG1vZHVsZSByZWNvcmQgd2l0aCB0aGF0IG1ldGhvZCBpbnN0ZWFkLjwvcD4KLQotICAgIDxwPk5vdywgY3JlYXRlIGEgRExMIGNvbnRhaW5pbmcgeW91ciBtb2R1bGUuIFlvdSB3aWxsIG5lZWQgdG8KLSAgICBsaW5rIHRoaXMgYWdhaW5zdCB0aGUgbGliaHR0cGQubGliIGV4cG9ydCBsaWJyYXJ5IHRoYXQgaXMKLSAgICBjcmVhdGVkIHdoZW4gdGhlIGxpYmh0dHBkLmRsbCBzaGFyZWQgbGlicmFyeSBpcyBjb21waWxlZC4gWW91Ci0gICAgbWF5IGFsc28gaGF2ZSB0byBjaGFuZ2UgdGhlIGNvbXBpbGVyIHNldHRpbmdzIHRvIGVuc3VyZSB0aGF0Ci0gICAgdGhlIEFwYWNoZSBoZWFkZXIgZmlsZXMgYXJlIGNvcnJlY3RseSBsb2NhdGVkLiBZb3UgY2FuIGZpbmQKLSAgICB0aGlzIGxpYnJhcnkgaW4geW91ciBzZXJ2ZXIgcm9vdCdzIG1vZHVsZXMgZGlyZWN0b3J5LiBJdCBpcwotICAgIGJlc3QgdG8gZ3JhYiBhbiBleGlzdGluZyBtb2R1bGUgLmRzcCBmaWxlIGZyb20gdGhlIHRyZWUgdG8KLSAgICBhc3N1cmUgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIGNvbmZpZ3VyZWQgY29ycmVjdGx5LCBvcgotICAgIGFsdGVybmF0ZWx5IGNvbXBhcmUgdGhlIGNvbXBpbGVyIGFuZCBsaW5rIG9wdGlvbnMgdG8geW91cgotICAgIC5kc3AuPC9wPgotCi0gICAgPHA+VGhpcyBzaG91bGQgY3JlYXRlIGEgRExMIHZlcnNpb24gb2YgeW91ciBtb2R1bGUuIE5vdyBzaW1wbHkKLSAgICBwbGFjZSBpdCBpbiB0aGUgPHNhbXA+bW9kdWxlczwvc2FtcD4gZGlyZWN0b3J5IG9mIHlvdXIgc2VydmVyCi0gICAgcm9vdCwgYW5kIHVzZSB0aGUgPGRpcmVjdGl2ZT5Mb2FkTW9kdWxlPC9kaXJlY3RpdmU+Ci0gICAgZGlyZWN0aXZlIHRvIGxvYWQgaXQuPC9wPgotCi08L3NlY3Rpb24+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkxvYWRGaWxlPC9uYW1lPgotPHN5bnRheD5Mb2FkRmlsZSA8ZW0+ZmlsZW5hbWU8L2VtPiBbPGVtPmZpbGVuYW1lPC9lbT5dIC4uLjwvc3ludGF4PgotPGRlZmF1bHQ+bm9uZTwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD4KLTxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPGRlc2NyaXB0aW9uPkxpbmsgaW4gdGhlIG5hbWVkIG9iamVjdCBmaWxlIG9yIGxpYnJhcnk8L2Rlc2NyaXB0aW9uPgotCi08dXNhZ2U+Ci0KLSAgICA8cD5UaGUgTG9hZEZpbGUgZGlyZWN0aXZlIGxpbmtzIGluIHRoZSBuYW1lZCBvYmplY3QgZmlsZXMgb3IKLSAgICBsaWJyYXJpZXMgd2hlbiB0aGUgc2VydmVyIGlzIHN0YXJ0ZWQgb3IgcmVzdGFydGVkOyB0aGlzIGlzIHVzZWQKLSAgICB0byBsb2FkIGFkZGl0aW9uYWwgY29kZSB3aGljaCBtYXkgYmUgcmVxdWlyZWQgZm9yIHNvbWUgbW9kdWxlCi0gICAgdG8gd29yay4gPGVtPkZpbGVuYW1lPC9lbT4gaXMgZWl0aGVyIGFuIGFic29sdXRlIHBhdGggb3IKLSAgICByZWxhdGl2ZSB0byA8YSBocmVmPSJjb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvYT4uPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkxvYWRNb2R1bGU8L25hbWU+Ci08c3ludGF4PkxvYWRNb2R1bGUgPGVtPm1vZHVsZSBmaWxlbmFtZTwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5ub25lPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0PgotPGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08ZGVzY3JpcHRpb24+TGlua3MgaW4gdGhlIG9iamVjdCBmaWxlIG9yIGxpYnJhcnksIGFuZCBhZGRzIHRvIHRoZSBsaXN0Ci1vZiBhY3RpdmUgbW9kdWxlczwvZGVzY3JpcHRpb24+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgTG9hZE1vZHVsZSBkaXJlY3RpdmUgbGlua3MgaW4gdGhlIG9iamVjdCBmaWxlIG9yIGxpYnJhcnkKLSAgICA8ZW0+ZmlsZW5hbWU8L2VtPiBhbmQgYWRkcyB0aGUgbW9kdWxlIHN0cnVjdHVyZSBuYW1lZAotICAgIDxlbT5tb2R1bGU8L2VtPiB0byB0aGUgbGlzdCBvZiBhY3RpdmUgbW9kdWxlcy4gPGVtPk1vZHVsZTwvZW0+Ci0gICAgaXMgdGhlIG5hbWUgb2YgdGhlIGV4dGVybmFsIHZhcmlhYmxlIG9mIHR5cGUKLSAgICA8Y29kZT5tb2R1bGU8L2NvZGU+IGluIHRoZSBmaWxlLCBhbmQgaXMgbGlzdGVkIGFzIHRoZSA8YQotICAgIGhyZWY9Im1vZHVsZS1kaWN0Lmh0bWwjTW9kdWxlSWRlbnRpZmllciI+TW9kdWxlIElkZW50aWZpZXI8L2E+Ci0gICAgaW4gdGhlIG1vZHVsZSBkb2N1bWVudGF0aW9uLiBFeGFtcGxlOjwvcD4KLQotICAgIDxleGFtcGxlPgotICAgICAgTG9hZE1vZHVsZSBzdGF0dXNfbW9kdWxlIG1vZHVsZXMvbW9kX3N0YXR1cy5zbwotICAgIDwvZXhhbXBsZT4KLQotICAgIDxwPmxvYWRzIHRoZSBuYW1lZCBtb2R1bGUgZnJvbSB0aGUgbW9kdWxlcyBzdWJkaXJlY3Rvcnkgb2YgdGhlCi0gICAgU2VydmVyUm9vdC48L3A+Ci08L3VzYWdlPgotCi08L2RpcmVjdGl2ZXN5bm9wc2lzPgotPC9tb2R1bGVzeW5vcHNpcz4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9zcGVsaW5nLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX3NwZWxpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiNmM0Ny4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX3NwZWxpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotIDxIRUFEPgotICA8VElUTEU+QXBhY2hlIG1vZHVsZSBtb2Rfc3BlbGluZzwvVElUTEU+Ci0gPC9IRUFEPgotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotIDxCT0RZCi0gIEJHQ09MT1I9IiNGRkZGRkYiCi0gIFRFWFQ9IiMwMDAwMDAiCi0gIExJTks9IiMwMDAwRkYiCi0gIFZMSU5LPSIjMDAwMDgwIgotICBBTElOSz0iI0ZGMDAwMCIKLSA+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotICA8SDEgQUxJR049IkNFTlRFUiI+TW9kdWxlIG1vZF9zcGVsaW5nPC9IMT4KLSAgPFA+Ci0gIFRoaXMgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+bW9kX3NwZWxpbmcuYzwvY29kZT4gZmlsZSwKLSAgYW5kIGlzIDxzdHJvbmc+bm90PC9zdHJvbmc+IGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuCi0gIEl0IGF0dGVtcHMgdG8gY29ycmVjdCBtaXNwZWxsaW5ncyBvZgotICBVUkxzIHRoYXQgdXNlcnMgbWlnaHQgaGF2ZSBlbnRlcmVkLCBieSBpZ25vcmluZyBjYXBpdGFsaXphdGlvbgotICBhbmQgYnkgYWxsb3dpbmcgdXAgdG8gb25lIG1pc3NwZWxsaW5nLjxicj4KLSAgVGhpcyBjYXRjaGVzIHRoZSBtYWpvcml0eSBvZiBtaXNzcGVsbGVkIHJlcXVlc3RzLiBBbiBhdXRvbWF0aWMKLSAgInNwZWxsaW5nIGNvcnJlY3RlZCIgcmVkaXJlY3Rpb24gaXMgcmV0dXJuZWQgaWYgb25seSBvbmUgbWF0Y2hpbmcKLSAgZG9jdW1lbnQgd2FzIGZvdW5kLCBhbmQgYSBsaXN0IG9mIG1hdGNoZXMgaXMgcmV0dXJuZWQgaWYgbW9yZSB0aGFuCi0gIG9uZSBkb2N1bWVudCB3aXRoIGEgc3VmZmljaWVudGx5IHNpbWlsYXIgbmFtZSBpcyBmb3VuZC4KLSAgPC9QPgotCi0gIDxoMj5TdW1tYXJ5PC9oMj4KLSAgPHA+Ci0gIFJlcXVlc3RzIHRvIGRvY3VtZW50cyBzb21ldGltZXMgY2Fubm90IGJlIHNlcnZlZCBieSB0aGUgY29yZSBhcGFjaGUKLSAgc2VydmVyIGJlY2F1c2UgdGhlIHJlcXVlc3Qgd2FzIG1pc3NwZWxsZWQgb3IgbWlzY2FwaXRhbGl6ZWQuIFRoaXMKLSAgbW9kdWxlIGFkZHJlc3NlcyB0aGlzIHByb2JsZW0gYnkgdHJ5aW5nIHRvIGZpbmQgYSBtYXRjaGluZyBkb2N1bWVudCwKLSAgZXZlbiBhZnRlciBhbGwgb3RoZXIgbW9kdWxlcyBnYXZlIHVwLiBJdCBkb2VzIGl0cyB3b3JrIGJ5IGNvbXBhcmluZwotICBlYWNoIGRvY3VtZW50IG5hbWUgaW4gdGhlIHJlcXVlc3RlZCBkaXJlY3RvcnkgYWdhaW5zdCB0aGUgcmVxdWVzdGVkCi0gIGRvY3VtZW50IG5hbWUgPFNUUk9ORz53aXRob3V0IHJlZ2FyZCB0byBjYXNlPC9TVFJPTkc+LCBhbmQgYWxsb3dpbmcKLSAgPFNUUk9ORz51cCB0byBvbmUgbWlzc3BlbGxpbmc8L1NUUk9ORz4gKGNoYXJhY3RlciBpbnNlcnRpb24gLyBvbWlzc2lvbgotICAvIHRyYW5zcG9zaXRpb24gb3Igd3JvbmcgY2hhcmFjdGVyKS4gQSBsaXN0IGlzIGJ1aWx0IHdpdGggYWxsIGRvY3VtZW50Ci0gIG5hbWVzIHdoaWNoIHdlcmUgbWF0Y2hlZCB1c2luZyB0aGlzIHN0cmF0ZWd5LgotICA8L3A+Ci0gIDxwPgotICBJZiwgYWZ0ZXIgc2Nhbm5pbmcgdGhlIGRpcmVjdG9yeSwKLSAgPHVsPgotICAgPGxpPm5vIG1hdGNoaW5nIGRvY3VtZW50IHdhcyBmb3VuZCwgQXBhY2hlIHdpbGwgcHJvY2VlZCBhcyB1c3VhbAotICAgICAgIGFuZCByZXR1cm4gYSAiZG9jdW1lbnQgbm90IGZvdW5kIiBlcnJvci4KLSAgIDxsaT5vbmx5IG9uZSBkb2N1bWVudCBpcyBmb3VuZCB0aGF0ICJhbG1vc3QiIG1hdGNoZXMgdGhlIHJlcXVlc3QsCi0gICAgICAgdGhlbiBpdCBpcyByZXR1cm5lZCBpbiB0aGUgZm9ybSBvZiBhIHJlZGlyZWN0aW9uIHJlc3BvbnNlLgotICAgPGxpPm1vcmUgdGhhbiBvbmUgZG9jdW1lbnQgd2l0aCBhIGNsb3NlIG1hdGNoIHdhcyBmb3VuZCwgdGhlbgotICAgICAgIHRoZSBsaXN0IG9mIHRoZSBtYXRjaGVzIGlzIHJldHVybmVkIHRvIHRoZSBjbGllbnQsIGFuZCB0aGUgY2xpZW50Ci0gICAgICAgY2FuIHNlbGVjdCB0aGUgY29ycmVjdCBjYW5kaWRhdGUuCi0gIDwvdWw+Ci0gIDwvcD4KLQotICA8aDI+RGlyZWN0aXZlczwvaDI+Ci0KLSAgPG1lbnU+Ci0gIDxsaT48QSBIUkVGPSIjY2hlY2tzcGVsbGluZyI+Q2hlY2tTcGVsbGluZzwvQT4KLSAgPC9tZW51PgotCi0gIDxIUj4gPCEtLSB0aGUgSFIgaXMgcGFydCBvZiB0aGUgZGlyZWN0aXZlIGRlc2NyaXB0aW9uIC0tPgotICA8QSBuYW1lPSJjaGVja3NwZWxsaW5nIj48aDI+Q2hlY2tTcGVsbGluZzwvaDI+PC9BPgotICA8IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgQ2hlY2tTcGVsbGluZ30gZGlyZWN0aXZlJmd0OyAtLT4KLSAgPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IENoZWNrU3BlbGxpbmcgPGVtPm9uL29mZjwvZW0+PGJyPgotICA8c3Ryb25nPkRlZmF1bHQ6PC9zdHJvbmc+IDxjb2RlPkNoZWNrU3BlbGxpbmcgT2ZmPC9jb2RlPjxicj4KLSAgPFN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8YnI+Ci0gIDxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBCYXNlPGJyPgotICA8c3Ryb25nPk1vZHVsZTo8L3N0cm9uZz4gbW9kX3NwZWxpbmc8YnI+Ci0gIDxzdHJvbmc+Q29tcGF0aWJpbGl0eTo8L3N0cm9uZz4gQ2hlY2tTcGVsbGluZyB3YXMgYXZhaWxhYmxlIGFzIGEgc2VwYXJhdGVseQotICBhdmFpbGFibGUgbW9kdWxlIGZvciBBcGFjaGUgMS4xLCBidXQgd2FzIGxpbWl0ZWQgdG8gbWlzY2FwaXRhbGl6YXRpb25zLgotICBBcyBvZiBBcGFjaGUgMS4zLCBpdCBpcyBwYXJ0IG9mIHRoZSBhcGFjaGUgZGlzdHJpYnV0aW9uPCEtLSBvcjoKLSAgYXZhaWxhYmxlIGFzIGEgc2VwYXJhdGUgbW9kdWxlLS0+LjxwPgotCi0gIFRoaXMgZGlyZWN0aXZlIGVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWxsaW5nIG1vZHVsZS4gV2hlbiBlbmFibGVkLAotICBrZWVwIGluIG1pbmQgdGhhdAotICA8VUw+Ci0gIDxMST50aGUgZGlyZWN0b3J5IHNjYW4gd2hpY2ggaXMgbmVjZXNzYXJ5IGZvciB0aGUgc3BlbGxpbmcKLSAgICAgIGNvcnJlY3Rpb24gd2lsbCBoYXZlIGFuIGltcGFjdCBvbiB0aGUgc2VydmVyJ3MgcGVyZm9ybWFuY2UKLSAgICAgIHdoZW4gbWFueSBzcGVsbGluZyBjb3JyZWN0aW9ucyBoYXZlIHRvIGJlIHBlcmZvcm1lZCBhdCB0aGUgc2FtZSB0aW1lLgotICA8TEk+dGhlIGRvY3VtZW50IHRyZWVzIHNob3VsZCBub3QgY29udGFpbiBzZW5zaXRpdmUgZmlsZXMgd2hpY2ggY291bGQKLSAgICAgIGJlIG1hdGNoZWQgaW5hZHZlcnRlZGx5LCBieSBhIHNwZWxsaW5nICJjb3JyZWN0aW9uIi4KLSAgPExJPnRoZSBtb2R1bGUgaXMgdW5hYmxlIHRvIGNvcnJlY3QgbWlzc3BlbGxlZCB1c2VyIG5hbWVzCi0gICAgICAoYXMgaW4gPGNvZGU+aHR0cDovL215Lmhvc3QvfmFwYWhjZS88L2NvZGU+KSwganVzdCBmaWxlIG5hbWVzIG9yCi0gICAgICBkaXJlY3RvcnkgbmFtZXMuCi0gIDwvVUw+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci0gPC9CT0RZPgotPC9IVE1MPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX3NwZWxpbmcueG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9zcGVsaW5nLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGQ2ZGYyNS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX3NwZWxpbmcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveHNsIiBocmVmPSIuLi9zdHlsZS9tYW51YWwueHNsIj8+Ci08bW9kdWxlc3lub3BzaXM+Ci0KLTxuYW1lPm1vZF9zcGVsaW5nPC9uYW1lPgotPHN0YXR1cz5FeHRlbnNpb248L3N0YXR1cz4KLTxpZGVudGlmaWVyPnNwZWxpbmdfbW9kdWxlPC9pZGVudGlmaWVyPgotPHNvdXJjZWZpbGU+bW9kX3NwZWxpbmcuYzwvc291cmNlZmlsZT4KLTxjb21wYXRpYmlsaXR5PkF2YWlsYWJsZSBpbiBBcGFjaGUgMS4zIGFuZCBsYXRlci4gQXZhaWxhYmxlIGFzCi1hbiBFeHRlcm5hbCBtb2R1bGUgaW4gQXBhY2hlIDEuMSBhbmQgbGF0ZXIuPC9jb21wYXRpYmlsaXR5PgotCi08ZGVzY3JpcHRpb24+VGhpcyBtb2R1bGUgYXR0ZW1wdHMgdG8gY29ycmVjdCBtaXNzcGVsbGluZ3Mgb2YgVVJMcyB0aGF0Ci11c2VycyBtaWdodCBoYXZlIGVudGVyZWQsIGJ5IGlnbm9yaW5nIGNhcGl0YWxpemF0aW9uIGFuZCBieQotYWxsb3dpbmcgdXAgdG8gb25lIG1pc3NwZWxsaW5nLjwvZGVzY3JpcHRpb24+Ci0KLTxzdW1tYXJ5PgotCi0gICAgPHA+UmVxdWVzdHMgdG8gZG9jdW1lbnRzIHNvbWV0aW1lcyBjYW5ub3QgYmUgc2VydmVkIGJ5IHRoZSBjb3JlCi0gICAgYXBhY2hlIHNlcnZlciBiZWNhdXNlIHRoZSByZXF1ZXN0IHdhcyBtaXNzcGVsbGVkIG9yCi0gICAgbWlzY2FwaXRhbGl6ZWQuIFRoaXMgbW9kdWxlIGFkZHJlc3NlcyB0aGlzIHByb2JsZW0gYnkgdHJ5aW5nIHRvCi0gICAgZmluZCBhIG1hdGNoaW5nIGRvY3VtZW50LCBldmVuIGFmdGVyIGFsbCBvdGhlciBtb2R1bGVzIGdhdmUgdXAuCi0gICAgSXQgZG9lcyBpdHMgd29yayBieSBjb21wYXJpbmcgZWFjaCBkb2N1bWVudCBuYW1lIGluIHRoZQotICAgIHJlcXVlc3RlZCBkaXJlY3RvcnkgYWdhaW5zdCB0aGUgcmVxdWVzdGVkIGRvY3VtZW50IG5hbWUKLSAgICA8c3Ryb25nPndpdGhvdXQgcmVnYXJkIHRvIGNhc2U8L3N0cm9uZz4sIGFuZCBhbGxvd2luZwotICAgIDxzdHJvbmc+dXAgdG8gb25lIG1pc3NwZWxsaW5nPC9zdHJvbmc+IChjaGFyYWN0ZXIgaW5zZXJ0aW9uIC8KLSAgICBvbWlzc2lvbiAvIHRyYW5zcG9zaXRpb24gb3Igd3JvbmcgY2hhcmFjdGVyKS4gQSBsaXN0IGlzIGJ1aWx0Ci0gICAgd2l0aCBhbGwgZG9jdW1lbnQgbmFtZXMgd2hpY2ggd2VyZSBtYXRjaGVkIHVzaW5nIHRoaXMKLSAgICBzdHJhdGVneS48L3A+Ci0KLSAgICA8cD5JZiwgYWZ0ZXIgc2Nhbm5pbmcgdGhlIGRpcmVjdG9yeSw8L3A+Ci0KLSAgICA8dWw+Ci0gICAgICA8bGk+bm8gbWF0Y2hpbmcgZG9jdW1lbnQgd2FzIGZvdW5kLCBBcGFjaGUgd2lsbCBwcm9jZWVkIGFzCi0gICAgICB1c3VhbCBhbmQgcmV0dXJuIGEgImRvY3VtZW50IG5vdCBmb3VuZCIgZXJyb3IuPC9saT4KLQotICAgICAgPGxpPm9ubHkgb25lIGRvY3VtZW50IGlzIGZvdW5kIHRoYXQgImFsbW9zdCIgbWF0Y2hlcyB0aGUKLSAgICAgIHJlcXVlc3QsIHRoZW4gaXQgaXMgcmV0dXJuZWQgaW4gdGhlIGZvcm0gb2YgYSByZWRpcmVjdGlvbgotICAgICAgcmVzcG9uc2UuPC9saT4KLQotICAgICAgPGxpPm1vcmUgdGhhbiBvbmUgZG9jdW1lbnQgd2l0aCBhIGNsb3NlIG1hdGNoIHdhcyBmb3VuZCwgdGhlbgotICAgICAgdGhlIGxpc3Qgb2YgdGhlIG1hdGNoZXMgaXMgcmV0dXJuZWQgdG8gdGhlIGNsaWVudCwgYW5kIHRoZQotICAgICAgY2xpZW50IGNhbiBzZWxlY3QgdGhlIGNvcnJlY3QgY2FuZGlkYXRlLjwvbGk+Ci0gICAgPC91bD4KLQotPC9zdW1tYXJ5PgotCi0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkNoZWNrU3BlbGxpbmc8L25hbWU+Ci08c3ludGF4PkNoZWNrU3BlbGxpbmcgb258b2ZmPC9zeW50YXg+Ci08ZGVmYXVsdD5DaGVja1NwZWxsaW5nIE9mZjwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD4KLTxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+Ci08Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+Ci08Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPk9wdGlvbnM8L292ZXJyaWRlPgotPGNvbXBhdGliaWxpdHk+Q2hlY2tTcGVsbGluZyB3YXMgYXZhaWxhYmxlIGFzIGEgc2VwYXJhdGVseSBhdmFpbGFibGUKLW1vZHVsZSBmb3IgQXBhY2hlIDEuMSwgYnV0IHdhcyBsaW1pdGVkIHRvIG1pc2NhcGl0YWxpemF0aW9ucy4gQXMKLW9mIEFwYWNoZSAxLjMsIGl0IGlzIHBhcnQgb2YgdGhlIEFwYWNoZSBkaXN0cmlidXRpb24uIFByaW9yIHRvIEFwYWNoZQotMS4zLjIsIHRoZSA8c2FtcD5DaGVja1NwZWxsaW5nPC9zYW1wPiBkaXJlY3RpdmUgd2FzIG9ubHkgYXZhaWxhYmxlIGluIHRoZQotInNlcnZlciIgYW5kICJ2aXJ0dWFsIGhvc3QiIGNvbnRleHRzLjwvY29tcGF0aWJpbGl0eT4KLTxkZXNjcmlwdGlvbj5UaGlzIGRpcmVjdGl2ZSBlbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVsbGluZyAKLW1vZHVsZS48L2Rlc2NyaXB0aW9uPgotCi08dXNhZ2U+Ci0KLSAgICA8cD5UaGlzIGRpcmVjdGl2ZSBlbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVsbGluZyBtb2R1bGUuIFdoZW4KLSAgICBlbmFibGVkLCBrZWVwIGluIG1pbmQgdGhhdDwvcD4KLQotICAgIDx1bD4KLSAgICAgIDxsaT50aGUgZGlyZWN0b3J5IHNjYW4gd2hpY2ggaXMgbmVjZXNzYXJ5IGZvciB0aGUgc3BlbGxpbmcKLSAgICAgIGNvcnJlY3Rpb24gd2lsbCBoYXZlIGFuIGltcGFjdCBvbiB0aGUgc2VydmVyJ3MgcGVyZm9ybWFuY2UKLSAgICAgIHdoZW4gbWFueSBzcGVsbGluZyBjb3JyZWN0aW9ucyBoYXZlIHRvIGJlIHBlcmZvcm1lZCBhdCB0aGUKLSAgICAgIHNhbWUgdGltZS48L2xpPgotCi0gICAgICA8bGk+dGhlIGRvY3VtZW50IHRyZWVzIHNob3VsZCBub3QgY29udGFpbiBzZW5zaXRpdmUgZmlsZXMKLSAgICAgIHdoaWNoIGNvdWxkIGJlIG1hdGNoZWQgaW5hZHZlcnRlbnRseSBieSBhIHNwZWxsaW5nCi0gICAgICAiY29ycmVjdGlvbiIuPC9saT4KLQotICAgICAgPGxpPnRoZSBtb2R1bGUgaXMgdW5hYmxlIHRvIGNvcnJlY3QgbWlzc3BlbGxlZCB1c2VyIG5hbWVzIChhcwotICAgICAgaW4gPGNvZGU+aHR0cDovL215Lmhvc3QvfmFwYWhjZS88L2NvZGU+KSwganVzdCBmaWxlIG5hbWVzIG9yCi0gICAgICBkaXJlY3RvcnkgbmFtZXMuPC9saT4KLQotICAgICAgPGxpPnNwZWxsaW5nIGNvcnJlY3Rpb25zIGFwcGx5IHN0cmljdGx5IHRvIGV4aXN0aW5nIGZpbGVzLCBzbwotICAgICAgYSByZXF1ZXN0IGZvciB0aGUgPHNhbXA+Jmx0O0xvY2F0aW9uIC9zdGF0dXMmZ3Q7PC9zYW1wPiBtYXkKLSAgICAgIGdldCBpbmNvcnJlY3RseSB0cmVhdGVkIGFzIHRoZSBuZWdvdGlhdGVkIGZpbGUKLSAgICAgICI8c2FtcD4vc3RhdHMuaHRtbDwvc2FtcD4iLjwvbGk+Ci0gICAgPC91bD4KLTwvdXNhZ2U+Ci0KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTwvbW9kdWxlc3lub3BzaXM+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2Rfc3NsLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX3NzbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2VjYjYzLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2Rfc3NsLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTM5ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+bW9kX3NzbDogUmVmZXJlbmNlPC90aXRsZT4KLQotPCEtLQotICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBSYWxmIFMuIEVuZ2Vsc2NoYWxsLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAgYXJlIG1ldDoKLQotICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCi0gICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gICAgIGRpc2NsYWltZXIuIAotIAotICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gCi0gIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogCi0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotICAgICAgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGVuZ2Vsc2NoYWxsLmNvbT4gZm9yIHVzZSBpbiB0aGUKLSAgICAgIG1vZF9zc2wgcHJvamVjdCAoaHR0cDovL3d3dy5tb2Rzc2wub3JnLykuIgotIAotICA0LiBUaGUgbmFtZSAibW9kX3NzbCIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgIHBlcm1pc3Npb24uICAKLQotICA1LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUKLSAgICAgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLSAgICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+IGZvciB1c2UgaW4gdGhlCi0gICAgICBtb2Rfc3NsIHByb2plY3QgKGh0dHA6Ly93d3cubW9kc3NsLm9yZy8pLiIKLSAKLSAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBSQUxGIFMuIEVOR0VMU0NIQUxMIGBgQVMgSVMnJyBBTkQgQU5ZCi0gIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBSQUxGIFMuIEVOR0VMU0NIQUxMIE9SCi0gIEhJUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0tLT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+PCEtLQotQTpsaW5rIHsKLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gICAgY29sb3I6ICM2NjY2Y2M7Ci19Ci1BOmFjdGl2ZSB7Ci0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotICAgIGNvbG9yOiAjNjY2NmNjOwotfQotQTp2aXNpdGVkIHsKLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gICAgY29sb3I6ICM2NjY2Y2M7Ci19Ci0jc2YgewotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCxoZWx2ZXRpY2E7Ci0gICAgZm9udC12YXJpYW50OiBub3JtYWw7Ci0gICAgZm9udC1zdHlsZTogbm9ybWFsOwotfQotSDEgewotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgIGZvbnQtc2l6ZTogMjRwdDsKLSAgICBsaW5lLWhlaWdodDogMjRwdDsKLSAgICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhOwotICAgIGZvbnQtdmFyaWFudDogbm9ybWFsOwotICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLUgyIHsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICBmb250LXNpemU6IDE4cHQ7Ci0gICAgbGluZS1oZWlnaHQ6IDE4cHQ7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYTsKLSAgICBmb250LXZhcmlhbnQ6IG5vcm1hbDsKLSAgICBmb250LXN0eWxlOiBub3JtYWw7Ci19Ci1IMyB7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgZm9udC1zaXplOiAxNHB0OwotICAgIGxpbmUtaGVpZ2h0OiAxNHB0OwotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCxoZWx2ZXRpY2E7Ci0gICAgZm9udC12YXJpYW50OiBub3JtYWw7Ci0gICAgZm9udC1zdHlsZTogbm9ybWFsOwotfQotSDQgewotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgIGZvbnQtc2l6ZTogMTJwdDsKLSAgICBsaW5lLWhlaWdodDogMTJwdDsKLSAgICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhOwotICAgIGZvbnQtdmFyaWFudDogbm9ybWFsOwotICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLSNIIHsKLX0KLSNEIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOwotfQotI2ZhcSB7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgZm9udC1zaXplOiAxNnB0OwotICAgIGxpbmUtaGVpZ2h0OiAxNnB0OwotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCxoZWx2ZXRpY2E7Ci0gICAgZm9udC12YXJpYW50OiBub3JtYWw7Ci0gICAgZm9udC1zdHlsZTogbm9ybWFsOwotfQotI2hvd3RvIHsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICBmb250LXNpemU6IDE2cHQ7Ci0gICAgbGluZS1oZWlnaHQ6IDE2cHQ7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYTsKLSAgICBmb250LXZhcmlhbnQ6IG5vcm1hbDsKLSAgICBmb250LXN0eWxlOiBub3JtYWw7Ci19Ci0jdGVybSB7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgZm9udC1zaXplOiAxNnB0OwotICAgIGxpbmUtaGVpZ2h0OiAxNnB0OwotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCxoZWx2ZXRpY2E7Ci0gICAgZm9udC12YXJpYW50OiBub3JtYWw7Ci0gICAgZm9udC1zdHlsZTogbm9ybWFsOwotfQotLS0+PC9zdHlsZT4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci08IS0tIEhpZGluZyB0aGUgY29kZQotZnVuY3Rpb24gcm9faW1nTm9ybWFsKGltZ05hbWUpIHsKLSAgICBpZiAoZG9jdW1lbnQuaW1hZ2VzKSB7Ci0gICAgICAgIGRvY3VtZW50W2ltZ05hbWVdLnNyYyA9IGV2YWwoaW1nTmFtZSArICdfbi5zcmMnKTsKLSAgICAgICAgc2VsZi5zdGF0dXMgPSAnJzsKLSAgICB9Ci19Ci1mdW5jdGlvbiByb19pbWdPdmVyKGltZ05hbWUsIGRlc2NyaXB0KSB7Ci0gICAgaWYgKGRvY3VtZW50LmltYWdlcykgewotICAgICAgICBkb2N1bWVudFtpbWdOYW1lXS5zcmMgPSBldmFsKGltZ05hbWUgKyAnX28uc3JjJyk7Ci0gICAgICAgIHNlbGYuc3RhdHVzID0gZGVzY3JpcHQ7Ci0gICAgfQotfQotLy8gZG9uZSBoaWRpbmcgLS0+Ci08L3NjcmlwdD4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci08IS0tIEhpZGluZyB0aGUgY29kZQotaWYgKGRvY3VtZW50LmltYWdlcykgewotICAgIHJvX2ltZ19wcmV2X3RvcF9uID0gbmV3IEltYWdlKCk7Ci0gICAgcm9faW1nX3ByZXZfdG9wX24uc3JjID0gJ3NzbF90ZW1wbGF0ZS5uYXZidXQtcHJldi1uLmdpZic7Ci0gICAgcm9faW1nX3ByZXZfdG9wX28gPSBuZXcgSW1hZ2UoKTsKLSAgICByb19pbWdfcHJldl90b3Bfby5zcmMgPSAnc3NsX3RlbXBsYXRlLm5hdmJ1dC1wcmV2LXMuZ2lmJzsKLX0KLS8vIGRvbmUgaGlkaW5nIC0tPgotPC9zY3JpcHQ+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotPCEtLSBIaWRpbmcgdGhlIGNvZGUKLWlmIChkb2N1bWVudC5pbWFnZXMpIHsKLSAgICByb19pbWdfcHJldl9ib3RfbiA9IG5ldyBJbWFnZSgpOwotICAgIHJvX2ltZ19wcmV2X2JvdF9uLnNyYyA9ICdzc2xfdGVtcGxhdGUubmF2YnV0LXByZXYtbi5naWYnOwotICAgIHJvX2ltZ19wcmV2X2JvdF9vID0gbmV3IEltYWdlKCk7Ci0gICAgcm9faW1nX3ByZXZfYm90X28uc3JjID0gJ3NzbF90ZW1wbGF0ZS5uYXZidXQtcHJldi1zLmdpZic7Ci19Ci0vLyBkb25lIGhpZGluZyAtLT4KLTwvc2NyaXB0PgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhLS0gSGlkaW5nIHRoZSBjb2RlCi1pZiAoZG9jdW1lbnQuaW1hZ2VzKSB7Ci0gICAgcm9faW1nX25leHRfdG9wX24gPSBuZXcgSW1hZ2UoKTsKLSAgICByb19pbWdfbmV4dF90b3Bfbi5zcmMgPSAnc3NsX3RlbXBsYXRlLm5hdmJ1dC1uZXh0LW4uZ2lmJzsKLSAgICByb19pbWdfbmV4dF90b3BfbyA9IG5ldyBJbWFnZSgpOwotICAgIHJvX2ltZ19uZXh0X3RvcF9vLnNyYyA9ICdzc2xfdGVtcGxhdGUubmF2YnV0LW5leHQtcy5naWYnOwotfQotLy8gZG9uZSBoaWRpbmcgLS0+Ci08L3NjcmlwdD4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci08IS0tIEhpZGluZyB0aGUgY29kZQotaWYgKGRvY3VtZW50LmltYWdlcykgewotICAgIHJvX2ltZ19uZXh0X2JvdF9uID0gbmV3IEltYWdlKCk7Ci0gICAgcm9faW1nX25leHRfYm90X24uc3JjID0gJ3NzbF90ZW1wbGF0ZS5uYXZidXQtbmV4dC1uLmdpZic7Ci0gICAgcm9faW1nX25leHRfYm90X28gPSBuZXcgSW1hZ2UoKTsKLSAgICByb19pbWdfbmV4dF9ib3Rfby5zcmMgPSAnc3NsX3RlbXBsYXRlLm5hdmJ1dC1uZXh0LXMuZ2lmJzsKLX0KLS8vIGRvbmUgaGlkaW5nIC0tPgotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIiB0ZXh0PSIjMDAwMDAwIiBsaW5rPSIjMzMzMzk5IiBhbGluaz0iIzk5OTlmZiIgdmxpbms9IiMwMDAwNjYiPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTx0YWJsZSB3aWR0aD0iNjAwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj4KLSAgPHRkPgotICAgICAgPGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iNjAwIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PGJyPgotICAgICAgPHRhYmxlIHdpZHRoPSI2MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgc3VtbWFyeT0iIj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPgotICAgICAgICA8dGFibGUgd2lkdGg9IjYwMCIgc3VtbWFyeT0iIj4KLSAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgICA8Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiIHNpemU9IisyIj48Yj5tb2Rfc3NsPC9iPjwvZm9udD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KLSAgICAgICAgICAgICAgPGltZyBzcmM9InNzbF90ZW1wbGF0ZS5oZWFkLWNoYXB0ZXIuZ2lmIiBhbHQ9IkNoYXB0ZXIiIHdpZHRoPSIxNzUiIGhlaWdodD0iOTQiPiA8aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmhlYWQtbnVtLTMuZ2lmIiBhbHQ9IjMiIHdpZHRoPSI3NCIgaGVpZ2h0PSI4OSI+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS0wMDAwMDAuZ2lmIiBhbHQ9IiIgd2lkdGg9IjYwMCIgaGVpZ2h0PSIyIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgIDx0YWJsZSB3aWR0aD0iNjAwIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci0gICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiIHdpZHRoPSIyNTAiPgotPGEgaHJlZj0ic3NsX2ludHJvLmh0bWwiIG9ubW91c2VvdmVyPSJyb19pbWdPdmVyKCdyb19pbWdfcHJldl90b3AnLCAncHJldmlvdXMgcGFnZScpOyByZXR1cm4gdHJ1ZSIgb25tb3VzZW91dD0icm9faW1nTm9ybWFsKCdyb19pbWdfcHJldl90b3AnKTsgcmV0dXJuIHRydWUiIG9uZm9jdXM9InJvX2ltZ092ZXIoJ3JvX2ltZ19wcmV2X3RvcCcsICdwcmV2aW91cyBwYWdlJyk7IHJldHVybiB0cnVlIiBvbmJsdXI9InJvX2ltZ05vcm1hbCgncm9faW1nX3ByZXZfdG9wJyk7IHJldHVybiB0cnVlIj48aW1nIG5hbWU9InJvX2ltZ19wcmV2X3RvcCIgc3JjPSJzc2xfdGVtcGxhdGUubmF2YnV0LXByZXYtbi5naWYiIGFsdD0icHJldmlvdXMgcGFnZSIgd2lkdGg9IjcwIiBoZWlnaHQ9IjE4IiBib3JkZXI9IjAiPjwvYT48YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPkludHJvZHVjdGlvbjwvZm9udD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJyaWdodCIgd2lkdGg9IjI1MCI+Ci08YSBocmVmPSJzc2xfY29tcGF0Lmh0bWwiIG9ubW91c2VvdmVyPSJyb19pbWdPdmVyKCdyb19pbWdfbmV4dF90b3AnLCAnbmV4dCBwYWdlJyk7IHJldHVybiB0cnVlIiBvbm1vdXNlb3V0PSJyb19pbWdOb3JtYWwoJ3JvX2ltZ19uZXh0X3RvcCcpOyByZXR1cm4gdHJ1ZSIgb25mb2N1cz0icm9faW1nT3Zlcigncm9faW1nX25leHRfdG9wJywgJ25leHQgcGFnZScpOyByZXR1cm4gdHJ1ZSIgb25ibHVyPSJyb19pbWdOb3JtYWwoJ3JvX2ltZ19uZXh0X3RvcCcpOyByZXR1cm4gdHJ1ZSI+PGltZyBuYW1lPSJyb19pbWdfbmV4dF90b3AiIHNyYz0ic3NsX3RlbXBsYXRlLm5hdmJ1dC1uZXh0LW4uZ2lmIiBhbHQ9Im5leHQgcGFnZSIgd2lkdGg9IjcwIiBoZWlnaHQ9IjE4IiBib3JkZXI9IjAiPjwvYT48YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPkNvbXBhdGliaWxpdHk8L2ZvbnQ+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICA8L3RyPgotICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8YnI+Ci0gICAgICAgICAgPGltZyBzcmM9InNzbF90ZW1wbGF0ZS50aXRsZS1yZWYuZ2lmIiBhbHQ9IlJlZmVyZW5jZSIgd2lkdGg9IjQ1NiIgaGVpZ2h0PSI2MCI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KLTxkaXYgYWxpZ249InJpZ2h0Ij4KLTx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxNTAiIHN1bW1hcnk9IiI+Ci08dHI+Ci08dGQ+Ci08ZW0+Ci1gYFRyeSB0byB1bmRlcnN0YW5kIGV2ZXJ5dGhpbmcsCi1idXQgYmVsaWV2ZSBub3RoaW5nIScnCi08L2VtPgotPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGQgYWxpZ249InJpZ2h0Ij4KLTxmb250IHNpemU9Ii0xIj4KLVVua25vd24KLTwvZm9udD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPHA+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHIgdmFsaWduPSJib3R0b20iPgotPHRkPgotPGltZyBzcmM9InNzbF9yZWZlcmVuY2UuZ2ZvbnQwMDAuZ2lmIiBhbHQ9IlQiIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgYm9yZGVyPSIwIiBhbGlnbj0ibGVmdCI+Ci1oaXMgY2hhcHRlciBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhbGwgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzIGFuZAotYWRkaXRpb25hbCB1c2VyIHZpc2libGUgZmVhdHVyZXMgbW9kX3NzbCBwcm92aWRlcy4gSXQncyBpbnRlbmRlZCBhcyB0aGUKLW9mZmljaWFsIHJlc291cmNlIHdoZW4geW91IHdhbnQgdG8ga25vdyBob3cgYSBwYXJ0aWNpbGFyIG1vZF9zc2wgZnVuY3Rpb25hbGl0eQotaXMgYWN0dWFsbHkgY29uZmlndXJlZCBvciBhY3RpdmF0ZWQuIEVhY2ggZGlyZWN0aXZlIGlzIGRvY3VtZW50ZWQgc2ltaWxhciB0bwotdGhlIHdheSBzdGFuZGFyZCBBcGFjaGUgZGlyZWN0aXZlcyBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgb2ZmaWNpYWwgQXBhY2hlCi1kb2N1bWVudGF0aW9uIHNldCwgaS5lLiBmb3IgZWFjaCBkaXJlY3RpdmUgZXNwZWNpYWxseSB0aGUgc3ludGF4LCBkZWZhdWx0IGFuZAotY29udGV4dCB3aGVyZSBhcHBsaWNhYmxlIGlzIGdpdmVuLgotPHA+Ci1Ob3RpY2UgdGhhdCB0aGVyZSBhcmUgdGhyZWUgbWFqb3IgY2xhc3NlcyBvZiBkaXJlY3RpdmVzIHdoaWNoIGFyZSB1c2VkIGJ5Ci1tb2Rfc3NsOiBGaXJzdCA8ZW0+R2xvYmFsIERpcmVjdGl2ZXM8L2VtPiAoaS5lLiBkaXJlY3RpdmVzIHdpdGggY29udGV4dAotYGBzZXJ2ZXIgY29uZmlnJycpLCB3aGljaCBjYW4gb2NjdXIgaW5zaWRlIHRoZSBzZXJ2ZXIgY29uZmlnIGZpbGVzIGJ1dCBvbmx5Ci1vdXRzaWRlIG9mIGFueSBzZWN0aW9uaW5nIGNvbW1hbmRzIGxpa2UgJmx0O1ZpcnR1YWxIb3N0Jmd0Oy4gU2Vjb25kCi08ZW0+UGVyLVNlcnZlciBEaXJlY3RpdmVzPC9lbT4gKGkuZS4gdGhvc2Ugd2l0aCBjb250ZXh0IGBgc2VydmVyIGNvbmZpZywKLXZpcnR1YWwgaG9zdCcnKSwgd2hpY2ggY2FuIG9jY3VyIGluc2lkZSB0aGUgc2VydmVyIGNvbmZpZyBmaWxlcyBib3RoIG91dHNpZGUKLShmb3IgdGhlIG1haW4vZGVmYXVsdCBzZXJ2ZXIpIGFuZCBpbnNpZGUgJmx0O1ZpcnR1YWxIb3N0Jmd0OyBzZWN0aW9ucy4KLTwvdGQ+Ci08dGQ+Ci0mbmJzcDsmbmJzcDsKLTwvdGQ+Ci08dGQ+Ci08ZGl2IGFsaWduPSJyaWdodCI+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI1IiBib3JkZXI9IjAiIGJnY29sb3I9IiNjY2NjZmYiIHN1bW1hcnk9IiI+Ci08dHI+Ci08dGQgYmdjb2xvcj0iIzMzMzM5OSI+Ci08Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiIGNvbG9yPSIjY2NjY2ZmIj4KLTxiPlRhYmxlIE9mIENvbnRlbnRzPC9iPgotPC9mb250PgotPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGQ+Ci08Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiIHNpemU9Ii0xIj4KLTxhIGhyZWY9IiNUb0MxIj48c3Ryb25nPkNvbmZpZ3VyYXRpb24gRGlyZWN0aXZlczwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DMiI+PHN0cm9uZz5TU0xQYXNzUGhyYXNlRGlhbG9nPC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0MzIj48c3Ryb25nPlNTTE11dGV4PC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0M0Ij48c3Ryb25nPlNTTFJhbmRvbVNlZWQ8L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzUiPjxzdHJvbmc+U1NMU2Vzc2lvbkNhY2hlPC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0M2Ij48c3Ryb25nPlNTTFNlc3Npb25DYWNoZVRpbWVvdXQ8L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzciPjxzdHJvbmc+U1NMRW5naW5lPC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0M4Ij48c3Ryb25nPlNTTFByb3RvY29sPC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0M5Ij48c3Ryb25nPlNTTENpcGhlclN1aXRlPC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0MxMCI+PHN0cm9uZz5TU0xDZXJ0aWZpY2F0ZUZpbGU8L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzExIj48c3Ryb25nPlNTTENlcnRpZmljYXRlS2V5RmlsZTwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DMTIiPjxzdHJvbmc+U1NMQ2VydGlmaWNhdGVDaGFpbkZpbGU8L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzEzIj48c3Ryb25nPlNTTENBQ2VydGlmaWNhdGVQYXRoPC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0MxNCI+PHN0cm9uZz5TU0xDQUNlcnRpZmljYXRlRmlsZTwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DMTUiPjxzdHJvbmc+U1NMQ0FSZXZvY2F0aW9uUGF0aDwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DMTYiPjxzdHJvbmc+U1NMQ0FSZXZvY2F0aW9uRmlsZTwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DMTciPjxzdHJvbmc+U1NMVmVyaWZ5Q2xpZW50PC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0MxOCI+PHN0cm9uZz5TU0xWZXJpZnlEZXB0aDwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DMTkiPjxzdHJvbmc+U1NMTG9nPC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0MyMCI+PHN0cm9uZz5TU0xMb2dMZXZlbDwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DMjEiPjxzdHJvbmc+U1NMT3B0aW9uczwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DMjIiPjxzdHJvbmc+U1NMUmVxdWlyZVNTTDwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DMjMiPjxzdHJvbmc+U1NMUmVxdWlyZTwvc3Ryb25nPjwvYT48YnI+Ci08YSBocmVmPSIjVG9DMjQiPjxzdHJvbmc+QWRkaXRpb25hbCBGZWF0dXJlczwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DMjUiPjxzdHJvbmc+RW52aXJvbm1lbnQgVmFyaWFibGVzPC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0MyNiI+PHN0cm9uZz5DdXN0b20gTG9nIEZvcm1hdHM8L3N0cm9uZz48L2E+PGJyPgotPC9mb250PgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08cD4KLUFuZCB0aGlyZCA8ZW0+UGVyLURpcmVjdG9yeSBEaXJlY3RpdmVzPC9lbT4gKGkuZS4gdGhvc2Ugd2l0aCBjb250ZXh0IGBgc2VydmVyCi1jb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3MnJyksIHdoaWNoIGNhbiBwcmV0dHkgbXVjaCBvY2N1cgotZXZlcnl3aGVyZS4gRXNwZWNpYWxseSBib3RoIGluc2lkZSB0aGUgc2VydmVyIGNvbmZpZyBmaWxlcyBhbmQgdGhlCi1wZXItZGlyZWN0b3J5IDxjb2RlPi5odGFjY2VzczwvY29kZT4gZmlsZXMuIFRoZSB0aHJlZSBjbGFzc2VzIGFyZSBzdWJzZXRzIG9mCi1lYWNoIG90aGVyLCBpLmUuIGRpcmVjdGl2ZXMgZnJvbSB0aGUgcGVyLWRpcmVjdG9yeSBjbGFzcyBjYW4gYWxzbyBiZSB1c2VkIGluCi10aGUgcGVyLXNlcnZlciBhbmQgZ2xvYmFsIGNvbnRleHQsIGFuZCBkaXJlY3RpdmVzIGZyb20gdGhlIHBlci1zZXJ2ZXIgY2xhc3MKLWNhbiBhbHNvIGJlIHVzZWQgdGhlIGluIHRoZSBnbG9iYWwgY29udGV4dC4KLTxwPgotQWRkaXRpb25hbCBkaXJlY3RpdmVzIGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcHJvdmlkZWQgYnkgbW9kX3NzbCAodmlhCi1vbi10aGUtZmx5IG1hcHBpbmcpIGZvciBiYWNrd2FyZCBjb21wYXRpYmxpdHkgdG8gb3RoZXIgQXBhY2hlIFNTTCBzb2x1dGlvbnMKLWFyZSBkb2N1bWVudGVkIGluIHRoZSA8YSBocmVmPSJzc2xfY29tcGF0Lmh0bWwiPkNvbXBhdGliaWxpdHk8L2E+IGNoYXB0ZXIuCi08aDE+PGEgbmFtZT0iVG9DMSI+Q29uZmlndXJhdGlvbiBEaXJlY3RpdmVzPC9hPjwvaDE+Ci1UaGUgbW9zdCB2aXNpYmxlIGFuZCBlcnJvci1wcm9uZSB0aGluZ3Mgb2YgbW9kX3NzbCBhcmUgaXRzIGNvbmZpZ3VyYXRpb24KLWRpcmVjdGl2ZXMuIFNvIHdlIGRvY3VtZW50IHRoZW0gaW4gZ3JlYXQgZGV0YWlsIGhlcmUgdG8gYXNzaXN0IHlvdSBpbiBzZXR0aW5nCi11cCB0aGUgYmVzdCBwb3NzaWJsZSBjb25maWd1cmF0aW9uIG9mIHlvdXIgU1NMLWF3YXJlIHdlYnNlcnZlci4KLTwhLS0gU1NMUGFzc1BocmFzZURpYWxvZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4KLTxwPgotPGJyPgotPGEgbmFtZT0iU1NMUGFzc1BocmFzZURpYWxvZyI+PC9hPgotPGgyPjxhIG5hbWU9IlRvQzIiPlNTTFBhc3NQaHJhc2VEaWFsb2c8L2E+PC9oMj4KLTxwPgotPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgYmdjb2xvcj0iI2NjY2NjYyIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPgotPHRkPgotPHRhYmxlIGJnY29sb3I9IndoaXRlIiB3aWR0aD0iNjAwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjUiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj4KLTx0ZD4KLTx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj48dGQ+Ci08Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPk5hbWU6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8Yj5TU0xQYXNzUGhyYXNlRGlhbG9nPC9iPjwvdGQ+PC90cj4KLTx0cj48dGQ+Ci08Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkRlc2NyaXB0aW9uOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gVHlwZSBvZiBwYXNzIHBocmFzZSBkaWFsb2cgZm9yIGVuY3J5cHRlZCBwcml2YXRlIGtleXM8L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+U3ludGF4OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gPGNvZGU+U1NMUGFzc1BocmFzZURpYWxvZzwvY29kZT4gPGVtPnR5cGU8L2VtPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+RGVmYXVsdDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxjb2RlPlNTTFBhc3NQaHJhc2VEaWFsb2cgYnVpbHRpbjwvY29kZT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkNvbnRleHQ6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBzZXJ2ZXIgY29uZmlnPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+T3ZlcnJpZGU6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8ZW0+Tm90IGFwcGxpY2FibGU8L2VtPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5TdGF0dXM6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBFeHRlbnNpb248L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+TW9kdWxlOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gbW9kX3NzbDwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+Q29tcGF0aWJpbGl0eTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IG1vZF9zc2wgMi4xIDwvdGQ+PC90cj4KLTwvdGFibGU+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08cD4KLVdoZW4gQXBhY2hlIHN0YXJ0cyB1cCBpdCBoYXMgdG8gcmVhZCB0aGUgdmFyaW91cyBDZXJ0aWZpY2F0ZSAoc2VlIDxhCi1ocmVmPSIjU1NMQ2VydGlmaWNhdGVGaWxlIj5TU0xDZXJ0aWZpY2F0ZUZpbGU8L2E+KSBhbmQgUHJpdmF0ZSBLZXkgKHNlZSA8YQotaHJlZj0iI1NTTENlcnRpZmljYXRlS2V5RmlsZSI+U1NMQ2VydGlmaWNhdGVLZXlGaWxlPC9hPikgZmlsZXMgb2YgdGhlCi1TU0wtZW5hYmxlZCB2aXJ0dWFsIHNlcnZlcnMuIEJlY2F1c2UgZm9yIHNlY3VyaXR5IHJlYXNvbnMgdGhlIFByaXZhdGUgS2V5Ci1maWxlcyBhcmUgdXN1YWxseSBlbmNyeXB0ZWQsIG1vZF9zc2wgbmVlZHMgdG8gcXVlcnkgdGhlIGFkbWluaXN0cmF0b3IgZm9yIGEKLVBhc3MgUGhyYXNlIGluIG9yZGVyIHRvIGRlY3J5cHQgdGhvc2UgZmlsZXMuIFRoaXMgcXVlcnkgY2FuIGJlIGRvbmUgaW4gdHdvIHdheXMKLXdoaWNoIGNhbiBiZSBjb25maWd1cmVkIGJ5IDxlbT50eXBlPC9lbT46Ci08dWw+Ci08bGk+PGNvZGU+YnVpbHRpbjwvY29kZT4KLSAgICA8cD4KLSAgICBUaGlzIGlzIHRoZSBkZWZhdWx0IHdoZXJlIGFuIGludGVyYWN0aXZlIHRlcm1pbmFsIGRpYWxvZyBvY2N1cnMgYXQgc3RhcnR1cAotICAgIHRpbWUganVzdCBiZWZvcmUgQXBhY2hlIGRldGFjaGVzIGZyb20gdGhlIHRlcm1pbmFsLiBIZXJlIHRoZSBhZG1pbmlzdHJhdG9yCi0gICAgaGFzIHRvIG1hbnVhbGx5IGVudGVyIHRoZSBQYXNzIFBocmFzZSBmb3IgZWFjaCBlbmNyeXB0ZWQgUHJpdmF0ZSBLZXkgZmlsZS4KLSAgICBCZWNhdXNlIGEgbG90IG9mIFNTTC1lbmFibGVkIHZpcnR1YWwgaG9zdHMgY2FuIGJlIGNvbmZpZ3VyZWQsIHRoZQotICAgIGZvbGxvd2luZyByZXVzZS1zY2hlbWUgaXMgdXNlZCB0byBtaW5pbWl6ZSB0aGUgZGlhbG9nOiBXaGVuIGEgUHJpdmF0ZSBLZXkKLSAgICBmaWxlIGlzIGVuY3J5cHRlZCwgYWxsIGtub3duIFBhc3MgUGhyYXNlcyAoYXQgdGhlIGJlZ2lubmluZyB0aGVyZSBhcmUKLSAgICBub25lLCBvZiBjb3Vyc2UpIGFyZSB0cmllZC4gSWYgb25lIG9mIHRob3NlIGtub3duIFBhc3MgUGhyYXNlcyBzdWNjZWVkcyBubwotICAgIGRpYWxvZyBwb3BzIHVwIGZvciB0aGlzIHBhcnRpY3VsYXIgUHJpdmF0ZSBLZXkgZmlsZS4gSWYgbm9uZSBzdWNjZWVkZWQsCi0gICAgYW5vdGhlciBQYXNzIFBocmFzZSBpcyBxdWVyaWVkIG9uIHRoZSB0ZXJtaW5hbCBhbmQgcmVtZW1iZXJlZCBmb3IgdGhlIG5leHQKLSAgICByb3VuZCAod2hlcmUgaXQgcGVyaGFwcyBjYW4gYmUgcmV1c2VkKS4KLSAgICA8cD4KLSAgICBUaGlzIHNjaGVtZSBhbGxvd3MgbW9kX3NzbCB0byBiZSBtYXhpbWFsbHkgZmxleGlibGUgKGJlY2F1c2UgZm9yIE4gZW5jcnlwdGVkCi0gICAgUHJpdmF0ZSBLZXkgZmlsZXMgeW91IDxlbT5jYW48L2VtPiB1c2UgTiBkaWZmZXJlbnQgUGFzcyBQaHJhc2VzIC0gYnV0IHRoZW4KLSAgICB5b3UgaGF2ZSB0byBlbnRlciBhbGwgb2YgdGhlbSwgb2YgY291cnNlKSB3aGlsZSBtaW5pbWl6aW5nIHRoZSB0ZXJtaW5hbAotICAgIGRpYWxvZyAoaS5lLiB3aGVuIHlvdSB1c2UgYSBzaW5nbGUgUGFzcyBQaHJhc2UgZm9yIGFsbCBOIFByaXZhdGUgS2V5IGZpbGVzCi0gICAgdGhpcyBQYXNzIFBocmFzZSBpcyBxdWVyaWVkIG9ubHkgb25jZSkuCi08cD4KLTxsaT48Y29kZT5leGVjOi9wYXRoL3RvL3Byb2dyYW08L2NvZGU+Ci0gICAgPHA+Ci0gICAgSGVyZSBhbiBleHRlcm5hbCBwcm9ncmFtIGlzIGNvbmZpZ3VyZWQgd2hpY2ggaXMgY2FsbGVkIGF0IHN0YXJ0dXAgZm9yIGVhY2gKLSAgICBlbmNyeXB0ZWQgUHJpdmF0ZSBLZXkgZmlsZS4gSXQgaXMgY2FsbGVkIHdpdGggdHdvIGFyZ3VtZW50cyAodGhlIGZpcnN0IGlzCi0gICAgb2YgdGhlIGZvcm0gYGA8Y29kZT5zZXJ2ZXJuYW1lOnBvcnRudW1iZXI8L2NvZGU+JycsIHRoZSBzZWNvbmQgaXMgZWl0aGVyCi0gICAgYGA8Y29kZT5SU0E8L2NvZGU+Jycgb3IgYGA8Y29kZT5EU0E8L2NvZGU+JycpLCB3aGljaCBpbmRpY2F0ZSBmb3Igd2hpY2gKLSAgICBzZXJ2ZXIgYW5kIGFsZ29yaXRobSBpdCBoYXMgdG8gcHJpbnQgdGhlIGNvcnJlc3BvbmRpbmcgUGFzcyBQaHJhc2UgdG8KLSAgICA8Y29kZT5zdGRvdXQ8L2NvZGU+LiBUaGUgaW50ZW50IGlzIHRoYXQgdGhpcyBleHRlcm5hbCBwcm9ncmFtIGZpcnN0IHJ1bnMKLSAgICBzZWN1cml0eSBjaGVja3MgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHN5c3RlbSBpcyBub3QgY29tcHJvbWlzZWQgYnkgYW4KLSAgICBhdHRhY2tlciwgYW5kIG9ubHkgd2hlbiB0aGVzZSBjaGVja3Mgd2VyZSBwYXNzZWQgc3VjY2Vzc2Z1bGx5IGl0IHByb3ZpZGVzCi0gICAgdGhlIFBhc3MgUGhyYXNlLgotICAgIDxwPgotICAgIEJvdGggdGhlc2Ugc2VjdXJpdHkgY2hlY2tzLCBhbmQgdGhlIHdheSB0aGUgUGFzcyBQaHJhc2UgaXMgZGV0ZXJtaW5lZCwgY2FuCi0gICAgYmUgYXMgY29tcGxleCBhcyB5b3UgbGlrZS4gTW9kX3NzbCBqdXN0IGRlZmluZXMgdGhlIGludGVyZmFjZTogYW4KLSAgICBleGVjdXRhYmxlIHByb2dyYW0gd2hpY2ggcHJvdmlkZXMgdGhlIFBhc3MgUGhyYXNlIG9uIDxjb2RlPnN0ZG91dDwvY29kZT4uCi0gICAgTm90aGluZyBtb3JlIG9yIGxlc3MhIFNvLCBpZiB5b3UncmUgcmVhbGx5IHBhcmFub2lkIGFib3V0IHNlY3VyaXR5LCBoZXJlCi0gICAgaXMgeW91ciBpbnRlcmZhY2UuIEFueXRoaW5nIGVsc2UgaGFzIHRvIGJlIGxlZnQgYXMgYW4gZXhlcmNpc2UgdG8gdGhlCi0gICAgYWRtaW5pc3RyYXRvciwgYmVjYXVzZSBsb2NhbCBzZWN1cml0eSByZXF1aXJlbWVudHMgYXJlIHNvIGRpZmZlcmVudC4KLSAgICA8cD4KLSAgICBUaGUgcmV1c2UtYWxnb3JpdGhtIGFib3ZlIGlzIHVzZWQgaGVyZSwgdG9vLiBJbiBvdGhlciB3b3JkczogVGhlIGV4dGVybmFsCi0gICAgcHJvZ3JhbSBpcyBjYWxsZWQgb25seSBvbmNlIHBlciB1bmlxdWUgUGFzcyBQaHJhc2UuCi08L3VsPgotPHA+Ci1FeGFtcGxlOgotPGJsb2NrcXVvdGU+Ci08cHJlPgotU1NMUGFzc1BocmFzZURpYWxvZyBleGVjOi91c3IvbG9jYWwvYXBhY2hlL3NiaW4vcHAtZmlsdGVyCi08L3ByZT4KLTwvYmxvY2txdW90ZT4KLTwhLS0gU1NMTXV0ZXggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4KLTxwPgotPGJyPgotPGEgbmFtZT0iU1NMTXV0ZXgiPjwvYT4KLTxoMj48YSBuYW1lPSJUb0MzIj5TU0xNdXRleDwvYT48L2gyPgotPHA+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBiZ2NvbG9yPSIjY2NjY2NjIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+Ci08dGQ+Ci08dGFibGUgYmdjb2xvcj0id2hpdGUiIHdpZHRoPSI2MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPgotPHRkPgotPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPjx0ZD4KLTxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+TmFtZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxiPlNTTE11dGV4PC9iPjwvdGQ+PC90cj4KLTx0cj48dGQ+Ci08Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkRlc2NyaXB0aW9uOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gU2VtYXBob3JlIGZvciBpbnRlcm5hbCBtdXR1YWwgZXhjbHVzaW9uIG9mIG9wZXJhdGlvbnM8L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+U3ludGF4OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gPGNvZGU+U1NMTXV0ZXg8L2NvZGU+IDxlbT50eXBlPC9lbT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkRlZmF1bHQ6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8Y29kZT5TU0xNdXRleCBub25lPC9jb2RlPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+Q29udGV4dDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IHNlcnZlciBjb25maWc8L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5PdmVycmlkZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxlbT5Ob3QgYXBwbGljYWJsZTwvZW0+PC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPlN0YXR1czo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IEV4dGVuc2lvbjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5Nb2R1bGU6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBtb2Rfc3NsPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5Db21wYXRpYmlsaXR5OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gbW9kX3NzbCAyLjEgPC90ZD48L3RyPgotPC90YWJsZT4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTxwPgotVGhpcyBjb25maWd1cmVzIHRoZSBTU0wgZW5naW5lJ3Mgc2VtYXBob3JlIChha2EuIGxvY2spIHdoaWNoIGlzIHVzZWQgZm9yIG11dHVhbAotZXhjbHVzaW9uIG9mIG9wZXJhdGlvbnMgd2hpY2ggaGF2ZSB0byBiZSBkb25lIGluIGEgc3luY2hyb25pemVkIHdheSBiZXR3ZWVuIHRoZQotcHJlLWZvcmtlZCBBcGFjaGUgc2VydmVyIHByb2Nlc3Nlcy4gVGhpcyBkaXJlY3RpdmUgY2FuIG9ubHkgYmUgdXNlZCBpbiB0aGUKLWdsb2JhbCBzZXJ2ZXIgY29udGV4dCBiZWNhdXNlIGl0J3Mgb25seSB1c2VmdWwgdG8gaGF2ZSBvbmUgZ2xvYmFsIG11dGV4LgotPHA+Ci1UaGUgZm9sbG93aW5nIE11dGV4IDxlbT50eXBlczwvZW0+IGFyZSBhdmFpbGFibGU6Ci08dWw+Ci08bGk+PGNvZGU+bm9uZTwvY29kZT4KLSAgICA8cD4KLSAgICBUaGlzIGlzIHRoZSBkZWZhdWx0IHdoZXJlIG5vIE11dGV4IGlzIHVzZWQgYXQgYWxsLiBVc2UgaXQgYXQgeW91ciBvd24KLSAgICByaXNrLiBCdXQgYmVjYXVzZSBjdXJyZW50bHkgdGhlIE11dGV4IGlzIG1haW5seSB1c2VkIGZvciBzeW5jaHJvbml6aW5nCi0gICAgd3JpdGUgYWNjZXNzIHRvIHRoZSBTU0wgU2Vzc2lvbiBDYWNoZSB5b3UgY2FuIGxpdmUgd2l0aG91dCBpdCBhcyBsb25nCi0gICAgYXMgeW91IGFjY2VwdCBhIHNvbWV0aW1lcyBnYXJibGVkIFNlc3Npb24gQ2FjaGUuIFNvIGl0J3Mgbm90IHJlY29tbWVuZGVkCi0gICAgdG8gbGVhdmUgdGhpcyB0aGUgZGVmYXVsdC4gSW5zdGVhZCBjb25maWd1cmUgYSByZWFsIE11dGV4LgotPHA+Ci08bGk+PGNvZGU+ZmlsZTovcGF0aC90by9tdXRleDwvY29kZT4KLSAgICA8cD4KLSAgICBUaGlzIGlzIHRoZSBwb3J0YWJsZSBhbmQgKHVuZGVyIFVuaXgpIGFsd2F5cyBwcm92aWRlZCBNdXRleCB2YXJpYW50IHdoZXJlCi0gICAgYSBwaHlzaWNhbCAobG9jay0pZmlsZSBpcyB1c2VkIGFzIHRoZSBNdXRleC4gQWx3YXlzIHVzZSBhIGxvY2FsIGRpc2sKLSAgICBmaWxlc3lzdGVtIGZvciA8Y29kZT4vcGF0aC90by9tdXRleDwvY29kZT4gYW5kIG5ldmVyIGEgZmlsZSByZXNpZGluZyBvbiBhCi0gICAgTkZTLSBvciBBRlMtZmlsZXN5c3RlbS4gTm90ZTogSW50ZXJuYWxseSwgdGhlIFByb2Nlc3MgSUQgKFBJRCkgb2YgdGhlCi0gICAgQXBhY2hlIHBhcmVudCBwcm9jZXNzIGlzIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQgdG8KLSAgICA8Y29kZT4vcGF0aC90by9tdXRleDwvY29kZT4gdG8gbWFrZSBpdCB1bmlxdWUsIHNvIHlvdSBkb24ndCBoYXZlIHRvIHdvcnJ5Ci0gICAgYWJvdXQgY29uZmxpY3RzIHlvdXJzZWxmLiBOb3RpY2UgdGhhdCB0aGlzIHR5cGUgb2YgbXV0ZXggaXMgbm90IGF2YWlsYWJsZQotICAgIHVuZGVyIHRoZSBXaW4zMiBlbnZpcm9ubWVudC4gVGhlcmUgeW91IDxpPmhhdmU8L2k+IHRvIHVzZSB0aGUgc2VtYXBob3JlCi0gICAgbXV0ZXguCi08cD4KLTxsaT48Y29kZT5zZW08L2NvZGU+Ci0gICAgPHA+Ci0gICAgVGhpcyBpcyB0aGUgbW9zdCBlbGVnYW50IGJ1dCBhbHNvIG1vc3Qgbm9uLXBvcnRhYmxlIE11dGV4IHZhcmlhbnQgd2hlcmUgYQotICAgIFN5c1YgSVBDIFNlbWFwaG9yZSAodW5kZXIgVW5peCkgYW5kIGEgV2luZG93cyBNdXRleCAodW5kZXIgV2luMzIpIGlzIHVzZWQKLSAgICB3aGVuIHBvc3NpYmxlLiBJdCBpcyBvbmx5IGF2YWlsYWJsZSB3aGVuIHRoZSB1bmRlcmx5aW5nIHBsYXRmb3JtCi0gICAgc3VwcG9ydHMgaXQuCi08L3VsPgotPHA+Ci1FeGFtcGxlOgotPGJsb2NrcXVvdGU+Ci08cHJlPgotU1NMTXV0ZXggZmlsZTovdXNyL2xvY2FsL2FwYWNoZS9sb2dzL3NzbF9tdXRleAotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08IS0tIFNTTFJhbmRvbVNlZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+Ci08cD4KLTxicj4KLTxhIG5hbWU9IlNTTFJhbmRvbVNlZWQiPjwvYT4KLTxoMj48YSBuYW1lPSJUb0M0Ij5TU0xSYW5kb21TZWVkPC9hPjwvaDI+Ci08cD4KLTx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIGJnY29sb3I9IiNjY2NjY2MiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj4KLTx0ZD4KLTx0YWJsZSBiZ2NvbG9yPSJ3aGl0ZSIgd2lkdGg9IjYwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI1IiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+Ci08dGQ+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+PHRkPgotPGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5OYW1lOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gPGI+U1NMUmFuZG9tU2VlZDwvYj48L3RkPjwvdHI+Ci08dHI+PHRkPgotPGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5EZXNjcmlwdGlvbjo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IFBzZXVkbyBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciAoUFJORykgc2VlZGluZyBzb3VyY2U8L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+U3ludGF4OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gPGNvZGU+U1NMUmFuZG9tU2VlZDwvY29kZT4gPGVtPmNvbnRleHQ8L2VtPiA8ZW0+c291cmNlPC9lbT4gWzxlbT5ieXRlczwvZW0+XTwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+RGVmYXVsdDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxlbT5ub25lPC9lbT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkNvbnRleHQ6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBzZXJ2ZXIgY29uZmlnPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+T3ZlcnJpZGU6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8ZW0+Tm90IGFwcGxpY2FibGU8L2VtPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5TdGF0dXM6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBFeHRlbnNpb248L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+TW9kdWxlOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gbW9kX3NzbDwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+Q29tcGF0aWJpbGl0eTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IG1vZF9zc2wgMi4yIDwvdGQ+PC90cj4KLTwvdGFibGU+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08cD4KLVRoaXMgY29uZmlndXJlcyBvbmUgb3IgbW9yZSBzb3VyY2VzIGZvciBzZWVkaW5nIHRoZSBQc2V1ZG8gUmFuZG9tIE51bWJlcgotR2VuZXJhdG9yIChQUk5HKSBpbiBPcGVuU1NMIGF0IHN0YXJ0dXAgdGltZSAoPGVtPmNvbnRleHQ8L2VtPiBpcwotPGNvZGU+c3RhcnR1cDwvY29kZT4pIGFuZC9vciBqdXN0IGJlZm9yZSBhIG5ldyBTU0wgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZAotKDxlbT5jb250ZXh0PC9lbT4gaXMgPGNvZGU+Y29ubmVjdDwvY29kZT4pLiBUaGlzIGRpcmVjdGl2ZSBjYW4gb25seSBiZSB1c2VkCi1pbiB0aGUgZ2xvYmFsIHNlcnZlciBjb250ZXh0IGJlY2F1c2UgdGhlIFBSTkcgaXMgYSBnbG9iYWwgZmFjaWxpdHkuCi08cD4KLVRoZSBmb2xsb3dpbmcgPGVtPnNvdXJjZTwvZW0+IHZhcmlhbnRzIGFyZSBhdmFpbGFibGU6Ci08dWw+Ci08bGk+PGNvZGU+YnVpbHRpbjwvY29kZT4KLSAgICA8cD4gVGhpcyBpcyB0aGUgYWx3YXlzIGF2YWlsYWJsZSBidWlsdGluIHNlZWRpbmcgc291cmNlLiBJdCdzIHVzYWdlCi0gICAgY29uc3VtZXMgbWluaW11bSBDUFUgY3ljbGVzIHVuZGVyIHJ1bnRpbWUgYW5kIGhlbmNlIGNhbiBiZSBhbHdheXMgdXNlZAotICAgIHdpdGhvdXQgZHJhd2JhY2tzLiBUaGUgc291cmNlIHVzZWQgZm9yIHNlZWRpbmcgdGhlIFBSTkcgY29udGFpbnMgb2YgdGhlCi0gICAgY3VycmVudCB0aW1lLCB0aGUgY3VycmVudCBwcm9jZXNzIGlkIGFuZCAod2hlbiBhcHBsaWNhYmxlKSBhIHJhbmRvbWx5Ci0gICAgY2hvb3NlbiAxS0IgZXh0cmFjdCBvZiB0aGUgaW50ZXItcHJvY2VzcyBzY29yZWJvYXJkIHN0cnVjdHVyZSBvZiBBcGFjaGUuCi0gICAgVGhlIGRyYXdiYWNrIGlzIHRoYXQgdGhpcyBpcyBub3QgcmVhbGx5IGEgc3Ryb25nIHNvdXJjZSBhbmQgYXQgc3RhcnR1cAotICAgIHRpbWUgKHdoZXJlIHRoZSBzY29yZWJvYXJkIGlzIHN0aWxsIG5vdCBhdmFpbGFibGUpIHRoaXMgc291cmNlIGp1c3QKLSAgICBwcm9kdWNlcyBhIGZldyBieXRlcyBvZiBlbnRyb3B5LiBTbyB5b3Ugc2hvdWxkIGFsd2F5cywgYXQgbGVhc3QgZm9yIHRoZQotICAgIHN0YXJ0dXAsIHVzZSBhbiBhZGRpdGlvbmFsIHNlZWRpbmcgc291cmNlLgotPHA+Ci08bGk+PGNvZGU+ZmlsZTovcGF0aC90by9zb3VyY2U8L2NvZGU+Ci0gICAgPHA+Ci0gICAgVGhpcyB2YXJpYW50IHVzZXMgYW4gZXh0ZXJuYWwgZmlsZSA8Y29kZT4vcGF0aC90by9zb3VyY2U8L2NvZGU+IGFzIHRoZQotICAgIHNvdXJjZSBmb3Igc2VlZGluZyB0aGUgUFJORy4gV2hlbiA8ZW0+Ynl0ZXM8L2VtPiBpcyBzcGVjaWZpZWQsIG9ubHkgdGhlCi0gICAgZmlyc3QgPGVtPmJ5dGVzPC9lbT4gbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBmaWxlIGZvcm0gdGhlIGVudHJvcHkgKGFuZAotICAgIDxlbT5ieXRlczwvZW0+IGlzIGdpdmVuIHRvIDxjb2RlPi9wYXRoL3RvL3NvdXJjZTwvY29kZT4gYXMgdGhlIGZpcnN0Ci0gICAgYXJndW1lbnQpLiBXaGVuIDxlbT5ieXRlczwvZW0+IGlzIG5vdCBzcGVjaWZpZWQgdGhlIHdob2xlIGZpbGUgZm9ybXMgdGhlCi0gICAgZW50cm9weSAoYW5kIDxjb2RlPjA8L2NvZGU+IGlzIGdpdmVuIHRvIDxjb2RlPi9wYXRoL3RvL3NvdXJjZTwvY29kZT4gYXMKLSAgICB0aGUgZmlyc3QgYXJndW1lbnQpLiBVc2UgdGhpcyBlc3BlY2lhbGx5IGF0IHN0YXJ0dXAgdGltZSwgZm9yIGluc3RhbmNlCi0gICAgd2l0aCBhbiBhdmFpbGFibGUgPGNvZGU+L2Rldi9yYW5kb208L2NvZGU+IGFuZC9vcgotICAgIDxjb2RlPi9kZXYvdXJhbmRvbTwvY29kZT4gZGV2aWNlcyAod2hpY2ggdXN1YWxseSBleGlzdCBvbiBtb2Rlcm4gVW5peAotICAgIGRlcml2YXRlcyBsaWtlIEZyZWVCU0QgYW5kIExpbnV4KS4KLSAgICA8cD4KLSAgICA8ZW0+QnV0IGJlIGNhcmVmdWw8L2VtPjogVXN1YWxseSA8Y29kZT4vZGV2L3JhbmRvbTwvY29kZT4gcHJvdmlkZXMgb25seSBhcwotICAgIG11Y2ggZW50cm9weSBkYXRhIGFzIGl0IGFjdHVhbGx5IGhhcywgaS5lLiB3aGVuIHlvdSByZXF1ZXN0IDUxMiBieXRlcyBvZgotICAgIGVudHJvcHksIGJ1dCB0aGUgZGV2aWNlIGN1cnJlbnRseSBoYXMgb25seSAxMDAgYnl0ZXMgYXZhaWxhYmxlIHR3byB0aGluZ3MKLSAgICBjYW4gaGFwcGVuOiBPbiBzb21lIHBsYXRmb3JtcyB5b3UgcmVjZWl2ZSBvbmx5IHRoZSAxMDAgYnl0ZXMgd2hpbGUgb24KLSAgICBvdGhlciBwbGF0Zm9ybXMgdGhlIHJlYWQgYmxvY2tzIHVudGlsIGVub3VnaCBieXRlcyBhcmUgYXZhaWxhYmxlICh3aGljaAotICAgIGNhbiB0YWtlIGEgbG9uZyB0aW1lKS4gSGVyZSB1c2luZyBhbiBleGlzdGluZyA8Y29kZT4vZGV2L3VyYW5kb208L2NvZGU+IGlzCi0gICAgYmV0dGVyLCBiZWNhdXNlIGl0IG5ldmVyIGJsb2NrcyBhbmQgYWN0dWFsbHkgZ2l2ZXMgdGhlIGFtb3VudCBvZiByZXF1ZXN0ZWQKLSAgICBkYXRhLiBUaGUgZHJhd2JhY2sgaXMganVzdCB0aGF0IHRoZSBxdWFsaXR5IG9mIHRoZSByZWNlaXZlZCBkYXRhIG1heSBub3QKLSAgICBiZSB0aGUgYmVzdC4KLSAgICA8cD4KLSAgICBPbiBzb21lIHBsYXRmb3JtcyBsaWtlIEZyZWVCU0Qgb25lIGNhbiBldmVuIGNvbnRyb2wgaG93IHRoZSBlbnRyb3B5IGlzCi0gICAgYWN0dWFsbHkgZ2VuZXJhdGVkLCBpLmUuIGJ5IHdoaWNoIHN5c3RlbSBpbnRlcnJ1cHRzLiBNb3JlIGRldGFpbHMgb25lIGNhbgotICAgIGZpbmQgdW5kZXIgPGk+cm5kY29udHJvbCg4KTwvaT4gb24gdGhvc2UgcGxhdGZvcm1zLiBBbHRlcm5hdGl2ZWx5LCB3aGVuCi0gICAgeW91ciBzeXN0ZW0gbGFja3Mgc3VjaCBhIHJhbmRvbSBkZXZpY2UsIHlvdSBjYW4gdXNlIHRvb2wKLSAgICBsaWtlIDxhIGhyZWY9Imh0dHA6Ly93d3cubG90aGFyLmNvbS90ZWNoL2NyeXB0by8iPkVHRDwvYT4KLSAgICAoRW50cm9weSBHYXRoZXJpbmcgRGFlbW9uKSBhbmQgcnVuIGl0J3MgY2xpZW50IHByb2dyYW0gd2l0aCB0aGUKLSAgICA8Y29kZT5leGVjOi9wYXRoL3RvL3Byb2dyYW0vPC9jb2RlPiB2YXJpYW50IChzZWUgYmVsb3cpIG9yIHVzZQotICAgIDxjb2RlPmVnZDovcGF0aC90by9lZ2Qtc29ja2V0PC9jb2RlPiAoc2VlIGJlbG93KS4KLTxwPgotPGxpPjxjb2RlPmV4ZWM6L3BhdGgvdG8vcHJvZ3JhbTwvY29kZT4KLSAgICA8cD4KLSAgICBUaGlzIHZhcmlhbnQgdXNlcyBhbiBleHRlcm5hbCBleGVjdXRhYmxlIDxjb2RlPi9wYXRoL3RvL3Byb2dyYW08L2NvZGU+IGFzCi0gICAgdGhlIHNvdXJjZSBmb3Igc2VlZGluZyB0aGUgUFJORy4gV2hlbiA8ZW0+Ynl0ZXM8L2VtPiBpcyBzcGVjaWZpZWQsIG9ubHkgdGhlCi0gICAgZmlyc3QgPGVtPmJ5dGVzPC9lbT4gbnVtYmVyIG9mIGJ5dGVzIG9mIGl0cyA8Y29kZT5zdGRvdXQ8L2NvZGU+IGNvbnRlbnRzCi0gICAgZm9ybSB0aGUgZW50cm9weS4gV2hlbiA8ZW0+Ynl0ZXM8L2VtPiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZW50aXJldHkgb2YKLSAgICB0aGUgZGF0YSBwcm9kdWNlZCBvbiA8Y29kZT5zdGRvdXQ8L2NvZGU+IGZvcm0gdGhlIGVudHJvcHkuIFVzZSB0aGlzIG9ubHkKLSAgICBhdCBzdGFydHVwIHRpbWUgd2hlbiB5b3UgbmVlZCBhIHZlcnkgc3Ryb25nIHNlZWRpbmcgd2l0aCB0aGUgaGVscCBvZiBhbgotICAgIGV4dGVybmFsIHByb2dyYW0gKGZvciBpbnN0YW5jZSBhcyBpbiB0aGUgZXhhbXBsZSBhYm92ZSB3aXRoIHRoZQotICAgIDxjb2RlPnRydWVyYW5kPC9jb2RlPiB1dGlsaXR5IHlvdSBjYW4gZmluZCBpbiB0aGUgbW9kX3NzbCBkaXN0cmlidXRpb24KLSAgICB3aGljaCBpcyBiYXNlZCBvbiB0aGUgQVQmYW1wO1QgPGVtPnRydWVyYW5kPC9lbT4gbGlicmFyeSkuIFVzaW5nIHRoaXMgaW4KLSAgICB0aGUgY29ubmVjdGlvbiBjb250ZXh0IHNsb3dzIGRvd24gdGhlIHNlcnZlciB0b28gZHJhbWF0aWNhbGx5LCBvZiBjb3Vyc2UuCi0gICAgU28gdXN1YWxseSB5b3Ugc2hvdWxkIGF2b2lkIHVzaW5nIGV4dGVybmFsIHByb2dyYW1zIGluIHRoYXQgY29udGV4dC4KLTxwPgotPGxpPjxjb2RlPmVnZDovcGF0aC90by9lZ2Qtc29ja2V0PC9jb2RlPiAoVW5peCBvbmx5KQotICAgIDxwPgotICAgIFRoaXMgdmFyaWFudCB1c2VzIHRoZSBVbml4IGRvbWFpbiBzb2NrZXQgb2YgdGhlCi0gICAgZXh0ZXJuYWwgRW50cm9weSBHYXRoZXJpbmcgRGFlbW9uIChFR0QpIChzZWUgPGEKLSAgICBocmVmPSJodHRwOi8vd3d3LmxvdGhhci5jb20vdGVjaC9jcnlwdG8vIj5odHRwOi8vd3d3LmxvdGhhci5jb20vdGVjaAotICAgIC9jcnlwdG8vPC9hPikgdG8gc2VlZCB0aGUgUFJORy4gVXNlIHRoaXMgaWYgbm8gcmFuZG9tIGRldmljZSBleGlzdHMKLSAgICBvbiB5b3VyIHBsYXRmb3JtLgotPC91bD4KLTxwPgotRXhhbXBsZToKLTxibG9ja3F1b3RlPgotPHByZT4KLVNTTFJhbmRvbVNlZWQgc3RhcnR1cCBidWlsdGluCi1TU0xSYW5kb21TZWVkIHN0YXJ0dXAgZmlsZTovZGV2L3JhbmRvbQotU1NMUmFuZG9tU2VlZCBzdGFydHVwIGZpbGU6L2Rldi91cmFuZG9tIDEwMjQKLVNTTFJhbmRvbVNlZWQgc3RhcnR1cCBleGVjOi91c3IvbG9jYWwvYmluL3RydWVyYW5kIDE2Ci1TU0xSYW5kb21TZWVkIGNvbm5lY3QgYnVpbHRpbgotU1NMUmFuZG9tU2VlZCBjb25uZWN0IGZpbGU6L2Rldi9yYW5kb20KLVNTTFJhbmRvbVNlZWQgY29ubmVjdCBmaWxlOi9kZXYvdXJhbmRvbSAxMDI0Ci08L3ByZT4KLTwvYmxvY2txdW90ZT4KLTwhLS0gU1NMU2Vzc2lvbkNhY2hlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4KLTxwPgotPGJyPgotPGEgbmFtZT0iU1NMU2Vzc2lvbkNhY2hlIj48L2E+Ci08aDI+PGEgbmFtZT0iVG9DNSI+U1NMU2Vzc2lvbkNhY2hlPC9hPjwvaDI+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBiZ2NvbG9yPSIjY2NjY2NjIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+Ci08dGQ+Ci08dGFibGUgYmdjb2xvcj0id2hpdGUiIHdpZHRoPSI2MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPgotPHRkPgotPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPjx0ZD4KLTxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+TmFtZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxiPlNTTFNlc3Npb25DYWNoZTwvYj48L3RkPjwvdHI+Ci08dHI+PHRkPgotPGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5EZXNjcmlwdGlvbjo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IFR5cGUgb2YgdGhlIGdsb2JhbC9pbnRlci1wcm9jZXNzIFNTTCBTZXNzaW9uIENhY2hlPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPlN5bnRheDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxjb2RlPlNTTFNlc3Npb25DYWNoZTwvY29kZT4gPGVtPnR5cGU8L2VtPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+RGVmYXVsdDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxjb2RlPlNTTFNlc3Npb25DYWNoZSBub25lPC9jb2RlPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+Q29udGV4dDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IHNlcnZlciBjb25maWc8L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5PdmVycmlkZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxlbT5Ob3QgYXBwbGljYWJsZTwvZW0+PC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPlN0YXR1czo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IEV4dGVuc2lvbjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5Nb2R1bGU6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBtb2Rfc3NsPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5Db21wYXRpYmlsaXR5OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gbW9kX3NzbCAyLjEgPC90ZD48L3RyPgotPC90YWJsZT4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTxwPgotVGhpcyBjb25maWd1cmVzIHRoZSBzdG9yYWdlIHR5cGUgb2YgdGhlIGdsb2JhbC9pbnRlci1wcm9jZXNzIFNTTCBTZXNzaW9uCi1DYWNoZS4gVGhpcyBjYWNoZSBpcyBhbiBvcHRpb25hbCBmYWNpbGl0eSB3aGljaCBzcGVlZHMgdXAgcGFyYWxsZWwgcmVxdWVzdAotcHJvY2Vzc2luZy4gRm9yIHJlcXVlc3RzIHRvIHRoZSBzYW1lIHNlcnZlciBwcm9jZXNzICh2aWEgSFRUUCBrZWVwLWFsaXZlKSwKLU9wZW5TU0wgYWxyZWFkeSBjYWNoZXMgdGhlIFNTTCBzZXNzaW9uIGluZm9ybWF0aW9uIGxvY2FsbHkuIEJ1dCBiZWNhdXNlIG1vZGVybgotY2xpZW50cyByZXF1ZXN0IGlubGluZWQgaW1hZ2VzIGFuZCBvdGhlciBkYXRhIHZpYSBwYXJhbGxlbCByZXF1ZXN0cyAodXN1YWxseQotdXAgdG8gZm91ciBwYXJhbGxlbCByZXF1ZXN0cyBhcmUgY29tbW9uKSB0aG9zZSByZXF1ZXN0cyBhcmUgc2VydmVkIGJ5Ci08ZW0+ZGlmZmVyZW50PC9lbT4gcHJlLWZvcmtlZCBzZXJ2ZXIgcHJvY2Vzc2VzLiBIZXJlIGFuIGludGVyLXByb2Nlc3MgY2FjaGUKLWhlbHBzIHRvIGF2b2lkIHVubmVjY2Vzc2FyeSBzZXNzaW9uIGhhbmRzaGFrZXMuCi08cD4KLVRoZSBmb2xsb3dpbmcgdHdvIHN0b3JhZ2UgPGVtPnR5cGU8L2VtPnMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6Ci08dWw+Ci08bGk+PGNvZGU+bm9uZTwvY29kZT4KLSAgICA8cD4KLSAgICBUaGlzIGlzIHRoZSBkZWZhdWx0IGFuZCBqdXN0IGRpc2FibGVzIHRoZSBnbG9iYWwvaW50ZXItcHJvY2VzcyBTZXNzaW9uCi0gICAgQ2FjaGUuIFRoZXJlIGlzIG5vIGRyYXdiYWNrIGluIGZ1bmN0aW9uYWxpdHksIGJ1dCBhIG5vdGljZWFibGUgc3BlZWQKLSAgICBwZW5hbHR5IGNhbiBiZSBvYnNlcnZlZC4KLTxwPgotPGxpPjxjb2RlPmRibTovcGF0aC90by9kYXRhZmlsZTwvY29kZT4KLSAgICA8cD4KLSAgICBUaGlzIG1ha2VzIHVzZSBvZiBhIERCTSBoYXNoZmlsZSBvbiB0aGUgbG9jYWwgZGlzayB0byBzeW5jaHJvbml6ZSB0aGUKLSAgICBsb2NhbCBPcGVuU1NMIG1lbW9yeSBjYWNoZXMgb2YgdGhlIHNlcnZlciBwcm9jZXNzZXMuIFRoZSBzbGlnaHQgaW5jcmVhc2UKLSAgICBpbiBJL08gb24gdGhlIHNlcnZlciByZXN1bHRzIGluIGEgdmlzaWJsZSByZXF1ZXN0IHNwZWVkdXAgZm9yIHlvdXIKLSAgICBjbGllbnRzLCBzbyB0aGlzIHR5cGUgb2Ygc3RvcmFnZSBpcyBnZW5lcmFsbHkgcmVjb21tZW5kZWQuCi08cD4KLTxsaT48Y29kZT5zaG06L3BhdGgvdG8vZGF0YWZpbGU8L2NvZGU+Wzxjb2RlPig8L2NvZGU+PGk+c2l6ZTwvaT48Y29kZT4pPC9jb2RlPl0KLSAgICA8cD4KLSAgICBUaGlzIG1ha2VzIHVzZSBvZiBhIGhpZ2gtcGVyZm9ybWFuY2UgaGFzaCB0YWJsZSAoYXBwcm94LiA8aT5zaXplPC9pPiBieXRlcwotICAgIGluIHNpemUpIGluc2lkZSBhIHNoYXJlZCBtZW1vcnkgc2VnbWVudCBpbiBSQU0gKGVzdGFibGlzaGVkIHZpYQotICAgIDxjb2RlPi9wYXRoL3RvL2RhdGFmaWxlPC9jb2RlPikgdG8gc3luY2hyb25pemUgdGhlIGxvY2FsIE9wZW5TU0wgbWVtb3J5Ci0gICAgY2FjaGVzIG9mIHRoZSBzZXJ2ZXIgcHJvY2Vzc2VzLiBUaGlzIHN0b3JhZ2UgdHlwZSBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbAotICAgIHBsYXRmb3Jtcy4gU2VlIHRoZSBtb2Rfc3NsIDxjb2RlPklOU1RBTEw8L2NvZGU+IGRvY3VtZW50IGZvciBkZXRhaWxzIG9uCi0gICAgaG93IHRvIGJ1aWxkIEFwYWNoZStFQVBJIHdpdGggc2hhcmVkIG1lbW9yeSBzdXBwb3J0LgotPC91bD4KLTxwPgotRXhhbXBsZXM6Ci08YmxvY2txdW90ZT4KLTxwcmU+Ci1TU0xTZXNzaW9uQ2FjaGUgZGJtOi91c3IvbG9jYWwvYXBhY2hlL2xvZ3Mvc3NsX2djYWNoZV9kYXRhCi1TU0xTZXNzaW9uQ2FjaGUgc2htOi91c3IvbG9jYWwvYXBhY2hlL2xvZ3Mvc3NsX2djYWNoZV9kYXRhKDUxMjAwMCkKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPCEtLSBTU0xTZXNzaW9uQ2FjaGVUaW1lb3V0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgotPHA+Ci08YnI+Ci08YSBuYW1lPSJTU0xTZXNzaW9uQ2FjaGVUaW1lb3V0Ij48L2E+Ci08aDI+PGEgbmFtZT0iVG9DNiI+U1NMU2Vzc2lvbkNhY2hlVGltZW91dDwvYT48L2gyPgotPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgYmdjb2xvcj0iI2NjY2NjYyIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPgotPHRkPgotPHRhYmxlIGJnY29sb3I9IndoaXRlIiB3aWR0aD0iNjAwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjUiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj4KLTx0ZD4KLTx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj48dGQ+Ci08Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPk5hbWU6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8Yj5TU0xTZXNzaW9uQ2FjaGVUaW1lb3V0PC9iPjwvdGQ+PC90cj4KLTx0cj48dGQ+Ci08Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkRlc2NyaXB0aW9uOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gTnVtYmVyIG9mIHNlY29uZHMgYmVmb3JlIGFuIFNTTCBzZXNzaW9uIGV4cGlyZXMgaW4gdGhlIFNlc3Npb24gQ2FjaGU8L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+U3ludGF4OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gPGNvZGU+U1NMU2Vzc2lvbkNhY2hlVGltZW91dDwvY29kZT4gPGVtPnNlY29uZHM8L2VtPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+RGVmYXVsdDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxjb2RlPlNTTFNlc3Npb25DYWNoZVRpbWVvdXQgMzAwPC9jb2RlPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+Q29udGV4dDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPk92ZXJyaWRlOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gPGVtPk5vdCBhcHBsaWNhYmxlPC9lbT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+U3RhdHVzOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gRXh0ZW5zaW9uPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPk1vZHVsZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IG1vZF9zc2w8L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkNvbXBhdGliaWxpdHk6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBtb2Rfc3NsIDIuMCA8L3RkPjwvdHI+Ci08L3RhYmxlPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHA+Ci1UaGlzIGRpcmVjdGl2ZSBzZXRzIHRoZSB0aW1lb3V0IGluIHNlY29uZHMgZm9yIHRoZSBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlCi1nbG9iYWwvaW50ZXItcHJvY2VzcyBTU0wgU2Vzc2lvbiBDYWNoZSBhbmQgdGhlIE9wZW5TU0wgaW50ZXJuYWwgbWVtb3J5IGNhY2hlLgotSXQgY2FuIGJlIHNldCBhcyBsb3cgYXMgMTUgZm9yIHRlc3RpbmcsIGJ1dCBzaG91bGQgYmUgc2V0IHRvIGhpZ2hlcgotdmFsdWVzIGxpa2UgMzAwIGluIHJlYWwgbGlmZS4KLTxwPgotRXhhbXBsZToKLTxibG9ja3F1b3RlPgotPHByZT4KLVNTTFNlc3Npb25DYWNoZVRpbWVvdXQgNjAwCi08L3ByZT4KLTwvYmxvY2txdW90ZT4KLTwhLS0gU1NMRW5naW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4KLTxwPgotPGJyPgotPGEgbmFtZT0iU1NMRW5naW5lIj48L2E+Ci08aDI+PGEgbmFtZT0iVG9DNyI+U1NMRW5naW5lPC9hPjwvaDI+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBiZ2NvbG9yPSIjY2NjY2NjIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+Ci08dGQ+Ci08dGFibGUgYmdjb2xvcj0id2hpdGUiIHdpZHRoPSI2MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPgotPHRkPgotPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPjx0ZD4KLTxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+TmFtZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxiPlNTTEVuZ2luZTwvYj48L3RkPjwvdHI+Ci08dHI+PHRkPgotPGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5EZXNjcmlwdGlvbjo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IFNTTCBFbmdpbmUgT3BlcmF0aW9uIFN3aXRjaDwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5TeW50YXg6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8Y29kZT5TU0xFbmdpbmU8L2NvZGU+IDxlbT5vbnxvZmY8L2VtPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+RGVmYXVsdDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxjb2RlPlNTTEVuZ2luZSBvZmY8L2NvZGU+PC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5Db250ZXh0OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+T3ZlcnJpZGU6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8ZW0+Tm90IGFwcGxpY2FibGU8L2VtPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5TdGF0dXM6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBFeHRlbnNpb248L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+TW9kdWxlOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gbW9kX3NzbDwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+Q29tcGF0aWJpbGl0eTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IG1vZF9zc2wgMi4xIDwvdGQ+PC90cj4KLTwvdGFibGU+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08cD4KLVRoaXMgZGlyZWN0aXZlIHRvZ2dsZXMgdGhlIHVzYWdlIG9mIHRoZSBTU0wvVExTIFByb3RvY29sIEVuZ2luZS4gVGhpcyBpcwotdXN1YWxseSB1c2VkIGluc2lkZSBhICZsdDtWaXJ0dWFsSG9zdCZndDsgc2VjdGlvbiB0byBlbmFibGUgU1NML1RMUyBmb3IgYQotcGFydGljdWxhciB2aXJ0dWFsIGhvc3QuIEJ5IGRlZmF1bHQgdGhlIFNTTC9UTFMgUHJvdG9jb2wgRW5naW5lIGlzIGRpc2FibGVkCi1mb3IgYm90aCB0aGUgbWFpbiBzZXJ2ZXIgYW5kIGFsbCBjb25maWd1cmVkIHZpcnR1YWwgaG9zdHMuCi08cD4KLUV4YW1wbGU6Ci08YmxvY2txdW90ZT4KLTxwcmU+Ci0mbHQ7VmlydHVhbEhvc3QgX2RlZmF1bHRfOjQ0MyZndDsKLVNTTEVuZ2luZSBvbgotLi4uCi0mbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08IS0tIFNTTFByb3RvY29sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+Ci08cD4KLTxicj4KLTxhIG5hbWU9IlNTTFByb3RvY29sIj48L2E+Ci08aDI+PGEgbmFtZT0iVG9DOCI+U1NMUHJvdG9jb2w8L2E+PC9oMj4KLTx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIGJnY29sb3I9IiNjY2NjY2MiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj4KLTx0ZD4KLTx0YWJsZSBiZ2NvbG9yPSJ3aGl0ZSIgd2lkdGg9IjYwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI1IiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+Ci08dGQ+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+PHRkPgotPGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5OYW1lOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gPGI+U1NMUHJvdG9jb2w8L2I+PC90ZD48L3RyPgotPHRyPjx0ZD4KLTxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+RGVzY3JpcHRpb246PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBDb25maWd1cmUgdXNhYmxlIFNTTCBwcm90b2NvbCBmbGF2b3JzPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPlN5bnRheDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxjb2RlPlNTTFByb3RvY29sPC9jb2RlPiBbKy1dPGVtPnByb3RvY29sPC9lbT4gLi4uPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5EZWZhdWx0OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gPGNvZGU+U1NMUHJvdG9jb2wgYWxsPC9jb2RlPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+Q29udGV4dDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPk92ZXJyaWRlOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gT3B0aW9uczwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5TdGF0dXM6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBFeHRlbnNpb248L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+TW9kdWxlOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gbW9kX3NzbDwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+Q29tcGF0aWJpbGl0eTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IG1vZF9zc2wgMi4yIDwvdGQ+PC90cj4KLTwvdGFibGU+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08cD4KLVRoaXMgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIFNTTCBwcm90b2NvbCBmbGF2b3JzIG1vZF9zc2wgc2hvdWxkCi11c2Ugd2hlbiBlc3RhYmxpc2hpbmcgaXRzIHNlcnZlciBlbnZpcm9ubWVudC4gQ2xpZW50cyB0aGVuIGNhbiBvbmx5IGNvbm5lY3QKLXdpdGggb25lIG9mIHRoZSBwcm92aWRlZCBwcm90b2NvbHMuCi08cD4KLVRoZSBhdmFpbGFibGUgKGNhc2UtaW5zZW5zaXRpdmUpIDxlbT5wcm90b2NvbDwvZW0+cyBhcmU6Ci08dWw+Ci08bGk+PGNvZGU+U1NMdjI8L2NvZGU+Ci0gICAgPHA+Ci0gICAgVGhpcyBpcyB0aGUgU2VjdXJlIFNvY2tldHMgTGF5ZXIgKFNTTCkgcHJvdG9jb2wsIHZlcnNpb24gMi4wLiBJdCBpcyB0aGUKLSAgICBvcmlnaW5hbCBTU0wgcHJvdG9jb2wgYXMgZGVzaWduZWQgYnkgTmV0c2NhcGUgQ29ycG9yYXRpb24uCi08cD4KLTxsaT48Y29kZT5TU0x2MzwvY29kZT4KLSAgICA8cD4KLSAgICBUaGlzIGlzIHRoZSBTZWN1cmUgU29ja2V0cyBMYXllciAoU1NMKSBwcm90b2NvbCwgdmVyc2lvbiAzLjAuIEl0IGlzIHRoZQotICAgIHN1Y2Nlc3NvciB0byBTU0x2MiBhbmQgdGhlIGN1cnJlbnRseSAoYXMgb2YgRmVicnVhcnkgMTk5OSkgZGUtZmFjdG8KLSAgICBzdGFuZGFyZGl6ZWQgU1NMIHByb3RvY29sIGZyb20gTmV0c2NhcGUgQ29ycG9yYXRpb24uIEl0J3Mgc3VwcG9ydGVkIGJ5Ci0gICAgYWxtb3N0IGFsbCBwb3B1bGFyIGJyb3dzZXJzLgotPHA+Ci08bGk+PGNvZGU+VExTdjE8L2NvZGU+Ci0gICAgPHA+Ci0gICAgVGhpcyBpcyB0aGUgVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IChUTFMpIHByb3RvY29sLCB2ZXJzaW9uIDEuMC4gSXQgaXMgdGhlCi0gICAgc3VjY2Vzc29yIHRvIFNTTHYzIGFuZCBjdXJyZW50bHkgKGFzIG9mIEZlYnJ1YXJ5IDE5OTkpIHN0aWxsIHVuZGVyCi0gICAgY29uc3RydWN0aW9uIGJ5IHRoZSBJbnRlcm5ldCBFbmdpbmVlcmluZyBUYXNrIEZvcmNlIChJRVRGKS4gSXQncyBzdGlsbAotICAgIG5vdCBzdXBwb3J0ZWQgYnkgYW55IHBvcHVsYXIgYnJvd3NlcnMuCi08cD4KLTxsaT48Y29kZT5BbGw8L2NvZGU+Ci0gICAgPHA+Ci0gICAgVGhpcyBpcyBhIHNob3J0Y3V0IGZvciBgYDxjb2RlPitTU0x2MiArU1NMdjMgK1RMU3YxPC9jb2RlPicnIGFuZCBhCi0gICAgY29udmluaWVudCB3YXkgZm9yIGVuYWJsaW5nIGFsbCBwcm90b2NvbHMgZXhjZXB0IG9uZSB3aGVuIHVzZWQgaW4KLSAgICBjb21iaW5hdGlvbiB3aXRoIHRoZSBtaW51cyBzaWduIG9uIGEgcHJvdG9jb2wgYXMgdGhlIGV4YW1wbGUgYWJvdmUgc2hvd3MuCi08L3VsPgotPHA+Ci1FeGFtcGxlOgotPGJsb2NrcXVvdGU+Ci08cHJlPgotIyAgIGVuYWJsZSBTU0x2MyBhbmQgVExTdjEsIGJ1dCBub3QgU1NMdjIKLVNTTFByb3RvY29sIGFsbCAtU1NMdjIKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPCEtLSBTU0xDaXBoZXJTdWl0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgotPHA+Ci08YnI+Ci08YSBuYW1lPSJTU0xDaXBoZXJTdWl0ZSI+PC9hPgotPGgyPjxhIG5hbWU9IlRvQzkiPlNTTENpcGhlclN1aXRlPC9hPjwvaDI+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBiZ2NvbG9yPSIjY2NjY2NjIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+Ci08dGQ+Ci08dGFibGUgYmdjb2xvcj0id2hpdGUiIHdpZHRoPSI2MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPgotPHRkPgotPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPjx0ZD4KLTxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+TmFtZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxiPlNTTENpcGhlclN1aXRlPC9iPjwvdGQ+PC90cj4KLTx0cj48dGQ+Ci08Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkRlc2NyaXB0aW9uOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gQ2lwaGVyIFN1aXRlIGF2YWlsYWJsZSBmb3IgbmVnb3RpYXRpb24gaW4gU1NMIGhhbmRzaGFrZTwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5TeW50YXg6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8Y29kZT5TU0xDaXBoZXJTdWl0ZTwvY29kZT4gPGVtPmNpcGhlci1zcGVjPC9lbT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkRlZmF1bHQ6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8Y29kZT5TU0xDaXBoZXJTdWl0ZSBBTEw6IUFESDpSQzQrUlNBOitISUdIOitNRURJVU06K0xPVzorU1NMdjI6K0VYUDwvY29kZT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkNvbnRleHQ6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+T3ZlcnJpZGU6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBBdXRoQ29uZmlnPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPlN0YXR1czo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IEV4dGVuc2lvbjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5Nb2R1bGU6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBtb2Rfc3NsPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5Db21wYXRpYmlsaXR5OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gbW9kX3NzbCAyLjEgPC90ZD48L3RyPgotPC90YWJsZT4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTxwPgotVGhpcyBjb21wbGV4IGRpcmVjdGl2ZSB1c2VzIGEgY29sb24tc2VwYXJhdGVkIDxlbT5jaXBoZXItc3BlYzwvZW0+IHN0cmluZwotY29uc2lzdGluZyBvZiBPcGVuU1NMIGNpcGhlciBzcGVjaWZpY2F0aW9ucyB0byBjb25maWd1cmUgdGhlIENpcGhlciBTdWl0ZSB0aGUKLWNsaWVudCBpcyBwZXJtaXR0ZWQgdG8gbmVnb3RpYXRlIGluIHRoZSBTU0wgaGFuZHNoYWtlIHBoYXNlLiBOb3RpY2UgdGhhdCB0aGlzCi1kaXJlY3RpdmUgY2FuIGJlIHVzZWQgYm90aCBpbiBwZXItc2VydmVyIGFuZCBwZXItZGlyZWN0b3J5IGNvbnRleHQuIEluCi1wZXItc2VydmVyIGNvbnRleHQgaXQgYXBwbGllcyB0byB0aGUgc3RhbmRhcmQgU1NMIGhhbmRzaGFrZSB3aGVuIGEgY29ubmVjdGlvbgotaXMgZXN0YWJsaXNoZWQuIEluIHBlci1kaXJlY3RvcnkgY29udGV4dCBpdCBmb3JjZXMgYSBTU0wgcmVuZWdvdGF0aW9uIHdpdGggdGhlCi1yZWNvbmZpZ3VyZWQgQ2lwaGVyIFN1aXRlIGFmdGVyIHRoZSBIVFRQIHJlcXVlc3Qgd2FzIHJlYWQgYnV0IGJlZm9yZSB0aGUgSFRUUAotcmVzcG9uc2UgaXMgc2VudC4KLTxwPgotQW4gU1NMIGNpcGhlciBzcGVjaWZpY2F0aW9uIGluIDxlbT5jaXBoZXItc3BlYzwvZW0+IGlzIGNvbXBvc2VkIG9mIDQgbWFqb3IKLWF0dHJpYnV0ZXMgcGx1cyBhIGZldyBleHRyYSBtaW5vciBvbmVzOgotPHVsPgotPGxpPjxlbT5LZXkgRXhjaGFuZ2UgQWxnb3JpdGhtPC9lbT46PGJyPgotICAgIFJTQSBvciBEaWZmaWUtSGVsbG1hbiB2YXJpYW50cy4KLTxwPgotPGxpPjxlbT5BdXRoZW50aWNhdGlvbiBBbGdvcml0aG08L2VtPjo8YnI+Ci0gICAgUlNBLCBEaWZmaWUtSGVsbG1hbiwgRFNTIG9yIG5vbmUuCi08cD4KLTxsaT48ZW0+Q2lwaGVyL0VuY3J5cHRpb24gQWxnb3JpdGhtPC9lbT46PGJyPgotICAgIERFUywgVHJpcGxlLURFUywgUkM0LCBSQzIsIElERUEgb3Igbm9uZS4KLTxwPgotPGxpPjxlbT5NQUMgRGlnZXN0IEFsZ29yaXRobTwvZW0+Ojxicj4KLSAgICBNRDUsIFNIQSBvciBTSEExLgotPC91bD4KLUFuIFNTTCBjaXBoZXIgY2FuIGFsc28gYmUgYW4gZXhwb3J0IGNpcGhlciBhbmQgaXMgZWl0aGVyIGEgU1NMdjIgb3IgU1NMdjMvVExTdjEKLWNpcGhlciAoaGVyZSBUTFN2MSBpcyBlcXVpdmFsZW50IHRvIFNTTHYzKS4gVG8gc3BlY2lmeSB3aGljaCBjaXBoZXJzIHRvIHVzZSwKLW9uZSBjYW4gZWl0aGVyIHNwZWNpZnkgYWxsIHRoZSBDaXBoZXJzLCBvbmUgYXQgYSB0aW1lLCBvciB1c2UgYWxpYXNlcyB0bwotc3BlY2lmeSB0aGUgcHJlZmVyZW5jZSBhbmQgb3JkZXIgZm9yIHRoZSBjaXBoZXJzIChzZWUgPGEgaHJlZj0iI3RhYmxlMSI+VGFibGUKLTE8L2E+KS4KLTxwPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxhIG5hbWU9InRhYmxlMSI+PC9hPgotPHRhYmxlIHdpZHRoPSI2MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPGNhcHRpb24gYWxpZ249ImJvdHRvbSIgaWQ9InNmIj5UYWJsZSAxOiBPcGVuU1NMIENpcGhlciBTcGVjaWZpY2F0aW9uIFRhZ3M8L2NhcHRpb24+Ci08dHI+PHRkIGJnY29sb3I9IiNjY2NjY2MiPgotPHRhYmxlIHdpZHRoPSI1OTgiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSI1OTgiIHN1bW1hcnk9IiI+Ci08dHIgaWQ9IkQiPjx0ZD48Yj5UYWc8L2I+PC90ZD4gPHRkPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci08dHIgaWQ9IkgiPjx0ZCBjb2xzcGFuPSIyIj48ZW0+S2V5IEV4Y2hhbmdlIEFsZ29yaXRobTo8L2VtPjwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPmtSU0E8L2NvZGU+PC90ZD4gICA8dGQ+UlNBIGtleSBleGNoYW5nZTwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPmtESHI8L2NvZGU+PC90ZD4gICA8dGQ+RGlmZmllLUhlbGxtYW4ga2V5IGV4Y2hhbmdlIHdpdGggUlNBIGtleTwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPmtESGQ8L2NvZGU+PC90ZD4gICA8dGQ+RGlmZmllLUhlbGxtYW4ga2V5IGV4Y2hhbmdlIHdpdGggRFNBIGtleTwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPmtFREg8L2NvZGU+PC90ZD4gICA8dGQ+RXBoZW1lcmFsICh0ZW1wLmtleSkgRGlmZmllLUhlbGxtYW4ga2V5IGV4Y2hhbmdlIChubyBjZXJ0KTwvdGQ+ICAgPC90cj4KLTx0ciBpZD0iSCI+PHRkIGNvbHNwYW49IjIiPjxlbT5BdXRoZW50aWNhdGlvbiBBbGdvcml0aG06PC9lbT48L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5hTlVMTDwvY29kZT48L3RkPiAgPHRkPk5vIGF1dGhlbnRpY2F0aW9uPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+YVJTQTwvY29kZT48L3RkPiAgIDx0ZD5SU0EgYXV0aGVudGljYXRpb248L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5hRFNTPC9jb2RlPjwvdGQ+ICAgPHRkPkRTUyBhdXRoZW50aWNhdGlvbjwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5hREg8L2NvZGU+PC90ZD4gICAgPHRkPkRpZmZpZS1IZWxsbWFuIGF1dGhlbnRpY2F0aW9uPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQgY29sc3Bhbj0iMiI+PGVtPkNpcGhlciBFbmNvZGluZyBBbGdvcml0aG06PC9lbT48L3RkPjwvdHI+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPmVOVUxMPC9jb2RlPjwvdGQ+ICA8dGQ+Tm8gZW5jb2Rpbmc8L3RkPiAgICAgICAgIDwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5ERVM8L2NvZGU+PC90ZD4gICAgPHRkPkRFUyBlbmNvZGluZzwvdGQ+ICAgICAgICA8L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+M0RFUzwvY29kZT48L3RkPiAgIDx0ZD5UcmlwbGUtREVTIGVuY29kaW5nPC90ZD4gPC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlJDNDwvY29kZT48L3RkPiAgICA8dGQ+UkM0IGVuY29kaW5nPC90ZD4gICAgICAgPC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlJDMjwvY29kZT48L3RkPiAgICA8dGQ+UkMyIGVuY29kaW5nPC90ZD4gICAgICAgPC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPklERUE8L2NvZGU+PC90ZD4gICA8dGQ+SURFQSBlbmNvZGluZzwvdGQ+ICAgICAgIDwvdHI+Ci08dHIgaWQ9IkgiPjx0ZCBjb2xzcGFuPSIyIj48ZW0+TUFDIERpZ2VzdCBBbGdvcml0aG08L2VtPjo8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5NRDU8L2NvZGU+PC90ZD4gICAgPHRkPk1ENSBoYXNoIGZ1bmN0aW9uPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U0hBMTwvY29kZT48L3RkPiAgIDx0ZD5TSEExIGhhc2ggZnVuY3Rpb248L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TSEE8L2NvZGU+PC90ZD4gICAgPHRkPlNIQSBoYXNoIGZ1bmN0aW9uPC90ZD4gPC90cj4KLTx0ciBpZD0iSCI+PHRkIGNvbHNwYW49IjIiPjxlbT5BbGlhc2VzOjwvZW0+PC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMdjI8L2NvZGU+PC90ZD4gIDx0ZD5hbGwgU1NMIHZlcnNpb24gMi4wIGNpcGhlcnM8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0x2MzwvY29kZT48L3RkPiAgPHRkPmFsbCBTU0wgdmVyc2lvbiAzLjAgY2lwaGVyczwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5UTFN2MTwvY29kZT48L3RkPiAgPHRkPmFsbCBUTFMgdmVyc2lvbiAxLjAgY2lwaGVyczwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5FWFA8L2NvZGU+PC90ZD4gICAgPHRkPmFsbCBleHBvcnQgY2lwaGVyczwvdGQ+ICA8L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+RVhQT1JUNDA8L2NvZGU+PC90ZD4gPHRkPmFsbCA0MC1iaXQgZXhwb3J0IGNpcGhlcnMgb25seTwvdGQ+ICA8L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+RVhQT1JUNTY8L2NvZGU+PC90ZD4gPHRkPmFsbCA1Ni1iaXQgZXhwb3J0IGNpcGhlcnMgb25seTwvdGQ+ICA8L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+TE9XPC9jb2RlPjwvdGQ+ICAgIDx0ZD5hbGwgbG93IHN0cmVuZ3RoIGNpcGhlcnMgKG5vIGV4cG9ydCwgc2luZ2xlIERFUyk8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5NRURJVU08L2NvZGU+PC90ZD4gPHRkPmFsbCBjaXBoZXJzIHdpdGggMTI4IGJpdCBlbmNyeXB0aW9uPC90ZD4gPC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPkhJR0g8L2NvZGU+PC90ZD4gICA8dGQ+YWxsIGNpcGhlcnMgdXNpbmcgVHJpcGxlLURFUzwvdGQ+ICAgICA8L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+UlNBPC9jb2RlPjwvdGQ+ICAgIDx0ZD5hbGwgY2lwaGVycyB1c2luZyBSU0Ega2V5IGV4Y2hhbmdlPC90ZD4gPC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPkRIPC9jb2RlPjwvdGQ+ICAgICA8dGQ+YWxsIGNpcGhlcnMgdXNpbmcgRGlmZmllLUhlbGxtYW4ga2V5IGV4Y2hhbmdlPC90ZD4gPC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPkVESDwvY29kZT48L3RkPiAgICA8dGQ+YWxsIGNpcGhlcnMgdXNpbmcgRXBoZW1lcmFsIERpZmZpZS1IZWxsbWFuIGtleSBleGNoYW5nZTwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5BREg8L2NvZGU+PC90ZD4gICAgPHRkPmFsbCBjaXBoZXJzIHVzaW5nIEFub255bW91cyBEaWZmaWUtSGVsbG1hbiBrZXkgZXhjaGFuZ2U8L3RkPiA8L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+RFNTPC9jb2RlPjwvdGQ+ICAgIDx0ZD5hbGwgY2lwaGVycyB1c2luZyBEU1MgYXV0aGVudGljYXRpb248L3RkPiA8L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+TlVMTDwvY29kZT48L3RkPiAgIDx0ZD5hbGwgY2lwaGVycyB1c2luZyBubyBlbmNyeXB0aW9uPC90ZD4gPC90cj4KLTwvdGFibGU+Ci08L3RkPgotPC90cj48L3RhYmxlPgotPC90ZD48L3RyPjwvdGFibGU+Ci08L2Rpdj4KLTxwPgotTm93IHdoZXJlIHRoaXMgYmVjb21lcyBpbnRlcmVzdGluZyBpcyB0aGF0IHRoZXNlIGNhbiBiZSBwdXQgdG9nZXRoZXIKLXRvIHNwZWNpZnkgdGhlIG9yZGVyIGFuZCBjaXBoZXJzIHlvdSB3aXNoIHRvIHVzZS4gVG8gc3BlZWQgdGhpcyB1cAotdGhlcmUgYXJlIGFsc28gYWxpYXNlcyAoPGNvZGU+U1NMdjIsIFNTTHYzLCBUTFN2MSwgRVhQLCBMT1csIE1FRElVTSwKLUhJR0g8L2NvZGU+KSBmb3IgY2VydGFpbiBncm91cHMgb2YgY2lwaGVycy4gVGhlc2UgdGFncyBjYW4gYmUgam9pbmVkCi10b2dldGhlciB3aXRoIHByZWZpeGVzIHRvIGZvcm0gdGhlIDxlbT5jaXBoZXItc3BlYzwvZW0+LiBBdmFpbGFibGUKLXByZWZpeGVzIGFyZToKLTx1bD4KLTxsaT5ub25lOiBhZGQgY2lwaGVyIHRvIGxpc3QKLTxsaT48Y29kZT4rPC9jb2RlPjogYWRkIGNpcGhlcnMgdG8gbGlzdCBhbmQgcHVsbCB0aGVtIHRvIGN1cnJlbnQgbG9jYXRpb24gaW4gbGlzdAotPGxpPjxjb2RlPi08L2NvZGU+OiByZW1vdmUgY2lwaGVyIGZyb20gbGlzdCAoY2FuIGJlIGFkZGVkIGxhdGVyIGFnYWluKQotPGxpPjxjb2RlPiE8L2NvZGU+OiBraWxsIGNpcGhlciBmcm9tIGxpc3QgY29tcGxldGVseSAoY2FuIDxiPm5vdDwvYj4gYmUgYWRkZWQgbGF0ZXIgYWdhaW4pCi08L3VsPgotQSBzaW1wbGVyIHdheSB0byBsb29rIGF0IGFsbCBvZiB0aGlzIGlzIHRvIHVzZSB0aGUgYGA8Y29kZT5vcGVuc3NsIGNpcGhlcnMKLS12PC9jb2RlPicnIGNvbW1hbmQgd2hpY2ggcHJvdmlkZXMgYSBuaWNlIHdheSB0byBzdWNjZXNzaXZlbHkgY3JlYXRlIHRoZQotY29ycmVjdCA8ZW0+Y2lwaGVyLXNwZWM8L2VtPiBzdHJpbmcuIFRoZSBkZWZhdWx0IDxlbT5jaXBoZXItc3BlYzwvZW0+IHN0cmluZwotaXMgYGA8Y29kZT5BTEw6IUFESDpSQzQrUlNBOitISUdIOitNRURJVU06K0xPVzorU1NMdjI6K0VYUDwvY29kZT4nJyB3aGljaAotbWVhbnMgdGhlIGZvbGxvd2luZzogZmlyc3QsIHJlbW92ZSBmcm9tIGNvbnNpZGVyYXRpb24gYW55IGNpcGhlcnMgdGhhdCBkbyBub3QKLWF1dGhlbnRpY2F0ZSwgaS5lLiBmb3IgU1NMIG9ubHkgdGhlIEFub255bW91cyBEaWZmaWUtSGVsbG1hbiBjaXBoZXJzLiBOZXh0LAotdXNlIGNpcGhlcnMgdXNpbmcgUkM0IGFuZCBSU0EuIE5leHQgaW5jbHVkZSB0aGUgaGlnaCwgbWVkaXVtIGFuZCB0aGVuIHRoZSBsb3cKLXNlY3VyaXR5IGNpcGhlcnMuIEZpbmFsbHkgPGVtPnB1bGw8L2VtPiBhbGwgU1NMdjIgYW5kIGV4cG9ydCBjaXBoZXJzIHRvIHRoZQotZW5kIG9mIHRoZSBsaXN0LgotPGJsb2NrcXVvdGU+Ci08cHJlPgotJCBvcGVuc3NsIGNpcGhlcnMgLXYgJ0FMTDohQURIOlJDNCtSU0E6K0hJR0g6K01FRElVTTorTE9XOitTU0x2MjorRVhQJwotTlVMTC1TSEEgICAgICAgICAgICAgICAgU1NMdjMgS3g9UlNBICAgICAgQXU9UlNBICBFbmM9Tm9uZSAgICAgIE1hYz1TSEExCi1OVUxMLU1ENSAgICAgICAgICAgICAgICBTU0x2MyBLeD1SU0EgICAgICBBdT1SU0EgIEVuYz1Ob25lICAgICAgTWFjPU1ENQotRURILVJTQS1ERVMtQ0JDMy1TSEEgICAgU1NMdjMgS3g9REggICAgICAgQXU9UlNBICBFbmM9M0RFUygxNjgpIE1hYz1TSEExCi0uLi4gICAgICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAuLi4gICAgIC4uLiAgICAgICAgICAgLi4uCi1FWFAtUkM0LU1ENSAgICAgICAgICAgICBTU0x2MyBLeD1SU0EoNTEyKSBBdT1SU0EgIEVuYz1SQzQoNDApICAgTWFjPU1ENSAgZXhwb3J0Ci1FWFAtUkMyLUNCQy1NRDUgICAgICAgICBTU0x2MiBLeD1SU0EoNTEyKSBBdT1SU0EgIEVuYz1SQzIoNDApICAgTWFjPU1ENSAgZXhwb3J0Ci1FWFAtUkM0LU1ENSAgICAgICAgICAgICBTU0x2MiBLeD1SU0EoNTEyKSBBdT1SU0EgIEVuYz1SQzQoNDApICAgTWFjPU1ENSAgZXhwb3J0Ci08L3ByZT4KLTwvYmxvY2txdW90ZT4KLVRoZSBjb21wbGV0ZSBsaXN0IG9mIHBhcnRpY3VsYXIgUlNBICZhbXA7IERIIGNpcGhlcnMgZm9yIFNTTCBpcyBnaXZlbiBpbiA8YQotaHJlZj0iI3RhYmxlMiI+VGFibGUgMjwvYT4uCi08cD4KLUV4YW1wbGU6Ci08YmxvY2txdW90ZT4KLTxwcmU+Ci1TU0xDaXBoZXJTdWl0ZSBSU0E6IUVYUDohTlVMTDorSElHSDorTUVESVVNOi1MT1cKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPHA+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGEgbmFtZT0idGFibGUyIj48L2E+Ci08dGFibGUgd2lkdGg9IjYwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08Y2FwdGlvbiBhbGlnbj0iYm90dG9tIiBpZD0ic2YiPlRhYmxlIDI6IFBhcnRpY3VsYXIgU1NMIENpcGhlcnM8L2NhcHRpb24+Ci08dHI+PHRkIGJnY29sb3I9IiNjY2NjY2MiPgotPHRhYmxlIHdpZHRoPSI1OTgiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSI1OTgiIHN1bW1hcnk9IiI+Ci08dHIgaWQ9IkQiPjx0ZD48Yj5DaXBoZXItVGFnPC9iPjwvdGQ+IDx0ZD48Yj5Qcm90b2NvbDwvYj48L3RkPiA8dGQ+PGI+S2V5IEV4LjwvYj48L3RkPiA8dGQ+PGI+QXV0aC48L2I+PC90ZD4gPHRkPjxiPkVuYy48L2I+PC90ZD4gPHRkPjxiPk1BQzwvYj48L3RkPiA8dGQ+PGI+VHlwZTwvYj48L3RkPiA8L3RyPgotPHRyIGlkPSJIIj48dGQgY29sc3Bhbj0iNyI+PGVtPlJTQSBDaXBoZXJzOjwvZW0+PC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+REVTLUNCQzMtU0hBPC9jb2RlPjwvdGQ+IDx0ZD5TU0x2MzwvdGQ+IDx0ZD5SU0E8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPjNERVMoMTY4KTwvdGQ+IDx0ZD5TSEExPC90ZD4gPHRkPiZuYnNwOzwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5ERVMtQ0JDMy1NRDU8L2NvZGU+PC90ZD4gPHRkPlNTTHYyPC90ZD4gPHRkPlJTQTwvdGQ+IDx0ZD5SU0E8L3RkPiA8dGQ+M0RFUygxNjgpPC90ZD4gPHRkPk1ENTwvdGQ+IDx0ZD4mbmJzcDsgPC90ZD4gPC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPklERUEtQ0JDLVNIQTwvY29kZT48L3RkPiA8dGQ+U1NMdjM8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPlJTQTwvdGQ+IDx0ZD5JREVBKDEyOCk8L3RkPiA8dGQ+U0hBMTwvdGQ+IDx0ZD4mbmJzcDs8L3RkPiA8L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+UkM0LVNIQTwvY29kZT48L3RkPiA8dGQ+U1NMdjM8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPlJTQTwvdGQ+IDx0ZD5SQzQoMTI4KTwvdGQ+IDx0ZD5TSEExPC90ZD4gPHRkPiZuYnNwOzwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5SQzQtTUQ1PC9jb2RlPjwvdGQ+IDx0ZD5TU0x2MzwvdGQ+IDx0ZD5SU0E8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPlJDNCgxMjgpPC90ZD4gPHRkPk1ENTwvdGQ+IDx0ZD4mbmJzcDsgPC90ZD4gPC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPklERUEtQ0JDLU1ENTwvY29kZT48L3RkPiA8dGQ+U1NMdjI8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPlJTQTwvdGQ+IDx0ZD5JREVBKDEyOCk8L3RkPiA8dGQ+TUQ1PC90ZD4gPHRkPiZuYnNwOyA8L3RkPiA8L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+UkMyLUNCQy1NRDU8L2NvZGU+PC90ZD4gPHRkPlNTTHYyPC90ZD4gPHRkPlJTQTwvdGQ+IDx0ZD5SU0E8L3RkPiA8dGQ+UkMyKDEyOCk8L3RkPiA8dGQ+TUQ1PC90ZD4gPHRkPiZuYnNwOyA8L3RkPiA8L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+UkM0LU1ENTwvY29kZT48L3RkPiA8dGQ+U1NMdjI8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPlJTQTwvdGQ+IDx0ZD5SQzQoMTI4KTwvdGQ+IDx0ZD5NRDU8L3RkPiA8dGQ+Jm5ic3A7IDwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5ERVMtQ0JDLVNIQTwvY29kZT48L3RkPiA8dGQ+U1NMdjM8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPlJTQTwvdGQ+IDx0ZD5ERVMoNTYpPC90ZD4gPHRkPlNIQTE8L3RkPiA8dGQ+Jm5ic3A7PC90ZD4gPC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlJDNC02NC1NRDU8L2NvZGU+PC90ZD4gPHRkPlNTTHYyPC90ZD4gPHRkPlJTQTwvdGQ+IDx0ZD5SU0E8L3RkPiA8dGQ+UkM0KDY0KTwvdGQ+IDx0ZD5NRDU8L3RkPiA8dGQ+Jm5ic3A7IDwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5ERVMtQ0JDLU1ENTwvY29kZT48L3RkPiA8dGQ+U1NMdjI8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPlJTQTwvdGQ+IDx0ZD5ERVMoNTYpPC90ZD4gPHRkPk1ENTwvdGQ+IDx0ZD4mbmJzcDsgPC90ZD4gPC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPkVYUC1ERVMtQ0JDLVNIQTwvY29kZT48L3RkPiA8dGQ+U1NMdjM8L3RkPiA8dGQ+UlNBKDUxMik8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPkRFUyg0MCk8L3RkPiA8dGQ+U0hBMTwvdGQ+IDx0ZD4gZXhwb3J0PC90ZD4gPC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPkVYUC1SQzItQ0JDLU1ENTwvY29kZT48L3RkPiA8dGQ+U1NMdjM8L3RkPiA8dGQ+UlNBKDUxMik8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPlJDMig0MCk8L3RkPiA8dGQ+TUQ1PC90ZD4gPHRkPiAgZXhwb3J0PC90ZD4gPC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPkVYUC1SQzQtTUQ1PC9jb2RlPjwvdGQ+IDx0ZD5TU0x2MzwvdGQ+IDx0ZD5SU0EoNTEyKTwvdGQ+IDx0ZD5SU0E8L3RkPiA8dGQ+UkM0KDQwKTwvdGQ+IDx0ZD5NRDU8L3RkPiA8dGQ+ICBleHBvcnQ8L3RkPiA8L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+RVhQLVJDMi1DQkMtTUQ1PC9jb2RlPjwvdGQ+IDx0ZD5TU0x2MjwvdGQ+IDx0ZD5SU0EoNTEyKTwvdGQ+IDx0ZD5SU0E8L3RkPiA8dGQ+UkMyKDQwKTwvdGQ+IDx0ZD5NRDU8L3RkPiA8dGQ+ICBleHBvcnQ8L3RkPiA8L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+RVhQLVJDNC1NRDU8L2NvZGU+PC90ZD4gPHRkPlNTTHYyPC90ZD4gPHRkPlJTQSg1MTIpPC90ZD4gPHRkPlJTQTwvdGQ+IDx0ZD5SQzQoNDApPC90ZD4gPHRkPk1ENTwvdGQ+IDx0ZD4gIGV4cG9ydDwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5OVUxMLVNIQTwvY29kZT48L3RkPiA8dGQ+U1NMdjM8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPlJTQTwvdGQ+IDx0ZD5Ob25lPC90ZD4gPHRkPlNIQTE8L3RkPiA8dGQ+Jm5ic3A7PC90ZD4gPC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPk5VTEwtTUQ1PC9jb2RlPjwvdGQ+IDx0ZD5TU0x2MzwvdGQ+IDx0ZD5SU0E8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPk5vbmU8L3RkPiA8dGQ+TUQ1PC90ZD4gPHRkPiZuYnNwOyA8L3RkPiA8L3RyPgotPHRyIGlkPSJEIj48dGQgY29sc3Bhbj0iNyI+PGVtPkRpZmZpZS1IZWxsbWFuIENpcGhlcnM6PC9lbT48L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5BREgtREVTLUNCQzMtU0hBPC9jb2RlPjwvdGQ+IDx0ZD5TU0x2MzwvdGQ+IDx0ZD5ESDwvdGQ+IDx0ZD5Ob25lPC90ZD4gPHRkPjNERVMoMTY4KTwvdGQ+IDx0ZD5TSEExPC90ZD4gPHRkPiZuYnNwOzwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5BREgtREVTLUNCQy1TSEE8L2NvZGU+PC90ZD4gPHRkPlNTTHYzPC90ZD4gPHRkPkRIPC90ZD4gPHRkPk5vbmU8L3RkPiA8dGQ+REVTKDU2KTwvdGQ+IDx0ZD5TSEExPC90ZD4gPHRkPiZuYnNwOzwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5BREgtUkM0LU1ENTwvY29kZT48L3RkPiA8dGQ+U1NMdjM8L3RkPiA8dGQ+REg8L3RkPiA8dGQ+Tm9uZTwvdGQ+IDx0ZD5SQzQoMTI4KTwvdGQ+IDx0ZD5NRDU8L3RkPiA8dGQ+Jm5ic3A7IDwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5FREgtUlNBLURFUy1DQkMzLVNIQTwvY29kZT48L3RkPiA8dGQ+U1NMdjM8L3RkPiA8dGQ+REg8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPjNERVMoMTY4KTwvdGQ+IDx0ZD5TSEExPC90ZD4gPHRkPiZuYnNwOzwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5FREgtRFNTLURFUy1DQkMzLVNIQTwvY29kZT48L3RkPiA8dGQ+U1NMdjM8L3RkPiA8dGQ+REg8L3RkPiA8dGQ+RFNTPC90ZD4gPHRkPjNERVMoMTY4KTwvdGQ+IDx0ZD5TSEExPC90ZD4gPHRkPiZuYnNwOzwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5FREgtUlNBLURFUy1DQkMtU0hBPC9jb2RlPjwvdGQ+IDx0ZD5TU0x2MzwvdGQ+IDx0ZD5ESDwvdGQ+IDx0ZD5SU0E8L3RkPiA8dGQ+REVTKDU2KTwvdGQ+IDx0ZD5TSEExPC90ZD4gPHRkPiZuYnNwOzwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5FREgtRFNTLURFUy1DQkMtU0hBPC9jb2RlPjwvdGQ+IDx0ZD5TU0x2MzwvdGQ+IDx0ZD5ESDwvdGQ+IDx0ZD5EU1M8L3RkPiA8dGQ+REVTKDU2KTwvdGQ+IDx0ZD5TSEExPC90ZD4gPHRkPiZuYnNwOzwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5FWFAtRURILVJTQS1ERVMtQ0JDLVNIQTwvY29kZT48L3RkPiA8dGQ+U1NMdjM8L3RkPiA8dGQ+REgoNTEyKTwvdGQ+IDx0ZD5SU0E8L3RkPiA8dGQ+REVTKDQwKTwvdGQ+IDx0ZD5TSEExPC90ZD4gPHRkPiBleHBvcnQ8L3RkPiA8L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+RVhQLUVESC1EU1MtREVTLUNCQy1TSEE8L2NvZGU+PC90ZD4gPHRkPlNTTHYzPC90ZD4gPHRkPkRIKDUxMik8L3RkPiA8dGQ+RFNTPC90ZD4gPHRkPkRFUyg0MCk8L3RkPiA8dGQ+U0hBMTwvdGQ+IDx0ZD4gZXhwb3J0PC90ZD4gPC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPkVYUC1BREgtREVTLUNCQy1TSEE8L2NvZGU+PC90ZD4gPHRkPlNTTHYzPC90ZD4gPHRkPkRIKDUxMik8L3RkPiA8dGQ+Tm9uZTwvdGQ+IDx0ZD5ERVMoNDApPC90ZD4gPHRkPlNIQTE8L3RkPiA8dGQ+IGV4cG9ydDwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5FWFAtQURILVJDNC1NRDU8L2NvZGU+PC90ZD4gPHRkPlNTTHYzPC90ZD4gPHRkPkRIKDUxMik8L3RkPiA8dGQ+Tm9uZTwvdGQ+IDx0ZD5SQzQoNDApPC90ZD4gPHRkPk1ENTwvdGQ+IDx0ZD4gIGV4cG9ydDwvdGQ+IDwvdHI+Ci08L3RhYmxlPgotPC90ZD4KLTwvdHI+PC90YWJsZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotPC9kaXY+Ci08IS0tIFNTTENlcnRpZmljYXRlRmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+Ci08cD4KLTxicj4KLTxhIG5hbWU9IlNTTENlcnRpZmljYXRlRmlsZSI+PC9hPgotPGgyPjxhIG5hbWU9IlRvQzEwIj5TU0xDZXJ0aWZpY2F0ZUZpbGU8L2E+PC9oMj4KLTx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIGJnY29sb3I9IiNjY2NjY2MiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj4KLTx0ZD4KLTx0YWJsZSBiZ2NvbG9yPSJ3aGl0ZSIgd2lkdGg9IjYwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI1IiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+Ci08dGQ+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+PHRkPgotPGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5OYW1lOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gPGI+U1NMQ2VydGlmaWNhdGVGaWxlPC9iPjwvdGQ+PC90cj4KLTx0cj48dGQ+Ci08Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkRlc2NyaXB0aW9uOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gU2VydmVyIFBFTS1lbmNvZGVkIFguNTA5IENlcnRpZmljYXRlIGZpbGU8L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+U3ludGF4OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gPGNvZGU+U1NMQ2VydGlmaWNhdGVGaWxlPC9jb2RlPiA8ZW0+ZmlsZW5hbWU8L2VtPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+RGVmYXVsdDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxlbT5Ob25lPC9lbT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkNvbnRleHQ6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5PdmVycmlkZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxlbT5Ob3QgYXBwbGljYWJsZTwvZW0+PC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPlN0YXR1czo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IEV4dGVuc2lvbjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5Nb2R1bGU6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBtb2Rfc3NsPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5Db21wYXRpYmlsaXR5OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gbW9kX3NzbCAyLjAgPC90ZD48L3RyPgotPC90YWJsZT4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTxwPgotVGhpcyBkaXJlY3RpdmUgcG9pbnRzIHRvIHRoZSBQRU0tZW5jb2RlZCBDZXJ0aWZpY2F0ZSBmaWxlIGZvciB0aGUgc2VydmVyIGFuZAotb3B0aW9uYWxseSBhbHNvIHRvIHRoZSBjb3JyZXNwb25kaW5nIFJTQSBvciBEU0EgUHJpdmF0ZSBLZXkgZmlsZSBmb3IgaXQKLShjb250YWluZWQgaW4gdGhlIHNhbWUgZmlsZSkuIElmIHRoZSBjb250YWluZWQgUHJpdmF0ZSBLZXkgaXMgZW5jcnlwdGVkIHRoZQotUGFzcyBQaHJhc2UgZGlhbG9nIGlzIGZvcmNlZCBhdCBzdGFydHVwIHRpbWUuIFRoaXMgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHVwIHRvCi10d28gdGltZXMgKHJlZmVyZW5jaW5nIGRpZmZlcmVudCBmaWxlbmFtZXMpIHdoZW4gYm90aCBhIFJTQSBhbmQgYSBEU0EgYmFzZWQKLXNlcnZlciBjZXJ0aWZpY2F0ZSBpcyB1c2VkIGluIHBhcmFsbGVsLgotPHA+Ci1FeGFtcGxlOgotPGJsb2NrcXVvdGU+Ci08cHJlPgotU1NMQ2VydGlmaWNhdGVGaWxlIC91c3IvbG9jYWwvYXBhY2hlL2NvbmYvc3NsLmNydC9zZXJ2ZXIuY3J0Ci08L3ByZT4KLTwvYmxvY2txdW90ZT4KLTwhLS0gU1NMQ2VydGlmaWNhdGVLZXlGaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4KLTxwPgotPGJyPgotPGEgbmFtZT0iU1NMQ2VydGlmaWNhdGVLZXlGaWxlIj48L2E+Ci08aDI+PGEgbmFtZT0iVG9DMTEiPlNTTENlcnRpZmljYXRlS2V5RmlsZTwvYT48L2gyPgotPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgYmdjb2xvcj0iI2NjY2NjYyIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPgotPHRkPgotPHRhYmxlIGJnY29sb3I9IndoaXRlIiB3aWR0aD0iNjAwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjUiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj4KLTx0ZD4KLTx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj48dGQ+Ci08Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPk5hbWU6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8Yj5TU0xDZXJ0aWZpY2F0ZUtleUZpbGU8L2I+PC90ZD48L3RyPgotPHRyPjx0ZD4KLTxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+RGVzY3JpcHRpb246PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBTZXJ2ZXIgUEVNLWVuY29kZWQgUHJpdmF0ZSBLZXkgZmlsZTwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5TeW50YXg6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8Y29kZT5TU0xDZXJ0aWZpY2F0ZUtleUZpbGU8L2NvZGU+IDxlbT5maWxlbmFtZTwvZW0+PC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5EZWZhdWx0OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gPGVtPk5vbmU8L2VtPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+Q29udGV4dDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPk92ZXJyaWRlOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gPGVtPk5vdCBhcHBsaWNhYmxlPC9lbT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+U3RhdHVzOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gRXh0ZW5zaW9uPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPk1vZHVsZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IG1vZF9zc2w8L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkNvbXBhdGliaWxpdHk6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBtb2Rfc3NsIDIuMCA8L3RkPjwvdHI+Ci08L3RhYmxlPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHA+Ci1UaGlzIGRpcmVjdGl2ZSBwb2ludHMgdG8gdGhlIFBFTS1lbmNvZGVkIFByaXZhdGUgS2V5IGZpbGUgZm9yIHRoZSBzZXJ2ZXIuIElmCi10aGUgUHJpdmF0ZSBLZXkgaXMgbm90IGNvbWJpbmVkIHdpdGggdGhlIENlcnRpZmljYXRlIGluIHRoZQotPGNvZGU+U1NMQ2VydGlmaWNhdGVGaWxlPC9jb2RlPiwgdXNlIHRoaXMgYWRkaXRpb25hbCBkaXJlY3RpdmUgdG8gcG9pbnQgdG8gdGhlCi1maWxlIHdpdGggdGhlIHN0YW5kLWFsb25lIFByaXZhdGUgS2V5LiBXaGVuIDxjb2RlPlNTTENlcnRpZmljYXRlRmlsZTwvY29kZT4KLWlzIHVzZWQgYW5kIHRoZSBmaWxlIGNvbnRhaW5zIGJvdGggdGhlIENlcnRpZmljYXRlIGFuZCB0aGUgUHJpdmF0ZSBLZXkgdGhpcwotZGlyZWN0aXZlIG5lZWQgbm90IGJlIHVzZWQuIEJ1dCB3ZSBzdHJvbmdseSBkaXNjb3VyYWdlIHRoaXMgcHJhY3RpY2UuCi1JbnN0ZWFkIHdlIHJlY29tbWVuZCB5b3UgdG8gc2VwYXJhdGUgdGhlIENlcnRpZmljYXRlIGFuZCB0aGUgUHJpdmF0ZSBLZXkuIElmCi10aGUgY29udGFpbmVkIFByaXZhdGUgS2V5IGlzIGVuY3J5cHRlZCwgdGhlIFBhc3MgUGhyYXNlIGRpYWxvZyBpcyBmb3JjZWQgYXQKLXN0YXJ0dXAgdGltZS4gVGhpcyBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdXAgdG8gdHdvIHRpbWVzIChyZWZlcmVuY2luZwotZGlmZmVyZW50IGZpbGVuYW1lcykgd2hlbiBib3RoIGEgUlNBIGFuZCBhIERTQSBiYXNlZCBwcml2YXRlIGtleSBpcyB1c2VkIGluCi1wYXJhbGxlbC4KLTxwPgotRXhhbXBsZToKLTxibG9ja3F1b3RlPgotPHByZT4KLVNTTENlcnRpZmljYXRlS2V5RmlsZSAvdXNyL2xvY2FsL2FwYWNoZS9jb25mL3NzbC5rZXkvc2VydmVyLmtleQotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08IS0tIFNTTENlcnRpZmljYXRlQ2hhaW5GaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+Ci08cD4KLTxicj4KLTxhIG5hbWU9IlNTTENlcnRpZmljYXRlQ2hhaW5GaWxlIj48L2E+Ci08aDI+PGEgbmFtZT0iVG9DMTIiPlNTTENlcnRpZmljYXRlQ2hhaW5GaWxlPC9hPjwvaDI+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBiZ2NvbG9yPSIjY2NjY2NjIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+Ci08dGQ+Ci08dGFibGUgYmdjb2xvcj0id2hpdGUiIHdpZHRoPSI2MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPgotPHRkPgotPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPjx0ZD4KLTxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+TmFtZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxiPlNTTENlcnRpZmljYXRlQ2hhaW5GaWxlPC9iPjwvdGQ+PC90cj4KLTx0cj48dGQ+Ci08Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkRlc2NyaXB0aW9uOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gRmlsZSBvZiBQRU0tZW5jb2RlZCBTZXJ2ZXIgQ0EgQ2VydGlmaWNhdGVzPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPlN5bnRheDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxjb2RlPlNTTENlcnRpZmljYXRlQ2hhaW5GaWxlPC9jb2RlPiA8ZW0+ZmlsZW5hbWU8L2VtPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+RGVmYXVsdDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxlbT5Ob25lPC9lbT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkNvbnRleHQ6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5PdmVycmlkZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxlbT5Ob3QgYXBwbGljYWJsZTwvZW0+PC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPlN0YXR1czo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IEV4dGVuc2lvbjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5Nb2R1bGU6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBtb2Rfc3NsPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5Db21wYXRpYmlsaXR5OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gbW9kX3NzbCAyLjMuNiA8L3RkPjwvdHI+Ci08L3RhYmxlPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHA+Ci1UaGlzIGRpcmVjdGl2ZSBzZXRzIHRoZSBvcHRpb25hbCA8ZW0+YWxsLWluLW9uZTwvZW0+IGZpbGUgd2hlcmUgeW91IGNhbgotYXNzZW1ibGUgdGhlIGNlcnRpZmljYXRlcyBvZiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0aWVzIChDQSkgd2hpY2ggZm9ybSB0aGUKLWNlcnRpZmljYXRlIGNoYWluIG9mIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUuIFRoaXMgc3RhcnRzIHdpdGggdGhlIGlzc3VpbmcgQ0EKLWNlcnRpZmljYXRlIG9mIG9mIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgYW5kIGNhbiByYW5nZSB1cCB0byB0aGUgcm9vdCBDQQotY2VydGlmaWNhdGUuIFN1Y2ggYSBmaWxlIGlzIHNpbXBseSB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgdmFyaW91cwotUEVNLWVuY29kZWQgQ0EgQ2VydGlmaWNhdGUgZmlsZXMsIHVzdWFsbHkgaW4gY2VydGlmaWNhdGUgY2hhaW4gb3JkZXIuCi08cD4KLVRoaXMgc2hvdWxkIGJlIHVzZWQgYWx0ZXJuYXRpdmVseSBhbmQvb3IgYWRkaXRpb25hbGx5IHRvIDxhCi1ocmVmPSIjU1NMQ0FDZXJ0aWZpY2F0ZVBhdGgiPlNTTENBQ2VydGlmaWNhdGVQYXRoPC9hPiBmb3IgZXhwbGljaXRseQotY29uc3RydWN0aW5nIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgY2hhaW4gd2hpY2ggaXMgc2VudCB0byB0aGUgYnJvd3NlciBpbgotYWRkaXRpb24gdG8gdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZS4gSXQgaXMgZXNwZWNpYWxseSB1c2VmdWwgdG8gYXZvaWQgY29uZmxpY3RzCi13aXRoIENBIGNlcnRpZmljYXRlcyB3aGVuIHVzaW5nIGNsaWVudCBhdXRoZW50aWNhdGlvbi4gQmVjYXVzZSBhbHRob3VnaAotcGxhY2luZyBhIENBIGNlcnRpZmljYXRlIG9mIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgY2hhaW4gaW50byA8YQotaHJlZj0iI1NTTENBQ2VydGlmaWNhdGVQYXRoIj5TU0xDQUNlcnRpZmljYXRlUGF0aDwvYT4gaGFzIHRoZSBzYW1lIGVmZmVjdCBmb3IKLXRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiBjb25zdHJ1Y3Rpb24sIGl0IGhhcyB0aGUgc2lkZS1lZmZlY3QgdGhhdCBjbGllbnQKLWNlcnRpZmljYXRlcyBpc3N1ZWQgYnkgdGhpcyBzYW1lIENBIGNlcnRpZmljYXRlIGFyZSBhbHNvIGFjY2VwdGVkIG9uIGNsaWVudAotYXV0aGVudGljYXRpb24uIFRoYXQncyB1c3VhbGx5IG5vdCBvbmUgZXhwZWN0LgotPHA+Ci1CdXQgYmUgY2FyZWZ1bDogUHJvdmlkaW5nIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiB3b3JrcyBvbmx5IGlmIHlvdSBhcmUgdXNpbmcgYQotPGk+c2luZ2xlPC9pPiAoZWl0aGVyIFJTQSA8aT5vcjwvaT4gRFNBKSBiYXNlZCBzZXJ2ZXIgY2VydGlmaWNhdGUuIElmIHlvdSBhcmUKLXVzaW5nIGEgY291cGxlZCBSU0ErRFNBIGNlcnRpZmljYXRlIHBhaXIsIHRoaXMgd2lsbCB3b3JrIG9ubHkgaWYgYWN0dWFsbHkgYm90aAotY2VydGlmaWNhdGVzIHVzZSB0aGUgPGk+c2FtZTwvaT4gY2VydGlmaWNhdGUgY2hhaW4uIEVsc2UgdGhlIGJyb3dzZXJzIHdpbGwgYmUKLWNvbmZ1c2VkIGluIHRoaXMgc2l0dWF0aW9uLgotPHA+Ci1FeGFtcGxlOgotPGJsb2NrcXVvdGU+Ci08cHJlPgotU1NMQ2VydGlmaWNhdGVDaGFpbkZpbGUgL3Vzci9sb2NhbC9hcGFjaGUvY29uZi9zc2wuY3J0L2NhLmNydAotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08IS0tIFNTTENBQ2VydGlmaWNhdGVQYXRoIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+Ci08cD4KLTxicj4KLTxhIG5hbWU9IlNTTENBQ2VydGlmaWNhdGVQYXRoIj48L2E+Ci08aDI+PGEgbmFtZT0iVG9DMTMiPlNTTENBQ2VydGlmaWNhdGVQYXRoPC9hPjwvaDI+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBiZ2NvbG9yPSIjY2NjY2NjIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+Ci08dGQ+Ci08dGFibGUgYmdjb2xvcj0id2hpdGUiIHdpZHRoPSI2MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPgotPHRkPgotPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPjx0ZD4KLTxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+TmFtZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxiPlNTTENBQ2VydGlmaWNhdGVQYXRoPC9iPjwvdGQ+PC90cj4KLTx0cj48dGQ+Ci08Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkRlc2NyaXB0aW9uOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gRGlyZWN0b3J5IG9mIFBFTS1lbmNvZGVkIENBIENlcnRpZmljYXRlcyBmb3IgQ2xpZW50IEF1dGguPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPlN5bnRheDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxjb2RlPlNTTENBQ2VydGlmaWNhdGVQYXRoPC9jb2RlPiA8ZW0+ZGlyZWN0b3J5PC9lbT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkRlZmF1bHQ6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8ZW0+Tm9uZTwvZW0+PC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5Db250ZXh0OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+T3ZlcnJpZGU6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8ZW0+Tm90IGFwcGxpY2FibGU8L2VtPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5TdGF0dXM6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBFeHRlbnNpb248L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+TW9kdWxlOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gbW9kX3NzbDwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+Q29tcGF0aWJpbGl0eTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IG1vZF9zc2wgMi4wIDwvdGQ+PC90cj4KLTwvdGFibGU+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08cD4KLVRoaXMgZGlyZWN0aXZlIHNldHMgdGhlIGRpcmVjdG9yeSB3aGVyZSB5b3Uga2VlcCB0aGUgQ2VydGlmaWNhdGVzIG9mCi1DZXJ0aWZpY2F0aW9uIEF1dGhvcml0aWVzIChDQXMpIHdob3NlIGNsaWVudHMgeW91IGRlYWwgd2l0aC4gVGhlc2UgYXJlIHVzZWQgdG8KLXZlcmlmeSB0aGUgY2xpZW50IGNlcnRpZmljYXRlIG9uIENsaWVudCBBdXRoZW50aWNhdGlvbi4KLTxwPgotVGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGhhdmUgdG8gYmUgUEVNLWVuY29kZWQgYW5kIGFyZSBhY2Nlc3NlZCB0aHJvdWdoCi1oYXNoIGZpbGVuYW1lcy4gU28gdXN1YWxseSB5b3UgY2FuJ3QganVzdCBwbGFjZSB0aGUgQ2VydGlmaWNhdGUgZmlsZXMKLXRoZXJlOiB5b3UgYWxzbyBoYXZlIHRvIGNyZWF0ZSBzeW1ib2xpYyBsaW5rcyBuYW1lZAotPGk+aGFzaC12YWx1ZTwvaT48dHQ+Lk48L3R0Pi4gQW5kIHlvdSBzaG91bGQgYWx3YXlzIG1ha2Ugc3VyZSB0aGlzIGRpcmVjdG9yeQotY29udGFpbnMgdGhlIGFwcHJvcHJpYXRlIHN5bWJvbGljIGxpbmtzLiBVc2UgdGhlIDxjb2RlPk1ha2VmaWxlPC9jb2RlPiB3aGljaAotY29tZXMgd2l0aCBtb2Rfc3NsIHRvIGFjY29tcGxpc2ggdGhpcyB0YXNrLgotPHA+Ci1FeGFtcGxlOgotPGJsb2NrcXVvdGU+Ci08cHJlPgotU1NMQ0FDZXJ0aWZpY2F0ZVBhdGggL3Vzci9sb2NhbC9hcGFjaGUvY29uZi9zc2wuY3J0LwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08IS0tIFNTTENBQ2VydGlmaWNhdGVGaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+Ci08cD4KLTxicj4KLTxhIG5hbWU9IlNTTENBQ2VydGlmaWNhdGVGaWxlIj48L2E+Ci08aDI+PGEgbmFtZT0iVG9DMTQiPlNTTENBQ2VydGlmaWNhdGVGaWxlPC9hPjwvaDI+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBiZ2NvbG9yPSIjY2NjY2NjIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+Ci08dGQ+Ci08dGFibGUgYmdjb2xvcj0id2hpdGUiIHdpZHRoPSI2MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPgotPHRkPgotPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPjx0ZD4KLTxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+TmFtZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxiPlNTTENBQ2VydGlmaWNhdGVGaWxlPC9iPjwvdGQ+PC90cj4KLTx0cj48dGQ+Ci08Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkRlc2NyaXB0aW9uOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gRmlsZSBvZiBjb25jYXRlbmF0ZWQgUEVNLWVuY29kZWQgQ0EgQ2VydGlmaWNhdGVzIGZvciBDbGllbnQgQXV0aC48L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+U3ludGF4OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gPGNvZGU+U1NMQ0FDZXJ0aWZpY2F0ZUZpbGU8L2NvZGU+IDxlbT5maWxlbmFtZTwvZW0+PC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5EZWZhdWx0OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gPGVtPk5vbmU8L2VtPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+Q29udGV4dDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPk92ZXJyaWRlOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gPGVtPk5vdCBhcHBsaWNhYmxlPC9lbT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+U3RhdHVzOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gRXh0ZW5zaW9uPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPk1vZHVsZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IG1vZF9zc2w8L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkNvbXBhdGliaWxpdHk6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBtb2Rfc3NsIDIuMCA8L3RkPjwvdHI+Ci08L3RhYmxlPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHA+Ci1UaGlzIGRpcmVjdGl2ZSBzZXRzIHRoZSA8ZW0+YWxsLWluLW9uZTwvZW0+IGZpbGUgd2hlcmUgeW91IGNhbiBhc3NlbWJsZSB0aGUKLUNlcnRpZmljYXRlcyBvZiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0aWVzIChDQSkgd2hvc2UgPGVtPmNsaWVudHM8L2VtPiB5b3UgZGVhbAotd2l0aC4gVGhlc2UgYXJlIHVzZWQgZm9yIENsaWVudCBBdXRoZW50aWNhdGlvbi4gU3VjaCBhIGZpbGUgaXMgc2ltcGx5IHRoZQotY29uY2F0ZW5hdGlvbiBvZiB0aGUgdmFyaW91cyBQRU0tZW5jb2RlZCBDZXJ0aWZpY2F0ZSBmaWxlcywgaW4gb3JkZXIgb2YKLXByZWZlcmVuY2UuIFRoaXMgY2FuIGJlIHVzZWQgYWx0ZXJuYXRpdmVseSBhbmQvb3IgYWRkaXRpb25hbGx5IHRvIDxhCi1ocmVmPSIjU1NMQ0FDZXJ0aWZpY2F0ZVBhdGgiPlNTTENBQ2VydGlmaWNhdGVQYXRoPC9hPi4KLTxwPgotRXhhbXBsZToKLTxibG9ja3F1b3RlPgotPHByZT4KLVNTTENBQ2VydGlmaWNhdGVGaWxlIC91c3IvbG9jYWwvYXBhY2hlL2NvbmYvc3NsLmNydC9jYS1idW5kbGUtY2xpZW50LmNydAotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08IS0tIFNTTENBUmV2b2NhdGlvblBhdGggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+Ci08cD4KLTxicj4KLTxhIG5hbWU9IlNTTENBUmV2b2NhdGlvblBhdGgiPjwvYT4KLTxoMj48YSBuYW1lPSJUb0MxNSI+U1NMQ0FSZXZvY2F0aW9uUGF0aDwvYT48L2gyPgotPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgYmdjb2xvcj0iI2NjY2NjYyIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPgotPHRkPgotPHRhYmxlIGJnY29sb3I9IndoaXRlIiB3aWR0aD0iNjAwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjUiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj4KLTx0ZD4KLTx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj48dGQ+Ci08Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPk5hbWU6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8Yj5TU0xDQVJldm9jYXRpb25QYXRoPC9iPjwvdGQ+PC90cj4KLTx0cj48dGQ+Ci08Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkRlc2NyaXB0aW9uOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gRGlyZWN0b3J5IG9mIFBFTS1lbmNvZGVkIENBIENSTHMgZm9yIENsaWVudCBBdXRoLjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5TeW50YXg6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8Y29kZT5TU0xDQVJldm9jYXRpb25QYXRoPC9jb2RlPiA8ZW0+ZGlyZWN0b3J5PC9lbT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkRlZmF1bHQ6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8ZW0+Tm9uZTwvZW0+PC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5Db250ZXh0OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+T3ZlcnJpZGU6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8ZW0+Tm90IGFwcGxpY2FibGU8L2VtPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5TdGF0dXM6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBFeHRlbnNpb248L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+TW9kdWxlOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gbW9kX3NzbDwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+Q29tcGF0aWJpbGl0eTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IG1vZF9zc2wgMi4zIDwvdGQ+PC90cj4KLTwvdGFibGU+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08cD4KLVRoaXMgZGlyZWN0aXZlIHNldHMgdGhlIGRpcmVjdG9yeSB3aGVyZSB5b3Uga2VlcCB0aGUgQ2VydGlmaWNhdGUgUmV2b2NhdGlvbgotTGlzdHMgKENSTCkgb2YgQ2VydGlmaWNhdGlvbiBBdXRob3JpdGllcyAoQ0FzKSB3aG9zZSBjbGllbnRzIHlvdSBkZWFsIHdpdGguCi1UaGVzZSBhcmUgdXNlZCB0byByZXZva2UgdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZSBvbiBDbGllbnQgQXV0aGVudGljYXRpb24uCi08cD4KLVRoZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBoYXZlIHRvIGJlIFBFTS1lbmNvZGVkIGFuZCBhcmUgYWNjZXNzZWQgdGhyb3VnaAotaGFzaCBmaWxlbmFtZXMuIFNvIHVzdWFsbHkgeW91IGhhdmUgbm90IG9ubHkgdG8gcGxhY2UgdGhlIENSTCBmaWxlcyB0aGVyZS4KLUFkZGl0aW9uYWxseSB5b3UgaGF2ZSB0byBjcmVhdGUgc3ltYm9saWMgbGlua3MgbmFtZWQKLTxpPmhhc2gtdmFsdWU8L2k+PHR0Pi5yTjwvdHQ+LiBBbmQgeW91IHNob3VsZCBhbHdheXMgbWFrZSBzdXJlIHRoaXMgZGlyZWN0b3J5Ci1jb250YWlucyB0aGUgYXBwcm9wcmlhdGUgc3ltYm9saWMgbGlua3MuIFVzZSB0aGUgPGNvZGU+TWFrZWZpbGU8L2NvZGU+IHdoaWNoCi1jb21lcyB3aXRoIG1vZF9zc2wgdG8gYWNjb21wbGlzaCB0aGlzIHRhc2suCi08cD4KLUV4YW1wbGU6Ci08YmxvY2txdW90ZT4KLTxwcmU+Ci1TU0xDQVJldm9jYXRpb25QYXRoIC91c3IvbG9jYWwvYXBhY2hlL2NvbmYvc3NsLmNybC8KLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPCEtLSBTU0xDQVJldm9jYXRpb25GaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgotPHA+Ci08YnI+Ci08YSBuYW1lPSJTU0xDQVJldm9jYXRpb25GaWxlIj48L2E+Ci08aDI+PGEgbmFtZT0iVG9DMTYiPlNTTENBUmV2b2NhdGlvbkZpbGU8L2E+PC9oMj4KLTx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIGJnY29sb3I9IiNjY2NjY2MiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj4KLTx0ZD4KLTx0YWJsZSBiZ2NvbG9yPSJ3aGl0ZSIgd2lkdGg9IjYwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI1IiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+Ci08dGQ+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+PHRkPgotPGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5OYW1lOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gPGI+U1NMQ0FSZXZvY2F0aW9uRmlsZTwvYj48L3RkPjwvdHI+Ci08dHI+PHRkPgotPGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5EZXNjcmlwdGlvbjo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IEZpbGUgb2YgY29uY2F0ZW5hdGVkIFBFTS1lbmNvZGVkIENBIENSTHMgZm9yIENsaWVudCBBdXRoLjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5TeW50YXg6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8Y29kZT5TU0xDQVJldm9jYXRpb25GaWxlPC9jb2RlPiA8ZW0+ZmlsZW5hbWU8L2VtPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+RGVmYXVsdDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxlbT5Ob25lPC9lbT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkNvbnRleHQ6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5PdmVycmlkZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxlbT5Ob3QgYXBwbGljYWJsZTwvZW0+PC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPlN0YXR1czo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IEV4dGVuc2lvbjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5Nb2R1bGU6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBtb2Rfc3NsPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5Db21wYXRpYmlsaXR5OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gbW9kX3NzbCAyLjMgPC90ZD48L3RyPgotPC90YWJsZT4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTxwPgotVGhpcyBkaXJlY3RpdmUgc2V0cyB0aGUgPGVtPmFsbC1pbi1vbmU8L2VtPiBmaWxlIHdoZXJlIHlvdSBjYW4gYXNzZW1ibGUgdGhlCi1DZXJ0aWZpY2F0ZSBSZXZvY2F0aW9uIExpc3RzIChDUkwpIG9mIENlcnRpZmljYXRpb24gQXV0aG9yaXRpZXMgKENBKSB3aG9zZQotPGVtPmNsaWVudHM8L2VtPiB5b3UgZGVhbCB3aXRoLiBUaGVzZSBhcmUgdXNlZCBmb3IgQ2xpZW50IEF1dGhlbnRpY2F0aW9uLgotU3VjaCBhIGZpbGUgaXMgc2ltcGx5IHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSB2YXJpb3VzIFBFTS1lbmNvZGVkIENSTAotZmlsZXMsIGluIG9yZGVyIG9mIHByZWZlcmVuY2UuIFRoaXMgY2FuIGJlIHVzZWQgYWx0ZXJuYXRpdmVseSBhbmQvb3IKLWFkZGl0aW9uYWxseSB0byA8YSBocmVmPSIjU1NMQ0FSZXZvY2F0aW9uUGF0aCI+U1NMQ0FSZXZvY2F0aW9uUGF0aDwvYT4uCi08cD4KLUV4YW1wbGU6Ci08YmxvY2txdW90ZT4KLTxwcmU+Ci1TU0xDQVJldm9jYXRpb25GaWxlIC91c3IvbG9jYWwvYXBhY2hlL2NvbmYvc3NsLmNybC9jYS1idW5kbGUtY2xpZW50LmNybAotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08IS0tIFNTTFZlcmlmeUNsaWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgotPHA+Ci08YnI+Ci08YSBuYW1lPSJTU0xWZXJpZnlDbGllbnQiPjwvYT4KLTxoMj48YSBuYW1lPSJUb0MxNyI+U1NMVmVyaWZ5Q2xpZW50PC9hPjwvaDI+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBiZ2NvbG9yPSIjY2NjY2NjIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+Ci08dGQ+Ci08dGFibGUgYmdjb2xvcj0id2hpdGUiIHdpZHRoPSI2MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPgotPHRkPgotPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPjx0ZD4KLTxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+TmFtZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxiPlNTTFZlcmlmeUNsaWVudDwvYj48L3RkPjwvdHI+Ci08dHI+PHRkPgotPGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5EZXNjcmlwdGlvbjo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IFR5cGUgb2YgQ2xpZW50IENlcnRpZmljYXRlIHZlcmlmaWNhdGlvbjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5TeW50YXg6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8Y29kZT5TU0xWZXJpZnlDbGllbnQ8L2NvZGU+IDxlbT5sZXZlbDwvZW0+PC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5EZWZhdWx0OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gPGNvZGU+U1NMVmVyaWZ5Q2xpZW50IG5vbmU8L2NvZGU+PC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5Db250ZXh0OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2VzczwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPk92ZXJyaWRlOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gQXV0aENvbmZpZzwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5TdGF0dXM6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBFeHRlbnNpb248L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+TW9kdWxlOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gbW9kX3NzbDwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+Q29tcGF0aWJpbGl0eTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IG1vZF9zc2wgMi4wIDwvdGQ+PC90cj4KLTwvdGFibGU+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08cD4KLVRoaXMgZGlyZWN0aXZlIHNldHMgdGhlIENlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBsZXZlbCBmb3IgdGhlIENsaWVudAotQXV0aGVudGljYXRpb24uIE5vdGljZSB0aGF0IHRoaXMgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIGJvdGggaW4gcGVyLXNlcnZlciBhbmQKLXBlci1kaXJlY3RvcnkgY29udGV4dC4gSW4gcGVyLXNlcnZlciBjb250ZXh0IGl0IGFwcGxpZXMgdG8gdGhlIGNsaWVudAotYXV0aGVudGljYXRpb24gcHJvY2VzcyB1c2VkIGluIHRoZSBzdGFuZGFyZCBTU0wgaGFuZHNoYWtlIHdoZW4gYSBjb25uZWN0aW9uIGlzCi1lc3RhYmxpc2hlZC4gSW4gcGVyLWRpcmVjdG9yeSBjb250ZXh0IGl0IGZvcmNlcyBhIFNTTCByZW5lZ290YXRpb24gd2l0aCB0aGUKLXJlY29uZmlndXJlZCBjbGllbnQgdmVyaWZpY2F0aW9uIGxldmVsIGFmdGVyIHRoZSBIVFRQIHJlcXVlc3Qgd2FzIHJlYWQgYnV0Ci1iZWZvcmUgdGhlIEhUVFAgcmVzcG9uc2UgaXMgc2VudC4KLTxwPgotVGhlIGZvbGxvd2luZyBsZXZlbHMgYXJlIGF2YWlsYWJsZSBmb3IgPGVtPmxldmVsPC9lbT46Ci08dWw+Ci08bGk+PHN0cm9uZz5ub25lPC9zdHJvbmc+OgotICAgICBubyBjbGllbnQgQ2VydGlmaWNhdGUgaXMgcmVxdWlyZWQgYXQgYWxsCi08bGk+PHN0cm9uZz5vcHRpb25hbDwvc3Ryb25nPjoKLSAgICAgdGhlIGNsaWVudCA8ZW0+bWF5PC9lbT4gcHJlc2VudCBhIHZhbGlkIENlcnRpZmljYXRlCi08bGk+PHN0cm9uZz5yZXF1aXJlPC9zdHJvbmc+OgotICAgICB0aGUgY2xpZW50IDxlbT5oYXMgdG88L2VtPiBwcmVzZW50IGEgdmFsaWQgQ2VydGlmaWNhdGUKLTxsaT48c3Ryb25nPm9wdGlvbmFsX25vX2NhPC9zdHJvbmc+OgotICAgICB0aGUgY2xpZW50IG1heSBwcmVzZW50IGEgdmFsaWQgQ2VydGlmaWNhdGU8YnI+Ci0gICAgIGJ1dCBpdCBuZWVkIG5vdCB0byBiZSAoc3VjY2Vzc2Z1bGx5KSB2ZXJpZmlhYmxlLgotPC91bD4KLUluIHByYWN0aWNlIG9ubHkgbGV2ZWxzIDxzdHJvbmc+bm9uZTwvc3Ryb25nPiBhbmQgPHN0cm9uZz5yZXF1aXJlPC9zdHJvbmc+IGFyZQotcmVhbGx5IGludGVyZXN0aW5nLCBiZWNhdXNlIGxldmVsIDxzdHJvbmc+b3B0aW9uYWw8L3N0cm9uZz4gZG9lc24ndCB3b3JrIHdpdGgKLWFsbCBicm93c2VycyBhbmQgbGV2ZWwgPHN0cm9uZz5vcHRpb25hbF9ub19jYTwvc3Ryb25nPiBpcyBhY3R1YWxseSBhZ2FpbnN0IHRoZQotaWRlYSBvZiBhdXRoZW50aWNhdGlvbiAoYnV0IGNhbiBiZSB1c2VkIHRvIGVzdGFibGlzaCBTU0wgdGVzdCBwYWdlcywgZXRjLikKLTxwPgotRXhhbXBsZToKLTxibG9ja3F1b3RlPgotPHByZT4KLVNTTFZlcmlmeUNsaWVudCByZXF1aXJlCi08L3ByZT4KLTwvYmxvY2txdW90ZT4KLTwhLS0gU1NMVmVyaWZ5RGVwdGggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4KLTxwPgotPGJyPgotPGEgbmFtZT0iU1NMVmVyaWZ5RGVwdGgiPjwvYT4KLTxoMj48YSBuYW1lPSJUb0MxOCI+U1NMVmVyaWZ5RGVwdGg8L2E+PC9oMj4KLTx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIGJnY29sb3I9IiNjY2NjY2MiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj4KLTx0ZD4KLTx0YWJsZSBiZ2NvbG9yPSJ3aGl0ZSIgd2lkdGg9IjYwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI1IiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+Ci08dGQ+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+PHRkPgotPGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5OYW1lOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gPGI+U1NMVmVyaWZ5RGVwdGg8L2I+PC90ZD48L3RyPgotPHRyPjx0ZD4KLTxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+RGVzY3JpcHRpb246PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBNYXhpbXVtIGRlcHRoIG9mIENBIENlcnRpZmljYXRlcyBpbiBDbGllbnQgQ2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPlN5bnRheDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxjb2RlPlNTTFZlcmlmeURlcHRoPC9jb2RlPiA8ZW0+bnVtYmVyPC9lbT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkRlZmF1bHQ6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8Y29kZT5TU0xWZXJpZnlEZXB0aCAxPC9jb2RlPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+Q29udGV4dDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3M8L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5PdmVycmlkZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IEF1dGhDb25maWc8L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+U3RhdHVzOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gRXh0ZW5zaW9uPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPk1vZHVsZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IG1vZF9zc2w8L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkNvbXBhdGliaWxpdHk6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBtb2Rfc3NsIDIuMCA8L3RkPjwvdHI+Ci08L3RhYmxlPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHA+Ci1UaGlzIGRpcmVjdGl2ZSBzZXRzIGhvdyBkZWVwbHkgbW9kX3NzbCBzaG91bGQgdmVyaWZ5IGJlZm9yZSBkZWNpZGluZyB0aGF0IHRoZQotY2xpZW50cyBkb24ndCBoYXZlIGEgdmFsaWQgY2VydGlmaWNhdGUuIE5vdGljZSB0aGF0IHRoaXMgZGlyZWN0aXZlIGNhbiBiZQotdXNlZCBib3RoIGluIHBlci1zZXJ2ZXIgYW5kIHBlci1kaXJlY3RvcnkgY29udGV4dC4gSW4gcGVyLXNlcnZlciBjb250ZXh0IGl0Ci1hcHBsaWVzIHRvIHRoZSBjbGllbnQgYXV0aGVudGljYXRpb24gcHJvY2VzcyB1c2VkIGluIHRoZSBzdGFuZGFyZCBTU0wKLWhhbmRzaGFrZSB3aGVuIGEgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZC4gSW4gcGVyLWRpcmVjdG9yeSBjb250ZXh0IGl0IGZvcmNlcwotYSBTU0wgcmVuZWdvdGF0aW9uIHdpdGggdGhlIHJlY29uZmlndXJlZCBjbGllbnQgdmVyaWZpY2F0aW9uIGRlcHRoIGFmdGVyIHRoZQotSFRUUCByZXF1ZXN0IHdhcyByZWFkIGJ1dCBiZWZvcmUgdGhlIEhUVFAgcmVzcG9uc2UgaXMgc2VudC4KLTxwPgotVGhlIGRlcHRoIGFjdHVhbGx5IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbnRlcm1lZGlhdGUgY2VydGlmaWNhdGUgaXNzdWVycywKLWkuZS4gdGhlIG51bWJlciBvZiBDQSBjZXJ0aWZpY2F0ZXMgd2hpY2ggYXJlIG1heCBhbGxvd2VkIHRvIGJlIGZvbGxvd2VkIHdoaWxlCi12ZXJpZnlpbmcgdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZS4gQSBkZXB0aCBvZiAwIG1lYW5zIHRoYXQgc2VsZi1zaWduZWQgY2xpZW50Ci1jZXJ0aWZpY2F0ZXMgYXJlIGFjY2VwdGVkIG9ubHksIHRoZSBkZWZhdWx0IGRlcHRoIG9mIDEgbWVhbnMgdGhlIGNsaWVudAotY2VydGlmaWNhdGUgY2FuIGJlIHNlbGYtc2lnbmVkIG9yIGhhcyB0byBiZSBzaWduZWQgYnkgYSBDQSB3aGljaCBpcyBkaXJlY3RseQota25vd24gdG8gdGhlIHNlcnZlciAoaS5lLiB0aGUgQ0EncyBjZXJ0aWZpY2F0ZSBpcyB1bmRlcgotPGNvZGU+U1NMQ0FDZXJ0aWZpY2F0ZVBhdGg8L2NvZGU+KSwgZXRjLgotPHA+Ci1FeGFtcGxlOgotPGJsb2NrcXVvdGU+Ci08cHJlPgotU1NMVmVyaWZ5RGVwdGggMTAKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPCEtLSBTU0xMb2cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgotPHA+Ci08YnI+Ci08YSBuYW1lPSJTU0xMb2ciPjwvYT4KLTxoMj48YSBuYW1lPSJUb0MxOSI+U1NMTG9nPC9hPjwvaDI+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBiZ2NvbG9yPSIjY2NjY2NjIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+Ci08dGQ+Ci08dGFibGUgYmdjb2xvcj0id2hpdGUiIHdpZHRoPSI2MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPgotPHRkPgotPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPjx0ZD4KLTxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+TmFtZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxiPlNTTExvZzwvYj48L3RkPjwvdHI+Ci08dHI+PHRkPgotPGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5EZXNjcmlwdGlvbjo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IFdoZXJlIHRvIHdyaXRlIHRoZSBkZWRpY2F0ZWQgU1NMIGVuZ2luZSBsb2dmaWxlPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPlN5bnRheDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxjb2RlPlNTTExvZzwvY29kZT4gPGVtPmZpbGVuYW1lPC9lbT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkRlZmF1bHQ6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8ZW0+Tm9uZTwvZW0+PC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5Db250ZXh0OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+T3ZlcnJpZGU6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8ZW0+Tm90IGFwcGxpY2FibGU8L2VtPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5TdGF0dXM6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBFeHRlbnNpb248L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+TW9kdWxlOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gbW9kX3NzbDwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+Q29tcGF0aWJpbGl0eTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IG1vZF9zc2wgMi4xIDwvdGQ+PC90cj4KLTwvdGFibGU+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08cD4KLVRoaXMgZGlyZWN0aXZlIHNldHMgdGhlIG5hbWUgb2YgdGhlIGRlZGljYXRlZCBTU0wgcHJvdG9jb2wgZW5naW5lIGxvZ2ZpbGUuCi1FcnJvciB0eXBlIG1lc3NhZ2VzIGFyZSBhZGRpdGlvbmFsbHkgZHVwbGljYXRlZCB0byB0aGUgZ2VuZXJhbCBBcGFjaGUgZXJyb3IKLWxvZyBmaWxlIChkaXJlY3RpdmUgPGNvZGU+RXJyb3JMb2c8L2NvZGU+KS4gUHV0IHRoaXMgc29tZXdoZXJlIHdoZXJlIGl0IGNhbm5vdAotYmUgdXNlZCBmb3Igc3ltbGluayBhdHRhY2tzIG9uIGEgcmVhbCBzZXJ2ZXIgKGkuZS4gc29tZXdoZXJlIHdoZXJlIG9ubHkgcm9vdAotY2FuIHdyaXRlKS4gSWYgdGhlIDxlbT5maWxlbmFtZTwvZW0+IGRvZXMgbm90IGJlZ2luIHdpdGggYSBzbGFzaAotKCc8Y29kZT4vPC9jb2RlPicpIHRoZW4gaXQgaXMgYXNzdW1lZCB0byBiZSByZWxhdGl2ZSB0byB0aGUgPGVtPlNlcnZlcgotUm9vdDwvZW0+LiBJZiA8ZW0+ZmlsZW5hbWU8L2VtPiBiZWdpbnMgd2l0aCBhIGJhciAoJzxjb2RlPnw8L2NvZGU+JykgdGhlbiB0aGUKLWZvbGxvd2luZyBzdHJpbmcgaXMgYXNzdW1lZCB0byBiZSBhIHBhdGggdG8gYW4gZXhlY3V0YWJsZSBwcm9ncmFtIHRvIHdoaWNoIGEKLXJlbGlhYmxlIHBpcGUgY2FuIGJlIGVzdGFibGlzaGVkLiBUaGUgZGlyZWN0aXZlIHNob3VsZCBvY2N1ciBvbmx5IG9uY2UgcGVyCi12aXJ0dWFsIHNlcnZlciBjb25maWcuCi08cD4KLUV4YW1wbGU6Ci08YmxvY2txdW90ZT4KLTxwcmU+Ci1TU0xMb2cgL3Vzci9sb2NhbC9hcGFjaGUvbG9ncy9zc2xfZW5naW5lX2xvZwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08IS0tIFNTTExvZ0xldmVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+Ci08cD4KLTxicj4KLTxhIG5hbWU9IlNTTExvZ0xldmVsIj48L2E+Ci08aDI+PGEgbmFtZT0iVG9DMjAiPlNTTExvZ0xldmVsPC9hPjwvaDI+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBiZ2NvbG9yPSIjY2NjY2NjIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+Ci08dGQ+Ci08dGFibGUgYmdjb2xvcj0id2hpdGUiIHdpZHRoPSI2MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPgotPHRkPgotPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPjx0ZD4KLTxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+TmFtZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxiPlNTTExvZ0xldmVsPC9iPjwvdGQ+PC90cj4KLTx0cj48dGQ+Ci08Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkRlc2NyaXB0aW9uOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gTG9nZ2luZyBsZXZlbCBmb3IgdGhlIGRlZGljYXRlZCBTU0wgZW5naW5lIGxvZ2ZpbGU8L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+U3ludGF4OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gPGNvZGU+U1NMTG9nTGV2ZWw8L2NvZGU+IDxlbT5sZXZlbDwvZW0+PC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5EZWZhdWx0OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gPGNvZGU+U1NMTG9nTGV2ZWwgbm9uZTwvY29kZT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkNvbnRleHQ6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5PdmVycmlkZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxlbT5Ob3QgYXBwbGljYWJsZTwvZW0+PC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPlN0YXR1czo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IEV4dGVuc2lvbjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5Nb2R1bGU6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBtb2Rfc3NsPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5Db21wYXRpYmlsaXR5OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gbW9kX3NzbCAyLjEgPC90ZD48L3RyPgotPC90YWJsZT4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTxwPgotVGhpcyBkaXJlY3RpdmUgc2V0cyB0aGUgdmVyYm9zaXR5IGRlZ3JlZSBvZiB0aGUgZGVkaWNhdGVkIFNTTCBwcm90b2NvbCBlbmdpbmUKLWxvZ2ZpbGUuIFRoZSA8ZW0+bGV2ZWw8L2VtPiBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyAoaW4gYXNjZW5kaW5nIG9yZGVyIHdoZXJlCi1oaWdoZXIgbGV2ZWxzIGluY2x1ZGUgbG93ZXIgbGV2ZWxzKToKLTx1bD4KLTxsaT48Y29kZT5ub25lPC9jb2RlPjxicj4KLSAgICBubyBkZWRpY2F0ZWQgU1NMIGxvZ2dpbmcgaXMgZG9uZSwgYnV0IG1lc3NhZ2VzIG9mIGxldmVsCi0gICAgYGA8Y29kZT5lcnJvcjwvY29kZT4nJyBhcmUgc3RpbGwgd3JpdHRlbiB0byB0aGUgZ2VuZXJhbCBBcGFjaGUgZXJyb3IKLSAgICBsb2dmaWxlLgotPHA+Ci08bGk+PGNvZGU+ZXJyb3I8L2NvZGU+PGJyPgotICAgIGxvZyBtZXNzYWdlcyBvZiBlcnJvciB0eXBlIG9ubHksIGkuZS4gbWVzc2FnZXMgd2hpY2ggc2hvdyBmYXRhbCBzaXR1YXRpb25zCi0gICAgKHByb2Nlc3NpbmcgaXMgc3RvcHBlZCkuIFRob3NlIG1lc3NhZ2VzIGFyZSBhbHNvIGR1cGxpY2F0ZWQgdG8gdGhlCi0gICAgZ2VuZXJhbCBBcGFjaGUgZXJyb3IgbG9nZmlsZS4KLTxwPgotPGxpPjxjb2RlPndhcm48L2NvZGU+PGJyPgotICAgIGxvZyBhbHNvIHdhcm5pbmcgbWVzc2FnZXMsIGkuZS4gbWVzc2FnZXMgd2hpY2ggc2hvdyBub24tZmF0YWwgcHJvYmxlbXMKLSAgICAocHJvY2Vzc2luZyBpcyBjb250aW51ZWQpLgotPHA+Ci08bGk+PGNvZGU+aW5mbzwvY29kZT48YnI+Ci0gICAgbG9nIGFsc28gaW5mb3JtYXRpb25hbCBtZXNzYWdlcywgaS5lLiBtZXNzYWdlcyB3aGljaCBzaG93IG1ham9yCi0gICAgcHJvY2Vzc2luZyBzdGVwcy4KLTxwPgotPGxpPjxjb2RlPnRyYWNlPC9jb2RlPjxicj4KLSAgICBsb2cgYWxzbyB0cmFjZSBtZXNzYWdlcywgaS5lLiBtZXNzYWdlcyB3aGljaCBzaG93IG1pbm9yIHByb2Nlc3Npbmcgc3RlcHMuCi08cD4KLTxsaT48Y29kZT5kZWJ1ZzwvY29kZT48YnI+Ci0gICAgbG9nIGFsc28gZGVidWdnaW5nIG1lc3NhZ2VzLCBpLmUuIG1lc3NhZ2VzIHdoaWNoIHNob3cgZGV2ZWxvcG1lbnQgYW5kCi0gICAgbG93LWxldmVsIEkvTyBpbmZvcm1hdGlvbi4KLTwvdWw+Ci08cD4KLUV4YW1wbGU6Ci08YmxvY2txdW90ZT4KLTxwcmU+Ci1TU0xMb2dMZXZlbCB3YXJuCi08L3ByZT4KLTwvYmxvY2txdW90ZT4KLTwhLS0gU1NMT3B0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4KLTxwPgotPGJyPgotPGEgbmFtZT0iU1NMT3B0aW9ucyI+PC9hPgotPGgyPjxhIG5hbWU9IlRvQzIxIj5TU0xPcHRpb25zPC9hPjwvaDI+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBiZ2NvbG9yPSIjY2NjY2NjIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+Ci08dGQ+Ci08dGFibGUgYmdjb2xvcj0id2hpdGUiIHdpZHRoPSI2MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPgotPHRkPgotPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPjx0ZD4KLTxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+TmFtZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxiPlNTTE9wdGlvbnM8L2I+PC90ZD48L3RyPgotPHRyPjx0ZD4KLTxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+RGVzY3JpcHRpb246PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBDb25maWd1cmUgdmFyaW91cyBTU0wgZW5naW5lIHJ1bi10aW1lIG9wdGlvbnM8L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+U3ludGF4OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gPGNvZGU+U1NMT3B0aW9uczwvY29kZT4gWystXTxlbT5vcHRpb248L2VtPiAuLi48L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkRlZmF1bHQ6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8ZW0+Tm9uZTwvZW0+PC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5Db250ZXh0OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2VzczwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPk92ZXJyaWRlOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gT3B0aW9uczwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5TdGF0dXM6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBFeHRlbnNpb248L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+TW9kdWxlOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gbW9kX3NzbDwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+Q29tcGF0aWJpbGl0eTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IG1vZF9zc2wgMi4xIDwvdGQ+PC90cj4KLTwvdGFibGU+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08cD4KLVRoaXMgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdmFyaW91cyBydW4tdGltZSBvcHRpb25zIG9uIGEKLXBlci1kaXJlY3RvcnkgYmFzaXMuIE5vcm1hbGx5LCBpZiBtdWx0aXBsZSA8Y29kZT5TU0xPcHRpb25zPC9jb2RlPiBjb3VsZAotYXBwbHkgdG8gYSBkaXJlY3RvcnksIHRoZW4gdGhlIG1vc3Qgc3BlY2lmaWMgb25lIGlzIHRha2VuIGNvbXBsZXRlbHk7IHRoZQotb3B0aW9ucyBhcmUgbm90IG1lcmdlZC4gSG93ZXZlciBpZiA8ZW0+YWxsPC9lbT4gdGhlIG9wdGlvbnMgb24gdGhlCi08Y29kZT5TU0xPcHRpb25zPC9jb2RlPiBkaXJlY3RpdmUgYXJlIHByZWNlZGVkIGJ5IGEgcGx1cyAoPGNvZGU+KzwvY29kZT4pIG9yCi1taW51cyAoPGNvZGU+LTwvY29kZT4pIHN5bWJvbCwgdGhlIG9wdGlvbnMgYXJlIG1lcmdlZC4gQW55IG9wdGlvbnMgcHJlY2VkZWQgYnkKLWEgPGNvZGU+KzwvY29kZT4gYXJlIGFkZGVkIHRvIHRoZSBvcHRpb25zIGN1cnJlbnRseSBpbiBmb3JjZSwgYW5kIGFueSBvcHRpb25zCi1wcmVjZWRlZCBieSBhIDxjb2RlPi08L2NvZGU+IGFyZSByZW1vdmVkIGZyb20gdGhlIG9wdGlvbnMgY3VycmVudGx5IGluIGZvcmNlLgotPHA+Ci1UaGUgYXZhaWxhYmxlIDxlbT5vcHRpb248L2VtPnMgYXJlOgotPHVsPgotPGxpPjxjb2RlPlN0ZEVudlZhcnM8L2NvZGU+Ci0gICAgPHA+Ci0gICAgV2hlbiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGUgc3RhbmRhcmQgc2V0IG9mIFNTTCByZWxhdGVkIENHSS9TU0kKLSAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGNyZWF0ZWQuIFRoaXMgcGVyIGRlZmF1bHQgaXMgZGlzYWJsZWQgZm9yCi0gICAgcGVyZm9ybWFuY2UgcmVhc29ucywgYmVjYXVzZSB0aGUgaW5mb3JtYXRpb24gZXh0cmFjdGlvbiBzdGVwIGlzIGEKLSAgICByYXRoZXIgZXhwZW5zaXZlIG9wZXJhdGlvbi4gU28gb25lIHVzdWFsbHkgZW5hYmxlcyB0aGlzIG9wdGlvbiBmb3IKLSAgICBDR0kgYW5kIFNTSSByZXF1ZXN0cyBvbmx5LgotPHA+Ci08bGk+PGNvZGU+Q29tcGF0RW52VmFyczwvY29kZT4KLSAgICA8cD4KLSAgICBXaGVuIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQsIGFkZGl0aW9uYWwgQ0dJL1NTSSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlCi0gICAgY3JlYXRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB0byBvdGhlciBBcGFjaGUgU1NMIHNvbHV0aW9ucy4gTG9vayBpbgotICAgIHRoZSA8YSBocmVmPSJzc2xfY29tcGF0Lmh0bWwiPkNvbXBhdGliaWxpdHk8L2E+IGNoYXB0ZXIgZm9yIGRldGFpbHMKLSAgICBvbiB0aGUgcGFydGljdWxhciB2YXJpYWJsZXMgZ2VuZXJhdGVkLgotPHA+Ci08bGk+PGNvZGU+RXhwb3J0Q2VydERhdGE8L2NvZGU+Ci0gICAgPHA+Ci0gICAgV2hlbiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLCBhZGRpdGlvbmFsIENHSS9TU0kgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZQotICAgIGNyZWF0ZWQ6IDxjb2RlPlNTTF9TRVJWRVJfQ0VSVDwvY29kZT4sIDxjb2RlPlNTTF9DTElFTlRfQ0VSVDwvY29kZT4gYW5kCi0gICAgPGNvZGU+U1NMX0NMSUVOVF9DRVJUX0NIQUlOPC9jb2RlPjxpPm48L2k+ICh3aXRoIDxpPm48L2k+ID0gMCwxLDIsLi4pLgotICAgIFRoZXNlIGNvbnRhaW4gdGhlIFBFTS1lbmNvZGVkIFguNTA5IENlcnRpZmljYXRlcyBvZiBzZXJ2ZXIgYW5kIGNsaWVudCBmb3IKLSAgICB0aGUgY3VycmVudCBIVFRQUyBjb25uZWN0aW9uIGFuZCBjYW4gYmUgdXNlZCBieSBDR0kgc2NyaXB0cyBmb3IgZGVlcGVyCi0gICAgQ2VydGlmaWNhdGUgY2hlY2tpbmcuIEFkZGl0aW9uYWxseSBhbGwgb3RoZXIgY2VydGlmaWNhdGVzIG9mIHRoZSBjbGllbnQKLSAgICBjZXJ0aWZpY2F0ZSBjaGFpbiBhcmUgcHJvdmlkZWQsIHRvby4gVGhpcyBibG9hdHMgdXAgdGhlIGVudmlyb25tZW50IGEKLSAgICBsaXR0bGUgYml0IHdoaWNoIGlzIHdoeSB5b3UgaGF2ZSB0byB1c2UgdGhpcyBvcHRpb24gdG8gZW5hYmxlIGl0IG9uCi0gICAgZGVtYW5kLgotPHA+Ci08bGk+PGNvZGU+RmFrZUJhc2ljQXV0aDwvY29kZT4KLSAgICA8cD4KLSAgICBXaGVuIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQsIHRoZSBTdWJqZWN0IERpc3Rpbmd1aXNoZWQgTmFtZSAoRE4pIG9mIHRoZQotICAgIENsaWVudCBYNTA5IENlcnRpZmljYXRlIGlzIHRyYW5zbGF0ZWQgaW50byBhIEhUVFAgQmFzaWMgQXV0aG9yaXphdGlvbgotICAgIHVzZXJuYW1lLiBUaGlzIG1lYW5zIHRoYXQgdGhlIHN0YW5kYXJkIEFwYWNoZSBhdXRoZW50aWNhdGlvbiBtZXRob2RzIGNhbgotICAgIGJlIHVzZWQgZm9yIGFjY2VzcyBjb250cm9sLiBUaGUgdXNlciBuYW1lIGlzIGp1c3QgdGhlIFN1YmplY3Qgb2YgdGhlCi0gICAgQ2xpZW50J3MgWDUwOSBDZXJ0aWZpY2F0ZSAoY2FuIGJlIGRldGVybWluZWQgYnkgcnVubmluZyBPcGVuU1NMJ3MKLSAgICA8Y29kZT5vcGVuc3NsIHg1MDk8L2NvZGU+IGNvbW1hbmQ6IDxjb2RlPm9wZW5zc2wgeDUwOSAtbm9vdXQgLXN1YmplY3QgLWluCi0gICAgPC9jb2RlPjxlbT5jZXJ0aWZpY2F0ZTwvZW0+PGNvZGU+LmNydDwvY29kZT4pLiBOb3RlIHRoYXQgbm8gcGFzc3dvcmQgaXMKLSAgICBvYnRhaW5lZCBmcm9tIHRoZSB1c2VyLiBFdmVyeSBlbnRyeSBpbiB0aGUgdXNlciBmaWxlIG5lZWRzIHRoaXMgcGFzc3dvcmQ6Ci0gICAgYGA8Y29kZT54eGozMVpNVFp6a1ZBPC9jb2RlPicnLCB3aGljaCBpcyB0aGUgREVTLWVuY3J5cHRlZCB2ZXJzaW9uIG9mIHRoZQotICAgIHdvcmQgYDxjb2RlPnBhc3N3b3JkPC9jb2RlPicnLiBUaG9zZSB3aG8gbGl2ZSB1bmRlciBNRDUtYmFzZWQgZW5jcnlwdGlvbgotICAgIChmb3IgaW5zdGFuY2UgdW5kZXIgRnJlZUJTRCBvciBCU0QvT1MsIGV0Yy4pIHNob3VsZCB1c2UgdGhlIGZvbGxvd2luZyBNRDUKLSAgICBoYXNoIG9mIHRoZSBzYW1lIHdvcmQ6IGBgPGNvZGU+JDEkT1hMeVMuLi4kT3d4OHMyL205L2dma2NSVlh6Z29FLzwvY29kZT4nJy4KLTxwPgotPGxpPjxjb2RlPlN0cmljdFJlcXVpcmU8L2NvZGU+Ci0gICAgPHA+Ci0gICAgVGhpcyA8aT5mb3JjZXM8L2k+IGZvcmJpZGRlbiBhY2Nlc3Mgd2hlbiA8Y29kZT5TU0xSZXF1aXJlU1NMPC9jb2RlPiBvcgotICAgIDxjb2RlPlNTTFJlcXVpcmU8L2NvZGU+IHN1Y2Nlc3NmdWxseSBkZWNpZGVkIHRoYXQgYWNjZXNzIHNob3VsZCBiZQotICAgIGZvcmJpZGRlbi4gVXN1YWxseSB0aGUgZGVmYXVsdCBpcyB0aGF0IGluIHRoZSBjYXNlIHdoZXJlIGEgYGA8Y29kZT5TYXRpc2Z5Ci0gICAgYW55PC9jb2RlPicnIGRpcmVjdGl2ZSBpcyB1c2VkLCBhbmQgb3RoZXIgYWNjZXNzIHJlc3RyaWN0aW9ucyBhcmUgcGFzc2VkLAotICAgIGRlbmlhbCBvZiBhY2Nlc3MgZHVlIHRvIDxjb2RlPlNTTFJlcXVpcmVTU0w8L2NvZGU+IG9yCi0gICAgPGNvZGU+U1NMUmVxdWlyZTwvY29kZT4gaXMgb3ZlcnJpZGRlbiAoYmVjYXVzZSB0aGF0J3MgaG93IHRoZSBBcGFjaGUKLSAgICA8dHQ+U2F0aXNmeTwvdHQ+IG1lY2hhbmlzbSBzaG91bGQgd29yay4pIEJ1dCBmb3Igc3RyaWN0IGFjY2VzcyByZXN0cmljdGlvbgotICAgIHlvdSBjYW4gdXNlIDxjb2RlPlNTTFJlcXVpcmVTU0w8L2NvZGU+IGFuZC9vciA8Y29kZT5TU0xSZXF1aXJlPC9jb2RlPiBpbgotICAgIGNvbWJpbmF0aW9uIHdpdGggYW4gYGA8Y29kZT5TU0xPcHRpb25zICtTdHJpY3RSZXF1aXJlPC9jb2RlPicnLiBUaGVuIGFuCi0gICAgYWRkaXRpb25hbCBgYDxjb2RlPlNhdGlzZnkgQW55PC9jb2RlPicnIGhhcyBubyBjaGFuY2Ugb25jZSBtb2Rfc3NsIGhhcwotICAgIGRlY2lkZWQgdG8gZGVueSBhY2Nlc3MuCi08cD4KLTxsaT48Y29kZT5PcHRSZW5lZ290aWF0ZTwvY29kZT4KLSAgICA8cD4KLSAgICBUaGlzIGVuYWJsZXMgb3B0aW1pemVkIFNTTCBjb25uZWN0aW9uIHJlbmVnb3RpYXRpb24gaGFuZGxpbmcgd2hlbiBTU0wKLSAgICBkaXJlY3RpdmVzIGFyZSB1c2VkIGluIHBlci1kaXJlY3RvcnkgY29udGV4dC4gQnkgZGVmYXVsdCBhIHN0cmljdAotICAgIHNjaGVtZSBpcyBlbmFibGVkIHdoZXJlIDxpPmV2ZXJ5PC9pPiBwZXItZGlyZWN0b3J5IHJlY29uZmlndXJhdGlvbiBvZgotICAgIFNTTCBwYXJhbWV0ZXJzIGNhdXNlcyBhIDxpPmZ1bGw8L2k+IFNTTCByZW5lZ290aWF0aW9uIGhhbmRzaGFrZS4gV2hlbiB0aGlzCi0gICAgb3B0aW9uIGlzIHVzZWQgbW9kX3NzbCB0cmllcyB0byBhdm9pZCB1bm5lY2Vzc2FyeSBoYW5kc2hha2VzIGJ5IGRvaW5nIG1vcmUKLSAgICBncmFudWxhciAoYnV0IHN0aWxsIHNhZmUpIHBhcmFtZXRlciBjaGVja3MuIE5ldmVydGhlbGVzcyB0aGVzZSBncmFudWxhcgotICAgIGNoZWNrcyBzb21ldGltZXMgbWF5YmUgbm90IHdoYXQgdGhlIHVzZXIgZXhwZWN0cywgc28gZW5hYmxlIHRoaXMgb24gYQotICAgIHBlci1kaXJlY3RvcnkgYmFzaXMgb25seSwgcGxlYXNlLgotPC91bD4KLTxwPgotRXhhbXBsZToKLTxibG9ja3F1b3RlPgotPHByZT4KLVNTTE9wdGlvbnMgK0Zha2VCYXNpY0F1dGggLVN0cmljdFJlcXVpcmUKLSZsdDtGaWxlcyB+ICJcLihjZ2l8c2h0bWwpJCImZ3Q7Ci0gICAgU1NMT3B0aW9ucyArU3RkRW52VmFycyArQ29tcGF0RW52VmFycyAtRXhwb3J0Q2VydERhdGEKLSZsdDtGaWxlcyZndDsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPCEtLSBTU0xSZXF1aXJlU1NMIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgotPHA+Ci08YnI+Ci08YSBuYW1lPSJTU0xSZXF1aXJlU1NMIj48L2E+Ci08aDI+PGEgbmFtZT0iVG9DMjIiPlNTTFJlcXVpcmVTU0w8L2E+PC9oMj4KLTx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIGJnY29sb3I9IiNjY2NjY2MiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj4KLTx0ZD4KLTx0YWJsZSBiZ2NvbG9yPSJ3aGl0ZSIgd2lkdGg9IjYwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI1IiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+Ci08dGQ+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+PHRkPgotPGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5OYW1lOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gPGI+U1NMUmVxdWlyZVNTTDwvYj48L3RkPjwvdHI+Ci08dHI+PHRkPgotPGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5EZXNjcmlwdGlvbjo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IERlbnkgYWNjZXNzIHdoZW4gU1NMIGlzIG5vdCB1c2VkIGZvciB0aGUgSFRUUCByZXF1ZXN0PC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPlN5bnRheDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxjb2RlPlNTTFJlcXVpcmVTU0w8L2NvZGU+PC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5EZWZhdWx0OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gPGVtPk5vbmU8L2VtPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+Q29udGV4dDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IGRpcmVjdG9yeSwgLmh0YWNjZXNzPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+T3ZlcnJpZGU6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBBdXRoQ29uZmlnPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPlN0YXR1czo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IEV4dGVuc2lvbjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEKLSBocmVmPSIuLi9kaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5Nb2R1bGU6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBtb2Rfc3NsPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5Db21wYXRpYmlsaXR5OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gbW9kX3NzbCAyLjAgPC90ZD48L3RyPgotPC90YWJsZT4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTxwPgotVGhpcyBkaXJlY3RpdmUgZm9yYmlkcyBhY2Nlc3MgdW5sZXNzIEhUVFAgb3ZlciBTU0wgKGkuZS4gSFRUUFMpIGlzIGVuYWJsZWQgZm9yCi10aGUgY3VycmVudCBjb25uZWN0aW9uLiBUaGlzIGlzIHZlcnkgaGFuZHkgaW5zaWRlIHRoZSBTU0wtZW5hYmxlZCB2aXJ0dWFsCi1ob3N0IG9yIGRpcmVjdG9yaWVzIGZvciBkZWZlbmRpbmcgYWdhaW5zdCBjb25maWd1cmF0aW9uIGVycm9ycyB0aGF0IGV4cG9zZQotc3R1ZmYgdGhhdCBzaG91bGQgYmUgcHJvdGVjdGVkLiBXaGVuIHRoaXMgZGlyZWN0aXZlIGlzIHByZXNlbnQgYWxsIHJlcXVlc3RzCi1hcmUgZGVuaWVkIHdoaWNoIGFyZSBub3QgdXNpbmcgU1NMLgotPHA+Ci1FeGFtcGxlOgotPGJsb2NrcXVvdGU+Ci08cHJlPgotU1NMUmVxdWlyZVNTTAotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08IS0tIFNTTFJlcXVpcmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+Ci08cD4KLTxicj4KLTxhIG5hbWU9IlNTTFJlcXVpcmUiPjwvYT4KLTxoMj48YSBuYW1lPSJUb0MyMyI+U1NMUmVxdWlyZTwvYT48L2gyPgotPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgYmdjb2xvcj0iI2NjY2NjYyIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPgotPHRkPgotPHRhYmxlIGJnY29sb3I9IndoaXRlIiB3aWR0aD0iNjAwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjUiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj4KLTx0ZD4KLTx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj48dGQ+Ci08Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPk5hbWU6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8Yj5TU0xSZXF1aXJlPC9iPjwvdGQ+PC90cj4KLTx0cj48dGQ+Ci08Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkRlc2NyaXB0aW9uOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gQWxsb3cgYWNjZXNzIG9ubHkgd2hlbiBhbiBhcmJpdHJhcmlseSBjb21wbGV4IGJvb2xlYW4gZXhwcmVzc2lvbiBpcyB0cnVlPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPlN5bnRheDo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IDxjb2RlPlNTTFJlcXVpcmU8L2NvZGU+IDxlbT5leHByZXNzaW9uPC9lbT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkRlZmF1bHQ6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiA8ZW0+Tm9uZTwvZW0+PC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5Db250ZXh0OjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gZGlyZWN0b3J5LCAuaHRhY2Nlc3M8L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSByZWw9IkhlbHAiCi0+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj48Yj5PdmVycmlkZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IEF1dGhDb25maWc8L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gcmVsPSJIZWxwIgotPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGI+U3RhdHVzOjwvYj48L2ZvbnQ+PC9hPiA8L3RkPjx0ZD4gRXh0ZW5zaW9uPC90ZD48L3RyPgotPHRyPjx0ZD48YQotIGhyZWY9Ii4uL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPk1vZHVsZTo8L2I+PC9mb250PjwvYT4gPC90ZD48dGQ+IG1vZF9zc2w8L3RkPjwvdHI+Ci08dHI+PHRkPjxhCi0gaHJlZj0iLi4vZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIHJlbD0iSGVscCIKLT48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPjxiPkNvbXBhdGliaWxpdHk6PC9iPjwvZm9udD48L2E+IDwvdGQ+PHRkPiBtb2Rfc3NsIDIuMSA8L3RkPjwvdHI+Ci08L3RhYmxlPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHA+Ci1UaGlzIGRpcmVjdGl2ZSBzcGVjaWZpZXMgYSBnZW5lcmFsIGFjY2VzcyByZXF1aXJlbWVudCB3aGljaCBoYXMgdG8gYmUKLWZ1bGZpbGxlZCBpbiBvcmRlciB0byBhbGxvdyBhY2Nlc3MuIEl0J3MgYSB2ZXJ5IHBvd2VyZnVsIGRpcmVjdGl2ZSBiZWNhdXNlIHRoZQotcmVxdWlyZW1lbnQgc3BlY2lmaWNhdGlvbiBpcyBhbiBhcmJpdHJhcmlseSBjb21wbGV4IGJvb2xlYW4gZXhwcmVzc2lvbgotY29udGFpbmluZyBhbnkgbnVtYmVyIG9mIGFjY2VzcyBjaGVja3MuCi08cD4KLVRoZSA8ZW0+ZXhwcmVzc2lvbjwvZW0+IG11c3QgbWF0Y2ggdGhlIGZvbGxvd2luZyBzeW50YXggKGdpdmVuIGFzIGEgQk5GCi1ncmFtbWFyIG5vdGF0aW9uKToKLTxibG9ja3F1b3RlPgotPHByZT4KLWV4cHIgICAgIDo6PSAiPGI+dHJ1ZTwvYj4iIHwgIjxiPmZhbHNlPC9iPiIKLSAgICAgICAgICAgfCAiPGI+ITwvYj4iIGV4cHIKLSAgICAgICAgICAgfCBleHByICI8Yj4mJjwvYj4iIGV4cHIKLSAgICAgICAgICAgfCBleHByICI8Yj58fDwvYj4iIGV4cHIKLSAgICAgICAgICAgfCAiPGI+KDwvYj4iIGV4cHIgIjxiPik8L2I+IgotICAgICAgICAgICB8IGNvbXAKLQotY29tcCAgICAgOjo9IHdvcmQgIjxiPj09PC9iPiIgd29yZCB8IHdvcmQgIjxiPmVxPC9iPiIgd29yZAotICAgICAgICAgICB8IHdvcmQgIjxiPiE9PC9iPiIgd29yZCB8IHdvcmQgIjxiPm5lPC9iPiIgd29yZAotICAgICAgICAgICB8IHdvcmQgIjxiPiZsdDs8L2I+IiAgd29yZCB8IHdvcmQgIjxiPmx0PC9iPiIgd29yZAotICAgICAgICAgICB8IHdvcmQgIjxiPiZsdDs9PC9iPiIgd29yZCB8IHdvcmQgIjxiPmxlPC9iPiIgd29yZAotICAgICAgICAgICB8IHdvcmQgIjxiPiZndDs8L2I+IiAgd29yZCB8IHdvcmQgIjxiPmd0PC9iPiIgd29yZAotICAgICAgICAgICB8IHdvcmQgIjxiPiZndDs9PC9iPiIgd29yZCB8IHdvcmQgIjxiPmdlPC9iPiIgd29yZAotICAgICAgICAgICB8IHdvcmQgIjxiPmluPC9iPiIgIjxiPns8L2I+IiB3b3JkbGlzdCAiPGI+fTwvYj4iCi0gICAgICAgICAgIHwgd29yZCAiPGI+PX48L2I+IiByZWdleAotICAgICAgICAgICB8IHdvcmQgIjxiPiF+PC9iPiIgcmVnZXgKLQotd29yZGxpc3QgOjo9IHdvcmQKLSAgICAgICAgICAgfCB3b3JkbGlzdCAiPGI+LDwvYj4iIHdvcmQKLQotd29yZCAgICAgOjo9IGRpZ2l0Ci0gICAgICAgICAgIHwgY3N0cmluZwotICAgICAgICAgICB8IHZhcmlhYmxlCi0gICAgICAgICAgIHwgZnVuY3Rpb24KLQotZGlnaXQgICAgOjo9IFswLTldKwotY3N0cmluZyAgOjo9ICIuLi4iCi12YXJpYWJsZSA6Oj0gIjxiPiV7PC9iPiIgdmFybmFtZSAiPGI+fTwvYj4iCi1mdW5jdGlvbiA6Oj0gZnVuY25hbWUgIjxiPig8L2I+IiBmdW5jYXJncyAiPGI+KTwvYj4iCi08L3ByZT4KLTwvYmxvY2txdW90ZT4KLXdoaWxlIGZvciA8Y29kZT52YXJuYW1lPC9jb2RlPiBhbnkgdmFyaWFibGUgZnJvbSA8YSBocmVmPSIjdGFibGUzIj5UYWJsZSAzPC9hPgotY2FuIGJlIHVzZWQuIEZpbmFsbHkgZm9yIDxjb2RlPmZ1bmNuYW1lPC9jb2RlPiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucwotYXJlIGF2YWlsYWJsZToKLTx1bD4KLTxsaT48Y29kZT5maWxlKDwvY29kZT48ZW0+ZmlsZW5hbWU8L2VtPjxjb2RlPik8L2NvZGU+Ci0gICAgPHA+Ci0gICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBvbmUgc3RyaW5nIGFyZ3VtZW50IGFuZCBleHBhbmRzIHRvIHRoZSBjb250ZW50cyBvZiB0aGUKLSAgICBmaWxlLiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvciBtYXRjaGluZyB0aGlzIGNvbnRlbnRzIGFnYWluc3QgYQotICAgIHJlZ3VsYXIgZXhwcmVzc2lvbiwgZXRjLgotPC91bD4KLU5vdGljZSB0aGF0IDxlbT5leHByZXNzaW9uPC9lbT4gaXMgZmlyc3QgcGFyc2VkIGludG8gYW4gaW50ZXJuYWwgbWFjaGluZQotcmVwcmVzZW50YXRpb24gYW5kIHRoZW4gZXZhbHVhdGVkIGluIGEgc2Vjb25kIHN0ZXAuIEFjdHVhbGx5LCBpbiBHbG9iYWwgYW5kCi1QZXItU2VydmVyIENsYXNzIGNvbnRleHQgPGVtPmV4cHJlc3Npb248L2VtPiBpcyBwYXJzZWQgYXQgc3RhcnR1cCB0aW1lIGFuZAotYXQgcnVudGltZSBvbmx5IHRoZSBtYWNoaW5lIHJlcHJlc2VudGF0aW9uIGlzIGV4ZWN1dGVkLiBGb3IgUGVyLURpcmVjdG9yeQotY29udGV4dCB0aGlzIGlzIGRpZmZlcmVudDogaGVyZSA8ZW0+ZXhwcmVzc2lvbjwvZW0+IGhhcyB0byBiZSBwYXJzZWQgYW5kCi1pbW1lZGlhdGVseSBleGVjdXRlZCBmb3IgZXZlcnkgcmVxdWVzdC4KLTxwPgotRXhhbXBsZToKLTxibG9ja3F1b3RlPgotPHByZT4KLVNTTFJlcXVpcmUgKCAgICAle1NTTF9DSVBIRVJ9ICF+IG0vXihFWFB8TlVMTCktLyBcCi0gICAgICAgICAgICBhbmQgJXtTU0xfQ0xJRU5UX1NfRE5fT30gZXEgIlNuYWtlIE9pbCwgTHRkLiIgXAotICAgICAgICAgICAgYW5kICV7U1NMX0NMSUVOVF9TX0ROX09VfSBpbiB7IlN0YWZmIiwgIkNBIiwgIkRldiJ9IFwKLSAgICAgICAgICAgIGFuZCAle1RJTUVfV0RBWX0gPj0gMSBhbmQgJXtUSU1FX1dEQVl9IDw9IDUgXAotICAgICAgICAgICAgYW5kICV7VElNRV9IT1VSfSA+PSA4IGFuZCAle1RJTUVfSE9VUn0gPD0gMjAgICAgICAgKSBcCi0gICAgICAgICAgIG9yICV7UkVNT1RFX0FERFJ9ID1+IG0vXjE5MlwuNzZcLjE2MlwuWzAtOV0rJC8KLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxhIG5hbWU9InRhYmxlMyI+PC9hPgotPHRhYmxlIHdpZHRoPSI2MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPGNhcHRpb24gYWxpZ249ImJvdHRvbSIgaWQ9InNmIj5UYWJsZSAzOiBBdmFpbGFibGUgVmFyaWFibGVzIGZvciBTU0xSZXF1aXJlPC9jYXB0aW9uPgotPHRyPjx0ZCBiZ2NvbG9yPSIjY2NjY2NjIj4KLTx0YWJsZSB3aWR0aD0iNTk4IiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiNmZmZmZmYiPgotPHRhYmxlIHN1bW1hcnk9IiI+PHRyPjx0ZD4KLTxlbT5TdGFuZGFyZCBDR0kvMS4wIGFuZCBBcGFjaGUgdmFyaWFibGVzOjwvZW0+Ci08cHJlPgotSFRUUF9VU0VSX0FHRU5UICAgICAgICBQQVRIX0lORk8gICAgICAgICAgICAgQVVUSF9UWVBFCi1IVFRQX1JFRkVSRVIgICAgICAgICAgIFFVRVJZX1NUUklORyAgICAgICAgICBTRVJWRVJfU09GVFdBUkUKLUhUVFBfQ09PS0lFICAgICAgICAgICAgUkVNT1RFX0hPU1QgICAgICAgICAgIEFQSV9WRVJTSU9OCi1IVFRQX0ZPUldBUkRFRCAgICAgICAgIFJFTU9URV9JREVOVCAgICAgICAgICBUSU1FX1lFQVIKLUhUVFBfSE9TVCAgICAgICAgICAgICAgSVNfU1VCUkVRICAgICAgICAgICAgIFRJTUVfTU9OCi1IVFRQX1BST1hZX0NPTk5FQ1RJT04gIERPQ1VNRU5UX1JPT1QgICAgICAgICBUSU1FX0RBWQotSFRUUF9BQ0NFUFQgICAgICAgICAgICBTRVJWRVJfQURNSU4gICAgICAgICAgVElNRV9IT1VSCi1IVFRQOmhlYWRlcm5hbWUgICAgICAgIFNFUlZFUl9OQU1FICAgICAgICAgICBUSU1FX01JTgotVEhFX1JFUVVFU1QgICAgICAgICAgICBTRVJWRVJfUE9SVCAgICAgICAgICAgVElNRV9TRUMKLVJFUVVFU1RfTUVUSE9EICAgICAgICAgU0VSVkVSX1BST1RPQ09MICAgICAgIFRJTUVfV0RBWQotUkVRVUVTVF9TQ0hFTUUgICAgICAgICBSRU1PVEVfQUREUiAgICAgICAgICAgVElNRQotUkVRVUVTVF9VUkkgICAgICAgICAgICBSRU1PVEVfVVNFUiAgICAgICAgICAgRU5WOjxiPnZhcmlhYmxlbmFtZTwvYj4KLVJFUVVFU1RfRklMRU5BTUUKLTwvcHJlPgotPGVtPlNTTC1yZWxhdGVkIHZhcmlhYmxlczo8L2VtPgotPHByZT4KLUhUVFBTICAgICAgICAgICAgICAgICAgU1NMX0NMSUVOVF9NX1ZFUlNJT04gICBTU0xfU0VSVkVSX01fVkVSU0lPTgotICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ0xJRU5UX01fU0VSSUFMICAgIFNTTF9TRVJWRVJfTV9TRVJJQUwKLVNTTF9QUk9UT0NPTCAgICAgICAgICAgU1NMX0NMSUVOVF9WX1NUQVJUICAgICBTU0xfU0VSVkVSX1ZfU1RBUlQKLVNTTF9TRVNTSU9OX0lEICAgICAgICAgU1NMX0NMSUVOVF9WX0VORCAgICAgICBTU0xfU0VSVkVSX1ZfRU5ECi1TU0xfQ0lQSEVSICAgICAgICAgICAgIFNTTF9DTElFTlRfU19ETiAgICAgICAgU1NMX1NFUlZFUl9TX0ROCi1TU0xfQ0lQSEVSX0VYUE9SVCAgICAgIFNTTF9DTElFTlRfU19ETl9DICAgICAgU1NMX1NFUlZFUl9TX0ROX0MKLVNTTF9DSVBIRVJfQUxHS0VZU0laRSAgU1NMX0NMSUVOVF9TX0ROX1NUICAgICBTU0xfU0VSVkVSX1NfRE5fU1QKLVNTTF9DSVBIRVJfVVNFS0VZU0laRSAgU1NMX0NMSUVOVF9TX0ROX0wgICAgICBTU0xfU0VSVkVSX1NfRE5fTAotU1NMX1ZFUlNJT05fTElCUkFSWSAgICBTU0xfQ0xJRU5UX1NfRE5fTyAgICAgIFNTTF9TRVJWRVJfU19ETl9PCi1TU0xfVkVSU0lPTl9JTlRFUkZBQ0UgIFNTTF9DTElFTlRfU19ETl9PVSAgICAgU1NMX1NFUlZFUl9TX0ROX09VCi0gICAgICAgICAgICAgICAgICAgICAgIFNTTF9DTElFTlRfU19ETl9DTiAgICAgU1NMX1NFUlZFUl9TX0ROX0NOCi0gICAgICAgICAgICAgICAgICAgICAgIFNTTF9DTElFTlRfU19ETl9UICAgICAgU1NMX1NFUlZFUl9TX0ROX1QKLSAgICAgICAgICAgICAgICAgICAgICAgU1NMX0NMSUVOVF9TX0ROX0kgICAgICBTU0xfU0VSVkVSX1NfRE5fSQotICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ0xJRU5UX1NfRE5fRyAgICAgIFNTTF9TRVJWRVJfU19ETl9HCi0gICAgICAgICAgICAgICAgICAgICAgIFNTTF9DTElFTlRfU19ETl9TICAgICAgU1NMX1NFUlZFUl9TX0ROX1MKLSAgICAgICAgICAgICAgICAgICAgICAgU1NMX0NMSUVOVF9TX0ROX0QgICAgICBTU0xfU0VSVkVSX1NfRE5fRAotICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ0xJRU5UX1NfRE5fVUlEICAgIFNTTF9TRVJWRVJfU19ETl9VSUQKLSAgICAgICAgICAgICAgICAgICAgICAgU1NMX0NMSUVOVF9TX0ROX0VtYWlsICBTU0xfU0VSVkVSX1NfRE5fRW1haWwKLSAgICAgICAgICAgICAgICAgICAgICAgU1NMX0NMSUVOVF9JX0ROICAgICAgICBTU0xfU0VSVkVSX0lfRE4KLSAgICAgICAgICAgICAgICAgICAgICAgU1NMX0NMSUVOVF9JX0ROX0MgICAgICBTU0xfU0VSVkVSX0lfRE5fQwotICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ0xJRU5UX0lfRE5fU1QgICAgIFNTTF9TRVJWRVJfSV9ETl9TVAotICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ0xJRU5UX0lfRE5fTCAgICAgIFNTTF9TRVJWRVJfSV9ETl9MCi0gICAgICAgICAgICAgICAgICAgICAgIFNTTF9DTElFTlRfSV9ETl9PICAgICAgU1NMX1NFUlZFUl9JX0ROX08KLSAgICAgICAgICAgICAgICAgICAgICAgU1NMX0NMSUVOVF9JX0ROX09VICAgICBTU0xfU0VSVkVSX0lfRE5fT1UKLSAgICAgICAgICAgICAgICAgICAgICAgU1NMX0NMSUVOVF9JX0ROX0NOICAgICBTU0xfU0VSVkVSX0lfRE5fQ04KLSAgICAgICAgICAgICAgICAgICAgICAgU1NMX0NMSUVOVF9JX0ROX1QgICAgICBTU0xfU0VSVkVSX0lfRE5fVAotICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ0xJRU5UX0lfRE5fSSAgICAgIFNTTF9TRVJWRVJfSV9ETl9JCi0gICAgICAgICAgICAgICAgICAgICAgIFNTTF9DTElFTlRfSV9ETl9HICAgICAgU1NMX1NFUlZFUl9JX0ROX0cKLSAgICAgICAgICAgICAgICAgICAgICAgU1NMX0NMSUVOVF9JX0ROX1MgICAgICBTU0xfU0VSVkVSX0lfRE5fUwotICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ0xJRU5UX0lfRE5fRCAgICAgIFNTTF9TRVJWRVJfSV9ETl9ECi0gICAgICAgICAgICAgICAgICAgICAgIFNTTF9DTElFTlRfSV9ETl9VSUQgICAgU1NMX1NFUlZFUl9JX0ROX1VJRAotICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ0xJRU5UX0lfRE5fRW1haWwgIFNTTF9TRVJWRVJfSV9ETl9FbWFpbAotICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ0xJRU5UX0FfU0lHICAgICAgIFNTTF9TRVJWRVJfQV9TSUcKLSAgICAgICAgICAgICAgICAgICAgICAgU1NMX0NMSUVOVF9BX0tFWSAgICAgICBTU0xfU0VSVkVSX0FfS0VZCi0gICAgICAgICAgICAgICAgICAgICAgIFNTTF9DTElFTlRfQ0VSVCAgICAgICAgU1NMX1NFUlZFUl9DRVJUCi0gICAgICAgICAgICAgICAgICAgICAgIFNTTF9DTElFTlRfQ0VSVF9DSEFJTjxiPm48L2I+Ci0gICAgICAgICAgICAgICAgICAgICAgIFNTTF9DTElFTlRfVkVSSUZZCi08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotPC90ZD4KLTwvdHI+PC90YWJsZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotPC9kaXY+Ci08YnI+Ci08YnI+Ci08cD4KLTxoMT48YSBuYW1lPSJUb0MyNCI+QWRkaXRpb25hbCBGZWF0dXJlczwvYT48L2gxPgotPGgyPjxhIG5hbWU9IlRvQzI1Ij5FbnZpcm9ubWVudCBWYXJpYWJsZXM8L2E+PC9oMj4KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgbG90IG9mIFNTTCBpbmZvcm1hdGlvbiBhcyBhZGRpdGlvbmFsIGVudmlyb25tZW50Ci12YXJpYWJsZXMgdG8gdGhlIFNTSSBhbmQgQ0dJIG5hbWVzcGFjZS4gVGhlIGdlbmVyYXRlZCB2YXJpYWJsZXMgYXJlIGxpc3RlZCBpbgotPGEgaHJlZj0iI3RhYmxlNCI+VGFibGUgNDwvYT4uIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHRoZSBpbmZvcm1hdGlvbiBjYW4KLWJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGRpZmZlcmVudCBuYW1lcywgdG9vLiBMb29rIGluIHRoZSA8YQotaHJlZj0ic3NsX2NvbXBhdC5odG1sIj5Db21wYXRpYmlsaXR5PC9hPiBjaGFwdGVyIGZvciBkZXRhaWxzIG9uIHRoZQotY29tcGF0aWJpbGl0eSB2YXJpYWJsZXMuCi08cD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08YSBuYW1lPSJ0YWJsZTQiPjwvYT4KLTx0YWJsZSB3aWR0aD0iNjAwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTxjYXB0aW9uIGFsaWduPSJib3R0b20iIGlkPSJzZiI+VGFibGUgNDogU1NJL0NHSSBFbnZpcm9ubWVudCBWYXJpYWJsZXM8L2NhcHRpb24+Ci08dHI+PHRkIGJnY29sb3I9IiNjY2NjY2MiPgotPHRhYmxlIHdpZHRoPSI1OTgiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSI1OTgiIHN1bW1hcnk9IiI+Ci08dHIgaWQ9IkgiPgotIDx0ZD48Yj5WYXJpYWJsZSBOYW1lOjwvYj48L3RkPgotIDx0ZD48Yj5WYWx1ZSBUeXBlOjwvYj48L3RkPgotIDx0ZD48Yj5EZXNjcmlwdGlvbjo8L2I+PC90ZD4KLTwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5IVFRQUzwvY29kZT48L3RkPiAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+ZmxhZzwvdGQ+ICAgICAgPHRkPkhUVFBTIGlzIGJlaW5nIHVzZWQuPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX1BST1RPQ09MPC9jb2RlPjwvdGQ+ICAgICAgICAgICAgICAgICAgPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5UaGUgU1NMIHByb3RvY29sIHZlcnNpb24gKFNTTHYyLCBTU0x2MywgVExTdjEpPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX1NFU1NJT05fSUQ8L2NvZGU+PC90ZD4gICAgICAgICAgICAgICAgPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5UaGUgaGV4LWVuY29kZWQgU1NMIHNlc3Npb24gaWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfQ0lQSEVSPC9jb2RlPjwvdGQ+ICAgICAgICAgICAgICAgICAgICA8dGQ+c3RyaW5nPC90ZD4gICAgPHRkPlRoZSBjaXBoZXIgc3BlY2lmaWNhdGlvbiBuYW1lPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMX0NJUEhFUl9FWFBPUlQ8L2NvZGU+PC90ZD4gICAgICAgICAgICAgPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD48Y29kZT50cnVlPC9jb2RlPiBpZiBjaXBoZXIgaXMgYW4gZXhwb3J0IGNpcGhlcjwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlNTTF9DSVBIRVJfVVNFS0VZU0laRTwvY29kZT48L3RkPiAgICAgICAgIDx0ZD5udW1iZXI8L3RkPiAgICA8dGQ+TnVtYmVyIG9mIGNpcGhlciBiaXRzIChhY3R1YWxseSB1c2VkKTwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTF9DSVBIRVJfQUxHS0VZU0laRTwvY29kZT48L3RkPiAgICAgICAgIDx0ZD5udW1iZXI8L3RkPiAgICA8dGQ+TnVtYmVyIG9mIGNpcGhlciBiaXRzIChwb3NzaWJsZSk8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xfVkVSU0lPTl9JTlRFUkZBQ0U8L2NvZGU+PC90ZD4gICAgICAgICA8dGQ+c3RyaW5nPC90ZD4gICAgPHRkPlRoZSBtb2Rfc3NsIHByb2dyYW0gdmVyc2lvbjwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTF9WRVJTSU9OX0xJQlJBUlk8L2NvZGU+PC90ZD4gICAgICAgICAgIDx0ZD5zdHJpbmc8L3RkPiAgICA8dGQ+VGhlIE9wZW5TU0wgcHJvZ3JhbSB2ZXJzaW9uPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX0NMSUVOVF9NX1ZFUlNJT048L2NvZGU+PC90ZD4gICAgICAgICAgPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5UaGUgdmVyc2lvbiBvZiB0aGUgY2xpZW50IGNlcnRpZmljYXRlPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMX0NMSUVOVF9NX1NFUklBTDwvY29kZT48L3RkPiAgICAgICAgICAgPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5UaGUgc2VyaWFsIG9mIHRoZSBjbGllbnQgY2VydGlmaWNhdGU8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX1NfRE48L2NvZGU+PC90ZD4gICAgICAgICAgICAgICA8dGQ+c3RyaW5nPC90ZD4gICAgPHRkPlN1YmplY3QgRE4gaW4gY2xpZW50J3MgY2VydGlmaWNhdGU8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX1NfRE5fPC9jb2RlPjxlbT54NTA5PC9lbT48L3RkPiA8dGQ+c3RyaW5nPC90ZD4gICAgPHRkPkNvbXBvbmVudCBvZiBjbGllbnQncyBTdWJqZWN0IEROPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX0NMSUVOVF9JX0ROPC9jb2RlPjwvdGQ+ICAgICAgICAgICAgICAgPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5Jc3N1ZXIgRE4gb2YgY2xpZW50J3MgY2VydGlmaWNhdGU8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX0lfRE5fPC9jb2RlPjxlbT54NTA5PC9lbT48L3RkPiA8dGQ+c3RyaW5nPC90ZD4gICAgPHRkPkNvbXBvbmVudCBvZiBjbGllbnQncyBJc3N1ZXIgRE48L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX1ZfU1RBUlQ8L2NvZGU+PC90ZD4gICAgICAgICAgICA8dGQ+c3RyaW5nPC90ZD4gICAgPHRkPlZhbGlkaXR5IG9mIGNsaWVudCdzIGNlcnRpZmljYXRlIChzdGFydCB0aW1lKTwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTF9DTElFTlRfVl9FTkQ8L2NvZGU+PC90ZD4gICAgICAgICAgICAgIDx0ZD5zdHJpbmc8L3RkPiAgICA8dGQ+VmFsaWRpdHkgb2YgY2xpZW50J3MgY2VydGlmaWNhdGUgKGVuZCB0aW1lKTwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlNTTF9DTElFTlRfQV9TSUc8L2NvZGU+PC90ZD4gICAgICAgICAgICAgIDx0ZD5zdHJpbmc8L3RkPiAgICA8dGQ+QWxnb3JpdGhtIHVzZWQgZm9yIHRoZSBzaWduYXR1cmUgb2YgY2xpZW50J3MgY2VydGlmaWNhdGU8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX0FfS0VZPC9jb2RlPjwvdGQ+ICAgICAgICAgICAgICA8dGQ+c3RyaW5nPC90ZD4gICAgPHRkPkFsZ29yaXRobSB1c2VkIGZvciB0aGUgcHVibGljIGtleSBvZiBjbGllbnQncyBjZXJ0aWZpY2F0ZTwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlNTTF9DTElFTlRfQ0VSVDwvY29kZT48L3RkPiAgICAgICAgICAgICAgIDx0ZD5zdHJpbmc8L3RkPiAgICA8dGQ+UEVNLWVuY29kZWQgY2xpZW50IGNlcnRpZmljYXRlPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMX0NMSUVOVF9DRVJUX0NIQUlOPC9jb2RlPjxpPm48L2k+PC90ZD4gPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5QRU0tZW5jb2RlZCBjZXJ0aWZpY2F0ZXMgaW4gY2xpZW50IGNlcnRpZmljYXRlIGNoYWluPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX0NMSUVOVF9WRVJJRlk8L2NvZGU+PC90ZD4gICAgICAgICAgICAgPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD48dHQ+Tk9ORTwvdHQ+LCA8dHQ+U1VDQ0VTUzwvdHQ+LCA8dHQ+R0VORVJPVVM8L3R0PiBvciA8dHQ+RkFJTEVEOjwvdHQ+PGk+cmVhc29uPC9pPjwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTF9TRVJWRVJfTV9WRVJTSU9OPC9jb2RlPjwvdGQ+ICAgICAgICAgIDx0ZD5zdHJpbmc8L3RkPiAgICA8dGQ+VGhlIHZlcnNpb24gb2YgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZTwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlNTTF9TRVJWRVJfTV9TRVJJQUw8L2NvZGU+PC90ZD4gICAgICAgICAgIDx0ZD5zdHJpbmc8L3RkPiAgICA8dGQ+VGhlIHNlcmlhbCBvZiB0aGUgc2VydmVyIGNlcnRpZmljYXRlPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMX1NFUlZFUl9TX0ROPC9jb2RlPjwvdGQ+ICAgICAgICAgICAgICAgPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5TdWJqZWN0IEROIGluIHNlcnZlcidzIGNlcnRpZmljYXRlPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX1NFUlZFUl9TX0ROXzwvY29kZT48ZW0+eDUwOTwvZW0+PC90ZD4gPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5Db21wb25lbnQgb2Ygc2VydmVyJ3MgU3ViamVjdCBETjwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTF9TRVJWRVJfSV9ETjwvY29kZT48L3RkPiAgICAgICAgICAgICAgIDx0ZD5zdHJpbmc8L3RkPiAgICA8dGQ+SXNzdWVyIEROIG9mIHNlcnZlcidzIGNlcnRpZmljYXRlPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX1NFUlZFUl9JX0ROXzwvY29kZT48ZW0+eDUwOTwvZW0+PC90ZD4gPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5Db21wb25lbnQgb2Ygc2VydmVyJ3MgSXNzdWVyIEROPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMX1NFUlZFUl9WX1NUQVJUPC9jb2RlPjwvdGQ+ICAgICAgICAgICAgPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5WYWxpZGl0eSBvZiBzZXJ2ZXIncyBjZXJ0aWZpY2F0ZSAoc3RhcnQgdGltZSk8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xfU0VSVkVSX1ZfRU5EPC9jb2RlPjwvdGQ+ICAgICAgICAgICAgICA8dGQ+c3RyaW5nPC90ZD4gICAgPHRkPlZhbGlkaXR5IG9mIHNlcnZlcidzIGNlcnRpZmljYXRlIChlbmQgdGltZSk8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfU0VSVkVSX0FfU0lHPC9jb2RlPjwvdGQ+ICAgICAgICAgICAgICA8dGQ+c3RyaW5nPC90ZD4gICAgPHRkPkFsZ29yaXRobSB1c2VkIGZvciB0aGUgc2lnbmF0dXJlIG9mIHNlcnZlcidzIGNlcnRpZmljYXRlPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX1NFUlZFUl9BX0tFWTwvY29kZT48L3RkPiAgICAgICAgICAgICAgPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5BbGdvcml0aG0gdXNlZCBmb3IgdGhlIHB1YmxpYyBrZXkgb2Ygc2VydmVyJ3MgY2VydGlmaWNhdGU8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfU0VSVkVSX0NFUlQ8L2NvZGU+PC90ZD4gICAgICAgICAgICAgICA8dGQ+c3RyaW5nPC90ZD4gICAgPHRkPlBFTS1lbmNvZGVkIHNlcnZlciBjZXJ0aWZpY2F0ZTwvdGQ+PC90cj4KLTwvdGFibGU+Ci1bIHdoZXJlIDxlbT54NTA5PC9lbT4gaXMgYSBjb21wb25lbnQgb2YgYSBYLjUwOSBETjoKLSAgPGNvZGU+QyxTVCxMLE8sT1UsQ04sVCxJLEcsUyxELFVJRCxFbWFpbDwvY29kZT4gXQotPC90ZD4KLTwvdHI+PC90YWJsZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotPC9kaXY+Ci08cD4KLTxicj4KLTxoMj48YSBuYW1lPSJUb0MyNiI+Q3VzdG9tIExvZyBGb3JtYXRzPC9hPjwvaDI+Ci1XaGVuIG1vZF9zc2wgaXMgYnVpbHQgaW50byBBcGFjaGUgb3IgYXQgbGVhc3QgbG9hZGVkICh1bmRlciBEU08gc2l0dWF0aW9uKQotYWRkaXRpb25hbCBmdW5jdGlvbnMgZXhpc3QgZm9yIHRoZSA8YQotaHJlZj0iLi4vbW9kX2xvZ19jb25maWcuaHRtbCNmb3JtYXRzIj5DdXN0b20gTG9nIEZvcm1hdDwvYT4gb2YgPGEKLWhyZWY9Ii4uL21vZF9sb2dfY29uZmlnLmh0bWwiPm1vZF9sb2dfY29uZmlnPC9hPi4gRmlyc3QgdGhlcmUgaXMgYW4gYWRkaXRpb25hbAotYGA8Y29kZT4lezwvY29kZT48ZW0+dmFybmFtZTwvZW0+PGNvZGU+fXg8L2NvZGU+JycgZVh0ZW5zaW9uIGZvcm1hdCBmdW5jdGlvbgotd2hpY2ggY2FuIGJlIHVzZWQgdG8gZXhwYW5kIGFueSB2YXJpYWJsZXMgcHJvdmlkZWQgYnkgYW55IG1vZHVsZSwgZXNwZWNpYWxseQotdGhvc2UgcHJvdmlkZWQgYnkgbW9kX3NzbCB3aGljaCBjYW4geW91IGZpbmQgaW4gPGEgaHJlZj0iI3RhYmxlNCI+VGFibGUgNDwvYT4uCi08cD4KLUZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHRoZXJlIGlzIGFkZGl0aW9uYWxseSBhIHNwZWNpYWwKLWBgPGNvZGU+JXs8L2NvZGU+PGVtPm5hbWU8L2VtPjxjb2RlPn1jPC9jb2RlPicnIGNyeXB0b2dyYXBoeSBmb3JtYXQgZnVuY3Rpb24KLXByb3ZpZGVkLiBJbmZvcm1hdGlvbiBhYm91dCB0aGlzIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGluIHRoZSA8YQotaHJlZj0ic3NsX2NvbXBhdC5odG1sIj5Db21wYXRpYmlsaXR5PC9hPiBjaGFwdGVyLgotPHA+Ci1FeGFtcGxlOgotPGJsb2NrcXVvdGU+Ci08cHJlPgotQ3VzdG9tTG9nIGxvZ3Mvc3NsX3JlcXVlc3RfbG9nIFwKLSAgICAgICAgICAiJXQgJWggJXtTU0xfUFJPVE9DT0x9eCAle1NTTF9DSVBIRVJ9eCBcIiVyXCIgJWIiCi08L3ByZT4KLTwvYmxvY2txdW90ZT4KLSAgICAgIDxwPgotICAgICAgPGJyPgotICAgICAgPHRhYmxlIHN1bW1hcnk9IiI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICAgPHRhYmxlIHdpZHRoPSI2MDAiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLSAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCIgd2lkdGg9IjI1MCI+Ci08YSBocmVmPSJzc2xfaW50cm8uaHRtbCIgb25tb3VzZW92ZXI9InJvX2ltZ092ZXIoJ3JvX2ltZ19wcmV2X2JvdCcsICdwcmV2aW91cyBwYWdlJyk7IHJldHVybiB0cnVlIiBvbm1vdXNlb3V0PSJyb19pbWdOb3JtYWwoJ3JvX2ltZ19wcmV2X2JvdCcpOyByZXR1cm4gdHJ1ZSIgb25mb2N1cz0icm9faW1nT3Zlcigncm9faW1nX3ByZXZfYm90JywgJ3ByZXZpb3VzIHBhZ2UnKTsgcmV0dXJuIHRydWUiIG9uYmx1cj0icm9faW1nTm9ybWFsKCdyb19pbWdfcHJldl9ib3QnKTsgcmV0dXJuIHRydWUiPjxpbWcgbmFtZT0icm9faW1nX3ByZXZfYm90IiBzcmM9InNzbF90ZW1wbGF0ZS5uYXZidXQtcHJldi1uLmdpZiIgYWx0PSJwcmV2aW91cyBwYWdlIiB3aWR0aD0iNzAiIGhlaWdodD0iMTgiIGJvcmRlcj0iMCI+PC9hPjxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+SW50cm9kdWN0aW9uPC9mb250PgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249InJpZ2h0IiB3aWR0aD0iMjUwIj4KLTxhIGhyZWY9InNzbF9jb21wYXQuaHRtbCIgb25tb3VzZW92ZXI9InJvX2ltZ092ZXIoJ3JvX2ltZ19uZXh0X2JvdCcsICduZXh0IHBhZ2UnKTsgcmV0dXJuIHRydWUiIG9ubW91c2VvdXQ9InJvX2ltZ05vcm1hbCgncm9faW1nX25leHRfYm90Jyk7IHJldHVybiB0cnVlIiBvbmZvY3VzPSJyb19pbWdPdmVyKCdyb19pbWdfbmV4dF9ib3QnLCAnbmV4dCBwYWdlJyk7IHJldHVybiB0cnVlIiBvbmJsdXI9InJvX2ltZ05vcm1hbCgncm9faW1nX25leHRfYm90Jyk7IHJldHVybiB0cnVlIj48aW1nIG5hbWU9InJvX2ltZ19uZXh0X2JvdCIgc3JjPSJzc2xfdGVtcGxhdGUubmF2YnV0LW5leHQtbi5naWYiIGFsdD0ibmV4dCBwYWdlIiB3aWR0aD0iNzAiIGhlaWdodD0iMTgiIGJvcmRlcj0iMCI+PC9hPjxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Q29tcGF0aWJpbGl0eTwvZm9udD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS0wMDAwMDAuZ2lmIiBhbHQ9IiIgd2lkdGg9IjYwMCIgaGVpZ2h0PSIyIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+PHRhYmxlIHdpZHRoPSI1OTgiIHN1bW1hcnk9IiI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPgotICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm1vZHNzbC5vcmcvIj5tb2Rfc3NsPC9hPiAyLjgsIFVzZXIgTWFudWFsPGJyPgotICAgICAgICBUaGUgQXBhY2hlIEludGVyZmFjZSB0byBPcGVuU1NMCi0gICAgICAgIDwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj4KLSAgICAgICAgQ29weXJpZ2h0ICZjb3B5OyAxOTk4LTIwMDEKLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5lbmdlbHNjaGFsbC5jb20vIj5SYWxmIFMuIEVuZ2Vsc2NoYWxsPC9hPjxicj4KLSAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZDxicj4KLSAgICAgICAgPC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gIDwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9zc2wueG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9zc2wueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWY0MWQ3Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2Rfc3NsLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgbW9kdWxlc3lub3BzaXMgU1lTVEVNICIuLi9zdHlsZS9tb2R1bGVzeW5vcHNpcy5kdGQiPgotPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iLi4vc3R5bGUvbWFudWFsLnhzbCI/PgotPG1vZHVsZXN5bm9wc2lzPgotCi08bmFtZT5tb2Rfc3NsPC9uYW1lPgotPGRlc2NyaXB0aW9uPlN0cm9uZyBjcnlwdG9ncmFwaHkgdXNpbmcgdGhlIFNlY3VyZSBTb2NrZXRzCi1MYXllciAoU1NMKSBhbmQgVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IChUTFMpIHByb3RvY29sczwvZGVzY3JpcHRpb24+Ci08c3RhdHVzPkV4dGVuc2lvbjwvc3RhdHVzPgotPHNvdXJjZWZpbGU+bW9kX3NzbC5jPC9zb3VyY2VmaWxlPgotPGlkZW50aWZpZXI+c3NsX21vZHVsZTwvaWRlbnRpZmllcj4KLQotPHN1bW1hcnk+Ci08cD5UaGlzIG1vZHVsZSBwcm92aWRlcyBTU0wgdjIvdjMgYW5kIFRMUyB2MSBzdXBwb3J0IGZvciB0aGUgQXBhY2hlCi1IVFRQIFNlcnZlci4gIEl0IHdhcyBjb250cmlidXRlZCBieSBSYWxmIFMuIEVuZ2VzY2hhbGwgYmFzZWQgb24gaGlzCi1tb2Rfc3NsIHByb2plY3QgYW5kIG9yaWdpbmFsbHkgZGVyaXZlZCBmcm9tIHdvcmsgYnkgQmVuIExhdXJpZS48L3A+Ci0KLTxwPlRoaXMgbW9kdWxlIHJlbGllcyBvbiA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5zc2wub3JnLyI+T3BlblNTTDwvYT4KLXRvIHByb3ZpZGUgdGhlIGNyeXB0b2dyYXBoeSBlbmdpbmUuPC9wPgotCi08cD5GdXJ0aGVyIGRldGFpbHMsIGRpc2N1c3Npb24sIGFuZCBleGFtcGxlcyBhcmUgcHJvdmlkZWQgaW4gdGhlCi08YSBocmVmPSIuLi9zc2wvIj5TU0wgZG9jdW1lbnRhdGlvbjwvYT4uPC9wPgotPC9zdW1tYXJ5PgotCi08c2VjdGlvbiBpZD0iVG9DMjUiPjx0aXRsZT5FbnZpcm9ubWVudCBWYXJpYWJsZXM8L3RpdGxlPgotCi08cD5UaGlzIG1vZHVsZSBwcm92aWRlcyBhIGxvdCBvZiBTU0wgaW5mb3JtYXRpb24gYXMgYWRkaXRpb25hbCBlbnZpcm9ubWVudAotdmFyaWFibGVzIHRvIHRoZSBTU0kgYW5kIENHSSBuYW1lc3BhY2UuIFRoZSBnZW5lcmF0ZWQgdmFyaWFibGVzIGFyZSBsaXN0ZWQgaW4KLXRoZSB0YWJsZSBiZWxvdy4gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgdGhlIGluZm9ybWF0aW9uIGNhbgotYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgZGlmZmVyZW50IG5hbWVzLCB0b28uIExvb2sgaW4gdGhlIDxhCi1ocmVmPSIuLi9zc2wvc3NsX2NvbXBhdC5odG1sIj5Db21wYXRpYmlsaXR5PC9hPiBjaGFwdGVyIGZvciBkZXRhaWxzIG9uIHRoZQotY29tcGF0aWJpbGl0eSB2YXJpYWJsZXMuPC9wPgotCi08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGEgbmFtZT0idGFibGU0Ij48L2E+Ci08dGFibGUgd2lkdGg9IjYwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08Y2FwdGlvbiBhbGlnbj0iYm90dG9tIiBpZD0ic2YiPlNTSS9DR0kgRW52aXJvbm1lbnQgVmFyaWFibGVzPC9jYXB0aW9uPgotPHRyPjx0ZCBiZ2NvbG9yPSIjY2NjY2NjIj4KLTx0YWJsZSB3aWR0aD0iNTk4IiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiNmZmZmZmYiPgotPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iNTk4IiBzdW1tYXJ5PSIiPgotPHRyIGlkPSJIIj4KLSA8dGQ+PHN0cm9uZz5WYXJpYWJsZSBOYW1lOjwvc3Ryb25nPjwvdGQ+Ci0gPHRkPjxzdHJvbmc+VmFsdWUgVHlwZTo8L3N0cm9uZz48L3RkPgotIDx0ZD48c3Ryb25nPkRlc2NyaXB0aW9uOjwvc3Ryb25nPjwvdGQ+Ci08L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+SFRUUFM8L2NvZGU+PC90ZD4gICAgICAgICAgICAgICAgICAgICAgICAgPHRkPmZsYWc8L3RkPiAgICAgIDx0ZD5IVFRQUyBpcyBiZWluZyB1c2VkLjwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlNTTF9QUk9UT0NPTDwvY29kZT48L3RkPiAgICAgICAgICAgICAgICAgIDx0ZD5zdHJpbmc8L3RkPiAgICA8dGQ+VGhlIFNTTCBwcm90b2NvbCB2ZXJzaW9uIChTU0x2MiwgU1NMdjMsIFRMU3YxKTwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlNTTF9TRVNTSU9OX0lEPC9jb2RlPjwvdGQ+ICAgICAgICAgICAgICAgIDx0ZD5zdHJpbmc8L3RkPiAgICA8dGQ+VGhlIGhleC1lbmNvZGVkIFNTTCBzZXNzaW9uIGlkPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMX0NJUEhFUjwvY29kZT48L3RkPiAgICAgICAgICAgICAgICAgICAgPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5UaGUgY2lwaGVyIHNwZWNpZmljYXRpb24gbmFtZTwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTF9DSVBIRVJfRVhQT1JUPC9jb2RlPjwvdGQ+ICAgICAgICAgICAgIDx0ZD5zdHJpbmc8L3RkPiAgICA8dGQ+PGNvZGU+dHJ1ZTwvY29kZT4gaWYgY2lwaGVyIGlzIGFuIGV4cG9ydCBjaXBoZXI8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xfQ0lQSEVSX1VTRUtFWVNJWkU8L2NvZGU+PC90ZD4gICAgICAgICA8dGQ+bnVtYmVyPC90ZD4gICAgPHRkPk51bWJlciBvZiBjaXBoZXIgYml0cyAoYWN0dWFsbHkgdXNlZCk8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfQ0lQSEVSX0FMR0tFWVNJWkU8L2NvZGU+PC90ZD4gICAgICAgICA8dGQ+bnVtYmVyPC90ZD4gICAgPHRkPk51bWJlciBvZiBjaXBoZXIgYml0cyAocG9zc2libGUpPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX1ZFUlNJT05fSU5URVJGQUNFPC9jb2RlPjwvdGQ+ICAgICAgICAgPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5UaGUgbW9kX3NzbCBwcm9ncmFtIHZlcnNpb248L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfVkVSU0lPTl9MSUJSQVJZPC9jb2RlPjwvdGQ+ICAgICAgICAgICA8dGQ+c3RyaW5nPC90ZD4gICAgPHRkPlRoZSBPcGVuU1NMIHByb2dyYW0gdmVyc2lvbjwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlNTTF9DTElFTlRfTV9WRVJTSU9OPC9jb2RlPjwvdGQ+ICAgICAgICAgIDx0ZD5zdHJpbmc8L3RkPiAgICA8dGQ+VGhlIHZlcnNpb24gb2YgdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZTwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTF9DTElFTlRfTV9TRVJJQUw8L2NvZGU+PC90ZD4gICAgICAgICAgIDx0ZD5zdHJpbmc8L3RkPiAgICA8dGQ+VGhlIHNlcmlhbCBvZiB0aGUgY2xpZW50IGNlcnRpZmljYXRlPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX0NMSUVOVF9TX0ROPC9jb2RlPjwvdGQ+ICAgICAgICAgICAgICAgPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5TdWJqZWN0IEROIGluIGNsaWVudCdzIGNlcnRpZmljYXRlPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMX0NMSUVOVF9TX0ROXzwvY29kZT48ZW0+eDUwOTwvZW0+PC90ZD4gPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5Db21wb25lbnQgb2YgY2xpZW50J3MgU3ViamVjdCBETjwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlNTTF9DTElFTlRfSV9ETjwvY29kZT48L3RkPiAgICAgICAgICAgICAgIDx0ZD5zdHJpbmc8L3RkPiAgICA8dGQ+SXNzdWVyIEROIG9mIGNsaWVudCdzIGNlcnRpZmljYXRlPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMX0NMSUVOVF9JX0ROXzwvY29kZT48ZW0+eDUwOTwvZW0+PC90ZD4gPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5Db21wb25lbnQgb2YgY2xpZW50J3MgSXNzdWVyIEROPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX0NMSUVOVF9WX1NUQVJUPC9jb2RlPjwvdGQ+ICAgICAgICAgICAgPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5WYWxpZGl0eSBvZiBjbGllbnQncyBjZXJ0aWZpY2F0ZSAoc3RhcnQgdGltZSk8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX1ZfRU5EPC9jb2RlPjwvdGQ+ICAgICAgICAgICAgICA8dGQ+c3RyaW5nPC90ZD4gICAgPHRkPlZhbGlkaXR5IG9mIGNsaWVudCdzIGNlcnRpZmljYXRlIChlbmQgdGltZSk8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX0FfU0lHPC9jb2RlPjwvdGQ+ICAgICAgICAgICAgICA8dGQ+c3RyaW5nPC90ZD4gICAgPHRkPkFsZ29yaXRobSB1c2VkIGZvciB0aGUgc2lnbmF0dXJlIG9mIGNsaWVudCdzIGNlcnRpZmljYXRlPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMX0NMSUVOVF9BX0tFWTwvY29kZT48L3RkPiAgICAgICAgICAgICAgPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5BbGdvcml0aG0gdXNlZCBmb3IgdGhlIHB1YmxpYyBrZXkgb2YgY2xpZW50J3MgY2VydGlmaWNhdGU8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX0NFUlQ8L2NvZGU+PC90ZD4gICAgICAgICAgICAgICA8dGQ+c3RyaW5nPC90ZD4gICAgPHRkPlBFTS1lbmNvZGVkIGNsaWVudCBjZXJ0aWZpY2F0ZTwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTF9DTElFTlRfQ0VSVF9DSEFJTjwvY29kZT48ZW0+bjwvZW0+PC90ZD4gPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5QRU0tZW5jb2RlZCBjZXJ0aWZpY2F0ZXMgaW4gY2xpZW50IGNlcnRpZmljYXRlIGNoYWluPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX0NMSUVOVF9WRVJJRlk8L2NvZGU+PC90ZD4gICAgICAgICAgICAgPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD48Y29kZT5OT05FPC9jb2RlPiwgPGNvZGU+U1VDQ0VTUzwvY29kZT4sIDxjb2RlPkdFTkVST1VTPC9jb2RlPiBvciA8Y29kZT5GQUlMRUQ6PC9jb2RlPjxlbT5yZWFzb248L2VtPjwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTF9TRVJWRVJfTV9WRVJTSU9OPC9jb2RlPjwvdGQ+ICAgICAgICAgIDx0ZD5zdHJpbmc8L3RkPiAgICA8dGQ+VGhlIHZlcnNpb24gb2YgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZTwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlNTTF9TRVJWRVJfTV9TRVJJQUw8L2NvZGU+PC90ZD4gICAgICAgICAgIDx0ZD5zdHJpbmc8L3RkPiAgICA8dGQ+VGhlIHNlcmlhbCBvZiB0aGUgc2VydmVyIGNlcnRpZmljYXRlPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMX1NFUlZFUl9TX0ROPC9jb2RlPjwvdGQ+ICAgICAgICAgICAgICAgPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5TdWJqZWN0IEROIGluIHNlcnZlcidzIGNlcnRpZmljYXRlPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX1NFUlZFUl9TX0ROXzwvY29kZT48ZW0+eDUwOTwvZW0+PC90ZD4gPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5Db21wb25lbnQgb2Ygc2VydmVyJ3MgU3ViamVjdCBETjwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTF9TRVJWRVJfSV9ETjwvY29kZT48L3RkPiAgICAgICAgICAgICAgIDx0ZD5zdHJpbmc8L3RkPiAgICA8dGQ+SXNzdWVyIEROIG9mIHNlcnZlcidzIGNlcnRpZmljYXRlPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX1NFUlZFUl9JX0ROXzwvY29kZT48ZW0+eDUwOTwvZW0+PC90ZD4gPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5Db21wb25lbnQgb2Ygc2VydmVyJ3MgSXNzdWVyIEROPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMX1NFUlZFUl9WX1NUQVJUPC9jb2RlPjwvdGQ+ICAgICAgICAgICAgPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5WYWxpZGl0eSBvZiBzZXJ2ZXIncyBjZXJ0aWZpY2F0ZSAoc3RhcnQgdGltZSk8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xfU0VSVkVSX1ZfRU5EPC9jb2RlPjwvdGQ+ICAgICAgICAgICAgICA8dGQ+c3RyaW5nPC90ZD4gICAgPHRkPlZhbGlkaXR5IG9mIHNlcnZlcidzIGNlcnRpZmljYXRlIChlbmQgdGltZSk8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfU0VSVkVSX0FfU0lHPC9jb2RlPjwvdGQ+ICAgICAgICAgICAgICA8dGQ+c3RyaW5nPC90ZD4gICAgPHRkPkFsZ29yaXRobSB1c2VkIGZvciB0aGUgc2lnbmF0dXJlIG9mIHNlcnZlcidzIGNlcnRpZmljYXRlPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX1NFUlZFUl9BX0tFWTwvY29kZT48L3RkPiAgICAgICAgICAgICAgPHRkPnN0cmluZzwvdGQ+ICAgIDx0ZD5BbGdvcml0aG0gdXNlZCBmb3IgdGhlIHB1YmxpYyBrZXkgb2Ygc2VydmVyJ3MgY2VydGlmaWNhdGU8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfU0VSVkVSX0NFUlQ8L2NvZGU+PC90ZD4gICAgICAgICAgICAgICA8dGQ+c3RyaW5nPC90ZD4gICAgPHRkPlBFTS1lbmNvZGVkIHNlcnZlciBjZXJ0aWZpY2F0ZTwvdGQ+PC90cj4KLTwvdGFibGU+Ci1bIHdoZXJlIDxlbT54NTA5PC9lbT4gaXMgYSBjb21wb25lbnQgb2YgYSBYLjUwOSBETjoKLSAgPGNvZGU+QyxTVCxMLE8sT1UsQ04sVCxJLEcsUyxELFVJRCxFbWFpbDwvY29kZT4gXQotPC90ZD4KLTwvdHI+PC90YWJsZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotPC9kaXY+Ci08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uIGlkPSJUb0MyNiI+PHRpdGxlPkN1c3RvbSBMb2cgRm9ybWF0czwvdGl0bGU+Ci0KLTxwPldoZW4gPG1vZHVsZT5tb2Rfc3NsPC9tb2R1bGU+IGlzIGJ1aWx0IGludG8gQXBhY2hlIG9yIGF0IGxlYXN0Ci1sb2FkZWQgKHVuZGVyIERTTyBzaXR1YXRpb24pIGFkZGl0aW9uYWwgZnVuY3Rpb25zIGV4aXN0IGZvciB0aGUgPGEKLWhyZWY9Ii4uL21vZF9sb2dfY29uZmlnLmh0bWwjZm9ybWF0cyI+Q3VzdG9tIExvZyBGb3JtYXQ8L2E+IG9mIAotPG1vZHVsZT5tb2RfbG9nX2NvbmZpZzwvbW9kdWxlPi4gRmlyc3QgdGhlcmUgaXMgYW4KLWFkZGl0aW9uYWwgYGA8Y29kZT4lezwvY29kZT48ZW0+dmFybmFtZTwvZW0+PGNvZGU+fXg8L2NvZGU+JycKLWVYdGVuc2lvbiBmb3JtYXQgZnVuY3Rpb24gd2hpY2ggY2FuIGJlIHVzZWQgdG8gZXhwYW5kIGFueSB2YXJpYWJsZXMKLXByb3ZpZGVkIGJ5IGFueSBtb2R1bGUsIGVzcGVjaWFsbHkgdGhvc2UgcHJvdmlkZWQgYnkgbW9kX3NzbCB3aGljaCBjYW4KLXlvdSBmaW5kIGluIHRoZSBhYm92ZSB0YWJsZS48L3A+Ci08cD4KLUZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHRoZXJlIGlzIGFkZGl0aW9uYWxseSBhIHNwZWNpYWwKLWBgPGNvZGU+JXs8L2NvZGU+PGVtPm5hbWU8L2VtPjxjb2RlPn1jPC9jb2RlPicnIGNyeXB0b2dyYXBoeSBmb3JtYXQgZnVuY3Rpb24KLXByb3ZpZGVkLiBJbmZvcm1hdGlvbiBhYm91dCB0aGlzIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGluIHRoZSA8YQotaHJlZj0iLi4vc3NsL3NzbF9jb21wYXQuaHRtbCI+Q29tcGF0aWJpbGl0eTwvYT4gY2hhcHRlci48L3A+Ci08cD4KLUV4YW1wbGU6PC9wPgotPGV4YW1wbGU+Ci1DdXN0b21Mb2cgbG9ncy9zc2xfcmVxdWVzdF9sb2cgXAotICAgICAgICAgICIldCAlaCAle1NTTF9QUk9UT0NPTH14ICV7U1NMX0NJUEhFUn14IFwiJXJcIiAlYiIKLTwvZXhhbXBsZT4KLTwvc2VjdGlvbj4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U1NMUGFzc1BocmFzZURpYWxvZzwvbmFtZT4KLTxkZXNjcmlwdGlvbj5UeXBlIG9mIHBhc3MgcGhyYXNlIGRpYWxvZyBmb3IgZW5jcnlwdGVkIHByaXZhdGUgCi1rZXlzPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+U1NMUGFzc1BocmFzZURpYWxvZyA8ZW0+dHlwZTwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5TU0xQYXNzUGhyYXNlRGlhbG9nIGJ1aWx0aW48L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci08cD4KLVdoZW4gQXBhY2hlIHN0YXJ0cyB1cCBpdCBoYXMgdG8gcmVhZCB0aGUgdmFyaW91cyBDZXJ0aWZpY2F0ZSAoc2VlCi08ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX3NzbCI+U1NMQ2VydGlmaWNhdGVGaWxlPC9kaXJlY3RpdmU+KSBhbmQKLVByaXZhdGUgS2V5IChzZWUgPGRpcmVjdGl2ZQotbW9kdWxlPSJtb2Rfc3NsIj5TU0xDZXJ0aWZpY2F0ZUtleUZpbGU8L2RpcmVjdGl2ZT4pIGZpbGVzIG9mIHRoZQotU1NMLWVuYWJsZWQgdmlydHVhbCBzZXJ2ZXJzLiBCZWNhdXNlIGZvciBzZWN1cml0eSByZWFzb25zIHRoZSBQcml2YXRlCi1LZXkgZmlsZXMgYXJlIHVzdWFsbHkgZW5jcnlwdGVkLCBtb2Rfc3NsIG5lZWRzIHRvIHF1ZXJ5IHRoZQotYWRtaW5pc3RyYXRvciBmb3IgYSBQYXNzIFBocmFzZSBpbiBvcmRlciB0byBkZWNyeXB0IHRob3NlIGZpbGVzLiBUaGlzCi1xdWVyeSBjYW4gYmUgZG9uZSBpbiB0d28gd2F5cyB3aGljaCBjYW4gYmUgY29uZmlndXJlZCBieQotPGVtPnR5cGU8L2VtPjo8L3A+Ci08dWw+Ci08bGk+PGNvZGU+YnVpbHRpbjwvY29kZT4KLSAgICA8cD4KLSAgICBUaGlzIGlzIHRoZSBkZWZhdWx0IHdoZXJlIGFuIGludGVyYWN0aXZlIHRlcm1pbmFsIGRpYWxvZyBvY2N1cnMgYXQgc3RhcnR1cAotICAgIHRpbWUganVzdCBiZWZvcmUgQXBhY2hlIGRldGFjaGVzIGZyb20gdGhlIHRlcm1pbmFsLiBIZXJlIHRoZSBhZG1pbmlzdHJhdG9yCi0gICAgaGFzIHRvIG1hbnVhbGx5IGVudGVyIHRoZSBQYXNzIFBocmFzZSBmb3IgZWFjaCBlbmNyeXB0ZWQgUHJpdmF0ZSBLZXkgZmlsZS4KLSAgICBCZWNhdXNlIGEgbG90IG9mIFNTTC1lbmFibGVkIHZpcnR1YWwgaG9zdHMgY2FuIGJlIGNvbmZpZ3VyZWQsIHRoZQotICAgIGZvbGxvd2luZyByZXVzZS1zY2hlbWUgaXMgdXNlZCB0byBtaW5pbWl6ZSB0aGUgZGlhbG9nOiBXaGVuIGEgUHJpdmF0ZSBLZXkKLSAgICBmaWxlIGlzIGVuY3J5cHRlZCwgYWxsIGtub3duIFBhc3MgUGhyYXNlcyAoYXQgdGhlIGJlZ2lubmluZyB0aGVyZSBhcmUKLSAgICBub25lLCBvZiBjb3Vyc2UpIGFyZSB0cmllZC4gSWYgb25lIG9mIHRob3NlIGtub3duIFBhc3MgUGhyYXNlcyBzdWNjZWVkcyBubwotICAgIGRpYWxvZyBwb3BzIHVwIGZvciB0aGlzIHBhcnRpY3VsYXIgUHJpdmF0ZSBLZXkgZmlsZS4gSWYgbm9uZSBzdWNjZWVkZWQsCi0gICAgYW5vdGhlciBQYXNzIFBocmFzZSBpcyBxdWVyaWVkIG9uIHRoZSB0ZXJtaW5hbCBhbmQgcmVtZW1iZXJlZCBmb3IgdGhlIG5leHQKLSAgICByb3VuZCAod2hlcmUgaXQgcGVyaGFwcyBjYW4gYmUgcmV1c2VkKS48L3A+Ci0gICAgPHA+Ci0gICAgVGhpcyBzY2hlbWUgYWxsb3dzIG1vZF9zc2wgdG8gYmUgbWF4aW1hbGx5IGZsZXhpYmxlIChiZWNhdXNlIGZvciBOIGVuY3J5cHRlZAotICAgIFByaXZhdGUgS2V5IGZpbGVzIHlvdSA8ZW0+Y2FuPC9lbT4gdXNlIE4gZGlmZmVyZW50IFBhc3MgUGhyYXNlcyAtIGJ1dCB0aGVuCi0gICAgeW91IGhhdmUgdG8gZW50ZXIgYWxsIG9mIHRoZW0sIG9mIGNvdXJzZSkgd2hpbGUgbWluaW1pemluZyB0aGUgdGVybWluYWwKLSAgICBkaWFsb2cgKGkuZS4gd2hlbiB5b3UgdXNlIGEgc2luZ2xlIFBhc3MgUGhyYXNlIGZvciBhbGwgTiBQcml2YXRlIEtleSBmaWxlcwotICAgIHRoaXMgUGFzcyBQaHJhc2UgaXMgcXVlcmllZCBvbmx5IG9uY2UpLjwvcD48L2xpPgotCi08bGk+PGNvZGU+ZXhlYzovcGF0aC90by9wcm9ncmFtPC9jb2RlPgotICAgIDxwPgotICAgIEhlcmUgYW4gZXh0ZXJuYWwgcHJvZ3JhbSBpcyBjb25maWd1cmVkIHdoaWNoIGlzIGNhbGxlZCBhdCBzdGFydHVwIGZvciBlYWNoCi0gICAgZW5jcnlwdGVkIFByaXZhdGUgS2V5IGZpbGUuIEl0IGlzIGNhbGxlZCB3aXRoIHR3byBhcmd1bWVudHMgKHRoZSBmaXJzdCBpcwotICAgIG9mIHRoZSBmb3JtIGBgPGNvZGU+c2VydmVybmFtZTpwb3J0bnVtYmVyPC9jb2RlPicnLCB0aGUgc2Vjb25kIGlzIGVpdGhlcgotICAgIGBgPGNvZGU+UlNBPC9jb2RlPicnIG9yIGBgPGNvZGU+RFNBPC9jb2RlPicnKSwgd2hpY2ggaW5kaWNhdGUgZm9yIHdoaWNoCi0gICAgc2VydmVyIGFuZCBhbGdvcml0aG0gaXQgaGFzIHRvIHByaW50IHRoZSBjb3JyZXNwb25kaW5nIFBhc3MgUGhyYXNlIHRvCi0gICAgPGNvZGU+c3Rkb3V0PC9jb2RlPi4gVGhlIGludGVudCBpcyB0aGF0IHRoaXMgZXh0ZXJuYWwgcHJvZ3JhbSBmaXJzdCBydW5zCi0gICAgc2VjdXJpdHkgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzeXN0ZW0gaXMgbm90IGNvbXByb21pc2VkIGJ5IGFuCi0gICAgYXR0YWNrZXIsIGFuZCBvbmx5IHdoZW4gdGhlc2UgY2hlY2tzIHdlcmUgcGFzc2VkIHN1Y2Nlc3NmdWxseSBpdCBwcm92aWRlcwotICAgIHRoZSBQYXNzIFBocmFzZS48L3A+Ci0gICAgPHA+Ci0gICAgQm90aCB0aGVzZSBzZWN1cml0eSBjaGVja3MsIGFuZCB0aGUgd2F5IHRoZSBQYXNzIFBocmFzZSBpcyBkZXRlcm1pbmVkLCBjYW4KLSAgICBiZSBhcyBjb21wbGV4IGFzIHlvdSBsaWtlLiBNb2Rfc3NsIGp1c3QgZGVmaW5lcyB0aGUgaW50ZXJmYWNlOiBhbgotICAgIGV4ZWN1dGFibGUgcHJvZ3JhbSB3aGljaCBwcm92aWRlcyB0aGUgUGFzcyBQaHJhc2Ugb24gPGNvZGU+c3Rkb3V0PC9jb2RlPi4KLSAgICBOb3RoaW5nIG1vcmUgb3IgbGVzcyEgU28sIGlmIHlvdSdyZSByZWFsbHkgcGFyYW5vaWQgYWJvdXQgc2VjdXJpdHksIGhlcmUKLSAgICBpcyB5b3VyIGludGVyZmFjZS4gQW55dGhpbmcgZWxzZSBoYXMgdG8gYmUgbGVmdCBhcyBhbiBleGVyY2lzZSB0byB0aGUKLSAgICBhZG1pbmlzdHJhdG9yLCBiZWNhdXNlIGxvY2FsIHNlY3VyaXR5IHJlcXVpcmVtZW50cyBhcmUgc28gZGlmZmVyZW50LjwvcD4KLSAgICA8cD4KLSAgICBUaGUgcmV1c2UtYWxnb3JpdGhtIGFib3ZlIGlzIHVzZWQgaGVyZSwgdG9vLiBJbiBvdGhlciB3b3JkczogVGhlIGV4dGVybmFsCi0gICAgcHJvZ3JhbSBpcyBjYWxsZWQgb25seSBvbmNlIHBlciB1bmlxdWUgUGFzcyBQaHJhc2UuPC9wPjwvbGk+Ci08L3VsPgotPHA+Ci1FeGFtcGxlOjwvcD4KLTxleGFtcGxlPgotU1NMUGFzc1BocmFzZURpYWxvZyBleGVjOi91c3IvbG9jYWwvYXBhY2hlL3NiaW4vcHAtZmlsdGVyCi08L2V4YW1wbGU+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U1NMTXV0ZXg8L25hbWU+Ci08ZGVzY3JpcHRpb24+U2VtYXBob3JlIGZvciBpbnRlcm5hbCBtdXR1YWwgZXhjbHVzaW9uIG9mIAotb3BlcmF0aW9uczwvZGVzY3JpcHRpb24+Ci08c3ludGF4PlNTTE11dGV4IDxlbT50eXBlPC9lbT48L3N5bnRheD4KLTxkZWZhdWx0PlNTTE11dGV4IG5vbmU8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci08cD4KLVRoaXMgY29uZmlndXJlcyB0aGUgU1NMIGVuZ2luZSdzIHNlbWFwaG9yZSAoYWthLiBsb2NrKSB3aGljaCBpcyB1c2VkIGZvciBtdXR1YWwKLWV4Y2x1c2lvbiBvZiBvcGVyYXRpb25zIHdoaWNoIGhhdmUgdG8gYmUgZG9uZSBpbiBhIHN5bmNocm9uaXplZCB3YXkgYmV0d2VlbiB0aGUKLXByZS1mb3JrZWQgQXBhY2hlIHNlcnZlciBwcm9jZXNzZXMuIFRoaXMgZGlyZWN0aXZlIGNhbiBvbmx5IGJlIHVzZWQgaW4gdGhlCi1nbG9iYWwgc2VydmVyIGNvbnRleHQgYmVjYXVzZSBpdCdzIG9ubHkgdXNlZnVsIHRvIGhhdmUgb25lIGdsb2JhbCBtdXRleC48L3A+Ci08cD4KLVRoZSBmb2xsb3dpbmcgTXV0ZXggPGVtPnR5cGVzPC9lbT4gYXJlIGF2YWlsYWJsZTo8L3A+Ci08dWw+Ci08bGk+PGNvZGU+bm9uZTwvY29kZT4KLSAgICA8cD4KLSAgICBUaGlzIGlzIHRoZSBkZWZhdWx0IHdoZXJlIG5vIE11dGV4IGlzIHVzZWQgYXQgYWxsLiBVc2UgaXQgYXQgeW91ciBvd24KLSAgICByaXNrLiBCdXQgYmVjYXVzZSBjdXJyZW50bHkgdGhlIE11dGV4IGlzIG1haW5seSB1c2VkIGZvciBzeW5jaHJvbml6aW5nCi0gICAgd3JpdGUgYWNjZXNzIHRvIHRoZSBTU0wgU2Vzc2lvbiBDYWNoZSB5b3UgY2FuIGxpdmUgd2l0aG91dCBpdCBhcyBsb25nCi0gICAgYXMgeW91IGFjY2VwdCBhIHNvbWV0aW1lcyBnYXJibGVkIFNlc3Npb24gQ2FjaGUuIFNvIGl0J3Mgbm90IHJlY29tbWVuZGVkCi0gICAgdG8gbGVhdmUgdGhpcyB0aGUgZGVmYXVsdC4gSW5zdGVhZCBjb25maWd1cmUgYSByZWFsIE11dGV4LjwvcD48L2xpPgotPGxpPjxjb2RlPmZpbGU6L3BhdGgvdG8vbXV0ZXg8L2NvZGU+Ci0gICAgPHA+Ci0gICAgVGhpcyBpcyB0aGUgcG9ydGFibGUgYW5kICh1bmRlciBVbml4KSBhbHdheXMgcHJvdmlkZWQgTXV0ZXggdmFyaWFudCB3aGVyZQotICAgIGEgcGh5c2ljYWwgKGxvY2stKWZpbGUgaXMgdXNlZCBhcyB0aGUgTXV0ZXguIEFsd2F5cyB1c2UgYSBsb2NhbCBkaXNrCi0gICAgZmlsZXN5c3RlbSBmb3IgPGNvZGU+L3BhdGgvdG8vbXV0ZXg8L2NvZGU+IGFuZCBuZXZlciBhIGZpbGUgcmVzaWRpbmcgb24gYQotICAgIE5GUy0gb3IgQUZTLWZpbGVzeXN0ZW0uIE5vdGU6IEludGVybmFsbHksIHRoZSBQcm9jZXNzIElEIChQSUQpIG9mIHRoZQotICAgIEFwYWNoZSBwYXJlbnQgcHJvY2VzcyBpcyBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIHRvCi0gICAgPGNvZGU+L3BhdGgvdG8vbXV0ZXg8L2NvZGU+IHRvIG1ha2UgaXQgdW5pcXVlLCBzbyB5b3UgZG9uJ3QgaGF2ZSB0byB3b3JyeQotICAgIGFib3V0IGNvbmZsaWN0cyB5b3Vyc2VsZi4gTm90aWNlIHRoYXQgdGhpcyB0eXBlIG9mIG11dGV4IGlzIG5vdCBhdmFpbGFibGUKLSAgICB1bmRlciB0aGUgV2luMzIgZW52aXJvbm1lbnQuIFRoZXJlIHlvdSA8ZW0+aGF2ZTwvZW0+IHRvIHVzZSB0aGUgc2VtYXBob3JlCi0gICAgbXV0ZXguPC9wPjwvbGk+Ci08bGk+PGNvZGU+c2VtPC9jb2RlPgotICAgIDxwPgotICAgIFRoaXMgaXMgdGhlIG1vc3QgZWxlZ2FudCBidXQgYWxzbyBtb3N0IG5vbi1wb3J0YWJsZSBNdXRleCB2YXJpYW50IHdoZXJlIGEKLSAgICBTeXNWIElQQyBTZW1hcGhvcmUgKHVuZGVyIFVuaXgpIGFuZCBhIFdpbmRvd3MgTXV0ZXggKHVuZGVyIFdpbjMyKSBpcyB1c2VkCi0gICAgd2hlbiBwb3NzaWJsZS4gSXQgaXMgb25seSBhdmFpbGFibGUgd2hlbiB0aGUgdW5kZXJseWluZyBwbGF0Zm9ybQotICAgIHN1cHBvcnRzIGl0LjwvcD48L2xpPgotPC91bD4KLTxleGFtcGxlPjx0aXRsZT5FeGFtcGxlPC90aXRsZT4KLVNTTE11dGV4IGZpbGU6L3Vzci9sb2NhbC9hcGFjaGUvbG9ncy9zc2xfbXV0ZXgKLTwvZXhhbXBsZT4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5TU0xSYW5kb21TZWVkPC9uYW1lPgotPGRlc2NyaXB0aW9uPlBzZXVkbyBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciAoUFJORykgc2VlZGluZyAKLXNvdXJjZTwvZGVzY3JpcHRpb24+Ci08c3ludGF4PlNTTFJhbmRvbVNlZWQgPGVtPmNvbnRleHQ8L2VtPiA8ZW0+c291cmNlPC9lbT4gCi1bPGVtPmJ5dGVzPC9lbT5dPC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci08cD4KLVRoaXMgY29uZmlndXJlcyBvbmUgb3IgbW9yZSBzb3VyY2VzIGZvciBzZWVkaW5nIHRoZSBQc2V1ZG8gUmFuZG9tIE51bWJlcgotR2VuZXJhdG9yIChQUk5HKSBpbiBPcGVuU1NMIGF0IHN0YXJ0dXAgdGltZSAoPGVtPmNvbnRleHQ8L2VtPiBpcwotPGNvZGU+c3RhcnR1cDwvY29kZT4pIGFuZC9vciBqdXN0IGJlZm9yZSBhIG5ldyBTU0wgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZAotKDxlbT5jb250ZXh0PC9lbT4gaXMgPGNvZGU+Y29ubmVjdDwvY29kZT4pLiBUaGlzIGRpcmVjdGl2ZSBjYW4gb25seSBiZSB1c2VkCi1pbiB0aGUgZ2xvYmFsIHNlcnZlciBjb250ZXh0IGJlY2F1c2UgdGhlIFBSTkcgaXMgYSBnbG9iYWwgZmFjaWxpdHkuPC9wPgotPHA+Ci1UaGUgZm9sbG93aW5nIDxlbT5zb3VyY2U8L2VtPiB2YXJpYW50cyBhcmUgYXZhaWxhYmxlOjwvcD4KLTx1bD4KLTxsaT48Y29kZT5idWlsdGluPC9jb2RlPgotICAgIDxwPiBUaGlzIGlzIHRoZSBhbHdheXMgYXZhaWxhYmxlIGJ1aWx0aW4gc2VlZGluZyBzb3VyY2UuIEl0J3MgdXNhZ2UKLSAgICBjb25zdW1lcyBtaW5pbXVtIENQVSBjeWNsZXMgdW5kZXIgcnVudGltZSBhbmQgaGVuY2UgY2FuIGJlIGFsd2F5cyB1c2VkCi0gICAgd2l0aG91dCBkcmF3YmFja3MuIFRoZSBzb3VyY2UgdXNlZCBmb3Igc2VlZGluZyB0aGUgUFJORyBjb250YWlucyBvZiB0aGUKLSAgICBjdXJyZW50IHRpbWUsIHRoZSBjdXJyZW50IHByb2Nlc3MgaWQgYW5kICh3aGVuIGFwcGxpY2FibGUpIGEgcmFuZG9tbHkKLSAgICBjaG9vc2VuIDFLQiBleHRyYWN0IG9mIHRoZSBpbnRlci1wcm9jZXNzIHNjb3JlYm9hcmQgc3RydWN0dXJlIG9mIEFwYWNoZS4KLSAgICBUaGUgZHJhd2JhY2sgaXMgdGhhdCB0aGlzIGlzIG5vdCByZWFsbHkgYSBzdHJvbmcgc291cmNlIGFuZCBhdCBzdGFydHVwCi0gICAgdGltZSAod2hlcmUgdGhlIHNjb3JlYm9hcmQgaXMgc3RpbGwgbm90IGF2YWlsYWJsZSkgdGhpcyBzb3VyY2UganVzdAotICAgIHByb2R1Y2VzIGEgZmV3IGJ5dGVzIG9mIGVudHJvcHkuIFNvIHlvdSBzaG91bGQgYWx3YXlzLCBhdCBsZWFzdCBmb3IgdGhlCi0gICAgc3RhcnR1cCwgdXNlIGFuIGFkZGl0aW9uYWwgc2VlZGluZyBzb3VyY2UuPC9wPjwvbGk+Ci08bGk+PGNvZGU+ZmlsZTovcGF0aC90by9zb3VyY2U8L2NvZGU+Ci0gICAgPHA+Ci0gICAgVGhpcyB2YXJpYW50IHVzZXMgYW4gZXh0ZXJuYWwgZmlsZSA8Y29kZT4vcGF0aC90by9zb3VyY2U8L2NvZGU+IGFzIHRoZQotICAgIHNvdXJjZSBmb3Igc2VlZGluZyB0aGUgUFJORy4gV2hlbiA8ZW0+Ynl0ZXM8L2VtPiBpcyBzcGVjaWZpZWQsIG9ubHkgdGhlCi0gICAgZmlyc3QgPGVtPmJ5dGVzPC9lbT4gbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBmaWxlIGZvcm0gdGhlIGVudHJvcHkgKGFuZAotICAgIDxlbT5ieXRlczwvZW0+IGlzIGdpdmVuIHRvIDxjb2RlPi9wYXRoL3RvL3NvdXJjZTwvY29kZT4gYXMgdGhlIGZpcnN0Ci0gICAgYXJndW1lbnQpLiBXaGVuIDxlbT5ieXRlczwvZW0+IGlzIG5vdCBzcGVjaWZpZWQgdGhlIHdob2xlIGZpbGUgZm9ybXMgdGhlCi0gICAgZW50cm9weSAoYW5kIDxjb2RlPjA8L2NvZGU+IGlzIGdpdmVuIHRvIDxjb2RlPi9wYXRoL3RvL3NvdXJjZTwvY29kZT4gYXMKLSAgICB0aGUgZmlyc3QgYXJndW1lbnQpLiBVc2UgdGhpcyBlc3BlY2lhbGx5IGF0IHN0YXJ0dXAgdGltZSwgZm9yIGluc3RhbmNlCi0gICAgd2l0aCBhbiBhdmFpbGFibGUgPGNvZGU+L2Rldi9yYW5kb208L2NvZGU+IGFuZC9vcgotICAgIDxjb2RlPi9kZXYvdXJhbmRvbTwvY29kZT4gZGV2aWNlcyAod2hpY2ggdXN1YWxseSBleGlzdCBvbiBtb2Rlcm4gVW5peAotICAgIGRlcml2YXRlcyBsaWtlIEZyZWVCU0QgYW5kIExpbnV4KS48L3A+Ci0gICAgPHA+Ci0gICAgPGVtPkJ1dCBiZSBjYXJlZnVsPC9lbT46IFVzdWFsbHkgPGNvZGU+L2Rldi9yYW5kb208L2NvZGU+IHByb3ZpZGVzIG9ubHkgYXMKLSAgICBtdWNoIGVudHJvcHkgZGF0YSBhcyBpdCBhY3R1YWxseSBoYXMsIGkuZS4gd2hlbiB5b3UgcmVxdWVzdCA1MTIgYnl0ZXMgb2YKLSAgICBlbnRyb3B5LCBidXQgdGhlIGRldmljZSBjdXJyZW50bHkgaGFzIG9ubHkgMTAwIGJ5dGVzIGF2YWlsYWJsZSB0d28gdGhpbmdzCi0gICAgY2FuIGhhcHBlbjogT24gc29tZSBwbGF0Zm9ybXMgeW91IHJlY2VpdmUgb25seSB0aGUgMTAwIGJ5dGVzIHdoaWxlIG9uCi0gICAgb3RoZXIgcGxhdGZvcm1zIHRoZSByZWFkIGJsb2NrcyB1bnRpbCBlbm91Z2ggYnl0ZXMgYXJlIGF2YWlsYWJsZSAod2hpY2gKLSAgICBjYW4gdGFrZSBhIGxvbmcgdGltZSkuIEhlcmUgdXNpbmcgYW4gZXhpc3RpbmcgPGNvZGU+L2Rldi91cmFuZG9tPC9jb2RlPiBpcwotICAgIGJldHRlciwgYmVjYXVzZSBpdCBuZXZlciBibG9ja3MgYW5kIGFjdHVhbGx5IGdpdmVzIHRoZSBhbW91bnQgb2YgcmVxdWVzdGVkCi0gICAgZGF0YS4gVGhlIGRyYXdiYWNrIGlzIGp1c3QgdGhhdCB0aGUgcXVhbGl0eSBvZiB0aGUgcmVjZWl2ZWQgZGF0YSBtYXkgbm90Ci0gICAgYmUgdGhlIGJlc3QuPC9wPgotICAgIDxwPgotICAgIE9uIHNvbWUgcGxhdGZvcm1zIGxpa2UgRnJlZUJTRCBvbmUgY2FuIGV2ZW4gY29udHJvbCBob3cgdGhlIGVudHJvcHkgaXMKLSAgICBhY3R1YWxseSBnZW5lcmF0ZWQsIGkuZS4gYnkgd2hpY2ggc3lzdGVtIGludGVycnVwdHMuIE1vcmUgZGV0YWlscyBvbmUgY2FuCi0gICAgZmluZCB1bmRlciA8ZW0+cm5kY29udHJvbCg4KTwvZW0+IG9uIHRob3NlIHBsYXRmb3Jtcy4gQWx0ZXJuYXRpdmVseSwgd2hlbgotICAgIHlvdXIgc3lzdGVtIGxhY2tzIHN1Y2ggYSByYW5kb20gZGV2aWNlLCB5b3UgY2FuIHVzZSB0b29sCi0gICAgbGlrZSA8YSBocmVmPSJodHRwOi8vd3d3LmxvdGhhci5jb20vdGVjaC9jcnlwdG8vIj5FR0Q8L2E+Ci0gICAgKEVudHJvcHkgR2F0aGVyaW5nIERhZW1vbikgYW5kIHJ1biBpdCdzIGNsaWVudCBwcm9ncmFtIHdpdGggdGhlCi0gICAgPGNvZGU+ZXhlYzovcGF0aC90by9wcm9ncmFtLzwvY29kZT4gdmFyaWFudCAoc2VlIGJlbG93KSBvciB1c2UKLSAgICA8Y29kZT5lZ2Q6L3BhdGgvdG8vZWdkLXNvY2tldDwvY29kZT4gKHNlZSBiZWxvdykuPC9wPjwvbGk+Ci0KLTxsaT48Y29kZT5leGVjOi9wYXRoL3RvL3Byb2dyYW08L2NvZGU+Ci0gICAgPHA+Ci0gICAgVGhpcyB2YXJpYW50IHVzZXMgYW4gZXh0ZXJuYWwgZXhlY3V0YWJsZQotICAgIDxjb2RlPi9wYXRoL3RvL3Byb2dyYW08L2NvZGU+IGFzIHRoZSBzb3VyY2UgZm9yIHNlZWRpbmcgdGhlCi0gICAgUFJORy4gV2hlbiA8ZW0+Ynl0ZXM8L2VtPiBpcyBzcGVjaWZpZWQsIG9ubHkgdGhlIGZpcnN0Ci0gICAgPGVtPmJ5dGVzPC9lbT4gbnVtYmVyIG9mIGJ5dGVzIG9mIGl0cyA8Y29kZT5zdGRvdXQ8L2NvZGU+IGNvbnRlbnRzCi0gICAgZm9ybSB0aGUgZW50cm9weS4gV2hlbiA8ZW0+Ynl0ZXM8L2VtPiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUKLSAgICBlbnRpcmV0eSBvZiB0aGUgZGF0YSBwcm9kdWNlZCBvbiA8Y29kZT5zdGRvdXQ8L2NvZGU+IGZvcm0gdGhlCi0gICAgZW50cm9weS4gVXNlIHRoaXMgb25seSBhdCBzdGFydHVwIHRpbWUgd2hlbiB5b3UgbmVlZCBhIHZlcnkgc3Ryb25nCi0gICAgc2VlZGluZyB3aXRoIHRoZSBoZWxwIG9mIGFuIGV4dGVybmFsIHByb2dyYW0gKGZvciBpbnN0YW5jZSBhcyBpbgotICAgIHRoZSBleGFtcGxlIGFib3ZlIHdpdGggdGhlIDxjb2RlPnRydWVyYW5kPC9jb2RlPiB1dGlsaXR5IHlvdSBjYW4KLSAgICBmaW5kIGluIHRoZSBtb2Rfc3NsIGRpc3RyaWJ1dGlvbiB3aGljaCBpcyBiYXNlZCBvbiB0aGUgQVQmYW1wO1QKLSAgICA8ZW0+dHJ1ZXJhbmQ8L2VtPiBsaWJyYXJ5KS4gVXNpbmcgdGhpcyBpbiB0aGUgY29ubmVjdGlvbiBjb250ZXh0Ci0gICAgc2xvd3MgZG93biB0aGUgc2VydmVyIHRvbyBkcmFtYXRpY2FsbHksIG9mIGNvdXJzZS4gIFNvIHVzdWFsbHkgeW91Ci0gICAgc2hvdWxkIGF2b2lkIHVzaW5nIGV4dGVybmFsIHByb2dyYW1zIGluIHRoYXQgY29udGV4dC48L3A+PC9saT4KLTxsaT48Y29kZT5lZ2Q6L3BhdGgvdG8vZWdkLXNvY2tldDwvY29kZT4gKFVuaXggb25seSkKLSAgICA8cD4KLSAgICBUaGlzIHZhcmlhbnQgdXNlcyB0aGUgVW5peCBkb21haW4gc29ja2V0IG9mIHRoZQotICAgIGV4dGVybmFsIEVudHJvcHkgR2F0aGVyaW5nIERhZW1vbiAoRUdEKSAoc2VlIDxhCi0gICAgaHJlZj0iaHR0cDovL3d3dy5sb3RoYXIuY29tL3RlY2gvY3J5cHRvLyI+aHR0cDovL3d3dy5sb3RoYXIuY29tL3RlY2gKLSAgICAvY3J5cHRvLzwvYT4pIHRvIHNlZWQgdGhlIFBSTkcuIFVzZSB0aGlzIGlmIG5vIHJhbmRvbSBkZXZpY2UgZXhpc3RzCi0gICAgb24geW91ciBwbGF0Zm9ybS48L3A+PC9saT4KLTwvdWw+Ci08ZXhhbXBsZT48dGl0bGU+RXhhbXBsZTwvdGl0bGU+Ci1TU0xSYW5kb21TZWVkIHN0YXJ0dXAgYnVpbHRpbjxiciAvPgotU1NMUmFuZG9tU2VlZCBzdGFydHVwIGZpbGU6L2Rldi9yYW5kb208YnIgLz4KLVNTTFJhbmRvbVNlZWQgc3RhcnR1cCBmaWxlOi9kZXYvdXJhbmRvbSAxMDI0PGJyIC8+Ci1TU0xSYW5kb21TZWVkIHN0YXJ0dXAgZXhlYzovdXNyL2xvY2FsL2Jpbi90cnVlcmFuZCAxNjxiciAvPgotU1NMUmFuZG9tU2VlZCBjb25uZWN0IGJ1aWx0aW48YnIgLz4KLVNTTFJhbmRvbVNlZWQgY29ubmVjdCBmaWxlOi9kZXYvcmFuZG9tPGJyIC8+Ci1TU0xSYW5kb21TZWVkIGNvbm5lY3QgZmlsZTovZGV2L3VyYW5kb20gMTAyNDxiciAvPgotPC9leGFtcGxlPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlNTTFNlc3Npb25DYWNoZTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5UeXBlIG9mIHRoZSBnbG9iYWwvaW50ZXItcHJvY2VzcyBTU0wgU2Vzc2lvbiAKLUNhY2hlPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+U1NMU2Vzc2lvbkNhY2hlIDxlbT50eXBlPC9lbT48L3N5bnRheD4KLTxkZWZhdWx0PlNTTFNlc3Npb25DYWNoZSBub25lPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotPHA+Ci1UaGlzIGNvbmZpZ3VyZXMgdGhlIHN0b3JhZ2UgdHlwZSBvZiB0aGUgZ2xvYmFsL2ludGVyLXByb2Nlc3MgU1NMIFNlc3Npb24KLUNhY2hlLiBUaGlzIGNhY2hlIGlzIGFuIG9wdGlvbmFsIGZhY2lsaXR5IHdoaWNoIHNwZWVkcyB1cCBwYXJhbGxlbCByZXF1ZXN0Ci1wcm9jZXNzaW5nLiBGb3IgcmVxdWVzdHMgdG8gdGhlIHNhbWUgc2VydmVyIHByb2Nlc3MgKHZpYSBIVFRQIGtlZXAtYWxpdmUpLAotT3BlblNTTCBhbHJlYWR5IGNhY2hlcyB0aGUgU1NMIHNlc3Npb24gaW5mb3JtYXRpb24gbG9jYWxseS4gQnV0IGJlY2F1c2UgbW9kZXJuCi1jbGllbnRzIHJlcXVlc3QgaW5saW5lZCBpbWFnZXMgYW5kIG90aGVyIGRhdGEgdmlhIHBhcmFsbGVsIHJlcXVlc3RzICh1c3VhbGx5Ci11cCB0byBmb3VyIHBhcmFsbGVsIHJlcXVlc3RzIGFyZSBjb21tb24pIHRob3NlIHJlcXVlc3RzIGFyZSBzZXJ2ZWQgYnkKLTxlbT5kaWZmZXJlbnQ8L2VtPiBwcmUtZm9ya2VkIHNlcnZlciBwcm9jZXNzZXMuIEhlcmUgYW4gaW50ZXItcHJvY2VzcyBjYWNoZQotaGVscHMgdG8gYXZvaWQgdW5uZWNjZXNzYXJ5IHNlc3Npb24gaGFuZHNoYWtlcy48L3A+Ci08cD4KLVRoZSBmb2xsb3dpbmcgdHdvIHN0b3JhZ2UgPGVtPnR5cGU8L2VtPnMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6PC9wPgotPHVsPgotPGxpPjxjb2RlPm5vbmU8L2NvZGU+Ci0gICAgPHA+Ci0gICAgVGhpcyBpcyB0aGUgZGVmYXVsdCBhbmQganVzdCBkaXNhYmxlcyB0aGUgZ2xvYmFsL2ludGVyLXByb2Nlc3MgU2Vzc2lvbgotICAgIENhY2hlLiBUaGVyZSBpcyBubyBkcmF3YmFjayBpbiBmdW5jdGlvbmFsaXR5LCBidXQgYSBub3RpY2VhYmxlIHNwZWVkCi0gICAgcGVuYWx0eSBjYW4gYmUgb2JzZXJ2ZWQuPC9wPjwvbGk+Ci08bGk+PGNvZGU+ZGJtOi9wYXRoL3RvL2RhdGFmaWxlPC9jb2RlPgotICAgIDxwPgotICAgIFRoaXMgbWFrZXMgdXNlIG9mIGEgREJNIGhhc2hmaWxlIG9uIHRoZSBsb2NhbCBkaXNrIHRvIHN5bmNocm9uaXplIHRoZQotICAgIGxvY2FsIE9wZW5TU0wgbWVtb3J5IGNhY2hlcyBvZiB0aGUgc2VydmVyIHByb2Nlc3Nlcy4gVGhlIHNsaWdodCBpbmNyZWFzZQotICAgIGluIEkvTyBvbiB0aGUgc2VydmVyIHJlc3VsdHMgaW4gYSB2aXNpYmxlIHJlcXVlc3Qgc3BlZWR1cCBmb3IgeW91cgotICAgIGNsaWVudHMsIHNvIHRoaXMgdHlwZSBvZiBzdG9yYWdlIGlzIGdlbmVyYWxseSByZWNvbW1lbmRlZC48L3A+PC9saT4KLTxsaT48Y29kZT5zaG06L3BhdGgvdG8vZGF0YWZpbGU8L2NvZGU+Wzxjb2RlPig8L2NvZGU+PGVtPnNpemU8L2VtPjxjb2RlPik8L2NvZGU+XQotICAgIDxwPgotICAgIFRoaXMgbWFrZXMgdXNlIG9mIGEgaGlnaC1wZXJmb3JtYW5jZSBoYXNoIHRhYmxlIChhcHByb3guIDxlbT5zaXplPC9lbT4gYnl0ZXMKLSAgICBpbiBzaXplKSBpbnNpZGUgYSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQgaW4gUkFNIChlc3RhYmxpc2hlZCB2aWEKLSAgICA8Y29kZT4vcGF0aC90by9kYXRhZmlsZTwvY29kZT4pIHRvIHN5bmNocm9uaXplIHRoZSBsb2NhbCBPcGVuU1NMIG1lbW9yeQotICAgIGNhY2hlcyBvZiB0aGUgc2VydmVyIHByb2Nlc3Nlcy4gVGhpcyBzdG9yYWdlIHR5cGUgaXMgbm90IGF2YWlsYWJsZSBvbiBhbGwKLSAgICBwbGF0Zm9ybXMuIFNlZSB0aGUgbW9kX3NzbCA8Y29kZT5JTlNUQUxMPC9jb2RlPiBkb2N1bWVudCBmb3IgZGV0YWlscyBvbgotICAgIGhvdyB0byBidWlsZCBBcGFjaGUrRUFQSSB3aXRoIHNoYXJlZCBtZW1vcnkgc3VwcG9ydC48L3A+PC9saT4KLTwvdWw+Ci08ZXhhbXBsZT48dGl0bGU+RXhhbXBsZXM8L3RpdGxlPgotU1NMU2Vzc2lvbkNhY2hlIGRibTovdXNyL2xvY2FsL2FwYWNoZS9sb2dzL3NzbF9nY2FjaGVfZGF0YTxiciAvPgotU1NMU2Vzc2lvbkNhY2hlIHNobTovdXNyL2xvY2FsL2FwYWNoZS9sb2dzL3NzbF9nY2FjaGVfZGF0YSg1MTIwMDApCi08L2V4YW1wbGU+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U1NMU2Vzc2lvbkNhY2hlVGltZW91dDwvbmFtZT4KLTxkZXNjcmlwdGlvbj5OdW1iZXIgb2Ygc2Vjb25kcyBiZWZvcmUgYW4gU1NMIHNlc3Npb24gZXhwaXJlcwotaW4gdGhlIFNlc3Npb24gQ2FjaGU8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5TU0xTZXNzaW9uQ2FjaGVUaW1lb3V0IDxlbT5zZWNvbmRzPC9lbT48L3N5bnRheD4KLTxkZWZhdWx0PlNTTFNlc3Npb25DYWNoZVRpbWVvdXQgMzAwPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+Ci08Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotPHA+Ci1UaGlzIGRpcmVjdGl2ZSBzZXRzIHRoZSB0aW1lb3V0IGluIHNlY29uZHMgZm9yIHRoZSBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlCi1nbG9iYWwvaW50ZXItcHJvY2VzcyBTU0wgU2Vzc2lvbiBDYWNoZSBhbmQgdGhlIE9wZW5TU0wgaW50ZXJuYWwgbWVtb3J5IGNhY2hlLgotSXQgY2FuIGJlIHNldCBhcyBsb3cgYXMgMTUgZm9yIHRlc3RpbmcsIGJ1dCBzaG91bGQgYmUgc2V0IHRvIGhpZ2hlcgotdmFsdWVzIGxpa2UgMzAwIGluIHJlYWwgbGlmZS48L3A+Ci08ZXhhbXBsZT48dGl0bGU+RXhhbXBsZTwvdGl0bGU+Ci1TU0xTZXNzaW9uQ2FjaGVUaW1lb3V0IDYwMAotPC9leGFtcGxlPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlNTTEVuZ2luZTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5TU0wgRW5naW5lIE9wZXJhdGlvbiBTd2l0Y2g8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5TU0xFbmdpbmUgb258b2ZmPC9zeW50YXg+Ci08ZGVmYXVsdD5TU0xFbmdpbmUgb2ZmPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+Ci08Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotPHA+Ci1UaGlzIGRpcmVjdGl2ZSB0b2dnbGVzIHRoZSB1c2FnZSBvZiB0aGUgU1NML1RMUyBQcm90b2NvbCBFbmdpbmUuIFRoaXMKLWlzIHVzdWFsbHkgdXNlZCBpbnNpZGUgYSA8ZGlyZWN0aXZlIG1vZHVsZT0iY29yZSIKLXR5cGU9InNlY3Rpb24iPlZpcnR1YWxIb3N0PC9kaXJlY3RpdmU+IHNlY3Rpb24gdG8gZW5hYmxlIFNTTC9UTFMgZm9yIGEKLXBhcnRpY3VsYXIgdmlydHVhbCBob3N0LiBCeSBkZWZhdWx0IHRoZSBTU0wvVExTIFByb3RvY29sIEVuZ2luZSBpcwotZGlzYWJsZWQgZm9yIGJvdGggdGhlIG1haW4gc2VydmVyIGFuZCBhbGwgY29uZmlndXJlZCB2aXJ0dWFsIGhvc3RzLjwvcD4KLTxleGFtcGxlPjx0aXRsZT5FeGFtcGxlPC90aXRsZT4KLSZsdDtWaXJ0dWFsSG9zdCBfZGVmYXVsdF86NDQzJmd0OzxiciAvPgotU1NMRW5naW5lIG9uPGJyIC8+Ci0uLi48YnIgLz4KLSZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci08L2V4YW1wbGU+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U1NMUHJvdG9jb2w8L25hbWU+Ci08ZGVzY3JpcHRpb24+Q29uZmlndXJlIHVzYWJsZSBTU0wgcHJvdG9jb2wgZmxhdm9yczwvZGVzY3JpcHRpb24+Ci08c3ludGF4PlNTTFByb3RvY29sIFsrfC1dPGVtPnByb3RvY29sPC9lbT4gLi4uPC9zeW50YXg+Ci08ZGVmYXVsdD5TU0xQcm90b2NvbCBhbGw8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPk9wdGlvbnM8L292ZXJyaWRlPgotCi08dXNhZ2U+PCEtLSBYWFggV2h5IGRvZXMgdGhpcyBoYXZlIGFuIG92ZXJyaWRlIGFuZCBub3QgLmh0YWNjZXNzIGNvbnRleHQ/IC0tPgotPHA+Ci1UaGlzIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSBTU0wgcHJvdG9jb2wgZmxhdm9ycyBtb2Rfc3NsIHNob3VsZAotdXNlIHdoZW4gZXN0YWJsaXNoaW5nIGl0cyBzZXJ2ZXIgZW52aXJvbm1lbnQuIENsaWVudHMgdGhlbiBjYW4gb25seSBjb25uZWN0Ci13aXRoIG9uZSBvZiB0aGUgcHJvdmlkZWQgcHJvdG9jb2xzLjwvcD4KLTxwPgotVGhlIGF2YWlsYWJsZSAoY2FzZS1pbnNlbnNpdGl2ZSkgPGVtPnByb3RvY29sPC9lbT5zIGFyZTo8L3A+Ci08dWw+Ci08bGk+PGNvZGU+U1NMdjI8L2NvZGU+Ci0gICAgPHA+Ci0gICAgVGhpcyBpcyB0aGUgU2VjdXJlIFNvY2tldHMgTGF5ZXIgKFNTTCkgcHJvdG9jb2wsIHZlcnNpb24gMi4wLiBJdCBpcyB0aGUKLSAgICBvcmlnaW5hbCBTU0wgcHJvdG9jb2wgYXMgZGVzaWduZWQgYnkgTmV0c2NhcGUgQ29ycG9yYXRpb24uPC9wPjwvbGk+Ci0KLTxsaT48Y29kZT5TU0x2MzwvY29kZT4KLSAgICA8cD4KLSAgICBUaGlzIGlzIHRoZSBTZWN1cmUgU29ja2V0cyBMYXllciAoU1NMKSBwcm90b2NvbCwgdmVyc2lvbiAzLjAuIEl0IGlzIHRoZQotICAgIHN1Y2Nlc3NvciB0byBTU0x2MiBhbmQgdGhlIGN1cnJlbnRseSAoYXMgb2YgRmVicnVhcnkgMTk5OSkgZGUtZmFjdG8KLSAgICBzdGFuZGFyZGl6ZWQgU1NMIHByb3RvY29sIGZyb20gTmV0c2NhcGUgQ29ycG9yYXRpb24uIEl0J3Mgc3VwcG9ydGVkIGJ5Ci0gICAgYWxtb3N0IGFsbCBwb3B1bGFyIGJyb3dzZXJzLjwvcD48L2xpPgotCi08bGk+PGNvZGU+VExTdjE8L2NvZGU+Ci0gICAgPHA+Ci0gICAgVGhpcyBpcyB0aGUgVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IChUTFMpIHByb3RvY29sLCB2ZXJzaW9uIDEuMC4gSXQgaXMgdGhlCi0gICAgc3VjY2Vzc29yIHRvIFNTTHYzIGFuZCBjdXJyZW50bHkgKGFzIG9mIEZlYnJ1YXJ5IDE5OTkpIHN0aWxsIHVuZGVyCi0gICAgY29uc3RydWN0aW9uIGJ5IHRoZSBJbnRlcm5ldCBFbmdpbmVlcmluZyBUYXNrIEZvcmNlIChJRVRGKS4gSXQncyBzdGlsbAotICAgIG5vdCBzdXBwb3J0ZWQgYnkgYW55IHBvcHVsYXIgYnJvd3NlcnMuPC9wPjwvbGk+Ci0KLTxsaT48Y29kZT5BbGw8L2NvZGU+Ci0gICAgPHA+Ci0gICAgVGhpcyBpcyBhIHNob3J0Y3V0IGZvciBgYDxjb2RlPitTU0x2MiArU1NMdjMgK1RMU3YxPC9jb2RlPicnIGFuZCBhCi0gICAgY29udmluaWVudCB3YXkgZm9yIGVuYWJsaW5nIGFsbCBwcm90b2NvbHMgZXhjZXB0IG9uZSB3aGVuIHVzZWQgaW4KLSAgICBjb21iaW5hdGlvbiB3aXRoIHRoZSBtaW51cyBzaWduIG9uIGEgcHJvdG9jb2wgYXMgdGhlIGV4YW1wbGUgYWJvdmUgCi0gICAgc2hvd3MuPC9wPjwvbGk+Ci08L3VsPgotPGV4YW1wbGU+PHRpdGxlPkV4YW1wbGU8L3RpdGxlPgotIyAgIGVuYWJsZSBTU0x2MyBhbmQgVExTdjEsIGJ1dCBub3QgU1NMdjI8YnIgLz4KLVNTTFByb3RvY29sIGFsbCAtU1NMdjIKLTwvZXhhbXBsZT4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5TU0xDaXBoZXJTdWl0ZTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5DaXBoZXIgU3VpdGUgYXZhaWxhYmxlIGZvciBuZWdvdGlhdGlvbiBpbiBTU0wgCi1oYW5kc2hha2U8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5TU0xDaXBoZXJTdWl0ZSA8ZW0+Y2lwaGVyLXNwZWM8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+U1NMQ2lwaGVyU3VpdGUgQUxMOiFBREg6UkM0K1JTQTorSElHSDorTUVESVVNOitMT1c6K1NTTHYyOitFWFA8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD4KLTxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPkF1dGhDb25maWc8L292ZXJyaWRlPgotCi08dXNhZ2U+Ci08cD4KLVRoaXMgY29tcGxleCBkaXJlY3RpdmUgdXNlcyBhIGNvbG9uLXNlcGFyYXRlZCA8ZW0+Y2lwaGVyLXNwZWM8L2VtPiBzdHJpbmcKLWNvbnNpc3Rpbmcgb2YgT3BlblNTTCBjaXBoZXIgc3BlY2lmaWNhdGlvbnMgdG8gY29uZmlndXJlIHRoZSBDaXBoZXIgU3VpdGUgdGhlCi1jbGllbnQgaXMgcGVybWl0dGVkIHRvIG5lZ290aWF0ZSBpbiB0aGUgU1NMIGhhbmRzaGFrZSBwaGFzZS4gTm90aWNlIHRoYXQgdGhpcwotZGlyZWN0aXZlIGNhbiBiZSB1c2VkIGJvdGggaW4gcGVyLXNlcnZlciBhbmQgcGVyLWRpcmVjdG9yeSBjb250ZXh0LiBJbgotcGVyLXNlcnZlciBjb250ZXh0IGl0IGFwcGxpZXMgdG8gdGhlIHN0YW5kYXJkIFNTTCBoYW5kc2hha2Ugd2hlbiBhIGNvbm5lY3Rpb24KLWlzIGVzdGFibGlzaGVkLiBJbiBwZXItZGlyZWN0b3J5IGNvbnRleHQgaXQgZm9yY2VzIGEgU1NMIHJlbmVnb3RhdGlvbiB3aXRoIHRoZQotcmVjb25maWd1cmVkIENpcGhlciBTdWl0ZSBhZnRlciB0aGUgSFRUUCByZXF1ZXN0IHdhcyByZWFkIGJ1dCBiZWZvcmUgdGhlIEhUVFAKLXJlc3BvbnNlIGlzIHNlbnQuPC9wPgotPHA+Ci1BbiBTU0wgY2lwaGVyIHNwZWNpZmljYXRpb24gaW4gPGVtPmNpcGhlci1zcGVjPC9lbT4gaXMgY29tcG9zZWQgb2YgNCBtYWpvcgotYXR0cmlidXRlcyBwbHVzIGEgZmV3IGV4dHJhIG1pbm9yIG9uZXM6PC9wPgotPHVsPgotPGxpPjxlbT5LZXkgRXhjaGFuZ2UgQWxnb3JpdGhtPC9lbT46PGJyIC8+Ci0gICAgUlNBIG9yIERpZmZpZS1IZWxsbWFuIHZhcmlhbnRzLgotPC9saT4KLTxsaT48ZW0+QXV0aGVudGljYXRpb24gQWxnb3JpdGhtPC9lbT46PGJyIC8+Ci0gICAgUlNBLCBEaWZmaWUtSGVsbG1hbiwgRFNTIG9yIG5vbmUuCi08L2xpPgotPGxpPjxlbT5DaXBoZXIvRW5jcnlwdGlvbiBBbGdvcml0aG08L2VtPjo8YnIgLz4KLSAgICBERVMsIFRyaXBsZS1ERVMsIFJDNCwgUkMyLCBJREVBIG9yIG5vbmUuCi08L2xpPgotPGxpPjxlbT5NQUMgRGlnZXN0IEFsZ29yaXRobTwvZW0+OjxiciAvPgotICAgIE1ENSwgU0hBIG9yIFNIQTEuCi08L2xpPgotPC91bD4KLTxwPkFuIFNTTCBjaXBoZXIgY2FuIGFsc28gYmUgYW4gZXhwb3J0IGNpcGhlciBhbmQgaXMgZWl0aGVyIGEgU1NMdjIgb3IgU1NMdjMvVExTdjEKLWNpcGhlciAoaGVyZSBUTFN2MSBpcyBlcXVpdmFsZW50IHRvIFNTTHYzKS4gVG8gc3BlY2lmeSB3aGljaCBjaXBoZXJzIHRvIHVzZSwKLW9uZSBjYW4gZWl0aGVyIHNwZWNpZnkgYWxsIHRoZSBDaXBoZXJzLCBvbmUgYXQgYSB0aW1lLCBvciB1c2UgYWxpYXNlcyB0bwotc3BlY2lmeSB0aGUgcHJlZmVyZW5jZSBhbmQgb3JkZXIgZm9yIHRoZSBjaXBoZXJzIChzZWUgPGEgaHJlZj0iI3RhYmxlMSI+VGFibGUKLTE8L2E+KS48L3A+Ci0KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08YSBuYW1lPSJ0YWJsZTEiPjwvYT4KLTx0YWJsZSB3aWR0aD0iNjAwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTxjYXB0aW9uIGFsaWduPSJib3R0b20iIGlkPSJzZiI+VGFibGUgMTogT3BlblNTTCBDaXBoZXIgU3BlY2lmaWNhdGlvbiBUYWdzPC9jYXB0aW9uPgotPHRyPjx0ZCBiZ2NvbG9yPSIjY2NjY2NjIj4KLTx0YWJsZSB3aWR0aD0iNTk4IiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiNmZmZmZmYiPgotPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iNTk4IiBzdW1tYXJ5PSIiPgotPHRyIGlkPSJEIj48dGQ+PHN0cm9uZz5UYWc8L3N0cm9uZz48L3RkPiA8dGQ+PHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPjwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkIGNvbHNwYW49IjIiPjxlbT5LZXkgRXhjaGFuZ2UgQWxnb3JpdGhtOjwvZW0+PC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+a1JTQTwvY29kZT48L3RkPiAgIDx0ZD5SU0Ega2V5IGV4Y2hhbmdlPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+a0RIcjwvY29kZT48L3RkPiAgIDx0ZD5EaWZmaWUtSGVsbG1hbiBrZXkgZXhjaGFuZ2Ugd2l0aCBSU0Ega2V5PC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+a0RIZDwvY29kZT48L3RkPiAgIDx0ZD5EaWZmaWUtSGVsbG1hbiBrZXkgZXhjaGFuZ2Ugd2l0aCBEU0Ega2V5PC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+a0VESDwvY29kZT48L3RkPiAgIDx0ZD5FcGhlbWVyYWwgKHRlbXAua2V5KSBEaWZmaWUtSGVsbG1hbiBrZXkgZXhjaGFuZ2UgKG5vIGNlcnQpPC90ZD4gICA8L3RyPgotPHRyIGlkPSJIIj48dGQgY29sc3Bhbj0iMiI+PGVtPkF1dGhlbnRpY2F0aW9uIEFsZ29yaXRobTo8L2VtPjwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPmFOVUxMPC9jb2RlPjwvdGQ+ICA8dGQ+Tm8gYXV0aGVudGljYXRpb248L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5hUlNBPC9jb2RlPjwvdGQ+ICAgPHRkPlJTQSBhdXRoZW50aWNhdGlvbjwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPmFEU1M8L2NvZGU+PC90ZD4gICA8dGQ+RFNTIGF1dGhlbnRpY2F0aW9uPC90ZD4gPC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPmFESDwvY29kZT48L3RkPiAgICA8dGQ+RGlmZmllLUhlbGxtYW4gYXV0aGVudGljYXRpb248L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZCBjb2xzcGFuPSIyIj48ZW0+Q2lwaGVyIEVuY29kaW5nIEFsZ29yaXRobTo8L2VtPjwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPmVOVUxMPC9jb2RlPjwvdGQ+ICA8dGQ+Tm8gZW5jb2Rpbmc8L3RkPiAgICAgICAgIDwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5ERVM8L2NvZGU+PC90ZD4gICAgPHRkPkRFUyBlbmNvZGluZzwvdGQ+ICAgICAgICA8L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+M0RFUzwvY29kZT48L3RkPiAgIDx0ZD5UcmlwbGUtREVTIGVuY29kaW5nPC90ZD4gPC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlJDNDwvY29kZT48L3RkPiAgICA8dGQ+UkM0IGVuY29kaW5nPC90ZD4gICAgICAgPC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlJDMjwvY29kZT48L3RkPiAgICA8dGQ+UkMyIGVuY29kaW5nPC90ZD4gICAgICAgPC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPklERUE8L2NvZGU+PC90ZD4gICA8dGQ+SURFQSBlbmNvZGluZzwvdGQ+ICAgICAgIDwvdHI+Ci08dHIgaWQ9IkgiPjx0ZCBjb2xzcGFuPSIyIj48ZW0+TUFDIERpZ2VzdCBBbGdvcml0aG08L2VtPjo8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5NRDU8L2NvZGU+PC90ZD4gICAgPHRkPk1ENSBoYXNoIGZ1bmN0aW9uPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U0hBMTwvY29kZT48L3RkPiAgIDx0ZD5TSEExIGhhc2ggZnVuY3Rpb248L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TSEE8L2NvZGU+PC90ZD4gICAgPHRkPlNIQSBoYXNoIGZ1bmN0aW9uPC90ZD4gPC90cj4KLTx0ciBpZD0iSCI+PHRkIGNvbHNwYW49IjIiPjxlbT5BbGlhc2VzOjwvZW0+PC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMdjI8L2NvZGU+PC90ZD4gIDx0ZD5hbGwgU1NMIHZlcnNpb24gMi4wIGNpcGhlcnM8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0x2MzwvY29kZT48L3RkPiAgPHRkPmFsbCBTU0wgdmVyc2lvbiAzLjAgY2lwaGVyczwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5UTFN2MTwvY29kZT48L3RkPiAgPHRkPmFsbCBUTFMgdmVyc2lvbiAxLjAgY2lwaGVyczwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5FWFA8L2NvZGU+PC90ZD4gICAgPHRkPmFsbCBleHBvcnQgY2lwaGVyczwvdGQ+ICA8L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+RVhQT1JUNDA8L2NvZGU+PC90ZD4gPHRkPmFsbCA0MC1iaXQgZXhwb3J0IGNpcGhlcnMgb25seTwvdGQ+ICA8L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+RVhQT1JUNTY8L2NvZGU+PC90ZD4gPHRkPmFsbCA1Ni1iaXQgZXhwb3J0IGNpcGhlcnMgb25seTwvdGQ+ICA8L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+TE9XPC9jb2RlPjwvdGQ+ICAgIDx0ZD5hbGwgbG93IHN0cmVuZ3RoIGNpcGhlcnMgKG5vIGV4cG9ydCwgc2luZ2xlIERFUyk8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5NRURJVU08L2NvZGU+PC90ZD4gPHRkPmFsbCBjaXBoZXJzIHdpdGggMTI4IGJpdCBlbmNyeXB0aW9uPC90ZD4gPC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPkhJR0g8L2NvZGU+PC90ZD4gICA8dGQ+YWxsIGNpcGhlcnMgdXNpbmcgVHJpcGxlLURFUzwvdGQ+ICAgICA8L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+UlNBPC9jb2RlPjwvdGQ+ICAgIDx0ZD5hbGwgY2lwaGVycyB1c2luZyBSU0Ega2V5IGV4Y2hhbmdlPC90ZD4gPC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPkRIPC9jb2RlPjwvdGQ+ICAgICA8dGQ+YWxsIGNpcGhlcnMgdXNpbmcgRGlmZmllLUhlbGxtYW4ga2V5IGV4Y2hhbmdlPC90ZD4gPC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPkVESDwvY29kZT48L3RkPiAgICA8dGQ+YWxsIGNpcGhlcnMgdXNpbmcgRXBoZW1lcmFsIERpZmZpZS1IZWxsbWFuIGtleSBleGNoYW5nZTwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5BREg8L2NvZGU+PC90ZD4gICAgPHRkPmFsbCBjaXBoZXJzIHVzaW5nIEFub255bW91cyBEaWZmaWUtSGVsbG1hbiBrZXkgZXhjaGFuZ2U8L3RkPiA8L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+RFNTPC9jb2RlPjwvdGQ+ICAgIDx0ZD5hbGwgY2lwaGVycyB1c2luZyBEU1MgYXV0aGVudGljYXRpb248L3RkPiA8L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+TlVMTDwvY29kZT48L3RkPiAgIDx0ZD5hbGwgY2lwaGVycyB1c2luZyBubyBlbmNyeXB0aW9uPC90ZD4gPC90cj4KLTwvdGFibGU+Ci08L3RkPgotPC90cj48L3RhYmxlPgotPC90ZD48L3RyPjwvdGFibGU+Ci08L2Rpdj4KLTxwPgotTm93IHdoZXJlIHRoaXMgYmVjb21lcyBpbnRlcmVzdGluZyBpcyB0aGF0IHRoZXNlIGNhbiBiZSBwdXQgdG9nZXRoZXIKLXRvIHNwZWNpZnkgdGhlIG9yZGVyIGFuZCBjaXBoZXJzIHlvdSB3aXNoIHRvIHVzZS4gVG8gc3BlZWQgdGhpcyB1cAotdGhlcmUgYXJlIGFsc28gYWxpYXNlcyAoPGNvZGU+U1NMdjIsIFNTTHYzLCBUTFN2MSwgRVhQLCBMT1csIE1FRElVTSwKLUhJR0g8L2NvZGU+KSBmb3IgY2VydGFpbiBncm91cHMgb2YgY2lwaGVycy4gVGhlc2UgdGFncyBjYW4gYmUgam9pbmVkCi10b2dldGhlciB3aXRoIHByZWZpeGVzIHRvIGZvcm0gdGhlIDxlbT5jaXBoZXItc3BlYzwvZW0+LiBBdmFpbGFibGUKLXByZWZpeGVzIGFyZTo8L3A+Ci08dWw+Ci08bGk+bm9uZTogYWRkIGNpcGhlciB0byBsaXN0PC9saT4KLTxsaT48Y29kZT4rPC9jb2RlPjogYWRkIGNpcGhlcnMgdG8gbGlzdCBhbmQgcHVsbCB0aGVtIHRvIGN1cnJlbnQgbG9jYXRpb24gaW4gbGlzdDwvbGk+Ci08bGk+PGNvZGU+LTwvY29kZT46IHJlbW92ZSBjaXBoZXIgZnJvbSBsaXN0IChjYW4gYmUgYWRkZWQgbGF0ZXIgYWdhaW4pPC9saT4KLTxsaT48Y29kZT4hPC9jb2RlPjoga2lsbCBjaXBoZXIgZnJvbSBsaXN0IGNvbXBsZXRlbHkgKGNhbiA8c3Ryb25nPm5vdDwvc3Ryb25nPiBiZSBhZGRlZCBsYXRlciBhZ2Fpbik8L2xpPgotPC91bD4KLTxwPkEgc2ltcGxlciB3YXkgdG8gbG9vayBhdCBhbGwgb2YgdGhpcyBpcyB0byB1c2UgdGhlIGBgPGNvZGU+b3BlbnNzbCBjaXBoZXJzCi0tdjwvY29kZT4nJyBjb21tYW5kIHdoaWNoIHByb3ZpZGVzIGEgbmljZSB3YXkgdG8gc3VjY2Vzc2l2ZWx5IGNyZWF0ZSB0aGUKLWNvcnJlY3QgPGVtPmNpcGhlci1zcGVjPC9lbT4gc3RyaW5nLiBUaGUgZGVmYXVsdCA8ZW0+Y2lwaGVyLXNwZWM8L2VtPiBzdHJpbmcKLWlzIGBgPGNvZGU+QUxMOiFBREg6UkM0K1JTQTorSElHSDorTUVESVVNOitMT1c6K1NTTHYyOitFWFA8L2NvZGU+Jycgd2hpY2gKLW1lYW5zIHRoZSBmb2xsb3dpbmc6IGZpcnN0LCByZW1vdmUgZnJvbSBjb25zaWRlcmF0aW9uIGFueSBjaXBoZXJzIHRoYXQgZG8gbm90Ci1hdXRoZW50aWNhdGUsIGkuZS4gZm9yIFNTTCBvbmx5IHRoZSBBbm9ueW1vdXMgRGlmZmllLUhlbGxtYW4gY2lwaGVycy4gTmV4dCwKLXVzZSBjaXBoZXJzIHVzaW5nIFJDNCBhbmQgUlNBLiBOZXh0IGluY2x1ZGUgdGhlIGhpZ2gsIG1lZGl1bSBhbmQgdGhlbiB0aGUgbG93Ci1zZWN1cml0eSBjaXBoZXJzLiBGaW5hbGx5IDxlbT5wdWxsPC9lbT4gYWxsIFNTTHYyIGFuZCBleHBvcnQgY2lwaGVycyB0byB0aGUKLWVuZCBvZiB0aGUgbGlzdC48L3A+Ci08ZXhhbXBsZT4KLTxwcmU+Ci0kIG9wZW5zc2wgY2lwaGVycyAtdiAnQUxMOiFBREg6UkM0K1JTQTorSElHSDorTUVESVVNOitMT1c6K1NTTHYyOitFWFAnCi1OVUxMLVNIQSAgICAgICAgICAgICAgICBTU0x2MyBLeD1SU0EgICAgICBBdT1SU0EgIEVuYz1Ob25lICAgICAgTWFjPVNIQTEKLU5VTEwtTUQ1ICAgICAgICAgICAgICAgIFNTTHYzIEt4PVJTQSAgICAgIEF1PVJTQSAgRW5jPU5vbmUgICAgICBNYWM9TUQ1Ci1FREgtUlNBLURFUy1DQkMzLVNIQSAgICBTU0x2MyBLeD1ESCAgICAgICBBdT1SU0EgIEVuYz0zREVTKDE2OCkgTWFjPVNIQTEKLS4uLiAgICAgICAgICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgIC4uLiAgICAgLi4uICAgICAgICAgICAuLi4KLUVYUC1SQzQtTUQ1ICAgICAgICAgICAgIFNTTHYzIEt4PVJTQSg1MTIpIEF1PVJTQSAgRW5jPVJDNCg0MCkgICBNYWM9TUQ1ICBleHBvcnQKLUVYUC1SQzItQ0JDLU1ENSAgICAgICAgIFNTTHYyIEt4PVJTQSg1MTIpIEF1PVJTQSAgRW5jPVJDMig0MCkgICBNYWM9TUQ1ICBleHBvcnQKLUVYUC1SQzQtTUQ1ICAgICAgICAgICAgIFNTTHYyIEt4PVJTQSg1MTIpIEF1PVJTQSAgRW5jPVJDNCg0MCkgICBNYWM9TUQ1ICBleHBvcnQKLTwvcHJlPgotPC9leGFtcGxlPgotPHA+VGhlIGNvbXBsZXRlIGxpc3Qgb2YgcGFydGljdWxhciBSU0EgJmFtcDsgREggY2lwaGVycyBmb3IgU1NMIGlzIGdpdmVuIGluIDxhCi1ocmVmPSIjdGFibGUyIj5UYWJsZSAyPC9hPi48L3A+Ci08ZXhhbXBsZT48dGl0bGU+RXhhbXBsZTwvdGl0bGU+Ci1TU0xDaXBoZXJTdWl0ZSBSU0E6IUVYUDohTlVMTDorSElHSDorTUVESVVNOi1MT1cKLTwvZXhhbXBsZT4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08YSBuYW1lPSJ0YWJsZTIiPjwvYT4KLTx0YWJsZSB3aWR0aD0iNjAwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTxjYXB0aW9uIGFsaWduPSJib3R0b20iIGlkPSJzZiI+VGFibGUgMjogUGFydGljdWxhciBTU0wgQ2lwaGVyczwvY2FwdGlvbj4KLTx0cj48dGQgYmdjb2xvcj0iI2NjY2NjYyI+Ci08dGFibGUgd2lkdGg9IjU5OCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjZmZmZmZmIj4KLTx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjU5OCIgc3VtbWFyeT0iIj4KLTx0ciBpZD0iRCI+PHRkPjxzdHJvbmc+Q2lwaGVyLVRhZzwvc3Ryb25nPjwvdGQ+IDx0ZD48c3Ryb25nPlByb3RvY29sPC9zdHJvbmc+PC90ZD4gPHRkPjxzdHJvbmc+S2V5IEV4Ljwvc3Ryb25nPjwvdGQ+IDx0ZD48c3Ryb25nPkF1dGguPC9zdHJvbmc+PC90ZD4gPHRkPjxzdHJvbmc+RW5jLjwvc3Ryb25nPjwvdGQ+IDx0ZD48c3Ryb25nPk1BQzwvc3Ryb25nPjwvdGQ+IDx0ZD48c3Ryb25nPlR5cGU8L3N0cm9uZz48L3RkPiA8L3RyPgotPHRyIGlkPSJIIj48dGQgY29sc3Bhbj0iNyI+PGVtPlJTQSBDaXBoZXJzOjwvZW0+PC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+REVTLUNCQzMtU0hBPC9jb2RlPjwvdGQ+IDx0ZD5TU0x2MzwvdGQ+IDx0ZD5SU0E8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPjNERVMoMTY4KTwvdGQ+IDx0ZD5TSEExPC90ZD4gPHRkPiZuYnNwOzwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5ERVMtQ0JDMy1NRDU8L2NvZGU+PC90ZD4gPHRkPlNTTHYyPC90ZD4gPHRkPlJTQTwvdGQ+IDx0ZD5SU0E8L3RkPiA8dGQ+M0RFUygxNjgpPC90ZD4gPHRkPk1ENTwvdGQ+IDx0ZD4mbmJzcDsgPC90ZD4gPC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPklERUEtQ0JDLVNIQTwvY29kZT48L3RkPiA8dGQ+U1NMdjM8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPlJTQTwvdGQ+IDx0ZD5JREVBKDEyOCk8L3RkPiA8dGQ+U0hBMTwvdGQ+IDx0ZD4mbmJzcDs8L3RkPiA8L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+UkM0LVNIQTwvY29kZT48L3RkPiA8dGQ+U1NMdjM8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPlJTQTwvdGQ+IDx0ZD5SQzQoMTI4KTwvdGQ+IDx0ZD5TSEExPC90ZD4gPHRkPiZuYnNwOzwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5SQzQtTUQ1PC9jb2RlPjwvdGQ+IDx0ZD5TU0x2MzwvdGQ+IDx0ZD5SU0E8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPlJDNCgxMjgpPC90ZD4gPHRkPk1ENTwvdGQ+IDx0ZD4mbmJzcDsgPC90ZD4gPC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPklERUEtQ0JDLU1ENTwvY29kZT48L3RkPiA8dGQ+U1NMdjI8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPlJTQTwvdGQ+IDx0ZD5JREVBKDEyOCk8L3RkPiA8dGQ+TUQ1PC90ZD4gPHRkPiZuYnNwOyA8L3RkPiA8L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+UkMyLUNCQy1NRDU8L2NvZGU+PC90ZD4gPHRkPlNTTHYyPC90ZD4gPHRkPlJTQTwvdGQ+IDx0ZD5SU0E8L3RkPiA8dGQ+UkMyKDEyOCk8L3RkPiA8dGQ+TUQ1PC90ZD4gPHRkPiZuYnNwOyA8L3RkPiA8L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+UkM0LU1ENTwvY29kZT48L3RkPiA8dGQ+U1NMdjI8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPlJTQTwvdGQ+IDx0ZD5SQzQoMTI4KTwvdGQ+IDx0ZD5NRDU8L3RkPiA8dGQ+Jm5ic3A7IDwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5ERVMtQ0JDLVNIQTwvY29kZT48L3RkPiA8dGQ+U1NMdjM8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPlJTQTwvdGQ+IDx0ZD5ERVMoNTYpPC90ZD4gPHRkPlNIQTE8L3RkPiA8dGQ+Jm5ic3A7PC90ZD4gPC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlJDNC02NC1NRDU8L2NvZGU+PC90ZD4gPHRkPlNTTHYyPC90ZD4gPHRkPlJTQTwvdGQ+IDx0ZD5SU0E8L3RkPiA8dGQ+UkM0KDY0KTwvdGQ+IDx0ZD5NRDU8L3RkPiA8dGQ+Jm5ic3A7IDwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5ERVMtQ0JDLU1ENTwvY29kZT48L3RkPiA8dGQ+U1NMdjI8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPlJTQTwvdGQ+IDx0ZD5ERVMoNTYpPC90ZD4gPHRkPk1ENTwvdGQ+IDx0ZD4mbmJzcDsgPC90ZD4gPC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPkVYUC1ERVMtQ0JDLVNIQTwvY29kZT48L3RkPiA8dGQ+U1NMdjM8L3RkPiA8dGQ+UlNBKDUxMik8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPkRFUyg0MCk8L3RkPiA8dGQ+U0hBMTwvdGQ+IDx0ZD4gZXhwb3J0PC90ZD4gPC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPkVYUC1SQzItQ0JDLU1ENTwvY29kZT48L3RkPiA8dGQ+U1NMdjM8L3RkPiA8dGQ+UlNBKDUxMik8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPlJDMig0MCk8L3RkPiA8dGQ+TUQ1PC90ZD4gPHRkPiAgZXhwb3J0PC90ZD4gPC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPkVYUC1SQzQtTUQ1PC9jb2RlPjwvdGQ+IDx0ZD5TU0x2MzwvdGQ+IDx0ZD5SU0EoNTEyKTwvdGQ+IDx0ZD5SU0E8L3RkPiA8dGQ+UkM0KDQwKTwvdGQ+IDx0ZD5NRDU8L3RkPiA8dGQ+ICBleHBvcnQ8L3RkPiA8L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+RVhQLVJDMi1DQkMtTUQ1PC9jb2RlPjwvdGQ+IDx0ZD5TU0x2MjwvdGQ+IDx0ZD5SU0EoNTEyKTwvdGQ+IDx0ZD5SU0E8L3RkPiA8dGQ+UkMyKDQwKTwvdGQ+IDx0ZD5NRDU8L3RkPiA8dGQ+ICBleHBvcnQ8L3RkPiA8L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+RVhQLVJDNC1NRDU8L2NvZGU+PC90ZD4gPHRkPlNTTHYyPC90ZD4gPHRkPlJTQSg1MTIpPC90ZD4gPHRkPlJTQTwvdGQ+IDx0ZD5SQzQoNDApPC90ZD4gPHRkPk1ENTwvdGQ+IDx0ZD4gIGV4cG9ydDwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5OVUxMLVNIQTwvY29kZT48L3RkPiA8dGQ+U1NMdjM8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPlJTQTwvdGQ+IDx0ZD5Ob25lPC90ZD4gPHRkPlNIQTE8L3RkPiA8dGQ+Jm5ic3A7PC90ZD4gPC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPk5VTEwtTUQ1PC9jb2RlPjwvdGQ+IDx0ZD5TU0x2MzwvdGQ+IDx0ZD5SU0E8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPk5vbmU8L3RkPiA8dGQ+TUQ1PC90ZD4gPHRkPiZuYnNwOyA8L3RkPiA8L3RyPgotPHRyIGlkPSJEIj48dGQgY29sc3Bhbj0iNyI+PGVtPkRpZmZpZS1IZWxsbWFuIENpcGhlcnM6PC9lbT48L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5BREgtREVTLUNCQzMtU0hBPC9jb2RlPjwvdGQ+IDx0ZD5TU0x2MzwvdGQ+IDx0ZD5ESDwvdGQ+IDx0ZD5Ob25lPC90ZD4gPHRkPjNERVMoMTY4KTwvdGQ+IDx0ZD5TSEExPC90ZD4gPHRkPiZuYnNwOzwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5BREgtREVTLUNCQy1TSEE8L2NvZGU+PC90ZD4gPHRkPlNTTHYzPC90ZD4gPHRkPkRIPC90ZD4gPHRkPk5vbmU8L3RkPiA8dGQ+REVTKDU2KTwvdGQ+IDx0ZD5TSEExPC90ZD4gPHRkPiZuYnNwOzwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5BREgtUkM0LU1ENTwvY29kZT48L3RkPiA8dGQ+U1NMdjM8L3RkPiA8dGQ+REg8L3RkPiA8dGQ+Tm9uZTwvdGQ+IDx0ZD5SQzQoMTI4KTwvdGQ+IDx0ZD5NRDU8L3RkPiA8dGQ+Jm5ic3A7IDwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5FREgtUlNBLURFUy1DQkMzLVNIQTwvY29kZT48L3RkPiA8dGQ+U1NMdjM8L3RkPiA8dGQ+REg8L3RkPiA8dGQ+UlNBPC90ZD4gPHRkPjNERVMoMTY4KTwvdGQ+IDx0ZD5TSEExPC90ZD4gPHRkPiZuYnNwOzwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5FREgtRFNTLURFUy1DQkMzLVNIQTwvY29kZT48L3RkPiA8dGQ+U1NMdjM8L3RkPiA8dGQ+REg8L3RkPiA8dGQ+RFNTPC90ZD4gPHRkPjNERVMoMTY4KTwvdGQ+IDx0ZD5TSEExPC90ZD4gPHRkPiZuYnNwOzwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5FREgtUlNBLURFUy1DQkMtU0hBPC9jb2RlPjwvdGQ+IDx0ZD5TU0x2MzwvdGQ+IDx0ZD5ESDwvdGQ+IDx0ZD5SU0E8L3RkPiA8dGQ+REVTKDU2KTwvdGQ+IDx0ZD5TSEExPC90ZD4gPHRkPiZuYnNwOzwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5FREgtRFNTLURFUy1DQkMtU0hBPC9jb2RlPjwvdGQ+IDx0ZD5TU0x2MzwvdGQ+IDx0ZD5ESDwvdGQ+IDx0ZD5EU1M8L3RkPiA8dGQ+REVTKDU2KTwvdGQ+IDx0ZD5TSEExPC90ZD4gPHRkPiZuYnNwOzwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5FWFAtRURILVJTQS1ERVMtQ0JDLVNIQTwvY29kZT48L3RkPiA8dGQ+U1NMdjM8L3RkPiA8dGQ+REgoNTEyKTwvdGQ+IDx0ZD5SU0E8L3RkPiA8dGQ+REVTKDQwKTwvdGQ+IDx0ZD5TSEExPC90ZD4gPHRkPiBleHBvcnQ8L3RkPiA8L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+RVhQLUVESC1EU1MtREVTLUNCQy1TSEE8L2NvZGU+PC90ZD4gPHRkPlNTTHYzPC90ZD4gPHRkPkRIKDUxMik8L3RkPiA8dGQ+RFNTPC90ZD4gPHRkPkRFUyg0MCk8L3RkPiA8dGQ+U0hBMTwvdGQ+IDx0ZD4gZXhwb3J0PC90ZD4gPC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPkVYUC1BREgtREVTLUNCQy1TSEE8L2NvZGU+PC90ZD4gPHRkPlNTTHYzPC90ZD4gPHRkPkRIKDUxMik8L3RkPiA8dGQ+Tm9uZTwvdGQ+IDx0ZD5ERVMoNDApPC90ZD4gPHRkPlNIQTE8L3RkPiA8dGQ+IGV4cG9ydDwvdGQ+IDwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5FWFAtQURILVJDNC1NRDU8L2NvZGU+PC90ZD4gPHRkPlNTTHYzPC90ZD4gPHRkPkRIKDUxMik8L3RkPiA8dGQ+Tm9uZTwvdGQ+IDx0ZD5SQzQoNDApPC90ZD4gPHRkPk1ENTwvdGQ+IDx0ZD4gIGV4cG9ydDwvdGQ+IDwvdHI+Ci08L3RhYmxlPgotPC90ZD4KLTwvdHI+PC90YWJsZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotPC9kaXY+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U1NMQ2VydGlmaWNhdGVGaWxlPC9uYW1lPgotPGRlc2NyaXB0aW9uPlNlcnZlciBQRU0tZW5jb2RlZCBYLjUwOSBDZXJ0aWZpY2F0ZSBmaWxlPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+U1NMQ2VydGlmaWNhdGVGaWxlIDxlbT5maWxlLXBhdGg8L2VtPjwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+Ci08Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotPHA+Ci1UaGlzIGRpcmVjdGl2ZSBwb2ludHMgdG8gdGhlIFBFTS1lbmNvZGVkIENlcnRpZmljYXRlIGZpbGUgZm9yIHRoZSBzZXJ2ZXIgYW5kCi1vcHRpb25hbGx5IGFsc28gdG8gdGhlIGNvcnJlc3BvbmRpbmcgUlNBIG9yIERTQSBQcml2YXRlIEtleSBmaWxlIGZvciBpdAotKGNvbnRhaW5lZCBpbiB0aGUgc2FtZSBmaWxlKS4gSWYgdGhlIGNvbnRhaW5lZCBQcml2YXRlIEtleSBpcyBlbmNyeXB0ZWQgdGhlCi1QYXNzIFBocmFzZSBkaWFsb2cgaXMgZm9yY2VkIGF0IHN0YXJ0dXAgdGltZS4gVGhpcyBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdXAgdG8KLXR3byB0aW1lcyAocmVmZXJlbmNpbmcgZGlmZmVyZW50IGZpbGVuYW1lcykgd2hlbiBib3RoIGEgUlNBIGFuZCBhIERTQSBiYXNlZAotc2VydmVyIGNlcnRpZmljYXRlIGlzIHVzZWQgaW4gcGFyYWxsZWwuPC9wPgotPGV4YW1wbGU+PHRpdGxlPkV4YW1wbGU8L3RpdGxlPgotU1NMQ2VydGlmaWNhdGVGaWxlIC91c3IvbG9jYWwvYXBhY2hlL2NvbmYvc3NsLmNydC9zZXJ2ZXIuY3J0Ci08L2V4YW1wbGU+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U1NMQ2VydGlmaWNhdGVLZXlGaWxlPC9uYW1lPgotPGRlc2NyaXB0aW9uPlNlcnZlciBQRU0tZW5jb2RlZCBQcml2YXRlIEtleSBmaWxlPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+U1NMQ2VydGlmaWNhdGVLZXlGaWxlIDxlbT5maWxlLXBhdGg8L2VtPjwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+Ci08Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotPHA+Ci1UaGlzIGRpcmVjdGl2ZSBwb2ludHMgdG8gdGhlIFBFTS1lbmNvZGVkIFByaXZhdGUgS2V5IGZpbGUgZm9yIHRoZQotc2VydmVyLiBJZiB0aGUgUHJpdmF0ZSBLZXkgaXMgbm90IGNvbWJpbmVkIHdpdGggdGhlIENlcnRpZmljYXRlIGluIHRoZQotPGRpcmVjdGl2ZT5TU0xDZXJ0aWZpY2F0ZUZpbGU8L2RpcmVjdGl2ZT4sIHVzZSB0aGlzIGFkZGl0aW9uYWwgZGlyZWN0aXZlIHRvCi1wb2ludCB0byB0aGUgZmlsZSB3aXRoIHRoZSBzdGFuZC1hbG9uZSBQcml2YXRlIEtleS4gV2hlbgotPGRpcmVjdGl2ZT5TU0xDZXJ0aWZpY2F0ZUZpbGU8L2RpcmVjdGl2ZT4gaXMgdXNlZCBhbmQgdGhlIGZpbGUKLWNvbnRhaW5zIGJvdGggdGhlIENlcnRpZmljYXRlIGFuZCB0aGUgUHJpdmF0ZSBLZXkgdGhpcyBkaXJlY3RpdmUgbmVlZAotbm90IGJlIHVzZWQuIEJ1dCB3ZSBzdHJvbmdseSBkaXNjb3VyYWdlIHRoaXMgcHJhY3RpY2UuICBJbnN0ZWFkIHdlCi1yZWNvbW1lbmQgeW91IHRvIHNlcGFyYXRlIHRoZSBDZXJ0aWZpY2F0ZSBhbmQgdGhlIFByaXZhdGUgS2V5LiBJZiB0aGUKLWNvbnRhaW5lZCBQcml2YXRlIEtleSBpcyBlbmNyeXB0ZWQsIHRoZSBQYXNzIFBocmFzZSBkaWFsb2cgaXMgZm9yY2VkCi1hdCBzdGFydHVwIHRpbWUuIFRoaXMgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHVwIHRvIHR3byB0aW1lcwotKHJlZmVyZW5jaW5nIGRpZmZlcmVudCBmaWxlbmFtZXMpIHdoZW4gYm90aCBhIFJTQSBhbmQgYSBEU0EgYmFzZWQKLXByaXZhdGUga2V5IGlzIHVzZWQgaW4gcGFyYWxsZWwuPC9wPgotPGV4YW1wbGU+PHRpdGxlPkV4YW1wbGU8L3RpdGxlPgotU1NMQ2VydGlmaWNhdGVLZXlGaWxlIC91c3IvbG9jYWwvYXBhY2hlL2NvbmYvc3NsLmtleS9zZXJ2ZXIua2V5Ci08L2V4YW1wbGU+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U1NMQ2VydGlmaWNhdGVDaGFpbkZpbGU8L25hbWU+Ci08ZGVzY3JpcHRpb24+RmlsZSBvZiBQRU0tZW5jb2RlZCBTZXJ2ZXIgQ0EgQ2VydGlmaWNhdGVzPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+U1NMQ2VydGlmaWNhdGVDaGFpbkZpbGUgPGVtPmZpbGUtcGF0aDwvZW0+PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci08cD4KLVRoaXMgZGlyZWN0aXZlIHNldHMgdGhlIG9wdGlvbmFsIDxlbT5hbGwtaW4tb25lPC9lbT4gZmlsZSB3aGVyZSB5b3UgY2FuCi1hc3NlbWJsZSB0aGUgY2VydGlmaWNhdGVzIG9mIENlcnRpZmljYXRpb24gQXV0aG9yaXRpZXMgKENBKSB3aGljaCBmb3JtIHRoZQotY2VydGlmaWNhdGUgY2hhaW4gb2YgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZS4gVGhpcyBzdGFydHMgd2l0aCB0aGUgaXNzdWluZyBDQQotY2VydGlmaWNhdGUgb2Ygb2YgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBhbmQgY2FuIHJhbmdlIHVwIHRvIHRoZSByb290IENBCi1jZXJ0aWZpY2F0ZS4gU3VjaCBhIGZpbGUgaXMgc2ltcGx5IHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSB2YXJpb3VzCi1QRU0tZW5jb2RlZCBDQSBDZXJ0aWZpY2F0ZSBmaWxlcywgdXN1YWxseSBpbiBjZXJ0aWZpY2F0ZSBjaGFpbiBvcmRlci48L3A+Ci08cD4KLVRoaXMgc2hvdWxkIGJlIHVzZWQgYWx0ZXJuYXRpdmVseSBhbmQvb3IgYWRkaXRpb25hbGx5IHRvIDxkaXJlY3RpdmUKLW1vZHVsZT0ibW9kX3NzbCI+U1NMQ0FDZXJ0aWZpY2F0ZVBhdGg8L2RpcmVjdGl2ZT4gZm9yIGV4cGxpY2l0bHkKLWNvbnN0cnVjdGluZyB0aGUgc2VydmVyIGNlcnRpZmljYXRlIGNoYWluIHdoaWNoIGlzIHNlbnQgdG8gdGhlIGJyb3dzZXIKLWluIGFkZGl0aW9uIHRvIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUuIEl0IGlzIGVzcGVjaWFsbHkgdXNlZnVsIHRvCi1hdm9pZCBjb25mbGljdHMgd2l0aCBDQSBjZXJ0aWZpY2F0ZXMgd2hlbiB1c2luZyBjbGllbnQKLWF1dGhlbnRpY2F0aW9uLiBCZWNhdXNlIGFsdGhvdWdoIHBsYWNpbmcgYSBDQSBjZXJ0aWZpY2F0ZSBvZiB0aGUKLXNlcnZlciBjZXJ0aWZpY2F0ZSBjaGFpbiBpbnRvIDxkaXJlY3RpdmUKLW1vZHVsZT0ibW9kX3NzbCI+U1NMQ0FDZXJ0aWZpY2F0ZVBhdGg8L2RpcmVjdGl2ZT4gaGFzIHRoZSBzYW1lIGVmZmVjdAotZm9yIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiBjb25zdHJ1Y3Rpb24sIGl0IGhhcyB0aGUgc2lkZS1lZmZlY3QgdGhhdAotY2xpZW50IGNlcnRpZmljYXRlcyBpc3N1ZWQgYnkgdGhpcyBzYW1lIENBIGNlcnRpZmljYXRlIGFyZSBhbHNvCi1hY2NlcHRlZCBvbiBjbGllbnQgYXV0aGVudGljYXRpb24uIFRoYXQncyB1c3VhbGx5IG5vdCBvbmUgZXhwZWN0LjwvcD4KLTxwPgotQnV0IGJlIGNhcmVmdWw6IFByb3ZpZGluZyB0aGUgY2VydGlmaWNhdGUgY2hhaW4gd29ya3Mgb25seSBpZiB5b3UgYXJlIHVzaW5nIGEKLTxlbT5zaW5nbGU8L2VtPiAoZWl0aGVyIFJTQSA8ZW0+b3I8L2VtPiBEU0EpIGJhc2VkIHNlcnZlciBjZXJ0aWZpY2F0ZS4gSWYgeW91IGFyZQotdXNpbmcgYSBjb3VwbGVkIFJTQStEU0EgY2VydGlmaWNhdGUgcGFpciwgdGhpcyB3aWxsIHdvcmsgb25seSBpZiBhY3R1YWxseSBib3RoCi1jZXJ0aWZpY2F0ZXMgdXNlIHRoZSA8ZW0+c2FtZTwvZW0+IGNlcnRpZmljYXRlIGNoYWluLiBFbHNlIHRoZSBicm93c2VycyB3aWxsIGJlCi1jb25mdXNlZCBpbiB0aGlzIHNpdHVhdGlvbi48L3A+Ci08ZXhhbXBsZT48dGl0bGU+RXhhbXBsZTwvdGl0bGU+Ci1TU0xDZXJ0aWZpY2F0ZUNoYWluRmlsZSAvdXNyL2xvY2FsL2FwYWNoZS9jb25mL3NzbC5jcnQvY2EuY3J0Ci08L2V4YW1wbGU+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U1NMQ0FDZXJ0aWZpY2F0ZVBhdGg8L25hbWU+Ci08ZGVzY3JpcHRpb24+RGlyZWN0b3J5IG9mIFBFTS1lbmNvZGVkIENBIENlcnRpZmljYXRlcyBmb3IgCi1DbGllbnQgQXV0aDwvZGVzY3JpcHRpb24+Ci08c3ludGF4PlNTTENBQ2VydGlmaWNhdGVQYXRoIDxlbT5kaXJlY3RvcnktcGF0aDwvZW0+PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci08cD4KLVRoaXMgZGlyZWN0aXZlIHNldHMgdGhlIGRpcmVjdG9yeSB3aGVyZSB5b3Uga2VlcCB0aGUgQ2VydGlmaWNhdGVzIG9mCi1DZXJ0aWZpY2F0aW9uIEF1dGhvcml0aWVzIChDQXMpIHdob3NlIGNsaWVudHMgeW91IGRlYWwgd2l0aC4gVGhlc2UgYXJlIHVzZWQgdG8KLXZlcmlmeSB0aGUgY2xpZW50IGNlcnRpZmljYXRlIG9uIENsaWVudCBBdXRoZW50aWNhdGlvbi48L3A+Ci08cD4KLVRoZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBoYXZlIHRvIGJlIFBFTS1lbmNvZGVkIGFuZCBhcmUgYWNjZXNzZWQgdGhyb3VnaAotaGFzaCBmaWxlbmFtZXMuIFNvIHVzdWFsbHkgeW91IGNhbid0IGp1c3QgcGxhY2UgdGhlIENlcnRpZmljYXRlIGZpbGVzCi10aGVyZTogeW91IGFsc28gaGF2ZSB0byBjcmVhdGUgc3ltYm9saWMgbGlua3MgbmFtZWQKLTxlbT5oYXNoLXZhbHVlPC9lbT48Y29kZT4uTjwvY29kZT4uIEFuZCB5b3Ugc2hvdWxkIGFsd2F5cyBtYWtlIHN1cmUgdGhpcyBkaXJlY3RvcnkKLWNvbnRhaW5zIHRoZSBhcHByb3ByaWF0ZSBzeW1ib2xpYyBsaW5rcy4gVXNlIHRoZSA8Y29kZT5NYWtlZmlsZTwvY29kZT4gd2hpY2gKLWNvbWVzIHdpdGggbW9kX3NzbCB0byBhY2NvbXBsaXNoIHRoaXMgdGFzay48L3A+Ci08ZXhhbXBsZT48dGl0bGU+RXhhbXBsZTwvdGl0bGU+Ci1TU0xDQUNlcnRpZmljYXRlUGF0aCAvdXNyL2xvY2FsL2FwYWNoZS9jb25mL3NzbC5jcnQvCi08L2V4YW1wbGU+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U1NMQ0FDZXJ0aWZpY2F0ZUZpbGU8L25hbWU+Ci08ZGVzY3JpcHRpb24+RmlsZSBvZiBjb25jYXRlbmF0ZWQgUEVNLWVuY29kZWQgQ0EgQ2VydGlmaWNhdGVzIAotZm9yIENsaWVudCBBdXRoPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+U1NMQ0FDZXJ0aWZpY2F0ZUZpbGUgPGVtPmZpbGUtcGF0aDwvZW0+PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci08cD4KLVRoaXMgZGlyZWN0aXZlIHNldHMgdGhlIDxlbT5hbGwtaW4tb25lPC9lbT4gZmlsZSB3aGVyZSB5b3UgY2FuIGFzc2VtYmxlIHRoZQotQ2VydGlmaWNhdGVzIG9mIENlcnRpZmljYXRpb24gQXV0aG9yaXRpZXMgKENBKSB3aG9zZSA8ZW0+Y2xpZW50czwvZW0+IHlvdSBkZWFsCi13aXRoLiBUaGVzZSBhcmUgdXNlZCBmb3IgQ2xpZW50IEF1dGhlbnRpY2F0aW9uLiBTdWNoIGEgZmlsZSBpcyBzaW1wbHkgdGhlCi1jb25jYXRlbmF0aW9uIG9mIHRoZSB2YXJpb3VzIFBFTS1lbmNvZGVkIENlcnRpZmljYXRlIGZpbGVzLCBpbiBvcmRlciBvZgotcHJlZmVyZW5jZS4gVGhpcyBjYW4gYmUgdXNlZCBhbHRlcm5hdGl2ZWx5IGFuZC9vciBhZGRpdGlvbmFsbHkgdG8gCi08ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX3NzbCI+U1NMQ0FDZXJ0aWZpY2F0ZVBhdGg8L2RpcmVjdGl2ZT4uPC9wPgotPGV4YW1wbGU+PHRpdGxlPkV4YW1wbGU8L3RpdGxlPgotU1NMQ0FDZXJ0aWZpY2F0ZUZpbGUgL3Vzci9sb2NhbC9hcGFjaGUvY29uZi9zc2wuY3J0L2NhLWJ1bmRsZS1jbGllbnQuY3J0Ci08L2V4YW1wbGU+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U1NMQ0FSZXZvY2F0aW9uUGF0aDwvbmFtZT4KLTxkZXNjcmlwdGlvbj5EaXJlY3Rvcnkgb2YgUEVNLWVuY29kZWQgQ0EgQ1JMcyBmb3IgCi1DbGllbnQgQXV0aDwvZGVzY3JpcHRpb24+Ci08c3ludGF4PlNTTENBUmV2b2NhdGlvblBhdGggPGVtPmRpcmVjdG9yeS1wYXRoPC9lbT48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PgotPGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLTxwPgotVGhpcyBkaXJlY3RpdmUgc2V0cyB0aGUgZGlyZWN0b3J5IHdoZXJlIHlvdSBrZWVwIHRoZSBDZXJ0aWZpY2F0ZSBSZXZvY2F0aW9uCi1MaXN0cyAoQ1JMKSBvZiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0aWVzIChDQXMpIHdob3NlIGNsaWVudHMgeW91IGRlYWwgd2l0aC4KLVRoZXNlIGFyZSB1c2VkIHRvIHJldm9rZSB0aGUgY2xpZW50IGNlcnRpZmljYXRlIG9uIENsaWVudCBBdXRoZW50aWNhdGlvbi48L3A+Ci08cD4KLVRoZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBoYXZlIHRvIGJlIFBFTS1lbmNvZGVkIGFuZCBhcmUgYWNjZXNzZWQgdGhyb3VnaAotaGFzaCBmaWxlbmFtZXMuIFNvIHVzdWFsbHkgeW91IGhhdmUgbm90IG9ubHkgdG8gcGxhY2UgdGhlIENSTCBmaWxlcyB0aGVyZS4KLUFkZGl0aW9uYWxseSB5b3UgaGF2ZSB0byBjcmVhdGUgc3ltYm9saWMgbGlua3MgbmFtZWQKLTxlbT5oYXNoLXZhbHVlPC9lbT48Y29kZT4uck48L2NvZGU+LiBBbmQgeW91IHNob3VsZCBhbHdheXMgbWFrZSBzdXJlIHRoaXMgZGlyZWN0b3J5Ci1jb250YWlucyB0aGUgYXBwcm9wcmlhdGUgc3ltYm9saWMgbGlua3MuIFVzZSB0aGUgPGNvZGU+TWFrZWZpbGU8L2NvZGU+IHdoaWNoCi1jb21lcyB3aXRoIDxtb2R1bGU+bW9kX3NzbDwvbW9kdWxlPiB0byBhY2NvbXBsaXNoIHRoaXMgdGFzay48L3A+Ci08ZXhhbXBsZT48dGl0bGU+RXhhbXBsZTwvdGl0bGU+Ci1TU0xDQVJldm9jYXRpb25QYXRoIC91c3IvbG9jYWwvYXBhY2hlL2NvbmYvc3NsLmNybC8KLTwvZXhhbXBsZT4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5TU0xDQVJldm9jYXRpb25GaWxlPC9uYW1lPgotPGRlc2NyaXB0aW9uPkZpbGUgb2YgY29uY2F0ZW5hdGVkIFBFTS1lbmNvZGVkIENBIENSTHMgZm9yIAotQ2xpZW50IEF1dGg8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5TU0xDQVJldm9jYXRpb25GaWxlIDxlbT5maWxlLXBhdGg8L2VtPjwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+Ci08Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotPHA+Ci1UaGlzIGRpcmVjdGl2ZSBzZXRzIHRoZSA8ZW0+YWxsLWluLW9uZTwvZW0+IGZpbGUgd2hlcmUgeW91IGNhbgotYXNzZW1ibGUgdGhlIENlcnRpZmljYXRlIFJldm9jYXRpb24gTGlzdHMgKENSTCkgb2YgQ2VydGlmaWNhdGlvbgotQXV0aG9yaXRpZXMgKENBKSB3aG9zZSA8ZW0+Y2xpZW50czwvZW0+IHlvdSBkZWFsIHdpdGguIFRoZXNlIGFyZSB1c2VkCi1mb3IgQ2xpZW50IEF1dGhlbnRpY2F0aW9uLiAgU3VjaCBhIGZpbGUgaXMgc2ltcGx5IHRoZSBjb25jYXRlbmF0aW9uIG9mCi10aGUgdmFyaW91cyBQRU0tZW5jb2RlZCBDUkwgZmlsZXMsIGluIG9yZGVyIG9mIHByZWZlcmVuY2UuIFRoaXMgY2FuIGJlCi11c2VkIGFsdGVybmF0aXZlbHkgYW5kL29yIGFkZGl0aW9uYWxseSB0byA8ZGlyZWN0aXZlCi1tb2R1bGU9Im1vZF9zc2wiPlNTTENBUmV2b2NhdGlvblBhdGg8L2RpcmVjdGl2ZT4uPC9wPgotPGV4YW1wbGU+PHRpdGxlPkV4YW1wbGU8L3RpdGxlPgotU1NMQ0FSZXZvY2F0aW9uRmlsZSAvdXNyL2xvY2FsL2FwYWNoZS9jb25mL3NzbC5jcmwvY2EtYnVuZGxlLWNsaWVudC5jcmwKLTwvZXhhbXBsZT4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5TU0xWZXJpZnlDbGllbnQ8L25hbWU+Ci08ZGVzY3JpcHRpb24+VHlwZSBvZiBDbGllbnQgQ2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+U1NMVmVyaWZ5Q2xpZW50IDxlbT5sZXZlbDwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5TU0xWZXJpZnlDbGllbnQgbm9uZTwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PgotPGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0PgotPGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+QXV0aENvbmZpZzwvb3ZlcnJpZGU+Ci0KLTx1c2FnZT4KLTxwPgotVGhpcyBkaXJlY3RpdmUgc2V0cyB0aGUgQ2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGxldmVsIGZvciB0aGUgQ2xpZW50Ci1BdXRoZW50aWNhdGlvbi4gTm90aWNlIHRoYXQgdGhpcyBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgYm90aCBpbiBwZXItc2VydmVyIGFuZAotcGVyLWRpcmVjdG9yeSBjb250ZXh0LiBJbiBwZXItc2VydmVyIGNvbnRleHQgaXQgYXBwbGllcyB0byB0aGUgY2xpZW50Ci1hdXRoZW50aWNhdGlvbiBwcm9jZXNzIHVzZWQgaW4gdGhlIHN0YW5kYXJkIFNTTCBoYW5kc2hha2Ugd2hlbiBhIGNvbm5lY3Rpb24gaXMKLWVzdGFibGlzaGVkLiBJbiBwZXItZGlyZWN0b3J5IGNvbnRleHQgaXQgZm9yY2VzIGEgU1NMIHJlbmVnb3RhdGlvbiB3aXRoIHRoZQotcmVjb25maWd1cmVkIGNsaWVudCB2ZXJpZmljYXRpb24gbGV2ZWwgYWZ0ZXIgdGhlIEhUVFAgcmVxdWVzdCB3YXMgcmVhZCBidXQKLWJlZm9yZSB0aGUgSFRUUCByZXNwb25zZSBpcyBzZW50LjwvcD4KLTxwPgotVGhlIGZvbGxvd2luZyBsZXZlbHMgYXJlIGF2YWlsYWJsZSBmb3IgPGVtPmxldmVsPC9lbT46PC9wPgotPHVsPgotPGxpPjxzdHJvbmc+bm9uZTwvc3Ryb25nPjoKLSAgICAgbm8gY2xpZW50IENlcnRpZmljYXRlIGlzIHJlcXVpcmVkIGF0IGFsbDwvbGk+Ci08bGk+PHN0cm9uZz5vcHRpb25hbDwvc3Ryb25nPjoKLSAgICAgdGhlIGNsaWVudCA8ZW0+bWF5PC9lbT4gcHJlc2VudCBhIHZhbGlkIENlcnRpZmljYXRlPC9saT4KLTxsaT48c3Ryb25nPnJlcXVpcmU8L3N0cm9uZz46Ci0gICAgIHRoZSBjbGllbnQgPGVtPmhhcyB0bzwvZW0+IHByZXNlbnQgYSB2YWxpZCBDZXJ0aWZpY2F0ZTwvbGk+Ci08bGk+PHN0cm9uZz5vcHRpb25hbF9ub19jYTwvc3Ryb25nPjoKLSAgICAgdGhlIGNsaWVudCBtYXkgcHJlc2VudCBhIHZhbGlkIENlcnRpZmljYXRlPGJyIC8+Ci0gICAgIGJ1dCBpdCBuZWVkIG5vdCB0byBiZSAoc3VjY2Vzc2Z1bGx5KSB2ZXJpZmlhYmxlLjwvbGk+Ci08L3VsPgotPHA+SW4gcHJhY3RpY2Ugb25seSBsZXZlbHMgPHN0cm9uZz5ub25lPC9zdHJvbmc+IGFuZAotPHN0cm9uZz5yZXF1aXJlPC9zdHJvbmc+IGFyZSByZWFsbHkgaW50ZXJlc3RpbmcsIGJlY2F1c2UgbGV2ZWwKLTxzdHJvbmc+b3B0aW9uYWw8L3N0cm9uZz4gZG9lc24ndCB3b3JrIHdpdGggYWxsIGJyb3dzZXJzIGFuZCBsZXZlbAotPHN0cm9uZz5vcHRpb25hbF9ub19jYTwvc3Ryb25nPiBpcyBhY3R1YWxseSBhZ2FpbnN0IHRoZSBpZGVhIG9mCi1hdXRoZW50aWNhdGlvbiAoYnV0IGNhbiBiZSB1c2VkIHRvIGVzdGFibGlzaCBTU0wgdGVzdCBwYWdlcywgZXRjLik8L3A+Ci08ZXhhbXBsZT48dGl0bGU+RXhhbXBsZTwvdGl0bGU+Ci1TU0xWZXJpZnlDbGllbnQgcmVxdWlyZQotPC9leGFtcGxlPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlNTTFZlcmlmeURlcHRoPC9uYW1lPgotPGRlc2NyaXB0aW9uPk1heGltdW0gZGVwdGggb2YgQ0EgQ2VydGlmaWNhdGVzIGluIENsaWVudCAKLUNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbjwvZGVzY3JpcHRpb24+Ci08c3ludGF4PlNTTFZlcmlmeURlcHRoIDxlbT5udW1iZXI8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+U1NMVmVyaWZ5RGVwdGggMTwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PgotPGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0PgotPGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+QXV0aENvbmZpZzwvb3ZlcnJpZGU+Ci0KLTx1c2FnZT4KLTxwPgotVGhpcyBkaXJlY3RpdmUgc2V0cyBob3cgZGVlcGx5IG1vZF9zc2wgc2hvdWxkIHZlcmlmeSBiZWZvcmUgZGVjaWRpbmcgdGhhdCB0aGUKLWNsaWVudHMgZG9uJ3QgaGF2ZSBhIHZhbGlkIGNlcnRpZmljYXRlLiBOb3RpY2UgdGhhdCB0aGlzIGRpcmVjdGl2ZSBjYW4gYmUKLXVzZWQgYm90aCBpbiBwZXItc2VydmVyIGFuZCBwZXItZGlyZWN0b3J5IGNvbnRleHQuIEluIHBlci1zZXJ2ZXIgY29udGV4dCBpdAotYXBwbGllcyB0byB0aGUgY2xpZW50IGF1dGhlbnRpY2F0aW9uIHByb2Nlc3MgdXNlZCBpbiB0aGUgc3RhbmRhcmQgU1NMCi1oYW5kc2hha2Ugd2hlbiBhIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQuIEluIHBlci1kaXJlY3RvcnkgY29udGV4dCBpdCBmb3JjZXMKLWEgU1NMIHJlbmVnb3RhdGlvbiB3aXRoIHRoZSByZWNvbmZpZ3VyZWQgY2xpZW50IHZlcmlmaWNhdGlvbiBkZXB0aCBhZnRlciB0aGUKLUhUVFAgcmVxdWVzdCB3YXMgcmVhZCBidXQgYmVmb3JlIHRoZSBIVFRQIHJlc3BvbnNlIGlzIHNlbnQuPC9wPgotPHA+Ci1UaGUgZGVwdGggYWN0dWFsbHkgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGludGVybWVkaWF0ZSBjZXJ0aWZpY2F0ZSBpc3N1ZXJzLAotaS5lLiB0aGUgbnVtYmVyIG9mIENBIGNlcnRpZmljYXRlcyB3aGljaCBhcmUgbWF4IGFsbG93ZWQgdG8gYmUgZm9sbG93ZWQgd2hpbGUKLXZlcmlmeWluZyB0aGUgY2xpZW50IGNlcnRpZmljYXRlLiBBIGRlcHRoIG9mIDAgbWVhbnMgdGhhdCBzZWxmLXNpZ25lZCBjbGllbnQKLWNlcnRpZmljYXRlcyBhcmUgYWNjZXB0ZWQgb25seSwgdGhlIGRlZmF1bHQgZGVwdGggb2YgMSBtZWFucyB0aGUgY2xpZW50Ci1jZXJ0aWZpY2F0ZSBjYW4gYmUgc2VsZi1zaWduZWQgb3IgaGFzIHRvIGJlIHNpZ25lZCBieSBhIENBIHdoaWNoIGlzIGRpcmVjdGx5Ci1rbm93biB0byB0aGUgc2VydmVyIChpLmUuIHRoZSBDQSdzIGNlcnRpZmljYXRlIGlzIHVuZGVyCi08ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX3NzbCI+U1NMQ0FDZXJ0aWZpY2F0ZVBhdGg8L2RpcmVjdGl2ZT4pLCBldGMuPC9wPgotPGV4YW1wbGU+PHRpdGxlPkV4YW1wbGU8L3RpdGxlPgotU1NMVmVyaWZ5RGVwdGggMTAKLTwvZXhhbXBsZT4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5TU0xMb2c8L25hbWU+Ci08ZGVzY3JpcHRpb24+V2hlcmUgdG8gd3JpdGUgdGhlIGRlZGljYXRlZCBTU0wgZW5naW5lIGxvZ2ZpbGU8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5TU0xMb2cgPGVtPmZpbGUtcGF0aDwvZW0+PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci08cD4KLVRoaXMgZGlyZWN0aXZlIHNldHMgdGhlIG5hbWUgb2YgdGhlIGRlZGljYXRlZCBTU0wgcHJvdG9jb2wgZW5naW5lIGxvZ2ZpbGUuCi1FcnJvciB0eXBlIG1lc3NhZ2VzIGFyZSBhZGRpdGlvbmFsbHkgZHVwbGljYXRlZCB0byB0aGUgZ2VuZXJhbCBBcGFjaGUgZXJyb3IKLWxvZyBmaWxlIChkaXJlY3RpdmUgPGNvZGU+RXJyb3JMb2c8L2NvZGU+KS4gUHV0IHRoaXMgc29tZXdoZXJlIHdoZXJlIGl0IGNhbm5vdAotYmUgdXNlZCBmb3Igc3ltbGluayBhdHRhY2tzIG9uIGEgcmVhbCBzZXJ2ZXIgKGkuZS4gc29tZXdoZXJlIHdoZXJlIG9ubHkgcm9vdAotY2FuIHdyaXRlKS4gSWYgdGhlIDxlbT5maWxlLXBhdGg8L2VtPiBkb2VzIG5vdCBiZWdpbiB3aXRoIGEgc2xhc2gKLSgnPGNvZGU+LzwvY29kZT4nKSB0aGVuIGl0IGlzIGFzc3VtZWQgdG8gYmUgcmVsYXRpdmUgdG8gdGhlIDxlbT5TZXJ2ZXIKLVJvb3Q8L2VtPi4gSWYgPGVtPmZpbGUtcGF0aDwvZW0+IGJlZ2lucyB3aXRoIGEgYmFyICgnPGNvZGU+fDwvY29kZT4nKSB0aGVuIHRoZQotZm9sbG93aW5nIHN0cmluZyBpcyBhc3N1bWVkIHRvIGJlIGEgcGF0aCB0byBhbiBleGVjdXRhYmxlIHByb2dyYW0gdG8gd2hpY2ggYQotcmVsaWFibGUgcGlwZSBjYW4gYmUgZXN0YWJsaXNoZWQuIFRoZSBkaXJlY3RpdmUgc2hvdWxkIG9jY3VyIG9ubHkgb25jZSBwZXIKLXZpcnR1YWwgc2VydmVyIGNvbmZpZy48L3A+Ci08ZXhhbXBsZT48dGl0bGU+RXhhbXBsZTwvdGl0bGU+Ci1TU0xMb2cgL3Vzci9sb2NhbC9hcGFjaGUvbG9ncy9zc2xfZW5naW5lX2xvZwotPC9leGFtcGxlPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlNTTExvZ0xldmVsPC9uYW1lPgotPGRlc2NyaXB0aW9uPkxvZ2dpbmcgbGV2ZWwgZm9yIHRoZSBkZWRpY2F0ZWQgU1NMIGVuZ2luZSAKLWxvZ2ZpbGU8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5TU0xMb2dMZXZlbCA8ZW0+bGV2ZWw8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+U1NMTG9nTGV2ZWwgbm9uZTwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PgotPGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLTxwPgotVGhpcyBkaXJlY3RpdmUgc2V0cyB0aGUgdmVyYm9zaXR5IGRlZ3JlZSBvZiB0aGUgZGVkaWNhdGVkIFNTTCBwcm90b2NvbCBlbmdpbmUKLWxvZ2ZpbGUuIFRoZSA8ZW0+bGV2ZWw8L2VtPiBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyAoaW4gYXNjZW5kaW5nIG9yZGVyIHdoZXJlCi1oaWdoZXIgbGV2ZWxzIGluY2x1ZGUgbG93ZXIgbGV2ZWxzKTo8L3A+Ci08dWw+Ci08bGk+PGNvZGU+bm9uZTwvY29kZT48YnIgLz4KLSAgICBubyBkZWRpY2F0ZWQgU1NMIGxvZ2dpbmcgaXMgZG9uZSwgYnV0IG1lc3NhZ2VzIG9mIGxldmVsCi0gICAgYGA8Y29kZT5lcnJvcjwvY29kZT4nJyBhcmUgc3RpbGwgd3JpdHRlbiB0byB0aGUgZ2VuZXJhbCBBcGFjaGUgZXJyb3IKLSAgICBsb2dmaWxlLgotPC9saT4KLTxsaT48Y29kZT5lcnJvcjwvY29kZT48YnIgLz4KLSAgICBsb2cgbWVzc2FnZXMgb2YgZXJyb3IgdHlwZSBvbmx5LCBpLmUuIG1lc3NhZ2VzIHdoaWNoIHNob3cgZmF0YWwgc2l0dWF0aW9ucwotICAgIChwcm9jZXNzaW5nIGlzIHN0b3BwZWQpLiBUaG9zZSBtZXNzYWdlcyBhcmUgYWxzbyBkdXBsaWNhdGVkIHRvIHRoZQotICAgIGdlbmVyYWwgQXBhY2hlIGVycm9yIGxvZ2ZpbGUuCi08L2xpPgotPGxpPjxjb2RlPndhcm48L2NvZGU+PGJyIC8+Ci0gICAgbG9nIGFsc28gd2FybmluZyBtZXNzYWdlcywgaS5lLiBtZXNzYWdlcyB3aGljaCBzaG93IG5vbi1mYXRhbCBwcm9ibGVtcwotICAgIChwcm9jZXNzaW5nIGlzIGNvbnRpbnVlZCkuCi08L2xpPgotPGxpPjxjb2RlPmluZm88L2NvZGU+PGJyIC8+Ci0gICAgbG9nIGFsc28gaW5mb3JtYXRpb25hbCBtZXNzYWdlcywgaS5lLiBtZXNzYWdlcyB3aGljaCBzaG93IG1ham9yCi0gICAgcHJvY2Vzc2luZyBzdGVwcy4KLTwvbGk+Ci08bGk+PGNvZGU+dHJhY2U8L2NvZGU+PGJyIC8+Ci0gICAgbG9nIGFsc28gdHJhY2UgbWVzc2FnZXMsIGkuZS4gbWVzc2FnZXMgd2hpY2ggc2hvdyBtaW5vciBwcm9jZXNzaW5nIHN0ZXBzLgotPC9saT4KLTxsaT48Y29kZT5kZWJ1ZzwvY29kZT48YnIgLz4KLSAgICBsb2cgYWxzbyBkZWJ1Z2dpbmcgbWVzc2FnZXMsIGkuZS4gbWVzc2FnZXMgd2hpY2ggc2hvdyBkZXZlbG9wbWVudCBhbmQKLSAgICBsb3ctbGV2ZWwgSS9PIGluZm9ybWF0aW9uLgotPC9saT4KLTwvdWw+Ci08ZXhhbXBsZT48dGl0bGU+RXhhbXBsZTwvdGl0bGU+Ci1TU0xMb2dMZXZlbCB3YXJuCi08L2V4YW1wbGU+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U1NMT3B0aW9uczwvbmFtZT4KLTxkZXNjcmlwdGlvbj5Db25maWd1cmUgdmFyaW91cyBTU0wgZW5naW5lIHJ1bi10aW1lIG9wdGlvbnM8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5TU0xPcHRpb25zIFsrfC1dPGVtPm9wdGlvbjwvZW0+IC4uLjwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+Ci08Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+Ci08Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT5PcHRpb25zPC9vdmVycmlkZT4KLQotPHVzYWdlPgotPHA+Ci1UaGlzIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBjb250cm9sIHZhcmlvdXMgcnVuLXRpbWUgb3B0aW9ucyBvbiBhCi1wZXItZGlyZWN0b3J5IGJhc2lzLiBOb3JtYWxseSwgaWYgbXVsdGlwbGUgPGNvZGU+U1NMT3B0aW9uczwvY29kZT4KLWNvdWxkIGFwcGx5IHRvIGEgZGlyZWN0b3J5LCB0aGVuIHRoZSBtb3N0IHNwZWNpZmljIG9uZSBpcyB0YWtlbgotY29tcGxldGVseTsgdGhlIG9wdGlvbnMgYXJlIG5vdCBtZXJnZWQuIEhvd2V2ZXIgaWYgPGVtPmFsbDwvZW0+IHRoZQotb3B0aW9ucyBvbiB0aGUgPGNvZGU+U1NMT3B0aW9uczwvY29kZT4gZGlyZWN0aXZlIGFyZSBwcmVjZWRlZCBieSBhCi1wbHVzICg8Y29kZT4rPC9jb2RlPikgb3IgbWludXMgKDxjb2RlPi08L2NvZGU+KSBzeW1ib2wsIHRoZSBvcHRpb25zCi1hcmUgbWVyZ2VkLiBBbnkgb3B0aW9ucyBwcmVjZWRlZCBieSBhIDxjb2RlPis8L2NvZGU+IGFyZSBhZGRlZCB0byB0aGUKLW9wdGlvbnMgY3VycmVudGx5IGluIGZvcmNlLCBhbmQgYW55IG9wdGlvbnMgcHJlY2VkZWQgYnkgYQotPGNvZGU+LTwvY29kZT4gYXJlIHJlbW92ZWQgZnJvbSB0aGUgb3B0aW9ucyBjdXJyZW50bHkgaW4gZm9yY2UuPC9wPgotPHA+Ci1UaGUgYXZhaWxhYmxlIDxlbT5vcHRpb248L2VtPnMgYXJlOjwvcD4KLTx1bD4KLTxsaT48Y29kZT5TdGRFbnZWYXJzPC9jb2RlPgotICAgIDxwPgotICAgIFdoZW4gdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgdGhlIHN0YW5kYXJkIHNldCBvZiBTU0wgcmVsYXRlZCBDR0kvU1NJCi0gICAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBjcmVhdGVkLiBUaGlzIHBlciBkZWZhdWx0IGlzIGRpc2FibGVkIGZvcgotICAgIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGJlY2F1c2UgdGhlIGluZm9ybWF0aW9uIGV4dHJhY3Rpb24gc3RlcCBpcyBhCi0gICAgcmF0aGVyIGV4cGVuc2l2ZSBvcGVyYXRpb24uIFNvIG9uZSB1c3VhbGx5IGVuYWJsZXMgdGhpcyBvcHRpb24gZm9yCi0gICAgQ0dJIGFuZCBTU0kgcmVxdWVzdHMgb25seS48L3A+Ci08L2xpPgotPGxpPjxjb2RlPkNvbXBhdEVudlZhcnM8L2NvZGU+Ci0gICAgPHA+Ci0gICAgV2hlbiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLCBhZGRpdGlvbmFsIENHSS9TU0kgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZQotICAgIGNyZWF0ZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgdG8gb3RoZXIgQXBhY2hlIFNTTCBzb2x1dGlvbnMuIExvb2sgaW4KLSAgICB0aGUgPGEgaHJlZj0iLi4vc3NsL3NzbF9jb21wYXQuaHRtbCI+Q29tcGF0aWJpbGl0eTwvYT4gY2hhcHRlciBmb3IgZGV0YWlscwotICAgIG9uIHRoZSBwYXJ0aWN1bGFyIHZhcmlhYmxlcyBnZW5lcmF0ZWQuPC9wPgotPC9saT4KLTxsaT48Y29kZT5FeHBvcnRDZXJ0RGF0YTwvY29kZT4KLSAgICA8cD4KLSAgICBXaGVuIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQsIGFkZGl0aW9uYWwgQ0dJL1NTSSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlCi0gICAgY3JlYXRlZDogPGNvZGU+U1NMX1NFUlZFUl9DRVJUPC9jb2RlPiwgPGNvZGU+U1NMX0NMSUVOVF9DRVJUPC9jb2RlPiBhbmQKLSAgICA8Y29kZT5TU0xfQ0xJRU5UX0NFUlRfQ0hBSU48L2NvZGU+PGVtPm48L2VtPiAod2l0aCA8ZW0+bjwvZW0+ID0gMCwxLDIsLi4pLgotICAgIFRoZXNlIGNvbnRhaW4gdGhlIFBFTS1lbmNvZGVkIFguNTA5IENlcnRpZmljYXRlcyBvZiBzZXJ2ZXIgYW5kIGNsaWVudCBmb3IKLSAgICB0aGUgY3VycmVudCBIVFRQUyBjb25uZWN0aW9uIGFuZCBjYW4gYmUgdXNlZCBieSBDR0kgc2NyaXB0cyBmb3IgZGVlcGVyCi0gICAgQ2VydGlmaWNhdGUgY2hlY2tpbmcuIEFkZGl0aW9uYWxseSBhbGwgb3RoZXIgY2VydGlmaWNhdGVzIG9mIHRoZSBjbGllbnQKLSAgICBjZXJ0aWZpY2F0ZSBjaGFpbiBhcmUgcHJvdmlkZWQsIHRvby4gVGhpcyBibG9hdHMgdXAgdGhlIGVudmlyb25tZW50IGEKLSAgICBsaXR0bGUgYml0IHdoaWNoIGlzIHdoeSB5b3UgaGF2ZSB0byB1c2UgdGhpcyBvcHRpb24gdG8gZW5hYmxlIGl0IG9uCi0gICAgZGVtYW5kLjwvcD4KLTwvbGk+Ci08bGk+PGNvZGU+RmFrZUJhc2ljQXV0aDwvY29kZT4KLSAgICA8cD4KLSAgICBXaGVuIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQsIHRoZSBTdWJqZWN0IERpc3Rpbmd1aXNoZWQgTmFtZSAoRE4pIG9mIHRoZQotICAgIENsaWVudCBYNTA5IENlcnRpZmljYXRlIGlzIHRyYW5zbGF0ZWQgaW50byBhIEhUVFAgQmFzaWMgQXV0aG9yaXphdGlvbgotICAgIHVzZXJuYW1lLiBUaGlzIG1lYW5zIHRoYXQgdGhlIHN0YW5kYXJkIEFwYWNoZSBhdXRoZW50aWNhdGlvbiBtZXRob2RzIGNhbgotICAgIGJlIHVzZWQgZm9yIGFjY2VzcyBjb250cm9sLiBUaGUgdXNlciBuYW1lIGlzIGp1c3QgdGhlIFN1YmplY3Qgb2YgdGhlCi0gICAgQ2xpZW50J3MgWDUwOSBDZXJ0aWZpY2F0ZSAoY2FuIGJlIGRldGVybWluZWQgYnkgcnVubmluZyBPcGVuU1NMJ3MKLSAgICA8Y29kZT5vcGVuc3NsIHg1MDk8L2NvZGU+IGNvbW1hbmQ6IDxjb2RlPm9wZW5zc2wgeDUwOSAtbm9vdXQgLXN1YmplY3QgLWluCi0gICAgPC9jb2RlPjxlbT5jZXJ0aWZpY2F0ZTwvZW0+PGNvZGU+LmNydDwvY29kZT4pLiBOb3RlIHRoYXQgbm8gcGFzc3dvcmQgaXMKLSAgICBvYnRhaW5lZCBmcm9tIHRoZSB1c2VyLiBFdmVyeSBlbnRyeSBpbiB0aGUgdXNlciBmaWxlIG5lZWRzIHRoaXMgcGFzc3dvcmQ6Ci0gICAgYGA8Y29kZT54eGozMVpNVFp6a1ZBPC9jb2RlPicnLCB3aGljaCBpcyB0aGUgREVTLWVuY3J5cHRlZCB2ZXJzaW9uIG9mIHRoZQotICAgIHdvcmQgYDxjb2RlPnBhc3N3b3JkPC9jb2RlPicnLiBUaG9zZSB3aG8gbGl2ZSB1bmRlciBNRDUtYmFzZWQgZW5jcnlwdGlvbgotICAgIChmb3IgaW5zdGFuY2UgdW5kZXIgRnJlZUJTRCBvciBCU0QvT1MsIGV0Yy4pIHNob3VsZCB1c2UgdGhlIGZvbGxvd2luZyBNRDUKLSAgICBoYXNoIG9mIHRoZSBzYW1lIHdvcmQ6IGBgPGNvZGU+JDEkT1hMeVMuLi4kT3d4OHMyL205L2dma2NSVlh6Z29FLzwvY29kZT4nJy48L3A+Ci08L2xpPgotPGxpPjxjb2RlPlN0cmljdFJlcXVpcmU8L2NvZGU+Ci0gICAgPHA+Ci0gICAgVGhpcyA8ZW0+Zm9yY2VzPC9lbT4gZm9yYmlkZGVuIGFjY2VzcyB3aGVuIDxjb2RlPlNTTFJlcXVpcmVTU0w8L2NvZGU+IG9yCi0gICAgPGNvZGU+U1NMUmVxdWlyZTwvY29kZT4gc3VjY2Vzc2Z1bGx5IGRlY2lkZWQgdGhhdCBhY2Nlc3Mgc2hvdWxkIGJlCi0gICAgZm9yYmlkZGVuLiBVc3VhbGx5IHRoZSBkZWZhdWx0IGlzIHRoYXQgaW4gdGhlIGNhc2Ugd2hlcmUgYSBgYDxjb2RlPlNhdGlzZnkKLSAgICBhbnk8L2NvZGU+JycgZGlyZWN0aXZlIGlzIHVzZWQsIGFuZCBvdGhlciBhY2Nlc3MgcmVzdHJpY3Rpb25zIGFyZSBwYXNzZWQsCi0gICAgZGVuaWFsIG9mIGFjY2VzcyBkdWUgdG8gPGNvZGU+U1NMUmVxdWlyZVNTTDwvY29kZT4gb3IKLSAgICA8Y29kZT5TU0xSZXF1aXJlPC9jb2RlPiBpcyBvdmVycmlkZGVuIChiZWNhdXNlIHRoYXQncyBob3cgdGhlIEFwYWNoZQotICAgIDxjb2RlPlNhdGlzZnk8L2NvZGU+IG1lY2hhbmlzbSBzaG91bGQgd29yay4pIEJ1dCBmb3Igc3RyaWN0IGFjY2VzcyByZXN0cmljdGlvbgotICAgIHlvdSBjYW4gdXNlIDxjb2RlPlNTTFJlcXVpcmVTU0w8L2NvZGU+IGFuZC9vciA8Y29kZT5TU0xSZXF1aXJlPC9jb2RlPiBpbgotICAgIGNvbWJpbmF0aW9uIHdpdGggYW4gYGA8Y29kZT5TU0xPcHRpb25zICtTdHJpY3RSZXF1aXJlPC9jb2RlPicnLiBUaGVuIGFuCi0gICAgYWRkaXRpb25hbCBgYDxjb2RlPlNhdGlzZnkgQW55PC9jb2RlPicnIGhhcyBubyBjaGFuY2Ugb25jZSBtb2Rfc3NsIGhhcwotICAgIGRlY2lkZWQgdG8gZGVueSBhY2Nlc3MuPC9wPgotPC9saT4KLTxsaT48Y29kZT5PcHRSZW5lZ290aWF0ZTwvY29kZT4KLSAgICA8cD4KLSAgICBUaGlzIGVuYWJsZXMgb3B0aW1pemVkIFNTTCBjb25uZWN0aW9uIHJlbmVnb3RpYXRpb24gaGFuZGxpbmcgd2hlbiBTU0wKLSAgICBkaXJlY3RpdmVzIGFyZSB1c2VkIGluIHBlci1kaXJlY3RvcnkgY29udGV4dC4gQnkgZGVmYXVsdCBhIHN0cmljdAotICAgIHNjaGVtZSBpcyBlbmFibGVkIHdoZXJlIDxlbT5ldmVyeTwvZW0+IHBlci1kaXJlY3RvcnkgcmVjb25maWd1cmF0aW9uIG9mCi0gICAgU1NMIHBhcmFtZXRlcnMgY2F1c2VzIGEgPGVtPmZ1bGw8L2VtPiBTU0wgcmVuZWdvdGlhdGlvbiBoYW5kc2hha2UuIFdoZW4gdGhpcwotICAgIG9wdGlvbiBpcyB1c2VkIG1vZF9zc2wgdHJpZXMgdG8gYXZvaWQgdW5uZWNlc3NhcnkgaGFuZHNoYWtlcyBieSBkb2luZyBtb3JlCi0gICAgZ3JhbnVsYXIgKGJ1dCBzdGlsbCBzYWZlKSBwYXJhbWV0ZXIgY2hlY2tzLiBOZXZlcnRoZWxlc3MgdGhlc2UgZ3JhbnVsYXIKLSAgICBjaGVja3Mgc29tZXRpbWVzIG1heWJlIG5vdCB3aGF0IHRoZSB1c2VyIGV4cGVjdHMsIHNvIGVuYWJsZSB0aGlzIG9uIGEKLSAgICBwZXItZGlyZWN0b3J5IGJhc2lzIG9ubHksIHBsZWFzZS48L3A+Ci08L2xpPgotPC91bD4KLTxleGFtcGxlPjx0aXRsZT5FeGFtcGxlPC90aXRsZT4KLVNTTE9wdGlvbnMgK0Zha2VCYXNpY0F1dGggLVN0cmljdFJlcXVpcmU8YnIgLz4KLSZsdDtGaWxlcyB+ICJcLihjZ2l8c2h0bWwpJCImZ3Q7PGJyIC8+Ci0gICAgU1NMT3B0aW9ucyArU3RkRW52VmFycyArQ29tcGF0RW52VmFycyAtRXhwb3J0Q2VydERhdGE8YnIgLz4KLSZsdDtGaWxlcyZndDsKLTwvZXhhbXBsZT4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5TU0xSZXF1aXJlU1NMPC9uYW1lPgotPGRlc2NyaXB0aW9uPkRlbnkgYWNjZXNzIHdoZW4gU1NMIGlzIG5vdCB1c2VkIGZvciB0aGUgCi1IVFRQIHJlcXVlc3Q8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5TU0xSZXF1aXJlU1NMPC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0PgotPGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+QXV0aENvbmZpZzwvb3ZlcnJpZGU+Ci0KLTx1c2FnZT4KLTxwPjwhLS0gWFhYOiBJIHRoaW5rIHRoZSBzeW50YXggaXMgd3JvbmcgLS0+Ci1UaGlzIGRpcmVjdGl2ZSBmb3JiaWRzIGFjY2VzcyB1bmxlc3MgSFRUUCBvdmVyIFNTTCAoaS5lLiBIVFRQUykgaXMgZW5hYmxlZCBmb3IKLXRoZSBjdXJyZW50IGNvbm5lY3Rpb24uIFRoaXMgaXMgdmVyeSBoYW5keSBpbnNpZGUgdGhlIFNTTC1lbmFibGVkIHZpcnR1YWwKLWhvc3Qgb3IgZGlyZWN0b3JpZXMgZm9yIGRlZmVuZGluZyBhZ2FpbnN0IGNvbmZpZ3VyYXRpb24gZXJyb3JzIHRoYXQgZXhwb3NlCi1zdHVmZiB0aGF0IHNob3VsZCBiZSBwcm90ZWN0ZWQuIFdoZW4gdGhpcyBkaXJlY3RpdmUgaXMgcHJlc2VudCBhbGwgcmVxdWVzdHMKLWFyZSBkZW5pZWQgd2hpY2ggYXJlIG5vdCB1c2luZyBTU0wuPC9wPgotPGV4YW1wbGU+PHRpdGxlPkV4YW1wbGU8L3RpdGxlPgotU1NMUmVxdWlyZVNTTAotPC9leGFtcGxlPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlNTTFJlcXVpcmU8L25hbWU+Ci08ZGVzY3JpcHRpb24+QWxsb3cgYWNjZXNzIG9ubHkgd2hlbiBhbiBhcmJpdHJhcmlseSBjb21wbGV4IAotYm9vbGVhbiBleHByZXNzaW9uIGlzIHRydWU8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5TU0xSZXF1aXJlIDxlbT5leHByZXNzaW9uPC9lbT48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5kaXJlY3Rvcnk8L2NvbnRleHQ+Ci08Y29udGV4dD4uaHRhY2Nlc3M8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLTxvdmVycmlkZT5BdXRoQ29uZmlnPC9vdmVycmlkZT4KLQotPHVzYWdlPgotPHA+Ci1UaGlzIGRpcmVjdGl2ZSBzcGVjaWZpZXMgYSBnZW5lcmFsIGFjY2VzcyByZXF1aXJlbWVudCB3aGljaCBoYXMgdG8gYmUKLWZ1bGZpbGxlZCBpbiBvcmRlciB0byBhbGxvdyBhY2Nlc3MuIEl0J3MgYSB2ZXJ5IHBvd2VyZnVsIGRpcmVjdGl2ZSBiZWNhdXNlIHRoZQotcmVxdWlyZW1lbnQgc3BlY2lmaWNhdGlvbiBpcyBhbiBhcmJpdHJhcmlseSBjb21wbGV4IGJvb2xlYW4gZXhwcmVzc2lvbgotY29udGFpbmluZyBhbnkgbnVtYmVyIG9mIGFjY2VzcyBjaGVja3MuPC9wPgotPHA+Ci1UaGUgPGVtPmV4cHJlc3Npb248L2VtPiBtdXN0IG1hdGNoIHRoZSBmb2xsb3dpbmcgc3ludGF4IChnaXZlbiBhcyBhIEJORgotZ3JhbW1hciBub3RhdGlvbik6PC9wPgotPGJsb2NrcXVvdGU+Ci08cHJlPgotZXhwciAgICAgOjo9ICI8c3Ryb25nPnRydWU8L3N0cm9uZz4iIHwgIjxzdHJvbmc+ZmFsc2U8L3N0cm9uZz4iCi0gICAgICAgICAgIHwgIjxzdHJvbmc+ITwvc3Ryb25nPiIgZXhwcgotICAgICAgICAgICB8IGV4cHIgIjxzdHJvbmc+JmFtcDsmYW1wOzwvc3Ryb25nPiIgZXhwcgotICAgICAgICAgICB8IGV4cHIgIjxzdHJvbmc+fHw8L3N0cm9uZz4iIGV4cHIKLSAgICAgICAgICAgfCAiPHN0cm9uZz4oPC9zdHJvbmc+IiBleHByICI8c3Ryb25nPik8L3N0cm9uZz4iCi0gICAgICAgICAgIHwgY29tcAotCi1jb21wICAgICA6Oj0gd29yZCAiPHN0cm9uZz49PTwvc3Ryb25nPiIgd29yZCB8IHdvcmQgIjxzdHJvbmc+ZXE8L3N0cm9uZz4iIHdvcmQKLSAgICAgICAgICAgfCB3b3JkICI8c3Ryb25nPiE9PC9zdHJvbmc+IiB3b3JkIHwgd29yZCAiPHN0cm9uZz5uZTwvc3Ryb25nPiIgd29yZAotICAgICAgICAgICB8IHdvcmQgIjxzdHJvbmc+Jmx0Ozwvc3Ryb25nPiIgIHdvcmQgfCB3b3JkICI8c3Ryb25nPmx0PC9zdHJvbmc+IiB3b3JkCi0gICAgICAgICAgIHwgd29yZCAiPHN0cm9uZz4mbHQ7PTwvc3Ryb25nPiIgd29yZCB8IHdvcmQgIjxzdHJvbmc+bGU8L3N0cm9uZz4iIHdvcmQKLSAgICAgICAgICAgfCB3b3JkICI8c3Ryb25nPiZndDs8L3N0cm9uZz4iICB3b3JkIHwgd29yZCAiPHN0cm9uZz5ndDwvc3Ryb25nPiIgd29yZAotICAgICAgICAgICB8IHdvcmQgIjxzdHJvbmc+Jmd0Oz08L3N0cm9uZz4iIHdvcmQgfCB3b3JkICI8c3Ryb25nPmdlPC9zdHJvbmc+IiB3b3JkCi0gICAgICAgICAgIHwgd29yZCAiPHN0cm9uZz5pbjwvc3Ryb25nPiIgIjxzdHJvbmc+ezwvc3Ryb25nPiIgd29yZGxpc3QgIjxzdHJvbmc+fTwvc3Ryb25nPiIKLSAgICAgICAgICAgfCB3b3JkICI8c3Ryb25nPj1+PC9zdHJvbmc+IiByZWdleAotICAgICAgICAgICB8IHdvcmQgIjxzdHJvbmc+IX48L3N0cm9uZz4iIHJlZ2V4Ci0KLXdvcmRsaXN0IDo6PSB3b3JkCi0gICAgICAgICAgIHwgd29yZGxpc3QgIjxzdHJvbmc+LDwvc3Ryb25nPiIgd29yZAotCi13b3JkICAgICA6Oj0gZGlnaXQKLSAgICAgICAgICAgfCBjc3RyaW5nCi0gICAgICAgICAgIHwgdmFyaWFibGUKLSAgICAgICAgICAgfCBmdW5jdGlvbgotCi1kaWdpdCAgICA6Oj0gWzAtOV0rCi1jc3RyaW5nICA6Oj0gIi4uLiIKLXZhcmlhYmxlIDo6PSAiPHN0cm9uZz4lezwvc3Ryb25nPiIgdmFybmFtZSAiPHN0cm9uZz59PC9zdHJvbmc+IgotZnVuY3Rpb24gOjo9IGZ1bmNuYW1lICI8c3Ryb25nPig8L3N0cm9uZz4iIGZ1bmNhcmdzICI8c3Ryb25nPik8L3N0cm9uZz4iCi08L3ByZT4KLTwvYmxvY2txdW90ZT4KLTxwPndoaWxlIGZvciA8Y29kZT52YXJuYW1lPC9jb2RlPiBhbnkgdmFyaWFibGUgZnJvbSA8YQotaHJlZj0iI3RhYmxlMyI+VGFibGUgMzwvYT4gY2FuIGJlIHVzZWQuIEZpbmFsbHkgZm9yCi08Y29kZT5mdW5jbmFtZTwvY29kZT4gdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZTo8L3A+Ci08dWw+Ci08bGk+PGNvZGU+ZmlsZSg8L2NvZGU+PGVtPmZpbGVuYW1lPC9lbT48Y29kZT4pPC9jb2RlPgotICAgIDxwPgotICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgb25lIHN0cmluZyBhcmd1bWVudCBhbmQgZXhwYW5kcyB0byB0aGUgY29udGVudHMgb2YgdGhlCi0gICAgZmlsZS4gVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBmb3IgbWF0Y2hpbmcgdGhpcyBjb250ZW50cyBhZ2FpbnN0IGEKLSAgICByZWd1bGFyIGV4cHJlc3Npb24sIGV0Yy48L3A+Ci08L2xpPgotPC91bD4KLTxwPk5vdGljZSB0aGF0IDxlbT5leHByZXNzaW9uPC9lbT4gaXMgZmlyc3QgcGFyc2VkIGludG8gYW4gaW50ZXJuYWwgbWFjaGluZQotcmVwcmVzZW50YXRpb24gYW5kIHRoZW4gZXZhbHVhdGVkIGluIGEgc2Vjb25kIHN0ZXAuIEFjdHVhbGx5LCBpbiBHbG9iYWwgYW5kCi1QZXItU2VydmVyIENsYXNzIGNvbnRleHQgPGVtPmV4cHJlc3Npb248L2VtPiBpcyBwYXJzZWQgYXQgc3RhcnR1cCB0aW1lIGFuZAotYXQgcnVudGltZSBvbmx5IHRoZSBtYWNoaW5lIHJlcHJlc2VudGF0aW9uIGlzIGV4ZWN1dGVkLiBGb3IgUGVyLURpcmVjdG9yeQotY29udGV4dCB0aGlzIGlzIGRpZmZlcmVudDogaGVyZSA8ZW0+ZXhwcmVzc2lvbjwvZW0+IGhhcyB0byBiZSBwYXJzZWQgYW5kCi1pbW1lZGlhdGVseSBleGVjdXRlZCBmb3IgZXZlcnkgcmVxdWVzdC48L3A+Ci08ZXhhbXBsZT48dGl0bGU+RXhhbXBsZTwvdGl0bGU+Ci1TU0xSZXF1aXJlICggICAgJXtTU0xfQ0lQSEVSfSAhfiBtL14oRVhQfE5VTEwpLS8gXDxiciAvPgotICAgICAgICAgICAgYW5kICV7U1NMX0NMSUVOVF9TX0ROX099IGVxICJTbmFrZSBPaWwsIEx0ZC4iIFw8YnIgLz4KLSAgICAgICAgICAgIGFuZCAle1NTTF9DTElFTlRfU19ETl9PVX0gaW4geyJTdGFmZiIsICJDQSIsICJEZXYifSBcPGJyIC8+Ci0gICAgICAgICAgICBhbmQgJXtUSU1FX1dEQVl9ICZndDs9IDEgYW5kICV7VElNRV9XREFZfSAmbHQ7PSA1IFw8YnIgLz4KLSAgICAgICAgICAgIGFuZCAle1RJTUVfSE9VUn0gJmd0Oz0gOCBhbmQgJXtUSU1FX0hPVVJ9ICZsdDs9IDIwICAgICAgICkgXDxiciAvPgotICAgICAgICAgICBvciAle1JFTU9URV9BRERSfSA9fiBtL14xOTJcLjc2XC4xNjJcLlswLTldKyQvCi08L2V4YW1wbGU+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGEgbmFtZT0idGFibGUzIj48L2E+Ci08dGFibGUgd2lkdGg9IjYwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08Y2FwdGlvbiBhbGlnbj0iYm90dG9tIiBpZD0ic2YiPlRhYmxlIDM6IEF2YWlsYWJsZSBWYXJpYWJsZXMgZm9yIFNTTFJlcXVpcmU8L2NhcHRpb24+Ci08dHI+PHRkIGJnY29sb3I9IiNjY2NjY2MiPgotPHRhYmxlIHdpZHRoPSI1OTgiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08dGFibGUgc3VtbWFyeT0iIj48dHI+PHRkPgotPGVtPlN0YW5kYXJkIENHSS8xLjAgYW5kIEFwYWNoZSB2YXJpYWJsZXM6PC9lbT4KLTxwcmU+Ci1IVFRQX1VTRVJfQUdFTlQgICAgICAgIFBBVEhfSU5GTyAgICAgICAgICAgICBBVVRIX1RZUEUKLUhUVFBfUkVGRVJFUiAgICAgICAgICAgUVVFUllfU1RSSU5HICAgICAgICAgIFNFUlZFUl9TT0ZUV0FSRQotSFRUUF9DT09LSUUgICAgICAgICAgICBSRU1PVEVfSE9TVCAgICAgICAgICAgQVBJX1ZFUlNJT04KLUhUVFBfRk9SV0FSREVEICAgICAgICAgUkVNT1RFX0lERU5UICAgICAgICAgIFRJTUVfWUVBUgotSFRUUF9IT1NUICAgICAgICAgICAgICBJU19TVUJSRVEgICAgICAgICAgICAgVElNRV9NT04KLUhUVFBfUFJPWFlfQ09OTkVDVElPTiAgRE9DVU1FTlRfUk9PVCAgICAgICAgIFRJTUVfREFZCi1IVFRQX0FDQ0VQVCAgICAgICAgICAgIFNFUlZFUl9BRE1JTiAgICAgICAgICBUSU1FX0hPVVIKLUhUVFA6aGVhZGVybmFtZSAgICAgICAgU0VSVkVSX05BTUUgICAgICAgICAgIFRJTUVfTUlOCi1USEVfUkVRVUVTVCAgICAgICAgICAgIFNFUlZFUl9QT1JUICAgICAgICAgICBUSU1FX1NFQwotUkVRVUVTVF9NRVRIT0QgICAgICAgICBTRVJWRVJfUFJPVE9DT0wgICAgICAgVElNRV9XREFZCi1SRVFVRVNUX1NDSEVNRSAgICAgICAgIFJFTU9URV9BRERSICAgICAgICAgICBUSU1FCi1SRVFVRVNUX1VSSSAgICAgICAgICAgIFJFTU9URV9VU0VSICAgICAgICAgICBFTlY6PHN0cm9uZz52YXJpYWJsZW5hbWU8L3N0cm9uZz4KLVJFUVVFU1RfRklMRU5BTUUKLTwvcHJlPgotPGVtPlNTTC1yZWxhdGVkIHZhcmlhYmxlczo8L2VtPgotPHByZT4KLUhUVFBTICAgICAgICAgICAgICAgICAgU1NMX0NMSUVOVF9NX1ZFUlNJT04gICBTU0xfU0VSVkVSX01fVkVSU0lPTgotICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ0xJRU5UX01fU0VSSUFMICAgIFNTTF9TRVJWRVJfTV9TRVJJQUwKLVNTTF9QUk9UT0NPTCAgICAgICAgICAgU1NMX0NMSUVOVF9WX1NUQVJUICAgICBTU0xfU0VSVkVSX1ZfU1RBUlQKLVNTTF9TRVNTSU9OX0lEICAgICAgICAgU1NMX0NMSUVOVF9WX0VORCAgICAgICBTU0xfU0VSVkVSX1ZfRU5ECi1TU0xfQ0lQSEVSICAgICAgICAgICAgIFNTTF9DTElFTlRfU19ETiAgICAgICAgU1NMX1NFUlZFUl9TX0ROCi1TU0xfQ0lQSEVSX0VYUE9SVCAgICAgIFNTTF9DTElFTlRfU19ETl9DICAgICAgU1NMX1NFUlZFUl9TX0ROX0MKLVNTTF9DSVBIRVJfQUxHS0VZU0laRSAgU1NMX0NMSUVOVF9TX0ROX1NUICAgICBTU0xfU0VSVkVSX1NfRE5fU1QKLVNTTF9DSVBIRVJfVVNFS0VZU0laRSAgU1NMX0NMSUVOVF9TX0ROX0wgICAgICBTU0xfU0VSVkVSX1NfRE5fTAotU1NMX1ZFUlNJT05fTElCUkFSWSAgICBTU0xfQ0xJRU5UX1NfRE5fTyAgICAgIFNTTF9TRVJWRVJfU19ETl9PCi1TU0xfVkVSU0lPTl9JTlRFUkZBQ0UgIFNTTF9DTElFTlRfU19ETl9PVSAgICAgU1NMX1NFUlZFUl9TX0ROX09VCi0gICAgICAgICAgICAgICAgICAgICAgIFNTTF9DTElFTlRfU19ETl9DTiAgICAgU1NMX1NFUlZFUl9TX0ROX0NOCi0gICAgICAgICAgICAgICAgICAgICAgIFNTTF9DTElFTlRfU19ETl9UICAgICAgU1NMX1NFUlZFUl9TX0ROX1QKLSAgICAgICAgICAgICAgICAgICAgICAgU1NMX0NMSUVOVF9TX0ROX0kgICAgICBTU0xfU0VSVkVSX1NfRE5fSQotICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ0xJRU5UX1NfRE5fRyAgICAgIFNTTF9TRVJWRVJfU19ETl9HCi0gICAgICAgICAgICAgICAgICAgICAgIFNTTF9DTElFTlRfU19ETl9TICAgICAgU1NMX1NFUlZFUl9TX0ROX1MKLSAgICAgICAgICAgICAgICAgICAgICAgU1NMX0NMSUVOVF9TX0ROX0QgICAgICBTU0xfU0VSVkVSX1NfRE5fRAotICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ0xJRU5UX1NfRE5fVUlEICAgIFNTTF9TRVJWRVJfU19ETl9VSUQKLSAgICAgICAgICAgICAgICAgICAgICAgU1NMX0NMSUVOVF9TX0ROX0VtYWlsICBTU0xfU0VSVkVSX1NfRE5fRW1haWwKLSAgICAgICAgICAgICAgICAgICAgICAgU1NMX0NMSUVOVF9JX0ROICAgICAgICBTU0xfU0VSVkVSX0lfRE4KLSAgICAgICAgICAgICAgICAgICAgICAgU1NMX0NMSUVOVF9JX0ROX0MgICAgICBTU0xfU0VSVkVSX0lfRE5fQwotICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ0xJRU5UX0lfRE5fU1QgICAgIFNTTF9TRVJWRVJfSV9ETl9TVAotICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ0xJRU5UX0lfRE5fTCAgICAgIFNTTF9TRVJWRVJfSV9ETl9MCi0gICAgICAgICAgICAgICAgICAgICAgIFNTTF9DTElFTlRfSV9ETl9PICAgICAgU1NMX1NFUlZFUl9JX0ROX08KLSAgICAgICAgICAgICAgICAgICAgICAgU1NMX0NMSUVOVF9JX0ROX09VICAgICBTU0xfU0VSVkVSX0lfRE5fT1UKLSAgICAgICAgICAgICAgICAgICAgICAgU1NMX0NMSUVOVF9JX0ROX0NOICAgICBTU0xfU0VSVkVSX0lfRE5fQ04KLSAgICAgICAgICAgICAgICAgICAgICAgU1NMX0NMSUVOVF9JX0ROX1QgICAgICBTU0xfU0VSVkVSX0lfRE5fVAotICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ0xJRU5UX0lfRE5fSSAgICAgIFNTTF9TRVJWRVJfSV9ETl9JCi0gICAgICAgICAgICAgICAgICAgICAgIFNTTF9DTElFTlRfSV9ETl9HICAgICAgU1NMX1NFUlZFUl9JX0ROX0cKLSAgICAgICAgICAgICAgICAgICAgICAgU1NMX0NMSUVOVF9JX0ROX1MgICAgICBTU0xfU0VSVkVSX0lfRE5fUwotICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ0xJRU5UX0lfRE5fRCAgICAgIFNTTF9TRVJWRVJfSV9ETl9ECi0gICAgICAgICAgICAgICAgICAgICAgIFNTTF9DTElFTlRfSV9ETl9VSUQgICAgU1NMX1NFUlZFUl9JX0ROX1VJRAotICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ0xJRU5UX0lfRE5fRW1haWwgIFNTTF9TRVJWRVJfSV9ETl9FbWFpbAotICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ0xJRU5UX0FfU0lHICAgICAgIFNTTF9TRVJWRVJfQV9TSUcKLSAgICAgICAgICAgICAgICAgICAgICAgU1NMX0NMSUVOVF9BX0tFWSAgICAgICBTU0xfU0VSVkVSX0FfS0VZCi0gICAgICAgICAgICAgICAgICAgICAgIFNTTF9DTElFTlRfQ0VSVCAgICAgICAgU1NMX1NFUlZFUl9DRVJUCi0gICAgICAgICAgICAgICAgICAgICAgIFNTTF9DTElFTlRfQ0VSVF9DSEFJTjxzdHJvbmc+bjwvc3Ryb25nPgotICAgICAgICAgICAgICAgICAgICAgICBTU0xfQ0xJRU5UX1ZFUklGWQotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLTwvdGQ+Ci08L3RyPjwvdGFibGU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLTwvZGl2PgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTwvbW9kdWxlc3lub3BzaXM+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX3N0YXR1cy5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9zdGF0dXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRjZTliNi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX3N0YXR1cy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotPGh0bWw+PGhlYWQ+Ci08dGl0bGU+QXBhY2hlIFN0YXR1cyBNb2R1bGU8L3RpdGxlPgotPC9oZWFkPjxib2R5PgotCi08aW1nIHNyYz0iLi4vaW1hZ2VzL2FwYWNoZV9zdWIuZ2lmIiBhbHQ9IiI+Ci08aDE+QXBhY2hlIFN0YXR1cyBNb2R1bGU8L2gxPgotPGhyPgotCi1UaGUgU3RhdHVzIE1vZHVsZSBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUgMS4xIGFuZCBsYXRlci48cD4KLQotPGgyPkZ1bmN0aW9uPC9oMj4KLQotVGhlIFN0YXR1cyBtb2R1bGUgYWxsb3dzIGEgc2VydmVyIGFkbWluaXN0cmF0b3IgdG8gZmluZCBvdXQgaG93IHdlbGwKLXRoZWlyIHNlcnZlciBpcyBwZXJmb3JtaW5nLiAgQSBIVE1MIHBhZ2UgaXMgcHJlc2VudGVkIHRoYXQgZ2l2ZXMKLXRoZSBjdXJyZW50IHNlcnZlciBzdGF0aXN0aWNzIGluIGFuIGVhc2lseSByZWFkYWJsZSBmb3JtLiAgSWYgcmVxdWlyZWQKLXRoaXMgcGFnZSBjYW4gYmUgbWFkZSB0byBhdXRvbWF0aWNhbGx5IHJlZnJlc2ggKGdpdmVuIGEgY29tcGF0aWJsZQotYnJvd3NlcikuICBBbm90aGVyIHBhZ2UgZ2l2ZXMgYSBzaW1wbGUgbWFjaGluZS1yZWFkYWJsZSBsaXN0IG9mIHRoZSBjdXJyZW50Ci1zZXJ2ZXIgc3RhdGUuCi08cD4KLVRoZSBkZXRhaWxzIGdpdmVuIGFyZToKLTx1bD4KLTxsaT5UaGUgbnVtYmVyIG9mIGNoaWxkcmVuIHNlcnZpbmcgcmVxdWVzdHMKLTxsaT5UaGUgbnVtYmVyIG9mIGlkbGUgY2hpbGRyZW4KLTxsaT5UaGUgc3RhdHVzIG9mIGVhY2ggY2hpbGQsIHRoZSBudW1iZXIgb2YgcmVxdWVzdHMgdGhhdCBjaGlsZCBoYXMKLXBlcmZvcm1lZCBhbmQgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBzZXJ2ZWQgYnkgdGhlIGNoaWxkICgqKQotPGxpPkEgdG90YWwgbnVtYmVyIG9mIGFjY2Vzc2VzIGFuZCBieXRlIGNvdW50IHNlcnZlZCAoKikKLTxsaT5UaGUgdGltZSB0aGUgc2VydmVyIHdhcyBzdGFydGVkL3Jlc3RhcnRlZCBhbmQgdGhlCi10aW1lIGl0IGhhcyBiZWVuIHJ1bm5pbmcgZm9yCi08bGk+QXZlcmFnZXMgZ2l2aW5nIHRoZSBudW1iZXIgb2YgcmVxdWVzdHMgcGVyIHNlY29uZCwgCi10aGUgbnVtYmVyIG9mIGJ5dGVzIHNlcnZlZCBwZXIgc2Vjb25kIGFuZCB0aGUgYXZlcmFnZSBudW1iZXIKLW9mIGJ5dGVzIHBlciByZXF1ZXN0ICgqKQotPGxpPlRoZSBjdXJyZW50IHBlcmNlbnRhZ2UgQ1BVIHVzZWQgYnkgZWFjaCBjaGlsZCBhbmQgaW4gdG90YWwgYnkKLUFwYWNoZSAoKikKLTxsaT5UaGUgY3VycmVudCBob3N0cyBhbmQgcmVxdWVzdHMgYmVpbmcgcHJvY2Vzc2VkICgqKQotPC91bD4KLQotQSBjb21waWxlLXRpbWUgb3B0aW9uIG11c3QgYmUgdXNlZCB0byBkaXNwbGF5IHRoZSBkZXRhaWxzIG1hcmtlZCAiKCopIiBhcwotdGhlIGluc3RydW1lbnRhdGlvbiByZXF1aXJlZCBmb3Igb2J0YWluaW5nIHRoZXNlIHN0YXRpc3RpY3MgZG9lcyBub3QKLWV4aXN0IHdpdGhpbiBzdGFuZGFyZCBBcGFjaGUuCi0KLTxoMj5FbmFibGluZyBTdGF0dXMgU3VwcG9ydDwvaDI+Ci0KLVRvIGVuYWJsZSBzdGF0dXMgcmVwb3J0cyBvbmx5IGZvciBicm93c2VycyBmcm9tIHRoZSBmb28uY29tCi1kb21haW4gYWRkIHRoaXMgY29kZSB0byB5b3VyIDxjb2RlPmFjY2Vzcy5jb25mPC9jb2RlPiBjb25maWd1cmF0aW9uIGZpbGUKLTxwcmU+Ci0gICAgJmx0O0xvY2F0aW9uIC9zZXJ2ZXItc3RhdHVzJmd0OwotICAgIFNldEhhbmRsZXIgc2VydmVyLXN0YXR1cwotICAgIAotICAgICZsdDtMaW1pdCBHRVQgUE9TVCZndDsKLSAgICBvcmRlciBkZW55LGFsbG93Ci0gICAgZGVueSBmcm9tIGFsbAotICAgIGFsbG93IGZyb20gLmZvby5jb20KLSAgICAmbHQ7L0xpbWl0Jmd0OwotICAgICZsdDsvTG9jYXRpb24mZ3Q7Ci08L3ByZT4KLTxwPgotWW91IGNhbiBub3cgYWNjZXNzIHNlcnZlciBzdGF0aXN0aWNzIGJ5IHVzaW5nIGEgV2ViIGJyb3dzZXIgdG8gYWNjZXNzIHRoZQotcGFnZSA8Y29kZT5odHRwOi8veW91ci5zZXJ2ZXIubmFtZS9zZXJ2ZXItc3RhdHVzPC9jb2RlPgotPGgzPkF1dG9tYXRpYyBVcGRhdGVzPC9oMz4KLVlvdSBjYW4gZ2V0IHRoZSBzdGF0dXMgcGFnZSB0byB1cGRhdGUgaXRzZWxmIGF1dG9tYXRpY2FsbHkgaWYgeW91IGhhdmUKLWEgYnJvd3NlciB0aGF0IHN1cHBvcnRzICJyZWZyZXNoIi4gIEFjY2VzcyB0aGUgcGFnZQotPGNvZGU+aHR0cDovL3lvdXIuc2VydmVyLm5hbWUvc2VydmVyLXN0YXR1cz9yZWZyZXNoPU48L2NvZGU+IHRvIHJlZnJlc2ggdGhlIHBhZ2UKLWV2ZXJ5IE4gc2Vjb25kcy4KLTxoMz5NYWNoaW5lIFJlYWRhYmxlIFN0YXR1cyBGaWxlPC9oMz4KLUEgbWFjaGluZS1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBzdGF0dXMgZmlsZSBpcyBhdmFpbGFibGUgYnkgYWNjZXNzaW5nIHRoZQotcGFnZSA8Y29kZT5odHRwOi8veW91ci5zZXJ2ZXIubmFtZS9zZXJ2ZXItc3RhdHVzP2F1dG88L2NvZGU+LiAgVGhpcyBpcyB1c2VmdWwKLXdoZW4gYXV0b21hdGljYWxseSBydW4sIHNlZSB0aGUgUGVybCBwcm9ncmFtIGluIHRoZSA8Y29kZT4vc3VwcG9ydDwvY29kZT4KLWRpcmVjdG9yeSBvZiBBcGFjaGUsIDxjb2RlPmxvZ19zZXJ2ZXJfc3RhdHVzPC9jb2RlPi4KLQotPGgyPkZ1bGwgSW5zdHJ1bWVudGF0aW9uPC9oMj4KLQotVG8gb2J0YWluIGZ1bGwgc3RhdGlzdGljcyB5b3UgbXVzdCBjb21waWxlIEFwYWNoZSB3aXRoIGEgc3BlY2lhbAotZGlyZWN0aXZlLiAgT24gc29tZSBtYWNoaW5lcyB0aGVyZSBtYXkgYmUgYSBzbWFsbCBwZXJmb3JtYW5jZSBsb3NzCi1pZiB5b3UgZG8gdGhpcy4gIFRyeSBmdWxsIHN0YXRpc3RpY3MgYW5kIHNlZSBpZiB5b3Ugbm90aWNlIGFueQotZGlmZmVyZW5jZS4gIElmIHlvdSBkbyBwbGVhc2UgY29udGFjdCA8YSBocmVmPSJtYWlsdG86bWFya0B1a3dlYi5jb20iPgotbWFya0B1a3dlYi5jb208L2E+IGFuZCB0ZWxsIG1lIHlvdXIgY29uZmlndXJhdGlvbi4KLQotPHA+Ci1EbyB0aGlzIGJ5IGFkZGluZyB0aGUgZm9sbG93aW5nIHRvIHRoZSBBVVhfQ0ZMQUdTIGxpbmUgaW4gdGhlCi0iQ29uZmlndXJhdGlvbiIgZmlsZSBhbmQgdGhlbiByZWNvbXBpbGluZyBhcyB1c3VhbC4KLTxwcmU+Ci0JQVVYX0NGTEFHUz0gKHNvbWV0aGluZykgLURTVEFUVVMKLTwvcHJlPgotCi0KLQotCi08aHI+Ci08QSBIUkVGPSIuLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2hvbWUuZ2lmIiBBTFQ9IkhvbWUiPjwvQT4KLTxBIEhSRUY9Ii4uLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfaW5kZXguZ2lmIiBBTFQ9IkluZGV4Ij48L0E+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9zdGF0dXMueG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9zdGF0dXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2EzNTFmLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2Rfc3RhdHVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9Ii4uL3N0eWxlL21hbnVhbC54c2wiPz4KLTxtb2R1bGVzeW5vcHNpcz4KLQotPG5hbWU+bW9kX3N0YXR1czwvbmFtZT4KLTxzdGF0dXM+QmFzZTwvc3RhdHVzPgotPGlkZW50aWZpZXI+c3RhdHVzX21vZHVsZTwvaWRlbnRpZmllcj4KLTxzb3VyY2VmaWxlPm1vZF9zdGF0dXMuYzwvc291cmNlZmlsZT4KLTxjb21wYXRpYmlsaXR5PkF2YWlsYWJsZSBpbiBBcGFjaGUgMS4xIGFuZCBsYXRlcjwvY29tcGF0aWJpbGl0eT4KLQotPGRlc2NyaXB0aW9uPlRoaXMgbW9kdWxlIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIHNlcnZlciBhY3Rpdml0eSBhbmQKLXBlcmZvcm1hbmNlLjwvZGVzY3JpcHRpb24+Ci0KLTxzdW1tYXJ5PgotCi08bm90ZT4KLSAgPHN0cm9uZz5XYXJuaW5nOjwvc3Ryb25nPiBUaGlzIGRvY3VtZW50IGhhcyBub3QgYmVlbiB1cGRhdGVkCi0gIHRvIHRha2UgaW50byBhY2NvdW50IGNoYW5nZXMgbWFkZSBpbiB0aGUgMi4wIHZlcnNpb24gb2YgdGhlCi0gIEFwYWNoZSBIVFRQIFNlcnZlci4gU29tZSBvZiB0aGUgaW5mb3JtYXRpb24gbWF5IHN0aWxsIGJlCi0gIHJlbGV2YW50LCBidXQgcGxlYXNlIHVzZSBpdCB3aXRoIGNhcmUuCi08L25vdGU+Ci0KLSAgICA8cD5UaGUgU3RhdHVzIG1vZHVsZSBhbGxvd3MgYSBzZXJ2ZXIgYWRtaW5pc3RyYXRvciB0byBmaW5kIG91dAotICAgIGhvdyB3ZWxsIHRoZWlyIHNlcnZlciBpcyBwZXJmb3JtaW5nLiBBIEhUTUwgcGFnZSBpcyBwcmVzZW50ZWQKLSAgICB0aGF0IGdpdmVzIHRoZSBjdXJyZW50IHNlcnZlciBzdGF0aXN0aWNzIGluIGFuIGVhc2lseSByZWFkYWJsZQotICAgIGZvcm0uIElmIHJlcXVpcmVkIHRoaXMgcGFnZSBjYW4gYmUgbWFkZSB0byBhdXRvbWF0aWNhbGx5Ci0gICAgcmVmcmVzaCAoZ2l2ZW4gYSBjb21wYXRpYmxlIGJyb3dzZXIpLiBBbm90aGVyIHBhZ2UgZ2l2ZXMgYQotICAgIHNpbXBsZSBtYWNoaW5lLXJlYWRhYmxlIGxpc3Qgb2YgdGhlIGN1cnJlbnQgc2VydmVyIHN0YXRlLjwvcD4KLQotICAgIDxwPlRoZSBkZXRhaWxzIGdpdmVuIGFyZTo8L3A+Ci0KLSAgICA8dWw+Ci0gICAgICA8bGk+VGhlIG51bWJlciBvZiBjaGlsZHJlbiBzZXJ2aW5nIHJlcXVlc3RzPC9saT4KLQotICAgICAgPGxpPlRoZSBudW1iZXIgb2YgaWRsZSBjaGlsZHJlbjwvbGk+Ci0KLSAgICAgIDxsaT5UaGUgc3RhdHVzIG9mIGVhY2ggY2hpbGQsIHRoZSBudW1iZXIgb2YgcmVxdWVzdHMgdGhhdAotICAgICAgY2hpbGQgaGFzIHBlcmZvcm1lZCBhbmQgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBzZXJ2ZWQgYnkKLSAgICAgIHRoZSBjaGlsZCAoKik8L2xpPgotCi0gICAgICA8bGk+QSB0b3RhbCBudW1iZXIgb2YgYWNjZXNzZXMgYW5kIGJ5dGUgY291bnQgc2VydmVkICgqKTwvbGk+Ci0KLSAgICAgIDxsaT5UaGUgdGltZSB0aGUgc2VydmVyIHdhcyBzdGFydGVkL3Jlc3RhcnRlZCBhbmQgdGhlIHRpbWUgaXQKLSAgICAgIGhhcyBiZWVuIHJ1bm5pbmcgZm9yPC9saT4KLQotICAgICAgPGxpPkF2ZXJhZ2VzIGdpdmluZyB0aGUgbnVtYmVyIG9mIHJlcXVlc3RzIHBlciBzZWNvbmQsIHRoZQotICAgICAgbnVtYmVyIG9mIGJ5dGVzIHNlcnZlZCBwZXIgc2Vjb25kIGFuZCB0aGUgYXZlcmFnZSBudW1iZXIgb2YKLSAgICAgIGJ5dGVzIHBlciByZXF1ZXN0ICgqKTwvbGk+Ci0KLSAgICAgIDxsaT5UaGUgY3VycmVudCBwZXJjZW50YWdlIENQVSB1c2VkIGJ5IGVhY2ggY2hpbGQgYW5kIGluCi0gICAgICB0b3RhbCBieSBBcGFjaGUgKCopPC9saT4KLQotICAgICAgPGxpPlRoZSBjdXJyZW50IGhvc3RzIGFuZCByZXF1ZXN0cyBiZWluZyBwcm9jZXNzZWQgKCopPC9saT4KLSAgICA8L3VsPgotCi0gICAgQSBjb21waWxlLXRpbWUgb3B0aW9uIG11c3QgYmUgdXNlZCB0byBkaXNwbGF5IHRoZSBkZXRhaWxzCi0gICAgbWFya2VkICIoKikiIGFzIHRoZSBpbnN0cnVtZW50YXRpb24gcmVxdWlyZWQgZm9yIG9idGFpbmluZwotICAgIHRoZXNlIHN0YXRpc3RpY3MgZG9lcyBub3QgZXhpc3Qgd2l0aGluIHN0YW5kYXJkIEFwYWNoZS4gCi08L3N1bW1hcnk+Ci0KLTxzZWN0aW9uPgotICAgIDx0aXRsZT5FbmFibGluZyBTdGF0dXMgU3VwcG9ydDwvdGl0bGU+Ci0KLSAgICBUbyBlbmFibGUgc3RhdHVzIHJlcG9ydHMgb25seSBmb3IgYnJvd3NlcnMgZnJvbSB0aGUgZm9vLmNvbQotICAgIGRvbWFpbiBhZGQgdGhpcyBjb2RlIHRvIHlvdXIgPGNvZGU+aHR0cGQuY29uZjwvY29kZT4KLSAgICBjb25maWd1cmF0aW9uIGZpbGUgCi08ZXhhbXBsZT4KLSAgICAmbHQ7TG9jYXRpb24gL3NlcnZlci1zdGF0dXMmZ3Q7PGJyIC8+Ci0gICAgU2V0SGFuZGxlciBzZXJ2ZXItc3RhdHVzPGJyIC8+Ci08YnIgLz4KLSAgICBPcmRlciBEZW55LEFsbG93PGJyIC8+Ci0gICAgRGVueSBmcm9tIGFsbDxiciAvPgotICAgIEFsbG93IGZyb20gLmZvby5jb208YnIgLz4KLSAgICAmbHQ7L0xvY2F0aW9uJmd0OwotPC9leGFtcGxlPgotCi0gICAgPHA+WW91IGNhbiBub3cgYWNjZXNzIHNlcnZlciBzdGF0aXN0aWNzIGJ5IHVzaW5nIGEgV2ViIGJyb3dzZXIKLSAgICB0byBhY2Nlc3MgdGhlIHBhZ2UKLSAgICA8Y29kZT5odHRwOi8veW91ci5zZXJ2ZXIubmFtZS9zZXJ2ZXItc3RhdHVzPC9jb2RlPjwvcD4KLQotICAgIDxub3RlPjxwPk5vdGUgdGhhdCA8bW9kdWxlPm1vZF9zdGF0dXM8L21vZHVsZT4gd2lsbCBvbmx5IHdvcmsKLSAgICB3aGVuIHlvdSBhcmUgcnVubmluZyBBcGFjaGUgaW4gPGEgCi0gICAgaHJlZj0iY29yZS5odG1sI3NlcnZlcnR5cGUiPnN0YW5kYWxvbmU8L2E+IG1vZGUgYW5kIG5vdAotICAgIDxhIGhyZWY9ImNvcmUuaHRtbCNzZXJ2ZXJ0eXBlIj5pbmV0ZDwvYT4gbW9kZS48L3A+PC9ub3RlPgotPC9zZWN0aW9uPgotCi08c2VjdGlvbj4KLQotICAgIDx0aXRsZT5BdXRvbWF0aWMgVXBkYXRlczwvdGl0bGU+Ci0gICAgWW91IGNhbiBnZXQgdGhlIHN0YXR1cyBwYWdlIHRvIHVwZGF0ZSBpdHNlbGYgYXV0b21hdGljYWxseSBpZgotICAgIHlvdSBoYXZlIGEgYnJvd3NlciB0aGF0IHN1cHBvcnRzICJyZWZyZXNoIi4gQWNjZXNzIHRoZSBwYWdlCi0gICAgPGNvZGU+aHR0cDovL3lvdXIuc2VydmVyLm5hbWUvc2VydmVyLXN0YXR1cz9yZWZyZXNoPU48L2NvZGU+IHRvCi0gICAgcmVmcmVzaCB0aGUgcGFnZSBldmVyeSBOIHNlY29uZHMuIAotCi08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uPgotCi0gICAgPHRpdGxlPk1hY2hpbmUgUmVhZGFibGUgU3RhdHVzIEZpbGU8L3RpdGxlPgotICAgIEEgbWFjaGluZS1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBzdGF0dXMgZmlsZSBpcyBhdmFpbGFibGUgYnkKLSAgICBhY2Nlc3NpbmcgdGhlIHBhZ2UKLSAgICA8Y29kZT5odHRwOi8veW91ci5zZXJ2ZXIubmFtZS9zZXJ2ZXItc3RhdHVzP2F1dG88L2NvZGU+LiBUaGlzCi0gICAgaXMgdXNlZnVsIHdoZW4gYXV0b21hdGljYWxseSBydW4sIHNlZSB0aGUgUGVybCBwcm9ncmFtIGluIHRoZQotICAgIDxjb2RlPi9zdXBwb3J0PC9jb2RlPiBkaXJlY3Rvcnkgb2YgQXBhY2hlLAotICAgIDxjb2RlPmxvZ19zZXJ2ZXJfc3RhdHVzPC9jb2RlPi4gCi0KLSAgICA8bm90ZT4KLSAgICAgIDxzdHJvbmc+SXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgaWYgPG1vZHVsZT5tb2Rfc3RhdHVzPC9tb2R1bGU+IGlzCi0gICAgICBjb21waWxlZCBpbnRvIHRoZSBzZXJ2ZXIsIGl0cyBoYW5kbGVyIGNhcGFiaWxpdHkgaXMgYXZhaWxhYmxlCi0gICAgICBpbiA8ZW0+YWxsPC9lbT4gY29uZmlndXJhdGlvbiBmaWxlcywgaW5jbHVkaW5nCi0gICAgICA8ZW0+cGVyPC9lbT4tZGlyZWN0b3J5IGZpbGVzICg8ZW0+ZS5nLjwvZW0+LAotICAgICAgPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPikuIFRoaXMgbWF5IGhhdmUgc2VjdXJpdHktcmVsYXRlZAotICAgICAgcmFtaWZpY2F0aW9ucyBmb3IgeW91ciBzaXRlLjwvc3Ryb25nPgotICAgIDwvbm90ZT4KLQotPC9zZWN0aW9uPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxuYW1lPkV4dGVuZGVkU3RhdHVzPC9uYW1lPgotPGRlc2NyaXB0aW9uPlRoaXMgZGlyZWN0aXZlIGNvbnRyb2xzIHdoZXRoZXIgdGhlIHNlcnZlciBrZWVwcyB0cmFjayBvZgotZXh0ZW5kZWQgc3RhdHVzIGluZm9ybWF0aW9uIGZvciBlYWNoIHJlcXVlc3QuIFRoaXMgaXMgb25seQotdXNlZnVsIGlmIHRoZSBzdGF0dXMgbW9kdWxlIGlzIGVuYWJsZWQgb24gdGhlIHNlcnZlci48L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5FeHRlbmRlZFN0YXR1cyBPbnxPZmY8L3N5bnRheD4KLTxkZWZhdWx0PkV4dGVuZGVkU3RhdHVzIE9mZjwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci08Y29tcGF0aWJpbGl0eT5FeHRlbmRlZFN0YXR1cyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUgMS4zLjIgYW5kIAotbGF0ZXIuPC9jb21wYXRpYmlsaXR5PgotCi08dXNhZ2U+Ci0gICAgPHA+VGhpcyBzZXR0aW5nIGFwcGxpZXMgdG8gdGhlIGVudGlyZSBzZXJ2ZXIsIGFuZCBjYW5ub3QgYmUKLSAgICBlbmFibGVkIG9yIGRpc2FibGVkIG9uIGEgdmlydHVhbGhvc3QtYnktdmlydHVhbGhvc3QgYmFzaXMuPC9wPgotPC91c2FnZT4KLQotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLTwvbW9kdWxlc3lub3BzaXM+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2Rfc3VleGVjLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX3N1ZXhlYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTEwOTk5Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2Rfc3VleGVjLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFwYWNoZSBtb2R1bGUgbW9kX3N1ZXhlYzwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPk1vZHVsZSBtb2Rfc3VleGVjPC9IMT4KLQotPFA+Ci1UaGlzIG1vZHVsZSBwcm92aWRlcyBzdXBwb3J0IGZvciA8QSBIUkVGPSIuLi9zdWV4ZWMuaHRtbCI+Ci1ydW5uaW5nIENHSSBzY3JpcHRzIGFzIGEgc3BlY2lmaWVkIFVzZXIgYW5kIEdyb3VwPC9BPi4KLTwvUD4KLQotPFA+PEEKLUhSRUY9Im1vZHVsZS1kaWN0Lmh0bWwjU3RhdHVzIgotUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gRXh0ZW5zaW9uCi08QlI+Ci08QQotSFJFRj0ibW9kdWxlLWRpY3QuaHRtbCNTb3VyY2VGaWxlIgotUkVMPSJIZWxwIgotPjxTVFJPTkc+U291cmNlIEZpbGU6PC9TVFJPTkc+PC9BPiBtb2Rfc3VleGVjLmMKLTxCUj4KLTxBCi1IUkVGPSJtb2R1bGUtZGljdC5odG1sI01vZHVsZUlkZW50aWZpZXIiCi1SRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGUgSWRlbnRpZmllcjo8L1NUUk9ORz48L0E+IHN1ZXhlY19tb2R1bGUKLTxCUj4KLTxBCi1IUkVGPSJtb2R1bGUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi1SRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gQXZhaWxhYmxlIGluIEFwYWNoZSAyLjAgYW5kIGxhdGVyLgotPC9QPgotCi08aDI+U3VtbWFyeTwvaDI+Ci0KLTxwPlRoaXMgbW9kdWxlIGFsbG93cyBDR0kgc2NyaXB0cyB0byBydW4gYXMgYSBzcGVjaWZpZWQgdXNlciBhbmQgR3JvdXAuPC9wPgotCi08SDI+RGlyZWN0aXZlczwvSDI+Ci08VUw+Ci0gIDxMST48QSBIUkVGPSIjc3VleGVjdXNlcmdyb3VwIj5TdWV4ZWNVc2VyR3JvdXA8L0E+Ci08L1VMPgotCi08SDI+PEEgTkFNRT0ic3VleGVjdXNlcmdyb3VwIj5TdWV4ZWNVc2VyR3JvdXAgZGlyZWN0aXZlPC9BPjwvSDI+Ci08UD4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gU3VleGVjVXNlckdyb3VwIDxFTT5Vc2VyIEdyb3VwPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gTm9uZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEV4dGVuc2lvbjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX3N1ZXhlYzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBTdWV4ZWNVc2VyR3JvdXAgaXMgb25seSBhdmFpbGFibGUgaW4gMi4wIGFuZCBsYXRlci48L1A+Ci08UD4KLVRoZSA8Q09ERT5TdWV4ZWNVc2VyR3JvdXA8L0NPREU+IGRpcmVjdGl2ZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYSB1c2VyIGFuZAotZ3JvdXAgZm9yIENHSSBwcm9ncmFtcyB0byBydW4gYXMuICBOb24tQ0dJIHJlcXVlc3RzIGFyZSBzdGlsbCBwcm9jZXNzZXMKLXdpdGggdGhlIHVzZXIgc3BlY2lmaWVkIGluIHRoZSBVc2VyIGRpcmVjdGl2ZS4gIFRoaXMgZGlyZWN0aXZlIHJlcGxhY2VzCi11c2luZyB0aGUgVXNlciBhbmQgR3JvdXAgZGlyZWN0aXZlcyBpbnNpZGUgb2YgVmlydHVhbEhvc3RzLgotPC9QPgotPEhSPgotCi08SDMgQUxJR049IkNFTlRFUiI+Ci0gQXBhY2hlIEhUVFAgU2VydmVyIFZlcnNpb24gMi4wCi08L0gzPgotCi08QSBIUkVGPSIuLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9pbmRleC5naWYiIEFMVD0iSW5kZXgiPjwvQT4KLTxBIEhSRUY9Ii4uLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9ob21lLmdpZiIgQUxUPSJIb21lIj48L0E+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2Rfc3VleGVjLnhtbCBiL2RvY3MvbWFudWFsL21vZC9tb2Rfc3VleGVjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ1NzVlNC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX3N1ZXhlYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9Ii4uL3N0eWxlL21hbnVhbC54c2wiPz4KLTxtb2R1bGVzeW5vcHNpcz4KLQotPG5hbWU+bW9kX3N1ZXhlYzwvbmFtZT4KLTxzdGF0dXM+RXh0ZW5zaW9uPC9zdGF0dXM+Ci08aWRlbnRpZmllcj5zdWV4ZWNfbW9kdWxlPC9pZGVudGlmaWVyPgotPHNvdXJjZWZpbGU+bW9kX3N1ZXhlYy5jPC9zb3VyY2VmaWxlPgotPGNvbXBhdGliaWxpdHk+QXZhaWxhYmxlIGluIEFwYWNoZSAyLjAgYW5kIGxhdGVyPC9jb21wYXRpYmlsaXR5PgotCi08ZGVzY3JpcHRpb24+VGhpcyBtb2R1bGUgYWxsb3dzIENHSSBzY3JpcHRzIHRvIHJ1biBhcyBhIHNwZWNpZmllZCB1c2VyCi1hbmQgR3JvdXAuPC9kZXNjcmlwdGlvbj4KLQotPHN1bW1hcnk+Ci0gICAgPHA+VGhpcyBtb2R1bGUgYWxsb3dzIENHSSBzY3JpcHRzIHRvIHJ1biBhcyBhIHNwZWNpZmllZCB1c2VyCi0gICAgYW5kIEdyb3VwLjwvcD4KLTwvc3VtbWFyeT4KLQotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxuYW1lPlN1ZXhlY1VzZXJHcm91cDwvbmFtZT4KLTxzeW50YXg+U3VleGVjVXNlckdyb3VwIDxlbT5Vc2VyIEdyb3VwPC9lbT48L3N5bnRheD4KLTxkZWZhdWx0Pk5vbmU8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPGNvbXBhdGliaWxpdHk+U3VleGVjVXNlckdyb3VwIGlzIG9ubHkgYXZhaWxhYmxlIGluIDIuMCBhbmQKLWxhdGVyLjwvY29tcGF0aWJpbGl0eT4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8Y29kZT5TdWV4ZWNVc2VyR3JvdXA8L2NvZGU+IGRpcmVjdGl2ZSBhbGxvd3MgeW91IHRvCi0gICAgc3BlY2lmeSBhIHVzZXIgYW5kIGdyb3VwIGZvciBDR0kgcHJvZ3JhbXMgdG8gcnVuIGFzLiBOb24tQ0dJCi0gICAgcmVxdWVzdHMgYXJlIHN0aWxsIHByb2Nlc3NlcyB3aXRoIHRoZSB1c2VyIHNwZWNpZmllZCBpbiB0aGUKLSAgICBVc2VyIGRpcmVjdGl2ZS4gVGhpcyBkaXJlY3RpdmUgcmVwbGFjZXMgdXNpbmcgdGhlIFVzZXIgYW5kCi0gICAgR3JvdXAgZGlyZWN0aXZlcyBpbnNpZGUgb2YgVmlydHVhbEhvc3RzLjwvcD4KLTwvdXNhZ2U+Ci0KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci08L21vZHVsZXN5bm9wc2lzPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX3VuaXF1ZV9pZC5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF91bmlxdWVfaWQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY3MWZjZS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX3VuaXF1ZV9pZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIG1vZHVsZSBtb2RfdW5pcXVlX2lkPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+TW9kdWxlIG1vZF91bmlxdWVfaWQ8L2gxPgotCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBhIG1hZ2ljIHRva2VuIGZvciBlYWNoIHJlcXVlc3Qgd2hpY2ggaXMgZ3VhcmFudGVlZAotdG8gYmUgdW5pcXVlIGFjcm9zcyAiYWxsIiByZXF1ZXN0cyB1bmRlciB2ZXJ5IHNwZWNpZmljIGNvbmRpdGlvbnMuCi1UaGUgdW5pcXVlIGlkZW50aWZpZXIgaXMgZXZlbiB1bmlxdWUgYWNyb3NzIG11bHRpcGxlIG1hY2hpbmVzIGluIGEKLXByb3Blcmx5IGNvbmZpZ3VyZWQgY2x1c3RlciBvZiBtYWNoaW5lcy4gIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotPGNvZGU+VU5JUVVFX0lEPC9jb2RlPiBpcyBzZXQgdG8gdGhlIGlkZW50aWZpZXIgZm9yIGVhY2ggcmVxdWVzdC4KLVVuaXF1ZSBpZGVudGlmaWVycyBhcmUgdXNlZnVsIGZvciB2YXJpb3VzIHJlYXNvbnMgd2hpY2ggYXJlIGJleW9uZCB0aGUKLXNjb3BlIG9mIHRoaXMgZG9jdW1lbnQuCi0KLTxoMj5UaGVvcnk8L2gyPgotCi08cD4KLUZpcnN0IGEgYnJpZWYgcmVjYXAgb2YgaG93IHRoZSBBcGFjaGUgc2VydmVyIHdvcmtzIG9uIFVuaXggbWFjaGluZXMuCi1UaGlzIGZlYXR1cmUgY3VycmVudGx5IGlzbid0IHN1cHBvcnRlZCBvbiBXaW5kb3dzIE5ULiAgT24gVW5peCBtYWNoaW5lcywKLUFwYWNoZSBjcmVhdGVzIHNldmVyYWwgY2hpbGRyZW4sIHRoZSBjaGlsZHJlbiBwcm9jZXNzIHJlcXVlc3RzIG9uZSBhdAotYSB0aW1lLiAgRWFjaCBjaGlsZCBjYW4gc2VydmUgbXVsdGlwbGUgcmVxdWVzdHMgaW4gaXRzIGxpZmV0aW1lLiAgRm9yIHRoZQotcHVycG9zZSBvZiB0aGlzIGRpc2N1c3Npb24sIHRoZSBjaGlsZHJlbiBkb24ndCBzaGFyZSBhbnkgZGF0YQotd2l0aCBlYWNoIG90aGVyLiAgV2UnbGwgcmVmZXIgdG8gdGhlIGNoaWxkcmVuIGFzIGh0dHBkIHByb2Nlc3Nlcy4KLQotPHA+Ci1Zb3VyIHdlYnNpdGUgaGFzIG9uZSBvciBtb3JlIG1hY2hpbmVzIHVuZGVyIHlvdXIgYWRtaW5pc3RyYXRpdmUgY29udHJvbCwKLXRvZ2V0aGVyIHdlJ2xsIGNhbGwgdGhlbSBhIGNsdXN0ZXIgb2YgbWFjaGluZXMuICBFYWNoIG1hY2hpbmUgY2FuCi1wb3NzaWJseSBydW4gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEFwYWNoZS4gIEFsbCBvZiB0aGVzZSBjb2xsZWN0aXZlbHkKLWFyZSBjb25zaWRlcmVkICJ0aGUgdW5pdmVyc2UiLCBhbmQgd2l0aCBjZXJ0YWluIGFzc3VtcHRpb25zIHdlJ2xsCi1zaG93IHRoYXQgaW4gdGhpcyB1bml2ZXJzZSB3ZSBjYW4gZ2VuZXJhdGUgdW5pcXVlIGlkZW50aWZpZXJzIGZvciBlYWNoCi1yZXF1ZXN0LCB3aXRob3V0IGV4dGVuc2l2ZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gbWFjaGluZXMgaW4gdGhlIGNsdXN0ZXIuCi0KLTxwPgotVGhlIG1hY2hpbmVzIGluIHlvdXIgY2x1c3RlciBzaG91bGQgc2F0aXNmeSB0aGVzZSByZXF1aXJlbWVudHMuCi0oRXZlbiBpZiB5b3UgaGF2ZSBvbmx5IG9uZSBtYWNoaW5lIHlvdSBzaG91bGQgc3luY2hyb25pemUgaXRzIGNsb2NrCi13aXRoIE5UUC4pCi0KLTx1bD4KLTxsaT5UaGUgbWFjaGluZXMnIHRpbWVzIGFyZSBzeW5jaHJvbml6ZWQgdmlhIE5UUCBvciBvdGhlciBuZXR3b3JrIHRpbWUKLSAgICBwcm90b2NvbC4KLQotPGxpPlRoZSBtYWNoaW5lcycgaG9zdG5hbWVzIGFsbCBkaWZmZXIsIHN1Y2ggdGhhdCB0aGUgbW9kdWxlIGNhbiBkbyBhCi0gICAgaG9zdG5hbWUgbG9va3VwIG9uIHRoZSBob3N0bmFtZSBhbmQgcmVjZWl2ZSBhIGRpZmZlcmVudCBJUCBhZGRyZXNzCi0gICAgZm9yIGVhY2ggbWFjaGluZSBpbiB0aGUgY2x1c3Rlci4KLTwvdWw+Ci0KLTxwPgotQXMgZmFyIGFzIG9wZXJhdGluZyBzeXN0ZW0gYXNzdW1wdGlvbnMgZ28sIHdlIGFzc3VtZSB0aGF0IHBpZHMgKHByb2Nlc3MKLWlkcykgZml0IGluIDMyLWJpdHMuICBJZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB1c2VzIG1vcmUgdGhhbiAzMi1iaXRzCi1mb3IgYSBwaWQsIHRoZSBmaXggaXMgdHJpdmlhbCBidXQgbXVzdCBiZSBwZXJmb3JtZWQgaW4gdGhlIGNvZGUuCi0KLTxwPgotR2l2ZW4gdGhvc2UgYXNzdW1wdGlvbnMsIGF0IGEgc2luZ2xlIHBvaW50IGluIHRpbWUgd2UgY2FuIGlkZW50aWZ5Ci1hbnkgaHR0cGQgcHJvY2VzcyBvbiBhbnkgbWFjaGluZSBpbiB0aGUgY2x1c3RlciBmcm9tIGFsbCBvdGhlciBodHRwZAotcHJvY2Vzc2VzLiAgVGhlIG1hY2hpbmUncyBJUCBhZGRyZXNzIGFuZCB0aGUgcGlkIG9mIHRoZSBodHRwZCBwcm9jZXNzCi1hcmUgc3VmZmljaWVudCB0byBkbyB0aGlzLiAgU28gaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdW5pcXVlIGlkZW50aWZpZXJzCi1mb3IgcmVxdWVzdHMgd2UgbmVlZCBvbmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lLgotCi08cD4KLVRvIGRpc3Rpbmd1aXNoIHRpbWUgd2Ugd2lsbCB1c2UgYSBVbml4IHRpbWVzdGFtcCAoc2Vjb25kcyBzaW5jZSBKYW51YXJ5Ci0xLCAxOTcwIFVUQyksIGFuZCBhIDE2LWJpdCBjb3VudGVyLiAgVGhlIHRpbWVzdGFtcCBoYXMgb25seSBvbmUgc2Vjb25kCi1ncmFudWxhcml0eSwgc28gdGhlIGNvdW50ZXIgaXMgdXNlZCB0byByZXByZXNlbnQgdXAgdG8gNjU1MzYgdmFsdWVzCi1kdXJpbmcgYSBzaW5nbGUgc2Vjb25kLiAgVGhlIHF1YWRydXBsZSA8aT4oIGlwX2FkZHIsIHBpZCwgdGltZV9zdGFtcCwKLWNvdW50ZXIgKTwvaT4gaXMgc3VmZmljaWVudCB0byBlbnVtZXJhdGUgNjU1MzYgcmVxdWVzdHMgcGVyIHNlY29uZCBwZXIKLWh0dHBkIHByb2Nlc3MuICBUaGVyZSBhcmUgaXNzdWVzIGhvd2V2ZXIgd2l0aCBwaWQgcmV1c2Ugb3ZlcgotdGltZSwgYW5kIHRoZSBjb3VudGVyIGlzIHVzZWQgdG8gYWxsZXZpYXRlIHRoaXMgaXNzdWUuCi0KLTxwPgotV2hlbiBhbiBodHRwZCBjaGlsZCBpcyBjcmVhdGVkLCB0aGUgY291bnRlciBpcyBpbml0aWFsaXplZCB3aXRoICgKLWN1cnJlbnQgbWljcm9zZWNvbmRzIGRpdmlkZWQgYnkgMTAgKSBtb2R1bG8gNjU1MzYgKHRoaXMgZm9ybXVsYSB3YXMKLWNob3NlbiB0byBlbGltaW5hdGUgc29tZSB2YXJpYW5jZSBwcm9ibGVtcyB3aXRoIHRoZSBsb3cgb3JkZXIgYml0cyBvZgotdGhlIG1pY3Jvc2Vjb25kIHRpbWVycyBvbiBzb21lIHN5c3RlbXMpLiAgV2hlbiBhIHVuaXF1ZSBpZGVudGlmaWVyIGlzCi1nZW5lcmF0ZWQsIHRoZSB0aW1lIHN0YW1wIHVzZWQgaXMgdGhlIHRpbWUgdGhlIHJlcXVlc3QgYXJyaXZlZCBhdCB0aGUKLXdlYiBzZXJ2ZXIuICBUaGUgY291bnRlciBpcyBpbmNyZW1lbnRlZCBldmVyeSB0aW1lIGFuIGlkZW50aWZpZXIgaXMKLWdlbmVyYXRlZCAoYW5kIGFsbG93ZWQgdG8gcm9sbCBvdmVyKS4KLQotPHA+Ci1UaGUga2VybmVsIGdlbmVyYXRlcyBhIHBpZCBmb3IgZWFjaCBwcm9jZXNzIGFzIGl0IGZvcmtzIHRoZSBwcm9jZXNzLCBhbmQKLXBpZHMgYXJlIGFsbG93ZWQgdG8gcm9sbCBvdmVyICh0aGV5J3JlIDE2LWJpdHMgb24gbWFueSBVbml4ZXMsIGJ1dCBuZXdlcgotc3lzdGVtcyBoYXZlIGV4cGFuZGVkIHRvIDMyLWJpdHMpLiAgU28gb3ZlciB0aW1lIHRoZSBzYW1lIHBpZCB3aWxsIGJlCi1yZXVzZWQuICBIb3dldmVyIHVubGVzcyBpdCBpcyByZXVzZWQgd2l0aGluIHRoZSBzYW1lIHNlY29uZCwgaXQgZG9lcyBub3QKLWRlc3Ryb3kgdGhlIHVuaXF1ZW5lc3Mgb2Ygb3VyIHF1YWRydXBsZS4gIFRoYXQgaXMsIHdlIGFzc3VtZSB0aGUgc3lzdGVtCi1kb2VzIG5vdCBzcGF3biA2NTUzNiBwcm9jZXNzZXMgaW4gYSBvbmUgc2Vjb25kIGludGVydmFsIChpdCBtYXkgZXZlbiBiZQotMzI3NjggcHJvY2Vzc2VzIG9uIHNvbWUgVW5peGVzLCBidXQgZXZlbiB0aGlzIGlzbid0IGxpa2VseSB0byBoYXBwZW4pLgotCi08cD4KLVN1cHBvc2UgdGhhdCB0aW1lIHJlcGVhdHMgaXRzZWxmIGZvciBzb21lIHJlYXNvbi4gIFRoYXQgaXMsIHN1cHBvc2UgdGhhdAotdGhlIHN5c3RlbSdzIGNsb2NrIGlzIHNjcmV3ZWQgdXAgYW5kIGl0IHJldmlzaXRzIGEgcGFzdCB0aW1lIChvciBpdCBpcwotdG9vIGZhciBmb3J3YXJkLCBpcyByZXNldCBjb3JyZWN0bHksIGFuZCB0aGVuIHJldmlzaXRzIHRoZSBmdXR1cmUgdGltZSkuCi1JbiB0aGlzIGNhc2Ugd2UgY2FuIGVhc2lseSBzaG93IHRoYXQgd2UgY2FuIGdldCBwaWQgYW5kIHRpbWUgc3RhbXAgcmV1c2UuCi1UaGUgY2hvaWNlIG9mIGluaXRpYWxpemVyIGZvciB0aGUgY291bnRlciBpcyBpbnRlbmRlZCB0byBoZWxwIGRlZmVhdCB0aGlzLgotTm90ZSB0aGF0IHdlIHJlYWxseSB3YW50IGEgcmFuZG9tIG51bWJlciB0byBpbml0aWFsaXplIHRoZSBjb3VudGVyLAotYnV0IHRoZXJlIGFyZW4ndCBhbnkgcmVhZGlseSBhdmFpbGFibGUgbnVtYmVycyBvbiBtb3N0IHN5c3RlbXMgKGkuZS4geW91Ci1jYW4ndCB1c2UgcmFuZCgpIGJlY2F1c2UgeW91IG5lZWQgdG8gc2VlZCB0aGUgZ2VuZXJhdG9yLCBhbmQgY2FuJ3Qgc2VlZAotaXQgd2l0aCB0aGUgdGltZSBiZWNhdXNlIHRpbWUsIGF0IGxlYXN0IGF0IG9uZSBzZWNvbmQgcmVzb2x1dGlvbiwgaGFzCi1yZXBlYXRlZCBpdHNlbGYpLiAgVGhpcyBpcyBub3QgYSBwZXJmZWN0IGRlZmVuc2UuCi0KLTxwPgotSG93IGdvb2QgYSBkZWZlbnNlIGlzIGl0PyAgV2VsbCBzdXBwb3NlIHRoYXQgb25lIG9mIHlvdXIgbWFjaGluZXMgc2VydmVzCi1hdCBtb3N0IDUwMCByZXF1ZXN0cyBwZXIgc2Vjb25kICh3aGljaCBpcyBhIHZlcnkgcmVhc29uYWJsZSB1cHBlciBib3VuZAotYXQgdGhpcyB3cml0aW5nLCBiZWNhdXNlIHN5c3RlbXMgZ2VuZXJhbGx5IGRvIG1vcmUgdGhhbiBqdXN0IHNob3ZlbCBvdXQKLXN0YXRpYyBmaWxlcykuICBUbyBkbyB0aGF0IGl0IHdpbGwgcmVxdWlyZSBhIG51bWJlciBvZiBjaGlsZHJlbiB3aGljaAotZGVwZW5kcyBvbiBob3cgbWFueSBjb25jdXJyZW50IGNsaWVudHMgeW91IGhhdmUuICBCdXQgd2UnbGwgYmUgcGVzc2ltaXN0aWMKLWFuZCBzdXBwb3NlIHRoYXQgYSBzaW5nbGUgY2hpbGQgaXMgYWJsZSB0byBzZXJ2ZSA1MDAgcmVxdWVzdHMgcGVyIHNlY29uZC4KLVRoZXJlIGFyZSAxMDAwIHBvc3NpYmxlIHN0YXJ0aW5nIGNvdW50ZXIgdmFsdWVzIHN1Y2ggdGhhdCB0d28gc2VxdWVuY2VzCi1vZiA1MDAgcmVxdWVzdHMgb3ZlcmxhcC4gIFNvIHRoZXJlIGlzIGEgMS41JSBjaGFuY2UgdGhhdCBpZiB0aW1lIChhdCBvbmUKLXNlY29uZCByZXNvbHV0aW9uKSByZXBlYXRzIGl0c2VsZiB0aGlzIGNoaWxkIHdpbGwgcmVwZWF0IGEgY291bnRlciB2YWx1ZSwKLWFuZCB1bmlxdWVuZXNzIHdpbGwgYmUgYnJva2VuLiAgVGhpcyB3YXMgYSB2ZXJ5IHBlc3NpbWlzdGljIGV4YW1wbGUsCi1hbmQgd2l0aCByZWFsIHdvcmxkIHZhbHVlcyBpdCdzIGV2ZW4gbGVzcyBsaWtlbHkgdG8gb2NjdXIuICBJZiB5b3VyCi1zeXN0ZW0gaXMgc3VjaCB0aGF0IGl0J3Mgc3RpbGwgbGlrZWx5IHRvIG9jY3VyLCB0aGVuIHBlcmhhcHMgeW91IHNob3VsZAotbWFrZSB0aGUgY291bnRlciAzMiBiaXRzIChieSBlZGl0aW5nIHRoZSBjb2RlKS4KLQotPHA+Ci1Zb3UgbWF5IGJlIGNvbmNlcm5lZCBhYm91dCB0aGUgY2xvY2sgYmVpbmcgInNldCBiYWNrIiBkdXJpbmcgc3VtbWVyCi1kYXlsaWdodCBzYXZpbmdzLiAgSG93ZXZlciB0aGlzIGlzbid0IGFuIGlzc3VlIGJlY2F1c2UgdGhlIHRpbWVzIHVzZWQgaGVyZQotYXJlIFVUQywgd2hpY2ggImFsd2F5cyIgZ28gZm9yd2FyZC4gIE5vdGUgdGhhdCB4ODYgYmFzZWQgVW5peGVzIG1heSBuZWVkCi1wcm9wZXIgY29uZmlndXJhdGlvbiBmb3IgdGhpcyB0byBiZSB0cnVlIC0tIHRoZXkgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgdG8KLWFzc3VtZSB0aGF0IHRoZSBtb3RoZXJib2FyZCBjbG9jayBpcyBvbiBVVEMgYW5kIGNvbXBlbnNhdGUgYXBwcm9wcmlhdGVseS4KLUJ1dCBldmVuIHN0aWxsLCBpZiB5b3UncmUgcnVubmluZyBOVFAgdGhlbiB5b3VyIFVUQyB0aW1lIHdpbGwgYmUgY29ycmVjdAotdmVyeSBzaG9ydGx5IGFmdGVyIHJlYm9vdC4KLQotPHA+Ci1UaGUgPGNvZGU+VU5JUVVFX0lEPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBjb25zdHJ1Y3RlZCBieQotZW5jb2RpbmcgdGhlIDExMi1iaXQgKDMyLWJpdCBJUCBhZGRyZXNzLCAzMiBiaXQgcGlkLCAzMiBiaXQgdGltZSBzdGFtcCwKLTE2IGJpdCBjb3VudGVyKSBxdWFkcnVwbGUgdXNpbmcgdGhlIGFscGhhYmV0IDxjb2RlPltBLVphLXowLTlALV08L2NvZGU+Ci1pbiBhIG1hbm5lciBzaW1pbGFyIHRvIE1JTUUgYmFzZTY0IGVuY29kaW5nLCBwcm9kdWNpbmcgMTkgY2hhcmFjdGVycy4KLVRoZSBNSU1FIGJhc2U2NCBhbHBoYWJldCBpcyBhY3R1YWxseSA8Y29kZT5bQS1aYS16MC05Ky9dPC9jb2RlPiBob3dldmVyCi08Y29kZT4rPC9jb2RlPiBhbmQgPGNvZGU+LzwvY29kZT4gbmVlZCB0byBiZSBzcGVjaWFsbHkgZW5jb2RlZCBpbiBVUkxzLAotd2hpY2ggbWFrZXMgdGhlbSBsZXNzIGRlc2lyYWJsZS4gIEFsbCB2YWx1ZXMgYXJlIGVuY29kZWQgaW4gbmV0d29yawotYnl0ZSBvcmRlcmluZyBzbyB0aGF0IHRoZSBlbmNvZGluZyBpcyBjb21wYXJhYmxlIGFjcm9zcyBhcmNoaXRlY3R1cmVzIG9mCi1kaWZmZXJlbnQgYnl0ZSBvcmRlcmluZy4gIFRoZSBhY3R1YWwgb3JkZXJpbmcgb2YgdGhlIGVuY29kaW5nIGlzOiB0aW1lCi1zdGFtcCwgSVAgYWRkcmVzcywgcGlkLCBjb3VudGVyLiAgVGhpcyBvcmRlcmluZyBoYXMgYSBwdXJwb3NlLCBidXQgaXQKLXNob3VsZCBiZSBlbXBoYXNpemVkIHRoYXQgYXBwbGljYXRpb25zIHNob3VsZCBub3QgZGlzc2VjdCB0aGUgZW5jb2RpbmcuCi1BcHBsaWNhdGlvbnMgc2hvdWxkIHRyZWF0IHRoZSBlbnRpcmUgZW5jb2RlZCA8Y29kZT5VTklRVUVfSUQ8L2NvZGU+IGFzIGFuCi1vcGFxdWUgdG9rZW4sIHdoaWNoIGNhbiBiZSBjb21wYXJlZCBhZ2FpbnN0IG90aGVyIDxjb2RlPlVOSVFVRV9JRDwvY29kZT5zCi1mb3IgZXF1YWxpdHkgb25seS4KLQotPHA+Ci1UaGUgb3JkZXJpbmcgd2FzIGNob3NlbiBzdWNoIHRoYXQgaXQncyBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlIGVuY29kaW5nCi1pbiB0aGUgZnV0dXJlIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgY29sbGlzaW9uIHdpdGggYW4gZXhpc3RpbmcgZGF0YWJhc2UKLW9mIDxjb2RlPlVOSVFVRV9JRDwvY29kZT5zLiAgVGhlIG5ldyBlbmNvZGluZ3Mgc2hvdWxkIGFsc28ga2VlcCB0aGUgdGltZQotc3RhbXAgYXMgdGhlIGZpcnN0IGVsZW1lbnQsIGFuZCBjYW4gb3RoZXJ3aXNlIHVzZSB0aGUgc2FtZSBhbHBoYWJldCBhbmQKLWJpdCBsZW5ndGguICBTaW5jZSB0aGUgdGltZSBzdGFtcHMgYXJlIGVzc2VudGlhbGx5IGFuIGluY3JlYXNpbmcgc2VxdWVuY2UsCi1pdCdzIHN1ZmZpY2llbnQgdG8gaGF2ZSBhIDxpPmZsYWcgc2Vjb25kPC9pPiBpbiB3aGljaCBhbGwgbWFjaGluZXMgaW4gdGhlCi1jbHVzdGVyIHN0b3Agc2VydmluZyBhbmQgcmVxdWVzdCwgYW5kIHN0b3AgdXNpbmcgdGhlIG9sZCBlbmNvZGluZyBmb3JtYXQuCi1BZnRlcndhcmRzIHRoZXkgY2FuIHJlc3VtZSByZXF1ZXN0cyBhbmQgYmVnaW4gaXNzdWluZyB0aGUgbmV3IGVuY29kaW5ncy4KLQotPHA+Ci1UaGlzIHdlIGJlbGlldmUgaXMgYSByZWxhdGl2ZWx5IHBvcnRhYmxlIHNvbHV0aW9uIHRvIHRoaXMgcHJvYmxlbS4gIEl0IGNhbgotYmUgZXh0ZW5kZWQgdG8gbXVsdGl0aHJlYWRlZCBzeXN0ZW1zIGxpa2UgV2luZG93cyBOVCwgYW5kIGNhbiBncm93IHdpdGgKLWZ1dHVyZSBuZWVkcy4gIFRoZSBpZGVudGlmaWVycyBnZW5lcmF0ZWQgaGF2ZSBlc3NlbnRpYWxseSBhbiBpbmZpbml0ZQotbGlmZS10aW1lIGJlY2F1c2UgZnV0dXJlIGlkZW50aWZpZXJzIGNhbiBiZSBtYWRlIGxvbmdlciBhcyByZXF1aXJlZC4KLUVzc2VudGlhbGx5IG5vIGNvbW11bmljYXRpb24gaXMgcmVxdWlyZWQgYmV0d2VlbiBtYWNoaW5lcyBpbiB0aGUgY2x1c3RlcgotKG9ubHkgTlRQIHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZCwgd2hpY2ggaXMgbG93IG92ZXJoZWFkKSwgYW5kIG5vCi1jb21tdW5pY2F0aW9uIGJldHdlZW4gaHR0cGQgcHJvY2Vzc2VzIGlzIHJlcXVpcmVkICh0aGUgY29tbXVuaWNhdGlvbiBpcwotaW1wbGljaXQgaW4gdGhlIHBpZCB2YWx1ZSBhc3NpZ25lZCBieSB0aGUga2VybmVsKS4gIEluIHZlcnkgc3BlY2lmaWMKLXNpdHVhdGlvbnMgdGhlIGlkZW50aWZpZXIgY2FuIGJlIHNob3J0ZW5lZCwgYnV0IG1vcmUgaW5mb3JtYXRpb24gbmVlZHMKLXRvIGJlIGFzc3VtZWQgKGZvciBleGFtcGxlIHRoZSAzMi1iaXQgSVAgYWRkcmVzcyBpcyBvdmVya2lsbCBmb3IgYW55Ci1zaXRlLCBidXQgdGhlcmUgaXMgbm8gcG9ydGFibGUgc2hvcnRlciByZXBsYWNlbWVudCBmb3IgaXQpLgotCi08aHI+Ci0KLTxoMj5EaXJlY3RpdmVzPC9oMj4KLQotPGNvZGU+bW9kX3VuaXF1ZV9pZDwvY29kZT4gaGFzIG5vIGRpcmVjdGl2ZXMuCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX3VuaXF1ZV9pZC54bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX3VuaXF1ZV9pZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZjNDE2NmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF91bmlxdWVfaWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iLi4vc3R5bGUvbWFudWFsLnhzbCI/PgotPG1vZHVsZXN5bm9wc2lzPgotCi08bmFtZT5tb2RfdW5pcXVlX2lkPC9uYW1lPgotPHN0YXR1cz5FeHRlbnNpb248L3N0YXR1cz4KLTxpZGVudGlmaWVyPnVuaXF1ZV9pZF9tb2R1bGU8L2lkZW50aWZpZXI+Ci08c291cmNlZmlsZT5tb2RfdW5pcXVlX2lkLmM8L3NvdXJjZWZpbGU+Ci08Y29tcGF0aWJpbGl0eT5BdmFpbGFibGUgaW4gQXBhY2hlIDEuMyBhbmQgbGF0ZXIuPC9jb21wYXRpYmlsaXR5PgotCi08ZGVzY3JpcHRpb24+VGhpcyBtb2R1bGUgcHJvdmlkZXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgd2l0aCBhIHVuaXF1ZQotaWRlbnRpZmllciBmb3IgZWFjaCByZXF1ZXN0LjwvZGVzY3JpcHRpb24+Ci0KLTxzdW1tYXJ5PgotCi0gICAgPHA+VGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBtYWdpYyB0b2tlbiBmb3IgZWFjaCByZXF1ZXN0IHdoaWNoIGlzCi0gICAgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgYWNyb3NzICJhbGwiIHJlcXVlc3RzIHVuZGVyIHZlcnkKLSAgICBzcGVjaWZpYyBjb25kaXRpb25zLiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgaXMgZXZlbiB1bmlxdWUKLSAgICBhY3Jvc3MgbXVsdGlwbGUgbWFjaGluZXMgaW4gYSBwcm9wZXJseSBjb25maWd1cmVkIGNsdXN0ZXIgb2YKLSAgICBtYWNoaW5lcy4gVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIDxjb2RlPlVOSVFVRV9JRDwvY29kZT4gaXMKLSAgICBzZXQgdG8gdGhlIGlkZW50aWZpZXIgZm9yIGVhY2ggcmVxdWVzdC4gVW5pcXVlIGlkZW50aWZpZXJzIGFyZQotICAgIHVzZWZ1bCBmb3IgdmFyaW91cyByZWFzb25zIHdoaWNoIGFyZSBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMKLSAgICBkb2N1bWVudC48L3A+Ci08L3N1bW1hcnk+Ci0KLTxzZWN0aW9uPgotICAgIDx0aXRsZT5UaGVvcnk8L3RpdGxlPgotCi0gICAgPHA+Rmlyc3QgYSBicmllZiByZWNhcCBvZiBob3cgdGhlIEFwYWNoZSBzZXJ2ZXIgd29ya3Mgb24gVW5peAotICAgIG1hY2hpbmVzLiBUaGlzIGZlYXR1cmUgY3VycmVudGx5IGlzbid0IHN1cHBvcnRlZCBvbiBXaW5kb3dzIE5ULgotICAgIE9uIFVuaXggbWFjaGluZXMsIEFwYWNoZSBjcmVhdGVzIHNldmVyYWwgY2hpbGRyZW4sIHRoZSBjaGlsZHJlbgotICAgIHByb2Nlc3MgcmVxdWVzdHMgb25lIGF0IGEgdGltZS4gRWFjaCBjaGlsZCBjYW4gc2VydmUgbXVsdGlwbGUKLSAgICByZXF1ZXN0cyBpbiBpdHMgbGlmZXRpbWUuIEZvciB0aGUgcHVycG9zZSBvZiB0aGlzIGRpc2N1c3Npb24sCi0gICAgdGhlIGNoaWxkcmVuIGRvbid0IHNoYXJlIGFueSBkYXRhIHdpdGggZWFjaCBvdGhlci4gV2UnbGwgcmVmZXIKLSAgICB0byB0aGUgY2hpbGRyZW4gYXMgaHR0cGQgcHJvY2Vzc2VzLjwvcD4KLQotICAgIDxwPllvdXIgd2Vic2l0ZSBoYXMgb25lIG9yIG1vcmUgbWFjaGluZXMgdW5kZXIgeW91cgotICAgIGFkbWluaXN0cmF0aXZlIGNvbnRyb2wsIHRvZ2V0aGVyIHdlJ2xsIGNhbGwgdGhlbSBhIGNsdXN0ZXIgb2YKLSAgICBtYWNoaW5lcy4gRWFjaCBtYWNoaW5lIGNhbiBwb3NzaWJseSBydW4gbXVsdGlwbGUgaW5zdGFuY2VzIG9mCi0gICAgQXBhY2hlLiBBbGwgb2YgdGhlc2UgY29sbGVjdGl2ZWx5IGFyZSBjb25zaWRlcmVkICJ0aGUKLSAgICB1bml2ZXJzZSIsIGFuZCB3aXRoIGNlcnRhaW4gYXNzdW1wdGlvbnMgd2UnbGwgc2hvdyB0aGF0IGluIHRoaXMKLSAgICB1bml2ZXJzZSB3ZSBjYW4gZ2VuZXJhdGUgdW5pcXVlIGlkZW50aWZpZXJzIGZvciBlYWNoIHJlcXVlc3QsCi0gICAgd2l0aG91dCBleHRlbnNpdmUgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIG1hY2hpbmVzIGluIHRoZQotICAgIGNsdXN0ZXIuPC9wPgotCi0gICAgPHA+VGhlIG1hY2hpbmVzIGluIHlvdXIgY2x1c3RlciBzaG91bGQgc2F0aXNmeSB0aGVzZQotICAgIHJlcXVpcmVtZW50cy4gKEV2ZW4gaWYgeW91IGhhdmUgb25seSBvbmUgbWFjaGluZSB5b3Ugc2hvdWxkCi0gICAgc3luY2hyb25pemUgaXRzIGNsb2NrIHdpdGggTlRQLik8L3A+Ci0KLSAgICA8dWw+Ci0gICAgICA8bGk+VGhlIG1hY2hpbmVzJyB0aW1lcyBhcmUgc3luY2hyb25pemVkIHZpYSBOVFAgb3Igb3RoZXIKLSAgICAgIG5ldHdvcmsgdGltZSBwcm90b2NvbC48L2xpPgotCi0gICAgICA8bGk+VGhlIG1hY2hpbmVzJyBob3N0bmFtZXMgYWxsIGRpZmZlciwgc3VjaCB0aGF0IHRoZSBtb2R1bGUKLSAgICAgIGNhbiBkbyBhIGhvc3RuYW1lIGxvb2t1cCBvbiB0aGUgaG9zdG5hbWUgYW5kIHJlY2VpdmUgYQotICAgICAgZGlmZmVyZW50IElQIGFkZHJlc3MgZm9yIGVhY2ggbWFjaGluZSBpbiB0aGUgY2x1c3Rlci48L2xpPgotICAgIDwvdWw+Ci0KLSAgICA8cD5BcyBmYXIgYXMgb3BlcmF0aW5nIHN5c3RlbSBhc3N1bXB0aW9ucyBnbywgd2UgYXNzdW1lIHRoYXQKLSAgICBwaWRzIChwcm9jZXNzIGlkcykgZml0IGluIDMyLWJpdHMuIElmIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHVzZXMKLSAgICBtb3JlIHRoYW4gMzItYml0cyBmb3IgYSBwaWQsIHRoZSBmaXggaXMgdHJpdmlhbCBidXQgbXVzdCBiZQotICAgIHBlcmZvcm1lZCBpbiB0aGUgY29kZS48L3A+Ci0KLSAgICA8cD5HaXZlbiB0aG9zZSBhc3N1bXB0aW9ucywgYXQgYSBzaW5nbGUgcG9pbnQgaW4gdGltZSB3ZSBjYW4KLSAgICBpZGVudGlmeSBhbnkgaHR0cGQgcHJvY2VzcyBvbiBhbnkgbWFjaGluZSBpbiB0aGUgY2x1c3RlciBmcm9tCi0gICAgYWxsIG90aGVyIGh0dHBkIHByb2Nlc3Nlcy4gVGhlIG1hY2hpbmUncyBJUCBhZGRyZXNzIGFuZCB0aGUgcGlkCi0gICAgb2YgdGhlIGh0dHBkIHByb2Nlc3MgYXJlIHN1ZmZpY2llbnQgdG8gZG8gdGhpcy4gU28gaW4gb3JkZXIgdG8KLSAgICBnZW5lcmF0ZSB1bmlxdWUgaWRlbnRpZmllcnMgZm9yIHJlcXVlc3RzIHdlIG5lZWQgb25seQotICAgIGRpc3Rpbmd1aXNoIGJldHdlZW4gZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lLjwvcD4KLQotICAgIDxwPlRvIGRpc3Rpbmd1aXNoIHRpbWUgd2Ugd2lsbCB1c2UgYSBVbml4IHRpbWVzdGFtcCAoc2Vjb25kcwotICAgIHNpbmNlIEphbnVhcnkgMSwgMTk3MCBVVEMpLCBhbmQgYSAxNi1iaXQgY291bnRlci4gVGhlIHRpbWVzdGFtcAotICAgIGhhcyBvbmx5IG9uZSBzZWNvbmQgZ3JhbnVsYXJpdHksIHNvIHRoZSBjb3VudGVyIGlzIHVzZWQgdG8KLSAgICByZXByZXNlbnQgdXAgdG8gNjU1MzYgdmFsdWVzIGR1cmluZyBhIHNpbmdsZSBzZWNvbmQuIFRoZQotICAgIHF1YWRydXBsZSA8ZW0+KCBpcF9hZGRyLCBwaWQsIHRpbWVfc3RhbXAsIGNvdW50ZXIgKTwvZW0+IGlzCi0gICAgc3VmZmljaWVudCB0byBlbnVtZXJhdGUgNjU1MzYgcmVxdWVzdHMgcGVyIHNlY29uZCBwZXIgaHR0cGQKLSAgICBwcm9jZXNzLiBUaGVyZSBhcmUgaXNzdWVzIGhvd2V2ZXIgd2l0aCBwaWQgcmV1c2Ugb3ZlciB0aW1lLCBhbmQKLSAgICB0aGUgY291bnRlciBpcyB1c2VkIHRvIGFsbGV2aWF0ZSB0aGlzIGlzc3VlLjwvcD4KLQotICAgIDxwPldoZW4gYW4gaHR0cGQgY2hpbGQgaXMgY3JlYXRlZCwgdGhlIGNvdW50ZXIgaXMgaW5pdGlhbGl6ZWQKLSAgICB3aXRoICggY3VycmVudCBtaWNyb3NlY29uZHMgZGl2aWRlZCBieSAxMCApIG1vZHVsbyA2NTUzNiAodGhpcwotICAgIGZvcm11bGEgd2FzIGNob3NlbiB0byBlbGltaW5hdGUgc29tZSB2YXJpYW5jZSBwcm9ibGVtcyB3aXRoIHRoZQotICAgIGxvdyBvcmRlciBiaXRzIG9mIHRoZSBtaWNyb3NlY29uZCB0aW1lcnMgb24gc29tZSBzeXN0ZW1zKS4gV2hlbgotICAgIGEgdW5pcXVlIGlkZW50aWZpZXIgaXMgZ2VuZXJhdGVkLCB0aGUgdGltZSBzdGFtcCB1c2VkIGlzIHRoZQotICAgIHRpbWUgdGhlIHJlcXVlc3QgYXJyaXZlZCBhdCB0aGUgd2ViIHNlcnZlci4gVGhlIGNvdW50ZXIgaXMKLSAgICBpbmNyZW1lbnRlZCBldmVyeSB0aW1lIGFuIGlkZW50aWZpZXIgaXMgZ2VuZXJhdGVkIChhbmQgYWxsb3dlZAotICAgIHRvIHJvbGwgb3ZlcikuPC9wPgotCi0gICAgPHA+VGhlIGtlcm5lbCBnZW5lcmF0ZXMgYSBwaWQgZm9yIGVhY2ggcHJvY2VzcyBhcyBpdCBmb3JrcyB0aGUKLSAgICBwcm9jZXNzLCBhbmQgcGlkcyBhcmUgYWxsb3dlZCB0byByb2xsIG92ZXIgKHRoZXkncmUgMTYtYml0cyBvbgotICAgIG1hbnkgVW5peGVzLCBidXQgbmV3ZXIgc3lzdGVtcyBoYXZlIGV4cGFuZGVkIHRvIDMyLWJpdHMpLiBTbwotICAgIG92ZXIgdGltZSB0aGUgc2FtZSBwaWQgd2lsbCBiZSByZXVzZWQuIEhvd2V2ZXIgdW5sZXNzIGl0IGlzCi0gICAgcmV1c2VkIHdpdGhpbiB0aGUgc2FtZSBzZWNvbmQsIGl0IGRvZXMgbm90IGRlc3Ryb3kgdGhlCi0gICAgdW5pcXVlbmVzcyBvZiBvdXIgcXVhZHJ1cGxlLiBUaGF0IGlzLCB3ZSBhc3N1bWUgdGhlIHN5c3RlbSBkb2VzCi0gICAgbm90IHNwYXduIDY1NTM2IHByb2Nlc3NlcyBpbiBhIG9uZSBzZWNvbmQgaW50ZXJ2YWwgKGl0IG1heSBldmVuCi0gICAgYmUgMzI3NjggcHJvY2Vzc2VzIG9uIHNvbWUgVW5peGVzLCBidXQgZXZlbiB0aGlzIGlzbid0IGxpa2VseQotICAgIHRvIGhhcHBlbikuPC9wPgotCi0gICAgPHA+U3VwcG9zZSB0aGF0IHRpbWUgcmVwZWF0cyBpdHNlbGYgZm9yIHNvbWUgcmVhc29uLiBUaGF0IGlzLAotICAgIHN1cHBvc2UgdGhhdCB0aGUgc3lzdGVtJ3MgY2xvY2sgaXMgc2NyZXdlZCB1cCBhbmQgaXQgcmV2aXNpdHMgYQotICAgIHBhc3QgdGltZSAob3IgaXQgaXMgdG9vIGZhciBmb3J3YXJkLCBpcyByZXNldCBjb3JyZWN0bHksIGFuZAotICAgIHRoZW4gcmV2aXNpdHMgdGhlIGZ1dHVyZSB0aW1lKS4gSW4gdGhpcyBjYXNlIHdlIGNhbiBlYXNpbHkgc2hvdwotICAgIHRoYXQgd2UgY2FuIGdldCBwaWQgYW5kIHRpbWUgc3RhbXAgcmV1c2UuIFRoZSBjaG9pY2Ugb2YKLSAgICBpbml0aWFsaXplciBmb3IgdGhlIGNvdW50ZXIgaXMgaW50ZW5kZWQgdG8gaGVscCBkZWZlYXQgdGhpcy4KLSAgICBOb3RlIHRoYXQgd2UgcmVhbGx5IHdhbnQgYSByYW5kb20gbnVtYmVyIHRvIGluaXRpYWxpemUgdGhlCi0gICAgY291bnRlciwgYnV0IHRoZXJlIGFyZW4ndCBhbnkgcmVhZGlseSBhdmFpbGFibGUgbnVtYmVycyBvbiBtb3N0Ci0gICAgc3lzdGVtcyAoPGVtPmkuZS48L2VtPiwgeW91IGNhbid0IHVzZSByYW5kKCkgYmVjYXVzZSB5b3UgbmVlZAotICAgIHRvIHNlZWQgdGhlIGdlbmVyYXRvciwgYW5kIGNhbid0IHNlZWQgaXQgd2l0aCB0aGUgdGltZSBiZWNhdXNlCi0gICAgdGltZSwgYXQgbGVhc3QgYXQgb25lIHNlY29uZCByZXNvbHV0aW9uLCBoYXMgcmVwZWF0ZWQgaXRzZWxmKS4KLSAgICBUaGlzIGlzIG5vdCBhIHBlcmZlY3QgZGVmZW5zZS48L3A+Ci0KLSAgICA8cD5Ib3cgZ29vZCBhIGRlZmVuc2UgaXMgaXQ/IFN1cHBvc2UgdGhhdCBvbmUgb2YgeW91ciBtYWNoaW5lcwotICAgIHNlcnZlcyBhdCBtb3N0IDUwMCByZXF1ZXN0cyBwZXIgc2Vjb25kICh3aGljaCBpcyBhIHZlcnkKLSAgICByZWFzb25hYmxlIHVwcGVyIGJvdW5kIGF0IHRoaXMgd3JpdGluZywgYmVjYXVzZSBzeXN0ZW1zCi0gICAgZ2VuZXJhbGx5IGRvIG1vcmUgdGhhbiBqdXN0IHNob3ZlbCBvdXQgc3RhdGljIGZpbGVzKS4gVG8gZG8KLSAgICB0aGF0IGl0IHdpbGwgcmVxdWlyZSBhIG51bWJlciBvZiBjaGlsZHJlbiB3aGljaCBkZXBlbmRzIG9uIGhvdwotICAgIG1hbnkgY29uY3VycmVudCBjbGllbnRzIHlvdSBoYXZlLiBCdXQgd2UnbGwgYmUgcGVzc2ltaXN0aWMgYW5kCi0gICAgc3VwcG9zZSB0aGF0IGEgc2luZ2xlIGNoaWxkIGlzIGFibGUgdG8gc2VydmUgNTAwIHJlcXVlc3RzIHBlcgotICAgIHNlY29uZC4gVGhlcmUgYXJlIDEwMDAgcG9zc2libGUgc3RhcnRpbmcgY291bnRlciB2YWx1ZXMgc3VjaAotICAgIHRoYXQgdHdvIHNlcXVlbmNlcyBvZiA1MDAgcmVxdWVzdHMgb3ZlcmxhcC4gU28gdGhlcmUgaXMgYSAxLjUlCi0gICAgY2hhbmNlIHRoYXQgaWYgdGltZSAoYXQgb25lIHNlY29uZCByZXNvbHV0aW9uKSByZXBlYXRzIGl0c2VsZgotICAgIHRoaXMgY2hpbGQgd2lsbCByZXBlYXQgYSBjb3VudGVyIHZhbHVlLCBhbmQgdW5pcXVlbmVzcyB3aWxsIGJlCi0gICAgYnJva2VuLiBUaGlzIHdhcyBhIHZlcnkgcGVzc2ltaXN0aWMgZXhhbXBsZSwgYW5kIHdpdGggcmVhbAotICAgIHdvcmxkIHZhbHVlcyBpdCdzIGV2ZW4gbGVzcyBsaWtlbHkgdG8gb2NjdXIuIElmIHlvdXIgc3lzdGVtIGlzCi0gICAgc3VjaCB0aGF0IGl0J3Mgc3RpbGwgbGlrZWx5IHRvIG9jY3VyLCB0aGVuIHBlcmhhcHMgeW91IHNob3VsZAotICAgIG1ha2UgdGhlIGNvdW50ZXIgMzIgYml0cyAoYnkgZWRpdGluZyB0aGUgY29kZSkuPC9wPgotCi0gICAgPHA+WW91IG1heSBiZSBjb25jZXJuZWQgYWJvdXQgdGhlIGNsb2NrIGJlaW5nICJzZXQgYmFjayIgZHVyaW5nCi0gICAgc3VtbWVyIGRheWxpZ2h0IHNhdmluZ3MuIEhvd2V2ZXIgdGhpcyBpc24ndCBhbiBpc3N1ZSBiZWNhdXNlCi0gICAgdGhlIHRpbWVzIHVzZWQgaGVyZSBhcmUgVVRDLCB3aGljaCAiYWx3YXlzIiBnbyBmb3J3YXJkLiBOb3RlCi0gICAgdGhhdCB4ODYgYmFzZWQgVW5peGVzIG1heSBuZWVkIHByb3BlciBjb25maWd1cmF0aW9uIGZvciB0aGlzIHRvCi0gICAgYmUgdHJ1ZSAtLSB0aGV5IHNob3VsZCBiZSBjb25maWd1cmVkIHRvIGFzc3VtZSB0aGF0IHRoZQotICAgIG1vdGhlcmJvYXJkIGNsb2NrIGlzIG9uIFVUQyBhbmQgY29tcGVuc2F0ZSBhcHByb3ByaWF0ZWx5LiBCdXQKLSAgICBldmVuIHN0aWxsLCBpZiB5b3UncmUgcnVubmluZyBOVFAgdGhlbiB5b3VyIFVUQyB0aW1lIHdpbGwgYmUKLSAgICBjb3JyZWN0IHZlcnkgc2hvcnRseSBhZnRlciByZWJvb3QuPC9wPgotCi0gICAgPHA+VGhlIDxjb2RlPlVOSVFVRV9JRDwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMKLSAgICBjb25zdHJ1Y3RlZCBieSBlbmNvZGluZyB0aGUgMTEyLWJpdCAoMzItYml0IElQIGFkZHJlc3MsIDMyIGJpdAotICAgIHBpZCwgMzIgYml0IHRpbWUgc3RhbXAsIDE2IGJpdCBjb3VudGVyKSBxdWFkcnVwbGUgdXNpbmcgdGhlCi0gICAgYWxwaGFiZXQgPGNvZGU+W0EtWmEtejAtOUAtXTwvY29kZT4gaW4gYSBtYW5uZXIgc2ltaWxhciB0byBNSU1FCi0gICAgYmFzZTY0IGVuY29kaW5nLCBwcm9kdWNpbmcgMTkgY2hhcmFjdGVycy4gVGhlIE1JTUUgYmFzZTY0Ci0gICAgYWxwaGFiZXQgaXMgYWN0dWFsbHkgPGNvZGU+W0EtWmEtejAtOSsvXTwvY29kZT4gaG93ZXZlcgotICAgIDxjb2RlPis8L2NvZGU+IGFuZCA8Y29kZT4vPC9jb2RlPiBuZWVkIHRvIGJlIHNwZWNpYWxseSBlbmNvZGVkCi0gICAgaW4gVVJMcywgd2hpY2ggbWFrZXMgdGhlbSBsZXNzIGRlc2lyYWJsZS4gQWxsIHZhbHVlcyBhcmUKLSAgICBlbmNvZGVkIGluIG5ldHdvcmsgYnl0ZSBvcmRlcmluZyBzbyB0aGF0IHRoZSBlbmNvZGluZyBpcwotICAgIGNvbXBhcmFibGUgYWNyb3NzIGFyY2hpdGVjdHVyZXMgb2YgZGlmZmVyZW50IGJ5dGUgb3JkZXJpbmcuIFRoZQotICAgIGFjdHVhbCBvcmRlcmluZyBvZiB0aGUgZW5jb2RpbmcgaXM6IHRpbWUgc3RhbXAsIElQIGFkZHJlc3MsCi0gICAgcGlkLCBjb3VudGVyLiBUaGlzIG9yZGVyaW5nIGhhcyBhIHB1cnBvc2UsIGJ1dCBpdCBzaG91bGQgYmUKLSAgICBlbXBoYXNpemVkIHRoYXQgYXBwbGljYXRpb25zIHNob3VsZCBub3QgZGlzc2VjdCB0aGUgZW5jb2RpbmcuCi0gICAgQXBwbGljYXRpb25zIHNob3VsZCB0cmVhdCB0aGUgZW50aXJlIGVuY29kZWQKLSAgICA8Y29kZT5VTklRVUVfSUQ8L2NvZGU+IGFzIGFuIG9wYXF1ZSB0b2tlbiwgd2hpY2ggY2FuIGJlCi0gICAgY29tcGFyZWQgYWdhaW5zdCBvdGhlciA8Y29kZT5VTklRVUVfSUQ8L2NvZGU+cyBmb3IgZXF1YWxpdHkKLSAgICBvbmx5LjwvcD4KLQotICAgIDxwPlRoZSBvcmRlcmluZyB3YXMgY2hvc2VuIHN1Y2ggdGhhdCBpdCdzIHBvc3NpYmxlIHRvIGNoYW5nZQotICAgIHRoZSBlbmNvZGluZyBpbiB0aGUgZnV0dXJlIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgY29sbGlzaW9uCi0gICAgd2l0aCBhbiBleGlzdGluZyBkYXRhYmFzZSBvZiA8Y29kZT5VTklRVUVfSUQ8L2NvZGU+cy4gVGhlIG5ldwotICAgIGVuY29kaW5ncyBzaG91bGQgYWxzbyBrZWVwIHRoZSB0aW1lIHN0YW1wIGFzIHRoZSBmaXJzdCBlbGVtZW50LAotICAgIGFuZCBjYW4gb3RoZXJ3aXNlIHVzZSB0aGUgc2FtZSBhbHBoYWJldCBhbmQgYml0IGxlbmd0aC4gU2luY2UKLSAgICB0aGUgdGltZSBzdGFtcHMgYXJlIGVzc2VudGlhbGx5IGFuIGluY3JlYXNpbmcgc2VxdWVuY2UsIGl0J3MKLSAgICBzdWZmaWNpZW50IHRvIGhhdmUgYSA8ZW0+ZmxhZyBzZWNvbmQ8L2VtPiBpbiB3aGljaCBhbGwgbWFjaGluZXMKLSAgICBpbiB0aGUgY2x1c3RlciBzdG9wIHNlcnZpbmcgYW5kIHJlcXVlc3QsIGFuZCBzdG9wIHVzaW5nIHRoZSBvbGQKLSAgICBlbmNvZGluZyBmb3JtYXQuIEFmdGVyd2FyZHMgdGhleSBjYW4gcmVzdW1lIHJlcXVlc3RzIGFuZCBiZWdpbgotICAgIGlzc3VpbmcgdGhlIG5ldyBlbmNvZGluZ3MuPC9wPgotCi0gICAgPHA+VGhpcyB3ZSBiZWxpZXZlIGlzIGEgcmVsYXRpdmVseSBwb3J0YWJsZSBzb2x1dGlvbiB0byB0aGlzCi0gICAgcHJvYmxlbS4gSXQgY2FuIGJlIGV4dGVuZGVkIHRvIG11bHRpdGhyZWFkZWQgc3lzdGVtcyBsaWtlCi0gICAgV2luZG93cyBOVCwgYW5kIGNhbiBncm93IHdpdGggZnV0dXJlIG5lZWRzLiBUaGUgaWRlbnRpZmllcnMKLSAgICBnZW5lcmF0ZWQgaGF2ZSBlc3NlbnRpYWxseSBhbiBpbmZpbml0ZSBsaWZlLXRpbWUgYmVjYXVzZSBmdXR1cmUKLSAgICBpZGVudGlmaWVycyBjYW4gYmUgbWFkZSBsb25nZXIgYXMgcmVxdWlyZWQuIEVzc2VudGlhbGx5IG5vCi0gICAgY29tbXVuaWNhdGlvbiBpcyByZXF1aXJlZCBiZXR3ZWVuIG1hY2hpbmVzIGluIHRoZSBjbHVzdGVyIChvbmx5Ci0gICAgTlRQIHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZCwgd2hpY2ggaXMgbG93IG92ZXJoZWFkKSwgYW5kIG5vCi0gICAgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGh0dHBkIHByb2Nlc3NlcyBpcyByZXF1aXJlZCAodGhlCi0gICAgY29tbXVuaWNhdGlvbiBpcyBpbXBsaWNpdCBpbiB0aGUgcGlkIHZhbHVlIGFzc2lnbmVkIGJ5IHRoZQotICAgIGtlcm5lbCkuIEluIHZlcnkgc3BlY2lmaWMgc2l0dWF0aW9ucyB0aGUgaWRlbnRpZmllciBjYW4gYmUKLSAgICBzaG9ydGVuZWQsIGJ1dCBtb3JlIGluZm9ybWF0aW9uIG5lZWRzIHRvIGJlIGFzc3VtZWQgKGZvcgotICAgIGV4YW1wbGUgdGhlIDMyLWJpdCBJUCBhZGRyZXNzIGlzIG92ZXJraWxsIGZvciBhbnkgc2l0ZSwgYnV0Ci0gICAgdGhlcmUgaXMgbm8gcG9ydGFibGUgc2hvcnRlciByZXBsYWNlbWVudCBmb3IgaXQpLiA8L3A+Ci08L3NlY3Rpb24+Ci0KLQotPC9tb2R1bGVzeW5vcHNpcz4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfdXNlcmRpci5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF91c2VyZGlyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYTUxN2YuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF91c2VyZGlyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08IS0tJWh5cGVydGV4dCAtLT4KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgMi4wLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFwYWNoZSBtb2R1bGUgbW9kX3VzZXJkaXI8L1RJVExFPgotPC9IRUFEPgotCi08Qk9EWT4KLTxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX3N1Yi5naWYiIEFMVD0iIj4KLTwhLS0vJWh5cGVydGV4dCAtLT4KLTxIMT5Nb2R1bGUgbW9kX3VzZXJkaXI8L2gxPgotCi1UaGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4gdGhlIDxjb2RlPm1vZF91c2VyZGlyLmM8L2NvZGU+IGZpbGUsIGFuZAotaXMgY29tcGlsZWQgaW4gYnkgZGVmYXVsdC4gSXQgcHJvdmlkZXMgZm9yIHVzZXItc3BlY2lmaWMgZGlyZWN0b3JpZXMuCi0KLTwhLS0laHlwZXJ0ZXh0IC0tPgotPHVsPgotPGxpPjxBIEhSRUY9IiN1c2VyZGlyIj5Vc2VyRGlyPC9BPgotPC91bD4KLTxocj4KLTwhLS0vJWh5cGVydGV4dCAtLT4KLQotPEEgbmFtZT0idXNlcmRpciI+PGgyPlVzZXJEaXI8L2gyPjwvQT4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBVc2VyRGlyfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+IFVzZXJEaXIgPGVtPmRpcmVjdG9yeS9maWxlbmFtZTwvZW0+PGJyPgotPHN0cm9uZz5EZWZhdWx0Ojwvc3Ryb25nPiA8Y29kZT5Vc2VyRGlyIHB1YmxpY19odG1sPC9jb2RlPjxicj4KLTxTdHJvbmc+Q29udGV4dDo8L3N0cm9uZz4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PGJyPgotPHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IEJhc2U8YnI+Ci08c3Ryb25nPk1vZHVsZTo8L3N0cm9uZz4gbW9kX3VzZXJkaXI8cD4KLQotVGhlIFVzZXJEaXIgZGlyZWN0aXZlIHNldHMgdGhlIHJlYWwgZGlyZWN0b3J5IGluIGEgdXNlcidzIGhvbWUgZGlyZWN0b3J5Ci10byB1c2Ugd2hlbiBhIHJlcXVlc3QgZm9yIGEgZG9jdW1lbnQgZm9yIGEgdXNlciBpcyByZWNlaXZlZC4KLTxlbT5EaXJlY3Rvcnk8L2VtPiBpcyBlaXRoZXIgPGNvZGU+ZGlzYWJsZWQ8L2NvZGU+LCB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZSwKLSBvciB0aGUgbmFtZSBvZiBhIGRpcmVjdG9yeSwgZm9sbG93aW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nCi1wYXR0ZXJucy4gSWYgbm90IGRpc2FibGVkLCB0aGVuIGEgcmVxdWVzdCBmb3IKLTxjb2RlPmh0dHA6Ly93d3cuZm9vLmNvbS9+YmFyL29uZS90d28uaHRtbDwvY29kZT4gd2lsbCBiZSB0cmFuc2xhdGVkIHRvOgotPHByZT4KLVVzZXJEaXIgcHVibGljX2h0bWwgICAgIC0+IH5iYXIvcHVibGljX2h0bWwvb25lL3R3by5odG1sCi1Vc2VyRGlyIC91c3Ivd2ViICAgICAgICAtPiAvdXNyL3dlYi9iYXIvb25lL3R3by5odG1sCi1Vc2VyRGlyIC9ob21lLyovd3d3ICAgICAtPiAvaG9tZS9iYXIvd3d3L29uZS90d28uaHRtbAotPC9wcmU+Ci1UaGUgZm9sbG93aW5nIGRpcmVjdGl2ZXMgd2lsbCBzZW5kIHJlZGlyZWN0cyB0byB0aGUgY2xpZW50OgotPHByZT4KLVVzZXJEaXIgaHR0cDovL3d3dy54LmNvbS91c2VycyAgIC0+IGh0dHAvL3d3dy54LmNvbS91c2Vycy9iYXIvb25lL3R3by5odG1sCi1Vc2VyRGlyIGh0dHA6Ly93d3cueC5jb20vKi95ICAgICAtPiBodHRwOi8vd3d3LnguY29tL3kvb25lL3R3by5odG1sCi08L3ByZT4KLTwhLS0laHlwZXJ0ZXh0IC0tPgotPGhyPgotPEEgSFJFRj0iLi4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2FwYWNoZV9ob21lLmdpZiIgQUxUPSJIb21lIj48L0E+Ci08QSBIUkVGPSIuLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfaW5kZXguZ2lmIiBBTFQ9IkluZGV4Ij48L0E+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KLTwhLS0vJWh5cGVydGV4dCAtLT4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfdXNlcmRpci54bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX3VzZXJkaXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NTc3N2E3Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfdXNlcmRpci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveHNsIiBocmVmPSIuLi9zdHlsZS9tYW51YWwueHNsIj8+Ci08bW9kdWxlc3lub3BzaXM+Ci0KLTxuYW1lPm1vZF91c2VyZGlyPC9uYW1lPgotPHN0YXR1cz5CYXNlPC9zdGF0dXM+Ci08ZGVzY3JpcHRpb24+VGhpcyBtb2R1bGUgcHJvdmlkZXMgZm9yIHVzZXItc3BlY2lmaWMKLWRpcmVjdG9yaWVzLjwvZGVzY3JpcHRpb24+Ci08aWRlbnRpZmllcj51c2VyZGlyX21vZHVsZTwvaWRlbnRpZmllcj4KLTxzb3VyY2VmaWxlPm1vZF91c2VyZGlyLmM8L3NvdXJjZWZpbGU+Ci0KLTxzdW1tYXJ5PgotPC9zdW1tYXJ5PgotCi0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLQotPG5hbWU+VXNlckRpcjwvbmFtZT4KLTxkZXNjcmlwdGlvbj5TZXRzIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB0byBzZXJ2ZSBmaWxlcyB3aGVuIHJlcXVlc3RzCi1mb3IgYSBwYXJ0aWN1bGFyIHVzZXIgYXJlIHJlY2VpdmVkLCBkZW5vdGVkIGJ5IHJlcXVlc3RzIGNvbnRhaW5pbmcKLTxlbT5+dXNlcm5hbWU8L2VtPiwgc3VjaCBhcyAKLTxlbT5odHRwOi8vc2VydmVyLmV4YW1wbGUuY29tL35ib2IvPC9lbT48L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5Vc2VyRGlyIDxlbT5kaXJlY3RvcnktZmlsZW5hbWU8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+VXNlckRpciA8ZW0+cHVibGljX2h0bWw8L2VtPjwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PiA8Y29udGV4dD52aXJ0dWFsCi1ob3N0PC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci08Y29tcGF0aWJpbGl0eT5BbGwgZm9ybXMgZXhjZXB0IHRoZSA8Y29kZT5Vc2VyRGlyIHB1YmxpY19odG1sPC9jb2RlPgotZm9ybSBhcmUgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDEuMSBvciBhYm92ZS4gVXNlIG9mIHRoZSAKLTxjb2RlPmVuYWJsZWQ8L2NvZGU+IGtleXdvcmQsIG9yIDxjb2RlPmRpc2FibGVkPC9jb2RlPiB3aXRoIGEKLWxpc3Qgb2YgdXNlcm5hbWVzLCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUgMS4zIGFuZAotYWJvdmUuPC9jb21wYXRpYmlsaXR5PgotCi08dXNhZ2U+Ci0KLSAgICA8cD5UaGUgVXNlckRpciBkaXJlY3RpdmUgc2V0cyB0aGUgcmVhbCBkaXJlY3RvcnkgaW4gYSB1c2VyJ3MKLSAgICBob21lIGRpcmVjdG9yeSB0byB1c2Ugd2hlbiBhIHJlcXVlc3QgZm9yIGEgZG9jdW1lbnQgZm9yIGEgdXNlcgotICAgIGlzIHJlY2VpdmVkLiA8ZW0+RGlyZWN0b3J5LWZpbGVuYW1lPC9lbT4gaXMgb25lIG9mIHRoZQotICAgIGZvbGxvd2luZzo8L3A+Ci0KLSAgICA8dWw+Ci0gICAgICA8bGk+VGhlIG5hbWUgb2YgYSBkaXJlY3Rvcnkgb3IgYSBwYXR0ZXJuIHN1Y2ggYXMgdGhvc2Ugc2hvd24KLSAgICAgIGJlbG93LjwvbGk+Ci0KLSAgICAgIDxsaT5UaGUga2V5d29yZCA8Y29kZT5kaXNhYmxlZDwvY29kZT4uIFRoaXMgdHVybnMgb2ZmCi0gICAgICA8ZW0+YWxsPC9lbT4gdXNlcm5hbWUtdG8tZGlyZWN0b3J5IHRyYW5zbGF0aW9ucyBleGNlcHQgdGhvc2UKLSAgICAgIGV4cGxpY2l0bHkgbmFtZWQgd2l0aCB0aGUgPGNvZGU+ZW5hYmxlZDwvY29kZT4ga2V5d29yZCAoc2VlCi0gICAgICBiZWxvdykuPC9saT4KLQotICAgICAgPGxpPlRoZSBrZXl3b3JkIDxjb2RlPmRpc2FibGVkPC9jb2RlPiBmb2xsb3dlZCBieSBhCi0gICAgICBzcGFjZS1kZWxpbWl0ZWQgbGlzdCBvZiB1c2VybmFtZXMuIFVzZXJuYW1lcyB0aGF0IGFwcGVhciBpbgotICAgICAgc3VjaCBhIGxpc3Qgd2lsbCA8ZW0+bmV2ZXI8L2VtPiBoYXZlIGRpcmVjdG9yeSB0cmFuc2xhdGlvbgotICAgICAgcGVyZm9ybWVkLCBldmVuIGlmIHRoZXkgYXBwZWFyIGluIGFuIDxjb2RlPmVuYWJsZWQ8L2NvZGU+Ci0gICAgICBjbGF1c2UuPC9saT4KLQotICAgICAgPGxpPlRoZSBrZXl3b3JkIDxjb2RlPmVuYWJsZWQ8L2NvZGU+IGZvbGxvd2VkIGJ5IGEKLSAgICAgIHNwYWNlLWRlbGltaXRlZCBsaXN0IG9mIHVzZXJuYW1lcy4gVGhlc2UgdXNlcm5hbWVzIHdpbGwgaGF2ZQotICAgICAgZGlyZWN0b3J5IHRyYW5zbGF0aW9uIHBlcmZvcm1lZCBldmVuIGlmIGEgZ2xvYmFsIGRpc2FibGUgaXMKLSAgICAgIGluIGVmZmVjdCwgYnV0IG5vdCBpZiB0aGV5IGFsc28gYXBwZWFyIGluIGEKLSAgICAgIDxjb2RlPmRpc2FibGVkPC9jb2RlPiBjbGF1c2UuPC9saT4KLSAgICA8L3VsPgotCi0gICAgPHA+SWYgbmVpdGhlciB0aGUgPGNvZGU+ZW5hYmxlZDwvY29kZT4gbm9yIHRoZQotICAgIDxjb2RlPmRpc2FibGVkPC9jb2RlPiBrZXl3b3JkcyBhcHBlYXIgaW4gdGhlCi0gICAgPGNvZGU+VXNlcmRpcjwvY29kZT4gZGlyZWN0aXZlLCB0aGUgYXJndW1lbnQgaXMgdHJlYXRlZCBhcyBhCi0gICAgZmlsZW5hbWUgcGF0dGVybiwgYW5kIGlzIHVzZWQgdG8gdHVybiB0aGUgbmFtZSBpbnRvIGEgZGlyZWN0b3J5Ci0gICAgc3BlY2lmaWNhdGlvbi4gQSByZXF1ZXN0IGZvcgotICAgIDxjb2RlPmh0dHA6Ly93d3cuZm9vLmNvbS9+Ym9iL29uZS90d28uaHRtbDwvY29kZT4gd2lsbCBiZQotICAgIHRyYW5zbGF0ZWQgdG86PC9wPgotCi08dGFibGU+Ci08dHI+PHRoPlVzZXJEaXIgZGlyZWN0aXZlIHVzZWQ8L3RoPgotPHRoPlRyYW5zbGF0ZWQgcGF0aDwvdGg+PC90cj4KLTx0cj48dGQ+VXNlckRpciBwdWJsaWNfaHRtbDwvdGQ+PHRkPn5ib2IvcHVibGljX2h0bWwvb25lL3R3by5odG1sPC90ZD48L3RyPgotPHRyPjx0ZD5Vc2VyRGlyIC91c3Ivd2ViPC90ZD48dGQ+L3Vzci93ZWIvYm9iL29uZS90d28uaHRtbDwvdGQ+PC90cj4KLTx0cj48dGQ+VXNlckRpciAvaG9tZS8qL3d3dzwvdGQ+PHRkPi9ob21lL2JvYi93d3cvb25lL3R3by5odG1sPC90ZD48L3RyPgotPC90YWJsZT4KLQotICAgIDxwPlRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlcyB3aWxsIHNlbmQgcmVkaXJlY3RzIHRvIHRoZSBjbGllbnQ6PC9wPiAKLQotPHRhYmxlPgotPHRyPjx0aD5Vc2VyRGlyIGRpcmVjdGl2ZSB1c2VkPC90aD4KLTx0aD5UcmFuc2xhdGVkIHBhdGg8L3RoPjwvdHI+Ci08dHI+PHRkPlVzZXJEaXIgaHR0cDovL3d3dy5mb28uY29tL3VzZXJzPC90ZD48dGQ+aHR0cDovL3d3dy5mb28uY29tL3VzZXJzL2JvYi9vbmUvdHdvLmh0bWw8L3RkPjwvdHI+Ci08dHI+PHRkPlVzZXJEaXIKLWh0dHA6Ly93d3cuZm9vLmNvbS8qL3VzcjwvdGQ+PHRkPmh0dHA6Ly93d3cuZm9vLmNvbS9ib2IvdXNyL29uZS90d28uaHRtbDwvdGQ+PC90cj4KLTx0cj48dGQ+VXNlckRpcgotaHR0cDovL3d3dy5mb28uY29tL34qLzwvdGQ+PHRkPmh0dHA6Ly93d3cuZm9vLmNvbS9+Ym9iL29uZS90d28uaHRtbDwvdGQ+PC90cj4KLTwvdGFibGU+IAotCi0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8c3Ryb25nPkJlIGNhcmVmdWwgd2hlbiB1c2luZyB0aGlzIGRpcmVjdGl2ZTsgZm9yIGluc3RhbmNlLAotICAgICAgPGNvZGU+IlVzZXJEaXIgLi8iPC9jb2RlPiB3b3VsZCBtYXAKLSAgICAgIDxjb2RlPiIvfnJvb3QiPC9jb2RlPiB0byA8Y29kZT4iLyI8L2NvZGU+IC0gd2hpY2ggaXMgcHJvYmFibHkKLSAgICAgIHVuZGVzaXJhYmxlLiBJZiB5b3UgYXJlIHJ1bm5pbmcgQXBhY2hlIDEuMyBvciBhYm92ZSwgaXQgaXMKLSAgICAgIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRoYXQgeW91ciBjb25maWd1cmF0aW9uIGluY2x1ZGUgYQotICAgICAgIjxjb2RlPlVzZXJEaXIgZGlzYWJsZWQgcm9vdDwvY29kZT4iIGRlY2xhcmF0aW9uLgotICAgICAgU2VlIGFsc28gdGhlIDxkaXJlY3RpdmUgbW9kdWxlPSJjb3JlIj5EaXJlY3Rvcnk8L2RpcmVjdGl2ZT4KLSAgICAgIGRpcmVjdGl2ZSBhbmQgdGhlIDxhIGhyZWY9Ii4uL21pc2Mvc2VjdXJpdHlfdGlwcy5odG1sIj5TZWN1cml0eQotICAgICAgVGlwczwvYT4gcGFnZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3N0cm9uZz4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0KLTwvdXNhZ2U+Ci0KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci08L21vZHVsZXN5bm9wc2lzPgotCi0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfdXNlcnRyYWNrLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX3VzZXJ0cmFjay5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzI3MDIwLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfdXNlcnRyYWNrLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08IS0tJWh5cGVydGV4dCAtLT4KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgMi4wLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFwYWNoZSBtb2R1bGUgbW9kX3VzZXJ0cmFjazwvVElUTEU+Ci08L0hFQUQ+Ci0KLTxCT0RZPgotPElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfc3ViLmdpZiIgQUxUPSIiPgotPCEtLS8laHlwZXJ0ZXh0IC0tPgotPEgxPk1vZHVsZSBtb2RfdXNlcnRyYWNrPC9oMT4KLQotVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5tb2RfdXNlcnRyYWNrLmM8L2NvZGU+IGZpbGUsIGFuZAotaXMgbm90IGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuIEl0IHByb3ZpZGVzIGZvciB1c2VyIHRyYWNraW5nIHVzaW5nIGNvb2tpZXMuCi1UaGVyZSBpcyBubyBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBmb3IgdGhpcyBtb2R1bGUuICBNYXJrIGlzIHdyaXRpbmcgdGhpcy4KLQotPCEtLSVoeXBlcnRleHQgLS0+Ci08bWVudT4KLTxsaT48QSBIUkVGPSIjY29va2llbG9nIj5Db29raWVMb2c8L0E+Ci08L21lbnU+Ci08aHI+Ci08IS0tLyVoeXBlcnRleHQgLS0+Ci0KLTxBIG5hbWU9ImNvb2tpZWxvZyI+PGgyPkNvb2tpZUxvZzwvaDI+PC9BPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IENvb2tpZUxvZ30gZGlyZWN0aXZlJmd0OyAtLT4KLTxzdHJvbmc+U3ludGF4Ojwvc3Ryb25nPiBDb29raWVMb2cgPGVtPmZpbGVuYW1lPC9lbT48YnI+Ci08U3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxicj4KLTxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiBFeHBlcmltZW50YWw8YnI+Ci08c3Ryb25nPk1vZHVsZTo8L3N0cm9uZz4gbW9kX2Nvb2tpZXM8cD4KLQotVGhlIENvb2tpZUxvZyBkaXJlY3RpdmUgc2V0cyB0aGUgZmlsZW5hbWUgZm9yIGxvZ2dpbmcgb2YgY29va2llcy4KLVRoZSBmaWxlbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgPEEgSFJFRj0iY29yZS5odG1sI3NlcnZlcnJvb3QiPlNlcnZlclJvb3Q8L0E+LgotPHA+Ci08IS0tJWh5cGVydGV4dCAtLT4KLTxocj4KLTxBIEhSRUY9Ii4uLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9hcGFjaGVfaG9tZS5naWYiIEFMVD0iSG9tZSI+PC9BPgotPEEgSFJFRj0iLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvYXBhY2hlX2luZGV4LmdpZiIgQUxUPSJJbmRleCI+PC9BPgotCi08L0JPRFk+Ci08L0hUTUw+Ci08IS0tLyVoeXBlcnRleHQgLS0+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX3VzZXJ0cmFjay54bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX3VzZXJ0cmFjay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiNmMwZTkuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF91c2VydHJhY2sueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIG1vZHVsZXN5bm9wc2lzIFNZU1RFTSAiLi4vc3R5bGUvbW9kdWxlc3lub3BzaXMuZHRkIj4KLTw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9Ii4uL3N0eWxlL21hbnVhbC54c2wiPz4KLQotPG1vZHVsZXN5bm9wc2lzPgotPG5hbWU+bW9kX3VzZXJ0cmFjazwvbmFtZT4gCi08ZGVzY3JpcHRpb24+Ci0gICAgVGhpcyBtb2R1bGUgdXNlcyBjb29raWVzIHRvIHByb3ZpZGUgZm9yIGEKLSAgICA8ZW0+Y2xpY2tzdHJlYW08L2VtPiBsb2cgb2YgdXNlciBhY3Rpdml0eSBvbiBhIHNpdGUuCi08L2Rlc2NyaXB0aW9uPgotPHN0YXR1cz5FeHRlbnNpb248L3N0YXR1cz4KLTxzb3VyY2VmaWxlPm1vZF91c2VydHJhY2suYzwvc291cmNlZmlsZT4KLTxpZGVudGlmaWVyPnVzZXJ0cmFja19tb2R1bGU8L2lkZW50aWZpZXI+Ci08Y29tcGF0aWJpbGl0eT5Lbm93biBhcyBtb2RfY29va2llcyBwcmlvciB0byBBcGFjaGUgMS4zLjwvY29tcGF0aWJpbGl0eT4KLQotPHN1bW1hcnk+Ci0KLSAgICA8aDI+U3VtbWFyeTwvaDI+Ci0KLSAgICA8cD5QcmV2aW91cyByZWxlYXNlcyBvZiBBcGFjaGUgaGF2ZSBpbmNsdWRlZCBhIG1vZHVsZSB3aGljaAotICAgIGdlbmVyYXRlcyBhICdjbGlja3N0cmVhbScgbG9nIG9mIHVzZXIgYWN0aXZpdHkgb24gYSBzaXRlIHVzaW5nCi0gICAgY29va2llcy4gVGhpcyB3YXMgY2FsbGVkIHRoZSAiY29va2llcyIgbW9kdWxlLCBtb2RfY29va2llcy4gSW4KLSAgICBBcGFjaGUgMS4yIGFuZCBsYXRlciB0aGlzIG1vZHVsZSBoYXMgYmVlbiByZW5hbWVkIHRoZSAidXNlcgotICAgIHRyYWNraW5nIiBtb2R1bGUsIG1vZF91c2VydHJhY2suIFRoaXMgbW9kdWxlIGhhcyBiZWVuCi0gICAgc2ltcGxpZmllZCBhbmQgbmV3IGRpcmVjdGl2ZXMgYWRkZWQuPC9wPgotPC9zdW1tYXJ5PgotCi0KLTxzZWN0aW9uPgotPHRpdGxlPkxvZ2dpbmc8L3RpdGxlPgotCi0gICAgPHA+UHJldmlvdXNseSwgdGhlIGNvb2tpZXMgbW9kdWxlIChub3cgdGhlIHVzZXIgdHJhY2tpbmcKLSAgICBtb2R1bGUpIGRpZCBpdHMgb3duIGxvZ2dpbmcsIHVzaW5nIHRoZSA8dHQ+Q29va2llTG9nPC90dD4KLSAgICBkaXJlY3RpdmUuIEluIHRoaXMgcmVsZWFzZSwgdGhpcyBtb2R1bGUgZG9lcyBubyBsb2dnaW5nIGF0IGFsbC4KLSAgICBJbnN0ZWFkLCBhIGNvbmZpZ3VyYWJsZSBsb2cgZm9ybWF0IGZpbGUgc2hvdWxkIGJlIHVzZWQgdG8gbG9nCi0gICAgdXNlciBjbGljay1zdHJlYW1zLiBUaGlzIGlzIHBvc3NpYmxlIGJlY2F1c2UgdGhlIGxvZ2dpbmcgbW9kdWxlCi0gICAgbm93IGFsbG93cyBtdWx0aXBsZSBsb2cgZmlsZXMuIFRoZSBjb29raWUgaXRzZWxmIGlzIGxvZ2dlZCBieQotICAgIHVzaW5nIHRoZSB0ZXh0IDx0dD4le2Nvb2tpZX1uPC90dD4gaW4gdGhlIGxvZyBmaWxlIGZvcm1hdC4gRm9yCi0gICAgZXhhbXBsZTo8L3A+Ci08ZXhhbXBsZT4KLUN1c3RvbUxvZyBsb2dzL2NsaWNrc3RyZWFtICIle2Nvb2tpZX1uICVyICV0IgotPC9leGFtcGxlPgotCi0gICAgPHA+Rm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgdGhlIGNvbmZpZ3VyYWJsZSBsb2cgbW9kdWxlCi0gICAgaW1wbGVtZW50cyB0aGUgb2xkIDx0dD5Db29raWVMb2c8L3R0PiBkaXJlY3RpdmUsIGJ1dCB0aGlzCi0gICAgc2hvdWxkIGJlIHVwZ3JhZGVkIHRvIHRoZSBhYm92ZSA8dHQ+Q3VzdG9tTG9nPC90dD4gZGlyZWN0aXZlLiA8L3A+Ci08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uPgotPHRpdGxlPjItZGlnaXQgb3IgNC1kaWdpdCBkYXRlcyBmb3IgY29va2llcz88L3RpdGxlPgotCi0gICAgPHA+KHRoZSBmb2xsb3dpbmcgaXMgZnJvbSBtZXNzYWdlCi0gICAgJmx0OzAyMjcwMWJkYTQzZCQ5ZDMyYmJiMCQxMjAxYThjMEBjaHJpc3RpYW4ub2ZmaWNlLnNhbmUuY29tJmd0OwotICAgIGluIHRoZSBuZXctaHR0cGQgYXJjaGl2ZXMpIAotPHByZT4KLUZyb206ICJDaHJpc3RpYW4gQWxsZW4iICZsdDtjaHJpc3RpYW5Ac2FuZS5jb20mZ3Q7Ci1TdWJqZWN0OiBSZTogQXBhY2hlIFkySyBidWcgaW4gbW9kX3VzZXJ0cmFjay5jCi1EYXRlOiBUdWUsIDMwIEp1biAxOTk4IDExOjQxOjU2IC0wNDAwCi0KLURpZCBzb21lIHdvcmsgd2l0aCBjb29raWVzIGFuZCBkdWcgdXAgc29tZSBpbmZvIHRoYXQgbWlnaHQgYmUgdXNlZnVsLgotCi1UcnVlLCBOZXRzY2FwZSBjbGFpbXMgdGhhdCB0aGUgY29ycmVjdCBmb3JtYXQgTk9XIGlzIGZvdXIgZGlnaXQgZGF0ZXMsIGFuZAotZm91ciBkaWdpdCBkYXRlcyBkbyBpbiBmYWN0IHdvcmsuLi4gZm9yIE5ldHNjYXBlIDQueCAoQ29tbXVuaWNhdG9yKSwgdGhhdAotaXMuICBIb3dldmVyLCAzLnggYW5kIGJlbG93IGRvIE5PVCBhY2NlcHQgdGhlbS4gIEl0IHNlZW1zIHRoYXQgTmV0c2NhcGUKLW9yaWdpbmFsbHkgaGFkIGEgMi1kaWdpdCBzdGFuZGFyZCwgYW5kIHRoZW4gd2l0aCBhbGwgb2YgdGhlIFkySyBoeXBlIGFuZAotcHJvYmFibHkgYSBmZXcgY29tcGxhaW50cywgY2hhbmdlZCB0byBhIGZvdXIgZGlnaXQgZGF0ZSBmb3IgQ29tbXVuaWNhdG9yLgotRm9ydHVuYXRlbHksIDQueCBhbHNvIHVuZGVyc3RhbmRzIHRoZSAyLWRpZ2l0IGZvcm1hdCwgYW5kIHNvIHRoZSBiZXN0IHdheSB0bwotZW5zdXJlIHRoYXQgeW91ciBleHBpcmF0aW9uIGRhdGUgaXMgbGVnaWJsZSB0byB0aGUgY2xpZW50J3MgYnJvd3NlciBpcyB0bwotdXNlIDItZGlnaXQgZGF0ZXMuCi0KLUhvd2V2ZXIsIHRoaXMgZG9lcyBub3QgbGltaXQgZXhwaXJhdGlvbiBkYXRlcyB0byB0aGUgeWVhciAyMDAwOyBpZiB5b3UgdXNlCi1hbiBleHBpcmF0aW9uIHllYXIgb2YgIjEzIiwgZm9yIGV4YW1wbGUsIGl0IGlzIGludGVycHJldGVkIGFzIDIwMTMsIE5PVAotMTkxMyEgIEluIGZhY3QsIHlvdSBjYW4gdXNlIGFuIGV4cGlyYXRpb24geWVhciBvZiB1cCB0byAiMzciLCBhbmQgaXQgd2lsbCBiZQotdW5kZXJzdG9vZCBhcyAiMjAzNyIgYnkgYm90aCBNU0lFIGFuZCBOZXRzY2FwZSB2ZXJzaW9ucyAzLnggYW5kIHVwIChub3Qgc3VyZQotYWJvdXQgdmVyc2lvbnMgcHJldmlvdXMgdG8gdGhvc2UpLiAgTm90IHN1cmUgd2h5IE5ldHNjYXBlIHVzZWQgdGhhdAotcGFydGljdWxhciB5ZWFyIGFzIGl0cyBjdXQtb2ZmIHBvaW50LCBidXQgbXkgZ3Vlc3MgaXMgdGhhdCBpdCB3YXMgaW4gcmVzcGVjdAotdG8gVU5JWCdzIDIwMzggcHJvYmxlbS4gIE5ldHNjYXBlL01TSUUgNC54IHNlZW0gdG8gYmUgYWJsZSB0byB1bmRlcnN0YW5kCi0yLWRpZ2l0IHllYXJzIGJleW9uZCB0aGF0LCBhdCBsZWFzdCB1bnRpbCAiNTAiIGZvciBzdXJlIChJIHRoaW5rIHRoZXkKLXVuZGVyc3RhbmQgdXAgdW50aWwgYWJvdXQgIjcwIiwgYnV0IG5vdCBmb3Igc3VyZSkuCi0KLVN1bW1hcnk6ICBNb3ppbGxhIDMueCBhbmQgdXAgdW5kZXJzdGFuZHMgdHdvIGRpZ2l0IGRhdGVzIHVwIHVudGlsICIzNyIKLSgyMDM3KS4gIE1vemlsbGEgNC54IHVuZGVyc3RhbmRzIHVwIHVudGlsIGF0IGxlYXN0ICI1MCIgKDIwNTApIGluIDItZGlnaXQKLWZvcm0sIGJ1dCBhbHNvIHVuZGVyc3RhbmRzIDQtZGlnaXQgeWVhcnMsIHdoaWNoIGNhbiBwcm9iYWJseSByZWFjaCB1cCB1bnRpbAotOTk5OS4gIFlvdXIgYmVzdCBiZXQgZm9yIHNlbmRpbmcgYSBsb25nLWxpZmUgY29va2llIGlzIHRvIHNlbmQgaXQgZm9yIHNvbWUKLXRpbWUgbGF0ZSBpbiB0aGUgeWVhciAiMzciLgotPC9wcmU+Ci08L3A+Ci08L3NlY3Rpb24+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkNvb2tpZURvbWFpbjwvbmFtZT4KLTxzeW50YXg+Q29va2llRG9tYWluIDxpPmRvbWFpbjwvaT48L3N5bnRheD4KLTxkZWZhdWx0Pk5vbmU8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+Ci08Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PgotPGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPGNvbnRleHQ+ZGlyZWN0b3J5PC9jb250ZXh0PgotPGNvbnRleHQ+Lmh0YWNjZXNzPC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLTxkZXNjcmlwdGlvbj5jb250cm9scyB0aGUgc2V0dGluZyBvZiB0aGUgZG9tYWluIHRvIHdoaWNoCi0gICAgdGhlIHRyYWNraW5nIGNvb2tpZSBhcHBsaWVzLjwvZGVzY3JpcHRpb24+Ci0KLTx1c2FnZT4KLQotICAgIDxwPlRoaXMgZGlyZWN0aXZlIGNvbnRyb2xzIHRoZSBzZXR0aW5nIG9mIHRoZSBkb21haW4gdG8gd2hpY2gKLSAgICB0aGUgdHJhY2tpbmcgY29va2llIGFwcGxpZXMuIElmIG5vdCBwcmVzZW50LCBubyBkb21haW4gaXMKLSAgICBpbmNsdWRlZCBpbiB0aGUgY29va2llIGhlYWRlciBmaWVsZC48L3A+Ci0KLSAgICA8cD5UaGUgZG9tYWluIHN0cmluZyA8Yj5tdXN0PC9iPiBiZWdpbiB3aXRoIGEgZG90LCBhbmQKLSAgICA8Yj5tdXN0PC9iPiBpbmNsdWRlIGF0IGxlYXN0IG9uZSBlbWJlZGRlZCBkb3QuIFRoYXQgaXMsCi0gICAgIi5mb28uY29tIiBpcyBsZWdhbCwgYnV0ICJmb28uYmFyLmNvbSIgYW5kICIuY29tIiBhcmUgbm90LjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkNvb2tpZUV4cGlyZXM8L25hbWU+Ci08c3ludGF4PkNvb2tpZUV4cGlyZXMgPGVtPmV4cGlyeS1wZXJpb2Q8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+PC9kZWZhdWx0PgotPGNvbnRleHRsaXN0PgotPGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD4KLTxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+PC9vdmVycmlkZT4KLTxjb21wYXRpYmlsaXR5PkluIDEuMy4yMCBhbmQgZWFybGllciwgbm90IHVzYWJsZSBpbiBkaXJlY3RvcnkgYW5kCi0uaHRhY2Nlc3M8L2NvbXBhdGliaWxpdHk+Ci0KLTx1c2FnZT4KLSAgICA8cD5XaGVuIHVzZWQsIHRoaXMgZGlyZWN0aXZlIHNldHMgYW4gZXhwaXJ5IHRpbWUgb24gdGhlIGNvb2tpZQotICAgIGdlbmVyYXRlZCBieSB0aGUgdXNlcnRyYWNrIG1vZHVsZS4gVGhlIDxlbT5leHBpcnktcGVyaW9kPC9lbT4KLSAgICBjYW4gYmUgZ2l2ZW4gZWl0aGVyIGFzIGEgbnVtYmVyIG9mIHNlY29uZHMsIG9yIGluIHRoZSBmb3JtYXQKLSAgICBzdWNoIGFzICIyIHdlZWtzIDMgZGF5cyA3IGhvdXJzIi4gVmFsaWQgZGVub21pbmF0aW9ucyBhcmU6Ci0gICAgeWVhcnMsIG1vbnRocywgd2Vla3MsIGhvdXJzLCBtaW51dGVzIGFuZCBzZWNvbmRzLiBJZiB0aGUgZXhwaXJ5Ci0gICAgdGltZSBpcyBpbiBhbnkgZm9ybWF0IG90aGVyIHRoYW4gb25lIG51bWJlciBpbmRpY2F0aW5nIHRoZQotICAgIG51bWJlciBvZiBzZWNvbmRzLCBpdCBtdXN0IGJlIGVuY2xvc2VkIGJ5IGRvdWJsZSBxdW90ZXMuPC9wPgotCi0gICAgPHA+SWYgdGhpcyBkaXJlY3RpdmUgaXMgbm90IHVzZWQsIGNvb2tpZXMgbGFzdCBvbmx5IGZvciB0aGUKLSAgICBjdXJyZW50IGJyb3dzZXIgc2Vzc2lvbi48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+Q29va2llTmFtZTwvbmFtZT4KLTxzeW50YXg+Q29va2llTmFtZSA8ZW0+dG9rZW48L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+QXBhY2hlPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0PgotPGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD4KLTxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGlzIGRpcmVjdGl2ZSBhbGxvd3MgeW91IHRvIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgY29va2llCi0gICAgdGhpcyBtb2R1bGUgdXNlcyBmb3IgaXRzIHRyYWNraW5nIHB1cnBvc2VzLiBCeSBkZWZhdWx0IHRoZQotICAgIGNvb2tpZSBpcyBuYW1lZCAiPGNvZGU+QXBhY2hlPC9jb2RlPiIuPC9wPgotCi0gICAgPHA+WW91IG11c3Qgc3BlY2lmeSBhIHZhbGlkIGNvb2tpZSBuYW1lOyByZXN1bHRzIGFyZQotICAgIHVucHJlZGljdGFibGUgaWYgeW91IHVzZSBhIG5hbWUgY29udGFpbmluZyB1bnVzdWFsIGNoYXJhY3RlcnMuCi0gICAgVmFsaWQgY2hhcmFjdGVycyBpbmNsdWRlIEEtWiwgYS16LCAwLTksICJfIiwgYW5kICItIi48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+Q29va2llU3R5bGU8L25hbWU+Ci08c3ludGF4PkNvb2tpZVN0eWxlCi0gICAgPGk+TmV0c2NhcGV8Q29va2llfENvb2tpZTJ8UkZDMjEwOXxSRkMyOTY1PC9pPjwvc3ludGF4PgotPGRlZmF1bHQ+PC9kZWZhdWx0PgotPGNvbnRleHRsaXN0PgotPGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD4KLTxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08ZGVzY3JpcHRpb24+Q29udHJvbHMgdGhlIGZvcm1hdCBvZiB0aGUgY29va2llIGhlYWRlcgotICAgIGZpZWxkPC9kZXNjcmlwdGlvbj4KLQotPHVzYWdlPgotICAgIDxwPlRoaXMgZGlyZWN0aXZlIGNvbnRyb2xzIHRoZSBmb3JtYXQgb2YgdGhlIGNvb2tpZSBoZWFkZXIKLSAgICBmaWVsZC4gVGhlIHRocmVlIGZvcm1hdHMgYWxsb3dlZCBhcmU6PC9wPgotCi0gICAgPHVsPgotICAgICAgPGxpPjxiPk5ldHNjYXBlPC9iPiwgd2hpY2ggaXMgdGhlIG9yaWdpbmFsIGJ1dCBub3cgZGVwcmVjYXRlZAotICAgICAgc3ludGF4LiBUaGlzIGlzIHRoZSBkZWZhdWx0LCBhbmQgdGhlIHN5bnRheCBBcGFjaGUgaGFzCi0gICAgICBoaXN0b3JpY2FsbHkgdXNlZC48L2xpPgotCi0gICAgICA8bGk+PGI+Q29va2llPC9iPiBvciA8Yj5SRkMyMTA5PC9iPiwgd2hpY2ggaXMgdGhlIHN5bnRheCB0aGF0Ci0gICAgICBzdXBlcnNlZGVkIHRoZSBOZXRzY2FwZSBzeW50YXguPC9saT4KLQotICAgICAgPGxpPjxiPkNvb2tpZTI8L2I+IG9yIDxiPlJGQzI5NjU8L2I+LCB3aGljaCBpcyB0aGUgbW9zdAotICAgICAgY3VycmVudCBjb29raWUgc3ludGF4LjwvbGk+Ci0gICAgPC91bD4KLQotICAgIDxwPk5vdCBhbGwgY2xpZW50cyBjYW4gdW5kZXJzdGFuZCBhbGwgb2YgdGhlc2UgZm9ybWF0cy4gYnV0IHlvdQotICAgIHNob3VsZCB1c2UgdGhlIG5ld2VzdCBvbmUgdGhhdCBpcyBnZW5lcmFsbHkgYWNjZXB0YWJsZSB0byB5b3VyCi0gICAgdXNlcnMnIGJyb3dzZXJzLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi0KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+Q29va2llVHJhY2tpbmc8L25hbWU+Ci08c3ludGF4PkNvb2tpZVRyYWNraW5nIG9ufG9mZjwvc3ludGF4PgotPGRlZmF1bHQ+PC9kZWZhdWx0PgotPGNvbnRleHRsaXN0PgotPGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTxjb250ZXh0PmRpcmVjdG9yeTwvY29udGV4dD4KLTxjb250ZXh0Pi5odGFjY2VzczwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+RmlsZUluZm88L292ZXJyaWRlPgotCi08dXNhZ2U+Ci0gICAgPHA+V2hlbiB0aGUgdXNlciB0cmFjayBtb2R1bGUgaXMgY29tcGlsZWQgaW4sIGFuZAotICAgICJDb29raWVUcmFja2luZyBvbiIgaXMgc2V0LCBBcGFjaGUgd2lsbCBzdGFydCBzZW5kaW5nIGEKLSAgICB1c2VyLXRyYWNraW5nIGNvb2tpZSBmb3IgYWxsIG5ldyByZXF1ZXN0cy4gVGhpcyBkaXJlY3RpdmUgY2FuCi0gICAgYmUgdXNlZCB0byB0dXJuIHRoaXMgYmVoYXZpb3Igb24gb3Igb2ZmIG9uIGEgcGVyLXNlcnZlciBvcgotICAgIHBlci1kaXJlY3RvcnkgYmFzaXMuIEJ5IGRlZmF1bHQsIGNvbXBpbGluZyBtb2RfdXNlcnRyYWNrIHdpbGwKLSAgICBub3QgYWN0aXZhdGUgY29va2llcy4gPC9wPgotCi08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPC9tb2R1bGVzeW5vcHNpcz4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF92aG9zdF9hbGlhcy5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF92aG9zdF9hbGlhcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjg2YTA3Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2Rfdmhvc3RfYWxpYXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFwYWNoZSBtb2R1bGUgbW9kX3Zob3N0X2FsaWFzPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTxESVYgQUxJR049IkNFTlRFUiI+Ci0gPElNRyBTUkM9Ii4uL2ltYWdlcy9zdWIuZ2lmIiBBTFQ9IltBUEFDSEUgRE9DVU1FTlRBVElPTl0iPgotIDxIMz4KLSAgQXBhY2hlIEhUVFAgU2VydmVyIFZlcnNpb24gMS4zCi0gPC9IMz4KLTwvRElWPgotCi08SDEgQUxJR049IkNFTlRFUiI+TW9kdWxlIG1vZF92aG9zdF9hbGlhczwvSDE+Ci0KLTxQPgotVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Q09ERT5tb2Rfdmhvc3RfYWxpYXMuYzwvQ09ERT4gZmlsZQotYW5kIGlzIG5vdCBjb21waWxlZCBpbiBieSBkZWZhdWx0LiBJdCBzaG91bGQgYmUgbWVudGlvbmVkIG5lYXIgdGhlCi1zdGFydCBvZiB0aGUgPENPREU+Q29uZmlndXJhdGlvbjwvQ09ERT4gZmlsZSBzbyB0aGF0IGl0IGRvZXNuJ3QKLW92ZXJyaWRlIHRoZSBiZWhhdmlvdXIgb2Ygb3RoZXIgbW9kdWxlcyB0aGF0IGRvIGZpbGVuYW1lIHRyYW5zbGF0aW9uLAotZS5nLiA8QSBIUkVGPSJtb2RfdXNlcmRpci5odG1sIj48Q09ERT5tb2RfdXNlcmRpcjwvQ09ERT48L0E+IGFuZAotPEEgSFJFRj0ibW9kX2FsaWFzLmh0bWwiPjxDT0RFPm1vZF9hbGlhczwvQ09ERT48L0E+LiBJdCBwcm92aWRlcwotc3VwcG9ydCBmb3IgPEEgSFJFRj0iLi4vdmhvc3QvbWFzcy5odG1sIj5keW5hbWljYWxseSBjb25maWd1cmVkIG1hc3MKLXZpcnR1YWwgaG9zdGluZzwvQT4uCi08L1A+Ci0KLTxIMj5EaXJlY3RvcnkgTmFtZSBJbnRlcnBvbGF0aW9uPC9IMj4KLQotPFA+Ci1BbGwgdGhlIGRpcmVjdGl2ZXMgaW4gdGhpcyBtb2R1bGUgaW50ZXJwb2xhdGUgYSBzdHJpbmcgaW50byBhCi1wYXRobmFtZS4gVGhlIGludGVycG9sYXRlZCBzdHJpbmcgKGhlbmNlZm9ydGggY2FsbGVkIHRoZSAibmFtZSIpIG1heQotYmUgZWl0aGVyIHRoZSBzZXJ2ZXIgbmFtZSAoc2VlIHRoZQotPEEgSFJFRj0iY29yZS5odG1sI3VzZWNhbm9uaWNhbG5hbWUiPjxDT0RFPlVzZUNhbm9uaWNhbE5hbWU8L0NPREU+PC9BPgotZGlyZWN0aXZlIGZvciBkZXRhaWxzIG9uIGhvdyB0aGlzIGlzIGRldGVybWluZWQpIG9yIHRoZSBJUCBhZGRyZXNzIG9mCi10aGUgdmlydHVhbCBob3N0IG9uIHRoZSBzZXJ2ZXIgaW4gZG90dGVkLXF1YWQgZm9ybWF0LiBUaGUKLWludGVycG9sYXRpb24gaXMgY29udHJvbGxlZCBieSBzcGVjaWZpZXJzIGluc3BpcmVkIGJ5Ci08Q09ERT5wcmludGY8L0NPREU+IHdoaWNoIGhhdmUgYSBudW1iZXIgb2YgZm9ybWF0czoKLTxETD4KLSAgPERUPjxDT0RFPiUlPC9DT0RFPgotICAgIDxERD5pbnNlcnQgYSA8Q09ERT4lPC9DT0RFPgotICA8RFQ+PENPREU+JXA8L0NPREU+Ci0gICAgPEREPmluc2VydCB0aGUgcG9ydCBudW1iZXIgb2YgdGhlIHZpcnR1YWwgaG9zdAotICA8RFQ+PENPREU+JU4uTTwvQ09ERT4KLSAgICA8REQ+aW5zZXJ0IChwYXJ0IG9mKSB0aGUgbmFtZQotPC9ETD4KLTwvUD4KLQotPFA+Ci08Q09ERT5OPC9DT0RFPiBhbmQgPENPREU+TTwvQ09ERT4gYXJlIHVzZWQgdG8gc3BlY2lmeSBzdWJzdHJpbmdzIG9mCi10aGUgbmFtZS4gPENPREU+TjwvQ09ERT4gc2VsZWN0cyBmcm9tIHRoZSBkb3Qtc2VwYXJhdGVkIGNvbXBvbmVudHMgb2YKLXRoZSBuYW1lLCBhbmQgPENPREU+TTwvQ09ERT4gc2VsZWN0cyBjaGFyYWN0ZXJzIHdpdGhpbiB3aGF0ZXZlcgotPENPREU+TjwvQ09ERT4gaGFzIHNlbGVjdGVkLiA8Q09ERT5NPC9DT0RFPiBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMKLXRvIHplcm8gaWYgaXQgaXNuJ3QgcHJlc2VudDsgdGhlIGRvdCBtdXN0IGJlIHByZXNlbnQgaWYgYW5kIG9ubHkgaWYKLTxDT0RFPk08L0NPREU+IGlzIHByZXNlbnQuIFRoZSBpbnRlcnByZXRhdGlvbiBpcyBhcyBmb2xsb3dzOgotPERMPgotICA8RFQ+PENPREU+MDwvQ09ERT4KLSAgICA8REQ+dGhlIHdob2xlIG5hbWUKLSAgPERUPjxDT0RFPjE8L0NPREU+Ci0gICAgPEREPnRoZSBmaXJzdCBwYXJ0Ci0gIDxEVD48Q09ERT4yPC9DT0RFPgotICAgIDxERD50aGUgc2Vjb25kIHBhcnQKLSAgPERUPjxDT0RFPi0xPC9DT0RFPgotICAgIDxERD50aGUgbGFzdCBwYXJ0Ci0gIDxEVD48Q09ERT4tMjwvQ09ERT4KLSAgICA8REQ+dGhlIHBlbnVsdGltYXRlIHBhcnQKLSAgPERUPjxDT0RFPjIrPC9DT0RFPgotICAgIDxERD50aGUgc2Vjb25kIGFuZCBhbGwgc3Vic2VxdWVudCBwYXJ0cwotICA8RFQ+PENPREU+LTIrPC9DT0RFPgotICAgIDxERD50aGUgcGVudWx0aW1hdGUgYW5kIGFsbCBwcmVjZWRpbmcgcGFydHMKLSAgPERUPjxDT0RFPjErPC9DT0RFPiBhbmQgPENPREU+LTErPC9DT0RFPgotICAgIDxERD50aGUgc2FtZSBhcyA8Q09ERT4wPC9DT0RFPgotPC9ETD4KLUlmIDxDT0RFPk48L0NPREU+IG9yIDxDT0RFPk08L0NPREU+IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mCi1wYXJ0cyBhdmFpbGFibGUgYSBzaW5nbGUgdW5kZXJzY29yZSBpcyBpbnRlcnBvbGF0ZWQuCi08L1A+Ci0KLTxIMz5FeGFtcGxlczwvSDM+Ci0KLTxQPgotRm9yIHNpbXBsZSBuYW1lLWJhc2VkIHZpcnR1YWwgaG9zdHMgeW91IG1pZ2h0IHVzZSB0aGUgZm9sbG93aW5nCi1kaXJlY3RpdmVzIGluIHlvdXIgc2VydmVyIGNvbmZpZ3VyYXRpb24gZmlsZToKLTxQUkU+Ci0JVXNlQ2Fub25pY2FsTmFtZQlPZmYKLQlWaXJ0dWFsRG9jdW1lbnRSb290CS91c3IvbG9jYWwvYXBhY2hlL3Zob3N0cy8lMAotPC9QUkU+Ci1BIHJlcXVlc3QgZm9yIDxDT0RFPmh0dHA6Ly93d3cuZXhhbXBsZS5jb20vZGlyZWN0b3J5L2ZpbGUuaHRtbDwvQ09ERT4KLXdpbGwgYmUgc2F0aXNmaWVkIGJ5IHRoZSBmaWxlCi08Q09ERT4vdXNyL2xvY2FsL2FwYWNoZS92aG9zdHMvd3d3LmV4YW1wbGUuY29tL2RpcmVjdG9yeS9maWxlLmh0bWw8L0NPREU+LgotPC9QPgotCi08UD4KLUZvciBhIHZlcnkgbGFyZ2UgbnVtYmVyIG9mIHZpcnR1YWwgaG9zdHMgaXQgaXMgYSBnb29kIGlkZWEgdG8gYXJyYW5nZQotdGhlIGZpbGVzIHRvIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgPENPREU+dmhvc3RzPC9DT0RFPiBkaXJlY3RvcnkuIFRvCi1kbyB0aGlzIHlvdSBtaWdodCB1c2UgdGhlIGZvbGxvd2luZyBpbiB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZToKLTxQUkU+Ci0JVXNlQ2Fub25pY2FsTmFtZQlPZmYKLQlWaXJ0dWFsRG9jdW1lbnRSb290CS91c3IvbG9jYWwvYXBhY2hlL3Zob3N0cy8lMysvJTIuMS8lMi4yLyUyLjMvJTIKLTwvUFJFPgotQSByZXF1ZXN0IGZvciA8Q09ERT5odHRwOi8vd3d3LmV4YW1wbGUuaXNwLmNvbS9kaXJlY3RvcnkvZmlsZS5odG1sPC9DT0RFPgotd2lsbCBiZSBzYXRpc2ZpZWQgYnkgdGhlIGZpbGUKLTxDT0RFPi91c3IvbG9jYWwvYXBhY2hlL2lzcC5jb20vZS94L2EvZXhhbXBsZS9kaXJlY3RvcnkvZmlsZS5odG1sPC9DT0RFPi4KLUEgbW9yZSBldmVuIHNwcmVhZCBvZiBmaWxlcyBjYW4gYmUgYWNoZWl2ZWQgYnkgaGFzaGluZyBmcm9tIHRoZSBlbmQgb2YKLXRoZSBuYW1lLCBmb3IgZXhhbXBsZToKLTxQUkU+Ci0JVmlydHVhbERvY3VtZW50Um9vdAkvdS8lMysvJTIuLTEvJTIuLTIvJTIuLTMvJTIKLTwvUFJFPgotVGhlIGV4YW1wbGUgcmVxdWVzdCB3b3VsZCBjb21lIGZyb20KLTxDT0RFPi91c3IvbG9jYWwvYXBhY2hlL3Zob3N0cy9pc3AuY29tL2UvbC9wL2V4YW1wbGUvZGlyZWN0b3J5L2ZpbGUuaHRtbDwvQ09ERT4uCi1BbHRlcm5hdGl2ZWx5IHlvdSBtaWdodCB1c2U6Ci08UFJFPgotCVZpcnR1YWxEb2N1bWVudFJvb3QJL3Vzci9sb2NhbC9hcGFjaGUvdmhvc3RzLyUzKy8lMi4xLyUyLjIvJTIuMy8lMi40KwotPC9QUkU+Ci1UaGUgZXhhbXBsZSByZXF1ZXN0IHdvdWxkIGNvbWUgZnJvbQotPENPREU+L3Vzci9sb2NhbC9hcGFjaGUvdmhvc3RzL2lzcC5jb20vZS94L2EvbXBsZS9kaXJlY3RvcnkvZmlsZS5odG1sPC9DT0RFPi4KLTwvUD4KLQotPFA+Ci1Gb3IgSVAtYmFzZWQgdmlydHVhbCBob3N0aW5nIHlvdSBtaWdodCB1c2UgdGhlIGZvbGxvd2luZyBpbiB5b3VyCi1jb25maWd1cmF0aW9uIGZpbGU6Ci08UFJFPgotCVVzZUNhbm9uaWNhbE5hbWUgRE5TCi0JVmlydHVhbERvY3VtZW50Um9vdElQCS91c3IvbG9jYWwvYXBhY2hlL3Zob3N0LyUxLyUyLyUzLyU0L2RvY3MKLQlWaXJ0dWFsU2NyaXB0QWxpYXNJUAkvdXNyL2xvY2FsL2FwYWNoZS92aG9zdC8lMS8lMi8lMy8lNC9jZ2ktYmluCi08L1BSRT4KLUEgcmVxdWVzdCBmb3IgPENPREU+aHR0cDovL3d3dy5leGFtcGxlLmlzcC5jb20vZGlyZWN0b3J5L2ZpbGUuaHRtbDwvQ09ERT4KLXdvdWxkIGJlIHNhdGlzZmllZCBieSB0aGUgZmlsZQotPENPREU+L3Vzci9sb2NhbC9hcGFjaGUvMTAvMjAvMzAvNDAvZG9jcy9kaXJlY3RvcnkvZmlsZS5odG1sPC9DT0RFPiBpZgotdGhlIElQIGFkZHJlc3Mgb2YgPENPREU+d3d3LmV4YW1wbGUuY29tPC9DT0RFPiB3ZXJlIDEwLjIwLjMwLjQwLgotQSByZXF1ZXN0IGZvciA8Q09ERT5odHRwOi8vd3d3LmV4YW1wbGUuaXNwLmNvbS9jZ2ktYmluL3NjcmlwdC5wbDwvQ09ERT4KLXdvdWxkIGJlIHNhdGlzZmllZCBieSBleGVjdXRpbmcgdGhlIHByb2dyYW0KLTxDT0RFPi91c3IvbG9jYWwvYXBhY2hlLzEwLzIwLzMwLzQwL2NnaS1iaW4vc2NyaXB0LnBsPC9DT0RFPi4KLTwvUD4KLQotPFA+Ci1UaGUgPEEgSFJFRj0ibW9kX2xvZ19jb25maWcuaHRtbCNmb3JtYXRzIj5Mb2dGb3JtYXQgZGlyZWN0aXZlczwvQT4KLTxDT0RFPiVWPC9DT0RFPiBhbmQgPENPREU+JUE8L0NPREU+IGFyZSB1c2VmdWwgaW4gY29uanVuY3Rpb24gd2l0aAotdGhpcyBtb2R1bGUuCi08L1A+Ci0KLTxIUj4KLQotPEgyPkRpcmVjdGl2ZXM8L0gyPgotPFVMPgotICA8TEk+PEEgSFJFRj0iI1ZpcnR1YWxEb2N1bWVudFJvb3QiPlZpcnR1YWxEb2N1bWVudFJvb3Q8L0E+Ci0gIDxMST48QSBIUkVGPSIjVmlydHVhbERvY3VtZW50Um9vdElQIj5WaXJ0dWFsRG9jdW1lbnRSb290SVA8L0E+Ci0gIDxMST48QSBIUkVGPSIjVmlydHVhbFNjcmlwdEFsaWFzIj5WaXJ0dWFsU2NyaXB0QWxpYXM8L0E+Ci0gIDxMST48QSBIUkVGPSIjVmlydHVhbFNjcmlwdEFsaWFzSVAiPlZpcnR1YWxTY3JpcHRBbGlhc0lQPC9BPgotPC9VTD4KLTxIUj4KLQotPEgyPjxBIE5BTUU9IlZpcnR1YWxEb2N1bWVudFJvb3QiPlZpcnR1YWxEb2N1bWVudFJvb3QgZGlyZWN0aXZlPC9BPjwvSDI+Ci08UD4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gVmlydHVhbERvY3VtZW50Um9vdCA8RU0+aW50ZXJwb2xhdGVkLWRpcmVjdG9yeTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IE5vbmU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBFeHRlbnNpb248QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF92aG9zdF9hbGlhczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBWaXJ0dWFsRG9jdW1lbnRSb290IGlzIG9ubHkgYXZhaWxhYmxlIGluIDEuMy41IGFuZCBsYXRlci48L1A+Ci08UD4KLVRoZSA8Q09ERT5WaXJ0dWFsRG9jdW1lbnRSb290PC9DT0RFPiBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0byBkZXRlcm1pbmUKLXdoZXJlIEFwYWNoZSB3aWxsIGZpbmQgeW91ciBkb2N1bWVudHMgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSBzZXJ2ZXIKLW5hbWUuIFRoZSByZXN1bHQgb2YgZXhwYW5kaW5nIDxFTT5pbnRlcnBvbGF0ZWQtZGlyZWN0b3J5PC9FTT4gaXMgdXNlZAotYXMgdGhlIHJvb3Qgb2YgdGhlIGRvY3VtZW50IHRyZWUgaW4gYSBzaW1pbGFyIG1hbm5lciB0byB0aGUKLTxBIEhSRUY9ImNvcmUuaHRtbCNkb2N1bWVudHJvb3QiPjxDT0RFPkRvY3VtZW50Um9vdDwvQ09ERT48L0E+Ci1kaXJlY3RpdmUncyBhcmd1bWVudC4gSWYgPEVNPmludGVycG9sYXRlZC1kaXJlY3Rvcnk8L0VNPiBpcwotPENPREU+bm9uZTwvQ09ERT4gdGhlbiA8Q09ERT5WaXJ0YXVsRG9jdW1lbnRSb290PC9DT0RFPiBpcyB0dXJuZWQgb2ZmLgotVGhpcyBkaXJlY3RpdmUgY2Fubm90IGJlIHVzZWQgaW4gdGhlIHNhbWUgY29udGV4dCBhcwotPEEgSFJFRj0iI1ZpcnR1YWxEb2N1bWVudFJvb3RJUCI+PENPREU+VmlydHVhbERvY3VtZW50Um9vdElQPC9DT0RFPjwvQT4uCi08L1A+Ci08SFI+Ci0KLTxIMj48QSBOQU1FPSJWaXJ0dWFsRG9jdW1lbnRSb290SVAiPlZpcnR1YWxEb2N1bWVudFJvb3RJUCBkaXJlY3RpdmU8L0E+PC9IMj4KLTxQPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBWaXJ0dWFsRG9jdW1lbnRSb290SVAgPEVNPmludGVycG9sYXRlZC1kaXJlY3Rvcnk8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiBOb25lPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gRXh0ZW5zaW9uPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2Rfdmhvc3RfYWxpYXM8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gVmlydHVhbERvY3VtZW50Um9vdElQIGlzIG9ubHkgYXZhaWxhYmxlIGluIDEuMy41IGFuZCBsYXRlci48L1A+Ci08UD4KLVRoZSA8Q09ERT5WaXJ0dWFsRG9jdW1lbnRSb290SVA8L0NPREU+IGRpcmVjdGl2ZSBpcyBsaWtlIHRoZQotPEEgSFJFRj0iI1ZpcnR1YWxEb2N1bWVudFJvb3QiPjxDT0RFPlZpcnR1YWxEb2N1bWVudFJvb3Q8L0NPREU+PC9BPiBkaXJlY3RpdmUsCi1leGNlcHQgdGhhdCBpdCB1c2VzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBzZXJ2ZXIgZW5kIG9mIHRoZSBjb25uZWN0aW9uCi1pbnN0ZWFkIG9mIHRoZSBzZXJ2ZXIgbmFtZS4KLTwvUD4KLTxIUj4KLQotPEgyPjxBIE5BTUU9IlZpcnR1YWxTY3JpcHRBbGlhcyI+VmlydHVhbFNjcmlwdEFsaWFzIGRpcmVjdGl2ZTwvQT48L0gyPgotPFA+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFZpcnR1YWxTY3JpcHRBbGlhcyA8RU0+aW50ZXJwb2xhdGVkLWRpcmVjdG9yeTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IE5vbmU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBFeHRlbnNpb248QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF92aG9zdF9hbGlhczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBWaXJ0dWFsU2NyaXB0QWxpYXMgaXMgb25seSBhdmFpbGFibGUgaW4gMS4zLjUgYW5kIGxhdGVyLjwvUD4KLTxQPgotVGhlIDxDT0RFPlZpcnR1YWxTY3JpcHRBbGlhczwvQ09ERT4gZGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gZGV0ZXJtaW5lCi13aGVyZSBBcGFjaGUgd2lsbCBmaW5kIENHSSBzY3JpcHRzIGluIGEgc2ltaWxhciBtYW5uZXIgdG8KLTxBIEhSRUY9IiNWaXJ0dWFsRG9jdW1lbnRSb290Ij48Q09ERT5WaXJ0dWFsRG9jdW1lbnRSb290PC9DT0RFPjwvQT4KLWRvZXMgZm9yIG90aGVyIGRvY3VtZW50cy4gSXQgbWF0Y2hlcyByZXF1ZXN0cyBmb3IgVVJJcyBzdGFydGluZwotPENPREU+L2NnaS1iaW4vPC9DT0RFPiwgbXVjaCBsaWtlCi08Q09ERT48QSBIUkVGPSJtb2RfYWxpYXMuaHRtbCNzY3JpcHRhbGlhcyI+U2NyaXB0QWxpYXM8L0E+IC9jZ2ktYmluLzwvQ09ERT4KLXdvdWxkLgotPC9QPgotPEhSPgotCi08SDI+PEEgTkFNRT0iVmlydHVhbFNjcmlwdEFsaWFzIj5WaXJ0dWFsU2NyaXB0QWxpYXNJUCBkaXJlY3RpdmU8L0E+PC9IMj4KLTxQPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBWaXJ0dWFsU2NyaXB0QWxpYXNJUCA8RU0+aW50ZXJwb2xhdGVkLWRpcmVjdG9yeTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IE5vbmU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBFeHRlbnNpb248QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF92aG9zdF9hbGlhczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBWaXJ0dWFsU2NyaXB0QWxpYXNJUCBpcyBvbmx5IGF2YWlsYWJsZSBpbiAxLjMuNSBhbmQgbGF0ZXIuPC9QPgotPFA+Ci1UaGUgPENPREU+VmlydHVhbFNjcmlwdEFsaWFzSVA8L0NPREU+IGRpcmVjdGliZSBpcyBsaWtlIHRoZQotPEEgSFJFRj0iI1ZpcnR1YWxTY3JpcHRBbGlhcyI+PENPREU+VmlydHVhbFNjcmlwdEFsaWFzPC9DT0RFPjwvQT4gZGlyZWN0aXZlLAotZXhjZXB0IHRoYXQgaXQgdXNlcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgc2VydmVyIGVuZCBvZiB0aGUgY29ubmVjdGlvbgotaW5zdGVhZCBvZiB0aGUgc2VydmVyIG5hbWUuCi08L1A+Ci08SFI+Ci0KLTxIMyBBTElHTj0iQ0VOVEVSIj4KLSBBcGFjaGUgSFRUUCBTZXJ2ZXIgVmVyc2lvbiAxLjMKLTwvSDM+Ci0KLTxBIEhSRUY9Ii4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2luZGV4LmdpZiIgQUxUPSJJbmRleCI+PC9BPgotPEEgSFJFRj0iLi4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2hvbWUuZ2lmIiBBTFQ9IkhvbWUiPjwvQT4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF92aG9zdF9hbGlhcy54bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX3Zob3N0X2FsaWFzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEwZDIxYy4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX3Zob3N0X2FsaWFzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9Ii4uL3N0eWxlL21hbnVhbC54c2wiPz4KLTxtb2R1bGVzeW5vcHNpcz4KLQotPG5hbWU+bW9kX3Zob3N0X2FsaWFzPC9uYW1lPgotPHN0YXR1cz5FeHRlbnNpb248L3N0YXR1cz4KLTxpZGVudGlmaWVyPnZob3N0X2FsaWFzX21vZHVsZTwvaWRlbnRpZmllcj4KLTxzb3VyY2VmaWxlPm1vZF92aG9zdF9hbGlhcy5jPC9zb3VyY2VmaWxlPgotPGNvbXBhdGliaWxpdHk+QXZhaWxhYmxlIGluIEFwYWNoZSAxLjMuNyBhbmQgbGF0ZXIuPC9jb21wYXRpYmlsaXR5PgotCi08ZGVzY3JpcHRpb24+VGhpcyBtb2R1bGUgcHJvdmlkZXMgc3VwcG9ydCBmb3IgPGEKLWhyZWY9Ii4uL3Zob3N0cy9tYXNzLmh0bWwiPmR5bmFtaWNhbGx5IGNvbmZpZ3VyZWQgbWFzcyB2aXJ0dWFsCi1ob3N0aW5nPC9hPi48L2Rlc2NyaXB0aW9uPgotCi08c3VtbWFyeT4KLQotICAgIDxwPlRoaXMgbW9kdWxlIGNyZWF0ZXMgZHluYW1pY2FsbHkgY29uZmlndXJlZCB2aXJ0dWFsIGhvc3RzLCBieQotICAgIGFsbG93aW5nIHRoZSBJUCBhZGRyZXNzIGFuZC9vciB0aGUgPGNvZGU+SG9zdDo8L2NvZGU+IGhlYWRlciBvZgotICAgIHRoZSBIVFRQIHJlcXVlc3QgdG8gYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBwYXRobmFtZSB0bwotICAgIGRldGVybWluZSB3aGF0IGZpbGVzIHRvIHNlcnZlLiBUaGlzIGFsbG93cyBmb3IgZWFzeSB1c2Ugb2YgYQotICAgIGh1Z2UgbnVtYmVyIG9mIHZpcnR1YWwgaG9zdHMgd2l0aCBzaW1pbGFyIGNvbmZpZ3VyYXRpb25zLjwvcD4KLQotICAgIDxzZWVhbHNvPlNlZSBhbHNvOiA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJjb3JlIj5Vc2VDYW5vbmljYWxOYW1lPC9kaXJlY3RpdmU+Ljwvc2VlYWxzbz4KLQotPC9zdW1tYXJ5PgotCi08c2VjdGlvbj4KLSAgICA8dGl0bGU+RGlyZWN0b3J5IE5hbWUgSW50ZXJwb2xhdGlvbjwvdGl0bGU+Ci0KLSAgICA8cD5BbGwgdGhlIGRpcmVjdGl2ZXMgaW4gdGhpcyBtb2R1bGUgaW50ZXJwb2xhdGUgYSBzdHJpbmcgaW50bwotICAgIGEgcGF0aG5hbWUuIFRoZSBpbnRlcnBvbGF0ZWQgc3RyaW5nIChoZW5jZWZvcnRoIGNhbGxlZCB0aGUKLSAgICAibmFtZSIpIG1heSBiZSBlaXRoZXIgdGhlIHNlcnZlciBuYW1lIChzZWUgdGhlIDxhCi0gICAgaHJlZj0iY29yZS5odG1sI3VzZWNhbm9uaWNhbG5hbWUiPjxjb2RlPlVzZUNhbm9uaWNhbE5hbWU8L2NvZGU+PC9hPgotICAgIGRpcmVjdGl2ZSBmb3IgZGV0YWlscyBvbiBob3cgdGhpcyBpcyBkZXRlcm1pbmVkKSBvciB0aGUgSVAKLSAgICBhZGRyZXNzIG9mIHRoZSB2aXJ0dWFsIGhvc3Qgb24gdGhlIHNlcnZlciBpbiBkb3R0ZWQtcXVhZAotICAgIGZvcm1hdC4gVGhlIGludGVycG9sYXRpb24gaXMgY29udHJvbGxlZCBieSBzcGVjaWZpZXJzIGluc3BpcmVkCi0gICAgYnkgPGNvZGU+cHJpbnRmPC9jb2RlPiB3aGljaCBoYXZlIGEgbnVtYmVyIG9mIGZvcm1hdHM6PC9wPgotCi08dGFibGU+Ci0KLTx0cj48dGQ+PGNvZGU+JSU8L2NvZGU+PC90ZD4KLTx0ZD5pbnNlcnQgYSA8Y29kZT4lPC9jb2RlPjwvdGQ+PC90cj4KLQotPHRyPjx0ZD48Y29kZT4lcDwvY29kZT48L3RkPgotPHRkPmluc2VydCB0aGUgcG9ydCBudW1iZXIgb2YgdGhlIHZpcnR1YWwgaG9zdDwvdGQ+PC90cj4KLQotPHRyPjx0ZD48Y29kZT4lTi5NPC9jb2RlPjwvdGQ+Ci08dGQ+aW5zZXJ0IChwYXJ0IG9mKSB0aGUgbmFtZTwvdGQ+PC90cj4KLSAgICAgCi08L3RhYmxlPgotCi0gICAgPHA+PGNvZGU+TjwvY29kZT4gYW5kIDxjb2RlPk08L2NvZGU+IGFyZSB1c2VkIHRvIHNwZWNpZnkKLSAgICBzdWJzdHJpbmdzIG9mIHRoZSBuYW1lLiA8Y29kZT5OPC9jb2RlPiBzZWxlY3RzIGZyb20gdGhlCi0gICAgZG90LXNlcGFyYXRlZCBjb21wb25lbnRzIG9mIHRoZSBuYW1lLCBhbmQgPGNvZGU+TTwvY29kZT4KLSAgICBzZWxlY3RzIGNoYXJhY3RlcnMgd2l0aGluIHdoYXRldmVyIDxjb2RlPk48L2NvZGU+IGhhcyBzZWxlY3RlZC4KLSAgICA8Y29kZT5NPC9jb2RlPiBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gemVybyBpZiBpdCBpc24ndAotICAgIHByZXNlbnQ7IHRoZSBkb3QgbXVzdCBiZSBwcmVzZW50IGlmIGFuZCBvbmx5IGlmIDxjb2RlPk08L2NvZGU+Ci0gICAgaXMgcHJlc2VudC4gVGhlIGludGVycHJldGF0aW9uIGlzIGFzIGZvbGxvd3M6PC9wPgotCi0gICAgPHRhYmxlPgotICAgICAgPHRyPjx0ZD48Y29kZT4wPC9jb2RlPjwvdGQ+Ci0gICAgICA8dGQ+dGhlIHdob2xlIG5hbWU8L3RkPjwvdHI+Ci0KLSAgICAgIDx0cj48dGQ+PGNvZGU+MTwvY29kZT48L3RkPgotICAgICAgPHRkPnRoZSBmaXJzdCBwYXJ0PC90ZD48L3RyPgotCi0gICAgICA8dHI+PHRkPjxjb2RlPjI8L2NvZGU+PC90ZD4KLSAgICAgIDx0ZD50aGUgc2Vjb25kIHBhcnQ8L3RkPjwvdHI+Ci0KLSAgICAgIDx0cj48dGQ+PGNvZGU+LTE8L2NvZGU+PC90ZD4KLSAgICAgIDx0ZD50aGUgbGFzdCBwYXJ0PC90ZD48L3RyPgotCi0gICAgICA8dHI+PHRkPjxjb2RlPi0yPC9jb2RlPjwvdGQ+Ci0gICAgICA8dGQ+dGhlIHBlbnVsdGltYXRlIHBhcnQ8L3RkPjwvdHI+Ci0KLSAgICAgIDx0cj48dGQ+PGNvZGU+Mis8L2NvZGU+PC90ZD4KLSAgICAgIDx0ZD50aGUgc2Vjb25kIGFuZCBhbGwgc3Vic2VxdWVudCBwYXJ0czwvdGQ+PC90cj4KLQotICAgICAgPHRyPjx0ZD48Y29kZT4tMis8L2NvZGU+PC90ZD4KLSAgICAgIDx0ZD50aGUgcGVudWx0aW1hdGUgYW5kIGFsbCBwcmVjZWRpbmcgcGFydHM8L3RkPjwvdHI+Ci0KLSAgICAgIDx0cj48dGQ+PGNvZGU+MSs8L2NvZGU+IGFuZCA8Y29kZT4tMSs8L2NvZGU+PC90ZD4KLSAgICAgIDx0ZD50aGUgc2FtZSBhcyA8Y29kZT4wPC9jb2RlPjwvdGQ+PC90cj4KLSAgICA8L3RhYmxlPgotCi0gICAgPHA+SWYgPGNvZGU+TjwvY29kZT4gb3IgPGNvZGU+TTwvY29kZT4gaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIKLSAgICBvZiBwYXJ0cyBhdmFpbGFibGUgYSBzaW5nbGUgdW5kZXJzY29yZSBpcyBpbnRlcnBvbGF0ZWQuIDwvcD4KLQotPC9zZWN0aW9uPgotCi08c2VjdGlvbj4KLSAgICA8dGl0bGU+RXhhbXBsZXM8L3RpdGxlPgotCi0gICAgPHA+Rm9yIHNpbXBsZSBuYW1lLWJhc2VkIHZpcnR1YWwgaG9zdHMgeW91IG1pZ2h0IHVzZSB0aGUKLSAgICBmb2xsb3dpbmcgZGlyZWN0aXZlcyBpbiB5b3VyIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGU6PC9wPgotCi08ZXhhbXBsZT4KLSAgICBVc2VDYW5vbmljYWxOYW1lICAgIE9mZjxiciAvPgotICAgIFZpcnR1YWxEb2N1bWVudFJvb3QgL3Vzci9sb2NhbC9hcGFjaGUvdmhvc3RzLyUwCi08L2V4YW1wbGU+Ci0KLSAgICA8cD5BIHJlcXVlc3QgZm9yCi0gICAgPGNvZGU+aHR0cDovL3d3dy5leGFtcGxlLmNvbS9kaXJlY3RvcnkvZmlsZS5odG1sPC9jb2RlPiB3aWxsIGJlCi0gICAgc2F0aXNmaWVkIGJ5IHRoZSBmaWxlCi0gICAgPGNvZGU+L3Vzci9sb2NhbC9hcGFjaGUvdmhvc3RzL3d3dy5leGFtcGxlLmNvbS9kaXJlY3RvcnkvZmlsZS5odG1sPC9jb2RlPi4KLSAgICA8L3A+IAotCi0gICAgPHA+Rm9yIGEgdmVyeSBsYXJnZSBudW1iZXIgb2YgdmlydHVhbCBob3N0cyBpdCBpcyBhIGdvb2QgaWRlYQotICAgIHRvIGFycmFuZ2UgdGhlIGZpbGVzIHRvIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUKLSAgICA8Y29kZT52aG9zdHM8L2NvZGU+IGRpcmVjdG9yeS4gVG8gZG8gdGhpcyB5b3UgbWlnaHQgdXNlIHRoZQotICAgIGZvbGxvd2luZyBpbiB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZTo8L3A+Ci0KLTxleGFtcGxlPgotICAgIFVzZUNhbm9uaWNhbE5hbWUgICAgT2ZmPGJyIC8+Ci0gICAgVmlydHVhbERvY3VtZW50Um9vdCAvdXNyL2xvY2FsL2FwYWNoZS92aG9zdHMvJTMrLyUyLjEvJTIuMi8lMi4zLyUyCi08L2V4YW1wbGU+Ci0KLSAgICA8cD5BIHJlcXVlc3QgZm9yCi0gICAgPGNvZGU+aHR0cDovL3d3dy5leGFtcGxlLmlzcC5jb20vZGlyZWN0b3J5L2ZpbGUuaHRtbDwvY29kZT4KLSAgICB3aWxsIGJlIHNhdGlzZmllZCBieSB0aGUgZmlsZQotICAgIDxjb2RlPi91c3IvbG9jYWwvYXBhY2hlL3Zob3N0cy9pc3AuY29tL2UveC9hL2V4YW1wbGUvZGlyZWN0b3J5L2ZpbGUuaHRtbDwvY29kZT4uPC9wPgotCi0gICAgPHA+QSBtb3JlIGV2ZW4gc3ByZWFkIG9mIGZpbGVzIGNhbiBiZSBhY2hpZXZlZCBieSBoYXNoaW5nIGZyb20gdGhlCi0gICAgZW5kIG9mIHRoZSBuYW1lLCBmb3IgZXhhbXBsZTogPC9wPgotCi08ZXhhbXBsZT4KLSAgICBWaXJ0dWFsRG9jdW1lbnRSb290IC91c3IvbG9jYWwvYXBhY2hlL3Zob3N0cy8lMysvJTIuLTEvJTIuLTIvJTIuLTMvJTIKLTwvZXhhbXBsZT4KLQotICAgIDxwPlRoZSBleGFtcGxlIHJlcXVlc3Qgd291bGQgY29tZSBmcm9tCi0gICAgPGNvZGU+L3Vzci9sb2NhbC9hcGFjaGUvdmhvc3RzL2lzcC5jb20vZS9sL3AvZXhhbXBsZS9kaXJlY3RvcnkvZmlsZS5odG1sPC9jb2RlPi48L3A+Ci0KLSAgICA8cD5BbHRlcm5hdGl2ZWx5IHlvdSBtaWdodCB1c2U6IDwvcD4KLQotPGV4YW1wbGU+Ci0gICAgVmlydHVhbERvY3VtZW50Um9vdCAvdXNyL2xvY2FsL2FwYWNoZS92aG9zdHMvJTMrLyUyLjEvJTIuMi8lMi4zLyUyLjQrCi08L2V4YW1wbGU+Ci0KLSAgICA8cD5UaGUgZXhhbXBsZSByZXF1ZXN0IHdvdWxkIGNvbWUgZnJvbQotICAgIDxjb2RlPi91c3IvbG9jYWwvYXBhY2hlL3Zob3N0cy9pc3AuY29tL2UveC9hL21wbGUvZGlyZWN0b3J5L2ZpbGUuaHRtbDwvY29kZT4uPC9wPgotCi0gICAgPHA+Rm9yIElQLWJhc2VkIHZpcnR1YWwgaG9zdGluZyB5b3UgbWlnaHQgdXNlIHRoZSBmb2xsb3dpbmcgaW4KLSAgICB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZTo8L3A+Ci0KLTxleGFtcGxlPgotICAgIFVzZUNhbm9uaWNhbE5hbWUgRE5TPGJyIC8+Ci0gICAgVmlydHVhbERvY3VtZW50Um9vdElQICAgL3Vzci9sb2NhbC9hcGFjaGUvdmhvc3RzLyUxLyUyLyUzLyU0L2RvY3M8YnIgLz4KLSAgICBWaXJ0dWFsU2NyaXB0QWxpYXNJUCAgICAvdXNyL2xvY2FsL2FwYWNoZS92aG9zdHMvJTEvJTIvJTMvJTQvY2dpLWJpbgotPC9leGFtcGxlPgotCi0gICAgPHA+QSByZXF1ZXN0IGZvcgotICAgIDxjb2RlPmh0dHA6Ly93d3cuZXhhbXBsZS5pc3AuY29tL2RpcmVjdG9yeS9maWxlLmh0bWw8L2NvZGU+Ci0gICAgd291bGQgYmUgc2F0aXNmaWVkIGJ5IHRoZSBmaWxlCi0gICAgPGNvZGU+L3Vzci9sb2NhbC9hcGFjaGUvdmhvc3RzLzEwLzIwLzMwLzQwL2RvY3MvZGlyZWN0b3J5L2ZpbGUuaHRtbDwvY29kZT4KLSAgICBpZiB0aGUgSVAgYWRkcmVzcyBvZiA8Y29kZT53d3cuZXhhbXBsZS5jb208L2NvZGU+IHdlcmUKLSAgICAxMC4yMC4zMC40MC4gQSByZXF1ZXN0IGZvcgotICAgIDxjb2RlPmh0dHA6Ly93d3cuZXhhbXBsZS5pc3AuY29tL2NnaS1iaW4vc2NyaXB0LnBsPC9jb2RlPiB3b3VsZAotICAgIGJlIHNhdGlzZmllZCBieSBleGVjdXRpbmcgdGhlIHByb2dyYW0KLSAgICA8Y29kZT4vdXNyL2xvY2FsL2FwYWNoZS92aG9zdHMvMTAvMjAvMzAvNDAvY2dpLWJpbi9zY3JpcHQucGw8L2NvZGU+LjwvcD4KLQotICAgIDxwPklmIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIDxjb2RlPi48L2NvZGU+IGNoYXJhY3RlciBpbiBhCi0gICAgPGNvZGU+VmlydHVhbERvY3VtZW50Um9vdDwvY29kZT4gZGlyZWN0aXZlLCBidXQgaXQgY2xhc2hlcyB3aXRoCi0gICAgYSA8Y29kZT4lPC9jb2RlPiBkaXJlY3RpdmUsIHlvdSBjYW4gd29yayBhcm91bmQgdGhlIHByb2JsZW0gaW4KLSAgICB0aGUgZm9sbG93aW5nIHdheTo8L3A+Ci0KLTxleGFtcGxlPgotICAgIFZpcnR1YWxEb2N1bWVudFJvb3QgL3Vzci9sb2NhbC9hcGFjaGUvdmhvc3RzLyUyLjAuJTMuMAotPC9leGFtcGxlPgotCi0gICAgPHA+QSByZXF1ZXN0IGZvcgotICAgIDxjb2RlPmh0dHA6Ly93d3cuZXhhbXBsZS5pc3AuY29tL2RpcmVjdG9yeS9maWxlLmh0bWw8L2NvZGU+Ci0gICAgd2lsbCBiZSBzYXRpc2ZpZWQgYnkgdGhlIGZpbGUKLSAgICA8Y29kZT4vdXNyL2xvY2FsL2FwYWNoZS92aG9zdHMvZXhhbXBsZS5pc3AvZGlyZWN0b3J5L2ZpbGUuaHRtbDwvY29kZT4uPC9wPgotICAgICAKLSAgICA8cD5UaGUgPGRpcmVjdGl2ZSBtb2R1bGU9Im1vZF9sb2dfY29uZmlnIj5Mb2dGb3JtYXQ8L2RpcmVjdGl2ZT4KLSAgICBkaXJlY3RpdmVzIDxjb2RlPiVWPC9jb2RlPiBhbmQgPGNvZGU+JUE8L2NvZGU+IGFyZSB1c2VmdWwKLSAgICBpbiBjb25qdW5jdGlvbiB3aXRoIHRoaXMgbW9kdWxlLjwvcD4KLTwvc2VjdGlvbj4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+VmlydHVhbERvY3VtZW50Um9vdDwvbmFtZT4KLTxzeW50YXg+VmlydHVhbERvY3VtZW50Um9vdCA8ZW0+aW50ZXJwb2xhdGVkLWRpcmVjdG9yeTwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5ub25lPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0PgotPGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+PC9vdmVycmlkZT4KLTxjb21wYXRpYmlsaXR5PlZpcnR1YWxEb2N1bWVudFJvb3QgaXMgb25seSBhdmFpbGFibGUgaW4gMS4zLjcgYW5kCi1sYXRlci48L2NvbXBhdGliaWxpdHk+Ci08ZGVzY3JpcHRpb24+RHluYW1pY2FsbHkgY29uZmlndXJlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZG9jdW1lbnQgcm9vdAotZm9yIGEgZ2l2ZW4gdmlydHVhbCBob3N0LjwvZGVzY3JpcHRpb24+Ci0KLTx1c2FnZT4KLQotICAgIDxwPlRoZSA8Y29kZT5WaXJ0dWFsRG9jdW1lbnRSb290PC9jb2RlPiBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0bwotICAgIGRldGVybWluZSB3aGVyZSBBcGFjaGUgd2lsbCBmaW5kIHlvdXIgZG9jdW1lbnRzIGJhc2VkIG9uIHRoZQotICAgIHZhbHVlIG9mIHRoZSBzZXJ2ZXIgbmFtZS4gVGhlIHJlc3VsdCBvZiBleHBhbmRpbmcKLSAgICA8ZW0+aW50ZXJwb2xhdGVkLWRpcmVjdG9yeTwvZW0+IGlzIHVzZWQgYXMgdGhlIHJvb3Qgb2YgdGhlCi0gICAgZG9jdW1lbnQgdHJlZSBpbiBhIHNpbWlsYXIgbWFubmVyIHRvIHRoZSA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJjb3JlIj5Eb2N1bWVudFJvb3Q8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlJ3MgYXJndW1lbnQuIAotICAgIElmIDxlbT5pbnRlcnBvbGF0ZWQtZGlyZWN0b3J5PC9lbT4gaXMgPGNvZGU+bm9uZTwvY29kZT4gdGhlbgotICAgIDxjb2RlPlZpcnRhdWxEb2N1bWVudFJvb3Q8L2NvZGU+IGlzIHR1cm5lZCBvZmYuIFRoaXMgZGlyZWN0aXZlIAotICAgIGNhbm5vdCBiZSB1c2VkIGluIHRoZSBzYW1lIGNvbnRleHQgYXMKLSAgICA8ZGlyZWN0aXZlPlZpcnR1YWxEb2N1bWVudFJvb3RJUDwvZGlyZWN0aXZlPi48L3A+Ci0KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5WaXJ0dWFsRG9jdW1lbnRSb290SVA8L25hbWU+Ci08c3ludGF4PlZpcnR1YWxEb2N1bWVudFJvb3RJUCA8ZW0+aW50ZXJwb2xhdGVkLWRpcmVjdG9yeTwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5ub25lPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0PgotPGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD4KLTxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08b3ZlcnJpZGU+PC9vdmVycmlkZT4KLTxjb21wYXRpYmlsaXR5PlZpcnR1YWxEb2N1bWVudFJvb3RJUCBpcyBvbmx5IGF2YWlsYWJsZSBpbiAxLjMuNyAKLWFuZCBsYXRlci48L2NvbXBhdGliaWxpdHk+Ci08ZGVzY3JpcHRpb24+RHluYW1pY2FsbHkgY29uZmlndXJlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZG9jdW1lbnQgcm9vdAotZm9yIGEgZ2l2ZW4gdmlydHVhbCBob3N0PC9kZXNjcmlwdGlvbj4KLQotPHVzYWdlPgotCi08cD5UaGUgPGNvZGU+VmlydHVhbERvY3VtZW50Um9vdElQPC9jb2RlPiBkaXJlY3RpdmUgaXMgbGlrZSB0aGUKLSAgICA8ZGlyZWN0aXZlPlZpcnR1YWxEb2N1bWVudFJvb3Q8L2RpcmVjdGl2ZT4KLSAgICBkaXJlY3RpdmUsIGV4Y2VwdCB0aGF0IGl0IHVzZXMgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIHNlcnZlciBlbmQKLSAgICBvZiB0aGUgY29ubmVjdGlvbiBpbnN0ZWFkIG9mIHRoZSBzZXJ2ZXIgbmFtZS48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+VmlydHVhbFNjcmlwdEFsaWFzPC9uYW1lPgotPHN5bnRheD5WaXJ0dWFsU2NyaXB0QWxpYXMgPGVtPmludGVycG9sYXRlZC1kaXJlY3Rvcnk8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+bm9uZTwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD4KLTxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+Ci08Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPjwvb3ZlcnJpZGU+Ci08Y29tcGF0aWJpbGl0eT5WaXJ0dWFsU2NyaXB0QWxpYXMgaXMgb25seSBhdmFpbGFibGUgaW4gMS4zLjcKLWFuZCBsYXRlci48L2NvbXBhdGliaWxpdHk+Ci08ZGVzY3JpcHRpb24+RHluYW1pY2FsbHkgY29uZmlndXJlIHRoZSBsb2NhdGlvbiBvZiB0aGUgQ0dJIGRpcmVjdG9yeSBmb3IKLWEgZ2l2ZW4gdmlydHVhbCBob3N0LjwvZGVzY3JpcHRpb24+Ci0KLTx1c2FnZT4KLQotICAgIDxwPlRoZSA8Y29kZT5WaXJ0dWFsU2NyaXB0QWxpYXM8L2NvZGU+IGRpcmVjdGl2ZSBhbGxvd3MgeW91IHRvCi0gICAgZGV0ZXJtaW5lIHdoZXJlIEFwYWNoZSB3aWxsIGZpbmQgQ0dJIHNjcmlwdHMgaW4gYSBzaW1pbGFyCi0gICAgbWFubmVyIHRvIDxkaXJlY3RpdmU+VmlydHVhbERvY3VtZW50Um9vdDwvZGlyZWN0aXZlPgotICAgIGRvZXMgZm9yIG90aGVyIGRvY3VtZW50cy4gSXQgbWF0Y2hlcyByZXF1ZXN0cyBmb3IgVVJJcyBzdGFydGluZwotICAgIDxjb2RlPi9jZ2ktYmluLzwvY29kZT4sIG11Y2ggbGlrZSA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJtb2RfYWxpYXMiPlNjcmlwdEFsaWFzPC9kaXJlY3RpdmU+Ci0gICAgPGNvZGU+L2NnaS1iaW4vPC9jb2RlPiB3b3VsZC48L3A+Ci0KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5WaXJ0dWFsU2NyaXB0QWxpYXNJUDwvbmFtZT4KLTxzeW50YXg+VmlydHVhbFNjcmlwdEFsaWFzSVAgPGVtPmludGVycG9sYXRlZC1kaXJlY3Rvcnk8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+bm9uZTwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD4KLTxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+Ci08Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+Ci08L2NvbnRleHRsaXN0PgotPG92ZXJyaWRlPjwvb3ZlcnJpZGU+Ci08Y29tcGF0aWJpbGl0eT5WaXJ0dWFsU2NyaXB0QWxpYXNJUCBpcyBvbmx5IGF2YWlsYWJsZSBpbiAxLjMuNyAKLWFuZCBsYXRlci48L2NvbXBhdGliaWxpdHk+Ci08ZGVzY3JpcHRpb24+RHluYW1pY2FsbHkgY29uZmlndXJlIHRoZSBsb2NhdGlvbiBvZiB0aGUgY2dpIGRpcmVjdG9yeSBmb3IKLWEgZ2l2ZW4gdmlydHVhbCBob3N0LjwvZGVzY3JpcHRpb24+Ci0KLTx1c2FnZT4KLQotICAgIDxwPlRoZSA8Y29kZT5WaXJ0dWFsU2NyaXB0QWxpYXNJUDwvY29kZT4gZGlyZWN0aXZlIGlzIGxpa2UgdGhlCi0gICAgPGEKLSAgICBocmVmPSIjdmlydHVhbHNjcmlwdGFsaWFzIj48Y29kZT5WaXJ0dWFsU2NyaXB0QWxpYXM8L2NvZGU+PC9hPgotICAgIGRpcmVjdGl2ZSwgZXhjZXB0IHRoYXQgaXQgdXNlcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgc2VydmVyIGVuZAotICAgIG9mIHRoZSBjb25uZWN0aW9uIGluc3RlYWQgb2YgdGhlIHNlcnZlciBuYW1lLjwvcD4KLQotICAgIDwvdXNhZ2U+Ci0KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci08L21vZHVsZXN5bm9wc2lzPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kdWxlLWRpY3QuaHRtbCBiL2RvY3MvbWFudWFsL21vZC9tb2R1bGUtZGljdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTkwYmJiLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2R1bGUtZGljdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotIDxIRUFEPgotICA8VElUTEU+RGVmaW5pdGlvbnMgb2YgdGVybXMgdXNlZCB0byBkZXNjcmliZSBBcGFjaGUgbW9kdWxlcwotICA8L1RJVExFPgotIDwvSEVBRD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLSA8Qk9EWQotICBCR0NPTE9SPSIjRkZGRkZGIgotICBURVhUPSIjMDAwMDAwIgotICBMSU5LPSIjMDAwMEZGIgotICBWTElOSz0iIzAwMDA4MCIKLSAgQUxJTks9IiNGRjAwMDAiCi0gPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLSAgPEgxIEFMSUdOPSJDRU5URVIiPlRlcm1zIFVzZWQgdG8gRGVzY3JpYmUgQXBhY2hlIE1vZHVsZXM8L0gxPgotCi0gIDxQPgotICBFYWNoIEFwYWNoZSBtb2R1bGUgaXMgZGVzY3JpYmVkIHVzaW5nIGEgY29tbW9uIGZvcm1hdCB0aGF0IGxvb2tzCi0gIGxpa2UgdGhpczoKLSAgPC9QPgotICA8REw+Ci0gICA8REQ+PEEKLSAgICAgICAgSFJFRj0iI1N0YXR1cyIKLSAgICAgICAgUkVMPSJIZWxwIgotICAgICAgID48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IDxFTT5zdGF0dXM8L0VNPgotICAgICAgIDxCUj4KLSAgICAgICA8QQotICAgICAgICBIUkVGPSIjU291cmNlRmlsZSIKLSAgICAgICAgUkVMPSJIZWxwIgotICAgICAgID48U1RST05HPlNvdXJjZSBGaWxlOjwvU1RST05HPjwvQT4gPEVNPnNvdXJjZS1maWxlPC9FTT4KLSAgICAgICA8QlI+Ci0gICAgICAgPEEKLSAgICAgICAgSFJFRj0iI01vZHVsZUlkZW50aWZpZXIiCi0gICAgICAgIFJFTD0iSGVscCIKLSAgICAgICA+PFNUUk9ORz5Nb2R1bGUgSWRlbnRpZmllcjo8L1NUUk9ORz48L0E+IDxFTT5tb2R1bGUtaWRlbnRpZmllcjwvRU0+Ci0gICAgICAgPEJSPgotICAgICAgIDxBCi0gICAgICAgIEhSRUY9IiNDb21wYXRpYmlsaXR5IgotICAgICAgICBSRUw9IkhlbHAiCi0gICAgICAgPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IDxFTT5jb21wYXRpYmlsaXR5IG5vdGVzPC9FTT4KLSAgIDwvREQ+Ci0gIDwvREw+Ci0gIDxQPgotICBFYWNoIG9mIHRoZSBhdHRyaWJ1dGVzLCBjb21wbGV0ZSB3aXRoIHZhbHVlcyB3aGVyZSBwb3NzaWJsZSwgYXJlCi0gIGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LgotICA8L1A+Ci0KLSAgPEgyPk1vZHVsZSBUZXJtczwvSDI+Ci0gIDxVTD4KLSAgIDxMST48QSBIUkVGPSIjU3RhdHVzIj5TdGF0dXM8L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNTb3VyY2VGaWxlIj5Tb3VyY2UgRmlsZTwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI01vZHVsZUlkZW50aWZpZXIiPk1vZHVsZSBJZGVudGlmaWVyPC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjQ29tcGF0aWJpbGl0eSI+Q29tcGF0aWJpbGl0eTwvQT4KLSAgIDwvTEk+Ci0gIDwvVUw+Ci0KLSAgPEhSPgotICA8SDI+PEEgTkFNRT0iU3RhdHVzIj5TdGF0dXM8L0E+PC9IMj4KLSAgPFA+Ci0gIFRoaXMgaW5kaWNhdGVzIGhvdyB0aWdodGx5IGJvdW5kIGludG8gdGhlIEFwYWNoZSBXZWIgc2VydmVyIHRoZQotICBtb2R1bGUgaXM7IGluIG90aGVyIHdvcmRzLCB5b3UgbWF5IG5lZWQgdG8gcmVjb21waWxlIHRoZSBzZXJ2ZXIgaW4KLSAgb3JkZXIgdG8gZ2FpbiBhY2Nlc3MgdG8gdGhlIG1vZHVsZSBhbmQgaXRzIGZ1bmN0aW9uYWxpdHkuICBQb3NzaWJsZQotICB2YWx1ZXMgZm9yIHRoaXMgYXR0cmlidXRlIGFyZToKLSAgPC9QPgotICA8REw+Ci0gICA8RFQ+PFNUUk9ORz5CYXNlPC9TVFJPTkc+Ci0gICA8L0RUPgotICAgPEREPkEgbW9kdWxlIGxhYmVsZWQgYXMgaGF2aW5nICZxdW90O0Jhc2UmcXVvdDsgc3RhdHVzIGlzIGNvbXBpbGVkCi0gICBhbmQgbG9hZGVkIGludG8gdGhlIHNlcnZlciBieSBkZWZhdWx0LCBhbmQgaXMgdGhlcmVmb3JlIG5vcm1hbGx5Ci0gICBhdmFpbGFibGUgdW5sZXNzIHlvdSBoYXZlIHRha2VuIHN0ZXBzIHRvIHJlbW92ZSB0aGUgbW9kdWxlIGZyb20geW91cgotICAgY29uZmlndXJhdGlvbi4KLSAgICA8UD4KLSAgICA8L1A+Ci0gICA8L0REPgotICAgPERUPjxTVFJPTkc+RXh0ZW5zaW9uPC9TVFJPTkc+Ci0gICA8L0RUPgotICAgPEREPkEgbW9kdWxlIHdpdGggJnF1b3Q7RXh0ZW5zaW9uJnF1b3Q7IHN0YXR1cyBpcyBub3Qgbm9ybWFsbHkKLSAgIGNvbXBpbGVkIGFuZCBsb2FkZWQgaW50byB0aGUgc2VydmVyLiAgVG8gZW5hYmxlIHRoZSBtb2R1bGUgYW5kIGl0cwotICAgZnVuY3Rpb25hbGl0eSwgeW91IG1heSBuZWVkIHRvIGNoYW5nZSB0aGUgc2VydmVyIGJ1aWxkCi0gICBjb25maWd1cmF0aW9uIGZpbGVzIGFuZCByZS1jb21waWxlIEFwYWNoZS4KLSAgICA8UD4KLSAgICA8L1A+Ci0gICA8L0REPgotICAgPERUPjxTVFJPTkc+RXhwZXJpbWVudGFsPC9TVFJPTkc+Ci0gICA8L0RUPgotICAgPEREPiZxdW90O0V4cGVyaW1lbnRhbCZxdW90OyBzdGF0dXMgaW5kaWNhdGVzIHRoYXQgdGhlIG1vZHVsZSBpcwotICAgIGF2YWlsYWJsZSBhcyBwYXJ0IG9mIHRoZSBBcGFjaGUga2l0LCBidXQgeW91IGFyZSBvbiB5b3VyIG93biBpZiB5b3UKLSAgICB0cnkgdG8gdXNlIGl0LiAgVGhlIG1vZHVsZSBpcyBiZWluZyBkb2N1bWVudGVkIGZvciBjb21wbGV0ZW5lc3MsCi0gICAgYW5kIGlzIG5vdCBuZWNlc3NhcmlseSBzdXBwb3J0ZWQuICAKLSAgICA8UD4KLSAgICA8L1A+Ci0gICA8L0REPgotICAgPERUPjxTVFJPTkc+RXh0ZXJuYWw8L1NUUk9ORz4KLSAgIDwvRFQ+Ci0gICA8REQ+TW9kdWxlcyB3aGljaCBhcmUgbm90IGluY2x1ZGVkIHdpdGggdGhlIGJhc2UgQXBhY2hlCi0gICBkaXN0cmlidXRpb24gKCZxdW90O3RoaXJkLXBhcnR5IG1vZHVsZXMmcXVvdDspIG1heSB1c2UgdGhlCi0gICAmcXVvdDtFeHRlcm5hbCZxdW90OyBzdGF0dXMuICBXZSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciwgbm9yIGRvIHdlCi0gICBzdXBwb3J0IHN1Y2ggbW9kdWxlcy4KLSAgICA8UD4KLSAgICA8L1A+Ci0gICA8L0REPgotICA8L0RMPgotCi0gIDxIUj4KLSAgPEgyPjxBIE5BTUU9IlNvdXJjZUZpbGUiPlNvdXJjZSBGaWxlPC9BPjwvSDI+Ci0gIDxQPgotICBUaGlzIHF1aXRlIHNpbXBseSBsaXN0cyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgd2hpY2ggY29udGFpbnMKLSAgdGhlIGNvZGUgZm9yIHRoZSBtb2R1bGUuICBUaGlzIGlzIGFsc28gdGhlIG5hbWUgdXNlZCBieSB0aGUgPEEKLSAgSFJFRj0iY29yZS5odG1sI2lmbW9kdWxlIj48Q09ERT4mbHQ7SWZNb2R1bGUmZ3Q7PC9DT0RFPjwvQT4KLSAgZGlyZWN0aXZlLgotICA8L1A+Ci0KLSAgPEhSPgotICA8SDI+PEEgTkFNRT0iTW9kdWxlSWRlbnRpZmllciI+TW9kdWxlIElkZW50aWZpZXI8L0E+PC9IMj4KLSAgPFA+Ci0gIFRoaXMgaXMgYSBzdHJpbmcgd2hpY2ggaWRlbnRpZmllcyB0aGUgbW9kdWxlIGZvciB1c2UgaW4gdGhlIDxBCi0gIEhSRUY9Im1vZF9zby5odG1sI2xvYWRtb2R1bGUiPkxvYWRNb2R1bGU8L0E+IGRpcmVjdGl2ZSB3aGVuCi0gIGR5bmFtaWNhbGx5IGxvYWRpbmcgbW9kdWxlcy4gIEluIHBhcnRpY3VsYXIsIGl0IGlzIHRoZSBuYW1lCi0gIG9mIHRoZSBleHRlcm5hbCB2YXJpYWJsZSBvZiB0eXBlIG1vZHVsZSBpbiB0aGUgc291cmNlIGZpbGUuCi0gIDwvUD4KLQotICA8SFI+Ci0gIDxIMj48QSBOQU1FPSJDb21wYXRpYmlsaXR5Ij5Db21wYXRpYmlsaXR5PC9BPjwvSDI+Ci0gIDxQPgotICBJZiB0aGUgbW9kdWxlIHdhcyBub3QgcGFydCBvZiB0aGUgb3JpZ2luYWwgQXBhY2hlIHZlcnNpb24gMgotICBkaXN0cmlidXRpb24sIHRoZSB2ZXJzaW9uIGluIHdoaWNoIGl0IHdhcyBpbnRyb2R1Y2VkIHNob3VsZCBiZSBsaXN0ZWQKLSAgaGVyZS4KLSAgPC9QPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLSA8L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kdWxlLWRpY3QuaHRtbC5lbiBiL2RvY3MvbWFudWFsL21vZC9tb2R1bGUtZGljdC5odG1sLmVuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTkwYmJiLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2R1bGUtZGljdC5odG1sLmVuCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotIDxIRUFEPgotICA8VElUTEU+RGVmaW5pdGlvbnMgb2YgdGVybXMgdXNlZCB0byBkZXNjcmliZSBBcGFjaGUgbW9kdWxlcwotICA8L1RJVExFPgotIDwvSEVBRD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLSA8Qk9EWQotICBCR0NPTE9SPSIjRkZGRkZGIgotICBURVhUPSIjMDAwMDAwIgotICBMSU5LPSIjMDAwMEZGIgotICBWTElOSz0iIzAwMDA4MCIKLSAgQUxJTks9IiNGRjAwMDAiCi0gPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLSAgPEgxIEFMSUdOPSJDRU5URVIiPlRlcm1zIFVzZWQgdG8gRGVzY3JpYmUgQXBhY2hlIE1vZHVsZXM8L0gxPgotCi0gIDxQPgotICBFYWNoIEFwYWNoZSBtb2R1bGUgaXMgZGVzY3JpYmVkIHVzaW5nIGEgY29tbW9uIGZvcm1hdCB0aGF0IGxvb2tzCi0gIGxpa2UgdGhpczoKLSAgPC9QPgotICA8REw+Ci0gICA8REQ+PEEKLSAgICAgICAgSFJFRj0iI1N0YXR1cyIKLSAgICAgICAgUkVMPSJIZWxwIgotICAgICAgID48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IDxFTT5zdGF0dXM8L0VNPgotICAgICAgIDxCUj4KLSAgICAgICA8QQotICAgICAgICBIUkVGPSIjU291cmNlRmlsZSIKLSAgICAgICAgUkVMPSJIZWxwIgotICAgICAgID48U1RST05HPlNvdXJjZSBGaWxlOjwvU1RST05HPjwvQT4gPEVNPnNvdXJjZS1maWxlPC9FTT4KLSAgICAgICA8QlI+Ci0gICAgICAgPEEKLSAgICAgICAgSFJFRj0iI01vZHVsZUlkZW50aWZpZXIiCi0gICAgICAgIFJFTD0iSGVscCIKLSAgICAgICA+PFNUUk9ORz5Nb2R1bGUgSWRlbnRpZmllcjo8L1NUUk9ORz48L0E+IDxFTT5tb2R1bGUtaWRlbnRpZmllcjwvRU0+Ci0gICAgICAgPEJSPgotICAgICAgIDxBCi0gICAgICAgIEhSRUY9IiNDb21wYXRpYmlsaXR5IgotICAgICAgICBSRUw9IkhlbHAiCi0gICAgICAgPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IDxFTT5jb21wYXRpYmlsaXR5IG5vdGVzPC9FTT4KLSAgIDwvREQ+Ci0gIDwvREw+Ci0gIDxQPgotICBFYWNoIG9mIHRoZSBhdHRyaWJ1dGVzLCBjb21wbGV0ZSB3aXRoIHZhbHVlcyB3aGVyZSBwb3NzaWJsZSwgYXJlCi0gIGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LgotICA8L1A+Ci0KLSAgPEgyPk1vZHVsZSBUZXJtczwvSDI+Ci0gIDxVTD4KLSAgIDxMST48QSBIUkVGPSIjU3RhdHVzIj5TdGF0dXM8L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNTb3VyY2VGaWxlIj5Tb3VyY2UgRmlsZTwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI01vZHVsZUlkZW50aWZpZXIiPk1vZHVsZSBJZGVudGlmaWVyPC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjQ29tcGF0aWJpbGl0eSI+Q29tcGF0aWJpbGl0eTwvQT4KLSAgIDwvTEk+Ci0gIDwvVUw+Ci0KLSAgPEhSPgotICA8SDI+PEEgTkFNRT0iU3RhdHVzIj5TdGF0dXM8L0E+PC9IMj4KLSAgPFA+Ci0gIFRoaXMgaW5kaWNhdGVzIGhvdyB0aWdodGx5IGJvdW5kIGludG8gdGhlIEFwYWNoZSBXZWIgc2VydmVyIHRoZQotICBtb2R1bGUgaXM7IGluIG90aGVyIHdvcmRzLCB5b3UgbWF5IG5lZWQgdG8gcmVjb21waWxlIHRoZSBzZXJ2ZXIgaW4KLSAgb3JkZXIgdG8gZ2FpbiBhY2Nlc3MgdG8gdGhlIG1vZHVsZSBhbmQgaXRzIGZ1bmN0aW9uYWxpdHkuICBQb3NzaWJsZQotICB2YWx1ZXMgZm9yIHRoaXMgYXR0cmlidXRlIGFyZToKLSAgPC9QPgotICA8REw+Ci0gICA8RFQ+PFNUUk9ORz5CYXNlPC9TVFJPTkc+Ci0gICA8L0RUPgotICAgPEREPkEgbW9kdWxlIGxhYmVsZWQgYXMgaGF2aW5nICZxdW90O0Jhc2UmcXVvdDsgc3RhdHVzIGlzIGNvbXBpbGVkCi0gICBhbmQgbG9hZGVkIGludG8gdGhlIHNlcnZlciBieSBkZWZhdWx0LCBhbmQgaXMgdGhlcmVmb3JlIG5vcm1hbGx5Ci0gICBhdmFpbGFibGUgdW5sZXNzIHlvdSBoYXZlIHRha2VuIHN0ZXBzIHRvIHJlbW92ZSB0aGUgbW9kdWxlIGZyb20geW91cgotICAgY29uZmlndXJhdGlvbi4KLSAgICA8UD4KLSAgICA8L1A+Ci0gICA8L0REPgotICAgPERUPjxTVFJPTkc+RXh0ZW5zaW9uPC9TVFJPTkc+Ci0gICA8L0RUPgotICAgPEREPkEgbW9kdWxlIHdpdGggJnF1b3Q7RXh0ZW5zaW9uJnF1b3Q7IHN0YXR1cyBpcyBub3Qgbm9ybWFsbHkKLSAgIGNvbXBpbGVkIGFuZCBsb2FkZWQgaW50byB0aGUgc2VydmVyLiAgVG8gZW5hYmxlIHRoZSBtb2R1bGUgYW5kIGl0cwotICAgZnVuY3Rpb25hbGl0eSwgeW91IG1heSBuZWVkIHRvIGNoYW5nZSB0aGUgc2VydmVyIGJ1aWxkCi0gICBjb25maWd1cmF0aW9uIGZpbGVzIGFuZCByZS1jb21waWxlIEFwYWNoZS4KLSAgICA8UD4KLSAgICA8L1A+Ci0gICA8L0REPgotICAgPERUPjxTVFJPTkc+RXhwZXJpbWVudGFsPC9TVFJPTkc+Ci0gICA8L0RUPgotICAgPEREPiZxdW90O0V4cGVyaW1lbnRhbCZxdW90OyBzdGF0dXMgaW5kaWNhdGVzIHRoYXQgdGhlIG1vZHVsZSBpcwotICAgIGF2YWlsYWJsZSBhcyBwYXJ0IG9mIHRoZSBBcGFjaGUga2l0LCBidXQgeW91IGFyZSBvbiB5b3VyIG93biBpZiB5b3UKLSAgICB0cnkgdG8gdXNlIGl0LiAgVGhlIG1vZHVsZSBpcyBiZWluZyBkb2N1bWVudGVkIGZvciBjb21wbGV0ZW5lc3MsCi0gICAgYW5kIGlzIG5vdCBuZWNlc3NhcmlseSBzdXBwb3J0ZWQuICAKLSAgICA8UD4KLSAgICA8L1A+Ci0gICA8L0REPgotICAgPERUPjxTVFJPTkc+RXh0ZXJuYWw8L1NUUk9ORz4KLSAgIDwvRFQ+Ci0gICA8REQ+TW9kdWxlcyB3aGljaCBhcmUgbm90IGluY2x1ZGVkIHdpdGggdGhlIGJhc2UgQXBhY2hlCi0gICBkaXN0cmlidXRpb24gKCZxdW90O3RoaXJkLXBhcnR5IG1vZHVsZXMmcXVvdDspIG1heSB1c2UgdGhlCi0gICAmcXVvdDtFeHRlcm5hbCZxdW90OyBzdGF0dXMuICBXZSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciwgbm9yIGRvIHdlCi0gICBzdXBwb3J0IHN1Y2ggbW9kdWxlcy4KLSAgICA8UD4KLSAgICA8L1A+Ci0gICA8L0REPgotICA8L0RMPgotCi0gIDxIUj4KLSAgPEgyPjxBIE5BTUU9IlNvdXJjZUZpbGUiPlNvdXJjZSBGaWxlPC9BPjwvSDI+Ci0gIDxQPgotICBUaGlzIHF1aXRlIHNpbXBseSBsaXN0cyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgd2hpY2ggY29udGFpbnMKLSAgdGhlIGNvZGUgZm9yIHRoZSBtb2R1bGUuICBUaGlzIGlzIGFsc28gdGhlIG5hbWUgdXNlZCBieSB0aGUgPEEKLSAgSFJFRj0iY29yZS5odG1sI2lmbW9kdWxlIj48Q09ERT4mbHQ7SWZNb2R1bGUmZ3Q7PC9DT0RFPjwvQT4KLSAgZGlyZWN0aXZlLgotICA8L1A+Ci0KLSAgPEhSPgotICA8SDI+PEEgTkFNRT0iTW9kdWxlSWRlbnRpZmllciI+TW9kdWxlIElkZW50aWZpZXI8L0E+PC9IMj4KLSAgPFA+Ci0gIFRoaXMgaXMgYSBzdHJpbmcgd2hpY2ggaWRlbnRpZmllcyB0aGUgbW9kdWxlIGZvciB1c2UgaW4gdGhlIDxBCi0gIEhSRUY9Im1vZF9zby5odG1sI2xvYWRtb2R1bGUiPkxvYWRNb2R1bGU8L0E+IGRpcmVjdGl2ZSB3aGVuCi0gIGR5bmFtaWNhbGx5IGxvYWRpbmcgbW9kdWxlcy4gIEluIHBhcnRpY3VsYXIsIGl0IGlzIHRoZSBuYW1lCi0gIG9mIHRoZSBleHRlcm5hbCB2YXJpYWJsZSBvZiB0eXBlIG1vZHVsZSBpbiB0aGUgc291cmNlIGZpbGUuCi0gIDwvUD4KLQotICA8SFI+Ci0gIDxIMj48QSBOQU1FPSJDb21wYXRpYmlsaXR5Ij5Db21wYXRpYmlsaXR5PC9BPjwvSDI+Ci0gIDxQPgotICBJZiB0aGUgbW9kdWxlIHdhcyBub3QgcGFydCBvZiB0aGUgb3JpZ2luYWwgQXBhY2hlIHZlcnNpb24gMgotICBkaXN0cmlidXRpb24sIHRoZSB2ZXJzaW9uIGluIHdoaWNoIGl0IHdhcyBpbnRyb2R1Y2VkIHNob3VsZCBiZSBsaXN0ZWQKLSAgaGVyZS4KLSAgPC9QPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLSA8L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbXBtX2NvbW1vbi5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21wbV9jb21tb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVkZDBiOC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbXBtX2NvbW1vbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIE1QTSBDb21tb24gRGlyZWN0aXZlczwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotCi08SDEgQUxJR049IkNFTlRFUiI+TXVsdGktUHJvY2Vzc2luZyBNb2R1bGUgQ29tbW9uIERpcmVjdGl2ZXM8L0gxPgotCi08UD5UaGlzIGZpbGUgZG9jdW1lbnRzIGRpcmVjdGl2ZXMgdGhhdCBhcmUgaW1wbGVtZW50ZWQgYnkgbW9yZQotdGhhbiBvbmUgbXVsdGktcHJvY2Vzc2luZyBtb2R1bGUgKE1QTSkuCi08L1A+Ci0KLTxIMj5EaXJlY3RpdmVzPC9IMj4KLTxVTD4KLTxsaT48YSBocmVmPSIjY29yZWR1bXBkaXJlY3RvcnkiPkNvcmVEdW1wRGlyZWN0b3J5PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI3BpZGZpbGUiPlBpZEZpbGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjbG9ja2ZpbGUiPkxvY2tGaWxlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI21heGNsaWVudHMiPk1heENsaWVudHM8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjbWF4cmVxdWVzdHNwZXJjaGlsZCI+TWF4UmVxdWVzdHNQZXJDaGlsZDwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNtYXhzcGFyZXRocmVhZHMiPk1heFNwYXJlVGhyZWFkczwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNtaW5zcGFyZXRocmVhZHMiPk1pblNwYXJlVGhyZWFkczwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNzY29yZWJvYXJkZmlsZSI+U2NvcmVCb2FyZEZpbGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjc3RhcnRzZXJ2ZXJzIj5TdGFydFNlcnZlcnM8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjdGhyZWFkc3BlcmNoaWxkIj5UaHJlYWRzUGVyQ2hpbGQ8L2E+PC9saT4KLTwvVUw+Ci08SFI+Ci0KLTxIMj48QSBOQU1FPSJjb3JlZHVtcGRpcmVjdG9yeSI+Q29yZUR1bXBEaXJlY3RvcnkgZGlyZWN0aXZlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgQ29yZUR1bXBEaXJlY3Rvcnl9IGRpcmVjdGl2ZSZndDsgLS0+Ci08cD48QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IENvcmVEdW1wRGlyZWN0b3J5IDxFTT5kaXJlY3Rvcnk8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiB0aGUgc2FtZSBsb2NhdGlvbiBhcyBTZXJ2ZXJSb290PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IE1QTTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbXBtdF9wdGhyZWFkLCBwcmVmb3JrPC9wPgotCi08cD5UaGlzIGNvbnRyb2xzIHRoZSBkaXJlY3RvcnkgdG8gd2hpY2ggQXBhY2hlIGF0dGVtcHRzIHRvIHN3aXRjaAotYmVmb3JlIGR1bXBpbmcgY29yZS4gIFRoZSBkZWZhdWx0IGlzIGluIHRoZSA8QQotSFJFRj0iY29yZS5odG1sI3NlcnZlcnJvb3QiPlNlcnZlclJvb3Q8L0E+IGRpcmVjdG9yeSwgaG93ZXZlciBzaW5jZQotdGhpcyBzaG91bGQgbm90IGJlIHdyaXRhYmxlIGJ5IHRoZSB1c2VyIHRoZSBzZXJ2ZXIgcnVucyBhcywgY29yZSBkdW1wcwotd29uJ3Qgbm9ybWFsbHkgZ2V0IHdyaXR0ZW4uICBJZiB5b3Ugd2FudCBhIGNvcmUgZHVtcCBmb3IgZGVidWdnaW5nLAoteW91IGNhbiB1c2UgdGhpcyBkaXJlY3RpdmUgdG8gcGxhY2UgaXQgaW4gYSBkaWZmZXJlbnQgbG9jYXRpb24uPFA+PEhSPgotCi08SDI+PEEgTkFNRT0icGlkZmlsZSI+UGlkRmlsZSBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBQaWRGaWxlfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHA+PEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBQaWRGaWxlIDxFTT5maWxlbmFtZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxDT0RFPlBpZEZpbGUgbG9ncy9odHRwZC5waWQ8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IE1QTTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbXBtdF9wdGhyZWFkLCBwcmVmb3JrPC9wPgotCi08cD5UaGUgUGlkRmlsZSBkaXJlY3RpdmUgc2V0cyB0aGUgZmlsZSB0byB3aGljaCB0aGUgc2VydmVyIHJlY29yZHMgdGhlCi1wcm9jZXNzIGlkIG9mIHRoZSBkYWVtb24uIElmIHRoZSBmaWxlbmFtZSBkb2VzIG5vdCBiZWdpbiB3aXRoIGEgc2xhc2gKLSgvKSB0aGVuIGl0IGlzIGFzc3VtZWQgdG8gYmUgcmVsYXRpdmUgdG8gdGhlIDxBCi1IUkVGPSJjb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvQT4uPC9wPgotCi08cD5JdCBpcyBvZnRlbiB1c2VmdWwgdG8gYmUgYWJsZSB0byBzZW5kIHRoZSBzZXJ2ZXIgYSBzaWduYWwsIHNvIHRoYXQKLWl0IGNsb3NlcyBhbmQgdGhlbiByZW9wZW5zIGl0cyA8QQotSFJFRj0iY29yZS5odG1sI2Vycm9ybG9nIj5FcnJvckxvZzwvQT4gYW5kIFRyYW5zZmVyTG9nLCBhbmQgcmUtcmVhZHMKLWl0cyBjb25maWd1cmF0aW9uIGZpbGVzLiBUaGlzIGlzIGRvbmUgYnkgc2VuZGluZyBhIFNJR0hVUCAoa2lsbCAtMSkKLXNpZ25hbCB0byB0aGUgcHJvY2VzcyBpZCBsaXN0ZWQgaW4gdGhlIFBpZEZpbGUuPC9wPgotCi08cD5UaGUgUGlkRmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIHdhcm5pbmdzIGFib3V0IGxvZyBmaWxlIHBsYWNlbWVudCBhbmQKLTxBIEhSRUY9Ii4uL21pc2Mvc2VjdXJpdHlfdGlwcy5odG1sI3NlcnZlcnJvb3QiPnNlY3VyaXR5PC9BPi48L3A+Ci0KLQotPFA+PEhSPgotCi0KLTxIMj48QSBOQU1FPSJsb2NrZmlsZSI+TG9ja0ZpbGUgZGlyZWN0aXZlPC9BPjwvSDI+Ci08cD48QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IExvY2tGaWxlIDxFTT5maWxlbmFtZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxDT0RFPkxvY2tGaWxlIGxvZ3MvYWNjZXB0LmxvY2s8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IE1QTTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbXBtdF9wdGhyZWFkLCBwcmVmb3JrPC9wPgotCi08cD5UaGUgTG9ja0ZpbGUgZGlyZWN0aXZlIHNldHMgdGhlIHBhdGggdG8gdGhlIGxvY2tmaWxlIHVzZWQgd2hlbgotQXBhY2hlIGlzIGNvbXBpbGVkIHdpdGggZWl0aGVyIFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVCBvcgotVVNFX0ZMT0NLX1NFUklBTElaRURfQUNDRVBULiAgVGhpcyBkaXJlY3RpdmUgc2hvdWxkIG5vcm1hbGx5IGJlCi1sZWZ0IGF0IGl0cyBkZWZhdWx0IHZhbHVlLiAgVGhlIG1haW4gcmVhc29uIGZvciBjaGFuZ2luZyBpdCBpcyBpZgotdGhlIDxDT0RFPmxvZ3M8L0NPREU+IGRpcmVjdG9yeSBpcyBORlMgbW91bnRlZCwgc2luY2UgPFNUUk9ORz50aGUgbG9ja2ZpbGUKLW11c3QgYmUgc3RvcmVkIG9uIGEgbG9jYWwgZGlzazwvU1RST05HPi4gIFRoZSBQSUQgb2YgdGhlIG1haW4KLXNlcnZlciBwcm9jZXNzIGlzIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQgdG8gdGhlIGZpbGVuYW1lLiA8UD4KLQotPHA+PFNUUk9ORz5TRUNVUklUWTo8L1NUUk9ORz4gSXQgaXMgYmVzdCB0byBhdm9pZCBwdXR0aW5nIHRoaXMgZmlsZSBpbiBhIAotd29ybGQgd3JpdGFibGUgZGlyZWN0b3J5IHN1Y2ggYXMgPENPREU+L3Zhci90bXA8L0NPREU+IGJlY2F1c2Ugc29tZW9uZSAKLWNvdWxkIGNyZWF0ZSBhIGRlbmlhbCBvZiBzZXJ2aWNlIGF0dGFjayBhbmQgcHJldmVudCB0aGUgc2VydmVyIGZyb20KLXN0YXJ0aW5nIGJ5IGNyZWF0aW5nIGEgbG9ja2ZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBvbmUgdGhlIAotc2VydmVyIHdpbGwgdHJ5IHRvIGNyZWF0ZS48L3A+Ci0KLTxocj4KLQotPEgyPjxBIE5BTUU9Im1heGNsaWVudHMiPk1heENsaWVudHMgZGlyZWN0aXZlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgTWF4Q2xpZW50c30gZGlyZWN0aXZlJmd0OyAtLT4KLTxwPjxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gTWF4Q2xpZW50cyA8RU0+bnVtYmVyPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+TWF4Q2xpZW50cyA4PC9jb2RlPiAod2l0aCB0aHJlYWRzKQotPGNvZGU+TWF4Q2xpZW50cyAyNTY8L2NvZGU+IChubyB0aHJlYWRzKTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBNUE08QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1wbXRfcHRocmVhZCwgcHJlZm9yazwvcD4KLQotPFA+VGhlIE1heENsaWVudHMgZGlyZWN0aXZlIHNldHMgdGhlIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgY2hpbGQKLXByb2Nlc3NlcyB0aGF0IHdpbGwgYmUgY3JlYXRlZCB0byBzZXJ2ZSByZXF1ZXN0cy4gIFdoZW4gdGhlIHNlcnZlciBpcwotYnVpbHQgd2l0aG91dCB0aHJlYWRpbmcsIG5vIG1vcmUgdGhhbiB0aGlzIG51bWJlciBvZiBjbGllbnRzIGNhbiBiZQotc2VydmVkIHNpbXVsdGFuZW91c2x5LiAgVG8gY29uZmlndXJlIG1vcmUgdGhhbiAyNTYgY2xpZW50cywgeW91IG11c3QKLWVkaXQgdGhlIDxjb2RlPkhBUkRfU0VSVkVSX0xJTUlUPC9jb2RlPiBlbnRyeSBpbgotPGNvZGU+bXBtX2RlZmF1bHQuaDwvY29kZT4gYW5kIHJlY29tcGlsZS4KLQotPFA+QW55IGNvbm5lY3Rpb24gYXR0ZW1wdHMgb3ZlciB0aGUgTWF4Q2xpZW50cyBsaW1pdCB3aWxsIG5vcm1hbGx5Ci1iZSBxdWV1ZWQsIHVwIHRvIGEgbnVtYmVyIGJhc2VkIG9uIHRoZSA8QSBIUkVGPSIjbGlzdGVuYmFja2xvZyI+Ci1MaXN0ZW5CYWNrbG9nPC9BPiBkaXJlY3RpdmUuICBPbmNlIGEgY2hpbGQgcHJvY2VzcyBpcyBmcmVlZCBhdCB0aGUKLWVuZCBvZiBhIGRpZmZlcmVudCByZXF1ZXN0LCB0aGUgY29ubmVjdGlvbiB3aWxsIHRoZW4gYmUgc2VydmljZWQuPC9wPgotCi08cD5XaGVuIHRoZSBzZXJ2ZXIgaXMgY29tcGlsZWQgd2l0aCB0aHJlYWRpbmcsIHRoZW4gdGhlIG1heGltdW0gbnVtYmVyCi1vZiBzaW11bHRhbmVvdXMgcmVxdWVzdHMgdGhhdCBjYW4gYmUgc2VydmVkIGlzIG9idGFpbmVkIGZyb20gdGhlIHZhbHVlCi1vZiB0aGlzIGRpcmVjdGl2ZSBtdWx0aXBsaWVkIGJ5IDxhCi1ocmVmPSIjdGhyZWFkc3BlcmNoaWxkIj5UaHJlYWRzUGVyQ2hpbGQ8L2E+LjwvcD4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0ibWF4cmVxdWVzdHNwZXJjaGlsZCI+TWF4UmVxdWVzdHNQZXJDaGlsZCBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBNYXhSZXF1ZXN0c1BlckNoaWxkfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHA+PEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBNYXhSZXF1ZXN0c1BlckNoaWxkIDxFTT5udW1iZXI8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5NYXhSZXF1ZXN0c1BlckNoaWxkIDEwMDAwPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBNUE08QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1wbXRfcHRocmVhZCwgcHJlZm9yazwvcD4KLQotPHA+VGhlIE1heFJlcXVlc3RzUGVyQ2hpbGQgZGlyZWN0aXZlIHNldHMgdGhlIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgcmVxdWVzdHMKLXRoYXQgYW4gaW5kaXZpZHVhbCBjaGlsZCBzZXJ2ZXIgcHJvY2VzcyB3aWxsIGhhbmRsZS4gQWZ0ZXIgTWF4UmVxdWVzdHNQZXJDaGlsZAotcmVxdWVzdHMsIHRoZSBjaGlsZCBwcm9jZXNzIHdpbGwgZGllLiBJZiBNYXhSZXF1ZXN0c1BlckNoaWxkIGlzIDAsIHRoZW4KLXRoZSBwcm9jZXNzIHdpbGwgbmV2ZXIgZXhwaXJlLjxQPgotCi1TZXR0aW5nIE1heFJlcXVlc3RzUGVyQ2hpbGQgdG8gYSBub24temVybyBsaW1pdCBoYXMgdHdvIGJlbmVmaWNpYWwgZWZmZWN0czoKLTxVTD4KLTxMST5pdCBsaW1pdHMgdGhlIGFtb3VudCBvZiBtZW1vcnkgdGhhdCBwcm9jZXNzIGNhbiBjb25zdW1lIGJ5IChhY2NpZGVudGFsKQotbWVtb3J5IGxlYWthZ2U7Ci08TEk+IGJ5IGdpdmluZyBwcm9jZXNzZXMgYSBmaW5pdGUgbGlmZXRpbWUsIGl0IGhlbHBzIHJlZHVjZSB0aGUKLW51bWJlciBvZiBwcm9jZXNzZXMgd2hlbiB0aGUgc2VydmVyIGxvYWQgcmVkdWNlcy4KLTwvVUw+Ci0KLTxQPjxTVFJPTkc+Tk9URTo8L1NUUk9ORz4gRm9yIDxFTT5LZWVwQWxpdmU8L0VNPiByZXF1ZXN0cywgb25seSB0aGUgZmlyc3QKLXJlcXVlc3QgaXMgY291bnRlZCB0b3dhcmRzIHRoaXMgbGltaXQuIEluIGVmZmVjdCwgaXQgY2hhbmdlcyB0aGUKLWJlaGF2aW9yIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgPEVNPmNvbm5lY3Rpb25zPC9FTT4gcGVyIGNoaWxkLgotCi08UD48SFI+Ci0KLQotPEgyPjxBIE5BTUU9Im1heHNwYXJldGhyZWFkcyI+TWF4U3BhcmVUaHJlYWRzIGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IE1heFNwYXJlU2VydmVyc30gZGlyZWN0aXZlJmd0OyAtLT4KLTxwPjxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gTWF4U3BhcmVUaHJlYWRzIDxFTT5udW1iZXI8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5NYXhTcGFyZVRocmVhZHMgPz88L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGNvcmU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1wbXRfcHRocmVhZDwvcD4KLQotPFA+Q29udGVudCBuZWVkZWQgaGVyZSE8L3A+Ci0KLTxwPlNlZSBhbHNvIDxBIEhSRUY9IiNtaW5zcGFyZXRocmVhZHMiPk1pblNwYXJlVGhyZWFkczwvQT4gYW5kCi08QSBIUkVGPSIjc3RhcnRzZXJ2ZXJzIj5TdGFydFNlcnZlcnM8L0E+LgotCi08UD48SFI+Ci0KLTxIMj48QSBOQU1FPSJtaW5zcGFyZXRocmVhZHMiPk1pblNwYXJlVGhyZWFkcyBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBNaW5TcGFyZVNlcnZlcnN9IGRpcmVjdGl2ZSZndDsgLS0+Ci08cD48QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IE1pblNwYXJlU2VydmVycyA8RU0+bnVtYmVyPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+TWluU3BhcmVTZXJ2ZXJzID8/PzwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gY29yZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbXBtdF9wdGhyZWFkPC9wPgotCi08cD48c3Ryb25nPmZpeCBtZTwvc3Ryb25nPjwvcD4KLQotPHA+VGhlIE1pblNwYXJlU2VydmVycyBkaXJlY3RpdmUgc2V0cyB0aGUgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiA8RU0+aWRsZTwvRU0+Ci1jaGlsZCBzZXJ2ZXIgcHJvY2Vzc2VzLiBBbiBpZGxlIHByb2Nlc3MgaXMgb25lIHdoaWNoIGlzIG5vdCBoYW5kbGluZwotYSByZXF1ZXN0LiBJZiB0aGVyZSBhcmUgZmV3ZXIgdGhhbiBNaW5TcGFyZVNlcnZlcnMgaWRsZSwgdGhlbiB0aGUgcGFyZW50Ci1wcm9jZXNzIGNyZWF0ZXMgbmV3IGNoaWxkcmVuIGF0IGEgbWF4aW11bSByYXRlIG9mIDEgcGVyIHNlY29uZC48UD4KLQotVHVuaW5nIG9mIHRoaXMgcGFyYW1ldGVyIHNob3VsZCBvbmx5IGJlIG5lY2Vzc2FyeSBvbiB2ZXJ5IGJ1c3kgc2l0ZXMuCi1TZXR0aW5nIHRoaXMgcGFyYW1ldGVyIHRvIGEgbGFyZ2UgbnVtYmVyIGlzIGFsbW9zdCBhbHdheXMgYSBiYWQgaWRlYS48UD4KLQotVGhpcyBkaXJlY3RpdmUgaGFzIG5vIGVmZmVjdCBvbiBNaWNyb3NvZnQgV2luZG93cy4KLQotPFA+Ci0KLVNlZSBhbHNvIDxBIEhSRUY9IiNtYXhzcGFyZXRocmVhZHMiPk1heFNwYXJlVGhyZWFkczwvQT4gYW5kCi08QSBIUkVGPSIjc3RhcnRzZXJ2ZXJzIj5TdGFydFNlcnZlcnM8L0E+LjxQPjxIUj4KLQotCi08SDI+PEEgTkFNRT0ic2NvcmVib2FyZGZpbGUiPlNjb3JlQm9hcmRGaWxlIGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IFNjb3JlQm9hcmRGaWxlfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPHA+PEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBTY29yZUJvYXJkRmlsZSA8RU0+ZmlsZW5hbWU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5TY29yZUJvYXJkRmlsZSBsb2dzL2FwYWNoZV9zdGF0dXM8L0NPREU+Ci08QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gTVBNPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtcG10X3B0aHJlYWQsIHByZWZvcms8L3A+Ci0KLTxwPlRoZSBTY29yZUJvYXJkRmlsZSBkaXJlY3RpdmUgaXMgcmVxdWlyZWQgb24gc29tZSBhcmNoaXRlY3R1cmVzIHRvIHBsYWNlCi1hIGZpbGUgdGhhdCB0aGUgc2VydmVyIHdpbGwgdXNlIHRvIGNvbW11bmljYXRlIGJldHdlZW4gaXRzIGNoaWxkcmVuIGFuZAotdGhlIHBhcmVudC4gIFRoZSBlYXNpZXN0IHdheSB0byBmaW5kIG91dCBpZiB5b3VyIGFyY2hpdGVjdHVyZSByZXF1aXJlcwotYSBzY29yZWJvYXJkIGZpbGUgaXMgdG8gcnVuIEFwYWNoZSBhbmQgc2VlIGlmIGl0IGNyZWF0ZXMgdGhlIGZpbGUgbmFtZWQKLWJ5IHRoZSBkaXJlY3RpdmUuICBJZiB5b3VyIGFyY2hpdGVjdHVyZSByZXF1aXJlcyBpdCB0aGVuIHlvdSBtdXN0IGVuc3VyZQotdGhhdCB0aGlzIGZpbGUgaXMgbm90IHVzZWQgYXQgdGhlIHNhbWUgdGltZSBieSBtb3JlIHRoYW4gb25lIGludm9jYXRpb24KLW9mIEFwYWNoZS48L3A+Ci0KLTxwPklmIHlvdSBoYXZlIHRvIHVzZSBhIFNjb3JlQm9hcmRGaWxlIHRoZW4geW91IG1heSBzZWUgaW1wcm92ZWQgc3BlZWQgYnkKLXBsYWNpbmcgaXQgb24gYSBSQU0gZGlzay4gIEJ1dCBiZSBjYXJlZnVsIHRoYXQgeW91IGhlZWQgdGhlIHNhbWUgd2FybmluZ3MKLWFib3V0IGxvZyBmaWxlIHBsYWNlbWVudCBhbmQKLTxBIEhSRUY9Ii4uL21pc2Mvc2VjdXJpdHlfdGlwcy5odG1sIj5zZWN1cml0eTwvQT4uPC9wPgotCi08cD48U1RST05HPlNlZSBBbHNvPC9TVFJPTkc+OgotPEEgSFJFRj0iLi4vc3RvcHBpbmcuaHRtbCI+U3RvcHBpbmcgYW5kIFJlc3RhcnRpbmcgQXBhY2hlPC9BPjwvUD4KLQotCi08UD48SFI+Ci0KLTxIMj48QSBOQU1FPSJzdGFydHNlcnZlcnMiPlN0YXJ0U2VydmVycyBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBTdGFydFNlcnZlcnN9IGRpcmVjdGl2ZSZndDsgLS0+Ci08cD48QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFN0YXJ0U2VydmVycyA8RU0+bnVtYmVyPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+U3RhcnRTZXJ2ZXJzIDU8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IE1QTTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbXBtdF9wdGhyZWFkLCBwcmVmb3JrPC9wPgotCi08cD5UaGUgU3RhcnRTZXJ2ZXJzIGRpcmVjdGl2ZSBzZXRzIHRoZSBudW1iZXIgb2YgY2hpbGQgc2VydmVyIHByb2Nlc3NlcyBjcmVhdGVkCi1vbiBzdGFydHVwLiBBcyB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlcyBpcyBkeW5hbWljYWxseSBjb250cm9sbGVkIGRlcGVuZGluZwotb24gdGhlIGxvYWQsIHRoZXJlIGlzIHVzdWFsbHkgbGl0dGxlIHJlYXNvbiB0byBhZGp1c3QgdGhpcyBwYXJhbWV0ZXIuPC9QPgotCi08UD5TZWUgYWxzbyA8QSBIUkVGPSIjbWluc3BhcmV0aHJlYWRzIj5NaW5TcGFyZVRocmVhZHM8L0E+IGFuZAotPEEgSFJFRj0iI21heHNwYXJldGhyZWFkcyI+TWF4U3BhcmVUaHJlYWRzPC9BPi48UD48SFI+Ci0KLTxIMj48QSBOQU1FPSJ0aHJlYWRzcGVyY2hpbGQiPlRocmVhZHNQZXJDaGlsZDwvQT48L0gyPgotPHA+PEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBUaHJlYWRzUGVyQ2hpbGQgPEVNPm51bWJlcjwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxDT0RFPlRocmVhZHNQZXJDaGlsZCA1MDwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbXBtdF9wdGhyZWFkPC9wPgotCi08UD5UaGlzIGRpcmVjdGl2ZSBzZXRzIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBjcmVhdGVkIGJ5IGVhY2ggY2hpbGQKLXByb2Nlc3MuPC9wPgotCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbXBtX2NvbW1vbi54bWwgYi9kb2NzL21hbnVhbC9tb2QvbXBtX2NvbW1vbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlM2U0YjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21wbV9jb21tb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iLi4vc3R5bGUvbWFudWFsLnhzbCI/PgotPG1vZHVsZXN5bm9wc2lzPgotCi08bmFtZT5tcG1fY29tbW9uPC9uYW1lPgotPGRlc2NyaXB0aW9uPkEgY29sbGVjdGlvbiBvZiBkaXJlY3RpdmVzIHRoYXQgYXJlIGltcGxlbWVudGVkIGJ5Ci1tb3JlIHRoYW4gb25lIG11bHRpLXByb2Nlc3NpbmcgbW9kdWxlIChNUE0pPC9kZXNjcmlwdGlvbj4KLTxzdGF0dXM+TVBNPC9zdGF0dXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkNvcmVEdW1wRGlyZWN0b3J5PC9uYW1lPgotPGRlc2NyaXB0aW9uPlNldHMgdGhlIGRpcmVjdG9yeSB3aGVyZSBBcGFjaGUgYXR0ZW1wdHMgdG8KLXN3aXRjaCBiZWZvcmUgZHVtcGluZyBjb3JlPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+Q29yZUR1bXBEaXJlY3RvcnkgPGVtPmRpcmVjdG9yeTwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5Db3JlRHVtcERpcmVjdG9yeSA8ZW0+U2VydmVyUm9vdDwvZW0+PC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLTxtb2R1bGVsaXN0Pjxtb2R1bGU+d29ya2VyPC9tb2R1bGU+PG1vZHVsZT5wZXJjaGlsZDwvbW9kdWxlPgotPG1vZHVsZT5wcmVmb3JrPC9tb2R1bGU+PG1vZHVsZT5tcG1fd2lubnQ8L21vZHVsZT4KLTwvbW9kdWxlbGlzdD4KLQotPHVzYWdlPgotCi0gICAgPHA+VGhpcyBjb250cm9scyB0aGUgZGlyZWN0b3J5IHRvIHdoaWNoIEFwYWNoZSBhdHRlbXB0cyB0bwotICAgIHN3aXRjaCBiZWZvcmUgZHVtcGluZyBjb3JlLiBUaGUgZGVmYXVsdCBpcyBpbiB0aGUgCi0gICAgPGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiPlNlcnZlclJvb3Q8L2RpcmVjdGl2ZT4gZGlyZWN0b3J5LCBob3dldmVyCi0gICAgc2luY2UgdGhpcyBzaG91bGQgbm90IGJlIHdyaXRhYmxlIGJ5IHRoZSB1c2VyIHRoZSBzZXJ2ZXIgcnVucwotICAgIGFzLCBjb3JlIGR1bXBzIHdvbid0IG5vcm1hbGx5IGdldCB3cml0dGVuLiBJZiB5b3Ugd2FudCBhIGNvcmUKLSAgICBkdW1wIGZvciBkZWJ1Z2dpbmcsIHlvdSBjYW4gdXNlIHRoaXMgZGlyZWN0aXZlIHRvIHBsYWNlIGl0IGluIGEKLSAgICBkaWZmZXJlbnQgbG9jYXRpb24uPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkdyb3VwPC9uYW1lPgotPGRlc2NyaXB0aW9uPlNldHMgdGhlIGdyb3VwIHVuZGVyIHdoaWNoIHRoZSBzZXJ2ZXIgd2lsbCBhbnN3ZXIKLXJlcXVlc3RzPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+R3JvdXAgPGVtPnVuaXgtZ3JvdXA8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+R3JvdXAgIy0xPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PGNvbnRleHQ+dmlydHVhbCBob3N0PC9jb250ZXh0PgotPC9jb250ZXh0bGlzdD4KLTxtb2R1bGVsaXN0Pjxtb2R1bGU+d29ya2VyPC9tb2R1bGU+PG1vZHVsZT5wZXJjaGlsZDwvbW9kdWxlPgotPG1vZHVsZT5wcmVmb3JrPC9tb2R1bGU+PC9tb2R1bGVsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIDxkaXJlY3RpdmU+R3JvdXA8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIHNldHMgdGhlIGdyb3VwIHVuZGVyCi0gICAgd2hpY2ggdGhlIHNlcnZlciB3aWxsIGFuc3dlciByZXF1ZXN0cy4gSW4gb3JkZXIgdG8gdXNlIHRoaXMKLSAgICBkaXJlY3RpdmUsIHRoZSBzdGFuZC1hbG9uZSBzZXJ2ZXIgbXVzdCBiZSBydW4gaW5pdGlhbGx5IGFzIHJvb3QuCi0gICAgPGVtPlVuaXgtZ3JvdXA8L2VtPiBpcyBvbmUgb2Y6PC9wPgotCi0gICAgPGRsPgotICAgICAgPGR0PkEgZ3JvdXAgbmFtZTwvZHQ+Ci0KLSAgICAgIDxkZD5SZWZlcnMgdG8gdGhlIGdpdmVuIGdyb3VwIGJ5IG5hbWUuPC9kZD4KLQotICAgICAgPGR0PiMgZm9sbG93ZWQgYnkgYSBncm91cCBudW1iZXIuPC9kdD4KLQotICAgICAgPGRkPlJlZmVycyB0byBhIGdyb3VwIGJ5IGl0cyBudW1iZXIuPC9kZD4KLSAgICA8L2RsPgotICAgIDxwPkl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IHNldCB1cCBhIG5ldyBncm91cCBzcGVjaWZpY2FsbHkgZm9yCi0gICAgcnVubmluZyB0aGUgc2VydmVyLiBTb21lIGFkbWlucyB1c2UgdXNlciA8Y29kZT5ub2JvZHk8L2NvZGU+LAotICAgIGJ1dCB0aGlzIGlzIG5vdCBhbHdheXMgcG9zc2libGUgb3IgZGVzaXJhYmxlLjwvcD4KLQotICAgIDxwPk5vdGU6IGlmIHlvdSBzdGFydCB0aGUgc2VydmVyIGFzIGEgbm9uLXJvb3QgdXNlciwgaXQgd2lsbAotICAgIGZhaWwgdG8gY2hhbmdlIHRvIHRoZSBzcGVjaWZpZWQgZ3JvdXAsIGFuZCB3aWxsIGluc3RlYWQKLSAgICBjb250aW51ZSB0byBydW4gYXMgdGhlIGdyb3VwIG9mIHRoZSBvcmlnaW5hbCB1c2VyLjwvcD4KLQotICAgIDxwPlNwZWNpYWwgbm90ZTogVXNlIG9mIHRoaXMgZGlyZWN0aXZlIGluICZsdDtWaXJ0dWFsSG9zdCZsdDsgaXMKLSAgICBubyBsb25nZXIgc3VwcG9ydGVkLiBUbyBpbXBsZW1lbnQgdGhlIDxhCi0gICAgaHJlZj0iLi4vc3VleGVjLmh0bWwiPnN1RVhFQyB3cmFwcGVyPC9hPiB3aXRoIEFwYWNoZSAyLjAsIHVzZSB0aGUKLSAgICA8ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX3N1ZXhlYyI+U3VleGVjVXNlckdyb3VwPC9kaXJlY3RpdmU+Ci0gICAgZGlyZWN0aXZlLiBTRUNVUklUWTogU2VlIDxkaXJlY3RpdmUKLSAgICBtb2R1bGU9Im1wbV9jb21tb24iPlVzZXI8L2RpcmVjdGl2ZT4gZm9yIGEgZGlzY3Vzc2lvbiBvZiB0aGUKLSAgICBzZWN1cml0eSBjb25zaWRlcmF0aW9ucy48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+UGlkRmlsZTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5TZXRzIHRoZSBmaWxlIHdoZXJlIHRoZSBzZXJ2ZXIgcmVjb3JkcyB0aGUgcHJvY2VzcyBJRAotb2YgdGhlIGRhZW1vbjwvZGVzY3JpcHRpb24+Ci08c3ludGF4PlBpZEZpbGUgPGVtPmZpbGVuYW1lPC9lbT48L3N5bnRheD4KLTxkZWZhdWx0PlBpZEZpbGUgbG9ncy9odHRwZC5waWQ8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPG1vZHVsZWxpc3Q+PG1vZHVsZT53b3JrZXI8L21vZHVsZT48bW9kdWxlPnBlcmNoaWxkZTwvbW9kdWxlPgotPG1vZHVsZT5wcmVmb3JrPC9tb2R1bGU+PG1vZHVsZT5tcG1fd2lubnQ8L21vZHVsZT4KLTwvbW9kdWxlbGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPlBpZEZpbGU8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIHNldHMgdGhlIGZpbGUgdG8KLSAgICB3aGljaCB0aGUgc2VydmVyIHJlY29yZHMgdGhlIHByb2Nlc3MgaWQgb2YgdGhlIGRhZW1vbi4gSWYgdGhlCi0gICAgZmlsZW5hbWUgZG9lcyBub3QgYmVnaW4gd2l0aCBhIHNsYXNoICgvKSB0aGVuIGl0IGlzIGFzc3VtZWQgdG8gYmUKLSAgICByZWxhdGl2ZSB0byB0aGUgPGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiPlNlcnZlclJvb3Q8L2RpcmVjdGl2ZT4uPC9wPgotCi0gICAgPHA+SXQgaXMgb2Z0ZW4gdXNlZnVsIHRvIGJlIGFibGUgdG8gc2VuZCB0aGUgc2VydmVyIGEgc2lnbmFsLAotICAgIHNvIHRoYXQgaXQgY2xvc2VzIGFuZCB0aGVuIHJlb3BlbnMgaXRzIDxkaXJlY3RpdmUKLSAgICBtb2R1bGU9ImNvcmUiPkVycm9yTG9nPC9kaXJlY3RpdmU+IGFuZCBUcmFuc2ZlckxvZywgYW5kCi0gICAgcmUtcmVhZHMgaXRzIGNvbmZpZ3VyYXRpb24gZmlsZXMuIFRoaXMgaXMgZG9uZSBieSBzZW5kaW5nIGEKLSAgICBTSUdIVVAgKGtpbGwgLTEpIHNpZ25hbCB0byB0aGUgcHJvY2VzcyBpZCBsaXN0ZWQgaW4gdGhlCi0gICAgUGlkRmlsZS48L3A+Ci0KLSAgICA8cD5UaGUgUGlkRmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIHdhcm5pbmdzIGFib3V0IGxvZyBmaWxlCi0gICAgcGxhY2VtZW50IGFuZCA8YQotICAgIGhyZWY9Ii4uL21pc2Mvc2VjdXJpdHlfdGlwcy5odG1sI3NlcnZlcnJvb3QiPnNlY3VyaXR5PC9hPi48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+TGlzdGVuPC9uYW1lPgotPGRlc2NyaXB0aW9uPlNldHMgdGhlIElQIGFkZHJlc3NlcyBhbmQgcG9ydHMgdGhhdCB0aGUgc2VydmVyCi1saXN0ZW5zIHRvPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+TGlzdGVuIFs8ZW0+SVAtYWRkcmVzczwvZW0+Ol08ZW0+cG9ydG51bWJlcjwvZW0+PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPG1vZHVsZWxpc3Q+PG1vZHVsZT53b3JrZXI8L21vZHVsZT48bW9kdWxlPnBlcmNoaWxkPC9tb2R1bGU+Ci08bW9kdWxlPnByZWZvcms8L21vZHVsZT48bW9kdWxlPm1wbV93aW5udDwvbW9kdWxlPgotPC9tb2R1bGVsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIDxkaXJlY3RpdmU+TGlzdGVuPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBpbnN0cnVjdHMgQXBhY2hlIHRvCi0gICAgbGlzdGVuIHRvIG9ubHkgc3BlY2lmaWMgSVAgYWRkcmVzc2VzIG9yIHBvcnRzOyBieSBkZWZhdWx0IGl0Ci0gICAgcmVzcG9uZHMgdG8gcmVxdWVzdHMgb24gYWxsIElQIGludGVyZmFjZXMuIFRoZSBMaXN0ZW4gZGlyZWN0aXZlIGlzCi0gICAgbm93IGEgcmVxdWlyZWQgZGlyZWN0aXZlLiBJZiBpdCBpcyBub3QgaW4gdGhlIGNvbmZpZyBmaWxlLCB0aGUKLSAgICBzZXJ2ZXIgd2lsbCBmYWlsIHRvIHN0YXJ0LiBUaGlzIGlzIGEgY2hhbmdlIGZyb20gcHJldmlvdXMgdmVyc2lvbnMKLSAgICBvZiBBcGFjaGUuPC9wPgotCi0gICAgPHA+VGhlIExpc3RlbiBkaXJlY3RpdmUgdGVsbHMgdGhlIHNlcnZlciB0byBhY2NlcHQgaW5jb21pbmcKLSAgICByZXF1ZXN0cyBvbiB0aGUgc3BlY2lmaWVkIHBvcnQgb3IgYWRkcmVzcy1hbmQtcG9ydCBjb21iaW5hdGlvbi4KLSAgICBJZiBvbmx5IGEgcG9ydCBudW1iZXIgaXMgc3BlY2lmaWVkLCB0aGUgc2VydmVyIGxpc3RlbnMgdG8gdGhlCi0gICAgZ2l2ZW4gcG9ydCBvbiBhbGwgaW50ZXJmYWNlcy4gSWYgYW4gSVAgYWRkcmVzcyBpcyBnaXZlbiBhcyB3ZWxsIAotICAgIGFzIGEgcG9ydCwgdGhlIHNlcnZlciB3aWxsIGxpc3RlbiBvbiB0aGUgZ2l2ZW4gcG9ydCBhbmQKLSAgICBpbnRlcmZhY2UuPC9wPgotCi0gICAgPHA+TXVsdGlwbGUgTGlzdGVuIGRpcmVjdGl2ZXMgbWF5IGJlIHVzZWQgdG8gc3BlY2lmeSBhIG51bWJlcgotICAgIG9mIGFkZHJlc3NlcyBhbmQgcG9ydHMgdG8gbGlzdGVuIHRvLiBUaGUgc2VydmVyIHdpbGwgcmVzcG9uZCB0bwotICAgIHJlcXVlc3RzIGZyb20gYW55IG9mIHRoZSBsaXN0ZWQgYWRkcmVzc2VzIGFuZCBwb3J0cy48L3A+Ci0KLSAgICA8cD5Gb3IgZXhhbXBsZSwgdG8gbWFrZSB0aGUgc2VydmVyIGFjY2VwdCBjb25uZWN0aW9ucyBvbiBib3RoCi0gICAgcG9ydCA4MCBhbmQgcG9ydCA4MDAwLCB1c2U6PC9wPgotPGV4YW1wbGU+Ci0gICBMaXN0ZW4gODA8YnIgLz4KLSAgIExpc3RlbiA4MDAwCi08L2V4YW1wbGU+Ci0gICAgVG8gbWFrZSB0aGUgc2VydmVyIGFjY2VwdCBjb25uZWN0aW9ucyBvbiB0d28gc3BlY2lmaWVkCi0gICAgaW50ZXJmYWNlcyBhbmQgcG9ydCBudW1iZXJzLCB1c2UgCi08ZXhhbXBsZT4KLSAgIExpc3RlbiAxOTIuMTcwLjIuMTo4MDxiciAvPgotICAgTGlzdGVuIDE5Mi4xNzAuMi41OjgwMDAKLTwvZXhhbXBsZT4KLSAgICBJUHY2IGFkZHJlc3NlcyBtdXN0IGJlIHN1cnJvdW5kZWQgaW4gc3F1YXJlIGJyYWNrZXRzLCBhcyBpbiB0aGUKLSAgICBmb2xsb3dpbmcgZXhhbXBsZToKLTxleGFtcGxlPgotICAgTGlzdGVuIFtmZTgwOjphMDA6MjBmZjpmZWE3OmNjZWFdOjgwCi08L2V4YW1wbGU+Ci08L3VzYWdlPgotCi08c2VlYWxzbz48YSBocmVmPSIuLi9kbnMtY2F2ZWF0cy5odG1sIj5ETlMgSXNzdWVzPC9hPjwvc2VlYWxzbz4KLTxzZWVhbHNvPjxhIGhyZWY9Ii4uL2JpbmQuaHRtbCI+U2V0dGluZwotICAgIHdoaWNoIGFkZHJlc3NlcyBhbmQgcG9ydHMgQXBhY2hlIHVzZXM8L2E+PC9zZWVhbHNvPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+TGlzdGVuQmFja0xvZzwvbmFtZT4KLTxkZXNjcmlwdGlvbj5NYXhpbXVtIGxlbmd0aCBvZiB0aGUgcXVldWUgb2YgcGVuZGluZyBjb25uZWN0aW9uczwvZGVzY3JpcHRpb24+Ci08c3ludGF4Pkxpc3RlbkJhY2tsb2cgPGVtPmJhY2tsb2c8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+TGlzdGVuQmFja2xvZyA1MTE8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPG1vZHVsZWxpc3Q+PG1vZHVsZT53b3JrZXI8L21vZHVsZT48bW9kdWxlPnBlcmNoaWxkPC9tb2R1bGU+Ci08bW9kdWxlPnByZWZvcms8L21vZHVsZT48bW9kdWxlPm1wbV93aW5udDwvbW9kdWxlPgotPC9tb2R1bGVsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBxdWV1ZSBvZiBwZW5kaW5nIGNvbm5lY3Rpb25zLgotICAgIEdlbmVyYWxseSBubyB0dW5pbmcgaXMgbmVlZGVkIG9yIGRlc2lyZWQsIGhvd2V2ZXIgb24gc29tZQotICAgIHN5c3RlbXMgaXQgaXMgZGVzaXJhYmxlIHRvIGluY3JlYXNlIHRoaXMgd2hlbiB1bmRlciBhIFRDUCBTWU4KLSAgICBmbG9vZCBhdHRhY2suIFNlZSB0aGUgYmFja2xvZyBwYXJhbWV0ZXIgdG8gdGhlCi0gICAgPGNvZGU+bGlzdGVuKDIpPC9jb2RlPiBzeXN0ZW0gY2FsbC48L3A+Ci0KLSAgICA8cD5UaGlzIHdpbGwgb2Z0ZW4gYmUgbGltaXRlZCB0byBhIHNtYWxsZXIgbnVtYmVyIGJ5IHRoZQotICAgIG9wZXJhdGluZyBzeXN0ZW0uIFRoaXMgdmFyaWVzIGZyb20gT1MgdG8gT1MuIEFsc28gbm90ZSB0aGF0Ci0gICAgbWFueSBPU2VzIGRvIG5vdCB1c2UgZXhhY3RseSB3aGF0IGlzIHNwZWNpZmllZCBhcyB0aGUgYmFja2xvZywKLSAgICBidXQgdXNlIGEgbnVtYmVyIGJhc2VkIG9uIChidXQgbm9ybWFsbHkgbGFyZ2VyIHRoYW4pIHdoYXQgaXMKLSAgICBzZXQuPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkxvY2tGaWxlPC9uYW1lPgotPGRlc2NyaXB0aW9uPkxvY2F0aW9uIG9mIHRoZSBhY2NlcHQgc2VyaWFsaXphdGlvbiBsb2NrIGZpbGU8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5Mb2NrRmlsZSA8ZW0+ZmlsZW5hbWU8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+TG9ja0ZpbGUgbG9ncy9hY2NlcHQubG9jazwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci08bW9kdWxlbGlzdD48bW9kdWxlPndvcmtlcjwvbW9kdWxlPjxtb2R1bGU+cGVyY2hpbGQ8L21vZHVsZT4KLTxtb2R1bGU+cHJlZm9yazwvbW9kdWxlPjwvbW9kdWxlbGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPkxvY2tGaWxlPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBzZXRzIHRoZSBwYXRoIHRvCi0gICAgdGhlIGxvY2tmaWxlIHVzZWQgd2hlbiBBcGFjaGUgaXMgY29tcGlsZWQgd2l0aCBlaXRoZXIKLSAgICBVU0VfRkNOVExfU0VSSUFMSVpFRF9BQ0NFUFQgb3IgVVNFX0ZMT0NLX1NFUklBTElaRURfQUNDRVBULiBUaGlzCi0gICAgZGlyZWN0aXZlIHNob3VsZCBub3JtYWxseSBiZSBsZWZ0IGF0IGl0cyBkZWZhdWx0IHZhbHVlLiBUaGUgbWFpbgotICAgIHJlYXNvbiBmb3IgY2hhbmdpbmcgaXQgaXMgaWYgdGhlIDxjb2RlPmxvZ3M8L2NvZGU+IGRpcmVjdG9yeSBpcwotICAgIE5GUyBtb3VudGVkLCBzaW5jZSA8c3Ryb25nPnRoZSBsb2NrZmlsZSBtdXN0IGJlIHN0b3JlZCBvbiBhIGxvY2FsCi0gICAgZGlzazwvc3Ryb25nPi4gIFRoZSBQSUQgb2YgdGhlIG1haW4gc2VydmVyIHByb2Nlc3MgaXMKLSAgICBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIHRvIHRoZSBmaWxlbmFtZS48L3A+Ci0KLSAgICA8cD48c3Ryb25nPlNFQ1VSSVRZOjwvc3Ryb25nPiBJdCBpcyBiZXN0IHRvIGF2b2lkIHB1dHRpbmcgdGhpcwotICAgIGZpbGUgaW4gYSB3b3JsZCB3cml0YWJsZSBkaXJlY3Rvcnkgc3VjaCBhcwotICAgIDxjb2RlPi92YXIvdG1wPC9jb2RlPiBiZWNhdXNlIHNvbWVvbmUgY291bGQgY3JlYXRlIGEgZGVuaWFsIG9mCi0gICAgc2VydmljZSBhdHRhY2sgYW5kIHByZXZlbnQgdGhlIHNlcnZlciBmcm9tIHN0YXJ0aW5nIGJ5IGNyZWF0aW5nCi0gICAgYSBsb2NrZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIG9uZSB0aGUgc2VydmVyIHdpbGwgdHJ5IHRvCi0gICAgY3JlYXRlLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5NYXhDbGllbnRzPC9uYW1lPgotPGRlc2NyaXB0aW9uPk1heGltdW0gbnVtYmVyIG9mIGNoaWxkIHByb2Nlc3NlcyB0aGF0IHdpbGwgYmUgY3JlYXRlZAotdG8gc2VydmUgcmVxdWVzdHM8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5NYXhDbGllbnRzIDxlbT5udW1iZXI8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+Pk1heENsaWVudHMKLSAgICA4ICh3aXRoIHRocmVhZHMpIE1heENsaWVudHMgMjU2PC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLTxtb2R1bGVsaXN0Pjxtb2R1bGU+d29ya2VyPC9tb2R1bGU+PG1vZHVsZT5wcmVmb3JrPC9tb2R1bGU+Ci08L21vZHVsZWxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5NYXhDbGllbnRzPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBzZXRzIHRoZSBsaW1pdAotICAgIG9uIHRoZSBudW1iZXIgb2YgY2hpbGQgcHJvY2Vzc2VzIHRoYXQgd2lsbCBiZSBjcmVhdGVkIHRvIHNlcnZlCi0gICAgcmVxdWVzdHMuIFdoZW4gdGhlIHNlcnZlciBpcyBidWlsdCB3aXRob3V0IHRocmVhZGluZywgbm8gbW9yZSB0aGFuCi0gICAgdGhpcyBudW1iZXIgb2YgY2xpZW50cyBjYW4gYmUgc2VydmVkIHNpbXVsdGFuZW91c2x5LiBUbyBjb25maWd1cmUKLSAgICBtb3JlIHRoYW4gMjU2IGNsaWVudHMgd2l0aCB0aGUgcHJlZm9yayBNUE0sIHlvdSBtdXN0IHVzZSB0aGUKLSAgICA8ZGlyZWN0aXZlIG1vZHVsZT0ibXBtX2NvbW1vbiI+U2VydmVyTGltaXQ8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlLgotICAgIFRvIGNvbmZpZ3VyZSBtb3JlIHRoYW4gMTAyNCBjbGllbnRzIHdpdGggdGhlIHdvcmtlciBNUE0sIHlvdSBtdXN0Ci0gICAgdXNlIHRoZSA8ZGlyZWN0aXZlIG1vZHVsZT0ibXBtX2NvbW1vbiI+U2VydmVyTGltaXQ8L2RpcmVjdGl2ZT4gYW5kCi0gICAgPGRpcmVjdGl2ZSBtb2R1bGU9Im1wbV9jb21tb24iPlRocmVhZExpbWl0PC9kaXJlY3RpdmU+IGRpcmVjdGl2ZXMuPC9wPgotCi0gICAgPHA+QW55IGNvbm5lY3Rpb24gYXR0ZW1wdHMgb3ZlciB0aGUKLSAgICA8ZGlyZWN0aXZlPk1heENsaWVudHM8L2RpcmVjdGl2ZT4gbGltaXQgd2lsbCBub3JtYWxseSBiZSBxdWV1ZWQsCi0gICAgdXAgdG8gYSBudW1iZXIgYmFzZWQgb24gdGhlIDxkaXJlY3RpdmUgbW9kdWxlPSJtcG1fY29tbW9uIgotICAgID5MaXN0ZW5CYWNrbG9nPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZS4gT25jZSBhIGNoaWxkCi0gICAgcHJvY2VzcyBpcyBmcmVlZCBhdCB0aGUgZW5kIG9mIGEgZGlmZmVyZW50IHJlcXVlc3QsIHRoZSBjb25uZWN0aW9uCi0gICAgd2lsbCB0aGVuIGJlIHNlcnZpY2VkLjwvcD4KLQotICAgIDxwPldoZW4gdGhlIHNlcnZlciBpcyBjb21waWxlZCB3aXRoIHRocmVhZGluZywgdGhlbiB0aGUgbWF4aW11bQotICAgIG51bWJlciBvZiBzaW11bHRhbmVvdXMgcmVxdWVzdHMgdGhhdCBjYW4gYmUgc2VydmVkIGlzIG9idGFpbmVkCi0gICAgZnJvbSB0aGUgdmFsdWUgb2YgdGhpcyBkaXJlY3RpdmUgbXVsdGlwbGllZCBieQotICAgIDxkaXJlY3RpdmUgbW9kdWxlPSJtcG1fY29tbW9uIj5UaHJlYWRzUGVyQ2hpbGQ8L2RpcmVjdGl2ZT4uPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPk1heFJlcXVlc3RQZXJDaGlsZDwvbmFtZT4KLTxkZXNjcmlwdGlvbj5MaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHJlcXVlc3RzIHRoYXQgYW4gaW5kaXZpZHVhbCBjaGlsZCBzZXJ2ZXIKLXdpbGwgaGFuZGxlIGR1cmluZyBpdHMgbGlmZTwvZGVzY3JpcHRpb24+Ci08c3ludGF4Pk1heFJlcXVlc3RzUGVyQ2hpbGQgPGVtPm51bWJlcjwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5NYXhSZXF1ZXN0c1BlckNoaWxkIDEwMDAwPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLTxtb2R1bGVsaXN0Pjxtb2R1bGU+d29ya2VyPC9tb2R1bGU+PG1vZHVsZT5wZXJjaGlsZDwvbW9kdWxlPgotPG1vZHVsZT5wcmVmb3JrPC9tb2R1bGU+PG1vZHVsZT5tcG1fd2lubnQ8L21vZHVsZT4KLTwvbW9kdWxlbGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPk1heFJlcXVlc3RzUGVyQ2hpbGQ8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIHNldHMKLSAgICB0aGUgbGltaXQgb24gdGhlIG51bWJlciBvZiByZXF1ZXN0cyB0aGF0IGFuIGluZGl2aWR1YWwgY2hpbGQKLSAgICBzZXJ2ZXIgcHJvY2VzcyB3aWxsIGhhbmRsZS4gQWZ0ZXIKLSAgICA8ZGlyZWN0aXZlPk1heFJlcXVlc3RzUGVyQ2hpbGQ8L2RpcmVjdGl2ZT4gcmVxdWVzdHMsIHRoZSBjaGlsZAotICAgIHByb2Nlc3Mgd2lsbCBkaWUuIElmIDxkaXJlY3RpdmU+TWF4UmVxdWVzdHNQZXJDaGlsZDwvZGlyZWN0aXZlPiBpcwotICAgIDAsIHRoZW4gdGhlIHByb2Nlc3Mgd2lsbCBuZXZlciBleHBpcmUuPC9wPgotCi0gICAgPHA+U2V0dGluZyA8ZGlyZWN0aXZlPk1heFJlcXVlc3RzUGVyQ2hpbGQ8L2RpcmVjdGl2ZT4gdG8gYQotICAgIG5vbi16ZXJvIGxpbWl0IGhhcyB0d28gYmVuZWZpY2lhbCBlZmZlY3RzOjwvcD4KLQotICAgIDx1bD4KLSAgICAgIDxsaT5pdCBsaW1pdHMgdGhlIGFtb3VudCBvZiBtZW1vcnkgdGhhdCBwcm9jZXNzIGNhbiBjb25zdW1lCi0gICAgICBieSAoYWNjaWRlbnRhbCkgbWVtb3J5IGxlYWthZ2U7PC9saT4KLQotICAgICAgPGxpPmJ5IGdpdmluZyBwcm9jZXNzZXMgYSBmaW5pdGUgbGlmZXRpbWUsIGl0IGhlbHBzIHJlZHVjZQotICAgICAgdGhlIG51bWJlciBvZiBwcm9jZXNzZXMgd2hlbiB0aGUgc2VydmVyIGxvYWQgcmVkdWNlcy48L2xpPgotICAgIDwvdWw+Ci0KLSAgICA8cD48c3Ryb25nPk5PVEU6PC9zdHJvbmc+IEZvciA8ZW0+S2VlcEFsaXZlPC9lbT4gcmVxdWVzdHMsIG9ubHkKLSAgICB0aGUgZmlyc3QgcmVxdWVzdCBpcyBjb3VudGVkIHRvd2FyZHMgdGhpcyBsaW1pdC4gSW4gZWZmZWN0LCBpdAotICAgIGNoYW5nZXMgdGhlIGJlaGF2aW9yIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YKLSAgICA8ZW0+Y29ubmVjdGlvbnM8L2VtPiBwZXIgY2hpbGQuPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPk1heFNwYXJlVGhyZWFkczwvbmFtZT4KLTxkZXNjcmlwdGlvbj5NYXhpbXVtIG51bWJlciBvZiBpZGxlIHRocmVhZHM8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5NYXhTcGFyZVRocmVhZHMgPGVtPm51bWJlcjwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5NYXhTcGFyZVRocmVhZHMgMTAgKFBlcmNoaWxkKSBvciA1MDAgKHdvcmtlcik8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPG1vZHVsZWxpc3Q+PG1vZHVsZT53b3JrZXI8L21vZHVsZT48bW9kdWxlPnBlcmNoaWxkPC9tb2R1bGU+Ci08L21vZHVsZWxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5NYXhpbXVtIG51bWJlciBvZiBpZGxlIHRocmVhZHMuIERpZmZlcmVudCBNUE1zIGRlYWwgd2l0aCB0aGlzCi0gICAgZGlyZWN0aXZlIGRpZmZlcmVudGx5LiA8bW9kdWxlPnBlcmNoaWxkPC9tb2R1bGU+IG1vbml0b3JzIHRoZQotICAgIG51bWJlciBvZiBpZGxlIHRocmVhZHMgb24gYSBwZXItY2hpbGQgYmFzaXMuIElmIHRoZXJlIGFyZSB0b28gbWFueQotICAgIGlkbGUgdGhyZWFkcyBpbiB0aGF0IGNoaWxkLCB0aGUgc2VydmVyIHdpbGwgYmVnaW4gdG8ga2lsbCB0aHJlYWRzCi0gICAgd2l0aGluIHRoYXQgY2hpbGQuPC9wPgotCi0gICAgPHA+PG1vZHVsZT53b3JrZXI8L21vZHVsZT4gZGVhbHMgd2l0aCBpZGxlIHRocmVhZHMgb24gYQotICAgIHNlcnZlci13aWRlIGJhc2lzLiBJZiB0aGVyZSBhcmUgdG9vIG1hbnkgaWRsZSB0aHJlYWRzIGluIHRoZQotICAgIHNlcnZlciB0aGVuIGNoaWxkIHByb2Nlc3NlcyBhcmUga2lsbGVkIHVudGlsIHRoZSBudW1iZXIgb2YgaWRsZQotICAgIHRocmVhZHMgaXMgbGVzcyB0aGFuIHRoaXMgbnVtYmVyLjwvcD4KLQotPC91c2FnZT4KLTxzZWVhbHNvPjxkaXJlY3RpdmUgbW9kdWxlPSJtcG1fY29tbW9uIj5NaW5TcGFyZVRocmVhZHM8L2RpcmVjdGl2ZT48L3NlZWFsc28+Ci08c2VlYWxzbz48ZGlyZWN0aXZlIG1vZHVsZT0ibXBtX2NvbW1vbiI+U3RhcnRTZXJ2ZXJzPC9kaXJlY3RpdmU+PC9zZWVhbHNvPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+TWF4VGhyZWFkc1BlckNoaWxkPC9uYW1lPgotPGRlc2NyaXB0aW9uPk1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgcGVyIGNoaWxkIHByb2Nlc3M8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5NYXhUaHJlYWRzUGVyQ2hpbGQgPGVtPm51bWJlcjwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5NYXhUaHJlYWRzUGVyQ2hpbGQgNjQ8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPG1vZHVsZWxpc3Q+PG1vZHVsZT53b3JrZXI8L21vZHVsZT48bW9kdWxlPnBlcmNoaWxkPC9tb2R1bGU+Ci08L21vZHVsZWxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5NYXhpbXVtIG51bWJlciBvZiB0aHJlYWRzIHBlciBjaGlsZC4gRm9yIE1QTXMgd2l0aCBhCi0gICAgdmFyaWFibGUgbnVtYmVyIG9mIHRocmVhZHMgcGVyIGNoaWxkLCB0aGlzIGRpcmVjdGl2ZSBzZXRzIHRoZQotICAgIG1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgaW4gZWFjaCBjaGlsZAotICAgIHByb2Nlc3MuIFRvIGluY3JlYXNlIHRoaXMgdmFsdWUgYmV5b25kIGl0cyBkZWZhdWx0LCBpdCBpcwotICAgIG5lY2Vzc2FyeSB0byBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBjb21waWxlLXRpbWUgZGVmaW5lCi0gICAgPGNvZGU+SEFSRF9USFJFQURfTElNSVQ8L2NvZGU+IGFuZCByZWNvbXBpbGUgdGhlIHNlcnZlci48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+TWluU3BhcmVUaHJlYWRzPC9uYW1lPgotPGRlc2NyaXB0aW9uPk1pbmltdW0gbnVtYmVyIG9mIGlkbGUgdGhyZWFkcyBhdmFpbGFibGUgdG8gaGFuZGxlIHJlcXVlc3QKLXNwaWtlczwvZGVzY3JpcHRpb24+Ci08c3ludGF4Pk1pblNwYXJlU2VydmVycyA8ZW0+bnVtYmVyPC9lbT48L3N5bnRheD4KLTxkZWZhdWx0Pk1pblNwYXJlVGhyZWFkcyA1IChQZXJjaGlsZCkgb3IgMjUwICh3b3JrZXIpPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLTxtb2R1bGVsaXN0Pjxtb2R1bGU+d29ya2VyPC9tb2R1bGU+PG1vZHVsZT5wZXJjaGlsZDwvbW9kdWxlPgotPC9tb2R1bGVsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+TWluaW11bSBudW1iZXIgb2YgaWRsZSB0aHJlYWRzIHRvIGhhbmRsZSByZXF1ZXN0IHNwaWtlcy4KLSAgICBEaWZmZXJlbnQgTVBNcyBkZWFsIHdpdGggdGhpcyBkaXJlY3RpdmUKLSAgICBkaWZmZXJlbnRseS4gPG1vZHVsZT5wZXJjaGlsZDwvbW9kdWxlPiBtb25pdG9ycyB0aGUgbnVtYmVyIG9mIGlkbGUKLSAgICB0aHJlYWRzIG9uIGEgcGVyLWNoaWxkIGJhc2lzLiBJZiB0aGVyZSBhcmVuJ3QgZW5vdWdoIGlkbGUgdGhyZWFkcwotICAgIGluIHRoYXQgY2hpbGQsIHRoZSBzZXJ2ZXIgd2lsbCBiZWdpbiB0byBjcmVhdGUgbmV3IHRocmVhZHMgd2l0aGluCi0gICAgdGhhdCBjaGlsZC48L3A+Ci0KLSAgICA8cD48bW9kdWxlPndvcmtlcjwvbW9kdWxlPiBkZWFscyB3aXRoIGlkbGUgdGhyZWFkcyBvbiBhCi0gICAgc2VydmVyLXdpZGUgYmFzaXMuIElmIHRoZXJlIGFyZW4ndCBlbm91Z2ggaWRsZSB0aHJlYWRzIGluIHRoZQotICAgIHNlcnZlciB0aGVuIGNoaWxkIHByb2Nlc3NlcyBhcmUgY3JlYXRlZCB1bnRpbCB0aGUgbnVtYmVyIG9mIGlkbGUKLSAgICB0aHJlYWRzIGlzIGdyZWF0ZXIgdGhhbiBudW1iZXIuPC9wPgotPC91c2FnZT4KLTxzZWVhbHNvPjxkaXJlY3RpdmUgbW9kdWxlPSJtcG1fY29tbW9uIj5NYXhTcGFyZVRocmVhZHM8L2RpcmVjdGl2ZT48L3NlZWFsc28+Ci08c2VlYWxzbz48ZGlyZWN0aXZlIG1vZHVsZT0ibXBtX2NvbW1vbiI+U3RhcnRTZXJ2ZXJzPC9kaXJlY3RpdmU+PC9zZWVhbHNvPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+TnVtU2VydmVyczwvbmFtZT4KLTxkZXNjcmlwdGlvbj5Ub3RhbCBudW1iZXIgb2YgY2hpbGRyZW4gYWxpdmUgYXQgdGhlIHNhbWUgdGltZTwvZGVzY3JpcHRpb24+Ci08c3ludGF4Pk51bVNlcnZlcnMgPGVtPm51bWJlcjwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5OdW1TZXJ2ZXJzIDI8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPG1vZHVsZWxpc3Q+PG1vZHVsZT5wZXJjaGlsZDwvbW9kdWxlPjwvbW9kdWxlbGlzdD4KLQotPHVzYWdlPgotICAgIDxwPk51bWJlciBvZiBjaGlsZHJlbiBhbGl2ZSBhdCB0aGUgc2FtZSB0aW1lLiBNUE1zIHRoYXQgdXNlCi0gICAgdGhpcyBkaXJlY3RpdmUgZG8gbm90IGR5bmFtaWNhbGx5IGNyZWF0ZSBuZXcgY2hpbGQgcHJvY2Vzc2VzIHNvCi0gICAgdGhpcyBudW1iZXIgc2hvdWxkIGJlIGxhcmdlIGVub3VnaCB0byBoYW5kbGUgdGhlIHJlcXVlc3RzIGZvcgotICAgIHRoZSBlbnRpcmUgc2l0ZS48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U2NvcmVCb2FyZEZpbGU8L25hbWU+Ci08ZGVzY3JpcHRpb24+TG9jYXRpb24gb2YgdGhlIGZpbGUgdXNlZCB0byBzdG9yZSBjb29yZGluYXRpb24gZGF0YSBmb3IKLXRoZSBjaGlsZCBwcm9jZXNzZXM8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5TY29yZUJvYXJkRmlsZSA8ZW0+ZmlsZS1wYXRoPC9lbT48L3N5bnRheD4KLTxkZWZhdWx0PlNjb3JlQm9hcmRGaWxlIGxvZ3MvYXBhY2hlX3N0YXR1czwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci08bW9kdWxlbGlzdD48bW9kdWxlPndvcmtlcjwvbW9kdWxlPjxtb2R1bGU+cGVyY2hpbGQ8L21vZHVsZT4KLTxtb2R1bGU+cHJlZm9yazwvbW9kdWxlPjwvbW9kdWxlbGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPlNjb3JlQm9hcmRGaWxlPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBpcyByZXF1aXJlZAotICAgIG9uIHNvbWUgYXJjaGl0ZWN0dXJlcyB0byBwbGFjZSBhIGZpbGUgdGhhdCB0aGUgc2VydmVyIHdpbGwgdXNlIHRvCi0gICAgY29tbXVuaWNhdGUgYmV0d2VlbiBpdHMgY2hpbGRyZW4gYW5kIHRoZSBwYXJlbnQuIFRoZSBlYXNpZXN0IHdheQotICAgIHRvIGZpbmQgb3V0IGlmIHlvdXIgYXJjaGl0ZWN0dXJlIHJlcXVpcmVzIGEgc2NvcmVib2FyZCBmaWxlIGlzIHRvCi0gICAgcnVuIEFwYWNoZSBhbmQgc2VlIGlmIGl0IGNyZWF0ZXMgdGhlIGZpbGUgbmFtZWQgYnkgdGhlCi0gICAgZGlyZWN0aXZlLiBJZiB5b3VyIGFyY2hpdGVjdHVyZSByZXF1aXJlcyBpdCB0aGVuIHlvdSBtdXN0IGVuc3VyZQotICAgIHRoYXQgdGhpcyBmaWxlIGlzIG5vdCB1c2VkIGF0IHRoZSBzYW1lIHRpbWUgYnkgbW9yZSB0aGFuIG9uZQotICAgIGludm9jYXRpb24gb2YgQXBhY2hlLjwvcD4KLQotICAgIDxwPklmIHlvdSBoYXZlIHRvIHVzZSBhIDxkaXJlY3RpdmU+U2NvcmVCb2FyZEZpbGU8L2RpcmVjdGl2ZT4gdGhlbgotICAgIHlvdSBtYXkgc2VlIGltcHJvdmVkIHNwZWVkIGJ5IHBsYWNpbmcgaXQgb24gYSBSQU0gZGlzay4gQnV0IGJlCi0gICAgY2FyZWZ1bCB0aGF0IHlvdSBoZWVkIHRoZSBzYW1lIHdhcm5pbmdzIGFib3V0IGxvZyBmaWxlIHBsYWNlbWVudAotICAgIGFuZCA8YSBocmVmPSIuLi9taXNjL3NlY3VyaXR5X3RpcHMuaHRtbCI+c2VjdXJpdHk8L2E+LjwvcD4KLTwvdXNhZ2U+Ci08c2VlYWxzbz48YQotICAgIGhyZWY9Ii4uL3N0b3BwaW5nLmh0bWwiPlN0b3BwaW5nIGFuZCBSZXN0YXJ0aW5nIEFwYWNoZTwvYT48L3NlZWFsc28+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5TZW5kQnVmZmVyU2l6ZTwvbmFtZT4KLTxkZXNjcmlwdGlvbj5UQ1AgYnVmZmVyIHNpemU8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5TZW5kQnVmZmVyU2l6ZSA8ZW0+Ynl0ZXM8L2VtPjwvc3ludGF4PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLTxtb2R1bGVsaXN0Pjxtb2R1bGU+d29ya2VyPC9tb2R1bGU+PG1vZHVsZT5wZXJjaGlsZDwvbW9kdWxlPgotPG1vZHVsZT5wcmVmb3JrPC9tb2R1bGU+PG1vZHVsZT5tcG1fd2lubnQ8L21vZHVsZT4KLTwvbW9kdWxlbGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoZSBzZXJ2ZXIgd2lsbCBzZXQgdGhlIFRDUCBidWZmZXIgc2l6ZSB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gICAgc3BlY2lmaWVkLiBWZXJ5IHVzZWZ1bCB0byBpbmNyZWFzZSBwYXN0IHN0YW5kYXJkIE9TIGRlZmF1bHRzIG9uCi0gICAgaGlnaCBzcGVlZCBoaWdoIGxhdGVuY3kgKDxlbT5pLmUuPC9lbT4sIDEwMG1zIG9yIHNvLCBzdWNoIGFzCi0gICAgdHJhbnNjb250aW5lbnRhbCBmYXN0IHBpcGVzKS48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U2VydmVyTGltaXQ8L25hbWU+Ci08ZGVzY3JpcHRpb24+VXBwZXIgbGltaXQgb24gY29uZmlndXJhYmxlIG51bWJlciBvZiBwcm9jZXNzZXM8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5TZXJ2ZXJMaW1pdCA8ZW0+bnVtYmVyPC9lbT48L3N5bnRheD4KLTxkZWZhdWx0PlNlcnZlckxpbWl0IDI1NiAocHJlZm9yayksIFNlcnZlckxpbWl0IDE2ICh3b3JrZXIpPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLTxtb2R1bGVsaXN0Pjxtb2R1bGU+d29ya2VyPC9tb2R1bGU+PG1vZHVsZT5wcmVmb3JrPC9tb2R1bGU+Ci08L21vZHVsZWxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5Gb3IgdGhlIDxtb2R1bGU+cHJlZm9yazwvbW9kdWxlPiBNUE0sIHRoaXMgZGlyZWN0aXZlIHNldHMgdGhlCi0gICAgbWF4aW11bSBjb25maWd1cmVkIHZhbHVlIGZvciA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJtcG1fY29tbW9uIj5NYXhDbGllbnRzPC9kaXJlY3RpdmU+IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlCi0gICAgQXBhY2hlIHByb2Nlc3MuICBGb3IgdGhlIHdvcmtlciBNUE0sIHRoaXMgZGlyZWN0aXZlIGluIGNvbWJpbmF0aW9uCi0gICAgd2l0aCA8ZGlyZWN0aXZlIG1vZHVsZT0ibXBtX2NvbW1vbiI+VGhyZWFkTGltaXQ8L2RpcmVjdGl2ZT4gc2V0cwotICAgIHRoZSBtYXhpbXVtIGNvbmZpZ3VyZWQgdmFsdWUgZm9yIDxkaXJlY3RpdmUKLSAgICBtb2R1bGU9Im1wbV9jb21tb24iPk1heENsaWVudHM8L2RpcmVjdGl2ZT4gZm9yIHRoZSBsaWZldGltZSBvZiB0aGUKLSAgICBBcGFjaGUgcHJvY2Vzcy4gIEFueSBhdHRlbXB0cyB0byBjaGFuZ2UgdGhpcyBkaXJlY3RpdmUgZHVyaW5nIGEKLSAgICByZXN0YXJ0IHdpbGwgYmUgaWdub3JlZCwgYnV0IDxkaXJlY3RpdmUKLSAgICBtb2R1bGU9Im1wbV9jb21tb24iPk1heENsaWVudHM8L2RpcmVjdGl2ZT4gY2FuIGJlIG1vZGlmaWVkIGR1cmluZwotICAgIGEgcmVzdGFydC48L3A+Ci0KLSAgICA8cD5TcGVjaWFsIGNhcmUgbXVzdCBiZSB0YWtlbiB3aGVuIHVzaW5nIHRoaXMgZGlyZWN0aXZlLiAgSWYKLSAgICA8ZGlyZWN0aXZlPlNlcnZlckxpbWl0PC9kaXJlY3RpdmU+IGlzIHNldCB0byBhIHZhbHVlIG11Y2ggaGlnaGVyCi0gICAgdGhhbiBuZWNlc3NhcnksIGV4dHJhLCB1bnVzZWQgc2hhcmVkIG1lbW9yeSB3aWxsIGJlIGFsbG9jYXRlZC4gIElmCi0gICAgYm90aCA8ZGlyZWN0aXZlPlNlcnZlckxpbWl0PC9kaXJlY3RpdmU+IGFuZCA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJtcG1fY29tbW9uIj5NYXhDbGllbnRzPC9kaXJlY3RpdmU+IGFyZSBzZXQgdG8gdmFsdWVzCi0gICAgaGlnaGVyIHRoYW4gdGhlIHN5c3RlbSBjYW4gaGFuZGxlLCBBcGFjaGUgbWF5IG5vdCBzdGFydCBvciB0aGUKLSAgICBzeXN0ZW0gbWF5IGJlY29tZSB1bnN0YWJsZS48L3A+Ci0KLSAgICA8cD5XaXRoIHRoZSA8bW9kdWxlPnByZWZvcms8L21vZHVsZT4gTVBNLCB1c2UgdGhpcyBkaXJlY3RpdmUgb25seQotICAgIGlmIHlvdSBuZWVkIHRvIHNldCA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJtcG1fY29tbW9uIj5NYXhDbGllbnRzPC9kaXJlY3RpdmU+IGhpZ2hlciBoaWdoZXIgdGhhbiAyNTYuCi0gICAgRG8gbm90IHNldCB0aGUgdmFsdWUgb2YgdGhpcyBkaXJlY3RpdmUgYW55IGhpZ2hlciB0aGFuIHdoYXQgeW91Ci0gICAgbWlnaHQgd2FudCB0byBzZXQgPGRpcmVjdGl2ZQotICAgIG1vZHVsZT0ibXBtX2NvbW1vbiI+TWF4Q2xpZW50czwvZGlyZWN0aXZlPiB0by48L3A+Ci0KLSAgICA8cD5XaXRoIHRoZSA8bW9kdWxlPndvcmtlcjwvbW9kdWxlPiBNUE0sIHVzZSB0aGlzIGRpcmVjdGl2ZSBvbmx5Ci0gICAgaWYgeW91ciA8ZGlyZWN0aXZlIG1vZHVsZT0ibXBtX2NvbW1vbiI+TWF4Q2xpZW50czwvZGlyZWN0aXZlPiBhbmQKLSAgICA8ZGlyZWN0aXZlIG1vZHVsZT0ibXBtX2NvbW1vbiI+VGhyZWFkc1BlckNoaWxkPC9kaXJlY3RpdmU+Ci0gICAgc2V0dGluZ3MgcmVxdWlyZSBtb3JlIHRoYW4gMTYgc2VydmVyIHByb2Nlc3Nlcy4gIERvIG5vdCBzZXQgdGhlCi0gICAgdmFsdWUgb2YgdGhpcyBkaXJlY3RpdmUgYW55IGhpZ2hlciB0aGFuIHRoZSBudW1iZXIgb2Ygc2VydmVyCi0gICAgcHJvY2Vzc2VzIHJlcXVpcmVkIGJ5IHdoYXQgeW91IG1heSB3YW50IGZvciA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJtcG1fY29tbW9uIj5NYXhDbGllbnRzIDwvZGlyZWN0aXZlPiBhbmQgPGRpcmVjdGl2ZQotICAgIG1vZHVsZT0ibXBtX2NvbW1vbiI+VGhyZWFkc1BlckNoaWxkPC9kaXJlY3RpdmU+LjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5TdGFydFNlcnZlcnM8L25hbWU+Ci08ZGVzY3JpcHRpb24+TnVtYmVyIG9mIGNoaWxkIHNlcnZlciBwcm9jZXNzZXMgY3JlYXRlZCBhdCBzdGFydHVwPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+U3RhcnRTZXJ2ZXJzIDxlbT5udW1iZXI8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+U3RhcnRTZXJ2ZXJzIDU8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPG1vZHVsZWxpc3Q+PG1vZHVsZT53b3JrZXI8L21vZHVsZT48L21vZHVsZWxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5TdGFydFNlcnZlcnM8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIHNldHMgdGhlCi0gICAgbnVtYmVyIG9mIGNoaWxkIHNlcnZlciBwcm9jZXNzZXMgY3JlYXRlZCBvbiBzdGFydHVwLiBBcyB0aGUgbnVtYmVyCi0gICAgb2YgcHJvY2Vzc2VzIGlzIGR5bmFtaWNhbGx5IGNvbnRyb2xsZWQgZGVwZW5kaW5nIG9uIHRoZSBsb2FkLAotICAgIHRoZXJlIGlzIHVzdWFsbHkgbGl0dGxlIHJlYXNvbiB0byBhZGp1c3QgdGhpcyBwYXJhbWV0ZXIuPC9wPgotPC91c2FnZT4KLTxzZWVhbHNvPjxkaXJlY3RpdmUgbW9kdWxlPSJtcG1fY29tbW9uIj5NaW5TcGFyZVRocmVhZHM8L2RpcmVjdGl2ZT48L3NlZWFsc28+Ci08c2VlYWxzbz48ZGlyZWN0aXZlIG1vZHVsZT0ibXBtX2NvbW1vbiI+TWF4U3BhcmVUaHJlYWRzPC9kaXJlY3RpdmU+PC9zZWVhbHNvPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U3RhcnRUaHJlYWRzPC9uYW1lPgotPGRlc2NyaXB0aW9uPk51Ym1lciBvZiB0aHJlYWRzIGVhY2ggY2hpbGQgY3JlYXRlcyBvbiBzdGFydHVwPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+U3RhcnRUaHJlYWRzIDxlbT5udW1iZXI8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+U3RhcnRUaHJlYWRzIDU8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotPG1vZHVsZWxpc3Q+PG1vZHVsZT5wZXJjaGlsZDwvbW9kdWxlPjwvbW9kdWxlbGlzdD4KLQotPHVzYWdlPgotICAgIDxwPk51bWJlciBvZiB0aHJlYWRzIGVhY2ggY2hpbGQgY3JlYXRlcyBvbiBzdGFydHVwLiBBcyB0aGUKLSAgICBudW1iZXIgb2YgdGhyZWFkcyBpcyBkeW5hbWljYWxseSBjb250cm9sbGVkIGRlcGVuZGluZyBvbiB0aGUKLSAgICBsb2FkLCB0aGVyZSBpcyB1c3VhbGx5IGxpdHRsZSByZWFzb24gdG8gYWRqdXN0IHRoaXMKLSAgICBwYXJhbWV0ZXIuPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlRocmVhZExpbWl0PC9uYW1lPgotPGRlc2NyaXB0aW9uPlNldHMgdGhlIHVwcGVyIGxpbWl0IG9uIHRoZSBjb25maWd1cmFibGUgbnVtYmVyIG9mIHRocmVhZHMKLXBlciBjaGlsZCBwcm9jZXNzPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+VGhyZWFkTGltaXQgPGVtPm51bWJlcjwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5UaHJlYWRMaW1pdCA2NDwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci08bW9kdWxlbGlzdD48bW9kdWxlPndvcmtlcjwvbW9kdWxlPjwvbW9kdWxlbGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoaXMgZGlyZWN0aXZlIHNldHMgdGhlIG1heGltdW0gY29uZmlndXJlZCB2YWx1ZSBmb3IgPGRpcmVjdGl2ZQotICAgIG1vZHVsZT0ibXBtX2NvbW1vbiI+VGhyZWFkc1BlckNoaWxkPC9kaXJlY3RpdmU+IGZvciB0aGUgbGlmZXRpbWUKLSAgICBvZiB0aGUgQXBhY2hlIHByb2Nlc3MuICBBbnkgYXR0ZW1wdHMgdG8gY2hhbmdlIHRoaXMgZGlyZWN0aXZlCi0gICAgZHVyaW5nIGEgcmVzdGFydCB3aWxsIGJlIGlnbm9yZWQsIGJ1dCA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJtcG1fY29tbW9uIj5UaHJlYWRzUGVyQ2hpbGQ8L2RpcmVjdGl2ZT4gY2FuIGJlIG1vZGlmaWVkCi0gICAgZHVyaW5nIGEgcmVzdGFydCB1cCB0byB0aGUgdmFsdWUgb2YgdGhpcyBkaXJlY3RpdmUuPC9wPgotCi0gICAgPHA+U3BlY2lhbCBjYXJlIG11c3QgYmUgdGFrZW4gd2hlbiB1c2luZyB0aGlzIGRpcmVjdGl2ZS4gIElmCi0gICAgPGRpcmVjdGl2ZT5UaHJlYWRMaW1pdDwvZGlyZWN0aXZlPiBpcyBzZXQgdG8gYSB2YWx1ZSBtdWNoIGhpZ2hlcgotICAgIHRoYW4gPGRpcmVjdGl2ZSBtb2R1bGU9Im1wbV9jb21tb24iPlRocmVhZHNQZXJDaGlsZDwvZGlyZWN0aXZlPiwKLSAgICBleHRyYSB1bnVzZWQgc2hhcmVkIG1lbW9yeSB3aWxsIGJlIGFsbG9jYXRlZC4gIElmIGJvdGgKLSAgICA8ZGlyZWN0aXZlPlRocmVhZExpbWl0PC9kaXJlY3RpdmU+IGFuZCA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJtcG1fY29tbW9uIj5UaHJlYWRzUGVyQ2hpbGQ8L2RpcmVjdGl2ZT4gYXJlIHNldCB0byB2YWx1ZXMKLSAgICBoaWdoZXIgdGhhbiB0aGUgc3lzdGVtIGNhbiBoYW5kbGUsIEFwYWNoZSBtYXkgbm90IHN0YXJ0IG9yIHRoZQotICAgIHN5c3RlbSBtYXkgYmVjb21lIHVuc3RhYmxlLjwvcD4KLQotICAgIDxwPlVzZSB0aGlzIGRpcmVjdGl2ZSBvbmx5IGlmIHlvdSBuZWVkIHRvIHNldCA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJtcG1fY29tbW9uIj5UaHJlYWRzUGVyQ2hpbGQ8L2RpcmVjdGl2ZT4gaGlnaGVyIHRoYW4gNjQuICBEbwotICAgIG5vdCBzZXQgdGhlIHZhbHVlIG9mIHRoaXMgZGlyZWN0aXZlIGFueSBoaWdoZXIgdGhhbiB3aGF0IHlvdSBtaWdodAotICAgIHdhbnQgdG8gc2V0IDxkaXJlY3RpdmUKLSAgICBtb2R1bGU9Im1wbV9jb21tb24iPlRocmVhZHNQZXJDaGlsZDwvZGlyZWN0aXZlPiB0by48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+VGhyZWFkc1BlckNoaWxkPC9uYW1lPgotPGRlc2NyaXB0aW9uPk51bWJlciBvZiB0aHJlYWRzIGNyZWF0ZWQgYnkgZWFjaCBjaGlsZCBwcm9jZXNzPC9kZXNjcmlwdGlvbj4KLTxzeW50YXg+VGhyZWFkc1BlckNoaWxkIDxlbT5udW1iZXI8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+VGhyZWFkc1BlckNoaWxkIDUwPC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLTxtb2R1bGVsaXN0Pjxtb2R1bGU+d29ya2VyPC9tb2R1bGU+PG1vZHVsZT5tcG1fd2lubnQ8L21vZHVsZT4KLTwvbW9kdWxlbGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoaXMgZGlyZWN0aXZlIHNldHMgdGhlIG51bWJlciBvZiB0aHJlYWRzIGNyZWF0ZWQgYnkgZWFjaAotICAgIGNoaWxkIHByb2Nlc3MuIFRoZSBjaGlsZCBjcmVhdGVzIHRoZXNlIHRocmVhZHMgYXQgc3RhcnR1cCBhbmQKLSAgICBuZXZlciBjcmVhdGVzIG1vcmUuIGlmIHVzaW5nIGFuIE1QTSBsaWtlIG1wbXRfd2lubnQsIHdoZXJlCi0gICAgdGhlcmUgaXMgb25seSBvbmUgY2hpbGQgcHJvY2VzcywgdGhpcyBudW1iZXIgc2hvdWxkIGJlIGhpZ2gKLSAgICBlbm91Z2ggdG8gaGFuZGxlIHRoZSBlbnRpcmUgbG9hZCBvZiB0aGUgc2VydmVyLiBJZiB1c2luZyBhbiBNUE0KLSAgICBsaWtlIHdvcmtlciwgd2hlcmUgdGhlcmUgYXJlIG11bHRpcGxlIGNoaWxkIHByb2Nlc3NlcywgdGhlCi0gICAgdG90YWwgbnVtYmVyIG9mIHRocmVhZHMgc2hvdWxkIGJlIGhpZ2ggZW5vdWdoIHRvIGhhbmRsZSB0aGUKLSAgICBjb21tb24gbG9hZCBvbiB0aGUgc2VydmVyLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5Vc2VyPC9uYW1lPgotPGRlc2NyaXB0aW9uPlRoZSB1c2VyaWQgdW5kZXIgd2hpY2ggdGhlIHNlcnZlciB3aWxsIGFuc3dlcgotcmVxdWVzdHM8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5Vc2VyIDxlbT51bml4LXVzZXJpZDwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5Vc2VyICMtMTwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0Pjxjb250ZXh0PnZpcnR1YWwgaG9zdDwvY29udGV4dD4KLTwvY29udGV4dGxpc3Q+Ci08bW9kdWxlbGlzdD48bW9kdWxlPndvcmtlcjwvbW9kdWxlPjxtb2R1bGU+cGVyY2hpbGQ8L21vZHVsZT4KLTxtb2R1bGU+cHJlZm9yazwvbW9kdWxlPjwvbW9kdWxlbGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPlVzZXI8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIHNldHMgdGhlIHVzZXJpZCBhcwotICAgIHdoaWNoIHRoZSBzZXJ2ZXIgd2lsbCBhbnN3ZXIgcmVxdWVzdHMuIEluIG9yZGVyIHRvIHVzZSB0aGlzCi0gICAgZGlyZWN0aXZlLCB0aGUgc3RhbmRhbG9uZSBzZXJ2ZXIgbXVzdCBiZSBydW4gaW5pdGlhbGx5IGFzCi0gICAgcm9vdC4gPGVtPlVuaXgtdXNlcmlkPC9lbT4gaXMgb25lIG9mOjwvcD4KLQotICAgIDxkbD4KLSAgICAgIDxkdD5BIHVzZXJuYW1lPC9kdD4KLQotICAgICAgPGRkPlJlZmVycyB0byB0aGUgZ2l2ZW4gdXNlciBieSBuYW1lLjwvZGQ+Ci0KLSAgICAgIDxkdD4jIGZvbGxvd2VkIGJ5IGEgdXNlciBudW1iZXIuPC9kdD4KLQotICAgICAgPGRkPlJlZmVycyB0byBhIHVzZXIgYnkgdGhlaXIgbnVtYmVyLjwvZGQ+Ci0gICAgPC9kbD4KLQotICAgIDxwPlRoZSB1c2VyIHNob3VsZCBoYXZlIG5vIHByaXZpbGVnZXMgd2hpY2ggcmVzdWx0IGluIGl0IGJlaW5nCi0gICAgYWJsZSB0byBhY2Nlc3MgZmlsZXMgd2hpY2ggYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB2aXNpYmxlIHRvIHRoZQotICAgIG91dHNpZGUgd29ybGQsIGFuZCBzaW1pbGFybHksIHRoZSB1c2VyIHNob3VsZCBub3QgYmUgYWJsZSB0bwotICAgIGV4ZWN1dGUgY29kZSB3aGljaCBpcyBub3QgbWVhbnQgZm9yIGh0dHBkIHJlcXVlc3RzLiBJdCBpcwotICAgIHJlY29tbWVuZGVkIHRoYXQgeW91IHNldCB1cCBhIG5ldyB1c2VyIGFuZCBncm91cCBzcGVjaWZpY2FsbHkgZm9yCi0gICAgcnVubmluZyB0aGUgc2VydmVyLiBTb21lIGFkbWlucyB1c2UgdXNlciA8Y29kZT5ub2JvZHk8L2NvZGU+LCBidXQKLSAgICB0aGlzIGlzIG5vdCBhbHdheXMgcG9zc2libGUgb3IgZGVzaXJhYmxlLiBGb3IgZXhhbXBsZQotICAgIDxtb2R1bGU+bW9kX3Byb3h5PC9tb2R1bGU+J3MgY2FjaGUsIHdoZW4gZW5hYmxlZCwgbXVzdCBiZQotICAgIGFjY2Vzc2libGUgdG8gdGhpcyB1c2VyIChzZWUgPGRpcmVjdGl2ZQotICAgIG1vZHVsZT0ibW9kX3Byb3h5Ij5DYWNoZVJvb3Q8L2RpcmVjdGl2ZT4pLjwvcD4KLQotICAgIDxwPk5vdGVzOiBJZiB5b3Ugc3RhcnQgdGhlIHNlcnZlciBhcyBhIG5vbi1yb290IHVzZXIsIGl0IHdpbGwKLSAgICBmYWlsIHRvIGNoYW5nZSB0byB0aGUgbGVzc2VyIHByaXZpbGVnZWQgdXNlciwgYW5kIHdpbGwgaW5zdGVhZAotICAgIGNvbnRpbnVlIHRvIHJ1biBhcyB0aGF0IG9yaWdpbmFsIHVzZXIuIElmIHlvdSBkbyBzdGFydCB0aGUKLSAgICBzZXJ2ZXIgYXMgcm9vdCwgdGhlbiBpdCBpcyBub3JtYWwgZm9yIHRoZSBwYXJlbnQgcHJvY2VzcyB0bwotICAgIHJlbWFpbiBydW5uaW5nIGFzIHJvb3QuPC9wPgotCi0gICAgPHA+U3BlY2lhbCBub3RlOiBVc2Ugb2YgdGhpcyBkaXJlY3RpdmUgaW4gPGRpcmVjdGl2ZSBtb2R1bGU9ImNvcmUiCi0gICAgdHlwZT0ic2VjdGlvbiI+VmlydHVhbEhvc3Q8L2RpcmVjdGl2ZT4gaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gVG8KLSAgICBjb25maWd1cmUgeW91ciBzZXJ2ZXIgZm9yIDxhIGhyZWY9Im1vZF9zdWV4ZWMuaHRtbCI+c3VleGVjPC9hPiB1c2UKLSAgICA8ZGlyZWN0aXZlIG1vZHVsZT0ibW9kX3N1ZXhlYyI+U3VleGVjVXNlckdyb3VwPC9kaXJlY3RpdmU+LjwvcD4KLQotPG5vdGU+PHRpdGxlPlNlY3VyaXR5PC90aXRsZT4gPHA+RG9uJ3Qgc2V0IDxkaXJlY3RpdmU+VXNlcjwvZGlyZWN0aXZlPgotKG9yIDxkaXJlY3RpdmUgbW9kdWxlPSJtcG1fY29tbW9uIj5Hcm91cDwvZGlyZWN0aXZlPikgdG8KLTxjb2RlPnJvb3Q8L2NvZGU+IHVubGVzcyB5b3Uga25vdyBleGFjdGx5IHdoYXQgeW91IGFyZSBkb2luZywgYW5kIHdoYXQKLXRoZSBkYW5nZXJzIGFyZS48L3A+PC9ub3RlPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTwvbW9kdWxlc3lub3BzaXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21wbV9uZXR3YXJlLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbXBtX25ldHdhcmUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhZWY4My4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbXBtX25ldHdhcmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotICA8aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik1pY3Jvc29mdCBGcm9udFBhZ2UgNC4wIiAvPgotCi0gICAgPHRpdGxlPkFwYWNoZSBNUE0gcHJlZm9yazwvdGl0bGU+Ci0gIDwvaGVhZD4KLSAgPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotCi0gIDxib2R5IGJnY29sb3I9IiNGRkZGRkYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiMwMDAwRkYiCi0gIHZsaW5rPSIjMDAwMDgwIiBhbGluaz0iI0ZGMDAwMCI+Ci0gICAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLQotICAgIDxoMSBhbGlnbj0iQ0VOVEVSIj5NdWx0aS1Qcm9jZXNzaW5nIE1vZHVsZSBOZXRXYXJlPC9oMT4KLQotICAgIDxwPlRoaXMgTXVsdGktUHJvY2Vzc2luZyBNb2R1bGUgaW1wbGVtZW50cyBhbiBleGNsdXNpdmVseSB0aHJlYWRlZCB3ZWIKLSAgICBzZXJ2ZXIgb3B0aW1pemVkIGZvciBOb3ZlbGwgTmV0V2FyZS48L3A+Ci0KLSAgICA8cD48YSBocmVmPSJtb2R1bGUtZGljdC5odG1sI1N0YXR1cyIKLSAgICByZWw9IkhlbHAiPjxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPjwvYT4gTVBNPGJyIC8+Ci0gICAgIDxhIGhyZWY9Im1vZHVsZS1kaWN0Lmh0bWwjU291cmNlRmlsZSIKLSAgICByZWw9IkhlbHAiPjxzdHJvbmc+U291cmNlIEZpbGU6PC9zdHJvbmc+PC9hPiAgbXBtX25ldHdhcmUuYzxiciAvPgotICAgICA8YSBocmVmPSJtb2R1bGUtZGljdC5odG1sI01vZHVsZUlkZW50aWZpZXIiCi0gICAgcmVsPSJIZWxwIj48c3Ryb25nPk1vZHVsZSBJZGVudGlmaWVyOjwvc3Ryb25nPjwvYT4KLSAgICBtcG1fbmV0d2FyZV9tb2R1bGU8L3A+Ci0KLSAgICA8aDI+U3VtbWFyeTwvaDI+Ci0KLSAgICA8cD5UaGlzIE11bHRpLVByb2Nlc3NpbmcgTW9kdWxlIChNUE0pIGltcGxlbWVudHMgYW4gZXhjbHVzaXZlbHkgdGhyZWFkZWQgd2ViIHNlcnZlcgotICAgIHRoYXQgaGFzIGJlZW4gb3B0aW1pemVkIGZvciBOb3ZlbGwgTmV0V2FyZS48L3A+Ci0KLSAgICA8cD5UaGUgbWFpbiB0aHJlYWQgaXMgcmVzcG9uc2libGUgZm9yIGxhdW5jaGluZyBjaGlsZAotICAgIHdvcmtlciB0aHJlYWRzIHdoaWNoIGxpc3RlbiBmb3IgY29ubmVjdGlvbnMgYW5kIHNlcnZlIHRoZW0gd2hlbiB0aGV5Ci0gICAgYXJyaXZlLiBBcGFjaGUgYWx3YXlzIHRyaWVzIHRvIG1haW50YWluIHNldmVyYWwgPGVtPnNwYXJlPC9lbT4KLSAgICBvciBpZGxlIHdvcmtlciB0aHJlYWRzLCB3aGljaCBzdGFuZCByZWFkeSB0byBzZXJ2ZSBpbmNvbWluZwotICAgIHJlcXVlc3RzLiBJbiB0aGlzIHdheSwgY2xpZW50cyBkbyBub3QgbmVlZCB0byB3YWl0IGZvciBhIG5ldwotICAgIGNoaWxkIHRocmVhZHMgdG8gYmUgc3Bhd25lZCBiZWZvcmUgdGhlaXIgcmVxdWVzdHMgY2FuIGJlCi0gICAgc2VydmVkLjwvcD4KLQotICAgIDxwPlRoZSA8Y29kZT5TdGFydFRocmVhZHM8L2NvZGU+LCA8Y29kZT5NaW5TcGFyZVRocmVhZHM8L2NvZGU+LAotICAgIDxjb2RlPk1heFNwYXJlVGhyZWFkczwvY29kZT4sIGFuZCA8Y29kZT5NYXhUaHJlYWRzPC9jb2RlPgotICAgIHJlZ3VsYXRlIGhvdyB0aGUgbWFpbiB0aHJlYWQgY3JlYXRlcyB3b3JrZXIgdGhyZWFkcyB0byBzZXJ2ZQotICAgIHJlcXVlc3RzLiBJbiBnZW5lcmFsLCBBcGFjaGUgaXMgdmVyeSBzZWxmLXJlZ3VsYXRpbmcsIHNvIG1vc3QKLSAgICBzaXRlcyBkbyBub3QgbmVlZCB0byBhZGp1c3QgdGhlc2UgZGlyZWN0aXZlcyBmcm9tIHRoZWlyIGRlZmF1bHQKLSAgICB2YWx1ZXMuIFNpdGVzIHdoaWNoIG5lZWQgdG8gc2VydmUgbW9yZSB0aGFuIDI1MCBzaW11bHRhbmVvdXMKLSAgICByZXF1ZXN0cyBtYXkgbmVlZCB0byBpbmNyZWFzZSA8Y29kZT5NYXhUaHJlYWRzPC9jb2RlPiwgd2hpbGUKLSAgICBzaXRlcyB3aXRoIGxpbWl0ZWQgbWVtb3J5IG1heSBuZWVkIHRvIGRlY3JlYXNlCi0gICAgPGNvZGU+TWF4VGhyZWFkczwvY29kZT4gdG8ga2VlcCB0aGUgc2VydmVyIGZyb20gdGhyYXNoaW5nIChzcGF3bmluZyBhbmQKLSAgICB0ZXJtaW5hdGluZyBpZGxlIHRocmVhZHMpLiBNb3JlIGluZm9ybWF0aW9uIGFib3V0Ci0gICAgdHVuaW5nIHByb2Nlc3MgY3JlYXRpb24gaXMgcHJvdmlkZWQgaW4gdGhlIDxhCi0gICAgaHJlZj0iLi4vbWlzYy9wZXJmLXR1bmluZy5odG1sIj5wZXJmb3JtYW5jZSBoaW50czwvYT4KLSAgICBkb2N1bWVudGF0aW9uLjwvcD4KLQotICAgIDxwPjxjb2RlPk1heFJlcXVlc3RzUGVyQ2hpbGQ8L2NvZGU+IGNvbnRyb2xzIGhvdyBmcmVxdWVudGx5IHRoZQotICAgIHNlcnZlciByZWN5Y2xlcyBwcm9jZXNzZXMgYnkga2lsbGluZyBvbGQgb25lcyBhbmQgbGF1bmNoaW5nIG5ldwotICAgIG9uZXMuJm5ic3A7IE9uIHRoZSBOZXRXYXJlIE9TIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHRoaXMgZGlyZWN0aXZlCi0gICAgcmVtYWluIHNldCB0byAwLiZuYnNwOyBUaGlzIGFsbG93cyB3b3JrZXIgdGhyZWFkcyB0byBjb250aW51ZSBzZXJ2aWNpbmcKLSAgICByZXF1ZXN0cyBpbmRlZmluaXRlbHkuPC9wPgotCi0gICAgPHA+U2VlIGFsc286IDxhIGhyZWY9Ii4uL2JpbmQuaHRtbCI+U2V0dGluZyB3aGljaCBhZGRyZXNzZXMgYW5kCi0gICAgcG9ydHMgQXBhY2hlIHVzZXM8L2E+LjwvcD4KLQotICAgIDxoMj5EaXJlY3RpdmVzPC9oMj4KLQotICAgIDx1bD4KLQotICAgICAgPGxpPjxhIGhyZWY9Im1wbV9jb21tb24uaHRtbCNsaXN0ZW4iPkxpc3RlbjwvYT48L2xpPgotCi0gICAgICA8bGk+PGEgaHJlZj0ibXBtX2NvbW1vbi5odG1sI2xpc3RlbmJhY2tsb2ciPkxpc3RlbkJhY2tsb2c8L2E+PC9saT4KLQotICAgICAgPGxpPjxhIGhyZWY9IiNtYXh0aHJlYWRzIj5NYXhUaHJlYWRzPC9hPjwvbGk+Ci0KLSAgICAgIDxsaT48YSBocmVmPSJtcG1fY29tbW9uLmh0bWwjbWF4cmVxdWVzdHNwZXJjaGlsZCI+TWF4UmVxdWVzdHNQZXJDaGlsZDwvYT48L2xpPgotCi0gICAgICA8bGk+PGEgaHJlZj0iI21heHNwYXJldGhyZWFkcyI+TWF4U3BhcmVUaHJlYWRzPC9hPjwvbGk+Ci0KLSAgICAgIDxsaT48YSBocmVmPSIjbWluc3BhcmV0aHJlYWRzIj5NaW5TcGFyZVRocmVhZHM8L2E+PC9saT4KLQotICAgICAgPGxpPjxhIGhyZWY9Im1wbV9jb21tb24uaHRtbCNzZW5kYnVmZmVyc2l6ZSI+U2VuZEJ1ZmZlclNpemU8L2E+PC9saT4KLQotICAgICAgPGxpPjxhIGhyZWY9IiNzdGFydHRocmVhZHMiPlN0YXJ0VGhyZWFkczwvYT48L2xpPgotCi0gICAgICA8bGk+PGEgaHJlZj0iI3RocmVhZHN0YWNrc2l6ZSI+VGhyZWFkU3RhY2tTaXplPC9hPjwvbGk+Ci0KLSAgICA8L3VsPgotICAgIDxociAvPgotCi0gICAgPGgyPjxhIGlkPSJtYXh0aHJlYWRzIgotICAgIG5hbWU9Im1heHRocmVhZHMiPk1heFRocmVhZHMgZGlyZWN0aXZlPC9hPjwvaDI+Ci0gICAgPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IE1heFRocmVhZHN9IGRpcmVjdGl2ZSZndDsgLS0+Ci0gICAgPGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gICAgcmVsPSJIZWxwIj48c3Ryb25nPlN5bnRheDo8L3N0cm9uZz48L2E+ICBNYXhUaHJlYWRzCi0gICAgPGVtPm51bWJlcjwvZW0+PGJyIC8+Ci0gICAgIDxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSAgICByZWw9IkhlbHAiPjxzdHJvbmc+RGVmYXVsdDo8L3N0cm9uZz48L2E+IDxjb2RlPk1heFRocmVhZHMgMjUwPC9jb2RlPjxiciAvPgotICAgICA8YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gICAgcmVsPSJIZWxwIj48c3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+PC9hPiBzZXJ2ZXIgY29uZmlnPGJyIC8+Ci0gICAgIDxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotICAgIHJlbD0iSGVscCI+PHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+PC9hPiBjb3JlPHA+VGhlIE1heFRocmVhZHMgZGlyZWN0aXZlIHNldHMgdGhlIGRlc2lyZWQgbWF4aW11bQotICAgIG51bWJlciB3b3JrZXIgdGhyZWFkcyBhbGxvd2FibGUuPC9wPgotCi0gICAgPHA+U2VlIGFsc28gPGEgaHJlZj0iI21pbnNwYXJldGhyZWFkcyI+TWluU3BhcmVUaHJlYWRzPC9hPiwgPGEgaHJlZj0iI21heHNwYXJldGhyZWFkcyI+TWF4U3BhcmVUaHJlYWRzPC9hPiBhbmQKLSAgICA8YSBocmVmPSIjc3RhcnR0aHJlYWRzIj5TdGFydFRocmVhZHM8L2E+LjwvcD4KLSAgICA8aHIgLz4KLQotICAgIDxoMj48YSBpZD0ibWF4c3BhcmV0aHJlYWRzIgotICAgIG5hbWU9Im1heHNwYXJlc2VydmVycyI+TWF4U3BhcmVUaHJlYWRzIGRpcmVjdGl2ZTwvYT48L2gyPgotICAgIDwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBNYXhTcGFyZVNlcnZlcnN9IGRpcmVjdGl2ZSZndDsgLS0+Ci0gICAgPGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gICAgcmVsPSJIZWxwIj48c3Ryb25nPlN5bnRheDo8L3N0cm9uZz48L2E+ICBNYXhTcGFyZVRocmVhZHMKLSAgICA8ZW0+bnVtYmVyPC9lbT48YnIgLz4KLSAgICAgPGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotICAgIHJlbD0iSGVscCI+PHN0cm9uZz5EZWZhdWx0Ojwvc3Ryb25nPjwvYT4gPGNvZGU+TWF4U3BhcmVUaHJlYWRzIDEwMDwvY29kZT48YnIgLz4KLSAgICAgPGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotICAgIHJlbD0iSGVscCI+PHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPjwvYT4gc2VydmVyIGNvbmZpZzxiciAvPgotICAgICA8YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSAgICByZWw9IkhlbHAiPjxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPjwvYT4gY29yZSAKLQotICAgIDxwPlRoZSBNYXhTcGFyZVRocmVhZHMgZGlyZWN0aXZlIHNldHMgdGhlIGRlc2lyZWQgbWF4aW11bQotICAgIG51bWJlciBvZiA8ZW0+aWRsZTwvZW0+ICB3b3JrZXIgdGhyZWFkcy4gQW4gaWRsZSB3b3JrZXIgdGhyZWFkCi0gICAgaXMgb25lIHdoaWNoIGlzIG5vdCBoYW5kbGluZyBhIHJlcXVlc3QuIElmIHRoZXJlIGFyZSBtb3JlIHRoYW4KLSAgICBNYXhTcGFyZVRocmVhZHMgaWRsZSwgdGhlbiB0aGUgbWFpbiB0aHJlYWQgd2lsbCBraWxsIG9mZiB0aGUKLSAgICBleGNlc3Mgd29ya2VyIHRocmVhZHMuPC9wPgotCi0gICAgPHA+VHVuaW5nIG9mIHRoaXMgcGFyYW1ldGVyIHNob3VsZCBvbmx5IGJlIG5lY2Vzc2FyeSBvbiB2ZXJ5Ci0gICAgYnVzeSBzaXRlcy4gU2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byBhIGxhcmdlIG51bWJlciBpcyBhbG1vc3QKLSAgICBhbHdheXMgYSBiYWQgaWRlYS48L3A+Ci0KLSAgICA8cD5TZWUgYWxzbyA8YSBocmVmPSIjbWluc3BhcmV0aHJlYWRzIj5NaW5TcGFyZVRocmVhZHM8L2E+LCA8YSBocmVmPSIjbWF4dGhyZWFkcyI+TWF4VGhyZWFkczwvYT4gYW5kCi0gICAgPGEgaHJlZj0iI3N0YXJ0dGhyZWFkcyI+U3RhcnRUaHJlYWRzPC9hPi48L3A+Ci0gICAgPGhyIC8+Ci0KLSAgICA8aDI+PGEgaWQ9Im1pbnNwYXJldGhyZWFkcyIKLSAgICBuYW1lPSJtaW5zcGFyZXNlcnZlcnMiPk1pblNwYXJlVGhyZWFkcyBkaXJlY3RpdmU8L2E+PC9oMj4KLSAgICA8IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgTWluU3BhcmVTZXJ2ZXJzfSBkaXJlY3RpdmUmZ3Q7IC0tPgotICAgIDxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotICAgIHJlbD0iSGVscCI+PHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+PC9hPiAgTWluU3BhcmVUaHJlYWRzCi0gICAgPGVtPm51bWJlcjwvZW0+PGJyIC8+Ci0gICAgIDxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSAgICByZWw9IkhlbHAiPjxzdHJvbmc+RGVmYXVsdDo8L3N0cm9uZz48L2E+ICA8Y29kZT5NaW5TcGFyZVRocmVhZHMgMTA8L2NvZGU+PGJyIC8+Ci0gICAgIDxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSAgICByZWw9IkhlbHAiPjxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz48L2E+IHNlcnZlciBjb25maWc8YnIgLz4KLSAgICAgPGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gICAgcmVsPSJIZWxwIj48c3Ryb25nPlN0YXR1czo8L3N0cm9uZz48L2E+IGNvcmU8cD5UaGUgTWluU3BhcmVUaHJlYWRzIGRpcmVjdGl2ZSBzZXRzIHRoZSBkZXNpcmVkIG1pbmltdW0KLSAgICBudW1iZXIgb2YgPGVtPmlkbGU8L2VtPiAgd29ya2VyIHRocmVhZHMuIEFuIGlkbGUgd29ya2VyIHRocmVhZAotICAgIGlzIG9uZSB3aGljaCBpcyBub3QgaGFuZGxpbmcgYSByZXF1ZXN0LiBJZiB0aGVyZSBhcmUgZmV3ZXIgdGhhbiBNaW5TcGFyZVRocmVhZHMgaWRsZSwgdGhlbiB0aGUKLSAgICBtYWluIHRocmVhZCBzcGF3bnMgbmV3IHdvcmtlci48L3A+Ci0KLSAgICA8cD5UdW5pbmcgb2YgdGhpcyBwYXJhbWV0ZXIgc2hvdWxkIG9ubHkgYmUgbmVjZXNzYXJ5IG9uIHZlcnkKLSAgICBidXN5IHNpdGVzLiBTZXR0aW5nIHRoaXMgcGFyYW1ldGVyIHRvIGEgbGFyZ2UgbnVtYmVyIGlzIGFsbW9zdAotICAgIGFsd2F5cyBhIGJhZCBpZGVhLjwvcD4KLQotICAgIDxwPlNlZSBhbHNvIDxhIGhyZWY9IiNtYXhzcGFyZXRocmVhZHMiPk1heFNwYXJlVGhyZWFkczwvYT4sIDxhIGhyZWY9IiNtYXh0aHJlYWRzIj5NYXhUaHJlYWRzPC9hPiBhbmQgCi0gICAgPGEgaHJlZj0iI3N0YXJ0dGhyZWFkcyI+U3RhcnRUaHJlYWRzPC9hPi4gCi0gICAgPGhyIC8+Ci0KLSAgICA8aDI+PGEgaWQ9InN0YXJ0dGhyZWFkcyIKLSAgICBuYW1lPSJzdGFydHRocmVhZHMiPlN0YXJ0VGhyZWFkcyBkaXJlY3RpdmU8L2E+PC9oMj4KLSAgICA8IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgU3RhcnRUaHJlYWRzfSBkaXJlY3RpdmUmZ3Q7IC0tPgotICAgIDxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotICAgIHJlbD0iSGVscCI+PHN0cm9uZz5TeW50YXg6PC9zdHJvbmc+PC9hPiBTdGFydFRocmVhZHMKLSAgICA8ZW0+bnVtYmVyPC9lbT48YnIgLz4KLSAgICAgPGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotICAgIHJlbD0iSGVscCI+PHN0cm9uZz5EZWZhdWx0Ojwvc3Ryb25nPjwvYT4gPGNvZGU+U3RhcnRUaHJlYWRzCi0gICAgNTA8L2NvZGU+PGJyIC8+Ci0gICAgIDxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSAgICByZWw9IkhlbHAiPjxzdHJvbmc+Q29udGV4dDo8L3N0cm9uZz48L2E+IHNlcnZlciBjb25maWc8YnIgLz4KLSAgICAgPGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gICAgcmVsPSJIZWxwIj48c3Ryb25nPlN0YXR1czo8L3N0cm9uZz48L2E+IGNvcmU8cD5UaGUgU3RhcnRUaHJlYWRzIGRpcmVjdGl2ZSBzZXRzIHRoZSBkZXNpcmVkCi0gICAgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIHRvIHNwYXduIGFuZCBzdGFydHVwLiZuYnNwOzwvcD4KLQotICAgIDxwPlNlZSBhbHNvIDxhIGhyZWY9IiNtYXhzcGFyZXRocmVhZHMiPk1heFNwYXJlVGhyZWFkczwvYT4sJm5ic3A7IDxhIGhyZWY9IiNtaW5zcGFyZXRocmVhZHMiPk1pblNwYXJlVGhyZWFkczwvYT4KLSAgICBhbmQgPGEgaHJlZj0iI21heHRocmVhZHMiPk1heFRocmVhZHM8L2E+LiAKLSAgICA8aHIgLz4KLQotICAgIDxoMj48YSBpZD0idGhyZWFkc3RhY2tzaXplIgotICAgIG5hbWU9InRocmVhZHN0YWNrc2l6ZSI+VGhyZWFkU3RhY2tTaXplPC9hPjwvaDI+Ci0gICAgPGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gICAgcmVsPSJIZWxwIj48c3Ryb25nPlN5bnRheDo8L3N0cm9uZz48L2E+IFRocmVhZFN0YWNrU2l6ZQotICAgIDxlbT5udW1iZXI8L2VtPjxiciAvPgotICAgICA8YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gICAgcmVsPSJIZWxwIj48c3Ryb25nPkRlZmF1bHQ6PC9zdHJvbmc+PC9hPiA8Y29kZT5UaHJlYWRTdGFja1NpemUKLSAgICA2NTUzNjwvY29kZT48YnIgLz4KLSAgICAgPGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotICAgIHJlbD0iSGVscCI+PHN0cm9uZz5Db250ZXh0Ojwvc3Ryb25nPjwvYT4gc2VydmVyIGNvbmZpZzxiciAvPgotICAgICA8YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSAgICByZWw9IkhlbHAiPjxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPjwvYT4gY29yZQotICAgIDxwPlRoaXMgZGlyZWN0aXZlIHRlbGxzIHRoZSBzZXJ2ZXIgd2hhdCBzdGFjayBzaXplIHRvIHVzZSBmb3IKLSAgICBlYWNoIG9mIHRoZSBydW5uaW5nIHRocmVhZHMuIElmIHlvdSBldmVyIGdldCBhIHN0YWNrIG92ZXJmbG93Ci0gICAgeW91IHdpbGwgbmVlZCB0byBidW1wIHRoaXMgbnVtYmVyIHRvIGEgaGlnaGVyIHNldHRpbmcuPC9wPgotCi0gICAgPGhyIC8+Ci0gICAgCi0gICAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLSAgPC9ib2R5PgotPC9odG1sPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbXBtX25ldHdhcmUueG1sIGIvZG9jcy9tYW51YWwvbW9kL21wbV9uZXR3YXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwZjI1OS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbXBtX25ldHdhcmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIG1vZHVsZXN5bm9wc2lzIFNZU1RFTSAiLi4vc3R5bGUvbW9kdWxlc3lub3BzaXMuZHRkIj4KLTw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9Ii4uL3N0eWxlL21hbnVhbC54c2wiPz4KLTxtb2R1bGVzeW5vcHNpcz4KLTxuYW1lPm1wbV9uZXR3YXJlPC9uYW1lPgotPGRlc2NyaXB0aW9uPk11bHRpLVByb2Nlc3NpbmcgTW9kdWxlIGltcGxlbWVudGluZyBhbiBleGNsdXNpdmVseSB0aHJlYWRlZCB3ZWIKLSAgICBzZXJ2ZXIgb3B0aW1pemVkIGZvciBOb3ZlbGwgTmV0V2FyZTwvZGVzY3JpcHRpb24+Ci08c3RhdHVzPk1QTTwvc3RhdHVzPgotPHNvdXJjZWZpbGU+bXBtX25ldHdhcmUuYzwvc291cmNlZmlsZT4KLTxpZGVudGlmaWVyPm1wbV9uZXR3YXJlX21vZHVsZTwvaWRlbnRpZmllcj4KLQotPHN1bW1hcnk+Ci0gICAgPHA+VGhpcyBNdWx0aS1Qcm9jZXNzaW5nIE1vZHVsZSAoTVBNKSBpbXBsZW1lbnRzIGFuIGV4Y2x1c2l2ZWx5IHRocmVhZGVkIHdlYiBzZXJ2ZXIKLSAgICB0aGF0IGhhcyBiZWVuIG9wdGltaXplZCBmb3IgTm92ZWxsIE5ldFdhcmUuPC9wPgotCi0gICAgPHA+VGhlIG1haW4gdGhyZWFkIGlzIHJlc3BvbnNpYmxlIGZvciBsYXVuY2hpbmcgY2hpbGQKLSAgICB3b3JrZXIgdGhyZWFkcyB3aGljaCBsaXN0ZW4gZm9yIGNvbm5lY3Rpb25zIGFuZCBzZXJ2ZSB0aGVtIHdoZW4gdGhleQotICAgIGFycml2ZS4gQXBhY2hlIGFsd2F5cyB0cmllcyB0byBtYWludGFpbiBzZXZlcmFsIDxlbT5zcGFyZTwvZW0+Ci0gICAgb3IgaWRsZSB3b3JrZXIgdGhyZWFkcywgd2hpY2ggc3RhbmQgcmVhZHkgdG8gc2VydmUgaW5jb21pbmcKLSAgICByZXF1ZXN0cy4gSW4gdGhpcyB3YXksIGNsaWVudHMgZG8gbm90IG5lZWQgdG8gd2FpdCBmb3IgYSBuZXcKLSAgICBjaGlsZCB0aHJlYWRzIHRvIGJlIHNwYXduZWQgYmVmb3JlIHRoZWlyIHJlcXVlc3RzIGNhbiBiZQotICAgIHNlcnZlZC48L3A+Ci0KLSAgICA8cD5UaGUgPGNvZGU+U3RhcnRUaHJlYWRzPC9jb2RlPiwgPGNvZGU+TWluU3BhcmVUaHJlYWRzPC9jb2RlPiwKLSAgICA8Y29kZT5NYXhTcGFyZVRocmVhZHM8L2NvZGU+LCBhbmQgPGNvZGU+TWF4VGhyZWFkczwvY29kZT4KLSAgICByZWd1bGF0ZSBob3cgdGhlIG1haW4gdGhyZWFkIGNyZWF0ZXMgd29ya2VyIHRocmVhZHMgdG8gc2VydmUKLSAgICByZXF1ZXN0cy4gSW4gZ2VuZXJhbCwgQXBhY2hlIGlzIHZlcnkgc2VsZi1yZWd1bGF0aW5nLCBzbyBtb3N0Ci0gICAgc2l0ZXMgZG8gbm90IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGRpcmVjdGl2ZXMgZnJvbSB0aGVpciBkZWZhdWx0Ci0gICAgdmFsdWVzLiBTaXRlcyB3aGljaCBuZWVkIHRvIHNlcnZlIG1vcmUgdGhhbiAyNTAgc2ltdWx0YW5lb3VzCi0gICAgcmVxdWVzdHMgbWF5IG5lZWQgdG8gaW5jcmVhc2UgPGNvZGU+TWF4VGhyZWFkczwvY29kZT4sIHdoaWxlCi0gICAgc2l0ZXMgd2l0aCBsaW1pdGVkIG1lbW9yeSBtYXkgbmVlZCB0byBkZWNyZWFzZQotICAgIDxjb2RlPk1heFRocmVhZHM8L2NvZGU+IHRvIGtlZXAgdGhlIHNlcnZlciBmcm9tIHRocmFzaGluZyAoc3Bhd25pbmcgYW5kCi0gICAgdGVybWluYXRpbmcgaWRsZSB0aHJlYWRzKS4gTW9yZSBpbmZvcm1hdGlvbiBhYm91dAotICAgIHR1bmluZyBwcm9jZXNzIGNyZWF0aW9uIGlzIHByb3ZpZGVkIGluIHRoZSA8YQotICAgIGhyZWY9Ii4uL21pc2MvcGVyZi10dW5pbmcuaHRtbCI+cGVyZm9ybWFuY2UgaGludHM8L2E+Ci0gICAgZG9jdW1lbnRhdGlvbi48L3A+Ci0KLSAgICA8cD48Y29kZT5NYXhSZXF1ZXN0c1BlckNoaWxkPC9jb2RlPiBjb250cm9scyBob3cgZnJlcXVlbnRseSB0aGUKLSAgICBzZXJ2ZXIgcmVjeWNsZXMgcHJvY2Vzc2VzIGJ5IGtpbGxpbmcgb2xkIG9uZXMgYW5kIGxhdW5jaGluZyBuZXcKLSAgICBvbmVzLiZuYnNwOyBPbiB0aGUgTmV0V2FyZSBPUyBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB0aGlzIGRpcmVjdGl2ZQotICAgIHJlbWFpbiBzZXQgdG8gMC4mbmJzcDsgVGhpcyBhbGxvd3Mgd29ya2VyIHRocmVhZHMgdG8gY29udGludWUgc2VydmljaW5nCi0gICAgcmVxdWVzdHMgaW5kZWZpbml0ZWx5LjwvcD4KLQotICAgIDxwPlNlZSBhbHNvOiA8YSBocmVmPSIuLi9iaW5kLmh0bWwiPlNldHRpbmcgd2hpY2ggYWRkcmVzc2VzIGFuZAotICAgIHBvcnRzIEFwYWNoZSB1c2VzPC9hPi48L3A+Ci08L3N1bW1hcnk+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibXBtX2NvbW1vbiI+PG5hbWU+TGlzdGVuPC9uYW1lPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibXBtX2NvbW1vbiI+PG5hbWU+TGlzdGVuQmFja2xvZzwvbmFtZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci08ZGlyZWN0aXZlc3lub3BzaXMgbG9jYXRpb249Im1wbV9jb21tb24iPjxuYW1lPk1heFJlcXVlc3RzUGVyQ2hpbGQ8L25hbWU+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotPGRpcmVjdGl2ZXN5bm9wc2lzIGxvY2F0aW9uPSJtcG1fY29tbW9uIj48bmFtZT5TZW5kQnVmZmVyU2l6ZTwvbmFtZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPk1heFRocmVhZHM8L25hbWU+Ci08c3ludGF4Pk1heFRocmVhZHMgPGVtPm51bWJlcjwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5NYXhUaHJlYWRzIDI1MDwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLTxwPlRoZSBNYXhUaHJlYWRzIGRpcmVjdGl2ZSBzZXRzIHRoZSBkZXNpcmVkIG1heGltdW0KLSAgICBudW1iZXIgd29ya2VyIHRocmVhZHMgYWxsb3dhYmxlLjwvcD4KLTwvdXNhZ2U+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXM+Ci08bmFtZT5NYXhTcGFyZVRocmVhZHM8L25hbWU+Ci08c3ludGF4Pk1heFNwYXJlVGhyZWFkcyA8ZW0+bnVtYmVyPC9lbT48L3N5bnRheD4KLTxkZWZhdWx0Pk1heFNwYXJlVGhyZWFkcyAxMDA8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIDxkaXJlY3RpdmU+TWF4U3BhcmVUaHJlYWRzPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBzZXRzIHRoZQotICAgIGRlc2lyZWQgbWF4aW11bSBudW1iZXIgb2YgPGVtPmlkbGU8L2VtPiB3b3JrZXIgdGhyZWFkcy4gQW4gaWRsZQotICAgIHdvcmtlciB0aHJlYWQgaXMgb25lIHdoaWNoIGlzIG5vdCBoYW5kbGluZyBhIHJlcXVlc3QuIElmIHRoZXJlIGFyZQotICAgIG1vcmUgdGhhbiBNYXhTcGFyZVRocmVhZHMgaWRsZSwgdGhlbiB0aGUgbWFpbiB0aHJlYWQgd2lsbCBraWxsIG9mZgotICAgIHRoZSBleGNlc3Mgd29ya2VyIHRocmVhZHMuPC9wPgotCi0gICAgPHA+VHVuaW5nIG9mIHRoaXMgcGFyYW1ldGVyIHNob3VsZCBvbmx5IGJlIG5lY2Vzc2FyeSBvbiB2ZXJ5Ci0gICAgYnVzeSBzaXRlcy4gU2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byBhIGxhcmdlIG51bWJlciBpcyBhbG1vc3QKLSAgICBhbHdheXMgYSBiYWQgaWRlYS48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+TWluU3BhcmVUaHJlYWRzPC9uYW1lPgotPHN5bnRheD5NaW5TcGFyZVRocmVhZHMgPGVtPm51bWJlcjwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5NaW5TcGFyZVRocmVhZHMgMTA8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci08cD5UaGUgPGRpcmVjdGl2ZT5NaW5TcGFyZVRocmVhZHM8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIHNldHMgdGhlCi1kZXNpcmVkIG1pbmltdW0gbnVtYmVyIG9mIDxlbT5pZGxlPC9lbT4gd29ya2VyIHRocmVhZHMuIEFuIGlkbGUgd29ya2VyCi10aHJlYWQgaXMgb25lIHdoaWNoIGlzIG5vdCBoYW5kbGluZyBhIHJlcXVlc3QuIElmIHRoZXJlIGFyZSBmZXdlciB0aGFuCi1NaW5TcGFyZVRocmVhZHMgaWRsZSwgdGhlbiB0aGUgbWFpbiB0aHJlYWQgc3Bhd25zIG5ldyB3b3JrZXIuPC9wPgotCi0gICAgPHA+VHVuaW5nIG9mIHRoaXMgcGFyYW1ldGVyIHNob3VsZCBvbmx5IGJlIG5lY2Vzc2FyeSBvbiB2ZXJ5Ci0gICAgYnVzeSBzaXRlcy4gU2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byBhIGxhcmdlIG51bWJlciBpcyBhbG1vc3QKLSAgICBhbHdheXMgYSBiYWQgaWRlYS48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+U3RhcnRUaHJlYWRzPC9uYW1lPgotPHN5bnRheD5TdGFydFRocmVhZHMgPGVtPm51bWJlcjwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5TdGFydFRocmVhZHMgNTA8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci08cD5UaGUgU3RhcnRUaHJlYWRzIGRpcmVjdGl2ZSBzZXRzIHRoZSBkZXNpcmVkCi0gICAgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIHRvIHNwYXduIGFuZCBzdGFydHVwPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPlRocmVhZFN0YWNrU2l6ZTwvbmFtZT4KLTxzeW50YXg+VGhyZWFkU3RhY2tTaXplIDxlbT5udW1iZXI8L2VtPjwvc3ludGF4PgotPGRlZmF1bHQ+VGhyZWFkU3RhY2tTaXplIDY1NTM2PC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoaXMgZGlyZWN0aXZlIHRlbGxzIHRoZSBzZXJ2ZXIgd2hhdCBzdGFjayBzaXplIHRvIHVzZSBmb3IKLSAgICBlYWNoIG9mIHRoZSBydW5uaW5nIHRocmVhZHMuIElmIHlvdSBldmVyIGdldCBhIHN0YWNrIG92ZXJmbG93Ci0gICAgeW91IHdpbGwgbmVlZCB0byBidW1wIHRoaXMgbnVtYmVyIHRvIGEgaGlnaGVyIHNldHRpbmcuPC9wPgotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTwvbW9kdWxlc3lub3BzaXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21wbV93aW5udC5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21wbV93aW5udC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGE5MGYwLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tcG1fd2lubnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIE1QTSBwdGhyZWFkPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci0KLTxIMSBBTElHTj0iQ0VOVEVSIj5NdWx0aS1Qcm9jZXNzaW5nIE1vZHVsZSBtcG1fd2lubnQ8L0gxPgotPFA+Ci1UaGlzIE11bHRpLVByb2Nlc3NpbmcgTW9kdWxlIGlzIG9wdGltaXplZCBmb3IgV2luZG93cyBOVC4KLTwvUD4KLQotPFA+PEEKLUhSRUY9Im1vZHVsZS1kaWN0Lmh0bWwjU3RhdHVzIgotUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gTVBNCi08QlI+Ci08QQotSFJFRj0ibW9kdWxlLWRpY3QuaHRtbCNTb3VyY2VGaWxlIgotUkVMPSJIZWxwIgotPjxTVFJPTkc+U291cmNlIEZpbGU6PC9TVFJPTkc+PC9BPiBtcG1fd2lubnQuYwotPEJSPgotPEEKLUhSRUY9Im1vZHVsZS1kaWN0Lmh0bWwjTW9kdWxlSWRlbnRpZmllciIKLVJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZSBJZGVudGlmaWVyOjwvU1RST05HPjwvQT4gbXBtX3dpbm50X21vZHVsZQotPC9QPgotCi08SDI+U3VtbWFyeTwvSDI+Ci0KLTxwPlRoaXMgTXVsdGktUHJvY2Vzc2luZyBNb2R1bGUgKE1QTSkgaXMgdGhlIGRlZmF1bHQgZm9yIAotdGhlIFdpbmRvd3MgTlQgb3BlcmF0aW5nIHN5c3RlbXMuICBJdCB1c2VzIGEgc2luZ2xlIGNvbnRyb2wKLXByb2Nlc3Mgd2hpY2ggbGF1bmNoZXMgYSBzaW5nbGUgY2hpbGQgcHJvY2VzcyB3aGljaCBpbiB0dXJuCi1jcmVhdGVzIHRocmVhZHMgdG8gaGFuZGxlIHJlcXVlc3RzPC9wPgotCi0KLTxIMj5EaXJlY3RpdmVzPC9IMj4KLTxVTD4KLTxsaT48YSBocmVmPSJtcG1fY29tbW9uLmh0bWwjY29yZWR1bXBkaXJlY3RvcnkiPkNvcmVEdW1wRGlyZWN0b3J5PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibXBtX2NvbW1vbi5odG1sI3BpZGZpbGUiPlBpZEZpbGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtcG1fY29tbW9uLmh0bWwjbGlzdGVuIj5MaXN0ZW48L2E+PC9saT4KLTxsaT48YSBocmVmPSJtcG1fY29tbW9uLmh0bWwjbGlzdGVuYmFja2xvZyI+TGlzdGVuQmFja2xvZzwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1wbV9jb21tb24uaHRtbCNtYXhyZXF1ZXN0c3BlcmNoaWxkIj5NYXhSZXF1ZXN0c1BlckNoaWxkPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibXBtX2NvbW1vbi5odG1sI3NlbmRidWZmZXJzaXplIj5TZW5kQnVmZmVyU2l6ZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1wbV9jb21tb24uaHRtbCN0aHJlYWRzcGVyY2hpbGQiPlRocmVhZHNQZXJDaGlsZDwvYT48L2xpPgotPC9VTD4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tcG1fd2lubnQueG1sIGIvZG9jcy9tYW51YWwvbW9kL21wbV93aW5udC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNTFiMzguLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21wbV93aW5udC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9Ii4uL3N0eWxlL21hbnVhbC54c2wiPz4KLTxtb2R1bGVzeW5vcHNpcz4KLQotPG5hbWU+bXBtX3dpbm50PC9uYW1lPgotPGRlc2NyaXB0aW9uPlRoaXMgTXVsdGktUHJvY2Vzc2luZyBNb2R1bGUgaXMgb3B0aW1pemVkIGZvciBXaW5kb3dzCi0gICAgTlQuPC9kZXNjcmlwdGlvbj4KLTxzdGF0dXM+TVBNPC9zdGF0dXM+Ci08c291cmNlZmlsZT5tcG1fd2lubnQuYzwvc291cmNlZmlsZT4KLTxpZGVudGlmaWVyPm1wbV93aW5udF9tb2R1bGU8L2lkZW50aWZpZXI+Ci0KLTxzdW1tYXJ5PgotICAgIDxwPlRoaXMgTXVsdGktUHJvY2Vzc2luZyBNb2R1bGUgKE1QTSkgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZQotICAgIFdpbmRvd3MgTlQgb3BlcmF0aW5nIHN5c3RlbXMuIEl0IHVzZXMgYSBzaW5nbGUgY29udHJvbCBwcm9jZXNzCi0gICAgd2hpY2ggbGF1bmNoZXMgYSBzaW5nbGUgY2hpbGQgcHJvY2VzcyB3aGljaCBpbiB0dXJuIGNyZWF0ZXMKLSAgICB0aHJlYWRzIHRvIGhhbmRsZSByZXF1ZXN0czwvcD4KLTwvc3VtbWFyeT4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzIGxvY2F0aW9uPSJtcG1fY29tbW9uIj48bmFtZT5Db3JlRHVtcERpcmVjdG9yeTwvbmFtZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci08ZGlyZWN0aXZlc3lub3BzaXMgbG9jYXRpb249Im1wbV9jb21tb24iPjxuYW1lPlBpZEZpbGU8L25hbWU+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotPGRpcmVjdGl2ZXN5bm9wc2lzIGxvY2F0aW9uPSJtcG1fY29tbW9uIj48bmFtZT5MaXN0ZW48L25hbWU+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotPGRpcmVjdGl2ZXN5bm9wc2lzIGxvY2F0aW9uPSJtcG1fY29tbW9uIj48bmFtZT5MaXN0ZW5CYWNrbG9nPC9uYW1lPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibXBtX2NvbW1vbiI+PG5hbWU+TWF4UmVxdWVzdHNQZXJDaGlsZDwvbmFtZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci08ZGlyZWN0aXZlc3lub3BzaXMgbG9jYXRpb249Im1wbV9jb21tb24iPjxuYW1lPlNlbmRCdWZmZXJTaXplPC9uYW1lPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibXBtX2NvbW1vbiI+PG5hbWU+VGhyZWFkc1BlckNoaWxkPC9uYW1lPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPC9tb2R1bGVzeW5vcHNpcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvcGVyY2hpbGQuaHRtbCBiL2RvY3MvbWFudWFsL21vZC9wZXJjaGlsZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWJhZmRhLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9wZXJjaGlsZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIE1QTSBtcG10X3B0aHJlYWQ8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLQotPEgxIEFMSUdOPSJDRU5URVIiPk11bHRpLVByb2Nlc3NpbmcgTW9kdWxlIHBlcmNoaWxkPC9IMT4KLTxQPgotVGhpcyBNdWx0aS1Qcm9jZXNzaW5nIE1vZHVsZSBhbGxvd3MgZm9yIGRhZW1vbiBwcm9jZXNzZXMgc2VydmluZyByZXF1ZXN0cwotdG8gYmUgYXNzaWduZWQgYSB2YXJpZXR5IG9mIGRpZmZlcmVudCB1c2VyaWRzLgotPC9QPgotCi08UD48QQotSFJFRj0ibW9kdWxlLWRpY3QuaHRtbCNTdGF0dXMiCi1SRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBNUE0KLTxCUj4KLTxBCi1IUkVGPSJtb2R1bGUtZGljdC5odG1sI1NvdXJjZUZpbGUiCi1SRUw9IkhlbHAiCi0+PFNUUk9ORz5Tb3VyY2UgRmlsZTo8L1NUUk9ORz48L0E+IHBlcmNoaWxkLmMKLTxCUj4KLTxBCi1IUkVGPSJtb2R1bGUtZGljdC5odG1sI01vZHVsZUlkZW50aWZpZXIiCi1SRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGUgSWRlbnRpZmllcjo8L1NUUk9ORz48L0E+IG1wbV9wZXJjaGlsZF9tb2R1bGUKLTwvUD4KLQotPEgyPlN1bW1hcnk8L0gyPgotCi08cD5Tb21lIGRlc2NyaXB0aW9uIG9uIGhvdyB0aGlzIHdob2xlIHRoaW5nIHdvcmtzIHdpdGggYSBjb3VwbGUgZXhhbXBsZXMuPC9wPgotCi0KLTxIMj5EaXJlY3RpdmVzPC9IMj4KLTxVTD4KLTxsaT48YSBocmVmPSIjYXNzaWdudXNlcmlkIj5Bc3NpZ25Vc2VySUQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjY2hpbGRwZXJ1c2VyaWQiPkNoaWxkUGVyVXNlcklEPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibXBtX2NvbW1vbi5odG1sI2Nvbm5lY3Rpb25zdGF0dXMiPkNvbm5lY3Rpb25TdGF0dXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtcG1fY29tbW9uLmh0bWwjY29yZWR1bXBkaXJlY3RvcnkiPkNvcmVEdW1wRGlyZWN0b3J5PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibXBtX2NvbW1vbi5odG1sI2dyb3VwIj5Hcm91cDwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1wbV9jb21tb24uaHRtbCNwaWRmaWxlIj5QaWRGaWxlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibXBtX2NvbW1vbi5odG1sI2xpc3RlbiI+TGlzdGVuPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibXBtX2NvbW1vbi5odG1sI2xpc3RlbmJhY2tsb2ciPkxpc3RlbkJhY2tsb2c8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtcG1fY29tbW9uLmh0bWwjbG9ja2ZpbGUiPkxvY2tGaWxlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibXBtX2NvbW1vbi5odG1sI21heHJlcXVlc3RzcGVyY2hpbGQiPk1heFJlcXVlc3RzUGVyQ2hpbGQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtcG1fY29tbW9uLmh0bWwjbWF4c3BhcmV0aHJlYWRzIj5NYXhTcGFyZVRocmVhZHM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtcG1fY29tbW9uLmh0bWwjbWluc3BhcmV0aHJlYWRzIj5NaW5TcGFyZVRocmVhZHM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtcG1fY29tbW9uLmh0bWwjbnVtc2VydmVycyI+TnVtU2VydmVyczwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1wbV9jb21tb24uaHRtbCNzY29yZWJvYXJkZmlsZSI+U2NvcmVCb2FyZEZpbGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtcG1fY29tbW9uLmh0bWwjc2VuZGJ1ZmZlcnNpemUiPlNlbmRCdWZmZXJTaXplPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibXBtX2NvbW1vbi5odG1sI3N0YXJ0dGhyZWFkcyI+U3RhcnRUaHJlYWRzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibXBtX2NvbW1vbi5odG1sI3VzZXIiPlVzZXI8L2E+PC9saT4KLTwvVUw+Ci0KLTxwPjxocj48L3A+Ci0KLTxIMj48QSBOQU1FPSJhc3NpZ251c2VyaWQiPkFzc2lnblVzZXJJRCBkaXJlY3RpdmU8L0E+PC9IMj4KLTxwPjxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gTVBNPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBwZXJjaGlsZDwvcD4KLQotPHA+VGllIGEgdmlydHVhbCBob3N0IHRvIGEgc3BlY2lmaWMgY2hpbGQgcHJvY2Vzcy48L3A+Ci0KLTxwPjxocj48L3A+Ci0KLTxIMj48QSBOQU1FPSJjaGlsZHBlcnVzZXJpZCI+Q2hpbGVQZXJVc2VySUQgZGlyZWN0aXZlPC9BPjwvSDI+Ci08cD48QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IE1QTTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gcGVyY2hpbGQ8L3A+Ci0KLTxwPlNwZWNpZnkgYSBVc2VyIGFuZCBHcm91cCBmb3IgYSBzcGVjaWZpYyBjaGlsZCBwcm9jZXNzLjwvcD4KLQotCi0KLQotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL3BlcmNoaWxkLnhtbCBiL2RvY3MvbWFudWFsL21vZC9wZXJjaGlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYTkyNDUuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL3BlcmNoaWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBtb2R1bGVzeW5vcHNpcyBTWVNURU0gIi4uL3N0eWxlL21vZHVsZXN5bm9wc2lzLmR0ZCI+Ci08P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveHNsIiBocmVmPSIuLi9zdHlsZS9tYW51YWwueHNsIj8+Ci08bW9kdWxlc3lub3BzaXM+Ci0KLTxuYW1lPnBlcmNoaWxkPC9uYW1lPgotPGRlc2NyaXB0aW9uPk11bHRpLVByb2Nlc3NpbmcgTW9kdWxlIGFsbG93aW5nIGZvciBkYWVtb24gcHJvY2Vzc2VzCi0gICAgc2VydmluZyByZXF1ZXN0cyB0byBiZSBhc3NpZ25lZCBhIHZhcmlldHkgb2YgZGlmZmVyZW50Ci0gICAgdXNlcmlkczwvZGVzY3JpcHRpb24+Ci08c3RhdHVzPk1QTTwvc3RhdHVzPgotPHNvdXJjZWZpbGU+cGVyY2hpbGQuYzwvc291cmNlZmlsZT4KLTxpZGVudGlmaWVyPm1wbV9wZXJjaGlsZF9tb2R1bGU8L2lkZW50aWZpZXI+Ci0KLTxzdW1tYXJ5PgotPG5vdGUgdHlwZT0id2FybmluZyI+Ci1UaGlzIE1QTSBkb2VzIG5vdCBjdXJyZW50bHkgd29yayBvbiBtb3N0IHBsYXRmb3Jtcy4gIFdvcmsgaXMgb25nb2luZyB0bwotbWFrZSBpdCBmdW5jdGlvbmFsLgotPC9ub3RlPgotCi0gICAgPHA+VGhpcyBNdWx0aS1Qcm9jZXNzaW5nIE1vZHVsZSAoTVBNKSBpbXBsZW1lbnRzIGEgaHlicmlkCi0gICAgbXVsdGktcHJvY2VzcywgbXVsdGktdGhyZWFkZWQgd2ViIHNlcnZlci4gQSBmaXhlZCBudW1iZXIgb2YKLSAgICBwcm9jZXNzZXMgY3JlYXRlIHRocmVhZHMgdG8gaGFuZGxlIHJlcXVlc3RzLiBGbHVjdHVhdGlvbnMgaW4KLSAgICBsb2FkIGFyZSBoYW5kbGVkIGJ5IGluY3JlYXNpbmcgb3IgZGVjcmVhc2luZyB0aGUgbnVtYmVyIG9mCi0gICAgdGhyZWFkcyBpbiBlYWNoIHByb2Nlc3MuPC9wPgotCi0gICAgPHA+QSBzaW5nbGUgY29udHJvbCBwcm9jZXNzIGxhdW5jaGVzIHRoZSBudW1iZXIgb2YgY2hpbGQgcHJvY2Vzc2VzCi0gICAgaW5kaWNhdGVkIGJ5IHRoZSA8ZGlyZWN0aXZlCi0gICAgbW9kdWxlPSJtcG1fY29tbW9uIj5OdW1TZXJ2ZXJzPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBhdCBzZXJ2ZXIKLSAgICBzdGFydHVwLiBFYWNoIGNoaWxkIHByb2Nlc3MgY3JlYXRlcyB0aHJlYWRzIGFzIHNwZWNpZmllZCBpbiB0aGUKLSAgICA8Y29kZT5TdGFydFRocmVhZHM8L2NvZGU+IGRpcmVjdGl2ZS4gVGhlIGluZGl2aWR1YWwgdGhyZWFkcyB0aGVuCi0gICAgbGlzdGVuIGZvciBjb25uZWN0aW9ucyBhbmQgc2VydmUgdGhlbSB3aGVuIHRoZXkgYXJyaXZlLjwvcD4KLQotICAgIDxwPkFwYWNoZSBhbHdheXMgdHJpZXMgdG8gbWFpbnRhaW4gYSBwb29sIG9mIDxlbT5zcGFyZTwvZW0+IG9yCi0gICAgaWRsZSBzZXJ2ZXIgdGhyZWFkcywgd2hpY2ggc3RhbmQgcmVhZHkgdG8gc2VydmUgaW5jb21pbmcKLSAgICByZXF1ZXN0cy4gSW4gdGhpcyB3YXksIGNsaWVudHMgZG8gbm90IG5lZWQgdG8gd2FpdCBmb3IgbmV3Ci0gICAgdGhyZWFkcyB0byBiZSBjcmVhdGVkLiBGb3IgZWFjaCBjaGlsZCBwcm9jZXNzLCBBcGFjaGUgYXNzZXNzZXMKLSAgICB0aGUgbnVtYmVyIG9mIGlkbGUgdGhyZWFkcyBhbmQgY3JlYXRlcyBvciBkZXN0cm95cyB0aHJlYWRzIHRvCi0gICAga2VlcCB0aGlzIG51bWJlciB3aXRoaW4gdGhlIGJvdW5kYXJpZXMgc3BlY2lmaWVkIGJ5Ci0gICAgPGNvZGU+TWluU3BhcmVUaHJlYWRzPC9jb2RlPiBhbmQgPGNvZGU+TWF4U3BhcmVUaHJlYWRzPC9jb2RlPi4KLSAgICBTaW5jZSB0aGlzIHByb2Nlc3MgaXMgdmVyeSBzZWxmLXJlZ3VsYXRpbmcsIGl0IGlzIHJhcmVseQotICAgIG5lY2Vzc2FyeSB0byBtb2RpZnkgdGhlc2UgZGlyZWN0aXZlcyBmcm9tIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgotICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjbGllbnRzIHRoYXQgbWF5IGJlIHNlcnZlZCBzaW11bHRhbmVvdXNseQotICAgIGlzIGRldGVybWluZWQgYnkgbXVsdGlwbHlpbmcgdGhlIG51bWJlciBvZiBzZXJ2ZXIgcHJvY2Vzc2VzCi0gICAgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgKDxjb2RlPk51bVNlcnZlcnM8L2NvZGU+KSBieSB0aGUgbWF4aW11bQotICAgIG51bWJlciBvZiB0aHJlYWRzIGNyZWF0ZWQgaW4gZWFjaCBwcm9jZXNzCi0gICAgKDxjb2RlPk1heFRocmVhZHNQZXJDaGlsZDwvY29kZT4pLjwvcD4KLQotICAgIDxwPldoaWxlIHRoZSBwYXJlbnQgcHJvY2VzcyBpcyB1c3VhbGx5IHN0YXJ0ZWQgYXMgcm9vdCB1bmRlcgotICAgIFVuaXggaW4gb3JkZXIgdG8gYmluZCB0byBwb3J0IDgwLCB0aGUgY2hpbGQgcHJvY2Vzc2VzIGFuZAotICAgIHRocmVhZHMgYXJlIGxhdW5jaGVkIGJ5IEFwYWNoZSBhcyBhIGxlc3MtcHJpdmlsZWdlZCB1c2VyLiBUaGUKLSAgICA8Y29kZT5Vc2VyPC9jb2RlPiBhbmQgPGNvZGU+R3JvdXA8L2NvZGU+IGRpcmVjdGl2ZXMgYXJlIHVzZWQgdG8KLSAgICBzZXQgdGhlIHByaXZpbGVnZXMgb2YgdGhlIEFwYWNoZSBjaGlsZCBwcm9jZXNzZXMuIFRoZSBjaGlsZAotICAgIHByb2Nlc3NlcyBtdXN0IGJlIGFibGUgdG8gcmVhZCBhbGwgdGhlIGNvbnRlbnQgdGhhdCB3aWxsIGJlCi0gICAgc2VydmVkLCBidXQgc2hvdWxkIGhhdmUgYXMgZmV3IHByaXZpbGVnZXMgYmV5b25kIHRoYXQgYXMKLSAgICBwb3NzaWJsZS4gSW4gYWRkaXRpb24sIHVubGVzcyA8YQotICAgIGhyZWY9Ii4uL3N1ZXhlYy5odG1sIj5zdWV4ZWM8L2E+IGlzIHVzZWQsIHRoZXNlIGRpcmVjdGl2ZXMgYWxzbwotICAgIHNldCB0aGUgcHJpdmlsZWdlcyB3aGljaCB3aWxsIGJlIGluaGVyaXRlZCBieSBDR0kgc2NyaXB0cy48L3A+Ci0KLSAgICA8cD48Y29kZT5NYXhSZXF1ZXN0c1BlckNoaWxkPC9jb2RlPiBjb250cm9scyBob3cgZnJlcXVlbnRseSB0aGUKLSAgICBzZXJ2ZXIgcmVjeWNsZXMgcHJvY2Vzc2VzIGJ5IGtpbGxpbmcgb2xkIG9uZXMgYW5kIGxhdW5jaGluZyBuZXcKLSAgICBvbmVzLjwvcD4KLQotICAgIDxwPlNlZSBhbHNvOiA8YSBocmVmPSIuLi9iaW5kLmh0bWwiPlNldHRpbmcgd2hpY2ggYWRkcmVzc2VzIGFuZAotICAgIHBvcnRzIEFwYWNoZSB1c2VzPC9hPi48L3A+Ci0KLSAgICA8cD5JbiBhZGRpdGlvbiBpdCBhZGRzIHRoZSBleHRyYSBhYmlsaXR5IHRvIHNwZWNpZnkgdGhhdAotICAgIHNwZWNpZmljIHByb2Nlc3NlcyBzaG91bGQgc2VydmUgcmVxdWVzdHMgdW5kZXIgZGlmZmVyZW50Ci0gICAgdXNlcmlkcy4gVGhlc2UgcHJvY2Vzc2VzIGNhbiB0aGVuIGJlIGFzc29jaWF0ZWQgd2l0aCBzcGVjaWZpYwotICAgIHZpcnR1YWwgaG9zdHMuPC9wPgotICAgIDwhLS0gWFhYOiBUaGlzIGRlc3BlcmF0ZWx5IG5lZWRzIG1vcmUgZXhwbGFuYXRpb24uIC0tPgotPC9zdW1tYXJ5PgotCi08ZGlyZWN0aXZlc3lub3BzaXMgbG9jYXRpb249Im1wbV9jb21tb24iPgotPG5hbWU+Q29yZUR1bXBEaXJlY3Rvcnk8L25hbWU+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotPGRpcmVjdGl2ZXN5bm9wc2lzIGxvY2F0aW9uPSJtcG1fY29tbW9uIj4KLTxuYW1lPkdyb3VwPC9uYW1lPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibXBtX2NvbW1vbiI+Ci08bmFtZT5QaWRGaWxlPC9uYW1lPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibXBtX2NvbW1vbiI+Ci08bmFtZT5MaXN0ZW48L25hbWU+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotPGRpcmVjdGl2ZXN5bm9wc2lzIGxvY2F0aW9uPSJtcG1fY29tbW9uIj4KLTxuYW1lPkxpc3RlbkJhY2tsb2c8L25hbWU+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotPGRpcmVjdGl2ZXN5bm9wc2lzIGxvY2F0aW9uPSJtcG1fY29tbW9uIj4KLTxuYW1lPkxvY2tGaWxlPC9uYW1lPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibXBtX2NvbW1vbiI+Ci08bmFtZT5NYXhSZXF1ZXN0c1BlckNoaWxkPC9uYW1lPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibXBtX2NvbW1vbiI+Ci08bmFtZT5NYXhTcGFyZVRocmVhZHM8L25hbWU+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotPGRpcmVjdGl2ZXN5bm9wc2lzIGxvY2F0aW9uPSJtcG1fY29tbW9uIj4KLTxuYW1lPk1heFRocmVhZHNQZXJDaGlsZDwvbmFtZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci08ZGlyZWN0aXZlc3lub3BzaXMgbG9jYXRpb249Im1wbV9jb21tb24iPgotPG5hbWU+TWluU3BhcmVUaHJlYWRzPC9uYW1lPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibXBtX2NvbW1vbiI+Ci08bmFtZT5OdW1TZXJ2ZXJzPC9uYW1lPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibXBtX2NvbW1vbiI+Ci08bmFtZT5TY29yZUJvYXJkRmlsZTwvbmFtZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci08ZGlyZWN0aXZlc3lub3BzaXMgbG9jYXRpb249Im1wbV9jb21tb24iPgotPG5hbWU+U2VuZEJ1ZmZlclNpemU8L25hbWU+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotPGRpcmVjdGl2ZXN5bm9wc2lzIGxvY2F0aW9uPSJtcG1fY29tbW9uIj4KLTxuYW1lPlN0YXJ0VGhyZWFkczwvbmFtZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci08ZGlyZWN0aXZlc3lub3BzaXMgbG9jYXRpb249Im1wbV9jb21tb24iPgotPG5hbWU+VXNlcjwvbmFtZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkFzc2lnblVzZXJJZDwvbmFtZT4KLTxzeW50YXg+QXNzaWduVXNlcklEIDxlbT51c2VyX2lkPC9lbT4gPGVtPmdyb3VwX2lkPC9lbT48L3N5bnRheD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD52aXJ0dWFsIGhvc3Q8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRpZSBhIHZpcnR1YWwgaG9zdCB0byBhIHNwZWNpZmljIGNoaWxkIHByb2Nlc3MuIFJlcXVlc3RzIGFkZHJlc3NlZCB0bwotdGhlIHZpcnR1YWwgaG9zdCB3aGVyZSB0aGlzIGRpcmVjdGl2ZSBhcHBlYXJzIHdpbGwgYmUgc2VydmVkIGJ5IHRoZSBwcm9jZXNzCi1ydW5uaW5nIHdpdGggdGhlIHNwZWNpZmllZCB1c2VyIGFuZCBncm91cCBpZC48L3A+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+Q2hpbGRQZXJVc2VySWQ8L25hbWU+Ci08c3ludGF4PkNoaWxkUGVyVXNlcklEIDxlbT51c2VyX2lkPC9lbT4KLTxlbT5ncm91cF9pZDwvZW0+IDxlbT5jaGlsZF9pZDwvZW0+PC9zeW50YXg+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+U3BlY2lmeSBhIHVzZXIgaWQgYW5kIGdyb3VwIGlkIGZvciBhIHNwZWNpZmljIGNoaWxkIHByb2Nlc3MuIFRoZSBudW1iZXIgb2YKLWNoaWxkcmVuIGlmIHNldCBieSB0aGUgPGEgaHJlZj0ibXBtX2NvbW1vbi5odG1sI251bXNlcnZlcnMiPk51bVNlcnZlcnM8L2E+Ci1kaXJlY3RpdmUuIEZvciBleGFtcGxlLCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgPGEKLWhyZWY9Im1wbV9jb21tb24uaHRtbCNudW1zZXJ2ZXJzIj5OdW1TZXJ2ZXJzPC9hPiBpcyA1IGFuZCB0aGF0IG1lYW5zCi1jaGlsZHJlbiBpZHMgMSwyLDMsNCBhbmQgNSBhcmUgYXZhaWxhYmxlIGZvciBhc3NpZ21lbnQuIElmIGEgY2hpbGQgZG9lcyBub3QKLWhhdmUgYW4gYXNzb2NpYXRlZCBDaGlsZFBlclVzZXJJRCwgaXQgaW5oZXJpdHMgdGhlIDxhCi1ocmVmPSJtcG1fY29tbW9uLmh0bWwjdXNlciI+VXNlcjwvYT4gYW5kIDxhCi1ocmVmPSJtcG1fY29tbW9uLmh0bWwjZ3JvdXAiPkdyb3VwPC9hPiBzZXR0aW5ncyBmcm9tIHRoZSBtYWluIHNlcnZlciA8L3A+IAotPC91c2FnZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTwvbW9kdWxlc3lub3BzaXM+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9wcmVmb3JrLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvcHJlZm9yay5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTMwNTcwLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9wcmVmb3JrLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgTVBNIG1wbXRfcHRocmVhZDwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotCi08SDEgQUxJR049IkNFTlRFUiI+TXVsdGktUHJvY2Vzc2luZyBNb2R1bGUgcHJlZm9yazwvSDE+Ci08UD4KLVRoaXMgTXVsdGktUHJvY2Vzc2luZyBNb2R1bGUgaW1wbGVtZW50cyBhIHByZS1mb3JraW5nIHdlYiBzZXJ2ZXIuCi08L1A+Ci0KLTxQPjxBCi1IUkVGPSJtb2R1bGUtZGljdC5odG1sI1N0YXR1cyIKLVJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IE1QTQotPEJSPgotPEEKLUhSRUY9Im1vZHVsZS1kaWN0Lmh0bWwjU291cmNlRmlsZSIKLVJFTD0iSGVscCIKLT48U1RST05HPlNvdXJjZSBGaWxlOjwvU1RST05HPjwvQT4gcHJlZm9yay5jCi08QlI+Ci08QQotSFJFRj0ibW9kdWxlLWRpY3QuaHRtbCNNb2R1bGVJZGVudGlmaWVyIgotUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlIElkZW50aWZpZXI6PC9TVFJPTkc+PC9BPiBtcG1fcHJlZm9ya19tb2R1bGUKLTwvUD4KLQotPEgyPlN1bW1hcnk8L0gyPgotCi08cD5UaGlzIE11bHRpLVByb2Nlc3NpbmcgTW9kdWxlIChNUE0pIGltcGxlbWVudHMgYSBwcmUtZm9ya2luZwotbm9uLXRocmVhZGVkIHdlYiBzZXJ2ZXIgd2hpY2ggaGFuZGxlcyByZXF1ZXN0IGluIGEgbWFubmVyCi12ZXJ5IHNpbWlsYXIgdG8gdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgQXBhY2hlIDEuMyBvbiBVbml4LjwvcD4KLQotCi08SDI+RGlyZWN0aXZlczwvSDI+Ci08VUw+Ci08bGk+PGEgaHJlZj0ibXBtX2NvbW1vbi5odG1sI2NvcmVkdW1wZGlyZWN0b3J5Ij5Db3JlRHVtcERpcmVjdG9yeTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1wbV9jb21tb24uaHRtbCNwaWRmaWxlIj5QaWRGaWxlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibXBtX2NvbW1vbi5odG1sI2xvY2tmaWxlIj5Mb2NrRmlsZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1wbV9jb21tb24uaHRtbCNtYXhjbGllbnRzIj5NYXhDbGllbnRzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibXBtX2NvbW1vbi5odG1sI21heHJlcXVlc3RzcGVyY2hpbGQiPk1heFJlcXVlc3RzUGVyQ2hpbGQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjbWF4c3BhcmV0aHJlYWRzIj5NYXhTcGFyZVNlcnZlcnM8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjbWluc3BhcmV0aHJlYWRzIj5NaW5TcGFyZVNlcnZlcnM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtcG1fY29tbW9uLmh0bWwjc2NvcmVib2FyZGZpbGUiPlNjb3JlQm9hcmRGaWxlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibXBtX2NvbW1vbi5odG1sI3N0YXJ0c2VydmVycyI+U3RhcnRTZXJ2ZXJzPC9hPjwvbGk+Ci08L1VMPgotCi08aHI+Ci0KLQotPEgyPjxBIE5BTUU9Im1heHNwYXJlc2VydmVycyI+TWF4U3BhcmVTZXJ2ZXJzIGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IE1heFNwYXJlU2VydmVyc30gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gTWF4U3BhcmVTZXJ2ZXJzIDxFTT5udW1iZXI8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5NYXhTcGFyZVNlcnZlcnMgMTA8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGNvcmU8UD4KLQotVGhlIE1heFNwYXJlU2VydmVycyBkaXJlY3RpdmUgc2V0cyB0aGUgZGVzaXJlZCBtYXhpbXVtIG51bWJlciBvZiA8RU0+aWRsZTwvRU0+Ci1jaGlsZCBzZXJ2ZXIgcHJvY2Vzc2VzLiBBbiBpZGxlIHByb2Nlc3MgaXMgb25lIHdoaWNoIGlzIG5vdCBoYW5kbGluZwotYSByZXF1ZXN0LiBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuIE1heFNwYXJlU2VydmVycyBpZGxlLCB0aGVuIHRoZSBwYXJlbnQKLXByb2Nlc3Mgd2lsbCBraWxsIG9mZiB0aGUgZXhjZXNzIHByb2Nlc3Nlcy48UD4KLQotVHVuaW5nIG9mIHRoaXMgcGFyYW1ldGVyIHNob3VsZCBvbmx5IGJlIG5lY2Vzc2FyeSBvbiB2ZXJ5IGJ1c3kgc2l0ZXMuCi1TZXR0aW5nIHRoaXMgcGFyYW1ldGVyIHRvIGEgbGFyZ2UgbnVtYmVyIGlzIGFsbW9zdCBhbHdheXMgYSBiYWQgaWRlYS48UD4KLQotPFA+Ci0KLVNlZSBhbHNvIDxBIEhSRUY9IiNtaW5zcGFyZXNlcnZlcnMiPk1pblNwYXJlU2VydmVyczwvQT4gYW5kCi08QSBIUkVGPSJtcG1fY29tbW9uLmh0bWwjc3RhcnRzZXJ2ZXJzIj5TdGFydFNlcnZlcnM8L0E+LjxQPjxIUj4KLQotPEgyPjxBIE5BTUU9Im1pbnNwYXJlc2VydmVycyI+TWluU3BhcmVTZXJ2ZXJzIGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IE1pblNwYXJlU2VydmVyc30gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gTWluU3BhcmVTZXJ2ZXJzIDxFTT5udW1iZXI8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5NaW5TcGFyZVNlcnZlcnMgNTwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gY29yZTxQPgotCi1UaGUgTWluU3BhcmVTZXJ2ZXJzIGRpcmVjdGl2ZSBzZXRzIHRoZSBkZXNpcmVkIG1pbmltdW0gbnVtYmVyIG9mIDxFTT5pZGxlPC9FTT4KLWNoaWxkIHNlcnZlciBwcm9jZXNzZXMuIEFuIGlkbGUgcHJvY2VzcyBpcyBvbmUgd2hpY2ggaXMgbm90IGhhbmRsaW5nCi1hIHJlcXVlc3QuIElmIHRoZXJlIGFyZSBmZXdlciB0aGFuIE1pblNwYXJlU2VydmVycyBpZGxlLCB0aGVuIHRoZSBwYXJlbnQKLXByb2Nlc3MgY3JlYXRlcyBuZXcgY2hpbGRyZW4gYXQgYSBtYXhpbXVtIHJhdGUgb2YgMSBwZXIgc2Vjb25kLjxQPgotCi1UdW5pbmcgb2YgdGhpcyBwYXJhbWV0ZXIgc2hvdWxkIG9ubHkgYmUgbmVjZXNzYXJ5IG9uIHZlcnkgYnVzeSBzaXRlcy4KLVNldHRpbmcgdGhpcyBwYXJhbWV0ZXIgdG8gYSBsYXJnZSBudW1iZXIgaXMgYWxtb3N0IGFsd2F5cyBhIGJhZCBpZGVhLjxQPgotCi1UaGlzIGRpcmVjdGl2ZSBoYXMgbm8gZWZmZWN0IG9uIE1pY3Jvc29mdCBXaW5kb3dzLgotCi08UD4KLQotU2VlIGFsc28gPEEgSFJFRj0iI21heHNwYXJlc2VydmVycyI+TWF4U3BhcmVTZXJ2ZXJzPC9BPiBhbmQKLTxBIEhSRUY9Im1wbV9jb21tb24uaHRtbCNzdGFydHNlcnZlcnMiPlN0YXJ0U2VydmVyczwvQT4uPFA+PEhSPgotCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvcHJlZm9yay54bWwgYi9kb2NzL21hbnVhbC9tb2QvcHJlZm9yay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZDc4ODguLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL3ByZWZvcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iLi4vc3R5bGUvbWFudWFsLnhzbCI/PgotPG1vZHVsZXN5bm9wc2lzPgotPG5hbWU+cHJlZm9yazwvbmFtZT4KLTxkZXNjcmlwdGlvbj5JbXBsZW1lbnRzIGEgbm9uLXRocmVhZGVkLCBwcmUtZm9ya2luZyB3ZWIgc2VydmVyPC9kZXNjcmlwdGlvbj4KLTxzdGF0dXM+TVBNPC9zdGF0dXM+Ci08c291cmNlZmlsZT5wcmVmb3JrLmM8L3NvdXJjZWZpbGU+Ci08aWRlbnRpZmllcj5tcG1fcHJlZm9ya19tb2R1bGU8L2lkZW50aWZpZXI+Ci0KLTxzdW1tYXJ5PgotICAgIDxwPlRoaXMgTXVsdGktUHJvY2Vzc2luZyBNb2R1bGUgKE1QTSkgaW1wbGVtZW50cyBhCi0gICAgbm9uLXRocmVhZGVkLCBwcmUtZm9ya2luZyB3ZWIgc2VydmVyIHdoaWNoIGhhbmRsZXMgcmVxdWVzdCBpbiBhCi0gICAgbWFubmVyIHZlcnkgc2ltaWxhciB0byB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBBcGFjaGUgMS4zIG9uCi0gICAgVW5peC48L3A+Ci0KLSAgICA8cD5BIHNpbmdsZSBjb250cm9sIHByb2Nlc3MgaXMgcmVzcG9uc2libGUgZm9yIGxhdW5jaGluZyBjaGlsZAotICAgIHByb2Nlc3NlcyB3aGljaCBsaXN0ZW4gZm9yIGNvbm5lY3Rpb25zIGFuZCBzZXJ2ZSB0aGVtIHdoZW4gdGhleQotICAgIGFycml2ZS4gQXBhY2hlIGFsd2F5cyB0cmllcyB0byBtYWludGFpbiBzZXZlcmFsIDxlbT5zcGFyZTwvZW0+Ci0gICAgb3IgaWRsZSBzZXJ2ZXIgcHJvY2Vzc2VzLCB3aGljaCBzdGFuZCByZWFkeSB0byBzZXJ2ZSBpbmNvbWluZwotICAgIHJlcXVlc3RzLiBJbiB0aGlzIHdheSwgY2xpZW50cyBkbyBub3QgbmVlZCB0byB3YWl0IGZvciBhIG5ldwotICAgIGNoaWxkIHByb2Nlc3NlcyB0byBiZSBmb3JrZWQgYmVmb3JlIHRoZWlyIHJlcXVlc3RzIGNhbiBiZQotICAgIHNlcnZlZC48L3A+Ci0KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZSBtb2R1bGU9Im1wbV9jb21tb24iPlN0YXJ0U2VydmVyczwvZGlyZWN0aXZlPiwKLSAgICA8ZGlyZWN0aXZlIG1vZHVsZT0icHJlZm9yayI+TWluU3BhcmVTZXJ2ZXJzPC9kaXJlY3RpdmU+LAotICAgIDxkaXJlY3RpdmUgbW9kdWxlPSJwcmVmb3JrIj5NYXhTcGFyZVNlcnZlcnM8L2RpcmVjdGl2ZT4sIGFuZAotICAgIDxkaXJlY3RpdmUgbW9kdWxlPSJtcG1fY29tbW9uIj5NYXhDbGllbnRzPC9kaXJlY3RpdmU+IHJlZ3VsYXRlIGhvdwotICAgIHRoZSBwYXJlbnQgcHJvY2VzcyBjcmVhdGVzIGNoaWxkcmVuIHRvIHNlcnZlIHJlcXVlc3RzLiBJbiBnZW5lcmFsLAotICAgIEFwYWNoZSBpcyB2ZXJ5IHNlbGYtcmVndWxhdGluZywgc28gbW9zdCBzaXRlcyBkbyBub3QgbmVlZCB0bwotICAgIGFkanVzdCB0aGVzZSBkaXJlY3RpdmVzIGZyb20gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuIFNpdGVzIHdoaWNoCi0gICAgbmVlZCB0byBzZXJ2ZSBtb3JlIHRoYW4gMjU2IHNpbXVsdGFuZW91cyByZXF1ZXN0cyBtYXkgbmVlZCB0bwotICAgIGluY3JlYXNlIDxkaXJlY3RpdmUgbW9kdWxlPSJtcG1fY29tbW9uIj5NYXhDbGllbnRzPC9kaXJlY3RpdmU+LAotICAgIHdoaWxlIHNpdGVzIHdpdGggbGltaXRlZCBtZW1vcnkgbWF5IG5lZWQgdG8gZGVjcmVhc2UgPGRpcmVjdGl2ZQotICAgIG1vZHVsZT0ibXBtX2NvbW1vbiI+TWF4Q2xpZW50czwvZGlyZWN0aXZlPiB0byBrZWVwIHRoZSBzZXJ2ZXIgZnJvbQotICAgIHRocmFzaGluZyAoc3dhcHBpbmcgbWVtb3J5IHRvIGRpc2sgYW5kIGJhY2spLiBNb3JlIGluZm9ybWF0aW9uCi0gICAgYWJvdXQgdHVuaW5nIHByb2Nlc3MgY3JlYXRpb24gaXMgcHJvdmlkZWQgaW4gdGhlIDxhCi0gICAgaHJlZj0iLi4vbWlzYy9wZXJmLXR1bmluZy5odG1sIj5wZXJmb3JtYW5jZSBoaW50czwvYT4KLSAgICBkb2N1bWVudGF0aW9uLjwvcD4KLQotICAgIDxwPldoaWxlIHRoZSBwYXJlbnQgcHJvY2VzcyBpcyB1c3VhbGx5IHN0YXJ0ZWQgYXMgcm9vdCB1bmRlciBVbml4Ci0gICAgaW4gb3JkZXIgdG8gYmluZCB0byBwb3J0IDgwLCB0aGUgY2hpbGQgcHJvY2Vzc2VzIGFyZSBsYXVuY2hlZCBieQotICAgIEFwYWNoZSBhcyBhIGxlc3MtcHJpdmlsZWdlZCB1c2VyLiBUaGUgPGRpcmVjdGl2ZQotICAgIG1vZHVsZT0ibXBtX2NvbW1vbiI+VXNlcjwvZGlyZWN0aXZlPiBhbmQgPGRpcmVjdGl2ZQotICAgIG1vZHVsZT0ibXBtX2NvbW1vbiI+R3JvdXA8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlcyBhcmUgdXNlZCB0byBzZXQKLSAgICB0aGUgcHJpdmlsZWdlcyBvZiB0aGUgQXBhY2hlIGNoaWxkIHByb2Nlc3Nlcy4gVGhlIGNoaWxkIHByb2Nlc3NlcwotICAgIG11c3QgYmUgYWJsZSB0byByZWFkIGFsbCB0aGUgY29udGVudCB0aGF0IHdpbGwgYmUgc2VydmVkLCBidXQKLSAgICBzaG91bGQgaGF2ZSBhcyBmZXcgcHJpdmlsZWdlcyBiZXlvbmQgdGhhdCBhcyBwb3NzaWJsZS4gSW4KLSAgICBhZGRpdGlvbiwgdW5sZXNzIDxhIGhyZWY9Ii4uL3N1ZXhlYy5odG1sIj5zdWV4ZWM8L2E+IGlzIHVzZWQsCi0gICAgdGhlc2UgZGlyZWN0aXZlcyBhbHNvIHNldCB0aGUgcHJpdmlsZWdlcyB3aGljaCB3aWxsIGJlIGluaGVyaXRlZAotICAgIGJ5IENHSSBzY3JpcHRzLjwvcD4KLQotICAgIDxwPjxkaXJlY3RpdmUgbW9kdWxlPSJtcG1fY29tbW9uIj5NYXhSZXF1ZXN0c1BlckNoaWxkPC9kaXJlY3RpdmU+Ci0gICAgY29udHJvbHMgaG93IGZyZXF1ZW50bHkgdGhlIHNlcnZlciByZWN5Y2xlcyBwcm9jZXNzZXMgYnkga2lsbGluZwotICAgIG9sZCBvbmVzIGFuZCBsYXVuY2hpbmcgbmV3IG9uZXMuPC9wPgotPC9zdW1tYXJ5PgotPHNlZWFsc28+PGEgaHJlZj0iLi4vYmluZC5odG1sIj5TZXR0aW5nIHdoaWNoIGFkZHJlc3NlcyBhbmQKLSAgICBwb3J0cyBBcGFjaGUgdXNlczwvYT48L3NlZWFsc28+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibXBtX2NvbW1vbiI+Ci08bmFtZT5Db3JlRHVtcERpcmVjdG9yeTwvbmFtZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibXBtX2NvbW1vbiI+Ci08bmFtZT5QaWRGaWxlPC9uYW1lPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzIGxvY2F0aW9uPSJtcG1fY29tbW9uIj4KLTxuYW1lPkxpc3RlbjwvbmFtZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibXBtX2NvbW1vbiI+Ci08bmFtZT5MaXN0ZW5CYWNrbG9nPC9uYW1lPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzIGxvY2F0aW9uPSJtcG1fY29tbW9uIj4KLTxuYW1lPkxvY2tGaWxlPC9uYW1lPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzIGxvY2F0aW9uPSJtcG1fY29tbW9uIj4KLTxuYW1lPk1heFJlcXVlc3RzUGVyQ2hpbGQ8L25hbWU+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXMgbG9jYXRpb249Im1wbV9jb21tb24iPgotPG5hbWU+TWF4U3BhcmVTZXJ2ZXJzPC9uYW1lPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzIGxvY2F0aW9uPSJtcG1fY29tbW9uIj4KLTxuYW1lPk1pblNwYXJlU2VydmVyczwvbmFtZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibXBtX2NvbW1vbiI+Ci08bmFtZT5TY29yZUJvYXJkRmlsZTwvbmFtZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibXBtX2NvbW1vbiI+Ci08bmFtZT5TZW5kQnVmZmVyU2l6ZTwvbmFtZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibXBtX2NvbW1vbiI+Ci08bmFtZT5TZXJ2ZXJMaW1pdDwvbmFtZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibXBtX2NvbW1vbiI+Ci08bmFtZT5TdGFydFNlcnZlcnM8L25hbWU+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotCi08ZGlyZWN0aXZlc3lub3BzaXMgbG9jYXRpb249Im1wbV9jb21tb24iPgotPG5hbWU+VXNlcjwvbmFtZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPkFjY2VwdE11dGV4PC9uYW1lPgotPGRlc2NyaXB0aW9uPk1ldGhvZCB0aGF0IEFwYWNoZSB1c2VzIHRvIHNlcmlhbGl6ZSBtdWx0aXBsZSBjaGlsZHJlbgotYWNjZXB0aW5nIHJlcXVlc3RzIG9uIG5ldHdvcmsgc29ja2V0czwvZGVzY3JpcHRpb24+Ci08c3ludGF4PkFjY2VwdE11dGV4IGRlZmF1bHR8PGVtPm1ldGhvZDwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5BY2NlcHRNdXRleCBkZWZhdWx0PC9kZWZhdWx0PgotPGNvbnRleHRsaXN0Pjxjb250ZXh0PnNlcnZlciBjb25maWc8L2NvbnRleHQ+PC9jb250ZXh0bGlzdD4KLQotPHVzYWdlPgotICAgIDxwPlRoZSA8ZGlyZWN0aXZlPkFjY2VwdE11dGV4PC9kaXJlY3RpdmU+IGRpcmVjdGl2ZXMgc2V0cyB0aGUKLSAgICBtZXRob2QgdGhhdCBBcGFjaGUgdXNlcyB0byBzZXJpYWxpemUgbXVsdGlwbGUgY2hpbGRyZW4gYWNjZXB0aW5nCi0gICAgcmVxdWVzdHMgb24gbmV0d29yayBzb2NrZXRzLiBQcmlvciB0byBBcGFjaGUgMi4wLCB0aGUgbWV0aG9kIHdhcwotICAgIHNlbGVjdGFibGUgb25seSBhdCBjb21waWxlIHRpbWUuIFRoZSBvcHRpbWFsIG1ldGhvZCB0byB1c2UgaXMKLSAgICBoaWdobHkgYXJjaGl0ZWN0dXJlIGFuZCBwbGF0Zm9ybSBkZXBlbmRlbnQuIEZvciBmdXJ0aGVyIGRldGFpbHMsCi0gICAgc2VlIHRoZSA8YSBocmVmPSIuLi9taXNjL3BlcmYtdHVuaW5nLmh0bWwiPnBlcmZvcm1hbmNlIHR1bmluZzwvYT4KLSAgICBkb2N1bWVudGF0aW9uLjwvcD4KLQotICAgIDxwPklmIHRoaXMgZGlyZWN0aXZlIGlzIHNldCB0byA8Y29kZT5kZWZhdWx0PC9jb2RlPiwgdGhlbiB0aGUKLSAgICBjb21waWxlLXRpbWUgc2VsZWN0ZWQgZGVmYXVsdCB3aWxsIGJlIHVzZWQuIE90aGVyIHBvc3NpYmxlCi0gICAgbWV0aG9kcyBhcmUgbGlzdGVkIGJlbG93LiBOb3RlIHRoYXQgbm90IGFsbCBtZXRob2RzIGFyZQotICAgIGF2YWlsYWJsZSBvbiBhbGwgcGxhdGZvcm1zLiBJZiBhIG1ldGhvZCBpcyBzcGVjaWZpZWQgd2hpY2ggaXMKLSAgICBub3QgYXZhaWxhYmxlLCBhIG1lc3NhZ2Ugd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBlcnJvciBsb2cKLSAgICBsaXN0aW5nIHRoZSBhdmFpbGFibGUgbWV0aG9kcy48L3A+Ci0KLSAgICA8ZGw+Ci0gICAgICA8ZHQ+PGNvZGU+ZmxvY2s8L2NvZGU+PC9kdD4KLQotICAgICAgPGRkPnVzZXMgdGhlIDxjb2RlPmZsb2NrKDIpPC9jb2RlPiBzeXN0ZW0gY2FsbCB0byBsb2NrIHRoZQotICAgICAgZmlsZSBkZWZpbmVkIGJ5IHRoZSA8ZGlyZWN0aXZlIG1vZHVsZT0ibXBtX2NvbW1vbiIKLSAgICAgID5Mb2NrRmlsZTwvZGlyZWN0aXZlPiBkaXJlY3RpdmUuPC9kZD4KLQotICAgICAgPGR0Pjxjb2RlPmZjbnRsPC9jb2RlPjwvZHQ+Ci0KLSAgICAgIDxkZD51c2VzIHRoZSA8Y29kZT5mbmN0bCgyKTwvY29kZT4gc3lzdGVtIGNhbGwgdG8gbG9jayB0aGUKLSAgICAgIGZpbGUgZGVmaW5lZCBieSB0aGUgPGRpcmVjdGl2ZSBtb2R1bGU9Im1wbV9jb21tb24iCi0gICAgICA+TG9ja0ZpbGU8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlLjwvZGQ+Ci0KLSAgICAgIDxkdD48Y29kZT5zeXN2c2VtPC9jb2RlPjwvZHQ+Ci0KLSAgICAgIDxkZD51c2VzIFN5U1Ytc3R5bGUgc2VtYXBob3JlcyB0byBpbXBsZW1lbnQgdGhlIG11dGV4LjwvZGQ+Ci0KLSAgICAgIDxkdD48Y29kZT5wdGhyZWFkPC9jb2RlPjwvZHQ+Ci0KLSAgICAgIDxkZD51c2VzIFBPU0lYIG11dGV4ZXMgYXMgaW1wbGVtZW50ZWQgYnkgdGhlIFBPU0lYIFRocmVhZHMKLSAgICAgIChQVGhyZWFkcykgc3BlY2lmaWNhdGlvbi48L2RkPgotICAgIDwvZGw+Ci08L3VzYWdlPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLQotPGRpcmVjdGl2ZXN5bm9wc2lzPgotPG5hbWU+TWF4U3BhcmVTZXJ2ZXJzPC9uYW1lPgotPGRlc2NyaXB0aW9uPk1heGltdW0gbnVtYmVyIG9mIGlkbGUgY2hpbGQgc2VydmVyIHByb2Nlc3NlczwvZGVzY3JpcHRpb24+Ci08c3ludGF4Pk1heFNwYXJlU2VydmVycyA8ZW0+bnVtYmVyPC9lbT48YnIgLz48L3N5bnRheD4KLTxkZWZhdWx0Pk1heFNwYXJlU2VydmVycyAxMDwvZGVmYXVsdD4KLTxjb250ZXh0bGlzdD48Y29udGV4dD5zZXJ2ZXIgY29uZmlnPC9jb250ZXh0PjwvY29udGV4dGxpc3Q+Ci0KLTx1c2FnZT4KLSAgICA8cD5UaGUgPGRpcmVjdGl2ZT5NYXhTcGFyZVNlcnZlcnM8L2RpcmVjdGl2ZT4gZGlyZWN0aXZlIHNldHMgdGhlCi0gICAgZGVzaXJlZCBtYXhpbXVtIG51bWJlciBvZiA8ZW0+aWRsZTwvZW0+IGNoaWxkIHNlcnZlciBwcm9jZXNzZXMuIEFuCi0gICAgaWRsZSBwcm9jZXNzIGlzIG9uZSB3aGljaCBpcyBub3QgaGFuZGxpbmcgYSByZXF1ZXN0LiBJZiB0aGVyZSBhcmUKLSAgICBtb3JlIHRoYW4gTWF4U3BhcmVTZXJ2ZXJzIGlkbGUsIHRoZW4gdGhlIHBhcmVudCBwcm9jZXNzIHdpbGwga2lsbAotICAgIG9mZiB0aGUgZXhjZXNzIHByb2Nlc3Nlcy48L3A+Ci0KLSAgICA8cD5UdW5pbmcgb2YgdGhpcyBwYXJhbWV0ZXIgc2hvdWxkIG9ubHkgYmUgbmVjZXNzYXJ5IG9uIHZlcnkKLSAgICBidXN5IHNpdGVzLiBTZXR0aW5nIHRoaXMgcGFyYW1ldGVyIHRvIGEgbGFyZ2UgbnVtYmVyIGlzIGFsbW9zdAotICAgIGFsd2F5cyBhIGJhZCBpZGVhLjwvcD4KLTwvdXNhZ2U+Ci08c2VlYWxzbz48ZGlyZWN0aXZlIG1vZHVsZT0icHJlZm9yayI+TWluU3BhcmVTZXJ2ZXJzPC9kaXJlY3RpdmU+PC9zZWVhbHNvPgotPHNlZWFsc28+PGRpcmVjdGl2ZSBtb2R1bGU9Im1wbV9jb21tb24iPlN0YXJ0U2VydmVyczwvZGlyZWN0aXZlPjwvc2VlYWxzbz4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcz4KLTxuYW1lPk1pblNwYXJlU2VydmVyczwvbmFtZT4KLTxkZXNjcmlwdGlvbj5NaW5pbXVtIG51bWJlciBvZiBpZGxlIGNoaWxkIHNlcnZlciBwcm9jZXNzZXM8L2Rlc2NyaXB0aW9uPgotPHN5bnRheD5NaW5TcGFyZVNlcnZlcnMgPGVtPm51bWJlcjwvZW0+PC9zeW50YXg+Ci08ZGVmYXVsdD5NaW5TcGFyZVNlcnZlcnMgIDU8L2RlZmF1bHQ+Ci08Y29udGV4dGxpc3Q+PGNvbnRleHQ+c2VydmVyIGNvbmZpZzwvY29udGV4dD48L2NvbnRleHRsaXN0PgotCi08dXNhZ2U+Ci0gICAgPHA+VGhlIDxkaXJlY3RpdmU+TWluU3BhcmVTZXJ2ZXJzPC9kaXJlY3RpdmU+IGRpcmVjdGl2ZSBzZXRzIHRoZQotICAgIGRlc2lyZWQgbWluaW11bSBudW1iZXIgb2YgPGVtPmlkbGU8L2VtPiBjaGlsZCBzZXJ2ZXIgcHJvY2Vzc2VzLiBBbgotICAgIGlkbGUgcHJvY2VzcyBpcyBvbmUgd2hpY2ggaXMgbm90IGhhbmRsaW5nIGEgcmVxdWVzdC4gSWYgdGhlcmUgYXJlCi0gICAgZmV3ZXIgdGhhbiBNaW5TcGFyZVNlcnZlcnMgaWRsZSwgdGhlbiB0aGUgcGFyZW50IHByb2Nlc3MgY3JlYXRlcwotICAgIG5ldyBjaGlsZHJlbiBhdCBhIG1heGltdW0gcmF0ZSBvZiAxIHBlciBzZWNvbmQuPC9wPgotCi0gICAgPHA+VHVuaW5nIG9mIHRoaXMgcGFyYW1ldGVyIHNob3VsZCBvbmx5IGJlIG5lY2Vzc2FyeSBvbiB2ZXJ5Ci0gICAgYnVzeSBzaXRlcy4gU2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byBhIGxhcmdlIG51bWJlciBpcyBhbG1vc3QKLSAgICBhbHdheXMgYSBiYWQgaWRlYS48L3A+Ci0KLSAgICA8cD5UaGlzIGRpcmVjdGl2ZSBoYXMgbm8gZWZmZWN0IG9uIE1pY3Jvc29mdCBXaW5kb3dzLjwvcD4KLTwvdXNhZ2U+Ci08c2VlYWxzbz48ZGlyZWN0aXZlIG1vZHVsZT0icHJlZm9yayI+TWF4U3BhcmVTZXJ2ZXJzPC9kaXJlY3RpdmU+PC9zZWVhbHNvPgotPHNlZWFsc28+PGRpcmVjdGl2ZSBtb2R1bGU9Im1wbV9jb21tb24iPlN0YXJ0U2VydmVyczwvZGlyZWN0aXZlPjwvc2VlYWxzbz4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTwvbW9kdWxlc3lub3BzaXM+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC93b3JrZXIuaHRtbCBiL2RvY3MvbWFudWFsL21vZC93b3JrZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhlNGQ2Ni4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2Qvd29ya2VyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLSAgPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJIVE1MIFRpZHksIHNlZSB3d3cudzMub3JnIiAvPgotCi0gICAgPHRpdGxlPkFwYWNoZSBNUE0gd29ya2VyPC90aXRsZT4KLSAgPC9oZWFkPgotICA8IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci0KLSAgPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdGV4dD0iIzAwMDAwMCIgbGluaz0iIzAwMDBGRiIKLSAgdmxpbms9IiMwMDAwODAiIGFsaW5rPSIjRkYwMDAwIj4KLSAgICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotCi0gICAgPGgxIGFsaWduPSJDRU5URVIiPk11bHRpLVByb2Nlc3NpbmcgTW9kdWxlIHdvcmtlcjwvaDE+Ci0KLSAgICA8cD5UaGlzIE11bHRpLVByb2Nlc3NpbmcgTW9kdWxlIGltcGxlbWVudHMgYSBoeWJyaWQKLSAgICBtdWx0aS10aHJlYWRlZCBtdWx0aS1wcm9jZXNzIHdlYiBzZXJ2ZXIuPC9wPgotCi0gICAgPHA+PGEgaHJlZj0ibW9kdWxlLWRpY3QuaHRtbCNTdGF0dXMiCi0gICAgcmVsPSJIZWxwIj48c3Ryb25nPlN0YXR1czo8L3N0cm9uZz48L2E+IE1QTTxiciAvPgotICAgICA8YSBocmVmPSJtb2R1bGUtZGljdC5odG1sI1NvdXJjZUZpbGUiCi0gICAgcmVsPSJIZWxwIj48c3Ryb25nPlNvdXJjZSBGaWxlOjwvc3Ryb25nPjwvYT4gd29ya2VyLmM8YnIgLz4KLSAgICAgPGEgaHJlZj0ibW9kdWxlLWRpY3QuaHRtbCNNb2R1bGVJZGVudGlmaWVyIgotICAgIHJlbD0iSGVscCI+PHN0cm9uZz5Nb2R1bGUgSWRlbnRpZmllcjo8L3N0cm9uZz48L2E+Ci0gICAgbXBtX3dvcmtlcl9tb2R1bGU8L3A+Ci0KLSAgICA8aDI+U3VtbWFyeTwvaDI+Ci0KLSAgICA8cD5UaGlzIE11bHRpLVByb2Nlc3NpbmcgTW9kdWxlIChNUE0pIGlzIHRoZSBkZWZhdWx0IGZvciBtb3N0Ci0gICAgdW5peC1saWtlIG9wZXJhdGluZyBzeXN0ZW1zLiBJdCBpbXBsZW1lbnRzIGEgaHlicmlkCi0gICAgbXVsdGktcHJvY2VzcyBtdWx0aS10aHJlYWRlZCBzZXJ2ZXIuIEVhY2ggcHJvY2VzcyBoYXMgYSBmaXhlZAotICAgIG51bWJlciBvZiB0aHJlYWRzLiBUaGUgc2VydmVyIGFkanVzdHMgdG8gaGFuZGxlIGxvYWQgYnkKLSAgICBpbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcgdGhlIG51bWJlciBvZiBwcm9jZXNzZXMuPC9wPgotCi0gICAgPHA+QSBzaW5nbGUgY29udHJvbCBwcm9jZXNzIGlzIHJlc3BvbnNpYmxlIGZvciBsYXVuY2hpbmcgY2hpbGQKLSAgICBwcm9jZXNzZXMuIEVhY2ggY2hpbGQgcHJvY2VzcyBjcmVhdGVzIGEgZml4ZWQgbnVtYmVyIG9mIHRocmVhZHMKLSAgICBhcyBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPlRocmVhZHNQZXJDaGlsZDwvY29kZT4gZGlyZWN0aXZlLiBUaGUKLSAgICBpbmRpdmlkdWFsIHRocmVhZHMgdGhlbiBsaXN0ZW4gZm9yIGNvbm5lY3Rpb25zIGFuZCBzZXJ2ZSB0aGVtCi0gICAgd2hlbiB0aGV5IGFycml2ZS48L3A+Ci0KLSAgICA8cD5BcGFjaGUgYWx3YXlzIHRyaWVzIHRvIG1haW50YWluIGEgcG9vbCBvZiA8ZW0+c3BhcmU8L2VtPiBvcgotICAgIGlkbGUgc2VydmVyIHRocmVhZHMsIHdoaWNoIHN0YW5kIHJlYWR5IHRvIHNlcnZlIGluY29taW5nCi0gICAgcmVxdWVzdHMuIEluIHRoaXMgd2F5LCBjbGllbnRzIGRvIG5vdCBuZWVkIHRvIHdhaXQgZm9yIGEgbmV3Ci0gICAgdGhyZWFkcyBvciBwcm9jZXNzZXMgdG8gYmUgY3JlYXRlZCBiZWZvcmUgdGhlaXIgcmVxdWVzdHMgY2FuIGJlCi0gICAgc2VydmVkLiBBcGFjaGUgYXNzZXNzZXMgdGhlIHRvdGFsIG51bWJlciBvZiBpZGxlIHRocmVhZHMgaW4gYWxsCi0gICAgcHJvY2Vzc2VzLCBhbmQgZm9ya3Mgb3Iga2lsbHMgcHJvY2Vzc2VzIHRvIGtlZXAgdGhpcyBudW1iZXIKLSAgICB3aXRoaW4gdGhlIGJvdW5kYXJpZXMgc3BlY2lmaWVkIGJ5IDxjb2RlPk1pblNwYXJlVGhyZWFkczwvY29kZT4KLSAgICBhbmQgPGNvZGU+TWF4U3BhcmVUaHJlYWRzPC9jb2RlPi4gU2luY2UgdGhpcyBwcm9jZXNzIGlzIHZlcnkKLSAgICBzZWxmLXJlZ3VsYXRpbmcsIGl0IGlzIHJhcmVseSBuZWNlc3NhcnkgdG8gbW9kaWZ5IHRoZXNlCi0gICAgZGlyZWN0aXZlcyBmcm9tIHRoZWlyIGRlZmF1bHQgdmFsdWVzLiBUaGUgbWF4aW11bSBudW1iZXIgb2YKLSAgICBjbGllbnRzIHRoYXQgbWF5IGJlIHNlcnZlZCBzaW11bHRhbmVvdXNseSBpcyBkZXRlcm1pbmVkIGJ5Ci0gICAgbXVsdGlwbHlpbmcgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNlcnZlciBwcm9jZXNzZXMgdGhhdCB3aWxsIGJlCi0gICAgY3JlYXRlZCAoPGNvZGU+TWF4Q2xpZW50czwvY29kZT4pIGJ5IHRoZSBudW1iZXIgb2YgdGhyZWFkcwotICAgIGNyZWF0ZWQgaW4gZWFjaCBwcm9jZXNzICg8Y29kZT5UaHJlYWRzUGVyQ2hpbGQ8L2NvZGU+KS48L3A+Ci0KLSAgICA8cD5XaGlsZSB0aGUgcGFyZW50IHByb2Nlc3MgaXMgdXN1YWxseSBzdGFydGVkIGFzIHJvb3QgdW5kZXIKLSAgICBVbml4IGluIG9yZGVyIHRvIGJpbmQgdG8gcG9ydCA4MCwgdGhlIGNoaWxkIHByb2Nlc3NlcyBhbmQKLSAgICB0aHJlYWRzIGFyZSBsYXVuY2hlZCBieSBBcGFjaGUgYXMgYSBsZXNzLXByaXZpbGVnZWQgdXNlci4gVGhlCi0gICAgPGNvZGU+VXNlcjwvY29kZT4gYW5kIDxjb2RlPkdyb3VwPC9jb2RlPiBkaXJlY3RpdmVzIGFyZSB1c2VkIHRvCi0gICAgc2V0IHRoZSBwcml2aWxlZ2VzIG9mIHRoZSBBcGFjaGUgY2hpbGQgcHJvY2Vzc2VzLiBUaGUgY2hpbGQKLSAgICBwcm9jZXNzZXMgbXVzdCBiZSBhYmxlIHRvIHJlYWQgYWxsIHRoZSBjb250ZW50IHRoYXQgd2lsbCBiZQotICAgIHNlcnZlZCwgYnV0IHNob3VsZCBoYXZlIGFzIGZldyBwcml2aWxlZ2VzIGJleW9uZCB0aGF0IGFzCi0gICAgcG9zc2libGUuIEluIGFkZGl0aW9uLCB1bmxlc3MgPGEKLSAgICBocmVmPSIuLi9zdWV4ZWMuaHRtbCI+c3VleGVjPC9hPiBpcyB1c2VkLCB0aGVzZSBkaXJlY3RpdmVzIGFsc28KLSAgICBzZXQgdGhlIHByaXZpbGVnZXMgd2hpY2ggd2lsbCBiZSBpbmhlcml0ZWQgYnkgQ0dJIHNjcmlwdHMuPC9wPgotCi0gICAgPHA+PGNvZGU+TWF4UmVxdWVzdHNQZXJDaGlsZDwvY29kZT4gY29udHJvbHMgaG93IGZyZXF1ZW50bHkgdGhlCi0gICAgc2VydmVyIHJlY3ljbGVzIHByb2Nlc3NlcyBieSBraWxsaW5nIG9sZCBvbmVzIGFuZCBsYXVuY2hpbmcgbmV3Ci0gICAgb25lcy48L3A+Ci0KLSAgICA8cD5TZWUgYWxzbzogPGEgaHJlZj0iLi4vYmluZC5odG1sIj5TZXR0aW5nIHdoaWNoIGFkZHJlc3NlcyBhbmQKLSAgICBwb3J0cyBBcGFjaGUgdXNlczwvYT4uPC9wPgotCi0gICAgPGgyPkRpcmVjdGl2ZXM8L2gyPgotCi0gICAgPHVsPgotICAgICAgPGxpPjxhCi0gICAgICBocmVmPSJtcG1fY29tbW9uLmh0bWwjY29yZWR1bXBkaXJlY3RvcnkiPkNvcmVEdW1wRGlyZWN0b3J5PC9hPjwvbGk+Ci0KLSAgICAgIDxsaT48YSBocmVmPSJtcG1fY29tbW9uLmh0bWwjZ3JvdXAiPkdyb3VwPC9hPjwvbGk+Ci0KLSAgICAgIDxsaT48YSBocmVmPSJtcG1fY29tbW9uLmh0bWwjcGlkZmlsZSI+UGlkRmlsZTwvYT48L2xpPgotCi0gICAgICA8bGk+PGEgaHJlZj0ibXBtX2NvbW1vbi5odG1sI2xpc3RlbiI+TGlzdGVuPC9hPjwvbGk+Ci0KLSAgICAgIDxsaT48YQotICAgICAgaHJlZj0ibXBtX2NvbW1vbi5odG1sI2xpc3RlbmJhY2tsb2ciPkxpc3RlbkJhY2tsb2c8L2E+PC9saT4KLQotICAgICAgPGxpPjxhIGhyZWY9Im1wbV9jb21tb24uaHRtbCNsb2NrZmlsZSI+TG9ja0ZpbGU8L2E+PC9saT4KLQotICAgICAgPGxpPjxhIGhyZWY9Im1wbV9jb21tb24uaHRtbCNtYXhjbGllbnRzIj5NYXhDbGllbnRzPC9hPjwvbGk+Ci0KLSAgICAgIDxsaT48YQotICAgICAgaHJlZj0ibXBtX2NvbW1vbi5odG1sI21heHJlcXVlc3RzcGVyY2hpbGQiPk1heFJlcXVlc3RzUGVyQ2hpbGQ8L2E+PC9saT4KLQotICAgICAgPGxpPjxhCi0gICAgICBocmVmPSJtcG1fY29tbW9uLmh0bWwjbWF4c3BhcmV0aHJlYWRzIj5NYXhTcGFyZVRocmVhZHM8L2E+PC9saT4KLQotICAgICAgPGxpPjxhCi0gICAgICBocmVmPSJtcG1fY29tbW9uLmh0bWwjbWluc3BhcmV0aHJlYWRzIj5NaW5TcGFyZVRocmVhZHM8L2E+PC9saT4KLQotICAgICAgPGxpPjxhCi0gICAgICBocmVmPSJtcG1fY29tbW9uLmh0bWwjc2NvcmVib2FyZGZpbGUiPlNjb3JlQm9hcmRGaWxlPC9hPjwvbGk+Ci0KLSAgICAgIDxsaT48YQotICAgICAgaHJlZj0ibXBtX2NvbW1vbi5odG1sI3NlbmRidWZmZXJzaXplIj5TZW5kQnVmZmVyU2l6ZTwvYT48L2xpPgotCi0gICAgICA8bGk+PGEKLSAgICAgIGhyZWY9Im1wbV9jb21tb24uaHRtbCNzdGFydHNlcnZlcnMiPlN0YXJ0U2VydmVyczwvYT48L2xpPgotCi0gICAgICA8bGk+PGEKLSAgICAgIGhyZWY9Im1wbV9jb21tb24uaHRtbCN0aHJlYWRzcGVyY2hpbGQiPlRocmVhZHNQZXJDaGlsZDwvYT48L2xpPgotCi0gICAgICA8bGk+PGEgaHJlZj0ibXBtX2NvbW1vbi5odG1sI3VzZXIiPlVzZXI8L2E+PC9saT4KLSAgICA8L3VsPgotICAgIDwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci0gIDwvYm9keT4KLTwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL3dvcmtlci54bWwgYi9kb2NzL21hbnVhbC9tb2Qvd29ya2VyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBkMzhjZS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2Qvd29ya2VyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIG1vZHVsZXN5bm9wc2lzIFNZU1RFTSAiLi4vc3R5bGUvbW9kdWxlc3lub3BzaXMuZHRkIj4KLTw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9Ii4uL3N0eWxlL21hbnVhbC54c2wiPz4KLTxtb2R1bGVzeW5vcHNpcz4KLTxuYW1lPndvcmtlcjwvbmFtZT4KLTxkZXNjcmlwdGlvbj5NdWx0aS1Qcm9jZXNzaW5nIE1vZHVsZSBpbXBsZW1lbnRpbmcgYSBoeWJyaWQKLSAgICBtdWx0aS10aHJlYWRlZCBtdWx0aS1wcm9jZXNzIHdlYiBzZXJ2ZXI8L2Rlc2NyaXB0aW9uPgotPHN0YXR1cz5NUE08L3N0YXR1cz4KLTxzb3VyY2VmaWxlPndvcmtlci5jPC9zb3VyY2VmaWxlPgotPGlkZW50aWZpZXI+bXBtX3dvcmtlcl9tb2R1bGU8L2lkZW50aWZpZXI+Ci0KLTxzdW1tYXJ5PgotICAgIDxwPlRoaXMgTXVsdGktUHJvY2Vzc2luZyBNb2R1bGUgKE1QTSkgaXMgdGhlIGRlZmF1bHQgZm9yIG1vc3QKLSAgICB1bml4LWxpa2Ugb3BlcmF0aW5nIHN5c3RlbXMuIEl0IGltcGxlbWVudHMgYSBoeWJyaWQKLSAgICBtdWx0aS1wcm9jZXNzIG11bHRpLXRocmVhZGVkIHNlcnZlci4gRWFjaCBwcm9jZXNzIGhhcyBhIGZpeGVkCi0gICAgbnVtYmVyIG9mIHRocmVhZHMuIFRoZSBzZXJ2ZXIgYWRqdXN0cyB0byBoYW5kbGUgbG9hZCBieQotICAgIGluY3JlYXNpbmcgb3IgZGVjcmVhc2luZyB0aGUgbnVtYmVyIG9mIHByb2Nlc3Nlcy48L3A+Ci0KLSAgICA8cD5BIHNpbmdsZSBjb250cm9sIHByb2Nlc3MgaXMgcmVzcG9uc2libGUgZm9yIGxhdW5jaGluZyBjaGlsZAotICAgIHByb2Nlc3Nlcy4gRWFjaCBjaGlsZCBwcm9jZXNzIGNyZWF0ZXMgYSBmaXhlZCBudW1iZXIgb2YgdGhyZWFkcwotICAgIGFzIHNwZWNpZmllZCBpbiB0aGUgPGNvZGU+VGhyZWFkc1BlckNoaWxkPC9jb2RlPiBkaXJlY3RpdmUuIFRoZQotICAgIGluZGl2aWR1YWwgdGhyZWFkcyB0aGVuIGxpc3RlbiBmb3IgY29ubmVjdGlvbnMgYW5kIHNlcnZlIHRoZW0KLSAgICB3aGVuIHRoZXkgYXJyaXZlLjwvcD4KLQotICAgIDxwPkFwYWNoZSBhbHdheXMgdHJpZXMgdG8gbWFpbnRhaW4gYSBwb29sIG9mIDxlbT5zcGFyZTwvZW0+IG9yCi0gICAgaWRsZSBzZXJ2ZXIgdGhyZWFkcywgd2hpY2ggc3RhbmQgcmVhZHkgdG8gc2VydmUgaW5jb21pbmcKLSAgICByZXF1ZXN0cy4gSW4gdGhpcyB3YXksIGNsaWVudHMgZG8gbm90IG5lZWQgdG8gd2FpdCBmb3IgYSBuZXcKLSAgICB0aHJlYWRzIG9yIHByb2Nlc3NlcyB0byBiZSBjcmVhdGVkIGJlZm9yZSB0aGVpciByZXF1ZXN0cyBjYW4gYmUKLSAgICBzZXJ2ZWQuIEFwYWNoZSBhc3Nlc3NlcyB0aGUgdG90YWwgbnVtYmVyIG9mIGlkbGUgdGhyZWFkcyBpbiBhbGwKLSAgICBwcm9jZXNzZXMsIGFuZCBmb3JrcyBvciBraWxscyBwcm9jZXNzZXMgdG8ga2VlcCB0aGlzIG51bWJlcgotICAgIHdpdGhpbiB0aGUgYm91bmRhcmllcyBzcGVjaWZpZWQgYnkgPGNvZGU+TWluU3BhcmVUaHJlYWRzPC9jb2RlPgotICAgIGFuZCA8Y29kZT5NYXhTcGFyZVRocmVhZHM8L2NvZGU+LiBTaW5jZSB0aGlzIHByb2Nlc3MgaXMgdmVyeQotICAgIHNlbGYtcmVndWxhdGluZywgaXQgaXMgcmFyZWx5IG5lY2Vzc2FyeSB0byBtb2RpZnkgdGhlc2UKLSAgICBkaXJlY3RpdmVzIGZyb20gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuIFRoZSBtYXhpbXVtIG51bWJlciBvZgotICAgIGNsaWVudHMgdGhhdCBtYXkgYmUgc2VydmVkIHNpbXVsdGFuZW91c2x5IGlzIGRldGVybWluZWQgYnkKLSAgICBtdWx0aXBseWluZyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VydmVyIHByb2Nlc3NlcyB0aGF0IHdpbGwgYmUKLSAgICBjcmVhdGVkICg8Y29kZT5NYXhDbGllbnRzPC9jb2RlPikgYnkgdGhlIG51bWJlciBvZiB0aHJlYWRzCi0gICAgY3JlYXRlZCBpbiBlYWNoIHByb2Nlc3MgKDxjb2RlPlRocmVhZHNQZXJDaGlsZDwvY29kZT4pLjwvcD4KLQotICAgIDxwPldoaWxlIHRoZSBwYXJlbnQgcHJvY2VzcyBpcyB1c3VhbGx5IHN0YXJ0ZWQgYXMgcm9vdCB1bmRlcgotICAgIFVuaXggaW4gb3JkZXIgdG8gYmluZCB0byBwb3J0IDgwLCB0aGUgY2hpbGQgcHJvY2Vzc2VzIGFuZAotICAgIHRocmVhZHMgYXJlIGxhdW5jaGVkIGJ5IEFwYWNoZSBhcyBhIGxlc3MtcHJpdmlsZWdlZCB1c2VyLiBUaGUKLSAgICA8Y29kZT5Vc2VyPC9jb2RlPiBhbmQgPGNvZGU+R3JvdXA8L2NvZGU+IGRpcmVjdGl2ZXMgYXJlIHVzZWQgdG8KLSAgICBzZXQgdGhlIHByaXZpbGVnZXMgb2YgdGhlIEFwYWNoZSBjaGlsZCBwcm9jZXNzZXMuIFRoZSBjaGlsZAotICAgIHByb2Nlc3NlcyBtdXN0IGJlIGFibGUgdG8gcmVhZCBhbGwgdGhlIGNvbnRlbnQgdGhhdCB3aWxsIGJlCi0gICAgc2VydmVkLCBidXQgc2hvdWxkIGhhdmUgYXMgZmV3IHByaXZpbGVnZXMgYmV5b25kIHRoYXQgYXMKLSAgICBwb3NzaWJsZS4gSW4gYWRkaXRpb24sIHVubGVzcyA8YQotICAgIGhyZWY9Ii4uL3N1ZXhlYy5odG1sIj5zdWV4ZWM8L2E+IGlzIHVzZWQsIHRoZXNlIGRpcmVjdGl2ZXMgYWxzbwotICAgIHNldCB0aGUgcHJpdmlsZWdlcyB3aGljaCB3aWxsIGJlIGluaGVyaXRlZCBieSBDR0kgc2NyaXB0cy48L3A+Ci0KLSAgICA8cD48Y29kZT5NYXhSZXF1ZXN0c1BlckNoaWxkPC9jb2RlPiBjb250cm9scyBob3cgZnJlcXVlbnRseSB0aGUKLSAgICBzZXJ2ZXIgcmVjeWNsZXMgcHJvY2Vzc2VzIGJ5IGtpbGxpbmcgb2xkIG9uZXMgYW5kIGxhdW5jaGluZyBuZXcKLSAgICBvbmVzLjwvcD4KLQotICAgIDxwPlNlZSBhbHNvOiA8YSBocmVmPSIuLi9iaW5kLmh0bWwiPlNldHRpbmcgd2hpY2ggYWRkcmVzc2VzIGFuZAotICAgIHBvcnRzIEFwYWNoZSB1c2VzPC9hPi48L3A+Ci08L3N1bW1hcnk+Ci0KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibXBtX2NvbW1vbiI+PG5hbWU+Q29yZUR1bXBEaXJlY3Rvcnk8L25hbWU+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotPGRpcmVjdGl2ZXN5bm9wc2lzIGxvY2F0aW9uPSJtcG1fY29tbW9uIj48bmFtZT5Hcm91cDwvbmFtZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci08ZGlyZWN0aXZlc3lub3BzaXMgbG9jYXRpb249Im1wbV9jb21tb24iPjxuYW1lPlBpZEZpbGU8L25hbWU+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotPGRpcmVjdGl2ZXN5bm9wc2lzIGxvY2F0aW9uPSJtcG1fY29tbW9uIj48bmFtZT5MaXN0ZW48L25hbWU+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotPGRpcmVjdGl2ZXN5bm9wc2lzIGxvY2F0aW9uPSJtcG1fY29tbW9uIj48bmFtZT5MaXN0ZW5CYWNrbG9nPC9uYW1lPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibXBtX2NvbW1vbiI+PG5hbWU+TG9ja0ZpbGU8L25hbWU+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotPGRpcmVjdGl2ZXN5bm9wc2lzIGxvY2F0aW9uPSJtcG1fY29tbW9uIj48bmFtZT5NYXhDbGllbnRzPC9uYW1lPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibXBtX2NvbW1vbiI+PG5hbWU+TWF4UmVxdWVzdHNQZXJDaGlsZDwvbmFtZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci08ZGlyZWN0aXZlc3lub3BzaXMgbG9jYXRpb249Im1wbV9jb21tb24iPjxuYW1lPk1heFNwYXJlVGhyZWFkczwvbmFtZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci08ZGlyZWN0aXZlc3lub3BzaXMgbG9jYXRpb249Im1wbV9jb21tb24iPjxuYW1lPk1pblNwYXJlVGhyZWFkczwvbmFtZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci08ZGlyZWN0aXZlc3lub3BzaXMgbG9jYXRpb249Im1wbV9jb21tb24iPjxuYW1lPlNjb3JlQm9hcmRGaWxlPC9uYW1lPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibXBtX2NvbW1vbiI+PG5hbWU+U2VuZEJ1ZmZlclNpemU8L25hbWU+Ci08L2RpcmVjdGl2ZXN5bm9wc2lzPgotPGRpcmVjdGl2ZXN5bm9wc2lzIGxvY2F0aW9uPSJtcG1fY29tbW9uIj48bmFtZT5TZXJ2ZXJMaW1pdDwvbmFtZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci08ZGlyZWN0aXZlc3lub3BzaXMgbG9jYXRpb249Im1wbV9jb21tb24iPjxuYW1lPlN0YXJ0U2VydmVyczwvbmFtZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci08ZGlyZWN0aXZlc3lub3BzaXMgbG9jYXRpb249Im1wbV9jb21tb24iPjxuYW1lPlRocmVhZExpbWl0PC9uYW1lPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibXBtX2NvbW1vbiI+PG5hbWU+VGhyZWFkc1BlckNoaWxkPC9uYW1lPgotPC9kaXJlY3RpdmVzeW5vcHNpcz4KLTxkaXJlY3RpdmVzeW5vcHNpcyBsb2NhdGlvbj0ibXBtX2NvbW1vbiI+PG5hbWU+VXNlcjwvbmFtZT4KLTwvZGlyZWN0aXZlc3lub3BzaXM+Ci0KLTwvbW9kdWxlc3lub3BzaXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbXBtLmh0bWwgYi9kb2NzL21hbnVhbC9tcG0uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUyMTc1MS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tcG0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXZhaWxhYmxlIE1QTSdzIGZvciBBcGFjaGUgMi4wPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTxoMSBhbGlnbj0iY2VudGVyIj5BcGFjaGUgMi4wIC0gQXZhaWxhYmxlIE1QTSdzPC9oMT4KLTxwIGFsaWduPSJjZW50ZXIiPjxlbT5EYXRlZCAxNTxzdXA+dGg8L3N1cD4gSmFudWFyeSAyMDAwPC9lbT48L3A+Ci08cD5BcGFjaGUgMi4wIGhhcyBhIG5ldyBhcmNoaXRlY3R1cmUgdGhhdCBtb3ZlcyB0aGUgcHJvY2Vzc2luZyBvZiByZXF1ZXN0cyBmcm9tIHRoZSBjb2RlIHNlcnZlciBpbnRvIGEgTXVsdGlQcm9jZXNzaW5nIE1vZHVsZSAoTVBNKS4gIEJ5IHNlbGVjdGluZyB0aGUgTVBNIHRvIHVzZSB5b3UgY2FuIGFsdGVyIHRoZSB3YXkgdGhlIHNlcnZlciBiZWhhdmVzLiAgQWRkaXRpb25hbGx5IHRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlIE1QTSdzIGhhcyBsZWQgdG8gcGxhdGZvcm1zIGRldmVsb3BpbmcgdGhlaXIgb3duIG9wdGltaXNlZCBtb2R1bGVzLiAgT24gc29tZSBwbGF0Zm9ybXMgdGhlcmUgaXMgbm8gY2hvaWNlLCB3aGlsc3Qgb24gb3RoZXJzIHRoZXJlIGFyZSBkaWZmZXJlbnQgb3B0aW9ucywgZWFjaCB3aXRoIGRpZmZlcmluZyBwcm9jZXNzaW5nIG1vZGVscy4gIFRoaXMgbGlzdCBhaW1zIHRvIGhlbHAgeW91IHNlbGVjdCBhIHN1aXRhYmxlIE1QTSBmb3IgeW91ciBzeXN0ZW0uPC9wPgotPGhyPgotPGgzPlBsYXRmb3JtczwvaDM+Ci08dWw+Ci08bGk+PEEgaHJlZj0iI3VuaXgiPlVuaXg8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjd2luZG93cyI+V2luZG93czwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNvczIiPk9TLzI8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjYmVvcyI+QmVPUzwvYT48L2xpPgotPC91bD4KLTxhIG5hbWU9InVuaXgiPjxoMz5Vbml4PC9oMz4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj4KLTx0cj4KLTx0aCB3aWR0aD0iMjAlIj5NUE08L3RoPgotPHRoIHdpZHRoPSI2MCUiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCB3aWR0aD0iMjAlIj5NYWludGFpbmVyPC90aD4KLTwvdHI+Ci08dHI+Ci08dGQ+cHJlZm9yazwvdGQ+Ci08dGQ+VGhlIHByZWZvcmsgTVBNIHJlcHJvZHVjZXMgdGhlIGJlaGF2aW91ciBvZiBBcGFjaGUgMS4zLjwvdGQ+Ci08dGQ+Pz88L3RkPgotPC90cj4KLTx0cj4KLTx0ZD5tcG10X3B0aHJlYWQ8L3RkPgotPHRkPlRoaXMgTVBNIHVzZXMgYSBtdWx0aS1wcm9jZXNzLCBtdWx0aS10aHJlYWRlZCBtb2RlbCB0byBwcm92aWRlIGdvb2Qgc2NhYmlsaXR5IGFuZCBzdGFiaWxpdHkuPC90ZD4KLTx0ZD5NYW5vaj88L3RkPgotPC90cj4KLTx0cj4KLTx0ZD5kZXh0ZXI8L3RkPgotPHRkPlRoaXMgaXMgTWFub2oncyBwbGF5dGhpbmcuICBJdCBoYXMgYSBudW1iZXIgb2YgaHlicmlkIGZlYXR1cmVzIHRoYXQgTWFub2ogaGFzIGJlZW4gbG9va2luZyBhdCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLjwvdGQ+Ci08dGQ+PGEgaHJlZj0ibWFpbHRvOm1hbm9qa0Bpby5jb20iPk1hbm9qPC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLQotPGEgbmFtZT0id2luZG93cyI+PGgzPldpbmRvd3M8L2gzPgotPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPgotPHRyPgotPHRoIHdpZHRoPSIyMCUiPk1QTTwvdGg+Ci08dGggd2lkdGg9IjYwJSI+RGVzY3JpcHRpb248L3RoPgotPHRoIHdpZHRoPSIyMCUiPk1haW50YWluZXI8L3RoPgotPC90cj4KLTx0cj4KLTx0ZD53aW5udDwvdGQ+Ci08dGQ+VGhlIFdpbmRvd3MgTVBNLiAgVGhpcyBpcyBtYWlubHkgYWltZWQgYXQgV2luZG93cyBOVC48L3RkPgotPHRkPjxhIGhyZWY9Im1haWx0bzpzdG9kZGFyZEByYWxlaWdoLmlibS5jb20iPkJpbGwgU3RvZGRhcmQ8L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotCi08YSBuYW1lPSJvczIiPjxoMz5PUy8yPC9oMz4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj4KLTx0cj4KLTx0aCB3aWR0aD0iMjAlIj5NUE08L3RoPgotPHRoIHdpZHRoPSI2MCUiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCB3aWR0aD0iMjAlIj5NYWludGFpbmVyPC90aD4KLTwvdHI+Ci08dHI+Ci08dGQ+c3BtdF9vczI8L3RkPgotPHRkPlNpbmdsZSBwcm9jZXNzLCBtdWx0aXBsZSB0aHJlYWQgTVBNIGZvciBPUzIuPC90ZD4KLTx0ZD48YSBocmVmPSJtYWlsdG86YnJpYW5oQGtoZWxkYXIuYXBhbmEub3JnLmF1Ij5CcmlhbiBIYXZhcmQ8L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotCi08YSBuYW1lPSJiZW9zIj48aDM+QmVPUzwvaDM+Ci08dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+Ci08dHI+Ci08dGggd2lkdGg9IjIwJSI+TVBNPC90aD4KLTx0aCB3aWR0aD0iNjAlIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggd2lkdGg9IjIwJSI+TWFpbnRhaW5lcjwvdGg+Ci08L3RyPgotPHRyPgotPHRkPm1wbXRfYmVvczwvdGQ+Ci08dGQ+TXVsdGktdGhyZWFkZWQgTVBNIGZvciBCZU9TLiAgVGhpcyBmb2xsb3dzIHRoZSBtcG10X3B0aHJlYWQgbW9kZWwuPC90ZD4KLTx0ZD48YSBocmVmPSJtYWlsdG86ZHJlaWRAamV0bmV0LmNvLnVrIj5EYXZpZCBSZWlkPC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLQotPGhyPgotPEk+RGF2aWQgUmVpZCwgMTU8c3VwPnRoPC9zdXA+IEphbnVhcnkgMjAwMDwvST4KLTwvYm9keT4KLTwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbXBtLmh0bWwuZW4gYi9kb2NzL21hbnVhbC9tcG0uaHRtbC5lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUyMTc1MS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tcG0uaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXZhaWxhYmxlIE1QTSdzIGZvciBBcGFjaGUgMi4wPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTxoMSBhbGlnbj0iY2VudGVyIj5BcGFjaGUgMi4wIC0gQXZhaWxhYmxlIE1QTSdzPC9oMT4KLTxwIGFsaWduPSJjZW50ZXIiPjxlbT5EYXRlZCAxNTxzdXA+dGg8L3N1cD4gSmFudWFyeSAyMDAwPC9lbT48L3A+Ci08cD5BcGFjaGUgMi4wIGhhcyBhIG5ldyBhcmNoaXRlY3R1cmUgdGhhdCBtb3ZlcyB0aGUgcHJvY2Vzc2luZyBvZiByZXF1ZXN0cyBmcm9tIHRoZSBjb2RlIHNlcnZlciBpbnRvIGEgTXVsdGlQcm9jZXNzaW5nIE1vZHVsZSAoTVBNKS4gIEJ5IHNlbGVjdGluZyB0aGUgTVBNIHRvIHVzZSB5b3UgY2FuIGFsdGVyIHRoZSB3YXkgdGhlIHNlcnZlciBiZWhhdmVzLiAgQWRkaXRpb25hbGx5IHRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlIE1QTSdzIGhhcyBsZWQgdG8gcGxhdGZvcm1zIGRldmVsb3BpbmcgdGhlaXIgb3duIG9wdGltaXNlZCBtb2R1bGVzLiAgT24gc29tZSBwbGF0Zm9ybXMgdGhlcmUgaXMgbm8gY2hvaWNlLCB3aGlsc3Qgb24gb3RoZXJzIHRoZXJlIGFyZSBkaWZmZXJlbnQgb3B0aW9ucywgZWFjaCB3aXRoIGRpZmZlcmluZyBwcm9jZXNzaW5nIG1vZGVscy4gIFRoaXMgbGlzdCBhaW1zIHRvIGhlbHAgeW91IHNlbGVjdCBhIHN1aXRhYmxlIE1QTSBmb3IgeW91ciBzeXN0ZW0uPC9wPgotPGhyPgotPGgzPlBsYXRmb3JtczwvaDM+Ci08dWw+Ci08bGk+PEEgaHJlZj0iI3VuaXgiPlVuaXg8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjd2luZG93cyI+V2luZG93czwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNvczIiPk9TLzI8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjYmVvcyI+QmVPUzwvYT48L2xpPgotPC91bD4KLTxhIG5hbWU9InVuaXgiPjxoMz5Vbml4PC9oMz4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj4KLTx0cj4KLTx0aCB3aWR0aD0iMjAlIj5NUE08L3RoPgotPHRoIHdpZHRoPSI2MCUiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCB3aWR0aD0iMjAlIj5NYWludGFpbmVyPC90aD4KLTwvdHI+Ci08dHI+Ci08dGQ+cHJlZm9yazwvdGQ+Ci08dGQ+VGhlIHByZWZvcmsgTVBNIHJlcHJvZHVjZXMgdGhlIGJlaGF2aW91ciBvZiBBcGFjaGUgMS4zLjwvdGQ+Ci08dGQ+Pz88L3RkPgotPC90cj4KLTx0cj4KLTx0ZD5tcG10X3B0aHJlYWQ8L3RkPgotPHRkPlRoaXMgTVBNIHVzZXMgYSBtdWx0aS1wcm9jZXNzLCBtdWx0aS10aHJlYWRlZCBtb2RlbCB0byBwcm92aWRlIGdvb2Qgc2NhYmlsaXR5IGFuZCBzdGFiaWxpdHkuPC90ZD4KLTx0ZD5NYW5vaj88L3RkPgotPC90cj4KLTx0cj4KLTx0ZD5kZXh0ZXI8L3RkPgotPHRkPlRoaXMgaXMgTWFub2oncyBwbGF5dGhpbmcuICBJdCBoYXMgYSBudW1iZXIgb2YgaHlicmlkIGZlYXR1cmVzIHRoYXQgTWFub2ogaGFzIGJlZW4gbG9va2luZyBhdCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLjwvdGQ+Ci08dGQ+PGEgaHJlZj0ibWFpbHRvOm1hbm9qa0Bpby5jb20iPk1hbm9qPC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLQotPGEgbmFtZT0id2luZG93cyI+PGgzPldpbmRvd3M8L2gzPgotPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPgotPHRyPgotPHRoIHdpZHRoPSIyMCUiPk1QTTwvdGg+Ci08dGggd2lkdGg9IjYwJSI+RGVzY3JpcHRpb248L3RoPgotPHRoIHdpZHRoPSIyMCUiPk1haW50YWluZXI8L3RoPgotPC90cj4KLTx0cj4KLTx0ZD53aW5udDwvdGQ+Ci08dGQ+VGhlIFdpbmRvd3MgTVBNLiAgVGhpcyBpcyBtYWlubHkgYWltZWQgYXQgV2luZG93cyBOVC48L3RkPgotPHRkPjxhIGhyZWY9Im1haWx0bzpzdG9kZGFyZEByYWxlaWdoLmlibS5jb20iPkJpbGwgU3RvZGRhcmQ8L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotCi08YSBuYW1lPSJvczIiPjxoMz5PUy8yPC9oMz4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj4KLTx0cj4KLTx0aCB3aWR0aD0iMjAlIj5NUE08L3RoPgotPHRoIHdpZHRoPSI2MCUiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCB3aWR0aD0iMjAlIj5NYWludGFpbmVyPC90aD4KLTwvdHI+Ci08dHI+Ci08dGQ+c3BtdF9vczI8L3RkPgotPHRkPlNpbmdsZSBwcm9jZXNzLCBtdWx0aXBsZSB0aHJlYWQgTVBNIGZvciBPUzIuPC90ZD4KLTx0ZD48YSBocmVmPSJtYWlsdG86YnJpYW5oQGtoZWxkYXIuYXBhbmEub3JnLmF1Ij5CcmlhbiBIYXZhcmQ8L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotCi08YSBuYW1lPSJiZW9zIj48aDM+QmVPUzwvaDM+Ci08dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+Ci08dHI+Ci08dGggd2lkdGg9IjIwJSI+TVBNPC90aD4KLTx0aCB3aWR0aD0iNjAlIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggd2lkdGg9IjIwJSI+TWFpbnRhaW5lcjwvdGg+Ci08L3RyPgotPHRyPgotPHRkPm1wbXRfYmVvczwvdGQ+Ci08dGQ+TXVsdGktdGhyZWFkZWQgTVBNIGZvciBCZU9TLiAgVGhpcyBmb2xsb3dzIHRoZSBtcG10X3B0aHJlYWQgbW9kZWwuPC90ZD4KLTx0ZD48YSBocmVmPSJtYWlsdG86ZHJlaWRAamV0bmV0LmNvLnVrIj5EYXZpZCBSZWlkPC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLQotPGhyPgotPEk+RGF2aWQgUmVpZCwgMTU8c3VwPnRoPC9zdXA+IEphbnVhcnkgMjAwMDwvST4KLTwvYm9keT4KLTwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbmV3X2ZlYXR1cmVzXzJfMC5odG1sIGIvZG9jcy9tYW51YWwvbmV3X2ZlYXR1cmVzXzJfMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjU2OTZmLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL25ld19mZWF0dXJlc18yXzAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPjxIRUFEPgotPFRJVExFPk5ldyBmZWF0dXJlcyB3aXRoIEFwYWNoZSAyLjA8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBURVhUPSIjMDAwMDAwIiBMSU5LPSIjMDAwMEZGIiAKLSAgICAgIFZMSU5LPSIjMDAwMDgwIiBBTElOSz0iI0ZGMDAwMCI+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPk92ZXJ2aWV3IG9mIE5ldyBGZWF0dXJlcyBpbiBBcGFjaGUgMi4wPC9IMT4KLQotPFA+RW5oYW5jZW1lbnRzOiA8QSBIUkVGPSIjY29yZSI+Q29yZTwvQT4gfAotCi08UD48SFI+Ci0KLTxIMj48QSBOQU1FPSJjb3JlIj5Db3JlIEVuaGFuY2VtZW50czo8L0E+PC9IMj4KLQotPERMPgotPERUPjxTVFJPTkc+VW5peCBUaHJlYWRpbmc8L1NUUk9ORz4KLTxERD5PbiBVbml4IHN5c3RlbXMgd2l0aCBQT1NJWCB0aHJlYWRzIHN1cHBvcnQsIEFwYWNoZSBjYW4gbm93IHJ1biBpbiBhCi0gICAgaHlicmlkIG11bHRpcHJvY2VzcywgbXVsdGl0aHJlYWRlZCBtb2RlLiBUaGlzIHNob3VsZCBpbXByb3ZlCi0gICAgc2NhbGFiaWxpdHkuIAotCi08RFQ+PFNUUk9ORz5OZXcgQnVpbGQgU3lzdGVtPC9TVFJPTkc+Ci08REQ+VGhlIGJ1aWxkIHN5c3RlbSBoYXMgYmVlbiByZXdyaXR0ZW4gZnJvbSBzY3JhdGNoIHRvIGJlIGJhc2VkIG9uCi0gICAgYXV0b2NvbmYgYW5kIGxpYnRvb2wuIFRoaXMgbWFrZXMgQXBhY2hlJ3MgY29uZmlndXJhdGlvbiBzeXN0ZW0gbW9yZQotICAgIHNpbWlsYXIgdG8gdGhhdCBvZiBvdGhlciBwYWNrYWdlcy4KLQotPERUPjxTVFJPTkc+TXVsdGlwcm90b2NvbCBTdXBwb3J0PC9TVFJPTkc+Ci08REQ+QXBhY2hlIG5vdyBoYXMgc29tZSBvZiB0aGUgaW5mcmFzdHJ1Y3R1cmUgaW4gcGxhY2UgdG8gc3VwcG9ydCBzZXJ2aW5nCi0gICAgbXVsdGlwbGUgcHJvdG9jb2xzLiBtb2RfZWNobyBoYXMgYmVlbiB3cml0dGVuIGFzIGFuIGV4YW1wbGUuCi0KLTxEVD48U1RST05HPkJldHRlciBzdXBwb3J0IGZvciBub24tVW5peCBwbGF0Zm9ybXM8L1NUUk9ORz4KLTxERD5BcGFjaGUgMi4wIHNob3VsZCBiZSBmYXN0ZXIgYW5kIG1vcmUgc3RhYmxlIG9uIG5vbi1Vbml4IHBsYXRmb3JtcyBzdWNoCi0gICAgYXMgQmVPUywgT1MvMiwgYW5kIFdpbmRvd3MuIFdpdGggdGhlIGludHJvZHVjdGlvbiBvZiBwbGF0Zm9ybS1zcGVjaWZpYwotICAgIG11bHRpcHJvY2Vzc2luZyBtb2R1bGVzIGFuZCB0aGUgQXBhY2hlIFBvcnRhYmxlIFJ1bnRpbWUsIHRoZXNlCi0gICAgcGxhdGZvcm1zIGNhbiBub3cgYXZvaWQgdXNpbmcgUE9TSVgtZW11bGF0aW9uIGZ1bmN0aW9ucyB0aGF0IGFyZQotICAgIHNvbWV0aW1lcyBidWdneSBhbmQgYWx3YXlzIGh1cnQgcGVyZm9ybWFuY2UuCi0KLTxEVD48U1RST05HPk5ldyBBUEk8L1NUUk9ORz4KLTxERD5UaGUgQVBJIGZvciBtb2R1bGVzIGhhcyBjaGFuZ2VkIHNpZ25pZmljYW50bHkgZm9yIDIuMC4gTWFueSBvZiB0aGUKLSAgICBtb2R1bGUtb3JkZXJpbmcgcHJvYmxlbXMgZnJvbSAxLjMgc2hvdWxkIGJlIGdvbmUsIHNpbmNlIDIuMCBkb2VzIG11Y2gKLSAgICBvZiB0aGlzIGF1dG9tYXRpY2FsbHkgbm93LiBBbHNvLCBuZXcgY2FsbHMgaGF2ZSBiZWVuIGFkZGVkIHRoYXQgc2hvdWxkCi0gICAgYWxsb3cgbW9kdWxlcyB0byBkbyBtb3JlIHdpdGhvdXQgcmVxdWlyaW5nIHBhdGNoaW5nIG9mIHRoZSBjb3JlIEFwYWNoZQotICAgIHNlcnZlci4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbmV3X2ZlYXR1cmVzXzJfMC5odG1sLmRlIGIvZG9jcy9tYW51YWwvbmV3X2ZlYXR1cmVzXzJfMC5odG1sLmRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzIwODU0Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL25ld19mZWF0dXJlc18yXzAuaHRtbC5kZQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotICA8aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Im5vdGVwYWQiIC8+Ci0KLSAgICA8dGl0bGU+TmV3IGZlYXR1cmVzIHdpdGggQXBhY2hlIDIuMDwvdGl0bGU+Ci0gIDwvaGVhZD4KLSAgPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotCi0gIDxib2R5IGJnY29sb3I9IiNGRkZGRkYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiMwMDAwRkYiCi0gIHZsaW5rPSIjMDAwMDgwIiBhbGluaz0iI0ZGMDAwMCI+Ci0gICAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLQotICAgIDxoMSBhbGlnbj0iQ0VOVEVSIj4mVXVtbDtiZXJzaWNodCBkZXIgbmV1ZW4gRnVua3Rpb25lbiBpbiBBcGFjaGUgMi4wPC9oMT4KLSAgICA8cD4mdXVtbDtiZXJzZXR6dCB2b24gc2ltb24ucHV0ekB0LW9ubGluZS5kZTwvcD4KLSAgICA8cD5FcndlaXRlcnVuZ2VuOiA8YSBocmVmPSIjY29yZSI+Q29yZTwvYT4gfCA8YSBocmVmPSIjbW9kdWxlIj5Nb2R1bGU8L2E+PC9wPgotICAgIAotICAgIDxociAvPgotCi0gICAgPGgyPjxhIGlkPSJjb3JlIiBuYW1lPSJjb3JlIj5Db3JlIEVyd2VpdGVydW5nZW46PC9hPjwvaDI+Ci0KLSAgICA8ZGw+Ci0gICAgICA8ZHQ+PHN0cm9uZz5Vbml4IFRocmVhZGluZzwvc3Ryb25nPjwvZHQ+Ci0KLSAgICAgIDxkZD5BdWYgVW5peCBTeXN0ZW1lbiBtaXQgUE9TSVggdGhyZWFkcyBVbnRlcnN0JnV1bWw7dHp1bmcsIGthbm4gQXBhY2hlIGpldHp0Ci0gICAgICBpbiBlaW5lbSBoeWJyaWQgbXVsdGlwcm9jZXNzIGltIG11bHRpdGhyZWFkZWQgbW9kZSBnZXN0YXJ0ZXQgd2VyZGVuLiBEaWVzCi0gICAgICB2ZXJiZXNzaWVydCBkaWUgU2thbGllcmYmYXVtbDtoaWdrZWl0IGYmdXVtbDtyIHZpZWxlLCBhYmVyIG5pY2h0IGFsbGUgS29uZmlndXJhdGlvbmVuLjwvZGQ+Ci0KLSAgICAgIDxkdD48c3Ryb25nPk5ldWVzIEJ1aWxkIFN5c3RlbTwvc3Ryb25nPjwvZHQ+Ci0KLSAgICAgIDxkZD5EYXMgYnVpbGQgc3lzdGVtIHd1cmRlIGtvbXBsZXR0IGF1ZiBkZXIgQmFzaXMgdm9uIGF1dG9jb25mIHVuZCBsaWJ0b29sIG5ldWdlc2NocmllYmVuLgotICAgICAgRGFkdXJjaCB3aXJkIEFwYWNoZXMgS29uZmlndXJhdGlvbnNzeXN0ZW0gZGVtIHZpZWxlciBhbmRlcmVyIFBhY2thZ2VzICZhdW1sO2hubGljaGVyLjwvZGQ+Ci0KLSAgICAgIDxkdD48c3Ryb25nPk11bHRpcHJvdG9jb2wgVW50ZXJzdCZ1dW1sO3R6dW5nPC9zdHJvbmc+PC9kdD4KLQotICAgICAgPGRkPkFwYWNoZSBoYXQgamV0enQgZWluaWdlcyBkZXIgSW5mcmFzdHJ1a3R1ciBiZXJlaXQgdW0gbWVocmVyZSBQcm90b2tvbGxlIHp1IHVudGVyc3QmdXVtbDt0emVuLgotICAgICAgbW9kX2VjaG8gd3VyZGUgenVtIEJlaXNwaWVsIG5ldWdlc2NocmllYmVuLjwvZGQ+Ci0KLSAgICAgIDxkdD48c3Ryb25nPkJlc3NlcmUgVW50ZXJzdCZ1dW1sO3R6dW5nIHZvbiBuaWNodC1Vbml4IFBsYXR0Zm9ybWVuPC9zdHJvbmc+PC9kdD4KLQotICAgICAgPGRkPkFwYWNoZSAyLjAgaXN0IHNjaG5lbGxlciB1bmQgc3RhYmlsZXIgYXVmIG5pY2h0LVVuaXgKLSAgICAgIFBsYXR0Zm9ybWVuIHdpZSBCZU9TLCBPUy8yLCB1bmQgV2luZG93cy4gTWl0IGRlciBFaW5mJnV1bWw7aHJ1bmcgdm9uIFBsYXR0Zm9ybS1zcGV6aWZpc2NoZW4gCi0gICAgICA8YSBocmVmPSJtcG0uaHRtbCI+bXVsdGktcHJvY2Vzc2luZyBNb2R1bGVuPC9hPiAoTVBNcykgdW5kIGRlcgotICAgICAgQXBhY2hlIFBvcnRhYmxlIFJ1bnRpbWUgKEFQUiksIHNpbmQgZGllc2UgUGxhdHRmb3JtZW4gamV0enQgaW4gaWhyZXIKLSAgICAgIGVpZ2VuZW4gQVBJIGltcGxlbWVudGllcnQsIHdhcyBkaWUgaCZhdW1sO3VmaWdlbiBGZWhsZXIgZGVyIHNjaGxlY2h0IGZ1bmt0aW9uaWVyZW5kZW4KLSAgICAgIFBPU0lYLWVtdWxhdGlvbiBsYXllciB2ZXJtZWlkZXQuPC9kZD4KLQotICAgICAgPGR0PjxzdHJvbmc+TmV1ZSBBcGFjaGUgQVBJPC9zdHJvbmc+PC9kdD4KLQotICAgICAgPGRkPkRpZSBBUEkgZiZ1dW1sO3IgTW9kdWxlIGhhdCBzaWNoIGluIDIuMCBzdGFyayB2ZXImYXVtbDtuZGVydC4KLSAgICAgIFZpZWxlIGRlciBtb2R1bGUtb3JkZXJpbmcgUHJvYmxlbWUgdm9uIDEuMyBzb2xsdGVuIHZlcnNjaHd1bmRlbiBzZWluLgotICAgICAgMi4wIG1hY2h0IGVpbmlnZXMgaGllcnZvbiBhdXRvbWF0aXNjaCwgdW5kIGRhcyBtb2R1bGUgb3JkZXJpbmcgd2lyZAotICAgICAgamV0enQgcGVyLWhvb2sgdm9yZ2Vub21tZW4sIHVtIG1laHIgRmxleGliaWxpdCZhdW1sO3QgenUgYmlldGVuLiBBdSZzemxpZztlcmRlbSB3dXJkZW4gbmV1ZSBjYWxscwotICAgICAgaGluenVnZWYmdXVtbDtndCwgZGllIHp1cyZhdW1sO3R6bGljaGUgTW9kdWwtRiZhdW1sO2hpZ2tlaXRlbiBiaWV0ZW4sIG9obmUgZGVuIGNvcmUgenUgcGF0Y2hlbi48L2RkPgotCi0gICAgICA8ZHQ+PHN0cm9uZz5JUHY2IFVudGVyc3QmdXVtbDt0enVuZzwvc3Ryb25nPjwvZHQ+Ci0KLSAgICAgIDxkZD5BdWYgU3lzdGVtZW4sIGJlaSBkZW5lbiBJUHY2IGR1cmNoIGRpZSB6dWdydW5kZSBsaWVnZW5kZQotICAgICAgQXBhY2hlIFBvcnRhYmxlIFJ1bnRpbWUgbGlicmFyeSB1bnRlcnN0JnV1bWw7dHp0IGlzdCwgYmVrb21tdCBBcGFjaGUgc3RhbmRhcm0mYXVtbDsmc3psaWc7aWcgSVB2NiBsaXN0ZW5pbmcKLSAgICAgIHNvY2tldHMuIFp1cyZhdW1sO3R6bGljaCB1bnRlcnN0JnV1bWw7dHplbiBkaWUgTGlzdGVuLAotICAgICAgTmFtZVZpcnR1YWxIb3N0LCBhbmQgJmx0O1ZpcnR1YWxIb3N0Jmd0OyBEaXJlY3RpdmVuCi0gICAgICBudW1lcmlzY2hlIElQdjYgYWRkcmVzcyBzdHJpbmdzICh6LkIuLCAiTGlzdGVuCi0gICAgICBbZmU4MDo6MV06ODA4MCIpLjwvZGQ+Ci0KLSAgICAgIDxkdD48c3Ryb25nPkZpbHRlcmluZzwvc3Ryb25nPjwvZHQ+Ci0KLSAgICAgIDxkZD5BcGFjaGUgTW9kdWxlIGsmb3VtbDtubmVuIGpldHp0IGFscyBGaWx0ZXIgZGllIGF1ZiBkZW4gSW5oYWx0cy1TdHJlYW0gd2lya2VuLCB3aWUgZXIKLSAgICAgIHZvbiBvZGVyIHp1bSBTZXJ2ZXIga29tbXQuCi0gICAgICBEYWR1cmNoIGsmb3VtbDtubmVuIHouIEIuIGRpZSBBdXNnYWJlIHZvbiBDR0kgc2NyaXB0cyB2b24gZGVuIFNlcnZlciBTaWRlIEluY2x1ZGUgRGlyZWt0aXZlbgotICAgICAgZHVyY2ggZGVuIElOQ0xVREUgZmlsdGVyIGluIG1vZF9pbmNsdWRlIGJlYXJiZWl0ZXQgd2VyZGVuLjwvZGQ+Ci0KLSAgICAgIDxkdD48c3Ryb25nPk1laHJzcHJhY2hpZ2UgRmVobGVybWVsZHVuZ2VuPC9zdHJvbmc+PC9kdD4KLQotICAgICAgPGRkPkZlaGxlcm1lbGR1bmdlbiB6dW0gQnJvd3NlciB3ZXJkZW4gamV0enQsIGR1cmNoIFNTSSBEb2t1bWVudGUsIGluIHZlcnNjaGllZGVuZW4gU3ByYWNoZW4genVyIFZlcmYmdXVtbDtndW5nIGdlc3RlbGx0LgotICAgICAgU2llIGsmb3VtbDtubmVuIGR1cmNoIGRlbiBBZG1pbmlzdHJhdG9yIGFuZ2VwYXNzdCB3ZXJkZW4sIHVtIGVpbiBlaW5oZWl0bGljaGVzIERlc2lnbiB6dSBlcnJlaWNoZW4uPC9kZD4KLQotICAgICAgPGR0PjxzdHJvbmc+VmVyZWluZmFjaHRlIEtvbmZpZ3VyYXRpb248L3N0cm9uZz48L2R0PgotCi0gICAgICA8ZGQ+VmllbGUga29tcGxpemllcnRlIERpcmVrdGl2ZW4gd3VyZGVuIHZlcmVpbmZhY2h0LiBEaWUgb2Z0IHZlcndpcnJlbmRlbgotICAgICAgUG9ydCB1bmQgQmluZEFkZHJlc3MgRGlyZWt0aXZlbiB3dXJkZW4gZW50ZmVybnQ7IG51ciBkaWUKLSAgICAgIExpc3RlbiBEaXJla3RpdmUgd2lyZCB6dW0gSVAgYWRkcmVzcyBiaW5kaW5nIGJlbnV0enQ7IGRpZQotICAgICAgU2VydmVyTmFtZSBEaXJla3RpdmUgYmVzdGltbXQgZGVuIFNlcnZlci1OYW1lbiB1bmQgUG9ydC1OdW1tZXIKLSAgICAgIG51ciB6dXIgV2VpdGVybGVpdHVuZyB1bmQgdmhvc3QgRXJrZW5udW5nLjwvZGQ+Ci0KLSAgICAgIDxkdD48c3Ryb25nPkVpbmdlYmF1dGUgV2luZG93cyBOVCBVbmljb2RlIFVudGVyc3QmdXVtbDt0enVuZzwvc3Ryb25nPjwvZHQ+Ci0KLSAgICAgIDxkZD5BcGFjaGUgMi4wIGF1ZiBXaW5kb3dzIE5UIGJlbnV0enQgamV0enQgdXRmLTggZiZ1dW1sO3IgYWxsZSBEYXRlaW5hbWVuCi0gICAgICBFbmNvZGllcnVuZ2VuLiAgRGllc2Ugd2VyZGVuIGRpcmVrdCB6dW0genVncnVuZGUgbGllZ2VuZGVuIHVuaWNvZGUgRGF0ZWlzeXN0ZW0gJnV1bWw7YmVyc2V0enQsCi0gICAgICBzb21pdCB3aXJkIGRpZSBNZWhyc3ByYWNoLVVudGVyc3QmdXVtbDt0enVuZywgZiZ1dW1sOyBhbGxlIFdpbmRvd3MgTlQtYmFzaWVybmRlIEluc3RhbGxhdGlvbmVuLAotICAgICAgaW5jbHVzaXZlIFdpbmRvd3MgMjAwMCB1bmQgV2luZG93cyBYUCBnZXcmYXVtbDtocnQuCi0gICAgICA8ZW0+RGllc2UgVW50ZXJzdCZ1dW1sO3R6dW5nIGdlaHQgbmljaHQgYXVmIFdpbmRvd3MgOTUsIDk4IG9kZXIgTUUgJnV1bWw7YmVyLCBkaWVzZSAKLSAgICAgIGJlbnV0emVuIG5vY2ggaW1tZXIgZGllIGxva2FsZSBjb2RlcGFnZSBkZXMgUmVjaG5lcnMgenVtIERhdGVpc3lzdGVtLVp1Z3JpZmYuPC9lbT48L2RkPgotCi0gICAgPC9kbD4KLSAgICA8aHIgLz4KLQotICAgIDxoMj48YSBpZD0ibW9kdWxlIiBuYW1lPSJtb2R1bGUiPk1vZHVsIEVyd2VpdGVydW5nZW46PC9hPjwvaDI+Ci0KLSAgICA8ZGw+Ci0gICAgICA8ZHQ+PHN0cm9uZz5tb2Rfc3NsPC9zdHJvbmc+PC9kdD4KLQotICAgICAgPGRkPk5ldWVzIE1vZHVsIGluIEFwYWNoZSAyLjAuICBEaWVzZXMgTW9kdWwgaXN0IGVpbiBJbnRlcmZhY2UKLSAgICAgIHp1IGRlbiBTU0wvVExTIFZlcnNjaGwmdXVtbDtzc2VsdW5ncy1Qcm90b2tvbGxlbiwgZGllIHZvbiBPcGVuU1NMIGJlcmVpdGdlc3RlbGx0IHdlcmRlbi48L2RkPgotCi0gICAgICA8ZHQ+PHN0cm9uZz5tb2RfZGF2PC9zdHJvbmc+PC9kdD4KLQotICAgICAgPGRkPk5ldWVzIE1vZHVsIGluIEFwYWNoZSAyLjAuIERpZXNlcyBNb2R1bCBiaWV0ZXQgZGllIEhUVFAKLSAgICAgIERpc3RyaWJ1dGVkIEF1dGhvcmluZyBhbmQgVmVyc2lvbmluZyAoREFWKSBTcGV6aWZpa2F0aW9uLCB1bQotICAgICAgV2ViLUluaGFsdGUgenUgUG9zdGVuIHVuZCB6dSBXYXJ0ZW4uPC9kZD4KLQotICAgICAgPGR0PjxzdHJvbmc+bW9kX2F1dGhfZGlnZXN0PC9zdHJvbmc+PC9kdD4KLQotICAgICAgPGRkPlp1cyZhdW1sO3R6bGljaGUgVW50ZXJzdCZ1dW1sO3R6dW5nIGYmdXVtbDtyIHByb3plc3MmdXVtbDtiZXJncmVpZmVuZGVzIHNlc3Npb24gY2FjaGluZyBtaXR0ZWxzIHNoYXJlZCBtZW1vcnkuCi0gICAgIDwvZGQ+Ci0KLSAgICAgIDxkdD48c3Ryb25nPm1vZF9jaGFyc2V0X2xpdGU8L3N0cm9uZz48L2R0PgotCi0gICAgICA8ZGQ+TmV1ZXMgTW9kdWwgaW4gQXBhY2hlIDIuMC4gRGllc2VzIGV4cGVyaW1lbnRlbGxlIE1vZHVsIGVybGF1YnQgWmVpY2hlbnNhdHotJlV1bWw7YmVyc2V0dW5nIG9kZXIgV2llZGVya29kaWVydW5nLjwvZGQ+Ci0KLSAgICAgIDxkdD48c3Ryb25nPm1vZF9maWxlX2NhY2hlPC9zdHJvbmc+PC9kdD4KLQotICAgICAgPGRkPk5ldWVzIE1vZHVsIGluIEFwYWNoZSAyLjAuIERpZXNlcyBNb2R1bCBiZWluaGFsdGV0IGRpZSBGdW5rdGlvbmVuIHZvbiBtb2RfbW1hcF9zdGF0aWMgYXVzIEFwYWNoZSAxLjMgdW5kCi0gICAgICB3ZWl0ZXJlIFp3aXNjaGVuc3BlaWNoZXJ1bmdzLU0mb3VtbDtnbGljaGtlaXRlbi48L2RkPgotCi0gICAgICA8ZHQ+PHN0cm9uZz5tb2RfaGVhZGVyczwvc3Ryb25nPjwvZHQ+Ci0KLSAgICAgIDxkZD5EaWVzZXMgTW9kdWwgaXN0IGluIEFwYWNoZSAyLjAgdmllbCBmbGV4aWJsZXIgZ2V3b3JkZW4uIEVzIGthbm4gamV0enQgcmVxdWVzdC1oZWFkZXIgZGllIHZvbiBtb2RfcHJveHkgYmVudXR6dCB3ZXJkZW4sIHZlciZhdW1sO25kZXJuCi0gICAgICB1bmQgZXMga2FubiBSZXNwb25zZS1IZWFkZXIgbmFjaCBGYWxsdW50ZXJzY2hlaWR1bmcgc2V0emVuLjwvZGQ+Ci0KLSAgICAgIDxkdD48c3Ryb25nPm1vZF9wcm94eTwvc3Ryb25nPjwvZHQ+Ci0KLSAgICAgIDxkZD5EYXMgUHJveHkgTW9kdWwgd3VyZGUga29tcGxldHQgbmV1Z2VzY2hyaWViZW4gdW0gZGllIEZ1bmt0aW9uZW4gZGVyIG5ldWVuIEZpbHRlciBJbmZyYXN0cnVrdHVyIGF1c3p1c2NoJm91bWw7cGZlbiB1bmQKLSAgICAgIHVtIGVpbmVuIHp1dmVybCZhdW1sO3NzaWdlbiwgbWl0IEhUVFAvMS4xICZ1dW1sO2JlcmVpbnN0aW1tZW5kZW4gUHJveHkgenUgZXJzdGVsbGVuLjwvZGQ+Ci0KLSAgICAgIDxkdD48c3Ryb25nPm1vZF9uZWdvdGlhdGlvbjwvc3Ryb25nPjwvZHQ+Ci0KLSAgICAgIDxkZD5FaW5lIG5ldWUgPGEgaHJlZj0ibW9kL21vZF9uZWdvdGlhdGlvbi5odG1sI2ZvcmNlbGFuZ3VhZ2Vwcmlvcml0eSI+Rm9yY2VMYW5ndWFnZVByaW9yaXR5PC9hPgotICAgICAgRGlyZWt0aXZlIGthbm4gYmVudXR6dCB3ZXJkZW4sIHVtIHp1IHNpY2hlcm4sIGRhc3MgZGVyIENsaWVudCBhdWYgamVkZW4gRmFsbCBlaW4gZWluemVsbmVzIERva3VtZW50IGFuc3RhdHQKLSAgICAgIE5PVCBBQ0NFUFRBQkxFIG9kZXIgTVVMVElQTEUgQ0hPSUNFUyBBbnR3b3J0ZW4gYmVrb21tdC4gWnVzJmF1bWw7dHpsaWNoIHd1cmRlbiBkaWUgVmVyaGFuZGx1bmdzIHVuZCBNdWx0aXZpZXcKLSAgICAgIEFsZ29yaXRobWVuIGdlcyZhdW1sO3ViZXJ0IHVtIGVpbmhlaXRsaWNoZXJlIEVyZ2Vibmlzc2UgenUgbGllZmVybi4gQXUmc3psaWc7ZXJkZW0gd2lyZCBlaW5lIG5ldWUgRm9ybSBkZXIgVHlwZSBNYXAKLSAgICAgIGRpZSBEb2t1bWVudGUgZWluc2NobGllJnN6bGlnO2VuIGthbm4sIGJlcmVpdGdlc3RlbGx0LjwvZGQ+Ci0KLSAgICAgIDxkdD48c3Ryb25nPm1vZF9hdXRvaW5kZXg8L3N0cm9uZz48L2R0PgotCi0gICAgICA8ZGQ+QXV0b21hdGlzY2ggaW5kaXppZXJ0ZSBWZXJ6ZWljaG5pcyBBdWZsaXN0dW5nZW4gayZvdW1sO25uZW4gZiZ1dW1sO3IgYmVzc2VyZSAmVXVtbDtiZXJzaWNodGxpY2hrZWl0Ci0gICAgICBkdXJjaCBlaW5lIEhUTUwgVGFiZWxsZSBkYXJnZXN0ZWxsdCB3ZXJkZW4uIEdlbmF1ZXJlcmUgU29ydGllcnVuZ2VuLCB3aWUgVmVyc2lvbnMtU29ydGluZyB1bmQgUGxhdHpoYWx0ZXItRmlsdGVyaW5nCi0gICAgICBkZXMgVmVyemVpY2huaXNsaXN0aW5ncyB3ZXJkZW4gdW50ZXJzdCZ1dW1sO3R6dC48L2RkPgotCi0gICAgICA8ZHQ+PHN0cm9uZz5tb2RfaW5jbHVkZTwvc3Ryb25nPjwvZHQ+Ci0KLSAgICAgIDxkZD5OZXVlIERpcmVrdGl2ZW4gZXJsYXViZW4gZXMsIGRpZSBTdGFuZGFyZCBTdGFydC0gdW5kIEVuZHRhZ3Mgdm9uIFNTSSBFbGVtZW50ZW4KLSAgICAgIHp1ICZhdW1sO25kZXJuIHVuZCBkaWUgRmVobGVyIGFuZCBaZWl0Zm9ybWF0IEtvbmZpZ3VyYXRpb24gaW4gZGVyIEhhdXBrb25maWd1cmF0aW9uc2RhdGVpCi0gICAgICBhbnN0YXR0IGltIFNTSSBEb2t1bWVudCBzdGF0dHp1ZmluZGVuLiAgCi0gICAgICBFcmdlYm5pc3NlIHZvbiByZWd1bGFyIGV4cHJlc3Npb24gcGFyc2luZyB1bmQgZ3JvdXBpbmcgayZvdW1sO25uZW4gZHVjaCBkaWUgbW9kX2luY2x1ZGUgVmFyaWFibGVuICQwIGJpcyAkOSBlaW5nZWhvbHQgd2VyZGVuLjwvZGQ+Ci0KLSAgICAgIDxkdD48c3Ryb25nPm1vZF9hdXRoX2RibTwvc3Ryb25nPjwvZHQ+Ci0KLSAgICAgIDxkZD5EQk0tJmF1bWw7aG5saWNoZSBEYXRlbmJhbmtlbiB3ZXJkZW4gamV0enQgZHVyY2ggZGllIDxhIGhyZWY9Im1vZC9tb2RfYXV0aF9kYm0uaHRtbCNhdXRoZGJtdHlwZSI+QXV0aERCTVR5cGU8L2E+Ci0gICAgICBEaXJla3RpdmUgdW50ZXJzdCZ1dW1sO3R6dC48YQotICAgICAgPC9kZD4KLQotICAgICAgPGR0PjxzdHJvbmc+bW9kX2F1dGhfZGI8L3N0cm9uZz48L2R0PgotCi0gICAgICA8ZGQ+QmVya2VsZXkgREIgMy4wIHdpcmQgamV0enQgdW50ZXJzdCZ1dW1sO3R6dDwvZGQ+Ci0KLSAgICAgIDxkdD48c3Ryb25nPm1vZF9wcm94eTwvc3Ryb25nPjwvZHQ+Ci0KLSAgICAgIDxkZD5OZXVlIDxQcm94eSA+IEtvbmZpZ3VyYXRpb25zIFNlY3Rpb25zIGJyaW5nZW4gZWluZSBsZXNiYXJlcmUKLSAgICAgICh1bmQgaW50ZXJuIHNjaG5lbGxlcmUpIEtvbnRyb2xsZSBkZXIgendpc2NoZW5nZXNwZWljaGVydGVuIFNlaXRlbjsgZGllICZ1dW1sO2JlcmxhZGVuZQotICAgICAgPERpcmVjdG9yeSAicHJveHk6Li4uPiBLb25maWd1cmF0aW9uIHdpcmQgbmljaHQgdW50ZXJzdCZ1dW1sO3R6dC4gIERhcwotICAgICAgTW9kdWwgaXMgamV0enQgaW4gZWlnZW5lIFByb3Rva29sbC1VbnRlcnN0JnV1bWw7dHp1bmdzIE1vZHVsZSB3aWUgcHJveHlfY29ubmVjdCwgcHJveHlfZnRwIGFuZCBwcm94eV9odHRwIGdlZ2xpZWRlcnQuPC9kZD4KLQotICAgIDwvZGw+Ci0gICAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLSAgPC9ib2R5PgotPC9odG1sPgotCi0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL25ld19mZWF0dXJlc18yXzAuaHRtbC5lbiBiL2RvY3MvbWFudWFsL25ld19mZWF0dXJlc18yXzAuaHRtbC5lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI1Njk2Zi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9uZXdfZmVhdHVyZXNfMl8wLmh0bWwuZW4KKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD48SEVBRD4KLTxUSVRMRT5OZXcgZmVhdHVyZXMgd2l0aCBBcGFjaGUgMi4wPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgVEVYVD0iIzAwMDAwMCIgTElOSz0iIzAwMDBGRiIgCi0gICAgICBWTElOSz0iIzAwMDA4MCIgQUxJTks9IiNGRjAwMDAiPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5PdmVydmlldyBvZiBOZXcgRmVhdHVyZXMgaW4gQXBhY2hlIDIuMDwvSDE+Ci0KLTxQPkVuaGFuY2VtZW50czogPEEgSFJFRj0iI2NvcmUiPkNvcmU8L0E+IHwKLQotPFA+PEhSPgotCi08SDI+PEEgTkFNRT0iY29yZSI+Q29yZSBFbmhhbmNlbWVudHM6PC9BPjwvSDI+Ci0KLTxETD4KLTxEVD48U1RST05HPlVuaXggVGhyZWFkaW5nPC9TVFJPTkc+Ci08REQ+T24gVW5peCBzeXN0ZW1zIHdpdGggUE9TSVggdGhyZWFkcyBzdXBwb3J0LCBBcGFjaGUgY2FuIG5vdyBydW4gaW4gYQotICAgIGh5YnJpZCBtdWx0aXByb2Nlc3MsIG11bHRpdGhyZWFkZWQgbW9kZS4gVGhpcyBzaG91bGQgaW1wcm92ZQotICAgIHNjYWxhYmlsaXR5LiAKLQotPERUPjxTVFJPTkc+TmV3IEJ1aWxkIFN5c3RlbTwvU1RST05HPgotPEREPlRoZSBidWlsZCBzeXN0ZW0gaGFzIGJlZW4gcmV3cml0dGVuIGZyb20gc2NyYXRjaCB0byBiZSBiYXNlZCBvbgotICAgIGF1dG9jb25mIGFuZCBsaWJ0b29sLiBUaGlzIG1ha2VzIEFwYWNoZSdzIGNvbmZpZ3VyYXRpb24gc3lzdGVtIG1vcmUKLSAgICBzaW1pbGFyIHRvIHRoYXQgb2Ygb3RoZXIgcGFja2FnZXMuCi0KLTxEVD48U1RST05HPk11bHRpcHJvdG9jb2wgU3VwcG9ydDwvU1RST05HPgotPEREPkFwYWNoZSBub3cgaGFzIHNvbWUgb2YgdGhlIGluZnJhc3RydWN0dXJlIGluIHBsYWNlIHRvIHN1cHBvcnQgc2VydmluZwotICAgIG11bHRpcGxlIHByb3RvY29scy4gbW9kX2VjaG8gaGFzIGJlZW4gd3JpdHRlbiBhcyBhbiBleGFtcGxlLgotCi08RFQ+PFNUUk9ORz5CZXR0ZXIgc3VwcG9ydCBmb3Igbm9uLVVuaXggcGxhdGZvcm1zPC9TVFJPTkc+Ci08REQ+QXBhY2hlIDIuMCBzaG91bGQgYmUgZmFzdGVyIGFuZCBtb3JlIHN0YWJsZSBvbiBub24tVW5peCBwbGF0Zm9ybXMgc3VjaAotICAgIGFzIEJlT1MsIE9TLzIsIGFuZCBXaW5kb3dzLiBXaXRoIHRoZSBpbnRyb2R1Y3Rpb24gb2YgcGxhdGZvcm0tc3BlY2lmaWMKLSAgICBtdWx0aXByb2Nlc3NpbmcgbW9kdWxlcyBhbmQgdGhlIEFwYWNoZSBQb3J0YWJsZSBSdW50aW1lLCB0aGVzZQotICAgIHBsYXRmb3JtcyBjYW4gbm93IGF2b2lkIHVzaW5nIFBPU0lYLWVtdWxhdGlvbiBmdW5jdGlvbnMgdGhhdCBhcmUKLSAgICBzb21ldGltZXMgYnVnZ3kgYW5kIGFsd2F5cyBodXJ0IHBlcmZvcm1hbmNlLgotCi08RFQ+PFNUUk9ORz5OZXcgQVBJPC9TVFJPTkc+Ci08REQ+VGhlIEFQSSBmb3IgbW9kdWxlcyBoYXMgY2hhbmdlZCBzaWduaWZpY2FudGx5IGZvciAyLjAuIE1hbnkgb2YgdGhlCi0gICAgbW9kdWxlLW9yZGVyaW5nIHByb2JsZW1zIGZyb20gMS4zIHNob3VsZCBiZSBnb25lLCBzaW5jZSAyLjAgZG9lcyBtdWNoCi0gICAgb2YgdGhpcyBhdXRvbWF0aWNhbGx5IG5vdy4gQWxzbywgbmV3IGNhbGxzIGhhdmUgYmVlbiBhZGRlZCB0aGF0IHNob3VsZAotICAgIGFsbG93IG1vZHVsZXMgdG8gZG8gbW9yZSB3aXRob3V0IHJlcXVpcmluZyBwYXRjaGluZyBvZiB0aGUgY29yZSBBcGFjaGUKLSAgICBzZXJ2ZXIuCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL25ld19mZWF0dXJlc18yXzAuaHRtbC5mciBiL2RvY3MvbWFudWFsL25ld19mZWF0dXJlc18yXzAuaHRtbC5mcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI1MTg4Zi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9uZXdfZmVhdHVyZXNfMl8wLmh0bWwuZnIKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD48SEVBRD4KLTxUSVRMRT5Ob3V2ZWxsZXMgZm9uY3Rpb25uYWxpdCZlYWN1dGU7cyBkJ0FwYWNoZSAyLjA8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCAKLXJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFRFWFQ9IiMwMDAwMDAiIExJTks9IiMwMDAwRkYiIAotICAgICAgVkxJTks9IiMwMDAwODAiIEFMSU5LPSIjRkYwMDAwIj4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+QXBlciZjY2VkaWw7dSBkZXMgbm91dmVsbGVzIGZvbmN0aW9ubmFsaXQmZWFjdXRlO3MgCi1kJ0FwYWNoZSAyLjA8L0gxPgotCi08UD5BbSZlYWN1dGU7bGlvcmF0aW9ucyZuYnNwOzogPEEgSFJFRj0iI2NvcmUiPk5veWF1PC9BPiAKLXwgPGEgaHJlZj0iI21vZHVsZSI+TW9kdWxlPC9hPgotCi08UD48SFI+Ci0KLTxIMj48QSBOQU1FPSJjb3JlIj5BbSZlYWN1dGU7bGlvcmF0aW9ucyBkdSBub3lhdSAmbmJzcDs6PC9BPjwvSDI+Ci0KLTxETD4KLTxEVD48U1RST05HPlRocmVhZHMgc3VyIFVuaXg8L1NUUk9ORz4KLTxERD5TdXIgbGVzIHN5c3QmZWdyYXZlO21lcyBVbml4LCBBcGFjaGUgcGV1dCBzJ2V4JmVhY3V0ZTtjdXRlciBzZWxvbiAKLXVuIG1vZCZlZ3JhdmU7bGUgaHlicmlkZSBtdWx0aS1wcm9jZXNzdXMgZXQgbXVsdGktdGhyZWFkcywgCi1lbiBlbXBsb3lhbnQgbGVzIHRocmVhZHMgc2Vsb24gbGEgbm9ybWUgUE9TSVguIENlY2kgZGV2cmFpdCBhbSZlYWN1dGU7bGlvcmVyIAotbGVzIHBlcmZvcm1hbmNlcy4gCi0KLTxEVD48U1RST05HPk5vdXZlYXUgc3lzdOhtZSBkZSBjb25zdHJ1Y3Rpb248L1NUUk9ORz4KLTxERD5MZSBzeXN06G1lIGRlIGNvbnN0cnVjdGlvbiBhICZlYWN1dGU7dCZlYWN1dGU7IGVudGkmZWdyYXZlO3JlbWVudCAKLXImZWFjdXRlOyZlYWN1dGU7Y3JpdCBldCByZXBvc2Ugc3VyIGF1dG9jb25mIGV0IGxpYnRvb2wuIENlbGEgcmVuZCBsZSAKLXN5c3QmZWdyYXZlO21lIGRlIGNvbmZpZ3VyYXRpb24gcGx1cyBzZW1ibGFibGVzIGF1eCBhdXRyZXMgcGFxdWV0YWdlcy4gCi0KLTxEVD48U1RST05HPlN1cHBvcnQgbXVsdGlwcm90b2NvbGU8L1NUUk9ORz4KLTxERD5BcGFjaGUgcG9zc+hkZSBtYWludGVuYW50IHVuZSBpbmZyYXN0cnVjdHVyZSBhZmluIGRlIHNlcnZpciBkZSBtdWx0aXBsZXMgCi1wcm90b2NvbGVzLiBtb2RfZWNobyBhICZlYWN1dGU7dCZlYWN1dGU7ICZlYWN1dGU7Y3JpdCBjb21tZSBleGVtcGxlIGRlIGNlcyAKLW5vdXZlbGxlcyBmb25jdGlvbnMuIAotCi08RFQ+PFNUUk9ORz5NZWlsbGV1ciBzdXBwb3J0IGRlcyBwbGF0ZXMtZm9ybWVzIGF1dHJlcyBxdSdVbml4PC9TVFJPTkc+Ci08REQ+QXBhY2hlIDIuMCBlc3QgcGx1cyByYXBpZGUgZXQgcGx1cyBzdGFibGUgc3VyIGxlcyBwbGF0ZXMtZm9ybWVzIG5vbiBVbml4Ci10ZWxsZXMgcXVlIEJlT1MsIE9TLzIsIGV0IFdpbmRvd3MuIEF2ZWMgbCdpbnRyb2R1Y3Rpb24gZGVzICAKLTxhIGhyZWY9Im1wbS5odG1sIj5tb2R1bGVzIG11bHRpIHRyYWl0ZW1lbnRzPC9hPiAoTVBNcykgc3AmZWFjdXRlO2NpZmlxdWVzIGF1eCAKLXBsYXRlcy1mb3JtZXMgZXQgbCdleCZlYWN1dGU7Y3V0ZXVyIHBvcnRhYmxlIEFwYWNoZSAoQVBSKSwgbGUgY29kZSBwb3VyIGNlcyAKLXBsYXRlcy1mb3JtZXMgZXN0IHImZWFjdXRlO2FsaXMmZWFjdXRlOyBlbiBlbXBsb3lhbnQgbGV1cnMgQVBJIG5hdGl2ZXMsIAotcGVybWV0dGFudCBhaW5zaSBkJyZlYWN1dGU7dml0ZXIgbGVzIGNvdWNoZXMgZCcmZWFjdXRlO211bGF0aW9ucyBQT1NJWCAKLXNvdXZlbnQgYm9ndSZlYWN1dGU7ZXMgZXQgcGV1IHBlcmZvcm1hbnRlcy4gIAotCi08RFQ+PFNUUk9ORz5Ob3V2ZWxsZSBBUEkgQXBhY2hlPC9TVFJPTkc+Ci08REQ+TCdBUEkgcG91ciBsZXMgbW9kdWxlcyBkZSBsYSB2ZXJzaW9uIDIuMCBhIGNoYW5nJmVhY3V0ZTsgZGUgbWFuaSZlZ3JhdmU7cmUgCi1pbXBvcnRhbnRlLiBCZWF1Y291cCBkZSBwcm9ibCZlZ3JhdmU7bWVzIGQnb3Jkb25uYW5jZW1lbnQgZGVzIG1vZHVsZXMgZXhpc3RhbnRzCi1kYW5zIGxhIHZlcnNpb24gMS4zIGRldnJhaWVudCBkaXNwYXJhJmljaXJjO3RyZS4gTGEgdmVyc2lvbiAyLjAgZyZlZ3JhdmU7cmUgY2VjaSBkZSAKLW1hbmnocmUgYXV0b21hdGlxdWUsIGV0IGwnb3Jkb25uYW5jZW1lbnQgZGVzIG1vZHVsZXMgcydlZmZlY3R1ZSBzZWxvbiAKLXVuZSBmb25jdGlvbiBkJ2FjY3JvY2hhZ2UgYWZpbiBkZSBwZXJtZXR0cmUgdW5lIHBsdXMgZ3JhbmRlIGZsZXhpYmlsaXQmZWFjdXRlOy4gICAKLQotPC9ETD4KLQotPFA+PEhSPgotPEgyPjxBIE5BTUU9Im1vZHVsZSI+QW0mZWFjdXRlO2xpb3JhdGlvbnMgY29uY2VybmFudCBsZXMgbW9kdWxlcyZuYnNwOzo8L0E+PC9IMj4KLQotPGRsPgotCi08ZHQ+PHN0cm9uZz5tb2RfYXV0aF9kYjwvc3Ryb25nPgotPGRkPklsIGFjY2VwdGUgbWFpbnRlbmFudCBsZXMgYmFzZXMgQmVya2VsZXkgREIgMy4wLgotCi08ZHQ+PHN0cm9uZz5tb2RfYXV0aF9kaWdlc3Q8L3N0cm9uZz4KLTxkZD5JbCBpbmNsdXQgdW5lIG5vdXZlbGxlIGdlc3Rpb24gZGVzIHNlc3Npb25zIGVuIHV0aWxpc2FudCB1biBjYWNoZSBjb21tdW4KLWF1eCBwcm9jZXNzdXMgZ3JhY2UgJmFncmF2ZTsgdW5lIG0mZWFjdXRlO21vaXJlIHBhcnRhZyZlYWN1dGU7ZS4KLQotPGR0PjxzdHJvbmc+bW9kX2NoYXJzZXRfbGl0ZTwvc3Ryb25nPiA8ZGQ+Tm91dmVhdSBtb2R1bGUgZGFucyBBcGFjaGUgMi4wLgotQ2UgbW9kdWxlIGV4cCZlYWN1dGU7cmltZW50YWwgcGVybWV0IGxhIHRyYWR1Y3Rpb24gZGVzIHBhZ2VzIGRlIGNhcmFjdCZlZ3JhdmU7cmVzCi1vdSBsZXVyIHJlY29kYWdlLgotCi08ZHQ+PHN0cm9uZz5tb2RfZGF2PC9zdHJvbmc+Ci08ZGQ+Tm91dmVhdSBtb2R1bGUgZGFucyBBcGFjaGUgMi4wLiBDZSBtb2R1bGUgbWV0IGVuIG9ldXZyZSBsYSBzcCZlYWN1dGU7Y2lmaWNhdGlvbgotIkhUVFAgRGlzdHJpYnV0ZWQgQXV0aG9yaW5nIGFuZCBWZXJzaW9uaW5nIChEQVYpIiBwZXJtZXR0YW50IGRlIGRpc3RyaWJ1ZXIgZXQKLW1haW50ZW5pciBsZSBjb250ZW51IGQndW4gc2l0ZSB3ZWIuCi0KLTxkdD48c3Ryb25nPm1vZF9maWxlX2NhY2hlPC9zdHJvbmc+Ci08ZGQ+Tm91dmVhdSBtb2R1bGUgZGFucyBBcGFjaGUgMi4wLiBDZSBtb2R1bGUgaW5jbHV0IGxlcyBmb25jdGlvbm5hbGl0JmVhY3V0ZTtzIAotZHUgbW9kdWxlIG1vZF9tbWFwX3N0YXRpYyBleGlzdGFudCBkYW5zIGxhIHZlcnNpb24gZCdBcGFjaGUgMS4zLCBlbiBham91dGFudCAKLWRhdmFudGFnZSBkZSBwb3NzaWJpbGl0JmVhY3V0ZTtzIGRlIGNhY2hlLgotCi08L2RsPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotCi0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3BsYXRmb3JtL25ldHdhcmUuaHRtbCBiL2RvY3MvbWFudWFsL3BsYXRmb3JtL25ldHdhcmUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkZDc3OC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9wbGF0Zm9ybS9uZXR3YXJlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5Vc2luZyBBcGFjaGUgd2l0aCBOb3ZlbGwgTmV0V2FyZSA1PC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci0KLTxIMSBBTElHTj0iQ0VOVEVSIj5Vc2luZyBBcGFjaGUgV2l0aCBOb3ZlbGwgTmV0V2FyZSA1PC9IMT4KLQotPFA+VGhpcyBkb2N1bWVudCBleHBsYWlucyBob3cgdG8gaW5zdGFsbCwgY29uZmlndXJlIGFuZCBydW4KLSAgIEFwYWNoZSAxLjMgdW5kZXIgTm92ZWxsIE5ldFdhcmUgNS4gUGxlYXNlIG5vdGUgdGhhdCBhdAotICAgdGhpcyB0aW1lLCBOZXRXYXJlIHN1cHBvcnQgaXMgZW50aXJlbHkgZXhwZXJpbWVudGFsLCBhbmQgaXMKLSAgIHJlY29tbWVuZGVkIG9ubHkgZm9yIGV4cGVyaWVuY2VkIHVzZXJzLiBUaGUgQXBhY2hlIEdyb3VwIGRvZXMgbm90Ci0gICBndWFyYW50ZWUgdGhhdCB0aGlzIHNvZnR3YXJlIHdpbGwgd29yayBhcyBkb2N1bWVudGVkLCBvciBldmVuIGF0Ci0gICBhbGwuIElmIHlvdSBmaW5kIGFueSBidWdzLCBvciB3aXNoIHRvIGNvbnRyaWJ1dGUgaW4gb3RoZXIgd2F5cywgcGxlYXNlCi0gICB1c2Ugb3VyIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9idWdfcmVwb3J0Lmh0bWwiPmJ1ZyByZXBvcnRpbmcKLSAgIHBhZ2UuPC9BPjwvUD4KLQotPFA+PFNUUk9ORz5XYXJuaW5nOiBBcGFjaGUgb24gTmV0V2FyZSBoYXMgbm90IHlldCBiZWVuIG9wdGltaXplZCBmb3IgcGVyZm9ybWFuY2UuCi1BcGFjaGUgc3RpbGwgcGVyZm9ybXMgYmVzdCwgYW5kIGlzIG1vc3QgcmVsaWFibGUgb24gVW5peCBwbGF0Zm9ybXMuICBPdmVyCi10aW1lIHdlIHdpbGwgaW1wcm92ZSBOZXRXYXJlIHBlcmZvcm1hbmNlLiBGb2xrcyBkb2luZyBjb21wYXJhdGl2ZSByZXZpZXdzCi1vZiB3ZWJzZXJ2ZXIgcGVyZm9ybWFuY2UgYXJlIGFza2VkIHRvIGNvbXBhcmUgYWdhaW5zdCBBcGFjaGUKLW9uIGEgVW5peCBwbGF0Zm9ybSBzdWNoIGFzIFNvbGFyaXMsIEZyZWVCU0QsIG9yIExpbnV4LjwvU1RST05HPjwvUD4KLQotPFA+Ci0KLU1vc3Qgb2YgdGhpcyBkb2N1bWVudCBhc3N1bWVzIHRoYXQgeW91IGFyZSBpbnN0YWxsaW5nIEFwYWNoZSBmcm9tIGEKLWJpbmFyeSBkaXN0cmlidXRpb24uIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgQXBhY2hlIHlvdXJzZWxmIChwb3NzaWJseQotdG8gaGVscCB3aXRoIGRldmVsb3BtZW50LCBvciB0byB0cmFjayBkb3duIGJ1Z3MpLCBzZWUgdGhlIHNlY3Rpb24gb24KLTxBIEhSRUY9IiNjb21wIj5Db21waWxpbmcgQXBhY2hlIGZvciBOZXRXYXJlPC9BPiBiZWxvdy4KLQotPEhSPgotCi08VUw+Ci0gIDxMST48QSBIUkVGPSIjcmVxIj5SZXF1aXJlbWVudHM8L0E+Ci0gIDxMST48QSBIUkVGPSIjZG93biI+RG93bmxvYWRpbmcgQXBhY2hlIGZvciBOZXRXYXJlPC9BPgotICA8TEk+PEEgSFJFRj0iI2luc3QiPkluc3RhbGxpbmcgQXBhY2hlIGZvciBOZXRXYXJlPC9BPgotICA8TEk+PEEgSFJFRj0iI3J1biI+UnVubmluZyBBcGFjaGUgZm9yIE5ldFdhcmU8L0E+Ci0gIDxMST48QSBIUkVGPSIjdXNlIj5Vc2luZyBBcGFjaGUgZm9yIE5ldFdhcmU8L0E+Ci0gIDxMST48QSBIUkVGPSIjY29tcCI+Q29tcGlsaW5nIEFwYWNoZSBmb3IgTmV0V2FyZTwvQT4KLTwvVUw+Ci0KLTxIUj4KLQotPEgyPjxBIE5BTUU9InJlcSI+UmVxdWlyZW1lbnRzPC9BPjwvSDI+Ci0KLUFwYWNoZSAxLjMgaXMgZGVzaWduZWQgdG8gcnVuIG9uIE5ldFdhcmUgNS4wIGFuZCA1LjEuCi08UD4KLQotPFNUUk9ORz5JZiBydW5uaW5nIG9uIE5ldFdhcmUgNS4wIHlvdSBtdXN0IGluc3RhbGwgU2VydmljZSBQYWNrIDQuPC9TVFJPTkc+Ci0KLTxQPgotPFA+Ci0KLVNlcnZpY2UgcGFjayA0IGlzIGF2YWlsYWJsZSA8QSBIUkVGPSJodHRwOi8vc3VwcG9ydC5ub3ZlbGwuY29tL21pc2MvcGF0bHN0Lmh0bSNudyI+aGVyZS48L0E+Ci0KLTxIMj48QSBOQU1FPSJkb3duIj5Eb3dubG9hZGluZyBBcGFjaGUgZm9yIE5ldFdhcmUgNTwvQT48L0gyPgotCi08UD5JbmZvcm1hdGlvbiBvbiB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgQXBhY2hlIGNhbiBiZSBmb3VuZCBvbiB0aGUKLUFwYWNoZSB3ZWIgc2VydmVyIGF0IDxBCi1IUkVGPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC9BPi4gIFRoaXMgd2lsbAotbGlzdCB0aGUgY3VycmVudCByZWxlYXNlLCBhbnkgbW9yZSByZWNlbnQgYWxwaGEgb3IgYmV0YS10ZXN0IHJlbGVhc2VzLAotdG9nZXRoZXIgd2l0aCBkZXRhaWxzIG9mIG1pcnJvciB3ZWIgYW5kIGFub255bW91cyBmdHAgc2l0ZXMuPC9QPgotCi08UD4KLTxIMj48QSBOQU1FPSJpbnN0Ij5JbnN0YWxsaW5nIEFwYWNoZSBmb3IgTmV0V2FyZTwvQT48L0gyPgotCi1UaGVyZSBpcyBubyBBcGFjaGUgaW5zdGFsbCBwcm9ncmFtIGZvciBOZXRXYXJlIGN1cnJlbnRseS4gIFlvdSB3aWxsIG5lZWQKLXRvIGNvbXBpbGUgYXBhY2hlIGFuZCBjb3B5IHRoZSBmaWxlcyBvdmVyIHRvIHRoZSBzZXJ2ZXIgbWFudWFsbHkuICBBbgotaW5zdGFsbCBwcm9ncmFtIHdpbGwgYmUgcG9zdGVkIGF0IGEgbGF0ZXIgZGF0ZS4KLTxQPgotRm9sbG93IHRoZXNlIHN0ZXBzIHRvIGluc3RhbGwgQXBhY2hlIG9uIE5ldFdhcmUgKGFzc3VtaW5nIHlvdSB3aWxsIGluc3RhbGwgdG8gc3lzOi9hcGFjaGUpOgotCi08VUw+Ci0gIDxMST5DcmVhdGUgYSBkaXJlY3RvcnkgY2FsbGVkIDxDT0RFPkFwYWNoZTwvQ09ERT4gb24gYSBOZXRXYXJlIHZvbHVtZQotICA8TEk+Q29weSBBcGFjaGUubmxtLCBBcGFjaGVjLm5sbSwgaHRkaWdlc3QubmxtLCBhbmQgaHRwYXNzd2QubmxtIHRvIHN5czovYXBhY2hlCi0gIDxMST5DcmVhdGUgYSBkaXJlY3RvcnkgdW5kZXIgPENPREU+c3lzOi9BcGFjaGU8L0NPREU+IGNhbGxlZCA8Q09ERT5jb25mPC9DT0RFPgotICA8TEk+Q29weSBhbGwgdGhlICouY29uZi1kaXN0LW53IGZpbGVzIHRvIHRoZSA8Q09ERT5zeXM6L2FwYWNoZS9jb25mPC9DT0RFPiBkaXJlY3RvcnkKLSAgICAgIGFuZCByZW5hbWUgdGhlbSBhbGwgYXMgKi5jb25mIGZpbGVzCi0gIDxMST5Db3B5IHRoZSBtaW1lLnR5cGVzIGFuZCBtYWdpYyBmaWxlcyB0byBzeXM6L2FwYWNoZS9jb25mIGRpcmVjdG9yeQotICA8TEk+Q29weSBhbGwgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzIG9mIFxhcGFjaGUtMS4zXGh0ZG9jcyB0byBzeXM6L2FwYWNoZS9odGRvY3MgYW5kCi0gICAgICByZW5hbWUgdGhlIHByb3BlciBpbmRleCBmaWxlIChpbmRleC5odG1sLmVuKSB0byBpbmRleC5odG1sCi0gIDxMST5Db3B5IGFsbCBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgaW4gXGFwYWNoZS0xLjNcaWNvbnMgdG8gc3lzOi9hcGFjaGUvaWNvbnMKLSAgPExJPkNyZWF0ZSB0aGUgZGlyZWN0b3J5IHN5czovYXBhY2hlL2xvZ3Mgb24gdGhlIHNlcnZlcgotICA8TEk+Q3JlYXRlIHRoZSBkaXJlY3Rvcnkgc3lzOi9hcGFjaGUvY2dpLWJpbiBvbiB0aGUgc2VydmVyCi0gIDxMST5DcmVhdGUgdGhlIGRpcmVjdG9yeSBzeXM6L2FwYWNoZS9tb2R1bGVzIGFuZCBjb3B5IGFsbCBubG0gbW9kdWxlcyBidWlsdCBpbnRvIHRoZQotICAgICAgbW9kdWxlcyBkaXJlY3RvcnkKLSAgPExJPkVkaXQgdGhlIGh0dHBkLmNvbmYgZmlsZSBzZXR0aW5nIFNlcnZlclJvb3QgYW5kIFNlcnZlck5hbWUgdG8gcmVmbGVjdCB5b3VyIGNvcnJlY3QKLSAgICAgIHNlcnZlciBzZXR0aW5ncwotICA8TEk+QWRkIDxDT0RFPnN5czovYXBhY2hlPC9DT0RFPiB0byB0aGUgc2VhcmNoIHBhdGguICBFWEFNUExFOiBzZWFyY2ggYWRkIHN5czpcYXBhY2hlCi08L1VMPgotCi08UD5BcGFjaGUgbWF5IGJlIGluc3RhbGxlZCB0byBvdGhlciB2b2x1bWVzIGJlc2lkZXMgdGhlIGRlZmF1bHQgPENPREU+c3lzPC9DT0RFPiB2b2x1bWUuCi0KLTxIMj48QSBOQU1FPSJydW4iPlJ1bm5pbmcgQXBhY2hlIGZvciBOZXRXYXJlPC9BPjwvSDI+Ci0KLVRvIHN0YXJ0IEFwYWNoZSBqdXN0IHR5cGUgPFNUUk9ORz5hcGFjaGU8L1NUUk9ORz4gYXQgdGhlIGNvbnNvbGUuICBUaGlzCi13aWxsIGxvYWQgYXBhY2hlIGluIHRoZSBPUyBhZGRyZXNzIHNwYWNlLiAgSWYgeW91IHByZWZlciB0byBsb2FkCi1BcGFjaGUgaW4gYSBwcm90ZWN0ZWQgYWRkcmVzcyBzcGFjZSB5b3UgbWF5IHNwZWNpZnkgdGhlIGFkZHJlc3Mgc3BhY2UKLXdpdGggdGhlIGxvYWQgc3RhdGVtZW50IGFzIGZvbGxvd3M6Ci08UD4KLTxQUkU+Ci0gICAgbG9hZCBhZGRyZXNzIHNwYWNlID0gYXBhY2hlIGFwYWNoZQotPC9QUkU+Ci08UD4KLVRoaXMgd2lsbCBsb2FkIEFwYWNoZSBpbnRvIGFuIGFkZHJlc3Mgc3BhY2UgY2FsbGVkIGFwYWNoZS4gUnVubmluZyBtdWx0aXBsZSBpbnN0YW5jZXMKLW9mIEFwYWNoZSBjb25jdXJyZW50bHkgb24gTmV0V2FyZSBpcyBwb3NzaWJsZSBieSBsb2FkaW5nIGVhY2ggaW5zdGFuY2UgaW50byBpdHMgb3duCi1wcm90ZWN0ZWQgYWRkcmVzcyBzcGFjZS4KLQotPFA+Ci1BZnRlciBzdGFydGluZyBBcGFjaGUgaXQgd2lsbCBiZSBsaXN0ZW5pbmcgdG8gcG9ydCA4MCAodW5sZXNzIHlvdQotY2hhbmdlZCB0aGUgPFNBTVA+UG9ydDwvU0FNUD4sIDxTQU1QPkxpc3RlbjwvU0FNUD4gb3IKLTxTQU1QPkJpbmRBZGRyZXNzPC9TQU1QPiBkaXJlY3RpdmVzIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzKS4KLVRvIGNvbm5lY3QgdG8gdGhlIHNlcnZlciBhbmQgYWNjZXNzIHRoZSBkZWZhdWx0IHBhZ2UsIGxhdW5jaCBhIGJyb3dzZXIKLWFuZCBlbnRlciB0aGUgc2VydmVyJ3MgbmFtZSBvciBhZGRyZXNzLgotCi1UaGlzIHNob3VsZCByZXNwb25kIHdpdGggYSB3ZWxjb21lIHBhZ2UsIGFuZCBhIGxpbmsgdG8gdGhlIEFwYWNoZQotbWFudWFsLiBJZiBub3RoaW5nIGhhcHBlbnMgb3IgeW91IGdldCBhbiBlcnJvciwgbG9vayBpbiB0aGUKLTxTQU1QPmVycm9yX2xvZzwvU0FNUD4gZmlsZSBpbiB0aGUgPFNBTVA+bG9nczwvU0FNUD4gZGlyZWN0b3J5LgotCi08UD4KLQotT25jZSB5b3VyIGJhc2ljIGluc3RhbGxhdGlvbiBpcyB3b3JraW5nLCB5b3Ugc2hvdWxkIGNvbmZpZ3VyZSBpdAotcHJvcGVybHkgYnkgZWRpdGluZyB0aGUgZmlsZXMgaW4gdGhlIDxTQU1QPmNvbmY8L1NBTVA+IGRpcmVjdG9yeS4KLQotPFA+Ci1UbyB1bmxvYWQgQXBhY2hlIHJ1bm5pbmcgaW4gdGhlIE9TIGFkZHJlc3Mgc3BhY2UganVzdCB0eXBlIHRoZQotZm9sbG93aW5nIGF0IHRoZSBjb25zb2xlOgotPFBSRT4KLSAgICB1bmxvYWQgYXBhY2hlCi08L1BSRT4KLUlmIGFwYWNoZSBpcyBydW5uaW5nIGluIGEgcHJvdGVjdGVkIGFkZHJlc3Mgc3BhY2Ugc3BlY2lmeSB0aGUgCi1hZGRyZXNzIHNwYWNlIGluIHRoZSB1bmxvYWQgc3RhdGVtZW50OgotPFBSRT4KLSAgICB1bmxvYWQgYWRkcmVzcyBzcGFjZSA9IGFwYWNoZSBhcGFjaGUKLTwvUFJFPgotCi08UD4KLVdoZW4gd29ya2luZyB3aXRoIEFwYWNoZSBpdCBpcyBpbXBvcnRhbnQgdG8ga25vdyBob3cgaXQgd2lsbCBmaW5kIHRoZQotY29uZmlndXJhdGlvbiBmaWxlcy4gIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gZmlsZSBvbiB0aGUgY29tbWFuZCBsaW5lCi1pbiB0d28gd2F5czoKLQotPFVMPgotPExJPi1mIHNwZWNpZmllcyBhIHBhdGggdG8gYSBwYXJ0aWN1bGFyIGNvbmZpZ3VyYXRpb24gZmlsZQotPC9VTD4KLTxQUkU+ICAgIGFwYWNoZSAtZiAidm9sOi9teSBzZXJ2ZXIvY29uZi9teS5jb25mIjwvUFJFPgotPFBSRT4gICAgYXBhY2hlIC1mIHRlc3QvdGVzdC5jb25mPC9QUkU+Ci0KLUluIHRoZXNlIGNhc2VzLCB0aGUgcHJvcGVyIFNlcnZlclJvb3Qgc2hvdWxkIGJlIHNldCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotCi08UD4KLQotSWYgeW91IGRvbid0IHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIGZpbGUgbmFtZSB3aXRoIC1mLCBBcGFjaGUgd2lsbAotdXNlIHRoZSBmaWxlIG5hbWUgY29tcGlsZWQgaW50byB0aGUgc2VydmVyLCB1c3VhbGx5ICJjb25mL2h0dHBkLmNvbmYiLiAgSW52b2tpbmcKLUFwYWNoZSB3aXRoIHRoZSAtViBzd2l0Y2ggd2lsbCBkaXNwbGF5IHRoaXMgdmFsdWUgbGFiZWxlZCBhcyBTRVJWRVJfQ09ORklHX0ZJTEUuCi1BcGFjaGUgd2lsbCB0aGVuIGRldGVybWluZSBpdHMgU2VydmVyUm9vdCBieSB0cnlpbmcgdGhlIGZvbGxvd2luZywgaW4gdGhpcyBvcmRlcjoKLQotPFVMPgotPExJPkEgU2VydmVyUm9vdCBkaXJlY3RpdmUgdmlhIGEgLUMgc3dpdGNoLgotPExJPlRoZSAtZCBzd2l0Y2ggb24gdGhlIGNvbW1hbmQgbGluZS4KLTxMST5DdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Ci08TEk+VGhlIHNlcnZlciByb290IGNvbXBpbGVkIGludG8gdGhlIHNlcnZlci4KLTwvVUw+Ci0KLTxQPgotVGhlIHNlcnZlciByb290IGNvbXBpbGVkIGludG8gdGhlIHNlcnZlciBpcyB1c3VhbGx5ICJzeXM6L2FwYWNoZSIuCi1pbnZva2luZyBhcGFjaGUgd2l0aCB0aGUgLVYgc3dpdGNoIHdpbGwgZGlzcGxheSB0aGlzIHZhbHVlCi1sYWJlbGVkIGFzIEhUVFBEX1JPT1QuCi0KLTxIMj48QSBOQU1FPSJ1c2UiPkNvbmZpZ3VyaW5nIEFwYWNoZSBmb3IgTmV0V2FyZTwvQT48L0gyPgotCi1BcGFjaGUgaXMgY29uZmlndXJlZCBieSBmaWxlcyBpbiB0aGUgPFNBTVA+Y29uZjwvU0FNUD4KLWRpcmVjdG9yeS4gVGhlc2UgYXJlIHRoZSBzYW1lIGFzIGZpbGVzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBVbml4Ci12ZXJzaW9uLCBidXQgdGhlcmUgYXJlIGEgZmV3IGRpZmZlcmVudCBkaXJlY3RpdmVzIGZvciBBcGFjaGUgb24KLU5ldFdhcmUuIFNlZSB0aGUgPEEgSFJFRj0iLi8iPkFwYWNoZSBkb2N1bWVudGF0aW9uPC9BPiBmb3IgYWxsIHRoZQotYXZhaWxhYmxlIGRpcmVjdGl2ZXMuCi0KLTxQPgotCi1UaGUgbWFpbiBkaWZmZXJlbmNlcyBpbiBBcGFjaGUgZm9yIE5ldFdhcmUgYXJlOgotCi08VUw+Ci0gIDxMST48UD5CZWNhdXNlIEFwYWNoZSBmb3IgTmV0V2FyZSBpcyBtdWx0aXRocmVhZGVkLCBpdCBkb2VzIG5vdCB1c2UgYQotICAgICAgc2VwYXJhdGUgcHJvY2VzcyBmb3IgZWFjaCByZXF1ZXN0LCBhcyBBcGFjaGUgZG9lcyB3aXRoCi0gICAgICBVbml4LiBJbnN0ZWFkIHRoZXJlIGFyZSBvbmx5IHRocmVhZHMgcnVubmluZzogYSBwYXJlbnQgdGhyZWFkLCBhbmQKLSAgICAgIGEgY2hpbGQgd2hpY2ggaGFuZGxlcyB0aGUgcmVxdWVzdHMuIFdpdGhpbiB0aGUgY2hpbGQgZWFjaCByZXF1ZXN0IGlzCi0gICAgICBoYW5kbGVkIGJ5IGEgc2VwYXJhdGUgdGhyZWFkLgotICAgICAgPFA+Ci0KLSAgICAgIFNvIHRoZSAicHJvY2VzcyItbWFuYWdlbWVudCBkaXJlY3RpdmVzIGFyZSBkaWZmZXJlbnQ6Ci0gICAgICA8UD48QQotICAgICAgICAgSFJFRj0ibW9kL2NvcmUuaHRtbCNtYXhyZXF1ZXN0c3BlcmNoaWxkIj5NYXhSZXF1ZXN0c1BlckNoaWxkPC9BPgotICAgICAgICAgLSBMaWtlIHRoZSBVbml4IGRpcmVjdGl2ZSwgdGhpcyBjb250cm9scyBob3cgbWFueSByZXF1ZXN0cyBhCi0gICAgICAgICAgIHByb2Nlc3Mgd2lsbCBzZXJ2ZSBiZWZvcmUgZXhpdGluZy4gSG93ZXZlciwgdW5saWtlIFVuaXgsIGEKLSAgICAgICAgICAgcHJvY2VzcyBzZXJ2ZXMgYWxsIHRoZSByZXF1ZXN0cyBhdCBvbmNlLCBub3QganVzdCBvbmUsIHNvIGlmCi0gICAgICAgICAgIHRoaXMgaXMgc2V0LCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IGEgdmVyeSBoaWdoIG51bWJlciBpcwotICAgICAgICAgICB1c2VkLiBUaGUgcmVjb21tZW5kZWQgZGVmYXVsdCwgPENPREU+TWF4UmVxdWVzdHNQZXJDaGlsZAotICAgICAgICAgICAwPC9DT0RFPiwgZG9lcyBub3QgY2F1c2UgdGhlIHByb2Nlc3MgdG8gZXZlciBleGl0LgotICAgICAgPFA+PEEgSFJFRj0ibW9kL2NvcmUuaHRtbCN0aHJlYWRzcGVyY2hpbGQiPlRocmVhZHNQZXJDaGlsZDwvQT4gLQotICAgICAgICAgVGhpcyBkaXJlY3RpdmUgaXMgbmV3LCBhbmQgdGVsbHMgdGhlIHNlcnZlciBob3cgbWFueSB0aHJlYWRzIGl0Ci0gICAgICAgICBzaG91bGQgdXNlLiBUaGlzIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucyB0aGUgc2VydmVyCi0gICAgICAgICBjYW4gaGFuZGxlIGF0IG9uY2U7IGJlIHN1cmUgYW5kIHNldCB0aGlzIG51bWJlciBoaWdoIGVub3VnaCBmb3IKLSAgICAgICAgIHlvdXIgc2l0ZSBpZiB5b3UgZ2V0IGEgbG90IG9mIGhpdHMuIFRoZSByZWNvbW1lbmRlZCBkZWZhdWx0IGlzCi0gICAgICAgICA8Q09ERT5UaHJlYWRzUGVyQ2hpbGQgNTA8L0NPREU+LgotICAgICAgPC9QPjxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjdGhyZWFkc3RhY2tzaXplIj5UaHJlYWRTdGFja1NpemU8L0E+IC0KLSAgICAgICAgIFRoaXMgZGlyZWN0aXZlIHRlbGxzIHRoZSBzZXJ2ZXIgd2hhdCBzaXplIG9mIHN0YWNrIHRvIHVzZSBmb3IKLSAgICAgICAgIHRoZSBpbmRpdmlkdWFsIHRocmVhZHMuICBUaGUgcmVjb21tZW5kZWQgZGVmYXVsdCBpcwotICAgICAgICAgPENPREU+VGhyZWFkU3RhY2tTaXplIDY1NTM2PC9DT0RFPi4KLSAgICAgIDxQPgotICA8TEk+PFA+VGhlIGRpcmVjdGl2ZXMgdGhhdCBhY2NlcHQgZmlsZW5hbWVzIGFzIGFyZ3VtZW50cyBub3cgbXVzdCB1c2UKLSAgICAgIE5ldFdhcmUgZmlsZW5hbWVzIGluc3RlYWQgb2YgVW5peCBvbmVzLiBIb3dldmVyLCBiZWNhdXNlIEFwYWNoZQotICAgICAgdXNlcyBVbml4LXN0eWxlIG5hbWVzIGludGVybmFsbHksIHlvdSBtdXN0IHVzZSBmb3J3YXJkIHNsYXNoZXMsIG5vdAotICAgICAgYmFja3NsYXNoZXMuIFZvbHVtZXMgY2FuIGJlIHVzZWQ7IGlmIG9taXR0ZWQsIHRoZSBkcml2ZSB3aXRoIHRoZQotICAgICAgQXBhY2hlIGV4ZWN1dGFibGUgd2lsbCBiZSBhc3N1bWVkLjwvUD4KLSAgPExJPjxQPkFwYWNoZSBmb3IgTmV0V2FyZSBjb250YWlucyB0aGUgYWJpbGl0eSB0byBsb2FkIG1vZHVsZXMgYXQgcnVudGltZSwKLSAgICAgIHdpdGhvdXQgcmVjb21waWxpbmcgdGhlIHNlcnZlci4gSWYgQXBhY2hlIGlzIGNvbXBpbGVkIG5vcm1hbGx5LCBpdAotICAgICAgd2lsbCBpbnN0YWxsIGEgbnVtYmVyIG9mIG9wdGlvbmFsIG1vZHVsZXMgaW4gdGhlCi0gICAgICA8Q09ERT5cQXBhY2hlXG1vZHVsZXM8L0NPREU+IGRpcmVjdG9yeS4gVG8gYWN0aXZhdGUgdGhlc2UsIG9yIG90aGVyCi0gICAgICBtb2R1bGVzLCB0aGUgbmV3IDxBIEhSRUY9Im1vZC9tb2Rfc28uaHRtbCNsb2FkbW9kdWxlIj5Mb2FkTW9kdWxlPC9BPgotICAgICAgZGlyZWN0aXZlIG11c3QgYmUgdXNlZC4gRm9yIGV4YW1wbGUsIHRvIGFjdGl2ZSB0aGUgc3RhdHVzIG1vZHVsZSwKLSAgICAgIHVzZSB0aGUgZm9sbG93aW5nIChpbiBhZGRpdGlvbiB0byB0aGUgc3RhdHVzLWFjdGl2YXRpbmcgZGlyZWN0aXZlcwotICAgICAgaW4gPENPREU+YWNjZXNzLmNvbmY8L0NPREU+KTo8L1A+Ci08UFJFPgotICAgIExvYWRNb2R1bGUgc3RhdHVzX21vZHVsZSBtb2R1bGVzL3N0YXR1cwotPC9QUkU+Ci0gICAgICA8UD5JbmZvcm1hdGlvbiBvbiA8QSBIUkVGPSJtb2QvbW9kX3NvLmh0bWwjY3JlYXRpbmciPmNyZWF0aW5nIGxvYWRhYmxlCi0gICAgICAgICBtb2R1bGVzPC9BPiBpcyBhbHNvIGF2YWlsYWJsZS48L1A+Ci08L1VMPgotCi08SDI+PEEgTkFNRT0iY29tcCI+Q29tcGlsaW5nIEFwYWNoZSBmb3IgTmV0V2FyZTwvQT48L0gyPgotCi08UD5Db21waWxpbmcgQXBhY2hlIHJlcXVpcmVzIE1ldHJvV2Vya3MgQ29kZVdhcnJpb3IgNSB0byBiZSBwcm9wZXJseQotICAgaW5zdGFsbGVkLiAKLSAgIAotPFA+Rmlyc3QsIHVucGFjayB0aGUgQXBhY2hlIGRpc3RyaWJ1dGlvbiBpbnRvIGFuIGFwcHJvcHJpYXRlCi0gICBkaXJlY3RvcnkuICBUaGVuIGdvIHRvIHRoZSA8Q09ERT5zcmM8L0NPREU+IHN1YmRpcmVjdG9yeSBvZiB0aGUgQXBhY2hlCi0gICBkaXN0cmlidXRpb24gYW5kIHVuemlwIDxDT0RFPkFwYWNoZU5XLm1jcC5nejwvQ09ERT4uIFlvdSBtYXkgdXNlIGEKLSAgIHJlY2VudCB2ZXJzaW9uIG9mIFdpblppcCB0byBhY2NvbXBsaXNoIHRoaXMgb3IgZ3ppcCBmb3IgV2luZG93cy4gVGhlIG1haW4KLSAgIE1ldHJvd2Vya3MgcHJvamVjdCBmaWxlIGZvciBBcGFjaGUgPENPREU+KEFwYWNoZU5XLm1jcCk8L0NPREU+IGlzIG5vdyByZWFkeQotICAgdG8gdXNlLiBKdXN0IGRvdWJsZSBjbGljayBvbiBpdCBmcm9tIHdpdGhpbiBleHBsb3JlciBhbmQgaXQgc2hvdWxkCi0gICBhdXRvbWF0aWNhbGx5IGxhdW5jaCBNZXRyb1dlcmtzIENvZGVXYXJyaW9yLgotPC9QPgotCi08UD5BbGwgbWFqb3IgcGllY2VzIG9mIEFwYWNoZSBtYXkgYmUgYnVpbHQgdXNpbmcgdGhlIEFwYWNoZU5XLm1jcCBwcm9qZWN0Ci0gICBmaWxlLiBUaGlzIGluY2x1ZGVzIG1vZHVsZXMgc3VjaCBhcyBzdGF0dXMsIGluZm8sIGFuZCBwcm94eS4gSW4gYWRkaXRpb24sCi0gICB0aGUgZm9sbG93aW5nIHByb2plY3QgZmlsZXMgaGF2ZSBiZWVuIHByb3ZpZGVkIGFzIHdlbGw6Ci08UFJFPiAgIAotICAgICAgIC9hcGFjaGUtMS4zL3NyYy9zdXBwb3J0L2h0cGFzc3dkLm1jcC5negotICAgICAgIC9hcGFjaGUtMS4zL3NyYy9zdXBwb3J0L2h0ZGlnZXN0Lm1jcC5negotPC9QUkU+Ci0KLTwvUD4KLTxDT0RFPmh0cGFzc3dkLm1jcC5nejwvQ09ERT4gYW5kIDxDT0RFPmh0ZGlnZXN0Lm1jcC5nejwvQ09ERT4gd2lsbCBhbHNvIG5lZWQKLXRvIGJlIHVuemlwcGVkIGJlZm9yZSB0aGV5IGNhbiBiZSB1c2VkIHdpdGggTWV0cm9XZXJrcyBDb2RlV2Fycmlvci4KLQotPFA+T25jZSBBcGFjaGUgaGFzIGJlZW4gY29tcGlsZWQsIGl0IG5lZWRzIHRvIGJlIGluc3RhbGxlZCBpbiBpdHMgc2VydmVyCi0gICByb290IGRpcmVjdG9yeS4gVGhlIGRlZmF1bHQgaXMgdGhlIDxDT0RFPnN5czovQXBhY2hlPC9DT0RFPgotICAgZGlyZWN0b3J5LiA8L1A+Ci08UD4KLUJlZm9yZSBydW5uaW5nIHRoZSBzZXJ2ZXIgeW91IG11c3QgZmlsbCBvdXQgdGhlIGNvbmYgZGlyZWN0b3J5LgotQ29weSB0aGUgKi5jb25mLWRpc3QtbncgZnJvbSB0aGUgZGlzdHJpYnV0aW9uIGNvbmYgZGlyZWN0b3J5Ci1hbmQgcmVuYW1lICouY29uZi4gIEVkaXQgdGhlIFNlcnZlclJvb3QgZW50cmllcyB0byB5b3VyCi1hY3R1YWwgc2VydmVyIHJvb3QgKGZvciBleGFtcGxlICJzeXM6L2FwYWNoZSIpLiAgQ29weSBvdmVyCi10aGUgY29uZi9tYWdpYyBhbmQgY29uZi9taW1lLnR5cGVzIGZpbGVzIGFzIHdlbGwuCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3BsYXRmb3JtL3BlcmYtaHAuaHRtbCBiL2RvY3MvbWFudWFsL3BsYXRmb3JtL3BlcmYtaHAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJmMjg2Ny4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9wbGF0Zm9ybS9wZXJmLWhwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5SdW5uaW5nIGEgSGlnaC1QZXJmb3JtYW5jZSBXZWIgU2VydmVyIG9uIEhQVVg8L3RpdGxlPgotPC9oZWFkPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPEEgTkFNRT0iaW5pdGlhbCI+Ci08RElWIEFMSUdOPSJDRU5URVIiPgotIDxJTUcgU1JDPSIuLi9pbWFnZXMvc3ViLmdpZiIgQUxUPSJbQVBBQ0hFIERPQ1VNRU5UQVRJT05dIj4KLSA8SDM+Ci0gIEFwYWNoZSBIVFRQIFNlcnZlciBWZXJzaW9uIDEuMwotIDwvSDM+Ci08L0RJVj4KLQotPC9BPgotPEgxIEFMSUdOPSJDRU5URVIiPlJ1bm5pbmcgYSBIaWdoLVBlcmZvcm1hbmNlIFdlYiBTZXJ2ZXIgZm9yIEhQVVg8L0gxPgotCi08UFJFPgotRGF0ZTogV2VkLCAwNSBOb3YgMTk5NyAxNjo1OTozNCAtMDgwMAotRnJvbTogUmljayBKb25lcyAmbHQ7PEEgSFJFRj0ibWFpbHRvOnJhakBjdXAuaHAuY29tIj5yYWpAY3VwLmhwLmNvbTwvQT4mZ3Q7Ci1SZXBseS1UbzogcmFqQGN1cC5ocC5jb20KLU9yZ2FuaXphdGlvbjogTmV0d29yayBQZXJmb3JtYW5jZQotU3ViamVjdDogSFAtVVggdHVuaW5nIHRpcHMKLTwvUFJFPgotCi1IZXJlIGFyZSBzb21lIHR1bmluZyB0aXBzIGZvciBIUC1VWCB0byBhZGQgdG8gdGhlIHR1bmluZyBwYWdlLgotCi08UD4KLQotRm9yIEhQLVVYIDkuWDogVXBncmFkZSB0byAxMC4yMDxCUj4KLUZvciBIUC1VWCAxMC5bMDB8MDF8MTBdOiBVcGdyYWRlIHRvIDEwLjIwCi0KLTxQPgotCi1Gb3IgSFAtVVggMTAuMjA6IAotCi08UD4KLQotSW5zdGFsbCB0aGUgbGF0ZXN0IGN1bXVsYXRpdmUgQVJQQSBUcmFuc3BvcnQgUGF0Y2guIFRoaXMgd2lsbCBhbGxvdyB5b3UKLXRvIGNvbmZpZ3VyZSB0aGUgc2l6ZSBvZiB0aGUgVENQIGNvbm5lY3Rpb24gbG9va3VwIGhhc2ggdGFibGUuIFRoZQotZGVmYXVsdCBpcyAyNTYgYnVja2V0cyBhbmQgbXVzdCBiZSBzZXQgdG8gYSBwb3dlciBvZiB0d28uIFRoaXMgaXMKLWFjY29tcGxpc2hlZCB3aXRoIGFkYiBhZ2FpbnN0IHRoZSAqZGlzYyogaW1hZ2Ugb2YgdGhlIGtlcm5lbC4gVGhlCi12YXJpYWJsZSBuYW1lIGlzIHRjcF9oYXNoX3NpemUuCi0KLTxQPgotCi1Ib3cgdG8gcGljayB0aGUgdmFsdWU/IEV4YW1pbmUgdGhlIG91dHB1dCBvZgotPEEgSFJFRj0iZnRwOi8vZnRwLmN1cC5ocC5jb20vZGlzdC9uZXR3b3JraW5nL3Rvb2xzL2Nvbm5oaXN0Ij4KLWZ0cDovL2Z0cC5jdXAuaHAuY29tL2Rpc3QvbmV0d29ya2luZy90b29scy9jb25uaGlzdDwvQT4gYW5kIHNlZSBob3cgbWFueQotdG90YWwgVENQIGNvbm5lY3Rpb25zIGV4aXN0IG9uIHRoZSBzeXN0ZW0uIFlvdSBwcm9iYWJseSB3YW50IHRoYXQgbnVtYmVyCi1kaXZpZGVkIGJ5IHRoZSBoYXNoIHRhYmxlIHNpemUgdG8gYmUgcmVhc29uYWJseSBzbWFsbCwgc2F5IGxlc3MgdGhhbiAxMC4KLUZvbGtzIGNhbiBsb29rIGF0IEhQJ3MgU1BFQ3dlYjk2IGRpc2Nsb3N1cmVzIGZvciBzb21lIGNvbW1vbiBzZXR0aW5ncy4KLVRoZXNlIGNhbiBiZSBmb3VuZCBhdCA8QSBIUkVGPSJodHRwOi8vd3d3LnNwZWNiZW5jaC5vcmcvIj4KLWh0dHA6Ly93d3cuc3BlY2JlbmNoLm9yZy88L0E+LiBJZiBhbiBIUC1VWCBzeXN0ZW0gd2FzCi1wZXJmb3JtaW5nIGF0IDEwMDAgU1BFQ3dlYjk2IGNvbm5lY3Rpb25zIHBlciBzZWNvbmQsIHRoZSBUSU1FX1dBSVQgdGltZQotb2YgNjAgc2Vjb25kcyB3b3VsZCBtZWFuIDYwLDAwMCBUQ1AgImNvbm5lY3Rpb25zIiBiZWluZyB0cmFja2VkLiAKLQotPFA+Ci0KLUZvbGtzIGNhbiBjaGVjayB0aGVpciBsaXN0ZW4gcXVldWUgZGVwdGhzIHdpdGgKLTxBIEhSRUY9ImZ0cDovL2Z0cC5jdXAuaHAuY29tL2Rpc3QvbmV0d29ya2luZy9taXNjL2xpc3RlbnEiPgotZnRwOi8vZnRwLmN1cC5ocC5jb20vZGlzdC9uZXR3b3JraW5nL21pc2MvbGlzdGVucTwvQT4uCi0KLTxQPgotCi1JZiBmb2xrcyBhcmUgcnVubmluZyBBcGFjaGUgb24gYSBQQS04MDAwIGJhc2VkIHN5c3RlbSwgdGhleSBzaG91bGQKLWNvbnNpZGVyICJjaGF0cidpbmciIHRoZSBBcGFjaGUgZXhlY3V0YWJsZSB0byBoYXZlIGEgbGFyZ2UgcGFnZSBzaXplLgotVGhpcyB3b3VsZCBiZSAiY2hhdHIgK3BpIEwgPGJpbmFyeT4uIiBUaGUgR0lEIG9mIHRoZSBydW5uaW5nIGV4ZWN1dGFibGUKLW11c3QgaGF2ZSBNTE9DSyBwcml2aWxlZGdlcy4gU2V0cHJpdmdycCgxbSkgc2hvdWxkIGJlIGNvbnN1bHRlZCBmb3IKLWFzc2lnbmluZyBNTE9DSy4gVGhlIGNoYW5nZSBjYW4gYmUgdmFsaWRhdGVkIGJ5IHJ1bm5pbmcgR2xhbmNlIGFuZAotZXhhbWluaW5nIHRoZSBtZW1vcnkgcmVnaW9ucyBvZiB0aGUgc2VydmVyKHMpIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXkKLXNob3cgYSBub24tdHJpdmlhbCBmcmFjdGlvbiBvZiB0aGUgdGV4dCBzZWdtZW50IGJlaW5nIGxvY2tlZC4KLQotPFA+Ci0KLUlmIGZvbGtzIGFyZSBydW5uaW5nIEFwYWNoZSBvbiBNUCBzeXN0ZW1zLCB0aGV5IG1pZ2h0IGNvbnNpZGVyIHdyaXRpbmcgYQotc21hbGwgcHJvZ3JhbSB0aGF0IHVzZXMgbXBjdGwoKSB0byBiaW5kIHByb2Nlc3NlcyB0byBwcm9jZXNzb3JzLiBBCi1zaW1wbGUgcGlkICUgbnVtY3B1IGFsZ29yaXRobSBpcyBwcm9iYWJseSBzdWZmaWNpZW50LiBUaGlzIG1pZ2h0IGV2ZW4gZ28KLWludG8gdGhlIHNvdXJjZSBjb2RlLgotCi08UD4KLQotSWYgZm9sa3MgYXJlIGNvbmNlcm5lZCBhYm91dCB0aGUgbnVtYmVyIG9mIEZJTl9XQUlUXzIgY29ubmVjdGlvbnMsIHRoZXkKLWNhbiB1c2UgbmV0dHVuZSB0byBzaHJpbmsgdGhlIHZhbHVlIG9mIHRjcF9rZWVwc3RhcnQuIEhvd2V2ZXIsIHRoZXkKLXNob3VsZCBiZSBjYXJlZnVsIHRoZXJlIC0gY2VydGFpbmx5IGRvIG5vdCBtYWtlIGl0IGxlc3MgdGhhbiBvaCB0d28gdG8KLWZvdXIgbWludXRlcy4gSWYgdGNwX2hhc2hfc2l6ZSBoYXMgYmVlbiBzZXQgd2VsbCwgaXQgaXMgcHJvYmFibHkgT0sgdG8KLWxldCB0aGUgRklOX1dBSVRfMidzIHRha2UgbG9uZ2VyIHRvIHRpbWVvdXQgKHBlcmhhcHMgZXZlbiB0aGUgZGVmYXVsdAotdHdvIGhvdXJzKSAtIHRoZXkgd2lsbCBub3Qgb24gYXZlcmFnZSBoYXZlIGEgYmlnIGltcGFjdCBvbiBwZXJmb3JtYW5jZS4KLQotPFA+Ci0KLVRoZXJlIGFyZSBvdGhlciB0aGluZ3MgdGhhdCBjb3VsZCBnbyBpbnRvIHRoZSBjb2RlIGJhc2UsIGJ1dCB0aGF0IG1pZ2h0Ci1iZSBsZWZ0IGZvciBhbm90aGVyIGVtYWlsLiBGZWVsIGZyZWUgdG8gZHJvcCBtZSBhIG1lc3NhZ2UgaWYgeW91IG9yCi1vdGhlcnMgYXJlIGludGVyZXN0ZWQuCi0KLTxQPgotCi1zaW5jZXJlbHksCi0KLTxQPgotCi1yaWNrIGpvbmVzPEJSPgotPEEgSFJFRj0iaHR0cDovL3d3dy5jdXAuaHAuY29tL25ldHBlcmYvTmV0cGVyZlBhZ2UuaHRtbCI+Ci1odHRwOi8vd3d3LmN1cC5ocC5jb20vbmV0cGVyZi9OZXRwZXJmUGFnZS5odG1sPC9BPgotCi08SFI+Ci0KLTxIMyBBTElHTj0iQ0VOVEVSIj4KLSBBcGFjaGUgSFRUUCBTZXJ2ZXIgVmVyc2lvbiAxLjMKLTwvSDM+Ci0KLTxBIEhSRUY9Ii4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2luZGV4LmdpZiIgQUxUPSJJbmRleCI+PC9BPgotPEEgSFJFRj0iLi4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2hvbWUuZ2lmIiBBTFQ9IkhvbWUiPjwvQT4KLQotPC9ib2R5PjwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvcGxhdGZvcm0vd2luX2NvbXBpbGluZy5odG1sIGIvZG9jcy9tYW51YWwvcGxhdGZvcm0vd2luX2NvbXBpbGluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDk3MGVhLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL3BsYXRmb3JtL3dpbl9jb21waWxpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkNvbXBpbGluZyBBcGFjaGUgZm9yIE1pY3Jvc29mdCBXaW5kb3dzPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci0KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+VXNpbmcgQXBhY2hlIHdpdGggTWljcm9zb2Z0IFdpbmRvd3M8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLQotPEgxIEFMSUdOPSJDRU5URVIiPkNvbXBpbGluZyBBcGFjaGUgZm9yIE1pY3Jvc29mdCBXaW5kb3dzPC9IMT4KLQotPFA+VGhlcmUgYXJlIG1hbnkgaW1wb3J0YW50IHBvaW50cyBiZWZvcmUgeW91IGJlZ2luIGNvbXBpbGluZyBBcGFjaGUuCi0gICBTZWUgPEEgSFJFRj0id2luZG93cy5odG1sIj5Vc2luZyBBcGFjaGUgd2l0aCBNaWNyb3NvZnQgV2luZG93czwvQT4KLSAgIGJlZm9yZSB5b3UgYmVnaW4uPC9QPgotCi08UD5Db21waWxpbmcgQXBhY2hlIHJlcXVpcmVzIE1pY3Jvc29mdCBWaXN1YWwgQysrIDUuMCAob3IgbGF0ZXIpIHRvIGJlIAotICAgcHJvcGVybHkgaW5zdGFsbGVkLiBJdCBpcyBlYXNpZXN0IHRvIGNvbXBpbGUgd2l0aCB0aGUgY29tbWFuZC1saW5lIHRvb2xzCi0gICAobm1ha2UsIDxFTT5ldGMuPC9FTT4uLikuIENvbnN1bHQgdGhlIFZDKysgbWFudWFsIHRvIGRldGVybWluZSBob3cgdG8gaW5zdGFsbAotICAgdGhlbS48L1A+Ci0KLTxQPkZpcnN0LCB1bnBhY2sgdGhlIEFwYWNoZSBkaXN0cmlidXRpb24gaW50byBhbiBhcHByb3ByaWF0ZQotICAgZGlyZWN0b3J5LiBPcGVuIGEgY29tbWFuZC1saW5lIHByb21wdCwgYW5kIGNoYW5nZSB0byB0aGUKLSAgIDxDT0RFPnNyYzwvQ09ERT4gc3ViZGlyZWN0b3J5IG9mIHRoZSBBcGFjaGUgZGlzdHJpYnV0aW9uLjwvUD4KLQotPFA+VGhlIG1hc3RlciBBcGFjaGUgbWFrZWZpbGUgaW5zdHJ1Y3Rpb25zIGFyZSBjb250YWluZWQgaW4gdGhlCi0gICA8Q09ERT5NYWtlZmlsZS53aW48L0NPREU+IGZpbGUuIFRvIGNvbXBpbGUgQXBhY2hlIG9uIFdpbmRvd3MsIHNpbXBseQotICAgdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgotPFVMPgotPExJPjxDT0RFPm5tYWtlIC9mIE1ha2VmaWxlLndpbiBfYXBhY2hlcjwvQ09ERT4gKHJlbGVhc2UgYnVpbGQpCi08TEk+PENPREU+bm1ha2UgL2YgTWFrZWZpbGUud2luIF9hcGFjaGVkPC9DT0RFPiAoZGVidWcgYnVpbGQpCi08L1VMPgotCi08UD5UaGVzZSB3aWxsIGJvdGggY29tcGlsZSBBcGFjaGUuIFRoZSBsYXR0ZXIgd2lsbCBpbmNsdWRlIGRlYnVnZ2luZwotICAgaW5mb3JtYXRpb24gaW4gdGhlIHJlc3VsdGluZyBmaWxlcywgbWFraW5nIGl0IGVhc2llciB0byBmaW5kIGJ1Z3MgYW5kCi0gICB0cmFjayBkb3duIHByb2JsZW1zLjwvUD4KLQotPFA+QXBhY2hlIGNhbiBhbHNvIGJlIGNvbXBpbGVkIHVzaW5nIFZDKysncyBWaXN1YWwgU3R1ZGlvIGRldmVsb3BtZW50Ci0gICBlbnZpcm9ubWVudC4gQWx0aG91Z2ggY29tcGlsaW5nIEFwYWNoZSBpbiB0aGlzIG1hbm5lciBpcyBub3QgYXMKLSAgIHNpbXBsZSwgaXQgbWFrZXMgaXQgcG9zc2libGUgdG8gZWFzaWx5IG1vZGlmeSB0aGUgQXBhY2hlIHNvdXJjZSwgb3IKLSAgIHRvIGNvbXBpbGUgQXBhY2hlIGlmIHRoZSBjb21tYW5kLWxpbmUgdG9vbHMgYXJlIG5vdCBpbnN0YWxsZWQuCi0gICBQcm9qZWN0IGZpbGVzICg8Q09ERT4uRFNQPC9DT0RFPikgYXJlIGluY2x1ZGVkIGZvciBlYWNoIG9mIHRoZQotICAgcG9ydGlvbnMgb2YgQXBhY2hlLiBUbyBidWlsZCBBcGFjaGUgZnJvbSB0aGUgdGhlc2UgcHJvamVjdHMgZmlsZXMKLSAgIHlvdSB3aWxsIG5lZWQgdG8gYnVpbGQgdGhlIGZvbGxvd2luZyBwcm9qZWN0cyA8RU0+aW4gdGhpcyBvcmRlcjwvRU0+OgotPFNUUk9ORz4gVGhpcyBuZWVkcyB1cGRhdGluZyBmb3IgQXBhY2hlIDIuMCA8L1NUUk9ORz4KLSA8T0w+Ci0gICA8TEk+PENPREU+b3Ncd2luMzJcQXBhY2hlT1MuZHNwPC9DT0RFPgotICAgPExJPjxDT0RFPnJlZ2V4XHJlZ2V4LmRzcDwvQ09ERT4KLSAgIDxMST48Q09ERT5hcFxhcC5kc3A8L0NPREU+Ci0gICA8TEk+PENPREU+bWFpblxnZW5fdXJpX2RlbGltcy5kc3A8L0NPREU+Ci0gICA8TEk+PENPREU+bWFpblxnZW5fdGVzdF9jaGFyLmRzcDwvQ09ERT4KLSAgIDxMST48Q09ERT5BcGFjaGVDb3JlLmRzcDwvQ09ERT4KLSAgIDxMST48Q09ERT5BcGFjaGUuZHNwPC9DT0RFPgotIDwvT0w+Ci0KLSAgIEluIGFkZGl0aW9uLCB0aGUgPENPREU+c3JjXG9zXHdpbjMyPC9DT0RFPiBzdWJkaXJlY3RvcnkgY29udGFpbnMKLSAgIHByb2plY3QgZmlsZXMgZm9yIHRoZSBvcHRpb25hbCBtb2R1bGVzIChzZWUgYmVsb3cpLjwvUD4KLQotPFA+T25jZSBBcGFjaGUgaGFzIGJlZW4gY29tcGlsZWQsIGl0IG5lZWRzIHRvIGJlIGluc3RhbGxlZCBpbiBpdHMgc2VydmVyCi0gICByb290IGRpcmVjdG9yeS4gVGhlIGRlZmF1bHQgaXMgdGhlIDxDT0RFPlxBcGFjaGU8L0NPREU+Ci0gICBkaXJlY3RvcnksIG9uIHRoZSBjdXJyZW50IGhhcmQgZHJpdmUuIDwvUD4KLQotPFA+VG8gaW5zdGFsbCB0aGUgZmlsZXMgaW50byB0aGUgPENPREU+XEFwYWNoZTwvQ09ERT4gZGlyZWN0b3J5Ci0gICBhdXRvbWF0aWNhbGx5LCB1c2Ugb25lIHRoZSBmb2xsb3dpbmcgbm1ha2UgY29tbWFuZHMgKHNlZSBhYm92ZSk6PC9QPgotPFVMPgotPExJPjxDT0RFPm5tYWtlIC9mIE1ha2VmaWxlLndpbiBpbnN0YWxsciBJTlNURElSPTxFTT5kaXI8L0VNPjwvQ09ERT4KLSAoZm9yIHJlbGVhc2UgYnVpbGQpCi08TEk+PENPREU+bm1ha2UgL2YgTWFrZWZpbGUud2luIGluc3RhbGxkIElOU1RESVI9PEVNPmRpcjwvRU0+PC9DT0RFPgotIChmb3IgZGVidWcgYnVpbGQpCi08L1VMPgotCi1UaGUgZGlyIGFyZ3VtZW50IHRvIElOU1RESVIgZ2l2ZXMgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnk7IGl0IGNhbgotYmUgb21pdHRlZCBpZiBBcGFjaGUgaXMgdG8gYmUgaW5zdGFsbGVkIGludG8gPFNBTVA+XEFwYWNoZTwvU0FNUD4uCi0KLTxQPlRoaXMgd2lsbCBpbnN0YWxsIHRoZSBmb2xsb3dpbmc6PC9QPgotCi08VUw+Ci0gIDxMST48Q09ERT48RU0+ZGlyPC9FTT5cQXBhY2hlLmV4ZTwvQ09ERT4gLSBBcGFjaGUgZXhlY3V0YWJsZQotICA8TEk+PENPREU+PEVNPmRpcjwvRU0+XEFwYWNoZUNvcmUuZGxsPC9DT0RFPiAtIE1haW4gQXBhY2hlIHNoYXJlZCBsaWJyYXJ5Ci0gIDxMST48Q09ERT48RU0+ZGlyPC9FTT5cbW9kdWxlc1xBcGFjaGVNb2R1bGUqLmRsbDwvQ09ERT4gLSBPcHRpb25hbCBBcGFjaGUKLSAgICAgIG1vZHVsZXMgKDcgZmlsZXMpCi0gIDxMST48Q09ERT48RU0+ZGlyPC9FTT5cY29uZjwvQ09ERT4gLSBFbXB0eSBjb25maWd1cmF0aW9uIGRpcmVjdG9yeQotICA8TEk+PENPREU+PEVNPmRpcjwvRU0+XGxvZ3M8L0NPREU+IC0gRW1wdHkgbG9nZ2luZyBkaXJlY3RvcnkKLTwvVUw+Ci0KLTxQPklmIHlvdSBkbyBub3QgaGF2ZSBubWFrZSwgb3Igd2lzaCB0byBpbnN0YWxsIGluIGEgZGlmZmVyZW50IGRpcmVjdG9yeSwKLSAgIGJlIHN1cmUgdG8gdXNlIGEgc2ltaWxhciBuYW1pbmcgc2NoZW1lLjwvUD4KLQotPFA+Ci1CZWZvcmUgcnVubmluZyB0aGUgc2VydmVyIHlvdSBtdXN0IGZpbGwgb3V0IHRoZSBjb25mIGRpcmVjdG9yeS4KLUNvcHkgdGhlICouY29uZi1kaXN0LXdpbiBmcm9tIHRoZSBkaXN0cmlidXRpb24gY29uZiBkaXJlY3RvcnkKLWFuZCByZW5hbWUgKi5jb25mLiAgRWRpdCB0aGUgQEBTZXJ2ZXJSb290QEAgZW50cmllcyB0byB5b3VyCi1hY3R1YWwgc2VydmVyIHJvb3QgKGZvciBleGFtcGxlICJDOlxhcGFjaGUiKS4gIENvcHkgb3ZlcgotdGhlIGNvbmYvbWFnaWMgYW5kIGNvbmYvbWltZS50eXBlcyBmaWxlcyBhcyB3ZWxsLgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvcGxhdGZvcm0vd2luZG93cy5odG1sIGIvZG9jcy9tYW51YWwvcGxhdGZvcm0vd2luZG93cy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mzg4OWNhLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL3BsYXRmb3JtL3dpbmRvd3MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPlVzaW5nIEFwYWNoZSB3aXRoIE1pY3Jvc29mdCBXaW5kb3dzPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci0KLTxIMSBBTElHTj0iQ0VOVEVSIj5Vc2luZyBBcGFjaGUgV2l0aCBNaWNyb3NvZnQgV2luZG93czwvSDE+Ci0KLTxwPlRoaXMgZG9jdW1lbnQgZXhwbGFpbnMgaG93IHRvIGNvbXBpbGUsIGluc3RhbGwsIGNvbmZpZ3VyZSBhbmQgcnVuCi0gICBBcGFjaGUgMS4zYTEgKG9yIGxhdGVyKSB1bmRlciBNaWNyb3NvZnQgV2luZG93cy4gUGxlYXNlIG5vdGUgdGhhdCBhdAotICAgdGhpcyB0aW1lLCBXaW5kb3dzIHN1cHBvcnQgaXMgZW50aXJlbHkgZXhwZXJpbWVudGFsLCBhbmQgaXMKLSAgIHJlY29tbWVuZGVkIG9ubHkgZm9yIGV4cGVyaWVuY2VkIHVzZXJzLiBUaGUgQXBhY2hlIEdyb3VwIGRvZXMgbm90Ci0gICBndWFyYW50ZWUgdGhhdCB0aGlzIHNvZnR3YXJlIHdpbGwgd29yayBhcyBkb2N1bWVudGVkLCBvciBldmVuIGF0Ci0gICBhbGwuIElmIHlvdSBmaW5kIGFueSBidWdzLCBvciB3aXNoIHRvIGNvbnRyaWJ1dGUgaW4gb3RoZXIgd2F5cywgcGxlYXNlCi0gICB1c2Ugb3VyIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9idWdfcmVwb3J0Lmh0bWwiPmJ1ZyByZXBvcnRpbmcKLSAgIHBhZ2UuPC9hPjwvcD4KLQotPGhyPgotCi08dWw+Ci0gIDxsaT48YSBocmVmPSIjcmVxIj5SZXF1aXJlbWVudHM8L2E+Ci0gIDxsaT48YSBocmVmPSIjZG93biI+RG93bmxvYWRpbmcgQXBhY2hlIGZvciBXaW5kb3dzPC9hPgotICA8bGk+PGEgaHJlZj0iI2NvbXAiPkNvbXBpbGluZyBBcGFjaGUgZm9yIFdpbmRvd3M8L2E+Ci0gIDxsaT48YSBocmVmPSIjaW5zdCI+SW5zdGFsbGluZyBBcGFjaGUgZm9yIFdpbmRvd3M8L2E+Ci0gIDxsaT48YSBocmVmPSIjdXNlIj5Vc2luZyBBcGFjaGUgZm9yIFdpbmRvd3M8L2E+Ci08L3VsPgotCi08aHI+Ci0KLTxoMj48YSBuYW1lPSJyZXEiPlJlcXVpcmVtZW50czwvYT48L2gyPgotCi08cD5BcGFjaGUgMS4zYTEgcmVxdWlyZXMgdGhlIGZvbGxvd2luZzo8L3A+Ci0KLTx1bD4KLSAgPGxpPk1pY3Jvc29mdCBXaW5kb3dzIE5UIDQuMDxhIGhyZWY9IiMzNTEiPio8L2E+LCBvciBXaW5kb3dzIDk1LgotICA8bGk+QW4gSW50ZWwtYmFzZWQgUEMtY29tcGF0aWJsZSBjYXBhYmxlIG9mIHJ1bm5pbmcgYWJvdmUgT1MgKGV4YWN0Ci0gICAgICByZXF1aXJlbWVudHMgdW5rbm93bikgd2l0aCBhIGNvbm5lY3Rpb24gdG8gYSBUQ1AvSVAgbmV0d29yay4KLSAgPGxpPk1pY3Jvc29mdCBWaXN1YWwgQysrIDUuMCBvciBsYXRlci4KLTwvdWw+Ci0KLTxwPjxzbWFsbD48YSBuYW1lPSIzNTEiPio8L2E+IEFwYWNoZSBtYXkgcnVuIHdpdGggV2luZG93cyBOVCAzLjUuMSwgYnV0Ci0gICBoYXMgbm90IGJlZW4gdGVzdGVkLjwvc21hbGw+PC9wPgotCi08cD5BcGFjaGUgMS4zYTEgaXMgYXZhaWxhYmxlIG9ubHkgaW4gc291cmNlIGZvcm0uIEZ1dHVyZSByZWxlYXNlcyB3aWxsCi0gICBjb250YWluIHByZWJ1aWx0IGJpbmFyaWVzIGZvciB1c2UgYnkgdGhvc2Ugd2l0aG91dCBjb21waWxlcnMgKHdoaWNoIHdlCi0gICB1bmRlcnN0YW5kIGFyZSB0aGUgdmFzdCBtYWpvcml0eSBvZiBXaW5kb3dzIHVzZXJzKSwgaG93ZXZlciB0aGUKLSAgIGN1cnJlbnQgcmVsZWFzZSByZXF1aXJlcyBNaWNyb3NvZnQgVmlzdWFsIEMrKyA1LjAgb3IgbGF0ZXIuIFRoZSBBcGFjaGUKLSAgIEdyb3VwIGlzIHJlbGVhc2luZyAxLjNhMSBvbmx5IGFzIHNvdXJjZSB0byBsaW1pdCB0aGUgYWxwaGEgcmVsZWFzZSB0bwotICAgdGhvc2Ugd2hvIGhhdmUgdGhlIHRvb2xzIGFuZCBrbm93bGVkZ2UgdG8gYXNzaXN0IHdpdGggdGhlIGRldmVsb3BtZW50Ci0gICBwcm9jZXNzZXMuPC9wPgotCi08cD5UaGlzIGRvY3VtZW50YXRpb24gYXNzdW1lcyBnb29kIHdvcmtpbmcga25vd2xlZGdlIG9mIE1pY3Jvc29mdAotICAgV2luZG93cywgTWljcm9zb2Z0IFZpc3VhbCBDKyssIGFuZCB0aGUgQXBhY2hlIHdlYiBzZXJ2ZXIgKGZvcgotICAgVW5peCkuPC9wPgotCi08SDI+PGEgbmFtZT0iZG93biI+RG93bmxvYWRpbmcgQXBhY2hlIGZvciBXaW5kb3dzPC9hPjwvSDI+Ci0KLTxwPkluZm9ybWF0aW9uIG9uIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBBcGFjaGUgY2FuIGJlIGZvdW5kIG9uIHRoZSBBcGFjaGUKLXdlYiBzZXJ2ZXIgYXQgPEEKLUhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L0E+LiAgVGhpcyB3aWxsCi1saXN0IHRoZSBjdXJyZW50IHJlbGVhc2UsIGFueSBtb3JlIHJlY2VudCBhbHBoYSBvciBiZXRhLXRlc3QgcmVsZWFzZSwKLXRvZ2V0aGVyIHdpdGggZGV0YWlscyBvZiBtaXJyb3Igd2ViIGFuZCBhbm9ueW1vdXMgZnRwIHNpdGVzLjwvcD4KLQotPHA+WW91IHdpbGwgYmUgYWJsZSB0byBkb3dubG9hZCBBcGFjaGUgMS4zYTEgb3IgYSBsYXRlciByZWxlYXNlIGluCi0gICBzZXZlcmFsIGZvcm1zLCBpbmNsdWRpbmcgYSBXaW5aaXAgKDxjb2RlPi56aXA8L2NvZGU+KQotICAgYXJjaGl2ZS4gQWx0aG91Z2ggdGhpcyBjb250YWlucyB0aGUgc2FtZSBmaWxlcyBhcyB0aGUgb3RoZXJzIChsaWtlbHkKLSAgIDxjb2RlPi50YXIuZ3o8L2NvZGU+IGFuZCA8Y29kZT4udGFyLlo8L2NvZGU+KSwgaXQgaXMgcmVjb21tZW5kZWQgZm9yCi0gICBXaW5kb3dzIHVzZSwgYXMgYWxsIHRoZSBmaWxlcyBjb250YWluZWQgdGhlcmVpbiB3aWxsIGNvbnRhaW4gV2luZG93cwotICAgbGluZSBicmVha3MuIFRoZSBvdGhlciBhcmNoaXZlcyBtYXkgY29udGFpbiBmaWxlcyB3aXRoIFVuaXggbGluZQotICAgYnJlYWtzLCB3aGljaCB3aWxsIG5vdCBmdW5jdGlvbiBvbiBXaW5kb3dzIChhbHRob3VnaCB0aGV5IG1heSkuPC9wPgotCi08aDI+PGEgbmFtZT0iY29tcCI+Q29tcGlsaW5nIEFwYWNoZSBmb3IgV2luZG93czwvYT48L2gyPgotCi08cD5Db21waWxpbmcgQXBhY2hlIHJlcXVpcmVzIE1pY3Jvc29mdCBWaXN1YWwgQysrIDUuMCB0byBiZSBwcm9wZXJseQotICAgaW5zdGFsbGVkLiBJdCBpcyBlYXNpZXN0IHRvIGNvbXBpbGUgd2l0aCB0aGUgY29tbWFuZC1saW5lIHRvb2xzCi0gICAobm1ha2UsIGV0Yy4uLikuIENvbnN1bHQgdGhlIFZDKysgbWFudWFsIHRvIGRldGVybWluZSBob3cgdG8gaW5zdGFsbAotICAgdGhlbS48L3A+Ci0KLTxwPkZpcnN0LCB1bnBhY2sgdGhlIEFwYWNoZSBkaXN0cmlidXRpb24gaW50byBhbiBhcHByb3ByaWF0ZQotICAgZGlyZWN0b3J5LiBPcGVuIGEgY29tbWFuZC1saW5lIHByb21wdCwgYW5kIGNoYW5nZSB0byB0aGUKLSAgIDxjb2RlPnNyYzwvY29kZT4gc3ViZGlyZWN0b3J5IG9mIHRoZSBBcGFjaGUgZGlzdHJpYnV0aW9uLjwvcD4KLQotPHA+VGhlIG1hc3RlciBBcGFjaGUgbWFrZWZpbGUgaW5zdHJ1Y3Rpb25zIGFyZSBjb250YWluZWQgaW4gdGhlCi0gICA8Y29kZT5NYWtlZmlsZS5udDwvY29kZT4gZmlsZS4gVG8gY29tcGlsZSBBcGFjaGUsIHNpbXBseSB1c2Ugb25lIG9mCi0gICB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgotPHVsPgotPGxpPjxjb2RlPm5tYWtlIC9mIE1ha2VmaWxlLm50IHJlbGVhc2U8L2NvZGU+Ci08bGk+PGNvZGU+bm1ha2UgL2YgTWFrZWZpbGUubnQgZGVidWc8L2NvZGU+Ci08L3VsPgotCi08cD5UaGVzZSB3aWxsIGJvdGggY29tcGlsZSBBcGFjaGUuIFRoZSBsYXR0ZXIgd2lsbCBpbmNsdWRlIGRlYnVnZ2luZwotICAgaW5mb3JtYXRpb24gaW4gdGhlIHJlc3VsdGluZyBmaWxlcywgbWFraW5nIGl0IGVhc2llciB0byBmaW5kIGJ1Z3MgYW5kCi0gICB0cmFjayBkb3duIHByb2JsZW1zLjwvcD4KLQotPHA+QXBhY2hlIGNhbiBhbHNvIGJlIGNvbXBpbGVkIHVzaW5nIFZDKysncyBWaXN1YWwgU3R1ZGlvIGRldmVsb3BtZW50Ci0gICBlbnZpcm9ubWVudC4gQWx0aG91Z2ggY29tcGlsaW5nIEFwYWNoZSBpbiB0aGlzIG1hbm5lciBpcyBub3QgYXMgc2ltcGxlLAotICAgaXQgbWFrZXMgaXQgcG9zc2libGUgdG8gZWFzaWx5IG1vZGlmeSB0aGUgQXBhY2hlIHNvdXJjZSwgb3IgdG8gY29tcGlsZQotICAgQXBhY2hlIGlmIHRoZSBjb21tYW5kLWxpbmUgdG9vbHMgYXJlIG5vdCBpbnN0YWxsZWQuPC9wPgotCi08cD5Qcm9qZWN0IGZpbGVzICg8Y29kZT4uRFNQPC9jb2RlPikgYXJlIGluY2x1ZGVkIGZvciBlYWNoIG9mIHRoZQotICAgcG9ydGlvbnMgb2YgQXBhY2hlLiBUaGUgdHdvIHByb2plY3RzIHRoYXQgYXJlIG5lY2Vzc2FyeSBmb3IgQXBhY2hlIHRvCi0gICBydW4gYXJlIDxjb2RlPkFwYWNoZS5kc3A8L2NvZGU+IGFuZCA8Y29kZT5BcGFjaGVDb3JlLmRzcDwvY29kZT4uIFRoZQotICAgPGNvZGU+c3JjXG50PC9jb2RlPiBzdWJkaXJlY3RvcnkgYWxzbyBjb250YWlucyBwcm9qZWN0IGZpbGVzIGZvciB0aGUKLSAgIG9wdGlvbmFsIG1vZHVsZXMgKHNlZSBiZWxvdykuPC9wPgotCi08aDI+PGEgbmFtZT0iaW5zdCI+SW5zdGFsbGluZyBBcGFjaGUgZm9yIFdpbmRvd3M8L2E+PC9oMj4KLQotPHA+T25jZSBBcGFjaGUgaGFzIGJlZW4gY29tcGlsZWQsIGl0IG5lZWRzIHRvIGJlIGluc3RhbGxlZCBpbiBpdHMgc2VydmVyCi0gICByb290IGRpcmVjdG9yeS4gVGhlIGhhcmQtY29kZWQgZGVmYXVsdCBpcyB0aGUgPGNvZGU+XEFwYWNoZTwvY29kZT4KLSAgIGRpcmVjdG9yeSwgb24gdGhlIGN1cnJlbnQgaGFyZCBkcml2ZS4gQW5vdGhlciBkaXJlY3RvcnkgbWF5IGJlIHVzZWQsCi0gICBidXQgdGhlIGZpbGVzIHdpbGwgbmVlZCB0byBiZSBpbnN0YWxsZWQgbWFudWFsbHkuPC9wPgotCi08cD5UbyBpbnN0YWxsIHRoZSBmaWxlcyBpbnRvIHRoZSA8L2NvZGU+XEFwYWNoZTwvY29kZT4gZGlyZWN0b3J5Ci0gICBhdXRvbWF0aWNhbGx5LCB1c2Ugb25lIHRoZSBmb2xsb3dpbmcgbm1ha2UgY29tbWFuZHMgKHNlZSBhYm92ZSk6PC9wPgotPHVsPgotPGxpPjxjb2RlPm5tYWtlIC9mIE1ha2VmaWxlLm50IGluc3RhbGxyPC9jb2RlPiAoZm9yIHJlbGVhc2UgYnVpbGQpCi08bGk+PGNvZGU+bm1ha2UgL2YgTWFrZWZpbGUubnQgaW5zdGFsbGQ8L2NvZGU+IChmb3IgZGVidWcgYnVpbGQpCi08L3VsPgotCi08cD5UaGlzIHdpbGwgaW5zdGFsbCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPHVsPgotICA8bGk+PGNvZGU+XEFwYWNoZVxBcGFjaGUuZXhlPC9jb2RlPiAtIEFwYWNoZSBleGVjdXRhYmxlCi0gIDxsaT48Y29kZT5cQXBhY2hlXEFwYWNoZUNvcmUuZGxsPC9jb2RlPiAtIE1haW4gQXBhY2hlIHNoYXJlZCBsaWJyYXJ5Ci0gIDxsaT48Y29kZT5cQXBhY2hlXG1vZHVsZXNcQXBhY2hlTW9kdWxlKi5kbGw8L2NvZGU+IC0gT3B0aW9uYWwgQXBhY2hlCi0gICAgICBtb2R1bGVzICg3IGZpbGVzKQotICA8bGk+PGNvZGU+XEFwYWNoZVxjb25mPC9jb2RlPiAtIEVtcHR5IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5Ci0gIDxsaT48Y29kZT5cQXBhY2hlXGxvZ3M8L2NvZGU+IC0gRW1wdHkgbG9nZ2luZyBkaXJlY3RvcnkKLTwvdWw+Ci0KLTxwPklmIHlvdSBkbyBub3QgaGF2ZSBubWFrZSwgb3Igd2lzaCB0byBpbnN0YWxsIGluIGEgZGlmZmVyZW50IGRpcmVjdG9yeSwKLSAgIGJlIHN1cmUgdG8gdXNlIGEgc2ltaWxhciBuYW1pbmcgc2NoZW1lLjwvcD4KLQotPGgyPjxhIG5hbWU9InVzZSI+VXNpbmcgQXBhY2hlIGZvciBXaW5kb3dzPC9hPjwvaDI+Ci0KLTxwPlRoZSBmaXJzdCBzdGVwIGlzIHRvIHNldCB1cCBBcGFjaGUncyBjb25maWd1cmF0aW9uIGZpbGVzLiBEZWZhdWx0Ci0gICBjb25maWd1cmF0aW9uIGZpbGVzIGZvciBXaW5kb3dzIGFyZSBsb2NhdGVkIGluIHRoZSA8Y29kZT5jb25mPC9jb2RlPgotICAgc3ViZGlyZWN0b3J5IGluIHRoZSBBcGFjaGUgZGlzdHJpYnV0aW9uLCBhbmQgYXJlIG5hbWVkCi0gICA8Y29kZT5odHRwZC5jb25mLWRpc3Qtd2luPC9jb2RlPiwgPGNvZGU+YWNjZXNzLmNvbmYtZGlzdC13aW48L2NvZGU+Ci0gICBhbmQgPGNvZGU+c3JtLmNvbmYtZGlzdC13aW48L2NvZGU+LiBNb3ZlIHRoZXNlIGludG8KLSAgIDxjb2RlPlxBcGFjaGVcY29uZjwvY29kZT4sIGFuZCByZW5hbWUgdGhlbSA8Y29kZT5odHRwZC5jb25mPC9jb2RlPiwKLSAgIDxjb2RlPmFjY2Vzcy5jb25mPC9jb2RlPiBhbmQgPGNvZGU+c3JtLmNvbmY8L2NvZGU+LCByZXNwZWN0aXZlbHkuPC9wPgotCi08cD5Db25maWd1cmluZyBBcGFjaGUgaXMgbmVhcmx5IGlkZW50aWNhbCB0byB0aGUgVW5peCB2ZXJzaW9uIG9mIEFwYWNoZSwKLSAgIHNvIG1vc3Qgb2YgdGhlIHN0YW5kYXJkIDxhIGhyZWY9Ii4vIj5BcGFjaGUgZG9jdW1lbnRhdGlvbjwvYT4gaXMKLSAgIGFwcGxpY2FibGUuIEEgZmV3IHRoaW5ncyBhcmUsIGhvd2V2ZXIsIGRpZmZlcmVudDo8L3A+Ci0KLTx1bD4KLSAgPGxpPjxwPkJlY2F1c2UgQXBhY2hlIGZvciBXaW5kb3dzIGlzIG11bHRpdGhyZWFkZWQsIGl0IGRvZXMgbm90IHVzZSBhCi0gICAgICBzZXBhcmF0ZSBwcm9jZXNzIGZvciBlYWNoIHJlcXVlc3QsIGFzIEFwYWNoZSBkb2VzIHdpdGgKLSAgICAgIFVuaXguIFRoZXJlZm9yZSwgdGhlICJwcm9jZXNzIi1tYW5hZ2VtZW50IGRpcmVjdGl2ZXMgYXJlIGRpZmZlcmVudDoKLSAgICAgIDxwPjxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjc3RhcnRzZXJ2ZXJzIj5TdGFydFNlcnZlcnM8L2E+IC0gVGhpcwotICAgICAgICAgdGVsbHMgdGhlIHNlcnZlciBob3cgbWFueSBwcm9jZXNzZXMgdG8gdXNlLiBVbmxpa2UgVW5peCwgdGhlcmUKLSAgICAgICAgIHdpbGwgbmV2ZXIgYmUgbW9yZSB0aGFuIHRoaXMgbnVtYmVyLCBhbmQgb25seSBvbmUgd2lsbCBiZSB1c2VkCi0gICAgICAgICBhdCBhIHRpbWUgKHRoZSBvdGhlcnMgd2lsbCBiZSBoZWxkIGluIHJlc2VydmUgaW4gY2FzZSB0aGUgbWFpbgotICAgICAgICAgcHJvY2Vzc2VzIGNyYXNoZXMgb3Igb3RoZXJ3aXNlIGRpZXMpLiBUaGUgcmVjb21tZW5kZWQgZGVmYXVsdCBpcwotICAgICAgICAgPGNvZGU+U3RhcnRTZXJ2ZXJzIDM8L2NvZGU+LgotICAgICAgPHA+PGEKLSAgICAgICAgIGhyZWY9Im1vZC9jb3JlLmh0bWwjbWF4cmVxdWVzdHNwZXJjaGlsZCI+TWF4UmVxdWVzdHNQZXJDaGlsZDwvYT4KLSAgICAgICAgIC0gTGlrZSB0aGUgVW5peCBkaXJlY3RpdmUsIHRoaXMgY29udHJvbHMgaG93IG1hbnkgcmVxdWVzdHMgYQotICAgICAgICAgICBwcm9jZXNzIHdpbGwgc2VydmUgYmVmb3JlIGV4aXRpbmcuIEhvd2V2ZXIsIHVubGlrZSBVbml4LCBhCi0gICAgICAgICAgIHByb2Nlc3Mgc2VydmVzIGFsbCB0aGUgcmVxdWVzdHMgYXQgb25jZSwgbm90IGp1c3Qgb25lLCBzbyBpZgotICAgICAgICAgICB0aGlzIGlzIHNldCwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCBhIHZlcnkgaGlnaCBudW1iZXIgaXMKLSAgICAgICAgICAgdXNlZC4gVGhlIHJlY29tbWVuZGVkIGRlZmF1bHQsIDxjb2RlPk1heFJlcXVlc3RzUGVyQ2hpbGQKLSAgICAgICAgICAgMDwvY29kZT4sIGRvZXMgbm90IGNhdXNlIHRoZSBwcm9jZXNzIHRvIGV2ZXIgZXhpdC4KLSAgICAgIDxwPjxhIGhyZWY9Im1vZGUvY29yZS5odG1sI3RocmVhZHNwZXJjaGlsZCI+VGhyZWFkc1BlckNoaWxkPC9hPiAtCi0gICAgICAgICBUaGlzIGRpcmVjdGl2ZSBpcyBuZXcsIGFuZCB0ZWxscyB0aGUgc2VydmVyIGhvdyBtYW55IHRocmVhZHMgaXQKLSAgICAgICAgIHNob3VsZCB1c2UuIFRoaXMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoZSBzZXJ2ZXIKLSAgICAgICAgIGNhbiBoYW5kbGUgYXQgb25jZTsgYmUgc3VyZSBhbmQgc2V0IHRoaXMgbnVtYmVyIGhpZ2ggZW5vdWdoIGZvcgotICAgICAgICAgeW91ciBzaXRlIGlmIHlvdSBnZXQgYSBsb3Qgb2YgaGl0cy4gVGhlIHJlY29tbWVuZGVkIGRlZmF1bHQgaXMKLSAgICAgICAgIDxjb2RlPlRocmVhZHNQZXJDaGlsZCAyMDwvY29kZT4uPC9wPgotICA8bGk+PHA+VGhlIGRpcmVjdGl2ZXMgdGhhdCBhY2NlcHQgZmlsZW5hbWVzIGFzIGFyZ3VtZW50cyBub3cgbXVzdCB1c2UKLSAgICAgIFdpbmRvd3MgZmlsZW5hbWVzIGluc3RlYWQgb2YgVW5peCBvbmVzLiBIb3dldmVyLCBiZWNhdXNlIEFwYWNoZQotICAgICAgdXNlcyBVbml4LXN0eWxlIG5hbWVzIGludGVybmFsbHksIHlvdSBtdXN0IHVzZSBmb3J3YXJkIHNsYXNoZXMsIG5vdAotICAgICAgYmFja3NsYXNoZXMuIERyaXZlIGxldHRlcnMgY2FuIGJlIHVzZWQ7IGlmIG9taXR0ZWQsIHRoZSBkcml2ZSB3aXRoCi0gICAgICB0aGUgQXBhY2hlIGV4ZWN1dGFibGUgd2lsbCBiZSBhc3N1bWVkLjwvcD4KLSAgPGxpPjxwPkFwYWNoZSBmb3IgV2luZG93cyBjb250YWlucyB0aGUgYWJpbGl0eSB0byBsb2FkIG1vZHVsZXMgYXQgcnVudGltZSwKLSAgICAgIHdpdGhvdXQgcmVjb21waWxpbmcgdGhlIHNlcnZlci4gSWYgQXBhY2hlIGlzIGNvbXBpbGVkIG5vcm1hbGx5LCBpdAotICAgICAgd2lsbCBpbnN0YWxsIGEgbnVtYmVyIG9mIG9wdGlvbmFsIG1vZHVsZXMgaW4gdGhlCi0gICAgICA8Y29kZT5cQXBhY2hlXG1vZHVsZXM8L2NvZGU+IGRpcmVjdG9yeS4gVG8gYWN0aXZhdGUgdGhlc2UsIG9yIG90aGVyCi0gICAgICBtb2R1bGVzLCB0aGUgbmV3IDxhIGhyZWY9Im1vZC9tb2RfZGxsLmh0bWwjbG9hZG1vZHVsZSI+TG9hZE1vZHVsZTwvYT4KLSAgICAgIGRpcmVjdGl2ZSBtdXN0IGJlIHVzZWQuIEZvciBleGFtcGxlLCB0byBhY3RpdmUgdGhlIHN0YXR1cyBtb2R1bGUsCi0gICAgICB1c2UgdGhlIGZvbGxvd2luZyAoaW4gYWRkaXRpb24gdG8gdGhlIHN0YXR1cy1hY3RpdmF0aW5nIGRpcmVjdGl2ZXMKLSAgICAgIGluIDxjb2RlPmFjY2Vzcy5jb25mPC9jb2RlPik6PC9wPgotPHByZT4KLSAgICBMb2FkTW9kdWxlIHN0YXR1c19tb2R1bGUgbW9kdWxlcy9BcGFjaGVNb2R1bGVTdGF0dXMuZGxsCi08L3ByZT4KLSAgICAgIDxwPkluZm9ybWF0aW9uIG9uIDxhIGhyZWY9Im1vZC9tb2RfZGxsLmh0bWwjY3JlYXRpbmciPmNyZWF0aW5nIG1vZHVsZQotICAgICAgICAgRExMczwvYT4gaXMgYWxzbyBhdmFpbGFibGUuPC9wPgotPC91bD4KLQotPHA+T25jZSBBcGFjaGUgaXMgY29uZmlndXJlZCBjb3JyZWN0bHksIGl0IGlzIG5lYXJseSByZWFkeSB0byBiZQotcnVuLiBIb3dldmVyLCB3ZSByZWNvbW1lbmQgeW91IGNvcHkgdGhlIDxjb2RlPmljb25zPC9jb2RlPiBhbmQKLTxjb2RlPmh0ZG9jczwvY29kZT4gc3ViZGlyZWN0b3JpZXMgZnJvbSB0aGUgQXBhY2hlIGRpc3RyaWJ1dGlvbiB0bwotPGNvZGU+XEFwYWNoZTwvY29kZT4uIFRoZSBsYXR0ZXIgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQsIGFzIGl0IGNvbnRhaW5zCi10aGUgZG9jdW1lbnQgcm9vdCAod2hhdCB0aGUgc2VydmVyIGFjdHVhbGx5IHNlcnZlcykuCi0KLTxwPkFwYWNoZSBjYW4gYmUgZXhlY3V0ZWQgaW4gb25lIG9mIHR3byB3YXlzLCBkaXJlY3RseSBmcm9tIHRoZSBjb21tYW5kCi0gICBsaW5lLCBvciBhcyBhIFdpbmRvd3MgTlQgc2VydmljZS4gVG8gcnVuIGl0IGZyb20gdGhlIGNvbW1hbmQgbGluZSwgdXNlCi0gICB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6Ci08cHJlPgotICAgIEM6XEFwYWNoZT4gPGI+YXBhY2hlIC1zPC9iPgotPC9wcmU+Ci0KLTxwPkFwYWNoZSB3aWxsIHRoZW4gZXhlY3V0ZSwgYW5kIHdpbGwgcmVtYWluIHJ1bm5pbmcgdW50aWwgaXQgaXMKLSAgIGV4aXRlZC4gVG8gdXNlIEFwYWNoZSBhcyBhIFdpbmRvd3MgTlQgc2VydmljZSwgdXNlIHRoZSBmb2xsb3dpbmc6PC9wPgotPHByZT4KLSAgICBDOlxBcGFjaGU+IDxiPmFwYWNoZSAtaTwvYj4KLTwvcHJlPgotPHA+VGhlbiBvcGVuIHRoZSBTZXJ2aWNlcyBjb250cm9sIHBhbmVsLCBhbmQgc3RhcnQgdGhlIEFwYWNoZSBzZXJ2aWNlLjwvcD4KLQotPHA+SWYgeW91IGluc3RhbGxlZCBBcGFjaGUgaW4gYSBzZXJ2ZXIgcm9vdCBvdGhlciB0aGFuCi0gICA8Y29kZT5cQXBhY2hlPC9jb2RlPiwgeW91IG11c3QgdXNlIHRoZSA8Y29kZT4tZjwvY29kZT4gY29tbWFuZC1saW5lCi0gICBvcHRpb24gdG8gc3BlY2lmeSB0aGUgaHR0cGQuY29uZiBmaWxlLCBvciB0aGUgPGNvZGU+LWQ8L2NvZGU+IG9wdGlvbgotICAgdG8gc3BlY2lmeSB0aGUgc2VydmVyIHJvb3QuPC9wPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvcHJvZ3JhbXMvYWIuaHRtbCBiL2RvY3MvbWFudWFsL3Byb2dyYW1zL2FiLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYzIyMjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvcHJvZ3JhbXMvYWIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD48SEVBRD48VElUTEU+TWFudWFsIFBhZ2U6IGFiICAtIEFwYWNoZSBIVFRQIFNlcnZlcjwvVElUTEU+PC9IRUFEPgotPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgVEVYVD0iIzAwMDAwMCIgTElOSz0iIzAwMDBGRiIKLVZMSU5LPSIjMDAwMDgwIiBBTElOSz0iI0ZGMDAwMCI+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPCEtLSBUaGlzIGRvY3VtZW50IHdhcyBhdXRvZ2VuZXJhdGVkIGZyb20gdGhlIG1hbiBwYWdlIC0tPgotPHByZT4KLTxzdHJvbmc+TkFNRTwvc3Ryb25nPgotICAgICBhYiAtIEFwYWNoZSBIVFRQIHNlcnZlciBiZW5jaG1hcmtpbmcgdG9vbAotCi08c3Ryb25nPlNZTk9QU0lTPC9zdHJvbmc+Ci0gICAgIDxzdHJvbmc+YWIgPC9zdHJvbmc+WyAtPHN0cm9uZz5rIDwvc3Ryb25nPl0gWyAtPHN0cm9uZz5uIDwvc3Ryb25nPjxlbT5yZXF1ZXN0cyA8L2VtPl0gWyAtPHN0cm9uZz50IDwvc3Ryb25nPjxlbT50aW1lbGltaXQgPC9lbT5dIFsgLTxzdHJvbmc+YyAgPC9zdHJvbmc+PGVtPmNvbmN1cnJlbmN5PC9lbT4KLSAgICAgXSAgWyAgLTxzdHJvbmc+cCA8L3N0cm9uZz48ZW0+UE9TVCBmaWxlIDwvZW0+XSBbIC08c3Ryb25nPkEgPC9zdHJvbmc+PGVtPkF1dGhlbnRpY2F0ZSB1c2VybmFtZTwvZW0+OjxlbT5wYXNzd29yZCA8L2VtPl0gWwotICAgICAtPHN0cm9uZz5QIDwvc3Ryb25nPjxlbT5Qcm94eSBBdXRoZW50aWNhdGUgdXNlcm5hbWU8L2VtPjo8ZW0+cGFzc3dvcmQgPC9lbT5dIFsgLTxzdHJvbmc+SCA8L3N0cm9uZz48ZW0+Q3VzdG9tIGhlYWRlcjwvZW0+Ci0gICAgIF0gIFsgLTxzdHJvbmc+QyA8L3N0cm9uZz48ZW0+Q29va2llIG5hbWU8L2VtPj08ZW0+dmFsdWUgPC9lbT5dIFsgLTxzdHJvbmc+VCA8L3N0cm9uZz48ZW0+Y29udGVudDwvZW0+LTxlbT50eXBlIDwvZW0+XSBbIC08c3Ryb25nPnYgPC9zdHJvbmc+PGVtPnZlcmJvcy08L2VtPgotICAgICA8ZW0+aXR5IDwvZW0+XSBdIFsgLTxzdHJvbmc+dyA8L3N0cm9uZz48ZW0+b3V0cHV0IEhUTUwgPC9lbT5dIF0gWyAtPHN0cm9uZz54IDwvc3Ryb25nPiZsdDs8ZW0+dGFibGU8L2VtPiZndDsgPGVtPmF0dHJpYnV0ZXMgPC9lbT5dICBdICBbCi0gICAgIC08c3Ryb25nPnkgICA8L3N0cm9uZz4mbHQ7PGVtPnRyPC9lbT4mZ3Q7ICAgPGVtPmF0dHJpYnV0ZXMgICA8L2VtPl0gICBdICAgWyAgIC08c3Ryb25nPnogIDwvc3Ryb25nPiZsdDs8ZW0+dGQ8L2VtPiZndDsgIDxlbT5hdHRyaWJ1dGVzICA8L2VtPl0KLSAgICAgWzxlbT5odHRwPC9lbT46Ly9dPGVtPmhvc3RuYW1lPC9lbT5bOjxlbT5wb3J0PC9lbT5dLzxlbT5wYXRoPC9lbT4KLQotICAgICA8c3Ryb25nPmFiIDwvc3Ryb25nPlsgLTxzdHJvbmc+ViA8L3N0cm9uZz5dIFsgLTxzdHJvbmc+aCA8L3N0cm9uZz5dCi0KLTxzdHJvbmc+REVTQ1JJUFRJT048L3N0cm9uZz4KLSAgICAgPHN0cm9uZz5hYiA8L3N0cm9uZz5pcyBhIHRvb2wgZm9yIGJlbmNobWFya2luZyB5b3VyIEFwYWNoZSBIeXBlclRleHQgVHJhbnNmZXIKLSAgICAgUHJvdG9jb2wgIChIVFRQKSAgc2VydmVyLiAgSXQgIGlzICBkZXNpZ25lZCAgdG8gIGdpdmUgeW91IGFuCi0gICAgIGltcHJlc3Npb24gb24gaG93IHBlcmZvcm1hbnQgaXMgeW91ciBjdXJyZW50IEFwYWNoZSAgaW5zdGFsLQotICAgICBsYXRpb24uICAgVGhpcyAgZXNwZWNpYWxseSAgc2hvd3MgIHlvdSBob3cgbXVjaCByZXF1ZXN0cyBwZXIKLSAgICAgdGltZSB5b3VyIEFwYWNoZSBpbnN0YWxsYXRpb24gaXMgY2FwYWJsZSB0byBzZXJ2ZS4KLQotPHN0cm9uZz5PUFRJT05TPC9zdHJvbmc+Ci0gICAgIC08c3Ryb25nPmsgICAgICAgICAgPC9zdHJvbmc+RW5hYmxlIHRoZSBIVFRQIEtlZXBBbGl2ZSBmZWF0dXJlLCBpLmUuICBwZXJmb3JtCi0gICAgICAgICAgICAgICAgIG11bHRpcGxlICAgcmVxdWVzdHMgICB3aXRoaW4gIG9uZSAgSFRUUCAgc2Vzc2lvbgotICAgICAgICAgICAgICAgICBpbnN0ZWFkLiBEZWZhdWx0IGlzIG5vIEtlZXBBbGl2ZS4KLQotICAgICAtPHN0cm9uZz5uIDwvc3Ryb25nPjxlbT5yZXF1ZXN0cyA8L2VtPk51bWJlciBvZiByZXF1ZXN0cyB0byBwZXJmb3JtIGZvciB0aGUgYmVuY2htYXJrLQotICAgICAgICAgICAgICAgICBpbmcgc2Vzc2lvbi4gIFRoZSBkZWZhdWx0IGlzIHRvIGp1c3QgcGVyZm9ybSBvbmUKLSAgICAgICAgICAgICAgICAgc2luZ2xlIHJlcXVlc3Qgd2hpY2ggdXN1YWxseSBsZWFkcyB0byAgbm90ICB2ZXJ5Ci0gICAgICAgICAgICAgICAgIHJlcHJlc2VudGF0aXZlIGJlbmNobWFya2luZyByZXN1bHRzLgotCi0gICAgIC08c3Ryb25nPnQgPC9zdHJvbmc+PGVtPnRpbWVsaW1pdDwvZW0+Ci0gICAgICAgICAgICAgICAgIFNlY29uZHMgdG8gbWF4LiAgc3BlbmQgIGZvciAgYmVuY2htYXJraW5nLiAgVGhpcwotICAgICAgICAgICAgICAgICBpbXBsaWVzICBhICAtPHN0cm9uZz5uICA1MDAwMCAgPC9zdHJvbmc+aW50ZXJuYWxseS4gIFVzZSAgdGhpcyB0bwotICAgICAgICAgICAgICAgICBiZW5jaG1hcmsgdGhlIHNlcnZlciB3aXRoaW4gYSBmaXhlZCB0b3RhbCBhbW91bnQKLSAgICAgICAgICAgICAgICAgb2YgdGltZS4gIFBlciBkZWZhdWx0IHRoZXJlIGlzIG5vIHRpbWVsaW1pdC4KLQotICAgICAtPHN0cm9uZz5jIDwvc3Ryb25nPjxlbT5jb25jdXJyZW5jeTwvZW0+Ci0gICAgICAgICAgICAgICAgIE51bWJlciBvZiBtdWx0aXBsZSByZXF1ZXN0cyBwZXIgdGltZSB0byBwZXJmb3JtLgotICAgICAgICAgICAgICAgICBEZWZhdWx0IGlzIG9uZSByZXF1ZXN0IHBlciB0aW1lLgotCi0gICAgIC08c3Ryb25nPnAgPC9zdHJvbmc+PGVtPlBPU1QgZmlsZTwvZW0+Ci0gICAgICAgICAgICAgICAgIEZpbGUgY29udGFpbmluZyBkYXRhIHRvIFBPU1QuCi0KLSAgICAgLTxzdHJvbmc+QSA8L3N0cm9uZz48ZW0+QXV0aG9yaXphdGlvbiB1c2VybmFtZTwvZW0+OjxlbT5wYXNzd29yZDwvZW0+Ci0gICAgICAgICAgICAgICAgIFN1cHBseSBCQVNJQyBBdXRoZW50aWZpY2F0aW9uIGNyZWRlbnRpYWxzIHRvIHRoZQotICAgICAgICAgICAgICAgICBzZXJ2ZXIuICBUaGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGFyZSBzZXBhcmF0ZWQKLSAgICAgICAgICAgICAgICAgYnkgYSBzaW5nbGUgJzonIGFuZCBzZW5kIG9uIHRoZSB3aXJlICB1dWVuY29kZWQuCi0gICAgICAgICAgICAgICAgIFRoZSAgc3RyaW5nICBpcyAgc2VuZCAgcmVnYXJkbGVzcyAgb2Ygd2V0aGVyIHRoZQotICAgICAgICAgICAgICAgICBzZXJ2ZXIgIG5lZWRzICBpdDsgIChpLmUuICBoYXMgIHNlbmQgICBhbiAgIDQwMS4KLSAgICAgICAgICAgICAgICAgQXV0aGVudGlmY2F0aW9uIG5lZWRlZCkuCi0KLSAgICAgLTxzdHJvbmc+cCA8L3N0cm9uZz48ZW0+UHJveHk8L2VtPi08ZW0+QXV0aG9yaXphdGlvbiB1c2VybmFtZTwvZW0+OjxlbT5wYXNzd29yZDwvZW0+Ci0gICAgICAgICAgICAgICAgIFN1cHBseSBCQVNJQyBBdXRoZW50aWZpY2F0aW9uIGNyZWRlbnRpYWxzICB0byAgYQotICAgICAgICAgICAgICAgICBwcm94eSAgZW4tcm91dGUuICBUaGUgIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBhcmUKLSAgICAgICAgICAgICAgICAgc2VwYXJhdGVkIGJ5IGEgc2luZ2xlICc6JyBhbmQgc2VuZCBvbiAgdGhlICB3aXJlCi0gICAgICAgICAgICAgICAgIHV1ZW5jb2RlZC4gICBUaGUgIHN0cmluZyAgaXMgIHNlbmQgcmVnYXJkbGVzcyBvZgotICAgICAgICAgICAgICAgICB3ZXRoZXIgdGhlIHByb3h5IG5lZWRzIGl0OyAoaS5lLiBoYXMgc2VuZCBhbiA0MDcKLSAgICAgICAgICAgICAgICAgUHJveHkgYXV0aGVudGlmY2F0aW9uIG5lZWRlZCkuCi0KLSAgICAgLTxzdHJvbmc+QyA8L3N0cm9uZz48ZW0+Q29va2llIG5hbWU8L2VtPj08ZW0+dmFsdWU8L2VtPgotICAgICAgICAgICAgICAgICBBZGQgYSAnQ29va2llOicgbGluZSB0byB0aGUgcmVxdWVzdC4gIFRoZSAgYXJndS0KLSAgICAgICAgICAgICAgICAgbWVudCAgaXMgdHlwaWNhbGx5IGluIHRoZSBmb3JtIG9mIGEgJ25hbWU9dmFsdWUnCi0gICAgICAgICAgICAgICAgIHBhaXIuIFRoaXMgZmllbGQgaXMgcmVwZWF0YWJsZS4KLQotICAgICAtPHN0cm9uZz5wIDwvc3Ryb25nPjxlbT5IZWFkZXIgc3RyaW5nPC9lbT4KLSAgICAgICAgICAgICAgICAgUG9zdGZpeCBleHRyYSBoZWFkZXJzIHRvIHRoZSByZXF1ZXN0LiBUaGUgIGFyZ3UtCi0gICAgICAgICAgICAgICAgIG1lbnQgIGlzIHR5cGljYWxseSBpbiB0aGUgZm9ybSBvZiBhIHZhbGlkIGhlYWRlcgotICAgICAgICAgICAgICAgICBsaW5lOyBjb250YWluaW5nIGEgY29sb24gc2VwYXJhdGVkICBmaWVsZCAgdmFsdWUKLSAgICAgICAgICAgICAgICAgcGFpci4gKGkuZS4KLQotICAgICAtPHN0cm9uZz5UIDwvc3Ryb25nPjxlbT5jb250ZW50PC9lbT4tPGVtPnR5cGU8L2VtPgotICAgICAgICAgICAgICAgICBDb250ZW50LXR5cGUgaGVhZGVyIHRvIHVzZSBmb3IgUE9TVCBkYXRhLgotCi0gICAgIC08c3Ryb25nPnYgICAgICAgICAgPC9zdHJvbmc+U2V0IHZlcmJvc2l0eSBsZXZlbCAtIDQgYW5kIGFib3ZlIHByaW50cyAgaW5mb3ItCi0gICAgICAgICAgICAgICAgIG1hdGlvbiAgb24gIGhlYWRlcnMsIDMgYW5kIGFib3ZlIHByaW50cyByZXNwb25zZQotICAgICAgICAgICAgICAgICBjb2RlcyAoNDA0LCAyMDAsIGV0Yy4pLCAyIGFuZCBhYm92ZSBwcmludHMgd2Fybi0KLSAgICAgICAgICAgICAgICAgaW5ncyBhbmQgaW5mby4KLQotICAgICAtPHN0cm9uZz53ICAgICAgICAgIDwvc3Ryb25nPlByaW50IG91dCByZXN1bHRzIGluIEhUTUwgdGFibGVzLiAgRGVmYXVsdCB0YWJsZQotICAgICAgICAgICAgICAgICBpcyB0d28gY29sdW1ucyB3aWRlLCB3aXRoIGEgd2hpdGUgYmFja2dyb3VuZC4KLQotICAgICAtPHN0cm9uZz54IDwvc3Ryb25nPjxlbT5hdHRyaWJ1dGVzPC9lbT4KLSAgICAgICAgICAgICAgICAgU3RyaW5nIHRvIHVzZSBhcyBhdHRyaWJ1dGVzIGZvciAmbHQ7dGFibGUmZ3Q7LiAgQXR0cmktCi0gICAgICAgICAgICAgICAgIGJ1dGVzIGFyZSBpbnNlcnRlZCAmbHQ7dGFibGUgPHN0cm9uZz5oZXJlIDwvc3Ryb25nPiZndDsKLQotICAgICAtPHN0cm9uZz55IDwvc3Ryb25nPjxlbT5hdHRyaWJ1dGVzPC9lbT4KLSAgICAgICAgICAgICAgICAgU3RyaW5nIHRvIHVzZSBhcyBhdHRyaWJ1dGVzIGZvciAmbHQ7dHImZ3Q7LgotCi0gICAgIC08c3Ryb25nPnogPC9zdHJvbmc+PGVtPmF0dHJpYnV0ZXM8L2VtPgotICAgICAgICAgICAgICAgICBTdHJpbmcgdG8gdXNlIGFzIGF0dHJpYnV0ZXMgZm9yICZsdDt0ZCZndDsuCi0KLSAgICAgLTxzdHJvbmc+ViAgICAgICAgICA8L3N0cm9uZz5EaXNwbGF5IHZlcnNpb24gbnVtYmVyIGFuZCBleGl0LgotCi0gICAgIC08c3Ryb25nPmggICAgICAgICAgPC9zdHJvbmc+RGlzcGxheSB1c2FnZSBpbmZvcm1hdGlvbi4KLQotPHN0cm9uZz5CVUdTPC9zdHJvbmc+Ci0gICAgIFRoZXJlIGFyZSAgdmFyaW91cyAgc3RhdGljYWxseSAgZGVjbGFyZWQgIGJ1ZmZlcnMgIG9mICBmaXhlZAotICAgICBsZW5ndGguICBDb21iaW5lZCAgd2l0aCB0aGUgbGF6eSBwYXJzaW5nIG9mIHRoZSBjb21tYW5kIGxpbmUKLSAgICAgYXJndW1lbnRzLCB0aGUgcmVzcG9uc2UgaGVhZGVycyBmcm9tIHRoZSAgc2VydmVyICBhbmQgIG90aGVyCi0gICAgIGV4dGVybmFsIGlucHV0cyB0aGlzIG1pZ2h0IGJpdGUgeW91LgotCi0gICAgIEl0IGRvZXMgbm90IGltcGxlbWVudCAgSFRUUC8xLnggIGZ1bGx5OyAgb25seSAgYWNjZXB0cyAgc29tZQotICAgICAnZXhwZWN0ZWQnICBmb3JtcyAgb2YgIHJlc3BvbnNlcy4gIFRoZSAgcmF0aGVyICBoZWF2eSB1c2Ugb2YKLSAgICAgPHN0cm9uZz5zdHJzdHIoMykgPC9zdHJvbmc+c2hvd3MgdXAgdG9wIGluIHByb2ZpbGUsIHdoaWNoICBtaWdodCAgaW5kaWNhdGUgIGEKLSAgICAgcGVyZm9ybWFuY2UgIHByb2JsZW07ICBpLmUuIHlvdSB3b3VsZCBtZWFzdXJlIHRoZSA8c3Ryb25nPmFiIDwvc3Ryb25nPnBlcmZvci0KLSAgICAgbWFuY2UgcmF0aGVyIHRoYW4gdGhlIHNlcnZlcidzLgotCi08c3Ryb25nPlNFRSBBTFNPPC9zdHJvbmc+Ci0gICAgIDxzdHJvbmc+aHR0cGQoOCk8L3N0cm9uZz4KLQotPC9wcmU+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3Byb2dyYW1zL2FwYWNoZWN0bC5odG1sIGIvZG9jcy9tYW51YWwvcHJvZ3JhbXMvYXBhY2hlY3RsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNmE3MTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvcHJvZ3JhbXMvYXBhY2hlY3RsLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD48SEVBRD48VElUTEU+TWFudWFsIFBhZ2U6IGFwYWNoZWN0bCAgLSBBcGFjaGUgSFRUUCBTZXJ2ZXI8L1RJVExFPjwvSEVBRD4KLTxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFRFWFQ9IiMwMDAwMDAiIExJTks9IiMwMDAwRkYiCi1WTElOSz0iIzAwMDA4MCIgQUxJTks9IiNGRjAwMDAiPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTwhLS0gVGhpcyBkb2N1bWVudCB3YXMgYXV0b2dlbmVyYXRlZCBmcm9tIHRoZSBtYW4gcGFnZSAtLT4KLTxwcmU+Ci08c3Ryb25nPk5BTUU8L3N0cm9uZz4KLSAgICAgYXBhY2hlY3RsIC0gQXBhY2hlIEhUVFAgc2VydmVyIGNvbnRyb2wgaW50ZXJmYWNlCi0KLTxzdHJvbmc+U1lOT1BTSVM8L3N0cm9uZz4KLSAgICAgPHN0cm9uZz5hcGFjaGVjdGwgPC9zdHJvbmc+PGVtPmNvbW1hbmQgPC9lbT5bLi4uXQotCi08c3Ryb25nPkRFU0NSSVBUSU9OPC9zdHJvbmc+Ci0gICAgIDxzdHJvbmc+YXBhY2hlY3RsIDwvc3Ryb25nPmlzIGEgZnJvbnQgZW5kIHRvIHRoZSAgQXBhY2hlICBIeXBlclRleHQgIFRyYW5zZmVyCi0gICAgIFByb3RvY29sIChIVFRQKSBzZXJ2ZXIuICBJdCBpcyBkZXNpZ25lZCB0byBoZWxwIHRoZSBhZG1pbmlzLQotICAgICB0cmF0b3IgY29udHJvbCB0aGUgZnVuY3Rpb25pbmcgb2YgdGhlIEFwYWNoZSA8c3Ryb25nPmh0dHBkIDwvc3Ryb25nPmRhZW1vbi4KLQotICAgICA8c3Ryb25nPk5PVEU6IDwvc3Ryb25nPklmIHlvdXIgQXBhY2hlIGluc3RhbGxhdGlvbiB1c2VzICBub24tc3RhbmRhcmQgIHBhdGhzLAotICAgICB5b3UgIHdpbGwgIG5lZWQgIHRvICBlZGl0ICB0aGUgIDxzdHJvbmc+YXBhY2hlY3RsICA8L3N0cm9uZz5zY3JpcHQgdG8gc2V0IHRoZQotICAgICBhcHByb3ByaWF0ZSBwYXRocyB0byB5b3VyIFBJRCBmaWxlIGFuZCAgeW91ciAgPHN0cm9uZz5odHRwZCAgPC9zdHJvbmc+YmluYXJ5LgotICAgICBTZWUgdGhlIGNvbW1lbnRzIGluIHRoZSBzY3JpcHQgZm9yIGRldGFpbHMuCi0KLSAgICAgVGhlIDxzdHJvbmc+YXBhY2hlY3RsIDwvc3Ryb25nPnNjcmlwdCByZXR1cm5zIGEgMCBleGl0IHZhbHVlIG9uIHN1Y2Nlc3MsICBhbmQKLSAgICAgJmd0OzAgIGlmIGFuIGVycm9yIG9jY3Vycy4gIEZvciBtb3JlIGRldGFpbHMsIHZpZXcgdGhlIGNvbW1lbnRzCi0gICAgIGluIHRoZSBzY3JpcHQuCi0KLSAgICAgRnVsbCAgIGRvY3VtZW50YXRpb24gICBmb3IgICBBcGFjaGUgICAgaXMgICAgYXZhaWxhYmxlICAgIGF0Ci0gICAgIDxzdHJvbmc+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvc3Ryb25nPgotCi08c3Ryb25nPk9QVElPTlM8L3N0cm9uZz4KLSAgICAgVGhlIDxlbT5jb21tYW5kIDwvZW0+Y2FuIGJlIGFueSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6Ci0KLSAgICAgPHN0cm9uZz5zdGFydCAgICAgICA8L3N0cm9uZz5TdGFydCB0aGUgQXBhY2hlIGRhZW1vbi4gIEdpdmVzIGFuIGVycm9yICBpZiAgaXQKLSAgICAgICAgICAgICAgICAgaXMgYWxyZWFkeSBydW5uaW5nLgotCi0gICAgIDxzdHJvbmc+c3RvcCAgICAgICAgPC9zdHJvbmc+U3RvcHMgdGhlIEFwYWNoZSBkYWVtb24uCi0KLSAgICAgPHN0cm9uZz5yZXN0YXJ0ICAgICA8L3N0cm9uZz5SZXN0YXJ0cyB0aGUgIEFwYWNoZSAgZGFlbW9uICBieSAgc2VuZGluZyAgaXQgIGEKLSAgICAgICAgICAgICAgICAgU0lHSFVQLiAgIElmICB0aGUgIGRhZW1vbiAgaXMgbm90IHJ1bm5pbmcsIGl0IGlzCi0gICAgICAgICAgICAgICAgIHN0YXJ0ZWQuICBUaGlzIGNvbW1hbmQgYXV0b21hdGljYWxseSBjaGVja3MgIHRoZQotICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uICBmaWxlcyAgdmlhIDxzdHJvbmc+Y29uZmlndGVzdCA8L3N0cm9uZz5iZWZvcmUgaW5pLQotICAgICAgICAgICAgICAgICB0aWF0aW5nIHRoZSByZXN0YXJ0IHRvIG1ha2Ugc3VyZSBBcGFjaGUgIGRvZXNuJ3QKLSAgICAgICAgICAgICAgICAgZGllLgotCi0gICAgIDxzdHJvbmc+ZnVsbHN0YXR1cyAgPC9zdHJvbmc+RGlzcGxheXMgYSBmdWxsIHN0YXR1cyByZXBvcnQgIGZyb20gIDxzdHJvbmc+bW9kX3N0YXR1cy48L3N0cm9uZz4KLSAgICAgICAgICAgICAgICAgRm9yICB0aGlzICB0byAgd29yaywgeW91IG5lZWQgdG8gaGF2ZSBtb2Rfc3RhdHVzCi0gICAgICAgICAgICAgICAgIGVuYWJsZWQgb24geW91ciBzZXJ2ZXIgYW5kIGEgdGV4dC1iYXNlZCAgYnJvd3NlcgotICAgICAgICAgICAgICAgICBzdWNoICBhcyA8ZW0+bHlueCA8L2VtPmF2YWlsYWJsZSBvbiB5b3VyIHN5c3RlbS4gIFRoZSBVUkwKLSAgICAgICAgICAgICAgICAgdXNlZCB0byBhY2Nlc3MgdGhlIHN0YXR1cyByZXBvcnQgY2FuIGJlICBzZXQgIGJ5Ci0gICAgICAgICAgICAgICAgIGVkaXRpbmcgdGhlIDxzdHJvbmc+U1RBVFVTVVJMIDwvc3Ryb25nPnZhcmlhYmxlIGluIHRoZSBzY3JpcHQuCi0KLSAgICAgPHN0cm9uZz5zdGF0dXMgICAgICA8L3N0cm9uZz5EaXNwbGF5cyBhIGJyaWVmIHN0YXR1cyByZXBvcnQuICBTaW1pbGFyIHRvICB0aGUKLSAgICAgICAgICAgICAgICAgZnVsbHN0YXR1cyAgb3B0aW9uLCAgZXhjZXB0ICB0aGF0ICB0aGUgIGxpc3QgIG9mCi0gICAgICAgICAgICAgICAgIHJlcXVlc3RzIGN1cnJlbnRseSBiZWluZyBzZXJ2ZWQgaXMgb21pdHRlZC4KLQotICAgICA8c3Ryb25nPmdyYWNlZnVsICAgIDwvc3Ryb25nPkdyYWNlZnVsbHkgcmVzdGFydHMgdGhlIEFwYWNoZSBkYWVtb24gYnkgc2VuZGluZwotICAgICAgICAgICAgICAgICBpdCAgYSBTSUdVU1IxLiAgSWYgdGhlIGRhZW1vbiBpcyBub3QgcnVubmluZywgaXQKLSAgICAgICAgICAgICAgICAgaXMgc3RhcnRlZC4gIFRoaXMgZGlmZmVycyBmcm9tIGEgbm9ybWFsICByZXN0YXJ0Ci0gICAgICAgICAgICAgICAgIGluICB0aGF0ICBjdXJyZW50bHkgIG9wZW4gIGNvbm5lY3Rpb25zICBhcmUgIG5vdAotICAgICAgICAgICAgICAgICBhYm9ydGVkLiAgQSBzaWRlIGVmZmVjdCBpcyB0aGF0ICBvbGQgIGxvZyAgZmlsZXMKLSAgICAgICAgICAgICAgICAgd2lsbCBub3QgYmUgY2xvc2VkIGltbWVkaWF0ZWx5LiAgVGhpcyBtZWFucyB0aGF0Ci0gICAgICAgICAgICAgICAgIGlmIHVzZWQgaW4gYSBsb2cgcm90YXRpb24gc2NyaXB0LCBhICBzdWJzdGFudGlhbAotICAgICAgICAgICAgICAgICBkZWxheSAgbWF5ICBiZSAgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBvbGQKLSAgICAgICAgICAgICAgICAgbG9nIGZpbGVzIGFyZSAgY2xvc2VkICBiZWZvcmUgIHByb2Nlc3NpbmcgIHRoZW0uCi0gICAgICAgICAgICAgICAgIFRoaXMgY29tbWFuZCBhdXRvbWF0aWNhbGx5IGNoZWNrcyB0aGUgY29uZmlndXJhLQotICAgICAgICAgICAgICAgICB0aW9uIGZpbGVzIHZpYSA8c3Ryb25nPmNvbmZpZ3Rlc3QgPC9zdHJvbmc+YmVmb3JlIGluaXRpYXRpbmcgIHRoZQotICAgICAgICAgICAgICAgICByZXN0YXJ0IHRvIG1ha2Ugc3VyZSBBcGFjaGUgZG9lc24ndCBkaWUuCi0KLSAgICAgPHN0cm9uZz5jb25maWd0ZXN0ICA8L3N0cm9uZz5SdW4gYSBjb25maWd1cmF0aW9uIGZpbGUgc3ludGF4IHRlc3QuIEl0ICBwYXJzZXMKLSAgICAgICAgICAgICAgICAgdGhlICBjb25maWd1cmF0aW9uIGZpbGVzIGFuZCBlaXRoZXIgcmVwb3J0cyA8c3Ryb25nPlN5bi08L3N0cm9uZz4KLSAgICAgICAgICAgICAgICAgPHN0cm9uZz50YXggT2sgPC9zdHJvbmc+b3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhcnRpYy0KLSAgICAgICAgICAgICAgICAgdWxhciBzeW50YXggZXJyb3IuCi0KLSAgICAgPHN0cm9uZz5oZWxwICAgICAgICA8L3N0cm9uZz5EaXNwbGF5cyBhIHNob3J0IGhlbHAgbWVzc2FnZS4KLQotPHN0cm9uZz5TRUUgQUxTTzwvc3Ryb25nPgotICAgICA8c3Ryb25nPmh0dHBkKDgpPC9zdHJvbmc+Ci0KLTwvcHJlPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9wcm9ncmFtcy9hcHhzLmh0bWwgYi9kb2NzL21hbnVhbC9wcm9ncmFtcy9hcHhzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZmYxOTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvcHJvZ3JhbXMvYXB4cy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPjxIRUFEPjxUSVRMRT5NYW51YWwgUGFnZTogYXB4cyAgLSBBcGFjaGUgSFRUUCBTZXJ2ZXI8L1RJVExFPjwvSEVBRD4KLTxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFRFWFQ9IiMwMDAwMDAiIExJTks9IiMwMDAwRkYiCi1WTElOSz0iIzAwMDA4MCIgQUxJTks9IiNGRjAwMDAiPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTwhLS0gVGhpcyBkb2N1bWVudCB3YXMgYXV0b2dlbmVyYXRlZCBmcm9tIHRoZSBtYW4gcGFnZSAtLT4KLTxwcmU+Ci08c3Ryb25nPk5BTUU8L3N0cm9uZz4KLSAgICAgYXB4cyAtIEFQYWNoZSBlWHRlblNpb24gdG9vbAotCi08c3Ryb25nPlNZTk9QU0lTPC9zdHJvbmc+Ci0gICAgIDxzdHJvbmc+YXB4cyA8L3N0cm9uZz4tPHN0cm9uZz5nIDwvc3Ryb25nPlsgLTxzdHJvbmc+UyA8L3N0cm9uZz48ZW0+bmFtZTwvZW0+PTxlbT52YWx1ZSA8L2VtPl0gLTxzdHJvbmc+biA8L3N0cm9uZz48ZW0+bW9kbmFtZTwvZW0+Ci0KLSAgICAgPHN0cm9uZz5hcHhzIDwvc3Ryb25nPi08c3Ryb25nPnEgPC9zdHJvbmc+WyAtPHN0cm9uZz5TIDwvc3Ryb25nPjxlbT5uYW1lPC9lbT49PGVtPnZhbHVlIDwvZW0+XSA8ZW0+cXVlcnkgPC9lbT4uLi4KLQotICAgICA8c3Ryb25nPmFweHMgPC9zdHJvbmc+LTxzdHJvbmc+YyA8L3N0cm9uZz5bIC08c3Ryb25nPlMgPC9zdHJvbmc+PGVtPm5hbWU8L2VtPj08ZW0+dmFsdWUgPC9lbT5dIFsgLTxzdHJvbmc+byA8L3N0cm9uZz48ZW0+ZHNvZmlsZSA8L2VtPl0gWyAtPHN0cm9uZz5JIDwvc3Ryb25nPjxlbT5pbmNkaXIgPC9lbT5dIFsgIC08c3Ryb25nPkQ8L3N0cm9uZz4KLSAgICAgPGVtPm5hbWU8L2VtPj08ZW0+dmFsdWUgIDwvZW0+XSAgWyAgLTxzdHJvbmc+TCA8L3N0cm9uZz48ZW0+bGliZGlyIDwvZW0+XSBbIC08c3Ryb25nPmwgPC9zdHJvbmc+PGVtPmxpYm5hbWUgPC9lbT5dIFsgLTxzdHJvbmc+V2MsPC9zdHJvbmc+PGVtPmNvbXBpbGVyPC9lbT4tCi0gICAgIDxlbT5mbGFncyA8L2VtPl0gWyAtPHN0cm9uZz5XbCw8L3N0cm9uZz48ZW0+bGlua2VyPC9lbT4tPGVtPmZsYWdzIDwvZW0+XSA8ZW0+ZmlsZXMgPC9lbT4uLi4KLQotICAgICA8c3Ryb25nPmFweHMgPC9zdHJvbmc+LTxzdHJvbmc+aSA8L3N0cm9uZz5bIC08c3Ryb25nPlMgPC9zdHJvbmc+PGVtPm5hbWU8L2VtPj08ZW0+dmFsdWUgPC9lbT5dIFsgLTxzdHJvbmc+biA8L3N0cm9uZz48ZW0+bW9kbmFtZSA8L2VtPl0gWyAtPHN0cm9uZz5hIDwvc3Ryb25nPl0gWyAtPHN0cm9uZz5BIDwvc3Ryb25nPl0gIDxlbT5kc28tPC9lbT4KLSAgICAgPGVtPmZpbGUgPC9lbT4uLi4KLQotICAgICA8c3Ryb25nPmFweHMgPC9zdHJvbmc+LTxzdHJvbmc+ZSA8L3N0cm9uZz5bIC08c3Ryb25nPlMgPC9zdHJvbmc+PGVtPm5hbWU8L2VtPj08ZW0+dmFsdWUgPC9lbT5dIFsgLTxzdHJvbmc+biA8L3N0cm9uZz48ZW0+bW9kbmFtZSA8L2VtPl0gWyAtPHN0cm9uZz5hIDwvc3Ryb25nPl0gWyAtPHN0cm9uZz5BIDwvc3Ryb25nPl0gIDxlbT5kc28tPC9lbT4KLSAgICAgPGVtPmZpbGUgPC9lbT4uLi4KLQotPHN0cm9uZz5ERVNDUklQVElPTjwvc3Ryb25nPgotICAgICA8c3Ryb25nPmFweHMgPC9zdHJvbmc+aXMgYSB0b29sIGZvciBidWlsZGluZyBhbmQgaW5zdGFsbGluZyBleHRlbnNpb24gbW9kdWxlcwotICAgICBmb3IgIHRoZSAgQXBhY2hlICBIeXBlclRleHQgVHJhbnNmZXIgUHJvdG9jb2wgKEhUVFApIHNlcnZlci4KLSAgICAgVGhpcyBpcyBhY2hpZXZlZCBieSBidWlsZGluZyBhIGR5bmFtaWMgc2hhcmVkICBvYmplY3QgIChEU08pCi0gICAgIGZyb20gIG9uZSAgb3IgIG1vcmUgc291cmNlIG9yIG9iamVjdCA8ZW0+ZmlsZXMgPC9lbT53aGljaCB0aGVuIGNhbiBiZQotICAgICBsb2FkZWQgaW50byB0aGUgQXBhY2hlIHNlcnZlciB1bmRlciBydW50aW1lIHZpYSB0aGUgIDxzdHJvbmc+TG9hZE1vLTwvc3Ryb25nPgotICAgICA8c3Ryb25nPmR1bGUgPC9zdHJvbmc+ZGlyZWN0aXZlIGZyb20gPHN0cm9uZz5tb2Rfc28uPC9zdHJvbmc+Ci0KLSAgICAgU28gdG8gdXNlIHRoaXMgZXh0ZW5zaW9uIG1lY2hhbmlzbSB5b3VyIHBsYXRmb3JtIGhhcyB0byBzdXAtCi0gICAgIHBvcnQgIHRoZSBEU08gZmVhdHVyZSBhbmQgeW91ciBBcGFjaGUgPHN0cm9uZz5odHRwZCA8L3N0cm9uZz5iaW5hcnkgaGFzIHRvIGJlCi0gICAgIGJ1aWx0IHdpdGggdGhlIDxzdHJvbmc+bW9kX3NvIDwvc3Ryb25nPm1vZHVsZS4gIFRoZSA8c3Ryb25nPmFweHMgIDwvc3Ryb25nPnRvb2wgIGF1dG9tYXRpY2FsbHkKLSAgICAgY29tcGxhaW5zIGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlLiAgWW91IGNhbiBjaGVjayB0aGlzIHlvdXItCi0gICAgIHNlbGYgYnkgbWFudWFsbHkgcnVubmluZyB0aGUgY29tbWFuZAotCi0gICAgICAgJCBodHRwZCAtbAotCi0gICAgIFRoZSBtb2R1bGUgPHN0cm9uZz5tb2Rfc28gPC9zdHJvbmc+c2hvdWxkIGJlIHBhcnQgb2YgdGhlIGRpc3BsYXllZCBsaXN0LiAgIElmCi0gICAgIHRoZXNlICByZXF1aXJlbWVudHMgYXJlIGZ1bGZpbGxlZCB5b3UgY2FuIGVhc2lseSBleHRlbmQgeW91cgotICAgICBBcGFjaGUgc2VydmVyJ3MgZnVuY3Rpb25hbGl0eSBieSBpbnN0YWxsaW5nIHlvdXIgb3duIG1vZHVsZXMKLSAgICAgd2l0aCB0aGUgRFNPIG1lY2hhbmlzbSBieSB0aGUgaGVscCBvZiB0aGlzIDxzdHJvbmc+YXB4cyA8L3N0cm9uZz50b29sOgotCi0gICAgICAgJCBhcHhzIC1pIC1hIC1jIG1vZF9mb28uYwotICAgICAgIGdjYyAtZnBpYyAtRFNIQVJFRF9NT0RVTEUgLUkvcGF0aC90by9hcGFjaGUvaW5jbHVkZSAtYyBtb2RfZm9vLmMKLSAgICAgICBsZCAtQnNoYXJlYWJsZSAtbyBtb2RfZm9vLnNvIG1vZF9mb28ubwotICAgICAgIGNwIG1vZF9mb28uc28gL3BhdGgvdG8vYXBhY2hlL2xpYmV4ZWMvbW9kX2Zvby5zbwotICAgICAgIGNobW9kIDc1NSAvcGF0aC90by9hcGFjaGUvbGliZXhlYy9tb2RfZm9vLnNvCi0gICAgICAgW2FjdGl2YXRpbmcgbW9kdWxlIGBmb28nIGluIC9wYXRoL3RvL2FwYWNoZS9ldGMvaHR0cGQuY29uZl0KLSAgICAgICAkIGFwYWNoZWN0bCByZXN0YXJ0Ci0gICAgICAgL3BhdGgvdG8vYXBhY2hlL3NiaW4vYXBhY2hlY3RsIHJlc3RhcnQ6IGh0dHBkIG5vdCBydW5uaW5nLCB0cnlpbmcgdG8gc3RhcnQKLSAgICAgICBbVHVlIE1hciAzMSAxMToyNzo1NSAxOTk4XSBbZGVidWddIG1vZF9zby5jKDMwMyk6IGxvYWRlZCBtb2R1bGUgZm9vX21vZHVsZQotICAgICAgIC9wYXRoL3RvL2FwYWNoZS9zYmluL2FwYWNoZWN0bCByZXN0YXJ0OiBodHRwZCBzdGFydGVkCi0gICAgICAgJCBfCi0KLSAgICAgVGhlIGFyZ3VtZW50cyA8ZW0+ZmlsZXMgPC9lbT5jYW4gYmUgYW55IEMgc291cmNlIGZpbGUgKC5jKSwgYSAgb2JqZWN0Ci0gICAgIGZpbGUgICgubykgIG9yICBldmVuICBhICBsaWJyYXJ5IGFyY2hpdmUgKC5hKS4gVGhlIDxzdHJvbmc+YXB4cyA8L3N0cm9uZz50b29sCi0gICAgIGF1dG9tYXRpY2FsbHkgcmVjb2duaXplcyB0aGVzZSBleHRlbnNpb25zIGFuZCAgYXV0b210YWljYWxseQotICAgICB1c2VkIHRoZSBDIHNvdXJjZSBmaWxlcyBmb3IgY29tcGlsYXRpb24gd2hpbGUganVzdCB1c2luZyB0aGUKLSAgICAgb2JqZWN0IGFuZCBhcmNoaXZlIGZpbGVzIGZvciB0aGUgIGxpbmtpbmcgIHBoYXNlLiAgQnV0ICB3aGVuCi0gICAgIHVzaW5nICBzdWNoIHByZS1jb21waWxlZCBvYmplY3RzIG1ha2Ugc3VyZSB0aGV5IGFyZSBjb21waWxlZAotICAgICBmb3IgcG9zaXRpb24gaW5kZXBlbmRlbmQgY29kZSAoUElDKSB0byBiZSBhYmxlIHRvICB1c2UgIHRoZW0KLSAgICAgZm9yICBhICBkeW5hbWljYWxseSBsb2FkZWQgc2hhcmVkIG9iamVjdC4gIEZvciBpbnN0YW5jZSB3aXRoCi0gICAgIEdDQyB5b3UgYWx3YXlzIGp1c3QgaGF2ZSB0byB1c2UgPHN0cm9uZz4tZnBpYzwvc3Ryb25nPi4gICBGb3IgIG90aGVyICBDICBjb20tCi0gICAgIHBpbGVycyAgY29uc3VsdCAgaXRzICBtYW51YWwgIHBhZ2Ugb3IgYXQgd2F0Y2ggZm9yIHRoZSBmbGFncwotICAgICA8c3Ryb25nPmFweHMgPC9zdHJvbmc+dXNlcyB0byBjb21waWxlIHRoZSBvYmplY3QgZmlsZXMuCi0KLSAgICAgRm9yIG1vcmUgZGV0YWlscyBhYm91dCBEU08gc3VwcG9ydCBpbiBBcGFjaGUgcmVhZCB0aGUgIGRvY3UtCi0gICAgIG1lbnRhdGlvbiAgICBvZiAgICA8c3Ryb25nPm1vZF9zbyAgIDwvc3Ryb25nPm9yICAgcGVyaGFwcyAgIGV2ZW4gICByZWFkICAgdGhlCi0gICAgIDxzdHJvbmc+c3JjL21vZHVsZXMvc3RhbmRhcmQvbW9kX3NvLmMgPC9zdHJvbmc+c291cmNlIGZpbGUuCi0KLTxzdHJvbmc+T1BUSU9OUzwvc3Ryb25nPgotICAgICBDb21tb24gb3B0aW9uczoKLQotICAgICAtPHN0cm9uZz5uIDwvc3Ryb25nPjxlbT5tb2RuYW1lICA8L2VtPlRoaXMgZXhwbGljaXRseSBzZXRzIHRoZSBtb2R1bGUgbmFtZSBmb3IgdGhlICAtPHN0cm9uZz5pPC9zdHJvbmc+Ci0gICAgICAgICAgICAgICAgIChpbnN0YWxsKSAgYW5kICAtPHN0cm9uZz5nIDwvc3Ryb25nPih0ZW1wbGF0ZSBnZW5lcmF0aW9uKSBvcHRpb24uCi0gICAgICAgICAgICAgICAgIFVzZSB0aGlzIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgbW9kdWxlICBuYW1lLgotICAgICAgICAgICAgICAgICBGb3IgIG9wdGlvbiAgLTxzdHJvbmc+ZyAgPC9zdHJvbmc+dGhpcyBpcyByZXF1aXJlZCwgZm9yIG9wdGlvbiAtPHN0cm9uZz5pPC9zdHJvbmc+Ci0gICAgICAgICAgICAgICAgIHRoZSA8c3Ryb25nPmFweHMgPC9zdHJvbmc+dG9vbCB0cmllcyB0byBkZXRlcm1pbmUgdGhlICBuYW1lICBmcm9tCi0gICAgICAgICAgICAgICAgIHRoZSBzb3VyY2Ugb3IgKGFzIGEgZmFsbGJhY2spIGF0IGxlYXN0IGJ5IGd1ZXNzLQotICAgICAgICAgICAgICAgICBpbmcgaXQgZnJvbSB0aGUgZmlsZW5hbWUuCi0KLSAgICAgUXVlcnkgb3B0aW9uczoKLQotICAgICAtPHN0cm9uZz5xICAgICAgICAgIDwvc3Ryb25nPlBlcmZvcm1zIGEgcXVlcnkgZm9yIDxzdHJvbmc+YXB4czwvc3Ryb25nPidzIGtub3dsZWRnZSBhYm91dCBjZXItCi0gICAgICAgICAgICAgICAgIHRhaW4gIHNldHRpbmdzLiAgVGhlIDxlbT5xdWVyeSA8L2VtPnBhcmFtZXRlcnMgY2FuIGJlIG9uZQotICAgICAgICAgICAgICAgICBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgc3RyaW5nczoKLSAgICAgICAgICAgICAgICAgICBDQyAgICAgICAgICAgICAgVEFSR0VUCi0gICAgICAgICAgICAgICAgICAgQ0ZMQUdTICAgICAgICAgIFNCSU5ESVIKLSAgICAgICAgICAgICAgICAgICBDRkxBR1NfU0hMSUIgICAgSU5DTFVERURJUgotICAgICAgICAgICAgICAgICAgIExEX1NITElCICAgICAgICBMSUJFWEVDRElSCi0gICAgICAgICAgICAgICAgICAgTERGTEFHU19TSExJQiAgIFNZU0NPTkZESVIKLSAgICAgICAgICAgICAgICAgICBMSUJTX1NITElCCi0gICAgICAgICAgICAgICAgIFVzZSB0aGlzIGZvciBtYW51YWxseSBkZXRlcm1pbmluZyBzZXR0aW5ncy4gIEZvcgotICAgICAgICAgICAgICAgICBpbnN0YW5jZSB1c2UKLSAgICAgICAgICAgICAgICAgICBJTkM9LUlgYXB4cyAtcSBJTkNMVURFRElSYAotICAgICAgICAgICAgICAgICBpbnNpZGUgeW91ciBvd24gTWFrZWZpbGVzICBpZiAgeW91ICBuZWVkICBtYW51YWwKLSAgICAgICAgICAgICAgICAgYWNjZXNzIHRvIEFwYWNoZSdzIEMgaGVhZGVyIGZpbGVzLgotCi0gICAgIENvbmZpZ3VyYXRpb24gb3B0aW9uczoKLQotICAgICAtPHN0cm9uZz5TIDwvc3Ryb25nPjxlbT5uYW1lPC9lbT49PGVtPnZhbHVlPC9lbT4KLSAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gY2hhbmdlcyB0aGUgYXB4cyBzZXR0aW5ncyAgZGVzY3JpYmVkCi0gICAgICAgICAgICAgICAgIGFib3ZlLgotCi0gICAgIFRlbXBsYXRlIEdlbmVyYXRpb24gb3B0aW9uczoKLQotICAgICAtPHN0cm9uZz5nICAgICAgICAgIDwvc3Ryb25nPlRoaXMgZ2VuZXJhdGVzIGEgc3ViZGlyZWN0b3J5IDxlbT5uYW1lICA8L2VtPihzZWUgIG9wdGlvbgotICAgICAgICAgICAgICAgICAtPHN0cm9uZz5uPC9zdHJvbmc+KSAgYW5kIHRoZXJlIHR3byBmaWxlczogQSBzYW1wbGUgbW9kdWxlIHNvdXJjZQotICAgICAgICAgICAgICAgICBmaWxlIG5hbWVkIDxzdHJvbmc+bW9kXzwvc3Ryb25nPjxlbT5uYW1lPC9lbT4uPGVtPmMgPC9lbT53aGljaCBjYW4gIGJlICB1c2VkICBhcyAgYQotICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSAgZm9yICBjcmVhdGluZyB5b3VyIG93biBtb2R1bGVzIG9yIGFzIGEKLSAgICAgICAgICAgICAgICAgcXVpY2sgc3RhcnQgZm9yIHBsYXlpbmcgd2l0aCB0aGUgQVBYUyBtZWNoYW5pc20uCi0gICAgICAgICAgICAgICAgIEFuZCAgYSAgY29ycmVzcG9uZGluZyAgPHN0cm9uZz5NYWtlZmlsZSAgPC9zdHJvbmc+Zm9yIGV2ZW4gZWFzaWVyCi0gICAgICAgICAgICAgICAgIGJ1aWxkIGFuZCBpbnN0YWxsaW5nIG9mIHRoaXMgbW9kdWxlLgotCi0gICAgIERTTyBjb21waWxhdGlvbiBvcHRpb25zOgotCi0gICAgIC08c3Ryb25nPmMgICAgICAgICAgPC9zdHJvbmc+VGhpcyBpbmRpY2F0ZXMgIHRoZSAgY29tcGlsYXRpb24gIG9wZXJhdGlvbi4gIEl0Ci0gICAgICAgICAgICAgICAgIGZpcnN0ICBjb21waWxlcyB0aGUgQyBzb3VyY2UgZmlsZXMgKC5jKSBvZiA8ZW0+ZmlsZXM8L2VtPgotICAgICAgICAgICAgICAgICBpbnRvIGNvcnJlc3BvbmRpbmcgb2JqZWN0IGZpbGVzICAoLm8pICBhbmQgIHRoZW4KLSAgICAgICAgICAgICAgICAgYnVpbGRzIGEgZHluYW1pY2FsbHkgc2hhcmVkIG9iamVjdCBpbiA8ZW0+ZHNvZmlsZSA8L2VtPmJ5Ci0gICAgICAgICAgICAgICAgIGxpbmtpbmcgdGhlc2Ugb2JqZWN0IGZpbGVzICBwbHVzICB0aGUgIHJlbWFpbmluZwotICAgICAgICAgICAgICAgICBvYmplY3QgIGZpbGVzICAoLm8gIGFuZCAgLmEpICBvZiAgPGVtPmZpbGVzIDwvZW0+SWYgbm8gLTxzdHJvbmc+bzwvc3Ryb25nPgotICAgICAgICAgICAgICAgICBvcHRpb24gaXMgc3BlY2lmaWVkIHRoZSBvdXRwdXQgZmlsZSAgaXMgIGd1ZXNzZWQKLSAgICAgICAgICAgICAgICAgZnJvbSAgdGhlICBmaXJzdCBmaWxlbmFtZSBpbiA8ZW0+ZmlsZXMgPC9lbT5hbmQgdGh1cyB1c3UtCi0gICAgICAgICAgICAgICAgIGFsbHkgZGVmYXVsdHMgdG8gPHN0cm9uZz5tb2RfPC9zdHJvbmc+PGVtPm5hbWU8L2VtPi48ZW0+c288L2VtPgotCi0gICAgIC08c3Ryb25nPm8gPC9zdHJvbmc+PGVtPmRzb2ZpbGUgIDwvZW0+RXhwbGljaXRseSBzcGVjaWZpZXMgdGhlIGZpbGVuYW1lIG9mIHRoZSBjcmVhdGVkCi0gICAgICAgICAgICAgICAgIGR5bmFtaWNhbGx5ICBzaGFyZWQgb2JqZWN0LiBJZiBub3Qgc3BlY2lmaWVkIGFuZAotICAgICAgICAgICAgICAgICB0aGUgbmFtZSBjYW5ub3QgYmUgZ3Vlc3NlZCBmcm9tIHRoZSA8ZW0+ZmlsZXMgIDwvZW0+bGlzdCwKLSAgICAgICAgICAgICAgICAgdGhlIGZhbGxiYWNrIG5hbWUgPHN0cm9uZz5tb2RfdW5rbm93bi5zbyA8L3N0cm9uZz5pcyB1c2VkLgotCi0gICAgIC08c3Ryb25nPkQgPC9zdHJvbmc+PGVtPm5hbWU8L2VtPj08ZW0+dmFsdWU8L2VtPgotICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBpcyBkaXJlY3RseSBwYXNzZWQgIHRocm91Z2ggIHRvICB0aGUKLSAgICAgICAgICAgICAgICAgY29tcGlsYXRpb24gIGNvbW1hbmQocykuICAgVXNlICB0aGlzIHRvIGFkZCB5b3VyCi0gICAgICAgICAgICAgICAgIG93biBkZWZpbmVzIHRvIHRoZSBidWlsZCBwcm9jZXNzLgotCi0gICAgIC08c3Ryb25nPkkgPC9zdHJvbmc+PGVtPmluY2RpciAgIDwvZW0+VGhpcyBvcHRpb24gaXMgZGlyZWN0bHkgcGFzc2VkICB0aHJvdWdoICB0byAgdGhlCi0gICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uICBjb21tYW5kKHMpLiAgIFVzZSAgdGhpcyB0byBhZGQgeW91cgotICAgICAgICAgICAgICAgICBvd24gaW5jbHVkZSBkaXJlY3RvcmllcyB0byBzZWFyY2ggdG8gIHRoZSAgYnVpbGQKLSAgICAgICAgICAgICAgICAgcHJvY2Vzcy4KLQotICAgICAtPHN0cm9uZz5MIDwvc3Ryb25nPjxlbT5saWJkaXIgICA8L2VtPlRoaXMgb3B0aW9uIGlzIGRpcmVjdGx5IHBhc3NlZCAgdGhyb3VnaCAgdG8gIHRoZQotICAgICAgICAgICAgICAgICBsaW5rZXIgIGNvbW1hbmQuICAgVXNlICB0aGlzICB0byAgYWRkICB5b3VyICBvd24KLSAgICAgICAgICAgICAgICAgbGlicmFyeSBkaXJlY3RvcmllcyB0byBzZWFyY2ggdG8gdGhlIGJ1aWxkICBwcm8tCi0gICAgICAgICAgICAgICAgIGNlc3MuCi0KLSAgICAgLTxzdHJvbmc+bCA8L3N0cm9uZz48ZW0+bGlibmFtZSAgPC9lbT5UaGlzIG9wdGlvbiBpcyBkaXJlY3RseSBwYXNzZWQgIHRocm91Z2ggIHRvICB0aGUKLSAgICAgICAgICAgICAgICAgbGlua2VyICBjb21tYW5kLiAgIFVzZSAgdGhpcyAgdG8gIGFkZCAgeW91ciAgb3duCi0gICAgICAgICAgICAgICAgIGxpYnJhcmllcyB0byBzZWFyY2ggdG8gdGhlIGJ1aWxkIHByb2Nlc3MuCi0KLSAgICAgLTxzdHJvbmc+V2MsPC9zdHJvbmc+PGVtPmNvbXBpbGVyPC9lbT4tPGVtPmZsYWdzPC9lbT4KLSAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gcGFzc2VzIDxlbT5jb21waWxlcjwvZW0+LTxlbT5mbGFncyA8L2VtPmFzICBhZGRpdGlvbmFsCi0gICAgICAgICAgICAgICAgIGZsYWdzICB0byB0aGUgY29tcGlsZXIgY29tbWFuZC4gIFVzZSB0aGlzIHRvIGFkZAotICAgICAgICAgICAgICAgICBsb2NhbCBjb21waWxlci1zcGVjaWZpYyBvcHRpb25zLgotCi0gICAgIC08c3Ryb25nPldsLDwvc3Ryb25nPjxlbT5saW5rZXI8L2VtPi08ZW0+ZmxhZ3M8L2VtPgotICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBwYXNzZXMgIDxlbT5saW5rZXI8L2VtPi08ZW0+ZmxhZ3MgIDwvZW0+YXMgIGFkZGl0aW9uYWwKLSAgICAgICAgICAgICAgICAgZmxhZ3MgIHRvICB0aGUgIGxpbmtlciBjb21tYW5kLiAgVXNlIHRoaXMgdG8gYWRkCi0gICAgICAgICAgICAgICAgIGxvY2FsIGxpbmtlci1zcGVjaWZpYyBvcHRpb25zLgotCi0gICAgIERTTyBpbnN0YWxsYXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9uczoKLQotICAgICAtPHN0cm9uZz5pICAgICAgICAgIDwvc3Ryb25nPlRoaXMgaW5kaWNhdGVzIHRoZSAgaW5zdGFsbGF0aW9uICBvcGVyYXRpb24gIGFuZAotICAgICAgICAgICAgICAgICBpbnN0YWxscyAgb25lIG9yIG1vcmUgZHluYW1pY2FsbHkgc2hhcmVkIG9iamVjdHMKLSAgICAgICAgICAgICAgICAgaW50byB0aGUgc2VydmVyJ3MgPGVtPmxpYmV4ZWMgPC9lbT5kaXJlY3RvcnkuCi0KLSAgICAgLTxzdHJvbmc+YSAgICAgICAgICA8L3N0cm9uZz5UaGlzICBhY3RpdmF0ZXMgIHRoZSAgbW9kdWxlICBieSAgIGF1dG9tYXRpY2FsbHkKLSAgICAgICAgICAgICAgICAgYWRkaW5nICAgYSAgIGNvcnJlc3BvbmRpbmcgIDxzdHJvbmc+TG9hZE1vZHVsZSAgPC9zdHJvbmc+bGluZSAgdG8KLSAgICAgICAgICAgICAgICAgQXBhY2hlJ3MgPHN0cm9uZz5odHRwZC5jb25mIDwvc3Ryb25nPmNvbmZpZ3VyYXRpb24gIGZpbGUsICBvciAgYnkKLSAgICAgICAgICAgICAgICAgZW5hYmxpbmcgaXQgaWYgaXQgYWxyZWFkeSBleGlzdHMuCi0KLSAgICAgLTxzdHJvbmc+QSAgICAgICAgICA8L3N0cm9uZz5TYW1lIGFzIG9wdGlvbiAtPHN0cm9uZz5hICA8L3N0cm9uZz5idXQgIHRoZSAgY3JlYXRlZCAgPHN0cm9uZz5Mb2FkTW9kdWxlPC9zdHJvbmc+Ci0gICAgICAgICAgICAgICAgIGRpcmVjdGl2ZSBpcyBwcmVmaXhlZCB3aXRoIGEgaGFzaCBzaWduICgjKSwgaS5lLgotICAgICAgICAgICAgICAgICB0aGUgbW9kdWxlIGlzIGp1c3QgcHJlcGFyZWQgZm9yIGxhdGVyIGFjdGl2YXRpb24KLSAgICAgICAgICAgICAgICAgYnV0IGluaXRpYWxseSBkaXNhYmxlZC4KLQotICAgICAtPHN0cm9uZz5lICAgICAgICAgIDwvc3Ryb25nPlRoaXMgaW5kaWNhdGVzIHRoZSBlZGl0aW5nIG9wZXJhdGlvbiwgd2hpY2ggIGNhbgotICAgICAgICAgICAgICAgICBiZSAgdXNlZCB3aXRoIHRoZSAtPHN0cm9uZz5hIDwvc3Ryb25nPmFuZCAtPHN0cm9uZz5BIDwvc3Ryb25nPm9wdGlvbnMgc2ltaWxhcmx5IHRvCi0gICAgICAgICAgICAgICAgIHRoZSAtPHN0cm9uZz5pIDwvc3Ryb25nPm9wZXJhdGlvbiAgdG8gIGVkaXQgIEFwYWNoZSdzICA8c3Ryb25nPmh0dHBkLmNvbmY8L3N0cm9uZz4KLSAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlIHdpdGhvdXQgYXR0ZW1wdGluZyB0byBpbnN0YWxsCi0gICAgICAgICAgICAgICAgIHRoZSBtb2R1bGUuCi0KLTxzdHJvbmc+RVhBTVBMRVM8L3N0cm9uZz4KLSAgICAgQXNzdW1lIHlvdSBoYXZlIGFuIEFwYWNoZSBtb2R1bGUgbmFtZWQgIG1vZF9mb28uYyAgYXZhaWxhYmxlCi0gICAgIHdoaWNoIHNob3VsZCBleHRlbmQgQXBhY2hlJ3Mgc2VydmVyIGZ1bmN0aW9uYWxpdHkuIFRvIGFjY29tLQotICAgICBwbGlzaCB0aGlzIHlvdSBmaXJzdCBoYXZlIHRvIGNvbXBpbGUgdGhlICBDICBzb3VyY2UgIGludG8gIGEKLSAgICAgc2hhcmVkICBvYmplY3QgIHN1aXRhYmxlICBmb3IgbG9hZGluZyBpbnRvIHRoZSBBcGFjaGUgc2VydmVyCi0gICAgIHVuZGVyIHJ1bnRpbWUgdmlhIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKLQotICAgICAgICQgYXB4cyAtYyBtb2RfZm9vLmMKLSAgICAgICBnY2MgLWZwaWMgLURTSEFSRURfTU9EVUxFIC1JL3BhdGgvdG8vYXBhY2hlL2luY2x1ZGUgLWMgbW9kX2Zvby5jCi0gICAgICAgbGQgLUJzaGFyZWFibGUgLW8gbW9kX2Zvby5zbyBtb2RfZm9vLm8KLSAgICAgICAkIF8KLQotICAgICBUaGVuIHlvdSBoYXZlIHRvIHVwZGF0ZSB0aGUgQXBhY2hlIGNvbmZpZ3VyYXRpb24gIGJ5ICBtYWtpbmcKLSAgICAgc3VyZSAgYSAgPHN0cm9uZz5Mb2FkTW9kdWxlIDwvc3Ryb25nPmRpcmVjdGl2ZSBpcyBwcmVzZW50IHRvIGxvYWQgdGhpcyBzaGFyZWQKLSAgICAgb2JqZWN0LiBUbyBzaW1wbGlmeSB0aGlzIHN0ZXAgPHN0cm9uZz5hcHhzIDwvc3Ryb25nPnByb3ZpZGVzIGFuIGF1dG9tYXRpYyB3YXkKLSAgICAgdG8gIGluc3RhbGwgdGhlIHNoYXJlZCBvYmplY3QgaW4gaXRzICJsaWJleGVjIiBkaXJlY3RvcnkgYW5kCi0gICAgIHVwZGF0aW5nICB0aGUgIDxzdHJvbmc+aHR0cGQuY29uZiAgPC9zdHJvbmc+ZmlsZSAgYWNjb3JkaW5nbHkuICBUaGlzICBjYW4gIGJlCi0gICAgIGFjaGlldmVkIGJ5IHJ1bm5pbmc6Ci0KLSAgICAgICAkIGFweHMgLWkgLWEgbW9kX2Zvby5jCi0gICAgICAgY3AgbW9kX2Zvby5zbyAvcGF0aC90by9hcGFjaGUvbGliZXhlYy9tb2RfZm9vLnNvCi0gICAgICAgY2htb2QgNzU1IC9wYXRoL3RvL2FwYWNoZS9saWJleGVjL21vZF9mb28uc28KLSAgICAgICBbYWN0aXZhdGluZyBtb2R1bGUgYGZvbycgaW4gL3BhdGgvdG8vYXBhY2hlL2V0Yy9odHRwZC5jb25mXQotICAgICAgICQgXwotCi0gICAgIFRoaXMgd2F5IGEgbGluZSBuYW1lZAotCi0gICAgICAgTG9hZE1vZHVsZSBmb29fbW9kdWxlIGxpYmV4ZWMvbW9kX2Zvby5zbwotCi0gICAgIGlzIGFkZGVkIHRvIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaWYgc3RpbGwgbm90IHByZXNlbnQuICBJZgotICAgICB5b3UgIHdhbnQgIHRvIGhhdmUgdGhpcyB0aGlzIGRpc2FibGVkIHBlciBkZWZhdWx0IHVzZSB0aGUgLTxzdHJvbmc+QTwvc3Ryb25nPgotICAgICBvcHRpb24sIGkuZS4KLQotICAgICAgICQgYXB4cyAtaSAtQSBtb2RfZm9vLmMKLQotICAgICBGb3IgYSBxdWljayB0ZXN0IG9mIHRoZSBBUFhTIG1lY2hhbmlzbSB5b3UgY2FuIGNyZWF0ZSBhIHNhbS0KLSAgICAgcGxlICBBcGFjaGUgIG1vZHVsZSAgdGVtcGxhdGUgIHBsdXMgYSBjb3JyZXNwb25kaW5nIE1ha2VmaWxlCi0gICAgIHZpYToKLQotICAgICAgICQgYXB4cyAtZyAtbiBmb28KLSAgICAgICBDcmVhdGluZyBbRElSXSAgZm9vCi0gICAgICAgQ3JlYXRpbmcgW0ZJTEVdIGZvby9NYWtlZmlsZQotICAgICAgIENyZWF0aW5nIFtGSUxFXSBmb28vbW9kX2Zvby5jCi0gICAgICAgJCBfCi0KLSAgICAgVGhlbiB5b3UgY2FuIGltbWVkaWF0ZWx5IGNvbXBpbGUgdGhpcyBzYW1wbGUgbW9kdWxlICBpbnRvICBhCi0gICAgIHNoYXJlZCBvYmplY3QgYW5kIGxvYWQgaXQgaW50byB0aGUgQXBhY2hlIHNlcnZlcjoKLQotICAgICAgICQgY2QgZm9vCi0gICAgICAgJCBtYWtlIGFsbCByZWxvYWQKLSAgICAgICBhcHhzIC1jIG1vZF9mb28uYwotICAgICAgIGdjYyAtZnBpYyAtRFNIQVJFRF9NT0RVTEUgLUkvcGF0aC90by9hcGFjaGUvaW5jbHVkZSAtYyBtb2RfZm9vLmMKLSAgICAgICBsZCAtQnNoYXJlYWJsZSAtbyBtb2RfZm9vLnNvIG1vZF9mb28ubwotICAgICAgIGFweHMgLWkgLWEgLW4gImZvbyIgbW9kX2Zvby5zbwotICAgICAgIGNwIG1vZF9mb28uc28gL3BhdGgvdG8vYXBhY2hlL2xpYmV4ZWMvbW9kX2Zvby5zbwotICAgICAgIGNobW9kIDc1NSAvcGF0aC90by9hcGFjaGUvbGliZXhlYy9tb2RfZm9vLnNvCi0gICAgICAgW2FjdGl2YXRpbmcgbW9kdWxlIGBmb28nIGluIC9wYXRoL3RvL2FwYWNoZS9ldGMvaHR0cGQuY29uZl0KLSAgICAgICBhcGFjaGVjdGwgcmVzdGFydAotICAgICAgIC9wYXRoL3RvL2FwYWNoZS9zYmluL2FwYWNoZWN0bCByZXN0YXJ0OiBodHRwZCBub3QgcnVubmluZywgdHJ5aW5nIHRvIHN0YXJ0Ci0gICAgICAgW1R1ZSBNYXIgMzEgMTE6Mjc6NTUgMTk5OF0gW2RlYnVnXSBtb2Rfc28uYygzMDMpOiBsb2FkZWQgbW9kdWxlIGZvb19tb2R1bGUKLSAgICAgICAvcGF0aC90by9hcGFjaGUvc2Jpbi9hcGFjaGVjdGwgcmVzdGFydDogaHR0cGQgc3RhcnRlZAotICAgICAgICQgXwotCi0gICAgIFlvdSBjYW4gZXZlbiB1c2UgPHN0cm9uZz5hcHhzIDwvc3Ryb25nPnRvIGNvbXBpbGUgY29tcGxleCBtb2R1bGVzIG91dHNpZGUgdGhlCi0gICAgIEFwYWNoZSBzb3VyY2UgdHJlZSwgbGlrZSBQSFAzOgotCi0gICAgICAgJCBjZCBwaHAzCi0gICAgICAgJCAuL2NvbmZpZ3VyZSAtLXdpdGgtc2hhcmVkLWFwYWNoZT0uLi9hcGFjaGUtMS4zCi0gICAgICAgJCBhcHhzIC1jIC1vIGxpYnBocDMuc28gbW9kX3BocDMuYyBsaWJtb2RwaHAzLXNvLmEKLSAgICAgICBnY2MgLWZwaWMgLURTSEFSRURfTU9EVUxFIC1JL3RtcC9hcGFjaGUvaW5jbHVkZSAgLWMgbW9kX3BocDMuYwotICAgICAgIGxkIC1Cc2hhcmVhYmxlIC1vIGxpYnBocDMuc28gbW9kX3BocDMubyBsaWJtb2RwaHAzLXNvLmEKLSAgICAgICAkIF8KLQotICAgICBiZWNhdXNlIDxzdHJvbmc+YXB4cyA8L3N0cm9uZz5hdXRvbWF0aWNhbGx5IHJlY29nbml6ZWQgIEMgIHNvdXJjZSAgZmlsZXMgIGFuZAotICAgICBvYmplY3QgIGZpbGVzLiAgIE9ubHkgIEMgIHNvdXJjZSAgZmlsZXMgIGFyZSAgY29tcGlsZWQgd2hpbGUKLSAgICAgcmVtYWluaW5nIG9iamVjdCBmaWxlcyBhcmUgdXNlZCBmb3IgdGhlIGxpbmtpbmcgcGhhc2UuCi0KLTxzdHJvbmc+U0VFIEFMU088L3N0cm9uZz4KLSAgICAgPHN0cm9uZz5hcGFjaGVjdGwoMSksIGh0dHBkKDgpLjwvc3Ryb25nPgotCi08L3ByZT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvcHJvZ3JhbXMvZGJtbWFuYWdlLmh0bWwgYi9kb2NzL21hbnVhbC9wcm9ncmFtcy9kYm1tYW5hZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE4NjA2OS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9wcm9ncmFtcy9kYm1tYW5hZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD48SEVBRD48VElUTEU+TWFudWFsIFBhZ2U6IGRibW1hbmFnZSAgLSBBcGFjaGUgSFRUUCBTZXJ2ZXI8L1RJVExFPjwvSEVBRD4KLTxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFRFWFQ9IiMwMDAwMDAiIExJTks9IiMwMDAwRkYiCi1WTElOSz0iIzAwMDA4MCIgQUxJTks9IiNGRjAwMDAiPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTwhLS0gVGhpcyBkb2N1bWVudCB3YXMgYXV0b2dlbmVyYXRlZCBmcm9tIHRoZSBtYW4gcGFnZSAtLT4KLTxwcmU+Ci08c3Ryb25nPk5BTUU8L3N0cm9uZz4KLSAgICAgZGJtbWFuYWdlIC0gQ3JlYXRlIGFuZCB1cGRhdGUgdXNlciBhdXRoZW50aWNhdGlvbiAgZmlsZXMgIGluCi0gICAgIERCTSBmb3JtYXQKLQotPHN0cm9uZz5TWU5PUFNJUzwvc3Ryb25nPgotICAgICA8c3Ryb25nPmRibW1hbmFnZSA8L3N0cm9uZz48ZW0+ZmlsZW5hbWUgPC9lbT5bIDxlbT5jb21tYW5kIDwvZW0+XSBbIDxlbT51c2VybmFtZSA8L2VtPlsgPGVtPmVuY3Bhc3N3ZCA8L2VtPl0gXQotCi08c3Ryb25nPkRFU0NSSVBUSU9OPC9zdHJvbmc+Ci0gICAgIDxzdHJvbmc+ZGJtbWFuYWdlIDwvc3Ryb25nPmlzIHVzZWQgdG8gY3JlYXRlIGFuZCB1cGRhdGUgdGhlIERCTSBmb3JtYXQgIGZpbGVzCi0gICAgIHVzZWQgIHRvICBzdG9yZSB1c2VybmFtZXMgYW5kIHBhc3N3b3JkIGZvciBiYXNpYyBhdXRoZW50aWNhLQotICAgICB0aW9uIG9mIEhUVFAgdXNlcnMuICAgUmVzb3VyY2VzICBhdmFpbGFibGUgIGZyb20gIHRoZSAgPHN0cm9uZz5odHRwZDwvc3Ryb25nPgotICAgICBBcGFjaGUgd2ViIHNlcnZlciBjYW4gYmUgcmVzdHJpY3RlZCB0byBqdXN0IHRoZSB1c2VycyBsaXN0ZWQKLSAgICAgaW4gdGhlIGZpbGVzIGNyZWF0ZWQgYnkgPHN0cm9uZz5kYm1tYW5hZ2UuIDwvc3Ryb25nPlRoaXMgcHJvZ3JhbSBjYW4gb25seSAgYmUKLSAgICAgdXNlZCAgd2hlbiAgdGhlIHVzZXJuYW1lcyBhcmUgc3RvcmVkIGluIGEgREJNIGZpbGUuIFRvIHVzZSBhCi0gICAgIGZsYXQtZmlsZSBkYXRhYmFzZSBzZWUgPHN0cm9uZz5odHBhc3N3ZDwvc3Ryb25nPi4KLQotICAgICBUaGlzIG1hbnVhbCBwYWdlIG9ubHkgbGlzdHMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuICBGb3IKLSAgICAgZGV0YWlscyAgb2YgIHRoZSAgZGlyZWN0aXZlcyAgbmVjZXNzYXJ5ICB0byAgY29uZmlndXJlICB1c2VyCi0gICAgIGF1dGhlbnRpY2F0aW9uIGluIDxzdHJvbmc+aHR0cGQgPC9zdHJvbmc+c2VlIHRoZSBBcGFjaGUgbWFudWFsLCB3aGljaCBpcyBwYXJ0Ci0gICAgIG9mICAgdGhlICAgQXBhY2hlICAgZGlzdHJpYnV0aW9uICAgb3IgICBjYW4gICBiZSAgIGZvdW5kICBhdAotICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvLgotCi08c3Ryb25nPk9QVElPTlM8L3N0cm9uZz4KLSAgICAgPGVtPmZpbGVuYW1lPC9lbT4KLSAgICAgICAgICBUaGUgZmlsZW5hbWUgb2YgdGhlIERCTSBmb3JtYXQgIGZpbGUuICBVc3VhbGx5ICB3aXRob3V0Ci0gICAgICAgICAgdGhlIGV4dGVuc2lvbiAuZGIsIC5wYWcsIG9yIC5kaXIuCi0KLSAgICAgPGVtPmNvbW1hbmQ8L2VtPgotICAgICAgICAgIFRoaXMgc2VsZWN0cyB0aGUgb3BlcmF0aW9uIHRvIHBlcmZvcm06Ci0KLSAgICAgPHN0cm9uZz5hZGQgICAgICAgICA8L3N0cm9uZz5BZGRzIGFuIGVudHJ5IGZvciA8ZW0+dXNlcm5hbWUgPC9lbT50byA8ZW0+ZmlsZW5hbWUgPC9lbT51c2luZyB0aGUKLSAgICAgICAgICAgICAgICAgZW5jcnlwdGVkIHBhc3N3b3JkIDxlbT5lbmNwYXNzd29yZDwvZW0+LgotCi0gICAgIDxzdHJvbmc+YWRkdXNlciAgICAgPC9zdHJvbmc+QXNrcyBmb3IgYSBwYXNzd29yZCBhbmQgdGhlbiBhZGRzIGFuICBlbnRyeSAgZm9yCi0gICAgICAgICAgICAgICAgIDxlbT51c2VybmFtZSA8L2VtPnRvIDxlbT5maWxlbmFtZSA8L2VtPi4KLQotICAgICA8c3Ryb25nPmNoZWNrICAgICAgIDwvc3Ryb25nPkFza3MgZm9yIGEgcGFzc3dvcmQgYW5kIHRoZW4gY2hlY2tzIGlmICA8ZW0+dXNlcm5hbWU8L2VtPgotICAgICAgICAgICAgICAgICBpcyAgaW4gPGVtPmZpbGVuYW1lIDwvZW0+YW5kIGlmIGl0J3MgcGFzc3dvcmQgbWF0Y2hlcyB0aGUKLSAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIG9uZS4KLQotICAgICA8c3Ryb25nPmRlbGV0ZSAgICAgIDwvc3Ryb25nPkRlbGV0ZXMgdGhlIDxlbT51c2VybmFtZSA8L2VtPmVudHJ5IGZyb20gPGVtPmZpbGVuYW1lPC9lbT4uCi0KLSAgICAgPHN0cm9uZz5pbXBvcnQgICAgICA8L3N0cm9uZz5SZWFkcyB1c2VybmFtZTpwYXNzd29yZCBlbnRyaWVzIChvbmUgIHBlciAgbGluZSkKLSAgICAgICAgICAgICAgICAgZnJvbSAgU1RESU4gYW5kIGFkZHMgdGhlbSB0byA8ZW0+ZmlsZW5hbWU8L2VtPi4gVGhlIHBhc3MtCi0gICAgICAgICAgICAgICAgIHdvcmRzIGFscmVhZHkgaGFzIHRvIGJlIGNyeXB0ZWQuCi0KLSAgICAgPHN0cm9uZz51cGRhdGUgICAgICA8L3N0cm9uZz5TYW1lIGFzIHRoZSAiYWRkdXNlciIgY29tbWFuZCwgIGV4Y2VwdCAgdGhhdCAgaXQKLSAgICAgICAgICAgICAgICAgbWFrZXMgc3VyZSA8ZW0+dXNlcm5hbWUgPC9lbT5hbHJlYWR5IGV4aXN0cyBpbiA8ZW0+ZmlsZW5hbWU8L2VtPi4KLQotICAgICA8c3Ryb25nPnZpZXcgICAgICAgIDwvc3Ryb25nPkp1c3QgZGlzcGxheXMgdGhlIGNvbXBsZXRlIGNvbnRlbnRzIG9mICB0aGUgIERCTQotICAgICAgICAgICAgICAgICBmaWxlLgotCi0gICAgIDxlbT51c2VybmFtZSAgICA8L2VtPlRoZSB1c2VyIGZvciB3aGljaCB0aGUgdXBkYXRlIG9wZXJhdGlvbiBpcyAgcGVyLQotICAgICAgICAgICAgICAgICBmb3JtZWQuCi0KLTxzdHJvbmc+QlVHUzwvc3Ryb25nPgotICAgICBPbmUgc2hvdWxkIGJlIGF3YXJlIHRoYXQgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBEQk0KLSAgICAgZmlsZSAgIGZvcm1hdHMgICBpbiAgZXhpc3RhbmNlLCAgYW5kICB3aXRoICBhbGwgIGxpa2VsaWhvb2QsCi0gICAgIGxpYnJhcmllcyBmb3IgbW9yZSB0aGFuIG9uZSBmb3JtYXQgbWF5IGV4aXN0IG9uIHlvdXIgc3lzdGVtLgotICAgICBUaGUgdGhyZWUgcHJpbWFyeSBleGFtcGxlcyBhcmUgTkRCTSwgdGhlIEdOVSBwcm9qZWN0J3MgR0RCTSwKLSAgICAgYW5kIEJlcmtlbGV5IERCIDIuICBVbmZvcnR1bmF0ZWx5LCBhbGwgdGhlc2UgIGxpYnJhcmllcyAgdXNlCi0gICAgIGRpZmZlcmVudCBmaWxlIGZvcm1hdHMsIGFuZCB5b3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGUgZmlsZQotICAgICBmb3JtYXQgdXNlZCBieSA8ZW0+ZmlsZW5hbWUgPC9lbT5pcyB0aGUgc2FtZSAgZm9ybWF0ICB0aGF0ICA8c3Ryb25nPmRibW1hbmFnZTwvc3Ryb25nPgotICAgICBleHBlY3RzICB0byBzZWUuIDxzdHJvbmc+ZGJtbWFuYWdlIDwvc3Ryb25nPmN1cnJlbnRseSBoYXMgbm8gd2F5IG9mIGRldGVybWluLQotICAgICBpbmcgd2hhdCB0eXBlIG9mIERCTSBmaWxlIGl0IGlzIGxvb2tpbmcgYXQuICBJZiB1c2VkIGFnYWluc3QKLSAgICAgdGhlICB3cm9uZyBmb3JtYXQsIHdpbGwgc2ltcGx5IHJldHVybiBub3RoaW5nLCBvciBtYXkgY3JlYXRlCi0gICAgIGEgZGlmZmVyZW50IERCTSBmaWxlIHdpdGggYSBkaWZmZXJlbnQgbmFtZSwgb3IgYXQgd29yc3QsICBpdAotICAgICBtYXkgIGNvcnJ1cHQgdGhlIERCTSBmaWxlIGlmIHlvdSB3ZXJlIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8KLSAgICAgaXQuCi0KLSAgICAgPHN0cm9uZz5kYm1tYW5hZ2UgPC9zdHJvbmc+aGFzIGEgbGlzdCBvZiBEQk0gZm9ybWF0IHByZWZlcmVuY2VzLCAgZGVmaW5lZCAgYnkKLSAgICAgdGhlICA8c3Ryb25nPkBBbnlEQk06OklTQSAgPC9zdHJvbmc+YXJyYXkgIG5lYXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJvZ3JhbS4KLSAgICAgU2luY2Ugd2UgcHJlZmVyIHRoZSBCZXJrZWxleSBEQiAyIGZpbGUgZm9ybWF0LCB0aGUgb3JkZXIgIGluCi0gICAgIHdoaWNoICA8c3Ryb25nPmRibW1hbmFnZSAgPC9zdHJvbmc+d2lsbCBsb29rIGZvciBzeXN0ZW0gbGlicmFyaWVzIGlzIEJlcmtlbGV5Ci0gICAgIERCIDIsIHRoZW4gTkRCTSwgYW5kIHRoZW4gR0RCTS4gICBUaGUgIGZpcnN0ICBsaWJyYXJ5ICBmb3VuZAotICAgICB3aWxsICBiZSAgdGhlICBsaWJyYXJ5IDxzdHJvbmc+ZGJtbWFuYWdlIDwvc3Ryb25nPndpbGwgYXR0ZW1wdCB0byB1c2UgZm9yIGFsbAotICAgICBEQk0gZmlsZSB0cmFuc2FjdGlvbnMuICBUaGlzIG9yZGVyaW5nIGlzIHNsaWdodGx5ICBkaWZmZXJlbnQKLSAgICAgdGhhbiAgdGhlIHN0YW5kYXJkIDxzdHJvbmc+QEFueURCTTo6SVNBIDwvc3Ryb25nPm9yZGVyaW5nIGluIHBlcmwsIGFzIHdlbGwgYXMKLSAgICAgdGhlIG9yZGVyaW5nIHVzZWQgYnkgdGhlIHNpbXBsZSBkYm1vcGVuKCkgY2FsbCBpbiAgUGVybCwgIHNvCi0gICAgIGlmICB5b3UgIHVzZSAgYW55ICBvdGhlciB1dGlsaXRpZXMgdG8gbWFuYWdlIHlvdXIgREJNIGZpbGVzLAotICAgICB0aGV5IG11c3QgYWxzbyBmb2xsb3cgIHRoaXMgIHByZWZlcmVuY2UgIG9yZGVyaW5nLiAgIFNpbWlsYXIKLSAgICAgY2FyZSAgbXVzdCAgYmUgIHRha2VuICBpZiB1c2luZyBwcm9ncmFtcyBpbiBvdGhlciBsYW5ndWFnZXMsCi0gICAgIGxpa2UgQywgdG8gYWNjZXNzIHRoZXNlIGZpbGVzLgotCi0gICAgIEFwYWNoZSdzIDxzdHJvbmc+bW9kX2F1dGhfZGIuYyA8L3N0cm9uZz5tb2R1bGUgY29ycmVzcG9uZHMgdG8gQmVya2VsZXkgIERCICAyCi0gICAgIGxpYnJhcnksICAgd2hpbGUgIDxzdHJvbmc+bW9kX2F1dGhfZGJtLmMgIDwvc3Ryb25nPmNvcnJlc3BvbmRzICB0byAgdGhlICBOREJNCi0gICAgIGxpYnJhcnkuICBBbHNvLCBvbmUgY2FuIHVzdWFsbHkgdXNlIHRoZSAgPHN0cm9uZz5maWxlICA8L3N0cm9uZz5wcm9ncmFtICBzdXAtCi0gICAgIHBsaWVkICB3aXRoICBtb3N0IFVuaXggc3lzdGVtcyB0byBzZWUgd2hhdCBmb3JtYXQgYSBEQk0gZmlsZQotICAgICBpcyBpbi4KLQotPHN0cm9uZz5TRUUgQUxTTzwvc3Ryb25nPgotICAgICA8c3Ryb25nPmh0dHBkKDgpPC9zdHJvbmc+Ci0KLTwvcHJlPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9wcm9ncmFtcy9odGRpZ2VzdC5odG1sIGIvZG9jcy9tYW51YWwvcHJvZ3JhbXMvaHRkaWdlc3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg5MWUwZC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9wcm9ncmFtcy9odGRpZ2VzdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+PEhFQUQ+PFRJVExFPk1hbnVhbCBQYWdlOiBodGRpZ2VzdCAgLSBBcGFjaGUgSFRUUCBTZXJ2ZXI8L1RJVExFPjwvSEVBRD4KLTxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFRFWFQ9IiMwMDAwMDAiIExJTks9IiMwMDAwRkYiCi1WTElOSz0iIzAwMDA4MCIgQUxJTks9IiNGRjAwMDAiPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTwhLS0gVGhpcyBkb2N1bWVudCB3YXMgYXV0b2dlbmVyYXRlZCBmcm9tIHRoZSBtYW4gcGFnZSAtLT4KLTxwcmU+Ci08c3Ryb25nPk5BTUU8L3N0cm9uZz4KLSAgICAgaHRkaWdlc3QgLSBDcmVhdGUgYW5kIHVwZGF0ZSB1c2VyIGF1dGhlbnRpY2F0aW9uIGZpbGVzCi0KLTxzdHJvbmc+U1lOT1BTSVM8L3N0cm9uZz4KLSAgICAgPHN0cm9uZz5odGRpZ2VzdCA8L3N0cm9uZz5bIC08c3Ryb25nPmMgPC9zdHJvbmc+XSA8ZW0+cGFzc3dkZmlsZSByZWFsbSB1c2VybmFtZTwvZW0+Ci0KLTxzdHJvbmc+REVTQ1JJUFRJT048L3N0cm9uZz4KLSAgICAgPHN0cm9uZz5odGRpZ2VzdCA8L3N0cm9uZz5pcyB1c2VkIHRvIGNyZWF0ZSBhbmQgdXBkYXRlIHRoZSBmbGF0LWZpbGVzIHVzZWQgdG8KLSAgICAgc3RvcmUgIHVzZXJuYW1lcywgIHJlYWxtIGFuZCBwYXNzd29yZCBmb3IgZGlnZXN0IGF1dGhlbnRpY2EtCi0gICAgIHRpb24gb2YgSFRUUCB1c2Vycy4gICBSZXNvdXJjZXMgIGF2YWlsYWJsZSAgZnJvbSAgdGhlICA8c3Ryb25nPmh0dHBkPC9zdHJvbmc+Ci0gICAgIEFwYWNoZSB3ZWIgc2VydmVyIGNhbiBiZSByZXN0cmljdGVkIHRvIGp1c3QgdGhlIHVzZXJzIGxpc3RlZAotICAgICBpbiB0aGUgZmlsZXMgY3JlYXRlZCBieSA8c3Ryb25nPmh0ZGlnZXN0Ljwvc3Ryb25nPgotCi0gICAgIFRoaXMgbWFudWFsIHBhZ2Ugb25seSBsaXN0cyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4gIEZvcgotICAgICBkZXRhaWxzICBvZiAgdGhlICBkaXJlY3RpdmVzICBuZWNlc3NhcnkgIHRvIGNvbmZpZ3VyZSBkaWdlc3QKLSAgICAgYXV0aGVudGljYXRpb24gaW4gPHN0cm9uZz5odHRwZCA8L3N0cm9uZz5zZWUgdGhlIEFwYWNoZSBtYW51YWwsIHdoaWNoIGlzIHBhcnQKLSAgICAgb2YgICB0aGUgICBBcGFjaGUgICBkaXN0cmlidXRpb24gICBvciAgIGNhbiAgIGJlICAgZm91bmQgIGF0Ci0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8uCi0KLTxzdHJvbmc+T1BUSU9OUzwvc3Ryb25nPgotICAgICAtYyAgIENyZWF0ZSB0aGUgPGVtPnBhc3N3ZGZpbGU8L2VtPi4gSWYgPGVtPnBhc3N3ZGZpbGUgPC9lbT5hbHJlYWR5IGV4aXN0cywgaXQKLSAgICAgICAgICBpcyBkZWxldGVkIGZpcnN0LgotCi0gICAgIDxlbT5wYXNzd2RmaWxlPC9lbT4KLSAgICAgICAgICBOYW1lIG9mIHRoZSBmaWxlIHRvIGNvbnRhaW4gIHRoZSAgdXNlcm5hbWUsICByZWFsbSAgYW5kCi0gICAgICAgICAgcGFzc3dvcmQuICBJZiAgLWMgIGlzIGdpdmVuLCB0aGlzIGZpbGUgaXMgY3JlYXRlZCBpZiBpdAotICAgICAgICAgIGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIG9yIGRlbGV0ZWQgYW5kIHJlY3JlYXRlZCBpZiAgaXQKLSAgICAgICAgICBkb2VzIGV4aXN0LgotCi0gICAgIDxlbT5yZWFsbTwvZW0+Ci0gICAgICAgICAgVGhlIHJlYWxtIG5hbWUgdG8gd2hpY2ggdGhlIHVzZXIgbmFtZSBiZWxvbmdzLgotCi0gICAgIDxlbT51c2VybmFtZTwvZW0+Ci0gICAgICAgICAgVGhlIHVzZXIgbmFtZSB0byBjcmVhdGUgb3IgIHVwZGF0ZSAgaW4gIDxzdHJvbmc+cGFzc3dkZmlsZTwvc3Ryb25nPi4gIElmCi0gICAgICAgICAgPGVtPnVzZXJuYW1lICA8L2VtPmRvZXMgIG5vdCAgZXhpc3QgIGlzICB0aGlzICBmaWxlLCBhbiBlbnRyeSBpcwotICAgICAgICAgIGFkZGVkLiBJZiBpdCBkb2VzIGV4aXN0LCB0aGUgcGFzc3dvcmQgaXMgY2hhbmdlZC4KLQotPHN0cm9uZz5TRUUgQUxTTzwvc3Ryb25nPgotICAgICA8c3Ryb25nPmh0dHBkKDgpPC9zdHJvbmc+Ci0KLTwvcHJlPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9wcm9ncmFtcy9odHBhc3N3ZC5odG1sIGIvZG9jcy9tYW51YWwvcHJvZ3JhbXMvaHRwYXNzd2QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM5NWI2ZC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9wcm9ncmFtcy9odHBhc3N3ZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPjxIRUFEPjxUSVRMRT5NYW51YWwgUGFnZTogaHRwYXNzd2QgIC0gQXBhY2hlIEhUVFAgU2VydmVyPC9USVRMRT48L0hFQUQ+Ci08Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBURVhUPSIjMDAwMDAwIiBMSU5LPSIjMDAwMEZGIgotVkxJTks9IiMwMDAwODAiIEFMSU5LPSIjRkYwMDAwIj4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08IS0tIFRoaXMgZG9jdW1lbnQgd2FzIGF1dG9nZW5lcmF0ZWQgZnJvbSB0aGUgbWFuIHBhZ2UgLS0+Ci08cHJlPgotPHN0cm9uZz5OQU1FPC9zdHJvbmc+Ci0gICAgIGh0cGFzc3dkIC0gQ3JlYXRlIGFuZCB1cGRhdGUgdXNlciBhdXRoZW50aWNhdGlvbiBmaWxlcwotCi08c3Ryb25nPlNZTk9QU0lTPC9zdHJvbmc+Ci0gICAgIDxzdHJvbmc+aHRwYXNzd2QgPC9zdHJvbmc+WyAtPHN0cm9uZz5jIDwvc3Ryb25nPl0gWyAtPHN0cm9uZz5tIDwvc3Ryb25nPl0gPGVtPnBhc3N3ZGZpbGUgdXNlcm5hbWU8L2VtPgotICAgICA8c3Ryb25nPmh0cGFzc3dkIDwvc3Ryb25nPi08c3Ryb25nPmIgPC9zdHJvbmc+WyAtPHN0cm9uZz5jIDwvc3Ryb25nPl0gWyAtPHN0cm9uZz5tIDwvc3Ryb25nPnwgLTxzdHJvbmc+ZCA8L3N0cm9uZz58IC08c3Ryb25nPnAgPC9zdHJvbmc+fCAtPHN0cm9uZz5zIDwvc3Ryb25nPl0gPGVtPnBhc3N3ZGZpbGUgdXNlcm5hbWU8L2VtPgotICAgICA8ZW0+cGFzc3dvcmQ8L2VtPgotICAgICA8c3Ryb25nPmh0cGFzc3dkIDwvc3Ryb25nPi08c3Ryb25nPm4gPC9zdHJvbmc+WyAtPHN0cm9uZz5tIDwvc3Ryb25nPnwgLTxzdHJvbmc+ZCA8L3N0cm9uZz58IC08c3Ryb25nPnMgPC9zdHJvbmc+fCAtPHN0cm9uZz5wIDwvc3Ryb25nPl0gPGVtPnVzZXJuYW1lPC9lbT4KLSAgICAgPHN0cm9uZz5odHBhc3N3ZCA8L3N0cm9uZz4tPHN0cm9uZz5uYiA8L3N0cm9uZz5bIC08c3Ryb25nPm0gPC9zdHJvbmc+fCAtPHN0cm9uZz5kIDwvc3Ryb25nPnwgLTxzdHJvbmc+cyA8L3N0cm9uZz58IC08c3Ryb25nPnAgPC9zdHJvbmc+XSA8ZW0+dXNlcm5hbWUgcGFzc3dvcmQ8L2VtPgotCi08c3Ryb25nPkRFU0NSSVBUSU9OPC9zdHJvbmc+Ci0gICAgIDxzdHJvbmc+aHRwYXNzd2QgPC9zdHJvbmc+aXMgdXNlZCB0byBjcmVhdGUgYW5kIHVwZGF0ZSB0aGUgZmxhdC1maWxlcyB1c2VkIHRvCi0gICAgIHN0b3JlICB1c2VybmFtZXMgIGFuZCAgcGFzc3dvcmQgIGZvciBiYXNpYyBhdXRoZW50aWNhdGlvbiBvZgotICAgICBIVFRQIHVzZXJzLiAgSWYgPHN0cm9uZz5odHBhc3N3ZCA8L3N0cm9uZz5jYW5ub3QgYWNjZXNzIGEgZmlsZSwgc3VjaCAgYXMgIG5vdAotICAgICBiZWluZyAgYWJsZSB0byB3cml0ZSB0byB0aGUgb3V0cHV0IGZpbGUgb3Igbm90IGJlaW5nIGFibGUgdG8KLSAgICAgcmVhZCB0aGUgZmlsZSBpbiBvcmRlciB0byB1cGRhdGUgaXQsICBpdCAgcmV0dXJucyAgYW4gIGVycm9yCi0gICAgIHN0YXR1cyBhbmQgbWFrZXMgbm8gY2hhbmdlcy4KLQotICAgICBSZXNvdXJjZXMgYXZhaWxhYmxlIGZyb20gdGhlIDxzdHJvbmc+aHR0cGQgPC9zdHJvbmc+QXBhY2hlIHdlYiBzZXJ2ZXIgY2FuICBiZQotICAgICByZXN0cmljdGVkICB0byBqdXN0IHRoZSB1c2VycyBsaXN0ZWQgaW4gdGhlIGZpbGVzIGNyZWF0ZWQgYnkKLSAgICAgPHN0cm9uZz5odHBhc3N3ZC4gPC9zdHJvbmc+VGhpcyBwcm9ncmFtIGNhbiBvbmx5IG1hbmFnZSB1c2VybmFtZXMgIGFuZCAgcGFzcy0KLSAgICAgd29yZHMgIHN0b3JlZCAgaW4gIGEgIGZsYXQtZmlsZS4gIEl0IGNhbiBlbmNyeXB0IGFuZCBkaXNwbGF5Ci0gICAgIHBhc3N3b3JkIGluZm9ybWF0aW9uIGZvciB1c2UgaW4gb3RoZXIgdHlwZXMgb2YgZGF0YSAgc3RvcmVzLAotICAgICB0aG91Z2guICBUbyB1c2UgYSBEQk0gZGF0YWJhc2Ugc2VlIDxzdHJvbmc+ZGJtbWFuYWdlPC9zdHJvbmc+LgotCi0gICAgIDxzdHJvbmc+aHRwYXNzd2QgPC9zdHJvbmc+ZW5jcnlwdHMgcGFzc3dvcmRzIHVzaW5nIGVpdGhlciBhICB2ZXJzaW9uICBvZiAgTUQ1Ci0gICAgIG1vZGlmaWVkIGZvciBBcGFjaGUsIG9yIHRoZSBzeXN0ZW0ncyA8ZW0+Y3J5cHQ8L2VtPigpIHJvdXRpbmUuICBGaWxlcwotICAgICBtYW5hZ2VkIGJ5IDxzdHJvbmc+aHRwYXNzd2QgPC9zdHJvbmc+bWF5IGNvbnRhaW4gIGJvdGggIHR5cGVzICBvZiAgcGFzc3dvcmRzOwotICAgICBzb21lICB1c2VyICByZWNvcmRzICBtYXkgIGhhdmUgTUQ1LWVuY3J5cHRlZCBwYXNzd29yZHMgd2hpbGUKLSAgICAgb3RoZXJzIGluIHRoZSBzYW1lIGZpbGUgbWF5IGhhdmUgIHBhc3N3b3JkcyAgZW5jcnlwdGVkICB3aXRoCi0gICAgIDxlbT5jcnlwdDwvZW0+KCkuCi0KLSAgICAgVGhpcyBtYW51YWwgcGFnZSBvbmx5IGxpc3RzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiAgRm9yCi0gICAgIGRldGFpbHMgIG9mICB0aGUgIGRpcmVjdGl2ZXMgIG5lY2Vzc2FyeSAgdG8gIGNvbmZpZ3VyZSAgdXNlcgotICAgICBhdXRoZW50aWNhdGlvbiBpbiA8c3Ryb25nPmh0dHBkIDwvc3Ryb25nPnNlZSB0aGUgQXBhY2hlIG1hbnVhbCwgd2hpY2ggaXMgcGFydAotICAgICBvZiAgIHRoZSAgIEFwYWNoZSAgIGRpc3RyaWJ1dGlvbiAgIG9yICAgY2FuICAgYmUgICBmb3VuZCAgYXQKLSAgICAgJmx0O1VSTDpodHRwOi8vd3d3LmFwYWNoZS5vcmcvJmd0Oy4KLQotPHN0cm9uZz5PUFRJT05TPC9zdHJvbmc+Ci0gICAgIC1iICAgVXNlIGJhdGNoIG1vZGU7IDxlbT5pPC9lbT4uPGVtPmU8L2VtPi4sIGdldCB0aGUgcGFzc3dvcmQgZnJvbSB0aGUgY29tbWFuZAotICAgICAgICAgIGxpbmUgIHJhdGhlciAgdGhhbiBwcm9tcHRpbmcgZm9yIGl0LiA8c3Ryb25nPlRoaXMgb3B0aW9uIHNob3VsZDwvc3Ryb25nPgotICAgICAgICAgIDxzdHJvbmc+YmUgdXNlZCAgd2l0aCAgZXh0cmVtZSAgY2FyZSwgIHNpbmNlICB0aGUgIHBhc3N3b3JkICBpczwvc3Ryb25nPgotICAgICAgICAgIDxzdHJvbmc+Y2xlYXJseSB2aXNpYmxlIG9uIHRoZSBjb21tYW5kIGxpbmUuPC9zdHJvbmc+Ci0KLSAgICAgLWMgICBDcmVhdGUgdGhlIDxlbT5wYXNzd2RmaWxlPC9lbT4uIElmIDxlbT5wYXNzd2RmaWxlIDwvZW0+YWxyZWFkeSBleGlzdHMsIGl0Ci0gICAgICAgICAgaXMgcmV3cml0dGVuIGFuZCB0cnVuY2F0ZWQuICBUaGlzIG9wdGlvbiBjYW5ub3QgYmUgY29tLQotICAgICAgICAgIGJpbmVkIHdpdGggdGhlIDxzdHJvbmc+LW4gPC9zdHJvbmc+b3B0aW9uLgotCi0gICAgIC1uICAgRGlzcGxheSB0aGUgcmVzdWx0cyAgb24gIHN0YW5kYXJkICBvdXRwdXQgIHJhdGhlciAgdGhhbgotICAgICAgICAgIHVwZGF0aW5nICBhICBmaWxlLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGdlbmVyYXRpbmcgcGFzcy0KLSAgICAgICAgICB3b3JkIHJlY29yZHMgYWNjZXB0YWJsZSAgdG8gIEFwYWNoZSAgZm9yICBpbmNsdXNpb24gIGluCi0gICAgICAgICAgbm9uLXRleHQgIGRhdGEgIHN0b3Jlcy4gIFRoaXMgb3B0aW9uIGNoYW5nZXMgdGhlIHN5bnRheAotICAgICAgICAgIG9mIHRoZSBjb21tYW5kICBsaW5lLCAgc2luY2UgIHRoZSAgPGVtPnBhc3N3ZGZpbGUgIDwvZW0+YXJndW1lbnQKLSAgICAgICAgICAodXN1YWxseSAgdGhlIGZpcnN0IG9uZSkgaXMgb21pdHRlZC4gIEl0IGNhbm5vdCBiZSBjb20tCi0gICAgICAgICAgYmluZWQgd2l0aCB0aGUgPHN0cm9uZz4tYyA8L3N0cm9uZz5vcHRpb24uCi0KLSAgICAgLW0gICBVc2UgTUQ1IGVuY3J5cHRpb24gZm9yIHBhc3N3b3Jkcy4gT24gV2luZG93cyAgYW5kICBUUEYsCi0gICAgICAgICAgdGhpcyBpcyB0aGUgZGVmYXVsdC4KLQotICAgICAtZCAgIFVzZSBjcnlwdCgpIGVuY3J5cHRpb24gZm9yIHBhc3N3b3Jkcy4gIFRoZSAgZGVmYXVsdCAgb24KLSAgICAgICAgICBhbGwgcGxhdGZvcm1zIGJ1dCBXaW5kb3dzIGFuZCBUUEYuIFRob3VnaCBwb3NzaWJseSBzdXAtCi0gICAgICAgICAgcG9ydGVkIGJ5IDxzdHJvbmc+aHRwYXNzd2QgPC9zdHJvbmc+b24gYWxsIHBsYXRmb3JtcywgIGl0ICBpcyAgbm90ICBzdXAtCi0gICAgICAgICAgcG9ydGVkIGJ5IHRoZSA8c3Ryb25nPmh0dHBkIDwvc3Ryb25nPnNlcnZlciBvbiBXaW5kb3dzIGFuZCBUUEYuCi0KLSAgICAgLXMgICBVc2UgU0hBIGVuY3J5cHRpb24gZm9yIHBhc3N3b3Jkcy4gRmFjaWxpYXRlcyAgbWlncmF0aW9uCi0gICAgICAgICAgZnJvbS90byAgTmV0c2NhcGUgIHNlcnZlcnMgIHVzaW5nICB0aGUgIExEQVAgIERpcmVjdG9yeQotICAgICAgICAgIEludGVyY2hhbmdlIEZvcm1hdCAobGRpZikuCi0KLSAgICAgLXAgICBVc2UgcGxhaW50ZXh0IHBhc3N3b3Jkcy4gVGhvdWdoIDxzdHJvbmc+aHRwYXNzd2QgIDwvc3Ryb25nPndpbGwgIHN1cHBvcnQKLSAgICAgICAgICBjcmVhdGlvbiAgb24gIGFsbCBwbGF0b2ZybXMsIHRoZSA8c3Ryb25nPmh0dHBkIDwvc3Ryb25nPmRlYW1vbiB3aWxsIG9ubHkKLSAgICAgICAgICBhY2NlcHQgcGxhaW4gdGV4dCBwYXNzd29yZHMgb24gV2luZG93cyBhbmQgVFBGLgotCi0gICAgIDxlbT5wYXNzd2RmaWxlPC9lbT4KLSAgICAgICAgICBOYW1lIG9mIHRoZSBmaWxlIHRvIGNvbnRhaW4gdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQuCi0gICAgICAgICAgSWYgIC1jICBpcyAgZ2l2ZW4sICB0aGlzIGZpbGUgaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdAotICAgICAgICAgIGFscmVhZHkgZXhpc3QsIG9yIHJld3JpdHRlbiBhbmQgdHJ1bmNhdGVkICBpZiAgaXQgIGRvZXMKLSAgICAgICAgICBleGlzdC4KLQotICAgICA8ZW0+dXNlcm5hbWU8L2VtPgotICAgICAgICAgIFRoZSB1c2VybmFtZSB0byBjcmVhdGUgIG9yICB1cGRhdGUgIGluICA8c3Ryb25nPnBhc3N3ZGZpbGU8L3N0cm9uZz4uICBJZgotICAgICAgICAgIDxlbT51c2VybmFtZSAgPC9lbT5kb2VzICBub3QgIGV4aXN0ICBpbiAgdGhpcyAgZmlsZSwgYW4gZW50cnkgaXMKLSAgICAgICAgICBhZGRlZC4gSWYgaXQgZG9lcyBleGlzdCwgdGhlIHBhc3N3b3JkIGlzIGNoYW5nZWQuCi0KLSAgICAgPGVtPnBhc3N3b3JkPC9lbT4KLSAgICAgICAgICBUaGUgcGxhaW50ZXh0IHBhc3N3b3JkIHRvIGJlIGVuY3J5cHRlZCAgYW5kICBzdG9yZWQgIGluCi0gICAgICAgICAgdGhlIGZpbGUuICBPbmx5IHVzZWQgd2l0aCB0aGUgLTxlbT5iIDwvZW0+ZmxhZy4KLQotPHN0cm9uZz5FWElUIFNUQVRVUzwvc3Ryb25nPgotICAgICA8c3Ryb25nPmh0cGFzc3dkIDwvc3Ryb25nPnJldHVybnMgYSB6ZXJvIHN0YXR1cyAoInRydWUiKSBpZiB0aGUgdXNlcm5hbWUgIGFuZAotICAgICBwYXNzd29yZCAgaGF2ZSAgYmVlbiAgc3VjY2Vzc2Z1bGx5ICBhZGRlZCAgb3IgdXBkYXRlZCBpbiB0aGUKLSAgICAgPGVtPnBhc3N3ZGZpbGU8L2VtPi4gIDxzdHJvbmc+aHRwYXNzd2QgPC9zdHJvbmc+cmV0dXJucyAxIGlmIGl0IGVuY291bnRlcnMgc29tZSAgcHJvYi0KLSAgICAgbGVtICBhY2Nlc3NpbmcgIGZpbGVzLCAgMiBpZiB0aGVyZSB3YXMgYSBzeW50YXggcHJvYmxlbSB3aXRoCi0gICAgIHRoZSBjb21tYW5kIGxpbmUsIDMgaWYgdGhlICBwYXNzd29yZCAgd2FzICBlbnRlcmVkICBpbnRlcmFjLQotICAgICB0aXZlbHkgIGFuZCAgdGhlICB2ZXJpZmljYXRpb24gIGVudHJ5IGRpZG4ndCBtYXRjaCwgNCBpZiBpdHMKLSAgICAgb3BlcmF0aW9uIHdhcyBpbnRlcnJ1cHRlZCwgNSBpZiBhIHZhbHVlIGlzIHRvbyAgbG9uZyAgKHVzZXItCi0gICAgIG5hbWUsICBmaWxlbmFtZSwgIHBhc3N3b3JkLCBvciBmaW5hbCBjb21wdXRlZCByZWNvcmQpLCBhbmQgNgotICAgICBpZiB0aGUgdXNlcm5hbWUgY29udGFpbnMgaWxsZWdhbCBjaGFyYWN0ZXJzICAoc2VlICB0aGUgIDxzdHJvbmc+UkVTLTwvc3Ryb25nPgotICAgICA8c3Ryb25nPlRSSUNUSU9OUyA8L3N0cm9uZz5zZWN0aW9uKS4KLQotPHN0cm9uZz5FWEFNUExFUzwvc3Ryb25nPgotICAgICA8c3Ryb25nPmh0cGFzc3dkIC91c3IvbG9jYWwvZXRjL2FwYWNoZS8uaHRwYXNzd2QtdXNlcnMganNtaXRoPC9zdHJvbmc+Ci0KLSAgICAgICAgICBBZGRzIG9yIG1vZGlmaWVzIHRoZSBwYXNzd29yZCBmb3IgdXNlciA8ZW0+anNtaXRoPC9lbT4uIFRoZSB1c2VyCi0gICAgICAgICAgaXMgcHJvbXB0ZWQgZm9yIHRoZSBwYXNzd29yZC4gIElmIGV4ZWN1dGVkIG9uIGEgV2luZG93cwotICAgICAgICAgIHN5c3RlbSwgdGhlIHBhc3N3b3JkIHdpbGwgYmUgZW5jcnlwdGVkIHVzaW5nIHRoZSAgbW9kaS0KLSAgICAgICAgICBmaWVkICBBcGFjaGUgIE1ENSAgYWxnb3JpdGhtOyAgb3RoZXJ3aXNlLCAgdGhlIHN5c3RlbSdzCi0gICAgICAgICAgPGVtPmNyeXB0PC9lbT4oKSByb3V0aW5lIHdpbGwgYmUgdXNlZC4gIElmICB0aGUgIGZpbGUgIGRvZXMgIG5vdAotICAgICAgICAgIGV4aXN0LCA8c3Ryb25nPmh0cGFzc3dkIDwvc3Ryb25nPndpbGwgZG8gbm90aGluZyBleGNlcHQgcmV0dXJuIGFuIGVycm9yLgotCi0gICAgIDxzdHJvbmc+aHRwYXNzd2QgLWMgL2hvbWUvZG9lL3B1YmxpY19odG1sLy5odHBhc3N3ZCBqYW5lPC9zdHJvbmc+Ci0KLSAgICAgICAgICBDcmVhdGVzIGEgbmV3IGZpbGUgYW5kIHN0b3JlcyBhIHJlY29yZCBpbiBpdCAgZm9yICB1c2VyCi0gICAgICAgICAgPGVtPmphbmU8L2VtPi4gICBUaGUgIHVzZXIgaXMgcHJvbXB0ZWQgZm9yIHRoZSBwYXNzd29yZC4gIElmIHRoZQotICAgICAgICAgIGZpbGUgZXhpc3RzIGFuZCBjYW5ub3QgYmUgcmVhZCwgb3IgY2Fubm90ICBiZSAgd3JpdHRlbiwKLSAgICAgICAgICBpdCAgaXMgIG5vdCBhbHRlcmVkIGFuZCA8c3Ryb25nPmh0cGFzc3dkIDwvc3Ryb25nPndpbGwgZGlzcGxheSBhIG1lc3NhZ2UKLSAgICAgICAgICBhbmQgcmV0dXJuIGFuIGVycm9yIHN0YXR1cy4KLQotICAgICA8c3Ryb25nPmh0cGFzc3dkIC1tYiAvdXNyL3dlYi8uaHRwYXNzd2QtYWxsIGpvbmVzIFB3ZDRTdGV2ZTwvc3Ryb25nPgotCi0gICAgICAgICAgRW5jcnlwdHMgdGhlIHBhc3N3b3JkIGZyb20gdGhlIGNvbW1hbmQgbGluZSAoPGVtPlB3ZDRTdGV2ZTwvZW0+KQotICAgICAgICAgIHVzaW5nIHRoZSBNRDUgYWxnb3JpdGhtLCBhbmQgc3RvcmVzIGl0IGluIHRoZSBzcGVjaWZpZWQKLSAgICAgICAgICBmaWxlLgotCi08c3Ryb25nPlNFQ1VSSVRZIENPTlNJREVSQVRJT05TPC9zdHJvbmc+Ci0gICAgIFdlYiBwYXNzd29yZCBmaWxlcyBzdWNoIGFzIHRob3NlIG1hbmFnZWQgYnkgPHN0cm9uZz5odHBhc3N3ZCAgPC9zdHJvbmc+c2hvdWxkCi0gICAgIDxzdHJvbmc+bm90ICA8L3N0cm9uZz5iZSAgd2l0aGluICB0aGUgV2ViIHNlcnZlcidzIFVSSSBzcGFjZSAtLSB0aGF0IGlzLCB0aGV5Ci0gICAgIHNob3VsZCBub3QgYmUgZmV0Y2hhYmxlIHdpdGggYSBicm93c2VyLgotCi0gICAgIFRoZSB1c2Ugb2YgdGhlIC08ZW0+YiA8L2VtPm9wdGlvbiBpcyBkaXNjb3VyYWdlZCwgc2luY2UgIHdoZW4gIGl0ICBpcwotICAgICB1c2VkIHRoZSB1bmVuY3J5cHRlZCBwYXNzd29yZCBhcHBlYXJzIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0KLTxzdHJvbmc+UkVTVFJJQ1RJT05TPC9zdHJvbmc+Ci0gICAgIE9uIHRoZSBXaW5kb3dzIGFuZCBNUEUgcGxhdGZvcm1zLCBwYXNzd29yZHMgIGVuY3J5cHRlZCAgd2l0aAotICAgICA8c3Ryb25nPmh0cGFzc3dkICA8L3N0cm9uZz5hcmUgIGxpbWl0ZWQgIHRvICBubyAgbW9yZSAgdGhhbiAyNTUgY2hhcmFjdGVycyBpbgotICAgICBsZW5ndGguICBMb25nZXIgcGFzc3dvcmRzIHdpbGwgYmUgdHJ1bmNhdGVkIHRvICAyNTUgIGNoYXJhYy0KLSAgICAgdGVycy4KLQotICAgICBUaGUgTUQ1IGFsZ29yaXRobSB1c2VkIGJ5IDxzdHJvbmc+aHRwYXNzd2QgPC9zdHJvbmc+aXMgc3BlY2lmaWMgdG8gdGhlIEFwYWNoZQotICAgICBzb2Z0d2FyZTsgIHBhc3N3b3JkcyAgZW5jcnlwdGVkICB1c2luZyBpdCB3aWxsIG5vdCBiZSB1c2FibGUKLSAgICAgd2l0aCBvdGhlciBXZWIgc2VydmVycy4KLQotICAgICBVc2VybmFtZXMgYXJlIGxpbWl0ZWQgdG8gMjU1IGJ5dGVzIGFuZCBtYXkgbm90ICBpbmNsdWRlICB0aGUKLSAgICAgY2hhcmFjdGVyICc6Jy4KLQotPHN0cm9uZz5TRUUgQUxTTzwvc3Ryb25nPgotICAgICA8c3Ryb25nPmh0dHBkKDgpIDwvc3Ryb25nPmFuZCB0aGUgc2NyaXB0cyBpbiBzdXBwb3J0L1NIQTEgd2hpY2ggY29tZSB3aXRoIHRoZQotICAgICBkaXN0cmlidXRpb24uCi0KLTwvcHJlPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9wcm9ncmFtcy9odHRwZC5odG1sIGIvZG9jcy9tYW51YWwvcHJvZ3JhbXMvaHR0cGQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY1YTE2Zi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9wcm9ncmFtcy9odHRwZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPjxIRUFEPjxUSVRMRT5NYW51YWwgUGFnZTogaHR0cGQgIC0gQXBhY2hlIEhUVFAgU2VydmVyPC9USVRMRT48L0hFQUQ+Ci08Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBURVhUPSIjMDAwMDAwIiBMSU5LPSIjMDAwMEZGIgotVkxJTks9IiMwMDAwODAiIEFMSU5LPSIjRkYwMDAwIj4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08IS0tIFRoaXMgZG9jdW1lbnQgd2FzIGF1dG9nZW5lcmF0ZWQgZnJvbSB0aGUgbWFuIHBhZ2UgLS0+Ci08cHJlPgotPHN0cm9uZz5OQU1FPC9zdHJvbmc+Ci0gICAgIGh0dHBkIC0gQXBhY2hlIGh5cGVydGV4dCB0cmFuc2ZlciBwcm90b2NvbCBzZXJ2ZXIKLQotPHN0cm9uZz5TWU5PUFNJUzwvc3Ryb25nPgotICAgICA8c3Ryb25nPmh0dHBkIDwvc3Ryb25nPlsgLTxzdHJvbmc+WCA8L3N0cm9uZz5dIFsgLTxzdHJvbmc+UiA8L3N0cm9uZz48ZW0+bGliZXhlY2RpciA8L2VtPl0gWyAtPHN0cm9uZz5kIDwvc3Ryb25nPjxlbT5zZXJ2ZXJyb290IDwvZW0+XSBbIC08c3Ryb25nPmYgPC9zdHJvbmc+PGVtPmNvbmZpZzwvZW0+Ci0gICAgIF0gWyAtPHN0cm9uZz5DIDwvc3Ryb25nPjxlbT5kaXJlY3RpdmUgPC9lbT5dIFsgLTxzdHJvbmc+YyA8L3N0cm9uZz48ZW0+ZGlyZWN0aXZlIDwvZW0+XSBbIC08c3Ryb25nPkQgPC9zdHJvbmc+PGVtPnBhcmFtZXRlciA8L2VtPl0KLQotICAgICA8c3Ryb25nPmh0dHBkIDwvc3Ryb25nPlsgLTxzdHJvbmc+aCA8L3N0cm9uZz5dIFsgLTxzdHJvbmc+bCA8L3N0cm9uZz5dIFsgLTxzdHJvbmc+TCA8L3N0cm9uZz5dIFsgLTxzdHJvbmc+diA8L3N0cm9uZz5dIFsgLTxzdHJvbmc+ViA8L3N0cm9uZz5dIFsgLTxzdHJvbmc+UyA8L3N0cm9uZz5dIFsgLTxzdHJvbmc+dCA8L3N0cm9uZz5dIFsgIC08c3Ryb25nPlQ8L3N0cm9uZz4KLSAgICAgXQotCi08c3Ryb25nPkRFU0NSSVBUSU9OPC9zdHJvbmc+Ci0gICAgIDxzdHJvbmc+aHR0cGQgPC9zdHJvbmc+aXMgIHRoZSAgQXBhY2hlICBIeXBlclRleHQgIFRyYW5zZmVyICBQcm90b2NvbCAgKEhUVFApCi0gICAgIHNlcnZlciAgcHJvZ3JhbS4gIEl0ICBpcyAgZGVzaWduZWQgdG8gYmUgcnVuIGFzIGEgc3RhbmRhbG9uZQotICAgICBkYWVtb24gcHJvY2Vzcy4gV2hlbiB1c2VkIGxpa2UgdGhpcyBpdCB3aWxsIGNyZWF0ZSBhIHBvb2wgb2YKLSAgICAgY2hpbGQgIHByb2Nlc3NlcyB0byBoYW5kbGUgcmVxdWVzdHMuIFRvIHN0b3AgaXQsIHNlbmQgYSBURVJNCi0gICAgIHNpZ25hbCB0byB0aGUgaW5pdGlhbCAocGFyZW50KSBwcm9jZXNzLiBUaGUgUElEIG9mIHRoaXMgcHJvLQotICAgICBjZXNzICBpcyAgd3JpdHRlbiAgdG8gIGEgIGZpbGUgYXMgZ2l2ZW4gaW4gdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgZmlsZS4gIEFsdGVybmF0aXZlbHkgPHN0cm9uZz5odHRwZCA8L3N0cm9uZz5tYXkgYmUgaW52b2tlZCAgYnkgIHRoZSAgSW50ZXJuZXQKLSAgICAgZGFlbW9uICBpbmV0ZCg4KSAgZWFjaCB0aW1lIGEgY29ubmVjdGlvbiB0byB0aGUgSFRUUCBzZXJ2aWNlCi0gICAgIGlzIG1hZGUuCi0KLSAgICAgVGhpcyBtYW51YWwgcGFnZSBvbmx5IGxpc3RzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiAgRm9yCi0gICAgIGRldGFpbHMgIG9mICB0aGUgZGlyZWN0aXZlcyBuZWNlc3NhcnkgdG8gY29uZmlndXJlIDxzdHJvbmc+aHR0cGQgPC9zdHJvbmc+c2VlCi0gICAgIHRoZSBBcGFjaGUgbWFudWFsLCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBBcGFjaGUgIGRpc3RyaWJ1dGlvbgotICAgICBvciAgY2FuICBiZSAgZm91bmQgIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8uIFBhdGhzIGluIHRoaXMKLSAgICAgbWFudWFsIG1heSBub3QgcmVmbGVjdCB0aG9zZSBjb21waWxlZCBpbnRvIDxzdHJvbmc+aHR0cGQuPC9zdHJvbmc+Ci0KLTxzdHJvbmc+T1BUSU9OUzwvc3Ryb25nPgotICAgICAtPHN0cm9uZz5SIDwvc3Ryb25nPjxlbT5saWJleGVjZGlyPC9lbT4KLSAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gaXMgIG9ubHkgIGF2YWlsYWJsZSAgaWYgIEFwYWNoZSAgd2FzCi0gICAgICAgICAgICAgICAgIGJ1aWx0ICB3aXRoICB0aGUgIDxlbT5TSEFSRUQ8L2VtPl88ZW0+Q09SRSA8L2VtPnJ1bGUgZW5hYmxlZCB3aGljaAotICAgICAgICAgICAgICAgICBmb3JjZXMgdGhlIEFwYWNoZSBjb3JlIGNvZGUgdG8gYmUgcGxhY2VkIGludG8gIGEKLSAgICAgICAgICAgICAgICAgZHluYW1pYyAgc2hhcmVkICBvYmplY3QgKERTTykgZmlsZS4gVGhpcyBmaWxlIGlzCi0gICAgICAgICAgICAgICAgIHNlYXJjaGVkIGluIGEgaGFyZGNvZGVkICBwYXRoICB1bmRlciAgU2VydmVyUm9vdAotICAgICAgICAgICAgICAgICBwZXIgIGRlZmF1bHQuICBVc2UgIHRoaXMgIG9wdGlvbiAgaWYgeW91IHdhbnQgdG8KLSAgICAgICAgICAgICAgICAgb3ZlcnJpZGUgaXQuCi0KLSAgICAgLTxzdHJvbmc+ZCA8L3N0cm9uZz48ZW0+c2VydmVycm9vdDwvZW0+Ci0gICAgICAgICAgICAgICAgIFNldCB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIFNlcnZlclJvb3QgIGRpcmVjLQotICAgICAgICAgICAgICAgICB0aXZlICB0byAgPGVtPnNlcnZlcnJvb3Q8L2VtPi4gIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkKLSAgICAgICAgICAgICAgICAgdGhlICBTZXJ2ZXJSb290ICBjb21tYW5kICBpbiAgdGhlICBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICAgIGZpbGUuIFRoZSBkZWZhdWx0IGlzIDxzdHJvbmc+L3Vzci9sb2NhbC9hcGFjaGU8L3N0cm9uZz4uCi0KLSAgICAgLTxzdHJvbmc+ZiA8L3N0cm9uZz48ZW0+Y29uZmlnICAgPC9lbT5FeGVjdXRlIHRoZSAgY29tbWFuZHMgIGluICB0aGUgIGZpbGUgIDxlbT5jb25maWcgIDwvZW0+b24KLSAgICAgICAgICAgICAgICAgc3RhcnR1cC4gSWYgPGVtPmNvbmZpZyA8L2VtPmRvZXMgbm90IGJlZ2luIHdpdGggYSAvLCB0aGVuCi0gICAgICAgICAgICAgICAgIGl0IGlzIHRha2VuIHRvIGJlIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgU2VydmVyLQotICAgICAgICAgICAgICAgICBSb290LiBUaGUgZGVmYXVsdCBpcyA8c3Ryb25nPmNvbmYvaHR0cGQuY29uZjwvc3Ryb25nPi4KLQotICAgICAtPHN0cm9uZz5DIDwvc3Ryb25nPjxlbT5kaXJlY3RpdmU8L2VtPgotICAgICAgICAgICAgICAgICBQcm9jZXNzIHRoZSBjb25maWd1cmF0aW9uIDxlbT5kaXJlY3RpdmUgPC9lbT5iZWZvcmUgcmVhZC0KLSAgICAgICAgICAgICAgICAgaW5nIGNvbmZpZyBmaWxlcy4KLQotICAgICAtPHN0cm9uZz5jIDwvc3Ryb25nPjxlbT5kaXJlY3RpdmU8L2VtPgotICAgICAgICAgICAgICAgICBQcm9jZXNzIHRoZSBjb25maWd1cmF0aW9uIDxlbT5kaXJlY3RpdmUgPC9lbT5hZnRlciAgcmVhZC0KLSAgICAgICAgICAgICAgICAgaW5nIGNvbmZpZyBmaWxlcy4KLQotICAgICAtPHN0cm9uZz5EIDwvc3Ryb25nPjxlbT5wYXJhbWV0ZXI8L2VtPgotICAgICAgICAgICAgICAgICBTZXRzIGEgY29uZmlndXJhdGlvbiA8ZW0+cGFyYW1ldGVyIDwvZW0+d2hpY2ggY2FuIGJlIHVzZWQKLSAgICAgICAgICAgICAgICAgd2l0aCAgJmx0O0lmRGVmaW5lJmd0Oy4uLiZsdDsvSWZEZWZpbmUmZ3Q7ICBzZWN0aW9ucyAgaW4gdGhlCi0gICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMgIHRvICBjb25kaXRpb25hbGx5ICBza2lwICBvcgotICAgICAgICAgICAgICAgICBwcm9jZXNzIGNvbW1hbmRzLgotCi0gICAgIC08c3Ryb25nPmggICAgICAgICAgPC9zdHJvbmc+T3V0cHV0IGEgc2hvcnQgc3VtbWFyeSBvZiBhdmFpbGFibGUgY29tbWFuZCBsaW5lCi0gICAgICAgICAgICAgICAgIG9wdGlvbnMuCi0KLSAgICAgLTxzdHJvbmc+bCAgICAgICAgICA8L3N0cm9uZz5PdXRwdXQgYSAgbGlzdCAgb2YgIG1vZHVsZXMgIGNvbXBpbGVkICBpbnRvICB0aGUKLSAgICAgICAgICAgICAgICAgc2VydmVyLgotCi0gICAgIC08c3Ryb25nPkwgICAgICAgICAgPC9zdHJvbmc+T3V0cHV0ICBhICBsaXN0ICBvZiAgZGlyZWN0aXZlcyAgdG9nZXRoZXIgICB3aXRoCi0gICAgICAgICAgICAgICAgIGV4cGVjdGVkICBhcmd1bWVudHMgIGFuZCBwbGFjZXMgd2hlcmUgdGhlIGRpcmVjLQotICAgICAgICAgICAgICAgICB0aXZlIGlzIHZhbGlkLgotCi0gICAgIC08c3Ryb25nPlMgICAgICAgICAgPC9zdHJvbmc+U2hvdyB0aGUgc2V0dGluZ3MgYXMgcGFyc2VkIGZyb20gdGhlIGNvbmZpZyBmaWxlCi0gICAgICAgICAgICAgICAgIChjdXJyZW50bHkgb25seSBzaG93cyB0aGUgdmlydHVhbGhvc3Qgc2V0dGluZ3MpLgotCi0gICAgIC08c3Ryb25nPnQgICAgICAgICAgPC9zdHJvbmc+UnVuIHN5bnRheCB0ZXN0cyBmb3IgY29uZmlndXJhdGlvbiAgZmlsZXMgIG9ubHkuCi0gICAgICAgICAgICAgICAgIFRoZSBwcm9ncmFtIGltbWVkaWF0ZWx5IGV4aXRzIGFmdGVyIHRoZXNlIHN5bnRheAotICAgICAgICAgICAgICAgICBwYXJzaW5nIHdpdGggZWl0aGVyIGEgcmV0dXJuIGNvZGUgb2YgIDAgIChTeW50YXgKLSAgICAgICAgICAgICAgICAgT0spICBvciAgcmV0dXJuICBjb2RlICBub3QgIGVxdWFsICB0byAgMCAoU3ludGF4Ci0gICAgICAgICAgICAgICAgIEVycm9yKS4KLQotICAgICAtPHN0cm9uZz5UICAgICAgICAgIDwvc3Ryb25nPlNhbWUgYXMgb3B0aW9uIC08c3Ryb25nPnQgPC9zdHJvbmc+YnV0IGRvZXMgbm90IGNoZWNrIHRoZSBjb25maWctCi0gICAgICAgICAgICAgICAgIHVyZWQgZG9jdW1lbnQgcm9vdHMuCi0KLSAgICAgLTxzdHJvbmc+WCAgICAgICAgICA8L3N0cm9uZz5SdW4gaW4gc2luZ2xlLXByb2Nlc3MgbW9kZSwgZm9yIGludGVybmFsICBkZWJ1Zy0KLSAgICAgICAgICAgICAgICAgZ2luZyAgcHVycG9zZXMgIG9ubHk7IHRoZSBkYWVtb24gZG9lcyBub3QgZGV0YWNoCi0gICAgICAgICAgICAgICAgIGZyb20gdGhlIHRlcm1pbmFsIG9yIGZvcmsgYW55IGNoaWxkcmVuLiAgRG8gIE5PVAotICAgICAgICAgICAgICAgICB1c2UgdGhpcyBtb2RlIHRvIHByb3ZpZGUgb3JkaW5hcnkgd2ViIHNlcnZpY2UuCi0KLSAgICAgLTxzdHJvbmc+diAgICAgICAgICA8L3N0cm9uZz5QcmludCB0aGUgdmVyc2lvbiBvZiA8c3Ryb25nPmh0dHBkIDwvc3Ryb25nPiwgYW5kIHRoZW4gZXhpdC4KLQotICAgICAtPHN0cm9uZz5WICAgICAgICAgIDwvc3Ryb25nPlByaW50IHRoZSB2ZXJzaW9uIGFuZCBidWlsZCBwYXJhbWV0ZXJzIG9mICA8c3Ryb25nPmh0dHBkPC9zdHJvbmc+Ci0gICAgICAgICAgICAgICAgICwgYW5kIHRoZW4gZXhpdC4KLQotPHN0cm9uZz5GSUxFUzwvc3Ryb25nPgotICAgICA8c3Ryb25nPi91c3IvbG9jYWwvYXBhY2hlL2NvbmYvaHR0cGQuY29uZjwvc3Ryb25nPgotICAgICA8c3Ryb25nPi91c3IvbG9jYWwvYXBhY2hlL2NvbmYvc3JtLmNvbmY8L3N0cm9uZz4KLSAgICAgPHN0cm9uZz4vdXNyL2xvY2FsL2FwYWNoZS9jb25mL2FjY2Vzcy5jb25mPC9zdHJvbmc+Ci0gICAgIDxzdHJvbmc+L3Vzci9sb2NhbC9hcGFjaGUvY29uZi9taW1lLnR5cGVzPC9zdHJvbmc+Ci0gICAgIDxzdHJvbmc+L3Vzci9sb2NhbC9hcGFjaGUvY29uZi9tYWdpYzwvc3Ryb25nPgotICAgICA8c3Ryb25nPi91c3IvbG9jYWwvYXBhY2hlL2xvZ3MvZXJyb3JfbG9nPC9zdHJvbmc+Ci0gICAgIDxzdHJvbmc+L3Vzci9sb2NhbC9hcGFjaGUvbG9ncy9hY2Nlc3NfbG9nPC9zdHJvbmc+Ci0gICAgIDxzdHJvbmc+L3Vzci9sb2NhbC9hcGFjaGUvbG9ncy9odHRwZC5waWQ8L3N0cm9uZz4KLQotPHN0cm9uZz5TRUUgQUxTTzwvc3Ryb25nPgotICAgICA8c3Ryb25nPmluZXRkPC9zdHJvbmc+KDgpLgotCi08L3ByZT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvcHJvZ3JhbXMvaW5kZXguaHRtbCBiL2RvY3MvbWFudWFsL3Byb2dyYW1zL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNlMjQ2YWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvcHJvZ3JhbXMvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotIDxIRUFEPgotICA8VElUTEU+QXBhY2hlIEhUVFAgU2VydmVyIGFuZCBTdXBwb3J0aW5nIFByb2dyYW1zPC9USVRMRT4KLSA8L0hFQUQ+Ci0KLSA8IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci0gPEJPRFkKLSAgQkdDT0xPUj0iI0ZGRkZGRiIKLSAgVEVYVD0iIzAwMDAwMCIKLSAgTElOSz0iIzAwMDBGRiIKLSAgVkxJTks9IiMwMDAwODAiCi0gIEFMSU5LPSIjRkYwMDAwIgotID4KLSAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLSAgPEgxIEFMSUdOPSJDRU5URVIiPlNlcnZlciBhbmQgU3VwcG9ydGluZyBQcm9ncmFtczwvSDE+Ci0KLTxwPlRoaXMgcGFnZSBkb2N1bWVudHMgYWxsIHRoZSBleGVjdXRhYmxlIHByb2dyYW1zIGluY2x1ZGVkIHdpdGggdGhlCi1BcGFjaGUgSFRUUCBTZXJ2ZXIuPC9wPgotCi08ZGw+Ci0KLTxkdD48YSBocmVmPSJodHRwZC5odG1sIj5odHRwZDwvYT48L2R0PgotPGRkPkFwYWNoZSBoeXBlcnRleHQgdHJhbnNmZXIgcHJvdG9jb2wgc2VydmVyPC9kZD4KLQotPGR0PjxhIGhyZWY9ImFwYWNoZWN0bC5odG1sIj5hcGFjaGVjdGw8L2E+PC9kdD4KLTxkZD5BcGFjaGUgSFRUUCBzZXJ2ZXIgY29udHJvbCBpbnRlcmZhY2U8L2RkPgotCi08ZHQ+PGEgaHJlZj0iYWIuaHRtbCI+YWI8L2E+PC9kdD4KLTxkZD5BcGFjaGUgSFRUUCBzZXJ2ZXIgYmVuY2htYXJraW5nIHRvb2w8L2RkPgotCi08ZHQ+PGEgaHJlZj0iYXB4cy5odG1sIj5hcHhzPC9hPjwvZHQ+Ci08ZGQ+QVBhY2hlIGVYdGVuU2lvbiB0b29sPC9kZD4KLQotPGR0PjxhIGhyZWY9ImRibW1hbmFnZS5odG1sIj5kYm1tYW5hZ2U8L2E+PC9kdD4KLTxkZD5DcmVhdGUgYW5kIHVwZGF0ZSB1c2VyIGF1dGhlbnRpY2F0aW9uIGZpbGVzIGluIERCTSBmb3JtYXQgZm9yIGJhc2ljCi1hdXRoZW50aWNhdGlvbjwvZGQ+Ci0KLTxkdD48YSBocmVmPSJodGRpZ2VzdC5odG1sIj5odGRpZ2VzdDwvYT48L2R0PgotPGRkPkNyZWF0ZSBhbmQgdXBkYXRlIHVzZXIgYXV0aGVudGljYXRpb24gZmlsZXMgZm9yIGRpZ2VzdCBhdXRoZW50aWNhdGlvbjwvZGQ+Ci0KLTxkdD48YSBocmVmPSJodHBhc3N3ZC5odG1sIj5odHBhc3N3ZDwvYT48L2R0PgotPGRkPkNyZWF0ZSBhbmQgdXBkYXRlIHVzZXIgYXV0aGVudGljYXRpb24gZmlsZXMgZm9yIGJhc2ljIGF1dGhlbnRpY2F0aW9uPC9kZD4KLQotPGR0PjxhIGhyZWY9ImxvZ3Jlc29sdmUuaHRtbCI+bG9ncmVzb2x2ZTwvYT48L2R0PgotPGRkPlJlc29sdmUgaG9zdG5hbWVzICBmb3IgIElQLWFkZHJlc3NlcyAgaW4gIEFwYWNoZSBsb2dmaWxlczwvZGQ+Ci0KLTxkdD48YSBocmVmPSJyb3RhdGVsb2dzLmh0bWwiPnJvdGF0ZWxvZ3M8L2E+PC9kdD4KLTxkZD5Sb3RhdGUgQXBhY2hlIGxvZ3Mgd2l0aG91dCBoYXZpbmcgdG8gIGtpbGwgIHRoZSBzZXJ2ZXI8L2RkPgotCi08ZHQ+PGEgaHJlZj0ic3VleGVjLmh0bWwiPnN1ZXhlYzwvYT48L2R0PgotPGRkPlN3aXRjaCBVc2VyIEZvciBFeGVjPC9kZD4KLQotPGR0PjxhIGhyZWY9Im90aGVyLmh0bWwiPk90aGVyIFByb2dyYW1zPC9kdD4KLQotPC9kbD4KLQotICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotIDwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3Byb2dyYW1zL2xvZ3Jlc29sdmUuaHRtbCBiL2RvY3MvbWFudWFsL3Byb2dyYW1zL2xvZ3Jlc29sdmUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJlZmM0Mi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9wcm9ncmFtcy9sb2dyZXNvbHZlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD48SEVBRD48VElUTEU+TWFudWFsIFBhZ2U6IGxvZ3Jlc29sdmUgIC0gQXBhY2hlIEhUVFAgU2VydmVyPC9USVRMRT48L0hFQUQ+Ci08Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBURVhUPSIjMDAwMDAwIiBMSU5LPSIjMDAwMEZGIgotVkxJTks9IiMwMDAwODAiIEFMSU5LPSIjRkYwMDAwIj4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08IS0tIFRoaXMgZG9jdW1lbnQgd2FzIGF1dG9nZW5lcmF0ZWQgZnJvbSB0aGUgbWFuIHBhZ2UgLS0+Ci08cHJlPgotCi08c3Ryb25nPk5BTUU8L3N0cm9uZz4KLSAgICAgbG9ncmVzb2x2ZSAtIHJlc29sdmUgaG9zdG5hbWVzICBmb3IgIElQLWFkcmVzc2VzICBpbiAgQXBhY2hlCi0gICAgIGxvZ2ZpbGVzCi0KLTxzdHJvbmc+U1lOT1BTSVM8L3N0cm9uZz4KLSAgICAgPHN0cm9uZz5sb2dyZXNvbHZlICA8L3N0cm9uZz5bICAtPHN0cm9uZz5zICA8L3N0cm9uZz48ZW0+ZmlsZW5hbWUgIDwvZW0+XSAgWyAgLTxzdHJvbmc+YyAgPC9zdHJvbmc+XSAgJmx0OyAgIDxlbT5hY2Nlc3M8L2VtPl88ZW0+bG9nICAgPC9lbT4mZ3Q7Ci0gICAgIDxlbT5hY2Nlc3M8L2VtPl88ZW0+bG9nPC9lbT4uPGVtPm5ldzwvZW0+Ci0KLTxzdHJvbmc+REVTQ1JJUFRJT048L3N0cm9uZz4KLSAgICAgPHN0cm9uZz5sb2dyZXNvbHZlIDwvc3Ryb25nPmlzICBhICBwb3N0LXByb2Nlc3NpbmcgIHByb2dyYW0gIHRvICByZXNvbHZlICBJUC0KLSAgICAgYWRyZXNzZXMgaW4gQXBhY2hlJ3MgYWNjZXNzIGxvZ2ZpbGVzLiAgVG8gbWluaW1pemUgaW1wYWN0IG9uCi0gICAgIHlvdXIgbmFtZXNlcnZlciwgbG9ncmVzb2x2ZSBoYXMgaXRzIHZlcnkgb3duIGludGVybmFsICBoYXNoLQotICAgICB0YWJsZSAgY2FjaGUuICBUaGlzICBtZWFucyAgdGhhdCBlYWNoIElQIG51bWJlciB3aWxsIG9ubHkgYmUKLSAgICAgbG9va2VkIHVwIHRoZSBmaXJzdCB0aW1lIGl0IGlzIGZvdW5kIGluIHRoZSBsb2cgZmlsZS4KLQotPHN0cm9uZz5PUFRJT05TPC9zdHJvbmc+Ci0gICAgIC08c3Ryb25nPnMgPC9zdHJvbmc+PGVtPmZpbGVuYW1lIDwvZW0+U3BlY2lmaWVzIGEgZmlsZW5hbWUgdG8gcmVjb3JkIHN0YXRpc3RpY3MuCi0KLSAgICAgLTxzdHJvbmc+YyAgICAgICAgICA8L3N0cm9uZz5UaGlzIGNhdXNlcyA8c3Ryb25nPmxvZ3Jlc29sdmUgPC9zdHJvbmc+dG8gYXBwbHkgc29tZSBETlMgY2hlY2tzOgotICAgICAgICAgICAgICAgICBhZnRlciAgZmluZGluZyB0aGUgaG9zdG5hbWUgZnJvbSB0aGUgSVAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgaXQgbG9va3MgdXAgdGhlIElQIGFkZHJlc3NlcyAgZm9yICB0aGUgIGhvc3RuYW1lCi0gICAgICAgICAgICAgICAgIGFuZCAgY2hlY2tzIHRoYXQgb25lIG9mIHRoZXNlIG1hdGNoZXMgdGhlIG9yaWdpLQotICAgICAgICAgICAgICAgICBuYWwgYWRkcmVzcy4KLQotPHN0cm9uZz5TRUUgQUxTTzwvc3Ryb25nPgotICAgICA8c3Ryb25nPmh0dHBkKDgpPC9zdHJvbmc+Ci0KLTwvcHJlPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9wcm9ncmFtcy9vdGhlci5odG1sIGIvZG9jcy9tYW51YWwvcHJvZ3JhbXMvb3RoZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTgwZThhMi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9wcm9ncmFtcy9vdGhlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci0gPEhFQUQ+Ci0gIDxUSVRMRT5PdGhlciBQcm9ncmFtcyAtIEFwYWNoZSBIVFRQIFNlcnZlcjwvVElUTEU+Ci0gPC9IRUFEPgotCi0gPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotIDxCT0RZCi0gIEJHQ09MT1I9IiNGRkZGRkYiCi0gIFRFWFQ9IiMwMDAwMDAiCi0gIExJTks9IiMwMDAwRkYiCi0gIFZMSU5LPSIjMDAwMDgwIgotICBBTElOSz0iI0ZGMDAwMCIKLSA+Ci0gIDwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci0gIDxIMSBBTElHTj0iQ0VOVEVSIj5PdGhlciBQcm9ncmFtczwvSDE+Ci0KLTxwPlRoZSBmb2xsb3dpbmcgcHJvZ3JhbXMgYXJlIHNpbXBsZSBzdXBwb3J0IHByb2dyYW1zIGluY2x1ZGVkIHdpdGgKLXRoZSBBcGFjaGUgSFRUUCBTZXJ2ZXIgd2hpY2ggZG8gbm90IGhhdmUgdGhlaXIgb3duIG1hbnVhbCBwYWdlcy48L3A+Ci0KLQotPGgyPjxhIG5hbWU9ImxvZ19zZXJ2ZXJfc3RhdHVzIj5sb2dfc2VydmVyX3N0YXR1czwvYT48L2gyPgotCi08cD5UaGlzIFBlcmwgc2NyaXB0IGlzIGRlc2lnbmVkIHRvIGJlIHJ1biBhdCBhIGZyZXF1ZW50IGludGVydmFsIGJ5IHNvbWV0aGluZwotbGlrZSBjcm9uLiAgSXQgY29ubmVjdHMgdG8gdGhlIHNlcnZlciBhbmQgZG93bmxvYWRzIHRoZSBzdGF0dXMKLWluZm9ybWF0aW9uLiAgSXQgcmVmb3JtYXRzIHRoZSBpbmZvcm1hdGlvbiB0byBhIHNpbmdsZSBsaW5lIGFuZCBsb2dzCi1pdCB0byBhIGZpbGUuICBBZGp1c3QgdGhlIHZhcmlhYmxlcyBhdCB0aGUgdG9wIG9mIHRoZSBzY3JpcHQKLXRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSByZXN1bHRpbmcgbG9nZmlsZS48L3A+Ci0KLTxoMj48YSBuYW1lPSJzcGxpdC1sb2dmaWxlIj5zcGxpdC1sb2dmaWxlPC9hPjwvaDI+Ci0KLTxwPlRoaXMgUGVybCBzY3JpcHQgd2lsbCB0YWtlIGEgY29tYmluZWQgV2ViIHNlcnZlciBhY2Nlc3MKLWxvZyBmaWxlIGFuZCBicmVhayBpdHMgY29udGVudHMgaW50byBzZXBhcmF0ZSBmaWxlcy4KLUl0IGFzc3VtZXMgdGhhdCB0aGUgZmlyc3QgZmllbGQgb2YgZWFjaCBsaW5lIGlzIHRoZQotdmlydHVhbCBob3N0IGlkZW50aXR5IChwdXQgdGhlcmUgYnkgIiV2IiksIGFuZCB0aGF0Ci10aGUgbG9nZmlsZXMgc2hvdWxkIGJlIG5hbWVkIHRoYXQrIi5sb2ciIGluIHRoZSBjdXJyZW50Ci1kaXJlY3RvcnkuPC9wPgotCi08cD5UaGUgY29tYmluZWQgbG9nIGZpbGUgaXMgcmVhZCBmcm9tIHN0ZGluLiBSZWNvcmRzIHJlYWQKLXdpbGwgYmUgYXBwZW5kZWQgdG8gYW55IGV4aXN0aW5nIGxvZyBmaWxlcy48L3A+Ci0KLQotCi08L2RsPgotCi0gIDwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci0gPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvcHJvZ3JhbXMvcm90YXRlbG9ncy5odG1sIGIvZG9jcy9tYW51YWwvcHJvZ3JhbXMvcm90YXRlbG9ncy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGQyMjk1Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL3Byb2dyYW1zL3JvdGF0ZWxvZ3MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPjxIRUFEPjxUSVRMRT5NYW51YWwgUGFnZTogcm90YXRlbG9ncyAgLSBBcGFjaGUgSFRUUCBTZXJ2ZXI8L1RJVExFPjwvSEVBRD4KLTxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFRFWFQ9IiMwMDAwMDAiIExJTks9IiMwMDAwRkYiCi1WTElOSz0iIzAwMDA4MCIgQUxJTks9IiNGRjAwMDAiPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTwhLS0gVGhpcyBkb2N1bWVudCB3YXMgYXV0b2dlbmVyYXRlZCBmcm9tIHRoZSBtYW4gcGFnZSAtLT4KLTxwcmU+Ci0KLTxzdHJvbmc+TkFNRTwvc3Ryb25nPgotICAgICByb3RhdGVsb2dzIC0gcm90YXRlIEFwYWNoZSBsb2dzIHdpdGhvdXQgaGF2aW5nIHRvICBraWxsICB0aGUKLSAgICAgc2VydmVyCi0KLTxzdHJvbmc+U1lOT1BTSVM8L3N0cm9uZz4KLSAgICAgPHN0cm9uZz5yb3RhdGVsb2dzIDwvc3Ryb25nPjxlbT5sb2dmaWxlIHJvdGF0aW9udGltZTwvZW0+Ci0KLTxzdHJvbmc+REVTQ1JJUFRJT048L3N0cm9uZz4KLSAgICAgPHN0cm9uZz5yb3RhdGVsb2dzIDwvc3Ryb25nPmlzIGEgc2ltcGxlIHByb2dyYW0gZm9yIHVzZSBpbiAgY29uanVuY3Rpb24gIHdpdGgKLSAgICAgQXBhY2hlJ3MgcGlwZWQgbG9nZmlsZSBmZWF0dXJlIHdoaWNoIGNhbiBiZSB1c2VkIGxpa2UgdGhpczoKLQotICAgICAgICBUcmFuc2ZlckxvZyAifHJvdGF0ZWxvZ3MgL3BhdGgvdG8vbG9ncy9hY2Nlc3NfbG9nIDg2NDAwIgotCi0gICAgIFRoaXMgY3JlYXRlcyB0aGUgZmlsZXMgIC9wYXRoL3RvL2xvZ3MvYWNjZXNzX2xvZy5ubm5uICB3aGVyZQotICAgICBubm5uICBpcyAgdGhlICBzeXN0ZW0gdGltZSBhdCB3aGljaCB0aGUgbG9nIG5vbWluYWxseSBzdGFydHMKLSAgICAgKHRoaXMgdGltZSB3aWxsIGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIHRoZSAgcm90YXRpb24gIHRpbWUsCi0gICAgIHNvIHlvdSBjYW4gc3luY2hyb25pemUgY3JvbiBzY3JpcHRzIHdpdGggaXQpLiAgQXQgdGhlIGVuZCBvZgotICAgICBlYWNoIHJvdGF0aW9uIHRpbWUgKGhlcmUgIGFmdGVyICAyNCAgaG91cnMpICBhICBuZXcgIGxvZyAgaXMKLSAgICAgc3RhcnRlZC4KLQotPHN0cm9uZz5PUFRJT05TPC9zdHJvbmc+Ci0gICAgIDxlbT5sb2dmaWxlPC9lbT4KLSAgICAgICAgICBUaGUgcGF0aCBwbHVzIGJhc2VuYW1lIG9mIHRoZSBsb2dmaWxlLiBUaGUgc3VmZml4IC5ubm5uCi0gICAgICAgICAgaXMgYXV0b21hdGljYWxseSBhZGRlZC4KLQotICAgICA8ZW0+cm90YXRpb250aW1lPC9lbT4KLSAgICAgICAgICBUaGUgcm90YXRpb24gdGltZSBpbiBzZWNvbmRzLgotCi08c3Ryb25nPlNFRSBBTFNPPC9zdHJvbmc+Ci0gICAgIDxzdHJvbmc+aHR0cGQoOCk8L3N0cm9uZz4KLQotPC9wcmU+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3Byb2dyYW1zL3N1ZXhlYy5odG1sIGIvZG9jcy9tYW51YWwvcHJvZ3JhbXMvc3VleGVjLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZjliNzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvcHJvZ3JhbXMvc3VleGVjLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD48SEVBRD48VElUTEU+TWFudWFsIFBhZ2U6IHN1ZXhlYyAgLSBBcGFjaGUgSFRUUCBTZXJ2ZXI8L1RJVExFPjwvSEVBRD4KLTxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFRFWFQ9IiMwMDAwMDAiIExJTks9IiMwMDAwRkYiCi1WTElOSz0iIzAwMDA4MCIgQUxJTks9IiNGRjAwMDAiPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTwhLS0gVGhpcyBkb2N1bWVudCB3YXMgYXV0b2dlbmVyYXRlZCBmcm9tIHRoZSBtYW4gcGFnZSAtLT4KLTxwcmU+Ci0KLTxzdHJvbmc+TkFNRTwvc3Ryb25nPgotICAgICBzdWV4ZWMgLSBTd2l0Y2ggVXNlciBGb3IgRXhlYwotCi08c3Ryb25nPlNZTk9QU0lTPC9zdHJvbmc+Ci0gICAgIE5vIHN5bm9wc2lzIGZvciB1c2FnZSwgYmVjYXVzZSB0aGlzIHByb2dyYW0gaXMgIHVzZWQgIGludGVyLQotICAgICBuYWxseSBieSBBcGFjaGUgb25seS4KLQotPHN0cm9uZz5ERVNDUklQVElPTjwvc3Ryb25nPgotICAgICA8c3Ryb25nPnN1ZXhlYyA8L3N0cm9uZz5pcyB0aGUgICJ3cmFwcGVyIiAgc3VwcG9ydCAgcHJvZ3JhbSAgZm9yICB0aGUgIHN1RVhFQwotICAgICBiZWhhdmlvdXIgZm9yIEFwYWNoZS4gIEl0IGlzIHJ1biBmcm9tIHdpdGhpbiBBcGFjaGUgYXV0b21hdC0KLSAgICAgaWNhbGx5IHRvIHN3aXRjaCB0aGUgdXNlciB3aGVuIGFuIGV4dGVybmFsIHByb2dyYW0gaGFzIHRvIGJlCi0gICAgIHJ1biAgdW5kZXIgIGEgIGRpZmZlcmVudCAgdXNlci4gIEZvciAgbW9yZSBpbmZvcm1hdGlvbiBhYm91dAotICAgICBzdUVYRUMgIHNlZSAgdGhlICBkb2N1bWVudCAgYEFwYWNoZSAgc3VFWEVDICBTdXBwb3J0JyAgdW5kZXIKLSAgICAgaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvZG9jcy0yLjAvc3VleGVjLmh0bWwgLgotCi08c3Ryb25nPlNFRSBBTFNPPC9zdHJvbmc+Ci0gICAgIDxzdHJvbmc+aHR0cGQoOCk8L3N0cm9uZz4KLQotPC9wcmU+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3NlY3Rpb25zLmh0bWwgYi9kb2NzL21hbnVhbC9zZWN0aW9ucy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTQ1YTU2Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL3NlY3Rpb25zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPGh0bWw+PGhlYWQ+Ci08dGl0bGU+SG93IERpcmVjdG9yeSwgTG9jYXRpb24gYW5kIEZpbGVzIHNlY3Rpb25zIHdvcms8L3RpdGxlPgotPC9oZWFkPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxoMSBBTElHTj0iQ0VOVEVSIj5Ib3cgRGlyZWN0b3J5LCBMb2NhdGlvbiBhbmQgRmlsZXMgc2VjdGlvbnMgd29yazwvaDE+Ci0KLVRoZSBzZWN0aW9ucyA8YQotaHJlZj0ibW9kL2NvcmUuaHRtbCNkaXJlY3RvcnkiPjxjb2RlPiZsdDtEaXJlY3RvcnkmZ3Q7PC9jb2RlPjwvYT4sIDxhCi1ocmVmPSJtb2QvY29yZS5odG1sI2xvY2F0aW9uIj48Y29kZT4mbHQ7TG9jYXRpb24mZ3Q7PC9jb2RlPjwvYT4gYW5kIDxhCi1ocmVmPSJtb2RlL2NvcmUuaHRtbCNmaWxlcyI+PGNvZGU+Jmx0O0ZpbGVzJmd0OzwvY29kZT48L2E+IGNhbiBjb250YWluCi1kaXJlY3RpdmVzIHdoaWNoIG9ubHkgYXBwbHkgdG8gc3BlY2lmaWVkIGRpcmVjdG9yaWVzLCBVUkxzIG9yIGZpbGVzCi1yZXNwZWN0aXZlbHkuIEFsc28gaHRhY2Nlc3MgZmlsZXMgY2FuIGJlIHVzZWQgaW5zaWRlIGEgZGlyZWN0b3J5IHRvCi1hcHBseSBkaXJlY3RpdmVzIHRvIHRoYXQgZGlyZWN0b3J5LiBUaGlzIGRvY3VtZW50IGV4cGxhaW5zIGhvdyB0aGVzZQotZGlmZmVyZW50IHNlY3Rpb25zIGRpZmZlciBhbmQgaG93IHRoZXkgcmVsYXRlIHRvIGVhY2ggb3RoZXIgd2hlbgotQXBhY2hlIGRlY2lkZXMgd2hpY2ggZGlyZWN0aXZlcyBhcHBseSBmb3IgYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeSBvcgotcmVxdWVzdCBVUkwuCi0KLTxoMj5EaXJlY3RpdmVzIGFsbG93ZWQgaW4gdGhlIHNlY3Rpb25zPC9oMj4KLQotRXZlcnl0aGluZyB0aGF0IGlzIHN5bnRhY3RpY2FsbHkgYWxsb3dlZCBpbgotPGNvZGU+Jmx0O0RpcmVjdG9yeSZndDs8L2NvZGU+IGlzIGFsc28gYWxsb3dlZCBpbgotPGNvZGU+Jmx0O0xvY2F0aW9uJmd0OzwvY29kZT4gKGV4Y2VwdCBhIHN1Yi08Y29kZT4mbHQ7RmlsZXMmZ3Q7PC9jb2RlPgotc2VjdGlvbiwgYnV0IHRoZSBjb2RlIGRvZXNuJ3QgdGVzdCBmb3IgdGhhdCwgTGFycyBoYXMgYW4gb3BlbiBidWcKLXJlcG9ydCBvbiB0aGF0KS4gIFNlbWFudGljYWxseSBob3dldmVyIHNvbWUgdGhpbmdzLCBhbmQgdGhlIG1vc3QKLW5vdGFibGUgaXMgQWxsb3dPdmVycmlkZXMsIG1ha2Ugbm8gc2Vuc2UgaW4KLTxjb2RlPiZsdDtMb2NhdGlvbiZndDs8L2NvZGU+LiAgVGhlIHNhbWUgZm9yCi08Y29kZT4mbHQ7RmlsZXMmZ3Q7PC9jb2RlPiAtLSBzeW50YWN0aWNhbGx5IGV2ZXJ5dGhpbmcgaXMgZmluZSwgYnV0Ci1zZW1hbnRpY2FsbHkgc29tZSB0aGluZ3MgYXJlIGRpZmZlcmVudC4KLQotPGgyPkhvdyB0aGUgc2VjdGlvbnMgYXJlIG1lcmdlZDwvaDI+Ci0KLVRoZSBvcmRlciBvZiBtZXJnaW5nIGlzOgotCi08b2w+Ci0KLTxsaT4KLQotIDxjb2RlPiZsdDtEaXJlY3RvcnkmZ3Q7PC9jb2RlPiAoZXhjZXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnMpIGFuZAotIC5odGFjY2VzcyBkb25lIHNpbXVsdGFuZW91c2x5ICh3aXRoIC5odGFjY2VzcyBvdmVycmlkaW5nCi0gPGNvZGU+Jmx0O0RpcmVjdG9yeSZndDs8L2NvZGU+KQotCi08L2xpPgotCi08bGk+Ci0gPGNvZGU+Jmx0O0RpcmVjdG9yeU1hdGNoJmd0OzwvY29kZT4sIGFuZAotIDxjb2RlPiZsdDtEaXJlY3RvcnkmZ3Q7PC9jb2RlPiB3aXRoIHJlZ3VsYXIgZXhwcmVzc2lvbnMKLQotPC9saT4KLQotIDxsaT48Y29kZT4mbHQ7RmlsZXMmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O0ZpbGVzTWF0Y2gmZ3Q7PC9jb2RlPiBkb25lIHNpbXVsdGFuZW91c2x5Ci0gPC9saT4KLQotIDxsaT48Y29kZT4mbHQ7TG9jYXRpb24mZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O0xvY2F0aW9uTWF0Y2gmZ3Q7PC9jb2RlPiBkb25lIHNpbXVsdGFuZW91c2x5Ci0gPC9saT4KLQotPC9vbD4KLQotQXBhcnQgZnJvbSA8Y29kZT4mbHQ7RGlyZWN0b3J5Jmd0OzwvY29kZT4sIGVhY2ggZ3JvdXAgaXMgcHJvY2Vzc2VkIGluCi10aGUgb3JkZXIgdGhhdCB0aGV5IGFwcGVhciBpbiB0aGUgY29uZmlndXJhdGlvbgotZmlsZXMuIDxjb2RlPiZsdDtEaXJlY3RvcnkmZ3Q7PC9jb2RlPiAoZ3JvdXAgMSBhYm92ZSkgaXMgcHJvY2Vzc2VkIGluCi10aGUgb3JkZXIgc2hvcnRlc3QgZGlyZWN0b3J5IGNvbXBvbmVudCB0byBsb25nZXN0LiBJZiBtdWx0aXBsZQotPGNvZGU+Jmx0O0RpcmVjdG9yeSZndDs8L2NvZGU+IHNlY3Rpb25zIGFwcGx5IHRvIHRoZSBzYW1lIGRpcmVjdG9yeQotdGhleSB0aGV5IGFyZSBwcm9jZXNzZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBvcmRlci4gIFRoZQotY29uZmlndXJhdGlvbiBmaWxlcyBhcmUgcmVhZCBpbiB0aGUgb3JkZXIgaHR0cGQuY29uZiwgc3JtLmNvbmYgYW5kCi1hY2Nlc3MuY29uZi4gQ29uZmlndXJhdGlvbnMgaW5jbHVkZWQgdmlhIHRoZSA8Y29kZT5JbmNsdWRlPC9jb2RlPgotZGlyZWN0aXZlIHdpbGwgYmUgdHJlYXRlZCBhcyBpZiB0aGV5IHdoZXJlIGluc2lkZSB0aGUgaW5jbHVkaW5nIGZpbGUKLWF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgPGNvZGU+SW5jbHVkZTwvY29kZT4gZGlyZWN0aXZlLgotCi08cD4KLQotU2VjdGlvbnMgaW5zaWRlIDxjb2RlPiZsdDtWaXJ0dWFsSG9zdCZndDs8L2NvZGU+IHNlY3Rpb25zIGFyZSBhcHBsaWVkCi08aT5hZnRlcjwvaT4gdGhlIGNvcnJlc3BvbmRpbmcgc2VjdGlvbnMgb3V0c2lkZSB0aGUgdmlydHVhbCBob3N0Ci1kZWZpbml0aW9uLiBUaGlzIGFsbG93cyB2aXJ0dWFsIGhvc3RzIHRvIG92ZXJyaWRlIHRoZSBtYWluIHNlcnZlcgotY29uZmlndXJhdGlvbi4gKE5vdGU6IHRoaXMgb25seSB3b3JrcyBjb3JyZWN0bHkgZnJvbSAxLjIuMiBhbmQgMS4zYTIKLW9ud2FyZHMuIEJlZm9yZSB0aG9zZSByZWxlYXNlcyBzZWN0aW9ucyBpbnNpZGUgdmlydHVhbCBob3N0cyB3ZXJlCi1hcHBsaWVkIDxpPmJlZm9yZTwvaT4gdGhlIG1haW4gc2VydmVyKS4KLQotPGgyPk5vdGVzIGFib3V0IHVzaW5nIHNlY3Rpb25zPC9oMj4KLQotVGhlIGdlbmVyYWwgZ3VpZGVsaW5lcyBhcmU6Ci0KLTxwPgotCi08dWw+Ci08bGk+Ci0gICAgSWYgeW91IGFyZSBhdHRlbXB0aW5nIHRvIG1hdGNoIG9iamVjdHMgYXQgdGhlIGZpbGVzeXN0ZW0gbGV2ZWwKLSAgICB0aGVuIHlvdSBtdXN0IHVzZSA8Y29kZT4mbHQ7RGlyZWN0b3J5Jmd0OzwvY29kZT4gYW5kL29yCi0gICAgPGNvZGU+Jmx0O0ZpbGVzJmd0OzwvY29kZT4uCi08L2xpPgotCi08bGk+Ci0gICAgSWYgeW91IGFyZSBhdHRlbXB0aW5nIHRvIG1hdGNoIG9iamVjdHMgYXQgdGhlIFVSTCBsZXZlbCB0aGVuIHlvdQotICAgIG11c3QgdXNlIDxjb2RlPiZsdDtMb2NhdGlvbiZndDs8L2NvZGU+Ci08L2xpPgotPC91bD4KLQotQnV0IGEgbm90YWJsZSBleGNlcHRpb24gaXM6Ci0KLTx1bD4KLTxsaT4KLSAgICBwcm94eSBjb250cm9sIGlzIGRvbmUgdmlhIDxjb2RlPiZsdDtEaXJlY3RvcnkmZ3Q7PC9jb2RlPi4gIFRoaXMgaXMKLSAgICBhIGxlZ2FjeSBtaXN0YWtlIGJlY2F1c2UgdGhlIHByb3h5IGV4aXN0ZWQgcHJpb3IgdG8KLSAgICA8Y29kZT4mbHQ7TG9jYXRpb24mZ3Q7PC9jb2RlPi4gIEEgZnV0dXJlIHZlcnNpb24gb2YgdGhlIGNvbmZpZwotICAgIGxhbmd1YWdlIHNob3VsZCBwcm9iYWJseSBzd2l0Y2ggdGhpcyB0bwotICAgIDxjb2RlPiZsdDtMb2NhdGlvbiZndDs8L2NvZGU+LgotPC9saT4KLTwvdWw+Ci0KLU5vdGUgYWxzbyB0aGF0IG1vZGlmeWluZyAuaHRhY2Nlc3MgcGFyc2luZyBkdXJpbmcgTG9jYXRpb24gZG9lc24ndCBkbwotYW55dGhpbmcgYmVjYXVzZSAuaHRhY2Nlc3MgcGFyc2luZyBoYXMgYWxyZWFkeSBvY2N1cmVkLgotCi08cD4KLQotQW5vdGhlciBub3RlOgotPHA+Ci0KLTx1bD4KLTxsaT4KLSAgICBUaGVyZSBpcyBhY3R1YWxseSBhCi0gICAgPGNvZGU+Jmx0O0xvY2F0aW9uJmd0OzwvY29kZT4vPGNvZGU+Jmx0O0xvY2F0aW9uTWF0Y2gmZ3Q7PC9jb2RlPgotICAgIHNlcXVlbmNlIHBlcmZvcm1lZCBqdXN0IGJlZm9yZSB0aGUgbmFtZSB0cmFuc2xhdGlvbiBwaGFzZSAod2hlcmUKLSAgICA8Y29kZT5BbGlhc2VzPC9jb2RlPiBhbmQgPGNvZGU+RG9jdW1lbnRSb290czwvY29kZT4gYXJlIHVzZWQgdG8KLSAgICBtYXAgVVJMcyB0byBmaWxlbmFtZXMpLiAgVGhlIHJlc3VsdHMgb2YgdGhpcyBzZXF1ZW5jZSBhcmUKLSAgICBjb21wbGV0ZWx5IHRocm93biBhd2F5IGFmdGVyIHRoZSB0cmFuc2xhdGlvbiBoYXMgY29tcGxldGVkLgotPC9saT4KLTwvdWw+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvc2VjdGlvbnMuaHRtbC5lbiBiL2RvY3MvbWFudWFsL3NlY3Rpb25zLmh0bWwuZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNDVhNTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvc2VjdGlvbnMuaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08aHRtbD48aGVhZD4KLTx0aXRsZT5Ib3cgRGlyZWN0b3J5LCBMb2NhdGlvbiBhbmQgRmlsZXMgc2VjdGlvbnMgd29yazwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPGgxIEFMSUdOPSJDRU5URVIiPkhvdyBEaXJlY3RvcnksIExvY2F0aW9uIGFuZCBGaWxlcyBzZWN0aW9ucyB3b3JrPC9oMT4KLQotVGhlIHNlY3Rpb25zIDxhCi1ocmVmPSJtb2QvY29yZS5odG1sI2RpcmVjdG9yeSI+PGNvZGU+Jmx0O0RpcmVjdG9yeSZndDs8L2NvZGU+PC9hPiwgPGEKLWhyZWY9Im1vZC9jb3JlLmh0bWwjbG9jYXRpb24iPjxjb2RlPiZsdDtMb2NhdGlvbiZndDs8L2NvZGU+PC9hPiBhbmQgPGEKLWhyZWY9Im1vZGUvY29yZS5odG1sI2ZpbGVzIj48Y29kZT4mbHQ7RmlsZXMmZ3Q7PC9jb2RlPjwvYT4gY2FuIGNvbnRhaW4KLWRpcmVjdGl2ZXMgd2hpY2ggb25seSBhcHBseSB0byBzcGVjaWZpZWQgZGlyZWN0b3JpZXMsIFVSTHMgb3IgZmlsZXMKLXJlc3BlY3RpdmVseS4gQWxzbyBodGFjY2VzcyBmaWxlcyBjYW4gYmUgdXNlZCBpbnNpZGUgYSBkaXJlY3RvcnkgdG8KLWFwcGx5IGRpcmVjdGl2ZXMgdG8gdGhhdCBkaXJlY3RvcnkuIFRoaXMgZG9jdW1lbnQgZXhwbGFpbnMgaG93IHRoZXNlCi1kaWZmZXJlbnQgc2VjdGlvbnMgZGlmZmVyIGFuZCBob3cgdGhleSByZWxhdGUgdG8gZWFjaCBvdGhlciB3aGVuCi1BcGFjaGUgZGVjaWRlcyB3aGljaCBkaXJlY3RpdmVzIGFwcGx5IGZvciBhIHBhcnRpY3VsYXIgZGlyZWN0b3J5IG9yCi1yZXF1ZXN0IFVSTC4KLQotPGgyPkRpcmVjdGl2ZXMgYWxsb3dlZCBpbiB0aGUgc2VjdGlvbnM8L2gyPgotCi1FdmVyeXRoaW5nIHRoYXQgaXMgc3ludGFjdGljYWxseSBhbGxvd2VkIGluCi08Y29kZT4mbHQ7RGlyZWN0b3J5Jmd0OzwvY29kZT4gaXMgYWxzbyBhbGxvd2VkIGluCi08Y29kZT4mbHQ7TG9jYXRpb24mZ3Q7PC9jb2RlPiAoZXhjZXB0IGEgc3ViLTxjb2RlPiZsdDtGaWxlcyZndDs8L2NvZGU+Ci1zZWN0aW9uLCBidXQgdGhlIGNvZGUgZG9lc24ndCB0ZXN0IGZvciB0aGF0LCBMYXJzIGhhcyBhbiBvcGVuIGJ1ZwotcmVwb3J0IG9uIHRoYXQpLiAgU2VtYW50aWNhbGx5IGhvd2V2ZXIgc29tZSB0aGluZ3MsIGFuZCB0aGUgbW9zdAotbm90YWJsZSBpcyBBbGxvd092ZXJyaWRlcywgbWFrZSBubyBzZW5zZSBpbgotPGNvZGU+Jmx0O0xvY2F0aW9uJmd0OzwvY29kZT4uICBUaGUgc2FtZSBmb3IKLTxjb2RlPiZsdDtGaWxlcyZndDs8L2NvZGU+IC0tIHN5bnRhY3RpY2FsbHkgZXZlcnl0aGluZyBpcyBmaW5lLCBidXQKLXNlbWFudGljYWxseSBzb21lIHRoaW5ncyBhcmUgZGlmZmVyZW50LgotCi08aDI+SG93IHRoZSBzZWN0aW9ucyBhcmUgbWVyZ2VkPC9oMj4KLQotVGhlIG9yZGVyIG9mIG1lcmdpbmcgaXM6Ci0KLTxvbD4KLQotPGxpPgotCi0gPGNvZGU+Jmx0O0RpcmVjdG9yeSZndDs8L2NvZGU+IChleGNlcHQgcmVndWxhciBleHByZXNzaW9ucykgYW5kCi0gLmh0YWNjZXNzIGRvbmUgc2ltdWx0YW5lb3VzbHkgKHdpdGggLmh0YWNjZXNzIG92ZXJyaWRpbmcKLSA8Y29kZT4mbHQ7RGlyZWN0b3J5Jmd0OzwvY29kZT4pCi0KLTwvbGk+Ci0KLTxsaT4KLSA8Y29kZT4mbHQ7RGlyZWN0b3J5TWF0Y2gmZ3Q7PC9jb2RlPiwgYW5kCi0gPGNvZGU+Jmx0O0RpcmVjdG9yeSZndDs8L2NvZGU+IHdpdGggcmVndWxhciBleHByZXNzaW9ucwotCi08L2xpPgotCi0gPGxpPjxjb2RlPiZsdDtGaWxlcyZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7RmlsZXNNYXRjaCZndDs8L2NvZGU+IGRvbmUgc2ltdWx0YW5lb3VzbHkKLSA8L2xpPgotCi0gPGxpPjxjb2RlPiZsdDtMb2NhdGlvbiZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7TG9jYXRpb25NYXRjaCZndDs8L2NvZGU+IGRvbmUgc2ltdWx0YW5lb3VzbHkKLSA8L2xpPgotCi08L29sPgotCi1BcGFydCBmcm9tIDxjb2RlPiZsdDtEaXJlY3RvcnkmZ3Q7PC9jb2RlPiwgZWFjaCBncm91cCBpcyBwcm9jZXNzZWQgaW4KLXRoZSBvcmRlciB0aGF0IHRoZXkgYXBwZWFyIGluIHRoZSBjb25maWd1cmF0aW9uCi1maWxlcy4gPGNvZGU+Jmx0O0RpcmVjdG9yeSZndDs8L2NvZGU+IChncm91cCAxIGFib3ZlKSBpcyBwcm9jZXNzZWQgaW4KLXRoZSBvcmRlciBzaG9ydGVzdCBkaXJlY3RvcnkgY29tcG9uZW50IHRvIGxvbmdlc3QuIElmIG11bHRpcGxlCi08Y29kZT4mbHQ7RGlyZWN0b3J5Jmd0OzwvY29kZT4gc2VjdGlvbnMgYXBwbHkgdG8gdGhlIHNhbWUgZGlyZWN0b3J5Ci10aGV5IHRoZXkgYXJlIHByb2Nlc3NlZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIG9yZGVyLiAgVGhlCi1jb25maWd1cmF0aW9uIGZpbGVzIGFyZSByZWFkIGluIHRoZSBvcmRlciBodHRwZC5jb25mLCBzcm0uY29uZiBhbmQKLWFjY2Vzcy5jb25mLiBDb25maWd1cmF0aW9ucyBpbmNsdWRlZCB2aWEgdGhlIDxjb2RlPkluY2x1ZGU8L2NvZGU+Ci1kaXJlY3RpdmUgd2lsbCBiZSB0cmVhdGVkIGFzIGlmIHRoZXkgd2hlcmUgaW5zaWRlIHRoZSBpbmNsdWRpbmcgZmlsZQotYXQgdGhlIGxvY2F0aW9uIG9mIHRoZSA8Y29kZT5JbmNsdWRlPC9jb2RlPiBkaXJlY3RpdmUuCi0KLTxwPgotCi1TZWN0aW9ucyBpbnNpZGUgPGNvZGU+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvY29kZT4gc2VjdGlvbnMgYXJlIGFwcGxpZWQKLTxpPmFmdGVyPC9pPiB0aGUgY29ycmVzcG9uZGluZyBzZWN0aW9ucyBvdXRzaWRlIHRoZSB2aXJ0dWFsIGhvc3QKLWRlZmluaXRpb24uIFRoaXMgYWxsb3dzIHZpcnR1YWwgaG9zdHMgdG8gb3ZlcnJpZGUgdGhlIG1haW4gc2VydmVyCi1jb25maWd1cmF0aW9uLiAoTm90ZTogdGhpcyBvbmx5IHdvcmtzIGNvcnJlY3RseSBmcm9tIDEuMi4yIGFuZCAxLjNhMgotb253YXJkcy4gQmVmb3JlIHRob3NlIHJlbGVhc2VzIHNlY3Rpb25zIGluc2lkZSB2aXJ0dWFsIGhvc3RzIHdlcmUKLWFwcGxpZWQgPGk+YmVmb3JlPC9pPiB0aGUgbWFpbiBzZXJ2ZXIpLgotCi08aDI+Tm90ZXMgYWJvdXQgdXNpbmcgc2VjdGlvbnM8L2gyPgotCi1UaGUgZ2VuZXJhbCBndWlkZWxpbmVzIGFyZToKLQotPHA+Ci0KLTx1bD4KLTxsaT4KLSAgICBJZiB5b3UgYXJlIGF0dGVtcHRpbmcgdG8gbWF0Y2ggb2JqZWN0cyBhdCB0aGUgZmlsZXN5c3RlbSBsZXZlbAotICAgIHRoZW4geW91IG11c3QgdXNlIDxjb2RlPiZsdDtEaXJlY3RvcnkmZ3Q7PC9jb2RlPiBhbmQvb3IKLSAgICA8Y29kZT4mbHQ7RmlsZXMmZ3Q7PC9jb2RlPi4KLTwvbGk+Ci0KLTxsaT4KLSAgICBJZiB5b3UgYXJlIGF0dGVtcHRpbmcgdG8gbWF0Y2ggb2JqZWN0cyBhdCB0aGUgVVJMIGxldmVsIHRoZW4geW91Ci0gICAgbXVzdCB1c2UgPGNvZGU+Jmx0O0xvY2F0aW9uJmd0OzwvY29kZT4KLTwvbGk+Ci08L3VsPgotCi1CdXQgYSBub3RhYmxlIGV4Y2VwdGlvbiBpczoKLQotPHVsPgotPGxpPgotICAgIHByb3h5IGNvbnRyb2wgaXMgZG9uZSB2aWEgPGNvZGU+Jmx0O0RpcmVjdG9yeSZndDs8L2NvZGU+LiAgVGhpcyBpcwotICAgIGEgbGVnYWN5IG1pc3Rha2UgYmVjYXVzZSB0aGUgcHJveHkgZXhpc3RlZCBwcmlvciB0bwotICAgIDxjb2RlPiZsdDtMb2NhdGlvbiZndDs8L2NvZGU+LiAgQSBmdXR1cmUgdmVyc2lvbiBvZiB0aGUgY29uZmlnCi0gICAgbGFuZ3VhZ2Ugc2hvdWxkIHByb2JhYmx5IHN3aXRjaCB0aGlzIHRvCi0gICAgPGNvZGU+Jmx0O0xvY2F0aW9uJmd0OzwvY29kZT4uCi08L2xpPgotPC91bD4KLQotTm90ZSBhbHNvIHRoYXQgbW9kaWZ5aW5nIC5odGFjY2VzcyBwYXJzaW5nIGR1cmluZyBMb2NhdGlvbiBkb2Vzbid0IGRvCi1hbnl0aGluZyBiZWNhdXNlIC5odGFjY2VzcyBwYXJzaW5nIGhhcyBhbHJlYWR5IG9jY3VyZWQuCi0KLTxwPgotCi1Bbm90aGVyIG5vdGU6Ci08cD4KLQotPHVsPgotPGxpPgotICAgIFRoZXJlIGlzIGFjdHVhbGx5IGEKLSAgICA8Y29kZT4mbHQ7TG9jYXRpb24mZ3Q7PC9jb2RlPi88Y29kZT4mbHQ7TG9jYXRpb25NYXRjaCZndDs8L2NvZGU+Ci0gICAgc2VxdWVuY2UgcGVyZm9ybWVkIGp1c3QgYmVmb3JlIHRoZSBuYW1lIHRyYW5zbGF0aW9uIHBoYXNlICh3aGVyZQotICAgIDxjb2RlPkFsaWFzZXM8L2NvZGU+IGFuZCA8Y29kZT5Eb2N1bWVudFJvb3RzPC9jb2RlPiBhcmUgdXNlZCB0bwotICAgIG1hcCBVUkxzIHRvIGZpbGVuYW1lcykuICBUaGUgcmVzdWx0cyBvZiB0aGlzIHNlcXVlbmNlIGFyZQotICAgIGNvbXBsZXRlbHkgdGhyb3duIGF3YXkgYWZ0ZXIgdGhlIHRyYW5zbGF0aW9uIGhhcyBjb21wbGV0ZWQuCi08L2xpPgotPC91bD4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9zZXJ2ZXItd2lkZS5odG1sIGIvZG9jcy9tYW51YWwvc2VydmVyLXdpZGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYzNmU0OS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9zZXJ2ZXItd2lkZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+U2VydmVyLVdpZGUgQ29uZmlndXJhdGlvbjwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPGgxIGFsaWduPSJjZW50ZXIiPlNlcnZlci1XaWRlIENvbmZpZ3VyYXRpb248L2gxPgotCi08cD5UaGlzIGRvY3VtZW50IGV4cGxhaW5zIHNvbWUgb2YgdGhlIGRpcmVjdGl2ZXMgcHJvdmlkZWQgYnkKLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwiPmNvcmU8L0E+IHNlcnZlciB3aGljaCBhcmUgdXNlZCB0byBjb25maWd1cmUKLXRoZSBiYXNpYyBvcGVyYXRpb25zIG9mIHRoZSBzZXJ2ZXIuPC9wPgotCi08dWw+Ci08bGk+PGEgaHJlZj0iI2lkZW50aWZpY2F0aW9uIj5TZXJ2ZXIgSWRlbnRpZmljYXRpb248L2E+PC9saT4KLTxsaT48YSBocmVmPSIjbG9jYXRpb25zIj5GaWxlIExvY2F0aW9uczwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNwcm9jZXNzIj5Qcm9jZXNzIENyZWF0aW9uPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI25ldHdvcmsiPk5ldHdvcmsgQ29uZmlndXJhdGlvbjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNyZXNvdXJjZSI+TGltaXRpbmcgUmVzb3VyY2UgVXNhZ2U8L2E+PC9saT4KLTwvdWw+Ci0KLTxocj4KLQotPGgyPjxhIG5hbWU9ImlkZW50ZmljYXRpb24iPlNlcnZlciBJZGVudGlmaWNhdGlvbjwvYT48L2gyPgotCi08dGFibGUgYm9yZGVyPSIxIj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiPgotPHN0cm9uZz5SZWxhdGVkIERpcmVjdGl2ZXM8L3N0cm9uZz48YnI+PGJyPgotCi08QSBIUkVGPSJtb2QvY29yZS5odG1sI3NlcnZlcm5hbWUiPlNlcnZlck5hbWU8L0E+PGJyPgotPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNzZXJ2ZXJhZG1pbiI+U2VydmVyQWRtaW48L0E+PGJyPgotPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNzZXJ2ZXJzaWduYXR1cmUiPlNlcnZlclNpZ25hdHVyZTwvQT48YnI+Ci08QSBIUkVGPSJtb2QvY29yZS5odG1sI3NlcnZlcnRva2VucyI+U2VydmVyVG9rZW5zPC9BPjxicj4KLTxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjdXNlY2Fub25pY2FsbmFtZSI+VXNlQ2Fub25pY2FsTmFtZTwvQT48YnI+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+VGhlIDxjb2RlPlNlcnZlckFkbWluPC9jb2RlPiBhbmQgPGNvZGU+U2VydmVyVG9rZW5zPC9jb2RlPgotZGlyZWN0aXZlcyBjb250cm9sIHdoYXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcnZlciB3aWxsIGJlIHByZXNlbnRlZAotaW4gc2VydmVyLWdlbmVyYXRlZCBkb2N1bWVudHMgc3VjaCBhcyBlcnJvciBtZXNzYWdlcy4KLVRoZSA8Y29kZT5TZXJ2ZXJUb2tlbnM8L2NvZGU+IGRpcmVjdGl2ZSBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgCi1TZXJ2ZXIgSFRUUCByZXNwb25zZSBoZWFkZXIgZmllbGQuPC9wPgotCi08cD5UaGUgPGNvZGU+U2VydmVyTmFtZTwvY29kZT4gYW5kIDxjb2RlPlVzZUNhbm9uaWNhbE5hbWU8L2NvZGU+Ci1kaXJlY3RpdmVzIGFyZSB1c2VkIGJ5IHRoZSBzZXJ2ZXIgdG8gZGV0ZXJtaW5lIGhvdyB0byBjb25zdHJ1Y3QKLXNlbGYtcmVmZXJlbnRpYWwgVVJMcy4gIEZvciBleGFtcGxlLCB3aGVuIGEgY2xpZW50IHJlcXVlc3RzIGEKLWRpcmVjdG9yeSwgYnV0IGRvZXMgbm90IGluY2x1ZGUgdGhlIHRyYWlsaW5nIHNsYXNoIGluIHRoZSBkaXJlY3RvcnkKLW5hbWUsIEFwYWNoZSBtdXN0IHJlZGlyZWN0IHRoZSBjbGllbnQgdG8gdGhlIGZ1bGwgbmFtZSBpbmNsdWRpbmcgdGhlCi10cmFpbGluZyBzbGFzaCBzbyB0aGF0IHRoZSBjbGllbnQgd2lsbCBjb3JyZWN0bHkgcmVzb2x2ZSByZWxhdGl2ZQotcmVmZXJlbmNlcyBpbiB0aGUgZG9jdW1lbnQuPC9wPgotCi08aHI+Ci0KLTxoMj48YSBuYW1lPSJsb2NhdGlvbnMiPkZpbGUgTG9jYXRpb25zPC9hPjwvaDI+Ci0KLTx0YWJsZSBib3JkZXI9IjEiPgotPHRyPjx0ZCB2YWxpZ249InRvcCI+Ci08c3Ryb25nPlJlbGF0ZWQgRGlyZWN0aXZlczwvc3Ryb25nPjxicj48YnI+Ci0KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjY29yZWR1bXBkaXJlY3RvcnkiPkNvcmVEdW1wRGlyZWN0b3J5PC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjZG9jdW1lbnRyb290Ij5Eb2N1bWVudFJvb3Q8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNlcnJvcmxvZyI+RXJyb3JMb2c8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNsb2NrZmlsZSI+TG9ja2ZpbGU8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNwaWRmaWxlIj5QaWRGaWxlPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjc2NvcmVib2FyZGZpbGUiPlNjb3JlQm9hcmRGaWxlPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvYT48YnI+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+VGhlc2UgZGlyZWN0aXZlcyBjb250cm9sIHRoZSBsb2NhdGlvbnMgb2YgdGhlIHZhcmlvdXMgZmlsZXMgdGhhdAotQXBhY2hlIG5lZWRzIGZvciBwcm9wZXIgb3BlcmF0aW9uLiAgV2hlbiB0aGUgcGF0aG5hbWUgdXNlZCBkb2VzIG5vdAotYmVnaW4gd2l0aCBhIHNsYXNoICIvIiwgdGhlIGZpbGVzIGFyZSBsb2NhdGVkIHJlbGF0aXZlIHRvIHRoZQotPGNvZGU+U2VydmVyUm9vdDwvY29kZT4uICBCZSBjYXJlZnVsIGFib3V0IGxvY2F0aW5nIGZpbGVzIGluIHBhdGhzCi13aGljaCBhcmUgd3JpdGFibGUgYnkgbm9uLXJvb3QgdXNlcnMuICBTZWUgdGhlIDxhCi1ocmVmPSJtaXNjL3NlY3VyaXR5X3RpcHMuaHRtbCI+c2VjdXJpdHkgdGlwczwvYT4gZG9jdW1lbnRhdGlvbiBmb3IKLW1vcmUgZGV0YWlscy48L3A+Ci0KLTxocj4KLQotPGgyPjxhIG5hbWU9InByb2Nlc3MiPlByb2Nlc3MgQ3JlYXRpb248L2E+PC9oMj4KLQotPHRhYmxlIGJvcmRlcj0iMSI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIj4KLTxzdHJvbmc+UmVsYXRlZCBEaXJlY3RpdmVzPC9zdHJvbmc+PGJyPjxicj4KLQotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNiczIwMDBhY2NvdW50Ij5CUzIwMDBBY2NvdW50PC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjZ3JvdXAiPkdyb3VwPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjYmF4Y2xpZW50cyI+TWF4Q2xpZW50czwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI21heHJlcXVlc3RzcGVyY2hpbGQiPk1heFJlcXVlc3RzUGVyQ2hpbGQ8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNtYXhzcGFyZXNlcnZlcnMiPk1heFNwYXJlU2VydmVyczwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI21pbnNwYXJlc2VydmVycyI+TWluU3BhcmVTZXJ2ZXJzPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjc2VydmVydHlwZSI+U2VydmVyVHlwZTwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI3N0YXJ0c2VydmVycyI+U3RhcnRTZXJ2ZXJzPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjdGhyZWFkc3BlcmNoaWxkIj5UaHJlYWRzUGVyQ2hpbGQ8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCN1c2VyIj5Vc2VyPC9hPjxicj4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD5XaGVuIDxjb2RlPlNlcnZlclR5cGU8L2NvZGU+IGlzIHNldCB0byBpdHMgcmVjb21tZW5kZWQgdmFsdWUgb2YKLTxjb2RlPlN0YW5kYWxvbmU8L2NvZGU+LCBBcGFjaGUgMS4zIGZvciBVbml4IGlzIGEgcHJlLWZvcmtpbmcgd2ViCi1zZXJ2ZXIuICBBIHNpbmdsZSBjb250cm9sIHByb2Nlc3MgaXMgcmVzcG9uc2libGUgZm9yIGxhdW5jaGluZyBjaGlsZAotcHJvY2Vzc2VzIHdoaWNoIGxpc3RlbiBmb3IgY29ubmVjdGlvbnMgYW5kIHNlcnZlIHRoZW0gd2hlbiB0aGV5Ci1hcnJpdmUuICBBcGFjaGUgYWx3YXlzIHRyaWVzIHRvIG1haW50YWluIHNldmVyYWwgPGVtPnNwYXJlPC9lbT4gb3IKLWlkbGUgc2VydmVyIHByb2Nlc3Nlcywgd2hpY2ggc3RhbmQgcmVhZHkgdG8gc2VydmUgaW5jb21pbmcgcmVxdWVzdHMuCi1JbiB0aGlzIHdheSwgY2xpZW50cyBkbyBub3QgbmVlZCB0byB3YWl0IGZvciBhIG5ldyBjaGlsZCBwcm9jZXNzZXMgdG8KLWJlIGZvcmtlZCBiZWZvcmUgdGhlaXIgcmVxdWVzdHMgY2FuIGJlIHNlcnZlZC48L3A+Ci0KLTxwPlRoZSA8Y29kZT5TdGFydFNlcnZlcnM8L2NvZGU+LCA8Y29kZT5NaW5TcGFyZVNlcnZlcnM8L2NvZGU+LAotPGNvZGU+TWF4U3BhcmVTZXJ2ZXJzPC9jb2RlPiwgYW5kIDxjb2RlPk1heFNlcnZlcnM8L2NvZGU+IHJlZ3VsYXRlIGhvdwotdGhlIHBhcmVudCBwcm9jZXNzIGNyZWF0ZXMgY2hpbGRyZW4gdG8gc2VydmUgcmVxdWVzdHMuICBJbiBnZW5lcmFsLAotQXBhY2hlIGlzIHZlcnkgc2VsZi1yZWd1bGF0aW5nLCBzbyBtb3N0IHNpdGVzIGRvIG5vdCBuZWVkIHRvIGFkanVzdAotdGhlc2UgZGlyZWN0aXZlcyBmcm9tIHRoZWlyIGRlZmF1bHQgdmFsdWVzLiAgU2l0ZXMgd2hpY2ggbmVlZCB0byBzZXJ2ZQotbW9yZSB0aGFuIDI1NiBzaW11bHRhbmVvdXMgcmVxdWVzdHMgbWF5IG5lZWQgdG8gaW5jcmVhc2UKLTxjb2RlPk1heENsaWVudHM8L2NvZGU+LCB3aGlsZSBzaXRlcyB3aXRoIGxpbWl0ZWQgbWVtb3J5IG1heSBuZWVkIHRvCi1kZWNyZWFzZSA8Y29kZT5NYXhDbGllbnRzPC9jb2RlPiB0byBrZWVwIHRoZSBzZXJ2ZXIgZnJvbSB0aHJhc2hpbmcKLShzd2FwcGluZyBtZW1vcnkgdG8gZGlzayBhbmQgYmFjaykuPC9wPgotCi08cD5XaGlsZSB0aGUgcGFyZW50IHByb2Nlc3MgaXMgdXN1YWxseSBzdGFydGVkIGFzIHJvb3QgdW5kZXIgVW5peAotaW4gb3JkZXIgdG8gYmluZCB0byBwb3J0IDgwLCB0aGUgY2hpbGQgcHJvY2Vzc2VzIGFyZSBsYXVuY2hlZAotYnkgQXBhY2hlIGFzIGEgbGVzcy1wcml2aWxlZ2VkIHVzZXIuICBUaGUgPGNvZGU+VXNlcjwvY29kZT4gYW5kCi08Y29kZT5Hcm91cDwvY29kZT4gZGlyZWN0aXZlcyBhcmUgdXNlZCB0byBzZXQgdGhlIHByaXZpbGVnZXMKLW9mIHRoZSBBcGFjaGUgY2hpbGQgcHJvY2Vzc2VzLiAgVGhlIGNoaWxkIHByb2Nlc3NlcyBtdXN0Ci1iZSBhYmxlIHRvIHJlYWQgYWxsIHRoZSBjb250ZW50IHRoYXQgd2lsbCBiZSBzZXJ2ZWQsIGJ1dAotc2hvdWxkIGhhdmUgYXMgZmV3IHByaXZpbGVnZXMgYmV5b25kIHRoYXQgYXMgcG9zc2libGUuCi1JbiBhZGRpdGlvbiwgdW5sZXNzIDxhIGhyZWY9InN1ZXhlYy5odG1sIj5zdWV4ZWM8L2E+IGlzIHVzZWQsCi10aGVzZSBkaXJlY3RpdmVzIGFsc28gc2V0IHRoZSBwcml2aWxlZ2VzIHdoaWNoIHdpbGwgYmUgaW5oZXJpdGVkCi1ieSBDR0kgc2NyaXB0cy48L3A+Ci0KLTxwPjxjb2RlPk1heFJlcXVlc3RzUGVyQ2hpbGQ8L2NvZGU+IGNvbnRyb2xzIGhvdyBmcmVxdWVudGx5IHRoZSBzZXJ2ZXIKLXJlY3ljbGVzIHByb2Nlc3NlcyBieSBraWxsaW5nIG9sZCBvbmVzIGFuZCBsYXVuY2hpbmcgbmV3IG9uZXMuPC9wPgotCi08cD5VbmRlciBXaW5kb3dzLCBBcGFjaGUgbGF1bmNoZXMgb25lIGNvbnRyb2wgcHJvY2VzcyBhbmQgb25lCi1jaGlsZCBwcm9jZXNzLiAgVGhlIGNoaWxkIHByb2Nlc3MgY3JlYXRlcyBtdWx0aXBsZSB0aHJlYWRzIHRvCi1zZXJ2ZSByZXF1ZXN0cy4gIFRoZSBudW1iZXIgb2YgdGhyZWFkcyBpcyBjb250cm9sbGVkIGJ5IHRoZQotPGNvZGU+VGhyZWFkc1BlckNoaWxkPC9jb2RlPiBkaXJlY3RpdmUuPC9wPgotCi08aHI+Ci0KLTxoMj48YSBuYW1lPSJuZXR3b3JrIj5OZXR3b3JrIENvbmZpZ3VyYXRpb248L2E+PC9oMj4KLQotPHRhYmxlIGJvcmRlcj0iMSI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIj4KLTxzdHJvbmc+UmVsYXRlZCBEaXJlY3RpdmVzPC9zdHJvbmc+PGJyPjxicj4KLQotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNiaW5kYWRkcmVzcyI+QmluZEFkZHJlc3M8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNrZWVwYWxpdmUiPktlZXBBbGl2ZTwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI2tlZXBhbGl2ZXRpbWVvdXQiPktlZXBBbGl2ZVRpbWVvdXQ8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNsaXN0ZW4iPkxpc3RlbjwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI2xpc3RlbmJhY2tsb2ciPkxpc3RlbkJhY2tMb2c8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNtYXhLZWVwYWxpdmVyZXF1ZXN0cyI+TWF4S2VlcEFsaXZlUmVxdWVzdHM8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNwb3J0Ij5Qb3J0PC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjc2VuZGJ1ZmZlcnNpemUiPlNlbmRCdWZmZXJTaXplPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjdGltZU91dCI+VGltZU91dDwvYT48YnI+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+V2hlbiBBcGFjaGUgc3RhcnRzLCBpdCBjb25uZWN0cyB0byBzb21lIHBvcnQgYW5kIGFkZHJlc3Mgb24gdGhlCi1sb2NhbCBtYWNoaW5lIGFuZCB3YWl0cyBmb3IgaW5jb21pbmcgcmVxdWVzdHMuIEJ5IGRlZmF1bHQsIGl0IGxpc3RlbnMKLXRvIGFsbCBhZGRyZXNzZXMgb24gdGhlIG1hY2hpbmUsIGFuZCB0byB0aGUgcG9ydCBhcyBzcGVjaWZpZWQgYnkgdGhlCi08Y29kZT5Qb3J0PC9jb2RlPiBkaXJlY3RpdmUgaW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uLiAgSG93ZXZlciwgaXQKLWNhbiBiZSB0b2xkIHRvIGxpc3RlbiB0byBtb3JlIHRoYW4gb25lIHBvcnQsIHRvIGxpc3RlbiB0byBvbmx5Ci1zZWxlY3RlZCBhZGRyZXNzZXMsIG9yIGEgY29tYmluYXRpb24uIFRoaXMgaXMgb2Z0ZW4gY29tYmluZWQgd2l0aCB0aGUKLTxhIGhyZWY9InZob3N0cy8iPlZpcnR1YWwgSG9zdDwvYT4gZmVhdHVyZSB3aGljaCBkZXRlcm1pbmVzIGhvdyBBcGFjaGUKLXJlc3BvbmRzIHRvIGRpZmZlcmVudCBJUCBhZGRyZXNzZXMsIGhvc3RuYW1lcyBhbmQgcG9ydHMuPC9wPgotCi08cD5UaGVyZSBhcmUgdHdvIGRpcmVjdGl2ZXMgdXNlZCB0byByZXN0cmljdCBvciBzcGVjaWZ5IHdoaWNoIGFkZHJlc3NlcwotYW5kIHBvcnRzIEFwYWNoZSBsaXN0ZW5zIHRvLiAgVGhlIDxjb2RlPkJpbmRBZGRyZXNzPC9jb2RlPiBkaXJlY3RpdmUKLWlzIHVzZWQgdG8gcmVzdHJpY3QgdGhlIHNlcnZlciB0byBsaXN0ZW5pbmcgdG8gYSBzaW5nbGUgSVAgYWRkcmVzcy4KLVRoZSA8Y29kZT5MaXN0ZW48L2NvZGU+IGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG11bHRpcGxlCi1JUCBhZGRyZXNzZXMgYW5kL29yIFBvcnRzIHRvIHdoaWNoIEFwYWNoZSB3aWxsIGxpc3Rlbi48L3A+Ci0KLTxwPlRoZSA8Y29kZT5MaXN0ZW5CYWNrTG9nPC9jb2RlPiwgPGNvZGU+U2VuZEJ1ZmZlclNpemU8L2NvZGU+LCBhbmQKLTxjb2RlPlRpbWVPdXQ8L2NvZGU+IGRpcmVjdGl2ZXMgYXJlIHVzZWQgdG8gYWRqdXN0IGhvdyBBcGFjaGUKLWludGVyYWN0cyB3aXRoIHRoZSBuZXR3b3JrLjwvcD4KLQotPHA+VGhlIDxjb2RlPktlZXBBbGl2ZTwvY29kZT4sIDxjb2RlPktlZXBBbGl2ZVRpbWVvdXQ8L2NvZGU+LCAKLWFuZCA8Y29kZT5NYXhLZWVwQWxpdmVSZXF1ZXN0czwvY29kZT4gZGlyZWN0aXZlcyBhcmUgdXNlZCB0bwotY29uZmlndXJlIGhvdyBBcGFjaGUgaGFuZGxlcyBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zLjwvcD4KLQotPGhyPgotPGgyPjxhIG5hbWU9InJlc291cmNlIj5MaW1pdGluZyBSZXNvdXJjZSBVc2FnZTwvYT48L2gyPgotPHRhYmxlIGJvcmRlcj0iMSI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIj4KLTxzdHJvbmc+UmVsYXRlZCBEaXJlY3RpdmVzPC9zdHJvbmc+PGJyPjxicj4KLQotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNsaW1pdHJlcXVlc3Rib2R5Ij5MaW1pdFJlcXVlc3RCb2R5PC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjbGltaXRyZXF1ZXN0ZmllbGRzIj5MaW1pdFJlcXVlc3RGaWVsZHM8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNsaW1pdHJlcXVlc3RmaWVsZHNpemUiPkxpbWl0UmVxdWVzdEZpZWxkc2l6ZTwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI2xpbWl0cmVxdWVzdGxpbmUiPkxpbWl0UmVxdWVzdExpbmU8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNybGltaXRjcHUiPlJMaW1pdENQVTwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI3JsaW1pdG1lbSI+UkxpbWl0TUVNPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjcmxpbWl0bnByb2MiPlJMaW1pdE5QUk9DPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjdGhyZWFkc3RhY2tzaXplIj5UaHJlYWRTdGFja1NpemU8L2E+PGJyPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPlRoZSA8Y29kZT5MaW1pdDwvY29kZT4qIGRpcmVjdGl2ZXMgYXJlIHVzZWQgdG8gcGxhY2UgbGltaXRzCi1vbiB0aGUgYW1vdW50IG9mIHJlc291cmNlcyBBcGFjaGUgd2lsbCB1c2UgaW4gcmVhZGluZyByZXF1ZXN0cwotZnJvbSBjbGllbnRzLiAgQnkgbGltaXRpbmcgdGhlc2UgdmFsdWVzLCBzb21lIGtpbmRzIG9mIGRlbmlhbAotb2Ygc2VydmljZSBhdHRhY2tzIGNhbiBiZSBtaXRpZ2F0ZWQuPC9wPgotCi08cD5UaGUgPGNvZGU+UkxpbWl0PC9jb2RlPiogZGlyZWN0aXZlcyBhcmUgdXNlZCB0byBsaW1pdCB0aGUgYW1vdW50Ci1vZiByZXNvdXJjZXMgd2hpY2ggY2FuIGJlIHVzZWQgYnkgcHJvY2Vzc2VzIGZvcmtlZCBvZmYgZnJvbQotdGhlIEFwYWNoZSBjaGlsZHJlbi4gIEluIHBhcnRpY3VsYXIsIHRoaXMgd2lsbCBjb250cm9sCi1yZXNvdXJjZXMgdXNlZCBieSBDR0kgc2NyaXB0cyBhbmQgU1NJIGV4ZWMgY29tbWFuZHMuPC9wPgotCi08cD5UaGUgPGNvZGU+VGhyZWFkU3RhY2tTaXplPC9jb2RlPiBkaXJlY3RpdmUgaXMgdXNlZCBvbmx5Ci1vbiBOZXR3YXJlIHRvIGNvbnRyb2wgdGhlIHN0b2NrIHNpemUuPC9wPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvc2VydmVyLXdpZGUuaHRtbC5lbiBiL2RvY3MvbWFudWFsL3NlcnZlci13aWRlLmh0bWwuZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MzZlNDkuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvc2VydmVyLXdpZGUuaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPlNlcnZlci1XaWRlIENvbmZpZ3VyYXRpb248L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxoMSBhbGlnbj0iY2VudGVyIj5TZXJ2ZXItV2lkZSBDb25maWd1cmF0aW9uPC9oMT4KLQotPHA+VGhpcyBkb2N1bWVudCBleHBsYWlucyBzb21lIG9mIHRoZSBkaXJlY3RpdmVzIHByb3ZpZGVkIGJ5Ci08YSBocmVmPSJtb2QvY29yZS5odG1sIj5jb3JlPC9BPiBzZXJ2ZXIgd2hpY2ggYXJlIHVzZWQgdG8gY29uZmlndXJlCi10aGUgYmFzaWMgb3BlcmF0aW9ucyBvZiB0aGUgc2VydmVyLjwvcD4KLQotPHVsPgotPGxpPjxhIGhyZWY9IiNpZGVudGlmaWNhdGlvbiI+U2VydmVyIElkZW50aWZpY2F0aW9uPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI2xvY2F0aW9ucyI+RmlsZSBMb2NhdGlvbnM8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjcHJvY2VzcyI+UHJvY2VzcyBDcmVhdGlvbjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNuZXR3b3JrIj5OZXR3b3JrIENvbmZpZ3VyYXRpb248L2E+PC9saT4KLTxsaT48YSBocmVmPSIjcmVzb3VyY2UiPkxpbWl0aW5nIFJlc291cmNlIFVzYWdlPC9hPjwvbGk+Ci08L3VsPgotCi08aHI+Ci0KLTxoMj48YSBuYW1lPSJpZGVudGZpY2F0aW9uIj5TZXJ2ZXIgSWRlbnRpZmljYXRpb248L2E+PC9oMj4KLQotPHRhYmxlIGJvcmRlcj0iMSI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIj4KLTxzdHJvbmc+UmVsYXRlZCBEaXJlY3RpdmVzPC9zdHJvbmc+PGJyPjxicj4KLQotPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNzZXJ2ZXJuYW1lIj5TZXJ2ZXJOYW1lPC9BPjxicj4KLTxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjc2VydmVyYWRtaW4iPlNlcnZlckFkbWluPC9BPjxicj4KLTxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjc2VydmVyc2lnbmF0dXJlIj5TZXJ2ZXJTaWduYXR1cmU8L0E+PGJyPgotPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNzZXJ2ZXJ0b2tlbnMiPlNlcnZlclRva2VuczwvQT48YnI+Ci08QSBIUkVGPSJtb2QvY29yZS5odG1sI3VzZWNhbm9uaWNhbG5hbWUiPlVzZUNhbm9uaWNhbE5hbWU8L0E+PGJyPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPlRoZSA8Y29kZT5TZXJ2ZXJBZG1pbjwvY29kZT4gYW5kIDxjb2RlPlNlcnZlclRva2VuczwvY29kZT4KLWRpcmVjdGl2ZXMgY29udHJvbCB3aGF0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZXJ2ZXIgd2lsbCBiZSBwcmVzZW50ZWQKLWluIHNlcnZlci1nZW5lcmF0ZWQgZG9jdW1lbnRzIHN1Y2ggYXMgZXJyb3IgbWVzc2FnZXMuCi1UaGUgPGNvZGU+U2VydmVyVG9rZW5zPC9jb2RlPiBkaXJlY3RpdmUgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIAotU2VydmVyIEhUVFAgcmVzcG9uc2UgaGVhZGVyIGZpZWxkLjwvcD4KLQotPHA+VGhlIDxjb2RlPlNlcnZlck5hbWU8L2NvZGU+IGFuZCA8Y29kZT5Vc2VDYW5vbmljYWxOYW1lPC9jb2RlPgotZGlyZWN0aXZlcyBhcmUgdXNlZCBieSB0aGUgc2VydmVyIHRvIGRldGVybWluZSBob3cgdG8gY29uc3RydWN0Ci1zZWxmLXJlZmVyZW50aWFsIFVSTHMuICBGb3IgZXhhbXBsZSwgd2hlbiBhIGNsaWVudCByZXF1ZXN0cyBhCi1kaXJlY3RvcnksIGJ1dCBkb2VzIG5vdCBpbmNsdWRlIHRoZSB0cmFpbGluZyBzbGFzaCBpbiB0aGUgZGlyZWN0b3J5Ci1uYW1lLCBBcGFjaGUgbXVzdCByZWRpcmVjdCB0aGUgY2xpZW50IHRvIHRoZSBmdWxsIG5hbWUgaW5jbHVkaW5nIHRoZQotdHJhaWxpbmcgc2xhc2ggc28gdGhhdCB0aGUgY2xpZW50IHdpbGwgY29ycmVjdGx5IHJlc29sdmUgcmVsYXRpdmUKLXJlZmVyZW5jZXMgaW4gdGhlIGRvY3VtZW50LjwvcD4KLQotPGhyPgotCi08aDI+PGEgbmFtZT0ibG9jYXRpb25zIj5GaWxlIExvY2F0aW9uczwvYT48L2gyPgotCi08dGFibGUgYm9yZGVyPSIxIj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiPgotPHN0cm9uZz5SZWxhdGVkIERpcmVjdGl2ZXM8L3N0cm9uZz48YnI+PGJyPgotCi08YSBocmVmPSJtb2QvY29yZS5odG1sI2NvcmVkdW1wZGlyZWN0b3J5Ij5Db3JlRHVtcERpcmVjdG9yeTwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI2RvY3VtZW50cm9vdCI+RG9jdW1lbnRSb290PC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjZXJyb3Jsb2ciPkVycm9yTG9nPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjbG9ja2ZpbGUiPkxvY2tmaWxlPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjcGlkZmlsZSI+UGlkRmlsZTwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI3Njb3JlYm9hcmRmaWxlIj5TY29yZUJvYXJkRmlsZTwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI3NlcnZlcnJvb3QiPlNlcnZlclJvb3Q8L2E+PGJyPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPlRoZXNlIGRpcmVjdGl2ZXMgY29udHJvbCB0aGUgbG9jYXRpb25zIG9mIHRoZSB2YXJpb3VzIGZpbGVzIHRoYXQKLUFwYWNoZSBuZWVkcyBmb3IgcHJvcGVyIG9wZXJhdGlvbi4gIFdoZW4gdGhlIHBhdGhuYW1lIHVzZWQgZG9lcyBub3QKLWJlZ2luIHdpdGggYSBzbGFzaCAiLyIsIHRoZSBmaWxlcyBhcmUgbG9jYXRlZCByZWxhdGl2ZSB0byB0aGUKLTxjb2RlPlNlcnZlclJvb3Q8L2NvZGU+LiAgQmUgY2FyZWZ1bCBhYm91dCBsb2NhdGluZyBmaWxlcyBpbiBwYXRocwotd2hpY2ggYXJlIHdyaXRhYmxlIGJ5IG5vbi1yb290IHVzZXJzLiAgU2VlIHRoZSA8YQotaHJlZj0ibWlzYy9zZWN1cml0eV90aXBzLmh0bWwiPnNlY3VyaXR5IHRpcHM8L2E+IGRvY3VtZW50YXRpb24gZm9yCi1tb3JlIGRldGFpbHMuPC9wPgotCi08aHI+Ci0KLTxoMj48YSBuYW1lPSJwcm9jZXNzIj5Qcm9jZXNzIENyZWF0aW9uPC9hPjwvaDI+Ci0KLTx0YWJsZSBib3JkZXI9IjEiPgotPHRyPjx0ZCB2YWxpZ249InRvcCI+Ci08c3Ryb25nPlJlbGF0ZWQgRGlyZWN0aXZlczwvc3Ryb25nPjxicj48YnI+Ci0KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjYnMyMDAwYWNjb3VudCI+QlMyMDAwQWNjb3VudDwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI2dyb3VwIj5Hcm91cDwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI2JheGNsaWVudHMiPk1heENsaWVudHM8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNtYXhyZXF1ZXN0c3BlcmNoaWxkIj5NYXhSZXF1ZXN0c1BlckNoaWxkPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjbWF4c3BhcmVzZXJ2ZXJzIj5NYXhTcGFyZVNlcnZlcnM8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNtaW5zcGFyZXNlcnZlcnMiPk1pblNwYXJlU2VydmVyczwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI3NlcnZlcnR5cGUiPlNlcnZlclR5cGU8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNzdGFydHNlcnZlcnMiPlN0YXJ0U2VydmVyczwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI3RocmVhZHNwZXJjaGlsZCI+VGhyZWFkc1BlckNoaWxkPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjdXNlciI+VXNlcjwvYT48YnI+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+V2hlbiA8Y29kZT5TZXJ2ZXJUeXBlPC9jb2RlPiBpcyBzZXQgdG8gaXRzIHJlY29tbWVuZGVkIHZhbHVlIG9mCi08Y29kZT5TdGFuZGFsb25lPC9jb2RlPiwgQXBhY2hlIDEuMyBmb3IgVW5peCBpcyBhIHByZS1mb3JraW5nIHdlYgotc2VydmVyLiAgQSBzaW5nbGUgY29udHJvbCBwcm9jZXNzIGlzIHJlc3BvbnNpYmxlIGZvciBsYXVuY2hpbmcgY2hpbGQKLXByb2Nlc3NlcyB3aGljaCBsaXN0ZW4gZm9yIGNvbm5lY3Rpb25zIGFuZCBzZXJ2ZSB0aGVtIHdoZW4gdGhleQotYXJyaXZlLiAgQXBhY2hlIGFsd2F5cyB0cmllcyB0byBtYWludGFpbiBzZXZlcmFsIDxlbT5zcGFyZTwvZW0+IG9yCi1pZGxlIHNlcnZlciBwcm9jZXNzZXMsIHdoaWNoIHN0YW5kIHJlYWR5IHRvIHNlcnZlIGluY29taW5nIHJlcXVlc3RzLgotSW4gdGhpcyB3YXksIGNsaWVudHMgZG8gbm90IG5lZWQgdG8gd2FpdCBmb3IgYSBuZXcgY2hpbGQgcHJvY2Vzc2VzIHRvCi1iZSBmb3JrZWQgYmVmb3JlIHRoZWlyIHJlcXVlc3RzIGNhbiBiZSBzZXJ2ZWQuPC9wPgotCi08cD5UaGUgPGNvZGU+U3RhcnRTZXJ2ZXJzPC9jb2RlPiwgPGNvZGU+TWluU3BhcmVTZXJ2ZXJzPC9jb2RlPiwKLTxjb2RlPk1heFNwYXJlU2VydmVyczwvY29kZT4sIGFuZCA8Y29kZT5NYXhTZXJ2ZXJzPC9jb2RlPiByZWd1bGF0ZSBob3cKLXRoZSBwYXJlbnQgcHJvY2VzcyBjcmVhdGVzIGNoaWxkcmVuIHRvIHNlcnZlIHJlcXVlc3RzLiAgSW4gZ2VuZXJhbCwKLUFwYWNoZSBpcyB2ZXJ5IHNlbGYtcmVndWxhdGluZywgc28gbW9zdCBzaXRlcyBkbyBub3QgbmVlZCB0byBhZGp1c3QKLXRoZXNlIGRpcmVjdGl2ZXMgZnJvbSB0aGVpciBkZWZhdWx0IHZhbHVlcy4gIFNpdGVzIHdoaWNoIG5lZWQgdG8gc2VydmUKLW1vcmUgdGhhbiAyNTYgc2ltdWx0YW5lb3VzIHJlcXVlc3RzIG1heSBuZWVkIHRvIGluY3JlYXNlCi08Y29kZT5NYXhDbGllbnRzPC9jb2RlPiwgd2hpbGUgc2l0ZXMgd2l0aCBsaW1pdGVkIG1lbW9yeSBtYXkgbmVlZCB0bwotZGVjcmVhc2UgPGNvZGU+TWF4Q2xpZW50czwvY29kZT4gdG8ga2VlcCB0aGUgc2VydmVyIGZyb20gdGhyYXNoaW5nCi0oc3dhcHBpbmcgbWVtb3J5IHRvIGRpc2sgYW5kIGJhY2spLjwvcD4KLQotPHA+V2hpbGUgdGhlIHBhcmVudCBwcm9jZXNzIGlzIHVzdWFsbHkgc3RhcnRlZCBhcyByb290IHVuZGVyIFVuaXgKLWluIG9yZGVyIHRvIGJpbmQgdG8gcG9ydCA4MCwgdGhlIGNoaWxkIHByb2Nlc3NlcyBhcmUgbGF1bmNoZWQKLWJ5IEFwYWNoZSBhcyBhIGxlc3MtcHJpdmlsZWdlZCB1c2VyLiAgVGhlIDxjb2RlPlVzZXI8L2NvZGU+IGFuZAotPGNvZGU+R3JvdXA8L2NvZGU+IGRpcmVjdGl2ZXMgYXJlIHVzZWQgdG8gc2V0IHRoZSBwcml2aWxlZ2VzCi1vZiB0aGUgQXBhY2hlIGNoaWxkIHByb2Nlc3Nlcy4gIFRoZSBjaGlsZCBwcm9jZXNzZXMgbXVzdAotYmUgYWJsZSB0byByZWFkIGFsbCB0aGUgY29udGVudCB0aGF0IHdpbGwgYmUgc2VydmVkLCBidXQKLXNob3VsZCBoYXZlIGFzIGZldyBwcml2aWxlZ2VzIGJleW9uZCB0aGF0IGFzIHBvc3NpYmxlLgotSW4gYWRkaXRpb24sIHVubGVzcyA8YSBocmVmPSJzdWV4ZWMuaHRtbCI+c3VleGVjPC9hPiBpcyB1c2VkLAotdGhlc2UgZGlyZWN0aXZlcyBhbHNvIHNldCB0aGUgcHJpdmlsZWdlcyB3aGljaCB3aWxsIGJlIGluaGVyaXRlZAotYnkgQ0dJIHNjcmlwdHMuPC9wPgotCi08cD48Y29kZT5NYXhSZXF1ZXN0c1BlckNoaWxkPC9jb2RlPiBjb250cm9scyBob3cgZnJlcXVlbnRseSB0aGUgc2VydmVyCi1yZWN5Y2xlcyBwcm9jZXNzZXMgYnkga2lsbGluZyBvbGQgb25lcyBhbmQgbGF1bmNoaW5nIG5ldyBvbmVzLjwvcD4KLQotPHA+VW5kZXIgV2luZG93cywgQXBhY2hlIGxhdW5jaGVzIG9uZSBjb250cm9sIHByb2Nlc3MgYW5kIG9uZQotY2hpbGQgcHJvY2Vzcy4gIFRoZSBjaGlsZCBwcm9jZXNzIGNyZWF0ZXMgbXVsdGlwbGUgdGhyZWFkcyB0bwotc2VydmUgcmVxdWVzdHMuICBUaGUgbnVtYmVyIG9mIHRocmVhZHMgaXMgY29udHJvbGxlZCBieSB0aGUKLTxjb2RlPlRocmVhZHNQZXJDaGlsZDwvY29kZT4gZGlyZWN0aXZlLjwvcD4KLQotPGhyPgotCi08aDI+PGEgbmFtZT0ibmV0d29yayI+TmV0d29yayBDb25maWd1cmF0aW9uPC9hPjwvaDI+Ci0KLTx0YWJsZSBib3JkZXI9IjEiPgotPHRyPjx0ZCB2YWxpZ249InRvcCI+Ci08c3Ryb25nPlJlbGF0ZWQgRGlyZWN0aXZlczwvc3Ryb25nPjxicj48YnI+Ci0KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjYmluZGFkZHJlc3MiPkJpbmRBZGRyZXNzPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwja2VlcGFsaXZlIj5LZWVwQWxpdmU8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNrZWVwYWxpdmV0aW1lb3V0Ij5LZWVwQWxpdmVUaW1lb3V0PC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjbGlzdGVuIj5MaXN0ZW48L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNsaXN0ZW5iYWNrbG9nIj5MaXN0ZW5CYWNrTG9nPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjbWF4S2VlcGFsaXZlcmVxdWVzdHMiPk1heEtlZXBBbGl2ZVJlcXVlc3RzPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjcG9ydCI+UG9ydDwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI3NlbmRidWZmZXJzaXplIj5TZW5kQnVmZmVyU2l6ZTwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI3RpbWVPdXQiPlRpbWVPdXQ8L2E+PGJyPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPldoZW4gQXBhY2hlIHN0YXJ0cywgaXQgY29ubmVjdHMgdG8gc29tZSBwb3J0IGFuZCBhZGRyZXNzIG9uIHRoZQotbG9jYWwgbWFjaGluZSBhbmQgd2FpdHMgZm9yIGluY29taW5nIHJlcXVlc3RzLiBCeSBkZWZhdWx0LCBpdCBsaXN0ZW5zCi10byBhbGwgYWRkcmVzc2VzIG9uIHRoZSBtYWNoaW5lLCBhbmQgdG8gdGhlIHBvcnQgYXMgc3BlY2lmaWVkIGJ5IHRoZQotPGNvZGU+UG9ydDwvY29kZT4gZGlyZWN0aXZlIGluIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbi4gIEhvd2V2ZXIsIGl0Ci1jYW4gYmUgdG9sZCB0byBsaXN0ZW4gdG8gbW9yZSB0aGFuIG9uZSBwb3J0LCB0byBsaXN0ZW4gdG8gb25seQotc2VsZWN0ZWQgYWRkcmVzc2VzLCBvciBhIGNvbWJpbmF0aW9uLiBUaGlzIGlzIG9mdGVuIGNvbWJpbmVkIHdpdGggdGhlCi08YSBocmVmPSJ2aG9zdHMvIj5WaXJ0dWFsIEhvc3Q8L2E+IGZlYXR1cmUgd2hpY2ggZGV0ZXJtaW5lcyBob3cgQXBhY2hlCi1yZXNwb25kcyB0byBkaWZmZXJlbnQgSVAgYWRkcmVzc2VzLCBob3N0bmFtZXMgYW5kIHBvcnRzLjwvcD4KLQotPHA+VGhlcmUgYXJlIHR3byBkaXJlY3RpdmVzIHVzZWQgdG8gcmVzdHJpY3Qgb3Igc3BlY2lmeSB3aGljaCBhZGRyZXNzZXMKLWFuZCBwb3J0cyBBcGFjaGUgbGlzdGVucyB0by4gIFRoZSA8Y29kZT5CaW5kQWRkcmVzczwvY29kZT4gZGlyZWN0aXZlCi1pcyB1c2VkIHRvIHJlc3RyaWN0IHRoZSBzZXJ2ZXIgdG8gbGlzdGVuaW5nIHRvIGEgc2luZ2xlIElQIGFkZHJlc3MuCi1UaGUgPGNvZGU+TGlzdGVuPC9jb2RlPiBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBtdWx0aXBsZQotSVAgYWRkcmVzc2VzIGFuZC9vciBQb3J0cyB0byB3aGljaCBBcGFjaGUgd2lsbCBsaXN0ZW4uPC9wPgotCi08cD5UaGUgPGNvZGU+TGlzdGVuQmFja0xvZzwvY29kZT4sIDxjb2RlPlNlbmRCdWZmZXJTaXplPC9jb2RlPiwgYW5kCi08Y29kZT5UaW1lT3V0PC9jb2RlPiBkaXJlY3RpdmVzIGFyZSB1c2VkIHRvIGFkanVzdCBob3cgQXBhY2hlCi1pbnRlcmFjdHMgd2l0aCB0aGUgbmV0d29yay48L3A+Ci0KLTxwPlRoZSA8Y29kZT5LZWVwQWxpdmU8L2NvZGU+LCA8Y29kZT5LZWVwQWxpdmVUaW1lb3V0PC9jb2RlPiwgCi1hbmQgPGNvZGU+TWF4S2VlcEFsaXZlUmVxdWVzdHM8L2NvZGU+IGRpcmVjdGl2ZXMgYXJlIHVzZWQgdG8KLWNvbmZpZ3VyZSBob3cgQXBhY2hlIGhhbmRsZXMgcGVyc2lzdGVudCBjb25uZWN0aW9ucy48L3A+Ci0KLTxocj4KLTxoMj48YSBuYW1lPSJyZXNvdXJjZSI+TGltaXRpbmcgUmVzb3VyY2UgVXNhZ2U8L2E+PC9oMj4KLTx0YWJsZSBib3JkZXI9IjEiPgotPHRyPjx0ZCB2YWxpZ249InRvcCI+Ci08c3Ryb25nPlJlbGF0ZWQgRGlyZWN0aXZlczwvc3Ryb25nPjxicj48YnI+Ci0KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjbGltaXRyZXF1ZXN0Ym9keSI+TGltaXRSZXF1ZXN0Qm9keTwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI2xpbWl0cmVxdWVzdGZpZWxkcyI+TGltaXRSZXF1ZXN0RmllbGRzPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjbGltaXRyZXF1ZXN0ZmllbGRzaXplIj5MaW1pdFJlcXVlc3RGaWVsZHNpemU8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNsaW1pdHJlcXVlc3RsaW5lIj5MaW1pdFJlcXVlc3RMaW5lPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjcmxpbWl0Y3B1Ij5STGltaXRDUFU8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNybGltaXRtZW0iPlJMaW1pdE1FTTwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI3JsaW1pdG5wcm9jIj5STGltaXROUFJPQzwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI3RocmVhZHN0YWNrc2l6ZSI+VGhyZWFkU3RhY2tTaXplPC9hPjxicj4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD5UaGUgPGNvZGU+TGltaXQ8L2NvZGU+KiBkaXJlY3RpdmVzIGFyZSB1c2VkIHRvIHBsYWNlIGxpbWl0cwotb24gdGhlIGFtb3VudCBvZiByZXNvdXJjZXMgQXBhY2hlIHdpbGwgdXNlIGluIHJlYWRpbmcgcmVxdWVzdHMKLWZyb20gY2xpZW50cy4gIEJ5IGxpbWl0aW5nIHRoZXNlIHZhbHVlcywgc29tZSBraW5kcyBvZiBkZW5pYWwKLW9mIHNlcnZpY2UgYXR0YWNrcyBjYW4gYmUgbWl0aWdhdGVkLjwvcD4KLQotPHA+VGhlIDxjb2RlPlJMaW1pdDwvY29kZT4qIGRpcmVjdGl2ZXMgYXJlIHVzZWQgdG8gbGltaXQgdGhlIGFtb3VudAotb2YgcmVzb3VyY2VzIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IHByb2Nlc3NlcyBmb3JrZWQgb2ZmIGZyb20KLXRoZSBBcGFjaGUgY2hpbGRyZW4uICBJbiBwYXJ0aWN1bGFyLCB0aGlzIHdpbGwgY29udHJvbAotcmVzb3VyY2VzIHVzZWQgYnkgQ0dJIHNjcmlwdHMgYW5kIFNTSSBleGVjIGNvbW1hbmRzLjwvcD4KLQotPHA+VGhlIDxjb2RlPlRocmVhZFN0YWNrU2l6ZTwvY29kZT4gZGlyZWN0aXZlIGlzIHVzZWQgb25seQotb24gTmV0d2FyZSB0byBjb250cm9sIHRoZSBzdG9jayBzaXplLjwvcD4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3NlcnZlci13aWRlLmh0bWwuamEuamlzIGIvZG9jcy9tYW51YWwvc2VydmVyLXdpZGUuaHRtbC5qYS5qaXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZDdkMjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvc2VydmVyLXdpZGUuaHRtbC5qYS5qaXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5TZXJ2ZXItV2lkZSBDb25maWd1cmF0aW9uPC90aXRsZT4KLTwvaGVhZD4KLTwhLS0gRW5nbGlzaCByZXZpc2lvbjogMS42IC0tPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Ym9keQotIGJnY29sb3I9IiNGRkZGRkYiCi0gdGV4dD0iIzAwMDAwMCIKLSBsaW5rPSIjMDAwMEZGIgotIHZsaW5rPSIjMDAwMDgwIgotIGFsaW5rPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxoMSBhbGlnbj0iY2VudGVyIj4bJEIlNSE8JVBBNEJOJE5AX0RqGyhCPC9oMT4KLQotPHA+GyRCJDMkTiVJJS0lZSVhJXMlSCRHJE8bKEI8YSBocmVmPSJtb2QvY29yZS5odG1sIj4bJEIlMyUiGyhCPC9hPhskQiU1ITwlUCROGyhCCi0bJEIlRyUjJWwlLyVGJSMlViROQ2YkRyEiNHBLXEYwOm4kckBfRGokOSRrJD8kYSROJGIkTiRyQGJMQCQ3JF4kOSEjGyhCPC9wPgotCi08dWw+Ci08bGk+PGEgaHJlZj0iI2lkZW50aWZpY2F0aW9uIj4bJEIlNSE8JVAbKEIgSUQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjbG9jYXRpb25zIj4bJEIlVSUhJSQlayROMExDVhsoQjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNyZXNvdXJjZSI+GyRCJWolPSE8JTkkTkApOEIbKEI8L2E+PC9saT4KLTwvdWw+Ci0KLTxocj4KLQotPGgyPjxhIG5hbWU9ImlkZW50aWZpY2F0aW9uIj4bJEIlNSE8JVAbKEIgSUQ8L2E+PC9oMj4KLQotPHRhYmxlIGJvcmRlcj0iMSI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIj4KLTxzdHJvbmc+GyRCNFhPIiVHJSMlbCUvJUYlIyVWGyhCPC9zdHJvbmc+PGJyPjxicj4KLQotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNzZXJ2ZXJuYW1lIj5TZXJ2ZXJOYW1lPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjc2VydmVyYWRtaW4iPlNlcnZlckFkbWluPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjc2VydmVyc2lnbmF0dXJlIj5TZXJ2ZXJTaWduYXR1cmU8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNzZXJ2ZXJ0b2tlbnMiPlNlcnZlclRva2VuczwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI3VzZWNhbm9uaWNhbG5hbWUiPlVzZUNhbm9uaWNhbE5hbWU8L2E+PGJyPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPjxjb2RlPlNlcnZlckFkbWluPC9jb2RlPiAbJEIlRyUjJWwlLyVGJSMlViRIGyhCIDxjb2RlPlNlcnZlclRva2VuczwvY29kZT4KLRskQiVHJSMlbCUvJUYlIyVWJE8hIiUoJWkhPCVhJUMlOyE8JTgkSiRJJE4lNSE8JVAkLDpuJGslSSUtJWUlYSVzJUgkSyEiGyhCCi0bJEIkSSROJGgkJiRKJTUhPCVQJE4+cEpzJHJJPTwoJDkkayQrJHJAKThmJDckXiQ5ISMbKEI8Y29kZT5TZXJ2ZXJUb2tlbnM8L2NvZGU+Ci0bJEIlRyUjJWwlLyVGJSMlViRPISIbKEJTZXJ2ZXIgSFRUUCAbJEIlbCU5JV0lcyU5JVglQyVAJVUlIyE8JWslSSROQ00kchsoQgotGyRCQF9EaiQ3JF4kOSEjGyhCPC9wPgotCi08cD48Y29kZT5TZXJ2ZXJOYW1lPC9jb2RlPiAbJEIlRyUjJWwlLyVGJSMlViRIGyhCIDxjb2RlPlVzZUNhbm9uaWNhbE5hbWU8L2NvZGU+Ci0bJEIlRyUjJWwlLyVGJSMlViRPISIlNSE8JVAkLDwrSiw8Kz9IJHI7Mj5IJDkkaxsoQiBVUkwgGyRCJHI6biRrJEgkLSRLGyhCCi0bJEI7SCRvJGwkXiQ5ISMkPyRIJCgkUCEiJS8laSUkJSIlcyVIJCwlRyUjJWwlLyVIJWokck1XNWEkNyRGISIbKEIKLRskQiQ9JE4lRyUjJWwlLyVIJWpMPiROOkc4ZSRLJTklaSVDJTclZSQsSVUkJCRGJCQkSiQkJGgkJiRKPmw5ZyRLJE8hIhsoQgotGyRCJUklLSVlJWElcyVIJE5BakJQRSokSjsyPkgkckA1JDckLzJyN2gkRyQtJGskaCQmJEskOSRrJD8kYSRLISIbKEIKLUFwYWNoZSAbJEIkTzpHOGUkTiU5JWklQyU3JWUkcjReJHMkQDQwQTQkSiVRJTkkSyUvJWklJCUiJXMlSCRyGyhCCi0bJEIlaiVAJSQlbCUvJUgkNSQ7JGtJLE1XJCwkIiRqJF4kOSEjGyhCPC9wPgotCi08aHI+Ci0KLTxoMj48YSBuYW1lPSJsb2NhdGlvbnMiPhskQiVVJSElJCVrJE4wTENWGyhCPC9hPjwvaDI+Ci0KLTx0YWJsZSBib3JkZXI9IjEiPgotPHRyPjx0ZCB2YWxpZ249InRvcCI+Ci08c3Ryb25nPhskQjRYTyIlRyUjJWwlLyVGJSMlVhsoQjwvc3Ryb25nPjxicj48YnI+Ci0KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjY29yZWR1bXBkaXJlY3RvcnkiPkNvcmVEdW1wRGlyZWN0b3J5PC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjZG9jdW1lbnRyb290Ij5Eb2N1bWVudFJvb3Q8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNlcnJvcmxvZyI+RXJyb3JMb2c8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNsb2NrZmlsZSI+TG9ja2ZpbGU8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNwaWRmaWxlIj5QaWRGaWxlPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjc2NvcmVib2FyZGZpbGUiPlNjb3JlQm9hcmRGaWxlPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvYT48YnI+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+GyRCJDMkbCRpJE4lRyUjJWwlLyVGJSMlViRPGyhCIEFwYWNoZSAbJEIkLEUsQFokSkYwOm4kciQ5JGskPyRhJEtJLE1XJEobKEIKLRskQjNGPG8lVSUhJSQlayROMExDViRyQCk4ZiQ3JF4kOSEjJVElOSQsJTklaSVDJTclZRsoQiAiLyIgGyRCJEc7TyReJEMkRiQkJEokJBsoQgotGyRCJEgkLSRPISIlVSUhJSQlayRPGyhCIDxjb2RlPlNlcnZlclJvb3Q8L2NvZGU+IBskQiQrJGkkTkFqQlAlUSU5JEgkNyRGGyhCCi0bJEJDNSQ1JGwkXiQ5ISMbKEJyb290IBskQjBKMzAkTiVmITwlNiQsPXEkLTl+JF8yREc9JEolUSU5JEslVSUhJSQlayRyGyhCCi0bJEJDViQvPmw5ZyRPQ20wVSQsSSxNVyRHJDkhIz5cOlkkTxsoQjxhCi1ocmVmPSJtaXNjL3NlY3VyaXR5X3RpcHMuaHRtbCI+GyRCIVYlOyUtJWUlaiVGJSM+cEpzIVcbKEI8L2E+GyRCJHIbKEIKLRskQjsyPkgkNyRGJC8kQCQ1JCQhIxsoQjwvcD4KLQotPGhyPgotPGgyPjxhIG5hbWU9InJlc291cmNlIj4bJEIlaiU9ITwlOSROQCk4QhsoQjwvYT48L2gyPgotPHRhYmxlIGJvcmRlcj0iMSI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIj4KLTxzdHJvbmc+GyRCNFhPIiVHJSMlbCUvJUYlIyVWGyhCPC9zdHJvbmc+PGJyPjxicj4KLQotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNsaW1pdHJlcXVlc3Rib2R5Ij5MaW1pdFJlcXVlc3RCb2R5PC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjbGltaXRyZXF1ZXN0ZmllbGRzIj5MaW1pdFJlcXVlc3RGaWVsZHM8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNsaW1pdHJlcXVlc3RmaWVsZHNpemUiPkxpbWl0UmVxdWVzdEZpZWxkc2l6ZTwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI2xpbWl0cmVxdWVzdGxpbmUiPkxpbWl0UmVxdWVzdExpbmU8L2E+PGJyPgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNybGltaXRjcHUiPlJMaW1pdENQVTwvYT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI3JsaW1pdG1lbSI+UkxpbWl0TUVNPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjcmxpbWl0bnByb2MiPlJMaW1pdE5QUk9DPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjdGhyZWFkc3RhY2tzaXplIj5UaHJlYWRTdGFja1NpemU8L2E+PGJyPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPjxjb2RlPkxpbWl0UmVxdWVzdDwvY29kZT4qIBskQiVHJSMlbCUvJUYlIyVWJE8bKEIgQXBhY2hlIBskQiQsGyhCCi0bJEIlLyVpJSQlIiVzJUgkKyRpJE4laiUvJSglOSVIRkkkXzl+JF8kRztIJCYlaiU9ITwlOSRyQCk4QiQ5JGskPyRhJEsbKEIKLRskQjtIJG8kbCReJDkhIyQzJGwkaSROQ00kckApOEIkOSRrJDMkSCRHISIkJCQvJEQkKyROJTUhPCVTJTk1cUhdOTY3YiRPGyhCCi0bJEIxRjZBJHJPQiRpJDIkayQzJEgkLCRHJC0kXiQ5ISMbKEI8L3A+Ci0KLTxwPjxjb2RlPlJMaW1pdDwvY29kZT4qIBskQiVHJSMlbCUvJUYlIyVWJE8hIhsoQkFwYWNoZSAbJEIkTjtSJVclbSU7JTkkKyRpGyhCCi1mb3JrIBskQiQ1JGwkPyVXJW0lOyU5JCw7SE1RJDkkayVqJT0hPCU5JHJAKThCJDkkayQ/JGEkSxsoQgotGyRCO0gkbyRsJF4kOSEjRkMkSyEiJDMkbCRPGyhCIENHSSAbJEIlOSUvJWolVyVIJEgbKEIgU1NJIGV4ZWMgGyRCJTMlXiVzJUkkRxsoQgotGyRCO0gkbyRsJGslaiU9ITwlOSRyQCk4ZiQ3JF4kOSEjGyhCPC9wPgotCi08cD48Y29kZT5UaHJlYWRTdGFja1NpemU8L2NvZGU+IBskQiRPGyhCIE5ldHdhcmUgGyRCJEckTiRfISIlOSU/JUMlLyROQmckLSQ1JHIbKEIKLRskQkApOGYkOSRrJD8kYSRLO0gkbyRsJF4kOSEjGyhCPC9wPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvc2l0ZW1hcC5odG1sIGIvZG9jcy9tYW51YWwvc2l0ZW1hcC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGUyMWRhLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL3NpdGVtYXAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotICA8aGVhZD4KLSAgICA8dGl0bGU+U2l0ZSBNYXAgLSBBcGFjaGUgSFRUUCBTZXJ2ZXIgMi4wPC90aXRsZT4KLSAgPC9oZWFkPgotICA8IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci0KLSAgPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdGV4dD0iIzAwMDAwMCIgbGluaz0iIzAwMDBGRiIKLSAgdmxpbms9IiMwMDAwODAiIGFsaW5rPSIjRkYwMDAwIj4KLSAgICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotCi0gICAgPGgxIGFsaWduPSJjZW50ZXIiPlNpdGUgTWFwPC9oMT4KLQotPHVsPgotPGxpPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkFwYWNoZSBIVFRQIFNlcnZlciBWZXJzaW9uIDIuMCBEb2N1bWVudGF0aW9uPC9hPgotCi08dWw+Ci08bGk+UmVsZWFzZSBOb3RlcwotPHVsPgotPGxpPjxhIGhyZWY9InVwZ3JhZGluZy5odG1sIj5VcGdyYWRpbmcgdG8gMi4wIGZyb20gMS4zPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibmV3X2ZlYXR1cmVzXzJfMC5odG1sIj5OZXcgZmVhdHVyZXMgd2l0aCBBcGFjaGUgMi4wPC9hPjwvbGk+Ci08L3VsPjwvbGk+Ci0KLTxsaT5Vc2luZyB0aGUgQXBhY2hlIEhUVFAgU2VydmVyCi08dWw+Ci08bGk+PGEgaHJlZj0iaW5zdGFsbC5odG1sIj5Db21waWxpbmcgYW5kIEluc3RhbGxpbmcgQXBhY2hlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaW52b2tpbmcuaHRtbCI+U3RhcnRpbmcgQXBhY2hlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ic3RvcHBpbmcuaHRtbCI+U3RvcHBpbmcgYW5kIFJlc3RhcnRpbmcgdGhlIFNlcnZlcjwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImNvbmZpZ3VyaW5nLmh0bWwiPkNvbmZpZ3VyYXRpb24gRmlsZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJzZWN0aW9ucy5odG1sIj5Ib3cgRGlyZWN0b3J5LCBMb2NhdGlvbiBhbmQgRmlsZXMgc2VjdGlvbnMgd29yazwvYT48L2xpPgotPGxpPjxhIGhyZWY9InNlcnZlci13aWRlLmh0bWwiPlNlcnZlci1XaWRlIENvbmZpZ3VyYXRpb248L2E+PC9saT4KLTxsaT48YSBocmVmPSJsb2dzLmh0bWwiPkxvZyBGaWxlczwvYT48L2xpPgotPGxpPjxhIGhyZWY9InVybG1hcHBpbmcuaHRtbCI+TWFwcGluZyBVUkxzIHRvIEZpbGVzeXN0ZW0gTG9jYXRpb25zPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibWlzYy9zZWN1cml0eV90aXBzLmh0bWwiPlNlY3VyaXR5IFRpcHM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJkc28uaHRtbCI+RHluYW1pYyBTaGFyZWQgT2JqZWN0IChEU08pIHN1cHBvcnQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSJjb250ZW50LW5lZ290aWF0aW9uLmh0bWwiPkNvbnRlbnQgTmVnb3RpYXRpb248L2E+PC9saT4KLTxsaT48YSBocmVmPSJjdXN0b20tZXJyb3IuaHRtbCI+Q3VzdG9tIGVycm9yIHJlc3BvbnNlczwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImJpbmQuaHRtbCI+U2V0dGluZyB3aGljaCBhZGRyZXNzZXMgYW5kIHBvcnRzIEFwYWNoZSB1c2VzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibXBtLmh0bWwiPk11bHRpLVByb2Nlc3NpbmcgTW9kdWxlcyAoTVBNcyk8L2E+PC9saT4KLTxsaT48YSBocmVmPSJlbnYuaHRtbCI+RW52aXJvbm1lbnQgVmFyaWFibGVzIGluIEFwYWNoZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImhhbmRsZXIuaHRtbCI+QXBhY2hlJ3MgSGFuZGxlciBVc2U8L2E+PC9saT4KLTxsaT48YSBocmVmPSJmaWx0ZXIuaHRtbCI+RmlsdGVyczwvYT48L2xpPgotPGxpPjxhIGhyZWY9InN1ZXhlYy5odG1sIj5zdUVYRUMgU3VwcG9ydDwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1pc2MvcGVyZi10dW5pbmcuaHRtbCI+UGVyZm9ybWFuY2UgSGludGVzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibWlzYy9yZXdyaXRlZ3VpZGUuaHRtbCI+VVJMIFJld3JpdGluZyBHdWlkZTwvYT48L2xpPgotPC91bD48L2xpPgotCi08bGk+PGEgaHJlZj0idmhvc3RzL2luZGV4Lmh0bWwiPkFwYWNoZSBWaXJ0dWFsIEhvc3QgZG9jdW1lbnRhdGlvbjwvYT4KLTx1bD4KLTxsaT48YSBocmVmPSJ2aG9zdHMvbmFtZS1iYXNlZC5odG1sIj5OYW1lLWJhc2VkIFZpcnR1YWwgSG9zdHM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJ2aG9zdHMvaXAtYmFzZWQuaHRtbCI+SVAtYmFzZWQgVmlydHVhbCBIb3N0IFN1cHBvcnQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSJ2aG9zdHMvbWFzcy5odG1sIj5EeW5hbWljYWxseSBjb25maWd1cmVkIG1hc3MgdmlydHVhbCBob3N0aW5nPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idmhvc3RzL2V4YW1wbGVzLmh0bWwiPlZpcnR1YWxIb3N0IEV4YW1wbGVzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idmhvc3RzL2RldGFpbHMuaHRtbCI+QW4gSW4tRGVwdGggRGlzY3Vzc2lvbiBvZiBWaXJ0dWFsIEhvc3QgTWF0Y2hpbmc8L2E+PC9saT4KLTxsaT48YSBocmVmPSJ2aG9zdHMvZmQtbGltaXRzLmh0bWwiPkZpbGUgZGVzY3JpcHRvciBsaW1pdGF0aW9uczwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImRucy1jYXZlYXRzLmh0bWwiPklzc3VlcyBSZWdhcmRpbmcgRE5TIGFuZCBBcGFjaGU8L2E+PC9saT4KLTwvdWw+PC9saT4KLQotPGxpPjxhIGhyZWY9ImZhcS9pbmRleC5odG1sIj5BcGFjaGUgU2VydmVyIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC9hPgotPHVsPgotPGxpPjxhIGhyZWY9ImZhcS9zdXBwb3J0Lmh0bWwiPlN1cHBvcnQ8L2E+PC9saT4KLTwvdWw+PC9saT4KLQotPGxpPjxhIGhyZWY9InNzbC9pbmRleC5odG1sIj5BcGFjaGUgU1NML1RMUyBFbmNyeXB0aW9uPC9hPgotPHVsPgotPGxpPjxhIGhyZWY9InNzbC9zc2xfaW50cm8uaHRtbCI+U1NML1RMUyBFbmNyeXB0aW9uOiBBbiBJbnRyb2R1Y3Rpb248L2E+PC9saT4KLTxsaT48YSBocmVmPSJzc2wvc3NsX2NvbXBhdC5odG1sIj5TU0wvVExTIEVuY3J5cHRpb246IENvbXBhdGliaWxpdHk8L2E+PC9saT4KLTxsaT48YSBocmVmPSJzc2wvc3NsX2hvd3RvLmh0bWwiPlNTTC9UTFMgRW5jcnlwdGlvbjogSG93LVRvPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ic3NsL3NzbF9mYXEuaHRtbCI+U1NML1RMUyBFbmNyeXB0aW9uOiBGQVE8L2E+PC9saT4KLTxsaT48YSBocmVmPSJzc2wvc3NsX2dsb3NzYXJ5Lmh0bWwiPlNTTC9UTFMgRW5jcnlwdGlvbjogR2xvc3Nhcnk8L2E+PC9saT4KLTwvdWw+PC9saT4KLQotCi08bGk+R3VpZGVzLCBUdXRvcmlhbHMsIGFuZCBIb3dUb3MKLTx1bD4KLTxsaT48YSBocmVmPSJob3d0by9hdXRoLmh0bWwiPkF1dGhlbnRpY2F0aW9uPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaG93dG8vY2dpLmh0bWwiPkFwYWNoZSBUdXRvcmlhbDogRHluYW1pYyBDb250ZW50IHdpdGggQ0dJPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaG93dG8vc3NpLmh0bWwiPkFwYWNoZSBUdXRvcmlhbDogSW50cm9kdWN0aW9uIHRvIFNlcnZlcgotU2lkZSBJbmNsdWRlczwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1pc2MvdHV0b3JpYWxzLmh0bWwiPkFwYWNoZSBUdXRvcmlhbHM8L2E+PC9saT4KLTwvdWw+PC9saT4KLQotCi08bGk+UGxhdGZyb20tc3BlY2lmaWMgTm90ZXMKLTx1bD4KLTxsaT48YSBocmVmPSJwbGF0Zm9ybS93aW5kb3dzLmh0bWwiPlVzaW5nIEFwYWNoZSB3aXRoIE1pY3Jvc29mdAotV2luZG93czwvYT48L2xpPgotPGxpPjxhIGhyZWY9InBsYXRmb3JtL3dpbl9jb21waWxpbmcuaHRtbCI+Q29tcGlsaW5nIEFwYWNoZSBmb3IKLU1pY3Jvc29mdCBXaW5kb3dzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icGxhdGZvcm0vd2luX3NlcnZpY2UuaHRtbCI+UnVubmluZyBBcGFjaGUgZm9yIFdpbmRvd3MgYXMKLWEgU2VydmljZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9InBsYXRmb3JtL25ldHdhcmUuaHRtbCI+VXNpbmcgQXBhY2hlIHdpdGggTm92ZWxsIE5ldFdhcmU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJwbGF0Zm9ybS9wZXJmLWhwLmh0bWwiPlJ1bm5pbmcgYSBIaWdoLVBlcmZvcm1hbmNlIFdlYgotU2VydmVyIG9uIEhQVVg8L2E+PC9saT4KLTxsaT48YSBocmVmPSJlYmNkaWMuaHRtbCI+VGhlIEFwYWNoZSBFQkNESUMgUG9ydDwvYT48L2xpPgotPC91bD48L2xpPgotCi08bGk+PGEgaHJlZj0icHJvZ3JhbXMvaW5kZXguaHRtbCI+QXBhY2hlIEhUVFAgU2VydmVyIGFuZCBTdXBwb3J0aW5nIFByb2dyYW1zPC9hPgotPHVsPgotPGxpPjxhIGhyZWY9InByb2dyYW1zL2h0dHBkLmh0bWwiPk1hbnVhbCBQYWdlOiBodHRwZDwvYT48L2xpPgotPGxpPjxhIGhyZWY9InByb2dyYW1zL2FiLmh0bWwiPk1hbnVhbCBQYWdlOiBhYjwvYT48L2xpPgotPGxpPjxhIGhyZWY9InByb2dyYW1zL2FwYWNoZWN0bC5odG1sIj5NYW51YWwgUGFnZTogYXBhY2hlY3RsPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icHJvZ3JhbXMvYXB4cy5odG1sIj5NYW51YWwgUGFnZTogYXB4czwvYT48L2xpPgotPGxpPjxhIGhyZWY9InByb2dyYW1zL2RibW1hbmFnZS5odG1sIj5NYW51YWwgUGFnZTogZGJtbWFuYWdlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icHJvZ3JhbXMvaHRkaWdlc3QuaHRtbCI+TWFudWFsIFBhZ2U6IGh0ZGlnZXN0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icHJvZ3JhbXMvaHRwYXNzd2QuaHRtbCI+TWFudWFsIFBhZ2U6IGh0cGFzc3dkPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icHJvZ3JhbXMvbG9ncmVzb2x2ZS5odG1sIj5NYW51YWwgUGFnZTogbG9ncmVzb2x2ZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9InByb2dyYW1zL3JvdGF0ZWxvZ3MuaHRtbCI+TWFudWFsIFBhZ2U6IHJvdGF0ZWxvZ3M8L2E+PC9saT4KLTxsaT48YSBocmVmPSJwcm9ncmFtcy9zdWV4ZWMuaHRtbCI+TWFudWFsIFBhZ2U6IHN1ZXhlYzwvYT48L2xpPgotPGxpPjxhIGhyZWY9InByb2dyYW1zL290aGVyLmh0bWwiPk90aGVyIFByb2dyYW1zPC9hPjwvbGk+Ci08L3VsPjwvbGk+Ci0KLTxsaT48YSBocmVmPSJtaXNjL2luZGV4Lmh0bWwiPkFwYWNoZSBNaXNjZWxsYW5lb3VzIERvY3VtZW50YXRpb248L2E+Ci08dWw+Ci08bGk+PGEgaHJlZj0ibWlzYy9jdXN0b21fZXJyb3Jkb2NzLmh0bWwiPkludGVybmF0aW9uYWwgQ3VzdG9taXplZCBTZXJ2ZXIgRXJyb3IgTWVzc2FnZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtaXNjL2Zpbl93YWl0XzIuaHRtbCI+Q29ubmVjdGlvbnMgaW4gRklOX1dBSVRfMiBhbmQgQXBhY2hlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibWlzYy9rbm93bl9jbGllbnRfcHJvYmxlbXMuaHRtbCI+S25vd24gQ2xpZW50IFByb2JsZW1zPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibWlzYy9kZXNjcmlwdG9ycy5odG1sIj5EZXNjcmlwdG9ycyBhbmQgQXBhY2hlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iY2dpX3BhdGguaHRtbCI+UEFUSF9JTkZPIENoYW5nZXMgaW4gdGhlIENHSSBFbnZpcm9ubWVudDwvYT48L2xpPgotPC91bD48L2xpPgotCi08bGk+PGEgaHJlZj0ibW9kL2luZGV4Lmh0bWwiPkFwYWNoZSBtb2R1bGVzPC9hPgotPHVsPgotPGxpPjxhIGhyZWY9Im1vZC9pbmRleC1ieXR5cGUuaHRtbCI+QXBhY2hlIG1vZHVsZXMgLSBCeSBUeXBlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL2RpcmVjdGl2ZXMuaHRtbCI+QXBhY2hlIGRpcmVjdGl2ZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kdWxlLWRpY3QuaHRtbCI+RGVmaW5pdGlvbnMgb2YgdGVybXMgdXNlZCB0byBkZXNjcmliZSBBcGFjaGUgbW9kdWxlczwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9kaXJlY3RpdmUtZGljdC5odG1sIj5EZWZpbml0aW9ucyBvZiB0ZXJtcyB1c2VkIHRvIGRlc2NyaWJlIEFwYWNoZSBkaXJlY3RpdmVzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL2NvcmUuaHRtbCI+QXBhY2hlIENvcmUgRmVhdHVyZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbXBtX2NvbW1vbi5odG1sIj5BcGFjaGUgTVBNIENvbW1vbiBEaXJlY3RpdmVzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21wbV9uZXR3YXJlLmh0bWwiPkFwYWNoZSBNUE0gbmV0d2FyZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tcG1fd2lubnQuaHRtbCI+QXBhY2hlIE1QTSB3aW5udDwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9wZXJjaGlsZC5odG1sIj5BcGFjaGUgTVBNIHBlcmNoaWxkPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL3ByZWZvcmsuaHRtbCI+QXBhY2hlIE1QTSBwcmVmb3JrPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL3RocmVhZGVkLmh0bWwiPkFwYWNoZSBNUE0gdGhyZWFkZWQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX2FjY2Vzcy5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9hY2Nlc3M8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX2FjdGlvbnMuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2RfYWN0aW9uczwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfYWxpYXMuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2RfYWxpYXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX2FzaXMuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2RfYXNpczwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfYXV0aC5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9hdXRoPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9hdXRoX2Fub24uaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2RfYXV0aF9hbm9uLmM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX2F1dGhfZGIuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2RfYXV0aF9kYjwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfYXV0aF9kYm0uaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2RfYXV0aF9kYm08L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX2F1dGhfZGlnZXN0Lmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX2F1dGhfZGlnZXN0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9hdXRoX2xkYXAuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2RfbGRhcDwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfYXV0b2luZGV4Lmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX2F1dG9pbmRleDwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfY2Vybl9tZXRhLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX2Nlcm5fbWV0YTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfY2dpLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX2NnaTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfY2dpZC5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9jZ2k8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX2NoYXJzZXRfbGl0ZS5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9jaGFyc2V0X2xpdGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX2Rhdi5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9kYXY8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX2Rpci5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9kaXI8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX2Vudi5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9lbnY8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX2V4YW1wbGUuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2RfZXhhbXBsZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfZXhwaXJlcy5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9leHBpcmVzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9leHRfZmlsdGVyLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX2V4dF9maWx0ZXI8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX2ZpbGVfY2FjaGUuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2RfZmlsZV9jYWNoZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfaGVhZGVycy5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9oZWFkZXJzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9pbWFwLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX2ltYXA8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX2luY2x1ZGUuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2RfaW5jbHVkZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfaW5mby5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9pbmZvPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9pc2FwaS5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9pc2FwaTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfbGRhcC5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9sZGFwPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9sb2dfY29uZmlnLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX2xvZ19jb25maWc8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX21pbWUuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2RfbWltZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfbWltZV9tYWdpYy5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9taW1lX21hZ2ljPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9tbWFwX3N0YXRpYy5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9tbWFwX3N0YXRpYzwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfbmVnb3RpYXRpb24uaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2RfbmVnb3RpYXRpb248L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX3Byb3h5Lmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX3Byb3h5PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9yZXdyaXRlLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX3Jld3JpdGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX3NldGVudmlmLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX3NldGVudmlmPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9zby5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9zbzwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2Rfc3BlbGluZy5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9zcGVsaW5nPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9zc2wuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2Rfc3NsPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9zdGF0dXMuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2Rfc3RhdHVzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9zdWV4ZWMuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2Rfc3VleGVjPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF91bmlxdWVfaWQuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2RfdW5pcXVlX2lkPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF91c2VyZGlyLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX3VzZXJkaXI8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX3VzZXJ0cmFjay5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF91c2VydHJhY2s8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX3Zob3N0X2FsaWFzLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX3Zob3N0X2FsaWFzPC9hPjwvbGk+Ci08L3VsPjwvbGk+Ci0KLTxsaT48YSBocmVmPSJkZXZlbG9wZXIvaW5kZXguaHRtbCI+RGV2ZWxvcGVyIERvY3VtZW50YXRpb248L2E+Ci08dWw+Ci08bGk+PGEgaHJlZj0iZGV2ZWxvcGVyL0FQSS5odG1sIj5BcGFjaGUgQVBJIG5vdGVzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iZGV2ZWxvcGVyL2RlYnVnZ2luZy5odG1sIj5EZWJ1Z2dpbmcgTWVtb3J5IEFsbG9jYXRpb24gaW4gQVBSPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iZGV2ZWxvcGVyL2RvY3VtZW50aW5nLmh0bWwiPkRvY3VtZW50aW5nIEFwYWNoZSAyLjA8L2E+PC9saT4KLTxsaT48YSBocmVmPSJkZXZlbG9wZXIvaG9va3MuaHRtbCI+QXBhY2hlIDIuMCBIb29rIEZ1bmN0aW9uczwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImRldmVsb3Blci9sYXllcmVkaW8uaHRtbCI+QXBhY2hlIDIuMCBMYXllcmVkIEkvTzwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImRldmVsb3Blci9tb2R1bGVzLmh0bWwiPkNvbnZlcnRpbmcgTW9kdWxlcyBmcm9tIEFwYWNoZSAxLjMgdG8gQXBhY2hlIDIuMDwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImRldmVsb3Blci9yZXF1ZXN0Lmh0bWwiPlJlcXVlc3QgUHJvY2Vzc2luZyBpbiBBcGFjaGUgMi4wPC9hPjwvbGk+Ci08L3VsPjwvbGk+Ci0KLTwvdWw+PC9saT4KLQotPC91bD4KLQotICAgIDwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci0gIDwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9zaXRlbWFwLmh0bWwuZW4gYi9kb2NzL21hbnVhbC9zaXRlbWFwLmh0bWwuZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZTIxZGEuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvc2l0ZW1hcC5odG1sLmVuCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci0gIDxoZWFkPgotICAgIDx0aXRsZT5TaXRlIE1hcCAtIEFwYWNoZSBIVFRQIFNlcnZlciAyLjA8L3RpdGxlPgotICA8L2hlYWQ+Ci0gIDwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLQotICA8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB0ZXh0PSIjMDAwMDAwIiBsaW5rPSIjMDAwMEZGIgotICB2bGluaz0iIzAwMDA4MCIgYWxpbms9IiNGRjAwMDAiPgotICAgIDwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci0KLSAgICA8aDEgYWxpZ249ImNlbnRlciI+U2l0ZSBNYXA8L2gxPgotCi08dWw+Ci08bGk+PGEgaHJlZj0iaW5kZXguaHRtbCI+QXBhY2hlIEhUVFAgU2VydmVyIFZlcnNpb24gMi4wIERvY3VtZW50YXRpb248L2E+Ci0KLTx1bD4KLTxsaT5SZWxlYXNlIE5vdGVzCi08dWw+Ci08bGk+PGEgaHJlZj0idXBncmFkaW5nLmh0bWwiPlVwZ3JhZGluZyB0byAyLjAgZnJvbSAxLjM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJuZXdfZmVhdHVyZXNfMl8wLmh0bWwiPk5ldyBmZWF0dXJlcyB3aXRoIEFwYWNoZSAyLjA8L2E+PC9saT4KLTwvdWw+PC9saT4KLQotPGxpPlVzaW5nIHRoZSBBcGFjaGUgSFRUUCBTZXJ2ZXIKLTx1bD4KLTxsaT48YSBocmVmPSJpbnN0YWxsLmh0bWwiPkNvbXBpbGluZyBhbmQgSW5zdGFsbGluZyBBcGFjaGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJpbnZva2luZy5odG1sIj5TdGFydGluZyBBcGFjaGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJzdG9wcGluZy5odG1sIj5TdG9wcGluZyBhbmQgUmVzdGFydGluZyB0aGUgU2VydmVyPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iY29uZmlndXJpbmcuaHRtbCI+Q29uZmlndXJhdGlvbiBGaWxlczwvYT48L2xpPgotPGxpPjxhIGhyZWY9InNlY3Rpb25zLmh0bWwiPkhvdyBEaXJlY3RvcnksIExvY2F0aW9uIGFuZCBGaWxlcyBzZWN0aW9ucyB3b3JrPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ic2VydmVyLXdpZGUuaHRtbCI+U2VydmVyLVdpZGUgQ29uZmlndXJhdGlvbjwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImxvZ3MuaHRtbCI+TG9nIEZpbGVzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idXJsbWFwcGluZy5odG1sIj5NYXBwaW5nIFVSTHMgdG8gRmlsZXN5c3RlbSBMb2NhdGlvbnM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtaXNjL3NlY3VyaXR5X3RpcHMuaHRtbCI+U2VjdXJpdHkgVGlwczwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImRzby5odG1sIj5EeW5hbWljIFNoYXJlZCBPYmplY3QgKERTTykgc3VwcG9ydDwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImNvbnRlbnQtbmVnb3RpYXRpb24uaHRtbCI+Q29udGVudCBOZWdvdGlhdGlvbjwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImN1c3RvbS1lcnJvci5odG1sIj5DdXN0b20gZXJyb3IgcmVzcG9uc2VzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iYmluZC5odG1sIj5TZXR0aW5nIHdoaWNoIGFkZHJlc3NlcyBhbmQgcG9ydHMgQXBhY2hlIHVzZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtcG0uaHRtbCI+TXVsdGktUHJvY2Vzc2luZyBNb2R1bGVzIChNUE1zKTwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImVudi5odG1sIj5FbnZpcm9ubWVudCBWYXJpYWJsZXMgaW4gQXBhY2hlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaGFuZGxlci5odG1sIj5BcGFjaGUncyBIYW5kbGVyIFVzZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImZpbHRlci5odG1sIj5GaWx0ZXJzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ic3VleGVjLmh0bWwiPnN1RVhFQyBTdXBwb3J0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibWlzYy9wZXJmLXR1bmluZy5odG1sIj5QZXJmb3JtYW5jZSBIaW50ZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtaXNjL3Jld3JpdGVndWlkZS5odG1sIj5VUkwgUmV3cml0aW5nIEd1aWRlPC9hPjwvbGk+Ci08L3VsPjwvbGk+Ci0KLTxsaT48YSBocmVmPSJ2aG9zdHMvaW5kZXguaHRtbCI+QXBhY2hlIFZpcnR1YWwgSG9zdCBkb2N1bWVudGF0aW9uPC9hPgotPHVsPgotPGxpPjxhIGhyZWY9InZob3N0cy9uYW1lLWJhc2VkLmh0bWwiPk5hbWUtYmFzZWQgVmlydHVhbCBIb3N0czwvYT48L2xpPgotPGxpPjxhIGhyZWY9InZob3N0cy9pcC1iYXNlZC5odG1sIj5JUC1iYXNlZCBWaXJ0dWFsIEhvc3QgU3VwcG9ydDwvYT48L2xpPgotPGxpPjxhIGhyZWY9InZob3N0cy9tYXNzLmh0bWwiPkR5bmFtaWNhbGx5IGNvbmZpZ3VyZWQgbWFzcyB2aXJ0dWFsIGhvc3Rpbmc8L2E+PC9saT4KLTxsaT48YSBocmVmPSJ2aG9zdHMvZXhhbXBsZXMuaHRtbCI+VmlydHVhbEhvc3QgRXhhbXBsZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJ2aG9zdHMvZGV0YWlscy5odG1sIj5BbiBJbi1EZXB0aCBEaXNjdXNzaW9uIG9mIFZpcnR1YWwgSG9zdCBNYXRjaGluZzwvYT48L2xpPgotPGxpPjxhIGhyZWY9InZob3N0cy9mZC1saW1pdHMuaHRtbCI+RmlsZSBkZXNjcmlwdG9yIGxpbWl0YXRpb25zPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iZG5zLWNhdmVhdHMuaHRtbCI+SXNzdWVzIFJlZ2FyZGluZyBETlMgYW5kIEFwYWNoZTwvYT48L2xpPgotPC91bD48L2xpPgotCi08bGk+PGEgaHJlZj0iZmFxL2luZGV4Lmh0bWwiPkFwYWNoZSBTZXJ2ZXIgRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L2E+Ci08dWw+Ci08bGk+PGEgaHJlZj0iZmFxL3N1cHBvcnQuaHRtbCI+U3VwcG9ydDwvYT48L2xpPgotPC91bD48L2xpPgotCi08bGk+PGEgaHJlZj0ic3NsL2luZGV4Lmh0bWwiPkFwYWNoZSBTU0wvVExTIEVuY3J5cHRpb248L2E+Ci08dWw+Ci08bGk+PGEgaHJlZj0ic3NsL3NzbF9pbnRyby5odG1sIj5TU0wvVExTIEVuY3J5cHRpb246IEFuIEludHJvZHVjdGlvbjwvYT48L2xpPgotPGxpPjxhIGhyZWY9InNzbC9zc2xfY29tcGF0Lmh0bWwiPlNTTC9UTFMgRW5jcnlwdGlvbjogQ29tcGF0aWJpbGl0eTwvYT48L2xpPgotPGxpPjxhIGhyZWY9InNzbC9zc2xfaG93dG8uaHRtbCI+U1NML1RMUyBFbmNyeXB0aW9uOiBIb3ctVG88L2E+PC9saT4KLTxsaT48YSBocmVmPSJzc2wvc3NsX2ZhcS5odG1sIj5TU0wvVExTIEVuY3J5cHRpb246IEZBUTwvYT48L2xpPgotPGxpPjxhIGhyZWY9InNzbC9zc2xfZ2xvc3NhcnkuaHRtbCI+U1NML1RMUyBFbmNyeXB0aW9uOiBHbG9zc2FyeTwvYT48L2xpPgotPC91bD48L2xpPgotCi0KLTxsaT5HdWlkZXMsIFR1dG9yaWFscywgYW5kIEhvd1RvcwotPHVsPgotPGxpPjxhIGhyZWY9Imhvd3RvL2F1dGguaHRtbCI+QXV0aGVudGljYXRpb248L2E+PC9saT4KLTxsaT48YSBocmVmPSJob3d0by9jZ2kuaHRtbCI+QXBhY2hlIFR1dG9yaWFsOiBEeW5hbWljIENvbnRlbnQgd2l0aCBDR0k8L2E+PC9saT4KLTxsaT48YSBocmVmPSJob3d0by9zc2kuaHRtbCI+QXBhY2hlIFR1dG9yaWFsOiBJbnRyb2R1Y3Rpb24gdG8gU2VydmVyCi1TaWRlIEluY2x1ZGVzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibWlzYy90dXRvcmlhbHMuaHRtbCI+QXBhY2hlIFR1dG9yaWFsczwvYT48L2xpPgotPC91bD48L2xpPgotCi0KLTxsaT5QbGF0ZnJvbS1zcGVjaWZpYyBOb3RlcwotPHVsPgotPGxpPjxhIGhyZWY9InBsYXRmb3JtL3dpbmRvd3MuaHRtbCI+VXNpbmcgQXBhY2hlIHdpdGggTWljcm9zb2Z0Ci1XaW5kb3dzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icGxhdGZvcm0vd2luX2NvbXBpbGluZy5odG1sIj5Db21waWxpbmcgQXBhY2hlIGZvcgotTWljcm9zb2Z0IFdpbmRvd3M8L2E+PC9saT4KLTxsaT48YSBocmVmPSJwbGF0Zm9ybS93aW5fc2VydmljZS5odG1sIj5SdW5uaW5nIEFwYWNoZSBmb3IgV2luZG93cyBhcwotYSBTZXJ2aWNlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icGxhdGZvcm0vbmV0d2FyZS5odG1sIj5Vc2luZyBBcGFjaGUgd2l0aCBOb3ZlbGwgTmV0V2FyZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9InBsYXRmb3JtL3BlcmYtaHAuaHRtbCI+UnVubmluZyBhIEhpZ2gtUGVyZm9ybWFuY2UgV2ViCi1TZXJ2ZXIgb24gSFBVWDwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImViY2RpYy5odG1sIj5UaGUgQXBhY2hlIEVCQ0RJQyBQb3J0PC9hPjwvbGk+Ci08L3VsPjwvbGk+Ci0KLTxsaT48YSBocmVmPSJwcm9ncmFtcy9pbmRleC5odG1sIj5BcGFjaGUgSFRUUCBTZXJ2ZXIgYW5kIFN1cHBvcnRpbmcgUHJvZ3JhbXM8L2E+Ci08dWw+Ci08bGk+PGEgaHJlZj0icHJvZ3JhbXMvaHR0cGQuaHRtbCI+TWFudWFsIFBhZ2U6IGh0dHBkPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icHJvZ3JhbXMvYWIuaHRtbCI+TWFudWFsIFBhZ2U6IGFiPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icHJvZ3JhbXMvYXBhY2hlY3RsLmh0bWwiPk1hbnVhbCBQYWdlOiBhcGFjaGVjdGw8L2E+PC9saT4KLTxsaT48YSBocmVmPSJwcm9ncmFtcy9hcHhzLmh0bWwiPk1hbnVhbCBQYWdlOiBhcHhzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icHJvZ3JhbXMvZGJtbWFuYWdlLmh0bWwiPk1hbnVhbCBQYWdlOiBkYm1tYW5hZ2U8L2E+PC9saT4KLTxsaT48YSBocmVmPSJwcm9ncmFtcy9odGRpZ2VzdC5odG1sIj5NYW51YWwgUGFnZTogaHRkaWdlc3Q8L2E+PC9saT4KLTxsaT48YSBocmVmPSJwcm9ncmFtcy9odHBhc3N3ZC5odG1sIj5NYW51YWwgUGFnZTogaHRwYXNzd2Q8L2E+PC9saT4KLTxsaT48YSBocmVmPSJwcm9ncmFtcy9sb2dyZXNvbHZlLmh0bWwiPk1hbnVhbCBQYWdlOiBsb2dyZXNvbHZlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icHJvZ3JhbXMvcm90YXRlbG9ncy5odG1sIj5NYW51YWwgUGFnZTogcm90YXRlbG9nczwvYT48L2xpPgotPGxpPjxhIGhyZWY9InByb2dyYW1zL3N1ZXhlYy5odG1sIj5NYW51YWwgUGFnZTogc3VleGVjPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icHJvZ3JhbXMvb3RoZXIuaHRtbCI+T3RoZXIgUHJvZ3JhbXM8L2E+PC9saT4KLTwvdWw+PC9saT4KLQotPGxpPjxhIGhyZWY9Im1pc2MvaW5kZXguaHRtbCI+QXBhY2hlIE1pc2NlbGxhbmVvdXMgRG9jdW1lbnRhdGlvbjwvYT4KLTx1bD4KLTxsaT48YSBocmVmPSJtaXNjL2N1c3RvbV9lcnJvcmRvY3MuaHRtbCI+SW50ZXJuYXRpb25hbCBDdXN0b21pemVkIFNlcnZlciBFcnJvciBNZXNzYWdlczwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1pc2MvZmluX3dhaXRfMi5odG1sIj5Db25uZWN0aW9ucyBpbiBGSU5fV0FJVF8yIGFuZCBBcGFjaGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtaXNjL2tub3duX2NsaWVudF9wcm9ibGVtcy5odG1sIj5Lbm93biBDbGllbnQgUHJvYmxlbXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtaXNjL2Rlc2NyaXB0b3JzLmh0bWwiPkRlc2NyaXB0b3JzIGFuZCBBcGFjaGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJjZ2lfcGF0aC5odG1sIj5QQVRIX0lORk8gQ2hhbmdlcyBpbiB0aGUgQ0dJIEVudmlyb25tZW50PC9hPjwvbGk+Ci08L3VsPjwvbGk+Ci0KLTxsaT48YSBocmVmPSJtb2QvaW5kZXguaHRtbCI+QXBhY2hlIG1vZHVsZXM8L2E+Ci08dWw+Ci08bGk+PGEgaHJlZj0ibW9kL2luZGV4LWJ5dHlwZS5odG1sIj5BcGFjaGUgbW9kdWxlcyAtIEJ5IFR5cGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvZGlyZWN0aXZlcy5odG1sIj5BcGFjaGUgZGlyZWN0aXZlczwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2R1bGUtZGljdC5odG1sIj5EZWZpbml0aW9ucyBvZiB0ZXJtcyB1c2VkIHRvIGRlc2NyaWJlIEFwYWNoZSBtb2R1bGVzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwiPkRlZmluaXRpb25zIG9mIHRlcm1zIHVzZWQgdG8gZGVzY3JpYmUgQXBhY2hlIGRpcmVjdGl2ZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvY29yZS5odG1sIj5BcGFjaGUgQ29yZSBGZWF0dXJlczwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tcG1fY29tbW9uLmh0bWwiPkFwYWNoZSBNUE0gQ29tbW9uIERpcmVjdGl2ZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbXBtX25ldHdhcmUuaHRtbCI+QXBhY2hlIE1QTSBuZXR3YXJlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21wbV93aW5udC5odG1sIj5BcGFjaGUgTVBNIHdpbm50PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL3BlcmNoaWxkLmh0bWwiPkFwYWNoZSBNUE0gcGVyY2hpbGQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvcHJlZm9yay5odG1sIj5BcGFjaGUgTVBNIHByZWZvcms8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvdGhyZWFkZWQuaHRtbCI+QXBhY2hlIE1QTSB0aHJlYWRlZDwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfYWNjZXNzLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX2FjY2VzczwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfYWN0aW9ucy5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9hY3Rpb25zPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9hbGlhcy5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9hbGlhczwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfYXNpcy5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9hc2lzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9hdXRoLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX2F1dGg8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX2F1dGhfYW5vbi5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9hdXRoX2Fub24uYzwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfYXV0aF9kYi5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9hdXRoX2RiPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9hdXRoX2RibS5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9hdXRoX2RibTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfYXV0aF9kaWdlc3QuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2RfYXV0aF9kaWdlc3Q8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX2F1dGhfbGRhcC5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9sZGFwPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9hdXRvaW5kZXguaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2RfYXV0b2luZGV4PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9jZXJuX21ldGEuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2RfY2Vybl9tZXRhPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9jZ2kuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2RfY2dpPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9jZ2lkLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX2NnaTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfY2hhcnNldF9saXRlLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX2NoYXJzZXRfbGl0ZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfZGF2Lmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX2RhdjwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfZGlyLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX2RpcjwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfZW52Lmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX2VudjwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfZXhhbXBsZS5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9leGFtcGxlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9leHBpcmVzLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX2V4cGlyZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX2V4dF9maWx0ZXIuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2RfZXh0X2ZpbHRlcjwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfZmlsZV9jYWNoZS5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9maWxlX2NhY2hlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9oZWFkZXJzLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX2hlYWRlcnM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX2ltYXAuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2RfaW1hcDwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfaW5jbHVkZS5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9pbmNsdWRlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9pbmZvLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX2luZm88L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX2lzYXBpLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX2lzYXBpPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9sZGFwLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX2xkYXA8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX2xvZ19jb25maWcuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2RfbG9nX2NvbmZpZzwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfbWltZS5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9taW1lPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9taW1lX21hZ2ljLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX21pbWVfbWFnaWM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX21tYXBfc3RhdGljLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX21tYXBfc3RhdGljPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9uZWdvdGlhdGlvbi5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9uZWdvdGlhdGlvbjwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfcHJveHkuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2RfcHJveHk8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX3Jld3JpdGUuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2RfcmV3cml0ZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2Rfc2V0ZW52aWYuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2Rfc2V0ZW52aWY8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX3NvLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX3NvPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kL21vZF9zcGVsaW5nLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX3NwZWxpbmc8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX3NzbC5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9zc2w8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX3N0YXR1cy5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9zdGF0dXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX3N1ZXhlYy5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF9zdWV4ZWM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX3VuaXF1ZV9pZC5odG1sIj5BcGFjaGUgbW9kdWxlIG1vZF91bmlxdWVfaWQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSJtb2QvbW9kX3VzZXJkaXIuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2RfdXNlcmRpcjwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2RfdXNlcnRyYWNrLmh0bWwiPkFwYWNoZSBtb2R1bGUgbW9kX3VzZXJ0cmFjazwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZC9tb2Rfdmhvc3RfYWxpYXMuaHRtbCI+QXBhY2hlIG1vZHVsZSBtb2Rfdmhvc3RfYWxpYXM8L2E+PC9saT4KLTwvdWw+PC9saT4KLQotPGxpPjxhIGhyZWY9ImRldmVsb3Blci9pbmRleC5odG1sIj5EZXZlbG9wZXIgRG9jdW1lbnRhdGlvbjwvYT4KLTx1bD4KLTxsaT48YSBocmVmPSJkZXZlbG9wZXIvQVBJLmh0bWwiPkFwYWNoZSBBUEkgbm90ZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJkZXZlbG9wZXIvZGVidWdnaW5nLmh0bWwiPkRlYnVnZ2luZyBNZW1vcnkgQWxsb2NhdGlvbiBpbiBBUFI8L2E+PC9saT4KLTxsaT48YSBocmVmPSJkZXZlbG9wZXIvZG9jdW1lbnRpbmcuaHRtbCI+RG9jdW1lbnRpbmcgQXBhY2hlIDIuMDwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImRldmVsb3Blci9ob29rcy5odG1sIj5BcGFjaGUgMi4wIEhvb2sgRnVuY3Rpb25zPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iZGV2ZWxvcGVyL2xheWVyZWRpby5odG1sIj5BcGFjaGUgMi4wIExheWVyZWQgSS9PPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iZGV2ZWxvcGVyL21vZHVsZXMuaHRtbCI+Q29udmVydGluZyBNb2R1bGVzIGZyb20gQXBhY2hlIDEuMyB0byBBcGFjaGUgMi4wPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iZGV2ZWxvcGVyL3JlcXVlc3QuaHRtbCI+UmVxdWVzdCBQcm9jZXNzaW5nIGluIEFwYWNoZSAyLjA8L2E+PC9saT4KLTwvdWw+PC9saT4KLQotPC91bD48L2xpPgotCi08L3VsPgotCi0gICAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLSAgPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3NzbC9pbmRleC5odG1sIGIvZG9jcy9tYW51YWwvc3NsL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMzlhNDQuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvc3NsL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5tb2Rfc3NsOiBUaXRsZSBQYWdlPC90aXRsZT4KLQotPCEtLQotICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBSYWxmIFMuIEVuZ2Vsc2NoYWxsLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAgYXJlIG1ldDoKLQotICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCi0gICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gICAgIGRpc2NsYWltZXIuIAotIAotICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gCi0gIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogCi0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotICAgICAgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGVuZ2Vsc2NoYWxsLmNvbT4gZm9yIHVzZSBpbiB0aGUKLSAgICAgIG1vZF9zc2wgcHJvamVjdCAoaHR0cDovL3d3dy5tb2Rzc2wub3JnLykuIgotIAotICA0LiBUaGUgbmFtZSAibW9kX3NzbCIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gICAgIHBlcm1pc3Npb24uICAKLQotICA1LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUKLSAgICAgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLSAgICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+IGZvciB1c2UgaW4gdGhlCi0gICAgICBtb2Rfc3NsIHByb2plY3QgKGh0dHA6Ly93d3cubW9kc3NsLm9yZy8pLiIKLSAKLSAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBSQUxGIFMuIEVOR0VMU0NIQUxMIGBgQVMgSVMnJyBBTkQgQU5ZCi0gIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBSQUxGIFMuIEVOR0VMU0NIQUxMIE9SCi0gIEhJUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0tLT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+PCEtLQotQTpsaW5rIHsKLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gICAgY29sb3I6ICM2NjY2Y2M7Ci19Ci1BOmFjdGl2ZSB7Ci0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotICAgIGNvbG9yOiAjNjY2NmNjOwotfQotQTp2aXNpdGVkIHsKLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gICAgY29sb3I6ICM2NjY2Y2M7Ci19Ci0jc2YgewotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCxoZWx2ZXRpY2E7Ci0gICAgZm9udC12YXJpYW50OiBub3JtYWw7Ci0gICAgZm9udC1zdHlsZTogbm9ybWFsOwotfQotSDEgewotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgIGZvbnQtc2l6ZTogMjRwdDsKLSAgICBsaW5lLWhlaWdodDogMjRwdDsKLSAgICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhOwotICAgIGZvbnQtdmFyaWFudDogbm9ybWFsOwotICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLUgyIHsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICBmb250LXNpemU6IDE4cHQ7Ci0gICAgbGluZS1oZWlnaHQ6IDE4cHQ7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYTsKLSAgICBmb250LXZhcmlhbnQ6IG5vcm1hbDsKLSAgICBmb250LXN0eWxlOiBub3JtYWw7Ci19Ci1IMyB7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgZm9udC1zaXplOiAxNHB0OwotICAgIGxpbmUtaGVpZ2h0OiAxNHB0OwotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCxoZWx2ZXRpY2E7Ci0gICAgZm9udC12YXJpYW50OiBub3JtYWw7Ci0gICAgZm9udC1zdHlsZTogbm9ybWFsOwotfQotSDQgewotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgIGZvbnQtc2l6ZTogMTJwdDsKLSAgICBsaW5lLWhlaWdodDogMTJwdDsKLSAgICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhOwotICAgIGZvbnQtdmFyaWFudDogbm9ybWFsOwotICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLSNIIHsKLX0KLSNEIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOwotfQotI2ZhcSB7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgZm9udC1zaXplOiAxNnB0OwotICAgIGxpbmUtaGVpZ2h0OiAxNnB0OwotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCxoZWx2ZXRpY2E7Ci0gICAgZm9udC12YXJpYW50OiBub3JtYWw7Ci0gICAgZm9udC1zdHlsZTogbm9ybWFsOwotfQotI2hvd3RvIHsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICBmb250LXNpemU6IDE2cHQ7Ci0gICAgbGluZS1oZWlnaHQ6IDE2cHQ7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYTsKLSAgICBmb250LXZhcmlhbnQ6IG5vcm1hbDsKLSAgICBmb250LXN0eWxlOiBub3JtYWw7Ci19Ci0jdGVybSB7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgZm9udC1zaXplOiAxNnB0OwotICAgIGxpbmUtaGVpZ2h0OiAxNnB0OwotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCxoZWx2ZXRpY2E7Ci0gICAgZm9udC12YXJpYW50OiBub3JtYWw7Ci0gICAgZm9udC1zdHlsZTogbm9ybWFsOwotfQotLS0+PC9zdHlsZT4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci08IS0tIEhpZGluZyB0aGUgY29kZQotZnVuY3Rpb24gcm9faW1nTm9ybWFsKGltZ05hbWUpIHsKLSAgICBpZiAoZG9jdW1lbnQuaW1hZ2VzKSB7Ci0gICAgICAgIGRvY3VtZW50W2ltZ05hbWVdLnNyYyA9IGV2YWwoaW1nTmFtZSArICdfbi5zcmMnKTsKLSAgICAgICAgc2VsZi5zdGF0dXMgPSAnJzsKLSAgICB9Ci19Ci1mdW5jdGlvbiByb19pbWdPdmVyKGltZ05hbWUsIGRlc2NyaXB0KSB7Ci0gICAgaWYgKGRvY3VtZW50LmltYWdlcykgewotICAgICAgICBkb2N1bWVudFtpbWdOYW1lXS5zcmMgPSBldmFsKGltZ05hbWUgKyAnX28uc3JjJyk7Ci0gICAgICAgIHNlbGYuc3RhdHVzID0gZGVzY3JpcHQ7Ci0gICAgfQotfQotLy8gZG9uZSBoaWRpbmcgLS0+Ci08L3NjcmlwdD4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci08IS0tIEhpZGluZyB0aGUgY29kZQotaWYgKGRvY3VtZW50LmltYWdlcykgewotICAgIHJvX2ltZ191bmtub3duMV9uID0gbmV3IEltYWdlKCk7Ci0gICAgcm9faW1nX3Vua25vd24xX24uc3JjID0gJ3NzbF90ZW1wbGF0ZS5uYXZidXQtbmV4dC1uLmdpZic7Ci0gICAgcm9faW1nX3Vua25vd24xX28gPSBuZXcgSW1hZ2UoKTsKLSAgICByb19pbWdfdW5rbm93bjFfby5zcmMgPSAnc3NsX3RlbXBsYXRlLm5hdmJ1dC1uZXh0LXMuZ2lmJzsKLX0KLS8vIGRvbmUgaGlkaW5nIC0tPgotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIiB0ZXh0PSIjMDAwMDAwIiBsaW5rPSIjMzMzMzk5IiBhbGluaz0iIzk5OTlmZiIgdmxpbms9IiMwMDAwNjYiPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTx0YWJsZSB3aWR0aD0iNjAwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj4KLSAgPHRkPgotPGJyPgotPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPgotICAgIDx0ZD4KLSAgICAgICAgPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotICAgICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgPGltZwotICAgICAgICAgICBzcmM9InNzbF9jb3Zlcl90aXRsZS5qcGciCi0gICAgICAgICAgIGFsdD0iVXNlciBNYW51YWwiCi0gICAgICAgICB3aWR0aD0iNDIxIiBoZWlnaHQ9IjczIj4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KLSAgICAgICAgPGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj5tb2Rfc3NsIHZlcnNpb24gMi44PC9mb250PiAmbmJzcDsmbmJzcDsKLSAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPGJyPgotICAgIDwvdGQ+Ci08L3RyPgotPHRyPgotICAgIDx0ZD4KLSAgICAgICAgPGEKLSAgICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5tb2Rzc2wub3JnLyIKLT48aW1nCi0gICAgICAgICAgIHNyYz0ic3NsX2NvdmVyX2xvZ28uanBnIgotICAgICAgICAgICBhbHQ9Im1vZF9zc2wgLSBUaGUgQXBhY2hlIEludGVyZmFjZSB0byBPcGVuU1NMIgotICAgICAgICAgICBib3JkZXI9IjAiCi0gICAgICAgICB3aWR0aD0iNTA0IiBoZWlnaHQ9IjIzMSI+PC9hPgotICAgIDwvdGQ+Ci08L3RyPgotPHRyPgotICAgIDx0ZCBhbGlnbj0icmlnaHQiPgotICAgICAgICA8dGFibGUgc3VtbWFyeT0iIj4KLSAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDx0dD5SYWxmIFMuIEVuZ2Vsc2NoYWxsPC90dD48YnI+Ci0gICAgICAgICAgICAgICAgPHR0PnJzZUBlbmdlbHNjaGFsbC5jb208L3R0Pjxicj4KLSAgICAgICAgICAgICAgICA8dHQ+d3d3LmVuZ2Vsc2NoYWxsLmNvbTwvdHQ+PGJyPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0IiB2YWxpZ249ImJvdHRvbSI+Ci08YSBocmVmPSJzc2xfb3ZlcnZpZXcuaHRtbCIgb25tb3VzZW92ZXI9InJvX2ltZ092ZXIoJ3JvX2ltZ191bmtub3duMScsICduZXh0IHBhZ2UnKTsgcmV0dXJuIHRydWUiIG9ubW91c2VvdXQ9InJvX2ltZ05vcm1hbCgncm9faW1nX3Vua25vd24xJyk7IHJldHVybiB0cnVlIiBvbmZvY3VzPSJyb19pbWdPdmVyKCdyb19pbWdfdW5rbm93bjEnLCAnbmV4dCBwYWdlJyk7IHJldHVybiB0cnVlIiBvbmJsdXI9InJvX2ltZ05vcm1hbCgncm9faW1nX3Vua25vd24xJyk7IHJldHVybiB0cnVlIj48aW1nIG5hbWU9InJvX2ltZ191bmtub3duMSIgc3JjPSJzc2xfdGVtcGxhdGUubmF2YnV0LW5leHQtbi5naWYiIGFsdD0ibmV4dCBwYWdlIiB3aWR0aD0iNzAiIGhlaWdodD0iMTgiIGJvcmRlcj0iMCI+PC9hPjxicj5PdmVydmlldwotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjMwIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgIDwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLSAgPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9zc2wvaW5kZXguaHRtbC5lbiBiL2RvY3MvbWFudWFsL3NzbC9pbmRleC5odG1sLmVuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjM5YTQ0Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL3NzbC9pbmRleC5odG1sLmVuCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+bW9kX3NzbDogVGl0bGUgUGFnZTwvdGl0bGU+Ci0KLTwhLS0KLSAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgUmFsZiBTLiBFbmdlbHNjaGFsbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gIGFyZSBtZXQ6Ci0KLSAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQotICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICAgICBkaXNjbGFpbWVyLiAKLSAKLSAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLSAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotIAotICAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6IAotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLSAgICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+IGZvciB1c2UgaW4gdGhlCi0gICAgICBtb2Rfc3NsIHByb2plY3QgKGh0dHA6Ly93d3cubW9kc3NsLm9yZy8pLiIKLSAKLSAgNC4gVGhlIG5hbWUgIm1vZF9zc2wiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgICBwZXJtaXNzaW9uLiAgCi0KLSAgNS4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlCi0gICAgIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi0gICAgICBSYWxmIFMuIEVuZ2Vsc2NoYWxsIDxyc2VAZW5nZWxzY2hhbGwuY29tPiBmb3IgdXNlIGluIHRoZQotICAgICAgbW9kX3NzbCBwcm9qZWN0IChodHRwOi8vd3d3Lm1vZHNzbC5vcmcvKS4iCi0gCi0gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgUkFMRiBTLiBFTkdFTFNDSEFMTCBgYEFTIElTJycgQU5EIEFOWQotICBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgUkFMRiBTLiBFTkdFTFNDSEFMTCBPUgotICBISVMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLS0+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhLS0KLUE6bGluayB7Ci0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotICAgIGNvbG9yOiAjNjY2NmNjOwotfQotQTphY3RpdmUgewotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSAgICBjb2xvcjogIzY2NjZjYzsKLX0KLUE6dmlzaXRlZCB7Ci0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotICAgIGNvbG9yOiAjNjY2NmNjOwotfQotI3NmIHsKLSAgICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhOwotICAgIGZvbnQtdmFyaWFudDogbm9ybWFsOwotICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLUgxIHsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICBmb250LXNpemU6IDI0cHQ7Ci0gICAgbGluZS1oZWlnaHQ6IDI0cHQ7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYTsKLSAgICBmb250LXZhcmlhbnQ6IG5vcm1hbDsKLSAgICBmb250LXN0eWxlOiBub3JtYWw7Ci19Ci1IMiB7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgZm9udC1zaXplOiAxOHB0OwotICAgIGxpbmUtaGVpZ2h0OiAxOHB0OwotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCxoZWx2ZXRpY2E7Ci0gICAgZm9udC12YXJpYW50OiBub3JtYWw7Ci0gICAgZm9udC1zdHlsZTogbm9ybWFsOwotfQotSDMgewotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgIGZvbnQtc2l6ZTogMTRwdDsKLSAgICBsaW5lLWhlaWdodDogMTRwdDsKLSAgICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhOwotICAgIGZvbnQtdmFyaWFudDogbm9ybWFsOwotICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLUg0IHsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICBmb250LXNpemU6IDEycHQ7Ci0gICAgbGluZS1oZWlnaHQ6IDEycHQ7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYTsKLSAgICBmb250LXZhcmlhbnQ6IG5vcm1hbDsKLSAgICBmb250LXN0eWxlOiBub3JtYWw7Ci19Ci0jSCB7Ci19Ci0jRCB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDsKLX0KLSNmYXEgewotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgIGZvbnQtc2l6ZTogMTZwdDsKLSAgICBsaW5lLWhlaWdodDogMTZwdDsKLSAgICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhOwotICAgIGZvbnQtdmFyaWFudDogbm9ybWFsOwotICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLSNob3d0byB7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgZm9udC1zaXplOiAxNnB0OwotICAgIGxpbmUtaGVpZ2h0OiAxNnB0OwotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCxoZWx2ZXRpY2E7Ci0gICAgZm9udC12YXJpYW50OiBub3JtYWw7Ci0gICAgZm9udC1zdHlsZTogbm9ybWFsOwotfQotI3Rlcm0gewotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgIGZvbnQtc2l6ZTogMTZwdDsKLSAgICBsaW5lLWhlaWdodDogMTZwdDsKLSAgICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhOwotICAgIGZvbnQtdmFyaWFudDogbm9ybWFsOwotICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLS0tPjwvc3R5bGU+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotPCEtLSBIaWRpbmcgdGhlIGNvZGUKLWZ1bmN0aW9uIHJvX2ltZ05vcm1hbChpbWdOYW1lKSB7Ci0gICAgaWYgKGRvY3VtZW50LmltYWdlcykgewotICAgICAgICBkb2N1bWVudFtpbWdOYW1lXS5zcmMgPSBldmFsKGltZ05hbWUgKyAnX24uc3JjJyk7Ci0gICAgICAgIHNlbGYuc3RhdHVzID0gJyc7Ci0gICAgfQotfQotZnVuY3Rpb24gcm9faW1nT3ZlcihpbWdOYW1lLCBkZXNjcmlwdCkgewotICAgIGlmIChkb2N1bWVudC5pbWFnZXMpIHsKLSAgICAgICAgZG9jdW1lbnRbaW1nTmFtZV0uc3JjID0gZXZhbChpbWdOYW1lICsgJ19vLnNyYycpOwotICAgICAgICBzZWxmLnN0YXR1cyA9IGRlc2NyaXB0OwotICAgIH0KLX0KLS8vIGRvbmUgaGlkaW5nIC0tPgotPC9zY3JpcHQ+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotPCEtLSBIaWRpbmcgdGhlIGNvZGUKLWlmIChkb2N1bWVudC5pbWFnZXMpIHsKLSAgICByb19pbWdfdW5rbm93bjFfbiA9IG5ldyBJbWFnZSgpOwotICAgIHJvX2ltZ191bmtub3duMV9uLnNyYyA9ICdzc2xfdGVtcGxhdGUubmF2YnV0LW5leHQtbi5naWYnOwotICAgIHJvX2ltZ191bmtub3duMV9vID0gbmV3IEltYWdlKCk7Ci0gICAgcm9faW1nX3Vua25vd24xX28uc3JjID0gJ3NzbF90ZW1wbGF0ZS5uYXZidXQtbmV4dC1zLmdpZic7Ci19Ci0vLyBkb25lIGhpZGluZyAtLT4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiIgdGV4dD0iIzAwMDAwMCIgbGluaz0iIzMzMzM5OSIgYWxpbms9IiM5OTk5ZmYiIHZsaW5rPSIjMDAwMDY2Ij4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08dGFibGUgd2lkdGg9IjYwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+Ci0gIDx0ZD4KLTxicj4KLTx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj4KLSAgICA8dGQ+Ci0gICAgICAgIDx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLSAgICAgICAgPHRyPgotICAgICAgICA8dGQ+Ci0gICAgICAgIDxpbWcKLSAgICAgICAgICAgc3JjPSJzc2xfY292ZXJfdGl0bGUuanBnIgotICAgICAgICAgICBhbHQ9IlVzZXIgTWFudWFsIgotICAgICAgICAgd2lkdGg9IjQyMSIgaGVpZ2h0PSI3MyI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+Ci0gICAgICAgIDxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+bW9kX3NzbCB2ZXJzaW9uIDIuODwvZm9udD4gJm5ic3A7Jm5ic3A7Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDxicj4KLSAgICA8L3RkPgotPC90cj4KLTx0cj4KLSAgICA8dGQ+Ci0gICAgICAgIDxhCi0gICAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy8iCi0+PGltZwotICAgICAgICAgICBzcmM9InNzbF9jb3Zlcl9sb2dvLmpwZyIKLSAgICAgICAgICAgYWx0PSJtb2Rfc3NsIC0gVGhlIEFwYWNoZSBJbnRlcmZhY2UgdG8gT3BlblNTTCIKLSAgICAgICAgICAgYm9yZGVyPSIwIgotICAgICAgICAgd2lkdGg9IjUwNCIgaGVpZ2h0PSIyMzEiPjwvYT4KLSAgICA8L3RkPgotPC90cj4KLTx0cj4KLSAgICA8dGQgYWxpZ249InJpZ2h0Ij4KLSAgICAgICAgPHRhYmxlIHN1bW1hcnk9IiI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8dHQ+UmFsZiBTLiBFbmdlbHNjaGFsbDwvdHQ+PGJyPgotICAgICAgICAgICAgICAgIDx0dD5yc2VAZW5nZWxzY2hhbGwuY29tPC90dD48YnI+Ci0gICAgICAgICAgICAgICAgPHR0Pnd3dy5lbmdlbHNjaGFsbC5jb208L3R0Pjxicj4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCIgdmFsaWduPSJib3R0b20iPgotPGEgaHJlZj0ic3NsX292ZXJ2aWV3Lmh0bWwiIG9ubW91c2VvdmVyPSJyb19pbWdPdmVyKCdyb19pbWdfdW5rbm93bjEnLCAnbmV4dCBwYWdlJyk7IHJldHVybiB0cnVlIiBvbm1vdXNlb3V0PSJyb19pbWdOb3JtYWwoJ3JvX2ltZ191bmtub3duMScpOyByZXR1cm4gdHJ1ZSIgb25mb2N1cz0icm9faW1nT3Zlcigncm9faW1nX3Vua25vd24xJywgJ25leHQgcGFnZScpOyByZXR1cm4gdHJ1ZSIgb25ibHVyPSJyb19pbWdOb3JtYWwoJ3JvX2ltZ191bmtub3duMScpOyByZXR1cm4gdHJ1ZSI+PGltZyBuYW1lPSJyb19pbWdfdW5rbm93bjEiIHNyYz0ic3NsX3RlbXBsYXRlLm5hdmJ1dC1uZXh0LW4uZ2lmIiBhbHQ9Im5leHQgcGFnZSIgd2lkdGg9IjcwIiBoZWlnaHQ9IjE4IiBib3JkZXI9IjAiPjwvYT48YnI+T3ZlcnZpZXcKLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIzMCIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICA8L3RkPgotPC90cj4KLTwvdGFibGU+Ci0gIDwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvc3NsL3NzbF9jb21wYXQuaHRtbCBiL2RvY3MvbWFudWFsL3NzbC9zc2xfY29tcGF0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MWMwNjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvc3NsL3NzbF9jb21wYXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1MSArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPm1vZF9zc2w6IENvbXBhdGliaWxpdHk8L3RpdGxlPgotCi08IS0tCi0gIENvcHlyaWdodCAoYykgMTk5OC0yMDAxIFJhbGYgUy4gRW5nZWxzY2hhbGwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICBhcmUgbWV0OgotCi0gIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKLSAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAgICAgZGlzY2xhaW1lci4gCi0gCi0gIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAKLSAgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi0gICAgICBSYWxmIFMuIEVuZ2Vsc2NoYWxsIDxyc2VAZW5nZWxzY2hhbGwuY29tPiBmb3IgdXNlIGluIHRoZQotICAgICAgbW9kX3NzbCBwcm9qZWN0IChodHRwOi8vd3d3Lm1vZHNzbC5vcmcvKS4iCi0gCi0gIDQuIFRoZSBuYW1lICJtb2Rfc3NsIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICAgcGVybWlzc2lvbi4gIAotCi0gIDUuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZQotICAgICBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotICAgICAgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGVuZ2Vsc2NoYWxsLmNvbT4gZm9yIHVzZSBpbiB0aGUKLSAgICAgIG1vZF9zc2wgcHJvamVjdCAoaHR0cDovL3d3dy5tb2Rzc2wub3JnLykuIgotIAotICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFJBTEYgUy4gRU5HRUxTQ0hBTEwgYGBBUyBJUycnIEFORCBBTlkKLSAgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFJBTEYgUy4gRU5HRUxTQ0hBTEwgT1IKLSAgSElTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS0tPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj48IS0tCi1BOmxpbmsgewotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSAgICBjb2xvcjogIzY2NjZjYzsKLX0KLUE6YWN0aXZlIHsKLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gICAgY29sb3I6ICM2NjY2Y2M7Ci19Ci1BOnZpc2l0ZWQgewotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSAgICBjb2xvcjogIzY2NjZjYzsKLX0KLSNzZiB7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYTsKLSAgICBmb250LXZhcmlhbnQ6IG5vcm1hbDsKLSAgICBmb250LXN0eWxlOiBub3JtYWw7Ci19Ci1IMSB7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgZm9udC1zaXplOiAyNHB0OwotICAgIGxpbmUtaGVpZ2h0OiAyNHB0OwotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCxoZWx2ZXRpY2E7Ci0gICAgZm9udC12YXJpYW50OiBub3JtYWw7Ci0gICAgZm9udC1zdHlsZTogbm9ybWFsOwotfQotSDIgewotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgIGZvbnQtc2l6ZTogMThwdDsKLSAgICBsaW5lLWhlaWdodDogMThwdDsKLSAgICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhOwotICAgIGZvbnQtdmFyaWFudDogbm9ybWFsOwotICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLUgzIHsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICBmb250LXNpemU6IDE0cHQ7Ci0gICAgbGluZS1oZWlnaHQ6IDE0cHQ7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYTsKLSAgICBmb250LXZhcmlhbnQ6IG5vcm1hbDsKLSAgICBmb250LXN0eWxlOiBub3JtYWw7Ci19Ci1INCB7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgZm9udC1zaXplOiAxMnB0OwotICAgIGxpbmUtaGVpZ2h0OiAxMnB0OwotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCxoZWx2ZXRpY2E7Ci0gICAgZm9udC12YXJpYW50OiBub3JtYWw7Ci0gICAgZm9udC1zdHlsZTogbm9ybWFsOwotfQotI0ggewotfQotI0QgewotICAgIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7Ci19Ci0jZmFxIHsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICBmb250LXNpemU6IDE2cHQ7Ci0gICAgbGluZS1oZWlnaHQ6IDE2cHQ7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYTsKLSAgICBmb250LXZhcmlhbnQ6IG5vcm1hbDsKLSAgICBmb250LXN0eWxlOiBub3JtYWw7Ci19Ci0jaG93dG8gewotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgIGZvbnQtc2l6ZTogMTZwdDsKLSAgICBsaW5lLWhlaWdodDogMTZwdDsKLSAgICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhOwotICAgIGZvbnQtdmFyaWFudDogbm9ybWFsOwotICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLSN0ZXJtIHsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICBmb250LXNpemU6IDE2cHQ7Ci0gICAgbGluZS1oZWlnaHQ6IDE2cHQ7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYTsKLSAgICBmb250LXZhcmlhbnQ6IG5vcm1hbDsKLSAgICBmb250LXN0eWxlOiBub3JtYWw7Ci19Ci0tLT48L3N0eWxlPgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhLS0gSGlkaW5nIHRoZSBjb2RlCi1mdW5jdGlvbiByb19pbWdOb3JtYWwoaW1nTmFtZSkgewotICAgIGlmIChkb2N1bWVudC5pbWFnZXMpIHsKLSAgICAgICAgZG9jdW1lbnRbaW1nTmFtZV0uc3JjID0gZXZhbChpbWdOYW1lICsgJ19uLnNyYycpOwotICAgICAgICBzZWxmLnN0YXR1cyA9ICcnOwotICAgIH0KLX0KLWZ1bmN0aW9uIHJvX2ltZ092ZXIoaW1nTmFtZSwgZGVzY3JpcHQpIHsKLSAgICBpZiAoZG9jdW1lbnQuaW1hZ2VzKSB7Ci0gICAgICAgIGRvY3VtZW50W2ltZ05hbWVdLnNyYyA9IGV2YWwoaW1nTmFtZSArICdfby5zcmMnKTsKLSAgICAgICAgc2VsZi5zdGF0dXMgPSBkZXNjcmlwdDsKLSAgICB9Ci19Ci0vLyBkb25lIGhpZGluZyAtLT4KLTwvc2NyaXB0PgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhLS0gSGlkaW5nIHRoZSBjb2RlCi1pZiAoZG9jdW1lbnQuaW1hZ2VzKSB7Ci0gICAgcm9faW1nX3ByZXZfdG9wX24gPSBuZXcgSW1hZ2UoKTsKLSAgICByb19pbWdfcHJldl90b3Bfbi5zcmMgPSAnc3NsX3RlbXBsYXRlLm5hdmJ1dC1wcmV2LW4uZ2lmJzsKLSAgICByb19pbWdfcHJldl90b3BfbyA9IG5ldyBJbWFnZSgpOwotICAgIHJvX2ltZ19wcmV2X3RvcF9vLnNyYyA9ICdzc2xfdGVtcGxhdGUubmF2YnV0LXByZXYtcy5naWYnOwotfQotLy8gZG9uZSBoaWRpbmcgLS0+Ci08L3NjcmlwdD4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci08IS0tIEhpZGluZyB0aGUgY29kZQotaWYgKGRvY3VtZW50LmltYWdlcykgewotICAgIHJvX2ltZ19wcmV2X2JvdF9uID0gbmV3IEltYWdlKCk7Ci0gICAgcm9faW1nX3ByZXZfYm90X24uc3JjID0gJ3NzbF90ZW1wbGF0ZS5uYXZidXQtcHJldi1uLmdpZic7Ci0gICAgcm9faW1nX3ByZXZfYm90X28gPSBuZXcgSW1hZ2UoKTsKLSAgICByb19pbWdfcHJldl9ib3Rfby5zcmMgPSAnc3NsX3RlbXBsYXRlLm5hdmJ1dC1wcmV2LXMuZ2lmJzsKLX0KLS8vIGRvbmUgaGlkaW5nIC0tPgotPC9zY3JpcHQ+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotPCEtLSBIaWRpbmcgdGhlIGNvZGUKLWlmIChkb2N1bWVudC5pbWFnZXMpIHsKLSAgICByb19pbWdfbmV4dF90b3BfbiA9IG5ldyBJbWFnZSgpOwotICAgIHJvX2ltZ19uZXh0X3RvcF9uLnNyYyA9ICdzc2xfdGVtcGxhdGUubmF2YnV0LW5leHQtbi5naWYnOwotICAgIHJvX2ltZ19uZXh0X3RvcF9vID0gbmV3IEltYWdlKCk7Ci0gICAgcm9faW1nX25leHRfdG9wX28uc3JjID0gJ3NzbF90ZW1wbGF0ZS5uYXZidXQtbmV4dC1zLmdpZic7Ci19Ci0vLyBkb25lIGhpZGluZyAtLT4KLTwvc2NyaXB0PgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhLS0gSGlkaW5nIHRoZSBjb2RlCi1pZiAoZG9jdW1lbnQuaW1hZ2VzKSB7Ci0gICAgcm9faW1nX25leHRfYm90X24gPSBuZXcgSW1hZ2UoKTsKLSAgICByb19pbWdfbmV4dF9ib3Rfbi5zcmMgPSAnc3NsX3RlbXBsYXRlLm5hdmJ1dC1uZXh0LW4uZ2lmJzsKLSAgICByb19pbWdfbmV4dF9ib3RfbyA9IG5ldyBJbWFnZSgpOwotICAgIHJvX2ltZ19uZXh0X2JvdF9vLnNyYyA9ICdzc2xfdGVtcGxhdGUubmF2YnV0LW5leHQtcy5naWYnOwotfQotLy8gZG9uZSBoaWRpbmcgLS0+Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGJnY29sb3I9IiNmZmZmZmYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiMzMzMzOTkiIGFsaW5rPSIjOTk5OWZmIiB2bGluaz0iIzAwMDA2NiI+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPHRhYmxlIHdpZHRoPSI2MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPgotICA8dGQ+Ci0gICAgICA8aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSI2MDAiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48YnI+Ci0gICAgICA8dGFibGUgd2lkdGg9IjYwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBzdW1tYXJ5PSIiPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iNjAwIiBzdW1tYXJ5PSIiPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICAgIDxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSIgc2l6ZT0iKzIiPjxiPm1vZF9zc2w8L2I+PC9mb250PgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgotICAgICAgICAgICAgICA8aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmhlYWQtY2hhcHRlci5naWYiIGFsdD0iQ2hhcHRlciIgd2lkdGg9IjE3NSIgaGVpZ2h0PSI5NCI+IDxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaGVhZC1udW0tNC5naWYiIGFsdD0iNCIgd2lkdGg9Ijc0IiBoZWlnaHQ9Ijg5Ij4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLTAwMDAwMC5naWYiIGFsdD0iIiB3aWR0aD0iNjAwIiBoZWlnaHQ9IjIiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICAgPHRhYmxlIHdpZHRoPSI2MDAiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLSAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCIgd2lkdGg9IjI1MCI+Ci08YSBocmVmPSJzc2xfcmVmZXJlbmNlLmh0bWwiIG9ubW91c2VvdmVyPSJyb19pbWdPdmVyKCdyb19pbWdfcHJldl90b3AnLCAncHJldmlvdXMgcGFnZScpOyByZXR1cm4gdHJ1ZSIgb25tb3VzZW91dD0icm9faW1nTm9ybWFsKCdyb19pbWdfcHJldl90b3AnKTsgcmV0dXJuIHRydWUiIG9uZm9jdXM9InJvX2ltZ092ZXIoJ3JvX2ltZ19wcmV2X3RvcCcsICdwcmV2aW91cyBwYWdlJyk7IHJldHVybiB0cnVlIiBvbmJsdXI9InJvX2ltZ05vcm1hbCgncm9faW1nX3ByZXZfdG9wJyk7IHJldHVybiB0cnVlIj48aW1nIG5hbWU9InJvX2ltZ19wcmV2X3RvcCIgc3JjPSJzc2xfdGVtcGxhdGUubmF2YnV0LXByZXYtbi5naWYiIGFsdD0icHJldmlvdXMgcGFnZSIgd2lkdGg9IjcwIiBoZWlnaHQ9IjE4IiBib3JkZXI9IjAiPjwvYT48YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPlJlZmVyZW5jZTwvZm9udD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJyaWdodCIgd2lkdGg9IjI1MCI+Ci08YSBocmVmPSJzc2xfaG93dG8uaHRtbCIgb25tb3VzZW92ZXI9InJvX2ltZ092ZXIoJ3JvX2ltZ19uZXh0X3RvcCcsICduZXh0IHBhZ2UnKTsgcmV0dXJuIHRydWUiIG9ubW91c2VvdXQ9InJvX2ltZ05vcm1hbCgncm9faW1nX25leHRfdG9wJyk7IHJldHVybiB0cnVlIiBvbmZvY3VzPSJyb19pbWdPdmVyKCdyb19pbWdfbmV4dF90b3AnLCAnbmV4dCBwYWdlJyk7IHJldHVybiB0cnVlIiBvbmJsdXI9InJvX2ltZ05vcm1hbCgncm9faW1nX25leHRfdG9wJyk7IHJldHVybiB0cnVlIj48aW1nIG5hbWU9InJvX2ltZ19uZXh0X3RvcCIgc3JjPSJzc2xfdGVtcGxhdGUubmF2YnV0LW5leHQtbi5naWYiIGFsdD0ibmV4dCBwYWdlIiB3aWR0aD0iNzAiIGhlaWdodD0iMTgiIGJvcmRlcj0iMCI+PC9hPjxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+SG93VG88L2ZvbnQ+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICA8L3RyPgotICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8YnI+Ci0gICAgICAgICAgPGltZyBzcmM9InNzbF90ZW1wbGF0ZS50aXRsZS1jb21wYXQuZ2lmIiBhbHQ9IkNvbXBhdGliaWxpdHkiIHdpZHRoPSI0NTYiIGhlaWdodD0iNjAiPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci08ZGl2IGFsaWduPSJyaWdodCI+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMjAwIiBzdW1tYXJ5PSIiPgotPHRyPgotPHRkPgotPGVtPgotQWxsIFBDcyBhcmUgY29tcGF0aWJsZS4gQnV0IHNvbWUgb2YKLXRoZW0gYXJlIG1vcmUgY29tcGF0aWJsZSB0aGFuIG90aGVycy4KLTwvZW0+Ci08L3RkPgotPC90cj4KLTx0cj4KLTx0ZCBhbGlnbj0icmlnaHQiPgotPGZvbnQgc2l6ZT0iLTEiPgotVW5rbm93bgotPC9mb250PgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08cD4KLTx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0ciB2YWxpZ249ImJvdHRvbSI+Ci08dGQ+Ci08aW1nIHNyYz0ic3NsX2NvbXBhdC5nZm9udDAwMC5naWYiIGFsdD0iSCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjM0IiBib3JkZXI9IjAiIGFsaWduPSJsZWZ0Ij4KLWVyZSB3ZSB0YWxrIGFib3V0IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgdG8gb3RoZXIgU1NMIHNvbHV0aW9ucy4gQXMgeW91Ci1wZXJoYXBzIGtub3csIG1vZF9zc2wgaXMgbm90IHRoZSBvbmx5IGV4aXN0aW5nIFNTTCBzb2x1dGlvbiBmb3IgQXBhY2hlLgotQWN0dWFsbHkgdGhlcmUgYXJlIGZvdXIgYWRkaXRpb25hbCBtYWpvciBwcm9kdWN0cyBhdmFpbGFibGUgb24gdGhlIG1hcmtldDogQmVuCi1MYXVyaWUncyBmcmVlbHkgYXZhaWxhYmxlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLXNzbC5vcmcvIj5BcGFjaGUtU1NMPC9hPgotKGZyb20gd2hlcmUgbW9kX3NzbCB3ZXJlIG9yaWdpbmFsbHkgZGVyaXZlZCBpbiAxOTk4KSwgUmVkSGF0J3MgY29tbWVyY2lhbCA8YQotaHJlZj0iaHR0cDovL3d3dy5yZWRoYXQuY29tL3Byb2R1Y3RzL3Byb2R1Y3QtZGV0YWlscy5waHRtbD9pZD1yaHNhIj5TZWN1cmUgV2ViCi1TZXJ2ZXI8L2E+ICh3aGljaCBpcyBiYXNlZCBvbiBtb2Rfc3NsKSwgQ292YWxlbnQncyBjb21tZXJjaWFsIDxhCi1ocmVmPSJodHRwOi8vcmF2ZW4uY292YWxlbnQubmV0LyI+UmF2ZW4gU1NMIE1vZHVsZTwvYT4gKGFsc28gYmFzZWQgb24gbW9kX3NzbCkKLWFuZCBmaW5hbGx5IEMyTmV0J3MgY29tbWVyY2lhbCBwcm9kdWN0IDxhCi1ocmVmPSJodHRwOi8vd3d3LmMyLm5ldC9wcm9kdWN0cy9zdHJvbmdob2xkLyI+U3Ryb25naG9sZDwvYT4gKGJhc2VkIG9uIGEKLWRpZmZlcmVudCBldm9sdXRpb24gYnJhbmNoIG5hbWVkIFNpb3V4IHVwIHRvIFN0cm9uZ2hvbGQgMi54IGFuZCBiYXNlZCBvbgotbW9kX3NzbCBzaW5jZSBTdHJvbmdob2xkIDMueCkuCi08L3RkPgotPHRkPgotJm5ic3A7Jm5ic3A7Ci08L3RkPgotPHRkPgotPGRpdiBhbGlnbj0icmlnaHQiPgotPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSIgYm9yZGVyPSIwIiBiZ2NvbG9yPSIjY2NjY2ZmIiBzdW1tYXJ5PSIiPgotPHRyPgotPHRkIGJnY29sb3I9IiMzMzMzOTkiPgotPGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIiBjb2xvcj0iI2NjY2NmZiI+Ci08Yj5UYWJsZSBPZiBDb250ZW50czwvYj4KLTwvZm9udD4KLTwvdGQ+Ci08L3RyPgotPHRyPgotPHRkPgotPGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIiBzaXplPSItMSI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DMSI+PHN0cm9uZz5Db25maWd1cmF0aW9uIERpcmVjdGl2ZXM8L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzIiPjxzdHJvbmc+RW52aXJvbm1lbnQgVmFyaWFibGVzPC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0MzIj48c3Ryb25nPkN1c3RvbSBMb2cgRnVuY3Rpb25zPC9zdHJvbmc+PC9hPjxicj4KLTwvZm9udD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHA+Ci1UaGUgaWRlYSBpbiBtb2Rfc3NsIGlzIG1haW5seSB0aGUgZm9sbG93aW5nOiBiZWNhdXNlIG1vZF9zc2wgcHJvdmlkZXMgbW9zdGx5IGEKLXN1cGVyc2V0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFsbCBvdGhlciBzb2x1dGlvbnMgd2UgY2FuIGVhc2lseSBwcm92aWRlCi1iYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvciBtb3N0IG9mIHRoZSBjYXNlcy4gQWN0dWFsbHkgdGhlcmUgYXJlIHRocmVlCi1jb21wYXRpYmlsaXR5IGFyZWFzIHdlIGN1cnJlbnRseSBhZGRyZXNzOiBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMsCi1lbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIGN1c3RvbSBsb2cgZnVuY3Rpb25zLgotPGgyPjxhIG5hbWU9IlRvQzEiPkNvbmZpZ3VyYXRpb24gRGlyZWN0aXZlczwvYT48L2gyPgotRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgdG8gdGhlIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcyBvZiBvdGhlciBTU0wKLXNvbHV0aW9ucyB3ZSBkbyBhbiBvbi10aGUtZmx5IG1hcHBpbmc6IGRpcmVjdGl2ZXMgd2hpY2ggaGF2ZSBhIGRpcmVjdAotY291bnRlcnBhcnQgaW4gbW9kX3NzbCBhcmUgbWFwcGVkIHNpbGVudGx5IHdoaWxlIG90aGVyIGRpcmVjdGl2ZXMgbGVhZCB0byBhCi13YXJuaW5nIG1lc3NhZ2UgaW4gdGhlIGxvZ2ZpbGVzLiBUaGUgY3VycmVudGx5IGltcGxlbWVudGVkIGRpcmVjdGl2ZSBtYXBwaW5nCi1pcyBsaXN0ZWQgaW4gPGEgaHJlZj0iI3RhYmxlMSI+VGFibGUgMTwvYT4uIEN1cnJlbnRseSBmdWxsIGJhY2t3YXJkCi1jb21wYXRpYmlsdHkgaXMgcHJvdmlkZWQgb25seSBmb3IgQXBhY2hlLVNTTCAxLnggYW5kIG1vZF9zc2wgMi4wLnguCi1Db21wYXRpYmlsaXR5IHRvIFNpb3V4IDEueCBhbmQgU3Ryb25naG9sZCAyLnggaXMgb25seSBwYXJ0aWFsIGJlY2F1c2Ugb2YKLXNwZWNpYWwgZnVuY3Rpb25hbGl0eSBpbiB0aGVzZSBpbnRlcmZhY2VzIHdoaWNoIG1vZF9zc2wgKHN0aWxsKSBkb2Vzbid0Ci1wcm92aWRlLgotPHA+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGEgbmFtZT0idGFibGUxIj48L2E+Ci08dGFibGUgd2lkdGg9IjYwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08Y2FwdGlvbiBhbGlnbj0iYm90dG9tIiBpZD0ic2YiPlRhYmxlIDE6IENvbmZpZ3VyYXRpb24gRGlyZWN0aXZlIE1hcHBpbmc8L2NhcHRpb24+Ci08dHI+PHRkIGJnY29sb3I9IiNjY2NjY2MiPgotPHRhYmxlIHdpZHRoPSI1OTgiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSI1OTgiIHN1bW1hcnk9IiI+Ci08dHIgaWQ9IkQiPgotPHRkPjxzdHJvbmc+T2xkIERpcmVjdGl2ZTwvc3Ryb25nPjwvdGQ+Ci08dGQ+PHN0cm9uZz5tb2Rfc3NsIERpcmVjdGl2ZTwvc3Ryb25nPjwvdGQ+Ci08dGQ+PHN0cm9uZz5Db21tZW50PC9zdHJvbmc+PC90ZD4KLTwvdHI+Ci08dHIgaWQ9IkgiPjx0ZCBjb2xzcGFuPSIzIj48Yj5BcGFjaGUtU1NMIDEueCAmYW1wOyBtb2Rfc3NsIDIuMC54IGNvbXBhdGliaWxpdHk6PC9iPjwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTEVuYWJsZTwvY29kZT48L3RkPjx0ZD48Y29kZT5TU0xFbmdpbmUgb248L2NvZGU+PC90ZD48dGQ+Y29tcGFjdGlmaWVkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMRGlzYWJsZTwvY29kZT48L3RkPjx0ZD48Y29kZT5TU0xFbmdpbmUgb2ZmPC9jb2RlPjwvdGQ+PHRkPmNvbXBhY3RpZmllZDwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTExvZ0ZpbGU8L2NvZGU+IDxlbT5maWxlPC9lbT48L3RkPjx0ZD48Y29kZT5TU0xMb2c8L2NvZGU+IDxlbT5maWxlPC9lbT48L3RkPjx0ZD5jb21wYWN0aWZpZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xSZXF1aXJlZENpcGhlcnM8L2NvZGU+IDxlbT5zcGVjPC9lbT48L3RkPjx0ZD48Y29kZT5TU0xDaXBoZXJTdWl0ZTwvY29kZT4gPGVtPnNwZWM8L2VtPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xSZXF1aXJlQ2lwaGVyPC9jb2RlPiA8ZW0+YzE8L2VtPiAuLi48L3RkPjx0ZD48Y29kZT5TU0xSZXF1aXJlICV7U1NMX0NJUEhFUn0gaW4geyI8L2NvZGU+PGVtPmMxPC9lbT48Y29kZT4iLCAuLi59PC9jb2RlPjwvdGQ+PHRkPmdlbmVyYWxpemVkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMQmFuQ2lwaGVyPC9jb2RlPiA8ZW0+YzE8L2VtPiAuLi48L3RkPjx0ZD48Y29kZT5TU0xSZXF1aXJlIG5vdCAoJXtTU0xfQ0lQSEVSfSBpbiB7IjwvY29kZT48ZW0+YzE8L2VtPjxjb2RlPiIsIC4uLn0pPC9jb2RlPjwvdGQ+PHRkPmdlbmVyYWxpemVkPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMRmFrZUJhc2ljQXV0aDwvdGQ+PHRkPjxjb2RlPlNTTE9wdGlvbnMgK0Zha2VCYXNpY0F1dGg8L2NvZGU+PC90ZD48dGQ+bWVyZ2VkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMQ2FjaGVTZXJ2ZXJQYXRoPC9jb2RlPiA8ZW0+ZGlyPC9lbT48L3RkPjx0ZD4tPC90ZD48dGQ+ZnVuY3Rpb25hbGl0eSByZW1vdmVkPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMQ2FjaGVTZXJ2ZXJQb3J0PC9jb2RlPiA8ZW0+aW50ZWdlcjwvZW0+PC90ZD48dGQ+LTwvdGQ+PHRkPmZ1bmN0aW9uYWxpdHkgcmVtb3ZlZDwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkIGNvbHNwYW49IjMiPjxiPkFwYWNoZS1TU0wgMS54IGNvbXBhdGliaWxpdHk6PC9iPjwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTEV4cG9ydENsaWVudENlcnRpZmljYXRlczwvdGQ+PHRkPjxjb2RlPlNTTE9wdGlvbnMgK0V4cG9ydENlcnREYXRhPC9jb2RlPjwvdGQ+PHRkPm1lcmdlZDwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlNTTENhY2hlU2VydmVyUnVuRGlyPC9jb2RlPiA8ZW0+ZGlyPC9lbT48L3RkPjx0ZD4tPC90ZD48dGQ+ZnVuY3Rpb25hbGl0eSBub3Qgc3VwcG9ydGVkPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQgY29sc3Bhbj0iMyI+PGI+U2lvdXggMS54IGNvbXBhdGliaWxpdHk6PC9iPjwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlNTTF9DZXJ0RmlsZTwvY29kZT4gPGVtPmZpbGU8L2VtPjwvdGQ+PHRkPjxjb2RlPlNTTENlcnRpZmljYXRlRmlsZTwvY29kZT4gPGVtPmZpbGU8L2VtPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfS2V5RmlsZTwvY29kZT4gPGVtPmZpbGU8L2VtPjwvdGQ+PHRkPjxjb2RlPlNTTENlcnRpZmljYXRlS2V5RmlsZTwvY29kZT4gPGVtPmZpbGU8L2VtPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xfQ2lwaGVyU3VpdGU8L2NvZGU+IDxlbT5hcmc8L2VtPjwvdGQ+PHRkPjxjb2RlPlNTTENpcGhlclN1aXRlPC9jb2RlPiA8ZW0+YXJnPC9lbT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMX1g1MDlWZXJpZnlEaXI8L2NvZGU+IDxlbT5hcmc8L2VtPjwvdGQ+PHRkPjxjb2RlPlNTTENBQ2VydGlmaWNhdGVQYXRoPC9jb2RlPiA8ZW0+YXJnPC9lbT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX0xvZzwvY29kZT4gPGVtPmZpbGU8L2VtPjwvdGQ+PHRkPjxjb2RlPlNTTExvZ0ZpbGU8L2NvZGU+IDxlbT5maWxlPC9lbT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMX0Nvbm5lY3Q8L2NvZGU+IDxlbT5mbGFnPC9lbT48L3RkPjx0ZD48Y29kZT5TU0xFbmdpbmU8L2NvZGU+IDxlbT5mbGFnPC9lbT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX0NsaWVudEF1dGg8L2NvZGU+IDxlbT5hcmc8L2VtPjwvdGQ+PHRkPjxjb2RlPlNTTFZlcmlmeUNsaWVudDwvY29kZT4gPGVtPmFyZzwvZW0+PC90ZD48dGQ+cmVuYW1lZDwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTF9YNTA5VmVyaWZ5RGVwdGg8L2NvZGU+IDxlbT5hcmc8L2VtPjwvdGQ+PHRkPjxjb2RlPlNTTFZlcmlmeURlcHRoPC9jb2RlPiA8ZW0+YXJnPC9lbT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX0ZldGNoS2V5UGhyYXNlRnJvbTwvY29kZT4gPGVtPmFyZzwvZW0+PC90ZD48dGQ+LTwvdGQ+PHRkPm5vdCBkaXJlY3RseSBtYXBwYWJsZTsgdXNlIFNTTFBhc3NQaHJhc2VEaWFsb2c8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfU2Vzc2lvbkRpcjwvY29kZT4gPGVtPmRpcjwvZW0+PC90ZD48dGQ+LTwvdGQ+PHRkPm5vdCBkaXJlY3RseSBtYXBwYWJsZTsgdXNlIFNTTFNlc3Npb25DYWNoZTwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlNTTF9SZXF1aXJlPC9jb2RlPiA8ZW0+ZXhwcjwvZW0+PC90ZD48dGQ+LTwvdGQ+PHRkPm5vdCBkaXJlY3RseSBtYXBwYWJsZTsgdXNlIFNTTFJlcXVpcmU8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfQ2VydEZpbGVUeXBlPC9jb2RlPiA8ZW0+YXJnPC9lbT48L3RkPjx0ZD4tPC90ZD48dGQ+ZnVuY3Rpb25hbGl0eSBub3Qgc3VwcG9ydGVkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX0tleUZpbGVUeXBlPC9jb2RlPiA8ZW0+YXJnPC9lbT48L3RkPjx0ZD4tPC90ZD48dGQ+ZnVuY3Rpb25hbGl0eSBub3Qgc3VwcG9ydGVkPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMX1g1MDlWZXJpZnlQb2xpY3k8L2NvZGU+IDxlbT5hcmc8L2VtPjwvdGQ+PHRkPi08L3RkPjx0ZD5mdW5jdGlvbmFsaXR5IG5vdCBzdXBwb3J0ZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xfTG9nWDUwOUF0dHJpYnV0ZXM8L2NvZGU+IDxlbT5hcmc8L2VtPjwvdGQ+PHRkPi08L3RkPjx0ZD5mdW5jdGlvbmFsaXR5IG5vdCBzdXBwb3J0ZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZCBjb2xzcGFuPSIzIj48Yj5TdHJvbmdob2xkIDIueCBjb21wYXRpYmlsaXR5OjwvYj48L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TdHJvbmdob2xkQWNjZWxlcmF0b3I8L2NvZGU+IDxlbT5kaXI8L2VtPjwvdGQ+PHRkPi08L3RkPjx0ZD5mdW5jdGlvbmFsaXR5IG5vdCBzdXBwb3J0ZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TdHJvbmdob2xkS2V5PC9jb2RlPiA8ZW0+ZGlyPC9lbT48L3RkPjx0ZD4tPC90ZD48dGQ+ZnVuY3Rpb25hbGl0eSBub3Qgc3VwcG9ydGVkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U3Ryb25naG9sZExpY2Vuc2VGaWxlPC9jb2RlPiA8ZW0+ZGlyPC9lbT48L3RkPjx0ZD4tPC90ZD48dGQ+ZnVuY3Rpb25hbGl0eSBub3Qgc3VwcG9ydGVkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMRmxhZzwvY29kZT4gPGVtPmZsYWc8L2VtPjwvdGQ+PHRkPjxjb2RlPlNTTEVuZ2luZTwvY29kZT4gPGVtPmZsYWc8L2VtPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xTZXNzaW9uTG9ja0ZpbGU8L2NvZGU+IDxlbT5maWxlPC9lbT48L3RkPjx0ZD48Y29kZT5TU0xNdXRleDwvY29kZT4gPGVtPmZpbGU8L2VtPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xDaXBoZXJMaXN0PC9jb2RlPiA8ZW0+c3BlYzwvZW0+PC90ZD48dGQ+PGNvZGU+U1NMQ2lwaGVyU3VpdGU8L2NvZGU+IDxlbT5zcGVjPC9lbT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+UmVxdWlyZVNTTDwvY29kZT48L3RkPjx0ZD48Y29kZT5TU0xSZXF1aXJlU1NMPC9jb2RlPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xFcnJvckZpbGU8L2NvZGU+IDxlbT5maWxlPC9lbT48L3RkPjx0ZD4tPC90ZD48dGQ+ZnVuY3Rpb25hbGl0eSBub3Qgc3VwcG9ydGVkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMUm9vdDwvY29kZT4gPGVtPmRpcjwvZW0+PC90ZD48dGQ+LTwvdGQ+PHRkPmZ1bmN0aW9uYWxpdHkgbm90IHN1cHBvcnRlZDwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTF9DZXJ0aWZpY2F0ZUxvZ0RpcjwvY29kZT4gPGVtPmRpcjwvZW0+PC90ZD48dGQ+LTwvdGQ+PHRkPmZ1bmN0aW9uYWxpdHkgbm90IHN1cHBvcnRlZDwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPkF1dGhDZXJ0RGlyPC9jb2RlPiA8ZW0+ZGlyPC9lbT48L3RkPjx0ZD4tPC90ZD48dGQ+ZnVuY3Rpb25hbGl0eSBub3Qgc3VwcG9ydGVkPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMX0dyb3VwPC9jb2RlPiA8ZW0+bmFtZTwvZW0+PC90ZD48dGQ+LTwvdGQ+PHRkPmZ1bmN0aW9uYWxpdHkgbm90IHN1cHBvcnRlZDwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlNTTFByb3h5TWFjaGluZUNlcnRQYXRoPC9jb2RlPiA8ZW0+ZGlyPC9lbT48L3RkPjx0ZD4tPC90ZD48dGQ+ZnVuY3Rpb25hbGl0eSBub3Qgc3VwcG9ydGVkPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMUHJveHlNYWNoaW5lQ2VydEZpbGU8L2NvZGU+IDxlbT5maWxlPC9lbT48L3RkPjx0ZD4tPC90ZD48dGQ+ZnVuY3Rpb25hbGl0eSBub3Qgc3VwcG9ydGVkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMUHJveHlDQUNlcnRpZmljYXRlUGF0aDwvY29kZT4gPGVtPmRpcjwvZW0+PC90ZD48dGQ+LTwvdGQ+PHRkPmZ1bmN0aW9uYWxpdHkgbm90IHN1cHBvcnRlZDwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTFByb3h5Q0FDZXJ0aWZpY2F0ZUZpbGU8L2NvZGU+IDxlbT5maWxlPC9lbT48L3RkPjx0ZD4tPC90ZD48dGQ+ZnVuY3Rpb25hbGl0eSBub3Qgc3VwcG9ydGVkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMUHJveHlWZXJpZnlEZXB0aDwvY29kZT4gPGVtPm51bWJlcjwvZW0+PC90ZD48dGQ+LTwvdGQ+PHRkPmZ1bmN0aW9uYWxpdHkgbm90IHN1cHBvcnRlZDwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTFByb3h5Q2lwaGVyTGlzdDwvY29kZT4gPGVtPnNwZWM8L2VtPjwvdGQ+PHRkPi08L3RkPjx0ZD5mdW5jdGlvbmFsaXR5IG5vdCBzdXBwb3J0ZWQ8L3RkPjwvdHI+Ci08L3RhYmxlPgotPC90ZD4KLTwvdHI+PC90YWJsZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotPC9kaXY+Ci08cD4KLTxicj4KLTxoMj48YSBuYW1lPSJUb0MyIj5FbnZpcm9ubWVudCBWYXJpYWJsZXM8L2E+PC9oMj4KLVdoZW4geW91IHVzZSBgYDxjb2RlPlNTTE9wdGlvbnMgK0NvbXBhdEVudlZhcnM8L2NvZGU+JycgYWRkaXRpb25hbCBlbnZpcm9ubWVudAotdmFyaWFibGVzIGFyZSBnZW5lcmF0ZWQuIFRoZXkgYWxsIGNvcnJlc3BvbmQgdG8gZXhpc3Rpbmcgb2ZmaWNpYWwgbW9kX3NzbAotdmFyaWFibGVzLiBUaGUgY3VycmVudGx5IGltcGxlbWVudGVkIHZhcmlhYmxlIGRlcml2YXRpb24gaXMgbGlzdGVkIGluIDxhCi1ocmVmPSIjdGFibGUyIj5UYWJsZSAyPC9hPi4KLTxwPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxhIG5hbWU9InRhYmxlMiI+PC9hPgotPHRhYmxlIHdpZHRoPSI2MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPGNhcHRpb24gYWxpZ249ImJvdHRvbSIgaWQ9InNmIj5UYWJsZSAyOiBFbnZpcm9ubWVudCBWYXJpYWJsZSBEZXJpdmF0aW9uPC9jYXB0aW9uPgotPHRyPjx0ZCBiZ2NvbG9yPSIjY2NjY2NjIj4KLTx0YWJsZSB3aWR0aD0iNTk4IiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiNmZmZmZmYiPgotPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iNTk4IiBzdW1tYXJ5PSIiPgotPHRyIGlkPSJEIj4KLTx0ZD48c3Ryb25nPk9sZCBWYXJpYWJsZTwvc3Ryb25nPjwvdGQ+Ci08dGQ+PHN0cm9uZz5tb2Rfc3NsIFZhcmlhYmxlPC9zdHJvbmc+PC90ZD4KLTx0ZD48c3Ryb25nPkNvbW1lbnQ8L3N0cm9uZz48L3RkPgotPC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlNTTF9QUk9UT0NPTF9WRVJTSU9OPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPlNTTF9QUk9UT0NPTDwvY29kZT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMRUFZX1ZFUlNJT048L2NvZGU+PC90ZD48dGQ+PGNvZGU+U1NMX1ZFUlNJT05fTElCUkFSWTwvY29kZT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+SFRUUFNfU0VDUkVUS0VZU0laRTwvY29kZT48L3RkPjx0ZD48Y29kZT5TU0xfQ0lQSEVSX1VTRUtFWVNJWkU8L2NvZGU+PC90ZD48dGQ+cmVuYW1lZDwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPkhUVFBTX0tFWVNJWkU8L2NvZGU+PC90ZD48dGQ+PGNvZGU+U1NMX0NJUEhFUl9BTEdLRVlTSVpFPC9jb2RlPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5IVFRQU19DSVBIRVI8L2NvZGU+PC90ZD48dGQ+PGNvZGU+U1NMX0NJUEhFUjwvY29kZT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+SFRUUFNfRVhQT1JUPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPlNTTF9DSVBIRVJfRVhQT1JUPC9jb2RlPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xfU0VSVkVSX0tFWV9TSVpFPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPlNTTF9DSVBIRVJfQUxHS0VZU0laRTwvY29kZT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMX1NFUlZFUl9DRVJUSUZJQ0FURTwvY29kZT48L3RkPjx0ZD48Y29kZT5TU0xfU0VSVkVSX0NFUlQ8L2NvZGU+PC90ZD48dGQ+cmVuYW1lZDwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlNTTF9TRVJWRVJfQ0VSVF9TVEFSVDwvY29kZT48L3RkPjx0ZD48Y29kZT5TU0xfU0VSVkVSX1ZfU1RBUlQ8L2NvZGU+PC90ZD48dGQ+cmVuYW1lZDwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTF9TRVJWRVJfQ0VSVF9FTkQ8L2NvZGU+PC90ZD48dGQ+PGNvZGU+U1NMX1NFUlZFUl9WX0VORDwvY29kZT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX1NFUlZFUl9DRVJUX1NFUklBTDwvY29kZT48L3RkPjx0ZD48Y29kZT5TU0xfU0VSVkVSX01fU0VSSUFMPC9jb2RlPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xfU0VSVkVSX1NJR05BVFVSRV9BTEdPUklUSE08L2NvZGU+PC90ZD48dGQ+PGNvZGU+U1NMX1NFUlZFUl9BX1NJRzwvY29kZT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX1NFUlZFUl9ETjwvY29kZT48L3RkPjx0ZD48Y29kZT5TU0xfU0VSVkVSX1NfRE48L2NvZGU+PC90ZD48dGQ+cmVuYW1lZDwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlNTTF9TRVJWRVJfQ048L2NvZGU+PC90ZD48dGQ+PGNvZGU+U1NMX1NFUlZFUl9TX0ROX0NOPC9jb2RlPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfU0VSVkVSX0VNQUlMPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPlNTTF9TRVJWRVJfU19ETl9FbWFpbDwvY29kZT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX1NFUlZFUl9PPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPlNTTF9TRVJWRVJfU19ETl9PPC9jb2RlPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfU0VSVkVSX09VPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPlNTTF9TRVJWRVJfU19ETl9PVTwvY29kZT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX1NFUlZFUl9DPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPlNTTF9TRVJWRVJfU19ETl9DPC9jb2RlPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfU0VSVkVSX1NQPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPlNTTF9TRVJWRVJfU19ETl9TUDwvY29kZT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX1NFUlZFUl9MPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPlNTTF9TRVJWRVJfU19ETl9MPC9jb2RlPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xfU0VSVkVSX0lETjwvY29kZT48L3RkPjx0ZD48Y29kZT5TU0xfU0VSVkVSX0lfRE48L2NvZGU+PC90ZD48dGQ+cmVuYW1lZDwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTF9TRVJWRVJfSUNOPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPlNTTF9TRVJWRVJfSV9ETl9DTjwvY29kZT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX1NFUlZFUl9JRU1BSUw8L2NvZGU+PC90ZD48dGQ+PGNvZGU+U1NMX1NFUlZFUl9JX0ROX0VtYWlsPC9jb2RlPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfU0VSVkVSX0lPPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPlNTTF9TRVJWRVJfSV9ETl9PPC9jb2RlPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xfU0VSVkVSX0lPVTwvY29kZT48L3RkPjx0ZD48Y29kZT5TU0xfU0VSVkVSX0lfRE5fT1U8L2NvZGU+PC90ZD48dGQ+cmVuYW1lZDwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTF9TRVJWRVJfSUM8L2NvZGU+PC90ZD48dGQ+PGNvZGU+U1NMX1NFUlZFUl9JX0ROX0M8L2NvZGU+PC90ZD48dGQ+cmVuYW1lZDwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlNTTF9TRVJWRVJfSVNQPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPlNTTF9TRVJWRVJfSV9ETl9TUDwvY29kZT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMX1NFUlZFUl9JTDwvY29kZT48L3RkPjx0ZD48Y29kZT5TU0xfU0VSVkVSX0lfRE5fTDwvY29kZT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX0NMSUVOVF9DRVJUSUZJQ0FURTwvY29kZT48L3RkPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX0NFUlQ8L2NvZGU+PC90ZD48dGQ+cmVuYW1lZDwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTF9DTElFTlRfQ0VSVF9TVEFSVDwvY29kZT48L3RkPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX1ZfU1RBUlQ8L2NvZGU+PC90ZD48dGQ+cmVuYW1lZDwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlNTTF9DTElFTlRfQ0VSVF9FTkQ8L2NvZGU+PC90ZD48dGQ+PGNvZGU+U1NMX0NMSUVOVF9WX0VORDwvY29kZT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX0NMSUVOVF9DRVJUX1NFUklBTDwvY29kZT48L3RkPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX01fU0VSSUFMPC9jb2RlPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX1NJR05BVFVSRV9BTEdPUklUSE08L2NvZGU+PC90ZD48dGQ+PGNvZGU+U1NMX0NMSUVOVF9BX1NJRzwvY29kZT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMX0NMSUVOVF9ETjwvY29kZT48L3RkPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX1NfRE48L2NvZGU+PC90ZD48dGQ+cmVuYW1lZDwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTF9DTElFTlRfQ048L2NvZGU+PC90ZD48dGQ+PGNvZGU+U1NMX0NMSUVOVF9TX0ROX0NOPC9jb2RlPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX0VNQUlMPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPlNTTF9DTElFTlRfU19ETl9FbWFpbDwvY29kZT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMX0NMSUVOVF9PPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPlNTTF9DTElFTlRfU19ETl9PPC9jb2RlPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX09VPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPlNTTF9DTElFTlRfU19ETl9PVTwvY29kZT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMX0NMSUVOVF9DPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPlNTTF9DTElFTlRfU19ETl9DPC9jb2RlPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX1NQPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPlNTTF9DTElFTlRfU19ETl9TUDwvY29kZT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMX0NMSUVOVF9MPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPlNTTF9DTElFTlRfU19ETl9MPC9jb2RlPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX0lETjwvY29kZT48L3RkPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX0lfRE48L2NvZGU+PC90ZD48dGQ+cmVuYW1lZDwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlNTTF9DTElFTlRfSUNOPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPlNTTF9DTElFTlRfSV9ETl9DTjwvY29kZT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+U1NMX0NMSUVOVF9JRU1BSUw8L2NvZGU+PC90ZD48dGQ+PGNvZGU+U1NMX0NMSUVOVF9JX0ROX0VtYWlsPC9jb2RlPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX0lPPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPlNTTF9DTElFTlRfSV9ETl9PPC9jb2RlPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX0lPVTwvY29kZT48L3RkPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX0lfRE5fT1U8L2NvZGU+PC90ZD48dGQ+cmVuYW1lZDwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlNTTF9DTElFTlRfSUM8L2NvZGU+PC90ZD48dGQ+PGNvZGU+U1NMX0NMSUVOVF9JX0ROX0M8L2NvZGU+PC90ZD48dGQ+cmVuYW1lZDwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTF9DTElFTlRfSVNQPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPlNTTF9DTElFTlRfSV9ETl9TUDwvY29kZT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX0NMSUVOVF9JTDwvY29kZT48L3RkPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX0lfRE5fTDwvY29kZT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX0VYUE9SVDwvY29kZT48L3RkPjx0ZD48Y29kZT5TU0xfQ0lQSEVSX0VYUE9SVDwvY29kZT48L3RkPjx0ZD5yZW5hbWVkPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX0tFWVNJWkU8L2NvZGU+PC90ZD48dGQ+PGNvZGU+U1NMX0NJUEhFUl9BTEdLRVlTSVpFPC9jb2RlPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xfU0VDS0VZU0laRTwvY29kZT48L3RkPjx0ZD48Y29kZT5TU0xfQ0lQSEVSX1VTRUtFWVNJWkU8L2NvZGU+PC90ZD48dGQ+cmVuYW1lZDwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlNTTF9TU0xFQVlfVkVSU0lPTjwvY29kZT48L3RkPjx0ZD48Y29kZT5TU0xfVkVSU0lPTl9MSUJSQVJZPC9jb2RlPjwvdGQ+PHRkPnJlbmFtZWQ8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfU1RST05HX0NSWVBUTzwvY29kZT48L3RkPjx0ZD48Y29kZT4tPC9jb2RlPjwvdGQ+PHRkPk5vdCBzdXBwb3J0ZWQgYnkgbW9kX3NzbDwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTF9TRVJWRVJfS0VZX0VYUDwvY29kZT48L3RkPjx0ZD48Y29kZT4tPC9jb2RlPjwvdGQ+PHRkPk5vdCBzdXBwb3J0ZWQgYnkgbW9kX3NzbDwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlNTTF9TRVJWRVJfS0VZX0FMR09SSVRITTwvY29kZT48L3RkPjx0ZD48Y29kZT4tPC9jb2RlPjwvdGQ+PHRkPk5vdCBzdXBwb3J0ZWQgYnkgbW9kX3NzbDwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTF9TRVJWRVJfS0VZX1NJWkU8L2NvZGU+PC90ZD48dGQ+PGNvZGU+LTwvY29kZT48L3RkPjx0ZD5Ob3Qgc3VwcG9ydGVkIGJ5IG1vZF9zc2w8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xfU0VSVkVSX1NFU1NJT05ESVI8L2NvZGU+PC90ZD48dGQ+PGNvZGU+LTwvY29kZT48L3RkPjx0ZD5Ob3Qgc3VwcG9ydGVkIGJ5IG1vZF9zc2w8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfU0VSVkVSX0NFUlRJRklDQVRFTE9HRElSPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPi08L2NvZGU+PC90ZD48dGQ+Tm90IHN1cHBvcnRlZCBieSBtb2Rfc3NsPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+U1NMX1NFUlZFUl9DRVJURklMRTwvY29kZT48L3RkPjx0ZD48Y29kZT4tPC9jb2RlPjwvdGQ+PHRkPk5vdCBzdXBwb3J0ZWQgYnkgbW9kX3NzbDwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPlNTTF9TRVJWRVJfS0VZRklMRTwvY29kZT48L3RkPjx0ZD48Y29kZT4tPC9jb2RlPjwvdGQ+PHRkPk5vdCBzdXBwb3J0ZWQgYnkgbW9kX3NzbDwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPlNTTF9TRVJWRVJfS0VZRklMRVRZUEU8L2NvZGU+PC90ZD48dGQ+PGNvZGU+LTwvY29kZT48L3RkPjx0ZD5Ob3Qgc3VwcG9ydGVkIGJ5IG1vZF9zc2w8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX0tFWV9FWFA8L2NvZGU+PC90ZD48dGQ+PGNvZGU+LTwvY29kZT48L3RkPjx0ZD5Ob3Qgc3VwcG9ydGVkIGJ5IG1vZF9zc2w8L3RkPjwvdHI+Ci08dHIgaWQ9IkgiPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX0tFWV9BTEdPUklUSE08L2NvZGU+PC90ZD48dGQ+PGNvZGU+LTwvY29kZT48L3RkPjx0ZD5Ob3Qgc3VwcG9ydGVkIGJ5IG1vZF9zc2w8L3RkPjwvdHI+Ci08dHIgaWQ9IkQiPjx0ZD48Y29kZT5TU0xfQ0xJRU5UX0tFWV9TSVpFPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPi08L2NvZGU+PC90ZD48dGQ+Tm90IHN1cHBvcnRlZCBieSBtb2Rfc3NsPC90ZD48L3RyPgotPC90YWJsZT4KLTwvdGQ+Ci08L3RyPjwvdGFibGU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLTwvZGl2PgotPHA+Ci08YnI+Ci08aDI+PGEgbmFtZT0iVG9DMyI+Q3VzdG9tIExvZyBGdW5jdGlvbnM8L2E+PC9oMj4KLVdoZW4gbW9kX3NzbCBpcyBidWlsdCBpbnRvIEFwYWNoZSBvciBhdCBsZWFzdCBsb2FkZWQgKHVuZGVyIERTTyBzaXR1YXRpb24pCi1hZGRpdGlvbmFsIGZ1bmN0aW9ucyBleGlzdCBmb3IgdGhlIDxhCi1ocmVmPSIuLi9tb2RfbG9nX2NvbmZpZy5odG1sI2Zvcm1hdHMiPkN1c3RvbSBMb2cgRm9ybWF0PC9hPiBvZiA8YQotaHJlZj0iLi4vbW9kX2xvZ19jb25maWcuaHRtbCI+bW9kX2xvZ19jb25maWc8L2E+IGFzIGRvY3VtZW50ZWQgaW4gdGhlIFJlZmVyZW5jZQotQ2hhcHRlci4gQmVzaWRlIHRoZSBgYDxjb2RlPiV7PC9jb2RlPjxlbT52YXJuYW1lPC9lbT48Y29kZT59eDwvY29kZT4nJwotZVh0ZW5zaW9uIGZvcm1hdCBmdW5jdGlvbiB3aGljaCBjYW4gYmUgdXNlZCB0byBleHBhbmQgYW55IHZhcmlhYmxlcyBwcm92aWRlZAotYnkgYW55IG1vZHVsZSwgYW4gYWRkaXRpb25hbCBDcnlwdG9ncmFwaHkKLWBgPGNvZGU+JXs8L2NvZGU+PGVtPm5hbWU8L2VtPjxjb2RlPn1jPC9jb2RlPicnIGNyeXB0b2dyYXBoeSBmb3JtYXQgZnVuY3Rpb24KLWV4aXN0cyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gVGhlIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBmdW5jdGlvbiBjYWxscwotYXJlIGxpc3RlZCBpbiA8YSBocmVmPSIjdGFibGUzIj5UYWJsZSAzPC9hPi4KLTxwPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxhIG5hbWU9InRhYmxlMyI+PC9hPgotPHRhYmxlIHdpZHRoPSI2MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPGNhcHRpb24gYWxpZ249ImJvdHRvbSIgaWQ9InNmIj5UYWJsZSAzOiBDdXN0b20gTG9nIENyeXB0b2dyYXBoeSBGdW5jdGlvbjwvY2FwdGlvbj4KLTx0cj48dGQgYmdjb2xvcj0iI2NjY2NjYyI+Ci08dGFibGUgd2lkdGg9IjU5OCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjZmZmZmZmIj4KLTx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjU5OCIgc3VtbWFyeT0iIj4KLTx0ciBpZD0iSCI+Ci0gPHRkPjxzdHJvbmc+RnVuY3Rpb24gQ2FsbDwvc3Ryb25nPjwvdGQ+Ci0gPHRkPjxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz48L3RkPgotPC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPiUuLi57dmVyc2lvbn1jPC9jb2RlPjwvdGQ+ICAgPHRkPlNTTCBwcm90b2NvbCB2ZXJzaW9uPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+JS4uLntjaXBoZXJ9YzwvY29kZT48L3RkPiAgICA8dGQ+U1NMIGNpcGhlcjwvdGQ+PC90cj4KLTx0ciBpZD0iRCI+PHRkPjxjb2RlPiUuLi57c3ViamVjdGRufWM8L2NvZGU+PC90ZD4gPHRkPkNsaWVudCBDZXJ0aWZpY2F0ZSBTdWJqZWN0IERpc3Rpbmd1aXNoZWQgTmFtZTwvdGQ+PC90cj4KLTx0ciBpZD0iSCI+PHRkPjxjb2RlPiUuLi57aXNzdWVyZG59YzwvY29kZT48L3RkPiAgPHRkPkNsaWVudCBDZXJ0aWZpY2F0ZSBJc3N1ZXIgRGlzdGluZ3Vpc2hlZCBOYW1lPC90ZD48L3RyPgotPHRyIGlkPSJEIj48dGQ+PGNvZGU+JS4uLntlcnJjb2RlfWM8L2NvZGU+PC90ZD4gICA8dGQ+Q2VydGlmaWNhdGUgVmVyaWZpY2F0aW9uIEVycm9yIChudW1lcmljYWwpPC90ZD48L3RyPgotPHRyIGlkPSJIIj48dGQ+PGNvZGU+JS4uLntlcnJzdHJ9YzwvY29kZT48L3RkPiAgICA8dGQ+Q2VydGlmaWNhdGUgVmVyaWZpY2F0aW9uIEVycm9yIChzdHJpbmcpPC90ZD48L3RyPgotPC90YWJsZT4KLTwvdGQ+Ci08L3RyPjwvdGFibGU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLTwvZGl2PgotICAgICAgPHA+Ci0gICAgICA8YnI+Ci0gICAgICA8dGFibGUgc3VtbWFyeT0iIj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPgotICAgICAgICAgICA8dGFibGUgd2lkdGg9IjYwMCIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0IiB3aWR0aD0iMjUwIj4KLTxhIGhyZWY9InNzbF9yZWZlcmVuY2UuaHRtbCIgb25tb3VzZW92ZXI9InJvX2ltZ092ZXIoJ3JvX2ltZ19wcmV2X2JvdCcsICdwcmV2aW91cyBwYWdlJyk7IHJldHVybiB0cnVlIiBvbm1vdXNlb3V0PSJyb19pbWdOb3JtYWwoJ3JvX2ltZ19wcmV2X2JvdCcpOyByZXR1cm4gdHJ1ZSIgb25mb2N1cz0icm9faW1nT3Zlcigncm9faW1nX3ByZXZfYm90JywgJ3ByZXZpb3VzIHBhZ2UnKTsgcmV0dXJuIHRydWUiIG9uYmx1cj0icm9faW1nTm9ybWFsKCdyb19pbWdfcHJldl9ib3QnKTsgcmV0dXJuIHRydWUiPjxpbWcgbmFtZT0icm9faW1nX3ByZXZfYm90IiBzcmM9InNzbF90ZW1wbGF0ZS5uYXZidXQtcHJldi1uLmdpZiIgYWx0PSJwcmV2aW91cyBwYWdlIiB3aWR0aD0iNzAiIGhlaWdodD0iMTgiIGJvcmRlcj0iMCI+PC9hPjxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+UmVmZXJlbmNlPC9mb250PgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249InJpZ2h0IiB3aWR0aD0iMjUwIj4KLTxhIGhyZWY9InNzbF9ob3d0by5odG1sIiBvbm1vdXNlb3Zlcj0icm9faW1nT3Zlcigncm9faW1nX25leHRfYm90JywgJ25leHQgcGFnZScpOyByZXR1cm4gdHJ1ZSIgb25tb3VzZW91dD0icm9faW1nTm9ybWFsKCdyb19pbWdfbmV4dF9ib3QnKTsgcmV0dXJuIHRydWUiIG9uZm9jdXM9InJvX2ltZ092ZXIoJ3JvX2ltZ19uZXh0X2JvdCcsICduZXh0IHBhZ2UnKTsgcmV0dXJuIHRydWUiIG9uYmx1cj0icm9faW1nTm9ybWFsKCdyb19pbWdfbmV4dF9ib3QnKTsgcmV0dXJuIHRydWUiPjxpbWcgbmFtZT0icm9faW1nX25leHRfYm90IiBzcmM9InNzbF90ZW1wbGF0ZS5uYXZidXQtbmV4dC1uLmdpZiIgYWx0PSJuZXh0IHBhZ2UiIHdpZHRoPSI3MCIgaGVpZ2h0PSIxOCIgYm9yZGVyPSIwIj48L2E+PGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj5Ib3dUbzwvZm9udD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS0wMDAwMDAuZ2lmIiBhbHQ9IiIgd2lkdGg9IjYwMCIgaGVpZ2h0PSIyIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+PHRhYmxlIHdpZHRoPSI1OTgiIHN1bW1hcnk9IiI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPgotICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm1vZHNzbC5vcmcvIj5tb2Rfc3NsPC9hPiAyLjgsIFVzZXIgTWFudWFsPGJyPgotICAgICAgICBUaGUgQXBhY2hlIEludGVyZmFjZSB0byBPcGVuU1NMCi0gICAgICAgIDwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj4KLSAgICAgICAgQ29weXJpZ2h0ICZjb3B5OyAxOTk4LTIwMDEKLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5lbmdlbHNjaGFsbC5jb20vIj5SYWxmIFMuIEVuZ2Vsc2NoYWxsPC9hPjxicj4KLSAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZDxicj4KLSAgICAgICAgPC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gIDwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvc3NsL3NzbF9mYXEuaHRtbCBiL2RvY3MvbWFudWFsL3NzbC9zc2xfZmFxLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZDNhYTguLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvc3NsL3NzbF9mYXEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2NDMgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5tb2Rfc3NsOiBGLkEuUS48L3RpdGxlPgotCi08IS0tCi0gIENvcHlyaWdodCAoYykgMTk5OC0yMDAxIFJhbGYgUy4gRW5nZWxzY2hhbGwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICBhcmUgbWV0OgotCi0gIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKLSAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAgICAgZGlzY2xhaW1lci4gCi0gCi0gIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAKLSAgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi0gICAgICBSYWxmIFMuIEVuZ2Vsc2NoYWxsIDxyc2VAZW5nZWxzY2hhbGwuY29tPiBmb3IgdXNlIGluIHRoZQotICAgICAgbW9kX3NzbCBwcm9qZWN0IChodHRwOi8vd3d3Lm1vZHNzbC5vcmcvKS4iCi0gCi0gIDQuIFRoZSBuYW1lICJtb2Rfc3NsIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAgICAgcGVybWlzc2lvbi4gIAotCi0gIDUuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZQotICAgICBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotICAgICAgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGVuZ2Vsc2NoYWxsLmNvbT4gZm9yIHVzZSBpbiB0aGUKLSAgICAgIG1vZF9zc2wgcHJvamVjdCAoaHR0cDovL3d3dy5tb2Rzc2wub3JnLykuIgotIAotICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFJBTEYgUy4gRU5HRUxTQ0hBTEwgYGBBUyBJUycnIEFORCBBTlkKLSAgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFJBTEYgUy4gRU5HRUxTQ0hBTEwgT1IKLSAgSElTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS0tPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj48IS0tCi1BOmxpbmsgewotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSAgICBjb2xvcjogIzY2NjZjYzsKLX0KLUE6YWN0aXZlIHsKLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gICAgY29sb3I6ICM2NjY2Y2M7Ci19Ci1BOnZpc2l0ZWQgewotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSAgICBjb2xvcjogIzY2NjZjYzsKLX0KLSNzZiB7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYTsKLSAgICBmb250LXZhcmlhbnQ6IG5vcm1hbDsKLSAgICBmb250LXN0eWxlOiBub3JtYWw7Ci19Ci1IMSB7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgZm9udC1zaXplOiAyNHB0OwotICAgIGxpbmUtaGVpZ2h0OiAyNHB0OwotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCxoZWx2ZXRpY2E7Ci0gICAgZm9udC12YXJpYW50OiBub3JtYWw7Ci0gICAgZm9udC1zdHlsZTogbm9ybWFsOwotfQotSDIgewotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgIGZvbnQtc2l6ZTogMThwdDsKLSAgICBsaW5lLWhlaWdodDogMThwdDsKLSAgICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhOwotICAgIGZvbnQtdmFyaWFudDogbm9ybWFsOwotICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLUgzIHsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICBmb250LXNpemU6IDE0cHQ7Ci0gICAgbGluZS1oZWlnaHQ6IDE0cHQ7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYTsKLSAgICBmb250LXZhcmlhbnQ6IG5vcm1hbDsKLSAgICBmb250LXN0eWxlOiBub3JtYWw7Ci19Ci1INCB7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgZm9udC1zaXplOiAxMnB0OwotICAgIGxpbmUtaGVpZ2h0OiAxMnB0OwotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCxoZWx2ZXRpY2E7Ci0gICAgZm9udC12YXJpYW50OiBub3JtYWw7Ci0gICAgZm9udC1zdHlsZTogbm9ybWFsOwotfQotI0ggewotfQotI0QgewotICAgIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7Ci19Ci0jZmFxIHsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICBmb250LXNpemU6IDE2cHQ7Ci0gICAgbGluZS1oZWlnaHQ6IDE2cHQ7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYTsKLSAgICBmb250LXZhcmlhbnQ6IG5vcm1hbDsKLSAgICBmb250LXN0eWxlOiBub3JtYWw7Ci19Ci0jaG93dG8gewotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgIGZvbnQtc2l6ZTogMTZwdDsKLSAgICBsaW5lLWhlaWdodDogMTZwdDsKLSAgICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhOwotICAgIGZvbnQtdmFyaWFudDogbm9ybWFsOwotICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLSN0ZXJtIHsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICBmb250LXNpemU6IDE2cHQ7Ci0gICAgbGluZS1oZWlnaHQ6IDE2cHQ7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYTsKLSAgICBmb250LXZhcmlhbnQ6IG5vcm1hbDsKLSAgICBmb250LXN0eWxlOiBub3JtYWw7Ci19Ci0tLT48L3N0eWxlPgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhLS0gSGlkaW5nIHRoZSBjb2RlCi1mdW5jdGlvbiByb19pbWdOb3JtYWwoaW1nTmFtZSkgewotICAgIGlmIChkb2N1bWVudC5pbWFnZXMpIHsKLSAgICAgICAgZG9jdW1lbnRbaW1nTmFtZV0uc3JjID0gZXZhbChpbWdOYW1lICsgJ19uLnNyYycpOwotICAgICAgICBzZWxmLnN0YXR1cyA9ICcnOwotICAgIH0KLX0KLWZ1bmN0aW9uIHJvX2ltZ092ZXIoaW1nTmFtZSwgZGVzY3JpcHQpIHsKLSAgICBpZiAoZG9jdW1lbnQuaW1hZ2VzKSB7Ci0gICAgICAgIGRvY3VtZW50W2ltZ05hbWVdLnNyYyA9IGV2YWwoaW1nTmFtZSArICdfby5zcmMnKTsKLSAgICAgICAgc2VsZi5zdGF0dXMgPSBkZXNjcmlwdDsKLSAgICB9Ci19Ci0vLyBkb25lIGhpZGluZyAtLT4KLTwvc2NyaXB0PgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhLS0gSGlkaW5nIHRoZSBjb2RlCi1pZiAoZG9jdW1lbnQuaW1hZ2VzKSB7Ci0gICAgcm9faW1nX3ByZXZfdG9wX24gPSBuZXcgSW1hZ2UoKTsKLSAgICByb19pbWdfcHJldl90b3Bfbi5zcmMgPSAnc3NsX3RlbXBsYXRlLm5hdmJ1dC1wcmV2LW4uZ2lmJzsKLSAgICByb19pbWdfcHJldl90b3BfbyA9IG5ldyBJbWFnZSgpOwotICAgIHJvX2ltZ19wcmV2X3RvcF9vLnNyYyA9ICdzc2xfdGVtcGxhdGUubmF2YnV0LXByZXYtcy5naWYnOwotfQotLy8gZG9uZSBoaWRpbmcgLS0+Ci08L3NjcmlwdD4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci08IS0tIEhpZGluZyB0aGUgY29kZQotaWYgKGRvY3VtZW50LmltYWdlcykgewotICAgIHJvX2ltZ19wcmV2X2JvdF9uID0gbmV3IEltYWdlKCk7Ci0gICAgcm9faW1nX3ByZXZfYm90X24uc3JjID0gJ3NzbF90ZW1wbGF0ZS5uYXZidXQtcHJldi1uLmdpZic7Ci0gICAgcm9faW1nX3ByZXZfYm90X28gPSBuZXcgSW1hZ2UoKTsKLSAgICByb19pbWdfcHJldl9ib3Rfby5zcmMgPSAnc3NsX3RlbXBsYXRlLm5hdmJ1dC1wcmV2LXMuZ2lmJzsKLX0KLS8vIGRvbmUgaGlkaW5nIC0tPgotPC9zY3JpcHQ+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotPCEtLSBIaWRpbmcgdGhlIGNvZGUKLWlmIChkb2N1bWVudC5pbWFnZXMpIHsKLSAgICByb19pbWdfbmV4dF90b3BfbiA9IG5ldyBJbWFnZSgpOwotICAgIHJvX2ltZ19uZXh0X3RvcF9uLnNyYyA9ICdzc2xfdGVtcGxhdGUubmF2YnV0LW5leHQtbi5naWYnOwotICAgIHJvX2ltZ19uZXh0X3RvcF9vID0gbmV3IEltYWdlKCk7Ci0gICAgcm9faW1nX25leHRfdG9wX28uc3JjID0gJ3NzbF90ZW1wbGF0ZS5uYXZidXQtbmV4dC1zLmdpZic7Ci19Ci0vLyBkb25lIGhpZGluZyAtLT4KLTwvc2NyaXB0PgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhLS0gSGlkaW5nIHRoZSBjb2RlCi1pZiAoZG9jdW1lbnQuaW1hZ2VzKSB7Ci0gICAgcm9faW1nX25leHRfYm90X24gPSBuZXcgSW1hZ2UoKTsKLSAgICByb19pbWdfbmV4dF9ib3Rfbi5zcmMgPSAnc3NsX3RlbXBsYXRlLm5hdmJ1dC1uZXh0LW4uZ2lmJzsKLSAgICByb19pbWdfbmV4dF9ib3RfbyA9IG5ldyBJbWFnZSgpOwotICAgIHJvX2ltZ19uZXh0X2JvdF9vLnNyYyA9ICdzc2xfdGVtcGxhdGUubmF2YnV0LW5leHQtcy5naWYnOwotfQotLy8gZG9uZSBoaWRpbmcgLS0+Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGJnY29sb3I9IiNmZmZmZmYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiMzMzMzOTkiIGFsaW5rPSIjOTk5OWZmIiB2bGluaz0iIzAwMDA2NiI+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPHRhYmxlIHdpZHRoPSI2MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPgotICA8dGQ+Ci0gICAgICA8aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSI2MDAiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48YnI+Ci0gICAgICA8dGFibGUgd2lkdGg9IjYwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBzdW1tYXJ5PSIiPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iNjAwIiBzdW1tYXJ5PSIiPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICAgIDxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSIgc2l6ZT0iKzIiPjxiPm1vZF9zc2w8L2I+PC9mb250PgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgotICAgICAgICAgICAgICA8aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmhlYWQtY2hhcHRlci5naWYiIGFsdD0iQ2hhcHRlciIgd2lkdGg9IjE3NSIgaGVpZ2h0PSI5NCI+IDxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaGVhZC1udW0tNi5naWYiIGFsdD0iNiIgd2lkdGg9Ijc0IiBoZWlnaHQ9Ijg5Ij4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLTAwMDAwMC5naWYiIGFsdD0iIiB3aWR0aD0iNjAwIiBoZWlnaHQ9IjIiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICAgPHRhYmxlIHdpZHRoPSI2MDAiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLSAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCIgd2lkdGg9IjI1MCI+Ci08YSBocmVmPSJzc2xfaG93dG8uaHRtbCIgb25tb3VzZW92ZXI9InJvX2ltZ092ZXIoJ3JvX2ltZ19wcmV2X3RvcCcsICdwcmV2aW91cyBwYWdlJyk7IHJldHVybiB0cnVlIiBvbm1vdXNlb3V0PSJyb19pbWdOb3JtYWwoJ3JvX2ltZ19wcmV2X3RvcCcpOyByZXR1cm4gdHJ1ZSIgb25mb2N1cz0icm9faW1nT3Zlcigncm9faW1nX3ByZXZfdG9wJywgJ3ByZXZpb3VzIHBhZ2UnKTsgcmV0dXJuIHRydWUiIG9uYmx1cj0icm9faW1nTm9ybWFsKCdyb19pbWdfcHJldl90b3AnKTsgcmV0dXJuIHRydWUiPjxpbWcgbmFtZT0icm9faW1nX3ByZXZfdG9wIiBzcmM9InNzbF90ZW1wbGF0ZS5uYXZidXQtcHJldi1uLmdpZiIgYWx0PSJwcmV2aW91cyBwYWdlIiB3aWR0aD0iNzAiIGhlaWdodD0iMTgiIGJvcmRlcj0iMCI+PC9hPjxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+SG93VG88L2ZvbnQ+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0icmlnaHQiIHdpZHRoPSIyNTAiPgotPGEgaHJlZj0ic3NsX2dsb3NzYXJ5Lmh0bWwiIG9ubW91c2VvdmVyPSJyb19pbWdPdmVyKCdyb19pbWdfbmV4dF90b3AnLCAnbmV4dCBwYWdlJyk7IHJldHVybiB0cnVlIiBvbm1vdXNlb3V0PSJyb19pbWdOb3JtYWwoJ3JvX2ltZ19uZXh0X3RvcCcpOyByZXR1cm4gdHJ1ZSIgb25mb2N1cz0icm9faW1nT3Zlcigncm9faW1nX25leHRfdG9wJywgJ25leHQgcGFnZScpOyByZXR1cm4gdHJ1ZSIgb25ibHVyPSJyb19pbWdOb3JtYWwoJ3JvX2ltZ19uZXh0X3RvcCcpOyByZXR1cm4gdHJ1ZSI+PGltZyBuYW1lPSJyb19pbWdfbmV4dF90b3AiIHNyYz0ic3NsX3RlbXBsYXRlLm5hdmJ1dC1uZXh0LW4uZ2lmIiBhbHQ9Im5leHQgcGFnZSIgd2lkdGg9IjcwIiBoZWlnaHQ9IjE4IiBib3JkZXI9IjAiPjwvYT48YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPkdsb3NzYXJ5PC9mb250PgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgPGJyPgotICAgICAgICAgIDxpbWcgc3JjPSJzc2xfdGVtcGxhdGUudGl0bGUtZmFxLmdpZiIgYWx0PSJGLkEuUS4iIHdpZHRoPSI0NTYiIGhlaWdodD0iNjAiPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci08ZGl2IGFsaWduPSJyaWdodCI+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMjAwIiBzdW1tYXJ5PSIiPgotPHRyPgotPHRkPgotPGVtPgotYGBUaGUgd2lzZSBtYW4gZG9lc24ndCBnaXZlIHRoZSByaWdodCBhbnN3ZXJzLAotaGUgcG9zZXMgdGhlIHJpZ2h0IHF1ZXN0aW9ucy4nJwotPC9lbT4KLTwvdGQ+Ci08L3RyPgotPHRyPgotPHRkIGFsaWduPSJyaWdodCI+Ci08Zm9udCBzaXplPSItMSI+Ci1DbGF1ZGUgTGV2aS1TdHJhdXNzCi08L2ZvbnQ+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTxwPgotPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyIHZhbGlnbj0iYm90dG9tIj4KLTx0ZD4KLTxpbWcgc3JjPSJzc2xfZmFxLmdmb250MDAwLmdpZiIgYWx0PSJUIiB3aWR0aD0iMzQiIGhlaWdodD0iMzQiIGJvcmRlcj0iMCIgYWxpZ249ImxlZnQiPgotaGlzIGNoYXB0ZXIgaXMgYSBjb2xsZWN0aW9uIG9mIGZyZXF1ZW50bHkgYXNrZWQgcXVlc3Rpb25zIChGQVEpIGFuZAotY29ycmVzcG9uZGluZyBhbnN3ZXJzIGZvbGxvd2luZyB0aGUgcG9wdWxhciBVU0VORVQgdHJhZGl0aW9uLiBNb3N0IG9mIHRoZXNlCi1xdWVzdGlvbnMgb2NjdXJlZCBvbiB0aGUgTmV3c2dyb3VwIDxhCi1ocmVmPSJuZXdzOmNvbXAuaW5mb3N5c3RlbXMud3d3LnNlcnZlcnMudW5peCI+Ci08Y29kZT5jb21wLmluZm9zeXN0ZW1zLnd3dy5zZXJ2ZXJzLnVuaXg8L2NvZGU+PC9hPiBvciB0aGUgbW9kX3NzbCBTdXBwb3J0Ci1NYWlsaW5nIExpc3QgPGEgaHJlZj0ibWFpbHRvOm1vZHNzbC11c2Vyc0Btb2Rzc2wub3JnIj4KLTxjb2RlPm1vZHNzbC11c2Vyc0Btb2Rzc2wub3JnPC9jb2RlPjwvYT4uIFRoZXkgYXJlIGNvbGxlY3RlZCBhdCB0aGlzIHBsYWNlCi10byBhdm9pZCBhbnN3ZXJpbmcgdGhlIHNhbWUgcXVlc3Rpb25zIG92ZXIgYW5kIG92ZXIuCi08cD4KLVBsZWFzZSByZWFkIHRoaXMgY2hhcHRlciBhdCBsZWFzdCBvbmNlIHdoZW4gaW5zdGFsbGluZyBtb2Rfc3NsIG9yIGF0IGxlYXN0Ci1zZWFyY2ggZm9yIHlvdXIgcHJvYmxlbSBoZXJlIGJlZm9yZSBzdWJtaXR0aW5nIGEgcHJvYmxlbSByZXBvcnQgdG8gdGhlCi1hdXRob3IuCi08L3RkPgotPHRkPgotJm5ic3A7Jm5ic3A7Ci08L3RkPgotPHRkPgotPGRpdiBhbGlnbj0icmlnaHQiPgotPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSIgYm9yZGVyPSIwIiBiZ2NvbG9yPSIjY2NjY2ZmIiB3aWR0aD0iMzUwIiBzdW1tYXJ5PSIiPgotPHRyPgotPHRkIGJnY29sb3I9IiMzMzMzOTkiPgotPGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIiBjb2xvcj0iI2NjY2NmZiI+Ci08Yj5UYWJsZSBPZiBDb250ZW50czwvYj4KLTwvZm9udD4KLTwvdGQ+Ci08L3RyPgotPHRyPgotPHRkPgotPGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIiBzaXplPSItMSI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DMSI+PHN0cm9uZz5BYm91dCB0aGUgbW9kdWxlPC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0MyIj48c3Ryb25nPldoYXQgaXMgdGhlIGhpc3Rvcnkgb2YgbW9kX3NzbD88L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzMiPjxzdHJvbmc+QXBhY2hlLVNTTCB2cy4gbW9kX3NzbDogZGlmZmVyZW5jZXM/PC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0M0Ij48c3Ryb25nPm1vZF9zc2wgdnMuIGNvbW1lcmNpYWwgYWx0ZXJuYXRpdmVzPzwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DNSI+PHN0cm9uZz5tb2Rfc3NsL0FwYWNoZSB2ZXJzaW9ucz88L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzYiPjxzdHJvbmc+bW9kX3NzbCBhbmQgWWVhciAyMDAwPzwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DNyI+PHN0cm9uZz5tb2Rfc3NsIGFuZCBXYXNzZW5hYXIgQXJyYW5nZW1lbnQ/PC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0M4Ij48c3Ryb25nPkFib3V0IEluc3RhbGxhdGlvbjwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DOSI+PHN0cm9uZz5Db3JlIGR1bXBzIGZvciBIVFRQUyByZXF1ZXN0cz88L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzEwIj48c3Ryb25nPkNvcmUgZHVtcHMgZm9yIEFwYWNoZSttb2Rfc3NsK1BIUDM/PC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0MxMSI+PHN0cm9uZz5VbmRlZmluZWQgc3ltYm9scyBvbiBzdGFydHVwPzwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DMTIiPjxzdHJvbmc+UGVybWlzc2lvbiBwcm9ibGVtIG9uIFNTTE11dGV4PC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0MxMyI+PHN0cm9uZz5TaGFyZWQgbWVtb3J5IGFuZCBwcm9jZXNzIHNpemU/PC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0MxNCI+PHN0cm9uZz5TaGFyZWQgbWVtb3J5IGFuZCBwYXRobmFtZT88L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzE1Ij48c3Ryb25nPlBSTkcgYW5kIG5vdCBlbm91Z2ggZW50cm9weT88L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzE2Ij48c3Ryb25nPkFib3V0IENvbmZpZ3VyYXRpb248L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzE3Ij48c3Ryb25nPkhUVFAgYW5kIEhUVFBTIHdpdGggYSBzaW5nbGUgc2VydmVyPzwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DMTgiPjxzdHJvbmc+V2hlcmUgaXMgdGhlIEhUVFBTIHBvcnQ/PC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0MxOSI+PHN0cm9uZz5Ib3cgdG8gdGVzdCBIVFRQUyBtYW51YWxseT88L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzIwIj48c3Ryb25nPldoeSBkb2VzIG15IGNvbm5lY3Rpb24gaGFuZz88L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzIxIj48c3Ryb25nPldoeSBkbyBJIGdldCBjb25uZWN0aW9uIHJlZnVzZWQ/PC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0MyMiI+PHN0cm9uZz5XaHkgYXJlIHRoZSBTU0xfWFhYIHZhcmlhYmxlcyBtaXNzaW5nPzwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DMjMiPjxzdHJvbmc+SG93IHRvIHN3aXRjaCB3aXRoIHJlbGF0aXZlIGh5cGVybGlua3M/PC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0MyNCI+PHN0cm9uZz5BYm91dCBDZXJ0aWZpY2F0ZXM8L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzI1Ij48c3Ryb25nPldoYXQgYXJlIEtleXMsIENTUnMgYW5kIENlcnRzPzwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DMjYiPjxzdHJvbmc+RGlmZmVyZW5jZSBvbiBzdGFydHVwPzwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DMjciPjxzdHJvbmc+SG93IHRvIGNyZWF0ZSBhIGR1bW15IGNlcnQ/PC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0MyOCI+PHN0cm9uZz5Ib3cgdG8gY3JlYXRlIGEgcmVhbCBjZXJ0Pzwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DMjkiPjxzdHJvbmc+SG93IHRvIGNyZWF0ZSBteSBvd24gQ0E/PC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0MzMCI+PHN0cm9uZz5Ib3cgdG8gY2hhbmdlIGEgcGFzcyBwaHJhc2U/PC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0MzMSI+PHN0cm9uZz5Ib3cgdG8gcmVtb3ZlIGEgcGFzcyBwaHJhc2U/PC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0MzMiI+PHN0cm9uZz5Ib3cgdG8gdmVyaWZ5IGEga2V5L2NlcnQgcGFpcj88L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzMzIj48c3Ryb25nPkJhZCBDZXJ0aWZpY2F0ZSBFcnJvcj88L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzM0Ij48c3Ryb25nPldoeSBkb2VzIGEgMjA0OC1iaXQga2V5IG5vdCB3b3JrPzwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DMzUiPjxzdHJvbmc+V2h5IGlzIGNsaWVudCBhdXRoIGJyb2tlbj88L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzM2Ij48c3Ryb25nPkhvdyB0byBjb252ZXJ0IGZyb20gUEVNIHRvIERFUj88L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzM3Ij48c3Ryb25nPlZlcmlzaWduIGFuZCB0aGUgbWFnaWMgZ2V0Y2EgcHJvZ3JhbT88L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzM4Ij48c3Ryb25nPkdsb2JhbCBJRHMgb3IgU0dDPzwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DMzkiPjxzdHJvbmc+R2xvYmFsIElEcyBhbmQgQ2VydCBDaGFpbj88L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzQwIj48c3Ryb25nPkFib3V0IFNTTCBQcm90b2NvbDwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DNDEiPjxzdHJvbmc+UmFuZG9tIFNTTCBlcnJvcnMgdW5kZXIgaGVhdnkgbG9hZD88L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzQyIj48c3Ryb25nPldoeSBoYXMgdGhlIHNlcnZlciBhIGhpZ2hlciBsb2FkPzwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DNDMiPjxzdHJvbmc+V2h5IGFyZSBjb25uZWN0aW9ucyBob3JyaWJseSBzbG93Pzwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DNDQiPjxzdHJvbmc+V2hpY2ggY2lwaGVycyBhcmUgc3VwcG9ydGVkPzwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DNDUiPjxzdHJvbmc+SG93IHRvIHVzZSBBbm9ueW1vdXMtREggY2lwaGVyczwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DNDYiPjxzdHJvbmc+V2h5IGRvIEkgZ2V0ICdubyBzaGFyZWQgY2lwaGVycyc/PC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0M0NyI+PHN0cm9uZz5IVFRQUyBhbmQgbmFtZS1iYXNlZCB2aG9zdHM8L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzQ4Ij48c3Ryb25nPlRoZSBsb2NrIGljb24gaW4gTmV0c2NhcGUgbG9ja3MgdmVyeSBsYXRlPC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0M0OSI+PHN0cm9uZz5XaHkgZG8gSSBnZXQgSS9PIGVycm9ycyB3aXRoIE1TSUUgY2xpZW50cz88L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzUwIj48c3Ryb25nPldoeSBkbyBJIGdldCBJL08gZXJyb3JzIHdpdGggTlMgY2xpZW50cz88L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzUxIj48c3Ryb25nPkFib3V0IFN1cHBvcnQ8L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzUyIj48c3Ryb25nPlJlc291cmNlcyBpbiBjYXNlIG9mIHByb2JsZW1zPzwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DNTMiPjxzdHJvbmc+U3VwcG9ydCBpbiBjYXNlIG9mIHByb2JsZW1zPzwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DNTQiPjxzdHJvbmc+SG93IHRvIHdyaXRlIGEgcHJvYmxlbSByZXBvcnQ/PC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0M1NSI+PHN0cm9uZz5JIGdvdCBhIGNvcmUgZHVtcCwgY2FuIHlvdSBoZWxwIG1lPzwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DNTYiPjxzdHJvbmc+SG93IHRvIGdldCBhIGJhY2t0cmFjZT88L3N0cm9uZz48L2E+PGJyPgotPC9mb250PgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08aDI+PGEgbmFtZT0iVG9DMSI+QWJvdXQgdGhlIG1vZHVsZTwvYT48L2gyPgotPHVsPgotPHA+Ci08bGk+PGEgbmFtZT0iVG9DMiI+PC9hPgotICAgIDxhIG5hbWU9Imhpc3RvcnkiPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJmYXEiPgotV2hhdCBpcyB0aGUgaGlzdG9yeSBvZiBtb2Rfc3NsPwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwjaGlzdG9yeSI+PGI+TDwvYj48L2E+XQotICAgIDxwPgotICAgIFRoZSBtb2Rfc3NsIHYxIHBhY2thZ2Ugd2FzIGluaXRpYWxseSBjcmVhdGVkIGluIEFwcmlsIDE5OTggYnkgPGEKLSAgICBocmVmPSJtYWlsdG86cnNlQGVuZ2Vsc2NoYWxsLmNvbSI+UmFsZiBTLiBFbmdlbHNjaGFsbDwvYT4gdmlhIHBvcnRpbmcgPGEKLSAgICBocmVmPSJtYWlsdG86YmVuQGFsZ3JvdXAuY28udWsiPkJlbiBMYXVyaWU8L2E+J3MgPGEKLSAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS1zc2wub3JnLyI+QXBhY2hlLVNTTDwvYT4gMS4xNyBzb3VyY2UgcGF0Y2hlcyBmb3IKLSAgICBBcGFjaGUgMS4yLjYgdG8gQXBhY2hlIDEuM2I2LiBCZWNhdXNlIG9mIGNvbmZsaWN0cyB3aXRoIEJlbgotICAgIExhdXJpZSdzIGRldmVsb3BtZW50IGN5Y2xlIGl0IHRoZW4gd2FzIHJlLWFzc2VtYmxlZCBmcm9tIHNjcmF0Y2ggZm9yCi0gICAgQXBhY2hlIDEuMy4wIGJ5IG1lcmdpbmcgdGhlIG9sZCBtb2Rfc3NsIDEueCB3aXRoIHRoZSBuZXdlciBBcGFjaGUtU1NMCi0gICAgMS4xOC4gRnJvbSB0aGlzIHBvaW50IG9uIG1vZF9zc2wgbGl2ZWQgaXRzIG93biBsaWZlIGFzIG1vZF9zc2wgdjIuIFRoZQotICAgIGZpcnN0IHB1YmxpY2FsbHkgcmVsZWFzZWQgdmVyc2lvbiB3YXMgbW9kX3NzbCAyLjAuMCBmcm9tIEF1Z3VzdCAxMHRoLAotICAgIDE5OTguIEFzIG9mIHRoaXMgd3JpdGluZyAoQXVndXN0IDE5OTkpIHRoZSBjdXJyZW50IG1vZF9zc2wgdmVyc2lvbiBpcyAyLjQuMC4KLSAgICA8cD4KLSAgICBBZnRlciBvbmUgeWVhciBvZiB2ZXJ5IGFjdGl2ZSBkZXZlbG9wbWVudCB3aXRoIG92ZXIgMTAwMCB3b3JraW5nIGhvdXJzIGFuZAotICAgIG92ZXIgNDAgcmVsZWFzZXMgbW9kX3NzbCByZWFjaGVkIGl0cyBjdXJyZW50IHN0YXRlLiBUaGUgcmVzdWx0IGlzIGFuCi0gICAgYWxyZWFkeSB2ZXJ5IGNsZWFuIHNvdXJjZSBiYXNlIGltcGxlbWVudGluZyBhIHZlcnkgcmljaCBmdW5jdGlvbmFsaXR5LgotICAgIFRoZSBjb2RlIHNpemUgaW5jcmVhc2VkIGJ5IGEgZmFjdG9yIG9mIDQgdG8gY3VycmVudGx5IGEgdG90YWwgb2Ygb3ZlcgotICAgIDEwLjAwMCBsaW5lcyBvZiBBTlNJIEMgY29uc2lzdGluZyBvZiBhcHByb3guIDcwJSBjb2RlIGFuZCAzMCUgY29kZQotICAgIGRvY3VtZW50YXRpb24uIEZyb20gdGhlIG9yaWdpbmFsIEFwYWNoZS1TU0wgY29kZSBjdXJyZW50bHkgYXBwcm94LiA1JSBpcwotICAgIHJlbWFpbmluZyBvbmx5LgotPHA+Ci08bGk+PGEgbmFtZT0iVG9DMyI+PC9hPgotICAgIDxhIG5hbWU9ImFwc3NsLWRpZmYiPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJmYXEiPgotV2hhdCBhcmUgdGhlIGZ1bmN0aW9uYWwgZGlmZmVyZW5jZXMgYmV0d2VlbiBtb2Rfc3NsIGFuZCBBcGFjaGUtU1NMLCBmcm9tIHdoZXJlCi1pdCBpcyBvcmlnaW5hbGx5IGRlcml2ZWQ/Ci08L3N0cm9uZz4mbmJzcDsmbmJzcDsKLSAgICBbPGEgaHJlZj0iaHR0cDovL3d3dy5tb2Rzc2wub3JnL2RvY3MvMi44L3NzbF9mYXEuaHRtbCNhcHNzbC1kaWZmIj48Yj5MPC9iPjwvYT5dCi0gICAgPHA+Ci0gICAgVGhpcyBuZWl0aGVyIGNhbiBiZSBhbnN3ZXJlZCBpbiBzaG9ydCAodGhlcmUgd2VyZSB0b28gbWFueSBjb2RlIGNoYW5nZXMpCi0gICAgbm9yIGNhbiBiZSBhbnN3ZXJlZCBhdCBhbGwgYnkgdGhlIGF1dGhvciAodGhlcmUgd291bGQgaW1tZWRpYXRlbHkgYmUgZmxhbWUKLSAgICB3YXJzIHdpdGggbm8gcmVhc29uYWJsZSByZXN1bHRzIGF0IHRoZSBlbmQpLiBCdXQgYXMgeW91IGVhc2lseSBjYW4gZ3Vlc3MKLSAgICBmcm9tIHRoZSA1JSBvZiByZW1haW5pbmcgQXBhY2hlLVNTTCBjb2RlLCBhIGxvdCBvZiBkaWZmZXJlbmNlcyBleGlzdHMsCi0gICAgYWx0aG91Z2ggdXNlci12aXNpYmxlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZXhpc3RzIGZvciBtb3N0IHRoaW5ncy4KLSAgICA8cD4KLSAgICBXaGVuIHlvdSByZWFsbHkgd2FudCBhIGRldGFpbGVkIGNvbXBhcmlzb24geW91IGhhdmUgdG8gcmVhZCB0aGUgZW50cmllcyBpbgotICAgIHRoZSBsYXJnZSA8Y29kZT5DSEFOR0VTPC9jb2RlPiBmaWxlIHRoYXQgaXMgaW4gdGhlIG1vZF9zc2wKLSAgICBkaXN0cmlidXRpb24uIFVzdWFsbHkgdGhpcyBpcyBtdWNoIHRvbyBoYXJkLWNvcmUuIFNvIEkgcmVjb21tZW5kIHlvdSB0bwotICAgIGVpdGhlciBiZWxpZXZlIGluIHRoZSBvcGluaW9uIGFuZCByZWNvbW1lbmRhdGlvbnMgb2Ygb3RoZXIgdXNlcnMgKHRoZQotICAgIHNpbXBsZXN0IGFwcHJvYWNoKSBvciBkbyBhIGNvbXBhcmlzb24geW91cnNlbGYgKHRoZSBtb3N0IHJlYXNvbmFibGUKLSAgICBhcHByb2FjaCkuIEZvciB0aGUgbGF0dGVyLCBncmFiIGRpc3RyaWJ1dGlvbnMgb2YgbW9kX3NzbCAoZnJvbSA8YQotICAgIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy8iPmh0dHA6Ly93d3cubW9kc3NsLm9yZzwvYT4pIGFuZCBBcGFjaGUtU1NMCi0gICAgKGZyb20gPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUtc3NsLm9yZy8iPmh0dHA6Ly93d3cuYXBhY2hlLXNzbC5vcmc8L2E+KSwKLSAgICBpbnN0YWxsIGJvdGggcGFja2FnZXMsIHJlYWQgdGhlaXIgZG9jdW1lbnRhdGlvbiBhbmQgdHJ5IHRoZW0gb3V0IHlvdXJzZWxmLgotICAgIFRoZW4gY2hvb3NlIHRoZSBvbmUgd2hpY2ggcGxlYXNlcyB5b3UgbW9zdC4KLSAgICA8cD4KLSAgICBBIGZldyBmaW5hbCBoaW50cyB0byBoZWxwIGRpcmVjdCB5b3VyIGNvbXBhcmlzb246IHF1YWxpdHkgb2YgZG9jdW1lbnRhdGlvbgotICAgICgiY2FuIHlvdSBlYXNpbHkgZmluZCBhbnN3ZXJzIGFuZCBhcmUgdGhleSBzdWZmaWNpZW50PyIpLCBxdWFsaXR5IG9mCi0gICAgc291cmNlIGNvZGUgKCJpcyB0aGUgc291cmNlIGNvZGUgcmV2aWV3YWJsZSBzbyB5b3UgY2FuIG1ha2Ugc3VyZSB0aGVyZQotICAgIGFyZW4ndCBhbnkgdHJhcGRvb3JzIG9yIGluaGVyZW50IHNlY3VyaXR5IHJpc2tzIGJlY2F1c2Ugb2YgYmFkIHByb2dyYW1taW5nCi0gICAgc3R5bGU/IiksIGVhc3kgYW5kIGNsZWFuIGluc3RhbGxhdGlvbiAoImNhbiB0aGUgU1NMIGZ1bmN0aW9uYWxpdHkgZWFzaWx5Ci0gICAgYWRkZWQgdG8gYW4gQXBhY2hlIHNvdXJjZSB0cmVlIHdpdGhvdXQgbWFudWFsIGVkaXRpbmcgb3IgcGF0Y2hpbmc/IiksCi0gICAgY2xlYW4gaW50ZWdyYXRpb24gaW50byBBcGFjaGUgKCJpcyB0aGUgU1NMIGZ1bmN0aW9uYWxpdHkgZW5jYXBzdWxhdGVkIGFuZAotICAgIGNsZWFubHkgc2VwYXJhdGVkIGZyb20gdGhlIHJlbWFpbmluZyBBcGFjaGUgZnVuY3Rpb25hbGl0eT8iKSwgc3VwcG9ydCBmb3IKLSAgICBEeW5hbWljIFNoYXJlZCBPYmplY3QgKERTTykgZmFjaWxpdHkgKCJjYW4gdGhlIFNTTCBmdW5jdGlvbmFsaXR5IGJ1aWx0IGFzCi0gICAgYSBzZXBhcmF0ZSBEU08gZm9yIG1heGltdW0gZmxleGliaWxpdHk/IiksIFdpbjMyIHBvcnQgKCJpcyB0aGUgU1NMCi0gICAgZnVuY3Rpb25hbGl0eSBhdmFpbGFibGUgYWxzbyB1bmRlciB0aGUgV2luMzIgcGxhdGZvcm0/IiksIGFtb3VudCBhbmQKLSAgICBxdWFsaXR5IG9mIGZ1bmN0aW9uYWxpdHkgKCJpcyB0aGUgcHJvdmlkZWQgU1NMIGZ1bmN0aW9uYWxpdHkgYW5kIGNvbnRyb2wKLSAgICBwb3NzaWJpbGl0aWVzIHN1ZmZpY2llbnQgZm9yIHlvdXIgc2l0dWF0aW9uPyIpLCBxdWFsaXR5IG9mIHByb2JsZW0gdHJhY2luZwotICAgICgiaXMgaXQgcG9zc2libGUgZm9yIHlvdSB0byBlYXNpbHkgdHJhY2UgZG93biB0aGUgcHJvYmxlbXMgdmlhIGxvZ2ZpbGVzLAotICAgIGV0Yz8iKSwgZXRjLiBwcC4KLTxwPgotPGxpPjxhIG5hbWU9IlRvQzQiPjwvYT4KLSAgICA8YSBuYW1lPSJhcHNzbC1kaWZmIj48L2E+Ci0gICAgPHN0cm9uZyBpZD0iZmFxIj4KLVdoYXQgYXJlIHRoZSBtYWpvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIG1vZF9zc2wgYW5kCi10aGUgY29tbWVyY2lhbCBhbHRlcm5hdGl2ZXMgbGlrZSBSYXZlbiBvciBTdHJvbmdob2xkPwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwjYXBzc2wtZGlmZiI+PGI+TDwvYj48L2E+XQotICAgIDxwPgotICAgIEluIHRoZSBwYXN0ICh1bnRpbCBTZXB0ZW1iZXIgMjB0aCwgMjAwMCkgdGhlIG1ham9yIGRpZmZlcmVuY2Ugd2FzCi0gICAgdGhlIFJTQSBsaWNlbnNlIHdoaWNoIG9uZSByZWNlaXZlZCAodmVyeSBjaGVhcGx5IGluIGNvbnRyYXN0IHRvCi0gICAgYSBkaXJlY3QgbGljZW5zaW5nIGZyb20gUlNBIERTSSkgd2l0aCB0aGUgY29tbWVyY2lhbCBBcGFjaGUgU1NMCi0gICAgcHJvZHVjdHMuIE9uIHRoZSBvdGhlciBoYW5kLCBvbmUgbmVlZGVkIHRoaXMgbGljZW5zZSBvbmx5IGluIHRoZSBVUywKLSAgICBvZiBjb3Vyc2UuIFNvIGZvciBub24tVVMgY2l0aXplbnMgdGhpcyBwb2ludCB3YXMgdXNlbGVzcy4gQnV0IG5vdwotICAgIGV2ZW4gZm9yIFVTIGNpdGl6ZW5zIHRoZSBzaXR1YXRpb25zIGNoYW5nZWQgYmVjYXVzZSB0aGUgUlNBIHBhdGVudAotICAgIGV4cGlyZWQgb24gU2VwdGVtYmVyIDIwdGgsIDIwMDAgYW5kIFJTQSBEU0kgYWxzbyBwbGFjZWQgdGhlIFJTQQotICAgIGFsZ29yaXRobSBleHBsaWNpdGx5IGludG8gdGhlIHB1YmxpYyBkb21haW4uCi0gICAgPHA+Ci0gICAgU2Vjb25kLCB0aGVyZSBpcyB0aGUgcG9pbnQgdGhhdCBvbmUgaGFzIGd1YXJhbnRlZWQgc3VwcG9ydCBmcm9tCi0gICAgdGhlIGNvbW1lcmNpYWwgdmVuZG9ycy4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHlvdSBtb25pdG9yZWQgdGhlCi0gICAgT3BlbiBTb3VyY2UgcXVhbGl0eSBvZiBtb2Rfc3NsIGFuZCB0aGUgc3VwcG9ydCBhY3Rpdml0aWVzCi0gICAgZm91bmQgb24gPGEgaHJlZj0ibWFpbHRvOm1vZHNzbC11c2Vyc0Btb2Rzc2wub3JnIj4KLSAgICA8Y29kZT5tb2Rzc2wtdXNlcnNAbW9kc3NsLm9yZzwvY29kZT48L2E+LCB5b3UgY291bGQgYXNrIHlvdXJzZWxmCi0gICAgd2hldGhlciB5b3UgYXJlIHJlYWxseSBjb252aW5jZWQgdGhhdCB5b3UgY2FuIGdldCBiZXR0ZXIgc3VwcG9ydAotICAgIGZyb20gYSBjb21tZXJjaWFsIHZlbmRvci4KLSAgICA8cD4KLSAgICBUaGlyZCwgcGVvcGxlIG9mdGVuIHRoaW5rIHRoZXkgd291bGQgcmVjZWl2ZSBwZXJoYXBzIGF0IGxlYXN0IGEKLSAgICBiZXR0ZXIgdGVjaG5pY2FsIFNTTCBzb2x1dGlvbiB0aGFuIG1vZF9zc2wgZnJvbSB0aGUgY29tbWVyY2lhbAotICAgIHZlbmRvcnMuIEJ1dCB0aGlzIGlzIG5vdCByZWFsbHkgdHJ1ZSwgYmVjYXVzZSBhbGwgY29tbWVyY2lhbAotICAgIGFsdGVybmF0aXZlcyAoUmF2ZW4gMS40LngsIFN0cm9uZ2hvbGQgMy54LCBSZWRIYXQgU1dTIDIueCwgZXRjLikKLSAgICA8aT5hcmU8L2k+IGFjdHVhbGx5IGJhc2VkIG9uIG1vZF9zc2wgYW5kIE9wZW5TU0wuIFRoZSByZWFzb24gZm9yCi0gICAgdGhpcyBjb21tb24gbWlzdW5kZXJzdGFuZGluZyBpcyBtYWlubHkgYmVjYXVzZSBzb21lIHZlbmRvcnMgbWFrZSBubwotICAgIGF0dGVtcHQgdG8gbWFrZSBpdCByZWFzb25hYmx5IGNsZWFyIHRoYXQgdGhlaXIgcHJvZHVjdCBpcyBhY3R1YWxseQotICAgIG1vZF9zc2wgYmFzZWQuIFNvLCBkbyBub3QgdGhpbmssIGp1c3QgYmVjYXVzZSB0aGUgY29tbWVyY2lhbAotICAgIGFsdGVybmF0aXZlcyBhcmUgdXN1YWxseSBtb3JlIGV4cGVuc2l2ZSwgdGhhdCB5b3UgYXJlIGFsc28gcmVjZWl2aW5nCi0gICAgYW4gYWx0ZXJuYXRpdmUgPGk+dGVjaG5pY2FsPC9pPiBTU0wgc29sdXRpb24uIFRoaXMgaXMgdXN1YWxseSBub3QKLSAgICB0aGUgY2FzZS4gQWN0dWFsbHkgdGhlIHZlbmRvciB2ZXJzaW9ucyBvZiBBcGFjaGUsIG1vZF9zc2wgYW5kIE9wZW5TU0wKLSAgICBvZnRlbiBzdGF5IGJlaGluZCB0aGUgbGF0ZXN0IGZyZWUgdmVyc2lvbnMgYW5kIHBlcmhhcHMgdGhpcyB3YXkgc3RpbGwgZG8gbm90Ci0gICAgaW5jbHVkZSBpbXBvcnRhbnQgYnVnIGFuZCBzZWN1cml0eSBmaXhlcy4gT24gdGhlIG90aGVyIGhhbmQsCi0gICAgaXQgc29tZXRpbWVzIG9jY3VycyB0aGF0IGEgdmVuZG9yIHZlcnNpb24gaW5jbHVkZXMgdXNlZnVsIGNoYW5nZXMKLSAgICB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBvZmZpY2lhbCBmcmVlbHkgYXZhaWxhYmxlCi0gICAgcGFja2FnZXMuIEJ1dCBtb3N0IHZlbmRvcnMgcGxheSBmYWlyIGFuZCBjb250cmlidXRlIGJhY2sgdGhvc2UKLSAgICBjaGFuZ2VzIHRvIHRoZSBmcmVlIHNvZnR3YXJlIHdvcmxkLCBvZiBjb3Vyc2UuCi0gICAgPHA+Ci0gICAgU28sIGluIHNob3J0OiBUaGVyZSBhcmUgbG90cyBvZiBjb21tZXJjaWFsIHZlcnNpb25zIG9mIHRoZSBwb3B1bGFyCi0gICAgQXBhY2hlK21vZF9zc2wrT3BlblNTTCBzZXJ2ZXIgY29tYmluYXRpb24gYXZhaWxhYmxlLiBFdmVyeSB1c2VyCi0gICAgc2hvdWxkIGRlY2lkZSBjYXJlZnVsbHkgd2hldGhlciB0aGV5IHJlYWxseSBuZWVkIHRvIGJ1eSBhIGNvbW1lcmNpYWwKLSAgICB2ZXJzaW9uIG9yIHdoZXRoZXIgaXQgd291bGQgbm90IGJlIHN1ZmZpY2llbnQgdG8gZGlyZWN0bHkgdXNlIHRoZQotICAgIGZyZWUgYW5kIG9mZmljaWFsIHZlcnNpb25zIG9mIHRoZSBBcGFjaGUsIG1vZF9zc2wgYW5kIE9wZW5TU0wKLSAgICBwYWNrYWdlcy4KLTxwPgotPGxpPjxhIG5hbWU9IlRvQzUiPjwvYT4KLSAgICA8YSBuYW1lPSJ3aGF0LXZlcnNpb24iPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJmYXEiPgotSG93IGRvIEkga25vdyB3aGljaCBtb2Rfc3NsIHZlcnNpb24gaXMgZm9yIHdoaWNoIEFwYWNoZSB2ZXJzaW9uPwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwjd2hhdC12ZXJzaW9uIj48Yj5MPC9iPjwvYT5dCi0gICAgPHA+Ci0gICAgVGhhdCdzIHRyaXZpYWw6IG1vZF9zc2wgdXNlcyB2ZXJzaW9uIHN0cmluZ3Mgb2YgdGhlIHN5bnRheAotICAgIDxlbT4mbHQ7bW9kX3NzbC12ZXJzaW9uJmd0OzwvZW0+LTxlbT4mbHQ7YXBhY2hlLXZlcnNpb24mZ3Q7PC9lbT4sIGZvcgotICAgIGluc3RhbmNlIDxjb2RlPjIuNC4wLTEuMy45PC9jb2RlPi4gVGhpcyBkaXJlY3RseSBpbmRpY2F0ZXMgdGhhdCBpdCdzCi0gICAgbW9kX3NzbCB2ZXJzaW9uIDIuNC4wIGZvciBBcGFjaGUgdmVyc2lvbiAxLjMuOS4gQW5kIHRoaXMgYWxzbyBtZWFucyB5b3UKLSAgICA8ZW0+b25seTwvZW0+IGNhbiBhcHBseSB0aGlzIG1vZF9zc2wgdmVyc2lvbiB0byBleGFjdGx5IHRoaXMgQXBhY2hlCi0gICAgdmVyc2lvbiAodW5sZXNzIHlvdSB1c2UgdGhlIDxjb2RlPi0tZm9yY2U8L2NvZGU+IG9wdGlvbiB0byBtb2Rfc3NsJ3MKLSAgICA8Y29kZT5jb25maWd1cmU8L2NvZGU+IGNvbW1hbmQgOy0pLgotPHA+Ci08bGk+PGEgbmFtZT0iVG9DNiI+PC9hPgotICAgIDxhIG5hbWU9InkyayI+PC9hPgotICAgIDxzdHJvbmcgaWQ9ImZhcSI+Ci1JcyBtb2Rfc3NsIFllYXIgMjAwMCBjb21wbGlhbnQ/Ci08L3N0cm9uZz4mbmJzcDsmbmJzcDsKLSAgICBbPGEgaHJlZj0iaHR0cDovL3d3dy5tb2Rzc2wub3JnL2RvY3MvMi44L3NzbF9mYXEuaHRtbCN5MmsiPjxiPkw8L2I+PC9hPl0KLSAgICA8cD4KLSAgICBZZXMsIG1vZF9zc2wgaXMgWWVhciAyMDAwIGNvbXBsaWFudC4KLSAgICA8cD4KLSAgICBCZWNhdXNlIGZpcnN0IG1vZF9zc2wgaW50ZXJuYWxseSBuZXZlciBzdG9yZXMgeWVhcnMgYXMgdHdvIGRpZ2l0cy4KLSAgICBJbnN0ZWFkIGl0IGFsd2F5cyB1c2VzIHRoZSBBTlNJIEMgJmFtcDsgUE9TSVggbnVtZXJpY2FsIGRhdGEgdHlwZQotICAgIDxjb2RlPnRpbWVfdDwvY29kZT4gdHlwZSwgd2hpY2ggb24gYWxtb3N0IGFsbCBVbml4IHBsYXRmb3JtcyBhdCB0aGUgbW9tZW50Ci0gICAgaXMgYSA8Y29kZT5zaWduZWQgbG9uZzwvY29kZT4gKHVzdWFsbHkgMzItYml0cykgcmVwcmVzZW50aW5nIHNlY29uZHMgc2luY2UKLSAgICBlcG9jaCBvZiBKYW51YXJ5IDFzdCwgMTk3MCwgMDA6MDAgVVRDLiBUaGlzIHNpZ25lZCB2YWx1ZSBvdmVyZmxvd3MgaW4KLSAgICBlYXJseSBKYW51YXJ5IDIwMzggYW5kIG5vdCBpbiB0aGUgeWVhciAyMDAwLiBTZWNvbmQsIGRhdGUgYW5kIHRpbWUKLSAgICBwcmVzZW50YXRpb25zIChmb3IgaW5zdGFuY2UgdGhlIHZhcmlhYmxlIGBgPGNvZGU+JXtUSU1FX1lFQVJ9PC9jb2RlPicnKQotICAgIGFyZSBkb25lIHdpdGggZnVsbCB5ZWFyIHZhbHVlIGluc3RlYWQgb2YgYWJicmV2aWF0aW5nIHRvIHR3byBkaWdpdHMuCi0gICAgPHA+Ci0gICAgQWRkaXRpb25hbGx5IGFjY29yZGluZyB0byBhIDxhCi0gICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvbWlzYy9GQVEuaHRtbCN5ZWFyMjAwMCI+WWVhciAyMDAwCi0gICAgc3RhdGVtZW50PC9hPiBmcm9tIHRoZSBBcGFjaGUgR3JvdXAsIHRoZSBBcGFjaGUgd2Vic2VydmVyIGlzIFllYXIgMjAwMAotICAgIGNvbXBsaWFudCwgdG9vLiBCdXQgd2hldGhlciBPcGVuU1NMIG9yIHRoZSB1bmRlcmxheWluZyBPcGVyYXRpbmcgU3lzdGVtCi0gICAgKGVpdGhlciBhIFVuaXggb3IgV2luMzIgcGxhdGZvcm0pIGlzIFllYXIgMjAwMCBjb21wbGlhbnQgaXMgYSBkaWZmZXJlbnQKLSAgICBxdWVzdGlvbiB3aGljaCBjYW5ub3QgYmUgYW5zd2VyZWQgaGVyZS4KLTxwPgotPGxpPjxhIG5hbWU9IlRvQzciPjwvYT4KLSAgICA8YSBuYW1lPSJ3YXNzZW5hYXIiPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJmYXEiPgotV2hhdCBhYm91dCBtb2Rfc3NsIGFuZCB0aGUgV2Fzc2VuYWFyIEFycmFuZ2VtZW50PwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwjd2Fzc2VuYWFyIj48Yj5MPC9iPjwvYT5dCi0gICAgPHA+Ci0gICAgRmlyc3QsIGxldCB1cyBleHBsYWluIHdoYXQgPGk+V2Fzc2VuYWFyPC9pPiBhbmQgaXQncyA8aT5BcnJhbmdlbWVudCBvbgotICAgIEV4cG9ydCBDb250cm9scyBmb3IgQ29udmVudGlvbmFsIEFybXMgYW5kIER1YWwtVXNlIEdvb2RzIGFuZAotICAgIFRlY2hub2xvZ2llczwvaT4gaXM6IFRoaXMgaXMgYSBpbnRlcm5hdGlvbmFsIHJlZ2ltZSwgZXN0YWJsaXNoZWQgMTk5NSwgdG8KLSAgICBjb250cm9sIHRyYWRlIGluIGNvbnZlbnRpb25hbCBhcm1zIGFuZCBkdWFsLXVzZSBnb29kcyBhbmQgdGVjaG5vbG9neS4gSXQKLSAgICByZXBsYWNlZCB0aGUgcHJldmlvdXMgPGk+Q29Db208L2k+IHJlZ2ltZS4gMzMgY291bnRyaWVzIGFyZSBzaWduYXRvcmllczoKLSAgICBBcmdlbnRpbmEsIEF1c3RyYWxpYSwgQXVzdHJpYSwgQmVsZ2l1bSwgQnVsZ2FyaWEsIENhbmFkYSwgQ3plY2ggUmVwdWJsaWMsCi0gICAgRGVubWFyaywgRmlubGFuZCwgRnJhbmNlLCBHZXJtYW55LCBHcmVlY2UsIEh1bmdhcnksIElyZWxhbmQsIEl0YWx5LCBKYXBhbiwKLSAgICBMdXhlbWJvdXJnLCBOZXRoZXJsYW5kcywgTmV3IFplYWxhbmQsIE5vcndheSwgUG9sYW5kLCBQb3J0dWdhbCwgUmVwdWJsaWMKLSAgICBvZiBLb3JlYSwgUm9tYW5pYSwgUnVzc2lhbiBGZWRlcmF0aW9uLCBTbG92YWsgUmVwdWJsaWMsIFNwYWluLCBTd2VkZW4sCi0gICAgU3dpdHplcmxhbmQsIFR1cmtleSwgVWtyYWluZSwgVW5pdGVkIEtpbmdkb20gYW5kIFVuaXRlZCBTdGF0ZXMuIEZvciBtb3JlCi0gICAgZGV0YWlscyBsb29rIGF0IDxhCi0gICAgaHJlZj0iaHR0cDovL3d3dy53YXNzZW5hYXIub3JnLyI+aHR0cDovL3d3dy53YXNzZW5hYXIub3JnLzwvYT4uCi0gICAgPHA+Ci0gICAgSW4gc2hvcnQ6IFRoZSBhaW0gb2YgdGhlIFdhc3NlbmFhciBBcnJhbmdlbWVudCBpcyB0byBwcmV2ZW50IHRoZSBidWlsZCB1cAotICAgIG9mIG1pbGl0YXJ5IGNhcGFiaWxpdGllcyB0aGF0IHRocmVhdGVuIHJlZ2lvbmFsIGFuZCBpbnRlcm5hdGlvbmFsIHNlY3VyaXR5Ci0gICAgYW5kIHN0YWJpbGl0eS4gVGhlIFdhc3NlbmFhciBBcnJhbmdlbWVudCBjb250cm9scyB0aGUgZXhwb3J0IG9mCi0gICAgY3J5cHRvZ3JhcGh5IGFzIGEgZHVhbC11c2UgZ29vZCwgaS5lLiwgb25lIHRoYXQgaGFzIGJvdGggbWlsaXRhcnkgYW5kCi0gICAgY2l2aWxpYW4gYXBwbGljYXRpb25zLiBIb3dldmVyLCB0aGUgV2Fzc2VuYWFyIEFycmFuZ2VtZW50IGFsc28gcHJvdmlkZXMgYW4KLSAgICBleGVtcHRpb24gZnJvbSBleHBvcnQgY29udHJvbHMgZm9yIG1hc3MtbWFya2V0IHNvZnR3YXJlIGFuZCBmcmVlIHNvZnR3YXJlLgotICAgIDxwPgotICAgIEluIHRoZSBjdXJyZW50IFdhc3NlbmFhciBgYDxpPkxpc3Qgb2YgRHVhbCBVc2UgR29vZHMgYW5kIFRlY2hub2xvZ2llcyBBbmQKLSAgICBNdW5pdGlvbnM8L2k+JycsIHVuZGVyIGBgPGk+R0VORVJBTCBTT0ZUV0FSRSBOT1RFPC9pPicnIChHU04pIGl0IHNheXMKLSAgICBgYDxpPlRoZSBMaXN0cyBkbyBub3QgY29udHJvbCAic29mdHdhcmUiIHdoaWNoIGlzIGVpdGhlcjogMS4gWy4uLl0gMi4gImluCi0gICAgdGhlIHB1YmxpYyBkb21haW4iLjwvaT4nJyBBbmQgdW5kZXIgYGA8aT5ERUZJTklUSU9OUyBPRiBURVJNUyBVU0VEIElOCi0gICAgVEhFU0UgTElTVFM8L2k+Jycgb25lIGNhbiBmaW5kIHRoZSBkZWZpbml0aW9uOiBgYDxpPiJJbiB0aGUgcHVibGljCi0gICAgZG9tYWluIjogVGhpcyBtZWFucyAidGVjaG5vbG9neSIgb3IgInNvZnR3YXJlIiB3aGljaCBoYXMgYmVlbiBtYWRlCi0gICAgYXZhaWxhYmxlIHdpdGhvdXQgcmVzdHJpY3Rpb25zIHVwb24gaXRzIGZ1cnRoZXIgZGlzc2VtaW5hdGlvbi4gTi5CLgotICAgIENvcHlyaWdodCByZXN0cmljdGlvbnMgZG8gbm90IHJlbW92ZSAidGVjaG5vbG9neSIgb3IgInNvZnR3YXJlIiBmcm9tIGJlaW5nCi0gICAgImluIHRoZSBwdWJsaWMgZG9tYWluIi48L2k+JycKLSAgICA8cD4KLSAgICBTbywgYm90aCBtb2Rfc3NsIGFuZCBPcGVuU1NMIGFyZSBgYGluIHRoZSBwdWJsaWMgZG9tYWluJycgZm9yIHRoZSBwdXJwb3NlcwotICAgIG9mIHRoZSBXYXNzZW5hYXIgQWdyZWVtZW50IGFuZCBpdHMgYGA8aT5MaXN0IG9mIER1YWwgVXNlIEdvb2RzIGFuZAotICAgIFRlY2hub2xvZ2llcyBBbmQgTXVuaXRpb25zIExpc3Q8L2k+JycuCi0gICAgPHA+Ci0gICAgQWRkaXRpb25hbGx5IHRoZSBXYXNzZW5hYXIgQWdyZWVtZW50IGl0c2VsZiBoYXMgbm8gZGlyZWN0IGNvbnNlcXVlbmNlIGZvcgotICAgIGV4cG9ydGluZyBjcnlwdG9ncmFwaHkgc29mdHdhcmUuIFdoYXQgaXMgYWN0dWFsbHkgYWxsb3dlZCBvciBmb3JiaWRkZW4gdG8KLSAgICBiZSBleHBvcnRlZCBmcm9tIHRoZSBjb3VudHJpZXMgaGFzIHN0aWxsIHRvIGJlIGRlZmluZWQgaW4gdGhlIGxvY2FsIGxhd3MKLSAgICBvZiBlYWNoIGNvdW50cnkuIEFuZCBhdCBsZWFzdCBhY2NvcmRpbmcgdG8gb2ZmaWNpYWwgcHJlc3MgcmVsZWFzZXMgZnJvbQotICAgIHRoZSBHZXJtYW4gQk1XaSAoc2VlIDxhCi0gICAgaHJlZj0iaHR0cDovL3d3dy5ibXdpLmRlL3ByZXNzZS8xOTk4LzEyMDhwcm0yLmh0bWwiPmhlcmU8L2E+KSBhbmQgdGhlCi0gICAgU3dpdHplcmxhbmQgQmF3aSAoc2VlIDxhIGhyZWY9Imh0dHA6Ly9qeWEuY29tL3dhc3MtY2guaHRtIj5oZXJlPC9hPikgdGhlcmUKLSAgICB3aWxsIGJlIG5vIGZvcnRoY29taW5nIGV4cG9ydCByZXN0cmljdGlvbiBmb3IgZnJlZSBjcnlwdG9ncmFwaHkgc29mdHdhcmUKLSAgICBmb3IgdGhlaXIgY291bnRyaWVzLiBSZW1lbWJlciB0aGF0IG1vZF9zc2wgaXMgY3JlYXRlZCBpbiBHZXJtYW55IGFuZAotICAgIGRpc3RyaWJ1dGVkIGZyb20gU3dpdHplcmxhbmQuCi0gICAgPHA+Ci0gICAgU28sIG1vZF9zc2wgYW5kIE9wZW5TU0wgYXJlIG5vdCBhZmZlY3RlZCBieSB0aGUgV2Fzc2VuYWFyIEFncmVlbWVudC4KLTwvdWw+Ci08cD4KLTxicj4KLTxoMj48YSBuYW1lPSJUb0M4Ij5BYm91dCBJbnN0YWxsYXRpb248L2E+PC9oMj4KLTx1bD4KLTxwPgotPGxpPjxhIG5hbWU9IlRvQzkiPjwvYT4KLSAgICA8YSBuYW1lPSJjb3JlLWRibSI+PC9hPgotICAgIDxzdHJvbmcgaWQ9ImZhcSI+Ci1XaGVuIEkgYWNjZXNzIG15IHdlYnNpdGUgdGhlIGZpcnN0IHRpbWUgdmlhIEhUVFBTIEkgZ2V0IGEgY29yZSBkdW1wPwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwjY29yZS1kYm0iPjxiPkw8L2I+PC9hPl0KLSAgICA8cD4KLSAgICBUaGVyZSBjYW4gYmUgYSBsb3Qgb2YgcmVhc29ucyB3aHkgYSBjb3JlIGR1bXAgY2FuIG9jY3VyLCBvZiBjb3Vyc2UuCi0gICAgUmFuZ2luZyBmcm9tIGJ1Z2d5IHRoaXJkLXBhcnR5IG1vZHVsZXMsIG92ZXIgYnVnZ3kgdmVuZG9yIGxpYnJhcmllcyB1cCB0bwotICAgIGEgYnVnZ3kgbW9kX3NzbCB2ZXJzaW9uLiBCdXQgdGhlIGFib3ZlIHNpdHVhdGlvbiBpcyBvZnRlbiBjYXVzZWQgYnkgb2xkIG9yCi0gICAgYnJva2VuIHZlbmRvciBEQk0gbGlicmFyaWVzLiBUbyBzb2x2ZSBpdCBlaXRoZXIgYnVpbGQgbW9kX3NzbCB3aXRoIHRoZQotICAgIGJ1aWx0LWluIFNEQk0gbGlicmFyeSAoc3BlY2lmeSA8dHQ+LS1lbmFibGUtcnVsZT1TU0xfU0RCTTwvdHQ+IGF0IHRoZQotICAgIEFQQUNJIGNvbW1hbmQgbGluZSkgb3Igc3dpdGNoIGZyb20gYGA8dHQ+U1NMU2Vzc2lvbkNhY2hlIGRibTo8L3R0PicnIHRvIHRoZQotICAgIG5ld2VyIGBgPHR0PlNTTFNlc3Npb25DYWNoZSBzaG06PC90dD4nJyB2YXJpYW50IChhZnRlciB5b3UgaGF2ZSByZWJ1aWx0Ci0gICAgQXBhY2hlIHdpdGggTU0sIG9mIGNvdXJzZSkuCi08cD4KLTxsaT48YSBuYW1lPSJUb0MxMCI+PC9hPgotICAgIDxhIG5hbWU9ImNvcmUtcGhwMyI+PC9hPgotICAgIDxzdHJvbmcgaWQ9ImZhcSI+Ci1NeSBBcGFjaGUgZHVtcHMgY29yZSB3aGVuIEkgYWRkIGJvdGggbW9kX3NzbCBhbmQgUEhQMz8KLTwvc3Ryb25nPiZuYnNwOyZuYnNwOwotICAgIFs8YSBocmVmPSJodHRwOi8vd3d3Lm1vZHNzbC5vcmcvZG9jcy8yLjgvc3NsX2ZhcS5odG1sI2NvcmUtcGhwMyI+PGI+TDwvYj48L2E+XQotICAgIDxwPgotICAgIE1ha2Ugc3VyZSB5b3UgYWRkIG1vZF9zc2wgdG8gdGhlIEFwYWNoZSBzb3VyY2UgdHJlZSBmaXJzdCBhbmQgdGhlbiBkbyBhCi0gICAgZnJlc2ggY29uZmlndXJhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIFBIUDMuIEZvciBTU0wgc3VwcG9ydCBFQVBJIHBhdGNoZXMKLSAgICBhcmUgcmVxdWlyZWQgd2hpY2ggaGF2ZSB0byBjaGFuZ2UgaW50ZXJuYWwgQXBhY2hlIHN0cnVjdHVyZXMuIFBIUDMgbmVlZHMKLSAgICB0byBrbm93IGFib3V0IHRoZXNlIGluIG9yZGVyIHRvIHdvcmsgY29ycmVjdGx5LiBBbHdheXMgbWFrZSBzdXJlIHRoYXQKLSAgICA8dHQ+LURFQVBJPC90dD4gaXMgY29udGFpbmVkIGluIHRoZSBjb21waWxlciBmbGFncyB3aGVuIFBIUDMgaXMgYnVpbGQuCi08cD4KLTxsaT48YSBuYW1lPSJUb0MxMSI+PC9hPgotICAgIDxhIG5hbWU9ImRzby1zeW0iPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJmYXEiPgotV2hlbiBJIHN0YXJ0dXAgQXBhY2hlIEkgZ2V0IGVycm9ycyBhYm91dCB1bmRlZmluZWQgc3ltYm9scyBsaWtlIGFwX2dsb2JhbF9jdHg/Ci08L3N0cm9uZz4mbmJzcDsmbmJzcDsKLSAgICBbPGEgaHJlZj0iaHR0cDovL3d3dy5tb2Rzc2wub3JnL2RvY3MvMi44L3NzbF9mYXEuaHRtbCNkc28tc3ltIj48Yj5MPC9iPjwvYT5dCi0gICAgPHA+Ci0gICAgVGhpcyBhY3R1YWxseSBtZWFucyB5b3UgaW5zdGFsbGVkIG1vZF9zc2wgYXMgYSBEU08sIGJ1dCB3aXRob3V0IHJlYnVpbGRpbmcKLSAgICBBcGFjaGUgd2l0aCBFQVBJLiBCZWNhdXNlIEVBUEkgaXMgYSByZXF1aXJlbWVudCBmb3IgbW9kX3NzbCwgeW91IG5lZWQgYW4KLSAgICBleHRyYSBwYXRjaGVkIEFwYWNoZSAoY29udGFpbmluZyB0aGUgRUFQSSBwYXRjaGVzKSBhbmQgeW91IGhhdmUgdG8gYnVpbGQKLSAgICB0aGlzIEFwYWNoZSB3aXRoIEVBUEkgZW5hYmxlZCAoZXhwbGljaXRseSBzcGVjaWZ5Ci0gICAgPHR0Pi0tZW5hYmxlLXJ1bGU9RUFQSTwvdHQ+IGF0IHRoZSBBUEFDSSBjb21tYW5kIGxpbmUpLgotPHA+Ci08bGk+PGEgbmFtZT0iVG9DMTIiPjwvYT4KLSAgICA8YSBuYW1lPSJtdXRleC1wZXJtIj48L2E+Ci0gICAgPHN0cm9uZyBpZD0iZmFxIj4KLVdoZW4gSSBzdGFydHVwIEFwYWNoZSBJIGdldCBwZXJtaXNzaW9uIGVycm9ycyByZWxhdGVkIHRvIFNTTE11dGV4PwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwjbXV0ZXgtcGVybSI+PGI+TDwvYj48L2E+XQotICAgIDxwPgotICAgIFdoZW4geW91IHJlY2VpdmUgZW50cmllcyBsaWtlIGBgPGNvZGU+bW9kX3NzbDogQ2hpbGQgY291bGQgbm90IG9wZW4KLSAgICBTU0xNdXRleCBsb2NrZmlsZSAvb3B0L2FwYWNoZS9sb2dzL3NzbF9tdXRleC4xODMzMiAoU3lzdGVtIGVycm9yIGZvbGxvd3MpCi0gICAgWy4uLl0gU3lzdGVtOiBQZXJtaXNzaW9uIGRlbmllZCAoZXJybm86IDEzKTwvY29kZT4nJyB0aGlzIGlzIHVzdWFsbHkKLSAgICBjYXVzZWQgYnkgdG8gcmVzdHJpY3RpdmUgcGVybWlzc2lvbnMgb24gdGhlIDxpPnBhcmVudDwvaT4gZGlyZWN0b3JpZXMuCi0gICAgTWFrZSBzdXJlIHRoYXQgYWxsIHBhcmVudCBkaXJlY3RvcmllcyAoaGVyZSA8Y29kZT4vb3B0PC9jb2RlPiwKLSAgICA8Y29kZT4vb3B0L2FwYWNoZTwvY29kZT4gYW5kIDxjb2RlPi9vcHQvYXBhY2hlL2xvZ3M8L2NvZGU+KSBoYXZlIHRoZSB4LWJpdAotICAgIHNldCBhdCBsZWFzdCBmb3IgdGhlIFVJRCB1bmRlciB3aGljaCBBcGFjaGUncyBjaGlsZHJlbiBhcmUgcnVubmluZyAoc2VlCi0gICAgdGhlIDxjb2RlPlVzZXI8L2NvZGU+IGRpcmVjdGl2ZSBvZiBBcGFjaGUpLgotPHA+Ci08bGk+PGEgbmFtZT0iVG9DMTMiPjwvYT4KLSAgICA8YSBuYW1lPSJtbSI+PC9hPgotICAgIDxzdHJvbmcgaWQ9ImZhcSI+Ci1XaGVuIEkgdXNlIHRoZSBNTSBsaWJyYXJ5IGFuZCB0aGUgc2hhcmVkIG1lbW9yeSBjYWNoZSBlYWNoIHByb2Nlc3MgZ3Jvd3MKLTEuNU1CIGFjY29yZGluZyB0byBgdG9wJyBhbHRob3VnaCBJIHNwZWNpZmllZCA1MTIwMDAgYXMgdGhlIGNhY2hlIHNpemU/Ci08L3N0cm9uZz4mbmJzcDsmbmJzcDsKLSAgICBbPGEgaHJlZj0iaHR0cDovL3d3dy5tb2Rzc2wub3JnL2RvY3MvMi44L3NzbF9mYXEuaHRtbCNtbSI+PGI+TDwvYj48L2E+XQotICAgIDxwPgotICAgIFRoZSBhZGRpdGlvbmFsIDFNQiBhcmUgY2F1c2VkIGJ5IHRoZSBnbG9iYWwgc2hhcmVkIG1lbW9yeSBwb29sIEVBUEkKLSAgICBhbGxvY2F0ZXMgZm9yIGFsbCBtb2R1bGVzIGFuZCB3aGljaCBpcyBub3QgdXNlZCBieSBtb2Rfc3NsIGZvcgotICAgIHZhcmlvdXMgcmVhc29ucy4gU28gdGhlIGFjdHVhbGx5IGFsbG9jYXRlZCBzaGFyZWQgbWVtb3J5IGlzIGFsd2F5cwotICAgIDFNQiBtb3JlIHRoYW4gd2hhdCB5b3Ugc3BlY2lmeSBvbiA8Y29kZT5TU0xTZXNzaW9uQ2FjaGU8L2NvZGU+LgotICAgIEJ1dCBkb24ndCBiZSBjb25mdXNlZCBieSB0aGUgZGlzcGxheSBvZiBgdG9wJzogYWx0aG91Z2ggaXMKLSAgICBpbmRpY2F0ZXMgdGhhdCA8aT5lYWNoPC9pPiBwcm9jZXNzIGdyb3csIHRoaXMgaXMgbm90IHJlYWxpdHksIG9mCi0gICAgY291cnNlLiBJbnN0ZWFkIHRoZSBhZGRpdGlvbmFsIG1lbW9yeSBjb25zdW1wdGlvbiBpcyBzaGFyZWQgYnkKLSAgICBhbGwgcHJvY2Vzc2VzLCBpLmUuIHRoZSAxLjVNQiBhcmUgYWxsb2NhdGVkIG9ubHkgb25jZSBwZXIgQXBhY2hlCi0gICAgaW5zdGFuY2UgYW5kIG5vdCBvbmNlIHBlciBBcGFjaGUgc2VydmVyIHByb2Nlc3MuCi08cD4KLTxsaT48YSBuYW1lPSJUb0MxNCI+PC9hPgotICAgIDxhIG5hbWU9Im1tcGF0aCI+PC9hPgotICAgIDxzdHJvbmcgaWQ9ImZhcSI+Ci1BcGFjaGUgY3JlYXRlcyBmaWxlcyBpbiBhIGRpcmVjdG9yeSBkZWNsYXJlZCBieSB0aGUgaW50ZXJuYWwKLUVBUElfTU1fQ09SRV9QQVRIIGRlZmluZS4gSXMgdGhlcmUgYSB3YXkgdG8gb3ZlcnJpZGUgdGhlIHBhdGggdXNpbmcgYQotY29uZmlndXJhdGlvbiBkaXJlY3RpdmU/Ci08L3N0cm9uZz4mbmJzcDsmbmJzcDsKLSAgICBbPGEgaHJlZj0iaHR0cDovL3d3dy5tb2Rzc2wub3JnL2RvY3MvMi44L3NzbF9mYXEuaHRtbCNtbXBhdGgiPjxiPkw8L2I+PC9hPl0KLSAgICA8cD4KLSAgICBObywgdGhlcmUgaXMgbm90IGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlLCBiZWNhdXNlIGZvciB0ZWNobmljYWwKLSAgICBib290c3RyYXBwaW5nIHJlYXNvbnMsIGEgZGlyZWN0aXZlIG5vdCBwb3NzaWJsZSBhdCBhbGwuIEluc3RlYWQKLSAgICB1c2UgYGA8Y29kZT5DRkxBR1M9Jy1ERUFQSV9NTV9DT1JFX1BBVEg9Ii9wYXRoL3RvL3doZXJldmVyLyInCi0gICAgLi9jb25maWd1cmUgLi4uPC9jb2RlPicnIHdoZW4gYnVpbGRpbmcgQXBhY2hlIG9yIHVzZSBvcHRpb24KLSAgICA8Yj4tZDwvYj4gd2hlbiBzdGFydGluZyA8Y29kZT5odHRwZDwvY29kZT4uCi08cD4KLTxsaT48YSBuYW1lPSJUb0MxNSI+PC9hPgotICAgIDxhIG5hbWU9ImVudHJvcHkiPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJmYXEiPgotV2hlbiBJIGZpcmUgdXAgdGhlIHNlcnZlciwgbW9kX3NzbCBzdG9wcyB3aXRoIHRoZSBlcnJvcgotIkZhaWxlZCB0byBnZW5lcmF0ZSB0ZW1wb3JhcnkgNTEyIGJpdCBSU0EgcHJpdmF0ZSBrZXkiLCB3aHk/Ci1BbmQgYSAiUFJORyBub3Qgc2VlZGVkIiBlcnJvciBvY2N1cnMgaWYgSSB0cnkgIm1ha2UgY2VydGlmaWNhdGUiLgotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwjZW50cm9weSI+PGI+TDwvYj48L2E+XQotICAgIDxwPgotICAgIENyeXB0b2dyYXBoaWMgc29mdHdhcmUgbmVlZHMgYSBzb3VyY2Ugb2YgdW5wcmVkaWN0YWJsZSBkYXRhCi0gICAgdG8gd29yayBjb3JyZWN0bHkuIE1hbnkgb3BlbiBzb3VyY2Ugb3BlcmF0aW5nIHN5c3RlbXMgcHJvdmlkZQotICAgIGEgInJhbmRvbW5lc3MgZGV2aWNlIiB0aGF0IHNlcnZlcyB0aGlzIHB1cnBvc2UgKHVzdWFsbHkgbmFtZWQKLSAgICA8Y29kZT4vZGV2L3JhbmRvbTwvY29kZT4pLiBPbiBvdGhlciBzeXN0ZW1zLCBhcHBsaWNhdGlvbnMgaGF2ZSB0bwotICAgIHNlZWQgdGhlIE9wZW5TU0wgUHNldWRvIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIChQUk5HKSBtYW51YWxseSB3aXRoCi0gICAgYXBwcm9wcmlhdGUgZGF0YSBiZWZvcmUgZ2VuZXJhdGluZyBrZXlzIG9yIHBlcmZvcm1pbmcgcHVibGljIGtleQotICAgIGVuY3J5cHRpb24uIEFzIG9mIHZlcnNpb24gMC45LjUsIHRoZSBPcGVuU1NMIGZ1bmN0aW9ucyB0aGF0IG5lZWQKLSAgICByYW5kb21uZXNzIHJlcG9ydCBhbiBlcnJvciBpZiB0aGUgUFJORyBoYXMgbm90IGJlZW4gc2VlZGVkIHdpdGgKLSAgICBhdCBsZWFzdCAxMjggYml0cyBvZiByYW5kb21uZXNzLiBTbyBtb2Rfc3NsIGhhcyB0byBwcm92aWRlIGVub3VnaAotICAgIGVudHJvcHkgdG8gdGhlIFBSTkcgdG8gd29yayBjb3JyZWN0bHkuIEZvciB0aGlzIG9uZSBoYXMgdG8gdXNlIHRoZQotICAgIDxjb2RlPlNTTFJhbmRvbVNlZWQ8L2NvZGU+IGRpcmVjdGl2ZXMgKHRvIHNvbHZlIHRoZSBydW4tdGltZSBwcm9ibGVtKQotICAgIGFuZCBjcmVhdGUgYSA8Y29kZT4kSE9NRS8ucm5kPC9jb2RlPiBmaWxlIHRvIG1ha2Ugc3VyZSBlbm91Z2gKLSAgICBlbnRyb3B5IGlzIGF2YWlsYWJsZSBhbHNvIGZvciB0aGUgIjxjb2RlPm1ha2UgY2VydGlmaWNhdGU8L2NvZGU+IgotICAgIHN0ZXAgKGluIGNhc2UgdGhlICI8Y29kZT5tYWtlIGNlcnRpZmljYXRlPC9jb2RlPiIgcHJvY2VkdXJlIGlzIG5vdAotICAgIGFibGUgdG8gZ2F0aGVyIGVub3VnaCBlbnRyb3B5IHRoZWlyc2VsZiBieSBzZWFyY2hpbmcgZm9yIHN5c3RlbQotICAgIGZpbGVzKS4KLTwvdWw+Ci08cD4KLTxicj4KLTxoMj48YSBuYW1lPSJUb0MxNiI+QWJvdXQgQ29uZmlndXJhdGlvbjwvYT48L2gyPgotPHVsPgotPHA+Ci08bGk+PGEgbmFtZT0iVG9DMTciPjwvYT4KLSAgICA8YSBuYW1lPSJodHRwcy1wYXJhbGxlbCI+PC9hPgotICAgIDxzdHJvbmcgaWQ9ImZhcSI+Ci1JcyBpdCBwb3NzaWJsZSB0byBwcm92aWRlIEhUVFAgYW5kIEhUVFBTIHdpdGggYSBzaW5nbGUgc2VydmVyPzwvc3Ryb25nPgotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwjaHR0cHMtcGFyYWxsZWwiPjxiPkw8L2I+PC9hPl0KLSAgICA8cD4KLSAgICBZZXMsIEhUVFAgYW5kIEhUVFBTIHVzZSBkaWZmZXJlbnQgc2VydmVyIHBvcnRzLCBzbyB0aGVyZSBpcyBubyBkaXJlY3QKLSAgICBjb25mbGljdCBiZXR3ZWVuIHRoZW0uIEVpdGhlciBydW4gdHdvIHNlcGFyYXRlIHNlcnZlciBpbnN0YW5jZXMgKG9uZSBiaW5kcwotICAgIHRvIHBvcnQgODAsIHRoZSBvdGhlciB0byBwb3J0IDQ0Mykgb3IgZXZlbiB1c2UgQXBhY2hlJ3MgZWxlZ2FudCB2aXJ0dWFsCi0gICAgaG9zdGluZyBmYWNpbGl0eSB3aGVyZSB5b3UgY2FuIGVhc2lseSBjcmVhdGUgdHdvIHZpcnR1YWwgc2VydmVycyB3aGljaAotICAgIEFwYWNoZSBkaXNwYXRjaGVzOiBvbmUgcmVzcG9uZGluZyB0byBwb3J0IDgwIGFuZCBzcGVha2luZyBIVFRQIGFuZCBvbmUKLSAgICByZXNwb25kaW5nIHRvIHBvcnQgNDQzIHNwZWFraW5nIEhUVFBTLgotPHA+Ci08bGk+PGEgbmFtZT0iVG9DMTgiPjwvYT4KLSAgICA8YSBuYW1lPSJodHRwcy1wb3J0Ij48L2E+Ci0gICAgPHN0cm9uZyBpZD0iZmFxIj4KLUkga25vdyB0aGF0IEhUVFAgaXMgb24gcG9ydCA4MCwgYnV0IHdoZXJlIGlzIEhUVFBTPwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwjaHR0cHMtcG9ydCI+PGI+TDwvYj48L2E+XQotICAgIDxwPgotICAgIFlvdSBjYW4gcnVuIEhUVFBTIG9uIGFueSBwb3J0LCBidXQgdGhlIHN0YW5kYXJkcyBzcGVjaWZ5IHBvcnQgNDQzLCB3aGljaAotICAgIGlzIHdoZXJlIGFueSBIVFRQUyBjb21wbGlhbnQgYnJvd3NlciB3aWxsIGxvb2sgYnkgZGVmYXVsdC4gWW91IGNhbiBmb3JjZQotICAgIHlvdXIgYnJvd3NlciB0byBsb29rIG9uIGEgZGlmZmVyZW50IHBvcnQgYnkgc3BlY2lmeWluZyBpdCBpbiB0aGUgVVJMIGxpa2UKLSAgICB0aGlzIChmb3IgcG9ydCA2NjYpOiA8Y29kZT5odHRwczovL3NlY3VyZS5zZXJ2ZXIuZG9tOjY2Ni88L2NvZGU+Ci08cD4KLTxsaT48YSBuYW1lPSJUb0MxOSI+PC9hPgotICAgIDxhIG5hbWU9Imh0dHBzLXRlc3QiPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJmYXEiPgotSG93IGNhbiBJIHNwZWFrIEhUVFBTIG1hbnVhbGx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzPwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwjaHR0cHMtdGVzdCI+PGI+TDwvYj48L2E+XQotICAgIDxwPgotICAgIFdoaWxlIHlvdSB1c3VhbGx5IGp1c3QgdXNlCi0gICAgPHA+Ci0gICAgPGNvZGU+PGI+JCB0ZWxuZXQgbG9jYWxob3N0IDgwPC9iPjwvY29kZT48YnI+Ci0gICAgPGNvZGU+PGI+R0VUIC8gSFRUUC8xLjA8L2I+PC9jb2RlPgotICAgIDxwPgotICAgIGZvciBzaW1wbGUgdGVzdGluZyB0aGUgSFRUUCBwcm90b2NvbCBvZiBBcGFjaGUsIGl0J3Mgbm90IHN1Y2ggZWFzeSBmb3IKLSAgICBIVFRQUyBiZWNhdXNlIG9mIHRoZSBTU0wgcHJvdG9jb2wgYmV0d2VlbiBUQ1AgYW5kIEhUVFAuIEJ1dCB3aXRoIHRoZQotICAgIGhlbHAgb2YgT3BlblNTTCdzIDxjb2RlPnNfY2xpZW50PC9jb2RlPiBjb21tYW5kIHlvdSBjYW4gZG8gYSBzaW1pbGFyCi0gICAgY2hlY2sgZXZlbiBmb3IgSFRUUFM6Ci0gICAgPHA+Ci0gICAgPGNvZGU+PGI+JCBvcGVuc3NsIHNfY2xpZW50IC1jb25uZWN0IGxvY2FsaG9zdDo0NDMgLXN0YXRlIC1kZWJ1ZzwvYj48L2NvZGU+PGJyPgotICAgIDxjb2RlPjxiPkdFVCAvIEhUVFAvMS4wPC9iPjwvY29kZT4KLSAgICA8cD4KLSAgICBCZWZvcmUgdGhlIGFjdHVhbCBIVFRQIHJlc3BvbnNlIHlvdSByZWNlaXZlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICAgIFNTTCBoYW5kc2hha2UuIEZvciBhIG1vcmUgZ2VuZXJhbCBjb21tYW5kIGxpbmUgY2xpZW50IHdoaWNoIGRpcmVjdGx5Ci0gICAgdW5kZXJzdGFuZHMgYm90aCB0aGUgSFRUUCBhbmQgSFRUUFMgc2NoZW1lLCBjYW4gcGVyZm9ybSBHRVQgYW5kIFBPU1QKLSAgICBtZXRob2RzLCBjYW4gdXNlIGEgcHJveHksIHN1cHBvcnRzIGJ5dGUgcmFuZ2VzLCBldGMuIHlvdSBzaG91bGQgaGF2ZSBhCi0gICAgbG9vayBhdCBuaWZ0eSA8YSBocmVmPSJodHRwOi8vY3VybC5oYXh4Lm51LyI+Y1VSTDwvYT4KLSAgICB0b29sLiBXaXRoIGl0IHlvdSBjYW4gZGlyZWN0bHkgY2hlY2sgaWYgeW91ciBBcGFjaGUgaXMgcnVubmluZyBmaW5lIG9uCi0gICAgUG9ydCA4MCBhbmQgNDQzIGFzIGZvbGxvd2luZzoKLSAgICA8cD4KLSAgICA8Y29kZT48Yj4kIGN1cmwgaHR0cDovL2xvY2FsaG9zdC88L2I+PC9jb2RlPjxicj4KLSAgICA8Y29kZT48Yj4kIGN1cmwgaHR0cHM6Ly9sb2NhbGhvc3QvPC9iPjwvY29kZT48YnI+Ci08cD4KLTxsaT48YSBuYW1lPSJUb0MyMCI+PC9hPgotICAgIDxhIG5hbWU9ImhhbmciPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJmYXEiPgotV2h5IGRvZXMgdGhlIGNvbm5lY3Rpb24gaGFuZyB3aGVuIEkgY29ubmVjdCB0byBteSBTU0wtYXdhcmUgQXBhY2hlIHNlcnZlcj8KLTwvc3Ryb25nPiZuYnNwOyZuYnNwOwotICAgIFs8YSBocmVmPSJodHRwOi8vd3d3Lm1vZHNzbC5vcmcvZG9jcy8yLjgvc3NsX2ZhcS5odG1sI2hhbmciPjxiPkw8L2I+PC9hPl0KLSAgICA8cD4KLSAgICBCZWNhdXNlIHlvdSBjb25uZWN0ZWQgd2l0aCBIVFRQIHRvIHRoZSBIVFRQUyBwb3J0LCBpLmUuIHlvdSB1c2VkIGFuIFVSTCBvZgotICAgIHRoZSBmb3JtIGBgPGNvZGU+aHR0cDovLzwvY29kZT4nJyBpbnN0ZWFkIG9mIGBgPGNvZGU+aHR0cHM6Ly88L2NvZGU+JycuCi0gICAgVGhpcyBhbHNvIGhhcHBlbnMgdGhlIG90aGVyIHdheSByb3VuZCB3aGVuIHlvdSBjb25uZWN0IHZpYSBIVFRQUyB0byBhIEhUVFAKLSAgICBwb3J0LCBpLmUuIHdoZW4geW91IHRyeSB0byB1c2UgYGA8Y29kZT5odHRwczovLzwvY29kZT4nJyBvbiBhIHNlcnZlciB0aGF0Ci0gICAgZG9lc24ndCBzdXBwb3J0IFNTTCAob24gdGhpcyBwb3J0KS4gTWFrZSBzdXJlIHlvdSBhcmUgY29ubmVjdGluZyB0byBhCi0gICAgdmlydHVhbCBzZXJ2ZXIgdGhhdCBzdXBwb3J0cyBTU0wsIHdoaWNoIGlzIHByb2JhYmx5IHRoZSBJUCBhc3NvY2lhdGVkIHdpdGgKLSAgICB5b3VyIGhvc3RuYW1lLCBub3QgbG9jYWxob3N0ICgxMjcuMC4wLjEpLgotPHA+Ci08bGk+PGEgbmFtZT0iVG9DMjEiPjwvYT4KLSAgICA8YSBuYW1lPSJoYW5nIj48L2E+Ci0gICAgPHN0cm9uZyBpZD0iZmFxIj4KLVdoeSBkbyBJIGdldCBgYENvbm5lY3Rpb24gUmVmdXNlZCcnIG1lc3NhZ2VzIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyBteSBmcmVzaGx5Ci1pbnN0YWxsZWQgQXBhY2hlK21vZF9zc2wgc2VydmVyIHZpYSBIVFRQUz8KLTwvc3Ryb25nPiZuYnNwOyZuYnNwOwotICAgIFs8YSBocmVmPSJodHRwOi8vd3d3Lm1vZHNzbC5vcmcvZG9jcy8yLjgvc3NsX2ZhcS5odG1sI2hhbmciPjxiPkw8L2I+PC9hPl0KLSAgICA8cD4KLSAgICBUaGVyZSBjYW4gYmUgdmFyaW91cyByZWFzb25zLiBTb21lIG9mIHRoZSBjb21tb24gbWlzdGFrZXMgaXMgdGhhdCBwZW9wbGUKLSAgICBzdGFydCBBcGFjaGUgd2l0aCBqdXN0IGBgPHR0PmFwYWNoZWN0bCBzdGFydDwvdHQ+JycgKG9yCi0gICAgYGA8dHQ+aHR0cGQ8L3R0PicnKSBpbnN0ZWFkIG9mIGBgPHR0PmFwYWNoZWN0bCBzdGFydHNzbDwvdHQ+JycgKG9yCi0gICAgYGA8dHQ+aHR0cGQgLURTU0w8L3R0PicnLiBPciB5b3UncmUgY29uZmlndXJhdGlvbiBpcyBub3QgY29ycmVjdC4gQXQKLSAgICBsZWFzdCBtYWtlIHN1cmUgdGhhdCB5b3VyIGBgPHR0Pkxpc3RlbjwvdHQ+JycgZGlyZWN0aXZlcyBtYXRjaCB5b3VyCi0gICAgYGA8dHQ+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvdHQ+JycgZGlyZWN0aXZlcy4gQW5kIGlmIGFsbCBmYWlscywgcGxlYXNlIGRvCi0gICAgeW91cnNlbGYgYSBmYXZvciBhbmQgc3RhcnQgb3ZlciB3aXRoIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gbW9kX3NzbAotICAgIHByb3ZpZGVzIHlvdS4KLTxwPgotPGxpPjxhIG5hbWU9IlRvQzIyIj48L2E+Ci0gICAgPGEgbmFtZT0iZW52LXZhcnMiPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJmYXEiPgotSW4gbXkgQ0dJIHByb2dyYW1zIGFuZCBTU0kgc2NyaXB0cyB0aGUgdmFyaW91cyBkb2N1bWVudGVkCi08Y29kZT5TU0xfWFhYPC9jb2RlPiB2YXJpYWJsZXMgZG8gbm90IGV4aXN0cy4gV2h5PwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwjZW52LXZhcnMiPjxiPkw8L2I+PC9hPl0KLSAgICA8cD4KLSAgICBKdXN0IG1ha2Ugc3VyZSB5b3UgaGF2ZSBgYDxjb2RlPlNTTE9wdGlvbnMgK1N0ZEVudlZhcnM8L2NvZGU+JycKLSAgICBlbmFibGVkIGZvciB0aGUgY29udGV4dCBvZiB5b3VyIENHSS9TU0kgcmVxdWVzdHMuCi08cD4KLTxsaT48YSBuYW1lPSJUb0MyMyI+PC9hPgotICAgIDxhIG5hbWU9InJlbGF0aXZlLWxpbmtzIj48L2E+Ci0gICAgPHN0cm9uZyBpZD0iZmFxIj4KLUhvdyBjYW4gSSB1c2UgcmVsYXRpdmUgaHlwZXJsaW5rcyB0byBzd2l0Y2ggYmV0d2VlbiBIVFRQIGFuZCBIVFRQUz8KLTwvc3Ryb25nPiZuYnNwOyZuYnNwOwotICAgIFs8YSBocmVmPSJodHRwOi8vd3d3Lm1vZHNzbC5vcmcvZG9jcy8yLjgvc3NsX2ZhcS5odG1sI3JlbGF0aXZlLWxpbmtzIj48Yj5MPC9iPjwvYT5dCi0gICAgPHA+Ci0gICAgVXN1YWxseSB5b3UgaGF2ZSB0byB1c2UgZnVsbHktcXVhbGlmaWVkIGh5cGVybGlua3MgYmVjYXVzZQotICAgIHlvdSBoYXZlIHRvIGNoYW5nZSB0aGUgVVJMIHNjaGVtZS4gQnV0IHdpdGggdGhlIGhlbHAgb2Ygc29tZSBVUkwKLSAgICBtYW5pcHVsYXRpb25zIHRocm91Z2ggbW9kX3Jld3JpdGUgeW91IGNhbiBhY2hpZXZlIHRoZSBzYW1lIGVmZmVjdCB3aGlsZQotICAgIHlvdSBzdGlsbCBjYW4gdXNlIHJlbGF0aXZlIFVSTHM6Ci0gICAgPHByZT4KLSAgICBSZXdyaXRlRW5naW5lIG9uCi0gICAgUmV3cml0ZVJ1bGUgICBeLyguKik6U1NMJCAgIGh0dHBzOi8vJXtTRVJWRVJfTkFNRX0vJDEgW1IsTF0KLSAgICBSZXdyaXRlUnVsZSAgIF4vKC4qKTpOT1NTTCQgaHR0cDovLyV7U0VSVkVSX05BTUV9LyQxICBbUixMXQotICAgIDwvcHJlPgotICAgIFRoaXMgcmV3cml0ZSBydWxlc2V0IGxldHMgeW91IHVzZSBoeXBlcmxpbmtzIG9mIHRoZSBmb3JtCi0gICAgPHByZT4KLSAgICAmbHQ7YSBocmVmPSJkb2N1bWVudC5odG1sOlNTTCImZ3QKLSAgICA8L3ByZT4KLTwvdWw+Ci08cD4KLTxicj4KLTxoMj48YSBuYW1lPSJUb0MyNCI+QWJvdXQgQ2VydGlmaWNhdGVzPC9hPjwvaDI+Ci08dWw+Ci08cD4KLTxsaT48YSBuYW1lPSJUb0MyNSI+PC9hPgotICAgIDxhIG5hbWU9IndoYXQtaXMiPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJmYXEiPgotV2hhdCBhcmUgUlNBIFByaXZhdGUgS2V5cywgQ1NScyBhbmQgQ2VydGlmaWNhdGVzPzwvc3Ryb25nPgotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwjd2hhdC1pcyI+PGI+TDwvYj48L2E+XQotICAgIDxwPgotICAgIFRoZSBSU0EgcHJpdmF0ZSBrZXkgZmlsZSBpcyBhIGRpZ2l0YWwgZmlsZSB0aGF0IHlvdSBjYW4gdXNlIHRvIGRlY3J5cHQKLSAgICBtZXNzYWdlcyBzZW50IHRvIHlvdS4gSXQgaGFzIGEgcHVibGljIGNvbXBvbmVudCB3aGljaCB5b3UgZGlzdHJpYnV0ZSAodmlhCi0gICAgeW91ciBDZXJ0aWZpY2F0ZSBmaWxlKSB3aGljaCBhbGxvd3MgcGVvcGxlIHRvIGVuY3J5cHQgdGhvc2UgbWVzc2FnZXMgdG8KLSAgICB5b3UuIEEgQ2VydGlmaWNhdGUgU2lnbmluZyBSZXF1ZXN0IChDU1IpIGlzIGEgZGlnaXRhbCBmaWxlIHdoaWNoIGNvbnRhaW5zCi0gICAgeW91ciBwdWJsaWMga2V5IGFuZCB5b3VyIG5hbWUuIFlvdSBzZW5kIHRoZSBDU1IgdG8gYSBDZXJ0aWZ5aW5nIEF1dGhvcml0eQotICAgIChDQSkgdG8gYmUgY29udmVydGVkIGludG8gYSByZWFsIENlcnRpZmljYXRlLiBBIENlcnRpZmljYXRlIGNvbnRhaW5zIHlvdXIKLSAgICBSU0EgcHVibGljIGtleSwgeW91ciBuYW1lLCB0aGUgbmFtZSBvZiB0aGUgQ0EsIGFuZCBpcyBkaWdpdGFsbHkgc2lnbmVkIGJ5Ci0gICAgeW91ciBDQS4gQnJvd3NlcnMgdGhhdCBrbm93IHRoZSBDQSBjYW4gdmVyaWZ5IHRoZSBzaWduYXR1cmUgb24gdGhhdAotICAgIENlcnRpZmljYXRlLCB0aGVyZWJ5IG9idGFpbmluZyB5b3VyIFJTQSBwdWJsaWMga2V5LiBUaGF0IGVuYWJsZXMgdGhlbSB0bwotICAgIHNlbmQgbWVzc2FnZXMgd2hpY2ggb25seSB5b3UgY2FuIGRlY3J5cHQuCi0gICAgU2VlIHRoZSA8YSBocmVmPSJzc2xfaW50cm8uaHRtbCI+SW50cm9kdWN0aW9uPC9hPiBjaGFwdGVyIGZvciBhIGdlbmVyYWwKLSAgICBkZXNjcmlwdGlvbiBvZiB0aGUgU1NMIHByb3RvY29sLgotPHA+Ci08bGk+PGEgbmFtZT0iVG9DMjYiPjwvYT4KLSAgICA8YSBuYW1lPSJzdGFydHVwIj48L2E+Ci0gICAgPHN0cm9uZyBpZD0iZmFxIj4KLVNlZW1zIGxpa2UgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIG9uIHN0YXJ0dXAgYmV0d2VlbiB0aGUgb3JpZ2luYWwgQXBhY2hlIGFuZCBhbiBTU0wtYXdhcmUgQXBhY2hlPwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwjc3RhcnR1cCI+PGI+TDwvYj48L2E+XQotICAgIDxwPgotICAgIFllcywgaW4gZ2VuZXJhbCwgc3RhcnRpbmcgQXBhY2hlIHdpdGggYSBidWlsdC1pbiBtb2Rfc3NsIGlzIGp1c3QgbGlrZQotICAgIHN0YXJ0aW5nIGFuIHVuZW5jdW1iZXJlZCBBcGFjaGUsIGV4Y2VwdCBmb3IgdGhlIGZhY3QgdGhhdCB3aGVuIHlvdSBoYXZlIGEKLSAgICBwYXNzIHBocmFzZSBvbiB5b3VyIFNTTCBwcml2YXRlIGtleSBmaWxlLiBUaGVuIGEgc3RhcnR1cCBkaWFsb2cgcG9wcyB1cAotICAgIGFza2luZyB5b3UgdG8gZW50ZXIgdGhlIHBhc3MgcGhyYXNlLgotICAgIDxwPgotICAgIFRvIHR5cGUgaW4gdGhlIHBhc3MgcGhyYXNlIG1hbnVhbGx5IHdoZW4gc3RhcnRpbmcgdGhlIHNlcnZlciBjYW4gYmUKLSAgICBwcm9ibGVtYXRpYywgZm9yIGluc3RhbmNlIHdoZW4gc3RhcnRpbmcgdGhlIHNlcnZlciBmcm9tIHRoZSBzeXN0ZW0gYm9vdAotICAgIHNjcmlwdHMuIEFzIGFuIGFsdGVybmF0aXZlIHRvIHRoaXMgc2l0dWF0aW9uIHlvdSBjYW4gZm9sbG93IHRoZSBzdGVwcwotICAgIGJlbG93IHVuZGVyIGBgSG93IGNhbiBJIGdldCByaWQgb2YgdGhlIHBhc3MtcGhyYXNlIGRpYWxvZyBhdCBBcGFjaGUKLSAgICBzdGFydHVwIHRpbWU/JycuCi08cD4KLTxsaT48YSBuYW1lPSJUb0MyNyI+PC9hPgotICAgIDxhIG5hbWU9ImNlcnQtZHVtbXkiPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJmYXEiPgotSG93IGNhbiBJIGNyZWF0ZSBhIGR1bW15IFNTTCBzZXJ2ZXIgQ2VydGlmaWNhdGUgZm9yIHRlc3RpbmcgcHVycG9zZXM/Ci08L3N0cm9uZz4mbmJzcDsmbmJzcDsKLSAgICBbPGEgaHJlZj0iaHR0cDovL3d3dy5tb2Rzc2wub3JnL2RvY3MvMi44L3NzbF9mYXEuaHRtbCNjZXJ0LWR1bW15Ij48Yj5MPC9iPjwvYT5dCi0gICAgPHA+Ci0gICAgQSBDZXJ0aWZpY2F0ZSBkb2VzIG5vdCBoYXZlIHRvIGJlIHNpZ25lZCBieSBhIHB1YmxpYyBDQS4gWW91IGNhbiB1c2UgeW91cgotICAgIHByaXZhdGUga2V5IHRvIHNpZ24gdGhlIENlcnRpZmljYXRlIHdoaWNoIGNvbnRhaW5zIHlvdXIgcHVibGljIGtleS4gWW91Ci0gICAgY2FuIGluc3RhbGwgdGhpcyBDZXJ0aWZpY2F0ZSBpbnRvIHlvdXIgc2VydmVyLCBhbmQgcGVvcGxlIHVzaW5nIE5ldHNjYXBlCi0gICAgTmF2aWdhdG9yIChub3QgTVNJRSkgd2lsbCBiZSBhYmxlIHRvIGNvbm5lY3QgYWZ0ZXIgY2xpY2tpbmcgT0sgdG8gYQotICAgIHdhcm5pbmcgZGlhbG9ndWUuIFlvdSBjYW4gZ2V0IE1TSUUgdG8gd29yaywgYW5kIHlvdXIgY3VzdG9tZXJzIGNhbgotICAgIGVsaW1pbmF0ZSB0aGUgZGlhbG9ndWUsIGJ5IGluc3RhbGxpbmcgdGhhdCBDZXJ0aWZpY2F0ZSBtYW51YWxseSBpbnRvIHRoZWlyCi0gICAgYnJvd3NlcnMuCi0gICAgPHA+Ci0gICAgSnVzdCB1c2UgdGhlIGBgPGNvZGU+bWFrZSBjZXJ0aWZpY2F0ZTwvY29kZT4nJyBjb21tYW5kIGF0IHRoZSB0b3AtbGV2ZWwKLSAgICBkaXJlY3Rvcnkgb2YgdGhlIEFwYWNoZSBzb3VyY2UgdHJlZSByaWdodCBiZWZvcmUgaW5zdGFsbGluZyBBcGFjaGUgdmlhCi0gICAgYGA8Y29kZT5tYWtlIGluc3RhbGw8L2NvZGU+JycuIFRoaXMgY3JlYXRlcyBhIHNlbGYtc2lnbmVkIFNTTCBDZXJ0aWZpY2F0ZQotICAgIHdoaWNoIGV4cGlyZXMgYWZ0ZXIgMzAgZGF5cyBhbmQgaXNuJ3QgZW5jcnlwdGVkICh3aGljaCBtZWFucyB5b3UgZG9uJ3QKLSAgICBuZWVkIHRvIGVudGVyIGEgcGFzcy1waHJhc2UgYXQgQXBhY2hlIHN0YXJ0dXAgdGltZSkuCi0gICAgPHA+Ci0gICAgQlVUIFJFTUVNQkVSOiBZT1UgUkVBTExZIEhBVkUgVE8gQ1JFQVRFIEEgUkVBTCBDRVJUSUZJQ0FURSBGT1IgVEhFIExPTkcKLSAgICBSVU4hIEhPVyBUSElTIElTIERPTkUgSVMgREVTQ1JJQkVEIElOIFRIRSBORVhUIEFOU1dFUi4KLTxwPgotPGxpPjxhIG5hbWU9IlRvQzI4Ij48L2E+Ci0gICAgPGEgbmFtZT0iY2VydC1yZWFsIj48L2E+Ci0gICAgPHN0cm9uZyBpZD0iZmFxIj4KLU9rLCBJJ3ZlIGdvdCBteSBzZXJ2ZXIgaW5zdGFsbGVkIGFuZCB3YW50IHRvIGNyZWF0ZSBhIHJlYWwgU1NMCi1zZXJ2ZXIgQ2VydGlmaWNhdGUgZm9yIGl0LiBIb3cgZG8gSSBkbyBpdD8KLTwvc3Ryb25nPiZuYnNwOyZuYnNwOwotICAgIFs8YSBocmVmPSJodHRwOi8vd3d3Lm1vZHNzbC5vcmcvZG9jcy8yLjgvc3NsX2ZhcS5odG1sI2NlcnQtcmVhbCI+PGI+TDwvYj48L2E+XQotICAgIDxwPgotICAgIEhlcmUgaXMgYSBzdGVwLWJ5LXN0ZXAgZGVzY3JpcHRpb246Ci0gICAgPHA+Ci0gICAgPG9sPgotICAgIDxsaT5NYWtlIHN1cmUgT3BlblNTTCBpcyByZWFsbHkgaW5zdGFsbGVkIGFuZCBpbiB5b3VyIDxjb2RlPlBBVEg8L2NvZGU+LgotICAgICAgICBCdXQgc29tZSBjb21tYW5kcyBldmVuIHdvcmsgb2sgd2hlbiB5b3UganVzdCBydW4gdGhlCi0gICAgICAgIGBgPGNvZGU+b3BlbnNzbDwvY29kZT4nJyBwcm9ncmFtIGZyb20gd2l0aGluIHRoZSBPcGVuU1NMIHNvdXJjZSB0cmVlIGFzCi0gICAgICAgIGBgPGNvZGU+Li9hcHBzL29wZW5zc2w8L2NvZGU+JycuCi0gICAgPHA+Ci0gICAgPGxpPkNyZWF0ZSBhIFJTQSBwcml2YXRlIGtleSBmb3IgeW91ciBBcGFjaGUgc2VydmVyCi0gICAgICAgKHdpbGwgYmUgVHJpcGxlLURFUyBlbmNyeXB0ZWQgYW5kIFBFTSBmb3JtYXR0ZWQpOgotICAgICAgIDxwPgotICAgICAgIDxjb2RlPjxzdHJvbmc+JCBvcGVuc3NsIGdlbnJzYSAtZGVzMyAtb3V0IHNlcnZlci5rZXkgMTAyNDwvc3Ryb25nPjwvY29kZT4KLSAgICAgICA8cD4KLSAgICAgICBQbGVhc2UgYmFja3VwIHRoaXMgPGNvZGU+c2VydmVyLmtleTwvY29kZT4gZmlsZSBhbmQgcmVtZW1iZXIgdGhlCi0gICAgICAgcGFzcy1waHJhc2UgeW91IGhhZCB0byBlbnRlciBhdCBhIHNlY3VyZSBsb2NhdGlvbi4KLSAgICAgICBZb3UgY2FuIHNlZSB0aGUgZGV0YWlscyBvZiB0aGlzIFJTQSBwcml2YXRlIGtleSB2aWEgdGhlIGNvbW1hbmQ6Ci0gICAgICAgPHA+Ci0gICAgICAgPGNvZGU+PHN0cm9uZz4kIG9wZW5zc2wgcnNhIC1ub291dCAtdGV4dCAtaW4gc2VydmVyLmtleTwvc3Ryb25nPjwvY29kZT4KLSAgICAgICA8cD4KLSAgICAgICBBbmQgeW91IGNvdWxkIGNyZWF0ZSBhIGRlY3J5cHRlZCBQRU0gdmVyc2lvbiAobm90IHJlY29tbWVuZGVkKQotICAgICAgIG9mIHRoaXMgUlNBIHByaXZhdGUga2V5IHZpYToKLSAgICAgICA8cD4KLSAgICAgICA8Y29kZT48c3Ryb25nPiQgb3BlbnNzbCByc2EgLWluIHNlcnZlci5rZXkgLW91dCBzZXJ2ZXIua2V5LnVuc2VjdXJlPC9zdHJvbmc+PC9jb2RlPgotICAgIDxwPgotICAgIDxsaT5DcmVhdGUgYSBDZXJ0aWZpY2F0ZSBTaWduaW5nIFJlcXVlc3QgKENTUikgd2l0aCB0aGUgc2VydmVyIFJTQSBwcml2YXRlCi0gICAgICAga2V5IChvdXRwdXQgd2lsbCBiZSBQRU0gZm9ybWF0dGVkKToKLSAgICAgICA8cD4KLSAgICAgICA8Y29kZT48c3Ryb25nPiQgb3BlbnNzbCByZXEgLW5ldyAta2V5IHNlcnZlci5rZXkgLW91dCBzZXJ2ZXIuY3NyPC9zdHJvbmc+PC9jb2RlPgotICAgICAgIDxwPgotICAgICAgIE1ha2Ugc3VyZSB5b3UgZW50ZXIgdGhlIEZRRE4gKCJGdWxseSBRdWFsaWZpZWQgRG9tYWluIE5hbWUiKSBvZiB0aGUKLSAgICAgICBzZXJ2ZXIgd2hlbiBPcGVuU1NMIHByb21wdHMgeW91IGZvciB0aGUgIkNvbW1vbk5hbWUiLCBpLmUuIHdoZW4geW91Ci0gICAgICAgZ2VuZXJhdGUgYSBDU1IgZm9yIGEgd2Vic2l0ZSB3aGljaCB3aWxsIGJlIGxhdGVyIGFjY2Vzc2VkIHZpYQotICAgICAgIDxjb2RlPmh0dHBzOi8vd3d3LmZvby5kb20vPC9jb2RlPiwgZW50ZXIgInd3dy5mb28uZG9tIiBoZXJlLgotICAgICAgIFlvdSBjYW4gc2VlIHRoZSBkZXRhaWxzIG9mIHRoaXMgQ1NSIHZpYSB0aGUgY29tbWFuZAotICAgICAgIDxwPgotICAgICAgIDxjb2RlPjxzdHJvbmc+JCBvcGVuc3NsIHJlcSAtbm9vdXQgLXRleHQgLWluIHNlcnZlci5jc3I8L3N0cm9uZz48L2NvZGU+Ci0gICAgPHA+Ci0gICAgPGxpPllvdSBub3cgaGF2ZSB0byBzZW5kIHRoaXMgQ2VydGlmaWNhdGUgU2lnbmluZyBSZXF1ZXN0IChDU1IpIHRvCi0gICAgICAgYSBDZXJ0aWZ5aW5nIEF1dGhvcml0eSAoQ0EpIGZvciBzaWduaW5nLiBUaGUgcmVzdWx0IGlzIHRoZW4gYSByZWFsCi0gICAgICAgQ2VydGlmaWNhdGUgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIEFwYWNoZS4gSGVyZSB5b3UgaGF2ZSB0d28gb3B0aW9uczoKLSAgICAgICBGaXJzdCB5b3UgY2FuIGxldCB0aGUgQ1NSIHNpZ24gYnkgYSBjb21tZXJjaWFsIENBIGxpa2UgVmVyaXNpZ24gb3IKLSAgICAgICBUaGF3dGUuIFRoZW4geW91IHVzdWFsbHkgaGF2ZSB0byBwb3N0IHRoZSBDU1IgaW50byBhIHdlYiBmb3JtLCBwYXkgZm9yCi0gICAgICAgdGhlIHNpZ25pbmcgYW5kIGF3YWl0IHRoZSBzaWduZWQgQ2VydGlmaWNhdGUgeW91IHRoZW4gY2FuIHN0b3JlIGludG8gYQotICAgICAgIHNlcnZlci5jcnQgZmlsZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29tbWVyY2lhbCBDQXMgaGF2ZSBhIGxvb2sKLSAgICAgICBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKLSAgICAgICA8cD4KLSAgICAgICA8dWw+Ci0gICAgICAgPGxpPiAgVmVyaXNpZ248YnI+Ci0gICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2RpZ2l0YWxpZC52ZXJpc2lnbi5jb20vc2VydmVyL2FwYWNoZU5vdGljZS5odG0iPgotICAgICAgICAgICAgIGh0dHA6Ly9kaWdpdGFsaWQudmVyaXNpZ24uY29tL3NlcnZlci9hcGFjaGVOb3RpY2UuaHRtCi0gICAgICAgICAgICAgPC9hPgotICAgICAgIDxsaT4gIFRoYXd0ZSBDb25zdWx0aW5nPGJyPgotICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cudGhhd3RlLmNvbS9jZXJ0cy9zZXJ2ZXIvcmVxdWVzdC5odG1sIj4KLSAgICAgICAgICAgICBodHRwOi8vd3d3LnRoYXd0ZS5jb20vY2VydHMvc2VydmVyL3JlcXVlc3QuaHRtbAotICAgICAgICAgICAgIDwvYT4KLSAgICAgICA8bGk+ICBDZXJ0aVNpZ24gQ2VydGlmaWNhZG9yYSBEaWdpdGFsIEx0ZGEuPGJyPgotICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2VydGlzaWduLmNvbS5iciI+Ci0gICAgICAgICAgICAgaHR0cDovL3d3dy5jZXJ0aXNpZ24uY29tLmJyCi0gICAgICAgICAgICAgPC9hPgotICAgICAgIDxsaT4gIElLUyBHbWJIPGJyPgotICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWtzLWplbmEuZGUvcHJvZHVrdGUvY2EvIj4KLSAgICAgICAgICAgICBodHRwOi8vd3d3Lmlrcy1qZW5hLmRlL3Byb2R1a3RlL2NhLwotICAgICAgICAgICAgIDwvYT4KLSAgICAgICA8bGk+ICBVcHRpbWUgQ29tbWVyY2UgTHRkLjxicj4KLSAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnVwdGltZWNvbW1lcmNlLmNvbSI+Ci0gICAgICAgICAgICAgaHR0cDovL3d3dy51cHRpbWVjb21tZXJjZS5jb20KLSAgICAgICAgICAgICA8L2E+Ci0gICAgICAgPGxpPiAgQmVsU2lnbiBOVi9TQTxicj4KLSAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmJlbHNpZ24uYmUiPgotICAgICAgICAgICAgIGh0dHA6Ly93d3cuYmVsc2lnbi5iZQotICAgICAgICAgICAgIDwvYT4KLSAgICAgICA8L3VsPgotICAgICAgIDxwPgotICAgICAgIFNlY29uZCB5b3UgY2FuIHVzZSB5b3VyIG93biBDQSBhbmQgbm93IGhhdmUgdG8gc2lnbiB0aGUgQ1NSIHlvdXJzZWxmIGJ5Ci0gICAgICAgdGhpcyBDQS4gUmVhZCB0aGUgbmV4dCBhbnN3ZXIgaW4gdGhpcyBGQVEgb24gaG93IHRvIHNpZ24gYSBDU1Igd2l0aAotICAgICAgIHlvdXIgQ0EgeW91cnNlbGYuCi0gICAgICAgWW91IGNhbiBzZWUgdGhlIGRldGFpbHMgb2YgdGhlIHJlY2VpdmVkIENlcnRpZmljYXRlIHZpYSB0aGUgY29tbWFuZDoKLSAgICAgICA8cD4KLSAgICAgICA8Y29kZT48c3Ryb25nPiQgb3BlbnNzbCB4NTA5IC1ub291dCAtdGV4dCAtaW4gc2VydmVyLmNydDwvc3Ryb25nPjwvY29kZT4KLSAgICA8cD4KLSAgICA8bGk+Tm93IHlvdSBoYXZlIHR3byBmaWxlczogPGNvZGU+c2VydmVyLmtleTwvY29kZT4gYW5kCi0gICAgPGNvZGU+c2VydmVyLmNydDwvY29kZT4uIFRoZXNlIG5vdyBjYW4gYmUgdXNlZCBhcyBmb2xsb3dpbmcgaW5zaWRlIHlvdXIKLSAgICBBcGFjaGUncyA8Y29kZT5odHRwZC5jb25mPC9jb2RlPiBmaWxlOgotICAgICAgIDxwcmU+Ci0gICAgICAgU1NMQ2VydGlmaWNhdGVGaWxlICAgIC9wYXRoL3RvL3RoaXMvc2VydmVyLmNydAotICAgICAgIFNTTENlcnRpZmljYXRlS2V5RmlsZSAvcGF0aC90by90aGlzL3NlcnZlci5rZXkKLSAgICAgICA8L3ByZT4KLSAgICAgICBUaGUgPGNvZGU+c2VydmVyLmNzcjwvY29kZT4gZmlsZSBpcyBubyBsb25nZXIgbmVlZGVkLgotICAgIDwvb2w+Ci08cD4KLTxsaT48YSBuYW1lPSJUb0MyOSI+PC9hPgotICAgIDxhIG5hbWU9ImNlcnQtb3duY2EiPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJmYXEiPgotSG93IGNhbiBJIGNyZWF0ZSBhbmQgdXNlIG15IG93biBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgKENBKT8KLTwvc3Ryb25nPiZuYnNwOyZuYnNwOwotICAgIFs8YSBocmVmPSJodHRwOi8vd3d3Lm1vZHNzbC5vcmcvZG9jcy8yLjgvc3NsX2ZhcS5odG1sI2NlcnQtb3duY2EiPjxiPkw8L2I+PC9hPl0KLSAgICA8cD4KLSAgICBUaGUgc2hvcnQgYW5zd2VyIGlzIHRvIHVzZSB0aGUgPGNvZGU+Q0Euc2g8L2NvZGU+IG9yIDxjb2RlPkNBLnBsPC9jb2RlPgotICAgIHNjcmlwdCBwcm92aWRlZCBieSBPcGVuU1NMLiBUaGUgbG9uZyBhbmQgbWFudWFsIGFuc3dlciBpcyB0aGlzOgotICAgIDxwPgotICAgIDxvbD4KLSAgICA8bGk+Q3JlYXRlIGEgUlNBIHByaXZhdGUga2V5IGZvciB5b3VyIENBCi0gICAgICAgKHdpbGwgYmUgVHJpcGxlLURFUyBlbmNyeXB0ZWQgYW5kIFBFTSBmb3JtYXR0ZWQpOgotICAgICAgIDxwPgotICAgICAgIDxjb2RlPjxzdHJvbmc+JCBvcGVuc3NsIGdlbnJzYSAtZGVzMyAtb3V0IGNhLmtleSAxMDI0PC9zdHJvbmc+PC9jb2RlPgotICAgICAgIDxwPgotICAgICAgIFBsZWFzZSBiYWNrdXAgdGhpcyA8Y29kZT5jYS5rZXk8L2NvZGU+IGZpbGUgYW5kIHJlbWVtYmVyIHRoZQotICAgICAgIHBhc3MtcGhyYXNlIHlvdSBjdXJyZW50bHkgZW50ZXJlZCBhdCBhIHNlY3VyZSBsb2NhdGlvbi4KLSAgICAgICBZb3UgY2FuIHNlZSB0aGUgZGV0YWlscyBvZiB0aGlzIFJTQSBwcml2YXRlIGtleSB2aWEgdGhlIGNvbW1hbmQKLSAgICAgICA8cD4KLSAgICAgICA8Y29kZT48c3Ryb25nPiQgb3BlbnNzbCByc2EgLW5vb3V0IC10ZXh0IC1pbiBjYS5rZXk8L3N0cm9uZz48L2NvZGU+Ci0gICAgICAgPHA+Ci0gICAgICAgQW5kIHlvdSBjYW4gY3JlYXRlIGEgZGVjcnlwdGVkIFBFTSB2ZXJzaW9uIChub3QgcmVjb21tZW5kZWQpIG9mIHRoaXMKLSAgICAgICBwcml2YXRlIGtleSB2aWE6Ci0gICAgICAgPHA+Ci0gICAgICAgPGNvZGU+PHN0cm9uZz4kIG9wZW5zc2wgcnNhIC1pbiBjYS5rZXkgLW91dCBjYS5rZXkudW5zZWN1cmU8L3N0cm9uZz48L2NvZGU+Ci0gICAgPHA+Ci0gICAgPGxpPkNyZWF0ZSBhIHNlbGYtc2lnbmVkIENBIENlcnRpZmljYXRlIChYNTA5IHN0cnVjdHVyZSkKLSAgICAgICB3aXRoIHRoZSBSU0Ega2V5IG9mIHRoZSBDQSAob3V0cHV0IHdpbGwgYmUgUEVNIGZvcm1hdHRlZCk6Ci0gICAgICAgPHA+Ci0gICAgICAgPGNvZGU+PHN0cm9uZz4kIG9wZW5zc2wgcmVxIC1uZXcgLXg1MDkgLWRheXMgMzY1IC1rZXkgY2Eua2V5IC1vdXQgY2EuY3J0PC9zdHJvbmc+PC9jb2RlPgotICAgICAgIDxwPgotICAgICAgIFlvdSBjYW4gc2VlIHRoZSBkZXRhaWxzIG9mIHRoaXMgQ2VydGlmaWNhdGUgdmlhIHRoZSBjb21tYW5kOgotICAgICAgIDxwPgotICAgICAgIDxjb2RlPjxzdHJvbmc+JCBvcGVuc3NsIHg1MDkgLW5vb3V0IC10ZXh0IC1pbiBjYS5jcnQ8L3N0cm9uZz48L2NvZGU+Ci0gICAgPHA+Ci0gICAgPGxpPlByZXBhcmUgYSBzY3JpcHQgZm9yIHNpZ25pbmcgd2hpY2ggaXMgbmVlZGVkIGJlY2F1c2UKLSAgICAgICB0aGUgYGA8Y29kZT5vcGVuc3NsIGNhPC9jb2RlPicnIGNvbW1hbmQgaGFzIHNvbWUgc3RyYW5nZSByZXF1aXJlbWVudHMKLSAgICAgICBhbmQgdGhlIGRlZmF1bHQgT3BlblNTTCBjb25maWcgZG9lc24ndCBhbGxvdyBvbmUgZWFzaWx5IHRvIHVzZQotICAgICAgIGBgPGNvZGU+b3BlbnNzbCBjYTwvY29kZT4nJyBkaXJlY3RseS4gU28gYSBzY3JpcHQgbmFtZWQKLSAgICAgICA8Y29kZT5zaWduLnNoPC9jb2RlPiBpcyBkaXN0cmlidXRlZCB3aXRoIHRoZSBtb2Rfc3NsIGRpc3RyaWJ1dGlvbgotICAgICAgIChzdWJkaXIgPGNvZGU+cGtnLmNvbnRyaWIvPC9jb2RlPikuIFVzZSB0aGlzIHNjcmlwdCBmb3Igc2lnbmluZy4KLSAgICA8cD4KLSAgICA8bGk+Tm93IHlvdSBjYW4gdXNlIHRoaXMgQ0EgdG8gc2lnbiBzZXJ2ZXIgQ1NSJ3MgaW4gb3JkZXIgdG8gY3JlYXRlIHJlYWwKLSAgICAgICBTU0wgQ2VydGlmaWNhdGVzIGZvciB1c2UgaW5zaWRlIGFuIEFwYWNoZSB3ZWJzZXJ2ZXIgKGFzc3VtaW5nCi0gICAgICAgeW91IGFscmVhZHkgaGF2ZSBhIDxjb2RlPnNlcnZlci5jc3I8L2NvZGU+IGF0IGhhbmQpOgotICAgICAgIDxwPgotICAgICAgIDxjb2RlPjxzdHJvbmc+JCAuL3NpZ24uc2ggc2VydmVyLmNzcjwvc3Ryb25nPjwvY29kZT4KLSAgICAgICA8cD4KLSAgICAgICBUaGlzIHNpZ25zIHRoZSBzZXJ2ZXIgQ1NSIGFuZCByZXN1bHRzIGluIGEgPGNvZGU+c2VydmVyLmNydDwvY29kZT4gZmlsZS4KLSAgICA8L29sPgotPHA+Ci08bGk+PGEgbmFtZT0iVG9DMzAiPjwvYT4KLSAgICA8YSBuYW1lPSJjaGFuZ2UtcGFzc3BocmFzZSI+PC9hPgotICAgIDxzdHJvbmcgaWQ9ImZhcSI+Ci1Ib3cgY2FuIEkgY2hhbmdlIHRoZSBwYXNzLXBocmFzZSBvbiBteSBwcml2YXRlIGtleSBmaWxlPwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwjY2hhbmdlLXBhc3NwaHJhc2UiPjxiPkw8L2I+PC9hPl0KLSAgICA8cD4KLSAgICBZb3Ugc2ltcGx5IGhhdmUgdG8gcmVhZCBpdCB3aXRoIHRoZSBvbGQgcGFzcy1waHJhc2UgYW5kIHdyaXRlIGl0IGFnYWluCi0gICAgYnkgc3BlY2lmeWluZyB0aGUgbmV3IHBhc3MtcGhyYXNlLiBZb3UgY2FuIGFjY29tcGxpc2ggdGhpcyB3aXRoIHRoZSBmb2xsb3dpbmcKLSAgICBjb21tYW5kczoKLSAgICA8cD4KLSAgICA8Y29kZT48c3Ryb25nPiQgb3BlbnNzbCByc2EgLWRlczMgLWluIHNlcnZlci5rZXkgLW91dCBzZXJ2ZXIua2V5Lm5ldzwvc3Ryb25nPjwvY29kZT48YnI+Ci0gICAgPGNvZGU+PHN0cm9uZz4kIG12IHNlcnZlci5rZXkubmV3IHNlcnZlci5rZXk8L3N0cm9uZz48L2NvZGU+PGJyPgotICAgIDxwPgotICAgIEhlcmUgeW91J3JlIGFza2VkIHR3byB0aW1lcyBmb3IgYSBQRU0gcGFzcy1waHJhc2UuIEF0IHRoZSBmaXJzdAotICAgIHByb21wdCBlbnRlciB0aGUgb2xkIHBhc3MtcGhyYXNlIGFuZCBhdCB0aGUgc2Vjb25kIHByb21wdAotICAgIGVudGVyIHRoZSBuZXcgcGFzcy1waHJhc2UuCi08cD4KLTxsaT48YSBuYW1lPSJUb0MzMSI+PC9hPgotICAgIDxhIG5hbWU9InJlbW92ZS1wYXNzcGhyYXNlIj48L2E+Ci0gICAgPHN0cm9uZyBpZD0iZmFxIj4KLUhvdyBjYW4gSSBnZXQgcmlkIG9mIHRoZSBwYXNzLXBocmFzZSBkaWFsb2cgYXQgQXBhY2hlIHN0YXJ0dXAgdGltZT8KLTwvc3Ryb25nPiZuYnNwOyZuYnNwOwotICAgIFs8YSBocmVmPSJodHRwOi8vd3d3Lm1vZHNzbC5vcmcvZG9jcy8yLjgvc3NsX2ZhcS5odG1sI3JlbW92ZS1wYXNzcGhyYXNlIj48Yj5MPC9iPjwvYT5dCi0gICAgPHA+Ci0gICAgVGhlIHJlYXNvbiB3aHkgdGhpcyBkaWFsb2cgcG9wcyB1cCBhdCBzdGFydHVwIGFuZCBldmVyeSByZS1zdGFydAotICAgIGlzIHRoYXQgdGhlIFJTQSBwcml2YXRlIGtleSBpbnNpZGUgeW91ciBzZXJ2ZXIua2V5IGZpbGUgaXMgc3RvcmVkIGluCi0gICAgZW5jcnlwdGVkIGZvcm1hdCBmb3Igc2VjdXJpdHkgcmVhc29ucy4gVGhlIHBhc3MtcGhyYXNlIGlzIG5lZWRlZCB0byBiZQotICAgIGFibGUgdG8gcmVhZCBhbmQgcGFyc2UgdGhpcyBmaWxlLiBXaGVuIHlvdSBjYW4gYmUgc3VyZSB0aGF0IHlvdXIgc2VydmVyIGlzCi0gICAgc2VjdXJlIGVub3VnaCB5b3UgcGVyZm9ybSB0d28gc3RlcHM6Ci0gICAgPHA+Ci0gICAgPG9sPgotICAgIDxsaT5SZW1vdmUgdGhlIGVuY3J5cHRpb24gZnJvbSB0aGUgUlNBIHByaXZhdGUga2V5ICh3aGlsZQotICAgICAgIHByZXNlcnZpbmcgdGhlIG9yaWdpbmFsIGZpbGUpOgotICAgICAgIDxwPgotICAgICAgIDxjb2RlPjxzdHJvbmc+JCBjcCBzZXJ2ZXIua2V5IHNlcnZlci5rZXkub3JnPC9zdHJvbmc+PC9jb2RlPjxicj4KLSAgICAgICA8Y29kZT48c3Ryb25nPiQgb3BlbnNzbCByc2EgLWluIHNlcnZlci5rZXkub3JnIC1vdXQgc2VydmVyLmtleTwvc3Ryb25nPjwvY29kZT4KLSAgICA8cD4KLSAgICA8bGk+TWFrZSBzdXJlIHRoZSBzZXJ2ZXIua2V5IGZpbGUgaXMgbm93IG9ubHkgcmVhZGFibGUgYnkgcm9vdDoKLSAgICAgICA8cD4KLSAgICAgICA8Y29kZT48c3Ryb25nPiQgY2htb2QgNDAwIHNlcnZlci5rZXk8L3N0cm9uZz48L2NvZGU+Ci0gICAgPC9vbD4KLSAgICA8cD4KLSAgICBOb3cgPGNvZGU+c2VydmVyLmtleTwvY29kZT4gd2lsbCBjb250YWluIGFuIHVuZW5jcnlwdGVkIGNvcHkgb2YgdGhlIGtleS4KLSAgICBJZiB5b3UgcG9pbnQgeW91ciBzZXJ2ZXIgYXQgdGhpcyBmaWxlIGl0IHdpbGwgbm90IHByb21wdCB5b3UgZm9yIGEKLSAgICBwYXNzLXBocmFzZS4gSE9XRVZFUiwgaWYgYW55b25lIGdldHMgdGhpcyBrZXkgdGhleSB3aWxsIGJlIGFibGUgdG8KLSAgICBpbXBlcnNvbmF0ZSB5b3Ugb24gdGhlIG5ldC4gUExFQVNFIG1ha2Ugc3VyZSB0aGF0IHRoZSBwZXJtaXNzaW9ucyBvbiB0aGF0Ci0gICAgZmlsZSBhcmUgcmVhbGx5IHN1Y2ggdGhhdCBvbmx5IHJvb3Qgb3IgdGhlIHdlYiBzZXJ2ZXIgdXNlciBjYW4gcmVhZCBpdAotICAgIChwcmVmZXJhYmx5IGdldCB5b3VyIHdlYiBzZXJ2ZXIgdG8gc3RhcnQgYXMgcm9vdCBidXQgcnVuIGFzIGFub3RoZXIKLSAgICBzZXJ2ZXIsIGFuZCBoYXZlIHRoZSBrZXkgcmVhZGFibGUgb25seSBieSByb290KS4KLSAgICA8cD4KLSAgICBBcyBhbiBhbHRlcm5hdGl2ZSBhcHByb2FjaCB5b3UgY2FuIHVzZSB0aGUgYGA8Y29kZT5TU0xQYXNzUGhyYXNlRGlhbG9nCi0gICAgZXhlYzovcGF0aC90by9wcm9ncmFtPC9jb2RlPicnIGZhY2lsaXR5LiBCdXQga2VlcCBpbiBtaW5kIHRoYXQgdGhpcyBpcwotICAgIG5laXRoZXIgbW9yZSBub3IgbGVzcyBzZWN1cmUsIG9mIGNvdXJzZS4KLTxwPgotPGxpPjxhIG5hbWU9IlRvQzMyIj48L2E+Ci0gICAgPGEgbmFtZT0idmVyaWZ5LWtleSI+PC9hPgotICAgIDxzdHJvbmcgaWQ9ImZhcSI+Ci1Ib3cgZG8gSSB2ZXJpZnkgdGhhdCBhIHByaXZhdGUga2V5IG1hdGNoZXMgaXRzIENlcnRpZmljYXRlPwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwjdmVyaWZ5LWtleSI+PGI+TDwvYj48L2E+XQotICAgIDxwPgotICAgIFRoZSBwcml2YXRlIGtleSBjb250YWlucyBhIHNlcmllcyBvZiBudW1iZXJzLiBUd28gb2YgdGhvc2UgbnVtYmVycyBmb3JtCi0gICAgdGhlICJwdWJsaWMga2V5IiwgdGhlIG90aGVycyBhcmUgcGFydCBvZiB5b3VyICJwcml2YXRlIGtleSIuIFRoZSAicHVibGljCi0gICAga2V5IiBiaXRzIGFyZSBhbHNvIGVtYmVkZGVkIGluIHlvdXIgQ2VydGlmaWNhdGUgKHdlIGdldCB0aGVtIGZyb20geW91cgotICAgIENTUikuIFRvIGNoZWNrIHRoYXQgdGhlIHB1YmxpYyBrZXkgaW4geW91ciBjZXJ0IG1hdGNoZXMgdGhlIHB1YmxpYwotICAgIHBvcnRpb24gb2YgeW91ciBwcml2YXRlIGtleSwgeW91IG5lZWQgdG8gdmlldyB0aGUgY2VydCBhbmQgdGhlIGtleSBhbmQKLSAgICBjb21wYXJlIHRoZSBudW1iZXJzLiBUbyB2aWV3IHRoZSBDZXJ0aWZpY2F0ZSBhbmQgdGhlIGtleSBydW4gdGhlCi0gICAgY29tbWFuZHM6Ci0gICAgPHA+Ci0gICAgPGNvZGU+PHN0cm9uZz4kIG9wZW5zc2wgeDUwOSAtbm9vdXQgLXRleHQgLWluIHNlcnZlci5jcnQ8L3N0cm9uZz48L2NvZGU+PGJyPgotICAgIDxjb2RlPjxzdHJvbmc+JCBvcGVuc3NsIHJzYSAtbm9vdXQgLXRleHQgLWluIHNlcnZlci5rZXk8L3N0cm9uZz48L2NvZGU+Ci0gICAgPHA+Ci0gICAgVGhlIGBtb2R1bHVzJyBhbmQgdGhlIGBwdWJsaWMgZXhwb25lbnQnIHBvcnRpb25zIGluIHRoZSBrZXkgYW5kIHRoZQotICAgIENlcnRpZmljYXRlIG11c3QgbWF0Y2guIEJ1dCBzaW5jZSB0aGUgcHVibGljIGV4cG9uZW50IGlzIHVzdWFsbHkgNjU1MzcKLSAgICBhbmQgaXQncyBib3RoZXJpbmcgY29tcGFyaW5nIGxvbmcgbW9kdWx1cyB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nCi0gICAgYXBwcm9hY2g6Ci0gICAgPHA+Ci0gICAgPGNvZGU+PHN0cm9uZz4kIG9wZW5zc2wgeDUwOSAtbm9vdXQgLW1vZHVsdXMgLWluIHNlcnZlci5jcnQgfCBvcGVuc3NsIG1kNTwvc3Ryb25nPjwvY29kZT48YnI+Ci0gICAgPGNvZGU+PHN0cm9uZz4kIG9wZW5zc2wgcnNhIC1ub291dCAtbW9kdWx1cyAtaW4gc2VydmVyLmtleSB8IG9wZW5zc2wgbWQ1PC9zdHJvbmc+PC9jb2RlPgotICAgIDxwPgotICAgIEFuZCB0aGVuIGNvbXBhcmUgdGhlc2UgcmVhbGx5IHNob3J0ZXIgbnVtYmVycy4gV2l0aCBvdmVyd2hlbG1pbmcKLSAgICBwcm9iYWJpbGl0eSB0aGV5IHdpbGwgZGlmZmVyIGlmIHRoZSBrZXlzIGFyZSBkaWZmZXJlbnQuIEJUVywgaWYgSSB3YW50IHRvCi0gICAgY2hlY2sgdG8gd2hpY2gga2V5IG9yIGNlcnRpZmljYXRlIGEgcGFydGljdWxhciBDU1IgYmVsb25ncyB5b3UgY2FuIGNvbXB1dGUKLSAgICA8cD4KLSAgICA8Y29kZT48c3Ryb25nPiQgb3BlbnNzbCByZXEgLW5vb3V0IC1tb2R1bHVzIC1pbiBzZXJ2ZXIuY3NyIHwgb3BlbnNzbCBtZDU8L3N0cm9uZz48L2NvZGU+Ci08cD4KLTxsaT48YSBuYW1lPSJUb0MzMyI+PC9hPgotICAgIDxhIG5hbWU9ImtleXNpemUxIj48L2E+Ci0gICAgPHN0cm9uZyBpZD0iZmFxIj4KLVdoYXQgZG9lcyBpdCBtZWFuIHdoZW4gbXkgY29ubmVjdGlvbnMgZmFpbCB3aXRoIGFuICJhbGVydCBiYWQgY2VydGlmaWNhdGUiCi1lcnJvcj8KLTwvc3Ryb25nPiZuYnNwOyZuYnNwOwotICAgIFs8YSBocmVmPSJodHRwOi8vd3d3Lm1vZHNzbC5vcmcvZG9jcy8yLjgvc3NsX2ZhcS5odG1sI2tleXNpemUxIj48Yj5MPC9iPjwvYT5dCi0gICAgPHA+Ci0gICAgVXN1YWxseSB3aGVuIHlvdSBzZWUgZXJyb3JzIGxpa2UgYGA8dHQ+T3BlblNTTDogZXJyb3I6MTQwOTQ0MTI6IFNTTAotICAgIHJvdXRpbmVzOlNTTDNfUkVBRF9CWVRFUzpzc2x2MyBhbGVydCBiYWQgY2VydGlmaWNhdGU8L3R0PicnIGluIHRoZSBTU0wKLSAgICBsb2dmaWxlLCB0aGlzIG1lYW5zIHRoYXQgdGhlIGJyb3dzZXIgd2FzIHVuYWJsZSB0byBoYW5kbGUgdGhlIHNlcnZlcgotICAgIGNlcnRpZmljYXRlL3ByaXZhdGUta2V5IHdoaWNoIHBlcmhhcHMgY29udGFpbiBhIFJTQS1rZXkgbm90IGVxdWFsIHRvIDEwMjQKLSAgICBiaXRzLiBGb3IgaW5zdGFuY2UgTmV0c2NhcGUgTmF2aWdhdG9yIDMueCBpcyBvbmUgb2YgdGhvc2UgYnJvd3NlcnMuCi08cD4KLTxsaT48YSBuYW1lPSJUb0MzNCI+PC9hPgotICAgIDxhIG5hbWU9ImtleXNpemUyIj48L2E+Ci0gICAgPHN0cm9uZyBpZD0iZmFxIj4KLVdoeSBkb2VzIG15IDIwNDgtYml0IHByaXZhdGUga2V5IG5vdCB3b3JrPwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwja2V5c2l6ZTIiPjxiPkw8L2I+PC9hPl0KLSAgICA8cD4KLSAgICBUaGUgcHJpdmF0ZSBrZXkgc2l6ZXMgZm9yIFNTTCBtdXN0IGJlIGVpdGhlciA1MTIgb3IgMTAyNCBmb3IgY29tcGF0aWJpbGl0eQotICAgIHdpdGggY2VydGFpbiB3ZWIgYnJvd3NlcnMuIEEga2V5c2l6ZSBvZiAxMDI0IGJpdHMgaXMgcmVjb21tZW5kZWQgYmVjYXVzZQotICAgIGtleXMgbGFyZ2VyIHRoYW4gMTAyNCBiaXRzIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBzb21lIHZlcnNpb25zIG9mIE5ldHNjYXBlCi0gICAgTmF2aWdhdG9yIGFuZCBNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIsIGFuZCB3aXRoIG90aGVyIGJyb3dzZXJzIHRoYXQKLSAgICB1c2UgUlNBJ3MgQlNBRkUgY3J5cHRvZ3JhcGh5IHRvb2xraXQuCi08cD4KLTxsaT48YSBuYW1lPSJUb0MzNSI+PC9hPgotICAgIDxhIG5hbWU9Imhhc2gtc3ltbGlua3MiPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJmYXEiPgotV2h5IGlzIGNsaWVudCBhdXRoZW50aWNhdGlvbiBicm9rZW4gYWZ0ZXIgdXBncmFkaW5nIGZyb20KLVNTTGVheSB2ZXJzaW9uIDAuOCB0byAwLjk/Ci08L3N0cm9uZz4mbmJzcDsmbmJzcDsKLSAgICBbPGEgaHJlZj0iaHR0cDovL3d3dy5tb2Rzc2wub3JnL2RvY3MvMi44L3NzbF9mYXEuaHRtbCNoYXNoLXN5bWxpbmtzIj48Yj5MPC9iPjwvYT5dCi0gICAgPHA+Ci0gICAgVGhlIENBIGNlcnRpZmljYXRlcyB1bmRlciB0aGUgcGF0aCB5b3UgY29uZmlndXJlZCB3aXRoCi0gICAgPGNvZGU+U1NMQ0FDZXJ0aWZpY2F0ZVBhdGg8L2NvZGU+IGFyZSBmb3VuZCBieSBTU0xlYXkgdGhyb3VnaCBoYXNoCi0gICAgc3ltbGlua3MuIFRoZXNlIGhhc2ggdmFsdWVzIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIGA8Y29kZT5vcGVuc3NsIHg1MDkgLW5vb3V0Ci0gICAgLWhhc2g8L2NvZGU+JyBjb21tYW5kLiBCdXQgdGhlIGFsZ29yaXRobSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgaGFzaCBmb3IgYQotICAgIGNlcnRpZmljYXRlIGhhcyBjaGFuZ2VkIGJldHdlZW4gU1NMZWF5IDAuOCBhbmQgMC45LiBTbyB5b3UgaGF2ZSB0byByZW1vdmUKLSAgICBhbGwgb2xkIGhhc2ggc3ltbGlua3MgYW5kIHJlLWNyZWF0ZSBuZXcgb25lcyBhZnRlciB1cGdyYWRpbmcuIFVzZSB0aGUKLSAgICA8Y29kZT5NYWtlZmlsZTwvY29kZT4gbW9kX3NzbCBwbGFjZWQgaW50byB0aGlzIGRpcmVjdG9yeS4KLTxwPgotPGxpPjxhIG5hbWU9IlRvQzM2Ij48L2E+Ci0gICAgPGEgbmFtZT0icGVtLXRvLWRlciI+PC9hPgotICAgIDxzdHJvbmcgaWQ9ImZhcSI+Ci1Ib3cgY2FuIEkgY29udmVydCBhIGNlcnRpZmljYXRlIGZyb20gUEVNIHRvIERFUiBmb3JtYXQ/Ci08L3N0cm9uZz4mbmJzcDsmbmJzcDsKLSAgICBbPGEgaHJlZj0iaHR0cDovL3d3dy5tb2Rzc2wub3JnL2RvY3MvMi44L3NzbF9mYXEuaHRtbCNwZW0tdG8tZGVyIj48Yj5MPC9iPjwvYT5dCi0gICAgPHA+Ci0gICAgVGhlIGRlZmF1bHQgY2VydGlmaWNhdGUgZm9ybWF0IGZvciBTU0xlYXkvT3BlblNTTCBpcyBQRU0sIHdoaWNoIGFjdHVhbGx5Ci0gICAgaXMgQmFzZTY0IGVuY29kZWQgREVSIHdpdGggaGVhZGVyIGFuZCBmb290ZXIgbGluZXMuIEZvciBzb21lIGFwcGxpY2F0aW9ucwotICAgIChlLmcuIE1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlcikgeW91IG5lZWQgdGhlIGNlcnRpZmljYXRlIGluIHBsYWluIERFUgotICAgIGZvcm1hdC4gWW91IGNhbiBjb252ZXJ0IGEgUEVNIGZpbGUgPGNvZGU+Y2VydC5wZW08L2NvZGU+IGludG8gdGhlCi0gICAgY29ycmVzcG9uZGluZyBERVIgZmlsZSA8Y29kZT5jZXJ0LmRlcjwvY29kZT4gd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6Ci0gICAgPGNvZGU+PHN0cm9uZz4kIG9wZW5zc2wgeDUwOSAtaW4gY2VydC5wZW0gLW91dCBjZXJ0LmRlciAtb3V0Zm9ybSBERVI8L3N0cm9uZz48L2NvZGU+Ci08cD4KLTxsaT48YSBuYW1lPSJUb0MzNyI+PC9hPgotICAgIDxhIG5hbWU9InZlcmlzaWduLWdldGNhIj48L2E+Ci0gICAgPHN0cm9uZyBpZD0iZmFxIj4KLUkgdHJ5IHRvIGluc3RhbGwgYSBWZXJpc2lnbiBjZXJ0aWZpY2F0ZS4gV2h5IGNhbid0IEkgZmluZCBuZWl0aGVyIHRoZQotPGNvZGU+Z2V0Y2E8L2NvZGU+IG5vciA8Y29kZT5nZXR2ZXJpc2lnbjwvY29kZT4gcHJvZ3JhbXMgVmVyaXNpZ24gbWVudGlvbnM/Ci08L3N0cm9uZz4mbmJzcDsmbmJzcDsKLSAgICBbPGEgaHJlZj0iaHR0cDovL3d3dy5tb2Rzc2wub3JnL2RvY3MvMi44L3NzbF9mYXEuaHRtbCN2ZXJpc2lnbi1nZXRjYSI+PGI+TDwvYj48L2E+XQotICAgIDxwPgotICAgIFRoaXMgaXMgYmVjYXVzZSBWZXJpc2lnbiBoYXMgbmV2ZXIgcHJvdmlkZWQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zCi0gICAgZm9yIEFwYWNoZSttb2Rfc3NsLiBSYXRoZXIgdGhleSB0ZWxsIHlvdSB3aGF0IHlvdSBzaG91bGQgZG8KLSAgICBpZiB5b3Ugd2VyZSB1c2luZyBDMk5ldCdzIFN0cm9uZ2hvbGQgKGEgY29tbWVyY2lhbCBBcGFjaGUKLSAgICBiYXNlZCBzZXJ2ZXIgd2l0aCBTU0wgc3VwcG9ydCkuIFRoZSBvbmx5IHRoaW5nIHlvdSBoYXZlIHRvIGRvCi0gICAgaXMgdG8gc2F2ZSB0aGUgY2VydGlmaWNhdGUgaW50byBhIGZpbGUgYW5kIGdpdmUgdGhlIG5hbWUgb2YKLSAgICB0aGF0IGZpbGUgdG8gdGhlIDxjb2RlPlNTTENlcnRpZmljYXRlRmlsZTwvY29kZT4gZGlyZWN0aXZlLgotICAgIFJlbWVtYmVyIHRoYXQgeW91IG5lZWQgdG8gZ2l2ZSB0aGUga2V5IGZpbGUgaW4gYXMgd2VsbCAoc2VlCi0gICAgPGNvZGU+U1NMQ2VydGlmaWNhdGVLZXlGaWxlPC9jb2RlPiBkaXJlY3RpdmUpLiBGb3IgYSBiZXR0ZXIKLSAgICBDQS1yZWxhdGVkIG92ZXJ2aWV3IG9uIFNTTCBjZXJ0aWZpY2F0ZSBmaWRkbGluZyB5b3UgY2FuIGxvb2sgYXQgPGEKLSAgICBocmVmPSJodHRwOi8vd3d3LnRoYXd0ZS5jb20vY2VydHMvc2VydmVyL2tleWdlbi9tb2Rfc3NsLmh0bWwiPgotICAgIFRoYXd0ZSdzIG1vZF9zc2wgaW5zdHJ1Y3Rpb25zPC9hPi4KLTxwPgotPGxpPjxhIG5hbWU9IlRvQzM4Ij48L2E+Ci0gICAgPGEgbmFtZT0iZ2lkIj48L2E+Ci0gICAgPHN0cm9uZyBpZD0iZmFxIj4KLUNhbiBJIHVzZSB0aGUgU2VydmVyIEdhdGVkIENyeXB0b2dyYXBoeSAoU0dDKSBmYWNpbGl0eSAoYWthIFZlcmlzaWduIEdsb2JhbAotSUQpIGFsc28gd2l0aCBtb2Rfc3NsPwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwjZ2lkIj48Yj5MPC9iPjwvYT5dCi0gICAgPHA+Ci0gICAgWWVzLCBtb2Rfc3NsIHNpbmNlIHZlcnNpb24gMi4xIHN1cHBvcnRzIHRoZSBTR0MgZmFjaWxpdHkuIFlvdSBkb24ndCBoYXZlCi0gICAgdG8gY29uZmlndXJlIGFueXRoaW5nIHNwZWNpYWwgZm9yIHRoaXMsIGp1c3QgdXNlIGEgR2xvYmFsIElEIGFzIHlvdXIKLSAgICBzZXJ2ZXIgY2VydGlmaWNhdGUuIFRoZSA8aT5zdGVwIHVwPC9pPiBvZiB0aGUgY2xpZW50cyBhcmUgdGhlbgotICAgIGF1dG9tYXRpY2FsbHkgaGFuZGxlZCBieSBtb2Rfc3NsIHVuZGVyIHJ1bi10aW1lLiBGb3IgZGV0YWlscyBwbGVhc2UgcmVhZAotICAgIHRoZSA8dHQ+UkVBRE1FLkdsb2JhbElEPC90dD4gZG9jdW1lbnQgaW4gdGhlIG1vZF9zc2wgZGlzdHJpYnV0aW9uLgotPHA+Ci08bGk+PGEgbmFtZT0iVG9DMzkiPjwvYT4KLSAgICA8YSBuYW1lPSJnaWQiPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJmYXEiPgotQWZ0ZXIgSSBoYXZlIGluc3RhbGxlZCBteSBuZXcgVmVyaXNpZ24gR2xvYmFsIElEIHNlcnZlciBjZXJ0aWZpY2F0ZSwgdGhlCi1icm93c2VycyBjb21wbGFpbiB0aGF0IHRoZXkgY2Fubm90IHZlcmlmeSB0aGUgc2VydmVyIGNlcnRpZmljYXRlPwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwjZ2lkIj48Yj5MPC9iPjwvYT5dCi0gICAgPHA+Ci0gICAgVGhhdCBpcyBiZWNhdXNlIFZlcmlzaWduIHVzZXMgYW4gaW50ZXJtZWRpYXRlIENBIGNlcnRpZmljYXRlIGJldHdlZW4KLSAgICB0aGUgcm9vdCBDQSBjZXJ0aWZpY2F0ZSAod2hpY2ggaXMgaW5zdGFsbGVkIGluIHRoZSBicm93c2VycykgYW5kCi0gICAgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSAod2hpY2ggeW91IGluc3RhbGxlZCBpbiB0aGUgc2VydmVyKS4gWW91Ci0gICAgc2hvdWxkIGhhdmUgcmVjZWl2ZWQgdGhpcyBhZGRpdGlvbmFsIENBIGNlcnRpZmljYXRlIGZyb20gVmVyaXNpZ24uCi0gICAgSWYgbm90LCBjb21wbGFpbiB0byB0aGVtLiBUaGVuIGNvbmZpZ3VyZSB0aGlzIGNlcnRpZmljYXRlIHdpdGggdGhlCi0gICAgPGNvZGU+U1NMQ2VydGlmaWNhdGVDaGFpbkZpbGU8L2NvZGU+IGRpcmVjdGl2ZSBpbiB0aGUgc2VydmVyLiBUaGlzCi0gICAgbWFrZXMgc3VyZSB0aGUgaW50ZXJtZWRpYXRlIENBIGNlcnRpZmljYXRlIGlzIHNlbmQgdG8gdGhlIGJyb3dzZXIKLSAgICBhbmQgdGhpcyB3YXkgZmlsbHMgdGhlIGdhcCBpbiB0aGUgY2VydGlmaWNhdGUgY2hhaW4uCi08L3VsPgotPHA+Ci08YnI+Ci08aDI+PGEgbmFtZT0iVG9DNDAiPkFib3V0IFNTTCBQcm90b2NvbDwvYT48L2gyPgotPHVsPgotPHA+Ci08bGk+PGEgbmFtZT0iVG9DNDEiPjwvYT4KLSAgICA8YSBuYW1lPSJyYW5kb20tZXJyb3JzIj48L2E+Ci0gICAgPHN0cm9uZyBpZD0iZmFxIj4KLVdoeSBkbyBJIGdldCBsb3RzIG9mIHJhbmRvbSBTU0wgcHJvdG9jb2wgZXJyb3JzIHVuZGVyIGhlYXZ5IHNlcnZlciBsb2FkPwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwjcmFuZG9tLWVycm9ycyI+PGI+TDwvYj48L2E+XQotICAgIDxwPgotICAgIFRoZXJlIGNhbiBiZSBhIG51bWJlciBvZiByZWFzb25zIGZvciB0aGlzLCBidXQgdGhlIG1haW4gb25lCi0gICAgaXMgcHJvYmxlbXMgd2l0aCB0aGUgU1NMIHNlc3Npb24gQ2FjaGUgc3BlY2lmaWVkIGJ5IHRoZQotICAgIDx0dD5TU0xTZXNzaW9uQ2FjaGU8L3R0PiBkaXJlY3RpdmUuIFRoZSBEQk0gc2Vzc2lvbiBjYWNoZSBpcyBtb3N0Ci0gICAgbGlrZWx5IHRoZSBzb3VyY2Ugb2YgdGhlIHByb2JsZW0sIHNvIHRyeWluZyB0aGUgU0hNIHNlc3Npb24gY2FjaGUgb3IKLSAgICBubyBjYWNoZSBhdCBhbGwgbWF5IGhlbHAuCi08cD4KLTxsaT48YSBuYW1lPSJUb0M0MiI+PC9hPgotICAgIDxhIG5hbWU9ImxvYWQiPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJmYXEiPgotV2h5IGhhcyBteSB3ZWJzZXJ2ZXIgYSBoaWdoZXIgbG9hZCBub3cgdGhhdCBJIHJ1biBTU0wgdGhlcmU/Ci08L3N0cm9uZz4mbmJzcDsmbmJzcDsKLSAgICBbPGEgaHJlZj0iaHR0cDovL3d3dy5tb2Rzc2wub3JnL2RvY3MvMi44L3NzbF9mYXEuaHRtbCNsb2FkIj48Yj5MPC9iPjwvYT5dCi0gICAgPHA+Ci0gICAgQmVjYXVzZSBTU0wgdXNlcyBzdHJvbmcgY3J5cHRvZ3JhcGhpYyBlbmNyeXB0aW9uIGFuZCB0aGlzIG5lZWRzIGEgbG90IG9mCi0gICAgbnVtYmVyIGNydW5jaGluZy4gQW5kIGJlY2F1c2Ugd2hlbiB5b3UgcmVxdWVzdCBhIHdlYnBhZ2UgdmlhIEhUVFBTIGV2ZW4KLSAgICB0aGUgaW1hZ2VzIGFyZSB0cmFuc2ZlcmVkIGVuY3J5cHRlZC4gU28sIHdoZW4geW91IGhhdmUgYSBsb3Qgb2YgSFRUUFMKLSAgICB0cmFmZmljIHRoZSBsb2FkIGluY3JlYXNlcy4KLTxwPgotPGxpPjxhIG5hbWU9IlRvQzQzIj48L2E+Ci0gICAgPGEgbmFtZT0icmFuZG9tIj48L2E+Ci0gICAgPHN0cm9uZyBpZD0iZmFxIj4KLU9mdGVuIEhUVFBTIGNvbm5lY3Rpb25zIHRvIG15IHNlcnZlciByZXF1aXJlIHVwIHRvIDMwIHNlY29uZHMgZm9yIGVzdGFibGlzaGluZwotdGhlIGNvbm5lY3Rpb24sIGFsdGhvdWdoIHNvbWV0aW1lcyBpdCB3b3JrcyBmYXN0ZXI/Ci08L3N0cm9uZz4mbmJzcDsmbmJzcDsKLSAgICBbPGEgaHJlZj0iaHR0cDovL3d3dy5tb2Rzc2wub3JnL2RvY3MvMi44L3NzbF9mYXEuaHRtbCNyYW5kb20iPjxiPkw8L2I+PC9hPl0KLSAgICA8cD4KLSAgICBVc3VhbGx5IHRoaXMgaXMgY2F1c2VkIGJ5IHVzaW5nIGEgPGNvZGU+L2Rldi9yYW5kb208L2NvZGU+IGRldmljZSBmb3IKLSAgICA8Y29kZT5TU0xSYW5kb21TZWVkPC9jb2RlPiB3aGljaCBpcyBibG9ja2luZyBpbiByZWFkKDIpIGNhbGxzIGlmIG5vdAotICAgIGVub3VnaCBlbnRyb3B5IGlzIGF2YWlsYWJsZS4gUmVhZCBtb3JlIGFib3V0IHRoaXMgcHJvYmxlbSBpbiB0aGUgcmVmZXJuY2UKLSAgICBjaGFwdGVyIHVuZGVyIDxjb2RlPlNTTFJhbmRvbVNlZWQ8L2NvZGU+LgotPHA+Ci08bGk+PGEgbmFtZT0iVG9DNDQiPjwvYT4KLSAgICA8YSBuYW1lPSJjaXBoZXJzIj48L2E+Ci0gICAgPHN0cm9uZyBpZD0iZmFxIj4KLVdoYXQgU1NMIENpcGhlcnMgYXJlIHN1cHBvcnRlZCBieSBtb2Rfc3NsPwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwjY2lwaGVycyI+PGI+TDwvYj48L2E+XQotICAgIDxwPgotICAgIFVzdWFsbHkganVzdCBhbGwgU1NMIGNpcGhlcnMgd2hpY2ggYXJlIHN1cHBvcnRlZCBieSB0aGUKLSAgICB2ZXJzaW9uIG9mIE9wZW5TU0wgaW4gdXNlIChjYW4gZGVwZW5kIG9uIHRoZSB3YXkgeW91IGJ1aWx0Ci0gICAgT3BlblNTTCkuIFR5cGljYWxseSB0aGlzIGF0IGxlYXN0IGluY2x1ZGVzIHRoZSBmb2xsb3dpbmc6Ci0gICAgPHA+Ci0gICAgPHVsPgotICAgIDxsaT5SQzQgd2l0aCBNRDUKLSAgICA8bGk+UkM0IHdpdGggTUQ1IChleHBvcnQgdmVyc2lvbiByZXN0cmljdGVkIHRvIDQwLWJpdCBrZXkpCi0gICAgPGxpPlJDMiB3aXRoIE1ENQotICAgIDxsaT5SQzIgd2l0aCBNRDUgKGV4cG9ydCB2ZXJzaW9uIHJlc3RyaWN0ZWQgdG8gNDAtYml0IGtleSkKLSAgICA8bGk+SURFQSB3aXRoIE1ENQotICAgIDxsaT5ERVMgd2l0aCBNRDUKLSAgICA8bGk+VHJpcGxlLURFUyB3aXRoIE1ENQotICAgIDwvdWw+Ci0gICAgPHA+Ci0gICAgVG8gZGV0ZXJtaW5lIHRoZSBhY3R1YWwgbGlzdCBvZiBzdXBwb3J0ZWQgY2lwaGVycyB5b3UgY2FuCi0gICAgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKLSAgICA8cD4KLSAgICA8Y29kZT48c3Ryb25nPiQgb3BlbnNzbCBjaXBoZXJzIC12PC9zdHJvbmc+PC9jb2RlPjxicj4KLTxwPgotPGxpPjxhIG5hbWU9IlRvQzQ1Ij48L2E+Ci0gICAgPGEgbmFtZT0iY2lwaGVyLWFkaCI+PC9hPgotICAgIDxzdHJvbmcgaWQ9ImZhcSI+Ci1JIHdhbnQgdG8gdXNlIEFub255bW91cyBEaWZmaWUtSGVsbG1hbiAoQURIKSBjaXBoZXJzLCBidXQgSSBhbHdheXMgZ2V0IGBgbm8KLXNoYXJlZCBjaXBoZXInJyBlcnJvcnM/Ci08L3N0cm9uZz4mbmJzcDsmbmJzcDsKLSAgICBbPGEgaHJlZj0iaHR0cDovL3d3dy5tb2Rzc2wub3JnL2RvY3MvMi44L3NzbF9mYXEuaHRtbCNjaXBoZXItYWRoIj48Yj5MPC9iPjwvYT5dCi0gICAgPHA+Ci0gICAgSW4gb3JkZXIgdG8gdXNlIEFub255bW91cyBEaWZmaWUtSGVsbG1hbiAoQURIKSBjaXBoZXJzLCBpdCBpcyBub3QgZW5vdWdoCi0gICAgdG8ganVzdCBwdXQgYGA8Y29kZT5BREg8L2NvZGU+JycgaW50byB5b3VyIDxjb2RlPlNTTENpcGhlclN1aXRlPC9jb2RlPi4KLSAgICBBZGRpdGlvbmFsbHkgeW91IGhhdmUgdG8gYnVpbGQgT3BlblNTTCB3aXRoCi0gICAgYGA8Y29kZT4tRFNTTF9BTExPV19BREg8L2NvZGU+JycuIEJlY2F1c2UgcGVyIGRlZmF1bHQgT3BlblNTTCBkb2VzIG5vdAotICAgIGFsbG93IEFESCBjaXBoZXJzIGZvciBzZWN1cml0eSByZWFzb25zLiBTbyBpZiB5b3UgYXJlIGFjdHVhbGx5IGVuYWJsaW5nCi0gICAgdGhlc2UgY2lwaGVycyBtYWtlIHN1cmUgeW91IGFyZSBpbmZvcm1lZCBhYm91dCB0aGUgc2lkZS1lZmZlY3RzLgotPHA+Ci08bGk+PGEgbmFtZT0iVG9DNDYiPjwvYT4KLSAgICA8YSBuYW1lPSJjaXBoZXItc2hhcmVkIj48L2E+Ci0gICAgPHN0cm9uZyBpZD0iZmFxIj4KLUkgYWx3YXlzIGp1c3QgZ2V0IGEgJ25vIHNoYXJlZCBjaXBoZXJzJyBlcnJvciBpZgotSSB0cnkgdG8gY29ubmVjdCB0byBteSBmcmVzaGx5IGluc3RhbGxlZCBzZXJ2ZXI/Ci08L3N0cm9uZz4mbmJzcDsmbmJzcDsKLSAgICBbPGEgaHJlZj0iaHR0cDovL3d3dy5tb2Rzc2wub3JnL2RvY3MvMi44L3NzbF9mYXEuaHRtbCNjaXBoZXItc2hhcmVkIj48Yj5MPC9iPjwvYT5dCi0gICAgPHA+Ci0gICAgRWl0aGVyIHlvdSBoYXZlIG1lc3NlZCB1cCB5b3VyIDxjb2RlPlNTTENpcGhlclN1aXRlPC9jb2RlPgotICAgIGRpcmVjdGl2ZSAoY29tcGFyZSBpdCB3aXRoIHRoZSBwcmUtY29uZmlndXJlZCBleGFtcGxlIGluCi0gICAgPGNvZGU+aHR0cGQuY29uZi1kaXN0PC9jb2RlPikgb3IgeW91IGhhdmUgY2hvb3NlbiB0aGUgRFNBL0RICi0gICAgYWxnb3JpdGhtcyBpbnN0ZWFkIG9mIFJTQSB1bmRlciAiPGNvZGU+bWFrZSBjZXJ0aWZpY2F0ZTwvY29kZT4iCi0gICAgYW5kIGlnbm9yZWQgb3Igb3ZlcnNlZW4gdGhlIHdhcm5pbmdzLiBCZWNhdXNlIGlmIHlvdSBoYXZlIGNob29zZW4KLSAgICBEU0EvREgsIHRoZW4geW91ciBzZXJ2ZXIgbm8gbG9uZ2VyIHNwZWFrcyBSU0EtYmFzZWQgU1NMIGNpcGhlcnMKLSAgICAoYXQgbGVhc3Qgbm90IHVudGlsIHlvdSBhbHNvIGNvbmZpZ3VyZSBhbiBhZGRpdGlvbmFsIFJTQS1iYXNlZAotICAgIGNlcnRpZmljYXRlL2tleSBwYWlyKS4gQnV0IGN1cnJlbnQgYnJvd3NlcnMgbGlrZSBOUyBvciBJRSBvbmx5IHNwZWFrCi0gICAgUlNBIGNpcGhlcnMuIFRoZSByZXN1bHQgaXMgdGhlICJubyBzaGFyZWQgY2lwaGVycyIgZXJyb3IuIFRvIGZpeAotICAgIHRoaXMsIHJlZ2VuZXJhdGUgeW91ciBzZXJ2ZXIgY2VydGlmaWNhdGUva2V5IHBhaXIgYW5kIHRoaXMgdGltZQotICAgIGNob29zZSB0aGUgUlNBIGFsZ29yaXRobS4KLTxwPgotPGxpPjxhIG5hbWU9IlRvQzQ3Ij48L2E+Ci0gICAgPGEgbmFtZT0idmhvc3RzIj48L2E+Ci0gICAgPHN0cm9uZyBpZD0iZmFxIj4KLVdoeSBjYW4ndCBJIHVzZSBTU0wgd2l0aCBuYW1lLWJhc2VkL25vbi1JUC1iYXNlZCB2aXJ0dWFsIGhvc3RzPwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwjdmhvc3RzIj48Yj5MPC9iPjwvYT5dCi0gICAgPHA+Ci0gICAgVGhlIHJlYXNvbiBpcyB2ZXJ5IHRlY2huaWNhbC4gQWN0dWFsbHkgaXQncyBzb21lIHNvcnQgb2YgYSBjaGlja2VuIGFuZAotICAgIGVnZyBwcm9ibGVtOiBUaGUgU1NMIHByb3RvY29sIGxheWVyIHN0YXlzIGJlbG93IHRoZSBIVFRQIHByb3RvY29sIGxheWVyCi0gICAgYW5kIGVuY2Fwc3VsYXRlcyBIVFRQLiBXaGVuIGFuIFNTTCBjb25uZWN0aW9uIChIVFRQUykgaXMgZXN0YWJsaXNoZWQKLSAgICBBcGFjaGUvbW9kX3NzbCBoYXMgdG8gbmVnb3RpYXRlIHRoZSBTU0wgcHJvdG9jb2wgcGFyYW1ldGVycyB3aXRoIHRoZQotICAgIGNsaWVudC4gRm9yIHRoaXMgbW9kX3NzbCBoYXMgdG8gY29uc3VsdCB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgdmlydHVhbAotICAgIHNlcnZlciAoZm9yIGluc3RhbmNlIGl0IGhhcyB0byBsb29rIGZvciB0aGUgY2lwaGVyIHN1aXRlLCB0aGUgc2VydmVyCi0gICAgY2VydGlmaWNhdGUsIGV0Yy4pLiBCdXQgaW4gb3JkZXIgdG8gZGlzcGF0Y2ggdG8gdGhlIGNvcnJlY3QgdmlydHVhbCBzZXJ2ZXIKLSAgICBBcGFjaGUgaGFzIHRvIGtub3cgdGhlIDxjb2RlPkhvc3Q8L2NvZGU+IEhUVFAgaGVhZGVyIGZpZWxkLiBGb3IgdGhpcyB0aGUKLSAgICBIVFRQIHJlcXVlc3QgaGVhZGVyIGhhcyB0byBiZSByZWFkLiBUaGlzIGNhbm5vdCBiZSBkb25lIGJlZm9yZSB0aGUgU1NMCi0gICAgaGFuZHNoYWtlIGlzIGZpbmlzaGVkLiBCdXQgdGhlIGluZm9ybWF0aW9uIGlzIGFscmVhZHkgbmVlZGVkIGF0IHRoZSBTU0wKLSAgICBoYW5kc2hha2UgcGhhc2UuIEJpbmdvIQotPHA+Ci08bGk+PGEgbmFtZT0iVG9DNDgiPjwvYT4KLSAgICA8YSBuYW1lPSJsb2NrLWljb24iPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJmYXEiPgotV2hlbiBJIHVzZSBCYXNpYyBBdXRoZW50aWNhdGlvbiBvdmVyIEhUVFBTIHRoZSBsb2NrIGljb24gaW4gTmV0c2NhcGUgYnJvd3NlcnMKLXN0aWxsIHNob3cgdGhlIHVubG9ja2VkIHN0YXRlIHdoZW4gdGhlIGRpYWxvZyBwb3BzIHVwLiBEb2VzIHRoaXMgbWVhbiB0aGUKLXVzZXJuYW1lL3Bhc3N3b3JkIGlzIHN0aWxsIHRyYW5zbWl0dGVkIHVuZW5jcnlwdGVkPwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwjbG9jay1pY29uIj48Yj5MPC9iPjwvYT5dCi0gICAgPHA+Ci0gICAgTm8sIHRoZSB1c2VybmFtZS9wYXNzd29yZCBpcyBhbHJlYWR5IHRyYW5zbWl0dGVkIGVuY3J5cHRlZC4gVGhlIGljb24gaW4KLSAgICBOZXRzY2FwZSBicm93c2VycyBpcyBqdXN0IG5vdCByZWFsbHkgc3luY2hyb25pemVkIHdpdGggdGhlIFNTTC9UTFMgbGF5ZXIKLSAgICAoaXQgdG9nZ2xlcyB0byB0aGUgbG9ja2VkIHN0YXRlIHdoZW4gdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGFjdHVhbCB3ZWJwYWdlCi0gICAgZGF0YSBpcyB0cmFuc2ZlcnJlZCB3aGljaCBpcyBub3QgcXVpdGUgY29ycmVjdCkgYW5kIHRoaXMgd2F5IGNvbmZ1c2VzCi0gICAgcGVvcGxlLiBUaGUgQmFzaWMgQXV0aGVudGljYXRpb24gZmFjaWxpdHkgaXMgcGFydCBvZiB0aGUgSFRUUCBsYXllciBhbmQKLSAgICB0aGlzIGxheWVyIGlzIGFib3ZlIHRoZSBTU0wvVExTIGxheWVyIGluIEhUVFBTLiBBbmQgYmVmb3JlIGFueSBIVFRQIGRhdGEKLSAgICBjb21tdW5pY2F0aW9uIHRha2VzIHBsYWNlIGluIEhUVFBTIHRoZSBTU0wvVExTIGxheWVyIGhhcyBhbHJlYWR5IGRvbmUgdGhlCi0gICAgaGFuZHNoYWtlIHBoYXNlIGFuZCBzd2l0Y2hlZCB0byBlbmNyeXB0ZWQgY29tbXVuaWNhdGlvbi4gU28sIGRvbid0IGdldAotICAgIGNvbmZ1c2VkIGJ5IHRoaXMgaWNvbi4KLTxwPgotPGxpPjxhIG5hbWU9IlRvQzQ5Ij48L2E+Ci0gICAgPGEgbmFtZT0iaW8taWUiPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJmYXEiPgotV2hlbiBJIGNvbm5lY3QgdmlhIEhUVFBTIHRvIGFuIEFwYWNoZSttb2Rfc3NsK09wZW5TU0wgc2VydmVyIHdpdGggTWljcm9zb2Z0IEludGVybmV0Ci1FeHBsb3JlciAoTVNJRSkgSSBnZXQgdmFyaW91cyBJL08gZXJyb3JzLiBXaGF0IGlzIHRoZSByZWFzb24/Ci08L3N0cm9uZz4mbmJzcDsmbmJzcDsKLSAgICBbPGEgaHJlZj0iaHR0cDovL3d3dy5tb2Rzc2wub3JnL2RvY3MvMi44L3NzbF9mYXEuaHRtbCNpby1pZSI+PGI+TDwvYj48L2E+XQotICAgIDxwPgotICAgIFRoZSBmaXJzdCByZWFzb24gaXMgdGhhdCB0aGUgU1NMIGltcGxlbWVudGF0aW9uIGluIHNvbWUgTVNJRSB2ZXJzaW9ucyBoYXMKLSAgICBzb21lIHN1YnRsZSBidWdzIHJlbGF0ZWQgdG8gdGhlIEhUVFAga2VlcC1hbGl2ZSBmYWNpbGl0eSBhbmQgdGhlIFNTTCBjbG9zZQotICAgIG5vdGlmeSBhbGVydHMgb24gc29ja2V0IGNvbm5lY3Rpb24gY2xvc2UuIEFkZGl0aW9uYWxseSB0aGUgaW50ZXJhY3Rpb24KLSAgICBiZXR3ZWVuIFNTTCBhbmQgSFRUUC8xLjEgZmVhdHVyZXMgYXJlIHByb2JsZW1hdGljIHdpdGggc29tZSBNU0lFIHZlcnNpb25zLAotICAgIHRvby4gWW91J3ZlIHRvIHdvcmstYXJvdW5kIHRoZXNlIHByb2JsZW1zIGJ5IGZvcmNpbmcKLSAgICBBcGFjaGUrbW9kX3NzbCtPcGVuU1NMIHRvIG5vdCB1c2UgSFRUUC8xLjEsIGtlZXAtYWxpdmUgY29ubmVjdGlvbnMgb3IKLSAgICBzZW5kaW5nIHRoZSBTU0wgY2xvc2Ugbm90aWZ5IG1lc3NhZ2VzIHRvIE1TSUUgY2xpZW50cy4gVGhpcyBjYW4gYmUgZG9uZSBieQotICAgIHVzaW5nIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlIGluIHlvdXIgU1NMLWF3YXJlIHZpcnR1YWwgaG9zdCBzZWN0aW9uOgotICAgIDxwcmU+Ci0gICAgU2V0RW52SWYgVXNlci1BZ2VudCAiLipNU0lFLioiIFwKLSAgICAgICAgICAgICA8Yj5ub2tlZXBhbGl2ZSBzc2wtdW5jbGVhbi1zaHV0ZG93biBcCi0gICAgICAgICAgICAgZG93bmdyYWRlLTEuMCBmb3JjZS1yZXNwb25zZS0xLjA8L2I+PC9wcmU+Ci0gICAgQWRkaXRpb25hbGx5IGl0IGlzIGtub3duIHNvbWUgTVNJRSB2ZXJzaW9ucyBoYXZlIGFsc28gcHJvYmxlbXMKLSAgICB3aXRoIHBhcnRpY3VsYXIgY2lwaGVycy4gVW5mb3J0dW5hdGVseSBvbmUgY2Fubm90IHdvcmthcm91bmQgdGhlc2UKLSAgICBidWdzIG9ubHkgZm9yIHRob3NlIE1TSUUgcGFydGljdWxhciBjbGllbnRzLCBiZWNhdXNlIHRoZSBjaXBoZXJzCi0gICAgYXJlIGFscmVhZHkgdXNlZCBpbiB0aGUgU1NMIGhhbmRzaGFrZSBwaGFzZS4gU28gYSBNU0lFLXNwZWNpZmljCi0gICAgPHR0PlNldEVudklmPC90dD4gZG9lc24ndCB3b3JrIHRvIHNvbHZlIHRoZXNlIHByb2JsZW1zLiBJbnN0ZWFkIG9uZQotICAgIGhhcyB0byBkbyBtb3JlIGRyYXN0aWMgYWRqdXN0bWVudHMgdG8gdGhlIGdsb2JhbCBwYXJhbWV0ZXJzLiBCdXQKLSAgICBiZWZvcmUgeW91IGRlY2lkZSB0byBkbyB0aGlzLCBtYWtlIHN1cmUgeW91ciBjbGllbnRzIHJlYWxseSBoYXZlCi0gICAgcHJvYmxlbXMuIElmIG5vdCwgZG8gbm90IGRvIHRoaXMsIGJlY2F1c2UgaXQgYWZmZWN0cyBhbGwoISkgeW91cgotICAgIGNsaWVudHMsIGkuZS4sIGFsc28geW91ciBub24tTVNJRSBjbGllbnRzLgotICAgIDxwPgotICAgIFRoZSBuZXh0IHByb2JsZW0gaXMgdGhhdCA1NmJpdCBleHBvcnQgdmVyc2lvbnMgb2YgTVNJRSA1LnggYnJvd3NlcnMgaGF2ZSBhCi0gICAgYnJva2VuIFNTTHYzIGltcGxlbWVudGF0aW9uIHdoaWNoIGJhZGx5IGludGVyYWN0cyB3aXRoIE9wZW5TU0wgdmVyc2lvbnMKLSAgICBncmVhdGVyIHRoYW4gMC45LjQuIFlvdSBjYW4gZWl0aGVyIGFjY2VwdCB0aGlzIGFuZCBmb3JjZSB5b3VyIGNsaWVudHMgdG8KLSAgICB1cGdyYWRlIHRoZWlyIGJyb3dzZXJzLCBvciB5b3UgZG93bmdyYWRlIHRvIE9wZW5TU0wgMC45LjQgKGhtbW0pLCBvciB5b3UKLSAgICBjYW4gZGVjaWRlIHRvIHdvcmthcm91bmQgaXQgYnkgYWNjZXB0aW5nIHRoZSBkcmF3YmFjayB0aGF0IHlvdXIgd29ya2Fyb3VuZAotICAgIHdpbGwgaG9ycmlibHkgYWZmZWN0IGFsc28gb3RoZXIgYnJvd3NlcnM6Ci0gICAgPHByZT4KLSAgICBTU0xQcm90b2NvbCBhbGwgPGI+LVNTTHYzPC9iPjwvcHJlPgotICAgIFRoaXMgY29tcGxldGVseSBkaXNhYmxlcyB0aGUgU1NMdjMgcHJvdG9jb2wgYW5kIGxldHMgdGhvc2UgYnJvd3NlcnMgd29yay4KLSAgICBCdXQgdXN1YWxseSB0aGlzIGlzIGFuIGV2ZW4gbGVzcyBhY2NlcHRhYmxlIHdvcmthcm91bmQuIEEgbW9yZSByZWFzb25hYmxlCi0gICAgd29ya2Fyb3VuZCBpcyB0byBhZGRyZXNzIHRoZSBwcm9ibGVtIG1vcmUgY2xvc2VseSBhbmQgZGlzYWJsZSBvbmx5IHRoZQotICAgIGNpcGhlcnMgd2hpY2ggY2F1c2UgdHJvdWJsZS4KLSAgICA8cHJlPgotICAgIFNTTENpcGhlclN1aXRlIEFMTDohQURIOjxiPiFFWFBPUlQ1NjwvYj46UkM0K1JTQTorSElHSDorTUVESVVNOitMT1c6K1NTTHYyOitFWFA8L3ByZT4KLSAgICBUaGlzIGFsc28gbGV0cyB0aGUgYnJva2VuIE1TSUUgdmVyc2lvbnMgd29yaywgYnV0IG9ubHkgcmVtb3ZlcyB0aGUKLSAgICBuZXdlciA1NmJpdCBUTFMgY2lwaGVycy4KLSAgICA8cD4KLSAgICBBbm90aGVyIHByb2JsZW0gd2l0aCBNU0lFIDUueCBjbGllbnRzIGlzIHRoYXQgdGhleSByZWZ1c2UgdG8gY29ubmVjdCB0bwotICAgIFVSTHMgb2YgdGhlIGZvcm0gPHR0Pmh0dHBzOi8vMTIuMzQuNTYuNzgvPC90dD4gKElQLWFkZHJlc3NlcyBhcmUgdXNlZAotICAgIGluc3RlYWQgb2YgdGhlIGhvc3RuYW1lKSwgaWYgdGhlIHNlcnZlciBpcyB1c2luZyB0aGUgU2VydmVyIEdhdGVkCi0gICAgQ3J5cHRvZ3JhcGh5IChTR0MpIGZhY2lsaXR5LiBUaGlzIGNhbiBvbmx5IGJlIGF2b2lkZWQgYnkgdXNpbmcgdGhlIGZ1bGx5Ci0gICAgcXVhbGlmaWVkIGRvbWFpbiBuYW1lIChGUUROKSBvZiB0aGUgd2Vic2l0ZSBpbiBoeXBlcmxpbmtzIGluc3RlYWQsIGJlY2F1c2UKLSAgICBNU0lFIDUueCBoYXMgYW4gZXJyb3IgaW4gdGhlIHdheSBpdCBoYW5kbGVzIHRoZSBTR0MgbmVnb3RpYXRpb24uCi0gICAgPHA+Ci0gICAgQW5kIGZpbmFsbHkgdGhlcmUgYXJlIHZlcnNpb25zIG9mIE1TSUUgd2hpY2ggc2VlbSB0byByZXF1aXJlIHRoYXQKLSAgICBhbiBTU0wgc2Vzc2lvbiBjYW4gYmUgcmV1c2VkIChhIHRvdGFsbHkgbm9uIHN0YW5kYXJkLWNvbmZvcm1pbmcKLSAgICBiZWhhdmlvdXIsIG9mIGNvdXJzZSkuIENvbm5lY3Rpb24gd2l0aCB0aG9zZSBNU0lFIHZlcnNpb25zIG9ubHkgd29yawotICAgIGlmIGEgU1NMIHNlc3Npb24gY2FjaGUgaXMgdXNlZC4gU28sIGFzIGEgd29yay1hcm91bmQsIG1ha2Ugc3VyZSB5b3UKLSAgICBhcmUgdXNpbmcgYSBzZXNzaW9uIGNhY2hlIChzZWUgPHR0PlNTTFNlc3Npb25DYWNoZTwvdHQ+IGRpcmVjdGl2ZSkuCi08cD4KLTxsaT48YSBuYW1lPSJUb0M1MCI+PC9hPgotICAgIDxhIG5hbWU9ImlvLW5zIj48L2E+Ci0gICAgPHN0cm9uZyBpZD0iZmFxIj4KLVdoZW4gSSBjb25uZWN0IHZpYSBIVFRQUyB0byBhbiBBcGFjaGUrbW9kX3NzbCBzZXJ2ZXIgd2l0aCBOZXRzY2FwZSBOYXZpZ2F0b3IgSQotZ2V0IEkvTyBlcnJvcnMgYW5kIHRoZSBtZXNzYWdlICJOZXRzY2FwZSBoYXMgZW5jb3VudGVyZWQgYmFkIGRhdGEgZnJvbSB0aGUKLXNlcnZlciIgV2hhdCdzIHRoZSByZWFzb24/Ci08L3N0cm9uZz4mbmJzcDsmbmJzcDsKLSAgICBbPGEgaHJlZj0iaHR0cDovL3d3dy5tb2Rzc2wub3JnL2RvY3MvMi44L3NzbF9mYXEuaHRtbCNpby1ucyI+PGI+TDwvYj48L2E+XQotICAgIDxwPgotICAgIFRoZSBwcm9ibGVtIHVzdWFsbHkgaXMgdGhhdCB5b3UgaGFkIGNyZWF0ZWQgYSBuZXcgc2VydmVyIGNlcnRpZmljYXRlIHdpdGgKLSAgICB0aGUgc2FtZSBETiwgYnV0IHlvdSBoYWQgdG9sZCB5b3VyIGJyb3dzZXIgdG8gYWNjZXB0IGZvcmV2ZXIgdGhlIG9sZAotICAgIHNlcnZlciBjZXJ0aWZpY2F0ZS4gT25jZSB5b3UgY2xlYXIgdGhlIGVudHJ5IGluIHlvdXIgYnJvd3NlciBmb3IgdGhlIG9sZAotICAgIGNlcnRpZmljYXRlLCBldmVyeXRoaW5nIHVzdWFsbHkgd2lsbCB3b3JrIGZpbmUuIE5ldHNjYXBlJ3MgU1NMCi0gICAgaW1wbGVtZW50YXRpb24gaXMgY29ycmVjdCwgc28gd2hlbiB5b3UgZW5jb3VudGVyIEkvTyBlcnJvcnMgd2l0aCBOZXRzY2FwZQotICAgIE5hdmlnYXRvciBpdCBpcyBtb3N0IG9mIHRoZSB0aW1lIGNhdXNlZCBieSB0aGUgY29uZmlndXJlZCBjZXJ0aWZpY2F0ZXMuCi08L3VsPgotPHA+Ci08YnI+Ci08aDI+PGEgbmFtZT0iVG9DNTEiPkFib3V0IFN1cHBvcnQ8L2E+PC9oMj4KLTx1bD4KLTxwPgotPGxpPjxhIG5hbWU9IlRvQzUyIj48L2E+Ci0gICAgPGEgbmFtZT0icmVzb3VyY2VzIj48L2E+Ci0gICAgPHN0cm9uZyBpZD0iZmFxIj4KLVdoYXQgaW5mb3JtYXRpb24gcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUgaW4gY2FzZSBvZiBtb2Rfc3NsIHByb2JsZW1zPwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwjcmVzb3VyY2VzIj48Yj5MPC9iPjwvYT5dCi0gICAgPHA+Ci1UaGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIHJlc291cmNlcyBhcmUgYXZhaWxhYmxlLgotSW4gY2FzZSBvZiBwcm9ibGVtcyB5b3Ugc2hvdWxkIHNlYXJjaCBoZXJlIGZpcnN0LgotPHA+Ci08b2w+Ci08bGk+PGVtPkFuc3dlcnMgaW4gdGhlIFVzZXIgTWFudWFsJ3MgRi5BLlEuIExpc3QgKHRoaXMpPC9lbT48YnI+Ci0gICAgPGEgaHJlZj0iaHR0cDovL3d3dy5tb2Rzc2wub3JnL2RvY3MvMi44L3NzbF9mYXEuaHRtbCI+Ci0gICAgaHR0cDovL3d3dy5tb2Rzc2wub3JnL2RvY3MvMi44L3NzbF9mYXEuaHRtbDwvYT48YnI+Ci0gICAgRmlyc3QgbG9vayBpbnNpZGUgdGhlIEYuQS5RLiAodGhpcyB0ZXh0KSwgcGVyaGFwcyB5b3VyIHByb2JsZW0gaXMgc3VjaAotICAgIHBvcHVsYXIgdGhhdCBpdCB3YXMgYWxyZWFkeSBhbnN3ZXJlZCBhIGxvdCBvZiB0aW1lcyBpbiB0aGUgcGFzdC4KLTxwPgotPGxpPjxlbT5Qb3N0aW5ncyBmcm9tIHRoZSBtb2Rzc2wtdXNlcnMgU3VwcG9ydCBNYWlsaW5nIExpc3Q8L2VtPgotICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9zdXBwb3J0LyI+Ci0gICAgaHR0cDovL3d3dy5tb2Rzc2wub3JnL3N1cHBvcnQvPC9hPjxicj4KLSAgICBTZWNvbmQgc2VhcmNoIGZvciB5b3VyIHByb2JsZW0gaW4gb25lIG9mIHRoZSBleGlzdGluZyBhcmNoaXZlcyBvZiB0aGUKLSAgICBtb2Rzc2wtdXNlcnMgbWFpbGluZyBsaXN0LiBQZXJoYXBzIHlvdXIgcHJvYmxlbSBwb3BwZWQgdXAgYXQgbGVhc3Qgb25jZSBmb3IKLSAgICBhbm90aGVyIHVzZXIsIHRvby4KLTxwPgotPGxpPjxlbT5Qcm9ibGVtIFJlcG9ydHMgaW4gdGhlIEJ1ZyBEYXRhYmFzZTwvZW0+Ci0gICAgPGEgaHJlZj0iaHR0cDovL3d3dy5tb2Rzc2wub3JnL3N1cHBvcnQvYnVnZGIvIj4KLSAgICBodHRwOi8vd3d3Lm1vZHNzbC5vcmcvc3VwcG9ydC9idWdkYi88L2E+PGJyPgotICAgIFRoaXJkIGxvb2sgaW5zaWRlIHRoZSBtb2Rfc3NsIEJ1ZyBEYXRhYmFzZS4gUGVyaGFwcwotICAgIHNvbWVvbmUgZWxzZSBhbHJlYWR5IGhhcyByZXBvcnRlZCB0aGUgcHJvYmxlbS4KLTwvb2w+Ci08cD4KLTxsaT48YSBuYW1lPSJUb0M1MyI+PC9hPgotICAgIDxhIG5hbWU9ImNvbnRhY3QiPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJmYXEiPgotV2hhdCBzdXBwb3J0IGNvbnRhY3RzIGFyZSBhdmFpbGFibGUgaW4gY2FzZSBvZiBtb2Rfc3NsIHByb2JsZW1zPwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfZmFxLmh0bWwjY29udGFjdCI+PGI+TDwvYj48L2E+XQotICAgIDxwPgotVGhlIGZvbGxvd2luZyBsaXN0cyBhbGwgc3VwcG9ydCBwb3NzaWJpbGl0aWVzIGZvciBtb2Rfc3NsLCBpbiBvcmRlciBvZgotcHJlZmVyZW5jZSwgaS5lLiBzdGFydCBpbiB0aGlzIG9yZGVyIGFuZCBkbyBub3QgcGljayB0aGUgc3VwcG9ydCBwb3NzaWJpbGl0eQoteW91IGp1c3QgbGlrZSBtb3N0LCBwbGVhc2UuCi08cD4KLTxvbD4KLTxsaT48ZW0+V3JpdGUgYSBQcm9ibGVtIFJlcG9ydCBpbnRvIHRoZSBCdWcgRGF0YWJhc2U8L2VtPjxicj4KLSAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm1vZHNzbC5vcmcvc3VwcG9ydC9idWdkYi8iPgotICAgIGh0dHA6Ly93d3cubW9kc3NsLm9yZy9zdXBwb3J0L2J1Z2RiLzwvYT48YnI+Ci0gICAgVGhpcyBpcyB0aGUgcHJlZmVycmVkIHdheSBvZiBzdWJtaXR0aW5nIHlvdXIgcHJvYmxlbSByZXBvcnQsIGJlY2F1c2UgdGhpcwotICAgIHdheSBpdCBnZXRzIGZpbGVkIGludG8gdGhlIGJ1ZyBkYXRhYmFzZSAoaXQgY2Fubm90IGJlIGxvc3QpIDxlbT5hbmQ8L2VtPgotICAgIHNlbmQgdG8gdGhlIG1vZHNzbC11c2VycyBtYWlsaW5nIGxpc3QgKG90aGVycyBzZWUgdGhlIGN1cnJlbnQgcHJvYmxlbXMgYW5kCi0gICAgbGVhcm4gZnJvbSBhbnN3ZXJzKS4KLTxwPgotPGxpPjxlbT5Xcml0ZSBhIFByb2JsZW0gUmVwb3J0IHRvIHRoZSBtb2Rzc2wtdXNlcnMgU3VwcG9ydCBNYWlsaW5nIExpc3Q8L2VtPjxicj4KLSAgICA8YSBocmVmPSJtYWlsdG86bW9kc3NsLXVzZXJzQG1vZHNzbC5vcmciPgotICAgIG1vZHNzbC11c2VycyZuYnNwO0AmbmJzcDttb2Rzc2wub3JnPC9hPjxicj4KLSAgICBUaGlzIGlzIHRoZSBzZWNvbmQgd2F5IG9mIHN1Ym1pdHRpbmcgeW91ciBwcm9ibGVtIHJlcG9ydC4gWW91IGhhdmUgdG8KLSAgICBzdWJzY3JpYmUgdG8gdGhlIGxpc3QgZmlyc3QsIGJ1dCB0aGVuIHlvdSBjYW4gZWFzaWx5IGRpc2N1c3MgeW91ciBwcm9ibGVtCi0gICAgd2l0aCBib3RoIHRoZSBhdXRob3IgYW5kIHRoZSB3aG9sZSBtb2Rfc3NsIHVzZXIgY29tbXVuaXR5LgotPHA+Ci08bGk+PGVtPldyaXRlIGEgUHJvYmxlbSBSZXBvcnQgdG8gdGhlIGF1dGhvcjwvZW0+PGJyPgotICAgIDxhIGhyZWY9Im1haWx0bzpyc2VAZW5nZWxzY2hhbGwuY29tIj4KLSAgICByc2UmbmJzcDtAJm5ic3A7ZW5nZWxzY2hhbGwuY29tPC9hPjxicj4KLSAgICBUaGlzIGlzIHRoZSBsYXN0IHdheSBvZiBzdWJtaXR0aW5nIHlvdXIgcHJvYmxlbSByZXBvcnQuIFBsZWFzZSBhdm9pZCB0aGlzCi0gICAgaW4geW91ciBvd24gaW50ZXJlc3QgYmVjYXVzZSB0aGUgYXV0aG9yIGlzIHJlYWxseSBhIHZlcnkgYnVzeSBtZW4uIFlvdXIKLSAgICBtYWlsIHdpbGwgYWx3YXlzIGJlIGZpbGVkIHRvIG9uZSBvZiBoaXMgdmFyaW91cyBtYWlsLWZvbGRlcnMgYW5kIGlzCi0gICAgdXN1YWxseSBub3QgcHJvY2Vzc2VkIGFzIGZhc3QgYXMgYSBwb3N0aW5nIG9uIG1vZHNzbC11c2Vycy4KLTwvb2w+Ci08cD4KLTxsaT48YSBuYW1lPSJUb0M1NCI+PC9hPgotICAgIDxhIG5hbWU9InJlcG9ydC1kZXRhaWxzIj48L2E+Ci0gICAgPHN0cm9uZyBpZD0iZmFxIj4KLVdoYXQgaW5mb3JtYXRpb24gYW5kIGRldGFpbHMgSSd2ZSB0byBwcm92aWRlIHRvCi10aGUgYXV0aG9yIHdoZW4gd3JpdGluZyBhIGJ1ZyByZXBvcnQ/Ci08L3N0cm9uZz4mbmJzcDsmbmJzcDsKLSAgICBbPGEgaHJlZj0iaHR0cDovL3d3dy5tb2Rzc2wub3JnL2RvY3MvMi44L3NzbF9mYXEuaHRtbCNyZXBvcnQtZGV0YWlscyI+PGI+TDwvYj48L2E+XQotICAgIDxwPgotWW91IGhhdmUgdG8gYXQgbGVhc3QgYWx3YXlzIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKLTxwPgotPHVsPgotPGxpPjxlbT5BcGFjaGUsIG1vZF9zc2wgYW5kIE9wZW5TU0wgdmVyc2lvbiBpbmZvcm1hdGlvbjwvZW0+PGJyPgotICAgIFRoZSBtb2Rfc3NsIHZlcnNpb24geW91IHNob3VsZCByZWFsbHkga25vdy4gRm9yIGluc3RhbmNlLCBpdCdzIHRoZSB2ZXJzaW9uCi0gICAgbnVtYmVyIGluIHRoZSBkaXN0cmlidXRpb24gdGFyYmFsbC4gVGhlIEFwYWNoZSB2ZXJzaW9uIGNhbiBiZSBkZXRlcm1pbmVkCi0gICAgYnkgcnVubmluZyBgYDxjb2RlPmh0dHBkIC12PC9jb2RlPicnLiBUaGUgT3BlblNTTCB2ZXJzaW9uIGNhbiBiZQotICAgIGRldGVybWluZWQgYnkgcnVubmluZyBgYDxjb2RlPm9wZW5zc2wgdmVyc2lvbjwvY29kZT4nJy4gQWx0ZXJuYXRpdmVseSB3aGVuCi0gICAgeW91IGhhdmUgTHlueCBpbnN0YWxsZWQgeW91IGNhbiBydW4gdGhlIGNvbW1hbmQgYGA8Y29kZT5seW54IC1taW1lX2hlYWRlcgotICAgIGh0dHA6Ly9sb2NhbGhvc3QvIHwgZ3JlcCBTZXJ2ZXI8L2NvZGU+JycgdG8gZGV0ZXJtaW5lIGFsbCBpbmZvcm1hdGlvbiBpbiBhCi0gICAgc2luZ2xlIHN0ZXAuCi08cD4KLTxsaT48ZW0+VGhlIGRldGFpbHMgb24gaG93IHlvdSBidWlsdCBhbmQgaW5zdGFsbGVkIEFwYWNoZSttb2Rfc3NsK09wZW5TU0w8L2VtPjxicj4KLSAgICBGb3IgdGhpcyB5b3UgY2FuIHByb3ZpZGUgYSBsb2dmaWxlIG9mIHlvdXIgdGVybWluYWwgc2Vzc2lvbiB3aGljaCBzaG93cwotICAgIHRoZSBjb25maWd1cmF0aW9uIGFuZCBpbnN0YWxsIHN0ZXBzLiBBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gYXQgbGVhc3QKLSAgICBwcm92aWRlIHRoZSBhdXRob3Igd2l0aCB0aGUgQVBBQ0kgYDxjb2RlPmNvbmZpZ3VyZTwvY29kZT4nJyBjb21tYW5kIGxpbmUKLSAgICB5b3UgdXNlZCAoYXNzdW1pbmcgeW91IHVzZWQgQVBBQ0ksIG9mIGNvdXJzZSkuCi08cD4KLTxsaT48ZW0+SW4gY2FzZSBvZiBjb3JlIGR1bXBzIHBsZWFzZSBpbmNsdWRlIGEgQmFja3RyYWNlPC9lbT48YnI+Ci0gICAgSW4gY2FzZSB5b3VyIEFwYWNoZSttb2Rfc3NsK09wZW5TU0wgc2hvdWxkIHJlYWxseSBkdW1wZWQgY29yZSBwbGVhc2UgYXR0YWNoCi0gICAgYSBzdGFjay1mcmFtZSBgYGJhY2t0cmFjZScnIChzZWUgdGhlIG5leHQgcXVlc3Rpb24gb24gaG93IHRvIGdldCBpdCkuCi0gICAgV2l0aG91dCB0aGlzIGluZm9ybWF0aW9uIHRoZSByZWFzb24gZm9yIHlvdXIgY29yZSBkdW1wIGNhbm5vdCBiZSBmb3VuZC4KLSAgICBTbyB5b3UgaGF2ZSB0byBwcm92aWRlIHRoZSBiYWNrdHJhY2UsIHBsZWFzZS4KLTxwPgotPGxpPjxlbT5BIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHlvdXIgcHJvYmxlbTwvZW0+PGJyPgotICAgIERvbid0IGxhdWdoLCBJJ20gdG90YWxseSBzZXJpb3VzLiBJIGFscmVhZHkgZ290IGEgbG90IG9mIHByb2JsZW0gcmVwb3J0cwotICAgIHdoZXJlIHRoZSBwZW9wbGUgbm90IHJlYWxseSBzYWlkIHdoYXQncyB0aGUgYWN0dWFsIHByb2JsZW0gaXMuIFNvLCBpbiB5b3VyCi0gICAgb3duIGludGVyZXN0ICh5b3Ugd2FudCB0aGUgcHJvYmxlbSBiZSBzb2x2ZWQsIGRvbid0IHlvdT8pIGluY2x1ZGUgYXMgbXVjaAotICAgIGRldGFpbHMgYXMgcG9zc2libGUsIHBsZWFzZS4gQnV0IHN0YXJ0IHdpdGggdGhlIGVzc2VudGlhbHMgZmlyc3QsIG9mCi0gICAgY291cnNlLgotPC91bD4KLTxwPgotPGxpPjxhIG5hbWU9IlRvQzU1Ij48L2E+Ci0gICAgPGEgbmFtZT0iY29yZS1kdW1wZWQiPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJmYXEiPgotSSBnb3QgYSBjb3JlIGR1bXAsIGNhbiB5b3UgaGVscCBtZT8KLTwvc3Ryb25nPiZuYnNwOyZuYnNwOwotICAgIFs8YSBocmVmPSJodHRwOi8vd3d3Lm1vZHNzbC5vcmcvZG9jcy8yLjgvc3NsX2ZhcS5odG1sI2NvcmUtZHVtcGVkIj48Yj5MPC9iPjwvYT5dCi0gICAgPHA+Ci0gICAgSW4gZ2VuZXJhbCBubywgYXQgbGVhc3Qgbm90IHVubGVzcyB5b3UgcHJvdmlkZSBtb3JlIGRldGFpbHMgYWJvdXQgdGhlIGNvZGUKLSAgICBsb2NhdGlvbiB3aGVyZSBBcGFjaGUgZHVtcGVkIGNvcmUuIFdoYXQgaXMgdXN1YWxseSBhbHdheXMgcmVxdWlyZWQgaW4KLSAgICBvcmRlciB0byBoZWxwIHlvdSBpcyBhIGJhY2t0cmFjZSAoc2VlIG5leHQgcXVlc3Rpb24pLiBXaXRob3V0IHRoaXMKLSAgICBpbmZvcm1hdGlvbiBpdCBpcyBtb3N0bHkgaW1wb3NzaWJsZSB0byBmaW5kIHRoZSBwcm9ibGVtIGFuZCBoZWxwIHlvdSBpbgotICAgIGZpeGluZyBpdC4KLTxwPgotPGxpPjxhIG5hbWU9IlRvQzU2Ij48L2E+Ci0gICAgPGEgbmFtZT0icmVwb3J0LWJhY2t0cmFjZSI+PC9hPgotICAgIDxzdHJvbmcgaWQ9ImZhcSI+Ci1PaywgSSBnb3QgYSBjb3JlIGR1bXAgYnV0IGhvdyBkbyBJIGdldCBhIGJhY2t0cmFjZSB0byBmaW5kIG91dCB0aGUgcmVhc29uIGZvciBpdD8KLTwvc3Ryb25nPiZuYnNwOyZuYnNwOwotICAgIFs8YSBocmVmPSJodHRwOi8vd3d3Lm1vZHNzbC5vcmcvZG9jcy8yLjgvc3NsX2ZhcS5odG1sI3JlcG9ydC1iYWNrdHJhY2UiPjxiPkw8L2I+PC9hPl0KLSAgICA8cD4KLUZvbGxvdyB0aGUgZm9sbG93aW5nIHN0ZXBzOgotPHA+Ci08b2w+Ci08bGk+TWFrZSBzdXJlIHlvdSBoYXZlIGRlYnVnZ2luZyBzeW1ib2xzIGF2YWlsYWJsZSBpbiBhdCBsZWFzdAotICAgIEFwYWNoZSBhbmQgbW9kX3NzbC4gT24gcGxhdGZvcm1zIHdoZXJlIHlvdSB1c2UgR0NDL0dEQiB5b3UgaGF2ZSB0byBidWlsZAotICAgIEFwYWNoZSttb2Rfc3NsIHdpdGggYGA8Y29kZT5PUFRJTT0iLWcgLWdnZGIzIjwvY29kZT4nJyB0byBhY2hpZXZlIHRoaXMuIE9uCi0gICAgb3RoZXIgcGxhdGZvcm1zIGF0IGxlYXN0IGBgPGNvZGU+T1BUSU09Ii1nIjwvY29kZT4nJyBpcyBuZWVkZWQuCi08cD4KLTxsaT5TdGFydHVwIHRoZSBzZXJ2ZXIgYW5kIHRyeSB0byBwcm9kdWNlIHRoZSBjb3JlLWR1bXAuIEZvciB0aGlzIHlvdSBwZXJoYXBzCi0gICAgd2FudCB0byB1c2UgYSBkaXJlY3RpdmUgbGlrZSBgYDxjb2RlPkNvcmVEdW1wRGlyZWN0b3J5IC90bXA8L2NvZGU+JycgdG8KLSAgICBtYWtlIHN1cmUgdGhhdCB0aGUgY29yZS1kdW1wIGZpbGUgY2FuIGJlIHdyaXR0ZW4uIFlvdSB0aGVuIHNob3VsZCBnZXQgYQotICAgIDxjb2RlPi90bXAvY29yZTwvY29kZT4gb3IgPGNvZGU+L3RtcC9odHRwZC5jb3JlPC9jb2RlPiBmaWxlLiBXaGVuIHlvdQotICAgIGRvbid0IGdldCB0aGlzLCB0cnkgdG8gcnVuIHlvdXIgc2VydmVyIHVuZGVyIGFuIFVJRCAhPSAwIChyb290KSwgYmVjYXVzZQotICAgIG1vc3QgImN1cnJlbnQiIGtlcm5lbHMgZG8gbm90IGFsbG93IGEgcHJvY2VzcyB0byBkdW1wIGNvcmUgYWZ0ZXIgaXQgaGFzCi0gICAgZG9uZSBhIDxjb2RlPnNldHVpZCgpPC9jb2RlPiAodW5sZXNzIGl0IGRvZXMgYW4gPGNvZGU+ZXhlYygpPC9jb2RlPikgZm9yCi0gICAgc2VjdXJpdHkgcmVhc29ucyAodGhlcmUgY2FuIGJlIHByaXZpbGVnZWQgaW5mb3JtYXRpb24gbGVmdCBvdmVyIGluCi0gICAgbWVtb3J5KS4gQWRkaXRpb25hbGx5IHlvdSBjYW4gcnVuIGBgPGNvZGU+L3BhdGgvdG8vaHR0cGQgLVg8L2NvZGU+JycKLSAgICBtYW51YWxseSB0byBmb3JjZSBBcGFjaGUgdG8gbm90IGZvcmsuCi08cD4KLTxsaT5BbmFseXplIHRoZSBjb3JlLWR1bXAuIEZvciB0aGlzIHJ1biBgYDxjb2RlPmdkYiAvcGF0aC90by9odHRwZAotICAgIC90bXAvaHR0cGQuY29yZTwvY29kZT4nJyBvciBhIHNpbWlsYXIgY29tbWFuZCBoYXMgdG8gcnVuLiBJbiBHREIgeW91IHRoZW4KLSAgICBqdXN0IGhhdmUgdG8gZW50ZXIgdGhlIGBgPGNvZGU+YnQ8L2NvZGU+JycgY29tbWFuZCBhbmQsIHZvaWxhLCB5b3UgZ2V0IHRoZQotICAgIGJhY2t0cmFjZS4gRm9yIG90aGVyIGRlYnVnZ2VycyBjb25zdWx0IHlvdXIgbG9jYWwgZGVidWdnZXIgbWFudWFsLiBTZW5kCi0gICAgdGhpcyBiYWNrdHJhY2UgdG8gdGhlIGF1dGhvci4KLTwvb2w+Ci08L3VsPgotICAgICAgPHA+Ci0gICAgICA8YnI+Ci0gICAgICA8dGFibGUgc3VtbWFyeT0iIj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPgotICAgICAgICAgICA8dGFibGUgd2lkdGg9IjYwMCIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0IiB3aWR0aD0iMjUwIj4KLTxhIGhyZWY9InNzbF9ob3d0by5odG1sIiBvbm1vdXNlb3Zlcj0icm9faW1nT3Zlcigncm9faW1nX3ByZXZfYm90JywgJ3ByZXZpb3VzIHBhZ2UnKTsgcmV0dXJuIHRydWUiIG9ubW91c2VvdXQ9InJvX2ltZ05vcm1hbCgncm9faW1nX3ByZXZfYm90Jyk7IHJldHVybiB0cnVlIiBvbmZvY3VzPSJyb19pbWdPdmVyKCdyb19pbWdfcHJldl9ib3QnLCAncHJldmlvdXMgcGFnZScpOyByZXR1cm4gdHJ1ZSIgb25ibHVyPSJyb19pbWdOb3JtYWwoJ3JvX2ltZ19wcmV2X2JvdCcpOyByZXR1cm4gdHJ1ZSI+PGltZyBuYW1lPSJyb19pbWdfcHJldl9ib3QiIHNyYz0ic3NsX3RlbXBsYXRlLm5hdmJ1dC1wcmV2LW4uZ2lmIiBhbHQ9InByZXZpb3VzIHBhZ2UiIHdpZHRoPSI3MCIgaGVpZ2h0PSIxOCIgYm9yZGVyPSIwIj48L2E+PGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj5Ib3dUbzwvZm9udD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJyaWdodCIgd2lkdGg9IjI1MCI+Ci08YSBocmVmPSJzc2xfZ2xvc3NhcnkuaHRtbCIgb25tb3VzZW92ZXI9InJvX2ltZ092ZXIoJ3JvX2ltZ19uZXh0X2JvdCcsICduZXh0IHBhZ2UnKTsgcmV0dXJuIHRydWUiIG9ubW91c2VvdXQ9InJvX2ltZ05vcm1hbCgncm9faW1nX25leHRfYm90Jyk7IHJldHVybiB0cnVlIiBvbmZvY3VzPSJyb19pbWdPdmVyKCdyb19pbWdfbmV4dF9ib3QnLCAnbmV4dCBwYWdlJyk7IHJldHVybiB0cnVlIiBvbmJsdXI9InJvX2ltZ05vcm1hbCgncm9faW1nX25leHRfYm90Jyk7IHJldHVybiB0cnVlIj48aW1nIG5hbWU9InJvX2ltZ19uZXh0X2JvdCIgc3JjPSJzc2xfdGVtcGxhdGUubmF2YnV0LW5leHQtbi5naWYiIGFsdD0ibmV4dCBwYWdlIiB3aWR0aD0iNzAiIGhlaWdodD0iMTgiIGJvcmRlcj0iMCI+PC9hPjxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+R2xvc3Nhcnk8L2ZvbnQ+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICA8L3RyPgotICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtMDAwMDAwLmdpZiIgYWx0PSIiIHdpZHRoPSI2MDAiIGhlaWdodD0iMiIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjx0YWJsZSB3aWR0aD0iNTk4IiBzdW1tYXJ5PSIiPgotICAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj4KLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5tb2Rzc2wub3JnLyI+bW9kX3NzbDwvYT4gMi44LCBVc2VyIE1hbnVhbDxicj4KLSAgICAgICAgVGhlIEFwYWNoZSBJbnRlcmZhY2UgdG8gT3BlblNTTAotICAgICAgICA8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+Ci0gICAgICAgIENvcHlyaWdodCAmY29weTsgMTk5OC0yMDAxCi0gICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuZW5nZWxzY2hhbGwuY29tLyI+UmFsZiBTLiBFbmdlbHNjaGFsbDwvYT48YnI+Ci0gICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQ8YnI+Ci0gICAgICAgIDwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICA8L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3NzbC9zc2xfaG93dG8uaHRtbCBiL2RvY3MvbWFudWFsL3NzbC9zc2xfaG93dG8uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmZjdhOS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9zc2wvc3NsX2hvd3RvLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MjkgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5tb2Rfc3NsOiBIb3dUbzwvdGl0bGU+Ci0KLTwhLS0KLSAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgUmFsZiBTLiBFbmdlbHNjaGFsbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gIGFyZSBtZXQ6Ci0KLSAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQotICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICAgICBkaXNjbGFpbWVyLiAKLSAKLSAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLSAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotIAotICAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6IAotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLSAgICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+IGZvciB1c2UgaW4gdGhlCi0gICAgICBtb2Rfc3NsIHByb2plY3QgKGh0dHA6Ly93d3cubW9kc3NsLm9yZy8pLiIKLSAKLSAgNC4gVGhlIG5hbWUgIm1vZF9zc2wiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgICBwZXJtaXNzaW9uLiAgCi0KLSAgNS4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlCi0gICAgIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi0gICAgICBSYWxmIFMuIEVuZ2Vsc2NoYWxsIDxyc2VAZW5nZWxzY2hhbGwuY29tPiBmb3IgdXNlIGluIHRoZQotICAgICAgbW9kX3NzbCBwcm9qZWN0IChodHRwOi8vd3d3Lm1vZHNzbC5vcmcvKS4iCi0gCi0gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgUkFMRiBTLiBFTkdFTFNDSEFMTCBgYEFTIElTJycgQU5EIEFOWQotICBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgUkFMRiBTLiBFTkdFTFNDSEFMTCBPUgotICBISVMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLS0+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhLS0KLUE6bGluayB7Ci0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotICAgIGNvbG9yOiAjNjY2NmNjOwotfQotQTphY3RpdmUgewotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSAgICBjb2xvcjogIzY2NjZjYzsKLX0KLUE6dmlzaXRlZCB7Ci0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotICAgIGNvbG9yOiAjNjY2NmNjOwotfQotI3NmIHsKLSAgICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhOwotICAgIGZvbnQtdmFyaWFudDogbm9ybWFsOwotICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLUgxIHsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICBmb250LXNpemU6IDI0cHQ7Ci0gICAgbGluZS1oZWlnaHQ6IDI0cHQ7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYTsKLSAgICBmb250LXZhcmlhbnQ6IG5vcm1hbDsKLSAgICBmb250LXN0eWxlOiBub3JtYWw7Ci19Ci1IMiB7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgZm9udC1zaXplOiAxOHB0OwotICAgIGxpbmUtaGVpZ2h0OiAxOHB0OwotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCxoZWx2ZXRpY2E7Ci0gICAgZm9udC12YXJpYW50OiBub3JtYWw7Ci0gICAgZm9udC1zdHlsZTogbm9ybWFsOwotfQotSDMgewotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgIGZvbnQtc2l6ZTogMTRwdDsKLSAgICBsaW5lLWhlaWdodDogMTRwdDsKLSAgICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhOwotICAgIGZvbnQtdmFyaWFudDogbm9ybWFsOwotICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLUg0IHsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICBmb250LXNpemU6IDEycHQ7Ci0gICAgbGluZS1oZWlnaHQ6IDEycHQ7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYTsKLSAgICBmb250LXZhcmlhbnQ6IG5vcm1hbDsKLSAgICBmb250LXN0eWxlOiBub3JtYWw7Ci19Ci0jSCB7Ci19Ci0jRCB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDsKLX0KLSNmYXEgewotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgIGZvbnQtc2l6ZTogMTZwdDsKLSAgICBsaW5lLWhlaWdodDogMTZwdDsKLSAgICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhOwotICAgIGZvbnQtdmFyaWFudDogbm9ybWFsOwotICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLSNob3d0byB7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgZm9udC1zaXplOiAxNnB0OwotICAgIGxpbmUtaGVpZ2h0OiAxNnB0OwotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCxoZWx2ZXRpY2E7Ci0gICAgZm9udC12YXJpYW50OiBub3JtYWw7Ci0gICAgZm9udC1zdHlsZTogbm9ybWFsOwotfQotI3Rlcm0gewotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgIGZvbnQtc2l6ZTogMTZwdDsKLSAgICBsaW5lLWhlaWdodDogMTZwdDsKLSAgICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhOwotICAgIGZvbnQtdmFyaWFudDogbm9ybWFsOwotICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLS0tPjwvc3R5bGU+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotPCEtLSBIaWRpbmcgdGhlIGNvZGUKLWZ1bmN0aW9uIHJvX2ltZ05vcm1hbChpbWdOYW1lKSB7Ci0gICAgaWYgKGRvY3VtZW50LmltYWdlcykgewotICAgICAgICBkb2N1bWVudFtpbWdOYW1lXS5zcmMgPSBldmFsKGltZ05hbWUgKyAnX24uc3JjJyk7Ci0gICAgICAgIHNlbGYuc3RhdHVzID0gJyc7Ci0gICAgfQotfQotZnVuY3Rpb24gcm9faW1nT3ZlcihpbWdOYW1lLCBkZXNjcmlwdCkgewotICAgIGlmIChkb2N1bWVudC5pbWFnZXMpIHsKLSAgICAgICAgZG9jdW1lbnRbaW1nTmFtZV0uc3JjID0gZXZhbChpbWdOYW1lICsgJ19vLnNyYycpOwotICAgICAgICBzZWxmLnN0YXR1cyA9IGRlc2NyaXB0OwotICAgIH0KLX0KLS8vIGRvbmUgaGlkaW5nIC0tPgotPC9zY3JpcHQ+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotPCEtLSBIaWRpbmcgdGhlIGNvZGUKLWlmIChkb2N1bWVudC5pbWFnZXMpIHsKLSAgICByb19pbWdfcHJldl90b3BfbiA9IG5ldyBJbWFnZSgpOwotICAgIHJvX2ltZ19wcmV2X3RvcF9uLnNyYyA9ICdzc2xfdGVtcGxhdGUubmF2YnV0LXByZXYtbi5naWYnOwotICAgIHJvX2ltZ19wcmV2X3RvcF9vID0gbmV3IEltYWdlKCk7Ci0gICAgcm9faW1nX3ByZXZfdG9wX28uc3JjID0gJ3NzbF90ZW1wbGF0ZS5uYXZidXQtcHJldi1zLmdpZic7Ci19Ci0vLyBkb25lIGhpZGluZyAtLT4KLTwvc2NyaXB0PgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhLS0gSGlkaW5nIHRoZSBjb2RlCi1pZiAoZG9jdW1lbnQuaW1hZ2VzKSB7Ci0gICAgcm9faW1nX3ByZXZfYm90X24gPSBuZXcgSW1hZ2UoKTsKLSAgICByb19pbWdfcHJldl9ib3Rfbi5zcmMgPSAnc3NsX3RlbXBsYXRlLm5hdmJ1dC1wcmV2LW4uZ2lmJzsKLSAgICByb19pbWdfcHJldl9ib3RfbyA9IG5ldyBJbWFnZSgpOwotICAgIHJvX2ltZ19wcmV2X2JvdF9vLnNyYyA9ICdzc2xfdGVtcGxhdGUubmF2YnV0LXByZXYtcy5naWYnOwotfQotLy8gZG9uZSBoaWRpbmcgLS0+Ci08L3NjcmlwdD4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci08IS0tIEhpZGluZyB0aGUgY29kZQotaWYgKGRvY3VtZW50LmltYWdlcykgewotICAgIHJvX2ltZ19uZXh0X3RvcF9uID0gbmV3IEltYWdlKCk7Ci0gICAgcm9faW1nX25leHRfdG9wX24uc3JjID0gJ3NzbF90ZW1wbGF0ZS5uYXZidXQtbmV4dC1uLmdpZic7Ci0gICAgcm9faW1nX25leHRfdG9wX28gPSBuZXcgSW1hZ2UoKTsKLSAgICByb19pbWdfbmV4dF90b3Bfby5zcmMgPSAnc3NsX3RlbXBsYXRlLm5hdmJ1dC1uZXh0LXMuZ2lmJzsKLX0KLS8vIGRvbmUgaGlkaW5nIC0tPgotPC9zY3JpcHQ+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotPCEtLSBIaWRpbmcgdGhlIGNvZGUKLWlmIChkb2N1bWVudC5pbWFnZXMpIHsKLSAgICByb19pbWdfbmV4dF9ib3RfbiA9IG5ldyBJbWFnZSgpOwotICAgIHJvX2ltZ19uZXh0X2JvdF9uLnNyYyA9ICdzc2xfdGVtcGxhdGUubmF2YnV0LW5leHQtbi5naWYnOwotICAgIHJvX2ltZ19uZXh0X2JvdF9vID0gbmV3IEltYWdlKCk7Ci0gICAgcm9faW1nX25leHRfYm90X28uc3JjID0gJ3NzbF90ZW1wbGF0ZS5uYXZidXQtbmV4dC1zLmdpZic7Ci19Ci0vLyBkb25lIGhpZGluZyAtLT4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiIgdGV4dD0iIzAwMDAwMCIgbGluaz0iIzMzMzM5OSIgYWxpbms9IiM5OTk5ZmYiIHZsaW5rPSIjMDAwMDY2Ij4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08dGFibGUgd2lkdGg9IjYwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+Ci0gIDx0ZD4KLSAgICAgIDxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjYwMCIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjxicj4KLSAgICAgIDx0YWJsZSB3aWR0aD0iNjAwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHN1bW1hcnk9IiI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI2MDAiIHN1bW1hcnk9IiI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgICAgPGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIiBzaXplPSIrMiI+PGI+bW9kX3NzbDwvYj48L2ZvbnQ+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+Ci0gICAgICAgICAgICAgIDxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaGVhZC1jaGFwdGVyLmdpZiIgYWx0PSJDaGFwdGVyIiB3aWR0aD0iMTc1IiBoZWlnaHQ9Ijk0Ij4gPGltZyBzcmM9InNzbF90ZW1wbGF0ZS5oZWFkLW51bS01LmdpZiIgYWx0PSI1IiB3aWR0aD0iNzQiIGhlaWdodD0iODkiPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtMDAwMDAwLmdpZiIgYWx0PSIiIHdpZHRoPSI2MDAiIGhlaWdodD0iMiIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPgotICAgICAgICAgICA8dGFibGUgd2lkdGg9IjYwMCIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0IiB3aWR0aD0iMjUwIj4KLTxhIGhyZWY9InNzbF9jb21wYXQuaHRtbCIgb25tb3VzZW92ZXI9InJvX2ltZ092ZXIoJ3JvX2ltZ19wcmV2X3RvcCcsICdwcmV2aW91cyBwYWdlJyk7IHJldHVybiB0cnVlIiBvbm1vdXNlb3V0PSJyb19pbWdOb3JtYWwoJ3JvX2ltZ19wcmV2X3RvcCcpOyByZXR1cm4gdHJ1ZSIgb25mb2N1cz0icm9faW1nT3Zlcigncm9faW1nX3ByZXZfdG9wJywgJ3ByZXZpb3VzIHBhZ2UnKTsgcmV0dXJuIHRydWUiIG9uYmx1cj0icm9faW1nTm9ybWFsKCdyb19pbWdfcHJldl90b3AnKTsgcmV0dXJuIHRydWUiPjxpbWcgbmFtZT0icm9faW1nX3ByZXZfdG9wIiBzcmM9InNzbF90ZW1wbGF0ZS5uYXZidXQtcHJldi1uLmdpZiIgYWx0PSJwcmV2aW91cyBwYWdlIiB3aWR0aD0iNzAiIGhlaWdodD0iMTgiIGJvcmRlcj0iMCI+PC9hPjxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Q29tcGF0aWJpbGl0eTwvZm9udD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJyaWdodCIgd2lkdGg9IjI1MCI+Ci08YSBocmVmPSJzc2xfZmFxLmh0bWwiIG9ubW91c2VvdmVyPSJyb19pbWdPdmVyKCdyb19pbWdfbmV4dF90b3AnLCAnbmV4dCBwYWdlJyk7IHJldHVybiB0cnVlIiBvbm1vdXNlb3V0PSJyb19pbWdOb3JtYWwoJ3JvX2ltZ19uZXh0X3RvcCcpOyByZXR1cm4gdHJ1ZSIgb25mb2N1cz0icm9faW1nT3Zlcigncm9faW1nX25leHRfdG9wJywgJ25leHQgcGFnZScpOyByZXR1cm4gdHJ1ZSIgb25ibHVyPSJyb19pbWdOb3JtYWwoJ3JvX2ltZ19uZXh0X3RvcCcpOyByZXR1cm4gdHJ1ZSI+PGltZyBuYW1lPSJyb19pbWdfbmV4dF90b3AiIHNyYz0ic3NsX3RlbXBsYXRlLm5hdmJ1dC1uZXh0LW4uZ2lmIiBhbHQ9Im5leHQgcGFnZSIgd2lkdGg9IjcwIiBoZWlnaHQ9IjE4IiBib3JkZXI9IjAiPjwvYT48YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPkYuQS5RLiBMaXN0PC9mb250PgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgPGJyPgotICAgICAgICAgIDxpbWcgc3JjPSJzc2xfdGVtcGxhdGUudGl0bGUtaG93dG8uZ2lmIiBhbHQ9Ikhvd1RvIiB3aWR0aD0iNDU2IiBoZWlnaHQ9IjYwIj4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotPGRpdiBhbGlnbj0icmlnaHQiPgotPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjIwMCIgc3VtbWFyeT0iIj4KLTx0cj4KLTx0ZD4KLTxlbT4KLWBgVGhlIHNvbHV0aW9uIG9mIHRoaXMgcHJvYmxlbSBpcyB0cml2aWFsCi0gIGFuZCBpcyBsZWZ0IGFzIGFuIGV4ZXJjaXNlIGZvciB0aGUgcmVhZGVyLicnCi08L2VtPgotPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGQgYWxpZ249InJpZ2h0Ij4KLTxmb250IHNpemU9Ii0xIj4KLVN0YW5kYXJkIHRleHRib29rIGNvb2tpZQotPC9mb250PgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08cD4KLTx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0ciB2YWxpZ249ImJvdHRvbSI+Ci08dGQ+Ci08aW1nIHNyYz0ic3NsX2hvd3RvLmdmb250MDAwLmdpZiIgYWx0PSJIIiB3aWR0aD0iNDAiIGhlaWdodD0iMzQiIGJvcmRlcj0iMCIgYWxpZ249ImxlZnQiPgotb3cgdG8gc29sdmUgcGFydGljdWxhciBzZWN1cml0eSBjb25zdHJhaW50cyBmb3IgYW4gU1NMLWF3YXJlIHdlYnNlcnZlcgotaXMgbm90IGFsd2F5cyBvYnZpb3VzIGJlY2F1c2Ugb2YgdGhlIGNvaGVyZW5jZXMgYmV0d2VlbiBTU0wsIEhUVFAgYW5kIEFwYWNoZSdzCi13YXkgb2YgcHJvY2Vzc2luZyByZXF1ZXN0cy4gVGhpcyBjaGFwdGVyIGdpdmVzIGluc3RydWN0aW9ucyBvbiBob3cgdG8gc29sdmUKLXN1Y2ggdHlwaWNhbCBzaXR1YXRpb25zLiBUcmVhdCBpcyBhcyBhIGZpcnN0IHN0ZXAgdG8gZmluZCBvdXQgdGhlIGZpbmFsCi1zb2x1dGlvbiwgYnV0IGFsd2F5cyB0cnkgdG8gdW5kZXJzdGFuZCB0aGUgc3R1ZmYgYmVmb3JlIHlvdSB1c2UgaXQuIE5vdGhpbmcgaXMKLXdvcnNlIHRoYW4gdXNpbmcgYSBzZWN1cml0eSBzb2x1dGlvbiB3aXRob3V0IGtub3dpbmcgaXQncyByZXN0cmljdGlvbnMgYW5kCi1jb2hlcmVuY2VzLgotPC90ZD4KLTx0ZD4KLSZuYnNwOyZuYnNwOwotPC90ZD4KLTx0ZD4KLTxkaXYgYWxpZ249InJpZ2h0Ij4KLTx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjUiIGJvcmRlcj0iMCIgYmdjb2xvcj0iI2NjY2NmZiIgd2lkdGg9IjMwMCIgc3VtbWFyeT0iIj4KLTx0cj4KLTx0ZCBiZ2NvbG9yPSIjMzMzMzk5Ij4KLTxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSIgY29sb3I9IiNjY2NjZmYiPgotPGI+VGFibGUgT2YgQ29udGVudHM8L2I+Ci08L2ZvbnQ+Ci08L3RkPgotPC90cj4KLTx0cj4KLTx0ZD4KLTxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSIgc2l6ZT0iLTEiPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzEiPjxzdHJvbmc+Q2lwaGVyIFN1aXRlcyBhbmQgRW5mb3JjZWQgU3Ryb25nIFNlY3VyaXR5PC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0MyIj48c3Ryb25nPlNTTHYyIG9ubHkgc2VydmVyPC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0MzIj48c3Ryb25nPnN0cm9uZyBlbmNyeXB0aW9uIG9ubHkgc2VydmVyPC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0M0Ij48c3Ryb25nPnNlcnZlciBnYXRlZCBjcnlwdG9ncmFwaHk8L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzUiPjxzdHJvbmc+c3Ryb25nZXIgcGVyLWRpcmVjdG9yeSByZXF1aXJlbWVudHM8L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzYiPjxzdHJvbmc+Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBBY2Nlc3MgQ29udHJvbDwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DNyI+PHN0cm9uZz5zaW1wbGUgY2VydGlmaWNhdGUtYmFzZWQgY2xpZW50IGF1dGhlbnRpY2F0aW9uPC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0M4Ij48c3Ryb25nPnNlbGVjdGl2ZSBjZXJ0aWZpY2F0ZS1iYXNlZCBjbGllbnQgYXV0aGVudGljYXRpb248L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzkiPjxzdHJvbmc+cGFydGljdWxhciBjZXJ0aWZpY2F0ZS1iYXNlZCBjbGllbnQgYXV0aGVudGljYXRpb248L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzEwIj48c3Ryb25nPmludHJhbmV0IHZzLiBpbnRlcm5ldCBhdXRoZW50aWNhdGlvbjwvc3Ryb25nPjwvYT48YnI+Ci08L2ZvbnQ+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTxoMj48YSBuYW1lPSJUb0MxIj5DaXBoZXIgU3VpdGVzIGFuZCBFbmZvcmNlZCBTdHJvbmcgU2VjdXJpdHk8L2E+PC9oMj4KLTx1bD4KLTxwPgotPGxpPjxhIG5hbWU9IlRvQzIiPjwvYT4KLSAgICA8YSBuYW1lPSJjaXBoZXItc3NsdjIiPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJob3d0byI+Ci1Ib3cgY2FuIEkgY3JlYXRlIGEgcmVhbCBTU0x2Mi1vbmx5IHNlcnZlcj8KLTwvc3Ryb25nPiZuYnNwOyZuYnNwOwotICAgIFs8YSBocmVmPSJodHRwOi8vd3d3Lm1vZHNzbC5vcmcvZG9jcy8yLjgvc3NsX2hvd3RvLmh0bWwjY2lwaGVyLXNzbHYyIj48Yj5MPC9iPjwvYT5dCi0gICAgPHA+Ci1UaGUgZm9sbG93aW5nIGNyZWF0ZXMgYW4gU1NMIHNlcnZlciB3aGljaCBzcGVha3Mgb25seSB0aGUgU1NMdjIgcHJvdG9jb2wgYW5kCi1pdHMgY2lwaGVycy4KLTxwPgotPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBzdW1tYXJ5PSIiPgotICAgIDx0cj4KLSAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iOCIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgICA8dGQgcm93c3Bhbj0iMyI+Jm5ic3A7Jm5ic3A7PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIiBjb2xvcj0iIzk5OTk5OSI+aHR0cGQuY29uZjwvZm9udD4mbmJzcDsmbmJzcDs8L3RkPgotICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIiBjb2xzcGFuPSIyIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIGNvbHNwYW49IjIiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iNSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgICAgPHRkIGJnY29sb3I9IiNmZmZmZmYiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjQwIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZmZmZmZmIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIzMDAiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iNSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgICAgPHRkIGNvbHNwYW49IjMiIGJnY29sb3I9IiNmZmZmZmYiPgotICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSI0IiBzdW1tYXJ5PSIiPgotICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICA8dGQ+Ci08cHJlPgotCi1TU0xQcm90b2NvbCAtYWxsICtTU0x2MgotU1NMQ2lwaGVyU3VpdGUgU1NMdjI6K0hJR0g6K01FRElVTTorTE9XOitFWFAKLQotPC9wcmU+Ci08L3RkPgotICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICA8L3RkPgotICAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgICAgPHRkIGNvbHNwYW49IjUiIGJnY29sb3I9IiNjY2NjY2MiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgIDwvdHI+Ci08L3RhYmxlPgotPHA+Ci08bGk+PGEgbmFtZT0iVG9DMyI+PC9hPgotICAgIDxhIG5hbWU9ImNpcGhlci1zdHJvbmciPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJob3d0byI+Ci1Ib3cgY2FuIEkgY3JlYXRlIGFuIFNTTCBzZXJ2ZXIgd2hpY2ggYWNjZXB0cyBzdHJvbmcgZW5jcnlwdGlvbiBvbmx5PwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfaG93dG8uaHRtbCNjaXBoZXItc3Ryb25nIj48Yj5MPC9iPjwvYT5dCi0gICAgPHA+Ci1UaGUgZm9sbG93aW5nIGVuYWJsZXMgb25seSB0aGUgc2V2ZW4gc3Ryb25nZXN0IGNpcGhlcnM6Ci08cD4KLTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgc3VtbWFyeT0iIj4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjgiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICAgICAgPHRkIHJvd3NwYW49IjMiPiZuYnNwOyZuYnNwOzxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSIgY29sb3I9IiM5OTk5OTkiPmh0dHBkLmNvbmY8L2ZvbnQ+Jm5ic3A7Jm5ic3A7PC90ZD4KLSAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgY29sc3Bhbj0iMiI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIiBjb2xzcGFuPSIyIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjUiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZmZmZmZmIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSI0MCIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICAgICA8dGQgYmdjb2xvcj0iI2ZmZmZmZiI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMzAwIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjUiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIiBiZ2NvbG9yPSIjZmZmZmZmIj4KLSAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iNCIgc3VtbWFyeT0iIj4KLSAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgPHRkPgotPHByZT4KLQotU1NMUHJvdG9jb2wgYWxsCi1TU0xDaXBoZXJTdWl0ZSBISUdIOk1FRElVTQotCi08L3ByZT4KLTwvdGQ+Ci0gICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgIDwvdGQ+Ci0gICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgICA8dGQgY29sc3Bhbj0iNSIgYmdjb2xvcj0iI2NjY2NjYyI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgPC90cj4KLTwvdGFibGU+Ci08cD4KLTxsaT48YSBuYW1lPSJUb0M0Ij48L2E+Ci0gICAgPGEgbmFtZT0iY2lwaGVyLXNnYyI+PC9hPgotICAgIDxzdHJvbmcgaWQ9Imhvd3RvIj4KLUhvdyBjYW4gSSBjcmVhdGUgYW4gU1NMIHNlcnZlciB3aGljaCBhY2NlcHRzIHN0cm9uZyBlbmNyeXB0aW9uIG9ubHksCi1idXQgYWxsb3dzIGV4cG9ydCBicm93c2VycyB0byB1cGdyYWRlIHRvIHN0cm9uZ2VyIGVuY3J5cHRpb24/Ci08L3N0cm9uZz4mbmJzcDsmbmJzcDsKLSAgICBbPGEgaHJlZj0iaHR0cDovL3d3dy5tb2Rzc2wub3JnL2RvY3MvMi44L3NzbF9ob3d0by5odG1sI2NpcGhlci1zZ2MiPjxiPkw8L2I+PC9hPl0KLSAgICA8cD4KLVRoaXMgZmFjaWxpdHkgaXMgY2FsbGVkIFNlcnZlciBHYXRlZCBDcnlwdG9ncmFwaHkgKFNHQykgYW5kIGRldGFpbHMgeW91IGNhbgotZmluZCBpbiB0aGUgPGNvZGU+UkVBRE1FLkdsb2JhbElEPC9jb2RlPiBkb2N1bWVudCBpbiB0aGUgbW9kX3NzbCBkaXN0cmlidXRpb24uCi1JbiBzaG9ydDogVGhlIHNlcnZlciBoYXMgYSBHbG9iYWwgSUQgc2VydmVyIGNlcnRpZmljYXRlLCBzaWduZWQgYnkgYSBzcGVjaWFsCi1DQSBjZXJ0aWZpY2F0ZSBmcm9tIFZlcmlzaWduIHdoaWNoIGVuYWJsZXMgc3Ryb25nIGVuY3J5cHRpb24gaW4gZXhwb3J0Ci1icm93c2Vycy4gVGhpcyB3b3JrcyBhcyBmb2xsb3dpbmc6IFRoZSBicm93c2VyIGNvbm5lY3RzIHdpdGggYW4gZXhwb3J0IGNpcGhlciwKLXRoZSBzZXJ2ZXIgc2VuZHMgaXQncyBHbG9iYWwgSUQgY2VydGlmaWNhdGUsIHRoZSBicm93c2VyIHZlcmlmaWVzIGl0IGFuZAotc3Vic2VxdWVudGx5IHVwZ3JhZGVzIHRoZSBjaXBoZXIgc3VpdGUgYmVmb3JlIGFueSBIVFRQIGNvbW11bmljYXRpb24gdGFrZXMKLXBsYWNlLiBUaGUgcXVlc3Rpb24gbm93IGlzOiBIb3cgY2FuIHdlIGFsbG93IHRoaXMgdXBncmFkZSwgYnV0IGVuZm9yY2Ugc3Ryb25nCi1lbmNyeXB0aW9uLiBPciBpbiBvdGhlciB3b3JkczogQnJvd3NlciBlaXRoZXIgaGF2ZSB0byBpbml0aWFsbHkgY29ubmVjdCB3aXRoCi1zdHJvbmcgZW5jcnlwdGlvbiBvciBoYXZlIHRvIHVwZ3JhZGUgdG8gc3Ryb25nIGVuY3J5cHRpb24sIGJ1dCBhcmUgbm90IGFsbG93ZWQKLXRvIGtlZXAgdGhlIGV4cG9ydCBjaXBoZXJzLiBUaGUgZm9sbG93aW5nIGRvZXMgdGhlIHRyaWNrOgotPHA+Ci08dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHN1bW1hcnk9IiI+Ci0gICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSI4IiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICAgIDx0ZCByb3dzcGFuPSIzIj4mbmJzcDsmbmJzcDs8Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiIGNvbG9yPSIjOTk5OTk5Ij5odHRwZC5jb25mPC9mb250PiZuYnNwOyZuYnNwOzwvdGQ+Ci0gICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIGNvbHNwYW49IjIiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgY29sc3Bhbj0iMiI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSI1IiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICAgICA8dGQgYmdjb2xvcj0iI2ZmZmZmZiI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iNDAiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgICAgPHRkIGJnY29sb3I9IiNmZmZmZmYiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjMwMCIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSI1IiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICAgICA8dGQgY29sc3Bhbj0iMyIgYmdjb2xvcj0iI2ZmZmZmZiI+Ci0gICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjQiIHN1bW1hcnk9IiI+Ci0gICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgIDx0ZD4KLTxwcmU+Ci0KLSMgICBhbGxvdyBhbGwgY2lwaGVycyBmb3IgdGhlIGluaXRhbCBoYW5kc2hha2UsCi0jICAgc28gZXhwb3J0IGJyb3dzZXJzIGNhbiB1cGdyYWRlIHZpYSBTR0MgZmFjaWxpdHkKLVNTTENpcGhlclN1aXRlIEFMTDohQURIOlJDNCtSU0E6K0hJR0g6K01FRElVTTorTE9XOitTU0x2MjorRVhQOitlTlVMTAotJmx0O0RpcmVjdG9yeSAvdXNyL2xvY2FsL2FwYWNoZS9odGRvY3MmZ3Q7Ci0jICAgYnV0IGZpbmFsbHkgZGVueSBhbGwgYnJvd3NlcnMgd2hpY2ggaGF2ZW4ndCB1cGdyYWRlZAotU1NMUmVxdWlyZSAle1NTTF9DSVBIRVJfVVNFS0VZU0laRX0gJmd0Oz0gMTI4Ci0mbHQ7L0RpcmVjdG9yeSZndDsKLQotPC9wcmU+Ci08L3RkPgotICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICA8L3RkPgotICAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgICAgPHRkIGNvbHNwYW49IjUiIGJnY29sb3I9IiNjY2NjY2MiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgIDwvdHI+Ci08L3RhYmxlPgotPHA+Ci08bGk+PGEgbmFtZT0iVG9DNSI+PC9hPgotICAgIDxhIG5hbWU9ImNpcGhlci1wZXJkaXIiPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJob3d0byI+Ci1Ib3cgY2FuIEkgY3JlYXRlIGFuIFNTTCBzZXJ2ZXIgd2hpY2ggYWNjZXB0cyBhbGwgdHlwZXMgb2YgY2lwaGVycyBpbiBnZW5lcmFsLAotYnV0IHJlcXVpcmVzIGEgc3Ryb25nIGNpcGhlcnMgZm9yIGFjY2VzcyB0byBhIHBhcnRpY3VsYXIgVVJMPwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfaG93dG8uaHRtbCNjaXBoZXItcGVyZGlyIj48Yj5MPC9iPjwvYT5dCi0gICAgPHA+Ci1PYnZpb3VzbHkgeW91IGNhbm5vdCBqdXN0IHVzZSBhIHNlcnZlci13aWRlIDxjb2RlPlNTTENpcGhlclN1aXRlPC9jb2RlPiB3aGljaAotcmVzdHJpY3RzIHRoZSBjaXBoZXJzIHRvIHRoZSBzdHJvbmcgdmFyaWFudHMuIEJ1dCBtb2Rfc3NsIGFsbG93cyB5b3UgdG8KLXJlY29uZmlndXJlIHRoZSBjaXBoZXIgc3VpdGUgaW4gcGVyLWRpcmVjdG9yeSBjb250ZXh0IGFuZCBhdXRvbWF0aWNhbGx5IGZvcmNlcwotYSByZW5lZ290aWF0aW9uIG9mIHRoZSBTU0wgcGFyYW1ldGVycyB0byBtZWV0IHRoZSBuZXcgY29uZmlndXJhdGlvbi4gU28sIHRoZQotc29sdXRpb24gaXM6Ci08cD4KLTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgc3VtbWFyeT0iIj4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjgiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICAgICAgPHRkIHJvd3NwYW49IjMiPiZuYnNwOyZuYnNwOzxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSIgY29sb3I9IiM5OTk5OTkiPmh0dHBkLmNvbmY8L2ZvbnQ+Jm5ic3A7Jm5ic3A7PC90ZD4KLSAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgY29sc3Bhbj0iMiI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIiBjb2xzcGFuPSIyIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjUiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZmZmZmZmIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSI0MCIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICAgICA8dGQgYmdjb2xvcj0iI2ZmZmZmZiI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMzAwIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjUiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIiBiZ2NvbG9yPSIjZmZmZmZmIj4KLSAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iNCIgc3VtbWFyeT0iIj4KLSAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgPHRkPgotPHByZT4KLQotIyAgIGJlIGxpYmVyYWwgaW4gZ2VuZXJhbAotU1NMQ2lwaGVyU3VpdGUgQUxMOiFBREg6UkM0K1JTQTorSElHSDorTUVESVVNOitMT1c6K1NTTHYyOitFWFA6K2VOVUxMCi0mbHQ7TG9jYXRpb24gL3N0cm9uZy9hcmVhJmd0OwotIyAgIGJ1dCBodHRwczovL2hvc3RuYW1lL3N0cm9uZy9hcmVhLyBhbmQgYmVsb3cgcmVxdWlyZXMgc3Ryb25nIGNpcGhlcnMKLVNTTENpcGhlclN1aXRlIEhJR0g6TUVESVVNCi0mbHQ7L0xvY2F0aW9uJmd0OwotCi08L3ByZT4KLTwvdGQ+Ci0gICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgIDwvdGQ+Ci0gICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgICA8dGQgY29sc3Bhbj0iNSIgYmdjb2xvcj0iI2NjY2NjYyI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgPC90cj4KLTwvdGFibGU+Ci08L3VsPgotPGgyPjxhIG5hbWU9IlRvQzYiPkNsaWVudCBBdXRoZW50aWNhdGlvbiBhbmQgQWNjZXNzIENvbnRyb2w8L2E+PC9oMj4KLTx1bD4KLTxwPgotPGxpPjxhIG5hbWU9IlRvQzciPjwvYT4KLSAgICA8YSBuYW1lPSJhdXRoLXNpbXBsZSI+PC9hPgotICAgIDxzdHJvbmcgaWQ9Imhvd3RvIj4KLUhvdyBjYW4gSSBhdXRoZW50aWNhdGUgY2xpZW50cyBiYXNlZCBvbiBjZXJ0aWZpY2F0ZXMgd2hlbiBJIGtub3cgYWxsIG15Ci1jbGllbnRzPwotPC9zdHJvbmc+Jm5ic3A7Jm5ic3A7Ci0gICAgWzxhIGhyZWY9Imh0dHA6Ly93d3cubW9kc3NsLm9yZy9kb2NzLzIuOC9zc2xfaG93dG8uaHRtbCNhdXRoLXNpbXBsZSI+PGI+TDwvYj48L2E+XQotICAgIDxwPgotV2hlbiB5b3Uga25vdyB5b3VyIHVzZXIgY29tbXVuaXR5IChpLmUuIGEgY2xvc2VkIHVzZXIgZ3JvdXAgc2l0dWF0aW9uKSwgYXMKLWl0J3MgdGhlIGNhc2UgZm9yIGluc3RhbmNlIGluIGFuIEludHJhbmV0LCB5b3UgY2FuIHVzZSBwbGFpbiBjZXJ0aWZpY2F0ZQotYXV0aGVudGljYXRpb24uIEFsbCB5b3UgaGF2ZSB0byBkbyBpcyB0byBjcmVhdGUgY2xpZW50IGNlcnRpZmljYXRlcyBzaWduZWQgYnkKLXlvdXIgb3duIENBIGNlcnRpZmljYXRlIDxjb2RlPmNhLmNydDwvY29kZT4gYW5kIHRoZW4gdmVyaWZpeSB0aGUgY2xpZW50cwotYWdhaW5zdCB0aGlzIGNlcnRpZmljYXRlLgotPHA+Ci08dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHN1bW1hcnk9IiI+Ci0gICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSI4IiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICAgIDx0ZCByb3dzcGFuPSIzIj4mbmJzcDsmbmJzcDs8Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiIGNvbG9yPSIjOTk5OTk5Ij5odHRwZC5jb25mPC9mb250PiZuYnNwOyZuYnNwOzwvdGQ+Ci0gICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIGNvbHNwYW49IjIiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgY29sc3Bhbj0iMiI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSI1IiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICAgICA8dGQgYmdjb2xvcj0iI2ZmZmZmZiI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iNDAiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgICAgPHRkIGJnY29sb3I9IiNmZmZmZmYiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjMwMCIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSI1IiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICAgICA8dGQgY29sc3Bhbj0iMyIgYmdjb2xvcj0iI2ZmZmZmZiI+Ci0gICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjQiIHN1bW1hcnk9IiI+Ci0gICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgIDx0ZD4KLTxwcmU+Ci0KLSMgICByZXF1aXJlIGEgY2xpZW50IGNlcnRpZmljYXRlIHdoaWNoIGhhcyB0byBiZSBkaXJlY3RseQotIyAgIHNpZ25lZCBieSBvdXIgQ0EgY2VydGlmaWNhdGUgaW4gY2EuY3J0Ci1TU0xWZXJpZnlDbGllbnQgcmVxdWlyZQotU1NMVmVyaWZ5RGVwdGggMQotU1NMQ0FDZXJ0aWZpY2F0ZUZpbGUgY29uZi9zc2wuY3J0L2NhLmNydAotCi08L3ByZT4KLTwvdGQ+Ci0gICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgIDwvdGQ+Ci0gICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgICA8dGQgY29sc3Bhbj0iNSIgYmdjb2xvcj0iI2NjY2NjYyI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgPC90cj4KLTwvdGFibGU+Ci08cD4KLTxsaT48YSBuYW1lPSJUb0M4Ij48L2E+Ci0gICAgPGEgbmFtZT0iYXV0aC1zZWxlY3RpdmUiPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJob3d0byI+Ci1Ib3cgY2FuIEkgYXV0aGVudGljYXRlIG15IGNsaWVudHMgZm9yIGEgcGFydGljdWxhciBVUkwgYmFzZWQgb24gY2VydGlmaWNhdGVzCi1idXQgc3RpbGwgYWxsb3cgYXJiaXRyYXJ5IGNsaWVudHMgdG8gYWNjZXNzIHRoZSByZW1haW5pbmcgcGFydHMgb2YgdGhlIHNlcnZlcj8KLTwvc3Ryb25nPiZuYnNwOyZuYnNwOwotICAgIFs8YSBocmVmPSJodHRwOi8vd3d3Lm1vZHNzbC5vcmcvZG9jcy8yLjgvc3NsX2hvd3RvLmh0bWwjYXV0aC1zZWxlY3RpdmUiPjxiPkw8L2I+PC9hPl0KLSAgICA8cD4KLUZvciB0aGlzIHdlIGFnYWluIHVzZSB0aGUgcGVyLWRpcmVjdG9yeSByZWNvbmZpZ3VyYXRpb24gZmVhdHVyZSBvZiBtb2Rfc3NsOgotPHA+Ci08dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHN1bW1hcnk9IiI+Ci0gICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSI4IiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICAgIDx0ZCByb3dzcGFuPSIzIj4mbmJzcDsmbmJzcDs8Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiIGNvbG9yPSIjOTk5OTk5Ij5odHRwZC5jb25mPC9mb250PiZuYnNwOyZuYnNwOzwvdGQ+Ci0gICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIGNvbHNwYW49IjIiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgY29sc3Bhbj0iMiI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSI1IiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICAgICA8dGQgYmdjb2xvcj0iI2ZmZmZmZiI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iNDAiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgICAgPHRkIGJnY29sb3I9IiNmZmZmZmYiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjMwMCIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSI1IiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICAgICA8dGQgY29sc3Bhbj0iMyIgYmdjb2xvcj0iI2ZmZmZmZiI+Ci0gICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjQiIHN1bW1hcnk9IiI+Ci0gICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgIDx0ZD4KLTxwcmU+Ci0KLVNTTFZlcmlmeUNsaWVudCBub25lCi1TU0xDQUNlcnRpZmljYXRlRmlsZSBjb25mL3NzbC5jcnQvY2EuY3J0Ci0mbHQ7TG9jYXRpb24gL3NlY3VyZS9hcmVhJmd0OwotU1NMVmVyaWZ5Q2xpZW50IHJlcXVpcmUKLVNTTFZlcmlmeURlcHRoIDEKLSZsdDsvTG9jYXRpb24mZ3Q7Ci0KLTwvcHJlPgotPC90ZD4KLSAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgPC90ZD4KLSAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICAgIDx0ZCBjb2xzcGFuPSI1IiBiZ2NvbG9yPSIjY2NjY2NjIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICA8L3RyPgotPC90YWJsZT4KLTxwPgotPGxpPjxhIG5hbWU9IlRvQzkiPjwvYT4KLSAgICA8YSBuYW1lPSJhdXRoLXBhcnRpY3VsYXIiPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJob3d0byI+Ci1Ib3cgY2FuIEkgYXV0aGVudGljYXRlIG9ubHkgcGFydGljdWxhciBjbGllbnRzIGZvciBhIHNvbWUgVVJMcyBiYXNlZAotb24gY2VydGlmaWNhdGVzIGJ1dCBzdGlsbCBhbGxvdyBhcmJpdHJhcnkgY2xpZW50cyB0byBhY2Nlc3MgdGhlIHJlbWFpbmluZwotcGFydHMgb2YgdGhlIHNlcnZlcj8KLTwvc3Ryb25nPiZuYnNwOyZuYnNwOwotICAgIFs8YSBocmVmPSJodHRwOi8vd3d3Lm1vZHNzbC5vcmcvZG9jcy8yLjgvc3NsX2hvd3RvLmh0bWwjYXV0aC1wYXJ0aWN1bGFyIj48Yj5MPC9iPjwvYT5dCi0gICAgPHA+Ci1UaGUga2V5IGlzIHRvIGNoZWNrIGZvciB2YXJpb3VzIGluZ3JlZGllbnRzIG9mIHRoZSBjbGllbnQgY2VydGZpY2F0ZS4gVXN1YWxseQotdGhpcyBtZWFucyB0byBjaGVjayB0aGUgd2hvbGUgb3IgcGFydCBvZiB0aGUgRGlzdGluZ3Vpc2hlZCBOYW1lIChETikgb2YgdGhlCi1TdWJqZWN0LiBGb3IgdGhpcyB0d28gbWV0aG9kcyBleGlzdHM6IFRoZSA8Y29kZT5tb2RfYXV0aDwvY29kZT4gYmFzZWQgdmFyaWFudAotYW5kIHRoZSA8Y29kZT5TU0xSZXF1aXJlPC9jb2RlPiB2YXJpYW50LiBUaGUgZmlyc3QgbWV0aG9kIGlzIGdvb2Qgd2hlbiB0aGUKLWNsaWVudHMgYXJlIG9mIHRvdGFsbHkgZGlmZmVyZW50IHR5cGUsIGkuZS4gd2hlbiB0aGVpciBETnMgaGF2ZSBubyBjb21tb24KLWZpZWxkcyAodXN1YWxseSB0aGUgb3JnYW5pc2F0aW9uLCBldGMuKS4gSW4gdGhpcyBjYXNlIHlvdSd2ZSB0byBlc3RhYmxpc2ggYQotcGFzc3dvcmQgZGF0YWJhc2UgY29udGFpbmluZyA8ZW0+YWxsPC9lbT4gY2xpZW50cy4gVGhlIHNlY29uZCBtZXRob2QgaXMgYmV0dGVyCi13aGVuIHlvdXIgY2xpZW50cyBhcmUgYWxsIHBhcnQgb2YgYSBjb21tb24gaGllcmFyY2h5IHdoaWNoIGlzIGVuY29kZWQgaW50byB0aGUKLUROLiBUaGVuIHlvdSBjYW4gbWF0Y2ggdGhlbSBtb3JlIGVhc2lseS4KLTxwPgotVGhlIGZpcnN0IG1ldGhvZDoKLTxwPgotPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBzdW1tYXJ5PSIiPgotICAgIDx0cj4KLSAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iOCIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgICA8dGQgcm93c3Bhbj0iMyI+Jm5ic3A7Jm5ic3A7PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIiBjb2xvcj0iIzk5OTk5OSI+L3Vzci9sb2NhbC9hcGFjaGUvY29uZi9odHRwZC5jb25mPC9mb250PiZuYnNwOyZuYnNwOzwvdGQ+Ci0gICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIGNvbHNwYW49IjIiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgY29sc3Bhbj0iMiI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSI1IiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICAgICA8dGQgYmdjb2xvcj0iI2ZmZmZmZiI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iNDAiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgICAgPHRkIGJnY29sb3I9IiNmZmZmZmYiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjMwMCIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSI1IiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICAgICA8dGQgY29sc3Bhbj0iMyIgYmdjb2xvcj0iI2ZmZmZmZiI+Ci0gICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjQiIHN1bW1hcnk9IiI+Ci0gICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgIDx0ZD4KLTxwcmU+Ci0KLVNTTFZlcmlmeUNsaWVudCAgICAgIG5vbmUKLSZsdDtEaXJlY3RvcnkgL3Vzci9sb2NhbC9hcGFjaGUvaHRkb2NzL3NlY3VyZS9hcmVhJmd0OwotU1NMVmVyaWZ5Q2xpZW50ICAgICAgcmVxdWlyZQotU1NMVmVyaWZ5RGVwdGggICAgICAgNQotU1NMQ0FDZXJ0aWZpY2F0ZUZpbGUgY29uZi9zc2wuY3J0L2NhLmNydAotU1NMQ0FDZXJ0aWZpY2F0ZVBhdGggY29uZi9zc2wuY3J0Ci1TU0xPcHRpb25zICAgICAgICAgICArRmFrZUJhc2ljQXV0aAotU1NMUmVxdWlyZVNTTAotQXV0aE5hbWUgICAgICAgICAgICAgIlNuYWtlIE9pbCBBdXRoZW50aWNhdGlvbiIKLUF1dGhUeXBlICAgICAgICAgICAgIEJhc2ljCi1BdXRoVXNlckZpbGUgICAgICAgICAvdXNyL2xvY2FsL2FwYWNoZS9jb25mL2h0dHBkLnBhc3N3ZAotcmVxdWlyZSAgICAgICAgICAgICAgdmFsaWQtdXNlcgotJmx0Oy9EaXJlY3RvcnkmZ3Q7Ci0KLTwvcHJlPgotPC90ZD4KLSAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgPC90ZD4KLSAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICAgIDx0ZCBjb2xzcGFuPSI1IiBiZ2NvbG9yPSIjY2NjY2NjIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICA8L3RyPgotPC90YWJsZT4KLTxwPgotPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBzdW1tYXJ5PSIiPgotICAgIDx0cj4KLSAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iOCIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgICA8dGQgcm93c3Bhbj0iMyI+Jm5ic3A7Jm5ic3A7PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIiBjb2xvcj0iIzk5OTk5OSI+L3Vzci9sb2NhbC9hcGFjaGUvY29uZi9odHRwZC5wYXNzd2Q8L2ZvbnQ+Jm5ic3A7Jm5ic3A7PC90ZD4KLSAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgY29sc3Bhbj0iMiI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIiBjb2xzcGFuPSIyIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjUiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZmZmZmZmIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSI0MCIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICAgICA8dGQgYmdjb2xvcj0iI2ZmZmZmZiI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMzAwIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjUiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIiBiZ2NvbG9yPSIjZmZmZmZmIj4KLSAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iNCIgc3VtbWFyeT0iIj4KLSAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgPHRkPgotPHByZT4KLQotL0M9REUvTD1NdW5pY2gvTz1TbmFrZSBPaWwsIEx0ZC4vT1U9U3RhZmYvQ049Rm9vOnh4ajMxWk1UWnprVkEKLS9DPVVTL0w9Uy5GLi9PPVNuYWtlIE9pbCwgTHRkLi9PVT1DQS9DTj1CYXI6eHhqMzFaTVRaemtWQQotL0M9VVMvTD1MLkEuL089U25ha2UgT2lsLCBMdGQuL09VPURldi9DTj1RdXV4Onh4ajMxWk1UWnprVkEKLQotPC9wcmU+Ci08L3RkPgotICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICA8L3RkPgotICAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgICAgPHRkIGNvbHNwYW49IjUiIGJnY29sb3I9IiNjY2NjY2MiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgIDwvdHI+Ci08L3RhYmxlPgotPHA+Ci1UaGUgc2Vjb25kIG1ldGhvZDoKLTxwPgotPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBzdW1tYXJ5PSIiPgotICAgIDx0cj4KLSAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iOCIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgICA8dGQgcm93c3Bhbj0iMyI+Jm5ic3A7Jm5ic3A7PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIiBjb2xvcj0iIzk5OTk5OSI+aHR0cGQuY29uZjwvZm9udD4mbmJzcDsmbmJzcDs8L3RkPgotICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIiBjb2xzcGFuPSIyIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIGNvbHNwYW49IjIiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iNSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgICAgPHRkIGJnY29sb3I9IiNmZmZmZmYiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjQwIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZmZmZmZmIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIzMDAiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iNSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgICAgPHRkIGNvbHNwYW49IjMiIGJnY29sb3I9IiNmZmZmZmYiPgotICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSI0IiBzdW1tYXJ5PSIiPgotICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICA8dGQ+Ci08cHJlPgotCi1TU0xWZXJpZnlDbGllbnQgICAgICBub25lCi0mbHQ7RGlyZWN0b3J5IC91c3IvbG9jYWwvYXBhY2hlL2h0ZG9jcy9zZWN1cmUvYXJlYSZndDsKLVNTTFZlcmlmeUNsaWVudCAgICAgIHJlcXVpcmUKLVNTTFZlcmlmeURlcHRoICAgICAgIDUKLVNTTENBQ2VydGlmaWNhdGVGaWxlIGNvbmYvc3NsLmNydC9jYS5jcnQKLVNTTENBQ2VydGlmaWNhdGVQYXRoIGNvbmYvc3NsLmNydAotU1NMT3B0aW9ucyAgICAgICAgICAgK0Zha2VCYXNpY0F1dGgKLVNTTFJlcXVpcmVTU0wKLVNTTFJlcXVpcmUgICAgICAgICAgICV7U1NMX0NMSUVOVF9TX0ROX099ICBlcSAiU25ha2UgT2lsLCBMdGQuIiBhbmQgXAotICAgICAgICAgICAgICAgICAgICAgJXtTU0xfQ0xJRU5UX1NfRE5fT1V9IGluIHsiU3RhZmYiLCAiQ0EiLCAiRGV2In0KLSZsdDsvRGlyZWN0b3J5Jmd0OwotCi08L3ByZT4KLTwvdGQ+Ci0gICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgIDwvdGQ+Ci0gICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgICA8dGQgY29sc3Bhbj0iNSIgYmdjb2xvcj0iI2NjY2NjYyI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgPC90cj4KLTwvdGFibGU+Ci08cD4KLTxsaT48YSBuYW1lPSJUb0MxMCI+PC9hPgotICAgIDxhIG5hbWU9ImF1dGgtaW50cmFuZXQiPjwvYT4KLSAgICA8c3Ryb25nIGlkPSJob3d0byI+IEhvdyBjYW4KLUkgcmVxdWlyZSBIVFRQUyB3aXRoIHN0cm9uZyBjaXBoZXJzIGFuZCBlaXRoZXIgYmFzaWMgYXV0aGVudGljYXRpb24gb3IgY2xpZW50Ci1jZXJ0aWZpY2F0ZXMgZm9yIGFjY2VzcyB0byBhIHN1YmFyZWEgb24gdGhlIEludHJhbmV0IHdlYnNpdGUgZm9yIGNsaWVudHMKLWNvbWluZyBmcm9tIHRoZSBJbnRlcm5ldCBidXQgc3RpbGwgYWxsb3cgcGxhaW4gSFRUUCBhY2Nlc3MgZm9yIGNsaWVudHMgb24gdGhlCi1JbnRyYW5ldD8KLTwvc3Ryb25nPiZuYnNwOyZuYnNwOwotICAgIFs8YSBocmVmPSJodHRwOi8vd3d3Lm1vZHNzbC5vcmcvZG9jcy8yLjgvc3NsX2hvd3RvLmh0bWwjYXV0aC1pbnRyYW5ldCI+PGI+TDwvYj48L2E+XQotICAgIDxwPgotTGV0IHVzIGFzc3VtZSB0aGUgSW50cmFuZXQgY2FuIGJlIGRpc3Rpbmd1aXNoZWQgdGhyb3VnaCB0aGUgSVAgbmV0d29yawotMTkyLjE2MC4xLjAvMjQgYW5kIHRoZSBzdWJhcmVhIG9uIHRoZSBJbnRyYW5ldCB3ZWJzaXRlIGhhcyB0aGUgVVJMCi08dHQ+L3N1YmFyZWE8L3R0Pi4gVGhlbiBjb25maWd1cmUgdGhlIGZvbGxvd2luZyBvdXRzaWRlIHlvdXIgSFRUUFMgdmlydHVhbAotaG9zdCAoc28gaXQgYXBwbGllcyB0byBib3RoIEhUVFBTIGFuZCBIVFRQKToKLTxwPgotPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBzdW1tYXJ5PSIiPgotICAgIDx0cj4KLSAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iOCIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgICA8dGQgcm93c3Bhbj0iMyI+Jm5ic3A7Jm5ic3A7PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIiBjb2xvcj0iIzk5OTk5OSI+aHR0cGQuY29uZjwvZm9udD4mbmJzcDsmbmJzcDs8L3RkPgotICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGltZyBzcmM9InNzbF90ZW1wbGF0ZS5pbWdkb3QtMXgxLXRyYW5zcC5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIiBjb2xzcGFuPSIyIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIGNvbHNwYW49IjIiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iNSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgICAgPHRkIGJnY29sb3I9IiNmZmZmZmYiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjQwIiBoZWlnaHQ9IjEiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCI+PC90ZD4KLSAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZmZmZmZmIj48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtdHJhbnNwLmdpZiIgYWx0PSIiIHdpZHRoPSIzMDAiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iNSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgICAgPHRkIGNvbHNwYW49IjMiIGJnY29sb3I9IiNmZmZmZmYiPgotICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSI0IiBzdW1tYXJ5PSIiPgotICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICA8dGQ+Ci08cHJlPgotCi1TU0xDQUNlcnRpZmljYXRlRmlsZSBjb25mL3NzbC5jcnQvY29tcGFueS1jYS5jcnQKLQotJmx0O0RpcmVjdG9yeSAvdXNyL2xvY2FsL2FwYWNoZS9odGRvY3MmZ3Q7Ci0jICAgT3V0c2lkZSB0aGUgc3ViYXJlYSBvbmx5IEludHJhbmV0IGFjY2VzcyBpcyBncmFudGVkCi1PcmRlciAgICAgICAgICAgICAgICBkZW55LGFsbG93Ci1EZW55ICAgICAgICAgICAgICAgICBmcm9tIGFsbAotQWxsb3cgICAgICAgICAgICAgICAgZnJvbSAxOTIuMTY4LjEuMC8yNAotJmx0Oy9EaXJlY3RvcnkmZ3Q7Ci0KLSZsdDtEaXJlY3RvcnkgL3Vzci9sb2NhbC9hcGFjaGUvaHRkb2NzL3N1YmFyZWEmZ3Q7Ci0jICAgSW5zaWRlIHRoZSBzdWJhcmVhIGFueSBJbnRyYW5ldCBhY2Nlc3MgaXMgYWxsb3dlZAotIyAgIGJ1dCBmcm9tIHRoZSBJbnRlcm5ldCBvbmx5IEhUVFBTICsgU3Ryb25nLUNpcGhlciArIFBhc3N3b3JkCi0jICAgb3IgdGhlIGFsdGVybmF0aXZlIEhUVFBTICsgU3Ryb25nLUNpcGhlciArIENsaWVudC1DZXJ0aWZpY2F0ZQotCi0jICAgSWYgSFRUUFMgaXMgdXNlZCwgbWFrZSBzdXJlIGEgc3Ryb25nIGNpcGhlciBpcyB1c2VkLgotIyAgIEFkZGl0aW9uYWxseSBhbGxvdyBjbGllbnQgY2VydHMgYXMgYWx0ZXJuYXRpdmUgdG8gYmFzaWMgYXV0aC4KLVNTTFZlcmlmeUNsaWVudCAgICAgIG9wdGlvbmFsCi1TU0xWZXJpZnlEZXB0aCAgICAgICAxCi1TU0xPcHRpb25zICAgICAgICAgICArRmFrZUJhc2ljQXV0aCArU3RyaWN0UmVxdWlyZQotU1NMUmVxdWlyZSAgICAgICAgICAgJXtTU0xfQ0lQSEVSX1VTRUtFWVNJWkV9ICZndDs9IDEyOAotCi0jICAgRm9yY2UgY2xpZW50cyBmcm9tIHRoZSBJbnRlcm5ldCB0byB1c2UgSFRUUFMKLVJld3JpdGVFbmdpbmUgICAgICAgIG9uCi1SZXdyaXRlQ29uZCAgICAgICAgICAle1JFTU9URV9BRERSfSAhXjE5MlwuMTY4XC4xXC5bMC05XSskCi1SZXdyaXRlQ29uZCAgICAgICAgICAle0hUVFBTfSAhPW9uCi1SZXdyaXRlUnVsZSAgICAgICAgICAuKiAtIFtGXQotCi0jICAgQWxsb3cgTmV0d29yayBBY2Nlc3MgYW5kL29yIEJhc2ljIEF1dGgKLVNhdGlzZnkgICAgICAgICAgICAgIGFueQotCi0jICAgTmV0d29yayBBY2Nlc3MgQ29udHJvbAotT3JkZXIgICAgICAgICAgICAgICAgZGVueSxhbGxvdwotRGVueSAgICAgICAgICAgICAgICAgZnJvbSBhbGwKLUFsbG93ICAgICAgICAgICAgICAgIDE5Mi4xNjguMS4wLzI0Ci0KLSMgICBIVFRQIEJhc2ljIEF1dGhlbnRpY2F0aW9uCi1BdXRoVHlwZSAgICAgICAgICAgICBiYXNpYwotQXV0aE5hbWUgICAgICAgICAgICAgIlByb3RlY3RlZCBJbnRyYW5ldCBBcmVhIgotQXV0aFVzZXJGaWxlICAgICAgICAgY29uZi9wcm90ZWN0ZWQucGFzc3dkCi1SZXF1aXJlICAgICAgICAgICAgICB2YWxpZC11c2VyCi0mbHQ7L0RpcmVjdG9yeSZndDsKLQotPC9wcmU+Ci08L3RkPgotICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICA8L3RkPgotICAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgICAgPHRkIGNvbHNwYW49IjUiIGJnY29sb3I9IiNjY2NjY2MiPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgIDwvdHI+Ci08L3RhYmxlPgotPC91bD4KLSAgICAgIDxwPgotICAgICAgPGJyPgotICAgICAgPHRhYmxlIHN1bW1hcnk9IiI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICAgPHRhYmxlIHdpZHRoPSI2MDAiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLSAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCIgd2lkdGg9IjI1MCI+Ci08YSBocmVmPSJzc2xfY29tcGF0Lmh0bWwiIG9ubW91c2VvdmVyPSJyb19pbWdPdmVyKCdyb19pbWdfcHJldl9ib3QnLCAncHJldmlvdXMgcGFnZScpOyByZXR1cm4gdHJ1ZSIgb25tb3VzZW91dD0icm9faW1nTm9ybWFsKCdyb19pbWdfcHJldl9ib3QnKTsgcmV0dXJuIHRydWUiIG9uZm9jdXM9InJvX2ltZ092ZXIoJ3JvX2ltZ19wcmV2X2JvdCcsICdwcmV2aW91cyBwYWdlJyk7IHJldHVybiB0cnVlIiBvbmJsdXI9InJvX2ltZ05vcm1hbCgncm9faW1nX3ByZXZfYm90Jyk7IHJldHVybiB0cnVlIj48aW1nIG5hbWU9InJvX2ltZ19wcmV2X2JvdCIgc3JjPSJzc2xfdGVtcGxhdGUubmF2YnV0LXByZXYtbi5naWYiIGFsdD0icHJldmlvdXMgcGFnZSIgd2lkdGg9IjcwIiBoZWlnaHQ9IjE4IiBib3JkZXI9IjAiPjwvYT48YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPkNvbXBhdGliaWxpdHk8L2ZvbnQ+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0icmlnaHQiIHdpZHRoPSIyNTAiPgotPGEgaHJlZj0ic3NsX2ZhcS5odG1sIiBvbm1vdXNlb3Zlcj0icm9faW1nT3Zlcigncm9faW1nX25leHRfYm90JywgJ25leHQgcGFnZScpOyByZXR1cm4gdHJ1ZSIgb25tb3VzZW91dD0icm9faW1nTm9ybWFsKCdyb19pbWdfbmV4dF9ib3QnKTsgcmV0dXJuIHRydWUiIG9uZm9jdXM9InJvX2ltZ092ZXIoJ3JvX2ltZ19uZXh0X2JvdCcsICduZXh0IHBhZ2UnKTsgcmV0dXJuIHRydWUiIG9uYmx1cj0icm9faW1nTm9ybWFsKCdyb19pbWdfbmV4dF9ib3QnKTsgcmV0dXJuIHRydWUiPjxpbWcgbmFtZT0icm9faW1nX25leHRfYm90IiBzcmM9InNzbF90ZW1wbGF0ZS5uYXZidXQtbmV4dC1uLmdpZiIgYWx0PSJuZXh0IHBhZ2UiIHdpZHRoPSI3MCIgaGVpZ2h0PSIxOCIgYm9yZGVyPSIwIj48L2E+PGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj5GLkEuUS4gTGlzdDwvZm9udD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS0wMDAwMDAuZ2lmIiBhbHQ9IiIgd2lkdGg9IjYwMCIgaGVpZ2h0PSIyIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+PHRhYmxlIHdpZHRoPSI1OTgiIHN1bW1hcnk9IiI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48Zm9udCBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPgotICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm1vZHNzbC5vcmcvIj5tb2Rfc3NsPC9hPiAyLjgsIFVzZXIgTWFudWFsPGJyPgotICAgICAgICBUaGUgQXBhY2hlIEludGVyZmFjZSB0byBPcGVuU1NMCi0gICAgICAgIDwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj4KLSAgICAgICAgQ29weXJpZ2h0ICZjb3B5OyAxOTk4LTIwMDEKLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5lbmdlbHNjaGFsbC5jb20vIj5SYWxmIFMuIEVuZ2Vsc2NoYWxsPC9hPjxicj4KLSAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZDxicj4KLSAgICAgICAgPC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gIDwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvc3NsL3NzbF9pbnRyby5odG1sIGIvZG9jcy9tYW51YWwvc3NsL3NzbF9pbnRyby5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWU4MDVmLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL3NzbC9zc2xfaW50cm8uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkxOSArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPm1vZF9zc2w6IEludHJvZHVjdGlvbjwvdGl0bGU+Ci0KLTwhLS0KLSAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgUmFsZiBTLiBFbmdlbHNjaGFsbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gIGFyZSBtZXQ6Ci0KLSAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQotICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICAgICBkaXNjbGFpbWVyLiAKLSAKLSAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLSAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotIAotICAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6IAotICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLSAgICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+IGZvciB1c2UgaW4gdGhlCi0gICAgICBtb2Rfc3NsIHByb2plY3QgKGh0dHA6Ly93d3cubW9kc3NsLm9yZy8pLiIKLSAKLSAgNC4gVGhlIG5hbWUgIm1vZF9zc2wiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICAgICBwZXJtaXNzaW9uLiAgCi0KLSAgNS4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlCi0gICAgIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi0gICAgICBSYWxmIFMuIEVuZ2Vsc2NoYWxsIDxyc2VAZW5nZWxzY2hhbGwuY29tPiBmb3IgdXNlIGluIHRoZQotICAgICAgbW9kX3NzbCBwcm9qZWN0IChodHRwOi8vd3d3Lm1vZHNzbC5vcmcvKS4iCi0gCi0gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgUkFMRiBTLiBFTkdFTFNDSEFMTCBgYEFTIElTJycgQU5EIEFOWQotICBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgUkFMRiBTLiBFTkdFTFNDSEFMTCBPUgotICBISVMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLS0+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhLS0KLUE6bGluayB7Ci0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotICAgIGNvbG9yOiAjNjY2NmNjOwotfQotQTphY3RpdmUgewotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSAgICBjb2xvcjogIzY2NjZjYzsKLX0KLUE6dmlzaXRlZCB7Ci0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotICAgIGNvbG9yOiAjNjY2NmNjOwotfQotI3NmIHsKLSAgICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhOwotICAgIGZvbnQtdmFyaWFudDogbm9ybWFsOwotICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLUgxIHsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICBmb250LXNpemU6IDI0cHQ7Ci0gICAgbGluZS1oZWlnaHQ6IDI0cHQ7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYTsKLSAgICBmb250LXZhcmlhbnQ6IG5vcm1hbDsKLSAgICBmb250LXN0eWxlOiBub3JtYWw7Ci19Ci1IMiB7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgZm9udC1zaXplOiAxOHB0OwotICAgIGxpbmUtaGVpZ2h0OiAxOHB0OwotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCxoZWx2ZXRpY2E7Ci0gICAgZm9udC12YXJpYW50OiBub3JtYWw7Ci0gICAgZm9udC1zdHlsZTogbm9ybWFsOwotfQotSDMgewotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgIGZvbnQtc2l6ZTogMTRwdDsKLSAgICBsaW5lLWhlaWdodDogMTRwdDsKLSAgICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhOwotICAgIGZvbnQtdmFyaWFudDogbm9ybWFsOwotICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLUg0IHsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICBmb250LXNpemU6IDEycHQ7Ci0gICAgbGluZS1oZWlnaHQ6IDEycHQ7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYTsKLSAgICBmb250LXZhcmlhbnQ6IG5vcm1hbDsKLSAgICBmb250LXN0eWxlOiBub3JtYWw7Ci19Ci0jSCB7Ci19Ci0jRCB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDsKLX0KLSNmYXEgewotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgIGZvbnQtc2l6ZTogMTZwdDsKLSAgICBsaW5lLWhlaWdodDogMTZwdDsKLSAgICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhOwotICAgIGZvbnQtdmFyaWFudDogbm9ybWFsOwotICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLSNob3d0byB7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgZm9udC1zaXplOiAxNnB0OwotICAgIGxpbmUtaGVpZ2h0OiAxNnB0OwotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCxoZWx2ZXRpY2E7Ci0gICAgZm9udC12YXJpYW50OiBub3JtYWw7Ci0gICAgZm9udC1zdHlsZTogbm9ybWFsOwotfQotI3Rlcm0gewotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgIGZvbnQtc2l6ZTogMTZwdDsKLSAgICBsaW5lLWhlaWdodDogMTZwdDsKLSAgICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhOwotICAgIGZvbnQtdmFyaWFudDogbm9ybWFsOwotICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLS0tPjwvc3R5bGU+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotPCEtLSBIaWRpbmcgdGhlIGNvZGUKLWZ1bmN0aW9uIHJvX2ltZ05vcm1hbChpbWdOYW1lKSB7Ci0gICAgaWYgKGRvY3VtZW50LmltYWdlcykgewotICAgICAgICBkb2N1bWVudFtpbWdOYW1lXS5zcmMgPSBldmFsKGltZ05hbWUgKyAnX24uc3JjJyk7Ci0gICAgICAgIHNlbGYuc3RhdHVzID0gJyc7Ci0gICAgfQotfQotZnVuY3Rpb24gcm9faW1nT3ZlcihpbWdOYW1lLCBkZXNjcmlwdCkgewotICAgIGlmIChkb2N1bWVudC5pbWFnZXMpIHsKLSAgICAgICAgZG9jdW1lbnRbaW1nTmFtZV0uc3JjID0gZXZhbChpbWdOYW1lICsgJ19vLnNyYycpOwotICAgICAgICBzZWxmLnN0YXR1cyA9IGRlc2NyaXB0OwotICAgIH0KLX0KLS8vIGRvbmUgaGlkaW5nIC0tPgotPC9zY3JpcHQ+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotPCEtLSBIaWRpbmcgdGhlIGNvZGUKLWlmIChkb2N1bWVudC5pbWFnZXMpIHsKLSAgICByb19pbWdfcHJldl90b3BfbiA9IG5ldyBJbWFnZSgpOwotICAgIHJvX2ltZ19wcmV2X3RvcF9uLnNyYyA9ICdzc2xfdGVtcGxhdGUubmF2YnV0LXByZXYtbi5naWYnOwotICAgIHJvX2ltZ19wcmV2X3RvcF9vID0gbmV3IEltYWdlKCk7Ci0gICAgcm9faW1nX3ByZXZfdG9wX28uc3JjID0gJ3NzbF90ZW1wbGF0ZS5uYXZidXQtcHJldi1zLmdpZic7Ci19Ci0vLyBkb25lIGhpZGluZyAtLT4KLTwvc2NyaXB0PgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhLS0gSGlkaW5nIHRoZSBjb2RlCi1pZiAoZG9jdW1lbnQuaW1hZ2VzKSB7Ci0gICAgcm9faW1nX3ByZXZfYm90X24gPSBuZXcgSW1hZ2UoKTsKLSAgICByb19pbWdfcHJldl9ib3Rfbi5zcmMgPSAnc3NsX3RlbXBsYXRlLm5hdmJ1dC1wcmV2LW4uZ2lmJzsKLSAgICByb19pbWdfcHJldl9ib3RfbyA9IG5ldyBJbWFnZSgpOwotICAgIHJvX2ltZ19wcmV2X2JvdF9vLnNyYyA9ICdzc2xfdGVtcGxhdGUubmF2YnV0LXByZXYtcy5naWYnOwotfQotLy8gZG9uZSBoaWRpbmcgLS0+Ci08L3NjcmlwdD4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci08IS0tIEhpZGluZyB0aGUgY29kZQotaWYgKGRvY3VtZW50LmltYWdlcykgewotICAgIHJvX2ltZ19uZXh0X3RvcF9uID0gbmV3IEltYWdlKCk7Ci0gICAgcm9faW1nX25leHRfdG9wX24uc3JjID0gJ3NzbF90ZW1wbGF0ZS5uYXZidXQtbmV4dC1uLmdpZic7Ci0gICAgcm9faW1nX25leHRfdG9wX28gPSBuZXcgSW1hZ2UoKTsKLSAgICByb19pbWdfbmV4dF90b3Bfby5zcmMgPSAnc3NsX3RlbXBsYXRlLm5hdmJ1dC1uZXh0LXMuZ2lmJzsKLX0KLS8vIGRvbmUgaGlkaW5nIC0tPgotPC9zY3JpcHQ+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotPCEtLSBIaWRpbmcgdGhlIGNvZGUKLWlmIChkb2N1bWVudC5pbWFnZXMpIHsKLSAgICByb19pbWdfbmV4dF9ib3RfbiA9IG5ldyBJbWFnZSgpOwotICAgIHJvX2ltZ19uZXh0X2JvdF9uLnNyYyA9ICdzc2xfdGVtcGxhdGUubmF2YnV0LW5leHQtbi5naWYnOwotICAgIHJvX2ltZ19uZXh0X2JvdF9vID0gbmV3IEltYWdlKCk7Ci0gICAgcm9faW1nX25leHRfYm90X28uc3JjID0gJ3NzbF90ZW1wbGF0ZS5uYXZidXQtbmV4dC1zLmdpZic7Ci19Ci0vLyBkb25lIGhpZGluZyAtLT4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiIgdGV4dD0iIzAwMDAwMCIgbGluaz0iIzMzMzM5OSIgYWxpbms9IiM5OTk5ZmYiIHZsaW5rPSIjMDAwMDY2Ij4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08dGFibGUgd2lkdGg9IjYwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+Ci0gIDx0ZD4KLSAgICAgIDxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaW1nZG90LTF4MS10cmFuc3AuZ2lmIiBhbHQ9IiIgd2lkdGg9IjYwMCIgaGVpZ2h0PSIxIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiPjxicj4KLSAgICAgIDx0YWJsZSB3aWR0aD0iNjAwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHN1bW1hcnk9IiI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI2MDAiIHN1bW1hcnk9IiI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgICAgPGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIiBzaXplPSIrMiI+PGI+bW9kX3NzbDwvYj48L2ZvbnQ+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+Ci0gICAgICAgICAgICAgIDxpbWcgc3JjPSJzc2xfdGVtcGxhdGUuaGVhZC1jaGFwdGVyLmdpZiIgYWx0PSJDaGFwdGVyIiB3aWR0aD0iMTc1IiBoZWlnaHQ9Ijk0Ij4gPGltZyBzcmM9InNzbF90ZW1wbGF0ZS5oZWFkLW51bS0yLmdpZiIgYWx0PSIyIiB3aWR0aD0iNzQiIGhlaWdodD0iODkiPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtMDAwMDAwLmdpZiIgYWx0PSIiIHdpZHRoPSI2MDAiIGhlaWdodD0iMiIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPgotICAgICAgICAgICA8dGFibGUgd2lkdGg9IjYwMCIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0IiB3aWR0aD0iMjUwIj4KLTxhIGhyZWY9InNzbF9vdmVydmlldy5odG1sIiBvbm1vdXNlb3Zlcj0icm9faW1nT3Zlcigncm9faW1nX3ByZXZfdG9wJywgJ3ByZXZpb3VzIHBhZ2UnKTsgcmV0dXJuIHRydWUiIG9ubW91c2VvdXQ9InJvX2ltZ05vcm1hbCgncm9faW1nX3ByZXZfdG9wJyk7IHJldHVybiB0cnVlIiBvbmZvY3VzPSJyb19pbWdPdmVyKCdyb19pbWdfcHJldl90b3AnLCAncHJldmlvdXMgcGFnZScpOyByZXR1cm4gdHJ1ZSIgb25ibHVyPSJyb19pbWdOb3JtYWwoJ3JvX2ltZ19wcmV2X3RvcCcpOyByZXR1cm4gdHJ1ZSI+PGltZyBuYW1lPSJyb19pbWdfcHJldl90b3AiIHNyYz0ic3NsX3RlbXBsYXRlLm5hdmJ1dC1wcmV2LW4uZ2lmIiBhbHQ9InByZXZpb3VzIHBhZ2UiIHdpZHRoPSI3MCIgaGVpZ2h0PSIxOCIgYm9yZGVyPSIwIj48L2E+PGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj5PdmVydmlldzwvZm9udD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJyaWdodCIgd2lkdGg9IjI1MCI+Ci08YSBocmVmPSJzc2xfcmVmZXJlbmNlLmh0bWwiIG9ubW91c2VvdmVyPSJyb19pbWdPdmVyKCdyb19pbWdfbmV4dF90b3AnLCAnbmV4dCBwYWdlJyk7IHJldHVybiB0cnVlIiBvbm1vdXNlb3V0PSJyb19pbWdOb3JtYWwoJ3JvX2ltZ19uZXh0X3RvcCcpOyByZXR1cm4gdHJ1ZSIgb25mb2N1cz0icm9faW1nT3Zlcigncm9faW1nX25leHRfdG9wJywgJ25leHQgcGFnZScpOyByZXR1cm4gdHJ1ZSIgb25ibHVyPSJyb19pbWdOb3JtYWwoJ3JvX2ltZ19uZXh0X3RvcCcpOyByZXR1cm4gdHJ1ZSI+PGltZyBuYW1lPSJyb19pbWdfbmV4dF90b3AiIHNyYz0ic3NsX3RlbXBsYXRlLm5hdmJ1dC1uZXh0LW4uZ2lmIiBhbHQ9Im5leHQgcGFnZSIgd2lkdGg9IjcwIiBoZWlnaHQ9IjE4IiBib3JkZXI9IjAiPjwvYT48YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPlJlZmVyZW5jZTwvZm9udD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPgotICAgICAgICAgIDxicj4KLSAgICAgICAgICA8aW1nIHNyYz0ic3NsX3RlbXBsYXRlLnRpdGxlLWludHJvLmdpZiIgYWx0PSJJbnRyb2R1Y3Rpb24iIHdpZHRoPSI0NTYiIGhlaWdodD0iNjAiPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci08ZGl2IGFsaWduPSJyaWdodCI+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iNDAwIiBzdW1tYXJ5PSIiPgotPHRyPgotPHRkPgotPGVtPgotYGBUaGUgbmljZSB0aGluZyBhYm91dCBzdGFuZGFyZHMgaXMgdGhhdCB0aGVyZSBhcmUgc28gbWFueSB0byBjaG9vc2UgZnJvbS4KLUFuZCBpZiB5b3UgcmVhbGx5IGRvbid0IGxpa2UgYWxsIHRoZSBzdGFuZGFyZHMgeW91IGp1c3QgaGF2ZSB0byB3YWl0IGFub3RoZXIKLXllYXIgdW50aWwgdGhlIG9uZSBhcmlzZXMgeW91IGFyZSBsb29raW5nIGZvci4nJwotPC9lbT4KLTwvdGQ+Ci08L3RyPgotPHRyPgotPHRkIGFsaWduPSJyaWdodCI+Ci08Zm9udCBzaXplPSItMSI+Ci1BLiBUYW5lbmJhdW0sIGBgSW50cm9kdWN0aW9uIHRvIENvbXB1dGVyIE5ldHdvcmtzJycKLTwvZm9udD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPHA+Ci08dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHIgdmFsaWduPSJib3R0b20iPgotPHRkPgotPGltZyBzcmM9InNzbF9pbnRyby5nZm9udDAwMC5naWYiIGFsdD0iQSIgd2lkdGg9IjM3IiBoZWlnaHQ9IjM1IiBib3JkZXI9IjAiIGFsaWduPSJsZWZ0Ij4KLXMgYW4gaW50cm9kdWN0aW9uIHRoaXMgY2hhcHRlciBpcyBhaW1lZCBhdCByZWFkZXJzIHdobyBhcmUgZmFtaWxpYXIKLXdpdGggdGhlIFdlYiwgSFRUUCwgYW5kIEFwYWNoZSwgYnV0IGFyZSBub3Qgc2VjdXJpdHkgZXhwZXJ0cy4gSXQgaXMgbm90Ci1pbnRlbmRlZCB0byBiZSBhIGRlZmluaXRpdmUgZ3VpZGUgdG8gdGhlIFNTTCBwcm90b2NvbCwgbm9yIGRvZXMgaXQgZGlzY3Vzcwotc3BlY2lmaWMgdGVjaG5pcXVlcyBmb3IgbWFuYWdpbmcgY2VydGlmaWNhdGVzIGluIGFuIG9yZ2FuaXphdGlvbiwgb3IgdGhlCi1pbXBvcnRhbnQgbGVnYWwgaXNzdWVzIG9mIHBhdGVudHMgYW5kIGltcG9ydCBhbmQgZXhwb3J0IHJlc3RyaWN0aW9ucy4gUmF0aGVyLAotaXQgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBhIGNvbW1vbiBiYWNrZ3JvdW5kIHRvIG1vZF9zc2wgdXNlcnMgYnkgcHVsbGluZwotdG9nZXRoZXIgdmFyaW91cyBjb25jZXB0cywgZGVmaW5pdGlvbnMsIGFuZCBleGFtcGxlcyBhcyBhIHN0YXJ0aW5nIHBvaW50IGZvcgotZnVydGhlciBleHBsb3JhdGlvbi4KLTxwPgotVGhlIHByZXNlbnRlZCBjb250ZW50IGlzIG1haW5seSBkZXJpdmVkLCB3aXRoIHBlcm1pc3Npb24gYnkgdGhlIGF1dGhvciwgZnJvbQotdGhlIGFydGljbGUgPGEKLWhyZWY9Imh0dHA6Ly93d3cudWx0cmFuZXQuY29tL35maGlyc2NoL1BhcGVycy93d3dqL2luZGV4Lmh0bWwiPjxlbT5JbnRyb2R1Y2luZyBTU0wKLWFuZCBDZXJ0aWZpY2F0ZXMgdXNpbmcgU1NMZWF5PC9lbT48L2E+IGZyb20gPGEKLWhyZWY9Imh0dHA6Ly93d3cudWx0cmFuZXQuY29tL35maGlyc2NoLyI+RnJlZGVyaWNrIEouIEhpcnNjaDwvYT4sIG9mIFRoZSBPcGVuCi1Hcm91cCBSZXNlYXJjaCBJbnN0aXR1dGUsIHdoaWNoIHdhcyBwdWJsaXNoZWQgaW4gPGEKLWhyZWY9Imh0dHA6Ly93d3cub3JhLmNvbS9jYXRhbG9nL3dqc3VtOTcvIj48ZW0+V2ViIFNlY3VyaXR5OiBBIE1hdHRlciBvZgotVHJ1c3Q8L2VtPjwvYT4sIFdvcmxkIFdpZGUgV2ViIEpvdXJuYWwsIFZvbHVtZSAyLCBJc3N1ZSAzLCBTdW1tZXIgMTk5Ny4KLVBsZWFzZSBzZW5kIGFueSBwb3N0aXZlIGZlZWRiYWNrIHRvIDxhCi1ocmVmPSJtYWlsdG86ZmpoQGFsdW0ubWl0LmVkdSI+RnJlZGVyaWNrIEhpcnNjaDwvYT4gKHRoZSBvcmlnaW5hbAotYXJ0aWNsZSBhdXRob3IpIGFuZCBhbGwgbmVnYXRpdmUgZmVlZGJhY2sgdG8gPGEKLWhyZWY9Im1haWx0bzpyc2VAZW5nZWxzY2hhbGwuY29tIj5SYWxmIFMuIEVuZ2Vsc2NoYWxsPC9hPiAodGhlIG1vZF9zc2wKLWF1dGhvcikuCi08L3RkPgotPHRkPgotJm5ic3A7Jm5ic3A7Ci08L3RkPgotPHRkPgotPGRpdiBhbGlnbj0icmlnaHQiPgotPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSIgYm9yZGVyPSIwIiBiZ2NvbG9yPSIjY2NjY2ZmIiBzdW1tYXJ5PSIiPgotPHRyPgotPHRkIGJnY29sb3I9IiMzMzMzOTkiPgotPGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIiBjb2xvcj0iI2NjY2NmZiI+Ci08Yj5UYWJsZSBPZiBDb250ZW50czwvYj4KLTwvZm9udD4KLTwvdGQ+Ci08L3RyPgotPHRyPgotPHRkPgotPGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIiBzaXplPSItMSI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DMSI+PHN0cm9uZz5DcnlwdG9ncmFwaGljIFRlY2huaXF1ZXM8L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzIiPjxzdHJvbmc+Q3J5cHRvZ3JhcGhpYyBBbGdvcml0aG1zPC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0MzIj48c3Ryb25nPk1lc3NhZ2UgRGlnZXN0czwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DNCI+PHN0cm9uZz5EaWdpdGFsIFNpZ25hdHVyZXM8L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzUiPjxzdHJvbmc+Q2VydGlmaWNhdGVzPC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0M2Ij48c3Ryb25nPkNlcnRpZmljYXRlIENvbnRlbnRzPC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0M3Ij48c3Ryb25nPkNlcnRpZmljYXRlIEF1dGhvcml0aWVzPC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0M4Ij48c3Ryb25nPkNlcnRpZmljYXRlIENoYWluczwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DOSI+PHN0cm9uZz5DcmVhdGluZyBhIFJvb3QtTGV2ZWwgQ0E8L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzEwIj48c3Ryb25nPkNlcnRpZmljYXRlIE1hbmFnZW1lbnQ8L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzExIj48c3Ryb25nPlNlY3VyZSBTb2NrZXRzIExheWVyIChTU0wpPC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0MxMiI+PHN0cm9uZz5TZXNzaW9uIEVzdGFibGlzaG1lbnQ8L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzEzIj48c3Ryb25nPktleSBFeGNoYW5nZSBNZXRob2Q8L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzE0Ij48c3Ryb25nPkNpcGhlciBmb3IgRGF0YSBUcmFuc2Zlcjwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DMTUiPjxzdHJvbmc+RGlnZXN0IEZ1bmN0aW9uPC9zdHJvbmc+PC9hPjxicj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiNUb0MxNiI+PHN0cm9uZz5IYW5kc2hha2UgU2VxdWVuY2UgUHJvdG9jb2w8L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzE3Ij48c3Ryb25nPkRhdGEgVHJhbnNmZXI8L3N0cm9uZz48L2E+PGJyPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI1RvQzE4Ij48c3Ryb25nPlNlY3VyaW5nIEhUVFAgQ29tbXVuaWNhdGlvbjwvc3Ryb25nPjwvYT48YnI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjVG9DMTkiPjxzdHJvbmc+UmVmZXJlbmNlczwvc3Ryb25nPjwvYT48YnI+Ci08L2ZvbnQ+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTxoMj48YSBuYW1lPSJUb0MxIj5DcnlwdG9ncmFwaGljIFRlY2huaXF1ZXM8L2E+PC9oMj4KLVVuZGVyc3RhbmRpbmcgU1NMIHJlcXVpcmVzIGFuIHVuZGVyc3RhbmRpbmcgb2YgY3J5cHRvZ3JhcGhpYyBhbGdvcml0aG1zLAotbWVzc2FnZSBkaWdlc3QgZnVuY3Rpb25zIChha2EuIG9uZS13YXkgb3IgaGFzaCBmdW5jdGlvbnMpLCBhbmQgZGlnaXRhbAotc2lnbmF0dXJlcy4gVGhlc2UgdGVjaG5pcXVlcyBhcmUgdGhlIHN1YmplY3Qgb2YgZW50aXJlIGJvb2tzIChzZWUgZm9yIGluc3RhbmNlCi1bPGEgaHJlZj0iI0FDOTYiPkFDOTY8L2E+XSkgYW5kIHByb3ZpZGUgdGhlIGJhc2lzIGZvciBwcml2YWN5LCBpbnRlZ3JpdHksIGFuZAotYXV0aGVudGljYXRpb24uCi08aDM+PGEgbmFtZT0iVG9DMiI+Q3J5cHRvZ3JhcGhpYyBBbGdvcml0aG1zPC9hPjwvaDM+Ci1TdXBwb3NlIEFsaWNlIHdhbnRzIHRvIHNlbmQgYSBtZXNzYWdlIHRvIGhlciBiYW5rIHRvIHRyYW5zZmVyIHNvbWUgbW9uZXkuCi1BbGljZSB3b3VsZCBsaWtlIHRoZSBtZXNzYWdlIHRvIGJlIHByaXZhdGUsIHNpbmNlIGl0IHdpbGwgaW5jbHVkZSBpbmZvcm1hdGlvbgotc3VjaCBhcyBoZXIgYWNjb3VudCBudW1iZXIgYW5kIHRyYW5zZmVyIGFtb3VudC4gT25lIHNvbHV0aW9uIGlzIHRvIHVzZSBhCi1jcnlwdG9ncmFwaGljIGFsZ29yaXRobSwgYSB0ZWNobmlxdWUgdGhhdCB3b3VsZCB0cmFuc2Zvcm0gaGVyIG1lc3NhZ2UgaW50byBhbgotZW5jcnlwdGVkIGZvcm0sIHVucmVhZGFibGUgZXhjZXB0IGJ5IHRob3NlIGl0IGlzIGludGVuZGVkIGZvci4gT25jZSBpbiB0aGlzCi1mb3JtLCB0aGUgbWVzc2FnZSBtYXkgb25seSBiZSBpbnRlcnByZXRlZCB0aHJvdWdoIHRoZSB1c2Ugb2YgYSBzZWNyZXQga2V5LgotV2l0aG91dCB0aGUga2V5IHRoZSBtZXNzYWdlIGlzIHVzZWxlc3M6IGdvb2QgY3J5cHRvZ3JhcGhpYyBhbGdvcml0aG1zIG1ha2UgaXQKLXNvIGRpZmZpY3VsdCBmb3IgaW50cnVkZXJzIHRvIGRlY29kZSB0aGUgb3JpZ2luYWwgdGV4dCB0aGF0IGl0IGlzbid0IHdvcnRoCi10aGVpciBlZmZvcnQuCi08cD4KLVRoZXJlIGFyZSB0d28gY2F0ZWdvcmllcyBvZiBjcnlwdG9ncmFwaGljIGFsZ29yaXRobXM6Ci1jb252ZW50aW9uYWwgYW5kIHB1YmxpYyBrZXkuCi08dWw+Ci08bGk+PGVtPkNvbnZlbnRpb25hbCBjcnlwdG9ncmFwaHk8L2VtPiwgYWxzbyBrbm93biBhcyBzeW1tZXRyaWMKLWNyeXB0b2dyYXBoeSwgcmVxdWlyZXMgdGhlIHNlbmRlciBhbmQgcmVjZWl2ZXIgdG8gc2hhcmUgYSBrZXk6IGEgc2VjcmV0Ci1waWVjZSBvZiBpbmZvcm1hdGlvbiB0aGF0IG1heSBiZSB1c2VkIHRvIGVuY3J5cHQgb3IgZGVjcnlwdCBhIG1lc3NhZ2UuCi1JZiB0aGlzIGtleSBpcyBzZWNyZXQsIHRoZW4gbm9ib2R5IG90aGVyIHRoYW4gdGhlIHNlbmRlciBvciByZWNlaXZlciBtYXkKLXJlYWQgdGhlIG1lc3NhZ2UuIElmIEFsaWNlIGFuZCB0aGUgYmFuayBrbm93IGEgc2VjcmV0IGtleSwgdGhlbiB0aGV5Ci1tYXkgc2VuZCBlYWNoIG90aGVyIHByaXZhdGUgbWVzc2FnZXMuIFRoZSB0YXNrIG9mIHByaXZhdGVseSBjaG9vc2luZyBhIGtleQotYmVmb3JlIGNvbW11bmljYXRpbmcsIGhvd2V2ZXIsIGNhbiBiZSBwcm9ibGVtYXRpYy4KLTxwPgotPGxpPjxlbT5QdWJsaWMga2V5IGNyeXB0b2dyYXBoeTwvZW0+LCBhbHNvIGtub3duIGFzIGFzeW1tZXRyaWMgY3J5cHRvZ3JhcGh5LAotc29sdmVzIHRoZSBrZXkgZXhjaGFuZ2UgcHJvYmxlbSBieSBkZWZpbmluZyBhbiBhbGdvcml0aG0gd2hpY2ggdXNlcyB0d28ga2V5cywKLWVhY2ggb2Ygd2hpY2ggbWF5IGJlIHVzZWQgdG8gZW5jcnlwdCBhIG1lc3NhZ2UuIElmIG9uZSBrZXkgaXMgdXNlZCB0byBlbmNyeXB0Ci1hIG1lc3NhZ2UgdGhlbiB0aGUgb3RoZXIgbXVzdCBiZSB1c2VkIHRvIGRlY3J5cHQgaXQuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUKLXRvIHJlY2VpdmUgc2VjdXJlIG1lc3NhZ2VzIGJ5IHNpbXBseSBwdWJsaXNoaW5nIG9uZSBrZXkgKHRoZSBwdWJsaWMga2V5KSBhbmQKLWtlZXBpbmcgdGhlIG90aGVyIHNlY3JldCAodGhlIHByaXZhdGUga2V5KS4KLTxwPgotQW55b25lIG1heSBlbmNyeXB0IGEgbWVzc2FnZSB1c2luZyB0aGUgcHVibGljIGtleSwgYnV0IG9ubHkgdGhlIG93bmVyIG9mIHRoZQotcHJpdmF0ZSBrZXkgd2lsbCBiZSBhYmxlIHRvIHJlYWQgaXQuIEluIHRoaXMgd2F5LCBBbGljZSBtYXkgc2VuZCBwcml2YXRlCi1tZXNzYWdlcyB0byB0aGUgb3duZXIgb2YgYSBrZXktcGFpciAodGhlIGJhbmspLCBieSBlbmNyeXB0aW5nIGl0IHVzaW5nIHRoZWlyCi1wdWJsaWMga2V5LiBPbmx5IHRoZSBiYW5rIHdpbGwgYmUgYWJsZSB0byBkZWNyeXB0IGl0LgotPC91bD4KLTxoMz48YSBuYW1lPSJUb0MzIj5NZXNzYWdlIERpZ2VzdHM8L2E+PC9oMz4KLUFsdGhvdWdoIEFsaWNlIG1heSBlbmNyeXB0IGhlciBtZXNzYWdlIHRvIG1ha2UgaXQgcHJpdmF0ZSwgdGhlcmUgaXMgc3RpbGwgYQotY29uY2VybiB0aGF0IHNvbWVvbmUgbWlnaHQgbW9kaWZ5IGhlciBvcmlnaW5hbCBtZXNzYWdlIG9yIHN1YnN0aXR1dGUKLWl0IHdpdGggYSBkaWZmZXJlbnQgb25lLCBpbiBvcmRlciB0byB0cmFuc2ZlciB0aGUgbW9uZXkgdG8gdGhlbXNlbHZlcywgZm9yCi1pbnN0YW5jZS4gT25lIHdheSBvZiBndWFyYW50ZWVpbmcgdGhlIGludGVncml0eSBvZiBBbGljZSdzIG1lc3NhZ2UgaXMgdG8KLWNyZWF0ZSBhIGNvbmNpc2Ugc3VtbWFyeSBvZiBoZXIgbWVzc2FnZSBhbmQgc2VuZCB0aGlzIHRvIHRoZSBiYW5rIGFzIHdlbGwuCi1VcG9uIHJlY2VpcHQgb2YgdGhlIG1lc3NhZ2UsIHRoZSBiYW5rIGNyZWF0ZXMgaXRzIG93biBzdW1tYXJ5IGFuZCBjb21wYXJlcyBpdAotd2l0aCB0aGUgb25lIEFsaWNlIHNlbnQuIElmIHRoZXkgYWdyZWUgdGhlbiB0aGUgbWVzc2FnZSB3YXMgcmVjZWl2ZWQgaW50YWN0LgotPHA+Ci1BIHN1bW1hcnkgc3VjaCBhcyB0aGlzIGlzIGNhbGxlZCBhIDxlbT5tZXNzYWdlIGRpZ2VzdDwvZW0+LCA8ZW0+b25lLXdheQotZnVuY3Rpb248L2VtPiBvciA8ZW0+aGFzaCBmdW5jdGlvbjwvZW0+LiBNZXNzYWdlIGRpZ2VzdHMgYXJlIHVzZWQgdG8gY3JlYXRlCi1zaG9ydCwgZml4ZWQtbGVuZ3RoIHJlcHJlc2VudGF0aW9ucyBvZiBsb25nZXIsIHZhcmlhYmxlLWxlbmd0aCBtZXNzYWdlcy4KLURpZ2VzdCBhbGdvcml0aG1zIGFyZSBkZXNpZ25lZCB0byBwcm9kdWNlIHVuaXF1ZSBkaWdlc3RzIGZvciBkaWZmZXJlbnQKLW1lc3NhZ2VzLiBNZXNzYWdlIGRpZ2VzdHMgYXJlIGRlc2lnbmVkIHRvIG1ha2UgaXQgdG9vIGRpZmZpY3VsdCB0byBkZXRlcm1pbmUKLXRoZSBtZXNzYWdlIGZyb20gdGhlIGRpZ2VzdCwgYW5kIGFsc28gaW1wb3NzaWJsZSB0byBmaW5kIHR3byBkaWZmZXJlbnQKLW1lc3NhZ2VzIHdoaWNoIGNyZWF0ZSB0aGUgc2FtZSBkaWdlc3QgLS0gdGh1cyBlbGltaW5hdGluZyB0aGUgcG9zc2liaWxpdHkgb2YKLXN1YnN0aXR1dGluZyBvbmUgbWVzc2FnZSBmb3IgYW5vdGhlciB3aGlsZSBtYWludGFpbmluZyB0aGUgc2FtZSBkaWdlc3QuCi08cD4KLUFub3RoZXIgY2hhbGxlbmdlIHRoYXQgQWxpY2UgZmFjZXMgaXMgZmluZGluZyBhIHdheSB0byBzZW5kIHRoZSBkaWdlc3QgdG8gdGhlCi1iYW5rIHNlY3VyZWx5OyB3aGVuIHRoaXMgaXMgYWNoaWV2ZWQsIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGFzc29jaWF0ZWQgbWVzc2FnZQotaXMgYXNzdXJlZC4gT25lIHdheSB0byB0byB0aGlzIGlzIHRvIGluY2x1ZGUgdGhlIGRpZ2VzdCBpbiBhIGRpZ2l0YWwKLXNpZ25hdHVyZS4KLTxoMz48YSBuYW1lPSJUb0M0Ij5EaWdpdGFsIFNpZ25hdHVyZXM8L2E+PC9oMz4KLVdoZW4gQWxpY2Ugc2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBiYW5rLCB0aGUgYmFuayBuZWVkcyB0byBlbnN1cmUgdGhhdCB0aGUKLW1lc3NhZ2UgaXMgcmVhbGx5IGZyb20gaGVyLCBzbyBhbiBpbnRydWRlciBkb2VzIG5vdCByZXF1ZXN0IGEgdHJhbnNhY3Rpb24KLWludm9sdmluZyBoZXIgYWNjb3VudC4gQSA8ZW0+ZGlnaXRhbCBzaWduYXR1cmU8L2VtPiwgY3JlYXRlZCBieSBBbGljZSBhbmQKLWluY2x1ZGVkIHdpdGggdGhlIG1lc3NhZ2UsIHNlcnZlcyB0aGlzIHB1cnBvc2UuCi08cD4KLURpZ2l0YWwgc2lnbmF0dXJlcyBhcmUgY3JlYXRlZCBieSBlbmNyeXB0aW5nIGEgZGlnZXN0IG9mIHRoZSBtZXNzYWdlLAotYW5kIG90aGVyIGluZm9ybWF0aW9uIChzdWNoIGFzIGEgc2VxdWVuY2UgbnVtYmVyKSB3aXRoIHRoZSBzZW5kZXIncwotcHJpdmF0ZSBrZXkuIFRob3VnaCBhbnlvbmUgbWF5IDxlbT5kZWNyeXB0PC9lbT4gdGhlIHNpZ25hdHVyZSB1c2luZyB0aGUgcHVibGljCi1rZXksIG9ubHkgdGhlIHNpZ25lciBrbm93cyB0aGUgcHJpdmF0ZSBrZXkuIFRoaXMgbWVhbnMgdGhhdCBvbmx5IHRoZXkgbWF5Ci1oYXZlIHNpZ25lZCBpdC4gSW5jbHVkaW5nIHRoZSBkaWdlc3QgaW4gdGhlIHNpZ25hdHVyZSBtZWFucyB0aGUgc2lnbmF0dXJlIGlzCi1vbmx5IGdvb2QgZm9yIHRoYXQgbWVzc2FnZTsgaXQgYWxzbyBlbnN1cmVzIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIG1lc3NhZ2Ugc2luY2UKLW5vIG9uZSBjYW4gY2hhbmdlIHRoZSBkaWdlc3QgYW5kIHN0aWxsIHNpZ24gaXQuCi08cD4KLVRvIGd1YXJkIGFnYWluc3QgaW50ZXJjZXB0aW9uIGFuZCByZXVzZSBvZiB0aGUgc2lnbmF0dXJlIGJ5IGFuIGludHJ1ZGVyIGF0IGEKLWxhdGVyIGRhdGUsIHRoZSBzaWduYXR1cmUgY29udGFpbnMgYSB1bmlxdWUgc2VxdWVuY2UgbnVtYmVyLiBUaGlzIHByb3RlY3RzCi10aGUgYmFuayBmcm9tIGEgZnJhdWR1bGVudCBjbGFpbSBmcm9tIEFsaWNlIHRoYXQgc2hlIGRpZCBub3Qgc2VuZCB0aGUgbWVzc2FnZQotLS0gb25seSBzaGUgY291bGQgaGF2ZSBzaWduZWQgaXQgKG5vbi1yZXB1ZGlhdGlvbikuCi08aDI+PGEgbmFtZT0iVG9DNSI+Q2VydGlmaWNhdGVzPC9hPjwvaDI+Ci1BbHRob3VnaCBBbGljZSBjb3VsZCBoYXZlIHNlbnQgYSBwcml2YXRlIG1lc3NhZ2UgdG8gdGhlIGJhbmssIHNpZ25lZCBpdCwgYW5kCi1lbnN1cmVkIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIG1lc3NhZ2UsIHNoZSBzdGlsbCBuZWVkcyB0byBiZSBzdXJlIHRoYXQgc2hlIGlzCi1yZWFsbHkgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBiYW5rLiBUaGlzIG1lYW5zIHRoYXQgc2hlIG5lZWRzIHRvIGJlIHN1cmUgdGhhdAotdGhlIHB1YmxpYyBrZXkgc2hlIGlzIHVzaW5nIGNvcnJlc3BvbmRzIHRvIHRoZSBiYW5rJ3MgcHJpdmF0ZSBrZXkuIFNpbWlsYXJseSwKLXRoZSBiYW5rIGFsc28gbmVlZHMgdG8gdmVyaWZ5IHRoYXQgdGhlIG1lc3NhZ2Ugc2lnbmF0dXJlIHJlYWxseSBjb3JyZXNwb25kcyB0bwotQWxpY2UncyBzaWduYXR1cmUuCi08cD4KLUlmIGVhY2ggcGFydHkgaGFzIGEgY2VydGlmaWNhdGUgd2hpY2ggdmFsaWRhdGVzIHRoZSBvdGhlcidzIGlkZW50aXR5LCBjb25maXJtcwotdGhlIHB1YmxpYyBrZXksIGFuZCBpcyBzaWduZWQgYnkgYSB0cnVzdGVkIGFnZW5jeSwgdGhlbiB0aGV5IGJvdGggd2lsbCBiZQotYXNzdXJlZCB0aGF0IHRoZXkgYXJlIGNvbW11bmljYXRpbmcgd2l0aCB3aG9tIHRoZXkgdGhpbmsgdGhleSBhcmUuIFN1Y2ggYQotdHJ1c3RlZCBhZ2VuY3kgaXMgY2FsbGVkIGEgPGVtPkNlcnRpZmljYXRlIEF1dGhvcml0eTwvZW0+LCBhbmQgY2VydGlmaWNhdGVzIGFyZQotdXNlZCBmb3IgYXV0aGVudGljYXRpb24uCi08aDM+PGEgbmFtZT0iVG9DNiI+Q2VydGlmaWNhdGUgQ29udGVudHM8L2E+PC9oMz4KLUEgY2VydGlmaWNhdGUgYXNzb2NpYXRlcyBhIHB1YmxpYyBrZXkgd2l0aCB0aGUgcmVhbCBpZGVudGl0eSBvZiBhbiBpbmRpdmlkdWFsLAotc2VydmVyLCBvciBvdGhlciBlbnRpdHksIGtub3duIGFzIHRoZSBzdWJqZWN0LiBBcyBzaG93biBpbiA8YQotaHJlZj0iI3RhYmxlMSI+VGFibGUgMTwvYT4sIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdWJqZWN0IGluY2x1ZGVzIGlkZW50aWZ5aW5nCi1pbmZvcm1hdGlvbiAodGhlIGRpc3Rpbmd1aXNoZWQgbmFtZSksIGFuZCB0aGUgcHVibGljIGtleS4gSXQgYWxzbyBpbmNsdWRlcwotdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBzaWduYXR1cmUgb2YgdGhlIENlcnRpZmljYXRlIEF1dGhvcml0eSB0aGF0IGlzc3VlZCB0aGUKLWNlcnRpZmljYXRlLCBhbmQgdGhlIHBlcmlvZCBvZiB0aW1lIGR1cmluZyB3aGljaCB0aGUgY2VydGlmaWNhdGUgaXMgdmFsaWQuIEl0Ci1tYXkgaGF2ZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIChvciBleHRlbnNpb25zKSBhcyB3ZWxsIGFzIGFkbWluaXN0cmF0aXZlCi1pbmZvcm1hdGlvbiBmb3IgdGhlIENlcnRpZmljYXRlIEF1dGhvcml0eSdzIHVzZSwgc3VjaCBhcyBhIHNlcmlhbCBudW1iZXIuCi08cD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08YSBuYW1lPSJ0YWJsZTEiPjwvYT4KLTx0YWJsZSB3aWR0aD0iNjAwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTxjYXB0aW9uIGFsaWduPSJib3R0b20iIGlkPSJzZiI+VGFibGUgMTogQ2VydGlmaWNhdGUgSW5mb3JtYXRpb248L2NhcHRpb24+Ci08dHI+PHRkIGJnY29sb3I9IiNjY2NjY2MiPgotPHRhYmxlIHdpZHRoPSI1OTgiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08dGFibGUgc3VtbWFyeT0iIj4KLTx0ciB2YWxpZ249InRvcCI+PHRkPjxiPlN1YmplY3Q6PC9iPjwvdGQ+Ci08dGQ+RGlzdGluZ3Vpc2hlZCBOYW1lLCBQdWJsaWMgS2V5PC90ZD48L3RyPgotPHRyIHZhbGlnbj0idG9wIj48dGQ+PGI+SXNzdWVyOjwvYj48L3RkPgotPHRkPkRpc3Rpbmd1aXNoZWQgTmFtZSwgU2lnbmF0dXJlPC90ZD48L3RyPgotPHRyPjx0ZD48Yj5QZXJpb2Qgb2YgVmFsaWRpdHk6PC9iPjwvdGQ+Ci08dGQ+Tm90IEJlZm9yZSBEYXRlLCBOb3QgQWZ0ZXIgRGF0ZTwvdGQ+PC90cj4KLTx0cj48dGQ+PGI+QWRtaW5pc3RyYXRpdmUgSW5mb3JtYXRpb246PC9iPjwvdGQ+Ci08dGQ+VmVyc2lvbiwgU2VyaWFsIE51bWJlcjwvdGQ+PC9UUj4KLTx0cj48dGQ+PGI+RXh0ZW5kZWQgSW5mb3JtYXRpb246PC9iPjwvdGQ+Ci08dGQ+QmFzaWMgQ29udHJhaW50cywgTmV0c2NhcGUgRmxhZ3MsIGV0Yy48L3RkPjwvVFI+Ci08L3RhYmxlPgotPC90ZD4KLTwvdHI+PC90YWJsZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotPC9kaXY+Ci08cD4KLUEgZGlzdGluZ3Vpc2hlZCBuYW1lIGlzIHVzZWQgdG8gcHJvdmlkZSBhbiBpZGVudGl0eSBpbiBhIHNwZWNpZmljIGNvbnRleHQgLS0KLWZvciBpbnN0YW5jZSwgYW4gaW5kaXZpZHVhbCBtaWdodCBoYXZlIGEgcGVyc29uYWwgY2VydGlmaWNhdGUgYXMgd2VsbCBhcyBvbmUKLWZvciB0aGVpciBpZGVudGl0eSBhcyBhbiBlbXBsb3llZS4gRGlzdGluZ3Vpc2hlZCBuYW1lcyBhcmUgZGVmaW5lZCBieSB0aGUKLVguNTA5IHN0YW5kYXJkIFs8YSBocmVmPSIjWDUwOSI+WDUwOTwvQT5dLCB3aGljaCBkZWZpbmVzIHRoZSBmaWVsZHMsIGZpZWxkCi1uYW1lcywgYW5kIGFiYnJldmlhdGlvbnMgdXNlZCB0byByZWZlciB0byB0aGUgZmllbGRzCi0oc2VlIDxhIGhyZWY9IiN0YWJsZTIiPlRhYmxlIDI8L2E+KS4KLTxwPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxhIG5hbWU9InRhYmxlMiI+PC9hPgotPHRhYmxlIHdpZHRoPSI2MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPGNhcHRpb24gYWxpZ249ImJvdHRvbSIgaWQ9InNmIj5UYWJsZSAyOiBEaXN0aW5ndWlzaGVkIE5hbWUgSW5mb3JtYXRpb248L2NhcHRpb24+Ci08dHI+PHRkIGJnY29sb3I9IiNjY2NjY2MiPgotPHRhYmxlIHdpZHRoPSI1OTgiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08dGFibGUgc3VtbWFyeT0iIj4KLTx0ciB2YWxpZ249InRvcCI+PHRkPjxiPkROIEZpZWxkOjwvYj48L3RkPjx0ZD48Yj5BYmJyZXYuOjwvYj48L3RkPjx0ZD48Yj5EZXNjcmlwdGlvbjo8L2I+PC90ZD4KLTx0ZD48Yj5FeGFtcGxlOjwvYj48L3RkPgotPC90PgotPHRyIHZhbGlnbj0idG9wIj48dGQ+Q29tbW9uIE5hbWU8L3RkPjx0ZD5DTjwvdGQ+Ci08dGQ+TmFtZSBiZWluZyBjZXJ0aWZpZWQ8L3RkPjx0ZD5DTj1Kb2UgQXZlcmFnZTwvdGQ+PC90cj4KLTx0ciB2YWxpZ249InRvcCI+PHRkPk9yZ2FuaXphdGlvbiBvciBDb21wYW55PC90ZD48dGQ+TzwvdGQ+Ci08dGQ+TmFtZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhpczxicj5vcmdhbml6YXRpb248L3RkPjx0ZD5PPVNuYWtlIE9pbCwgTHRkLjwvdGQ+PC90cj4KLTx0ciB2YWxpZ249InRvcCI+PHRkPk9yZ2FuaXphdGlvbmFsIFVuaXQ8L3RkPjx0ZD5PVTwvdGQ+Ci08dGQ+TmFtZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyA8YnI+b3JnYW5pemF0aW9uIHVuaXQsIHN1Y2ggYXMgYSBkZXBhcnRtZW50PC90ZD48dGQ+T1U9UmVzZWFyY2ggSW5zdGl0dXRlPC90ZD48L3RyPgotPHRyIHZhbGlnbj0idG9wIj48dGQ+Q2l0eS9Mb2NhbGl0eTwvdGQ+PHRkPkw8L3RkPgotPHRkPk5hbWUgaXMgbG9jYXRlZCBpbiB0aGlzIENpdHk8L3RkPjx0ZD5MPVNuYWtlIENpdHk8L3RkPjwvdHI+Ci08dHIgdmFsaWduPSJ0b3AiPjx0ZD5TdGF0ZS9Qcm92aW5jZTwvdGQ+PHRkPlNUPC90ZD4KLTx0ZD5OYW1lIGlzIGxvY2F0ZWQgaW4gdGhpcyBTdGF0ZS9Qcm92aW5jZTwvdGQ+PHRkPlNUPURlc2VydDwvdGQ+PC90cj4KLTx0ciB2YWxpZ249InRvcCI+PHRkPkNvdW50cnk8L3RkPjx0ZD5DPC90ZD4KLTx0ZD5OYW1lIGlzIGxvY2F0ZWQgaW4gdGhpcyBDb3VudHJ5IChJU08gY29kZSk8L3RkPjx0ZD5DPVhaPC90ZD48L3RyPgotPC90YWJsZT4KLTwvdGQ+Ci08L3RyPjwvdGFibGU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLTwvZGl2PgotPHA+Ci1BIENlcnRpZmljYXRlIEF1dGhvcml0eSBtYXkgZGVmaW5lIGEgcG9saWN5IHNwZWNpZnlpbmcgd2hpY2ggZGlzdGluZ3Vpc2hlZAotZmllbGQgbmFtZXMgYXJlIG9wdGlvbmFsLCBhbmQgd2hpY2ggYXJlIHJlcXVpcmVkLiBJdCBtYXkgYWxzbyBwbGFjZQotcmVxdWlyZW1lbnRzIHVwb24gdGhlIGZpZWxkIGNvbnRlbnRzLCBhcyBtYXkgdXNlcnMgb2YgY2VydGlmaWNhdGVzLiBBcyBhbgotZXhhbXBsZSwgYSBOZXRzY2FwZSBicm93c2VyIHJlcXVpcmVzIHRoYXQgdGhlIENvbW1vbiBOYW1lIGZvciBhIGNlcnRpZmljYXRlCi1yZXByZXNlbnRpbmcgYSBzZXJ2ZXIgaGFzIGEgbmFtZSB3aGljaCBtYXRjaGVzIGEgd2lsZGNhcmQgcGF0dGVybiBmb3IgdGhlCi1kb21haW4gbmFtZSBvZiB0aGF0IHNlcnZlciwgc3VjaCBhcyA8Y29kZT4qLnNuYWtlb2lsLmNvbTwvY29kZT4uCi08cD4KLVRoZSBiaW5hcnkgZm9ybWF0IG9mIGEgY2VydGlmaWNhdGUgaXMgZGVmaW5lZCB1c2luZyB0aGUgQVNOLjEgbm90YXRpb24gWyA8YQotaHJlZj0iI1gyMDgiPlgyMDg8L2E+XSBbPGEgaHJlZj0iI1BLQ1MiPlBLQ1M8L2E+XS4gVGhpcyBub3RhdGlvbiBkZWZpbmVzIGhvdyB0bwotc3BlY2lmeSB0aGUgY29udGVudHMsIGFuZCBlbmNvZGluZyBydWxlcyBkZWZpbmUgaG93IHRoaXMgaW5mb3JtYXRpb24gaXMKLXRyYW5zbGF0ZWQgaW50byBiaW5hcnkgZm9ybS4gVGhlIGJpbmFyeSBlbmNvZGluZyBvZiB0aGUgY2VydGlmaWNhdGUgaXMKLWRlZmluZWQgdXNpbmcgRGlzdGluZ3Vpc2hlZCBFbmNvZGluZyBSdWxlcyAoREVSKSwgd2hpY2ggYXJlIGJhc2VkIG9uIHRoZSBtb3JlCi1nZW5lcmFsIEJhc2ljIEVuY29kaW5nIFJ1bGVzIChCRVIpLiBGb3IgdGhvc2UgdHJhbnNtaXNzaW9ucyB3aGljaCBjYW5ub3QKLWhhbmRsZSBiaW5hcnksIHRoZSBiaW5hcnkgZm9ybSBtYXkgYmUgdHJhbnNsYXRlZCBpbnRvIGFuIEFTQ0lJIGZvcm0gYnkgdXNpbmcKLUJhc2U2NCBlbmNvZGluZyBbPGEgaHJlZj0iI01JTUUiPk1JTUU8L2E+XS4gVGhpcyBlbmNvZGVkIHZlcnNpb24gaXMgY2FsbGVkIFBFTQotZW5jb2RlZCAodGhlIG5hbWUgY29tZXMgZnJvbSAiUHJpdmFjeSBFbmhhbmNlZCBNYWlsIiksIHdoZW4gcGxhY2VkIGJldHdlZW4KLWJlZ2luIGFuZCBlbmQgZGVsaW1pdGVyIGxpbmVzIGFzIGlsbHVzdHJhdGVkIGluIDxhIGhyZWY9IiN0YWJsZTMiPlRhYmxlIDM8L2E+LgotPHA+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGEgbmFtZT0idGFibGUzIj48L2E+Ci08dGFibGUgd2lkdGg9IjYwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08Y2FwdGlvbiBhbGlnbj0iYm90dG9tIiBpZD0ic2YiPlRhYmxlIDM6IEV4YW1wbGUgb2YgYSBQRU0tZW5jb2RlZCBjZXJ0aWZpY2F0ZSAoc25ha2VvaWwuY3J0KTwvY2FwdGlvbj4KLTx0cj48dGQgYmdjb2xvcj0iI2NjY2NjYyI+Ci08dGFibGUgd2lkdGg9IjU5OCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjZmZmZmZmIj4KLTx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHN1bW1hcnk9IiI+PHRyPjx0ZD4KLTxkaXYgY2xhc3M9ImNvZGUiPjxwcmU+Ci0tLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KLU1JSUM3akNDQWxlZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRUUZBRENCcVRFTE1Ba0dBMVVFQmhNQ1dGa3gKLUZUQVRCZ05WQkFnVERGTnVZV3RsSUVSbGMyVnlkREVUTUJFR0ExVUVCeE1LVTI1aGEyVWdWRzkzYmpFWE1CVUcKLUExVUVDaE1PVTI1aGEyVWdUMmxzTENCTWRHUXhIakFjQmdOVkJBc1RGVU5sY25ScFptbGpZWFJsSUVGMWRHaHYKLWNtbDBlVEVWTUJNR0ExVUVBeE1NVTI1aGEyVWdUMmxzSUVOQk1SNHdIQVlKS29aSWh2Y05BUWtCRmc5allVQnoKLWJtRnJaVzlwYkM1a2IyMHdIaGNOT1RneE1ESXhNRGcxT0RNMldoY05PVGt4TURJeE1EZzFPRE0yV2pDQnB6RUwKLU1Ba0dBMVVFQmhNQ1dGa3hGVEFUQmdOVkJBZ1RERk51WVd0bElFUmxjMlZ5ZERFVE1CRUdBMVVFQnhNS1UyNWgKLWEyVWdWRzkzYmpFWE1CVUdBMVVFQ2hNT1UyNWhhMlVnVDJsc0xDQk1kR1F4RnpBVkJnTlZCQXNURGxkbFluTmwKLWNuWmxjaUJVWldGdE1Sa3dGd1lEVlFRREV4QjNkM2N1YzI1aGEyVnZhV3d1Wkc5dE1SOHdIUVlKS29aSWh2Y04KLUFRa0JGaEIzZDNkQWMyNWhhMlZ2YVd3dVpHOXRNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0IKLWdRREg5R2UvczJ6Y0grZGErclBUeC9EUFJwM3hHakhaNEdHNnBDbXZBRElFdEJ0S0JGQWNaNjRuK0R5N05wOGIKLXZLUit5eTVER1FpaWpzSDFEL2o4SGxHRStxNFRaOE9GazdCTkJGYXpIeEZiWUk0T0tNaUN4ZEt6ZGlmMXlmYWEKLWxXb0FORmxBemxTZGJ4ZUdWSG9UMEsrZ1Q1dzNVeHdaS3YyRExiQ1R6TFp5UHdJREFRQUJveVl3SkRBUEJnTlYKLUhSTUVDREFHQVFIL0FnRUFNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFRREFOQmdrcWhraUc5dzBCQVFRRkFBT0IKLWdRQVpVSUhBTDREMDlvRTZMdjJrNTZHcDM4T0JEdUlMdndMZzF2MUtMOG1RUitLRmpnaENydHBxYXp0WnFjRHQKLTJxMlFveXVsQ2dTekhiRUdtaTBFc2RrUGZnNm1wMHBlbnNzSUZlUFlOSSsvOHU5SFQ0THVLTUpYMTVoeEJhbTcKLWRVSHpJQ3hCVkMxbG5IeVlHakR1QU1oZTM5NmxZQW44YkNsZDEvTDROTUdCQ1E9PQotLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLTwvcHJlPjwvZGl2PgotPC90ZD48L3RyPjwvdGFibGU+Ci08L3RkPgotPC90cj48L3RhYmxlPgotPC90ZD48L3RyPjwvdGFibGU+Ci08L2Rpdj4KLTxoMz48YSBuYW1lPSJUb0M3Ij5DZXJ0aWZpY2F0ZSBBdXRob3JpdGllczwvYT48L2gzPgotQnkgZmlyc3QgdmVyaWZ5aW5nIHRoZSBpbmZvcm1hdGlvbiBpbiBhIGNlcnRpZmljYXRlIHJlcXVlc3QgYmVmb3JlIGdyYW50aW5nCi10aGUgY2VydGlmaWNhdGUsIHRoZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgYXNzdXJlcyB0aGUgaWRlbnRpdHkgb2YgdGhlIHByaXZhdGUKLWtleSBvd25lciBvZiBhIGtleS1wYWlyLiBGb3IgaW5zdGFuY2UsIGlmIEFsaWNlIHJlcXVlc3RzIGEgcGVyc29uYWwKLWNlcnRpZmljYXRlLCB0aGUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IG11c3QgZmlyc3QgbWFrZSBzdXJlIHRoYXQgQWxpY2UgcmVhbGx5Ci1pcyB0aGUgcGVyc29uIHRoZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IGNsYWltcy4KLTxoND48YSBuYW1lPSJUb0M4Ij5DZXJ0aWZpY2F0ZSBDaGFpbnM8L2E+PC9oND4KLUEgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IG1heSBhbHNvIGlzc3VlIGEgY2VydGlmaWNhdGUgZm9yIGFub3RoZXIgQ2VydGlmaWNhdGUKLUF1dGhvcml0eS4gV2hlbiBleGFtaW5pbmcgYSBjZXJ0aWZpY2F0ZSwgQWxpY2UgbWF5IG5lZWQgdG8gZXhhbWluZSB0aGUKLWNlcnRpZmljYXRlIG9mIHRoZSBpc3N1ZXIsIGZvciBlYWNoIHBhcmVudCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHksIHVudGlsCi1yZWFjaGluZyBvbmUgd2hpY2ggc2hlIGhhcyBjb25maWRlbmNlIGluLiBTaGUgbWF5IGRlY2lkZSB0byB0cnVzdCBvbmx5Ci1jZXJ0aWZpY2F0ZXMgd2l0aCBhIGxpbWl0ZWQgY2hhaW4gb2YgaXNzdWVycywgdG8gcmVkdWNlIGhlciByaXNrIG9mIGEgImJhZCIKLWNlcnRpZmljYXRlIGluIHRoZSBjaGFpbi4KLTxoND48YSBuYW1lPSJUb0M5Ij5DcmVhdGluZyBhIFJvb3QtTGV2ZWwgQ0E8L2E+PC9oND4KLUFzIG5vdGVkIGVhcmxpZXIsIGVhY2ggY2VydGlmaWNhdGUgcmVxdWlyZXMgYW4gaXNzdWVyIHRvIGFzc2VydCB0aGUgdmFsaWRpdHkKLW9mIHRoZSBpZGVudGl0eSBvZiB0aGUgY2VydGlmaWNhdGUgc3ViamVjdCwgdXAgdG8gdGhlIHRvcC1sZXZlbCBDZXJ0aWZpY2F0ZQotQXV0aG9yaXR5IChDQSkuIFRoaXMgcHJlc2VudHMgYSBwcm9ibGVtOiBTaW5jZSB0aGlzIGlzIHdobyB2b3VjaGVzIGZvciB0aGUKLWNlcnRpZmljYXRlIG9mIHRoZSB0b3AtbGV2ZWwgYXV0aG9yaXR5LCB3aGljaCBoYXMgbm8gaXNzdWVyPwotSW4gdGhpcyB1bmlxdWUgY2FzZSwgdGhlIGNlcnRpZmljYXRlIGlzICJzZWxmLXNpZ25lZCIsIHNvIHRoZSBpc3N1ZXIgb2YgdGhlCi1jZXJ0aWZpY2F0ZSBpcyB0aGUgc2FtZSBhcyB0aGUgc3ViamVjdC4gQXMgYSByZXN1bHQsIG9uZSBtdXN0IGV4ZXJjaXNlIGV4dHJhCi1jYXJlIGluIHRydXN0aW5nIGEgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUuIFRoZSB3aWRlIHB1YmxpY2F0aW9uIG9mIGEgcHVibGljCi1rZXkgYnkgdGhlIHJvb3QgYXV0aG9yaXR5IHJlZHVjZXMgdGhlIHJpc2sgaW4gdHJ1c3RpbmcgdGhpcyBrZXkgLS0gaXQgd291bGQgYmUKLW9idmlvdXMgaWYgc29tZW9uZSBlbHNlIHB1YmxpY2l6ZWQgYSBrZXkgY2xhaW1pbmcgdG8gYmUgdGhlIGF1dGhvcml0eS4KLUJyb3dzZXJzIGFyZSBwcmVjb25maWd1cmVkIHRvIHRydXN0IHdlbGwta25vd24gY2VydGlmaWNhdGUgYXV0aG9yaXRpZXMuCi08cD4KLUEgbnVtYmVyIG9mIGNvbXBhbmllcywgc3VjaCBhcyA8YSBocmVmPSJodHRwOi8vd3d3LnRoYXd0ZS5jb20vIj5UaGF3dGU8L2E+IGFuZAotPGEgaHJlZj0iaHR0cDovL3d3dy52ZXJpc2lnbi5jb20vIj5WZXJpU2lnbjwvYT4gaGF2ZSBlc3RhYmxpc2hlZCB0aGVtc2VsdmVzIGFzCi1DZXJ0aWZpY2F0ZSBBdXRob3JpdGllcy4gVGhlc2UgY29tcGFuaWVzIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBzZXJ2aWNlczoKLTx1bD4KLTxsaT5WZXJpZnlpbmcgY2VydGlmaWNhdGUgcmVxdWVzdHMKLTxsaT5Qcm9jZXNzaW5nIGNlcnRpZmljYXRlIHJlcXVlc3RzCi08bGk+SXNzdWluZyBhbmQgbWFuYWdpbmcgY2VydGlmaWNhdGVzCi08L3VsPgotPHA+Ci1JdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGNyZWF0ZSB5b3VyIG93biBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkuIEFsdGhvdWdoIHJpc2t5Ci1pbiB0aGUgSW50ZXJuZXQgZW52aXJvbm1lbnQsIGl0IG1heSBiZSB1c2VmdWwgd2l0aGluIGFuIEludHJhbmV0IHdoZXJlIHRoZQotb3JnYW5pemF0aW9uIGNhbiBlYXNpbHkgdmVyaWZ5IHRoZSBpZGVudGl0aWVzIG9mIGluZGl2aWR1YWxzIGFuZCBzZXJ2ZXJzLgotPGg0PjxhIG5hbWU9IlRvQzEwIj5DZXJ0aWZpY2F0ZSBNYW5hZ2VtZW50PC9hPjwvaDQ+Ci1Fc3RhYmxpc2hpbmcgYSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgaXMgYSByZXNwb25zaWJpbGl0eSB3aGljaCByZXF1aXJlcyBhCi1zb2xpZCBhZG1pbmlzdHJhdGl2ZSwgdGVjaG5pY2FsLCBhbmQgbWFuYWdlbWVudCBmcmFtZXdvcmsuCi1DZXJ0aWZpY2F0ZSBBdXRob3JpdGllcyBub3Qgb25seSBpc3N1ZSBjZXJ0aWZpY2F0ZXMsIHRoZXkgYWxzbyBtYW5hZ2UgdGhlbSAtLQotdGhhdCBpcywgdGhleSBkZXRlcm1pbmUgaG93IGxvbmcgY2VydGlmaWNhdGVzIGFyZSB2YWxpZCwgdGhleSByZW5ldyB0aGVtLCBhbmQKLXRoZXkga2VlcCBsaXN0cyBvZiBjZXJ0aWZpY2F0ZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBpc3N1ZWQgYnV0IGFyZSBubwotbG9uZ2VyIHZhbGlkIChDZXJ0aWZpY2F0ZSBSZXZvY2F0aW9uIExpc3RzLCBvciBDUkxzKS4KLVNheSBBbGljZSBpcyBlbnRpdGxlZCB0byBhIGNlcnRpZmljYXRlIGFzIGFuIGVtcGxveWVlIG9mIGEgY29tcGFueS4gU2F5IHRvbywKLXRoYXQgdGhlIGNlcnRpZmljYXRlIG5lZWRzIHRvIGJlIHJldm9rZWQgd2hlbiBBbGljZSBsZWF2ZXMgdGhlIGNvbXBhbnkuIFNpbmNlCi1jZXJ0aWZpY2F0ZXMgYXJlIG9iamVjdHMgdGhhdCBnZXQgcGFzc2VkIGFyb3VuZCwgaXQgaXMgaW1wb3NzaWJsZSB0byB0ZWxsIGZyb20KLXRoZSBjZXJ0aWZpY2F0ZSBhbG9uZSB0aGF0IGl0IGhhcyBiZWVuIHJldm9rZWQuCi1XaGVuIGV4YW1pbmluZyBjZXJ0aWZpY2F0ZXMgZm9yIHZhbGlkaXR5LCB0aGVyZWZvcmUsIGl0IGlzIG5lY2Vzc2FyeSB0bwotY29udGFjdCB0aGUgaXNzdWluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgdG8gY2hlY2sgQ1JMcyAtLSB0aGlzIGlzIG5vdCB1c3VhbGx5Ci1hbiBhdXRvbWF0ZWQgcGFydCBvZiB0aGUgcHJvY2Vzcy4KLTxwPgotPGRpdiBhbGlnbj0iY2VudGVyIj48Qj5Ob3RlOjwvQj48L2Rpdj4KLUlmIHlvdSB1c2UgYSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgdGhhdCBpcyBub3QgY29uZmlndXJlZCBpbnRvIGJyb3dzZXJzIGJ5Ci1kZWZhdWx0LCBpdCBpcyBuZWNlc3NhcnkgdG8gbG9hZCB0aGUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IGNlcnRpZmljYXRlIGludG8KLXRoZSBicm93c2VyLCBlbmFibGluZyB0aGUgYnJvd3NlciB0byB2YWxpZGF0ZSBzZXJ2ZXIgY2VydGlmaWNhdGVzIHNpZ25lZCBieQotdGhhdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkuIERvaW5nIHNvIG1heSBiZSBkYW5nZXJvdXMsIHNpbmNlIG9uY2UgbG9hZGVkLCB0aGUKLWJyb3dzZXIgd2lsbCBhY2NlcHQgYWxsIGNlcnRpZmljYXRlcyBzaWduZWQgYnkgdGhhdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkuCi08aDI+PGEgbmFtZT0iVG9DMTEiPlNlY3VyZSBTb2NrZXRzIExheWVyIChTU0wpPC9hPjwvaDI+Ci1UaGUgU2VjdXJlIFNvY2tldHMgTGF5ZXIgcHJvdG9jb2wgaXMgYSBwcm90b2NvbCBsYXllciB3aGljaCBtYXkgYmUgcGxhY2VkCi1iZXR3ZWVuIGEgcmVsaWFibGUgY29ubmVjdGlvbi1vcmllbnRlZCBuZXR3b3JrIGxheWVyIHByb3RvY29sIChlLmcuIFRDUC9JUCkKLWFuZCB0aGUgYXBwbGljYXRpb24gcHJvdG9jb2wgbGF5ZXIgKGUuZy4gSFRUUCkuIFNTTCBwcm92aWRlcyBmb3Igc2VjdXJlCi1jb21tdW5pY2F0aW9uIGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgYnkgYWxsb3dpbmcgbXV0dWFsIGF1dGhlbnRpY2F0aW9uLCB0aGUKLXVzZSBvZiBkaWdpdGFsIHNpZ25hdHVyZXMgZm9yIGludGVncml0eSwgYW5kIGVuY3J5cHRpb24gZm9yIHByaXZhY3kuCi08cD4KLVRoZSBwcm90b2NvbCBpcyBkZXNpZ25lZCB0byBzdXBwb3J0IGEgcmFuZ2Ugb2YgY2hvaWNlcyBmb3Igc3BlY2lmaWMgYWxnb3JpdGhtcwotdXNlZCBmb3IgY3J5cHRvZ3JhcGh5LCBkaWdlc3RzLCBhbmQgc2lnbmF0dXJlcy4gVGhpcyBhbGxvd3MgYWxnb3JpdGhtCi1zZWxlY3Rpb24gZm9yIHNwZWNpZmljIHNlcnZlcnMgdG8gYmUgbWFkZSBiYXNlZCBvbiBsZWdhbCwgZXhwb3J0IG9yIG90aGVyCi1jb25jZXJucywgYW5kIGFsc28gZW5hYmxlcyB0aGUgcHJvdG9jb2wgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgbmV3IGFsZ29yaXRobXMuCi1DaG9pY2VzIGFyZSBuZWdvdGlhdGVkIGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgYXQgdGhlIHN0YXJ0IG9mIGVzdGFibGlzaGluZwotYSBwcm90b2NvbCBzZXNzaW9uLgotPHA+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGEgbmFtZT0idGFibGU0Ij48L2E+Ci08dGFibGUgd2lkdGg9IjYwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08Y2FwdGlvbiBhbGlnbj0iYm90dG9tIiBpZD0ic2YiPlRhYmxlIDQ6IFZlcnNpb25zIG9mIHRoZSBTU0wgcHJvdG9jb2w8L2NhcHRpb24+Ci08dHI+PHRkIGJnY29sb3I9IiNjY2NjY2MiPgotPHRhYmxlIHdpZHRoPSI1OTgiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08dGFibGUgc3VtbWFyeT0iIj4KLTx0ciB2YWxpZ249InRvcCI+Ci08dGQ+PGI+VmVyc2lvbjo8L2I+PC90ZD4KLTx0ZD48Yj5Tb3VyY2U6PC9iPjwvdGQ+Ci08dGQ+PGI+RGVzY3JpcHRpb246PC9iPjwvdGQ+Ci08dGQ+PGI+QnJvd3NlciBTdXBwb3J0OjwvYj48L3RkPgotPC90cj4KLTx0ciB2YWxpZ249InRvcCI+Ci08dGQ+U1NMIHYyLjA8L3RkPgotPHRkPlZlbmRvciBTdGFuZGFyZCAoZnJvbSBOZXRzY2FwZSBDb3JwLikgWzxhIGhyZWY9IiNTU0wyIj5TU0wyPC9hPl08L3RkPgotPHRkPkZpcnN0IFNTTCBwcm90b2NvbCBmb3Igd2hpY2ggaW1wbGVtZW50YXRpb25zIGV4aXN0czwvdGQ+Ci08dGQ+LSBOUyBOYXZpZ2F0b3IgMS54LzIueDxicj4KLSAgICAtIE1TIElFIDMueDxicj4KLSAgICAtIEx5bngvMi44K09wZW5TU0wKLTwvdGQ+Ci08L3RyPgotPHRyIHZhbGlnbj0idG9wIj4KLTx0ZD5TU0wgdjMuMDwvdGQ+Ci08dGQ+RXhwaXJlZCBJbnRlcm5ldCBEcmFmdCAoZnJvbSBOZXRzY2FwZSBDb3JwLikgWzxhIGhyZWY9IiNTU0wzIj5TU0wzPC9hPl08L3RkPgotPHRkPlJldmlzaW9ucyB0byBwcmV2ZW50IHNwZWNpZmljIHNlY3VyaXR5IGF0dGFja3MsIGFkZCBub24tUlNBIGNpcGhlcnMsIGFuZCBzdXBwb3J0IGZvciBjZXJ0aWZpY2F0ZSBjaGFpbnM8L3RkPgotPHRkPi0gTlMgTmF2aWdhdG9yIDIueC8zLngvNC54PGJyPgotICAgIC0gTVMgSUUgMy54LzQueDxicj4KLSAgICAtIEx5bngvMi44K09wZW5TU0wKLTwvdGQ+Ci08L3RyPgotPHRyIHZhbGlnbj0idG9wIj4KLTx0ZD5UTFMgdjEuMDwvdGQ+Ci08dGQ+UHJvcG9zZWQgSW50ZXJuZXQgU3RhbmRhcmQgKGZyb20gSUVURikgWzxhIGhyZWY9IiNUTFMxIj5UTFMxPC9hPl08L3RkPgotPHRkPlJldmlzaW9uIG9mIFNTTCAzLjAgdG8gdXBkYXRlIHRoZSBNQUMgbGF5ZXIgdG8gSE1BQywgYWRkIGJsb2NrIHBhZGRpbmcgZm9yCi0gICAgYmxvY2sgY2lwaGVycywgbWVzc2FnZSBvcmRlciBzdGFuZGFyZGl6YXRpb24gYW5kIG1vcmUgYWxlcnQgbWVzc2FnZXMuCi08L3RkPgotPHRkPi0gTHlueC8yLjgrT3BlblNTTDwvdGQ+Ci08L3RhYmxlPgotPC90ZD4KLTwvdHI+PC90YWJsZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotPC9kaXY+Ci08cD4KLVRoZXJlIGFyZSBhIG51bWJlciBvZiB2ZXJzaW9ucyBvZiB0aGUgU1NMIHByb3RvY29sLCBhcyBzaG93biBpbiA8YQotaHJlZj0iI3RhYmxlNCI+VGFibGUgNDwvYT4uIEFzIG5vdGVkIHRoZXJlLCBvbmUgb2YgdGhlIGJlbmVmaXRzIGluIFNTTCAzLjAgaXMKLXRoYXQgaXQgYWRkcyBzdXBwb3J0IG9mIGNlcnRpZmljYXRlIGNoYWluIGxvYWRpbmcuIFRoaXMgZmVhdHVyZSBhbGxvd3MgYQotc2VydmVyIHRvIHBhc3MgYSBzZXJ2ZXIgY2VydGlmaWNhdGUgYWxvbmcgd2l0aCBpc3N1ZXIgY2VydGlmaWNhdGVzIHRvIHRoZQotYnJvd3Nlci4gQ2hhaW4gbG9hZGluZyBhbHNvIHBlcm1pdHMgdGhlIGJyb3dzZXIgdG8gdmFsaWRhdGUgdGhlIHNlcnZlcgotY2VydGlmaWNhdGUsIGV2ZW4gaWYgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IGNlcnRpZmljYXRlcyBhcmUgbm90IGluc3RhbGxlZCBmb3IKLXRoZSBpbnRlcm1lZGlhdGUgaXNzdWVycywgc2luY2UgdGhleSBhcmUgaW5jbHVkZWQgaW4gdGhlIGNlcnRpZmljYXRlIGNoYWluLgotU1NMIDMuMCBpcyB0aGUgYmFzaXMgZm9yIHRoZSBUcmFuc3BvcnQgTGF5ZXIgU2VjdXJpdHkgWzxBCi1IUkVGPSIjVExTMSI+VExTPC9BPl0gcHJvdG9jb2wgc3RhbmRhcmQsIGN1cnJlbnRseSBpbiBkZXZlbG9wbWVudCBieSB0aGUKLUludGVybmV0IEVuZ2luZWVyaW5nIFRhc2sgRm9yY2UgKElFVEYpLgotPGgzPjxhIG5hbWU9IlRvQzEyIj5TZXNzaW9uIEVzdGFibGlzaG1lbnQ8L2E+PC9oMz4KLVRoZSBTU0wgc2Vzc2lvbiBpcyBlc3RhYmxpc2hlZCBieSBmb2xsb3dpbmcgYSA8ST5oYW5kc2hha2Ugc2VxdWVuY2U8L0k+Ci1iZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyLCBhcyBzaG93biBpbiA8YSBocmVmPSIjZmlndXJlMSI+RmlndXJlIDE8L2E+LiBUaGlzCi1zZXF1ZW5jZSBtYXkgdmFyeSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHNlcnZlciBpcyBjb25maWd1cmVkIHRvIHByb3ZpZGUgYQotc2VydmVyIGNlcnRpZmljYXRlIG9yIHJlcXVlc3QgYSBjbGllbnQgY2VydGlmaWNhdGUuIFRob3VnaCBjYXNlcyBleGlzdCB3aGVyZQotYWRkaXRpb25hbCBoYW5kc2hha2Ugc3RlcHMgYXJlIHJlcXVpcmVkIGZvciBtYW5hZ2VtZW50IG9mIGNpcGhlciBpbmZvcm1hdGlvbiwKLXRoaXMgYXJ0aWNsZSBzdW1tYXJpemVzIG9uZSBjb21tb24gc2NlbmFyaW86IHNlZSB0aGUgU1NMIHNwZWNpZmljYXRpb24gZm9yIHRoZQotZnVsbCByYW5nZSBvZiBwb3NzaWJpbGl0aWVzLgotPHA+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPjxiPk5vdGU8L2I+PC9kaXY+Ci1PbmNlIGFuIFNTTCBzZXNzaW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkIGl0IG1heSBiZSByZXVzZWQsIHRodXMgYXZvaWRpbmcgdGhlCi1wZXJmb3JtYW5jZSBwZW5hbHR5IG9mIHJlcGVhdGluZyB0aGUgbWFueSBzdGVwcyBuZWVkZWQgdG8gc3RhcnQgYSBzZXNzaW9uLgotRm9yIHRoaXMgdGhlIHNlcnZlciBhc3NpZ25zIGVhY2ggU1NMIHNlc3Npb24gYSB1bmlxdWUgc2Vzc2lvbiBpZGVudGlmaWVyIHdoaWNoCi1pcyBjYWNoZWQgaW4gdGhlIHNlcnZlciBhbmQgd2hpY2ggdGhlIGNsaWVudCBjYW4gdXNlIG9uIGZvcnRoY29taW5nCi1jb25uZWN0aW9ucyB0byByZWR1Y2UgdGhlIGhhbmRzaGFrZSAodW50aWwgdGhlIHNlc3Npb24gaWRlbnRpZmVyIGV4cGlyZXMgaW4KLXRoZSBjYWNoZSBvZiB0aGUgc2VydmVyKS4KLTxwPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxhIG5hbWU9ImZpZ3VyZTEiPjwvYT4KLTx0YWJsZSB3aWR0aD0iNjAwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTxjYXB0aW9uIGFsaWduPSJib3R0b20iIGlkPSJzZiI+RmlndXJlIDE6IFNpbXBsaWZpZWQgU1NMIEhhbmRzaGFrZSBTZXF1ZW5jZTwvY2FwdGlvbj4KLTx0cj48dGQgYmdjb2xvcj0iI2NjY2NjYyI+Ci08dGFibGUgd2lkdGg9IjU5OCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjZmZmZmZmIj4KLTxpbWcgc3JjPSJzc2xfaW50cm9fZmlnMS5naWYiIGFsdD0iIiB3aWR0aD0iNDIzIiBoZWlnaHQ9IjMyNyI+Ci08L3RkPgotPC90cj48L3RhYmxlPgotPC90ZD48L3RyPjwvdGFibGU+Ci08L2Rpdj4KLTxwPgotVGhlIGVsZW1lbnRzIG9mIHRoZSBoYW5kc2hha2Ugc2VxdWVuY2UsIGFzIHVzZWQgYnkgdGhlIGNsaWVudCBhbmQgc2VydmVyLCBhcmUKLWxpc3RlZCBiZWxvdzoKLTxvbD4KLTxsaT5OZWdvdGlhdGUgdGhlIENpcGhlciBTdWl0ZSB0byBiZSB1c2VkIGR1cmluZyBkYXRhIHRyYW5zZmVyCi08bGk+RXN0YWJsaXNoIGFuZCBzaGFyZSBhIHNlc3Npb24ga2V5IGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIKLTxsaT5PcHRpb25hbGx5IGF1dGhlbnRpY2F0ZSB0aGUgc2VydmVyIHRvIHRoZSBjbGllbnQKLTxsaT5PcHRpb25hbGx5IGF1dGhlbnRpY2F0ZSB0aGUgY2xpZW50IHRvIHRoZSBzZXJ2ZXIKLTwvb2w+Ci08cD4KLVRoZSBmaXJzdCBzdGVwLCBDaXBoZXIgU3VpdGUgTmVnb3RpYXRpb24sIGFsbG93cyB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgdG8KLWNob29zZSBhIENpcGhlciBTdWl0ZSBzdXBwb3J0YWJsZSBieSBib3RoIG9mIHRoZW0uIFRoZSBTU0wzLjAgcHJvdG9jb2wKLXNwZWNpZmljYXRpb24gZGVmaW5lcyAzMSBDaXBoZXIgU3VpdGVzLiBBIENpcGhlciBTdWl0ZSBpcyBkZWZpbmVkIGJ5IHRoZQotZm9sbG93aW5nIGNvbXBvbmVudHM6Ci08dWw+Ci08bGk+S2V5IEV4Y2hhbmdlIE1ldGhvZAotPGxpPkNpcGhlciBmb3IgRGF0YSBUcmFuc2ZlcgotPGxpPk1lc3NhZ2UgRGlnZXN0IGZvciBjcmVhdGluZyB0aGUgTWVzc2FnZSBBdXRoZW50aWNhdGlvbiBDb2RlIChNQUMpCi08L3VsPgotVGhlc2UgdGhyZWUgZWxlbWVudHMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgc2VjdGlvbnMgdGhhdCBmb2xsb3cuCi08aDM+PGEgbmFtZT0iVG9DMTMiPktleSBFeGNoYW5nZSBNZXRob2Q8L2E+PC9oMz4KLVRoZSBrZXkgZXhjaGFuZ2UgbWV0aG9kIGRlZmluZXMgaG93IHRoZSBzaGFyZWQgc2VjcmV0IHN5bW1ldHJpYyBjcnlwdG9ncmFwaHkKLWtleSB1c2VkIGZvciBhcHBsaWNhdGlvbiBkYXRhIHRyYW5zZmVyIHdpbGwgYmUgYWdyZWVkIHVwb24gYnkgY2xpZW50IGFuZAotc2VydmVyLiBTU0wgMi4wIHVzZXMgUlNBIGtleSBleGNoYW5nZSBvbmx5LCB3aGlsZSBTU0wgMy4wIHN1cHBvcnRzIGEgY2hvaWNlIG9mCi1rZXkgZXhjaGFuZ2UgYWxnb3JpdGhtcyBpbmNsdWRpbmcgdGhlIFJTQSBrZXkgZXhjaGFuZ2Ugd2hlbiBjZXJ0aWZpY2F0ZXMgYXJlCi11c2VkLCBhbmQgRGlmZmllLUhlbGxtYW4ga2V5IGV4Y2hhbmdlIGZvciBleGNoYW5naW5nIGtleXMgd2l0aG91dCBjZXJ0aWZpY2F0ZXMKLWFuZCB3aXRob3V0IHByaW9yIGNvbW11bmljYXRpb24gYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlci4KLTxwPgotT25lIHZhcmlhYmxlIGluIHRoZSBjaG9pY2Ugb2Yga2V5IGV4Y2hhbmdlIG1ldGhvZHMgaXMgZGlnaXRhbCBzaWduYXR1cmVzIC0tCi13aGV0aGVyIG9yIG5vdCB0byB1c2UgdGhlbSwgYW5kIGlmIHNvLCB3aGF0IGtpbmQgb2Ygc2lnbmF0dXJlcyB0byB1c2UuCi1TaWduaW5nIHdpdGggYSBwcml2YXRlIGtleSBwcm92aWRlcyBhc3N1cmFuY2UgYWdhaW5zdCBhCi1tYW4taW4tdGhlLW1pZGRsZS1hdHRhY2sgZHVyaW5nIHRoZSBpbmZvcm1hdGlvbiBleGNoYW5nZSB1c2VkIGluIGdlbmVyYXRpbmcKLXRoZSBzaGFyZWQga2V5IFs8YSBocmVmPSIjQUM5NiI+QUM5NjwvYT4sIHA1MTZdLgotPGgzPjxhIG5hbWU9IlRvQzE0Ij5DaXBoZXIgZm9yIERhdGEgVHJhbnNmZXI8L2E+PC9oMz4KLVNTTCB1c2VzIHRoZSBjb252ZW50aW9uYWwgY3J5cHRvZ3JhcGh5IGFsZ29yaXRobSAoc3ltbWV0cmljIGNyeXB0b2dyYXBoeSkKLWRlc2NyaWJlZCBlYXJsaWVyIGZvciBlbmNyeXB0aW5nIG1lc3NhZ2VzIGluIGEgc2Vzc2lvbi4gVGhlcmUgYXJlIG5pbmUKLWNob2ljZXMsIGluY2x1ZGluZyB0aGUgY2hvaWNlIHRvIHBlcmZvcm0gbm8gZW5jcnlwdGlvbjoKLTx1bD4KLTxsaT5ObyBlbmNyeXB0aW9uCi08bGk+U3RyZWFtIENpcGhlcnMKLSAgICA8dWw+Ci0gICAgPGxpPlJDNCB3aXRoIDQwLWJpdCBrZXlzCi0gICAgPGxpPlJDNCB3aXRoIDEyOC1iaXQga2V5cwotICAgIDwvdWw+Ci08bGk+Q0JDIEJsb2NrIENpcGhlcnMKLSAgICA8dWw+Ci0gICAgPGxpPlJDMiB3aXRoIDQwIGJpdCBrZXkKLSAgICA8bGk+REVTIHdpdGggNDAgYml0IGtleQotICAgIDxsaT5ERVMgd2l0aCA1NiBiaXQga2V5Ci0gICAgPGxpPlRyaXBsZS1ERVMgd2l0aCAxNjggYml0IGtleQotICAgIDxsaT5JZGVhICgxMjggYml0IGtleSkKLSAgICA8bGk+Rm9ydGV6emEgKDk2IGJpdCBrZXkpCi0gICAgPC91bD4KLTwvdWw+Ci1IZXJlICJDQkMiIHJlZmVycyB0byBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcsIHdoaWNoIG1lYW5zIHRoYXQgYSBwb3J0aW9uIG9mIHRoZQotcHJldmlvdXNseSBlbmNyeXB0ZWQgY2lwaGVyIHRleHQgaXMgdXNlZCBpbiB0aGUgZW5jcnlwdGlvbiBvZiB0aGUgY3VycmVudAotYmxvY2suICJERVMiIHJlZmVycyB0byB0aGUgRGF0YSBFbmNyeXB0aW9uIFN0YW5kYXJkIFs8YSBocmVmPSIjQUM5NiI+QUM5NjwvYT4sCi1jaDEyXSwgd2hpY2ggaGFzIGEgbnVtYmVyIG9mIHZhcmlhbnRzIChpbmNsdWRpbmcgREVTNDAgYW5kIDNERVNfRURFKS4gIklkZWEiCi1pcyBvbmUgb2YgdGhlIGJlc3QgYW5kIGNyeXB0b2dyYXBoaWNhbGx5IHN0cm9uZ2VzdCBhdmFpbGFibGUgYWxnb3JpdGhtcywgYW5kCi0iUkMyIiBpcyBhIHByb3ByaWV0YXJ5IGFsZ29yaXRobSBmcm9tIFJTQSBEU0kgWzxhIGhyZWY9IiNBQzk2Ij5BQzk2PC9hPiwKLWNoMTNdLgotPGgzPjxhIG5hbWU9IlRvQzE1Ij5EaWdlc3QgRnVuY3Rpb248L2E+PC9oMz4KLVRoZSBjaG9pY2Ugb2YgZGlnZXN0IGZ1bmN0aW9uIGRldGVybWluZXMgaG93IGEgZGlnZXN0IGlzIGNyZWF0ZWQgZnJvbSBhIHJlY29yZAotdW5pdC4gU1NMIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmc6Ci08dWw+Ci08bGk+Tm8gZGlnZXN0IChOdWxsIGNob2ljZSkKLTxsaT5NRDUsIGEgMTI4LWJpdCBoYXNoCi08bGk+U2VjdXJlIEhhc2ggQWxnb3JpdGhtIChTSEEtMSksIGEgMTYwLWJpdCBoYXNoCi08L3VsPgotVGhlIG1lc3NhZ2UgZGlnZXN0IGlzIHVzZWQgdG8gY3JlYXRlIGEgTWVzc2FnZSBBdXRoZW50aWNhdGlvbiBDb2RlIChNQUMpIHdoaWNoCi1pcyBlbmNyeXB0ZWQgd2l0aCB0aGUgbWVzc2FnZSB0byBwcm92aWRlIGludGVncml0eSBhbmQgdG8gcHJldmVudCBhZ2FpbnN0Ci1yZXBsYXkgYXR0YWNrcy4KLTxoMz48YSBuYW1lPSJUb0MxNiI+SGFuZHNoYWtlIFNlcXVlbmNlIFByb3RvY29sPC9hPjwvaDM+Ci1UaGUgaGFuZHNoYWtlIHNlcXVlbmNlIHVzZXMgdGhyZWUgcHJvdG9jb2xzOgotPHVsPgotPGxpPlRoZSA8ZW0+U1NMIEhhbmRzaGFrZSBQcm90b2NvbDwvZW0+Ci0gICAgZm9yIHBlcmZvcm1pbmcgdGhlIGNsaWVudCBhbmQgc2VydmVyIFNTTCBzZXNzaW9uIGVzdGFibGlzaG1lbnQuCi08bGk+VGhlIDxlbT5TU0wgQ2hhbmdlIENpcGhlciBTcGVjIFByb3RvY29sPC9lbT4gZm9yIGFjdHVhbGx5IGVzdGFibGlzaGluZyBhZ3JlZW1lbnQKLSAgICBvbiB0aGUgQ2lwaGVyIFN1aXRlIGZvciB0aGUgc2Vzc2lvbi4KLTxsaT5UaGUgPGVtPlNTTCBBbGVydCBQcm90b2NvbDwvZW0+IGZvcgotICAgIGNvbnZleWluZyBTU0wgZXJyb3IgbWVzc2FnZXMgYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlci4KLTwvdWw+Ci1UaGVzZSBwcm90b2NvbHMsIGFzIHdlbGwgYXMgYXBwbGljYXRpb24gcHJvdG9jb2wgZGF0YSwgYXJlIGVuY2Fwc3VsYXRlZCBpbiB0aGUKLTxlbT5TU0wgUmVjb3JkIFByb3RvY29sPC9lbT4sIGFzIHNob3duIGluIDxhIGhyZWY9IiNmaWd1cmUyIj5GaWd1cmUgMjwvYT4uIEFuCi1lbmNhcHN1bGF0ZWQgcHJvdG9jb2wgaXMgdHJhbnNmZXJyZWQgYXMgZGF0YSBieSB0aGUgbG93ZXIgbGF5ZXIgcHJvdG9jb2wsCi13aGljaCBkb2VzIG5vdCBleGFtaW5lIHRoZSBkYXRhLiBUaGUgZW5jYXBzdWxhdGVkIHByb3RvY29sIGhhcyBubyBrbm93bGVkZ2Ugb2YKLXRoZSB1bmRlcmx5aW5nIHByb3RvY29sLgotPHA+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGEgbmFtZT0iZmlndXJlMiI+PC9hPgotPHRhYmxlIHdpZHRoPSI2MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgYm9yZGVyPSIwIiBzdW1tYXJ5PSIiPgotPGNhcHRpb24gYWxpZ249ImJvdHRvbSIgaWQ9InNmIj5GaWd1cmUgMjogU1NMIFByb3RvY29sIFN0YWNrPC9jYXB0aW9uPgotPHRyPjx0ZCBiZ2NvbG9yPSIjY2NjY2NjIj4KLTx0YWJsZSB3aWR0aD0iNTk4IiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiNmZmZmZmYiPgotPGltZyBzcmM9InNzbF9pbnRyb19maWcyLmdpZiIgYWx0PSIiIHdpZHRoPSI0MjgiIGhlaWdodD0iMjE3Ij4KLTwvdGQ+Ci08L3RyPjwvdGFibGU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLTwvZGl2PgotPHA+Ci1UaGUgZW5jYXBzdWxhdGlvbiBvZiBTU0wgY29udHJvbCBwcm90b2NvbHMgYnkgdGhlIHJlY29yZCBwcm90b2NvbCBtZWFucyB0aGF0Ci1pZiBhbiBhY3RpdmUgc2Vzc2lvbiBpcyByZW5lZ290aWF0ZWQgdGhlIGNvbnRyb2wgcHJvdG9jb2xzIHdpbGwgYmUgdHJhbnNtaXR0ZWQKLXNlY3VyZWx5LiBJZiB0aGVyZSB3ZXJlIG5vIHNlc3Npb24gYmVmb3JlLCB0aGVuIHRoZSBOdWxsIGNpcGhlciBzdWl0ZSBpcwotdXNlZCwgd2hpY2ggbWVhbnMgdGhlcmUgaXMgbm8gZW5jcnlwdGlvbiBhbmQgbWVzc2FnZXMgaGF2ZSBubyBpbnRlZ3JpdHkKLWRpZ2VzdHMgdW50aWwgdGhlIHNlc3Npb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQuCi08aDM+PGEgbmFtZT0iVG9DMTciPkRhdGEgVHJhbnNmZXI8L2E+PC9oMz4KLVRoZSBTU0wgUmVjb3JkIFByb3RvY29sLCBzaG93biBpbiA8YSBocmVmPSIjZmlndXJlMyI+RmlndXJlIDM8L2E+LCBpcyB1c2VkIHRvCi10cmFuc2ZlciBhcHBsaWNhdGlvbiBhbmQgU1NMIENvbnRyb2wgZGF0YSBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlciwKLXBvc3NpYmx5IGZyYWdtZW50aW5nIHRoaXMgZGF0YSBpbnRvIHNtYWxsZXIgdW5pdHMsIG9yIGNvbWJpbmluZyBtdWx0aXBsZQotaGlnaGVyIGxldmVsIHByb3RvY29sIGRhdGEgbWVzc2FnZXMgaW50byBzaW5nbGUgdW5pdHMuIEl0IG1heSBjb21wcmVzcywgYXR0YWNoCi1kaWdlc3Qgc2lnbmF0dXJlcywgYW5kIGVuY3J5cHQgdGhlc2UgdW5pdHMgYmVmb3JlIHRyYW5zbWl0dGluZyB0aGVtIHVzaW5nIHRoZQotdW5kZXJseWluZyByZWxpYWJsZSB0cmFuc3BvcnQgcHJvdG9jb2wgKE5vdGU6IGN1cnJlbnRseSBhbGwgbWFqb3IgU1NMCi1pbXBsZW1lbnRhdGlvbnMgbGFjayBzdXBwb3J0IGZvciBjb21wcmVzc2lvbikuCi08cD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08YSBuYW1lPSJmaWd1cmUzIj48L2E+Ci08dGFibGUgd2lkdGg9IjYwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiBib3JkZXI9IjAiIHN1bW1hcnk9IiI+Ci08Y2FwdGlvbiBhbGlnbj0iYm90dG9tIiBpZD0ic2YiPkZpZ3VyZSAzOiBTU0wgUmVjb3JkIFByb3RvY29sPC9jYXB0aW9uPgotPHRyPjx0ZCBiZ2NvbG9yPSIjY2NjY2NjIj4KLTx0YWJsZSB3aWR0aD0iNTk4IiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiNmZmZmZmYiPgotPGltZyBzcmM9InNzbF9pbnRyb19maWczLmdpZiIgYWx0PSIiIHdpZHRoPSI0MjMiIGhlaWdodD0iMzIzIj4KLTwvdGQ+Ci08L3RyPjwvdGFibGU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLTwvZGl2PgotPGgzPjxhIG5hbWU9IlRvQzE4Ij5TZWN1cmluZyBIVFRQIENvbW11bmljYXRpb248L2E+PC9oMz4KLU9uZSBjb21tb24gdXNlIG9mIFNTTCBpcyB0byBzZWN1cmUgV2ViIEhUVFAgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGEgYnJvd3NlcgotYW5kIGEgd2Vic2VydmVyLiBUaGlzIGNhc2UgZG9lcyBub3QgcHJlY2x1ZGUgdGhlIHVzZSBvZiBub24tc2VjdXJlZCBIVFRQLiBUaGUKLXNlY3VyZSB2ZXJzaW9uIGlzIG1haW5seSBwbGFpbiBIVFRQIG92ZXIgU1NMIChuYW1lZCBIVFRQUyksIGJ1dCB3aXRoIG9uZSBtYWpvcgotZGlmZmVyZW5jZTogaXQgdXNlcyB0aGUgVVJMIHNjaGVtZSA8Y29kZT5odHRwczwvY29kZT4gcmF0aGVyIHRoYW4KLTxjb2RlPmh0dHA8L2NvZGU+IGFuZCBhIGRpZmZlcmVudCBzZXJ2ZXIgcG9ydCAoYnkgZGVmYXVsdCA0NDMpLiBUaGlzIG1haW5seQotaXMgd2hhdCBtb2Rfc3NsIHByb3ZpZGVzIHRvIHlvdSBmb3IgdGhlIEFwYWNoZSB3ZWJzZXJ2ZXIuLi4KLTxoMj48YSBuYW1lPSJUb0MxOSI+UmVmZXJlbmNlczwvYT48L2gyPgotPHVsPgotPHA+Ci08bGk+PGEgbmFtZT0iQUM5NiI+PC9hPgotW0FDOTZdIEJydWNlIFNjaG5laWVyLCA8ZW0+QXBwbGllZCBDcnlwdG9ncmFwaHk8L2VtPiwgMm5kIEVkaXRpb24sIFdpbGV5LAotICAgICAgIDE5OTYuIFNlZSA8YSBocmVmPSJodHRwOi8vd3d3LmNvdW50ZXJwYW5lLmNvbS8iPmh0dHA6Ly93d3cuY291bnRlcnBhbmUuY29tLzwvYT4gZm9yCi0gICAgICAgdmFyaW91cyBvdGhlciBtYXRlcmlhbHMgYnkgQnJ1Y2UgU2NobmVpZXIuCi08cD4KLTxsaT48YSBuYW1lPSJYMjA4Ij48L2E+Ci1bWDIwOF0gSVRVLVQgUmVjb21tZW5kYXRpb24gWC4yMDgsIDxlbT5TcGVjaWZpY2F0aW9uIG9mIEFic3RyYWN0IFN5bnRheCBOb3RhdGlvbgotICAgICAgIE9uZSAoQVNOLjEpPC9lbT4sIDE5ODguIFNlZSBmb3IgaW5zdGFuY2UgPGEKLSAgICAgICBocmVmPSJmdHA6Ly9mdHAubmVkYS5jb20vcHViL2l0dS94LnNlcmllcy94MjA4LnBzIj4KLSAgICAgICBmdHA6Ly9mdHAubmVkYS5jb20vcHViL2l0dS94LnNlcmllcy94MjA4LnBzPC9hPi4KLTxwPgotPGxpPjxhIG5hbWU9Ilg1MDkiPjwvYT4KLVtYNTA5XSBJVFUtVCBSZWNvbW1lbmRhdGlvbiBYLjUwOSwgPGVtPlRoZSBEaXJlY3RvcnkgLSBBdXRoZW50aWNhdGlvbgotICAgICAgIEZyYW1ld29yazwvZW0+LCAxOTg4LiBTZWUgZm9yIGluc3RhbmNlIDxhCi0gICAgICAgaHJlZj0iZnRwOi8vZnRwLmJ1bGwuY29tL3B1Yi9PU0lkaXJlY3RvcnkvSVRVbm92OTYvWC41MDkvOTd4NTA5ZmluYWwuZG9jIj4KLSAgICAgICBmdHA6Ly9mdHAuYnVsbC5jb20vcHViL09TSWRpcmVjdG9yeS9JVFVub3Y5Ni9YLjUwOS85N3g1MDlmaW5hbC5kb2M8L2E+LgotPHA+Ci08bGk+PGEgbmFtZT0iUEtDUyI+PC9hPgotW1BLQ1NdIEthbGlza2ksIEJ1cnRvbiBTLiwgSnIuLCA8ZW0+QW4gT3ZlcnZpZXcgb2YgdGhlIFBLQ1MgU3RhbmRhcmRzPC9lbT4sIEFuIFJTQQotICAgICBMYWJvcmF0b3JpZXMgVGVjaG5pY2FsIE5vdGUsIHJldmlzZWQgTm92ZW1iZXIgMSwgMTk5My4KLSAgICAgU2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cucnNhLmNvbS9yc2FsYWJzL3B1YnMvUEtDUy8iPgotICAgICBodHRwOi8vd3d3LnJzYS5jb20vcnNhbGFicy9wdWJzL1BLQ1MvPC9hPi4KLTxwPgotPGxpPjxhIG5hbWU9Ik1JTUUiPjwvYT4KLVtNSU1FXSBOLiBGcmVlZCwgTi4gQm9yZW5zdGVpbiwgPGVtPk11bHRpcHVycG9zZSBJbnRlcm5ldCBNYWlsIEV4dGVuc2lvbnMKLSAgICAgICAoTUlNRSkgUGFydCBPbmU6IEZvcm1hdCBvZiBJbnRlcm5ldCBNZXNzYWdlIEJvZGllczwvZW0+LCBSRkMyMDQ1LgotICAgICAgIFNlZSBmb3IgaW5zdGFuY2UgPGEgaHJlZj0iZnRwOi8vZnRwLmlzaS5lZHUvaW4tbm90ZXMvcmZjMjA0NS50eHQiPgotICAgICAgIGZ0cDovL2Z0cC5pc2kuZWR1L2luLW5vdGVzL3JmYzIwNDUudHh0PC9hPi4KLTxwPgotPGxpPjxhIG5hbWU9IlNTTDIiPjwvYT4KLVtTU0wyXSBLaXBwIEUuQi4gSGlja21hbiwgPGVtPlRoZSBTU0wgUHJvdG9jb2w8L2VtPiwgMTk5NS4KLSAgICAgICBTZWUgPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRzY2FwZS5jb20vZW5nL3NlY3VyaXR5L1NTTF8yLmh0bWwiPgotICAgICAgIGh0dHA6Ly93d3cubmV0c2NhcGUuY29tL2VuZy9zZWN1cml0eS9TU0xfMi5odG1sPC9hPi4KLTxwPgotPGxpPjxhIG5hbWU9IlNTTDMiPjwvYT4KLVtTU0wzXSBBbGFuIE8uIEZyZWllciwgUGhpbGlwIEthcmx0b24sIFBhdWwgQy4gS29jaGVyLCA8ZW0+VGhlIFNTTCBQcm90b2NvbAotICAgICAgIFZlcnNpb24gMy4wPC9lbT4sIDE5OTYuIFNlZSA8YQotICAgICAgIGhyZWY9Imh0dHA6Ly93d3cubmV0c2NhcGUuY29tL2VuZy9zc2wzL2RyYWZ0MzAyLnR4dCI+Ci0gICAgICAgaHR0cDovL3d3dy5uZXRzY2FwZS5jb20vZW5nL3NzbDMvZHJhZnQzMDIudHh0PC9hPi4KLTxwPgotPGxpPjxhIG5hbWU9IlRMUzEiPjwvYT4KLVtUTFMxXSBUaW0gRGllcmtzLCBDaHJpc3RvcGhlciBBbGxlbiwgPGVtPlRoZSBUTFMgUHJvdG9jb2wgVmVyc2lvbiAxLjA8L2VtPiwKLSAgICAgICAxOTk3LiBTZWUgPGEKLSAgICAgICBocmVmPSJmdHA6Ly9mdHAuaWV0Zi5vcmcvaW50ZXJuZXQtZHJhZnRzL2RyYWZ0LWlldGYtdGxzLXByb3RvY29sLTA2LnR4dCI+Ci0gICAgICAgZnRwOi8vZnRwLmlldGYub3JnL2ludGVybmV0LWRyYWZ0cy9kcmFmdC1pZXRmLXRscy1wcm90b2NvbC0wNi50eHQ8L2E+LgotPC91bD4KLSAgICAgIDxwPgotICAgICAgPGJyPgotICAgICAgPHRhYmxlIHN1bW1hcnk9IiI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICAgPHRhYmxlIHdpZHRoPSI2MDAiIGJvcmRlcj0iMCIgc3VtbWFyeT0iIj4KLSAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCIgd2lkdGg9IjI1MCI+Ci08YSBocmVmPSJzc2xfb3ZlcnZpZXcuaHRtbCIgb25tb3VzZW92ZXI9InJvX2ltZ092ZXIoJ3JvX2ltZ19wcmV2X2JvdCcsICdwcmV2aW91cyBwYWdlJyk7IHJldHVybiB0cnVlIiBvbm1vdXNlb3V0PSJyb19pbWdOb3JtYWwoJ3JvX2ltZ19wcmV2X2JvdCcpOyByZXR1cm4gdHJ1ZSIgb25mb2N1cz0icm9faW1nT3Zlcigncm9faW1nX3ByZXZfYm90JywgJ3ByZXZpb3VzIHBhZ2UnKTsgcmV0dXJuIHRydWUiIG9uYmx1cj0icm9faW1nTm9ybWFsKCdyb19pbWdfcHJldl9ib3QnKTsgcmV0dXJuIHRydWUiPjxpbWcgbmFtZT0icm9faW1nX3ByZXZfYm90IiBzcmM9InNzbF90ZW1wbGF0ZS5uYXZidXQtcHJldi1uLmdpZiIgYWx0PSJwcmV2aW91cyBwYWdlIiB3aWR0aD0iNzAiIGhlaWdodD0iMTgiIGJvcmRlcj0iMCI+PC9hPjxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+T3ZlcnZpZXc8L2ZvbnQ+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0icmlnaHQiIHdpZHRoPSIyNTAiPgotPGEgaHJlZj0ic3NsX3JlZmVyZW5jZS5odG1sIiBvbm1vdXNlb3Zlcj0icm9faW1nT3Zlcigncm9faW1nX25leHRfYm90JywgJ25leHQgcGFnZScpOyByZXR1cm4gdHJ1ZSIgb25tb3VzZW91dD0icm9faW1nTm9ybWFsKCdyb19pbWdfbmV4dF9ib3QnKTsgcmV0dXJuIHRydWUiIG9uZm9jdXM9InJvX2ltZ092ZXIoJ3JvX2ltZ19uZXh0X2JvdCcsICduZXh0IHBhZ2UnKTsgcmV0dXJuIHRydWUiIG9uYmx1cj0icm9faW1nTm9ybWFsKCdyb19pbWdfbmV4dF9ib3QnKTsgcmV0dXJuIHRydWUiPjxpbWcgbmFtZT0icm9faW1nX25leHRfYm90IiBzcmM9InNzbF90ZW1wbGF0ZS5uYXZidXQtbmV4dC1uLmdpZiIgYWx0PSJuZXh0IHBhZ2UiIHdpZHRoPSI3MCIgaGVpZ2h0PSIxOCIgYm9yZGVyPSIwIj48L2E+PGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj5SZWZlcmVuY2U8L2ZvbnQ+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICA8L3RyPgotICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD48aW1nIHNyYz0ic3NsX3RlbXBsYXRlLmltZ2RvdC0xeDEtMDAwMDAwLmdpZiIgYWx0PSIiIHdpZHRoPSI2MDAiIGhlaWdodD0iMiIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIj48L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjx0YWJsZSB3aWR0aD0iNTk4IiBzdW1tYXJ5PSIiPgotICAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIj4KLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5tb2Rzc2wub3JnLyI+bW9kX3NzbDwvYT4gMi44LCBVc2VyIE1hbnVhbDxicj4KLSAgICAgICAgVGhlIEFwYWNoZSBJbnRlcmZhY2UgdG8gT3BlblNTTAotICAgICAgICA8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+Ci0gICAgICAgIENvcHlyaWdodCAmY29weTsgMTk5OC0yMDAxCi0gICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuZW5nZWxzY2hhbGwuY29tLyI+UmFsZiBTLiBFbmdlbHNjaGFsbDwvYT48YnI+Ci0gICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQ8YnI+Ci0gICAgICAgIDwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICA8L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3NzbC9zc2xfaW50cm9fZmlnMS5naWYgYi9kb2NzL21hbnVhbC9zc2wvc3NsX2ludHJvX2ZpZzEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzIwOTg2Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL3NzbC9zc2xfaW50cm9fZmlnMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9zc2wvc3NsX2ludHJvX2ZpZzIuZ2lmIGIvZG9jcy9tYW51YWwvc3NsL3NzbF9pbnRyb19maWcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiMjk1YS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9zc2wvc3NsX2ludHJvX2ZpZzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvc3NsL3NzbF9pbnRyb19maWczLmdpZiBiL2RvY3MvbWFudWFsL3NzbC9zc2xfaW50cm9fZmlnMy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTk3NWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvc3NsL3NzbF9pbnRyb19maWczLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3N0b3BwaW5nLmh0bWwgYi9kb2NzL21hbnVhbC9zdG9wcGluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OThhY2NhLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL3N0b3BwaW5nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCAyLjAvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+U3RvcHBpbmcgYW5kIFJlc3RhcnRpbmcgQXBhY2hlPC9USVRMRT4KLTwvSEVBRD4KLQotPEJPRFk+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPGgxPlN0b3BwaW5nIGFuZCBSZXN0YXJ0aW5nIEFwYWNoZTwvaDE+Ci0KLTxwPllvdSB3aWxsIG5vdGljZSBtYW55IDxjb2RlPmh0dHBkPC9jb2RlPiBleGVjdXRhYmxlcyBydW5uaW5nIG9uIHlvdXIgc3lzdGVtLAotYnV0IHlvdSBzaG91bGQgbm90IHNlbmQgc2lnbmFscyB0byBhbnkgb2YgdGhlbSBleGNlcHQgdGhlIHBhcmVudCwgd2hvc2UKLXBpZCBpcyBpbiB0aGUgPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNwaWRmaWxlIj5QaWRGaWxlPC9hPi4gIFRoYXQgaXMgdG8KLXNheSB5b3Ugc2hvdWxkbid0IGV2ZXIgbmVlZCB0byBzZW5kIHNpZ25hbHMgdG8gYW55IHByb2Nlc3MgZXhjZXB0IHRoZQotcGFyZW50LiAgVGhlcmUgYXJlIHRocmVlIHNpZ25hbHMgdGhhdCB5b3UgY2FuIHNlbmQgdGhlIHBhcmVudDoKLTxjb2RlPlRFUk08L2NvZGU+LCA8Y29kZT5IVVA8L2NvZGU+LCBhbmQgPGNvZGU+VVNSMTwvY29kZT4sIHdoaWNoIHdpbGwKLWJlIGRlc2NyaWJlZCBpbiBhIG1vbWVudC4KLQotPHA+VG8gc2VuZCBhIHNpZ25hbCB0byB0aGUgcGFyZW50IHlvdSBzaG91bGQgaXNzdWUgYSBjb21tYW5kIHN1Y2ggYXM6Ci08YmxvY2txdW90ZT48cHJlPgotICAgIGtpbGwgLVRFUk0gYGNhdCAvdXNyL2xvY2FsL2V0Yy9odHRwZC9sb2dzL2h0dHBkLnBpZGAKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotWW91IGNhbiByZWFkIGFib3V0IGl0cyBwcm9ncmVzcyBieSBpc3N1aW5nOgotCi08YmxvY2txdW90ZT48cHJlPgotICAgIHRhaWwgLWYgL3Vzci9sb2NhbC9ldGMvaHR0cGQvbG9ncy9lcnJvcl9sb2cKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotTW9kaWZ5IHRob3NlIGV4YW1wbGVzIHRvIG1hdGNoIHlvdXIKLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvYT4gYW5kCi08YSBocmVmPSJtb2QvY29yZS5odG1sI3BpZGZpbGUiPlBpZEZpbGU8L2E+IHNldHRpbmdzLgotCi08aDM+VEVSTSBTaWduYWw6IHN0b3Agbm93PC9oMz4KLQotPHA+U2VuZGluZyB0aGUgPGNvZGU+VEVSTTwvY29kZT4gc2lnbmFsIHRvIHRoZSBwYXJlbnQgY2F1c2VzIGl0IHRvCi1pbW1lZGlhdGVseSBhdHRlbXB0IHRvIGtpbGwgb2ZmIGFsbCBvZiBpdHMgY2hpbGRyZW4uICBJdCBtYXkgdGFrZSBpdAotc2V2ZXJhbCBzZWNvbmRzIHRvIGNvbXBsZXRlIGtpbGxpbmcgb2ZmIGl0cyBjaGlsZHJlbi4gIFRoZW4gdGhlCi1wYXJlbnQgaXRzZWxmIGV4aXRzLiAgQW55IHJlcXVlc3RzIGluIHByb2dyZXNzIGFyZSB0ZXJtaW5hdGVkLCBhbmQgbm8KLWZ1cnRoZXIgcmVxdWVzdHMgYXJlIHNlcnZlZC4KLQotPGgzPkhVUCBTaWduYWw6IHJlc3RhcnQgbm93PC9oMz4KLQotPHA+U2VuZGluZyB0aGUgPGNvZGU+SFVQPC9jb2RlPiBzaWduYWwgdG8gdGhlIHBhcmVudCBjYXVzZXMgaXQgdG8ga2lsbCBvZmYKLWl0cyBjaGlsZHJlbiBsaWtlIGluIDxjb2RlPlRFUk08L2NvZGU+IGJ1dCB0aGUgcGFyZW50IGRvZXNuJ3QgZXhpdC4gIEl0Ci1yZS1yZWFkcyBpdHMgY29uZmlndXJhdGlvbiBmaWxlcywgYW5kIHJlLW9wZW5zIGFueSBsb2cgZmlsZXMuCi1UaGVuIGl0IHNwYXducyBhIG5ldyBzZXQgb2YgY2hpbGRyZW4gYW5kIGNvbnRpbnVlcwotc2VydmluZyBoaXRzLgotCi08cD5Vc2VycyBvZiB0aGUKLTxhIGhyZWY9Im1vZC9tb2Rfc3RhdHVzLmh0bWwiPnN0YXR1cyBtb2R1bGU8L2E+Ci13aWxsIG5vdGljZSB0aGF0IHRoZSBzZXJ2ZXIgc3RhdGlzdGljcyBhcmUKLXNldCB0byB6ZXJvIHdoZW4gYSA8Y29kZT5IVVA8L2NvZGU+IGlzIHNlbnQuCi0KLTxoMz5VU1IxIFNpZ25hbDogZ3JhY2VmdWwgcmVzdGFydDwvaDM+Ci0KLTxwPjxiPk5vdGU6PC9iPiBwcmlvciB0byByZWxlYXNlIDEuMmI5IHRoaXMgY29kZSBpcyBxdWl0ZSB1bnN0YWJsZSBhbmQKLXNob3VsZG4ndCBiZSB1c2VkIGF0IGFsbC4KLQotPHA+VGhlIDxjb2RlPlVTUjE8L2NvZGU+IHNpZ25hbCBjYXVzZXMgdGhlIHBhcmVudCBwcm9jZXNzIHRvIDxpPmFkdmlzZTwvaT4KLXRoZSBjaGlsZHJlbiB0byBleGl0IGFmdGVyIHRoZWlyIGN1cnJlbnQgcmVxdWVzdCAob3IgdG8gZXhpdCBpbW1lZGlhdGVseQotaWYgdGhleSdyZSBub3Qgc2VydmluZyBhbnl0aGluZykuICBUaGUgcGFyZW50IHJlLXJlYWRzIGl0cyBjb25maWd1cmF0aW9uCi1maWxlcyBhbmQgcmUtb3BlbnMgaXRzIGxvZyBmaWxlcy4gIEFzIGVhY2ggY2hpbGQgZGllcyBvZmYgdGhlIHBhcmVudAotcmVwbGFjZXMgaXQgd2l0aCBhIGNoaWxkIGZyb20gdGhlIG5ldyA8aT5nZW5lcmF0aW9uPC9pPiBvZiB0aGUKLWNvbmZpZ3VyYXRpb24sIHdoaWNoIGJlZ2lucyBzZXJ2aW5nIG5ldyByZXF1ZXN0cyBpbW1lZGlhdGVseS4KLQotPHA+VGhpcyBjb2RlIGlzIGRlc2lnbmVkIHRvIGFsd2F5cyByZXNwZWN0IHRoZQotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNtYXhjbGllbnRzIj5NYXhDbGllbnRzPC9hPiwKLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjbWluc3BhcmVzZXJ2ZXJzIj5NaW5TcGFyZVNlcnZlcnM8L2E+LAotYW5kIDxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjbWF4c3BhcmVzZXJ2ZXJzIj5NYXhTcGFyZVNlcnZlcnM8L2E+IHNldHRpbmdzLgotRnVydGhlcm1vcmUsIGl0IHJlc3BlY3RzIDxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjc3RhcnRzZXJ2ZXJzIj5TdGFydFNlcnZlcnM8L2E+Ci1pbiB0aGUgZm9sbG93aW5nIG1hbm5lcjogIGlmIGFmdGVyIG9uZSBzZWNvbmQgYXQgbGVhc3QgU3RhcnRTZXJ2ZXJzIG5ldwotY2hpbGRyZW4gaGF2ZSBub3QgYmVlbiBjcmVhdGVkLCB0aGVuIGNyZWF0ZSBlbm91Z2ggdG8gcGljayB1cCB0aGUgc2xhY2suCi1UaGlzIGlzIHRvIHNheSB0aGF0IHRoZSBjb2RlIHRyaWVzIHRvIG1haW50YWluIGJvdGggdGhlIG51bWJlciBvZiBjaGlsZHJlbgotYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxvYWQgb24gdGhlIHNlcnZlciwgYW5kIHJlc3BlY3QgeW91ciB3aXNoZXMKLXdpdGggdGhlIFN0YXJ0U2VydmVycyBwYXJhbWV0ZXIuCi0KLTxwPlVzZXJzIG9mIHRoZQotPGEgaHJlZj0ibW9kL21vZF9zdGF0dXMuaHRtbCI+c3RhdHVzIG1vZHVsZTwvYT4KLXdpbGwgbm90aWNlIHRoYXQgdGhlIHNlcnZlciBzdGF0aXN0aWNzCi1hcmUgPGI+bm90PC9iPiBzZXQgdG8gemVybyB3aGVuIGEgPGNvZGU+VVNSMTwvY29kZT4gaXMgc2VudC4gIFRoZSBjb2RlCi13YXMgd3JpdHRlbiB0byBib3RoIG1pbmltaXplIHRoZSB0aW1lIGluIHdoaWNoIHRoZSBzZXJ2ZXIgaXMgdW5hYmxlIHRvIHNlcnZlCi1uZXcgcmVxdWVzdHMgKHRoZXkgd2lsbCBiZSBxdWV1ZWQgdXAgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0sIHNvIHRoZXkncmUKLW5vdCBsb3N0IGluIGFueSBldmVudCkgYW5kIHRvIHJlc3BlY3QgeW91ciB0dW5pbmcgcGFyYW1ldGVycy4gIEluIG9yZGVyCi10byBkbyB0aGlzIGl0IGhhcyB0byBrZWVwIHRoZSA8aT5zY29yZWJvYXJkPC9pPiB1c2VkIHRvIGtlZXAgdHJhY2sKLW9mIGFsbCBjaGlsZHJlbiBhY3Jvc3MgZ2VuZXJhdGlvbnMuCi0KLTxwPlRoZSBzdGF0dXMgbW9kdWxlIHdpbGwgYWxzbyB1c2UgYSA8Y29kZT5HPC9jb2RlPiB0byBpbmRpY2F0ZSB0aG9zZQotY2hpbGRyZW4gd2hpY2ggYXJlIHN0aWxsIHNlcnZpbmcgcmVxdWVzdHMgc3RhcnRlZCBiZWZvcmUgdGhlIGdyYWNlZnVsCi1yZXN0YXJ0IHdhcyBnaXZlbi4KLQotPHA+QXQgcHJlc2VudCB0aGVyZSBpcyBubyB3YXkgZm9yIGEgbG9nIHJvdGF0aW9uIHNjcmlwdCB1c2luZwotPGNvZGU+VVNSMTwvY29kZT4gdG8ga25vdyBmb3IgY2VydGFpbiB0aGF0IGFsbCBjaGlsZHJlbiB3cml0aW5nIHRoZQotcHJlLXJlc3RhcnQgbG9nIGhhdmUgZmluaXNoZWQuICBXZSBzdWdnZXN0IHRoYXQgeW91IHVzZSBhIHN1aXRhYmxlIGRlbGF5Ci1hZnRlciBzZW5kaW5nIHRoZSA8Y29kZT5VU1IxPC9jb2RlPiBzaWduYWwgYmVmb3JlIHlvdSBkbyBhbnl0aGluZyB3aXRoIHRoZQotb2xkIGxvZy4gIEZvciBleGFtcGxlIGlmIG1vc3Qgb2YgeW91ciBoaXRzIHRha2UgbGVzcyB0aGFuIDEwIG1pbnV0ZXMgdG8KLWNvbXBsZXRlIGZvciB1c2VycyBvbiBsb3cgYmFuZHdpZHRoIGxpbmtzIHRoZW4geW91IGNvdWxkIHdhaXQgMTUgbWludXRlcwotYmVmb3JlIGRvaW5nIGFueXRoaW5nIHdpdGggdGhlIG9sZCBsb2cuCi0KLTxoMz5BcHBlbmRpeDogc2lnbmFscyBhbmQgcmFjZSBjb25kaXRpb25zPC9oMz4KLQotPHA+UHJpb3IgdG8gQXBhY2hlIDEuMmI5IHRoZXJlIHdlcmUgc2V2ZXJhbCA8aT5yYWNlIGNvbmRpdGlvbnM8L2k+Ci1pbnZvbHZpbmcgdGhlIHJlc3RhcnQgYW5kIGRpZSBzaWduYWxzIChhIHNpbXBsZSBkZXNjcmlwdGlvbiBvZiByYWNlCi1jb25kaXRpb24gaXM6IGEgdGltZS1zZW5zaXRpdmUgcHJvYmxlbSwgYXMgaW4gaWYgc29tZXRoaW5nIGhhcHBlbnMgYXQganVzdAotdGhlIHdyb25nIHRpbWUgaXQgd29uJ3QgYmVoYXZlIGFzIGV4cGVjdGVkKS4gIEZvciB0aG9zZSBhcmNoaXRlY3R1cmVzIHRoYXQKLWhhdmUgdGhlICJyaWdodCIgZmVhdHVyZSBzZXQgd2UgaGF2ZSBlbGltaW5hdGVkIGFzIG1hbnkgYXMgd2UgY2FuLgotQnV0IGl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoZXJlIHN0aWxsIGRvIGV4aXN0IHJhY2UgY29uZGl0aW9ucyBvbgotY2VydGFpbiBhcmNoaXRlY3R1cmVzLgotCi08cD5BcmNoaXRlY3R1cmVzIHRoYXQgdXNlIGFuIG9uIGRpc2sgPGEKLWhyZWY9Im1vZC9jb3JlLmh0bWwjc2NvcmVib2FyZGZpbGUiPlNjb3JlQm9hcmRGaWxlPC9hPiBoYXZlIHRoZSBwb3RlbnRpYWwKLXRvIGxvc2UgdHJhY2sgb2YgYSBjaGlsZCBkdXJpbmcgZ3JhY2VmdWwgcmVzdGFydCAoeW91J2xsIHNlZSBhbiA8YQotaHJlZj0ibW9kL2NvcmUuaHRtbCNlcnJvcmxvZyI+RXJyb3JMb2c8L2E+IG1lc3NhZ2Ugc2F5aW5nIHNvbWV0aGluZyBhYm91dAotYSA8aT5sb25nIGxvc3QgY2hpbGQ8L2k+KS4gIFRoZSBTY29yZUJvYXJkRmlsZSBkaXJlY3RpdmUgZXhwbGFpbnMgaG93Ci10byBmaWd1cmUgb3V0IGlmIHlvdXIgc2VydmVyIHVzZXMgYSBmaWxlLCBhbmQgcG9zc2libHkgaG93IHRvIGF2b2lkIGl0LgotVGhlcmUgaXMgYWxzbyB0aGUgcG90ZW50aWFsIHRoYXQgdGhlIHNjb3JlYm9hcmQgd2lsbCBiZSBjb3JydXB0ZWQgZHVyaW5nCi1hbnkgc2lnbmFsbGluZywgYnV0IHRoaXMgb25seSBoYXMgYmFkIGVmZmVjdHMgb24gZ3JhY2VmdWwgcmVzdGFydC4KLQotPHA+PGNvZGU+TkVYVDwvY29kZT4gYW5kIDxjb2RlPk1BQ0hURU48L2NvZGU+IGhhdmUgc21hbGwgcmFjZSBjb25kaXRpb25zCi13aGljaCBjYW4gY2F1c2UgYSByZXN0YXJ0L2RpZSBzaWduYWwgdG8gYmUgbG9zdCwgYnV0IHNob3VsZCBub3QgY2F1c2UgdGhlCi1zZXJ2ZXIgdG8gZG8gYW55dGhpbmcgb3RoZXJ3aXNlIHByb2JsZW1hdGljLgotPCEtLSB0aGV5IGRvbid0IGhhdmUgc2lnYWN0aW9uLCBvciB3ZSdyZSBub3QgdXNpbmcgaXQgLWRqZyAtLT4KLQotPHA+QWxsIGFyY2hpdGVjdHVyZXMgaGF2ZSBhIHNtYWxsIHJhY2UgY29uZGl0aW9uIGluIGVhY2ggY2hpbGQgaW52b2x2aW5nCi10aGUgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IHJlcXVlc3RzIG9uIGEgcGVyc2lzdGVudCBIVFRQIGNvbm5lY3Rpb24KLShLZWVwQWxpdmUpLiAgSXQgbWF5IGV4aXQgYWZ0ZXIgcmVhZGluZyB0aGUgcmVxdWVzdCBsaW5lIGJ1dCBiZWZvcmUKLXJlYWRpbmcgYW55IG9mIHRoZSByZXF1ZXN0IGhlYWRlcnMuICBUaGVyZSBpcyBhIGZpeCB0aGF0IHdhcyBkaXNjb3ZlcmVkCi10b28gbGF0ZSB0byBtYWtlIDEuMi4gIEluIHRoZW9yeSB0aGlzIGlzbid0IGFuIGlzc3VlIGJlY2F1c2UgdGhlIEtlZXBBbGl2ZQotY2xpZW50IGhhcyB0byBleHBlY3QgdGhlc2UgZXZlbnRzIGJlY2F1c2Ugb2YgbmV0d29yayBsYXRlbmNpZXMgYW5kCi1zZXJ2ZXIgdGltZW91dHMuICBJbiBwcmFjdGljZSBpdCBkb2Vzbid0IHNlZW0gdG8gYWZmZWN0IGFueXRoaW5nIGVpdGhlcgotLS0gaW4gYSB0ZXN0IGNhc2UgdGhlIHNlcnZlciB3YXMgcmVzdGFydGVkIHR3ZW50eSB0aW1lcyBwZXIgc2Vjb25kIGFuZAotY2xpZW50cyBzdWNjZXNzZnVsbHkgYnJvd3NlZCB0aGUgc2l0ZSB3aXRob3V0IGdldHRpbmcgYnJva2VuIGltYWdlcyBvcgotZW1wdHkgZG9jdW1lbnRzLgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvc3RvcHBpbmcuaHRtbC5lbiBiL2RvY3MvbWFudWFsL3N0b3BwaW5nLmh0bWwuZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OGFjY2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvc3RvcHBpbmcuaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDIuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5TdG9wcGluZyBhbmQgUmVzdGFydGluZyBBcGFjaGU8L1RJVExFPgotPC9IRUFEPgotCi08Qk9EWT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08aDE+U3RvcHBpbmcgYW5kIFJlc3RhcnRpbmcgQXBhY2hlPC9oMT4KLQotPHA+WW91IHdpbGwgbm90aWNlIG1hbnkgPGNvZGU+aHR0cGQ8L2NvZGU+IGV4ZWN1dGFibGVzIHJ1bm5pbmcgb24geW91ciBzeXN0ZW0sCi1idXQgeW91IHNob3VsZCBub3Qgc2VuZCBzaWduYWxzIHRvIGFueSBvZiB0aGVtIGV4Y2VwdCB0aGUgcGFyZW50LCB3aG9zZQotcGlkIGlzIGluIHRoZSA8YSBocmVmPSJtb2QvY29yZS5odG1sI3BpZGZpbGUiPlBpZEZpbGU8L2E+LiAgVGhhdCBpcyB0bwotc2F5IHlvdSBzaG91bGRuJ3QgZXZlciBuZWVkIHRvIHNlbmQgc2lnbmFscyB0byBhbnkgcHJvY2VzcyBleGNlcHQgdGhlCi1wYXJlbnQuICBUaGVyZSBhcmUgdGhyZWUgc2lnbmFscyB0aGF0IHlvdSBjYW4gc2VuZCB0aGUgcGFyZW50OgotPGNvZGU+VEVSTTwvY29kZT4sIDxjb2RlPkhVUDwvY29kZT4sIGFuZCA8Y29kZT5VU1IxPC9jb2RlPiwgd2hpY2ggd2lsbAotYmUgZGVzY3JpYmVkIGluIGEgbW9tZW50LgotCi08cD5UbyBzZW5kIGEgc2lnbmFsIHRvIHRoZSBwYXJlbnQgeW91IHNob3VsZCBpc3N1ZSBhIGNvbW1hbmQgc3VjaCBhczoKLTxibG9ja3F1b3RlPjxwcmU+Ci0gICAga2lsbCAtVEVSTSBgY2F0IC91c3IvbG9jYWwvZXRjL2h0dHBkL2xvZ3MvaHR0cGQucGlkYAotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1Zb3UgY2FuIHJlYWQgYWJvdXQgaXRzIHByb2dyZXNzIGJ5IGlzc3Vpbmc6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0gICAgdGFpbCAtZiAvdXNyL2xvY2FsL2V0Yy9odHRwZC9sb2dzL2Vycm9yX2xvZwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1Nb2RpZnkgdGhvc2UgZXhhbXBsZXMgdG8gbWF0Y2ggeW91cgotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNzZXJ2ZXJyb290Ij5TZXJ2ZXJSb290PC9hPiBhbmQKLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjcGlkZmlsZSI+UGlkRmlsZTwvYT4gc2V0dGluZ3MuCi0KLTxoMz5URVJNIFNpZ25hbDogc3RvcCBub3c8L2gzPgotCi08cD5TZW5kaW5nIHRoZSA8Y29kZT5URVJNPC9jb2RlPiBzaWduYWwgdG8gdGhlIHBhcmVudCBjYXVzZXMgaXQgdG8KLWltbWVkaWF0ZWx5IGF0dGVtcHQgdG8ga2lsbCBvZmYgYWxsIG9mIGl0cyBjaGlsZHJlbi4gIEl0IG1heSB0YWtlIGl0Ci1zZXZlcmFsIHNlY29uZHMgdG8gY29tcGxldGUga2lsbGluZyBvZmYgaXRzIGNoaWxkcmVuLiAgVGhlbiB0aGUKLXBhcmVudCBpdHNlbGYgZXhpdHMuICBBbnkgcmVxdWVzdHMgaW4gcHJvZ3Jlc3MgYXJlIHRlcm1pbmF0ZWQsIGFuZCBubwotZnVydGhlciByZXF1ZXN0cyBhcmUgc2VydmVkLgotCi08aDM+SFVQIFNpZ25hbDogcmVzdGFydCBub3c8L2gzPgotCi08cD5TZW5kaW5nIHRoZSA8Y29kZT5IVVA8L2NvZGU+IHNpZ25hbCB0byB0aGUgcGFyZW50IGNhdXNlcyBpdCB0byBraWxsIG9mZgotaXRzIGNoaWxkcmVuIGxpa2UgaW4gPGNvZGU+VEVSTTwvY29kZT4gYnV0IHRoZSBwYXJlbnQgZG9lc24ndCBleGl0LiAgSXQKLXJlLXJlYWRzIGl0cyBjb25maWd1cmF0aW9uIGZpbGVzLCBhbmQgcmUtb3BlbnMgYW55IGxvZyBmaWxlcy4KLVRoZW4gaXQgc3Bhd25zIGEgbmV3IHNldCBvZiBjaGlsZHJlbiBhbmQgY29udGludWVzCi1zZXJ2aW5nIGhpdHMuCi0KLTxwPlVzZXJzIG9mIHRoZQotPGEgaHJlZj0ibW9kL21vZF9zdGF0dXMuaHRtbCI+c3RhdHVzIG1vZHVsZTwvYT4KLXdpbGwgbm90aWNlIHRoYXQgdGhlIHNlcnZlciBzdGF0aXN0aWNzIGFyZQotc2V0IHRvIHplcm8gd2hlbiBhIDxjb2RlPkhVUDwvY29kZT4gaXMgc2VudC4KLQotPGgzPlVTUjEgU2lnbmFsOiBncmFjZWZ1bCByZXN0YXJ0PC9oMz4KLQotPHA+PGI+Tm90ZTo8L2I+IHByaW9yIHRvIHJlbGVhc2UgMS4yYjkgdGhpcyBjb2RlIGlzIHF1aXRlIHVuc3RhYmxlIGFuZAotc2hvdWxkbid0IGJlIHVzZWQgYXQgYWxsLgotCi08cD5UaGUgPGNvZGU+VVNSMTwvY29kZT4gc2lnbmFsIGNhdXNlcyB0aGUgcGFyZW50IHByb2Nlc3MgdG8gPGk+YWR2aXNlPC9pPgotdGhlIGNoaWxkcmVuIHRvIGV4aXQgYWZ0ZXIgdGhlaXIgY3VycmVudCByZXF1ZXN0IChvciB0byBleGl0IGltbWVkaWF0ZWx5Ci1pZiB0aGV5J3JlIG5vdCBzZXJ2aW5nIGFueXRoaW5nKS4gIFRoZSBwYXJlbnQgcmUtcmVhZHMgaXRzIGNvbmZpZ3VyYXRpb24KLWZpbGVzIGFuZCByZS1vcGVucyBpdHMgbG9nIGZpbGVzLiAgQXMgZWFjaCBjaGlsZCBkaWVzIG9mZiB0aGUgcGFyZW50Ci1yZXBsYWNlcyBpdCB3aXRoIGEgY2hpbGQgZnJvbSB0aGUgbmV3IDxpPmdlbmVyYXRpb248L2k+IG9mIHRoZQotY29uZmlndXJhdGlvbiwgd2hpY2ggYmVnaW5zIHNlcnZpbmcgbmV3IHJlcXVlc3RzIGltbWVkaWF0ZWx5LgotCi08cD5UaGlzIGNvZGUgaXMgZGVzaWduZWQgdG8gYWx3YXlzIHJlc3BlY3QgdGhlCi08YSBocmVmPSJtb2QvY29yZS5odG1sI21heGNsaWVudHMiPk1heENsaWVudHM8L2E+LAotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNtaW5zcGFyZXNlcnZlcnMiPk1pblNwYXJlU2VydmVyczwvYT4sCi1hbmQgPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNtYXhzcGFyZXNlcnZlcnMiPk1heFNwYXJlU2VydmVyczwvYT4gc2V0dGluZ3MuCi1GdXJ0aGVybW9yZSwgaXQgcmVzcGVjdHMgPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNzdGFydHNlcnZlcnMiPlN0YXJ0U2VydmVyczwvYT4KLWluIHRoZSBmb2xsb3dpbmcgbWFubmVyOiAgaWYgYWZ0ZXIgb25lIHNlY29uZCBhdCBsZWFzdCBTdGFydFNlcnZlcnMgbmV3Ci1jaGlsZHJlbiBoYXZlIG5vdCBiZWVuIGNyZWF0ZWQsIHRoZW4gY3JlYXRlIGVub3VnaCB0byBwaWNrIHVwIHRoZSBzbGFjay4KLVRoaXMgaXMgdG8gc2F5IHRoYXQgdGhlIGNvZGUgdHJpZXMgdG8gbWFpbnRhaW4gYm90aCB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuCi1hcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgbG9hZCBvbiB0aGUgc2VydmVyLCBhbmQgcmVzcGVjdCB5b3VyIHdpc2hlcwotd2l0aCB0aGUgU3RhcnRTZXJ2ZXJzIHBhcmFtZXRlci4KLQotPHA+VXNlcnMgb2YgdGhlCi08YSBocmVmPSJtb2QvbW9kX3N0YXR1cy5odG1sIj5zdGF0dXMgbW9kdWxlPC9hPgotd2lsbCBub3RpY2UgdGhhdCB0aGUgc2VydmVyIHN0YXRpc3RpY3MKLWFyZSA8Yj5ub3Q8L2I+IHNldCB0byB6ZXJvIHdoZW4gYSA8Y29kZT5VU1IxPC9jb2RlPiBpcyBzZW50LiAgVGhlIGNvZGUKLXdhcyB3cml0dGVuIHRvIGJvdGggbWluaW1pemUgdGhlIHRpbWUgaW4gd2hpY2ggdGhlIHNlcnZlciBpcyB1bmFibGUgdG8gc2VydmUKLW5ldyByZXF1ZXN0cyAodGhleSB3aWxsIGJlIHF1ZXVlZCB1cCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSwgc28gdGhleSdyZQotbm90IGxvc3QgaW4gYW55IGV2ZW50KSBhbmQgdG8gcmVzcGVjdCB5b3VyIHR1bmluZyBwYXJhbWV0ZXJzLiAgSW4gb3JkZXIKLXRvIGRvIHRoaXMgaXQgaGFzIHRvIGtlZXAgdGhlIDxpPnNjb3JlYm9hcmQ8L2k+IHVzZWQgdG8ga2VlcCB0cmFjawotb2YgYWxsIGNoaWxkcmVuIGFjcm9zcyBnZW5lcmF0aW9ucy4KLQotPHA+VGhlIHN0YXR1cyBtb2R1bGUgd2lsbCBhbHNvIHVzZSBhIDxjb2RlPkc8L2NvZGU+IHRvIGluZGljYXRlIHRob3NlCi1jaGlsZHJlbiB3aGljaCBhcmUgc3RpbGwgc2VydmluZyByZXF1ZXN0cyBzdGFydGVkIGJlZm9yZSB0aGUgZ3JhY2VmdWwKLXJlc3RhcnQgd2FzIGdpdmVuLgotCi08cD5BdCBwcmVzZW50IHRoZXJlIGlzIG5vIHdheSBmb3IgYSBsb2cgcm90YXRpb24gc2NyaXB0IHVzaW5nCi08Y29kZT5VU1IxPC9jb2RlPiB0byBrbm93IGZvciBjZXJ0YWluIHRoYXQgYWxsIGNoaWxkcmVuIHdyaXRpbmcgdGhlCi1wcmUtcmVzdGFydCBsb2cgaGF2ZSBmaW5pc2hlZC4gIFdlIHN1Z2dlc3QgdGhhdCB5b3UgdXNlIGEgc3VpdGFibGUgZGVsYXkKLWFmdGVyIHNlbmRpbmcgdGhlIDxjb2RlPlVTUjE8L2NvZGU+IHNpZ25hbCBiZWZvcmUgeW91IGRvIGFueXRoaW5nIHdpdGggdGhlCi1vbGQgbG9nLiAgRm9yIGV4YW1wbGUgaWYgbW9zdCBvZiB5b3VyIGhpdHMgdGFrZSBsZXNzIHRoYW4gMTAgbWludXRlcyB0bwotY29tcGxldGUgZm9yIHVzZXJzIG9uIGxvdyBiYW5kd2lkdGggbGlua3MgdGhlbiB5b3UgY291bGQgd2FpdCAxNSBtaW51dGVzCi1iZWZvcmUgZG9pbmcgYW55dGhpbmcgd2l0aCB0aGUgb2xkIGxvZy4KLQotPGgzPkFwcGVuZGl4OiBzaWduYWxzIGFuZCByYWNlIGNvbmRpdGlvbnM8L2gzPgotCi08cD5QcmlvciB0byBBcGFjaGUgMS4yYjkgdGhlcmUgd2VyZSBzZXZlcmFsIDxpPnJhY2UgY29uZGl0aW9uczwvaT4KLWludm9sdmluZyB0aGUgcmVzdGFydCBhbmQgZGllIHNpZ25hbHMgKGEgc2ltcGxlIGRlc2NyaXB0aW9uIG9mIHJhY2UKLWNvbmRpdGlvbiBpczogYSB0aW1lLXNlbnNpdGl2ZSBwcm9ibGVtLCBhcyBpbiBpZiBzb21ldGhpbmcgaGFwcGVucyBhdCBqdXN0Ci10aGUgd3JvbmcgdGltZSBpdCB3b24ndCBiZWhhdmUgYXMgZXhwZWN0ZWQpLiAgRm9yIHRob3NlIGFyY2hpdGVjdHVyZXMgdGhhdAotaGF2ZSB0aGUgInJpZ2h0IiBmZWF0dXJlIHNldCB3ZSBoYXZlIGVsaW1pbmF0ZWQgYXMgbWFueSBhcyB3ZSBjYW4uCi1CdXQgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhlcmUgc3RpbGwgZG8gZXhpc3QgcmFjZSBjb25kaXRpb25zIG9uCi1jZXJ0YWluIGFyY2hpdGVjdHVyZXMuCi0KLTxwPkFyY2hpdGVjdHVyZXMgdGhhdCB1c2UgYW4gb24gZGlzayA8YQotaHJlZj0ibW9kL2NvcmUuaHRtbCNzY29yZWJvYXJkZmlsZSI+U2NvcmVCb2FyZEZpbGU8L2E+IGhhdmUgdGhlIHBvdGVudGlhbAotdG8gbG9zZSB0cmFjayBvZiBhIGNoaWxkIGR1cmluZyBncmFjZWZ1bCByZXN0YXJ0ICh5b3UnbGwgc2VlIGFuIDxhCi1ocmVmPSJtb2QvY29yZS5odG1sI2Vycm9ybG9nIj5FcnJvckxvZzwvYT4gbWVzc2FnZSBzYXlpbmcgc29tZXRoaW5nIGFib3V0Ci1hIDxpPmxvbmcgbG9zdCBjaGlsZDwvaT4pLiAgVGhlIFNjb3JlQm9hcmRGaWxlIGRpcmVjdGl2ZSBleHBsYWlucyBob3cKLXRvIGZpZ3VyZSBvdXQgaWYgeW91ciBzZXJ2ZXIgdXNlcyBhIGZpbGUsIGFuZCBwb3NzaWJseSBob3cgdG8gYXZvaWQgaXQuCi1UaGVyZSBpcyBhbHNvIHRoZSBwb3RlbnRpYWwgdGhhdCB0aGUgc2NvcmVib2FyZCB3aWxsIGJlIGNvcnJ1cHRlZCBkdXJpbmcKLWFueSBzaWduYWxsaW5nLCBidXQgdGhpcyBvbmx5IGhhcyBiYWQgZWZmZWN0cyBvbiBncmFjZWZ1bCByZXN0YXJ0LgotCi08cD48Y29kZT5ORVhUPC9jb2RlPiBhbmQgPGNvZGU+TUFDSFRFTjwvY29kZT4gaGF2ZSBzbWFsbCByYWNlIGNvbmRpdGlvbnMKLXdoaWNoIGNhbiBjYXVzZSBhIHJlc3RhcnQvZGllIHNpZ25hbCB0byBiZSBsb3N0LCBidXQgc2hvdWxkIG5vdCBjYXVzZSB0aGUKLXNlcnZlciB0byBkbyBhbnl0aGluZyBvdGhlcndpc2UgcHJvYmxlbWF0aWMuCi08IS0tIHRoZXkgZG9uJ3QgaGF2ZSBzaWdhY3Rpb24sIG9yIHdlJ3JlIG5vdCB1c2luZyBpdCAtZGpnIC0tPgotCi08cD5BbGwgYXJjaGl0ZWN0dXJlcyBoYXZlIGEgc21hbGwgcmFjZSBjb25kaXRpb24gaW4gZWFjaCBjaGlsZCBpbnZvbHZpbmcKLXRoZSBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgcmVxdWVzdHMgb24gYSBwZXJzaXN0ZW50IEhUVFAgY29ubmVjdGlvbgotKEtlZXBBbGl2ZSkuICBJdCBtYXkgZXhpdCBhZnRlciByZWFkaW5nIHRoZSByZXF1ZXN0IGxpbmUgYnV0IGJlZm9yZQotcmVhZGluZyBhbnkgb2YgdGhlIHJlcXVlc3QgaGVhZGVycy4gIFRoZXJlIGlzIGEgZml4IHRoYXQgd2FzIGRpc2NvdmVyZWQKLXRvbyBsYXRlIHRvIG1ha2UgMS4yLiAgSW4gdGhlb3J5IHRoaXMgaXNuJ3QgYW4gaXNzdWUgYmVjYXVzZSB0aGUgS2VlcEFsaXZlCi1jbGllbnQgaGFzIHRvIGV4cGVjdCB0aGVzZSBldmVudHMgYmVjYXVzZSBvZiBuZXR3b3JrIGxhdGVuY2llcyBhbmQKLXNlcnZlciB0aW1lb3V0cy4gIEluIHByYWN0aWNlIGl0IGRvZXNuJ3Qgc2VlbSB0byBhZmZlY3QgYW55dGhpbmcgZWl0aGVyCi0tLSBpbiBhIHRlc3QgY2FzZSB0aGUgc2VydmVyIHdhcyByZXN0YXJ0ZWQgdHdlbnR5IHRpbWVzIHBlciBzZWNvbmQgYW5kCi1jbGllbnRzIHN1Y2Nlc3NmdWxseSBicm93c2VkIHRoZSBzaXRlIHdpdGhvdXQgZ2V0dGluZyBicm9rZW4gaW1hZ2VzIG9yCi1lbXB0eSBkb2N1bWVudHMuCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9zdHlsZS9tb2R1bGVzeW5vcHNpcy5kdGQgYi9kb2NzL21hbnVhbC9zdHlsZS9tb2R1bGVzeW5vcHNpcy5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YjNjMzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvc3R5bGUvbW9kdWxlc3lub3BzaXMuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04JyA/PgotCi08IUVOVElUWSBuYnNwICImIzE2MDsiPgotCi08IUVOVElUWSAlIGlubGluZXRhZ3MgImVtIHwgc3Ryb25nIHwgY29kZSB8IGEgfCBiciB8IGRpcmVjdGl2ZSB8IG1vZHVsZSI+Ci0KLTwhRU5USVRZICUgYmxvY2t0YWdzICJwIHwgZXhhbXBsZSB8IG5vdGUgfCB0YWJsZSB8IHVsIHwgb2wgfCBkbCB8IHByZQotfCBibG9ja3F1b3RlIj4KLQotPCFFTlRJVFkgJSBCbG9jayAiKCVibG9ja3RhZ3M7KSoiPgotCi08IUVOVElUWSAlIElubGluZSAiKCNQQ0RBVEEgfCAlaW5saW5ldGFnczspKiI+Ci0KLTwhRU5USVRZICUgQmxvY2tPcklubGluZSAiKCNQQ0RBVEEgfCAlaW5saW5ldGFnczsgfCAlYmxvY2t0YWdzOykqIj4KLQotPCFFTEVNRU5UIG1vZHVsZXN5bm9wc2lzIChuYW1lICwgZGVzY3JpcHRpb24sIHN0YXR1cyAsIHNvdXJjZWZpbGU/LAotaWRlbnRpZmllcj8gLCBjb21wYXRpYmlsaXR5PyAsIHN1bW1hcnk/ICwgc2VlYWxzbyogLCBzZWN0aW9uKiwKLWRpcmVjdGl2ZXN5bm9wc2lzKyk+Ci0KLTwhRUxFTUVOVCBkaXJlY3RpdmVzeW5vcHNpcyAobmFtZSAsIGRlc2NyaXB0aW9uPyAsIHN5bnRheD8gLCBkZWZhdWx0PwotLCBjb250ZXh0bGlzdD8gLCBvdmVycmlkZT8gLCBtb2R1bGVsaXN0PywgY29tcGF0aWJpbGl0eT8gLCB1c2FnZT8sIHNlZWFsc28qKT4KLQotPCFFTEVNRU5UIG5hbWUgKCNQQ0RBVEEpPgotCi08IUVMRU1FTlQgc3RhdHVzICgjUENEQVRBKT4KLQotPCFFTEVNRU5UIGlkZW50aWZpZXIgKCNQQ0RBVEEpPgotCi08IUVMRU1FTlQgc291cmNlZmlsZSAoI1BDREFUQSk+Ci0KLTwhRUxFTUVOVCBjb21wYXRpYmlsaXR5ICVJbmxpbmU7PgotCi08IUVMRU1FTlQgZGVzY3JpcHRpb24gJUlubGluZTs+Ci0KLTwhRUxFTUVOVCBzZWN0aW9uIChzZWN0aW9uIHwgdGl0bGUgfCAlYmxvY2t0YWdzOykqPgotCi08IUVMRU1FTlQgbW9kdWxlICgjUENEQVRBKT4KLQotPCFFTEVNRU5UIGV4YW1wbGUgKCNQQ0RBVEEgfCB0aXRsZSB8ICVpbmxpbmV0YWdzOyB8ICVibG9ja3RhZ3M7KSo+Ci0KLTwhRUxFTUVOVCBzZWVhbHNvICVJbmxpbmU7PgotCi08IUVMRU1FTlQgYSAlSW5saW5lOz4KLQotPCFBVFRMSVNUIGEgIGhyZWYgQ0RBVEEgICNSRVFVSVJFRCA+Ci0KLTwhQVRUTElTVCBkaXJlY3RpdmVzeW5vcHNpcyAgdHlwZSBDREFUQSAgI0lNUExJRUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gQ0RBVEEgICNJTVBMSUVEID4KLQotPCFFTEVNRU5UIHN5bnRheCAlSW5saW5lOz4KLQotPCFFTEVNRU5UIGRlZmF1bHQgKCNQQ0RBVEEpPgotCi08IUVMRU1FTlQgY29udGV4dGxpc3QgKGNvbnRleHQrKSs+Ci0KLTwhRUxFTUVOVCBtb2R1bGVsaXN0IChtb2R1bGUpKz4KLQotPCFFTEVNRU5UIGNvbnRleHQgKCNQQ0RBVEEpPgotCi08IUVMRU1FTlQgb3ZlcnJpZGUgKCNQQ0RBVEEpPgotCi08IUVMRU1FTlQgbm90ZSAoI1BDREFUQSB8IHRpdGxlIHwgJWlubGluZXRhZ3M7IHwgJWJsb2NrdGFnczspKj4KLTwhQVRUTElTVCBub3RlIHR5cGUgQ0RBVEEgI0lNUExJRUQ+Ci0KLTwhRUxFTUVOVCB0aXRsZSAlSW5saW5lOz4KLQotPCFFTEVNRU5UIHAgJUlubGluZTs+Ci0KLTwhRUxFTUVOVCB1bCAobGkrKT4KLQotPCFFTEVNRU5UIG9sIChsaSspPgotCi08IUVMRU1FTlQgbGkgJUJsb2NrT3JJbmxpbmU7PgotCi08IUVMRU1FTlQgc3Ryb25nICVJbmxpbmU7PgotCi08IUVMRU1FTlQgYnIgRU1QVFk+Ci0KLTwhRUxFTUVOVCB0YWJsZSAodHIpKz4KLQotPCFFTEVNRU5UIHRyICh0ZCkrPgotCi08IUVMRU1FTlQgdGQgJUJsb2NrT3JJbmxpbmU7PgotCi08IUFUVExJU1QgdGQgIGNvbHNwYW4gQ0RBVEEgICNJTVBMSUVECi0gICAgICAgICAgICAgICAgcm93c3BhbiBDREFUQSAgI0lNUExJRUQKLSAgICAgICAgICAgICAgICBjbGFzcyAgIENEQVRBICAjSU1QTElFRCA+Ci08IUVMRU1FTlQgZGlyZWN0aXZlICgjUENEQVRBKT4KLQotPCFBVFRMSVNUIGRpcmVjdGl2ZSAgbW9kdWxlIENEQVRBICAjSU1QTElFRAotICAgICAgICAgICAgICAgICAgICAgdHlwZSAgIENEQVRBICAjSU1QTElFRCA+Ci0KLTwhRUxFTUVOVCBjb2RlICVJbmxpbmU7PgotCi08IUVMRU1FTlQgZGwgKGRkIHwgZHQpKz4KLQotPCFFTEVNRU5UIGR0ICVJbmxpbmU7PgotCi08IUVMRU1FTlQgZGQgJUJsb2NrT3JJbmxpbmU7PgotCi08IUVMRU1FTlQgZW0gJUlubGluZTs+Ci0KLTwhRUxFTUVOVCB1c2FnZSAlQmxvY2s7PgotCi08IUVMRU1FTlQgc3VtbWFyeSAlQmxvY2s7PgotCi08IUVMRU1FTlQgYmxvY2txdW90ZSAlQmxvY2tPcklubGluZTs+Ci0KLTwhRUxFTUVOVCBwcmUgJUlubGluZTs+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvc3VleGVjLmh0bWwgYi9kb2NzL21hbnVhbC9zdWV4ZWMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEyMDdhYy4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9zdWV4ZWMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTxodG1sPjxoZWFkPgotPHRpdGxlPkFwYWNoZSBTZXRVc2VySUQgU3VwcG9ydDwvdGl0bGU+Ci08L2hlYWQ+PGJvZHk+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08aDE+QXBhY2hlIFNldFVzZXJJRCBTdXBwb3J0PC9oMT4KLQotPGhyPgotCi08aDI+V2hhdCBpcyBTVUV4ZWM/PC9oMj4KLQotPGgyPkVuYWJsaW5nIFNVRXhlYyBTdXBwb3J0PC9oMj4KLQotPGgyPldoZW4gU1VFeGVjIElzIFVzZWQ8L2gyPgotCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3N1ZXhlYy5odG1sLmVuIGIvZG9jcy9tYW51YWwvc3VleGVjLmh0bWwuZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjA3YWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvc3VleGVjLmh0bWwuZW4KKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08aHRtbD48aGVhZD4KLTx0aXRsZT5BcGFjaGUgU2V0VXNlcklEIFN1cHBvcnQ8L3RpdGxlPgotPC9oZWFkPjxib2R5PgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPGgxPkFwYWNoZSBTZXRVc2VySUQgU3VwcG9ydDwvaDE+Ci0KLTxocj4KLQotPGgyPldoYXQgaXMgU1VFeGVjPzwvaDI+Ci0KLTxoMj5FbmFibGluZyBTVUV4ZWMgU3VwcG9ydDwvaDI+Ci0KLTxoMj5XaGVuIFNVRXhlYyBJcyBVc2VkPC9oMj4KLQotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC91cGdyYWRpbmcuaHRtbCBiL2RvY3MvbWFudWFsL3VwZ3JhZGluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTBhMDY0Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL3VwZ3JhZGluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+PEhFQUQ+Ci08VElUTEU+VXBncmFkaW5nIHRvIDIuMCBmcm9tIDEuMzwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPlVwZ3JhZGluZyB0byAyLjAgZnJvbSAxLjM8L0gxPgotCi08UD5JbiBvcmRlciB0byBhc3Npc3QgZm9sa3MgdXBncmFkaW5nLCB3ZSBtYWludGFpbiBhIGRvY3VtZW50Ci1kZXNjcmliaW5nIGluZm9ybWF0aW9uIGNyaXRpY2FsIHRvIGV4aXN0aW5nIEFwYWNoZSB1c2Vycy4gIFRoZXNlIGFyZQotaW50ZW5kZWQgdG8gYmUgYnJpZWYgbm90ZXMsIGFuZCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gZmluZCBtb3JlCi1pbmZvcm1hdGlvbiBpbiBlaXRoZXIgdGhlIDxBIEhSRUY9Im5ld19mZWF0dXJlc18yXzAuaHRtbCI+TmV3Ci1GZWF0dXJlczwvQT4gZG9jdW1lbnQsIG9yIGluIHRoZSA8Q09ERT5zcmMvQ0hBTkdFUzwvQ09ERT4gZmlsZS4KLQotPEgzPkNvbXBpbGUtVGltZSBDb25maWd1cmF0aW9uIENoYW5nZXM8L0gzPgotCi08VUw+Ci08TEk+QXBhY2hlIG5vdyB1c2VzIGFuIDxjb2RlPmF1dG9jb25mPC9jb2RlPiBhbmQgPGNvZGU+bGlidG9vbDwvY29kZT4KLXN5c3RlbSBmb3IgY29uZmlndXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3Nlcy4gIFVzaW5nIHRoaXMgc3lzdGVtCi1pcyBzaW1pbGFyIHRvLCBidXQgbm90IHRoZSBzYW1lIGFzLCB1c2luZyB0aGUgQVBBQ0kgc3lzdGVtIGluCi1BcGFjaGUgMS4zLiAgRnVydGhlciBkb2N1bWVudGF0aW9uIHRvIGZvbGxvdy48L2xpPgotCi08bGk+SW4gYWRkaXRpb24gdG8gdGhlIHVzdWFsIHNlbGVjdGlvbiBvZiBtb2R1bGVzIHdoaWNoIHlvdSBjYW4KLWNob29zZSB0byBjb21waWxlLCBBcGFjaGUgMi4wIGhhcyBtb3ZlZCB0aGUgbWFpbiBwYXJ0IG9mIHJlcXVlc3QKLXByb2Nlc3NpbmcgaW50byBNdWx0aS1Qcm9jZXNzaW5nLU1vZHVsZXMgKE1QTXMpLiAgRG9jdW1lbnRhdGlvbgotb24gaG93IHRvIHNlbGVjdCBhbiBNUE0gaXMgdG8gZm9sbG93LjwvbGk+Ci08L1VMPgotCi08SDM+UnVuLVRpbWUgQ29uZmlndXJhdGlvbiBDaGFuZ2VzPC9IMz4KLQotPFVMPgotPGxpPlRoZSA8Y29kZT5DYWNoZU5lZ290aWF0ZWREb2NzPC9jb2RlPiBkaXJlY3RpdmUgbm93IHRha2VzCi10aGUgYXJndW1lbnQgPGNvZGU+b248L2NvZGU+IG9yIDxjb2RlPm9mZjwvY29kZT4uICBFeGlzdGluZwotaW5zdGFuY2VzIG9mIDxjb2RlPkNhY2hlTmVnb3RpYXRlZERvY3M8L2NvZGU+IHNob3VsZCBiZSByZXBsYWNlZAotd2l0aCA8Y29kZT5DYWNoTmVnb3RpYXRlZERvY3Mgb248L2NvZGU+LjwvbGk+Ci0KLTxsaT5UaGUgPGNvZGU+RXJyb3JEb2N1bWVudDwvY29kZT4gZGlyZWN0aXZlIG5vIGxvbmdlciB1c2VzIGEgc2luZ2xlCi1xdW90ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcmd1bWVudCB0byBpbmRpY2F0ZSBhIHRleHQgbWVzc2FnZS4KLUluc3RlYWQsIHlvdSBzaG91bGQgZW5jbG9zZSB0aGUgbWVzc2FnZSBpbiBkb3VibGUgcXVvdGVzLiAgRm9yCi1leGFtcGxlLCBleGlzdGluZyBpbnN0YW5jZXMgb2YgPGNvZGU+RXJyb3JEb2N1bWVudCA0MDMgIlNvbWUKLU1lc3NhZ2U8L2NvZGU+IHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIDxjb2RlPkVycm9yRG9jdW1lbnQgNDAzICJTb21lCi1NZXNzYWdlIjwvY29kZT4uICBBcyBsb25nIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgbm90IGEgdmFsaWQgVVJMIG9yCi1wYXRobmFtZSwgaXQgd2lsbCBiZSB0cmVhdGVkIGFzIGEgdGV4dCBtZXNzYWdlLjwvbGk+Ci0KLTxsaT5UaGUgPGNvZGU+QWNjZXNzQ29uZmlnPC9jb2RlPiBhbmQgPGNvZGU+UmVzb3VyY2VDb25maWc8L2NvZGU+Ci1kaXJlY3RpdmVzIG5vIGxvbmdlciBleGlzdC4gIEV4aXN0aW5nIGluc3RhbmNlcyBvZiB0aGVzZSBkaXJlY3RpdmVzCi1jYW4gYmUgcmVwbGFjZWQgd2l0aCB0aGUgPGNvZGU+SW5jbHVkZTwvY29kZT4gZGlyZWN0aXZlIHdoaWNoCi1oYXMgZXF1aXZhbGVudCBmdW5jdGlvbmFsaXR5LiAgSWYgeW91IHdlcmUgbWFraW5nIHVzZSBvZiB0aGUgCi1kZWZhdWx0IHZhbHVlcyBvZiB0aGVzZSBkaXJlY3RpdmVzIHdpdGhvdXQgaW5jbHVkaW5nIHRoZW0gaW4KLXRoZSBjb25maWd1cmF0aW9uIGZpbGVzLCB5b3UgbWF5IG5lZWQgdG8gYWRkCi08Y29kZT5JbmNsdWRlIGNvbmYvYWNjZXNzLmNvbmY8L2NvZGU+IGFuZCA8Y29kZT5JbmNsdWRlIGNvbmYvc3JtLmNvbmY8L2NvZGU+Ci10byB5b3VyIGh0dHBkLmNvbmYuPC9saT4KLQotPGxpPlRoZSA8Y29kZT5FeHRlbmRlZFN0YXR1czwvY29kZT4gZGlyZWN0aXZlIG5vIGxvbmdlciBleGlzdHMuPC9saT4KLQotPGxpPlRoZSA8Y29kZT5TZXJ2ZXJUeXBlPC9jb2RlPiBkaXJlY3RpdmUgbm8gbG9uZ2VyIGV4aXN0cy48L2xpPgotCi08bGk+VGhlIDxjb2RlPkNvcmVEdW1wRGlyZWN0b3J5PC9jb2RlPiBkaXJlY3RpdmUgbm8gbG9uZ2VyIGV4aXN0cy48L2xpPgotCi08bGk+TWFueSBkaXJlY3RpdmVzIHRoYXQgd2VyZSBpbiB0aGUgY29yZSBzZXJ2ZXIgaW4gQXBhY2hlIDEuMwotYXJlIG5vdyBpbiB0aGUgTVBNcy48L2xpPgotCi0KLTwvVUw+Ci0KLTxIMz5NaXNjIENoYW5nZXM8L0gzPgotCi08VUw+Ci08bGk+VGhlIG1vZHVsZSBtb2RfYXV0aF9kaWdlc3QsIHdoaWNoIHdhcyBleHBlcmltZW50YWwgaW4gQXBhY2hlIDEuMwotaXMgbm93IGEgc3RhbmRhcmQgbW9kdWxlLjwvbGk+Ci0KLTxsaT5UaGUgbW9kX21tYXBfc3RhdGljIG1vZHVsZSwgd2hpY2ggd2FzIGV4cGVyaW1lbnRhbCBpbiBBcGFjaGUgMS4zCi1oYXMgYmVlbiByZXBsYWNlZCB3aXRoIG1vZF9maWxlX2NhY2hlLjwvbGk+Ci0KLQotPC9VTD4KLQotPEgzPlRoaXJkIFBhcnR5IE1vZHVsZXM8L0gzPgotCi08cD5FeHRlbnNpdmUgY2hhbmdlcyB3ZXJlIG1hZGUgdG8gdGhlIHNlcnZlciBBUEkgaW4gQXBhY2hlIDIuMC4KLUV4aXN0aW5nIG1vZHVsZXMgZGVzaWduZWQgZm9yIHRoZSBBcGFjaGUgMS4zIEFQSSB3aWxsIDxzdHJvbmc+bm90PC9zdHJvbmc+Ci13b3JrIGluIEFwYWNoZSAyLjAgd2l0aG91dCBtb2RpZmljYXRpb24uICBEZXRhaWxzIHRvIGZvbGxvdy4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3VwZ3JhZGluZy5odG1sLmVuIGIvZG9jcy9tYW51YWwvdXBncmFkaW5nLmh0bWwuZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MGEwNjQuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvdXBncmFkaW5nLmh0bWwuZW4KKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD48SEVBRD4KLTxUSVRMRT5VcGdyYWRpbmcgdG8gMi4wIGZyb20gMS4zPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+VXBncmFkaW5nIHRvIDIuMCBmcm9tIDEuMzwvSDE+Ci0KLTxQPkluIG9yZGVyIHRvIGFzc2lzdCBmb2xrcyB1cGdyYWRpbmcsIHdlIG1haW50YWluIGEgZG9jdW1lbnQKLWRlc2NyaWJpbmcgaW5mb3JtYXRpb24gY3JpdGljYWwgdG8gZXhpc3RpbmcgQXBhY2hlIHVzZXJzLiAgVGhlc2UgYXJlCi1pbnRlbmRlZCB0byBiZSBicmllZiBub3RlcywgYW5kIHlvdSBzaG91bGQgYmUgYWJsZSB0byBmaW5kIG1vcmUKLWluZm9ybWF0aW9uIGluIGVpdGhlciB0aGUgPEEgSFJFRj0ibmV3X2ZlYXR1cmVzXzJfMC5odG1sIj5OZXcKLUZlYXR1cmVzPC9BPiBkb2N1bWVudCwgb3IgaW4gdGhlIDxDT0RFPnNyYy9DSEFOR0VTPC9DT0RFPiBmaWxlLgotCi08SDM+Q29tcGlsZS1UaW1lIENvbmZpZ3VyYXRpb24gQ2hhbmdlczwvSDM+Ci0KLTxVTD4KLTxMST5BcGFjaGUgbm93IHVzZXMgYW4gPGNvZGU+YXV0b2NvbmY8L2NvZGU+IGFuZCA8Y29kZT5saWJ0b29sPC9jb2RlPgotc3lzdGVtIGZvciBjb25maWd1cmluZyB0aGUgYnVpbGQgcHJvY2Vzc2VzLiAgVXNpbmcgdGhpcyBzeXN0ZW0KLWlzIHNpbWlsYXIgdG8sIGJ1dCBub3QgdGhlIHNhbWUgYXMsIHVzaW5nIHRoZSBBUEFDSSBzeXN0ZW0gaW4KLUFwYWNoZSAxLjMuICBGdXJ0aGVyIGRvY3VtZW50YXRpb24gdG8gZm9sbG93LjwvbGk+Ci0KLTxsaT5JbiBhZGRpdGlvbiB0byB0aGUgdXN1YWwgc2VsZWN0aW9uIG9mIG1vZHVsZXMgd2hpY2ggeW91IGNhbgotY2hvb3NlIHRvIGNvbXBpbGUsIEFwYWNoZSAyLjAgaGFzIG1vdmVkIHRoZSBtYWluIHBhcnQgb2YgcmVxdWVzdAotcHJvY2Vzc2luZyBpbnRvIE11bHRpLVByb2Nlc3NpbmctTW9kdWxlcyAoTVBNcykuICBEb2N1bWVudGF0aW9uCi1vbiBob3cgdG8gc2VsZWN0IGFuIE1QTSBpcyB0byBmb2xsb3cuPC9saT4KLTwvVUw+Ci0KLTxIMz5SdW4tVGltZSBDb25maWd1cmF0aW9uIENoYW5nZXM8L0gzPgotCi08VUw+Ci08bGk+VGhlIDxjb2RlPkNhY2hlTmVnb3RpYXRlZERvY3M8L2NvZGU+IGRpcmVjdGl2ZSBub3cgdGFrZXMKLXRoZSBhcmd1bWVudCA8Y29kZT5vbjwvY29kZT4gb3IgPGNvZGU+b2ZmPC9jb2RlPi4gIEV4aXN0aW5nCi1pbnN0YW5jZXMgb2YgPGNvZGU+Q2FjaGVOZWdvdGlhdGVkRG9jczwvY29kZT4gc2hvdWxkIGJlIHJlcGxhY2VkCi13aXRoIDxjb2RlPkNhY2hOZWdvdGlhdGVkRG9jcyBvbjwvY29kZT4uPC9saT4KLQotPGxpPlRoZSA8Y29kZT5FcnJvckRvY3VtZW50PC9jb2RlPiBkaXJlY3RpdmUgbm8gbG9uZ2VyIHVzZXMgYSBzaW5nbGUKLXF1b3RlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFyZ3VtZW50IHRvIGluZGljYXRlIGEgdGV4dCBtZXNzYWdlLgotSW5zdGVhZCwgeW91IHNob3VsZCBlbmNsb3NlIHRoZSBtZXNzYWdlIGluIGRvdWJsZSBxdW90ZXMuICBGb3IKLWV4YW1wbGUsIGV4aXN0aW5nIGluc3RhbmNlcyBvZiA8Y29kZT5FcnJvckRvY3VtZW50IDQwMyAiU29tZQotTWVzc2FnZTwvY29kZT4gc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggPGNvZGU+RXJyb3JEb2N1bWVudCA0MDMgIlNvbWUKLU1lc3NhZ2UiPC9jb2RlPi4gIEFzIGxvbmcgYXMgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBub3QgYSB2YWxpZCBVUkwgb3IKLXBhdGhuYW1lLCBpdCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSB0ZXh0IG1lc3NhZ2UuPC9saT4KLQotPGxpPlRoZSA8Y29kZT5BY2Nlc3NDb25maWc8L2NvZGU+IGFuZCA8Y29kZT5SZXNvdXJjZUNvbmZpZzwvY29kZT4KLWRpcmVjdGl2ZXMgbm8gbG9uZ2VyIGV4aXN0LiAgRXhpc3RpbmcgaW5zdGFuY2VzIG9mIHRoZXNlIGRpcmVjdGl2ZXMKLWNhbiBiZSByZXBsYWNlZCB3aXRoIHRoZSA8Y29kZT5JbmNsdWRlPC9jb2RlPiBkaXJlY3RpdmUgd2hpY2gKLWhhcyBlcXVpdmFsZW50IGZ1bmN0aW9uYWxpdHkuICBJZiB5b3Ugd2VyZSBtYWtpbmcgdXNlIG9mIHRoZSAKLWRlZmF1bHQgdmFsdWVzIG9mIHRoZXNlIGRpcmVjdGl2ZXMgd2l0aG91dCBpbmNsdWRpbmcgdGhlbSBpbgotdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMsIHlvdSBtYXkgbmVlZCB0byBhZGQKLTxjb2RlPkluY2x1ZGUgY29uZi9hY2Nlc3MuY29uZjwvY29kZT4gYW5kIDxjb2RlPkluY2x1ZGUgY29uZi9zcm0uY29uZjwvY29kZT4KLXRvIHlvdXIgaHR0cGQuY29uZi48L2xpPgotCi08bGk+VGhlIDxjb2RlPkV4dGVuZGVkU3RhdHVzPC9jb2RlPiBkaXJlY3RpdmUgbm8gbG9uZ2VyIGV4aXN0cy48L2xpPgotCi08bGk+VGhlIDxjb2RlPlNlcnZlclR5cGU8L2NvZGU+IGRpcmVjdGl2ZSBubyBsb25nZXIgZXhpc3RzLjwvbGk+Ci0KLTxsaT5UaGUgPGNvZGU+Q29yZUR1bXBEaXJlY3Rvcnk8L2NvZGU+IGRpcmVjdGl2ZSBubyBsb25nZXIgZXhpc3RzLjwvbGk+Ci0KLTxsaT5NYW55IGRpcmVjdGl2ZXMgdGhhdCB3ZXJlIGluIHRoZSBjb3JlIHNlcnZlciBpbiBBcGFjaGUgMS4zCi1hcmUgbm93IGluIHRoZSBNUE1zLjwvbGk+Ci0KLQotPC9VTD4KLQotPEgzPk1pc2MgQ2hhbmdlczwvSDM+Ci0KLTxVTD4KLTxsaT5UaGUgbW9kdWxlIG1vZF9hdXRoX2RpZ2VzdCwgd2hpY2ggd2FzIGV4cGVyaW1lbnRhbCBpbiBBcGFjaGUgMS4zCi1pcyBub3cgYSBzdGFuZGFyZCBtb2R1bGUuPC9saT4KLQotPGxpPlRoZSBtb2RfbW1hcF9zdGF0aWMgbW9kdWxlLCB3aGljaCB3YXMgZXhwZXJpbWVudGFsIGluIEFwYWNoZSAxLjMKLWhhcyBiZWVuIHJlcGxhY2VkIHdpdGggbW9kX2ZpbGVfY2FjaGUuPC9saT4KLQotCi08L1VMPgotCi08SDM+VGhpcmQgUGFydHkgTW9kdWxlczwvSDM+Ci0KLTxwPkV4dGVuc2l2ZSBjaGFuZ2VzIHdlcmUgbWFkZSB0byB0aGUgc2VydmVyIEFQSSBpbiBBcGFjaGUgMi4wLgotRXhpc3RpbmcgbW9kdWxlcyBkZXNpZ25lZCBmb3IgdGhlIEFwYWNoZSAxLjMgQVBJIHdpbGwgPHN0cm9uZz5ub3Q8L3N0cm9uZz4KLXdvcmsgaW4gQXBhY2hlIDIuMCB3aXRob3V0IG1vZGlmaWNhdGlvbi4gIERldGFpbHMgdG8gZm9sbG93LgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvdXBncmFkaW5nLmh0bWwuZnIgYi9kb2NzL21hbnVhbC91cGdyYWRpbmcuaHRtbC5mcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI0YTFiYy4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC91cGdyYWRpbmcuaHRtbC5mcgorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD48SEVBRD4KLTxUSVRMRT5NaXNlICZhZ3JhdmU7IGpvdXIgZGUgbGEgdmVyc2lvbiAxLjMgJmFncmF2ZTsgbGEgdmVyc2lvbiAyLjA8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5NaXNlICZhZ3JhdmU7IGRlIGxhIHZlcnNpb24gMS4zICZhZ3JhdmU7IGxhIHZlcnNpb24gMi4wPC9IMT4KLQotPFA+QWZpbiBkJ2FpZGVyIGxlcyBwZXJzb25uZXMgc291aGFpdGFudCBzZSBtZXR0cmUgJmFncmF2ZTsgam91ciwgbm91cyAKLW1haW50ZW5vbnMgdW4gZG9jdW1lbnQgZCZlYWN1dGU7Y3JpdmFudCBsZXMgaW5mb3JtYXRpb25zIGNyaXRpcXVlcyBjb25jZXJuYW50Ci1sZXMgdXRpbGlzYXRldXJzIGQnQXBhY2hlLiBDZXMgaW5mb3JtYXRpb25zIHNvbnQgc291cyBsYSBmb3JtZSBkZSBiciZlZ3JhdmU7dmVzIAotbm90ZXMsIGV0IHZvdXMgcG91dmV6IHRyb3V2ZXIgcGx1cyBkJ2luZm9ybWF0aW9ucyBkYW5zIGxlIGRvY3VtZW50IAotIDxBIEhSRUY9Im5ld19mZWF0dXJlc18yXzAuaHRtbCI+Tm91dmVsbGVzIGZvbmN0aW9ubmFsaXQmZWFjdXRlO3M8L0E+IAotIG91IGRhbnMgbGUgZmljaGllciA8Q09ERT5zcmMvQ0hBTkdFUzwvQ09ERT4uCi0KLTxIMz5DaGFuZ2VtZW50IGRlIGxhIGNvbmZpZ3VyYXRpb24gJmFncmF2ZTsgbGEgY29tcGlsYXRpb248L0gzPgotCi08VUw+Ci08TEk+QXBhY2hlIHV0aWxpc2UgbWFpbnRlbmFudCA8Y29kZT5hdXRvY29uZjwvY29kZT4gZXQgPGNvZGU+bGlidG9vbDwvY29kZT4KLWFmaW4gZGUgY29uZmlndXJlciBsYSBjb21waWxhdGlvbi4gTCd1dGlsaXNhdGlvbiBkZSBjZXMgb3V0aWxzIGVzdAotc2ltaWxhaXJlLCBtYWlzIHBhcyB0b3V0ICZhZ3JhdmU7IGZhaXQgaWRlbnRpcXVlLCBhdSBzeXN0JmVncmF2ZTttZSBBUEFDSQotZGUgY29uZmlndXJhdGlvbiBleGlzdGFudCBkYW5zIGxhIHZlcnNpb24gMS4zIGQnQXBhY2hlLiAKLTwvbGk+Ci0KLTxsaT5FbiBwbHVzIGRlIGwnaGFiaXR1ZWxsZSBzJmVhY3V0ZTtsZWN0aW9uIGRlIG1vZHVsZXMgcXVlIHZvdXMgcG91dmV6IGNob2lzaXIKLWRlIGNvbXBpbGVyLCBBcGFjaGUgMi4wIGEgZCZlYWN1dGU7cGxhYyZlYWN1dGU7IGxhIG1hamV1cmUgcGFydGllIGR1IHRyYWl0ZW1lbnQKLWRlcyByZXF1JmVjaXJjO3RlcyBkYW5zIGxlcyA8YSBocmVmPSJtcG0uaHRtbCI+bW9kdWxlcyBtdWx0aS10cmFpdGVtZW50czwvYT4gKE1QTXMpLjwvbGk+Ci08L1VMPgotCi08SDM+Q2hhbmdlbWVudCBkZSBsYSBjb25maWd1cmF0aW9uICZhZ3JhdmU7ICBsJ2V4JmVhY3V0ZTtjdXRpb248L0gzPgotCi08VUw+Ci08bGk+TGEgZGlyZWN0aXZlIDxjb2RlPkNhY2hlTmVnb3RpYXRlZERvY3M8L2NvZGU+IHByZW5kIG1haW50ZW5hbnQgdW4gCi1wYXJhbSZlZ3JhdmU7dHJlIHF1aSBlc3Qgc29pdCA8Y29kZT5vbjwvY29kZT4gc29pdCA8Y29kZT5vZmY8L2NvZGU+LiBMZXMgY29uZmlndXJhdGlvbnMKLWV4aXN0YW50ZXMgdXRpbGlzYW50IGxhIGRpcmVjdGl2ZSA8Y29kZT5DYWNoZU5lZ290aWF0ZWREb2NzPC9jb2RlPiBkb2l2ZW50Ci1sYSByZW1wbGFjZXIgcGFyIDxjb2RlPkNhY2hlTmVnb3RpYXRlZERvY3Mgb248L2NvZGU+LjwvbGk+Ci0KLTxsaT5MYSBkaXJlY3RpdmUgPGNvZGU+RXJyb3JEb2N1bWVudDwvY29kZT4gbid1dGlsaXNlIHBsdXMgZGUgZ3VpbGxlbWV0cyAKLW91IGQnYXBvc3Ryb3BoZXMgYXUgZCZlYWN1dGU7YnV0IGR1IHBhcmFtJmVncmF2ZTt0cmUgaW5kaXF1YW50IGxlIG1lc3NhZ2UuIAotRG9yJmVhY3V0ZTtuYXZhbnQsIGxlIG1lc3NhZ2UgZGV2cmEgJmVjaXJjO3RyZSBlbnRyZSBndWlsbGVtZXRzLiBQYXIgZXhlbXBsZSwgbGEKLWRpcmVjdGl2ZSA8YmxvY2txdW90ZT48Y29kZT5FcnJvckRvY3VtZW50IDQwMyAiU29tZSBNZXNzYWdlPC9jb2RlPjwvYmxvY2txdW90ZT4gCi1kZXZyYSAmZWNpcmM7dHJlIHJlbXBsYWMmZWFjdXRlOyBwYXIgPGJsb2NrcXVvdGU+PGNvZGU+RXJyb3JEb2N1bWVudCA0MDMgIlNvbWUKLU1lc3NhZ2UiPC9jb2RlPjwvYmxvY2txdW90ZT4gU2kgbGUgc2Vjb25kIGFyZ3VtZW50IG4nZXN0IHBhcyB1bmUgVVJMIG91IHVuIGNoZW1pbgotdmFsaWRlLCBpbCBzZXJhIHRyYWl0JmVhY3V0ZTsgY29tbWUgdW4gbWVzc2FnZS48L2xpPgotCi08bGk+TGVzIGRpcmVjdGl2ZXMgPGNvZGU+QWNjZXNzQ29uZmlnPC9jb2RlPiBldCA8Y29kZT5SZXNvdXJjZUNvbmZpZzwvY29kZT4KLW4nZXhpc3RlbnQgcGx1cy4gQ2VzIGRpcmVjdGl2ZXMgcGV1dmVudCAmZWNpcmM7dHJlIHJlbXBsYWMmZWFjdXRlO2VzIGRlIG1hbmkmZWdyYXZlO3JlCi0mZWFjdXRlO3F1aXZhbGVudGUgcGFyIGxhIGRpcmVjdGl2ZQotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNpbmNsdWRlIj48Y29kZT5JbmNsdWRlPC9jb2RlPjwvYT4uCi1TaSB2b3VzIHV0aWxpc2lleiBjZXMgZGlyZWN0aXZlcyBlbiB1dGlsaXNhbnQgbGVzIHZhbGV1cnMgcGFyIGQmZWFjdXRlO2ZhdXQgc2FucwotbGVzIGQmZWFjdXRlO2ZpbmlyIGV4cGxpY2l0ZW1lbnQsIHZvdXMgZGV2ZXoKLWFqb3V0ZXIgbGVzIGxpZ25lcyA8Y29kZT5JbmNsdWRlIGNvbmYvYWNjZXNzLmNvbmY8L2NvZGU+IGV0Ci08Y29kZT5JbmNsdWRlIGNvbmYvc3JtLmNvbmY8L2NvZGU+IGRhbnMgdm90cmUgZmljaGllciBodHRwZC5jb25mLiAgCi1BZmluIGRlIGdhcmFudGlyIHF1J0FwYWNoZSBsaXQgbGVzIGRpZmYmZWFjdXRlO3JlbnRzIGZpY2hpZXJzIGRlIGNvbmZpZ3VyYXRpb24KLWRhbnMgbGUgbSZlY2lyYzttZSBvcmRyZSBxdWUgY2VsdWkgcG91ciBsZXMgYW5jaWVubmVzIGRpcmVjdGl2ZXMsIExlcyBkaXJlY3RpdmVzCi08Y29kZT5JbmNsdWRlPC9jb2RlPiBkb2l2ZW50ICZlY2lyYzt0cmUgc2l0dSZlYWN1dGU7ZXMgJmFncmF2ZTsgbGEgZmluIGR1IGZpY2hpZXIgCi1odHRwZC5jb25mLCBjZWxsZSByZXByJmVhY3V0ZTtzZW50YW50IDxjb2RlPnNybS5jb25mPC9jb2RlPiBhdmFudCBjZWxsZSBwb3VyIAotPGNvZGU+YWNjZXNzLmNvbmY8L2NvZGU+LjwvbGk+Ci0KLTxsaT5MYSBkaXJlY3RpdmUgPGNvZGU+QmluZEFkZHJlc3M8L2NvZGU+IG4nZXhpc3RlIHBsdXMuIExhIG0mZWNpcmM7bWUKLWZvbmN0aW9ubmFsaXQmZWFjdXRlOyBlc3QgZm91cm5pZSBwYXIgbGEgZGlyZWN0aXZlIAotPGNvZGU+PGEgaHJlZj0ibW9kL21wbV9jb21tb24uaHRtbCI+TGlzdGVuPC9hPjwvY29kZT4uPC9saT4KLQotPGxpPkxhIGRpcmVjdGl2ZSA8Y29kZT5FeHRlbmRlZFN0YXR1czwvY29kZT4gIG4nZXhpc3RlIHBsdXMuCi1MZSBzdWl2aSBkZXMgc3RhdHV0cyBhICZlYWN1dGU7dCZlYWN1dGU7IGVudGkmZWdyYXZlO3JlbWVudCByJmVhY3V0ZTsmZWFjdXRlO2NyaXQKLWFmaW4gZGUgYiZlYWN1dGU7biZlYWN1dGU7ZmljaWVyIGR1IG5vdXZlYXUgc3lzdCZlZ3JhdmU7bWUgTVBNLjwvbGk+Ci0KLTxsaT5MYSBkaXJlY3RpdmUgPGNvZGU+U2VydmVyVHlwZTwvY29kZT4gbidleGlzdGUgcGx1cy4gCi1MYSBtJmVhY3V0ZTt0aG9kZSB1dGlsaXMmZWFjdXRlO2UgcG91ciBzZXJ2aXIgbGVzIHJlcXUmZWNpcmM7dGVzIGVzdCAKLWQmZWFjdXRlO3Rlcm1pbiZlYWN1dGU7ZSBtYWludGVuYW50IHBhciBsYSBzJmVhY3V0ZTtsZWN0aW9uIGQndW4gTVBNLgotSWwgbidleGlzdGUgcGFzIGFjdHVlbGxlbWVudCBkZSBNUE0gY29uJmNjZWRpbDt1IHBvdXIgJmVjaXJjO3RyZSBsYW5jJmVhY3V0ZTsKLXBhciBpbmV0ZC48L2xpPgotCi08bGk+QmVhdWNvdXAgZGUgZGlyZWN0aXZlcyBxdWkgJmVhY3V0ZTt0YWllbnQgc2l0dSZlYWN1dGU7ZXMgZGFucyBsZSBub3lhdSAKLWR1IHNlcnZldXIgcG91ciBsYSB2ZXJzaW9uIDEuMyBzZSB0cm91dmVudCBtYWludGVuYW50IGRhbnMgbGVzIE1QTXMuPC9saT4KLQotPGxpPkxlcyBtb2R1bGVzIG1vZF9sb2dfYWdlbnQgZXQgbW9kX2xvZ19yZWZlcmVyIHF1aSB0cmFpdGFpZW50IGxlcyBkaXJlY3RpdmVzCi08Y29kZT5BZ2VudExvZzwvY29kZT4sIDxjb2RlPlJlZmVyZXJMb2c8L2NvZGU+IGV0Ci08Y29kZT5SZWZlcmVySWdub3JlPC9jb2RlPiBvbnQgJmVhY3V0ZTt0JmVhY3V0ZTsgc3VwcHJpbSZlYWN1dGU7cy4gCi1MZSB0cmEmY2NlZGlsO2FnZSBkZXMgYWdlbnRzIGV0IHImZWFjdXRlO2YmZWFjdXRlO3JhbnRzIGV0IHRvdWpvdXJzIGRpc3BvbmlibGUKLWVuIHV0aWxpc2FudCBsYSBkaXJlY3RpdmUgCi08YSBocmVmPSJtb2QvbW9kX2xvZ19jb25maWcuaHRtbCNjdXN0b21sb2ciPkN1c3RvbUxvZzwvYT4gZHUgbW9kdWxlCi1tb2RfbG9nX2NvbmZpZy48L2xpPgotCi08L1VMPgotCi08SDM+Q2hhbmdlbWVudHMgZGl2ZXJzPC9IMz4KLQotPFVMPgotCi08bGk+TGUgcmVkJmVhY3V0ZTttYXJyYWdlIGVuIGRvdWNldXIgZHUgc2VydmV1ciBlc3QgbWFpbnRlbmFudCB0cmFpdCZlYWN1dGU7IGVuIGVudm95YW50Ci1hdSBwcm9jZXNzdXMgcCZlZ3JhdmU7cmUgbGUgc2lnbmFsIDxjb2RlPldJTkNIPC9jb2RlPiAmYWdyYXZlOyBsYSBwbGFjZSBkdSAKLXNpZ25hbCA8Y29kZT5VU1IxPC9jb2RlPi48L2xpPgotCi08bGk+TCdvcHRpb24gPGNvZGU+LVM8L2NvZGU+IGR1IHByb2dyYW1tZSA8Y29kZT5odHRwZDwvY29kZT4KLXF1aSBzZXJ2YWl0ICZhZ3JhdmU7IGFmZmljaGVyIGxhIGNvbmZpZ3VyYXRpb24gZGVzIGgmb2NpcmM7dGVzIHZpcnR1ZWxzIGVzdCAKLXJlbXBsYWMmZWFjdXRlOyBwYXIgPGNvZGU+LXQgLUQgRFVNUF9WSE9TVFM8L2NvZGU+LjwvbGk+Ci0KLTxsaT5MJ29wdGlvbiA8Y29kZT4tWDwvY29kZT4gZHUgcHJvZ3JhbW1lIDxjb2RlPmh0dHBkPC9jb2RlPiAKLWVzdCBzdXBwcmltZS4gTGEgbWFqb3JpdCZlYWN1dGU7IGRlcyBNUE0gcGVybWV0dGVudCBsYSBtJmVjaXJjO21lIGZvbmN0aW9ubmFsaXQmZWFjdXRlOwotZW4gZCZlYWN1dGU7ZmluaXNzYW50IGxlcyB2YXJpYWJsZXMgZCdlbnZpcm9ubmVtZW50ICA8Y29kZT5PTkVfUFJPQ0VTUzwvY29kZT4gZXQKLTxjb2RlPk5PX0RFVEFDSDwvY29kZT4gYXZhbnQgZGUgbGFuY2VyIDxjb2RlPmh0dHBkPC9jb2RlPi48L2xpPgotCi08bGk+TGUgbW9kdWxlIG1vZF9hdXRoX2RpZ2VzdCwgcXVpICZlYWN1dGU7dGFpdCBleHAmZWFjdXRlO3JpbWVudGFsIGRhbnMgbGEgdmVyc2lvbiAxLjMsCi1lc3QgbWFpbnRlbmFudCB1biBtb2R1bGUgc3RhbmRhcmQuPC9saT4KLQotPGxpPkxlIG1vZHVsZSBtb2RfbW1hcF9zdGF0aWMsIHF1aSAmZWFjdXRlO3RhaXQgZXhwJmVhY3V0ZTtyaW1lbnRhbCBkYW5zIGxhIHZlcnNpb24gMS4zCi1hICZlYWN1dGU7dCZlYWN1dGU7IHJlbXBsYWMmZWFjdXRlOyBwYXIgbGUgbW9kdWxlIG1vZF9maWxlX2NhY2hlLjwvbGk+Ci0KLQotPC9VTD4KLQotPEgzPk1vZHVsZXMgdGllcnM8L0gzPgotCi08cD5EJyZlYWN1dGU7bm9ybWVzIGNoYW5nZW1lbnRzIG9udCAmZWFjdXRlO3QmZWFjdXRlOyByJmVhY3V0ZTthbGlzJmVhY3V0ZTtzCi1zdXIgbCdBUEkgZHUgc2VydmV1ciBBcGFjaGUgMi4wLiBMZXMgbW9kdWxlcyBjb24mY2NlZGlsO3VzICZhZ3JhdmU7IGwnYWlkZSBkZSAKLWwnQVBJIEFwYWNoZSAxLjMgPHN0cm9uZz5uZSBmb25jdGlvbm5lcm9udCBwYXM8L3N0cm9uZz4gc3VyIEFwYWNoZSAyLjAgc2FucyAKLW1vZGlmaWNhdGlvbnMuIFBsdXMgZGUgZCZlYWN1dGU7dGFpbHMgc29udCBmb3VybmlzIGRhbnMgbGEKLTxhIGhyZWY9ImRldmVsb3Blci8iPmRvY3VtZW50YXRpb24gZHUgZCZlYWN1dGU7dmVsb3BwZXVyPC9hPi48L3A+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC91cmxtYXBwaW5nLmh0bWwgYi9kb2NzL21hbnVhbC91cmxtYXBwaW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ3ZTQ4NzMuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvdXJsbWFwcGluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+TWFwcGluZyBVUkxzIHRvIEZpbGVzeXN0ZW0gTG9jYXRpb25zIC0gQXBhY2hlIEhUVFAgU2VydmVyPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08aDEgYWxpZ249ImNlbnRlciI+TWFwcGluZyBVUkxzIHRvIEZpbGVzeXN0ZW0gTG9jYXRpb25zPC9oMT4KLQotPHA+VGhpcyBkb2N1bWVudCBleHBsYWlucyB0aGUgbWV0aG9kIGluIHdoaWNoIEFwYWNoZSBkZXRlcm1pbmVzCi13aGF0IGZpbGVzeXN0ZW0gbG9jYXRpb24gdG8gc2VydmUgYSBmaWxlIGZyb20gYmFzZWQgb24gdGhlCi1VUkwgb2YgYSByZXF1ZXN0LjwvcD4KLQotPHVsPgotPGxpPjxhIGhyZWY9IiNkb2N1bWVudHJvb3QiPkRvY3VtZW50Um9vdDwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNvdXRzaWRlIj5GaWxlcyBPdXRzaWRlIHRoZSBEb2N1bWVudFJvb3Q8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjdXNlciI+VXNlciBEaXJlY3RvcmllczwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNyZWRpcmVjdCI+VVJMIFJlZGlyZWN0aW9uPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI3Jld3JpdGUiPlJld3JpdGUgRW5naW5lPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI25vdGZvdW5kIj5GaWxlIE5vdCBGb3VuZDwvYT48L2xpPgotPC91bD4KLQotPGhyPgotCi08dGFibGUgYm9yZGVyPSIxIj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiPgotPHN0cm9uZz5SZWxhdGVkIE1vZHVsZXM8L3N0cm9uZz48YnI+PGJyPgotCi08YSBocmVmPSJtb2QvbW9kX2FsaWFzLmh0bWwiPm1vZF9hbGlhczwvYT48YnI+Ci08YSBocmVmPSJtb2QvbW9kX3Jld3JpdGUuaHRtbCI+bW9kX3Jld3JpdGU8L2E+PGJyPgotPGEgaHJlZj0ibW9kL21vZF91c2VyZGlyLmh0bWwiPm1vZF91c2VyZGlyPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9tb2Rfc3BlbGluZy5odG1sIj5tb2Rfc3BlbGluZzwvYT48YnI+Ci08YSBocmVmPSJtb2QvbW9kX3Zob3N0X2FsaWFzLmh0bWwiPm1vZF92aG9zdF9hbGlhczwvYT48YnI+Ci0KLTwvdGQ+PHRkIHZhbGlnbj0idG9wIj4KLTxzdHJvbmc+UmVsYXRlZCBEaXJlY3RpdmVzPC9zdHJvbmc+PGJyPjxicj4KLQotPEEgSFJFRj0ibW9kL21vZF9hbGlhcy5odG1sI2FsaWFzIj5BbGlhczwvQT48YnI+Ci08QSBIUkVGPSJtb2QvbW9kX2FsaWFzLmh0bWwjYWxpYXNtYXRjaCI+QWxpYXNNYXRjaDwvQT48YnI+Ci08QSBIUkVGPSJtb2QvbW9kX3NwZWxpbmcuaHRtbCNjaGVja3NwZWxsaW5nIj5DaGVja1NwZWxsaW5nPC9BPjxicj4KLTxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjZG9jdW1lbnRyb290Ij5Eb2N1bWVudFJvb3Q8L0E+PGJyPgotPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNlcnJvcmRvY3VtZW50Ij5FcnJvckRvY3VtZW50PC9BPjxicj4KLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjb3B0aW9ucyI+T3B0aW9uczwvYT48YnI+Ci08QSBIUkVGPSJtb2QvbW9kX2FsaWFzLmh0bWwjcmVkaXJlY3QiPlJlZGlyZWN0PC9BPjxicj4KLTxBIEhSRUY9Im1vZC9tb2RfYWxpYXMuaHRtbCNyZWRpcmVjdG1hdGNoIj5SZWRpcmVjdE1hdGNoPC9BPjxicj4KLTxBIEhSRUY9Im1vZC9tb2RfcmV3cml0ZS5odG1sI1Jld3JpdGVDb25kIj5SZXdyaXRlQ29uZDwvQT48YnI+Ci08QSBIUkVGPSJtb2QvbW9kX3Jld3JpdGUuaHRtbCNSZXdyaXRlUnVsZSI+UmV3cml0ZVJ1bGU8L0E+PGJyPgotPEEgSFJFRj0ibW9kL21vZF9hbGlhcy5odG1sI3NjcmlwdGFsaWFzIj5TY3JpcHRBbGlhczwvQT48YnI+Ci08QSBIUkVGPSJtb2QvbW9kX2FsaWFzLmh0bWwjc2NyaXB0YWxpYXNtYXRjaCI+U2NyaXB0QWxpYXNNYXRjaDwvQT48YnI+Ci08QSBIUkVGPSJtb2QvbW9kX3VzZXJkaXIuaHRtbCN1c2VyZGlyIj5Vc2VyRGlyPC9BPjxicj4KLQotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxoMj48YSBuYW1lPSJkb2N1bWVudHJvb3QiPkRvY3VtZW50Um9vdDwvYT48L2gyPgotCi08cD5JbiBkZWNpZGluZyB3aGF0IGZpbGUgdG8gc2VydmUgZm9yIGEgZ2l2ZW4gcmVxdWVzdCwgQXBhY2hlJ3MKLWRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gdGFrZSB0aGUgVVJMLVBhdGggZm9yIHRoZSByZXF1ZXN0ICh0aGUgcGFydCBvZgotdGhlIFVSTCBmb2xsb3dpbmcgdGhlIGZpcnN0IHNpbmdsZSBzbGFzaCkgYW5kIGFkZCBpdCB0byB0aGUgZW5kIG9mIHRoZQotPGEgaHJlZj0ibW9kL2NvcmUuaHRtbCNkb2N1bWVudHJvb3QiPkRvY3VtZW50Um9vdDwvYT4gc3BlY2lmaWVkIGluCi15b3VyIGNvbmZpZ3VyYXRpb24gZmlsZXMuICBUaGVyZWZvcmUsIHRoZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMKLXVuZGVybmVhdGggdGhlIDxjb2RlPkRvY3VtZW50Um9vdDwvY29kZT4gbWFrZSB1cCB0aGUgYmFzaWMgZG9jdW1lbnQKLXRyZWUgd2hpY2ggd2lsbCBiZSB2aXNpYmxlIGZyb20gdGhlIHdlYi48L3A+Ci0KLTxwPkFwYWNoZSBpcyBhbHNvIGNhcGFibGUgb2YgPGEgaHJlZj0idmhvc3RzLyI+VmlydHVhbCBIb3N0aW5nPC9hPiwKLXdoZXJlIHRoZSBzZXJ2ZXIgcmVjZWl2ZXMgcmVxdWVzdHMgZm9yIG1vcmUgdGhhbiBvbmUgaG9zdC4gIEluIHRoaXMKLWNhc2UsIGEgZGlmZmVyZW50IDxjb2RlPkRvY3VtZW50Um9vdDwvY29kZT4gY2FuIGJlIHNwZWNpZmllZCBmb3IgZWFjaAotdmlydHVhbCBob3N0LCBvciBhbHRlcm5hdGl2ZWx5LCB0aGUgZGlyZWN0aXZlcyBwcm92aWRlZCBieSB0aGUgbW9kdWxlCi08YSBocmVmPSJtb2QvbW9kX3Zob3N0X2FsaWFzLmh0bWwiPm1vZF92aG9zdF9hbGlhczwvYT4gY2FuIGJlIHVzZWQgdG8KLWR5bmFtaWNhbGx5IGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgcGxhY2UgZnJvbSB3aGljaCB0byBzZXJ2ZQotY29udGVudCBiYXNlZCBvbiB0aGUgcmVxdWVzdGVkIElQIGFkZHJlc3Mgb3IgaG9zdG5hbWUuPC9wPgotCi08aDI+PGEgbmFtZT0ib3V0c2lkZSI+RmlsZXMgT3V0c2lkZSB0aGUgRG9jdW1lbnRSb290PC9hPjwvaDI+Ci0KLTxwPlRoZXJlIGFyZSBmcmVxdWVudGx5IGNpcmN1bXN0YW5jZXMgd2hlcmUgaXQgaXMgbmVjZXNzYXJ5IHRvIGFsbG93Ci13ZWIgYWNjZXNzIHRvIHBhcnRzIG9mIHRoZSBmaWxlc3lzdGVtIHdoaWNoIGFyZSBub3Qgc3RyaWN0bHkKLXVuZGVybmVhdGggdGhlIDxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjZG9jdW1lbnRyb290Ij5Eb2N1bWVudFJvb3Q8L2E+LgotQXBhY2hlIG9mZmVycyBzZXZlcmFsIGRpZmZlcmVudCB3YXlzIHRvIGFjY29tcGxpc2ggdGhpcy4gIE9uIFVuaXgKLXN5c3RlbXMsIHN5bWJvbGljIGxpbmtzIGNhbiBiZSB1c2VkIHRvIGJyaW5nIG90aGVyIHBhcnRzIG9mIHRoZQotZmlsZXN5c3RlbSB1bmRlciB0aGUgPGNvZGU+RG9jdW1lbnRSb290PC9jb2RlPi4gIEZvciBzZWN1cml0eSByZWFzb25zLAotc3ltYm9saWMgbGlua3Mgd2lsbCBvbmx5IGJlIGZvbGxvd2VkIGlmIHRoZSA8YQotaHJlZj0ibW9kL2NvcmUuaHRtbCNvcHRpb25zIj5PcHRpb25zPC9hPiBzZXR0aW5nIGZvciB0aGUgcmVsZXZhbnQKLWRpcmVjdG9yeSBpbmNsdWRlcyA8Y29kZT5Gb2xsb3dTeW1MaW5rczwvY29kZT4gb3IKLTxjb2RlPlN5bUxpbmtzSWZPd25lck1hdGNoPC9jb2RlPi48L3A+Ci0KLTxwPkFsdGVybmF0aXZlbHksIHRoZSA8YSBocmVmPSJtb2QvbW9kX2FsaWFzLmh0bWwjYWxpYXMiPkFsaWFzPC9hPgotZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIG1hcCBhbnkgcGFydCBvZiB0aGUgZmlsZXN5c3RlbSBpbnRvIHRoZSB3ZWIKLXNwYWNlLiAgRm9yIGV4YW1wbGUsIHdpdGg8L3A+Ci0KLTxibG9ja3F1b3RlPjxjb2RlPkFsaWFzIC9kb2NzIC92YXIvd2ViLwotPC9ibG9ja3F1b3RlPjwvY29kZT4gCi0KLTxwPnRoZSBVUkwgPGNvZGU+aHR0cDovL3d3dy5leGFtcGxlLmNvbS9kb2NzL2Rpci9maWxlLmh0bWw8L2NvZGU+IHdpbGwKLWJlIHNlcnZlZCBmcm9tIDxjb2RlPi92YXIvd2ViL2Rpci9maWxlLmh0bWw8L2NvZGU+LiAgVGhlIDxhCi1ocmVmPSJtb2QvbW9kX2FsaWFzLmh0bWwjc2NyaXB0YWxpYXMiPlNjcmlwdEFsaWFzPC9hPiBkaXJlY3RpdmUgd29ya3MKLXRoZSBzYW1lIHdheSwgd2l0aCB0aGUgYWRkaXRpb25hbCBlZmZlY3QgdGhhdCBhbGwgY29udGVudCBsb2NhdGVkIGF0Ci10aGUgdGFyZ2V0IHBhdGggaXMgdHJlYXRlZCBhcyBDR0kgc2NyaXB0cy48L3A+Ci0KLTxwPkZvciBzaXR1YXRpb25zIHdoZXJlIGFkZGl0aW9uYWwgZmxleGliaWxpdHkgaXMgcmVxdWlyZWQsIHRoZSA8YQotaHJlZj0ibW9kL21vZF9hbGlhcy5odG1sI2FsaWFzbWF0Y2giPkFsaWFzTWF0Y2g8L2E+IGFuZCA8YQotaHJlZj0ibW9kL21vZF9hbGlhcy5odG1sI3NjcmlwdGFsaWFzbWF0Y2giPlNjcmlwdEFsaWFzTWF0Y2g8L2E+Ci1kaXJlY3RpdmVzIGNhbiBkbyBwb3dlcmZ1bCA8YQotaHJlZj0ibWlzYy9GQVEuaHRtbCNyZWdleCI+cmVndWxhci1leHByZXNzaW9uPC9hPiBiYXNlZCBtYXRjaGluZyBhbmQKLXN1YnN0aXR1dGlvbi4gIEZvciBleGFtcGxlLDwvcD4KLQotPGJsb2NrcXVvdGU+PGNvZGU+IFNjcmlwdEFsaWFzTWF0Y2ggXi9+KFteL10qKS9jZ2ktYmluLyguKikKLS9ob21lLyQxL2NnaS1iaW4vJDIgPC9jb2RlPjwvYmxvY2txdW90ZT4KLQotPHA+d2lsbCBtYXAgYSByZXF1ZXN0IHRvCi08Y29kZT5odHRwOi8vZXhhbXBsZS5jb20vfnVzZXIvY2dpLWJpbi9zY3JpcHQuY2dpPC9jb2RlPiB0byB0aGUgcGF0aAotPGNvZGU+L2hvbWUvdXNlci9jZ2ktYmluL3NjcmlwdC5jZ2k8L2NvZGU+IGFuZCB3aWxsIHRyZWF0IHRoZQotcmVzdWx0aW5nIGZpbGUgYXMgYSBDR0kgc2NyaXB0LjwvcD4KLQotPGgyPjxhIG5hbWU9InVzZXIiPlVzZXIgRGlyZWN0b3JpZXM8L2E+PC9oMj4KLQotPHA+VHJhZGl0aW9uYWxseSBvbiBVbml4IHN5c3RlbXMsIHRoZSBob21lIGRpcmVjdG9yeSBvZiBhIHBhcnRpY3VsYXIKLTxlbT51c2VyPC9lbT4gY2FuIGJlIHJlZmVycmVkIHRvIGFzIDxjb2RlPn51c2VyLzwvY29kZT4uICBUaGUgbW9kdWxlCi08YSBocmVmPSJtb2QvbW9kX3VzZXJkaXIuaHRtbCI+bW9kX3VzZXJkaXI8L2E+IGV4dGVuZHMgdGhpcyBpZGVhIHRvCi10aGUgd2ViIGJ5IGFsbG93aW5nIGZpbGVzIHVuZGVyIGVhY2ggdXNlcidzIGhvbWUgZGlyZWN0b3J5IHRvIGJlCi1hY2Nlc3NlZCB1c2luZyBVUkxzIHN1Y2ggYXMgdGhlIGZvbGxvd2luZy48L3A+Ci0KLTxibG9ja3F1b3RlPjxjb2RlPmh0dHA6Ly93d3cuZXhhbXBsZS5jb20vfnVzZXIvZmlsZS5odG1sPC9jb2RlPjwvYmxvY2txdW90ZT4KLQotPHA+Rm9yIHNlY3VyaXR5IHJlYXNvbnMsIGl0IHdvdWxkIGJlIGluYXBwcm9wcmlhdGUgdG8gZ2l2ZSBkaXJlY3QKLWFjY2VzcyB0byBhIHVzZXIncyBob21lIGRpcmVjdG9yeSBmcm9tIHRoZSB3ZWIuICBUaGVyZWZvcmUsIHRoZSA8YQotaHJlZj0ibW9kL21vZF91c2VyZGlyLmh0bWwjdXNlcmRpciI+VXNlckRpcjwvYT4gZGlyZWN0aXZlIGlzIHVzZWQgdG8KLXNwZWNpZnkgYSBkaXJlY3RvcnkgdW5kZXJuZWF0aCB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5IHdoZXJlIHdlYgotZmlsZXMgd2lsbCBiZSBsb2NhdGVkLiAgVXNpbmcgdGhlIGRlZmF1bHQgc2V0dGluZyBvZiA8Y29kZT5Vc2VyZGlyCi1wdWJsaWNfaHRtbDwvY29kZT4sIHRoZSBhYm92ZSBVUkwgd291bGQgbG9vayBmb3IgYSBmaWxlIGF0IGEgZGlyZWN0b3J5Ci1saWtlIDxjb2RlPi9ob21lL3VzZXIvcHVibGljX2h0bWwvZmlsZS5odG1sPC9jb2RlPiB3aGVyZSB0aGUKLTwvY29kZT4vaG9tZS91c2VyLzwvY29kZT4gaXMgdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSBhcyBzcGVjaWZpZWQgaW4KLTxjb2RlPi9ldGMvcGFzc3dkPC9jb2RlPi48L3A+Ci0KLTxwPlRoZXJlIGFyZSBhbHNvIHNldmVyYWwgb3RoZXIgZm9ybXMgb2YgdGhlIDxjb2RlPlVzZXJkaXI8L2NvZGU+Ci1kaXJlY3RpdmUgd2hpY2ggY2FuIGJlIHVzZWQgb24gc3lzdGVtcyB3aGVyZSA8Y29kZT4vZXRjL3Bhc3N3ZDwvY29kZT4KLWNhbm5vdCBiZSB1c2VkIHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBob21lIGRpcmVjdG9yeS48L3A+Ci0KLTxwPlNvbWUgcGVvcGxlIGZpbmQgdGhlICJ+IiBzeW1ib2wgKHdoaWNoIGlzIG9mdGVuIGVuY29kZWQgb24gdGhlIHdlYgotYXMgPGNvZGU+JTdlPC9jb2RlPikgdG8gYmUgYXdrd2FyZCBhbmQgcHJlZmVyIHRvIHVzZSBhbiBhbHRlcm5hdGUKLXN0cmluZyB0byByZXByZXNlbnQgdXNlciBkaXJlY3Rvcmllcy4gIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3QKLXN1cHBvcnRlZCBieSBtb2RfdXNlcmRpci4gIEhvd2V2ZXIsIGlmIHVzZXJzJyBob21lIGRpcmVjdG9yaWVzIGFyZQotc3RydWN0dXJlZCBpbiBhIHJlZ3VsYXIgd2F5LCB0aGVuIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSB0aGUgPGEKLWhyZWY9Im1vZC9tb2RfYWxpYXMuaHRtbCNhbGlhc21hdGNoIj5BbGlhc01hdGNoPC9hPiBkaXJlY3RpdmUgdG8KLWFjaGlldmUgdGhlIGRlc2lyZWQgZWZmZWN0LiAgRm9yIGV4YW1wbGUsIHRvIG1ha2UKLTxjb2RlPmh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdXBhZ2VzL3VzZXIvZmlsZS5odG1sPC9jb2RlPiBtYXAgdG8KLTxjb2RlPi9ob21lL3VzZXIvcHVibGljX2h0bWwvZmlsZS5odG1sPC9jb2RlPiwgdGhlIGZvbGxvd2luZwotPGNvZGU+QWxpYXNNYXRjaDwvY29kZT4gZGlyZWN0aXZlIGNhbiBiZSB1c2VkLjwvcD4KLQotPGJsb2NrcXVvdGU+PGNvZGU+Ci1BbGlhc01hdGNoICBeL3VwYWdlcy8oW14vXSopLz8oLiopIC9ob21lLyQxL3B1YmxpY19odG1sLyQyIAotPC9jb2RlPjwvYmxvY2txdW90ZT4KLQotPGgyPjxhIG5hbWU9InJlZGlyZWN0Ij5VUkwgUmVkaXJlY3Rpb248L2E+PC9oMj4KLQotPHA+VGhlIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcyBkaXNjdXNzZWQgaW4gdGhlIGFib3ZlIHNlY3Rpb25zIGFyZQotdXNlZCB0byB0ZWxsIEFwYWNoZSB0byBnZXQgY29udGVudCBmcm9tIGEgc3BlY2lmaWMgcGxhY2UgaW4gdGhlCi1maWxlc3lzdGVtIGFuZCByZXR1cm4gaXQgdG8gdGhlIGNsaWVudC4gIFNvbWV0aW1lcywgaXQgaXMgZGVzaXJhYmxlCi1pbnN0ZWFkIHRvIGluZm9ybSB0aGUgY2xpZW50IHRoYXQgdGhlIGNvbnRlbnQgYmVpbmcgcmVxdWVzdGVkIGlzCi1sb2NhdGVkIGF0IGFuIGRpZmZlcmVudCBVUkwsIGFuZCBpbnN0cnVjdCB0aGUgY2xpZW50IHRvIG1ha2UgYSBuZXcKLXJlcXVlc3Qgd2l0aCB0aGUgbmV3IFVSTC4gIFRoaXMgaXMgcmVmZXJyZWQgdG8gYXMgPGVtPnJlZGlyZWN0aW9uPC9lbT4KLWFuZCBpcyBpbXBsZW1lbnRlZCBieSB0aGUgPGEKLWhyZWY9Im1vZC9tb2RfYWxpYXMuaHRtbCNyZWRpcmVjdCI+UmVkaXJlY3Q8L2E+IGRpcmVjdGl2ZS4gIEZvciBleGFtcGxlLAotaWYgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgPGNvZGU+L2Zvby88L2NvZGU+IHVuZGVyIHRoZQotPGNvZGU+RG9jdW1lbnRSb290PC9jb2RlPiBoYXZlIGJlZW4gbW92ZWQgdG8gdGhlIG5ldyBkaXJlY3RvcnkKLTxjb2RlPi9iYXIvPC9jb2RlPiwgY2xpZW50cyBjYW4gaW5zdHJ1Y3RlZCB0byByZXF1ZXN0IHRoZSBjb250ZW50IGF0Ci10aGUgbmV3IGxvY2F0aW9uIGFzIGZvbGxvd3MuPC9wPgotCi08YmxvY2txdW90ZT48Y29kZT5SZWRpcmVjdCBwZXJtYW5lbnQKLS9mb28vIGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vYmFyLzwvY29kZT48L2Jsb2NrcXVvdGU+Ci0KLTxwPlRoaXMgd2lsbCByZWRpcmVjdCBhbnkgVVJMLVBhdGggc3RhcnRpbmcgaW4gPGNvZGU+L2Zvby88L2NvZGU+IHRvCi10aGUgc2FtZSBVUkwgcGF0aCBvbiB0aGUgPGNvZGU+d3d3LmV4YW1wbGUuY29tPC9jb2RlPiBzZXJ2ZXIgd2l0aAotPGNvZGU+L2Jhci88L2NvZGU+IHN1YnN0aXR1dGVkIGZvciA8Y29kZT4vZm9vLzwvY29kZT4uICBOb3RlIHRoYXQKLWNsaWVudHMgY2FuIGJlIHJlZGlyZWN0ZWQgdG8gYW55IHNlcnZlciwgbm90IG9ubHkgdGhlIG9yaWdpbgotc2VydmVyLjwvcD4KLQotPHA+QXBhY2hlIGFsc28gcHJvdmlkZXMgYSA8YQotaHJlZj0ibW9kL21vZF9hbGlhcy5odG1sI3JlZGlyZWN0bWF0Y2giPlJlZGlyZWN0TWF0Y2g8L2E+IGRpcmVjdGl2ZQotd2hpY2ggY2FuIGJlIHVzZWQgZm9yIG1vcmUgY29tcGxpY2F0ZWQgcmV3cml0aW5nIHByb2JsZW1zLiAgRm9yCi1leGFtcGxlLCB0byByZWRpcmVjdCByZXF1ZXN0cyBmb3IgdGhlIHNpdGUgaG9tZSBwYWdlIHRvIGEgZGlmZmVyZW50Ci1zaXRlLCBidXQgbGVhdmUgYWxsIG90aGVyIHJlcXVlc3RzIGFsb25lLCB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24KLWNhbiBiZSB1c2VkLjwvcD4KLQotPGJsb2NrcXVvdGU+PGNvZGU+Ci1SZWRpcmVjdE1hdGNoIHBlcm1hbmVudCBeLyQgaHR0cDovL3d3dy5leGFtcGxlLmNvbS9zdGFydHBhZ2UuaHRtbAotPC9jb2RlPjwvYmxvY2txdW90ZT4KLQotPHA+QWx0ZXJuYXRpdmVseSwgdG8gdGVtcG9yYXJpbHkgcmVkaXJlY3QgYWxsIHBhZ2VzIG9uIGEgc2l0ZSB0byBvbmUKLXBhcnRpY3VsYXIgcGFnZSwgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIGlzIHVzZWZ1bC48L3A+Ci0KLTxibG9ja3F1b3RlPjxjb2RlPgotUmVkaXJlY3RNYXRjaCB0ZW1wIC4qIGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vc3RhcnRwYWdlLmh0bWwKLTwvY29kZT48L2Jsb2NrcXVvdGU+Ci0KLTxoMj48YSBuYW1lPSJyZXdyaXRlIj5SZXdyaXRpbmcgRW5naW5lPC9hPjwvaDI+Ci0KLTxwPldoZW4gZXZlbiBtb3JlIHBvd2VyZnVsIHN1YnN0aXR1dGlvbiBpcyByZXF1aXJlZCwgdGhlIHJld3JpdGluZwotZW5naW5lIHByb3ZpZGVkIGJ5IDxhIGhyZWY9Im1vZC9tb2RfcmV3cml0ZS5odG1sIj5tb2RfcmV3cml0ZTwvYT4gY2FuCi1iZSB1c2VmdWwuICBUaGUgZGlyZWN0aXZlcyBwcm92aWRlZCBieSB0aGlzIG1vZHVsZSBjYW4gdXNlCi1jaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHJlcXVlc3Qgc3VjaCBhcyBicm93c2VyIHR5cGUgb3Igc291cmNlIElQCi1hZGRyZXNzIGluIGRlY2lkaW5nIGZyb20gd2hlcmUgdG8gc2VydmUgY29udGVudC4gIEluIGFkZGl0aW9uLAotbW9kX3Jld3JpdGUgY2FuIHVzZSBleHRlcm5hbCBkYXRhYmFzZSBmaWxlcyBvciBwcm9ncmFtcyB0byBkZXRlcm1pbmUKLWhvdyB0byBoYW5kbGUgYSByZXF1ZXN0LiAgTWFueSBwcmFjdGljYWwgZXhhbXBsZXMgZW1wbG95aW5nCi1tb2RfcmV3cml0ZSBhcmUgZGlzY3Vzc2VkIGluIHRoZSA8YSBocmVmPSJtaXNjL3Jld3JpdGVndWlkZS5odG1sIj5VUkwKLVJld3JpdGluZyBHdWlkZTwvYT4uPC9wPgotCi08aDI+PGEgbmFtZT0ibm90Zm91bmQiPkZpbGUgTm90IEZvdW5kPC9hPjwvaDI+Ci0KLTxwPkluZXZpdGFibHksIFVSTHMgd2lsbCBiZSByZXF1ZXN0ZWQgZm9yIHdoaWNoIG5vIG1hdGNoaW5nIGZpbGUgY2FuCi1iZSBmb3VuZCBpbiB0aGUgZmlsZXN5c3RlbS4gIFRoaXMgY2FuIGhhcHBlbiBmb3Igc2V2ZXJhbCByZWFzb25zLiAgSW4KLXNvbWUgY2FzZXMsIGl0IGNhbiBiZSBhIHJlc3VsdCBvZiBtb3ZpbmcgZG9jdW1lbnRzIGZyb20gb25lIGxvY2F0aW9uCi10byBhbm90aGVyLiAgSW4gdGhpcyBjYXNlLCBpdCBpcyBiZXN0IHRvIHVzZSA8YSBocmVmPSIjcmVkaXJlY3QiPlVSTAotcmVkaXJlY3Rpb248L2E+IHRvIGluZm9ybSBjbGllbnRzIG9mIHRoZSBuZXcgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlLgotSW4gdGhpcyB3YXksIHlvdSBjYW4gYXNzdXJlIHRoYXQgb2xkIGJvb2ttYXJrcyBhbmQgbGlua3Mgd2lsbCBjb250aW51ZQotdG8gd29yaywgZXZlbiB0aG91Z2ggdGhlIHJlc291cmNlIGlzIGF0IGEgbmV3IGxvY2F0aW9uLjwvcD4KLQotPHA+QW5vdGhlciBjb21tb24gY2F1c2Ugb2YgIkZpbGUgTm90IEZvdW5kIiBlcnJvcnMgaXMgYWNjaWRlbnRhbAotbWlzdHlwaW5nIG9mIFVSTHMsIGVpdGhlciBkaXJlY3RseSBpbiB0aGUgYnJvd3Nlciwgb3IgaW4gSFRNTCBsaW5rcy4KLUFwYWNoZSBwcm92aWRlcyB0aGUgbW9kdWxlIDxhIGhyZWY9Im1vZC9tb2Rfc3BlbGluZyI+bW9kX3NwZWxpbmc8L2E+Ci0oc2ljKSB0byBoZWxwIHdpdGggdGhpcyBwcm9ibGVtLiAgV2hlbiB0aGlzIG1vZHVsZSBpcyBhY3RpdmF0ZWQsIGl0Ci13aWxsIGludGVyY2VwdCAiRmlsZSBOb3QgRm91bmQiIGVycm9ycyBhbmQgbG9vayBmb3IgYSByZXNvdXJjZSB3aXRoIGEKLXNpbWlsYXIgZmlsZW5hbWUuICBJZiBvbmUgc3VjaCBmaWxlIGlzIGZvdW5kLCBtb2Rfc3BlbGluZyB3aWxsIHNlbmQgYW4KLUhUVFAgcmVkaXJlY3QgdG8gdGhlIGNsaWVudCBpbmZvcm1pbmcgaXQgb2YgdGhlIGNvcnJlY3QgbG9jYXRpb24uICBJZgotc2V2ZXJhbCAiY2xvc2UiIGZpbGVzIGFyZSBmb3VuZCwgYSBsaXN0IG9mIGF2YWlsYWJsZSBhbHRlcm5hdGl2ZXMgd2lsbAotYmUgcHJlc2VudGVkIHRvIHRoZSBjbGllbnQuPC9wPgotCi08cD5BbiBlc3BlY2lhbGx5IHVzZWZ1bCBmZWF0dXJlIG9mIG1vZF9zcGVsaW5nLCBpcyB0aGF0IGl0IHdpbGwKLWNvbXBhcmUgZmlsZW5hbWVzIHdpdGhvdXQgcmVzcGVjdCB0byBjYXNlLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGZvcgotc3lzdGVtcyB3aGVyZSB1c2VycyBhcmUgdW5hd2FyZSBvZiB0aGUgY2FzZS1zZW5zaXRpdmUgbmF0dXJlIG9mIFVSTHMKLWFuZCB0aGUgdW5peCBmaWxlc3lzdGVtLiAgSG93ZXZlciwgdXNpbmcgbW9kX3NwZWxpbmcgZm9yIGFueXRoaW5nIG1vcmUKLXRoYW4gdGhlIG9jY2FzaW9uYWwgVVJMIGNvcnJlY3Rpb24gY2FuIGxlYWQgdG8gYWRkaXRpb25hbCBsb2FkIG9uIHRoZQotc2VydmVyLCBzaW5jZSBlYWNoICJpbmNvcnJlY3QiIHJlcXVlc3QgaXMgZm9sbG93ZWQgYnkgYSBVUkwKLXJlZGlyZWN0aW9uIGFuZCBhIG5ldyByZXF1ZXN0IGZyb20gdGhlIGNsaWVudC48L3A+Ci0KLTxwPklmIGFsbCBhdHRlbXB0cyB0byBsb2NhdGUgdGhlIGNvbnRlbnQgZmFpbCwgQXBhY2hlIHJldHVybnMgYW4gZXJyb3IKLXBhZ2Ugd2l0aCBIVFRQIHN0YXR1cyBjb2RlIDQwNCAoZmlsZSBub3QgZm91bmQpLiAgVGhlIGFwcGVhcmFuY2Ugb2YKLXRoaXMgcGFnZSBpcyBjb250cm9sbGVkIHdpdGggdGhlIDxhCi1ocmVmPSJtb2QvY29yZS5odG1sI2Vycm9yZG9jdW1lbnQiPkVycm9yRG9jdW1lbnQ8L2E+IGRpcmVjdGl2ZSBhbmQgY2FuCi1iZSBjdXN0b21pemVkIGluIGEgZmxleGlibGUgbWFubmVyIGFzIGRpc2N1c3NlZCBpbiB0aGUgPGEKLWhyZWY9ImN1c3RvbS1lcnJvci5odG1sIj5DdXN0b20gZXJyb3IgcmVzcG9uc2VzPC9hPiBhbmQgPGEKLWhyZWY9Im1pc2MvY3VzdG9tX2Vycm9yZG9jcy5odG1sIj5JbnRlcm5hdGlvbmFsIFNlcnZlciBFcnJvcgotUmVzcG9uc2VzPC9hPiBkb2N1bWVudHMuPC9wPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvdXJsbWFwcGluZy5odG1sLmVuIGIvZG9jcy9tYW51YWwvdXJsbWFwcGluZy5odG1sLmVuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0N2U0ODczLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL3VybG1hcHBpbmcuaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPk1hcHBpbmcgVVJMcyB0byBGaWxlc3lzdGVtIExvY2F0aW9ucyAtIEFwYWNoZSBIVFRQIFNlcnZlcjwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPGgxIGFsaWduPSJjZW50ZXIiPk1hcHBpbmcgVVJMcyB0byBGaWxlc3lzdGVtIExvY2F0aW9uczwvaDE+Ci0KLTxwPlRoaXMgZG9jdW1lbnQgZXhwbGFpbnMgdGhlIG1ldGhvZCBpbiB3aGljaCBBcGFjaGUgZGV0ZXJtaW5lcwotd2hhdCBmaWxlc3lzdGVtIGxvY2F0aW9uIHRvIHNlcnZlIGEgZmlsZSBmcm9tIGJhc2VkIG9uIHRoZQotVVJMIG9mIGEgcmVxdWVzdC48L3A+Ci0KLTx1bD4KLTxsaT48YSBocmVmPSIjZG9jdW1lbnRyb290Ij5Eb2N1bWVudFJvb3Q8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjb3V0c2lkZSI+RmlsZXMgT3V0c2lkZSB0aGUgRG9jdW1lbnRSb290PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI3VzZXIiPlVzZXIgRGlyZWN0b3JpZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjcmVkaXJlY3QiPlVSTCBSZWRpcmVjdGlvbjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNyZXdyaXRlIj5SZXdyaXRlIEVuZ2luZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNub3Rmb3VuZCI+RmlsZSBOb3QgRm91bmQ8L2E+PC9saT4KLTwvdWw+Ci0KLTxocj4KLQotPHRhYmxlIGJvcmRlcj0iMSI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIj4KLTxzdHJvbmc+UmVsYXRlZCBNb2R1bGVzPC9zdHJvbmc+PGJyPjxicj4KLQotPGEgaHJlZj0ibW9kL21vZF9hbGlhcy5odG1sIj5tb2RfYWxpYXM8L2E+PGJyPgotPGEgaHJlZj0ibW9kL21vZF9yZXdyaXRlLmh0bWwiPm1vZF9yZXdyaXRlPC9hPjxicj4KLTxhIGhyZWY9Im1vZC9tb2RfdXNlcmRpci5odG1sIj5tb2RfdXNlcmRpcjwvYT48YnI+Ci08YSBocmVmPSJtb2QvbW9kX3NwZWxpbmcuaHRtbCI+bW9kX3NwZWxpbmc8L2E+PGJyPgotPGEgaHJlZj0ibW9kL21vZF92aG9zdF9hbGlhcy5odG1sIj5tb2Rfdmhvc3RfYWxpYXM8L2E+PGJyPgotCi08L3RkPjx0ZCB2YWxpZ249InRvcCI+Ci08c3Ryb25nPlJlbGF0ZWQgRGlyZWN0aXZlczwvc3Ryb25nPjxicj48YnI+Ci0KLTxBIEhSRUY9Im1vZC9tb2RfYWxpYXMuaHRtbCNhbGlhcyI+QWxpYXM8L0E+PGJyPgotPEEgSFJFRj0ibW9kL21vZF9hbGlhcy5odG1sI2FsaWFzbWF0Y2giPkFsaWFzTWF0Y2g8L0E+PGJyPgotPEEgSFJFRj0ibW9kL21vZF9zcGVsaW5nLmh0bWwjY2hlY2tzcGVsbGluZyI+Q2hlY2tTcGVsbGluZzwvQT48YnI+Ci08QSBIUkVGPSJtb2QvY29yZS5odG1sI2RvY3VtZW50cm9vdCI+RG9jdW1lbnRSb290PC9BPjxicj4KLTxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjZXJyb3Jkb2N1bWVudCI+RXJyb3JEb2N1bWVudDwvQT48YnI+Ci08YSBocmVmPSJtb2QvY29yZS5odG1sI29wdGlvbnMiPk9wdGlvbnM8L2E+PGJyPgotPEEgSFJFRj0ibW9kL21vZF9hbGlhcy5odG1sI3JlZGlyZWN0Ij5SZWRpcmVjdDwvQT48YnI+Ci08QSBIUkVGPSJtb2QvbW9kX2FsaWFzLmh0bWwjcmVkaXJlY3RtYXRjaCI+UmVkaXJlY3RNYXRjaDwvQT48YnI+Ci08QSBIUkVGPSJtb2QvbW9kX3Jld3JpdGUuaHRtbCNSZXdyaXRlQ29uZCI+UmV3cml0ZUNvbmQ8L0E+PGJyPgotPEEgSFJFRj0ibW9kL21vZF9yZXdyaXRlLmh0bWwjUmV3cml0ZVJ1bGUiPlJld3JpdGVSdWxlPC9BPjxicj4KLTxBIEhSRUY9Im1vZC9tb2RfYWxpYXMuaHRtbCNzY3JpcHRhbGlhcyI+U2NyaXB0QWxpYXM8L0E+PGJyPgotPEEgSFJFRj0ibW9kL21vZF9hbGlhcy5odG1sI3NjcmlwdGFsaWFzbWF0Y2giPlNjcmlwdEFsaWFzTWF0Y2g8L0E+PGJyPgotPEEgSFJFRj0ibW9kL21vZF91c2VyZGlyLmh0bWwjdXNlcmRpciI+VXNlckRpcjwvQT48YnI+Ci0KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08aDI+PGEgbmFtZT0iZG9jdW1lbnRyb290Ij5Eb2N1bWVudFJvb3Q8L2E+PC9oMj4KLQotPHA+SW4gZGVjaWRpbmcgd2hhdCBmaWxlIHRvIHNlcnZlIGZvciBhIGdpdmVuIHJlcXVlc3QsIEFwYWNoZSdzCi1kZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHRha2UgdGhlIFVSTC1QYXRoIGZvciB0aGUgcmVxdWVzdCAodGhlIHBhcnQgb2YKLXRoZSBVUkwgZm9sbG93aW5nIHRoZSBmaXJzdCBzaW5nbGUgc2xhc2gpIGFuZCBhZGQgaXQgdG8gdGhlIGVuZCBvZiB0aGUKLTxhIGhyZWY9Im1vZC9jb3JlLmh0bWwjZG9jdW1lbnRyb290Ij5Eb2N1bWVudFJvb3Q8L2E+IHNwZWNpZmllZCBpbgoteW91ciBjb25maWd1cmF0aW9uIGZpbGVzLiAgVGhlcmVmb3JlLCB0aGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCi11bmRlcm5lYXRoIHRoZSA8Y29kZT5Eb2N1bWVudFJvb3Q8L2NvZGU+IG1ha2UgdXAgdGhlIGJhc2ljIGRvY3VtZW50Ci10cmVlIHdoaWNoIHdpbGwgYmUgdmlzaWJsZSBmcm9tIHRoZSB3ZWIuPC9wPgotCi08cD5BcGFjaGUgaXMgYWxzbyBjYXBhYmxlIG9mIDxhIGhyZWY9InZob3N0cy8iPlZpcnR1YWwgSG9zdGluZzwvYT4sCi13aGVyZSB0aGUgc2VydmVyIHJlY2VpdmVzIHJlcXVlc3RzIGZvciBtb3JlIHRoYW4gb25lIGhvc3QuICBJbiB0aGlzCi1jYXNlLCBhIGRpZmZlcmVudCA8Y29kZT5Eb2N1bWVudFJvb3Q8L2NvZGU+IGNhbiBiZSBzcGVjaWZpZWQgZm9yIGVhY2gKLXZpcnR1YWwgaG9zdCwgb3IgYWx0ZXJuYXRpdmVseSwgdGhlIGRpcmVjdGl2ZXMgcHJvdmlkZWQgYnkgdGhlIG1vZHVsZQotPGEgaHJlZj0ibW9kL21vZF92aG9zdF9hbGlhcy5odG1sIj5tb2Rfdmhvc3RfYWxpYXM8L2E+IGNhbiBiZSB1c2VkIHRvCi1keW5hbWljYWxseSBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIHBsYWNlIGZyb20gd2hpY2ggdG8gc2VydmUKLWNvbnRlbnQgYmFzZWQgb24gdGhlIHJlcXVlc3RlZCBJUCBhZGRyZXNzIG9yIGhvc3RuYW1lLjwvcD4KLQotPGgyPjxhIG5hbWU9Im91dHNpZGUiPkZpbGVzIE91dHNpZGUgdGhlIERvY3VtZW50Um9vdDwvYT48L2gyPgotCi08cD5UaGVyZSBhcmUgZnJlcXVlbnRseSBjaXJjdW1zdGFuY2VzIHdoZXJlIGl0IGlzIG5lY2Vzc2FyeSB0byBhbGxvdwotd2ViIGFjY2VzcyB0byBwYXJ0cyBvZiB0aGUgZmlsZXN5c3RlbSB3aGljaCBhcmUgbm90IHN0cmljdGx5Ci11bmRlcm5lYXRoIHRoZSA8YSBocmVmPSJtb2QvY29yZS5odG1sI2RvY3VtZW50cm9vdCI+RG9jdW1lbnRSb290PC9hPi4KLUFwYWNoZSBvZmZlcnMgc2V2ZXJhbCBkaWZmZXJlbnQgd2F5cyB0byBhY2NvbXBsaXNoIHRoaXMuICBPbiBVbml4Ci1zeXN0ZW1zLCBzeW1ib2xpYyBsaW5rcyBjYW4gYmUgdXNlZCB0byBicmluZyBvdGhlciBwYXJ0cyBvZiB0aGUKLWZpbGVzeXN0ZW0gdW5kZXIgdGhlIDxjb2RlPkRvY3VtZW50Um9vdDwvY29kZT4uICBGb3Igc2VjdXJpdHkgcmVhc29ucywKLXN5bWJvbGljIGxpbmtzIHdpbGwgb25seSBiZSBmb2xsb3dlZCBpZiB0aGUgPGEKLWhyZWY9Im1vZC9jb3JlLmh0bWwjb3B0aW9ucyI+T3B0aW9uczwvYT4gc2V0dGluZyBmb3IgdGhlIHJlbGV2YW50Ci1kaXJlY3RvcnkgaW5jbHVkZXMgPGNvZGU+Rm9sbG93U3ltTGlua3M8L2NvZGU+IG9yCi08Y29kZT5TeW1MaW5rc0lmT3duZXJNYXRjaDwvY29kZT4uPC9wPgotCi08cD5BbHRlcm5hdGl2ZWx5LCB0aGUgPGEgaHJlZj0ibW9kL21vZF9hbGlhcy5odG1sI2FsaWFzIj5BbGlhczwvYT4KLWRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBtYXAgYW55IHBhcnQgb2YgdGhlIGZpbGVzeXN0ZW0gaW50byB0aGUgd2ViCi1zcGFjZS4gIEZvciBleGFtcGxlLCB3aXRoPC9wPgotCi08YmxvY2txdW90ZT48Y29kZT5BbGlhcyAvZG9jcyAvdmFyL3dlYi8KLTwvYmxvY2txdW90ZT48L2NvZGU+IAotCi08cD50aGUgVVJMIDxjb2RlPmh0dHA6Ly93d3cuZXhhbXBsZS5jb20vZG9jcy9kaXIvZmlsZS5odG1sPC9jb2RlPiB3aWxsCi1iZSBzZXJ2ZWQgZnJvbSA8Y29kZT4vdmFyL3dlYi9kaXIvZmlsZS5odG1sPC9jb2RlPi4gIFRoZSA8YQotaHJlZj0ibW9kL21vZF9hbGlhcy5odG1sI3NjcmlwdGFsaWFzIj5TY3JpcHRBbGlhczwvYT4gZGlyZWN0aXZlIHdvcmtzCi10aGUgc2FtZSB3YXksIHdpdGggdGhlIGFkZGl0aW9uYWwgZWZmZWN0IHRoYXQgYWxsIGNvbnRlbnQgbG9jYXRlZCBhdAotdGhlIHRhcmdldCBwYXRoIGlzIHRyZWF0ZWQgYXMgQ0dJIHNjcmlwdHMuPC9wPgotCi08cD5Gb3Igc2l0dWF0aW9ucyB3aGVyZSBhZGRpdGlvbmFsIGZsZXhpYmlsaXR5IGlzIHJlcXVpcmVkLCB0aGUgPGEKLWhyZWY9Im1vZC9tb2RfYWxpYXMuaHRtbCNhbGlhc21hdGNoIj5BbGlhc01hdGNoPC9hPiBhbmQgPGEKLWhyZWY9Im1vZC9tb2RfYWxpYXMuaHRtbCNzY3JpcHRhbGlhc21hdGNoIj5TY3JpcHRBbGlhc01hdGNoPC9hPgotZGlyZWN0aXZlcyBjYW4gZG8gcG93ZXJmdWwgPGEKLWhyZWY9Im1pc2MvRkFRLmh0bWwjcmVnZXgiPnJlZ3VsYXItZXhwcmVzc2lvbjwvYT4gYmFzZWQgbWF0Y2hpbmcgYW5kCi1zdWJzdGl0dXRpb24uICBGb3IgZXhhbXBsZSw8L3A+Ci0KLTxibG9ja3F1b3RlPjxjb2RlPiBTY3JpcHRBbGlhc01hdGNoIF4vfihbXi9dKikvY2dpLWJpbi8oLiopCi0vaG9tZS8kMS9jZ2ktYmluLyQyIDwvY29kZT48L2Jsb2NrcXVvdGU+Ci0KLTxwPndpbGwgbWFwIGEgcmVxdWVzdCB0bwotPGNvZGU+aHR0cDovL2V4YW1wbGUuY29tL351c2VyL2NnaS1iaW4vc2NyaXB0LmNnaTwvY29kZT4gdG8gdGhlIHBhdGgKLTxjb2RlPi9ob21lL3VzZXIvY2dpLWJpbi9zY3JpcHQuY2dpPC9jb2RlPiBhbmQgd2lsbCB0cmVhdCB0aGUKLXJlc3VsdGluZyBmaWxlIGFzIGEgQ0dJIHNjcmlwdC48L3A+Ci0KLTxoMj48YSBuYW1lPSJ1c2VyIj5Vc2VyIERpcmVjdG9yaWVzPC9hPjwvaDI+Ci0KLTxwPlRyYWRpdGlvbmFsbHkgb24gVW5peCBzeXN0ZW1zLCB0aGUgaG9tZSBkaXJlY3Rvcnkgb2YgYSBwYXJ0aWN1bGFyCi08ZW0+dXNlcjwvZW0+IGNhbiBiZSByZWZlcnJlZCB0byBhcyA8Y29kZT5+dXNlci88L2NvZGU+LiAgVGhlIG1vZHVsZQotPGEgaHJlZj0ibW9kL21vZF91c2VyZGlyLmh0bWwiPm1vZF91c2VyZGlyPC9hPiBleHRlbmRzIHRoaXMgaWRlYSB0bwotdGhlIHdlYiBieSBhbGxvd2luZyBmaWxlcyB1bmRlciBlYWNoIHVzZXIncyBob21lIGRpcmVjdG9yeSB0byBiZQotYWNjZXNzZWQgdXNpbmcgVVJMcyBzdWNoIGFzIHRoZSBmb2xsb3dpbmcuPC9wPgotCi08YmxvY2txdW90ZT48Y29kZT5odHRwOi8vd3d3LmV4YW1wbGUuY29tL351c2VyL2ZpbGUuaHRtbDwvY29kZT48L2Jsb2NrcXVvdGU+Ci0KLTxwPkZvciBzZWN1cml0eSByZWFzb25zLCBpdCB3b3VsZCBiZSBpbmFwcHJvcHJpYXRlIHRvIGdpdmUgZGlyZWN0Ci1hY2Nlc3MgdG8gYSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkgZnJvbSB0aGUgd2ViLiAgVGhlcmVmb3JlLCB0aGUgPGEKLWhyZWY9Im1vZC9tb2RfdXNlcmRpci5odG1sI3VzZXJkaXIiPlVzZXJEaXI8L2E+IGRpcmVjdGl2ZSBpcyB1c2VkIHRvCi1zcGVjaWZ5IGEgZGlyZWN0b3J5IHVuZGVybmVhdGggdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSB3aGVyZSB3ZWIKLWZpbGVzIHdpbGwgYmUgbG9jYXRlZC4gIFVzaW5nIHRoZSBkZWZhdWx0IHNldHRpbmcgb2YgPGNvZGU+VXNlcmRpcgotcHVibGljX2h0bWw8L2NvZGU+LCB0aGUgYWJvdmUgVVJMIHdvdWxkIGxvb2sgZm9yIGEgZmlsZSBhdCBhIGRpcmVjdG9yeQotbGlrZSA8Y29kZT4vaG9tZS91c2VyL3B1YmxpY19odG1sL2ZpbGUuaHRtbDwvY29kZT4gd2hlcmUgdGhlCi08L2NvZGU+L2hvbWUvdXNlci88L2NvZGU+IGlzIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkgYXMgc3BlY2lmaWVkIGluCi08Y29kZT4vZXRjL3Bhc3N3ZDwvY29kZT4uPC9wPgotCi08cD5UaGVyZSBhcmUgYWxzbyBzZXZlcmFsIG90aGVyIGZvcm1zIG9mIHRoZSA8Y29kZT5Vc2VyZGlyPC9jb2RlPgotZGlyZWN0aXZlIHdoaWNoIGNhbiBiZSB1c2VkIG9uIHN5c3RlbXMgd2hlcmUgPGNvZGU+L2V0Yy9wYXNzd2Q8L2NvZGU+Ci1jYW5ub3QgYmUgdXNlZCB0byBmaW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgaG9tZSBkaXJlY3RvcnkuPC9wPgotCi08cD5Tb21lIHBlb3BsZSBmaW5kIHRoZSAifiIgc3ltYm9sICh3aGljaCBpcyBvZnRlbiBlbmNvZGVkIG9uIHRoZSB3ZWIKLWFzIDxjb2RlPiU3ZTwvY29kZT4pIHRvIGJlIGF3a3dhcmQgYW5kIHByZWZlciB0byB1c2UgYW4gYWx0ZXJuYXRlCi1zdHJpbmcgdG8gcmVwcmVzZW50IHVzZXIgZGlyZWN0b3JpZXMuICBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90Ci1zdXBwb3J0ZWQgYnkgbW9kX3VzZXJkaXIuICBIb3dldmVyLCBpZiB1c2VycycgaG9tZSBkaXJlY3RvcmllcyBhcmUKLXN0cnVjdHVyZWQgaW4gYSByZWd1bGFyIHdheSwgdGhlbiBpdCBpcyBwb3NzaWJsZSB0byB1c2UgdGhlIDxhCi1ocmVmPSJtb2QvbW9kX2FsaWFzLmh0bWwjYWxpYXNtYXRjaCI+QWxpYXNNYXRjaDwvYT4gZGlyZWN0aXZlIHRvCi1hY2hpZXZlIHRoZSBkZXNpcmVkIGVmZmVjdC4gIEZvciBleGFtcGxlLCB0byBtYWtlCi08Y29kZT5odHRwOi8vd3d3LmV4YW1wbGUuY29tL3VwYWdlcy91c2VyL2ZpbGUuaHRtbDwvY29kZT4gbWFwIHRvCi08Y29kZT4vaG9tZS91c2VyL3B1YmxpY19odG1sL2ZpbGUuaHRtbDwvY29kZT4sIHRoZSBmb2xsb3dpbmcKLTxjb2RlPkFsaWFzTWF0Y2g8L2NvZGU+IGRpcmVjdGl2ZSBjYW4gYmUgdXNlZC48L3A+Ci0KLTxibG9ja3F1b3RlPjxjb2RlPgotQWxpYXNNYXRjaCAgXi91cGFnZXMvKFteL10qKS8/KC4qKSAvaG9tZS8kMS9wdWJsaWNfaHRtbC8kMiAKLTwvY29kZT48L2Jsb2NrcXVvdGU+Ci0KLTxoMj48YSBuYW1lPSJyZWRpcmVjdCI+VVJMIFJlZGlyZWN0aW9uPC9hPjwvaDI+Ci0KLTxwPlRoZSBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMgZGlzY3Vzc2VkIGluIHRoZSBhYm92ZSBzZWN0aW9ucyBhcmUKLXVzZWQgdG8gdGVsbCBBcGFjaGUgdG8gZ2V0IGNvbnRlbnQgZnJvbSBhIHNwZWNpZmljIHBsYWNlIGluIHRoZQotZmlsZXN5c3RlbSBhbmQgcmV0dXJuIGl0IHRvIHRoZSBjbGllbnQuICBTb21ldGltZXMsIGl0IGlzIGRlc2lyYWJsZQotaW5zdGVhZCB0byBpbmZvcm0gdGhlIGNsaWVudCB0aGF0IHRoZSBjb250ZW50IGJlaW5nIHJlcXVlc3RlZCBpcwotbG9jYXRlZCBhdCBhbiBkaWZmZXJlbnQgVVJMLCBhbmQgaW5zdHJ1Y3QgdGhlIGNsaWVudCB0byBtYWtlIGEgbmV3Ci1yZXF1ZXN0IHdpdGggdGhlIG5ldyBVUkwuICBUaGlzIGlzIHJlZmVycmVkIHRvIGFzIDxlbT5yZWRpcmVjdGlvbjwvZW0+Ci1hbmQgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIDxhCi1ocmVmPSJtb2QvbW9kX2FsaWFzLmh0bWwjcmVkaXJlY3QiPlJlZGlyZWN0PC9hPiBkaXJlY3RpdmUuICBGb3IgZXhhbXBsZSwKLWlmIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IDxjb2RlPi9mb28vPC9jb2RlPiB1bmRlciB0aGUKLTxjb2RlPkRvY3VtZW50Um9vdDwvY29kZT4gaGF2ZSBiZWVuIG1vdmVkIHRvIHRoZSBuZXcgZGlyZWN0b3J5Ci08Y29kZT4vYmFyLzwvY29kZT4sIGNsaWVudHMgY2FuIGluc3RydWN0ZWQgdG8gcmVxdWVzdCB0aGUgY29udGVudCBhdAotdGhlIG5ldyBsb2NhdGlvbiBhcyBmb2xsb3dzLjwvcD4KLQotPGJsb2NrcXVvdGU+PGNvZGU+UmVkaXJlY3QgcGVybWFuZW50Ci0vZm9vLyBodHRwOi8vd3d3LmV4YW1wbGUuY29tL2Jhci88L2NvZGU+PC9ibG9ja3F1b3RlPgotCi08cD5UaGlzIHdpbGwgcmVkaXJlY3QgYW55IFVSTC1QYXRoIHN0YXJ0aW5nIGluIDxjb2RlPi9mb28vPC9jb2RlPiB0bwotdGhlIHNhbWUgVVJMIHBhdGggb24gdGhlIDxjb2RlPnd3dy5leGFtcGxlLmNvbTwvY29kZT4gc2VydmVyIHdpdGgKLTxjb2RlPi9iYXIvPC9jb2RlPiBzdWJzdGl0dXRlZCBmb3IgPGNvZGU+L2Zvby88L2NvZGU+LiAgTm90ZSB0aGF0Ci1jbGllbnRzIGNhbiBiZSByZWRpcmVjdGVkIHRvIGFueSBzZXJ2ZXIsIG5vdCBvbmx5IHRoZSBvcmlnaW4KLXNlcnZlci48L3A+Ci0KLTxwPkFwYWNoZSBhbHNvIHByb3ZpZGVzIGEgPGEKLWhyZWY9Im1vZC9tb2RfYWxpYXMuaHRtbCNyZWRpcmVjdG1hdGNoIj5SZWRpcmVjdE1hdGNoPC9hPiBkaXJlY3RpdmUKLXdoaWNoIGNhbiBiZSB1c2VkIGZvciBtb3JlIGNvbXBsaWNhdGVkIHJld3JpdGluZyBwcm9ibGVtcy4gIEZvcgotZXhhbXBsZSwgdG8gcmVkaXJlY3QgcmVxdWVzdHMgZm9yIHRoZSBzaXRlIGhvbWUgcGFnZSB0byBhIGRpZmZlcmVudAotc2l0ZSwgYnV0IGxlYXZlIGFsbCBvdGhlciByZXF1ZXN0cyBhbG9uZSwgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uCi1jYW4gYmUgdXNlZC48L3A+Ci0KLTxibG9ja3F1b3RlPjxjb2RlPgotUmVkaXJlY3RNYXRjaCBwZXJtYW5lbnQgXi8kIGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vc3RhcnRwYWdlLmh0bWwKLTwvY29kZT48L2Jsb2NrcXVvdGU+Ci0KLTxwPkFsdGVybmF0aXZlbHksIHRvIHRlbXBvcmFyaWx5IHJlZGlyZWN0IGFsbCBwYWdlcyBvbiBhIHNpdGUgdG8gb25lCi1wYXJ0aWN1bGFyIHBhZ2UsIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBpcyB1c2VmdWwuPC9wPgotCi08YmxvY2txdW90ZT48Y29kZT4KLVJlZGlyZWN0TWF0Y2ggdGVtcCAuKiBodHRwOi8vd3d3LmV4YW1wbGUuY29tL3N0YXJ0cGFnZS5odG1sCi08L2NvZGU+PC9ibG9ja3F1b3RlPgotCi08aDI+PGEgbmFtZT0icmV3cml0ZSI+UmV3cml0aW5nIEVuZ2luZTwvYT48L2gyPgotCi08cD5XaGVuIGV2ZW4gbW9yZSBwb3dlcmZ1bCBzdWJzdGl0dXRpb24gaXMgcmVxdWlyZWQsIHRoZSByZXdyaXRpbmcKLWVuZ2luZSBwcm92aWRlZCBieSA8YSBocmVmPSJtb2QvbW9kX3Jld3JpdGUuaHRtbCI+bW9kX3Jld3JpdGU8L2E+IGNhbgotYmUgdXNlZnVsLiAgVGhlIGRpcmVjdGl2ZXMgcHJvdmlkZWQgYnkgdGhpcyBtb2R1bGUgY2FuIHVzZQotY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSByZXF1ZXN0IHN1Y2ggYXMgYnJvd3NlciB0eXBlIG9yIHNvdXJjZSBJUAotYWRkcmVzcyBpbiBkZWNpZGluZyBmcm9tIHdoZXJlIHRvIHNlcnZlIGNvbnRlbnQuICBJbiBhZGRpdGlvbiwKLW1vZF9yZXdyaXRlIGNhbiB1c2UgZXh0ZXJuYWwgZGF0YWJhc2UgZmlsZXMgb3IgcHJvZ3JhbXMgdG8gZGV0ZXJtaW5lCi1ob3cgdG8gaGFuZGxlIGEgcmVxdWVzdC4gIE1hbnkgcHJhY3RpY2FsIGV4YW1wbGVzIGVtcGxveWluZwotbW9kX3Jld3JpdGUgYXJlIGRpc2N1c3NlZCBpbiB0aGUgPGEgaHJlZj0ibWlzYy9yZXdyaXRlZ3VpZGUuaHRtbCI+VVJMCi1SZXdyaXRpbmcgR3VpZGU8L2E+LjwvcD4KLQotPGgyPjxhIG5hbWU9Im5vdGZvdW5kIj5GaWxlIE5vdCBGb3VuZDwvYT48L2gyPgotCi08cD5JbmV2aXRhYmx5LCBVUkxzIHdpbGwgYmUgcmVxdWVzdGVkIGZvciB3aGljaCBubyBtYXRjaGluZyBmaWxlIGNhbgotYmUgZm91bmQgaW4gdGhlIGZpbGVzeXN0ZW0uICBUaGlzIGNhbiBoYXBwZW4gZm9yIHNldmVyYWwgcmVhc29ucy4gIEluCi1zb21lIGNhc2VzLCBpdCBjYW4gYmUgYSByZXN1bHQgb2YgbW92aW5nIGRvY3VtZW50cyBmcm9tIG9uZSBsb2NhdGlvbgotdG8gYW5vdGhlci4gIEluIHRoaXMgY2FzZSwgaXQgaXMgYmVzdCB0byB1c2UgPGEgaHJlZj0iI3JlZGlyZWN0Ij5VUkwKLXJlZGlyZWN0aW9uPC9hPiB0byBpbmZvcm0gY2xpZW50cyBvZiB0aGUgbmV3IGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZS4KLUluIHRoaXMgd2F5LCB5b3UgY2FuIGFzc3VyZSB0aGF0IG9sZCBib29rbWFya3MgYW5kIGxpbmtzIHdpbGwgY29udGludWUKLXRvIHdvcmssIGV2ZW4gdGhvdWdoIHRoZSByZXNvdXJjZSBpcyBhdCBhIG5ldyBsb2NhdGlvbi48L3A+Ci0KLTxwPkFub3RoZXIgY29tbW9uIGNhdXNlIG9mICJGaWxlIE5vdCBGb3VuZCIgZXJyb3JzIGlzIGFjY2lkZW50YWwKLW1pc3R5cGluZyBvZiBVUkxzLCBlaXRoZXIgZGlyZWN0bHkgaW4gdGhlIGJyb3dzZXIsIG9yIGluIEhUTUwgbGlua3MuCi1BcGFjaGUgcHJvdmlkZXMgdGhlIG1vZHVsZSA8YSBocmVmPSJtb2QvbW9kX3NwZWxpbmciPm1vZF9zcGVsaW5nPC9hPgotKHNpYykgdG8gaGVscCB3aXRoIHRoaXMgcHJvYmxlbS4gIFdoZW4gdGhpcyBtb2R1bGUgaXMgYWN0aXZhdGVkLCBpdAotd2lsbCBpbnRlcmNlcHQgIkZpbGUgTm90IEZvdW5kIiBlcnJvcnMgYW5kIGxvb2sgZm9yIGEgcmVzb3VyY2Ugd2l0aCBhCi1zaW1pbGFyIGZpbGVuYW1lLiAgSWYgb25lIHN1Y2ggZmlsZSBpcyBmb3VuZCwgbW9kX3NwZWxpbmcgd2lsbCBzZW5kIGFuCi1IVFRQIHJlZGlyZWN0IHRvIHRoZSBjbGllbnQgaW5mb3JtaW5nIGl0IG9mIHRoZSBjb3JyZWN0IGxvY2F0aW9uLiAgSWYKLXNldmVyYWwgImNsb3NlIiBmaWxlcyBhcmUgZm91bmQsIGEgbGlzdCBvZiBhdmFpbGFibGUgYWx0ZXJuYXRpdmVzIHdpbGwKLWJlIHByZXNlbnRlZCB0byB0aGUgY2xpZW50LjwvcD4KLQotPHA+QW4gZXNwZWNpYWxseSB1c2VmdWwgZmVhdHVyZSBvZiBtb2Rfc3BlbGluZywgaXMgdGhhdCBpdCB3aWxsCi1jb21wYXJlIGZpbGVuYW1lcyB3aXRob3V0IHJlc3BlY3QgdG8gY2FzZS4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IKLXN5c3RlbXMgd2hlcmUgdXNlcnMgYXJlIHVuYXdhcmUgb2YgdGhlIGNhc2Utc2Vuc2l0aXZlIG5hdHVyZSBvZiBVUkxzCi1hbmQgdGhlIHVuaXggZmlsZXN5c3RlbS4gIEhvd2V2ZXIsIHVzaW5nIG1vZF9zcGVsaW5nIGZvciBhbnl0aGluZyBtb3JlCi10aGFuIHRoZSBvY2Nhc2lvbmFsIFVSTCBjb3JyZWN0aW9uIGNhbiBsZWFkIHRvIGFkZGl0aW9uYWwgbG9hZCBvbiB0aGUKLXNlcnZlciwgc2luY2UgZWFjaCAiaW5jb3JyZWN0IiByZXF1ZXN0IGlzIGZvbGxvd2VkIGJ5IGEgVVJMCi1yZWRpcmVjdGlvbiBhbmQgYSBuZXcgcmVxdWVzdCBmcm9tIHRoZSBjbGllbnQuPC9wPgotCi08cD5JZiBhbGwgYXR0ZW1wdHMgdG8gbG9jYXRlIHRoZSBjb250ZW50IGZhaWwsIEFwYWNoZSByZXR1cm5zIGFuIGVycm9yCi1wYWdlIHdpdGggSFRUUCBzdGF0dXMgY29kZSA0MDQgKGZpbGUgbm90IGZvdW5kKS4gIFRoZSBhcHBlYXJhbmNlIG9mCi10aGlzIHBhZ2UgaXMgY29udHJvbGxlZCB3aXRoIHRoZSA8YQotaHJlZj0ibW9kL2NvcmUuaHRtbCNlcnJvcmRvY3VtZW50Ij5FcnJvckRvY3VtZW50PC9hPiBkaXJlY3RpdmUgYW5kIGNhbgotYmUgY3VzdG9taXplZCBpbiBhIGZsZXhpYmxlIG1hbm5lciBhcyBkaXNjdXNzZWQgaW4gdGhlIDxhCi1ocmVmPSJjdXN0b20tZXJyb3IuaHRtbCI+Q3VzdG9tIGVycm9yIHJlc3BvbnNlczwvYT4gYW5kIDxhCi1ocmVmPSJtaXNjL2N1c3RvbV9lcnJvcmRvY3MuaHRtbCI+SW50ZXJuYXRpb25hbCBTZXJ2ZXIgRXJyb3IKLVJlc3BvbnNlczwvYT4gZG9jdW1lbnRzLjwvcD4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3Zob3N0cy9kZXRhaWxzLmh0bWwgYi9kb2NzL21hbnVhbC92aG9zdHMvZGV0YWlscy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTk5MjE3Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL3Zob3N0cy9kZXRhaWxzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPGh0bWw+PGhlYWQ+Ci08dGl0bGU+QW4gSW4tRGVwdGggRGlzY3Vzc2lvbiBvZiBWaXJ0dWFsIEhvc3QgTWF0Y2hpbmc8L3RpdGxlPgotPC9oZWFkPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxoMSBBTElHTj0iQ0VOVEVSIj5BbiBJbi1EZXB0aCBEaXNjdXNzaW9uIG9mIFZpcnR1YWwgSG9zdCBNYXRjaGluZzwvaDE+Ci0KLTxwPlRoZSB2aXJ0dWFsIGhvc3QgY29kZSB3YXMgY29tcGxldGVseSByZXdyaXR0ZW4gaW4gPEI+QXBhY2hlIDEuMzwvQj4uCi1UaGlzIGRvY3VtZW50IGF0dGVtcHRzIHRvIGV4cGxhaW4gZXhhY3RseSB3aGF0IEFwYWNoZSBkb2VzIHdoZW4KLWRlY2lkaW5nIHdoYXQgdmlydHVhbCBob3N0IHRvIHNlcnZlIGEgaGl0IGZyb20uIFdpdGggdGhlIGhlbHAgb2YgdGhlCi1uZXcgPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNuYW1ldmlydHVhbGhvc3QiPjxTQU1QPk5hbWVWaXJ0dWFsSG9zdDwvU0FNUD48L0E+Ci1kaXJlY3RpdmUgIHZpcnR1YWwgaG9zdCBjb25maWd1cmF0aW9uIHNob3VsZCBiZSBhIGxvdCBlYXNpZXIgYW5kIHNhZmVyCi10aGFuIHdpdGggdmVyc2lvbnMgcHJpb3IgdG8gMS4zLgotCi08cD5JZiB5b3UganVzdCB3YW50IHRvIDxjaXRlPm1ha2UgaXQgd29yazwvY2l0ZT4gd2l0aG91dCB1bmRlcnN0YW5kaW5nCi1ob3csIGhlcmUgYXJlIDxhIGhyZWY9ImV4YW1wbGVzLmh0bWwiPnNvbWUgZXhhbXBsZXM8L2E+LgotCi08aDM+Q29uZmlnIEZpbGUgUGFyc2luZzwvaDM+Ci0KLTxwPlRoZXJlIGlzIGEgPEVNPm1haW5fc2VydmVyPC9FTT4gd2hpY2ggY29uc2lzdHMgb2YgYWxsCi10aGUgZGVmaW5pdGlvbnMgYXBwZWFyaW5nIG91dHNpZGUgb2YgPENPREU+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvQ09ERT4gc2VjdGlvbnMuCi1UaGVyZSBhcmUgdmlydHVhbCBzZXJ2ZXJzLCBjYWxsZWQgPEVNPnZob3N0czwvRU0+LCB3aGljaCBhcmUgZGVmaW5lZCBieQotPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCN2aXJ0dWFsaG9zdCI+PFNBTVA+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvU0FNUD48L0E+Ci1zZWN0aW9ucy4KLQotPHA+VGhlIGRpcmVjdGl2ZXMKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjcG9ydCI+PFNBTVA+UG9ydDwvU0FNUD48L0E+LAotPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNzZXJ2ZXJuYW1lIj48U0FNUD5TZXJ2ZXJOYW1lPC9TQU1QPjwvQT4sCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcnBhdGgiPjxTQU1QPlNlcnZlclBhdGg8L1NBTVA+PC9BPiwKLWFuZAotPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNzZXJ2ZXJhbGlhcyI+PFNBTVA+U2VydmVyQWxpYXM8L1NBTVA+PC9BPgotY2FuIGFwcGVhciBhbnl3aGVyZSB3aXRoaW4gdGhlIGRlZmluaXRpb24gb2YKLWEgc2VydmVyLiAgSG93ZXZlciwgZWFjaCBhcHBlYXJhbmNlIG92ZXJyaWRlcyB0aGUgcHJldmlvdXMgYXBwZWFyYW5jZQotKHdpdGhpbiB0aGF0IHNlcnZlcikuCi0KLTxwPlRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSA8Y29kZT5Qb3J0PC9jb2RlPiBmaWVsZCBmb3IgbWFpbl9zZXJ2ZXIKLWlzIDgwLiAgVGhlIG1haW5fc2VydmVyIGhhcyBubyBkZWZhdWx0IDxjb2RlPlNlcnZlclBhdGg8L2NvZGU+LCBvcgotPGNvZGU+U2VydmVyQWxpYXM8L2NvZGU+LiBUaGUgZGVmYXVsdCA8Y29kZT5TZXJ2ZXJOYW1lPC9jb2RlPiBpcwotZGVkdWNlZCBmcm9tIHRoZSBzZXJ2ZXJzIElQIGFkZHJlc3MuCi0KLTxwPlRoZSBtYWluX3NlcnZlciBQb3J0IGRpcmVjdGl2ZSBoYXMgdHdvIGZ1bmN0aW9ucyBkdWUgdG8gbGVnYWN5Ci1jb21wYXRpYmlsaXR5IHdpdGggTkNTQSBjb25maWd1cmF0aW9uIGZpbGVzLiAgT25lIGZ1bmN0aW9uIGlzCi10byBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgbmV0d29yayBwb3J0IEFwYWNoZSB3aWxsIGJpbmQgdG8uICBUaGlzCi1kZWZhdWx0IGlzIG92ZXJyaWRkZW4gYnkgdGhlIGV4aXN0ZW5jZSBvZiBhbnkKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjbGlzdGVuIj48Y29kZT5MaXN0ZW48L2NvZGU+PC9BPiBkaXJlY3RpdmVzLgotVGhlIHNlY29uZCBmdW5jdGlvbiBpcyB0byBzcGVjaWZ5IHRoZSBwb3J0IG51bWJlciB3aGljaCBpcyB1c2VkCi1pbiBhYnNvbHV0ZSBVUklzIGR1cmluZyByZWRpcmVjdHMuCi0KLTxwPlVubGlrZSB0aGUgbWFpbl9zZXJ2ZXIsIHZob3N0IHBvcnRzIDxlbT5kbyBub3Q8L2VtPiBhZmZlY3Qgd2hhdAotcG9ydHMgQXBhY2hlIGxpc3RlbnMgZm9yIGNvbm5lY3Rpb25zIG9uLgotCi08cD5FYWNoIGFkZHJlc3MgYXBwZWFyaW5nIGluIHRoZSA8Y29kZT5WaXJ0dWFsSG9zdDwvY29kZT4gZGlyZWN0aXZlCi1jYW4gaGF2ZSBhbiBvcHRpb25hbCBwb3J0LiAgSWYgdGhlIHBvcnQgaXMgdW5zcGVjaWZpZWQgaXQgZGVmYXVsdHMgdG8KLXRoZSB2YWx1ZSBvZiB0aGUgbWFpbl9zZXJ2ZXIncyBtb3N0IHJlY2VudCA8Y29kZT5Qb3J0PC9jb2RlPiBzdGF0ZW1lbnQuCi1UaGUgc3BlY2lhbCBwb3J0IDxTQU1QPio8L1NBTVA+IGluZGljYXRlcyBhIHdpbGRjYXJkIHRoYXQgbWF0Y2hlcyBhbnkgcG9ydC4KLUNvbGxlY3RpdmVseSB0aGUgZW50aXJlIHNldCBvZiBhZGRyZXNzZXMgKGluY2x1ZGluZyBtdWx0aXBsZQotPFNBTVA+QTwvU0FNUD4gcmVjb3JkCi1yZXN1bHRzIGZyb20gRE5TIGxvb2t1cHMpIGFyZSBjYWxsZWQgdGhlIHZob3N0J3MgPEVNPmFkZHJlc3Mgc2V0PC9FTT4uCi0KLTxQPlVubGVzcyBhIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjbmFtZXZpcnR1YWxob3N0Ij5OYW1lVmlydHVhbEhvc3Q8L0E+Ci1kaXJlY3RpdmUgaXMgdXNlZCBmb3IgYSBzcGVjaWZpYyBJUCBhZGRyZXNzIHRoZSBmaXJzdCB2aG9zdCB3aXRoCi10aGF0IGFkZHJlc3MgaXMgdHJlYXRlZCBhcyBhbiBJUC1iYXNlZCB2aG9zdC4KLQotPFA+SWYgbmFtZS1iYXNlZCB2aG9zdHMgc2hvdWxkIGJlIHVzZWQgYSA8Y29kZT5OYW1lVmlydHVhbEhvc3Q8L2NvZGU+Ci1kaXJlY3RpdmUgPGVtPm11c3Q8L2VtPiBhcHBlYXIgd2l0aCB0aGUgSVAgYWRkcmVzcyBzZXQgdG8gYmUgdXNlZCBmb3IgdGhlCi1uYW1lLWJhc2VkIHZob3N0cy4gSW4gb3RoZXIgd29yZHMsIHlvdSBtdXN0IHNwZWNpZnkgdGhlIElQIGFkZHJlc3MgdGhhdAotaG9sZHMgdGhlIGhvc3RuYW1lIGFsaWFzZXMgKENOQU1FcykgZm9yIHlvdXIgbmFtZS1iYXNlZCB2aG9zdHMgdmlhIGEKLTxjb2RlPk5hbWVWaXJ0dWFsSG9zdDwvY29kZT4gZGlyZWN0aXZlIGluIHlvdXIgY29uZmlndXJhdGlvbiBmaWxlLgotCi08UD5NdWx0aXBsZSA8Y29kZT5OYW1lVmlydHVhbEhvc3Q8L2NvZGU+IGRpcmVjdGl2ZXMgY2FuIGJlIHVzZWQgZWFjaAotd2l0aCBhIHNldCBvZiA8Y29kZT5WaXJ0dWFsSG9zdDwvY29kZT4gZGlyZWN0aXZlcy4KLQotPFA+VGhlIG9yZGVyaW5nIG9mIDxjb2RlPk5hbWVWaXJ0dWFsSG9zdDwvY29kZT4gYW5kIAotPGNvZGU+VmlydHVhbEhvc3Q8L2NvZGU+IGRpcmVjdGl2ZXMgaXMgbm90IGltcG9ydGFudCB3aGljaCBtYWtlcyB0aGUKLWZvbGxvd2luZyB0d28gZXhhbXBsZXMgaWRlbnRpY2FsIChvbmx5IHRoZSBvcmRlciBvZiB0aGUKLTxjb2RlPlZpcnR1YWxIb3N0PC9jb2RlPiBkaXJlY3RpdmVzIGZvciA8ZW0+b25lPC9lbT4gYWRkcmVzcyBzZXQKLWlzIGltcG9ydGFudCwgc2VlIGJlbG93KToKLQotPHByZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICBOYW1lVmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0ICB8ICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQmZ3Q7Ci0gICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQmZ3Q7ICAgIHwgIyBzZXJ2ZXIgQQotICAjIHNlcnZlciBBICAJCSAgICAgICAgfCAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotICAuLi4gCQkJICAgICAgICB8ICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNTUmZ3Q7Ci0gICZsdDsvVmlydHVhbEhvc3QmZ3Q7CSAgICAgICAgfCAjIHNlcnZlciBDCi0gICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQmZ3Q7ICAgIHwgLi4uCi0gICMgc2VydmVyIEIgIAkJICAgICAgICB8ICZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci0gIC4uLiAJCQkgICAgICAgIHwgJmx0O1ZpcnR1YWxIb3N0IDExMS4yMi4zMy40NCZndDsKLSAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsJICAgICAgICB8ICMgc2VydmVyIEIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAuLi4KLSAgTmFtZVZpcnR1YWxIb3N0IDExMS4yMi4zMy41NSAgfCAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotICAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjU1Jmd0OyAgICB8ICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNTUmZ3Q7Ci0gICMgc2VydmVyIEMgIAkJICAgICAgICB8ICMgc2VydmVyIEQKLSAgLi4uIAkJCSAgICAgICAgfCAuLi4KLSAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsJICAgICAgICB8ICZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci0gICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNTUmZ3Q7ICAgIHwKLSAgIyBzZXJ2ZXIgRCAgCQkgICAgICAgIHwgTmFtZVZpcnR1YWxIb3N0IDExMS4yMi4zMy40NAotICAuLi4gCQkJICAgICAgICB8IE5hbWVWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNTUKLSAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsJICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLTwvcHJlPgotCi08cD4oVG8gYWlkIHRoZSByZWFkYWJpbGl0eSBvZiB5b3VyIGNvbmZpZ3VyYXRpb24geW91IHNob3VsZCBwcmVmZXIgdGhlCi1sZWZ0IHZhcmlhbnQuKQotCi08cD4gQWZ0ZXIgcGFyc2luZyB0aGUgPGNvZGU+VmlydHVhbEhvc3Q8L2NvZGU+IGRpcmVjdGl2ZSwgdGhlIHZob3N0IHNlcnZlcgotaXMgZ2l2ZW4gYSBkZWZhdWx0IDxjb2RlPlBvcnQ8L2NvZGU+IGVxdWFsIHRvIHRoZSBwb3J0IGFzc2lnbmVkIHRvIHRoZQotZmlyc3QgbmFtZSBpbiBpdHMgPGNvZGU+VmlydHVhbEhvc3Q8L2NvZGU+IGRpcmVjdGl2ZS4KLQotPHA+VGhlIGNvbXBsZXRlIGxpc3Qgb2YgbmFtZXMgaW4gdGhlIDxjb2RlPlZpcnR1YWxIb3N0PC9jb2RlPiBkaXJlY3RpdmUKLWFyZSB0cmVhdGVkIGp1c3QgbGlrZSBhIDxjb2RlPlNlcnZlckFsaWFzPC9jb2RlPiAoYnV0IGFyZSBub3Qgb3ZlcnJpZGRlbiBieSBhbnkKLTxjb2RlPlNlcnZlckFsaWFzPC9jb2RlPiBzdGF0ZW1lbnQpIGlmIGFsbCBuYW1lcyByZXNvbHZlIHRvIHRoZSBzYW1lIGFkZHJlc3Mgc2V0LgotTm90ZSB0aGF0IHN1YnNlcXVlbnQgPGNvZGU+UG9ydDwvY29kZT4gc3RhdGVtZW50cyBmb3IgdGhpcyB2aG9zdCB3aWxsIG5vdCBhZmZlY3QKLXRoZSBwb3J0cyBhc3NpZ25lZCBpbiB0aGUgYWRkcmVzcyBzZXQuCi0KLTxwPkR1cmluZyBpbml0aWFsaXphdGlvbiBhIGxpc3QgZm9yIGVhY2ggSVAgYWRkcmVzcwotaXMgZ2VuZXJhdGVkIGFuIGluc2VydGVkIGludG8gYW4gaGFzaCB0YWJsZS4gSWYgdGhlIElQIGFkZHJlc3MgaXMKLXVzZWQgaW4gYSA8Y29kZT5OYW1lVmlydHVhbEhvc3Q8L2NvZGU+IGRpcmVjdGl2ZSB0aGUgbGlzdCBjb250YWlucwotYWxsIG5hbWUtYmFzZWQgdmhvc3RzIGZvciB0aGUgZ2l2ZW4gSVAgYWRkcmVzcy4gSWYgdGhlcmUgYXJlIG5vCi12aG9zdHMgZGVmaW5lZCBmb3IgdGhhdCBhZGRyZXNzIHRoZSA8Y29kZT5OYW1lVmlydHVhbEhvc3Q8L2NvZGU+IGRpcmVjdGl2ZQotaXMgaWdub3JlZCBhbmQgYW4gZXJyb3IgaXMgbG9nZ2VkLiBGb3IgYW4gSVAtYmFzZWQgdmhvc3QgdGhlIGxpc3QgaW4gdGhlCi1oYXNoIHRhYmxlIGlzIGVtcHR5LgotCi08cD5EdWUgdG8gYSBmYXN0IGhhc2hpbmcgZnVuY3Rpb24gdGhlIG92ZXJoZWFkIG9mIGhhc2hpbmcgYW4gSVAgYWRkcmVzcwotZHVyaW5nIGEgcmVxdWVzdCBpcyBtaW5pbWFsIGFuZCBhbG1vc3Qgbm90IGV4aXN0ZW50LiBBZGRpdGlvbmFsbHkKLXRoZSB0YWJsZSBpcyBvcHRpbWl6ZWQgZm9yIElQIGFkZHJlc3NlcyB3aGljaCB2YXJ5IGluIHRoZSBsYXN0IG9jdGV0LgotCi08cD5Gb3IgZXZlcnkgdmhvc3QgdmFyaW91cyBkZWZhdWx0IHZhbHVlcyBhcmUgc2V0LiBJbiBwYXJ0aWN1bGFyOgotCi08b2w+Ci08bGk+SWYgYSB2aG9zdCBoYXMgbm8KLSAgICA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcmFkbWluIj48Y29kZT5TZXJ2ZXJBZG1pbjwvY29kZT48L0E+LAotICAgIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjcmVzb3VyY2Vjb25maWciPjxjb2RlPlJlc291cmNlQ29uZmlnPC9jb2RlPjwvQT4sCi0gICAgPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNhY2Nlc3Njb25maWciPjxjb2RlPkFjY2Vzc0NvbmZpZzwvY29kZT48L0E+LAotICAgIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjdGltZW91dCI+PGNvZGU+VGltZW91dDwvY29kZT48L0E+LAotICAgIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwja2VlcGFsaXZldGltZW91dCI+PGNvZGU+S2VlcEFsaXZlVGltZW91dDwvY29kZT48L0E+LAotICAgIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwja2VlcGFsaXZlIj48Y29kZT5LZWVwQWxpdmU8L2NvZGU+PC9BPiwKLSAgICA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI21heGtlZXBhbGl2ZXJlcXVlc3RzIj48Y29kZT5NYXhLZWVwQWxpdmVSZXF1ZXN0czwvY29kZT48L0E+LAotICAgIG9yCi0gICAgPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNzZW5kYnVmZmVyc2l6ZSI+PGNvZGU+U2VuZEJ1ZmZlclNpemU8L2NvZGU+PC9BPgotICAgIGRpcmVjdGl2ZSB0aGVuIHRoZSByZXNwZWN0aXZlIHZhbHVlIGlzCi0gICAgaW5oZXJpdGVkIGZyb20gdGhlIG1haW5fc2VydmVyLiAgKFRoYXQgaXMsIGluaGVyaXRlZCBmcm9tIHdoYXRldmVyCi0gICAgdGhlIGZpbmFsIHNldHRpbmcgb2YgdGhhdCB2YWx1ZSBpcyBpbiB0aGUgbWFpbl9zZXJ2ZXIuKQotCi08bGk+VGhlICZxdW90O2xvb2t1cCBkZWZhdWx0cyZxdW90OyB0aGF0IGRlZmluZSB0aGUgZGVmYXVsdCBkaXJlY3RvcnkKLSAgICBwZXJtaXNzaW9ucwotICAgIGZvciBhIHZob3N0IGFyZSBtZXJnZWQgd2l0aCB0aG9zZSBvZiB0aGUgbWFpbl9zZXJ2ZXIuICBUaGlzIGluY2x1ZGVzCi0gICAgYW55IHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYW55IG1vZHVsZS4KLQotPGxpPlRoZSBwZXItc2VydmVyIGNvbmZpZ3MgZm9yIGVhY2ggbW9kdWxlIGZyb20gdGhlIG1haW5fc2VydmVyIGFyZQotICAgIG1lcmdlZCBpbnRvIHRoZSB2aG9zdCBzZXJ2ZXIuCi08L29sPgotCi1Fc3NlbnRpYWxseSwgdGhlIG1haW5fc2VydmVyIGlzIHRyZWF0ZWQgYXMgJnF1b3Q7ZGVmYXVsdHMmcXVvdDsgb3IgYQotJnF1b3Q7YmFzZSZxdW90OyBvbiB3aGljaCB0byBidWlsZCBlYWNoIHZob3N0LgotQnV0IHRoZSBwb3NpdGlvbmluZyBvZiB0aGVzZSBtYWluX3NlcnZlcgotZGVmaW5pdGlvbnMgaW4gdGhlIGNvbmZpZyBmaWxlIGlzIGxhcmdlbHkgaXJyZWxldmFudCAtLSB0aGUgZW50aXJlCi1jb25maWcgb2YgdGhlIG1haW5fc2VydmVyIGhhcyBiZWVuIHBhcnNlZCB3aGVuIHRoaXMgZmluYWwgbWVyZ2luZyBvY2N1cnMuCi1TbyBldmVuIGlmIGEgbWFpbl9zZXJ2ZXIgZGVmaW5pdGlvbiBhcHBlYXJzIGFmdGVyIGEgdmhvc3QgZGVmaW5pdGlvbgotaXQgbWlnaHQgYWZmZWN0IHRoZSB2aG9zdCBkZWZpbml0aW9uLgotCi08cD4gSWYgdGhlIG1haW5fc2VydmVyIGhhcyBubyA8Y29kZT5TZXJ2ZXJOYW1lPC9jb2RlPiBhdCB0aGlzIHBvaW50LAotdGhlbiB0aGUgaG9zdG5hbWUgb2YgdGhlIG1hY2hpbmUgdGhhdCBodHRwZCBpcyBydW5uaW5nIG9uIGlzIHVzZWQKLWluc3RlYWQuICBXZSB3aWxsIGNhbGwgdGhlIDxFTT5tYWluX3NlcnZlciBhZGRyZXNzIHNldDwvRU0+IHRob3NlIElQCi1hZGRyZXNzZXMgcmV0dXJuZWQgYnkgYSBETlMgbG9va3VwIG9uIHRoZSA8Y29kZT5TZXJ2ZXJOYW1lPC9jb2RlPiBvZgotdGhlIG1haW5fc2VydmVyLgotCi08cD4gRm9yIGFueSB1bmRlZmluZWQgPGNvZGU+U2VydmVyTmFtZTwvY29kZT4gZmllbGRzLCBhIG5hbWUtYmFzZWQgdmhvc3QKLWRlZmF1bHRzIHRvIHRoZSBhZGRyZXNzIGdpdmVuIGZpcnN0IGluIHRoZSA8Y29kZT5WaXJ0dWFsSG9zdDwvY29kZT4KLXN0YXRlbWVudCBkZWZpbmluZyB0aGUgdmhvc3QuCi0KLTxQPkFueSB2aG9zdCB0aGF0IGluY2x1ZGVzIHRoZSBtYWdpYyA8U0FNUD5fZGVmYXVsdF88L1NBTVA+IHdpbGRjYXJkCi1pcyBnaXZlbiB0aGUgc2FtZSA8Y29kZT5TZXJ2ZXJOYW1lPC9jb2RlPiBhcyB0aGUgbWFpbl9zZXJ2ZXIuCi0KLQotPGgzPlZpcnR1YWwgSG9zdCBNYXRjaGluZzwvaDM+Ci0KLTxwPlRoZSBzZXJ2ZXIgZGV0ZXJtaW5lcyB3aGljaCB2aG9zdCB0byB1c2UgZm9yIGEgcmVxdWVzdCBhcyBmb2xsb3dzOgotCi08aDQ+SGFzaCB0YWJsZSBsb29rdXA8L2g0PgotCi08cD5XaGVuIHRoZSBjb25uZWN0aW9uIGlzIGZpcnN0IG1hZGUgYnkgYSBjbGllbnQsIHRoZSBJUCBhZGRyZXNzIHRvCi13aGljaCB0aGUgY2xpZW50IGNvbm5lY3RlZCBpcyBsb29rZWQgdXAgaW4gdGhlIGludGVybmFsIElQIGhhc2ggdGFibGUuCi0KLTxQPklmIHRoZSBsb29rdXAgZmFpbHMgKHRoZSBJUCBhZGRyZXNzIHdhc24ndCBmb3VuZCkgdGhlIHJlcXVlc3QgaXMKLXNlcnZlZCBmcm9tIHRoZSA8c2FtcD5fZGVmYXVsdF88L3NhbXA+IHZob3N0IGlmIHRoZXJlIGlzIHN1Y2ggYSB2aG9zdAotZm9yIHRoZSBwb3J0IHRvIHdoaWNoIHRoZSBjbGllbnQgc2VudCB0aGUgcmVxdWVzdC4gSWYgdGhlcmUgaXMgbm8KLW1hdGNoaW5nIDxzYW1wPl9kZWZhdWx0Xzwvc2FtcD4gdmhvc3QgdGhlIHJlcXVlc3QgaXMgc2VydmVkIGZyb20gdGhlCi1tYWluX3NlcnZlci4KLQotPFA+SWYgdGhlIGxvb2t1cCBzdWNjZWVkZWQgKGEgY29ycmVzcG9uZGluZyBsaXN0IGZvciB0aGUgSVAgYWRkcmVzcyB3YXMKLWZvdW5kKSB0aGUgbmV4dCBzdGVwIGlzIHRvIGRlY2lkZSBpZiB3ZSBoYXZlIHRvIGRlYWwgd2l0aCBhbiBJUC1iYXNlZAotb3IgYSBuYW1lLWJhc2Ugdmhvc3QuCi0KLTxoND5JUC1iYXNlZCB2aG9zdDwvaDQ+Ci0KLTxQPklmIHRoZSBlbnRyeSB3ZSBmb3VuZCBoYXMgYW4gZW1wdHkgbmFtZSBsaXN0IHRoZW4gd2UgaGF2ZSBmb3VuZCBhbgotSVAtYmFzZWQgdmhvc3QsIG5vIGZ1cnRoZXIgYWN0aW9ucyBhcmUgcGVyZm9ybWVkIGFuZCB0aGUgcmVxdWVzdCBpcwotc2VydmVkIGZyb20gdGhhdCB2aG9zdC4KLQotPGg0Pk5hbWUtYmFzZWQgdmhvc3Q8L2g0PgotCi08cD5JZiB0aGUgZW50cnkgY29ycmVzcG9uZHMgdG8gYSBuYW1lLWJhc2VkIHZob3N0IHRoZSBuYW1lIGxpc3QgY29udGFpbnMKLW9uZSBvciBtb3JlIHZob3N0IHN0cnVjdHVyZXMuIFRoaXMgbGlzdCBjb250YWlucyB0aGUgdmhvc3RzIGluIHRoZSBzYW1lCi1vcmRlciBhcyB0aGUgPGNvZGU+VmlydHVhbEhvc3Q8L2NvZGU+IGRpcmVjdGl2ZXMgYXBwZWFyIGluIHRoZSBjb25maWcKLWZpbGUuCi0KLTxwPlRoZSBmaXJzdCB2aG9zdCBvbiB0aGlzIGxpc3QgKHRoZSBmaXJzdCB2aG9zdCB0aGF0IGFwcGVhcnMgYWZ0ZXIgdGhlCi1jb3JyZXNwb25kaW5nIDxjb2RlPk5hbWVWaXJ0dWFsSG9zdDwvY29kZT4gZGlyZWN0aXZlIGluIHRoZSBjb25maWcgZmlsZSkKLWhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eSBhbmQgY2F0Y2hlcyBhbnkgcmVxdWVzdCB0byBhbiB1bmtub3duIAotc2VydmVyIG5hbWUgb3IgYSByZXF1ZXN0IHdpdGhvdXQgYSA8Y29kZT5Ib3N0OjwvY29kZT4gaGVhZGVyLgotCi08cD5JZiB0aGUgY2xpZW50IHByb3ZpZGVkIGEgPGNvZGU+SG9zdDo8L2NvZGU+IGhlYWRlciB0aGUgbGlzdCBpcwotc2VhcmNoZWQgZm9yIGEgbWF0Y2hpbmcgdmhvc3QgYW5kIHRoZSBmaXJzdCBoaXQgb24gYSA8Y29kZT5TZXJ2ZXJOYW1lPC9jb2RlPgotb3IgPGNvZGU+U2VydmVyQWxpYXM8L2NvZGU+IGlzIHRha2VuIGFuZCB0aGUgcmVxdWVzdCBpcyBzZXJ2ZWQgZnJvbQotdGhhdCB2aG9zdC4gQSA8Y29kZT5Ib3N0OjwvY29kZT4gaGVhZGVyIGNhbiBjb250YWluIGEgcG9ydCBudW1iZXIsIGJ1dAotQXBhY2hlIGFsd2F5cyBtYXRjaGVzIGFnYWluc3QgdGhlIHJlYWwgcG9ydCB0byB3aGljaCB0aGUgY2xpZW50IHNlbnQKLXRoZSByZXF1ZXN0LgotCi08cD5JZiB0aGUgY2xpZW50IHN1Ym1pdHRlZCBhIEhUVFAvMS4wIHJlcXVlc3Qgd2l0aG91dCA8Y29kZT5Ib3N0OjwvY29kZT4KLWhlYWRlciB3ZSBkb24ndCBrbm93IHRvIHdoYXQgc2VydmVyIHRoZSBjbGllbnQgdHJpZWQgdG8gY29ubmVjdCBhbmQKLWFueSBleGlzdGluZyA8Y29kZT5TZXJ2ZXJQYXRoPC9jb2RlPiBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIFVSSQotZnJvbSB0aGUgcmVxdWVzdC4gVGhlIGZpcnN0IG1hdGNoaW5nIHBhdGggb24gdGhlIGxpc3QgaXMgdXNlZCBhbmQgdGhlCi1yZXF1ZXN0IGlzIHNlcnZlZCBmcm9tIHRoYXQgdmhvc3QuCi0KLTxwPklmIG5vIG1hdGNoaW5nIHZob3N0IGNvdWxkIGJlIGZvdW5kIHRoZSByZXF1ZXN0IGlzIHNlcnZlZCBmcm9tIHRoZQotZmlyc3Qgdmhvc3Qgd2l0aCBhIG1hdGNoaW5nIHBvcnQgbnVtYmVyIHRoYXQgaXMgb24gdGhlIGxpc3QgZm9yIHRoZSBJUAotdG8gd2hpY2ggdGhlIGNsaWVudCBjb25uZWN0ZWQgKGFzIGFscmVhZHkgbWVudGlvbmVkIGJlZm9yZSkuCi0KLTxoND5QZXJzaXN0ZW50IGNvbm5lY3Rpb25zPC9oND4KLVRoZSBJUCBsb29rdXAgZGVzY3JpYmVkIGFib3ZlIGlzIG9ubHkgZG9uZSA8ZW0+b25jZTwvZW0+IGZvciBhIHBhcnRpY3VsYXIKLVRDUC9JUCBzZXNzaW9uIHdoaWxlIHRoZSBuYW1lIGxvb2t1cCBpcyBkb25lIG9uIDxlbT5ldmVyeTwvZW0+IHJlcXVlc3QKLWR1cmluZyBhIEtlZXBBbGl2ZS9wZXJzaXN0ZW50IGNvbm5lY3Rpb24uIEluIG90aGVyIHdvcmRzIGEgY2xpZW50IG1heQotcmVxdWVzdCBwYWdlcyBmcm9tIGRpZmZlcmVudCBuYW1lLWJhc2VkIHZob3N0cyBkdXJpbmcgYSBzaW5nbGUKLXBlcnNpc3RlbnQgY29ubmVjdGlvbi4KLQotCi08aDQ+QWJzb2x1dGUgVVJJPC9oND4KLQotPHA+SWYgdGhlIFVSSSBmcm9tIHRoZSByZXF1ZXN0IGlzIGFuIGFic29sdXRlIFVSSSwgYW5kIGl0cyBob3N0bmFtZSBhbmQKLXBvcnQgbWF0Y2ggdGhlIG1haW4gc2VydmVyIG9yIG9uZSBvZiB0aGUgY29uZmlndXJlZCB2aXJ0dWFsIGhvc3RzCi08ZW0+YW5kPC9lbT4gbWF0Y2ggdGhlIGFkZHJlc3MgYW5kIHBvcnQgdG8gd2hpY2ggdGhlIGNsaWVudCBzZW50IHRoZSByZXF1ZXN0LAotdGhlbiB0aGUgc2NoZW1lL2hvc3RuYW1lL3BvcnQgcHJlZml4IGlzIHN0cmlwcGVkIG9mZiBhbmQgdGhlIHJlbWFpbmluZwotcmVsYXRpdmUgVVJJIGlzIHNlcnZlZCBieSB0aGUgY29ycmVzcG9uZGluZyBtYWluIHNlcnZlciBvciB2aXJ0dWFsIGhvc3QuCi1JZiBpdCBkb2VzIG5vdCBtYXRjaCwgdGhlbiB0aGUgVVJJIHJlbWFpbnMgdW50b3VjaGVkIGFuZCB0aGUgcmVxdWVzdCBpcwotdGFrZW4gdG8gYmUgYSBwcm94eSByZXF1ZXN0LgotCi0KLTxoMz5PYnNlcnZhdGlvbnM8L2gzPgotCi08dWw+Ci0KLTxsaT5BIG5hbWUtYmFzZWQgdmhvc3QgY2FuIG5ldmVyIGludGVyZmVyZSB3aXRoIGFuIElQLWJhc2Ugdmhvc3QgYW5kCi0gICAgdmljZSB2ZXJzYS4gSVAtYmFzZWQgdmhvc3RzIGNhbiBvbmx5IGJlIHJlYWNoZWQgdGhyb3VnaCBhbiBJUCBhZGRyZXNzCi0gICAgb2YgaXRzIG93biBhZGRyZXNzIHNldCBhbmQgbmV2ZXIgdGhyb3VnaCBhbnkgb3RoZXIgYWRkcmVzcy4KLSAgICBUaGUgc2FtZSBhcHBsaWVzIHRvIG5hbWUtYmFzZWQgdmhvc3RzLCB0aGV5IGNhbiBvbmx5IGJlIHJlYWNoZWQKLSAgICB0aHJvdWdoIGFuIElQIGFkZHJlc3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRkcmVzcyBzZXQgd2hpY2ggbXVzdAotICAgIGJlIGRlZmluZWQgd2l0aCBhIDxjb2RlPk5hbWVWaXJ0dWFsSG9zdDwvY29kZT4gZGlyZWN0aXZlLgotICAgIDxwPgotCi08bGk+PGNvZGU+U2VydmVyQWxpYXM8L2NvZGU+IGFuZCA8Y29kZT5TZXJ2ZXJQYXRoPC9jb2RlPiBjaGVja3MgYXJlIG5ldmVyCi0gICAgcGVyZm9ybWVkIGZvciBhbiBJUC1iYXNlZCB2aG9zdC4KLSAgICA8cD4KLSAgICAKLTxsaT5UaGUgb3JkZXIgb2YgbmFtZS0vSVAtYmFzZWQsIHRoZSA8c2FtcD5fZGVmYXVsdF88L3NhbXA+Ci0gICAgdmhvc3QgYW5kIHRoZSA8Y29kZT5OYW1lVmlydHVhbEhvc3Q8L2NvZGU+IGRpcmVjdGl2ZSB3aXRoaW4gdGhlIGNvbmZpZwotICAgIGZpbGUgaXMgbm90IGltcG9ydGFudC4gT25seSB0aGUgb3JkZXJpbmcKLSAgICBvZiBuYW1lLWJhc2VkIHZob3N0cyBmb3IgYSBzcGVjaWZpYyBhZGRyZXNzIHNldCBpcyBzaWduaWZpY2FudC4gVGhlIG9uZQotICAgIG5hbWUtYmFzZWQgdmhvc3RzIHRoYXQgY29tZXMgZmlyc3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBoYXMKLSAgICB0aGUgaGlnaGVzdCBwcmlvcml0eSBmb3IgaXRzIGNvcnJlc3BvbmRpbmcgYWRkcmVzcyBzZXQuCi0gICAgPHA+Ci0KLTxsaT5Gb3Igc2VjdXJpdHkgcmVhc29ucyB0aGUgcG9ydCBudW1iZXIgZ2l2ZW4gaW4gYSA8Y29kZT5Ib3N0OjwvY29kZT4KLSAgICBoZWFkZXIgaXMgbmV2ZXIgdXNlZCBkdXJpbmcgdGhlIG1hdGNoaW5nIHByb2Nlc3MuIEFwYWNoZSBhbHdheXMKLSAgICB1c2VzIHRoZSByZWFsIHBvcnQgdG8gd2hpY2ggdGhlIGNsaWVudCBzZW50IHRoZSByZXF1ZXN0LgotICAgIDxwPgotCi08bGk+SWYgYSA8Y29kZT5TZXJ2ZXJQYXRoPC9jb2RlPiBkaXJlY3RpdmUgZXhpc3RzIHdoaWNoIGlzIGEgcHJlZml4IG9mCi0gICAgYW5vdGhlciA8Y29kZT5TZXJ2ZXJQYXRoPC9jb2RlPiBkaXJlY3RpdmUgdGhhdCBhcHBlYXJzIGxhdGVyIGluCi0gICAgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSwgdGhlbiB0aGUgZm9ybWVyIHdpbGwgYWx3YXlzIGJlIG1hdGNoZWQKLSAgICBhbmQgdGhlIGxhdHRlciB3aWxsIG5ldmVyIGJlIG1hdGNoZWQuICAoVGhhdCBpcyBhc3N1bWluZyB0aGF0IG5vCi0gICAgSG9zdCBoZWFkZXIgd2FzIGF2YWlsYWJsZSB0byBkaXNhbWJpZ3VhdGUgdGhlIHR3by4pCi0gICAgPHA+Ci0KLTxsaT5JZiB0d28gSVAtYmFzZWQgdmhvc3RzIGhhdmUgYW4gYWRkcmVzcyBpbiBjb21tb24sIHRoZSB2aG9zdCBhcHBlYXJpbmcKLSAgICBmaXJzdCBpbiB0aGUgY29uZmlnIGZpbGUgaXMgYWx3YXlzIG1hdGNoZWQuICBTdWNoIGEgdGhpbmcgbWlnaHQgaGFwcGVuCi0gICAgaW5hZHZlcnRlbnRseS4gVGhlIHNlcnZlciB3aWxsIGdpdmUgYSB3YXJuaW5nIGluIHRoZSBlcnJvcgotICAgIGxvZ2ZpbGUgd2hlbiBpdCBkZXRlY3RzIHRoaXMuCi0gICAgPHA+Ci0gICAgCi08bGk+QSA8Y29kZT5fZGVmYXVsdF88L2NvZGU+IHZob3N0IGNhdGNoZXMgYSByZXF1ZXN0IG9ubHkgaWYgdGhlcmUgaXMgbm8KLSAgICBvdGhlciB2aG9zdCB3aXRoIGEgbWF0Y2hpbmcgSVAgYWRkcmVzcyA8ZW0+YW5kPC9lbT4gYSBtYXRjaGluZyBwb3J0Ci0gICAgbnVtYmVyIGZvciB0aGUgcmVxdWVzdC4gVGhlIHJlcXVlc3QgaXMgb25seSBjYXRjaGVkIGlmIHRoZSBwb3J0IG51bWJlcgotICAgIHRvIHdoaWNoIHRoZSBjbGllbnQgc2VudCB0aGUgcmVxdWVzdCBtYXRjaGVzIHRoZSBwb3J0IG51bWJlciBvZiB5b3VyCi0gICAgPGNvZGU+X2RlZmF1bHRfPC9jb2RlPiB2aG9zdCB3aGljaCBpcyB5b3VyIHN0YW5kYXJkIDxjb2RlPlBvcnQ8L2NvZGU+Ci0gICAgYnkgZGVmYXVsdC4gQSB3aWxkY2FyZCBwb3J0IGNhbiBiZSBzcGVjaWZpZWQgKGkuZS4KLSAgICA8Y29kZT5fZGVmYXVsdF86KjwvY29kZT4pIHRvIGNhdGNoIHJlcXVlc3RzIHRvIGFueSBhdmFpbGFibGUgcG9ydC4KLSAgICA8cD4KLSAgICAKLTxsaT5UaGUgbWFpbl9zZXJ2ZXIgaXMgb25seSB1c2VkIHRvIHNlcnZlIGEgcmVxdWVzdCBpZiB0aGUgSVAgYWRkcmVzcwotICAgIGFuZCBwb3J0IG51bWJlciB0byB3aGljaCB0aGUgY2xpZW50IGNvbm5lY3RlZCBpcyB1bnNwZWNpZmllZAotICAgIGFuZCBkb2VzIG5vdCBtYXRjaCBhbnkgb3RoZXIgdmhvc3QgKGluY2x1ZGluZyBhIDxjb2RlPl9kZWZhdWx0XzwvY29kZT4KLSAgICB2aG9zdCkuIEluIG90aGVyIHdvcmRzIHRoZSBtYWluX3NlcnZlciBvbmx5IGNhdGNoZXMgYSByZXF1ZXN0IGZvciBhbgotICAgIHVuc3BlY2lmaWVkIGFkZHJlc3MvcG9ydCBjb21iaW5hdGlvbiAodW5sZXNzIHRoZXJlIGlzIGEgPGNvZGU+X2RlZmF1bHRfPC9jb2RlPgotICAgIHZob3N0IHdoaWNoIG1hdGNoZXMgdGhhdCBwb3J0KS4KLSAgICA8cD4KLSAgICAKLTxsaT5BIDxjb2RlPl9kZWZhdWx0XzwvY29kZT4gdmhvc3Qgb3IgdGhlIG1haW5fc2VydmVyIGlzIDxlbT5uZXZlcjwvZW0+Ci0gICAgbWF0Y2hlZCBmb3IgYSByZXF1ZXN0IHdpdGggYW4gdW5rbm93biBvciBtaXNzaW5nIDxjb2RlPkhvc3Q6PC9jb2RlPiBoZWFkZXIKLSAgICBpZiB0aGUgY2xpZW50IGNvbm5lY3RlZCB0byBhbiBhZGRyZXNzIChhbmQgcG9ydCkgd2hpY2ggaXMgdXNlZAotICAgIGZvciBuYW1lLWJhc2VkIHZob3N0cywgZS5nLiBpbiBhIDxjb2RlPk5hbWVWaXJ0dWFsSG9zdDwvY29kZT4gZGlyZWN0aXZlLgotICAgIDxwPgotICAgIAotPGxpPllvdSBzaG91bGQgbmV2ZXIgc3BlY2lmeSBETlMgbmFtZXMgaW4gPGNvZGU+VmlydHVhbEhvc3Q8L2NvZGU+Ci0gICAgZGlyZWN0aXZlcyBiZWNhdXNlIGl0IHdpbGwgZm9yY2UgeW91ciBzZXJ2ZXIgdG8gcmVseSBvbiBETlMgdG8gYm9vdC4KLSAgICBGdXJ0aGVybW9yZSBpdCBwb3NlcyBhIHNlY3VyaXR5IHRocmVhdCBpZiB5b3UgZG8gbm90IGNvbnRyb2wgdGhlCi0gICAgRE5TIGZvciBhbGwgdGhlIGRvbWFpbnMgbGlzdGVkLgotICAgIFRoZXJlJ3MgPGEgaHJlZj0iLi4vZG5zLWNhdmVhdHMuaHRtbCI+bW9yZSBpbmZvcm1hdGlvbjwvYT4KLSAgICBhdmFpbGFibGUgb24gdGhpcyBhbmQgdGhlIG5leHQgdHdvIHRvcGljcy4KLSAgICA8cD4KLQotPGxpPjxjb2RlPlNlcnZlck5hbWU8L2NvZGU+IHNob3VsZCBhbHdheXMgYmUgc2V0IGZvciBlYWNoIHZob3N0LiAgT3RoZXJ3aXNlCi0gICAgQSBETlMgbG9va3VwIGlzIHJlcXVpcmVkIGZvciBlYWNoIHZob3N0LgotICAgIDxwPgotCi08L3VsPgotCi08aDM+VGlwczwvaDM+Ci0KLTxwPkluIGFkZGl0aW9uIHRvIHRoZSB0aXBzIG9uIHRoZSA8YSBocmVmPSIuLi9kbnMtY2F2ZWF0cy5odG1sI3RpcHMiPkROUwotSXNzdWVzPC9hPiBwYWdlLCBoZXJlIGFyZSBzb21lIGZ1cnRoZXIgdGlwczoKLQotPHVsPgotCi08bGk+UGxhY2UgYWxsIG1haW5fc2VydmVyIGRlZmluaXRpb25zIGJlZm9yZSBhbnkgPGNvZGU+VmlydHVhbEhvc3Q8L2NvZGU+Ci0gICAgZGVmaW5pdGlvbnMuIChUaGlzIGlzIHRvIGFpZCB0aGUgcmVhZGFiaWxpdHkgb2YgdGhlIGNvbmZpZ3VyYXRpb24gLS0KLSAgICB0aGUgcG9zdC1jb25maWcgbWVyZ2luZyBwcm9jZXNzIG1ha2VzIGl0IG5vbi1vYnZpb3VzIHRoYXQgZGVmaW5pdGlvbnMgCi0gICAgbWl4ZWQgaW4gYXJvdW5kIHZpcnR1YWwgaG9zdHMgbWlnaHQgYWZmZWN0IGFsbCB2aXJ0dWFsIGhvc3RzLikKLSAgICA8cD4KLQotPGxpPkdyb3VwIGNvcnJlc3BvbmRpbmcgPGNvZGU+TmFtZVZpcnR1YWxIb3N0PC9jb2RlPiBhbmQKLSAgICA8Y29kZT5WaXJ0dWFsSG9zdDwvY29kZT4gZGVmaW5pdGlvbnMgaW4geW91ciBjb25maWd1cmF0aW9uIHRvIGVuc3VyZQotICAgIGJldHRlciByZWFkYWJpbGl0eS4KLSAgICA8cD4KLQotPGxpPkF2b2lkIDxjb2RlPlNlcnZlclBhdGhzPC9jb2RlPiB3aGljaCBhcmUgcHJlZml4ZXMgb2Ygb3RoZXIKLSAgICA8Y29kZT5TZXJ2ZXJQYXRoczwvY29kZT4uICBJZiB5b3UgY2Fubm90IGF2b2lkIHRoaXMgdGhlbiB5b3UgaGF2ZSB0bwotICAgIGVuc3VyZSB0aGF0IHRoZSBsb25nZXIgKG1vcmUgc3BlY2lmaWMpIHByZWZpeCB2aG9zdCBhcHBlYXJzIGVhcmxpZXIgaW4KLSAgICB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHRoYW4gdGhlIHNob3J0ZXIgKGxlc3Mgc3BlY2lmaWMpIHByZWZpeAotICAgICg8RU0+aS5lLjwvRU0+LCAmcXVvdDtTZXJ2ZXJQYXRoIC9hYmMmcXVvdDsgc2hvdWxkIGFwcGVhciBhZnRlcgotICAgICZxdW90O1NlcnZlclBhdGggL2FiYy9kZWYmcXVvdDspLgotICAgIDxwPgotCi08L3VsPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvdmhvc3RzL2V4YW1wbGVzLmh0bWwgYi9kb2NzL21hbnVhbC92aG9zdHMvZXhhbXBsZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUzN2YwNi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC92aG9zdHMvZXhhbXBsZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08aHRtbD48aGVhZD4KLTx0aXRsZT5WaXJ0dWFsSG9zdCBFeGFtcGxlczwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPGgxIEFMSUdOPSJDRU5URVIiPlZpcnR1YWwgSG9zdCBleGFtcGxlcyBmb3IgY29tbW9uIHNldHVwczwvaDE+Ci0KLQotPGgyPkJhc2UgY29uZmlndXJhdGlvbjwvaDI+Ci0KLTx1bD4KLTxsaT48QSBIUkVGPSIjaXAiPklQLWJhc2VkIHZob3N0cyBvbmx5PC9BPgotPGxpPjxBIEhSRUY9IiNuYW1lIj5OYW1lLWJhc2VkIHZob3N0cyBvbmx5PC9BPgotPGxpPjxBIEhSRUY9IiNtaXhlZCI+TWl4ZWQgbmFtZS0vSVAtYmFzZWQgdmhvc3RzPC9BPgotPGxpPjxBIEhSRUY9IiNwb3J0Ij5Qb3J0LWJhc2VkIHZob3N0czwvQT4KLTwvdWw+Ci0KLTxoMj5BZGRpdGlvbmFsIGZlYXR1cmVzPC9oMj4KLQotPHVsPgotPGxpPjxBIEhSRUY9IiNkZWZhdWx0Ij5Vc2luZyA8Y29kZT5fZGVmYXVsdF88L2NvZGU+IHZob3N0czwvQT4KLTxsaT48QSBIUkVGPSIjbWlncmF0ZSI+TWlncmF0aW5nIGEgbmFtZWQtYmFzZWQgdmhvc3QgdG8gYW4gSVAtYmFzZWQgdmhvc3Q8L0E+Ci08bGk+PEEgSFJFRj0iI3NlcnZlcnBhdGgiPlVzaW5nIHRoZSA8Y29kZT5TZXJ2ZXJQYXRoPC9jb2RlPiBkaXJlY3RpdmU8L0E+Ci08L3VsPgotCi08SFI+Ci0KLTxoMz48QSBOQU1FPSJpcCI+SVAtYmFzZWQgdmhvc3RzIG9ubHk8L0E+PC9oMz4KLQotPHVsPgotCi08bGk+PGI+U2V0dXAgMTo8L2I+Ci0gICAgVGhlIHNlcnZlciBtYWNoaW5lIGhhcyB0d28gSVAgYWRkcmVzc2VzICg8c2FtcD4xMTEuMjIuMzMuNDQ8L3NhbXA+Ci0gICAgYW5kIDxzYW1wPjExMS4yMi4zMy41NTwvc2FtcD4pCi0gICAgd2hpY2ggcmVzb2x2ZSB0byB0aGUgbmFtZXMgPHNhbXA+c2VydmVyLmRvbWFpbi50bGQ8L3NhbXA+IGFuZAotICAgIDxzYW1wPnd3dy5vdGhlcmRvbWFpbi50bGQ8L3NhbXA+IHJlc3BlY3RpdmVseS4KLSAgICBUaGUgaG9zdG5hbWUgPHNhbXA+d3d3LmRvbWFpbi50bGQ8L3NhbXA+IGlzIGFuIGFsaWFzIChDTkFNRSkKLSAgICBmb3IgPHNhbXA+c2VydmVyLmRvbWFpbi50bGQ8L3NhbXA+IGFuZCB3aWxsIHJlcHJlc2VudCB0aGUKLSAgICBtYWluIHNlcnZlci4KLSAgICA8cD4KLSAgICA8Yj5TZXJ2ZXIgY29uZmlndXJhdGlvbjo8L2I+Ci0KLQotICAgIDxibG9ja3F1b3RlPjxwcmU+Ci0gICAgLi4uCi0gICAgUG9ydCA4MAotICAgIERvY3VtZW50Um9vdCAvd3d3L2RvbWFpbgotICAgIFNlcnZlck5hbWUgd3d3LmRvbWFpbi50bGQKLQotICAgICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNTUmZ3Q7Ci0gICAgRG9jdW1lbnRSb290IC93d3cvb3RoZXJkb21haW4KLSAgICBTZXJ2ZXJOYW1lIHd3dy5vdGhlcmRvbWFpbi50bGQKLSAgICAuLi4KLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotICAgIDwvcHJlPgotICAgIDxzYW1wPnd3dy5vdGhlcmRvbWFpbi50bGQ8L3NhbXA+IGNhbiBvbmx5IGJlIHJlYWNoZWQgdGhyb3VnaCB0aGUKLSAgICBhZGRyZXNzIDxzYW1wPjExMS4yMi4zMy41NTwvc2FtcD4sIHdoaWxlIDxzYW1wPnd3dy5kb21haW4udGxkPC9zYW1wPgotICAgIGNhbiBvbmx5IGJlIHJlYWNoZWQgdGhyb3VnaCA8c2FtcD4xMTEuMjIuMzMuNDQ8L3NhbXA+Ci0gICAgKHdoaWNoIHJlcHJlc2VudHMgb3VyIG1haW4gc2VydmVyKS4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gICAgPHA+Ci0KLTxsaT48Yj5TZXR1cCAyOjwvYj4KLSAgICBTYW1lIGFzIHNldHVwIDEsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGhhdmUgYSBkZWRpY2F0ZWQgbWFpbiBzZXJ2ZXIuCi0gICAgPHA+Ci0gICAgPGI+U2VydmVyIGNvbmZpZ3VyYXRpb246PC9iPgotCi0gICAgPGJsb2NrcXVvdGU+PHByZT4KLSAgICAuLi4KLSAgICBQb3J0IDgwCi0gICAgU2VydmVyTmFtZSBzZXJ2ZXIuZG9tYWluLnRsZAotICAgIAotICAgICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQmZ3Q7Ci0gICAgRG9jdW1lbnRSb290IC93d3cvZG9tYWluCi0gICAgU2VydmVyTmFtZSB3d3cuZG9tYWluLnRsZAotICAgIC4uLgotICAgICZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci0KLSAgICAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjU1Jmd0OwotICAgIERvY3VtZW50Um9vdCAvd3d3L290aGVyZG9tYWluCi0gICAgU2VydmVyTmFtZSB3d3cub3RoZXJkb21haW4udGxkCi0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLSAgICA8L3ByZT4KLSAgICBUaGUgbWFpbiBzZXJ2ZXIgY2FuIG5ldmVyIGNhdGNoIGEgcmVxdWVzdCwgYmVjYXVzZSBhbGwgSVAgYWRkcmVzcwotICAgIG9mIG91ciBtYWNoaW5lIGFyZSBpbiB1c2UgZm9yIElQLWJhc2VkIHZpcnR1YWwgaG9zdHMKLSAgICAob25seSA8c2FtcD5sb2NhbGhvc3Q8L3NhbXA+IHJlcXVlc3RzIGNhbiBoaXQgdGhlIG1haW4gc2VydmVyKS4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gICAgPHA+Ci0gICAgCi08bGk+PGI+U2V0dXAgMzo8L2I+Ci0gICAgVGhlIHNlcnZlciBtYWNoaW5lIGhhcyB0d28gSVAgYWRkcmVzc2VzICg8c2FtcD4xMTEuMjIuMzMuNDQ8L3NhbXA+Ci0gICAgYW5kIDxzYW1wPjExMS4yMi4zMy41NTwvc2FtcD4pCi0gICAgd2hpY2ggcmVzb2x2ZSB0byB0aGUgbmFtZXMgPHNhbXA+c2VydmVyLmRvbWFpbi50bGQ8L3NhbXA+IGFuZAotICAgIDxzYW1wPnd3dy1jYWNoZS5kb21haW4udGxkPC9zYW1wPiByZXNwZWN0aXZlbHkuCi0gICAgVGhlIGhvc3RuYW1lIDxzYW1wPnd3dy5kb21haW4udGxkPC9zYW1wPiBpcyBhbiBhbGlhcyAoQ05BTUUpCi0gICAgZm9yIDxzYW1wPnNlcnZlci5kb21haW4udGxkPC9zYW1wPiBhbmQgd2lsbCByZXByZXNlbnQgdGhlCi0gICAgbWFpbiBzZXJ2ZXIuCi0gICAgPHNhbXA+d3d3LWNhY2hlLmRvbWFpbi50bGQ8L3NhbXA+IHdpbGwgYmVjb21lIG91ciBwcm94eS1jYWNoZSAKLSAgICBsaXN0ZW5pbmcgb24gcG9ydCA4MDgwLCB3aGlsZSB0aGUgd2ViIHNlcnZlciBpdHNlbGYgdXNlcyB0aGUgZGVmYXVsdAotICAgIHBvcnQgODAuCi0gICAgPHA+Ci0gICAgPGI+U2VydmVyIGNvbmZpZ3VyYXRpb246PC9iPgotCi0gICAgPGJsb2NrcXVvdGU+PHByZT4KLSAgICAuLi4KLSAgICBQb3J0IDgwCi0gICAgTGlzdGVuIDExMS4yMi4zMy40NDo4MAotICAgIExpc3RlbiAxMTEuMjIuMzMuNTU6ODA4MAotICAgIFNlcnZlck5hbWUgc2VydmVyLmRvbWFpbi50bGQKLSAgICAKLSAgICAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0OjgwJmd0OwotICAgIERvY3VtZW50Um9vdCAvd3d3L2RvbWFpbgotICAgIFNlcnZlck5hbWUgd3d3LmRvbWFpbi50bGQKLSAgICAuLi4KLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotCi0gICAgJmx0O1ZpcnR1YWxIb3N0IDExMS4yMi4zMy41NTo4MDgwJmd0OwotICAgIFNlcnZlck5hbWUgd3d3LWNhY2hlLmRvbWFpbi50bGQKLSAgICAuLi4KLSAgICAgICZsdDtEaXJlY3RvcnkgcHJveHk6Jmd0OwotICAgICAgb3JkZXIgZGVueSxhbGxvdwotICAgICAgZGVueSBmcm9tIGFsbAotICAgICAgYWxsb3cgZnJvbSAxMTEuMjIuMzMKLSAgICAgICZsdDsvRGlyZWN0b3J5Jmd0OwotICAgICZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci0gICAgPC9wcmU+Ci0gICAgVGhlIG1haW4gc2VydmVyIGNhbiBuZXZlciBjYXRjaCBhIHJlcXVlc3QsIGJlY2F1c2UgYWxsIElQIGFkZHJlc3NzCi0gICAgKGFwYXJ0IGZyb20gPHNhbXA+bG9jYWxob3N0PC9zYW1wPikgb2Ygb3VyIG1hY2hpbmUgYXJlIGluIHVzZSBmb3IgSVAtYmFzZWQKLSAgICB2aXJ0dWFsIGhvc3RzLiBUaGUgd2ViIHNlcnZlciBjYW4gb25seSBiZSByZWFjaGVkIG9uIHRoZSBmaXJzdCBhZGRyZXNzCi0gICAgdGhyb3VnaCBwb3J0IDgwIGFuZCB0aGUgcHJveHkgb25seSBvbiB0aGUgc2Vjb25kIGFkZHJlc3MgdGhyb3VnaCBwb3J0IDgwODAuCi0gICAgPC9ibG9ja3F1b3RlPgotPC91bD4KLTxIUj4KLQotPGgzPjxBIE5BTUU9Im5hbWUiPk5hbWUtYmFzZWQgdmhvc3RzIG9ubHk8L0E+PC9oMz4KLQotPHVsPgotCi08bGk+PGI+U2V0dXAgMTo8L2I+Ci0gICAgVGhlIHNlcnZlciBtYWNoaW5lIGhhcyBvbmUgSVAgYWRkcmVzcyAoPHNhbXA+MTExLjIyLjMzLjQ0PC9zYW1wPikKLSAgICB3aGljaCByZXNvbHZlcyB0byB0aGUgbmFtZSA8c2FtcD5zZXJ2ZXIuZG9tYWluLnRsZDwvc2FtcD4uCi0gICAgVGhlcmUgYXJlIHR3byBhbGlhc2VzIChDTkFNRXMpIDxzYW1wPnd3dy5kb21haW4udGxkPC9zYW1wPiBhbmQKLSAgICA8c2FtcD53d3cuc3ViLmRvbWFpbi50bGQ8L3NhbXA+IGZvciB0aGUgYWRkcmVzcyA8c2FtcD4xMTEuMjIuMzMuNDQ8L3NhbXA+LgotICAgIDxwPgotICAgIDxiPlNlcnZlciBjb25maWd1cmF0aW9uOjwvYj4KLQotICAgIDxibG9ja3F1b3RlPjxwcmU+Ci0gICAgLi4uCi0gICAgUG9ydCA4MAotICAgIFNlcnZlck5hbWUgc2VydmVyLmRvbWFpbi50bGQKLQotICAgIE5hbWVWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQgCi0KLSAgICAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0Jmd0OwotICAgIERvY3VtZW50Um9vdCAvd3d3L2RvbWFpbgotICAgIFNlcnZlck5hbWUgd3d3LmRvbWFpbi50bGQKLSAgICAuLi4KLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotICAgIAotICAgICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQmZ3Q7Ci0gICAgRG9jdW1lbnRSb290IC93d3cvc3ViZG9tYWluCi0gICAgU2VydmVyTmFtZSB3d3cuc3ViLmRvbWFpbi50bGQKLSAgICAuLi4KLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OyAKLSAgICA8L3ByZT4KLSAgICBBcGFydCBmcm9tIDxzYW1wPmxvY2FsaG9zdDwvc2FtcD4gdGhlcmUgYXJlIG5vIHVuc3BlY2lmaWVkCi0gICAgYWRkcmVzc2VzL3BvcnRzLCB0aGVyZWZvcmUgdGhlIG1haW4gc2VydmVyIG9ubHkgc2VydmVzCi0gICAgPHNhbXA+bG9jYWxob3N0PC9zYW1wPiByZXF1ZXN0cy4gRHVlIHRvIHRoZSBmYWN0Ci0gICAgdGhhdCA8c2FtcD53d3cuZG9tYWluLnRsZDwvc2FtcD4gaGFzIHRoZSBoaWdoZXN0IHByaW9yaXR5Ci0gICAgaXQgY2FuIGJlIHNlZW4gYXMgdGhlIDxjaXRlPmRlZmF1bHQ8L2NpdGU+IG9yCi0gICAgPGNpdGU+cHJpbWFyeTwvY2l0ZT4gc2VydmVyLgotICAgIDwvYmxvY2txdW90ZT4KLSAgICA8cD4KLSAgIAotPGxpPjxiPlNldHVwIDI6PC9iPgotICAgIFRoZSBzZXJ2ZXIgbWFjaGluZSBoYXMgdHdvIElQIGFkZHJlc3NlcyAoPHNhbXA+MTExLjIyLjMzLjQ0PC9zYW1wPgotICAgIGFuZCA8c2FtcD4xMTEuMjIuMzMuNTU8L3NhbXA+KQotICAgIHdoaWNoIHJlc29sdmUgdG8gdGhlIG5hbWVzIDxzYW1wPnNlcnZlcjEuZG9tYWluLnRsZDwvc2FtcD4gYW5kCi0gICAgPHNhbXA+c2VydmVyMi5kb21haW4udGxkPC9zYW1wPiByZXNwZWN0aXZlbHkuCi0gICAgVGhlIGFsaWFzIDxzYW1wPnd3dy5kb21haW4udGxkPC9zYW1wPiBzaG91bGQgYmUgdXNlZCBmb3IgdGhlCi0gICAgbWFpbiBzZXJ2ZXIgd2hpY2ggc2hvdWxkIGFsc28gY2F0Y2ggYW55IHVuc3BlY2lmaWVkIGFkZHJlc3Nlcy4gCi0gICAgV2Ugd2FudCB0byB1c2UgYSB2aXJ0dWFsIGhvc3QgZm9yIHRoZSBhbGlhcwotICAgIDxzYW1wPnd3dy5vdGhlcmRvbWFpbi50bGQ8L3NhbXA+IGFuZCBvbmUgdmlydHVhbCBob3N0IHNob3VsZAotICAgIGNhdGNoIGFueSByZXF1ZXN0IHRvIGhvc3RuYW1lcyBvZiB0aGUgZm9ybQotICAgIDxzYW1wPiouc3ViLmRvbWFpbi50bGQ8L3NhbXA+IHdpdGggPHNhbXA+d3d3LnN1Yi5kb21haW4udGxkPC9zYW1wPgotICAgIGFzIGl0cyBzZXJ2ZXIgbmFtZS4gVGhlIGFkZHJlc3MgPHNhbXA+MTExLjIyLjMzLjU1PC9zYW1wPiBzaG91bGQgYmUKLSAgICB1c2VkIGZvciB0aGUgdmlydHVhbCBob3N0cy4KLSAgICA8cD4KLSAgICA8Yj5TZXJ2ZXIgY29uZmlndXJhdGlvbjo8L2I+Ci0KLSAgICA8YmxvY2txdW90ZT48cHJlPgotICAgIC4uLgotICAgIFBvcnQgODAKLSAgICBTZXJ2ZXJOYW1lIHd3dy5kb21haW4udGxkCi0gICAgRG9jdW1lbnRSb290IC93d3cvZG9tYWluCi0KLSAgICBOYW1lVmlydHVhbEhvc3QgMTExLjIyLjMzLjU1Ci0KLSAgICAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjU1Jmd0OwotICAgIERvY3VtZW50Um9vdCAvd3d3L290aGVyZG9tYWluCi0gICAgU2VydmVyTmFtZSB3d3cub3RoZXJkb21haW4udGxkCi0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLSAgIAotICAgICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNTUmZ3Q7Ci0gICAgRG9jdW1lbnRSb290IC93d3cvc3ViZG9tYWluCi0gICAgU2VydmVyTmFtZSB3d3cuc3ViLmRvbWFpbi50bGQKLSAgICBTZXJ2ZXJBbGlhcyAqLnN1Yi5kb21haW4udGxkCi0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsgCi0gICAgPC9wcmU+Ci0gICAgQW55IHJlcXVlc3QgdG8gYW4gYWRkcmVzcyBvdGhlciB0aGFuIDxzYW1wPjExMS4yMi4zMy41NTwvc2FtcD4KLSAgICB3aWxsIGJlIHNlcnZlZCBmcm9tIHRoZSBtYWluIHNlcnZlci4gQSByZXF1ZXN0IHRvCi0gICAgPHNhbXA+MTExLjIyLjMzLjU1PC9zYW1wPiB3aXRoIGFuIHVua25vd24gb3Igbm8gPGNvZGU+SG9zdDo8L2NvZGU+Ci0gICAgaGVhZGVyIHdpbGwgYmUgc2VydmVkIGZyb20gPHNhbXA+d3d3Lm90aGVyZG9tYWluLnRsZDwvc2FtcD4uCi0gICAgPC9ibG9ja3F1b3RlPgotPC91bD4KLQotPEhSPgotCi08aDM+PEEgTkFNRT0ibWl4ZWQiPk1peGVkIG5hbWUtL0lQLWJhc2VkIHZob3N0czwvQT48L2gzPgotCi08VWw+Ci0KLTxsaT48Yj5TZXR1cDo8L2I+Ci0gICAgVGhlIHNlcnZlciBtYWNoaW5lIGhhcyB0aHJlZSBJUCBhZGRyZXNzZXMgKDxzYW1wPjExMS4yMi4zMy40NDwvc2FtcD4sCi0gICAgPHNhbXA+MTExLjIyLjMzLjU1PC9zYW1wPiBhbmQgPHNhbXA+MTExLjIyLjMzLjY2PC9zYW1wPikKLSAgICB3aGljaCByZXNvbHZlIHRvIHRoZSBuYW1lcyA8c2FtcD5zZXJ2ZXIuZG9tYWluLnRsZDwvc2FtcD4sCi0gICAgPHNhbXA+d3d3Lm90aGVyZG9tYWluMS50bGQ8L3NhbXA+IGFuZCA8c2FtcD53d3cub3RoZXJkb21haW4yLnRsZDwvc2FtcD4KLSAgICByZXNwZWN0aXZlbHkuCi0gICAgVGhlIGFkZHJlc3MgPHNhbXA+MTExLjIyLjMzLjQ0PC9zYW1wPiBzaG91bGQgd2UgdXNlZCBmb3IgYSBjb3VwbGUKLSAgICBvZiBuYW1lLWJhc2VkIHZob3N0cyBhbmQgdGhlIG90aGVyIGFkZHJlc3NlcyBmb3IgSVAtYmFzZWQgdmhvc3RzLiAKLSAgICA8cD4KLSAgICA8Yj5TZXJ2ZXIgY29uZmlndXJhdGlvbjo8L2I+Ci0KLSAgICA8YmxvY2txdW90ZT48cHJlPgotICAgIC4uLgotICAgIFBvcnQgODAKLSAgICBTZXJ2ZXJOYW1lIHNlcnZlci5kb21haW4udGxkCi0KLSAgICBOYW1lVmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0Ci0KLSAgICAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0Jmd0OwotICAgIERvY3VtZW50Um9vdCAvd3d3L2RvbWFpbgotICAgIFNlcnZlck5hbWUgd3d3LmRvbWFpbi50bGQKLSAgICAuLi4KLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotICAgCi0gICAgJmx0O1ZpcnR1YWxIb3N0IDExMS4yMi4zMy40NCZndDsKLSAgICBEb2N1bWVudFJvb3QgL3d3dy9zdWJkb21haW4xCi0gICAgU2VydmVyTmFtZSB3d3cuc3ViMS5kb21haW4udGxkCi0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsgCi0gICAgCi0gICAgJmx0O1ZpcnR1YWxIb3N0IDExMS4yMi4zMy40NCZndDsKLSAgICBEb2N1bWVudFJvb3QgL3d3dy9zdWJkb21haW4yCi0gICAgU2VydmVyTmFtZSB3d3cuc3ViMi5kb21haW4udGxkCi0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsgCi0gCi0gICAgJmx0O1ZpcnR1YWxIb3N0IDExMS4yMi4zMy41NSZndDsKLSAgICBEb2N1bWVudFJvb3QgL3d3dy9vdGhlcmRvbWFpbjEKLSAgICBTZXJ2ZXJOYW1lIHd3dy5vdGhlcmRvbWFpbjEudGxkCi0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsgCi0gICAgCi0gICAgJmx0O1ZpcnR1YWxIb3N0IDExMS4yMi4zMy42NiZndDsKLSAgICBEb2N1bWVudFJvb3QgL3d3dy9vdGhlcmRvbWFpbjIKLSAgICBTZXJ2ZXJOYW1lIHd3dy5vdGhlcmRvbWFpbjIudGxkCi0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsgICAgIAotICAgIDwvcHJlPjwvYmxvY2txdW90ZT4KLQotPC91bD4KLQotPEhSPgotCi08aDM+PEEgTkFNRT0icG9ydCI+UG9ydC1iYXNlZCB2aG9zdHM8L0E+PC9oMz4KLQotPHVsPgotCi08bGk+PGI+U2V0dXA6PC9iPgotICAgIFRoZSBzZXJ2ZXIgbWFjaGluZSBoYXMgb25lIElQIGFkZHJlc3MgKDxzYW1wPjExMS4yMi4zMy40NDwvc2FtcD4pCi0gICAgd2hpY2ggcmVzb2x2ZXMgdG8gdGhlIG5hbWUgPHNhbXA+d3d3LmRvbWFpbi50bGQ8L3NhbXA+LgotICAgIElmIHdlIGRvbid0IGhhdmUgdGhlIG9wdGlvbiB0byBnZXQgYW5vdGhlciBhZGRyZXNzIG9yIGFsaWFzCi0gICAgZm9yIG91ciBzZXJ2ZXIgd2UgY2FuIHVzZSBwb3J0LWJhc2VkIHZob3N0cyBpZiB3ZSBuZWVkCi0gICAgYSB2aXJ0dWFsIGhvc3Qgd2l0aCBhIGRpZmZlcmVudCBjb25maWd1cmF0aW9uLgotICAgIDxwPgotICAgIDxiPlNlcnZlciBjb25maWd1cmF0aW9uOjwvYj4KLQotICAgIDxibG9ja3F1b3RlPjxwcmU+Ci0gICAgLi4uCi0gICAgTGlzdGVuIDgwCi0gICAgTGlzdGVuIDgwODAKLSAgICBTZXJ2ZXJOYW1lIHd3dy5kb21haW4udGxkCi0gICAgRG9jdW1lbnRSb290IC93d3cvZG9tYWluCi0KLSAgICAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0OjgwODAmZ3Q7Ci0gICAgRG9jdW1lbnRSb290IC93d3cvZG9tYWluMgotICAgIC4uLgotICAgICZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci0gICAgPC9wcmU+Ci0gICAgQSByZXF1ZXN0IHRvIDxzYW1wPnd3dy5kb21haW4udGxkPC9zYW1wPiBvbiBwb3J0IDgwIGlzIHNlcnZlZAotICAgIGZyb20gdGhlIG1haW4gc2VydmVyIGFuZCBhIHJlcXVlc3QgdG8gcG9ydCA4MDgwIGlzIHNlcnZlZCBmcm9tCi0gICAgdGhlIHZpcnR1YWwgaG9zdC4KLSAgICA8L2Jsb2NrcXVvdGU+Ci08L3VsPiAKLSAgIAotPEhSPgotCi08aDM+PEEgTkFNRT0iZGVmYXVsdCI+VXNpbmcgPGNvZGU+X2RlZmF1bHRfPC9jb2RlPiB2aG9zdHM8L0E+PC9oMz4KLQotPHVsPgotCi08bGk+PGI+U2V0dXAgMTo8L2I+IAotICAgIENhdGNoaW5nIDxlbT5ldmVyeTwvZW0+IHJlcXVlc3QgdG8gYW55IHVuc3BlY2lmaWVkIElQIGFkZHJlc3MgYW5kIHBvcnQsCi0gICAgaS5lLiBhbiBhZGRyZXNzL3BvcnQgY29tYmluYXRpb24gdGhhdCBpcyBub3QgdXNlZCBmb3IgYW55IG90aGVyCi0gICAgdmlydHVhbCBob3N0LgotICAgIDxwPgotICAgIDxiPlNlcnZlciBjb25maWd1cmF0aW9uOjwvYj4KLQotICAgIDxibG9ja3F1b3RlPjxwcmU+Ci0gICAgLi4uCi0gICAgJmx0O1ZpcnR1YWxIb3N0IF9kZWZhdWx0XzoqJmd0OwotICAgIERvY3VtZW50Um9vdCAvd3d3L2RlZmF1bHQKLSAgICAuLi4KLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotICAgIDwvcHJlPgotICAgIFVzaW5nIHN1Y2ggYSBkZWZhdWx0IHZob3N0IHdpdGggYSB3aWxkY2FyZCBwb3J0IGVmZmVjdGl2ZWx5Ci0gICAgcHJldmVudHMgYW55IHJlcXVlc3QgZ29pbmcgdG8gdGhlIG1haW4gc2VydmVyLjxicj4KLSAgICBBIGRlZmF1bHQgdmhvc3QgbmV2ZXIgc2VydmVzIGEgcmVxdWVzdCB0aGF0IHdhcyBzZW50IHRvIGFuCi0gICAgYWRkcmVzcy9wb3J0IHRoYXQgaXMgdXNlZCBmb3IgbmFtZS1iYXNlZCB2aG9zdHMuIElmIHRoZSByZXF1ZXN0Ci0gICAgY29udGFpbmVkIGFuIHVua25vd24gb3Igbm8gPGNvZGU+SG9zdDo8L2NvZGU+IGhlYWRlciBpdCBpcwotICAgIGFsd2F5cyBzZXJ2ZWQgZnJvbSB0aGUgcHJpbWFyeSBuYW1lLWJhc2VkIHZob3N0ICh0aGUKLSAgICB2aG9zdCBmb3IgdGhhdCBhZGRyZXNzL3BvcnQgYXBwZWFyaW5nIGZpcnN0IGluIHRoZSBjb25maWd1cmF0aW9uCi0gICAgZmlsZSkuPGJyPgotICAgIFlvdSBjYW4gdXNlCi0gICAgPEEgSFJFRj0iLi4vbW9kL21vZF9hbGlhcy5odG1sI2FsaWFzbWF0Y2giPjxjb2RlPkFsaWFzTWF0Y2g8L2NvZGU+PC9BPgotICAgIG9yCi0gICAgPEEgSFJFRj0iLi4vbW9kL21vZF9yZXdyaXRlLmh0bWwjUmV3cml0ZVJ1bGUiPjxjb2RlPlJld3JpdGVSdWxlPC9jb2RlPjwvQT4KLSAgICB0byByZXdyaXRlIGFueSByZXF1ZXN0IHRvIGEgc2luZ2xlIGluZm9ybWF0aW9uIHBhZ2UgKG9yIHNjcmlwdCkuCi0gICAgPC9ibG9ja3F1b3RlPgotICAgIDxwPgotICAgIAotPGxpPjxiPlNldHVwIDI6PC9iPiAKLSAgICBTYW1lIGFzIHNldHVwIDEsIGJ1dCB0aGUgc2VydmVyIGxpc3RlbnMgb24gc2V2ZXJhbCBwb3J0cyBhbmQKLSAgICB3ZSB3YW50IHRvIHVzZSBhIHNlY29uZCA8Y29kZT5fZGVmYXVsdF88L2NvZGU+IHZob3N0IGZvciBwb3J0IDgwLgotICAgIDxwPgotICAgIDxiPlNlcnZlciBjb25maWd1cmF0aW9uOjwvYj4KLQotICAgIDxibG9ja3F1b3RlPjxwcmU+Ci0gICAgLi4uCi0gICAgJmx0O1ZpcnR1YWxIb3N0IF9kZWZhdWx0Xzo4MCZndDsKLSAgICBEb2N1bWVudFJvb3QgL3d3dy9kZWZhdWx0ODAKLSAgICAuLi4KLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotICAgIAotICAgICZsdDtWaXJ0dWFsSG9zdCBfZGVmYXVsdF86KiZndDsKLSAgICBEb2N1bWVudFJvb3QgL3d3dy9kZWZhdWx0Ci0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsgICAgCi0gICAgPC9wcmU+Ci0gICAgVGhlIGRlZmF1bHQgdmhvc3QgZm9yIHBvcnQgODAgKHdoaWNoIDxlbT5tdXN0PC9lbT4gYXBwZWFyIGJlZm9yZQotICAgIGFueSBkZWZhdWx0IHZob3N0IHdpdGggYSB3aWxkY2FyZCBwb3J0KSBjYXRjaGVzIGFsbCByZXF1ZXN0cyB0aGF0Ci0gICAgd2VyZSBzZW50IHRvIGFuIHVuc3BlY2lmaWVkIElQIGFkZHJlc3MuIFRoZSBtYWluIHNlcnZlciBpcwotICAgIG5ldmVyIHVzZWQgdG8gc2VydmUgYSByZXF1ZXN0LgotICAgIDwvYmxvY2txdW90ZT4gICAgCi0gICAgPHA+Ci0gICAgCi08bGk+PGI+U2V0dXAgMzo8L2I+IAotICAgIFdlIHdhbnQgdG8gaGF2ZSBhIGRlZmF1bHQgdmhvc3QgZm9yIHBvcnQgODAsIGJ1dCBubyBvdGhlciBkZWZhdWx0IHZob3N0cy4KLSAgICA8cD4KLSAgICA8Yj5TZXJ2ZXIgY29uZmlndXJhdGlvbjo8L2I+Ci0KLSAgICA8YmxvY2txdW90ZT48cHJlPgotICAgIC4uLgotICAgICZsdDtWaXJ0dWFsSG9zdCBfZGVmYXVsdF86ODAmZ3Q7Ci0gICAgRG9jdW1lbnRSb290IC93d3cvZGVmYXVsdAotICAgIC4uLgotICAgICZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci0gICAgPC9wcmU+Ci0gICAgQSByZXF1ZXN0IHRvIGFuIHVuc3BlY2lmaWVkIGFkZHJlc3Mgb24gcG9ydCA4MCBpcyBzZXJ2ZWQgZnJvbSB0aGUKLSAgICBkZWZhdWx0IHZob3N0IGFueSBvdGhlciByZXF1ZXN0IHRvIGFuIHVuc3BlY2lmaWVkIGFkZHJlc3MgYW5kIHBvcnQKLSAgICBpcyBzZXJ2ZWQgZnJvbSB0aGUgbWFpbiBzZXJ2ZXIuCi0gICAgPC9ibG9ja3F1b3RlPgotCi08L3VsPgotCi08SFI+Ci0KLTxoMz48QSBOQU1FPSJtaWdyYXRlIj5NaWdyYXRpbmcgYSBuYW1lLWJhc2VkIHZob3N0IHRvIGFuIElQLWJhc2VkIHZob3N0PC9BPjwvaDM+Ci0KLTx1bD4KLQotPGxpPjxiPlNldHVwOjwvYj4KLSAgICBUaGUgbmFtZS1iYXNlZCB2aG9zdCB3aXRoIHRoZSBob3N0bmFtZQotICAgIDxzYW1wPnd3dy5vdGhlcmRvbWFpbi50bGQ8L3NhbXA+IChmcm9tIG91ciA8YSBocmVmPSIjbmFtZSI+bmFtZS1iYXNlZDwvQT4KLSAgICBleGFtcGxlLCBzZXR1cCAyKSBzaG91bGQgZ2V0IGl0cyBvd24gSVAgYWRkcmVzcy4KLSAgICBUbyBhdm9pZCBwcm9ibGVtcyB3aXRoIG5hbWUgc2VydmVycyBvciBwcm94aWVzIHdobyBjYWNoZWQgdGhlIG9sZAotICAgIElQIGFkZHJlc3MgZm9yIHRoZSBuYW1lLWJhc2VkIHZob3N0IHdlIHdhbnQgdG8gcHJvdmlkZSBib3RoIHZhcmlhbnRzCi0gICAgZHVyaW5nIGEgbWlncmF0aW9uIHBoYXNlLjxicj4KLSAgICBUaGUgc29sdXRpb24gaXMgZWFzeSwgYmVjYXVzZSB3ZSBjYW4gc2ltcGx5IGFkZCB0aGUgbmV3IElQIGFkZHJlc3MKLSAgICAoPHNhbXA+MTExLjIyLjMzLjY2PC9zYW1wPikgdG8gdGhlIDxjb2RlPlZpcnR1YWxIb3N0PC9jb2RlPiBkaXJlY3RpdmUuCi0gICAgPHA+Ci0gICAgPGI+U2VydmVyIGNvbmZpZ3VyYXRpb246PC9iPgotCi0gICAgPGJsb2NrcXVvdGU+PHByZT4KLSAgICAuLi4KLSAgICBQb3J0IDgwCi0gICAgU2VydmVyTmFtZSB3d3cuZG9tYWluLnRsZAotICAgIERvY3VtZW50Um9vdCAvd3d3L2RvbWFpbgotCi0gICAgTmFtZVZpcnR1YWxIb3N0IDExMS4yMi4zMy41NQotCi0gICAgJmx0O1ZpcnR1YWxIb3N0IDExMS4yMi4zMy41NSAxMTEuMjIuMzMuNjYmZ3Q7Ci0gICAgRG9jdW1lbnRSb290IC93d3cvb3RoZXJkb21haW4KLSAgICBTZXJ2ZXJOYW1lIHd3dy5vdGhlcmRvbWFpbi50bGQKLSAgICAuLi4KLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotICAgCi0gICAgJmx0O1ZpcnR1YWxIb3N0IDExMS4yMi4zMy41NSZndDsKLSAgICBEb2N1bWVudFJvb3QgL3d3dy9zdWJkb21haW4KLSAgICBTZXJ2ZXJOYW1lIHd3dy5zdWIuZG9tYWluLnRsZAotICAgIFNlcnZlckFsaWFzICouc3ViLmRvbWFpbi50bGQKLSAgICAuLi4KLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotICAgIDwvcHJlPgotICAgIFRoZSB2aG9zdCBjYW4gbm93IGJlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIG5ldyBhZGRyZXNzIChhcyBhbiBJUC1iYXNlZAotICAgIHZob3N0KSBhbmQgdGhyb3VnaCB0aGUgb2xkIGFkZHJlc3MgKGFzIGEgbmFtZS1iYXNlZCB2aG9zdCkuCi0gICAgPC9ibG9ja3F1b3RlPgotCi08L3VsPgotCi08SFI+Ci0KLTxoMz48QSBOQU1FPSJzZXJ2ZXJwYXRoIj5Vc2luZyB0aGUgPGNvZGU+U2VydmVyUGF0aDwvY29kZT4gZGlyZWN0aXZlPC9BPjwvaDM+Ci0KLTx1bD4KLQotPGxpPjxiPlNldHVwOjwvYj4KLSAgICBXZSBoYXZlIGEgc2VydmVyIHdpdGggdHdvIG5hbWUtYmFzZWQgdmhvc3RzLiBJbiBvcmRlciB0byBtYXRjaCB0aGUgY29ycmVjdAotICAgIHZpcnR1YWwgaG9zdCBhIGNsaWVudCBtdXN0IHNlbmQgdGhlIGNvcnJlY3QgPGNvZGU+SG9zdDo8L2NvZGU+IGhlYWRlci4KLSAgICBPbGQgSFRUUC8xLjAgY2xpZW50cyBkbyBub3Qgc2VuZCBzdWNoIGEgaGVhZGVyIGFuZCBBcGFjaGUgaGFzIG5vIGNsdWUKLSAgICB3aGF0IHZob3N0IHRoZSBjbGllbnQgdHJpZWQgdG8gcmVhY2ggKGFuZCBzZXJ2ZXMgdGhlIHJlcXVlc3QgZnJvbQotICAgIHRoZSBwcmltYXJ5IHZob3N0KS4gVG8gcHJvdmlkZSBhcyBtdWNoIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLSAgICBhcyBwb3NzaWJsZSB3ZSBjcmVhdGUgYSBwcmltYXJ5IHZob3N0IHdoaWNoIHJldHVybnMgYSBzaW5nbGUgcGFnZQotICAgIGNvbnRhaW5pbmcgbGlua3Mgd2l0aCBhbiBVUkwgcHJlZml4IHRvIHRoZSBuYW1lLWJhc2VkIHZpcnR1YWwgaG9zdHMuCi0gICAgPHA+Ci0gICAgPGI+U2VydmVyIGNvbmZpZ3VyYXRpb246PC9iPgotCi0gICAgPGJsb2NrcXVvdGU+PHByZT4KLSAgICAuLi4KLSAgICBOYW1lVmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0Ci0KLSAgICAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0Jmd0OwotICAgICMgcHJpbWFyeSB2aG9zdAotICAgIERvY3VtZW50Um9vdCAvd3d3L3N1YmRvbWFpbgotICAgIFJld3JpdGVFbmdpbmUgT24KLSAgICBSZXdyaXRlUnVsZSBeLy4qIC93d3cvc3ViZG9tYWluL2luZGV4Lmh0bWwKLSAgICAuLi4KLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotCi0gICAgJmx0O1ZpcnR1YWxIb3N0IDExMS4yMi4zMy40NCZndDsKLSAgICBEb2N1bWVudFJvb3QgL3d3dy9zdWJkb21haW4vc3ViMQotICAgIFNlcnZlck5hbWUgd3d3LnN1YjEuZG9tYWluLnRsZAotICAgIFNlcnZlclBhdGggL3N1YjEvCi0gICAgUmV3cml0ZUVuZ2luZSBPbgotICAgIFJld3JpdGVSdWxlIF4oL3N1YjEvLiopIC93d3cvc3ViZG9tYWluJDEgCi0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLQotICAgICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQmZ3Q7Ci0gICAgRG9jdW1lbnRSb290IC93d3cvc3ViZG9tYWluL3N1YjIKLSAgICBTZXJ2ZXJOYW1lIHd3dy5zdWIyLmRvbWFpbi50bGQKLSAgICBTZXJ2ZXJQYXRoIC9zdWIyLwotICAgIFJld3JpdGVFbmdpbmUgT24KLSAgICBSZXdyaXRlUnVsZSBeKC9zdWIyLy4qKSAvd3d3L3N1YmRvbWFpbiQxIAotICAgIC4uLgotICAgICZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci0gICAgPC9wcmU+Ci0gICAgRHVlIHRvIHRoZSA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcnBhdGgiPjxjb2RlPlNlcnZlclBhdGg8L2NvZGU+PC9BPgotICAgIGRpcmVjdGl2ZSBhIHJlcXVlc3QgdG8gdGhlCi0gICAgVVJMIDxzYW1wPmh0dHA6Ly93d3cuc3ViMS5kb21haW4udGxkL3N1YjEvPC9zYW1wPiBpcyA8ZW0+YWx3YXlzPC9lbT4KLSAgICBzZXJ2ZWQgZnJvbSB0aGUgc3ViMS12aG9zdC4gPGJyPgotICAgIEEgcmVxdWVzdCB0byB0aGUgVVJMIDxzYW1wPmh0dHA6Ly93d3cuc3ViMS5kb21haW4udGxkLzwvc2FtcD4KLSAgICBpcyBvbmx5IHNlcnZlZCBmcm9tIHRoZSBzdWIxLXZob3N0IGlmIHRoZSBjbGllbnQgc2VudCBhIGNvcnJlY3QKLSAgICA8Y29kZT5Ib3N0OjwvY29kZT4gaGVhZGVyLgotICAgIElmIG5vIDxjb2RlPkhvc3Q6PC9jb2RlPiBoZWFkZXIgaXMgc2VudCB0aGUgY2xpZW50IGdldHMgdGhlCi0gICAgaW5mb3JtYXRpb24gcGFnZSBmcm9tIHRoZSBwcmltYXJ5IGhvc3QuPGJyPgotICAgIFBsZWFzZSBub3RlIHRoYXQgdGhlcmUgaXMgb25lIG9kZGl0eTogQSByZXF1ZXN0IHRvCi0gICAgPHNhbXA+aHR0cDovL3d3dy5zdWIyLmRvbWFpbi50bGQvc3ViMS88L3NhbXA+IGlzIGFsc28gc2VydmVkIGZyb20KLSAgICB0aGUgc3ViMS12aG9zdCBpZiB0aGUgY2xpZW50IHNlbnQgbm8gPGNvZGU+SG9zdDo8L2NvZGU+IGhlYWRlci4gPGJyPgotICAgIFRoZSA8Y29kZT5SZXdyaXRlUnVsZTwvY29kZT4gZGlyZWN0aXZlcyBhcmUgdXNlZCB0byBtYWtlIHN1cmUgdGhhdAotICAgIGEgY2xpZW50IHdoaWNoIHNlbnQgYSBjb3JyZWN0IDxjb2RlPkhvc3Q6PC9jb2RlPiBoZWFkZXIgY2FuIHVzZQotICAgIGJvdGggVVJMIHZhcmlhbnRzLCBpLmUuIHdpdGggb3Igd2l0aG91dCBVUkwgcHJlZml4LgotICAgIDwvYmxvY2txdW90ZT4KLQotPC91bD4gCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC92aG9zdHMvZmQtbGltaXRzLmh0bWwgYi9kb2NzL21hbnVhbC92aG9zdHMvZmQtbGltaXRzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZjRkODIuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvdmhvc3RzL2ZkLWxpbWl0cy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BcGFjaGUgU2VydmVyIFZpcnR1YWwgSG9zdCBTdXBwb3J0PC90aXRsZT4KLTwvaGVhZD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08aDEgQUxJR049IkNFTlRFUiI+RmlsZSBEZXNjcmlwdG9yIExpbWl0czwvaDE+Ci0KLTxQPgotV2hlbiB1c2luZyBhIGxhcmdlIG51bWJlciBvZiBWaXJ0dWFsIEhvc3RzLCBBcGFjaGUgbWF5IHJ1biBvdXQgb2YgYXZhaWxhYmxlCi1maWxlIGRlc2NyaXB0b3JzIChzb21ldGltZXMgY2FsbGVkIDxjaXRlPmZpbGUgaGFuZGxlczwvY2l0ZT4gaWYgZWFjaCBWaXJ0dWFsCi1Ib3N0IHNwZWNpZmllcyBkaWZmZXJlbnQgbG9nIGZpbGVzLgotVGhlIHRvdGFsIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIHVzZWQgYnkgQXBhY2hlIGlzIG9uZSBmb3IgZWFjaCBkaXN0aW5jdAotZXJyb3IgbG9nIGZpbGUsIG9uZSBmb3IgZXZlcnkgb3RoZXIgbG9nIGZpbGUgZGlyZWN0aXZlLCBwbHVzIDEwLTIwIGZvcgotaW50ZXJuYWwgdXNlLiBVbml4IG9wZXJhdGluZyBzeXN0ZW1zIGxpbWl0IHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyB0aGF0Ci1tYXkgYmUgdXNlZCBieSBhIHByb2Nlc3M7IHRoZSBsaW1pdCBpcyB0eXBpY2FsbHkgNjQsIGFuZCBtYXkgdXN1YWxseSBiZQotaW5jcmVhc2VkIHVwIHRvIGEgbGFyZ2UgaGFyZC1saW1pdC4KLTxwPgotQWx0aG91Z2ggQXBhY2hlIGF0dGVtcHRzIHRvIGluY3JlYXNlIHRoZSBsaW1pdCBhcyByZXF1aXJlZCwgdGhpcwotbWF5IG5vdCB3b3JrIGlmOgotPG9sPgotPGxpPllvdXIgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIHNldHJsaW1pdCgpIHN5c3RlbSBjYWxsLgotPGxpPlRoZSBzZXRybGltaXQoUkxJTUlUX05PRklMRSkgY2FsbCBkb2VzIG5vdCBmdW5jdGlvbiBvbiB5b3VyIHN5c3RlbQotIChzdWNoIGFzIFNvbGFyaXMgMi4zKQotPGxpPlRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyByZXF1aXJlZCBleGNlZWRzIHRoZSBoYXJkIGxpbWl0LgotPGxpPllvdXIgc3lzdGVtIGltcG9zZXMgb3RoZXIgbGltaXRzIG9uIGZpbGUgZGVzY3JpcHRvcnMsIHN1Y2ggYXMgYSBsaW1pdAotb24gc3RkaW8gc3RyZWFtcyBvbmx5IHVzaW5nIGZpbGUgZGVzY3JpcHRvcnMgYmVsb3cgMjU2LiAoU29sYXJpcyAyKQotPC9vbD4KLQotSW4gdGhlIGV2ZW50IG9mIHByb2JsZW1zIHlvdSBjYW46Ci08dWw+Ci08bGk+UmVkdWNlIHRoZSBudW1iZXIgb2YgbG9nIGZpbGVzOyBkb24ndCBzcGVjaWZ5IGxvZyBmaWxlcyBpbiB0aGUgVmlydHVhbEhvc3QKLXNlY3Rpb25zLCBidXQgb25seSBsb2cgdG8gdGhlIG1haW4gbG9nIGZpbGVzLgotPGxpPklmIHlvdSBzeXN0ZW0gZmFsbHMgaW50byAxIG9yIDIgKGFib3ZlKSwgdGhlbiBpbmNyZWFzZSB0aGUgZmlsZSBkZXNjcmlwdG9yCi1saW1pdCBiZWZvcmUgc3RhcnRpbmcgQXBhY2hlLCB1c2luZyBhIHNjcmlwdCBsaWtlCi08YmxvY2txdW90ZT48Y29kZT4KLSMhL2Jpbi9zaCA8YnI+Ci11bGltaXQgLVMgLW4gMTAwIDxicj4KLWV4ZWMgaHR0cGQ8L2NvZGU+PC9ibG9ja3F1b3RlPgotPC91bD4KLTxQPgotUGxlYXNlIHNlZSB0aGUKLTxBIEhSRUY9Ii4uL21pc2MvZGVzY3JpcHRvcnMuaHRtbCI+RGVzY3JpcHRvcnMgYW5kIEFwYWNoZTwvQT4KLWRvY3VtZW50IGNvbnRhaW5pbmcgZnVydGhlciBkZXRhaWxzIGFib3V0IGZpbGUgZGVzY3JpcHRvciBwcm9ibGVtcyBhbmQgaG93Ci10aGV5IGNhbiBiZSBzb2x2ZWQgb24geW91ciBvcGVyYXRpbmcgc3lzdGVtLgotPC9QPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9ib2R5PjwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvdmhvc3RzL2ZkLWxpbWl0cy5odG1sLmVuIGIvZG9jcy9tYW51YWwvdmhvc3RzL2ZkLWxpbWl0cy5odG1sLmVuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2Y0ZDgyLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL3Zob3N0cy9mZC1saW1pdHMuaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QXBhY2hlIFNlcnZlciBWaXJ0dWFsIEhvc3QgU3VwcG9ydDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPGgxIEFMSUdOPSJDRU5URVIiPkZpbGUgRGVzY3JpcHRvciBMaW1pdHM8L2gxPgotCi08UD4KLVdoZW4gdXNpbmcgYSBsYXJnZSBudW1iZXIgb2YgVmlydHVhbCBIb3N0cywgQXBhY2hlIG1heSBydW4gb3V0IG9mIGF2YWlsYWJsZQotZmlsZSBkZXNjcmlwdG9ycyAoc29tZXRpbWVzIGNhbGxlZCA8Y2l0ZT5maWxlIGhhbmRsZXM8L2NpdGU+IGlmIGVhY2ggVmlydHVhbAotSG9zdCBzcGVjaWZpZXMgZGlmZmVyZW50IGxvZyBmaWxlcy4KLVRoZSB0b3RhbCBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyB1c2VkIGJ5IEFwYWNoZSBpcyBvbmUgZm9yIGVhY2ggZGlzdGluY3QKLWVycm9yIGxvZyBmaWxlLCBvbmUgZm9yIGV2ZXJ5IG90aGVyIGxvZyBmaWxlIGRpcmVjdGl2ZSwgcGx1cyAxMC0yMCBmb3IKLWludGVybmFsIHVzZS4gVW5peCBvcGVyYXRpbmcgc3lzdGVtcyBsaW1pdCB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgdGhhdAotbWF5IGJlIHVzZWQgYnkgYSBwcm9jZXNzOyB0aGUgbGltaXQgaXMgdHlwaWNhbGx5IDY0LCBhbmQgbWF5IHVzdWFsbHkgYmUKLWluY3JlYXNlZCB1cCB0byBhIGxhcmdlIGhhcmQtbGltaXQuCi08cD4KLUFsdGhvdWdoIEFwYWNoZSBhdHRlbXB0cyB0byBpbmNyZWFzZSB0aGUgbGltaXQgYXMgcmVxdWlyZWQsIHRoaXMKLW1heSBub3Qgd29yayBpZjoKLTxvbD4KLTxsaT5Zb3VyIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBzZXRybGltaXQoKSBzeXN0ZW0gY2FsbC4KLTxsaT5UaGUgc2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUpIGNhbGwgZG9lcyBub3QgZnVuY3Rpb24gb24geW91ciBzeXN0ZW0KLSAoc3VjaCBhcyBTb2xhcmlzIDIuMykKLTxsaT5UaGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgcmVxdWlyZWQgZXhjZWVkcyB0aGUgaGFyZCBsaW1pdC4KLTxsaT5Zb3VyIHN5c3RlbSBpbXBvc2VzIG90aGVyIGxpbWl0cyBvbiBmaWxlIGRlc2NyaXB0b3JzLCBzdWNoIGFzIGEgbGltaXQKLW9uIHN0ZGlvIHN0cmVhbXMgb25seSB1c2luZyBmaWxlIGRlc2NyaXB0b3JzIGJlbG93IDI1Ni4gKFNvbGFyaXMgMikKLTwvb2w+Ci0KLUluIHRoZSBldmVudCBvZiBwcm9ibGVtcyB5b3UgY2FuOgotPHVsPgotPGxpPlJlZHVjZSB0aGUgbnVtYmVyIG9mIGxvZyBmaWxlczsgZG9uJ3Qgc3BlY2lmeSBsb2cgZmlsZXMgaW4gdGhlIFZpcnR1YWxIb3N0Ci1zZWN0aW9ucywgYnV0IG9ubHkgbG9nIHRvIHRoZSBtYWluIGxvZyBmaWxlcy4KLTxsaT5JZiB5b3Ugc3lzdGVtIGZhbGxzIGludG8gMSBvciAyIChhYm92ZSksIHRoZW4gaW5jcmVhc2UgdGhlIGZpbGUgZGVzY3JpcHRvcgotbGltaXQgYmVmb3JlIHN0YXJ0aW5nIEFwYWNoZSwgdXNpbmcgYSBzY3JpcHQgbGlrZQotPGJsb2NrcXVvdGU+PGNvZGU+Ci0jIS9iaW4vc2ggPGJyPgotdWxpbWl0IC1TIC1uIDEwMCA8YnI+Ci1leGVjIGh0dHBkPC9jb2RlPjwvYmxvY2txdW90ZT4KLTwvdWw+Ci08UD4KLVBsZWFzZSBzZWUgdGhlCi08QSBIUkVGPSIuLi9taXNjL2Rlc2NyaXB0b3JzLmh0bWwiPkRlc2NyaXB0b3JzIGFuZCBBcGFjaGU8L0E+Ci1kb2N1bWVudCBjb250YWluaW5nIGZ1cnRoZXIgZGV0YWlscyBhYm91dCBmaWxlIGRlc2NyaXB0b3IgcHJvYmxlbXMgYW5kIGhvdwotdGhleSBjYW4gYmUgc29sdmVkIG9uIHlvdXIgb3BlcmF0aW5nIHN5c3RlbS4KLTwvUD4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvYm9keT48L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3Zob3N0cy9pbmRleC5odG1sIGIvZG9jcy9tYW51YWwvdmhvc3RzL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMWEyMjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvdmhvc3RzL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFwYWNoZSBWaXJ0dWFsIEhvc3QgZG9jdW1lbnRhdGlvbjwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPkFwYWNoZSBWaXJ0dWFsIEhvc3QgZG9jdW1lbnRhdGlvbjwvaDE+Ci0KLTxwPlRoZSB0ZXJtIDxjaXRlPlZpcnR1YWwgSG9zdDwvY2l0ZT4gcmVmZXJzIHRvIHRoZSBwcmFjdGljZSBvZiBtYWludGFpbmluZwotbW9yZSB0aGFuIG9uZSBzZXJ2ZXIgb24gb25lIG1hY2hpbmUsIGFzIGRpZmZlcmVudGlhdGVkIGJ5IHRoZWlyIGFwcGFyZW50Ci1ob3N0bmFtZS4gRm9yIGV4YW1wbGUsIGl0IGlzIG9mdGVuIGRlc2lyYWJsZSBmb3IgY29tcGFuaWVzIHNoYXJpbmcgYQotd2ViIHNlcnZlciB0byBoYXZlIHRoZWlyIG93biBkb21haW5zLCB3aXRoIHdlYiBzZXJ2ZXJzIGFjY2Vzc2libGUgYXMKLTxzYW1wPnd3dy5jb21wYW55MS5jb208L3NhbXA+IGFuZCA8c2FtcD53d3cuY29tcGFueTIuY29tPC9zYW1wPiwKLXdpdGhvdXQgcmVxdWlyaW5nIHRoZSB1c2VyIHRvIGtub3cgYW55IGV4dHJhIHBhdGggaW5mb3JtYXRpb24uPC9wPgotCi08cD5BcGFjaGUgd2FzIG9uZSBvZiB0aGUgZmlyc3Qgc2VydmVycyB0byBzdXBwb3J0IElQLWJhc2VkCi12aXJ0dWFsIGhvc3RzIHJpZ2h0IG91dCBvZiB0aGUgYm94LiBWZXJzaW9ucyAxLjEgYW5kIGxhdGVyIG9mCi1BcGFjaGUgc3VwcG9ydCBib3RoLCBJUC1iYXNlZCBhbmQgbmFtZS1iYXNlZCB2aXJ0dWFsIGhvc3RzICh2aG9zdHMpLgotVGhlIGxhdHRlciB2YXJpYW50IG9mIHZpcnR1YWwgaG9zdHMgaXMgc29tZXRpbWVzIGFsc28gY2FsbGVkIGhvc3QtYmFzZWQgb3IKLW5vbi1JUCB2aXJ0dWFsIGhvc3RzLjwvUD4KLQotPFA+QmVsb3cgaXMgYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gcGFnZXMgd2hpY2ggZXhwbGFpbiBhbGwgZGV0YWlscwotb2YgdmlydHVhbCBob3N0IHN1cHBvcnQgaW4gQXBhY2hlIHZlcnNpb24gMS4zIGFuZCBsYXRlci48L1A+Ci0KLTxIUj4KLQotPEgyPlZpcnR1YWwgSG9zdCBTdXBwb3J0PC9IMj4KLQotPFVMPgotPExJPjxBIEhSRUY9ImlwLWJhc2VkLmh0bWwiPklQLWJhc2VkIFZpcnR1YWwgSG9zdHM8L0E+Ci08TEk+PEEgSFJFRj0ibmFtZS1iYXNlZC5odG1sIj5OYW1lLWJhc2VkIFZpcnR1YWwgSG9zdHM8L0E+Ci08TEk+PEEgSFJFRj0iZXhhbXBsZXMuaHRtbCI+VmlydHVhbCBIb3N0IGV4YW1wbGVzIGZvciBjb21tb24gc2V0dXBzPC9BPgotPExJPjxBIEhSRUY9ImRldGFpbHMuaHRtbCI+SW4tRGVwdGggRGlzY3Vzc2lvbiBvZiBWaXJ0dWFsIEhvc3QgTWF0Y2hpbmc8L0E+Ci08TEk+PEEgSFJFRj0iZmQtbGltaXRzLmh0bWwiPkZpbGUgRGVzY3JpcHRvciBMaW1pdHM8L0E+Ci08L1VMPgotCi08SDI+Q29uZmlndXJhdGlvbiBkaXJlY3RpdmVzPC9IMj4KLQotPFVMPgotPExJPjxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjdmlydHVhbGhvc3QiPiZsdDtWaXJ0dWFsSG9zdCZndDs8L0E+Ci08TEk+PEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNuYW1ldmlydHVhbGhvc3QiPk5hbWVWaXJ0dWFsSG9zdDwvQT4KLTxMST48QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcm5hbWUiPlNlcnZlck5hbWU8L0E+Ci08TEk+PEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNzZXJ2ZXJhbGlhcyI+U2VydmVyQWxpYXM8L0E+Ci08TEk+PEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNzZXJ2ZXJwYXRoIj5TZXJ2ZXJQYXRoPC9BPgotPC9VTD4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3Zob3N0cy9pbmRleC5odG1sLmVuIGIvZG9jcy9tYW51YWwvdmhvc3RzL2luZGV4Lmh0bWwuZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMWEyMjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvdmhvc3RzL2luZGV4Lmh0bWwuZW4KKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFwYWNoZSBWaXJ0dWFsIEhvc3QgZG9jdW1lbnRhdGlvbjwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPkFwYWNoZSBWaXJ0dWFsIEhvc3QgZG9jdW1lbnRhdGlvbjwvaDE+Ci0KLTxwPlRoZSB0ZXJtIDxjaXRlPlZpcnR1YWwgSG9zdDwvY2l0ZT4gcmVmZXJzIHRvIHRoZSBwcmFjdGljZSBvZiBtYWludGFpbmluZwotbW9yZSB0aGFuIG9uZSBzZXJ2ZXIgb24gb25lIG1hY2hpbmUsIGFzIGRpZmZlcmVudGlhdGVkIGJ5IHRoZWlyIGFwcGFyZW50Ci1ob3N0bmFtZS4gRm9yIGV4YW1wbGUsIGl0IGlzIG9mdGVuIGRlc2lyYWJsZSBmb3IgY29tcGFuaWVzIHNoYXJpbmcgYQotd2ViIHNlcnZlciB0byBoYXZlIHRoZWlyIG93biBkb21haW5zLCB3aXRoIHdlYiBzZXJ2ZXJzIGFjY2Vzc2libGUgYXMKLTxzYW1wPnd3dy5jb21wYW55MS5jb208L3NhbXA+IGFuZCA8c2FtcD53d3cuY29tcGFueTIuY29tPC9zYW1wPiwKLXdpdGhvdXQgcmVxdWlyaW5nIHRoZSB1c2VyIHRvIGtub3cgYW55IGV4dHJhIHBhdGggaW5mb3JtYXRpb24uPC9wPgotCi08cD5BcGFjaGUgd2FzIG9uZSBvZiB0aGUgZmlyc3Qgc2VydmVycyB0byBzdXBwb3J0IElQLWJhc2VkCi12aXJ0dWFsIGhvc3RzIHJpZ2h0IG91dCBvZiB0aGUgYm94LiBWZXJzaW9ucyAxLjEgYW5kIGxhdGVyIG9mCi1BcGFjaGUgc3VwcG9ydCBib3RoLCBJUC1iYXNlZCBhbmQgbmFtZS1iYXNlZCB2aXJ0dWFsIGhvc3RzICh2aG9zdHMpLgotVGhlIGxhdHRlciB2YXJpYW50IG9mIHZpcnR1YWwgaG9zdHMgaXMgc29tZXRpbWVzIGFsc28gY2FsbGVkIGhvc3QtYmFzZWQgb3IKLW5vbi1JUCB2aXJ0dWFsIGhvc3RzLjwvUD4KLQotPFA+QmVsb3cgaXMgYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gcGFnZXMgd2hpY2ggZXhwbGFpbiBhbGwgZGV0YWlscwotb2YgdmlydHVhbCBob3N0IHN1cHBvcnQgaW4gQXBhY2hlIHZlcnNpb24gMS4zIGFuZCBsYXRlci48L1A+Ci0KLTxIUj4KLQotPEgyPlZpcnR1YWwgSG9zdCBTdXBwb3J0PC9IMj4KLQotPFVMPgotPExJPjxBIEhSRUY9ImlwLWJhc2VkLmh0bWwiPklQLWJhc2VkIFZpcnR1YWwgSG9zdHM8L0E+Ci08TEk+PEEgSFJFRj0ibmFtZS1iYXNlZC5odG1sIj5OYW1lLWJhc2VkIFZpcnR1YWwgSG9zdHM8L0E+Ci08TEk+PEEgSFJFRj0iZXhhbXBsZXMuaHRtbCI+VmlydHVhbCBIb3N0IGV4YW1wbGVzIGZvciBjb21tb24gc2V0dXBzPC9BPgotPExJPjxBIEhSRUY9ImRldGFpbHMuaHRtbCI+SW4tRGVwdGggRGlzY3Vzc2lvbiBvZiBWaXJ0dWFsIEhvc3QgTWF0Y2hpbmc8L0E+Ci08TEk+PEEgSFJFRj0iZmQtbGltaXRzLmh0bWwiPkZpbGUgRGVzY3JpcHRvciBMaW1pdHM8L0E+Ci08L1VMPgotCi08SDI+Q29uZmlndXJhdGlvbiBkaXJlY3RpdmVzPC9IMj4KLQotPFVMPgotPExJPjxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjdmlydHVhbGhvc3QiPiZsdDtWaXJ0dWFsSG9zdCZndDs8L0E+Ci08TEk+PEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNuYW1ldmlydHVhbGhvc3QiPk5hbWVWaXJ0dWFsSG9zdDwvQT4KLTxMST48QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcm5hbWUiPlNlcnZlck5hbWU8L0E+Ci08TEk+PEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNzZXJ2ZXJhbGlhcyI+U2VydmVyQWxpYXM8L0E+Ci08TEk+PEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNzZXJ2ZXJwYXRoIj5TZXJ2ZXJQYXRoPC9BPgotPC9VTD4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3Zob3N0cy9pcC1iYXNlZC5odG1sIGIvZG9jcy9tYW51YWwvdmhvc3RzL2lwLWJhc2VkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxY2MxNGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvdmhvc3RzL2lwLWJhc2VkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BcGFjaGUgSVAtYmFzZWQgVmlydHVhbCBIb3N0IFN1cHBvcnQ8L3RpdGxlPgotPC9oZWFkPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxoMSBBTElHTj0iQ0VOVEVSIj5BcGFjaGUgSVAtYmFzZWQgVmlydHVhbCBIb3N0IFN1cHBvcnQ8L2gxPgotCi08c3Ryb25nPlNlZSBhbHNvOjwvc3Ryb25nPgotPGEgaHJlZj0ibmFtZS1iYXNlZC5odG1sIj5OYW1lLWJhc2VkIFZpcnR1YWwgSG9zdHMgU3VwcG9ydDwvYT4KLQotPEhSPgotCi08aDI+U3lzdGVtIHJlcXVpcmVtZW50czwvaDI+Ci1BcyB0aGUgdGVybSA8Y2l0ZT5JUC1iYXNlZDwvY2l0ZT4gaW5kaWNhdGVzLCB0aGUgc2VydmVyIDxzdHJvbmc+bXVzdCBoYXZlIGEKLWRpZmZlcmVudCBJUCBhZGRyZXNzIGZvciBlYWNoIElQLWJhc2VkIHZpcnR1YWwgaG9zdDwvc3Ryb25nPi4KLVRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IHRoZSBtYWNoaW5lIGhhdmluZyBzZXZlcmFsIHBoeXNpY2FsIG5ldHdvcmsgY29ubmVjdGlvbnMsCi1vciBieSB1c2Ugb2YgdmlydHVhbCBpbnRlcmZhY2VzIHdoaWNoIGFyZSBzdXBwb3J0ZWQgYnkgbW9zdCBtb2Rlcm4KLW9wZXJhdGluZyBzeXN0ZW1zIChzZWUgc3lzdGVtIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMpLgotCi08aDI+SG93IHRvIHNldCB1cCBBcGFjaGU8L2gyPgotVGhlcmUgYXJlIHR3byB3YXlzIG9mIGNvbmZpZ3VyaW5nIGFwYWNoZSB0byBzdXBwb3J0IG11bHRpcGxlIGhvc3RzLgotRWl0aGVyIGJ5IHJ1bm5pbmcgYSBzZXBhcmF0ZSBodHRwZCBkYWVtb24gZm9yIGVhY2ggaG9zdG5hbWUsIG9yIGJ5IHJ1bm5pbmcgYQotc2luZ2xlIGRhZW1vbiB3aGljaCBzdXBwb3J0cyBhbGwgdGhlIHZpcnR1YWwgaG9zdHMuCi08cD4KLVVzZSBtdWx0aXBsZSBkYWVtb25zIHdoZW46Ci08dWw+Ci08bGk+VGhlIGRpZmZlcmVudCB2aXJ0dWFsIGhvc3RzIG5lZWQgdmVyeSBkaWZmZXJlbnQgaHR0cGQgY29uZmlndXJhdGlvbnMsIHN1Y2gKLSAgIGFzIGRpZmZlcmVudCB2YWx1ZXMgZm9yOiA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcnR5cGUiPlNlcnZlclR5cGU8L0E+LAotICAgPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCN1c2VyIj5Vc2VyPC9BPiwKLSAgIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjZ3JvdXAiPkdyb3VwPC9BPiwKLSAgIDxBIEhSRUY9Ii4uL21vZC9tb2RfbWltZS5odG1sI3R5cGVzY29uZmlnIj5UeXBlc0NvbmZpZzwvQT4gb3IKLSAgIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvQT4uCi08bGk+VGhlIG1hY2hpbmUgZG9lcyBub3QgcHJvY2VzcyBhIHZlcnkgaGlnaCByZXF1ZXN0IHJhdGUuCi08L3VsPgotVXNlIGEgc2luZ2xlIGRhZW1vbiB3aGVuOgotPHVsPgotPGxpPlNoYXJpbmcgb2YgdGhlIGh0dHBkIGNvbmZpZ3VyYXRpb24gYmV0d2VlbiB2aXJ0dWFsIGhvc3RzIGlzIGFjY2VwdGFibGUuCi08bGk+VGhlIG1hY2hpbmUgc2VydmljZXMgYSBsYXJnZSBudW1iZXIgb2YgcmVxdWVzdHMsIGFuZCBzbyB0aGUgcGVyZm9ybWFuY2UKLSAgIGxvc3MgaW4gcnVubmluZyBzZXBhcmF0ZSBkYWVtb25zIG1heSBiZSBzaWduaWZpY2FudC4KLTwvdWw+Ci0KLTxoMj5TZXR0aW5nIHVwIG11bHRpcGxlIGRhZW1vbnM8L2gyPgotQ3JlYXRlIGEgc2VwYXJhdGUgaHR0cGQgaW5zdGFsbGF0aW9uIGZvciBlYWNoIHZpcnR1YWwgaG9zdC4KLUZvciBlYWNoIGluc3RhbGxhdGlvbiwgdXNlIHRoZQotPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNsaXN0ZW4iPkxpc3RlbjwvQT4gZGlyZWN0aXZlIGluIHRoZSBjb25maWd1cmF0aW9uCi1maWxlIHRvIHNlbGVjdCB3aGljaCBJUCBhZGRyZXNzIChvciB2aXJ0dWFsIGhvc3QpIHRoYXQgZGFlbW9uIHNlcnZpY2VzLgotZS5nLgotPHByZT4KLSAgICBMaXN0ZW4gd3d3LnNtYWxsY28uY29tOjgwCi08L3ByZT4KLUl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IHVzZSBhbiBJUCBhZGRyZXNzIGluc3RlYWQgb2YgYSBob3N0bmFtZQotKHNlZSA8QSBIUkVGPSIuLi9kbnMtY2F2ZWF0cy5odG1sIj5ETlMgcGFnZTwvQT4pLgotCi08aDI+U2V0dGluZyB1cCBhIHNpbmdsZSBkYWVtb24gd2l0aCB2aXJ0dWFsIGhvc3RzPC9oMj4KLUZvciB0aGlzIGNhc2UsIGEgc2luZ2xlIGh0dHBkIHdpbGwgc2VydmljZSByZXF1ZXN0cyBmb3IgdGhlIG1haW4gc2VydmVyCi1hbmQgYWxsIHRoZSB2aXJ0dWFsIGhvc3RzLgotVGhlIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjdmlydHVhbGhvc3QiPlZpcnR1YWxIb3N0PC9BPiBkaXJlY3RpdmUgaW4gdGhlCi0gY29uZmlndXJhdGlvbiBmaWxlIGlzIHVzZWQgdG8gc2V0IHRoZSB2YWx1ZXMgb2YKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjc2VydmVyYWRtaW4iPlNlcnZlckFkbWluPC9BPiwKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjc2VydmVybmFtZSI+U2VydmVyTmFtZTwvQT4sCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI2RvY3VtZW50cm9vdCI+RG9jdW1lbnRSb290PC9BPiwKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjZXJyb3Jsb2ciPkVycm9yTG9nPC9BPiBhbmQKLTxBIEhSRUY9Ii4uL21vZC9tb2RfbG9nX2NvbmZpZy5odG1sI3RyYW5zZmVybG9nIj5UcmFuc2ZlckxvZzwvQT4gb3IKLTxBIEhSRUY9Ii4uL21vZC9tb2RfbG9nX2NvbmZpZy5odG1sI2N1c3RvbWxvZyI+Q3VzdG9tTG9nPC9BPgotY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzIHRvIGRpZmZlcmVudCB2YWx1ZXMgZm9yIGVhY2ggdmlydHVhbCBob3N0LgotZS5nLgotPHByZT4KLSAgICAmbHQ7VmlydHVhbEhvc3Qgd3d3LnNtYWxsY28uY29tJmd0OwotICAgIFNlcnZlckFkbWluIHdlYm1hc3RlckBtYWlsLnNtYWxsY28uY29tCi0gICAgRG9jdW1lbnRSb290IC9ncm91cHMvc21hbGxjby93d3cKLSAgICBTZXJ2ZXJOYW1lIHd3dy5zbWFsbGNvLmNvbQotICAgIEVycm9yTG9nIC9ncm91cHMvc21hbGxjby9sb2dzL2Vycm9yX2xvZwotICAgIFRyYW5zZmVyTG9nIC9ncm91cHMvc21hbGxjby9sb2dzL2FjY2Vzc19sb2cKLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotCi0gICAgJmx0O1ZpcnR1YWxIb3N0IHd3dy5iYXlncm91cC5vcmcmZ3Q7Ci0gICAgU2VydmVyQWRtaW4gd2VibWFzdGVyQG1haWwuYmF5Z3JvdXAub3JnCi0gICAgRG9jdW1lbnRSb290IC9ncm91cHMvYmF5Z3JvdXAvd3d3Ci0gICAgU2VydmVyTmFtZSB3d3cuYmF5Z3JvdXAub3JnCi0gICAgRXJyb3JMb2cgL2dyb3Vwcy9iYXlncm91cC9sb2dzL2Vycm9yX2xvZwotICAgIFRyYW5zZmVyTG9nIC9ncm91cHMvYmF5Z3JvdXAvbG9ncy9hY2Nlc3NfbG9nCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLTwvcHJlPgotCi1JdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2UgYW4gSVAgYWRkcmVzcyBpbnN0ZWFkIG9mIGEgaG9zdG5hbWUKLShzZWUgPEEgSFJFRj0iLi4vZG5zLWNhdmVhdHMuaHRtbCI+RE5TIHBhZ2U8L0E+KS4KLQotPFA+Ci0KLUFsbW9zdCA8c3Ryb25nPmFueTwvc3Ryb25nPiBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZSBjYW4gYmUgcHV0Ci1pbiB0aGUgVmlydHVhbEhvc3QgZGlyZWN0aXZlLCB3aXRoIHRoZSBleGNlcHRpb24gb2YKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjc2VydmVydHlwZSI+U2VydmVyVHlwZTwvQT4sCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3N0YXJ0c2VydmVycyI+U3RhcnRTZXJ2ZXJzPC9BPiwKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjbWF4c3BhcmVzZXJ2ZXJzIj5NYXhTcGFyZVNlcnZlcnM8L0E+LAotPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNtaW5zcGFyZXNlcnZlcnMiPk1pblNwYXJlU2VydmVyczwvQT4sCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI21heHJlcXVlc3RzcGVyY2hpbGQiPk1heFJlcXVlc3RzUGVyQ2hpbGQ8L0E+LAotPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNiaW5kYWRkcmVzcyI+QmluZEFkZHJlc3M8L0E+LAotPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNsaXN0ZW4iPkxpc3RlbjwvQT4sCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3BpZGZpbGUiPlBpZEZpbGU8L0E+LAotPEEgSFJFRj0iLi4vbW9kL21vZF9taW1lLmh0bWwjdHlwZXNjb25maWciPlR5cGVzQ29uZmlnPC9BPiwKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvQT4gYW5kCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI25hbWV2aXJ0dWFsaG9zdCI+TmFtZVZpcnR1YWxIb3N0PC9BPi4KLTxQPgotPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCN1c2VyIj5Vc2VyPC9BPiBhbmQKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjZ3JvdXAiPkdyb3VwPC9BPiBtYXliZSB1c2VkIGluc2lkZSBhIFZpcnR1YWxIb3N0Ci1kaXJlY3RpdmUgaWYgdGhlIDxBIEhSRUY9Ii4uL3N1ZXhlYy5odG1sIj5zdUVYRUMgd3JhcHBlcjwvQT4gaXMgdXNlZC4KLTxQPgotCi08RU0+U0VDVVJJVFk6PC9FTT4gV2hlbiBzcGVjaWZ5aW5nIHdoZXJlIHRvIHdyaXRlIGxvZyBmaWxlcywgYmUgYXdhcmUKLW9mIHNvbWUgc2VjdXJpdHkgcmlza3Mgd2hpY2ggYXJlIHByZXNlbnQgaWYgYW55b25lIG90aGVyIHRoYW4gdGhlCi11c2VyIHRoYXQgc3RhcnRzIEFwYWNoZSBoYXMgd3JpdGUgYWNjZXNzIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhleQotYXJlIHdyaXR0ZW4uICBTZWUgdGhlIDxBIEhSRUY9Ii4uL21pc2Mvc2VjdXJpdHlfdGlwcy5odG1sIj5zZWN1cml0eQotdGlwczwvQT4gZG9jdW1lbnQgZm9yIGRldGFpbHMuCi08L1A+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3Zob3N0cy9tYXNzLmh0bWwgYi9kb2NzL21hbnVhbC92aG9zdHMvbWFzcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWNkOTUyLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL3Zob3N0cy9tYXNzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+PEhFQUQ+Ci08VElUTEU+RHluYW1pY2FsbHkgY29uZmlndXJlZCBtYXNzIHZpcnR1YWwgaG9zdGluZzwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPkR5bmFtaWNhbGx5IGNvbmZpZ3VyZWQgbWFzcyB2aXJ0dWFsIGhvc3Rpbmc8L0gxPgotCi08UD5UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgdG8gZWZmaWNpZW50bHkgc2VydmUgYW4gYXJiaXRyYXJ5IG51bWJlcgotb2YgdmlydHVhbCBob3N0cyB3aXRoIEFwYWNoZSAxLjMuIFNvbWUgZmFtaWxpYXJpdHkgd2l0aAotPEEgSFJFRj0iLi4vbW9kL21vZF9yZXdyaXRlLmh0bWwiPjxDT0RFPm1vZF9yZXdyaXRlPC9DT0RFPjwvQT4gaXMKLXVzZWZ1bC48L1A+Ci0KLTwhLS0KLQotV3JpdHRlbiBieSBUb255IEZpbmNoIChmYW5mQGRlbW9uLm5ldCkgKGRvdEBkb3RhdC5hdCkuCi0KLVNvbWUgZXhhbXBsZXMgd2VyZSBkZXJpdmVkIGZyb20gUmFsZiBTLiBFbmdsZXNjaGFsbCdzIGRvY3VtZW50Ci0JaHR0cDovL3d3dy5lbmdlbHNjaGFsbC5jb20vcHcvYXBhY2hlL3Jld3JpdGVndWlkZS8KLQotU29tZSBzdWdnZXN0aW9ucyB3ZXJlIG1hZGUgYnkgQnJpYW4gQmVobGVuZG9yZi4KLQotLS0+Ci0KLTxIMj48QSBOQU1FPSJjb250ZW50cyI+Q29udGVudHM6PC9BPjwvSDI+Ci0KLTxVTD4KLTxMST48QSBIUkVGPSIjbW90aXZhdGlvbiI+TW90aXZhdGlvbjwvQT4KLTxMST48QSBIUkVGPSIjb3ZlcnZpZXciPk92ZXJ2aWV3IG9mIHRoZSB0ZWNobmlxdWU8L0E+Ci08TEk+PEEgSFJFRj0iI3NpbXBsZSI+U2ltcGxlIG5hbWUtYmFzZWQgZHluYW1pYyB2aXJ0dWFsIGhvc3RzPC9BPgotPExJPjxBIEhSRUY9IiNob21lcGFnZXMiPkEgdmlydHVhbGx5IGhvc3RlZCBob21lcGFnZXMgc3lzdGVtPC9BPgotPExJPjxBIEhSRUY9IiN4dHJhLWNvbmYiPlVzaW5nIGEgc2VwYXJhdGUgdmlydHVhbCBob3N0IGNvbmZpZ3VyYXRpb24gZmlsZTwvQT4KLTxMST48QSBIUkVGPSIjY29tYmluYXRpb25zIj5Vc2luZyBtb3JlIHRoYW4gb25lIHZpcnR1YWwgaG9zdGluZyBzeXN0ZW0gb24gdGhlIHNhbWUgc2VydmVyPC9BPgotPC9VTD4KLQotPEhSPjxIMj48QSBOQU1FPSJtb3RpdmF0aW9uIj5Nb3RpdmF0aW9uPC9BPjwvSDI+Ci0KLTxQPlRoZSB0ZWNobmlxdWVzIGRlc2NyaWJlZCBoZXJlIGFyZSBvZiBpbnRlcmVzdCBpZiB5b3VyCi08Q09ERT5odHRwZC5jb25mPC9DT0RFPiBjb250YWlucyBodW5kcmVkcyBvZgotPENPREU+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvQ09ERT4gc2VjdGlvbnMgdGhhdCBhcmUgc3Vic3RhbnRpYWxseSB0aGUKLXNhbWUsIGZvciBleGFtcGxlOgotPFBSRT4KLU5hbWVWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQKLSZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQmZ3Q7Ci0JU2VydmVyTmFtZQkJICAgICAgICAgICB3d3cuY3VzdG9tZXItMS5jb20KLQlEb2N1bWVudFJvb3QJCS93d3cvaG9zdHMvd3d3LmN1c3RvbWVyLTEuY29tL2RvY3MKLQlTY3JpcHRBbGlhcyAgL2NnaS1iaW4vICAvd3d3L2hvc3RzL3d3dy5jdXN0b21lci0xLmNvbS9jZ2ktYmluCi0mbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotJmx0O1ZpcnR1YWxIb3N0IDExMS4yMi4zMy40NCZndDsKLQlTZXJ2ZXJOYW1lCQkgICAgICAgICAgIHd3dy5jdXN0b21lci0yLmNvbQotCURvY3VtZW50Um9vdAkJL3d3dy9ob3N0cy93d3cuY3VzdG9tZXItMi5jb20vZG9jcwotCVNjcmlwdEFsaWFzICAvY2dpLWJpbi8gIC93d3cvaG9zdHMvd3d3LmN1c3RvbWVyLTIuY29tL2NnaS1iaW4KLSZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci0jIGJsYWggYmxhaCBibGFoCi0mbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0Jmd0OwotCVNlcnZlck5hbWUJCSAgICAgICAgICAgd3d3LmN1c3RvbWVyLU4uY29tCi0JRG9jdW1lbnRSb290CQkvd3d3L2hvc3RzL3d3dy5jdXN0b21lci1OLmNvbS9kb2NzCi0JU2NyaXB0QWxpYXMgIC9jZ2ktYmluLyAgL3d3dy9ob3N0cy93d3cuY3VzdG9tZXItTi5jb20vY2dpLWJpbgotJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLTwvUFJFPgotPC9QPgotCi08UD5UaGUgYmFzaWMgaWRlYSBpcyB0byByZXBsYWNlIGFsbCBvZiB0aGUgc3RhdGljCi08Q09ERT4mbHQ7VmlydHVhbEhvc3QmZ3Q7PC9DT0RFPiBjb25maWd1cmF0aW9uIHdpdGggYSBtZWNoYW5pc20gdGhhdAotd29ya3MgaXQgb3V0IGR5bmFtaWNhbGx5LiBUaGlzIGhhcyBhIG51bWJlciBvZiBhZHZhbnRhZ2VzOgotPE9MPgotICAgIDxMST5Zb3VyIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBzbWFsbGVyIHNvIEFwYWNoZSBzdGFydHMgZmFzdGVyIGFuZAotCXVzZXMgbGVzcyBtZW1vcnkuCi0gICAgPExJPkFkZGluZyB2aXJ0dWFsIGhvc3RzIGlzIHNpbXBseSBhIG1hdHRlciBvZiBjcmVhdGluZyB0aGUKLQlhcHByb3ByaWF0ZSBkaXJlY3RvcmllcyBpbiB0aGUgZmlsZXN5c3RlbSBhbmQgZW50cmllcyBpbiB0aGUgRE5TIC0KLQl5b3UgZG9uJ3QgbmVlZCB0byByZWNvbmZpZ3VyZSBvciByZXN0YXJ0IEFwYWNoZS4KLTwvT0w+Ci08L1A+Ci0KLTxQPlRoZSBtYWluIGRpc2FkdmFudGFnZSBpcyB0aGF0IHlvdSBjYW5ub3QgaGF2ZSBhIGRpZmZlcmVudCBsb2cgZmlsZQotZm9yIGVhY2ggc2VydmVyOyBob3dldmVyIGlmIHlvdSBoYXZlIHZlcnkgbWFueSB2aXJ0dWFsIGhvc3RzIHRoZW4KLWRvaW5nIHRoaXMgaXMgZHViaW91cyBhbnl3YXkgYmVjYXVzZSBpdCBlYXRzIGZpbGUgZGVzY3JpcHRvcnMuIEl0J3MKLWJldHRlciB0byBsb2cgdG8gYSBwaXBlIG9yIGEgZmlmbyBhbmQgYXJyYW5nZSBmb3IgdGhlIHByb2Nlc3MgYXQgdGhlCi1vdGhlciBlbmQgdG8gZGlzdHJpYnV0ZSB0aGUgbG9ncyAoYW5kIHBlcmhhcHMgYWNjdW11bGF0ZSBzdGF0aXN0aWNzLAotZXRjLikuIEEgPENPREU+TG9nRm9ybWF0PC9DT0RFPiBkaXJlY3RpdmUgdGhhdCBpbmNsdWRlcwotPENPREU+JXY8L0NPREU+IGZvciB0aGUgdmlydHVhbCBob3N0IG1ha2VzIGl0IGVhc3kgdG8gZG8gdGhpcy48L1A+Ci0KLQotPEhSPjxIMj48QSBOQU1FPSJvdmVydmlldyI+T3ZlcnZpZXcgb2YgdGhlIHRlY2huaXF1ZTwvQT48L0gyPgotCi08UD5BbGwgb2YgdGhlIGR5bmFtaWMgdmlydHVhbCBob3N0cyB3aWxsIGVpdGhlciBiZSBjb25maWd1cmVkIGFzIHBhcnQKLW9mIHRoZSBtYWluIHNlcnZlciBjb25maWd1cmF0aW9uLCBvciB3aXRoaW4gYQotPENPREU+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvQ09ERT4gc2VjdGlvbi4gRm9yIGEgc2ltcGxlICh2ZXJ5IHVuaWZvcm0pCi1zZXR1cCwgPENPREU+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvQ09ERT4gc2VjdGlvbnMgYXJlbid0IG5lZWRlZCBhdCBhbGwuPC9QPgotCi08UD5BIGNvdXBsZSBvZiB0aGluZ3MgbmVlZCB0byBiZSBgZmFrZWQnIHRvIG1ha2UgdGhlIGR5bmFtaWMgdmlydHVhbAotaG9zdCBsb29rIGxpa2UgYSBub3JtYWwgb25lLiBUaGUgbW9zdCBpbXBvcnRhbnQgaXMgdGhlIHNlcnZlciBuYW1lCi0oY29uZmlndXJlZCB3aXRoIDxDT0RFPlNlcnZlck5hbWU8L0NPREU+IGFuZCBhdmFpbGFibGUgdG8gQ0dJcyB2aWEgdGhlCi08Q09ERT5TRVJWRVJfTkFNRTwvQ09ERT4gZW52aXJvbm1lbnQgdmFyaWFibGUpLiBUaGUgd2F5IGl0IGlzCi1kZXRlcm1pbmVkIGlzIGNvbnRyb2xsZWQgYnkgdGhlIDxDT0RFPlVzZUNhbm9uaWNhbE5hbWU8L0NPREU+Ci1kaXJlY3RpdmU6IHdpdGggPENPREU+VXNlQ2Fub25pY2FsTmFtZSBvZmY8L0NPREU+IHRoZSBzZXJ2ZXIgbmFtZQotY29tZXMgZnJvbSB0aGUgY29udGVudHMgb2YgdGhlIDxDT0RFPkhvc3Q6PC9DT0RFPiBoZWFkZXIgaW4gdGhlCi1yZXF1ZXN0LiBJZiB0aGVyZSBpcyBubyA8Q09ERT5Ib3N0OjwvQ09ERT4gaGVhZGVyIHRoZW4gdGhlIHZhbHVlCi1jb25maWd1cmVkIHdpdGggPENPREU+U2VydmVyTmFtZTwvQ09ERT4gaXMgdXNlZCBpbnN0ZWFkLjwvUD4KLQotPFA+VGhlIG90aGVyIG9uZSBpcyB0aGUgZG9jdW1lbnQgcm9vdCAoY29uZmlndXJlZCB3aXRoCi08Q09ERT5Eb2N1bWVudFJvb3Q8L0NPREU+IGFuZCBhdmFpbGFibGUgdG8gQ0dJcyB2aWEgdGhlCi08Q09ERT5ET0NVTUVOVF9ST09UPC9DT0RFPiBlbnZpcm9ubWVudCB2YXJpYWJsZSkuIFRoaXMgaXMgdXNlZCBieSB0aGUKLWNvcmUgbW9kdWxlIHdoZW4gbWFwcGluZyBVUklzIHRvIGZpbGVuYW1lcywgYnV0IGluIHRoZSBjb250ZXh0IG9mCi1keW5hbWljIHZpcnR1YWwgaG9zdGluZyBpdHMgdmFsdWUgb25seSBtYXR0ZXJzIGlmIGFueSBDR0lzIG9yIFNTSQotZG9jdW1lbnRzIG1ha2UgdXNlIG9mIHRoZSA8Q09ERT5ET0NVTUVOVF9ST09UPC9DT0RFPiBlbnZpcm9ubWVudAotdmFyaWFibGUuIFRoaXMgaXMgYW4gQXBhY2hlIGV4dGVuc2lvbiB0byB0aGUgQ0dJIHNwZWNpZmljYXRpb24gYW5kIGFzCi1zdWNoIHNob3VsZG4ndCByZWFsbHkgYmUgcmVsaWVkIHVwb24sIGVzcGVjaWFsbHkgYmVjYXVzZSB0aGlzCi10ZWNobmlxdWUgYnJlYWtzIGl0OiB0aGVyZSBpc24ndCBjdXJyZW50bHkgYSB3YXkgb2Ygc2V0dGluZwotPENPREU+RE9DVU1FTlRfUk9PVDwvQ09ERT4gZHluYW1pY2FsbHkuPC9QPgotCi08UD5UaGUgbWVhdCBvZiB0aGUgbWVjaGFuaXNtIHdvcmtzIHZpYSBBcGFjaGUncyBVUkktdG8tZmlsZW5hbWUKLXRyYW5zbGF0aW9uIEFQSSBwaGFzZS4gVGhpcyBpcyB1c2VkIGJ5IGEgbnVtYmVyIG9mIG1vZHVsZXM6Ci08QSBIUkVGPSIuLi9tb2QvbW9kX3Jld3JpdGUuaHRtbCI+PENPREU+bW9kX3Jld3JpdGU8L0NPREU+PC9BPiwKLTxBIEhSRUY9Ii4uL21vZC9tb2RfYWxpYXMuaHRtbCI+PENPREU+bW9kX2FsaWFzPC9DT0RFPjwvQT4sCi08QSBIUkVGPSIuLi9tb2QvbW9kX3VzZXJkaXIuaHRtbCI+PENPREU+bW9kX3VzZXJkaXI8L0NPREU+PC9BPiwKLWFuZCA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sIj50aGUgY29yZSBtb2R1bGU8L0E+LgotSW4gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiB0aGVzZSBtb2R1bGVzIGFyZSBjYWxsZWQgaW4gdGhhdCBvcmRlcgotYW5kIGdpdmVuIGEgY2hhbmNlIHRvIHNheSB0aGF0IHRoZXkga25vdyB3aGF0IHRoZSBmaWxlbmFtZSBpcy4gTW9zdCBvZgotdGhlc2UgbW9kdWxlcyBkbyBpdCBpbiBhIGZhaXJseSBzaW1wbGUgZmFzaGlvbiAoZS5nLiB0aGUgY29yZSBtb2R1bGUKLWNvbmNhdGVuYXRlcyB0aGUgZG9jdW1lbnQgcm9vdCBhbmQgdGhlIFVSSSkgZXhjZXB0IGZvcgotPENPREU+bW9kX3Jld3JpdGU8L0NPREU+LCB3aGljaCBwcm92aWRlcyBlbm91Z2ggZnVuY3Rpb25hbGl0eSB0byBkbwotYWxsIHNvcnRzIG9mIHNpY2sgYW5kIHR3aXN0ZWQgdGhpbmdzIChsaWtlIGR5bmFtaWMgdmlydHVhbCBob3N0aW5nKS4KLU5vdGUgdGhhdCBiZWNhdXNlIG9mIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgbW9kdWxlcyBhcmUgY2FsbGVkLCB1c2luZwotYSA8Q09ERT5tb2RfcmV3cml0ZTwvQ09ERT4gY29uZmlndXJhdGlvbiB0aGF0IG1hdGNoZXMgYW55IFVSSSBtZWFucwotdGhhdCB0aGUgb3RoZXIgbW9kdWxlcyAocGFydGljdWxhcmx5IDxDT0RFPm1vZF9hbGlhczwvQ09ERT4pIHdpbGwKLWNlYXNlIHRvIGZ1bmN0aW9uLiBUaGUgZXhhbXBsZXMgYmVsb3cgc2hvdyBob3cgdG8gZGVhbCB3aXRoIHRoaXMuPC9QPgotCi08UD48U1RST05HPlRoZSBkeW5hbWljIHZpcnR1YWwgaG9zdGluZyBpZGVhIGlzIHZlcnkgc2ltcGxlOiB1c2UgdGhlCi1zZXJ2ZXIgbmFtZSBhcyB3ZWxsIGFzIHRoZSBVUkkgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZXNwb25kaW5nCi1maWxlbmFtZS48L1NUUk9ORz48L1A+Ci0KLQotPEhSPjxIMj48QSBOQU1FPSJzaW1wbGUiPlNpbXBsZSBuYW1lLWJhc2VkIGR5bmFtaWMgdmlydHVhbCBob3N0czwvQT48L0gyPgotCi08UD5UaGlzIGV4dHJhY3QgZnJvbSA8Q09ERT5odHRwZC5jb25mPC9DT0RFPiBpbXBsZW1lbnRzIHRoZSB2aXJ0dWFsCi1ob3N0IGFycmFuZ2VtZW50IG91dGxpbmVkIGluIHRoZSA8QSBIUkVGPSIjbW90aXZhdGlvbiI+TW90aXZhdGlvbjwvQT4KLXNlY3Rpb24gYWJvdmUsIGJ1dCBpbiBhIGdlbmVyaWMgZmFzaGlvbi48L1A+Ci0KLTxQPlRoZSBmaXJzdCBoYWxmIHNob3dzIHNvbWUgb3RoZXIgY29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgYXJlCi1uZWVkZWQgdG8gbWFrZSB0aGUgPENPREU+bW9kX3Jld3JpdGU8L0NPREU+IHBhcnQgd29yayBhcyBleHBlY3RlZDsgdGhlCi1zZWNvbmQgaGFsZiB1c2VzIDxDT0RFPm1vZF9yZXdyaXRlPC9DT0RFPiB0byBkbyB0aGUgYWN0dWFsIHdvcmsuIFNvbWUKLWNhcmUgaXMgdGFrZW4gdG8gZG8gYSBwZXItZHluYW1pYy12aXJ0dWFsLWhvc3QgZXF1aXZhbGVudCBvZgotPENPREU+U2NyaXB0QWxpYXM8L0NPREU+LjwvUD4KLQotPFBSRT4KLSMgZHluYW1pYyBTZXJ2ZXJOYW1lCi1Vc2VDYW5vbmljYWxOYW1lIE9mZgotCi0jIHNwbGl0dGFibGUgbG9ncwotTG9nRm9ybWF0ICIldiAlaCAlbCAldSAldCBcIiVyXCIgJXMgJWIiIHZjb21tb24KLUN1c3RvbUxvZyBsb2dzL2FjY2Vzc19sb2cgdmNvbW1vbgotCi0mbHQ7RGlyZWN0b3J5IC93d3cvaG9zdHMmZ3Q7Ci0JIyBFeGVjQ0dJIGlzIG5lZWRlZCBoZXJlIGJlY2F1c2Ugd2UgY2FuJ3QgZm9yY2UKLQkjIENHSSBleGVjdXRpb24gaW4gdGhlIHdheSB0aGF0IFNjcmlwdEFsaWFzIGRvZXMKLQlPcHRpb25zIEZvbGxvd1N5bUxpbmtzIEV4ZWNDR0kKLSZsdDsvRGlyZWN0b3J5Jmd0OwotCi0jIG5vdyBmb3IgdGhlIGhhcmQgYml0Ci0KLVJld3JpdGVFbmdpbmUgT24KLQotIyBhIFNlcnZlck5hbWUgZGVyaXZlZCBmcm9tIGEgSG9zdDogaGVhZGVyIG1heSBiZSBhbnkgY2FzZSBhdCBhbGwKLVJld3JpdGVNYXAgIGxvd2VyY2FzZSAgaW50OnRvbG93ZXIKLQotIyMgZGVhbCB3aXRoIG5vcm1hbCBkb2N1bWVudHMgZmlyc3Q6Ci0jIGFsbG93IEFsaWFzIC9pY29ucy8gdG8gd29yayAtIHJlcGVhdCBmb3Igb3RoZXIgYWxpYXNlcwotUmV3cml0ZUNvbmQgICV7UkVRVUVTVF9VUkl9ICAhXi9pY29ucy8KLSMgYWxsb3cgQ0dJcyB0byB3b3JrCi1SZXdyaXRlQ29uZCAgJXtSRVFVRVNUX1VSSX0gICFeL2NnaS1iaW4vCi0jIGRvIHRoZSBtYWdpYwotUmV3cml0ZVJ1bGUgIF4vKC4qKSQgIC93d3cvaG9zdHMvJHtsb3dlcmNhc2U6JXtTRVJWRVJfTkFNRX19L2RvY3MvJDEKLQotIyMgYW5kIG5vdyBkZWFsIHdpdGggQ0dJcyAtIHdlIGhhdmUgdG8gZm9yY2UgYSBNSU1FIHR5cGUKLVJld3JpdGVDb25kICAle1JFUVVFU1RfVVJJfSAgXi9jZ2ktYmluLwotUmV3cml0ZVJ1bGUgIF4vKC4qKSQgIC93d3cvaG9zdHMvJHtsb3dlcmNhc2U6JXtTRVJWRVJfTkFNRX19L2NnaS1iaW4vJDEgIFtUPWFwcGxpY2F0aW9uL3gtaHR0cGQtY2dpXQotCi0jIHRoYXQncyBpdCEKLTwvUFJFPgotCi0KLTxIUj48SDI+PEEgTkFNRT0iaG9tZXBhZ2VzIj5BIHZpcnR1YWxseSBob3N0ZWQgaG9tZXBhZ2VzIHN5c3RlbTwvQT48L0gyPgotCi08UD5UaGlzIGlzIGFuIGFkanVzdG1lbnQgb2YgdGhlIGFib3ZlIHN5c3RlbSB0YWlsb3JlZCBmb3IgYW4gSVNQJ3MKLWhvbWVwYWdlcyBzZXJ2ZXIuIFVzaW5nIHNsaWdodGx5IG1vcmUgY29tcGxpY2F0ZWQgcmV3cml0aW5nIHJ1bGVzIHdlCi1jYW4gc2VsZWN0IHN1YnN0cmluZ3Mgb2YgdGhlIHNlcnZlciBuYW1lIHRvIHVzZSBpbiB0aGUgZmlsZW5hbWUgc28KLXRoYXQgZS5nLiB0aGUgZG9jdW1lbnRzIGZvciA8U0FNUD53d3cudXNlci5pc3AuY29tPC9TQU1QPiBhcmUgZm91bmQgaW4KLTxDT0RFPi9ob21lL3VzZXIvPC9DT0RFPi4gSXQgdXNlcyBhIHNpbmdsZSA8Q09ERT5jZ2ktYmluPC9DT0RFPgotZGlyZWN0b3J5IGluc3RlYWQgb2Ygb25lIHBlciB2aXJ0dWFsIGhvc3QuPC9QPgotCi08UFJFPgotUmV3cml0ZUVuZ2luZSBvbgotCi1SZXdyaXRlTWFwICAgbG93ZXJjYXNlICBpbnQ6dG9sb3dlcgotCi0jIGFsbG93IENHSXMgdG8gd29yawotUmV3cml0ZUNvbmQgICV7UkVRVUVTVF9VUkl9ICAhXi9jZ2ktYmluLwotCi0jIGNoZWNrIHRoZSBob3N0bmFtZSBpcyByaWdodCBzbyB0aGF0IHRoZSBSZXdyaXRlUnVsZSB3b3JrcwotUmV3cml0ZUNvbmQgICR7bG93ZXJjYXNlOiV7SFRUUF9IT1NUfX0gIF53d3dcLlthLXotXStcLmlzcFwuY29tJAotCi0jIGNvbmNhdGVuYXRlIHRoZSB2aXJ0dWFsIGhvc3QgbmFtZSBvbnRvIHRoZSBzdGFydCBvZiB0aGUgVVJJCi0jIHRoZSBbQ10gbWVhbnMgZG8gdGhlIG5leHQgcmV3cml0ZSBvbiB0aGUgcmVzdWx0IG9mIHRoaXMgb25lCi1SZXdyaXRlUnVsZSAgXiguKykgICR7bG93ZXJjYXNlOiV7SFRUUF9IT1NUfX0kMSAgW0NdCi0KLSMgbm93IGNyZWF0ZSB0aGUgcmVhbCBmaWxlIG5hbWUKLVJld3JpdGVSdWxlICBed3d3XC4oW2Etei1dKylcLmlzcFwuY29tLyguKikgL2hvbWUvJDEvJDIKLQotIyBkZWZpbmUgdGhlIGdsb2JhbCBDR0kgZGlyZWN0b3J5Ci1TY3JpcHRBbGlhcyAgL2NnaS1iaW4vICAvd3d3L3N0ZC1jZ2kvCi08L1BSRT4KLQotCi08SFI+PEgyPjxBIE5BTUU9Inh0cmEtY29uZiI+VXNpbmcgYSBzZXBhcmF0ZSB2aXJ0dWFsIGhvc3QgY29uZmlndXJhdGlvbiBmaWxlPC9BPjwvSDI+Ci0KLTxQPlRoaXMgYXJyYW5nZW1lbnQgdXNlcyBhIHNlcGFyYXRlIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBzcGVjaWZ5IHRoZQotdHJhbnNsYXRpb24gZnJvbSB2aXJ0dWFsIGhvc3QgdG8gZG9jdW1lbnQgcm9vdC4gVGhpcyBwcm92aWRlcyBtb3JlCi1mbGV4aWJpbGl0eSBidXQgcmVxdWlyZXMgbW9yZSBjb25maWd1cmF0aW9uLjwvUD4KLQotPFA+VGhlIDxDT0RFPnZob3N0Lm1hcDwvQ09ERT4gZmlsZSBjb250YWlucyBzb21ldGhpbmcgbGlrZSB0aGlzOgotPFBSRT4KLXd3dy5jdXN0b21lci0xLmNvbSAgL3d3dy9jdXN0b21lcnMvMQotd3d3LmN1c3RvbWVyLTIuY29tICAvd3d3L2N1c3RvbWVycy8yCi0jIC4uLgotd3d3LmN1c3RvbWVyLU4uY29tICAvd3d3L2N1c3RvbWVycy9OCi08L1BSRT4KLTwvUD4KLQotPFA+VGhlIDxDT0RFPmh0dHAuY29uZjwvQ09ERT4gY29udGFpbnMgdGhpczoKLTxQUkU+Ci1SZXdyaXRlRW5naW5lIG9uCi0KLVJld3JpdGVNYXAgICBsb3dlcmNhc2UgIGludDp0b2xvd2VyCi0KLSMgZGVmaW5lIHRoZSBtYXAgZmlsZQotUmV3cml0ZU1hcCAgIHZob3N0ICAgICAgdHh0Oi93d3cvY29uZi92aG9zdC5tYXAKLQotIyBkZWFsIHdpdGggYWxpYXNlcyBhcyBhYm92ZQotUmV3cml0ZUNvbmQgICV7UkVRVUVTVF9VUkl9ICAgICAgICAgICAgICAgIV4vaWNvbnMvCi1SZXdyaXRlQ29uZCAgJXtSRVFVRVNUX1VSSX0gICAgICAgICAgICAgICAhXi9jZ2ktYmluLwotUmV3cml0ZUNvbmQgICR7bG93ZXJjYXNlOiV7U0VSVkVSX05BTUV9fSAgXiguKykkCi0jIHRoaXMgZG9lcyB0aGUgZmlsZS1iYXNlZCByZW1hcAotUmV3cml0ZUNvbmQgICR7dmhvc3Q6JTF9ICAgICAgICAgICAgICAgICAgXigvLiopJAotUmV3cml0ZVJ1bGUgIF4vKC4qKSQgICAgICAgICAgICAgICAgICAgICAgJTEvZG9jcy8kMQotCi1SZXdyaXRlQ29uZCAgJXtSRVFVRVNUX1VSSX0gICAgICAgICAgICAgICBeL2NnaS1iaW4vCi1SZXdyaXRlQ29uZCAgJHtsb3dlcmNhc2U6JXtTRVJWRVJfTkFNRX19ICBeKC4rKSQKLVJld3JpdGVDb25kICAke3Zob3N0OiUxfSAgICAgICAgICAgICAgICAgIF4oLy4qKSQKLVJld3JpdGVSdWxlICBeLyguKikkICAgICAgICAgICAgICAgICAgICAgICUxL2NnaS1iaW4vJDEKLTwvUFJFPgotPC9QPgotCi0KLTxIUj48SDI+PEEgTkFNRT0iY29tYmluYXRpb25zIj5Vc2luZyBtb3JlIHRoYW4gb25lIHZpcnR1YWwgaG9zdGluZyBzeXN0ZW0gb24gdGhlIHNhbWUgc2VydmVyPC9BPjwvSDI+Ci0KLTxQPldpdGggbW9yZSBjb21wbGljYXRlZCBzZXR1cHMsIHlvdSBjYW4gdXNlIEFwYWNoZSdzIG5vcm1hbAotPENPREU+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvQ09ERT4gZGlyZWN0aXZlcyB0byBjb250cm9sIHRoZSBzY29wZSBvZgotdGhlIHZhcmlvdXMgcmV3cml0ZSBjb25maWd1cmF0aW9ucy4gRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCBoYXZlIG9uZSBJUAotYWRkcmVzcyBmb3IgaG9tZXBhZ2VzIGN1c3RvbWVycyBhbmQgYW5vdGhlciBmb3IgY29tbWVyY2lhbCBjdXN0b21lcnMKLXdpdGggdGhlIGZvbGxvd2luZyBzZXR1cC4gVGhpcyBjYW4gb2YgY291cnNlIGJlIGNvbWJpbmVkIHdpdGgKLWNvbnZlbnRpYWwgPENPREU+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvQ09ERT4gY29uZmlndXJhdGlvbgotc2VjdGlvbnMuPC9QPgotCi08UFJFPgotVXNlQ2Fub25pY2FsTmFtZSBPZmYKLQotTG9nRm9ybWF0ICIldiAlaCAlbCAldSAldCBcIiVyXCIgJXMgJWIiIHZjb21tb24KLUN1c3RvbUxvZyBsb2dzL2FjY2Vzc19sb2cgdmNvbW1vbgotCi0mbHQ7RGlyZWN0b3J5IC93d3cvY29tbWVyY2lhbCZndDsKLQlPcHRpb25zIEZvbGxvd1N5bUxpbmtzIEV4ZWNDR0kKLQlBbGxvd092ZXJyaWRlIEFsbAotJmx0Oy9EaXJlY3RvcnkmZ3Q7Ci0KLSZsdDtEaXJlY3RvcnkgL3d3dy9ob21lcGFnZXMmZ3Q7Ci0JT3B0aW9ucyBGb2xsb3dTeW1MaW5rcwotCUFsbG93T3ZlcnJpZGUgTm9uZQotJmx0Oy9EaXJlY3RvcnkmZ3Q7Ci0KLSZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQmZ3Q7Ci0JU2VydmVyTmFtZSB3d3cuY29tbWVyY2lhbC5pc3AuY29tCi0KLQlSZXdyaXRlRW5naW5lIE9uCi0JUmV3cml0ZU1hcCAgICBsb3dlcmNhc2UgIGludDp0b2xvd2VyCi0KLQlSZXdyaXRlQ29uZCAgICV7UkVRVUVTVF9VUkl9ICAhXi9pY29ucy8KLQlSZXdyaXRlQ29uZCAgICV7UkVRVUVTVF9VUkl9ICAhXi9jZ2ktYmluLwotCVJld3JpdGVSdWxlICAgXi8oLiopJCAgL3d3dy9jb21tZXJjaWFsLyR7bG93ZXJjYXNlOiV7U0VSVkVSX05BTUV9fS9kb2NzLyQxCi0KLQlSZXdyaXRlQ29uZCAgICV7UkVRVUVTVF9VUkl9ICBeL2NnaS1iaW4vCi0JUmV3cml0ZVJ1bGUgICBeLyguKikkICAvd3d3L2NvbW1lcmNpYWwvJHtsb3dlcmNhc2U6JXtTRVJWRVJfTkFNRX19L2NnaS1iaW4vJDEgIFtUPWFwcGxpY2F0aW9uL3gtaHR0cGQtY2dpXQotJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLQotJmx0O1ZpcnR1YWxIb3N0IDExMS4yMi4zMy40NSZndDsKLQlTZXJ2ZXJOYW1lIHd3dy5ob21lcGFnZXMuaXNwLmNvbQotCi0JUmV3cml0ZUVuZ2luZSBvbgotCVJld3JpdGVNYXAgICAgbG93ZXJjYXNlICBpbnQ6dG9sb3dlcgotCi0JUmV3cml0ZUNvbmQgICAle1JFUVVFU1RfVVJJfSAgIV4vY2dpLWJpbi8KLQotCVJld3JpdGVDb25kICAgJHtsb3dlcmNhc2U6JXtIVFRQX0hPU1R9fSAgXnd3d1wuW2Etei1dK1wuaXNwXC5jb20kCi0JUmV3cml0ZVJ1bGUgICBeKC4rKSAgJHtsb3dlcmNhc2U6JXtIVFRQX0hPU1R9fSQxICBbQ10KLQlSZXdyaXRlUnVsZSAgIF53d3dcLihbYS16LV0rKVwuaXNwXC5jb20vKC4qKSAvd3d3L2hvbWVwYWdlcy8kMS8kMgotCi0JU2NyaXB0QWxpYXMgICAvY2dpLWJpbi8gL3d3dy9zdGQtY2dpLwotJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLTwvUFJFPgotCi0KLTxIUj4KLQotPEgzIEFMSUdOPSJDRU5URVIiPgotIEFwYWNoZSBIVFRQIFNlcnZlciBWZXJzaW9uIDEuMwotPC9IMz4KLQotPEEgSFJFRj0iLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvaW5kZXguZ2lmIiBBTFQ9IkluZGV4Ij48L0E+Ci08QSBIUkVGPSIuLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvaG9tZS5naWYiIEFMVD0iSG9tZSI+PC9BPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC92aG9zdHMvbmFtZS1iYXNlZC5odG1sIGIvZG9jcy9tYW51YWwvdmhvc3RzL25hbWUtYmFzZWQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2ZGQ1Zi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC92aG9zdHMvbmFtZS1iYXNlZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxodG1sPjxoZWFkPgotPHRpdGxlPkFwYWNoZSBuYW1lLWJhc2VkIFZpcnR1YWwgSG9zdHM8L3RpdGxlPgotPC9oZWFkPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxoMSBBTElHTj0iQ0VOVEVSIj5BcGFjaGUgbmFtZS1iYXNlZCBWaXJ0dWFsIEhvc3QgU3VwcG9ydDwvaDE+Ci0KLTxzdHJvbmc+U2VlIEFsc286PC9zdHJvbmc+Ci08YSBocmVmPSJpcC1iYXNlZC5odG1sIj5JUC1iYXNlZCBWaXJ0dWFsIEhvc3QgU3VwcG9ydDwvYT4KLQotPGhyPgotCi08aDI+TmFtZS1iYXNlZCB2cy4gSVAtYmFzZWQgdmlydHVhbCBob3N0czwvaDI+Ci0KLTxwPldoaWxlIHRoZSBhcHByb2FjaCB3aXRoIElQLWJhc2VkIHZpcnR1YWwgaG9zdHMgd29ya3Mgc3RpbGwgdmVyeSB3ZWxsLAotaXQgaXMgbm90IHRoZSBtb3N0IGVsZWdhbnQgc29sdXRpb24sIGJlY2F1c2UgYSBkZWRpY2F0ZWQgSVAgYWRkcmVzcwotaXMgbmVlZGVkIGZvciBldmVyeSB2aXJ0dWFsIGhvc3QgYW5kIGl0IGlzIGhhcmQgdG8gaW1wbGVtZW50IG9uIHNvbWUKLW1hY2hpbmVzLiBUaGUgPGNvZGU+SFRUUC8xLjE8L2NvZGU+IHByb3RvY29sIGNvbnRhaW5zIGEgbWV0aG9kIGZvciB0aGUKLXNlcnZlciB0byBpZGVudGlmeSB3aGF0IG5hbWUgaXQgaXMgYmVpbmcgYWRkcmVzc2VkIGFzLiBBcGFjaGUgMS4xIGFuZAotbGF0ZXIgc3VwcG9ydCB0aGlzIGFwcHJvYWNoIGFzIHdlbGwgYXMgdGhlIHRyYWRpdGlvbmFsCi1JUC1hZGRyZXNzLXBlci1ob3N0bmFtZSBtZXRob2QuPC9wPgotCi08cD5UaGUgYmVuZWZpdHMgb2YgdXNpbmcgdGhlIG5ldyBuYW1lLWJhc2VkIHZpcnR1YWwgaG9zdCBzdXBwb3J0IGlzIGEKLXByYWN0aWNhbGx5IHVubGltaXRlZCBudW1iZXIgb2Ygc2VydmVycywgZWFzZSBvZiBjb25maWd1cmF0aW9uIGFuZCB1c2UsIGFuZAotcmVxdWlyZXMgbm8gYWRkaXRpb25hbCBoYXJkd2FyZSBvciBzb2Z0d2FyZS4gCi1UaGUgbWFpbiBkaXNhZHZhbnRhZ2UgaXMgdGhhdCB0aGUgY2xpZW50IG11c3Qgc3VwcG9ydCB0aGlzIHBhcnQgb2YgdGhlCi1wcm90b2NvbC4gVGhlIGxhdGVzdCB2ZXJzaW9ucyBvZiBtb3N0IGJyb3dzZXJzIGRvLCBidXQgdGhlcmUgYXJlIHN0aWxsCi1vbGQgYnJvd3NlcnMgaW4gdXNlIHdobyBkbyBub3QuIFRoaXMgY2FuIGNhdXNlIHByb2JsZW1zLCBhbHRob3VnaCBhIHBvc3NpYmxlCi1zb2x1dGlvbiBpcyBhZGRyZXNzZWQgYmVsb3cuPC9wPgotCi08aDI+VXNpbmcgbm9uLUlQIFZpcnR1YWwgSG9zdHM8L2gyPgotCi08cD5Vc2luZyB0aGUgbmV3IHZpcnR1YWwgaG9zdHMgaXMgcXVpdGUgZWFzeSwgYW5kIHN1cGVyZmljaWFsbHkgbG9va3MKLWxpa2UgdGhlIG9sZCBtZXRob2QuIFlvdSBzaW1wbHkgYWRkIHRvIG9uZSBvZiB0aGUgQXBhY2hlIGNvbmZpZ3VyYXRpb24KLWZpbGVzIChtb3N0IGxpa2VseSA8Y29kZT5odHRwZC5jb25mPC9jb2RlPiBvciA8Y29kZT5zcm0uY29uZjwvY29kZT4pCi1jb2RlIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZzo8L3A+Ci08cHJlPgotICAgIE5hbWVWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQKLQotICAgICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQmZ3Q7Ci0gICAgU2VydmVyTmFtZSB3d3cuZG9tYWluLnRsZAotICAgIERvY3VtZW50Um9vdCAvd2ViL2RvbWFpbgotICAgICZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci08L3ByZT4KLQotPHA+VGhlIG5vdGFibGUgZGlmZmVyZW5jZSBiZXR3ZWVuIElQLWJhc2VkIGFuZCBuYW1lLWJhc2VkIHZpcnR1YWwgaG9zdAotY29uZmlndXJhdGlvbiBpcyB0aGUKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjbmFtZXZpcnR1YWxob3N0Ij48Y29kZT5OYW1lVmlydHVhbEhvc3Q8L2NvZGU+PC9BPgotZGlyZWN0aXZlIHdoaWNoIHNwZWNpZmllcyBhbnkgSVAgYWRkcmVzcyB0aGF0IHNob3VsZCBiZSB1c2VkIGFzIGEgdGFyZ2V0IGZvcgotbmFtZS1iYXNlZCB2aXJ0dWFsIGhvc3RzLgotCi08cD5PZiBjb3Vyc2UsIGFueSBhZGRpdGlvbmFsIGRpcmVjdGl2ZXMgY2FuIChhbmQgc2hvdWxkKSBiZSBwbGFjZWQKLWludG8gdGhlIDxjb2RlPiZsdDtWaXJ0dWFsSG9zdCZndDs8L2NvZGU+IHNlY3Rpb24uIFRvIG1ha2UgdGhpcyB3b3JrLAotYWxsIHRoYXQgaXMgbmVlZGVkIGlzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBuYW1lCi08c2FtcD53d3cuZG9tYWluLnRsZDwvc2FtcD4gaXMgYW4gYWxpYXMgKENOQU1FKSBwb2ludGluZyB0byB0aGUgSVAgYWRkcmVzcwotPHNhbXA+MTExLjIyLjMzLjQ0PC9zYW1wPjwvcD4KLQotPHA+QWRkaXRpb25hbGx5LCBtYW55IHNlcnZlcnMgbWF5IHdpc2ggdG8gYmUgYWNjZXNzaWJsZSBieSBtb3JlIHRoYW4KLW9uZSBuYW1lLiBGb3IgZXhhbXBsZSwgdGhlIGV4YW1wbGUgc2VydmVyIG1pZ2h0IHdhbnQgdG8gYmUgYWNjZXNzaWJsZQotYXMgPGNvZGU+ZG9tYWluLnRsZDwvY29kZT4sIG9yIDxjb2RlPnd3dzIuZG9tYWluLnRsZDwvY29kZT4sIGFzc3VtaW5nCi10aGUgSVAgYWRkcmVzc2VzIHBvaW50ZWQgdG8gdGhlIHNhbWUgc2VydmVyLiBJbiBmYWN0LCBvbmUgbWlnaHQgd2FudCBpdAotc28gdGhhdCBhbGwgYWRkcmVzc2VzIGF0IDxjb2RlPmRvbWFpbi50bGQ8L2NvZGU+IHdlcmUgcGlja2VkIHVwIGJ5IHRoZQotc2VydmVyLiBUaGlzIGlzIHBvc3NpYmxlIHdpdGggdGhlCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcmFsaWFzIj48Y29kZT5TZXJ2ZXJBbGlhczwvY29kZT48L0E+Ci1kaXJlY3RpdmUsIHBsYWNlZCBpbnNpZGUgdGhlICZsdDtWaXJ0dWFsSG9zdCZndDsgc2VjdGlvbi4gRm9yCi1leGFtcGxlOjwvcD4KLQotPHByZT4KLSAgICBTZXJ2ZXJBbGlhcyBkb21haW4udGxkICouZG9tYWluLnRsZAotPC9wcmU+Ci0KLTxwPk5vdGUgdGhhdCB5b3UgY2FuIHVzZSA8Y29kZT4qPC9jb2RlPiBhbmQgPGNvZGU+PzwvY29kZT4gYXMgd2lsZC1jYXJkCi1jaGFyYWN0ZXJzLjwvcD4KLQotPHA+WW91IGFsc28gbWlnaHQgbmVlZCA8Y29kZT5TZXJ2ZXJBbGlhczwvY29kZT4gaWYgeW91IGFyZQotc2VydmluZyBsb2NhbCB1c2VycyB3aG8gZG8gbm90IGFsd2F5cyBpbmNsdWRlIHRoZSBkb21haW4gbmFtZS4KLUZvciBleGFtcGxlLCBpZiBsb2NhbCB1c2VycyBhcmUKLWZhbWlsaWFyIHdpdGggdHlwaW5nICJ3d3ciIG9yICJ3d3cuZm9vYmFyIiB0aGVuIHlvdSB3aWxsIG5lZWQgdG8gYWRkCi08Y29kZT5TZXJ2ZXJBbGlhcyB3d3cgd3d3LmZvb2JhcjwvY29kZT4uICBJdCBpc24ndCBwb3NzaWJsZSBmb3IgdGhlCi1zZXJ2ZXIgdG8ga25vdyB3aGF0IGRvbWFpbiB0aGUgY2xpZW50IHVzZXMgZm9yIHRoZWlyIG5hbWUgcmVzb2x1dGlvbgotYmVjYXVzZSB0aGUgY2xpZW50IGRvZXNuJ3QgcHJvdmlkZSB0aGF0IGluZm9ybWF0aW9uIGluIHRoZSByZXF1ZXN0LjwvcD4KLQotPGgyPkNvbXBhdGliaWxpdHkgd2l0aCBPbGRlciBCcm93c2VyczwvaDI+Ci0KLTxwPkFzIG1lbnRpb25lZCBlYXJsaWVyLCB0aGVyZSBhcmUgc3RpbGwgc29tZSBjbGllbnRzIGluIHVzZSB3aG8KLWRvIG5vdCBzZW5kIHRoZSByZXF1aXJlZCBkYXRhIGZvciB0aGUgbmFtZS1iYXNlZCB2aXJ0dWFsIGhvc3RzIHRvIHdvcmsKLXByb3Blcmx5LiBUaGVzZSBjbGllbnRzIHdpbGwgYWx3YXlzIGJlIHNlbnQgdGhlIHBhZ2VzIGZyb20gdGhlCi08Y2l0ZT5wcmltYXJ5PC9jaXRlPiBuYW1lLWJhc2VkIHZpcnR1YWwgaG9zdCAodGhlIGZpcnN0IHZpcnR1YWwgaG9zdAotYXBwZWFyaW5nIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIGEgc3BlY2lmaWMgSVAgYWRkcmVzcykuPC9wPgotCi08cD5UaGVyZSBpcyBhIHBvc3NpYmxlIHdvcmthcm91bmQgd2l0aCB0aGUKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjc2VydmVycGF0aCI+PGNvZGU+U2VydmVyUGF0aDwvY29kZT48L0E+Ci1kaXJlY3RpdmUsIGFsYmVpdCBhIHNsaWdodGx5IGN1bWJlcnNvbWUgb25lOjwvcD4KLQotPHA+RXhhbXBsZSBjb25maWd1cmF0aW9uOgotCi08cHJlPgotICAgIE5hbWVWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQKLQotICAgICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQmZ3Q7Ci0gICAgU2VydmVyTmFtZSB3d3cuZG9tYWluLnRsZAotICAgIFNlcnZlclBhdGggL2RvbWFpbgotICAgIERvY3VtZW50Um9vdCAvd2ViL2RvbWFpbgotICAgICZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci08L3ByZT4KLQotPHA+V2hhdCBkb2VzIHRoaXMgbWVhbj8gSXQgbWVhbnMgdGhhdCBhIHJlcXVlc3QgZm9yIGFueSBVUkkgYmVnaW5uaW5nCi13aXRoICI8c2FtcD4vZG9tYWluPC9zYW1wPiIgd2lsbCBiZSBzZXJ2ZWQgZnJvbSB0aGUgdmlydHVhbCBob3N0Ci08c2FtcD53d3cuZG9tYWluLnRsZDwvc2FtcD4gVGhpcyBtZWFucyB0aGF0IHRoZSBwYWdlcyBjYW4gYmUgYWNjZXNzZWQgYXMKLTxjb2RlPmh0dHA6Ly93d3cuZG9tYWluLnRsZC9kb21haW4vPC9jb2RlPiBmb3IgYWxsIGNsaWVudHMsIGFsdGhvdWdoCi1jbGllbnRzIHNlbmRpbmcgYSA8c2FtcD5Ib3N0Ojwvc2FtcD4gaGVhZGVyIGNhbiBhbHNvIGFjY2VzcyBpdCBhcwotPGNvZGU+aHR0cDovL3d3dy5kb21haW4udGxkLzwvY29kZT4uPC9wPgotCi08cD5JbiBvcmRlciB0byBtYWtlIHRoaXMgd29yaywgcHV0IGEgbGluayBvbiB5b3VyIHByaW1hcnkgdmlydHVhbCBob3N0J3MgcGFnZQotdG8gPHNhbXA+aHR0cDovL3d3dy5kb21haW4udGxkL2RvbWFpbi88L3NhbXA+Ci1UaGVuLCBpbiB0aGUgdmlydHVhbCBob3N0J3MgcGFnZXMsIGJlIHN1cmUgdG8gdXNlIGVpdGhlciBwdXJlbHkKLXJlbGF0aXZlIGxpbmtzIChlLmcuICI8c2FtcD5maWxlLmh0bWw8L3NhbXA+IiBvcgotIjxzYW1wPi4uL2ljb25zL2ltYWdlLmdpZjwvc2FtcD4iIG9yIGxpbmtzIGNvbnRhaW5pbmcgdGhlIHByZWZhY2luZwotPHNhbXA+L2RvbWFpbi88L3NhbXA+Ci0oZS5nLiAiPHNhbXA+aHR0cDovL3d3dy5kb21haW4udGxkL2RvbWFpbi9taXNjL2ZpbGUuaHRtbDwvc2FtcD4iIG9yCi0iPHNhbXA+L2RvbWFpbi9taXNjL2ZpbGUuaHRtbDwvc2FtcD4iKS48L3A+Ci0KLTxwPlRoaXMgcmVxdWlyZXMgYSBiaXQgb2YKLWRpc2NpcGxpbmUsIGJ1dCBhZGhlcmVuY2UgdG8gdGhlc2UgZ3VpZGVsaW5lcyB3aWxsLCBmb3IgdGhlIG1vc3QgcGFydCwKLWVuc3VyZSB0aGF0IHlvdXIgcGFnZXMgd2lsbCB3b3JrIHdpdGggYWxsIGJyb3dzZXJzLCBuZXcgYW5kIG9sZC48L3A+Ci0KLTxwPlNlZSBhbHNvOiA8QSBIUkVGPSJleGFtcGxlcy5odG1sI3NlcnZlcnBhdGgiPlNlcnZlclBhdGggY29uZmlndXJhdGlvbgotZXhhbXBsZTwvQT48L3A+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC92aG9zdHMvbmFtZS1iYXNlZC5odG1sLmVuIGIvZG9jcy9tYW51YWwvdmhvc3RzL25hbWUtYmFzZWQuaHRtbC5lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2ZGQ1Zi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC92aG9zdHMvbmFtZS1iYXNlZC5odG1sLmVuCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxodG1sPjxoZWFkPgotPHRpdGxlPkFwYWNoZSBuYW1lLWJhc2VkIFZpcnR1YWwgSG9zdHM8L3RpdGxlPgotPC9oZWFkPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxoMSBBTElHTj0iQ0VOVEVSIj5BcGFjaGUgbmFtZS1iYXNlZCBWaXJ0dWFsIEhvc3QgU3VwcG9ydDwvaDE+Ci0KLTxzdHJvbmc+U2VlIEFsc286PC9zdHJvbmc+Ci08YSBocmVmPSJpcC1iYXNlZC5odG1sIj5JUC1iYXNlZCBWaXJ0dWFsIEhvc3QgU3VwcG9ydDwvYT4KLQotPGhyPgotCi08aDI+TmFtZS1iYXNlZCB2cy4gSVAtYmFzZWQgdmlydHVhbCBob3N0czwvaDI+Ci0KLTxwPldoaWxlIHRoZSBhcHByb2FjaCB3aXRoIElQLWJhc2VkIHZpcnR1YWwgaG9zdHMgd29ya3Mgc3RpbGwgdmVyeSB3ZWxsLAotaXQgaXMgbm90IHRoZSBtb3N0IGVsZWdhbnQgc29sdXRpb24sIGJlY2F1c2UgYSBkZWRpY2F0ZWQgSVAgYWRkcmVzcwotaXMgbmVlZGVkIGZvciBldmVyeSB2aXJ0dWFsIGhvc3QgYW5kIGl0IGlzIGhhcmQgdG8gaW1wbGVtZW50IG9uIHNvbWUKLW1hY2hpbmVzLiBUaGUgPGNvZGU+SFRUUC8xLjE8L2NvZGU+IHByb3RvY29sIGNvbnRhaW5zIGEgbWV0aG9kIGZvciB0aGUKLXNlcnZlciB0byBpZGVudGlmeSB3aGF0IG5hbWUgaXQgaXMgYmVpbmcgYWRkcmVzc2VkIGFzLiBBcGFjaGUgMS4xIGFuZAotbGF0ZXIgc3VwcG9ydCB0aGlzIGFwcHJvYWNoIGFzIHdlbGwgYXMgdGhlIHRyYWRpdGlvbmFsCi1JUC1hZGRyZXNzLXBlci1ob3N0bmFtZSBtZXRob2QuPC9wPgotCi08cD5UaGUgYmVuZWZpdHMgb2YgdXNpbmcgdGhlIG5ldyBuYW1lLWJhc2VkIHZpcnR1YWwgaG9zdCBzdXBwb3J0IGlzIGEKLXByYWN0aWNhbGx5IHVubGltaXRlZCBudW1iZXIgb2Ygc2VydmVycywgZWFzZSBvZiBjb25maWd1cmF0aW9uIGFuZCB1c2UsIGFuZAotcmVxdWlyZXMgbm8gYWRkaXRpb25hbCBoYXJkd2FyZSBvciBzb2Z0d2FyZS4gCi1UaGUgbWFpbiBkaXNhZHZhbnRhZ2UgaXMgdGhhdCB0aGUgY2xpZW50IG11c3Qgc3VwcG9ydCB0aGlzIHBhcnQgb2YgdGhlCi1wcm90b2NvbC4gVGhlIGxhdGVzdCB2ZXJzaW9ucyBvZiBtb3N0IGJyb3dzZXJzIGRvLCBidXQgdGhlcmUgYXJlIHN0aWxsCi1vbGQgYnJvd3NlcnMgaW4gdXNlIHdobyBkbyBub3QuIFRoaXMgY2FuIGNhdXNlIHByb2JsZW1zLCBhbHRob3VnaCBhIHBvc3NpYmxlCi1zb2x1dGlvbiBpcyBhZGRyZXNzZWQgYmVsb3cuPC9wPgotCi08aDI+VXNpbmcgbm9uLUlQIFZpcnR1YWwgSG9zdHM8L2gyPgotCi08cD5Vc2luZyB0aGUgbmV3IHZpcnR1YWwgaG9zdHMgaXMgcXVpdGUgZWFzeSwgYW5kIHN1cGVyZmljaWFsbHkgbG9va3MKLWxpa2UgdGhlIG9sZCBtZXRob2QuIFlvdSBzaW1wbHkgYWRkIHRvIG9uZSBvZiB0aGUgQXBhY2hlIGNvbmZpZ3VyYXRpb24KLWZpbGVzIChtb3N0IGxpa2VseSA8Y29kZT5odHRwZC5jb25mPC9jb2RlPiBvciA8Y29kZT5zcm0uY29uZjwvY29kZT4pCi1jb2RlIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZzo8L3A+Ci08cHJlPgotICAgIE5hbWVWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQKLQotICAgICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQmZ3Q7Ci0gICAgU2VydmVyTmFtZSB3d3cuZG9tYWluLnRsZAotICAgIERvY3VtZW50Um9vdCAvd2ViL2RvbWFpbgotICAgICZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci08L3ByZT4KLQotPHA+VGhlIG5vdGFibGUgZGlmZmVyZW5jZSBiZXR3ZWVuIElQLWJhc2VkIGFuZCBuYW1lLWJhc2VkIHZpcnR1YWwgaG9zdAotY29uZmlndXJhdGlvbiBpcyB0aGUKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjbmFtZXZpcnR1YWxob3N0Ij48Y29kZT5OYW1lVmlydHVhbEhvc3Q8L2NvZGU+PC9BPgotZGlyZWN0aXZlIHdoaWNoIHNwZWNpZmllcyBhbnkgSVAgYWRkcmVzcyB0aGF0IHNob3VsZCBiZSB1c2VkIGFzIGEgdGFyZ2V0IGZvcgotbmFtZS1iYXNlZCB2aXJ0dWFsIGhvc3RzLgotCi08cD5PZiBjb3Vyc2UsIGFueSBhZGRpdGlvbmFsIGRpcmVjdGl2ZXMgY2FuIChhbmQgc2hvdWxkKSBiZSBwbGFjZWQKLWludG8gdGhlIDxjb2RlPiZsdDtWaXJ0dWFsSG9zdCZndDs8L2NvZGU+IHNlY3Rpb24uIFRvIG1ha2UgdGhpcyB3b3JrLAotYWxsIHRoYXQgaXMgbmVlZGVkIGlzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBuYW1lCi08c2FtcD53d3cuZG9tYWluLnRsZDwvc2FtcD4gaXMgYW4gYWxpYXMgKENOQU1FKSBwb2ludGluZyB0byB0aGUgSVAgYWRkcmVzcwotPHNhbXA+MTExLjIyLjMzLjQ0PC9zYW1wPjwvcD4KLQotPHA+QWRkaXRpb25hbGx5LCBtYW55IHNlcnZlcnMgbWF5IHdpc2ggdG8gYmUgYWNjZXNzaWJsZSBieSBtb3JlIHRoYW4KLW9uZSBuYW1lLiBGb3IgZXhhbXBsZSwgdGhlIGV4YW1wbGUgc2VydmVyIG1pZ2h0IHdhbnQgdG8gYmUgYWNjZXNzaWJsZQotYXMgPGNvZGU+ZG9tYWluLnRsZDwvY29kZT4sIG9yIDxjb2RlPnd3dzIuZG9tYWluLnRsZDwvY29kZT4sIGFzc3VtaW5nCi10aGUgSVAgYWRkcmVzc2VzIHBvaW50ZWQgdG8gdGhlIHNhbWUgc2VydmVyLiBJbiBmYWN0LCBvbmUgbWlnaHQgd2FudCBpdAotc28gdGhhdCBhbGwgYWRkcmVzc2VzIGF0IDxjb2RlPmRvbWFpbi50bGQ8L2NvZGU+IHdlcmUgcGlja2VkIHVwIGJ5IHRoZQotc2VydmVyLiBUaGlzIGlzIHBvc3NpYmxlIHdpdGggdGhlCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcmFsaWFzIj48Y29kZT5TZXJ2ZXJBbGlhczwvY29kZT48L0E+Ci1kaXJlY3RpdmUsIHBsYWNlZCBpbnNpZGUgdGhlICZsdDtWaXJ0dWFsSG9zdCZndDsgc2VjdGlvbi4gRm9yCi1leGFtcGxlOjwvcD4KLQotPHByZT4KLSAgICBTZXJ2ZXJBbGlhcyBkb21haW4udGxkICouZG9tYWluLnRsZAotPC9wcmU+Ci0KLTxwPk5vdGUgdGhhdCB5b3UgY2FuIHVzZSA8Y29kZT4qPC9jb2RlPiBhbmQgPGNvZGU+PzwvY29kZT4gYXMgd2lsZC1jYXJkCi1jaGFyYWN0ZXJzLjwvcD4KLQotPHA+WW91IGFsc28gbWlnaHQgbmVlZCA8Y29kZT5TZXJ2ZXJBbGlhczwvY29kZT4gaWYgeW91IGFyZQotc2VydmluZyBsb2NhbCB1c2VycyB3aG8gZG8gbm90IGFsd2F5cyBpbmNsdWRlIHRoZSBkb21haW4gbmFtZS4KLUZvciBleGFtcGxlLCBpZiBsb2NhbCB1c2VycyBhcmUKLWZhbWlsaWFyIHdpdGggdHlwaW5nICJ3d3ciIG9yICJ3d3cuZm9vYmFyIiB0aGVuIHlvdSB3aWxsIG5lZWQgdG8gYWRkCi08Y29kZT5TZXJ2ZXJBbGlhcyB3d3cgd3d3LmZvb2JhcjwvY29kZT4uICBJdCBpc24ndCBwb3NzaWJsZSBmb3IgdGhlCi1zZXJ2ZXIgdG8ga25vdyB3aGF0IGRvbWFpbiB0aGUgY2xpZW50IHVzZXMgZm9yIHRoZWlyIG5hbWUgcmVzb2x1dGlvbgotYmVjYXVzZSB0aGUgY2xpZW50IGRvZXNuJ3QgcHJvdmlkZSB0aGF0IGluZm9ybWF0aW9uIGluIHRoZSByZXF1ZXN0LjwvcD4KLQotPGgyPkNvbXBhdGliaWxpdHkgd2l0aCBPbGRlciBCcm93c2VyczwvaDI+Ci0KLTxwPkFzIG1lbnRpb25lZCBlYXJsaWVyLCB0aGVyZSBhcmUgc3RpbGwgc29tZSBjbGllbnRzIGluIHVzZSB3aG8KLWRvIG5vdCBzZW5kIHRoZSByZXF1aXJlZCBkYXRhIGZvciB0aGUgbmFtZS1iYXNlZCB2aXJ0dWFsIGhvc3RzIHRvIHdvcmsKLXByb3Blcmx5LiBUaGVzZSBjbGllbnRzIHdpbGwgYWx3YXlzIGJlIHNlbnQgdGhlIHBhZ2VzIGZyb20gdGhlCi08Y2l0ZT5wcmltYXJ5PC9jaXRlPiBuYW1lLWJhc2VkIHZpcnR1YWwgaG9zdCAodGhlIGZpcnN0IHZpcnR1YWwgaG9zdAotYXBwZWFyaW5nIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIGEgc3BlY2lmaWMgSVAgYWRkcmVzcykuPC9wPgotCi08cD5UaGVyZSBpcyBhIHBvc3NpYmxlIHdvcmthcm91bmQgd2l0aCB0aGUKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjc2VydmVycGF0aCI+PGNvZGU+U2VydmVyUGF0aDwvY29kZT48L0E+Ci1kaXJlY3RpdmUsIGFsYmVpdCBhIHNsaWdodGx5IGN1bWJlcnNvbWUgb25lOjwvcD4KLQotPHA+RXhhbXBsZSBjb25maWd1cmF0aW9uOgotCi08cHJlPgotICAgIE5hbWVWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQKLQotICAgICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQmZ3Q7Ci0gICAgU2VydmVyTmFtZSB3d3cuZG9tYWluLnRsZAotICAgIFNlcnZlclBhdGggL2RvbWFpbgotICAgIERvY3VtZW50Um9vdCAvd2ViL2RvbWFpbgotICAgICZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci08L3ByZT4KLQotPHA+V2hhdCBkb2VzIHRoaXMgbWVhbj8gSXQgbWVhbnMgdGhhdCBhIHJlcXVlc3QgZm9yIGFueSBVUkkgYmVnaW5uaW5nCi13aXRoICI8c2FtcD4vZG9tYWluPC9zYW1wPiIgd2lsbCBiZSBzZXJ2ZWQgZnJvbSB0aGUgdmlydHVhbCBob3N0Ci08c2FtcD53d3cuZG9tYWluLnRsZDwvc2FtcD4gVGhpcyBtZWFucyB0aGF0IHRoZSBwYWdlcyBjYW4gYmUgYWNjZXNzZWQgYXMKLTxjb2RlPmh0dHA6Ly93d3cuZG9tYWluLnRsZC9kb21haW4vPC9jb2RlPiBmb3IgYWxsIGNsaWVudHMsIGFsdGhvdWdoCi1jbGllbnRzIHNlbmRpbmcgYSA8c2FtcD5Ib3N0Ojwvc2FtcD4gaGVhZGVyIGNhbiBhbHNvIGFjY2VzcyBpdCBhcwotPGNvZGU+aHR0cDovL3d3dy5kb21haW4udGxkLzwvY29kZT4uPC9wPgotCi08cD5JbiBvcmRlciB0byBtYWtlIHRoaXMgd29yaywgcHV0IGEgbGluayBvbiB5b3VyIHByaW1hcnkgdmlydHVhbCBob3N0J3MgcGFnZQotdG8gPHNhbXA+aHR0cDovL3d3dy5kb21haW4udGxkL2RvbWFpbi88L3NhbXA+Ci1UaGVuLCBpbiB0aGUgdmlydHVhbCBob3N0J3MgcGFnZXMsIGJlIHN1cmUgdG8gdXNlIGVpdGhlciBwdXJlbHkKLXJlbGF0aXZlIGxpbmtzIChlLmcuICI8c2FtcD5maWxlLmh0bWw8L3NhbXA+IiBvcgotIjxzYW1wPi4uL2ljb25zL2ltYWdlLmdpZjwvc2FtcD4iIG9yIGxpbmtzIGNvbnRhaW5pbmcgdGhlIHByZWZhY2luZwotPHNhbXA+L2RvbWFpbi88L3NhbXA+Ci0oZS5nLiAiPHNhbXA+aHR0cDovL3d3dy5kb21haW4udGxkL2RvbWFpbi9taXNjL2ZpbGUuaHRtbDwvc2FtcD4iIG9yCi0iPHNhbXA+L2RvbWFpbi9taXNjL2ZpbGUuaHRtbDwvc2FtcD4iKS48L3A+Ci0KLTxwPlRoaXMgcmVxdWlyZXMgYSBiaXQgb2YKLWRpc2NpcGxpbmUsIGJ1dCBhZGhlcmVuY2UgdG8gdGhlc2UgZ3VpZGVsaW5lcyB3aWxsLCBmb3IgdGhlIG1vc3QgcGFydCwKLWVuc3VyZSB0aGF0IHlvdXIgcGFnZXMgd2lsbCB3b3JrIHdpdGggYWxsIGJyb3dzZXJzLCBuZXcgYW5kIG9sZC48L3A+Ci0KLTxwPlNlZSBhbHNvOiA8QSBIUkVGPSJleGFtcGxlcy5odG1sI3NlcnZlcnBhdGgiPlNlcnZlclBhdGggY29uZmlndXJhdGlvbgotZXhhbXBsZTwvQT48L3A+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9lbWFjcy1zdHlsZSBiL2VtYWNzLXN0eWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGYxNmUyLi4wMDAwMDAwCi0tLSBhL2VtYWNzLXN0eWxlCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0oYWRkLWhvb2sgJ2MtbW9kZS1ob29rCi0gICAgICAgICAgKGZ1bmN0aW9uIChsYW1iZGEgKCkKLQkJCShjLXNldC1vZmZzZXQgJ2luY2xhc3MnICsrKQotCQkJKGMtc2V0LW9mZnNldCAnZGVmdW4tYmxvY2staW50cm8nICsrKQotCQkJKGMtc2V0LW9mZnNldCAnc3RhdGVtZW50LWJsb2NrLWludHJvJyArKykKLQkJCShjLXNldC1vZmZzZXQgJ3N1YnN0YXRlbWVudCcgKyspCi0JCQkoYy1zZXQtb2Zmc2V0ICdicmFjZS1saXN0LWludHJvJyArKykKLQkJCSkpKQotKHNldHEgYysrLW1vZGUtaG9vayBjLW1vZGUtaG9vaykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvLmN2c2lnbm9yZSBiL2luY2x1ZGUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDllYWU5NC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1hcF9jb25maWdfYXV0by5oCmRpZmYgLS1naXQgYS9pbmNsdWRlLy5pbmRlbnQucHJvIGIvaW5jbHVkZS8uaW5kZW50LnBybwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlmYmU5Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlLy5pbmRlbnQucHJvCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLWk0IC1ucHNsIC1kaTAgLWJyIC1uY2UgLWQwIC1jbGkwIC1ucGNzIC1uZmMxCi0tVEJVRkYKLS1URklMRQotLVRUUkFOUwotLVRVSU5UNAotLVRfdHJhbnMKLS1UYWxsb3dfb3B0aW9uc190Ci0tVGFwYWNoZV9zZmlvCi0tVGFycmF5X2hlYWRlcgotLVRib29sX2ludAotLVRidWZfYXJlYQotLVRidWZmX3N0cnVjdAotLVRidWZmeQotLVRjbWRfaG93Ci0tVGNtZF9wYXJtcwotLVRjb21tYW5kX3JlYwotLVRjb21tYW5kX3N0cnVjdAotLVRjb25uX3JlYwotLVRjb3JlX2Rpcl9jb25maWcKLS1UY29yZV9zZXJ2ZXJfY29uZmlnCi0tVGRpcl9tYWtlcl9mdW5jCi0tVGV2ZW50Ci0tVGdsb2JhbHNfcwotLVRoYW5kbGVyX2Z1bmMKLS1UaGFuZGxlcl9yZWMKLS1Uam9ibGlzdF9zCi0tVGxpc3Rlbl9yZWMKLS1UbWVyZ2VyX2Z1bmMKLS1UbW9kZV90Ci0tVG1vZHVsZQotLVRtb2R1bGVfc3RydWN0Ci0tVG11dGV4Ci0tVG5fbG9uZwotLVRvdGhlcl9jaGlsZF9yZWMKLS1Ub3ZlcnJpZGVzX3QKLS1UcGFyZW50X3Njb3JlCi0tVHBpZF90Ci0tVHBpcGVkX2xvZwotLVRwb29sCi0tVHJlcXVlc3RfcmVjCi0tVHJlcXVpcmVfbGluZQotLVRybGltX3QKLS1Uc2NvcmVib2FyZAotLVRzZW1hcGhvcmUKLS1Uc2VydmVyX2FkZHJfcmVjCi0tVHNlcnZlcl9yZWMKLS1Uc2VydmVyX3JlY19jaGFpbgotLVRzaG9ydF9zY29yZQotLVR0YWJsZQotLVR0YWJsZV9lbnRyeQotLVR0aHJlYWQKLS1UdV93aWRlX2ludAotLVR2dGltZV90Ci0tVHdpZGVfaW50CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FwX2NvbXBhdC5oIGIvaW5jbHVkZS9hcF9jb21wYXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYxODdjOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FwX2NvbXBhdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotI2lmbmRlZiBBUFJfQ09NUEFUX0gKLSNkZWZpbmUgQVBSX0NPTVBBVF9ICi0KLS8qIERyYWcgaW4gYXB1IChhbmQgdGhlcmVmb3JlIGFwcikgcmVuYW1lZCBzeW1ib2xzICovCi0jaW5jbHVkZSAiYXB1X2NvbXBhdC5oIgotCi0vKiByZWRlZmluZSAxLjMueCBzeW1ib2xzIHRvIHRoZSBuZXcgc3ltYm9sIG5hbWVzICovCi0KLSNkZWZpbmUgTU9EVUxFX1ZBUl9FWFBPUlQgICAgQVBfTU9EVUxFX0RFQ0xBUkVfREFUQQotCi0jZW5kaWYgLyogQVBSX0NPTVBBVF9IICovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hcF9jb25maWcuaCBiL2luY2x1ZGUvYXBfY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MjE5Y2YuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hcF9jb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzOTQgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaWZuZGVmIEFQX0NPTkZJR19ICi0jZGVmaW5lIEFQX0NPTkZJR19ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoKLSAqIGFwX2NvbmZpZy5oOiBzeXN0ZW0tZGVwZW5kYW50ICNkZWZpbmVzIGFuZCBpbmNsdWRlcy4uLgotICogU2VlIFBPUlRJTkcgZm9yIGEgbGlzdGluZyBvZiB3aGF0IHRoZXkgbWVhbgotICovCi0KLSNpbmNsdWRlICJhcF9tbW4uaCIJCS8qIE1PRFVMRV9NQUdJQ19OVU1CRVJfICovCi0KLS8qCi0gKiBTdXBwb3J0IGZvciBwbGF0Zm9ybSBkZXBlbmRlbnQgYXV0b2dlbmVyYXRlZCBkZWZpbmVzCi0gKi8KLSNpZm5kZWYgV0lOMzIKLSNpbmNsdWRlICJhcF9jb25maWdfYXV0by5oIgotI2Vsc2UKLS8qIG5vdCBhdmFpbGFibGUgdW5kZXIgV0lOMzIsIHNvIHByb3ZpZGUgaW1wb3J0YW50IGVudHJpZXMgbWFudWFsbHkgKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0jZW5kaWYKLQotLyogSGF2ZSB0byBpbmNsdWRlIHN5cy9zdGF0LmggYmVmb3JlIC4uL29zL3dpbjMyL29zLmggc28gd2UgY2FuIG92ZXJyaWRlCi1zdGF0KCkgcHJvcGVybHkgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0vKiBTbyB0aGF0IHdlIGNhbiB1c2UgaW5saW5lIG9uIHNvbWUgY3JpdGljYWwgZnVuY3Rpb25zLCBhbmQgdXNlCi0gKiBHTlVDIGF0dHJpYnV0ZXMgKHN1Y2ggYXMgdG8gZ2V0IC1XYWxsIHdhcm5pbmdzIGZvciBwcmludGYtbGlrZQotICogZnVuY3Rpb25zKS4gIE9ubHkgZG8gdGhpcyBpbiBnY2MgMi43IG9yIGxhdGVyIC4uLiBpdCBtYXkgd29yawotICogb24gZWFybGllciBzdHVmZiwgYnV0IHdoeSBjaGFuY2UgaXQuCi0gKgotICogV2UndmUgc2luY2UgZGlzY292ZXJlZCB0aGF0IHRoZSBnY2Mgc2hpcHBlZCB3aXRoIE5lWFQgc3lzdGVtcwotICogYXMgImNjIiBpcyBjb21wbGV0ZWx5IGJyb2tlbi4gIEl0IGNsYWltcyB0byBiZSBfX0dOVUNfXyBhbmQgc28KLSAqIG9uLCBidXQgaXQgZG9lc24ndCBpbXBsZW1lbnQgaGFsZiBvZiB0aGUgdGhpbmdzIHRoYXQgX19HTlVDX18KLSAqIG1lYW5zLiAgSW4gcGFydGljdWxhciBpdCdzIG1pc3NpbmcgaW5saW5lIGFuZCB0aGUgX19hdHRyaWJ1dGVfXwotICogc3R1ZmYuICBTbyB3ZSBoYWNrIGFyb3VuZCBpdC4gIFBSIzE2MTMuIC1kamcKLSAqLwotI2lmICFkZWZpbmVkKF9fR05VQ19fKSB8fCBfX0dOVUNfXyA8IDIgfHwgXAotICAgIChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fIDwgNykgfHxcCi0gICAgZGVmaW5lZChORVhUKQotI2RlZmluZSBhcF9pbmxpbmUKLSNkZWZpbmUgX19hdHRyaWJ1dGVfXyhfX3gpCi0jZGVmaW5lIEVOVU1fQklURklFTEQoZSxuLHcpICBzaWduZWQgaW50IG4gOiB3Ci0jZWxzZQotI2RlZmluZSBhcF9pbmxpbmUgX19pbmxpbmVfXwotI2RlZmluZSBVU0VfR05VX0lOTElORQotI2RlZmluZSBFTlVNX0JJVEZJRUxEKGUsbix3KSAgZSBuIDogdwotI2VuZGlmCi0KLSNpZmRlZiBXSU4zMgotLyogaW5jbHVkZSBwcm9jZXNzLmggZmlyc3Qgc28gd2UgY2FuIG92ZXJyaWRlIHNwYXduW2x2XWUqIHByb3Blcmx5ICovCi0jaW5jbHVkZSA8cHJvY2Vzcy5oPgotI2luY2x1ZGUgIi4uL29zL3dpbjMyL29zLmgiCi0jZWxzZQotI2luY2x1ZGUgIm9zLmgiCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFFOWCkgJiYgIWRlZmluZWQoTVBFKSAmJiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoVFBGKQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2VuZGlmCi0KLS8qIERlZmluZSBvbmUgb2YgdGhlc2UgYWNjb3JkaW5nIHRvIHlvdXIgc3lzdGVtLiAqLwotI2lmIGRlZmluZWQoTUlOVCkKLXR5cGVkZWYgaW50IHJsaW1fdDsKLSNkZWZpbmUgSk1QX0JVRiBzaWdqbXBfYnVmCi0jZGVmaW5lIE5PX0xPTkdfRE9VQkxFCi0jZGVmaW5lIFVTRV9GTE9DS19TRVJJQUxJWkVEX0FDQ0VQVAotI2RlZmluZSBfQlNEX1NPVVJDRQotI2RlZmluZSBFQUdBSU4gRVdPVUxEQkxPQ0sKLWludCBpbml0Z3JvdXBzIChjaGFyICosIGludCk7ICAgICAKLWNoYXIgKmNyeXB0IChjb25zdCBjaGFyICpwdywgY29uc3QgY2hhciAqc2FsdCk7Ci1pbnQgZ2V0aG9zdG5hbWUgKGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKTsKLQotI2VsaWYgZGVmaW5lZChNUEUpCi0jaW5jbHVkZSA8c3lzL3RpbWVzLmg+Ci0jZGVmaW5lIE5PX1NFVFNJRAotI2RlZmluZSBOT19LSUxMUEcKLSNkZWZpbmUgTk9fV1JJVEVWCi0jZGVmaW5lIEhBVkVfU0hNR0VUIDEKLSNkZWZpbmUgVVNFX1NITUdFVF9TQ09SRUJPQVJECi0jZGVmaW5lIFNITV9SIDA0MDAgIC8qIFJlYWQgcGVybWlzc2lvbiAqLwotI2RlZmluZSBTSE1fVyAwMjAwICAvKiBXcml0ZSBwZXJtaXNzaW9uICovCi0jZGVmaW5lIE5FRURfSU5JVEdST1VQUwotI2RlZmluZSBORUVEX1NUUkNBU0VDTVAKLSNkZWZpbmUgTkVFRF9TVFJEVVAKLSNkZWZpbmUgTkVFRF9TVFJOQ0FTRUNNUAotZXh0ZXJuIHZvaWQgR0VUUFJJVk1PREUoKTsKLWV4dGVybiB2b2lkIEdFVFVTRVJNT0RFKCk7Ci1leHRlcm4gY2hhciAqaW5ldF9udG9hKCk7Ci0jZGVmaW5lIE5PX1NMQUNLCi0jZGVmaW5lIE5PX0dFVFRJTUVPRkRBWQotI2RlZmluZSBTX0lFWEVDICBTX0lYVVNSCi0jZGVmaW5lIFNfSVJFQUQgIFNfSVJVU1IKLSNkZWZpbmUgU19JV1JJVEUgU19JV1VTUgotI2RlZmluZSBQRl9JTkVUICBBRl9JTkVUCi0KLSNlbGlmIGRlZmluZWQoU1VOT1M0KQotI2RlZmluZSBIQVZFX0dNVE9GRiAxCi0jdW5kZWYgTk9fS0lMTFBHCi0jdW5kZWYgTk9fU0VUU0lECi1jaGFyICpjcnlwdChjb25zdCBjaGFyICpwdywgY29uc3QgY2hhciAqc2FsdCk7Ci1jaGFyICpta3RlbXAoY2hhciAqdGVtcGxhdGUpOwotI2RlZmluZSBIQVZFX01NQVAgMQotI2RlZmluZSBVU0VfTU1BUF9TQ09SRUJPQVJECi0jZGVmaW5lIFVTRV9NTUFQX0ZJTEVTCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNkZWZpbmUgTkVFRF9TVFJFUlJPUgotdHlwZWRlZiBpbnQgcmxpbV90OwotI2RlZmluZSBtZW1tb3ZlKGEsYixjKSBiY29weShiLGEsYykKLSNkZWZpbmUgTk9fTElOR0NMT1NFCi0jZGVmaW5lIFVTRV9GTE9DS19TRVJJQUxJWkVEX0FDQ0VQVAotI2RlZmluZSBORUVEX0RJRkZUSU1FCi0jZGVmaW5lIEhBVkVfU1lTTE9HIDEKLQotI2VsaWYgZGVmaW5lZChTT0xBUklTMikKLSN1bmRlZiBIQVZFX0dNVE9GRgotI2RlZmluZSBOT19LSUxMUEcKLSN1bmRlZiBOT19TRVRTSUQKLSNkZWZpbmUgYnplcm8oYSxiKSBtZW1zZXQoYSwwLGIpCi0jaWYgIWRlZmluZWQoVVNFX1NZU1ZTRU1fU0VSSUFMSVpFRF9BQ0NFUFQpICYmIFwKLSAgICAhZGVmaW5lZChVU0VfUFRIUkVBRF9TRVJJQUxJWkVEX0FDQ0VQVCkKLSNkZWZpbmUgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUCi0jZW5kaWYKLSNkZWZpbmUgTkVFRF9VTklPTl9TRU1VTgotI2RlZmluZSBIQVZFX01NQVAgMQotI2RlZmluZSBVU0VfTU1BUF9TQ09SRUJPQVJECi0jZGVmaW5lIFVTRV9NTUFQX0ZJTEVTCi1pbnQgZ2V0aG9zdG5hbWUoY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pOwotI2RlZmluZSBIQVZFX1NZU0xPRyAxCi0jZGVmaW5lIFNZU19TSUdMSVNUIF9zeXNfc2lnbGlzdAotCi0jZWxpZiBkZWZpbmVkKElSSVgpCi0jdW5kZWYgSEFWRV9HTVRPRkYKLS8qIElSSVggaGFzIGtpbGxwZywgYnV0IGl0J3Mgb25seSBpbiBfQlNEX0NPTVBBVCwgc28gZG9uJ3QgdXNlIGl0IGluIGNhc2UKLSAqIHRoZXJlJ3Mgc29tZSB3ZWlyZCBjb25mbGljdCB3aXRoIG5vbi1CU0Qgc2lnbmFscyAqLwotI2RlZmluZSBOT19LSUxMUEcKLSN1bmRlZiBOT19TRVRTSUQKLSNpZiAhZGVmaW5lZChVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQpICYmIFwKLSAgICAhZGVmaW5lZChVU0VfVVNMT0NLX1NFUklBTElaRURfQUNDRVBUKSAmJiBcCi0gICAgIWRlZmluZWQoVVNFX1NZU1ZTRU1fU0VSSUFMSVpFRF9BQ0NFUFQpCi0jZGVmaW5lIFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVAotI2VuZGlmCi0jZGVmaW5lIEhBVkVfU0hNR0VUIDEKLSNkZWZpbmUgVVNFX1NITUdFVF9TQ09SRUJPQVJECi0jZGVmaW5lIEhBVkVfTU1BUCAxCi0jZGVmaW5lIFVTRV9NTUFQX0ZJTEVTCi0jZGVmaW5lIE5PX0xPTkdfRE9VQkxFCi0jZGVmaW5lIE5PX0xJTkdDTE9TRQotI2RlZmluZSBIQVZFX1NZU0xPRyAxCi0KLSNlbGlmIGRlZmluZWQoSElVWCkKLSN1bmRlZiBIQVZFX0dNVE9GRgotI2RlZmluZSBOT19LSUxMUEcKLSN1bmRlZiBOT19TRVRTSUQKLSNpZm5kZWYgX0hJVVhfU09VUkNFCi0jZGVmaW5lIF9ISVVYX1NPVVJDRQotI2VuZGlmCi0jZGVmaW5lIEhBVkVfU0hNR0VUIDEKLSNkZWZpbmUgVVNFX1NITUdFVF9TQ09SRUJPQVJECi0jZGVmaW5lIFNFTEVDVF9ORUVEU19DQVNUCi0jZGVmaW5lIEhBVkVfU1lTTE9HIDEKLQotI2VsaWYgZGVmaW5lZChIUFVYKSB8fCBkZWZpbmVkKEhQVVgxMCkKLSN1bmRlZiBIQVZFX0dNVE9GRgotI2RlZmluZSBOT19LSUxMUEcKLSN1bmRlZiBOT19TRVRTSUQKLSNkZWZpbmUgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUCi0jaWZuZGVmIF9IUFVYX1NPVVJDRQotI2RlZmluZSBfSFBVWF9TT1VSQ0UKLSNlbmRpZgotI2RlZmluZSBIQVZFX1NITUdFVCAxCi0jZGVmaW5lIFVTRV9TSE1HRVRfU0NPUkVCT0FSRAotI2RlZmluZSBIQVZFX1NZU0xPRyAxCi0jaWZuZGVmIEhQVVgxMAotI2RlZmluZSBTRUxFQ1RfTkVFRFNfQ0FTVAotdHlwZWRlZiBpbnQgcmxpbV90OwotI2VuZGlmCi0KLSNlbGlmIGRlZmluZWQoSFBVWDExKQotI2lmbmRlZiBfSFBVWF9TT1VSQ0UKLSNkZWZpbmUgX0hQVVhfU09VUkNFCi0jZW5kaWYKLSNkZWZpbmUgSEFWRV9TSE1HRVQKLSNkZWZpbmUgVVNFX1NITUdFVF9TQ09SRUJPQVJECi0jdW5kZWYgIEhBVkVfR01UT0ZGCi0jZGVmaW5lIFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVAotLyogZmVlbGluZyBicmF2ZT8gIHdhbnQgdG8gdHJ5IHVzaW5nIFBPU0lYIG11dGV4ZXM/ICovCi0vKiAjZGVmaW5lIEhBVkVfTU1BUCAqLwotLyogI2RlZmluZSBVU0VfTU1BUF9TQ09SRUJPQVJEICovCi0vKiAjZGVmaW5lIFVTRV9NTUFQX0ZJTEVTICovCi0vKiAjZGVmaW5lIFVTRV9QVEhSRUFEX1NFUklBTElaRURfQUNDRVBUICovCi0jZGVmaW5lIE5PX0tJTExQRwotI3VuZGVmICBOT19TRVRTSUQKLSNkZWZpbmUgSEFWRV9TWVNMT0cKLQotI2VsaWYgZGVmaW5lZChBSVgpCi0jdW5kZWYgSEFWRV9HTVRPRkYKLSN1bmRlZiBOT19LSUxMUEcKLSN1bmRlZiBOT19TRVRTSUQKLSNpZm5kZWYgX19wczJfXwotI2RlZmluZSBIQVZFX01NQVAgMQotI2RlZmluZSBVU0VfTU1BUF9TQ09SRUJPQVJECi0jZGVmaW5lIFVTRV9NTUFQX0ZJTEVTCi0jZGVmaW5lIEhBVkVfU1lTTE9HIDEKLSNpZm5kZWYgREVGQVVMVF9HUk9VUAotI2RlZmluZSBERUZBVUxUX0dST1VQICJub2JvZHkiCi0jZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBERUZBVUxUX1VTRVIKLSNkZWZpbmUgREVGQVVMVF9VU0VSICJub2JvZHkiCi0jZW5kaWYKLSNpZmRlZiBORUVEX1JMSU1fVAotdHlwZWRlZiBpbnQgcmxpbV90OwotI2VuZGlmCi0jZGVmaW5lIFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVAotI2lmZGVmIFVTRUJDT1BZCi0jZGVmaW5lIG1lbW1vdmUoYSxiLGMpIGJjb3B5KGIsYSxjKQotI2VuZGlmCi0jaWYgQUlYID49IDQyCi0jZGVmaW5lIE5FVF9TSVpFX1Qgc2l6ZV90Ci0jZW5kaWYKLQotI2VsaWYgZGVmaW5lZChVTFRSSVgpCi0vKiB3ZSBkb24ndCB3YW50IHRvIHVzZSBzeXMvcmVzb3VyY2UuaCB1bmRlcgotICAgVWx0cml4IGFsdGhvdWdoIHRoaXMgaGVhZGVyIGV4aXN0cy4gKi8KLSN1bmRlZiBIQVZFX1NZU19SRVNPVVJDRV9ICi0jZGVmaW5lIEhBVkVfR01UT0ZGIDEKLSN1bmRlZiBOT19LSUxMUEcKLSN1bmRlZiBOT19TRVRTSUQKLSNkZWZpbmUgVUxUUklYX0JSQUlOX0RFQVRICi0jZGVmaW5lIE5FRURfU1RSRFVQCi0vKiBJZiB5b3UgaGF2ZSBVbHRyaXggNC4zLCBhbmQgYXJlIHVzaW5nIGNjLCBjb25zdCBpcyBicm9rZW4gKi8KLSNpZm5kZWYgX191bHRyaXhfXwkJLyogSGFjayB0byBjaGVjayBmb3IgcHJlLVVsdHJpeCA0LjQgY2MgKi8KLSNkZWZpbmUgY29uc3QJCQkvKiBOb3QgaW1wbGVtZW50ZWQgKi8KLSNlbmRpZgotCi0jZWxpZiBkZWZpbmVkKE9TRjEpCi0jZGVmaW5lIEhBVkVfR01UT0ZGIDEKLSN1bmRlZiBOT19LSUxMUEcKLSN1bmRlZiBOT19TRVRTSUQKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLSNkZWZpbmUgVVNFX01NQVBfU0NPUkVCT0FSRAotI2RlZmluZSBVU0VfTU1BUF9GSUxFUwotI2RlZmluZSBOT19MT05HX0RPVUJMRQotI2RlZmluZSBIQVZFX1NZU0xPRyAxCi0jZGVmaW5lIFVTRV9GTE9DS19TRVJJQUxJWkVEX0FDQ0VQVAotI2RlZmluZSBTSU5HTEVfTElTVEVOX1VOU0VSSUFMSVpFRF9BQ0NFUFQKLQotI2VsaWYgZGVmaW5lZChQQVJBR09OKQotI2RlZmluZSBIQVZFX0dNVE9GRiAxCi0jdW5kZWYgTk9fS0lMTFBHCi0jdW5kZWYgTk9fU0VUU0lECi0jZGVmaW5lIEhBVkVfTU1BUCAxCi0jZGVmaW5lIFVTRV9NTUFQX1NDT1JFQk9BUkQKLSNkZWZpbmUgVVNFX01NQVBfRklMRVMKLSNkZWZpbmUgTk9fTE9OR19ET1VCTEUKLSNkZWZpbmUgSEFWRV9TWVNMT0cgMQotdHlwZWRlZiBpbnQgcmxpbV90OwotCi0jZWxpZiBkZWZpbmVkKFNFUVVFTlQpCi0jZGVmaW5lIERFRkFVTFRfVVNFUiAibm9ib2R5IgotI2RlZmluZSBERUZBVUxUX0dST1VQICJub2JvZHkiCi0jZGVmaW5lIE5PX1NITUdFVCAxCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi0jZGVmaW5lIEhBVkVfU1lTTE9HIDEKLSNkZWZpbmUgVVNFX01NQVBfRklMRVMgMQotI2RlZmluZSBVU0VfTU1BUF9TQ09SRUJPQVJEIDEKLSNkZWZpbmUgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUIDEKLSNkZWZpbmUgSk1QX0JVRiBzaWdqbXBfYnVmCi0jdW5kZWYgTk9fU0VUU0lECi0jaWYgU0VRVUVOVCA8IDQwCi10eXBlZGVmIGludCBybGltX3Q7Ci0jZGVmaW5lIE5PX0dFVFRJTUVPRkRBWQotI3VuZGVmIEhBVkVfU1lTX1JFU09VUkNFX0ggLyogZXhpc3RzIGJ1dCBkb2VzIG5vdCBwcm92aWRlICpybGltaXQgZnVuY3MgKi8KLSNpbmNsdWRlIDxzeXMvdGltZXMuaD4KLSNlbmRpZgotI2lmIFNFUVVFTlQgPCA0MgotI2RlZmluZSBORUVEX1NUUkNBU0VDTVAKLSNkZWZpbmUgTkVFRF9TVFJOQ0FTRUNNUAotI2VuZGlmCi0jaWYgU0VRVUVOVCA8IDQ0Ci0jZGVmaW5lIE5PX0tJTExQRyAxCi0jZGVmaW5lIE5FVF9TSVpFX1QgaW50Ci0jZW5kaWYKLSNpZiBTRVFVRU5UID49IDQ0Ci0jdW5kZWYgTk9fS0lMTFBHCi0jZGVmaW5lIE5FVF9TSVpFX1Qgc2l6ZV90Ci0jZW5kaWYKLQotI2VsaWYgZGVmaW5lZChORVhUKQotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBtb2RlX3Q7Ci0jZGVmaW5lIEhBVkVfR01UT0ZGIDEKLSN1bmRlZiBOT19LSUxMUEcKLSNkZWZpbmUgTk9fU0VUU0lECi0jZGVmaW5lIE5FRURfU1RSRFVQCi0jZGVmaW5lIE5PX0xJTkdDTE9TRQotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLSNpZm5kZWYgRkRfQ0xPRVhFQwotI2RlZmluZSBGRF9DTE9FWEVDIDEKLSNlbmRpZgotI2lmbmRlZiBTX0lTRElSCi0jZGVmaW5lIFNfSVNESVIobSkgICAgICAoKChtKSYoU19JRk1UKSkgPT0gKFNfSUZESVIpKQotI2VuZGlmCi0jaWZuZGVmIFNfSVNSRUcKLSNkZWZpbmUgU19JU1JFRyhtKSAgICAgICgoKG0pJihTX0lGTVQpKSA9PSAoU19JRlJFRykpCi0jZW5kaWYKLSNpZm5kZWYgU19JWFVTUgotI2RlZmluZSBTX0lYVVNSIDAwMTAwCi0jZW5kaWYKLSNpZm5kZWYgU19JUkdSUAotI2RlZmluZSBTX0lSR1JQIDAwMDQwCi0jZW5kaWYKLSNpZm5kZWYgU19JWEdSUAotI2RlZmluZSBTX0lYR1JQIDAwMDEwCi0jZW5kaWYKLSNpZm5kZWYgU19JUk9USAotI2RlZmluZSBTX0lST1RIIDAwMDA0Ci0jZW5kaWYKLSNpZm5kZWYgU19JWE9USAotI2RlZmluZSBTX0lYT1RIIDAwMDAxCi0jZW5kaWYKLSNpZm5kZWYgU19JUlVTUgotI2RlZmluZSBTX0lSVVNSIFNfSVJFQUQKLSNlbmRpZgotI2lmbmRlZiBTX0lXVVNSCi0jZGVmaW5lIFNfSVdVU1IgU19JV1JJVEUKLSNlbmRpZgotI2lmbmRlZiBTX0lXR1JQCi0jZGVmaW5lIFNfSVdHUlAJMDAwMDIwCi0jZW5kaWYKLSNpZm5kZWYgU19JV09USAotI2RlZmluZSBTX0lXT1RIIDAwMDAwMgotI2VuZGlmCi0KLSNkZWZpbmUgU1RESU5fRklMRU5PICAwCi0jZGVmaW5lIFNURE9VVF9GSUxFTk8gMQotI2RlZmluZSBTVERFUlJfRklMRU5PIDIKLQotLyogUFIjMjI5MyBmaXggKi8KLSNkZWZpbmUJYXBfd2FpdF90CXVuaW9uIHdhaXQKLSNkZWZpbmUgd2FpdHBpZChhLGIsYykgd2FpdDQoKGEpID09IC0xID8gMCA6IChhKSwodW5pb24gd2FpdCAqKShiKSxjLE5VTEwpCi0jZGVmaW5lIFdFWElUU1RBVFVTKHN0YXR1cykgICAgIChpbnQpKCBXSUZFWElURUQoc3RhdHVzKSA/ICggKHN0YXR1cykud19yZXRjb2RlICkgOiAtMSkKLSNkZWZpbmUgV1RFUk1TSUcoc3RhdHVzKQkoaW50KSggKHN0YXR1cykud190ZXJtc2lnICkKLQotdHlwZWRlZiBpbnQgcGlkX3Q7Ci0jZGVmaW5lIFVTRV9MT05HSk1QCi0jZGVmaW5lIE5PX1VTRV9TSUdBQ1RJT04KLSNkZWZpbmUgSEFWRV9TWVNMT0cgMQotCi0jaWYgZGVmaW5lZChfX0RZTkFNSUNfXykKLSNkZWZpbmUgSEFWRV9EWUxECi0jZGVmaW5lIERZTERfQ0FOVF9VTkxPQUQKLSNlbmRpZgotCi0jZWxpZiBkZWZpbmVkKE1BQ19PUykgfHwgZGVmaW5lZChNQUNfT1NfWF9TRVJWRVIpIC8qIE1hYyBPUyAoPj0gMTAuMCkgYW5kIE1hYyBPUyBYIFNlcnZlciAoPD0gNS54KSAqLwotI3VuZGVmIFBMQVRGT1JNCi0jaWZkZWYgTUFDX09TX1hfU0VSVkVSCi0jZGVmaW5lIFBMQVRGT1JNICJNYWMgT1MgWCBTZXJ2ZXIiCi0jZWxzZQotI2RlZmluZSBQTEFURk9STSAiTWFjIE9TIgotI2VuZGlmCi0jZGVmaW5lIEhBVkVfRFlMRAotI2lmZGVmIE1BQ19PU19YX1NFUlZFUgotI2RlZmluZSBEWUxEX0NBTlRfVU5MT0FECi0jZW5kaWYgLyogTUFDX09TX1hfU0VSVkVSICovCi0jZGVmaW5lIEhBVkVfR01UT0ZGCi0jZGVmaW5lIEhBVkVfTU1BUAotI2RlZmluZSBVU0VfTU1BUF9GSUxFUwotI2RlZmluZSBVU0VfTU1BUF9TQ09SRUJPQVJECi0jaWZkZWYgTUFDX09TX1hfU0VSVkVSCi0jZGVmaW5lIE1BUF9UTVBGSUxFCi0jZW5kaWYgLyogTUFDX09TX1hfU0VSVkVSICovCi0jZGVmaW5lIEhBVkVfUkVTT1VSQ0UKLSNkZWZpbmUgSEFWRV9TTlBSSU5URgotI2RlZmluZSBKTVBfQlVGIGptcF9idWYKLSNkZWZpbmUgVVNFX0xPTkdKTVAKLSNkZWZpbmUgVVNFX0ZMT0NLX1NFUklBTElaRURfQUNDRVBUCi0jZGVmaW5lIFNJTkdMRV9MSVNURU5fVU5TRVJJQUxJWkVEX0FDQ0VQVAotLyoKLSAqIElmIHlvdSBhcmUgdXNpbmcgQVBBQ0ksICh5b3UgcHJvYmFibHkgc2hvdWxkIGJlIG9uIE1hYyBPUykgdGhlc2UKLSAqIHZhbHVlcyBhcmUgc2V0IGF0IGNvbmZpZ3VyZSB0aW1lLgotICovCi0jaWZuZGVmIEhUVFBEX1JPT1QKLSNkZWZpbmUgSFRUUERfUk9PVCAgICAgICAgICAgICAgIi9Mb2NhbC9MaWJyYXJ5L1dlYlNlcnZlciIKLSNlbmRpZgotI2lmbmRlZiBET0NVTUVOVF9MT0NBVElPTgotI2RlZmluZSBET0NVTUVOVF9MT0NBVElPTiAgICAgICBIVFRQRF9ST09UICIvRG9jdW1lbnRzIgotI2VuZGlmCi0jaWZuZGVmIERFRkFVTFRfWEZFUkxPRwotI2RlZmluZSBERUZBVUxUX1hGRVJMT0cgICAgICAgICAiTG9ncy9BY2Nlc3MiCi0jZW5kaWYKLSNpZm5kZWYgREVGQVVMVF9FUlJPUkxPRwotI2RlZmluZSBERUZBVUxUX0VSUk9STE9HICAgICAgICAiTG9ncy9FcnJvcnMiCi0jZW5kaWYKLSNpZm5kZWYgREVGQVVMVF9QSURMT0cKLSNkZWZpbmUgREVGQVVMVF9QSURMT0cgICAgICAgICAgIkxvZ3MvUHJvY2VzcyIKLSNlbmRpZgotI2lmbmRlZiBERUZBVUxUX1NDT1JFQk9BUkQKLSNkZWZpbmUgREVGQVVMVF9TQ09SRUJPQVJEICAgICAgIkxvZ3MvU3RhdHVzIgotI2VuZGlmCi0jaWZuZGVmIERFRkFVTFRfTE9DS0ZJTEUKLSNkZWZpbmUgREVGQVVMVF9MT0NLRklMRSAgICAgICAgIkxvZ3MvTG9jayIKLSNlbmRpZgotI2lmbmRlZiBTRVJWRVJfQ09ORklHX0ZJTEUKLSNkZWZpbmUgU0VSVkVSX0NPTkZJR19GSUxFICAgICAgIkNvbmZpZ3VyYXRpb24vU2VydmVyIgotI2VuZGlmCi0jaWZuZGVmIFJFU09VUkNFX0NPTkZJR19GSUxFCi0jZGVmaW5lIFJFU09VUkNFX0NPTkZJR19GSUxFICAgICJDb25maWd1cmF0aW9uL1Jlc291cmNlcyIKLSNlbmRpZgotI2lmbmRlZiBUWVBFU19DT05GSUdfRklMRQotI2RlZmluZSBUWVBFU19DT05GSUdfRklMRSAgICAgICAiQ29uZmlndXJhdGlvbi9NSU1FIgotI2VuZGlmCi0jaWZuZGVmIEFDQ0VTU19DT05GSUdfRklMRQotI2RlZmluZSBBQ0NFU1NfQ09ORklHX0ZJTEUgICAgICAiQ29uZmlndXJhdGlvbi9BY2Nlc3MiCi0jZW5kaWYKLSNpZm5kZWYgREVGQVVMVF9VU0VSX0RJUgotI2RlZmluZSBERUZBVUxUX1VTRVJfRElSICAgICAgICAiTGlicmFyeS9XZWIgRG9jdW1lbnRzIgotI2VuZGlmCi0jaWZuZGVmIERFRkFVTFRfVVNFUgotI2RlZmluZSBERUZBVUxUX1VTRVIgICAgICAgICAgICAid3d3IgotI2VuZGlmCi0jaWZuZGVmIERFRkFVTFRfR1JPVVAKLSNkZWZpbmUgREVGQVVMVF9HUk9VUCAgICAgICAgICAgInd3dyIKLSNlbmRpZgotI2lmbmRlZiBERUZBVUxUX1BBVEgKLSNkZWZpbmUgREVGQVVMVF9QQVRIICAgICAgICAgICAgIi9iaW46L3Vzci9iaW46L3Vzci9sb2NhbC9iaW4iCi0jZW5kaWYKLQotI2VsaWYgZGVmaW5lZChMSU5VWCkKLQotI2lmIExJTlVYID4gMQotI2luY2x1ZGUgPGZlYXR1cmVzLmg+Ci0KLS8qIGxpYmM0IHN5c3RlbXMgcHJvYmFibHkgc3RpbGwgd29yaywgaXQgcHJvYmFibHkgZG9lc24ndCBkZWZpbmUKLSAqICBfX0dOVV9MSUJSQVJZX18KLSAqIGxpYmM1IHN5c3RlbXMgZGVmaW5lIF9fR05VX0xJQlJBUllfXyA9PSAxLCBidXQgZG9uJ3QgZGVmaW5lIF9fR0xJQkNfXwotICogZ2xpYmMgMi54IGFuZCBsYXRlciBzeXN0ZW1zIGRlZmluZSBfX0dOVV9MSUJSQVJZX18gPT0gNiwgYnV0IGxpc3QgaXQgYXMKLSAqICJkZXByZWNhdGVkIGluIGZhdm91ciBvZiBfX0dMSUJDX18iOyB0aGUgdmFsdWUgNiB3aWxsIG5ldmVyIGJlIGNoYW5nZWQuCi0gKiBnbGliYyAxLnggc3lzdGVtcyAoaS5lLiByZWRoYXQgNC54IG9uIHNwYXJjL2FscGhhKSBzaG91bGQgaGF2ZQotICogX19HTElCQ19fIDwgMgotICogYWxsIGdsaWJjIGJhc2VkIHN5c3RlbXMgbmVlZCBjcnlwdC5oCi0gKi8KLSNpZiBkZWZpbmVkKF9fR05VX0xJQlJBUllfXykgJiYgX19HTlVfTElCUkFSWV9fID4gMQotI2luY2x1ZGUgPGNyeXB0Lmg+Ci0jZW5kaWYKLQotLyogZ2xpYmMgMi4wLjAgdGhyb3VnaCAyLjAuNCBuZWVkIHNpemVfdCAqIGhlcmUsIHdoZXJlIDIuMC41IG5lZWRzIHNvY2tsZW5fdCAqCi0gKiB0aGVyZSdzIG5vIHdheSB0byBkaXNjZXJuIGJldHdlZW4gdGhlc2UgdHdvIGxpYnJhcmllcy4gIEJ1dCB1c2luZyBpbnQgc2hvdWxkCi0gKiBiZSBwb3J0YWJsZSBiZWNhdXNlIG90aGVyd2lzZSB0aGVzZSBsaWJzIHdvdWxkIGJlIGhvcGVsZXNzbHkgYnJva2VuIHdpdGgKLSAqIHJlYW1zIG9mIGV4aXN0aW5nIG5ldHdvcmtpbmcgY29kZS4gIFdlJ2xsIHVzZSBzb2NrbGVuX3QgKiBmb3IgMi4xLnggYW5kCi0gKiBsYXRlci4KLSAqCi0gKiBpbnQgd29ya3MgZm9yIGFsbCB0aGUgZWFybGllciBsaWJzLCBhbmQgaXMgcGlja2VkIHVwIGJ5IGRlZmF1bHQgbGF0ZXIuCi0gKi8KLSNpZiBkZWZpbmVkKF9fR0xJQkNfXykgJiYgKF9fR0xJQkNfXyA+IDIgfHwgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+IDApKQotI2RlZmluZSBORVRfU0laRV9UIHNvY2tsZW5fdAotI2VuZGlmCi0KLSNkZWZpbmUgSEFWRV9TSE1HRVQgMQotI2RlZmluZSBVU0VfU0hNR0VUX1NDT1JFQk9BUkQKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLSNkZWZpbmUgVVNFX01NQVBfRklMRVMKLQotLyogZmxvY2sgaXMgZmFzdGVyIC4uLiBidXQgaGFzbid0IGJlZW4gdGVzdGVkIG9uIDEueCBzeXN0ZW1zICovCi0vKiBQUiMzNTMxIGluZGljYXRlcyBmbG9jaygpIG1heSBub3QgYmUgc3RhYmxlLCBwcm9iYWJseSBkZXBlbmRzIG9uCi0gKiBrZXJuZWwgdmVyc2lvbi4gIEdvIGJhY2sgdG8gdXNpbmcgZmNudGwsIGJ1dCBwcm92aWRlIGEgd2F5IGZvcgotICogZm9sa3MgdG8gdHdlYWsgdGhlaXIgQ29uZmlndXJhdGlvbiB0byBnZXQgZmxvY2suCi0gKi8KLSNpZm5kZWYgVVNFX0ZMT0NLX1NFUklBTElaRURfQUNDRVBUCi0jZGVmaW5lIFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVAotI2VuZGlmCi0KLSNkZWZpbmUgU1lTX1NJR0xJU1QJX3N5c19zaWdsaXN0Ci0KLSNlbHNlCi0jZGVmaW5lIFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVAotI2VuZGlmCi0KLSN1bmRlZiBIQVZFX0dNVE9GRgotI3VuZGVmIE5PX0tJTExQRwotI3VuZGVmIE5PX1NFVFNJRAotI3VuZGVmIE5FRURfU1RSRFVQCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNkZWZpbmUgSEFWRV9TWVNMT0cgMQotCi0vKiBnbGliYyAyLjEgYW5kIGxhdGVyIGZpbmFsbHkgZGVmaW5lIHJsaW1fdCAqLwotI2lmICFkZWZpbmVkKF9fR0xJQkNfXykgfHwgX19HTElCQ19fIDwgMiB8fCAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fIDwgMSkKLXR5cGVkZWYgaW50IHJsaW1fdDsKLSNlbmRpZgotCi0jZWxpZiBkZWZpbmVkKFNDTykKLSN1bmRlZiBIQVZFX0dNVE9GRgotI3VuZGVmIE5PX0tJTExQRwotI3VuZGVmIE5PX1NFVFNJRAotI2RlZmluZSBORUVEX0lOSVRHUk9VUFMKLSNkZWZpbmUgTk9fV1JJVEVWCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNkZWZpbmUgSEFWRV9TWVNMT0cgMQotI3VuZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKLQotI2VsaWYgZGVmaW5lZChTQ081KQotCi0jZGVmaW5lIFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVAotI2RlZmluZSBIQVZFX01NQVAgMQotI2RlZmluZSBVU0VfTU1BUF9TQ09SRUJPQVJECi0jZGVmaW5lIFVTRV9NTUFQX0ZJTEVTCi0jZGVmaW5lIFNlY3VyZVdhcmUKLSNkZWZpbmUgSEFWRV9TWVNMT0cgMQotCi0vKiBBbHRob3VnaCBTQ08gNSBkZWZpbmVzIHRoZXNlIGluIDxzdHJpbmdzLmg+IChub3RlIHRoZSAicyIpIHRoZXkgZG9uJ3QgaGF2ZQotICAgY29uc3RzLiBTaWdoLiAqLwotZXh0ZXJuIGludCBzdHJjYXNlY21wKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLWV4dGVybiBpbnQgc3RybmNhc2VjbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkKTsKLQotI2VsaWYgZGVmaW5lZChBVVgzKQotLyogVGhlc2UgYXJlIHRvIGxldCAtV2FsbCBjb21waWxlIG1vcmUgY2xlYW5seSAqLwotZXh0ZXJuIGludCBzdHJjYXNlY21wKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLWV4dGVybiBpbnQgc3RybmNhc2VjbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkKTsKLWV4dGVybiBpbnQgc2V0NDJzaWcoKSwgZ2V0b3B0KCksIGdldHBlZXJuYW1lKCksIGJ6ZXJvKCk7Ci1leHRlcm4gaW50IGxpc3RlbigpLCBiaW5kKCksIHNvY2tldCgpLCBnZXRzb2NrbmFtZSgpOwotZXh0ZXJuIGludCBhY2NlcHQoKSwgZ2V0aG9zdG5hbWUoKSwgY29ubmVjdCgpLCBsc3RhdCgpOwotZXh0ZXJuIGludCBzZWxlY3QoKSwga2lsbHBnKCksIHNodXRkb3duKCk7Ci1leHRlcm4gaW50IGluaXRncm91cHMoKSwgc2V0c29ja29wdCgpOwotZXh0ZXJuIGNoYXIgKnNobWF0KCk7Ci1leHRlcm4gaW50IHNobWN0bCgpOwotZXh0ZXJuIGludCBzaG1nZXQoKTsKLWV4dGVybiBjaGFyICpzYnJrKCk7Ci1leHRlcm4gY2hhciAqY3J5cHQoKTsKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI3VuZGVmIEhBVkVfR01UT0ZGCi0jdW5kZWYgTk9fS0lMTFBHCi0jdW5kZWYgTk9fU0VUU0lECi0jZGVmaW5lIE5FRURfU1RSRFVQCi0vKiBmY250bCgpIGxvY2tpbmcgaXMgZXhwZW5zaXZlIHdpdGggTkZTICovCi0jZGVmaW5lIFVTRV9GTE9DS19TRVJJQUxJWkVEX0FDQ0VQVAotI2RlZmluZSBTSU5HTEVfTElTVEVOX1VOU0VSSUFMSVpFRF9BQ0NFUFQKLSNkZWZpbmUgSEFWRV9TSE1HRVQgMQotI2RlZmluZSBVU0VfU0hNR0VUX1NDT1JFQk9BUkQKLS8qCi0gKiBOT1RFOiBJZiB3aGVuIHlvdSBydW4gQXBhY2hlIHVuZGVyIEEvVVggYW5kIHlvdSBnZXQgYSB3YXJuaW5nCi0gKiB0aGF0IGh0dHBkIGNvdWxkbid0IG1vdmUgYnJlYWssIHRoZW4gdGhlIGJlbG93IHZhbHVlIGZvcgotICogTU9WRUJSRUFLICg2NG1lZ3MpIGlzIHRvbyBsYXJnZSBmb3IgeW91ciBzZXR1cC4gVHJ5IHJlZHVjaW5nCi0gKiB0byAweDIwMDAwMDAgd2hpY2ggaXMgc3RpbGwgUExFTlRZIG9mIHNwYWNlLiBJIGRvdWJ0IGlmCi0gKiBldmVuIG9uIGhlYXZ5IHN5c3RlbXMgc2JyaygpIHdvdWxkIGJlIGNhbGxlZCBhdCBhbGwuLi4KLSAqLwotI2RlZmluZSBNT1ZFQlJFQUsJCTB4NDAwMDAwMAotI2RlZmluZSBOT19MSU5HQ0xPU0UKLSNkZWZpbmUgTk9fU0xBQ0sKLSNkZWZpbmUgSEFWRV9TWVNMT0cgMQotI3VuZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gJLyogZXhpc3RzIGJ1dCBkb2VzIG5vdCBwcm92aWRlICpybGltaXQgZnVuY3MgKi8KLQotI2VsaWYgZGVmaW5lZChTVlI0KQotI2RlZmluZSBOT19LSUxMUEcKLSN1bmRlZiAgTk9fU0VUU0lECi0jdW5kZWYgTkVFRF9TVFJEVVAKLSNpZm5kZWYgTVBSQVMKLSNkZWZpbmUgTkVFRF9TVFJDQVNFQ01QCi0jaWZuZGVmIEVOQ09SRQotI2RlZmluZSBORUVEX1NUUk5DQVNFQ01QCi0jZW5kaWYgLyogRU5DT1JFICovCi0jZW5kaWYgLyogTVBSQVMgKi8KLSNkZWZpbmUgYnplcm8oYSxiKSBtZW1zZXQoYSwwLGIpCi0vKiBBIGxvdCBvZiBTVlI0IHN5c3RlbXMgbmVlZCB0aGlzICovCi0jaWZuZGVmIFVTRV9TWVNWU0VNX1NFUklBTElaRURfQUNDRVBUCi0jZGVmaW5lIFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVAotI2VuZGlmCi0jZGVmaW5lIEhBVkVfU1lTTE9HIDEKLSNkZWZpbmUgTkVUX1NJWkVfVCBzaXplX3QKLSNkZWZpbmUgSEFWRV9TSE1HRVQgMQotI2RlZmluZSBVU0VfU0hNR0VUX1NDT1JFQk9BUkQKLSNpZmRlZiBfT1NEX1BPU0lYIC8qIEJTMjAwMC1QT1NJWCBtYWluZnJhbWUgbmVlZHMgaW5pdGdyb3VwcyAqLwotI2RlZmluZSBORUVEX0hBU0hCQU5HX0VNVUwgLyogZXhlY3ZlKCkgZG9lc24ndCBzdGFydCBzaGVsbCBzY3JpcHRzIGJ5IGRlZmF1bHQgKi8KLSNkZWZpbmUgX0tNRU1VU0VSICAgICAgICAgIC8qIEVuYWJsZSBTSE1fUi9TSE1fVyBkZWZpbmVzIGluIDxzaG0uaD4gKi8KLSN1bmRlZiBORUVEX1NUUkNBU0VDTVAKLSN1bmRlZiBORUVEX1NUUk5DQVNFQ01QCi0jdW5kZWYgYnplcm8KLSNlbmRpZiAvKl9PU0RfUE9TSVgqLwotCi0jZWxpZiBkZWZpbmVkKFVXKQotI2lmIFVXIDwgNzAwCi0jZGVmaW5lIFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVAotI2RlZmluZSBOT19MSU5HQ0xPU0UKLSNkZWZpbmUgTk9fS0lMTFBHCi0jZW5kaWYKLSN1bmRlZiAgTk9fU0VUU0lECi0jdW5kZWYgTkVFRF9TVFJEVVAKLSNkZWZpbmUgTkVFRF9TVFJDQVNFQ01QCi0jZGVmaW5lIE5FRURfU1RSTkNBU0VDTVAKLSNkZWZpbmUgYnplcm8oYSxiKSBtZW1zZXQoYSwwLGIpCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi0jZGVmaW5lIFVTRV9NTUFQX1NDT1JFQk9BUkQKLSNkZWZpbmUgVVNFX01NQVBfRklMRVMKLSNkZWZpbmUgSEFWRV9TSE1HRVQgMQotI3VuZGVmIFVTRV9TSE1HRVRfU0NPUkVCT0FSRAkvKiBmb3JjZSB1c2Ugb2YgbW1hcCgpIHNjb3JlYm9hcmQgKi8KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2lmIFVXID49IDIwMAotI2RlZmluZSBfUE9TSVhfU09VUkNFCi0jZW5kaWYKLSNkZWZpbmUgTkVUX1NJWkVfVCBzaXplX3QKLSNkZWZpbmUgSEFWRV9TWVNMT0cgMQotCi0jZWxpZiBkZWZpbmVkKERHVVgpCi0jZGVmaW5lIE5PX0tJTExQRwotI3VuZGVmICBOT19TRVRTSUQKLSN1bmRlZiBORUVEX1NUUkRVUAotI2lmZGVmIF9JWDg2X0RHCi0jdW5kZWYgTkVFRF9TVFJDQVNFQ01QCi0jdW5kZWYgTkVFRF9TVFJOQ0FTRUNNUAotI2Vsc2UKLSNkZWZpbmUgTkVFRF9TVFJDQVNFQ01QCi0jZGVmaW5lIE5FRURfU1RSTkNBU0VDTVAKLSNlbmRpZgotI2RlZmluZSBiemVybyhhLGIpIG1lbXNldChhLDAsYikKLS8qIEEgbG90IG9mIFNWUjQgc3lzdGVtcyBuZWVkIHRoaXMgKi8KLSNkZWZpbmUgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUCi0jZGVmaW5lIGFwX2luZXRfYWRkciBpbmV0X25ldHdvcmsKLSNkZWZpbmUgSEFWRV9TWVNMT0cgMQotCi0jZWxpZiBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19PcGVuQlNEX18pIHx8IGRlZmluZWQoTkVUQlNEKQotI2RlZmluZSBIQVZFX0dNVE9GRiAxCi0jdW5kZWYgTk9fS0lMTFBHCi0jdW5kZWYgTk9fU0VUU0lECi0jZGVmaW5lIEhBVkVfU1lTTE9HIDEKLSNpZm5kZWYgREVGQVVMVF9VU0VSCi0jZGVmaW5lIERFRkFVTFRfVVNFUiAibm9ib2R5IgotI2VuZGlmCi0jaWZuZGVmIERFRkFVTFRfR1JPVVAKLSNkZWZpbmUgREVGQVVMVF9HUk9VUCAibm9ncm91cCIKLSNlbmRpZgotI2RlZmluZSBIQVZFX1NITUdFVCAxCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi0jZGVmaW5lIFVTRV9NTUFQX1NDT1JFQk9BUkQKLSNkZWZpbmUgVVNFX01NQVBfRklMRVMKLSNkZWZpbmUgVVNFX0ZMT0NLX1NFUklBTElaRURfQUNDRVBUCi0jZGVmaW5lIFNJTkdMRV9MSVNURU5fVU5TRVJJQUxJWkVEX0FDQ0VQVAotCi0jZWxpZiBkZWZpbmVkKFVUUzIxKQotI3VuZGVmIEhBVkVfR01UT0ZGCi0jdW5kZWYgTk9fS0lMTFBHCi0jZGVmaW5lIE5PX1NFVFNJRAotI2RlZmluZSBORUVEX1dBSVRQSUQKLSNkZWZpbmUgU1RESU5fRklMRU5PIDAKLSNkZWZpbmUgU1RET1VUX0ZJTEVOTyAxCi0jZGVmaW5lIFNUREVSUl9GSUxFTk8gMgotI2RlZmluZSBIQVZFX1NZU0xPRyAxCi0jZGVmaW5lIFVTRV9MT05HSk1QCi0jZGVmaW5lIEpNUF9CVUYgam1wX2J1ZgotI2RlZmluZSBOT19VU0VfU0lHQUNUSU9OCi0jZGVmaW5lIE5FRURfU1RSRVJST1IKLSNkZWZpbmUgTkVFRF9TVFJTVFIKLSNkZWZpbmUgTkVFRF9IQVNIQkFOR19FTVVMCi0jZGVmaW5lIE5ERUxBWV9QSVBFX1JFVFVSTlNfWkVSTwotI2RlZmluZSBOT19EQVRBIE5PX0FERFJFU1MKLSNkZWZpbmUJYXBfd2FpdF90CQl1bmlvbiB3YWl0Ci0jZGVmaW5lIFdFWElUU1RBVFVTKHN0YXR1cykJKGludCkoKHN0YXR1cykud19yZXRjb2RlKQotI2RlZmluZSBXVEVSTVNJRyhzdGF0dXMpCShpbnQpKChzdGF0dXMpLndfdGVybXNpZykKLSNkZWZpbmUgc3RyZnRpbWUoYnVmLGJ1ZnNpemUsZm10LHRtKSAgICBhc2NmdGltZShidWYsZm10LHRtKQotI3VuZGVmIEhBVkVfU1lTX1JFU09VUkNFX0ggLyogZXhpc3RzIGJ1dCBkb2VzIG5vdCBwcm92aWRlICpybGltaXQgZnVuY3MgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPiAgICAgCi0KLSNlbGlmIGRlZmluZWQoQVBPTExPKQotI3VuZGVmIEhBVkVfR01UT0ZGCi0jdW5kZWYgTk9fS0lMTFBHCi0jdW5kZWYgTk9fU0VUU0lECi0jZGVmaW5lIEhBVkVfU1lTTE9HIDEKLQotI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX2JzZGlfXykKLSNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKQotI2luY2x1ZGUgPG9zcmVsZGF0ZS5oPgotI2VuZGlmCi0jZGVmaW5lIEhBVkVfR01UT0ZGIDEKLSN1bmRlZiBOT19LSUxMUEcKLSN1bmRlZiBOT19TRVRTSUQKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLSNkZWZpbmUgVVNFX01NQVBfU0NPUkVCT0FSRAotI2RlZmluZSBVU0VfTU1BUF9GSUxFUwotI2lmbmRlZiBERUZBVUxUX1VTRVIKLSNkZWZpbmUgREVGQVVMVF9VU0VSICJub2JvZHkiCi0jZW5kaWYKLSNpZm5kZWYgREVGQVVMVF9HUk9VUAotI2RlZmluZSBERUZBVUxUX0dST1VQICJub2dyb3VwIgotI2VuZGlmCi0jaWYgZGVmaW5lZChfX2JzZGlfXykgfHwgXAotKGRlZmluZWQoX19GcmVlQlNEX3ZlcnNpb24pICYmIChfX0ZyZWVCU0RfdmVyc2lvbiA8IDIyMDAwMCkpCi10eXBlZGVmIHF1YWRfdCBybGltX3Q7Ci0jZW5kaWYKLSNkZWZpbmUgVVNFX0ZMT0NLX1NFUklBTElaRURfQUNDRVBUCi0jZGVmaW5lIFNJTkdMRV9MSVNURU5fVU5TRVJJQUxJWkVEX0FDQ0VQVAotI2RlZmluZSBIQVZFX1NZU0xPRyAxCi0jZGVmaW5lIFNZU19TSUdMSVNUIHN5c19zaWdsaXN0Ci0KLSNlbGlmIGRlZmluZWQoUU5YKQotI2lmbmRlZiBjcnlwdAotY2hhciAqY3J5cHQoY29uc3QgY2hhciAqcHcsIGNvbnN0IGNoYXIgKnNhbHQpOwotI2VuZGlmCi0jaWZuZGVmIGluaXRncm91cHMKLWludCBpbml0Z3JvdXBzKGNoYXIgKiwgaW50KTsKLSNlbmRpZgotI2lmbmRlZiBzdHJuY2FzZWNtcAotI2RlZmluZSBzdHJuY2FzZWNtcCBzdHJuaWNtcAotI2VuZGlmCi0jdW5kZWYgTk9fS0lMTFBHCi0jdW5kZWYgTk9fU0VUU0lECi0jZGVmaW5lIE5FRURfSU5JVEdST1VQUwotI2RlZmluZSBORUVEX1NFTEVDVF9ICi0jZGVmaW5lIE5FRURfUFJPQ0VTU19ICi0jaW5jbHVkZSA8dW5peC5oPgotI2RlZmluZSBIQVZFX01NQVAgMQotI2RlZmluZSBVU0VfUE9TSVhfU0NPUkVCT0FSRAotI2RlZmluZSBVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQKLSNkZWZpbmUgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBUCi0jZGVmaW5lIEhBVkVfU1lTTE9HIDEKLQotI2VsaWYgZGVmaW5lZChMWU5YT1MpCi0jdW5kZWYgSEFWRV9HTVRPRkYKLSN1bmRlZiBVU0VfTU1BUF9TQ09SRUJPQVJECi0jdW5kZWYgVVNFX1NITUdFVF9TQ09SRUJPQVJECi0jdW5kZWYgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUCi0jdW5kZWYgVVNFX0ZMT0NLX1NFUklBTElaRURfQUNDRVBUCi0jZGVmaW5lIFVTRV9MT05HSk1QCi0jdW5kZWYgTk9fS0lMTFBHCi0jdW5kZWYgTk9fU0VUU0lECi0jdW5kZWYgTk9fVVNFX1NJR0FDVElPTgotI3VuZGVmIE5PX0xJTkdDTE9TRQotZXh0ZXJuIGNoYXIgKmNyeXB0KGNoYXIgKnB3LCBjaGFyICpzYWx0KTsKLXR5cGVkZWYgaW50IHJsaW1fdDsKLSNkZWZpbmUgSEFWRV9TWVNMT0cgMQotCi0jZWxpZiBkZWZpbmVkKFVYUERTKQotI3VuZGVmIE5FRURfU1RSQ0FTRUNNUAotI3VuZGVmIE5FRURfU1RSTkNBU0VDTVAKLSN1bmRlZiBORUVEX1NUUkRVUAotI3VuZGVmIEhBVkVfR01UT0ZGCi0jZGVmaW5lIE5PX0tJTExQRwotI3VuZGVmIE5PX1NFVFNJRAotI2RlZmluZSBiemVybyhhLGIpIG1lbXNldChhLDAsYikKLSNkZWZpbmUgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi0jZGVmaW5lIFVTRV9NTUFQX1NDT1JFQk9BUkQKLSNkZWZpbmUgVVNFX01NQVBfRklMRVMKLSNkZWZpbmUgSEFWRV9TWVNMT0cgMQotCi0jZWxpZiBkZWZpbmVkKE9TMikKLS8qIERlZmluZXMgcmVxdWlyZWQgZm9yIEVNWCBPUy8yIHBvcnQuICovCi0jZGVmaW5lIE5PX0tJTExQRwotI2RlZmluZSBORUVEX1NUUkNBU0VDTVAKLSNkZWZpbmUgTkVFRF9TVFJOQ0FTRUNNUAotI2RlZmluZSBORUVEX1BST0NFU1NfSAotI2RlZmluZSBOT19TRVRTSUQKLSNkZWZpbmUgTk9fVElNRVMKLSNkZWZpbmUgQ0FTRV9CTElORF9GSUxFU1lTVEVNCi0vKiBBZGQgc29tZSBkcml2ZSBuYW1lIHN1cHBvcnQgKi8KLSNkZWZpbmUgY2hkaXIgX2NoZGlyMgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZGVmaW5lIE1BWFNPQ0tFVFMgMjA0OAotI2RlZmluZSBVU0VfT1MyX1NDT1JFQk9BUkQKLSNkZWZpbmUgTk9fUkVMSUFCTEVfUElQRURfTE9HUwotI2RlZmluZSBVU0VfT1MyU0VNX1NFUklBTElaRURfQUNDRVBUCi0jZGVmaW5lIFNJTkdMRV9MSVNURU5fVU5TRVJJQUxJWkVEX0FDQ0VQVAotCi0jZWxpZiBkZWZpbmVkKF9fTUFDSFRFTl9fKQotdHlwZWRlZiBpbnQgcmxpbV90OwotI3VuZGVmIE5PX0tJTExQRwotI2RlZmluZSBOT19TRVRTSUQKLSNkZWZpbmUgSEFWRV9HTVRPRkYgMQotI2lmbmRlZiBfX01BQ0hURU5fUFBDX18KLSNpZm5kZWYgX19NQUNIVEVOXzY4S19fCi0jZGVmaW5lIF9fTUFDSFRFTl82OEtfXwotI2VuZGlmCi0jZGVmaW5lIFVTRV9GTE9DS19TRVJJQUxJWkVEX0FDQ0VQVAotI2RlZmluZSBOT19VU0VfU0lHQUNUSU9OCi0jZGVmaW5lIEpNUF9CVUYgc2lnam1wX2J1ZgotI2RlZmluZSBVU0VfTE9OR0pNUAotI3VuZGVmIE5FRURfU1RSRFVQCi0jZWxzZQotI2RlZmluZSBIQVZFX1NITUdFVCAxCi0jZGVmaW5lIFVTRV9TSE1HRVRfU0NPUkVCT0FSRAotI2RlZmluZSBVU0VfRkNOVExfU0VSSUFMSVpFRF9BQ0NFUFQKLSNlbmRpZgotCi0vKiBDb252ZXggT1MgdjExICovCi0jZWxpZiBkZWZpbmVkKENPTlZFWE9TMTEpCi0jdW5kZWYgSEFWRV9HTVRPRkYKLSN1bmRlZiBOT19LSUxMUEcKLSN1bmRlZiBOT19TRVRTSUQKLSN1bmRlZiBORUVEX1NUUkRVUAotI2RlZmluZSBIQVZFX01NQVAgMQotI2RlZmluZSBVU0VfTU1BUF9TQ09SRUJPQVJECi0jZGVmaW5lIFVTRV9NTUFQX0ZJTEVTCi0jZGVmaW5lIEhBVkVfU1lTTE9HIDEKLQotI2RlZmluZSBOT19USU1FWk9ORQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci10eXBlZGVmIGludCBybGltX3Q7Ci0KLSNlbGlmIGRlZmluZWQoSVNDKQotI2luY2x1ZGUgPG5ldC9lcnJuby5oPgotI2RlZmluZSBOT19LSUxMUEcKLSN1bmRlZiBOT19TRVRTSUQKLSNkZWZpbmUgSEFWRV9TSE1HRVQgMQotI2RlZmluZSBVU0VfU0hNR0VUX1NDT1JFQk9BUkQKLSNkZWZpbmUgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUCi0jZGVmaW5lIEhBVkVfU1lTTE9HIDEKLQotI2VsaWYgZGVmaW5lZChORVdTT1MpCi0jZGVmaW5lIEhBVkVfU0hNR0VUIDEKLSNkZWZpbmUgVVNFX1NITUdFVF9TQ09SRUJPQVJECi0jZGVmaW5lIFVTRV9MT05HSk1QCi0jZGVmaW5lIE5PX1NFVFNJRAotI2RlZmluZSBOT19VU0VfU0lHQUNUSU9OCi0jZGVmaW5lIE5FRURfV0FJVFBJRAotI2RlZmluZSBOT19PVEhFUl9DSElMRAotI2RlZmluZSBIQVZFX1NZU0xPRyAxCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLXR5cGVkZWYgaW50IHBpZF90OwotdHlwZWRlZiBpbnQgcmxpbV90OwotdHlwZWRlZiBpbnQgbW9kZV90OwotCi0jZWxpZiBkZWZpbmVkKFJJU0NJWCkKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotdHlwZWRlZiBpbnQgcmxpbV90OwotI2RlZmluZSBOT19VU0VfU0lHQUNUSU9OCi0jZGVmaW5lIFVTRV9MT05HSk1QCi0jZGVmaW5lIE5FRURfU1RSQ0FTRUNNUAotI2RlZmluZSBORUVEX1NUUk5DQVNFQ01QCi0jZGVmaW5lIE5FRURfU1RSRFVQCi0KLSNlbGlmIGRlZmluZWQoQkVPUykKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2RlZmluZSBOT19XUklURVYKLSNkZWZpbmUgTk9fS0lMTFBHCi0jZGVmaW5lIE5FRURfSU5JVEdST1VQUwotCi0jZWxpZiBkZWZpbmVkKF9DWF9TWCkKLSNkZWZpbmUgSk1QX0JVRiBzaWdqbXBfYnVmCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotI2VsaWYgZGVmaW5lZChXSU4zMikKLQotLyogQWxsIHdpbmRvd3Mgc3R1ZmYgaXMgbm93IGluIG9zL3dpbjMyL29zLmggKi8KLQotI2VsaWYgZGVmaW5lZChUUEYpIC8qIElCTSBUcmFuc2FjdGlvbiBQcm9jZXNzaW5nIEZhY2lsaXR5IG9wZXJhdGluZyBzeXN0ZW0gKi8KLQotI2luY2x1ZGUgPHRwZmVxLmg+Ci0jaW5jbHVkZSA8dHBmaW8uaD4KLSNpbmNsdWRlIDxzeXNhcGkuaD4KLSNpbmNsdWRlIDxzeXNndGltZS5oPgotI2RlZmluZSBQUklNRUNSQVMgMHgwMTAwMDAKLSNkZWZpbmUgSk1QX0JVRiBqbXBfYnVmCi0jZGVmaW5lIEhBVkVfU0hNR0VUCi0jdW5kZWYgIEhBVkVfU1lTX1JFU09VUkNFX0gKLSNkZWZpbmUgTkVFRF9JTklUR1JPVVBTCi0jZGVmaW5lIE5FRURfU0lHTkFMX0lOVEVSUlVQVAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNpZm5kZWYgX19zdHJpbmdzX2gKLSNkZWZpbmUgTkVFRF9TVFJDQVNFQ01QCi0jZGVmaW5lIE5FRURfU1RSTkNBU0VDTVAKLSNlbmRpZgotI2RlZmluZSBORUVEX1NUUkRVUAotI2RlZmluZSBOT19EQk1fUkVXUklURU1BUAotI2RlZmluZSBOT19HRVRUSU1FT0ZEQVkKLSNkZWZpbmUgTk9fS0lMTFBHCi0jZGVmaW5lIE5PX0xJTkdDTE9TRQotI2RlZmluZSBOT19NTUFQCi0jZGVmaW5lIE5PX09USEVSX0NISUxECi0jZGVmaW5lIE5PX1JFTElBQkxFX1BJUEVEX0xPR1MKLSNkZWZpbmUgTk9fU0VUU0lECi0jZGVmaW5lIE5PX1NMQUNLCi0jZGVmaW5lIE5PX1RJTUVTCi0jZGVmaW5lIE5PX1VTRV9TSUdBQ1RJT04KLSNkZWZpbmUgTk9fV1JJVEVWCi0jZGVmaW5lIFVTRV9MT05HSk1QCi0vKiNkZWZpbmUgVVNFX1NITUdFVF9TQ09SRUJPQVJEKi8KLSNkZWZpbmUgVVNFX1RQRl9BQ0NFUFQKLSNkZWZpbmUgVVNFX1RQRl9DT1JFX1NFUklBTElaRURfQUNDRVBUCi0vKiNkZWZpbmUgVVNFX1RQRl9EQUVNT04qLwotI2RlZmluZSBVU0VfVFBGX1NDT1JFQk9BUkQKLSNkZWZpbmUgVVNFX1RQRl9TRUxFQ1QKLSN1bmRlZiAgb2Zmc2V0b2YKLSNkZWZpbmUgb2Zmc2V0b2Yoc190eXBlLGZpZWxkKSAoKHNpemVfdCkmKCgoc190eXBlKikwKS0+ZmllbGQpKQotCi0jZWxpZiBkZWZpbmVkKF9fVEFOREVNKQotI2RlZmluZSBOT19XUklURVYKLSNkZWZpbmUgTk9fS0lMTFBHCi0jZGVmaW5lIE5FRURfSU5JVEdST1VQUwotI2RlZmluZSBOT19TTEFDSwotCi0jZWxzZQotLyogVW5rbm93biBzeXN0ZW0gLSBFZGl0IHRoZXNlIHRvIG1hdGNoICovCi0jaWZkZWYgQlNECi0jZGVmaW5lIEhBVkVfR01UT0ZGIDEKLSNlbHNlCi0jdW5kZWYgSEFWRV9HTVRPRkYKLSNlbmRpZgotLyogTk9fS0lMTFBHIGlzIHNldCBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSBraWxscGcgKi8KLSN1bmRlZiBOT19LSUxMUEcKLS8qIE5PX1NFVFNJRCBpcyBzZXQgb24gc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgc2V0c2lkICovCi0jdW5kZWYgTk9fU0VUU0lECi0vKiBORUVEX1NUUkRVUCBpcyBzZXQgb24gc3R1cGlkIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIHN0cmR1cC4gKi8KLSN1bmRlZiBORUVEX1NUUkRVUAotI2VuZGlmCi0KLS8qIHN0dWZmIG1hcmtlZCBBUElfRVhQT1JUIGlzIHBhcnQgb2YgdGhlIEFQSSwgYW5kIGludGVuZGVkIGZvciB1c2UKLSAqIGJ5IG1vZHVsZXMKLSAqLwotI2lmbmRlZiBBUElfRVhQT1JUCi0jZGVmaW5lIEFQSV9FWFBPUlQodHlwZSkgICAgdHlwZQotI2VuZGlmCi0KLS8qIFN0dWZmIG1hcmtlZCBBUElfRVhQT1JUX05PTlNURCBpcyBwYXJ0IG9mIHRoZSBBUEksIGFuZCBpbnRlbmRlZCBmb3IKLSAqIHVzZSBieSBtb2R1bGVzLiAgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBBUElfRVhQT1JUIGFuZAotICogQVBJX0VYUE9SVF9OT05TVEQgaXMgdGhhdCB0aGUgbGF0dGVyIGlzIHJlcXVpcmVkIGZvciBhbnkgZnVuY3Rpb25zCi0gKiB3aGljaCB1c2UgdmFyYXJncyBvciBhcmUgdXNlZCB2aWEgaW5kaXJlY3QgZnVuY3Rpb24gY2FsbC4gIFRoaXMKLSAqIGlzIHRvIGFjY29tb2RhdGUgdGhlIHR3byBjYWxsaW5nIGNvbnZlbnRpb25zIGluIHdpbmRvd3MgZGxscy4KLSAqLwotI2lmbmRlZiBBUElfRVhQT1JUX05PTlNURAotI2RlZmluZSBBUElfRVhQT1JUX05PTlNURCh0eXBlKSAgICB0eXBlCi0jZW5kaWYKLQotI2lmbmRlZiBNT0RVTEVfVkFSX0VYUE9SVAotI2RlZmluZSBNT0RVTEVfVkFSX0VYUE9SVAotI2VuZGlmCi0jaWZuZGVmIEFQSV9WQVJfRVhQT1JUCi0jZGVmaW5lIEFQSV9WQVJfRVhQT1JUCi0jZW5kaWYKLQotLyogbW9kdWxlcyBzaG91bGQgbm90IHVzZWQgZnVuY3Rpb25zIG1hcmtlZCBDT1JFX0VYUE9SVAotICogb3IgQ09SRV9FWFBPUlRfTk9OU1REICovCi0jaWZuZGVmIENPUkVfRVhQT1JUCi0jZGVmaW5lIENPUkVfRVhQT1JUCUFQSV9FWFBPUlQKLSNlbmRpZgotI2lmbmRlZiBDT1JFX0VYUE9SVF9OT05TVEQKLSNkZWZpbmUgQ09SRV9FWFBPUlRfTk9OU1RECUFQSV9FWFBPUlRfTk9OU1RECi0jZW5kaWYKLQotLyogT24gTWFjIE9TIFggU2VydmVyLCBzeW1ib2xzIHRoYXQgY29uZmxpY3Qgd2l0aCBsb2FkZWQgZHlsaWJzCi0gKiAoZWcuIFN5c3RlbSBmcmFtZXdvcmspIG5lZWQgdG8gYmUgZGVjbGFyZWQgYXMgcHJpdmF0ZSBzeW1ib2xzIHdpdGgKLSAqIF9fcHJpdmF0ZV9leHRlcm5fXy4KLSAqIEZvciBvdGhlciBzeXN0ZW1zLCBtYWtlIHRoYXQgYSBuby1vcC4KLSAqLwotI2lmIChkZWZpbmVkKE1BQ19PUykgfHwgZGVmaW5lZChNQUNfT1NfWF9TRVJWRVIpKSAmJiBkZWZpbmVkKF9fRFlOQU1JQ19fKQotI2RlZmluZSBhcF9wcml2YXRlX2V4dGVybiBfX3ByaXZhdGVfZXh0ZXJuX18KLSNlbHNlCi0jZGVmaW5lIGFwX3ByaXZhdGVfZXh0ZXJuCi0jZW5kaWYKLQotLyoKLSAqIFRoZSBwYXJ0aWN1bGFyIGRpcmVjdG9yeSBzdHlsZSB5b3VyIHN5c3RlbSBzdXBwb3J0cy4gSWYgeW91IGhhdmUgZGlyZW50LmgKLSAqIGluIC91c3IvaW5jbHVkZSAoUE9TSVgpIG9yIC91c3IvaW5jbHVkZS9zeXMgKFNZU1YpLCAjaW5jbHVkZSAKLSAqIHRoYXQgZmlsZSBhbmQgZGVmaW5lIERJUl9UWVBFIHRvIGJlIGRpcmVudC4gT3RoZXJ3aXNlLCBpZiB5b3UgaGF2ZSAKLSAqIC91c3IvaW5jbHVkZS9zeXMvZGlyLmgsIGRlZmluZSBESVJfVFlQRSB0byBiZSBkaXJlY3QgYW5kIGluY2x1ZGUgdGhhdAotICogZmlsZS4gSWYgeW91IGhhdmUgbmVpdGhlciwgSSdtIGNvbmZ1c2VkLgotICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2lmICFkZWZpbmVkKE5FWFQpICYmICFkZWZpbmVkKFdJTjMyKQotI2luY2x1ZGUgPGRpcmVudC5oPgotI2RlZmluZSBESVJfVFlQRSBkaXJlbnQKLSNlbGlmICFkZWZpbmVkKFdJTjMyKQotI2luY2x1ZGUgPHN5cy9kaXIuaD4KLSNkZWZpbmUgRElSX1RZUEUgZGlyZWN0Ci0jZWxzZQotI2RlZmluZSBESVJfVFlQRSBkaXJlbnQKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpZmRlZiBfX1RBTkRFTQotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2luY2x1ZGUgImFwX2N0eXBlLmgiCi0jaWYgIWRlZmluZWQoTVBFKSAmJiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoVFBGKSAmJiAhZGVmaW5lZChfX1RBTkRFTSkKLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotI2VuZGlmCi0jaWZuZGVmIFdJTjMyCi0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2lmZGVmIEhBVkVfU1lTX1NFTEVDVF9ICi0jaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgotI2VuZGlmIC8qIEhBVkVfU1lTX1NFTEVDVF9IICovCi0jaWZuZGVmIFRQRgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNlbmRpZiAvKiBUUEYgKi8KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2lmICFkZWZpbmVkKE1QRSkgJiYgIWRlZmluZWQoQkVPUykgJiYgIWRlZmluZWQoVFBGKQotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgkJLyogZm9yIGluZXRfbnRvYSAqLwotI2VuZGlmCi0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDxncnAuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2RlZmluZSBjbG9zZXNvY2tldChzKSBjbG9zZShzKQotI2lmbmRlZiBPX0JJTkFSWQotI2RlZmluZSBPX0JJTkFSWSAoMCkKLSNlbmRpZgotCi0jZWxzZSAvKiBXSU4zMiAqLwotI2luY2x1ZGUgPHdpbnNvY2syLmg+Ci0jaW5jbHVkZSA8bWFsbG9jLmg+Ci0jaW5jbHVkZSA8aW8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2VuZGlmIC8qIG5kZWYgV0lOMzIgKi8KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDx0aW1lLmg+CQkvKiBmb3IgY3RpbWUgKi8KLSNpZmRlZiBXSU4zMgotI2RlZmluZSBzdHJmdGltZShzLG1heCxmb3JtYXQsdG0pICBvc19zdHJmdGltZShzLG1heCxmb3JtYXQsdG0pCi0jZW5kaWYKLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpZiBkZWZpbmVkKFRQRikgJiYgZGVmaW5lZChOU0lHKQotI3VuZGVmIE5TSUcKLSNlbmRpZgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWYgIWRlZmluZWQoUU5YKSAmJiAhZGVmaW5lZChDT05WRVhPUzExKSAmJiAhZGVmaW5lZChORVhUKSAmJiAhZGVmaW5lZChUUEYpCi0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0jZW5kaWYKLQotI2lmZGVmIE5FRURfUFJPQ0VTU19ICi0jaW5jbHVkZSA8cHJvY2Vzcy5oPgotI2VuZGlmCi0KLSNpZmRlZiBXSU4zMgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvaHNyZWdleC5oIgotI2VsaWYgZGVmaW5lZChVU0VfSFNSRUdFWCkKLSNpbmNsdWRlICJoc3JlZ2V4LmgiCi0jZWxzZQotI2luY2x1ZGUgPHJlZ2V4Lmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNpZmRlZiBTVU5PUzQKLWludCBnZXRybGltaXQoaW50LCBzdHJ1Y3QgcmxpbWl0ICopOwotaW50IHNldHJsaW1pdChpbnQsIHN0cnVjdCBybGltaXQgKik7Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIFVTRV9NTUFQX1NDT1JFQk9BUkQKLSNpZiAhZGVmaW5lZChPUzIpICYmICFkZWZpbmVkKFdJTjMyKQotLyogVGhpcyBmaWxlIGlzIG5vdCBuZWVkZWQgZm9yIE9TLzIgKi8KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChNQVBfQU5PTikgJiYgZGVmaW5lZChNQVBfQU5PTllNT1VTKQotI2RlZmluZSBNQVBfQU5PTiBNQVBfQU5PTllNT1VTCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoVVNFX01NQVBfRklMRVMpICYmIChkZWZpbmVkKE5PX01NQVApIHx8ICFkZWZpbmVkKEhBVkVfTU1BUCkpCi0jdW5kZWYgVVNFX01NQVBfRklMRVMKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChVU0VfTU1BUF9TQ09SRUJPQVJEKSAmJiAoZGVmaW5lZChOT19NTUFQKSB8fCAhZGVmaW5lZChIQVZFX01NQVApKQotI3VuZGVmIFVTRV9NTUFQX1NDT1JFQk9BUkQKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChVU0VfU0hNR0VUX1NDT1JFQk9BUkQpICYmIChkZWZpbmVkKE5PX1NITUdFVCkgfHwgIWRlZmluZWQoSEFWRV9TSE1HRVQpKQotI3VuZGVmIFVTRV9TSE1HRVRfU0NPUkVCT0FSRAotI2VuZGlmCi0KLSNpZm5kZWYgTE9HTkFNRV9NQVgKLSNkZWZpbmUgTE9HTkFNRV9NQVggMjUKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZmRlZiB1bHRyaXgKLSNkZWZpbmUgVUxUUklYX0JSQUlOX0RFQVRICi0jZW5kaWYKLQotI2lmbmRlZiBTX0lTTE5LCi0jZGVmaW5lIFNfSVNMTksobSkgKCgobSkgJiBTX0lGTVQpID09IFNfSUZMTkspCi0jZW5kaWYKLQotI2lmbmRlZiBJTkFERFJfTk9ORQotI2RlZmluZSBJTkFERFJfTk9ORSAoKHVuc2lnbmVkIGxvbmcpIC0xKQotI2VuZGlmCi0KLS8qCi0gKiBSZXBsYWNlIHNpZ25hbCBmdW5jdGlvbiB3aXRoIHNpZ2FjdGlvbiBlcXVpdmFsZW50Ci0gKi8KLSNpZm5kZWYgTk9fVVNFX1NJR0FDVElPTgotdHlwZWRlZiB2b2lkIFNpZ2Z1bmMoaW50KTsKLQotI2lmIGRlZmluZWQoU0lHX0lHTikgJiYgIWRlZmluZWQoU0lHX0VSUikKLSNkZWZpbmUgU0lHX0VSUiAoKFNpZ2Z1bmMgKiktMSkKLSNlbmRpZgotCi0vKgotICogRm9yIHNvbWUgc3RyYW5nZSByZWFzb24sIFFOWCBkZWZpbmVzIHNpZ25hbCB0byBzaWduYWwuIEVsaW1pbmF0ZSBpdC4KLSAqLwotI2lmZGVmIHNpZ25hbAotI3VuZGVmIHNpZ25hbAotI2VuZGlmCi0jZGVmaW5lIHNpZ25hbChzLGYpCWFwX3NpZ25hbChzLGYpCi1TaWdmdW5jICpzaWduYWwoaW50IHNpZ25vLCBTaWdmdW5jICogZnVuYyk7Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHNldGptcC5oPgotCi0jaWYgZGVmaW5lZChVU0VfTE9OR0pNUCkKLSNkZWZpbmUgYXBfbG9uZ2ptcCh4LCB5KSAgICAgICAgbG9uZ2ptcCgoeCksICh5KSkKLSNkZWZpbmUgYXBfc2V0am1wKHgpICAgICAgICAgICAgc2V0am1wKHgpCi0jaWZuZGVmIEpNUF9CVUYKLSNkZWZpbmUgSk1QX0JVRiBqbXBfYnVmCi0jZW5kaWYKLSNlbHNlCi0jZGVmaW5lIGFwX2xvbmdqbXAoeCwgeSkgICAgICAgIHNpZ2xvbmdqbXAoKHgpLCAoeSkpCi0jZGVmaW5lIGFwX3NldGptcCh4KSAgICAgICAgICAgIHNpZ3NldGptcCgoeCksIDEpCi0jaWZuZGVmIEpNUF9CVUYKLSNkZWZpbmUgSk1QX0JVRiBzaWdqbXBfYnVmCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBNYWpvcml0eSBvZiBvcydzIHdhbnQgdG8gdmVyaWZ5IEZEX1NFVFNJWkUgKi8KLSNpZiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoVFBGKQotI2RlZmluZSBDSEVDS19GRF9TRVRTSVpFCi0jZW5kaWYKLQotI2lmZGVmIFVTRV9UUEZfU0VMRUNUCi0jZGVmaW5lIGFwX3NlbGVjdChfYSwgX2IsIF9jLCBfZCwgX2UpCVwKLQl0cGZfc2VsZWN0KF9hLCBfYiwgX2MsIF9kLCBfZSkKLSNlbGlmIGRlZmluZWQoU0VMRUNUX05FRURTX0NBU1QpCi0jZGVmaW5lIGFwX3NlbGVjdChfYSwgX2IsIF9jLCBfZCwgX2UpICAgXAotICAgIHNlbGVjdCgoX2EpLCAoaW50ICopKF9iKSwgKGludCAqKShfYyksIChpbnQgKikoX2QpLCAoX2UpKQotI2Vsc2UKLSNkZWZpbmUgYXBfc2VsZWN0KF9hLCBfYiwgX2MsIF9kLCBfZSkgICBcCi0Jc2VsZWN0KF9hLCBfYiwgX2MsIF9kLCBfZSkKLSNlbmRpZgotCi0jaWZkZWYgVVNFX1RQRl9BQ0NFUFQKLSNkZWZpbmUgYXBfYWNjZXB0KF9mZCwgX3NhLCBfbG4pCXRwZl9hY2NlcHQoX2ZkLCBfc2EsIF9sbikKLSNlbHNlCi0jZGVmaW5lIGFwX2FjY2VwdChfZmQsIF9zYSwgX2xuKQlhY2NlcHQoX2ZkLCBfc2EsIF9sbikKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9TSUdOQUxfSU5URVJSVVBUCi0jZGVmaW5lIGFwX2NoZWNrX3NpZ25hbHMoKQl0cGZfcHJvY2Vzc19zaWduYWxzKCkKLSNlbHNlCi0jZGVmaW5lIGFwX2NoZWNrX3NpZ25hbHMoKQotI2VuZGlmCi0KLSNpZmRlZiBVTFRSSVhfQlJBSU5fREVBVEgKLSNkZWZpbmUgYXBfZmRvcGVuKGQsbSkgZmRvcGVuKChkKSwgKGNoYXIgKikobSkpCi0jZWxzZQotI2RlZmluZSBhcF9mZG9wZW4oZCxtKSBmZG9wZW4oKGQpLCAobSkpCi0jZW5kaWYKLQotI2lmbmRlZiBhcF9pbmV0X2FkZHIKLSNkZWZpbmUgYXBfaW5ldF9hZGRyIGluZXRfYWRkcgotI2VuZGlmCi0KLSNpZmRlZiBOT19PVEhFUl9DSElMRAotI2RlZmluZSBOT19SRUxJQUJMRV9QSVBFRF9MT0dTCi0jZW5kaWYKLQotLyogV2hlbiB0aGUgdW5kZXJseWluZyBPUyBkb2Vzbid0IHN1cHBvcnQgZXhlYygpIG9mIHNjcmlwdHMgd2hpY2ggc3RhcnQKLSAqIHdpdGggYSBIQVNIQkFORyAoIyEpIGZvbGxvd2VkIGJ5IGludGVycHJldGVyIG5hbWUgYW5kIGFyZ3MsIGRlZmluZSB0aGlzLgotICovCi0jaWZkZWYgTkVFRF9IQVNIQkFOR19FTVVMCi1leHRlcm4gaW50IGFwX2V4ZWNsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqYXJnLC4uLik7Ci1leHRlcm4gaW50IGFwX2V4ZWN2ZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqYXJndltdLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW52cFtdKTsKLS8qIGFwX2V4ZWNsZSgpIGlzIGEgd3JhcHBlciBmdW5jdGlvbiBhcm91bmQgYXBfZXhlY3ZlKCkuICovCi0jZGVmaW5lIGV4ZWNsZSAgYXBfZXhlY2xlCi0jZGVmaW5lIGV4ZWN2ZShwYXRoLGFyZ3YsZW52cCkgIGFwX2V4ZWN2ZShwYXRoLGFyZ3YsZW52cCkKLSNlbmRpZgotCi0vKiBGaW5kaW5nIG9mZnNldHMgb2YgZWxlbWVudHMgd2l0aGluIHN0cnVjdHVyZXMuCi0gKiBUYWtlbiBmcm9tIHRoZSBYIGNvZGUuLi4gdGhleSd2ZSBzd2VhdGVkIHBvcnRhYmlsaXR5IG9mIHRoaXMgc3R1ZmYKLSAqIHNvIHdlIGRvbid0IGhhdmUgdG8uICBTaWdoLi4uCi0gKi8KLQotI2lmIGRlZmluZWQoQ1JBWSkgfHwgKGRlZmluZWQoX19hcm0pICYmICFkZWZpbmVkKExJTlVYKSkKLSNpZmRlZiBfX1NURENfXwotI2RlZmluZSBYdE9mZnNldChwX3R5cGUsZmllbGQpIF9PZmZzZXRvZihwX3R5cGUsZmllbGQpCi0jZWxzZQotI2lmZGVmIENSQVkyCi0jZGVmaW5lIFh0T2Zmc2V0KHBfdHlwZSxmaWVsZCkgXAotCShzaXplb2YoaW50KSooKHVuc2lnbmVkIGludCkmKCgocF90eXBlKU5VTEwpLT5maWVsZCkpKQotCi0jZWxzZSAvKiAhQ1JBWTIgKi8KLQotI2RlZmluZSBYdE9mZnNldChwX3R5cGUsZmllbGQpICgodW5zaWduZWQgaW50KSYoKChwX3R5cGUpTlVMTCktPmZpZWxkKSkKLQotI2VuZGlmIC8qICFDUkFZMiAqLwotI2VuZGlmIC8qIF9fU1REQ19fICovCi0jZWxzZSAvKiAhIChDUkFZIHx8IF9fYXJtKSAqLwotCi0jZGVmaW5lIFh0T2Zmc2V0KHBfdHlwZSxmaWVsZCkgXAotCSgobG9uZykgKCgoY2hhciAqKSAoJigoKHBfdHlwZSlOVUxMKS0+ZmllbGQpKSkgLSAoKGNoYXIgKikgTlVMTCkpKQotCi0jZW5kaWYgLyogIUNSQVkgKi8KLQotI2lmZGVmIG9mZnNldG9mCi0jZGVmaW5lIFh0T2Zmc2V0T2Yoc190eXBlLGZpZWxkKSBvZmZzZXRvZihzX3R5cGUsZmllbGQpCi0jZWxzZQotI2RlZmluZSBYdE9mZnNldE9mKHNfdHlwZSxmaWVsZCkgWHRPZmZzZXQoc190eXBlKixmaWVsZCkKLSNlbmRpZgotCi0vKgotICogTkVUX1NJWkVfVCBleGlzdHMgYmVjYXVzZSBvZiBzaG9ydHNpZ2h0ZWRuZXNzIG9uIHRoZSBQT1NJWCBjb21taXR0ZWUuICBCU0QKLSAqIHN5c3RlbXMgdXNlZCAiaW50ICoiIGFzIHRoZSBwYXJhbWV0ZXIgdG8gYWNjZXB0KCksIGdldHNvY2tuYW1lKCksCi0gKiBnZXRwZWVybmFtZSgpIGV0IGFsLiAgQ29uc2VxdWVudGx5IG1hbnkgdW5peGVzIHRvb2sgYW4gaW50ICogZm9yIHRoYXQKLSAqIHBhcmFtZXRlci4gIFRoZSBQT1NJWCBjb21taXR0ZWUgZGVjaWRlZCB0aGF0ICJpbnQiIHdhcyBqdXN0IHRvbyBnZW5lcmljIGFuZAotICogaGFkIHRvIGJlIHJlcGxhY2VkIHdpdGggc2l6ZV90IGFsbW9zdCBldmVyeXdoZXJlLiAgVGhlcmUncyBubyBwcm9ibGVtIHdpdGgKLSAqIHRoYXQgd2hlbiB5b3UncmUgcGFzc2luZyBieSB2YWx1ZS4gIEJ1dCB3aGVuIHlvdSdyZSBwYXNzaW5nIGJ5IHJlZmVyZW5jZQotICogdGhpcyBjcmVhdGVzIGEgZ3Jvc3Mgc291cmNlIGluY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIHByb2dyYW1zLiAgT24KLSAqIDMyLWJpdCBhcmNoaXRlY3R1cmVzIGl0IGNyZWF0ZXMgb25seSBhIHdhcm5pbmcuICBPbiA2NC1iaXQgYXJjaGl0ZWN0dXJlcyBpdAotICogY3JlYXRlcyBicm9rZW4gY29kZSAtLSBiZWNhdXNlICJpbnQgKiIgaXMgYSBwb2ludGVyIHRvIGEgNjQtYml0IHF1YW50aXR5IGFuZAotICogInNpemVfdCAqIiBpcyBmcmVxdWVudGx5IGEgcG9pbnRlciB0byBhIDMyLWJpdCBxdWFudGl0eS4KLSAqCi0gKiBTb21lIFVuaXhlcyBhZG9wdGVkICJzaXplX3QgKiIgZm9yIHRoZSBzYWtlIG9mIFBPU0lYIGNvbXBsaWFuY2UuICBPdGhlcnMKLSAqIGlnbm9yZWQgaXQgYmVjYXVzZSBpdCB3YXMgc3VjaCBhIGJyb2tlbiBpbnRlcmZhY2UuICBDaGFvcyBlbnN1ZWQuICBQT1NJWAotICogZmluYWxseSB3b2tlIHVwIGFuZCBkZWNpZGVkIHRoYXQgaXQgd2FzIHdyb25nIGFuZCBjcmVhdGVkIGEgbmV3IHR5cGUKLSAqIHNvY2tsZW5fdC4gIFRoZSBvbmx5IHVzZWZ1bCB2YWx1ZSBmb3Igc29ja2xlbl90IGlzIGludCwgYW5kIHRoYXQncyBob3cKLSAqIGV2ZXJ5b25lIHdobyBoYXMgYSBjbHVlIGltcGxlbWVudHMgaXQuICBJdCBpcyBhbG1vc3QgYWx3YXlzIHRoZSBjYXNlIHRoYXQKLSAqIE5FVF9TSVpFX1Qgc2hvdWxkIGJlIGRlZmluZWQgdG8gYmUgYW4gaW50LCB1bmxlc3MgdGhlIHN5c3RlbSBiZWluZyBjb21waWxlZAotICogZm9yIHdhcyBjcmVhdGVkIGluIHRoZSB3aW5kb3cgb2YgUE9TSVggbWFkbmVzcy4KLSAqLwotI2lmbmRlZiBORVRfU0laRV9UCi0jZGVmaW5lIE5FVF9TSVpFX1QgaW50Ci0jZW5kaWYKLQotLyogTGludXggZGVmaW5lcyBfX1dDT1JFRFVNUCwgYnV0IGRvZXNuJ3QgZGVmaW5lIFdDT1JFRFVNUCB1bmxlc3MgX19VU0VfQlNECi0gKiBpcyBpbiB1c2UuLi4gd2UnZCBwcmVmZXIgdG8ganVzdCB1c2UgV0NPUkVEVU1QIGV2ZXJ5d2hlcmUuCi0gKi8KLSNpZiBkZWZpbmVkKF9fV0NPUkVEVU1QKSAmJiAhZGVmaW5lZChXQ09SRURVTVApCi0jZGVmaW5lIFdDT1JFRFVNUCBfX1dDT1JFRFVNUAotI2VuZGlmCi0KLSNpZmRlZiBTVU5PU19MSUJfUFJPVE9UWVBFUwotLyogUHJvdG90eXBlcyBuZWVkZWQgdG8gZ2V0IGEgY2xlYW4gY29tcGlsZSB3aXRoIGdjYyAtV2FsbC4KLSAqIEJlbGlldmUgaXQgb3Igbm90LCB0aGVzZSBkbyBoYXZlIHRvIGJlIGRlY2xhcmVkLCBhdCBsZWFzdCBvbiBTdW5PUywKLSAqIGJlY2F1c2UgdGhleSBhcmVuJ3QgbWVudGlvbmVkIGluIHRoZSByZWxldmFudCBzeXN0ZW0gaGVhZGVycy4KLSAqIFN1biBRdWFsaXR5IFNvZnR3YXJlLiAgR290dGEgbG92ZSBpdC4gIFRoaXMgc2VjdGlvbiBpcyBub3QgCi0gKiBjdXJyZW50bHkgKDEzTm92OTcpIHVzZWQuCi0gKi8KLQotaW50IGdldG9wdChpbnQsIGNoYXIgKiosIGNoYXIgKik7Ci0KLWludCBzdHJjYXNlY21wKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLWludCBzdHJuY2FzZWNtcChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKLWludCB0b3VwcGVyKGludCk7Ci1pbnQgdG9sb3dlcihpbnQpOwotCi1pbnQgcHJpbnRmKGNoYXIgKiwuLi4pOwotaW50IGZwcmludGYoRklMRSAqLCBjaGFyICosLi4uKTsKLWludCBmcHV0cyhjaGFyICosIEZJTEUgKik7Ci1pbnQgZnJlYWQoY2hhciAqLCBpbnQsIGludCwgRklMRSAqKTsKLWludCBmd3JpdGUoY2hhciAqLCBpbnQsIGludCwgRklMRSAqKTsKLWludCBmZ2V0YyhGSUxFICopOwotY2hhciAqZmdldHMoY2hhciAqcywgaW50LCBGSUxFKik7Ci1pbnQgZmZsdXNoKEZJTEUgKik7Ci1pbnQgZmNsb3NlKEZJTEUgKik7Ci1pbnQgdW5nZXRjKGludCwgRklMRSAqKTsKLWludCBfZmlsYnVmKEZJTEUgKik7CS8qICEhISAqLwotaW50IF9mbHNidWYodW5zaWduZWQgY2hhciwgRklMRSAqKTsJLyogISEhICovCi1pbnQgc3NjYW5mKGNoYXIgKiwgY2hhciAqLC4uLik7Ci12b2lkIHNldGJ1ZihGSUxFICosIGNoYXIgKik7Ci12b2lkIHBlcnJvcihjaGFyICopOwotCi10aW1lX3QgdGltZSh0aW1lX3QgKik7Ci1pbnQgc3RyZnRpbWUoY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgc3RydWN0IHRtICopOwotCi1pbnQgaW5pdGdyb3VwcyhjaGFyICosIGludCk7Ci1pbnQgd2FpdDMoaW50ICosIGludCwgdm9pZCAqKTsJLyogQ2xvc2UgZW5vdWdoIGZvciB1cy4uLiAqLwotaW50IGxzdGF0KGNvbnN0IGNoYXIgKiwgc3RydWN0IHN0YXQgKik7Ci1pbnQgc3RhdChjb25zdCBjaGFyICosIHN0cnVjdCBzdGF0ICopOwotaW50IGZsb2NrKGludCwgaW50KTsKLSNpZm5kZWYgTk9fS0lMTFBHCi1pbnQga2lsbHBnKGludCwgaW50KTsKLSNlbmRpZgotaW50IHNvY2tldChpbnQsIGludCwgaW50KTsKLWludCBzZXRzb2Nrb3B0KGludCwgaW50LCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50KTsKLWludCBsaXN0ZW4oaW50LCBpbnQpOwotaW50IGJpbmQoaW50LCBzdHJ1Y3Qgc29ja2FkZHIgKiwgaW50KTsKLWludCBjb25uZWN0KGludCwgc3RydWN0IHNvY2thZGRyICosIGludCk7Ci1pbnQgYWNjZXB0KGludCwgc3RydWN0IHNvY2thZGRyICosIGludCAqKTsKLWludCBzaHV0ZG93bihpbnQsIGludCk7Ci0KLWludCBnZXRzb2NrbmFtZShpbnQgcywgc3RydWN0IHNvY2thZGRyICpuYW1lLCBpbnQgKm5hbWVsZW4pOwotaW50IGdldHBlZXJuYW1lKGludCBzLCBzdHJ1Y3Qgc29ja2FkZHIgKm5hbWUsIGludCAqbmFtZWxlbik7Ci1pbnQgZ2V0aG9zdG5hbWUoY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pOwotdm9pZCBzeXNsb2coaW50LCBjaGFyICosLi4uKTsKLWNoYXIgKm1rdGVtcChjaGFyICopOwotCi1sb25nIHZmcHJpbnRmKEZJTEUgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKLQotI2VuZGlmIC8qIFNVTk9TX0xJQl9QUk9UT1RZUEVTICovCi0KLS8qIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgd2hlbiB0aGUgZnVuY3Rpb25zIGFyZSBtaXNzaW5nLAotICogdGhlbiB0aGVyZSdzIG5vIG1hdGNoaW5nIHByb3RvdHlwZSBhdmFpbGFibGUgZWl0aGVyLgotICogRGVjbGFyZSB3aGF0IGlzIG5lZWRlZCBleGFjdGx5IGFzIHRoZSByZXBsYWNlbWVudCByb3V0aW5lcyBpbXBsZW1lbnQgaXQuCi0gKi8KLSNpZmRlZiBORUVEX1NUUkRVUAotZXh0ZXJuIGNoYXIgKnN0cmR1cCAoY29uc3QgY2hhciAqc3RyKTsKLSNlbmRpZgotI2lmZGVmIE5FRURfU1RSQ0FTRUNNUAotZXh0ZXJuIGludCBzdHJjYXNlY21wIChjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpiKTsKLSNlbmRpZgotI2lmZGVmIE5FRURfU1RSTkNBU0VDTVAKLWV4dGVybiBpbnQgc3RybmNhc2VjbXAgKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIsIGludCBuKTsKLSNlbmRpZgotI2lmZGVmIE5FRURfSU5JVEdST1VQUwotZXh0ZXJuIGludCBpbml0Z3JvdXBzKGNvbnN0IGNoYXIgKm5hbWUsIGdpZF90IGJhc2VnaWQpOwotI2VuZGlmCi0jaWZkZWYgTkVFRF9XQUlUUElECi1leHRlcm4gaW50IHdhaXRwaWQocGlkX3QgcGlkLCBpbnQgKnN0YXR1c3AsIGludCBvcHRpb25zKTsKLSNlbmRpZgotI2lmZGVmIE5FRURfU1RSRVJST1IKLWV4dGVybiBjaGFyICpzdHJlcnJvciAoaW50IGVycik7Ci0jZW5kaWYKLSNpZmRlZiBORUVEX0RJRkZUSU1FCi1leHRlcm4gZG91YmxlIGRpZmZ0aW1lKHRpbWVfdCB0aW1lMSwgdGltZV90IHRpbWUwKTsKLSNlbmRpZgotCi0jaWZuZGVmIGFwX3dhaXRfdAotI2RlZmluZSBhcF93YWl0X3QgaW50Ci0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFBUF9DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hcF9saXN0ZW4uaCBiL2luY2x1ZGUvYXBfbGlzdGVuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMGY2ZmMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hcF9saXN0ZW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotI2lmbmRlZiBBUF9MSVNURU5fSAotI2RlZmluZSBBUF9MSVNURU5fSAotCi10eXBlZGVmIHN0cnVjdCBhcF9saXN0ZW5fcmVjIGFwX2xpc3Rlbl9yZWM7Ci1zdHJ1Y3QgYXBfbGlzdGVuX3JlYyB7Ci0gICAgYXBfbGlzdGVuX3JlYyAqbmV4dDsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbG9jYWxfYWRkcjsJLyogbG9jYWwgSVAgYWRkcmVzcyBhbmQgcG9ydCAqLwotLyogVE9ETzogcmVwbGFjZSB0aGUgZmQgd2l0aCBBUFIgc3R1ZmYgKi8KLSAgICBpbnQgZmQ7Ci0vKiBtb3JlIHN0dWZmIGhlcmUsIGxpa2Ugd2hpY2ggcHJvdG9jb2wgaXMgYm91bmQgdG8gdGhlIHBvcnQgKi8KLX07Ci0KLWFwX2xpc3Rlbl9yZWMgKmFwX2xpc3RlbmVyczsKLQotdm9pZCBhcF9saXN0ZW5fcHJlX2NvbmZpZyh2b2lkKTsKLWludCBhcF9saXN0ZW5fb3Blbihwb29sICpwY29uZiwgdW5zaWduZWQgcG9ydCk7Ci1jb25zdCBjaGFyICphcF9zZXRfbGlzdGVuYmFja2xvZyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZyk7Ci1jb25zdCBjaGFyICphcF9zZXRfbGlzdGVuZXIoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICppcHMpOwotY29uc3QgY2hhciAqYXBfc2V0X3NlbmRfYnVmZmVyX3NpemUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpOwotCi0jZGVmaW5lIExJU1RFTl9DT01NQU5EUwlcCi17ICJMaXN0ZW5CYWNrbG9nIiwgYXBfc2V0X2xpc3RlbmJhY2tsb2csIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsIFwKLSAgIk1heGltdW0gbGVuZ3RoIG9mIHRoZSBxdWV1ZSBvZiBwZW5kaW5nIGNvbm5lY3Rpb25zLCBhcyB1c2VkIGJ5IGxpc3RlbigyKSIgfSwgXAoteyAiTGlzdGVuIiwgYXBfc2V0X2xpc3RlbmVyLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLCBcCi0gICJBIHBvcnQgbnVtYmVyIG9yIGEgbnVtZXJpYyBJUCBhZGRyZXNzIGFuZCBhIHBvcnQgbnVtYmVyIn0sIFwKLXsgIlNlbmRCdWZmZXJTaXplIiwgYXBfc2V0X3NlbmRfYnVmZmVyX3NpemUsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsIFwKLSAgIlNlbmQgYnVmZmVyIHNpemUgaW4gYnl0ZXMifSwKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FwX21tbi5oIGIvaW5jbHVkZS9hcF9tbW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYzMTM4My4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FwX21tbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotI2lmbmRlZiBBUEFDSEVfQVBfTU1OX0gKLSNkZWZpbmUgQVBBQ0hFX0FQX01NTl9ICi0KLS8qCi0gKiBNT0RVTEVfTUFHSUNfTlVNQkVSX01BSk9SCi0gKiBNYWpvciBBUEkgY2hhbmdlcyB0aGF0IGNvdWxkIGNhdXNlIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgZm9yIG9sZGVyIG1vZHVsZXMKLSAqIHN1Y2ggYXMgc3RydWN0dXJlIHNpemUgY2hhbmdlcy4gIE5vIGJpbmFyeSBjb21wYXRpYmlsaXR5IGlzIHBvc3NpYmxlIGFjcm9zcwotICogYSBjaGFuZ2UgaW4gdGhlIG1ham9yIHZlcnNpb24uCi0gKgotICogTU9EVUxFX01BR0lDX05VTUJFUl9NSU5PUgotICogTWlub3IgQVBJIGNoYW5nZXMgdGhhdCBkbyBub3QgY2F1c2UgYmluYXJ5IGNvbXBhdGliaWxpdHkgcHJvYmxlbXMuCi0gKiBTaG91bGQgYmUgcmVzZXQgdG8gMCB3aGVuIHVwZ3JhZGluZyBNT0RVTEVfTUFHSUNfTlVNQkVSX01BSk9SLgotICoKLSAqIFNlZSB0aGUgTU9EVUxFX01BR0lDX0FUX0xFQVNUIG1hY3JvIGJlbG93IGZvciBhbiBleGFtcGxlLgotICovCi0KLS8qCi0gKiAxOTk1MDUyNQkJLSBvcmlnaW5hbCB2YWx1ZQotICogMTk5NjA1MTIgKDEuMWIyKQktIHVwZGF0ZWQsIDEuMSwgdmVyc2lvbi4KLSAqIDE5OTYwNTI2ICgxLjFiMykJLSBnZXRfdG9rZW4oKSwgdGFibGVfdW5zZXQoKSwgcHN0cm5kdXAoKQotICoJCQkgIGZ1bmN0aW9ucyBhZGRlZAotICogMTk5NjA3MjUgKDEuMi1kZXYpCS0gSFRUUC8xLjEgY29tcGxpYW5jZQotICoJCQkgIChuZXcgdmVyc2lvbiBvZiByZWFkX2NsaWVudF9ibG9jaykKLSAqIDE5OTYwODA2ICgxLjItZGV2KQktIHNjYW5fc2NyaXB0X2hlYWRlcl9lcnIoKSBhZGRlZAotICogMTk5NjEwMDcgKDEuMi1kZXYpCS0gcmVwbGFjZSByZWFkX2NsaWVudF9ibG9jaygpIHdpdGggZ2V0X2NsaWVudF9ibG9jaygpCi0gKiAxOTk2MTEyNSAoMS4yYjEpCS0gY2hhbmdlIHNldHVwX2NsaWVudF9ibG9jaygpIHRvIFJveSdzIHZlcnNpb24KLSAqIDE5OTYxMjExICgxLjJiMykJLSByd3JpdGUoKSBhZGRlZAotICogMTk5NzAxMDMgKDEuMmI1LWRldikJLSBoZWFkZXIgcGFyc2UgQVBJCi0gKiAxOTk3MDQyNyAoMS4yYjktZGV2KQktIHBvcnQgcmVmZXJlbmNlcyBtYWRlIHVuc2lnbmVkCi0gKiAxOTk3MDUyNiAoMS4yKQktIGNvcnJlY3Qgdmhvc3Qgd2FsayBmb3IgbXVsdGlwbGUgcmVxdWVzdHMgb24gYSBzaW5nbGUKLSAqCQkJICBjb25uZWN0Ci0gKiAxOTk3MDYyMyAoMS4zLWRldikJLSBOVCBjaGFuZ2VzCi0gKiAxOTk3MDYyOCAoMS4zLWRldikJLSBhcF9zbGFjayAoZmQgZml4ZXMpIGFkZGVkCi0gKiAxOTk3MDcxNyAoMS4zLWRldikJLSBjaGlsZF9pbml0IEFQSSBob29rIGFkZGVkCi0gKiAxOTk3MDcxOSAoMS4zLWRldikJLSBkaXNjYXJkX3JlcXVlc3RfYm9keSgpIGFkZGVkICh0byBjbGVhciB0aGUgZGVja3MKLSAqCQkJICBhcyBuZWVkZWQpCi0gKiAxOTk3MDcyOCAoMS4zYTItZGV2KQktIGNoaWxkX2V4aXQgQVBJIGhvb2sgYWRkZWQKLSAqIDE5OTcwODE4ICgxLjNhMi1kZXYpCS0gcG9zdCByZWFkLXJlcXVlc3QgcGhhc2UgYWRkZWQKLSAqIDE5OTcwODI1ICgxLjNhMi1kZXYpCS0gci0+bXRpbWUgY2VsbCBhZGRlZAotICogMTk5NzA4MzEgKDEuM2EyLWRldikJLSBlcnJvciBsb2dnaW5nIGNoYW5nZWQgdG8gdXNlIGFwbG9nX2Vycm9yKCkKLSAqIDE5OTcwOTAyICgxLjNhMi1kZXYpCS0gTUQ1IHJvdXRpbmVzIGFuZCBzdHJ1Y3R1cmVzIHJlbmFtZWQgdG8gYXBfKgotICogMTk5NzA5MTIgKDEuM2IxLWRldikJLSBzZXRfbGFzdF9tb2RpZmllZCBzcGxpdCBpbnRvIHNldF9sYXN0X21vZGlmaWVkLAotICogCQkJICBzZXRfZXRhZyBhbmQgbWVldHNfY29uZGl0aW9ucwotICoJCQkgIHJlZ2lzdGVyX290aGVyX2NoaWxkIEFQSQotICoJCQkgIHBpcGVkX2xvZyBBUEkKLSAqCQkJICBzaG9ydF9zY29yZSBzcGxpdCBpbnRvIHBhcmVudCBhbmQgY2hpbGQgcGllY2VzCi0gKgkJCSAgb3NfaXNfYWJzb2x1dGVfcGF0aAotICogMTk5NzEwMjYgKDEuM2IzLWRldikJLSBjdXN0b20gY29uZmlnIGhvb2tzIGluIHBsYWNlCi0gKiAxOTk4MDEyNiAoMS4zYjQtZGV2KQktIGFwX2NweXN0cm4oKSwgdGFibGVfYWRkbigpLCB0YWJsZV9zZXRuKCksCi0gKgkJCSAgdGFibGVfbWVyZ2VuKCkKLSAqIDE5OTgwMjAxICgxLjNiNC1kZXYpCS0gY29uc3RydWN0X3VybCgpCi0gKgkJCSAgcHJvdG90eXBlIHNlcnZlcl9yZWMgKiAtPiByZXF1ZXN0X3JlYyAqCi0gKgkJCSAgYWRkIGdldF9zZXJ2ZXJfbmFtZSgpIGFuZCBnZXRfc2VydmVyX3BvcnQoKQotICogMTk5ODAyMDcgKDEuM2I0LWRldikJLSBhZGQgZHluYW1pY19sb2FkX2hhbmRsZSB0byBtb2R1bGUgc3RydWN0dXJlIGFzIHBhcnQKLSAqCQkJICBvZiB0aGUgU1RBTkRBUkRfTU9EVUxFX1NUVUZGIGhlYWRlcgotICogMTk5ODAzMDQgKDEuM2I2LWRldikJLSBhYnN0cmFjdGlvbiBvZiBTRVJWRVJfQlVJTFQgYW5kIFNFUlZFUl9WRVJTSU9OCi0gKiAxOTk4MDMwNSAoMS4zYjYtZGV2KQktIGFwX2NvbmZpZy5oIGFkZGVkIGZvciB1c2UgYnkgZXh0ZXJuYWwgbW9kdWxlcwotICogMTk5ODAzMTIgKDEuM2I2LWRldikJLSBwYXJzZV91cmlfY29tcG9uZW50cygpIGFuZCBpdHMgaWxrCi0gKgkJCSAgcmVtb3ZlIHItPmhvc3RsZW4sIGFkZCByLT51bnBhcnNlZF91cmkKLSAqCQkJICBzZXRfc3RyaW5nX3Nsb3RfbG93ZXIoKQotICoJCQkgIGNsYXJpZmljYXRpb246IG5vbi1SQVdfQVJHUyBjbWQgaGFuZGxlcnMgZG8gbm90Ci0gKgkJCSAgbmVlZCB0byBwc3RyZHVwKCkgdGhlaXIgYXJndW1lbnRzCi0gKgkJCSAgY2xhcmlmaWNhdGlvbjogcmVxdWVzdF9yZWMgbWVtYmVycyBjb250ZW50X3R5cGUsCi0gKgkJCSAgaGFuZGxlciwgY29udGVudF9lbmNvZGluZywgY29udGVudF9sYW5ndWFnZSwKLSAqCQkJICBjb250ZW50X2xhbmd1YWdlcyBNVVNUIGFsbCBiZSBsb3dlcmNhc2Ugc3RyaW5ncywKLSAqCQkJICBhbmQgTUFZIE5PVCBiZSBtb2RpZmllZCBpbiBwbGFjZSAtLSBtb2RpZmljYXRpb25zCi0gKgkJCSAgcmVxdWlyZSBwc3RyZHVwKCkuCi0gKiAxOTk4MDMxNyAoMS4zYjYtZGV2KQktIENPUkVfRVhQT1JUcyBmb3Igd2luMzIgYW5kIDxQZXJsPgotICoJCQkgIEFQSSBleHBvcnQgYmFzaWNfaHR0cF9oZWFkZXIsIHNlbmRfaGVhZGVyX2ZpZWxkLAotICoJCQkgIHNldF9rZWVwYWxpdmUsIHNybV9jb21tYW5kX2xvb3AsIGNoZWNrX2NtZF9jb250ZXh0LAotICoJCQkgIHRtMnNlYwotICoJCQkgIHNwYWNldG9wbHVzKCksIHBsdXN0b3NwYWNlKCksIGNsaWVudF90b19zdGRvdXQoKQotICoJCQkgIHJlbW92ZWQKLSAqIDE5OTgwMzI0ICgxLjNiNi1kZXYpCS0gQVBJX0VYUE9SVChpbmRleF9vZl9yZXNwb25zZSkKLSAqIDE5OTgwNDEzICgxLjNiNi1kZXYpCS0gVGhlIEJJRyBTWU1CT0wgUkVOQU1JTkc6IGdlbmVyYWwgYXBfIHByZWZpeAotICoJCQkgIChzZWUgc3JjL2luY2x1ZGUvY29tcGF0LmggZm9yIG1vcmUgZGV0YWlscykKLSAqCQkJICBhcF92Zm9ybWF0dGVyKCkgQVBJLCBzZWUgc3JjL2luY2x1ZGUvYXAuaAotICogMTk5ODA1MDcgKDEuM2I3LWRldikJLSBhZGRpdGlvbiBvZiBhcF9hZGRfdmVyc2lvbl9jb21wb25lbnQoKSBhbmQKLSAqCQkJICBkaXNjb250aW51YXRpb24gb2YgLURTRVJWRVJfU1VCVkVSU0lPTiBzdXBwb3J0Ci0gKiAxOTk4MDUxOSAoMS4zYjctZGV2KQktIGFkZCBjaGlsZF9pbmZvICogdG8gc3Bhd24gZnVuY3Rpb24gKGFzIHBhc3NlZCB0bwotICoJCQkgIGFwX3NwYXduX2NoaWxkX2Vycl9idWZmKSBhbmQgdG8gYXBfY2FsbF9leGVjIHRvIG1ha2UKLSAqCQkJICBjaGlsZHJlbiB3b3JrIGNvcnJlY3RseSBvbiBXaW4zMi4KLSAqIDE5OTgwNTI3ICgxLjNiOC1kZXYpCS0gcmVuYW1lZCBzb21lIG1vcmUgZnVuY3Rpb25zIHRvIGFwXyBwcmVmaXggd2hpY2ggd2VyZQotICoJCQkgIG1pc3NlZCBhdCB0aGUgYmlnIHJlbmFtaW5nICh0aGV5IGFyZSBkZWZpbmVzKToKLSAqCQkJICBpc19kZWZhdWx0X3BvcnQsIGRlZmF1bHRfcG9ydCBhbmQgaHR0cF9tZXRob2QuCi0gKgkJCSAgQSBuZXcgY29tbXVuaWNhdGlvbiBtZXRob2QgZm9yIG1vZHVsZXMgd2FzIGFkZGVkOgotICoJCQkgIHRoZXkgY2FuIGNyZWF0ZSBjdXN0b21pemVkIGVycm9yIG1lc3NhZ2VzIHVuZGVyIHRoZQotICoJCQkgICJlcnJvci1ub3RlcyIga2V5IGluIHRoZSByZXF1ZXN0X3JlYy0+bm90ZXMgdGFibGUuCi0gKgkJCSAgVGhpcyBzdHJpbmcgd2lsbCBiZSBwcmludGVkIGluIHBsYWNlIG9mIHRoZSBjYW5uZWQKLSAqCQkJICBlcnJvciByZXNwb25zZXMsIGFuZCB3aWxsIGJlIHByb3BhZ2F0ZWQgdG8KLSAqCQkJICBFcnJvckRvY3VtZW50cyBvciBjZ2kgc2NyaXB0cyBpbiB0aGUKLSAqCQkJICAoUkVESVJFQ1RfKUVSUk9SX05PVEVTIHZhcmlhYmxlLgotICogMTk5ODA2MjcgKDEuMy4xLWRldikJLSBNb3JlIHJlbmFtaW5nIHRoYXQgd2UgZm9yZ290L2J5cGFzc2VkLiBJbiBwYXJ0aWN1bGFyOgotICoJCQkgIHRhYmxlX2VsdHMgLS0+IGFwX3RhYmxlX2VsdHMKLSAqCQkJICBpc190YWJsZV9lbXB0eSAtLT4gYXBfaXNfdGFibGVfZW1wdHkKLSAqIDE5OTgwNzA4ICgxLjMuMS1kZXYpCS0gYXBfaXNhbG51bSgpLCBhcF9pc2FscGhhKCksIC4uLiAiOC1iaXQgc2FmZSIgY3R5cGUKLSAqCQkJICBtYWNyb3MgYW5kIGFwY3R5cGUuaCBhZGRlZAotICogMTk5ODA3MTMgKDEuMy4xLWRldikJLSByZW5hbWluZyBvZiBDIGhlYWRlciBmaWxlczoKLSAqCQkJICAxLiBjb25mLmggICAgICAtPiBhcF9jb25maWcuaAotICoJCQkgIDIuIGNvbmZfYXV0by5oIC0+IGFwX2NvbmZpZ19hdXRvLmggLSBub3cgbWVyZ2VkCi0gKgkJCSAgMy4gYXBfY29uZmlnLmggLT4gYXBfY29uZmlnX2F1dG8uaCAtIG5vdyBtZXJnZWQKLSAqCQkJICA0LiBjb21wYXQuaCAgICAtPiBhcF9jb21wYXQuaAotICoJCQkgIDUuIGFwY3R5cGUuaCAgIC0+IGFwX2N0eXBlLmgKLSAqIDE5OTgwODA2ICgxLjMuMi1kZXYpIC0gYWRkIGFwX2xvZ19yZXJyb3IoKQotICogICAgICAgICAgICAgICAgICAgICAgLSBhZGQgYXBfc2Nhbl9zY3JpcHRfaGVhZGVyX2Vycl9jb3JlKCkKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gYWRkIGFwX3V1ZW5jb2RlKCkKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gYWRkIGFwX2N1c3RvbV9yZXNwb25zZSgpCi0gKiAxOTk4MDgxMSAoMS4zLjItZGV2KQktIGFkZGVkIGxpbWl0X3JlcV9saW5lLCBsaW1pdF9yZXFfZmllbGRzaXplLCBhbmQKLSAqCQkJICBsaW1pdF9yZXFfZmllbGRzIHRvIHNlcnZlcl9yZWMuCi0gKgkJCSAgYWRkZWQgbGltaXRfcmVxX2JvZHkgdG8gY29yZV9kaXJfY29uZmlnIGFuZAotICoJCQkgIGFwX2dldF9saW1pdF9yZXFfYm9keSgpIHRvIGdldCBpdHMgdmFsdWUuCi0gKiAxOTk4MDgxMiAoMS4zLjItZGV2KQktIHNwbGl0IG9mZiBNT0RVTEVfTUFHSUNfTlVNQkVSCi0gKiAxOTk4MDgxMi4yICAgICAgICAgICAtIGFkZCBhcF9vdmVybGFwX3RhYmxlcygpCi0gKiAxOTk4MDgxNiAoMS4zLjItZGV2KQktIGNoYW5nZSBwcm94eSB0byB1c2UgdGFibGVzIGZvciBoZWFkZXJzLCBjaGFuZ2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNhY2hlX3JlcSB0byB0eXBlZGVmIGNhY2hlX3JlcS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlIGFwX3Byb3h5X2dldF9oZWFkZXIoKSwgYXBfcHJveHlfYWRkX2hlYWRlcigpLAotICogICAgICAgICAgICAgICAgICAgICAgICBhcF9wcm94eV9kZWxfaGVhZGVyKCkuIENoYW5nZSBpbnRlcmZhY2Ugb2YgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFwX3Byb3h5X3NlbmRfZmIoKSBhbmQgYXBfcHJveHlfY2FjaGVfZXJyb3IoKS4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBhcF9wcm94eV9zZW5kX2hkcl9saW5lKCkgYW5kIGFwX3Byb3h5X2JwdXRzMigpLgotICogMTk5ODA4MjUgKDEuMy4yLWRldikgLSByZW5hbWVkIGlzX0hUVFBfeHh4KCkgbWFjcm9zIHRvIGFwX2lzX0hUVFBfeHh4KCkKLSAqIDE5OTgwODI1LjEgICAgICAgICAgIC0gbW9kX3Byb3h5IG9ubHkgKG1pbm9yIGNoYW5nZSk6IG1vZGlmaWVkIGludGVyZmFjZSBvZgotICogICAgICAgICAgICAgICAgICAgICAgICBhcF9wcm94eV9yZWFkX2hlYWRlcnMoKSBhbmQgcmRjYWNoZSgpIHRvIHVzZSBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfcmVjKiBpbnN0ZWFkIG9mIHBvb2wqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIChmb3IgaW1wbGVtZW50aW5nIGJldHRlciBlcnJvciByZXBvcnRpbmcpLgotICogMTk5ODA5MDYgKDEuMy4yLWRldikgLSBhZGRlZCBhcF9tZDVfYmluYXJ5KCkKLSAqIDE5OTgwOTE3ICgxLjMuMi1kZXYpIC0gYnMyMDAwOiBjaGFuZ2VkIG9zX3NldF9hdXRoZmlsZSgpIHRvIG9zX3NldF9hY2NvdW50KCkKLSAqIDE5OTgxMTA4ICgxLjMuNC1kZXYpIC0gYWRkZWQgYXBfbWV0aG9kX251bWJlcl9vZigpCi0gKiAgICAgICAgICAgICAgICAgICAgICAtIGNoYW5nZWQgdmFsdWUgb2YgTV9JTlZBTElEIGFuZCBhZGRlZCBXZWJEQVYgbWV0aG9kcwotICogMTk5ODExMDguMSAgICAgICAgICAgLSBhcF9leGlzdHNfY29uZmlnX2RlZmluZSgpIGlzIG5vdyBwdWJsaWMgKG1pbm9yIGJ1bXApCi0gKiAxOTk4MTIwNCAgICAgICAgICAgICAtIHNjb3JlYm9hcmQgY2hhbmdlcyAtLSBhZGRlZCBnZW5lcmF0aW9uLCBjaGFuZ2VkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRfZ2VuZXJhdGlvbiB0byBydW5uaW5nX2dlbmVyYXRpb24uICBTb21ld2hlcmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgZWFybGllciB2aG9zdHJlYyB3YXMgYWRkZWQsIGJ1dCBpdCdzIG9ubHkgc2FmZSB0byB1c2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXMgb2YgdGhpcyByZXYuICBTZWUgc2NvcmVib2FyZC5oIGZvciBkb2N1bWVudGF0aW9uLgotICogMTk5ODEyMTEgICAgICAgICAgICAgLSBEU08gY2hhbmdlcyAtLSBhZGRlZCBhcF9zaW5nbGVfbW9kdWxlX2NvbmZpZ3VyZSgpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGFkZGVkIGFwX3NpbmdsZV9tb2R1bGVfaW5pdCgpCi0gKiAxOTk4MTIyOSAgICAgICAgICAgICAtIG1vZF9uZWdvdGlhdGlvbiBvdmVyaGF1bCAtLSBhZGRlZCBhcF9tYWtlX2V0YWcoKQotICogICAgICAgICAgICAgICAgICAgICAgICBhbmQgYWRkZWQgdmxpc3RfdmFsaWRhdG9yIHRvIHJlcXVlc3RfcmVjLgotICogMTk5OTAxMDEgICAgICAgICAgICAgLSByZW5hbWVkIG1hY3JvIGVzY2FwZV91cmkoKSB0byBhcF9lc2NhcGVfdXJpKCkKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gYWRkZWQgTU9EVUxFX01BR0lDX0NPT0tJRSB0byBpZGVudGlmeSBtb2R1bGUgc3RydWN0cwotICogMTk5OTAxMDMgKDEuMy40LWRldikgLSBhZGRlZCBhcF9hcnJheV9wc3RyY2F0KCkKLSAqIDE5OTkwMTA1ICgxLjMuNC1kZXYpIC0gYWRkZWQgYXBfb3NfaXNfZmlsZW5hbWVfdmFsaWQoKQotICogMTk5OTAxMDYgKDEuMy40LWRldikgLSBNb3ZlIE1PRFVMRV9NQUdJQ19DT09LSUUgdG8gdGhlIGVuZCBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgU1RBTkRBUkRfTU9EVUxFX1NUVUZGIG1hY3JvIHNvIHRoZSB2ZXJzaW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcnMgYW5kIGZpbGUgbmFtZSByZW1haW4gYXQgaW52YXJpYW50IG9mZnNldHMKLSAqIDE5OTkwMTA4ICgxLjMuNC1kZXYpIC0gc3RhdHVzX2Ryb3BzX2Nvbm5lY3Rpb24gLT4gYXBfc3RhdHVzX2Ryb3BzX2Nvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbl9zY3JpcHRfaGVhZGVyIC0+IGFwX3NjYW5fc2NyaXB0X2hlYWRlcl9lcnIKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gcmVvcmRlcmVkIGVudHJpZXMgaW4gcmVxdWVzdF9yZWMgdGhhdCB3ZXJlIHdhaXRpbmcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGEgbm9uLWJpbmFyeS1jb21wYXRpYmxlIHJlbGVhc2UuCi0gKiAgICAgICAgICAoMS4zLjUtZGV2KQotICogMTk5OTAxMDguMSAgICAgICAgICAgLSBhZGQgYXBfTUQ1RW5jb2RlKCkgZm9yIE1ENSBwYXNzd29yZCBoYW5kbGluZy4KLSAqIDE5OTkwMTA4LjIgICAgICAgICAgIC0gYWRkIGFwX3ZhbGlkYXRlX3Bhc3N3b3JkKCkgYW5kIGNoYW5nZSBhcF9NRDVFbmNvZGUoKQotICogICAgICAgICAgICAgICAgICAgICAgICB0byB1c2UgYSBzdHJvbmdlciBhbGdvcml0aG0uCi0gKiAxOTk5MDEwOC40ICAgICAgICAgICAtIGFkZCBhcF9zaXplX2xpc3RfaXRlbSgpLCBhcF9nZXRfbGlzdF9pdGVtKCksIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICBhcF9maW5kX2xpc3RfaXRlbSgpCi0gKiAxOTk5MDEwOC41ICAgICAgICAgICAtIGFkZGVkIGFwX3N1Yl9yZXFfbWV0aG9kX3VyaSgpIGFuZCBhZGRlZCBjb25zdCB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiBvZiBtZXRob2QgaW4gcmVxdWVzdF9yZWMuCi0gKiAxOTk5MDEwOC42ICAgICAgICAgICAtIFNJR1BJUEUgaXMgbm93IGlnbm9yZWQgYnkgdGhlIGNvcmUgc2VydmVyLgotICogMTk5OTAxMDguNyAgICAgICAgICAgLSBhcF9pc3hkaWdpdCBhZGRlZAotICogMTk5OTAzMjAgICAgICAgICAgICAgLSBNRVRIT0RTIGFuZCBNX0lOVkFMSUQgc3ltYm9sIHZhbHVlcyBtb2RpZmllZAotICogMTk5OTAzMjAuMSAgICAgICAgICAgLSBhZGQgYXBfdnJwcmludGYoKQotICogMTk5OTAzMjAuMiAgICAgICAgICAgLSBhZGQgY21kX3Bhcm1zLmNvbnRleHQsIGFwX3NldF9jb25maWdfdmVjdG9ycywgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydCBhcF9hZGRfZmlsZV9jb25mCi0gKiAxOTk5MDMyMC4zICAgICAgICAgICAtIGFkZCBhcF9yZWdleGVjKCkgYW5kIGFwX3JlZ2Vycm9yKCkKLSAqIDE5OTkwMzIwLjQgICAgICAgICAgIC0gYWRkIGFwX2ZpZWxkX25vcGFyYW0oKQotICogMTk5OTAzMjAuNSAgICAgICAgICAgLSBhZGQgbG9jYWxfaXAvaG9zdCB0byBjb25uX3JlYyBmb3IgbWFzcy12aG9zdAotICogMTk5OTAzMjAuNiAgICAgICAgICAgLSBhZGQgYXBfU0hBMUZpbmFsKCksIGFwX1NIQTFJbml0KCksCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFwX1NIQTFVcGRhdGVfYmluYXJ5KCksIGFwX1NIQTFVcGRhdGUoKSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXBfYmFzZTY0ZW5jb2RlKCksIGFwX2Jhc2U2NGVuY29kZV9iaW5hcnkoKSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXBfYmFzZTY0ZW5jb2RlX2xlbigpLCBhcF9iYXNlNjRkZWNvZGUoKSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXBfYmFzZTY0ZGVjb2RlX2JpbmFyeSgpLCBhcF9iYXNlNjRkZWNvZGVfbGVuKCksCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFwX3BiYXNlNjRkZWNvZGUoKSwgYXBfcGJhc2U2NGVuY29kZSgpCi0gKi8KLQotI2RlZmluZSBNT0RVTEVfTUFHSUNfQ09PS0lFIDB4NDE1MDMxMzNVTCAvKiAiQVAxMyIgKi8KLQotI2lmbmRlZiBNT0RVTEVfTUFHSUNfTlVNQkVSX01BSk9SCi0jZGVmaW5lIE1PRFVMRV9NQUdJQ19OVU1CRVJfTUFKT1IgMTk5OTAzMjAKLSNlbmRpZgotI2RlZmluZSBNT0RVTEVfTUFHSUNfTlVNQkVSX01JTk9SIDYgICAgICAgICAgICAgICAgICAgICAvKiAwLi4ubiAqLwotI2RlZmluZSBNT0RVTEVfTUFHSUNfTlVNQkVSIE1PRFVMRV9NQUdJQ19OVU1CRVJfTUFKT1IJLyogYmFja3dhcmQgY29tcGF0ICovCi0KLS8qIFVzZWZ1bCBmb3IgdGVzdGluZyBmb3IgZmVhdHVyZXMuICovCi0jZGVmaW5lIE1PRFVMRV9NQUdJQ19BVF9MRUFTVChtYWpvcixtaW5vcikJCVwKLSAgICAoKG1ham9yKSA+IE1PRFVMRV9NQUdJQ19OVU1CRVJfTUFKT1IgCQlcCi0JfHwgKChtYWpvcikgPT0gTU9EVUxFX01BR0lDX05VTUJFUl9NQUpPUiAJXAotCSAgICAmJiAobWlub3IpID49IE1PRFVMRV9NQUdJQ19OVU1CRVJfTUlOT1IpKQotCi0vKiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3Ugd2lzaCB0byB1c2UgdGhlIGFwX292ZXJsYXBfdGFibGVzCi0gICBmdW5jdGlvbi4gIFlvdSBjYW4gZG8gdGhpczoKLQotI2lmIE1PRFVMRV9NQUdJQ19BVF9MRUFTVCgxOTk4MDgxMiwyKQotICAgIC4uLiB1c2UgYXBfb3ZlcmxhcF90YWJsZXMoKQotI2Vsc2UKLSAgICAuLi4gYWx0ZXJuYXRpdmUgY29kZSB3aGljaCBkb2Vzbid0IHVzZSBhcF9vdmVybGFwX3RhYmxlcygpCi0jZW5kaWYKLQotKi8KLQotI2VuZGlmIC8qICFBUEFDSEVfQVBfTU1OX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXBfbXBtLmggYi9pbmNsdWRlL2FwX21wbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDI1YmJjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXBfbXBtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaWZuZGVmIEFQX01NTl9ICi0jZGVmaW5lIEFQX01NTl9ICi0KLS8qIHJ1biB1bnRpbCBhIHJlc3RhcnQvc2h1dGRvd24gaXMgaW5kaWNhdGVkLCByZXR1cm4gMSBmb3Igc2h1dGRvd24KLSAgIDAgb3RoZXJ3aXNlICovCi1BUElfRVhQT1JUKGludCkgYXBfbXBtX3J1bihwb29sICpwY29uZiwgcG9vbCAqcGxvZywgc2VydmVyX3JlYyAqc2VydmVyX2NvbmYpOwotCi0vKiBwcmVkaWNhdGUgaW5kaWNhdGluZyBpZiBhIGdyYWNlZnVsIHN0b3AgaGFzIGJlZW4gcmVxdWVzdGVkIC4uLgotICAgdXNlZCBieSB0aGUgY29ubmVjdGlvbiBsb29wICovCi1BUElfRVhQT1JUKGludCkgYXBfbXBtX2dyYWNlZnVsX3N0b3Aodm9pZCk7Ci0KLSNpZmRlZiBIQVNfT1RIRVJfQ0hJTEQKLS8qCi0gKiByZWdpc3RlciBhbiBvdGhlcl9jaGlsZCAtLSBhIGNoaWxkIHdoaWNoIHRoZSBtYWluIGxvb3Aga2VlcHMgdHJhY2sgb2YKLSAqIGFuZCBrbm93cyBpdCBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgcmVzdCBvZiB0aGUgc2NvcmVib2FyZC4KLSAqCi0gKiBwaWQgaXMgdGhlIHBpZCBvZiB0aGUgY2hpbGQuCi0gKgotICogbWFpbnRlbmFuY2UgaXMgYSBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgd2l0aCBhIHJlYXNvbiwgdGhlIGRhdGEKLSAqIHBvaW50ZXIgcGFzc2VkIGhlcmUsIGFuZCB3aGVuIGFwcHJvcHJpYXRlIGEgc3RhdHVzIHJlc3VsdCBmcm9tIHdhaXRwaWQoKS4KLSAqCi0gKiB3cml0ZV9mZCBpcyBhbiBmZCB0aGF0IGlzIHByb2JlZCBmb3Igd3JpdGluZyBieSBzZWxlY3QoKSBpZiBpdCBpcyBldmVyCi0gKiB1bndyaXRhYmxlLCB0aGVuIG1haW50ZW5hbmNlIGlzIGludm9rZWQgd2l0aCByZWFzb24gT0NfUkVBU09OX1VOV1JJVEFCTEUuCi0gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbG9nIHBpcGUgY2hpbGRyZW4sIHRvIGtub3cgd2hlbiB0aGV5J3ZlIGJsb2NrZWQuICBUbwotICogZGlzYWJsZSB0aGlzIGZlYXR1cmUsIHVzZSAtMSBmb3Igd3JpdGVfZmQuCi0gKi8KLUFQSV9FWFBPUlQodm9pZCkgYXBfcmVnaXN0ZXJfb3RoZXJfY2hpbGQoaW50IHBpZCwKLSAgICAgICB2b2lkICgqbWFpbnRlbmFuY2UpIChpbnQgcmVhc29uLCB2b2lkICpkYXRhLCBhcF93YWl0X3Qgc3RhdHVzKSwgdm9pZCAqZGF0YSwKLQkJCQkgICAgICBpbnQgd3JpdGVfZmQpOwotI2RlZmluZSBPQ19SRUFTT05fREVBVEgJCTAJLyogY2hpbGQgaGFzIGRpZWQsIGNhbGxlciBtdXN0IGNhbGwKLQkJCQkJICogdW5yZWdpc3RlciBzdGlsbCAqLwotI2RlZmluZSBPQ19SRUFTT05fVU5XUklUQUJMRQkxCS8qIHdyaXRlX2ZkIGlzIHVud3JpdGFibGUgKi8KLSNkZWZpbmUgT0NfUkVBU09OX1JFU1RBUlQJMgkvKiBhIHJlc3RhcnQgaXMgb2NjdXJpbmcsIHBlcmZvcm0KLQkJCQkJICogYW55IG5lY2Vzc2FyeSBjbGVhbnVwIChpbmNsdWRpbmcKLQkJCQkJICogc2VuZGluZyBhIHNwZWNpYWwgc2lnbmFsIHRvIGNoaWxkKQotCQkJCQkgKi8KLSNkZWZpbmUgT0NfUkVBU09OX1VOUkVHSVNURVIJMwkvKiB1bnJlZ2lzdGVyIGhhcyBiZWVuIGNhbGxlZCwgZG8KLQkJCQkJICogd2hhdGV2ZXIgaXMgbmVjZXNzYXJ5IChpbmNsdWRpbmcKLQkJCQkJICoga2lsbCB0aGUgY2hpbGQpICovCi0jZGVmaW5lIE9DX1JFQVNPTl9MT1NUCQk0CS8qIHNvbWVob3cgdGhlIGNoaWxkIGV4aXRlZCB3aXRob3V0Ci0JCQkJCSAqIHVzIGtub3dpbmcgLi4uIGJ1Z2d5IG9zPyAqLwotCi0vKgotICogdW5yZWdpc3RlciBhbiBvdGhlcl9jaGlsZC4gIE5vdGUgdGhhdCB0aGUgZGF0YSBwb2ludGVyIGlzIHVzZWQgaGVyZSwgYW5kCi0gKiBpcyBhc3N1bWVkIHRvIGJlIHVuaXF1ZSBwZXIgb3RoZXJfY2hpbGQuICBUaGlzIGlzIGJlY2F1c2UgdGhlIHBpZCBhbmQKLSAqIHdyaXRlX2ZkIGFyZSBwb3NzaWJseSBraWxsZWQgb2ZmIHNlcGFyYXRlbHkuCi0gKi8KLUFQSV9FWFBPUlQodm9pZCkgYXBfdW5yZWdpc3Rlcl9vdGhlcl9jaGlsZCh2b2lkICpkYXRhKTsKLQotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hcF9yZWxlYXNlLmggYi9pbmNsdWRlL2FwX3JlbGVhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmMDQxNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FwX3JlbGVhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotI2lmbmRlZiBBUF9SRUxFQVNFX0gKLSNkZWZpbmUgQVBfUkVMRUFTRV9ICi0KLSNkZWZpbmUgQVBfU0VSVkVSX0JBU0VWRU5ET1IgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIgotI2RlZmluZSBBUF9TRVJWRVJfQkFTRVBST0RVQ1QgIkFwYWNoZSIKLSNkZWZpbmUgQVBfU0VSVkVSX0JBU0VSRVZJU0lPTiAiMi4wYjEtZGV2IgotI2RlZmluZSBBUF9TRVJWRVJfQkFTRVZFUlNJT04gQVBfU0VSVkVSX0JBU0VQUk9EVUNUICIvIiBBUF9TRVJWRVJfQkFTRVJFVklTSU9OCi0jZGVmaW5lIEFQX1NFUlZFUl9WRVJTSU9OICBBUF9TRVJWRVJfQkFTRVZFUlNJT04KLQotLyogTnVtZXJpYyByZWxlYXNlIHZlcnNpb24gaWRlbnRpZmllcjogTU1OTkZGUkJCOiBtYWpvciBtaW5vciBmaXggZmluYWwgYmV0YQotICogQWx3YXlzIGluY3JlYXNlcyBhbG9uZyB0aGUgc2FtZSB0cmFjayBhcyB0aGUgc291cmNlIGJyYW5jaC4KLSAqIEZvciBleGFtcGxlLCBBcGFjaGUgMS40LjIgd291bGQgYmUgJzEwNDAyMTAwJywgMi41Yjcgd291bGQgYmUgJzIwNTAwMDA3Jy4KLSAqLwotI2RlZmluZSBBUEFDSEVfUkVMRUFTRSAyMDAwMDAwOQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaHR0cF9jb25maWcuaCBiL2luY2x1ZGUvaHR0cF9jb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBjMjkzMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2h0dHBfY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MTQgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaWZuZGVmIEFQQUNIRV9IVFRQX0NPTkZJR19ICi0jZGVmaW5lIEFQQUNIRV9IVFRQX0NPTkZJR19ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoKLSAqIFRoZSBjZW50cmFsIGRhdGEgc3RydWN0dXJlcyBhcm91bmQgaGVyZS4uLgotICovCi0KLS8qIENvbW1hbmQgZGlzcGF0Y2ggc3RydWN0dXJlcy4uLiAqLwotCi0vKiBOb3RlIHRoYXQgZm9yIGFsbCBvZiB0aGVzZSBleGNlcHQgUkFXX0FSR1MsIHRoZSBjb25maWcgcm91dGluZSBpcwotICogcGFzc2VkIGEgZnJlc2hseSBhbGxvY2F0ZWQgc3RyaW5nIHdoaWNoIGNhbiBiZSBtb2RpZmllZCBvciBzdG9yZWQKLSAqIG9yIHdoYXRldmVyLi4uIGl0J3Mgb25seSBuZWNlc3NhcnkgdG8gZG8gcHN0cmR1cCgpIHN0dWZmIHdpdGgKLSAqIFJBV19BUkdTLgotICovCi1lbnVtIGNtZF9ob3cgewotICAgIFJBV19BUkdTLAkJCS8qIGNtZF9mdW5jIHBhcnNlcyBjb21tYW5kIGxpbmUgaXRzZWxmICovCi0gICAgVEFLRTEsCQkJLyogb25lIGFyZ3VtZW50IG9ubHkgKi8KLSAgICBUQUtFMiwJCQkvKiB0d28gYXJndW1lbnRzIG9ubHkgKi8KLSAgICBJVEVSQVRFLAkJCS8qIG9uZSBhcmd1bWVudCwgb2NjdXJpbmcgbXVsdGlwbGUgdGltZXMKLQkJCQkgKiAoZS5nLiwgSW5kZXhJZ25vcmUpCi0JCQkJICovCi0gICAgSVRFUkFURTIsCQkJLyogdHdvIGFyZ3VtZW50cywgMm5kIG9jY3VycyBtdWx0aXBsZSB0aW1lcwotCQkJCSAqIChlLmcuLCBBZGRJY29uKQotCQkJCSAqLwotICAgIEZMQUcsCQkJLyogT25lIG9mICdPbicgb3IgJ09mZicgKi8KLSAgICBOT19BUkdTLAkJCS8qIE5vIGFyZ3MgYXQgYWxsLCBlLmcuIDwvRGlyZWN0b3J5PiAqLwotICAgIFRBS0UxMiwJCQkvKiBvbmUgb3IgdHdvIGFyZ3VtZW50cyAqLwotICAgIFRBS0UzLAkJCS8qIHRocmVlIGFyZ3VtZW50cyBvbmx5ICovCi0gICAgVEFLRTIzLAkJCS8qIHR3byBvciB0aHJlZSBhcmd1bWVudHMgKi8KLSAgICBUQUtFMTIzLAkJCS8qIG9uZSwgdHdvIG9yIHRocmVlIGFyZ3VtZW50cyAqLwotICAgIFRBS0UxMwkJCS8qIG9uZSBvciB0aHJlZSBhcmd1bWVudHMgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IGNvbW1hbmRfc3RydWN0IHsKLSAgICBjb25zdCBjaGFyICpuYW1lOwkJLyogTmFtZSBvZiB0aGlzIGNvbW1hbmQgKi8KLSAgICBjb25zdCBjaGFyICooKmZ1bmMpICgpOwkvKiBGdW5jdGlvbiBpbnZva2VkICovCi0gICAgdm9pZCAqY21kX2RhdGE7CQkvKiBFeHRyYSBkYXRhLCBmb3IgZnVuY3Rpb25zIHdoaWNoCi0JCQkJICogaW1wbGVtZW50IG11bHRpcGxlIGNvbW1hbmRzLi4uCi0JCQkJICovCi0gICAgaW50IHJlcV9vdmVycmlkZTsJCS8qIFdoYXQgb3ZlcnJpZGVzIG5lZWQgdG8gYmUgYWxsb3dlZCB0bwotCQkJCSAqIGVuYWJsZSB0aGlzIGNvbW1hbmQuCi0JCQkJICovCi0gICAgZW51bSBjbWRfaG93IGFyZ3NfaG93OwkvKiBXaGF0IHRoZSBjb21tYW5kIGV4cGVjdHMgYXMgYXJndW1lbnRzICovCi0KLSAgICBjb25zdCBjaGFyICplcnJtc2c7CQkvKiAndXNhZ2UnIG1lc3NhZ2UsIGluIGNhc2Ugb2Ygc3ludGF4IGVycm9ycyAqLwotfSBjb21tYW5kX3JlYzsKLQotLyogVGhlIGFsbG93ZWQgbG9jYXRpb25zIGZvciBhIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlIGFyZSB0aGUgdW5pb24gb2YKLSAqIHRob3NlIGluZGljYXRlZCBieSBlYWNoIHNldCBiaXQgaW4gdGhlIHJlcV9vdmVycmlkZSBtYXNrLgotICoKLSAqIChyZXFfb3ZlcnJpZGUgJiBSU1JDX0NPTkYpICAgPT4gKi5jb25mIG91dHNpZGUgPERpcmVjdG9yeT4gb3IgPExvY2F0aW9uPgotICogKHJlcV9vdmVycmlkZSAmIEFDQ0VTU19DT05GKSA9PiAqLmNvbmYgaW5zaWRlIDxEaXJlY3Rvcnk+IG9yIDxMb2NhdGlvbj4KLSAqIChyZXFfb3ZlcnJpZGUgJiBPUl9BVVRIQ0ZHKSAgPT4gKi5jb25mIGluc2lkZSA8RGlyZWN0b3J5PiBvciA8TG9jYXRpb24+Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCAuaHRhY2Nlc3Mgd2hlbiBBbGxvd092ZXJyaWRlIEF1dGhDb25maWcKLSAqIChyZXFfb3ZlcnJpZGUgJiBPUl9MSU1JVCkgICAgPT4gKi5jb25mIGluc2lkZSA8RGlyZWN0b3J5PiBvciA8TG9jYXRpb24+Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCAuaHRhY2Nlc3Mgd2hlbiBBbGxvd092ZXJyaWRlIExpbWl0Ci0gKiAocmVxX292ZXJyaWRlICYgT1JfT1BUSU9OUykgID0+ICouY29uZiBhbnl3aGVyZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgLmh0YWNjZXNzIHdoZW4gQWxsb3dPdmVycmlkZSBPcHRpb25zCi0gKiAocmVxX292ZXJyaWRlICYgT1JfRklMRUlORk8pID0+ICouY29uZiBhbnl3aGVyZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgLmh0YWNjZXNzIHdoZW4gQWxsb3dPdmVycmlkZSBGaWxlSW5mbwotICogKHJlcV9vdmVycmlkZSAmIE9SX0lOREVYRVMpICA9PiAqLmNvbmYgYW55d2hlcmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIC5odGFjY2VzcyB3aGVuIEFsbG93T3ZlcnJpZGUgSW5kZXhlcwotICovCi0jZGVmaW5lIE9SX05PTkUgMAotI2RlZmluZSBPUl9MSU1JVCAxCi0jZGVmaW5lIE9SX09QVElPTlMgMgotI2RlZmluZSBPUl9GSUxFSU5GTyA0Ci0jZGVmaW5lIE9SX0FVVEhDRkcgOAotI2RlZmluZSBPUl9JTkRFWEVTIDE2Ci0jZGVmaW5lIE9SX1VOU0VUIDMyCi0jZGVmaW5lIEFDQ0VTU19DT05GIDY0Ci0jZGVmaW5lIFJTUkNfQ09ORiAxMjgKLSNkZWZpbmUgT1JfQUxMIChPUl9MSU1JVHxPUl9PUFRJT05TfE9SX0ZJTEVJTkZPfE9SX0FVVEhDRkd8T1JfSU5ERVhFUykKLQotLyogVGhpcyBjYW4gYmUgcmV0dXJuZWQgYnkgYSBmdW5jdGlvbiBpZiB0aGV5IGRvbid0IHdpc2ggdG8gaGFuZGxlCi0gKiBhIGNvbW1hbmQuIE1ha2UgaXQgc29tZXRoaW5nIG5vdCBsaWtlbHkgc29tZW9uZSB3aWxsIGFjdHVhbGx5IHVzZQotICogYXMgYW4gZXJyb3IgY29kZS4KLSAqLwotCi0jZGVmaW5lIERFQ0xJTkVfQ01EICJcYVxiIgotCi0vKgotICogVGhpcyBzdHJ1Y3R1cmUgaXMgcGFzc2VkIHRvIGEgY29tbWFuZCB3aGljaCBpcyBiZWluZyBpbnZva2VkLAotICogdG8gY2FycnkgYSBsYXJnZSB2YXJpZXR5IG9mIG1pc2NlbGxhbmVvdXMgZGF0YSB3aGljaCBpcyBhbGwgb2YKLSAqIHVzZSB0byAqc29tZWJvZHkqLi4uCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHZvaWQgKmluZm87CQkJLyogQXJndW1lbnQgdG8gY29tbWFuZCBmcm9tIGNtZF90YWJsZSAqLwotICAgIGludCBvdmVycmlkZTsJCS8qIFdoaWNoIGFsbG93LW92ZXJyaWRlIGJpdHMgYXJlIHNldCAqLwotICAgIGludCBsaW1pdGVkOwkJLyogV2hpY2ggbWV0aG9kcyBhcmUgPExpbWl0PmVkICovCi0KLSAgICBjb25maWdmaWxlX3QgKmNvbmZpZ19maWxlOwkvKiBDb25maWcgZmlsZSBzdHJ1Y3R1cmUgZnJvbSBwY2ZnX29wZW5maWxlKCkgKi8KLQotICAgIGFwX3Bvb2wgKnBvb2w7CQkJLyogUG9vbCB0byBhbGxvY2F0ZSBuZXcgc3RvcmFnZSBpbiAqLwotICAgIHN0cnVjdCBwb29sICp0ZW1wX3Bvb2w7CQkvKiBQb29sIGZvciBzY3JhdGNoIG1lbW9yeTsgcGVyc2lzdHMgZHVyaW5nCi0JCQkJICogY29uZmlndXJhdGlvbiwgYnV0IHdpcGVkIGJlZm9yZSB0aGUgZmlyc3QKLQkJCQkgKiByZXF1ZXN0IGlzIHNlcnZlZC4uLgotCQkJCSAqLwotICAgIHNlcnZlcl9yZWMgKnNlcnZlcjsJCS8qIFNlcnZlcl9yZWMgYmVpbmcgY29uZmlndXJlZCBmb3IgKi8KLSAgICBjaGFyICpwYXRoOwkJCS8qIElmIGNvbmZpZ3VyaW5nIGZvciBhIGRpcmVjdG9yeSwKLQkJCQkgKiBwYXRobmFtZSBvZiB0aGF0IGRpcmVjdG9yeS4KLQkJCQkgKiBOT1BFISAgVGhhdCdzIHdoYXQgaXQgbWVhbnQgcHJldmlvdXMgdG8gdGhlCi0JCQkJICogZXhpc3RhbmNlIG9mIDxGaWxlcz4sIDxMb2NhdGlvbj4gYW5kIHJlZ2V4Ci0JCQkJICogbWF0Y2hpbmcuICBOb3cgdGhlIG9ubHkgdXNlZnVsbmVzcyB0aGF0IGNhbgotCQkJCSAqIGJlIGRlcml2ZWQgZnJvbSB0aGlzIGZpZWxkIGlzIHdoZXRoZXIgYSBjb21tYW5kCi0JCQkJICogaXMgYmVpbmcgY2FsbGVkIGluIGEgc2VydmVyIGNvbnRleHQgKHBhdGggPT0gTlVMTCkKLQkJCQkgKiBvciBiZWluZyBjYWxsZWQgaW4gYSBkaXIgY29udGV4dCAocGF0aCAhPSBOVUxMKS4KLQkJCQkgKi8KLSAgICBjb25zdCBjb21tYW5kX3JlYyAqY21kOwkvKiBjb25maWd1cmF0aW9uIGNvbW1hbmQgKi8KLSAgICBjb25zdCBjaGFyICplbmRfdG9rZW47CS8qIGVuZCB0b2tlbiByZXF1aXJlZCB0byBlbmQgYSBuZXN0ZWQgc2VjdGlvbiAqLwotICAgIHZvaWQgKmNvbnRleHQ7CQkvKiBwZXJfZGlyX2NvbmZpZyB2ZWN0b3IgcGFzc2VkIAotCQkJCSAqIHRvIGhhbmRsZV9jb21tYW5kICovCi19IGNtZF9wYXJtczsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgcmVjb3JkcyB0aGUgZXhpc3RlbmNlIG9mIGhhbmRsZXJzIGluIGEgbW9kdWxlLi4uICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjb25zdCBjaGFyICpjb250ZW50X3R5cGU7CS8qIE1VU1QgYmUgYWxsIGxvd2VyIGNhc2UgKi8KLSAgICBpbnQgKCpoYW5kbGVyKSAocmVxdWVzdF9yZWMgKik7Ci19IGhhbmRsZXJfcmVjOwotCi0vKgotICogTW9kdWxlIHN0cnVjdHVyZXMuICBKdXN0IGFib3V0IGV2ZXJ5dGhpbmcgaXMgZGlzcGF0Y2hlZCB0aHJvdWdoCi0gKiB0aGVzZSwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSAodGhyb3VnaCB0aGUgY29tbWFuZCBhbmQgaGFuZGxlcgotICogdGFibGVzKS4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCBtb2R1bGVfc3RydWN0IHsKLSAgICBpbnQgdmVyc2lvbjsJCS8qIEFQSSB2ZXJzaW9uLCAqbm90KiBtb2R1bGUgdmVyc2lvbjsKLQkJCQkgKiBjaGVjayB0aGF0IG1vZHVsZSBpcyBjb21wYXRpYmxlIHdpdGggdGhpcwotCQkJCSAqIHZlcnNpb24gb2YgdGhlIHNlcnZlci4KLQkJCQkgKi8KLSAgICBpbnQgbWlub3JfdmVyc2lvbjsgICAgICAgICAgLyogQVBJIG1pbm9yIHZlcnNpb24uIFByb3ZpZGVzIEFQSSBmZWF0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1pbGVzdG9uZXMuIE5vdCBjaGVja2VkIGR1cmluZyBtb2R1bGUgaW5pdAotCQkJCSAqLwotICAgIGludCBtb2R1bGVfaW5kZXg7CQkvKiBJbmRleCB0byB0aGlzIG1vZHVsZXMgc3RydWN0dXJlcyBpbgotCQkJCSAqIGNvbmZpZyB2ZWN0b3JzLgotCQkJCSAqLwotCi0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICB2b2lkICpkeW5hbWljX2xvYWRfaGFuZGxlOwotCi0gICAgc3RydWN0IG1vZHVsZV9zdHJ1Y3QgKm5leHQ7Ci0KLSAgICB1bnNpZ25lZCBsb25nIG1hZ2ljOyAgICAgICAgLyogTWFnaWMgQ29va2llIHRvIGlkZW50aWZ5IGEgbW9kdWxlIHN0cnVjdHVyZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSXQncyBtYWlubHkgaW1wb3J0YW50IGZvciB0aGUgRFNPIGZhY2lsaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChzZWUgYWxzbyBtb2Rfc28pLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIC8qIGluaXQoKSBvY2N1cnMgYWZ0ZXIgY29uZmlnIHBhcnNpbmcsIGJ1dCBiZWZvcmUgYW55IGNoaWxkcmVuIGFyZQotICAgICAqIGZvcmtlZC4KLSAgICAgKiBNb2R1bGVzIHNob3VsZCBub3QgcmVseSBvbiB0aGUgb3JkZXIgaW4gd2hpY2ggY3JlYXRlX3NlcnZlcl9jb25maWcKLSAgICAgKiBhbmQgY3JlYXRlX2Rpcl9jb25maWcgYXJlIGNhbGxlZC4KLSAgICAgKi8KLSNpZmRlZiBVTFRSSVhfQlJBSU5fREVBVEgKLSAgICB2b2lkICgqaW5pdCkgKCk7Ci0gICAgdm9pZCAqKCpjcmVhdGVfZGlyX2NvbmZpZykgKCk7Ci0gICAgdm9pZCAqKCptZXJnZV9kaXJfY29uZmlnKSAoKTsKLSAgICB2b2lkICooKmNyZWF0ZV9zZXJ2ZXJfY29uZmlnKSAoKTsKLSAgICB2b2lkICooKm1lcmdlX3NlcnZlcl9jb25maWcpICgpOwotI2Vsc2UKLSAgICB2b2lkICgqaW5pdCkgKHNlcnZlcl9yZWMgKiwgcG9vbCAqKTsKLSAgICB2b2lkICooKmNyZWF0ZV9kaXJfY29uZmlnKSAocG9vbCAqcCwgY2hhciAqZGlyKTsKLSAgICB2b2lkICooKm1lcmdlX2Rpcl9jb25maWcpIChwb29sICpwLCB2b2lkICpiYXNlX2NvbmYsIHZvaWQgKm5ld19jb25mKTsKLSAgICB2b2lkICooKmNyZWF0ZV9zZXJ2ZXJfY29uZmlnKSAocG9vbCAqcCwgc2VydmVyX3JlYyAqcyk7Ci0gICAgdm9pZCAqKCptZXJnZV9zZXJ2ZXJfY29uZmlnKSAocG9vbCAqcCwgdm9pZCAqYmFzZV9jb25mLCB2b2lkICpuZXdfY29uZik7Ci0jZW5kaWYKLQotICAgIGNvbnN0IGNvbW1hbmRfcmVjICpjbWRzOwotICAgIGNvbnN0IGhhbmRsZXJfcmVjICpoYW5kbGVyczsKLQotICAgIC8qIEhvb2tzIGZvciBnZXR0aW5nIGludG8gdGhlIG1pZGRsZSBvZiBzZXJ2ZXIgb3BzLi4uCi0KLSAgICAgKiB0cmFuc2xhdGVfaGFuZGxlciAtLS0gdHJhbnNsYXRlIFVSSSB0byBmaWxlbmFtZQotICAgICAqIGFjY2Vzc19jaGVja2VyIC0tLSBjaGVjayBhY2Nlc3MgYnkgaG9zdCBhZGRyZXNzLCBldGMuICAgQWxsIG9mIHRoZXNlCi0gICAgICogICAgICAgICAgICAgICAgICAgIHJ1bjsgaWYgYWxsIGRlY2xpbmUsIHRoYXQncyBzdGlsbCBPSy4KLSAgICAgKiBjaGVja191c2VyX2lkIC0tLSBnZXQgYW5kIHZhbGlkYXRlIHVzZXIgaWQgZnJvbSB0aGUgSFRUUCByZXF1ZXN0Ci0gICAgICogYXV0aF9jaGVja2VyIC0tLSBzZWUgaWYgdGhlIHVzZXIgKGZyb20gY2hlY2tfdXNlcl9pZCkgaXMgT0sgKmhlcmUqLgotICAgICAqICAgICAgICAgICAgICAgICAgSWYgYWxsIG9mICp0aGVzZSogZGVjbGluZSwgdGhlIHJlcXVlc3QgaXMgcmVqZWN0ZWQKLSAgICAgKiAgICAgICAgICAgICAgICAgIChhcyBhIFNFUlZFUl9FUlJPUiwgc2luY2UgdGhlIG1vZHVsZSB3aGljaCB3YXMKLSAgICAgKiAgICAgICAgICAgICAgICAgIHN1cHBvc2VkIHRvIGhhbmRsZSB0aGlzIHdhcyBjb25maWd1cmVkIHdyb25nKS4KLSAgICAgKiB0eXBlX2NoZWNrZXIgLS0tIERldGVybWluZSBNSU1FIHR5cGUgb2YgdGhlIHJlcXVlc3RlZCBlbnRpdHk7Ci0gICAgICogICAgICAgICAgICAgICAgICBzZXRzIGNvbnRlbnRfdHlwZSwgX2VuY29kaW5nIGFuZCBfbGFuZ3VhZ2UgZmllbGRzLgotICAgICAqIGxvZ2dlciAtLS0gbG9nIGEgdHJhbnNhY3Rpb24uCi0gICAgICogcG9zdF9yZWFkX3JlcXVlc3QgLS0tIHJ1biByaWdodCBhZnRlciByZWFkX3JlcXVlc3Qgb3IgaW50ZXJuYWxfcmVkaXJlY3QsCi0gICAgICogICAgICAgICAgICAgICAgICBhbmQgbm90IHJ1biBkdXJpbmcgYW55IHN1YnJlcXVlc3RzLgotICAgICAqLwotCi0gICAgaW50ICgqdHJhbnNsYXRlX2hhbmRsZXIpIChyZXF1ZXN0X3JlYyAqKTsKLSAgICBpbnQgKCphcF9jaGVja191c2VyX2lkKSAocmVxdWVzdF9yZWMgKik7Ci0gICAgaW50ICgqYXV0aF9jaGVja2VyKSAocmVxdWVzdF9yZWMgKik7Ci0gICAgaW50ICgqYWNjZXNzX2NoZWNrZXIpIChyZXF1ZXN0X3JlYyAqKTsKLSAgICBpbnQgKCp0eXBlX2NoZWNrZXIpIChyZXF1ZXN0X3JlYyAqKTsKLSAgICBpbnQgKCpmaXhlcl91cHBlcikgKHJlcXVlc3RfcmVjICopOwotICAgIGludCAoKmxvZ2dlcikgKHJlcXVlc3RfcmVjICopOwotICAgIGludCAoKmhlYWRlcl9wYXJzZXIpIChyZXF1ZXN0X3JlYyAqKTsKLQotICAgIC8qIFJlZ2FyZGxlc3Mgb2YgdGhlIG1vZGVsIHRoZSBzZXJ2ZXIgdXNlcyBmb3IgbWFuYWdpbmcgInVuaXRzIG9mCi0gICAgICogZXhlY3V0aW9uIiwgaS5lLiBtdWx0aS1wcm9jZXNzLCBtdWx0aS10aHJlYWRlZCwgaHlicmlkcyBvZiB0aG9zZSwKLSAgICAgKiB0aGVyZSBpcyB0aGUgY29uY2VwdCBvZiBhICJoZWF2eSB3ZWlnaHQgcHJvY2VzcyIuICBUaGF0IGlzLCBhCi0gICAgICogcHJvY2VzcyB3aXRoIGl0cyBvd24gbWVtb3J5IHNwYWNlLCBmaWxlIHNwYWNlcywgZXRjLiAgVGhpcyBtZXRob2QsCi0gICAgICogY2hpbGRfaW5pdCwgaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggaGVhdnktd2VpZ2h0IHByb2Nlc3MgYmVmb3JlCi0gICAgICogYW55IHJlcXVlc3RzIGFyZSBzZXJ2ZWQuICBOb3RlIHRoYXQgbm8gcHJvdmlzaW9uIGlzIG1hZGUgeWV0IGZvcgotICAgICAqIGluaXRpYWxpemF0aW9uIHBlciBsaWdodC13ZWlnaHQgcHJvY2VzcyAoaS5lLiB0aHJlYWQpLiAgVGhlCi0gICAgICogcGFyYW1ldGVycyBwYXNzZWQgaGVyZSBhcmUgdGhlIHNhbWUgYXMgdGhvc2UgcGFzc2VkIHRvIHRoZSBnbG9iYWwKLSAgICAgKiBpbml0IG1ldGhvZCBhYm92ZS4KLSAgICAgKi8KLSNpZmRlZiBVTFRSSVhfQlJBSU5fREVBVEgKLSAgICB2b2lkICgqY2hpbGRfaW5pdCkgKCk7Ci0gICAgdm9pZCAoKmNoaWxkX2V4aXQpICgpOwotI2Vsc2UKLSAgICB2b2lkICgqY2hpbGRfaW5pdCkgKHNlcnZlcl9yZWMgKiwgcG9vbCAqKTsKLSAgICB2b2lkICgqY2hpbGRfZXhpdCkgKHNlcnZlcl9yZWMgKiwgcG9vbCAqKTsKLSNlbmRpZgotICAgIGludCAoKnBvc3RfcmVhZF9yZXF1ZXN0KSAocmVxdWVzdF9yZWMgKik7Ci19IG1vZHVsZTsKLQotLyogSW5pdGlhbGl6ZXIgZm9yIHRoZSBmaXJzdCBmZXcgbW9kdWxlIHNsb3RzLCB3aGljaCBhcmUgb25seQotICogcmVhbGx5IHNldCB1cCBvbmNlIHdlIHN0YXJ0IHJ1bm5pbmcuICBOb3RlIHRoYXQgdGhlIGZpcnN0IHR3byBzbG90cwotICogcHJvdmlkZSBhIHZlcnNpb24gY2hlY2s7IHRoaXMgc2hvdWxkIGFsbG93IHVzIHRvIGRlYWwgd2l0aCBjaGFuZ2VzIHRvCi0gKiB0aGUgQVBJLiBUaGUgbWFqb3IgbnVtYmVyIHNob3VsZCByZWZsZWN0IGNoYW5nZXMgdG8gdGhlIEFQSSBoYW5kbGVyIHRhYmxlCi0gKiBpdHNlbGYgb3IgcmVtb3ZhbCBvZiBmdW5jdGlvbmFsaXR5LiBUaGUgbWlub3IgbnVtYmVyIHNob3VsZCByZWZsZWN0Ci0gKiBhZGRpdGlvbnMgb2YgZnVuY3Rpb25hbGl0eSB0byB0aGUgZXhpc3RpbmcgQVBJLiAodGhlIHNlcnZlciBjYW4gZGV0ZWN0Ci0gKiBhbiBvbGQtZm9ybWF0IG1vZHVsZSwgYW5kIGVpdGhlciBoYW5kbGUgaXQgYmFjay1jb21wYXRpYmx5LCBvciBhdCBsZWFzdAotICogc2lnbmFsIGFuIGVycm9yKS4gU2VlIHNyYy9pbmNsdWRlL2FwX21tbi5oIGZvciBNTU4gdmVyc2lvbiBoaXN0b3J5LgotICovCi0KLSNkZWZpbmUgU1RBTkRBUkRfTU9EVUxFX1NUVUZGCU1PRFVMRV9NQUdJQ19OVU1CRVJfTUFKT1IsIFwKLQkJCQlNT0RVTEVfTUFHSUNfTlVNQkVSX01JTk9SLCBcCi0JCQkJLTEsIFwKLQkJCQlfX0ZJTEVfXywgXAotCQkJCU5VTEwsIFwKLQkJCQlOVUxMLCBcCi0JCQkJTU9EVUxFX01BR0lDX0NPT0tJRQotCi0vKiBHZW5lcmljIGFjY2Vzc29ycyBmb3Igb3RoZXIgbW9kdWxlcyB0byBnZXQgYXQgdGhlaXIgb3duIG1vZHVsZS1zcGVjaWZpYwotICogZGF0YQotICovCi0KLUFQSV9FWFBPUlQodm9pZCAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyh2b2lkICpjb25mX3ZlY3RvciwgbW9kdWxlICptKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfc2V0X21vZHVsZV9jb25maWcodm9pZCAqY29uZl92ZWN0b3IsIG1vZHVsZSAqbSwgdm9pZCAqdmFsKTsKLQotI2RlZmluZSBhcF9nZXRfbW9kdWxlX2NvbmZpZyh2LG0pCVwKLSAgICAoKCh2b2lkICoqKSh2KSlbKG0pLT5tb2R1bGVfaW5kZXhdKQotI2RlZmluZSBhcF9zZXRfbW9kdWxlX2NvbmZpZyh2LG0sdmFsKQlcCi0gICAgKCgoKHZvaWQgKiopKHYpKVsobSktPm1vZHVsZV9pbmRleF0pID0gKHZhbCkpCi0KLS8qIEdlbmVyaWMgY29tbWFuZCBoYW5kbGluZyBmdW5jdGlvbi4uLiAqLwotCi1BUElfRVhQT1JUX05PTlNURChjb25zdCBjaGFyICopIGFwX3NldF9zdHJpbmdfc2xvdChjbWRfcGFybXMgKiwgY2hhciAqLCBjaGFyICopOwotQVBJX0VYUE9SVF9OT05TVEQoY29uc3QgY2hhciAqKSBhcF9zZXRfc3RyaW5nX3Nsb3RfbG93ZXIoY21kX3Bhcm1zICosIGNoYXIgKiwgY2hhciAqKTsKLUFQSV9FWFBPUlRfTk9OU1REKGNvbnN0IGNoYXIgKikgYXBfc2V0X2ZsYWdfc2xvdChjbWRfcGFybXMgKiwgY2hhciAqLCBpbnQpOwotQVBJX0VYUE9SVF9OT05TVEQoY29uc3QgY2hhciAqKSBhcF9zZXRfZmlsZV9zbG90KGNtZF9wYXJtcyAqLCBjaGFyICosIGNoYXIgKik7Ci0KLS8qIEZvciBtb2R1bGVzIHdoaWNoIG5lZWQgdG8gcmVhZCBjb25maWcgZmlsZXMsIG9wZW4gbG9ncywgZXRjLiAuLi4KLSAqIHRoaXMgcmV0dXJucyB0aGUgZm5hbWUgYXJndW1lbnQgaWYgaXQgYmVnaW5zIHdpdGggJy8nOyBvdGhlcndpc2UKLSAqIGl0IHJlbGF0aXZpemVzIGl0IHdydCBzZXJ2ZXJfcm9vdC4KLSAqLwotCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocG9vbCAqcCwgY2hhciAqZm5hbWUpOwotCi0vKiBGaW5hbGx5LCB0aGUgaG9vayBmb3IgZHluYW1pY2FsbHkgbG9hZGluZyBtb2R1bGVzIGluLi4uICovCi0KLUFQSV9FWFBPUlQodm9pZCkgYXBfYWRkX21vZHVsZShtb2R1bGUgKm0pOwotQVBJX0VYUE9SVCh2b2lkKSBhcF9yZW1vdmVfbW9kdWxlKG1vZHVsZSAqbSk7Ci1BUElfRVhQT1JUKHZvaWQpIGFwX2FkZF9sb2FkZWRfbW9kdWxlKG1vZHVsZSAqbW9kKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfcmVtb3ZlX2xvYWRlZF9tb2R1bGUobW9kdWxlICptb2QpOwotQVBJX0VYUE9SVChpbnQpIGFwX2FkZF9uYW1lZF9tb2R1bGUoY29uc3QgY2hhciAqbmFtZSk7Ci1BUElfRVhQT1JUKHZvaWQpIGFwX2NsZWFyX21vZHVsZV9saXN0KHZvaWQpOwotQVBJX0VYUE9SVChjb25zdCBjaGFyICopIGFwX2ZpbmRfbW9kdWxlX25hbWUobW9kdWxlICptKTsKLUFQSV9FWFBPUlQobW9kdWxlICopIGFwX2ZpbmRfbGlua2VkX21vZHVsZShjb25zdCBjaGFyICpuYW1lKTsKLQotLyogZm9yIGltcGxlbWVudGluZyBzdWJjb25maWdzIGFuZCBjdXN0b21pemVkIGNvbmZpZyBmaWxlcyAqLwotQVBJX0VYUE9SVChjb25zdCBjaGFyICopIGFwX3NybV9jb21tYW5kX2xvb3AoY21kX3Bhcm1zICpwYXJtcywgdm9pZCAqY29uZmlnKTsKLQotI2lmZGVmIENPUkVfUFJJVkFURQotCi1leHRlcm4gQVBJX1ZBUl9FWFBPUlQgbW9kdWxlICp0b3BfbW9kdWxlOwotCi1leHRlcm4gbW9kdWxlICphcF9wcmVsaW5rZWRfbW9kdWxlc1tdOwotZXh0ZXJuIG1vZHVsZSAqYXBfcHJlbG9hZGVkX21vZHVsZXNbXTsKLWV4dGVybiBBUElfVkFSX0VYUE9SVCBtb2R1bGUgKiphcF9sb2FkZWRfbW9kdWxlczsKLQotLyogRm9yIG1vZF9zby5jLi4uICovCi0KLXZvaWQgYXBfc2luZ2xlX21vZHVsZV9jb25maWd1cmUocG9vbCAqcCwgc2VydmVyX3JlYyAqcywgbW9kdWxlICptKTsKLQotLyogRm9yIGh0dHBfbWFpbi5jLi4uICovCi0KLXNlcnZlcl9yZWMgKmFwX3JlYWRfY29uZmlnKHBvb2wgKmNvbmZfcG9vbCwgcG9vbCAqdGVtcF9wb29sLCBjaGFyICpjb25maWdfbmFtZSk7Ci12b2lkIGFwX2luaXRfbW9kdWxlcyhwb29sICpwLCBzZXJ2ZXJfcmVjICpzKTsKLXZvaWQgYXBfY2hpbGRfaW5pdF9tb2R1bGVzKHBvb2wgKnAsIHNlcnZlcl9yZWMgKnMpOwotdm9pZCBhcF9jaGlsZF9leGl0X21vZHVsZXMocG9vbCAqcCwgc2VydmVyX3JlYyAqcyk7Ci12b2lkIGFwX3NldHVwX3ByZWxpbmtlZF9tb2R1bGVzKHZvaWQpOwotdm9pZCBhcF9zaG93X2RpcmVjdGl2ZXModm9pZCk7Ci12b2lkIGFwX3Nob3dfbW9kdWxlcyh2b2lkKTsKLQotLyogRm9yIGh0dHBfcmVxdWVzdC5jLi4uICovCi0KLXZvaWQgKmFwX2NyZWF0ZV9yZXF1ZXN0X2NvbmZpZyhwb29sICpwKTsKLUNPUkVfRVhQT1JUKHZvaWQgKikgYXBfY3JlYXRlX3Blcl9kaXJfY29uZmlnKHBvb2wgKnApOwotdm9pZCAqYXBfbWVyZ2VfcGVyX2Rpcl9jb25maWdzKHBvb2wgKnAsIHZvaWQgKmJhc2UsIHZvaWQgKm5ldyk7Ci0KLS8qIEZvciBodHRwX2NvcmUuYy4uLiAoPERpcmVjdG9yeT4gY29tbWFuZCBhbmQgdmlydHVhbCBob3N0cykgKi8KLQotaW50IGFwX3BhcnNlX2h0YWNjZXNzKHZvaWQgKipyZXN1bHQsIHJlcXVlc3RfcmVjICpyLCBpbnQgb3ZlcnJpZGUsCi0JCWNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmFjY2Vzc19uYW1lKTsKLQotQ09SRV9FWFBPUlQoY29uc3QgY2hhciAqKSBhcF9pbml0X3ZpcnR1YWxfaG9zdChwb29sICpwLCBjb25zdCBjaGFyICpob3N0bmFtZSwKLQkJCQlzZXJ2ZXJfcmVjICptYWluX3NlcnZlciwgc2VydmVyX3JlYyAqKik7Ci12b2lkIGFwX3Byb2Nlc3NfcmVzb3VyY2VfY29uZmlnKHNlcnZlcl9yZWMgKnMsIGNoYXIgKmZuYW1lLCBwb29sICpwLCBwb29sICpwdGVtcCk7Ci0KLS8qIGFwX2NoZWNrX2NtZF9jb250ZXh0KCkgZGVmaW5pdGlvbnM6ICovCi1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfY2hlY2tfY21kX2NvbnRleHQoY21kX3Bhcm1zICpjbWQsIHVuc2lnbmVkIGZvcmJpZGRlbik7Ci0KLS8qIGFwX2NoZWNrX2NtZF9jb250ZXh0KCk6ICAgICAgICAgICAgICBGb3JiaWRkZW4gaW46ICovCi0jZGVmaW5lICBOT1RfSU5fVklSVFVBTEhPU1QgICAgIDB4MDEgLyogPFZpcnR1YWxob3N0PiAqLwotI2RlZmluZSAgTk9UX0lOX0xJTUlUICAgICAgICAgICAweDAyIC8qIDxMaW1pdD4gKi8KLSNkZWZpbmUgIE5PVF9JTl9ESVJFQ1RPUlkgICAgICAgMHgwNCAvKiA8RGlyZWN0b3J5PiAqLwotI2RlZmluZSAgTk9UX0lOX0xPQ0FUSU9OICAgICAgICAweDA4IC8qIDxMb2NhdGlvbj4gKi8KLSNkZWZpbmUgIE5PVF9JTl9GSUxFUyAgICAgICAgICAgMHgxMCAvKiA8RmlsZXM+ICovCi0jZGVmaW5lICBOT1RfSU5fRElSX0xPQ19GSUxFICAgIChOT1RfSU5fRElSRUNUT1JZfE5PVF9JTl9MT0NBVElPTnxOT1RfSU5fRklMRVMpIC8qIDxEaXJlY3Rvcnk+LzxMb2NhdGlvbj4vPEZpbGVzPiovCi0jZGVmaW5lICBHTE9CQUxfT05MWSAgICAgICAgICAgIChOT1RfSU5fVklSVFVBTEhPU1R8Tk9UX0lOX0xJTUlUfE5PVF9JTl9ESVJfTE9DX0ZJTEUpCi0KLQotLyogTW9kdWxlLW1ldGhvZCBkaXNwYXRjaGVycywgYWxzbyBmb3IgaHR0cF9yZXF1ZXN0LmMgKi8KLQotaW50IGFwX3RyYW5zbGF0ZV9uYW1lKHJlcXVlc3RfcmVjICopOwotaW50IGFwX2NoZWNrX2FjY2VzcyhyZXF1ZXN0X3JlYyAqKTsJLyogY2hlY2sgYWNjZXNzIG9uIG5vbi1hdXRoIGJhc2lzICovCi1pbnQgYXBfY2hlY2tfdXNlcl9pZChyZXF1ZXN0X3JlYyAqKTsJLyogb2J0YWluIHZhbGlkIHVzZXJuYW1lIGZyb20gY2xpZW50IGF1dGggKi8KLWludCBhcF9jaGVja19hdXRoKHJlcXVlc3RfcmVjICopOwkvKiBjaGVjayAodmFsaWRhdGVkKSB1c2VyIGlzIGF1dGhvcml6ZWQgaGVyZSAqLwotaW50IGFwX2ZpbmRfdHlwZXMocmVxdWVzdF9yZWMgKik7CS8qIGlkZW50aWZ5IE1JTUUgdHlwZSAqLwotaW50IGFwX3J1bl9maXh1cHMocmVxdWVzdF9yZWMgKik7CS8qIHBva2UgYXJvdW5kIGZvciBvdGhlciBtZXRhaW5mbywgZXRjLi4uLiAqLwotaW50IGFwX2ludm9rZV9oYW5kbGVyKHJlcXVlc3RfcmVjICopOwotaW50IGFwX2xvZ190cmFuc2FjdGlvbihyZXF1ZXN0X3JlYyAqcik7Ci1pbnQgYXBfaGVhZGVyX3BhcnNlKHJlcXVlc3RfcmVjICopOwotaW50IGFwX3J1bl9wb3N0X3JlYWRfcmVxdWVzdChyZXF1ZXN0X3JlYyAqKTsKLQotLyogZm9yIG1vZF9wZXJsICovCi0KLUNPUkVfRVhQT1JUKGNvbnN0IGNvbW1hbmRfcmVjICopIGFwX2ZpbmRfY29tbWFuZChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjb21tYW5kX3JlYyAqY21kcyk7Ci1DT1JFX0VYUE9SVChjb25zdCBjb21tYW5kX3JlYyAqKSBhcF9maW5kX2NvbW1hbmRfaW5fbW9kdWxlcyhjb25zdCBjaGFyICpjbWRfbmFtZSwgbW9kdWxlICoqbW9kKTsKLUNPUkVfRVhQT1JUKHZvaWQgKikgYXBfc2V0X2NvbmZpZ192ZWN0b3JzKGNtZF9wYXJtcyAqcGFybXMsIHZvaWQgKmNvbmZpZywgbW9kdWxlICptb2QpOwotQ09SRV9FWFBPUlQoY29uc3QgY2hhciAqKSBhcF9oYW5kbGVfY29tbWFuZChjbWRfcGFybXMgKnBhcm1zLCB2b2lkICpjb25maWcsIGNvbnN0IGNoYXIgKmwpOwotCi0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCS8qICFBUEFDSEVfSFRUUF9DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9odHRwX2Nvbm5lY3Rpb24uaCBiL2luY2x1ZGUvaHR0cF9jb25uZWN0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZThlNzQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9odHRwX2Nvbm5lY3Rpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaWZuZGVmIEFQQUNIRV9IVFRQX0NPTk5FQ1RJT05fSAotI2RlZmluZSBBUEFDSEVfSFRUUF9DT05ORUNUSU9OX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1DT1JFX0VYUE9SVCh2b2lkKSBhcF9wcm9jZXNzX2Nvbm5lY3Rpb24oY29ubl9yZWMgKik7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgkvKiAhQVBBQ0hFX0hUVFBfUkVRVUVTVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2h0dHBfY29yZS5oIGIvaW5jbHVkZS9odHRwX2NvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU5ZmQyNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2h0dHBfY29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotI2lmbmRlZiBBUEFDSEVfSFRUUF9DT1JFX0gKLSNkZWZpbmUgQVBBQ0hFX0hUVFBfQ09SRV9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhlIG1vc3QgYmFzaWMgc2VydmVyIGNvZGUgaXMgZW5jYXBzdWxhdGVkIGluIGEgc2luZ2xlIG1vZHVsZQotICoga25vd24gYXMgdGhlIGNvcmUsIHdoaWNoIGlzIGp1c3QgKmJhcmVseSogZnVuY3Rpb25hbCBlbm91Z2ggdG8KLSAqIHNlcnZlIGRvY3VtZW50cywgdGhvdWdoIG5vdCB0ZXJyaWJseSB3ZWxsLgotICoKLSAqIExhcmdlbHkgZm9yIE5DU0EgYmFjay1jb21wYXRpYmlsaXR5IHJlYXNvbnMsIHRoZSBjb3JlIG5lZWRzIHRvCi0gKiBtYWtlIHBpZWNlcyBvZiBpdHMgY29uZmlnIHN0cnVjdHVyZXMgYXZhaWxhYmxlIHRvIG90aGVyIG1vZHVsZXMuCi0gKiBUaGUgYWNjZXNzb3JzIGFyZSBkZWNsYXJlZCBoZXJlLCBhbG9uZyB3aXRoIHRoZSBpbnRlcnByZXRhdGlvbgotICogb2Ygb25lIG9mIHRoZW0gKGFsbG93X29wdGlvbnMpLgotICovCi0KLSNkZWZpbmUgT1BUX05PTkUgMAotI2RlZmluZSBPUFRfSU5ERVhFUyAxCi0jZGVmaW5lIE9QVF9JTkNMVURFUyAyCi0jZGVmaW5lIE9QVF9TWU1fTElOS1MgNAotI2RlZmluZSBPUFRfRVhFQ0NHSSA4Ci0jZGVmaW5lIE9QVF9VTlNFVCAxNgotI2RlZmluZSBPUFRfSU5DTk9FWEVDIDMyCi0jZGVmaW5lIE9QVF9TWU1fT1dORVIgNjQKLSNkZWZpbmUgT1BUX01VTFRJIDEyOAotI2RlZmluZSBPUFRfQUxMIChPUFRfSU5ERVhFU3xPUFRfSU5DTFVERVN8T1BUX1NZTV9MSU5LU3xPUFRfRVhFQ0NHSSkKLQotLyogb3B0aW9ucyBmb3IgZ2V0X3JlbW90ZV9ob3N0KCkgKi8KLS8qIFJFTU9URV9IT1NUIHJldHVybnMgdGhlIGhvc3RuYW1lLCBvciBOVUxMIGlmIHRoZSBob3N0bmFtZQotICogbG9va3VwIGZhaWxzLiAgSXQgd2lsbCBmb3JjZSBhIEROUyBsb29rdXAgYWNjb3JkaW5nIHRvIHRoZQotICogSG9zdG5hbWVMb29rdXBzIHNldHRpbmcuCi0gKi8KLSNkZWZpbmUgUkVNT1RFX0hPU1QgKDApCi0KLS8qIFJFTU9URV9OQU1FIHJldHVybnMgdGhlIGhvc3RuYW1lLCBvciB0aGUgZG90dGVkIHF1YWQgaWYgdGhlCi0gKiBob3N0bmFtZSBsb29rdXAgZmFpbHMuICBJdCB3aWxsIGZvcmNlIGEgRE5TIGxvb2t1cCBhY2NvcmRpbmcKLSAqIHRvIHRoZSBIb3N0bmFtZUxvb2t1cHMgc2V0dGluZy4KLSAqLwotI2RlZmluZSBSRU1PVEVfTkFNRSAoMSkKLQotLyogUkVNT1RFX05PTE9PS1VQIGlzIGxpa2UgUkVNT1RFX05BTUUgZXhjZXB0IHRoYXQgYSBETlMgbG9va3VwIGlzCi0gKiBuZXZlciBmb3JjZWQuCi0gKi8KLSNkZWZpbmUgUkVNT1RFX05PTE9PS1VQICgyKQotCi0vKiBSRU1PVEVfRE9VQkxFX1JFViB3aWxsIGFsd2F5cyBmb3JjZSBhIEROUyBsb29rdXAsIGFuZCBhbHNvIGZvcmNlCi0gKiBhIGRvdWJsZSByZXZlcnNlIGxvb2t1cCwgcmVnYXJkbGVzcyBvZiB0aGUgSG9zdG5hbWVMb29rdXBzCi0gKiBzZXR0aW5nLiAgVGhlIHJlc3VsdCBpcyB0aGUgKGRvdWJsZSByZXZlcnNlIGNoZWNrZWQpIGhvc3RuYW1lLAotICogb3IgTlVMTCBpZiBhbnkgb2YgdGhlIGxvb2t1cHMgZmFpbC4KLSAqLwotI2RlZmluZSBSRU1PVEVfRE9VQkxFX1JFViAoMykKLQotI2RlZmluZSBTQVRJU0ZZX0FMTCAwCi0jZGVmaW5lIFNBVElTRllfQU5ZIDEKLSNkZWZpbmUgU0FUSVNGWV9OT1NQRUMgMgotCi1BUElfRVhQT1JUKGludCkgYXBfYWxsb3dfb3B0aW9ucyAocmVxdWVzdF9yZWMgKik7Ci1BUElfRVhQT1JUKGludCkgYXBfYWxsb3dfb3ZlcnJpZGVzIChyZXF1ZXN0X3JlYyAqKTsKLUFQSV9FWFBPUlQoY29uc3QgY2hhciAqKSBhcF9kZWZhdWx0X3R5cGUgKHJlcXVlc3RfcmVjICopOyAgICAgCi1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfZG9jdW1lbnRfcm9vdCAocmVxdWVzdF9yZWMgKik7IC8qIERvbid0IHVzZSB0aGlzISAgSWYgeW91ciByZXF1ZXN0IHdlbnQKLQkJCQkgICAgICAqIHRocm91Z2ggYSBVc2VyZGlyLCBvciBzb21ldGhpbmcgbGlrZQotCQkJCSAgICAgICogdGhhdCwgaXQnbGwgc2NyZXcgeW91LiAgQnV0IGl0J3MKLQkJCQkgICAgICAqIGJhY2stY29tcGF0aWJsZS4uLgotCQkJCSAgICAgICovCi1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfZ2V0X3JlbW90ZV9ob3N0KGNvbm5fcmVjICpjb25uLCB2b2lkICpkaXJfY29uZmlnLCBpbnQgdHlwZSk7Ci1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfZ2V0X3JlbW90ZV9sb2duYW1lKHJlcXVlc3RfcmVjICpyKTsKLQotLyogVXNlZCBmb3IgY29uc3RydWN0aW5nIHNlbGYtcmVmZXJlbmNpbmcgVVJMcywgYW5kIHRoaW5ncyBsaWtlIFNFUlZFUl9QT1JULAotICogYW5kIFNFUlZFUl9OQU1FLgotICovCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfY29uc3RydWN0X3VybChwb29sICpwLCBjb25zdCBjaGFyICp1cmksIHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlQoY29uc3QgY2hhciAqKSBhcF9nZXRfc2VydmVyX25hbWUocmVxdWVzdF9yZWMgKnIpOwotQVBJX0VYUE9SVCh1bnNpZ25lZCkgYXBfZ2V0X3NlcnZlcl9wb3J0KGNvbnN0IHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlQodW5zaWduZWQgbG9uZykgYXBfZ2V0X2xpbWl0X3JlcV9ib2R5KGNvbnN0IHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfY3VzdG9tX3Jlc3BvbnNlKHJlcXVlc3RfcmVjICpyLCBpbnQgc3RhdHVzLCBjaGFyICpzdHJpbmcpOwotQVBJX0VYUE9SVChpbnQpIGFwX2V4aXN0c19jb25maWdfZGVmaW5lKGNoYXIgKm5hbWUpOwotCi0vKiBBdXRoZW50aWNhdGlvbiBzdHVmZi4gIFRoaXMgaXMgb25lIG9mIHRoZSBwbGFjZXMgd2hlcmUgY29tcGF0aWJpbGl0eQotICogd2l0aCB0aGUgb2xkIGNvbmZpZyBmaWxlcyAqcmVhbGx5KiBodXJ0czsgdGhleSBkb24ndCBkaXNjcmltaW5hdGUgYXQKLSAqIGFsbCBiZXR3ZWVuIGRpZmZlcmVudCBhdXRoZW50aWNhdGlvbiBzY2hlbWVzLCBtZWFuaW5nIHRoYXQgd2UgbmVlZAotICogdG8gbWFpbnRhaW4gY29tbW9uIHN0YXRlIGZvciBhbGwgb2YgdGhlbSBpbiB0aGUgY29yZSwgYW5kIG1ha2UgaXQKLSAqIGF2YWlsYWJsZSB0byB0aGUgb3RoZXIgbW9kdWxlcyB0aHJvdWdoIGludGVyZmFjZXMuCi0gKi8KLSAgICAKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgbWV0aG9kX21hc2s7Ci0gICAgY2hhciAqcmVxdWlyZW1lbnQ7Ci19IHJlcXVpcmVfbGluZTsKLSAgICAgCi1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfYXV0aF90eXBlIChyZXF1ZXN0X3JlYyAqKTsKLUFQSV9FWFBPUlQoY29uc3QgY2hhciAqKSBhcF9hdXRoX25hbWUgKHJlcXVlc3RfcmVjICopOyAgICAgCi1BUElfRVhQT1JUKGludCkgYXBfc2F0aXNmaWVzIChyZXF1ZXN0X3JlYyAqcik7Ci1BUElfRVhQT1JUKGNvbnN0IGFycmF5X2hlYWRlciAqKSBhcF9yZXF1aXJlcyAocmVxdWVzdF9yZWMgKik7ICAgIAotCi0jaWZkZWYgV0lOMzIKLS8qIAotICogQ0dJIFNjcmlwdCBzdHVmZiBmb3IgV2luMzIuLi4KLSAqLwotdHlwZWRlZiBlbnVtIHsgZUZpbGVUeXBlVU5LTk9XTiwgZUZpbGVUeXBlQklOLCBlRmlsZVR5cGVFWEUxNiwgZUZpbGVUeXBlRVhFMzIsIAotICAgICAgICAgICAgICAgZUZpbGVUeXBlU0NSSVBUIH0gZmlsZV90eXBlX2U7Ci10eXBlZGVmIGVudW0geyBJTlRFUlBSRVRFUl9TT1VSQ0VfVU5TRVQsIElOVEVSUFJFVEVSX1NPVVJDRV9SRUdJU1RSWSwgCi0gICAgICAgICAgICAgICBJTlRFUlBSRVRFUl9TT1VSQ0VfU0hFQkFORyB9IGludGVycHJldGVyX3NvdXJjZV9lOwotQVBJX0VYUE9SVChmaWxlX3R5cGVfZSkgYXBfZ2V0X3dpbjMyX2ludGVycHJldGVyKGNvbnN0IHJlcXVlc3RfcmVjICosIGNoYXIgKiopOwotI2VuZGlmCi0KLSNpZmRlZiBDT1JFX1BSSVZBVEUKLQotLyoKLSAqIENvcmUgaXMgYWxzbyB1bmxpa2Ugb3RoZXIgbW9kdWxlcyBpbiBiZWluZyBpbXBsZW1lbnRlZCBpbiBtb3JlIHRoYW4KLSAqIG9uZSBmaWxlLi4uIHNvLCBkYXRhIHN0cnVjdHVyZXMgYXJlIGRlY2xhcmVkIGhlcmUsIGV2ZW4gdGhvdWdoIG1vc3Qgb2YKLSAqIHRoZSBjb2RlIHRoYXQgY2FyZXMgcmVhbGx5IGlzIGluIGh0dHBfY29yZS5jLiAgQWxzbywgYW5vdGhlciBhY2Nlc3Nvci4KLSAqLwotCi1jaGFyICphcF9yZXNwb25zZV9jb2RlX3N0cmluZyAocmVxdWVzdF9yZWMgKnIsIGludCBlcnJvcl9pbmRleCk7Ci0KLWV4dGVybiBBUElfVkFSX0VYUE9SVCBtb2R1bGUgY29yZV9tb2R1bGU7Ci0KLS8qIFBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgYWxsb3dfb3B0aW9uc190OwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIG92ZXJyaWRlc190OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgLyogcGF0aCBvZiB0aGUgZGlyZWN0b3J5L3JlZ2V4L2V0Yy4gIHNlZSBhbHNvIGRfaXNfZm5tYXRjaCBiZWxvdyAqLwotICAgIGNoYXIgKmQ7Ci0gICAgLyogdGhlIG51bWJlciBvZiBzbGFzaGVzIGluIGQgKi8KLSAgICB1bnNpZ25lZCBkX2NvbXBvbmVudHM7Ci0KLSAgICAvKiBJZiAob3B0cyAmIE9QVF9VTlNFVCkgdGhlbiBubyBhYnNvbHV0ZSBhc3NpZ25tZW50IHRvIG9wdGlvbnMgaGFzCi0gICAgICogYmVlbiBtYWRlLgotICAgICAqIGludmFyaWFudDogKG9wdHNfYWRkICYgb3B0c19yZW1vdmUpID09IDAKLSAgICAgKiBXaGljaCBzYWlkIGFub3RoZXIgd2F5IG1lYW5zIHRoYXQgdGhlIGxhc3QgcmVsYXRpdmUgKG9wdGlvbnMgKyBvciAtKQotICAgICAqIGFzc2lnbm1lbnQgbWFkZSB0byBlYWNoIGJpdCBpcyByZWNvcmRlZCBpbiBleGFjdGx5IG9uZSBvZiBvcHRzX2FkZAotICAgICAqIG9yIG9wdHNfcmVtb3ZlLgotICAgICAqLwotICAgIGFsbG93X29wdGlvbnNfdCBvcHRzOwotICAgIGFsbG93X29wdGlvbnNfdCBvcHRzX2FkZDsKLSAgICBhbGxvd19vcHRpb25zX3Qgb3B0c19yZW1vdmU7Ci0gICAgb3ZlcnJpZGVzX3Qgb3ZlcnJpZGU7Ci0gICAgCi0gICAgLyogTUlNRSB0eXBpbmcgLS0tIHRoZSBjb3JlIGRvZXNuJ3QgZG8gYW55dGhpbmcgYXQgYWxsIHdpdGggdGhpcywKLSAgICAgKiBidXQgaXQgZG9lcyBrbm93IHdoYXQgdG8gc2xhcCBvbiBhIHJlcXVlc3QgZm9yIGEgZG9jdW1lbnQgd2hpY2gKLSAgICAgKiBnb2VzIHVudHlwZWQgYnkgb3RoZXIgbWVjaGFuaXNtcyBiZWZvcmUgaXQgc2xpcHMgb3V0IHRoZSBkb29yLi4uCi0gICAgICovCi0gICAgCi0gICAgY2hhciAqYXBfZGVmYXVsdF90eXBlOwotICAKLSAgICAvKiBBdXRoZW50aWNhdGlvbiBzdHVmZi4gIEdyb2FuLi4uICovCi0gICAgCi0gICAgaW50IHNhdGlzZnk7Ci0gICAgY2hhciAqYXBfYXV0aF90eXBlOwotICAgIGNoYXIgKmFwX2F1dGhfbmFtZTsKLSAgICBhcnJheV9oZWFkZXIgKmFwX3JlcXVpcmVzOwotCi0gICAgLyogQ3VzdG9tIHJlc3BvbnNlIGNvbmZpZy4gVGhlc2UgY2FuIGNvbnRhaW4gdGV4dCBvciBhIFVSTCB0byByZWRpcmVjdCB0by4KLSAgICAgKiBpZiByZXNwb25zZV9jb2RlX3N0cmluZ3MgaXMgTlVMTCB0aGVuIHRoZXJlIGFyZSBub25lIGluIHRoZSBjb25maWcsCi0gICAgICogaWYgaXQncyBub3QgbnVsbCB0aGVuIGl0J3MgYWxsb2NhdGVkIHRvIHNpemVvZihjaGFyKikqUkVTUE9OU0VfQ09ERVMuCi0gICAgICogVGhpcyBsZXRzIHVzIGRvIHF1aWNrIG1lcmdlcyBpbiBtZXJnZV9jb3JlX2Rpcl9jb25maWdzKCkuCi0gICAgICovCi0gIAotICAgIGNoYXIgKipyZXNwb25zZV9jb2RlX3N0cmluZ3M7Ci0KLSAgICAvKiBIb3N0bmFtZSByZXNvbHV0aW9uIGV0YyAqLwotI2RlZmluZSBIT1NUTkFNRV9MT09LVVBfT0ZGCTAKLSNkZWZpbmUgSE9TVE5BTUVfTE9PS1VQX09OCTEKLSNkZWZpbmUgSE9TVE5BTUVfTE9PS1VQX0RPVUJMRQkyCi0jZGVmaW5lIEhPU1ROQU1FX0xPT0tVUF9VTlNFVAkzCi0gICAgdW5zaWduZWQgaW50IGhvc3RuYW1lX2xvb2t1cHMgOiA0OwotCi0gICAgc2lnbmVkIGludCBkb19yZmMxNDEzIDogMjsgICAvKiBTZWUgaWYgY2xpZW50IGlzIGFkdmVydGlzaW5nIGEgdXNlcm5hbWU/ICovCi0KLSAgICBzaWduZWQgaW50IGNvbnRlbnRfbWQ1IDogMjsgIC8qIGNhbGN1bGF0ZSBDb250ZW50LU1ENT8gKi8KLQotI2RlZmluZSBVU0VfQ0FOT05JQ0FMX05BTUVfT0ZGICAgKDApCi0jZGVmaW5lIFVTRV9DQU5PTklDQUxfTkFNRV9PTiAgICAoMSkKLSNkZWZpbmUgVVNFX0NBTk9OSUNBTF9OQU1FX0ROUyAgICgyKQotI2RlZmluZSBVU0VfQ0FOT05JQ0FMX05BTUVfVU5TRVQgKDMpCi0gICAgdW5zaWduZWQgdXNlX2Nhbm9uaWNhbF9uYW1lIDogMjsKLQotICAgIC8qIHNpbmNlIGlzX2ZubWF0Y2goY29uZi0+ZCkgd2FzIGJlaW5nIGNhbGxlZCBzbyBmcmVxdWVudGx5IGluCi0gICAgICogZGlyZWN0b3J5X3dhbGsoKSBhbmQgaXRzIHJlbGF0aXZlcywgdGhpcyBmaWVsZCB3YXMgY3JlYXRlZCBhbmQKLSAgICAgKiBpcyBzZXQgdG8gdGhlIHJlc3VsdCBvZiB0aGF0IGNhbGwuCi0gICAgICovCi0gICAgdW5zaWduZWQgZF9pc19mbm1hdGNoIDogMTsKLQotICAgIC8qIFN5c3RlbSBSZXNvdXJjZSBDb250cm9sICovCi0jaWZkZWYgUkxJTUlUX0NQVQotICAgIHN0cnVjdCBybGltaXQgKmxpbWl0X2NwdTsKLSNlbmRpZgotI2lmIGRlZmluZWQgKFJMSU1JVF9EQVRBKSB8fCBkZWZpbmVkIChSTElNSVRfVk1FTSkgfHwgZGVmaW5lZChSTElNSVRfQVMpCi0gICAgc3RydWN0IHJsaW1pdCAqbGltaXRfbWVtOwotI2VuZGlmCi0jaWZkZWYgUkxJTUlUX05QUk9DCi0gICAgc3RydWN0IHJsaW1pdCAqbGltaXRfbnByb2M7Ci0jZW5kaWYKLSAgICB1bnNpZ25lZCBsb25nIGxpbWl0X3JlcV9ib2R5OyAgLyogbGltaXQgb24gYnl0ZXMgaW4gcmVxdWVzdCBtc2cgYm9keSAqLwotCi0gICAgLyogbG9nZ2luZyBvcHRpb25zICovCi0gICAgZW51bSB7IHNydl9zaWdfdW5zZXQsIHNydl9zaWdfb2ZmLCBzcnZfc2lnX29uLAotCSAgICBzcnZfc2lnX3dpdGhtYWlsIH0gc2VydmVyX3NpZ25hdHVyZTsKLSAgICBpbnQgbG9nbGV2ZWw7Ci0gICAgCi0gICAgLyogQWNjZXNzIGNvbnRyb2wgKi8KLSAgICBhcnJheV9oZWFkZXIgKnNlYzsKLSAgICByZWdleF90ICpyOwotCi0jaWZkZWYgV0lOMzIKLSAgICAvKiBXaGVyZSB0byBmaW5kIGludGVycHJldGVyIHRvIHJ1biBzY3JpcHRzICovCi0gICAgaW50ZXJwcmV0ZXJfc291cmNlX2Ugc2NyaXB0X2ludGVycHJldGVyX3NvdXJjZTsKLSNlbmRpZiAgICAKLSAgICAKLX0gY29yZV9kaXJfY29uZmlnOwotCi0vKiBQZXItc2VydmVyIGNvcmUgY29uZmlndXJhdGlvbiAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIAotI2lmZGVmIEdQUk9GCi0gICAgY2hhciAqZ3Byb2ZfZGlyOwotI2VuZGlmCi0KLSAgICAvKiBOYW1lIHRyYW5zbGF0aW9ucyAtLS0gd2Ugd2FudCB0aGUgY29yZSB0byBiZSBhYmxlIHRvIGRvICpzb21ldGhpbmcqCi0gICAgICogc28gaXQncyBhdCBsZWFzdCBhIG1pbmltYWxseSBmdW5jdGlvbmFsIHdlYiBzZXJ2ZXIgb24gaXRzIG93biAoYW5kCi0gICAgICogY2FuIGJlIHRlc3RlZCB0aGF0IHdheSkuICBCdXQgbGV0J3Mga2VlcCBpdCB0byB0aGUgYmFyZSBtaW5pbXVtOgotICAgICAqLwotICAgIGNoYXIgKmFwX2RvY3VtZW50X3Jvb3Q7Ci0gIAotICAgIC8qIEFjY2VzcyBjb250cm9sICovCi0KLSAgICBjaGFyICphY2Nlc3NfbmFtZTsKLSAgICBhcnJheV9oZWFkZXIgKnNlYzsKLSAgICBhcnJheV9oZWFkZXIgKnNlY191cmw7Ci19IGNvcmVfc2VydmVyX2NvbmZpZzsKLQotLyogZm9yIGh0dHBfY29uZmlnLmMgKi8KLXZvaWQgYXBfY29yZV9yZW9yZGVyX2RpcmVjdG9yaWVzKHBvb2wgKiwgc2VydmVyX3JlYyAqKTsKLQotLyogZm9yIG1vZF9wZXJsICovCi1DT1JFX0VYUE9SVCh2b2lkKSBhcF9hZGRfcGVyX2Rpcl9jb25mIChzZXJ2ZXJfcmVjICpzLCB2b2lkICpkaXJfY29uZmlnKTsKLUNPUkVfRVhQT1JUKHZvaWQpIGFwX2FkZF9wZXJfdXJsX2NvbmYgKHNlcnZlcl9yZWMgKnMsIHZvaWQgKnVybF9jb25maWcpOwotQ09SRV9FWFBPUlQodm9pZCkgYXBfYWRkX2ZpbGVfY29uZihjb3JlX2Rpcl9jb25maWcgKmNvbmYsIHZvaWQgKnVybF9jb25maWcpOwotQ09SRV9FWFBPUlRfTk9OU1REKGNvbnN0IGNoYXIgKikgYXBfbGltaXRfc2VjdGlvbiAoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjb25zdCBjaGFyICphcmcpOwotCi0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCS8qICFBUEFDSEVfSFRUUF9DT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaHR0cF9sb2cuaCBiL2luY2x1ZGUvaHR0cF9sb2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxNjJiZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2h0dHBfbG9nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaWZuZGVmIEFQQUNIRV9IVFRQX0xPR19ICi0jZGVmaW5lIEFQQUNIRV9IVFRQX0xPR19ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1lTTE9HCi0jaW5jbHVkZSA8c3lzbG9nLmg+Ci0KLSNkZWZpbmUgQVBMT0dfRU1FUkcgICAgIExPR19FTUVSRyAgICAgLyogc3lzdGVtIGlzIHVudXNhYmxlICovCi0jZGVmaW5lIEFQTE9HX0FMRVJUICAgICBMT0dfQUxFUlQgICAgIC8qIGFjdGlvbiBtdXN0IGJlIHRha2VuIGltbWVkaWF0ZWx5ICovCi0jZGVmaW5lIEFQTE9HX0NSSVQgICAgICBMT0dfQ1JJVCAgICAgIC8qIGNyaXRpY2FsIGNvbmRpdGlvbnMgKi8KLSNkZWZpbmUgQVBMT0dfRVJSICAgICAgIExPR19FUlIgICAgICAgLyogZXJyb3IgY29uZGl0aW9ucyAqLwotI2RlZmluZSBBUExPR19XQVJOSU5HICAgTE9HX1dBUk5JTkcgICAvKiB3YXJuaW5nIGNvbmRpdGlvbnMgKi8KLSNkZWZpbmUgQVBMT0dfTk9USUNFICAgIExPR19OT1RJQ0UgICAgLyogbm9ybWFsIGJ1dCBzaWduaWZpY2FudCBjb25kaXRpb24gKi8KLSNkZWZpbmUgQVBMT0dfSU5GTyAgICAgIExPR19JTkZPICAgICAgLyogaW5mb3JtYXRpb25hbCAqLwotI2RlZmluZSBBUExPR19ERUJVRyAgICAgTE9HX0RFQlVHICAgICAvKiBkZWJ1Zy1sZXZlbCBtZXNzYWdlcyAqLwotCi0jZGVmaW5lIEFQTE9HX0xFVkVMTUFTSyBMT0dfUFJJTUFTSyAgIC8qIG1hc2sgb2ZmIHRoZSBsZXZlbCB2YWx1ZSAqLwotCi0jZWxzZQotCi0jZGVmaW5lCUFQTE9HX0VNRVJHCTAJLyogc3lzdGVtIGlzIHVudXNhYmxlICovCi0jZGVmaW5lCUFQTE9HX0FMRVJUCTEJLyogYWN0aW9uIG11c3QgYmUgdGFrZW4gaW1tZWRpYXRlbHkgKi8KLSNkZWZpbmUJQVBMT0dfQ1JJVAkyCS8qIGNyaXRpY2FsIGNvbmRpdGlvbnMgKi8KLSNkZWZpbmUJQVBMT0dfRVJSCTMJLyogZXJyb3IgY29uZGl0aW9ucyAqLwotI2RlZmluZQlBUExPR19XQVJOSU5HCTQJLyogd2FybmluZyBjb25kaXRpb25zICovCi0jZGVmaW5lCUFQTE9HX05PVElDRQk1CS8qIG5vcm1hbCBidXQgc2lnbmlmaWNhbnQgY29uZGl0aW9uICovCi0jZGVmaW5lCUFQTE9HX0lORk8JNgkvKiBpbmZvcm1hdGlvbmFsICovCi0jZGVmaW5lCUFQTE9HX0RFQlVHCTcJLyogZGVidWctbGV2ZWwgbWVzc2FnZXMgKi8KLQotI2RlZmluZQlBUExPR19MRVZFTE1BU0sJNwkvKiBtYXNrIG9mZiB0aGUgbGV2ZWwgdmFsdWUgKi8KLQotI2VuZGlmCi0KLSNkZWZpbmUgQVBMT0dfTk9FUlJOTwkJKEFQTE9HX0xFVkVMTUFTSyArIDEpCi0jaWZkZWYgV0lOMzIKLS8qIFNldCB0byBpbmRpY2F0ZSB0aGF0IGVycm9yIG1zZyBzaG91bGQgY29tZSBmcm9tIFdpbjMyJ3MgR2V0TGFzdEVycm9yKCksCi0gKiBub3QgZXJybm8uICovCi0jZGVmaW5lIEFQTE9HX1dJTjMyRVJST1IJKChBUExPR19MRVZFTE1BU0srMSkgKiAyKQotI2VuZGlmCi0KLSNpZm5kZWYgREVGQVVMVF9MT0dMRVZFTAotI2RlZmluZSBERUZBVUxUX0xPR0xFVkVMCUFQTE9HX1dBUk5JTkcKLSNlbmRpZgotCi0jZGVmaW5lIEFQTE9HX01BUksJX19GSUxFX18sX19MSU5FX18KLQotdm9pZCBhcF9vcGVuX2xvZ3MgKHNlcnZlcl9yZWMgKiwgcG9vbCAqcCk7Ci0KLS8qIFRoZSB0d28gcHJpbWFyeSBsb2dnaW5nIGZ1bmN0aW9ucywgYXBfbG9nX2Vycm9yIGFuZCBhcF9sb2dfcmVycm9yLAotICogdXNlIGEgcHJpbnRmIHN0eWxlIGZvcm1hdCBzdHJpbmcgdG8gYnVpbGQgdGhlIGxvZyBtZXNzYWdlLiAgSXQgaXMKLSAqIFZFUlkgSU1QT1JUQU5UIHRoYXQgeW91IG5vdCBpbmNsdWRlIGFueSByYXcgZGF0YSBmcm9tIHRoZSBuZXR3b3JrLAotICogc3VjaCBhcyB0aGUgcmVxdWVzdC1VUkkgb3IgcmVxdWVzdCBoZWFkZXIgZmllbGRzLCB3aXRoaW4gdGhlIGZvcm1hdAotICogc3RyaW5nLiAgRG9pbmcgc28gbWFrZXMgdGhlIHNlcnZlciB2dWxuZXJhYmxlIHRvIGEgZGVuaWFsLW9mLXNlcnZpY2UKLSAqIGF0dGFjayBhbmQgb3RoZXIgbWVzc3kgYmVoYXZpb3IuICBJbnN0ZWFkLCB1c2UgYSBzaW1wbGUgZm9ybWF0IHN0cmluZwotICogbGlrZSAiJXMiLCBmb2xsb3dlZCBieSB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHVudHJ1c3RlZCBkYXRhLgotICovCi1BUElfRVhQT1JUKHZvaWQpIGFwX2xvZ19lcnJvcihjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IGxldmVsLAotCQkJICAgICBjb25zdCBzZXJ2ZXJfcmVjICpzLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQkJCSAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLDUsNikpKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfbG9nX3JlcnJvcihjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IGxldmVsLAotCQkJICAgICBjb25zdCByZXF1ZXN0X3JlYyAqcywgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JCQkgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50Ziw1LDYpKSk7Ci1BUElfRVhQT1JUKHZvaWQpIGFwX2Vycm9yX2xvZzJzdGRlcnIgKHNlcnZlcl9yZWMgKik7ICAgICAKLQotdm9pZCBhcF9sb2dfcGlkIChwb29sICpwLCBjaGFyICpmbmFtZSk7Ci0vKiBUaGVzZSBhcmUgZm9yIGxlZ2FjeSBjb2RlLCBuZXcgY29kZSBzaG91bGQgdXNlIGFwX2xvZ19lcnJvciwKLSAqIG9yIGFwX2xvZ19yZXJyb3IuCi0gKi8KLUFQSV9FWFBPUlQodm9pZCkgYXBfbG9nX2Vycm9yX29sZChjb25zdCBjaGFyICplcnIsIHNlcnZlcl9yZWMgKnMpOwotQVBJX0VYUE9SVCh2b2lkKSBhcF9sb2dfdW5peGVycihjb25zdCBjaGFyICpyb3V0aW5lLCBjb25zdCBjaGFyICpmaWxlLAotCQkJICAgICBjb25zdCBjaGFyICptc2csIHNlcnZlcl9yZWMgKnMpOwotQVBJX0VYUE9SVCh2b2lkKSBhcF9sb2dfcHJpbnRmKGNvbnN0IHNlcnZlcl9yZWMgKnMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCQkJICAgIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsMiwzKSkpOwotQVBJX0VYUE9SVCh2b2lkKSBhcF9sb2dfcmVhc29uKGNvbnN0IGNoYXIgKnJlYXNvbiwgY29uc3QgY2hhciAqZm5hbWUsCi0JCQkgICAgcmVxdWVzdF9yZWMgKnIpOwotCi10eXBlZGVmIHN0cnVjdCBwaXBlZF9sb2cgewotICAgIHBvb2wgKnA7Ci0jaWZuZGVmIE5PX1JFTElBQkxFX1BJUEVEX0xPR1MKLSAgICBjaGFyICpwcm9ncmFtOwotICAgIGludCBwaWQ7Ci0gICAgaW50IGZkc1syXTsKLSNlbHNlCi0gICAgRklMRSAqd3JpdGVfZjsKLSNlbmRpZgotfSBwaXBlZF9sb2c7Ci0KLUFQSV9FWFBPUlQocGlwZWRfbG9nICopIGFwX29wZW5fcGlwZWRfbG9nIChwb29sICpwLCBjb25zdCBjaGFyICpwcm9ncmFtKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfY2xvc2VfcGlwZWRfbG9nIChwaXBlZF9sb2cgKik7Ci0jaWZuZGVmIE5PX1JFTElBQkxFX1BJUEVEX0xPR1MKLSNkZWZpbmUgYXBfcGlwZWRfbG9nX3JlYWRfZmQocGwpCSgocGwpLT5mZHNbMF0pCi0jZGVmaW5lIGFwX3BpcGVkX2xvZ193cml0ZV9mZChwbCkJKChwbCktPmZkc1sxXSkKLSNlbHNlCi0jZGVmaW5lIGFwX3BpcGVkX2xvZ19yZWFkX2ZkKHBsKQkoLTEpCi0jZGVmaW5lIGFwX3BpcGVkX2xvZ193cml0ZV9mZChwbCkJKGZpbGVubygocGwpLT53cml0ZV9mKSkKLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYJLyogIUFQQUNIRV9IVFRQX0xPR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2h0dHBfbWFpbi5oIGIvaW5jbHVkZS9odHRwX21haW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBkMDE0ZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2h0dHBfbWFpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotI2lmbmRlZiBBUEFDSEVfSFRUUF9NQUlOX0gKLSNkZWZpbmUgQVBBQ0hFX0hUVFBfTUFJTl9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoKLSAqIFJvdXRpbmVzIGluIGh0dHBfbWFpbi5jIHdoaWNoIG90aGVyIGNvZGUgLS0tIGluIHBhcnRpY3VsYXIgbW9kdWxlcyAtLS0KLSAqIG1heSB3YW50IHRvIGNhbGwuICBSaWdodCBub3csIHRoYXQncyBsaW1pdGVkIHRvIHRpbWVvdXQgaGFuZGxpbmcuCi0gKiBUaGVyZSBhcmUgdHdvIGZ1bmN0aW9ucyB3aGljaCBtb2R1bGVzIGNhbiBjYWxsIHRvIHRyaWdnZXIgYSB0aW1lb3V0Ci0gKiAod2l0aCB0aGUgcGVyLXZpcnR1YWwtc2VydmVyIHRpbWVvdXQgZHVyYXRpb24pOyB0aGVzZSBhcmUgaGFyZF90aW1lb3V0Ci0gKiBhbmQgc29mdF90aW1lb3V0LgotICoKLSAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBpcyB3aGF0IGhhcHBlbnMgd2hlbiB0aGUgdGltZW91dAotICogZXhwaXJlcyAob3IgZWFybGllciB0aGFuIHRoYXQsIGlmIHRoZSBjbGllbnQgY29ubmVjdGlvbiBhYm9ydHMpIC0tLQotICogYSBzb2Z0X3RpbWVvdXQganVzdCBwdXRzIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQgaW4gYW4KLSAqICJhYm9ydGVkIiBzdGF0ZSwgd2hpY2ggd2lsbCBjYXVzZSBodHRwX3Byb3RvY29sLmMgdG8gc3RvcCB0cnlpbmcgdG8KLSAqIHRhbGsgdG8gdGhlIGNsaWVudCwgYnV0IG90aGVyd2lzZSBhbGxvd3MgdGhlIGNvZGUgdG8gY29udGludWUgbm9ybWFsbHkuCi0gKiBoYXJkX3RpbWVvdXQoKSwgYnkgY29udHJhc3QsIGxvZ3MgdGhlIHJlcXVlc3QsIGFuZCB0aGVuIGFib3J0cyBpdAotICogY29tcGxldGVseSAtLS0gbG9uZ2ptcCgpaW5nIG91dCB0byB0aGUgYWNjZXB0KCkgbG9vcCBpbiBodHRwX21haW4uCi0gKiBBbnkgcmVzb3VyY2VzIHRpZWQgaW50byB0aGUgcmVxdWVzdCdzIHJlc291cmNlIHBvb2wgd2lsbCBiZSBjbGVhbmVkIHVwOwotICogZXZlcnl0aGluZyB0aGF0IGlzbid0IHdpbGwgbGVhay4KLSAqCi0gKiBzb2Z0X3RpbWVvdXQoKSBpcyByZWNvbW1lbmRlZCBhcyBhIGdlbmVyYWwgcnVsZSwgYmVjYXVzZSBpdCBnaXZlcyB5b3VyCi0gKiBjb2RlIGEgY2hhbmNlIHRvIGNsZWFuIHVwLiAgSG93ZXZlciwgaGFyZF90aW1lb3V0KCkgbWF5IGJlIHRoZSBtb3N0Ci0gKiBjb252ZW5pZW50IHdheSBvZiBkZWFsaW5nIHdpdGggdGltZW91dHMgd2FpdGluZyBmb3Igc29tZSBleHRlcm5hbAotICogcmVzb3VyY2Ugb3RoZXIgdGhhbiB0aGUgY2xpZW50LCBpZiB5b3UgY2FuIGxpdmUgd2l0aCB0aGUgcmVzdHJpY3Rpb25zLgotICoKLSAqIChXaGVuIGEgaGFyZCB0aW1lb3V0IGlzIGluIHNjb3BlLCBjcml0aWNhbCBzZWN0aW9ucyBjYW4gYmUgZ3VhcmRlZAotICogd2l0aCBibG9ja19hbGFybXMoKSBhbmQgdW5ibG9ja19hbGFybXMoKSAtLS0gdGhlc2UgYXJlIGRlY2xhcmVkIGluCi0gKiBhbGxvYy5jIGJlY2F1c2UgdGhleSBhcmUgbW9zdCBvZnRlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgKLSAqIHJvdXRpbmVzIHRvIGFsbG9jYXRlIHNvbWV0aGluZyBvciBvdGhlciwgdG8gbWFrZSBzdXJlIHRoYXQgdGhlCi0gKiBjbGVhbnVwIGRvZXMgZ2V0IHJlZ2lzdGVyZWQgYmVmb3JlIGFueSBhbGFybSBpcyBhbGxvd2VkIHRvIGhhcHBlbgotICogd2hpY2ggbWlnaHQgcmVxdWlyZSBpdCB0byBiZSBjbGVhbmVkIHVwOyB0aGV5ICogYXJlLCBob3dldmVyLAotICogaW1wbGVtZW50ZWQgaW4gaHR0cF9tYWluLmMpLgotICoKLSAqIE5PVEUhICBJdCdzIG5vdCAiZmFpciIgZm9yIGEgaGFyZF90aW1lb3V0IHRvIGJlIGluIHNjb3BlIHRocm91Z2ggY2FsbHMKLSAqIGFjcm9zcyBtb2R1bGVzLiAgWW91ciBtb2R1bGUgY29kZSByZWFsbHkgaGFzIG5vIGlkZWEgd2hhdCBvdGhlciBtb2R1bGVzIG1heQotICogYmUgcHJlc2VudCBpbiB0aGUgc2VydmVyLCBhbmQgdGhleSBtYXkgbm90IHRha2UgdG9vIGtpbmRseSB0byBoYXZpbmcgYQotICogbG9uZ2ptcCgpIGhhcHBlbiAtLSBpdCBjb3VsZCByZXN1bHQgaW4gY29ycnVwdGVkIHN0YXRlLiAgSGVjayB0aGV5IG1heSBub3QKLSAqIGV2ZW4gdGFrZSB0byBraW5kbHkgdG8gYSBzb2Z0X3RpbWVvdXQoKS4uLiBiZWNhdXNlIGl0IGNhbiBjYXVzZSBFSU5UUiB0bwotICogaGFwcGVuIG9uIHByZXR0eSBtdWNoIGFueSBzeXNjYWxsLCBhbmQgdW5sZXNzIGFsbCB0aGUgbGlicmFyaWVzIGFuZCBtb2R1bGVzCi0gKiBpbiB1c2UgYXJlIGtub3duIHRvIGRlYWwgd2VsbCB3aXRoIEVJTlRSIGl0IGNvdWxkIGNhdXNlIGNvcnJ1cHRpb24gYXMgd2VsbC4KLSAqIEJ1dCB0aGluZ3MgYXJlIGxpa2VseSB0byBkbyBtdWNoIGJldHRlciB3aXRoIGEgc29mdF90aW1lb3V0IGluIHNjb3BlIHRoYW4gYQotICogaGFyZF90aW1lb3V0LgotICogCi0gKiBBIG1vZHVsZSBNQVkgTk9UIHVzZSBhIGhhcmRfdGltZW91dCgpIGFjcm9zcyAqIHN1Yl9yZXFfbG9va3VwX3h4eCgpCi0gKiBmdW5jdGlvbnMsIG9yIGFjcm9zcyBydW5fc3ViX3JlcXVlc3QoKSBmdW5jdGlvbnMuICBBIG1vZHVsZSBTSE9VTEQgTk9UIHVzZSBhCi0gKiBzb2Z0X3RpbWVvdXQoKSBpbiBlaXRoZXIgb2YgdGhlc2UgY2FzZXMsIGJ1dCBzb21ldGltZXMgdGhlcmUncyBqdXN0IG5vCi0gKiBjaG9pY2UuCi0gKgotICoga2lsbF90aW1lb3V0KCkgd2lsbCBkaXNhcm0gZWl0aGVyIHZhcmlldHkgb2YgdGltZW91dC4KLSAqCi0gKiByZXNldF90aW1lb3V0KCkgcmVzZXRzIHRoZSB0aW1lb3V0IGluIHByb2dyZXNzLgotICovCi0KLXZvaWQgYXBfc3RhcnRfc2h1dGRvd24odm9pZCk7Ci12b2lkIGFwX3N0YXJ0X3Jlc3RhcnQoaW50KTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfaGFyZF90aW1lb3V0KGNoYXIgKiwgcmVxdWVzdF9yZWMgKik7Ci12b2lkIGFwX2tlZXBhbGl2ZV90aW1lb3V0KGNoYXIgKiwgcmVxdWVzdF9yZWMgKik7Ci1BUElfRVhQT1JUKHZvaWQpIGFwX3NvZnRfdGltZW91dChjaGFyICosIHJlcXVlc3RfcmVjICopOwotQVBJX0VYUE9SVCh2b2lkKSBhcF9raWxsX3RpbWVvdXQocmVxdWVzdF9yZWMgKik7Ci1BUElfRVhQT1JUKHZvaWQpIGFwX3Jlc2V0X3RpbWVvdXQocmVxdWVzdF9yZWMgKik7Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfY2hpbGRfdGVybWluYXRlKHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfc3luY19zY29yZWJvYXJkX2ltYWdlKHZvaWQpOwotaW50IGFwX3VwZGF0ZV9jaGlsZF9zdGF0dXMoaW50IGNoaWxkX251bSwgaW50IHN0YXR1cywgcmVxdWVzdF9yZWMgKnIpOwotdm9pZCBhcF90aW1lX3Byb2Nlc3NfcmVxdWVzdChpbnQgY2hpbGRfbnVtLCBpbnQgc3RhdHVzKTsKLXVuc2lnbmVkIGludCBhcF9zZXRfY2FsbGJhY2tfYW5kX2FsYXJtKHZvaWQgKCpmbikgKGludCksIGludCB4KTsKLUFQSV9FWFBPUlQoaW50KSBhcF9jaGVja19hbGFybSh2b2lkKTsKLQotI2lmbmRlZiBOT19PVEhFUl9DSElMRAotLyoKLSAqIHJlZ2lzdGVyIGFuIG90aGVyX2NoaWxkIC0tIGEgY2hpbGQgd2hpY2ggdGhlIG1haW4gbG9vcCBrZWVwcyB0cmFjayBvZgotICogYW5kIGtub3dzIGl0IGlzIGRpZmZlcmVudCB0aGFuIHRoZSByZXN0IG9mIHRoZSBzY29yZWJvYXJkLgotICoKLSAqIHBpZCBpcyB0aGUgcGlkIG9mIHRoZSBjaGlsZC4KLSAqCi0gKiBtYWludGVuYW5jZSBpcyBhIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCB3aXRoIGEgcmVhc29uLCB0aGUgZGF0YQotICogcG9pbnRlciBwYXNzZWQgaGVyZSwgYW5kIHdoZW4gYXBwcm9wcmlhdGUgYSBzdGF0dXMgcmVzdWx0IGZyb20gd2FpdHBpZCgpLgotICoKLSAqIHdyaXRlX2ZkIGlzIGFuIGZkIHRoYXQgaXMgcHJvYmVkIGZvciB3cml0aW5nIGJ5IHNlbGVjdCgpIGlmIGl0IGlzIGV2ZXIKLSAqIHVud3JpdGFibGUsIHRoZW4gbWFpbnRlbmFuY2UgaXMgaW52b2tlZCB3aXRoIHJlYXNvbiBPQ19SRUFTT05fVU5XUklUQUJMRS4KLSAqIFRoaXMgaXMgdXNlZnVsIGZvciBsb2cgcGlwZSBjaGlsZHJlbiwgdG8ga25vdyB3aGVuIHRoZXkndmUgYmxvY2tlZC4gIFRvCi0gKiBkaXNhYmxlIHRoaXMgZmVhdHVyZSwgdXNlIC0xIGZvciB3cml0ZV9mZC4KLSAqLwotQVBJX0VYUE9SVCh2b2lkKSBhcF9yZWdpc3Rlcl9vdGhlcl9jaGlsZChpbnQgcGlkLAotICAgICAgIHZvaWQgKCptYWludGVuYW5jZSkgKGludCByZWFzb24sIHZvaWQgKmRhdGEsIGFwX3dhaXRfdCBzdGF0dXMpLCB2b2lkICpkYXRhLAotCQkJCSAgICAgIGludCB3cml0ZV9mZCk7Ci0jZGVmaW5lIE9DX1JFQVNPTl9ERUFUSAkJMAkvKiBjaGlsZCBoYXMgZGllZCwgY2FsbGVyIG11c3QgY2FsbAotCQkJCQkgKiB1bnJlZ2lzdGVyIHN0aWxsICovCi0jZGVmaW5lIE9DX1JFQVNPTl9VTldSSVRBQkxFCTEJLyogd3JpdGVfZmQgaXMgdW53cml0YWJsZSAqLwotI2RlZmluZSBPQ19SRUFTT05fUkVTVEFSVAkyCS8qIGEgcmVzdGFydCBpcyBvY2N1cmluZywgcGVyZm9ybQotCQkJCQkgKiBhbnkgbmVjZXNzYXJ5IGNsZWFudXAgKGluY2x1ZGluZwotCQkJCQkgKiBzZW5kaW5nIGEgc3BlY2lhbCBzaWduYWwgdG8gY2hpbGQpCi0JCQkJCSAqLwotI2RlZmluZSBPQ19SRUFTT05fVU5SRUdJU1RFUgkzCS8qIHVucmVnaXN0ZXIgaGFzIGJlZW4gY2FsbGVkLCBkbwotCQkJCQkgKiB3aGF0ZXZlciBpcyBuZWNlc3NhcnkgKGluY2x1ZGluZwotCQkJCQkgKiBraWxsIHRoZSBjaGlsZCkgKi8KLSNkZWZpbmUgT0NfUkVBU09OX0xPU1QJCTQJLyogc29tZWhvdyB0aGUgY2hpbGQgZXhpdGVkIHdpdGhvdXQKLQkJCQkJICogdXMga25vd2luZyAuLi4gYnVnZ3kgb3M/ICovCi0KLS8qCi0gKiB1bnJlZ2lzdGVyIGFuIG90aGVyX2NoaWxkLiAgTm90ZSB0aGF0IHRoZSBkYXRhIHBvaW50ZXIgaXMgdXNlZCBoZXJlLCBhbmQKLSAqIGlzIGFzc3VtZWQgdG8gYmUgdW5pcXVlIHBlciBvdGhlcl9jaGlsZC4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgcGlkIGFuZAotICogd3JpdGVfZmQgYXJlIHBvc3NpYmx5IGtpbGxlZCBvZmYgc2VwYXJhdGVseS4KLSAqLwotQVBJX0VYUE9SVCh2b2lkKSBhcF91bnJlZ2lzdGVyX290aGVyX2NoaWxkKHZvaWQgKmRhdGEpOwotCi0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCS8qICFBUEFDSEVfSFRUUF9NQUlOX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaHR0cF9wcm90b2NvbC5oIGIvaW5jbHVkZS9odHRwX3Byb3RvY29sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MjRjMWEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9odHRwX3Byb3RvY29sLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLSNpZm5kZWYgQVBBQ0hFX0hUVFBfUFJPVE9DT0xfSAotI2RlZmluZSBBUEFDSEVfSFRUUF9QUk9UT0NPTF9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoKLSAqIFByb3RvdHlwZXMgZm9yIHJvdXRpbmVzIHdoaWNoIGVpdGhlciB0YWxrIGRpcmVjdGx5IGJhY2sgdG8gdGhlIHVzZXIsCi0gKiBvciBjb250cm9sIHRoZSBvbmVzIHRoYXQgZXZlbnR1YWxseSBkby4KLSAqLwotCi0vKiBSZWFkIGEgcmVxdWVzdCBhbmQgZmlsbCBpbiB0aGUgZmllbGRzLiAqLwotCi1yZXF1ZXN0X3JlYyAqYXBfcmVhZF9yZXF1ZXN0KGNvbm5fcmVjICpjKTsKLQotLyogU2VuZCBhIHNpbmdsZSBIVFRQIGhlYWRlciBmaWVsZCAqLwotCi1BUElfRVhQT1JUX05PTlNURChpbnQpIGFwX3NlbmRfaGVhZGVyX2ZpZWxkKHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICpmaWVsZG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmllbGR2YWwpOwotCi0vKiBTZW5kIHRoZSBtaW5pbWFsIHBhcnQgb2YgYW4gSFRUUCByZXNwb25zZSBoZWFkZXIuLi4gYnV0IG1vZHVsZXMgc2hvdWxkIGJlCi0gKiB2ZXJ5IGNhcmVmdWwgYWJvdXQgdXNpbmcgdGhpcywgYW5kIHNob3VsZCBwcmVmZXIgYXBfc2VuZF9odHRwX2hlYWRlcigpLgotICogTXVjaCBvZiB0aGUgSFRUUC8xLjEgaW1wbGVtZW50YXRpb24gY29ycmVjdG5lc3MgZGVwZW5kcyBvbiBjb2RlIGluCi0gKiBhcF9zZW5kX2h0dHBfaGVhZGVyKCkuCi0gKi8KLUFQSV9FWFBPUlQodm9pZCkgYXBfYmFzaWNfaHR0cF9oZWFkZXIocmVxdWVzdF9yZWMgKnIpOwotCi0vKiBTZW5kIHRoZSBTdGF0dXMtTGluZSBhbmQgaGVhZGVyIGZpZWxkcyBmb3IgSFRUUCByZXNwb25zZSAqLwotCi1BUElfRVhQT1JUKHZvaWQpIGFwX3NlbmRfaHR0cF9oZWFkZXIocmVxdWVzdF9yZWMgKmwpOwotCi0vKiBTZW5kIHRoZSByZXNwb25zZSB0byBzcGVjaWFsIG1ldGhvZCByZXF1ZXN0cyAqLwotCi1BUElfRVhQT1JUKGludCkgYXBfc2VuZF9odHRwX3RyYWNlKHJlcXVlc3RfcmVjICpyKTsKLWludCBhcF9zZW5kX2h0dHBfb3B0aW9ucyhyZXF1ZXN0X3JlYyAqcik7Ci0KLS8qIEZpbmlzaCB1cCBzdHVmZiBhZnRlciBhIHJlcXVlc3QgKi8KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9maW5hbGl6ZV9yZXF1ZXN0X3Byb3RvY29sKHJlcXVlc3RfcmVjICpyKTsKLQotLyogU2VuZCBlcnJvciBiYWNrIHRvIGNsaWVudC4uLiBsYXN0IGFyZyBpbmRpY2F0ZXMgZXJyb3Igc3RhdHVzIGluIGNhc2UKLSAqIHdlIGdldCBhbiBlcnJvciBpbiB0aGUgcHJvY2VzcyBvZiB0cnlpbmcgdG8gZGVhbCB3aXRoIGFuIEVycm9yRG9jdW1lbnQKLSAqIHRvIGhhbmRsZSBzb21lIG90aGVyIGVycm9yLiAgSW4gdGhhdCBjYXNlLCB3ZSBwcmludCB0aGUgZGVmYXVsdCByZXBvcnQKLSAqIGZvciB0aGUgZmlyc3QgdGhpbmcgdGhhdCB3ZW50IHdyb25nLCBhbmQgbW9yZSBicmllZmx5IHJlcG9ydCBvbiB0aGUKLSAqIHByb2JsZW0gd2l0aCB0aGUgRXJyb3JEb2N1bWVudC4KLSAqLwotCi12b2lkIGFwX3NlbmRfZXJyb3JfcmVzcG9uc2UocmVxdWVzdF9yZWMgKnIsIGludCByZWN1cnNpdmVfZXJyb3IpOwotCi0vKiBTZXQgbGFzdCBtb2RpZmllZCBoZWFkZXIgbGluZSBmcm9tIHRoZSBsYXN0bW9kIGRhdGUgb2YgdGhlIGFzc29jaWF0ZWQgZmlsZS4KLSAqIEFsc28sIHNldCBjb250ZW50IGxlbmd0aC4KLSAqCi0gKiBNYXkgcmV0dXJuIGFuIGVycm9yIHN0YXR1cywgdHlwaWNhbGx5IFVTRV9MT0NBTF9DT1BZICh0aGF0IHdoZW4gdGhlCi0gKiBwZXJtaXRfY2FjaGUgYXJndW1lbnQgaXMgc2V0IHRvIG9uZSkuCi0gKi8KLQotQVBJX0VYUE9SVChpbnQpIGFwX3NldF9jb250ZW50X2xlbmd0aChyZXF1ZXN0X3JlYyAqciwgbG9uZyBsZW5ndGgpOwotQVBJX0VYUE9SVChpbnQpIGFwX3NldF9rZWVwYWxpdmUocmVxdWVzdF9yZWMgKnIpOwotQVBJX0VYUE9SVCh0aW1lX3QpIGFwX3JhdGlvbmFsaXplX210aW1lKHJlcXVlc3RfcmVjICpyLCB0aW1lX3QgbXRpbWUpOwotQVBJX0VYUE9SVChjaGFyICopIGFwX21ha2VfZXRhZyhyZXF1ZXN0X3JlYyAqciwgaW50IGZvcmNlX3dlYWspOwotQVBJX0VYUE9SVCh2b2lkKSBhcF9zZXRfZXRhZyhyZXF1ZXN0X3JlYyAqcik7Ci1BUElfRVhQT1JUKHZvaWQpIGFwX3NldF9sYXN0X21vZGlmaWVkKHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlQoaW50KSBhcF9tZWV0c19jb25kaXRpb25zKHJlcXVlc3RfcmVjICpyKTsKLQotLyogT3RoZXIgd2F5cyB0byBzZW5kIHN0dWZmIGF0IHRoZSBjbGllbnQuICBBbGwgb2YgdGhlc2Uga2VlcCB0cmFjawotICogb2YgYnl0ZXNfc2VudCBhdXRvbWF0aWNhbGx5LiAgVGhpcyBpbmRpcmVjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlCi0gKiBpdCBhIGxpdHRsZSBtb3JlIHBhaW5sZXNzIHRvIHNsaWRlIHRoaW5ncyBsaWtlIEhUVFAtTkcgcGFja2V0aXphdGlvbgotICogdW5kZXJuZWF0aCB0aGUgbWFpbiBib2R5IG9mIHRoZSBjb2RlIGxhdGVyLiAgSW4gdGhlIG1lYW50aW1lLCBpdCBsZXRzCi0gKiB1cyBjZW50cmFsaXplIGEgYml0IG9mIGFjY291bnRpbmcgKGJ5dGVzX3NlbnQpLgotICoKLSAqIFRoZXNlIGFsc28gcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBieSB0aGUgY2FsbC4KLSAqIFRoZXkgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdpdGggYSB0aW1lb3V0IHJlZ2lzdGVyZWQsIGZvciBvYnZpb3VzIHJlYWFzb25zLgotICogKERpdHRvIHRoZSBzZW5kX2hlYWRlciBzdHVmZikuCi0gKi8KLQotQVBJX0VYUE9SVChsb25nKSBhcF9zZW5kX2ZkKEZJTEUgKmYsIHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlQobG9uZykgYXBfc2VuZF9mZF9sZW5ndGgoRklMRSAqZiwgcmVxdWVzdF9yZWMgKnIsIGxvbmcgbGVuZ3RoKTsKLQotQVBJX0VYUE9SVChsb25nKSBhcF9zZW5kX2ZiKEJVRkYgKmYsIHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlQobG9uZykgYXBfc2VuZF9mYl9sZW5ndGgoQlVGRiAqZiwgcmVxdWVzdF9yZWMgKnIsIGxvbmcgbGVuZ3RoKTsKLQotQVBJX0VYUE9SVChzaXplX3QpIGFwX3NlbmRfbW1hcCh2b2lkICptbSwgcmVxdWVzdF9yZWMgKnIsIHNpemVfdCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpOwotCi0vKiBIbW1tLi4uIGNvdWxkIG1hY3JvZnkgdGhlc2UgZm9yIG5vdywgYW5kIG1heWJlIGZvcmV2ZXIsIHRob3VnaCB0aGUKLSAqIGRlZmluaXRpb25zIG9mIHRoZSBtYWNyb3Mgd291bGQgZ2V0IGEgd2hvbGUgbG90IGhhaXJpZXIuCi0gKi8KLQotQVBJX0VYUE9SVChpbnQpIGFwX3JwdXRjKGludCBjLCByZXF1ZXN0X3JlYyAqcik7Ci1BUElfRVhQT1JUKGludCkgYXBfcnB1dHMoY29uc3QgY2hhciAqc3RyLCByZXF1ZXN0X3JlYyAqcik7Ci1BUElfRVhQT1JUKGludCkgYXBfcndyaXRlKGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG5ieXRlLCByZXF1ZXN0X3JlYyAqcik7Ci1BUElfRVhQT1JUX05PTlNURChpbnQpIGFwX3J2cHV0cyhyZXF1ZXN0X3JlYyAqciwuLi4pOwotQVBJX0VYUE9SVChpbnQpIGFwX3ZycHJpbnRmKHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3Qgdmxpc3QpOwotQVBJX0VYUE9SVF9OT05TVEQoaW50KSBhcF9ycHJpbnRmKHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICpmbXQsLi4uKQotCQkJCV9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsMiwzKSkpOwotQVBJX0VYUE9SVChpbnQpIGFwX3JmbHVzaChyZXF1ZXN0X3JlYyAqcik7Ci0KLS8qCi0gKiBJbmRleCB1c2VkIGluIGN1c3RvbV9yZXNwb25zZXMgYXJyYXkgZm9yIGEgc3BlY2lmaWMgZXJyb3IgY29kZQotICogKG9ubHkgdXNlIG91dHNpZGUgcHJvdG9jb2wuYyBpcyBpbiBnZXR0aW5nIHRoZW0gY29uZmlndXJlZCkuCi0gKi8KLQotQVBJX0VYUE9SVChpbnQpIGFwX2luZGV4X29mX3Jlc3BvbnNlKGludCBzdGF0dXMpOwotCi0vKiBSZWFkaW5nIGEgYmxvY2sgb2YgZGF0YSBmcm9tIHRoZSBjbGllbnQgY29ubmVjdGlvbiAoZS5nLiwgUE9TVCBhcmcpICovCi0KLUFQSV9FWFBPUlQoaW50KSBhcF9zZXR1cF9jbGllbnRfYmxvY2socmVxdWVzdF9yZWMgKnIsIGludCByZWFkX3BvbGljeSk7Ci1BUElfRVhQT1JUKGludCkgYXBfc2hvdWxkX2NsaWVudF9ibG9jayhyZXF1ZXN0X3JlYyAqcik7Ci1BUElfRVhQT1JUKGxvbmcpIGFwX2dldF9jbGllbnRfYmxvY2socmVxdWVzdF9yZWMgKnIsIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZnNpeik7Ci1BUElfRVhQT1JUKGludCkgYXBfZGlzY2FyZF9yZXF1ZXN0X2JvZHkocmVxdWVzdF9yZWMgKnIpOwotCi0vKiBTZW5kaW5nIGEgYnl0ZXJhbmdlICovCi0KLUFQSV9FWFBPUlQoaW50KSBhcF9zZXRfYnl0ZXJhbmdlKHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlQoaW50KSBhcF9lYWNoX2J5dGVyYW5nZShyZXF1ZXN0X3JlYyAqciwgbG9uZyAqb2Zmc2V0LCBsb25nICpsZW5ndGgpOwotCi0vKiBTdXBwb3J0IGZvciB0aGUgQmFzaWMgYXV0aGVudGljYXRpb24gcHJvdG9jb2wuICBOb3RlIHRoYXQgdGhlcmUncwotICogbm90aGluZyB0aGF0IHByZXZlbnRzIHRoZXNlIGZyb20gYmVpbmcgaW4gbW9kX2F1dGguYywgZXhjZXB0IHRoYXQgb3RoZXIKLSAqIG1vZHVsZXMgd2hpY2ggd2FudGVkIHRvIHByb3ZpZGUgdGhlaXIgb3duIHZhcmlhbnRzIG9uIGZpbmRpbmcgdXNlcnMgYW5kCi0gKiBwYXNzd29yZHMgZm9yIEJhc2ljIGF1dGggKGEgZmFpcmx5IGNvbW1vbiByZXF1ZXN0KSB3b3VsZCB0aGVuIHJlcXVpcmUKLSAqIG1vZF9hdXRoIHRvIGJlIGxvYWRlZCBvciB0aGV5IHdvdWxkbid0IHdvcmsuCi0gKgotICogZ2V0X2Jhc2ljX2F1dGhfcHcgcmV0dXJucyAwIChPSykgaWYgaXQgc2V0IHRoZSAncHcnIGFyZ3VtZW50IChhbmQgYXNzdXJlZAotICogYSBjb3JyZWN0IHZhbHVlIGluIHItPmNvbm5lY3Rpb24tPnVzZXIpOyBvdGhlcndpc2UgaXQgcmV0dXJucyBhbiBlcnJvcgotICogY29kZSwgZWl0aGVyIFNFUlZFUl9FUlJPUiBpZiB0aGluZ3MgYXJlIHJlYWxseSBjb25mdXNlZCwgQVVUSF9SRVFVSVJFRAotICogaWYgbm8gYXV0aGVudGljYXRpb24gYXQgYWxsIHNlZW1lZCB0byBiZSBpbiB1c2UsIG9yIERFQ0xJTkVEIGlmIHRoZXJlCi0gKiB3YXMgYXV0aGVudGljYXRpb24gYnV0IGl0IHdhc24ndCBCYXNpYyAoaW4gd2hpY2ggY2FzZSwgdGhlIGNhbGxlciBzaG91bGQKLSAqIHByZXN1bWFibHkgZGVjbGluZSBhcyB3ZWxsKS4KLSAqCi0gKiBub3RlX2Jhc2ljX2F1dGhfZmFpbHVyZSBhcnJhbmdlcyBmb3IgdGhlIHJpZ2h0IHN0dWZmIHRvIGJlIHNjcmliYmxlZCBvbgotICogdGhlIEhUVFAgcmV0dXJuIHNvIHRoYXQgdGhlIGNsaWVudCBrbm93cyBob3cgdG8gYXV0aGVudGljYXRlIGl0c2VsZiB0aGUKLSAqIG5leHQgdGltZS4gQXMgZG9lcyBub3RlX2RpZ2VzdF9hdXRoX2ZhaWx1cmUgZm9yIERpZ2VzdCBhdXRoLgotICoKLSAqIG5vdGVfYXV0aF9mYWlsdXJlIGRvZXMgdGhlIHNhbWUgdGhpbmcsIGJ1dCB3aWxsIGNhbGwgdGhlIGNvcnJlY3Qgb25lCi0gKiBiYXNlZCBvbiB0aGUgYXV0aGVudGljYXRpb24gdHlwZSBpbiB1c2UuCi0gKgotICovCi0KLUFQSV9FWFBPUlQodm9pZCkgYXBfbm90ZV9hdXRoX2ZhaWx1cmUocmVxdWVzdF9yZWMgKnIpOwotQVBJX0VYUE9SVCh2b2lkKSBhcF9ub3RlX2Jhc2ljX2F1dGhfZmFpbHVyZShyZXF1ZXN0X3JlYyAqcik7Ci1BUElfRVhQT1JUKHZvaWQpIGFwX25vdGVfZGlnZXN0X2F1dGhfZmFpbHVyZShyZXF1ZXN0X3JlYyAqcik7Ci1BUElfRVhQT1JUKGludCkgYXBfZ2V0X2Jhc2ljX2F1dGhfcHcocmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKipwdyk7Ci0KLS8qCi0gKiBTZXR0aW5nIHVwIHRoZSBwcm90b2NvbCBmaWVsZHMgZm9yIHN1YnNpZGlhcnkgcmVxdWVzdHMuLi4KLSAqIEFsc28sIGEgd3JhcHVwIGZ1bmN0aW9uIHRvIGtlZXAgdGhlIGludGVybmFsIGFjY291bnRpbmcgc3RyYWlnaHQuCi0gKi8KLQotdm9pZCBhcF9zZXRfc3ViX3JlcV9wcm90b2NvbChyZXF1ZXN0X3JlYyAqcm5ldywgY29uc3QgcmVxdWVzdF9yZWMgKnIpOwotdm9pZCBhcF9maW5hbGl6ZV9zdWJfcmVxX3Byb3RvY29sKHJlcXVlc3RfcmVjICpzdWJfcik7Ci0KLS8qIFRoaXMgaXMgYWxzbyB1c2VmdWwgZm9yIHB1dHRpbmcgc3ViX3JlcXMgYW5kIGludGVybmFsX3JlZGlyZWN0cyB0b2dldGhlciAqLwotCi1DT1JFX0VYUE9SVCh2b2lkKSBhcF9wYXJzZV91cmkocmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKnVyaSk7Ci0KLS8qIEdldCB0aGUgbWV0aG9kIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHN0cmluZywgYXNzdW1lZCB0bwotICogY29udGFpbiBhbiBIVFRQIG1ldGhvZC4gIFJldHVybnMgTV9JTlZBTElEIGlmIG5vdCByZWNvZ25pemVkLgotICovCi1BUElfRVhQT1JUKGludCkgYXBfbWV0aG9kX251bWJlcl9vZihjb25zdCBjaGFyICptZXRob2QpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYJLyogIUFQQUNIRV9IVFRQX1BST1RPQ09MX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaHR0cF9yZXF1ZXN0LmggYi9pbmNsdWRlL2h0dHBfcmVxdWVzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDgzYzU0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaHR0cF9yZXF1ZXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLSNpZm5kZWYgQVBBQ0hFX0hUVFBfUkVRVUVTVF9ICi0jZGVmaW5lIEFQQUNIRV9IVFRQX1JFUVVFU1RfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIGh0dHBfcmVxdWVzdC5jIGlzIHRoZSBjb2RlIHdoaWNoIGhhbmRsZXMgdGhlIG1haW4gbGluZSBvZiByZXF1ZXN0Ci0gKiBwcm9jZXNzaW5nLCBvbmNlIGEgcmVxdWVzdCBoYXMgYmVlbiByZWFkIGluIChmaW5kaW5nIHRoZSByaWdodCBwZXItCi0gKiBkaXJlY3RvcnkgY29uZmlndXJhdGlvbiwgYnVpbGRpbmcgaXQgaWYgbmVjZXNzYXJ5LCBhbmQgY2FsbGluZyBhbGwKLSAqIHRoZSBtb2R1bGUgZGlzcGF0Y2ggZnVuY3Rpb25zIGluIHRoZSByaWdodCBvcmRlcikuCi0gKgotICogVGhlIHBpZWNlcyBoZXJlIHdoaWNoIGFyZSBwdWJsaWMgdG8gdGhlIG1vZHVsZXMsIGFsbG93IHRoZW0gdG8gbGVhcm4KLSAqIGhvdyB0aGUgc2VydmVyIHdvdWxkIGhhbmRsZSBzb21lIG90aGVyIGZpbGUgb3IgVVJJLCBvciBwZXJoYXBzIGV2ZW4KLSAqIGRpcmVjdCB0aGUgc2VydmVyIHRvIHNlcnZlIHRoYXQgb3RoZXIgZmlsZSBpbnN0ZWFkIG9mIHRoZSBvbmUgdGhlCi0gKiBjbGllbnQgcmVxdWVzdGVkIGRpcmVjdGx5LgotICoKLSAqIFRoZXJlIGFyZSB0d28gd2F5cyB0byBkbyB0aGF0LiAgVGhlIGZpcnN0IGlzIHRoZSBzdWJfcmVxdWVzdCBtZWNoYW5pc20sCi0gKiB3aGljaCBoYW5kbGVzIGxvb2tpbmcgdXAgZmlsZXMgYW5kIFVSSXMgYXMgYWRqdW5jdHMgdG8gc29tZSBvdGhlcgotICogcmVxdWVzdCAoZS5nLiwgZGlyZWN0b3J5IGVudHJpZXMgZm9yIG11bHRpdmlld3MgYW5kIGRpcmVjdG9yeSBsaXN0aW5ncyk7Ci0gKiB0aGUgbG9va3VwIGZ1bmN0aW9ucyBzdG9wIHNob3J0IG9mIGFjdHVhbGx5IHJ1bm5pbmcgdGhlIHJlcXVlc3QsIGJ1dAotICogKGUuZy4sIGZvciBpbmNsdWRlcyksIGEgbW9kdWxlIG1heSBjYWxsIGZvciB0aGUgcmVxdWVzdCB0byBiZSBydW4KLSAqIGJ5IGNhbGxpbmcgcnVuX3N1Yl9yZXEuICBUaGUgc3BhY2UgYWxsb2NhdGVkIHRvIGNyZWF0ZSBzdWJfcmVxcyBjYW4gYmUKLSAqIHJlY2xhaW1lZCBieSBjYWxsaW5nIGRlc3Ryb3lfc3ViX3JlcSAtLS0gYmUgc3VyZSB0byBjb3B5IGFueXRoaW5nIHlvdSBjYXJlCi0gKiBhYm91dCB3aGljaCB3YXMgYWxsb2NhdGVkIGluIGl0cyBwb29sIGVsc2V3aGVyZSBiZWZvcmUgZG9pbmcgdGhpcy4KLSAqLwotCi1BUElfRVhQT1JUKHJlcXVlc3RfcmVjICopIGFwX3N1Yl9yZXFfbG9va3VwX3VyaShjb25zdCBjaGFyICpuZXdfZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlQocmVxdWVzdF9yZWMgKikgYXBfc3ViX3JlcV9sb29rdXBfZmlsZShjb25zdCBjaGFyICpuZXdfZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0X3JlYyAqcik7Ci1BUElfRVhQT1JUKHJlcXVlc3RfcmVjICopIGFwX3N1Yl9yZXFfbWV0aG9kX3VyaShjb25zdCBjaGFyICptZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuZXdfZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlQoaW50KSBhcF9ydW5fc3ViX3JlcShyZXF1ZXN0X3JlYyAqcik7Ci1BUElfRVhQT1JUKHZvaWQpIGFwX2Rlc3Ryb3lfc3ViX3JlcShyZXF1ZXN0X3JlYyAqcik7Ci0KLS8qCi0gKiBUaGVuIHRoZXJlJ3MgdGhlIGNhc2UgdGhhdCB5b3Ugd2FudCBzb21lIG90aGVyIHJlcXVlc3QgdG8gYmUgc2VydmVkCi0gKiBhcyB0aGUgdG9wLWxldmVsIHJlcXVlc3QgSU5TVEVBRCBvZiB3aGF0IHRoZSBjbGllbnQgcmVxdWVzdGVkIGRpcmVjdGx5LgotICogSWYgc28sIGNhbGwgdGhpcyBmcm9tIGEgaGFuZGxlciwgYW5kIHRoZW4gaW1tZWRpYXRlbHkgcmV0dXJuIE9LLgotICovCi0KLUFQSV9FWFBPUlQodm9pZCkgYXBfaW50ZXJuYWxfcmVkaXJlY3QoY29uc3QgY2hhciAqbmV3X3VyaSwgcmVxdWVzdF9yZWMgKik7Ci1BUElfRVhQT1JUKHZvaWQpIGFwX2ludGVybmFsX3JlZGlyZWN0X2hhbmRsZXIoY29uc3QgY2hhciAqbmV3X3VyaSwgcmVxdWVzdF9yZWMgKik7Ci1BUElfRVhQT1JUKGludCkgYXBfc29tZV9hdXRoX3JlcXVpcmVkKHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlQoaW50KSBhcF9pc19pbml0aWFsX3JlcShyZXF1ZXN0X3JlYyAqcik7Ci1BUElfRVhQT1JUKHRpbWVfdCkgYXBfdXBkYXRlX210aW1lKHJlcXVlc3RfcmVjICpyLCB0aW1lX3QgZGVwZW5kZW5jeV9tdGltZSk7Ci0KLSNpZmRlZiBDT1JFX1BSSVZBVEUKLS8qIEZ1bmN0aW9uIGNhbGxlZCBieSBtYWluLmMgdG8gaGFuZGxlIGZpcnN0LWxldmVsIHJlcXVlc3QgKi8KLXZvaWQgYXBfcHJvY2Vzc19yZXF1ZXN0KHJlcXVlc3RfcmVjICopOwotQVBJX0VYUE9SVCh2b2lkKSBhcF9kaWUoaW50IHR5cGUsIHJlcXVlc3RfcmVjICpyKTsKLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYJLyogIUFQQUNIRV9IVFRQX1JFUVVFU1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9odHRwX3Zob3N0LmggYi9pbmNsdWRlL2h0dHBfdmhvc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNkYjZlMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2h0dHBfdmhvc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotI2lmbmRlZiBBUEFDSEVfSFRUUF9WSE9TVF9ICi0jZGVmaW5lIEFQQUNIRV9IVFRQX1ZIT1NUX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiBjYWxsZWQgYmVmb3JlIGFueSBjb25maWcgaXMgcmVhZCAqLwotdm9pZCBhcF9pbml0X3Zob3N0X2NvbmZpZyhwb29sICpwKTsKLQotLyogY2FsbGVkIGFmdGVyIHRoZSBjb25maWcgaGFzIGJlZW4gcmVhZCAqLwotdm9pZCBhcF9maW5pX3Zob3N0X2NvbmZpZyhwb29sICpwLCBzZXJ2ZXJfcmVjICptYWluX3NlcnZlcik7Ci0KLS8qIGhhbmRsZSBhZGRyZXNzZXMgaW4gPFZpcnR1YWxIb3N0PiBzdGF0ZW1lbnQgKi8KLWNvbnN0IGNoYXIgKmFwX3BhcnNlX3Zob3N0X2FkZHJzKHBvb2wgKnAsIGNvbnN0IGNoYXIgKmhvc3RuYW1lLCBzZXJ2ZXJfcmVjICpzKTsKLQotLyogaGFuZGxlIE5hbWVWaXJ0dWFsSG9zdCBkaXJlY3RpdmUgKi8KLWNvbnN0IGNoYXIgKmFwX3NldF9uYW1lX3ZpcnR1YWxfaG9zdCAoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpOwotCi0vKiBnaXZlbiBhbiBpcCBhZGRyZXNzIG9ubHksIGdpdmUgb3VyIGJlc3QgZ3Vlc3MgYXMgdG8gd2hhdCB2aG9zdCBpdCBpcyAqLwotdm9pZCBhcF91cGRhdGVfdmhvc3RfZ2l2ZW5faXAoY29ubl9yZWMgKmNvbm4pOwotCi0vKiBUaGUgYWJvdmUgaXMgbmV2ZXIgZW5vdWdoLCBhbmQgdGhpcyBpcyBhbHdheXMgY2FsbGVkIGFmdGVyIHRoZSBoZWFkZXJzCi0gKiBoYXZlIGJlZW4gcmVhZC4gIEl0IG1heSBjaGFuZ2Ugci0+c2VydmVyLgotICovCi12b2lkIGFwX3VwZGF0ZV92aG9zdF9mcm9tX2hlYWRlcnMocmVxdWVzdF9yZWMgKnIpOwotCi0vKiByZXR1cm4gMSBpZiB0aGUgaG9zdDpwb3J0IG1hdGNoZXMgYW55IG9mIHRoZSBhbGlhc2VzIG9mIHItPnNlcnZlcgotICogcmV0dXJuIDAgb3RoZXJ3aXNlCi0gKi8KLUFQSV9FWFBPUlQoaW50KSBhcF9tYXRjaGVzX3JlcXVlc3Rfdmhvc3QocmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKmhvc3QsCi0gICAgdW5zaWduZWQgcG9ydCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgkvKiAhQVBBQ0hFX0hUVFBfVkhPU1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9odHRwZC5oIGIvaW5jbHVkZS9odHRwZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjE5ZDk5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaHR0cGQuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNjcgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaWZuZGVmIEFQQUNIRV9IVFRQRF9ICi0jZGVmaW5lIEFQQUNIRV9IVFRQRF9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoKLSAqIGh0dHBkLmg6IGhlYWRlciBmb3Igc2ltcGxlIChoYSEgbm90IGFueW1vcmUpIGh0dHAgZGFlbW9uCi0gKi8KLQotLyogSGVhZGVycyBpbiB3aGljaCBFVkVSWU9ORSBoYXMgYW4gaW50ZXJlc3QuLi4gKi8KLQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImFsbG9jLmgiCi0jaW5jbHVkZSAiYnVmZi5oIgotI2luY2x1ZGUgImFwLmgiCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbmZpZyBkaXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIERlZmluZSB0aGlzIHRvIGJlIHRoZSBkZWZhdWx0IHNlcnZlciBob21lIGRpci4gTW9zdCB0aGluZ3MgbGF0ZXIgaW4gdGhpcwotICogZmlsZSB3aXRoIGEgcmVsYXRpdmUgcGF0aG5hbWUgd2lsbCBoYXZlIHRoaXMgYWRkZWQuCi0gKi8KLSNpZm5kZWYgSFRUUERfUk9PVAotI2lmZGVmIE9TMgotLyogU2V0IGRlZmF1bHQgZm9yIE9TLzIgZmlsZSBzeXN0ZW0gKi8KLSNkZWZpbmUgSFRUUERfUk9PVCAiL29zMmh0dHBkIgotI2VsaWYgZGVmaW5lZChXSU4zMikKLS8qIFNldCBkZWZhdWx0IGZvciBXaW5kb3dzIGZpbGUgc3lzdGVtICovCi0jZGVmaW5lIEhUVFBEX1JPT1QgIi9hcGFjaGUiCi0jZWxpZiBkZWZpbmVkKEJFT1MpCi0jZGVmaW5lIEhUVFBEX1JPT1QgIi9ib290L2hvbWUvYXBhY2hlIgotI2Vsc2UKLSNkZWZpbmUgSFRUUERfUk9PVCAiL3Vzci9sb2NhbC9hcGFjaGUiCi0jZW5kaWYKLSNlbmRpZiAvKiBIVFRQRF9ST09UICovCi0KLS8qIERlZmF1bHQgbG9jYXRpb24gb2YgZG9jdW1lbnRzLiAgQ2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIERvY3VtZW50Um9vdAotICogZGlyZWN0aXZlLgotICovCi0jaWZuZGVmIERPQ1VNRU5UX0xPQ0FUSU9OCi0jaWZkZWYgT1MyCi0vKiBTZXQgZGVmYXVsdCBmb3IgT1MvMiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBET0NVTUVOVF9MT0NBVElPTiAgSFRUUERfUk9PVCAiL2RvY3MiCi0jZWxzZQotI2RlZmluZSBET0NVTUVOVF9MT0NBVElPTiAgSFRUUERfUk9PVCAiL2h0ZG9jcyIKLSNlbmRpZgotI2VuZGlmIC8qIERPQ1VNRU5UX0xPQ0FUSU9OICovCi0KLS8qIE1heC4gbnVtYmVyIG9mIGR5bmFtaWNhbGx5IGxvYWRlZCBtb2R1bGVzICovCi0jaWZuZGVmIERZTkFNSUNfTU9EVUxFX0xJTUlUCi0jZGVmaW5lIERZTkFNSUNfTU9EVUxFX0xJTUlUIDY0Ci0jZW5kaWYKLQotLyogRGVmYXVsdCBhZG1pbmlzdHJhdG9yJ3MgYWRkcmVzcyAqLwotI2RlZmluZSBERUZBVUxUX0FETUlOICJbbm8gYWRkcmVzcyBnaXZlbl0iCi0KLS8qIFRoZSB0YXJnZXQgbmFtZSBvZiB0aGUgaW5zdGFsbGVkIEFwYWNoZSAqLwotI2lmbmRlZiBUQVJHRVQKLSNkZWZpbmUgVEFSR0VUICJodHRwZCIKLSNlbmRpZgotCi0vKiAKLSAqIC0tLS0tLS0tLSBZb3Ugc2hvdWxkbid0IGhhdmUgdG8gZWRpdCBhbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgLS0tLS0tLS0tLQotICoKLSAqIEFueSBtb2RpZmljYXRpb25zIHRvIGFueSBkZWZhdWx0cyBub3QgZGVmaW5lZCBhYm92ZSBzaG91bGQgYmUgZG9uZSBpbiB0aGUgCi0gKiByZXNwZWN0aXZlIGNvbmZpZy4gZmlsZS4gCi0gKgotICovCi0KLQotLyogLS0gSW50ZXJuYWwgcmVwcmVzZW50YXRpb24gZm9yIGEgSFRUUCBwcm90b2NvbCBudW1iZXIsIGUuZy4sIEhUVFAvMS4xIC0tICovCi0KLSNkZWZpbmUgSFRUUF9WRVJTSU9OKG1ham9yLG1pbm9yKSAoMTAwMCoobWFqb3IpKyhtaW5vcikpCi0jZGVmaW5lIEhUVFBfVkVSU0lPTl9NQUpPUihudW1iZXIpICgobnVtYmVyKS8xMDAwKQotI2RlZmluZSBIVFRQX1ZFUlNJT05fTUlOT1IobnVtYmVyKSAoKG51bWJlciklMTAwMCkKLQotCi0vKiAtLS0tLS0tLS0tLS0tLSBQb3J0IG51bWJlciBmb3Igc2VydmVyIHJ1bm5pbmcgc3RhbmRhbG9uZSAtLS0tLS0tLS0tLS0tLS0gKi8KLQotI2RlZmluZSBERUZBVUxUX0hUVFBfUE9SVAk4MAotI2RlZmluZSBERUZBVUxUX0hUVFBTX1BPUlQJNDQzCi0jZGVmaW5lIGFwX2lzX2RlZmF1bHRfcG9ydChwb3J0LHIpCSgocG9ydCkgPT0gYXBfZGVmYXVsdF9wb3J0KHIpKQotI2RlZmluZSBhcF9odHRwX21ldGhvZChyKQkiaHR0cCIKLSNkZWZpbmUgYXBfZGVmYXVsdF9wb3J0KHIpCURFRkFVTFRfSFRUUF9QT1JUCi0KLS8qIC0tLS0tLS0tLSBEZWZhdWx0IHVzZXIgbmFtZSBhbmQgZ3JvdXAgbmFtZSBydW5uaW5nIHN0YW5kYWxvbmUgLS0tLS0tLS0tLSAqLwotLyogLS0tIFRoZXNlIG1heSBiZSBzcGVjaWZpZWQgYXMgbnVtYmVycyBieSBwbGFjaW5nIGEgIyBiZWZvcmUgYSBudW1iZXIgLS0tICovCi0KLSNpZm5kZWYgREVGQVVMVF9VU0VSCi0jZGVmaW5lIERFRkFVTFRfVVNFUiAiIy0xIgotI2VuZGlmCi0jaWZuZGVmIERFRkFVTFRfR1JPVVAKLSNkZWZpbmUgREVGQVVMVF9HUk9VUCAiIy0xIgotI2VuZGlmCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBsb2cgZmlsZXMgKi8KLSNpZm5kZWYgREVGQVVMVF9YRkVSTE9HCi0jaWYgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lOMzIpCi0jZGVmaW5lIERFRkFVTFRfWEZFUkxPRyAibG9ncy9hY2Nlc3MubG9nIgotI2Vsc2UKLSNkZWZpbmUgREVGQVVMVF9YRkVSTE9HICJsb2dzL2FjY2Vzc19sb2ciCi0jZW5kaWYKLSNlbmRpZiAvKiBERUZBVUxUX1hGRVJMT0cgKi8KLQotI2lmbmRlZiBERUZBVUxUX0VSUk9STE9HCi0jaWYgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lOMzIpCi0jZGVmaW5lIERFRkFVTFRfRVJST1JMT0cgImxvZ3MvZXJyb3IubG9nIgotI2Vsc2UKLSNkZWZpbmUgREVGQVVMVF9FUlJPUkxPRyAibG9ncy9lcnJvcl9sb2ciCi0jZW5kaWYKLSNlbmRpZiAvKiBERUZBVUxUX0VSUk9STE9HICovCi0KLSNpZm5kZWYgREVGQVVMVF9QSURMT0cKLSNkZWZpbmUgREVGQVVMVF9QSURMT0cgImxvZ3MvaHR0cGQucGlkIgotI2VuZGlmCi0jaWZuZGVmIERFRkFVTFRfU0NPUkVCT0FSRAotI2RlZmluZSBERUZBVUxUX1NDT1JFQk9BUkQgImxvZ3MvYXBhY2hlX3J1bnRpbWVfc3RhdHVzIgotI2VuZGlmCi0jaWZuZGVmIERFRkFVTFRfTE9DS0ZJTEUKLSNkZWZpbmUgREVGQVVMVF9MT0NLRklMRSAibG9ncy9hY2NlcHQubG9jayIKLSNlbmRpZgotCi0vKiBEZWZpbmUgdGhpcyB0byBiZSB3aGF0IHlvdXIgSFRNTCBkaXJlY3RvcnkgY29udGVudCBmaWxlcyBhcmUgY2FsbGVkICovCi0jaWZuZGVmIERFRkFVTFRfSU5ERVgKLSNkZWZpbmUgREVGQVVMVF9JTkRFWCAiaW5kZXguaHRtbCIKLSNlbmRpZgotCi0vKiBEZWZpbmUgdGhpcyB0byAxIGlmIHlvdSB3YW50IGZhbmN5IGluZGV4aW5nLCAwIG90aGVyd2lzZSAqLwotI2lmbmRlZiBERUZBVUxUX0lOREVYSU5HCi0jZGVmaW5lIERFRkFVTFRfSU5ERVhJTkcgMAotI2VuZGlmCi0KLS8qIERlZmluZSB0aGlzIHRvIGJlIHdoYXQgdHlwZSB5b3UnZCBsaWtlIHJldHVybmVkIGZvciBmaWxlcyB3aXRoIHVua25vd24gKi8KLS8qIHN1ZmZpeGVzLiAgTVVTVCBiZSBhbGwgbG93ZXIgY2FzZS4gKi8KLSNpZm5kZWYgREVGQVVMVF9DT05URU5UX1RZUEUKLSNkZWZpbmUgREVGQVVMVF9DT05URU5UX1RZUEUgInRleHQvcGxhaW4iCi0jZW5kaWYKLQotLyogRGVmaW5lIHRoaXMgdG8gYmUgd2hhdCB5b3VyIHBlci1kaXJlY3Rvcnkgc2VjdXJpdHkgZmlsZXMgYXJlIGNhbGxlZCAqLwotI2lmbmRlZiBERUZBVUxUX0FDQ0VTU19GTkFNRQotI2lmZGVmIE9TMgotLyogU2V0IGRlZmF1bHQgZm9yIE9TLzIgZmlsZSBzeXN0ZW0gKi8KLSNkZWZpbmUgREVGQVVMVF9BQ0NFU1NfRk5BTUUgImh0YWNjZXNzIgotI2Vsc2UKLSNkZWZpbmUgREVGQVVMVF9BQ0NFU1NfRk5BTUUgIi5odGFjY2VzcyIKLSNlbmRpZgotI2VuZGlmIC8qIERFRkFVTFRfQUNDRVNTX0ZOQU1FICovCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBzZXJ2ZXIgY29uZmlnIGZpbGUgKi8KLSNpZm5kZWYgU0VSVkVSX0NPTkZJR19GSUxFCi0jZGVmaW5lIFNFUlZFUl9DT05GSUdfRklMRSAiY29uZi9odHRwZC5jb25mIgotI2VuZGlmCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudCBjb25maWcgZmlsZSAqLwotI2lmbmRlZiBSRVNPVVJDRV9DT05GSUdfRklMRQotI2RlZmluZSBSRVNPVVJDRV9DT05GSUdfRklMRSAiY29uZi9zcm0uY29uZiIKLSNlbmRpZgotCi0vKiBUaGUgbmFtZSBvZiB0aGUgTUlNRSB0eXBlcyBmaWxlICovCi0jaWZuZGVmIFRZUEVTX0NPTkZJR19GSUxFCi0jZGVmaW5lIFRZUEVTX0NPTkZJR19GSUxFICJjb25mL21pbWUudHlwZXMiCi0jZW5kaWYKLQotLyogVGhlIG5hbWUgb2YgdGhlIGFjY2VzcyBmaWxlICovCi0jaWZuZGVmIEFDQ0VTU19DT05GSUdfRklMRQotI2RlZmluZSBBQ0NFU1NfQ09ORklHX0ZJTEUgImNvbmYvYWNjZXNzLmNvbmYiCi0jZW5kaWYKLQotLyogV2hldGhlciB3ZSBzaG91bGQgZW5hYmxlIHJmYzE0MTMgaWRlbnRpdHkgY2hlY2tpbmcgKi8KLSNpZm5kZWYgREVGQVVMVF9SRkMxNDEzCi0jZGVmaW5lIERFRkFVTFRfUkZDMTQxMyAwCi0jZW5kaWYKLS8qIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpbiB1c2VyJ3MgaG9tZSBkaXIgKi8KLSNpZm5kZWYgREVGQVVMVF9VU0VSX0RJUgotI2RlZmluZSBERUZBVUxUX1VTRVJfRElSICJwdWJsaWNfaHRtbCIKLSNlbmRpZgotCi0vKiBUaGUgZGVmYXVsdCBwYXRoIGZvciBDR0kgc2NyaXB0cyBpZiBub25lIGlzIGN1cnJlbnRseSBzZXQgKi8KLSNpZm5kZWYgREVGQVVMVF9QQVRICi0jZGVmaW5lIERFRkFVTFRfUEFUSCAiL2JpbjovdXNyL2JpbjovdXNyL3VjYjovdXNyL2JzZDovdXNyL2xvY2FsL2JpbiIKLSNlbmRpZgotCi0vKiBUaGUgcGF0aCB0byB0aGUgc2hlbGwgaW50ZXJwcmV0ZXIsIGZvciBwYXJzZWQgZG9jcyAqLwotI2lmbmRlZiBTSEVMTF9QQVRICi0jaWYgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lOMzIpCi0vKiBTZXQgZGVmYXVsdCBmb3IgT1MvMiBhbmQgV2luZG93cyBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBTSEVMTF9QQVRIICJDTUQuRVhFIgotI2Vsc2UKLSNkZWZpbmUgU0hFTExfUEFUSCAiL2Jpbi9zaCIKLSNlbmRpZgotI2VuZGlmIC8qIFNIRUxMX1BBVEggKi8KLQotLyogVGhlIHBhdGggdG8gdGhlIHN1RXhlYyB3cmFwcGVyLCBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBDb25maWd1cmF0aW9uICovCi0jaWZuZGVmIFNVRVhFQ19CSU4KLSNkZWZpbmUgU1VFWEVDX0JJTiAgSFRUUERfUk9PVCAiL3NiaW4vc3VleGVjIgotI2VuZGlmCi0KLS8qIFRoZSBkZWZhdWx0IHN0cmluZyBsZW5ndGhzICovCi0jZGVmaW5lIE1BWF9TVFJJTkdfTEVOIEhVR0VfU1RSSU5HX0xFTgotI2RlZmluZSBIVUdFX1NUUklOR19MRU4gODE5MgotCi0vKiBUaGUgdGltZW91dCBmb3Igd2FpdGluZyBmb3IgbWVzc2FnZXMgKi8KLSNpZm5kZWYgREVGQVVMVF9USU1FT1VUCi0jZGVmaW5lIERFRkFVTFRfVElNRU9VVCAzMDAKLSNlbmRpZgotCi0vKiBUaGUgdGltZW91dCBmb3Igd2FpdGluZyBmb3Iga2VlcGFsaXZlIHRpbWVvdXQgdW50aWwgbmV4dCByZXF1ZXN0ICovCi0jaWZuZGVmIERFRkFVTFRfS0VFUEFMSVZFX1RJTUVPVVQKLSNkZWZpbmUgREVGQVVMVF9LRUVQQUxJVkVfVElNRU9VVCAxNQotI2VuZGlmCi0KLS8qIFRoZSBudW1iZXIgb2YgcmVxdWVzdHMgdG8gZW50ZXJ0YWluIHBlciBjb25uZWN0aW9uICovCi0jaWZuZGVmIERFRkFVTFRfS0VFUEFMSVZFCi0jZGVmaW5lIERFRkFVTFRfS0VFUEFMSVZFIDEwMAotI2VuZGlmCi0KLS8qIFRoZSBzaXplIG9mIHRoZSBzZXJ2ZXIncyBpbnRlcm5hbCByZWFkLXdyaXRlIGJ1ZmZlcnMgKi8KLSNkZWZpbmUgSU9CVUZTSVpFIDgxOTIKLQotLyogTnVtYmVyIG9mIHNlcnZlcnMgdG8gc3Bhd24gb2ZmIGJ5IGRlZmF1bHQgLS0tIGFsc28sIGlmIGZld2VyIHRoYW4KLSAqIHRoaXMgZnJlZSB3aGVuIHRoZSBjYXJldGFrZXIgY2hlY2tzLCBpdCB3aWxsIHNwYXduIG1vcmUuCi0gKi8KLSNpZm5kZWYgREVGQVVMVF9TVEFSVF9EQUVNT04KLSNkZWZpbmUgREVGQVVMVF9TVEFSVF9EQUVNT04gNQotI2VuZGlmCi0KLS8qIE1heGltdW0gbnVtYmVyIG9mICpmcmVlKiBzZXJ2ZXIgcHJvY2Vzc2VzIC0tLSBtb3JlIHRoYW4gdGhpcywgYW5kCi0gKiB0aGV5IHdpbGwgZGllIG9mZi4KLSAqLwotCi0jaWZuZGVmIERFRkFVTFRfTUFYX0ZSRUVfREFFTU9OCi0jZGVmaW5lIERFRkFVTFRfTUFYX0ZSRUVfREFFTU9OIDEwCi0jZW5kaWYKLQotLyogTWluaW11bSAtLS0gZmV3ZXIgdGhhbiB0aGlzLCBhbmQgbW9yZSB3aWxsIGJlIGNyZWF0ZWQgKi8KLQotI2lmbmRlZiBERUZBVUxUX01JTl9GUkVFX0RBRU1PTgotI2RlZmluZSBERUZBVUxUX01JTl9GUkVFX0RBRU1PTiA1Ci0jZW5kaWYKLQotLyogTGltaXQgb24gdGhlIHRvdGFsIC0tLSBjbGllbnRzIHdpbGwgYmUgbG9ja2VkIG91dCBpZiBtb3JlIHNlcnZlcnMgdGhhbgotICogdGhpcyBhcmUgbmVlZGVkLiAgSXQgaXMgaW50ZW5kZWQgc29sZWx5IHRvIGtlZXAgdGhlIHNlcnZlciBmcm9tIGNyYXNoaW5nCi0gKiB3aGVuIHRoaW5ncyBnZXQgb3V0IG9mIGhhbmQuCi0gKgotICogV2Uga2VlcCBhIGhhcmQgbWF4aW11bSBudW1iZXIgb2Ygc2VydmVycywgZm9yIHR3byByZWFzb25zIC0tLSBmaXJzdCBvZmYsCi0gKiBpbiBjYXNlIHNvbWV0aGluZyBnb2VzIHNlcmlvdXNseSB3cm9uZywgd2Ugd2FudCB0byBzdG9wIHRoZSBmb3JrIGJvbWIKLSAqIHNob3J0IG9mIGFjdHVhbGx5IGNyYXNoaW5nIHRoZSBtYWNoaW5lIHdlJ3JlIHJ1bm5pbmcgb24gYnkgZmlsbGluZyBzb21lCi0gKiBrZXJuZWwgdGFibGUuICBTZWNvbmRseSwgaXQga2VlcHMgdGhlIHNpemUgb2YgdGhlIHNjb3JlYm9hcmQgZmlsZSBzbWFsbAotICogZW5vdWdoIHRoYXQgd2UgY2FuIHJlYWQgdGhlIHdob2xlIHRoaW5nIHdpdGhvdXQgd29ycnlpbmcgdG9vIG11Y2ggYWJvdXQKLSAqIHRoZSBvdmVyaGVhZC4KLSAqLwotI2lmbmRlZiBIQVJEX1NFUlZFUl9MSU1JVAotI2lmZGVmIFdJTjMyCi0jZGVmaW5lIEhBUkRfU0VSVkVSX0xJTUlUIDEwMjQKLSNlbHNlCi0jZGVmaW5lIEhBUkRfU0VSVkVSX0xJTUlUIDI1NgotI2VuZGlmCi0jZW5kaWYKLQotLyoKLSAqIFNwZWNpYWwgQXBhY2hlIGVycm9yIGNvZGVzLiBUaGVzZSBhcmUgYmFzaWNhbGx5IHVzZWQKLSAqICBpbiBodHRwX21haW4uYyBzbyB3ZSBjYW4ga2VlcCB0cmFjayBvZiB2YXJpb3VzIGVycm9ycy4KLSAqCi0gKiAgIEFQRVhJVF9PSzoKLSAqICAgICBBIG5vcm1hbCBleGl0Ci0gKiAgIEFQRVhJVF9JTklUOgotICogICAgIEEgZmF0YWwgZXJyb3IgYXJpc2luZyBkdXJpbmcgdGhlIHNlcnZlcidzIGluaXQgc2VxdWVuY2UKLSAqICAgQVBFWElUX0NISUxESU5JVDoKLSAqICAgICBUaGUgY2hpbGQgZGllZCBkdXJpbmcgaXQncyBpbml0IHNlcXVlbmNlCi0gKiAgIEFQRVhJVF9DSElMREZBVEFMOgotICogICAgIEEgZmF0YWwgZXJyb3IsIHJlc3VsdGluZyBpbiB0aGUgd2hvbGUgc2VydmVyIGFib3J0aW5nLgotICogICAgIElmIGEgY2hpbGQgZXhpdHMgd2l0aCB0aGlzIGVycm9yLCB0aGUgcGFyZW50IHByb2Nlc3MKLSAqICAgICBjb25zaWRlcnMgdGhpcyBhIHNlcnZlci13aWRlIGZhdGFsIGVycm9yIGFuZCBhYm9ydHMuCi0gKiAgICAgICAgICAgICAgICAgCi0gKi8KLSNkZWZpbmUgQVBFWElUX09LCQkweDAKLSNkZWZpbmUgQVBFWElUX0lOSVQJCTB4MgotI2RlZmluZSBBUEVYSVRfQ0hJTERJTklUCTB4MwotI2RlZmluZSBBUEVYSVRfQ0hJTERGQVRBTAkweGYKLQotLyoKLSAqIChVbml4LCBPUy8yIG9ubHkpCi0gKiBJbnRlcnZhbCwgaW4gbWljcm9zZWNvbmRzLCBiZXR3ZWVuIHNjb3JlYm9hcmQgbWFpbnRlbmFuY2UuICBEdXJpbmcKLSAqIGVhY2ggc2NvcmVib2FyZCBtYWludGVuYW5jZSBjeWNsZSB0aGUgcGFyZW50IGRlY2lkZXMgaWYgaXQgbmVlZHMgdG8KLSAqIHNwYXduIGEgbmV3IGNoaWxkICh0byBtZWV0IE1pblNwYXJlU2VydmVycyByZXF1aXJlbWVudHMpLCBvciBraWxsIG9mZgotICogYSBjaGlsZCAodG8gbWVldCBNYXhTcGFyZVNlcnZlcnMgcmVxdWlyZW1lbnRzKS4gIEl0IHdpbGwgb25seSBzcGF3biBvcgotICoga2lsbCBvbmUgY2hpbGQgcGVyIGN5Y2xlLiAgU2V0dGluZyB0aGlzIHRvbyBsb3cgd2lsbCBjaGV3IGNwdS4gIFRoZQotICogZGVmYXVsdCBpcyBwcm9iYWJseSBzdWZmaWNpZW50IGZvciBldmVyeW9uZS4gIEJ1dCBzb21lIHBlb3BsZSBtYXkgd2FudAotICogdG8gcmFpc2UgdGhpcyBvbiBzZXJ2ZXJzIHdoaWNoIGFyZW4ndCBkZWRpY2F0ZWQgdG8gaHR0cGQgYW5kIHdoZXJlIHRoZXkKLSAqIGRvbid0IGxpa2UgdGhlIGh0dHBkIHdha2luZyB1cCBlYWNoIHNlY29uZCB0byBzZWUgd2hhdCdzIGdvaW5nIG9uLgotICovCi0jaWZuZGVmIFNDT1JFQk9BUkRfTUFJTlRFTkFOQ0VfSU5URVJWQUwKLSNkZWZpbmUgU0NPUkVCT0FSRF9NQUlOVEVOQU5DRV9JTlRFUlZBTCAxMDAwMDAwCi0jZW5kaWYKLQotLyogTnVtYmVyIG9mIHJlcXVlc3RzIHRvIHRyeSB0byBoYW5kbGUgaW4gYSBzaW5nbGUgcHJvY2Vzcy4gIElmIDw9IDAsCi0gKiB0aGUgY2hpbGRyZW4gZG9uJ3QgZGllIG9mZi4gIFRoYXQncyB0aGUgZGVmYXVsdCBoZXJlLCBzaW5jZSBJJ20gc3RpbGwKLSAqIGludGVyZXN0ZWQgaW4gZmluZGluZyBhbmQgc3RhbmNoaW5nIGxlYWtzLgotICovCi0KLSNpZm5kZWYgREVGQVVMVF9NQVhfUkVRVUVTVFNfUEVSX0NISUxECi0jZGVmaW5lIERFRkFVTFRfTUFYX1JFUVVFU1RTX1BFUl9DSElMRCAwCi0jZW5kaWYKLQotI2lmbmRlZiBERUZBVUxUX1RIUkVBRFNfUEVSX0NISUxECi0jZGVmaW5lIERFRkFVTFRfVEhSRUFEU19QRVJfQ0hJTEQgNTAKLSNlbmRpZgotI2lmbmRlZiBERUZBVUxUX0VYQ0VTU19SRVFVRVNUU19QRVJfQ0hJTEQKLSNkZWZpbmUgREVGQVVMVF9FWENFU1NfUkVRVUVTVFNfUEVSX0NISUxEIDAKLSNlbmRpZgotCi0vKiBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHF1ZXVlIG9mIHBlbmRpbmcgY29ubmVjdGlvbnMsIGFzIGRlZmluZWQKLSAqIGJ5IGxpc3RlbigyKS4gIFVuZGVyIHNvbWUgc3lzdGVtcywgaXQgc2hvdWxkIGJlIGluY3JlYXNlZCBpZiB5b3UKLSAqIGFyZSBleHBlcmllbmNpbmcgYSBoZWF2eSBUQ1AgU1lOIGZsb29kIGF0dGFjay4KLSAqCi0gKiBJdCBkZWZhdWx0cyB0byA1MTEgaW5zdGVhZCBvZiA1MTIgYmVjYXVzZSBzb21lIHN5c3RlbXMgc3RvcmUgaXQgCi0gKiBhcyBhbiA4LWJpdCBkYXRhdHlwZTsgNTEyIHRydW5jYXRlZCB0byA4LWJpdHMgaXMgMCwgd2hpbGUgNTExIGlzIAotICogMjU1IHdoZW4gdHJ1bmNhdGVkLgotICovCi0KLSNpZm5kZWYgREVGQVVMVF9MSVNURU5CQUNLTE9HCi0jZGVmaW5lIERFRkFVTFRfTElTVEVOQkFDS0xPRyA1MTEKLSNlbmRpZgotCi0vKiBMaW1pdHMgb24gdGhlIHNpemUgb2YgdmFyaW91cyByZXF1ZXN0IGl0ZW1zLiAgVGhlc2UgbGltaXRzIHByaW1hcmlseQotICogZXhpc3QgdG8gcHJldmVudCBzaW1wbGUgZGVuaWFsLW9mLXNlcnZpY2UgYXR0YWNrcyBvbiBhIHNlcnZlciBiYXNlZAotICogb24gbWlzdXNlIG9mIHRoZSBwcm90b2NvbC4gIFRoZSByZWNvbW1lbmRlZCB2YWx1ZXMgd2lsbCBkZXBlbmQgb24gdGhlCi0gKiBuYXR1cmUgb2YgdGhlIHNlcnZlciByZXNvdXJjZXMgLS0gQ0dJIHNjcmlwdHMgYW5kIGRhdGFiYXNlIGJhY2tlbmRzCi0gKiBtaWdodCByZXF1aXJlIGxhcmdlIHZhbHVlcywgYnV0IG1vc3Qgc2VydmVycyBjb3VsZCBnZXQgYnkgd2l0aCBtdWNoCi0gKiBzbWFsbGVyIGxpbWl0cyB0aGFuIHdlIHVzZSBiZWxvdy4gIFRoZSByZXF1ZXN0IG1lc3NhZ2UgYm9keSBzaXplIGNhbgotICogYmUgbGltaXRlZCBieSB0aGUgcGVyLWRpciBjb25maWcgZGlyZWN0aXZlIExpbWl0UmVxdWVzdEJvZHkuCi0gKgotICogSW50ZXJuYWwgYnVmZmVyIHNpemVzIGFyZSB0d28gYnl0ZXMgbW9yZSB0aGFuIHRoZSBERUZBVUxUX0xJTUlUX1JFUVVFU1RfTElORQotICogYW5kIERFRkFVTFRfTElNSVRfUkVRVUVTVF9GSUVMRFNJWkUgYmVsb3csIHdoaWNoIGV4cGxhaW5zIHRoZSA4MTkwLgotICogVGhlc2UgdHdvIGxpbWl0cyBjYW4gYmUgbG93ZXJlZCAoYnV0IG5vdCByYWlzZWQpIGJ5IHRoZSBzZXJ2ZXIgY29uZmlnCi0gKiBkaXJlY3RpdmVzIExpbWl0UmVxdWVzdExpbmUgYW5kIExpbWl0UmVxdWVzdEZpZWxkc2l6ZSwgcmVzcGVjdGl2ZWx5LgotICoKLSAqIERFRkFVTFRfTElNSVRfUkVRVUVTVF9GSUVMRFMgY2FuIGJlIG1vZGlmaWVkIG9yIGRpc2FibGVkIChzZXQgPSAwKSBieQotICogdGhlIHNlcnZlciBjb25maWcgZGlyZWN0aXZlIExpbWl0UmVxdWVzdEZpZWxkcy4KLSAqLwotI2lmbmRlZiBERUZBVUxUX0xJTUlUX1JFUVVFU1RfTElORQotI2RlZmluZSBERUZBVUxUX0xJTUlUX1JFUVVFU1RfTElORSA4MTkwCi0jZW5kaWYgLyogZGVmYXVsdCBsaW1pdCBvbiBieXRlcyBpbiBSZXF1ZXN0LUxpbmUgKE1ldGhvZCtVUkkrSFRUUC12ZXJzaW9uKSAqLwotI2lmbmRlZiBERUZBVUxUX0xJTUlUX1JFUVVFU1RfRklFTERTSVpFCi0jZGVmaW5lIERFRkFVTFRfTElNSVRfUkVRVUVTVF9GSUVMRFNJWkUgODE5MAotI2VuZGlmIC8qIGRlZmF1bHQgbGltaXQgb24gYnl0ZXMgaW4gYW55IG9uZSBoZWFkZXIgZmllbGQgICovCi0jaWZuZGVmIERFRkFVTFRfTElNSVRfUkVRVUVTVF9GSUVMRFMKLSNkZWZpbmUgREVGQVVMVF9MSU1JVF9SRVFVRVNUX0ZJRUxEUyAxMDAKLSNlbmRpZiAvKiBkZWZhdWx0IGxpbWl0IG9uIG51bWJlciBvZiByZXF1ZXN0IGhlYWRlciBmaWVsZHMgKi8KLQotLyoKLSAqIFRoZSBiZWxvdyBkZWZpbmVzIHRoZSBiYXNlIHN0cmluZyBvZiB0aGUgU2VydmVyOiBoZWFkZXIuIEFkZGl0aW9uYWwKLSAqIHRva2VucyBjYW4gYmUgYWRkZWQgdmlhIHRoZSBhcF9hZGRfdmVyc2lvbl9jb21wb25lbnQoKSBBUEkgY2FsbC4KLSAqCi0gKiBUaGUgdG9rZW5zIGFyZSBsaXN0ZWQgaW4gb3JkZXIgb2YgdGhlaXIgc2lnbmlmaWNhbmNlIGZvciBpZGVudGlmeWluZyB0aGUKLSAqIGFwcGxpY2F0aW9uLgotICoKLSAqICJQcm9kdWN0IHRva2VucyBzaG91bGQgYmUgc2hvcnQgYW5kIHRvIHRoZSBwb2ludCAtLSB1c2Ugb2YgdGhlbSBmb3IgCi0gKiBhZHZlcnRpemluZyBvciBvdGhlciBub24tZXNzZW50aWFsIGluZm9ybWF0aW9uIGlzIGV4cGxpY2l0bHkgZm9yYmlkZGVuLiIKLSAqCi0gKiBFeGFtcGxlOiAiQXBhY2hlLzEuMS4wIE1yV2lkZ2V0LzAuMS1hbHBoYSIgCi0gKi8KLQotI2RlZmluZSBTRVJWRVJfQkFTRVZFUlNJT04gIkFwYWNoZS8xLjMuOSIJLyogU0VFIENPTU1FTlRTIEFCT1ZFICovCi0jZGVmaW5lIFNFUlZFUl9WRVJTSU9OICBTRVJWRVJfQkFTRVZFUlNJT04KLWVudW0gc2VydmVyX3Rva2VuX3R5cGUgewotICAgIFNydlRrX01JTiwJCS8qIGVnOiBBcGFjaGUvMS4zLjAgKi8KLSAgICBTcnZUa19PUywJCS8qIGVnOiBBcGFjaGUvMS4zLjAgKFVOSVgpICovCi0gICAgU3J2VGtfRlVMTAkJLyogZWc6IEFwYWNoZS8xLjMuMCAoVU5JWCkgUEhQLzMuMCBGb29CYXIvMS4yYiAqLwotfTsKLQotQVBJX0VYUE9SVChjb25zdCBjaGFyICopIGFwX2dldF9zZXJ2ZXJfdmVyc2lvbih2b2lkKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfYWRkX3ZlcnNpb25fY29tcG9uZW50KGNvbnN0IGNoYXIgKmNvbXBvbmVudCk7Ci1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfZ2V0X3NlcnZlcl9idWlsdCh2b2lkKTsKLQotLyogTnVtZXJpYyByZWxlYXNlIHZlcnNpb24gaWRlbnRpZmllcjogTU1OTkZGUkJCOiBtYWpvciBtaW5vciBmaXggZmluYWwgYmV0YQotICogQWx3YXlzIGluY3JlYXNlcyBhbG9uZyB0aGUgc2FtZSB0cmFjayBhcyB0aGUgc291cmNlIGJyYW5jaC4KLSAqIEZvciBleGFtcGxlLCBBcGFjaGUgMS40LjIgd291bGQgYmUgJzEwNDAyMTAwJywgMi41Yjcgd291bGQgYmUgJzIwNTAwMDA3Jy4KLSAqLwotI2RlZmluZSBBUEFDSEVfUkVMRUFTRSAxMDMwOTEwMAotCi0jZGVmaW5lIFNFUlZFUl9QUk9UT0NPTCAiSFRUUC8xLjEiCi0jaWZuZGVmIFNFUlZFUl9TVVBQT1JUCi0jZGVmaW5lIFNFUlZFUl9TVVBQT1JUICJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIgotI2VuZGlmCi0KLSNkZWZpbmUgREVDTElORUQgLTEJCS8qIE1vZHVsZSBkZWNsaW5lcyB0byBoYW5kbGUgKi8KLSNkZWZpbmUgRE9ORSAtMgkJCS8qIE1vZHVsZSBoYXMgc2VydmVkIHRoZSByZXNwb25zZSBjb21wbGV0ZWx5IAotCQkJCSAqICAtIGl0J3Mgc2FmZSB0byBkaWUoKSB3aXRoIG5vIG1vcmUgb3V0cHV0Ci0JCQkJICovCi0jZGVmaW5lIE9LIDAJCQkvKiBNb2R1bGUgaGFzIGhhbmRsZWQgdGhpcyBzdGFnZS4gKi8KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIVFRQIFN0YXR1cyBDb2RlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBUaGUgc2l6ZSBvZiB0aGUgc3RhdGljIGFycmF5IGluIGh0dHBfcHJvdG9jb2wuYyBmb3Igc3RvcmluZwotICogYWxsIG9mIHRoZSBwb3RlbnRpYWwgcmVzcG9uc2Ugc3RhdHVzLWxpbmVzIChhIHNwYXJzZSB0YWJsZSkuCi0gKiBBIGZ1dHVyZSB2ZXJzaW9uIHNob3VsZCBkeW5hbWljYWxseSBnZW5lcmF0ZSB0aGUgdGFibGUgYXQgc3RhcnR1cC4KLSAqLwotI2RlZmluZSBSRVNQT05TRV9DT0RFUyA1NQotCi0jZGVmaW5lIEhUVFBfQ09OVElOVUUgICAgICAgICAgICAgICAgICAgICAgMTAwCi0jZGVmaW5lIEhUVFBfU1dJVENISU5HX1BST1RPQ09MUyAgICAgICAgICAgMTAxCi0jZGVmaW5lIEhUVFBfUFJPQ0VTU0lORyAgICAgICAgICAgICAgICAgICAgMTAyCi0jZGVmaW5lIEhUVFBfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwCi0jZGVmaW5lIEhUVFBfQ1JFQVRFRCAgICAgICAgICAgICAgICAgICAgICAgMjAxCi0jZGVmaW5lIEhUVFBfQUNDRVBURUQgICAgICAgICAgICAgICAgICAgICAgMjAyCi0jZGVmaW5lIEhUVFBfTk9OX0FVVEhPUklUQVRJVkUgICAgICAgICAgICAgMjAzCi0jZGVmaW5lIEhUVFBfTk9fQ09OVEVOVCAgICAgICAgICAgICAgICAgICAgMjA0Ci0jZGVmaW5lIEhUVFBfUkVTRVRfQ09OVEVOVCAgICAgICAgICAgICAgICAgMjA1Ci0jZGVmaW5lIEhUVFBfUEFSVElBTF9DT05URU5UICAgICAgICAgICAgICAgMjA2Ci0jZGVmaW5lIEhUVFBfTVVMVElfU1RBVFVTICAgICAgICAgICAgICAgICAgMjA3Ci0jZGVmaW5lIEhUVFBfTVVMVElQTEVfQ0hPSUNFUyAgICAgICAgICAgICAgMzAwCi0jZGVmaW5lIEhUVFBfTU9WRURfUEVSTUFORU5UTFkgICAgICAgICAgICAgMzAxCi0jZGVmaW5lIEhUVFBfTU9WRURfVEVNUE9SQVJJTFkgICAgICAgICAgICAgMzAyCi0jZGVmaW5lIEhUVFBfU0VFX09USEVSICAgICAgICAgICAgICAgICAgICAgMzAzCi0jZGVmaW5lIEhUVFBfTk9UX01PRElGSUVEICAgICAgICAgICAgICAgICAgMzA0Ci0jZGVmaW5lIEhUVFBfVVNFX1BST1hZICAgICAgICAgICAgICAgICAgICAgMzA1Ci0jZGVmaW5lIEhUVFBfVEVNUE9SQVJZX1JFRElSRUNUICAgICAgICAgICAgMzA3Ci0jZGVmaW5lIEhUVFBfQkFEX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgNDAwCi0jZGVmaW5lIEhUVFBfVU5BVVRIT1JJWkVEICAgICAgICAgICAgICAgICAgNDAxCi0jZGVmaW5lIEhUVFBfUEFZTUVOVF9SRVFVSVJFRCAgICAgICAgICAgICAgNDAyCi0jZGVmaW5lIEhUVFBfRk9SQklEREVOICAgICAgICAgICAgICAgICAgICAgNDAzCi0jZGVmaW5lIEhUVFBfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAgNDA0Ci0jZGVmaW5lIEhUVFBfTUVUSE9EX05PVF9BTExPV0VEICAgICAgICAgICAgNDA1Ci0jZGVmaW5lIEhUVFBfTk9UX0FDQ0VQVEFCTEUgICAgICAgICAgICAgICAgNDA2Ci0jZGVmaW5lIEhUVFBfUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQgNDA3Ci0jZGVmaW5lIEhUVFBfUkVRVUVTVF9USU1FX09VVCAgICAgICAgICAgICAgNDA4Ci0jZGVmaW5lIEhUVFBfQ09ORkxJQ1QgICAgICAgICAgICAgICAgICAgICAgNDA5Ci0jZGVmaW5lIEhUVFBfR09ORSAgICAgICAgICAgICAgICAgICAgICAgICAgNDEwCi0jZGVmaW5lIEhUVFBfTEVOR1RIX1JFUVVJUkVEICAgICAgICAgICAgICAgNDExCi0jZGVmaW5lIEhUVFBfUFJFQ09ORElUSU9OX0ZBSUxFRCAgICAgICAgICAgNDEyCi0jZGVmaW5lIEhUVFBfUkVRVUVTVF9FTlRJVFlfVE9PX0xBUkdFICAgICAgNDEzCi0jZGVmaW5lIEhUVFBfUkVRVUVTVF9VUklfVE9PX0xBUkdFICAgICAgICAgNDE0Ci0jZGVmaW5lIEhUVFBfVU5TVVBQT1JURURfTUVESUFfVFlQRSAgICAgICAgNDE1Ci0jZGVmaW5lIEhUVFBfUkFOR0VfTk9UX1NBVElTRklBQkxFICAgICAgICAgNDE2Ci0jZGVmaW5lIEhUVFBfRVhQRUNUQVRJT05fRkFJTEVEICAgICAgICAgICAgNDE3Ci0jZGVmaW5lIEhUVFBfVU5QUk9DRVNTQUJMRV9FTlRJVFkgICAgICAgICAgNDIyCi0jZGVmaW5lIEhUVFBfTE9DS0VEICAgICAgICAgICAgICAgICAgICAgICAgNDIzCi0jZGVmaW5lIEhUVFBfRkFJTEVEX0RFUEVOREVOQ1kgICAgICAgICAgICAgNDI0Ci0jZGVmaW5lIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SICAgICAgICAgNTAwCi0jZGVmaW5lIEhUVFBfTk9UX0lNUExFTUVOVEVEICAgICAgICAgICAgICAgNTAxCi0jZGVmaW5lIEhUVFBfQkFEX0dBVEVXQVkgICAgICAgICAgICAgICAgICAgNTAyCi0jZGVmaW5lIEhUVFBfU0VSVklDRV9VTkFWQUlMQUJMRSAgICAgICAgICAgNTAzCi0jZGVmaW5lIEhUVFBfR0FURVdBWV9USU1FX09VVCAgICAgICAgICAgICAgNTA0Ci0jZGVmaW5lIEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEICAgICAgICAgNTA1Ci0jZGVmaW5lIEhUVFBfVkFSSUFOVF9BTFNPX1ZBUklFUyAgICAgICAgICAgNTA2Ci0jZGVmaW5lIEhUVFBfSU5TVUZGSUNJRU5UX1NUT1JBR0UgICAgICAgICAgNTA3Ci0jZGVmaW5lIEhUVFBfTk9UX0VYVEVOREVEICAgICAgICAgICAgICAgICAgNTEwCi0KLSNkZWZpbmUgRE9DVU1FTlRfRk9MTE9XUyAgICBIVFRQX09LCi0jZGVmaW5lIFBBUlRJQUxfQ09OVEVOVCAgICAgSFRUUF9QQVJUSUFMX0NPTlRFTlQKLSNkZWZpbmUgTVVMVElQTEVfQ0hPSUNFUyAgICBIVFRQX01VTFRJUExFX0NIT0lDRVMKLSNkZWZpbmUgTU9WRUQgICAgICAgICAgICAgICBIVFRQX01PVkVEX1BFUk1BTkVOVExZCi0jZGVmaW5lIFJFRElSRUNUICAgICAgICAgICAgSFRUUF9NT1ZFRF9URU1QT1JBUklMWQotI2RlZmluZSBVU0VfTE9DQUxfQ09QWSAgICAgIEhUVFBfTk9UX01PRElGSUVECi0jZGVmaW5lIEJBRF9SRVFVRVNUICAgICAgICAgSFRUUF9CQURfUkVRVUVTVAotI2RlZmluZSBBVVRIX1JFUVVJUkVEICAgICAgIEhUVFBfVU5BVVRIT1JJWkVECi0jZGVmaW5lIEZPUkJJRERFTiAgICAgICAgICAgSFRUUF9GT1JCSURERU4KLSNkZWZpbmUgTk9UX0ZPVU5EICAgICAgICAgICBIVFRQX05PVF9GT1VORAotI2RlZmluZSBNRVRIT0RfTk9UX0FMTE9XRUQgIEhUVFBfTUVUSE9EX05PVF9BTExPV0VECi0jZGVmaW5lIE5PVF9BQ0NFUFRBQkxFICAgICAgSFRUUF9OT1RfQUNDRVBUQUJMRQotI2RlZmluZSBMRU5HVEhfUkVRVUlSRUQgICAgIEhUVFBfTEVOR1RIX1JFUVVJUkVECi0jZGVmaW5lIFBSRUNPTkRJVElPTl9GQUlMRUQgSFRUUF9QUkVDT05ESVRJT05fRkFJTEVECi0jZGVmaW5lIFNFUlZFUl9FUlJPUiAgICAgICAgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IKLSNkZWZpbmUgTk9UX0lNUExFTUVOVEVEICAgICBIVFRQX05PVF9JTVBMRU1FTlRFRAotI2RlZmluZSBCQURfR0FURVdBWSAgICAgICAgIEhUVFBfQkFEX0dBVEVXQVkKLSNkZWZpbmUgVkFSSUFOVF9BTFNPX1ZBUklFUyBIVFRQX1ZBUklBTlRfQUxTT19WQVJJRVMKLQotI2RlZmluZSBhcF9pc19IVFRQX0lORk8oeCkgICAgICAgICAoKCh4KSA+PSAxMDApJiYoKHgpIDwgMjAwKSkKLSNkZWZpbmUgYXBfaXNfSFRUUF9TVUNDRVNTKHgpICAgICAgKCgoeCkgPj0gMjAwKSYmKCh4KSA8IDMwMCkpCi0jZGVmaW5lIGFwX2lzX0hUVFBfUkVESVJFQ1QoeCkgICAgICgoKHgpID49IDMwMCkmJigoeCkgPCA0MDApKQotI2RlZmluZSBhcF9pc19IVFRQX0VSUk9SKHgpICAgICAgICAoKCh4KSA+PSA0MDApJiYoKHgpIDwgNjAwKSkKLSNkZWZpbmUgYXBfaXNfSFRUUF9DTElFTlRfRVJST1IoeCkgKCgoeCkgPj0gNDAwKSYmKCh4KSA8IDUwMCkpCi0jZGVmaW5lIGFwX2lzX0hUVFBfU0VSVkVSX0VSUk9SKHgpICgoKHgpID49IDUwMCkmJigoeCkgPCA2MDApKQotCi0jZGVmaW5lIGFwX3N0YXR1c19kcm9wc19jb25uZWN0aW9uKHgpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPT0gSFRUUF9CQURfUkVRVUVTVCkgICAgICAgICAgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoeCkgPT0gSFRUUF9SRVFVRVNUX1RJTUVfT1VUKSAgICAgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoeCkgPT0gSFRUUF9MRU5HVEhfUkVRVUlSRUQpICAgICAgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoeCkgPT0gSFRUUF9SRVFVRVNUX0VOVElUWV9UT09fTEFSR0UpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoeCkgPT0gSFRUUF9SRVFVRVNUX1VSSV9UT09fTEFSR0UpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoeCkgPT0gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoeCkgPT0gSFRUUF9TRVJWSUNFX1VOQVZBSUxBQkxFKSB8fCBcCi0JCQkJICAgICgoeCkgPT0gSFRUUF9OT1RfSU1QTEVNRU5URUQpKQotCi0vKiBNZXRob2RzIHJlY29nbml6ZWQgKGJ1dCBub3QgbmVjZXNzYXJpbHkgaGFuZGxlZCkgYnkgdGhlIHNlcnZlci4KLSAqIFRoZXNlIGNvbnN0YW50cyBhcmUgdXNlZCBpbiBiaXQgc2hpZnRpbmcgbWFza3Mgb2Ygc2l6ZSBpbnQsIHNvIGl0IGlzCi0gKiB1bnNhZmUgdG8gaGF2ZSBtb3JlIG1ldGhvZHMgdGhhbiBiaXRzIGluIGFuIGludC4gIEhFQUQgPT0gTV9HRVQuCi0gKi8KLSNkZWZpbmUgTV9HRVQgICAgICAgIDAKLSNkZWZpbmUgTV9QVVQgICAgICAgIDEKLSNkZWZpbmUgTV9QT1NUICAgICAgIDIKLSNkZWZpbmUgTV9ERUxFVEUgICAgIDMKLSNkZWZpbmUgTV9DT05ORUNUICAgIDQKLSNkZWZpbmUgTV9PUFRJT05TICAgIDUKLSNkZWZpbmUgTV9UUkFDRSAgICAgIDYKLSNkZWZpbmUgTV9QQVRDSCAgICAgIDcKLSNkZWZpbmUgTV9QUk9QRklORCAgIDgKLSNkZWZpbmUgTV9QUk9QUEFUQ0ggIDkKLSNkZWZpbmUgTV9NS0NPTCAgICAgMTAKLSNkZWZpbmUgTV9DT1BZICAgICAgMTEKLSNkZWZpbmUgTV9NT1ZFICAgICAgMTIKLSNkZWZpbmUgTV9MT0NLICAgICAgMTMKLSNkZWZpbmUgTV9VTkxPQ0sgICAgMTQKLSNkZWZpbmUgTV9JTlZBTElEICAgMTUKLQotI2RlZmluZSBNRVRIT0RTICAgICAxNgotCi0jZGVmaW5lIENHSV9NQUdJQ19UWVBFICJhcHBsaWNhdGlvbi94LWh0dHBkLWNnaSIKLSNkZWZpbmUgSU5DTFVERVNfTUFHSUNfVFlQRSAidGV4dC94LXNlcnZlci1wYXJzZWQtaHRtbCIKLSNkZWZpbmUgSU5DTFVERVNfTUFHSUNfVFlQRTMgInRleHQveC1zZXJ2ZXItcGFyc2VkLWh0bWwzIgotI2lmZGVmIENIQVJTRVRfRUJDRElDCi0jZGVmaW5lIEFTQ0lJVEVYVF9NQUdJQ19UWVBFX1BSRUZJWCAidGV4dC94LWFzY2lpLSIgLyogVGV4dCBmaWxlcyB3aG9zZSBjb250ZW50LXR5cGUgc3RhcnRzIHdpdGggdGhpcyBhcmUgcGFzc2VkIHRocnUgdW5jb252ZXJ0ZWQgKi8KLSNlbmRpZiAvKkNIQVJTRVRfRUJDRElDKi8KLSNkZWZpbmUgTUFQX0ZJTEVfTUFHSUNfVFlQRSAiYXBwbGljYXRpb24veC10eXBlLW1hcCIKLSNkZWZpbmUgQVNJU19NQUdJQ19UWVBFICJodHRwZC9zZW5kLWFzLWlzIgotI2RlZmluZSBESVJfTUFHSUNfVFlQRSAiaHR0cGQvdW5peC1kaXJlY3RvcnkiCi0jZGVmaW5lIFNUQVRVU19NQUdJQ19UWVBFICJhcHBsaWNhdGlvbi94LWh0dHBkLXN0YXR1cyIKLQotLyoKLSAqIERlZmluZSB0aGUgSFRNTCBkb2N0eXBlIHN0cmluZ3MgY2VudHJhbGx5LgotICovCi0jZGVmaW5lIERPQ1RZUEVfSFRNTF8yXzAgICI8IURPQ1RZUEUgSFRNTCBQVUJMSUMgXCItLy9JRVRGLy8iIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkRURCBIVE1MIDIuMC8vRU5cIj5cbiIKLSNkZWZpbmUgRE9DVFlQRV9IVE1MXzNfMiAgIjwhRE9DVFlQRSBIVE1MIFBVQkxJQyBcIi0vL1czQy8vIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJEVEQgSFRNTCAzLjIgRmluYWwvL0VOXCI+XG4iCi0jZGVmaW5lIERPQ1RZUEVfSFRNTF80XzBTICI8IURPQ1RZUEUgSFRNTCBQVUJMSUMgXCItLy9XM0MvLyIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAiRFREIEhUTUwgNC4wLy9FTlwiXG4iIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9zdHJpY3QuZHRkXCI+XG4iCi0jZGVmaW5lIERPQ1RZUEVfSFRNTF80XzBUICI8IURPQ1RZUEUgSFRNTCBQVUJMSUMgXCItLy9XM0MvLyIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAiRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU5cIlxuIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJcImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvbG9vc2UuZHRkXCI+XG4iCi0jZGVmaW5lIERPQ1RZUEVfSFRNTF80XzBGICI8IURPQ1RZUEUgSFRNTCBQVUJMSUMgXCItLy9XM0MvLyIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAiRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTlwiXG4iIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9mcmFtZXNldC5kdGRcIj5cbiIKLQotLyogSnVzdCBpbiBjYXNlIHlvdXIgbGluZWZlZWQgaXNuJ3QgdGhlIG9uZSB0aGUgb3RoZXIgZW5kIGlzIGV4cGVjdGluZy4gKi8KLSNpZm5kZWYgQ0hBUlNFVF9FQkNESUMKLSNkZWZpbmUgTEYgMTAKLSNkZWZpbmUgQ1IgMTMKLSNlbHNlIC8qIENIQVJTRVRfRUJDRElDICovCi0jaW5jbHVkZSAiZWJjZGljLmgiCi0vKiBPU0RfUE9TSVggdXNlcyB0aGUgRUJDRElDIGNoYXJzZXQuIFRoZSB0cmFuc2l0aW9uIEFTQ0lJLT5FQkNESUMgaXMgZG9uZSBpbgotICogdGhlIGJ1ZmYgcGFja2FnZSAoYnJlYWQvYnB1dHMvYndyaXRlKSwgc28gZXZlcnl3aGVyZSBlbHNlLCB3ZSB1c2UKLSAqICJuYXRpdmUgRUJDRElDIiBDUiBhbmQgTkwgY2hhcmFjdGVycy4gVGhlc2UgYXJlIHRoZXJlZm9yZSBkZWZpbmVkIGFzCi0gKiAnXHInIGFuZCAnXG4nLgotICogTkI6IHRoaXMgaXMgbm90IHRoZSB3aG9sZSB0cnV0aCAtIHNvbWV0aW1lcyBcMDE1IGFuZCBcMDEyIGFyZSBjb250YWluZWQKLSAqIGluIGxpdGVyYWwgKEVCQ0RJQyEpIHN0cmluZ3MsIHNvIHRoZXNlIGFyZSBub3QgY29udmVydGVkIGJ1dCBwYXNzZWQuCi0gKi8KLSNkZWZpbmUgQ1IgJ1xyJwotI2RlZmluZSBMRiAnXG4nCi0jZW5kaWYgLyogQ0hBUlNFVF9FQkNESUMgKi8KLQotLyogUG9zc2libGUgdmFsdWVzIGZvciByZXF1ZXN0X3JlYy5yZWFkX2JvZHkgKHNldCBieSBoYW5kbGluZyBtb2R1bGUpOgotICogICAgUkVRVUVTVF9OT19CT0RZICAgICAgICAgIFNlbmQgNDEzIGVycm9yIGlmIG1lc3NhZ2UgaGFzIGFueSBib2R5Ci0gKiAgICBSRVFVRVNUX0NIVU5LRURfRVJST1IgICAgU2VuZCA0MTEgZXJyb3IgaWYgYm9keSB3aXRob3V0IENvbnRlbnQtTGVuZ3RoCi0gKiAgICBSRVFVRVNUX0NIVU5LRURfREVDSFVOSyAgSWYgY2h1bmtlZCwgcmVtb3ZlIHRoZSBjaHVua3MgZm9yIG1lLgotICogICAgUkVRVUVTVF9DSFVOS0VEX1BBU1MgICAgIFBhc3MgdGhlIGNodW5rcyB0byBtZSB3aXRob3V0IHJlbW92YWwuCi0gKi8KLSNkZWZpbmUgUkVRVUVTVF9OT19CT0RZICAgICAgICAgIDAKLSNkZWZpbmUgUkVRVUVTVF9DSFVOS0VEX0VSUk9SICAgIDEKLSNkZWZpbmUgUkVRVUVTVF9DSFVOS0VEX0RFQ0hVTksgIDIKLSNkZWZpbmUgUkVRVUVTVF9DSFVOS0VEX1BBU1MgICAgIDMKLQotLyogVGhpbmdzIHdoaWNoIG1heSB2YXJ5IHBlciBmaWxlLWxvb2t1cCBXSVRISU4gYSByZXF1ZXN0IC0tLQotICogZS5nLiwgc3RhdGUgb2YgTUlNRSBjb25maWcuICBCYXNpY2FsbHksIHRoZSBuYW1lIG9mIGFuIG9iamVjdCwgaW5mbwotICogYWJvdXQgdGhlIG9iamVjdCwgYW5kIGFueSBvdGhlciBpbmZvIHdlIG1heSBhaHZlIHdoaWNoIG1heSBuZWVkIHRvCi0gKiBjaGFuZ2UgYXMgd2UgZ28gcG9raW5nIGFyb3VuZCBsb29raW5nIGZvciBpdCAoZS5nLiwgb3ZlcnJpZGRlbiBieQotICogLmh0YWNjZXNzIGZpbGVzKS4KLSAqCi0gKiBOb3RlIGhvdyB0aGUgZGVmYXVsdCBzdGF0ZSBvZiBhbG1vc3QgYWxsIHRoZXNlIHRoaW5ncyBpcyBwcm9wZXJseQotICogemVybywgc28gdGhhdCBhbGxvY2F0aW5nIGl0IHdpdGggcGNhbGxvYyBkb2VzIHRoZSByaWdodCB0aGluZyB3aXRob3V0Ci0gKiBhIHdob2xlIGxvdCBvZiBoYWlyeSBpbml0aWFsaXphdGlvbi4uLiBzbyBsb25nIGFzIHdlIGFyZSB3aWxsaW5nIHRvCi0gKiBtYWtlIHRoZSAoZmFpcmx5KSBwb3J0YWJsZSBhc3N1bXB0aW9uIHRoYXQgdGhlIGJpdCBwYXR0ZXJuIG9mIGEgTlVMTAotICogcG9pbnRlciBpcywgaW4gZmFjdCwgemVyby4KLSAqLwotCi0vKiBUaGlzIHJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGh0YWNjZXNzOyB0aGVzZSBhcmUgY2FjaGVkIGZvcgotICogZWFjaCByZXF1ZXN0LgotICovCi1zdHJ1Y3QgaHRhY2Nlc3NfcmVzdWx0IHsKLSAgICBjaGFyICpkaXI7CQkJLyogdGhlIGRpcmVjdG9yeSB0byB3aGljaCB0aGlzIGFwcGxpZXMgKi8KLSAgICBpbnQgb3ZlcnJpZGU7CQkvKiB0aGUgb3ZlcnJpZGVzIGFsbG93ZWQgZm9yIHRoZSAuaHRhY2Nlc3MgZmlsZSAqLwotICAgIHZvaWQgKmh0YWNjZXNzOwkJLyogdGhlIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcyAqLwotLyogdGhlIG5leHQgb25lLCBvciBOVUxMIGlmIG5vIG1vcmU7IE4uQi4gbmV2ZXIgY2hhbmdlIHRoaXMgKi8KLSAgICBjb25zdCBzdHJ1Y3QgaHRhY2Nlc3NfcmVzdWx0ICpuZXh0OwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgY29ubl9yZWMgY29ubl9yZWM7Ci10eXBlZGVmIHN0cnVjdCBzZXJ2ZXJfcmVjIHNlcnZlcl9yZWM7Ci10eXBlZGVmIHN0cnVjdCByZXF1ZXN0X3JlYyByZXF1ZXN0X3JlYzsKLXR5cGVkZWYgc3RydWN0IGxpc3Rlbl9yZWMgbGlzdGVuX3JlYzsKLQotI2luY2x1ZGUgInV0aWxfdXJpLmgiCi0KLXN0cnVjdCByZXF1ZXN0X3JlYyB7Ci0KLSAgICBhcF9wb29sICpwb29sOwotICAgIGNvbm5fcmVjICpjb25uZWN0aW9uOwotICAgIHNlcnZlcl9yZWMgKnNlcnZlcjsKLQotICAgIHJlcXVlc3RfcmVjICpuZXh0OwkJLyogSWYgd2Ugd2luZCB1cCBnZXR0aW5nIHJlZGlyZWN0ZWQsCi0JCQkJICogcG9pbnRlciB0byB0aGUgcmVxdWVzdCB3ZSByZWRpcmVjdGVkIHRvLgotCQkJCSAqLwotICAgIHJlcXVlc3RfcmVjICpwcmV2OwkJLyogSWYgdGhpcyBpcyBhbiBpbnRlcm5hbCByZWRpcmVjdCwKLQkJCQkgKiBwb2ludGVyIHRvIHdoZXJlIHdlIHJlZGlyZWN0ZWQgKmZyb20qLgotCQkJCSAqLwotCi0gICAgcmVxdWVzdF9yZWMgKm1haW47CQkvKiBJZiB0aGlzIGlzIGEgc3ViX3JlcXVlc3QgKHNlZSByZXF1ZXN0LmgpIAotCQkJCSAqIHBvaW50ZXIgYmFjayB0byB0aGUgbWFpbiByZXF1ZXN0LgotCQkJCSAqLwotCi0gICAgLyogSW5mbyBhYm91dCB0aGUgcmVxdWVzdCBpdHNlbGYuLi4gd2UgYmVnaW4gd2l0aCBzdHVmZiB0aGF0IG9ubHkKLSAgICAgKiBwcm90b2NvbC5jIHNob3VsZCBldmVyIHRvdWNoLi4uCi0gICAgICovCi0KLSAgICBjaGFyICp0aGVfcmVxdWVzdDsJCS8qIEZpcnN0IGxpbmUgb2YgcmVxdWVzdCwgc28gd2UgY2FuIGxvZyBpdCAqLwotICAgIGludCBhc3NiYWNrd2FyZHM7CQkvKiBIVFRQLzAuOSwgInNpbXBsZSIgcmVxdWVzdCAqLwotICAgIGludCBwcm94eXJlcTsJCS8qIEEgcHJveHkgcmVxdWVzdCAoY2FsY3VsYXRlZCBkdXJpbmcKLQkJCQkgKiBwb3N0X3JlYWRfcmVxdWVzdCBvciB0cmFuc2xhdGVfbmFtZSkgKi8KLSAgICBpbnQgaGVhZGVyX29ubHk7CQkvKiBIRUFEIHJlcXVlc3QsIGFzIG9wcG9zZWQgdG8gR0VUICovCi0gICAgY2hhciAqcHJvdG9jb2w7CQkvKiBQcm90b2NvbCwgYXMgZ2l2ZW4gdG8gdXMsIG9yIEhUVFAvMC45ICovCi0gICAgaW50IHByb3RvX251bTsJCS8qIE51bWJlciB2ZXJzaW9uIG9mIHByb3RvY29sOyAxLjEgPSAxMDAxICovCi0gICAgY29uc3QgY2hhciAqaG9zdG5hbWU7CS8qIEhvc3QsIGFzIHNldCBieSBmdWxsIFVSSSBvciBIb3N0OiAqLwotCi0gICAgdGltZV90IHJlcXVlc3RfdGltZTsJLyogV2hlbiB0aGUgcmVxdWVzdCBzdGFydGVkICovCi0KLSAgICBjb25zdCBjaGFyICpzdGF0dXNfbGluZTsJLyogU3RhdHVzIGxpbmUsIGlmIHNldCBieSBzY3JpcHQgKi8KLSAgICBpbnQgc3RhdHVzOwkJCS8qIEluIGFueSBjYXNlICovCi0KLSAgICAvKiBSZXF1ZXN0IG1ldGhvZCwgdHdvIHdheXM7IGFsc28sIHByb3RvY29sLCBldGMuLiAgT3V0c2lkZSBvZiBwcm90b2NvbC5jLAotICAgICAqIGxvb2ssIGJ1dCBkb24ndCB0b3VjaC4KLSAgICAgKi8KLQotICAgIGNvbnN0IGNoYXIgKm1ldGhvZDsJCS8qIEdFVCwgSEVBRCwgUE9TVCwgZXRjLiAqLwotICAgIGludCBtZXRob2RfbnVtYmVyOwkJLyogTV9HRVQsIE1fUE9TVCwgZXRjLiAqLwotCi0gICAgLyoKLQlhbGxvd2VkIGlzIGEgYml0dmVjdG9yIG9mIHRoZSBhbGxvd2VkIG1ldGhvZHMuCi0KLQlBIGhhbmRsZXIgbXVzdCBlbnN1cmUgdGhhdCB0aGUgcmVxdWVzdCBtZXRob2QgaXMgb25lIHRoYXQKLQlpdCBpcyBjYXBhYmxlIG9mIGhhbmRsaW5nLiAgR2VuZXJhbGx5IG1vZHVsZXMgc2hvdWxkIERFQ0xJTkUKLQlhbnkgcmVxdWVzdCBtZXRob2RzIHRoZXkgZG8gbm90IGhhbmRsZS4gIFByaW9yIHRvIGFib3J0aW5nIHRoZQotCWhhbmRsZXIgbGlrZSB0aGlzIHRoZSBoYW5kbGVyIHNob3VsZCBzZXQgci0+YWxsb3dlZCB0byB0aGUgbGlzdAotCW9mIG1ldGhvZHMgdGhhdCBpdCBpcyB3aWxsaW5nIHRvIGhhbmRsZS4gIFRoaXMgYml0dmVjdG9yIGlzIHVzZWQKLQl0byBjb25zdHJ1Y3QgdGhlICJBbGxvdzoiIGhlYWRlciByZXF1aXJlZCBmb3IgT1BUSU9OUyByZXF1ZXN0cywKLQlhbmQgTUVUSE9EX05PVF9BTExPV0VEIGFuZCBOT1RfSU1QTEVNRU5URUQgc3RhdHVzIGNvZGVzLgotCi0JU2luY2UgdGhlIGRlZmF1bHRfaGFuZGxlciBkZWFscyB3aXRoIE9QVElPTlMsIGFsbCBtb2R1bGVzIGNhbgotCXVzdWFsbHkgZGVjbGluZSB0byBkZWFsIHdpdGggT1BUSU9OUy4gIFRSQUNFIGlzIGFsd2F5cyBhbGxvd2VkLAotCW1vZHVsZXMgZG9uJ3QgbmVlZCB0byBzZXQgaXQgZXhwbGljaXRseS4KLQotCVNpbmNlIHRoZSBkZWZhdWx0X2hhbmRsZXIgd2lsbCBhbHdheXMgaGFuZGxlIGEgR0VULCBhCi0JbW9kdWxlIHdoaWNoIGRvZXMgKm5vdCogaW1wbGVtZW50IEdFVCBzaG91bGQgcHJvYmFibHkgcmV0dXJuCi0JTUVUSE9EX05PVF9BTExPV0VELiAgVW5mb3J0dW5hdGVseSB0aGlzIG1lYW5zIHRoYXQgYSBTY3JpcHQgR0VUCi0JaGFuZGxlciBjYW4ndCBiZSBpbnN0YWxsZWQgYnkgbW9kX2FjdGlvbnMuCi0gICAgKi8KLSAgICBpbnQgYWxsb3dlZDsJCS8qIEFsbG93ZWQgbWV0aG9kcyAtIGZvciA0MDUsIE9QVElPTlMsIGV0YyAqLwotCi0gICAgaW50IHNlbnRfYm9keWN0OwkJLyogYnl0ZSBjb3VudCBpbiBzdHJlYW0gaXMgZm9yIGJvZHkgKi8KLSAgICBsb25nIGJ5dGVzX3NlbnQ7CQkvKiBib2R5IGJ5dGUgY291bnQsIGZvciBlYXN5IGFjY2VzcyAqLwotICAgIHRpbWVfdCBtdGltZTsJCS8qIFRpbWUgdGhlIHJlc291cmNlIHdhcyBsYXN0IG1vZGlmaWVkICovCi0KLSAgICAvKiBIVFRQLzEuMSBjb25uZWN0aW9uLWxldmVsIGZlYXR1cmVzICovCi0KLSAgICBpbnQgY2h1bmtlZDsJCS8qIHNlbmRpbmcgY2h1bmtlZCB0cmFuc2Zlci1jb2RpbmcgKi8KLSAgICBpbnQgYnl0ZXJhbmdlOwkJLyogbnVtYmVyIG9mIGJ5dGUgcmFuZ2VzICovCi0gICAgY2hhciAqYm91bmRhcnk7CQkvKiBtdWx0aXBhcnQvYnl0ZXJhbmdlcyBib3VuZGFyeSAqLwotICAgIGNvbnN0IGNoYXIgKnJhbmdlOwkJLyogVGhlIFJhbmdlOiBoZWFkZXIgKi8KLSAgICBsb25nIGNsZW5ndGg7CQkvKiBUaGUgInJlYWwiIGNvbnRlbnQgbGVuZ3RoICovCi0KLSAgICBsb25nIHJlbWFpbmluZzsJCS8qIGJ5dGVzIGxlZnQgdG8gcmVhZCAqLwotICAgIGxvbmcgcmVhZF9sZW5ndGg7CQkvKiBieXRlcyB0aGF0IGhhdmUgYmVlbiByZWFkICovCi0gICAgaW50IHJlYWRfYm9keTsJCS8qIGhvdyB0aGUgcmVxdWVzdCBib2R5IHNob3VsZCBiZSByZWFkICovCi0gICAgaW50IHJlYWRfY2h1bmtlZDsJCS8qIHJlYWRpbmcgY2h1bmtlZCB0cmFuc2Zlci1jb2RpbmcgKi8KLSAgICB1bnNpZ25lZCBleHBlY3RpbmdfMTAwOwkvKiBpcyBjbGllbnQgd2FpdGluZyBmb3IgYSAxMDAgcmVzcG9uc2U/ICovCi0KLSAgICAvKiBNSU1FIGhlYWRlciBlbnZpcm9ubWVudHMsIGluIGFuZCBvdXQuICBBbHNvLCBhbiBhcnJheSBjb250YWluaW5nCi0gICAgICogZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGJlIHBhc3NlZCB0byBzdWJwcm9jZXNzZXMsIHNvIHBlb3BsZSBjYW4KLSAgICAgKiB3cml0ZSBtb2R1bGVzIHRvIGFkZCB0byB0aGF0IGVudmlyb25tZW50LgotICAgICAqCi0gICAgICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBoZWFkZXJzX291dCBhbmQgZXJyX2hlYWRlcnNfb3V0IGlzIHRoYXQgdGhlCi0gICAgICogbGF0dGVyIGFyZSBwcmludGVkIGV2ZW4gb24gZXJyb3IsIGFuZCBwZXJzaXN0IGFjcm9zcyBpbnRlcm5hbCByZWRpcmVjdHMKLSAgICAgKiAoc28gdGhlIGhlYWRlcnMgcHJpbnRlZCBmb3IgRXJyb3JEb2N1bWVudCBoYW5kbGVycyB3aWxsIGhhdmUgdGhlbSkuCi0gICAgICoKLSAgICAgKiBUaGUgJ25vdGVzJyB0YWJsZSBpcyBmb3Igbm90ZXMgZnJvbSBvbmUgbW9kdWxlIHRvIGFub3RoZXIsIHdpdGggbm8KLSAgICAgKiBvdGhlciBzZXQgcHVycG9zZSBpbiBtaW5kLi4uCi0gICAgICovCi0KLSAgICB0YWJsZSAqaGVhZGVyc19pbjsKLSAgICB0YWJsZSAqaGVhZGVyc19vdXQ7Ci0gICAgdGFibGUgKmVycl9oZWFkZXJzX291dDsKLSAgICB0YWJsZSAqc3VicHJvY2Vzc19lbnY7Ci0gICAgdGFibGUgKm5vdGVzOwotCi0gICAgLyogY29udGVudF90eXBlLCBoYW5kbGVyLCBjb250ZW50X2VuY29kaW5nLCBjb250ZW50X2xhbmd1YWdlLCBhbmQgYWxsCi0gICAgICogY29udGVudF9sYW5ndWFnZXMgTVVTVCBiZSBsb3dlcmNhc2VkIHN0cmluZ3MuICBUaGV5IG1heSBiZSBwb2ludGVycwotICAgICAqIHRvIHN0YXRpYyBzdHJpbmdzOyB0aGV5IHNob3VsZCBub3QgYmUgbW9kaWZpZWQgaW4gcGxhY2UuCi0gICAgICovCi0gICAgY29uc3QgY2hhciAqY29udGVudF90eXBlOwkvKiBCcmVhayB0aGVzZSBvdXQgLS0tIHdlIGRpc3BhdGNoIG9uICdlbSAqLwotICAgIGNvbnN0IGNoYXIgKmhhbmRsZXI7CS8qIFdoYXQgd2UgKnJlYWxseSogZGlzcGF0Y2ggb24gICAgICAgICAgICovCi0KLSAgICBjb25zdCBjaGFyICpjb250ZW50X2VuY29kaW5nOwotICAgIGNvbnN0IGNoYXIgKmNvbnRlbnRfbGFuZ3VhZ2U7CS8qIGZvciBiYWNrLWNvbXBhdC4gb25seSAtLSBkbyBub3QgdXNlICovCi0gICAgYXJyYXlfaGVhZGVyICpjb250ZW50X2xhbmd1YWdlczsJLyogYXJyYXkgb2YgKGNoYXIqKSAqLwotCi0gICAgY2hhciAqdmxpc3RfdmFsaWRhdG9yOyAgICAgIC8qIHZhcmlhbnQgbGlzdCB2YWxpZGF0b3IgKGlmIG5lZ290aWF0ZWQpICovCi0KLSAgICBpbnQgbm9fY2FjaGU7Ci0gICAgaW50IG5vX2xvY2FsX2NvcHk7Ci0KLSAgICAvKiBXaGF0IG9iamVjdCBpcyBiZWluZyByZXF1ZXN0ZWQgKGVpdGhlciBkaXJlY3RseSwgb3IgdmlhIGluY2x1ZGUKLSAgICAgKiBvciBjb250ZW50LW5lZ290aWF0aW9uIG1hcHBpbmcpLgotICAgICAqLwotCi0gICAgY2hhciAqdW5wYXJzZWRfdXJpOwkJLyogdGhlIHVyaSB3aXRob3V0IGFueSBwYXJzaW5nIHBlcmZvcm1lZCAqLwotICAgIGNoYXIgKnVyaTsJCQkvKiB0aGUgcGF0aCBwb3J0aW9uIG9mIHRoZSBVUkkgKi8KLSAgICBjaGFyICpmaWxlbmFtZTsKLSAgICBjaGFyICpwYXRoX2luZm87Ci0gICAgY2hhciAqYXJnczsJCQkvKiBRVUVSWV9BUkdTLCBpZiBhbnkgKi8KLSAgICBzdHJ1Y3Qgc3RhdCBmaW5mbzsJCS8qIFNUX01PREUgc2V0IHRvIHplcm8gaWYgbm8gc3VjaCBmaWxlICovCi0gICAgdXJpX2NvbXBvbmVudHMgcGFyc2VkX3VyaTsJLyogY29tcG9uZW50cyBvZiB1cmksIGRpc21hbnRsZWQgKi8KLQotICAgIC8qIFZhcmlvdXMgb3RoZXIgY29uZmlnIGluZm8gd2hpY2ggbWF5IGNoYW5nZSB3aXRoIC5odGFjY2VzcyBmaWxlcwotICAgICAqIFRoZXNlIGFyZSBjb25maWcgdmVjdG9ycywgd2l0aCBvbmUgdm9pZCogcG9pbnRlciBmb3IgZWFjaCBtb2R1bGUKLSAgICAgKiAodGhlIHRoaW5nIHBvaW50ZWQgdG8gYmVpbmcgdGhlIG1vZHVsZSdzIGJ1c2luZXNzKS4KLSAgICAgKi8KLQotICAgIHZvaWQgKnBlcl9kaXJfY29uZmlnOwkvKiBPcHRpb25zIHNldCBpbiBjb25maWcgZmlsZXMsIGV0Yy4gKi8KLSAgICB2b2lkICpyZXF1ZXN0X2NvbmZpZzsJLyogTm90ZXMgb24gKnRoaXMqIHJlcXVlc3QgKi8KLQotLyoKLSAqIGEgbGlua2VkIGxpc3Qgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcyBpbiB0aGUgLmh0YWNjZXNzIGZpbGVzCi0gKiBhY2Nlc3NlZCBieSB0aGlzIHJlcXVlc3QuCi0gKiBOLkIuIGFsd2F5cyBhZGQgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QsIF9uZXZlcl8gdG8gdGhlIGVuZC4KLSAqIHRoYXQgd2F5LCBhIHN1YiByZXF1ZXN0J3MgbGlzdCBjYW4gKHRlbXBvcmFyaWx5KSBwb2ludCB0byBhIHBhcmVudCdzIGxpc3QKLSAqLwotICAgIGNvbnN0IHN0cnVjdCBodGFjY2Vzc19yZXN1bHQgKmh0YWNjZXNzOwotCi0vKiBUaGluZ3MgcGxhY2VkIGF0IHRoZSBlbmQgb2YgdGhlIHJlY29yZCB0byBhdm9pZCBicmVha2luZyBiaW5hcnkKLSAqIGNvbXBhdGliaWxpdHkuICBJdCB3b3VsZCBiZSBuaWNlIHRvIHJlbWVtYmVyIHRvIHJlb3JkZXIgdGhlIGVudGlyZQotICogcmVjb3JkIHRvIGltcHJvdmUgNjRiaXQgYWxpZ25tZW50IHRoZSBuZXh0IHRpbWUgd2UgbmVlZCB0byBicmVhawotICogYmluYXJ5IGNvbXBhdGliaWxpdHkgZm9yIHNvbWUgb3RoZXIgcmVhc29uLgotICovCi19OwotCi0KLS8qIFRoaW5ncyB3aGljaCBhcmUgcGVyIGNvbm5lY3Rpb24KLSAqLwotCi1zdHJ1Y3QgY29ubl9yZWMgewotCi0gICAgYXBfcG9vbCAqcG9vbDsKLSAgICBzZXJ2ZXJfcmVjICpzZXJ2ZXI7Ci0gICAgc2VydmVyX3JlYyAqYmFzZV9zZXJ2ZXI7CS8qIFBoeXNpY2FsIHZob3N0IHRoaXMgY29ubiBjb21lIGluIG9uICovCi0gICAgdm9pZCAqdmhvc3RfbG9va3VwX2RhdGE7CS8qIHVzZWQgYnkgaHR0cF92aG9zdC5jICovCi0KLSAgICAvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29ubmVjdGlvbiBpdHNlbGYgKi8KLQotICAgIGludCBjaGlsZF9udW07CQkvKiBUaGUgbnVtYmVyIG9mIHRoZSBjaGlsZCBoYW5kbGluZyBjb25uX3JlYyAqLwotICAgIEJVRkYgKmNsaWVudDsJCS8qIENvbm5lY3Rpb24gdG8gdGhlIGd1eSAqLwotCi0gICAgLyogV2hvIGlzIHRoZSBjbGllbnQ/ICovCi0KLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbG9jYWxfYWRkcjsJLyogbG9jYWwgYWRkcmVzcyAqLwotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVfYWRkcjsJLyogcmVtb3RlIGFkZHJlc3MgKi8KLSAgICBjaGFyICpyZW1vdGVfaXA7CQkvKiBDbGllbnQncyBJUCBhZGRyZXNzICovCi0gICAgY2hhciAqcmVtb3RlX2hvc3Q7CQkvKiBDbGllbnQncyBETlMgbmFtZSwgaWYga25vd24uCi0JCQkJICogTlVMTCBpZiBETlMgaGFzbid0IGJlZW4gY2hlY2tlZCwKLQkJCQkgKiAiIiBpZiBpdCBoYXMgYW5kIG5vIGFkZHJlc3Mgd2FzIGZvdW5kLgotCQkJCSAqIE4uQi4gT25seSBhY2Nlc3MgdGhpcyB0aG91Z2gKLQkJCQkgKiBnZXRfcmVtb3RlX2hvc3QoKSAqLwotICAgIGNoYXIgKnJlbW90ZV9sb2duYW1lOwkvKiBPbmx5IGV2ZXIgc2V0IGlmIGRvaW5nIHJmYzE0MTMgbG9va3Vwcy4KLQkJCQkgKiBOLkIuIE9ubHkgYWNjZXNzIHRoaXMgdGhyb3VnaAotCQkJCSAqIGdldF9yZW1vdGVfbG9nbmFtZSgpICovCi0gICAgY2hhciAqdXNlcjsJCQkvKiBJZiBhbiBhdXRoZW50aWNhdGlvbiBjaGVjayB3YXMgbWFkZSwKLQkJCQkgKiB0aGlzIGdldHMgc2V0IHRvIHRoZSB1c2VyIG5hbWUuICBXZSBhc3N1bWUKLQkJCQkgKiB0aGF0IHRoZXJlJ3Mgb25seSBvbmUgdXNlciBwZXIgY29ubmVjdGlvbighKQotCQkJCSAqLwotICAgIGNoYXIgKmFwX2F1dGhfdHlwZTsJCS8qIERpdHRvLiAqLwotCi0gICAgdW5zaWduZWQgYWJvcnRlZDoxOwkJLyogQXJlIHdlIHN0aWxsIHRhbGtpbmc/ICovCi0gICAgc2lnbmVkIGludCBrZWVwYWxpdmU6MjsJLyogQXJlIHdlIHVzaW5nIEhUVFAgS2VlcC1BbGl2ZT8KLQkJCQkgKiAtMSBmYXRhbCBlcnJvciwgMCB1bmRlY2lkZWQsIDEgeWVzICovCi0gICAgdW5zaWduZWQga2VwdGFsaXZlOjE7CS8qIERpZCB3ZSB1c2UgSFRUUCBLZWVwLUFsaXZlPyAqLwotICAgIHNpZ25lZCBpbnQgZG91YmxlX3JldmVyc2U6MjsvKiBoYXZlIHdlIGRvbmUgZG91YmxlLXJldmVyc2UgRE5TPwotCQkJCSAqIC0xIHllcy9mYWlsdXJlLCAwIG5vdCB5ZXQsIDEgeWVzL3N1Y2Nlc3MgKi8KLSAgICBpbnQga2VlcGFsaXZlczsJCS8qIEhvdyBtYW55IHRpbWVzIGhhdmUgd2UgdXNlZCBpdD8gKi8KLSAgICBjaGFyICpsb2NhbF9pcDsJCS8qIHNlcnZlciBJUCBhZGRyZXNzICovCi0gICAgY2hhciAqbG9jYWxfaG9zdDsJCS8qIHVzZWQgZm9yIGFwX2dldF9zZXJ2ZXJfbmFtZSB3aGVuCi0JCQkJICogVXNlQ2Fub25pY2FsTmFtZSBpcyBzZXQgdG8gRE5TCi0JCQkJICogKGlnbm9yZXMgc2V0dGluZyBvZiBIb3N0bmFtZUxvb2t1cHMpICovCi19OwotCi0vKiBQZXItdmhvc3QgY29uZmlnLi4uICovCi0KLS8qIFRoZSBhZGRyZXNzIDI1NS4yNTUuMjU1LjI1NSwgd2hlbiB1c2VkIGFzIGEgdmlydHVhbGhvc3QgYWRkcmVzcywKLSAqIHdpbGwgYmVjb21lIHRoZSAiZGVmYXVsdCIgc2VydmVyIHdoZW4gdGhlIGlwIGRvZXNuJ3QgbWF0Y2ggb3RoZXIgdmhvc3RzLgotICovCi0jZGVmaW5lIERFRkFVTFRfVkhPU1RfQUREUiAweGZmZmZmZmZmdWwKLQotdHlwZWRlZiBzdHJ1Y3Qgc2VydmVyX2FkZHJfcmVjIHNlcnZlcl9hZGRyX3JlYzsKLXN0cnVjdCBzZXJ2ZXJfYWRkcl9yZWMgewotICAgIHNlcnZlcl9hZGRyX3JlYyAqbmV4dDsKLSAgICBzdHJ1Y3QgaW5fYWRkciBob3N0X2FkZHI7CS8qIFRoZSBib3VuZCBhZGRyZXNzLCBmb3IgdGhpcyBzZXJ2ZXIgKi8KLSAgICB1bnNpZ25lZCBzaG9ydCBob3N0X3BvcnQ7CS8qIFRoZSBib3VuZCBwb3J0LCBmb3IgdGhpcyBzZXJ2ZXIgKi8KLSAgICBjaGFyICp2aXJ0aG9zdDsJCS8qIFRoZSBuYW1lIGdpdmVuIGluIDxWaXJ0dWFsSG9zdD4gKi8KLX07Ci0KLXN0cnVjdCBzZXJ2ZXJfcmVjIHsKLQotICAgIHNlcnZlcl9yZWMgKm5leHQ7Ci0KLSAgICAvKiBkZXNjcmlwdGlvbiBvZiB3aGVyZSB0aGUgZGVmaW5pdGlvbiBjYW1lIGZyb20gKi8KLSAgICBjb25zdCBjaGFyICpkZWZuX25hbWU7Ci0gICAgdW5zaWduZWQgZGVmbl9saW5lX251bWJlcjsKLQotICAgIC8qIEZ1bGwgbG9jYXRpb25zIG9mIHNlcnZlciBjb25maWcgaW5mbyAqLwotCi0gICAgY2hhciAqc3JtX2NvbmZuYW1lOwotICAgIGNoYXIgKmFjY2Vzc19jb25mbmFtZTsKLQotICAgIC8qIENvbnRhY3QgaW5mb3JtYXRpb24gKi8KLQotICAgIGNoYXIgKnNlcnZlcl9hZG1pbjsKLSAgICBjaGFyICpzZXJ2ZXJfaG9zdG5hbWU7Ci0gICAgdW5zaWduZWQgc2hvcnQgcG9ydDsJLyogZm9yIHJlZGlyZWN0cywgZXRjLiAqLwotCi0gICAgLyogTG9nIGZpbGVzIC0tLSBub3RlIHRoYXQgdHJhbnNmZXIgbG9nIGlzIG5vdyBpbiB0aGUgbW9kdWxlcy4uLiAqLwotCi0gICAgY2hhciAqZXJyb3JfZm5hbWU7Ci0gICAgRklMRSAqZXJyb3JfbG9nOwotICAgIGludCBsb2dsZXZlbDsKLQotICAgIC8qIE1vZHVsZS1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGZvciBzZXJ2ZXIsIGFuZCBkZWZhdWx0cy4uLiAqLwotCi0gICAgaW50IGlzX3ZpcnR1YWw7CQkvKiB0cnVlIGlmIHRoaXMgaXMgdGhlIHZpcnR1YWwgc2VydmVyICovCi0gICAgdm9pZCAqbW9kdWxlX2NvbmZpZzsJLyogQ29uZmlnIHZlY3RvciBjb250YWluaW5nIHBvaW50ZXJzIHRvCi0JCQkJICogbW9kdWxlcycgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlcy4KLQkJCQkgKi8KLSAgICB2b2lkICpsb29rdXBfZGVmYXVsdHM7CS8qIE1JTUUgdHlwZSBpbmZvLCBldGMuLCBiZWZvcmUgd2Ugc3RhcnQKLQkJCQkgKiBjaGVja2luZyBwZXItZGlyZWN0b3J5IGluZm8uCi0JCQkJICovCi0gICAgLyogVHJhbnNhY3Rpb24gaGFuZGxpbmcgKi8KLQotICAgIHNlcnZlcl9hZGRyX3JlYyAqYWRkcnM7Ci0gICAgaW50IHRpbWVvdXQ7CQkvKiBUaW1lb3V0LCBpbiBzZWNvbmRzLCBiZWZvcmUgd2UgZ2l2ZSB1cCAqLwotICAgIGludCBrZWVwX2FsaXZlX3RpbWVvdXQ7CS8qIFNlY29uZHMgd2UnbGwgd2FpdCBmb3IgYW5vdGhlciByZXF1ZXN0ICovCi0gICAgaW50IGtlZXBfYWxpdmVfbWF4OwkJLyogTWF4aW11bSByZXF1ZXN0cyBwZXIgY29ubmVjdGlvbiAqLwotICAgIGludCBrZWVwX2FsaXZlOwkJLyogVXNlIHBlcnNpc3RlbnQgY29ubmVjdGlvbnM/ICovCi0gICAgaW50IHNlbmRfYnVmZmVyX3NpemU7CS8qIHNpemUgb2YgVENQIHNlbmQgYnVmZmVyIChpbiBieXRlcykgKi8KLQotICAgIGNoYXIgKnBhdGg7CQkJLyogUGF0aG5hbWUgZm9yIFNlcnZlclBhdGggKi8KLSAgICBpbnQgcGF0aGxlbjsJCS8qIExlbmd0aCBvZiBwYXRoICovCi0KLSAgICBhcnJheV9oZWFkZXIgKm5hbWVzOwkvKiBOb3JtYWwgbmFtZXMgZm9yIFNlcnZlckFsaWFzIHNlcnZlcnMgKi8KLSAgICBhcnJheV9oZWFkZXIgKndpbGRfbmFtZXM7CS8qIFdpbGRjYXJkZWQgbmFtZXMgZm9yIFNlcnZlckFsaWFzIHNlcnZlcnMgKi8KLQotICAgIHVpZF90IHNlcnZlcl91aWQ7ICAgICAgICAvKiBlZmZlY3RpdmUgdXNlciBpZCB3aGVuIGNhbGxpbmcgZXhlYyB3cmFwcGVyICovCi0gICAgZ2lkX3Qgc2VydmVyX2dpZDsgICAgICAgIC8qIGVmZmVjdGl2ZSBncm91cCBpZCB3aGVuIGNhbGxpbmcgZXhlYyB3cmFwcGVyICovCi0KLSAgICBpbnQgbGltaXRfcmVxX2xpbmU7ICAgICAgLyogbGltaXQgb24gc2l6ZSBvZiB0aGUgSFRUUCByZXF1ZXN0IGxpbmUgICAgKi8KLSAgICBpbnQgbGltaXRfcmVxX2ZpZWxkc2l6ZTsgLyogbGltaXQgb24gc2l6ZSBvZiBhbnkgcmVxdWVzdCBoZWFkZXIgZmllbGQgKi8KLSAgICBpbnQgbGltaXRfcmVxX2ZpZWxkczsgICAgLyogbGltaXQgb24gbnVtYmVyIG9mIHJlcXVlc3QgaGVhZGVyIGZpZWxkcyAgKi8KLX07Ci0KLS8qIFRoZXNlIGFyZSBtb3JlIGxpa2UgcmVhbCBob3N0cyB0aGFuIHZpcnR1YWwgaG9zdHMgKi8KLXN0cnVjdCBsaXN0ZW5fcmVjIHsKLSAgICBsaXN0ZW5fcmVjICpuZXh0OwotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBsb2NhbF9hZGRyOwkvKiBsb2NhbCBJUCBhZGRyZXNzIGFuZCBwb3J0ICovCi0gICAgaW50IGZkOwotICAgIGludCB1c2VkOwkJCS8qIE9ubHkgdXNlZCBkdXJpbmcgcmVzdGFydCAqLwotLyogbW9yZSBzdHVmZiBoZXJlLCBsaWtlIHdoaWNoIHByb3RvY29sIGlzIGJvdW5kIHRvIHRoZSBwb3J0ICovCi19OwotCi0vKiBQcm90b3R5cGVzIGZvciB1dGlsaXRpZXMuLi4gdXRpbC5jLgotICovCi0KLWV4dGVybiB2b2lkIGFwX3V0aWxfaW5pdCh2b2lkKTsKLQotLyogVGltZSAqLwotZXh0ZXJuIEFQSV9WQVJfRVhQT1JUIGNvbnN0IGNoYXIgYXBfbW9udGhfc25hbWVzWzEyXVs0XTsKLWV4dGVybiBBUElfVkFSX0VYUE9SVCBjb25zdCBjaGFyIGFwX2RheV9zbmFtZXNbN11bNF07Ci0KLUFQSV9FWFBPUlQoc3RydWN0IHRtICopIGFwX2dldF9nbXRvZmYoaW50ICp0eik7Ci1BUElfRVhQT1JUKGNoYXIgKikgYXBfZ2V0X3RpbWUodm9pZCk7Ci1BUElfRVhQT1JUKGNoYXIgKikgYXBfZmllbGRfbm9wYXJhbShwb29sICpwLCBjb25zdCBjaGFyICppbnR5cGUpOwotQVBJX0VYUE9SVChjaGFyICopIGFwX2h0X3RpbWUocG9vbCAqcCwgdGltZV90IHQsIGNvbnN0IGNoYXIgKmZtdCwgaW50IGdtdCk7Ci1BUElfRVhQT1JUKGNoYXIgKikgYXBfZ21fdGltZXN0cl84MjIocG9vbCAqcCwgdGltZV90IHQpOwotCi0vKiBTdHJpbmcgaGFuZGxpbmcuIFRoZSAqX25jIHZhcmlhbnRzIGFsbG93IHlvdSB0byB1c2Ugbm9uLWNvbnN0IGNoYXIgKipzIGFzCi0gICBhcmd1bWVudHMgKHVuZm9ydHVuYXRlbHkgQyB3b24ndCBhdXRvbWF0aWNhbGx5IGNvbnZlcnQgYSBjaGFyICoqIHRvIGEgY29uc3QKLSAgIGNoYXIgKiopICovCi0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9nZXR3b3JkKHBvb2wgKnAsIGNvbnN0IGNoYXIgKipsaW5lLCBjaGFyIHN0b3ApOwotQVBJX0VYUE9SVChjaGFyICopIGFwX2dldHdvcmRfbmMocG9vbCAqcCwgY2hhciAqKmxpbmUsIGNoYXIgc3RvcCk7Ci1BUElfRVhQT1JUKGNoYXIgKikgYXBfZ2V0d29yZF93aGl0ZShwb29sICpwLCBjb25zdCBjaGFyICoqbGluZSk7Ci1BUElfRVhQT1JUKGNoYXIgKikgYXBfZ2V0d29yZF93aGl0ZV9uYyhwb29sICpwLCBjaGFyICoqbGluZSk7Ci1BUElfRVhQT1JUKGNoYXIgKikgYXBfZ2V0d29yZF9udWxscyhwb29sICpwLCBjb25zdCBjaGFyICoqbGluZSwgY2hhciBzdG9wKTsKLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9nZXR3b3JkX251bGxzX25jKHBvb2wgKnAsIGNoYXIgKipsaW5lLCBjaGFyIHN0b3ApOwotQVBJX0VYUE9SVChjaGFyICopIGFwX2dldHdvcmRfY29uZihwb29sICpwLCBjb25zdCBjaGFyICoqbGluZSk7Ci1BUElfRVhQT1JUKGNoYXIgKikgYXBfZ2V0d29yZF9jb25mX25jKHBvb2wgKnAsIGNoYXIgKipsaW5lKTsKLQotQVBJX0VYUE9SVChjb25zdCBjaGFyICopIGFwX3NpemVfbGlzdF9pdGVtKGNvbnN0IGNoYXIgKipmaWVsZCwgaW50ICpsZW4pOwotQVBJX0VYUE9SVChjaGFyICopIGFwX2dldF9saXN0X2l0ZW0ocG9vbCAqcCwgY29uc3QgY2hhciAqKmZpZWxkKTsKLUFQSV9FWFBPUlQoaW50KSBhcF9maW5kX2xpc3RfaXRlbShwb29sICpwLCBjb25zdCBjaGFyICpsaW5lLCBjb25zdCBjaGFyICp0b2spOwotCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfZ2V0X3Rva2VuKHBvb2wgKnAsIGNvbnN0IGNoYXIgKiphY2NlcHRfbGluZSwgaW50IGFjY2VwdF93aGl0ZSk7Ci1BUElfRVhQT1JUKGludCkgYXBfZmluZF90b2tlbihwb29sICpwLCBjb25zdCBjaGFyICpsaW5lLCBjb25zdCBjaGFyICp0b2spOwotQVBJX0VYUE9SVChpbnQpIGFwX2ZpbmRfbGFzdF90b2tlbihwb29sICpwLCBjb25zdCBjaGFyICpsaW5lLCBjb25zdCBjaGFyICp0b2spOwotCi1BUElfRVhQT1JUKGludCkgYXBfaXNfdXJsKGNvbnN0IGNoYXIgKnUpOwotQVBJX0VYUE9SVChpbnQpIGFwX3VuZXNjYXBlX3VybChjaGFyICp1cmwpOwotQVBJX0VYUE9SVCh2b2lkKSBhcF9ubzJzbGFzaChjaGFyICpuYW1lKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfZ2V0cGFyZW50cyhjaGFyICpuYW1lKTsKLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9lc2NhcGVfcGF0aF9zZWdtZW50KHBvb2wgKnAsIGNvbnN0IGNoYXIgKnMpOwotQVBJX0VYUE9SVChjaGFyICopIGFwX29zX2VzY2FwZV9wYXRoKHBvb2wgKnAsIGNvbnN0IGNoYXIgKnBhdGgsIGludCBwYXJ0aWFsKTsKLSNkZWZpbmUgYXBfZXNjYXBlX3VyaShwcG9vbCxwYXRoKSBhcF9vc19lc2NhcGVfcGF0aChwcG9vbCxwYXRoLDEpCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfZXNjYXBlX2h0bWwocG9vbCAqcCwgY29uc3QgY2hhciAqcyk7Ci1BUElfRVhQT1JUKGNoYXIgKikgYXBfY29uc3RydWN0X3NlcnZlcihwb29sICpwLCBjb25zdCBjaGFyICpob3N0bmFtZSwKLQkJCQkgICAgdW5zaWduZWQgcG9ydCwgY29uc3QgcmVxdWVzdF9yZWMgKnIpOwotQVBJX0VYUE9SVChjaGFyICopIGFwX2VzY2FwZV9zaGVsbF9jbWQocG9vbCAqcCwgY29uc3QgY2hhciAqcyk7Ci0KLUFQSV9FWFBPUlQoaW50KSBhcF9jb3VudF9kaXJzKGNvbnN0IGNoYXIgKnBhdGgpOwotQVBJX0VYUE9SVChjaGFyICopIGFwX21ha2VfZGlyc3RyX3ByZWZpeChjaGFyICpkLCBjb25zdCBjaGFyICpzLCBpbnQgbik7Ci1BUElfRVhQT1JUKGNoYXIgKikgYXBfbWFrZV9kaXJzdHJfcGFyZW50KHBvb2wgKnAsIGNvbnN0IGNoYXIgKnMpOwotLyogZGVwcmVjYXRlZC4gIFRoZSBwcmV2aW91cyB0d28gcm91dGluZXMgYXJlIHByZWZlcnJlZC4gKi8KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9tYWtlX2RpcnN0cihwb29sICphLCBjb25zdCBjaGFyICpzLCBpbnQgbik7Ci1BUElfRVhQT1JUKGNoYXIgKikgYXBfbWFrZV9mdWxsX3BhdGgocG9vbCAqYSwgY29uc3QgY2hhciAqZGlyLCBjb25zdCBjaGFyICpmKTsKLQotQVBJX0VYUE9SVChpbnQpIGFwX2lzX21hdGNoZXhwKGNvbnN0IGNoYXIgKnN0cik7Ci1BUElfRVhQT1JUKGludCkgYXBfc3RyY21wX21hdGNoKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZXhwKTsKLUFQSV9FWFBPUlQoaW50KSBhcF9zdHJjYXNlY21wX21hdGNoKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZXhwKTsKLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9wYmFzZTY0ZGVjb2RlKHBvb2wgKnAsIGNvbnN0IGNoYXIgKmJ1ZmNvZGVkKTsKLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9wYmFzZTY0ZW5jb2RlKHBvb2wgKnAsIGNoYXIgKnN0cmluZyk7IAotQVBJX0VYUE9SVChjaGFyICopIGFwX3V1ZGVjb2RlKHBvb2wgKnAsIGNvbnN0IGNoYXIgKmJ1ZmNvZGVkKTsKLUFQSV9FWFBPUlQoY2hhciAqKSBhcF91dWVuY29kZShwb29sICpwLCBjaGFyICpzdHJpbmcpOyAKLQotI2lmZGVmIE9TMgotdm9pZCBvczJwYXRobmFtZShjaGFyICpwYXRoKTsKLWNoYXIgKmFwX2RvdWJsZV9xdW90ZXMocG9vbCAqcCwgY2hhciAqc3RyKTsKLSNlbmRpZgotCi1BUElfRVhQT1JUKGludCkgICAgYXBfcmVnZXhlYyhjb25zdCByZWdleF90ICpwcmVnLCBjb25zdCBjaGFyICpzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgbm1hdGNoLCByZWdtYXRjaF90IHBtYXRjaFtdLCBpbnQgZWZsYWdzKTsKLUFQSV9FWFBPUlQoc2l6ZV90KSBhcF9yZWdlcnJvcihpbnQgZXJyY29kZSwgY29uc3QgcmVnZXhfdCAqcHJlZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZXJyYnVmLCBzaXplX3QgZXJyYnVmX3NpemUpOwotQVBJX0VYUE9SVChjaGFyICopIGFwX3ByZWdzdWIocG9vbCAqcCwgY29uc3QgY2hhciAqaW5wdXQsIGNvbnN0IGNoYXIgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBubWF0Y2gsIHJlZ21hdGNoX3QgcG1hdGNoW10pOwotCi1BUElfRVhQT1JUKHZvaWQpIGFwX2NvbnRlbnRfdHlwZV90b2xvd2VyKGNoYXIgKik7Ci1BUElfRVhQT1JUKHZvaWQpIGFwX3N0cl90b2xvd2VyKGNoYXIgKik7Ci1BUElfRVhQT1JUKGludCkgYXBfaW5kKGNvbnN0IGNoYXIgKiwgY2hhcik7CS8qIFNpZ2guLi4gKi8KLUFQSV9FWFBPUlQoaW50KSBhcF9yaW5kKGNvbnN0IGNoYXIgKiwgY2hhcik7Ci0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9lc2NhcGVfcXVvdGVzIChwb29sICpwLCBjb25zdCBjaGFyICppbnN0cmluZyk7Ci0KLS8qIENvbW1vbiBzdHJ1Y3R1cmUgZm9yIHJlYWRpbmcgb2YgY29uZmlnIGZpbGVzIC8gcGFzc3dkIGZpbGVzIGV0Yy4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgKCpnZXRjaCkgKHZvaWQgKnBhcmFtKTsJLyogYSBnZXRjKCktbGlrZSBmdW5jdGlvbiAqLwotICAgIHZvaWQgKigqZ2V0c3RyKSAodm9pZCAqYnVmLCBzaXplX3QgYnVmc2l6LCB2b2lkICpwYXJhbSk7IC8qIGEgZmdldHMoKS1saWtlIGZ1bmN0aW9uICovCi0gICAgaW50ICgqY2xvc2UpICh2b2lkICpwYXJhbSk7CS8qIGEgY2xvc2UgaGFuZGVyIGZ1bmN0aW9uICovCi0gICAgdm9pZCAqcGFyYW07CQkvKiB0aGUgYXJndW1lbnQgcGFzc2VkIHRvIGdldGNoL2dldHN0ci9jbG9zZSAqLwotICAgIGNvbnN0IGNoYXIgKm5hbWU7CQkvKiB0aGUgZmlsZW5hbWUgLyBkZXNjcmlwdGlvbiAqLwotICAgIHVuc2lnbmVkIGxpbmVfbnVtYmVyOwkvKiBjdXJyZW50IGxpbmUgbnVtYmVyLCBzdGFydGluZyBhdCAxICovCi19IGNvbmZpZ2ZpbGVfdDsKLQotLyogT3BlbiBhIGNvbmZpZ2ZpbGVfdCBhcyBGSUxFLCByZXR1cm4gb3BlbiBjb25maWdmaWxlX3Qgc3RydWN0IHBvaW50ZXIgKi8KLUFQSV9FWFBPUlQoY29uZmlnZmlsZV90ICopIGFwX3BjZmdfb3BlbmZpbGUocG9vbCAqcCwgY29uc3QgY2hhciAqbmFtZSk7Ci0KLS8qIEFsbG9jYXRlIGEgY29uZmlnZmlsZV90IGhhbmRsZSB3aXRoIHVzZXIgZGVmaW5lZCBmdW5jdGlvbnMgYW5kIHBhcmFtcyAqLwotQVBJX0VYUE9SVChjb25maWdmaWxlX3QgKikgYXBfcGNmZ19vcGVuX2N1c3RvbShwb29sICpwLCBjb25zdCBjaGFyICpkZXNjciwKLSAgICB2b2lkICpwYXJhbSwKLSAgICBpbnQoKmdldGNfZnVuYykodm9pZCopLAotICAgIHZvaWQgKigqZ2V0c19mdW5jKSAodm9pZCAqYnVmLCBzaXplX3QgYnVmc2l6LCB2b2lkICpwYXJhbSksCi0gICAgaW50KCpjbG9zZV9mdW5jKSh2b2lkICpwYXJhbSkpOwotCi0vKiBSZWFkIG9uZSBsaW5lIGZyb20gb3BlbiBjb25maWdmaWxlX3QsIHN0cmlwIExGLCBpbmNyZWFzZSBsaW5lIG51bWJlciAqLwotQVBJX0VYUE9SVChpbnQpIGFwX2NmZ19nZXRsaW5lKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUsIGNvbmZpZ2ZpbGVfdCAqY2ZwKTsKLQotLyogUmVhZCBvbmUgY2hhciBmcm9tIG9wZW4gY29uZmlnZmlsZV90LCBpbmNyZWFzZSBsaW5lIG51bWJlciB1cG9uIExGICovCi1BUElfRVhQT1JUKGludCkgYXBfY2ZnX2dldGMoY29uZmlnZmlsZV90ICpjZnApOwotCi0vKiBEZXRhY2ggZnJvbSBvcGVuIGNvbmZpZ2ZpbGVfdCwgY2FsbGluZyB0aGUgY2xvc2UgaGFuZGxlciAqLwotQVBJX0VYUE9SVChpbnQpIGFwX2NmZ19jbG9zZWZpbGUoY29uZmlnZmlsZV90ICpjZnApOwotCi0jaWZkZWYgTkVFRF9TVFJFUlJPUgotY2hhciAqc3RyZXJyb3IoaW50IGVycik7Ci0jZW5kaWYKLQotLyogTWlzYyBzeXN0ZW0gaGFja2VyeSAqLwotCi1BUElfRVhQT1JUKHVpZF90KSBhcF91bmFtZTJpZChjb25zdCBjaGFyICpuYW1lKTsKLUFQSV9FWFBPUlQoZ2lkX3QpIGFwX2duYW1lMmlkKGNvbnN0IGNoYXIgKm5hbWUpOwotQVBJX0VYUE9SVChpbnQpIGFwX2lzX2RpcmVjdG9yeShjb25zdCBjaGFyICpuYW1lKTsKLUFQSV9FWFBPUlQoaW50KSBhcF9jYW5fZXhlYyhjb25zdCBzdHJ1Y3Qgc3RhdCAqKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfY2hkaXJfZmlsZShjb25zdCBjaGFyICpmaWxlKTsKLQotI2lmbmRlZiBIQVZFX0NBTk9OSUNBTF9GSUxFTkFNRQotLyoKLSAqICBXZSBjYW4ndCBkZWZpbmUgdGhlc2UgaW4gb3MuaCBiZWNhdXNlIG9mIGRlcGVuZGVuY2Ugb24gcG9vbCBwb2ludGVyLgotICovCi0jZGVmaW5lIGFwX29zX2Nhbm9uaWNhbF9maWxlbmFtZShwLGYpICAoZikKLSNkZWZpbmUgYXBfb3NfY2FzZV9jYW5vbmljYWxfZmlsZW5hbWUocCxmKSAgKGYpCi0jZGVmaW5lIGFwX29zX3N5c3RlbWNhc2VfZmlsZW5hbWUocCxmKSAgKGYpCi0jZWxzZQotQVBJX0VYUE9SVChjaGFyICopIGFwX29zX2Nhbm9uaWNhbF9maWxlbmFtZShwb29sICpwLCBjb25zdCBjaGFyICpmaWxlKTsKLSNpZmRlZiBXSU4zMgotQVBJX0VYUE9SVChjaGFyICopIGFwX29zX2Nhc2VfY2Fub25pY2FsX2ZpbGVuYW1lKHBvb2wgKnBQb29sLCBjb25zdCBjaGFyICpzekZpbGUpOwotQVBJX0VYUE9SVChjaGFyICopIGFwX29zX3N5c3RlbWNhc2VfZmlsZW5hbWUocG9vbCAqcFBvb2wsIGNvbnN0IGNoYXIgKnN6RmlsZSk7Ci0jZWxzZQotI2RlZmluZSBhcF9vc19jYXNlX2Nhbm9uaWNhbF9maWxlbmFtZShwLGYpIGFwX29zX2Nhbm9uaWNhbF9maWxlbmFtZShwLGYpCi0jZGVmaW5lIGFwX29zX3N5c3RlbWNhc2VfZmlsZW5hbWUocCxmKSBhcF9vc19jYW5vbmljYWxfZmlsZW5hbWUocCxmKQotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIF9PU0RfUE9TSVgKLWV4dGVybiBjb25zdCBjaGFyICpvc19zZXRfYWNjb3VudChwb29sICpwLCBjb25zdCBjaGFyICphY2NvdW50KTsKLWV4dGVybiBpbnQgb3NfaW5pdF9qb2JfZW52aXJvbm1lbnQoc2VydmVyX3JlYyAqcywgY29uc3QgY2hhciAqdXNlcl9uYW1lLCBpbnQgb25lX3Byb2Nlc3MpOwotI2VuZGlmIC8qIF9PU0RfUE9TSVggKi8KLQotY2hhciAqYXBfZ2V0X2xvY2FsX2hvc3QocG9vbCAqKTsKLXVuc2lnbmVkIGxvbmcgYXBfZ2V0X3ZpcnRob3N0X2FkZHIoY2hhciAqaG9zdG5hbWUsIHVuc2lnbmVkIHNob3J0ICpwb3J0KTsKLQotZXh0ZXJuIEFQSV9WQVJfRVhQT1JUIHRpbWVfdCBhcF9yZXN0YXJ0X3RpbWU7Ci0KLS8qCi0gKiBBcGFjaGUgdHJpZXMgdG8ga2VlcCBhbGwgb2YgaXRzIGxvbmcgdGVybSBmaWxlaGFuZGxlcyAoc3VjaCBhcyBsb2cgZmlsZXMsCi0gKiBhbmQgc29ja2V0cykgYWJvdmUgdGhpcyBudW1iZXIuICBUaGlzIGlzIHRvIHdvcmthcm91bmQgcHJvYmxlbXMgaW4gbWFueQotICogdGhpcmQgcGFydHkgbGlicmFyaWVzIHRoYXQgYXJlIGNvbXBpbGVkIHdpdGggYSBzbWFsbCBGRF9TRVRTSVpFLiAgVGhlcmUKLSAqIHNob3VsZCBiZSBubyByZWFzb24gdG8gbG93ZXIgdGhpcywgYmVjYXVzZSBpdCdzIG9ubHkgYWR2aXNvcnkuICBJZiBhIGZpbGUKLSAqIGNhbid0IGJlIGFsbG9jYXRlZCBhYm92ZSB0aGlzIG51bWJlciB0aGVuIGl0IHdpbGwgcmVtYWluIGluIHRoZSAic2xhY2siCi0gKiBhcmVhLgotICoKLSAqIE9ubHkgdGhlIGxvdyBzbGFjayBsaW5lIGlzIHVzZWQgYnkgZGVmYXVsdC4gIElmIEhJR0hfU0xBQ0tfTElORSBpcyBkZWZpbmVkCi0gKiB0aGVuIGFuIGF0dGVtcHQgaXMgYWxzbyBtYWRlIHRvIGtlZXAgYWxsIG5vbi1GSUxFICogZmlsZXMgYWJvdmUgdGhlIGhpZ2gKLSAqIHNsYWNrIGxpbmUuICBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIGEgU29sYXJpcyBDIGxpYnJhcnkgbGltaXRhdGlvbiwgd2hlcmUgaXQKLSAqIHVzZXMgYW4gdW5zaWduZWQgY2hhciB0byBzdG9yZSB0aGUgZmlsZSBkZXNjcmlwdG9yLgotICovCi0jaWZuZGVmIExPV19TTEFDS19MSU5FCi0jZGVmaW5lIExPV19TTEFDS19MSU5FCTE1Ci0jZW5kaWYKLS8qICNkZWZpbmUgSElHSF9TTEFDS19MSU5FICAgICAgMjU1ICovCi0KLS8qCi0gKiBUaGUgYXBfc2xhY2soKSBmdW5jdGlvbiB0YWtlcyBhIGZkLCBhbmQgdHJpZXMgdG8gbW92ZSBpdCBhYm92ZSB0aGUgaW5kaWNhdGVkCi0gKiBsaW5lLiAgSXQgcmV0dXJucyBhbiBmZCB3aGljaCBtYXkgb3IgbWF5IG5vdCBoYXZlIG1vdmVkIGFib3ZlIHRoZSBsaW5lLCBhbmQKLSAqIG5ldmVyIGZhaWxzLiAgSWYgdGhlIGhpZ2ggbGluZSB3YXMgcmVxdWVzdGVkIGFuZCBpdCBmYWlscyBpdCB3aWxsIGFsc28gdHJ5Ci0gKiB0aGUgbG93IGxpbmUuCi0gKi8KLSNpZmRlZiBOT19TTEFDSwotI2RlZmluZSBhcF9zbGFjayhmZCxsaW5lKSAgIChmZCkKLSNlbHNlCi1pbnQgYXBfc2xhY2soaW50IGZkLCBpbnQgbGluZSk7Ci0jZGVmaW5lIEFQX1NMQUNLX0xPVwkxCi0jZGVmaW5lIEFQX1NMQUNLX0hJR0gJMgotI2VuZGlmCi0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9lc2NhcGVfcXVvdGVzKHBvb2wgKnAsIGNvbnN0IGNoYXIgKmluc3RyKTsKLQotLyoKLSAqIFJlZGVmaW5lIGFzc2VydCgpIHRvIHNvbWV0aGluZyBtb3JlIHVzZWZ1bCBmb3IgYW4gQXBhY2hlLi4uCi0gKi8KLUFQSV9FWFBPUlQodm9pZCkgYXBfbG9nX2Fzc2VydChjb25zdCBjaGFyICpzekV4cCwgY29uc3QgY2hhciAqc3pGaWxlLCBpbnQgbkxpbmUpCi0JCQkgICAgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKLSNkZWZpbmUgYXBfYXNzZXJ0KGV4cCkgKChleHApID8gKHZvaWQpMCA6IGFwX2xvZ19hc3NlcnQoI2V4cCxfX0ZJTEVfXyxfX0xJTkVfXykpCi0KLS8qIFRoZSBvcHRpbWl6ZWQgdGltZW91dCBjb2RlIG9ubHkgd29ya3MgaWYgd2UncmUgbm90IE1VTFRJVEhSRUFEIGFuZCB3ZSdyZQotICogYWxzbyBub3QgdXNpbmcgYSBzY29yZWJvYXJkIGZpbGUKLSAqLwotI2lmICFkZWZpbmVkIChNVUxUSVRIUkVBRCkgJiYgXAotICAgIChkZWZpbmVkIChVU0VfTU1BUF9TQ09SRUJPQVJEKSB8fCBkZWZpbmVkIChVU0VfU0hNR0VUX1NDT1JFQk9BUkQpKQotI2RlZmluZSBPUFRJTUlaRV9USU1FT1VUUwotI2VuZGlmCi0KLS8qIEEgc2V0IG9mIGZsYWdzIHdoaWNoIGluZGljYXRlIHBsYWNlcyB3aGVyZSB0aGUgc2VydmVyIHNob3VsZCByYWlzZShTSUdTVE9QKS4KLSAqIFRoaXMgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcsIGJlY2F1c2UgeW91IGNhbiB0aGVuIGF0dGFjaCB0byB0aGF0IHByb2Nlc3MKLSAqIHdpdGggZ2RiIGFuZCBjb250aW51ZS4gIFRoaXMgaXMgaW1wb3J0YW50IGluIGNhc2VzIHdoZXJlIG9uZV9wcm9jZXNzCi0gKiBkZWJ1Z2dpbmcgaXNuJ3QgcG9zc2libGUuCi0gKi8KLSNkZWZpbmUgU0lHU1RPUF9ERVRBQ0gJCQkxCi0jZGVmaW5lIFNJR1NUT1BfTUFLRV9DSElMRAkJMgotI2RlZmluZSBTSUdTVE9QX1NQQVdOX0NISUxECQk0Ci0jZGVmaW5lIFNJR1NUT1BfUElQRURfTE9HX1NQQVdOCQk4Ci0jZGVmaW5lIFNJR1NUT1BfQ0dJX0NISUxECQkxNgotCi0jaWZkZWYgREVCVUdfU0lHU1RPUAotZXh0ZXJuIGludCByYWlzZV9zaWdzdG9wX2ZsYWdzOwotI2RlZmluZSBSQUlTRV9TSUdTVE9QKHgpCWRvIHsgXAotCWlmIChyYWlzZV9zaWdzdG9wX2ZsYWdzICYgU0lHU1RPUF8jI3gpIHJhaXNlKFNJR1NUT1ApO1wKLSAgICB9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgUkFJU0VfU0lHU1RPUCh4KQotI2VuZGlmCi0KLUFQSV9FWFBPUlQoZXh0ZXJuIGNvbnN0IGNoYXIgKikgYXBfcHNpZ25hdHVyZShjb25zdCBjaGFyICpwcmVmaXgsIHJlcXVlc3RfcmVjICpyKTsKLQotLyogc3RydG91bCBkb2VzIG5vdCBleGlzdCBvbiBzdW5vczQuICovCi0jaWZkZWYgc3RydG91bAotI3VuZGVmIHN0cnRvdWwKLSNlbmRpZgotI2RlZmluZSBzdHJ0b3VsIHN0cnRvdWxfaXNfbm90X2FfcG9ydGFibGVfZnVuY3Rpb25fdXNlX3N0cnRvbF9pbnN0ZWFkCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgkvKiAhQVBBQ0hFX0hUVFBEX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXBtX2NvbW1vbi5oIGIvaW5jbHVkZS9tcG1fY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OTNmNjAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcG1fY29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBiYXNlZCB1cG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUKLSAqIG9yaWdpbmFsbHkgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsCi0gKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICovCi0KLS8qIFRoZSBwdXJwb3NlIG9mIHRoaXMgZmlsZSBpcyB0byBzdG9yZSB0aGUgY29kZSB0aGF0IE1PU1QgbXBtJ3Mgd2lsbCBuZWVkCi0gKiB0aGlzIGRvZXMgbm90IG1lYW4gYSBmdW5jdGlvbiBvbmx5IGdvZXMgaW50byB0aGlzIGZpbGUgaWYgZXZlcnkgTVBNIG5lZWRzCi0gKiBpdC4gIEl0IG1lYW5zIHRoYXQgaWYgYSBmdW5jdGlvbiBpcyBuZWVkZWQgYnkgbW9yZSB0aGFuIG9uZSBNUE0sIGFuZAotICogZnV0dXJlIG1haW50ZW5hbmNlIHdvdWxkIGJlIHNlcnZlZCBieSBtYWtpbmcgdGhlIGNvZGUgY29tbW9uLCB0aGVuIHRoZQotICogZnVuY3Rpb24gYmVsb25ncyBoZXJlLgotICoKLSAqIFRoaXMgaXMgZ29pbmcgaW4gc3JjL21haW4gYmVjYXVzZSBpdCBpcyBub3QgcGxhdGZvcm0gc3BlY2lmaWMsIGl0IGlzCi0gKiBzcGVjaWZpYyB0byBtdWx0aS1wcm9jZXNzIHNlcnZlcnMsIGJ1dCBOT1QgdG8gVW5peC4gIFdoaWNoIGlzIHdoeSBpdAotICogZG9lcyBub3QgYmVsb25nIGluIHNyYy9vcy91bml4Ci0gKi8KLQotI2lmbmRlZiBBUEFDSEVfTVBNX0NPTU1PTl9ICi0jZGVmaW5lIEFQQUNIRV9NUE1fQ09NTU9OX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi12b2lkIGFwX3JlY2xhaW1fY2hpbGRfcHJvY2Vzc2VzKGludCB0ZXJtaW5hdGUpOwotYXBfcHJvY190ICphcF93YWl0X29yX3RpbWVvdXQoYXBfd2FpdF90ICpzdGF0dXMsIGFwX3Bvb2xfdCAqcCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiAhQVBBQ0hFX01QTV9DT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wY3JlcG9zaXguaCBiL2luY2x1ZGUvcGNyZXBvc2l4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ODM4YTguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9wY3JlcG9zaXguaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgIFBlcmwtQ29tcGF0aWJsZSBSZWd1bGFyIEV4cHJlc3Npb25zICAgICAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDAgVW5pdmVyc2l0eSBvZiBDYW1icmlkZ2UgKi8KLS8qIERvIG5vdCBlZGl0IHRoaXMgZmlsZSwgdGhpcyBpcyBwcm92aWRlZCBieSBQQ1JFICovCi0KLSNpZm5kZWYgX1BDUkVQT1NJWF9ICi0jZGVmaW5lIF9QQ1JFUE9TSVhfSAotCi0vKiBUaGlzIGlzIHRoZSBoZWFkZXIgZm9yIHRoZSBQT1NJWCB3cmFwcGVyIGludGVyZmFjZSB0byB0aGUgUENSRSBQZXJsLQotQ29tcGF0aWJsZSBSZWd1bGFyIEV4cHJlc3Npb24gbGlicmFyeS4gSXQgZGVmaW5lcyB0aGUgdGhpbmdzIFBPU0lYIHNheXMgc2hvdWxkCi1iZSB0aGVyZS4gSSBob3BlLiAqLwotCi0vKiBIYXZlIHRvIGluY2x1ZGUgc3RkbGliLmggaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgc2l6ZV90IGlzIGRlZmluZWQuICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotLyogQWxsb3cgZm9yIEMrKyB1c2VycyAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIE9wdGlvbnMgZGVmaW5lZCBieSBQT1NJWC4gKi8KLQotI2RlZmluZSBSRUdfSUNBU0UgICAgIDB4MDEKLSNkZWZpbmUgUkVHX05FV0xJTkUgICAweDAyCi0jZGVmaW5lIFJFR19OT1RCT0wgICAgMHgwNAotI2RlZmluZSBSRUdfTk9URU9MICAgIDB4MDgKLQotLyogVGhlc2UgYXJlIG5vdCB1c2VkIGJ5IFBDUkUsIGJ1dCBieSBkZWZpbmluZyB0aGVtIHdlIG1ha2UgaXQgZWFzaWVyCi10byBzbG90IFBDUkUgaW50byBleGlzdGluZyBwcm9ncmFtcyB0aGF0IG1ha2UgUE9TSVggY2FsbHMuICovCi0KLSNkZWZpbmUgUkVHX0VYVEVOREVEICAwCi0jZGVmaW5lIFJFR19OT1NVQiAgICAgMAotCi0vKiBFcnJvciB2YWx1ZXMuIE5vdCBhbGwgdGhlc2UgYXJlIHJlbGV2YW50IG9yIHVzZWQgYnkgdGhlIHdyYXBwZXIuICovCi0KLWVudW0gewotICBSRUdfQVNTRVJUID0gMSwgIC8qIGludGVybmFsIGVycm9yID8gKi8KLSAgUkVHX0JBREJSLCAgICAgICAvKiBpbnZhbGlkIHJlcGVhdCBjb3VudHMgaW4ge30gKi8KLSAgUkVHX0JBRFBBVCwgICAgICAvKiBwYXR0ZXJuIGVycm9yICovCi0gIFJFR19CQURSUFQsICAgICAgLyogPyAqICsgaW52YWxpZCAqLwotICBSRUdfRUJSQUNFLCAgICAgIC8qIHVuYmFsYW5jZWQge30gKi8KLSAgUkVHX0VCUkFDSywgICAgICAvKiB1bmJhbGFuY2VkIFtdICovCi0gIFJFR19FQ09MTEFURSwgICAgLyogY29sbGF0aW9uIGVycm9yIC0gbm90IHJlbGV2YW50ICovCi0gIFJFR19FQ1RZUEUsICAgICAgLyogYmFkIGNsYXNzICovCi0gIFJFR19FRVNDQVBFLCAgICAgLyogYmFkIGVzY2FwZSBzZXF1ZW5jZSAqLwotICBSRUdfRU1QVFksICAgICAgIC8qIGVtcHR5IGV4cHJlc3Npb24gKi8KLSAgUkVHX0VQQVJFTiwgICAgICAvKiB1bmJhbGFuY2VkICgpICovCi0gIFJFR19FUkFOR0UsICAgICAgLyogYmFkIHJhbmdlIGluc2lkZSBbXSAqLwotICBSRUdfRVNJWkUsICAgICAgIC8qIGV4cHJlc3Npb24gdG9vIGJpZyAqLwotICBSRUdfRVNQQUNFLCAgICAgIC8qIGZhaWxlZCB0byBnZXQgbWVtb3J5ICovCi0gIFJFR19FU1VCUkVHLCAgICAgLyogYmFkIGJhY2sgcmVmZXJlbmNlICovCi0gIFJFR19JTlZBUkcsICAgICAgLyogYmFkIGFyZ3VtZW50ICovCi0gIFJFR19OT01BVENIICAgICAgLyogbWF0Y2ggZmFpbGVkICovCi19OwotCi0KLS8qIFRoZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgY29tcGlsZWQgcmVndWxhciBleHByZXNzaW9uLiAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHZvaWQgKnJlX3BjcmU7Ci0gIHNpemVfdCByZV9uc3ViOwotICBzaXplX3QgcmVfZXJyb2Zmc2V0OwotfSByZWdleF90OwotCi0vKiBUaGUgc3RydWN0dXJlIGluIHdoaWNoIGEgY2FwdHVyZWQgb2Zmc2V0IGlzIHJldHVybmVkLiAqLwotCi10eXBlZGVmIGludCByZWdvZmZfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICByZWdvZmZfdCBybV9zbzsKLSAgcmVnb2ZmX3Qgcm1fZW87Ci19IHJlZ21hdGNoX3Q7Ci0KLS8qIFRoZSBmdW5jdGlvbnMgKi8KLQotZXh0ZXJuIGludCByZWdjb21wKHJlZ2V4X3QgKiwgY29uc3QgY2hhciAqLCBpbnQpOwotZXh0ZXJuIGludCByZWdleGVjKHJlZ2V4X3QgKiwgY29uc3QgY2hhciAqLCBzaXplX3QsIHJlZ21hdGNoX3QgKiwgaW50KTsKLWV4dGVybiBzaXplX3QgcmVnZXJyb3IoaW50LCBjb25zdCByZWdleF90ICosIGNoYXIgKiwgc2l6ZV90KTsKLWV4dGVybiB2b2lkIHJlZ2ZyZWUocmVnZXhfdCAqKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19ICAgLyogZXh0ZXJuICJDIiAqLwotI2VuZGlmCi0KLSNlbmRpZiAvKiBFbmQgb2YgcGNyZXBvc2l4LmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NvcmVib2FyZC5oIGIvaW5jbHVkZS9zY29yZWJvYXJkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZmNhOTUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9zY29yZWJvYXJkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCi0gKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAotICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqLwotCi0jaWZuZGVmIEFQQUNIRV9TQ09SRUJPQVJEX0gKLSNkZWZpbmUgQVBBQ0hFX1NDT1JFQk9BUkRfSAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TWVNfVElNRVNfSAotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWVzLmg+Ci0jZWxpZiBkZWZpbmVkKFRQRikKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIm1wbV9kZWZhdWx0LmgiCS8qIEZvciBIQVJEXy4qX0xJTUlUICovCi0jaW5jbHVkZSAiYXByX3RocmVhZF9wcm9jLmgiCi0KLS8qVGhlIG9wdGltaXplZCB0aW1lb3V0IGNvZGUgb25seSB3b3JrcyBpZiB3ZSdyZSBub3QgdXNpbmcgYSBzY29yZWJvYXJkIGZpbGUqLwotI2lmIGRlZmluZWQoQVBfVVNFX01FTV9CQVNFRF9TQ09SRUJPQVJEKQotI2RlZmluZSBPUFRJTUlaRV9USU1FT1VUUwotI2VuZGlmCi0KLS8qIFNjb3JlYm9hcmQgaW5mbyBvbiBhIHByb2Nlc3MgaXMsIGZvciBub3csIGtlcHQgdmVyeSBicmllZiAtLS0gCi0gKiBqdXN0IHN0YXR1cyB2YWx1ZSBhbmQgcGlkICh0aGUgbGF0dGVyIHNvIHRoYXQgdGhlIGNhcmV0YWtlciBwcm9jZXNzCi0gKiBjYW4gcHJvcGVybHkgdXBkYXRlIHRoZSBzY29yZWJvYXJkIHdoZW4gYSBwcm9jZXNzIGRpZXMpLiAgV2UgbWF5IHdhbnQKLSAqIHRvIGV2ZW50dWFsbHkgYWRkIGEgc2VwYXJhdGUgc2V0IG9mIGxvbmdfc2NvcmUgc3RydWN0dXJlcyB3aGljaCB3b3VsZAotICogZ2l2ZSwgZm9yIGVhY2ggcHJvY2VzcywgdGhlIG51bWJlciBvZiByZXF1ZXN0cyBzZXJ2aWNlZCwgYW5kIGluZm8gb24KLSAqIHRoZSBjdXJyZW50LCBvciBtb3N0IHJlY2VudCwgcmVxdWVzdC4KLSAqCi0gKiBTdGF0dXMgdmFsdWVzOgotICovCi0KLSNkZWZpbmUgU0VSVkVSX0RFQUQgMAotI2RlZmluZSBTRVJWRVJfU1RBUlRJTkcgMQkvKiBTZXJ2ZXIgU3RhcnRpbmcgdXAgKi8KLSNkZWZpbmUgU0VSVkVSX1JFQURZIDIJCS8qIFdhaXRpbmcgZm9yIGNvbm5lY3Rpb24gKG9yIGFjY2VwdCgpIGxvY2spICovCi0jZGVmaW5lIFNFUlZFUl9CVVNZX1JFQUQgMwkvKiBSZWFkaW5nIGEgY2xpZW50IHJlcXVlc3QgKi8KLSNkZWZpbmUgU0VSVkVSX0JVU1lfV1JJVEUgNAkvKiBQcm9jZXNzaW5nIGEgY2xpZW50IHJlcXVlc3QgKi8KLSNkZWZpbmUgU0VSVkVSX0JVU1lfS0VFUEFMSVZFIDUJLyogV2FpdGluZyBmb3IgbW9yZSByZXF1ZXN0cyB2aWEga2VlcGFsaXZlICovCi0jZGVmaW5lIFNFUlZFUl9CVVNZX0xPRyA2CS8qIExvZ2dpbmcgdGhlIHJlcXVlc3QgKi8KLSNkZWZpbmUgU0VSVkVSX0JVU1lfRE5TIDcJLyogTG9va2luZyB1cCBhIGhvc3RuYW1lICovCi0jZGVmaW5lIFNFUlZFUl9HUkFDRUZVTCA4CS8qIHNlcnZlciBpcyBncmFjZWZ1bGx5IGZpbmlzaGluZyByZXF1ZXN0ICovCi0jZGVmaW5lIFNFUlZFUl9BQ0NFUFRJTkcgOQkvKiB0aHJlYWQgaXMgYWNjZXB0aW5nIGNvbm5lY3Rpb25zICovCi0jZGVmaW5lIFNFUlZFUl9RVUVVRUlORwkxMCAgICAgIC8qIHRocmVhZCBpcyBwdXR0aW5nIGNvbm5lY3Rpb24gb24gdGhlIHF1ZXVlICovCi0jZGVmaW5lIFNFUlZFUl9OVU1fU1RBVFVTIDExCS8qIG51bWJlciBvZiBzdGF0dXMgc2V0dGluZ3MgKi8KLQotLyogQSAidmlydHVhbCB0aW1lIiBpcyBzaW1wbHkgYSBjb3VudGVyIHRoYXQgaW5kaWNhdGVzIHRoYXQgYSBjaGlsZCBpcwotICogbWFraW5nIHByb2dyZXNzLiAgVGhlIHBhcmVudCBjaGVja3MgdXAgb24gZWFjaCBjaGlsZCwgYW5kIHdoZW4gdGhleSBoYXZlCi0gKiBtYWRlIHByb2dyZXNzIGl0IHJlc2V0cyB0aGUgbGFzdF9ydGltZSBlbGVtZW50LiAgQnV0IHdoZW4gdGhlIGNoaWxkIGhhc24ndAotICogbWFkZSBwcm9ncmVzcyBpbiBhIHRpbWUgdGhhdCdzIHJvdWdobHkgdGltZW91dF9sZW4gc2Vjb25kcyBsb25nLCBpdCBpcwotICogc2VudCBhIFNJR0FMUk0uCi0gKgotICogdnRpbWUgaXMgYW4gb3B0aW1pemF0aW9uIHRoYXQgaXMgdXNlZCBvbmx5IHdoZW4gdGhlIHNjb3JlYm9hcmQgaXMgaW4KLSAqIHNoYXJlZCBtZW1vcnkgKGl0J3Mgbm90IGVhc3kvZmVhc2libGUgdG8gZG8gaXQgaW4gYSBzY29yZWJvYXJkIGZpbGUpLgotICogVGhlIGVzc2VudGlhbCBvYnNlcnZhdGlvbiBpcyB0aGF0IHRpbWVvdXRzIHJhcmVseSBvY2N1ciwgdGhlIHZhc3QgbWFqb3JpdHkKLSAqIG9mIGhpdHMgZmluaXNoIGJlZm9yZSBhbnkgdGltZW91dCBoYXBwZW5zLiAgU28gaXQgcmVhbGx5IHN1Y2tzIHRvIGhhdmUgdG8KLSAqIGFzayB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0byBzZXQgdXAgYW5kIGRlc3Ryb3kgYWxhcm1zIG1hbnkgdGltZXMgZHVyaW5nCi0gKiBhIHJlcXVlc3QuCi0gKi8KLXR5cGVkZWYgdW5zaWduZWQgdnRpbWVfdDsKLQotLyogVHlwZSB1c2VkIGZvciBnZW5lcmF0aW9uIGluZGljaWVzLiAgU3RhcnR1cCBhbmQgZXZlcnkgcmVzdGFydCBjYXVzZSBhCi0gKiBuZXcgZ2VuZXJhdGlvbiBvZiBjaGlsZHJlbiB0byBiZSBzcGF3bmVkLiAgQ2hpbGRyZW4gd2l0aGluIHRoZSBzYW1lCi0gKiBnZW5lcmF0aW9uIHNoYXJlIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gLS0gcG9pbnRlcnMgdG8gc3R1ZmYKLSAqIGNyZWF0ZWQgYXQgY29uZmlnIHRpbWUgaW4gdGhlIHBhcmVudCBhcmUgdmFsaWQgYWNyb3NzIGNoaWxkcmVuLiAgRm9yCi0gKiBleGFtcGxlLCB0aGUgdmhvc3RyZWMgcG9pbnRlciBpbiB0aGUgc2NvcmVib2FyZCBiZWxvdyBpcyB2YWxpZCBpbiBhbGwKLSAqIGNoaWxkcmVuIG9mIHRoZSBzYW1lIGdlbmVyYXRpb24uCi0gKgotICogVGhlIHNhZmUgd2F5IHRvIGFjY2VzcyB0aGUgdmhvc3QgcG9pbnRlciBpcyBsaWtlIHRoaXM6Ci0gKgotICogc2hvcnRfc2NvcmUgKnNzID0gcG9pbnRlciB0byB3aGljaHZlciBzbG90IGlzIGludGVyZXN0aW5nOwotICogcGFyZW50X3Njb3JlICpwcyA9IHBvaW50ZXIgdG8gd2hpY2h2ZXIgc2xvdCBpcyBpbnRlcmVzdGluZzsKLSAqIHNlcnZlcl9yZWMgKnZoID0gc3MtPnZob3N0cmVjOwotICoKLSAqIGlmIChwcy0+Z2VuZXJhdGlvbiAhPSBhcF9teV9nZW5lcmF0aW9uKSB7Ci0gKiAgICAgdmggPSBOVUxMOwotICogfQotICoKLSAqIHRoZW4gaWYgdmggaXMgbm90IE5VTEwgaXQncyB2YWxpZCBpbiB0aGlzIGNoaWxkLgotICoKLSAqIFRoaXMgYXZvaWRzIHZhcmlvdXMgcmFjZSBjb25kaXRpb25zIGFyb3VuZCByZXN0YXJ0cy4KLSAqLwotdHlwZWRlZiBpbnQgYXBfZ2VuZXJhdGlvbl90OwotCi0vKiBzdHVmZiB3aGljaCBpcyB0aHJlYWQvcHJvY2VzcyBzcGVjaWZpYyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotI2lmZGVmIE9QVElNSVpFX1RJTUVPVVRTCi0gICAgdnRpbWVfdCBjdXJfdnRpbWU7CQkvKiB0aGUgY2hpbGQncyBjdXJyZW50IHZ0aW1lICovCi0gICAgdW5zaWduZWQgc2hvcnQgdGltZW91dF9sZW47CS8qIGxlbmd0aCBvZiB0aGUgdGltZW91dCAqLwotI2VuZGlmCi0gICAgaW50IHRocmVhZF9udW07Ci0gICAgdW5zaWduZWQgY2hhciBzdGF0dXM7Ci0gICAgdW5zaWduZWQgbG9uZyBhY2Nlc3NfY291bnQ7Ci0gICAgdW5zaWduZWQgbG9uZyBieXRlc19zZXJ2ZWQ7Ci0gICAgdW5zaWduZWQgbG9uZyBteV9hY2Nlc3NfY291bnQ7Ci0gICAgdW5zaWduZWQgbG9uZyBteV9ieXRlc19zZXJ2ZWQ7Ci0gICAgdW5zaWduZWQgbG9uZyBjb25uX2J5dGVzOwotICAgIHVuc2lnbmVkIHNob3J0IGNvbm5fY291bnQ7Ci0gICAgYXByX3RpbWVfdCBzdGFydF90aW1lOwotICAgIGFwcl90aW1lX3Qgc3RvcF90aW1lOwotI2lmZGVmIEhBVkVfVElNRVMKLSAgICBzdHJ1Y3QgdG1zIHRpbWVzOwotI2VuZGlmCi0jaWZuZGVmIE9QVElNSVpFX1RJTUVPVVRTCi0gICAgdGltZV90IGxhc3RfdXNlZDsKLSNlbmRpZgotICAgIGNoYXIgY2xpZW50WzMyXTsJCS8qIEtlZXAgJ2VtIHNtYWxsLi4uICovCi0gICAgY2hhciByZXF1ZXN0WzY0XTsJCS8qIFdlIGp1c3Qgd2FudCBhbiBpZGVhLi4uICovCi0gICAgc2VydmVyX3JlYyAqdmhvc3RyZWM7CS8qIFdoYXQgdmlydHVhbCBob3N0IGlzIGJlaW5nIGFjY2Vzc2VkPyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTRUUgQUJPVkUgRk9SIFNBRkUgVVNBR0UhICovCi19IHNob3J0X3Njb3JlOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgYXBfZ2VuZXJhdGlvbl90IHJ1bm5pbmdfZ2VuZXJhdGlvbjsJLyogdGhlIGdlbmVyYXRpb24gb2YgY2hpbGRyZW4gd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaG91bGQgc3RpbGwgYmUgc2VydmluZyByZXF1ZXN0cy4gKi8KLX0gZ2xvYmFsX3Njb3JlOwotCi0vKiBzdHVmZiB3aGljaCB0aGUgcGFyZW50IGdlbmVyYWxseSB3cml0ZXMgYW5kIHRoZSBjaGlsZHJlbiByYXJlbHkgcmVhZCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHBpZF90IHBpZDsKLSAgICBhcF9nZW5lcmF0aW9uX3QgZ2VuZXJhdGlvbjsJLyogZ2VuZXJhdGlvbiBvZiB0aGlzIGNoaWxkICovCi0gICAgaW50IHdvcmtlcl90aHJlYWRzOwotI2lmZGVmIE9QVElNSVpFX1RJTUVPVVRTCi0gICAgdGltZV90IGxhc3RfcnRpbWU7CQkvKiB0aW1lKDApIG9mIHRoZSBsYXN0IGNoYW5nZSAqLwotICAgIHZ0aW1lX3QgbGFzdF92dGltZTsJCS8qIHRoZSBsYXN0IHZ0aW1lIHRoZSBwYXJlbnQgaGFzIHNlZW4gKi8KLSNlbmRpZgotfSBwYXJlbnRfc2NvcmU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBzaG9ydF9zY29yZSBzZXJ2ZXJzW0hBUkRfU0VSVkVSX0xJTUlUXVtIQVJEX1RIUkVBRF9MSU1JVF07Ci0gICAgcGFyZW50X3Njb3JlIHBhcmVudFtIQVJEX1NFUlZFUl9MSU1JVF07Ci0gICAgZ2xvYmFsX3Njb3JlIGdsb2JhbDsKLX0gc2NvcmVib2FyZDsKLQotI2RlZmluZSBLRVlfTEVOR1RIIDE2Ci0jZGVmaW5lIFZBTFVFX0xFTkdUSCA2NAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNoYXIga2V5W0tFWV9MRU5HVEhdOwotICAgIGNoYXIgdmFsdWVbVkFMVUVfTEVOR1RIXTsKLX0gc3RhdHVzX3RhYmxlX2VudHJ5OwotCi0jZGVmaW5lIFNUQVRVU0VTX1BFUl9DT05ORUNUSU9OIDEwCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBzdGF0dXNfdGFibGVfZW50cnkKLSAgICAgICAgdGFibGVbSEFSRF9TRVJWRVJfTElNSVQqSEFSRF9USFJFQURfTElNSVRdW1NUQVRVU0VTX1BFUl9DT05ORUNUSU9OXTsKLX0gbmV3X3Njb3JlYm9hcmQ7Ci0KLSNkZWZpbmUgU0NPUkVCT0FSRF9TSVpFCQlzaXplb2Yoc2NvcmVib2FyZCkKLSNkZWZpbmUgTkVXX1NDT1JFQk9BUkRfU0laRQlzaXplb2YobmV3X3Njb3JlYm9hcmQpCi0jaWZkZWYgVFBGCi0jZGVmaW5lIFNDT1JFQk9BUkRfTkFNRQkJIlNDT1JFQlJEIgotI2RlZmluZSBTQ09SRUJPQVJEX0ZSQU1FUwkJU0NPUkVCT0FSRF9TSVpFLzQwOTUgKyAxCi0jZW5kaWYKLQotQVBfREVDTEFSRShpbnQpIGFwX2V4aXN0c19zY29yZWJvYXJkX2ltYWdlKHZvaWQpOwotdm9pZCByZWluaXRfc2NvcmVib2FyZChhcHJfcG9vbF90ICpwKTsKLWFwcl9zdGF0dXNfdCBhcF9jbGVhbnVwX3NoYXJlZF9tZW0odm9pZCAqZCk7Ci1BUF9ERUNMQVJFKHZvaWQpIGFwX3N5bmNfc2NvcmVib2FyZF9pbWFnZSh2b2lkKTsKLQotQVBfREVDTEFSRSh2b2lkKSByZW9wZW5fc2NvcmVib2FyZChhcHJfcG9vbF90ICpwKTsKLQotYXByX2lubGluZSB2b2lkIGFwX3N5bmNfc2NvcmVib2FyZF9pbWFnZSh2b2lkKTsKLXZvaWQgaW5jcmVtZW50X2NvdW50cyhpbnQgY2hpbGRfbnVtLCBpbnQgdGhyZWFkX251bSwgcmVxdWVzdF9yZWMgKnIpOwotdm9pZCB1cGRhdGVfc2NvcmVib2FyZF9nbG9iYWwodm9pZCk7Ci1BUF9ERUNMQVJFKGludCkgZmluZF9jaGlsZF9ieV9waWQoYXByX3Byb2NfdCAqcGlkKTsKLWludCBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKGludCBjaGlsZF9udW0sIGludCB0aHJlYWRfbnVtLCBpbnQgc3RhdHVzLCByZXF1ZXN0X3JlYyAqcik7Ci12b2lkIGFwX3RpbWVfcHJvY2Vzc19yZXF1ZXN0KGludCBjaGlsZF9udW0sIGludCB0aHJlYWRfbnVtLCBpbnQgc3RhdHVzKTsKLQotCi1BUF9ERUNMQVJFX0RBVEEgZXh0ZXJuIHNjb3JlYm9hcmQgKmFwX3Njb3JlYm9hcmRfaW1hZ2U7Ci1BUF9ERUNMQVJFX0RBVEEgZXh0ZXJuIGNvbnN0IGNoYXIgKmFwX3Njb3JlYm9hcmRfZm5hbWU7Ci1BUF9ERUNMQVJFX0RBVEEgZXh0ZXJuIGludCBhcF9leHRlbmRlZF9zdGF0dXM7Ci1BUF9ERUNMQVJFX0RBVEEgYXByX3RpbWVfdCBhcF9yZXN0YXJ0X3RpbWU7Ci0KLUFQX0RFQ0xBUkVfREFUQSBleHRlcm4gYXBfZ2VuZXJhdGlvbl90IHZvbGF0aWxlIGFwX215X2dlbmVyYXRpb247Ci0KLS8qIGZvciB0aW1lX3Byb2Nlc3NfcmVxdWVzdCgpIGluIGh0dHBfbWFpbi5jICovCi0jZGVmaW5lIFNUQVJUX1BSRVFVRVNUIDEKLSNkZWZpbmUgU1RPUF9QUkVRVUVTVCAgMgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYJLyogIUFQQUNIRV9TQ09SRUJPQVJEX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbF9jZmd0cmVlLmggYi9pbmNsdWRlL3V0aWxfY2ZndHJlZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTRhMmY2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbF9jZmd0cmVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi0jaWZuZGVmIEFQX0NPTkZUUkVFX0gKLSNkZWZpbmUgQVBfQ09ORlRSRUVfSAotCi10eXBlZGVmIHN0cnVjdCBhcF9kaXJlY3RpdmVfdCB7Ci0gICAgY29uc3QgY2hhciAqZGlyZWN0aXZlOwotICAgIGNvbnN0IGNoYXIgKmFyZ3M7Ci0gICAgaW50IGxpbmVfbnVtOwotICAgIHN0cnVjdCBhcF9kaXJlY3RpdmVfdCAqbmV4dDsKLSAgICBzdHJ1Y3QgYXBfZGlyZWN0aXZlX3QgKmZpcnN0X2NoaWxkOwotICAgIHN0cnVjdCBhcF9kaXJlY3RpdmVfdCAqcGFyZW50OwotfSBhcF9kaXJlY3RpdmVfdDsKLQotYXBfZGlyZWN0aXZlX3QgKmFwX2FkZF9ub2RlKGFwX2RpcmVjdGl2ZV90ICoqcGFyZW50LCBhcF9kaXJlY3RpdmVfdCAqY3VycmVudCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfZGlyZWN0aXZlX3QgKnRvZGFkZCwgaW50IGNoaWxkKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxfY2hhcnNldC5oIGIvaW5jbHVkZS91dGlsX2NoYXJzZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVhM2YyMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxfY2hhcnNldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotI2lmbmRlZiBBUEFDSEVfVVRJTF9DSEFSU0VUX0gKLSNkZWZpbmUgQVBBQ0hFX1VUSUxfQ0hBUlNFVF9ICi0KLSNpZmRlZiBBUEFDSEVfWExBVEUKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaW5jbHVkZSAiYXByX3hsYXRlLmgiCi0KLWV4dGVybiBhcF94bGF0ZV90ICphcF9oZHJzX3RvX2FzY2lpLCAqYXBfaGRyc19mcm9tX2FzY2lpOwotZXh0ZXJuIGFwX3hsYXRlX3QgKmFwX2xvY2FsZV90b19hc2NpaSwgKmFwX2xvY2FsZV9mcm9tX2FzY2lpOwotCi0vKiBTYXZlICYgUmVzdG9yZSB0aGUgY3VycmVudCBjb252ZXJzaW9uIHNldHRpbmdzCi0gKgotICogT24gYW4gRUJDRElDIG1hY2hpbmU6Ci0gKgotICogImlucHV0IiAgbWVhbnM6IEFTQ0lJIC0+IEVCQ0RJQyAod2hlbiByZWFkaW5nIE1JTUUgSGVhZGVycyBhbmQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVVC9QT1NUIGRhdGEpCi0gKiAib3V0cHV0IiBtZWFuczogRUJDRElDIC0+IEFTQ0lJICh3aGVuIHNlbmRpbmcgTUlNRSBIZWFkZXJzIGFuZCBDaHVua3MpCi0gKgotICogT24gYW4gQVNDSUkgbWFjaGluZToKLSAqCi0gKiAgIG5vIGNvbnZlcnNpb24gb2YgaGVhZGVycywgc28gd2UgbmVlZCB0byBzZXQgdGhlIHRyYW5zbGF0aW9uIGhhbmRsZQotICogICB0byBOVUxMCi0gKi8KLQotI2RlZmluZSBBUF9QVVNIX0lOUFVUQ09OVkVSU0lPTl9TVEFURShfYnVmZiwgX25ld3gpIFwKLSAgICAgICAgYXBfeGxhdGVfdCAqc2F2ZWRfaW5wdXRfeGxhdGU7IFwKLSAgICAgICAgYXBfYmdldG9wdChfYnVmZiwgQk9fUlhMQVRFLCAmc2F2ZWRfaW5wdXRfeGxhdGUpOyBcCi0gICAgICAgIGFwX2JzZXRvcHQoX2J1ZmYsIEJPX1JYTEFURSwgJihfbmV3eCkpCi0KLSNkZWZpbmUgQVBfUE9QX0lOUFVUQ09OVkVSU0lPTl9TVEFURShfYnVmZikgXAotICAgICAgICBhcF9ic2V0b3B0KF9idWZmLCBCT19SWExBVEUsICZzYXZlZF9pbnB1dF94bGF0ZSkKLQotI2RlZmluZSBBUF9QVVNIX09VVFBVVENPTlZFUlNJT05fU1RBVEUoX2J1ZmYsIF9uZXd4KSBcCi0gICAgICAgIGFwX3hsYXRlX3QgKnNhdmVkX291dHB1dF94bGF0ZTsgXAotICAgICAgICBhcF9iZ2V0b3B0KF9idWZmLCBCT19XWExBVEUsICZzYXZlZF9vdXRwdXRfeGxhdGUpOyBcCi0gICAgICAgIGFwX2JzZXRvcHQoX2J1ZmYsIEJPX1dYTEFURSwgJihfbmV3eCkpCi0KLSNkZWZpbmUgQVBfUE9QX09VVFBVVENPTlZFUlNJT05fU1RBVEUoX2J1ZmYpIFwKLSAgICAgICAgYXBfYnNldG9wdChfYnVmZiwgQk9fV1hMQVRFLCAmc2F2ZWRfb3V0cHV0X3hsYXRlKQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgIC8qIEFQQUNIRV9YTEFURSAqLwotICAgIAotI2VuZGlmICAvKiAhQVBBQ0hFX1VUSUxfQ0hBUlNFVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxfZWJjZGljLmggYi9pbmNsdWRlL3V0aWxfZWJjZGljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMzYwZTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlsX2ViY2RpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCi0gKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAotICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqLwotCi0jaWZuZGVmIEFQQUNIRV9VVElMX0VCQ0RJQ19ICi0jZGVmaW5lIEFQQUNIRV9VVElMX0VCQ0RJQ19ICi0KLSNpZmRlZiBDSEFSU0VUX0VCQ0RJQwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpbmNsdWRlICJhcHJfeGxhdGUuaCIKLQotZXh0ZXJuIGFwX3hsYXRlX3QgKmhkcnNfdG9fYXNjaWksICpoZHJzX2Zyb21fYXNjaWk7Ci1leHRlcm4gYXBfeGxhdGVfdCAqbG9jYWxlX3RvX2FzY2lpLCAqbG9jYWxlX2Zyb21fYXNjaWk7Ci0KLWFwX3N0YXR1c190IGFwX2luaXRfZWJjZGljKGFwX3Bvb2xfdCAqKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmICAvKiBDSEFSU0VUX0VCQ0RJQyAqLwotICAgIAotI2VuZGlmICAvKiAhQVBBQ0hFX1VUSUxfRUJDRElDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbF9maWx0ZXIuaCBiL2luY2x1ZGUvdXRpbF9maWx0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJmNTY0YS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxfZmlsdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotI2lmbmRlZiBBUF9GSUxURVJfSAotI2RlZmluZSBBUF9GSUxURVJfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZmRlZiBBUFJfSEFWRV9TVERBUkdfSAotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImFwci5oIgotCi0vKgotICogRklMVEVSIENIQUlOCi0gKgotICogRmlsdGVycyBvcGVyYXRlIHVzaW5nIGEgImNoYWluaW5nIiBtZWNoYW5pc20uIFRoZSBmaWx0ZXJzIGFyZSBjaGFpbmVkCi0gKiB0b2dldGhlciBpbnRvIGEgc2VxdWVuY2UuIFdoZW4gb3V0cHV0IGlzIGdlbmVyYXRlZCwgaXQgaXMgcGFzc2VkIHRocm91Z2gKLSAqIGVhY2ggb2YgdGhlIGZpbHRlcnMgb24gdGhpcyBjaGFpbiwgdW50aWwgaXQgcmVhY2hlcyB0aGUgZW5kIChvciAiYm90dG9tIikKLSAqIGFuZCBpcyBwbGFjZWQgb250byB0aGUgbmV0d29yay4KLSAqCi0gKiBUaGUgdG9wIG9mIHRoZSBjaGFpbiwgdGhlIGNvZGUgZ2VuZXJhdGluZyB0aGUgb3V0cHV0LCBpcyB0eXBpY2FsbHkgY2FsbGVkCi0gKiBhICJjb250ZW50IGdlbmVyYXRvci4iIFRoZSBjb250ZW50IGdlbmVyYXRvcidzIG91dHB1dCBpcyBmZWQgaW50byB0aGUKLSAqIGZpbHRlciBjaGFpbiB1c2luZyB0aGUgc3RhbmRhcmQgQXBhY2hlIG91dHB1dCBtZWNoYW5pc21zOiBhcF9ycHV0cygpLAotICogYXBfcnByaW50ZigpLCBhcF9yd3JpdGUoKSwgZXRjLgotICoKLSAqIEVhY2ggZmlsdGVyIGlzIGRlZmluZWQgYnkgYSBjYWxsYmFjay4gVGhpcyBjYWxsYmFjayB0YWtlcyB0aGUgb3V0cHV0IGZyb20KLSAqIHRoZSBwcmV2aW91cyBmaWx0ZXIgKG9yIHRoZSBjb250ZW50IGdlbmVyYXRvciBpZiB0aGVyZSBpcyBubyBwcmV2aW91cwotICogZmlsdGVyKSwgb3BlcmF0ZXMgb24gaXQsIGFuZCBwYXNzZXMgdGhlIHJlc3VsdCB0byB0aGUgbmV4dCBmaWx0ZXIgaW4gdGhlCi0gKiBjaGFpbi4gVGhpcyBwYXNzLW9mZiBpcyBwZXJmb3JtZWQgdXNpbmcgdGhlIGFwX2ZjXyogZnVuY3Rpb25zLCBzdWNoIGFzCi0gKiBhcF9mY19wdXRzKCksIGFwX2ZjX3ByaW50ZigpLCBhcF9mY193cml0ZSgpLCBldGMuCi0gKgotICogV2hlbiBjb250ZW50IGdlbmVyYXRpb24gaXMgY29tcGxldGUsIHRoZSBzeXN0ZW0gd2lsbCBwYXNzIGFuICJlbmQgb2YKLSAqIHN0cmVhbSIgbWFya2VyIGludG8gdGhlIGZpbHRlciBjaGFpbi4gVGhlIGZpbHRlcnMgd2lsbCB1c2UgdGhpcyB0byBmbHVzaAotICogb3V0IGFueSBpbnRlcm5hbCBzdGF0ZSBhbmQgdG8gZGV0ZWN0IGluY29tcGxldGUgc3ludGF4IChmb3IgZXhhbXBsZSwgYW4KLSAqIHVudGVybWluYXRlZCBTU0kgZGlyZWN0aXZlKS4KLSAqLwotCi0vKiBmb3J3YXJkIGRlY2xhcmUgdGhlIGZpbHRlciB0eXBlICovCi10eXBlZGVmIHN0cnVjdCBhcF9maWx0ZXJfdCBhcF9maWx0ZXJfdDsKLQotLyoKLSAqIGFwX2ZpbHRlcl9mdW5jOgotICoKLSAqIFRoaXMgZnVuY3Rpb24gdHlwZSBpcyB1c2VkIGZvciBmaWx0ZXIgY2FsbGJhY2tzLiBJdCB3aWxsIGJlIHBhc3NlZCBhCi0gKiBwb2ludGVyIHRvICJ0aGlzIiBmaWx0ZXIsIGFuZCBhICJidWNrZXQiIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnQgdG8gYmUKLSAqIGZpbHRlcmVkLgotICoKLSAqIEluIGZpbHRlci0+Y3R4LCB0aGUgY2FsbGJhY2sgd2lsbCBmaW5kIGl0cyBjb250ZXh0LiBUaGlzIGNvbnRleHQgaXMKLSAqIHByb3ZpZGVkIGhlcmUsIHNvIHRoYXQgYSBmaWx0ZXIgbWF5IGJlIGluc3RhbGxlZCBtdWx0aXBsZSB0aW1lcywgZWFjaAotICogcmVjZWl2aW5nIGl0cyBvd24gcGVyLWluc3RhbGwgY29udGV4dCBwb2ludGVyLgotICoKLSAqIENhbGxiYWNrcyBhcmUgYXNzb2NpYXRlZCB3aXRoIGEgZmlsdGVyIGRlZmluaXRpb24sIHdoaWNoIGlzIHNwZWNpZmllZAotICogYnkgbmFtZS4gU2VlIGFwX3JlZ2lzdGVyX2ZpbHRlcigpIGZvciBzZXR0aW5nIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuCi0gKiBhIG5hbWUgZm9yIGEgZmlsdGVyIGFuZCBpdHMgYXNzb2NpYXRlZCBjYWxsYmFjayAoYW5kIG90aGVyIGluZm9ybWF0aW9uKS4KLSAqCi0gKiBUaGUgKmJ1Y2tldCBzdHJ1Y3R1cmUgKGFuZCBhbGwgdGhvc2UgcmVmZXJlbmNlZCBieSAtPm5leHQgYW5kIC0+cHJldikKLSAqIHNob3VsZCBiZSBjb25zaWRlcmVkICJjb25zdCIuIFRoZSBmaWx0ZXIgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlCi0gKiBuZXh0L3ByZXYgdG8gaW5zZXJ0L3JlbW92ZS9yZXBsYWNlIGVsZW1lbnRzIGluIHRoZSBidWNrZXQgbGlzdCwgYnV0Ci0gKiB0aGUgdHlwZXMgYW5kIHZhbHVlcyBvZiB0aGUgaW5kaXZpZHVhbCBidWNrZXRzIHNob3VsZCBub3QgYmUgYWx0ZXJlZC4KLSAqLwotdHlwZWRlZiBhcF9zdGF0dXNfdCAoKmFwX2ZpbHRlcl9mdW5jKSgpOwotCi0vKgotICogYXBfZmlsdGVyX3R5cGU6Ci0gKgotICogRmlsdGVycyBoYXZlIGRpZmZlcmVudCB0eXBlcy9jbGFzc2lmaWNhdGlvbnMuIFRoZXNlIGFyZSB1c2VkIHRvIGdyb3VwCi0gKiBhbmQgc29ydCB0aGUgZmlsdGVycyB0byBwcm9wZXJseSBzZXF1ZW5jZSB0aGVpciBvcGVyYXRpb24uCi0gKgotICogQVBfRlRZUEVfQ09OVEVOVDoKLSAqICAgICBUaGVzZSBmaWx0ZXJzIGFyZSB1c2VkIHRvIGFsdGVyIHRoZSBjb250ZW50IHRoYXQgaXMgcGFzc2VkIHRocm91Z2gKLSAqICAgICB0aGVtLiBFeGFtcGxlcyBhcmUgU1NJIG9yIFBIUC4KLSAqCi0gKiBBUF9GVFlQRV9DT05ORUNUSU9OOgotICogICAgIFRoZXNlIGZpbHRlcnMgd2lsbCBhbHRlciB0aGUgY29udGVudCwgYnV0IGluIHdheXMgdGhhdCBhcmUgbW9yZQotICogICAgIHN0cm9uZ2x5IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3V0cHV0IGNvbm5lY3Rpb24uIEV4YW1wbGVzIGFyZQotICogICAgIGNvbXByZXNzaW9uLCBjaGFyYWN0ZXIgcmVjb2RpbmcsIG9yIGNodW5rZWQgdHJhbnNmZXIgY29kaW5nLgotICoKLSAqICAgICBJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZXNlIHR5cGVzIG9mIGZpbHRlcnMgYXJlIG5vdCBhbGxvd2VkCi0gKiAgICAgaW4gYSBzdWItcmVxdWVzdC4gQSBzdWItcmVxdWVzdHMgb3V0cHV0IGNhbiBjZXJ0YWlubHkgYmUgZmlsdGVyZWQKLSAqICAgICBieSBBUF9GVFlQRV9DT05URU5UIGZpbHRlcnMsIGJ1dCBhbGwgb2YgdGhlICJmaW5hbCBwcm9jZXNzaW5nIiBpcwotICogICAgIGRldGVybWluZWQgYnkgdGhlIG1haW4gcmVxdWVzdC4KLSAqCi0gKiBUaGUgdHlwZXMgaGF2ZSBhIHBhcnRpY3VsYXIgc29ydCBvcmRlciwgd2hpY2ggYWxsb3dzIHVzIHRvIGluc2VydCB0aGVtCi0gKiBpbnRvIHRoZSBmaWx0ZXIgY2hhaW4gaW4gYSBkZXRlcm1pc3RpYyBvcmRlci4gV2l0aGluIGEgcGFydGljdWxhciBncm91cGluZywKLSAqIHRoZSBvcmRlcmluZyBpcyBlcXVpdmFsZW50IHRvIHRoZSBvcmRlciBvZiBjYWxscyB0byBhcF9hZGRfZmlsdGVyKCkuCi0gKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgQVBfRlRZUEVfQ09OVEVOVCwKLSAgICBBUF9GVFlQRV9DT05ORUNUSU9OCi19IGFwX2ZpbHRlcl90eXBlOwotCi0vKgotICogYXBfZmlsdGVyX3Q6Ci0gKgotICogVGhpcyBpcyB0aGUgcmVxdWVzdC10aW1lIGNvbnRleHQgc3RydWN0dXJlIGZvciBhbiBpbnN0YWxsZWQgZmlsdGVyIChpbgotICogdGhlIG91dHB1dCBmaWx0ZXIgY2hhaW4pLiBJdCBwcm92aWRlcyB0aGUgY2FsbGJhY2sgdG8gdXNlIGZvciBmaWx0ZXJpbmcsCi0gKiB0aGUgcmVxdWVzdCB0aGlzIGZpbHRlciBpcyBhc3NvY2lhdGVkIHdpdGggKHdoaWNoIGlzIGltcG9ydGFudCB3aGVuCi0gKiBhbiBvdXRwdXQgY2hhaW4gYWxzbyBpbmNsdWRlcyBzdWItcmVxdWVzdCBmaWx0ZXJzKSwgdGhlIGNvbnRleHQgZm9yIHRoaXMKLSAqIGluc3RhbGxlZCBmaWx0ZXIsIGFuZCB0aGUgZmlsdGVyIG9yZGVyaW5nL2NoYWluaW5nIGZpZWxkcy4KLSAqCi0gKiBGaWx0ZXIgY2FsbGJhY2tzIGFyZSBmcmVlIHRvIHVzZSAtPmN0eCBhcyB0aGV5IHBsZWFzZSwgdG8gc3RvcmUgY29udGV4dAotICogZHVyaW5nIHRoZSBmaWx0ZXIgcHJvY2Vzcy4gR2VuZXJhbGx5LCB0aGlzIGlzIHN1cGVyaW9yIG92ZXIgYXNzb2NpYXRpbmcKLSAqIHRoZSBzdGF0ZSBkaXJlY3RseSB3aXRoIHRoZSByZXF1ZXN0LiBBIGNhbGxiYWNrIHNob3VsZCBub3QgY2hhbmdlIGFueSBvZgotICogdGhlIG90aGVyIGZpZWxkcy4KLSAqLwotc3RydWN0IGFwX2ZpbHRlcl90IHsKLSAgICBhcF9maWx0ZXJfZnVuYyBmaWx0ZXJfZnVuYzsKLQotICAgIHZvaWQgKmN0eDsKLQotICAgIGFwX2ZpbHRlcl90eXBlIGZ0eXBlOwotICAgIGFwX2ZpbHRlcl90ICpuZXh0OwotfTsKLQotLyoKLSAqIGFwX3JlZ2lzdGVyX2ZpbHRlcigpOgotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWdpc3RlciBhIGZpbHRlciB3aXRoIHRoZSBzeXN0ZW0uIEFmdGVyIHRoaXMKLSAqIHJlZ2lzdHJhdGlvbiBpcyBwZXJmb3JtZWQsIHRoZW4gYSBmaWx0ZXIgbWF5IGJlIGFkZGVkIGludG8gdGhlIGZpbHRlcgotICogY2hhaW4gYnkgdXNpbmcgYXBfYWRkX2ZpbHRlcigpIGFuZCBzaW1wbHkgc3BlY2lmeWluZyB0aGUgbmFtZS4KLSAqCi0gKiBUaGUgZmlsdGVyJ3MgY2FsbGJhY2sgYW5kIHR5cGUgc2hvdWxkIGJlIHBhc3NlZC4KLSAqLwotQVBJX0VYUE9SVCh2b2lkKSBhcF9yZWdpc3Rlcl9maWx0ZXIoY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX2ZpbHRlcl9mdW5jIGZpbHRlcl9mdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfZmlsdGVyX3R5cGUgZnR5cGUpOwotCi0vKgotICogYXBfYWRkX2ZpbHRlcigpOgotICoKLSAqIEFkZHMgYSBuYW1lZCBmaWx0ZXIgaW50byB0aGUgZmlsdGVyIGNoYWluIG9uIHRoZSBzcGVjaWZpZWQgcmVxdWVzdCByZWNvcmQuCi0gKiBUaGUgZmlsdGVyIHdpbGwgYmUgaW5zdGFsbGVkIHdpdGggdGhlIHNwZWNpZmllZCBjb250ZXh0IHBvaW50ZXIuCi0gKgotICogRmlsdGVycyBhZGRlZCBpbiB0aGlzIHdheSB3aWxsIGFsd2F5cyBiZSBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsdGVycwotICogdGhhdCBoYXZlIHRoZSBzYW1lIHR5cGUgKHRodXMsIHRoZSBmaWx0ZXJzIGhhdmUgdGhlIHNhbWUgb3JkZXIgYXMgdGhlCi0gKiBjYWxscyB0byBhcF9hZGRfZmlsdGVyKS4gSWYgdGhlIGN1cnJlbnQgZmlsdGVyIGNoYWluIGNvbnRhaW5zIGZpbHRlcnMKLSAqIGZyb20gYW5vdGhlciByZXF1ZXN0LCB0aGVuIHRoaXMgZmlsdGVyIHdpbGwgYmUgYWRkZWQgYmVmb3JlIHRob3NlIG90aGVyCi0gKiBmaWx0ZXJzLgotICovCi1BUElfRVhQT1JUKHZvaWQpIGFwX2FkZF9maWx0ZXIoY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqY3R4LCByZXF1ZXN0X3JlYyAqcik7Ci0KLQotLyoKLSAqIFRoaW5ncyB0byBkbyBsYXRlcjoKLSAqIEFkZCBwYXJhbWV0ZXJzIHRvIGFwX2ZpbHRlcl9mdW5jIHR5cGUuICBUaG9zZSBwYXJhbWV0ZXJzIHdpbGwgYmUgc29tZXRoaW5nCi0gKiAgICAgbGlrZToKLSAqICAgICAgICAgKHJlcXVlc3RfcmVjICpyLCBhcF9maWx0ZXJfdCAqZmlsdGVyLCBhcF9kYXRhX2xpc3QgKnRoZV9kYXRhKQotICogICAgICBvYnZpb3VzbHksIHRoZSByZXF1ZXN0X3JlYyBpcyB0aGUgY3VycmVudCByZXF1ZXN0LCBhbmQgdGhlIGZpbHRlcgotICogICAgICBpcyB0aGUgY3VycmVudCBmaWx0ZXIgc3RhY2suICBUaGUgZGF0YV9saXN0IGlzIGEgYnVja2V0IGxpc3Qgb3IKLSAqICAgICAgYnVja2V0X2JyaWdhZGUsIGJ1dCBJIGFtIHRyeWluZyB0byBrZWVwIHRoaXMgcGF0Y2ggbmV1dHJhbC4gIChJZiB0aGlzCi0gKiAgICAgIGNvbW1lbnQgYnJlYWtzIHRoYXQsIHdlbGwgc29ycnksIGJ1dCB0aGUgaW5mb3JtYXRpb24gbXVzdCBiZSB0aGVyZQotICogICAgICBzb21ld2hlcmUuICA6LSkKLSAqCi0gKiBBZGQgYSBmdW5jdGlvbiBsaWtlIGFwX3Bhc3NfZGF0YS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBiYXNpY2FsbHkganVzdAotICogY2FsbCB0aGUgbmV4dCBmaWx0ZXIgaW4gdGhlIGNoYWluLCB1bnRpbCB0aGUgY3VycmVudCBmaWx0ZXIgaXMgTlVMTC4gIElmIHRoZQotICogY3VycmVudCBmaWx0ZXIgaXMgTlVMTCwgdGhhdCBtZWFucyB0aGF0IG5vYm9keSB3cm90ZSB0byB0aGUgbmV0d29yaywgYW5kCi0gKiB3ZSBoYXZlIGEgSFVHRSBidWcsIHNvIHdlIG5lZWQgdG8gcmV0dXJuIGFuIGVycm9yIGFuZCBsb2cgaXQgdG8gdGhlIAotICogbG9nIGZpbGUuCi0gKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgkvKiAhQVBfRklMVEVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbF9sZGFwLmggYi9pbmNsdWRlL3V0aWxfbGRhcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGRjMmVhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbF9sZGFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi0jaWZuZGVmIFVUSUxfTERBUF9ICi0jZGVmaW5lIFVUSUxfTERBUF9ICi0KLSNpbmNsdWRlIDxhcHJfbGRhcC5oPgotCi0vKiB0aGlzIHdob2xlIHRoaW5nIGRpc2FwcGVhcnMgaWYgTERBUCBpcyBub3QgZW5hYmxlZCAqLwotI2lmZGVmIEFQVV9IQVNfTERBUAotCi0vKiBBUFIgaGVhZGVyIGZpbGVzICovCi0jaW5jbHVkZSA8YXByX2xvY2suaD4KLSNpbmNsdWRlIDxhcHJfdGFibGVzLmg+Ci0jaW5jbHVkZSA8YXByX3RpbWUuaD4KLQotLyogQXBhY2hlIGhlYWRlciBmaWxlcyAqLwotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLQotCi0vKgotICogTERBUCBDb25uZWN0aW9ucwotICovCi0KLS8qIFZhbHVlcyB0aGF0IHRoZSBkZXJlZiBtZW1iZXIgY2FuIGhhdmUgKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgbmV2ZXI9TERBUF9ERVJFRl9ORVZFUiwgCi0gICAgc2VhcmNoaW5nPUxEQVBfREVSRUZfU0VBUkNISU5HLCAKLSAgICBmaW5kaW5nPUxEQVBfREVSRUZfRklORElORywgCi0gICAgYWx3YXlzPUxEQVBfREVSRUZfQUxXQVlTCi19IGRlcmVmX29wdGlvbnM7Ci0KLS8qIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgYW4gTERBUCBjb25uZWN0aW9uICovCi10eXBlZGVmIHN0cnVjdCB1dGlsX2xkYXBfY29ubmVjdGlvbl90IHsKLSAgICBMREFQICpsZGFwOwotICAgIGFwcl9sb2NrX3QgKmxvY2s7CQkJLyogTG9jayB0byBpbmRpY2F0ZSB0aGlzIGNvbm5lY3Rpb24gaXMgaW4gdXNlICovCi0gICAgaW50IGJvdW5kOwkJCQkvKiBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgdGhpcyBjb25uZWN0aW9uIGlzIGJvdW5kIHlldCAqLwotCi0gICAgY29uc3QgY2hhciAqaG9zdDsJCQkJLyogTmFtZSBvZiB0aGUgTERBUCBzZXJ2ZXIgKG9yIHNwYWNlIHNlcGFyYXRlZCBsaXN0KSAqLwotICAgIGludCBwb3J0OwkJCQkvKiBQb3J0IG9mIHRoZSBMREFQIHNlcnZlciAqLwotICAgIGRlcmVmX29wdGlvbnMgZGVyZWY7CQkvKiBob3cgdG8gaGFuZGxlIGFsaWFzIGRlcmVmZXJlbmluZyAqLwotCi0gICAgY29uc3QgY2hhciAqYmluZGRuOwkgICAgICAgICAgICAgICAgLyogRE4gdG8gYmluZCB0byBzZXJ2ZXIgKGNhbiBiZSBOVUxMKSAqLwotICAgIGNvbnN0IGNoYXIgKmJpbmRwdzsJICAgICAgICAgICAgICAgIC8qIFBhc3N3b3JkIHRvIGJpbmQgdG8gc2VydmVyIChjYW4gYmUgTlVMTCkgKi8KLQotICAgIGludCBuZXRzY2FwZXNzbDsJCQkvKiBUcnVlIGlmIHVzZSBOZXRzY2FwZSBTU0wgY29ubmVjdGlvbiAqLwotICAgIGNvbnN0IGNoYXIgKmNlcnR0ZGI7CQkJLyogUGF0aCB0byBOZXRzY2FwZSBDQSBkYXRhYmFzZSAqLwotCi0gICAgaW50IHN0YXJ0dGxzOyAgICAgICAgICAgICAgICAgCS8qIFRydWUgaWYgU3RhcnRUTFMgaXMgZW5hYmxlZCAqLwotICAgIGludCB3aXRodGxzOwkJCS8qIFRydWUgaWYgU3RhcnRUTFMgb24gdGhpcyBjb25uZWN0aW9uICovCi0KLSAgICBjb25zdCBjaGFyICpyZWFzb247CQkJLyogUmVhc29uIGZvciBhbiBlcnJvciBmYWlsdXJlICovCi0KLSAgICBzdHJ1Y3QgdXRpbF9sZGFwX2Nvbm5lY3Rpb25fdCAqbmV4dDsKLX0gdXRpbF9sZGFwX2Nvbm5lY3Rpb25fdDsKLQotLyogTERBUCBjYWNoZSBzdGF0ZSBpbmZvcm1hdGlvbiAqLyAKLXR5cGVkZWYgc3RydWN0IHV0aWxfbGRhcF9zdGF0ZV90IHsKLSAgICBhcHJfcG9vbF90ICpwb29sOwkJLyogcG9vbCBmcm9tIHdoaWNoIHRoaXMgc3RhdGUgaXMgYWxsb2NhdGVkICovCi0gICAgYXByX2xvY2tfdCAqbXV0ZXg7CQkvKiBtdXRleCBsb2NrIGZvciB0aGUgY29ubmVjdGlvbiBsaXN0ICovCi0KLSAgICBhcHJfc2l6ZV90IGNhY2hlX2J5dGVzOwkvKiBTaXplIChpbiBieXRlcykgb2Ygc2hhcmVkIG1lbW9yeSBjYWNoZSAqLwotICAgIGxvbmcgc2VhcmNoX2NhY2hlX3R0bDsJLyogVFRMIGZvciBzZWFyY2ggY2FjaGUgKi8KLSAgICBsb25nIHNlYXJjaF9jYWNoZV9zaXplOwkvKiBTaXplIChpbiBlbnRyaWVzKSBvZiBzZWFyY2ggY2FjaGUgKi8KLSAgICBsb25nIGNvbXBhcmVfY2FjaGVfdHRsOwkvKiBUVEwgZm9yIGNvbXBhcmUgY2FjaGUgKi8KLSAgICBsb25nIGNvbXBhcmVfY2FjaGVfc2l6ZTsJLyogU2l6ZSAoaW4gZW50cmllcykgb2YgY29tcGFyZSBjYWNoZSAqLwotCi0gICAgc3RydWN0IHV0aWxfbGRhcF9jb25uZWN0aW9uX3QgKmNvbm5lY3Rpb25zOwotI2lmZGVmIEFQVV9IQVNfTERBUF9ORVRTQ0FQRV9TU0wKLSAgICBpbnQgaGF2ZV9jZXJ0ZGI7Ci0jZW5kaWYKLX0gdXRpbF9sZGFwX3N0YXRlX3Q7Ci0KLQotLyoqCi0gKiBPcGVuIGEgY29ubmVjdGlvbiB0byBhbiBMREFQIHNlcnZlcgotICogQHBhcmFtIGxkYyBBIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBleHBhbmRlZCBkZXRhaWxzIG9mIHRoZSBzZXJ2ZXIKLSAqICAgICAgICAgICAgdG8gY29ubmVjdCB0by4gVGhlIGhhbmRsZSB0byB0aGUgTERBUCBjb25uZWN0aW9uIGlzIHJldHVybmVkCi0gKiAgICAgICAgICAgIGFzIGxkYy0+bGRhcC4KLSAqIEB0aXAgVGhpcyBmdW5jdGlvbiBjb25uZWN0cyB0byB0aGUgTERBUCBzZXJ2ZXIgYW5kIGJpbmRzLiBJdCBkb2VzIG5vdAotICogICAgICBjb25uZWN0IGlmIGFscmVhZHkgY29ubmVjdGVkIChsZGMtPmxkYXAgIT0gTlVMTCkuIERvZXMgbm90IGJpbmQKLSAqICAgICAgaWYgYWxyZWFkeSBib3VuZC4KLSAqIEByZXR1cm4gSWYgc3VjY2Vzc2Z1bCBMREFQX1NVQ0NFU1MgaXMgcmV0dXJuZWQuCi0gKiBAZGVmZnVuYyBpbnQgdXRpbF9sZGFwX2Nvbm5lY3Rpb25fb3Blbih1dGlsX2xkYXBfY29ubmVjdGlvbl90ICpsZGMpCi0gKi8KLWludCB1dGlsX2xkYXBfY29ubmVjdGlvbl9vcGVuKHV0aWxfbGRhcF9jb25uZWN0aW9uX3QgKmxkYyk7Ci0KLS8qKgotICogQ2xvc2UgYSBjb25uZWN0aW9uIHRvIGFuIExEQVAgc2VydmVyCi0gKiBAcGFyYW0gbGRjIEEgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIGV4cGFuZGVkIGRldGFpbHMgb2YgdGhlIHNlcnZlcgotICAgICAgICAgICAgICB0aGF0IHdhcyBjb25uZWN0ZWQuCi0gKiBAdGlwIFRoaXMgZnVuY3Rpb24gdW5iaW5kcyBmcm9tIHRoZSBMREFQIHNlcnZlciwgYW5kIGNsZWFycyBsZGMtPmxkYXAuCi0gKiAgICAgIEl0IGlzIHBvc3NpYmxlIHRvIHJlYmluZCB0byB0aGlzIHNlcnZlciBhZ2FpbiB1c2luZyB0aGUgc2FtZSBsZGMKLSAqICAgICAgc3RydWN0dXJlLCB1c2luZyBhcHJfbGRhcF9vcGVuX2Nvbm5lY3Rpb24oKS4KLSAqIEBkZWZmdW5jIHV0aWxfbGRhcF9jbG9zZV9jb25uZWN0aW9uKHV0aWxfbGRhcF9jb25uZWN0aW9uX3QgKmxkYykKLSAqLwotdm9pZCB1dGlsX2xkYXBfY29ubmVjdGlvbl9jbG9zZSh1dGlsX2xkYXBfY29ubmVjdGlvbl90ICpsZGMpOwotCi0vKioKLSAqIEZpbmQgYSBjb25uZWN0aW9uIGluIGEgbGlzdCBvZiBjb25uZWN0aW9ucwotICogQHBhcmFtIHIgVGhlIHJlcXVlc3QgcmVjb3JkCi0gKiBAcGFyYW0gaG9zdCBUaGUgaG9zdG5hbWUgdG8gY29ubmVjdCB0byAobXVsdGlwbGUgaG9zdHMgc3BhY2Ugc2VwYXJhdGVkKQotICogQHBhcmFtIHBvcnQgVGhlIHBvcnQgdG8gY29ubmVjdCB0bwotICogQHBhcmFtIGJpbmRkbiBUaGUgRE4gdG8gYmluZCB3aXRoCi0gKiBAcGFyYW0gYmluZHB3IFRoZSBwYXNzd29yZCB0byBiaW5kIHdpdGgKLSAqIEBwYXJhbSBkZXJlZiBUaGUgZGVyZWZlcmVuY2luZyBiZWhhdmlvcgotICogQHBhcmFtIG5ldHNjYXBlc3NsIFN0YXJ0IFNTTCBvbiB0aGUgY29ubmVjdGlvbiB1c2luZyBsZGFwc3NsX2NsaWVudF9pbml0KCkgWzB8MV0KLSAqIEBwYXJhbSBzdGFydHRscyBTdGFydCBUTFMgdXNpbmcgU1RBUlRUTFMgcGFyYW1ldGVyIFswfDFdCi0gKiBAdGlwIE9uY2UgYSBjb25uZWN0aW9uIGlzIGZvdW5kIGFuZCByZXR1cm5lZCwgYSBsb2NrIHdpbGwgYmUgYWNxdWlyZWQgdG8KLSAqICAgICAgbG9jayB0aGF0IHBhcnRpY3VsYXIgY29ubmVjdGlvbiwgc28gdGhhdCBhbm90aGVyIHRocmVhZCBkb2VzIG5vdCB0cnkgYW5kCi0gKiAgICAgIHVzZSB0aGlzIGNvbm5lY3Rpb24gd2hpbGUgaXQgaXMgYnVzeS4gT25jZSB5b3UgYXJlIGZpbmlzaGVkIHdpdGggYSBjb25uZWN0aW9uLAotICogICAgICBhcHJfbGRhcF9jb25uZWN0aW9uX2Nsb3NlKCkgbXVzdCBiZSBjYWxsZWQgdG8gcmVsZWFzZSB0aGlzIGNvbm5lY3Rpb24uCi0gKiBAZGVmZnVuYyB1dGlsX2xkYXBfY29ubmVjdGlvbl90ICp1dGlsX2xkYXBfY29ubmVjdGlvbl9maW5kKHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpiaW5kZG4sIGNvbnN0IGNoYXIgKmJpbmRwdywgZGVyZWZfb3B0aW9ucyBkZXJlZiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV0c2NhcGVzc2wsIGludCBzdGFydHRscykKLSAqLwotdXRpbF9sZGFwX2Nvbm5lY3Rpb25fdCAqdXRpbF9sZGFwX2Nvbm5lY3Rpb25fZmluZChyZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJpbmRkbiwgY29uc3QgY2hhciAqYmluZHB3LCBkZXJlZl9vcHRpb25zIGRlcmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV0c2NhcGVzc2wsIGludCBzdGFydHRscyk7Ci0KLQotLyoqCi0gKiBDb21wYXJlIHR3byBETnMgZm9yIHNhbWVuZXNzCi0gKiBAcGFyYW0gciBUaGUgcmVxdWVzdCByZWNvcmQKLSAqIEBwYXJhbSBsZGMgVGhlIExEQVAgY29ubmVjdGlvbiBiZWluZyB1c2VkLgotICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBMREFQIGNvbm5lY3Rpb24gLSB1c2VkIGZvciBkZWNpZGluZyB3aGljaCBjYWNoZSB0byB1c2UuCi0gKiBAcGFyYW0gZG4gVGhlIGZpcnN0IEROIHRvIGNvbXBhcmUuCi0gKiBAcGFyYW0gcmVxZG4gVGhlIEROIHRvIGNvbXBhcmUgdGhlIGZpcnN0IEROIHRvLgotICogQHBhcmFtIGNvbXBhcmVfZG5fb25fc2VydmVyIEZsYWcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIEROcyBzaG91bGQgYmUgY2hlY2tlZCB1c2luZwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQVAgY2FsbHMgb3Igd2l0aCBhIGRpcmVjdCBzdHJpbmcgY29tcGFyaXNpb24uIEEgZGlyZWN0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNvbXBhcmlzb24gaXMgZmFzdGVyLCBidXQgbm90IGFzIGFjY3VyYXRlIC0gZmFsc2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZSBjb21wYXJpc29ucyBhcmUgcG9zc2libGUuCi0gKiBAdGlwIFR3byBETnMgY2FuIGJlIGVxdWFsIGFuZCBzdGlsbCBmYWlsIGEgc3RyaW5nIGNvbXBhcmlzb24uIEVnICJkYz1leGFtcGxlLGRjPWNvbSIKLSAqICAgICAgYW5kICJkYz1leGFtcGxlLCBkYz1jb20iLiBVc2UgdGhlIGNvbXBhcmVfZG5fb25fc2VydmVyIHVubGVzcyB0aGVyZSBhcmUgc2VyaW91cwotICogICAgICBwZXJmb3JtYW5jZSBpc3N1ZXMuCi0gKiBAZGVmZnVuYyBpbnQgdXRpbF9sZGFwX2NhY2hlX2NvbXBhcmVkbihyZXF1ZXN0X3JlYyAqciwgdXRpbF9sZGFwX2Nvbm5lY3Rpb25fdCAqbGRjLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBjaGFyICpkbiwgY29uc3QgY2hhciAqcmVxZG4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcGFyZV9kbl9vbl9zZXJ2ZXIpCi0gKi8KLWludCB1dGlsX2xkYXBfY2FjaGVfY29tcGFyZWRuKHJlcXVlc3RfcmVjICpyLCB1dGlsX2xkYXBfY29ubmVjdGlvbl90ICpsZGMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBjaGFyICpkbiwgY29uc3QgY2hhciAqcmVxZG4sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBhcmVfZG5fb25fc2VydmVyKTsKLQotLyoqCi0gKiBBIGdlbmVyaWMgTERBUCBjb21wYXJlIGZ1bmN0aW9uCi0gKiBAcGFyYW0gciBUaGUgcmVxdWVzdCByZWNvcmQKLSAqIEBwYXJhbSBsZGMgVGhlIExEQVAgY29ubmVjdGlvbiBiZWluZyB1c2VkLgotICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBMREFQIGNvbm5lY3Rpb24gLSB1c2VkIGZvciBkZWNpZGluZyB3aGljaCBjYWNoZSB0byB1c2UuCi0gKiBAcGFyYW0gZG4gVGhlIEROIG9mIHRoZSBvYmplY3QgaW4gd2hpY2ggd2UgZG8gdGhlIGNvbXBhcmUuCi0gKiBAcGFyYW0gYXR0cmliIFRoZSBhdHRyaWJ1dGUgd2l0aGluIHRoZSBvYmplY3Qgd2UgYXJlIGNvbXBhcmluZyBmb3IuCi0gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgd2UgYXJlIHRyeWluZyB0byBjb21wYXJlIGZvci4gCi0gKiBAdGlwIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGF0dHJpYnV0ZS92YWx1ZSBwYWlyIGV4aXN0cyB3aXRoaW4gYW4KLSAqICAgICAgb2JqZWN0LiBUeXBpY2FsbHkgdGhpcyB3b3VsZCBiZSB1c2VkIHRvIGRldGVybWluZSBMREFQIGdyb3VwIG1lbWJlcnNoaXAuCi0gKiBAZGVmZnVuYyBpbnQgdXRpbF9sZGFwX2NhY2hlX2NvbXBhcmUocmVxdWVzdF9yZWMgKnIsIHV0aWxfbGRhcF9jb25uZWN0aW9uX3QgKmxkYywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IGNoYXIgKmRuLCBjb25zdCBjaGFyICphdHRyaWIsIGNvbnN0IGNoYXIgKnZhbHVlKQotICovCi1pbnQgdXRpbF9sZGFwX2NhY2hlX2NvbXBhcmUocmVxdWVzdF9yZWMgKnIsIHV0aWxfbGRhcF9jb25uZWN0aW9uX3QgKmxkYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IGNoYXIgKmRuLCBjb25zdCBjaGFyICphdHRyaWIsIGNvbnN0IGNoYXIgKnZhbHVlKTsKLQotLyoqCi0gKiBDaGVja3MgYSB1c2VybmFtZS9wYXNzd29yZCBjb21iaW5hdGlvbiBieSBiaW5kaW5nIHRvIHRoZSBMREFQIHNlcnZlcgotICogQHBhcmFtIHIgVGhlIHJlcXVlc3QgcmVjb3JkCi0gKiBAcGFyYW0gbGRjIFRoZSBMREFQIGNvbm5lY3Rpb24gYmVpbmcgdXNlZC4KLSAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgTERBUCBjb25uZWN0aW9uIC0gdXNlZCBmb3IgZGVjaWRpbmcgd2hpY2ggY2FjaGUgdG8gdXNlLgotICogQHBhcmFtIGJhc2VkbiBUaGUgQmFzZSBETiB0byBzZWFyY2ggZm9yIHRoZSB1c2VyIGluLgotICogQHBhcmFtIHNjb3BlIExEQVAgc2NvcGUgb2YgdGhlIHNlYXJjaC4KLSAqIEBwYXJhbSBmaWx0ZXIgVGhlIHVzZXIgdG8gc2VhcmNoIGZvciBpbiB0aGUgZm9ybSBvZiBhbiBMREFQIGZpbHRlci4gVGhpcyBmaWx0ZXIgbXVzdCByZXR1cm4KLSAqICAgICAgICAgICAgICAgZXhhY3RseSBvbmUgdXNlciBmb3IgdGhlIGNoZWNrIHRvIGJlIHN1Y2Nlc3NmdWwuCi0gKiBAcGFyYW0gYmluZHB3IFRoZSB1c2VyIHBhc3N3b3JkIHRvIGJpbmQgYXMuCi0gKiBAcGFyYW0gYmluZGRuIFRoZSBETiBvZiB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIGluIHRoaXMgdmFyaWFibGUuCi0gKiBAdGlwIFRoZSBmaWx0ZXIgc3VwcGxpZWQgd2lsbCBiZSBzZWFyY2hlZCBmb3IuIElmIGEgc2luZ2xlIGVudHJ5IGlzIHJldHVybmVkLCBhbiBhdHRlbXB0Ci0gKiAgICAgIGlzIG1hZGUgdG8gYmluZCBhcyB0aGF0IHVzZXIuIElmIHRoaXMgYmluZCBzdWNjZWVkcywgdGhlIHVzZXIgaXMgbm90IHZhbGlkYXRlZC4KLSAqIEBkZWZmdW5jIGludCB1dGlsX2xkYXBfY2FjaGVfY2hlY2t1c2VyaWQocmVxdWVzdF9yZWMgKnIsIHV0aWxfbGRhcF9jb25uZWN0aW9uX3QgKmxkYywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqdXJsLCBjb25zdCBjaGFyICpiYXNlZG4sIGludCBzY29wZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZmlsdGVyLCBjaGFyICpiaW5kcHcsIGNoYXIgKipiaW5kZG4pCi0gKi8KLWludCB1dGlsX2xkYXBfY2FjaGVfY2hlY2t1c2VyaWQocmVxdWVzdF9yZWMgKnIsIHV0aWxfbGRhcF9jb25uZWN0aW9uX3QgKmxkYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBjaGFyICpiYXNlZG4sIGludCBzY29wZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbHRlciwgY29uc3QgY2hhciAqYmluZHB3LCBjb25zdCBjaGFyICoqYmluZGRuKTsKLQotLyogZnJvbSBhcHJfbGRhcF9jYWNoZS5jICovCi0KLS8qKgotICogSW5pdCB0aGUgTERBUCBjYWNoZQotICogQHBhcmFtIHBvb2wgVGhlIHBvb2wgdG8gdXNlIHRvIGluaXRpYWxpc2UgdGhlIGNhY2hlCi0gKiBAcGFyYW0gcmVxc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgc2hhcmVkIG1lbW9yeSBzZWdlbWVudCB0byByZXF1ZXN0LiBBIHNpemUKLSAqICAgICAgICAgICAgICAgIG9mIHplcm8gcmVxdWVzdHMgdGhlIG1heCBzaXplIHBvc3NpYmxlIGZyb20KLSAqICAgICAgICAgICAgICAgIGFwcl9zaG1lbV9pbml0KCkKLSAqIEBkZWZmdW5jIHZvaWQgdXRpbF9sZGFwX2NhY2hlX2luaXQoYXByX3Bvb2xfdCAqcCkKLSAqIEByZXR1cm4gVGhlIHN0YXR1cyBjb2RlIHJldHVybmVkIGlzIHRoZSBzdGF0dXMgY29kZSBvZiB0aGUKLSAqICAgICAgICAgYXByX3NtbWVtX2luaXQoKSBjYWxsLiBSZWdhcmRsZXNzIG9mIHRoZSBzdGF0dXMsIHRoZSBjYWNoZQotICogICAgICAgICB3aWxsIGJlIHNldCB1cCBhdCBsZWFzdCBmb3IgaW4tcHJvY2VzcyBvciBpbi10aHJlYWQgb3BlcmF0aW9uLgotICovCi1hcHJfc3RhdHVzX3QgdXRpbF9sZGFwX2NhY2hlX2luaXQoYXByX3Bvb2xfdCAqcG9vbCwgYXByX3NpemVfdCByZXFzaXplKTsKLQotLyoqCi0gKiBEaXNwbGF5IGZvcm1hdHRlZCBzdGF0cyBmb3IgY2FjaGUKLSAqIEBwYXJhbSBUaGUgcG9vbCB0byBhbGxvY2F0ZSB0aGUgcmV0dXJuZWQgc3RyaW5nIGZyb20KLSAqIEB0aXAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgc3RyaW5nIGFsbG9jYXRlZCBmcm9tIHRoZSBwcm92aWRlZCBwb29sIHRoYXQgZGVzY3JpYmVzCi0gKiAgICAgIHZhcmlvdXMgc3RhdHMgYWJvdXQgdGhlIGNhY2hlLgotICogQGRlZmZ1bmMgY2hhciAqdXRpbF9hbGRfY2FjaGVfZGlzcGxheShhcHJfcG9vbF90ICpwb29sKQotICovCi1jaGFyICp1dGlsX2FsZF9jYWNoZV9kaXNwbGF5KGFwcl9wb29sX3QgKnBvb2wpOwotCi0KLS8qIGZyb20gYXByX2xkYXBfY2FjaGVfbWdyLmMgKi8KLQotLyoqCi0gKiBEaXNwbGF5IGZvcm1hdHRlZCBzdGF0cyBmb3IgY2FjaGUKLSAqIEBwYXJhbSBUaGUgcG9vbCB0byBhbGxvY2F0ZSB0aGUgcmV0dXJuZWQgc3RyaW5nIGZyb20KLSAqIEB0aXAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgc3RyaW5nIGFsbG9jYXRlZCBmcm9tIHRoZSBwcm92aWRlZCBwb29sIHRoYXQgZGVzY3JpYmVzCi0gKiAgICAgIHZhcmlvdXMgc3RhdHMgYWJvdXQgdGhlIGNhY2hlLgotICogQGRlZmZ1bmMgY2hhciAqdXRpbF9hbGRfY2FjaGVfZGlzcGxheShhcHJfcG9vbF90ICpwb29sKQotICovCi1jaGFyICp1dGlsX2FsZF9jYWNoZV9kaXNwbGF5KGFwcl9wb29sX3QgKnBvb2wpOwotCi0jZW5kaWYgLyogQVBVX0hBU19MREFQICovCi0jZW5kaWYgLyogVVRJTF9MREFQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbF9tZDUuaCBiL2luY2x1ZGUvdXRpbF9tZDUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEwZGM5Yy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxfbWQ1LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLSNpZm5kZWYgQVBBQ0hFX1VUSUxfTUQ1X0gKLSNkZWZpbmUgQVBBQ0hFX1VUSUxfTUQ1X0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaW5jbHVkZSAiYXBfbWQ1LmgiCi0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9tZDUocG9vbCAqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqc3RyaW5nKTsKLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9tZDVfYmluYXJ5KHBvb2wgKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbik7Ci1BUElfRVhQT1JUKGNoYXIgKikgYXBfbWQ1Y29udGV4dFRvNjQocG9vbCAqcCwgQVBfTUQ1X0NUWCAqIGNvbnRleHQpOwotI2lmZGVmIENIQVJTRVRfRUJDRElDCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfbWQ1ZGlnZXN0KHBvb2wgKnAsIEZJTEUgKmluZmlsZSwgaW50IGNvbnZlcnQpOwotI2Vsc2UKLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9tZDVkaWdlc3QocG9vbCAqcCwgRklMRSAqaW5maWxlKTsKLSNlbmRpZiAvKiBDSEFSU0VUX0VCQ0RJQyAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYJLyogIUFQQUNIRV9VVElMX01ENV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxfc2NyaXB0LmggYi9pbmNsdWRlL3V0aWxfc2NyaXB0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNmQ3MjkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlsX3NjcmlwdC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaWZuZGVmIEFQQUNIRV9VVElMX1NDUklQVF9ICi0jZGVmaW5lIEFQQUNIRV9VVElMX1NDUklQVF9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmbmRlZiBBUEFDSEVfQVJHX01BWAotI2lmZGVmIF9QT1NJWF9BUkdfTUFYCi0jZGVmaW5lIEFQQUNIRV9BUkdfTUFYIF9QT1NJWF9BUkdfTUFYCi0jZWxzZQotI2RlZmluZSBBUEFDSEVfQVJHX01BWCA1MTIKLSNlbmRpZgotI2VuZGlmCi0KLUFQSV9FWFBPUlQoY2hhciAqKikgYXBfY3JlYXRlX2Vudmlyb25tZW50KHBvb2wgKnAsIHRhYmxlICp0KTsKLUFQSV9FWFBPUlQoaW50KSBhcF9maW5kX3BhdGhfaW5mbyhjb25zdCBjaGFyICp1cmksIGNvbnN0IGNoYXIgKnBhdGhfaW5mbyk7Ci1BUElfRVhQT1JUKHZvaWQpIGFwX2FkZF9jZ2lfdmFycyhyZXF1ZXN0X3JlYyAqcik7Ci1BUElfRVhQT1JUKHZvaWQpIGFwX2FkZF9jb21tb25fdmFycyhyZXF1ZXN0X3JlYyAqcik7Ci1BUElfRVhQT1JUKGludCkgYXBfc2Nhbl9zY3JpcHRfaGVhZGVyX2VycihyZXF1ZXN0X3JlYyAqciwgRklMRSAqZiwgY2hhciAqYnVmZmVyKTsKLUFQSV9FWFBPUlQoaW50KSBhcF9zY2FuX3NjcmlwdF9oZWFkZXJfZXJyX2J1ZmYocmVxdWVzdF9yZWMgKnIsIEJVRkYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZmZlcik7Ci1BUElfRVhQT1JUKGludCkgYXBfc2Nhbl9zY3JpcHRfaGVhZGVyX2Vycl9jb3JlKHJlcXVlc3RfcmVjICpyLCBjaGFyICpidWZmZXIsCi0JCQkJICAgICAgIGludCAoKmdldHNmdW5jKSAoY2hhciAqLCBpbnQsIHZvaWQgKiksCi0JCQkJICAgICAgIHZvaWQgKmdldHNmdW5jX2RhdGEpOwotQVBJX0VYUE9SVCh2b2lkKSBhcF9zZW5kX3NpemUoc2l6ZV90IHNpemUsIHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlQoaW50KSBhcF9jYWxsX2V4ZWMocmVxdWVzdF9yZWMgKnIsIGNoaWxkX2luZm8gKnBpbmZvLCBjaGFyICphcmd2MCwgY2hhciAqKmVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNoZWxsY21kKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCS8qICFBUEFDSEVfVVRJTF9TQ1JJUFRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlsX3RpbWUuaCBiL2luY2x1ZGUvdXRpbF90aW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNGQwZTAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlsX3RpbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotI2lmbmRlZiBBUEFDSEVfVVRJTF9USU1FX0gKLSNkZWZpbmUgQVBBQ0hFX1VUSUxfVElNRV9ICi0KLSNpbmNsdWRlICJhcHIuaCIKLSNpbmNsdWRlICJhcHJfdGltZS5oIgotI2luY2x1ZGUgImh0dHBkLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqCi0gKiBAcGFja2FnZSBBcGFjaGUgZGF0ZS90aW1lIGhhbmRsaW5nIGZ1bmN0aW9ucwotICovCi0KLS8qIE1heGltdW0gZGVsdGEgZnJvbSB0aGUgY3VycmVudCB0aW1lLCBpbiBzZWNvbmRzLCBmb3IgYSBwYXN0IHRpbWUKLSAqIHRvIHF1YWxpZnkgYXMgInJlY2VudCIgZm9yIHVzZSBpbiB0aGUgYXBfZXhwbG9kZV9yZWNlbnRfKigpIGZ1bmN0aW9uczoKLSAqLwotI2RlZmluZSBBUF9USU1FX1JFQ0VOVF9USFJFU0hPTEQgMTUKLQotLyoqCi0gKiBjb252ZXJ0IGEgcmVjZW50IHRpbWUgdG8gaXRzIGh1bWFuIHJlYWRhYmxlIGNvbXBvbmVudHMgaW4gbG9jYWwgdGltZXpvbmUKLSAqIEBwYXJhbSB0bSB0aGUgZXhwbG9kZWQgdGltZQotICogQHBhcmFtIHQgdGhlIHRpbWUgdG8gZXhwbG9kZTogTVVTVCBiZSB3aXRoaW4gdGhlIGxhc3QKLSAqICAgICAgICAgIEFQX1RJTUVfUkVDRU5UX1RIUkVTSE9MRCBzZWNvbmRzCi0gKiBAbm90ZSBUaGlzIGlzIGEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGFwcl9leHBsb2RlX2xvY2FsdGltZSB0aGF0IHVzZXMKLSAqICAgICAgIGEgY2FjaGUgb2YgcHJlLWV4cGxvZGVkIHRpbWUgc3RydWN0dXJlcy4gIEl0IGlzIHVzZWZ1bCBmb3IgdGhpbmdzCi0gKiAgICAgICB0aGF0IG5lZWQgdG8gZXhwbG9kZSB0aGUgY3VycmVudCB0aW1lIG11bHRpcGxlIHRpbWVzIHBlciBzZWNvbmQsCi0gKiAgICAgICBsaWtlIGxvZ2dlcnMuCi0gKiBAcmV0dXJuIEFQUl9TVUNDRVNTIGlmZiBzdWNjZXNzZnVsCi0gKiBAZGVmZnVuYyBhcHJfc3RhdHVzX3QgYXBfZXhwbG9kZV9yZWNlbnRfbG9jYWx0aW1lKGFwcl9leHBsb2RlZF90aW1lX3QgKnRtLCBhcHJfdGltZV90IHQpOwotICovCi1BUF9ERUNMQVJFKGFwcl9zdGF0dXNfdCkgYXBfZXhwbG9kZV9yZWNlbnRfbG9jYWx0aW1lKGFwcl9leHBsb2RlZF90aW1lX3QgKnRtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHJfdGltZV90IHQpOwotCi0vKioKLSAqIGNvbnZlcnQgYSByZWNlbnQgdGltZSB0byBpdHMgaHVtYW4gcmVhZGFibGUgY29tcG9uZW50cyBpbiBHTVQgdGltZXpvbmUKLSAqIEBwYXJhbSB0bSB0aGUgZXhwbG9kZWQgdGltZQotICogQHBhcmFtIHQgdGhlIHRpbWUgdG8gZXhwbG9kZTogTVVTVCBiZSB3aXRoaW4gdGhlIGxhc3QKLSAqICAgICAgICAgIEFQX1RJTUVfUkVDRU5UX1RIUkVTSE9MRCBzZWNvbmRzCi0gKiBAbm90ZSBUaGlzIGlzIGEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGFwcl9leHBsb2RlX2dtdCB0aGF0IHVzZXMKLSAqICAgICAgIGEgY2FjaGUgb2YgcHJlLWV4cGxvZGVkIHRpbWUgc3RydWN0dXJlcy4gIEl0IGlzIHVzZWZ1bCBmb3IgdGhpbmdzCi0gKiAgICAgICB0aGF0IG5lZWQgdG8gZXhwbG9kZSB0aGUgY3VycmVudCB0aW1lIG11bHRpcGxlIHRpbWVzIHBlciBzZWNvbmQsCi0gKiAgICAgICBsaWtlIGxvZ2dlcnMuCi0gKiBAcmV0dXJuIEFQUl9TVUNDRVNTIGlmZiBzdWNjZXNzZnVsCi0gKiBAZGVmZnVuYyBhcHJfc3RhdHVzX3QgYXBfZXhwbG9kZV9yZWNlbnRfZ210KGFwcl9leHBsb2RlZF90aW1lX3QgKnRtLCBhcHJfdGltZV90IHQpOwotICovCi1BUF9ERUNMQVJFKGFwcl9zdGF0dXNfdCkgYXBfZXhwbG9kZV9yZWNlbnRfZ210KGFwcl9leHBsb2RlZF90aW1lX3QgKnRtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHJfdGltZV90IHQpOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAgLyogIUFQQUNIRV9VVElMX1RJTUVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlsX3htbC5oIGIvaW5jbHVkZS91dGlsX3htbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2U0NWQ0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbF94bWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi0jaWZuZGVmIFVUSUxfWE1MX0gKLSNkZWZpbmUgVVRJTF9YTUxfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImFwcl9saWIuaCIKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiAjIyMgdGhlc2Ugd2lsbCBuZWVkIHRvIG1vdmUgYXQgc29tZSBwb2ludCB0byBhIG1vcmUgbG9naWNhbCBzcG90ICovCi0KLS8qIHNpbXBsZSBzdHJ1dHVyZXMgdG8ga2VlcCBhIGxpbmtlZCBsaXN0IG9mIHBpZWNlcyBvZiB0ZXh0ICovCi10eXBlZGVmIHN0cnVjdCBhcF90ZXh0Ci17Ci0gICAgY29uc3QgY2hhciAqdGV4dDsKLSAgICBzdHJ1Y3QgYXBfdGV4dCAqbmV4dDsKLX0gYXBfdGV4dDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBhcF90ZXh0ICpmaXJzdDsKLSAgICBhcF90ZXh0ICpsYXN0OwotfSBhcF90ZXh0X2hlYWRlcjsKLQotQVBJX0VYUE9SVCh2b2lkKSBhcF90ZXh0X2FwcGVuZChhcF9wb29sX3QgKnAsIGFwX3RleHRfaGVhZGVyICpoZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRleHQpOwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qKgotKiogWE1MIFBBUlNJTkcKLSovCi0KLS8qCi0qKiBRdWFsaWZpZWQgbmFtZXNwYWNlIHZhbHVlcwotKioKLSoqIEFQX1hNTF9OU19EQVZfSUQKLSoqICAgIFdlIGFsd2F5cyBpbnNlcnQgdGhlICJEQVY6IiBuYW1lc3BhY2UgVVJJIGF0IHRoZSBoZWFkIG9mIHRoZQotKiogICAgbmFtZXNwYWNlIGFycmF5LiBUaGlzIG1lYW5zIHRoYXQgaXQgd2lsbCBhbHdheXMgYmUgYXQgSUQ9PTAsCi0qKiAgICBtYWtpbmcgaXQgbXVjaCBlYXNpZXIgdG8gdGVzdCBmb3IuCi0qKgotKiogQVBfWE1MX05TX05PTkUKLSoqICAgIFRoaXMgc3BlY2lhbCBJRCBpcyB1c2VkIGZvciB0d28gc2l0dWF0aW9uczoKLSoqCi0qKiAgICAxKSBUaGUgbmFtZXNwYWNlIHByZWZpeCBiZWdpbnMgd2l0aCAieG1sIiAoYW5kIHdlIGRvIG5vdCBrbm93Ci0qKiAgICAgICB3aGF0IGl0IG1lYW5zKS4gTmFtZXNwYWNlIHByZWZpeGVzIHdpdGggInhtbCIgKGFueSBjYXNlKSBhcwotKiogICAgICAgdGhlaXIgZmlyc3QgdGhyZWUgY2hhcmFjdGVycyBhcmUgcmVzZXJ2ZWQgYnkgdGhlIFhNTCBOYW1lc3BhY2VzCi0qKiAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBmdXR1cmUgdXNlLiBtb2RfZGF2IHdpbGwgcGFzcyB0aGVzZSB0aHJvdWdoCi0qKiAgICAgICB1bmNoYW5nZWQuIFdoZW4gdGhpcyBpZGVudGlmaWVyIGlzIHVzZWQsIHRoZSBwcmVmaXggaXMgTEVGVCBpbgotKiogICAgICAgdGhlIGVsZW1lbnQvYXR0cmlidXRlIG5hbWUuIERvd25zdHJlYW0gcHJvY2Vzc2luZyBzaG91bGQgbm90Ci0qKiAgICAgICBwcmVwZW5kIGFub3RoZXIgcHJlZml4LgotKioKLSoqICAgIDIpIFRoZSBlbGVtZW50L2F0dHJpYnV0ZSBkb2VzIG5vdCBoYXZlIGEgbmFtZXNwYWNlLgotKioKLSoqICAgICAgIGEpIE5vIHByZWZpeCB3YXMgdXNlZCwgYW5kIGEgZGVmYXVsdCBuYW1lc3BhY2UgaGFzIG5vdCBiZWVuCi0qKiAgICAgICAgICBkZWZpbmVkLgotKiogICAgICAgYikgTm8gcHJlZml4IHdhcyB1c2VkLCBhbmQgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIHdhcyBzcGVjaWZpZWQKLSoqICAgICAgICAgIHRvIG1lYW4gIm5vIG5hbWVzcGFjZSIuIFRoaXMgaXMgZG9uZSB3aXRoIGEgbmFtZXNwYWNlCi0qKiAgICAgICAgICBkZWNsYXJhdGlvbiBvZjogIHhtbG5zPSIiCi0qKiAgICAgICAgICAodGhpcyBkZWNsYXJhdGlvbiBpcyB0eXBpY2FsbHkgdXNlZCB0byBvdmVycmlkZSBhIHByZXZpb3VzCi0qKiAgICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciB0aGUgZGVmYXVsdCBuYW1lc3BhY2UpCi0qKgotKiogICAgICAgSW4gdGhlc2UgY2FzZXMsIHdlIG5lZWQgdG8gcmVjb3JkIHRoYXQgdGhlIGVsZW0vYXR0ciBoYXMgbm8KLSoqICAgICAgIG5hbWVzcGFjZSBzbyB0aGF0IHdlIHdpbGwgbm90IGF0dGVtcHQgdG8gcHJlcGVuZCBhIHByZWZpeC4KLSoqICAgICAgIEFsbCBuYW1lc3BhY2VzIHRoYXQgYXJlIHVzZWQgd2lsbCBoYXZlIGEgcHJlZml4IGFzc2lnbmVkIHRvCi0qKiAgICAgICB0aGVtIC0tIG1vZF9kYXYgd2lsbCBuZXZlciBzZXQgb3IgdXNlIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotKiogICAgICAgd2hlbiBnZW5lcmF0aW5nIFhNTC4gVGhpcyBtZWFucyB0aGF0ICJubyBwcmVmaXgiIHdpbGwgYWx3YXlzCi0qKiAgICAgICBtZWFuICJubyBuYW1lc3BhY2UiLgotKioKLSoqICAgIEluIGJvdGggY2FzZXMsIHRoZSBYTUwgZ2VuZXJhdGlvbiB3aWxsIGF2b2lkIHByZXBlbmRpbmcgYSBwcmVmaXguCi0qKiAgICBGb3IgdGhlIGZpcnN0IGNhc2UsIHRoaXMgbWVhbnMgdGhlIG9yaWdpbmFsIHByZWZpeC9uYW1lIHdpbGwgYmUKLSoqICAgIGluc2VydGVkIGludG8gdGhlIG91dHB1dCBzdHJlYW0uIEZvciB0aGUgbGF0dGVyIGNhc2UsIGl0IG1lYW5zCi0qKiAgICB0aGUgbmFtZSB3aWxsIGhhdmUgbm8gcHJlZml4LCBhbmQgc2luY2Ugd2UgbmV2ZXIgZGVmaW5lIGEgZGVmYXVsdAotKiogICAgbmFtZXNwYWNlLCB0aGlzIG1lYW5zIGl0IHdpbGwgaGF2ZSBubyBuYW1lc3BhY2UuCi0qKgotKiogTm90ZTogY3VycmVudGx5LCBtb2RfZGF2IHVuZGVyc3RhbmRzIHRoZSAieG1sbnMiIHByZWZpeCBhbmQgdGhlCi0qKiAgICAgInhtbDpsYW5nIiBhdHRyaWJ1dGUuIFRoZXNlIGFyZSBoYW5kbGVkIHNwZWNpYWxseSAodGhleSBhcmVuJ3QKLSoqICAgICBsZWZ0IHdpdGhpbiB0aGUgWE1MIHRyZWUpLCBzbyB0aGUgQVBfWE1MX05TX05PTkUgdmFsdWUgd29uJ3QgZXZlcgotKiogICAgIHJlYWxseSBhcHBseSB0byB0aGVzZSB2YWx1ZXMuCi0qLwotI2RlZmluZSBBUF9YTUxfTlNfREFWX0lECTAJLyogbmFtZXNwYWNlIElEIGZvciAiREFWOiIgKi8KLSNkZWZpbmUgQVBfWE1MX05TX05PTkUJCS0xMAkvKiBubyBuYW1lc3BhY2UgZm9yIHRoaXMgZWxlbS9hdHRyICovCi0KLSNkZWZpbmUgQVBfWE1MX05TX0VSUk9SX0JBU0UJLTEwMAkvKiB1c2VkIG9ubHkgZHVyaW5nIHByb2Nlc3NpbmcgKi8KLSNkZWZpbmUgQVBfWE1MX05TX0lTX0VSUk9SKGUpCSgoZSkgPD0gQVBfWE1MX05TX0VSUk9SX0JBU0UpCi0KLS8qCi0qKiBhcF94bWxfZG9jOiBob2xkcyBhIHBhcnNlZCBYTUwgZG9jdW1lbnQKLSoqIGFwX3htbF9lbGVtOiBob2xkcyBhIHBhcnNlZCBYTUwgZWxlbWVudAotKiogYXBfeG1sX2F0dHI6IGhvbGRzIGEgcGFyc2VkIFhNTCBhdHRyaWJ1dGUKLSovCi0KLXR5cGVkZWYgc3RydWN0IGFwX3htbF9hdHRyCi17Ci0gICAgY29uc3QgY2hhciAqbmFtZTsJCQkvKiBhdHRyaWJ1dGUgbmFtZSAqLwotICAgIGludCBuczsJCQkJLyogaW5kZXggaW50byBuYW1lc3BhY2UgYXJyYXkgKi8KLQotICAgIGNvbnN0IGNoYXIgKnZhbHVlOwkJCS8qIGF0dHJpYnV0ZSB2YWx1ZSAqLwotCi0gICAgc3RydWN0IGFwX3htbF9hdHRyICpuZXh0OwkJLyogbmV4dCBhdHRyaWJ1dGUgKi8KLX0gYXBfeG1sX2F0dHI7Ci0KLXR5cGVkZWYgc3RydWN0IGFwX3htbF9lbGVtCi17Ci0gICAgY29uc3QgY2hhciAqbmFtZTsJCQkvKiBlbGVtZW50IG5hbWUgKi8KLSAgICBpbnQgbnM7CQkJCS8qIGluZGV4IGludG8gbmFtZXNwYWNlIGFycmF5ICovCi0gICAgY29uc3QgY2hhciAqbGFuZzsJCQkvKiB4bWw6bGFuZyBmb3IgYXR0cnMvY29udGVudHMgKi8KLQotICAgIGFwX3RleHRfaGVhZGVyIGZpcnN0X2NkYXRhOwkvKiBjZGF0YSByaWdodCBhZnRlciBzdGFydCB0YWcgKi8KLSAgICBhcF90ZXh0X2hlYWRlciBmb2xsb3dpbmdfY2RhdGE7CS8qIGNkYXRhIGFmdGVyIE1ZIGVuZCB0YWcgKi8KLQotICAgIHN0cnVjdCBhcF94bWxfZWxlbSAqcGFyZW50OwkvKiBwYXJlbnQgZWxlbWVudCAqLwotICAgIHN0cnVjdCBhcF94bWxfZWxlbSAqbmV4dDsJCS8qIG5leHQgKHNpYmxpbmcpIGVsZW1lbnQgKi8KLSAgICBzdHJ1Y3QgYXBfeG1sX2VsZW0gKmZpcnN0X2NoaWxkOwkvKiBmaXJzdCBjaGlsZCBlbGVtZW50ICovCi0gICAgc3RydWN0IGFwX3htbF9hdHRyICphdHRyOwkJLyogZmlyc3QgYXR0cmlidXRlICovCi0KLSAgICAvKiB1c2VkIG9ubHkgZHVyaW5nIHBhcnNpbmcgKi8KLSAgICBzdHJ1Y3QgYXBfeG1sX2VsZW0gKmxhc3RfY2hpbGQ7CS8qIGxhc3QgY2hpbGQgZWxlbWVudCAqLwotICAgIHN0cnVjdCBhcF94bWxfbnNfc2NvcGUgKm5zX3Njb3BlOwkvKiBuYW1lc3BhY2VzIHNjb3BlZCBieSB0aGlzIGVsZW0gKi8KLQotICAgIC8qIHVzZWQgYnkgbW9kdWxlcyBkdXJpbmcgcmVxdWVzdCBwcm9jZXNzaW5nICovCi0gICAgdm9pZCAqcHJpdmF0ZTsKLX0gYXBfeG1sX2VsZW07Ci0KLSNkZWZpbmUgQVBfWE1MX0VMRU1fSVNfRU1QVFkoZSkJKChlKS0+Zmlyc3RfY2hpbGQgPT0gTlVMTCAmJiBcCi0JCQkJIChlKS0+Zmlyc3RfY2RhdGEuZmlyc3QgPT0gTlVMTCkKLQotdHlwZWRlZiBzdHJ1Y3QgYXBfeG1sX2RvYwotewotICAgIGFwX3htbF9lbGVtICpyb290OwkJLyogcm9vdCBlbGVtZW50ICovCi0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKm5hbWVzcGFjZXM7CS8qIGFycmF5IG9mIG5hbWVzcGFjZXMgdXNlZCAqLwotfSBhcF94bWxfZG9jOwotCi1BUElfRVhQT1JUKGludCkgYXBfeG1sX3BhcnNlX2lucHV0KHJlcXVlc3RfcmVjICpyLCBhcF94bWxfZG9jICoqcGRvYyk7Ci0KLQotLyogQ29udmVydHMgYW4gWE1MIGVsZW1lbnQgdHJlZSB0byBmbGF0IHRleHQgKi8KLUFQSV9FWFBPUlQodm9pZCkgYXBfeG1sX3RvX3RleHQoYXBfcG9vbF90ICpwLCBjb25zdCBhcF94bWxfZWxlbSAqZWxlbSwKLQkJCQlpbnQgc3R5bGUsIGFwX2FycmF5X2hlYWRlcl90ICpuYW1lc3BhY2VzLAotCQkJCWludCAqbnNfbWFwLCBjb25zdCBjaGFyICoqcGJ1Ziwgc2l6ZV90ICpwc2l6ZSk7Ci0KLS8qIHN0eWxlIGFyZ3VtZW50IHZhbHVlczogKi8KLSNkZWZpbmUgQVBfWE1MX1gyVF9GVUxMCQkwCS8qIHN0YXJ0IHRhZywgY29udGVudHMsIGVuZCB0YWcgKi8KLSNkZWZpbmUgQVBfWE1MX1gyVF9JTk5FUiAJMQkvKiBjb250ZW50cyBvbmx5ICovCi0jZGVmaW5lIEFQX1hNTF9YMlRfTEFOR19JTk5FUgkyCS8qIHhtbDpsYW5nICsgaW5uZXIgY29udGVudHMgKi8KLSNkZWZpbmUgQVBfWE1MX1gyVF9GVUxMX05TX0xBTkcJMwkvKiBGVUxMICsgbnMgZGVmbnMgKyB4bWw6bGFuZyAqLwotCi1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfeG1sX2VtcHR5X2VsZW0oYXBfcG9vbF90ICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFwX3htbF9lbGVtICplbGVtKTsKLQotQVBJX0VYUE9SVChjb25zdCBjaGFyICopIGFwX3htbF9xdW90ZV9zdHJpbmcoYXBfcG9vbF90ICpwLCBjb25zdCBjaGFyICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1b3Rlcyk7Ci1BUElfRVhQT1JUKHZvaWQpIGFwX3htbF9xdW90ZV9lbGVtKGFwX3Bvb2xfdCAqcCwgYXBfeG1sX2VsZW0gKmVsZW0pOwotCi0vKiBtYW5hZ2UgYW4gYXJyYXkgb2YgdW5pcXVlIFVSSXM6IGFwX3htbF9pbnNlcnRfdXJpKCkgYW5kIEFQX1hNTF9VUklfSVRFTSgpICovCi0KLS8qIHJldHVybiB0aGUgVVJJJ3MgKGV4aXN0aW5nKSBpbmRleCwgb3IgaW5zZXJ0IGl0IGFuZCByZXR1cm4gYSBuZXcgaW5kZXggKi8KLUFQSV9FWFBPUlQoaW50KSBhcF94bWxfaW5zZXJ0X3VyaShhcF9hcnJheV9oZWFkZXJfdCAqdXJpX2FycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSk7Ci0jZGVmaW5lIEFQX1hNTF9HRVRfVVJJX0lURU0oYXJ5LCBpKSAgICAoKChjb25zdCBjaGFyICogY29uc3QgKikoYXJ5KS0+ZWx0cylbaV0pCi0KLSNlbmRpZiAvKiBVVElMX1hNTF9IICovCmRpZmYgLS1naXQgYS9saWJodHRwZC5kc3AgYi9saWJodHRwZC5kc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NjRjZWUuLjAwMDAwMDAKLS0tIGEvbGliaHR0cGQuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iQXBhY2hlQ29yZURsbCIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyCi0KLUNGRz1BcGFjaGVDb3JlRGxsIC0gV2luMzIgUmVsZWFzZQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJBcGFjaGVDb3JlRGxsLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiQXBhY2hlQ29yZURsbC5tYWsiIENGRz0iQXBhY2hlQ29yZURsbCAtIFdpbjMyIFJlbGVhc2UiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAiQXBhY2hlQ29yZURsbCAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgIkFwYWNoZUNvcmVEbGwgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLU1UTD1taWRsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJBcGFjaGVDb3JlRGxsIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIi5cQ29yZVIiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXENvcmVSIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIi5cQ29yZVIiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxDb3JlUiIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvTzIgL0kgIi5caW5jbHVkZSIgL0kgIi5cbGliXGFwclxpbmNsdWRlIiAvSSAiLlxvc1x3aW4zMiIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJBUElfRVhQT1JUX1NZTUJPTFMiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvR1ggL08yIC9JICIuXGluY2x1ZGUiIC9JICIuXGxpYlxhcHJcaW5jbHVkZSIgL0kgIi5cb3Ncd2luMzIiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiQVBJX0VYUE9SVF9TWU1CT0xTIiAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGFkdmFwaTMyLmxpYiB3czJfMzIubGliIG1zd3NvY2subGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvbWFjaGluZTpJMzg2IC9iYXNlOkAib3Ncd2luMzJcQmFzZUFkZHIucmVmIixBcGFjaGVDb3JlCi0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgYWR2YXBpMzIubGliIHdzMl8zMi5saWIgbXN3c29jay5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9tYWNoaW5lOkkzODYgL291dDoiLlxDb3JlUi9BcGFjaGVDb3JlLmRsbCIgL2Jhc2U6QCJvc1x3aW4zMlxCYXNlQWRkci5yZWYiLEFwYWNoZUNvcmUKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFwYWNoZUNvcmVEbGwgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIi5cQ29yZUQiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXENvcmVEIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIi5cQ29yZUQiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxDb3JlRCIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTURkIC9XMyAvR1ggL1pJIC9PZCAvSSAiLlxpbmNsdWRlIiAvSSAiLlxsaWJcYXByXGluY2x1ZGUiIC9JICIuXG9zXHdpbjMyIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIkFQSV9FWFBPUlRfU1lNQk9MUyIgL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTURkIC9XMyAvR1ggL1pJIC9PZCAvSSAiLlxpbmNsdWRlIiAvSSAiLlxsaWJcYXByXGluY2x1ZGUiIC9JICIuXG9zXHdpbjMyIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIkFQSV9FWFBPUlRfU1lNQk9MUyIgL0ZEIC9jCi0jIFNVQlRSQUNUIENQUCAvWVgKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGFkdmFwaTMyLmxpYiB3czJfMzIubGliIG1zd3NvY2subGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvZGVidWcgL21hY2hpbmU6STM4NiAvYmFzZTpAIm9zXHdpbjMyXEJhc2VBZGRyLnJlZiIsQXBhY2hlQ29yZQotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGFkdmFwaTMyLmxpYiB3czJfMzIubGliIG1zd3NvY2subGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiIuXENvcmVEL0FwYWNoZUNvcmUuZGxsIiAvYmFzZTpAIm9zXHdpbjMyXEJhc2VBZGRyLnJlZiIsQXBhY2hlQ29yZQotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAiQXBhY2hlQ29yZURsbCAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgIkFwYWNoZUNvcmVEbGwgLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cb3Ncd2luMzJcQXBhY2hlQ29yZS5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxBcGFjaGVDb3JlLmRlZgotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvbW9kdWxlcy8uY3ZzaWdub3JlIGIvbW9kdWxlcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2M3YTdjLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1ha2VmaWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL01ha2VmaWxlLmluIGIvbW9kdWxlcy9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE4YTgyMi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCi1ERVBUSCAgICAgPSAuLgotdG9wc3JjZGlyID0gQHRvcHNyY2RpckAKLXNyY2RpciAgICA9IEBzcmNkaXJACi1WUEFUSCAgICAgPSBAc3JjZGlyQAotCi1TVUJESVJTID0gbXBtICQoTU9EVUxFX0RJUlMpCi0KLWluY2x1ZGUgJCh0b3BzcmNkaXIpL2J1aWxkL3J1bGVzLm1rCi0KZGlmZiAtLWdpdCBhL21vZHVsZXMvTldHTlVtYWtlZmlsZSBiL21vZHVsZXMvTldHTlVtYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EzNjI5MS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL05XR05VbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jCi0jIERlY2xhcmUgdGhlIHN1Yi1kaXJlY3RvcmllcyB0byBiZSBidWlsdCBoZXJlCi0jCi0KLVNVQkRJUlMgPSBcCi0JYWFhIFwKLQlkYXZcbWFpbiBcCi0JZGF2XGZzIFwKLQllY2hvIFwKLQlnZW5lcmF0b3JzIFwKLQltYXBwZXJzIFwKLQltZXRhZGF0YSBcCi0JcHJveHkgXAotCSQoRU9MSVNUKSAKLQotIwotIyBHZXQgdGhlICdoZWFkJyBvZiB0aGUgYnVpbGQgZW52aXJvbm1lbnQuICBUaGlzIGluY2x1ZGVzIGRlZmF1bHQgdGFyZ2V0cyBhbmQKLSMgcGF0aHMgdG8gdG9vbHMKLSMKLQotaW5jbHVkZSAkKEFQX1dPUkspXGJ1aWxkXE5XR05VaGVhZC5pbmMKLQotIwotIyBidWlsZCB0aGlzIGxldmVsJ3MgZmlsZXMKLQotaWZlcSAiJCh3aWxkY2FyZCBOV0dOVW1ha2VmaWxlLm1haykiICJOV0dOVW1ha2VmaWxlLm1hayIgCi1pbmNsdWRlIE5XR05VbWFrZWZpbGUubWFrCi1lbmRpZgotCi0jCi0jIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IGlmIGFsbCB0aGF0IGlzIG5lZWRlZCBpcyB0byBjb3B5IGZpbGVzIHRvIHRoZQotIyBpbnN0YWxsYXRpb24gYXJlYQotIwotaW5zdGFsbCA6OiBubG1zIEZPUkNFCi0JCmRpZmYgLS1naXQgYS9tb2R1bGVzL1JFQURNRSBiL21vZHVsZXMvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjI1ZjA1Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotVGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIHRoaXMgbGV2ZWwgaXMgYXMgZm9sbG93czoKLQotc3RhbmRhcmQvCi0KLSAgSW4gdGhpcyBkaXJlY3RvcnkgYXJlIHRoZSBzdGFuZGFyZCBzdXBwb3J0ZWQgbW9kdWxlcyBmb3IgCi0gIEFwYWNoZS4gIE5vdCBhbGwgYXJlIGNvbXBpbGVkIGJ5IGRlZmF1bHQuCi0KLXByb3h5LwotCi0gIFRoaXMgaG91c2VzIHRoZSBjb2RlIGZvciB0aGUgcHJveHkgbW9kdWxlIGZvciBBcGFjaGUuCi0KLWV4cGVyaW1lbnRhbC8KLQotICBJbiB0aGlzIGRpcmVjdG9yeSB3ZSd2ZSBwbGFjZWQgc29tZSBtb2R1bGVzIHdoaWNoIHdlIHRoaW5rCi0gIHByb3ZpZGUgc29tZSBwcmV0dHkgaW50ZXJlc3RpbmcgZnVuY3Rpb25hbGl0eSwgYnV0IHdoaWNoCi0gIGFyZSBzdGlsbCBpbiB0aGUgZWFybHkgc3RhZ2VzIG9mIGRldmVsb3BtZW50IGFuZCBjb3VsZAotICBldm9sdmUgcmFkaWNhbGx5IGluIHRoZSBmdXR1cmUuICBUaGlzIGNvZGUgaXNuJ3Qgc3VwcG9ydGVkCi0gIG9mZmljaWFsbHkuCi0KLWV4dHJhLwotCi0gIFRoaXMgaXMgdGhlIGRpcmVjdG9yeSBmb3IgdGhpcmQtcGFydHkgbW9kdWxlcywgc3VjaCBhcyBtb2RfanNlcnYuCi0KLXRlc3QvCi0KLSAgVGhpcyBkaXJlY3RvcnkgaG91c2VzIG1vZHVsZXMgd2hpY2ggdGVzdCB2YXJpb3VzIGNvbXBvbmVudHMgCi0gIG9mIEFwYWNoZS4gIFlvdSBzaG91bGQgbm90IGNvbXBpbGUgdGhlc2UgaW50byBhIHByb2R1Y3Rpb24KLSAgc2VydmVyLiAgCi0KLWV4YW1wbGUvCi0KLSAgVGhpcyBkaXJlY3RvcnkgaG91c2VzIGV4YW1wbGUgbW9kdWxlcywgdG8gaGVscCBtb2R1bGUgYXV0aG9ycwotICBmaWd1cmUgdGhlaXIgd2F5IGFyb3VuZCB0aGUgQXBhY2hlIEFQSSBhbmQgbW9kdWxlIGNvbmNlcHQuCi0KZGlmZiAtLWdpdCBhL21vZHVsZXMvYWFhLy5jdnNpZ25vcmUgYi9tb2R1bGVzL2FhYS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzY5MDYyLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvYWFhLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLU1ha2VmaWxlCi0qLmxvCi0qLnNvCi0qLmRsbAotKi5kZWYKLSouZXhwCmRpZmYgLS1naXQgYS9tb2R1bGVzL2FhYS8uaW5kZW50LnBybyBiL21vZHVsZXMvYWFhLy5pbmRlbnQucHJvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWZiZTlmLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvYWFhLy5pbmRlbnQucHJvCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLWk0IC1ucHNsIC1kaTAgLWJyIC1uY2UgLWQwIC1jbGkwIC1ucGNzIC1uZmMxCi0tVEJVRkYKLS1URklMRQotLVRUUkFOUwotLVRVSU5UNAotLVRfdHJhbnMKLS1UYWxsb3dfb3B0aW9uc190Ci0tVGFwYWNoZV9zZmlvCi0tVGFycmF5X2hlYWRlcgotLVRib29sX2ludAotLVRidWZfYXJlYQotLVRidWZmX3N0cnVjdAotLVRidWZmeQotLVRjbWRfaG93Ci0tVGNtZF9wYXJtcwotLVRjb21tYW5kX3JlYwotLVRjb21tYW5kX3N0cnVjdAotLVRjb25uX3JlYwotLVRjb3JlX2Rpcl9jb25maWcKLS1UY29yZV9zZXJ2ZXJfY29uZmlnCi0tVGRpcl9tYWtlcl9mdW5jCi0tVGV2ZW50Ci0tVGdsb2JhbHNfcwotLVRoYW5kbGVyX2Z1bmMKLS1UaGFuZGxlcl9yZWMKLS1Uam9ibGlzdF9zCi0tVGxpc3Rlbl9yZWMKLS1UbWVyZ2VyX2Z1bmMKLS1UbW9kZV90Ci0tVG1vZHVsZQotLVRtb2R1bGVfc3RydWN0Ci0tVG11dGV4Ci0tVG5fbG9uZwotLVRvdGhlcl9jaGlsZF9yZWMKLS1Ub3ZlcnJpZGVzX3QKLS1UcGFyZW50X3Njb3JlCi0tVHBpZF90Ci0tVHBpcGVkX2xvZwotLVRwb29sCi0tVHJlcXVlc3RfcmVjCi0tVHJlcXVpcmVfbGluZQotLVRybGltX3QKLS1Uc2NvcmVib2FyZAotLVRzZW1hcGhvcmUKLS1Uc2VydmVyX2FkZHJfcmVjCi0tVHNlcnZlcl9yZWMKLS1Uc2VydmVyX3JlY19jaGFpbgotLVRzaG9ydF9zY29yZQotLVR0YWJsZQotLVR0YWJsZV9lbnRyeQotLVR0aHJlYWQKLS1UdV93aWRlX2ludAotLVR2dGltZV90Ci0tVHdpZGVfaW50CmRpZmYgLS1naXQgYS9tb2R1bGVzL2FhYS9NYWtlZmlsZS5pbiBiL21vZHVsZXMvYWFhL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2QzYzE5Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvYWFhL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0KLURFUFRIICAgICA9IC4uLy4uCi10b3BzcmNkaXIgPSBAdG9wc3JjZGlyQAotc3JjZGlyICAgID0gQHNyY2RpckAKLVZQQVRIICAgICA9IEBzcmNkaXJACi0KLWluY2x1ZGUgJCh0b3BzcmNkaXIpL2J1aWxkL3NwZWNpYWwubWsKLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9hYWEvTldHTlVtYWtlZmlsZSBiL21vZHVsZXMvYWFhL05XR05VbWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzJjNzMuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9hYWEvTldHTlVtYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0jCi0jIERlY2xhcmUgdGhlIHN1Yi1kaXJlY3RvcmllcyB0byBiZSBidWlsdCBoZXJlCi0jCi0KLVNVQkRJUlMgPSBcCi0JJChFT0xJU1QpIAotCi0jCi0jIEdldCB0aGUgJ2hlYWQnIG9mIHRoZSBidWlsZCBlbnZpcm9ubWVudC4gIFRoaXMgaW5jbHVkZXMgZGVmYXVsdCB0YXJnZXRzIGFuZAotIyBwYXRocyB0byB0b29scwotIwotCi1pbmNsdWRlICQoQVBfV09SSylcYnVpbGRcTldHTlVoZWFkLmluYwotCi0jCi0jIGJ1aWxkIHRoaXMgbGV2ZWwncyBmaWxlcwotCi0jCi0jIE1ha2Ugc3VyZSBhbGwgbmVlZGVkIG1hY3JvJ3MgYXJlIGRlZmluZWQKLSMKLQotIwotIyBUaGVzZSBkaXJlY3RvcmllcyB3aWxsIGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGluY2x1ZGUgbGlzdCwgZm9sbG93ZWQgYnkKLSMgSU5DRElSUwotIwotWElOQ0RJUlMJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZmxhZ3Mgd2lsbCBjb21lIGFmdGVyIENGTEFHUwotIwotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZGVmaW5lcyB3aWxsIGNvbWUgYWZ0ZXIgREVGSU5FUwotIwotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZmxhZ3Mgd2lsbCBiZSBhZGRlZCB0byB0aGUgbGluay5vcHQgZmlsZQotIwotWExGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgdmFsdWVzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGNvcnJlY3QgdmFyaWFibGVzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZgotIyBSRUxFQVNFCi0jCi1pZmVxICIkKFJFTEVBU0UpIiAiZGVidWciCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCSAgIAkkKEVPTElTVCkKLWVuZGlmCi0KLWlmZXEgIiQoUkVMRUFTRSkiICJub29wdCIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJICAgCSQoRU9MSVNUKQotZW5kaWYKLQotaWZlcSAiJChSRUxFQVNFKSIgInJlbGVhc2UiCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLWVuZGlmCi0KLSMKLSMgVGhlc2UgYXJlIHVzZWQgYnkgdGhlIGxpbmsgdGFyZ2V0IGlmIGFuIE5MTSBpcyBiZWluZyBnZW5lcmF0ZWQKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rICduYW1lJyBkaXJlY3RpdmUgdG8gbmFtZSB0aGUgbmxtLiAgSWYgbGVmdCBibGFuawotIyBUQVJHRVRfbmxtIChzZWUgYmVsb3cpIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9OQU1FCQk9Ci0KLSMKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rICctZGVzYyAnIGRpcmVjdGl2ZS4gCi0jIElmIGxlZnQgYmxhbmssIE5MTV9OQU1FIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9ERVNDUklQVElPTgk9Ci0KLSMKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSAnLXRocmVhZG5hbWUnIGRpcmVjdGl2ZS4gIElmIGxlZnQgYmxhbmssCi0jIE5MTV9OQU1FIFRocmVhZCB3aWxsIGJlIHVzZWQuCi0jCi1OTE1fVEhSRUFEX05BTUUJPQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlIFZFUlNJT04gdmFsdWUgaW4gCi0jICQoQVBfV09SSylcYnVpbGRcTldHTlVlbnZpcm9ubWVudC5pbmMKLSMKLU5MTV9WRVJTSU9OCQk9Ci0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgb2YgNjRLCi0jCi1OTE1fU1RBQ0tfU0laRQk9Ci0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1lbnRyeScgZGlyZWN0aXZlCi0jCi1OTE1fRU5UUllfU1lNCT0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1leGl0JyBkaXJlY3RpdmUKLSMKLU5MTV9FWElUX1NZTQk9Ci0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctY2hlY2snIGRpcmVjdGl2ZQotIwotTkxNX0NIRUNLX1NZTQk9Ci0KLSMKLSMgSWYgdGhlc2UgYXJlIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1mbGFncycgZGlyZWN0aXZlCi0jCi1OTE1fRkxBR1MJCT0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIGxpbmtlZCBpbiB3aXRoIHRoZSBYRENEYXRhIG9wdGlvbiBpbiB0aGUgZGVmIAotIyBmaWxlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb2YgJChOV09TKS9hcGFjaGUueGRjLiAgWERDRGF0YSBjYW4gYmUgZGlzYWJsZWQKLSMgYnkgc2V0dGluZyBBUEFDSEVfVU5JUFJPQyBpbiB0aGUgZW52aXJvbm1lbnQKLSMKLVhEQ0RBVEEgICAgICAgICA9IAotCi0jCi0jIElmIHRoZXJlIGlzIGFuIE5MTSB0YXJnZXQsIHB1dCBpdCBoZXJlCi0jCi1UQVJHRVRfbmxtID0gXAotCSQoT0JKRElSKS9hdXRoYW5vbi5ubG0gXAotCSQoT0JKRElSKS9hdXRoZGJtLm5sbSBcCi0JJChPQkpESVIpL2RpZ2VzdC5ubG0gXAotCSQoRU9MSVNUKQotCi0jCi0jIElmIHRoZXJlIGlzIGFuIExJQiB0YXJnZXQsIHB1dCBpdCBoZXJlCi0jCi1UQVJHRVRfbGliID0gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgT0JKIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIE5MTSB0YXJnZXQgYWJvdmUuCi0jIFBhdGhzIG11c3QgYWxsIHVzZSB0aGUgJy8nIGNoYXJhY3RlcgotIwotRklMRVNfbmxtX29ianMgPSBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBMSUIgZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTkxNIHRhcmdldCBhYm92ZS4KLSMgVGhlc2Ugd2lsbCBiZSBhZGRlZCBhcyBhIGxpYnJhcnkgY29tbWFuZCBpbiB0aGUgbGluay5vcHQgZmlsZS4KLSMKLUZJTEVTX25sbV9saWJzID0gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgbW9kdWxlcyB0aGF0IHRoZSBhYm92ZSBOTE0gdGFyZ2V0IGRlcGVuZHMgb24gdG8gbG9hZC4KLSMgVGhlc2Ugd2lsbCBiZSBhZGRlZCBhcyBhIG1vZHVsZSBjb21tYW5kIGluIHRoZSBsaW5rLm9wdCBmaWxlLgotIwotRklMRVNfbmxtX21vZHVsZXMgPSBcCi0JJChFT0xJU1QpCi0KLSMKLSMgSWYgdGhlIG5sbSBoYXMgYSBtc2cgZmlsZSwgcHV0IGl0J3MgcGF0aCBoZXJlCi0jCi1GSUxFX25sbV9tc2cgPQotIAotIwotIyBJZiB0aGUgbmxtIGhhcyBhIGhscCBmaWxlIHB1dCBpdCdzIHBhdGggaGVyZQotIwotRklMRV9ubG1faGxwID0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSAkKE5XT1MpXGNvcHlyaWdodC50eHQuCi0jCi1GSUxFX25sbV9jb3B5cmlnaHQgPQotCi0jCi0jIEFueSBhZGRpdGlvbmFsIGltcG9ydHMgZ28gaGVyZQotIwotRklMRVNfbmxtX1hpbXBvcnRzID0gXAotCSQoRU9MSVNUKQotIAotIyAgIAotIyBBbnkgc3ltYm9scyBleHBvcnRlZCB0byBoZXJlCi0jCi1GSUxFU19ubG1fZXhwb3J0cyA9IFwKLQkkKEVPTElTVCkKLQkKLSMgICAKLSMgVGhlc2UgYXJlIHRoZSBPQkogZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTElCIHRhcmdldCBhYm92ZS4KLSMgUGF0aHMgbXVzdCBhbGwgdXNlIHRoZSAnLycgY2hhcmFjdGVyCi0jCi1GSUxFU19saWJfb2JqcyA9IFwKLQkJJChFT0xJU1QpCi0KLSMKLSMgaW1wbGVtZW50IHRhcmdldHMgYW5kIGRlcGVuZGFuY2llcyAobGVhdmUgdGhpcyBzZWN0aW9uIGFsb25lKQotIwotCi1saWJzIDo6ICQoT0JKRElSKSAkKFRBUkdFVF9saWIpCi0KLW5sbXMgOjogbGlicyAkKFRBUkdFVF9ubG0pCi0KLSMKLSMgVXBkYXRlZCB0aGlzIHRhcmdldCB0byBjcmVhdGUgbmVjZXNzYXJ5IGRpcmVjdG9yaWVzIGFuZCBjb3B5IGZpbGVzIHRvIHRoZSAKLSMgY29ycmVjdCBwbGFjZS4gIChTZWUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jIGZvciBleGFtcGxlcykKLSMKLWluc3RhbGwgOjogbmxtcyBGT1JDRQotCWNvcHkgJChPQkpESVIpXCoubmxtICQoSU5TVEFMTClcQXBhY2hlMlxtb2R1bGVzXCouKgotCi0jCi0jIEFueSBzcGVjaWFsaXplZCBydWxlcyBoZXJlCi0jCi0KLSMKLSMgSW5jbHVkZSB0aGUgJ3RhaWwnIG1ha2VmaWxlIHRoYXQgaGFzIHRhcmdldHMgdGhhdCBkZXBlbmQgb24gdmFyaWFibGVzIGRlZmluZWQKLSMgaW4gdGhpcyBtYWtlZmlsZQotIwotCi1pbmNsdWRlICQoQVBfV09SSylcYnVpbGRcTldHTlV0YWlsLmluYwotCQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9hYWEvY29uZmlnLm00IGIvbW9kdWxlcy9hYWEvY29uZmlnLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDA2OWI1Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvYWFhL2NvbmZpZy5tNAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUFQQUNIRV9NT0RVTEUoc3RhbmRhcmQpCmRpZmYgLS1naXQgYS9tb2R1bGVzL2FhYS9tb2RfYXV0aF9kaWdlc3QuYyBiL21vZHVsZXMvYWFhL21vZF9hdXRoX2RpZ2VzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mzc5NTIyLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvYWFhL21vZF9hdXRoX2RpZ2VzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkxOSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBtb2RfYXV0aF9kaWdlc3Q6IE1ENSBkaWdlc3QgYXV0aGVudGljYXRpb24KLSAqCi0gKiBPcmlnaW5hbGx5IGJ5IEFsZXhlaSBLb3N1dCA8YWtvc3V0QG51ZXZhLnB2dC5rMTIuY2EudXM+Ci0gKiBVcGRhdGVkIHRvIFJGQy0yNjE3IGJ5IFJvbmFsZCBUc2NoYWzkciA8cm9uYWxkQGlubm92YXRpb24uY2g+Ci0gKiBiYXNlZCBvbiBtb2RfYXV0aCwgYnkgUm9iIE1jQ29vbCBhbmQgUm9iZXJ0IFMuIFRoYXUKLSAqCi0gKiBUaGlzIG1vZHVsZSBhbiB1cGRhdGVkIHZlcnNpb24gb2YgbW9kdWxlcy9zdGFuZGFyZC9tb2RfZGlnZXN0LmMKLSAqIEhvd2V2ZXIsIGl0IGhhcyBub3QgYmVlbiBleHRlbnNpdmVseSB0ZXN0ZWQgeWV0LCBhbmQgaXMgdGhlcmVmb3JlCi0gKiBjdXJyZW50bHkgbWFya2VkIGV4cGVyaW1lbnRhbC4gU2VuZCBwcm9ibGVtIHJlcG9ydHMgdG8gbWUKLSAqIChyb25hbGRAaW5ub3ZhdGlvbi5jaCkKLSAqCi0gKiBSZXF1aXJlcyBlaXRoZXIgL2Rldi9yYW5kb20gKG9yIGVxdWl2YWxlbnQpIG9yIHRoZSB0cnVlcmFuZCBsaWJyYXJ5LAotICogYXZhaWxhYmxlIGZvciBpbnN0YW5jZSBmcm9tCi0gKiBmdHA6Ly9yZXNlYXJjaC5hdHQuY29tL2Rpc3QvbWFiL2xpYnJhbmQuc2hhcgotICoKLSAqIE9wZW4gSXNzdWVzOgotICogICAtIHFvcD1hdXRoLWludCAod2hlbiBzdHJlYW1zIGFuZCB0cmFpbGVyIHN1cHBvcnQgYXZhaWxhYmxlKQotICogICAtIG5vbmNlLWZvcm1hdCBjb25maWd1cmFiaWxpdHkKLSAqICAgLSBQcm94eS1BdXRob3JpemF0aW9uLUluZm8gaGVhZGVyIGlzIHNldCBieSB0aGlzIG1vZHVsZSwgYnV0IGlzCi0gKiAgICAgY3VycmVudGx5IGlnbm9yZWQgYnkgbW9kX3Byb3h5IChuZWVkcyBwYXRjaCB0byBtb2RfcHJveHkpCi0gKiAgIC0gZ2VuZXJhdGluZyB0aGUgc2VjcmV0IHRha2VzIGEgd2hpbGUgKH4gOCBzZWNvbmRzKSBpZiB1c2luZyB0aGUKLSAqICAgICB0cnVlcmFuZCBsaWJyYXJ5Ci0gKiAgIC0gc2hhcmVkLW1lbSBub3QgY29tcGxldGVseSB0ZXN0ZWQgeWV0LiBTZWVtcyB0byB3b3JrIG9rIGZvciBtZSwKLSAqICAgICBidXQuLi4gKGRlZmluaXRlbHkgd29uJ3Qgd29yayBvbiBXaW5kb3plKQotICovCi0KLS8qIFRoZSBzZWN0aW9uIGZvciB0aGUgQ29uZmlndXJlIHNjcmlwdDoKLSAqIE1PRFVMRS1ERUZJTklUSU9OLVNUQVJUCi0gKiBOYW1lOiBkaWdlc3RfYXV0aF9tb2R1bGUKLSAqIENvbmZpZ1N0YXJ0Ci0KLSAgICBSVUxFX0RFVl9SQU5ET009YC4vaGVscGVycy9DdXRSdWxlIERFVl9SQU5ET00gJGZpbGVgCi0gICAgaWYgWyAiJFJVTEVfREVWX1JBTkRPTSIgPSAiZGVmYXVsdCIgXTsgdGhlbgotCWlmIFsgLXIgIi9kZXYvcmFuZG9tIiBdOyB0aGVuCi0JICAgIFJVTEVfREVWX1JBTkRPTT0iL2Rldi9yYW5kb20iCi0JZWxpZiBbIC1yICIvZGV2L3VyYW5kb20iIF07IHRoZW4KLQkgICAgUlVMRV9ERVZfUkFORE9NPSIvZGV2L3VyYW5kb20iCi0JZWxzZQotCSAgICBSVUxFX0RFVl9SQU5ET009InRydWVyYW5kIgotCSAgICBpZiBoZWxwZXJzL1Rlc3RDb21waWxlIGZ1bmMgcmFuZGJ5dGU7IHRoZW4KLQkJOgotCSAgICBlbGlmIGhlbHBlcnMvVGVzdENvbXBpbGUgbGliIHJhbmQgcmFuZGJ5dGU7IHRoZW4KLQkJOgotCSAgICBlbHNlCi0JCWVjaG8gIiAgICAgIChtb2RfYXV0aF9kaWdlc3QpIHRydWVyYW5kIGxpYnJhcnkgbWlzc2luZyEiCi0JCWVjaG8gIioqIFRoaXMgd2lsbCBtb3N0IHByb2JhYmx5IGRlZmVhdCBzdWNjZXNzZnVsIGNvbXBpbGF0aW9uLiIKLQkJZWNobyAiKiogU2VlIFJ1bGUgREVWX1JBTkRPTSBpbiBzcmMvQ29uZmlndXJhdGlvbi50bXBsIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLQkgICAgZmkKLQlmaQotICAgIGZpCi0gICAgaWYgWyAiJFJVTEVfREVWX1JBTkRPTSIgPSAidHJ1ZXJhbmQiIF07IHRoZW4KLQllY2hvICIgICAgICB1c2luZyB0cnVlcmFuZCBsaWJyYXJ5ICgtbHJhbmQpIGZvciB0aGUgcmFuZG9tIHNlZWQiCi0JTElCUz0iJExJQlMgLUwvdXNyL2xvY2FsL2xpYiAtbHJhbmQiCi0gICAgZWxzZQotCWVjaG8gIiAgICAgIHVzaW5nICRSVUxFX0RFVl9SQU5ET00gZm9yIHRoZSByYW5kb20gc2VlZCIKLQlDRkxBR1M9IiRDRkxBR1MgLURERVZfUkFORE9NPSRSVUxFX0RFVl9SQU5ET00iCi0gICAgZmkKLQotICogQ29uZmlnRW5kCi0gKiBNT0RVTEUtREVGSU5JVElPTi1FTkQKLSAqLwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfY29uZl9nbG9iYWxzLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAiYXBfY3R5cGUuaCIKLSNpbmNsdWRlICJ1dGlsX3VyaS5oIgotI2luY2x1ZGUgInV0aWxfbWQ1LmgiCi0jaW5jbHVkZSAiYXBfc2hhMS5oIgotI2lmZGVmIEhBVkVfU0hNRU1fTU0KLSNpbmNsdWRlICJtbS5oIgotI2VuZGlmCS8qIEhBVkVfU0hNRU1fTU0gKi8KLQotCi0vKiBzdHJ1Y3QgdG8gaG9sZCB0aGUgY29uZmlndXJhdGlvbiBpbmZvICovCi0KLXR5cGVkZWYgc3RydWN0IGRpZ2VzdF9jb25maWdfc3RydWN0IHsKLSAgICBjb25zdCBjaGFyICAqZGlyX25hbWU7Ci0gICAgY29uc3QgY2hhciAgKnB3ZmlsZTsKLSAgICBjb25zdCBjaGFyICAqZ3JwZmlsZTsKLSAgICBjb25zdCBjaGFyICAqcmVhbG07Ci0gICAgY29uc3QgY2hhciAqKnFvcF9saXN0OwotICAgIEFQX1NIQTFfQ1RYICBub25jZV9jdHg7Ci0gICAgbG9uZyAgICAgICAgIG5vbmNlX2xpZmV0aW1lOwotICAgIGNvbnN0IGNoYXIgICpub25jZV9mb3JtYXQ7Ci0gICAgaW50ICAgICAgICAgIGNoZWNrX25jOwotICAgIGNvbnN0IGNoYXIgICphbGdvcml0aG07Ci0gICAgY2hhciAgICAgICAgKnVyaV9saXN0OwotICAgIGNvbnN0IGNoYXIgICpoYTE7Ci19IGRpZ2VzdF9jb25maWdfcmVjOwotCi0KLSNkZWZpbmUJREZMVF9BTEdPUklUSE0JIk1ENSIKLQotI2RlZmluZQlERkxUX05PTkNFX0xJRkUJMzAwTAotI2RlZmluZSBORVhUTk9OQ0VfREVMVEEJMzAKLQotCi0jZGVmaW5lIE5PTkNFX1RJTUVfTEVOCSgoKHNpemVvZih0aW1lX3QpKzIpLzMpKjQpCi0jZGVmaW5lIE5PTkNFX0hBU0hfTEVOCTQwCi0jZGVmaW5lIE5PTkNFX0xFTgkoTk9OQ0VfVElNRV9MRU4gKyBOT05DRV9IQVNIX0xFTikKLQotI2RlZmluZQlTRUNSRVRfTEVOCTIwCi0KLQotLyogY2xpZW50IGxpc3QgZGVmaW5pdGlvbnMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgaGFzaF9lbnRyeSB7Ci0gICAgdW5zaWduZWQgbG9uZyAgICAgIGtleTsJCQkvKiB0aGUga2V5IGZvciB0aGlzIGVudHJ5ICAgICovCi0gICAgc3RydWN0IGhhc2hfZW50cnkgKm5leHQ7CQkJLyogbmV4dCBlbnRyeSBpbiB0aGUgYnVja2V0ICAqLwotICAgIHVuc2lnbmVkIGxvbmcgICAgICBub25jZV9jb3VudDsJCS8qIGZvciBub25jZS1jb3VudCBjaGVja2luZyAgKi8KLSAgICBjaGFyICAgICAgICAgICAgICAgaGExWzE3XTsJCQkvKiBmb3IgYWxnb3JpdGhtPU1ENS1zZXNzICAgICovCi0gICAgY2hhciAgICAgICAgICAgICAgIGxhc3Rfbm9uY2VbTk9OQ0VfTEVOKzFdOwkvKiBmb3Igb25lLXRpbWUgbm9uY2UncyAgICAgICovCi19IGNsaWVudF9lbnRyeTsKLQotc3RhdGljIHN0cnVjdCBoYXNoX3RhYmxlIHsKLSAgICBjbGllbnRfZW50cnkgICoqdGFibGU7Ci0gICAgdW5zaWduZWQgbG9uZyAgIHRibF9sZW47Ci0gICAgdW5zaWduZWQgbG9uZyAgIG51bV9lbnRyaWVzOwotICAgIHVuc2lnbmVkIGxvbmcgICBudW1fY3JlYXRlZDsKLSAgICB1bnNpZ25lZCBsb25nICAgbnVtX3JlbW92ZWQ7Ci0gICAgdW5zaWduZWQgbG9uZyAgIG51bV9yZW5ld2VkOwotfSAqY2xpZW50X2xpc3Q7Ci0KLQotLyogc3RydWN0IHRvIGhvbGQgYSBwYXJzZWQgQXV0aG9yaXphdGlvbiBoZWFkZXIgKi8KLQotZW51bSBoZHJfc3RzIHsgTk9fSEVBREVSLCBOT1RfRElHRVNULCBJTlZBTElELCBWQUxJRCB9OwotCi10eXBlZGVmIHN0cnVjdCBkaWdlc3RfaGVhZGVyX3N0cnVjdCB7Ci0gICAgY29uc3QgY2hhciAgICAgICAgICAgKnNjaGVtZTsKLSAgICBjb25zdCBjaGFyICAgICAgICAgICAqcmVhbG07Ci0gICAgY29uc3QgY2hhciAgICAgICAgICAgKnVzZXJuYW1lOwotICAgICAgICAgIGNoYXIgICAgICAgICAgICpub25jZTsKLSAgICBjb25zdCBjaGFyICAgICAgICAgICAqdXJpOwotICAgIGNvbnN0IGNoYXIgICAgICAgICAgICpkaWdlc3Q7Ci0gICAgY29uc3QgY2hhciAgICAgICAgICAgKmFsZ29yaXRobTsKLSAgICBjb25zdCBjaGFyICAgICAgICAgICAqY25vbmNlOwotICAgIGNvbnN0IGNoYXIgICAgICAgICAgICpvcGFxdWU7Ci0gICAgdW5zaWduZWQgbG9uZyAgICAgICAgIG9wYXF1ZV9udW07Ci0gICAgY29uc3QgY2hhciAgICAgICAgICAgKm1lc3NhZ2VfcW9wOwotICAgIGNvbnN0IGNoYXIgICAgICAgICAgICpub25jZV9jb3VudDsKLSAgICAvKiB0aGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgbm90IChkaXJlY3RseSkgZnJvbSB0aGUgaGVhZGVyICovCi0gICAgdGltZV90ICAgICAgICAgICAgICAgIG5vbmNlX3RpbWU7Ci0gICAgZW51bSBoZHJfc3RzICAgICAgICAgIGF1dGhfaGRyX3N0czsKLSAgICB1cmlfY29tcG9uZW50cyAgICAgICAqcmVxdWVzdF91cmk7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgIG5lZWRlZF9hdXRoOwotICAgIGNsaWVudF9lbnRyeSAgICAgICAgICpjbGllbnQ7Ci19IGRpZ2VzdF9oZWFkZXJfcmVjOwotCi0KLS8qIChtb3N0bHkpIG5vbmNlIHN0dWZmICovCi0KLXR5cGVkZWYgdW5pb24gdGltZV91bmlvbiB7Ci0gICAgdGltZV90CSAgdGltZTsKLSAgICB1bnNpZ25lZCBjaGFyIGFycltzaXplb2YodGltZV90KV07Ci19IHRpbWVfcmVjOwotCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNlY3JldFtTRUNSRVRfTEVOXTsKLXN0YXRpYyBpbnQgY2FsbF9jbnQgPSAwOwotCi0KLSNpZmRlZiBIQVZFX1NITUVNX01NCi0vKiBvcGFxdWUgc3R1ZmYgKi8KLQotc3RhdGljIE1NICAgICAgICAgICAgKm9wYXF1ZV9tbTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nICpvcGFxdWVfY250cjsKLQotc3RhdGljIE1NICAgICAgICAgICAgKmNsaWVudF9tbTsKLQotc3RhdGljIE1NICAgICAgICAgICAgKm90bl9jb3VudF9tbTsKLXN0YXRpYyB0aW1lX3QgICAgICAgICpvdG5fY291bnRlcjsJLyogb25lLXRpbWUtbm9uY2UgY291bnRlciAqLwotCi0jZGVmaW5lCVNITUVNX1NJWkUgCTEwMDAJCS8qIH4gMTIgZW50cmllcyAqLwotI2RlZmluZQlOVU1fQlVDS0VUUwkxNVVMCi0KLSNlbHNlCS8qIEhBVkVfU0hNRU1fTU0gKi8KLXN0YXRpYyB2b2lkICAgICAgICAgICpjbGllbnRfbW0gPSBOVUxMOwotI2VuZGlmCS8qIEhBVkVfU0hNRU1fTU0gKi8KLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGRpZ2VzdF9hdXRoX21vZHVsZTsKLQotLyoKLSAqIGluaXRpYWxpemF0aW9uIGNvZGUKLSAqLwotCi0jaWZkZWYgSEFWRV9TSE1FTV9NTQotc3RhdGljIHZvaWQgY2xlYW51cF90YWJsZXModm9pZCAqbm90X3VzZWQpCi17Ci0gICAgZnByaW50ZihzdGRlcnIsICJEaWdlc3Q6IGNsZWFuaW5nIHVwIHNoYXJlZCBtZW1vcnlcbiIpOwotICAgIGZmbHVzaChzdGRlcnIpOwotCi0gICAgaWYgKGNsaWVudF9tbSkgewotCW1tX2Rlc3Ryb3koY2xpZW50X21tKTsKLQljbGllbnRfbW0gPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChvcGFxdWVfbW0pIHsKLQltbV9kZXN0cm95KG9wYXF1ZV9tbSk7Ci0Jb3BhcXVlX21tID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAob3RuX2NvdW50X21tKSB7Ci0JbW1fZGVzdHJveShvdG5fY291bnRfbW0pOwotCW90bl9jb3VudF9tbSA9IE5VTEw7Ci0gICAgfQotfQotI2VuZGlmCS8qIEhBVkVfU0hNRU1fTU0gKi8KLQotc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9zZWNyZXQoc2VydmVyX3JlYyAqcykKLXsKLSNpZmRlZglERVZfUkFORE9NCi0gICAgRklMRSAqcm5kOwotICAgIHNpemVfdCBnb3QsIHRvdDsKLSNlbHNlCi0gICAgZXh0ZXJuIGludCByYW5kYnl0ZSh2b2lkKTsJLyogZnJvbSB0aGUgdHJ1ZXJhbmQgbGlicmFyeSAqLwotICAgIHVuc2lnbmVkIGludCBpZHg7Ci0jZW5kaWYKLQotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwgcywKLQkJICJEaWdlc3Q6IGdlbmVyYXRpbmcgc2VjcmV0IGZvciBkaWdlc3QgYXV0aGVudGljYXRpb24gLi4uIik7Ci0KLSNpZmRlZglERVZfUkFORE9NCi0jZGVmaW5lCVhTVFIoeCkJI3gKLSNkZWZpbmUJU1RSKHgpCVhTVFIoeCkKLSAgICBpZiAoKHJuZCA9IGZvcGVuKFNUUihERVZfUkFORE9NKSwgInJiIikpID09IE5VTEwpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQ1JJVCwgcywKLQkJICAgICAiRGlnZXN0OiBDb3VsZG4ndCBvcGVuICIgU1RSKERFVl9SQU5ET00pKTsKLQlleGl0KEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotICAgIGlmIChzZXR2YnVmKHJuZCwgTlVMTCwgX0lPTkJGLCAwKSAhPSAwKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfQ1JJVCwgcywKLQkJICAgICAiRGlnZXN0OiBFcnJvciB0cnlpbmcgdG8gZGlzYWJsZSBidWZmZXJpbmcgZm9yICIgU1RSKERFVl9SQU5ET00pKTsKLQlleGl0KEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotICAgIGZvciAodG90PTA7IHRvdDxzaXplb2Yoc2VjcmV0KTsgdG90ICs9IGdvdCkgewotCWlmICgoZ290ID0gZnJlYWQoc2VjcmV0K3RvdCwgMSwgc2l6ZW9mKHNlY3JldCktdG90LCBybmQpKSA8IDEpIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0NSSVQsIHMsCi0JCQkgIkRpZ2VzdDogRXJyb3IgcmVhZGluZyAiIFNUUihERVZfUkFORE9NKSk7Ci0JICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLQl9Ci0gICAgfQotICAgIGZjbG9zZShybmQpOwotI3VuZGVmCVNUUgotI3VuZGVmCVhTVFIKLSNlbHNlCS8qIHVzZSB0cnVlcmFuZCAqLwotICAgIC8qIHRoaXMgd2lsbCBpbmNyZWFzZSB0aGUgc3RhcnR1cCB0aW1lIG9mIHRoZSBzZXJ2ZXIsIHVuZm9ydHVuYXRlbHkuLi4KLSAgICAgKiAoZ2VuZXJhdGluZyAyMCBieXRlcyB0YWtlcyBhYm91dCA4IHNlY29uZHMpCi0gICAgICovCi0gICAgZm9yIChpZHg9MDsgaWR4PHNpemVvZihzZWNyZXQpOyBpZHgrKykKLQlzZWNyZXRbaWR4XSA9ICh1bnNpZ25lZCBjaGFyKSByYW5kYnl0ZSgpOwotI2VuZGlmCS8qIERFVl9SQU5ET00gKi8KLQotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwgcywgIkRpZ2VzdDogZG9uZSIpOwotfQotCi0jaWZkZWYgSEFWRV9TSE1FTV9NTQotc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV90YWJsZXMoc2VydmVyX3JlYyAqcykKLXsKLSAgICB1bnNpZ25lZCBsb25nIGlkeDsKLQotICAgIC8qIHNldCB1cCBjbGllbnQgbGlzdCAqLwotCi0gICAgY2xpZW50X21tID0gbW1fY3JlYXRlKFNITUVNX1NJWkUsIHRtcG5hbShOVUxMKSk7Ci0gICAgaWYgKGNsaWVudF9tbSA9PSBOVUxMKQotCWdvdG8gZmFpbGVkOwotI2lmZGVmIE1QRQotICAgIGlmIChnZXRldWlkKCkgPT0gMSkgewotI2Vsc2UKLSAgICBpZiAoZ2V0ZXVpZCgpID09IDApIHsKLSNlbmRpZgotCWlmIChtbV9wZXJtaXNzaW9uKGNsaWVudF9tbSwgMDYwMCwgYXBfdXNlcl9pZCwgYXBfZ3JvdXBfaWQpKQotCSAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgY2xpZW50X2xpc3QgPSBtbV9tYWxsb2MoY2xpZW50X21tLCBzaXplb2YoKmNsaWVudF9saXN0KSArCi0JCQkJICAgICAgIHNpemVvZihjbGllbnRfZW50cnkqKSpOVU1fQlVDS0VUUyk7Ci0gICAgaWYgKCFjbGllbnRfbGlzdCkgIGdvdG8gZmFpbGVkOwotICAgIGNsaWVudF9saXN0LT50YWJsZSA9IChjbGllbnRfZW50cnkqKikgKGNsaWVudF9saXN0ICsgMSk7Ci0gICAgZm9yIChpZHg9MDsgaWR4PE5VTV9CVUNLRVRTOyBpZHgrKykKLQljbGllbnRfbGlzdC0+dGFibGVbaWR4XSA9IE5VTEw7Ci0gICAgY2xpZW50X2xpc3QtPnRibF9sZW4gICAgID0gTlVNX0JVQ0tFVFM7Ci0gICAgY2xpZW50X2xpc3QtPm51bV9lbnRyaWVzID0gMDsKLQotCi0gICAgLyogc2V0dXAgb3BhcXVlICovCi0KLSAgICBvcGFxdWVfbW0gPSBtbV9jcmVhdGUoc2l6ZW9mKCpvcGFxdWVfY250ciksIHRtcG5hbShOVUxMKSk7Ci0gICAgaWYgKG9wYXF1ZV9tbSA9PSBOVUxMKQotCWdvdG8gZmFpbGVkOwotI2lmZGVmIE1QRQotICAgIGlmIChnZXRldWlkKCkgPT0gMSkgewotI2Vsc2UKLSAgICBpZiAoZ2V0ZXVpZCgpID09IDApIHsKLSNlbmRpZgotCWlmIChtbV9wZXJtaXNzaW9uKG9wYXF1ZV9tbSwgMDYwMCwgYXBfdXNlcl9pZCwgYXBfZ3JvdXBfaWQpKQotCSAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgb3BhcXVlX2NudHIgPSBtbV9tYWxsb2Mob3BhcXVlX21tLCBzaXplb2YoKm9wYXF1ZV9jbnRyKSk7Ci0gICAgaWYgKG9wYXF1ZV9jbnRyID09IE5VTEwpCi0JZ290byBmYWlsZWQ7Ci0gICAgKm9wYXF1ZV9jbnRyID0gMVVMOwotCi0KLSAgICAvKiBzZXR1cCBvbmUtdGltZS1ub25jZSBjb3VudGVyICovCi0KLSAgICBvdG5fY291bnRfbW0gPSBtbV9jcmVhdGUoc2l6ZW9mKCpvdG5fY291bnRlciksIHRtcG5hbShOVUxMKSk7Ci0gICAgaWYgKG90bl9jb3VudF9tbSA9PSBOVUxMKQotCWdvdG8gZmFpbGVkOwotI2lmZGVmIE1QRQotICAgIGlmIChnZXRldWlkKCkgPT0gMSkgewotI2Vsc2UKLSAgICBpZiAoZ2V0ZXVpZCgpID09IDApIHsKLSNlbmRpZgotCWlmIChtbV9wZXJtaXNzaW9uKG90bl9jb3VudF9tbSwgMDYwMCwgYXBfdXNlcl9pZCwgYXBfZ3JvdXBfaWQpKQotCSAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgb3RuX2NvdW50ZXIgPSBtbV9tYWxsb2Mob3RuX2NvdW50X21tLCBzaXplb2YoKm90bl9jb3VudGVyKSk7Ci0gICAgaWYgKG90bl9jb3VudGVyID09IE5VTEwpCi0JZ290byBmYWlsZWQ7Ci0gICAgKm90bl9jb3VudGVyID0gMDsKLQotCi0gICAgLyogc3VjY2VzcyAqLwotICAgIHJldHVybjsKLQotZmFpbGVkOgotICAgIGlmICghY2xpZW50X21tIHx8IChjbGllbnRfbGlzdCAmJiBjbGllbnRfbGlzdC0+dGFibGUgJiYgIW9wYXF1ZV9tbSkKLQl8fCAob3BhcXVlX2NudHIgJiYgIW90bl9jb3VudF9tbSkpCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCBzLAotCQkgICAgICJEaWdlc3Q6IGZhaWxlZCB0byBjcmVhdGUgc2hhcmVkIG1lbW9yeSBzZWdtZW50czsgcmVhc29uICIKLQkJICAgICAid2FzIGAlcycgLSBhbGwgbm9uY2UtY291bnQgY2hlY2tpbmcsIG9uZS10aW1lIG5vbmNlcywgIgotCQkgICAgICJhbmQgTUQ1LXNlc3MgYWxnb3JpdGhtIGRpc2FibGVkIiwgbW1fZXJyb3IoKSk7Ci0gICAgZWxzZQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgcywKLQkJICAgICAiRGlnZXN0OiBmYWlsZWQgdG8gYWxsb2NhdGUgc2hhcmVkIG1lbTsgcmVhc29uIHdhcyBgJXMnICIKLQkJICAgICAiLSBhbGwgbm9uY2UtY291bnQgY2hlY2tpbmcsIG9uZS10aW1lIG5vbmNlcywgYW5kICIKLQkJICAgICAiTUQ1LXNlc3MgYWxnb3JpdGhtIGRpc2FibGVkIiwgbW1fZXJyb3IoKSk7Ci0KLSAgICBjbGVhbnVwX3RhYmxlcyhOVUxMKTsKLX0KLSNlbmRpZgkvKiBIQVZFX1NITUVNX01NICovCi0KLXN0YXRpYyB2b2lkIGluaXRpYWxpemVfbW9kdWxlKHNlcnZlcl9yZWMgKnMsIHBvb2wgKnApCi17Ci0gICAgLyoga2VlcCBmcm9tIGRvaW5nIHRoZSBpbml0IG1vcmUgdGhhbiBvbmNlIGF0IHN0YXJ0dXAsIGFuZCBkZWxheQotICAgICAqIHRoZSBpbml0IHVudGlsIHRoZSBzZWNvbmQgcm91bmQKLSAgICAgKi8KLSAgICBpZiAoKytjYWxsX2NudCA8IDIpCi0JcmV0dXJuOwotCi0gICAgLyogb25seSBpbml0aWFsaXplIHRoZSBzZWNyZXQgb24gc3RhcnR1cCwgbm90IG9uIHJlc3RhcnRzICovCi0gICAgaWYgKGNhbGxfY250ID09IDIpCi0JaW5pdGlhbGl6ZV9zZWNyZXQocyk7Ci0KLSNpZmRlZiBIQVZFX1NITUVNX01NCi0gICAgLyogTm90ZTogdGhpcyBzdHVmZiBpcyBjdXJyZW50bHkgZml4ZWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgc2VydmVyLAotICAgICAqIGkuZS4gZXZlbiBhY3Jvc3MgcmVzdGFydHMuIFRoaXMgbWVhbnMgdGhhdCBBKSBhbnkgc2htZW0tc2l6ZQotICAgICAqIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBhcmUgaWdub3JlZCwgYW5kIEIpIGNlcnRhaW4gb3B0aW1pemF0aW9ucywKLSAgICAgKiBzdWNoIGFzIG9ubHkgYWxsb2NhdGluZyB0aGUgc21hbGxlc3QgbmVjZXNzYXJ5IGVudHJ5IGZvciBlYWNoCi0gICAgICogY2xpZW50LCBjYW4ndCBiZSBkb25lLiBIb3dldmVyLCB0aGUgYWx0ZXJuYXRpdmUgaXMgYSBuaWdodG1hcmU6Ci0gICAgICogd2UgY2FuJ3QgY2FsbCBtbV9kZXN0cm95IG9uIGEgZ3JhY2VmdWwgcmVzdGFydCBiZWNhdXNlIHRoZXJlIHdpbGwKLSAgICAgKiBiZSBjaGlsZHJlbiB1c2luZyB0aGUgdGFibGVzLCBhbmQgd2UgYWxzbyBkb24ndCBrbm93IHdoZW4gdGhlCi0gICAgICogbGFzdCBjaGlsZCBkaWVzLiBUaGVyZWZvcmUgd2UgY2FuIG5ldmVyIGNsZWFuIHVwIHRoZSBvbGQgc3R1ZmYsCi0gICAgICogY3JlYXRpbmcgYSBjcmVlcGluZyBtZW1vcnkgbGVhay4KLSAgICAgKi8KLSAgICBpbml0aWFsaXplX3RhYmxlcyhzKTsKLSAgICAvKiBhdGV4aXQoY2xlYW51cF90YWJsZXMpOyAqLwotICAgIGFwX3JlZ2lzdGVyX2NsZWFudXAocCwgTlVMTCwgY2xlYW51cF90YWJsZXMsIGFwX251bGxfY2xlYW51cCk7Ci0jZW5kaWYJLyogSEFWRV9TSE1FTV9NTSAqLwotfQotCi0KLS8qCi0gKiBjb25maWd1cmF0aW9uIGNvZGUKLSAqLwotCi1zdGF0aWMgdm9pZCAqY3JlYXRlX2RpZ2VzdF9kaXJfY29uZmlnKHBvb2wgKnAsIGNoYXIgKmRpcikKLXsKLSAgICBkaWdlc3RfY29uZmlnX3JlYyAqY29uZjsKLQotICAgIGlmIChkaXIgPT0gTlVMTCkgIHJldHVybiBOVUxMOwotCi0gICAgY29uZiA9IChkaWdlc3RfY29uZmlnX3JlYyAqKSBhcF9wY2FsbG9jKHAsIHNpemVvZihkaWdlc3RfY29uZmlnX3JlYykpOwotICAgIGlmIChjb25mKSB7Ci0JY29uZi0+cW9wX2xpc3QgICAgICAgPSBhcF9wYWxsb2MocCwgc2l6ZW9mKGNoYXIqKSk7Ci0JY29uZi0+cW9wX2xpc3RbMF0gICAgPSBOVUxMOwotCWNvbmYtPm5vbmNlX2xpZmV0aW1lID0gREZMVF9OT05DRV9MSUZFOwotCWNvbmYtPmRpcl9uYW1lICAgICAgID0gYXBfcHN0cmR1cChwLCBkaXIpOwotCWNvbmYtPmFsZ29yaXRobSAgICAgID0gREZMVF9BTEdPUklUSE07Ci0gICAgfQotCi0gICAgcmV0dXJuIGNvbmY7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfcmVhbG0oY21kX3Bhcm1zICpjbWQsIHZvaWQgKmNvbmZpZywgY29uc3QgY2hhciAqcmVhbG0pCi17Ci0gICAgZGlnZXN0X2NvbmZpZ19yZWMgKmNvbmYgPSAoZGlnZXN0X2NvbmZpZ19yZWMgKikgY29uZmlnOwotCi0gICAgLyogVGhlIGNvcmUgYWxyZWFkeSBoYW5kbGVzIHRoZSByZWFsbSwgYnV0IGl0J3MganVzdCB0b28gY29udmVuaWVudCB0bwotICAgICAqIGdyYWIgaXQgb3Vyc2VsdmVzIHRvbyBhbmQgY2FjaGUgc29tZSBzZXR1cHMuIEhvd2V2ZXIsIHdlIG5lZWQgdG8KLSAgICAgKiBsZXQgdGhlIGNvcmUgZ2V0IGF0IGl0IHRvbywgd2hpY2ggaXMgd2h5IHdlIGRlY2xpbmUgYXQgdGhlIGVuZCAtCi0gICAgICogdGhpcyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBodHRwX2NvcmUgaXMgbGFzdCBpbiB0aGUgbGlzdC4KLSAgICAgKi8KLSAgICBjb25mLT5yZWFsbSA9IHJlYWxtOwotCi0gICAgLyogd2UgcHJlY29tcHV0ZSB0aGUgcGFydCBvZiB0aGUgbm9uY2UgaGFzaCB0aGF0IGlzIGNvbnN0YW50ICh3ZWxsLAotICAgICAqIHRoZSBob3N0OnBvcnQgd291bGQgYmUgdG9vLCBidXQgdGhhdCB2YXJpZXMgZm9yIC5odGFjY2VzcyBmaWxlcwotICAgICAqIGFuZCBkaXJlY3RpdmVzIG91dHNpZGUgYSB2aXJ0dWFsIGhvc3Qgc2VjdGlvbikKLSAgICAgKi8KLSAgICBhcF9TSEExSW5pdCgmY29uZi0+bm9uY2VfY3R4KTsKLSAgICBhcF9TSEExVXBkYXRlX2JpbmFyeSgmY29uZi0+bm9uY2VfY3R4LCAoY29uc3QgdW5zaWduZWQgY2hhciAqKSByZWFsbSwKLQkJCSBzdHJsZW4ocmVhbG0pKTsKLSAgICBhcF9TSEExVXBkYXRlX2JpbmFyeSgmY29uZi0+bm9uY2VfY3R4LCBzZWNyZXQsIHNpemVvZihzZWNyZXQpKTsKLQotICAgIHJldHVybiBERUNMSU5FX0NNRDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9kaWdlc3RfZmlsZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqY29uZmlnLAotCQkJCSAgIGNvbnN0IGNoYXIgKmZpbGUpCi17Ci0gICAgKChkaWdlc3RfY29uZmlnX3JlYyAqKSBjb25maWcpLT5wd2ZpbGUgPSBmaWxlOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2dyb3VwX2ZpbGUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmNvbmZpZywKLQkJCQkgIGNvbnN0IGNoYXIgKmZpbGUpCi17Ci0gICAgKChkaWdlc3RfY29uZmlnX3JlYyAqKSBjb25maWcpLT5ncnBmaWxlID0gZmlsZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9xb3AoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmNvbmZpZywgY29uc3QgY2hhciAqb3ApCi17Ci0gICAgZGlnZXN0X2NvbmZpZ19yZWMgKmNvbmYgPSAoZGlnZXN0X2NvbmZpZ19yZWMgKikgY29uZmlnOwotICAgIGNvbnN0IGNoYXIgKip0bXA7Ci0gICAgaW50IGNudDsKLQotICAgIGlmICghc3RyY2FzZWNtcChvcCwgIm5vbmUiKSkgewotCWlmIChjb25mLT5xb3BfbGlzdFswXSA9PSBOVUxMKSB7Ci0JICAgIGNvbmYtPnFvcF9saXN0ID0gYXBfcGFsbG9jKGNtZC0+cG9vbCwgMiAqIHNpemVvZihjaGFyKikpOwotCSAgICBjb25mLT5xb3BfbGlzdFsxXSA9IE5VTEw7Ci0JfQotCWNvbmYtPnFvcF9saXN0WzBdID0gIm5vbmUiOwotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmICghc3RyY2FzZWNtcChvcCwgImF1dGgtaW50IikpCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfV0FSTklORywgY21kLT5zZXJ2ZXIsCi0JCSAgICAgIkRpZ2VzdDogV0FSTklORzogcW9wIGBhdXRoLWludCcgY3VycmVudGx5IG9ubHkgd29ya3MgIgotCQkgICAgICJjb3JyZWN0bHkgZm9yIHJlc3BvbnNlcyB3aXRoIG5vIGVudGl0eSIpOwotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAob3AsICJhdXRoIikpCi0JcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCAiVW5yZWNvZ25pemVkIHFvcDogIiwgb3AsIE5VTEwpOwotCi0gICAgZm9yIChjbnQ9MDsgY29uZi0+cW9wX2xpc3RbY250XSAhPSBOVUxMOyBjbnQrKykKLQk7Ci0gICAgdG1wID0gYXBfcGFsbG9jKGNtZC0+cG9vbCwgKGNudCsyKSpzaXplb2YoY2hhciopKTsKLSAgICBtZW1jcHkodG1wLCBjb25mLT5xb3BfbGlzdCwgY250KnNpemVvZihjaGFyKikpOwotICAgIHRtcFtjbnRdICAgPSBhcF9wc3RyZHVwKGNtZC0+cG9vbCwgb3ApOwotICAgIHRtcFtjbnQrMV0gPSBOVUxMOwotICAgIGNvbmYtPnFvcF9saXN0ID0gdG1wOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbm9uY2VfbGlmZXRpbWUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmNvbmZpZywKLQkJCQkgICAgICBjb25zdCBjaGFyICp0KQotewotICAgIGNoYXIgKmVuZHB0cjsKLSAgICBsb25nICBsaWZldGltZTsKLQotICAgIGxpZmV0aW1lID0gc3RydG9sKHQsICZlbmRwdHIsIDEwKTsKLSAgICBpZiAoZW5kcHRyIDwgKHQrc3RybGVuKHQpKSAmJiAhYXBfaXNzcGFjZSgqZW5kcHRyKSkKLQlyZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsICJJbnZhbGlkIHRpbWUgaW4gQXV0aERpZ2VzdE5vbmNlTGlmZXRpbWU6ICIsIHQsIE5VTEwpOwotCi0gICAgKChkaWdlc3RfY29uZmlnX3JlYyAqKSBjb25maWcpLT5ub25jZV9saWZldGltZSA9IGxpZmV0aW1lOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X25vbmNlX2Zvcm1hdChjbWRfcGFybXMgKmNtZCwgdm9pZCAqY29uZmlnLAotCQkJCSAgICBjb25zdCBjaGFyICpmbXQpCi17Ci0gICAgKChkaWdlc3RfY29uZmlnX3JlYyAqKSBjb25maWcpLT5ub25jZV9mb3JtYXQgPSBmbXQ7Ci0gICAgcmV0dXJuICJBdXRoRGlnZXN0Tm9uY2VGb3JtYXQgaXMgbm90IGltcGxlbWVudGVkICh5ZXQpIjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9uY19jaGVjayhjbWRfcGFybXMgKmNtZCwgdm9pZCAqY29uZmlnLCBpbnQgZmxhZykKLXsKLSAgICAoKGRpZ2VzdF9jb25maWdfcmVjICopIGNvbmZpZyktPmNoZWNrX25jID0gZmxhZzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9hbGdvcml0aG0oY21kX3Bhcm1zICpjbWQsIHZvaWQgKmNvbmZpZywgY29uc3QgY2hhciAqYWxnKQotewotICAgIGlmICghc3RyY2FzZWNtcChhbGcsICJNRDUtc2VzcyIpKQotI2lmZGVmIEhBVkVfU0hNRU1fTU0KLQk7Ci0jZWxzZQkvKiBIQVZFX1NITUVNX01NICovCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfV0FSTklORywgY21kLT5zZXJ2ZXIsCi0JCSAgICAgIkRpZ2VzdDogV0FSTklORzogYWxnb3JpdGhtIGBNRDUtc2VzcycgaXMgY3VycmVudGx5IG5vdCAiCi0JCSAgICAgImNvcnJlY3RseSBpbXBsZW1lbnRlZCIpOwotI2VuZGlmCS8qIEhBVkVfU0hNRU1fTU0gKi8KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKGFsZywgIk1ENSIpKQotCXJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIkludmFsaWQgYWxnb3JpdGhtIGluIEF1dGhEaWdlc3RBbGdvcml0aG06ICIsIGFsZywgTlVMTCk7Ci0KLSAgICAoKGRpZ2VzdF9jb25maWdfcmVjICopIGNvbmZpZyktPmFsZ29yaXRobSA9IGFsZzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF91cmlfbGlzdChjbWRfcGFybXMgKmNtZCwgdm9pZCAqY29uZmlnLCBjb25zdCBjaGFyICp1cmkpCi17Ci0gICAgZGlnZXN0X2NvbmZpZ19yZWMgKmMgPSAoZGlnZXN0X2NvbmZpZ19yZWMgKikgY29uZmlnOwotICAgIGlmIChjLT51cmlfbGlzdCkgewotCWMtPnVyaV9saXN0W3N0cmxlbihjLT51cmlfbGlzdCktMV0gPSAnXDAnOwotCWMtPnVyaV9saXN0ID0gYXBfcHN0cmNhdChjbWQtPnBvb2wsIGMtPnVyaV9saXN0LCAiICIsIHVyaSwgIlwiIiwgTlVMTCk7Ci0gICAgfQotICAgIGVsc2UKLQljLT51cmlfbGlzdCA9IGFwX3BzdHJjYXQoY21kLT5wb29sLCAiLCBkb21haW49XCIiLCB1cmksICJcIiIsIE5VTEwpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgZGlnZXN0X2NtZHNbXSA9Ci17Ci0gICAgeyJBdXRoTmFtZSIsIHNldF9yZWFsbSwgTlVMTCwgT1JfQVVUSENGRywgVEFLRTEsCi0gICAgICJUaGUgYXV0aGVudGljYXRpb24gcmVhbG0gKGUuZy4gXCJNZW1iZXJzIE9ubHlcIikifSwKLSAgICB7IkF1dGhEaWdlc3RGaWxlIiwgc2V0X2RpZ2VzdF9maWxlLCBOVUxMLCBPUl9BVVRIQ0ZHLCBUQUtFMSwKLSAgICAgIlRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHVzZXJuYW1lcyBhbmQgcGFzc3dvcmQgaGFzaGVzIn0sCi0gICAgeyJBdXRoRGlnZXN0R3JvdXBGaWxlIiwgc2V0X2dyb3VwX2ZpbGUsIE5VTEwsIE9SX0FVVEhDRkcsIFRBS0UxLAotICAgICAiVGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgZ3JvdXAgbmFtZXMgYW5kIG1lbWJlcnMifSwKLSAgICB7IkF1dGhEaWdlc3RRb3AiLCBzZXRfcW9wLCBOVUxMLCBPUl9BVVRIQ0ZHLCBJVEVSQVRFLAotICAgICAiQSBsaXN0IG9mIHF1YWxpdHktb2YtcHJvdGVjdGlvbiBvcHRpb25zIn0sCi0gICAgeyJBdXRoRGlnZXN0Tm9uY2VMaWZldGltZSIsIHNldF9ub25jZV9saWZldGltZSwgTlVMTCwgT1JfQVVUSENGRywgVEFLRTEsCi0gICAgICJNYXhpbXVtIGxpZmV0aW1lIG9mIHRoZSBzZXJ2ZXIgbm9uY2UgKHNlY29uZHMpIn0sCi0gICAgeyJBdXRoRGlnZXN0Tm9uY2VGb3JtYXQiLCBzZXRfbm9uY2VfZm9ybWF0LCBOVUxMLCBPUl9BVVRIQ0ZHLCBUQUtFMSwKLSAgICAgIlRoZSBmb3JtYXQgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyB0aGUgc2VydmVyIG5vbmNlIn0sCi0gICAgeyJBdXRoRGlnZXN0TmNDaGVjayIsIHNldF9uY19jaGVjaywgTlVMTCwgT1JfQVVUSENGRywgRkxBRywKLSAgICAgIldoZXRoZXIgb3Igbm90IHRvIGNoZWNrIHRoZSBub25jZS1jb3VudCBzZW50IGJ5IHRoZSBjbGllbnQifSwKLSAgICB7IkF1dGhEaWdlc3RBbGdvcml0aG0iLCBzZXRfYWxnb3JpdGhtLCBOVUxMLCBPUl9BVVRIQ0ZHLCBUQUtFMSwKLSAgICAgIlRoZSBhbGdvcml0aG0gdXNlZCBmb3IgdGhlIGhhc2ggY2FsY3VsYXRpb24ifSwKLSAgICB7IkF1dGhEaWdlc3REb21haW4iLCBzZXRfdXJpX2xpc3QsIE5VTEwsIE9SX0FVVEhDRkcsIElURVJBVEUsCi0gICAgICJBIGxpc3Qgb2YgVVJJJ3Mgd2hpY2ggYmVsb25nIHRvIHRoZSBzYW1lIHByb3RlY3Rpb24gc3BhY2UgYXMgdGhlIGN1cnJlbnQgVVJJIn0sCi0gICAge05VTEx9Ci19OwotCi0KLSNpZmRlZiBIQVZFX1NITUVNX01NCi0vKgotICogY2xpZW50IGxpc3QgY29kZQotICoKLSAqIEVhY2ggY2xpZW50IGlzIGFzc2lnbmVkIGEgbnVtYmVyLCB3aGljaCBpcyB0cmFuc2ZlcmVkIGluIHRoZSBvcGFxdWUKLSAqIGZpZWxkIG9mIHRoZSBXV1ctQXV0aGVudGljYXRlIGFuZCBBdXRob3JpemF0aW9uIGhlYWRlcnMuIFRoZSBudW1iZXIKLSAqIGlzIGp1c3QgYSBzaW1wbGUgY291bnRlciB3aGljaCBpcyBpbmNyZW1lbnRlZCBmb3IgZWFjaCBuZXcgY2xpZW50LgotICogQ2xpZW50cyBjYW4ndCBmb3JnZSB0aGlzIG51bWJlciBiZWNhdXNlIGl0IGlzIGhhc2hlZCB1cCBpbnRvIHRoZQotICogc2VydmVyIG5vbmNlLCBhbmQgdGhhdCBpcyBjaGVja2VkLgotICoKLSAqIFRoZSBjbGllbnRzIGFyZSBrZXB0IGluIGEgc2ltcGxlIGhhc2ggdGFibGUsIHdoaWNoIGNvbnNpc3RzIG9mIGFuCi0gKiBhcnJheSBvZiBjbGllbnRfZW50cnkncywgZWFjaCB3aXRoIGEgbGlua2VkIGxpc3Qgb2YgZW50cmllcyBoYW5naW5nCi0gKiBvZmYgaXQuIFRoZSBjbGllbnQncyBudW1iZXIgbW9kdWxvIHRoZSBzaXplIG9mIHRoZSBhcnJheSBnaXZlcyB0aGUKLSAqIGJ1Y2tldCBudW1iZXIuCi0gKgotICogVGhlIGNsaWVudHMgYXJlIGdhcmJhZ2UgY29sbGVjdGVkIHdoZW5ldmVyIGEgbmV3IGNsaWVudCBpcyBhbGxvY2F0ZWQKLSAqIGJ1dCB0aGVyZSBpcyBub3QgZW5vdWdoIHNwYWNlIGxlZnQgaW4gdGhlIHNoYXJlZCBtZW1vcnkgc2VnbWVudC4gQQotICogc2ltcGxlIHNlbWktTFJVIGlzIHVzZWQgZm9yIHRoaXM6IHdoZW5ldmVyIGEgY2xpZW50IGVudHJ5IGlzIGFjY2Vzc2VkCi0gKiBpdCBpcyBtb3ZlZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5rZWQgbGlzdCBpbiBpdHMgYnVja2V0ICh0aGlzCi0gKiBhbHNvIG1ha2VzIGZvciBmYXN0ZXIgbG9va3VwcyBmb3IgY3VycmVudCBjbGllbnRzKS4gVGhlIGdhcmJhZ2UKLSAqIGNvbGxlY3RlciB0aGVuIGp1c3QgcmVtb3ZlcyB0aGUgb2xkZXN0IGVudHJ5IChpLmUuIHRoZSBvbmUgYXQgdGhlCi0gKiBlbmQgb2YgdGhlIGxpc3QpIGluIGVhY2ggYnVja2V0LgotICoKLSAqIFRoZSBtYWluIGFkdmFudGFnZXMgb2YgdGhlIGFib3ZlIHNjaGVtZSBhcmUgdGhhdCBpdCdzIGVhc3kgdG8gaW1wbGVtZW50Ci0gKiBhbmQgaXQga2VlcHMgdGhlIGhhc2ggdGFibGUgZXZlbmx5IGJhbGFuY2VkIChpLmUuIHNhbWUgbnVtYmVyIG9mIGVudHJpZXMKLSAqIGluIGVhY2ggYnVja2V0KS4gVGhlIG1ham9yIGRpc2FkdmFudGFnZSBpcyB0aGF0IHlvdSBtYXkgYmUgdGhyb3dpbmcKLSAqIGVudHJpZXMgb3V0IHdoaWNoIGFyZSBpbiBhY3RpdmUgdXNlLiBUaGlzIGlzIG5vdCB0cmFnaWMsIGFzIHRoZXNlCi0gKiBjbGllbnRzIHdpbGwganVzdCBiZSBzZW50IGEgbmV3IGNsaWVudCBpZCAob3BhcXVlIGZpZWxkKSBhbmQgbm9uY2UKLSAqIHdpdGggYSBzdGFsZT10cnVlIChpLmUuIGl0IHdpbGwganVzdCBsb29rIGxpa2UgdGhlIG5vbmNlIGV4cGlyZWQsCi0gKiB0aGVyZWJ5IGZvcmNpbmcgYW4gZXh0cmEgcm91bmQgdHJpcCkuIElmIHRoZSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQKLSAqIGhhcyBlbm91Z2ggaGVhZHJvb20gb3ZlciB0aGUgY3VycmVudCBjbGllbnQgc2V0IHNpemUgdGhlbiB0aGlzIHNob3VsZAotICogbm90IG9jY3VyIHRvbyBvZnRlbi4KLSAqCi0gKiBUbyBoZWxwIHR1bmUgdGhlIHNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnkgc2VnbWVudCAoYW5kIHNlZSBpZiB0aGUKLSAqIGFib3ZlIGFsZ29yaXRobSBpcyByZWFsbHkgc3VmZmljaWVudCkgYSBzZXQgb2YgY291bnRlcnMgaXMga2VwdAotICogaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIGNsaWVudHMgaGVsZCwgdGhlIG51bWJlciBvZiBnYXJiYWdlIGNvbGxlY3RlZAotICogY2xpZW50cywgYW5kIHRoZSBudW1iZXIgb2YgZXJyb25lb3VzbHkgcHVyZ2VkIGNsaWVudHMuIFRoZXNlIGFyZSBwcmludGVkCi0gKiBvdXQgYXQgZWFjaCBnYXJiYWdlIGNvbGxlY3Rpb24gcnVuLiBOb3RlIHRoYXQgYWNjZXNzIHRvIHRoZSBjb3VudGVycyBpcwotICogbm90IHN5bmNocm9uaXplZCBiZWNhdXNlIHRoZXkgYXJlIGp1c3QgaW5kaWNhdGVycywgYW5kIHdoZXRoZXIgdGhleSBhcmUKLSAqIG9mZiBieSBhIGZldyBkb2Vzbid0IG1hdHRlcjsgYW5kIGZvciB0aGUgc2FtZSByZWFzb24gbm8gYXR0ZW1wdCBpcyBtYWRlCi0gKiB0byBndWFyYW50ZWUgdGhlIG51bV9yZW5ld2VkIGlzIGNvcnJlY3QgaW4gdGhlIGZhY2Ugb2YgY2xpZW50cyBzcG9vZmluZwotICogdGhlIG9wYXF1ZSBmaWVsZC4KLSAqLwotCi0vKgotICogR2V0IHRoZSBjbGllbnQgZ2l2ZW4gaXRzIGNsaWVudCBudW1iZXIgKHRoZSBrZXkpLiBSZXR1cm5zIHRoZSBlbnRyeSwKLSAqIG9yIE5VTEwgaWYgaXRzIG5vdCBmb3VuZC4KLSAqCi0gKiBBY2Nlc3MgdG8gdGhlIGxpc3QgaXRzZWxmIGlzIHN5bmNocm9uaXplZCB2aWEgbG9ja3MuIEhvd2V2ZXIsIGFjY2VzcwotICogdG8gdGhlIGVudHJ5IHJldHVybmVkIGJ5IGdldF9jbGllbnQoKSBpcyBOT1Qgc3luY2hyb25pemVkLiBUaGlzIG1lYW5zCi0gKiB0aGF0IHRoZXJlIGFyZSBwb3RlbnRpYWxseSBwcm9ibGVtcyBpZiBhIGNsaWVudCB1c2VzIG11bHRpcGxlLAotICogc2ltdWx0YW5lb3VzIGNvbm5lY3Rpb25zIHRvIGFjY2VzcyB1cmwncyB3aXRoaW4gdGhlIHNhbWUgcHJvdGVjdGlvbgotICogc3BhY2UuIEhvd2V2ZXIsIHRoZXNlIHByb2JsZW1zIGFyZSBub3QgbmV3OiB3aGVuIHVzaW5nIG11bHRpcGxlCi0gKiBjb25uZWN0aW9ucyB5b3UgaGF2ZSBubyBndWFyYW50ZWUgb2YgdGhlIG9yZGVyIHRoZSByZXF1ZXN0cyBhcmUKLSAqIHByb2Nlc3NlZCBhbnl3YXksIHNvIHlvdSBoYXZlIHByb2JsZW1zIHdpdGggdGhlIG5vbmNlLWNvdW50IGFuZAotICogb25lLXRpbWUgbm9uY2VzIGFueXdheS4KLSAqLwotc3RhdGljIGNsaWVudF9lbnRyeSAqZ2V0X2NsaWVudCh1bnNpZ25lZCBsb25nIGtleSwgY29uc3QgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IGJ1Y2tldDsKLSAgICBjbGllbnRfZW50cnkgKmVudHJ5LCAqcHJldiA9IE5VTEw7Ci0KLQotICAgIGlmICgha2V5IHx8ICFjbGllbnRfbW0pICByZXR1cm4gTlVMTDsKLQotICAgIGJ1Y2tldCA9IGtleSAlIGNsaWVudF9saXN0LT50YmxfbGVuOwotICAgIGVudHJ5ICA9IGNsaWVudF9saXN0LT50YWJsZVtidWNrZXRdOwotCi0gICAgbW1fbG9jayhjbGllbnRfbW0sIE1NX0xPQ0tfUkQpOwotCi0gICAgd2hpbGUoZW50cnkgJiYga2V5ICE9IGVudHJ5LT5rZXkpIHsKLQlwcmV2ICA9IGVudHJ5OwotCWVudHJ5ID0gZW50cnktPm5leHQ7Ci0gICAgfQotCi0gICAgaWYgKGVudHJ5ICYmIHByZXYpIHsJCS8qIG1vdmUgZW50cnkgdG8gZnJvbnQgb2YgbGlzdCAqLwotCXByZXYtPm5leHQgID0gZW50cnktPm5leHQ7Ci0JZW50cnktPm5leHQgPSBjbGllbnRfbGlzdC0+dGFibGVbYnVja2V0XTsKLQljbGllbnRfbGlzdC0+dGFibGVbYnVja2V0XSA9IGVudHJ5OwotICAgIH0KLQotICAgIG1tX3VubG9jayhjbGllbnRfbW0pOwotCi0gICAgaWYgKGVudHJ5KQotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19ERUJVRywgciwKLQkJICAgICAgImdldF9jbGllbnQoKTogY2xpZW50ICVsdSBmb3VuZCIsIGtleSk7Ci0gICAgZWxzZQotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19ERUJVRywgciwKLQkJICAgICAgImdldF9jbGllbnQoKTogY2xpZW50ICVsdSBub3QgZm91bmQiLCBrZXkpOwotCi0gICAgcmV0dXJuIGVudHJ5OwotfQotCi0KLS8qIEEgc2ltcGxlIGdhcmJhZ2UtY29sbGVjdGVyIHRvIHJlbW92ZSB1bnVzZWQgY2xpZW50cy4gSXQgcmVtb3ZlcyB0aGUKLSAqIGxhc3QgZW50cnkgaW4gZWFjaCBidWNrZXQgYW5kIHVwZGF0ZXMgdGhlIGNvdW50ZXJzLiBSZXR1cm5zIHRoZQotICogbnVtYmVyIG9mIHJlbW92ZWQgZW50cmllcy4KLSAqLwotc3RhdGljIGxvbmcgZ2Modm9pZCkKLXsKLSAgICBjbGllbnRfZW50cnkgKmVudHJ5LCAqcHJldjsKLSAgICB1bnNpZ25lZCBsb25nIG51bV9yZW1vdmVkID0gMCwgaWR4OwotCi0gICAgLyogZ2FyYmFnZSBjb2xsZWN0IGFsbCBsYXN0IGVudHJpZXMgKi8KLQotICAgIGZvciAoaWR4PTA7IGlkeDxjbGllbnRfbGlzdC0+dGJsX2xlbjsgaWR4KyspIHsKLQllbnRyeSA9IGNsaWVudF9saXN0LT50YWJsZVtpZHhdOwotCXByZXYgID0gTlVMTDsKLQl3aGlsZSAoZW50cnktPm5leHQpIHsJLyogZmluZCBsYXN0IGVudHJ5ICovCi0JICAgIHByZXYgID0gZW50cnk7Ci0JICAgIGVudHJ5ID0gZW50cnktPm5leHQ7Ci0JfQotCWlmIChwcmV2KSAgcHJldi0+bmV4dCA9IE5VTEw7CS8qIGN1dCBsaXN0ICovCi0JZWxzZSAgICAgICBjbGllbnRfbGlzdC0+dGFibGVbaWR4XSA9IE5VTEw7Ci0JaWYgKGVudHJ5KSB7CQkJLyogcmVtb3ZlIGVudHJ5ICovCi0JICAgIG1tX2ZyZWUoY2xpZW50X21tLCBlbnRyeSk7Ci0JICAgIG51bV9yZW1vdmVkKys7Ci0JfQotICAgIH0KLQotICAgIC8qIHVwZGF0ZSBjb3VudGVycyBhbmQgbG9nICovCi0KLSAgICBjbGllbnRfbGlzdC0+bnVtX2VudHJpZXMgLT0gbnVtX3JlbW92ZWQ7Ci0gICAgY2xpZW50X2xpc3QtPm51bV9yZW1vdmVkICs9IG51bV9yZW1vdmVkOwotCi0gICAgcmV0dXJuIG51bV9yZW1vdmVkOwotfQotCi0KLS8qCi0gKiBBZGQgYSBuZXcgY2xpZW50IHRvIHRoZSBsaXN0LiBSZXR1cm5zIHRoZSBlbnRyeSBpZiBzdWNjZXNzZnVsLCBOVUxMCi0gKiBvdGhlcndpc2UuIFRoaXMgdHJpZ2dlcnMgdGhlIGdhcmJhZ2UgY29sbGVjdGlvbiBpcyBtZW1vcnkgaXMgbG93LgotICovCi1zdGF0aWMgY2xpZW50X2VudHJ5ICphZGRfY2xpZW50KHVuc2lnbmVkIGxvbmcga2V5LCBjbGllbnRfZW50cnkgKm5ldywKLQkJCQlzZXJ2ZXJfcmVjICpzKQotewotICAgIGludCBidWNrZXQ7Ci0gICAgY2xpZW50X2VudHJ5ICplbnRyeTsKLQotCi0gICAgaWYgKCFrZXkgfHwgIWNsaWVudF9tbSkgIHJldHVybiBOVUxMOwotCi0gICAgYnVja2V0ID0ga2V5ICUgY2xpZW50X2xpc3QtPnRibF9sZW47Ci0gICAgZW50cnkgID0gY2xpZW50X2xpc3QtPnRhYmxlW2J1Y2tldF07Ci0KLSAgICBtbV9sb2NrKGNsaWVudF9tbSwgTU1fTE9DS19SVyk7Ci0KLSAgICAvKiB0cnkgdG8gYWxsb2NhdGUgYSBuZXcgZW50cnkgKi8KLQotICAgIGVudHJ5ID0gbW1fbWFsbG9jKGNsaWVudF9tbSwgc2l6ZW9mKGNsaWVudF9lbnRyeSkpOwotICAgIGlmICghZW50cnkpIHsKLQlsb25nIG51bV9yZW1vdmVkID0gZ2MoKTsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19JTkZPLCBzLAotCQkgICAgICJEaWdlc3Q6IGdjJ2QgJWxkIGNsaWVudCBlbnRyaWVzLiBUb3RhbCBuZXcgY2xpZW50czogIgotCQkgICAgICIlbGQ7IFRvdGFsIHJlbW92ZWQgY2xpZW50czogJWxkOyBUb3RhbCByZW5ld2VkIGNsaWVudHM6ICIKLQkJICAgICAiJWxkIiwgbnVtX3JlbW92ZWQsCi0JCSAgICAgY2xpZW50X2xpc3QtPm51bV9jcmVhdGVkIC0gY2xpZW50X2xpc3QtPm51bV9yZW5ld2VkLAotCQkgICAgIGNsaWVudF9saXN0LT5udW1fcmVtb3ZlZCwgY2xpZW50X2xpc3QtPm51bV9yZW5ld2VkKTsKLQllbnRyeSA9IG1tX21hbGxvYyhjbGllbnRfbW0sIHNpemVvZihjbGllbnRfZW50cnkpKTsKLQlpZiAoIWVudHJ5KSAgcmV0dXJuIE5VTEw7CS8qIGdpdmUgdXAgKi8KLSAgICB9Ci0KLSAgICAvKiBub3cgYWRkIHRoZSBlbnRyeSAqLwotCi0gICAgbWVtY3B5KGVudHJ5LCBuZXcsIHNpemVvZihjbGllbnRfZW50cnkpKTsKLSAgICBlbnRyeS0+a2V5ICA9IGtleTsKLSAgICBlbnRyeS0+bmV4dCA9IGNsaWVudF9saXN0LT50YWJsZVtidWNrZXRdOwotICAgIGNsaWVudF9saXN0LT50YWJsZVtidWNrZXRdID0gZW50cnk7Ci0gICAgY2xpZW50X2xpc3QtPm51bV9jcmVhdGVkKys7Ci0gICAgY2xpZW50X2xpc3QtPm51bV9lbnRyaWVzKys7Ci0KLSAgICBtbV91bmxvY2soY2xpZW50X21tKTsKLQotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0RFQlVHLCBzLAotCQkgImFsbG9jYXRlZCBuZXcgY2xpZW50ICVsdSIsIGtleSk7Ci0KLSAgICByZXR1cm4gZW50cnk7Ci19Ci0jZWxzZQkvKiBIQVZFX1NITUVNX01NICovCi1zdGF0aWMgY2xpZW50X2VudHJ5ICpnZXRfY2xpZW50KHVuc2lnbmVkIGxvbmcga2V5LCBjb25zdCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICByZXR1cm4gTlVMTDsKLX0KLSNlbmRpZgkvKiBIQVZFX1NITUVNX01NICovCi0KLQotLyoKLSAqIEF1dGhvcml6YXRpb24gaGVhZGVyIHBhcnNlciBjb2RlCi0gKi8KLQotLyogUGFyc2UgdGhlIEF1dGhvcml6YXRpb24gaGVhZGVyLCBpZiBpdCBleGlzdHMgKi8KLXN0YXRpYyBpbnQgZ2V0X2RpZ2VzdF9yZWMocmVxdWVzdF9yZWMgKnIsIGRpZ2VzdF9oZWFkZXJfcmVjICpyZXNwKQotewotICAgIGNvbnN0IGNoYXIgKmF1dGhfbGluZSA9IGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLAotCQkJCQkgci0+cHJveHlyZXEgPyAiUHJveHktQXV0aG9yaXphdGlvbiIKLQkJCQkJCSAgICAgOiAiQXV0aG9yaXphdGlvbiIpOwotICAgIHNpemVfdCBsOwotICAgIGludCB2ayA9IDAsIHZ2ID0gMDsKLSAgICBjaGFyICprZXksICp2YWx1ZTsKLQotCi0gICAgaWYgKCFhdXRoX2xpbmUpIHsKLQlyZXNwLT5hdXRoX2hkcl9zdHMgPSBOT19IRUFERVI7Ci0JcmV0dXJuICFPSzsKLSAgICB9Ci0KLSAgICByZXNwLT5zY2hlbWUgPSBhcF9nZXR3b3JkX3doaXRlKHItPnBvb2wsICZhdXRoX2xpbmUpOwotICAgIGlmIChzdHJjYXNlY21wKHJlc3AtPnNjaGVtZSwgIkRpZ2VzdCIpKSB7Ci0JcmVzcC0+YXV0aF9oZHJfc3RzID0gTk9UX0RJR0VTVDsKLQlyZXR1cm4gIU9LOwotICAgIH0KLQotICAgIGwgPSBzdHJsZW4oYXV0aF9saW5lKTsKLQotICAgIGtleSAgID0gYXBfcGFsbG9jKHItPnBvb2wsIGwrMSk7Ci0gICAgdmFsdWUgPSBhcF9wYWxsb2Moci0+cG9vbCwgbCsxKTsKLQotICAgIHdoaWxlIChhdXRoX2xpbmVbMF0gIT0gJ1wwJykgewotCi0JLyogZmluZCBrZXkgKi8KLQotCXdoaWxlIChhcF9pc3NwYWNlKGF1dGhfbGluZVswXSkpIGF1dGhfbGluZSsrOwotCXZrID0gMDsKLQl3aGlsZSAoYXV0aF9saW5lWzBdICE9ICc9JyAmJiBhdXRoX2xpbmVbMF0gIT0gJywnCi0JICAgICAgICYmIGF1dGhfbGluZVswXSAhPSAnXDAnICYmICFhcF9pc3NwYWNlKGF1dGhfbGluZVswXSkpCi0JICAgIGtleVt2aysrXSA9ICphdXRoX2xpbmUrKzsKLQlrZXlbdmtdID0gJ1wwJzsKLQl3aGlsZSAoYXBfaXNzcGFjZShhdXRoX2xpbmVbMF0pKSBhdXRoX2xpbmUrKzsKLQotCS8qIGZpbmQgdmFsdWUgKi8KLQotCWlmIChhdXRoX2xpbmVbMF0gPT0gJz0nKSB7Ci0JICAgIGF1dGhfbGluZSsrOwotCSAgICB3aGlsZSAoYXBfaXNzcGFjZShhdXRoX2xpbmVbMF0pKSBhdXRoX2xpbmUrKzsKLQotCSAgICB2diA9IDA7Ci0JICAgIGlmIChhdXRoX2xpbmVbMF0gPT0gJ1wiJykgewkJLyogcXVvdGVkIHN0cmluZyAqLwotCQlhdXRoX2xpbmUrKzsKLQkJd2hpbGUgKGF1dGhfbGluZVswXSAhPSAnXCInICYmIGF1dGhfbGluZVswXSAhPSAnXDAnKSB7Ci0JCSAgICBpZiAoYXV0aF9saW5lWzBdID09ICdcXCcgJiYgYXV0aF9saW5lWzFdICE9ICdcMCcpCi0JCQlhdXRoX2xpbmUrKzsJCS8qIGVzY2FwZWQgY2hhciAqLwotCQkgICAgdmFsdWVbdnYrK10gPSAqYXV0aF9saW5lKys7Ci0JCX0KLQkJaWYgKGF1dGhfbGluZVswXSAhPSAnXDAnKSBhdXRoX2xpbmUrKzsKLQkgICAgfQotCSAgICBlbHNlIHsJCQkJIC8qIHRva2VuICovCi0JCXdoaWxlIChhdXRoX2xpbmVbMF0gIT0gJywnICYmIGF1dGhfbGluZVswXSAhPSAnXDAnCi0JCSAgICAgICAmJiAhYXBfaXNzcGFjZShhdXRoX2xpbmVbMF0pKQotCQkgICAgdmFsdWVbdnYrK10gPSAqYXV0aF9saW5lKys7Ci0JICAgIH0KLQkgICAgdmFsdWVbdnZdID0gJ1wwJzsKLQl9Ci0KLQl3aGlsZSAoYXV0aF9saW5lWzBdICE9ICcsJyAmJiBhdXRoX2xpbmVbMF0gIT0gJ1wwJykgIGF1dGhfbGluZSsrOwotCWlmIChhdXRoX2xpbmVbMF0gIT0gJ1wwJykgYXV0aF9saW5lKys7Ci0KLQlpZiAoIXN0cmNhc2VjbXAoa2V5LCAidXNlcm5hbWUiKSkKLQkgICAgcmVzcC0+dXNlcm5hbWUgPSBhcF9wc3RyZHVwKHItPnBvb2wsIHZhbHVlKTsKLQllbHNlIGlmICghc3RyY2FzZWNtcChrZXksICJyZWFsbSIpKQotCSAgICByZXNwLT5yZWFsbSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgdmFsdWUpOwotCWVsc2UgaWYgKCFzdHJjYXNlY21wKGtleSwgIm5vbmNlIikpCi0JICAgIHJlc3AtPm5vbmNlID0gYXBfcHN0cmR1cChyLT5wb29sLCB2YWx1ZSk7Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAoa2V5LCAidXJpIikpCi0JICAgIHJlc3AtPnVyaSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgdmFsdWUpOwotCWVsc2UgaWYgKCFzdHJjYXNlY21wKGtleSwgInJlc3BvbnNlIikpCi0JICAgIHJlc3AtPmRpZ2VzdCA9IGFwX3BzdHJkdXAoci0+cG9vbCwgdmFsdWUpOwotCWVsc2UgaWYgKCFzdHJjYXNlY21wKGtleSwgImFsZ29yaXRobSIpKQotCSAgICByZXNwLT5hbGdvcml0aG0gPSBhcF9wc3RyZHVwKHItPnBvb2wsIHZhbHVlKTsKLQllbHNlIGlmICghc3RyY2FzZWNtcChrZXksICJjbm9uY2UiKSkKLQkgICAgcmVzcC0+Y25vbmNlID0gYXBfcHN0cmR1cChyLT5wb29sLCB2YWx1ZSk7Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAoa2V5LCAib3BhcXVlIikpCi0JICAgIHJlc3AtPm9wYXF1ZSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgdmFsdWUpOwotCWVsc2UgaWYgKCFzdHJjYXNlY21wKGtleSwgInFvcCIpKQotCSAgICByZXNwLT5tZXNzYWdlX3FvcCA9IGFwX3BzdHJkdXAoci0+cG9vbCwgdmFsdWUpOwotCWVsc2UgaWYgKCFzdHJjYXNlY21wKGtleSwgIm5jIikpCi0JICAgIHJlc3AtPm5vbmNlX2NvdW50ID0gYXBfcHN0cmR1cChyLT5wb29sLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgaWYgKCFyZXNwLT51c2VybmFtZSB8fCAhcmVzcC0+cmVhbG0gfHwgIXJlc3AtPm5vbmNlIHx8ICFyZXNwLT51cmkKLQl8fCAhcmVzcC0+ZGlnZXN0KSB7Ci0JcmVzcC0+YXV0aF9oZHJfc3RzID0gSU5WQUxJRDsKLQlyZXR1cm4gIU9LOwotICAgIH0KLQotICAgIGlmIChyZXNwLT5vcGFxdWUpCi0JcmVzcC0+b3BhcXVlX251bSA9ICh1bnNpZ25lZCBsb25nKSBzdHJ0b2wocmVzcC0+b3BhcXVlLCBOVUxMLCAxNik7Ci0KLSAgICByZXNwLT5hdXRoX2hkcl9zdHMgPSBWQUxJRDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotLyogQmVjYXVzZSB0aGUgYnJvd3NlciBtYXkgcHJlZW1wdGl2ZWx5IHNlbmQgYXV0aCBpbmZvLCBpbmNyZW1lbnRpbmcgdGhlCi0gKiBub25jZS1jb3VudCB3aGVuIGl0IGRvZXMsIGFuZCBiZWNhdXNlIHRoZSBjbGllbnQgZG9lcyBub3QgZ2V0IG5vdGlmaWVkCi0gKiBpZiB0aGUgVVJJIGRpZG4ndCBuZWVkIGF1dGhlbnRpY2F0aW9uIGFmdGVyIGFsbCwgd2UgbmVlZCB0byBiZSBzdXJlIHRvCi0gKiB1cGRhdGUgdGhlIG5vbmNlLWNvdW50IGVhY2ggdGltZSB3ZSByZWNlaXZlIGFuIEF1dGhvcml6YXRpb24gaGVhZGVyIG5vCi0gKiBtYXR0ZXIgd2hhdCB0aGUgZmluYWwgb3V0Y29tZSBvZiB0aGUgcmVxdWVzdC4gRnVydGhlcm1vcmUgdGhpcyBpcyBhCi0gKiBjb252ZW5pZW50IHBsYWNlIHRvIGdldCB0aGUgcmVxdWVzdC11cmkgKGJlZm9yZSBhbnkgc3VicmVxdWVzdHMgZXRjCi0gKiBhcmUgaW5pdGlhdGVkKSBhbmQgdG8gaW5pdGlhbGl6ZSB0aGUgcmVxdWVzdF9jb25maWcuCi0gKgotICogTm90ZSB0aGF0IHRoaXMgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbW9kX3Byb3h5IGhhZCBpdHMgZ28gc28gdGhhdAotICogci0+cHJveHlyZXEgaXMgc2V0IGNvcnJlY3RseS4KLSAqLwotc3RhdGljIGludCB1cGRhdGVfbm9uY2VfY291bnQocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgZGlnZXN0X2hlYWRlcl9yZWMgKnJlc3A7Ci0gICAgaW50IHJlczsKLQotICAgIGlmICghYXBfaXNfaW5pdGlhbF9yZXEocikpCi0JcmV0dXJuIERFQ0xJTkVEOwotCi0gICAgcmVzcCA9IGFwX3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKGRpZ2VzdF9oZWFkZXJfcmVjKSk7Ci0gICAgcmVzcC0+cmVxdWVzdF91cmkgPSAmci0+cGFyc2VkX3VyaTsKLSAgICByZXNwLT5uZWVkZWRfYXV0aCA9IDA7Ci0gICAgYXBfc2V0X21vZHVsZV9jb25maWcoci0+cmVxdWVzdF9jb25maWcsICZkaWdlc3RfYXV0aF9tb2R1bGUsIHJlc3ApOwotCi0gICAgcmVzID0gZ2V0X2RpZ2VzdF9yZWMociwgcmVzcCk7Ci0gICAgcmVzcC0+Y2xpZW50ID0gZ2V0X2NsaWVudChyZXNwLT5vcGFxdWVfbnVtLCByKTsKLSAgICBpZiAocmVzID09IE9LICYmIHJlc3AtPmNsaWVudCkKLQlyZXNwLT5jbGllbnQtPm5vbmNlX2NvdW50Kys7Ci0KLSAgICByZXR1cm4gREVDTElORUQ7Ci19Ci0KLQotLyoKLSAqIE5vbmNlIGdlbmVyYXRpb24gY29kZQotICovCi0KLS8qIFRoZSBoYXNoIHBhcnQgb2YgdGhlIG5vbmNlIGlzIGEgU0hBLTEgaGFzaCBvZiB0aGUgdGltZSwgcmVhbG0sIG9wYXF1ZSwKLSAqIGFuZCBvdXIgc2VjcmV0LgotICovCi1zdGF0aWMgdm9pZCBnZW5fbm9uY2VfaGFzaChjaGFyICpoYXNoLCBjb25zdCBjaGFyICp0aW1lc3RyLCBjb25zdCBjaGFyICpvcGFxdWUsCi0JCQkgICBjb25zdCBzZXJ2ZXJfcmVjICpzZXJ2ZXIsCi0JCQkgICBjb25zdCBkaWdlc3RfY29uZmlnX3JlYyAqY29uZikKLXsKLSAgICBjb25zdCBjaGFyICpoZXggPSAiMDEyMzQ1Njc4OWFiY2RlZiI7Ci0gICAgdW5zaWduZWQgY2hhciBzaGExW1NIQV9ESUdFU1RTSVpFXTsKLSAgICBBUF9TSEExX0NUWCBjdHg7Ci0gICAgaW50IGlkeDsKLQotICAgIG1lbWNweSgmY3R4LCAmY29uZi0+bm9uY2VfY3R4LCBzaXplb2YoY3R4KSk7Ci0gICAgYXBfU0hBMVVwZGF0ZV9iaW5hcnkoJmN0eCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgc2VydmVyLT5zZXJ2ZXJfaG9zdG5hbWUsCi0JCQkgc3RybGVuKHNlcnZlci0+c2VydmVyX2hvc3RuYW1lKSk7Ci0gICAgYXBfU0hBMVVwZGF0ZV9iaW5hcnkoJmN0eCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgJnNlcnZlci0+cG9ydCwKLQkJCSBzaXplb2Yoc2VydmVyLT5wb3J0KSk7Ci0gICAgYXBfU0hBMVVwZGF0ZV9iaW5hcnkoJmN0eCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgdGltZXN0ciwgc3RybGVuKHRpbWVzdHIpKTsKLSAgICBpZiAob3BhcXVlKQotCWFwX1NIQTFVcGRhdGVfYmluYXJ5KCZjdHgsIChjb25zdCB1bnNpZ25lZCBjaGFyICopIG9wYXF1ZSwKLQkJCSAgICAgc3RybGVuKG9wYXF1ZSkpOwotICAgIGFwX1NIQTFGaW5hbChzaGExLCAmY3R4KTsKLQotICAgIGZvciAoaWR4PTA7IGlkeDxTSEFfRElHRVNUU0laRTsgaWR4KyspIHsKLQkqaGFzaCsrID0gaGV4W3NoYTFbaWR4XSA+PiA0XTsKLQkqaGFzaCsrID0gaGV4W3NoYTFbaWR4XSAmIDB4Rl07Ci0gICAgfQotCi0gICAgKmhhc2grKyA9ICdcMCc7Ci19Ci0KLQotLyogVGhlIG5vbmNlIGhhcyB0aGUgZm9ybWF0IGI2NCh0aW1lKStoYXNoIC4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmdlbl9ub25jZShwb29sICpwLCB0aW1lX3Qgbm93LCBjb25zdCBjaGFyICpvcGFxdWUsCi0JCQkgICAgIGNvbnN0IHNlcnZlcl9yZWMgKnNlcnZlciwKLQkJCSAgICAgY29uc3QgZGlnZXN0X2NvbmZpZ19yZWMgKmNvbmYpCi17Ci0gICAgY2hhciAqbm9uY2UgPSBhcF9wYWxsb2MocCwgTk9OQ0VfTEVOKzEpOwotICAgIHRpbWVfcmVjIHQ7Ci0KLSAgICBpZiAoY29uZi0+bm9uY2VfbGlmZXRpbWUgIT0gMCkKLQl0LnRpbWUgPSBub3c7Ci0gICAgZWxzZQotI2lmZGVmIEhBVkVfU0hNRU1fTU0KLQkvKiB0aGlzIGNvdW50ZXIgaXMgbm90IHN5bmNoJ2QsIGJlY2F1c2UgaXQgZG9lc24ndCByZWFsbHkgbWF0dGVyCi0JICogaWYgaXQgY291bnRzIGV4YWN0bHkuCi0JICovCi0JdC50aW1lID0gKCpvdG5fY291bnRlcikrKzsKLSNlbHNlCS8qIEhBVkVfU0hNRU1fTU0gKi8KLQl0LnRpbWUgPSA0MjsKLSNlbmRpZgkvKiBIQVZFX1NITUVNX01NICovCi0gICAgYXBfYmFzZTY0ZW5jb2RlX2JpbmFyeShub25jZSwgdC5hcnIsIHNpemVvZih0LmFycikpOwotICAgIGdlbl9ub25jZV9oYXNoKG5vbmNlK05PTkNFX1RJTUVfTEVOLCBub25jZSwgb3BhcXVlLCBzZXJ2ZXIsIGNvbmYpOwotCi0gICAgcmV0dXJuIG5vbmNlOwotfQotCi0KLS8qCi0gKiBPcGFxdWUgYW5kIGhhc2gtdGFibGUgbWFuYWdlbWVudAotICovCi0KLSNpZmRlZiBIQVZFX1NITUVNX01NCi0vKgotICogR2VuZXJhdGUgYSBuZXcgY2xpZW50IGVudHJ5LCBhZGQgaXQgdG8gdGhlIGxpc3QsIGFuZCByZXR1cm4gdGhlCi0gKiBlbnRyeS4gUmV0dXJucyBOVUxMIGlmIGZhaWxlZC4KLSAqLwotc3RhdGljIGNsaWVudF9lbnRyeSAqZ2VuX2NsaWVudChjb25zdCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICB1bnNpZ25lZCBsb25nIG9wOwotICAgIGNsaWVudF9lbnRyeSBuZXcgPSB7IDAsIE5VTEwsIDAsICIiLCAiIiB9LCAqZW50cnk7Ci0KLSAgICBpZiAoIW9wYXF1ZV9tbSkgIHJldHVybiAwOwotCi0gICAgbW1fbG9jayhvcGFxdWVfbW0sIE1NX0xPQ0tfUlcpOwotICAgIG9wID0gKCpvcGFxdWVfY250cikrKzsKLSAgICBtbV91bmxvY2sob3BhcXVlX21tKTsKLQotICAgIGlmICghKGVudHJ5ID0gYWRkX2NsaWVudChvcCwgJm5ldywgci0+c2VydmVyKSkpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgciwKLQkJICAgICAgIkRpZ2VzdDogZmFpbGVkIHRvIGFsbG9jYXRlIGNsaWVudCBlbnRyeSAtIGlnbm9yaW5nICIKLQkJICAgICAgImNsaWVudCIpOwotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBlbnRyeTsKLX0KLSNlbHNlCS8qIEhBVkVfU0hNRU1fTU0gKi8KLXN0YXRpYyBjbGllbnRfZW50cnkgKmdlbl9jbGllbnQoY29uc3QgcmVxdWVzdF9yZWMgKnIpIHsgcmV0dXJuIE5VTEw7IH0KLSNlbmRpZgkvKiBIQVZFX1NITUVNX01NICovCi0KLQotCi0vKgotICogTUQ1LXNlc3MgY29kZS4KLSAqCi0gKiBJZiB5b3Ugd2FudCB0byB1c2UgYWxnb3JpdGhtPU1ENS1zZXNzIHlvdSBtdXN0IHdyaXRlIGdldF91c2VycHdfaGFzaCgpCi0gKiB5b3Vyc2VsZiAoc2VlIGJlbG93KS4gVGhlIGR1bW15IHByb3ZpZGVkIGhlcmUganVzdCByZXR1cm5zIHRoZSBoYXNoCi0gKiBmcm9tIHRoZSBhdXRoLWZpbGUsIGkuZS4gaXQgaXMgb25seSB1c2VmdWwgZm9yIHRlc3RpbmcgY2xpZW50Ci0gKiBpbXBsZW1lbnRhdGlvbnMgb2YgTUQ1LXNlc3MgLgotICovCi0KLS8qCi0gKiBnZXRfdXNlcnB3X2hhc2goKSB3aWxsIGJlIGNhbGxlZCBlYWNoIHRpbWUgYSBuZXcgc2Vzc2lvbiBuZWVkcyB0byBiZQotICogZ2VuZXJhdGVkIGFuZCBpcyBleHBlY3RlZCB0byByZXR1cm4gdGhlIGVxdWl2YWxlbnQgb2YKLSAqCi0gKiBhcF9tZDUoci0+cG9vbCwKLSAqICAgICAgICBhcF9wc3RyY2F0KHItPnBvb2wsIHVzZXJuYW1lLCAiOiIsIGFwX2F1dGhfbmFtZShyKSwgIjoiLCBwYXNzd2QpKQotICoKLSAqIFlvdSBtdXN0IGltcGxlbWVudCB0aGlzIHlvdXJzZWxmLCBhbmQgd2lsbCBwcm9iYWJseSBjb25zaXN0IG9mIGNvZGUKLSAqIGNvbnRhY3RpbmcgdGhlIHBhc3N3b3JkIHNlcnZlciBhbmQgcmV0cmlldmluZyB0aGUgaGFzaCBmcm9tIGl0LgotICoKLSAqIFRCRDogVGhpcyBmdW5jdGlvbiBzaG91bGQgcHJvYmFibHkgYmUgaW4gYSBzZXBlcmF0ZSBzb3VyY2UgZmlsZSBzbyB0aGF0Ci0gKiBwZW9wbGUgbmVlZCBub3QgbW9kaWZ5IG1vZF9hdXRoX2RpZ2VzdC5jIGVhY2ggdGltZSB0aGV5IGluc3RhbGwgYSBuZXcgdmVyc2lvbgotICogb2YgYXBhY2hlLgotICovCi1zdGF0aWMgY29uc3QgY2hhciAqZ2V0X3VzZXJwd19oYXNoKGNvbnN0IHJlcXVlc3RfcmVjICpyLAotCQkJCSAgIGNvbnN0IGRpZ2VzdF9oZWFkZXJfcmVjICpyZXNwLAotCQkJCSAgIGNvbnN0IGRpZ2VzdF9jb25maWdfcmVjICpjb25mKQotewotICAgIC8qIGZvciBub3csIGp1c3QgZ2V0IGl0IGZyb20gcHdmaWxlICovCi0gICAgcmV0dXJuIGNvbmYtPmhhMTsKLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqZ2V0X3Nlc3Npb24oY29uc3QgcmVxdWVzdF9yZWMgKnIsCi0JCQkgICAgICAgZGlnZXN0X2hlYWRlcl9yZWMgKnJlc3AsCi0JCQkgICAgICAgY29uc3QgZGlnZXN0X2NvbmZpZ19yZWMgKmNvbmYpCi17Ci0gICAgY29uc3QgY2hhciAqaGExID0gTlVMTCwgKnVycDsKLQotICAgIC8qIGdldCBoYTEgZnJvbSBjbGllbnQgbGlzdCAqLwotICAgIGlmIChyZXNwLT5vcGFxdWUgJiYgcmVzcC0+Y2xpZW50KQotCWhhMSA9IHJlc3AtPmNsaWVudC0+aGExOwotCi0gICAgLyogZ2VuZXJhdGUgbmV3IHNlc3Npb24gaWYgbmVjZXNzYXJ5ICovCi0gICAgaWYgKGhhMSA9PSBOVUxMIHx8IGhhMVswXSA9PSAnXDAnKSB7Ci0JdXJwID0gZ2V0X3VzZXJwd19oYXNoKHIsIHJlc3AsIGNvbmYpOwotCWhhMSA9IGFwX21kNShyLT5wb29sLAotCQkgICAgICh1bnNpZ25lZCBjaGFyICopIGFwX3BzdHJjYXQoci0+cG9vbCwgaGExLCAiOiIsIHJlc3AtPm5vbmNlLAotCQkJCQkJICAiOiIsIHJlc3AtPmNub25jZSwgTlVMTCkpOwotCWlmICghcmVzcC0+Y2xpZW50KQotCSAgICByZXNwLT5jbGllbnQgPSBnZW5fY2xpZW50KHIpOwotCWlmIChyZXNwLT5jbGllbnQpCi0JICAgIG1lbWNweShyZXNwLT5jbGllbnQtPmhhMSwgaGExLCAxNyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGhhMTsKLX0KLQotCi1zdGF0aWMgdm9pZCBjbGVhcl9zZXNzaW9uKGNvbnN0IGRpZ2VzdF9oZWFkZXJfcmVjICpyZXNwKQotewotICAgIGlmIChyZXNwLT5jbGllbnQpCi0JcmVzcC0+Y2xpZW50LT5oYTFbMF0gPSAnXDAnOwotfQotCi0KLS8qCi0gKiBBdXRob3JpemF0aW9uIGNoYWxsZW5nZSBnZW5lcmF0aW9uIGNvZGUgKGZvciBXV1ctQXV0aGVudGljYXRlKQotICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpndWVzc19kb21haW4ocG9vbCAqcCwgY29uc3QgY2hhciAqdXJpLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKLQkJCQljb25zdCBjaGFyICpkaXIpCi17Ci0gICAgc2l6ZV90IHVfbGVuID0gc3RybGVuKHVyaSksIGZfbGVuID0gc3RybGVuKGZpbGVuYW1lKSwgZF9sZW4gPSBzdHJsZW4oZGlyKTsKLSAgICBjb25zdCBjaGFyICp1LCAqZjsKLQotCi0gICAgLyogQmVjYXVzZSBvZiB0aGluZ3MgbGlrZSBtb2RfYWxpYXMgYW5kIG1vZF9yZXdyaXRlIGFuZCB0aGUgZmFjdCB0aGF0Ci0gICAgICogcHJvdGVjdGlvbiBpcyBvZnRlbiBvbiBhIGRpcmVjdG9yeSBiYXNpcyAobm90IGEgbG9jYXRpb24gYmFzaXMpIGl0Ci0gICAgICogaXMgaGFyZCB0byBkZXRlcm1pbmUgdGhlIHVyaSB0byBwdXQgaW4gdGhlIGRvbWFpbiBhdHRyaWJ1dGUuCi0gICAgICoKLSAgICAgKiBXaGF0IHdlIGRvIGlzIHRoZSBmb2xsb3dpbmc6IGZpcnN0IHdlIHNlZSBpZiB0aGUgZGlyZWN0b3J5IGlzCi0gICAgICogYSBwcmVmaXggZm9yIHRoZSB1cmkgLSBpZiB0aGlzIGlzIHRoZSBjYXNlIHdlIGFzc3VtZSB0aGF0IHRoZXJlZm9yZQotICAgICAqIGEgPExvY2F0aW9uPiBkaXJlY3RpdmUgd2FzIHByb3RlY3RpbmcgdGhpcyB1cmkgYW5kIHdlIGNhbiB1c2UgaXQKLSAgICAgKiBmb3IgdGhlIGRvbWFpbi4KLSAgICAgKi8KLSAgICBpZiAodV9sZW4gPj0gZF9sZW4gJiYgIW1lbWNtcCh1cmksIGRpciwgZF9sZW4pKQotCXJldHVybiBkaXI7Ci0KLSAgICAvKiBOb3cgd2UgY2hlY2sgZm9yIDxGaWxlcyAuLi4+LCBhbmQgaWYgd2UgZmluZCBvbmUgd2Ugc2VuZCBiYWNrIGEKLSAgICAgKiBkdW1teSB1cmkgLSB0aGlzIGlzIHRoZSBvbmx5IHdheSB0byBzcGVjaWZ5IHRoYXQgdGhlIHByb3RlY3Rpb24KLSAgICAgKiBzcGFjZSBvbmx5IGNvdmVycyBhIHNpbmdsZSB1cmkuCi0gICAgICovCi0gICAgaWYgKGRpclswXSAhPSAnLycpCi0JLyogVGhpcyBkb2Vzbid0IHdvcmsgZm9yIEFtYXlhIChvaywgaXQncyBvZiBhcmd1YWJsZSB2YWxpZGl0eSBpbgotCSAqIHRoZSBmaXJzdCBwbGFjZSksIHNvIGp1c3QgcmV0dXJuIHRoZSBmaWxlIG5hbWUgaW5zdGVhZAotCXJldHVybiAiaHR0cDovLzAuMC4wLjAvIjsKLQkgKi8KLQlyZXR1cm4gZGlyOwotCi0gICAgLyogTmV4dCB3ZSBmaW5kIHRoZSBsYXJnZXN0IGNvbW1vbiBjb21tb24gc3VmZml4IG9mIHRoZSByZXF1ZXN0LXVyaQotICAgICAqIGFuZCB0aGUgZmluYWwgZmlsZSBuYW1lLCBpZ25vcmluZyBhbnkgZXh0ZW5zaW9uczsgdGhpcyBnaXZlcyB1cyBhCi0gICAgICogaGludCBhcyB0byB3aGVyZSBhbnkgcmV3cml0aW5nIGNvdWxkJ3ZlIG9jY3VyZWQgKGFzc3VtaW5nIHRoYXQgc29tZQotICAgICAqIHByZWZpeCBvZiB0aGUgdXJpIGlzIHJld3JpdHRlbiwgbm90IGEgc3VmZml4KS4KLSAgICAgKi8KLSAgICB1ID0gdXJpICsgdV9sZW4gLSAxOwkvKiBzdHJpcCBhbnkgZXh0ZW5zaW9uICovCi0gICAgd2hpbGUgKHUgPiB1cmkgJiYgKnUgIT0gJy8nKSAgdS0tOwotICAgIHdoaWxlICgqdSAmJiAqdSAhPSAnLicpICB1Kys7Ci0gICAgaWYgKCp1ID09ICcuJykgIHUtLTsKLSAgICBpZiAoKnUgPT0gJy8nKSAgdS0tOwotCi0gICAgZiA9IGZpbGVuYW1lICsgZl9sZW4gLSAxOwkvKiBzdHJpcCBhbnkgZXh0ZW5zaW9uICovCi0gICAgd2hpbGUgKGYgPiBmaWxlbmFtZSAmJiAqZiAhPSAnLycpICBmLS07Ci0gICAgd2hpbGUgKCpmICYmICpmICE9ICcuJykgIGYrKzsKLSAgICBpZiAoKmYgPT0gJy4nKSAgZi0tOwotICAgIGlmICgqZiA9PSAnLycpICBmLS07Ci0KLSAgICB3aGlsZSAoKmYgPT0gKnUgJiYgZiA+IGZpbGVuYW1lICYmIHUgPiB1cmkpICB1LS0sIGYtLTsKLSAgICBmKys7IHUrKzsKLQotICAgIHdoaWxlICgqZiAmJiAqZiAhPSAnLycpICBmKyssIHUrKzsJLyogc3VmZml4IG11c3Qgc3RhcnQgd2l0aCAvICovCi0KLSAgICAvKiBOb3csIGlmIHRoZSBkaXJlY3RvcnkgcmVhY2hlcyBpbnRvIHRoaXMgY29tbW9uIHN1ZmZpeCB0aGVuIHdlIGNhbgotICAgICAqIHRha2UgdGhlIHVyaSB3aXRoIHRoZSBzYW1lIHJlYWNoLgotICAgICAqLwotICAgIGlmICgodW5zaWduZWQgbG9uZykgKGYtZmlsZW5hbWUpIDwgZF9sZW4pIHsKLQljaGFyICp0bXAgPSBhcF9wc3RyZHVwKHAsIHVyaSk7Ci0JdG1wWyh1LXVyaSkrKGRfbGVuLShmLWZpbGVuYW1lKSldID0gJ1wwJzsKLQlyZXR1cm4gdG1wOwotICAgIH0KLQotICAgIHJldHVybiAiIjsJLyogZ2l2ZSB1cCAqLwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICpsdG94KHBvb2wgKnAsIHVuc2lnbmVkIGxvbmcgbnVtKQotewotICAgIGlmIChudW0gIT0gMCkKLQlyZXR1cm4gYXBfcHNwcmludGYocCwgIiVseCIsIG51bSk7Ci0gICAgZWxzZQotCXJldHVybiAiIjsKLX0KLQotc3RhdGljIHZvaWQgbm90ZV9kaWdlc3RfYXV0aF9mYWlsdXJlKHJlcXVlc3RfcmVjICpyLAotCQkJCSAgICAgY29uc3QgZGlnZXN0X2NvbmZpZ19yZWMgKmNvbmYsCi0JCQkJICAgICBkaWdlc3RfaGVhZGVyX3JlYyAqcmVzcCwgaW50IHN0YWxlKQotewotICAgIGNvbnN0IGNoYXIgICAqcW9wLCAqb3BhcXVlLCAqb3BhcXVlX3BhcmFtLCAqZG9tYWluLCAqbm9uY2U7Ci0gICAgaW50ICAgICAgICAgICBjbnQ7Ci0KLQotICAgIC8qIFNldHVwIHFvcCAqLwotCi0gICAgaWYgKGNvbmYtPnFvcF9saXN0WzBdID09IE5VTEwpCi0JcW9wID0gIiwgcW9wPVwiYXV0aFwiIjsKLSAgICBlbHNlIGlmICghc3RyY2FzZWNtcChjb25mLT5xb3BfbGlzdFswXSwgIm5vbmUiKSkKLQlxb3AgPSAiIjsKLSAgICBlbHNlIHsKLQlxb3AgPSBhcF9wc3RyY2F0KHItPnBvb2wsICIsIHFvcD1cIiIsIGNvbmYtPnFvcF9saXN0WzBdLCBOVUxMKTsKLQlmb3IgKGNudD0xOyBjb25mLT5xb3BfbGlzdFtjbnRdICE9IE5VTEw7IGNudCsrKQotCSAgICBxb3AgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHFvcCwgIiwiLCBjb25mLT5xb3BfbGlzdFtjbnRdLCBOVUxMKTsKLQlxb3AgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHFvcCwgIlwiIiwgTlVMTCk7Ci0gICAgfQotCi0gICAgLyogTUQ1LXNlc3Mgc3R1ZmYgKi8KLQotICAgIGlmICghc3RhbGUgJiYgIXN0cmNhc2VjbXAoY29uZi0+YWxnb3JpdGhtLCAiTUQ1LXNlc3MiKSkKLQljbGVhcl9zZXNzaW9uKHJlc3ApOwotCi0gICAgLyogU2V0dXAgb3BhcXVlICovCi0KLSAgICBpZiAocmVzcC0+b3BhcXVlID09IE5VTEwpIHsKLQkvKiBuZXcgY2xpZW50ICovCi0JaWYgKChjb25mLT5jaGVja19uYyB8fCBjb25mLT5ub25jZV9saWZldGltZSA9PSAwCi0JICAgICB8fCAhc3RyY2FzZWNtcChjb25mLT5hbGdvcml0aG0sICJNRDUtc2VzcyIpKQotCSAgICAmJiAocmVzcC0+Y2xpZW50ID0gZ2VuX2NsaWVudChyKSkgIT0gTlVMTCkKLQkgICAgb3BhcXVlID0gbHRveChyLT5wb29sLCByZXNwLT5jbGllbnQtPmtleSk7Ci0JZWxzZQotCSAgICBvcGFxdWUgPSAiIjsJCS8qIG9wYXF1ZSBub3QgbmVlZGVkICovCi0gICAgfQotICAgIGVsc2UgaWYgKHJlc3AtPmNsaWVudCA9PSBOVUxMKSB7Ci0JLyogY2xpZW50IGluZm8gd2FzIGdjJ2QgKi8KLQlyZXNwLT5jbGllbnQgPSBnZW5fY2xpZW50KHIpOwotCWlmIChyZXNwLT5jbGllbnQgIT0gTlVMTCkgewotCSAgICBvcGFxdWUgPSBsdG94KHItPnBvb2wsIHJlc3AtPmNsaWVudC0+a2V5KTsKLQkgICAgc3RhbGUgPSAxOwotCSAgICBjbGllbnRfbGlzdC0+bnVtX3JlbmV3ZWQrKzsKLQl9Ci0JZWxzZQotCSAgICBvcGFxdWUgPSAiIjsJCS8qID8/PyAqLwotICAgIH0KLSAgICBlbHNlIHsKLQlvcGFxdWUgPSByZXNwLT5vcGFxdWU7Ci0JLyogd2UncmUgZ2VuZXJhdGluZyBhIG5ldyBub25jZSwgc28gcmVzZXQgdGhlIG5vbmNlLWNvdW50ICovCi0JcmVzcC0+Y2xpZW50LT5ub25jZV9jb3VudCA9IDA7Ci0gICAgfQotCi0gICAgaWYgKG9wYXF1ZVswXSkKLQlvcGFxdWVfcGFyYW0gPSBhcF9wc3RyY2F0KHItPnBvb2wsICIsIG9wYXF1ZT1cIiIsIG9wYXF1ZSwgIlwiIiwgTlVMTCk7Ci0gICAgZWxzZQotCW9wYXF1ZV9wYXJhbSA9IE5VTEw7Ci0KLSAgICAvKiBTZXR1cCBub25jZSAqLwotCi0gICAgbm9uY2UgPSBnZW5fbm9uY2Uoci0+cG9vbCwgci0+cmVxdWVzdF90aW1lLCBvcGFxdWUsIHItPnNlcnZlciwgY29uZik7Ci0gICAgaWYgKHJlc3AtPmNsaWVudCAmJiBjb25mLT5ub25jZV9saWZldGltZSA9PSAwKQotCW1lbWNweShyZXNwLT5jbGllbnQtPmxhc3Rfbm9uY2UsIG5vbmNlLCBOT05DRV9MRU4rMSk7Ci0KLSAgICAvKiBzZXR1cCBkb21haW4gYXR0cmlidXRlLiBXZSB3YW50IHRvIHNlbmQgdGhpcyBhdHRyaWJ1dGUgd2hlcmV2ZXIKLSAgICAgKiBwb3NzaWJsZSBzbyB0aGF0IHRoZSBjbGllbnQgd29uJ3Qgc2VuZCB0aGUgQXV0aG9yaXphdGlvbiBoZWFkZXIKLSAgICAgKiB1bm5lY2Nlc3NhcmlseSAoaXQncyB1c3VhbGx5ID4gMjAwIGJ5dGVzISkuCi0gICAgICovCi0KLSAgICBpZiAoY29uZi0+dXJpX2xpc3QpCi0JZG9tYWluID0gY29uZi0+dXJpX2xpc3Q7Ci0gICAgZWxzZSB7Ci0JLyogVGhleSBkaWRuJ3Qgc3BlY2lmeSBhbnkgZG9tYWluLCBzbyBsZXQncyBndWVzcyBhdCBpdCAqLwotCWRvbWFpbiA9IGd1ZXNzX2RvbWFpbihyLT5wb29sLCByZXNwLT5yZXF1ZXN0X3VyaS0+cGF0aCwgci0+ZmlsZW5hbWUsCi0JCQkgICAgICBjb25mLT5kaXJfbmFtZSk7Ci0JaWYgKGRvbWFpblswXSA9PSAnLycgJiYgZG9tYWluWzFdID09ICdcMCcpCi0JICAgIGRvbWFpbiA9ICIiOwkvKiAiLyIgaXMgdGhlIGRlZmF1bHQsIHNvIG5vIG5lZWQgdG8gc2VuZCBpdCAqLwotCWVsc2UKLQkgICAgZG9tYWluID0gYXBfcHN0cmNhdChyLT5wb29sLCAiLCBkb21haW49XCIiLCBkb21haW4sICJcIiIsIE5VTEwpOwotICAgIH0KLQotICAgIGFwX3RhYmxlX21lcmdlbihyLT5lcnJfaGVhZGVyc19vdXQsCi0JCSAgICByLT5wcm94eXJlcSA/ICJQcm94eS1BdXRoZW50aWNhdGUiIDogIldXVy1BdXRoZW50aWNhdGUiLAotCQkgICAgYXBfcHNwcmludGYoci0+cG9vbCwgIkRpZ2VzdCByZWFsbT1cIiVzXCIsIG5vbmNlPVwiJXNcIiwgIgotCQkJCQkgImFsZ29yaXRobT0lcyVzJXMlcyVzIiwKLQkJCQlhcF9hdXRoX25hbWUociksIG5vbmNlLCBjb25mLT5hbGdvcml0aG0sCi0JCQkJb3BhcXVlX3BhcmFtID8gb3BhcXVlX3BhcmFtIDogIiIsCi0JCQkJZG9tYWluID8gZG9tYWluIDogIiIsCi0JCQkJc3RhbGUgPyAiLCBzdGFsZT10cnVlIiA6ICIiLCBxb3ApKTsKLX0KLQotCi0vKgotICogQXV0aG9yaXphdGlvbiBoZWFkZXIgdmVyaWZpY2F0aW9uIGNvZGUKLSAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqZ2V0X2hhc2gocmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKnVzZXIsCi0JCQkgICAgY29uc3QgY2hhciAqcmVhbG0sIGNvbnN0IGNoYXIgKmF1dGhfcHdmaWxlKQotewotICAgIGNvbmZpZ2ZpbGVfdCAqZjsKLSAgICBjaGFyIGxbTUFYX1NUUklOR19MRU5dOwotICAgIGNvbnN0IGNoYXIgKnJwdzsKLSAgICBjaGFyICp3LCAqeDsKLQotICAgIGlmICghKGYgPSBhcF9wY2ZnX29wZW5maWxlKHItPnBvb2wsIGF1dGhfcHdmaWxlKSkpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgciwKLQkJICAgICAgIkRpZ2VzdDogQ291bGQgbm90IG9wZW4gcGFzc3dvcmQgZmlsZTogJXMiLCBhdXRoX3B3ZmlsZSk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHdoaWxlICghKGFwX2NmZ19nZXRsaW5lKGwsIE1BWF9TVFJJTkdfTEVOLCBmKSkpIHsKLQlpZiAoKGxbMF0gPT0gJyMnKSB8fCAoIWxbMF0pKQotCSAgICBjb250aW51ZTsKLQlycHcgPSBsOwotCXcgPSBhcF9nZXR3b3JkKHItPnBvb2wsICZycHcsICc6Jyk7Ci0JeCA9IGFwX2dldHdvcmQoci0+cG9vbCwgJnJwdywgJzonKTsKLQotCWlmICh4ICYmIHcgJiYgIXN0cmNtcCh1c2VyLCB3KSAmJiAhc3RyY21wKHJlYWxtLCB4KSkgewotCSAgICBhcF9jZmdfY2xvc2VmaWxlKGYpOwotCSAgICByZXR1cm4gYXBfcHN0cmR1cChyLT5wb29sLCBycHcpOwotCX0KLSAgICB9Ci0gICAgYXBfY2ZnX2Nsb3NlZmlsZShmKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBjaGVja19uYyhjb25zdCByZXF1ZXN0X3JlYyAqciwgY29uc3QgZGlnZXN0X2hlYWRlcl9yZWMgKnJlc3AsCi0JCSAgICBjb25zdCBkaWdlc3RfY29uZmlnX3JlYyAqY29uZikKLXsKLSAgICBpZiAoY29uZi0+Y2hlY2tfbmMgJiYgY2xpZW50X21tKSB7Ci0JdW5zaWduZWQgbG9uZyBuYzsKLQotCWNvbnN0IGNoYXIgKnNuYyA9IHJlc3AtPm5vbmNlX2NvdW50OwotCWNoYXIgKmVuZHB0cjsKLQotCW5jID0gc3RydG9sKHNuYywgJmVuZHB0ciwgMTYpOwotCWlmIChlbmRwdHIgPCAoc25jK3N0cmxlbihzbmMpKSAmJiAhYXBfaXNzcGFjZSgqZW5kcHRyKSkgewotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotCQkJICAiRGlnZXN0OiBpbnZhbGlkIG5jICVzIHJlY2VpdmVkIC0gbm90IGEgbnVtYmVyIiwgc25jKTsKLQkgICAgcmV0dXJuICFPSzsKLQl9Ci0KLQlpZiAoIXJlc3AtPmNsaWVudCkKLQkgICAgcmV0dXJuICFPSzsKLQotCWlmIChuYyAhPSByZXNwLT5jbGllbnQtPm5vbmNlX2NvdW50KSB7Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19ERUJVRywgciwKLQkJCSAgIm5vbmNlLWNvdW50IGNoZWNrIGZhaWxlZDogJWx1ICE9ICVsdSIsIG5jLAotCQkJICByZXNwLT5jbGllbnQtPm5vbmNlX2NvdW50KTsKLQkgICAgcmV0dXJuICFPSzsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0aWMgaW50IGNoZWNrX25vbmNlKHJlcXVlc3RfcmVjICpyLCBkaWdlc3RfaGVhZGVyX3JlYyAqcmVzcCwKLQkJICAgICAgIGNvbnN0IGRpZ2VzdF9jb25maWdfcmVjICpjb25mKQotewotICAgIGRvdWJsZSBkdDsKLSAgICB0aW1lX3JlYyBub25jZV90aW1lOwotICAgIGNoYXIgdG1wLCBoYXNoW05PTkNFX0hBU0hfTEVOKzFdOwotCi0gICAgaWYgKHN0cmxlbihyZXNwLT5ub25jZSkgIT0gTk9OQ0VfTEVOKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLQkJICAgICAgIkRpZ2VzdDogaW52YWxpZCBub25jZSAlcyByZWNlaXZlZCAtIGxlbmd0aCBpcyBub3QgJWQiLAotCQkgICAgICByZXNwLT5ub25jZSwgTk9OQ0VfTEVOKTsKLQlub3RlX2RpZ2VzdF9hdXRoX2ZhaWx1cmUociwgY29uZiwgcmVzcCwgMSk7Ci0JcmV0dXJuIEFVVEhfUkVRVUlSRUQ7Ci0gICAgfQotCi0gICAgdG1wID0gcmVzcC0+bm9uY2VbTk9OQ0VfVElNRV9MRU5dOwotICAgIHJlc3AtPm5vbmNlW05PTkNFX1RJTUVfTEVOXSA9ICdcMCc7Ci0gICAgYXBfYmFzZTY0ZGVjb2RlX2JpbmFyeShub25jZV90aW1lLmFyciwgcmVzcC0+bm9uY2UpOwotICAgIGdlbl9ub25jZV9oYXNoKGhhc2gsIHJlc3AtPm5vbmNlLCByZXNwLT5vcGFxdWUsIHItPnNlcnZlciwgY29uZik7Ci0gICAgcmVzcC0+bm9uY2VbTk9OQ0VfVElNRV9MRU5dID0gdG1wOwotICAgIHJlc3AtPm5vbmNlX3RpbWUgPSBub25jZV90aW1lLnRpbWU7Ci0KLSAgICBpZiAoc3RyY21wKGhhc2gsIHJlc3AtPm5vbmNlK05PTkNFX1RJTUVfTEVOKSkgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0JCSAgICAgICJEaWdlc3Q6IGludmFsaWQgbm9uY2UgJXMgcmVjZWl2ZWQgLSBoYXNoIGlzIG5vdCAlcyIsCi0JCSAgICAgIHJlc3AtPm5vbmNlLCBoYXNoKTsKLQlub3RlX2RpZ2VzdF9hdXRoX2ZhaWx1cmUociwgY29uZiwgcmVzcCwgMSk7Ci0JcmV0dXJuIEFVVEhfUkVRVUlSRUQ7Ci0gICAgfQotCi0gICAgZHQgPSBkaWZmdGltZShyLT5yZXF1ZXN0X3RpbWUsIG5vbmNlX3RpbWUudGltZSk7Ci0gICAgaWYgKGNvbmYtPm5vbmNlX2xpZmV0aW1lID4gMCAmJiBkdCA8IDApIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotCQkgICAgICAiRGlnZXN0OiBpbnZhbGlkIG5vbmNlICVzIHJlY2VpdmVkIC0gdXNlciBhdHRlbXB0ZWQgIgotCQkgICAgICAidGltZSB0cmF2ZWwiLCByZXNwLT5ub25jZSk7Ci0Jbm90ZV9kaWdlc3RfYXV0aF9mYWlsdXJlKHIsIGNvbmYsIHJlc3AsIDEpOwotCXJldHVybiBBVVRIX1JFUVVJUkVEOwotICAgIH0KLQotICAgIGlmIChjb25mLT5ub25jZV9saWZldGltZSA+IDApIHsKLQlpZiAoZHQgPiBjb25mLT5ub25jZV9saWZldGltZSkgewotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgciwKLQkJCSAgIkRpZ2VzdDogdXNlciAlczogbm9uY2UgZXhwaXJlZCAtIHNlbmRpbmcgbmV3IG5vbmNlIiwKLQkJCSAgci0+Y29ubmVjdGlvbi0+dXNlcik7Ci0JICAgIG5vdGVfZGlnZXN0X2F1dGhfZmFpbHVyZShyLCBjb25mLCByZXNwLCAxKTsKLQkgICAgcmV0dXJuIEFVVEhfUkVRVUlSRUQ7Ci0JfQotICAgIH0KLSAgICBlbHNlIGlmIChjb25mLT5ub25jZV9saWZldGltZSA9PSAwICYmIHJlc3AtPmNsaWVudCkgewotCWlmIChtZW1jbXAocmVzcC0+Y2xpZW50LT5sYXN0X25vbmNlLCByZXNwLT5ub25jZSwgTk9OQ0VfTEVOKSkgewotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgciwKLQkJCSAgIkRpZ2VzdDogdXNlciAlczogb25lLXRpbWUtbm9uY2UgbWlzbWF0Y2ggLSBzZW5kaW5nICIKLQkJCSAgIm5ldyBub25jZSIsIHItPmNvbm5lY3Rpb24tPnVzZXIpOwotCSAgICBub3RlX2RpZ2VzdF9hdXRoX2ZhaWx1cmUociwgY29uZiwgcmVzcCwgMSk7Ci0JICAgIHJldHVybiBBVVRIX1JFUVVJUkVEOwotCX0KLSAgICB9Ci0gICAgLyogZWxzZSAobGlmZXRpbWUgPCAwKSA9PiBuZXZlciBleHBpcmVzICovCi0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8qIFRoZSBhY3R1YWwgTUQ1IGNvZGUuLi4gd2hlZSAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqb2xkX2RpZ2VzdChjb25zdCByZXF1ZXN0X3JlYyAqciwKLQkJCSAgICAgIGNvbnN0IGRpZ2VzdF9oZWFkZXJfcmVjICpyZXNwLCBjb25zdCBjaGFyICpoYTEpCi17Ci0gICAgY29uc3QgY2hhciAqaGEyOwotCi0gICAgLyogcmZjLTIwNjkgKi8KLSAgICBoYTIgPSBhcF9tZDUoci0+cG9vbCwgKHVuc2lnbmVkIGNoYXIgKilhcF9wc3RyY2F0KHItPnBvb2wsIHItPm1ldGhvZCwgIjoiLAotCQkJCQkJICAgICAgcmVzcC0+dXJpLCBOVUxMKSk7Ci0gICAgcmV0dXJuIGFwX21kNShyLT5wb29sLAotCQkgICh1bnNpZ25lZCBjaGFyICopYXBfcHN0cmNhdChyLT5wb29sLCBoYTEsICI6IiwgcmVzcC0+bm9uY2UsCi0JCQkJCSAgICAgICI6IiwgaGEyLCBOVUxMKSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpuZXdfZGlnZXN0KGNvbnN0IHJlcXVlc3RfcmVjICpyLAotCQkJICAgICAgZGlnZXN0X2hlYWRlcl9yZWMgKnJlc3AsCi0JCQkgICAgICBjb25zdCBkaWdlc3RfY29uZmlnX3JlYyAqY29uZikKLXsKLSAgICBjb25zdCBjaGFyICpoYTEsICpoYTIsICphMjsKLQotICAgIC8qIGRyYWZ0LWlldGYtaHR0cC1hdXRoZW50aWNhdGlvbi0wMyAqLwotICAgIGlmIChyZXNwLT5hbGdvcml0aG0gJiYgIXN0cmNhc2VjbXAocmVzcC0+YWxnb3JpdGhtLCAiTUQ1LXNlc3MiKSkKLQloYTEgPSBnZXRfc2Vzc2lvbihyLCByZXNwLCBjb25mKTsKLSAgICBlbHNlCi0JaGExID0gY29uZi0+aGExOwotCi0gICAgaWYgKHJlc3AtPm1lc3NhZ2VfcW9wICYmICFzdHJjYXNlY21wKHJlc3AtPm1lc3NhZ2VfcW9wLCAiYXV0aC1pbnQiKSkKLQlhMiA9IGFwX3BzdHJjYXQoci0+cG9vbCwgci0+bWV0aG9kLCAiOiIsIHJlc3AtPnVyaSwgIjoiLAotCQkJYXBfbWQ1KHItPnBvb2wsIChjb25zdCB1bnNpZ25lZCBjaGFyKikgIiIpLCBOVUxMKTsgLyogVEJEICovCi0gICAgZWxzZQotCWEyID0gYXBfcHN0cmNhdChyLT5wb29sLCByLT5tZXRob2QsICI6IiwgcmVzcC0+dXJpLCBOVUxMKTsKLSAgICBoYTIgPSBhcF9tZDUoci0+cG9vbCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilhMik7Ci0KLSAgICByZXR1cm4gYXBfbWQ1KHItPnBvb2wsCi0JCSAgKHVuc2lnbmVkIGNoYXIgKilhcF9wc3RyY2F0KHItPnBvb2wsIGhhMSwgIjoiLCByZXNwLT5ub25jZSwKLQkJCQkJICAgICAgIjoiLCByZXNwLT5ub25jZV9jb3VudCwgIjoiLAotCQkJCQkgICAgICByZXNwLT5jbm9uY2UsICI6IiwKLQkJCQkJICAgICAgcmVzcC0+bWVzc2FnZV9xb3AsICI6IiwgaGEyLAotCQkJCQkgICAgICBOVUxMKSk7Ci19Ci0KLQotLyogVGhlc2UgZnVuY3Rpb25zIHJldHVybiAwIGlmIGNsaWVudCBpcyBPSywgYW5kIHByb3BlciBlcnJvciBzdGF0dXMKLSAqIGlmIG5vdC4uLiBlaXRoZXIgQVVUSF9SRVFVSVJFRCwgaWYgd2UgbWFkZSBhIGNoZWNrLCBhbmQgaXQgZmFpbGVkLCBvcgotICogU0VSVkVSX0VSUk9SLCBpZiB0aGluZ3MgYXJlIHNvIHRvdGFsbHkgY29uZnVzZWQgdGhhdCB3ZSBjb3VsZG4ndAotICogZmlndXJlIG91dCBob3cgdG8gdGVsbCBpZiB0aGUgY2xpZW50IGlzIGF1dGhvcml6ZWQgb3Igbm90LgotICoKLSAqIElmIHRoZXkgcmV0dXJuIERFQ0xJTkVELCBhbmQgYWxsIG90aGVyIG1vZHVsZXMgYWxzbyBkZWNsaW5lLCB0aGF0J3MKLSAqIHRyZWF0ZWQgYnkgdGhlIHNlcnZlciBjb3JlIGFzIGEgY29uZmlndXJhdGlvbiBlcnJvciwgbG9nZ2VkIGFuZAotICogcmVwb3J0ZWQgYXMgc3VjaC4KLSAqLwotCi0vKiBEZXRlcm1pbmUgdXNlciBJRCwgYW5kIGNoZWNrIGlmIHRoZSBhdHRyaWJ1dGVzIGFyZSBjb3JyZWN0LCBpZiBpdAotICogcmVhbGx5IGlzIHRoYXQgdXNlciwgaWYgdGhlIG5vbmNlIGlzIGNvcnJlY3QsIGV0Yy4KLSAqLwotCi1zdGF0aWMgaW50IGF1dGhlbnRpY2F0ZV9kaWdlc3RfdXNlcihyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBkaWdlc3RfY29uZmlnX3JlYyAqY29uZjsKLSAgICBkaWdlc3RfaGVhZGVyX3JlYyAqcmVzcDsKLSAgICByZXF1ZXN0X3JlYyAgICAgICAqbWFpbnJlcTsKLSAgICBjb25uX3JlYyAgICAgICAgICAqY29ubiA9IHItPmNvbm5lY3Rpb247Ci0gICAgY29uc3QgY2hhciAgICAgICAgKnQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgIHJlczsKLQotCi0gICAgLyogZG8gd2UgcmVxdWlyZSBEaWdlc3QgYXV0aCBmb3IgdGhpcyBVUkk/ICovCi0KLSAgICBpZiAoISh0ID0gYXBfYXV0aF90eXBlKHIpKSB8fCBzdHJjYXNlY21wKHQsICJEaWdlc3QiKSkKLQlyZXR1cm4gREVDTElORUQ7Ci0KLSAgICBpZiAoIWFwX2F1dGhfbmFtZShyKSkgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0JCSAgICAgICJEaWdlc3Q6IG5lZWQgQXV0aE5hbWU6ICVzIiwgci0+dXJpKTsKLQlyZXR1cm4gU0VSVkVSX0VSUk9SOwotICAgIH0KLQotCi0gICAgLyogZ2V0IHRoZSBjbGllbnQgcmVzcG9uc2UgYW5kIG1hcmsgKi8KLQotICAgIG1haW5yZXEgPSByOwotICAgIHdoaWxlIChtYWlucmVxLT5tYWluICE9IE5VTEwpICBtYWlucmVxID0gbWFpbnJlcS0+bWFpbjsKLSAgICB3aGlsZSAobWFpbnJlcS0+cHJldiAhPSBOVUxMKSAgbWFpbnJlcSA9IG1haW5yZXEtPnByZXY7Ci0gICAgcmVzcCA9IChkaWdlc3RfaGVhZGVyX3JlYyAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhtYWlucmVxLT5yZXF1ZXN0X2NvbmZpZywKLQkJCQkJCSAgICAgICZkaWdlc3RfYXV0aF9tb2R1bGUpOwotICAgIHJlc3AtPm5lZWRlZF9hdXRoID0gMTsKLQotCi0gICAgLyogZ2V0IG91ciBjb25mICovCi0KLSAgICBjb25mID0gKGRpZ2VzdF9jb25maWdfcmVjICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLAotCQkJCQkJICAgICAgJmRpZ2VzdF9hdXRoX21vZHVsZSk7Ci0KLQotICAgIC8qIGNoZWNrIGZvciBleGlzdGVuY2UgYW5kIHN5bnRheCBvZiBBdXRoIGhlYWRlciAqLwotCi0gICAgaWYgKHJlc3AtPmF1dGhfaGRyX3N0cyAhPSBWQUxJRCkgewotCWlmIChyZXNwLT5hdXRoX2hkcl9zdHMgPT0gTk9UX0RJR0VTVCkKLQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLQkJCSAgIkRpZ2VzdDogY2xpZW50IHVzZWQgd3JvbmcgYXV0aGVudGljYXRpb24gc2NoZW1lICIKLQkJCSAgImAlcyc6ICVzIiwgcmVzcC0+c2NoZW1lLCByLT51cmkpOwotCWVsc2UgaWYgKHJlc3AtPmF1dGhfaGRyX3N0cyA9PSBJTlZBTElEKQotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotCQkJICAiRGlnZXN0OiBtaXNzaW5nIHVzZXIsIHJlYWxtLCBub25jZSwgdXJpLCBvciBkaWdlc3QgIgotCQkJICAiaW4gYXV0aG9yaXphdGlvbiBoZWFkZXI6ICVzIiwgci0+dXJpKTsKLQkvKiBlbHNlIChyZXNwLT5hdXRoX2hkcl9zdHMgPT0gTk9fSEVBREVSKSAqLwotCW5vdGVfZGlnZXN0X2F1dGhfZmFpbHVyZShyLCBjb25mLCByZXNwLCAwKTsKLQlyZXR1cm4gQVVUSF9SRVFVSVJFRDsKLSAgICB9Ci0KLSAgICByLT5jb25uZWN0aW9uLT51c2VyICAgICAgICAgPSAoY2hhciAqKSByZXNwLT51c2VybmFtZTsKLSAgICByLT5jb25uZWN0aW9uLT5hcF9hdXRoX3R5cGUgPSAoY2hhciAqKSAiRGlnZXN0IjsKLQotCi0gICAgLyogY2hlY2sgdGhlIGF1dGggYXR0cmlidXRlcyAqLwotCi0gICAgaWYgKHN0cmNtcChyZXNwLT51cmksIHJlc3AtPnJlcXVlc3RfdXJpLT5wYXRoKSkgewotCXVyaV9jb21wb25lbnRzICpyX3VyaSA9IHJlc3AtPnJlcXVlc3RfdXJpLCBkX3VyaTsKLQlhcF9wYXJzZV91cmlfY29tcG9uZW50cyhyLT5wb29sLCByZXNwLT51cmksICZkX3VyaSk7Ci0KLQlpZiAoKGRfdXJpLmhvc3RuYW1lICYmIGRfdXJpLmhvc3RuYW1lWzBdICE9ICdcMCcKLQkgICAgICYmIHN0cmNhc2VjbXAoZF91cmkuaG9zdG5hbWUsIHItPnNlcnZlci0+c2VydmVyX2hvc3RuYW1lKSkKLQkgICAgfHwgKGRfdXJpLnBvcnRfc3RyICYmIGRfdXJpLnBvcnQgIT0gci0+c2VydmVyLT5wb3J0KQotCSAgICB8fCAoIWRfdXJpLnBvcnRfc3RyICYmIHItPnNlcnZlci0+cG9ydCAhPSA4MCkKLQkgICAgfHwgc3RyY21wKGRfdXJpLnBhdGgsIHJfdXJpLT5wYXRoKQotCSAgICB8fCAoZF91cmkucXVlcnkgIT0gcl91cmktPnF1ZXJ5Ci0JCSYmICghZF91cmkucXVlcnkgfHwgIXJfdXJpLT5xdWVyeQotCQkgICAgfHwgc3RyY21wKGRfdXJpLnF1ZXJ5LCByX3VyaS0+cXVlcnkpKSkKLQkgICAgKSB7Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0JCQkgICJEaWdlc3Q6IHVyaSBtaXNtYXRjaCAtIDwlcz4gZG9lcyBub3QgbWF0Y2ggIgotCQkJICAicmVxdWVzdC11cmkgPCVzPiIsIHJlc3AtPnVyaSwKLQkJCSAgYXBfdW5wYXJzZV91cmlfY29tcG9uZW50cyhyLT5wb29sLCByX3VyaSwgMCkpOwotCSAgICByZXR1cm4gQkFEX1JFUVVFU1Q7Ci0JfQotICAgIH0KLQotICAgIGlmIChyZXNwLT5vcGFxdWUgJiYgcmVzcC0+b3BhcXVlX251bSA9PSAwKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLQkJICAgICAgIkRpZ2VzdDogcmVjZWl2ZWQgaW52YWxpZCBvcGFxdWUgLSBnb3QgYCVzJyIsCi0JCSAgICAgIHJlc3AtPm9wYXF1ZSk7Ci0Jbm90ZV9kaWdlc3RfYXV0aF9mYWlsdXJlKHIsIGNvbmYsIHJlc3AsIDApOwotCXJldHVybiBBVVRIX1JFUVVJUkVEOwotICAgIH0KLQotICAgIGlmIChzdHJjbXAocmVzcC0+cmVhbG0sIGNvbmYtPnJlYWxtKSkgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0JCSAgICAgICJEaWdlc3Q6IHJlYWxtIG1pc21hdGNoIC0gZ290IGAlcycgYnV0IGV4cGVjdGVkIGAlcyciLAotCQkgICAgICByZXNwLT5yZWFsbSwgY29uZi0+cmVhbG0pOwotCW5vdGVfZGlnZXN0X2F1dGhfZmFpbHVyZShyLCBjb25mLCByZXNwLCAwKTsKLQlyZXR1cm4gQVVUSF9SRVFVSVJFRDsKLSAgICB9Ci0KLSAgICBpZiAocmVzcC0+YWxnb3JpdGhtICE9IE5VTEwKLQkmJiBzdHJjYXNlY21wKHJlc3AtPmFsZ29yaXRobSwgIk1ENSIpCi0JJiYgc3RyY2FzZWNtcChyZXNwLT5hbGdvcml0aG0sICJNRDUtc2VzcyIpKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLQkJICAgICAgIkRpZ2VzdDogdW5rbm93biBhbGdvcml0aG0gYCVzJyByZWNlaXZlZDogJXMiLAotCQkgICAgICByZXNwLT5hbGdvcml0aG0sIHItPnVyaSk7Ci0Jbm90ZV9kaWdlc3RfYXV0aF9mYWlsdXJlKHIsIGNvbmYsIHJlc3AsIDApOwotCXJldHVybiBBVVRIX1JFUVVJUkVEOwotICAgIH0KLQotICAgIGlmICghY29uZi0+cHdmaWxlKQotCXJldHVybiBERUNMSU5FRDsKLQotICAgIGlmICghKGNvbmYtPmhhMSA9IGdldF9oYXNoKHIsIGNvbm4tPnVzZXIsIGNvbmYtPnJlYWxtLCBjb25mLT5wd2ZpbGUpKSkgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0JCSAgICAgICJEaWdlc3Q6IHVzZXIgYCVzJyBpbiByZWFsbSBgJXMnIG5vdCBmb3VuZDogJXMiLAotCQkgICAgICBjb25uLT51c2VyLCBjb25mLT5yZWFsbSwgci0+dXJpKTsKLQlub3RlX2RpZ2VzdF9hdXRoX2ZhaWx1cmUociwgY29uZiwgcmVzcCwgMCk7Ci0JcmV0dXJuIEFVVEhfUkVRVUlSRUQ7Ci0gICAgfQotCi0gICAgaWYgKHJlc3AtPm1lc3NhZ2VfcW9wID09IE5VTEwpIHsKLQkvKiBvbGQgKHJmYy0yMDY5KSBzdHlsZSBkaWdlc3QgKi8KLQlpZiAoc3RyY21wKHJlc3AtPmRpZ2VzdCwgb2xkX2RpZ2VzdChyLCByZXNwLCBjb25mLT5oYTEpKSkgewotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotCQkJICAiRGlnZXN0OiB1c2VyICVzOiBwYXNzd29yZCBtaXNtYXRjaDogJXMiLCBjb25uLT51c2VyLAotCQkJICByLT51cmkpOwotCSAgICBub3RlX2RpZ2VzdF9hdXRoX2ZhaWx1cmUociwgY29uZiwgcmVzcCwgMCk7Ci0JICAgIHJldHVybiBBVVRIX1JFUVVJUkVEOwotCX0KLSAgICB9Ci0gICAgZWxzZSB7Ci0JaW50IG1hdGNoID0gMCwgaWR4OwotCWZvciAoaWR4PTA7IGNvbmYtPnFvcF9saXN0W2lkeF0gIT0gTlVMTDsgaWR4KyspIHsKLQkgICAgaWYgKCFzdHJjYXNlY21wKGNvbmYtPnFvcF9saXN0W2lkeF0sIHJlc3AtPm1lc3NhZ2VfcW9wKSkgewotCQltYXRjaCA9IDE7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotCi0JaWYgKCFtYXRjaAotCSAgICAmJiAhKGNvbmYtPnFvcF9saXN0WzBdID09IE5VTEwKLQkJICYmICFzdHJjYXNlY21wKHJlc3AtPm1lc3NhZ2VfcW9wLCAiYXV0aCIpKSkgewotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotCQkJICAiRGlnZXN0OiBpbnZhbGlkIHFvcCBgJXMnIHJlY2VpdmVkOiAlcyIsCi0JCQkgIHJlc3AtPm1lc3NhZ2VfcW9wLCByLT51cmkpOwotCSAgICBub3RlX2RpZ2VzdF9hdXRoX2ZhaWx1cmUociwgY29uZiwgcmVzcCwgMCk7Ci0JICAgIHJldHVybiBBVVRIX1JFUVVJUkVEOwotCX0KLQotCWlmIChzdHJjbXAocmVzcC0+ZGlnZXN0LCBuZXdfZGlnZXN0KHIsIHJlc3AsIGNvbmYpKSkgewotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotCQkJICAiRGlnZXN0OiB1c2VyICVzOiBwYXNzd29yZCBtaXNtYXRjaDogJXMiLCBjb25uLT51c2VyLAotCQkJICByLT51cmkpOwotCSAgICBub3RlX2RpZ2VzdF9hdXRoX2ZhaWx1cmUociwgY29uZiwgcmVzcCwgMCk7Ci0JICAgIHJldHVybiBBVVRIX1JFUVVJUkVEOwotCX0KLSAgICB9Ci0KLSAgICBpZiAoY2hlY2tfbmMociwgcmVzcCwgY29uZikgIT0gT0spIHsKLQlub3RlX2RpZ2VzdF9hdXRoX2ZhaWx1cmUociwgY29uZiwgcmVzcCwgMCk7Ci0JcmV0dXJuIEFVVEhfUkVRVUlSRUQ7Ci0gICAgfQotCi0gICAgLyogTm90ZTogdGhpcyBjaGVjayBpcyBkb25lIGxhc3Qgc28gdGhhdCBhICJzdGFsZT10cnVlIiBjYW4gYmUKLSAgICAgICBnZW5lcmF0ZWQgaWYgdGhlIG5vbmNlIGlzIG9sZCAqLwotICAgIGlmICgocmVzID0gY2hlY2tfbm9uY2UociwgcmVzcCwgY29uZikpKQotCXJldHVybiByZXM7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotLyoKLSAqIENoZWNraW5nIElECi0gKi8KLQotc3RhdGljIHRhYmxlICpncm91cHNfZm9yX3VzZXIocmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKnVzZXIsCi0JCQkgICAgICBjb25zdCBjaGFyICpncnBmaWxlKQotewotICAgIGNvbmZpZ2ZpbGVfdCAqZjsKLSAgICB0YWJsZSAqZ3JwcyA9IGFwX21ha2VfdGFibGUoci0+cG9vbCwgMTUpOwotICAgIHBvb2wgKnNwOwotICAgIGNoYXIgbFtNQVhfU1RSSU5HX0xFTl07Ci0gICAgY29uc3QgY2hhciAqZ3JvdXBfbmFtZSwgKmxsLCAqdzsKLQotICAgIGlmICghKGYgPSBhcF9wY2ZnX29wZW5maWxlKHItPnBvb2wsIGdycGZpbGUpKSkgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotCQkgICAgICAiRGlnZXN0OiBDb3VsZCBub3Qgb3BlbiBncm91cCBmaWxlOiAlcyIsIGdycGZpbGUpOwotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHNwID0gYXBfbWFrZV9zdWJfcG9vbChyLT5wb29sKTsKLQotICAgIHdoaWxlICghKGFwX2NmZ19nZXRsaW5lKGwsIE1BWF9TVFJJTkdfTEVOLCBmKSkpIHsKLQlpZiAoKGxbMF0gPT0gJyMnKSB8fCAoIWxbMF0pKQotCSAgICBjb250aW51ZTsKLQlsbCA9IGw7Ci0JYXBfY2xlYXJfcG9vbChzcCk7Ci0KLQlncm91cF9uYW1lID0gYXBfZ2V0d29yZChzcCwgJmxsLCAnOicpOwotCi0Jd2hpbGUgKGxsWzBdKSB7Ci0JICAgIHcgPSBhcF9nZXR3b3JkX2NvbmYoc3AsICZsbCk7Ci0JICAgIGlmICghc3RyY21wKHcsIHVzZXIpKSB7Ci0JCWFwX3RhYmxlX3NldG4oZ3JwcywgYXBfcHN0cmR1cChyLT5wb29sLCBncm91cF9uYW1lKSwgImluIik7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIGFwX2NmZ19jbG9zZWZpbGUoZik7Ci0gICAgYXBfZGVzdHJveV9wb29sKHNwKTsKLSAgICByZXR1cm4gZ3JwczsKLX0KLQotCi1zdGF0aWMgaW50IGRpZ2VzdF9jaGVja19hdXRoKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvbnN0IGRpZ2VzdF9jb25maWdfcmVjICpjb25mID0KLQkJKGRpZ2VzdF9jb25maWdfcmVjICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLAotCQkJCQkJCSAgICZkaWdlc3RfYXV0aF9tb2R1bGUpOwotICAgIGNvbnN0IGNoYXIgKnVzZXIgPSByLT5jb25uZWN0aW9uLT51c2VyOwotICAgIGludCBtID0gci0+bWV0aG9kX251bWJlcjsKLSAgICBpbnQgbWV0aG9kX3Jlc3RyaWN0ZWQgPSAwOwotICAgIHJlZ2lzdGVyIGludCB4OwotICAgIGNvbnN0IGNoYXIgKnQsICp3OwotICAgIHRhYmxlICpncnBzdGF0dXM7Ci0gICAgY29uc3QgYXJyYXlfaGVhZGVyICpyZXFzX2FycjsKLSAgICByZXF1aXJlX2xpbmUgKnJlcXM7Ci0KLSAgICBpZiAoISh0ID0gYXBfYXV0aF90eXBlKHIpKSB8fCBzdHJjYXNlY21wKHQsICJEaWdlc3QiKSkKLQlyZXR1cm4gREVDTElORUQ7Ci0KLSAgICByZXFzX2FyciA9IGFwX3JlcXVpcmVzKHIpOwotICAgIC8qIElmIHRoZXJlIGlzIG5vICJyZXF1aXJlcyIgZGlyZWN0aXZlLCB0aGVuIGFueSB1c2VyIHdpbGwgZG8uCi0gICAgICovCi0gICAgaWYgKCFyZXFzX2FycikKLQlyZXR1cm4gT0s7Ci0gICAgcmVxcyA9IChyZXF1aXJlX2xpbmUgKikgcmVxc19hcnItPmVsdHM7Ci0KLSAgICBpZiAoY29uZi0+Z3JwZmlsZSkKLQlncnBzdGF0dXMgPSBncm91cHNfZm9yX3VzZXIociwgdXNlciwgY29uZi0+Z3JwZmlsZSk7Ci0gICAgZWxzZQotCWdycHN0YXR1cyA9IE5VTEw7Ci0KLSAgICBmb3IgKHggPSAwOyB4IDwgcmVxc19hcnItPm5lbHRzOyB4KyspIHsKLQotCWlmICghKHJlcXNbeF0ubWV0aG9kX21hc2sgJiAoMSA8PCBtKSkpCi0JICAgIGNvbnRpbnVlOwotCi0JbWV0aG9kX3Jlc3RyaWN0ZWQgPSAxOwotCi0JdCA9IHJlcXNbeF0ucmVxdWlyZW1lbnQ7Ci0JdyA9IGFwX2dldHdvcmRfd2hpdGUoci0+cG9vbCwgJnQpOwotCWlmICghc3RyY2FzZWNtcCh3LCAidmFsaWQtdXNlciIpKQotCSAgICByZXR1cm4gT0s7Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgInVzZXIiKSkgewotCSAgICB3aGlsZSAodFswXSkgewotCQl3ID0gYXBfZ2V0d29yZF9jb25mKHItPnBvb2wsICZ0KTsKLQkJaWYgKCFzdHJjbXAodXNlciwgdykpCi0JCSAgICByZXR1cm4gT0s7Ci0JICAgIH0KLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgImdyb3VwIikpIHsKLQkgICAgaWYgKCFncnBzdGF0dXMpCi0JCXJldHVybiBERUNMSU5FRDsKLQotCSAgICB3aGlsZSAodFswXSkgewotCQl3ID0gYXBfZ2V0d29yZF9jb25mKHItPnBvb2wsICZ0KTsKLQkJaWYgKGFwX3RhYmxlX2dldChncnBzdGF0dXMsIHcpKQotCQkgICAgcmV0dXJuIE9LOwotCSAgICB9Ci0JfQotCWVsc2UgewotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotCQkiRGlnZXN0OiBhY2Nlc3MgdG8gJXMgZmFpbGVkLCByZWFzb246IHVua25vd24gcmVxdWlyZSAiCi0JCSJkaXJlY3RpdmUgXCIlc1wiIiwgci0+dXJpLCByZXFzW3hdLnJlcXVpcmVtZW50KTsKLQkgICAgcmV0dXJuIERFQ0xJTkVEOwotCX0KLSAgICB9Ci0KLSAgICBpZiAoIW1ldGhvZF9yZXN0cmljdGVkKQotCXJldHVybiBPSzsKLQotICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0JIkRpZ2VzdDogYWNjZXNzIHRvICVzIGZhaWxlZCwgcmVhc29uOiB1c2VyICVzIG5vdCBhbGxvd2VkIGFjY2VzcyIsCi0Jci0+dXJpLCB1c2VyKTsKLQotICAgIG5vdGVfZGlnZXN0X2F1dGhfZmFpbHVyZShyLCBjb25mLAotCShkaWdlc3RfaGVhZGVyX3JlYyAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5yZXF1ZXN0X2NvbmZpZywKLQkJCQkJCSAgICZkaWdlc3RfYXV0aF9tb2R1bGUpLAotCTApOwotICAgIHJldHVybiBBVVRIX1JFUVVJUkVEOwotfQotCi0KLS8qCi0gKiBBdXRob3JpemF0aW9uLUluZm8gaGVhZGVyIGNvZGUKLSAqLwotCi0jaWZkZWYgU0VORF9ESUdFU1QKLXN0YXRpYyBjb25zdCBjaGFyICpoZHIoY29uc3QgdGFibGUgKnRibCwgY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBjb25zdCBjaGFyICp2YWwgPSBhcF90YWJsZV9nZXQodGJsLCBuYW1lKTsKLSAgICBpZiAodmFsKQotCXJldHVybiB2YWw7Ci0gICAgZWxzZQotCXJldHVybiAiIjsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IGFkZF9hdXRoX2luZm8ocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY29uc3QgZGlnZXN0X2NvbmZpZ19yZWMgKmNvbmYgPQotCQkoZGlnZXN0X2NvbmZpZ19yZWMgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCQkJICAgJmRpZ2VzdF9hdXRoX21vZHVsZSk7Ci0gICAgZGlnZXN0X2hlYWRlcl9yZWMgKnJlc3AgPQotCQkoZGlnZXN0X2hlYWRlcl9yZWMgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cmVxdWVzdF9jb25maWcsCi0JCQkJCQkJICAgJmRpZ2VzdF9hdXRoX21vZHVsZSk7Ci0gICAgY29uc3QgY2hhciAqYWkgPSBOVUxMLCAqZGlnZXN0ID0gTlVMTCwgKm5leHRub25jZSA9ICIiOwotCi0gICAgaWYgKHJlc3AgPT0gTlVMTCB8fCAhcmVzcC0+bmVlZGVkX2F1dGggfHwgY29uZiA9PSBOVUxMKQotCXJldHVybiBPSzsKLQotCi0gICAgLyogcmZjLTIwNjkgZGlnZXN0Ci0gICAgICovCi0gICAgaWYgKHJlc3AtPm1lc3NhZ2VfcW9wID09IE5VTEwpIHsKLQkvKiBvbGQgY2xpZW50LCBzbyBjYWxjIHJmYy0yMDY5IGRpZ2VzdCAqLwotCi0jaWZkZWYgU0VORF9ESUdFU1QKLQkvKiBtb3N0IG9mIHRoaXMgdG90YWxseSBib2d1cyBiZWNhdXNlIHRoZSBoYW5kbGVycyBkb24ndCBzZXQgdGhlCi0JICogaGVhZGVycyB1bnRpbCB0aGUgZmluYWwgaGFuZGxlciBwaGFzZSAoSSB3b25kZXIgd2h5IHRoaXMgcGhhc2UKLQkgKiBpcyBjYWxsZWQgZml4dXAgd2hlbiB0aGVyZSdzIGFsbW9zdCBub3RoaW5nIHlvdSBjYW4gZml4IHVwLi4uKQotCSAqCi0JICogQmVjYXVzZSBpdCdzIGJhc2ljYWxseSBpbXBvc3NpYmxlIHRvIGdldCB0aGlzIHJpZ2h0IChlLmcuIHRoZQotCSAqIENvbnRlbnQtbGVuZ3RoIGlzIG5ldmVyIHNldCB5ZXQgd2hlbiB3ZSBnZXQgaGVyZSwgYW5kIHdlIGNhbid0Ci0JICogY2FsYyB0aGUgZW50aXR5IGhhc2gpIGl0J3MgYmVzdCB0byBqdXN0IGxlYXZlIHRoaXMgI2RlZidkIG91dC4KLQkgKi8KLQljaGFyICplbnRpdHlfaW5mbyA9Ci0JICAgIGFwX21kNShyLT5wb29sLAotCQkgICAodW5zaWduZWQgY2hhciAqKSBhcF9wc3RyY2F0KHItPnBvb2wsCi0JCSAgICAgICBhcF91bnBhcnNlX3VyaV9jb21wb25lbnRzKHItPnBvb2wsCi0JCQkJCQkgcmVzcC0+cmVxdWVzdF91cmksIDApLCAiOiIsCi0JCSAgICAgICByLT5jb250ZW50X3R5cGUgPyByLT5jb250ZW50X3R5cGUgOiBhcF9kZWZhdWx0X3R5cGUociksICI6IiwKLQkJICAgICAgIGhkcihyLT5oZWFkZXJzX291dCwgIkNvbnRlbnQtTGVuZ3RoIiksICI6IiwKLQkJICAgICAgIHItPmNvbnRlbnRfZW5jb2RpbmcgPyByLT5jb250ZW50X2VuY29kaW5nIDogIiIsICI6IiwKLQkJICAgICAgIGhkcihyLT5oZWFkZXJzX291dCwgIkxhc3QtTW9kaWZpZWQiKSwgIjoiLAotCQkgICAgICAgci0+bm9fY2FjaGUgJiYgIWFwX3RhYmxlX2dldChyLT5oZWFkZXJzX291dCwgIkV4cGlyZXMiKSA/Ci0JCQkgICAgYXBfZ21fdGltZXN0cl84MjIoci0+cG9vbCwgci0+cmVxdWVzdF90aW1lKSA6Ci0JCQkgICAgaGRyKHItPmhlYWRlcnNfb3V0LCAiRXhwaXJlcyIpLAotCQkgICAgICAgTlVMTCkpOwotCWRpZ2VzdCA9Ci0JICAgIGFwX21kNShyLT5wb29sLAotCQkgICAodW5zaWduZWQgY2hhciAqKWFwX3BzdHJjYXQoci0+cG9vbCwgY29uZi0+aGExLCAiOiIsCi0JCQkJCSAgICAgICByZXNwLT5ub25jZSwgIjoiLAotCQkJCQkgICAgICAgci0+bWV0aG9kLCAiOiIsCi0JCQkJCSAgICAgICBhcF9nbV90aW1lc3RyXzgyMihyLT5wb29sLCByLT5yZXF1ZXN0X3RpbWUpLCAiOiIsCi0JCQkJCSAgICAgICBlbnRpdHlfaW5mbywgIjoiLAotCQkJCQkgICAgICAgYXBfbWQ1KHItPnBvb2wsICh1bnNpZ25lZCBjaGFyICopICIiKSwgLyogSChlbnRpdHkpIC0gVEJEICovCi0JCQkJCSAgICAgICBOVUxMKSk7Ci0jZW5kaWYKLSAgICB9Ci0KLQotICAgIC8qIHNldHVwIG5leHRub25jZQotICAgICAqLwotICAgIGlmIChjb25mLT5ub25jZV9saWZldGltZSA+IDApIHsKLQkvKiBzZW5kIG5leHRub25jZSBpZiBjdXJyZW50IG5vbmNlIHdpbGwgZXhwaXJlIGluIGxlc3MgdGhhbiAzMCBzZWNzICovCi0JaWYgKGRpZmZ0aW1lKHItPnJlcXVlc3RfdGltZSwgcmVzcC0+bm9uY2VfdGltZSkgPiAoY29uZi0+bm9uY2VfbGlmZXRpbWUtTkVYVE5PTkNFX0RFTFRBKSkgewotCSAgICBuZXh0bm9uY2UgPSBhcF9wc3RyY2F0KHItPnBvb2wsICIsIG5leHRub25jZT1cIiIsCi0JCQkJICAgZ2VuX25vbmNlKHItPnBvb2wsIHItPnJlcXVlc3RfdGltZSwKLQkJCQkJICAgICByZXNwLT5vcGFxdWUsIHItPnNlcnZlciwgY29uZiksCi0JCQkJICAgIlwiIiwgTlVMTCk7Ci0JICAgIHJlc3AtPmNsaWVudC0+bm9uY2VfY291bnQgPSAwOwotCX0KLSAgICB9Ci0gICAgZWxzZSBpZiAoY29uZi0+bm9uY2VfbGlmZXRpbWUgPT0gMCAmJiByZXNwLT5jbGllbnQpIHsKLSAgICAgICAgY29uc3QgY2hhciAqbm9uY2UgPSBnZW5fbm9uY2Uoci0+cG9vbCwgMCwgcmVzcC0+b3BhcXVlLCByLT5zZXJ2ZXIsCi0JCQkJICAgICAgY29uZik7Ci0JbmV4dG5vbmNlID0gYXBfcHN0cmNhdChyLT5wb29sLCAiLCBuZXh0bm9uY2U9XCIiLCBub25jZSwgIlwiIiwgTlVMTCk7Ci0JbWVtY3B5KHJlc3AtPmNsaWVudC0+bGFzdF9ub25jZSwgbm9uY2UsIE5PTkNFX0xFTisxKTsKLSAgICB9Ci0gICAgLyogZWxzZSBub25jZSBuZXZlciBleHBpcmVzLCBoZW5jZSBubyBuZXh0bm9uY2UgKi8KLQotCi0gICAgLyogZG8gcmZjLTIwNjkgZGlnZXN0Ci0gICAgICovCi0gICAgaWYgKGNvbmYtPnFvcF9saXN0WzBdICYmICFzdHJjYXNlY21wKGNvbmYtPnFvcF9saXN0WzBdLCAibm9uZSIpCi0JJiYgcmVzcC0+bWVzc2FnZV9xb3AgPT0gTlVMTCkgewotCS8qIHVzZSBvbmx5IFJGQy0yMDY5IGZvcm1hdCAqLwotCWlmIChkaWdlc3QpCi0JICAgIGFpID0gYXBfcHN0cmNhdChyLT5wb29sLCAiZGlnZXN0PVwiIiwgZGlnZXN0LCAiXCIiLCBuZXh0bm9uY2UsTlVMTCk7Ci0JZWxzZQotCSAgICBhaSA9IG5leHRub25jZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JY29uc3QgY2hhciAqcmVzcF9kaWcsICpoYTEsICphMiwgKmhhMjsKLQotCS8qIGNhbGN1bGF0ZSByc3BhdXRoIGF0dHJpYnV0ZQotCSAqLwotCWlmIChyZXNwLT5hbGdvcml0aG0gJiYgIXN0cmNhc2VjbXAocmVzcC0+YWxnb3JpdGhtLCAiTUQ1LXNlc3MiKSkKLQkgICAgaGExID0gZ2V0X3Nlc3Npb24ociwgcmVzcCwgY29uZik7Ci0JZWxzZQotCSAgICBoYTEgPSBjb25mLT5oYTE7Ci0KLQlpZiAocmVzcC0+bWVzc2FnZV9xb3AgJiYgIXN0cmNhc2VjbXAocmVzcC0+bWVzc2FnZV9xb3AsICJhdXRoLWludCIpKQotCSAgICBhMiA9IGFwX3BzdHJjYXQoci0+cG9vbCwgIjoiLCByZXNwLT51cmksICI6IiwKLQkJCSAgICBhcF9tZDUoci0+cG9vbCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgIiIpLCBOVUxMKTsgLyogVEJEICovCi0JZWxzZQotCSAgICBhMiA9IGFwX3BzdHJjYXQoci0+cG9vbCwgIjoiLCByZXNwLT51cmksIE5VTEwpOwotCWhhMiA9IGFwX21kNShyLT5wb29sLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKWEyKTsKLQotCXJlc3BfZGlnID0gYXBfbWQ1KHItPnBvb2wsCi0JCSAgICAgICAgICh1bnNpZ25lZCBjaGFyICopYXBfcHN0cmNhdChyLT5wb29sLCBoYTEsICI6IiwKLQkJCQkJCSAgICAgcmVzcC0+bm9uY2UsICI6IiwKLQkJCQkJCSAgICAgcmVzcC0+bm9uY2VfY291bnQsICI6IiwKLQkJCQkJCSAgICAgcmVzcC0+Y25vbmNlLCAiOiIsCi0JCQkJCQkgICAgIHJlc3AtPm1lc3NhZ2VfcW9wID8KLQkJCQkJCQkgcmVzcC0+bWVzc2FnZV9xb3AgOiAiIiwKLQkJCQkJCSAgICAgIjoiLCBoYTIsIE5VTEwpKTsKLQotCS8qIGFzc2VtYmxlIEF1dGhlbnRpY2F0aW9uLUluZm8gaGVhZGVyCi0JICovCi0JYWkgPSBhcF9wc3RyY2F0KHItPnBvb2wsCi0JCQkicnNwYXV0aD1cIiIsIHJlc3BfZGlnLCAiXCIiLAotCQkJbmV4dG5vbmNlLAotCQkgICAgICAgIHJlc3AtPmNub25jZSA/ICIsIGNub25jZT1cIiIgOiAiIiwKLQkJICAgICAgICByZXNwLT5jbm9uY2UgPyBhcF9lc2NhcGVfcXVvdGVzKHItPnBvb2wsIHJlc3AtPmNub25jZSkgOgotCQkJCQkiIiwKLQkJICAgICAgICByZXNwLT5jbm9uY2UgPyAiXCIiIDogIiIsCi0JCSAgICAgICAgcmVzcC0+bm9uY2VfY291bnQgPyAiLCBuYz0iIDogIiIsCi0JCSAgICAgICAgcmVzcC0+bm9uY2VfY291bnQgPyByZXNwLT5ub25jZV9jb3VudCA6ICIiLAotCQkgICAgICAgIHJlc3AtPm1lc3NhZ2VfcW9wID8gIiwgcW9wPSIgOiAiIiwKLQkJICAgICAgICByZXNwLT5tZXNzYWdlX3FvcCA/IHJlc3AtPm1lc3NhZ2VfcW9wIDogIiIsCi0JCQlkaWdlc3QgPyAiZGlnZXN0PVwiIiA6ICIiLAotCQkJZGlnZXN0ID8gZGlnZXN0IDogIiIsCi0JCQlkaWdlc3QgPyAiXCIiIDogIiIsCi0JCQlOVUxMKTsKLSAgICB9Ci0KLSAgICBpZiAoYWkgJiYgYWlbMF0pCi0JYXBfdGFibGVfbWVyZ2VuKHItPmhlYWRlcnNfb3V0LAotCQkJci0+cHJveHlyZXEgPyAiUHJveHktQXV0aGVudGljYXRpb24tSW5mbyIgOgotCQkJCSAgICAgICJBdXRoZW50aWNhdGlvbi1JbmZvIiwKLQkJCWFpKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGRpZ2VzdF9hdXRoX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkRfTU9EVUxFX1NUVUZGLAotICAgIGluaXRpYWxpemVfbW9kdWxlLAkJLyogaW5pdGlhbGl6ZXIgKi8KLSAgICBjcmVhdGVfZGlnZXN0X2Rpcl9jb25maWcsCS8qIGRpciBjb25maWcgY3JlYXRlciAqLwotICAgIE5VTEwsCQkJLyogZGlyIG1lcmdlciAtLS0gZGVmYXVsdCBpcyB0byBvdmVycmlkZSAqLwotICAgIE5VTEwsCQkJLyogc2VydmVyIGNvbmZpZyAqLwotICAgIE5VTEwsCQkJLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLwotICAgIGRpZ2VzdF9jbWRzLAkJLyogY29tbWFuZCB0YWJsZSAqLwotICAgIE5VTEwsCQkJLyogaGFuZGxlcnMgKi8KLSAgICBOVUxMLAkJCS8qIGZpbGVuYW1lIHRyYW5zbGF0aW9uICovCi0gICAgYXV0aGVudGljYXRlX2RpZ2VzdF91c2VyLAkvKiBjaGVja191c2VyX2lkICovCi0gICAgZGlnZXN0X2NoZWNrX2F1dGgsCQkvKiBjaGVjayBhdXRoICovCi0gICAgTlVMTCwJCQkvKiBjaGVjayBhY2Nlc3MgKi8KLSAgICBOVUxMLAkJCS8qIHR5cGVfY2hlY2tlciAqLwotICAgIGFkZF9hdXRoX2luZm8sCQkvKiBmaXh1cHMgKi8KLSAgICBOVUxMLAkJCS8qIGxvZ2dlciAqLwotICAgIE5VTEwsCQkJLyogaGVhZGVyIHBhcnNlciAqLwotICAgIE5VTEwsCQkJLyogY2hpbGRfaW5pdCAqLwotICAgIE5VTEwsCQkJLyogY2hpbGRfZXhpdCAqLwotICAgIHVwZGF0ZV9ub25jZV9jb3VudAkJLyogcG9zdCByZWFkLXJlcXVlc3QgKi8KLX07Ci0KZGlmZiAtLWdpdCBhL21vZHVsZXMvYWFhL21vZF9hdXRoX2RpZ2VzdC5kc3AgYi9tb2R1bGVzL2FhYS9tb2RfYXV0aF9kaWdlc3QuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjcwMDU3Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvYWFhL21vZF9hdXRoX2RpZ2VzdC5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9IkFwYWNoZU1vZHVsZUF1dGhEaWdlc3QiIC0gUGFja2FnZSBPd25lcj08ND4KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDUuMDAKLSMgKiogRE8gTk9UIEVESVQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDEwMgotCi1DRkc9QXBhY2hlTW9kdWxlQXV0aERpZ2VzdCAtIFdpbjMyIERlYnVnCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIkFwYWNoZU1vZHVsZUF1dGhEaWdlc3QubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJBcGFjaGVNb2R1bGVBdXRoRGlnZXN0Lm1hayJcCi0gQ0ZHPSJBcGFjaGVNb2R1bGVBdXRoRGlnZXN0IC0gV2luMzIgRGVidWciCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAiQXBhY2hlTW9kdWxlQXV0aERpZ2VzdCAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvblwKLSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgIkFwYWNoZU1vZHVsZUF1dGhEaWdlc3QgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uXAotICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotTVRMPW1pZGwuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIkFwYWNoZU1vZHVsZUF1dGhEaWdlc3QgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiLlxBcGFjaGVNb2R1bGVBdXRoRGlnZXN0UiIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuXEFwYWNoZU1vZHVsZUF1dGhEaWdlc3RSIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9JICIuLlwuLlxpbmNsdWRlIiAvSSAiLlxcIiAvSSAiLi5cLi5cbGliXGFwclxpbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIlNIQVJFRF9NT0RVTEUiIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vIE5VTCAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIEFwYWNoZUNvcmUubGliIGFwcmxpYi5saWIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvbWFjaGluZTpJMzg2IC9saWJwYXRoOiIuLlwuLlxDb3JlUiIgL2xpYnBhdGg6Ii4uXC4uXGxpYlxhcHJcUmVsZWFzZSIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFwYWNoZU1vZHVsZUF1dGhEaWdlc3QgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiLlxBcGFjaGVNb2R1bGVBdXRoRGlnZXN0RCIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuXEFwYWNoZU1vZHVsZUF1dGhEaWdlc3REIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9JICIuLlwuLlxpbmNsdWRlIiAvSSAiLlxcIiAvSSAiLi5cLi5cbGliXGFwclxpbmNsdWRlIiAvRCAiX0RFQlVHIiAvRCAiU0hBUkVEX01PRFVMRSIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vIE5VTCAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAotIyBBREQgTElOSzMyIEFwYWNoZUNvcmUubGliIGFwcmxpYi5saWIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0IC9saWJwYXRoOiIuLlwuLlxDb3JlRCIgL2xpYnBhdGg6Ii4uXC4uXGxpYlxhcHJcRGVidWciCi0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJBcGFjaGVNb2R1bGVBdXRoRGlnZXN0IC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAiQXBhY2hlTW9kdWxlQXV0aERpZ2VzdCAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cbW9kdWxlc1xzdGFuZGFyZFxtb2RfYXV0aF9kaWdlc3QuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9hcmNoL25ldHdhcmUvbGlicHJld3MuYyBiL21vZHVsZXMvYXJjaC9uZXR3YXJlL2xpYnByZXdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYTQ3NWYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9hcmNoL25ldHdhcmUvbGlicHJld3MuYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHNoYXJlZCBOTE0gc3RhcnRzIGFuZAotICBzdG9wcy4gIEJ5IHVzaW5nIHRoZXNlIGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIGRlZmluaW5nIGEgbWFpbigpCi0gIGFuZCBjYWxsaW5nIEV4aXRUaHJlYWQoVFNSX1RIUkVBRCwgMCksIHRoZSBsb2FkIHRpbWUgb2YgdGhlCi0gIHNoYXJlZCBOTE0gaXMgZmFzdGVyIGFuZCBtZW1vcnkgc2l6ZSByZWR1Y2VkLgotICAgCi0gIFlvdSBtYXkgYWxzbyB3YW50IHRvIG92ZXJyaWRlIHRoZXNlIGluIHlvdXIgb3duIEFwYWNoZSBtb2R1bGUKLSAgdG8gZG8gYW55IGNsZWFudXAgb3RoZXIgdGhhbiB0aGUgbWVjaGFuaXNtIEFwYWNoZSBtb2R1bGVzCi0gIHByb3ZpZGUuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgPG5ldHdhcmUuaD4KLS8vI2luY2x1ZGUgInN0ZGRlZi5oIgotI2luY2x1ZGUgIndzMm5sbS5oIgotCi1pbnQgX05vbkFwcFN0YXJ0Ci0oCi0gICAgdm9pZCAgICAgICAgKk5MTUhhbmRsZSwKLSAgICB2b2lkICAgICAgICAqZXJyb3JTY3JlZW4sCi0gICAgY29uc3QgY2hhciAgKmNtZExpbmUsCi0gICAgY29uc3QgY2hhciAgKmxvYWREaXJQYXRoLAotICAgIHNpemVfdCAgICAgIHVuaW5pdGlhbGl6ZWREYXRhTGVuZ3RoLAotICAgIHZvaWQgICAgICAgICpOTE1GaWxlSGFuZGxlLAotICAgIGludCAgICAgICAgICgqcmVhZFJvdXRpbmVQKSggaW50IGNvbm4sIHZvaWQgKmZpbGVIYW5kbGUsIHNpemVfdCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBuYnl0ZXMsIHNpemVfdCAqYnl0ZXNSZWFkLCB2b2lkICpidWZmZXIgKSwKLSAgICBzaXplX3QgICAgICBjdXN0b21EYXRhT2Zmc2V0LAotICAgIHNpemVfdCAgICAgIGN1c3RvbURhdGFTaXplLAotICAgIGludCAgICAgICAgIG1lc3NhZ2VDb3VudCwKLSAgICBjb25zdCBjaGFyICAqKm1lc3NhZ2VzCi0pCi17Ci0jcHJhZ21hIHVudXNlZChjbWRMaW5lKQotI3ByYWdtYSB1bnVzZWQobG9hZERpclBhdGgpCi0jcHJhZ21hIHVudXNlZCh1bmluaXRpYWxpemVkRGF0YUxlbmd0aCkKLSNwcmFnbWEgdW51c2VkKE5MTUZpbGVIYW5kbGUpCi0jcHJhZ21hIHVudXNlZChyZWFkUm91dGluZVApCi0jcHJhZ21hIHVudXNlZChjdXN0b21EYXRhT2Zmc2V0KQotI3ByYWdtYSB1bnVzZWQoY3VzdG9tRGF0YVNpemUpCi0jcHJhZ21hIHVudXNlZChtZXNzYWdlQ291bnQpCi0jcHJhZ21hIHVudXNlZChtZXNzYWdlcykKLQotICAgIFdTQURBVEEgd3NhRGF0YTsKLSAgICAKLSAgICByZXR1cm4gV1NBU3RhcnR1cCgoV09SRCkgTUFLRVdPUkQoMiwgMCksICZ3c2FEYXRhKTsKLX0KLQotdm9pZCBfTm9uQXBwU3RvcCggdm9pZCApCi17Ci0gICAgV1NBQ2xlYW51cCgpOwotfQotCi1pbnQgIF9Ob25BcHBDaGVja1VubG9hZCggdm9pZCApCi17Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9tb2R1bGVzL2FyY2gvbmV0d2FyZS9tb2RfYXV0aF9kaWdlc3QuZGVmIGIvbW9kdWxlcy9hcmNoL25ldHdhcmUvbW9kX2F1dGhfZGlnZXN0LmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEzYWEwOC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2FyY2gvbmV0d2FyZS9tb2RfYXV0aF9kaWdlc3QuZGVmCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRVhQT1JUICBhdXRoX2RpZ2VzdF9tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF9jYWNoZS5kZWYgYi9tb2R1bGVzL2FyY2gvbmV0d2FyZS9tb2RfY2FjaGUuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2FiNmNhLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF9jYWNoZS5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUVYUE9SVCAgY2FjaGVfbW9kdWxlCi1FWFBPUlQgIGNhY2hlX2hvb2tfY3JlYXRlX2VudGl0eQotRVhQT1JUICBjYWNoZV9ob29rX29wZW5fZW50aXR5Ci1FWFBPUlQgIGNhY2hlX2hvb2tfcmVtb3ZlX3VybAotCi0KZGlmZiAtLWdpdCBhL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF9jZXJuX21ldGEuZGVmIGIvbW9kdWxlcy9hcmNoL25ldHdhcmUvbW9kX2Nlcm5fbWV0YS5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MzgzMjUuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9hcmNoL25ldHdhcmUvbW9kX2Nlcm5fbWV0YS5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1FWFBPUlQgIGNlcm5fbWV0YV9tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF9kYXYuZGVmIGIvbW9kdWxlcy9hcmNoL25ldHdhcmUvbW9kX2Rhdi5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNTZjOTIuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9hcmNoL25ldHdhcmUvbW9kX2Rhdi5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUVYUE9SVCBkYXZfbW9kdWxlCi1FWFBPUlQgQGRhdi5pbXAKLSAKZGlmZiAtLWdpdCBhL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF9lY2hvLmRlZiBiL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF9lY2hvLmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk0MTM1YS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2FyY2gvbmV0d2FyZS9tb2RfZWNoby5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLUVYUE9SVCAgZWNob19tb2R1bGUKLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9hcmNoL25ldHdhcmUvbW9kX2V4cGlyZXMuZGVmIGIvbW9kdWxlcy9hcmNoL25ldHdhcmUvbW9kX2V4cGlyZXMuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzQxNjYzLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF9leHBpcmVzLmRlZgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUVYUE9SVCAgZXhwaXJlc19tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF9maWxlX2NhY2hlLmRlZiBiL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF9maWxlX2NhY2hlLmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFiOThjZi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2FyY2gvbmV0d2FyZS9tb2RfZmlsZV9jYWNoZS5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLUVYUE9SVCAgZmlsZV9jYWNoZV9tb2R1bGUKLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9hcmNoL25ldHdhcmUvbW9kX2hlYWRlcnMuZGVmIGIvbW9kdWxlcy9hcmNoL25ldHdhcmUvbW9kX2hlYWRlcnMuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmUzNWE4Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF9oZWFkZXJzLmRlZgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUVYUE9SVCAgaGVhZGVyc19tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF9pbmZvLmRlZiBiL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF9pbmZvLmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3MWNiMy4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2FyY2gvbmV0d2FyZS9tb2RfaW5mby5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1FWFBPUlQgIGluZm9fbW9kdWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL2FyY2gvbmV0d2FyZS9tb2RfbWVtX2NhY2hlLmRlZiBiL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF9tZW1fY2FjaGUuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZThiNjdhLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF9tZW1fY2FjaGUuZGVmCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1JTVBPUlQgIGNhY2hlX2hvb2tfY3JlYXRlX2VudGl0eQotSU1QT1JUICBjYWNoZV9ob29rX29wZW5fZW50aXR5Ci1JTVBPUlQgIGNhY2hlX2hvb2tfcmVtb3ZlX3VybAotRVhQT1JUICBtZW1fY2FjaGVfbW9kdWxlCi0KZGlmZiAtLWdpdCBhL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF9taW1lX21hZ2ljLmRlZiBiL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF9taW1lX21hZ2ljLmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUzMDc0Ny4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2FyY2gvbmV0d2FyZS9tb2RfbWltZV9tYWdpYy5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1FWFBPUlQgIG1pbWVfbWFnaWNfbW9kdWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL2FyY2gvbmV0d2FyZS9tb2Rfbndfc3NsLmMgYi9tb2R1bGVzL2FyY2gvbmV0d2FyZS9tb2Rfbndfc3NsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOWQ2YmQuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9hcmNoL25ldHdhcmUvbW9kX253X3NzbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDYyICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotLyoKLSAqIG1vZF90bHMuYyAtIEFwYWNoZSBTU0wvVExTIG1vZHVsZSBmb3IgTmV0V2FyZSBieSBNaWtlIEdhcmRpbmVyLgotICoKLSAqIFRoaXMgbW9kdWxlIGdpdmVzIEFwYWNoZSB0aGUgYWJpbGl0eSB0byBkbyBTU0wvVExTIHdpdGggYSBtaW5pbXVtIGFtb3VudAotICogb2YgZWZmb3J0LiAgQWxsIG9mIHRoZSBTU0wvVExTIGxvZ2ljIGlzIGFscmVhZHkgb24gTmV0V2FyZSB2ZXJzaW9ucyA1IGFuZAotICogYWJvdmUgYW5kIGlzIGludGVyZmFjZWQgdGhyb3VnaCBXaW5Tb2NrIG9uIE5ldFdhcmUuICBBcyB5b3UgY2FuIHNlZSBpbgotICogdGhlIGNvZGUgYmVsb3cgU1NML1RMUyBzb2NrZXRzIGNhbiBiZSBjcmVhdGVkIHdpdGggdGhyZWUgV2luU29jayBjYWxscy4KLSAqCi0gKiBUbyBsb2FkLCBzaW1wbHkgcGxhY2UgdGhlIG1vZHVsZSBpbiB0aGUgbW9kdWxlcyBkaXJlY3RvcnkgdW5kZXIgdGhlIG1haW4KLSAqIGFwYWNoZSB0cmVlLiAgVGhlbiBhZGQgYSAiU2VjdXJlTGlzdGVuIiB3aXRoIHR3byBhcmd1bWVudHMuICBUaGUgZmlyc3QKLSAqIGFyZ3VtZW50IGlzIGFuIGFkZHJlc3MgYW5kL29yIHBvcnQuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBrZXkgcGFpcgotICogbmFtZSBhcyBjcmVhdGVkIGluIENvbnNvbGVPbmUuCi0gKgotICogIEV4YW1wbGVzOgotICoKLSAqICAgICAgICAgIFNlY3VyZUxpc3RlbiA0NDMgIlNTTCBDZXJ0aWZpY2F0ZUlQIiAgCi0gKiAgICAgICAgICBTZWN1cmVMaXN0ZW4gMTIzLjQ1LjY3Ljg5OjQ0MyBteWNlcnQKLSAqLwotCi0jZGVmaW5lIFdTX1NTTAotCi0jZGVmaW5lICBNQVhfQUREUkVTUyAgNTEyCi0jZGVmaW5lICBNQVhfS0VZICAgICAgIDgwCi0KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImFwX2xpc3Rlbi5oIgotI2luY2x1ZGUgImFwcl9zdHJpbmdzLmgiCi0KLW1vZHVsZSBBUF9NT0RVTEVfREVDTEFSRV9EQVRBIG53c3NsX21vZHVsZTsKLQotdHlwZWRlZiBzdHJ1Y3QgTldTU0xTcnZDb25maWdSZWMgTldTU0xTcnZDb25maWdSZWM7Ci10eXBlZGVmIHN0cnVjdCBzZWNsaXN0ZW5fcmVjIHNlY2xpc3Rlbl9yZWM7Ci0KLXN0cnVjdCBzZWNsaXN0ZW5fcmVjIHsKLSAgICBzZWNsaXN0ZW5fcmVjICpuZXh0OwotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBsb2NhbF9hZGRyOwkvKiBsb2NhbCBJUCBhZGRyZXNzIGFuZCBwb3J0ICovCi0gICAgaW50IGZkOwotICAgIGludCB1c2VkOwkJCSAgICAgICAgICAgIC8qIE9ubHkgdXNlZCBkdXJpbmcgcmVzdGFydCAqLwotICAgIGNoYXIga2V5W01BWF9LRVldOwotICAgIGludCBtdXR1YWw7Ci0gICAgY2hhciAqYWRkcjsKLSAgICBpbnQgcG9ydDsKLX07Ci0KLXN0cnVjdCBOV1NTTFNydkNvbmZpZ1JlYyB7Ci0gICAgYXByX3RhYmxlX3QgKnNsdGFibGU7Ci19OwotCi1zdGF0aWMgc2VjbGlzdGVuX3JlYyogYXBfc2VjbGlzdGVuZXJzID0gTlVMTDsKLQotI2RlZmluZSBnZXRfbndzc2xfY2ZnKHNydikgKE5XU1NMU3J2Q29uZmlnUmVjICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHNydi0+bW9kdWxlX2NvbmZpZywgJm53c3NsX21vZHVsZSkKLQotLyoKLSAqIFBhcnNlcyBhIGhvc3Qgb2YgdGhlIGZvcm0gPGFkZHJlc3M+Wzpwb3J0XQotICogOnBvcnQgaXMgcGVybWl0dGVkIGlmICdwb3J0JyBpcyBub3QgTlVMTAotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBwYXJzZV9hZGRyKGNvbnN0IGNoYXIgKncsIHVuc2lnbmVkIHNob3J0ICpwb3J0cykKLXsKLSAgICBzdHJ1Y3QgaG9zdGVudCAqaGVwOwotICAgIHVuc2lnbmVkIGxvbmcgbXlfYWRkcjsKLSAgICBjaGFyICpwOwotCi0gICAgcCA9IHN0cmNocih3LCAnOicpOwotICAgIGlmIChwb3J0cyAhPSBOVUxMKSB7Ci0gICAgICAgICpwb3J0cyA9IDA7Ci0gICAgaWYgKHAgIT0gTlVMTCAmJiBzdHJjbXAocCArIDEsICIqIikgIT0gMCkKLSAgICAgICAgKnBvcnRzID0gYXRvaShwICsgMSk7Ci0gICAgfQotCi0gICAgaWYgKHAgIT0gTlVMTCkKLSAgICAgICAgKnAgPSAnXDAnOwotICAgIGlmIChzdHJjbXAodywgIioiKSA9PSAwKSB7Ci0gICAgICAgIGlmIChwICE9IE5VTEwpCi0gICAgICAgICAgICAqcCA9ICc6JzsKLSAgICAgICAgcmV0dXJuIGh0b25sKElOQUREUl9BTlkpOwotICAgIH0KLQotICAgIG15X2FkZHIgPSBhcHJfaW5ldF9hZGRyKChjaGFyICopdyk7Ci0gICAgaWYgKG15X2FkZHIgIT0gSU5BRERSX05PTkUpIHsKLSAgICAgICAgaWYgKHAgIT0gTlVMTCkKLSAgICAgICAgICAgICpwID0gJzonOwotICAgICAgICByZXR1cm4gbXlfYWRkcjsKLSAgICB9Ci0KLSAgICBoZXAgPSBnZXRob3N0YnluYW1lKHcpOwotCi0gICAgaWYgKCghaGVwKSB8fCAoaGVwLT5oX2FkZHJ0eXBlICE9IEFGX0lORVQgfHwgIWhlcC0+aF9hZGRyX2xpc3RbMF0pKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IHJlc29sdmUgaG9zdCBuYW1lICVzIC0tLSBleGl0aW5nIVxuIiwgdyk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgaWYgKGhlcC0+aF9hZGRyX2xpc3RbMV0pIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJIb3N0ICVzIGhhcyBtdWx0aXBsZSBhZGRyZXNzZXMgLS0tXG4iLCB3KTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJ5b3UgbXVzdCBjaG9vc2Ugb25lIGV4cGxpY2l0bHkgZm9yIHVzZSBhc1xuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiYSBzZWN1cmUgcG9ydC4gIEV4aXRpbmchISFcbiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGlmIChwICE9IE5VTEwpCi0gICAgICAgICpwID0gJzonOwotCi0gICAgcmV0dXJuICgoc3RydWN0IGluX2FkZHIgKikgKGhlcC0+aF9hZGRyKSktPnNfYWRkcjsKLX0KLQotc3RhdGljIGludCBmaW5kX3NlY3VyZV9saXN0ZW5lcihzZWNsaXN0ZW5fcmVjICpscikKLXsKLSAgICBzZWNsaXN0ZW5fcmVjICpzbDsKLQotICAgIGZvciAoc2wgPSBhcF9zZWNsaXN0ZW5lcnM7IHNsOyBzbCA9IHNsLT5uZXh0KSB7Ci0gICAgICAgIGlmICghbWVtY21wKCZzbC0+bG9jYWxfYWRkciwgJmxyLT5sb2NhbF9hZGRyLCBzaXplb2Yoc2wtPmxvY2FsX2FkZHIpKSkgewotICAgICAgICAgICAgc2wtPnVzZWQgPSAxOwotICAgICAgICAgICAgcmV0dXJuIHNsLT5mZDsKLSAgICAgICAgfQotICAgIH0gICAgCi0gICAgcmV0dXJuIC0xOwotfQotCi0KLXN0YXRpYyBpbnQgbWFrZV9zZWN1cmVfc29ja2V0KGFwcl9wb29sX3QgKnBjb25mLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGtleSwgaW50IG11dHVhbCwgc2VydmVyX3JlYyAqc2VydmVyX2NvbmYpCi17Ci0gICAgaW50IHM7Ci0gICAgaW50IG9uZSA9IDE7Ci0gICAgY2hhciBhZGRyW01BWF9BRERSRVNTXTsKLSAgICBzdHJ1Y3Qgc3Nsc2VydmVyb3B0cyBvcHRzOwotICAgIHVuc2lnbmVkIGludCBvcHRQYXJhbTsKLSAgICBXU0FQUk9UT0NPTF9JTkZPIFNlY3VyZVByb3RvSW5mbzsKLSAgICBpbnQgbm8gPSAxOwotICAgIAotICAgIGlmIChzZXJ2ZXItPnNpbl9hZGRyLnNfYWRkciAhPSBodG9ubChJTkFERFJfQU5ZKSkKLSAgICAgICAgYXByX3NucHJpbnRmKGFkZHIsIHNpemVvZihhZGRyKSwgImFkZHJlc3MgJXMgcG9ydCAlZCIsCi0gICAgICAgICAgICBpbmV0X250b2Eoc2VydmVyLT5zaW5fYWRkciksIG50b2hzKHNlcnZlci0+c2luX3BvcnQpKTsKLSAgICBlbHNlCi0gICAgICAgIGFwcl9zbnByaW50ZihhZGRyLCBzaXplb2YoYWRkciksICJwb3J0ICVkIiwgbnRvaHMoc2VydmVyLT5zaW5fcG9ydCkpOwotCi0gICAgLyogbm90ZSB0aGF0IGJlY2F1c2Ugd2UncmUgYWJvdXQgdG8gc2xhY2sgd2UgZG9uJ3QgdXNlIHBzb2NrZXQgKi8KLSAgICBtZW1zZXQoJlNlY3VyZVByb3RvSW5mbywgMCwgc2l6ZW9mKFdTQVBST1RPQ09MX0lORk8pKTsKLQotICAgIFNlY3VyZVByb3RvSW5mby5pQWRkcmVzc0ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgU2VjdXJlUHJvdG9JbmZvLmlTb2NrZXRUeXBlID0gU09DS19TVFJFQU07Ci0gICAgU2VjdXJlUHJvdG9JbmZvLmlQcm90b2NvbCA9IElQUFJPVE9fVENQOyAgIAotICAgIFNlY3VyZVByb3RvSW5mby5pU2VjdXJpdHlTY2hlbWUgPSBTRUNVUklUWV9QUk9UT0NPTF9TU0w7Ci0KLSAgICBzID0gV1NBU29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCwKLSAgICAgICAgICAgIChMUFdTQVBST1RPQ09MX0lORk8pJlNlY3VyZVByb3RvSW5mbywgMCwgMCk7Ci0gICAgICAgICAgICAKLSAgICBpZiAocyA9PSBJTlZBTElEX1NPQ0tFVCkgewotICAgICAgICBlcnJubyA9IFdTQUdldExhc3RFcnJvcigpOwotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQ1JJVCwgZXJybm8sIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgIm1ha2Vfc2VjdXJlX3NvY2tldDogZmFpbGVkIHRvIGdldCBhIHNvY2tldCBmb3IgJXMiLCBhZGRyKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAgICAgCi0gICAgaWYgKCFtdXR1YWwpIHsKLSAgICAgICAgb3B0UGFyYW0gPSBTT19TU0xfRU5BQkxFIHwgU09fU1NMX1NFUlZFUjsKLQkJICAgIAotICAgICAgICBpZiAoV1NBSW9jdGwocywgU09fU1NMX1NFVF9GTEFHUywgKGNoYXIgKikmb3B0UGFyYW0sCi0gICAgICAgICAgICBzaXplb2Yob3B0UGFyYW0pLCBOVUxMLCAwLCBOVUxMLCBOVUxMLCBOVUxMKSkgewotICAgICAgICAgICAgZXJybm8gPSBXU0FHZXRMYXN0RXJyb3IoKTsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19DUklULCBlcnJubywgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgIm1ha2Vfc2VjdXJlX3NvY2tldDogZm9yICVzLCBXU0FJb2N0bDogKFNPX1NTTF9TRVRfRkxBR1MpIiwgYWRkcik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBvcHRzLmNlcnQgPSBrZXk7Ci0gICAgb3B0cy5jZXJ0bGVuID0gc3RybGVuKGtleSk7Ci0gICAgb3B0cy5zaWR0aW1lb3V0ID0gMDsKLSAgICBvcHRzLnNpZGVudHJpZXMgPSAwOwotICAgIG9wdHMuc2lkZGlyID0gTlVMTDsKLQotICAgIGlmIChXU0FJb2N0bChzLCBTT19TU0xfU0VUX1NFUlZFUiwgKGNoYXIgKikmb3B0cywgc2l6ZW9mKG9wdHMpLAotICAgICAgICBOVUxMLCAwLCBOVUxMLCBOVUxMLCBOVUxMKSAhPSAwKSB7Ci0gICAgICAgIGVycm5vID0gV1NBR2V0TGFzdEVycm9yKCk7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19DUklULCBlcnJubywgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAibWFrZV9zZWN1cmVfc29ja2V0OiBmb3IgJXMsIFdTQUlvY3RsOiAoU09fU1NMX1NFVF9TRVJWRVIpIiwgYWRkcik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZiAobXV0dWFsKSB7Ci0gICAgICAgIG9wdFBhcmFtID0gMHgwNzsgICAgICAgICAgICAgICAvLyBTT19TU0xfQVVUSF9DTElFTlQKLQotICAgICAgICBpZihXU0FJb2N0bChzLCBTT19TU0xfU0VUX0ZMQUdTLCAoY2hhciopJm9wdFBhcmFtLAotICAgICAgICAgICAgc2l6ZW9mKG9wdFBhcmFtKSwgTlVMTCwgMCwgTlVMTCwgTlVMTCwgTlVMTCkpIHsKLSAgICAgICAgICAgIGVycm5vID0gV1NBR2V0TGFzdEVycm9yKCk7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoIEFQTE9HX01BUkssIEFQTE9HX0NSSVQsIGVycm5vLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAibWFrZV9zZWN1cmVfc29ja2V0OiBmb3IgJXMsIFdTQUlvY3RsOiAoU09fU1NMX1NFVF9GTEFHUykiLCBhZGRyICk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gczsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9zZWN1cmVfbGlzdGVuZXIoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmlwcywgY29uc3QgY2hhcioga2V5LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG11dHVhbCkKLXsKLSAgICBOV1NTTFNydkNvbmZpZ1JlYyogc2MgPSBnZXRfbndzc2xfY2ZnKGNtZC0+c2VydmVyKTsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBjaGFyICpwb3J0cywgKmFkZHI7Ci0gICAgdW5zaWduZWQgc2hvcnQgcG9ydDsKLSAgICBzZWNsaXN0ZW5fcmVjICpuZXc7Ci0KLSAgICAKLSAgICBpZiAoZXJyICE9IE5VTEwpIAotICAgICAgICByZXR1cm4gZXJyOwotCi0gICAgcG9ydHMgPSBzdHJjaHIoaXBzLCAnOicpOwotICAgIAotICAgIGlmIChwb3J0cyAhPSBOVUxMKSB7ICAgIAotCSAgICBpZiAocG9ydHMgPT0gaXBzKQotCSAgICAgICAgcmV0dXJuICJNaXNzaW5nIElQIGFkZHJlc3MiOwotCSAgICBlbHNlIGlmIChwb3J0c1sxXSA9PSAnXDAnKQotCSAgICAgICAgcmV0dXJuICJBZGRyZXNzIG11c3QgZW5kIGluIDo8cG9ydC1udW1iZXI+IjsKLQkgICAgICAgIAotCSAgICAqKHBvcnRzKyspID0gJ1wwJzsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JICAgIHBvcnRzID0gKGNoYXIqKWlwczsKLSAgICB9Ci0gICAgCi0gICAgbmV3ID0gYXByX3BjYWxsb2MoY21kLT5wb29sLCBzaXplb2Yoc2VjbGlzdGVuX3JlYykpOyAKLSAgICBuZXctPmxvY2FsX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgCi0gICAgaWYgKHBvcnRzID09IGlwcykgewotCSAgICBuZXctPmxvY2FsX2FkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7Ci0gICAgICAgIGFkZHIgPSBhcHJfcHN0cmR1cChjbWQtPnBvb2wsICIwLjAuMC4wIik7Ci0gICAgfQotICAgIGVsc2UgewotCSAgICBuZXctPmxvY2FsX2FkZHIuc2luX2FkZHIuc19hZGRyID0gcGFyc2VfYWRkcihpcHMsIE5VTEwpOwotICAgICAgICBhZGRyID0gYXByX3BzdHJkdXAoY21kLT5wb29sLCBpcHMpOwotICAgIH0KLSAgICAKLSAgICBwb3J0ID0gYXRvaShwb3J0cyk7Ci0gICAgCi0gICAgaWYgKCFwb3J0KSAKLQkgICAgcmV0dXJuICJQb3J0IG11c3QgYmUgbnVtZXJpYyI7Ci0JICAgIAotICAgIGFwcl90YWJsZV9zZXQoc2MtPnNsdGFibGUsIHBvcnRzLCAiVCIpOwotICAgIAotICAgIG5ldy0+bG9jYWxfYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwotICAgIG5ldy0+ZmQgPSAtMTsKLSAgICBuZXctPnVzZWQgPSAwOwotICAgIG5ldy0+bmV4dCA9IGFwX3NlY2xpc3RlbmVyczsKLSAgICBzdHJjcHkobmV3LT5rZXksIGtleSk7Ci0gICAgbmV3LT5tdXR1YWwgPSAobXV0dWFsKSA/IDEgOiAwOwotICAgIG5ldy0+YWRkciA9IGFkZHI7Ci0gICAgbmV3LT5wb3J0ID0gcG9ydDsKLSAgICBhcF9zZWNsaXN0ZW5lcnMgPSBuZXc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBhcHJfc3RhdHVzX3Qgbndzc2xfc29ja2V0X2NsZWFudXAodm9pZCAqZGF0YSkKLXsKLSAgICBhcF9saXN0ZW5fcmVjKiBzbHIgPSAoYXBfbGlzdGVuX3JlYyopZGF0YTsKLSAgICBhcF9saXN0ZW5fcmVjKiBscjsKLQotICAgIC8qIFJlbW92ZSBvdXIgc2VjdXJlIGxpc3RlbmVyIGZyb20gdGhlIGxpc3RlbmVyIGxpc3QgKi8KLSAgICBmb3IgKGxyID0gYXBfbGlzdGVuZXJzOyBscjsgbHIgPSBsci0+bmV4dCkgewotICAgICAgICAvKiBzbHIgaXMgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QgKi8KLSAgICAgICAgaWYgKGxyID09IHNscikgewotICAgICAgICAgICAgYXBfbGlzdGVuZXJzID0gc2xyLT5uZXh0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgLyogc2xyIGlzIHNvbWV3aGVyZSBpbiBiZXR3ZWVuIG9yIGF0IHRoZSBlbmQqLwotICAgICAgICBpZiAobHItPm5leHQgPT0gc2xyKSB7Ci0gICAgICAgICAgICBsci0+bmV4dCA9IHNsci0+bmV4dDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHZvaWQgbndzc2xfcHJlX2NvbmZpZyhhcHJfcG9vbF90ICpwY29uZiwgYXByX3Bvb2xfdCAqcGxvZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBhcHJfcG9vbF90ICpwdGVtcCkKLXsKLSAgICBhcF9zZWNsaXN0ZW5lcnMgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBud3NzbF9wb3N0X2NvbmZpZyhhcHJfcG9vbF90ICpwY29uZiwgYXByX3Bvb2xfdCAqcGxvZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXByX3Bvb2xfdCAqcHRlbXAsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgc2VjbGlzdGVuX3JlYyogc2w7Ci0gICAgYXBfbGlzdGVuX3JlYyogbHI7Ci0gICAgYXByX3NvY2tldF90KiAgc2Q7Ci0gICAgYXByX3N0YXR1c190IHN0YXR1czsKLSAgICAKLSAgICBmb3IgKHNsID0gYXBfc2VjbGlzdGVuZXJzOyBzbCAhPSBOVUxMOyBzbCA9IHNsLT5uZXh0KSB7Ci0gICAgICAgIHNsLT5mZCA9IGZpbmRfc2VjdXJlX2xpc3RlbmVyKHNsKTsKLQotICAgICAgICBpZiAoc2wtPmZkIDwgMCkKLSAgICAgICAgICAgIHNsLT5mZCA9IG1ha2Vfc2VjdXJlX3NvY2tldChwY29uZiwgJnNsLT5sb2NhbF9hZGRyLCBzbC0+a2V5LCBzbC0+bXV0dWFsLCBzKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICBpZiAoc2wtPmZkID49IDApIHsKLSAgICAgICAgICAgIGFwcl9vc19zb2NrX2luZm9fdCBzb2NrX2luZm87Ci0KLSAgICAgICAgICAgIHNvY2tfaW5mby5vc19zb2NrID0gJihzbC0+ZmQpOwotICAgICAgICAgICAgc29ja19pbmZvLmxvY2FsID0gKHN0cnVjdCBzb2NrYWRkciopJihzbC0+bG9jYWxfYWRkcik7Ci0gICAgICAgICAgICBzb2NrX2luZm8ucmVtb3RlID0gTlVMTDsKLSAgICAgICAgICAgIHNvY2tfaW5mby5mYW1pbHkgPSBBUFJfSU5FVDsKLSAgICAgICAgICAgIHNvY2tfaW5mby50eXBlID0gU09DS19TVFJFQU07Ci0KLSAgICAgICAgICAgIGFwcl9vc19zb2NrX21ha2UoJnNkLCAmc29ja19pbmZvLCBwY29uZik7Ci0KLSAgICAgICAgICAgIGxyID0gYXByX3BjYWxsb2MocGNvbmYsIHNpemVvZihhcF9saXN0ZW5fcmVjKSk7Ci0gICAgICAgIAotICAgICAgICAgICAgaWYgKGxyKSB7Ci0JCQkJbHItPnNkID0gc2Q7Ci0gICAgICAgICAgICAgICAgaWYgKChzdGF0dXMgPSBhcHJfc29ja2FkZHJfaW5mb19nZXQoJmxyLT5iaW5kX2FkZHIsIHNsLT5hZGRyLCBBUFJfVU5TUEVDLCBzbC0+cG9ydCwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNvbmYpKSAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgICAgICBhcF9sb2dfcGVycm9yKEFQTE9HX01BUkssIEFQTE9HX0NSSVQsIHN0YXR1cywgcGNvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxsb2NfbGlzdGVuZXI6IGZhaWxlZCB0byBzZXQgdXAgc29ja2FkZHIgZm9yICVzOiVkIiwgc2wtPmFkZHIsIHNsLT5wb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbHItPm5leHQgPSBhcF9saXN0ZW5lcnM7Ci0gICAgICAgICAgICAgICAgYXBfbGlzdGVuZXJzID0gbHI7Ci0gICAgICAgICAgICAgICAgYXByX3Bvb2xfY2xlYW51cF9yZWdpc3RlcihwY29uZiwgbHIsIG53c3NsX3NvY2tldF9jbGVhbnVwLCBhcHJfcG9vbF9jbGVhbnVwX251bGwpOwotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgIH0gCi19Ci0KLXN0YXRpYyB2b2lkICpud3NzbF9jb25maWdfc2VydmVyX2NyZWF0ZShhcHJfcG9vbF90ICpwLCBzZXJ2ZXJfcmVjICpzKQotewotICAgIE5XU1NMU3J2Q29uZmlnUmVjICpuZXcgPSBhcHJfcGFsbG9jKHAsIHNpemVvZihOV1NTTFNydkNvbmZpZ1JlYykpOwotICAgIG5ldy0+c2x0YWJsZSA9IGFwcl90YWJsZV9tYWtlKHAsIDUpOwotICAgIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyB2b2lkICpud3NzbF9jb25maWdfc2VydmVyX21lcmdlKGFwcl9wb29sX3QgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICphZGR2KQotewotICAgIE5XU1NMU3J2Q29uZmlnUmVjICpiYXNlID0gKE5XU1NMU3J2Q29uZmlnUmVjICopYmFzZXY7Ci0gICAgTldTU0xTcnZDb25maWdSZWMgKmFkZCAgPSAoTldTU0xTcnZDb25maWdSZWMgKilhZGR2OwotICAgIE5XU1NMU3J2Q29uZmlnUmVjICptZXJnZWQgID0gKE5XU1NMU3J2Q29uZmlnUmVjICopYXByX3BhbGxvYyhwLCBzaXplb2YoTldTU0xTcnZDb25maWdSZWMpKTsKLSAgICByZXR1cm4gbWVyZ2VkOwotfQotCi1zdGF0aWMgaW50IGlzU2VjdXJlIChjb25zdCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBOV1NTTFNydkNvbmZpZ1JlYyAqc2MgPSBnZXRfbndzc2xfY2ZnKHItPnNlcnZlcik7Ci0gICAgY29uc3QgY2hhciAqc19zZWN1cmUgPSBOVUxMOwotICAgIGNoYXIgcG9ydFs4XTsKLSAgICBpbnQgcmV0ID0gMDsKLQotICAgIGl0b2EoKChyLT5jb25uZWN0aW9uKS0+bG9jYWxfYWRkciktPnBvcnQsIHBvcnQsIDEwKTsKLSAgICBzX3NlY3VyZSA9IGFwcl90YWJsZV9nZXQoc2MtPnNsdGFibGUsIHBvcnQpOyAgICAKLSAgICBpZiAoc19zZWN1cmUpCi0gICAgICAgIHJldCA9IDE7Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG53c3NsX2hvb2tfRml4dXAocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgYXByX3RhYmxlX3QgKmUgPSByLT5zdWJwcm9jZXNzX2VudjsgICAgCi0gICAgaWYgKCFpc1NlY3VyZShyKSkKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotCi0gICAgYXByX3RhYmxlX3NldChlLCAiSFRUUFMiLCAib24iKTsKLSAgICAKLSAgICByZXR1cm4gREVDTElORUQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpud3NzbF9ob29rX2h0dHBfbWV0aG9kIChjb25zdCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpZiAoaXNTZWN1cmUocikpCi0gICAgICAgIHJldHVybiAiaHR0cHMiOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBud3NzbF9tb2R1bGVfY21kc1tdID0KLXsKLSAgICBBUF9JTklUX1RBS0UyMygiU2VjdXJlTGlzdGVuIiwgc2V0X3NlY3VyZV9saXN0ZW5lciwgTlVMTCwgUlNSQ19DT05GLAotICAgICAgInNwZWNpZnkgYW4gYWRkcmVzcyBhbmQvb3IgcG9ydCB3aXRoIGEga2V5IHBhaXIgbmFtZS5cbiIKLSAgICAgICJPcHRpb25hbCB0aGlyZCBwYXJhbWV0ZXIgb2YgTVVUVUFMIGNvbmZpZ3VyZXMgdGhlIHBvcnQgZm9yIG11dHVhbCBhdXRoZW50aWNhdGlvbi4iKSwKLSAgICB7TlVMTH0KLX07Ci0KLXN0YXRpYyB2b2lkIHJlZ2lzdGVyX2hvb2tzKGFwcl9wb29sX3QgKnApCi17Ci0gICAgYXBfaG9va19wcmVfY29uZmlnKG53c3NsX3ByZV9jb25maWcsIE5VTEwsIE5VTEwsIEFQUl9IT09LX01JRERMRSk7Ci0gICAgYXBfaG9va19wb3N0X2NvbmZpZyhud3NzbF9wb3N0X2NvbmZpZywgTlVMTCwgTlVMTCwgQVBSX0hPT0tfTUlERExFKTsKLSAgICBhcF9ob29rX2ZpeHVwcyhud3NzbF9ob29rX0ZpeHVwLCBOVUxMLCBOVUxMLCBBUFJfSE9PS19NSURETEUpOwotICAgIGFwX2hvb2tfaHR0cF9tZXRob2Qobndzc2xfaG9va19odHRwX21ldGhvZCwgICBOVUxMLE5VTEwsIEFQUl9IT09LX01JRERMRSk7Ci19Ci0KLW1vZHVsZSBBUF9NT0RVTEVfREVDTEFSRV9EQVRBIG53c3NsX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpciBjb25maWcgY3JlYXRlciAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXIgbWVyZ2VyIC0tLSBkZWZhdWx0IGlzIHRvIG92ZXJyaWRlICovCi0gICAgbndzc2xfY29uZmlnX3NlcnZlcl9jcmVhdGUsIC8qIHNlcnZlciBjb25maWcgKi8KLSAgICBud3NzbF9jb25maWdfc2VydmVyX21lcmdlLCAgLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLwotICAgIG53c3NsX21vZHVsZV9jbWRzLCAgICAgICAgICAvKiBjb21tYW5kIGFwcl90YWJsZV90ICovCi0gICAgcmVnaXN0ZXJfaG9va3MKLX07Ci0KZGlmZiAtLWdpdCBhL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF9wcm94eS5kZWYgYi9tb2R1bGVzL2FyY2gvbmV0d2FyZS9tb2RfcHJveHkuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTUxZWVkLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF9wcm94eS5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1FWFBPUlQgIHByb3h5X21vZHVsZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9hcmNoL25ldHdhcmUvbW9kX3Jld3JpdGUuZGVmIGIvbW9kdWxlcy9hcmNoL25ldHdhcmUvbW9kX3Jld3JpdGUuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmRjZjZiLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF9yZXdyaXRlLmRlZgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUVYUE9SVCAgcmV3cml0ZV9tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF9zcGVsaW5nLmRlZiBiL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF9zcGVsaW5nLmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q0NWE2YS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2FyY2gvbmV0d2FyZS9tb2Rfc3BlbGluZy5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1FWFBPUlQgIHNwZWxpbmdfbW9kdWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL2FyY2gvbmV0d2FyZS9tb2Rfc3RhdHVzLmRlZiBiL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF9zdGF0dXMuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTVhMzJkLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF9zdGF0dXMuZGVmCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1FWFBPUlQgIHN0YXR1c19tb2R1bGUKLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9hcmNoL25ldHdhcmUvbW9kX3VuaXF1ZV9pZC5kZWYgYi9tb2R1bGVzL2FyY2gvbmV0d2FyZS9tb2RfdW5pcXVlX2lkLmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI3MmMxZS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2FyY2gvbmV0d2FyZS9tb2RfdW5pcXVlX2lkLmRlZgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUVYUE9SVCAgdW5pcXVlX2lkX21vZHVsZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9hcmNoL25ldHdhcmUvbW9kX3VzZXJ0cmFjay5kZWYgYi9tb2R1bGVzL2FyY2gvbmV0d2FyZS9tb2RfdXNlcnRyYWNrLmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI2NGM0MS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2FyY2gvbmV0d2FyZS9tb2RfdXNlcnRyYWNrLmRlZgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUVYUE9SVCAgdXNlcnRyYWNrX21vZHVsZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9hcmNoL25ldHdhcmUvbW9kX3Zob3N0X2FsaWFzLmRlZiBiL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZF92aG9zdF9hbGlhcy5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NGI4NWYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9hcmNoL25ldHdhcmUvbW9kX3Zob3N0X2FsaWFzLmRlZgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotRVhQT1JUICB2aG9zdF9hbGlhc19tb2R1bGUKLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9hcmNoL25ldHdhcmUvbW9kZGF2ZnMuZGVmIGIvbW9kdWxlcy9hcmNoL25ldHdhcmUvbW9kZGF2ZnMuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2VjMzExLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvYXJjaC9uZXR3YXJlL21vZGRhdmZzLmRlZgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUVYUE9SVCBkYXZfZnNfbW9kdWxlIApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9hcmNoL3dpbjMyLy5jdnNpZ25vcmUgYi9tb2R1bGVzL2FyY2gvd2luMzIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRhYzQ1Ni4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2FyY2gvd2luMzIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotRGVidWcKLVJlbGVhc2UKLSoubWFrCi0qLnJjCmRpZmYgLS1naXQgYS9tb2R1bGVzL2FyY2gvd2luMzIvbW9kX2lzYXBpLmMgYi9tb2R1bGVzL2FyY2gvd2luMzIvbW9kX2lzYXBpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMDAyNzAuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9hcmNoL3dpbjMyL21vZF9pc2FwaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTY5ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIG1vZF9pc2FwaS5jIC0gSW50ZXJuZXQgU2VydmVyIEFwcGxpY2F0aW9uIChJU0EpIG1vZHVsZSBmb3IgQXBhY2hlCi0gKiBieSBBbGV4ZWkgS29zdXQgPGFrb3N1dEBhcGFjaGUub3JnPgotICoKLSAqIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgTWljcm9zb2Z0J3MgSVNBUEksIGFsbG93aW5nIEFwYWNoZSAod2hlbiBydW5uaW5nCi0gKiB1bmRlciBXaW5kb3dzKSB0byBsb2FkIEludGVybmV0IFNlcnZlciBBcHBsaWNhdGlvbnMgKElTQVBJIGV4dGVuc2lvbnMpLgotICogSXQgaW1wbGVtZW50cyBhbGwgb2YgdGhlIElTQVBJIDIuMCBzcGVjaWZpY2F0aW9uLCBleGNlcHQgZm9yIHRoZSAKLSAqICJNaWNyb3NvZnQtb25seSIgZXh0ZW5zaW9ucyBkZWFsaW5nIHdpdGggYXN5bmNocm9ub3VzIEkvTy4gQWxsIElTQVBJCi0gKiBleHRlbnNpb25zIHRoYXQgdXNlIG9ubHkgc3luY2hyb25vdXMgSS9PIGFuZCBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZQotICogSVNBUEkgMi4wIHNwZWNpZmljYXRpb24gc2hvdWxkIHdvcmsgKG1vc3QgSVNBUEkgMS4wIGV4dGVuc2lvbnMgc2hvdWxkCi0gKiBmdW5jdGlvbiBhcyB3ZWxsKS4KLSAqCi0gKiBUbyBsb2FkLCBzaW1wbHkgcGxhY2UgdGhlIElTQSBpbiBhIGxvY2F0aW9uIGluIHRoZSBkb2N1bWVudCB0cmVlLgotICogVGhlbiBhZGQgYW4gIkFkZEhhbmRsZXIgaXNhcGktaXNhIGRsbCIgaW50byB5b3VyIGNvbmZpZyBmaWxlLgotICogWW91IHNob3VsZCBub3cgYmUgYWJsZSB0byBsb2FkIElTQVBJIERMTHMganVzdCBiZSByZWZmZXJpbmcgdG8gdGhlaXIKLSAqIFVSTHMuIE1ha2Ugc3VyZSB0aGUgRXhlY0NHSSBvcHRpb24gaXMgYWN0aXZlIGluIHRoZSBkaXJlY3RvcnkKLSAqIHRoZSBJU0EgaXMgaW4uCi0gKi8KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJ1dGlsX3NjcmlwdC5oIgotCi0vKiBXZSB1c2UgdGhlIGV4YWN0IHNhbWUgaGVhZGVyIGZpbGUgYXMgdGhlIG9yaWdpbmFsICovCi0jaW5jbHVkZSA8SHR0cEV4dC5oPgotCi0vKiBTZWVtcyBJSVMgZG9lcyBub3QgZW5mb3JjZSB0aGUgcmVxdWlyZW1lbnQgZm9yIFxyXG4gdGVybWluYXRpb24gb24gSFNFX1JFUV9TRU5EX1JFU1BPTlNFX0hFQURFUiwKLSAgIGRlZmluZSB0aGlzIHRvIGNvbmZvcm0gKi8KLSNkZWZpbmUgUkVMQVhfSEVBREVSX1JVTEUKLQotbW9kdWxlIGlzYXBpX21vZHVsZTsKLQotLyogT3VyICJDb25uZWN0aW9uIElEIiBzdHJ1Y3R1cmUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIExQRVhURU5TSU9OX0NPTlRST0xfQkxPQ0sgZWNiOwotICAgIHJlcXVlc3RfcmVjICpyOwotICAgIGludCBzdGF0dXM7Ci19IGlzYXBpX2NpZDsKLQotLyogRGVjbGFyZSB0aGUgSVNBUEkgZnVuY3Rpb25zICovCi0KLUJPT0wgV0lOQVBJIEdldFNlcnZlclZhcmlhYmxlIChIQ09OTiBoQ29ubiwgTFBTVFIgbHBzelZhcmlhYmxlTmFtZSwKLQkJCSAgICAgICBMUFZPSUQgbHB2QnVmZmVyLCBMUERXT1JEIGxwZHdTaXplb2ZCdWZmZXIpOwotQk9PTCBXSU5BUEkgV3JpdGVDbGllbnQgKEhDT05OIENvbm5JRCwgTFBWT0lEIEJ1ZmZlciwgTFBEV09SRCBscHdkd0J5dGVzLAotCQkJIERXT1JEIGR3UmVzZXJ2ZWQpOwotQk9PTCBXSU5BUEkgUmVhZENsaWVudCAoSENPTk4gQ29ubklELCBMUFZPSUQgbHB2QnVmZmVyLCBMUERXT1JEIGxwZHdTaXplKTsKLUJPT0wgV0lOQVBJIFNlcnZlclN1cHBvcnRGdW5jdGlvbiAoSENPTk4gaENvbm4sIERXT1JEIGR3SFNFUmVxdWVzdCwKLQkJCQkgICBMUFZPSUQgbHB2QnVmZmVyLCBMUERXT1JEIGxwZHdTaXplLAotCQkJCSAgIExQRFdPUkQgbHBkd0RhdGFUeXBlKTsKLQotLyoKLSAgICBUaGUgb3B0aW1pc2VyIGJsb3dzIGl0IHRvdGFsbHkgaGVyZS4gV2hhdCBoYXBwZW5zIGlzIHRoYXQgYXV0b3MgYXJlIGFkZHJlc3NlZCByZWxhdGl2ZSB0byB0aGUKLSAgICBzdGFjayBwb2ludGVyLCB3aGljaCwgb2YgY291cnNlLCBtb3ZlcyBhcm91bmQuIFRoZSBvcHRpbWlzZXIgc2VlbXMgdG8gbG9zZSB0cmFjayBvZiBpdCBzb21ld2hlcmUKLSAgICBiZXR3ZWVuIHNldHRpbmcgaXNhcGlfZW50cnkgYW5kIGNhbGxpbmcgdGhyb3VnaCBpdC4gV2Ugd29yayBhcm91bmQgdGhlIHByb2JsZW0gYnkgZm9yY2luZyBpdCB0bwotICAgIHVzZSBmcmFtZSBwb2ludGVycy4KLSovCi0jcHJhZ21hIG9wdGltaXplKCJ5IixvZmYpCi0KLWludCBpc2FwaV9oYW5kbGVyIChyZXF1ZXN0X3JlYyAqcikgewotICAgIExQRVhURU5TSU9OX0NPTlRST0xfQkxPQ0sgZWNiID0KLQlhcF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihzdHJ1Y3QgX0VYVEVOU0lPTl9DT05UUk9MX0JMT0NLKSk7Ci0gICAgSFNFX1ZFUlNJT05fSU5GTyAqcFZlciA9IGFwX3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKEhTRV9WRVJTSU9OX0lORk8pKTsKLQotICAgIEhJTlNUQU5DRSBpc2FwaV9oYW5kbGU7Ci0gICAgQk9PTCAoKmlzYXBpX3ZlcnNpb24pKEhTRV9WRVJTSU9OX0lORk8gKik7IC8qIGVudHJ5IHBvaW50IDEgKi8KLSAgICBEV09SRCAoKmlzYXBpX2VudHJ5KShMUEVYVEVOU0lPTl9DT05UUk9MX0JMT0NLKTsgLyogZW50cnkgcG9pbnQgMiAqLwotICAgIEJPT0wgKCppc2FwaV90ZXJtKShEV09SRCk7IC8qIG9wdGlvbmFsIGVudHJ5IHBvaW50IDMgKi8KLQotICAgIGlzYXBpX2NpZCAqY2lkID0gYXBfcGNhbGxvYyhyLT5wb29sLCBzaXplb2YoaXNhcGlfY2lkKSk7Ci0gICAgdGFibGUgKmUgPSByLT5zdWJwcm9jZXNzX2VudjsKLSAgICBpbnQgcmV0dmFsOwotCi0gICAgLyogVXNlIHNpbWlsYXIgcmVzdHJpY3Rpb25zIGFzIENHSXMgKi8KLQotICAgIGlmICghKGFwX2FsbG93X29wdGlvbnMocikgJiBPUFRfRVhFQ0NHSSkpCi0JcmV0dXJuIEZPUkJJRERFTjsKLQotICAgIGlmIChyLT5maW5mby5zdF9tb2RlID09IDApCi0JcmV0dXJuIE5PVF9GT1VORDsKLQotICAgIGlmIChTX0lTRElSKHItPmZpbmZvLnN0X21vZGUpKQotCXJldHVybiBGT1JCSURERU47Ci0KLSAgICAvKiBMb2FkIHRoZSBtb2R1bGUgKi8KLQotICAgIGlmICghKGlzYXBpX2hhbmRsZSA9IExvYWRMaWJyYXJ5RXgoci0+ZmlsZW5hbWUsIE5VTEwsCi0JCQkJICAgICAgIExPQURfV0lUSF9BTFRFUkVEX1NFQVJDSF9QQVRIKSkpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0FMRVJULCByLAotCQkgICAgIkNvdWxkIG5vdCBsb2FkIERMTDogJXMiLCByLT5maWxlbmFtZSk7Ci0JcmV0dXJuIFNFUlZFUl9FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAoIShpc2FwaV92ZXJzaW9uID0KLQkgICh2b2lkICopKEdldFByb2NBZGRyZXNzKGlzYXBpX2hhbmRsZSwgIkdldEV4dGVuc2lvblZlcnNpb24iKSkpKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgciwKLQkJICAgICJETEwgY291bGQgbm90IGxvYWQgR2V0RXh0ZW5zaW9uVmVyc2lvbigpOiAlcyIsIHItPmZpbGVuYW1lKTsKLQlGcmVlTGlicmFyeShpc2FwaV9oYW5kbGUpOwotCXJldHVybiBTRVJWRVJfRVJST1I7Ci0gICAgfQotCi0gICAgaWYgKCEoaXNhcGlfZW50cnkgPQotCSAgKHZvaWQgKikoR2V0UHJvY0FkZHJlc3MoaXNhcGlfaGFuZGxlLCAiSHR0cEV4dGVuc2lvblByb2MiKSkpKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgciwKLQkJICAgICJETEwgY291bGQgbm90IGxvYWQgSHR0cEV4dGVuc2lvblByb2MoKTogJXMiLCByLT5maWxlbmFtZSk7Ci0JRnJlZUxpYnJhcnkoaXNhcGlfaGFuZGxlKTsKLQlyZXR1cm4gU0VSVkVSX0VSUk9SOwotICAgIH0KLQotICAgIGlzYXBpX3Rlcm0gPSAodm9pZCAqKShHZXRQcm9jQWRkcmVzcyhpc2FwaV9oYW5kbGUsICJUZXJtaW5hdGVFeHRlbnNpb24iKSk7Ci0KLSAgICAvKiBSdW4gR2V0RXh0ZW5zaW9uVmVyc2lvbigpICovCi0KLSAgICBpZiAoKCppc2FwaV92ZXJzaW9uKShwVmVyKSAhPSBUUlVFKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgciwKLQkJICAgICJJU0FQSSBHZXRFeHRlbnNpb25WZXJzaW9uKCkgZmFpbGVkOiAlcyIsIHItPmZpbGVuYW1lKTsKLQlGcmVlTGlicmFyeShpc2FwaV9oYW5kbGUpOwotCXJldHVybiBTRVJWRVJfRVJST1I7Ci0gICAgfQotCi0gICAgLyogU2V0IHVwIHZhcmlhYmxlcyAqLwotICAgIGFwX2FkZF9jb21tb25fdmFycyhyKTsKLSAgICBhcF9hZGRfY2dpX3ZhcnMocik7Ci0KLSAgICAvKiBTZXQgdXAgY29ubmVjdGlvbiBJRCAqLwotICAgIGVjYi0+Q29ubklEID0gKEhDT05OKWNpZDsKLSAgICBjaWQtPmVjYiA9IGVjYjsKLSAgICBjaWQtPnIgPSByOwotICAgIGNpZC0+c3RhdHVzID0gMDsKLQotICAgIGVjYi0+Y2JTaXplID0gc2l6ZW9mKHN0cnVjdCBfRVhURU5TSU9OX0NPTlRST0xfQkxPQ0spOwotICAgIGVjYi0+ZHdWZXJzaW9uID0gTUFLRUxPTkcoMCwgMik7Ci0gICAgZWNiLT5kd0h0dHBTdGF0dXNDb2RlID0gMDsKLSAgICBzdHJjcHkoZWNiLT5scHN6TG9nRGF0YSwgIiIpOwotICAgIGVjYi0+bHBzek1ldGhvZCA9IHItPm1ldGhvZDsKLSAgICBlY2ItPmxwc3pRdWVyeVN0cmluZyA9IGFwX3RhYmxlX2dldChlLCAiUVVFUllfU1RSSU5HIik7Ci0gICAgZWNiLT5scHN6UGF0aEluZm8gPSBhcF90YWJsZV9nZXQoZSwgIlBBVEhfSU5GTyIpOwotICAgIGVjYi0+bHBzelBhdGhUcmFuc2xhdGVkID0gYXBfdGFibGVfZ2V0KGUsICJQQVRIX1RSQU5TTEFURUQiKTsKLSAgICBlY2ItPmxwc3pDb250ZW50VHlwZSA9IGFwX3RhYmxlX2dldChlLCAiQ09OVEVOVF9UWVBFIik7Ci0KLSAgICAvKiBTZXQgdXAgY2xpZW50IGlucHV0ICovCi0gICAgaWYgKChyZXR2YWwgPSBhcF9zZXR1cF9jbGllbnRfYmxvY2sociwgUkVRVUVTVF9DSFVOS0VEX0VSUk9SKSkpIHsKLQlpZiAoaXNhcGlfdGVybSkgKCppc2FwaV90ZXJtKShIU0VfVEVSTV9NVVNUX1VOTE9BRCk7Ci0JRnJlZUxpYnJhcnkoaXNhcGlfaGFuZGxlKTsKLQlyZXR1cm4gcmV0dmFsOwotICAgIH0KLQotICAgIGlmIChhcF9zaG91bGRfY2xpZW50X2Jsb2NrKHIpKSB7Ci0JLyogVW5saWtlIElJUywgd2hpY2ggbGltaXRzIHRoaXMgdG8gNDhrLCB3ZSByZWFkIHRoZSB3aG9sZQotCSAqIHN1Y2tlciBpbi4gSSBzdXBwb3NlIHRoaXMgY291bGQgYmUgYmFkIGZvciBtZW1vcnkgaWYgc29tZW9uZQotCSAqIHVwbG9hZGVkIHRoZSBjb21wbGV0ZSB3b3JrcyBvZiBTaGFrZXNwZWFyZS4gV2VsbCwgV2ViU2l0ZQotCSAqIGRvZXMgdGhlIHNhbWUgdGhpbmcuCi0JICovCi0JbG9uZyB0b19yZWFkID0gYXRvbChhcF90YWJsZV9nZXQoZSwgIkNPTlRFTlRfTEVOR1RIIikpOwotCWxvbmcgcmVhZDsKLQotCS8qIEFjdHVhbGx5LCBsZXQncyBjYXAgaXQgYXQgNDhrLCB1bnRpbCB3ZSBmaWd1cmUgb3V0IHdoYXQKLQkgKiB0byBkbyB3aXRoIHRoaXMuLi4gd2UgZG9uJ3Qgd2FudCBhIENvbnRlbnQtTGVuZ3RoOiAxMDAwMDAwMDAwCi0JICogdGFraW5nIG91dCB0aGUgbWFjaGluZS4KLQkgKi8KLQotCWlmICh0b19yZWFkID4gNDkxNTIpIHsKLQkgICAgaWYgKGlzYXBpX3Rlcm0pICgqaXNhcGlfdGVybSkoSFNFX1RFUk1fTVVTVF9VTkxPQUQpOwotCSAgICBGcmVlTGlicmFyeShpc2FwaV9oYW5kbGUpOwotCSAgICByZXR1cm4gSFRUUF9SRVFVRVNUX0VOVElUWV9UT09fTEFSR0U7Ci0JfQotCi0JZWNiLT5scGJEYXRhID0gYXBfcGNhbGxvYyhyLT5wb29sLCAxICsgdG9fcmVhZCk7Ci0KLQlpZiAoKHJlYWQgPSBhcF9nZXRfY2xpZW50X2Jsb2NrKHIsIGVjYi0+bHBiRGF0YSwgdG9fcmVhZCkpIDwgMCkgewotCSAgICBpZiAoaXNhcGlfdGVybSkgKCppc2FwaV90ZXJtKShIU0VfVEVSTV9NVVNUX1VOTE9BRCk7Ci0JICAgIEZyZWVMaWJyYXJ5KGlzYXBpX2hhbmRsZSk7Ci0JICAgIHJldHVybiBTRVJWRVJfRVJST1I7Ci0JfQotCi0JLyogQWx0aG91Z2ggaXRzIG5vdCB0byBzcGVjLCBJSVMgc2VlbXMgdG8gbnVsbC10ZXJtaW5hdGUKLQkgKiBpdHMgbHBkRGF0YSBzdHJpbmcuIFNvIHdlIHdpbGwgdG9vLiBUbyBtYWtlIHN1cmUKLQkgKiBjYkF2YWlsYWJsZSBtYXRjaGVzIGNiVG90YWxCeXRlcywgd2UnbGwgdXAgdGhlIGxhdHRlcgotCSAqIGFuZCBlcXVhbGl6ZSB0aGVtLgotCSAqLwotCWVjYi0+Y2JBdmFpbGFibGUgPSBlY2ItPmNiVG90YWxCeXRlcyA9IHJlYWQgKyAxOwotCWVjYi0+bHBiRGF0YVtyZWFkXSA9ICdcMCc7Ci0JfQotICAgIGVsc2UgewotCWVjYi0+Y2JUb3RhbEJ5dGVzID0gMDsKLQllY2ItPmNiQXZhaWxhYmxlID0gMDsKLQllY2ItPmxwYkRhdGEgPSBOVUxMOwotICAgIH0KLQotICAgIC8qIFNldCB1cCB0aGUgY2FsbGJhY2tzICovCi0KLSAgICBlY2ItPkdldFNlcnZlclZhcmlhYmxlID0gJkdldFNlcnZlclZhcmlhYmxlOwotICAgIGVjYi0+V3JpdGVDbGllbnQgPSAmV3JpdGVDbGllbnQ7Ci0gICAgZWNiLT5SZWFkQ2xpZW50ID0gJlJlYWRDbGllbnQ7Ci0gICAgZWNiLT5TZXJ2ZXJTdXBwb3J0RnVuY3Rpb24gPSAmU2VydmVyU3VwcG9ydEZ1bmN0aW9uOwotCi0gICAgLyogQWxsIHJpZ2h0Li4uIHRyeSBhbmQgbG9hZCB0aGUgc3Vja2VyICovCi0gICAgcmV0dmFsID0gKCppc2FwaV9lbnRyeSkoZWNiKTsKLQotICAgIC8qIFNldCB0aGUgc3RhdHVzIChmb3IgbG9nZ2luZykgKi8KLSAgICBpZiAoZWNiLT5kd0h0dHBTdGF0dXNDb2RlKQotCXItPnN0YXR1cyA9IGVjYi0+ZHdIdHRwU3RhdHVzQ29kZTsKLQotICAgIC8qIENoZWNrIGZvciBhIGxvZyBtZXNzYWdlIC0gYW5kIGxvZyBpdCAqLwotICAgIGlmIChlY2ItPmxwc3pMb2dEYXRhICYmIHN0cmNtcChlY2ItPmxwc3pMb2dEYXRhLCAiIikpCi0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsCi0JCSAgICAiJXM6ICVzIiwgZWNiLT5scHN6TG9nRGF0YSwgci0+ZmlsZW5hbWUpOwotCi0gICAgLyogQWxsIGRvbmUgd2l0aCB0aGUgRExMLi4uIGdldCByaWQgb2YgaXQgKi8KLSAgICBpZiAoaXNhcGlfdGVybSkgKCppc2FwaV90ZXJtKShIU0VfVEVSTV9NVVNUX1VOTE9BRCk7Ci0gICAgRnJlZUxpYnJhcnkoaXNhcGlfaGFuZGxlKTsKLQotICAgIHN3aXRjaChyZXR2YWwpIHsKLSAgICBjYXNlIEhTRV9TVEFUVVNfU1VDQ0VTUzoKLSAgICBjYXNlIEhTRV9TVEFUVVNfU1VDQ0VTU19BTkRfS0VFUF9DT05OOgotCS8qIElnbm9yZSB0aGUga2VlcGFsaXZlIHN0dWZmOyBBcGFjaGUgaGFuZGxlcyBpdCBqdXN0IGZpbmUgd2l0aG91dAotCSAqIHRoZSBJU0EncyAiYWR2aWNlIi4KLQkgKi8KLQotCWlmIChjaWQtPnN0YXR1cykgLyogV2UgaGF2ZSBhIHNwZWNpYWwgc3RhdHVzIHRvIHJldHVybiAqLwotCSAgICByZXR1cm4gY2lkLT5zdGF0dXM7Ci0KLQlyZXR1cm4gT0s7Ci0gICAgY2FzZSBIU0VfU1RBVFVTX1BFTkRJTkc6CS8qIFdlIGRvbid0IHN1cHBvcnQgdGhpcyAqLwotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgciwKLQkJICAgICJJU0FQSSBhc3luY2hyb25vdXMgSS9PIG5vdCBzdXBwb3J0ZWQ6ICVzIiwgci0+ZmlsZW5hbWUpOwotICAgIGNhc2UgSFNFX1NUQVRVU19FUlJPUjoKLSAgICBkZWZhdWx0OgotCXJldHVybiBTRVJWRVJfRVJST1I7Ci0gICAgfQotCi19Ci0jcHJhZ21hIG9wdGltaXplKCIiLG9uKQotCi1CT09MIFdJTkFQSSBHZXRTZXJ2ZXJWYXJpYWJsZSAoSENPTk4gaENvbm4sIExQU1RSIGxwc3pWYXJpYWJsZU5hbWUsCi0JCQkgICAgICAgTFBWT0lEIGxwdkJ1ZmZlciwgTFBEV09SRCBscGR3U2l6ZW9mQnVmZmVyKSB7Ci0gICAgcmVxdWVzdF9yZWMgKnIgPSAoKGlzYXBpX2NpZCAqKWhDb25uKS0+cjsKLSAgICB0YWJsZSAqZSA9IHItPnN1YnByb2Nlc3NfZW52OwotICAgIGNvbnN0IGNoYXIgKnJlc3VsdDsKLSAgICAKLSAgICAvKiBNb3N0bHksIHdlIGp1c3QgZ3JhYiBpdCBmcm9tIHRoZSBlbnZpcm9ubWVudCwgYnV0IHRoZXJlIGFyZQotICAgICAqIGEgY291cGxlIG9mIHNwZWNpYWwgY2FzZXMKLSAgICAgKi8KLQotICAgIGlmICghc3RyY2FzZWNtcChscHN6VmFyaWFibGVOYW1lLCAiVU5NQVBQRURfUkVNT1RFX1VTRVIiKSkgewotCS8qIFdlIGRvbid0IHN1cHBvcnQgTlQgdXNlcnMsIHNvIHRoaXMgaXMgYWx3YXlzIHRoZSBzYW1lIGFzCi0JICogUkVNT1RFX1VTRVIKLQkgKi8KLQlyZXN1bHQgPSBhcF90YWJsZV9nZXQoZSwgIlJFTU9URV9VU0VSIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGxwc3pWYXJpYWJsZU5hbWUsICJTRVJWRVJfUE9SVF9TRUNVUkUiKSkgewotCS8qIEFwYWNoZSBkb2Vzbid0IHN1cHBvcnQgc2VjdXJlIHJlcXVlc3RzIGluaGVyZW50bHksIHNvCi0JICogd2UgaGF2ZSBubyB3YXkgb2Yga25vd2luZy4gV2UnbGwgYmUgY29uc2VydmF0aXZlLCBhbmQgc2F5Ci0JICogYWxsIHJlcXVlc3RzIGFyZSBpbnNlY3VyZS4KLQkgKi8KLQlyZXN1bHQgPSAiMCI7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGxwc3pWYXJpYWJsZU5hbWUsICJVUkwiKSkgewotCXJlc3VsdCA9IHItPnVyaTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JcmVzdWx0ID0gYXBfdGFibGVfZ2V0KGUsIGxwc3pWYXJpYWJsZU5hbWUpOwotICAgIH0KLQotICAgIGlmIChyZXN1bHQpIHsKLQlpZiAoc3RybGVuKHJlc3VsdCkgPiAqbHBkd1NpemVvZkJ1ZmZlcikgewotCSAgICAqbHBkd1NpemVvZkJ1ZmZlciA9IHN0cmxlbihyZXN1bHQpOwotCSAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7Ci0JICAgIHJldHVybiBGQUxTRTsKLQl9Ci0Jc3RybmNweShscHZCdWZmZXIsIHJlc3VsdCwgKmxwZHdTaXplb2ZCdWZmZXIpOwotCXJldHVybiBUUlVFOwotICAgIH0KLQotICAgIC8qIERpZG4ndCBmaW5kIGl0ICovCi0gICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfSU5ERVgpOwotICAgIHJldHVybiBGQUxTRTsKLX0KLQotQk9PTCBXSU5BUEkgV3JpdGVDbGllbnQgKEhDT05OIENvbm5JRCwgTFBWT0lEIEJ1ZmZlciwgTFBEV09SRCBscHdkd0J5dGVzLAotCQkJIERXT1JEIGR3UmVzZXJ2ZWQpIHsKLSAgICByZXF1ZXN0X3JlYyAqciA9ICgoaXNhcGlfY2lkICopQ29ubklEKS0+cjsKLSAgICBpbnQgd3JpdDsJLyogd3JpdHRlbiwgYWN0dWFsbHksIGJ1dCB3aHkgc2hvdWxkbid0IEkgbWFrZSB1cCB3b3Jkcz8gKi8KLQotICAgIC8qIFdlIG9ubHkgc3VwcG9ydCBzeW5jaHJvbm91cyB3cml0aW5nICovCi0gICAgaWYgKGR3UmVzZXJ2ZWQgJiYgZHdSZXNlcnZlZCAhPSBIU0VfSU9fU1lOQykgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgciwKLQkJICAgICJJU0FQSSBhc3luY2hyb25vdXMgSS9PIG5vdCBzdXBwb3J0ZWQ6ICVzIiwgci0+ZmlsZW5hbWUpOwotCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7Ci0JcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIGlmICgod3JpdCA9IGFwX3J3cml0ZShCdWZmZXIsICpscHdkd0J5dGVzLCByKSkgPT0gRU9GKSB7Ci0JU2V0TGFzdEVycm9yKEVSUk9SKTsgLyogWFhYOiBGaW5kIHRoZSByaWdodCBlcnJvciBjb2RlICovCi0JcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgIAotICAgICpscHdkd0J5dGVzID0gd3JpdDsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotQk9PTCBXSU5BUEkgUmVhZENsaWVudCAoSENPTk4gQ29ubklELCBMUFZPSUQgbHB2QnVmZmVyLCBMUERXT1JEIGxwZHdTaXplKSB7Ci0gICAgLyogRG9lc24ndCBuZWVkIHRvIGRvIGFueXRoaW5nOyB3ZSd2ZSByZWFkIGFsbCB0aGUgZGF0YSBhbHJlYWR5ICovCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qIFhYWDogVGhlcmUgaXMgYW4gTyhuXjIpIGF0dGFjayBwb3NzaWJsZSBoZXJlLiAqLwotQk9PTCBXSU5BUEkgU2VydmVyU3VwcG9ydEZ1bmN0aW9uIChIQ09OTiBoQ29ubiwgRFdPUkQgZHdIU0VSZXF1ZXN0LAotCQkJCSAgIExQVk9JRCBscHZCdWZmZXIsIExQRFdPUkQgbHBkd1NpemUsCi0JCQkJICAgTFBEV09SRCBscGR3RGF0YVR5cGUpIHsKLSAgICBpc2FwaV9jaWQgKmNpZCA9IChpc2FwaV9jaWQgKiloQ29ubjsKLSAgICByZXF1ZXN0X3JlYyAqc3VicmVxLCAqciA9IGNpZC0+cjsKLSAgICBjaGFyICpkYXRhOwotCi0gICAgc3dpdGNoIChkd0hTRVJlcXVlc3QpIHsKLSAgICBjYXNlIEhTRV9SRVFfU0VORF9VUkxfUkVESVJFQ1RfUkVTUDoKLQkvKiBTZXQgdGhlIHN0YXR1cyB0byBiZSByZXR1cm5lZCB3aGVuIHRoZSBIdHRwRXh0ZW5zaW9uUHJvYygpCi0JICogaXMgZG9uZS4KLQkgKi8KLQlhcF90YWJsZV9zZXQgKHItPmhlYWRlcnNfb3V0LCAiTG9jYXRpb24iLCBscHZCdWZmZXIpOwotCWNpZC0+c3RhdHVzID0gY2lkLT5yLT5zdGF0dXMgPSBjaWQtPmVjYi0+ZHdIdHRwU3RhdHVzQ29kZSA9IFJFRElSRUNUOwotCXJldHVybiBUUlVFOwotCi0gICAgY2FzZSBIU0VfUkVRX1NFTkRfVVJMOgotCS8qIFJlYWQgYW55IGFkZGl0aW9uYWwgaW5wdXQgKi8KLQotCWlmIChyLT5yZW1haW5pbmcgPiAwKSB7Ci0JICAgIGNoYXIgYXJnc2J1ZmZlcltIVUdFX1NUUklOR19MRU5dOwotCi0JICAgIHdoaWxlIChhcF9nZXRfY2xpZW50X2Jsb2NrKHIsIGFyZ3NidWZmZXIsIEhVR0VfU1RSSU5HX0xFTikpOwotCX0KLQkKLQkvKiBSZXNldCB0aGUgbWV0aG9kIHRvIEdFVCAqLwotCXItPm1ldGhvZCA9IGFwX3BzdHJkdXAoci0+cG9vbCwgIkdFVCIpOwotCXItPm1ldGhvZF9udW1iZXIgPSBNX0dFVDsKLQotCS8qIERvbid0IGxldCBhbnlvbmUgdGhpbmsgdGhlcmUncyBzdGlsbCBkYXRhICovCi0JYXBfdGFibGVfdW5zZXQoci0+aGVhZGVyc19pbiwgIkNvbnRlbnQtTGVuZ3RoIik7Ci0JCi0JYXBfaW50ZXJuYWxfcmVkaXJlY3QoKGNoYXIgKilscHZCdWZmZXIsIHIpOwkKLQlyZXR1cm4gVFJVRTsKLQotICAgIGNhc2UgSFNFX1JFUV9TRU5EX1JFU1BPTlNFX0hFQURFUjoKLQlyLT5zdGF0dXNfbGluZSA9IGxwdkJ1ZmZlciA/IGxwdkJ1ZmZlciA6IGFwX3BzdHJkdXAoci0+cG9vbCwgIjIwMCBPSyIpOwotCXNzY2FuZihyLT5zdGF0dXNfbGluZSwgIiVkIiwgJnItPnN0YXR1cyk7Ci0JY2lkLT5lY2ItPmR3SHR0cFN0YXR1c0NvZGUgPSByLT5zdGF0dXM7Ci0KLQkvKiBOb3cgZmlsbCBpbiB0aGUgSFRUUCBoZWFkZXJzLCBhbmQgdGhlIHJlc3Qgb2YgaXQuIEljay4KLQkgKiBscGR3RGF0YVR5cGUgY29udGFpbnMgYSBzdHJpbmcgdGhhdCBoYXMgaGVhZGVycyAoaW4gTUlNRQotCSAqIGZvcm1hdCksIGEgYmxhbmsgbGlrZSwgdGhlbiAocG9zc2libHkpIGRhdGEuIFdlIG5lZWQKLQkgKiB0byBwYXJzZSBpdC4KLQkgKgotCSAqIEVhc3kgY2FzZSBmaXJzdDoKLQkgKi8KLQlpZiAoIWxwZHdEYXRhVHlwZSkgewotCSAgICBhcF9zZW5kX2h0dHBfaGVhZGVyKHIpOwotCSAgICByZXR1cm4gVFJVRTsKLQl9Ci0KLQkvKiBNYWtlIGEgY29weSAtIGRvbid0IGRpc3R1cmIgdGhlIG9yaWdpbmFsICovCi0JZGF0YSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgKGNoYXIgKilscGR3RGF0YVR5cGUpOwotCi0JLyogV2UgKnNob3VsZCogYnJlYWsgYmVmb3JlIHRoaXMgd2hpbGUgbG9vcCBlbmRzICovCi0Jd2hpbGUgKCpkYXRhKSB7Ci0JICAgIGNoYXIgKnZhbHVlLCAqbGYgPSBzdHJjaHIoZGF0YSwgJ1xuJyk7Ci0JICAgIGludCBwOwotCi0jaWZkZWYgUkVMQVhfSEVBREVSX1JVTEUKLQkgICAgaWYgKGxmKQotCQkqbGYgPSAnXDAnOwotI2Vsc2UKLQkgICAgaWYgKCFsZikgeyAvKiBIdWg/IEludmFsaWQgZGF0YSwgSSB0aGluayAqLwotCQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgciwKLQkJCSAgICAiSVNBIHNlbnQgaW52YWxpZCBoZWFkZXJzOiAlcyIsIHItPmZpbGVuYW1lKTsKLQkJU2V0TGFzdEVycm9yKEVSUk9SKTsJLyogWFhYOiBGaW5kIHJpZ2h0IGVycm9yICovCi0JCXJldHVybiBGQUxTRTsKLQkgICAgfQotCi0JICAgIC8qIEdldCByaWQgb2YgXG4gYW5kIFxyICovCi0JICAgICpsZiA9ICdcMCc7Ci0jZW5kaWYKLQkgICAgcCA9IHN0cmxlbihkYXRhKTsKLQkgICAgaWYgKHAgPiAwICYmIGRhdGFbcC0xXSA9PSAnXHInKSBkYXRhW3AtMV0gPSAnXDAnOwotCSAgICAKLQkgICAgLyogRW5kIG9mIGhlYWRlcnMgKi8KLQkgICAgaWYgKCpkYXRhID09ICdcMCcpIHsKLSNpZmRlZiBSRUxBWF9IRUFERVJfUlVMRQotCQlpZiAobGYpCi0jZW5kaWYKLQkJICAgIGRhdGEgPSBsZiArIDE7CS8qIFJlc2V0IGRhdGEgKi8KLQkJYnJlYWs7Ci0JICAgIH0KLQotCSAgICBpZiAoISh2YWx1ZSA9IHN0cmNocihkYXRhLCAnOicpKSkgewotCQlTZXRMYXN0RXJyb3IoRVJST1IpOwkvKiBYWFg6IEZpbmQgcmlnaHQgZXJyb3IgKi8KLQkJYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsCi0JCQkgICAgIklTQSBzZW50IGludmFsaWQgaGVhZGVycyIsIHItPmZpbGVuYW1lKTsKLQkJcmV0dXJuIEZBTFNFOwotCSAgICB9Ci0KLQkgICAgKnZhbHVlKysgPSAnXDAnOwotCSAgICB3aGlsZSAoKnZhbHVlICYmIGFwX2lzc3BhY2UoKnZhbHVlKSkgKyt2YWx1ZTsKLQotCSAgICAvKiBDaGVjayBhbGwgdGhlIHNwZWNpYWwtY2FzZSBoZWFkZXJzLiBTaW1pbGFyIHRvIHdoYXQKLQkgICAgICogYXBfc2Nhbl9zY3JpcHRfaGVhZGVyX2VycigpIGRvZXMgKHNlZSB0aGF0IGZ1bmN0aW9uIGZvcgotCSAgICAgKiBtb3JlIGRldGFpbCkKLQkgICAgICovCi0KLQkgICAgaWYgKCFzdHJjYXNlY21wKGRhdGEsICJDb250ZW50LVR5cGUiKSkgewotCQljaGFyICp0bXA7Ci0JCS8qIE51a2UgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLwotCQkKLQkJY2hhciAqZW5kcCA9IHZhbHVlICsgc3RybGVuKHZhbHVlKSAtIDE7Ci0JCXdoaWxlIChlbmRwID4gdmFsdWUgJiYgYXBfaXNzcGFjZSgqZW5kcCkpICplbmRwLS0gPSAnXDAnOwotICAgICAgICAgICAgCi0JCXRtcCA9IGFwX3BzdHJkdXAgKHItPnBvb2wsIHZhbHVlKTsKLQkJYXBfc3RyX3RvbG93ZXIodG1wKTsKLQkJci0+Y29udGVudF90eXBlID0gdG1wOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGRhdGEsICJDb250ZW50LUxlbmd0aCIpKSB7Ci0JCWFwX3RhYmxlX3NldChyLT5oZWFkZXJzX291dCwgZGF0YSwgdmFsdWUpOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGRhdGEsICJUcmFuc2Zlci1FbmNvZGluZyIpKSB7Ci0JCWFwX3RhYmxlX3NldChyLT5oZWFkZXJzX291dCwgZGF0YSwgdmFsdWUpOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGRhdGEsICJTZXQtQ29va2llIikpIHsKLQkJYXBfdGFibGVfYWRkKHItPmVycl9oZWFkZXJzX291dCwgZGF0YSwgdmFsdWUpOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQlhcF90YWJsZV9tZXJnZShyLT5lcnJfaGVhZGVyc19vdXQsIGRhdGEsIHZhbHVlKTsKLQkgICAgfQotCSAgCi0JICAgIC8qIFJlc2V0IGRhdGEgKi8KLSNpZmRlZiBSRUxBWF9IRUFERVJfUlVMRQotCSAgICBpZiAoIWxmKSB7Ci0JCWRhdGEgKz0gcDsKLQkJYnJlYWs7Ci0JICAgIH0KLSNlbmRpZgotCSAgICBkYXRhID0gbGYgKyAxOwotCX0KLQkKLQkvKiBBbGwgdGhlIGhlYWRlcnMgc2hvdWxkIGJlIHNldCBub3cgKi8KLQotCWFwX3NlbmRfaHR0cF9oZWFkZXIocik7Ci0KLQkvKiBBbnkgZGF0YSBsZWZ0IHNob3VsZCBub3cgYmUgc2VudCBkaXJlY3RseSAqLwotCWFwX3JwdXRzKGRhdGEsIHIpOwotCi0JcmV0dXJuIFRSVUU7Ci0KLSAgICBjYXNlIEhTRV9SRVFfTUFQX1VSTF9UT19QQVRIOgotCS8qIE1hcCBhIFVSTCB0byBhIGZpbGVuYW1lICovCi0Jc3VicmVxID0gYXBfc3ViX3JlcV9sb29rdXBfdXJpKGFwX3BzdHJuZHVwKHItPnBvb2wsIChjaGFyICopbHB2QnVmZmVyLAotCQkJCQkgICAgICAqbHBkd1NpemUpLCByKTsKLQotCUdldEZ1bGxQYXRoTmFtZShzdWJyZXEtPmZpbGVuYW1lLCAqbHBkd1NpemUgLSAxLCAoY2hhciAqKWxwdkJ1ZmZlciwgTlVMTCk7Ci0KLQkvKiBJSVMgcHV0cyBhIHRyYWlsaW5nIHNsYXNoIG9uIGRpcmVjdG9yaWVzLCBBcGFjaGUgZG9lc24ndCAqLwotCi0JaWYgKFNfSVNESVIgKHN1YnJlcS0+ZmluZm8uc3RfbW9kZSkpIHsKLQkJaW50IGwgPSBzdHJsZW4oKGNoYXIgKilscHZCdWZmZXIpOwotCi0JCSgoY2hhciAqKWxwdkJ1ZmZlcilbbF0gPSAnXFwnOwotCQkoKGNoYXIgKilscHZCdWZmZXIpW2wgKyAxXSA9ICdcMCc7Ci0JfQotCQotCXJldHVybiBUUlVFOwotCi0gICAgY2FzZSBIU0VfUkVRX0RPTkVfV0lUSF9TRVNTSU9OOgotCS8qIERvIG5vdGhpbmcuLi4gc2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBhc3luYyBJL08sIHRoZXknbGwKLQkgKiByZXR1cm4gZnJvbSBIdHRwRXh0ZW5zaW9uUHJvYyBzb29uCi0JICovCi0JcmV0dXJuIFRSVUU7Ci0KLSAgICAvKiBXZSBkb24ndCBzdXBwb3J0IGFsbCB0aGlzIGFzeW5jIEkvTywgTWljcm9zb2Z0LXNwZWNpZmljIHN0dWZmICovCi0gICAgY2FzZSBIU0VfUkVRX0lPX0NPTVBMRVRJT046Ci0gICAgY2FzZSBIU0VfUkVRX1RSQU5TTUlUX0ZJTEU6Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCByLAotCQkgICAgIklTQVBJIGFzeW5jaHJvbm91cyBJL08gbm90IHN1cHBvcnRlZDogJXMiLCByLT5maWxlbmFtZSk7Ci0gICAgZGVmYXVsdDoKLQlTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwotCXJldHVybiBGQUxTRTsKLSAgICB9Ci19Ci0KLWhhbmRsZXJfcmVjIGlzYXBpX2hhbmRsZXJzW10gPSB7Ci17ICJpc2FwaS1pc2EiLCBpc2FwaV9oYW5kbGVyIH0sCi17IE5VTEx9Ci19OwotCi1tb2R1bGUgaXNhcGlfbW9kdWxlID0gewotICAgU1RBTkRBUkRfTU9EVUxFX1NUVUZGLAotICAgTlVMTCwJCQkvKiBpbml0aWFsaXplciAqLwotICAgTlVMTCwJCQkvKiBjcmVhdGUgcGVyLWRpciBjb25maWcgKi8KLSAgIE5VTEwsCQkJLyogbWVyZ2UgcGVyLWRpciBjb25maWcgKi8KLSAgIE5VTEwsCQkJLyogc2VydmVyIGNvbmZpZyAqLwotICAgTlVMTCwJCQkvKiBtZXJnZSBzZXJ2ZXIgY29uZmlnICovCi0gICBOVUxMLAkJCS8qIGNvbW1hbmQgdGFibGUgKi8KLSAgIGlzYXBpX2hhbmRsZXJzLAkgICAgICAgCS8qIGhhbmRsZXJzICovCi0gICBOVUxMLAkJCS8qIGZpbGVuYW1lIHRyYW5zbGF0aW9uICovCi0gICBOVUxMLAkJCS8qIGNoZWNrX3VzZXJfaWQgKi8KLSAgIE5VTEwsCQkJLyogY2hlY2sgYXV0aCAqLwotICAgTlVMTCwJCQkvKiBjaGVjayBhY2Nlc3MgKi8KLSAgIE5VTEwsCQkJLyogdHlwZV9jaGVja2VyICovCi0gICBOVUxMLAkJCS8qIGxvZ2dlciAqLwotICAgTlVMTAkJCQkvKiBoZWFkZXIgcGFyc2VyICovCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9hcmNoL3dpbjMyL21vZF9pc2FwaS5kc3AgYi9tb2R1bGVzL2FyY2gvd2luMzIvbW9kX2lzYXBpLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY5ZmI4MC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2FyY2gvd2luMzIvbW9kX2lzYXBpLmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9Im1vZF9pc2FwaSIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyCi0KLUNGRz1tb2RfaXNhcGkgLSBXaW4zMiBSZWxlYXNlCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIm1vZF9pc2FwaS5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIm1vZF9pc2FwaS5tYWsiIENGRz0ibW9kX2lzYXBpIC0gV2luMzIgUmVsZWFzZSIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJtb2RfaXNhcGkgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFICJtb2RfaXNhcGkgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLU1UTD1taWRsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJtb2RfaXNhcGkgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9JICIuLi8uLi8uLi9pbmNsdWRlIiAvSSAiLi4vLi4vLi4vc3JjbGliL2Fwci9pbmNsdWRlIiAvSSAiLi4vLi4vLi4vc3JjbGliL2Fwci11dGlsL2luY2x1ZGUiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRmQiUmVsZWFzZVxtb2RfaXNhcGkiIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHdzMl8zMi5saWIgbXN3c29jay5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9tYWNoaW5lOkkzODYgL291dDoiUmVsZWFzZS9tb2RfaXNhcGkuc28iIC9iYXNlOkAuLlwuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX2lzYXBpCi0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIHdzMl8zMi5saWIgbXN3c29jay5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9tYWNoaW5lOkkzODYgL291dDoiUmVsZWFzZS9tb2RfaXNhcGkuc28iIC9iYXNlOkAuLlwuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX2lzYXBpCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJtb2RfaXNhcGkgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aaSAvT2QgL0kgIi4uLy4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi8uLi9zcmNsaWIvYXByL2luY2x1ZGUiIC9JICIuLi8uLi8uLi9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9GZCJEZWJ1Z1xtb2RfaXNhcGkiIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHdzMl8zMi5saWIgbXN3c29jay5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvaW5jcmVtZW50YWw6bm8gL21hcCAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJEZWJ1Zy9tb2RfaXNhcGkuc28iIC9iYXNlOkAuLlwuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX2lzYXBpCi0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIHdzMl8zMi5saWIgbXN3c29jay5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6IkRlYnVnL21vZF9pc2FwaS5zbyIgL2Jhc2U6QC4uXC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfaXNhcGkKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIm1vZF9pc2FwaSAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgIm1vZF9pc2FwaSAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2RfaXNhcGkuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kX2lzYXBpLnJjCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9pc2FwaSAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQ3JlYXRpbmcgVmVyc2lvbiBSZXNvdXJjZQotSW5wdXRQYXRoPS4uXC4uXC4uXGJ1aWxkXHdpbjMyXHdpbjMydmVyLmF3awotCi0iLlxtb2RfaXNhcGkucmMiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JYXdrIC1mIC4uLy4uLy4uL2J1aWxkL3dpbjMyL3dpbjMydmVyLmF3ayBtb2RfaXNhcGkgICJpc2FwaV9tb2R1bGUgZm9yIEFwYWNoZSIgLi4vLi4vLi4vaW5jbHVkZS9hcF9yZWxlYXNlLmggPiAuXG1vZF9pc2FwaS5yYwotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9pc2FwaSAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIENyZWF0aW5nIFZlcnNpb24gUmVzb3VyY2UKLUlucHV0UGF0aD0uLlwuLlwuLlxidWlsZFx3aW4zMlx3aW4zMnZlci5hd2sKLQotIi5cbW9kX2lzYXBpLnJjIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCWF3ayAtZiAuLi8uLi8uLi9idWlsZC93aW4zMi93aW4zMnZlci5hd2sgbW9kX2lzYXBpICAiaXNhcGlfbW9kdWxlIGZvciBBcGFjaGUiIC4uLy4uLy4uL2luY2x1ZGUvYXBfcmVsZWFzZS5oID4gLlxtb2RfaXNhcGkucmMKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9hcmNoL3dpbjMyL21vZF93aW4zMi5jIGIvbW9kdWxlcy9hcmNoL3dpbjMyL21vZF93aW4zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2ZiMGNkLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvYXJjaC93aW4zMi9tb2Rfd2luMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDUxMCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotCi0jaW5jbHVkZSAiYXByX3N0cmluZ3MuaCIKLSNpbmNsdWRlICJhcHJfcG9ydGFibGUuaCIKLSNpbmNsdWRlICJhcHJfYnVja2V0cy5oIgotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJ1dGlsX3NjcmlwdC5oIgotI2luY2x1ZGUgIm1vZF9jb3JlLmgiCi0jaW5jbHVkZSAiYXByX29wdGlvbmFsLmgiCi0jaW5jbHVkZSAiYXByX2xpYi5oIgotCi0jaWZkZWYgV0lOMzIKLQotLyogCi0gKiBDR0kgU2NyaXB0IHN0dWZmIGZvciBXaW4zMi4uLgotICovCi10eXBlZGVmIGVudW0geyBlRmlsZVR5cGVVTktOT1dOLCBlRmlsZVR5cGVCSU4sIGVGaWxlVHlwZUVYRTE2LCBlRmlsZVR5cGVFWEUzMiwgCi0gICAgICAgICAgICAgICBlRmlsZVR5cGVTQ1JJUFQgfSBmaWxlX3R5cGVfZTsKLXR5cGVkZWYgZW51bSB7IElOVEVSUFJFVEVSX1NPVVJDRV9VTlNFVCwgSU5URVJQUkVURVJfU09VUkNFX1JFR0lTVFJZX1NUUklDVCwgCi0gICAgICAgICAgICAgICBJTlRFUlBSRVRFUl9TT1VSQ0VfUkVHSVNUUlksIElOVEVSUFJFVEVSX1NPVVJDRV9TSEVCQU5HIAotICAgICAgICAgICAgIH0gaW50ZXJwcmV0ZXJfc291cmNlX2U7Ci1BUF9ERUNMQVJFKGZpbGVfdHlwZV9lKSBhcF9nZXRfd2luMzJfaW50ZXJwcmV0ZXIoY29uc3QgcmVxdWVzdF9yZWMgKiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKmludGVycHJldGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiphcmd1bWVudHMpOwotCi1tb2R1bGUgQVBfTU9EVUxFX0RFQ0xBUkVfREFUQSB3aW4zMl9tb2R1bGU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAvKiBXaGVyZSB0byBmaW5kIGludGVycHJldGVyIHRvIHJ1biBzY3JpcHRzICovCi0gICAgaW50ZXJwcmV0ZXJfc291cmNlX2Ugc2NyaXB0X2ludGVycHJldGVyX3NvdXJjZTsKLX0gd2luMzJfZGlyX2NvbmY7Ci0KLXN0YXRpYyB2b2lkICpjcmVhdGVfd2luMzJfZGlyX2NvbmZpZyhhcHJfcG9vbF90ICpwLCBjaGFyICpkaXIpCi17Ci0gICAgd2luMzJfZGlyX2NvbmYgKmNvbmYgPSAod2luMzJfZGlyX2NvbmYqKWFwcl9wYWxsb2MocCwgc2l6ZW9mKHdpbjMyX2Rpcl9jb25mKSk7Ci0gICAgY29uZi0+c2NyaXB0X2ludGVycHJldGVyX3NvdXJjZSA9IElOVEVSUFJFVEVSX1NPVVJDRV9VTlNFVDsKLSAgICByZXR1cm4gY29uZjsKLX0KLQotc3RhdGljIHZvaWQgKm1lcmdlX3dpbjMyX2Rpcl9jb25maWdzKGFwcl9wb29sX3QgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICphZGR2KQotewotICAgIHdpbjMyX2Rpcl9jb25mICpuZXcgPSAod2luMzJfZGlyX2NvbmYgKikgYXByX3BjYWxsb2MocCwgc2l6ZW9mKHdpbjMyX2Rpcl9jb25mKSk7Ci0gICAgd2luMzJfZGlyX2NvbmYgKmJhc2UgPSAod2luMzJfZGlyX2NvbmYgKikgYmFzZXY7Ci0gICAgd2luMzJfZGlyX2NvbmYgKmFkZCA9ICh3aW4zMl9kaXJfY29uZiAqKSBhZGR2OwotCi0gICAgbmV3LT5zY3JpcHRfaW50ZXJwcmV0ZXJfc291cmNlID0gKGFkZC0+c2NyaXB0X2ludGVycHJldGVyX3NvdXJjZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBJTlRFUlBSRVRFUl9TT1VSQ0VfVU5TRVQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYWRkLT5zY3JpcHRfaW50ZXJwcmV0ZXJfc291cmNlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGJhc2UtPnNjcmlwdF9pbnRlcnByZXRlcl9zb3VyY2U7Ci0gICAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9pbnRlcnByZXRlcl9zb3VyY2UoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYXJnKQotewotICAgIHdpbjMyX2Rpcl9jb25mICpkID0gKHdpbjMyX2Rpcl9jb25mICopZHY7Ci0gICAgaWYgKCFzdHJjYXNlY21wKGFyZywgInJlZ2lzdHJ5IikpIHsKLSAgICAgICAgZC0+c2NyaXB0X2ludGVycHJldGVyX3NvdXJjZSA9IElOVEVSUFJFVEVSX1NPVVJDRV9SRUdJU1RSWTsKLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZywgInJlZ2lzdHJ5LXN0cmljdCIpKSB7Ci0gICAgICAgIGQtPnNjcmlwdF9pbnRlcnByZXRlcl9zb3VyY2UgPSBJTlRFUlBSRVRFUl9TT1VSQ0VfUkVHSVNUUllfU1RSSUNUOwotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJnLCAic2NyaXB0IikpIHsKLSAgICAgICAgZC0+c2NyaXB0X2ludGVycHJldGVyX3NvdXJjZSA9IElOVEVSUFJFVEVSX1NPVVJDRV9TSEVCQU5HOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBhcHJfcHN0cmNhdChjbWQtPnRlbXBfcG9vbCwgIlNjcmlwdEludGVycHJldGVyU291cmNlIFwiIiwgYXJnLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIG11c3QgYmUgXCJyZWdpc3RyeVwiLCBcInJlZ2lzdHJ5LXN0cmljdFwiIG9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlwic2NyaXB0XCIiLCBOVUxMKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFByZXR0eSB1bmV4Y2l0aW5nIC4uLiB5YW5rIGEgcmVnaXN0cnkgdmFsdWUsIGFuZCBleHBsb2RlIGFueSBlbnZ2YXJzCi0gKiB0aGF0IHRoZSBzeXN0ZW0gaGFzIGNvbmZpZ3VyZWQgKGUuZy4gJVN5c3RlbVJvb3QlL3NvbWVhcHAuZXhlKQotICoKLSAqIFhYWDogTmVlZCBVbmljb2RlIHZlcnNpb25zIGZvciBpMThuCi0gKi8KLXN0YXRpYyBhcHJfc3RhdHVzX3QgZ2V0X3dpbjMyX3JlZ2lzdHJ5X2RlZmF1bHRfdmFsdWUoYXByX3Bvb2xfdCAqcCwgSEtFWSBoa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiByZWxhdGl2ZXBhdGgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqdmFsdWUpCi17Ci0gICAgSEtFWSBoa2V5T3BlbjsKLSAgICBEV09SRCB0eXBlOwotICAgIERXT1JEIHNpemUgPSAwOwotICAgIERXT1JEIHJlc3VsdCA9IFJlZ09wZW5LZXlFeChoa2V5LCByZWxhdGl2ZXBhdGgsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfUVVFUllfVkFMVUUsICZoa2V5T3Blbik7Ci0gICAgCi0gICAgaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKSAKLSAgICAgICAgcmV0dXJuIEFQUl9GUk9NX09TX0VSUk9SKHJlc3VsdCk7Ci0KLSAgICAvKiBSZWFkIHRvIE5VTEwgYnVmZmVyIHRvIGRldGVybWluZSB2YWx1ZSBzaXplICovCi0gICAgcmVzdWx0ID0gUmVnUXVlcnlWYWx1ZUV4KGhrZXlPcGVuLCAiIiwgMCwgJnR5cGUsIE5VTEwsICZzaXplKTsKLSAgICAKLSAgIGlmIChyZXN1bHQgPT0gRVJST1JfU1VDQ0VTUykgewotICAgICAgICBpZiAoKHNpemUgPCAyKSB8fCAodHlwZSAhPSBSRUdfU1ogJiYgdHlwZSAhPSBSRUdfRVhQQU5EX1NaKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAqdmFsdWUgPSBhcHJfcGFsbG9jKHAsIHNpemUpOwotICAgICAgICAgICAgLyogUmVhZCB2YWx1ZSBiYXNlZCBvbiBzaXplIHF1ZXJ5IGFib3ZlICovCi0gICAgICAgICAgICByZXN1bHQgPSBSZWdRdWVyeVZhbHVlRXgoaGtleU9wZW4sICIiLCAwLCAmdHlwZSwgKnZhbHVlLCAmc2l6ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBUT0RPOiBUaGlzIG1pZ2h0IGxvb2sgZmluZSwgYnV0IHdlIG5lZWQgdG8gcHJvdmlkZSBzb21lIHdhcm5pbmcKLSAgICAgKiBzb21ld2hlcmUgdGhhdCBzb21lIGVudmlyb25tZW50IHZhcmlhYmxlcyBtYXkgLW5vdC0gYmUgdHJhbnNsYXRlZCwKLSAgICAgKiBzZWVpbmcgYXMgd2UgbWF5IGhhdmUgY2hvcHBlZCB0aGUgZW52aXJvbm1lbnQgdGFibGUgZG93biBzb21ld2hhdC4KLSAgICAgKi8KLSAgICBpZiAoKHJlc3VsdCA9PSBFUlJPUl9TVUNDRVNTKSAmJiAodHlwZSA9PSBSRUdfRVhQQU5EX1NaKSkgCi0gICAgewotICAgICAgICBjaGFyICp0bXAgPSAqdmFsdWU7Ci0gICAgICAgIHNpemUgPSBFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3ModG1wLCAqdmFsdWUsIDApOwotICAgICAgICBpZiAoc2l6ZSkgewotICAgICAgICAgICAgKnZhbHVlID0gYXByX3BhbGxvYyhwLCBzaXplKTsKLSAgICAgICAgICAgIHNpemUgPSBFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3ModG1wLCAqdmFsdWUsIHNpemUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgUmVnQ2xvc2VLZXkoaGtleU9wZW4pOwotICAgIHJldHVybiBBUFJfRlJPTV9PU19FUlJPUihyZXN1bHQpOwotfQotCi0vKiBTb21ld2hhdCBtb3JlIGV4Y2l0aW5nIC4uLiBmaWd1cmUgb3V0IHdoZXJlIHRoZSByZWdpc3RyeSBoYXMgc3Rhc2hlZCB0aGUKLSAqIEV4ZWNDR0kgb3IgT3BlbiBjb21tYW5kIC0gaXQgbWF5IGJlIG5lc3RlZCBvbmUgbGV2ZWwgZGVlcCAob3IgbW9yZT8/PykKLSAqLwotc3RhdGljIGNoYXIqIGdldF9pbnRlcnByZXRlcl9mcm9tX3dpbjMyX3JlZ2lzdHJ5KGFwcl9wb29sX3QgKnAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWN0KQotewotICAgIGNoYXIgZXhlY2NnaV9wYXRoW10gPSAiU0hFTExcXEVYRUNDR0lcXENPTU1BTkQiOwotICAgIGNoYXIgZXhlY29wZW5fcGF0aFtdID0gIlNIRUxMXFxPUEVOXFxDT01NQU5EIjsKLSAgICBjaGFyIHR5cGVOYW1lW01BWF9QQVRIXTsKLSAgICBpbnQgY21kT2ZOYW1lID0gRkFMU0U7Ci0gICAgSEtFWSBoa2V5TmFtZTsKLSAgICBIS0VZIGhrZXlUeXBlOwotICAgIERXT1JEIHR5cGU7Ci0gICAgaW50IHNpemU7Ci0gICAgaW50IHJlc3VsdDsKLSAgICBjaGFyICpidWZmZXI7Ci0gICAgCi0gICAgaWYgKCFleHQpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIC8qIAotICAgICAqIEZ1dHVyZSBvcHRpbWl6YXRpb246Ci0gICAgICogV2hlbiB0aGUgcmVnaXN0cnkgaXMgc3VjY2Vzc2Z1bGx5IHNlYXJjaGVkLCBzdG9yZSB0aGUgc3RyaW5ncyBmb3IKLSAgICAgKiBpbnRlcnByZXRlciBhbmQgYXJndW1lbnRzIGluIGFuIGV4dCBoYXNoIHRvIHNwZWVkIHVwIHN1YnNlcXVlbnQgbG9vay11cHMKLSAgICAgKi8KLQotICAgIC8qIE9wZW4gdGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIHNjcmlwdCBmaWxldHlwZSBleHRlbnNpb24gKi8KLSAgICByZXN1bHQgPSBSZWdPcGVuS2V5RXgoSEtFWV9DTEFTU0VTX1JPT1QsIGV4dCwgMCwgS0VZX1FVRVJZX1ZBTFVFLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmhrZXlUeXBlKTsKLQotICAgIGlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykgCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgLyogUmV0cmlldmUgdGhlIG5hbWUgb2YgdGhlIHNjcmlwdCBmaWxldHlwZSBleHRlbnNpb24gKi8KLSAgICBzaXplID0gc2l6ZW9mKHR5cGVOYW1lKTsKLSAgICByZXN1bHQgPSBSZWdRdWVyeVZhbHVlRXgoaGtleVR5cGUsICIiLCBOVUxMLCAmdHlwZSwgdHlwZU5hbWUsICZzaXplKTsKLSAgICAKLSAgICBpZiAocmVzdWx0ID09IEVSUk9SX1NVQ0NFU1MgJiYgdHlwZSA9PSBSRUdfU1ogJiYgdHlwZU5hbWVbMF0pIHsKLSAgICAgICAgLyogT3BlbiB0aGUga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NyaXB0IGZpbGV0eXBlIGV4dGVuc2lvbiAqLwotICAgICAgICByZXN1bHQgPSBSZWdPcGVuS2V5RXgoSEtFWV9DTEFTU0VTX1JPT1QsIHR5cGVOYW1lLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9RVUVSWV9WQUxVRSwgJmhrZXlOYW1lKTsKLQotICAgICAgICBpZiAocmVzdWx0ID09IEVSUk9SX1NVQ0NFU1MpCi0gICAgICAgICAgICBjbWRPZk5hbWUgPSBUUlVFOwotICAgIH0KLQotICAgIC8qIE9wZW4gdGhlIGtleSBmb3IgdGhlIHNjcmlwdCBjb21tYW5kIHBhdGggYnk6Ci0gICAgICogCi0gICAgICogICAxKSB0aGUgJ25hbWVkJyBmaWxldHlwZSBrZXkgZm9yIEV4ZWNDR0kvQ29tbWFuZAotICAgICAqICAgMikgdGhlIGV4dGVuc2lvbidzIHR5cGUga2V5IGZvciBFeGVjQ0dJL0NvbW1hbmQKLSAgICAgKgotICAgICAqIGFuZCBpZiB0aGUgc3RyaWN0IGFyZyBpcyBmYWxzZSwgdGhlbiBjb250aW51ZSB0cnlpbmc6Ci0gICAgICoKLSAgICAgKiAgIDMpIHRoZSAnbmFtZWQnIGZpbGV0eXBlIGtleSBmb3IgT3Blbi9Db21tYW5kCi0gICAgICogICA0KSB0aGUgZXh0ZW5zaW9uJ3MgdHlwZSBrZXkgZm9yIE9wZW4vQ29tbWFuZAotICAgICAqLwotCi0gICAgaWYgKGNtZE9mTmFtZSkgewotICAgICAgICByZXN1bHQgPSBnZXRfd2luMzJfcmVnaXN0cnlfZGVmYXVsdF92YWx1ZShwLCBoa2V5TmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNjZ2lfcGF0aCwgJmJ1ZmZlcik7Ci0gICAgfQotCi0gICAgaWYgKCFjbWRPZk5hbWUgfHwgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKSkgewotICAgICAgICByZXN1bHQgPSBnZXRfd2luMzJfcmVnaXN0cnlfZGVmYXVsdF92YWx1ZShwLCBoa2V5VHlwZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNjZ2lfcGF0aCwgJmJ1ZmZlcik7Ci0gICAgfQotCi0gICAgaWYgKCFzdHJpY3QgJiYgY21kT2ZOYW1lICYmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykpIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0X3dpbjMyX3JlZ2lzdHJ5X2RlZmF1bHRfdmFsdWUocCwgaGtleU5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjb3Blbl9wYXRoLCAmYnVmZmVyKTsKLSAgICB9Ci0KLSAgICBpZiAoIXN0cmljdCAmJiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpKSB7Ci0gICAgICAgIHJlc3VsdCA9IGdldF93aW4zMl9yZWdpc3RyeV9kZWZhdWx0X3ZhbHVlKHAsIGhrZXlUeXBlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY29wZW5fcGF0aCwgJmJ1ZmZlcik7Ci0gICAgfQotCi0gICAgaWYgKGNtZE9mTmFtZSkKLSAgICAgICAgUmVnQ2xvc2VLZXkoaGtleU5hbWUpOwotCi0gICAgUmVnQ2xvc2VLZXkoaGtleVR5cGUpOwotCi0gICAgaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTICB8fCAhYnVmZmVyWzBdKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIHJldHVybiBidWZmZXI7Ci19Ci0KLQotc3RhdGljIGFwcl9hcnJheV9oZWFkZXJfdCAqc3BsaXRfYXJndihhcHJfcG9vbF90ICpwLCBjb25zdCBjaGFyICppbnRlcnAsIGNvbnN0IGNoYXIgKmNnaXByZywgY29uc3QgY2hhciAqY2dpYXJncykKLXsKLSAgICBhcHJfYXJyYXlfaGVhZGVyX3QgKmFyZ3MgPSBhcHJfYXJyYXlfbWFrZShwLCA4LCBzaXplb2YoY2hhciopKTsKLSAgICBjaGFyICpkID0gYXByX3BhbGxvYyhwLCBzdHJsZW4oaW50ZXJwKSk7Ci0gICAgY29uc3QgY2hhciAqY2ggPSBpbnRlcnA7IAotICAgIGNvbnN0IGNoYXIgKiphcmc7Ci0gICAgaW50IHByZ3Rha2VuID0gMDsKLSAgICBpbnQgYXJndGFrZW4gPSAwOwotICAgIGludCBpbnF1bzsKLSAgICBpbnQgc2w7Ci0KLSAgICB3aGlsZSAoKmNoKSB7Ci0gICAgICAgIC8qIFNraXAgb24gdGhyb3VnaCBEZWVwIFNwYWNlICovCi0gICAgICAgIGlmIChpc3NwYWNlKCpjaCkpIHsKLSAgICAgICAgICAgICsrY2g7IGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8qIE9uZSBBcmcgKi8KLSAgICAgICAgaWYgKCgoKmNoID09ICckJykgfHwgKCpjaCA9PSAnJScpKSAmJiAoKihjaCArIDEpID09ICcqJykpIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNnaWFyZyA9IGNnaWFyZ3M7Ci0gICAgICAgICAgICBhcmd0YWtlbiA9IDE7Ci0gICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgY2hhciAqdyA9IGFwX2dldHdvcmRfbnVsbHMocCwgJmNnaWFyZywgJysnKTsKLSAgICAgICAgICAgICAgICBpZiAoISp3KQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBhcF91bmVzY2FwZV91cmwodyk7Ci0gICAgICAgICAgICAgICAgYXJnID0gKGNvbnN0IGNoYXIqKilhcHJfYXJyYXlfcHVzaChhcmdzKTsKLSAgICAgICAgICAgICAgICAqYXJnID0gYXBfZXNjYXBlX3NoZWxsX2NtZChwLCB3KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoICs9IDI7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKCgqY2ggPT0gJyQnKSB8fCAoKmNoID09ICclJykpICYmICgqKGNoICsgMSkgPT0gJzEnKSkgewotICAgICAgICAgICAgcHJndGFrZW4gPSAxOwotICAgICAgICAgICAgYXJnID0gKGNvbnN0IGNoYXIqKilhcHJfYXJyYXlfcHVzaChhcmdzKTsKLSAgICAgICAgICAgICphcmcgPSBjZ2lwcmc7Ci0gICAgICAgICAgICBjaCArPSAyOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCgqY2ggPT0gJ1wiJykgJiYgKCgqKGNoICsgMSkgPT0gJyQnKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgqKGNoICsgMSkgPT0gJyUnKSkgJiYgKCooY2ggKyAyKSA9PSAnMScpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKihjaCArIDMpID09ICdcIicpKSB7Ci0gICAgICAgICAgICBwcmd0YWtlbiA9IDE7Ci0gICAgICAgICAgICBhcmcgPSAoY29uc3QgY2hhcioqKWFwcl9hcnJheV9wdXNoKGFyZ3MpOwotICAgICAgICAgICAgKmFyZyA9IGNnaXByZzsKLSAgICAgICAgICAgIGNoICs9IDQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBhcmcgPSAoY29uc3QgY2hhcioqKWFwcl9hcnJheV9wdXNoKGFyZ3MpOwotICAgICAgICAqYXJnID0gZDsKLSAgICAgICAgaW5xdW8gPSAwOwotICAgICAgICB3aGlsZSAoKmNoKSB7Ci0gICAgICAgICAgICBpZiAoaXNzcGFjZSgqY2gpICYmICFpbnF1bykgewotICAgICAgICAgICAgICAgICsrY2g7IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogR2V0ICdlbSBiYWNrc2xhc2hlcyAqLwotICAgICAgICAgICAgZm9yIChzbCA9IDA7ICpjaCA9PSAnXFwnOyArK3NsKQotICAgICAgICAgICAgICAgICpkKysgPSAqY2grKzsKLSAgICAgICAgICAgIGlmIChzbCAmIDEpIHsKLSAgICAgICAgICAgICAgICAvKiBsYXN0IHVubWF0Y2hlZCAnXCcgKyAnIicgc2VxdWVuY2UgaXMgYSAnIicgKi8KLSAgICAgICAgICAgICAgICBpZiAoKmNoID09ICdcIicpCi0gICAgICAgICAgICAgICAgICAgICooZCAtIDEpID0gKmNoKys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKmNoID09ICdcIicpIHsKLSAgICAgICAgICAgICAgICAvKiAnIiInIHNlcXVlbmNlIHdpdGhpbiBxdW90ZXMgaXMgYSAnIicgKi8KLSAgICAgICAgICAgICAgICBpZiAoKisrY2ggPT0gJ1wiJyAmJiBpbnF1bykgewotICAgICAgICAgICAgICAgICAgICAqZCsrID0gKmNoKys7IGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBGbGlwIHF1b3RlIHN0YXRlICovCi0gICAgICAgICAgICAgICAgaW5xdW8gPSAhaW5xdW87Ci0gICAgICAgICAgICAgICAgaWYgKGlzc3BhY2UoKmNoKSAmJiAhaW5xdW8pIHsKLSAgICAgICAgICAgICAgICAgICAgKytjaDsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIEFsbCBvdGhlciAnIidzIGFyZSBNdW5jaGVkICovCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBBbnl0aGluZyBlbHNlIGlzLCB3ZWxsLCBzb21ldGhpbmcgZWxzZSAqLwotICAgICAgICAgICAgKmQrKyA9ICpjaCsrOwotICAgICAgICB9Ci0gICAgICAgIC8qIFRlcm0gdGhhdCBhcmcsIGFscmVhZHkgcHVzaGVkIG9uIGFyZ3MgKi8KLSAgICAgICAgKmQrKyA9ICdcMCc7Ci0gICAgfQotCi0gICAgaWYgKCFwcmd0YWtlbikgewotICAgICAgICBhcmcgPSAoY29uc3QgY2hhcioqKWFwcl9hcnJheV9wdXNoKGFyZ3MpOwotICAgICAgICAqYXJnID0gY2dpcHJnOwotICAgIH0KLQotICAgIGlmICghYXJndGFrZW4pIHsKLSAgICAgICAgY2hhciAqY2dpYXJncyA9IGNnaWFyZzsKLSAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgY2hhciAqdyA9IGFwX2dldHdvcmRfbnVsbHMocCwgJmNnaWFyZ3MsICcrJyk7Ci0gICAgICAgICAgICBpZiAoISp3KQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgYXBfdW5lc2NhcGVfdXJsKHcpOwotICAgICAgICAgICAgYXJnID0gKGNvbnN0IGNoYXIqKilhcHJfYXJyYXlfcHVzaChhcmdzKTsKLSAgICAgICAgICAgICphcmcgPSBhcF9lc2NhcGVfc2hlbGxfY21kKHAsIHcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXJnID0gKGNvbnN0IGNoYXIqKilhcHJfYXJyYXlfcHVzaChhcmdzKTsKLSAgICAqYXJnID0gTlVMTDsKLSAgICAgICAgCi0gICAgcmV0dXJuIGFyZ3M7Ci19Ci0KLQotc3RhdGljIGFwcl9zdGF0dXNfdCBhcF9jZ2lfYnVpbGRfY29tbWFuZChjb25zdCBjaGFyICoqY21kLCBjb25zdCBjaGFyICoqKmFyZ3YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfcmVjICpyLCBhcHJfcG9vbF90ICpwKQotewotICAgIGNvbnN0IGNoYXIgKmV4dCA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciAqaW50ZXJwcmV0ZXIgPSBOVUxMOwotICAgIHdpbjMyX2Rpcl9jb25mICpkID0gCi0gICAgICAgICh3aW4zMl9kaXJfY29uZiAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndpbjMyX21vZHVsZSk7Ci0gICAgYXByX2ZpbGVfdCAqZmg7Ci0gICAgY29uc3QgY2hhciAqYXJncyA9IHItPmFyZ3M7Ci0KLSAgICAvKiBIYW5kbGUgdGhlIGNvbXBsZXRlIGZpbGUgbmFtZSwgd2UgRE9OJ1Qgd2FudCB0byBmb2xsb3cgc3VleGVjLCBzaW5jZQotICAgICAqIGFuIHVucm9vdGVkIGNvbW1hbmQgaXMgYXMgcHJlZGljdGFibGUgYXMgc2hvb3RpbmcgY3JhcHMgaW4gV2luMzIuCi0gICAgICoKLSAgICAgKiBOb3RpY2UgdGhhdCB1bmxpa2UgbW9zdCBtaW1lIGV4dGVuc2lvbiBwYXJzaW5nLCB3ZSBoYXZlIHRvIHVzZSB0aGUKLSAgICAgKiB3aW4zMiBwYXJzaW5nIGhlcmUsIHRoZXJlZm9yZSB0aGUgZmluYWwgZXh0ZW5zaW9uIGlzIHRoZSBvbmx5IG9uZQotICAgICAqIHdlIHdpbGwgY29uc2lkZXIKLSAgICAgKi8KLSAgICBleHQgPSBzdHJyY2hyKGFwcl9maWxlbmFtZV9vZl9wYXRobmFtZShyLT5maWxlbmFtZSksICcuJyk7Ci0gICAgaWYgKGV4dCkKLSAgICAgICAgKytleHQ7Ci0gICAgCi0gICAgLyogSWYgdGhlIGZpbGUgaGFzIGFuIGV4dGVuc2lvbiBhbmQgaXQgaXMgbm90IC5jb20gYW5kIG5vdCAuZXhlIGFuZAotICAgICAqIHdlJ3ZlIGJlZW4gaW5zdHJ1Y3RlZCB0byBzZWFyY2ggdGhlIHJlZ2lzdHJ5LCB0aGVuIGRvIHNvLgotICAgICAqLwotICAgIGlmIChleHQgJiYgKCFzdHJjYXNlY21wKGV4dCwiLmV4ZSIpIHx8ICFzdHJjYXNlY21wKGV4dCwiLmNvbSIpCi0gICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoZXh0LCIuYmF0IikgfHwgIXN0cmNhc2VjbXAoZXh0LCIuY21kIikpKSB7Ci0gICAgICAgIGludGVycHJldGVyID0gIiI7Ci0gICAgfQotICAgIGlmICghaW50ZXJwcmV0ZXIpCi0gICAgewotICAgICAgICBhcHJfc3RhdHVzX3QgcnY7Ci0gICAgICAgIGNoYXIgYnVmZmVyWzEwMjRdOwotICAgICAgICBhcHJfc2l6ZV90IGJ5dGVzID0gc2l6ZW9mKGJ1ZmZlcik7Ci0gICAgICAgIGludCBpOwotCi0gICAgICAgIC8qIE5lZWQgdG8gcGVlayBpbnRvIHRoZSBmaWxlIGZpZ3VyZSBvdXQgd2hhdCBpdCByZWFsbHkgaXMuLi4gCi0gICAgICAgICAqICMjIyBhdWdodCB0byBnbyBiYWNrIGFuZCBidWlsZCBhIGNhY2hlIGZvciB0aGlzIG9uZSBvZiB0aGVzZSBkYXlzLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCgocnYgPSBhcHJfZmlsZV9vcGVuKCZmaCwgci0+ZmlsZW5hbWUsIEFQUl9SRUFEIHwgQVBSX0JVRkZFUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUFJfT1NfREVGQVVMVCwgci0+cG9vbCkpICE9IEFQUl9TVUNDRVNTKSAKLSAgICAgICAgIHx8ICgocnYgPSBhcHJfZmlsZV9yZWFkKGZoLCBidWZmZXIsICZieXRlcykpICE9IEFQUl9TVUNDRVNTKSkgewotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHJ2LCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlYWQgY2dpIGZpbGUgJXMgZm9yIHRlc3RpbmciLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gcnY7Ci0gICAgICAgIH0KLSAgICAgICAgYXByX2ZpbGVfY2xvc2UoZmgpOwotCi0gICAgICAgIC8qIFNjcmlwdCBvciBleGVjdXRhYmxlLCB0aGF0IGlzIHRoZSBxdWVzdGlvbi4uLiAqLwotICAgICAgICBpZiAoKGJ1ZmZlclswXSA9PSAnIycpICYmIChidWZmZXJbMV0gPT0gJyEnKSkgewotICAgICAgICAgICAgLyogQXNzdW1pbmcgZmlsZSBpcyBhIHNjcmlwdCBzaW5jZSBpdCBzdGFydHMgd2l0aCBhIHNoZWJhbmcgKi8KLSAgICAgICAgICAgIGZvciAoaSA9IDI7IGkgPCBzaXplb2YoYnVmZmVyKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChidWZmZXJbaV0gPT0gJ1xyJykgfHwgKGJ1ZmZlcltpXSA9PSAnXG4nKSkgewotICAgICAgICAgICAgICAgICAgICBidWZmZXJbaV0gPSAnXDAnOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaSA8IHNpemVvZihidWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgaW50ZXJwcmV0ZXIgPSBidWZmZXIgKyAyOwotICAgICAgICAgICAgICAgIHdoaWxlIChpc3NwYWNlKCppbnRlcnByZXRlcikpCi0gICAgICAgICAgICAgICAgICAgICsraW50ZXJwcmV0ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKiBOb3QgYSBzY3JpcHQsIGlzIGl0IGFuIGV4ZWN1dGFibGU/ICovCi0gICAgICAgICAgICBJTUFHRV9ET1NfSEVBREVSICpoZHIgPSAoSU1BR0VfRE9TX0hFQURFUiopYnVmZmVyOyAgICAKLSAgICAgICAgICAgIGlmICgoYnl0ZXMgPj0gc2l6ZW9mKElNQUdFX0RPU19IRUFERVIpKSAmJiAoaGRyLT5lX21hZ2ljID09IElNQUdFX0RPU19TSUdOQVRVUkUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGhkci0+ZV9sZmFybGMgPCAweDQwKQotICAgICAgICAgICAgICAgICAgICAvKiBBdWdodCB0byBpbnZva2UgdGhpcyAxNiBiaXQgZXhlIGJ5IGEgc3R1YiwgKGNtZCAvYz8pICovCi0gICAgICAgICAgICAgICAgICAgIGludGVycHJldGVyID0gIiI7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBpbnRlcnByZXRlciA9ICIiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghaW50ZXJwcmV0ZXIgJiYgZXh0ICYmCi0gICAgICAgIChkLT5zY3JpcHRfaW50ZXJwcmV0ZXJfc291cmNlID09IElOVEVSUFJFVEVSX1NPVVJDRV9SRUdJU1RSWSB8fAotICAgICAgICAgZC0+c2NyaXB0X2ludGVycHJldGVyX3NvdXJjZSA9PSBJTlRFUlBSRVRFUl9TT1VSQ0VfUkVHSVNUUllfU1RSSUNUKSkgewotICAgICAgICAgLyogQ2hlY2sgdGhlIHJlZ2lzdHJ5ICovCi0gICAgICAgIGludCBzdHJpY3QgPSAoZC0+c2NyaXB0X2ludGVycHJldGVyX3NvdXJjZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBJTlRFUlBSRVRFUl9TT1VSQ0VfUkVHSVNUUllfU1RSSUNUKTsKLSAgICAgICAgaW50ZXJwcmV0ZXIgPSBnZXRfaW50ZXJwcmV0ZXJfZnJvbV93aW4zMl9yZWdpc3RyeShyLT5wb29sLCBleHQsIHN0cmljdCk7Ci0gICAgICAgIGlmICghaW50ZXJwcmV0ZXIpIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0lORk8sIDAsIHItPnNlcnZlciwKLSAgICAgICAgICAgICAgICAgc3RyaWN0ID8gIk5vIEV4ZWNDR0kgdmVyYiBmb3VuZCBmb3IgZmlsZXMgb2YgdHlwZSAnJXMnLiIKLSAgICAgICAgICAgICAgICAgICAgICAgIDogIk5vIEV4ZWNDR0kgb3IgT3BlbiB2ZXJiIGZvdW5kIGZvciBmaWxlcyBvZiB0eXBlICclcycuIiwgCi0gICAgICAgICAgICAgICAgIGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFpbnRlcnByZXRlcikgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUnxBUExPR19OT0VSUk5PLCAwLCByLAotICAgICAgICAgICAgICAgICAgICAgICIlcyBpcyBub3QgZXhlY3V0YWJsZTsgZW5zdXJlIGludGVycHJldGVkIHNjcmlwdHMgaGF2ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgIlwiIyFcIiBmaXJzdCBsaW5lIiwgCi0gICAgICAgICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUpOwotICAgICAgICByZXR1cm4gQVBSX0VCQURGOwotICAgIH0KLQotICAgIGlmICghYXJncyB8fCBhcF9zdHJjaHJfYyhhcmdzLCAnPScpKQotICAgICAgICBhcmdzID0gIiI7Ci0KLSAgICAqYXJndiA9IChjb25zdCBjaGFyICoqKShzcGxpdF9hcmd2KHAsIGludGVycHJldGVyLCByLT5maWxlbmFtZSwgYXJncyktPmVsdHMpOwotICAgICpjbWQgPSAoKmFyZ3YpWzBdOwotICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLX0KLQotQVBSX0RFQ0xBUkVfT1BUSU9OQUxfRk4oYXByX3N0YXR1c190LCBhcF9jZ2lfYnVpbGRfY29tbWFuZCwgKGNvbnN0IGNoYXIgKipjbWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKiphcmd2LCByZXF1ZXN0X3JlYyAqciwgYXByX3Bvb2xfdCAqcCkpOwotCi1zdGF0aWMgdm9pZCByZWdpc3Rlcl9ob29rcyhhcHJfcG9vbF90ICpwKQotewotICAgIEFQUl9SRUdJU1RFUl9PUFRJT05BTF9GTihhcF9jZ2lfYnVpbGRfY29tbWFuZCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyB3aW4zMl9jbWRzW10gPSB7Ci1BUF9JTklUX1RBS0UxKCJTY3JpcHRJbnRlcnByZXRlclNvdXJjZSIsIHNldF9pbnRlcnByZXRlcl9zb3VyY2UsIE5VTEwsCi0gIE9SX0ZJTEVJTkZPLAotICAiV2hlcmUgdG8gZmluZCBpbnRlcnByZXRlciB0byBydW4gV2luMzIgc2NyaXB0cyAoUmVnaXN0cnkgb3Igc2NyaXB0IHNoZWJhbmcgbGluZSkiKSwKLXsgTlVMTCB9Ci19OwotCi1tb2R1bGUgQVBfTU9EVUxFX0RFQ0xBUkVfREFUQSB3aW4zMl9tb2R1bGUgPSB7Ci0gICBTVEFOREFSRDIwX01PRFVMRV9TVFVGRiwKLSAgIGNyZWF0ZV93aW4zMl9kaXJfY29uZmlnLCAgICAgLyogY3JlYXRlIHBlci1kaXIgY29uZmlnICovCi0gICBtZXJnZV93aW4zMl9kaXJfY29uZmlncywgICAgIC8qIG1lcmdlIHBlci1kaXIgY29uZmlnICovCi0gICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcnZlciBjb25maWcgKi8KLSAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLwotICAgd2luMzJfY21kcywgICAgICAgICAgICAgICAgICAvKiBjb21tYW5kIGFwcl90YWJsZV90ICovCi0gICByZWdpc3Rlcl9ob29rcyAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIGhvb2tzICovCi19OwotCi0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL2NhY2hlLy5jdnNpZ25vcmUgYi9tb2R1bGVzL2NhY2hlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZjdhNzAuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9jYWNoZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLmRlcHMKLS5saWJzCi0qLmxhCi1tb2R1bGVzLm1rCi1NYWtlZmlsZQotKi5sbwotKi5zbG8KLSouc28KLSouZGxsCi0qLmRlZgpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9jYWNoZS8uaW5kZW50LnBybyBiL21vZHVsZXMvY2FjaGUvLmluZGVudC5wcm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZmJlOWYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9jYWNoZS8uaW5kZW50LnBybworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS1pNCAtbnBzbCAtZGkwIC1iciAtbmNlIC1kMCAtY2xpMCAtbnBjcyAtbmZjMQotLVRCVUZGCi0tVEZJTEUKLS1UVFJBTlMKLS1UVUlOVDQKLS1UX3RyYW5zCi0tVGFsbG93X29wdGlvbnNfdAotLVRhcGFjaGVfc2ZpbwotLVRhcnJheV9oZWFkZXIKLS1UYm9vbF9pbnQKLS1UYnVmX2FyZWEKLS1UYnVmZl9zdHJ1Y3QKLS1UYnVmZnkKLS1UY21kX2hvdwotLVRjbWRfcGFybXMKLS1UY29tbWFuZF9yZWMKLS1UY29tbWFuZF9zdHJ1Y3QKLS1UY29ubl9yZWMKLS1UY29yZV9kaXJfY29uZmlnCi0tVGNvcmVfc2VydmVyX2NvbmZpZwotLVRkaXJfbWFrZXJfZnVuYwotLVRldmVudAotLVRnbG9iYWxzX3MKLS1UaGFuZGxlcl9mdW5jCi0tVGhhbmRsZXJfcmVjCi0tVGpvYmxpc3RfcwotLVRsaXN0ZW5fcmVjCi0tVG1lcmdlcl9mdW5jCi0tVG1vZGVfdAotLVRtb2R1bGUKLS1UbW9kdWxlX3N0cnVjdAotLVRtdXRleAotLVRuX2xvbmcKLS1Ub3RoZXJfY2hpbGRfcmVjCi0tVG92ZXJyaWRlc190Ci0tVHBhcmVudF9zY29yZQotLVRwaWRfdAotLVRwaXBlZF9sb2cKLS1UcG9vbAotLVRyZXF1ZXN0X3JlYwotLVRyZXF1aXJlX2xpbmUKLS1UcmxpbV90Ci0tVHNjb3JlYm9hcmQKLS1Uc2VtYXBob3JlCi0tVHNlcnZlcl9hZGRyX3JlYwotLVRzZXJ2ZXJfcmVjCi0tVHNlcnZlcl9yZWNfY2hhaW4KLS1Uc2hvcnRfc2NvcmUKLS1UdGFibGUKLS1UdGFibGVfZW50cnkKLS1UdGhyZWFkCi0tVHVfd2lkZV9pbnQKLS1UdnRpbWVfdAotLVR3aWRlX2ludApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9jYWNoZS9NYWtlZmlsZS5pbiBiL21vZHVsZXMvY2FjaGUvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2N2IzNDMuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9jYWNoZS9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi1pbmNsdWRlICQodG9wX3NyY2RpcikvYnVpbGQvc3BlY2lhbC5tawotCmRpZmYgLS1naXQgYS9tb2R1bGVzL2NhY2hlL2NvbmZpZy5tNCBiL21vZHVsZXMvY2FjaGUvY29uZmlnLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDE2MGJhLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvY2FjaGUvY29uZmlnLm00CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotZG5sIG1vZHVsZXMgZW5hYmxlZCBpbiB0aGlzIGRpcmVjdG9yeSBieSBkZWZhdWx0Ci0KLWRubCBBQ19ERUZVTihtb2R1bGVuYW1lLCBtb2R1bGVzdHJ1Y3RuYW1lLCBkZWZhdWx0b25vcm9mZiwgY29uZmlnbWFjcm9zKQotZG5sIFhYWCAtIE5lZWQgdG8gYWxsb3cgLS1lbmFibGUtbW9kdWxlIHRvIGZhaWwgaWYgb3B0aW9uYWwgY29uZmlnIGZhaWxzCi0KLUFDX0RFRlVOKEFQQUNIRV9DSEVDS19TVEFOREFSRF9NT0RVTEUsIFsKLSAgQVBBQ0hFX01PRFVMRShbJDFdLFskMl0sLFskM10sWyQ0XSxbJDVdKQotXSkKLQotQVBBQ0hFX01PRFBBVEhfSU5JVChjYWNoZSkKLQotQVBBQ0hFX0NIRUNLX1NUQU5EQVJEX01PRFVMRShmaWxlX2NhY2hlLCBGaWxlIGNhY2hlLCAsIG5vKQotCi1MVEZMQUdTPSIkTFRGTEFHUyAtZXhwb3J0LWR5bmFtaWMiCi1BUEFDSEVfTU9EUEFUSF9GSU5JU0gKLSAgICAKLUFQQUNIRV9TVUJTVChTVEFOREFSRF9MSUJTKQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9jYWNoZS9tb2RfZmlsZV9jYWNoZS5jIGIvbW9kdWxlcy9jYWNoZS9tb2RfZmlsZV9jYWNoZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWUyNjlkLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvY2FjaGUvbW9kX2ZpbGVfY2FjaGUuYworKysgL2Rldi9udWxsCkBAIC0xLDU1OSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBBdXRob3I6IG1vZF9maWxlX2NhY2hlIGJ5IEJpbGwgU3RvZGRhcmQgPHN0b2RkYXJkQGFwYWNoZS5vcmc+IAotICogICAgICAgICBCYXNlZCBvbiBtb2RfbW1hcF9zdGF0aWMgYnkgRGVhbiBHYXVkZXQgPGRnYXVkZXRAYXJjdGljLm9yZz4KLSAqCi0gKiB2MC4wMTogaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLS8qCi0gICAgRG9jdW1lbnRhdGlvbjoKLQotICAgIFNvbWUgc2l0ZXMgaGF2ZSBhIHNldCBvZiBzdGF0aWMgZmlsZXMgdGhhdCBhcmUgcmVhbGx5IGJ1c3ksIGFuZCAKLSAgICBjaGFuZ2UgaW5mcmVxdWVudGx5IChvciBldmVuIG9uIGEgcmVndWxhciBzY2hlZHVsZSkuIFNhdmUgdGltZSAKLSAgICBieSBjYWNoaW5nIG9wZW4gaGFuZGxlcyB0byB0aGVzZSBmaWxlcy4gVGhpcyBtb2R1bGUsIHVubGlrZSAKLSAgICBtb2RfbW1hcF9zdGF0aWMsIGNhY2hlcyBvcGVuIGZpbGUgaGFuZGxlcywgbm90IGZpbGUgY29udGVudC4gCi0gICAgT24gc3lzdGVtcyAobGlrZSBXaW5kb3dzKSB3aXRoIGhlYXZ5IHN5c3RlbSBjYWxsIG92ZXJoZWFkIGFuZAotICAgIHRoYXQgaGF2ZSBhbiBlZmZpY2llbnQgc2VuZGZpbGUgaW1wbGVtZW50YXRpb24sIGNhY2hpbmcgZmlsZSBoYW5kbGVzCi0gICAgb2ZmZXJzIHNldmVyYWwgYWR2YW50YWdlcyBvdmVyIGNhY2hpbmcgY29udGVudC4gRmlyc3QsIHRoZSBmaWxlIHN5c3RlbQotICAgIGNhbiBtYW5hZ2UgdGhlIG1lbW9yeSwgYWxsb3dpbmcgaW5mcmVxdWVudGx5IGhpdCBjYWNoZWQgZmlsZXMgdG8KLSAgICBiZSBwYWdlZCBvdXQuIFNlY29uZCwgc2luY2UgY2FjaGluZyBvcGVuIGhhbmRsZXMgZG9lcyBub3QgY29uc3VtZQotICAgIHNpZ25pZmljYW50IHJlc291cmNlcywgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byBlbmFibGUgYW4gQXV0b0xvYWRDYWNoZQotICAgIGZlYXR1cmUgd2hlcmUgc3RhdGljIGZpbGVzIGFyZSBkeW5hbWljYWxseSBsb2FkZWQgaW4gdGhlIGNhY2hlIAotICAgIGFzIHRoZSBzZXJ2ZXIgcnVucy4gT24gc3lzdGVtcyB0aGF0IGhhdmUgZmlsZSBjaGFuZ2Ugbm90aWZpY2F0aW9uLAotICAgIHRoaXMgbW9kdWxlIGNhbiBiZSBlbmhhbmNlZCB0byBhdXRvbWF0aWNhbGx5IGdhcmJhZ2UgY29sbGVjdCAKLSAgICBjYWNoZWQgZmlsZXMgdGhhdCBjaGFuZ2Ugb24gZGlzay4KLQotICAgIFRoaXMgbW9kdWxlIHNob3VsZCB3b3JrIG9uIFVuaXggc3lzdGVtcyB0aGF0IGhhdmUgc2VuZGZpbGUuIFBsYWNlIAotICAgIGNhY2hlZmlsZSBkaXJlY3RpdmVzIGludG8geW91ciBjb25maWd1cmF0aW9uIHRvIGRpcmVjdCBmaWxlcyB0bwotICAgIGJlIGNhY2hlZC4KLQotCWNhY2hlZmlsZSAvcGF0aC90by9maWxlMQotCWNhY2hlZmlsZSAvcGF0aC90by9maWxlMgotCS4uLgotCi0gICAgVGhlc2UgZmlsZXMgYXJlIG9ubHkgY2FjaGVkIHdoZW4gdGhlIHNlcnZlciBpcyByZXN0YXJ0ZWQsIHNvIGlmIHlvdSAKLSAgICBjaGFuZ2UgdGhlIGxpc3QsIG9yIGlmIHRoZSBmaWxlcyBhcmUgY2hhbmdlZCwgdGhlbiB5b3UnbGwgbmVlZCB0byAKLSAgICByZXN0YXJ0IHRoZSBzZXJ2ZXIuCi0KLSAgICBUbyByZWl0ZXJhdGUgdGhhdCBwb2ludDogIGlmIHRoZSBmaWxlcyBhcmUgbW9kaWZpZWQgKmluIHBsYWNlKgotICAgIHdpdGhvdXQgcmVzdGFydGluZyB0aGUgc2VydmVyIHlvdSBtYXkgZW5kIHVwIHNlcnZpbmcgcmVxdWVzdHMgdGhhdAotICAgIGFyZSBjb21wbGV0ZWx5IGJvZ3VzLiAgWW91IHNob3VsZCB1cGRhdGUgZmlsZXMgYnkgdW5saW5raW5nIHRoZSBvbGQKLSAgICBjb3B5IGFuZCBwdXR0aW5nIGEgbmV3IGNvcHkgaW4gcGxhY2UuIAotCi0gICAgVGhlcmUncyBubyBzdWNoIHRoaW5nIGFzIGluaGVyaXRpbmcgdGhlc2UgZmlsZXMgYWNyb3NzIHZob3N0cyBvcgotICAgIHdoYXRldmVyLi4uIHBsYWNlIHRoZSBkaXJlY3RpdmVzIGluIHRoZSBtYWluIHNlcnZlciBvbmx5LgotCi0gICAgS25vd24gcHJvYmxlbXM6Ci0KLSAgICBEb24ndCB1c2UgQWxpYXMgb3IgUmV3cml0ZVJ1bGUgdG8gbW92ZSB0aGVzZSBmaWxlcyBhcm91bmQuLi4gIHVubGVzcwotICAgIHlvdSBmZWVsIGxpa2UgcGF5aW5nIGZvciBhbiBleHRyYSBzdGF0KCkgb24gZWFjaCByZXF1ZXN0LiAgVGhpcyBpcwotICAgIGEgZGVmaWNpZW5jeSBpbiB0aGUgQXBhY2hlIEFQSSB0aGF0IHdpbGwgaG9wZWZ1bGx5IGJlIHNvbHZlZCBzb21lIGRheS4KLSAgICBUaGUgZmlsZSB3aWxsIGJlIHNlcnZlZCBvdXQgb2YgdGhlIGZpbGUgaGFuZGxlIGNhY2hlLCBidXQgdGhlcmUgd2lsbCBiZQotICAgIGFuIGV4dHJhIHN0YXQoKSB0aGF0J3MgYSB3YXN0ZS4KLSovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIENPUkVfUFJJVkFURQotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiaHR0cF9wcm90b2NvbC5oIgotI2luY2x1ZGUgImh0dHBfcmVxdWVzdC5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotI2luY2x1ZGUgImFwcl9tbWFwLmgiCi0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBmaWxlX2NhY2hlX21vZHVsZTsKLXN0YXRpYyBhcF9wb29sX3QgKmNvbnRleHQ7Ci1zdGF0aWMgaW50IG9uY2VfdGhyb3VnaCA9IDA7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSNpZiAxCi0gICAgYXBfZmlsZV90ICpmaWxlOwotI2Vsc2UKLSAgICBhcF9tbWFwX3QgKm1tOwotI2VuZGlmCi0gICAgY2hhciAqZmlsZW5hbWU7Ci0gICAgYXBfZmluZm9fdCBmaW5mbzsKLX0gYV9maWxlOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKmZpbGVzOwotICAgIGFwX2FycmF5X2hlYWRlcl90ICppbm9kZV9zb3J0ZWQ7Ci19IGFfc2VydmVyX2NvbmZpZzsKLQotCi1zdGF0aWMgdm9pZCAqY3JlYXRlX3NlcnZlcl9jb25maWcoYXBfcG9vbF90ICpwLCBzZXJ2ZXJfcmVjICpzKQotewotICAgIGFfc2VydmVyX2NvbmZpZyAqc2NvbmYgPSBhcF9wYWxsb2MocCwgc2l6ZW9mKCpzY29uZikpOwotCi0gICAgc2NvbmYtPmZpbGVzID0gYXBfbWFrZV9hcnJheShwLCAyMCwgc2l6ZW9mKGFfZmlsZSkpOwotICAgIHNjb25mLT5pbm9kZV9zb3J0ZWQgPSBOVUxMOwotICAgIHJldHVybiBzY29uZjsKLX0KLSNpZiAwCi1zdGF0aWMgdm9pZCBwcmVfY29uZmlnKGFwX3Bvb2xfdCAqcGNvbmYsIGFwX3Bvb2xfdCAqcGxvZywgYXBfcG9vbF90ICpwdGVtcCkKLXsKLSAgICBjb250ZXh0ID0gcGNvbmY7Ci19Ci0jZW5kaWYKLXN0YXRpYyBhcF9zdGF0dXNfdCBvcGVuX2ZpbGUoYXBfZmlsZV90ICoqZmlsZSwgY2hhciogZmlsZW5hbWUsIGludCBmbGcxLCBpbnQgZmxnMiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX3Bvb2xfdCAqY29udGV4dCkKLXsKLSAgICBhcF9zdGF0dXNfdCBydjsKLSNpZmRlZiBXSU4zMgotICAgIC8qIFRoZSBXaW5kb3dzIGZpbGUgbmVlZHMgdG8gYmUgb3BlbmVkIGZvciBvdmVybGFwcGVkIGkvbywgd2hpY2ggQVBSIGRvZXNuJ3QKLSAgICAgKiBzdXBwb3J0LgotICAgICAqLwotICAgIEhBTkRMRSBoRmlsZTsKLSAgICBoRmlsZSA9IENyZWF0ZUZpbGUoZmlsZW5hbWUsICAgICAgICAgIC8qIHBvaW50ZXIgdG8gbmFtZSBvZiB0aGUgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBHRU5FUklDX1JFQUQsICAgICAgLyogYWNjZXNzIChyZWFkLXdyaXRlKSBtb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgIEZJTEVfU0hBUkVfUkVBRCwgICAvKiBzaGFyZSBtb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIHNlY3VyaXR5IGF0dHJpYnV0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgT1BFTl9FWElTVElORywgICAgIC8qIGhvdyB0byBjcmVhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgRklMRV9GTEFHX09WRVJMQVBQRUQgfCBGSUxFX0ZMQUdfU0VRVUVOVElBTF9TQ0FOLCAvKiBmaWxlIGF0dHJpYnV0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7ICAgICAgICAgICAgLyogaGFuZGxlIHRvIGZpbGUgd2l0aCBhdHRyaWJ1dGVzIHRvIGNvcHkgKi8KLSAgICBpZiAoaEZpbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLSAgICAgICAgcnYgPSBhcF9wdXRfb3NfZmlsZShmaWxlLCAmaEZpbGUsIGNvbnRleHQpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcnYgPSBHZXRMYXN0RXJyb3IoKTsKLSAgICAgICAgKmZpbGUgPSBOVUxMOwotICAgIH0KLSNlbHNlCi0gICAgcnYgPSBhcF9vcGVuKGZpbGUsIGZpbGVuYW1lLCBmbGcxLCBmbGcyLCBjb250ZXh0KTsKLSNlbmRpZgotCi0gICAgcmV0dXJuIHJ2OwotfQotCi1hcF9zdGF0dXNfdCBjbGVhbnVwX21tYXAodm9pZCAqc2NvbmZ2KQotewotICAgIGFfc2VydmVyX2NvbmZpZyAqc2NvbmYgPSBzY29uZnY7Ci0gICAgc2l6ZV90IG47Ci0gICAgYV9maWxlICpmaWxlOwotCi0gICAgbiA9IHNjb25mLT5maWxlcy0+bmVsdHM7Ci0gICAgZmlsZSA9IChhX2ZpbGUgKilzY29uZi0+ZmlsZXMtPmVsdHM7Ci0gICAgd2hpbGUobikgewotI2lmIDEKLSAgICAgICAgYXBfY2xvc2UoZmlsZS0+ZmlsZSk7Ci0jZWxzZQotICAgICAgICBhcF9tbWFwX2RlbGV0ZShmaWxlLT5tbSk7Ci0jZW5kaWYKLSAgICAgICAgKytmaWxlOwotICAgICAgICAtLW47Ci0gICAgfQotICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmNhY2hlZmlsZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmZpbGVuYW1lKQotewotICAgIGFfc2VydmVyX2NvbmZpZyAqc2NvbmY7Ci0gICAgYV9maWxlICpuZXdfZmlsZTsKLSAgICBhX2ZpbGUgdG1wOwotICAgIGFwX2ZpbGVfdCAqZmQgPSBOVUxMOwotI2lmIDAKLSAgICBjYWRkcl90IG1tOwotI2VuZGlmCi0gICAgYXBfc3RhdHVzX3QgcmM7Ci0gICAgLyogY2Fub25pY2FsaXplIHRoZSBmaWxlIG5hbWUgKi8KLSAgICAvKiBvc19jYW5vbmljYWwuLi4gKi8KLSAgICBpZiAoYXBfc3RhdCgmdG1wLmZpbmZvLCBmaWxlbmFtZSwgTlVMTCkgIT0gQVBSX1NVQ0NFU1MpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIGNtZC0+c2VydmVyLAotCSAgICAiZmlsZV9jYWNoZTogdW5hYmxlIHRvIHN0YXQoJXMpLCBza2lwcGluZyIsIGZpbGVuYW1lKTsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKHRtcC5maW5mby5maWxldHlwZSAhPSBBUFJfUkVHKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBjbWQtPnNlcnZlciwKLQkgICAgImZpbGVfY2FjaGU6ICVzIGlzbid0IGEgcmVndWxhciBmaWxlLCBza2lwcGluZyIsIGZpbGVuYW1lKTsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgLyogTm90ZTogb3Blbl9maWxlIHNob3VsZCBjYWxsIGFwX29wZW4gZm9yIFVuaXggYW5kIENyZWF0ZUZpbGUgZm9yIFdpbmRvd3MuCi0gICAgICogVGhlIFdpbmRvd3MgZmlsZSBuZWVkcyB0byBiZSBvcGVuZWQgZm9yIGFzeW5jIEkvTyB0byBhbGxvdyBtdWx0aXBsZSB0aHJlYWRzCi0gICAgICogdG8gc2VydmUgaXQgdXAgYXQgb25jZS4KLSAgICAgKi8KLSAgICByYyA9IG9wZW5fZmlsZSgmZmQsIGZpbGVuYW1lLCBBUFJfUkVBRCwgQVBSX09TX0RFRkFVTFQsIGNtZC0+cG9vbCk7IC8vY29udGV4dCk7Ci0gICAgaWYgKHJjICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCByYywgY21kLT5zZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAiZmlsZV9jYWNoZTogdW5hYmxlIHRvIG9wZW4oJXMsIE9fUkRPTkxZKSwgc2tpcHBpbmciLCBmaWxlbmFtZSk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotI2lmIDEKLSAgICB0bXAuZmlsZSA9IGZkOwotI2Vsc2UKLSAgICBpZiAoYXBfbW1hcF9jcmVhdGUoJnRtcC5tbSwgZmQsIDAsIHRtcC5maW5mby5zdF9zaXplLCBjb250ZXh0KSAhPSBBUFJfU1VDQ0VTUykgewotCWludCBzYXZlX2Vycm5vID0gZXJybm87Ci0JYXBfY2xvc2UoZmQpOwotCWVycm5vID0gc2F2ZV9lcnJubzsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIGNtZC0+c2VydmVyLAotCSAgICAiZmlsZV9jYWNoZTogdW5hYmxlIHRvIG1tYXAgJXMsIHNraXBwaW5nIiwgZmlsZW5hbWUpOwotCXJldHVybiBOVUxMOwotICAgIH0KLSAgICBhcF9jbG9zZShmZCk7Ci0jZW5kaWYKLSAgICB0bXAuZmlsZW5hbWUgPSBhcF9wc3RyZHVwKGNtZC0+cG9vbCwgZmlsZW5hbWUpOwotICAgIHNjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcoY21kLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsICZmaWxlX2NhY2hlX21vZHVsZSk7Ci0gICAgbmV3X2ZpbGUgPSBhcF9wdXNoX2FycmF5KHNjb25mLT5maWxlcyk7Ci0gICAgKm5ld19maWxlID0gdG1wOwotICAgIGlmIChzY29uZi0+ZmlsZXMtPm5lbHRzID09IDEpIHsKLQkvKiBmaXJzdCBvbmUsIHJlZ2lzdGVyIHRoZSBjbGVhbnVwICovCi0JYXBfcmVnaXN0ZXJfY2xlYW51cChjbWQtPnBvb2wsIHNjb25mLCBjbGVhbnVwX21tYXAsIGFwX251bGxfY2xlYW51cCk7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi0jaWZkZWYgV0lOMzIKLS8qIFdpbmRvd3MgZG9lc24ndCBoYXZlIGlub2Rlcy4gVGhpcyBpZmRlZiBzaG91bGQgYmUgY2hhbmdlZCB0byAKLSAqIHNvbWV0aGluZyBsaWtlIEhBVkVfSU5PREVTCi0gKi8KLXN0YXRpYyBpbnQgZmlsZV9jb21wYXJlKGNvbnN0IHZvaWQgKmF2LCBjb25zdCB2b2lkICpidikKLXsKLSAgICBjb25zdCBhX2ZpbGUgKmEgPSBhdjsKLSAgICBjb25zdCBhX2ZpbGUgKmIgPSBidjsKLQotICAgIHJldHVybiBzdHJjbXAoYS0+ZmlsZW5hbWUsIGItPmZpbGVuYW1lKTsKLX0KLSNlbHNlCi1zdGF0aWMgaW50IGlub2RlX2NvbXBhcmUoY29uc3Qgdm9pZCAqYXYsIGNvbnN0IHZvaWQgKmJ2KQotewotICAgIGNvbnN0IGFfZmlsZSAqYSA9ICooYV9maWxlICoqKWF2OwotICAgIGNvbnN0IGFfZmlsZSAqYiA9ICooYV9maWxlICoqKWJ2OwotICAgIGxvbmcgYzsKLQotICAgIGMgPSBhLT5maW5mby5zdF9pbm8gLSBiLT5maW5mby5zdF9pbm87Ci0gICAgaWYgKGMgPT0gMCkgewotCXJldHVybiBhLT5maW5mby5zdF9kZXYgLSBiLT5maW5mby5zdF9kZXY7Ci0gICAgfQotICAgIHJldHVybiBjOwotfQotI2VuZGlmCi1zdGF0aWMgdm9pZCBmaWxlX2NhY2hlX3Bvc3RfY29uZmlnKGFwX3Bvb2xfdCAqcCwgYXBfcG9vbF90ICpwbG9nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9wb29sX3QgKnB0ZW1wLCBzZXJ2ZXJfcmVjICpzKQotewotICAgIGFfc2VydmVyX2NvbmZpZyAqc2NvbmY7Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKmlub2RlczsKLSAgICBhX2ZpbGUgKmVsdHM7Ci0gICAgaW50IG5lbHRzOwotICAgIGludCBpOwotICAgIAotICAgIGNvbnRleHQgPSBwOyAgICAKLSAgICAvKiBzb3J0IHRoZSBlbGVtZW50cyBvZiB0aGUgbWFpbl9zZXJ2ZXIsIGJ5IGZpbGVuYW1lICovCi0gICAgc2NvbmYgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAmZmlsZV9jYWNoZV9tb2R1bGUpOwotICAgIGVsdHMgPSAoYV9maWxlICopc2NvbmYtPmZpbGVzLT5lbHRzOwotICAgIG5lbHRzID0gc2NvbmYtPmZpbGVzLT5uZWx0czsKLSAgICBxc29ydChlbHRzLCBuZWx0cywgc2l6ZW9mKGFfZmlsZSksIGZpbGVfY29tcGFyZSk7Ci0KLSAgICAvKiBidWlsZCBhbiBpbmRleCBieSBpbm9kZSBhcyB3ZWxsLCBzcGVlZHMgdXAgdGhlIHNlYXJjaCBpbiB0aGUgaGFuZGxlciAqLwotI2lmbmRlZiBXSU4zMgotICAgIGlub2RlcyA9IGFwX21ha2VfYXJyYXkocCwgbmVsdHMsIHNpemVvZihhX2ZpbGUgKikpOwotICAgIHNjb25mLT5pbm9kZV9zb3J0ZWQgPSBpbm9kZXM7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5lbHRzOyArK2kpIHsKLQkqKGFfZmlsZSAqKilhcF9wdXNoX2FycmF5KGlub2RlcykgPSAmZWx0c1tpXTsKLSAgICB9Ci0gICAgcXNvcnQoaW5vZGVzLT5lbHRzLCBuZWx0cywgc2l6ZW9mKGFfZmlsZSAqKSwgaW5vZGVfY29tcGFyZSk7Ci0jZW5kaWYKLSAgICAvKiBhbmQgbWFrZSB0aGUgdmlydHVhbGhvc3RzIHNoYXJlIHRoZSBzYW1lIHRoaW5nICovCi0gICAgZm9yIChzID0gcy0+bmV4dDsgczsgcyA9IHMtPm5leHQpIHsKLQlhcF9zZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAmZmlsZV9jYWNoZV9tb2R1bGUsIHNjb25mKTsKLSAgICB9Ci19Ci0KLS8qIElmIGl0J3Mgb25lIG9mIG91cnMsIGZpbGwgaW4gci0+ZmluZm8gbm93IHRvIGF2b2lkIGV4dHJhIHN0YXQoKS4uLiB0aGlzIGlzIGEKLSAqIGJpdCBvZiBhIGtsdWRnZSwgYmVjYXVzZSB3ZSByZWFsbHkgd2FudCB0byBydW4gYWZ0ZXIgY29yZV90cmFuc2xhdGUgcnVucy4KLSAqLwotaW50IGNvcmVfdHJhbnNsYXRlX2NvcHkocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgdm9pZCAqc2NvbmYgPSByLT5zZXJ2ZXItPm1vZHVsZV9jb25maWc7Ci0gICAgY29yZV9zZXJ2ZXJfY29uZmlnICpjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcoc2NvbmYsICZjb3JlX21vZHVsZSk7Ci0gIAotICAgIGlmIChyLT5wcm94eXJlcSkgewotICAgICAgICByZXR1cm4gSFRUUF9GT1JCSURERU47Ci0gICAgfQotICAgIGlmICgoci0+dXJpWzBdICE9ICcvJykgJiYgc3RyY21wKHItPnVyaSwgIioiKSkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFVSSSBpbiByZXF1ZXN0ICVzIiwgci0+dGhlX3JlcXVlc3QpOwotICAgICAgICByZXR1cm4gQkFEX1JFUVVFU1Q7Ci0gICAgfQotICAgIAotICAgIGlmIChyLT5zZXJ2ZXItPnBhdGggCi0gICAgICAgICYmICFzdHJuY21wKHItPnVyaSwgci0+c2VydmVyLT5wYXRoLCByLT5zZXJ2ZXItPnBhdGhsZW4pCi0gICAgICAgICYmIChyLT5zZXJ2ZXItPnBhdGhbci0+c2VydmVyLT5wYXRobGVuIC0gMV0gPT0gJy8nCi0gICAgICAgICAgICB8fCByLT51cmlbci0+c2VydmVyLT5wYXRobGVuXSA9PSAnLycKLSAgICAgICAgICAgIHx8IHItPnVyaVtyLT5zZXJ2ZXItPnBhdGhsZW5dID09ICdcMCcpKSB7Ci0gICAgICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCBjb25mLT5hcF9kb2N1bWVudF9yb290LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHItPnVyaSArIHItPnNlcnZlci0+cGF0aGxlbiksIE5VTEwpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogTWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90IG1lc3MgdXAgdGhlIHRyYW5zbGF0aW9uIGJ5IGFkZGluZyB0d28KLSAgICAgICAgICogLydzIGluIGEgcm93LiAgVGhpcyBoYXBwZW5zIHVuZGVyIHdpbmRvd3Mgd2hlbiB0aGUgZG9jdW1lbnQKLSAgICAgICAgICogcm9vdCBlbmRzIHdpdGggYSAvCi0gICAgICAgICAqLwotICAgICAgICBpZiAoKGNvbmYtPmFwX2RvY3VtZW50X3Jvb3Rbc3RybGVuKGNvbmYtPmFwX2RvY3VtZW50X3Jvb3QpLTFdID09ICcvJykKLSAgICAgICAgICAgICYmICgqKHItPnVyaSkgPT0gJy8nKSkgewotICAgICAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIGNvbmYtPmFwX2RvY3VtZW50X3Jvb3QsIHItPnVyaSsxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIGNvbmYtPmFwX2RvY3VtZW50X3Jvb3QsIHItPnVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLX0KLXN0YXRpYyBpbnQgZmlsZV9jYWNoZV94bGF0KHJlcXVlc3RfcmVjICpyKQotewotICAgIGFfc2VydmVyX2NvbmZpZyAqc2NvbmY7Ci0gICAgYV9maWxlIHRtcDsKLSAgICBhX2ZpbGUgKm1hdGNoOwotICAgIGludCByZXM7Ci0KLSNpZmRlZiBXSU4zMgotLyoKLSAqIFRoaXMgaXMgcmVhbGx5IGJyb2tlbiBvbiBXaW5kb3dzLiBUaGUgY2FsbCB0byBnZXQgdGhlIGNvcmVfbW9kdWxlIGNvbmZpZwotICogaW4gY29yZV90cmFuc2xhdGVfY29weSBzZWcgZmF1bHRzIGJlY2F1c2UgJ2NvcmVfbW9kdWxlJyBpcyBub3QgZXhwb3J0ZWQgCi0gKiBwcm9wZXJseSBhbmQgbmVlZHMgYSB0aHVuay4KLSAqIFdpbGwgYmUgZml4ZWQgd2hlbiB3ZSBnZXQgQVBJX1ZBUl9FWFBPUlRTIHdvcmtpbmcgY29ycmVjdGx5IGFnYWluICAgIAotICovCi0gICAgcmV0dXJuIERFQ0xJTkVEOwotI2VuZGlmCi0KLSAgICBzY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgJmZpbGVfY2FjaGVfbW9kdWxlKTsKLQotICAgIC8qIHdlIG9ubHkgb3BlcmF0ZSB3aGVuIGF0IGxlYXN0IG9uZSBjYWNoZWZpbGUgZGlyZWN0aXZlIHdhcyB1c2VkICovCi0gICAgaWYgKGFwX2lzX2VtcHR5X3RhYmxlKHNjb25mLT5maWxlcykpCi0JcmV0dXJuIERFQ0xJTkVEOwotCi0gICAgcmVzID0gY29yZV90cmFuc2xhdGVfY29weShyKTsKLSAgICBpZiAocmVzID09IERFQ0xJTkVEIHx8ICFyLT5maWxlbmFtZSkgewotCXJldHVybiByZXM7Ci0gICAgfQotICAgIGlmICghci0+ZmlsZW5hbWUpCi0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB0bXAuZmlsZW5hbWUgPSByLT5maWxlbmFtZTsKLSAgICBtYXRjaCA9IChhX2ZpbGUgKilic2VhcmNoKCZ0bXAsIHNjb25mLT5maWxlcy0+ZWx0cywgc2NvbmYtPmZpbGVzLT5uZWx0cywKLQlzaXplb2YoYV9maWxlKSwgZmlsZV9jb21wYXJlKTsKLSAgICBpZiAobWF0Y2ggPT0gTlVMTCkKLQkgICAgcmV0dXJuIERFQ0xJTkVEOwotCi0gICAgLyogc2hvcnRjaXJjdWl0IHRoZSBnZXRfcGF0aF9pbmZvKCkgc3RhdCgpIGNhbGxzIGFuZCBzdHVmZiAqLwotICAgIHItPmZpbmZvID0gbWF0Y2gtPmZpbmZvOwotICAgIHJldHVybiBPSzsKLX0KLQotCi1zdGF0aWMgaW50IGZpbGVfY2FjaGVfaGFuZGxlcihyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBhX3NlcnZlcl9jb25maWcgKnNjb25mOwotICAgIGFfZmlsZSB0bXA7Ci0gICAgYV9maWxlICpwdG1wOwotICAgIGFfZmlsZSAqKnBtYXRjaDsKLSAgICBhX2ZpbGUgKm1hdGNoOwotICAgIGludCByYW5nZXN0YXR1cywgZXJyc3RhdHVzOwotCi0gICAgLyogd2UgZG9uJ3QgaGFuZGxlIGFueXRoaW5nIGJ1dCBHRVQgKi8KLSAgICBpZiAoci0+bWV0aG9kX251bWJlciAhPSBNX0dFVCkgcmV0dXJuIERFQ0xJTkVEOwotCi0gICAgLyogZmlsZSBkb2Vzbid0IGV4aXN0LCB3ZSB3b24ndCBiZSBkZWFsaW5nIHdpdGggaXQgKi8KLSAgICBpZiAoci0+ZmluZm8ucHJvdGVjdGlvbiA9PSAwKSByZXR1cm4gREVDTElORUQ7Ci0KLSAgICBzY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgJmZpbGVfY2FjaGVfbW9kdWxlKTsKLSNpZmRlZiBXSU4zMgotICAgIHRtcC5maWxlbmFtZSA9IHItPmZpbGVuYW1lOwotI2Vsc2UKLSAgICB0bXAuZmluZm8uc3RfZGV2ID0gci0+ZmluZm8uc3RfZGV2OwotICAgIHRtcC5maW5mby5zdF9pbm8gPSByLT5maW5mby5zdF9pbm87Ci0jZW5kaWYKLSAgICBwdG1wID0gJnRtcDsKLSNpZmRlZiBXSU4zMgotICAgIG1hdGNoID0gKGFfZmlsZSAqKWJzZWFyY2gocHRtcCwgc2NvbmYtPmZpbGVzLT5lbHRzLAotCXNjb25mLT5maWxlcy0+bmVsdHMsIHNpemVvZihhX2ZpbGUpLCBmaWxlX2NvbXBhcmUpOwotICAgIGlmIChtYXRjaCA9PSBOVUxMKSB7Ci0JcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLSNlbHNlCi0gICAgcG1hdGNoID0gKGFfZmlsZSAqKilic2VhcmNoKCZwdG1wLCBzY29uZi0+aW5vZGVfc29ydGVkLT5lbHRzLAotCXNjb25mLT5pbm9kZV9zb3J0ZWQtPm5lbHRzLCBzaXplb2YoYV9maWxlICopLCBpbm9kZV9jb21wYXJlKTsKLSAgICBpZiAocG1hdGNoID09IE5VTEwpIHsKLQlyZXR1cm4gREVDTElORUQ7Ci0gICAgfQotICAgIG1hdGNoID0gKnBtYXRjaDsKLSNlbmRpZgotCi0gICAgLyogbm90ZSB0aGF0IHdlIHdvdWxkIGhhbmRsZSBHRVQgb24gdGhpcyByZXNvdXJjZSAqLwotICAgIHItPmFsbG93ZWQgfD0gKDEgPDwgTV9HRVQpOwotCi0gICAgLyogVGhpcyBoYW5kbGVyIGhhcyBubyB1c2UgZm9yIGEgcmVxdWVzdCBib2R5ICh5ZXQpLCBidXQgd2Ugc3RpbGwKLSAgICAgKiBuZWVkIHRvIHJlYWQgYW5kIGRpc2NhcmQgaXQgaWYgdGhlIGNsaWVudCBzZW50IG9uZS4KLSAgICAgKi8KLSAgICBpZiAoKGVycnN0YXR1cyA9IGFwX2Rpc2NhcmRfcmVxdWVzdF9ib2R5KHIpKSAhPSBPSykKLSAgICAgICAgcmV0dXJuIGVycnN0YXR1czsKLQotICAgIGFwX3VwZGF0ZV9tdGltZShyLCBtYXRjaC0+ZmluZm8ubXRpbWUpOwotICAgIGFwX3NldF9sYXN0X21vZGlmaWVkKHIpOwotICAgIGFwX3NldF9ldGFnKHIpOwotICAgIGlmICgoKGVycnN0YXR1cyA9IGFwX21lZXRzX2NvbmRpdGlvbnMocikpICE9IE9LKQotCXx8IChlcnJzdGF0dXMgPSBhcF9zZXRfY29udGVudF9sZW5ndGggKHIsIG1hdGNoLT5maW5mby5zaXplKSkpIHsKLQkgICAgcmV0dXJuIGVycnN0YXR1czsKLSAgICB9Ci0KLSAgICByYW5nZXN0YXR1cyA9IGFwX3NldF9ieXRlcmFuZ2Uocik7Ci0gICAgYXBfc2VuZF9odHRwX2hlYWRlcihyKTsKLQotICAgIGlmICghci0+aGVhZGVyX29ubHkpIHsKLSAgICAgICAgbG9uZyBsZW5ndGggPSBtYXRjaC0+ZmluZm8uc2l6ZTsKLSAgICAgICAgYXBfb2ZmX3Qgb2Zmc2V0ID0gMDsKLSNpZiAxCi0gICAgICAgIC8qIGFwX2JmbHVzaChyLT5jb25uZWN0aW9uLT5jbGllbnQtPik7ICovCi0gICAgICAgIHN0cnVjdCBpb3ZlYyBpb3Y7Ci0gICAgICAgIGFwX2hkdHJfdCBoZHRyOwotICAgICAgICBhcF9oZHRyX3QgKnBoZHRyID0gJmhkdHI7Ci0KLSAgICAgICAgLyogZnJvYiB0aGUgY2xpZW50IGJ1ZmZlciAqLwotICAgICAgICBpb3YuaW92X2Jhc2UgPSByLT5jb25uZWN0aW9uLT5jbGllbnQtPm91dGJhc2U7Ci0gICAgICAgIGlvdi5pb3ZfbGVuID0gIHItPmNvbm5lY3Rpb24tPmNsaWVudC0+b3V0Y250OwotICAgICAgICByLT5jb25uZWN0aW9uLT5jbGllbnQtPm91dGNudCA9IDA7Ci0KLSAgICAgICAgLyogaW5pdGlhbGl6ZSB0aGUgYXBfaGR0cl90IHN0cnVjdCAqLwotICAgICAgICBwaGR0ci0+aGVhZGVycyA9ICZpb3Y7Ci0gICAgICAgIHBoZHRyLT5udW1oZWFkZXJzID0gMTsKLSAgICAgICAgcGhkdHItPnRyYWlsZXJzID0gTlVMTDsKLSAgICAgICAgcGhkdHItPm51bXRyYWlsZXJzID0gMDsKLQotCWlmICghcmFuZ2VzdGF0dXMpIHsKLSAgICAgICAgICAgIGlvbF9zZW5kZmlsZShyLT5jb25uZWN0aW9uLT5jbGllbnQtPmlvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaC0+ZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwaGR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0JfQotCWVsc2UgewotCSAgICB3aGlsZSAoYXBfZWFjaF9ieXRlcmFuZ2UociwgJm9mZnNldCwgJmxlbmd0aCkpIHsKLSAgICAgICAgICAgICAgICBpb2xfc2VuZGZpbGUoci0+Y29ubmVjdGlvbi0+Y2xpZW50LT5pb2wsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaC0+ZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhkdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICAgICAgICAgIHBoZHRyID0gTlVMTDsKLQkgICAgfQotCX0KLSNlbHNlCi0JaWYgKCFyYW5nZXN0YXR1cykgewotCSAgICBhcF9zZW5kX21tYXAgKG1hdGNoLT5tbSwgciwgMCwgbWF0Y2gtPmZpbmZvLnN0X3NpemUpOwotCX0KLQllbHNlIHsKLQkgICAgd2hpbGUgKGFwX2VhY2hfYnl0ZXJhbmdlKHIsICZvZmZzZXQsICZsZW5ndGgpKSB7Ci0JCWFwX3NlbmRfbW1hcChtYXRjaC0+bW0sIHIsIG9mZnNldCwgbGVuZ3RoKTsKLQkgICAgfQotCX0KLSNlbmRpZgotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdGljIGNvbW1hbmRfcmVjIG1tYXBfY21kc1tdID0KLXsKLSAgICB7ImNhY2hlZmlsZSIsIGNhY2hlZmlsZSwgTlVMTCwgUlNSQ19DT05GLCBJVEVSQVRFLAotICAgICAiQSBzcGFjZSBzZXBlcmF0ZWQgbGlzdCBvZiBmaWxlcyB0byBtbWFwIGF0IGNvbmZpZyB0aW1lIn0sCi0gICAge05VTEx9Ci19OwotCi1zdGF0aWMgdm9pZCByZWdpc3Rlcl9ob29rcyh2b2lkKQotewotICAgIC8qIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBhc3pQcmVbXT17Imh0dHBfY29yZS5jIixOVUxMfTsgKi8KLSAgICAvKiBhcF9ob29rX3ByZV9jb25maWcocHJlX2NvbmZpZyxOVUxMLE5VTEwsSE9PS19NSURETEUpOyAqLwotICAgIGFwX2hvb2tfcG9zdF9jb25maWcoZmlsZV9jYWNoZV9wb3N0X2NvbmZpZywgTlVMTCwgTlVMTCwgSE9PS19NSURETEUpOwotICAgIGFwX2hvb2tfdHJhbnNsYXRlX25hbWUoZmlsZV9jYWNoZV94bGF0LCBOVUxMLCBOVUxMLCBIT09LX01JRERMRSk7Ci0gICAgLyogVGhpcyB0cmljayBkb2Vzbid0IHdvcmsgYXBwYXJlbnRseSBiZWNhdXNlIHRoZSB0cmFuc2xhdGUgaG9va3MKLSAgICAgICBhcmUgc2luZ2xlIHNob3QuIElmIHRoZSBjb3JlX2hvb2sgcmV0dXJucyBPSywgdGhlbiBvdXIgaG9vayBpcyAKLSAgICAgICBub3QgY2FsbGVkLgotICAgIGFwX2hvb2tfdHJhbnNsYXRlX25hbWUoZmlsZV9jYWNoZV94bGF0LCBhc3pQcmUsIE5VTEwsIEhPT0tfTUlERExFKTsgCi0gICAgKi8KLQotfTsKLQotc3RhdGljIGNvbnN0IGhhbmRsZXJfcmVjIGZpbGVfY2FjaGVfaGFuZGxlcnNbXSA9Ci17Ci0gICAgeyAiKi8qIiwgZmlsZV9jYWNoZV9oYW5kbGVyIH0sCi0gICAgeyBOVUxMIH0KLX07Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBmaWxlX2NhY2hlX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBtZXJnZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgY3JlYXRlX3NlcnZlcl9jb25maWcsICAgICAvKiBjcmVhdGUgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBtZXJnZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgbW1hcF9jbWRzLCAgICAgICAgICAgICAgICAvKiBjb21tYW5kIGhhbmRsZXJzICovCi0gICAgZmlsZV9jYWNoZV9oYW5kbGVycywgICAgICAvKiBoYW5kbGVycyAqLwotICAgIHJlZ2lzdGVyX2hvb2tzICAgICAgICAgICAgLyogcmVnaXN0ZXIgaG9va3MgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL2NhY2hlL21vZF9maWxlX2NhY2hlLmRzcCBiL21vZHVsZXMvY2FjaGUvbW9kX2ZpbGVfY2FjaGUuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWExMGJmLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvY2FjaGUvbW9kX2ZpbGVfY2FjaGUuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJBcGFjaGVNb2R1bGVGaWxlQ2FjaGUiIC0gUGFja2FnZSBPd25lcj08ND4KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDUuMDAKLSMgKiogRE8gTk9UIEVESVQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDEwMgotCi1DRkc9QXBhY2hlTW9kdWxlRmlsZUNhY2hlIC0gV2luMzIgRGVidWcKLSFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiQXBhY2hlTW9kdWxlRmlsZUNhY2hlLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiQXBhY2hlTW9kdWxlRmlsZUNhY2hlLm1hayJcCi0gQ0ZHPSJBcGFjaGVNb2R1bGVGaWxlQ2FjaGUgLSBXaW4zMiBEZWJ1ZyIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJBcGFjaGVNb2R1bGVGaWxlQ2FjaGUgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb25cCi0gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFICJBcGFjaGVNb2R1bGVGaWxlQ2FjaGUgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uXAotICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotTVRMPW1pZGwuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIkFwYWNoZU1vZHVsZUZpbGVDYWNoZSAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICIuXEFwYWNoZU1vZHVsZUZpbGVDYWNoZVIiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVNb2R1bGVGaWxlQ2FjaGVSIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9JICIuLlwuLlxpbmNsdWRlIiAvSSAiLlxcIiAvSSAiLi5cLi5cbGliXGFwclxpbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIlNIQVJFRF9NT0RVTEUiIC9GRCAvYwotIyBTVUJUUkFDVCBDUFAgL1lYCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIEFwYWNoZUNvcmUubGliIGFwcmxpYi5saWIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvbWFjaGluZTpJMzg2IC9saWJwYXRoOiIuLlwuLlxDb3JlUiIgL2xpYnBhdGg6Ii4uXC4uXGxpYlxhcHJcUmVsZWFzZSIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFwYWNoZU1vZHVsZUZpbGVDYWNoZSAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICIuXEFwYWNoZU1vZHVsZUZpbGVDYWNoZUQiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVNb2R1bGVGaWxlQ2FjaGVEIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9JICIuLlwuLlxpbmNsdWRlIiAvSSAiLlxcIiAvSSAiLi5cLi5cbGliXGFwclxpbmNsdWRlIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIlNIQVJFRF9NT0RVTEUiIC9GRCAvYwotIyBTVUJUUkFDVCBDUFAgL1lYCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLSMgQUREIExJTkszMiBBcGFjaGVDb3JlLmxpYiBhcHJsaWIubGliIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9pbmNyZW1lbnRhbDpubyAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQgL2xpYnBhdGg6Ii4uXC4uXENvcmVEIiAvbGlicGF0aDoiLi5cLi5cbGliXGFwclxEZWJ1ZyIKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIkFwYWNoZU1vZHVsZUZpbGVDYWNoZSAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgIkFwYWNoZU1vZHVsZUZpbGVDYWNoZSAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cbW9kdWxlc1xzdGFuZGFyZFxtb2RfZmlsZV9jYWNoZS5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9tb2R1bGVzL2NhY2hlL21vZF9maWxlX2NhY2hlLmV4cCBiL21vZHVsZXMvY2FjaGUvbW9kX2ZpbGVfY2FjaGUuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2IwOTJhLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvY2FjaGUvbW9kX2ZpbGVfY2FjaGUuZXhwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZmlsZV9jYWNoZV9tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvY29uZmlnNS5tNCBiL21vZHVsZXMvY29uZmlnNS5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FhNDBlYS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2NvbmZpZzUubTQKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIGV4dHJhIG1vZHVsZXMpCi1BQ19BUkdfV0lUSChtb2R1bGUsCi0gIFsgIC0td2l0aC1tb2R1bGU9bG9jYXRpb24gIEluY2x1ZGUgdGhlIHNwZWNpZmllZCBtb2R1bGUuICBsb2NhdGlvbiBpcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCB0byB0aGUgbmV3IG1vZHVsZS5dLAotICBbCi0gICAgbW9kdHlwZT1gZWNobyAkd2l0aHZhbCB8IHNlZCAtZSdzL1woLipcKTouKi9cMS8nYAotICAgIHBrZz1gZWNobyAkd2l0aHZhbCB8IHNlZCAtZSdzLy4qOlwoLipcKS9cMS8nYAotICAgIG1vZGZpbGVjPWBlY2hvICRwa2cgfCBzZWQgLWUgJ3M7Xi4qLzs7J2AKLSAgICBtb2RmaWxlbz1gZWNobyAkcGtnIHwgc2VkIC1lICdzO14uKi87OycgLWUgJ3M7XC5jJDsubzsnYAotCi0gICAgaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG1vZHVsZXMvJG1vZHR5cGUvJG1vZGZpbGVjIjsgdGhlbgotICAgICAgICBjcCAkcGtnIG1vZHVsZXMvJG1vZHR5cGUvJG1vZGZpbGVjCi0gICAgZmkKLSAgICBtb2R1bGU9YGVjaG8gJHBrZyB8IHNlZCAtZSAnczsuKi9tb2RfXCguKlwpLmM7XDE7J2AKLSAgICBvYmplY3RzPSJtb2RfJG1vZHVsZS5sbyIKLSAgICBsaWJuYW1lPSJtb2RfJG1vZHVsZS5sYSIKLSAgICBtb2RwYXRoX2N1cnJlbnQ9Im1vZHVsZXMvJG1vZHR5cGUiCi0gICAgQlVJTFRJTl9MSUJTPSIkQlVJTFRJTl9MSUJTICRtb2RwYXRoX2N1cnJlbnQvJGxpYm5hbWUiCi0gICAgaWYgdGVzdCAhIC1zICIkbW9kcGF0aF9jdXJyZW50L21vZHVsZXMubWsiOyB0aGVuCi0gICAgICBjYXQgPj4kbW9kcGF0aF9jdXJyZW50L21vZHVsZXMubWs8PEVPRgotJGxpYm5hbWU6ICRvYmplY3RzCi0JXCQoTU9EX0xJTkspICRvYmplY3RzCi1ESVNUQ0xFQU5fVEFSR0VUUyA9IG1vZHVsZXMubWsKLXN0YXRpYyA9ICRsaWJuYW1lCi1zaGFyZWQgPQotRU9GCi0gICAgZWxzZQotICAgICAgY2F0ID4+JG1vZHBhdGhfY3VycmVudC9tb2R1bGVzLm1rLnRtcDw8RU9GCi0kbGlibmFtZTogJG9iamVjdHMKLQlcJChNT0RfTElOSykgJG9iamVjdHMKLUVPRgotICAgICAgY2F0ICRtb2RwYXRoX2N1cnJlbnQvbW9kdWxlcy5tayA+PiAkbW9kcGF0aF9jdXJyZW50L21vZHVsZXMubWsudG1wCi0gICAgICBybSAkbW9kcGF0aF9jdXJyZW50L21vZHVsZXMubWsKLSAgICAgIG12ICRtb2RwYXRoX2N1cnJlbnQvbW9kdWxlcy5tay50bXAgJG1vZHBhdGhfY3VycmVudC9tb2R1bGVzLm1rCi0gICAgICBzZWQgLWUgInMvXChzdGF0aWMgPS4qXCkvXDEgJGxpYm5hbWUvIiAkbW9kcGF0aF9jdXJyZW50L21vZHVsZXMubWsgPiAkbW9kcGF0aF9jdXJyZW50L21vZHVsZXMubWsudG1wCi0gICAgICBybSAkbW9kcGF0aF9jdXJyZW50L21vZHVsZXMubWsKLSAgICAgIG12ICRtb2RwYXRoX2N1cnJlbnQvbW9kdWxlcy5tay50bXAgJG1vZHBhdGhfY3VycmVudC9tb2R1bGVzLm1rCi0gICAgZmkKLSAgICBNT0RMSVNUPSIkTU9ETElTVCAkbW9kdWxlIgotICBBQ19NU0dfUkVTVUxUKGFkZGVkICR3aXRodmFsKQotICBdLAotICBbIEFDX01TR19SRVNVTFQobm8gZXh0cmEgbW9kdWxlcykgCi0gIF0pCmRpZmYgLS1naXQgYS9tb2R1bGVzL2Rhdi9mcy8uY3ZzaWdub3JlIGIvbW9kdWxlcy9kYXYvZnMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJmN2E3MC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2Rhdi9mcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLmRlcHMKLS5saWJzCi0qLmxhCi1tb2R1bGVzLm1rCi1NYWtlZmlsZQotKi5sbwotKi5zbG8KLSouc28KLSouZGxsCi0qLmRlZgpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9kYXYvZnMvTWFrZWZpbGUuaW4gYi9tb2R1bGVzL2Rhdi9mcy9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE0OWI3NS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2Rhdi9mcy9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCi1MVExJQlJBUllfTkFNRSAgICA9IGxpYmFwYWNoZW1vZF9kYXZfZnMubGEKLUxUTElCUkFSWV9TT1VSQ0VTID0gZGJtLmMgbG9jay5jIHJlcG9zLmMKLQotaW5jbHVkZSAkKHRvcF9zcmNkaXIpL2J1aWxkL2x0bGliLm1rCmRpZmYgLS1naXQgYS9tb2R1bGVzL2Rhdi9mcy9OV0dOVW1ha2VmaWxlIGIvbW9kdWxlcy9kYXYvZnMvTldHTlVtYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIzYzBmYy4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2Rhdi9mcy9OV0dOVW1ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLSMKLSMgRGVjbGFyZSB0aGUgc3ViLWRpcmVjdG9yaWVzIHRvIGJlIGJ1aWx0IGhlcmUKLSMKLQotU1VCRElSUyA9IFwKLQkkKEVPTElTVCkgCi0KLSMKLSMgR2V0IHRoZSAnaGVhZCcgb2YgdGhlIGJ1aWxkIGVudmlyb25tZW50LiAgVGhpcyBpbmNsdWRlcyBkZWZhdWx0IHRhcmdldHMgYW5kCi0jIHBhdGhzIHRvIHRvb2xzCi0jCi0KLWluY2x1ZGUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jCi0KLSMKLSMgYnVpbGQgdGhpcyBsZXZlbCdzIGZpbGVzCi0KLSMKLSMgTWFrZSBzdXJlIGFsbCBuZWVkZWQgbWFjcm8ncyBhcmUgZGVmaW5lZAotIwotCi0jCi0jIFRoZXNlIGRpcmVjdG9yaWVzIHdpbGwgYmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5jbHVkZSBsaXN0LCBmb2xsb3dlZCBieQotIyBJTkNESVJTCi0jCi1YSU5DRElSUwkrPSBcCi0JCQkkKEFQX1dPUkspL3NyY2xpYi9hcHIvaW5jbHVkZSBcCi0JCQkkKEFQX1dPUkspL3NyY2xpYi9pbmNsdWRlL2FyY2gvTmV0V2FyZSBcCi0JCQkkKEFQX1dPUkspL3NyY2xpYi9hcHItdXRpbC9pbmNsdWRlIFwKLQkJCSQoQVBfV09SSykvaW5jbHVkZSBcCi0JCQkkKEFQX1dPUkspL29zL05ldFdhcmUgXAotCQkJJChBUF9XT1JLKS9zZXJ2ZXIvbXBtL05ldFdhcmUgXAotCQkJJChBUF9XT1JLKS9zcmNsaWIvcGNyZSBcCi0JCQkkKEFQX1dPUkspL21vZHVsZXMvZGF2L21haW4gXAotCQkJJChOV09TKSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBmbGFncyB3aWxsIGNvbWUgYWZ0ZXIgQ0ZMQUdTCi0jCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBkZWZpbmVzIHdpbGwgY29tZSBhZnRlciBERUZJTkVTCi0jCi1YREVGSU5FUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBmbGFncyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaW5rLm9wdCBmaWxlCi0jCi1YTEZMQUdTCQkrPSBcCi0JCQlYRENEYXRhICQoTldPUylcYXBhY2hlLnhkYyBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSB2YWx1ZXMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgY29ycmVjdCB2YXJpYWJsZXMgYmFzZWQgb24gdGhlIHZhbHVlIG9mCi0jIFJFTEVBU0UKLSMKLWlmZXEgIiQoUkVMRUFTRSkiICJkZWJ1ZyIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJICAgCSQoRU9MSVNUKQotZW5kaWYKLQotaWZlcSAiJChSRUxFQVNFKSIgIm5vb3B0IgotWElOQ0RJUlMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhDRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YREVGSU5FUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWExGTEFHUwkJKz0gXAotCQkgICAJJChFT0xJU1QpCi1lbmRpZgotCi1pZmVxICIkKFJFTEVBU0UpIiAicmVsZWFzZSIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotZW5kaWYKLQotIwotIyBUaGVzZSBhcmUgdXNlZCBieSB0aGUgbGluayB0YXJnZXQgaWYgYW4gTkxNIGlzIGJlaW5nIGdlbmVyYXRlZAotIyBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmsgJ25hbWUnIGRpcmVjdGl2ZSB0byBuYW1lIHRoZSBubG0uICBJZiBsZWZ0IGJsYW5rCi0jIFRBUkdFVF9ubG0gKHNlZSBiZWxvdykgd2lsbCBiZSB1c2VkLgotIwotTkxNX05BTUUJCT0gbW9kREFWRlMKLQotIwotIyBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmsgJy1kZXNjICcgZGlyZWN0aXZlLiAKLSMgSWYgbGVmdCBibGFuaywgTkxNX05BTUUgd2lsbCBiZSB1c2VkLgotIwotTkxNX0RFU0NSSVBUSU9OCT0gQXBhY2hlIERBVl9GUyBtb2R1bGUKLQotIwotIyBUaGlzIGlzIHVzZWQgYnkgdGhlICctdGhyZWFkbmFtZScgZGlyZWN0aXZlLiAgSWYgbGVmdCBibGFuaywKLSMgTkxNX05BTUUgVGhyZWFkIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9USFJFQURfTkFNRQk9IG1vZERBVkZTIFRocmVhZAotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlIFZFUlNJT04gdmFsdWUgaW4gCi0jICQoQVBfV09SSylcYnVpbGRcTldHTlVlbnZpcm9ubWVudC5pbmMKLSMKLU5MTV9WRVJTSU9OCQk9IAotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG9mIDY0SwotIwotTkxNX1NUQUNLX1NJWkUJPSA2NTUzNgotIAotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWVudHJ5JyBkaXJlY3RpdmUKLSMKLU5MTV9FTlRSWV9TWU0JPSBfTGliQ1ByZWx1ZGUKLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1leGl0JyBkaXJlY3RpdmUKLSMKLU5MTV9FWElUX1NZTQk9IF9MaWJDUG9zdGx1ZGUKLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1jaGVjaycgZGlyZWN0aXZlCi0jCi1OTE1fQ0hFQ0tfU1lNCT0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1mbGFncycgZGlyZWN0aXZlCi0jCi1OTE1fRkxBR1MJCT0gIEFVVE9VTkxPQUQsIFBTRVVET1BSRUVNUFRJT04KLQotIwotIyBEZWNsYXJlIGFsbCB0YXJnZXQgZmlsZXMgKHlvdSBtdXN0IGFkZCB5b3VyIGZpbGVzIGhlcmUpCi0jCi0KLSMKLSMgSWYgdGhlcmUgaXMgYW4gTkxNIHRhcmdldCwgcHV0IGl0IGhlcmUKLSMKLVRBUkdFVF9ubG0gPSBcCi0JJChPQkpESVIpL21vZGRhdmZzLm5sbSBcCi0JJChFT0xJU1QpCi0KLSMKLSMgSWYgdGhlcmUgaXMgYW4gTElCIHRhcmdldCwgcHV0IGl0IGhlcmUKLSMKLVRBUkdFVF9saWIgPSBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBPQkogZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTkxNIHRhcmdldCBhYm92ZS4KLSMgUGF0aHMgbXVzdCBhbGwgdXNlIHRoZSAnLycgY2hhcmFjdGVyCi0jCi1GSUxFU19ubG1fb2JqcyA9IFwKLQkkKE9CSkRJUikvbW9kX2Rhdl9mcy5vIFwKLQkkKE9CSkRJUikvZGJtLm8gXAotCSQoT0JKRElSKS9sb2NrLm8gXAotCSQoT0JKRElSKS9yZXBvcy5vIFwKLQkkKE9CSkRJUikvbGlicHJld3MubyBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBMSUIgZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTkxNIHRhcmdldCBhYm92ZS4KLSMgVGhlc2Ugd2lsbCBiZSBhZGRlZCBhcyBhIGxpYnJhcnkgY29tbWFuZCBpbiB0aGUgbGluay5vcHQgZmlsZS4KLSMKLUZJTEVTX25sbV9saWJzID0gXAotICAgCWxpYmNwcmUubyBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBtb2R1bGVzIHRoYXQgdGhlIGFib3ZlIE5MTSB0YXJnZXQgZGVwZW5kcyBvbiB0byBsb2FkLgotIyBUaGVzZSB3aWxsIGJlIGFkZGVkIGFzIGEgbW9kdWxlIGNvbW1hbmQgaW4gdGhlIGxpbmsub3B0IGZpbGUuCi0jCi1GSUxFU19ubG1fbW9kdWxlcyA9IFwKLQlBcGFjaGUyIFwKLQlMaWJjIFwKLQkkKEVPTElTVCkKLQotIwotIyBJZiB0aGUgbmxtIGhhcyBhIG1zZyBmaWxlLCBwdXQgaXQncyBwYXRoIGhlcmUKLSMKLUZJTEVfbmxtX21zZyA9Ci0gCi0jCi0jIElmIHRoZSBubG0gaGFzIGEgaGxwIGZpbGUgcHV0IGl0J3MgcGF0aCBoZXJlCi0jCi1GSUxFX25sbV9obHAgPQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlICQoTldPUylcY29weXJpZ2h0LnR4dC4KLSMKLUZJTEVfbmxtX2NvcHlyaWdodCA9Ci0KLSMKLSMgQW55IGFkZGl0aW9uYWwgaW1wb3J0cyBnbyBoZXJlCi0jCi1GSUxFU19ubG1fWGltcG9ydHMgPSBcCi0JQGxpYmMuaW1wIFwKLQlAJChBUFIpL2FwcmxpYi5pbXAgXAotCUBodHRwZC5pbXAgXAotCUB3czJubG0uaW1wIFwKLQlALi4vbWFpbi9kYXYuaW1wIFwKLQkkKEVPTElTVCkKLSAKLSMgICAKLSMgQW55IHN5bWJvbHMgZXhwb3J0ZWQgdG8gaGVyZQotIwotRklMRVNfbmxtX2V4cG9ydHMgPSBcCi0JZGF2X2ZzX21vZHVsZSBcCi0JJChFT0xJU1QpCi0JCi0jICAgCi0jIFRoZXNlIGFyZSB0aGUgT0JKIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIExJQiB0YXJnZXQgYWJvdmUuCi0jIFBhdGhzIG11c3QgYWxsIHVzZSB0aGUgJy8nIGNoYXJhY3RlcgotIwotRklMRVNfbGliX29ianMgPSBcCi0JCSQoRU9MSVNUKQotCi0jCi0jIGltcGxlbWVudCB0YXJnZXRzIGFuZCBkZXBlbmRhbmNpZXMgKGxlYXZlIHRoaXMgc2VjdGlvbiBhbG9uZSkKLSMKLQotbGlicyA6OiAkKE9CSkRJUikgJChUQVJHRVRfbGliKQotCi1ubG1zIDo6IGxpYnMgJChUQVJHRVRfbmxtKQotCi0jCi0jIFVwZGF0ZWQgdGhpcyB0YXJnZXQgdG8gY3JlYXRlIG5lY2Vzc2FyeSBkaXJlY3RvcmllcyBhbmQgY29weSBmaWxlcyB0byB0aGUgCi0jIGNvcnJlY3QgcGxhY2UuICAoU2VlICQoQVBfV09SSylcYnVpbGRcTldHTlVoZWFkLmluYyBmb3IgZXhhbXBsZXMpCi0jCi1pbnN0YWxsIDo6IG5sbXMgRk9SQ0UKLQljb3B5ICQoT0JKRElSKVxtb2RkYXZmcy5ubG0gJChJTlNUQUxMKVxBcGFjaGUyXG1vZHVsZXMKLSMKLSMgQW55IHNwZWNpYWxpemVkIHJ1bGVzIGhlcmUKLSMKLQotJChPQkpESVIpLyUubzogLi4vLi4vYXJjaC9uZXR3YXJlLyUuYyAkKE9CSkRJUilcY2Mub3B0Ci0JQGVjaG8gY29tcGlsaW5nICQ8Ci0JJChDQykgJDwgLW89JChPQkpESVIpXCQoQEYpIEAkKE9CSkRJUilcY2Mub3B0Ci0KLSMKLSMgSW5jbHVkZSB0aGUgJ3RhaWwnIG1ha2VmaWxlIHRoYXQgaGFzIHRhcmdldHMgdGhhdCBkZXBlbmQgb24gdmFyaWFibGVzIGRlZmluZWQKLSMgaW4gdGhpcyBtYWtlZmlsZQotIwotCi1pbmNsdWRlICQoQVBfV09SSylcYnVpbGRcTldHTlV0YWlsLmluYwotCi0KLQkKZGlmZiAtLWdpdCBhL21vZHVsZXMvZGF2L2ZzL2NvbmZpZzYubTQgYi9tb2R1bGVzL2Rhdi9mcy9jb25maWc2Lm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTRiMDJkLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZGF2L2ZzL2NvbmZpZzYubTQKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1kbmwgbW9kdWxlcyBlbmFibGVkIGluIHRoaXMgZGlyZWN0b3J5IGJ5IGRlZmF1bHQKLQotQVBBQ0hFX01PRFBBVEhfSU5JVChkYXYvZnMpCi0KLWRhdl9mc19vYmplY3RzPSJtb2RfZGF2X2ZzLmxvIGRibS5sbyBsb2NrLmxvIHJlcG9zLmxvIgotCi1kbmwgIyMjIHdlIHdhbnQgdG8gZGVmYXVsdCB0aGlzIGJhc2VkIG9uIHdoZXRoZXIgZGF2IGlzIGJlaW5nIHVzZWQuLi4KLWRubCAjIyMgYnV0IHRoZXJlIGlzIG5vIG9yZGVyaW5nIHRvIHRoZSBjb25maWcubTQgZmlsZXMgcmlnaHQgbm93Li4uCi1BUEFDSEVfTU9EVUxFKGRhdl9mcywgREFWIHByb3ZpZGVyIGZvciB0aGUgZmlsZXN5c3RlbSwgJGRhdl9mc19vYmplY3RzLCAsIG1vc3QpCi0KLUFQQUNIRV9NT0RQQVRIX0ZJTklTSApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9kYXYvZnMvZGJtLmMgYi9tb2R1bGVzL2Rhdi9mcy9kYm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY2OWJhNy4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2Rhdi9mcy9kYm0uYworKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi0vKgotKiogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAgR3JlZyBTdGVpbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoqCi0qKiBCeSB1c2luZyB0aGlzIGZpbGUsIHlvdSBhZ3JlZSB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgc2V0IGZvcnRoIGluCi0qKiB0aGUgTElDRU5TRS5odG1sIGZpbGUgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIG1vZF9kYXYKLSoqIGRpc3RyaWJ1dGlvbiBvciBhdCBodHRwOi8vd3d3LndlYmRhdi5vcmcvbW9kX2Rhdi9saWNlbnNlLTEuaHRtbC4KLSoqCi0qKiBDb250YWN0IGluZm9ybWF0aW9uOgotKiogICBHcmVnIFN0ZWluLCBQTyBCb3ggNzYwLCBQYWxvIEFsdG8sIENBLCA5NDMwMgotKiogICBnc3RlaW5AbHlyYS5vcmcsIGh0dHA6Ly93d3cud2ViZGF2Lm9yZy9tb2RfZGF2LwotKi8KLQotLyoKLSoqIERBViBleHRlbnNpb24gbW9kdWxlIGZvciBBcGFjaGUgMS4zLioKLSoqICAtIERhdGFiYXNlIHN1cHBvcnQgdXNpbmcgREJNLXN0eWxlIGRhdGFiYXNlcywKLSoqICAgIHBhcnQgb2YgdGhlIGZpbGVzeXN0ZW0gcmVwb3NpdG9yeSBpbXBsZW1lbnRhdGlvbgotKioKLSoqIFdyaXR0ZW4gYnkgR3JlZyBTdGVpbiwgZ3N0ZWluQGx5cmEub3JnLCBodHRwOi8vd3d3Lmx5cmEub3JnLwotKi8KLQotLyoKLSoqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBhIFNEQk0gb3IgR0RCTSBkYXRhYmFzZSBwZXIgZmlsZSBhbmQgZGlyZWN0b3J5IHRvCi0qKiByZWNvcmQgdGhlIHByb3BlcnRpZXMuIFRoZXNlIGRhdGFiYXNlcyBhcmUga2VwdCBpbiBhIHN1YmRpcmVjdG9yeSAob2YKLSoqIHRoZSBkaXJlY3RvcnkgaW4gcXVlc3Rpb24gb3IgdGhlIGRpcmVjdG9yeSB0aGF0IGhvbGRzIHRoZSBmaWxlIGluCi0qKiBxdWVzdGlvbikgbmFtZWQgYnkgdGhlIG1hY3JvIERBVl9GU19TVEFURV9ESVIgKC5EQVYpLiBUaGUgZmlsZW5hbWUgb2YgdGhlCi0qKiBkYXRhYmFzZSBpcyBlcXVpdmFsZW50IHRvIHRoZSB0YXJnZXQgZmlsZW5hbWUsIGFuZCBpcwotKiogREFWX0ZTX1NUQVRFX0ZJTEVfRk9SX0RJUiAoLnN0YXRlX2Zvcl9kaXIpIGZvciB0aGUgZGlyZWN0b3J5IGl0c2VsZi4KLSovCi0KLSNpZmRlZiBEQVZfVVNFX0dEQk0KLSNpbmNsdWRlIDxnZGJtLmg+Ci0jZWxzZQotI2luY2x1ZGUgPGZjbnRsLmg+CQkvKiBmb3IgT19SRE9OTFksIE9fV1JPTkxZICovCi0jaW5jbHVkZSAic2RibS9zZGJtLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgIm1vZF9kYXYuaCIKLSNpbmNsdWRlICJkYXZfZnNfcmVwb3MuaCIKLQotCi0jaWZkZWYgREFWX1VTRV9HREJNCi0KLXR5cGVkZWYgR0RCTV9GSUxFIGRhdl9kYm1fZmlsZTsKLQotI2RlZmluZSBEQVZfREJNX0NMT1NFKGYpCWdkYm1fY2xvc2UoZikKLSNkZWZpbmUgREFWX0RCTV9GRVRDSChmLCBrKQlnZGJtX2ZldGNoKChmKSwgKGspKQotI2RlZmluZSBEQVZfREJNX1NUT1JFKGYsIGssIHYpCWdkYm1fc3RvcmUoKGYpLCAoayksICh2KSwgR0RCTV9SRVBMQUNFKQotI2RlZmluZSBEQVZfREJNX0RFTEVURShmLCBrKQlnZGJtX2RlbGV0ZSgoZiksIChrKSkKLSNkZWZpbmUgREFWX0RCTV9GSVJTVEtFWShmKQlnZGJtX2ZpcnN0a2V5KGYpCi0jZGVmaW5lIERBVl9EQk1fTkVYVEtFWShmLCBrKQlnZGJtX25leHRrZXkoKGYpLCAoaykpCi0jZGVmaW5lIERBVl9EQk1fQ0xFQVJFUlIoZikJaWYgKDApIDsgZWxzZQkvKiBzdG9wICJubyBlZmZlY3QiIHdhcm5pbmcgKi8KLSNkZWZpbmUgREFWX0RCTV9GUkVFREFUVU0oZiwgZCkJKChkKS5kcHRyID8gZnJlZSgoZCkuZHB0cikgOiAwKQotCi0jZWxzZQotCi10eXBlZGVmIERCTSAqZGF2X2RibV9maWxlOwotCi0jZGVmaW5lIERBVl9EQk1fQ0xPU0UoZikJc2RibV9jbG9zZShmKQotI2RlZmluZSBEQVZfREJNX0ZFVENIKGYsIGspCXNkYm1fZmV0Y2goKGYpLCAoaykpCi0jZGVmaW5lIERBVl9EQk1fU1RPUkUoZiwgaywgdikJc2RibV9zdG9yZSgoZiksIChrKSwgKHYpLCBEQk1fUkVQTEFDRSkKLSNkZWZpbmUgREFWX0RCTV9ERUxFVEUoZiwgaykJc2RibV9kZWxldGUoKGYpLCAoaykpCi0jZGVmaW5lIERBVl9EQk1fRklSU1RLRVkoZikJc2RibV9maXJzdGtleShmKQotI2RlZmluZSBEQVZfREJNX05FWFRLRVkoZiwgaykJc2RibV9uZXh0a2V5KGYpCi0jZGVmaW5lIERBVl9EQk1fQ0xFQVJFUlIoZikJc2RibV9jbGVhcmVycihmKQotI2RlZmluZSBEQVZfREJNX0ZSRUVEQVRVTShmLCBkKQlpZiAoMCkgOyBlbHNlCS8qIHN0b3AgIm5vIGVmZmVjdCIgd2FybmluZyAqLwotCi0jZW5kaWYKLQotc3RydWN0IGRhdl9kYiB7Ci0gICAgcG9vbCAqcG9vbDsKLSAgICBkYXZfZGJtX2ZpbGUgZmlsZTsKLX07Ci0KLSNkZWZpbmUgRDJHKGQpCSgqKGRhdHVtKikmKGQpKQotCi0KLXZvaWQgZGF2X2RibV9nZXRfc3RhdGVmaWxlcyhwb29sICpwLCBjb25zdCBjaGFyICpmbmFtZSwKLQkJCSAgICBjb25zdCBjaGFyICoqc3RhdGUxLCBjb25zdCBjaGFyICoqc3RhdGUyKQotewotICAgIGNoYXIgKndvcms7Ci0KLSAgICBpZiAoZm5hbWUgPT0gTlVMTCkKLQlmbmFtZSA9IERBVl9GU19TVEFURV9GSUxFX0ZPUl9ESVI7Ci0KLSNpZm5kZWYgREFWX1VTRV9HREJNCi0gICAgZm5hbWUgPSBhcF9wc3RyY2F0KHAsIGZuYW1lLCBESVJGRVhULCBOVUxMKTsKLSNlbmRpZgotCi0gICAgKnN0YXRlMSA9IGZuYW1lOwotCi0jaWZkZWYgREFWX1VTRV9HREJNCi0gICAgKnN0YXRlMiA9IE5VTEw7Ci0jZWxzZQotICAgIHsKLQlpbnQgZXh0ZW5zaW9uOwotCi0Jd29yayA9IGFwX3BzdHJkdXAocCwgZm5hbWUpOwotCi0JLyogd2Uga25vdyB0aGUgZXh0ZW5zaW9uIGlzIDQgY2hhcmFjdGVycyAtLSBsZW4oRElSRkVYVCkgKi8KLQlleHRlbnNpb24gPSBzdHJsZW4od29yaykgLSA0OwotCW1lbWNweSgmd29ya1tleHRlbnNpb25dLCBQQUdGRVhULCA0KTsKLQkqc3RhdGUyID0gd29yazsKLSAgICB9Ci0jZW5kaWYKLX0KLQotc3RhdGljIGRhdl9lcnJvciAqIGRhdl9mc19kYm1fZXJyb3IoZGF2X2RiICpkYiwgcG9vbCAqcCkKLXsKLSAgICBpbnQgc2F2ZV9lcnJubyA9IGVycm5vOwotICAgIGludCBlcnJjb2RlOwotICAgIGNvbnN0IGNoYXIgKmVycnN0cjsKLSAgICBkYXZfZXJyb3IgKmVycjsKLQotICAgIHAgPSBkYiA/IGRiLT5wb29sIDogcDsKLQotI2lmZGVmIERBVl9VU0VfR0RCTQotICAgIGVycmNvZGUgPSBnZGJtX2Vycm5vOwotICAgIGVycnN0ciA9IGdkYm1fc3RyZXJyb3IoZ2RibV9lcnJubyk7Ci0jZWxzZQotICAgIC8qIFRoZXJlIG1pZ2h0IG5vdCBiZSBhIDxkYj4gaWYgd2UgaGFkIHByb2JsZW1zIGNyZWF0aW5nIGl0LiAqLwotICAgIGVycmNvZGUgPSAhZGIgfHwgc2RibV9lcnJvcihkYi0+ZmlsZSk7Ci0gICAgaWYgKGVycmNvZGUpCi0JZXJyc3RyID0gIkkvTyBlcnJvciBvY2N1cnJlZC4iOwotICAgIGVsc2UKLQllcnJzdHIgPSAiTm8gZXJyb3IuIjsKLSNlbmRpZgotCi0gICAgZXJyID0gZGF2X25ld19lcnJvcihwLCBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgZXJyY29kZSwgZXJyc3RyKTsKLSAgICBlcnItPnNhdmVfZXJybm8gPSBzYXZlX2Vycm5vOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qIGVuc3VyZSB0aGF0IG91ciBzdGF0ZSBzdWJkaXJlY3RvcnkgaXMgcHJlc2VudCAqLwotLyogIyMjIGRvZXMgdGhpcyBiZWxvbmcgaGVyZSBvciBpbiBkYXZfZnNfcmVwb3MuYyA/PyAqLwotdm9pZCBkYXZfZnNfZW5zdXJlX3N0YXRlX2Rpcihwb29sICogcCwgY29uc3QgY2hhciAqZGlybmFtZSkKLXsKLSAgICBjb25zdCBjaGFyICpwYXRobmFtZSA9IGFwX3BzdHJjYXQocCwgZGlybmFtZSwgIi8iIERBVl9GU19TVEFURV9ESVIsIE5VTEwpOwotCi0gICAgLyogIyMjIGRvIHdlIG5lZWQgdG8gZGVhbCB3aXRoIHRoZSB1bWFzaz8gKi8KLQotICAgIC8qIGp1c3QgdHJ5IHRvIG1ha2UgaXQsIGlnbm9yaW5nIGFueSByZXN1bHRpbmcgZXJyb3JzICovCi0gICAgbWtkaXIocGF0aG5hbWUsIERBVl9GU19NT0RFX0RJUik7Ci19Ci0KLS8qIGRhdl9kYm1fb3Blbl9kaXJlY3Q6ICBPcGVucyBhICpkYm0gZGF0YWJhc2Ugc3BlY2lmaWVkIGJ5IHBhdGguCi0gKiAgICBybyA9IGJvb2xlYW4gcmVhZC1vbmx5IGZsYWcuCi0gKi8KLWRhdl9lcnJvciAqIGRhdl9kYm1fb3Blbl9kaXJlY3QocG9vbCAqcCwgY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBybywKLQkJCQlkYXZfZGIgKipwZGIpCi17Ci0gICAgZGF2X2RibV9maWxlIGZpbGU7Ci0KLSAgICAqcGRiID0gTlVMTDsKLQotICAgIC8qIE5PVEU6IHN0dXBpZCBjYXN0IHRvIGdldCByaWQgb2YgImNvbnN0IiBvbiB0aGUgcGF0aG5hbWUgKi8KLSNpZmRlZiBEQVZfVVNFX0dEQk0KLSAgICBmaWxlID0gZ2RibV9vcGVuKChjaGFyICopIHBhdGhuYW1lLAotCQkgICAgIDAsCi0JCSAgICAgcm8gPyBHREJNX1JFQURFUiA6IEdEQk1fV1JDUkVBVCwKLQkJICAgICBEQVZfRlNfTU9ERV9GSUxFLAotCQkgICAgIE5VTEwpOwotI2Vsc2UKLSAgICBmaWxlID0gc2RibV9vcGVuKChjaGFyICopIHBhdGhuYW1lLAotCQkgICAgIHJvID8gT19SRE9OTFkgOiAoT19SRFdSIHwgT19DUkVBVCksCi0JCSAgICAgREFWX0ZTX01PREVfRklMRSk7Ci0jZW5kaWYKLQotICAgIC8qIHdlIGNhbid0IGNvbnRpbnVlIGlmIHdlIGNvdWxkbid0IG9wZW4gdGhlIGZpbGUgYW5kIHdlIG5lZWQgdG8gd3JpdGUgKi8KLSAgICBpZiAoZmlsZSA9PSBOVUxMICYmICFybykgewotCXJldHVybiBkYXZfZnNfZGJtX2Vycm9yKE5VTEwsIHApOwotICAgIH0KLQotICAgIC8qIG1heSBiZSBOVUxMIGlmIHdlIHRyaWVkIHRvIG9wZW4gYSBub24tZXhpc3RlbnQgZGIgYXMgcmVhZC1vbmx5ICovCi0gICAgaWYgKGZpbGUgIT0gTlVMTCkgewotCS8qIHdlIGhhdmUgYW4gb3BlbiBkYXRhYmFzZS4uLiByZXR1cm4gaXQgKi8KLQkqcGRiID0gYXBfcGNhbGxvYyhwLCBzaXplb2YoKipwZGIpKTsKLQkoKnBkYiktPnBvb2wgPSBwOwotCSgqcGRiKS0+ZmlsZSA9IGZpbGU7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBkYXZfZXJyb3IgKiBkYXZfZGJtX29wZW4ocG9vbCAqIHAsIGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UsIGludCBybywKLQkJCQlkYXZfZGIgKipwZGIpCi17Ci0gICAgY29uc3QgY2hhciAqZGlycGF0aDsKLSAgICBjb25zdCBjaGFyICpmbmFtZTsKLSAgICBjb25zdCBjaGFyICpwYXRobmFtZTsKLQotICAgIC8qIEdldCBkaXJlY3RvcnkgYW5kIGZpbGVuYW1lIGZvciByZXNvdXJjZSAqLwotICAgIGRhdl9mc19kaXJfZmlsZV9uYW1lKHJlc291cmNlLCAmZGlycGF0aCwgJmZuYW1lKTsKLQotICAgIC8qIElmIG5vdCBvcGVuaW5nIHJlYWQtb25seSwgZW5zdXJlIHRoZSBzdGF0ZSBkaXIgZXhpc3RzICovCi0gICAgaWYgKCFybykgewotCS8qICMjIyB3aGF0IGFyZSB0aGUgcGVyZiBpbXBsaWNhdGlvbnMgb2YgYWx3YXlzIGNoZWNraW5nIHRoaXM/ICovCi0gICAgICAgIGRhdl9mc19lbnN1cmVfc3RhdGVfZGlyKHAsIGRpcnBhdGgpOwotICAgIH0KLQotICAgIHBhdGhuYW1lID0gYXBfcHN0cmNhdChwLAotCQkJICBkaXJwYXRoLAotCQkJICAiLyIgREFWX0ZTX1NUQVRFX0RJUiAiLyIsCi0JCQkgIGZuYW1lID8gZm5hbWUgOiBEQVZfRlNfU1RBVEVfRklMRV9GT1JfRElSLAotCQkJICBOVUxMKTsKLQotICAgIC8qICMjIyByZWFkZXJzIGNhbm5vdCBvcGVuIHdoaWxlIGEgd3JpdGVyIGhhcyB0aGlzIG9wZW47IHdlIHNob3VsZAotICAgICAgICMjIyBwZXJmb3JtIGEgZmV3IHJldHJpZXMgd2l0aCByYW5kb20gcGF1c2VzLiAqLwotCi0gICAgLyogIyMjIGRvIHdlIG5lZWQgdG8gZGVhbCB3aXRoIHRoZSB1bWFzaz8gKi8KLQotICAgIHJldHVybiBkYXZfZGJtX29wZW5fZGlyZWN0KHAsIHBhdGhuYW1lLCBybywgcGRiKTsKLX0KLQotc3RhdGljIHZvaWQgZGF2X2RibV9jbG9zZShkYXZfZGIgKmRiKQotewotICAgIERBVl9EQk1fQ0xPU0UoZGItPmZpbGUpOwotfQotCi1zdGF0aWMgZGF2X2Vycm9yICogZGF2X2RibV9mZXRjaChkYXZfZGIgKmRiLCBkYXZfZGF0dW0ga2V5LCBkYXZfZGF0dW0gKnB2YWx1ZSkKLXsKLSAgICAqKGRhdHVtICopIHB2YWx1ZSA9IERBVl9EQk1fRkVUQ0goZGItPmZpbGUsIEQyRyhrZXkpKTsKLQotICAgIC8qIHdlIGRvbid0IG5lZWQgdGhlIGVycm9yOyB3ZSBoYXZlICpwdmFsdWUgdG8gdGVsbCAqLwotICAgIERBVl9EQk1fQ0xFQVJFUlIoZGItPmZpbGUpOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBkYXZfZXJyb3IgKiBkYXZfZGJtX3N0b3JlKGRhdl9kYiAqZGIsIGRhdl9kYXR1bSBrZXksIGRhdl9kYXR1bSB2YWx1ZSkKLXsKLSAgICBpbnQgcnY7Ci0KLSAgICBydiA9IERBVl9EQk1fU1RPUkUoZGItPmZpbGUsIEQyRyhrZXkpLCBEMkcodmFsdWUpKTsKLQotICAgIC8qICMjIyBmZXRjaCBtb3JlIHNwZWNpZmljIGVycm9yIGluZm9ybWF0aW9uPyAqLwotCi0gICAgLyogd2UgZG9uJ3QgbmVlZCB0aGUgZXJyb3I7IHdlIGhhdmUgcnYgdG8gdGVsbCAqLwotICAgIERBVl9EQk1fQ0xFQVJFUlIoZGItPmZpbGUpOwotCi0gICAgaWYgKHJ2ID09IC0xKSB7Ci0JcmV0dXJuIGRhdl9mc19kYm1fZXJyb3IoZGIsIE5VTEwpOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGRhdl9lcnJvciAqIGRhdl9kYm1fZGVsZXRlKGRhdl9kYiAqZGIsIGRhdl9kYXR1bSBrZXkpCi17Ci0gICAgaW50IHJ2OwotCi0gICAgcnYgPSBEQVZfREJNX0RFTEVURShkYi0+ZmlsZSwgRDJHKGtleSkpOwotCi0gICAgLyogIyMjIGZldGNoIG1vcmUgc3BlY2lmaWMgZXJyb3IgaW5mb3JtYXRpb24/ICovCi0KLSAgICAvKiB3ZSBkb24ndCBuZWVkIHRoZSBlcnJvcjsgd2UgaGF2ZSBydiB0byB0ZWxsICovCi0gICAgREFWX0RCTV9DTEVBUkVSUihkYi0+ZmlsZSk7Ci0KLSAgICBpZiAocnYgPT0gLTEpIHsKLQlyZXR1cm4gZGF2X2ZzX2RibV9lcnJvcihkYiwgTlVMTCk7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IGRhdl9kYm1fZXhpc3RzKGRhdl9kYiAqZGIsIGRhdl9kYXR1bSBrZXkpCi17Ci0gICAgaW50IGV4aXN0czsKLQotI2lmZGVmIERBVl9VU0VfR0RCTQotICAgIGV4aXN0cyA9IGdkYm1fZXhpc3RzKGRiLT5maWxlLCBEMkcoa2V5KSkgIT0gMDsKLSNlbHNlCi0gICAgewotCWRhdHVtIHZhbHVlID0gc2RibV9mZXRjaChkYi0+ZmlsZSwgRDJHKGtleSkpOwotCXNkYm1fY2xlYXJlcnIoZGItPmZpbGUpOwkvKiB1bm5lZWRlZCAqLwotCWV4aXN0cyA9IHZhbHVlLmRwdHIgIT0gTlVMTDsKLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm4gZXhpc3RzOwotfQotCi1zdGF0aWMgZGF2X2Vycm9yICogZGF2X2RibV9maXJzdGtleShkYXZfZGIgKmRiLCBkYXZfZGF0dW0gKnBrZXkpCi17Ci0gICAgKihkYXR1bSAqKSBwa2V5ID0gREFWX0RCTV9GSVJTVEtFWShkYi0+ZmlsZSk7Ci0KLSAgICAvKiB3ZSBkb24ndCBuZWVkIHRoZSBlcnJvcjsgd2UgaGF2ZSAqcGtleSB0byB0ZWxsICovCi0gICAgREFWX0RCTV9DTEVBUkVSUihkYi0+ZmlsZSk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGRhdl9lcnJvciAqIGRhdl9kYm1fbmV4dGtleShkYXZfZGIgKmRiLCBkYXZfZGF0dW0gKnBrZXkpCi17Ci0gICAgKihkYXR1bSAqKSBwa2V5ID0gREFWX0RCTV9ORVhUS0VZKGRiLT5maWxlLCBEMkcoKnBrZXkpKTsKLQotICAgIC8qIHdlIGRvbid0IG5lZWQgdGhlIGVycm9yOyB3ZSBoYXZlICpwa2V5IHRvIHRlbGwgKi8KLSAgICBEQVZfREJNX0NMRUFSRVJSKGRiLT5maWxlKTsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBkYXZfZGJtX2ZyZWVkYXR1bShkYXZfZGIgKmRiLCBkYXZfZGF0dW0gZGF0YSkKLXsKLSAgICBEQVZfREJNX0ZSRUVEQVRVTShkYiwgZGF0YSk7Ci19Ci0KLWNvbnN0IGRhdl9ob29rc19kYiBkYXZfaG9va3NfZGJfZGJtID0KLXsKLSAgICBkYXZfZGJtX29wZW4sCi0gICAgZGF2X2RibV9jbG9zZSwKLSAgICBkYXZfZGJtX2ZldGNoLAotICAgIGRhdl9kYm1fc3RvcmUsCi0gICAgZGF2X2RibV9kZWxldGUsCi0gICAgZGF2X2RibV9leGlzdHMsCi0gICAgZGF2X2RibV9maXJzdGtleSwKLSAgICBkYXZfZGJtX25leHRrZXksCi0gICAgZGF2X2RibV9mcmVlZGF0dW0sCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9kYXYvZnMvbG9jay5jIGIvbW9kdWxlcy9kYXYvZnMvbG9jay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjJkODNjLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZGF2L2ZzL2xvY2suYworKysgL2Rldi9udWxsCkBAIC0xLDE0ODYgKzAsMCBAQAotLyoKLSoqIENvcHlyaWdodCAoQykgMTk5OC0yMDAwIEdyZWcgU3RlaW4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qKgotKiogQnkgdXNpbmcgdGhpcyBmaWxlLCB5b3UgYWdyZWUgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHNldCBmb3J0aCBpbgotKiogdGhlIExJQ0VOU0UuaHRtbCBmaWxlIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBtb2RfZGF2Ci0qKiBkaXN0cmlidXRpb24gb3IgYXQgaHR0cDovL3d3dy53ZWJkYXYub3JnL21vZF9kYXYvbGljZW5zZS0xLmh0bWwuCi0qKgotKiogQ29udGFjdCBpbmZvcm1hdGlvbjoKLSoqICAgR3JlZyBTdGVpbiwgUE8gQm94IDc2MCwgUGFsbyBBbHRvLCBDQSwgOTQzMDIKLSoqICAgZ3N0ZWluQGx5cmEub3JnLCBodHRwOi8vd3d3LndlYmRhdi5vcmcvbW9kX2Rhdi8KLSovCi0KLS8qCi0qKiBEQVYgZmlsZXN5c3RlbSBsb2NrIGltcGxlbWVudGF0aW9uCi0qKgotKiogV3JpdHRlbiAwNi85OSBieSBLZWl0aCBXYW5uYW1ha2VyLCB3YW5uYW1ha0B1cy5pYm0uY29tCi0qKgotKiogTW9kaWZpZWQgMDgvOTkgYnkgSm9obiBWYXN0YSwgdmFzdGFAcmF0aW9uYWwuY29tLiB0byBleHRyYWN0Ci0qKiByZXBvc2l0b3J5LWRlcGVuZGVudCBjb2RlIGZyb20gZGF2X2xvY2suYwotKi8KLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0KLSNpbmNsdWRlICJtb2RfZGF2LmgiCi0jaW5jbHVkZSAiZGF2X29wYXF1ZWxvY2suaCIKLSNpbmNsdWRlICJkYXZfZnNfcmVwb3MuaCIKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoqCi0qKiBMb2NrIGRhdGFiYXNlIHByaW1pdGl2ZXMKLSoqCi0qLwotCi0vKgotKiogTE9DSyBEQVRBQkFTRVMKLSoqIAotKiogTG9ja2Rpc2NvdmVyeSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIHNpbmdsZSBsb2NrIGRhdGFiYXNlIHNwZWNpZmllZAotKiogYnkgdGhlIERBVkxvY2tEQiBkaXJlY3RpdmUuICBJbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRiIGlzIHN0b3JlZCBpbiB0aGUKLSoqIGdsb2JhbCBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLSoqCi0qKiBLRVkKLSoqCi0qKiBUaGUgZGF0YWJhc2UgaXMga2V5ZWQgYnkgYSBrZXlfdHlwZSB1bnNpZ25lZCBjaGFyIChEQVZfVFlQRV9JTk9ERSBvcgotKiogREFWX1RZUEVfRk5BTUUpIGZvbGxvd2VkIGJ5IGlub2RlIGFuZCBkZXZpY2UgbnVtYmVyIGlmIHBvc3NpYmxlLAotKiogb3RoZXJ3aXNlIGZ1bGwgcGF0aCAoaW4gdGhlIGNhc2Ugb2YgV2luMzIgb3IgbG9jay1udWxsIHJlc291cmNlcykuCi0qKgotKiogVkFMVUUKLSoqCi0qKiBUaGUgdmFsdWUgY29uc2lzdHMgb2YgYSBsaXN0IG9mIGVsZW1lbnRzLgotKiogICAgRElSRUNUIExPQ0s6ICAgICBbY2hhciAgKERBVl9MT0NLX0RJUkVDVCksCi0qKgkJCWNoYXIgIChkYXZfbG9ja19zY29wZSksCi0qKgkJCWNoYXIgIChkYXZfbG9ja190eXBlKSwKLSoqCQkJaW50ICAgIGRlcHRoLAotKioJCQl0aW1lX3QgZXhwaXJlcywKLSoqCQkJdXVpZF90IGxvY2t0b2tlbiwKLSoqCQkJY2hhcltdIG93bmVyLAotKiogICAgICAgICAgICAgICAgICAgICAgY2hhcltdIGF1dGhfdXNlcl0KLSoqCi0qKiAgICBJTkRJUkVDVCBMT0NLOiAgIFtjaGFyICAoREFWX0xPQ0tfSU5ESVJFQ1QpLAotKioJCQl1dWlkX3QgbG9ja3Rva2VuLAotKioJCQl0aW1lX3QgZXhwaXJlcywKLSoqCQkJaW50ICAgIGtleV9zaXplLAotKioJCQljaGFyW10ga2V5XQotKiogICAgICAgVGhlIGtleSBpcyB0byB0aGUgY29sbGVjdGlvbiBsb2NrIHRoYXQgcmVzdWx0ZWQgaW4gdGhpcyBpbmRpcmVjdCBsb2NrCi0qLwotCi0jZGVmaW5lIERBVl9UUlVFCQkxCi0jZGVmaW5lIERBVl9GQUxTRQkJMAotCi0jZGVmaW5lIERBVl9DUkVBVEVfTElTVAkJMjMKLSNkZWZpbmUgREFWX0FQUEVORF9MSVNUCQkyNAotCi0vKiBTdG9yZWQgbG9ja19kaXNjb3ZlcnkgcHJlZml4ICovCi0jZGVmaW5lIERBVl9MT0NLX0RJUkVDVAkJMQotI2RlZmluZSBEQVZfTE9DS19JTkRJUkVDVAkyCi0KLSNkZWZpbmUgREFWX1RZUEVfSU5PREUJCTEwCi0jZGVmaW5lIERBVl9UWVBFX0ZOQU1FCQkxMQotCi0KLS8qIGFjay4gZm9yd2FyZCBkZWNsYXJlLiAqLwotc3RhdGljIGRhdl9lcnJvciAqIGRhdl9mc19yZW1vdmVfbG9ja251bGxfbWVtYmVyKHBvb2wgKnAsCi0JCQkJCQkgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0JCQkJCQkgZGF2X2J1ZmZlciAqcGJ1Zik7Ci0KLS8qCi0qKiBVc2UgdGhlIG9wYXF1ZWxvY2sgc2NoZW1lIGZvciBsb2NrdG9rZW5zCi0qLwotc3RydWN0IGRhdl9sb2NrdG9rZW4gewotICAgIHV1aWRfdCB1dWlkOwotfTsKLQotCi0vKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotKiogIyMjIGtlZXAgdGhlc2Ugc3RydWN0dXJlcyAoaW50ZXJuYWwpIG9yIG1vdmUgZnVsbHkgdG8gZGF2X2xvY2s/Ci0qLwotCi0vKgotKiogV2UgbmVlZCB0byByZWxpYWJseSBzaXplIHRoZSBmaXhlZC1sZW5ndGggcG9ydGlvbiBvZgotKiogZGF2X2xvY2tfZGlzY292ZXJ5OyBiZXN0IHRvIHNlcGFyYXRlIGl0IGludG8gYW5vdGhlciAKLSoqIHN0cnVjdCBmb3IgYSBjb252ZW5pZW50IHNpemVvZiwgdW5sZXNzIHdlIHBhY2sgbG9ja19kaXNjb3ZlcnkuCi0qLwotdHlwZWRlZiBzdHJ1Y3QgZGF2X2xvY2tfZGlzY292ZXJ5X2ZpeGVkCi17Ci0gICAgY2hhciBzY29wZTsKLSAgICBjaGFyIHR5cGU7Ci0gICAgaW50IGRlcHRoOwotICAgIHRpbWVfdCB0aW1lb3V0OwotfSBkYXZfbG9ja19kaXNjb3ZlcnlfZml4ZWQ7Ci0KLXR5cGVkZWYgc3RydWN0IGRhdl9sb2NrX2Rpc2NvdmVyeQotewotICAgIHN0cnVjdCBkYXZfbG9ja19kaXNjb3ZlcnlfZml4ZWQgZjsKLQotICAgIGRhdl9sb2NrdG9rZW4gKmxvY2t0b2tlbjsKLSAgICBjb25zdCBjaGFyICpvd25lcjsJCS8qIG93bmVyIGZpZWxkIGZyb20gYWN0aXZlbG9jayAqLwotICAgIGNvbnN0IGNoYXIgKmF1dGhfdXNlcjsJLyogYXV0aGVudGljYXRlZCB1c2VyIHdobyBjcmVhdGVkIHRoZSBsb2NrICovCi0gICAgc3RydWN0IGRhdl9sb2NrX2Rpc2NvdmVyeSAqbmV4dDsKLX0gZGF2X2xvY2tfZGlzY292ZXJ5OwotCi0vKiBJbmRpcmVjdCBsb2NrcyByZXByZXNlbnQgbG9ja3MgaW5oZXJpdGVkIGZyb20gY29udGFpbmluZyBjb2xsZWN0aW9ucy4KLSAqIFRoZXkgcmVmZXJlbmNlIHRoZSBsb2NrIHRva2VuIGZvciB0aGUgY29sbGVjdGlvbiB0aGUgbG9jayBpcwotICogaW5oZXJpdGVkIGZyb20uIEEgbG9jayBwcm92aWRlciBtYXkgYWxzbyBkZWZpbmUgYSBrZXkgdG8gdGhlCi0gKiBpbmhlcml0ZWQgbG9jaywgZm9yIGZhc3QgZGF0YmFzZSBsb29rdXAuIFRoZSBrZXkgaXMgb3BhcXVlIG91dHNpZGUKLSAqIHRoZSBsb2NrIHByb3ZpZGVyLgotICovCi10eXBlZGVmIHN0cnVjdCBkYXZfbG9ja19pbmRpcmVjdAotewotICAgIGRhdl9sb2NrdG9rZW4gKmxvY2t0b2tlbjsKLSAgICBkYXZfZGF0dW0ga2V5OwotICAgIHN0cnVjdCBkYXZfbG9ja19pbmRpcmVjdCAqbmV4dDsKLSAgICB0aW1lX3QgdGltZW91dDsKLX0gZGF2X2xvY2tfaW5kaXJlY3Q7Ci0KLS8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCi0KLQotLyoKLSoqIFN0b3JlZCBkaXJlY3QgbG9jayBpbmZvIC0gZnVsbCBsb2NrX2Rpc2NvdmVyeSBsZW5ndGg6ICAKLSoqIHByZWZpeCArIEZpeGVkIGxlbmd0aCArIGxvY2sgdG9rZW4gKyAyIHN0cmluZ3MgKyAyIG51bGxzIChvbmUgZm9yIGVhY2ggc3RyaW5nKQotKi8KLSNkZWZpbmUgZGF2X3NpemVfZGlyZWN0KGEpCSgxICsgc2l6ZW9mKGRhdl9sb2NrX2Rpc2NvdmVyeV9maXhlZCkgXAotCQkJCSArIHNpemVvZih1dWlkX3QpIFwKLQkJCQkgKyAoKGEpLT5vd25lciA/IHN0cmxlbigoYSktPm93bmVyKSA6IDApIFwKLQkJCQkgKyAoKGEpLT5hdXRoX3VzZXIgPyBzdHJsZW4oKGEpLT5hdXRoX3VzZXIpIDogMCkgXAotCQkJCSArIDIpCi0KLS8qIFN0b3JlZCBpbmRpcmVjdCBsb2NrIGluZm8gLSBsb2NrIHRva2VuIGFuZCBkYXZfZGF0dW0gKi8KLSNkZWZpbmUgZGF2X3NpemVfaW5kaXJlY3QoYSkJKDEgKyBzaXplb2YodXVpZF90KSBcCi0JCQkJICsgc2l6ZW9mKHRpbWVfdCkgXAotCQkJCSArIHNpemVvZihpbnQpICsgKGEpLT5rZXkuZHNpemUpCi0KLS8qCi0qKiBUaGUgbG9ja2RiIHN0cnVjdHVyZS4KLSoqCi0qKiBUaGUgPGRiPiBmaWVsZCBtYXkgYmUgTlVMTCwgbWVhbmluZyBvbmUgb2YgdHdvIHRoaW5nczoKLSoqIDEpIFRoYXQgd2UgaGF2ZSBub3QgYWN0dWFsbHkgb3BlbmVkIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlICh5ZXQpLiBUaGUKLSoqICAgIDxvcGVuZWQ+IGZpZWxkIHNob3VsZCBiZSBmYWxzZS4KLSoqIDIpIFdlIG9wZW5lZCBpdCByZWFkb25seSBhbmQgaXQgd2Fzbid0IHByZXNlbnQuCi0qKgotKiogVGhlIGRlbGF5ZWQgb3BlbmluZyAoZGV0ZXJtaW5lZCBieSA8b3BlbmVkPikgbWFrZXMgY3JlYXRpbmcgYSBsb2NrZGIKLSoqIHF1aWNrLCB3aGlsZSBkZWZlcnJpbmcgdGhlIHVuZGVybHlpbmcgSS9PIHVudGlsIGl0IGlzIGFjdHVhbGx5IHJlcXVpcmVkLgotKioKLSoqIFdlIGV4cG9ydCB0aGUgbm90aW9uIG9mIGEgbG9ja2RiLCBidXQgaGlkZSB0aGUgZGV0YWlscyBvZiBpdC4gTW9zdAotKiogaW1wbGVtZW50YXRpb25zIHdpbGwgdXNlIGEgZGF0YWJhc2Ugb2Ygc29tZSBraW5kLCBidXQgaXQgaXMgY2VydGFpbmx5Ci0qKiBwb3NzaWJsZSB0aGF0IGFsdGVybmF0aXZlcyBjb3VsZCBiZSB1c2VkLgotKi8KLXN0cnVjdCBkYXZfbG9ja2RiX3ByaXZhdGUKLXsKLSAgICByZXF1ZXN0X3JlYyAqcjsJCQkvKiBmb3IgYWNjZXNzaW5nIHRoZSB1dWlkIHN0YXRlICovCi0gICAgcG9vbCAqcG9vbDsJCQkJLyogYSBwb29sIHRvIHVzZSAqLwotICAgIGNvbnN0IGNoYXIgKmxvY2tkYl9wYXRoOwkJLyogd2hlcmUgaXMgdGhlIGxvY2sgZGF0YWJhc2U/ICovCi0KLSAgICBpbnQgb3BlbmVkOwkJCQkvKiB3ZSBvcGVuZWQgdGhlIGRhdGFiYXNlICovCi0gICAgZGF2X2RiICpkYjsJCQkJLyogaWYgbm9uLU5VTEwsIHRoZSBsb2NrIGRhdGFiYXNlICovCi19OwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBkYXZfbG9ja2RiIHB1YjsKLSAgICBkYXZfbG9ja2RiX3ByaXZhdGUgcHJpdjsKLX0gZGF2X2xvY2tkYl9jb21iaW5lZDsKLQotLyoKLSoqIFRoZSBwcml2YXRlIHBhcnQgb2YgdGhlIGxvY2sgc3RydWN0dXJlLgotKi8KLXN0cnVjdCBkYXZfbG9ja19wcml2YXRlCi17Ci0gICAgZGF2X2RhdHVtIGtleTsJLyoga2V5IGludG8gdGhlIGxvY2sgZGF0YWJhc2UgKi8KLX07Ci10eXBlZGVmIHN0cnVjdAotewotICAgIGRhdl9sb2NrIHB1YjsKLSAgICBkYXZfbG9ja19wcml2YXRlIHByaXY7Ci0gICAgZGF2X2xvY2t0b2tlbiB0b2tlbjsKLX0gZGF2X2xvY2tfY29tYmluZWQ7Ci0KLS8qCi0qKiBUaGlzIG11c3QgYmUgZm9yd2FyZC1kZWNsYXJlZCBzbyB0aGUgb3Blbl9sb2NrZGIgZnVuY3Rpb24gY2FuIHVzZSBpdC4KLSovCi1leHRlcm4gY29uc3QgZGF2X2hvb2tzX2xvY2tzIGRhdl9ob29rc19sb2Nrc19mczsKLQotCi0vKiBpbnRlcm5hbCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgbG9ja3MgKi8KLXN0YXRpYyBkYXZfbG9jayAqZGF2X2ZzX2FsbG9jX2xvY2soZGF2X2xvY2tkYiAqbG9ja2RiLCBkYXZfZGF0dW0ga2V5LAotCQkJCSAgIGNvbnN0IGRhdl9sb2NrdG9rZW4gKmxvY2t0b2tlbikKLXsKLSAgICBkYXZfbG9ja19jb21iaW5lZCAqY29tYjsKLQotICAgIGNvbWIgPSBhcF9wY2FsbG9jKGxvY2tkYi0+aW5mby0+cG9vbCwgc2l6ZW9mKCpjb21iKSk7Ci0gICAgY29tYi0+cHViLnJlY3R5cGUgPSBEQVZfTE9DS1JFQ19ESVJFQ1Q7Ci0gICAgY29tYi0+cHViLmluZm8gPSAmY29tYi0+cHJpdjsKLSAgICBjb21iLT5wcml2LmtleSA9IGtleTsKLQotICAgIGlmIChsb2NrdG9rZW4gPT0gTlVMTCkgewotCWNvbWItPnB1Yi5sb2NrdG9rZW4gPSAmY29tYi0+dG9rZW47Ci0JZGF2X2NyZWF0ZV9vcGFxdWVsb2NrdG9rZW4oZGF2X2dldF91dWlkX3N0YXRlKGxvY2tkYi0+aW5mby0+ciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21iLT50b2tlbi51dWlkKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JY29tYi0+cHViLmxvY2t0b2tlbiA9IGxvY2t0b2tlbjsKLSAgICB9Ci0KLSAgICByZXR1cm4gJmNvbWItPnB1YjsKLX0KLQotLyoKLSoqIGRhdl9mc19wYXJzZV9sb2NrdG9rZW4KLSoqCi0qKiBQYXJzZSBhbiBvcGFxdWVsb2NrdG9rZW4gVVJJIGludG8gYSBsb2NrdG9rZW4uCi0qLwotc3RhdGljIGRhdl9lcnJvciAqIGRhdl9mc19wYXJzZV9sb2NrdG9rZW4oCi0gICAgcG9vbCAqcCwKLSAgICBjb25zdCBjaGFyICpjaGFyX3Rva2VuLAotICAgIGRhdl9sb2NrdG9rZW4gKipsb2NrdG9rZW5fcCkKLXsKLSAgICBkYXZfbG9ja3Rva2VuICpsb2NrdG9rZW47Ci0KLSAgICBpZiAoc3Ryc3RyKGNoYXJfdG9rZW4sICJvcGFxdWVsb2NrdG9rZW46IikgIT0gY2hhcl90b2tlbikgewotCXJldHVybiBkYXZfbmV3X2Vycm9yKHAsCi0JCQkgICAgIEhUVFBfQkFEX1JFUVVFU1QsIERBVl9FUlJfTE9DS19VTktfU1RBVEVfVE9LRU4sCi0JCQkgICAgICJUaGUgbG9jayB0b2tlbiB1c2VzIGFuIHVua25vd24gU3RhdGUtdG9rZW4gIgotCQkJICAgICAiZm9ybWF0IGFuZCBjb3VsZCBub3QgYmUgcGFyc2VkLiIpOwotICAgIH0KLSAgICBjaGFyX3Rva2VuICs9IDE2OwotCi0gICAgbG9ja3Rva2VuID0gYXBfcGNhbGxvYyhwLCBzaXplb2YoKmxvY2t0b2tlbikpOwotICAgIGlmIChkYXZfcGFyc2Vfb3BhcXVlbG9ja3Rva2VuKGNoYXJfdG9rZW4sICZsb2NrdG9rZW4tPnV1aWQpKSB7Ci0JcmV0dXJuIGRhdl9uZXdfZXJyb3IocCwgSFRUUF9CQURfUkVRVUVTVCwgREFWX0VSUl9MT0NLX1BBUlNFX1RPS0VOLAotCQkJICAgICAiVGhlIG9wYXF1ZWxvY2t0b2tlbiBoYXMgYW4gaW5jb3JyZWN0IGZvcm1hdCAiCi0JCQkgICAgICJhbmQgY291bGQgbm90IGJlIHBhcnNlZC4iKTsKLSAgICB9Ci0gICAgCi0gICAgKmxvY2t0b2tlbl9wID0gbG9ja3Rva2VuOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKgotKiogZGF2X2ZzX2Zvcm1hdF9sb2NrdG9rZW4KLSoqCi0qKiBHZW5lcmF0ZSB0aGUgVVJJIGZvciBhIGxvY2t0b2tlbgotKi8KLXN0YXRpYyBjb25zdCBjaGFyICpkYXZfZnNfZm9ybWF0X2xvY2t0b2tlbigKLSAgICBwb29sICpwLAotICAgIGNvbnN0IGRhdl9sb2NrdG9rZW4gKmxvY2t0b2tlbikKLXsKLSAgICBjb25zdCBjaGFyICp1dWlkX3Rva2VuID0gZGF2X2Zvcm1hdF9vcGFxdWVsb2NrdG9rZW4ocCwgJmxvY2t0b2tlbi0+dXVpZCk7Ci0gICAgcmV0dXJuIGFwX3BzdHJjYXQocCwgIm9wYXF1ZWxvY2t0b2tlbjoiLCB1dWlkX3Rva2VuLCBOVUxMKTsKLX0KLQotLyoKLSoqIGRhdl9mc19jb21wYXJlX2xvY2t0b2tlbgotKioKLSoqIERldGVybWluZSB3aGV0aGVyIHR3byBsb2NrdG9rZW5zIGFyZSB0aGUgc2FtZQotKi8KLXN0YXRpYyBpbnQgZGF2X2ZzX2NvbXBhcmVfbG9ja3Rva2VuKAotICAgIGNvbnN0IGRhdl9sb2NrdG9rZW4gKmx0MSwKLSAgICBjb25zdCBkYXZfbG9ja3Rva2VuICpsdDIpCi17Ci0gICAgcmV0dXJuIGRhdl9jb21wYXJlX29wYXF1ZWxvY2t0b2tlbihsdDEtPnV1aWQsIGx0Mi0+dXVpZCk7Ci19Ci0KLS8qCi0qKiBkYXZfZnNfcmVhbGx5X29wZW5fbG9ja2RiOgotKioKLSoqIElmIHRoZSBkYXRhYmFzZSBoYXNuJ3QgYmVlbiBvcGVuZWQgeWV0LCB0aGVuIG9wZW4gdGhlIHRoaW5nLgotKi8KLXN0YXRpYyBkYXZfZXJyb3IgKiBkYXZfZnNfcmVhbGx5X29wZW5fbG9ja2RiKGRhdl9sb2NrZGIgKmxvY2tkYikKLXsKLSAgICBkYXZfZXJyb3IgKmVycjsKLQotICAgIGlmIChsb2NrZGItPmluZm8tPm9wZW5lZCkKLQlyZXR1cm4gTlVMTDsKLQotICAgIGVyciA9IGRhdl9kYm1fb3Blbl9kaXJlY3QobG9ja2RiLT5pbmZvLT5wb29sLAotCQkJICAgICAgbG9ja2RiLT5pbmZvLT5sb2NrZGJfcGF0aCwKLQkJCSAgICAgIGxvY2tkYi0+cm8sCi0JCQkgICAgICAmbG9ja2RiLT5pbmZvLT5kYik7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0JcmV0dXJuIGRhdl9wdXNoX2Vycm9yKGxvY2tkYi0+aW5mby0+cG9vbCwKLQkJCSAgICAgIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAotCQkJICAgICAgREFWX0VSUl9MT0NLX09QRU5EQiwKLQkJCSAgICAgICJDb3VsZCBub3Qgb3BlbiB0aGUgbG9jayBkYXRhYmFzZS4iLAotCQkJICAgICAgZXJyKTsKLSAgICB9Ci0KLSAgICAvKiBhbGwgcmlnaHQuIGl0IGlzIG9wZW5lZCBub3cuICovCi0gICAgbG9ja2RiLT5pbmZvLT5vcGVuZWQgPSAxOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0qKiBkYXZfZnNfb3Blbl9sb2NrZGI6Ci0qKgotKiogIm9wZW4iIHRoZSBsb2NrIGRhdGFiYXNlLCBhcyBzcGVjaWZpZWQgaW4gdGhlIGdsb2JhbCBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLSoqIElmIGZvcmNlIGlzIFRSVUUsIHRoZW4gdGhlIGRhdGFiYXNlIGlzIG9wZW5lZCBub3csIHJhdGhlciB0aGFuIGxhemlseS4KLSoqCi0qKiBOb3RlIHRoYXQgb25seSBvbmUgY2FuIGJlIG9wZW4gcmVhZC93cml0ZS4KLSovCi1zdGF0aWMgZGF2X2Vycm9yICogZGF2X2ZzX29wZW5fbG9ja2RiKHJlcXVlc3RfcmVjICpyLCBpbnQgcm8sIGludCBmb3JjZSwKLQkJCQkgICAgICBkYXZfbG9ja2RiICoqbG9ja2RiKQotewotICAgIGRhdl9sb2NrZGJfY29tYmluZWQgKmNvbWI7Ci0KLSAgICBjb21iID0gYXBfcGNhbGxvYyhyLT5wb29sLCBzaXplb2YoKmNvbWIpKTsKLSAgICBjb21iLT5wdWIuaG9va3MgPSAmZGF2X2hvb2tzX2xvY2tzX2ZzOwotICAgIGNvbWItPnB1Yi5ybyA9IHJvOwotICAgIGNvbWItPnB1Yi5pbmZvID0gJmNvbWItPnByaXY7Ci0gICAgY29tYi0+cHJpdi5yID0gcjsKLSAgICBjb21iLT5wcml2LnBvb2wgPSByLT5wb29sOwotCi0gICAgY29tYi0+cHJpdi5sb2NrZGJfcGF0aCA9IGRhdl9nZXRfbG9ja2RiX3BhdGgocik7Ci0gICAgaWYgKGNvbWItPnByaXYubG9ja2RiX3BhdGggPT0gTlVMTCkgewotCXJldHVybiBkYXZfbmV3X2Vycm9yKHItPnBvb2wsIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAotCQkJICAgICBEQVZfRVJSX0xPQ0tfTk9fREIsCi0JCQkgICAgICJBIGxvY2sgZGF0YWJhc2Ugd2FzIG5vdCBzcGVjaWZpZWQgd2l0aCB0aGUgIgotCQkJICAgICAiREFWTG9ja0RCIGRpcmVjdGl2ZS4gT25lIG11c3QgYmUgc3BlY2lmaWVkICIKLQkJCSAgICAgInRvIHVzZSB0aGUgbG9ja2luZyBmdW5jdGlvbmFsaXR5LiIpOwotICAgIH0KLQotICAgIC8qIGRvbmUgaW5pdGlhbGl6aW5nLiByZXR1cm4gaXQuICovCi0gICAgKmxvY2tkYiA9ICZjb21iLT5wdWI7Ci0KLSAgICBpZiAoZm9yY2UpIHsKLQkvKiAjIyMgYWRkIGEgaGlnaGVyLWxldmVsIGNvbW1lbnQ/ICovCi0JcmV0dXJuIGRhdl9mc19yZWFsbHlfb3Blbl9sb2NrZGIoKmxvY2tkYik7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0qKiBkYXZfZnNfY2xvc2VfbG9ja2RiOgotKioKLSoqIENsb3NlIGl0LiBEdWguCi0qLwotc3RhdGljIHZvaWQgZGF2X2ZzX2Nsb3NlX2xvY2tkYihkYXZfbG9ja2RiICpsb2NrZGIpCi17Ci0gICAgaWYgKGxvY2tkYi0+aW5mby0+ZGIgIT0gTlVMTCkKLQkoKmRhdl9ob29rc19kYl9kYm0uY2xvc2UpKGxvY2tkYi0+aW5mby0+ZGIpOwotfQotCi0vKgotKiogZGF2X2ZzX2J1aWxkX2ZuYW1lX2tleQotKioKLSoqIEdpdmVuIGEgcGF0aG5hbWUsIGJ1aWxkIGEgREFWX1RZUEVfRk5BTUUgbG9jayBkYXRhYmFzZSBrZXkuCi0qLwotc3RhdGljIGRhdl9kYXR1bSBkYXZfZnNfYnVpbGRfZm5hbWVfa2V5KHBvb2wgKnAsIGNvbnN0IGNoYXIgKnBhdGhuYW1lKQotewotICAgIGRhdl9kYXR1bSBrZXk7Ci0KLSAgICAvKiAjIyMgZG9lcyB0aGlzIGFsbG9jYXRpb24gaGF2ZSBhIHByb3BlciBsaWZldGltZT8gbmVlZCB0byBjaGVjayAqLwotICAgIC8qICMjIyBjYW4gd2UgdXNlIGEgYnVmZmVyIGZvciB0aGlzPyAqLwotCi0gICAgLyogc2l6ZSBpcyBUWVBFICsgcGF0aG5hbWUgKyBudWxsICovCi0gICAga2V5LmRzaXplID0gc3RybGVuKHBhdGhuYW1lKSArIDI7Ci0gICAga2V5LmRwdHIgPSBhcF9wYWxsb2MocCwga2V5LmRzaXplKTsKLSAgICAqa2V5LmRwdHIgPSBEQVZfVFlQRV9GTkFNRTsKLSAgICBtZW1jcHkoa2V5LmRwdHIgKyAxLCBwYXRobmFtZSwga2V5LmRzaXplIC0gMSk7Ci0gICAgaWYgKGtleS5kcHRyW2tleS5kc2l6ZSAtIDJdID09ICcvJykKLQlrZXkuZHB0clstLWtleS5kc2l6ZSAtIDFdID0gJ1wwJzsKLSAgICByZXR1cm4ga2V5OwotfQotCi0vKgotKiogZGF2X2ZzX2J1aWxkX2tleTogIEdpdmVuIGEgcmVzb3VyY2UsIHJldHVybiBhIGRhdl9kYXR1bSBrZXkKLSoqICAgIHRvIGxvb2sgdXAgbG9jayBpbmZvcm1hdGlvbiBmb3IgdGhpcyBmaWxlLgotKioKLSoqICAgIChXaW4zMiBvciBmaWxlIGlzIGxvY2stbnVsbCk6Ci0qKiAgICAgICBkYXZfZGF0dW0tPmR2YWx1ZSA9IGZ1bGwgcGF0aAotKioKLSoqICAgIChub24tV2luMzIgYW5kIGZpbGUgZXhpc3RzICk6Ci0qKiAgICAgICBkYXZfZGF0dW0tPmR2YWx1ZSA9IGlub2RlLCBkZXZfbWFqb3IsIGRldl9taW5vcgotKi8KLXN0YXRpYyBkYXZfZGF0dW0gZGF2X2ZzX2J1aWxkX2tleShwb29sICpwLCBjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlKQotewotICAgIGNvbnN0IGNoYXIgKmZpbGUgPSBkYXZfZnNfcGF0aG5hbWUocmVzb3VyY2UpOwotI2lmbmRlZiBXSU4zMgotICAgIGRhdl9kYXR1bSBrZXk7Ci0gICAgc3RydWN0IHN0YXQgZmluZm87Ci0KLSAgICAvKiAjIyMgdXNlIGxzdGF0KCkgPz8gKi8KLSAgICBpZiAoc3RhdChmaWxlLCAmZmluZm8pID09IDApIHsKLQotCS8qICMjIyBjYW4gd2UgdXNlIGEgYnVmZmVyIGZvciB0aGlzPyAqLwotCWtleS5kc2l6ZSA9IDEgKyBzaXplb2YoZmluZm8uc3RfaW5vKSArIHNpemVvZihmaW5mby5zdF9kZXYpOwotCWtleS5kcHRyID0gYXBfcGFsbG9jKHAsIGtleS5kc2l6ZSk7Ci0JKmtleS5kcHRyID0gREFWX1RZUEVfSU5PREU7Ci0JbWVtY3B5KGtleS5kcHRyICsgMSwgJmZpbmZvLnN0X2lubywgc2l6ZW9mKGZpbmZvLnN0X2lubykpOwotCW1lbWNweShrZXkuZHB0ciArIDEgKyBzaXplb2YoZmluZm8uc3RfaW5vKSwgJmZpbmZvLnN0X2RldiwKLQkgICAgICAgc2l6ZW9mKGZpbmZvLnN0X2RldikpOwotCi0JcmV0dXJuIGtleTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHJldHVybiBkYXZfZnNfYnVpbGRfZm5hbWVfa2V5KHAsIGZpbGUpOwotfQotCi0vKgotKiogZGF2X2ZzX2xvY2tfZXhwaXJlZDogIHJldHVybiAxICh0cnVlKSBpZiB0aGUgZ2l2ZW4gdGltZW91dCBpcyBpbiB0aGUgcGFzdAotKiogICAgb3IgcHJlc2VudCAodGhlIGxvY2sgaGFzIGV4cGlyZWQpLCBvciAwIChmYWxzZSkgaWYgaW4gdGhlIGZ1dHVyZQotKiogICAgKHRoZSBsb2NrIGhhcyBub3QgeWV0IGV4cGlyZWQpLgotKi8KLXN0YXRpYyBpbnQgZGF2X2ZzX2xvY2tfZXhwaXJlZCh0aW1lX3QgZXhwaXJlcykKLXsKLSAgICByZXR1cm4gZXhwaXJlcyAhPSBEQVZfVElNRU9VVF9JTkZJTklURSAmJiB0aW1lKE5VTEwpID49IGV4cGlyZXM7Ci19Ci0KLS8qCi0qKiBkYXZfZnNfc2F2ZV9sb2NrX3JlY29yZDogIFNhdmVzIHRoZSBsb2NrIGluZm9ybWF0aW9uIHNwZWNpZmllZCBpbiB0aGUKLSoqICAgIGRpcmVjdCBhbmQgaW5kaXJlY3QgbG9jayBsaXN0cyBhYm91dCBwYXRoIGludG8gdGhlIGxvY2sgZGF0YWJhc2UuCi0qKiAgICBJZiBkaXJlY3QgYW5kIGluZGlyZWN0ID09IE5VTEwsIHRoZSBrZXkgaXMgcmVtb3ZlZC4KLSovCi1zdGF0aWMgZGF2X2Vycm9yICogZGF2X2ZzX3NhdmVfbG9ja19yZWNvcmQoZGF2X2xvY2tkYiAqbG9ja2RiLCBkYXZfZGF0dW0ga2V5LAotCQkJCQkgICBkYXZfbG9ja19kaXNjb3ZlcnkgKmRpcmVjdCwKLQkJCQkJICAgZGF2X2xvY2tfaW5kaXJlY3QgKmluZGlyZWN0KQotewotICAgIGRhdl9lcnJvciAqZXJyOwotICAgIGRhdl9kYXR1bSB2YWwgPSB7IDAgfTsKLSAgICBjaGFyICpwdHI7Ci0gICAgZGF2X2xvY2tfZGlzY292ZXJ5ICpkcCA9IGRpcmVjdDsKLSAgICBkYXZfbG9ja19pbmRpcmVjdCAqaXAgPSBpbmRpcmVjdDsKLQotI2lmIERBVl9ERUJVRwotICAgIGlmIChsb2NrZGItPnJvKSB7Ci0JcmV0dXJuIGRhdl9uZXdfZXJyb3IobG9ja2RiLT5pbmZvLT5wb29sLAotCQkJICAgICBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgMCwKLQkJCSAgICAgIklOVEVSTkFMIERFU0lHTiBFUlJPUjogdGhlIGxvY2tkYiB3YXMgb3BlbmVkICIKLQkJCSAgICAgInJlYWRvbmx5LCBidXQgYW4gYXR0ZW1wdCB0byBzYXZlIGxvY2tzIHdhcyAiCi0JCQkgICAgICJwZXJmb3JtZWQuIik7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpZiAoKGVyciA9IGRhdl9mc19yZWFsbHlfb3Blbl9sb2NrZGIobG9ja2RiKSkgIT0gTlVMTCkgewotCS8qICMjIyBhZGQgYSBoaWdoZXItbGV2ZWwgZXJyb3I/ICovCi0JcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBJZiBub3RoaW5nIHRvIHNhdmUsIGRlbGV0ZSBrZXkgKi8KLSAgICBpZiAoZHAgPT0gTlVMTCAmJiBpcCA9PSBOVUxMKSB7Ci0gICAgICAgIC8qIGRvbid0IGZhaWwgaWYgdGhlIGtleSBpcyBub3QgcHJlc2VudCAqLwotICAgICAgICAvKiAjIyMgYnV0IHdoYXQgYWJvdXQgb3RoZXIgZXJyb3JzPyAqLwotCSh2b2lkKSAoKmRhdl9ob29rc19kYl9kYm0ucmVtb3ZlKShsb2NrZGItPmluZm8tPmRiLCBrZXkpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0JCQotICAgIHdoaWxlKGRwKSB7Ci0JdmFsLmRzaXplICs9IGRhdl9zaXplX2RpcmVjdChkcCk7Ci0JZHAgPSBkcC0+bmV4dDsKLSAgICB9Ci0gICAgd2hpbGUoaXApIHsKLQl2YWwuZHNpemUgKz0gZGF2X3NpemVfaW5kaXJlY3QoaXApOwotCWlwID0gaXAtPm5leHQ7Ci0gICAgfQotCi0gICAgLyogIyMjIGNhbiB0aGlzIGJlIGFwX3BhbGxvYygpID8gKi8KLSAgICAvKiAjIyMgaG1tbS4uLi4gaW52ZXN0aWdhdGUgdGhlIHVzZSBvZiBhIGJ1ZmZlciBoZXJlICovCi0gICAgcHRyID0gdmFsLmRwdHIgPSBhcF9wY2FsbG9jKGxvY2tkYi0+aW5mby0+cG9vbCwgdmFsLmRzaXplKTsKLSAgICBkcCAgPSBkaXJlY3Q7Ci0gICAgaXAgID0gaW5kaXJlY3Q7Ci0KLSAgICB3aGlsZShkcCkgewotCSpwdHIrKyA9IERBVl9MT0NLX0RJUkVDVDsJLyogRGlyZWN0IGxvY2sgLSBsb2NrX2Rpc2NvdmVyeSBzdHJ1Y3QgZm9sbG93cyAqLwotCW1lbWNweShwdHIsIGRwLCBzaXplb2YoZHAtPmYpKTsJLyogRml4ZWQgcG9ydGlvbiBvZiBzdHJ1Y3QgKi8KLQlwdHIgKz0gc2l6ZW9mKGRwLT5mKTsKLSAgICAgICAgbWVtY3B5KHB0ciwgZHAtPmxvY2t0b2tlbiwgc2l6ZW9mKCpkcC0+bG9ja3Rva2VuKSk7Ci0gICAgICAgIHB0ciArPSBzaXplb2YoKmRwLT5sb2NrdG9rZW4pOwotCWlmIChkcC0+b3duZXIgPT0gTlVMTCkgewotCSAgICAqcHRyKysgPSAnXDAnOwotCX0KLQllbHNlIHsKLQkgICAgbWVtY3B5KHB0ciwgZHAtPm93bmVyLCBzdHJsZW4oZHAtPm93bmVyKSArIDEpOwkKLQkgICAgcHRyICs9IHN0cmxlbihkcC0+b3duZXIpICsgMTsKLQl9Ci0JaWYgKGRwLT5hdXRoX3VzZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgKnB0cisrID0gJ1wwJzsKLQl9Ci0JZWxzZSB7Ci0JICAgIG1lbWNweShwdHIsIGRwLT5hdXRoX3VzZXIsIHN0cmxlbihkcC0+YXV0aF91c2VyKSArIDEpOwotCSAgICBwdHIgKz0gc3RybGVuKGRwLT5hdXRoX3VzZXIpICsgMTsKLQl9Ci0KLQlkcCA9IGRwLT5uZXh0OwotICAgIH0KLQotICAgIHdoaWxlKGlwKSB7Ci0JKnB0cisrID0gREFWX0xPQ0tfSU5ESVJFQ1Q7CS8qIEluZGlyZWN0IGxvY2sgcHJlZml4ICovCi0JbWVtY3B5KHB0ciwgaXAtPmxvY2t0b2tlbiwgc2l6ZW9mKCppcC0+bG9ja3Rva2VuKSk7CS8qIExvY2t0b2tlbiAqLwotCXB0ciArPSBzaXplb2YoKmlwLT5sb2NrdG9rZW4pOwotCW1lbWNweShwdHIsICZpcC0+dGltZW91dCwgc2l6ZW9mKGlwLT50aW1lb3V0KSk7CQkvKiBFeHBpcmUgdGltZSAqLwotCXB0ciArPSBzaXplb2YoaXAtPnRpbWVvdXQpOwotCW1lbWNweShwdHIsICZpcC0+a2V5LmRzaXplLCBzaXplb2YoaXAtPmtleS5kc2l6ZSkpOwkvKiBTaXplIG9mIGtleSAqLwotCXB0ciArPSBzaXplb2YoaXAtPmtleS5kc2l6ZSk7Ci0JbWVtY3B5KHB0ciwgaXAtPmtleS5kcHRyLCBpcC0+a2V5LmRzaXplKTsJLyogS2V5IGRhdGEgKi8KLQlwdHIgKz0gaXAtPmtleS5kc2l6ZTsKLQlpcCA9IGlwLT5uZXh0OwotICAgIH0KLQotICAgIGlmICgoZXJyID0gKCpkYXZfaG9va3NfZGJfZGJtLnN0b3JlKShsb2NrZGItPmluZm8tPmRiLAotCQkJCQkJa2V5LCB2YWwpKSAhPSBOVUxMKSB7Ci0JLyogIyMjIG1vcmUgZGV0YWlscz8gYWRkIGFuIGVycm9yX2lkPyAqLwotCXJldHVybiBkYXZfcHVzaF9lcnJvcihsb2NrZGItPmluZm8tPnBvb2wsCi0JCQkgICAgICBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKLQkJCSAgICAgIERBVl9FUlJfTE9DS19TQVZFX0xPQ0ssCi0JCQkgICAgICAiQ291bGQgbm90IHNhdmUgbG9jayBpbmZvcm1hdGlvbi4iLAotCQkJICAgICAgZXJyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoKLSoqIGRhdl9sb2FkX2xvY2tfcmVjb3JkOiAgUmVhZHMgbG9jayBpbmZvcm1hdGlvbiBhYm91dCBrZXkgZnJvbSBsb2NrIGRiOwotKiogICAgY3JlYXRlcyBsaW5rZWQgbGlzdHMgb2YgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgbG9ja3MuCi0qKgotKiogICAgSWYgYWRkX21ldGhvZCA9IERBVl9BUFBFTkRfTElTVCwgdGhlIHJlc3VsdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZQotKiogICAgaGVhZCBvZiB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBsaXN0cyBzdXBwbGllZC4KLSoqCi0qKiAgICBQYXNzaXZlIGxvY2sgcmVtb3ZhbDogIElmIGxvY2sgaGFzIHRpbWVkIG91dCwgaXQgd2lsbCBub3QgYmUgcmV0dXJuZWQuCi0qKiAgICAjIyMgSG93IG11Y2ggImxvZ2dpbmciIGRvZXMgUkZDIDI1MTggcmVxdWlyZT8KLSovCi1zdGF0aWMgZGF2X2Vycm9yICogZGF2X2ZzX2xvYWRfbG9ja19yZWNvcmQoZGF2X2xvY2tkYiAqbG9ja2RiLCBkYXZfZGF0dW0ga2V5LAotCQkJCQkgICBpbnQgYWRkX21ldGhvZCwKLQkJCQkJICAgZGF2X2xvY2tfZGlzY292ZXJ5ICoqZGlyZWN0LAotCQkJCQkgICBkYXZfbG9ja19pbmRpcmVjdCAqKmluZGlyZWN0KQotewotICAgIGRhdl9lcnJvciAqZXJyOwotICAgIHNpemVfdCBvZmZzZXQgPSAwOwotICAgIGludCBuZWVkX3NhdmUgPSBEQVZfRkFMU0U7Ci0gICAgZGF2X2RhdHVtIHZhbCA9IHsgMCB9OwotICAgIGRhdl9sb2NrX2Rpc2NvdmVyeSAqZHA7Ci0gICAgZGF2X2xvY2tfaW5kaXJlY3QgKmlwOwotICAgIGRhdl9idWZmZXIgYnVmID0geyAwIH07Ci0KLSAgICBpZiAoYWRkX21ldGhvZCAhPSBEQVZfQVBQRU5EX0xJU1QpIHsKLQkqZGlyZWN0ID0gTlVMTDsKLQkqaW5kaXJlY3QgPSBOVUxMOwotICAgIH0KLQotICAgIGlmICgoZXJyID0gZGF2X2ZzX3JlYWxseV9vcGVuX2xvY2tkYihsb2NrZGIpKSAhPSBOVUxMKSB7Ci0JLyogIyMjIGFkZCBhIGhpZ2hlci1sZXZlbCBlcnJvcj8gKi8KLQlyZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qCi0gICAgKiogSWYgd2Ugb3BlbmVkIHJlYWRvbmx5IGFuZCB0aGUgZGIgd2Fzbid0IHRoZXJlLCB0aGVuIHRoZXJlIGFyZSBubwotICAgICoqIGxvY2tzIGZvciB0aGlzIHJlc291cmNlLiBKdXN0IGV4aXQuCi0gICAgKi8KLSAgICBpZiAobG9ja2RiLT5pbmZvLT5kYiA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotCi0gICAgaWYgKChlcnIgPSAoKmRhdl9ob29rc19kYl9kYm0uZmV0Y2gpKGxvY2tkYi0+aW5mby0+ZGIsIGtleSwgJnZhbCkpICE9IE5VTEwpCi0gICAgICAgIHJldHVybiBlcnI7Ci0JCi0gICAgaWYgKCF2YWwuZHNpemUpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICB3aGlsZSAob2Zmc2V0IDwgdmFsLmRzaXplKSB7Ci0Jc3dpdGNoICgqKHZhbC5kcHRyICsgb2Zmc2V0KyspKSB7Ci0JY2FzZSBEQVZfTE9DS19ESVJFQ1Q6Ci0JICAgIC8qIENyZWF0ZSBhbmQgZmlsbCBhIGRhdl9sb2NrX2Rpc2NvdmVyeSBzdHJ1Y3R1cmUgKi8KLQotCSAgICBkcCA9IGFwX3BjYWxsb2MobG9ja2RiLT5pbmZvLT5wb29sLCBzaXplb2YoKmRwKSk7Ci0JICAgIG1lbWNweShkcCwgdmFsLmRwdHIgKyBvZmZzZXQsIHNpemVvZihkcC0+ZikpOwotCSAgICBvZmZzZXQgKz0gc2l6ZW9mKGRwLT5mKTsKLSAgICAgICAgICAgIGRwLT5sb2NrdG9rZW4gPSBhcF9wYWxsb2MobG9ja2RiLT5pbmZvLT5wb29sLCBzaXplb2YoKmRwLT5sb2NrdG9rZW4pKTsKLSAgICAgICAgICAgIG1lbWNweShkcC0+bG9ja3Rva2VuLCB2YWwuZHB0ciArIG9mZnNldCwgc2l6ZW9mKCpkcC0+bG9ja3Rva2VuKSk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKCpkcC0+bG9ja3Rva2VuKTsKLQkgICAgaWYgKCoodmFsLmRwdHIgKyBvZmZzZXQpID09ICdcMCcpIHsKLQkJKytvZmZzZXQ7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCWRwLT5vd25lciA9IGFwX3BzdHJkdXAobG9ja2RiLT5pbmZvLT5wb29sLCB2YWwuZHB0ciArIG9mZnNldCk7Ci0JCW9mZnNldCArPSBzdHJsZW4oZHAtPm93bmVyKSArIDE7Ci0JICAgIH0KLQotICAgICAgICAgICAgaWYgKCoodmFsLmRwdHIgKyBvZmZzZXQpID09ICdcMCcpIHsKLSAgICAgICAgICAgICAgICArK29mZnNldDsKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBkcC0+YXV0aF91c2VyID0gYXBfcHN0cmR1cChsb2NrZGItPmluZm8tPnBvb2wsIHZhbC5kcHRyICsgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc3RybGVuKGRwLT5hdXRoX3VzZXIpICsgMTsKLSAgICAgICAgICAgIH0KLQotCSAgICBpZiAoIWRhdl9mc19sb2NrX2V4cGlyZWQoZHAtPmYudGltZW91dCkpIHsKLQkJZHAtPm5leHQgPSAqZGlyZWN0OwotCQkqZGlyZWN0ID0gZHA7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCW5lZWRfc2F2ZSA9IERBVl9UUlVFOwotCi0JCS8qIFJlbW92ZSB0aW1lZC1vdXQgbG9ja251bGwgZm0gLmxvY2tudWxsIGxpc3QgKi8KLQkJaWYgKCprZXkuZHB0ciA9PSBEQVZfVFlQRV9GTkFNRSkgewotCQkgICAgY29uc3QgY2hhciAqZm5hbWUgPSBrZXkuZHB0ciArIDE7Ci0JCSAgICBzdHJ1Y3Qgc3RhdCBmaW5mbzsKLQotCQkgICAgLyogaWYgd2UgZG9uJ3Qgc2VlIHRoZSBmaWxlLCB0aGVuIGl0J3MgYSBsb2NrbnVsbCAqLwotCQkgICAgaWYgKGxzdGF0KGZuYW1lLCAmZmluZm8pICE9IDApIHsKLQkJCWlmICgoZXJyID0gZGF2X2ZzX3JlbW92ZV9sb2NrbnVsbF9tZW1iZXIobG9ja2RiLT5pbmZvLT5wb29sLCBmbmFtZSwgJmJ1ZikpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAjIyMgcHVzaCBhIGhpZ2hlci1sZXZlbCBkZXNjcmlwdGlvbj8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQljYXNlIERBVl9MT0NLX0lORElSRUNUOgotCSAgICAvKiBDcmVhdGUgYW5kIGZpbGwgYSBkYXZfbG9ja19pbmRpcmVjdCBzdHJ1Y3R1cmUgKi8KLQotCSAgICBpcCA9IGFwX3BjYWxsb2MobG9ja2RiLT5pbmZvLT5wb29sLCBzaXplb2YoKmlwKSk7Ci0gICAgICAgICAgICBpcC0+bG9ja3Rva2VuID0gYXBfcGFsbG9jKGxvY2tkYi0+aW5mby0+cG9vbCwgc2l6ZW9mKCppcC0+bG9ja3Rva2VuKSk7Ci0JICAgIG1lbWNweShpcC0+bG9ja3Rva2VuLCB2YWwuZHB0ciArIG9mZnNldCwgc2l6ZW9mKCppcC0+bG9ja3Rva2VuKSk7Ci0JICAgIG9mZnNldCArPSBzaXplb2YoKmlwLT5sb2NrdG9rZW4pOwotCSAgICBtZW1jcHkoJmlwLT50aW1lb3V0LCB2YWwuZHB0ciArIG9mZnNldCwgc2l6ZW9mKGlwLT50aW1lb3V0KSk7Ci0JICAgIG9mZnNldCArPSBzaXplb2YoaXAtPnRpbWVvdXQpOwotCSAgICBpcC0+a2V5LmRzaXplID0gKigoaW50ICopICh2YWwuZHB0ciArIG9mZnNldCkpOwkvKiBsZW5ndGggb2YgZGF0dW0gKi8KLQkgICAgb2Zmc2V0ICs9IHNpemVvZihpcC0+a2V5LmRzaXplKTsKLQkgICAgaXAtPmtleS5kcHRyID0gYXBfcGFsbG9jKGxvY2tkYi0+aW5mby0+cG9vbCwgaXAtPmtleS5kc2l6ZSk7IAotCSAgICBtZW1jcHkoaXAtPmtleS5kcHRyLCB2YWwuZHB0ciArIG9mZnNldCwgaXAtPmtleS5kc2l6ZSk7Ci0JICAgIG9mZnNldCArPSBpcC0+a2V5LmRzaXplOwotCi0JICAgIGlmICghZGF2X2ZzX2xvY2tfZXhwaXJlZChpcC0+dGltZW91dCkpIHsKLQkJaXAtPm5leHQgPSAqaW5kaXJlY3Q7Ci0JCSppbmRpcmVjdCA9IGlwOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQluZWVkX3NhdmUgPSBEQVZfVFJVRTsKLQkJLyogQSBsb2NrbnVsbCByZXNvdXJjZSB3aWxsIG5ldmVyIGJlIGxvY2tlZCBpbmRpcmVjdGx5ICovCi0JICAgIH0KLQotCSAgICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICAgICgqZGF2X2hvb2tzX2RiX2RibS5mcmVlZGF0dW0pKGxvY2tkYi0+aW5mby0+ZGIsIHZhbCk7Ci0KLQkgICAgLyogIyMjIHNob3VsZCB1c2UgYSBjb21wdXRlZF9kZXNjIGFuZCBpbnNlcnQgY29ycnVwdCB0b2tlbiBkYXRhICovCi0JICAgIC0tb2Zmc2V0OwotCSAgICByZXR1cm4gZGF2X25ld19lcnJvcihsb2NrZGItPmluZm8tPnBvb2wsCi0JCQkJIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAotCQkJCSBEQVZfRVJSX0xPQ0tfQ09SUlVQVF9EQiwKLQkJCQkgYXBfcHNwcmludGYobG9ja2RiLT5pbmZvLT5wb29sLAotCQkJCQkgICAgICJUaGUgbG9jayBkYXRhYmFzZSB3YXMgZm91bmQgdG8gIgotCQkJCQkgICAgICJiZSBjb3JydXB0LiBvZmZzZXQgJWksIGM9JTAyeCIsCi0JCQkJCSAgICAgb2Zmc2V0LCB2YWwuZHB0cltvZmZzZXRdKSk7Ci0JfQotICAgIH0KLQotICAgICgqZGF2X2hvb2tzX2RiX2RibS5mcmVlZGF0dW0pKGxvY2tkYi0+aW5mby0+ZGIsIHZhbCk7Ci0KLSAgICAvKiBDbGVhbiB1cCB0aGlzIHJlY29yZCBpZiB3ZSBmb3VuZCBleHBpcmVkIGxvY2tzICovCi0gICAgLyoKLSAgICAqKiAjIyMgc2hvdWxkbid0IGRvIHRoaXMgaWYgd2UndmUgYmVlbiBvcGVuZWQgUkVBRE9OTFkuIGVsaWRlIHRoZQotICAgICoqICMjIyB0aW1lZC1vdXQgbG9ja3MgZnJvbSB0aGUgcmVzcG9uc2UsIGJ1dCBkb24ndCBzYXZlIHRoYXQgaW5mbyBiYWNrCi0gICAgKi8KLSAgICBpZiAobmVlZF9zYXZlID09IERBVl9UUlVFKSB7Ci0JcmV0dXJuIGRhdl9mc19zYXZlX2xvY2tfcmVjb3JkKGxvY2tkYiwga2V5LCAqZGlyZWN0LCAqaW5kaXJlY3QpOwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi0vKiByZXNvbHZlIDxpbmRpcmVjdD4sIHJldHVybmluZyA8KmRpcmVjdD4gKi8KLXN0YXRpYyBkYXZfZXJyb3IgKiBkYXZfZnNfcmVzb2x2ZShkYXZfbG9ja2RiICpsb2NrZGIsCi0JCQkJICBkYXZfbG9ja19pbmRpcmVjdCAqaW5kaXJlY3QsCi0JCQkJICBkYXZfbG9ja19kaXNjb3ZlcnkgKipkaXJlY3QsCi0JCQkJICBkYXZfbG9ja19kaXNjb3ZlcnkgKipyZWZfZHAsCi0JCQkJICBkYXZfbG9ja19pbmRpcmVjdCAqKnJlZl9pcCkKLXsKLSAgICBkYXZfZXJyb3IgKmVycjsKLSAgICBkYXZfbG9ja19kaXNjb3ZlcnkgKmRpcjsKLSAgICBkYXZfbG9ja19pbmRpcmVjdCAqaW5kOwotCQotICAgIGlmICgoZXJyID0gZGF2X2ZzX2xvYWRfbG9ja19yZWNvcmQobG9ja2RiLCBpbmRpcmVjdC0+a2V5LAotCQkJCSAgICAgICBEQVZfQ1JFQVRFX0xJU1QsCi0JCQkJICAgICAgICZkaXIsICZpbmQpKSAhPSBOVUxMKSB7Ci0JLyogIyMjIGluc2VydCBhIGhpZ2hlci1sZXZlbCBkZXNjcmlwdGlvbj8gKi8KLQlyZXR1cm4gZXJyOwotICAgIH0KLSAgICBpZiAocmVmX2RwICE9IE5VTEwpIHsKLQkqcmVmX2RwID0gZGlyOwotCSpyZWZfaXAgPSBpbmQ7Ci0gICAgfQotCQkKLSAgICBmb3IgKDsgZGlyICE9IE5VTEw7IGRpciA9IGRpci0+bmV4dCkgewotCWlmICghZGF2X2NvbXBhcmVfb3BhcXVlbG9ja3Rva2VuKGluZGlyZWN0LT5sb2NrdG9rZW4tPnV1aWQsIAotCQkJCQkgZGlyLT5sb2NrdG9rZW4tPnV1aWQpKSB7Ci0JICAgICpkaXJlY3QgPSBkaXI7Ci0JICAgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLSAgICAvKiBObyBtYXRjaCBmb3VuZCAoYnV0IHdlIHNob3VsZCBoYXZlIGZvdW5kIG9uZSEpICovCi0KLSAgICAvKiAjIyMgdXNlIGEgZGlmZmVyZW50IGRlc2NyaXB0aW9uIGFuZC9vciBlcnJvciBJRD8gKi8KLSAgICByZXR1cm4gZGF2X25ld19lcnJvcihsb2NrZGItPmluZm8tPnBvb2wsCi0JCQkgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsCi0JCQkgREFWX0VSUl9MT0NLX0NPUlJVUFRfREIsCi0JCQkgIlRoZSBsb2NrIGRhdGFiYXNlIHdhcyBmb3VuZCB0byBiZSBjb3JydXB0LiAiCi0JCQkgIkFuIGluZGlyZWN0IGxvY2sncyBkaXJlY3QgbG9jayBjb3VsZCBub3QgIgotCQkJICJiZSBmb3VuZC4iKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qKgotKiogUHJvcGVydHktcmVsYXRlZCBsb2NrIGZ1bmN0aW9ucwotKioKLSovCi0KLS8qCi0qKiBkYXZfZnNfZ2V0X3N1cHBvcnRlZGxvY2s6ICBSZXR1cm5zIGEgc3RhdGljIHN0cmluZyBmb3IgYWxsIHN1cHBvcnRlZGxvY2sKLSoqICAgIHByb3BlcnRpZXMuIEkgdGhpbmsgd2Ugc2F2ZSBtb3JlIHJldHVybmluZyBhIHN0YXRpYyBzdHJpbmcgdGhhbgotKiogICAgY29uc3RydWN0aW5nIGl0IGV2ZXJ5IHRpbWUsIHRob3VnaCBpdCBtaWdodCBsb29rIGNsZWFuZXIuCi0qLwotc3RhdGljIGNvbnN0IGNoYXIgKmRhdl9mc19nZXRfc3VwcG9ydGVkbG9jayh2b2lkKQotewotICAgIHN0YXRpYyBjb25zdCBjaGFyIHN1cHBvcnRlZFtdID0gREVCVUdfQ1IKLQkiPEQ6bG9ja2VudHJ5PiIgREVCVUdfQ1IKLQkiPEQ6bG9ja3Njb3BlPjxEOmV4Y2x1c2l2ZS8+PC9EOmxvY2tzY29wZT4iIERFQlVHX0NSCi0JIjxEOmxvY2t0eXBlPjxEOndyaXRlLz48L0Q6bG9ja3R5cGU+IiBERUJVR19DUgotCSI8L0Q6bG9ja2VudHJ5PiIgREVCVUdfQ1IKLQkiPEQ6bG9ja2VudHJ5PiIgREVCVUdfQ1IKLQkiPEQ6bG9ja3Njb3BlPjxEOnNoYXJlZC8+PC9EOmxvY2tzY29wZT4iIERFQlVHX0NSCi0JIjxEOmxvY2t0eXBlPjxEOndyaXRlLz48L0Q6bG9ja3R5cGU+IiBERUJVR19DUgotCSI8L0Q6bG9ja2VudHJ5PiIgREVCVUdfQ1I7Ci0KLSAgICByZXR1cm4gc3VwcG9ydGVkOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoqCi0qKiBHZW5lcmFsIGxvY2sgZnVuY3Rpb25zCi0qKgotKi8KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qKgotKiogRnVuY3Rpb25zIGRlYWxpbmcgd2l0aCBsb2NrLW51bGwgcmVzb3VyY2VzCi0qKgotKi8KLQotLyoKLSoqIGRhdl9mc19sb2FkX2xvY2tudWxsX2xpc3Q6ICBSZXR1cm5zIGEgZGF2X2J1ZmZlciBkdW1wIG9mIHRoZSBsb2NrbnVsbCBmaWxlCi0qKiAgICBmb3IgdGhlIGdpdmVuIGRpcmVjdG9yeS4KLSovCi1zdGF0aWMgZGF2X2Vycm9yICogZGF2X2ZzX2xvYWRfbG9ja251bGxfbGlzdChwb29sICpwLCBjb25zdCBjaGFyICpkaXJwYXRoLAotCQkJCQkgICAgIGRhdl9idWZmZXIgKnBidWYpIAotewotICAgIHN0cnVjdCBzdGF0IGZpbmZvOwotICAgIGludCBmZDsKLSAgICBkYXZfZXJyb3IgKmVyciA9IE5VTEw7Ci0KLSAgICBkYXZfYnVmZmVyX2luaXQocCwgcGJ1ZiwgZGlycGF0aCk7Ci0KLSAgICBpZiAocGJ1Zi0+YnVmW3BidWYtPmN1cl9sZW4gLSAxXSA9PSAnLycpCi0JcGJ1Zi0+YnVmWy0tcGJ1Zi0+Y3VyX2xlbl0gPSAnXDAnOwotCi0gICAgZGF2X2J1ZmZlcl9wbGFjZShwLCBwYnVmLCAiLyIgREFWX0ZTX1NUQVRFX0RJUiAiLyIgREFWX0ZTX0xPQ0tfTlVMTF9GSUxFKTsKLQotICAgIC8qIHJlc2V0IHRoaXMgaW4gY2FzZSB3ZSBsZWF2ZSB3L28gcmVhZGluZyBpbnRvIHRoZSBidWZmZXIgKi8KLSAgICBwYnVmLT5jdXJfbGVuID0gMDsKLQotICAgIGlmICgoZmQgPSBvcGVuKHBidWYtPmJ1ZiwgT19SRE9OTFkgfCBPX0JJTkFSWSkpID09IC0xKSB7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKGZzdGF0KGZkLCAmZmluZm8pID09IC0xKSB7Ci0JZXJyID0gZGF2X25ld19lcnJvcihwLCBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgMCwKLQkJCSAgICBhcF9wc3ByaW50ZihwLAotCQkJCQkiT3BlbmVkIGJ1dCBjb3VsZCBub3Qgc3RhdCBmaWxlICVzIiwKLQkJCQkJcGJ1Zi0+YnVmKSk7Ci0JZ290byBsb2FkZXJyb3I7Ci0gICAgfQotCi0gICAgZGF2X3NldF9idWZzaXplKHAsIHBidWYsIGZpbmZvLnN0X3NpemUpOwotICAgIGlmIChyZWFkKGZkLCBwYnVmLT5idWYsIGZpbmZvLnN0X3NpemUpICE9IGZpbmZvLnN0X3NpemUpIHsKLQllcnIgPSBkYXZfbmV3X2Vycm9yKHAsIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCAwLAotCQkJICAgIGFwX3BzcHJpbnRmKHAsCi0JCQkJCSJGYWlsdXJlIHJlYWRpbmcgbG9ja251bGwgZmlsZSAiCi0JCQkJCSJmb3IgJXMiLCBkaXJwYXRoKSk7Ci0KLQkvKiBqdXN0IGluIGNhc2UgdGhlIGNhbGxlciBkaXNyZWdhcmRzIHRoZSByZXR1cm5lZCBlcnJvciAqLwotCXBidWYtPmN1cl9sZW4gPSAwOwotCWdvdG8gbG9hZGVycm9yOwotICAgIH0KLQotICBsb2FkZXJyb3I6Ci0gICAgY2xvc2UoZmQpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qCi0qKiBkYXZfZnNfc2F2ZV9sb2NrbnVsbF9saXN0OiAgU2F2ZXMgY29udGVudHMgb2YgcGJ1ZiBpbnRvIHRoZQotKiogICAgbG9ja251bGwgZmlsZSBmb3IgZGlycGF0aC4KLSovCi1zdGF0aWMgZGF2X2Vycm9yICogZGF2X2ZzX3NhdmVfbG9ja251bGxfbGlzdChwb29sICpwLCBjb25zdCBjaGFyICpkaXJwYXRoLAotCQkJCQkgICAgIGRhdl9idWZmZXIgKnBidWYpCi17Ci0gICAgY29uc3QgY2hhciAqcGF0aG5hbWU7Ci0gICAgaW50IGZkOwotICAgIGRhdl9lcnJvciAqZXJyID0gTlVMTDsKLQotICAgIGlmIChwYnVmLT5idWYgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLQotICAgIGRhdl9mc19lbnN1cmVfc3RhdGVfZGlyKHAsIGRpcnBhdGgpOwotICAgIHBhdGhuYW1lID0gYXBfcHN0cmNhdChwLAotCQkJICBkaXJwYXRoLAotCQkJICBkaXJwYXRoW3N0cmxlbihkaXJwYXRoKSAtIDFdID09ICcvJyA/ICIiIDogIi8iLAotCQkJICBEQVZfRlNfU1RBVEVfRElSICIvIiBEQVZfRlNfTE9DS19OVUxMX0ZJTEUsCi0JCQkgIE5VTEwpOwotCi0gICAgaWYgKHBidWYtPmN1cl9sZW4gPT0gMCkgewotCS8qIGRlbGV0ZSB0aGUgZmlsZSBpZiBjdXJfbGVuID09IDAgKi8KLQlpZiAocmVtb3ZlKHBhdGhuYW1lKSAhPSAwKSB7Ci0JICAgIHJldHVybiBkYXZfbmV3X2Vycm9yKHAsIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCAwLAotCQkJCSBhcF9wc3ByaW50ZihwLAotCQkJCQkgICAgICJFcnJvciByZW1vdmluZyAlcyIsIHBhdGhuYW1lKSk7Ci0JfQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmICgoZmQgPSBvcGVuKHBhdGhuYW1lLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19CSU5BUlksCi0JCSAgIERBVl9GU19NT0RFX0ZJTEUpKSA9PSAtMSkgewotCXJldHVybiBkYXZfbmV3X2Vycm9yKHAsIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCAwLAotCQkJICAgICBhcF9wc3ByaW50ZihwLAotCQkJCQkgIkVycm9yIG9wZW5pbmcgJXMgZm9yIHdyaXRpbmciLAotCQkJCQkgcGF0aG5hbWUpKTsKLSAgICB9Ci0KLSAgICBpZiAod3JpdGUoZmQsIHBidWYtPmJ1ZiwgcGJ1Zi0+Y3VyX2xlbikgIT0gcGJ1Zi0+Y3VyX2xlbikgewotCWVyciA9IGRhdl9uZXdfZXJyb3IocCwgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsIDAsCi0JCQkgICAgYXBfcHNwcmludGYocCwKLQkJCQkJIkVycm9yIHdyaXRpbmcgJWkgYnl0ZXMgdG8gJXMiLAotCQkJCQlwYnVmLT5jdXJfbGVuLCBwYXRobmFtZSkpOwotICAgIH0KLQotICAgIGNsb3NlKGZkKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKgotKiogZGF2X2ZzX3JlbW92ZV9sb2NrbnVsbF9tZW1iZXI6ICBSZW1vdmVzIGZpbGVuYW1lIGZyb20gdGhlIGxvY2tudWxsIGxpc3QKLSoqICAgIGZvciBkaXJlY3RvcnkgcGF0aC4KLSovCi1zdGF0aWMgZGF2X2Vycm9yICogZGF2X2ZzX3JlbW92ZV9sb2NrbnVsbF9tZW1iZXIocG9vbCAqcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0JCQkJCQkgZGF2X2J1ZmZlciAqcGJ1ZikKLXsKLSAgICBkYXZfZXJyb3IgKmVycjsKLSAgICBzaXplX3QgbGVuOwotICAgIHNpemVfdCBzY2FubGVuOwotICAgIGNoYXIgKnNjYW47Ci0gICAgY29uc3QgY2hhciAqc2NhbmVuZDsKLSAgICBjaGFyICpkaXJwYXRoID0gYXBfcHN0cmR1cChwLCBmaWxlbmFtZSk7Ci0gICAgY2hhciAqZm5hbWUgPSBzdHJyY2hyKGRpcnBhdGgsICcvJyk7Ci0gICAgaW50IGRpcnR5ID0gMDsKLQotICAgIGlmIChmbmFtZSAhPSBOVUxMKQotCSpmbmFtZSsrID0gJ1wwJzsKLSAgICBlbHNlCi0JZm5hbWUgPSBkaXJwYXRoOwotICAgIGxlbiA9IHN0cmxlbihmbmFtZSkgKyAxOwotCi0gICAgaWYgKChlcnIgPSBkYXZfZnNfbG9hZF9sb2NrbnVsbF9saXN0KHAsIGRpcnBhdGgsIHBidWYpKSAhPSBOVUxMKSB7Ci0JLyogIyMjIGFkZCBhIGhpZ2hlciBsZXZlbCBkZXNjcmlwdGlvbj8gKi8KLQlyZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGZvciAoc2NhbiA9IHBidWYtPmJ1Ziwgc2NhbmVuZCA9IHNjYW4gKyBwYnVmLT5jdXJfbGVuOwotCSBzY2FuIDwgc2NhbmVuZDsKLQkgc2NhbiArPSBzY2FubGVuKSB7Ci0Jc2NhbmxlbiA9IHN0cmxlbihzY2FuKSArIDE7Ci0JaWYgKGxlbiA9PSBzY2FubGVuICYmIG1lbWNtcChmbmFtZSwgc2Nhbiwgc2NhbmxlbikgPT0gMCkgewotCSAgICBwYnVmLT5jdXJfbGVuIC09IHNjYW5sZW47Ci0JICAgIG1lbW1vdmUoc2Nhbiwgc2NhbiArIHNjYW5sZW4sIHNjYW5lbmQgLSAoc2NhbiArIHNjYW5sZW4pKTsKLQkgICAgZGlydHkgPSAxOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gICAgaWYgKGRpcnR5KSB7Ci0JaWYgKChlcnIgPSBkYXZfZnNfc2F2ZV9sb2NrbnVsbF9saXN0KHAsIGRpcnBhdGgsIHBidWYpKSAhPSBOVUxMKSB7Ci0JICAgIC8qICMjIyBhZGQgYSBoaWdoZXIgbGV2ZWwgZGVzY3JpcHRpb24/ICovCi0JICAgIHJldHVybiBlcnI7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi0vKiBOb3RlOiB1c2VkIGJ5IGRhdl9mc19yZXBvcy5jICovCi1kYXZfZXJyb3IgKiBkYXZfZnNfZ2V0X2xvY2tudWxsX21lbWJlcnMoCi0gICAgY29uc3QgZGF2X3Jlc291cmNlICpyZXNvdXJjZSwKLSAgICBkYXZfYnVmZmVyICpwYnVmKQotewotICAgIGNvbnN0IGNoYXIgKmRpcnBhdGg7Ci0KLSAgICBkYXZfZnNfZGlyX2ZpbGVfbmFtZShyZXNvdXJjZSwgJmRpcnBhdGgsIE5VTEwpOwotICAgIHJldHVybiBkYXZfZnNfbG9hZF9sb2NrbnVsbF9saXN0KGRhdl9mc19wb29sKHJlc291cmNlKSwgZGlycGF0aCwgcGJ1Zik7Ci19Ci0KLS8qICMjIyBmb2xkIGludG8gYXBwZW5kX2xvY2s/ICovCi0vKiAjIyMgdGFrZSBhbiBvcHRpb25hbCBidWYgcGFyYW1ldGVyPyAqLwotc3RhdGljIGRhdl9lcnJvciAqIGRhdl9mc19hZGRfbG9ja251bGxfc3RhdGUoCi0gICAgZGF2X2xvY2tkYiAqbG9ja2RiLAotICAgIGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UpCi17Ci0gICAgZGF2X2J1ZmZlciBidWYgPSB7IDAgfTsKLSAgICBwb29sICpwID0gbG9ja2RiLT5pbmZvLT5wb29sOwotICAgIGNvbnN0IGNoYXIgKmRpcnBhdGg7Ci0gICAgY29uc3QgY2hhciAqZm5hbWU7Ci0gICAgZGF2X2Vycm9yICplcnI7Ci0KLSAgICBkYXZfZnNfZGlyX2ZpbGVfbmFtZShyZXNvdXJjZSwgJmRpcnBhdGgsICZmbmFtZSk7Ci0KLSAgICBpZiAoKGVyciA9IGRhdl9mc19sb2FkX2xvY2tudWxsX2xpc3QocCwgZGlycGF0aCwgJmJ1ZikpICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGRhdl9wdXNoX2Vycm9yKHAsIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCAwLAotCQkJICAgICAgIkNvdWxkIG5vdCBsb2FkIC5sb2NrbnVsbCBmaWxlLiIsIGVycik7Ci0gICAgfQotCi0gICAgZGF2X2J1ZmZlcl9hcHBlbmQocCwgJmJ1ZiwgZm5hbWUpOwotICAgIGJ1Zi5jdXJfbGVuKys7CS8qIHdlIHdhbnQgdGhlIG51bGwtdGVybSBoZXJlICovCi0KLSAgICBpZiAoKGVyciA9IGRhdl9mc19zYXZlX2xvY2tudWxsX2xpc3QocCwgZGlycGF0aCwgJmJ1ZikpICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGRhdl9wdXNoX2Vycm9yKHAsIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCAwLAotCQkJICAgICAgIkNvdWxkIG5vdCBzYXZlIC5sb2NrbnVsbCBmaWxlLiIsIGVycik7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0qKiBkYXZfZnNfcmVtb3ZlX2xvY2tudWxsX3N0YXRlOiAgR2l2ZW4gYSByZXF1ZXN0LCBjaGVjayB0byBzZWUgaWYgci0+ZmlsZW5hbWUKLSoqICAgIGlzL3dhcyBhIGxvY2stbnVsbCByZXNvdXJjZS4gIElmIHNvLCByZXR1cm4gaXQgdG8gYW4gZXhpc3RhbnQgc3RhdGUuCi0qKgotKiogICAgIyMjIHRoaXMgZnVuY3Rpb24gaXMgYnJva2VuLi4uIGl0IGRvZXNuJ3QgY2hlY2shCi0qKgotKiogICAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgdGhpcyBpbnZvbHZlcyB0d28gdGhpbmdzOgotKiogICAgKGEpIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IGluIHRoZSBhcHByb3ByaWF0ZSAuREFWL2xvY2tudWxsIGZpbGUKLSoqICAgIChiKSBvbiAqbml4LCBjb252ZXJ0IHRoZSBrZXkgZnJvbSBhIGZpbGVuYW1lIHRvIGFuIGlub2RlLgotKi8KLXN0YXRpYyBkYXZfZXJyb3IgKiBkYXZfZnNfcmVtb3ZlX2xvY2tudWxsX3N0YXRlKAotICAgIGRhdl9sb2NrZGIgKmxvY2tkYiwKLSAgICBjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlKQotewotICAgIGRhdl9idWZmZXIgYnVmID0geyAwIH07Ci0gICAgZGF2X2Vycm9yICplcnI7Ci0gICAgcG9vbCAqcCA9IGxvY2tkYi0+aW5mby0+cG9vbDsKLSAgICBjb25zdCBjaGFyICpwYXRobmFtZSA9IGRhdl9mc19wYXRobmFtZShyZXNvdXJjZSk7Ci0KLSAgICBpZiAoKGVyciA9IGRhdl9mc19yZW1vdmVfbG9ja251bGxfbWVtYmVyKHAsIHBhdGhuYW1lLCAmYnVmKSkgIT0gTlVMTCkgewotCS8qICMjIyBhZGQgYSBoaWdoZXItbGV2ZWwgZGVzY3JpcHRpb24/ICovCi0JcmV0dXJuIGVycjsKLSAgICB9Ci0KLSNpZm5kZWYgV0lOMzIKLSAgICB7Ci0JZGF2X2xvY2tfZGlzY292ZXJ5ICpsZDsKLQlkYXZfbG9ja19pbmRpcmVjdCAgKmlkOwotCWRhdl9kYXR1bSBrZXk7Ci0KLQkvKgotCSoqIEZldGNoIHRoZSBsb2NrKHMpIHRoYXQgbWFkZSB0aGUgcmVzb3VyY2UgbG9jay1udWxsLiBSZW1vdmUKLQkqKiB0aGVtIHVuZGVyIHRoZSBmaWxlbmFtZSBrZXkuIE9idGFpbiB0aGUgbmV3IGlub2RlIGtleSwgYW5kCi0JKiogc2F2ZSB0aGUgc2FtZSBsb2NrIGluZm9ybWF0aW9uIHVuZGVyIGl0LgotCSovCi0Ja2V5ID0gZGF2X2ZzX2J1aWxkX2ZuYW1lX2tleShwLCBwYXRobmFtZSk7Ci0JaWYgKChlcnIgPSBkYXZfZnNfbG9hZF9sb2NrX3JlY29yZChsb2NrZGIsIGtleSwgREFWX0NSRUFURV9MSVNULAotCQkJCQkgICAmbGQsICZpZCkpICE9IE5VTEwpIHsKLQkgICAgLyogIyMjIGluc2VydCBhIGhpZ2hlci1sZXZlbCBlcnJvciBkZXNjcmlwdGlvbiAqLwotCSAgICByZXR1cm4gZXJyOwotCX0KLQotCWlmICgoZXJyID0gZGF2X2ZzX3NhdmVfbG9ja19yZWNvcmQobG9ja2RiLCBrZXksIE5VTEwsIE5VTEwpKSAhPSBOVUxMKSB7Ci0JICAgIC8qICMjIyBpbnNlcnQgYSBoaWdoZXItbGV2ZWwgZXJyb3IgZGVzY3JpcHRpb24gKi8KLQkgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0Ja2V5ID0gZGF2X2ZzX2J1aWxkX2tleShwLCByZXNvdXJjZSk7Ci0JaWYgKChlcnIgPSBkYXZfZnNfc2F2ZV9sb2NrX3JlY29yZChsb2NrZGIsIGtleSwgbGQsIGlkKSkgIT0gTlVMTCkgewotCSAgICAvKiAjIyMgaW5zZXJ0IGEgaGlnaGVyLWxldmVsIGVycm9yIGRlc2NyaXB0aW9uICovCi0JICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgZGF2X2Vycm9yICogZGF2X2ZzX2NyZWF0ZV9sb2NrKGRhdl9sb2NrZGIgKmxvY2tkYiwKLQkJCQkgICAgICBjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlLAotCQkJCSAgICAgIGRhdl9sb2NrICoqbG9jaykKLXsKLSAgICBkYXZfZGF0dW0ga2V5OwotCi0gICAga2V5ID0gZGF2X2ZzX2J1aWxkX2tleShsb2NrZGItPmluZm8tPnBvb2wsIHJlc291cmNlKTsKLQotICAgICpsb2NrID0gZGF2X2ZzX2FsbG9jX2xvY2sobG9ja2RiLAotCQkJICAgICAga2V5LAotCQkJICAgICAgTlVMTCk7Ci0KLSAgICAoKmxvY2spLT5pc19sb2NrbnVsbCA9ICFyZXNvdXJjZS0+ZXhpc3RzOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBkYXZfZXJyb3IgKiBkYXZfZnNfZ2V0X2xvY2tzKGRhdl9sb2NrZGIgKmxvY2tkYiwKLQkJCQkgICAgY29uc3QgZGF2X3Jlc291cmNlICpyZXNvdXJjZSwKLQkJCQkgICAgaW50IGNhbGx0eXBlLAotCQkJCSAgICBkYXZfbG9jayAqKmxvY2tzKQotewotICAgIHBvb2wgKnAgPSBsb2NrZGItPmluZm8tPnBvb2w7Ci0gICAgZGF2X2RhdHVtIGtleTsKLSAgICBkYXZfZXJyb3IgKmVycjsKLSAgICBkYXZfbG9jayAqbG9jayA9IE5VTEw7Ci0gICAgZGF2X2xvY2sgKm5ld2xvY2s7Ci0gICAgZGF2X2xvY2tfZGlzY292ZXJ5ICpkcDsKLSAgICBkYXZfbG9ja19pbmRpcmVjdCAqaXA7Ci0KLSNpZiBEQVZfREVCVUcKLSAgICBpZiAoY2FsbHR5cGUgPT0gREFWX0dFVExPQ0tTX0NPTVBMRVRFKSB7Ci0JcmV0dXJuIGRhdl9uZXdfZXJyb3IobG9ja2RiLT5pbmZvLT5wb29sLAotCQkJICAgICBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgMCwKLQkJCSAgICAgIklOVEVSTkFMIERFU0lHTiBFUlJPUjogREFWX0dFVExPQ0tTX0NPTVBMRVRFICIKLQkJCSAgICAgImlzIG5vdCB5ZXQgc3VwcG9ydGVkIik7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBrZXkgPSBkYXZfZnNfYnVpbGRfa2V5KHAsIHJlc291cmNlKTsKLSAgICBpZiAoKGVyciA9IGRhdl9mc19sb2FkX2xvY2tfcmVjb3JkKGxvY2tkYiwga2V5LCBEQVZfQ1JFQVRFX0xJU1QsCi0JCQkJICAgICAgICZkcCwgJmlwKSkgIT0gTlVMTCkgewotCS8qICMjIyBwdXNoIGEgaGlnaGVyLWxldmVsIGRlc2M/ICovCi0JcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBjb3B5IGFsbCBkaXJlY3QgbG9ja3MgdG8gdGhlIHJlc3VsdCBsaXN0ICovCi0gICAgZm9yICg7IGRwICE9IE5VTEw7IGRwID0gZHAtPm5leHQpIHsKLQluZXdsb2NrID0gZGF2X2ZzX2FsbG9jX2xvY2sobG9ja2RiLCBrZXksIGRwLT5sb2NrdG9rZW4pOwotCW5ld2xvY2stPmlzX2xvY2tudWxsID0gIXJlc291cmNlLT5leGlzdHM7Ci0JbmV3bG9jay0+c2NvcGUgPSBkcC0+Zi5zY29wZTsKLQluZXdsb2NrLT50eXBlID0gZHAtPmYudHlwZTsKLQluZXdsb2NrLT5kZXB0aCA9IGRwLT5mLmRlcHRoOwotCW5ld2xvY2stPnRpbWVvdXQgPSBkcC0+Zi50aW1lb3V0OwotCW5ld2xvY2stPm93bmVyID0gZHAtPm93bmVyOwotICAgICAgICBuZXdsb2NrLT5hdXRoX3VzZXIgPSBkcC0+YXV0aF91c2VyOwotCi0JLyogaG9vayBpbnRvIHRoZSByZXN1bHQgbGlzdCAqLwotCW5ld2xvY2stPm5leHQgPSBsb2NrOwotCWxvY2sgPSBuZXdsb2NrOwotICAgIH0KLQotICAgIC8qIGNvcHkgYWxsIHRoZSBpbmRpcmVjdCBsb2NrcyB0byB0aGUgcmVzdWx0IGxpc3QuIHJlc29sdmUgYXMgbmVlZGVkLiAqLwotICAgIGZvciAoOyBpcCAhPSBOVUxMOyBpcCA9IGlwLT5uZXh0KSB7Ci0JbmV3bG9jayA9IGRhdl9mc19hbGxvY19sb2NrKGxvY2tkYiwgaXAtPmtleSwgaXAtPmxvY2t0b2tlbik7Ci0JbmV3bG9jay0+aXNfbG9ja251bGwgPSAhcmVzb3VyY2UtPmV4aXN0czsKLQotCWlmIChjYWxsdHlwZSA9PSBEQVZfR0VUTE9DS1NfUkVTT0xWRUQpIHsKLQkgICAgaWYgKChlcnIgPSBkYXZfZnNfcmVzb2x2ZShsb2NrZGIsIGlwLCAmZHAsIE5VTEwsIE5VTEwpKSAhPSBOVUxMKSB7Ci0JCS8qICMjIyBwdXNoIGEgaGlnaGVyLWxldmVsIGRlc2M/ICovCi0JCXJldHVybiBlcnI7Ci0JICAgIH0KLQotCSAgICBuZXdsb2NrLT5zY29wZSA9IGRwLT5mLnNjb3BlOwotCSAgICBuZXdsb2NrLT50eXBlID0gZHAtPmYudHlwZTsKLQkgICAgbmV3bG9jay0+ZGVwdGggPSBkcC0+Zi5kZXB0aDsKLQkgICAgbmV3bG9jay0+dGltZW91dCA9IGRwLT5mLnRpbWVvdXQ7Ci0JICAgIG5ld2xvY2stPm93bmVyID0gZHAtPm93bmVyOwotICAgICAgICAgICAgbmV3bG9jay0+YXV0aF91c2VyID0gZHAtPmF1dGhfdXNlcjsKLQl9Ci0JZWxzZSB7Ci0JICAgIC8qIERBVl9HRVRMT0NLU19QQVJUSUFMICovCi0JICAgIG5ld2xvY2stPnJlY3R5cGUgPSBEQVZfTE9DS1JFQ19JTkRJUkVDVF9QQVJUSUFMOwotCX0KLQotCS8qIGhvb2sgaW50byB0aGUgcmVzdWx0IGxpc3QgKi8KLQluZXdsb2NrLT5uZXh0ID0gbG9jazsKLQlsb2NrID0gbmV3bG9jazsKLSAgICB9Ci0KLSAgICAqbG9ja3MgPSBsb2NrOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgZGF2X2Vycm9yICogZGF2X2ZzX2ZpbmRfbG9jayhkYXZfbG9ja2RiICpsb2NrZGIsCi0JCQkJICAgIGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkJICAgIGNvbnN0IGRhdl9sb2NrdG9rZW4gKmxvY2t0b2tlbiwKLQkJCQkgICAgaW50IHBhcnRpYWxfb2ssCi0JCQkJICAgIGRhdl9sb2NrICoqbG9jaykKLXsKLSAgICBkYXZfZXJyb3IgKmVycjsKLSAgICBkYXZfZGF0dW0ga2V5OwotICAgIGRhdl9sb2NrX2Rpc2NvdmVyeSAqZHA7Ci0gICAgZGF2X2xvY2tfaW5kaXJlY3QgKmlwOwotCi0gICAgKmxvY2sgPSBOVUxMOwotCi0gICAga2V5ID0gZGF2X2ZzX2J1aWxkX2tleShsb2NrZGItPmluZm8tPnBvb2wsIHJlc291cmNlKTsKLSAgICBpZiAoKGVyciA9IGRhdl9mc19sb2FkX2xvY2tfcmVjb3JkKGxvY2tkYiwga2V5LCBEQVZfQ1JFQVRFX0xJU1QsCi0JCQkJICAgICAgICZkcCwgJmlwKSkgIT0gTlVMTCkgewotCS8qICMjIyBwdXNoIGEgaGlnaGVyLWxldmVsIGRlc2M/ICovCi0JcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBmb3IgKDsgZHAgIT0gTlVMTDsgZHAgPSBkcC0+bmV4dCkgewotCWlmICghZGF2X2NvbXBhcmVfb3BhcXVlbG9ja3Rva2VuKGxvY2t0b2tlbi0+dXVpZCwKLQkJCQkJIGRwLT5sb2NrdG9rZW4tPnV1aWQpKSB7Ci0JICAgICpsb2NrID0gZGF2X2ZzX2FsbG9jX2xvY2sobG9ja2RiLCBrZXksIGxvY2t0b2tlbik7Ci0JICAgICgqbG9jayktPmlzX2xvY2tudWxsID0gIXJlc291cmNlLT5leGlzdHM7Ci0JICAgICgqbG9jayktPnNjb3BlID0gZHAtPmYuc2NvcGU7Ci0JICAgICgqbG9jayktPnR5cGUgPSBkcC0+Zi50eXBlOwotCSAgICAoKmxvY2spLT5kZXB0aCA9IGRwLT5mLmRlcHRoOwotCSAgICAoKmxvY2spLT50aW1lb3V0ID0gZHAtPmYudGltZW91dDsKLQkgICAgKCpsb2NrKS0+b3duZXIgPSBkcC0+b3duZXI7Ci0gICAgICAgICAgICAoKmxvY2spLT5hdXRoX3VzZXIgPSBkcC0+YXV0aF91c2VyOwotCSAgICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotCi0gICAgZm9yICg7IGlwICE9IE5VTEw7IGlwID0gaXAtPm5leHQpIHsKLQlpZiAoIWRhdl9jb21wYXJlX29wYXF1ZWxvY2t0b2tlbihsb2NrdG9rZW4tPnV1aWQsCi0JCQkJCSBpcC0+bG9ja3Rva2VuLT51dWlkKSkgewotCSAgICAqbG9jayA9IGRhdl9mc19hbGxvY19sb2NrKGxvY2tkYiwgaXAtPmtleSwgbG9ja3Rva2VuKTsKLQkgICAgKCpsb2NrKS0+aXNfbG9ja251bGwgPSAhcmVzb3VyY2UtPmV4aXN0czsKLQotCSAgICAvKiAjIyMgbm9ib2R5IHVzZXMgdGhlIHJlc29sdmluZyByaWdodCBub3chICovCi0JICAgIGlmIChwYXJ0aWFsX29rKSB7Ci0JCSgqbG9jayktPnJlY3R5cGUgPSBEQVZfTE9DS1JFQ19JTkRJUkVDVF9QQVJUSUFMOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQkoKmxvY2spLT5yZWN0eXBlID0gREFWX0xPQ0tSRUNfSU5ESVJFQ1Q7Ci0JCWlmICgoZXJyID0gZGF2X2ZzX3Jlc29sdmUobG9ja2RiLCBpcCwgJmRwLAotCQkJCQkgIE5VTEwsIE5VTEwpKSAhPSBOVUxMKSB7Ci0JCSAgICAvKiAjIyMgcHVzaCBhIGhpZ2hlci1sZXZlbCBkZXNjPyAqLwotCQkgICAgcmV0dXJuIGVycjsKLQkJfQotCQkoKmxvY2spLT5zY29wZSA9IGRwLT5mLnNjb3BlOwotCQkoKmxvY2spLT50eXBlID0gZHAtPmYudHlwZTsKLQkJKCpsb2NrKS0+ZGVwdGggPSBkcC0+Zi5kZXB0aDsKLQkJKCpsb2NrKS0+dGltZW91dCA9IGRwLT5mLnRpbWVvdXQ7Ci0JCSgqbG9jayktPm93bmVyID0gZHAtPm93bmVyOwotICAgICAgICAgICAgICAgICgqbG9jayktPmF1dGhfdXNlciA9IGRwLT5hdXRoX3VzZXI7Ci0JICAgIH0KLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgZGF2X2Vycm9yICogZGF2X2ZzX2hhc19sb2NrcyhkYXZfbG9ja2RiICpsb2NrZGIsCi0JCQkJICAgIGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkJICAgIGludCAqbG9ja3NfcHJlc2VudCkKLXsKLSAgICBkYXZfZXJyb3IgKmVycjsKLSAgICBkYXZfZGF0dW0ga2V5OwotCi0gICAgKmxvY2tzX3ByZXNlbnQgPSAwOwotCi0gICAgaWYgKChlcnIgPSBkYXZfZnNfcmVhbGx5X29wZW5fbG9ja2RiKGxvY2tkYikpICE9IE5VTEwpIHsKLQkvKiAjIyMgaW5zZXJ0IGEgaGlnaGVyLWxldmVsIGVycm9yIGRlc2NyaXB0aW9uICovCi0JcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKgotICAgICoqIElmIHdlIG9wZW5lZCByZWFkb25seSBhbmQgdGhlIGRiIHdhc24ndCB0aGVyZSwgdGhlbiB0aGVyZSBhcmUgbm8KLSAgICAqKiBsb2NrcyBmb3IgdGhpcyByZXNvdXJjZS4gSnVzdCBleGl0LgotICAgICovCi0gICAgaWYgKGxvY2tkYi0+aW5mby0+ZGIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLQotICAgIGtleSA9IGRhdl9mc19idWlsZF9rZXkobG9ja2RiLT5pbmZvLT5wb29sLCByZXNvdXJjZSk7Ci0KLSAgICAqbG9ja3NfcHJlc2VudCA9ICgqZGF2X2hvb2tzX2RiX2RibS5leGlzdHMpKGxvY2tkYi0+aW5mby0+ZGIsIGtleSk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGRhdl9lcnJvciAqIGRhdl9mc19hcHBlbmRfbG9ja3MoZGF2X2xvY2tkYiAqbG9ja2RiLAotCQkJCSAgICAgICBjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlLAotCQkJCSAgICAgICBpbnQgbWFrZV9pbmRpcmVjdCwKLQkJCQkgICAgICAgY29uc3QgZGF2X2xvY2sgKmxvY2spCi17Ci0gICAgcG9vbCAqcCA9IGxvY2tkYi0+aW5mby0+cG9vbDsKLSAgICBkYXZfZXJyb3IgKmVycjsKLSAgICBkYXZfbG9ja19pbmRpcmVjdCAqaXA7Ci0gICAgZGF2X2xvY2tfZGlzY292ZXJ5ICpkcDsKLSAgICBkYXZfZGF0dW0ga2V5OwotCi0gICAga2V5ID0gZGF2X2ZzX2J1aWxkX2tleShsb2NrZGItPmluZm8tPnBvb2wsIHJlc291cmNlKTsKLSAgICBpZiAoKGVyciA9IGRhdl9mc19sb2FkX2xvY2tfcmVjb3JkKGxvY2tkYiwga2V5LCAwLCAmZHAsICZpcCkpICE9IE5VTEwpIHsKLQkvKiAjIyMgbWF5YmUgYWRkIGluIGEgaGlnaGVyLWxldmVsIGRlc2NyaXB0aW9uICovCi0JcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKgotICAgICoqICMjIyB3aGVuIHdlIHN0b3JlIHRoZSBsb2NrIG1vcmUgZGlyZWN0bHksIHdlIG5lZWQgdG8gdXBkYXRlCi0gICAgKiogIyMjIGxvY2stPnJlY3R5cGUgYW5kIGxvY2stPmlzX2xvY2tudWxsCi0gICAgKi8KLQotICAgIGlmIChtYWtlX2luZGlyZWN0KSB7Ci0JZm9yICg7IGxvY2sgIT0gTlVMTDsgbG9jayA9IGxvY2stPm5leHQpIHsKLQotCSAgICAvKiAjIyMgdGhpcyB3b3JrcyBmb3IgYW55IDxsb2NrPiByZWN0eXBlICovCi0JICAgIGRhdl9sb2NrX2luZGlyZWN0ICpuZXdpID0gYXBfcGNhbGxvYyhwLCBzaXplb2YoKm5ld2kpKTsKLQotCSAgICAvKiAjIyMgc2h1dCBvZmYgdGhlIGNvbnN0IHdhcm5pbmcgZm9yIG5vdyAqLwotCSAgICBuZXdpLT5sb2NrdG9rZW4gPSAoZGF2X2xvY2t0b2tlbiAqKWxvY2stPmxvY2t0b2tlbjsKLQkgICAgbmV3aS0+dGltZW91dCAgID0gbG9jay0+dGltZW91dDsKLQkgICAgbmV3aS0+a2V5ICAgICAgID0gbG9jay0+aW5mby0+a2V5OwotCSAgICBuZXdpLT5uZXh0ICAgICAgPSBpcDsKLQkgICAgaXAgICAgICAgICAgICAgID0gbmV3aTsKLQl9Ci0gICAgfQotICAgIGVsc2UgewotCWZvciAoOyBsb2NrICE9IE5VTEw7IGxvY2sgPSBsb2NrLT5uZXh0KSB7Ci0JICAgIC8qIGNyZWF0ZSBhbmQgbGluayBpbiB0aGUgcmlnaHQga2luZCBvZiBsb2NrICovCi0KLQkgICAgaWYgKGxvY2stPnJlY3R5cGUgPT0gREFWX0xPQ0tSRUNfRElSRUNUKSB7Ci0JCWRhdl9sb2NrX2Rpc2NvdmVyeSAqbmV3ZCA9IGFwX3BjYWxsb2MocCwgc2l6ZW9mKCpuZXdkKSk7Ci0KLQkJbmV3ZC0+Zi5zY29wZSA9IGxvY2stPnNjb3BlOwotCQluZXdkLT5mLnR5cGUgPSBsb2NrLT50eXBlOwotCQluZXdkLT5mLmRlcHRoID0gbG9jay0+ZGVwdGg7Ci0JCW5ld2QtPmYudGltZW91dCA9IGxvY2stPnRpbWVvdXQ7Ci0JCS8qICMjIyBzaHV0IG9mZiB0aGUgY29uc3Qgd2FybmluZyBmb3Igbm93ICovCi0JCW5ld2QtPmxvY2t0b2tlbiA9IChkYXZfbG9ja3Rva2VuICopbG9jay0+bG9ja3Rva2VuOwotCQluZXdkLT5vd25lciA9IGxvY2stPm93bmVyOwotICAgICAgICAgICAgICAgIG5ld2QtPmF1dGhfdXNlciA9IGxvY2stPmF1dGhfdXNlcjsKLQkJbmV3ZC0+bmV4dCA9IGRwOwotCQlkcCA9IG5ld2Q7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCS8qIERBVl9MT0NLUkVDX0lORElSRUNUKF9QQVJUSUFMKSAqLwotCi0JCWRhdl9sb2NrX2luZGlyZWN0ICpuZXdpID0gYXBfcGNhbGxvYyhwLCBzaXplb2YoKm5ld2kpKTsKLQotCQkvKiAjIyMgc2h1dCBvZmYgdGhlIGNvbnN0IHdhcm5pbmcgZm9yIG5vdyAqLwotCQluZXdpLT5sb2NrdG9rZW4gPSAoZGF2X2xvY2t0b2tlbiAqKWxvY2stPmxvY2t0b2tlbjsKLQkJbmV3aS0+a2V5ICAgICAgID0gbG9jay0+aW5mby0+a2V5OwotCQluZXdpLT5uZXh0ICAgICAgPSBpcDsKLQkJaXAgICAgICAgICAgICAgID0gbmV3aTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICBpZiAoKGVyciA9IGRhdl9mc19zYXZlX2xvY2tfcmVjb3JkKGxvY2tkYiwga2V5LCBkcCwgaXApKSAhPSBOVUxMKSB7Ci0JLyogIyMjIG1heWJlIGFkZCBhIGhpZ2hlci1sZXZlbCBkZXNjcmlwdGlvbiAqLwotCXJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogd2UgaGF2ZSBhIHNwZWNpYWwgbGlzdCBmb3IgcmVjb3JkaW5nIGxvY2tudWxsIHJlc291cmNlcyAqLwotICAgIC8qICMjIyBhY2shIHRoaXMgY2FuIGFkZCB0d28gY29waWVzIHRvIHRoZSBsb2NrbnVsbCBsaXN0ICovCi0gICAgaWYgKCFyZXNvdXJjZS0+ZXhpc3RzCi0JJiYgKGVyciA9IGRhdl9mc19hZGRfbG9ja251bGxfc3RhdGUobG9ja2RiLCByZXNvdXJjZSkpICE9IE5VTEwpIHsKLQkvKiAjIyMgbWF5YmUgYWRkIGEgaGlnaGVyLWxldmVsIGRlc2NyaXB0aW9uICovCi0JcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGRhdl9lcnJvciAqIGRhdl9mc19yZW1vdmVfbG9jayhkYXZfbG9ja2RiICpsb2NrZGIsCi0JCQkJICAgICAgY29uc3QgZGF2X3Jlc291cmNlICpyZXNvdXJjZSwKLQkJCQkgICAgICBjb25zdCBkYXZfbG9ja3Rva2VuICpsb2NrdG9rZW4pCi17Ci0gICAgZGF2X2Vycm9yICplcnI7Ci0gICAgZGF2X2J1ZmZlciBidWYgPSB7IDAgfTsKLSAgICBkYXZfbG9ja19kaXNjb3ZlcnkgKmRoID0gTlVMTDsKLSAgICBkYXZfbG9ja19pbmRpcmVjdCAqaWggPSBOVUxMOwotICAgIGRhdl9kYXR1bSBrZXk7Ci0KLSAgICBrZXkgPSBkYXZfZnNfYnVpbGRfa2V5KGxvY2tkYi0+aW5mby0+cG9vbCwgcmVzb3VyY2UpOwotCi0gICAgaWYgKGxvY2t0b2tlbiAhPSBOVUxMKSB7Ci0JZGF2X2xvY2tfZGlzY292ZXJ5ICpkcDsKLQlkYXZfbG9ja19kaXNjb3ZlcnkgKmRwcmV2ID0gTlVMTDsKLQlkYXZfbG9ja19pbmRpcmVjdCAqaXA7Ci0JZGF2X2xvY2tfaW5kaXJlY3QgKmlwcmV2ID0gTlVMTDsKLQotCWlmICgoZXJyID0gZGF2X2ZzX2xvYWRfbG9ja19yZWNvcmQobG9ja2RiLCBrZXksIERBVl9DUkVBVEVfTElTVCwKLQkJCQkJICAgJmRoLCAmaWgpKSAhPSBOVUxMKSB7Ci0JICAgIC8qICMjIyBtYXliZSBhZGQgYSBoaWdoZXItbGV2ZWwgZGVzY3JpcHRpb24gKi8KLQkgICAgcmV0dXJuIGVycjsKLQl9Ci0KLQlmb3IgKGRwID0gZGg7IGRwICE9IE5VTEw7IGRwID0gZHAtPm5leHQpIHsKLQkgICAgaWYgKGRhdl9jb21wYXJlX29wYXF1ZWxvY2t0b2tlbihsb2NrdG9rZW4tPnV1aWQsCi0JCQkJCSAgICBkcC0+bG9ja3Rva2VuLT51dWlkKSA9PSAwKSB7Ci0JCWlmIChkcHJldikKLQkJICAgIGRwcmV2LT5uZXh0ID0gZHAtPm5leHQ7Ci0JCWVsc2UKLQkJICAgIGRoID0gZGgtPm5leHQ7Ci0JICAgIH0KLQkgICAgZHByZXYgPSBkcDsKLQl9Ci0KLQlmb3IgKGlwID0gaWg7IGlwICE9IE5VTEw7IGlwID0gaXAtPm5leHQpIHsKLQkgICAgaWYgKGRhdl9jb21wYXJlX29wYXF1ZWxvY2t0b2tlbihsb2NrdG9rZW4tPnV1aWQsCi0JCQkJCSAgICBpcC0+bG9ja3Rva2VuLT51dWlkKSA9PSAwKSB7Ci0JCWlmIChpcHJldikKLQkJICAgIGlwcmV2LT5uZXh0ID0gaXAtPm5leHQ7Ci0JCWVsc2UKLQkJICAgIGloID0gaWgtPm5leHQ7Ci0JICAgIH0KLQkgICAgaXByZXYgPSBpcDsKLQl9Ci0KLSAgICB9Ci0KLSAgICAvKiBzYXZlIHRoZSBtb2RpZmllZCBsb2Nrcywgb3IgcmVtb3ZlIGFsbCBsb2NrcyAoZGg9aWg9TlVMTCkuICovCi0gICAgaWYgKChlcnIgPSBkYXZfZnNfc2F2ZV9sb2NrX3JlY29yZChsb2NrZGIsIGtleSwgZGgsIGloKSkgIT0gTlVMTCkgewotICAgICAgICAvKiAjIyMgbWF5YmUgYWRkIGEgaGlnaGVyLWxldmVsIGRlc2NyaXB0aW9uICovCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqKiBJZiB0aGlzIHJlc291cmNlIGlzIGEgbG9ja251bGwgcmVzb3VyY2UgQU5EIG5vIG1vcmUgbG9ja3MgZXhpc3QsCi0gICAgKiogdGhlbiByZW1vdmUgdGhlIGxvY2tudWxsIG1lbWJlci4KLSAgICAqKgotICAgICoqIE5vdGU6IHJlbW92ZV9sb2NrbnVsbF9zdGF0ZSgpIGF0dGVtcHRzIHRvIGNvbnZlcnQgYSBsb2NrbnVsbCBtZW1iZXIKLSAgICAqKiAgICAgICB0byBhIHJlYWwgbWVtYmVyLiBJbiB0aGlzIGNhc2UsIGFsbCBsb2NrcyBhcmUgZ29uZSwgc28gdGhlCi0gICAgKiogICAgICAgbG9ja251bGwgcmVzb3VyY2UgcmV0dXJucyB0byB0aGUgbnVsbCBzdGF0ZSAoaWUuIGRvZXNuJ3QgZXhpc3QpLAotICAgICoqICAgICAgIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXBkYXRlIHRoZSBsb2NrZGIgKGFuZCBpdCB3b24ndCBmaW5kCi0gICAgKiogICAgICAgYW55IGJlY2F1c2UgYSBwcmVjb25kaXRpb24gaXMgdGhhdCBub25lIGV4aXN0KS4KLSAgICAqLwotICAgIGlmICghcmVzb3VyY2UtPmV4aXN0cyAmJiBkaCA9PSBOVUxMICYmIGloID09IE5VTEwKLQkmJiAoZXJyID0gZGF2X2ZzX3JlbW92ZV9sb2NrbnVsbF9tZW1iZXIobG9ja2RiLT5pbmZvLT5wb29sLAotCQkJCQkJZGF2X2ZzX3BhdGhuYW1lKHJlc291cmNlKSwKLQkJCQkJCSZidWYpKSAhPSBOVUxMKSB7Ci0JLyogIyMjIG1heWJlIGFkZCBhIGhpZ2hlci1sZXZlbCBkZXNjcmlwdGlvbiAqLwotCXJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgZGF2X2ZzX2RvX3JlZnJlc2goZGF2X2xvY2tfZGlzY292ZXJ5ICpkcCwKLQkJCSAgICAgY29uc3QgZGF2X2xvY2t0b2tlbl9saXN0ICpsdGwsCi0JCQkgICAgIHRpbWVfdCBuZXdfdGltZSkKLXsKLSAgICBpbnQgZGlydHkgPSAwOwotCi0gICAgZm9yICg7IGx0bCAhPSBOVUxMOyBsdGwgPSBsdGwtPm5leHQpIHsKLQlpZiAoZGF2X2NvbXBhcmVfb3BhcXVlbG9ja3Rva2VuKGRwLT5sb2NrdG9rZW4tPnV1aWQsCi0JCQkJCWx0bC0+bG9ja3Rva2VuLT51dWlkKSA9PSAwKQotCXsKLQkgICAgZHAtPmYudGltZW91dCA9IG5ld190aW1lOwotCSAgICBkaXJ0eSA9IDE7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiBkaXJ0eTsKLX0KLQotc3RhdGljIGRhdl9lcnJvciAqIGRhdl9mc19yZWZyZXNoX2xvY2tzKGRhdl9sb2NrZGIgKmxvY2tkYiwKLQkJCQkJY29uc3QgZGF2X3Jlc291cmNlICpyZXNvdXJjZSwKLQkJCQkJY29uc3QgZGF2X2xvY2t0b2tlbl9saXN0ICpsdGwsCi0JCQkJCXRpbWVfdCBuZXdfdGltZSwKLQkJCQkJZGF2X2xvY2sgKipsb2NrcykKLXsKLSAgICBkYXZfZXJyb3IgKmVycjsKLSAgICBkYXZfZGF0dW0ga2V5OwotICAgIGRhdl9sb2NrX2Rpc2NvdmVyeSAqZHA7Ci0gICAgZGF2X2xvY2tfZGlzY292ZXJ5ICpkcF9zY2FuOwotICAgIGRhdl9sb2NrX2luZGlyZWN0ICppcDsKLSAgICBpbnQgZGlydHkgPSAwOwotICAgIGRhdl9sb2NrICpuZXdsb2NrOwotCi0gICAgKmxvY2tzID0gTlVMTDsKLQotICAgIGtleSA9IGRhdl9mc19idWlsZF9rZXkobG9ja2RiLT5pbmZvLT5wb29sLCByZXNvdXJjZSk7Ci0gICAgaWYgKChlcnIgPSBkYXZfZnNfbG9hZF9sb2NrX3JlY29yZChsb2NrZGIsIGtleSwgREFWX0NSRUFURV9MSVNULAotCQkJCSAgICAgICAmZHAsICZpcCkpICE9IE5VTEwpIHsKLQkvKiAjIyMgbWF5YmUgYWRkIGluIGEgaGlnaGVyLWxldmVsIGRlc2NyaXB0aW9uICovCi0JcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiAjIyMgd2Ugc2hvdWxkIGJlIHJlZnJlc2hpbmcgZGlyZWN0IEFORCAocmVzb2x2ZWQpIGluZGlyZWN0IGxvY2tzISAqLwotCi0gICAgLyogcmVmcmVzaCBhbGwgb2YgdGhlIGRpcmVjdCBsb2NrcyBvbiB0aGlzIHJlc291cmNlICovCi0gICAgZm9yIChkcF9zY2FuID0gZHA7IGRwX3NjYW4gIT0gTlVMTDsgZHBfc2NhbiA9IGRwX3NjYW4tPm5leHQpIHsKLQlpZiAoZGF2X2ZzX2RvX3JlZnJlc2goZHBfc2NhbiwgbHRsLCBuZXdfdGltZSkpIHsKLQkgICAgLyogdGhlIGxvY2sgd2FzIHJlZnJlc2hlZC4gcmV0dXJuIHRoZSBsb2NrLiAqLwotCSAgICBuZXdsb2NrID0gZGF2X2ZzX2FsbG9jX2xvY2sobG9ja2RiLCBrZXksIGRwX3NjYW4tPmxvY2t0b2tlbik7Ci0JICAgIG5ld2xvY2stPmlzX2xvY2tudWxsID0gIXJlc291cmNlLT5leGlzdHM7Ci0JICAgIG5ld2xvY2stPnNjb3BlID0gZHBfc2Nhbi0+Zi5zY29wZTsKLQkgICAgbmV3bG9jay0+dHlwZSA9IGRwX3NjYW4tPmYudHlwZTsKLQkgICAgbmV3bG9jay0+ZGVwdGggPSBkcF9zY2FuLT5mLmRlcHRoOwotCSAgICBuZXdsb2NrLT50aW1lb3V0ID0gZHBfc2Nhbi0+Zi50aW1lb3V0OwotCSAgICBuZXdsb2NrLT5vd25lciA9IGRwX3NjYW4tPm93bmVyOwotICAgICAgICAgICAgbmV3bG9jay0+YXV0aF91c2VyID0gZHBfc2Nhbi0+YXV0aF91c2VyOwotCi0JICAgIG5ld2xvY2stPm5leHQgPSAqbG9ja3M7Ci0JICAgICpsb2NrcyA9IG5ld2xvY2s7Ci0KLQkgICAgZGlydHkgPSAxOwotCX0KLSAgICB9Ci0KLSAgICAvKiBpZiB3ZSByZWZyZXNoZWQgYW55IGxvY2tzLCB0aGVuIHNhdmUgdGhlbSBiYWNrLiAqLwotICAgIGlmIChkaXJ0eQotCSYmIChlcnIgPSBkYXZfZnNfc2F2ZV9sb2NrX3JlY29yZChsb2NrZGIsIGtleSwgZHAsIGlwKSkgIT0gTlVMTCkgewotCS8qICMjIyBtYXliZSBhZGQgaW4gYSBoaWdoZXItbGV2ZWwgZGVzY3JpcHRpb24gKi8KLQlyZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIGZvciBlYWNoIGluZGlyZWN0IGxvY2ssIGZpbmQgaXRzIGRpcmVjdCBsb2NrIGFuZCByZWZyZXNoIGl0LiAqLwotICAgIGZvciAoOyBpcCAhPSBOVUxMOyBpcCA9IGlwLT5uZXh0KSB7Ci0JZGF2X2xvY2tfZGlzY292ZXJ5ICpyZWZfZHA7Ci0JZGF2X2xvY2tfaW5kaXJlY3QgKnJlZl9pcDsKLQotCWlmICgoZXJyID0gZGF2X2ZzX3Jlc29sdmUobG9ja2RiLCBpcCwgJmRwX3NjYW4sCi0JCQkJICAmcmVmX2RwLCAmcmVmX2lwKSkgIT0gTlVMTCkgewotCSAgICAvKiAjIyMgcHVzaCBhIGhpZ2hlci1sZXZlbCBkZXNjPyAqLwotCSAgICByZXR1cm4gZXJyOwotCX0KLQlpZiAoZGF2X2ZzX2RvX3JlZnJlc2goZHBfc2NhbiwgbHRsLCBuZXdfdGltZSkpIHsKLQkgICAgLyogdGhlIGxvY2sgd2FzIHJlZnJlc2hlZC4gcmV0dXJuIHRoZSBsb2NrLiAqLwotCSAgICBuZXdsb2NrID0gZGF2X2ZzX2FsbG9jX2xvY2sobG9ja2RiLCBpcC0+a2V5LCBkcC0+bG9ja3Rva2VuKTsKLQkgICAgbmV3bG9jay0+aXNfbG9ja251bGwgPSAhcmVzb3VyY2UtPmV4aXN0czsKLQkgICAgbmV3bG9jay0+c2NvcGUgPSBkcC0+Zi5zY29wZTsKLQkgICAgbmV3bG9jay0+dHlwZSA9IGRwLT5mLnR5cGU7Ci0JICAgIG5ld2xvY2stPmRlcHRoID0gZHAtPmYuZGVwdGg7Ci0JICAgIG5ld2xvY2stPnRpbWVvdXQgPSBkcC0+Zi50aW1lb3V0OwotCSAgICBuZXdsb2NrLT5vd25lciA9IGRwLT5vd25lcjsKLSAgICAgICAgICAgIG5ld2xvY2stPmF1dGhfdXNlciA9IGRwX3NjYW4tPmF1dGhfdXNlcjsKLQotCSAgICBuZXdsb2NrLT5uZXh0ID0gKmxvY2tzOwotCSAgICAqbG9ja3MgPSBuZXdsb2NrOwotCi0JICAgIC8qIHNhdmUgdGhlIChyZXNvbHZlZCkgZGlyZWN0IGxvY2sgYmFjayAqLwotCSAgICBpZiAoKGVyciA9IGRhdl9mc19zYXZlX2xvY2tfcmVjb3JkKGxvY2tkYiwgaXAtPmtleSwgcmVmX2RwLAotCQkJCQkgICAgICAgcmVmX2lwKSkgIT0gTlVMTCkgewotCQkvKiAjIyMgcHVzaCBhIGhpZ2hlci1sZXZlbCBkZXNjPyAqLwotCQlyZXR1cm4gZXJyOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi0KLWNvbnN0IGRhdl9ob29rc19sb2NrcyBkYXZfaG9va3NfbG9ja3NfZnMgPQotewotICAgIGRhdl9mc19nZXRfc3VwcG9ydGVkbG9jaywKLSAgICBkYXZfZnNfcGFyc2VfbG9ja3Rva2VuLAotICAgIGRhdl9mc19mb3JtYXRfbG9ja3Rva2VuLAotICAgIGRhdl9mc19jb21wYXJlX2xvY2t0b2tlbiwKLSAgICBkYXZfZnNfb3Blbl9sb2NrZGIsCi0gICAgZGF2X2ZzX2Nsb3NlX2xvY2tkYiwKLSAgICBkYXZfZnNfcmVtb3ZlX2xvY2tudWxsX3N0YXRlLAotICAgIGRhdl9mc19jcmVhdGVfbG9jaywKLSAgICBkYXZfZnNfZ2V0X2xvY2tzLAotICAgIGRhdl9mc19maW5kX2xvY2ssCi0gICAgZGF2X2ZzX2hhc19sb2NrcywKLSAgICBkYXZfZnNfYXBwZW5kX2xvY2tzLAotICAgIGRhdl9mc19yZW1vdmVfbG9jaywKLSAgICBkYXZfZnNfcmVmcmVzaF9sb2NrcywKLSAgICBOVUxMLCAvKiBnZXRfcmVzb3VyY2UgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL2Rhdi9mcy9tb2RfZGF2X2ZzLmMgYi9tb2R1bGVzL2Rhdi9mcy9tb2RfZGF2X2ZzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYzlmZWMuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9kYXYvZnMvbW9kX2Rhdl9mcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJtb2RfZGF2LmgiCi0jaW5jbHVkZSAicmVwb3MuaCIKLQotLyogcGVyLXNlcnZlciBjb25maWd1cmF0aW9uICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY29uc3QgY2hhciAqbG9ja2RiX3BhdGg7Ci0KLX0gZGF2X2ZzX3NlcnZlcl9jb25mOwotCi1leHRlcm4gbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGRhdl9mc19tb2R1bGU7Ci0KLWNvbnN0IGNoYXIgKmRhdl9nZXRfbG9ja2RiX3BhdGgoY29uc3QgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgZGF2X2ZzX3NlcnZlcl9jb25mICpjb25mOwotCi0gICAgY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgJmRhdl9mc19tb2R1bGUpOwotICAgIHJldHVybiBjb25mLT5sb2NrZGJfcGF0aDsKLX0KLQotc3RhdGljIHZvaWQgKmRhdl9mc19jcmVhdGVfc2VydmVyX2NvbmZpZyhhcF9wb29sX3QgKnAsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgcmV0dXJuIGFwX3BjYWxsb2MocCwgc2l6ZW9mKGRhdl9mc19zZXJ2ZXJfY29uZikpOwotfQotCi1zdGF0aWMgdm9pZCAqZGF2X2ZzX21lcmdlX3NlcnZlcl9jb25maWcoYXBfcG9vbF90ICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJhc2UsIHZvaWQgKm92ZXJyaWRlcykKLXsKLSAgICBkYXZfZnNfc2VydmVyX2NvbmYgKnBhcmVudCA9IGJhc2U7Ci0gICAgZGF2X2ZzX3NlcnZlcl9jb25mICpjaGlsZCA9IG92ZXJyaWRlczsKLSAgICBkYXZfZnNfc2VydmVyX2NvbmYgKm5ld2NvbmY7Ci0KLSAgICBuZXdjb25mID0gYXBfcGNhbGxvYyhwLCBzaXplb2YoKm5ld2NvbmYpKTsKLQotICAgIG5ld2NvbmYtPmxvY2tkYl9wYXRoID0KLSAgICAgICAgY2hpbGQtPmxvY2tkYl9wYXRoID8gY2hpbGQtPmxvY2tkYl9wYXRoIDogcGFyZW50LT5sb2NrZGJfcGF0aDsKLQotICAgIHJldHVybiBuZXdjb25mOwotfQotCi0vKgotICogQ29tbWFuZCBoYW5kbGVyIGZvciB0aGUgREFWTG9ja0RCIGRpcmVjdGl2ZSwgd2hpY2ggaXMgVEFLRTEKLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmRhdl9mc19jbWRfZGF2bG9ja2RiKGNtZF9wYXJtcyAqY21kLCB2b2lkICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXJnMSkKLXsKLSAgICBkYXZfZnNfc2VydmVyX2NvbmYgKmNvbmY7Ci0KLSAgICBjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcoY21kLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXZfZnNfbW9kdWxlKTsKLSAgICBhcmcxID0gYXBfb3NfY2Fub25pY2FsX2ZpbGVuYW1lKGNtZC0+cG9vbCwgYXJnMSk7Ci0gICAgY29uZi0+bG9ja2RiX3BhdGggPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShjbWQtPnBvb2wsIGFyZzEpOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBkYXZfZnNfY21kc1tdID0KLXsKLSAgICAvKiBwZXIgc2VydmVyICovCi0gICAgQVBfSU5JVF9UQUtFMSgiREFWTG9ja0RCIiwgZGF2X2ZzX2NtZF9kYXZsb2NrZGIsIE5VTEwsIFJTUkNfQ09ORiwKLSAgICAgICAgICAgICAgICAgICJzcGVjaWZ5IGEgbG9jayBkYXRhYmFzZSIpLAotCi0gICAgeyBOVUxMIH0KLX07Ci0KLXN0YXRpYyB2b2lkIHJlZ2lzdGVyX2hvb2tzKHZvaWQpCi17Ci0gICAgLyogbm90aGluZyB5ZXQgKi8KLX0KLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGRhdl9mc19tb2R1bGUgPQotewotICAgIFNUQU5EQVJEMjBfTU9EVUxFX1NUVUZGLAotICAgIE5VTEwsCQkJLyogZGlyIGNvbmZpZyBjcmVhdGVyICovCi0gICAgTlVMTCwJCQkvKiBkaXIgbWVyZ2VyIC0tLSBkZWZhdWx0IGlzIHRvIG92ZXJyaWRlICovCi0gICAgZGF2X2ZzX2NyZWF0ZV9zZXJ2ZXJfY29uZmlnLAkvKiBzZXJ2ZXIgY29uZmlnICovCi0gICAgZGF2X2ZzX21lcmdlX3NlcnZlcl9jb25maWcsCS8qIG1lcmdlIHNlcnZlciBjb25maWcgKi8KLSAgICBkYXZfZnNfY21kcywJCS8qIGNvbW1hbmQgdGFibGUgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaGFuZGxlcnMgKi8KLSAgICByZWdpc3Rlcl9ob29rcywgICAgICAgICAgICAgLyogcmVnaXN0ZXIgaG9va3MgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL2Rhdi9mcy9tb2RfZGF2X2ZzLmRzcCBiL21vZHVsZXMvZGF2L2ZzL21vZF9kYXZfZnMuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzUyNzc0Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZGF2L2ZzL21vZF9kYXZfZnMuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ibW9kX2Rhdl9mcyIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyCi0KLUNGRz1tb2RfZGF2X2ZzIC0gV2luMzIgUmVsZWFzZQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJtb2RfZGF2X2ZzLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAibW9kX2Rhdl9mcy5tYWsiIENGRz0ibW9kX2Rhdl9mcyAtIFdpbjMyIFJlbGVhc2UiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAibW9kX2Rhdl9mcyAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgIm1vZF9kYXZfZnMgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLU1UTD1taWRsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJtb2RfZGF2X2ZzIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIi5cQXBhY2hlTW8iCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXEFwYWNoZU1vIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIi5cbW9kX2Rhdl9mc1IiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxtb2RfZGF2X2ZzUiIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvR1ggL08yIC9JICIuLlwuLlxtb2R1bGVzXGRhdlxtYWluIiAvSSAiLi5cLi5cbGliXHNkYm0iIC9JICIuLlwuLlxsaWJcZXhwYXQtbGl0ZSIgL0kgIi4uXC4uXGxpYlxhcHJcaW5jbHVkZSIgL0kgIi4uXC4uXGluY2x1ZGUiIC9JICIuLlwuLlxvc1x3aW4zMiIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJTSEFSRURfTU9EVUxFIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBBcGFjaGVDb3JlLmxpYiBhcHJsaWIubGliIGtlcm5lbDMyLmxpYiB3czJfMzIubGliIG1zd3NvY2subGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvbWFjaGluZTpJMzg2IC9saWJwYXRoOiIuLlwuLlxDb3JlUiIgL2xpYnBhdGg6Ii4uXC4uXGxpYlxhcHJcUmVsZWFzZSIgL2Jhc2U6QEJhc2VBZGRyLnJlZixtb2RfZGF2X2ZzCi0jIEFERCBMSU5LMzIgQXBhY2hlQ29yZS5saWIgYXBybGliLmxpYiBrZXJuZWwzMi5saWIgd3MyXzMyLmxpYiBtc3dzb2NrLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYXAgL21hY2hpbmU6STM4NiAvbGlicGF0aDoiLi5cLi5cQ29yZVIiIC9saWJwYXRoOiIuLlwuLlxsaWJcYXByXFJlbGVhc2UiIC9iYXNlOkBCYXNlQWRkci5yZWYsbW9kX2Rhdl9mcwotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibW9kX2Rhdl9mcyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxBcGFjaGVNMCIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIi5cQXBhY2hlTTAiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiLlxtb2RfZGF2X2ZzRCIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuXG1vZF9kYXZfZnNEIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTURkIC9XMyAvR20gL0dYIC9aSSAvT2QgL0kgIi4uXC4uXG1vZHVsZXNcZGF2XG1haW4iIC9JICIuLlwuLlxsaWJcc2RibSIgL0kgIi4uXC4uXGxpYlxleHBhdC1saXRlIiAvSSAiLi5cLi5cbGliXGFwclxpbmNsdWRlIiAvSSAiLi5cLi5caW5jbHVkZSIgL0kgIi4uXC4uXG9zXHdpbjMyIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIlNIQVJFRF9NT0RVTEUiIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIEFwYWNoZUNvcmUubGliIGFwcmxpYi5saWIga2VybmVsMzIubGliIHdzMl8zMi5saWIgbXN3c29jay5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9saWJwYXRoOiIuLlwuLlxDb3JlRCIgL2xpYnBhdGg6Ii4uXC4uXGxpYlxhcHJcRGVidWciIC9iYXNlOkBCYXNlQWRkci5yZWYsbW9kX2Rhdl9mcwotIyBBREQgTElOSzMyIEFwYWNoZUNvcmUubGliIGFwcmxpYi5saWIga2VybmVsMzIubGliIHdzMl8zMi5saWIgbXN3c29jay5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NiAvbGlicGF0aDoiLi5cLi5cQ29yZUQiIC9saWJwYXRoOiIuLlwuLlxsaWJcYXByXERlYnVnIiAvYmFzZTpAQmFzZUFkZHIucmVmLG1vZF9kYXZfZnMKLSMgU1VCVFJBQ1QgTElOSzMyIC9pbmNyZW1lbnRhbDpubyAvbWFwCi0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJtb2RfZGF2X2ZzIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAibW9kX2Rhdl9mcyAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aHBqO2JhdDtmb3I7ZjkwIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cbW9kdWxlc1xkYXZcZnNcZGJtLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxtb2R1bGVzXGRhdlxmc1xsb2NrLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxtb2R1bGVzXGRhdlxmc1xtb2RfZGF2X2ZzLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxtb2R1bGVzXGRhdlxmc1xyZXBvcy5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sO2ZpO2ZkIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cbW9kdWxlc1xkYXZcZnNccmVwb3MuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL21vZHVsZXMvZGF2L2ZzL3JlcG9zLmMgYi9tb2R1bGVzL2Rhdi9mcy9yZXBvcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjQ3MWFjLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZGF2L2ZzL3JlcG9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDA3ICswLDAgQEAKLS8qCi0qKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCBHcmVnIFN0ZWluLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotKioKLSoqIEJ5IHVzaW5nIHRoaXMgZmlsZSwgeW91IGFncmVlIHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBzZXQgZm9ydGggaW4KLSoqIHRoZSBMSUNFTlNFLmh0bWwgZmlsZSB3aGljaCBjYW4gYmUgZm91bmQgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgbW9kX2RhdgotKiogZGlzdHJpYnV0aW9uIG9yIGF0IGh0dHA6Ly93d3cud2ViZGF2Lm9yZy9tb2RfZGF2L2xpY2Vuc2UtMS5odG1sLgotKioKLSoqIENvbnRhY3QgaW5mb3JtYXRpb246Ci0qKiAgIEdyZWcgU3RlaW4sIFBPIEJveCA3NjAsIFBhbG8gQWx0bywgQ0EsIDk0MzAyCi0qKiAgIGdzdGVpbkBseXJhLm9yZywgaHR0cDovL3d3dy53ZWJkYXYub3JnL21vZF9kYXYvCi0qKgotKi8KLQotLyoKLSoqIERBViBmaWxlc3lzdGVtLWJhc2VkIHJlcG9zaXRvcnkgcHJvdmlkZXIKLSoqCi0qKiBXcml0dGVuIDA4Lzk5IGJ5IEpvaG4gVmFzdGEsIHZhc3RhQHJhdGlvbmFsLmNvbSwgYnkgc2VwYXJhdGluZwotKiogbW9kX2RhdiBpbnRvIHJlcG9zaXRvcnktaW5kZXBlbmRlbnQgYW5kIHByb3ZpZGVyIG1vZHVsZXMuCi0qLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiaHR0cF9wcm90b2NvbC5oIgkvKiBmb3IgYXBfc2V0XyogKGluIGRhdl9mc19zZXRfaGVhZGVycykgKi8KLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIgICAgICAgLyogZm9yIGFwX3VwZGF0ZV9tdGltZSgpICovCi0KLSNpbmNsdWRlICJtb2RfZGF2LmgiCi0jaW5jbHVkZSAiZGF2X2ZzX3JlcG9zLmgiCi0KLQotLyogdG8gYXNzaXN0IGluIGRlYnVnZ2luZyBtb2RfZGF2J3MgR0VUIGhhbmRsaW5nICovCi0jZGVmaW5lIERFQlVHX0dFVF9IQU5ETEVSICAgICAgIDAKLSNkZWZpbmUgREVCVUdfUEFUSE5BTUVfU1RZTEUgICAgMAotCi0jZGVmaW5lIERBVl9GU19DT1BZX0JMT0NLU0laRQkxNjM4NAkvKiBjb3B5IDE2ayBhdCBhIHRpbWUgKi8KLQotLyogY29udGV4dCBuZWVkZWQgdG8gaWRlbnRpZnkgYSByZXNvdXJjZSAqLwotc3RydWN0IGRhdl9yZXNvdXJjZV9wcml2YXRlIHsKLSAgICBwb29sICpwb29sOyAgICAgICAgICAgICAvKiBtZW1vcnkgc3RvcmFnZSBwb29sIGFzc29jaWF0ZWQgd2l0aCByZXF1ZXN0ICovCi0gICAgY29uc3QgY2hhciAqcGF0aG5hbWU7ICAgLyogZnVsbCBwYXRobmFtZSB0byByZXNvdXJjZSAqLwotICAgIHN0cnVjdCBzdGF0IGZpbmZvOyAgICAgIC8qIGZpbGVzeXN0ZW0gaW5mbyAqLwotfTsKLQotLyogcHJpdmF0ZSBjb250ZXh0IGZvciBkb2luZyBhIGZpbGVzeXN0ZW0gd2FsayAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGRhdl93YWxrZXJfY3R4ICp3Y3R4OwotCi0gICAgZGF2X3Jlc291cmNlIHJlczE7Ci0gICAgZGF2X3Jlc291cmNlIHJlczI7Ci0gICAgZGF2X3Jlc291cmNlX3ByaXZhdGUgaW5mbzE7Ci0gICAgZGF2X3Jlc291cmNlX3ByaXZhdGUgaW5mbzI7Ci0gICAgZGF2X2J1ZmZlciBwYXRoMTsKLSAgICBkYXZfYnVmZmVyIHBhdGgyOwotCi0gICAgZGF2X2J1ZmZlciBsb2NrbnVsbF9idWY7Ci0KLX0gZGF2X2ZzX3dhbGtlcl9jb250ZXh0OwotCi0vKiBwdWxsIHRoaXMgaW4gZnJvbSB0aGUgb3RoZXIgc291cmNlIGZpbGUgKi8KLWV4dGVybiBjb25zdCBkYXZfaG9va3NfbG9ja3MgZGF2X2hvb2tzX2xvY2tzX2ZzOwotCi0vKiBmb3J3YXJkLWRlY2xhcmUgdGhpcyBzdWNrZXIgKi8KLXN0YXRpYyBjb25zdCBkYXZfaG9va3NfcmVwb3NpdG9yeSBkYXZfaG9va3NfcmVwb3NpdG9yeV9mczsKLQotLyoKLSoqIFRoZSBQcm92aWRlciBJRCBpcyB1c2VkIHRvIGRpZmZlcmVudGlhdGUgImxvZ2ljYWwiIHByb3ZpZGVycyB0aGF0IHVzZQotKiogdGhlIHNhbWUgc2V0IG9mIGhvb2sgZnVuY3Rpb25zLiBFc3NlbnRpYWxseSwgdGhlIElEIGlzIGFuIGluc3RhbmNlCi0qKiBoYW5kbGUgYW5kIHRoZSBob29rcyBhcmUgYSB2dGFibGUuCi0qKgotKiogSW4gdGhpcyBtb2R1bGUsIHdlIG9ubHkgaGF2ZSBhIHNpbmdsZSBwcm92aWRlciBmb3IgZWFjaCB0eXBlLCBzbyB3ZQotKiogYWN0dWFsbHkgaWdub3JlIHRoZSBQcm92aWRlciBJRC4KLSovCi0jZGVmaW5lIERBVl9GU19QUk9WSURFUl9JRAkwCi0KLS8qCi0qKiBUaGUgbmFtZXNwYWNlIFVSSXMgdGhhdCB3ZSB1c2UuIFRoaXMgbGlzdCBhbmQgdGhlIGVudW1lcmF0aW9uIG11c3QKLSoqIHN0YXkgaW4gc3luYy4KLSovCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhdl9mc19uYW1lc3BhY2VfdXJpc1tdID0KLXsKLSAgICAiREFWOiIsCi0gICAgImh0dHA6Ly9hcGFjaGUub3JnL2Rhdi9wcm9wcy8iLAotCi0gICAgTlVMTAkvKiBzZW50aW5lbCAqLwotfTsKLWVudW0gewotICAgIERBVl9GU19VUklfREFWLAkJLyogdGhlIERBVjogbmFtZXNwYWNlIFVSSSAqLwotICAgIERBVl9GU19VUklfTVlQUk9QUwkJLyogdGhlIG5hbWVzcGFjZSBVUkkgZm9yIG91ciBjdXN0b20gcHJvcHMgKi8KLX07Ci0KLS8qCi0qKiBUaGUgcHJvcGVydGllcyB0aGF0IHdlIGRlZmluZS4KLSovCi1lbnVtIHsKLSAgICAvKiB1c2luZyBEQVZfRlNfVVJJX0RBViAqLwotICAgIERBVl9QUk9QSURfRlNfY3JlYXRpb25kYXRlID0gREFWX1BST1BJRF9GUywKLSAgICBEQVZfUFJPUElEX0ZTX2Rpc3BsYXluYW1lLAotICAgIERBVl9QUk9QSURfRlNfZ2V0Y29udGVudGxlbmd0aCwKLSAgICBEQVZfUFJPUElEX0ZTX2dldGV0YWcsCi0gICAgREFWX1BST1BJRF9GU19nZXRsYXN0bW9kaWZpZWQsCi0gICAgREFWX1BST1BJRF9GU19zb3VyY2UsCi0KLSAgICAvKiB1c2luZyBEQVZfRlNfVVJJX01ZUFJPUFMgKi8KLSAgICBEQVZfUFJPUElEX0ZTX2V4ZWN1dGFibGUKLX07Ci0vKiBOT1RFOiB0aGUgbWFnaWMgIjIwMCIgaXMgZGVyaXZlZCBmcm9tIHRoZSByYW5nZXMgaW4gbW9kX2Rhdi5oICovCi0jZGVmaW5lIERBVl9QUk9QSURfRlNfT1VSUyhpZCkJKERBVl9QUk9QSURfRlMgPD0gKGlkKSAmJiBcCi0JCQkJIChpZCkgPCBEQVZfUFJPUElEX0ZTICsgMjAwKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50IG5zOwotICAgIGNvbnN0IGNoYXIgKiBuYW1lOwotCi0gICAgaW50IHByb3BpZDsKLX0gZGF2X2ZzX2xpdmVwcm9wX25hbWU7Ci0KLXN0YXRpYyBjb25zdCBkYXZfZnNfbGl2ZXByb3BfbmFtZSBkYXZfZnNfcHJvcHNbXSA9Ci17Ci0gICAgeyBEQVZfRlNfVVJJX0RBViwgICAgICJjcmVhdGlvbmRhdGUiLCAgICAgREFWX1BST1BJRF9GU19jcmVhdGlvbmRhdGUgfSwKLSAgICB7IERBVl9GU19VUklfREFWLCAgICAgImdldGNvbnRlbnRsZW5ndGgiLCBEQVZfUFJPUElEX0ZTX2dldGNvbnRlbnRsZW5ndGggfSwKLSAgICB7IERBVl9GU19VUklfREFWLCAgICAgImdldGV0YWciLCAgICAgICAgICBEQVZfUFJPUElEX0ZTX2dldGV0YWcgfSwKLSAgICB7IERBVl9GU19VUklfREFWLCAgICAgImdldGxhc3Rtb2RpZmllZCIsICBEQVZfUFJPUElEX0ZTX2dldGxhc3Rtb2RpZmllZCB9LAotCi0gICAgeyBEQVZfRlNfVVJJX01ZUFJPUFMsICJleGVjdXRhYmxlIiwgICAgICAgREFWX1BST1BJRF9GU19leGVjdXRhYmxlIH0sCi0gICAgICAKLSAgICAvKiAjIyMgdGhlc2UgYXJlbid0IEZTIHNwZWNpZmljICovCi0gICAgeyBEQVZfRlNfVVJJX0RBViwgICAgICJkaXNwbGF5bmFtZSIsICAgICAgREFWX1BST1BJRF9GU19kaXNwbGF5bmFtZSB9LAotICAgIHsgREFWX0ZTX1VSSV9EQVYsICAgICAic291cmNlIiwgICAgICAgICAgIERBVl9QUk9QSURfRlNfc291cmNlIH0sCi0KLSAgICB7IDAgfQkvKiBzZW50aW5lbCAqLwotfTsKLQotCi0vKiBkZWZpbmUgdGhlIGRhdl9zdHJlYW0gc3RydWN0dXJlIGZvciBvdXIgdXNlICovCi1zdHJ1Y3QgZGF2X3N0cmVhbSB7Ci0gICAgcG9vbCAqcDsKLSAgICBpbnQgZmQ7Ci0gICAgY29uc3QgY2hhciAqcGF0aG5hbWU7CS8qIHdlIG1heSBuZWVkIHRvIHJlbW92ZSBpdCBhdCBjbG9zZSB0aW1lICovCi19OwotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9uIGZvciBpbnRlcm5hbCB0cmVld2Fsa2VycyAqLwotc3RhdGljIGRhdl9lcnJvciAqIGRhdl9mc193YWxrKGRhdl93YWxrZXJfY3R4ICp3Y3R4LCBpbnQgZGVwdGgpOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKioKLSoqIFBSSVZBVEUgUkVQT1NJVE9SWSBGVU5DVElPTlMKLSovCi1wb29sICpkYXZfZnNfcG9vbChjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlKQotewotICAgIHJldHVybiByZXNvdXJjZS0+aW5mby0+cG9vbDsKLX0KLQotY29uc3QgY2hhciAqZGF2X2ZzX3BhdGhuYW1lKGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UpCi17Ci0gICAgcmV0dXJuIHJlc291cmNlLT5pbmZvLT5wYXRobmFtZTsKLX0KLQotdm9pZCBkYXZfZnNfZGlyX2ZpbGVfbmFtZSgKLSAgICBjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlLAotICAgIGNvbnN0IGNoYXIgKipkaXJwYXRoX3AsCi0gICAgY29uc3QgY2hhciAqKmZuYW1lX3ApCi17Ci0gICAgZGF2X3Jlc291cmNlX3ByaXZhdGUgKmN0eCA9IHJlc291cmNlLT5pbmZvOwotCi0gICAgaWYgKHJlc291cmNlLT5jb2xsZWN0aW9uKSB7Ci0gICAgICAgICpkaXJwYXRoX3AgPSBjdHgtPnBhdGhuYW1lOwotICAgICAgICBpZiAoZm5hbWVfcCAhPSBOVUxMKQotICAgICAgICAgICAgKmZuYW1lX3AgPSBOVUxMOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgY2hhciAqZGlycGF0aCA9IGFwX21ha2VfZGlyc3RyX3BhcmVudChjdHgtPnBvb2wsIGN0eC0+cGF0aG5hbWUpOwotICAgICAgICBzaXplX3QgZGlybGVuID0gc3RybGVuKGRpcnBhdGgpOwotCi0gICAgICAgIGlmIChmbmFtZV9wICE9IE5VTEwpCi0gICAgICAgICAgICAqZm5hbWVfcCA9IGN0eC0+cGF0aG5hbWUgKyBkaXJsZW47Ci0gICAgICAgICpkaXJwYXRoX3AgPSBkaXJwYXRoOwotCi0gICAgICAgIC8qIHJlbW92ZSB0cmFpbGluZyBzbGFzaCBmcm9tIGRpcnBhdGgsIHVubGVzcyBpdCdzIHRoZSByb290IGRpciAqLwotICAgICAgICAvKiAjIyMgV2luMzIgY2hlY2sgKi8KLSAgICAgICAgaWYgKGRpcmxlbiA+IDEgJiYgZGlycGF0aFtkaXJsZW4gLSAxXSA9PSAnLycpIHsKLSAgICAgICAgICAgIGRpcnBhdGhbZGlybGVuIC0gMV0gPSAnXDAnOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKiBOb3RlOiBwaWNrZWQgdXAgZnJvbSBhcF9nbV90aW1lc3RyXzgyMigpICovCi0vKiBOT1RFOiBidWYgbXVzdCBiZSBhdCBsZWFzdCBEQVZfVElNRUJVRl9TSVpFIGNoYXJzIGluIHNpemUgKi8KLXN0YXRpYyB2b2lkIGRhdl9mb3JtYXRfdGltZShpbnQgc3R5bGUsIHRpbWVfdCBzZWMsIGNoYXIgKmJ1ZikKLXsKLSAgICBzdHJ1Y3QgdG0gKnRtczsKLQotICAgIHRtcyA9IGdtdGltZSgmc2VjKTsKLQotICAgIGlmIChzdHlsZSA9PSBEQVZfU1RZTEVfSVNPODYwMSkgewotCS8qICMjIyBzaG91bGQgd2UgdXNlICItMDA6MDAiIGluc3RlYWQgb2YgIloiID8/ICovCi0KLQkvKiAyMCBjaGFycyBwbHVzIG51bGwgdGVybSAqLwotCXNwcmludGYoYnVmLCAiJS40ZC0lLjJkLSUuMmRUJS4yZDolLjJkOiUuMmRaIiwKLQkJdG1zLT50bV95ZWFyICsgMTkwMCwgdG1zLT50bV9tb24gKyAxLCB0bXMtPnRtX21kYXksCi0JCXRtcy0+dG1faG91ciwgdG1zLT50bV9taW4sIHRtcy0+dG1fc2VjKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIFJGQyA4MjIgZGF0ZSBmb3JtYXQ7IGFzIHN0cmZ0aW1lICclYSwgJWQgJWIgJVkgJVQgR01UJyAqLwotCi0gICAgLyogMjkgY2hhcnMgcGx1cyBudWxsIHRlcm0gKi8KLSAgICBzcHJpbnRmKGJ1ZiwKLQkgICAgIiVzLCAlLjJkICVzICVkICUuMmQ6JS4yZDolLjJkIEdNVCIsCi0JICAgIGFwX2RheV9zbmFtZXNbdG1zLT50bV93ZGF5XSwKLQkgICAgdG1zLT50bV9tZGF5LCBhcF9tb250aF9zbmFtZXNbdG1zLT50bV9tb25dLAotCSAgICB0bXMtPnRtX3llYXIgKyAxOTAwLAotCSAgICB0bXMtPnRtX2hvdXIsIHRtcy0+dG1fbWluLCB0bXMtPnRtX3NlYyk7Ci19Ci0KLXN0YXRpYyBpbnQgZGF2X3N5bmNfd3JpdGUoaW50IGZkLCBjb25zdCBjaGFyICpidWYsIHNzaXplX3QgYnVmc2l6ZSkKLXsKLSAgICBzc2l6ZV90IGFtdDsKLQotICAgIGRvIHsKLQlhbXQgPSB3cml0ZShmZCwgYnVmLCBidWZzaXplKTsKLQlpZiAoYW10ID4gMCkgewotCSAgICBidWZzaXplIC09IGFtdDsKLQkgICAgYnVmICs9IGFtdDsKLQl9Ci0gICAgfSB3aGlsZSAoYW10ID4gMCAmJiBidWZzaXplID4gMCk7Ci0KLSAgICByZXR1cm4gYW10IDwgMCA/IC0xIDogMDsKLX0KLQotc3RhdGljIGRhdl9lcnJvciAqIGRhdl9mc19jb3B5bW92ZV9maWxlKAotICAgIGludCBpc19tb3ZlLAotICAgIHBvb2wgKiBwLAotICAgIGNvbnN0IGNoYXIgKnNyYywKLSAgICBjb25zdCBjaGFyICpkc3QsCi0gICAgZGF2X2J1ZmZlciAqcGJ1ZikKLXsKLSAgICBkYXZfYnVmZmVyIHdvcmtfYnVmID0geyAwIH07Ci0gICAgaW50IGZkaTsKLSAgICBpbnQgZmRvOwotCi0gICAgaWYgKHBidWYgPT0gTlVMTCkKLQlwYnVmID0gJndvcmtfYnVmOwotCi0gICAgZGF2X3NldF9idWZzaXplKHAsIHBidWYsIERBVl9GU19DT1BZX0JMT0NLU0laRSk7Ci0KLSAgICBpZiAoKGZkaSA9IG9wZW4oc3JjLCBPX1JET05MWSB8IE9fQklOQVJZKSkgPT0gLTEpIHsKLQkvKiAjIyMgdXNlIHNvbWV0aGluZyBiZXNpZGVzIDUwMD8gKi8KLQlyZXR1cm4gZGF2X25ld19lcnJvcihwLCBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgMCwKLQkJCSAgICAgIkNvdWxkIG5vdCBvcGVuIGZpbGUgZm9yIHJlYWRpbmciKTsKLSAgICB9Ci0KLSAgICAvKiAjIyMgZG8gd2UgbmVlZCB0byBkZWFsIHdpdGggdGhlIHVtYXNrPyAqLwotICAgIGlmICgoZmRvID0gb3Blbihkc3QsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0JJTkFSWSwKLSAgICAgICAgICAgICAgICAgICAgREFWX0ZTX01PREVfRklMRSkpID09IC0xKSB7Ci0JY2xvc2UoZmRpKTsKLQotCS8qICMjIyB1c2Ugc29tZXRoaW5nIGJlc2lkZXMgNTAwPyAqLwotCXJldHVybiBkYXZfbmV3X2Vycm9yKHAsIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCAwLAotCQkJICAgICAiQ291bGQgbm90IG9wZW4gZmlsZSBmb3Igd3JpdGluZyIpOwotICAgIH0KLQotICAgIHdoaWxlICgxKSB7Ci0Jc3NpemVfdCBsZW4gPSByZWFkKGZkaSwgcGJ1Zi0+YnVmLCBEQVZfRlNfQ09QWV9CTE9DS1NJWkUpOwotCi0JaWYgKGxlbiA9PSAtMSkgewotCSAgICBjbG9zZShmZGkpOwotCSAgICBjbG9zZShmZG8pOwotCi0JICAgIGlmIChyZW1vdmUoZHN0KSAhPSAwKSB7Ci0JCS8qICMjIyBBQ0shIEluY29uc2lzdGVudCBzdGF0ZS4uLiAqLwotCi0JCS8qICMjIyB1c2Ugc29tZXRoaW5nIGJlc2lkZXMgNTAwPyAqLwotCQlyZXR1cm4gZGF2X25ld19lcnJvcihwLCBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgMCwKLQkJCQkgICAgICJDb3VsZCBub3QgZGVsZXRlIG91dHB1dCBhZnRlciByZWFkICIKLQkJCQkgICAgICJmYWlsdXJlLiBTZXJ2ZXIgaXMgbm93IGluIGFuICIKLQkJCQkgICAgICJpbmNvbnNpc3RlbnQgc3RhdGUuIik7Ci0JICAgIH0KLQotCSAgICAvKiAjIyMgdXNlIHNvbWV0aGluZyBiZXNpZGVzIDUwMD8gKi8KLQkgICAgcmV0dXJuIGRhdl9uZXdfZXJyb3IocCwgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsIDAsCi0JCQkJICJDb3VsZCBub3QgcmVhZCBpbnB1dCBmaWxlIik7Ci0JfQotCWlmIChsZW4gPT0gMCkKLQkgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKGRhdl9zeW5jX3dyaXRlKGZkbywgcGJ1Zi0+YnVmLCBsZW4pICE9IDApIHsKLSAgICAgICAgICAgIGludCBzYXZlX2Vycm5vID0gZXJybm87Ci0KLQkgICAgY2xvc2UoZmRpKTsKLQkgICAgY2xvc2UoZmRvKTsKLQotCSAgICBpZiAocmVtb3ZlKGRzdCkgIT0gMCkgewotCQkvKiAjIyMgQUNLISBJbmNvbnNpc3RlbnQgc3RhdGUuLi4gKi8KLQotCQkvKiAjIyMgdXNlIHNvbWV0aGluZyBiZXNpZGVzIDUwMD8gKi8KLQkJcmV0dXJuIGRhdl9uZXdfZXJyb3IocCwgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsIDAsCi0JCQkJICAgICAiQ291bGQgbm90IGRlbGV0ZSBvdXRwdXQgYWZ0ZXIgd3JpdGUgIgotCQkJCSAgICAgImZhaWx1cmUuIFNlcnZlciBpcyBub3cgaW4gYW4gIgotCQkJCSAgICAgImluY29uc2lzdGVudCBzdGF0ZS4iKTsKLQkgICAgfQotCi0JICAgIGlmIChzYXZlX2Vycm5vID09IEVOT1NQQykgewotCQlyZXR1cm4gZGF2X25ld19lcnJvcihwLCBIVFRQX0lOU1VGRklDSUVOVF9TVE9SQUdFLCAwLAotCQkJCSAgICAgIlRoZXJlIGlzIG5vdCBlbm91Z2ggc3RvcmFnZSB0byB3cml0ZSB0byAiCi0JCQkJICAgICAidGhpcyByZXNvdXJjZS4iKTsKLQkgICAgfQotCi0JICAgIC8qICMjIyB1c2Ugc29tZXRoaW5nIGJlc2lkZXMgNTAwPyAqLwotCSAgICByZXR1cm4gZGF2X25ld19lcnJvcihwLCBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgMCwKLQkJCQkgIkNvdWxkIG5vdCB3cml0ZSBvdXRwdXQgZmlsZSIpOwotCX0KLSAgICB9Ci0KLSAgICBjbG9zZShmZGkpOwotICAgIGNsb3NlKGZkbyk7Ci0KLSAgICBpZiAoaXNfbW92ZSAmJiByZW1vdmUoc3JjKSAhPSAwKSB7Ci0JZGF2X2Vycm9yICplcnI7Ci0JaW50IHNhdmVfZXJybm8gPSBlcnJubzsJLyogc2F2ZSB0aGUgZXJybm8gdGhhdCBnb3QgdXMgaGVyZSAqLwotCi0JaWYgKHJlbW92ZShkc3QpICE9IDApIHsKLQkgICAgLyogIyMjIEFDSy4gdGhpcyBjcmVhdGVzIGFuIGluY29uc2lzdGVuY3kuIGRvIG1vcmUhPyAqLwotCi0JICAgIC8qICMjIyB1c2Ugc29tZXRoaW5nIGJlc2lkZXMgNTAwPyAqLwotCSAgICAvKiBOb3RlIHRoYXQgd2UgdXNlIHRoZSBsYXRlc3QgZXJybm8gKi8KLQkgICAgcmV0dXJuIGRhdl9uZXdfZXJyb3IocCwgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsIDAsCi0JCQkJICJDb3VsZCBub3QgcmVtb3ZlIHNvdXJjZSBvciBkZXN0aW5hdGlvbiAiCi0JCQkJICJmaWxlLiBTZXJ2ZXIgaXMgbm93IGluIGFuIGluY29uc2lzdGVudCAiCi0JCQkJICJzdGF0ZS4iKTsKLQl9Ci0KLQkvKiAjIyMgdXNlIHNvbWV0aGluZyBiZXNpZGVzIDUwMD8gKi8KLQllcnIgPSBkYXZfbmV3X2Vycm9yKHAsIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCAwLAotCQkJICAgICJDb3VsZCBub3QgcmVtb3ZlIHNvdXJjZSBmaWxlIGFmdGVyIG1vdmUuICIKLQkJCSAgICAiRGVzdGluYXRpb24gd2FzIHJlbW92ZWQgdG8gZW5zdXJlIGNvbnNpc3RlbmN5LiIpOwotCWVyci0+c2F2ZV9lcnJubyA9IHNhdmVfZXJybm87Ci0JcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogY29weS9tb3ZlIGEgZmlsZSBmcm9tIHdpdGhpbiBhIHN0YXRlIGRpciB0byBhbm90aGVyIHN0YXRlIGRpciAqLwotLyogIyMjIG5lZWQgbW9yZSBidWZmZXJzIHRvIHJlcGxhY2UgdGhlIHBvb2wgYXJndW1lbnQgKi8KLXN0YXRpYyBkYXZfZXJyb3IgKiBkYXZfZnNfY29weW1vdmVfc3RhdGUoCi0gICAgaW50IGlzX21vdmUsCi0gICAgcG9vbCAqIHAsCi0gICAgY29uc3QgY2hhciAqc3JjX2RpciwgY29uc3QgY2hhciAqc3JjX2ZpbGUsCi0gICAgY29uc3QgY2hhciAqZHN0X2RpciwgY29uc3QgY2hhciAqZHN0X2ZpbGUsCi0gICAgZGF2X2J1ZmZlciAqcGJ1ZikKLXsKLSAgICBzdHJ1Y3Qgc3RhdCBzcmNfZmluZm87CS8qIGZpbmZvIGZvciBzb3VyY2UgZmlsZSAqLwotICAgIHN0cnVjdCBzdGF0IGRzdF9zdGF0ZV9maW5mbzsJLyogZmluZm8gZm9yIFNUQVRFIGRpcmVjdG9yeSAqLwotICAgIGNvbnN0IGNoYXIgKnNyYzsKLSAgICBjb25zdCBjaGFyICpkc3Q7Ci0KLSAgICAvKiBidWlsZCB0aGUgcHJvcHNldCBwYXRobmFtZSBmb3IgdGhlIHNvdXJjZSBmaWxlICovCi0gICAgc3JjID0gYXBfcHN0cmNhdChwLCBzcmNfZGlyLCAiLyIgREFWX0ZTX1NUQVRFX0RJUiAiLyIsIHNyY19maWxlLCBOVUxMKTsKLQotICAgIC8qIHRoZSBzb3VyY2UgZmlsZSBkb2Vzbid0IGV4aXN0ICovCi0gICAgaWYgKHN0YXQoc3JjLCAmc3JjX2ZpbmZvKSAhPSAwKSB7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgLyogYnVpbGQgdGhlIHBhdGhuYW1lIGZvciB0aGUgZGVzdGluYXRpb24gc3RhdGUgZGlyICovCi0gICAgZHN0ID0gYXBfcHN0cmNhdChwLCBkc3RfZGlyLCAiLyIgREFWX0ZTX1NUQVRFX0RJUiwgTlVMTCk7Ci0KLSAgICAvKiAjIyMgZG8gd2UgbmVlZCB0byBkZWFsIHdpdGggdGhlIHVtYXNrPyAqLwotCi0gICAgLyogZW5zdXJlIHRoYXQgaXQgZXhpc3RzICovCi0gICAgaWYgKG1rZGlyKGRzdCwgREFWX0ZTX01PREVfRElSKSAhPSAwKSB7Ci0JaWYgKGVycm5vICE9IEVFWElTVCkgewotCSAgICAvKiAjIyMgdXNlIHNvbWV0aGluZyBiZXNpZGVzIDUwMD8gKi8KLQkgICAgcmV0dXJuIGRhdl9uZXdfZXJyb3IocCwgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsIDAsCi0JCQkJICJDb3VsZCBub3QgY3JlYXRlIGludGVybmFsIHN0YXRlIGRpcmVjdG9yeSIpOwotCX0KLSAgICB9Ci0KLSAgICAvKiBnZXQgaW5mbyBhYm91dCB0aGUgc3RhdGUgZGlyZWN0b3J5ICovCi0gICAgaWYgKHN0YXQoZHN0LCAmZHN0X3N0YXRlX2ZpbmZvKSAhPSAwKSB7Ci0JLyogQWNrISBXaGVyZSdkIGl0IGdvPyAqLwotCS8qICMjIyB1c2Ugc29tZXRoaW5nIGJlc2lkZXMgNTAwPyAqLwotCXJldHVybiBkYXZfbmV3X2Vycm9yKHAsIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCAwLAotCQkJICAgICAiU3RhdGUgZGlyZWN0b3J5IGRpc2FwcGVhcmVkIik7Ci0gICAgfQotCi0gICAgLyogVGhlIG1rZGlyKCkgbWF5IGhhdmUgZmFpbGVkIGJlY2F1c2UgYSAqZmlsZSogZXhpc3RzIHRoZXJlIGFscmVhZHkgKi8KLSAgICBpZiAoIVNfSVNESVIoZHN0X3N0YXRlX2ZpbmZvLnN0X21vZGUpKSB7Ci0JLyogIyMjIHRyeSB0byByZWNvdmVyIGJ5IGRlbGV0aW5nIHRoaXMgZmlsZT8gKGFuZCBta2RpciBhZ2FpbikgKi8KLQkvKiAjIyMgdXNlIHNvbWV0aGluZyBiZXNpZGVzIDUwMD8gKi8KLQlyZXR1cm4gZGF2X25ld19lcnJvcihwLCBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgMCwKLQkJCSAgICAgIlN0YXRlIGRpcmVjdG9yeSBpcyBhY3R1YWxseSBhIGZpbGUiKTsKLSAgICB9Ci0KLSAgICAvKiBhcHBlbmQgdGhlIHRhcmdldCBmaWxlIHRvIHRoZSBzdGF0ZSBkaXJlY3RvcnkgcGF0aG5hbWUgKi8KLSAgICBkc3QgPSBhcF9wc3RyY2F0KHAsIGRzdCwgIi8iLCBkc3RfZmlsZSwgTlVMTCk7Ci0KLSAgICAvKiBjb3B5L21vdmUgdGhlIGZpbGUgbm93ICovCi0gICAgaWYgKGlzX21vdmUgJiYgc3JjX2ZpbmZvLnN0X2RldiA9PSBkc3Rfc3RhdGVfZmluZm8uc3RfZGV2KSB7Ci0JLyogc2ltcGxlIHJlbmFtZSBpcyBwb3NzaWJsZSBzaW5jZSBpdCBpcyBvbiB0aGUgc2FtZSBkZXZpY2UgKi8KLQlpZiAocmVuYW1lKHNyYywgZHN0KSAhPSAwKSB7Ci0JICAgIC8qICMjIyB1c2Ugc29tZXRoaW5nIGJlc2lkZXMgNTAwPyAqLwotCSAgICByZXR1cm4gZGF2X25ld19lcnJvcihwLCBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgMCwKLQkJCQkgIkNvdWxkIG5vdCBtb3ZlIHN0YXRlIGZpbGUuIik7Ci0JfQotICAgIH0KLSAgICBlbHNlIHsKLQkvKiBnb3R0YSBjb3B5IChhbmQgZGVsZXRlKSAqLwotCXJldHVybiBkYXZfZnNfY29weW1vdmVfZmlsZShpc19tb3ZlLCBwLCBzcmMsIGRzdCwgcGJ1Zik7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBkYXZfZXJyb3IgKmRhdl9mc19jb3B5bW92ZXNldChpbnQgaXNfbW92ZSwgcG9vbCAqcCwKLQkJCQkgICAgIGNvbnN0IGRhdl9yZXNvdXJjZSAqc3JjLAotCQkJCSAgICAgY29uc3QgZGF2X3Jlc291cmNlICpkc3QsCi0JCQkJICAgICBkYXZfYnVmZmVyICpwYnVmKQotewotICAgIGNvbnN0IGNoYXIgKnNyY19kaXI7Ci0gICAgY29uc3QgY2hhciAqc3JjX2ZpbGU7Ci0gICAgY29uc3QgY2hhciAqc3JjX3N0YXRlMTsKLSAgICBjb25zdCBjaGFyICpzcmNfc3RhdGUyOwotICAgIGNvbnN0IGNoYXIgKmRzdF9kaXI7Ci0gICAgY29uc3QgY2hhciAqZHN0X2ZpbGU7Ci0gICAgY29uc3QgY2hhciAqZHN0X3N0YXRlMTsKLSAgICBjb25zdCBjaGFyICpkc3Rfc3RhdGUyOwotICAgIGRhdl9lcnJvciAqZXJyOwotCi0gICAgLyogR2V0IGRpcmVjdG9yeSBhbmQgZmlsZW5hbWUgZm9yIHJlc291cmNlcyAqLwotICAgIGRhdl9mc19kaXJfZmlsZV9uYW1lKHNyYywgJnNyY19kaXIsICZzcmNfZmlsZSk7Ci0gICAgZGF2X2ZzX2Rpcl9maWxlX25hbWUoZHN0LCAmZHN0X2RpciwgJmRzdF9maWxlKTsKLQotICAgIC8qIEdldCB0aGUgY29ycmVzcG9uZGluZyBzdGF0ZSBmaWxlcyBmb3IgZWFjaCByZXNvdXJjZSAqLwotICAgIGRhdl9kYm1fZ2V0X3N0YXRlZmlsZXMocCwgc3JjX2ZpbGUsICZzcmNfc3RhdGUxLCAmc3JjX3N0YXRlMik7Ci0gICAgZGF2X2RibV9nZXRfc3RhdGVmaWxlcyhwLCBkc3RfZmlsZSwgJmRzdF9zdGF0ZTEsICZkc3Rfc3RhdGUyKTsKLSNpZiBEQVZfREVCVUcKLSAgICBpZiAoKHNyY19zdGF0ZTIgIT0gTlVMTCAmJiBkc3Rfc3RhdGUyID09IE5VTEwpIHx8Ci0JKHNyY19zdGF0ZTIgPT0gTlVMTCAmJiBkc3Rfc3RhdGUyICE9IE5VTEwpKSB7Ci0JcmV0dXJuIGRhdl9uZXdfZXJyb3IocCwgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsIDAsCi0JCQkgICAgICJERVNJR04gRVJST1I6IGRhdl9kYm1fZ2V0X3N0YXRlZmlsZXMoKSAiCi0JCQkgICAgICJyZXR1cm5lZCBpbmNvbnNpc3RlbnQgcmVzdWx0cy4iKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGVyciA9IGRhdl9mc19jb3B5bW92ZV9zdGF0ZShpc19tb3ZlLCBwLAotCQkJCXNyY19kaXIsIHNyY19zdGF0ZTEsCi0JCQkJZHN0X2RpciwgZHN0X3N0YXRlMSwKLQkJCQlwYnVmKTsKLQotICAgIGlmIChlcnIgPT0gTlVMTCAmJiBzcmNfc3RhdGUyICE9IE5VTEwpIHsKLQllcnIgPSBkYXZfZnNfY29weW1vdmVfc3RhdGUoaXNfbW92ZSwgcCwKLQkJCQkgICAgc3JjX2Rpciwgc3JjX3N0YXRlMiwKLQkJCQkgICAgZHN0X2RpciwgZHN0X3N0YXRlMiwKLQkJCQkgICAgcGJ1Zik7Ci0KLQlpZiAoZXJyICE9IE5VTEwpIHsKLQkgICAgLyogIyMjIENSQVAuIGluY29uc2lzdGVuY3kuICovCi0JICAgIC8qICMjIyBzaG91bGQgcGVyZm9ybSBzb21lIGNsZWFudXAgYXQgdGhlIHRhcmdldCBpZiB3ZSBzdGlsbAotCSAgICAgICAjIyMgaGF2ZSB0aGUgb3JpZ2luYWwgZmlsZXMgKi8KLQotCSAgICAvKiBDaGFuZ2UgdGhlIGVycm9yIHRvIHJlZmxlY3QgdGhlIGJhZCBzZXJ2ZXIgc3RhdGUuICovCi0JICAgIGVyci0+c3RhdHVzID0gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0JICAgIGVyci0+ZGVzYyA9Ci0JCSJDb3VsZCBub3QgZnVsbHkgY29weS9tb3ZlIHRoZSBwcm9wZXJ0aWVzLiAiCi0JCSJUaGUgc2VydmVyIGlzIG5vdyBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIjsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGRhdl9lcnJvciAqZGF2X2ZzX2RlbGV0ZXNldChwb29sICpwLCBjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlKQotewotICAgIGNvbnN0IGNoYXIgKmRpcnBhdGg7Ci0gICAgY29uc3QgY2hhciAqZm5hbWU7Ci0gICAgY29uc3QgY2hhciAqc3RhdGUxOwotICAgIGNvbnN0IGNoYXIgKnN0YXRlMjsKLSAgICBjb25zdCBjaGFyICpwYXRobmFtZTsKLQotICAgIC8qIEdldCBkaXJlY3RvcnksIGZpbGVuYW1lLCBhbmQgc3RhdGUtZmlsZSBuYW1lcyBmb3IgdGhlIHJlc291cmNlICovCi0gICAgZGF2X2ZzX2Rpcl9maWxlX25hbWUocmVzb3VyY2UsICZkaXJwYXRoLCAmZm5hbWUpOwotICAgIGRhdl9kYm1fZ2V0X3N0YXRlZmlsZXMocCwgZm5hbWUsICZzdGF0ZTEsICZzdGF0ZTIpOwotCi0gICAgLyogYnVpbGQgdGhlIHByb3BzZXQgcGF0aG5hbWUgZm9yIHRoZSBmaWxlICovCi0gICAgcGF0aG5hbWUgPSBhcF9wc3RyY2F0KHAsCi0JCQkgIGRpcnBhdGgsCi0JCQkgICIvIiBEQVZfRlNfU1RBVEVfRElSICIvIiwKLQkJCSAgc3RhdGUxLAotCQkJICBOVUxMKTsKLQotICAgIC8qIG5vdGU6IHdlIG1heSBnZXQgRU5PRU5UIGlmIHRoZSBzdGF0ZSBkaXIgaXMgbm90IHByZXNlbnQgKi8KLSAgICBpZiAocmVtb3ZlKHBhdGhuYW1lKSAhPSAwICYmIGVycm5vICE9IEVOT0VOVCkgewotCXJldHVybiBkYXZfbmV3X2Vycm9yKHAsIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCAwLAotCQkJICAgICAiQ291bGQgbm90IHJlbW92ZSBwcm9wZXJ0aWVzLiIpOwotICAgIH0KLQotICAgIGlmIChzdGF0ZTIgIT0gTlVMTCkgewotCS8qIGJ1aWxkIHRoZSBwcm9wc2V0IHBhdGhuYW1lIGZvciB0aGUgZmlsZSAqLwotCXBhdGhuYW1lID0gYXBfcHN0cmNhdChwLAotCQkJICAgICAgZGlycGF0aCwKLQkJCSAgICAgICIvIiBEQVZfRlNfU1RBVEVfRElSICIvIiwKLQkJCSAgICAgIHN0YXRlMiwKLQkJCSAgICAgIE5VTEwpOwotCi0JaWYgKHJlbW92ZShwYXRobmFtZSkgIT0gMCAmJiBlcnJubyAhPSBFTk9FTlQpIHsKLQkgICAgLyogIyMjIENSQVAuIG9ubHkgcmVtb3ZlZCBoYWxmLiAqLwotCSAgICByZXR1cm4gZGF2X25ld19lcnJvcihwLCBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgMCwKLQkJCQkgIkNvdWxkIG5vdCBmdWxseSByZW1vdmUgcHJvcGVydGllcy4gIgotCQkJCSAiVGhlIHNlcnZlciBpcyBub3cgaW4gYW4gaW5jb25zaXN0ZW50ICIKLQkJCQkgInN0YXRlLiIpOwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoqCi0qKiBSRVBPU0lUT1JZIEhPT0sgRlVOQ1RJT05TCi0qLwotCi1zdGF0aWMgZGF2X3Jlc291cmNlICogZGF2X2ZzX2dldF9yZXNvdXJjZSgKLSAgICByZXF1ZXN0X3JlYyAqciwKLSAgICBjb25zdCBjaGFyICpyb290X2RpciwKLSAgICBjb25zdCBjaGFyICp3b3Jrc3BhY2UpCi17Ci0gICAgZGF2X3Jlc291cmNlX3ByaXZhdGUgKmN0eDsKLSAgICBkYXZfcmVzb3VyY2UgKnJlc291cmNlOwotICAgIGNoYXIgKnM7Ci0gICAgY2hhciAqZmlsZW5hbWU7Ci0gICAgc2l6ZV90IGxlbjsKLQotICAgIC8qICMjIyBvcHRpbWl6ZSB0aGlzIGludG8gYSBzaW5nbGUgYWxsb2NhdGlvbiEgKi8KLQotICAgIC8qIENyZWF0ZSBwcml2YXRlIHJlc291cmNlIGNvbnRleHQgZGVzY3JpcHRvciAqLwotICAgIGN0eCA9IGFwX3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKCpjdHgpKTsKLSAgICBjdHgtPnBvb2wgPSByLT5wb29sOwotICAgIGN0eC0+ZmluZm8gPSByLT5maW5mbzsKLQotICAgIC8qIFByZXNlcnZlIGNhc2Ugb24gT1NlcyB3aGljaCBmb2xkIGNhbm9uaWNhbCBmaWxlbmFtZXMgKi8KLSNpZiBNT0RVTEVfTUFHSUNfTlVNQkVSX01BSk9SID4gMTk5OTAzMjAgfHwgKE1PRFVMRV9NQUdJQ19OVU1CRVJfTUFKT1IgPT0gMTk5OTAzMjAgJiYgTU9EVUxFX01BR0lDX05VTUJFUl9NSU5PUiA+PSA4KQotICAgIGZpbGVuYW1lID0gci0+Y2FzZV9wcmVzZXJ2ZWRfZmlsZW5hbWU7Ci0jZWxzZQotICAgIGZpbGVuYW1lID0gci0+ZmlsZW5hbWU7Ci0jZW5kaWYKLQotICAgIC8qCi0gICAgKiogSWYgdGhlcmUgaXMgYW55dGhpbmcgaW4gdGhlIHBhdGhfaW5mbywgdGhlbiB0aGlzIGluZGljYXRlcyB0aGF0IHRoZQotICAgICoqIGVudGlyZSBwYXRoIHdhcyBub3QgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlL2Rpci4gV2Ugd2FudCB0byBhcHBlbmQKLSAgICAqKiBpdCBvbnRvIHRoZSBmaWxlbmFtZSBzbyB0aGF0IHdlIGdldCBhICJ2YWxpZCIgcGF0aG5hbWUgZm9yIG51bGwKLSAgICAqKiByZXNvdXJjZXMuCi0gICAgKi8KLSAgICBzID0gYXBfcHN0cmNhdChyLT5wb29sLCBmaWxlbmFtZSwgci0+cGF0aF9pbmZvLCBOVUxMKTsKLQotICAgIC8qIG1ha2Ugc3VyZSB0aGUgcGF0aG5hbWUgZG9lcyBub3QgaGF2ZSBhIHRyYWlsaW5nICIvIiAqLwotICAgIGxlbiA9IHN0cmxlbihzKTsKLSAgICBpZiAobGVuID4gMSAmJiBzW2xlbiAtIDFdID09ICcvJykgewotCXNbbGVuIC0gMV0gPSAnXDAnOwotICAgIH0KLSAgICBjdHgtPnBhdGhuYW1lID0gczsKLQotICAgIC8qIENyZWF0ZSByZXNvdXJjZSBkZXNjcmlwdG9yICovCi0gICAgcmVzb3VyY2UgPSBhcF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZigqcmVzb3VyY2UpKTsKLSAgICByZXNvdXJjZS0+dHlwZSA9IERBVl9SRVNPVVJDRV9UWVBFX1JFR1VMQVI7Ci0gICAgcmVzb3VyY2UtPmluZm8gPSBjdHg7Ci0gICAgcmVzb3VyY2UtPmhvb2tzID0gJmRhdl9ob29rc19yZXBvc2l0b3J5X2ZzOwotCi0gICAgLyogbWFrZSBzdXJlIHRoZSBVUkkgZG9lcyBub3QgaGF2ZSBhIHRyYWlsaW5nICIvIiAqLwotICAgIGxlbiA9IHN0cmxlbihyLT51cmkpOwotICAgIGlmIChsZW4gPiAxICYmIHItPnVyaVtsZW4gLSAxXSA9PSAnLycpIHsKLQlzID0gYXBfcHN0cmR1cChyLT5wb29sLCByLT51cmkpOwotCXNbbGVuIC0gMV0gPSAnXDAnOwotCXJlc291cmNlLT51cmkgPSBzOwotICAgIH0KLSAgICBlbHNlIHsKLQlyZXNvdXJjZS0+dXJpID0gci0+dXJpOwotICAgIH0KLQotICAgIGlmIChyLT5maW5mby5zdF9tb2RlICE9IDApIHsKLSAgICAgICAgcmVzb3VyY2UtPmV4aXN0cyA9IDE7Ci0gICAgICAgIHJlc291cmNlLT5jb2xsZWN0aW9uID0gU19JU0RJUihyLT5maW5mby5zdF9tb2RlKTsKLQotCS8qIHVudXNlZCBpbmZvIGluIHRoZSBVUkwgd2lsbCBpbmRpY2F0ZSBhIG51bGwgcmVzb3VyY2UgKi8KLQotCWlmIChyLT5wYXRoX2luZm8gIT0gTlVMTCAmJiAqci0+cGF0aF9pbmZvICE9ICdcMCcpIHsKLQkgICAgaWYgKHJlc291cmNlLT5jb2xsZWN0aW9uKSB7Ci0JCS8qIG9ubHkgYSB0cmFpbGluZyAiLyIgaXMgYWxsb3dlZCAqLwotCQlpZiAoKnItPnBhdGhfaW5mbyAhPSAnLycgfHwgci0+cGF0aF9pbmZvWzFdICE9ICdcMCcpIHsKLQotCQkgICAgLyoKLQkJICAgICoqIFRoaXMgVVJML2ZpbGVuYW1lIHJlcHJlc2VudHMgYSBsb2NrbnVsbCByZXNvdXJjZSBvcgotCQkgICAgKiogcG9zc2libHkgYSBkZXN0aW5hdGlvbiBvZiBhIE1PVkUvQ09QWQotCQkgICAgKi8KLQkJICAgIHJlc291cmNlLT5leGlzdHMgPSAwOwotCQkgICAgcmVzb3VyY2UtPmNvbGxlY3Rpb24gPSAwOwotCQl9Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JCS8qCi0JCSoqIFRoZSBiYXNlIG9mIHRoZSBwYXRoIHJlZmVycyB0byBhIGZpbGUgLS0gbm90aGluZyBzaG91bGQKLQkJKiogYmUgaW4gcGF0aF9pbmZvLiBUaGUgcmVzb3VyY2UgaXMgc2ltcGx5IGFuIGVycm9yOiBpdAotCQkqKiBjYW4ndCBiZSBhIG51bGwgb3IgYSBsb2NrbnVsbCByZXNvdXJjZS4KLQkJKi8KLQkJcmV0dXJuIE5VTEw7CS8qIGJlY29tZXMgSFRUUF9OT1RfRk9VTkQgKi8KLQkgICAgfQotCi0JICAgIC8qIHJldGFpbiBwcm9wZXIgaW50ZWdyaXR5IGFjcm9zcyB0aGUgc3RydWN0dXJlcyAqLwotCSAgICBpZiAoIXJlc291cmNlLT5leGlzdHMpIHsKLQkJY3R4LT5maW5mby5zdF9tb2RlID0gMDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzb3VyY2U7Ci19Ci0KLXN0YXRpYyBkYXZfcmVzb3VyY2UgKiBkYXZfZnNfZ2V0X3BhcmVudF9yZXNvdXJjZShjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlKQotewotICAgIGRhdl9yZXNvdXJjZV9wcml2YXRlICpjdHggPSByZXNvdXJjZS0+aW5mbzsKLSAgICBkYXZfcmVzb3VyY2VfcHJpdmF0ZSAqcGFyZW50X2N0eDsKLSAgICBkYXZfcmVzb3VyY2UgKnBhcmVudF9yZXNvdXJjZTsKLSAgICBjaGFyICpkaXJwYXRoOwotCi0gICAgLyogSWYgZ2l2ZW4gcmVzb3VyY2UgaXMgcm9vdCwgdGhlbiB0aGVyZSBpcyBubyBwYXJlbnQgKi8KLSAgICBpZiAoc3RyY21wKHJlc291cmNlLT51cmksICIvIikgPT0gMCB8fAotI2lmZGVmIFdJTjMyCi0gICAgICAgIChzdHJsZW4oY3R4LT5wYXRobmFtZSkgPT0gMyAmJiBjdHgtPnBhdGhuYW1lWzFdID09ICc6JyAmJiBjdHgtPnBhdGhuYW1lWzJdID09ICcvJykKLSNlbHNlCi0gICAgICAgIHN0cmNtcChjdHgtPnBhdGhuYW1lLCAiLyIpID09IDAKLSNlbmRpZgotCSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiAjIyMgb3B0aW1pemUgdGhpcyBpbnRvIGEgc2luZ2xlIGFsbG9jYXRpb24hICovCi0KLSAgICAvKiBDcmVhdGUgcHJpdmF0ZSByZXNvdXJjZSBjb250ZXh0IGRlc2NyaXB0b3IgKi8KLSAgICBwYXJlbnRfY3R4ID0gYXBfcGNhbGxvYyhjdHgtPnBvb2wsIHNpemVvZigqcGFyZW50X2N0eCkpOwotICAgIHBhcmVudF9jdHgtPnBvb2wgPSBjdHgtPnBvb2w7Ci0KLSAgICBkaXJwYXRoID0gYXBfbWFrZV9kaXJzdHJfcGFyZW50KGN0eC0+cG9vbCwgY3R4LT5wYXRobmFtZSk7Ci0gICAgaWYgKHN0cmxlbihkaXJwYXRoKSA+IDEgJiYgZGlycGF0aFtzdHJsZW4oZGlycGF0aCkgLSAxXSA9PSAnLycpIAotICAgICAgICBkaXJwYXRoW3N0cmxlbihkaXJwYXRoKSAtIDFdID0gJ1wwJzsKLSAgICBwYXJlbnRfY3R4LT5wYXRobmFtZSA9IGRpcnBhdGg7Ci0KLSAgICBwYXJlbnRfcmVzb3VyY2UgPSBhcF9wY2FsbG9jKGN0eC0+cG9vbCwgc2l6ZW9mKCpwYXJlbnRfcmVzb3VyY2UpKTsKLSAgICBwYXJlbnRfcmVzb3VyY2UtPmluZm8gPSBwYXJlbnRfY3R4OwotICAgIHBhcmVudF9yZXNvdXJjZS0+Y29sbGVjdGlvbiA9IDE7Ci0gICAgcGFyZW50X3Jlc291cmNlLT5ob29rcyA9ICZkYXZfaG9va3NfcmVwb3NpdG9yeV9mczsKLQotICAgIGlmIChyZXNvdXJjZS0+dXJpICE9IE5VTEwpIHsKLSAgICAgICAgY2hhciAqdXJpID0gYXBfbWFrZV9kaXJzdHJfcGFyZW50KGN0eC0+cG9vbCwgcmVzb3VyY2UtPnVyaSk7Ci0gICAgICAgIGlmIChzdHJsZW4odXJpKSA+IDEgJiYgdXJpW3N0cmxlbih1cmkpIC0gMV0gPT0gJy8nKQotICAgICAgICAgICAgdXJpW3N0cmxlbih1cmkpIC0gMV0gPSAnXDAnOwotCXBhcmVudF9yZXNvdXJjZS0+dXJpID0gdXJpOwotICAgIH0KLQotICAgIGlmIChzdGF0KHBhcmVudF9jdHgtPnBhdGhuYW1lLCAmcGFyZW50X2N0eC0+ZmluZm8pID09IDApIHsKLSAgICAgICAgcGFyZW50X3Jlc291cmNlLT5leGlzdHMgPSAxOwotICAgIH0KLQotICAgIHJldHVybiBwYXJlbnRfcmVzb3VyY2U7Ci19Ci0KLXN0YXRpYyBpbnQgZGF2X2ZzX2lzX3NhbWVfcmVzb3VyY2UoCi0gICAgY29uc3QgZGF2X3Jlc291cmNlICpyZXMxLAotICAgIGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzMikKLXsKLSAgICBkYXZfcmVzb3VyY2VfcHJpdmF0ZSAqY3R4MSA9IHJlczEtPmluZm87Ci0gICAgZGF2X3Jlc291cmNlX3ByaXZhdGUgKmN0eDIgPSByZXMyLT5pbmZvOwotCi0gICAgaWYgKHJlczEtPmhvb2tzICE9IHJlczItPmhvb2tzKQotCXJldHVybiAwOwotCi0jaWZkZWYgV0lOMzIKLSAgICByZXR1cm4gc3RyaWNtcChjdHgxLT5wYXRobmFtZSwgY3R4Mi0+cGF0aG5hbWUpID09IDA7Ci0jZWxzZQotICAgIGlmIChjdHgxLT5maW5mby5zdF9tb2RlICE9IDApCi0gICAgICAgIHJldHVybiBjdHgxLT5maW5mby5zdF9pbm8gPT0gY3R4Mi0+ZmluZm8uc3RfaW5vOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIHN0cmNtcChjdHgxLT5wYXRobmFtZSwgY3R4Mi0+cGF0aG5hbWUpID09IDA7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGludCBkYXZfZnNfaXNfcGFyZW50X3Jlc291cmNlKAotICAgIGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzMSwKLSAgICBjb25zdCBkYXZfcmVzb3VyY2UgKnJlczIpCi17Ci0gICAgZGF2X3Jlc291cmNlX3ByaXZhdGUgKmN0eDEgPSByZXMxLT5pbmZvOwotICAgIGRhdl9yZXNvdXJjZV9wcml2YXRlICpjdHgyID0gcmVzMi0+aW5mbzsKLSAgICBzaXplX3QgbGVuMSA9IHN0cmxlbihjdHgxLT5wYXRobmFtZSk7Ci0gICAgc2l6ZV90IGxlbjI7Ci0KLSAgICBpZiAocmVzMS0+aG9va3MgIT0gcmVzMi0+aG9va3MpCi0JcmV0dXJuIDA7Ci0KLSAgICAvKiBpdCBpcyBzYWZlIHRvIHVzZSBjdHgyIG5vdyAqLwotICAgIGxlbjIgPSBzdHJsZW4oY3R4Mi0+cGF0aG5hbWUpOwotCi0gICAgcmV0dXJuIChsZW4yID4gbGVuMQotICAgICAgICAgICAgJiYgbWVtY21wKGN0eDEtPnBhdGhuYW1lLCBjdHgyLT5wYXRobmFtZSwgbGVuMSkgPT0gMAotICAgICAgICAgICAgJiYgY3R4Mi0+cGF0aG5hbWVbbGVuMV0gPT0gJy8nKTsKLX0KLQotc3RhdGljIGRhdl9lcnJvciAqIGRhdl9mc19vcGVuX3N0cmVhbShjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlLAotCQkJCSAgICAgIGRhdl9zdHJlYW1fbW9kZSBtb2RlLAotCQkJCSAgICAgIGRhdl9zdHJlYW0gKipzdHJlYW0pCi17Ci0gICAgcG9vbCAqcCA9IHJlc291cmNlLT5pbmZvLT5wb29sOwotICAgIGRhdl9zdHJlYW0gKmRzID0gYXBfcGFsbG9jKHAsIHNpemVvZigqZHMpKTsKLSAgICBpbnQgZmxhZ3M7Ci0KLSAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICBjYXNlIERBVl9NT0RFX1JFQUQ6Ci0gICAgY2FzZSBEQVZfTU9ERV9SRUFEX1NFRUtBQkxFOgotICAgIGRlZmF1bHQ6Ci0JZmxhZ3MgPSBPX1JET05MWTsKLQlicmVhazsKLQotICAgIGNhc2UgREFWX01PREVfV1JJVEVfVFJVTkM6Ci0JZmxhZ3MgPSBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19CSU5BUlk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEQVZfTU9ERV9XUklURV9TRUVLQUJMRToKLQlmbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fQklOQVJZOwotCWJyZWFrOwotICAgIH0KLQotICAgIGRzLT5wID0gcDsKLSAgICBkcy0+cGF0aG5hbWUgPSByZXNvdXJjZS0+aW5mby0+cGF0aG5hbWU7Ci0gICAgZHMtPmZkID0gb3Blbihkcy0+cGF0aG5hbWUsIGZsYWdzLCBEQVZfRlNfTU9ERV9GSUxFKTsKLSAgICBpZiAoZHMtPmZkID09IC0xKSB7Ci0JLyogIyMjIHVzZSBzb21ldGhpbmcgYmVzaWRlcyA1MDA/ICovCi0JcmV0dXJuIGRhdl9uZXdfZXJyb3IocCwgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsIDAsCi0JCQkgICAgICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBvcGVuaW5nIGEgcmVzb3VyY2UuIik7Ci0gICAgfQotICAgIGFwX25vdGVfY2xlYW51cHNfZm9yX2ZkKHAsIGRzLT5mZCk7Ci0KLSAgICAqc3RyZWFtID0gZHM7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBkYXZfZXJyb3IgKiBkYXZfZnNfY2xvc2Vfc3RyZWFtKGRhdl9zdHJlYW0gKnN0cmVhbSwgaW50IGNvbW1pdCkKLXsKLSAgICBhcF9raWxsX2NsZWFudXBzX2Zvcl9mZChzdHJlYW0tPnAsIHN0cmVhbS0+ZmQpOwotICAgIGNsb3NlKHN0cmVhbS0+ZmQpOwotCi0gICAgaWYgKCFjb21taXQpIHsKLQlpZiAocmVtb3ZlKHN0cmVhbS0+cGF0aG5hbWUpICE9IDApIHsKLQkgICAgLyogIyMjIHVzZSBhIGJldHRlciBkZXNjcmlwdGlvbj8gKi8KLSAgICAgICAgICAgIHJldHVybiBkYXZfbmV3X2Vycm9yKHN0cmVhbS0+cCwgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsIDAsCi0JCQkJICJUaGVyZSB3YXMgYSBwcm9ibGVtIHJlbW92aW5nIChyb2xsaW5nICIKLQkJCQkgImJhY2spIHRoZSByZXNvdXJjZSAiCi0JCQkJICJ3aGVuIGl0IHdhcyBiZWluZyBjbG9zZWQuIik7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgZGF2X2Vycm9yICogZGF2X2ZzX3JlYWRfc3RyZWFtKGRhdl9zdHJlYW0gKnN0cmVhbSwKLQkJCQkgICAgICB2b2lkICpidWYsIHNpemVfdCAqYnVmc2l6ZSkKLXsKLSAgICBzc2l6ZV90IGFtdDsKLQotICAgIGFtdCA9IHJlYWQoc3RyZWFtLT5mZCwgYnVmLCAqYnVmc2l6ZSk7Ci0gICAgaWYgKGFtdCA9PSAtMSkgewotCS8qICMjIyB1c2Ugc29tZXRoaW5nIGJlc2lkZXMgNTAwPyAqLwotCXJldHVybiBkYXZfbmV3X2Vycm9yKHN0cmVhbS0+cCwgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsIDAsCi0JCQkgICAgICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSByZWFkaW5nIGZyb20gYSAiCi0JCQkgICAgICJyZXNvdXJjZS4iKTsKLSAgICB9Ci0gICAgKmJ1ZnNpemUgPSAoc2l6ZV90KWFtdDsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGRhdl9lcnJvciAqIGRhdl9mc193cml0ZV9zdHJlYW0oZGF2X3N0cmVhbSAqc3RyZWFtLAotCQkJCSAgICAgICBjb25zdCB2b2lkICpidWYsIHNpemVfdCBidWZzaXplKQotewotICAgIGlmIChkYXZfc3luY193cml0ZShzdHJlYW0tPmZkLCBidWYsIGJ1ZnNpemUpICE9IDApIHsKLQlpZiAoZXJybm8gPT0gRU5PU1BDKSB7Ci0JICAgIHJldHVybiBkYXZfbmV3X2Vycm9yKHN0cmVhbS0+cCwgSFRUUF9JTlNVRkZJQ0lFTlRfU1RPUkFHRSwgMCwKLQkJCQkgIlRoZXJlIGlzIG5vdCBlbm91Z2ggc3RvcmFnZSB0byB3cml0ZSB0byAiCi0JCQkJICJ0aGlzIHJlc291cmNlLiIpOwotCX0KLQotCS8qICMjIyB1c2Ugc29tZXRoaW5nIGJlc2lkZXMgNTAwPyAqLwotCXJldHVybiBkYXZfbmV3X2Vycm9yKHN0cmVhbS0+cCwgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsIDAsCi0JCQkgICAgICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB3cml0aW5nIHRvIGEgIgotCQkJICAgICAicmVzb3VyY2UuIik7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgZGF2X2Vycm9yICogZGF2X2ZzX3NlZWtfc3RyZWFtKGRhdl9zdHJlYW0gKnN0cmVhbSwgb2ZmX3QgYWJzX3BvcykKLXsKLSAgICBpZiAobHNlZWsoc3RyZWFtLT5mZCwgYWJzX3BvcywgU0VFS19TRVQpID09IChvZmZfdCktMSkgewotCS8qICMjIyB1c2Ugc29tZXRoaW5nIGJlc2lkZXMgNTAwPyAqLwotCXJldHVybiBkYXZfbmV3X2Vycm9yKHN0cmVhbS0+cCwgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsIDAsCi0JCQkgICAgICJDb3VsZCBub3Qgc2VlayB0byBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhlICIKLQkJCSAgICAgInJlc291cmNlLiIpOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGRhdl9lcnJvciAqIGRhdl9mc19zZXRfaGVhZGVycyhyZXF1ZXN0X3JlYyAqciwKLQkJCQkgICAgICBjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlKQotewotICAgIC8qICMjIyB0aGlzIGZ1bmN0aW9uIGlzbid0IHJlYWxseSB1c2VkIHNpbmNlIHdlIGhhdmUgYSBnZXRfcGF0aG5hbWUgKi8KLSNpZiBERUJVR19HRVRfSEFORExFUgotICAgIGlmICghcmVzb3VyY2UtPmV4aXN0cykKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIG1ha2Ugc3VyZSB0aGUgcHJvcGVyIG10aW1lIGlzIGluIHRoZSByZXF1ZXN0IHJlY29yZCAqLwotICAgIGFwX3VwZGF0ZV9tdGltZShyLCByZXNvdXJjZS0+aW5mby0+ZmluZm8uc3RfbXRpbWUpOwotCi0gICAgLyogIyMjIG5vdGUgdGhhdCB0aGVzZSB1c2Ugci0+ZmlsZW5hbWUgcmF0aGVyIHRoYW4gPHJlc291cmNlPiAqLwotICAgIGFwX3NldF9sYXN0X21vZGlmaWVkKHIpOwotICAgIGFwX3NldF9ldGFnKHIpOwotCi0gICAgLyogd2UgYWNjZXB0IGJ5dGUtcmFuZ2VzICovCi0gICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkFjY2VwdC1SYW5nZXMiLCAiYnl0ZXMiKTsKLQotICAgIC8qIHNldCB1cCB0aGUgQ29udGVudC1MZW5ndGggaGVhZGVyICovCi0gICAgYXBfc2V0X2NvbnRlbnRfbGVuZ3RoKHIsIHJlc291cmNlLT5pbmZvLT5maW5mby5zdF9zaXplKTsKLQotICAgIC8qICMjIyBob3cgdG8gc2V0IHRoZSBjb250ZW50IHR5cGU/ICovCi0gICAgLyogIyMjIHVudGlsIHRoaXMgaXMgcmVzb2x2ZWQsIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyIGlzIGJ1c3RlZCAqLwotCi0jZW5kaWYKLQotICAgIHJldHVybiBOVUxMOwotfQotCi0jaWYgREVCVUdfUEFUSE5BTUVfU1RZTEUKLXN0YXRpYyBjb25zdCBjaGFyICogZGF2X2ZzX2dldF9wYXRobmFtZSgKLSAgICBjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlLAotICAgIHZvaWQgKipmcmVlX2hhbmRsZV9wKQotewotICAgIHJldHVybiByZXNvdXJjZS0+aW5mby0+cGF0aG5hbWU7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgZGF2X2ZzX2ZyZWVfZmlsZSh2b2lkICpmcmVlX2hhbmRsZSkKLXsKLSAgICAvKiBub3RoaW5nIHRvIGZyZWUgLi4uICovCi19Ci0KLXN0YXRpYyBkYXZfZXJyb3IgKiBkYXZfZnNfY3JlYXRlX2NvbGxlY3Rpb24ocG9vbCAqcCwgZGF2X3Jlc291cmNlICpyZXNvdXJjZSkKLXsKLSAgICBkYXZfcmVzb3VyY2VfcHJpdmF0ZSAqY3R4ID0gcmVzb3VyY2UtPmluZm87Ci0KLSAgICBpZiAobWtkaXIoY3R4LT5wYXRobmFtZSwgREFWX0ZTX01PREVfRElSKSAhPSAwKSB7Ci0JaWYgKGVycm5vID09IEVOT1NQQykgCi0JICAgIHJldHVybiBkYXZfbmV3X2Vycm9yKHAsIEhUVFBfSU5TVUZGSUNJRU5UX1NUT1JBR0UsIDAsCi0JCQkJICJUaGVyZSBpcyBub3QgZW5vdWdoIHN0b3JhZ2UgdG8gY3JlYXRlICIKLQkJCQkgInRoaXMgY29sbGVjdGlvbi4iKTsKLQotCS8qICMjIyByZWZpbmUgdGhpcyBlcnJvciBtZXNzYWdlPyAqLwotCXJldHVybiBkYXZfbmV3X2Vycm9yKHAsIEhUVFBfRk9SQklEREVOLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGNyZWF0ZSBjb2xsZWN0aW9uLiIpOwotICAgIH0KLQotICAgIC8qIHVwZGF0ZSByZXNvdXJjZSBzdGF0ZSB0byBzaG93IGl0IGV4aXN0cyBhcyBhIGNvbGxlY3Rpb24gKi8KLSAgICByZXNvdXJjZS0+ZXhpc3RzID0gMTsKLSAgICByZXNvdXJjZS0+Y29sbGVjdGlvbiA9IDE7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGRhdl9lcnJvciAqIGRhdl9mc19jb3B5bW92ZV93YWxrZXIoZGF2X3dhbGtlcl9jdHggKmN0eCwgaW50IGNhbGx0eXBlKQotewotICAgIGRhdl9yZXNvdXJjZV9wcml2YXRlICpzcmNpbmZvID0gY3R4LT5yZXNvdXJjZS0+aW5mbzsKLSAgICBkYXZfcmVzb3VyY2VfcHJpdmF0ZSAqZHN0aW5mbyA9IGN0eC0+cmVzMi0+aW5mbzsKLSAgICBkYXZfZXJyb3IgKmVyciA9IE5VTEw7Ci0KLSAgICBpZiAoY3R4LT5yZXNvdXJjZS0+Y29sbGVjdGlvbikgewotCWlmIChjYWxsdHlwZSA9PSBEQVZfQ0FMTFRZUEVfUE9TVEZJWCkgewotCSAgICAvKiBQb3N0Zml4IGNhbGwgZm9yIE1PVkUuIGRlbGV0ZSB0aGUgc291cmNlIGRpci4KLQkgICAgICogTm90ZTogd2hlbiBjb3B5aW5nLCB3ZSBkbyBub3QgZW5hYmxlIHRoZSBwb3N0Zml4LXRyYXZlcnNhbC4KLQkgICAgICovCi0JICAgIC8qICMjIyB3ZSBhcmUgaWdub3JpbmcgYW55IGVycm9yIGhlcmU7IHdoYXQgc2hvdWxkIHdlIGRvPyAqLwotCSAgICAodm9pZCkgcm1kaXIoc3JjaW5mby0+cGF0aG5hbWUpOwotCX0KLSAgICAgICAgZWxzZSB7Ci0JICAgIC8qIGNvcHkvbW92ZSBvZiBhIGNvbGxlY3Rpb24uIENyZWF0ZSB0aGUgbmV3LCB0YXJnZXQgY29sbGVjdGlvbiAqLwotICAgICAgICAgICAgaWYgKG1rZGlyKGRzdGluZm8tPnBhdGhuYW1lLCBEQVZfRlNfTU9ERV9ESVIpICE9IDApIHsKLQkJLyogIyMjIGFzc3VtZSBpdCB3YXMgYSBwZXJtaXNzaW9ucyBwcm9ibGVtICovCi0JCS8qICMjIyBuZWVkIGEgZGVzY3JpcHRpb24gaGVyZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IGRhdl9uZXdfZXJyb3IoY3R4LT5wb29sLCBIVFRQX0ZPUkJJRERFTiwgMCwgTlVMTCk7Ci0gICAgICAgICAgICB9Ci0JfQotICAgIH0KLSAgICBlbHNlIHsKLQllcnIgPSBkYXZfZnNfY29weW1vdmVfZmlsZShjdHgtPmlzX21vdmUsIGN0eC0+cG9vbCwgc3JjaW5mby0+cGF0aG5hbWUsCi0JCQkJICAgZHN0aW5mby0+cGF0aG5hbWUsICZjdHgtPndvcmtfYnVmKTsKLQkvKiAjIyMgcHVzaCBhIGhpZ2hlci1sZXZlbCBkZXNjcmlwdGlvbj8gKi8KLSAgICB9Ci0KLSAgICAvKgotICAgICoqIElmIHdlIGhhdmUgYSAibm90IHNvIGJhZCIgZXJyb3IsIHRoZW4gaXQgbWlnaHQgbmVlZCB0byBnbyBpbnRvIGEKLSAgICAqKiBtdWx0aXN0YXR1cyByZXNwb25zZS4KLSAgICAqKgotICAgICoqIEZvciBhIE1PVkUsIGl0IHdpbGwgYWx3YXlzIGdvIGludG8gdGhlIG11bHRpc3RhdHVzLiBJdCBjb3VsZCBiZQotICAgICoqIHRoYXQgZXZlcnl0aGluZyBoYXMgYmVlbiBtb3ZlZCAqZXhjZXB0KiBmb3IgdGhlIHJvb3QuIFVzaW5nIGEKLSAgICAqKiBtdWx0aXN0YXR1cyAod2l0aCBubyBlcnJvcnMgZm9yIHRoZSBvdGhlciByZXNvdXJjZXMpIHdpbGwgc2lnbmlmeQotICAgICoqIHRoaXMgY29uZGl0aW9uLgotICAgICoqCi0gICAgKiogRm9yIGEgQ09QWSwgd2UgYXJlIHRyYXZlcnNpbmcgaW4gYSBwcmVmaXggZmFzaGlvbi4gSWYgdGhlIHJvb3QgZmFpbHMsCi0gICAgKiogdGhlbiB3ZSBjYW4ganVzdCBiYWlsIG91dCBub3cuCi0gICAgKi8KLSAgICBpZiAoZXJyICE9IE5VTEwKLSAgICAgICAgJiYgIWFwX2lzX0hUVFBfU0VSVkVSX0VSUk9SKGVyci0+c3RhdHVzKQotCSYmIChjdHgtPmlzX21vdmUKLSAgICAgICAgICAgIHx8ICFkYXZfZnNfaXNfc2FtZV9yZXNvdXJjZShjdHgtPnJlc291cmNlLCBjdHgtPnJvb3QpKSkgewotCS8qICMjIyB1c2UgZXJybm8gdG8gZ2VuZXJhdGUgREFWOnJlc3BvbnNlZGVzY3JpcHRpb24/ICovCi0JZGF2X2FkZF9yZXNwb25zZShjdHgsIGN0eC0+cmVzb3VyY2UtPnVyaSwgZXJyLT5zdGF0dXMsIE5VTEwpOwotCi0gICAgICAgIC8qIHRoZSBlcnJvciBpcyBpbiB0aGUgbXVsdGlzdGF0dXMgbm93LiBkbyBub3Qgc3RvcCB0aGUgdHJhdmVyc2FsLiAqLwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgZGF2X2Vycm9yICpkYXZfZnNfY29weW1vdmVfcmVzb3VyY2UoCi0gICAgaW50IGlzX21vdmUsCi0gICAgY29uc3QgZGF2X3Jlc291cmNlICpzcmMsCi0gICAgY29uc3QgZGF2X3Jlc291cmNlICpkc3QsCi0gICAgaW50IGRlcHRoLAotICAgIGRhdl9yZXNwb25zZSAqKnJlc3BvbnNlKQotewotICAgIGRhdl9lcnJvciAqZXJyID0gTlVMTDsKLSAgICBkYXZfYnVmZmVyIHdvcmtfYnVmID0geyAwIH07Ci0KLSAgICAqcmVzcG9uc2UgPSBOVUxMOwotCi0gICAgLyogaWYgYSBjb2xsZWN0aW9uLCByZWN1cnNpdmVseSBjb3B5L21vdmUgaXQgYW5kIGl0cyBjaGlsZHJlbiwKLSAgICAgKiBpbmNsdWRpbmcgdGhlIHN0YXRlIGRpcnMKLSAgICAgKi8KLSAgICBpZiAoc3JjLT5jb2xsZWN0aW9uKSB7Ci0JZGF2X3dhbGtlcl9jdHggY3R4ID0geyAwIH07Ci0KLQljdHgud2Fsa190eXBlID0gREFWX1dBTEtUWVBFX0FMTCB8IERBVl9XQUxLVFlQRV9ISURERU47Ci0JY3R4LmZ1bmMgPSBkYXZfZnNfY29weW1vdmVfd2Fsa2VyOwotCWN0eC5wb29sID0gc3JjLT5pbmZvLT5wb29sOwotCWN0eC5yZXNvdXJjZSA9IHNyYzsKLQljdHgucmVzMiA9IGRzdDsKLQljdHguaXNfbW92ZSA9IGlzX21vdmU7Ci0JY3R4LnBvc3RmaXggPSBpc19tb3ZlOwkvKiBuZWVkZWQgZm9yIE1PVkUgdG8gZGVsZXRlIHNvdXJjZSBkaXJzICovCi0KLQkvKiBjb3B5IG92ZXIgdGhlIHNvdXJjZSBVUkkgKi8KLQlkYXZfYnVmZmVyX2luaXQoY3R4LnBvb2wsICZjdHgudXJpLCBzcmMtPnVyaSk7Ci0KLQlpZiAoKGVyciA9IGRhdl9mc193YWxrKCZjdHgsIGRlcHRoKSkgIT0gTlVMTCkgewotICAgICAgICAgICAgLyogb24gYSAicmVhbCIgZXJyb3IsIHRoZW4ganVzdCBwdW50LiBub3RoaW5nIGVsc2UgdG8gZG8uICovCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCgqcmVzcG9uc2UgPSBjdHgucmVzcG9uc2UpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIC8qIHNvbWUgbXVsdGlzdGF0dXMgcmVzcG9uc2VzIGV4aXN0LiB3cmFwIHRoZW0gaW4gYSAyMDcgKi8KLSAgICAgICAgICAgIHJldHVybiBkYXZfbmV3X2Vycm9yKHNyYy0+aW5mby0+cG9vbCwgSFRUUF9NVUxUSV9TVEFUVVMsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Iocykgb2NjdXJyZWQgb24gc29tZSByZXNvdXJjZXMgZHVyaW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgQ09QWS9NT1ZFIHByb2Nlc3MuIik7Ci0gICAgICAgIH0KLQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8qIG5vdCBhIGNvbGxlY3Rpb24gKi8KLSAgICBpZiAoKGVyciA9IGRhdl9mc19jb3B5bW92ZV9maWxlKGlzX21vdmUsIHNyYy0+aW5mby0+cG9vbCwKLQkJCQkgICAgc3JjLT5pbmZvLT5wYXRobmFtZSwgZHN0LT5pbmZvLT5wYXRobmFtZSwKLQkJCQkgICAgJndvcmtfYnVmKSkgIT0gTlVMTCkgewotCS8qICMjIyBwdXNoIGEgaGlnaGVyLWxldmVsIGRlc2NyaXB0aW9uPyAqLwotCXJldHVybiBlcnI7Ci0gICAgfQotCQotICAgIC8qIGNvcHkvbW92ZSBwcm9wZXJ0aWVzIGFzIHdlbGwgKi8KLSAgICByZXR1cm4gZGF2X2ZzX2NvcHltb3Zlc2V0KGlzX21vdmUsIHNyYy0+aW5mby0+cG9vbCwgc3JjLCBkc3QsICZ3b3JrX2J1Zik7Ci19Ci0KLXN0YXRpYyBkYXZfZXJyb3IgKiBkYXZfZnNfY29weV9yZXNvdXJjZSgKLSAgICBjb25zdCBkYXZfcmVzb3VyY2UgKnNyYywKLSAgICBkYXZfcmVzb3VyY2UgKmRzdCwKLSAgICBpbnQgZGVwdGgsCi0gICAgZGF2X3Jlc3BvbnNlICoqcmVzcG9uc2UpCi17Ci0gICAgZGF2X2Vycm9yICplcnI7Ci0KLSNpZiBEQVZfREVCVUcKLSAgICBpZiAoc3JjLT5ob29rcyAhPSBkc3QtPmhvb2tzKSB7Ci0JLyoKLQkqKiAjIyMgc3RyaWN0bHkgc3BlYWtpbmcsIHRoaXMgaXMgYSBkZXNpZ24gZXJyb3I7IHdlIHNob3VsZCBub3QKLQkqKiAjIyMgaGF2ZSByZWFjaGVkIHRoaXMgcG9pbnQuCi0JKi8KLQlyZXR1cm4gZGF2X25ld19lcnJvcihzcmMtPmluZm8tPnBvb2wsIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCAwLAotCQkJICAgICAiREVTSUdOIEVSUk9SOiBhIG1peCBvZiByZXBvc2l0b3JpZXMgIgotCQkJICAgICAid2FzIHBhc3NlZCB0byBjb3B5X3Jlc291cmNlLiIpOwotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKChlcnIgPSBkYXZfZnNfY29weW1vdmVfcmVzb3VyY2UoMCwgc3JjLCBkc3QsIGRlcHRoLAotCQkJCQlyZXNwb25zZSkpID09IE5VTEwpIHsKLQotICAgICAgICAvKiB1cGRhdGUgc3RhdGUgb2YgZGVzdGluYXRpb24gcmVzb3VyY2UgdG8gc2hvdyBpdCBleGlzdHMgKi8KLSAgICAgICAgZHN0LT5leGlzdHMgPSAxOwotICAgICAgICBkc3QtPmNvbGxlY3Rpb24gPSBzcmMtPmNvbGxlY3Rpb247Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGRhdl9lcnJvciAqIGRhdl9mc19tb3ZlX3Jlc291cmNlKAotICAgIGRhdl9yZXNvdXJjZSAqc3JjLAotICAgIGRhdl9yZXNvdXJjZSAqZHN0LAotICAgIGRhdl9yZXNwb25zZSAqKnJlc3BvbnNlKQotewotICAgIGRhdl9yZXNvdXJjZV9wcml2YXRlICpzcmNpbmZvID0gc3JjLT5pbmZvOwotICAgIGRhdl9yZXNvdXJjZV9wcml2YXRlICpkc3RpbmZvID0gZHN0LT5pbmZvOwotICAgIGRhdl9lcnJvciAqZXJyOwotICAgIGludCBjYW5fcmVuYW1lID0gMDsKLQotI2lmIERBVl9ERUJVRwotICAgIGlmIChzcmMtPmhvb2tzICE9IGRzdC0+aG9va3MpIHsKLQkvKgotCSoqICMjIyBzdHJpY3RseSBzcGVha2luZywgdGhpcyBpcyBhIGRlc2lnbiBlcnJvcjsgd2Ugc2hvdWxkIG5vdAotCSoqICMjIyBoYXZlIHJlYWNoZWQgdGhpcyBwb2ludC4KLQkqLwotCXJldHVybiBkYXZfbmV3X2Vycm9yKHNyYy0+aW5mby0+cG9vbCwgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsIDAsCi0JCQkgICAgICJERVNJR04gRVJST1I6IGEgbWl4IG9mIHJlcG9zaXRvcmllcyAiCi0JCQkgICAgICJ3YXMgcGFzc2VkIHRvIG1vdmVfcmVzb3VyY2UuIik7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvKiBkZXRlcm1pbmUgd2hldGhlciBhIHNpbXBsZSByZW5hbWUgd2lsbCB3b3JrLgotICAgICAqIEFzc3VtZSBzb3VyY2UgZXhpc3RzLCBlbHNlIHdlIHdvdWxkbid0IGdldCBjYWxsZWQuCi0gICAgICovCi0gICAgaWYgKGRzdGluZm8tPmZpbmZvLnN0X21vZGUgIT0gMCkgewotCWlmIChkc3RpbmZvLT5maW5mby5zdF9kZXYgPT0gc3JjaW5mby0+ZmluZm8uc3RfZGV2KSB7Ci0JICAgIC8qIHRhcmdldCBleGlzdHMgYW5kIGlzIG9uIHRoZSBzYW1lIGRldmljZS4gKi8KLQkgICAgY2FuX3JlbmFtZSA9IDE7Ci0JfQotICAgIH0KLSAgICBlbHNlIHsKLQljb25zdCBjaGFyICpkaXJwYXRoOwotCXN0cnVjdCBzdGF0IGZpbmZvOwotCi0JLyogZGVzdGluYXRpb24gZG9lcyBub3QgZXhpc3QsIGJ1dCB0aGUgcGFyZW50IGRpcmVjdG9yeSBzaG91bGQsCi0JICogc28gdHJ5IGl0Ci0JICovCi0JZGlycGF0aCA9IGFwX21ha2VfZGlyc3RyX3BhcmVudChkc3RpbmZvLT5wb29sLCBkc3RpbmZvLT5wYXRobmFtZSk7Ci0JaWYgKHN0YXQoZGlycGF0aCwgJmZpbmZvKSA9PSAwCi0JICAgICYmIGZpbmZvLnN0X2RldiA9PSBzcmNpbmZvLT5maW5mby5zdF9kZXYpIHsKLQkgICAgY2FuX3JlbmFtZSA9IDE7Ci0JfQotICAgIH0KLQotICAgIC8qIGlmIHdlIGNhbid0IHNpbXBseSByZW5hbWVkLCB0aGVuIGRvIGl0IHRoZSBoYXJkIHdheS4uLiAqLwotICAgIGlmICghY2FuX3JlbmFtZSkgewotICAgICAgICBpZiAoKGVyciA9IGRhdl9mc19jb3B5bW92ZV9yZXNvdXJjZSgxLCBzcmMsIGRzdCwgREFWX0lORklOSVRZLCByZXNwb25zZSkpID09IE5VTEwpIHsKLSAgICAgICAgICAgIC8qIHVwZGF0ZSByZXNvdXJjZSBzdGF0ZXMgKi8KLSAgICAgICAgICAgIGRzdC0+ZXhpc3RzID0gMTsKLSAgICAgICAgICAgIGRzdC0+Y29sbGVjdGlvbiA9IHNyYy0+Y29sbGVjdGlvbjsKLSAgICAgICAgICAgIHNyYy0+ZXhpc3RzID0gMDsKLSAgICAgICAgICAgIHNyYy0+Y29sbGVjdGlvbiA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIGEgcmVuYW1lIHNob3VsZCB3b3JrLiBkbyBpdCwgYW5kIG1vdmUgcHJvcGVydGllcyBhcyB3ZWxsICovCi0KLSAgICAvKiBubyBtdWx0aXN0YXR1cyByZXNwb25zZSAqLwotICAgICpyZXNwb25zZSA9IE5VTEw7Ci0KLSAgICBpZiAocmVuYW1lKHNyY2luZm8tPnBhdGhuYW1lLCBkc3RpbmZvLT5wYXRobmFtZSkgIT0gMCkgewotCS8qICMjIyBzaG91bGQgaGF2ZSBhIGJldHRlciBlcnJvciB0aGFuIHRoaXMuICovCi0JcmV0dXJuIGRhdl9uZXdfZXJyb3Ioc3JjaW5mby0+cG9vbCwgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsIDAsCi0JCQkgICAgICJDb3VsZCBub3QgcmVuYW1lIHJlc291cmNlLiIpOwotICAgIH0KLQotICAgIC8qIHVwZGF0ZSByZXNvdXJjZSBzdGF0ZXMgKi8KLSAgICBkc3QtPmV4aXN0cyA9IDE7Ci0gICAgZHN0LT5jb2xsZWN0aW9uID0gc3JjLT5jb2xsZWN0aW9uOwotICAgIHNyYy0+ZXhpc3RzID0gMDsKLSAgICBzcmMtPmNvbGxlY3Rpb24gPSAwOwotCi0gICAgaWYgKChlcnIgPSBkYXZfZnNfY29weW1vdmVzZXQoMSwgc3JjLT5pbmZvLT5wb29sLAotCQkJCSAgc3JjLCBkc3QsIE5VTEwpKSA9PSBOVUxMKSB7Ci0JLyogbm8gZXJyb3IuIHdlJ3JlIGRvbmUuIGdvIGFoZWFkIGFuZCByZXR1cm4gbm93LiAqLwotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8qIGVycm9yIG9jY3VycmVkIGR1cmluZyBwcm9wZXJ0aWVzIG1vdmU7IHRyeSB0byBwdXQgcmVzb3VyY2UgYmFjayAqLwotICAgIGlmIChyZW5hbWUoZHN0aW5mby0+cGF0aG5hbWUsIHNyY2luZm8tPnBhdGhuYW1lKSAhPSAwKSB7Ci0JLyogY291bGRuJ3QgcHV0IGl0IGJhY2shICovCi0JcmV0dXJuIGRhdl9wdXNoX2Vycm9yKHNyY2luZm8tPnBvb2wsCi0JCQkgICAgICBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgMCwKLQkJCSAgICAgICJUaGUgcmVzb3VyY2Ugd2FzIG1vdmVkLCBidXQgYSBmYWlsdXJlICIKLQkJCSAgICAgICJvY2N1cnJlZCBkdXJpbmcgdGhlIG1vdmUgb2YgaXRzICIKLQkJCSAgICAgICJwcm9wZXJ0aWVzLiBUaGUgcmVzb3VyY2UgY291bGQgbm90IGJlICIKLQkJCSAgICAgICJyZXN0b3JlZCB0byBpdHMgb3JpZ2luYWwgbG9jYXRpb24uIFRoZSAiCi0JCQkgICAgICAic2VydmVyIGlzIG5vdyBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIiwKLQkJCSAgICAgIGVycik7Ci0gICAgfQotCi0gICAgLyogdXBkYXRlIHJlc291cmNlIHN0YXRlcyBhZ2FpbiAqLwotICAgIHNyYy0+ZXhpc3RzID0gMTsKLSAgICBzcmMtPmNvbGxlY3Rpb24gPSBkc3QtPmNvbGxlY3Rpb247Ci0gICAgZHN0LT5leGlzdHMgPSAwOwotICAgIGRzdC0+Y29sbGVjdGlvbiA9IDA7Ci0KLSAgICAvKiByZXNvdXJjZSBtb3ZlZCBiYWNrLCBidXQgcHJvcGVydGllcyBtYXkgYmUgaW5jb25zaXN0ZW50ICovCi0gICAgcmV0dXJuIGRhdl9wdXNoX2Vycm9yKHNyY2luZm8tPnBvb2wsCi0JCQkgIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCAwLAotCQkJICAiVGhlIHJlc291cmNlIHdhcyBtb3ZlZCwgYnV0IGEgZmFpbHVyZSAiCi0JCQkgICJvY2N1cnJlZCBkdXJpbmcgdGhlIG1vdmUgb2YgaXRzIHByb3BlcnRpZXMuICIKLQkJCSAgIlRoZSByZXNvdXJjZSB3YXMgbW92ZWQgYmFjayB0byBpdHMgb3JpZ2luYWwgIgotCQkJICAibG9jYXRpb24sIGJ1dCBpdHMgcHJvcGVydGllcyBtYXkgaGF2ZSBiZWVuICIKLQkJCSAgInBhcnRpYWxseSBtb3ZlZC4gVGhlIHNlcnZlciBtYXkgYmUgaW4gYW4gIgotCQkJICAiaW5jb25zaXN0ZW50IHN0YXRlLiIsCi0JCQkgIGVycik7Ci19Ci0KLXN0YXRpYyBkYXZfZXJyb3IgKiBkYXZfZnNfZGVsZXRlX3dhbGtlcihkYXZfd2Fsa2VyX2N0eCAqY3R4LCBpbnQgY2FsbHR5cGUpCi17Ci0gICAgZGF2X3Jlc291cmNlX3ByaXZhdGUgKmluZm8gPSBjdHgtPnJlc291cmNlLT5pbmZvOwotCi0gICAgLyogZG8gbm90IGF0dGVtcHQgdG8gcmVtb3ZlIGEgbnVsbCByZXNvdXJjZSwKLSAgICAgKiBvciBhIGNvbGxlY3Rpb24gd2l0aCBjaGlsZHJlbgotICAgICAqLwotICAgIGlmIChjdHgtPnJlc291cmNlLT5leGlzdHMgJiYKLSAgICAgICAgKCFjdHgtPnJlc291cmNlLT5jb2xsZWN0aW9uIHx8IGNhbGx0eXBlID09IERBVl9DQUxMVFlQRV9QT1NURklYKSkgewotCS8qIHRyeSB0byByZW1vdmUgdGhlIHJlc291cmNlICovCi0JaW50IHJlc3VsdDsKLQotCXJlc3VsdCA9IGN0eC0+cmVzb3VyY2UtPmNvbGxlY3Rpb24KLQkgICAgPyBybWRpcihpbmZvLT5wYXRobmFtZSkKLQkgICAgOiByZW1vdmUoaW5mby0+cGF0aG5hbWUpOwotCi0JLyoKLSAgICAgICAgKiogSWYgYW4gZXJyb3Igb2NjdXJyZWQsIHRoZW4gYWRkIGl0IHRvIG11bHRpc3RhdHVzIHJlc3BvbnNlLgotICAgICAgICAqKiBOb3RlIHRoYXQgd2UgYWRkIGl0IGZvciB0aGUgcm9vdCByZXNvdXJjZSwgdG9vLiBJdCBpcyBxdWl0ZQotICAgICAgICAqKiBwb3NzaWJsZSB0byBkZWxldGUgdGhlIHdob2xlIGRhcm4gdHJlZSwgeWV0IGZhaWwgb24gdGhlIHJvb3QuCi0gICAgICAgICoqCi0gICAgICAgICoqIChhbHNvOiByZW1lbWJlciB3ZSBhcmUgZGVsZXRpbmcgdmlhIGEgcG9zdGZpeCB0cmF2ZXJzYWwpCi0gICAgICAgICovCi0JaWYgKHJlc3VsdCAhPSAwKSB7Ci0gICAgICAgICAgICAvKiAjIyMgYXNzdW1lIHRoZXJlIGlzIGEgcGVybWlzc2lvbnMgcHJvYmxlbSAqLwotCi0gICAgICAgICAgICAvKiAjIyMgdXNlIGVycm5vIHRvIGdlbmVyYXRlIERBVjpyZXNwb25zZWRlc2NyaXB0aW9uPyAqLwotICAgICAgICAgICAgZGF2X2FkZF9yZXNwb25zZShjdHgsIGN0eC0+cmVzb3VyY2UtPnVyaSwgSFRUUF9GT1JCSURERU4sIE5VTEwpOwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGRhdl9lcnJvciAqIGRhdl9mc19yZW1vdmVfcmVzb3VyY2UoZGF2X3Jlc291cmNlICpyZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdl9yZXNwb25zZSAqKnJlc3BvbnNlKQotewotICAgIGRhdl9yZXNvdXJjZV9wcml2YXRlICppbmZvID0gcmVzb3VyY2UtPmluZm87Ci0KLSAgICAqcmVzcG9uc2UgPSBOVUxMOwotCi0gICAgLyogaWYgYSBjb2xsZWN0aW9uLCByZWN1cnNpdmVseSByZW1vdmUgaXQgYW5kIGl0cyBjaGlsZHJlbiwKLSAgICAgKiBpbmNsdWRpbmcgdGhlIHN0YXRlIGRpcnMKLSAgICAgKi8KLSAgICBpZiAocmVzb3VyY2UtPmNvbGxlY3Rpb24pIHsKLQlkYXZfd2Fsa2VyX2N0eCBjdHggPSB7IDAgfTsKLQlkYXZfZXJyb3IgKmVyciA9IE5VTEw7Ci0KLQljdHgud2Fsa190eXBlID0gREFWX1dBTEtUWVBFX0FMTCB8IERBVl9XQUxLVFlQRV9ISURERU47Ci0JY3R4LnBvc3RmaXggPSAxOwotCWN0eC5mdW5jID0gZGF2X2ZzX2RlbGV0ZV93YWxrZXI7Ci0JY3R4LnBvb2wgPSBpbmZvLT5wb29sOwotCWN0eC5yZXNvdXJjZSA9IHJlc291cmNlOwotCi0JZGF2X2J1ZmZlcl9pbml0KGluZm8tPnBvb2wsICZjdHgudXJpLCByZXNvdXJjZS0+dXJpKTsKLQotCWlmICgoZXJyID0gZGF2X2ZzX3dhbGsoJmN0eCwgREFWX0lORklOSVRZKSkgIT0gTlVMTCkgewotICAgICAgICAgICAgLyogb24gYSAicmVhbCIgZXJyb3IsIHRoZW4ganVzdCBwdW50LiBub3RoaW5nIGVsc2UgdG8gZG8uICovCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCgqcmVzcG9uc2UgPSBjdHgucmVzcG9uc2UpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIC8qIHNvbWUgbXVsdGlzdGF0dXMgcmVzcG9uc2VzIGV4aXN0LiB3cmFwIHRoZW0gaW4gYSAyMDcgKi8KLSAgICAgICAgICAgIHJldHVybiBkYXZfbmV3X2Vycm9yKGluZm8tPnBvb2wsIEhUVFBfTVVMVElfU1RBVFVTLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yKHMpIG9jY3VycmVkIG9uIHNvbWUgcmVzb3VyY2VzIGR1cmluZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGRlbGV0aW9uIHByb2Nlc3MuIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBubyBlcnJvcnMuLi4gdXBkYXRlIHJlc291cmNlIHN0YXRlICovCi0gICAgICAgIHJlc291cmNlLT5leGlzdHMgPSAwOwotICAgICAgICByZXNvdXJjZS0+Y29sbGVjdGlvbiA9IDA7Ci0KLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBub3QgYSBjb2xsZWN0aW9uOyByZW1vdmUgdGhlIGZpbGUgYW5kIGl0cyBwcm9wZXJ0aWVzICovCi0gICAgaWYgKHJlbW92ZShpbmZvLT5wYXRobmFtZSkgIT0gMCkgewotCS8qICMjIyBwdXQgYSBkZXNjcmlwdGlvbiBpbiBoZXJlICovCi0JcmV0dXJuIGRhdl9uZXdfZXJyb3IoaW5mby0+cG9vbCwgSFRUUF9GT1JCSURERU4sIDAsIE5VTEwpOwotICAgIH0KLQotICAgIC8qIHVwZGF0ZSByZXNvdXJjZSBzdGF0ZSAqLwotICAgIHJlc291cmNlLT5leGlzdHMgPSAwOwotICAgIHJlc291cmNlLT5jb2xsZWN0aW9uID0gMDsKLQotICAgIC8qIHJlbW92ZSBwcm9wZXJ0aWVzIGFuZCByZXR1cm4gaXRzIHJlc3VsdCAqLwotICAgIHJldHVybiBkYXZfZnNfZGVsZXRlc2V0KGluZm8tPnBvb2wsIHJlc291cmNlKTsKLX0KLQotLyogIyMjIG1vdmUgdGhpcyB0byBkYXZfdXRpbD8gKi8KLS8qIFdhbGsgcmVjdXJzaXZlbHkgZG93biB0aHJvdWdoIGRpcmVjdG9yaWVzLCAqCi0gKiBpbmNsdWRpbmcgbG9jay1udWxsIHJlc291cmNlcyBhcyB3ZSBnby4gICAgKi8KLWRhdl9lcnJvciAqIGRhdl9mc193YWxrZXIoZGF2X2ZzX3dhbGtlcl9jb250ZXh0ICpmc2N0eCwgaW50IGRlcHRoKQotewotICAgIGRhdl9lcnJvciAqZXJyID0gTlVMTDsKLSAgICBkYXZfd2Fsa2VyX2N0eCAqd2N0eCA9IGZzY3R4LT53Y3R4OwotICAgIGludCBpc2RpciA9IHdjdHgtPnJlc291cmNlLT5jb2xsZWN0aW9uOwotICAgIERJUiAqZGlycDsKLSAgICBzdHJ1Y3QgZGlyZW50ICplcDsKLQotICAgIC8qIGVuc3VyZSB0aGUgY29udGV4dCBpcyBwcmVwYXJlZCBwcm9wZXJseSwgdGhlbiBjYWxsIHRoZSBmdW5jICovCi0gICAgZXJyID0gKCp3Y3R4LT5mdW5jKSh3Y3R4LAotCQkJaXNkaXIKLQkJCT8gREFWX0NBTExUWVBFX0NPTExFQ1RJT04KLQkJCTogREFWX0NBTExUWVBFX01FTUJFUik7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0JcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoZGVwdGggPT0gMCB8fCAhaXNkaXIpIHsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBwdXQgYSB0cmFpbGluZyBzbGFzaCBvbnRvIHRoZSBkaXJlY3RvcnksIGluIHByZXBhcmF0aW9uIGZvciBhcHBlbmRpbmcKLSAgICAgKiBmaWxlcyB0byBpdCBhcyB3ZSBkaXNjb3ZlcnkgdGhlbSB3aXRoaW4gdGhlIGRpcmVjdG9yeSAqLwotICAgIGRhdl9jaGVja19idWZzaXplKHdjdHgtPnBvb2wsICZmc2N0eC0+cGF0aDEsIERBVl9CVUZGRVJfUEFEKTsKLSAgICBmc2N0eC0+cGF0aDEuYnVmW2ZzY3R4LT5wYXRoMS5jdXJfbGVuKytdID0gJy8nOwotICAgIGZzY3R4LT5wYXRoMS5idWZbZnNjdHgtPnBhdGgxLmN1cl9sZW5dID0gJ1wwJzsJLyogaW4gcGFkIGFyZWEgKi8KLQotICAgIC8qIGlmIGEgc2Vjb25kYXJ5IHBhdGggaXMgcHJlc2VudCwgdGhlbiBkbyB0aGF0LCB0b28gKi8KLSAgICBpZiAoZnNjdHgtPnBhdGgyLmJ1ZiAhPSBOVUxMKSB7Ci0JZGF2X2NoZWNrX2J1ZnNpemUod2N0eC0+cG9vbCwgJmZzY3R4LT5wYXRoMiwgREFWX0JVRkZFUl9QQUQpOwotCWZzY3R4LT5wYXRoMi5idWZbZnNjdHgtPnBhdGgyLmN1cl9sZW4rK10gPSAnLyc7Ci0JZnNjdHgtPnBhdGgyLmJ1Zltmc2N0eC0+cGF0aDIuY3VyX2xlbl0gPSAnXDAnOwkvKiBpbiBwYWQgYXJlYSAqLwotICAgIH0KLQotICAgIC8qIE5vdGU6IHRoZSBVUkkgc2hvdWxkIEFMUkVBRFkgaGF2ZSBhIHRyYWlsaW5nICIvIiAqLwotCi0gICAgLyogZm9yIHRoaXMgZmlyc3QgcGFzcyBvZiBmaWxlcywgYWxsIHJlc291cmNlcyBleGlzdCAqLwotICAgIGZzY3R4LT5yZXMxLmV4aXN0cyA9IDE7Ci0KLSAgICAvKiBhIGZpbGUgaXMgdGhlIGRlZmF1bHQ7IHdlJ2xsIGFkanVzdCBpZiB3ZSBoaXQgYSBkaXJlY3RvcnkgKi8KLSAgICBmc2N0eC0+cmVzMS5jb2xsZWN0aW9uID0gMDsKLSAgICBmc2N0eC0+cmVzMi5jb2xsZWN0aW9uID0gMDsKLQotICAgIC8qIG9wZW4gYW5kIHNjYW4gdGhlIGRpcmVjdG9yeSAqLwotICAgIGlmICgoZGlycCA9IG9wZW5kaXIoZnNjdHgtPnBhdGgxLmJ1ZikpID09IE5VTEwpIHsKLQkvKiAjIyMgbmVlZCBhIGJldHRlciBlcnJvciAqLwotCXJldHVybiBkYXZfbmV3X2Vycm9yKHdjdHgtPnBvb2wsIEhUVFBfTk9UX0ZPVU5ELCAwLCBOVUxMKTsKLSAgICB9Ci0gICAgd2hpbGUgKChlcCA9IHJlYWRkaXIoZGlycCkpICE9IE5VTEwpIHsKLQlzaXplX3QgbGVuID0gc3RybGVuKGVwLT5kX25hbWUpOwotCi0JLyogYXZvaWQgcmVjdXJzaW5nIGludG8gb3VyIGN1cnJlbnQsIHBhcmVudCwgb3Igc3RhdGUgZGlyZWN0b3JpZXMgKi8KLQlpZiAoZXAtPmRfbmFtZVswXSA9PSAnLicKLQkgICAgJiYgKGxlbiA9PSAxIHx8IChlcC0+ZF9uYW1lWzFdID09ICcuJyAmJiBsZW4gPT0gMikpKSB7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotCWlmICh3Y3R4LT53YWxrX3R5cGUgJiBEQVZfV0FMS1RZUEVfQVVUSCkgewotCSAgICAvKiAjIyMgbmVlZCB0byBhdXRob3JpemUgZWFjaCBmaWxlICovCi0JICAgIC8qICMjIyBleGFtcGxlOiAuaHRhY2Nlc3MgaXMgbm9ybWFsbHkgY29uZmlndXJlZCB0byBmYWlsIGF1dGggKi8KLQotCSAgICAvKiBzdHVmZiBpbiB0aGUgc3RhdGUgZGlyZWN0b3J5IGlzIG5ldmVyIGF1dGhvcml6ZWQhICovCi0JICAgIGlmICghc3RyY21wKGVwLT5kX25hbWUsIERBVl9GU19TVEFURV9ESVIpKSB7Ci0JCWNvbnRpbnVlOwotCSAgICB9Ci0JfQotCS8qIHNraXAgdGhlIHN0YXRlIGRpciB1bmxlc3MgYSBISURERU4gaXMgcGVyZm9ybWVkICovCi0JaWYgKCEod2N0eC0+d2Fsa190eXBlICYgREFWX1dBTEtUWVBFX0hJRERFTikKLQkgICAgJiYgIXN0cmNtcChlcC0+ZF9uYW1lLCBEQVZfRlNfU1RBVEVfRElSKSkgewotCSAgICBjb250aW51ZTsKLQl9Ci0KLQkvKiBhcHBlbmQgdGhpcyBmaWxlIG9udG8gdGhlIHBhdGggYnVmZmVyIChjb3B5IG51bGwgdGVybSkgKi8KLQlkYXZfYnVmZmVyX3BsYWNlX21lbSh3Y3R4LT5wb29sLAotCQkJICAgICAmZnNjdHgtPnBhdGgxLCBlcC0+ZF9uYW1lLCBsZW4gKyAxLCAwKTsKLQotCWlmIChsc3RhdChmc2N0eC0+cGF0aDEuYnVmLCAmZnNjdHgtPmluZm8xLmZpbmZvKSAhPSAwKSB7Ci0JICAgIC8qIHdvYWghIHdoZXJlJ2QgaXQgZ28/ICovCi0JICAgIC8qICMjIyBzaG91bGQgaGF2ZSBhIGJldHRlciBlcnJvciBoZXJlICovCi0JICAgIGVyciA9IGRhdl9uZXdfZXJyb3Iod2N0eC0+cG9vbCwgSFRUUF9OT1RfRk9VTkQsIDAsIE5VTEwpOwotCSAgICBicmVhazsKLQl9Ci0KLQkvKiBjb3B5IHRoZSBmaWxlIHRvIHRoZSBVUkksIHRvby4gTk9URTogd2Ugd2lsbCBwYWQgYW4gZXh0cmEgYnl0ZQotCSAgIGZvciB0aGUgdHJhaWxpbmcgc2xhc2ggbGF0ZXIuICovCi0JZGF2X2J1ZmZlcl9wbGFjZV9tZW0od2N0eC0+cG9vbCwgJndjdHgtPnVyaSwgZXAtPmRfbmFtZSwgbGVuICsgMSwgMSk7Ci0KLQkvKiBpZiB0aGVyZSBpcyBhIHNlY29uZGFyeSBwYXRoLCB0aGVuIGRvIHRoYXQsIHRvbyAqLwotCWlmIChmc2N0eC0+cGF0aDIuYnVmICE9IE5VTEwpIHsKLQkgICAgZGF2X2J1ZmZlcl9wbGFjZV9tZW0od2N0eC0+cG9vbCwgJmZzY3R4LT5wYXRoMiwKLQkJCQkgZXAtPmRfbmFtZSwgbGVuICsgMSwgMCk7Ci0JfQotCi0JLyogc2V0IHVwIHRoZSAoaW50ZXJuYWwpIHBhdGhuYW1lcyBmb3IgdGhlIHR3byByZXNvdXJjZXMgKi8KLQlmc2N0eC0+aW5mbzEucGF0aG5hbWUgPSBmc2N0eC0+cGF0aDEuYnVmOwotCWZzY3R4LT5pbmZvMi5wYXRobmFtZSA9IGZzY3R4LT5wYXRoMi5idWY7Ci0KLQkvKiBzZXQgdXAgdGhlIFVSSSBmb3IgdGhlIGN1cnJlbnQgcmVzb3VyY2UgKi8KLQlmc2N0eC0+cmVzMS51cmkgPSB3Y3R4LT51cmkuYnVmOwotCi0JLyogIyMjIGZvciBub3csIG9ubHkgcHJvY2VzcyByZWd1bGFyIGZpbGVzIChlLmcuIHNraXAgc3ltbGlua3MpICovCi0JaWYgKFNfSVNSRUcoZnNjdHgtPmluZm8xLmZpbmZvLnN0X21vZGUpKSB7Ci0JICAgIC8qIGNhbGwgdGhlIGZ1bmN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGRpciArIGZpbGUgKi8KLQkgICAgaWYgKChlcnIgPSAoKndjdHgtPmZ1bmMpKHdjdHgsIERBVl9DQUxMVFlQRV9NRU1CRVIpKSAhPSBOVUxMKSB7Ci0JCS8qICMjIyBtYXliZSBhZGQgYSBoaWdoZXItbGV2ZWwgZGVzY3JpcHRpb24/ICovCi0JCWJyZWFrOwotCSAgICB9Ci0JfQotCWVsc2UgaWYgKFNfSVNESVIoZnNjdHgtPmluZm8xLmZpbmZvLnN0X21vZGUpKSB7Ci0JICAgIHNpemVfdCBzYXZlX3BhdGhfbGVuID0gZnNjdHgtPnBhdGgxLmN1cl9sZW47Ci0JICAgIHNpemVfdCBzYXZlX3VyaV9sZW4gPSB3Y3R4LT51cmkuY3VyX2xlbjsKLQkgICAgc2l6ZV90IHNhdmVfcGF0aDJfbGVuID0gZnNjdHgtPnBhdGgyLmN1cl9sZW47Ci0KLQkgICAgLyogYWRqdXN0IGxlbmd0aCB0byBpbmNvcnBvcmF0ZSB0aGUgc3ViZGlyIG5hbWUgKi8KLQkgICAgZnNjdHgtPnBhdGgxLmN1cl9sZW4gKz0gbGVuOwotCSAgICBmc2N0eC0+cGF0aDIuY3VyX2xlbiArPSBsZW47Ci0KLQkgICAgLyogYWRqdXN0IFVSSSBsZW5ndGggdG8gaW5jb3Jwb3JhdGUgc3ViZGlyIGFuZCBhIHNsYXNoICovCi0JICAgIHdjdHgtPnVyaS5jdXJfbGVuICs9IGxlbiArIDE7Ci0JICAgIHdjdHgtPnVyaS5idWZbd2N0eC0+dXJpLmN1cl9sZW4gLSAxXSA9ICcvJzsKLQkgICAgd2N0eC0+dXJpLmJ1Zlt3Y3R4LT51cmkuY3VyX2xlbl0gPSAnXDAnOwotCi0JICAgIC8qIHN3aXRjaCBvdmVyIHRvIGEgY29sbGVjdGlvbiAqLwotCSAgICBmc2N0eC0+cmVzMS5jb2xsZWN0aW9uID0gMTsKLQkgICAgZnNjdHgtPnJlczIuY29sbGVjdGlvbiA9IDE7Ci0KLQkgICAgLyogcmVjdXJzZSBvbiB0aGUgc3ViZGlyICovCi0JICAgIC8qICMjIyBkb24ndCBhbHdheXMgd2FudCB0byBxdWl0IG9uIGVycm9yIGZyb20gc2luZ2xlIGNoaWxkICovCi0JICAgIGlmICgoZXJyID0gZGF2X2ZzX3dhbGtlcihmc2N0eCwgZGVwdGggLSAxKSkgIT0gTlVMTCkgewotCQkvKiAjIyMgbWF5YmUgYWRkIGEgaGlnaGVyLWxldmVsIGRlc2NyaXB0aW9uPyAqLwotCQlicmVhazsKLQkgICAgfQotCi0JICAgIC8qIHB1dCB0aGUgdmFyaW91cyBpbmZvcm1hdGlvbiBiYWNrICovCi0JICAgIGZzY3R4LT5wYXRoMS5jdXJfbGVuID0gc2F2ZV9wYXRoX2xlbjsKLQkgICAgZnNjdHgtPnBhdGgyLmN1cl9sZW4gPSBzYXZlX3BhdGgyX2xlbjsKLQkgICAgd2N0eC0+dXJpLmN1cl9sZW4gPSBzYXZlX3VyaV9sZW47Ci0KLQkgICAgZnNjdHgtPnJlczEuY29sbGVjdGlvbiA9IDA7Ci0JICAgIGZzY3R4LT5yZXMyLmNvbGxlY3Rpb24gPSAwOwotCi0JICAgIC8qIGFzc2VydDogcmVzMS5leGlzdHMgPT0gMSAqLwotCX0KLSAgICB9Ci0KLSAgICAvKiAjIyMgY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzPyAqLwotICAgIGNsb3NlZGlyKGRpcnApOwotCi0gICAgaWYgKGVyciAhPSBOVUxMKQotCXJldHVybiBlcnI7Ci0KLSAgICBpZiAod2N0eC0+d2Fsa190eXBlICYgREFWX1dBTEtUWVBFX0xPQ0tOVUxMKSB7Ci0Jc2l6ZV90IG9mZnNldCA9IDA7Ci0KLQkvKiBudWxsIHRlcm1pbmF0ZSB0aGUgZGlyZWN0b3J5IG5hbWUgKi8KLQlmc2N0eC0+cGF0aDEuYnVmW2ZzY3R4LT5wYXRoMS5jdXJfbGVuIC0gMV0gPSAnXDAnOwotCi0JLyogSW5jbHVkZSBhbnkgbG9jayBudWxsIHJlc291cmNlcyBmb3VuZCBpbiB0aGlzIGNvbGxlY3Rpb24gKi8KLQlmc2N0eC0+cmVzMS5jb2xsZWN0aW9uID0gMTsKLQlpZiAoKGVyciA9IGRhdl9mc19nZXRfbG9ja251bGxfbWVtYmVycygmZnNjdHgtPnJlczEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmc2N0eC0+bG9ja251bGxfYnVmKSkgIT0gTlVMTCkgewotICAgICAgICAgICAgLyogIyMjIG1heWJlIGFkZCBhIGhpZ2hlci1sZXZlbCBkZXNjcmlwdGlvbj8gKi8KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0JfQotCi0JLyogcHV0IGEgc2xhc2ggYmFjayBvbiB0aGUgZW5kIG9mIHRoZSBkaXJlY3RvcnkgKi8KLQlmc2N0eC0+cGF0aDEuYnVmW2ZzY3R4LT5wYXRoMS5jdXJfbGVuIC0gMV0gPSAnLyc7Ci0KLQkvKiB0aGVzZSBhcmUgYWxsIG5vbi1leGlzdGFudCAoZmlsZXMpICovCi0JZnNjdHgtPnJlczEuZXhpc3RzID0gMDsKLQlmc2N0eC0+cmVzMS5jb2xsZWN0aW9uID0gMDsKLQltZW1zZXQoJmZzY3R4LT5pbmZvMS5maW5mbywgMCwgc2l6ZW9mKGZzY3R4LT5pbmZvMS5maW5mbykpOwotCi0Jd2hpbGUgKG9mZnNldCA8IGZzY3R4LT5sb2NrbnVsbF9idWYuY3VyX2xlbikgewotCSAgICBzaXplX3QgbGVuID0gc3RybGVuKGZzY3R4LT5sb2NrbnVsbF9idWYuYnVmICsgb2Zmc2V0KTsKLQkgICAgZGF2X2xvY2sgKmxvY2tzID0gTlVMTDsKLQotCSAgICAvKgotCSAgICAqKiBBcHBlbmQgdGhlIGxvY2tudWxsIGZpbGUgdG8gdGhlIHBhdGhzIGFuZCB0aGUgVVJJLiBOb3RlIHRoYXQKLQkgICAgKiogd2UgZG9uJ3QgaGF2ZSB0byBwYWQgdGhlIFVSSSBmb3IgYSBzbGFzaCBzaW5jZSBhIGxvY2tudWxsCi0JICAgICoqIHJlc291cmNlIGlzIG5vdCBhIGNvbGxlY3Rpb24uCi0JICAgICovCi0JICAgIGRhdl9idWZmZXJfcGxhY2VfbWVtKHdjdHgtPnBvb2wsICZmc2N0eC0+cGF0aDEsCi0JCQkJIGZzY3R4LT5sb2NrbnVsbF9idWYuYnVmICsgb2Zmc2V0LCBsZW4gKyAxLCAwKTsKLQkgICAgZGF2X2J1ZmZlcl9wbGFjZV9tZW0od2N0eC0+cG9vbCwgJndjdHgtPnVyaSwKLQkJCQkgZnNjdHgtPmxvY2tudWxsX2J1Zi5idWYgKyBvZmZzZXQsIGxlbiArIDEsIDApOwotCSAgICBpZiAoZnNjdHgtPnBhdGgyLmJ1ZiAhPSBOVUxMKSB7Ci0JCWRhdl9idWZmZXJfcGxhY2VfbWVtKHdjdHgtPnBvb2wsICZmc2N0eC0+cGF0aDIsCi0JCQkJICAgICBmc2N0eC0+bG9ja251bGxfYnVmLmJ1ZiArIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gKyAxLCAwKTsKLQkgICAgfQotCi0JICAgIC8qIHNldCB1cCB0aGUgKGludGVybmFsKSBwYXRobmFtZXMgZm9yIHRoZSB0d28gcmVzb3VyY2VzICovCi0JICAgIGZzY3R4LT5pbmZvMS5wYXRobmFtZSA9IGZzY3R4LT5wYXRoMS5idWY7Ci0JICAgIGZzY3R4LT5pbmZvMi5wYXRobmFtZSA9IGZzY3R4LT5wYXRoMi5idWY7Ci0KLQkgICAgLyogc2V0IHVwIHRoZSBVUkkgZm9yIHRoZSBjdXJyZW50IHJlc291cmNlICovCi0JICAgIGZzY3R4LT5yZXMxLnVyaSA9IHdjdHgtPnVyaS5idWY7Ci0KLQkgICAgLyoKLQkgICAgKiogVG8gcHJldmVudCBhIFBST1BGSU5EIHNob3dpbmcgYW4gZXhwaXJlZCBsb2NrbnVsbAotCSAgICAqKiByZXNvdXJjZSwgcXVlcnkgdGhlIGxvY2sgZGF0YWJhc2UgdG8gZm9yY2UgcmVtb3ZhbAotCSAgICAqKiBvZiBib3RoIHRoZSBsb2NrIGVudHJ5IGFuZCAubG9ja251bGwsIGlmIG5lY2Vzc2FyeS4uCi0JICAgICoqIFN1cmUsIHRoZSBxdWVyeSBpbiBQUk9QRklORCB3b3VsZCBkbyB0aGlzLi4gYWZ0ZXIKLQkgICAgKiogdGhlIGxvY2tudWxsIHJlc291cmNlIHdhcyBhbHJlYWR5IGluY2x1ZGVkIGluIHRoZSAKLQkgICAgKiogcmV0dXJuLgotCSAgICAqKgotCSAgICAqKiBOT1RFOiB3ZSBhc3N1bWUgdGhlIGNhbGxlciBoYXMgb3BlbmVkIHRoZSBsb2NrIGRhdGFiYXNlCi0JICAgICoqICAgICAgIGlmIHRoZXkgaGF2ZSBwcm92aWRlZCBEQVZfV0FMS1RZUEVfTE9DS05VTEwuCi0JICAgICovCi0JICAgIC8qICMjIyB3ZSBzaG91bGQgYWxzbyBsb29rIGludG8gb3BlbmluZyBpdCByZWFkLW9ubHkgYW5kCi0JICAgICAgICMjIyBlbGlkaW5nIHRpbWVkLW91dCBpdGVtcyBmcm9tIHRoZSB3YWxrLCB5ZXQgbGVhdmluZwotCSAgICAgICAjIyMgdGhlbSBpbiB0aGUgbG9ja251bGwgZGF0YWJhc2UgdW50aWwgc29tZWJvZHkgb3BlbnMKLQkgICAgICAgIyMjIHRoZSB0aGluZyB3cml0YWJsZS4KLQkgICAgICAgKi8KLQkgICAgLyogIyMjIHByb2JhYmx5IG91Z2h0IHRvIHVzZSBoYXNfbG9ja3MuIG5vdGUgdGhlIHByb2JsZW0KLQkgICAgICAgIyMjIG1lbnRpb25lZCBhYm92ZSwgdGhvdWdoLi4uIHdlIHdvdWxkIHRyYXZlcnNlIHRoaXMgYXMKLQkgICAgICAgIyMjIGEgbG9ja251bGwsIGJ1dCB0aGVuIGEgUFJPUEZJTkQgd291bGQgbG9hZCB0aGUgbG9jawotCSAgICAgICAjIyMgaW5mbywgY2F1c2luZyBhIHRpbWVvdXQgYW5kIHRoZSBsb2NrcyB3b3VsZCBub3QgYmUKLQkgICAgICAgIyMjIHJlcG9ydGVkLiBUaGVyZWZvcmUsIGEgbnVsbCByZXNvdXJjZSB3b3VsZCBiZSByZXR1cm5lZAotCSAgICAgICAjIyMgaW4gdGhlIFBST1BGSU5ELgotCSAgICAgICAjIyMKLQkgICAgICAgIyMjIGFsdGVybmF0aXZlOiBqdXN0IGxvYWQgdW5yZXNvbHZlZCBsb2Nrcy4gYW55IGRpcmVjdAotCSAgICAgICAjIyMgbG9ja3Mgd2lsbCBiZSB0aW1lZCBvdXQgKGNvcnJlY3QpLiBhbnkgaW5kaXJlY3Qgd2lsbAotCSAgICAgICAjIyMgbm90IChjb3JyZWN0OyBjb25zaWRlciBpZiBhIHBhcmVudCB0aW1lZCBvdXQgLS0gdGhlCi0JICAgICAgICMjIyB0aW1lb3V0IHJvdXRpbmVzIGRvIG5vdCB3YWxrIGFuZCByZW1vdmUgaW5kaXJlY3RzOwotCSAgICAgICAjIyMgZXZlbiB0aGUgcmVzb2x2ZSBmdW5jIHdvdWxkIHByb2JhYmx5IGZhaWwgd2hlbiBpdAotCSAgICAgICAjIyMgdHJpZWQgdG8gZmluZCBhIHRpbWVkLW91dCBkaXJlY3QgbG9jaykuCi0JICAgICovCi0JICAgIGlmICgoZXJyID0gZGF2X2xvY2tfcXVlcnkod2N0eC0+bG9ja2RiLCB3Y3R4LT5yZXNvdXJjZSwgJmxvY2tzKSkgIT0gTlVMTCkgewotCQkvKiAjIyMgbWF5YmUgYWRkIGEgaGlnaGVyLWxldmVsIGRlc2NyaXB0aW9uPyAqLwotCQlyZXR1cm4gZXJyOwotCSAgICB9Ci0KLQkgICAgLyogY2FsbCB0aGUgZnVuY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgZGlyICsgZmlsZSAqLwotCSAgICBpZiAobG9ja3MgIT0gTlVMTCAmJgotCQkoZXJyID0gKCp3Y3R4LT5mdW5jKSh3Y3R4LCBEQVZfQ0FMTFRZUEVfTE9DS05VTEwpKSAhPSBOVUxMKSB7Ci0JCS8qICMjIyBtYXliZSBhZGQgYSBoaWdoZXItbGV2ZWwgZGVzY3JpcHRpb24/ICovCi0JCXJldHVybiBlcnI7Ci0JICAgIH0KLQotCSAgICBvZmZzZXQgKz0gbGVuICsgMTsKLQl9Ci0KLQkvKiByZXNldCB0aGUgZXhpc3RzIGZsYWcgKi8KLQlmc2N0eC0+cmVzMS5leGlzdHMgPSAxOwotICAgIH0KLQotICAgIGlmICh3Y3R4LT5wb3N0Zml4KSB7Ci0JLyogcmVwbGFjZSB0aGUgZGlycycgdHJhaWxpbmcgc2xhc2hlcyB3aXRoIG51bGwgdGVybXMgKi8KLQlmc2N0eC0+cGF0aDEuYnVmWy0tZnNjdHgtPnBhdGgxLmN1cl9sZW5dID0gJ1wwJzsKLQl3Y3R4LT51cmkuYnVmWy0td2N0eC0+dXJpLmN1cl9sZW5dID0gJ1wwJzsKLQlpZiAoZnNjdHgtPnBhdGgyLmJ1ZiAhPSBOVUxMKSB7Ci0JICAgIGZzY3R4LT5wYXRoMi5idWZbLS1mc2N0eC0+cGF0aDIuY3VyX2xlbl0gPSAnXDAnOwotCX0KLQotCS8qIHRoaXMgaXMgYSBjb2xsZWN0aW9uIHdoaWNoIGV4aXN0cyAqLwotCWZzY3R4LT5yZXMxLmNvbGxlY3Rpb24gPSAxOwotCi0JcmV0dXJuICgqd2N0eC0+ZnVuYykod2N0eCwgREFWX0NBTExUWVBFX1BPU1RGSVgpOwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgZGF2X2Vycm9yICogZGF2X2ZzX3dhbGsoZGF2X3dhbGtlcl9jdHggKndjdHgsIGludCBkZXB0aCkKLXsKLSAgICBkYXZfZnNfd2Fsa2VyX2NvbnRleHQgZnNjdHggPSB7IDAgfTsKLQotI2lmIERBVl9ERUJVRwotICAgIGlmICgod2N0eC0+d2Fsa190eXBlICYgREFWX1dBTEtUWVBFX0xPQ0tOVUxMKSAhPSAwCi0JJiYgd2N0eC0+bG9ja2RiID09IE5VTEwpIHsKLQlyZXR1cm4gZGF2X25ld19lcnJvcih3Y3R4LT5wb29sLCBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgMCwKLQkJCSAgICAgIkRFU0lHTiBFUlJPUjogd2Fsa2VyIGNhbGxlZCB0byB3YWxrIGxvY2tudWxsICIKLQkJCSAgICAgInJlc291cmNlcywgYnV0IGEgbG9ja2RiIHdhcyBub3QgcHJvdmlkZWQuIik7Ci0gICAgfQotCi0gICAgLyogIyMjIGFuIGFzc2VydGlvbiB0aGF0IHdlIGhhdmUgc3BhY2UgZm9yIGEgdHJhaWxpbmcgc2xhc2ggKi8KLSAgICBpZiAod2N0eC0+dXJpLmN1cl9sZW4gKyAxID4gd2N0eC0+dXJpLmFsbG9jX2xlbikgewotCXJldHVybiBkYXZfbmV3X2Vycm9yKHdjdHgtPnBvb2wsIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCAwLAotCQkJICAgICAiREVTSUdOIEVSUk9SOiB3YWxrZXIgc2hvdWxkIGhhdmUgYmVlbiBjYWxsZWQgIgotCQkJICAgICAid2l0aCBwYWRkaW5nIGluIHRoZSBVUkkgYnVmZmVyLiIpOwotICAgIH0KLSNlbmRpZgotCi0gICAgZnNjdHgud2N0eCA9IHdjdHg7Ci0KLSAgICB3Y3R4LT5yb290ID0gd2N0eC0+cmVzb3VyY2U7Ci0KLSAgICAvKiAjIyMgemVybyBvdXQgdmVyc2lvbmVkLCB3b3JraW5nLCBiYXNlbGluZWQ/ICovCi0KLSAgICBmc2N0eC5yZXMxID0gKndjdHgtPnJlc291cmNlOwotCi0gICAgZnNjdHgucmVzMS5pbmZvID0gJmZzY3R4LmluZm8xOwotICAgIGZzY3R4LmluZm8xID0gKndjdHgtPnJlc291cmNlLT5pbmZvOwotCi0gICAgZGF2X2J1ZmZlcl9pbml0KHdjdHgtPnBvb2wsICZmc2N0eC5wYXRoMSwgZnNjdHguaW5mbzEucGF0aG5hbWUpOwotICAgIGZzY3R4LmluZm8xLnBhdGhuYW1lID0gZnNjdHgucGF0aDEuYnVmOwotCi0gICAgaWYgKHdjdHgtPnJlczIgIT0gTlVMTCkgewotCWZzY3R4LnJlczIgPSAqd2N0eC0+cmVzMjsKLQlmc2N0eC5yZXMyLmV4aXN0cyA9IDA7Ci0JZnNjdHgucmVzMi5jb2xsZWN0aW9uID0gMDsKLQotCWZzY3R4LnJlczIuaW5mbyA9ICZmc2N0eC5pbmZvMjsKLQlmc2N0eC5pbmZvMiA9ICp3Y3R4LT5yZXMyLT5pbmZvOwotCi0JLyogcmVzMiBkb2VzIG5vdCBleGlzdCAtLSBjbGVhciBpdHMgZmluZm8gc3RydWN0dXJlICovCi0JbWVtc2V0KCZmc2N0eC5pbmZvMi5maW5mbywgMCwgc2l6ZW9mKGZzY3R4LmluZm8yLmZpbmZvKSk7Ci0KLQlkYXZfYnVmZmVyX2luaXQod2N0eC0+cG9vbCwgJmZzY3R4LnBhdGgyLCBmc2N0eC5pbmZvMi5wYXRobmFtZSk7Ci0JZnNjdHguaW5mbzIucGF0aG5hbWUgPSBmc2N0eC5wYXRoMi5idWY7Ci0gICAgfQotCi0gICAgLyogaWYgd2UgaGF2ZSBhIGRpcmVjdG9yeSwgdGhlbiBlbnN1cmUgdGhlIFVSSSBoYXMgYSB0cmFpbGluZyAiLyIgKi8KLSAgICBpZiAoZnNjdHgucmVzMS5jb2xsZWN0aW9uCi0JJiYgd2N0eC0+dXJpLmJ1Zlt3Y3R4LT51cmkuY3VyX2xlbiAtIDFdICE9ICcvJykgewotCi0JLyogdGhpcyB3aWxsIGZhbGwgaW50byB0aGUgcGFkIGFyZWEgKi8KLQl3Y3R4LT51cmkuYnVmW3djdHgtPnVyaS5jdXJfbGVuKytdID0gJy8nOwotCXdjdHgtPnVyaS5idWZbd2N0eC0+dXJpLmN1cl9sZW5dID0gJ1wwJzsKLSAgICB9Ci0KLSAgICAvKgotICAgICoqIFVSSSBpcyB0cmFja2VkIGluIHRoZSB3YWxrZXIgY29udGV4dC4gRW5zdXJlIHRoYXQgcGVvcGxlIGRvIG5vdCB0cnkKLSAgICAqKiB0byBmZXRjaCBpdCBmcm9tIHJlczIuIFdlIHdpbGwgZW5zdXJlIHRoYXQgcmVzMSBhbmQgdXJpIHdpbGwgcmVtYWluCi0gICAgKiogc3luY2hyb25pemVkLgotICAgICovCi0gICAgZnNjdHgucmVzMS51cmkgPSB3Y3R4LT51cmkuYnVmOwotICAgIGZzY3R4LnJlczIudXJpID0gTlVMTDsKLQotICAgIC8qIHVzZSBvdXIgcmVzb3VyY2Ugc3RydWN0dXJlcyAqLwotICAgIHdjdHgtPnJlc291cmNlID0gJmZzY3R4LnJlczE7Ci0gICAgd2N0eC0+cmVzMiA9ICZmc2N0eC5yZXMyOwotCi0gICAgcmV0dXJuIGRhdl9mc193YWxrZXIoJmZzY3R4LCBkZXB0aCk7Ci19Ci0KLS8qIGRhdl9mc19ldGFnOiAgU3RvbGVuIGZyb20gYXBfbWFrZV9ldGFnLiAgQ3JlYXRlcyBhIHN0cm9uZyBldGFnCi0gKiAgICBmb3IgZmlsZSBwYXRoLgotICogIyMjIGRvIHdlIG5lZWQgdG8gcmV0dXJuIHdlYWsgdGFncyBzb21ldGltZXM/Ci0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpkYXZfZnNfZ2V0ZXRhZyhjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlKQotewotICAgIGRhdl9yZXNvdXJjZV9wcml2YXRlICpjdHggPSByZXNvdXJjZS0+aW5mbzsKLQotICAgIGlmICghcmVzb3VyY2UtPmV4aXN0cykgCi0JcmV0dXJuIGFwX3BzdHJkdXAoY3R4LT5wb29sLCAiIik7Ci0KLSAgICBpZiAoY3R4LT5maW5mby5zdF9tb2RlICE9IDApIHsKLSAgICAgICAgcmV0dXJuIGFwX3BzcHJpbnRmKGN0eC0+cG9vbCwgIlwiJWx4LSVseC0lbHhcIiIsCi0JCQkgICAodW5zaWduZWQgbG9uZykgY3R4LT5maW5mby5zdF9pbm8sCi0JCQkgICAodW5zaWduZWQgbG9uZykgY3R4LT5maW5mby5zdF9zaXplLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIGN0eC0+ZmluZm8uc3RfbXRpbWUpOwotICAgIH0KLQotICAgIHJldHVybiBhcF9wc3ByaW50ZihjdHgtPnBvb2wsICJcIiVseFwiIiwgKHVuc2lnbmVkIGxvbmcpIGN0eC0+ZmluZm8uc3RfbXRpbWUpOwotfQotCi1zdGF0aWMgY29uc3QgZGF2X2hvb2tzX3JlcG9zaXRvcnkgZGF2X2hvb2tzX3JlcG9zaXRvcnlfZnMgPQotewotICAgIERFQlVHX0dFVF9IQU5ETEVSLCAgIC8qIG5vcm1hbGx5OiBzcGVjaWFsIEdFVCBoYW5kbGluZyBub3QgcmVxdWlyZWQgKi8KLSAgICBkYXZfZnNfZ2V0X3Jlc291cmNlLAotICAgIGRhdl9mc19nZXRfcGFyZW50X3Jlc291cmNlLAotICAgIGRhdl9mc19pc19zYW1lX3Jlc291cmNlLAotICAgIGRhdl9mc19pc19wYXJlbnRfcmVzb3VyY2UsCi0gICAgZGF2X2ZzX29wZW5fc3RyZWFtLAotICAgIGRhdl9mc19jbG9zZV9zdHJlYW0sCi0gICAgZGF2X2ZzX3JlYWRfc3RyZWFtLAotICAgIGRhdl9mc193cml0ZV9zdHJlYW0sCi0gICAgZGF2X2ZzX3NlZWtfc3RyZWFtLAotICAgIGRhdl9mc19zZXRfaGVhZGVycywKLSNpZiBERUJVR19QQVRITkFNRV9TVFlMRQotICAgIGRhdl9mc19nZXRfcGF0aG5hbWUsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSAgICBkYXZfZnNfZnJlZV9maWxlLAotICAgIGRhdl9mc19jcmVhdGVfY29sbGVjdGlvbiwKLSAgICBkYXZfZnNfY29weV9yZXNvdXJjZSwKLSAgICBkYXZfZnNfbW92ZV9yZXNvdXJjZSwKLSAgICBkYXZfZnNfcmVtb3ZlX3Jlc291cmNlLAotICAgIGRhdl9mc193YWxrLAotICAgIGRhdl9mc19nZXRldGFnLAotfTsKLQotc3RhdGljIGludCBkYXZfZnNfZmluZF9wcm9wKGNvbnN0IGNoYXIgKm5zX3VyaSwgY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBjb25zdCBkYXZfZnNfbGl2ZXByb3BfbmFtZSAqc2NhbjsKLSAgICBpbnQgbnM7Ci0KLSAgICBpZiAoKm5zX3VyaSA9PSAnaCcKLQkmJiBzdHJjbXAobnNfdXJpLCBkYXZfZnNfbmFtZXNwYWNlX3VyaXNbREFWX0ZTX1VSSV9NWVBST1BTXSkgPT0gMCkgewotCW5zID0gREFWX0ZTX1VSSV9NWVBST1BTOwotICAgIH0KLSAgICBlbHNlIGlmICgqbnNfdXJpID09ICdEJyAmJiBzdHJjbXAobnNfdXJpLCAiREFWOiIpID09IDApIHsKLQlucyA9IERBVl9GU19VUklfREFWOwotICAgIH0KLSAgICBlbHNlIHsKLQkvKiB3ZSBkb24ndCBkZWZpbmUgdGhpcyBwcm9wZXJ0eSAqLwotCXJldHVybiAwOwotICAgIH0KLQotICAgIGZvciAoc2NhbiA9IGRhdl9mc19wcm9wczsgc2Nhbi0+bmFtZSAhPSBOVUxMOyArK3NjYW4pCi0JaWYgKG5zID09IHNjYW4tPm5zICYmIHN0cmNtcChuYW1lLCBzY2FuLT5uYW1lKSA9PSAwKQotCSAgICByZXR1cm4gc2Nhbi0+cHJvcGlkOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBkYXZfcHJvcF9pbnNlcnQgZGF2X2ZzX2luc2VydF9wcm9wKGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkJCSAgaW50IHByb3BpZCwgaW50IGluc3ZhbHVlLAotCQkJCQkgIGNvbnN0IGludCAqbnNfbWFwLAotCQkJCQkgIGRhdl90ZXh0X2hlYWRlciAqcGhkcikKLXsKLSAgICBjb25zdCBjaGFyICp2YWx1ZTsKLSAgICBjb25zdCBjaGFyICpzOwotICAgIGRhdl9wcm9wX2luc2VydCB3aGljaDsKLSAgICBwb29sICpwID0gcmVzb3VyY2UtPmluZm8tPnBvb2w7Ci0gICAgY29uc3QgZGF2X2ZzX2xpdmVwcm9wX25hbWUgKnNjYW47Ci0gICAgaW50IG5zOwotCi0gICAgLyogYW4gSFRUUC1kYXRlIGNhbiBiZSAyOSBjaGFycyBwbHVzIGEgbnVsbCB0ZXJtICovCi0gICAgLyogYSA2NC1iaXQgc2l6ZSBjYW4gYmUgMjAgY2hhcnMgcGx1cyBhIG51bGwgdGVybSAqLwotICAgIGNoYXIgYnVmW0RBVl9USU1FQlVGX1NJWkVdOwotCi0gICAgaWYgKCFEQVZfUFJPUElEX0ZTX09VUlMocHJvcGlkKSkKLQlyZXR1cm4gREFWX1BST1BfSU5TRVJUX05PVE1FOwotCi0gICAgLyoKLSAgICAqKiBOb25lIG9mIEZTIHByb3ZpZGVyIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgaWYgdGhlIHJlc291cmNlIGRvZXMgbm90Ci0gICAgKiogZXhpc3QuIEp1c3QgYmFpbCBmb3IgdGhpcyBjYXNlLgotICAgICoqCi0gICAgKiogTm90ZSB0aGF0IERBVjpkaXNwbGF5bmFtZSBhbmQgREFWOnNvdXJjZSB3aWxsIGJlIHN0b3JlZCBhcyBkZWFkCi0gICAgKiogcHJvcGVydGllczsgdGhlIE5PVERFRiByZXR1cm4gY29kZSBpbmRpY2F0ZXMgdGhhdCBkYXZfcHJvcHMuYyBzaG91bGQKLSAgICAqKiBsb29rIHRoZXJlIGZvciB0aGUgdmFsdWUuCi0gICAgKioKLSAgICAqKiBFdmVuIHRob3VnaCB3ZSBzdGF0ZSB0aGF0IHRoZSBGUyBwcm9wZXJ0aWVzIGFyZSBub3QgZGVmaW5lZCwgdGhlCi0gICAgKiogY2xpZW50IGNhbm5vdCBzdG9yZSBkZWFkIHZhbHVlcyAtLSB3ZSBkZW55IHRoYXQgdGhydSB0aGUgaXNfd3JpdGFibGUKLSAgICAqKiBob29rIGZ1bmN0aW9uLgotICAgICovCi0gICAgaWYgKCFyZXNvdXJjZS0+ZXhpc3RzKQotCXJldHVybiBEQVZfUFJPUF9JTlNFUlRfTk9UREVGOwotCi0gICAgc3dpdGNoIChwcm9waWQpIHsKLSAgICBjYXNlIERBVl9QUk9QSURfRlNfY3JlYXRpb25kYXRlOgotCS8qCi0JKiogQ2xvc2VzdCB0aGluZyB0byBhIGNyZWF0aW9uIGRhdGUuIHNpbmNlIHdlIGRvbid0IGFjdHVhbGx5Ci0JKiogcGVyZm9ybSB0aGUgb3BlcmF0aW9ucyB0aGF0IHdvdWxkIG1vZGlmeSBjdGltZSAoYWZ0ZXIgd2UKLQkqKiBjcmVhdGUgdGhlIGZpbGUpLCB0aGVuIHdlIHNob3VsZCBiZSBwcmV0dHkgc2FmZSBoZXJlLgotCSovCi0JZGF2X2Zvcm1hdF90aW1lKERBVl9TVFlMRV9JU084NjAxLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UtPmluZm8tPmZpbmZvLnN0X2N0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgYnVmKTsKLQl2YWx1ZSA9IGJ1ZjsKLQlicmVhazsKLQotICAgIGNhc2UgREFWX1BST1BJRF9GU19nZXRjb250ZW50bGVuZ3RoOgotCS8qIG91ciBwcm9wZXJ0eSwgYnV0IG5vdCBkZWZpbmVkIG9uIGNvbGxlY3Rpb24gcmVzb3VyY2VzICovCi0JaWYgKHJlc291cmNlLT5jb2xsZWN0aW9uKQotCSAgICByZXR1cm4gREFWX1BST1BfSU5TRVJUX05PVERFRjsKLQotCSh2b2lkKSBzcHJpbnRmKGJ1ZiwgIiVsZCIsIHJlc291cmNlLT5pbmZvLT5maW5mby5zdF9zaXplKTsKLQl2YWx1ZSA9IGJ1ZjsKLQlicmVhazsKLQotICAgIGNhc2UgREFWX1BST1BJRF9GU19nZXRldGFnOgotCXZhbHVlID0gZGF2X2ZzX2dldGV0YWcocmVzb3VyY2UpOwotCWJyZWFrOwotCi0gICAgY2FzZSBEQVZfUFJPUElEX0ZTX2dldGxhc3Rtb2RpZmllZDoKLQlkYXZfZm9ybWF0X3RpbWUoREFWX1NUWUxFX1JGQzgyMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlLT5pbmZvLT5maW5mby5zdF9tdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zik7Ci0JdmFsdWUgPSBidWY7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIERBVl9QUk9QSURfRlNfZXhlY3V0YWJsZToKLSNpZmRlZiBXSU4zMgotICAgICAgICAvKiBvdXIgcHJvcGVydHksIGJ1dCBub3QgZGVmaW5lZCBvbiB0aGUgV2luMzIgcGxhdGZvcm0gKi8KLSAgICAgICAgcmV0dXJuIERBVl9QUk9QX0lOU0VSVF9OT1RERUY7Ci0jZWxzZQotCS8qIG91ciBwcm9wZXJ0eSwgYnV0IG5vdCBkZWZpbmVkIG9uIGNvbGxlY3Rpb24gcmVzb3VyY2VzICovCi0JaWYgKHJlc291cmNlLT5jb2xsZWN0aW9uKQotCSAgICByZXR1cm4gREFWX1BST1BfSU5TRVJUX05PVERFRjsKLQotCS8qIHRoZSBmaWxlcyBhcmUgIm91cnMiIHNvIHdlIG9ubHkgbmVlZCB0byBjaGVjayBvd25lciBleGVjIHByaXZzICovCi0JaWYgKHJlc291cmNlLT5pbmZvLT5maW5mby5zdF9tb2RlICYgREFWX0ZTX01PREVfWFVTUikKLQkgICAgdmFsdWUgPSAiVCI7Ci0JZWxzZQotCSAgICB2YWx1ZSA9ICJGIjsKLQlicmVhazsKLSNlbmRpZiAvKiBXSU4zMiAqLwotCi0gICAgY2FzZSBEQVZfUFJPUElEX0ZTX2Rpc3BsYXluYW1lOgotICAgIGNhc2UgREFWX1BST1BJRF9GU19zb3VyY2U6Ci0gICAgZGVmYXVsdDoKLQkvKgotCSoqIFRoaXMgcHJvcGVydHkgaXMgbm90IGRlZmluZWQuIEhvd2V2ZXIsIGl0IG1heSBiZSBhIGRlYWQKLQkqKiBwcm9wZXJ0eS4KLQkqLwotCXJldHVybiBEQVZfUFJPUF9JTlNFUlRfTk9UREVGOwotICAgIH0KLQotICAgIC8qIGFzc2VydDogdmFsdWUgIT0gTlVMTCAqLwotCi0gICAgZm9yIChzY2FuID0gZGF2X2ZzX3Byb3BzOyBzY2FuLT5uYW1lICE9IE5VTEw7ICsrc2NhbikKLQlpZiAoc2Nhbi0+cHJvcGlkID09IHByb3BpZCkKLQkgICAgYnJlYWs7Ci0gICAgLyogYXNzZXJ0OiBzY2FuLT5uYW1lICE9IE5VTEwgKi8KLQotICAgIC8qIG1hcCBvdXIgTlMgaW5kZXggaW50byBhIGdsb2JhbCBOUyBpbmRleCAqLwotICAgIG5zID0gbnNfbWFwW3NjYW4tPm5zXTsKLQotICAgIC8qIERCRzMoIkZTOiBpbnNlcnRpbmcgbHAlZDolcyAgKGxvY2FsICVkKSIsIG5zLCBzY2FuLT5uYW1lLCBzY2FuLT5ucyk7ICovCi0KLSAgICBpZiAoaW5zdmFsdWUpIHsKLQkvKiB1c2UgRDogcHJlZml4IHRvIHJlZmVyIHRvIHRoZSBEQVY6IG5hbWVzcGFjZSBVUkkgKi8KLQlzID0gYXBfcHNwcmludGYocCwgIjxscCVkOiVzPiVzPC9scCVkOiVzPiIgREVCVUdfQ1IsCi0JCQlucywgc2Nhbi0+bmFtZSwgdmFsdWUsIG5zLCBzY2FuLT5uYW1lKTsKLQl3aGljaCA9IERBVl9QUk9QX0lOU0VSVF9WQUxVRTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JLyogdXNlIEQ6IHByZWZpeCB0byByZWZlciB0byB0aGUgREFWOiBuYW1lc3BhY2UgVVJJICovCi0JcyA9IGFwX3BzcHJpbnRmKHAsICI8bHAlZDolcy8+IiBERUJVR19DUiwgbnMsIHNjYW4tPm5hbWUpOwotCXdoaWNoID0gREFWX1BST1BfSU5TRVJUX05BTUU7Ci0gICAgfQotICAgIGRhdl90ZXh0X2FwcGVuZChwLCBwaGRyLCBzKTsKLQotICAgIC8qIHdlIGluc2VydGVkIGEgbmFtZSBvciB2YWx1ZSAodGhpcyBwcm9wIGlzIGRvbmUpICovCi0gICAgcmV0dXJuIHdoaWNoOwotfQotCi1zdGF0aWMgdm9pZCBkYXZfZnNfaW5zZXJ0X2FsbChjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlLCBpbnQgaW5zdmFsdWUsCi0JCQkgICAgICBjb25zdCBpbnQgKm5zX21hcCwgZGF2X3RleHRfaGVhZGVyICpwaGRyKQotewotICAgIGlmICghcmVzb3VyY2UtPmV4aXN0cykgewotCS8qIGEgbG9jay1udWxsIHJlc291cmNlICovCi0JLyoKLQkqKiAjIyMgdGVjaG5pY2FsbHksIHdlIHNob3VsZCBpbnNlcnQgZW1wdHkgcHJvcGVydGllcy4gZHVubm8gb2ZmaGFuZAotCSoqICMjIyB3aGF0IHBhcnQgb2YgdGhlIHNwZWMgc2FpZCB0aGlzLCBidXQgaXQgd2FzIGVzc2VudGlhbGx5IHRodXM6Ci0JKiogIyMjICJ0aGUgcHJvcGVydGllcyBzaG91bGQgYmUgZGVmaW5lZCwgYnV0IG1heSBoYXZlIG5vIHZhbHVlIi4KLQkqLwotCXJldHVybjsKLSAgICB9Ci0KLSAgICAodm9pZCkgZGF2X2ZzX2luc2VydF9wcm9wKHJlc291cmNlLCBEQVZfUFJPUElEX0ZTX2NyZWF0aW9uZGF0ZSwKLQkJCSAgICAgIGluc3ZhbHVlLCBuc19tYXAsIHBoZHIpOwotICAgICh2b2lkKSBkYXZfZnNfaW5zZXJ0X3Byb3AocmVzb3VyY2UsIERBVl9QUk9QSURfRlNfZ2V0Y29udGVudGxlbmd0aCwKLQkJCSAgICAgIGluc3ZhbHVlLCBuc19tYXAsIHBoZHIpOwotICAgICh2b2lkKSBkYXZfZnNfaW5zZXJ0X3Byb3AocmVzb3VyY2UsIERBVl9QUk9QSURfRlNfZ2V0bGFzdG1vZGlmaWVkLAotCQkJICAgICAgaW5zdmFsdWUsIG5zX21hcCwgcGhkcik7Ci0gICAgKHZvaWQpIGRhdl9mc19pbnNlcnRfcHJvcChyZXNvdXJjZSwgREFWX1BST1BJRF9GU19nZXRldGFnLAotCQkJICAgICAgaW5zdmFsdWUsIG5zX21hcCwgcGhkcik7Ci0KLSNpZm5kZWYgV0lOMzIKLSAgICAvKgotICAgICoqIE5vdGU6IHRoaXMgcHJvcGVydHkgaXMgbm90IGRlZmluZWQgb24gdGhlIFdpbjMyIHBsYXRmb3JtLgotICAgICoqICAgICAgIGRhdl9mc19pbnNlcnRfcHJvcCgpIHdvbid0IGluc2VydCBpdCwgYnV0IHdlIG1heSBhcwotICAgICoqICAgICAgIHdlbGwgbm90IGV2ZW4gY2FsbCBpdC4KLSAgICAqLwotICAgICh2b2lkKSBkYXZfZnNfaW5zZXJ0X3Byb3AocmVzb3VyY2UsIERBVl9QUk9QSURfRlNfZXhlY3V0YWJsZSwKLQkJCSAgICAgIGluc3ZhbHVlLCBuc19tYXAsIHBoZHIpOwotI2VuZGlmCi0KLSAgICAvKiAjIyMgd2Uga25vdyB0aGUgb3RoZXJzIGFyZW4ndCBkZWZpbmVkIGFzIGxpdmVwcm9wcyAqLwotfQotCi1zdGF0aWMgZGF2X3Byb3BfcncgZGF2X2ZzX2lzX3dyaXRlYWJsZShjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlLAotCQkJCSAgICAgICBpbnQgcHJvcGlkKQotewotICAgIGlmICghREFWX1BST1BJRF9GU19PVVJTKHByb3BpZCkpCi0JcmV0dXJuIERBVl9QUk9QX1JXX05PVE1FOwotCi0gICAgaWYgKHByb3BpZCA9PSBEQVZfUFJPUElEX0ZTX2Rpc3BsYXluYW1lCi0JfHwgcHJvcGlkID09IERBVl9QUk9QSURfRlNfc291cmNlCi0jaWZuZGVmIFdJTjMyCi0gICAgICAgIC8qIHRoaXMgcHJvcGVydHkgaXMgbm90IHVzYWJsZSAod3JpdGVhYmxlKSBvbiB0aGUgV2luMzIgcGxhdGZvcm0gKi8KLQl8fCAocHJvcGlkID09IERBVl9QUk9QSURfRlNfZXhlY3V0YWJsZSAmJiAhcmVzb3VyY2UtPmNvbGxlY3Rpb24pCi0jZW5kaWYKLQkpCi0JcmV0dXJuIERBVl9QUk9QX1JXX1lFUzsKLQotICAgIHJldHVybiBEQVZfUFJPUF9SV19OTzsKLX0KLQotc3RhdGljIGRhdl9lcnJvciAqZGF2X2ZzX3BhdGNoX3ZhbGlkYXRlKGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkJCWNvbnN0IGRhdl94bWxfZWxlbSAqZWxlbSwKLQkJCQkJaW50IG9wZXJhdGlvbiwKLQkJCQkJdm9pZCAqKmNvbnRleHQsCi0JCQkJCWludCAqZGVmZXJfdG9fZGVhZCkKLXsKLSAgICBjb25zdCBkYXZfdGV4dCAqY2RhdGE7Ci0gICAgY29uc3QgZGF2X3RleHQgKmZfY2RhdGE7Ci0gICAgY2hhciB2YWx1ZTsKLQotICAgIGlmIChlbGVtLT5wcm9waWQgIT0gREFWX1BST1BJRF9GU19leGVjdXRhYmxlKSB7Ci0JKmRlZmVyX3RvX2RlYWQgPSAxOwotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmIChvcGVyYXRpb24gPT0gREFWX1BST1BfT1BfREVMRVRFKSB7Ci0JcmV0dXJuIGRhdl9uZXdfZXJyb3IocmVzb3VyY2UtPmluZm8tPnBvb2wsIEhUVFBfQ09ORkxJQ1QsIDAsCi0JCQkgICAgICJUaGUgJ2V4ZWN1dGFibGUnIHByb3BlcnR5IGNhbm5vdCBiZSByZW1vdmVkLiIpOwotICAgIH0KLQotICAgIGNkYXRhID0gZWxlbS0+Zmlyc3RfY2RhdGEuZmlyc3Q7Ci0gICAgZl9jZGF0YSA9IGVsZW0tPmxhc3RfY2hpbGQgPT0gTlVMTAotCT8gTlVMTAotCTogZWxlbS0+bGFzdF9jaGlsZC0+Zm9sbG93aW5nX2NkYXRhLmZpcnN0OwotCi0gICAgLyogREJHMygibmFtZT0lcyAgY2RhdGE9JXMgIGZfY2RhdGE9JXMiLGVsZW0tPm5hbWUsY2RhdGEgPyBjZGF0YS0+dGV4dCA6ICJbbnVsbF0iLGZfY2RhdGEgPyBmX2NkYXRhLT50ZXh0IDogIltudWxsXSIpOyAqLwotCi0gICAgaWYgKGNkYXRhID09IE5VTEwpIHsKLQlpZiAoZl9jZGF0YSA9PSBOVUxMKSB7Ci0JICAgIHJldHVybiBkYXZfbmV3X2Vycm9yKHJlc291cmNlLT5pbmZvLT5wb29sLCBIVFRQX0NPTkZMSUNULCAwLAotCQkJCSAiVGhlICdleGVjdXRhYmxlJyBwcm9wZXJ0eSBleHBlY3RzIGEgc2luZ2xlICIKLQkJCQkgImNoYXJhY3RlciwgdmFsdWVkICdUJyBvciAnRicuIFRoZXJlIHdhcyBubyAiCi0JCQkJICJ2YWx1ZSBzdWJtaXR0ZWQuIik7Ci0JfQotCWNkYXRhID0gZl9jZGF0YTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZl9jZGF0YSAhPSBOVUxMKQotCWdvdG8gdG9vX2xvbmc7Ci0KLSAgICBpZiAoY2RhdGEtPm5leHQgIT0gTlVMTCB8fCBzdHJsZW4oY2RhdGEtPnRleHQpICE9IDEpCi0JZ290byB0b29fbG9uZzsKLQotICAgIHZhbHVlID0gY2RhdGEtPnRleHRbMF07Ci0gICAgaWYgKHZhbHVlICE9ICdUJyAmJiB2YWx1ZSAhPSAnRicpIHsKLQlyZXR1cm4gZGF2X25ld19lcnJvcihyZXNvdXJjZS0+aW5mby0+cG9vbCwgSFRUUF9DT05GTElDVCwgMCwKLQkJCSAgICAgIlRoZSAnZXhlY3V0YWJsZScgcHJvcGVydHkgZXhwZWN0cyBhIHNpbmdsZSAiCi0JCQkgICAgICJjaGFyYWN0ZXIsIHZhbHVlZCAnVCcgb3IgJ0YnLiBUaGUgdmFsdWUgIgotCQkJICAgICAic3VibWl0dGVkIGlzIGludmFsaWQuIik7Ci0gICAgfQotCi0gICAgKmNvbnRleHQgPSAodm9pZCAqKSh2YWx1ZSA9PSAnVCcpOwotCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgdG9vX2xvbmc6Ci0gICAgcmV0dXJuIGRhdl9uZXdfZXJyb3IocmVzb3VyY2UtPmluZm8tPnBvb2wsIEhUVFBfQ09ORkxJQ1QsIDAsCi0JCQkgIlRoZSAnZXhlY3V0YWJsZScgcHJvcGVydHkgZXhwZWN0cyBhIHNpbmdsZSAiCi0JCQkgImNoYXJhY3RlciwgdmFsdWVkICdUJyBvciAnRicuIFRoZSB2YWx1ZSBzdWJtaXR0ZWQiCi0JCQkgImhhcyB0b28gbWFueSBjaGFyYWN0ZXJzLiIpOwotCi19Ci0KLXN0YXRpYyBkYXZfZXJyb3IgKmRhdl9mc19wYXRjaF9leGVjKGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkJICAgIGNvbnN0IGRhdl94bWxfZWxlbSAqZWxlbSwKLQkJCQkgICAgaW50IG9wZXJhdGlvbiwKLQkJCQkgICAgdm9pZCAqY29udGV4dCwKLQkJCQkgICAgZGF2X2xpdmVwcm9wX3JvbGxiYWNrICoqcm9sbGJhY2tfY3R4KQotewotICAgIGludCB2YWx1ZSA9IGNvbnRleHQgIT0gTlVMTDsKLSAgICBtb2RlX3QgbW9kZSA9IHJlc291cmNlLT5pbmZvLT5maW5mby5zdF9tb2RlOwotICAgIGludCBvbGRfdmFsdWUgPSAocmVzb3VyY2UtPmluZm8tPmZpbmZvLnN0X21vZGUgJiBEQVZfRlNfTU9ERV9YVVNSKSAhPSAwOwotCi0gICAgLyogYXNzZXJ0OiBwcm9wID09IGV4ZWN1dGFibGUuIG9wZXJhdGlvbiA9PSBTRVQuICovCi0KLSAgICAvKiBkb24ndCBkbyBhbnl0aGluZyBpZiB0aGVyZSBpcyBubyBjaGFuZ2UuIG5vIHJvbGxiYWNrIGluZm8gZWl0aGVyLiAqLwotICAgIGlmICh2YWx1ZSA9PSBvbGRfdmFsdWUpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICBtb2RlICY9IH5EQVZfRlNfTU9ERV9YVVNSOwotICAgIGlmICh2YWx1ZSkKLQltb2RlIHw9IERBVl9GU19NT0RFX1hVU1I7Ci0KLSAgICBpZiAoY2htb2QocmVzb3VyY2UtPmluZm8tPnBhdGhuYW1lLCBtb2RlKSA9PSAtMSkgewotCXJldHVybiBkYXZfbmV3X2Vycm9yKHJlc291cmNlLT5pbmZvLT5wb29sLAotCQkJICAgICBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgMCwKLQkJCSAgICAgIkNvdWxkIG5vdCBzZXQgdGhlIGV4ZWN1dGFibGUgZmxhZyBvZiB0aGUgIgotCQkJICAgICAidGFyZ2V0IHJlc291cmNlLiIpOwotICAgIH0KLQotICAgIC8qIHVwZGF0ZSB0aGUgcmVzb3VyY2UgYW5kIHNldCB1cCB0aGUgcm9sbGJhY2sgY29udGV4dCAqLwotICAgIHJlc291cmNlLT5pbmZvLT5maW5mby5zdF9tb2RlID0gbW9kZTsKLSAgICAqcm9sbGJhY2tfY3R4ID0gKGRhdl9saXZlcHJvcF9yb2xsYmFjayAqKW9sZF92YWx1ZTsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBkYXZfZnNfcGF0Y2hfY29tbWl0KGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkJaW50IG9wZXJhdGlvbiwKLQkJCQl2b2lkICpjb250ZXh0LAotCQkJCWRhdl9saXZlcHJvcF9yb2xsYmFjayAqcm9sbGJhY2tfY3R4KQotewotICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KLX0KLQotc3RhdGljIGRhdl9lcnJvciAqZGF2X2ZzX3BhdGNoX3JvbGxiYWNrKGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkJCWludCBvcGVyYXRpb24sCi0JCQkJCXZvaWQgKmNvbnRleHQsCi0JCQkJCWRhdl9saXZlcHJvcF9yb2xsYmFjayAqcm9sbGJhY2tfY3R4KQotewotICAgIG1vZGVfdCBtb2RlID0gcmVzb3VyY2UtPmluZm8tPmZpbmZvLnN0X21vZGUgJiB+REFWX0ZTX01PREVfWFVTUjsKLSAgICBpbnQgdmFsdWUgPSByb2xsYmFja19jdHggIT0gTlVMTDsKLQotICAgIC8qIGFzc2VydDogcHJvcCA9PSBleGVjdXRhYmxlLiBvcGVyYXRpb24gPT0gU0VULiAqLwotCi0gICAgLyogcmVzdG9yZSB0aGUgZXhlY3V0YWJsZSBiaXQgKi8KLSAgICBpZiAodmFsdWUpCi0JbW9kZSB8PSBEQVZfRlNfTU9ERV9YVVNSOwotCi0gICAgaWYgKGNobW9kKHJlc291cmNlLT5pbmZvLT5wYXRobmFtZSwgbW9kZSkgPT0gLTEpIHsKLQlyZXR1cm4gZGF2X25ld19lcnJvcihyZXNvdXJjZS0+aW5mby0+cG9vbCwKLQkJCSAgICAgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsIDAsCi0JCQkgICAgICJBZnRlciBhIGZhaWx1cmUgb2NjdXJyZWQsIHRoZSByZXNvdXJjZSdzICIKLQkJCSAgICAgImV4ZWN1dGFibGUgZmxhZyBjb3VsZCBub3QgYmUgcmVzdG9yZWQuIik7Ci0gICAgfQotCi0gICAgLyogcmVzdG9yZSB0aGUgcmVzb3VyY2UncyBzdGF0ZSAqLwotICAgIHJlc291cmNlLT5pbmZvLT5maW5mby5zdF9tb2RlID0gbW9kZTsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi0KLXN0YXRpYyBjb25zdCBkYXZfaG9va3NfbGl2ZXByb3AgZGF2X2hvb2tzX2xpdmVwcm9wX2ZzID0KLXsKLSNpZmRlZiBXSU4zMgotICAgIE5VTEwsCi0jZWxzZQotICAgICJodHRwOi8vYXBhY2hlLm9yZy9kYXYvcHJvcHNldC9mcy8xIiwJLyogZmlsZXN5c3RlbSwgc2V0IDEgKi8KLSNlbmRpZgotICAgIGRhdl9mc19maW5kX3Byb3AsCi0gICAgZGF2X2ZzX2luc2VydF9wcm9wLAotICAgIGRhdl9mc19pbnNlcnRfYWxsLAotICAgIGRhdl9mc19pc193cml0ZWFibGUsCi0gICAgZGF2X2ZzX25hbWVzcGFjZV91cmlzLAotICAgIGRhdl9mc19wYXRjaF92YWxpZGF0ZSwKLSAgICBkYXZfZnNfcGF0Y2hfZXhlYywKLSAgICBkYXZfZnNfcGF0Y2hfY29tbWl0LAotICAgIGRhdl9mc19wYXRjaF9yb2xsYmFjaywKLX07Ci0KLS8qCi0qKiBOb3RlOiB3ZSBkbyBub3QgcHJvdmlkZSBhbiBpc19hY3RpdmUgZnVuY3Rpb24gYXQgdGhpcyBwb2ludC4gSW4gdGhlCi0qKiBmdXR1cmUsIG1vZF9kYXYgbWF5IHVzZSB0aGF0IHRvIGRldGVybWluZSBpZiBhIHBhcnRpY3VsYXIgcHJvdmlkZXIgaXMKLSoqIGFjdGl2ZS9lbmFibGVkLCBidXQgaXQgZG9lc24ndCBub3cuCi0qLwotc3RhdGljIGNvbnN0IGRhdl9keW5fcHJvdmlkZXIgZGF2X2R5bl9wcm92aWRlcnNfZnNbXSA9Ci17Ci0gICAgLyogcmVwb3NpdG9yeSBwcm92aWRlciAqLwotICAgIHsKLQlEQVZfRlNfUFJPVklERVJfSUQsCi0gICAgICAgIERBVl9EWU5fVFlQRV9SRVBPU0lUT1JZLAotICAgICAgICAmZGF2X2hvb2tzX3JlcG9zaXRvcnlfZnMsCi0gICAgICAgIE5VTEwKLSAgICB9LAotICAgIC8qIGxpdmVwcm9wIHByb3ZpZGVyICovCi0gICAgewotCURBVl9GU19QUk9WSURFUl9JRCwKLSAgICAgICAgREFWX0RZTl9UWVBFX0xJVkVQUk9QLAotICAgICAgICAmZGF2X2hvb2tzX2xpdmVwcm9wX2ZzLAotICAgICAgICBOVUxMCi0gICAgfSwKLSAgICAvKiBwcm9wZGIgcHJvdmlkZXIgKi8KLSAgICB7Ci0JREFWX0ZTX1BST1ZJREVSX0lELAotICAgICAgICBEQVZfRFlOX1RZUEVfUFJPUERCLAotICAgICAgICAmZGF2X2hvb2tzX2RiX2RibSwKLSAgICAgICAgTlVMTAotICAgIH0sCi0gICAgLyogbG9ja3MgcHJvdmlkZXIgKi8KLSAgICB7Ci0JREFWX0ZTX1BST1ZJREVSX0lELAotICAgICAgICBEQVZfRFlOX1RZUEVfTE9DS1MsCi0gICAgICAgICZkYXZfaG9va3NfbG9ja3NfZnMsCi0gICAgICAgIE5VTEwKLSAgICB9LAotICAgIC8qIG11c3QgYWx3YXlzIGJlIGxhc3QgKi8KLSAgICBEQVZfRFlOX0VORF9NQVJLRVIKLX07Ci0KLWNvbnN0IGRhdl9keW5fbW9kdWxlIGRhdl9keW5fbW9kdWxlX2RlZmF1bHQgPQotewotICAgIERBVl9EWU5fTUFHSUMsCi0gICAgREFWX0RZTl9WRVJTSU9OLAotICAgICJmaWxlc3lzdGVtIiwKLQotICAgIE5VTEwsIC8qIG1vZHVsZV9vcGVuICovCi0gICAgTlVMTCwgLyogbW9kdWxlX2Nsb3NlICovCi0gICAgTlVMTCwgLyogZGlyX29wZW4gKi8KLSAgICBOVUxMLCAvKiBkaXJfcGFyYW0gKi8KLSAgICBOVUxMLCAvKiBkaXJfbWVyZ2UgKi8KLSAgICBOVUxMLCAvKiBkaXJfY2xvc2UgKi8KLQotICAgIGRhdl9keW5fcHJvdmlkZXJzX2ZzCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9kYXYvZnMvcmVwb3MuaCBiL21vZHVsZXMvZGF2L2ZzL3JlcG9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMzBjMWUuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9kYXYvZnMvcmVwb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0qKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCBHcmVnIFN0ZWluLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotKioKLSoqIEJ5IHVzaW5nIHRoaXMgZmlsZSwgeW91IGFncmVlIHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBzZXQgZm9ydGggaW4KLSoqIHRoZSBMSUNFTlNFLmh0bWwgZmlsZSB3aGljaCBjYW4gYmUgZm91bmQgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgbW9kX2RhdgotKiogZGlzdHJpYnV0aW9uIG9yIGF0IGh0dHA6Ly93d3cud2ViZGF2Lm9yZy9tb2RfZGF2L2xpY2Vuc2UtMS5odG1sLgotKioKLSoqIENvbnRhY3QgaW5mb3JtYXRpb246Ci0qKiAgIEdyZWcgU3RlaW4sIFBPIEJveCA3NjAsIFBhbG8gQWx0bywgQ0EsIDk0MzAyCi0qKiAgIGdzdGVpbkBseXJhLm9yZywgaHR0cDovL3d3dy53ZWJkYXYub3JnL21vZF9kYXYvCi0qLwotCi0vKgotKiogRGVjbGFyYXRpb25zIGZvciB0aGUgZmlsZXN5c3RlbSByZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uCi0qKgotKiogV3JpdHRlbiBieSBKb2huIFZhc3RhLCB2YXN0YUByYXRpb25hbC5jb20sIGJ5IHNlcGFyYXRpbmcgZnJvbSBtb2RfZGF2LmgKLSovCi0KLSNpZm5kZWYgX0RBVl9GU19SRVBPU19IXwotI2RlZmluZSBfREFWX0ZTX1JFUE9TX0hfCi0KLS8qIHRoZSBzdWJkaXJlY3RvcnkgdG8gaG9sZCBhbGwgREFWLXJlbGF0ZWQgaW5mb3JtYXRpb24gZm9yIGEgZGlyZWN0b3J5ICovCi0jZGVmaW5lIERBVl9GU19TVEFURV9ESVIJCSIuREFWIgotI2RlZmluZSBEQVZfRlNfU1RBVEVfRklMRV9GT1JfRElSCSIuc3RhdGVfZm9yX2RpciIKLSNkZWZpbmUgREFWX0ZTX0xPQ0tfTlVMTF9GSUxFCSAgICAgICAgIi5sb2NrbnVsbCIKLQotI2lmbmRlZiBXSU4zMgotCi0jZGVmaW5lIERBVl9GU19NT0RFX0RJUgkJKFNfSVJXWFUgfCBTX0lSV1hHKQotI2RlZmluZSBEQVZfRlNfTU9ERV9GSUxFCShTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lXR1JQKQotI2RlZmluZSBEQVZfRlNfTU9ERV9YVVNSICAgIChTX0lYVVNSKQotCi0jZWxzZSAvKiBXSU4zMiAqLwotCi0jZGVmaW5lIERBVl9GU19NT0RFX0RJUgkJKF9TX0lSRUFEIHwgX1NfSVdSSVRFKQotI2RlZmluZSBEQVZfRlNfTU9ERV9GSUxFCShfU19JUkVBRCB8IF9TX0lXUklURSkKLSNkZWZpbmUgREFWX0ZTX01PREVfWFVTUiAgICAoX1NfSUVYRUMpCi0KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotdHlwZWRlZiBpbnQgc3NpemVfdDsKLQotI2RlZmluZSBta2RpcihwLG0pCQlfbWtkaXIocCkKLQotI2VuZGlmIC8qIFdJTjMyICovCi0KLS8qIGVuc3VyZSB0aGF0IG91ciBzdGF0ZSBzdWJkaXJlY3RvcnkgaXMgcHJlc2VudCAqLwotdm9pZCBkYXZfZnNfZW5zdXJlX3N0YXRlX2Rpcihwb29sICpwLCBjb25zdCBjaGFyICpkaXJuYW1lKTsKLQotLyogcmV0dXJuIHRoZSBzdG9yYWdlIHBvb2wgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgKi8KLXBvb2wgKmRhdl9mc19wb29sKGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UpOwotCi0vKiByZXR1cm4gdGhlIGZ1bGwgcGF0aG5hbWUgZm9yIGEgcmVzb3VyY2UgKi8KLWNvbnN0IGNoYXIgKmRhdl9mc19wYXRobmFtZShjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlKTsKLQotLyogcmV0dXJuIHRoZSBkaXJlY3RvcnkgYW5kIGZpbGVuYW1lIGZvciBhIHJlc291cmNlICovCi12b2lkIGRhdl9mc19kaXJfZmlsZV9uYW1lKGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkgIGNvbnN0IGNoYXIgKipkaXJwYXRoLAotCQkJICBjb25zdCBjaGFyICoqZm5hbWUpOwotCi0vKiByZXR1cm4gdGhlIGxpc3Qgb2YgbG9ja251bGwgbWVtYmVycyBpbiB0aGlzIHJlc291cmNlJ3MgZGlyZWN0b3J5ICovCi1kYXZfZXJyb3IgKiBkYXZfZnNfZ2V0X2xvY2tudWxsX21lbWJlcnMoY29uc3QgZGF2X3Jlc291cmNlICpyZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXZfYnVmZmVyICpwYnVmKTsKLQotCi0vKiBEQk0gZnVuY3Rpb25zIHVzZWQgYnkgdGhlIHJlcG9zaXRvcnkgYW5kIGxvY2tpbmcgcHJvdmlkZXJzICovCi1leHRlcm4gY29uc3QgZGF2X2hvb2tzX2RiIGRhdl9ob29rc19kYl9kYm07Ci0KLWRhdl9lcnJvciAqIGRhdl9kYm1fb3Blbl9kaXJlY3QocG9vbCAqcCwgY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBybywKLQkJCQlkYXZfZGIgKipwZGIpOwotdm9pZCBkYXZfZGJtX2dldF9zdGF0ZWZpbGVzKHBvb2wgKnAsIGNvbnN0IGNoYXIgKmZuYW1lLAotCQkJICAgIGNvbnN0IGNoYXIgKipzdGF0ZTEsIGNvbnN0IGNoYXIgKipzdGF0ZTIpOwotCi0KLSNlbmRpZiAvKiBfREFWX0ZTX1JFUE9TX0hfICovCmRpZmYgLS1naXQgYS9tb2R1bGVzL2Rhdi9tYWluLy5jdnNpZ25vcmUgYi9tb2R1bGVzL2Rhdi9tYWluLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZjdhNzAuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9kYXYvbWFpbi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLmRlcHMKLS5saWJzCi0qLmxhCi1tb2R1bGVzLm1rCi1NYWtlZmlsZQotKi5sbwotKi5zbG8KLSouc28KLSouZGxsCi0qLmRlZgpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9kYXYvbWFpbi9NYWtlZmlsZS5pbiBiL21vZHVsZXMvZGF2L21haW4vTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYzU5MjUuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9kYXYvbWFpbi9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotCi1MVExJQlJBUllfTkFNRSAgICA9IGxpYmFwYWNoZW1vZF9kYXYubGEKLUxUTElCUkFSWV9TT1VSQ0VTID0gbW9kX2Rhdi5jIHByb3BzLmMgdXRpbC5jIHV0aWxfbG9jay5jIFwKLQkJCW9wYXF1ZWxvY2suYyBkYXZfZHluLmMKLQotaW5jbHVkZSAkKHRvcF9zcmNkaXIpL2J1aWxkL2x0bGliLm1rCmRpZmYgLS1naXQgYS9tb2R1bGVzL2Rhdi9tYWluL05XR05VbWFrZWZpbGUgYi9tb2R1bGVzL2Rhdi9tYWluL05XR05VbWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNzM4NDIuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9kYXYvbWFpbi9OV0dOVW1ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLSMKLSMgRGVjbGFyZSB0aGUgc3ViLWRpcmVjdG9yaWVzIHRvIGJlIGJ1aWx0IGhlcmUKLSMKLQotU1VCRElSUyA9IFwKLQkkKEVPTElTVCkgCi0KLSMKLSMgR2V0IHRoZSAnaGVhZCcgb2YgdGhlIGJ1aWxkIGVudmlyb25tZW50LiAgVGhpcyBpbmNsdWRlcyBkZWZhdWx0IHRhcmdldHMgYW5kCi0jIHBhdGhzIHRvIHRvb2xzCi0jCi0KLWluY2x1ZGUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jCi0KLSMKLSMgYnVpbGQgdGhpcyBsZXZlbCdzIGZpbGVzCi0jCi0jIE1ha2Ugc3VyZSBhbGwgbmVlZGVkIG1hY3JvJ3MgYXJlIGRlZmluZWQKLSMKLQotIwotIyBUaGVzZSBkaXJlY3RvcmllcyB3aWxsIGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGluY2x1ZGUgbGlzdCwgZm9sbG93ZWQgYnkKLSMgSU5DRElSUwotIwotWElOQ0RJUlMJKz0gXAotCQkJJChBUF9XT1JLKS9zcmNsaWIvYXByL2luY2x1ZGUgXAotCQkJJChBUF9XT1JLKS9zcmNsaWIvaW5jbHVkZS9hcmNoL05ldFdhcmUgXAotCQkJJChBUF9XT1JLKS9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSBcCi0JCQkkKEFQX1dPUkspL2luY2x1ZGUgXAotCQkJJChBUF9XT1JLKS9vcy9OZXRXYXJlIFwKLQkJCSQoQVBfV09SSykvc2VydmVyL21wbS9OZXRXYXJlIFwKLQkJCSQoQVBfV09SSykvc3JjbGliL3BjcmUgXAotCQkJJChOV09TKSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBmbGFncyB3aWxsIGNvbWUgYWZ0ZXIgQ0ZMQUdTCi0jCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBkZWZpbmVzIHdpbGwgY29tZSBhZnRlciBERUZJTkVTCi0jCi1YREVGSU5FUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBmbGFncyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaW5rLm9wdCBmaWxlCi0jCi1YTEZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSB2YWx1ZXMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgY29ycmVjdCB2YXJpYWJsZXMgYmFzZWQgb24gdGhlIHZhbHVlIG9mCi0jIFJFTEVBU0UKLSMKLWlmZXEgIiQoUkVMRUFTRSkiICJkZWJ1ZyIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJICAgCSQoRU9MSVNUKQotZW5kaWYKLQotaWZlcSAiJChSRUxFQVNFKSIgIm5vb3B0IgotWElOQ0RJUlMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhDRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YREVGSU5FUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWExGTEFHUwkJKz0gXAotCQkgICAJJChFT0xJU1QpCi1lbmRpZgotCi1pZmVxICIkKFJFTEVBU0UpIiAicmVsZWFzZSIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotZW5kaWYKLQotIwotIyBUaGVzZSBhcmUgdXNlZCBieSB0aGUgbGluayB0YXJnZXQgaWYgYW4gTkxNIGlzIGJlaW5nIGdlbmVyYXRlZAotIyBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmsgJ25hbWUnIGRpcmVjdGl2ZSB0byBuYW1lIHRoZSBubG0uICBJZiBsZWZ0IGJsYW5rCi0jIFRBUkdFVF9ubG0gKHNlZSBiZWxvdykgd2lsbCBiZSB1c2VkLgotIwotTkxNX05BTUUJCT0gbW9kX0RBVgotCi0jCi0jIFRoaXMgaXMgdXNlZCBieSB0aGUgbGluayAnLWRlc2MgJyBkaXJlY3RpdmUuIAotIyBJZiBsZWZ0IGJsYW5rLCBOTE1fTkFNRSB3aWxsIGJlIHVzZWQuCi0jCi1OTE1fREVTQ1JJUFRJT04JPSBBcGFjaGUgREFWIG1vZHVsZQotCi0jCi0jIFRoaXMgaXMgdXNlZCBieSB0aGUgJy10aHJlYWRuYW1lJyBkaXJlY3RpdmUuICBJZiBsZWZ0IGJsYW5rLAotIyBOTE1fTkFNRSBUaHJlYWQgd2lsbCBiZSB1c2VkLgotIwotTkxNX1RIUkVBRF9OQU1FCT0gbW9kX0RBVgotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlIFZFUlNJT04gdmFsdWUgaW4gCi0jICQoQVBfV09SSylcYnVpbGRcTldHTlVlbnZpcm9ubWVudC5pbmMKLSMKLU5MTV9WRVJTSU9OCQk9IAotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG9mIDY0SwotIwotTkxNX1NUQUNLX1NJWkUJPSA2NTUzNgotIAotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWVudHJ5JyBkaXJlY3RpdmUKLSMKLU5MTV9FTlRSWV9TWU0JPSBfTGliQ1ByZWx1ZGUKLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1leGl0JyBkaXJlY3RpdmUKLSMKLU5MTV9FWElUX1NZTQk9IF9MaWJDUG9zdGx1ZGUKLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1jaGVjaycgZGlyZWN0aXZlCi0jCi1OTE1fQ0hFQ0tfU1lNCT0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1mbGFncycgZGlyZWN0aXZlCi0jCi1OTE1fRkxBR1MJCT0gQVVUT1VOTE9BRCwgUFNFVURPUFJFRU1QVElPTgotIAotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIGxpbmtlZCBpbiB3aXRoIHRoZSBYRENEYXRhIG9wdGlvbiBpbiB0aGUgZGVmIAotIyBmaWxlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb2YgJChOV09TKS9hcGFjaGUueGRjLiAgWERDRGF0YSBjYW4gYmUgZGlzYWJsZWQKLSMgYnkgc2V0dGluZyBBUEFDSEVfVU5JUFJPQyBpbiB0aGUgZW52aXJvbm1lbnQKLSMKLVhEQ0RBVEEgICAgICAgICA9IAotCi0jCi0jIERlY2xhcmUgYWxsIHRhcmdldCBmaWxlcyAoeW91IG11c3QgYWRkIHlvdXIgZmlsZXMgaGVyZSkKLSMKLQotIwotIyBJZiB0aGVyZSBpcyBhbiBOTE0gdGFyZ2V0LCBwdXQgaXQgaGVyZQotIwotVEFSR0VUX25sbSA9IFwKLQkkKE9CSkRJUikvbW9kX2Rhdi5ubG0gXAotCSQoRU9MSVNUKQotCi0jCi0jIElmIHRoZXJlIGlzIGFuIExJQiB0YXJnZXQsIHB1dCBpdCBoZXJlCi0jCi1UQVJHRVRfbGliID0gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgT0JKIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIE5MTSB0YXJnZXQgYWJvdmUuCi0jIFBhdGhzIG11c3QgYWxsIHVzZSB0aGUgJy8nIGNoYXJhY3RlcgotIwotRklMRVNfbmxtX29ianMgPSBcCi0JJChPQkpESVIpL21vZF9kYXYubyBcCi0JJChPQkpESVIpL3Byb3BzLm8gXAotCSQoT0JKRElSKS91dGlsLm8gXAotCSQoT0JKRElSKS91dGlsX2xvY2subyBcCi0JJChPQkpESVIpL2xpdmVwcm9wLm8gXAotCSQoT0JKRElSKS9wcm92aWRlcnMubyBcCi0JJChPQkpESVIpL3N0ZF9saXZlcHJvcC5vIFwKLQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBhcmUgdGhlIExJQiBmaWxlcyBuZWVkZWQgdG8gY3JlYXRlIHRoZSBOTE0gdGFyZ2V0IGFib3ZlLgotIyBUaGVzZSB3aWxsIGJlIGFkZGVkIGFzIGEgbGlicmFyeSBjb21tYW5kIGluIHRoZSBsaW5rLm9wdCBmaWxlLgotIwotRklMRVNfbmxtX2xpYnMgPSBcCi0gICAJbGliY3ByZS5vIFwKLQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBhcmUgdGhlIG1vZHVsZXMgdGhhdCB0aGUgYWJvdmUgTkxNIHRhcmdldCBkZXBlbmRzIG9uIHRvIGxvYWQuCi0jIFRoZXNlIHdpbGwgYmUgYWRkZWQgYXMgYSBtb2R1bGUgY29tbWFuZCBpbiB0aGUgbGluay5vcHQgZmlsZS4KLSMKLUZJTEVTX25sbV9tb2R1bGVzID0gXAotCUFwYWNoZTIgXAotCUxpYmMgXAotCSQoRU9MSVNUKQotCi0jCi0jIElmIHRoZSBubG0gaGFzIGEgbXNnIGZpbGUsIHB1dCBpdCdzIHBhdGggaGVyZQotIwotRklMRV9ubG1fbXNnID0KLSAKLSMKLSMgSWYgdGhlIG5sbSBoYXMgYSBobHAgZmlsZSBwdXQgaXQncyBwYXRoIGhlcmUKLSMKLUZJTEVfbmxtX2hscCA9Ci0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgJChOV09TKVxjb3B5cmlnaHQudHh0LgotIwotRklMRV9ubG1fY29weXJpZ2h0ID0KLQotIwotIyBBbnkgYWRkaXRpb25hbCBpbXBvcnRzIGdvIGhlcmUKLSMKLUZJTEVTX25sbV9YaW1wb3J0cyA9IFwKLQlAbGliYy5pbXAgXAotCUAkKEFQUikvYXBybGliLmltcCBcCi0JQGh0dHBkLmltcCBcCi0JJChFT0xJU1QpCi0gCi0jICAgCi0jIEFueSBzeW1ib2xzIGV4cG9ydGVkIHRvIGhlcmUKLSMKLUZJTEVTX25sbV9leHBvcnRzID0gXAotCWRhdl9tb2R1bGUgXAotCUBkYXYuaW1wIFwKLQkkKEVPTElTVCkKLQkKLSMgICAKLSMgVGhlc2UgYXJlIHRoZSBPQkogZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTElCIHRhcmdldCBhYm92ZS4KLSMgUGF0aHMgbXVzdCBhbGwgdXNlIHRoZSAnLycgY2hhcmFjdGVyCi0jCi1GSUxFU19saWJfb2JqcyA9IFwKLQkJJChFT0xJU1QpCi0KLSMKLSMgaW1wbGVtZW50IHRhcmdldHMgYW5kIGRlcGVuZGFuY2llcyAobGVhdmUgdGhpcyBzZWN0aW9uIGFsb25lKQotIwotCi1saWJzIDo6ICQoT0JKRElSKSAkKFRBUkdFVF9saWIpCi0KLW5sbXMgOjogbGlicyAkKFRBUkdFVF9ubG0pCi0KLSMKLSMgVXBkYXRlZCB0aGlzIHRhcmdldCB0byBjcmVhdGUgbmVjZXNzYXJ5IGRpcmVjdG9yaWVzIGFuZCBjb3B5IGZpbGVzIHRvIHRoZSAKLSMgY29ycmVjdCBwbGFjZS4gIChTZWUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jIGZvciBleGFtcGxlcykKLSMKLWluc3RhbGwgOjogbmxtcyBGT1JDRQotCWNvcHkgJChPQkpESVIpXG1vZF9kYXYubmxtICQoSU5TVEFMTClcQXBhY2hlMlxtb2R1bGVzXCouKgotICAgIAotIwotIyBBbnkgc3BlY2lhbGl6ZWQgcnVsZXMgaGVyZQotIwotCi0jCi0jIEluY2x1ZGUgdGhlICd0YWlsJyBtYWtlZmlsZSB0aGF0IGhhcyB0YXJnZXRzIHRoYXQgZGVwZW5kIG9uIHZhcmlhYmxlcyBkZWZpbmVkCi0jIGluIHRoaXMgbWFrZWZpbGUKLSMKLQotaW5jbHVkZSAkKEFQX1dPUkspXGJ1aWxkXE5XR05VdGFpbC5pbmMKLQotCi0JCmRpZmYgLS1naXQgYS9tb2R1bGVzL2Rhdi9tYWluL2NvbmZpZzUubTQgYi9tb2R1bGVzL2Rhdi9tYWluL2NvbmZpZzUubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNDM1MDIuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9kYXYvbWFpbi9jb25maWc1Lm00CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotZG5sIG1vZHVsZXMgZW5hYmxlZCBpbiB0aGlzIGRpcmVjdG9yeSBieSBkZWZhdWx0Ci0KLUFQQUNIRV9NT0RQQVRIX0lOSVQoZGF2L21haW4pCi0KLWRhdl9vYmplY3RzPSJtb2RfZGF2LmxvIHByb3BzLmxvIHV0aWwubG8gdXRpbF9sb2NrLmxvIGxpdmVwcm9wLmxvIHByb3ZpZGVycy5sbyBzdGRfbGl2ZXByb3AubG8iCi0KLWlmIHRlc3QgIiRlbmFibGVfaHR0cCIgPSAibm8iOyB0aGVuCi0gIGRhdl9lbmFibGU9bm8KLWVsc2UKLSAgZGF2X2VuYWJsZT1tb3N0Ci1maQotCi1BUEFDSEVfTU9EVUxFKGRhdiwgV2ViREFWIHByb3RvY29sIGhhbmRsaW5nLCAkZGF2X29iamVjdHMsICwgJGRhdl9lbmFibGUpCi0KLWlmIHRlc3QgIiRlbmFibGVfZGF2IiAhPSAibm8iOyB0aGVuCi0gIGFwYWNoZV9uZWVkX2V4cGF0PXllcwotCi0gIElOQ0xVREVTPSIkSU5DTFVERVMgLUlcJCh0b3Bfc3JjZGlyKS8kbW9kcGF0aF9jdXJyZW50IgotZmkKLQotCi1BUEFDSEVfTU9EUEFUSF9GSU5JU0gKZGlmZiAtLWdpdCBhL21vZHVsZXMvZGF2L21haW4vZGF2LmltcCBiL21vZHVsZXMvZGF2L21haW4vZGF2LmltcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI1YmZiNC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2Rhdi9tYWluL2Rhdi5pbXAKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0obW9kX2RhdikKLWRhdl9ob29rX2dhdGhlcl9wcm9wc2V0cywKLWRhdl9ob29rX2ZpbmRfbGl2ZXByb3AsCi1kYXZfaG9va19pbnNlcnRfYWxsX2xpdmVwcm9wcywKLWRhdl9uZXdfZXJyb3IsCi1kYXZfc2V0X2J1ZnNpemUsCi1kYXZfeG1sbnNfYWRkLAotZGF2X2NoZWNrX2J1ZnNpemUsCi1kYXZfcHVzaF9lcnJvciwKLWRhdl9idWZmZXJfaW5pdCwKLWRhdl9idWZmZXJfcGxhY2UsCi1kYXZfYnVmZmVyX2FwcGVuZCwKLWRhdl9hZGRfcmVzcG9uc2UsCi1kYXZfYnVmZmVyX3BsYWNlX21lbSwKLWRhdl9sb2NrX3F1ZXJ5LAotZGF2X2dldF9saXZlcHJvcF9pbmZvLAotZGF2X2RvX2ZpbmRfbGl2ZXByb3AsCi1kYXZfcmVnaXN0ZXJfbGl2ZXByb3BfZ3JvdXAsCi1kYXZfcmVnaXN0ZXJfcHJvdmlkZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL2Rhdi9tYWluL2xpdmVwcm9wLmMgYi9tb2R1bGVzL2Rhdi9tYWluL2xpdmVwcm9wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNzIwZmUuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9kYXYvbWFpbi9saXZlcHJvcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLSNpbmNsdWRlICJhcHJfcG9vbHMuaCIKLSNpbmNsdWRlICJhcHJfaGFzaC5oIgotI2luY2x1ZGUgImFwcl9lcnJuby5oIgotCi0jaW5jbHVkZSAiYXBfaG9va3MuaCIgICAvKiAjIyMgZm9yIGFwX2dsb2JhbF9ob29rX3Bvb2wgKi8KLSNpbmNsdWRlICJ1dGlsX3htbC5oIiAgIC8qIGZvciBhcF90ZXh0X2hlYWRlciAqLwotCi0jaW5jbHVkZSAibW9kX2Rhdi5oIgotCi0KLXN0YXRpYyBhcF9oYXNoX3QgKmRhdl9saXZlcHJvcF91cmlzID0gTlVMTDsKLXN0YXRpYyBpbnQgZGF2X2xpdmVwcm9wX2NvdW50ID0gMDsKLQotCi1zdGF0aWMgYXBfc3RhdHVzX3QgZGF2X2NsZWFudXBfbGl2ZXByb3BzKHZvaWQgKmN0eCkKLXsKLSAgICBkYXZfbGl2ZXByb3BfdXJpcyA9IE5VTEw7Ci0gICAgZGF2X2xpdmVwcm9wX2NvdW50ID0gMDsKLSAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci19Ci0KLXZvaWQgZGF2X3JlZ2lzdGVyX2xpdmVwcm9wX25hbWVzcGFjZShhcF9wb29sX3QgKnAsIGNvbnN0IGNoYXIgKnVyaSkKLXsKLSAgICBpbnQgdmFsdWU7Ci0KLSAgICAvKiAjIyMgaWdub3JlIHRoZSBwb29sOyBpdCBpcyBOVUxMIHJpZ2h0IG5vdyAqLwotICAgIHAgPSBhcF9nbG9iYWxfaG9va19wb29sOwotCi0gICAgaWYgKGRhdl9saXZlcHJvcF91cmlzID09IE5VTEwpIHsKLSAgICAgICAgZGF2X2xpdmVwcm9wX3VyaXMgPSBhcF9tYWtlX2hhc2gocCk7Ci0gICAgICAgIGFwX3JlZ2lzdGVyX2NsZWFudXAocCwgTlVMTCwgZGF2X2NsZWFudXBfbGl2ZXByb3BzLCBhcF9udWxsX2NsZWFudXApOwotICAgIH0KLQotICAgIHZhbHVlID0gKGludClhcF9oYXNoX2dldChkYXZfbGl2ZXByb3BfdXJpcywgdXJpLCAwKTsKLSAgICBpZiAodmFsdWUgIT0gMCkgewotICAgICAgICAvKiBhbHJlYWR5IHJlZ2lzdGVyZWQgKi8KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIHN0YXJ0IGF0IDEsIGFuZCBjb3VudCB1cCAqLwotICAgIGFwX2hhc2hfc2V0KGRhdl9saXZlcHJvcF91cmlzLCB1cmksIDAsICh2b2lkICopKytkYXZfbGl2ZXByb3BfY291bnQpOwotfQotCi1pbnQgZGF2X2dldF9saXZlcHJvcF9uc19pbmRleChjb25zdCBjaGFyICp1cmkpCi17Ci0gICAgcmV0dXJuIChpbnQpYXBfaGFzaF9nZXQoZGF2X2xpdmVwcm9wX3VyaXMsIHVyaSwgMCk7Ci19Ci0KLWludCBkYXZfZ2V0X2xpdmVwcm9wX25zX2NvdW50KHZvaWQpCi17Ci0gICAgcmV0dXJuIGRhdl9saXZlcHJvcF9jb3VudDsKLX0KLQotdm9pZCBkYXZfYWRkX2FsbF9saXZlcHJvcF94bWxucyhhcF9wb29sX3QgKnAsIGFwX3RleHRfaGVhZGVyICpwaGRyKQotewotICAgIGFwX2hhc2hfaW5kZXhfdCAqaWR4ID0gYXBfaGFzaF9maXJzdChkYXZfbGl2ZXByb3BfdXJpcyk7Ci0KLSAgICBmb3IgKCA7IGlkeCAhPSBOVUxMOyBpZHggPSBhcF9oYXNoX25leHQoaWR4KSApIHsKLSAgICAgICAgY29uc3Qgdm9pZCAqa2V5OwotICAgICAgICB2b2lkICp2YWw7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnM7Ci0KLSAgICAgICAgYXBfaGFzaF90aGlzKGlkeCwgJmtleSwgTlVMTCwgJnZhbCk7Ci0KLSAgICAgICAgcyA9IGFwX3BzcHJpbnRmKHAsICIgeG1sbnM6bHAlZD1cIiVzXCIiLCAoaW50KXZhbCwga2V5KTsKLSAgICAgICAgYXBfdGV4dF9hcHBlbmQocCwgcGhkciwgcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9kYXYvbWFpbi9tb2RfZGF2LmMgYi9tb2R1bGVzL2Rhdi9tYWluL21vZF9kYXYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ5OTk0YS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2Rhdi9tYWluL21vZF9kYXYuYworKysgL2Rldi9udWxsCkBAIC0xLDMzMTMgKzAsMCBAQAotLyoKLSoqIENvcHlyaWdodCAoQykgMTk5OC0yMDAwIEdyZWcgU3RlaW4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qKgotKiogQnkgdXNpbmcgdGhpcyBmaWxlLCB5b3UgYWdyZWUgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHNldCBmb3J0aCBpbgotKiogdGhlIExJQ0VOU0UuaHRtbCBmaWxlIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBtb2RfZGF2Ci0qKiBkaXN0cmlidXRpb24gb3IgYXQgaHR0cDovL3d3dy53ZWJkYXYub3JnL21vZF9kYXYvbGljZW5zZS0xLmh0bWwuCi0qKgotKiogQ29udGFjdCBpbmZvcm1hdGlvbjoKLSoqICAgR3JlZyBTdGVpbiwgUE8gQm94IDc2MCwgUGFsbyBBbHRvLCBDQSwgOTQzMDIKLSoqICAgZ3N0ZWluQGx5cmEub3JnLCBodHRwOi8vd3d3LndlYmRhdi5vcmcvbW9kX2Rhdi8KLSovCi0KLS8qCi0qKiBEQVYgZXh0ZW5zaW9uIG1vZHVsZSBmb3IgQXBhY2hlIDEuMy4qCi0qKiBUaGlzIG1vZHVsZSBpcyByZXBvc2l0b3J5LWluZGVwZW5kZW50LiBJdCBkZXBlbmRzIG9uIGhvb2tzIHByb3ZpZGVkIGJ5IGEKLSoqIHJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24uCi0qKgotKiogV3JpdHRlbiBieSBHcmVnIFN0ZWluLCBnc3RlaW5AbHlyYS5vcmcsIGh0dHA6Ly93d3cubHlyYS5vcmcvCi0qKgotKiogQVBBQ0hFIElTU1VFUzoKLSoqICAgLSB3aXRoaW4gYSBEQVYgaGllcmFyY2h5LCBpZiBhbiB1bmtub3duIG1ldGhvZCBpcyB1c2VkIGFuZCB3ZSBkZWZhdWx0Ci0qKiAgICAgdG8gQXBhY2hlJ3MgaW1wbGVtZW50YXRpb24sIGl0IHNlbmRzIGJhY2sgYW4gT1BUSU9OUyB3aXRoIHRoZSB3cm9uZwotKiogICAgIHNldCBvZiBtZXRob2RzIC0tIHRoZXJlIGlzIE5PIEhPT0sgZm9yIHVzLgotKiogICAgIHRoZXJlZm9yZTogd2UgbmVlZCB0byBtYW51YWxseSBoYW5kbGUgdGhlIEhUVFBfTUVUSE9EX05PVF9BTExPV0VECi0qKiAgICAgICBhbmQgSFRUUF9OT1RfSU1QTEVNRU5URUQgcmVzcG9uc2VzIChub3QgYXBfc2VuZF9lcnJvcl9yZXNwb25zZSkuCi0qKiAgIC0gcHJvY2Vzc19ta2NvbF9ib2R5KCkgaGFkIHRvIGR1cCBjb2RlIGZyb20gYXBfc2V0dXBfY2xpZW50X2Jsb2NrKCkuCi0qKiAgIC0gaXQgd291bGQgYmUgbmljZSB0byBnZXQgc3RhdHVzIGxpbmVzIGZyb20gQXBhY2hlIGZvciBhcmJpdHJhcnkKLSoqICAgICBzdGF0dXMgY29kZXMKLSoqICAgLSBpdCB3b3VsZCBiZSBuaWNlIHRvIGJlIGFibGUgdG8gZXh0ZW5kIEFwYWNoZSdzIHNldCBvZiByZXNwb25zZQotKiogICAgIGNvZGVzIHNvIHRoYXQgaXQgZG9lc24ndCByZXR1cm4gNTAwIHdoZW4gYW4gdW5rbm93biBjb2RlIGlzIHBsYWNlZAotKiogICAgIGludG8gci0+c3RhdHVzLgotKiogICAtIGh0dHBfdmhvc3QgZnVuY3Rpb25zIHNob3VsZCBhcHBseSAiY29uc3QiIHRvIHRoZWlyIHBhcmFtcwotKioKLSoqIERFU0lHTiBOT1RFUzoKLSoqICAgLSBGb3IgUFJPUEZJTkQsIHdlIGJhdGNoIHVwIHRoZSBlbnRpcmUgcmVzcG9uc2UgaW4gbWVtb3J5IGJlZm9yZQotKiogICAgIHNlbmRpbmcgaXQuIFdlIG1heSB3YW50IHRvIHJlb3JnYW5pemUgYXJvdW5kIHNlbmRpbmcgdGhlIGluZm9ybWF0aW9uCi0qKiAgICAgYXMgd2Ugc3VjayBpdCBpbiBmcm9tIHRoZSBwcm9wZGIuIEFsdGVybmF0aXZlbHksIHdlIHNob3VsZCBhdCBsZWFzdAotKiogICAgIGdlbmVyYXRlIGEgdG90YWwgQ29udGVudC1MZW5ndGggaWYgd2UncmUgZ29pbmcgdG8gYnVmZmVyIGluIG1lbW9yeQotKiogICAgIHNvIHRoYXQgd2UgY2FuIGtlZXAgdGhlIGNvbm5lY3Rpb24gb3Blbi4KLSovCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX21haW4uaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCi0jaW5jbHVkZSAidXRpbF9zY3JpcHQuaCIKLQotI2luY2x1ZGUgIm1vZF9kYXYuaCIKLQotI2luY2x1ZGUgImRhdl9vcGFxdWVsb2NrLmgiCi0KLQotZW51bSB7Ci0gICAgREFWX0VOQUJMRURfVU5TRVQgPSAwLAotICAgIERBVl9FTkFCTEVEX09GRiwKLSAgICBEQVZfRU5BQkxFRF9PTgotfTsKLQotLyogcGVyLWRpciBjb25maWd1cmF0aW9uICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50IGVuYWJsZWQ7Ci0gICAgY29uc3QgY2hhciAqZGlyOwotICAgIGludCBsb2NrdGltZW91dDsKLSAgICBpbnQgaGFuZGxlX2dldDsJCS8qIGNhY2hlZCBmcm9tIHJlcG9zaXRvcnkgaG9vayBzdHJ1Y3R1cmUgKi8KLSAgICBpbnQgYWxsb3dfZGVwdGhpbmZpbml0eTsKLSAgICBsb25nIGxpbWl0X3htbF9ib2R5OwotCi0gICAgdGFibGUgKmRfcGFyYW1zOwkJLyogcGVyLWRpcmVjdG9yeSBEQVYgY29uZmlnIHBhcmFtZXRlcnMgKi8KLSAgICBzdHJ1Y3QgZGF2X2R5bl9tb2RfY3R4ICpkbWM7Ci0KLSAgICBkYXZfZHluX2hvb2tzIHByb3BkYjsKLSAgICBkYXZfZHluX2hvb2tzIGxvY2tzOwotICAgIGRhdl9keW5faG9va3MgKmxpdmVwcm9wOwotICAgIGRhdl9keW5faG9va3MgcmVwb3NpdG9yeTsKLSAgICBkYXZfZHluX2hvb2tzIHZzbjsKLX0gZGF2X2Rpcl9jb25mOwotCi0vKiBwZXItc2VydmVyIGNvbmZpZ3VyYXRpb24gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjb25zdCBjaGFyICpsb2NrZGJfcGF0aDsJLyogbG9jayBkYXRhYmFzZSBwYXRoICovCi0KLSAgICB1dWlkX3N0YXRlIHN0OwkJLyogVVVJRCBzdGF0ZSBmb3Igb3BhcXVlbG9ja3Rva2VuICovCi0KLX0gZGF2X3NlcnZlcl9jb25mOwotCi0jZGVmaW5lIERBVl9JTkhFUklUX1ZBTFVFKHBhcmVudCwgY2hpbGQsIGZpZWxkKSBcCi0JCSgoY2hpbGQpLT5maWVsZCA/IChjaGlsZCktPmZpZWxkIDogKHBhcmVudCktPmZpZWxkKQotCi0vKiBMaW1pdFhNTFJlcXVlc3RCb2R5IGhhbmRsaW5nICovCi0jZGVmaW5lIERBVl9MSU1JVF9VTlNFVCAgICAgICAgICAgICAgICAgKChsb25nKSAtMSkKLSNkZWZpbmUgREFWX0RFRkFVTFRfTElNSVRfWE1MX0JPRFkgICAgICAoKHNpemVfdCkxMDAwMDAwKQotCi0KLS8qIGZvcndhcmQtZGVjbGFyZSBmb3IgdXNlIGluIGNvbmZpZ3VyYXRpb24gbG9va3VwICovCi1leHRlcm4gbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGRhdl9tb2R1bGU7Ci0KLS8qIGNvcHkgYSBtb2R1bGUncyBwcm92aWRlcnMgaW50byBvdXIgcGVyLWRpcmVjdG9yeSBjb25maWd1cmF0aW9uIHN0YXRlICovCi1zdGF0aWMgdm9pZCBkYXZfY29weV9wcm92aWRlcnMocG9vbCAqcCwgY29uc3QgY2hhciAqbmFtZSwgZGF2X2Rpcl9jb25mICpjb25mKQotewotICAgIGNvbnN0IGRhdl9keW5fbW9kdWxlICptb2Q7Ci0gICAgY29uc3QgZGF2X2R5bl9wcm92aWRlciAqcHJvdmlkZXI7Ci0gICAgZGF2X2R5bl9ob29rcyBob29rczsKLSAgICB2b2lkICpjdHg7Ci0KLSAgICBtb2QgPSBkYXZfZmluZF9tb2R1bGUobmFtZSk7Ci0gICAgLyogIyMjIGlmIE5VTEw/IG5lZWQgdG8gZXJyb3Igb3V0IHNvbWVob3cuLi4gKi8KLQotICAgIC8qIFNldCBob29rcyBmb3IgYW55IHByb3ZpZGVycyBpbiB0aGUgbW9kdWxlICovCi0gICAgY3R4ID0gZGF2X3ByZXBhcmVfc2NhbihwLCBtb2QpOwotICAgIGlmIChjdHggPT0gTlVMTCkgewotCS8qICMjIyBob3cgdG8gc2lnbmFsIGFuIGVycm9yPyAqLwotCXJldHVybjsKLSAgICB9Ci0KLSAgICB3aGlsZSAoIWRhdl9zY2FuX3Byb3ZpZGVycyhjdHgsICZwcm92aWRlciwgJmhvb2tzKSkgewotCi0Jc3dpdGNoIChwcm92aWRlci0+dHlwZSkgewotCi0JY2FzZSBEQVZfRFlOX1RZUEVfUFJPUERCOgotCSAgICBjb25mLT5wcm9wZGIgPSBob29rczsKLQkgICAgYnJlYWs7Ci0KLQljYXNlIERBVl9EWU5fVFlQRV9MT0NLUzoKLQkgICAgY29uZi0+bG9ja3MgPSBob29rczsKLQkgICAgYnJlYWs7Ci0KLQljYXNlIERBVl9EWU5fVFlQRV9RVUVSWV9HUkFNTUFSOgotCSAgICAvKiAjIyMgbm90IHlldCBkZWZpbmVkICovCi0JICAgIGJyZWFrOwotCi0JY2FzZSBEQVZfRFlOX1RZUEVfQUNMOgotCSAgICAvKiAjIyMgbm90IHlldCBkZWZpbmVkICovCi0JICAgIGJyZWFrOwotCi0JY2FzZSBEQVZfRFlOX1RZUEVfVlNOOgotCSAgICBjb25mLT52c24gPSBob29rczsKLQkgICAgYnJlYWs7Ci0KLQljYXNlIERBVl9EWU5fVFlQRV9SRVBPU0lUT1JZOgotCSAgICBjb25mLT5yZXBvc2l0b3J5ID0gaG9va3M7Ci0JICAgIGNvbmYtPmhhbmRsZV9nZXQgPSBEQVZfQVNfSE9PS1NfUkVQT1NJVE9SWSgmaG9va3MpLT5oYW5kbGVfZ2V0OwotCSAgICBicmVhazsKLQotCWNhc2UgREFWX0RZTl9UWVBFX0xJVkVQUk9QOgotCXsKLQkgICAgZGF2X2R5bl9ob29rcyAqZGRoID0gYXBfcGFsbG9jKHAsIHNpemVvZigqZGRoKSk7Ci0KLQkgICAgKmRkaCA9IGhvb2tzOwotCSAgICBkZGgtPm5leHQgPSBjb25mLT5saXZlcHJvcDsKLQkgICAgY29uZi0+bGl2ZXByb3AgPSBkZGg7Ci0JICAgIGJyZWFrOwotCX0KLQotCWRlZmF1bHQ6Ci0JICAgIC8qICMjIyBuZWVkIHRvIGVycm9yIG91dCBzb21laG93Li4uICovCi0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGRhdl9pbml0X2hhbmRsZXIoc2VydmVyX3JlYyAqcywgcG9vbCAqcCkKLXsKLSAgICAvKiBEQkcwKCJkYXZfaW5pdF9oYW5kbGVyIik7ICovCi0KLSAgICBhcF9hZGRfdmVyc2lvbl9jb21wb25lbnQoIkRBVi8iIERBVl9WRVJTSU9OKTsKLQotICAgIGRhdl9wcm9jZXNzX2J1aWx0aW5fbW9kdWxlcyhwKTsKLX0KLQotc3RhdGljIHZvaWQgKmRhdl9jcmVhdGVfc2VydmVyX2NvbmZpZyhwb29sICpwLCBzZXJ2ZXJfcmVjICpzKQotewotICAgIGRhdl9zZXJ2ZXJfY29uZiAqbmV3Y29uZjsKLQotICAgIG5ld2NvbmYgPSAoZGF2X3NlcnZlcl9jb25mICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKCpuZXdjb25mKSk7Ci0KLSAgICBuZXdjb25mLT5sb2NrZGJfcGF0aCA9IE5VTEw7Ci0gICAgZGF2X2NyZWF0ZV91dWlkX3N0YXRlKCZuZXdjb25mLT5zdCk7Ci0KLSAgICByZXR1cm4gbmV3Y29uZjsKLX0KLQotc3RhdGljIHZvaWQgKmRhdl9tZXJnZV9zZXJ2ZXJfY29uZmlnKHBvb2wgKnAsIHZvaWQgKmJhc2UsIHZvaWQgKm92ZXJyaWRlcykKLXsKLSAgICBkYXZfc2VydmVyX2NvbmYgKnBhcmVudCA9IGJhc2U7Ci0gICAgZGF2X3NlcnZlcl9jb25mICpjaGlsZCA9IG92ZXJyaWRlczsKLSAgICBkYXZfc2VydmVyX2NvbmYgKm5ld2NvbmY7Ci0KLSAgICBuZXdjb25mID0gKGRhdl9zZXJ2ZXJfY29uZiAqKSBhcF9wY2FsbG9jKHAsIHNpemVvZigqbmV3Y29uZikpOwotCi0gICAgbmV3Y29uZi0+bG9ja2RiX3BhdGggPSBEQVZfSU5IRVJJVF9WQUxVRShwYXJlbnQsIGNoaWxkLCBsb2NrZGJfcGF0aCk7Ci0KLSAgICBtZW1jcHkoJm5ld2NvbmYtPnN0LCAmY2hpbGQtPnN0LCBzaXplb2YobmV3Y29uZi0+c3QpKTsKLQotICAgIHJldHVybiBuZXdjb25mOwotfQotCi1zdGF0aWMgdm9pZCAqZGF2X2NyZWF0ZV9kaXJfY29uZmlnKHBvb2wgKnAsIGNoYXIgKmRpcikKLXsKLSAgICAvKiBOT1RFOiBkaXI9PU5VTEwgY3JlYXRlcyB0aGUgZGVmYXVsdCBwZXItZGlyIGNvbmZpZyAqLwotCi0gICAgZGF2X2Rpcl9jb25mICpjb25mOwotCi0gICAgY29uZiA9IChkYXZfZGlyX2NvbmYgKikgYXBfcGNhbGxvYyhwLCBzaXplb2YoKmNvbmYpKTsKLSAgICBjb25mLT5kaXIgPSBhcF9wc3RyZHVwKHAsIGRpcik7Ci0gICAgY29uZi0+ZF9wYXJhbXMgPSBhcF9tYWtlX3RhYmxlKHAsIDEpOwotICAgIGNvbmYtPmxpbWl0X3htbF9ib2R5ID0gREFWX0xJTUlUX1VOU0VUOwotCi0gICAgLyogREJHMSgiZGF2X2NyZWF0ZV9kaXJfY29uZmlnOiAlMDhseCIsIChsb25nKWNvbmYpOyAqLwotCi0gICAgLyoKLSAgICAqKiBMb2NhdGUgdGhlIGFwcHJvcHJpYXRlIG1vZHVsZSAoTlVMTCA9PSBkZWZhdWx0KSBhbmQgY29weSB0aGUgbW9kdWxlJ3MKLSAgICAqKiBwcm92aWRlcnMnIGhvb2tzIGludG8gb3VyIGNvbmZpZ3VyYXRpb24gc3RhdGUuCi0gICAgKi8KLSAgICBkYXZfY29weV9wcm92aWRlcnMocCwgTlVMTCwgY29uZik7Ci0KLSAgICByZXR1cm4gY29uZjsKLX0KLQotc3RhdGljIHZvaWQgKmRhdl9tZXJnZV9kaXJfY29uZmlnKHBvb2wgKnAsIHZvaWQgKmJhc2UsIHZvaWQgKm92ZXJyaWRlcykKLXsKLSAgICBkYXZfZGlyX2NvbmYgKnBhcmVudCA9IGJhc2U7Ci0gICAgZGF2X2Rpcl9jb25mICpjaGlsZCA9IG92ZXJyaWRlczsKLSAgICBkYXZfZGlyX2NvbmYgKm5ld2NvbmYgPSAoZGF2X2Rpcl9jb25mICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKCpuZXdjb25mKSk7Ci0KLSAgICAvKiBEQkczKCJkYXZfbWVyZ2VfZGlyX2NvbmZpZzogbmV3PSUwOGx4ICBiYXNlPSUwOGx4ICBvdmVycmlkZXM9JTA4bHgiLAotICAgICAgIChsb25nKW5ld2NvbmYsIChsb25nKWJhc2UsIChsb25nKW92ZXJyaWRlcyk7ICovCi0KLSAgICBuZXdjb25mLT5lbmFibGVkID0gREFWX0lOSEVSSVRfVkFMVUUocGFyZW50LCBjaGlsZCwgZW5hYmxlZCk7Ci0gICAgbmV3Y29uZi0+bG9ja3RpbWVvdXQgPSBEQVZfSU5IRVJJVF9WQUxVRShwYXJlbnQsIGNoaWxkLCBsb2NrdGltZW91dCk7Ci0gICAgbmV3Y29uZi0+ZGlyID0gREFWX0lOSEVSSVRfVkFMVUUocGFyZW50LCBjaGlsZCwgZGlyKTsKLSAgICBuZXdjb25mLT5hbGxvd19kZXB0aGluZmluaXR5ID0gREFWX0lOSEVSSVRfVkFMVUUocGFyZW50LCBjaGlsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfZGVwdGhpbmZpbml0eSk7Ci0KLSAgICBpZiAoY2hpbGQtPmxpbWl0X3htbF9ib2R5ICE9IERBVl9MSU1JVF9VTlNFVCkKLSAgICAgICAgbmV3Y29uZi0+bGltaXRfeG1sX2JvZHkgPSBjaGlsZC0+bGltaXRfeG1sX2JvZHk7Ci0gICAgZWxzZQotICAgICAgICBuZXdjb25mLT5saW1pdF94bWxfYm9keSA9IHBhcmVudC0+bGltaXRfeG1sX2JvZHk7Ci0KLSAgICBuZXdjb25mLT5kX3BhcmFtcyA9IGFwX2NvcHlfdGFibGUocCwgcGFyZW50LT5kX3BhcmFtcyk7Ci0gICAgYXBfb3ZlcmxhcF90YWJsZXMobmV3Y29uZi0+ZF9wYXJhbXMsIGNoaWxkLT5kX3BhcmFtcywKLQkJICAgICAgQVBfT1ZFUkxBUF9UQUJMRVNfU0VUKTsKLQotICAgIGlmIChjaGlsZC0+cHJvcGRiLmhvb2tzICE9IE5VTEwpCi0gICAgICAgIG5ld2NvbmYtPnByb3BkYiA9IGNoaWxkLT5wcm9wZGI7Ci0gICAgZWxzZQotICAgICAgICBuZXdjb25mLT5wcm9wZGIgPSBwYXJlbnQtPnByb3BkYjsKLSAgICAKLSAgICBpZiAoY2hpbGQtPmxvY2tzLmhvb2tzICE9IE5VTEwpCi0gICAgICAgIG5ld2NvbmYtPmxvY2tzID0gY2hpbGQtPmxvY2tzOwotICAgIGVsc2UKLSAgICAgICAgbmV3Y29uZi0+bG9ja3MgPSBwYXJlbnQtPmxvY2tzOwotCi0gICAgaWYgKGNoaWxkLT52c24uaG9va3MgIT0gTlVMTCkKLSAgICAgICAgbmV3Y29uZi0+dnNuID0gY2hpbGQtPnZzbjsKLSAgICBlbHNlCi0gICAgICAgIG5ld2NvbmYtPnZzbiA9IHBhcmVudC0+dnNuOwotCi0gICAgaWYgKGNoaWxkLT5yZXBvc2l0b3J5Lmhvb2tzICE9IE5VTEwpCi0gICAgICAgIG5ld2NvbmYtPnJlcG9zaXRvcnkgPSBjaGlsZC0+cmVwb3NpdG9yeTsKLSAgICBlbHNlCi0gICAgICAgIG5ld2NvbmYtPnJlcG9zaXRvcnkgPSBwYXJlbnQtPnJlcG9zaXRvcnk7Ci0gICAgbmV3Y29uZi0+aGFuZGxlX2dldCA9Ci0JbmV3Y29uZi0+cmVwb3NpdG9yeS5ob29rcyAhPSBOVUxMCi0JJiYgREFWX0FTX0hPT0tTX1JFUE9TSVRPUlkoJm5ld2NvbmYtPnJlcG9zaXRvcnkpLT5oYW5kbGVfZ2V0OwotCi0gICAgaWYgKGNoaWxkLT5saXZlcHJvcCAhPSBOVUxMKQotICAgICAgICBuZXdjb25mLT5saXZlcHJvcCA9IGNoaWxkLT5saXZlcHJvcDsKLSAgICBlbHNlCi0gICAgICAgIG5ld2NvbmYtPmxpdmVwcm9wID0gcGFyZW50LT5saXZlcHJvcDsKLQotICAgIHJldHVybiBuZXdjb25mOwotfQotCi11dWlkX3N0YXRlICpkYXZfZ2V0X3V1aWRfc3RhdGUoY29uc3QgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgZGF2X3NlcnZlcl9jb25mICpjb25mOwotCi0gICAgY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgJmRhdl9tb2R1bGUpOwotCi0gICAgcmV0dXJuICZjb25mLT5zdDsKLX0KLQotY29uc3QgY2hhciAqZGF2X2dldF9sb2NrZGJfcGF0aChjb25zdCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBkYXZfc2VydmVyX2NvbmYgKmNvbmY7Ci0KLSAgICBjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcoci0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCAmZGF2X21vZHVsZSk7Ci0gICAgcmV0dXJuIGNvbmYtPmxvY2tkYl9wYXRoOwotfQotCi10YWJsZSAqZGF2X2dldF9kaXJfcGFyYW1zKGNvbnN0IHJlcXVlc3RfcmVjICpyKQotewotICAgIGRhdl9kaXJfY29uZiAqY29uZjsKLQotICAgIGNvbmYgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywgJmRhdl9tb2R1bGUpOwotICAgIHJldHVybiBjb25mLT5kX3BhcmFtczsKLX0KLQotc2l6ZV90IGRhdl9nZXRfbGltaXRfeG1sX2JvZHkoY29uc3QgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgZGF2X2Rpcl9jb25mICpjb25mOwotCi0gICAgY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLCAmZGF2X21vZHVsZSk7Ci0gICAgaWYgKGNvbmYtPmxpbWl0X3htbF9ib2R5ID09IERBVl9MSU1JVF9VTlNFVCkKLSAgICAgICAgcmV0dXJuIERBVl9ERUZBVUxUX0xJTUlUX1hNTF9CT0RZOwotICAgIHJldHVybiAoc2l6ZV90KWNvbmYtPmxpbWl0X3htbF9ib2R5OwotfQotCi1jb25zdCBkYXZfZHluX2hvb2tzICpkYXZfZ2V0X3Byb3ZpZGVyX2hvb2tzKHJlcXVlc3RfcmVjICpyLCBpbnQgcHJvdmlkZXJfdHlwZSkKLXsKLSAgICBkYXZfZGlyX2NvbmYgKmNvbmY7Ci0gICAgY29uc3QgZGF2X2R5bl9ob29rcyAqaG9va3M7Ci0gICAgc3RhdGljIGNvbnN0IGRhdl9keW5faG9va3MgbnVsbF9ob29rcyA9IHsgeyAwIH0gfTsKLQotICAgIC8qIENhbGwgcmVwb3NpdG9yeSBob29rIHRvIHJlc29sdmUgcmVzb3VyY2UgKi8KLSAgICBjb25mID0gKGRhdl9kaXJfY29uZiAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywKLQkJCQkJCSAmZGF2X21vZHVsZSk7Ci0gICAgc3dpdGNoIChwcm92aWRlcl90eXBlKSB7Ci0KLSAgICBjYXNlIERBVl9EWU5fVFlQRV9QUk9QREI6Ci0gICAgICAgIGhvb2tzID0gJmNvbmYtPnByb3BkYjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERBVl9EWU5fVFlQRV9MT0NLUzoKLSAgICAgICAgaG9va3MgPSAmY29uZi0+bG9ja3M7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEQVZfRFlOX1RZUEVfUVVFUllfR1JBTU1BUjoKLSAgICAgICAgLyogIyMjIG5vdCB5ZXQgZGVmaW5lZCAqLwotICAgICAgICBob29rcyA9ICZudWxsX2hvb2tzOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgREFWX0RZTl9UWVBFX0FDTDoKLSAgICAgICAgLyogIyMjIG5vdCB5ZXQgZGVmaW5lZCAqLwotICAgICAgICBob29rcyA9ICZudWxsX2hvb2tzOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgREFWX0RZTl9UWVBFX1ZTTjoKLSAgICAgICAgaG9va3MgPSAmY29uZi0+dnNuOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgREFWX0RZTl9UWVBFX1JFUE9TSVRPUlk6Ci0gICAgICAgIGhvb2tzID0gJmNvbmYtPnJlcG9zaXRvcnk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEQVZfRFlOX1RZUEVfTElWRVBST1A6Ci0gICAgICAgIGhvb2tzID0gY29uZi0+bGl2ZXByb3A7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICAgLyogdW5rbm93biBwcm92aWRlciB0eXBlICovCi0gICAgICAgIGhvb2tzID0gJm51bGxfaG9va3M7Ci0JYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGhvb2tzOwotfQotCi0vKgotICogQ29tbWFuZCBoYW5kbGVyIGZvciB0aGUgREFWIGRpcmVjdGl2ZSwgd2hpY2ggaXMgRkxBRy4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmRhdl9jbWRfZGF2KGNtZF9wYXJtcyAqY21kLCB2b2lkICpjb25maWcsIGludCBhcmcpCi17Ci0gICAgZGF2X2Rpcl9jb25mICpjb25mID0gKGRhdl9kaXJfY29uZiAqKSBjb25maWc7Ci0KLSAgICBpZiAoYXJnKQotCWNvbmYtPmVuYWJsZWQgPSBEQVZfRU5BQkxFRF9PTjsKLSAgICBlbHNlCi0JY29uZi0+ZW5hYmxlZCA9IERBVl9FTkFCTEVEX09GRjsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIENvbW1hbmQgaGFuZGxlciBmb3IgdGhlIERBVkRlcHRoSW5maW5pdHkgZGlyZWN0aXZlLCB3aGljaCBpcyBGTEFHLgotICovCi1zdGF0aWMgY29uc3QgY2hhciAqZGF2X2NtZF9kYXZkZXB0aGluZmluaXR5KGNtZF9wYXJtcyAqY21kLCB2b2lkICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmcpCi17Ci0gICAgZGF2X2Rpcl9jb25mICpjb25mID0gKGRhdl9kaXJfY29uZiAqKSBjb25maWc7Ci0KLSAgICBpZiAoYXJnKQotCWNvbmYtPmFsbG93X2RlcHRoaW5maW5pdHkgPSBEQVZfRU5BQkxFRF9PTjsKLSAgICBlbHNlCi0JY29uZi0+YWxsb3dfZGVwdGhpbmZpbml0eSA9IERBVl9FTkFCTEVEX09GRjsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIENvbW1hbmQgaGFuZGxlciBmb3IgdGhlIERBVkxvY2tEQiBkaXJlY3RpdmUsIHdoaWNoIGlzIFRBS0UxCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpkYXZfY21kX2RhdmxvY2tkYihjbWRfcGFybXMgKmNtZCwgdm9pZCAqY29uZmlnLCBjaGFyICphcmcxKQotewotICAgIGRhdl9zZXJ2ZXJfY29uZiAqY29uZjsKLQotICAgIGNvbmYgPSAoZGF2X3NlcnZlcl9jb25mICopIGFwX2dldF9tb2R1bGVfY29uZmlnKGNtZC0+c2VydmVyLT5tb2R1bGVfY29uZmlnLAotCQkJCQkJICAgICZkYXZfbW9kdWxlKTsKLSAgICBhcmcxID0gYXBfb3NfY2Fub25pY2FsX2ZpbGVuYW1lKGNtZC0+cG9vbCwgYXJnMSk7Ci0gICAgY29uZi0+bG9ja2RiX3BhdGggPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShjbWQtPnBvb2wsIGFyZzEpOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBDb21tYW5kIGhhbmRsZXIgZm9yIERBVk1pblRpbWVvdXQgZGlyZWN0aXZlLCB3aGljaCBpcyBUQUtFMQotICovCi1zdGF0aWMgY29uc3QgY2hhciAqZGF2X2NtZF9kYXZtaW50aW1lb3V0KGNtZF9wYXJtcyAqY21kLCB2b2lkICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmFyZzEpCi17Ci0gICAgZGF2X2Rpcl9jb25mICpjb25mID0gKGRhdl9kaXJfY29uZiAqKSBjb25maWc7Ci0KLSAgICBjb25mLT5sb2NrdGltZW91dCA9IGF0b2koYXJnMSk7Ci0gICAgaWYgKGNvbmYtPmxvY2t0aW1lb3V0IDwgMCkKLSAgICAgICAgcmV0dXJuICJEQVZNaW5UaW1lb3V0IHJlcXVpcmVzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuIjsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi0vKgotICogQ29tbWFuZCBoYW5kbGVyIGZvciBEQVZQYXJhbSBkaXJlY3RpdmUsIHdoaWNoIGlzIFRBS0UyCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpkYXZfY21kX2RhdnBhcmFtKGNtZF9wYXJtcyAqY21kLCB2b2lkICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICphcmcxLCBjaGFyICphcmcyKQotewotICAgIGRhdl9kaXJfY29uZiAqY29uZiA9IChkYXZfZGlyX2NvbmYgKikgY29uZmlnOwotCi0gICAgYXBfdGFibGVfc2V0KGNvbmYtPmRfcGFyYW1zLCBhcmcxLCBhcmcyKTsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi0vKgotICogQ29tbWFuZCBoYW5kbGVyIGZvciBMaW1pdFhNTFJlcXVlc3RCb2R5IGRpcmVjdGl2ZSwgd2hpY2ggaXMgVEFLRTEKLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmRhdl9jbWRfbGltaXR4bWxyZXF1ZXN0Ym9keShjbWRfcGFybXMgKmNtZCwgdm9pZCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICphcmcxKQotewotICAgIGRhdl9kaXJfY29uZiAqY29uZiA9IChkYXZfZGlyX2NvbmYgKikgY29uZmlnOwotCi0gICAgY29uZi0+bGltaXRfeG1sX2JvZHkgPSBhdG9sKGFyZzEpOwotICAgIGlmIChjb25mLT5saW1pdF94bWxfYm9keSA8IDApCi0gICAgICAgIHJldHVybiAiTGltaXRYTUxSZXF1ZXN0Qm9keSByZXF1aXJlcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLiI7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoKLSoqIGRhdl9lcnJvcl9yZXNwb25zZSgpCi0qKgotKiogU2VuZCBhIG5pY2UgcmVzcG9uc2UgYmFjayB0byB0aGUgdXNlci4gSW4gbW9zdCBjYXNlcywgQXBhY2hlIGRvZXNuJ3QKLSoqIGFsbG93IHVzIHRvIHByb3ZpZGUgZGV0YWlscyBpbiB0aGUgYm9keSBhYm91dCB3aGF0IGhhcHBlbmVkLiBUaGlzCi0qKiBmdW5jdGlvbiBhbGxvd3MgdXMgdG8gY29tcGxldGVseSBzcGVjaWZ5IHRoZSByZXNwb25zZSBib2R5LgotKi8KLXN0YXRpYyBpbnQgZGF2X2Vycm9yX3Jlc3BvbnNlKHJlcXVlc3RfcmVjICpyLCBpbnQgc3RhdHVzLCBjb25zdCBjaGFyICpib2R5KQotewotICAgIHItPnN0YXR1cyA9IHN0YXR1czsKLSAgICByLT5jb250ZW50X3R5cGUgPSAidGV4dC9odG1sIjsKLQotICAgIC8qIHNpbmNlIHdlJ3JlIHJldHVybmluZyBET05FLCBlbnN1cmUgdGhlIHJlcXVlc3QgYm9keSBpcyBjb25zdW1lZC4gKi8KLSAgICAodm9pZCkgYXBfZGlzY2FyZF9yZXF1ZXN0X2JvZHkocik7Ci0KLSAgICAvKiBiZWdpbiB0aGUgcmVzcG9uc2Ugbm93Li4uICovCi0gICAgYXBfc2VuZF9odHRwX2hlYWRlcihyKTsKLQotICAgIC8qICMjIyBoYXJkIG9yIHNvZnQ/ICovCi0gICAgYXBfc29mdF90aW1lb3V0KCJzZW5kIGVycm9yIGJvZHkiLCByKTsKLQotICAgIGFwX3J2cHV0cyhyLAotCSAgICAgIERBVl9SRVNQT05TRV9CT0RZXzEsCi0JICAgICAgci0+c3RhdHVzX2xpbmUsCi0JICAgICAgREFWX1JFU1BPTlNFX0JPRFlfMiwKLQkgICAgICAmci0+c3RhdHVzX2xpbmVbNF0sCi0JICAgICAgREFWX1JFU1BPTlNFX0JPRFlfMywKLQkgICAgICBOVUxMKTsKLQotICAgIGFwX3JwdXRzKGJvZHksIHIpOwotCi0gICAgYXBfcnB1dHMoYXBfcHNpZ25hdHVyZSgiXG48UD48SFI+XG4iLCByKSwgcik7Ci0gICAgYXBfcnB1dHMoREFWX1JFU1BPTlNFX0JPRFlfNCwgcik7Ci0KLSAgICBhcF9raWxsX3RpbWVvdXQocik7Ci0KLSAgICAvKiB0aGUgcmVzcG9uc2UgaGFzIGJlZW4gc2VudC4gKi8KLSAgICAvKgotICAgICAqICMjIyBVc2Ugb2YgRE9ORSBvYnZpYXRlcyBsb2dnaW5nLi4hCi0gICAgICovCi0gICAgcmV0dXJuIERPTkU7Ci19Ci0KLS8qCi0qKiBBcGFjaGUncyBVUkkgZXNjYXBpbmcgZG9lcyBub3QgcmVwbGFjZSAnJicgc2luY2UgdGhhdCBpcyBhIHZhbGlkIGNoYXJhY3RlcgotKiogaW4gYSBVUkkgKHRvIGZvcm0gYSBxdWVyeSBzZWN0aW9uKS4gV2UgbXVzdCBleHBsaWNpdGx5IGhhbmRsZSBpdCBzbyB0aGF0Ci0qKiB3ZSBjYW4gZW1iZWQgdGhlIFVSSSBpbnRvIGFuIFhNTCBkb2N1bWVudC4KLSovCi1zdGF0aWMgY29uc3QgY2hhciAqZGF2X3htbF9lc2NhcGVfdXJpKHBvb2wgKnAsIGNvbnN0IGNoYXIgKnVyaSkKLXsKLSAgICBjb25zdCBjaGFyICplX3VyaSA9IGFwX2VzY2FwZV91cmkocCwgdXJpKTsKLQotICAgIC8qIGNoZWNrIHRoZSBlYXN5IGNhc2UuLi4gKi8KLSAgICBpZiAoc3RyY2hyKGVfdXJpLCAnJicpID09IE5VTEwpCi0JcmV0dXJuIGVfdXJpOwotCi0gICAgLyogbW9yZSB3b3JrIG5lZWRlZC4uLiBzaWdoLiAqLwotCi0gICAgLyoKLSAgICAqKiBOb3RlOiB0aGlzIGlzIGEgdGVlbnkgYml0IG9mIG92ZXJraWxsIHNpbmNlIHdlIGtub3cgdGhlcmUgYXJlIG5vCi0gICAgKiogJzwnIG9yICc+JyBjaGFyYWN0ZXJzLCBidXQgd2hvIGNhcmVzLgotICAgICovCi0gICAgcmV0dXJuIGRhdl9xdW90ZV9zdHJpbmcocCwgZV91cmksIDApOwotfQotCi1zdGF0aWMgdm9pZCBkYXZfc2VuZF9tdWx0aXN0YXR1cyhyZXF1ZXN0X3JlYyAqciwgaW50IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdl9yZXNwb25zZSAqZmlyc3QsCi0JCQkJIGFycmF5X2hlYWRlciAqbmFtZXNwYWNlcykKLXsKLSAgICAvKiBTZXQgdGhlIGNvcnJlY3Qgc3RhdHVzIGFuZCBDb250ZW50LVR5cGUgKi8KLSAgICByLT5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgci0+Y29udGVudF90eXBlID0gREFWX1hNTF9DT05URU5UX1RZUEU7Ci0KLSAgICAvKiBTZW5kIGFsbCBvZiB0aGUgaGVhZGVycyBub3cgKi8KLSAgICBhcF9zZW5kX2h0dHBfaGVhZGVyKHIpOwotCi0gICAgLyogU3RhcnQgYSB0aW1lb3V0IGZvciBkZWxpdmVyaW5nIHRoZSByZXNwb25zZS4gKi8KLSAgICBhcF9zb2Z0X3RpbWVvdXQoInNlbmRpbmcgbXVsdGlzdGF0dXMgcmVzcG9uc2UiLCByKTsKLQotICAgIC8qIFNlbmQgdGhlIGFjdHVhbCBtdWx0aXN0YXR1cyByZXNwb25zZSBub3cuLi4gKi8KLSAgICBhcF9ycHV0cyhEQVZfWE1MX0hFQURFUiBERUJVR19DUgotCSAgICAgIjxEOm11bHRpc3RhdHVzIHhtbG5zOkQ9XCJEQVY6XCIiLCByKTsKLQotICAgIGlmIChuYW1lc3BhY2VzICE9IE5VTEwpIHsKLQlpbnQgaTsKLQotCWZvciAoaSA9IG5hbWVzcGFjZXMtPm5lbHRzOyBpLS07ICkgewotCSAgICBhcF9ycHJpbnRmKHIsICIgeG1sbnM6bnMlZD1cIiVzXCIiLCBpLAotCQkgICAgICAgREFWX0dFVF9VUklfSVRFTShuYW1lc3BhY2VzLCBpKSk7Ci0JfQotICAgIH0KLQotICAgIC8qIGFwX3JwdXRjKCc+Jywgcik7ICovCi0gICAgYXBfcnB1dHMoIj4iIERFQlVHX0NSLCByKTsKLQotICAgIGZvciAoOyBmaXJzdCAhPSBOVUxMOyBmaXJzdCA9IGZpcnN0LT5uZXh0KSB7Ci0JZGF2X3RleHQgKnQ7Ci0KLQlpZiAoZmlyc3QtPnByb3ByZXN1bHQueG1sbnMgPT0gTlVMTCkgewotCSAgICBhcF9ycHV0cygiPEQ6cmVzcG9uc2U+Iiwgcik7Ci0JfQotCWVsc2UgewotCSAgICBhcF9ycHV0cygiPEQ6cmVzcG9uc2UiLCByKTsKLQkgICAgZm9yICh0ID0gZmlyc3QtPnByb3ByZXN1bHQueG1sbnM7IHQ7IHQgPSB0LT5uZXh0KSB7Ci0JCWFwX3JwdXRzKHQtPnRleHQsIHIpOwotCSAgICB9Ci0JICAgIGFwX3JwdXRjKCc+Jywgcik7Ci0JfQotCi0JYXBfcnB1dHMoREVCVUdfQ1IgIjxEOmhyZWY+Iiwgcik7Ci0JYXBfcnB1dHMoZGF2X3htbF9lc2NhcGVfdXJpKHItPnBvb2wsIGZpcnN0LT5ocmVmKSwgcik7Ci0JYXBfcnB1dHMoIjwvRDpocmVmPiIgREVCVUdfQ1IsIHIpOwotCi0JaWYgKGZpcnN0LT5wcm9wcmVzdWx0LnByb3BzdGF0cyA9PSBOVUxMKSB7Ci0JICAgIC8qICMjIyBpdCB3b3VsZCBiZSBuaWNlIHRvIGdldCBhIHN0YXR1cyBsaW5lIGZyb20gQXBhY2hlICovCi0JICAgIGFwX3JwcmludGYociwKLQkJICAgICAgICI8RDpzdGF0dXM+SFRUUC8xLjEgJWQgc3RhdHVzIHRleHQgZ29lcyBoZXJlPC9EOnN0YXR1cz4iCi0JCSAgICAgICBERUJVR19DUiwgZmlyc3QtPnN0YXR1cyk7Ci0JfQotCWVsc2UgewotCSAgICAvKiBhc3N1bWUgdGhpcyBpbmNsdWRlcyA8cHJvcHN0YXQ+IGFuZCBpcyBxdW90ZWQgcHJvcGVybHkgKi8KLQkgICAgZm9yICh0ID0gZmlyc3QtPnByb3ByZXN1bHQucHJvcHN0YXRzOyB0OyB0ID0gdC0+bmV4dCkgewotCQlhcF9ycHV0cyh0LT50ZXh0LCByKTsKLQkgICAgfQotCX0KLQotCWlmIChmaXJzdC0+ZGVzYyAhPSBOVUxMKSB7Ci0JICAgIC8qCi0JICAgICoqIFdlIHN1cHBseSB0aGUgZGVzY3JpcHRpb24sIHNvIHdlIGtub3cgaXQgZG9lc24ndCBoYXZlIHRvCi0JICAgICoqIGhhdmUgYW55IGVzY2FwaW5nL2VuY29kaW5nIGFwcGxpZWQgdG8gaXQuCi0JICAgICovCi0JICAgIGFwX3JwdXRzKCI8RDpyZXNwb25zZWRlc2NyaXB0aW9uPiIsIHIpOwotCSAgICBhcF9ycHV0cyhmaXJzdC0+ZGVzYywgcik7Ci0JICAgIGFwX3JwdXRzKCI8L0Q6cmVzcG9uc2VkZXNjcmlwdGlvbj4iIERFQlVHX0NSLCByKTsKLQl9Ci0KLQlhcF9ycHV0cygiPC9EOnJlc3BvbnNlPiIgREVCVUdfQ1IsIHIpOwotICAgIH0KLQotICAgIGFwX3JwdXRzKCI8L0Q6bXVsdGlzdGF0dXM+IiBERUJVR19DUiwgcik7Ci0KLSAgICAvKiBEb25lIHdpdGggc2VuZGluZyBhbmQgdGhlIHRpbWVvdXQuICovCi0gICAgYXBfa2lsbF90aW1lb3V0KHIpOwotfQotCi0vKgotKiogZGF2X2xvZ19lcnIoKQotKioKLSoqIFdyaXRlIGVycm9yIGluZm9ybWF0aW9uIHRvIHRoZSBsb2cuCi0qLwotc3RhdGljIHZvaWQgZGF2X2xvZ19lcnIocmVxdWVzdF9yZWMgKnIsIGRhdl9lcnJvciAqZXJyLCBpbnQgbGV2ZWwpCi17Ci0gICAgZGF2X2Vycm9yICplcnJzY2FuOwotCi0gICAgLyogTG9nIHRoZSBlcnJvcnMgKi8KLSAgICAvKiAjIyMgc2hvdWxkIGhhdmUgYSBkaXJlY3RpdmUgdG8gbG9nIHRoZSBmaXJzdCBvciBhbGwgKi8KLSAgICBmb3IgKGVycnNjYW4gPSBlcnI7IGVycnNjYW4gIT0gTlVMTDsgZXJyc2NhbiA9IGVycnNjYW4tPnByZXYpIHsKLQlpZiAoZXJyc2Nhbi0+ZGVzYyA9PSBOVUxMKQotCSAgICBjb250aW51ZTsKLQlpZiAoZXJyc2Nhbi0+c2F2ZV9lcnJubyAhPSAwKSB7Ci0JICAgIGVycm5vID0gZXJyc2Nhbi0+c2F2ZV9lcnJubzsKLQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBsZXZlbCwgciwgIiVzICBbJWQsICMlZF0iLAotCQkJICBlcnJzY2FuLT5kZXNjLCBlcnJzY2FuLT5zdGF0dXMsIGVycnNjYW4tPmVycm9yX2lkKTsKLQl9Ci0JZWxzZSB7Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgbGV2ZWwgfCBBUExPR19OT0VSUk5PLCByLAotCQkJICAiJXMgIFslZCwgIyVkXSIsCi0JCQkgIGVycnNjYW4tPmRlc2MsIGVycnNjYW4tPnN0YXR1cywgZXJyc2Nhbi0+ZXJyb3JfaWQpOwotCX0KLSAgICB9Ci19Ci0KLS8qCi0qKiBkYXZfaGFuZGxlX2VycigpCi0qKgotKiogSGFuZGxlIHRoZSBzdGFuZGFyZCBlcnJvciBwcm9jZXNzaW5nLiA8ZXJyPiBtdXN0IGJlIG5vbi1OVUxMLgotKioKLSoqIDxyZXNwb25zZT4gaXMgc2V0IGJ5IHRoZSBmb2xsb3dpbmc6Ci0qKiAgIC0gZGF2X3ZhbGlkYXRlX3JlcXVlc3QoKQotKiogICAtIGRhdl9hZGRfbG9jaygpCi0qKiAgIC0gcmVwb3NfaG9va3MtPnJlbW92ZV9yZXNvdXJjZQotKiogICAtIHJlcG9zX2hvb2tzLT5tb3ZlX3Jlc291cmNlCi0qKiAgIC0gcmVwb3NfaG9va3MtPmNvcHlfcmVzb3VyY2UKLSovCi1zdGF0aWMgaW50IGRhdl9oYW5kbGVfZXJyKHJlcXVlc3RfcmVjICpyLCBkYXZfZXJyb3IgKmVyciwKLQkJCSAgZGF2X3Jlc3BvbnNlICpyZXNwb25zZSkKLXsKLSAgICAvKiBsb2cgdGhlIGVycm9ycyAqLwotICAgIGRhdl9sb2dfZXJyKHIsIGVyciwgQVBMT0dfRVJSKTsKLQotICAgIGlmIChyZXNwb25zZSA9PSBOVUxMKSB7Ci0JLyogb3VyIGVycm9yIG1lc3NhZ2VzIGFyZSBzYWZlOyB0ZWxsIEFwYWNoZSB0aGlzICovCi0JYXBfdGFibGVfc2V0bihyLT5ub3RlcywgInZlcmJvc2UtZXJyb3ItdG8iLCAiKiIpOwotCXJldHVybiBlcnItPnN0YXR1czsKLSAgICB9Ci0KLSAgICAvKiBzaW5jZSB3ZSdyZSByZXR1cm5pbmcgRE9ORSwgZW5zdXJlIHRoZSByZXF1ZXN0IGJvZHkgaXMgY29uc3VtZWQuICovCi0gICAgKHZvaWQpIGFwX2Rpc2NhcmRfcmVxdWVzdF9ib2R5KHIpOwotCi0gICAgLyogc2VuZCB0aGUgbXVsdGlzdGF0dXMgYW5kIHRlbGwgQXBhY2hlIHRoZSByZXF1ZXN0L3Jlc3BvbnNlIGlzIERPTkUuICovCi0gICAgZGF2X3NlbmRfbXVsdGlzdGF0dXMociwgZXJyLT5zdGF0dXMsIHJlc3BvbnNlLCBOVUxMKTsKLSAgICByZXR1cm4gRE9ORTsKLX0KLQotLyogaGFuZHkgZnVuY3Rpb24gZm9yIHJldHVybiB2YWx1ZXMgb2YgbWV0aG9kcyB0aGF0IChtYXkpIGNyZWF0ZSB0aGluZ3MgKi8KLXN0YXRpYyBpbnQgZGF2X2NyZWF0ZWQocmVxdWVzdF9yZWMgKnIsIHJlcXVlc3RfcmVjICpybmV3LCAKLSAgICAgICAgICAgICAgICAgICAgICAgZGF2X3Jlc291cmNlICpyZXMsIGNvbnN0IGNoYXIgKndoYXQsCi0JCSAgICAgICBpbnQgcmVwbGFjZWQpCi17Ci0gICAgY29uc3QgY2hhciAqYm9keTsKLQotICAgIGlmIChybmV3ID09IE5VTEwpIHsKLQlybmV3ID0gcjsKLSAgICB9Ci0KLSAgICAvKiBkaWQgdGhlIHRhcmdldCByZXNvdXJjZSBhbHJlYWR5IGV4aXN0PyAqLwotICAgIGlmIChyZXBsYWNlZCkgewotCS8qIEFwYWNoZSB3aWxsIHN1cHBseSBhIGRlZmF1bHQgbWVzc2FnZSAqLwotCXJldHVybiBIVFRQX05PX0NPTlRFTlQ7Ci0gICAgfQotCi0gICAgLyogUGVyIEhUVFAvMS4xLCBTMTAuMi4yOiBhZGQgYSBMb2NhdGlvbiBoZWFkZXIgdG8gY29udGFpbiB0aGUKLSAgICAgKiBVUkkgdGhhdCB3YXMgY3JlYXRlZC4gKi8KLQotICAgIC8qICMjIyBybmV3LT51cmkgZG9lcyBub3QgY29udGFpbiBhbiBhYnNvbHV0ZVVSSS4gUzE0LjMwIHN0YXRlcyB0aGF0Ci0gICAgICogIyMjIHRoZSBMb2NhdGlvbiBoZWFkZXIgcmVxdWlyZXMgYW4gYWJzb2x1dGVVUkkuIHdoZXJlIHRvIGdldCBpdD8gKi8KLSAgICAvKiAjIyMgZGlzYWJsZSB1bnRpbCB3ZSBnZXQgdGhlIHJpZ2h0IHZhbHVlICovCi0jaWYgMAotICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJMb2NhdGlvbiIsIHJuZXctPnVyaSk7Ci0jZW5kaWYKLQotICAgIC8qICMjIyBpbnNlcnQgYW4gRVRhZyBoZWFkZXI/IHNlZSBIVFRQLzEuMSBTMTAuMi4yICovCi0KLSAgICAvKiBBcGFjaGUgZG9lc24ndCBhbGxvdyB1cyB0byBzZXQgYSB2YXJpYWJsZSBib2R5IGZvciBIVFRQX0NSRUFURUQsIHNvCi0gICAgICogd2UgbXVzdCBtYW51ZmFjdHVyZSB0aGUgZW50aXJlIHJlc3BvbnNlLiAqLwotICAgIGJvZHkgPSBhcF9wc3ByaW50ZihyLT5wb29sLCAiJXMgJXMgaGFzIGJlZW4gY3JlYXRlZC4iLAotCQkgICAgICAgd2hhdCwKLQkJICAgICAgIGFwX2VzY2FwZV9odG1sKHJuZXctPnBvb2wsIHJuZXctPnVyaSkpOwotICAgIHJldHVybiBkYXZfZXJyb3JfcmVzcG9uc2UociwgSFRUUF9DUkVBVEVELCBib2R5KTsKLX0KLQotLyogIyMjIG1vdmUgdG8gZGF2X3V0aWw/ICovCi1pbnQgZGF2X2dldF9kZXB0aChyZXF1ZXN0X3JlYyAqciwgaW50IGRlZl9kZXB0aCkKLXsKLSAgICBjb25zdCBjaGFyICpkZXB0aCA9IGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiRGVwdGgiKTsKLQotICAgIGlmIChkZXB0aCA9PSBOVUxMKSB7Ci0JcmV0dXJuIGRlZl9kZXB0aDsKLSAgICB9Ci0gICAgaWYgKHN0cmNhc2VjbXAoZGVwdGgsICJpbmZpbml0eSIpID09IDApIHsKLQlyZXR1cm4gREFWX0lORklOSVRZOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjbXAoZGVwdGgsICIwIikgPT0gMCkgewotCXJldHVybiAwOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjbXAoZGVwdGgsICIxIikgPT0gMCkgewotCXJldHVybiAxOwotICAgIH0KLQotICAgIC8qIFRoZSBjYWxsZXIgd2lsbCByZXR1cm4gYW4gSFRUUF9CQURfUkVRVUVTVC4gVGhpcyB3aWxsIGF1Z21lbnQgdGhlCi0gICAgICogZGVmYXVsdCBtZXNzYWdlIHRoYXQgQXBhY2hlIHByb3ZpZGVzLiAqLwotICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSIHwgQVBMT0dfTk9FUlJOTywgciwKLQkJICAiQW4gaW52YWxpZCBEZXB0aCBoZWFkZXIgd2FzIHNwZWNpZmllZC4iKTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgZGF2X2dldF9vdmVyd3JpdGUocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY29uc3QgY2hhciAqb3ZlcndyaXRlID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJPdmVyd3JpdGUiKTsKLQotICAgIGlmIChvdmVyd3JpdGUgPT0gTlVMTCkgewotCXJldHVybiAxOwkJLyogZGVmYXVsdCBpcyAiVCIgKi8KLSAgICB9Ci0KLSAgICBpZiAoKCpvdmVyd3JpdGUgPT0gJ0YnIHx8ICpvdmVyd3JpdGUgPT0gJ2YnKSAmJiBvdmVyd3JpdGVbMV0gPT0gJ1wwJykgewotCXJldHVybiAwOwotICAgIH0KLSAgICBpZiAoKCpvdmVyd3JpdGUgPT0gJ1QnIHx8ICpvdmVyd3JpdGUgPT0gJ3QnKSAmJiBvdmVyd3JpdGVbMV0gPT0gJ1wwJykgewotCXJldHVybiAxOwotICAgIH0KLQotICAgIC8qIFRoZSBjYWxsZXIgd2lsbCByZXR1cm4gYW4gSFRUUF9CQURfUkVRVUVTVC4gVGhpcyB3aWxsIGF1Z21lbnQgdGhlCi0gICAgICogZGVmYXVsdCBtZXNzYWdlIHRoYXQgQXBhY2hlIHByb3ZpZGVzLiAqLwotICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSIHwgQVBMT0dfTk9FUlJOTywgciwKLQkJICAiQW4gaW52YWxpZCBPdmVyd3JpdGUgaGVhZGVyIHdhcyBzcGVjaWZpZWQuIik7Ci0gICAgcmV0dXJuIC0xOwotfQotCi0vKiByZXNvbHZlIGEgcmVxdWVzdCBVUkkgdG8gYSByZXNvdXJjZSBkZXNjcmlwdG9yICovCi1zdGF0aWMgaW50IGRhdl9nZXRfcmVzb3VyY2UocmVxdWVzdF9yZWMgKnIsIGRhdl9yZXNvdXJjZSAqKnJlc19wKQotewotICAgIGRhdl9kaXJfY29uZiAqY29uZjsKLSAgICBjb25zdCBkYXZfaG9va3NfcmVwb3NpdG9yeSAqcmVwb3NfaG9va3M7Ci0KLSAgICAvKiBDYWxsIHJlcG9zaXRvcnkgaG9vayB0byByZXNvbHZlIHJlc291cmNlICovCi0gICAgY29uZiA9IChkYXZfZGlyX2NvbmYgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCQkgJmRhdl9tb2R1bGUpOwotCi0gICAgcmVwb3NfaG9va3MgPSBEQVZfQVNfSE9PS1NfUkVQT1NJVE9SWSgmY29uZi0+cmVwb3NpdG9yeSk7Ci0gICAgaWYgKHJlcG9zX2hvb2tzID09IE5VTEwgfHwgcmVwb3NfaG9va3MtPmdldF9yZXNvdXJjZSA9PSBOVUxMKSB7Ci0JLyogIyMjIHRoaXMgc2hvdWxkIGhhcHBlbiBhdCBzdGFydHVwIHJhdGhlciB0aGFuIHBlci1yZXF1ZXN0ICovCi0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIgfCBBUExPR19OT0VSUk5PLCByLAotICAgICAgICAgICAgICAgICAgICAgICJObyAlcyBoYXMgYmVlbiBjb25maWd1cmVkLiIsCi0gICAgICAgICAgICAgICAgICAgICAgcmVwb3NfaG9va3MgPT0gTlVMTAotICAgICAgICAgICAgICAgICAgICAgID8gInJlcG9zaXRvcnkgbW9kdWxlIgotICAgICAgICAgICAgICAgICAgICAgIDogIkdFVCBoYW5kbGVyIik7Ci0gICAgICAgIHJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICB9Ci0KLSAgICAqcmVzX3AgPSAoKnJlcG9zX2hvb2tzLT5nZXRfcmVzb3VyY2UpKHIsIGNvbmYtPmRpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdl9nZXRfdGFyZ2V0X3NlbGVjdG9yKHIpKTsKLSAgICBpZiAoKnJlc19wID09IE5VTEwpIHsKLQkvKiBBcGFjaGUgd2lsbCBzdXBwbHkgYSBkZWZhdWx0IGVycm9yIGZvciB0aGlzLiAqLwotICAgICAgICByZXR1cm4gSFRUUF9OT1RfRk9VTkQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0aWMgZGF2X2Vycm9yICogZGF2X29wZW5fbG9ja2RiKHJlcXVlc3RfcmVjICpyLCBpbnQgcm8sIGRhdl9sb2NrZGIgKipsb2NrZGIpCi17Ci0gICAgY29uc3QgZGF2X2hvb2tzX2xvY2tzICpob29rcyA9IERBVl9HRVRfSE9PS1NfTE9DS1Mocik7Ci0KLSAgICBpZiAoaG9va3MgPT0gTlVMTCkgewotCSpsb2NrZGIgPSBOVUxMOwotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8qIG9wZW4gdGhlIHRoaW5nIGxhemlseSAqLwotICAgIHJldHVybiAoKmhvb2tzLT5vcGVuX2xvY2tkYikociwgcm8sIDAsIGxvY2tkYik7Ci19Ci0KLXN0YXRpYyBpbnQgZGF2X3BhcnNlX3JhbmdlKHJlcXVlc3RfcmVjICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX3QgKnJhbmdlX3N0YXJ0LCBvZmZfdCAqcmFuZ2VfZW5kKQotewotICAgIGNvbnN0IGNoYXIgKnJhbmdlOwotICAgIGNoYXIgKmRhc2g7Ci0gICAgY2hhciAqc2xhc2g7Ci0KLSAgICByYW5nZSA9IGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiY29udGVudC1yYW5nZSIpOwotICAgIGlmIChyYW5nZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHJhbmdlID0gYXBfcHN0cmR1cChyLT5wb29sLCByYW5nZSk7Ci0gICAgaWYgKHN0cm5jYXNlY21wKHJhbmdlLCAiYnl0ZXMgIiwgNikgIT0gMAotICAgICAgICB8fCAoZGFzaCA9IHN0cmNocihyYW5nZSwgJy0nKSkgPT0gTlVMTAotICAgICAgICB8fCAoc2xhc2ggPSBzdHJjaHIocmFuZ2UsICcvJykpID09IE5VTEwpIHsKLSAgICAgICAgLyogbWFsZm9ybWVkIGhlYWRlci4gaWdub3JlIGl0IChwZXIgUzE0LjE2IG9mIFJGQzI2MTYpICovCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgICpkYXNoID0gKnNsYXNoID0gJ1wwJzsKLSAgICAqcmFuZ2Vfc3RhcnQgPSBhdG9sKHJhbmdlICsgNik7Ci0gICAgKnJhbmdlX2VuZCA9IGF0b2woZGFzaCArIDEpOwotICAgIGlmICgqcmFuZ2VfZW5kIDwgKnJhbmdlX3N0YXJ0Ci0gICAgICAgIHx8IChzbGFzaFsxXSAhPSAnKicgJiYgYXRvbChzbGFzaCArIDEpIDw9ICpyYW5nZV9lbmQpKSB7Ci0gICAgICAgIC8qIGludmFsaWQgcmFuZ2UuIGlnbm9yZSBpdCAocGVyIFMxNC4xNiBvZiBSRkMyNjE2KSAqLwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiB3ZSBub3cgaGF2ZSBhIHZhbGlkIHJhbmdlICovCi0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qIGhhbmRsZSB0aGUgR0VUIG1ldGhvZCAqLwotc3RhdGljIGludCBkYXZfbWV0aG9kX2dldChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBkYXZfcmVzb3VyY2UgKnJlc291cmNlOwotICAgIGludCByZXN1bHQ7Ci0KLSAgICAvKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgcmVzb3VyY2UgaXMgbm90Ci0gICAgICogdmlzaWJsZSB0byBBcGFjaGUuIFdlIHdpbGwgZmV0Y2ggdGhlIHJlc291cmNlIGZyb20gdGhlIHJlcG9zaXRvcnksCi0gICAgICogdGhlbiBjcmVhdGUgYSBzdWJyZXF1ZXN0IGZvciBBcGFjaGUgdG8gaGFuZGxlLgotICAgICAqLwotICAgIHJlc3VsdCA9IGRhdl9nZXRfcmVzb3VyY2UociwgJnJlc291cmNlKTsKLSAgICBpZiAocmVzdWx0ICE9IE9LKQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIGlmICghcmVzb3VyY2UtPmV4aXN0cykgewotICAgICAgICAvKiBBcGFjaGUgd2lsbCBzdXBwbHkgYSBkZWZhdWx0IGVycm9yIGZvciB0aGlzLiAqLwotICAgICAgICByZXR1cm4gSFRUUF9OT1RfRk9VTkQ7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgcmVzb3VyY2UgdHlwZSAqLwotICAgIGlmIChyZXNvdXJjZS0+dHlwZSAhPSBEQVZfUkVTT1VSQ0VfVFlQRV9SRUdVTEFSICYmCi0gICAgICAgIHJlc291cmNlLT50eXBlICE9IERBVl9SRVNPVVJDRV9UWVBFX1JFVklTSU9OKSB7Ci0gICAgICAgIHJldHVybiBkYXZfZXJyb3JfcmVzcG9uc2UociwgSFRUUF9DT05GTElDVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IEdFVCB0aGlzIHR5cGUgb2YgcmVzb3VyY2UuIik7Ci0gICAgfQotCi0gICAgLyogQ2Fubm90IGhhbmRsZSBHRVQgb2YgYSBjb2xsZWN0aW9uIGZyb20gYSByZXBvc2l0b3J5ICovCi0gICAgaWYgKHJlc291cmNlLT5jb2xsZWN0aW9uKSB7Ci0JcmV0dXJuIGRhdl9lcnJvcl9yZXNwb25zZShyLCBIVFRQX0NPTkZMSUNULCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gZGVmYXVsdCByZXNwb25zZSB0byBHRVQgZm9yIGEgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xsZWN0aW9uLiIpOwotICAgIH0KLQotICAgIC8qCi0gICAgKiogV2UgY2FuIHVzZSB0d28gZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGEgR0VULgotICAgICoqCi0gICAgKiogMSkgZ2V0X3BhdGhuYW1lIHdpbGwgcmV0dXJuIGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdoaWNoIHNob3VsZCBiZQotICAgICoqICAgIHNlbnQgdG8gdGhlIGNsaWVudC4gSWYgdGhlIHJlcG9zaXRvcnkgcHJvdmlkZXMgdGhpcywgdGhlbiB3ZQotICAgICoqICAgIHVzZSBpdC4KLSAgICAqKgotICAgICoqICAgIFRoaXMgaXMgdGhlIGJlc3QgYWx0ZXJuYXRpdmUgc2luY2UgaXQgYWxsb3dzIHVzIHRvIGRvIGEgc3ViLQotICAgICoqICAgIHJlcXVlc3Qgb24gdGhlIGZpbGUsIHdoaWNoIGdpdmVzIHRoZSBBcGFjaGUgZnJhbWV3b3JrIGEgY2hhbmNlCi0gICAgKiogICAgdG8gZGVhbCB3aXRoIG5lZ290aWF0aW9uLCBNSU1FIHR5cGVzLCBvciB3aGF0ZXZlci4KLSAgICAqKgotICAgICoqIDIpIG9wZW5fc3RyZWFtIGFuZCByZWFkX3N0cmVhbS4KLSAgICAqLwotICAgIGlmIChyZXNvdXJjZS0+aG9va3MtPmdldF9wYXRobmFtZSAhPSBOVUxMKSB7Ci0JY29uc3QgY2hhciAqcGF0aG5hbWU7Ci0Jdm9pZCAqZmhhbmRsZTsKLQlyZXF1ZXN0X3JlYyAqbmV3X3JlcTsKLQkKLQkvKiBBc2sgcmVwb3NpdG9yeSBmb3IgY29weSBvZiBmaWxlICovCi0JcGF0aG5hbWUgPSAoKnJlc291cmNlLT5ob29rcy0+Z2V0X3BhdGhuYW1lKShyZXNvdXJjZSwgJmZoYW5kbGUpOwotCWlmIChwYXRobmFtZSA9PSBOVUxMKSB7Ci0JICAgIHJldHVybiBIVFRQX05PVF9GT1VORDsKLQl9Ci0KLQkvKiBDb252ZXJ0IHRvIGNhbm9uaWNhbCBmaWxlbmFtZSwgc28gQXBhY2hlIGRldGVjdHMgY29tcG9uZW50Ci0JICogc2VwYXJhdG9ycyAob24gV2luZG93cywgaXQgb25seSBsb29rcyBmb3IgJy8nLCBub3QgJ1wnKQotCSAqLwotCXBhdGhuYW1lID0gYXBfb3NfY2FzZV9jYW5vbmljYWxfZmlsZW5hbWUoci0+cG9vbCwgcGF0aG5hbWUpOwotCi0JLyogQ3JlYXRlIGEgc3ViLXJlcXVlc3Qgd2l0aCB0aGUgbmV3IGZpbGVuYW1lICovCi0JbmV3X3JlcSA9IGFwX3N1Yl9yZXFfbG9va3VwX2ZpbGUocGF0aG5hbWUsIHIpOwotCWlmIChuZXdfcmVxID09IE5VTEwpIHsKLQkgICAgKCpyZXNvdXJjZS0+aG9va3MtPmZyZWVfZmlsZSkoZmhhbmRsZSk7Ci0JICAgIHJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLQl9Ci0KLQkvKiBUaGlzIG1heSBiZSBhIEhFQUQgcmVxdWVzdCAqLwotCW5ld19yZXEtPmhlYWRlcl9vbmx5ID0gci0+aGVhZGVyX29ubHk7Ci0KLQkvKiAjIyMgdGhpcyBlbmFibGVzIGhlYWRlciBnZW5lcmF0aW9uICovCi0JbmV3X3JlcS0+YXNzYmFja3dhcmRzID0gMDsKLQotCS8qIFJ1biB0aGUgc3ViLXJlcXVlc3QgKi8KLQlyZXN1bHQgPSBhcF9ydW5fc3ViX3JlcShuZXdfcmVxKTsKLQlhcF9kZXN0cm95X3N1Yl9yZXEobmV3X3JlcSk7Ci0KLQkvKiBGcmVlIHJlc291cmNlcyAqLwotCSgqcmVzb3VyY2UtPmhvb2tzLT5mcmVlX2ZpbGUpKGZoYW5kbGUpOwotCi0JcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JZGF2X3N0cmVhbV9tb2RlIG1vZGU7Ci0JZGF2X3N0cmVhbSAqc3RyZWFtOwotCWRhdl9lcnJvciAqZXJyOwotCXZvaWQgKmJ1ZmZlcjsKLSAgICAgICAgaW50IGhhc19yYW5nZTsKLSAgICAgICAgb2ZmX3QgcmFuZ2Vfc3RhcnQ7Ci0gICAgICAgIG9mZl90IHJhbmdlX2VuZDsKLQotCS8qIHNldCB1cCB0aGUgSFRUUCBoZWFkZXJzIGZvciB0aGUgcmVzcG9uc2UgKi8KLQlpZiAoKGVyciA9ICgqcmVzb3VyY2UtPmhvb2tzLT5zZXRfaGVhZGVycykociwgcmVzb3VyY2UpKSAhPSBOVUxMKSB7Ci0JICAgIGVyciA9IGRhdl9wdXNoX2Vycm9yKHItPnBvb2wsIGVyci0+c3RhdHVzLCAwLAotCQkJCSAiVW5hYmxlIHRvIHNldCB1cCBIVFRQIGhlYWRlcnMuIiwKLQkJCQkgZXJyKTsKLQkgICAgcmV0dXJuIGRhdl9oYW5kbGVfZXJyKHIsIGVyciwgTlVMTCk7Ci0JfQotCi0gICAgICAgIC8qIHVzZSBwbGFpbiBSRUFEIG1vZGUgdW5sZXNzIHdlIHNlZSBhIENvbnRlbnQtUmFuZ2UgKi8KLQltb2RlID0gREFWX01PREVfUkVBRDsKLQotICAgICAgICAvKiBwcm9jZXNzIHRoZSBDb250ZW50LVJhbmdlIGhlYWRlciAoaWYgcHJlc2VudCkgKi8KLSAgICAgICAgaGFzX3JhbmdlID0gZGF2X3BhcnNlX3JhbmdlKHIsICZyYW5nZV9zdGFydCwgJnJhbmdlX2VuZCk7Ci0gICAgICAgIGlmIChoYXNfcmFuZ2UpIHsKLSAgICAgICAgICAgIC8qIHVzZSBhIHJlYWQgbW9kZSB3aGljaCBpcyBzZWVrYWJsZSAqLwotICAgICAgICAgICAgbW9kZSA9IERBVl9NT0RFX1JFQURfU0VFS0FCTEU7Ci0KLSAgICAgICAgICAgIC8qIHByZXAgdGhlIG91dHB1dCAqLwotICAgICAgICAgICAgci0+c3RhdHVzID0gSFRUUF9QQVJUSUFMX0NPTlRFTlQ7Ci0gICAgICAgICAgICBhcF90YWJsZV9zZXRuKHItPmhlYWRlcnNfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29udGVudC1SYW5nZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFwX3BzcHJpbnRmKHItPnBvb2wsICJieXRlcyAlbGQtJWxkLyoiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9zdGFydCwgcmFuZ2VfZW5kKSk7Ci0gICAgICAgICAgICBhcF9zZXRfY29udGVudF9sZW5ndGgociwgcmFuZ2VfZW5kIC0gcmFuZ2Vfc3RhcnQgKyAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyLT5oZWFkZXJfb25seSkgewotICAgICAgICAgICAgYXBfc2VuZF9odHRwX2hlYWRlcihyKTsKLSAgICAgICAgICAgIHJldHVybiBET05FOwotICAgICAgICB9Ci0KLQlpZiAoKGVyciA9ICgqcmVzb3VyY2UtPmhvb2tzLT5vcGVuX3N0cmVhbSkocmVzb3VyY2UsIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtKSkgIT0gTlVMTCkgewotCSAgICAvKiAjIyMgYXNzdW1pbmcgRk9SQklEREVOIGlzIHByb2JhYmx5IG5vdCBxdWl0ZSByaWdodC4uLiAqLwotCSAgICBlcnIgPSBkYXZfcHVzaF9lcnJvcihyLT5wb29sLCBIVFRQX0ZPUkJJRERFTiwgMCwKLQkJCQkgYXBfcHNwcmludGYoci0+cG9vbCwKLQkJCQkJICAgICAiVW5hYmxlIHRvIEdFVCBjb250ZW50cyBmb3IgJXMuIiwKLQkJCQkJICAgICBhcF9lc2NhcGVfaHRtbChyLT5wb29sLCByLT51cmkpKSwKLQkJCQkgZXJyKTsKLQkgICAgcmV0dXJuIGRhdl9oYW5kbGVfZXJyKHIsIGVyciwgTlVMTCk7Ci0JfQotCi0gICAgICAgIGlmIChoYXNfcmFuZ2UKLSAgICAgICAgICAgICYmIChlcnIgPSAoKnJlc291cmNlLT5ob29rcy0+c2Vla19zdHJlYW0pKHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlX3N0YXJ0KSkgIT0gTlVMTCkgewotICAgICAgICAgICAgZXJyID0gZGF2X3B1c2hfZXJyb3Ioci0+cG9vbCwgZXJyLT5zdGF0dXMsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNlZWsgdG8gYmVnaW5uaW5nIG9mIHRoZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BlY2lmaWVkIENvbnRlbnQtUmFuZ2UuIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBkYXZfaGFuZGxlX2VycihyLCBlcnIsIE5VTEwpOwotICAgICAgICB9Ci0KLQkvKiBhbGwgc2V0LiBzZW5kIHRoZSBoZWFkZXJzIG5vdy4gKi8KLQlhcF9zZW5kX2h0dHBfaGVhZGVyKHIpOwotCi0JLyogc3RhcnQgYSB0aW1lb3V0IGZvciBkZWxpdmVyaW5nIHRoZSByZXNwb25zZS4gKi8KLQlhcF9zb2Z0X3RpbWVvdXQoInNlbmRpbmcgR0VUIHJlc3BvbnNlIiwgcik7Ci0KLQlidWZmZXIgPSBhcF9wYWxsb2Moci0+cG9vbCwgREFWX1JFQURfQkxPQ0tTSVpFKTsKLQl3aGlsZSAoMSkgewotCSAgICBzaXplX3QgYW10OwotCi0gICAgICAgICAgICBpZiAoIWhhc19yYW5nZSkKLSAgICAgICAgICAgICAgICBhbXQgPSBEQVZfUkVBRF9CTE9DS1NJWkU7Ci0gICAgICAgICAgICBlbHNlIGlmICgocmFuZ2VfZW5kIC0gcmFuZ2Vfc3RhcnQgKyAxKSA+IERBVl9SRUFEX0JMT0NLU0laRSkKLSAgICAgICAgICAgICAgICBhbXQgPSBEQVZfUkVBRF9CTE9DS1NJWkU7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBub3RlOiByYW5nZV9lbmQgLSByYW5nZV9zdGFydCBpcyBhbiBzc2l6ZV90ICovCi0gICAgICAgICAgICAgICAgYW10ID0gKHNpemVfdCkocmFuZ2VfZW5kIC0gcmFuZ2Vfc3RhcnQgKyAxKTsKLSAgICAgICAgICAgIH0KLQotCSAgICBpZiAoKGVyciA9ICgqcmVzb3VyY2UtPmhvb2tzLT5yZWFkX3N0cmVhbSkoc3RyZWFtLCBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFtdCkpICE9IE5VTEwpIHsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgaWYgKGFtdCA9PSAwKSB7Ci0JCS8qIG5vIG1vcmUgY29udGVudCAqLwotCQlicmVhazsKLQkgICAgfQotCSAgICBpZiAoYXBfcndyaXRlKGJ1ZmZlciwgYW10LCByKSA8IDApIHsKLQkJLyogIyMjIHdoYXQgdG8gZG8gd2l0aCB0aGlzIGVycm9yPyAqLwotCQlicmVhazsKLQkgICAgfQotCi0gICAgICAgICAgICBpZiAoaGFzX3JhbmdlKSB7Ci0gICAgICAgICAgICAgICAgcmFuZ2Vfc3RhcnQgKz0gYW10OwotICAgICAgICAgICAgICAgIGlmIChyYW5nZV9zdGFydCA+IHJhbmdlX2VuZCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLQkgICAgLyogcmVzZXQgdGhlIHRpbWVvdXQgYWZ0ZXIgYSBzdWNjZXNzZnVsIHdyaXRlICovCi0JICAgIGFwX3Jlc2V0X3RpbWVvdXQocik7Ci0JfQotCi0JLyogRG9uZSB3aXRoIHRoZSByZXF1ZXN0OyBjbGVhciBpdHMgdGltZW91dCAqLwotCWFwX2tpbGxfdGltZW91dChyKTsKLQotCWlmIChlcnIgIT0gTlVMTCkKLQkgICAgcmV0dXJuIGRhdl9oYW5kbGVfZXJyKHIsIGVyciwgTlVMTCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgKiogIyMjIHJhbmdlX3N0YXJ0IHNob3VsZCBlcXVhbCByYW5nZV9lbmQrMS4gaWYgaXQgZG9lc24ndCwgdGhlbgotICAgICAgICAqKiAjIyMgd2UgZGlkIG5vdCBzZW5kIGVub3VnaCBkYXRhIHRvIHRoZSBjbGllbnQuIHRoZSBjbGllbnQgd2lsbAotICAgICAgICAqKiAjIyMgaGFuZyAoYW5kIHRpbWVvdXQpIHdhaXRpbmcgZm9yIHRoZSBkYXRhLgotICAgICAgICAqKgotICAgICAgICAqKiAjIyMgd2hhdCB0byBkbz8gYWJvcnQgdGhlIGNvbm5lY3Rpb24/Ci0gICAgICAgICovCi0JcmV0dXJuIERPTkU7Ci0gICAgfQotCi0gICAgLyogTk9UUkVBQ0hFRCAqLwotfQotCi0vKiB2YWxpZGF0ZSByZXNvdXJjZSBvbiBQT1NULCB0aGVuIHBhc3MgaXQgb2ZmIHRvIHRoZSBkZWZhdWx0IGhhbmRsZXIgKi8KLXN0YXRpYyBpbnQgZGF2X21ldGhvZF9wb3N0KHJlcXVlc3RfcmVjICpyKQotewotICAgIGRhdl9yZXNvdXJjZSAqcmVzb3VyY2U7Ci0gICAgZGF2X2Vycm9yICplcnI7Ci0gICAgaW50IHJlc3VsdDsKLQotICAgIC8qIEFzayByZXBvc2l0b3J5IG1vZHVsZSB0byByZXNvbHZlIHRoZSByZXNvdXJjZSAqLwotICAgIHJlc3VsdCA9IGRhdl9nZXRfcmVzb3VyY2UociwgJnJlc291cmNlKTsKLSAgICBpZiAocmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyogTm90ZTogZGVwdGggPT0gMC4gSW1wbGllcyBubyBuZWVkIGZvciBhIG11bHRpc3RhdHVzIHJlc3BvbnNlLiAqLwotICAgIGlmICgoZXJyID0gZGF2X3ZhbGlkYXRlX3JlcXVlc3QociwgcmVzb3VyY2UsIDAsIE5VTEwsIE5VTEwsCi0JCQkJICAgIERBVl9WQUxJREFURV9SRVNPVVJDRSwgTlVMTCkpICE9IE5VTEwpIHsKLQkvKiAjIyMgYWRkIGEgaGlnaGVyLWxldmVsIGRlc2NyaXB0aW9uPyAqLwotCXJldHVybiBkYXZfaGFuZGxlX2VycihyLCBlcnIsIE5VTEwpOwotICAgIH0KLQotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotLyogaGFuZGxlIHRoZSBQVVQgbWV0aG9kICovCi1zdGF0aWMgaW50IGRhdl9tZXRob2RfcHV0KHJlcXVlc3RfcmVjICpyKQotewotICAgIGRhdl9yZXNvdXJjZSAqcmVzb3VyY2U7Ci0gICAgaW50IHJlc291cmNlX3N0YXRlOwotICAgIGRhdl9yZXNvdXJjZSAqcmVzb3VyY2VfcGFyZW50OwotICAgIGNvbnN0IGRhdl9ob29rc19sb2NrcyAqbG9ja3NfaG9va3MgPSBEQVZfR0VUX0hPT0tTX0xPQ0tTKHIpOwotICAgIGNvbnN0IGNoYXIgKmJvZHk7Ci0gICAgZGF2X2Vycm9yICplcnI7Ci0gICAgZGF2X2Vycm9yICplcnIyOwotICAgIGludCByZXN1bHQ7Ci0gICAgaW50IHJlc291cmNlX2V4aXN0ZWQgPSAwOwotICAgIGludCByZXNvdXJjZV93YXNfd3JpdGFibGUgPSAwOwotICAgIGludCBwYXJlbnRfd2FzX3dyaXRhYmxlID0gMDsKLSAgICBkYXZfc3RyZWFtX21vZGUgbW9kZTsKLSAgICBkYXZfc3RyZWFtICpzdHJlYW07Ci0gICAgZGF2X3Jlc3BvbnNlICptdWx0aV9yZXNwb25zZTsKLSAgICBpbnQgaGFzX3JhbmdlOwotICAgIG9mZl90IHJhbmdlX3N0YXJ0OwotICAgIG9mZl90IHJhbmdlX2VuZDsKLQotICAgIGlmICgocmVzdWx0ID0gYXBfc2V0dXBfY2xpZW50X2Jsb2NrKHIsIFJFUVVFU1RfQ0hVTktFRF9ERUNIVU5LKSkgIT0gT0spIHsKLQlyZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qIEFzayByZXBvc2l0b3J5IG1vZHVsZSB0byByZXNvbHZlIHRoZSByZXNvdXJjZSAqLwotICAgIHJlc3VsdCA9IGRhdl9nZXRfcmVzb3VyY2UociwgJnJlc291cmNlKTsKLSAgICBpZiAocmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyogSWYgbm90IGEgZmlsZSBvciBjb2xsZWN0aW9uIHJlc291cmNlLCBQVVQgbm90IGFsbG93ZWQgKi8KLSAgICBpZiAocmVzb3VyY2UtPnR5cGUgIT0gREFWX1JFU09VUkNFX1RZUEVfUkVHVUxBUikgewotICAgICAgICBib2R5ID0gYXBfcHNwcmludGYoci0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIHJlc291cmNlICVzIHdpdGggUFVULiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9lc2NhcGVfaHRtbChyLT5wb29sLCByLT51cmkpKTsKLQlyZXR1cm4gZGF2X2Vycm9yX3Jlc3BvbnNlKHIsIEhUVFBfQ09ORkxJQ1QsIGJvZHkpOwotICAgIH0KLQotICAgIC8qIENhbm5vdCBQVVQgYSBjb2xsZWN0aW9uICovCi0gICAgaWYgKHJlc291cmNlLT5jb2xsZWN0aW9uKSB7Ci0JcmV0dXJuIGRhdl9lcnJvcl9yZXNwb25zZShyLCBIVFRQX0NPTkZMSUNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgUFVUIHRvIGEgY29sbGVjdGlvbi4iKTsKLQotICAgIH0KLQotICAgIHJlc291cmNlX3N0YXRlID0gZGF2X2dldF9yZXNvdXJjZV9zdGF0ZShyLCByZXNvdXJjZSk7Ci0KLSAgICAvKgotICAgICoqIE5vdGU6IGRlcHRoID09IDAgbm9ybWFsbHkgcmVxdWlyZXMgbm8gbXVsdGlzdGF0dXMgcmVzcG9uc2UuIEhvd2V2ZXIsCi0gICAgKiogaWYgd2UgcGFzcyBEQVZfVkFMSURBVEVfUEFSRU5ULCB0aGVuIHdlIGNvdWxkIGdldCBhbiBlcnJvciBvbiBhIFVSSQotICAgICoqIG90aGVyIHRoYW4gdGhlIFJlcXVlc3QtVVJJLCB0aGVyZWJ5IHJlcXVpcmluZyBhIG11bHRpc3RhdHVzLgotICAgICoqCi0gICAgKiogSWYgdGhlIHJlc291cmNlIGRvZXMgbm90IGV4aXN0IChEQVZfUkVTT1VSQ0VfTlVMTCksIHRoZW4gd2UgbXVzdAotICAgICoqIGNoZWNrIHRoZSByZXNvdXJjZSAqYW5kKiBpdHMgcGFyZW50LiBJZiB0aGUgcmVzb3VyY2UgZXhpc3RzIG9yIGlzCi0gICAgKiogYSBsb2NrbnVsbCByZXNvdXJjZSwgdGhlbiB3ZSBjaGVjayBvbmx5IHRoZSByZXNvdXJjZS4KLSAgICAqLwotICAgIGlmICgoZXJyID0gZGF2X3ZhbGlkYXRlX3JlcXVlc3QociwgcmVzb3VyY2UsIDAsIE5VTEwsICZtdWx0aV9yZXNwb25zZSwKLQkJCQkgICAgcmVzb3VyY2Vfc3RhdGUgPT0gREFWX1JFU09VUkNFX05VTEwgPwotCQkJCSAgICBEQVZfVkFMSURBVEVfUEFSRU5UIDoKLQkJCQkgICAgREFWX1ZBTElEQVRFX1JFU09VUkNFLCBOVUxMKSkgIT0gTlVMTCkgewotCS8qICMjIyBhZGQgYSBoaWdoZXItbGV2ZWwgZGVzY3JpcHRpb24/ICovCi0JcmV0dXJuIGRhdl9oYW5kbGVfZXJyKHIsIGVyciwgbXVsdGlfcmVzcG9uc2UpOwotICAgIH0KLQotICAgIC8qIG1ha2Ugc3VyZSB0aGUgcmVzb3VyY2UgY2FuIGJlIG1vZGlmaWVkIChpZiB2ZXJzaW9uaW5nIHJlcG9zaXRvcnkpICovCi0gICAgaWYgKChlcnIgPSBkYXZfZW5zdXJlX3Jlc291cmNlX3dyaXRhYmxlKHIsIHJlc291cmNlLAotCQkJCQkgICAgMCAvKiBub3QgcGFyZW50X29ubHkgKi8sCi0JCQkJCSAgICAmcmVzb3VyY2VfcGFyZW50LAotCQkJCQkgICAgJnJlc291cmNlX2V4aXN0ZWQsCi0JCQkJCSAgICAmcmVzb3VyY2Vfd2FzX3dyaXRhYmxlLAotCQkJCQkgICAgJnBhcmVudF93YXNfd3JpdGFibGUpKSAhPSBOVUxMKSB7Ci0JLyogIyMjIGFkZCBhIGhpZ2hlci1sZXZlbCBkZXNjcmlwdGlvbj8gKi8KLQlyZXR1cm4gZGF2X2hhbmRsZV9lcnIociwgZXJyLCBOVUxMKTsKLSAgICB9Ci0KLSAgICAvKiB0cnVuY2F0ZSBhbmQgcmV3cml0ZSB0aGUgZmlsZSB1bmxlc3Mgd2Ugc2VlIGEgQ29udGVudC1SYW5nZSAqLwotICAgIG1vZGUgPSBEQVZfTU9ERV9XUklURV9UUlVOQzsKLQotICAgIGhhc19yYW5nZSA9IGRhdl9wYXJzZV9yYW5nZShyLCAmcmFuZ2Vfc3RhcnQsICZyYW5nZV9lbmQpOwotICAgIGlmIChoYXNfcmFuZ2UpIHsKLSAgICAgICAgbW9kZSA9IERBVl9NT0RFX1dSSVRFX1NFRUtBQkxFOwotICAgIH0KLQotICAgIC8qIENyZWF0ZSB0aGUgbmV3IGZpbGUgaW4gdGhlIHJlcG9zaXRvcnkgKi8KLSAgICBpZiAoKGVyciA9ICgqcmVzb3VyY2UtPmhvb2tzLT5vcGVuX3N0cmVhbSkocmVzb3VyY2UsIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW0pKSAhPSBOVUxMKSB7Ci0JLyogIyMjIGFzc3VtaW5nIEZPUkJJRERFTiBpcyBwcm9iYWJseSBub3QgcXVpdGUgcmlnaHQuLi4gKi8KLQllcnIgPSBkYXZfcHVzaF9lcnJvcihyLT5wb29sLCBIVFRQX0ZPUkJJRERFTiwgMCwKLQkJCSAgICAgYXBfcHNwcmludGYoci0+cG9vbCwKLQkJCQkJICJVbmFibGUgdG8gUFVUIG5ldyBjb250ZW50cyBmb3IgJXMuIiwKLQkJCQkJIGFwX2VzY2FwZV9odG1sKHItPnBvb2wsIHItPnVyaSkpLAotCQkJICAgICBlcnIpOwotICAgIH0KLQotICAgIGlmIChlcnIgPT0gTlVMTCAmJiBoYXNfcmFuZ2UpIHsKLSAgICAgICAgLyogYSByYW5nZSB3YXMgcHJvdmlkZWQuIHNlZWsgdG8gdGhlIHN0YXJ0ICovCi0gICAgICAgIGVyciA9ICgqcmVzb3VyY2UtPmhvb2tzLT5zZWVrX3N0cmVhbSkoc3RyZWFtLCByYW5nZV9zdGFydCk7Ci0gICAgfQotCi0gICAgaWYgKGVyciA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChhcF9zaG91bGRfY2xpZW50X2Jsb2NrKHIpKSB7Ci0JICAgIGNoYXIgKmJ1ZmZlciA9IGFwX3BhbGxvYyhyLT5wb29sLCBEQVZfUkVBRF9CTE9DS1NJWkUpOwotCSAgICBsb25nIGxlbjsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICoqIE9uY2Ugd2Ugc3RhcnQgcmVhZGluZyB0aGUgcmVxdWVzdCwgdGhlbiB3ZSBtdXN0IHJlYWQgdGhlCi0gICAgICAgICAgICAqKiB3aG9sZSBkYXJuIHRoaW5nLiBhcF9kaXNjYXJkX3JlcXVlc3RfYm9keSgpIHdvbid0IGRvIGFueXRoaW5nCi0gICAgICAgICAgICAqKiBmb3IgYSBwYXJ0aWFsbHktcmVhZCByZXF1ZXN0LgotICAgICAgICAgICAgKi8KLQotCSAgICB3aGlsZSAoKGxlbiA9IGFwX2dldF9jbGllbnRfYmxvY2sociwgYnVmZmVyLAotCQkJCQkgICAgICBEQVZfUkVBRF9CTE9DS1NJWkUpKSA+IDApIHsKLQkJaWYgKGVyciA9PSBOVUxMKSB7Ci0JCSAgICAvKiB3cml0ZSB3aGF0ZXZlciB3ZSByZWFkLCB1bnRpbCB3ZSBzZWUgYW4gZXJyb3IgKi8KLQkJICAgIGVyciA9ICgqcmVzb3VyY2UtPmhvb2tzLT53cml0ZV9zdHJlYW0pKHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBsZW4pOwotCQl9Ci0JICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICoqICMjIyB3aGF0IGhhcHBlbnMgaWYgd2UgcmVhZCBtb3JlL2xlc3MgdGhhbiB0aGUgYW1vdW50Ci0gICAgICAgICAgICAqKiAjIyMgc3BlY2lmaWVkIGluIHRoZSBDb250ZW50LVJhbmdlPyBlZWsuLi4KLSAgICAgICAgICAgICovCi0KLQkgICAgaWYgKGxlbiA9PSAtMSkgewotCQkvKgotCQkqKiBFcnJvciByZWFkaW5nIHJlcXVlc3QgYm9keS4gVGhpcyBoYXMgcHJlY2VkZW5jZSBvdmVyCi0JCSoqIHByaW9yIGVycm9ycy4KLQkJKi8KLQkJZXJyID0gZGF2X25ld19lcnJvcihyLT5wb29sLCBIVFRQX0JBRF9SRVFVRVNULCAwLAotCQkJCSAgICAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVhZGluZyB0aGUgIgotCQkJCSAgICAicmVxdWVzdCBib2R5LiIpOwotCSAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIyID0gKCpyZXNvdXJjZS0+aG9va3MtPmNsb3NlX3N0cmVhbSkoc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID09IE5VTEwgLyogY29tbWl0ICovKTsKLQlpZiAoZXJyMiAhPSBOVUxMICYmIGVyciA9PSBOVUxMKSB7Ci0JICAgIC8qIG5vIGVycm9yIGR1cmluZyB0aGUgd3JpdGUsIGJ1dCB3ZSBoaXQgb25lIGF0IGNsb3NlLiB1c2UgaXQuICovCi0JICAgIGVyciA9IGVycjI7Ci0JfQotICAgIH0KLQotICAgIC8qCi0gICAgKiogRW5zdXJlIHRoYXQgd2UgdGhpbmsgdGhlIHJlc291cmNlIGV4aXN0cyBub3cuCi0gICAgKiogIyMjIGVlay4gaWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRoZSB3cml0ZSBhbmQgd2UgZGlkIG5vdCBjb21taXQsCi0gICAgKiogIyMjIHRoZW4gdGhlIHJlc291cmNlIG1pZ2h0IE5PVCBleGlzdCAoZS5nLiBkYXZfZnNfcmVwb3MuYykKLSAgICAqLwotICAgIGlmIChlcnIgPT0gTlVMTCkgewotCXJlc291cmNlLT5leGlzdHMgPSAxOwotICAgIH0KLQotICAgIC8qIHJlc3RvcmUgbW9kaWZpYWJpbGl0eSBvZiByZXNvdXJjZXMgYmFjayB0byB3aGF0IHRoZXkgd2VyZSAqLwotICAgIGVycjIgPSBkYXZfcmV2ZXJ0X3Jlc291cmNlX3dyaXRhYmlsaXR5KHIsIHJlc291cmNlLCByZXNvdXJjZV9wYXJlbnQsCi0JCQkJCSAgIGVyciAhPSBOVUxMIC8qIHVuZG8gaWYgZXJyb3IgKi8sCi0JCQkJCSAgIHJlc291cmNlX2V4aXN0ZWQsCi0JCQkJCSAgIHJlc291cmNlX3dhc193cml0YWJsZSwKLQkJCQkJICAgcGFyZW50X3dhc193cml0YWJsZSk7Ci0KLSAgICAvKiBjaGVjayBmb3IgZXJyb3JzIG5vdyAqLwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotCXJldHVybiBkYXZfaGFuZGxlX2VycihyLCBlcnIsIE5VTEwpOwotICAgIH0KLSAgICBpZiAoZXJyMiAhPSBOVUxMKSB7Ci0JLyoganVzdCBsb2cgYSB3YXJuaW5nICovCi0JZXJyMiA9IGRhdl9wdXNoX2Vycm9yKHItPnBvb2wsIGVyci0+c3RhdHVzLCAwLAotCQkJICAgICAgIlRoZSBQVVQgd2FzIHN1Y2Nlc3NmdWwsIGJ1dCB0aGVyZSAiCi0JCQkgICAgICAid2FzIGEgcHJvYmxlbSByZXZlcnRpbmcgdGhlIHdyaXRhYmlsaXR5IG9mICIKLQkJCSAgICAgICJ0aGUgcmVzb3VyY2Ugb3IgaXRzIHBhcmVudCBjb2xsZWN0aW9uLiIsCi0JCQkgICAgICBlcnIyKTsKLQlkYXZfbG9nX2VycihyLCBlcnIyLCBBUExPR19XQVJOSU5HKTsKLSAgICB9Ci0KLSAgICAvKiAjIyMgcGxhY2UgdGhlIENvbnRlbnQtVHlwZSBhbmQgQ29udGVudC1MYW5ndWFnZSBpbnRvIHRoZSBwcm9wZGIgKi8KLQotICAgIGlmIChsb2Nrc19ob29rcyAhPSBOVUxMKSB7Ci0gICAgICAgIGRhdl9sb2NrZGIgKmxvY2tkYjsKLQotICAgICAgICBpZiAoKGVyciA9ICgqbG9ja3NfaG9va3MtPm9wZW5fbG9ja2RiKShyLCAwLCAwLCAmbG9ja2RiKSkgIT0gTlVMTCkgewotCSAgICAvKiBUaGUgZmlsZSBjcmVhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgYnV0IHRoZSBsb2NraW5nIGZhaWxlZC4gKi8KLQkgICAgZXJyID0gZGF2X3B1c2hfZXJyb3Ioci0+cG9vbCwgZXJyLT5zdGF0dXMsIDAsCi0JCQkJICJUaGUgZmlsZSB3YXMgUFVUIHN1Y2Nlc3NmdWxseSwgYnV0IHRoZXJlICIKLQkJCQkgIndhcyBhIHByb2JsZW0gb3BlbmluZyB0aGUgbG9jayBkYXRhYmFzZSAiCi0JCQkJICJ3aGljaCBwcmV2ZW50cyBpbmhlcml0aW5nIGxvY2tzIGZyb20gdGhlICIKLQkJCQkgInBhcmVudCByZXNvdXJjZXMuIiwKLQkJCQkgZXJyKTsKLQkgICAgcmV0dXJuIGRhdl9oYW5kbGVfZXJyKHIsIGVyciwgTlVMTCk7Ci0gICAgICAgIH0KLQotCS8qIG5vdGlmeSBsb2NrIHN5c3RlbSB0aGF0IHdlIGhhdmUgY3JlYXRlZC9yZXBsYWNlZCBhIHJlc291cmNlICovCi0JZXJyID0gZGF2X25vdGlmeV9jcmVhdGVkKHIsIGxvY2tkYiwgcmVzb3VyY2UsIHJlc291cmNlX3N0YXRlLCAwKTsKLQotCSgqbG9ja3NfaG9va3MtPmNsb3NlX2xvY2tkYikobG9ja2RiKTsKLQotCWlmIChlcnIgIT0gTlVMTCkgewotCSAgICAvKiBUaGUgZmlsZSBjcmVhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgYnV0IHRoZSBsb2NraW5nIGZhaWxlZC4gKi8KLQkgICAgZXJyID0gZGF2X3B1c2hfZXJyb3Ioci0+cG9vbCwgZXJyLT5zdGF0dXMsIDAsCi0JCQkJICJUaGUgZmlsZSB3YXMgUFVUIHN1Y2Nlc3NmdWxseSwgYnV0IHRoZXJlICIKLQkJCQkgIndhcyBhIHByb2JsZW0gdXBkYXRpbmcgaXRzIGxvY2sgIgotCQkJCSAiaW5mb3JtYXRpb24uIiwKLQkJCQkgZXJyKTsKLQkgICAgcmV0dXJuIGRhdl9oYW5kbGVfZXJyKHIsIGVyciwgTlVMTCk7Ci0JfQotICAgIH0KLQotICAgIC8qIE5PVEU6IFdlYkRBViBzcGVjLCBTOC43LjEgc3RhdGVzIHByb3BlcnRpZXMgc2hvdWxkIGJlIHVuYWZmZWN0ZWQgKi8KLQotICAgIC8qIHJldHVybiBhbiBhcHByb3ByaWF0ZSByZXNwb25zZSAoSFRUUF9DUkVBVEVEIG9yIEhUVFBfTk9fQ09OVEVOVCkgKi8KLSAgICByZXR1cm4gZGF2X2NyZWF0ZWQociwgTlVMTCwgcmVzb3VyY2UsICJSZXNvdXJjZSIsIHJlc291cmNlX2V4aXN0ZWQpOwotfQotCi0vKiAjIyMgbW92ZSB0aGlzIHRvIGRhdl91dGlsPyAqLwotdm9pZCBkYXZfYWRkX3Jlc3BvbnNlKGRhdl93YWxrZXJfY3R4ICpjdHgsIGNvbnN0IGNoYXIgKmhyZWYsIGludCBzdGF0dXMsCi0JCSAgICAgIGRhdl9nZXRfcHJvcHNfcmVzdWx0ICpwcm9wc3RhdHMpCi17Ci0gICAgZGF2X3Jlc3BvbnNlICpyZXNwOwotCi0gICAgLyoganVzdCBkcm9wIHNvbWUgZGF0YSBpbnRvIGFuIGRhdl9yZXNwb25zZSAqLwotICAgIHJlc3AgPSBhcF9wY2FsbG9jKGN0eC0+cG9vbCwgc2l6ZW9mKCpyZXNwKSk7Ci0gICAgcmVzcC0+aHJlZiA9IGFwX3BzdHJkdXAoY3R4LT5wb29sLCBocmVmKTsKLSAgICByZXNwLT5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgaWYgKHByb3BzdGF0cykgewotCXJlc3AtPnByb3ByZXN1bHQgPSAqcHJvcHN0YXRzOwotICAgIH0KLSAgICByZXNwLT5uZXh0ID0gY3R4LT5yZXNwb25zZTsKLQotICAgIGN0eC0+cmVzcG9uc2UgPSByZXNwOwotfQotCi0vKiBoYW5kbGUgdGhlIERFTEVURSBtZXRob2QgKi8KLXN0YXRpYyBpbnQgZGF2X21ldGhvZF9kZWxldGUocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgZGF2X3Jlc291cmNlICpyZXNvdXJjZTsKLSAgICBkYXZfcmVzb3VyY2UgKnJlc291cmNlX3BhcmVudCA9IE5VTEw7Ci0gICAgZGF2X2Vycm9yICplcnI7Ci0gICAgZGF2X2Vycm9yICplcnIyOwotICAgIGRhdl9yZXNwb25zZSAqbXVsdGlfcmVzcG9uc2U7Ci0gICAgY29uc3QgY2hhciAqYm9keTsKLSAgICBpbnQgcmVzdWx0OwotICAgIGludCBkZXB0aDsKLSAgICBpbnQgcGFyZW50X3dhc193cml0YWJsZSA9IDA7Ci0KLSAgICAvKiBXZSBkb24ndCB1c2UgdGhlIHJlcXVlc3QgYm9keSByaWdodCBub3csIHNvIHRvcmNoIGl0LiAqLwotICAgIGlmICgocmVzdWx0ID0gYXBfZGlzY2FyZF9yZXF1ZXN0X2JvZHkocikpICE9IE9LKSB7Ci0JcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKiBBc2sgcmVwb3NpdG9yeSBtb2R1bGUgdG8gcmVzb2x2ZSB0aGUgcmVzb3VyY2UgKi8KLSAgICByZXN1bHQgPSBkYXZfZ2V0X3Jlc291cmNlKHIsICZyZXNvdXJjZSk7Ci0gICAgaWYgKHJlc3VsdCAhPSBPSykKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICBpZiAoIXJlc291cmNlLT5leGlzdHMpIHsKLSAgICAgICAgLyogQXBhY2hlIHdpbGwgc3VwcGx5IGEgZGVmYXVsdCBlcnJvciBmb3IgdGhpcy4gKi8KLQlyZXR1cm4gSFRUUF9OT1RfRk9VTkQ7Ci0gICAgfQotCi0gICAgLyogMjUxOCBzYXlzIHRoYXQgZGVwdGggbXVzdCBiZSBpbmZpbml0eSBvbmx5IGZvciBjb2xsZWN0aW9ucy4KLSAgICAgKiBGb3Igbm9uLWNvbGxlY3Rpb25zLCBkZXB0aCBpcyBpZ25vcmVkLCB1bmxlc3MgaXQgaXMgYW4gaWxsZWdhbCB2YWx1ZSAoMSkuCi0gICAgICovCi0gICAgZGVwdGggPSBkYXZfZ2V0X2RlcHRoKHIsIERBVl9JTkZJTklUWSk7Ci0KLSAgICBpZiAocmVzb3VyY2UtPmNvbGxlY3Rpb24gJiYgZGVwdGggIT0gREFWX0lORklOSVRZKSB7Ci0JLyogVGhpcyBzdXBwbGllcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgZGVmYXVsdCBtZXNzYWdlLiAqLwotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSIHwgQVBMT0dfTk9FUlJOTywgciwKLQkJICAgICAgIkRlcHRoIG11c3QgYmUgXCJpbmZpbml0eVwiIGZvciBERUxFVEUgb2YgYSBjb2xsZWN0aW9uLiIpOwotCXJldHVybiBIVFRQX0JBRF9SRVFVRVNUOwotICAgIH0KLSAgICBpZiAoIXJlc291cmNlLT5jb2xsZWN0aW9uICYmIGRlcHRoID09IDEpIHsKLQkvKiBUaGlzIHN1cHBsaWVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBkZWZhdWx0IG1lc3NhZ2UuICovCi0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIgfCBBUExPR19OT0VSUk5PLCByLAotCQkgICAgICAiRGVwdGggb2YgXCIxXCIgaXMgbm90IGFsbG93ZWQgZm9yIERFTEVURS4iKTsKLQlyZXR1cm4gSFRUUF9CQURfUkVRVUVTVDsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBmb3IgdmFsaWQgcmVzb3VyY2UgdHlwZSAqLwotICAgIC8qICMjIyBhbGxvdyBEQVZfUkVTT1VSQ0VfVFlQRV9SRVZJU0lPTiB3aXRoIEFsbC1CaW5kaW5ncyBoZWFkZXIgKi8KLSAgICBpZiAocmVzb3VyY2UtPnR5cGUgIT0gREFWX1JFU09VUkNFX1RZUEVfUkVHVUxBUiAmJgotICAgICAgICByZXNvdXJjZS0+dHlwZSAhPSBEQVZfUkVTT1VSQ0VfVFlQRV9XT1JLU1BBQ0UpIHsKLSAgICAgICAgYm9keSA9IGFwX3BzcHJpbnRmKHItPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGRlbGV0ZSByZXNvdXJjZSAlcy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfZXNjYXBlX2h0bWwoci0+cG9vbCwgci0+dXJpKSk7Ci0JcmV0dXJuIGRhdl9lcnJvcl9yZXNwb25zZShyLCBIVFRQX0NPTkZMSUNULCBib2R5KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICoqIElmIGFueSByZXNvdXJjZXMgZmFpbCB0aGUgbG9jay9JZjogY29uZGl0aW9ucywgdGhlbiB3ZSBtdXN0IGZhaWwKLSAgICAqKiB0aGUgZGVsZXRlLiBFYWNoIG9mIHRoZSBmYWlsaW5nIHJlc291cmNlcyB3aWxsIGJlIGxpc3RlZCB3aXRoaW4KLSAgICAqKiBhIERBVjptdWx0aXN0YXR1cyBib2R5LCB3cmFwcGVkIGludG8gYSA0MjQgcmVzcG9uc2UuCi0gICAgKioKLSAgICAqKiBOb3RlIHRoYXQgYSBmYWlsdXJlIG9uIHRoZSByZXNvdXJjZSBpdHNlbGYgZG9lcyBub3QgZ2VuZXJhdGUgYQotICAgICoqIG11bHRpc3RhdHVzIHJlc3BvbnNlIC0tIG9ubHkgaW50ZXJuYWwgbWVtYmVycy9jb2xsZWN0aW9ucy4KLSAgICAqLwotICAgIGlmICgoZXJyID0gZGF2X3ZhbGlkYXRlX3JlcXVlc3QociwgcmVzb3VyY2UsIGRlcHRoLCBOVUxMLAotCQkJCSAgICAmbXVsdGlfcmVzcG9uc2UsCi0JCQkJICAgIERBVl9WQUxJREFURV9QQVJFTlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgREFWX1ZBTElEQVRFX1VTRV80MjQsIE5VTEwpKSAhPSBOVUxMKSB7Ci0JZXJyID0gZGF2X3B1c2hfZXJyb3Ioci0+cG9vbCwgZXJyLT5zdGF0dXMsIDAsCi0JCQkgICAgIGFwX3BzcHJpbnRmKHItPnBvb2wsCi0JCQkJCSAiQ291bGQgbm90IERFTEVURSAlcyBkdWUgdG8gYSBmYWlsZWQgIgotCQkJCQkgInByZWNvbmRpdGlvbiAoZS5nLiBsb2NrcykuIiwKLQkJCQkJIGFwX2VzY2FwZV9odG1sKHItPnBvb2wsIHItPnVyaSkpLAotCQkJICAgICBlcnIpOwotCXJldHVybiBkYXZfaGFuZGxlX2VycihyLCBlcnIsIG11bHRpX3Jlc3BvbnNlKTsKLSAgICB9Ci0KLSAgICAvKiAjIyMgUkZDIDI1MTggcy4gOC4xMC41IHNheXMgdG8gcmVtb3ZlIF9hbGxfIGxvY2tzLCBub3QganVzdCB0aG9zZQotICAgICAqICAgICBsb2NrZWQgYnkgdGhlIHRva2VuKHMpIGluIHRoZSBpZl9oZWFkZXIuCi0gICAgICovCi0gICAgaWYgKChyZXN1bHQgPSBkYXZfdW5sb2NrKHIsIHJlc291cmNlLCBOVUxMKSkgIT0gT0spIHsKLQlyZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qIGlmIHZlcnNpb25lZCByZXNvdXJjZSwgbWFrZSBzdXJlIHBhcmVudCBpcyBjaGVja2VkIG91dCAqLwotICAgIGlmICgoZXJyID0gZGF2X2Vuc3VyZV9yZXNvdXJjZV93cml0YWJsZShyLCByZXNvdXJjZSwgMSAvKiBwYXJlbnRfb25seSAqLywKLQkJCQkJICAgICZyZXNvdXJjZV9wYXJlbnQsCi0JCQkJCSAgICBOVUxMLCBOVUxMLAotCQkJCQkgICAgJnBhcmVudF93YXNfd3JpdGFibGUpKSAhPSBOVUxMKSB7Ci0JLyogIyMjIGFkZCBhIGhpZ2hlci1sZXZlbCBkZXNjcmlwdGlvbj8gKi8KLQlyZXR1cm4gZGF2X2hhbmRsZV9lcnIociwgZXJyLCBOVUxMKTsKLSAgICB9Ci0KLSAgICAvKiB0cnkgdG8gcmVtb3ZlIHRoZSByZXNvdXJjZSAqLwotICAgIGVyciA9ICgqcmVzb3VyY2UtPmhvb2tzLT5yZW1vdmVfcmVzb3VyY2UpKHJlc291cmNlLCAmbXVsdGlfcmVzcG9uc2UpOwotCi0gICAgLyogcmVzdG9yZSB3cml0YWJpbGl0eSBvZiBwYXJlbnQgYmFjayB0byB3aGF0IGl0IHdhcyAqLwotICAgIGVycjIgPSBkYXZfcmV2ZXJ0X3Jlc291cmNlX3dyaXRhYmlsaXR5KHIsIE5VTEwsIHJlc291cmNlX3BhcmVudCwKLQkJCQkJICAgZXJyICE9IE5VTEwgLyogdW5kbyBpZiBlcnJvciAqLywKLQkJCQkJICAgMCwgMCwgcGFyZW50X3dhc193cml0YWJsZSk7Ci0KLSAgICAvKiBjaGVjayBmb3IgZXJyb3JzIG5vdyAqLwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotCWVyciA9IGRhdl9wdXNoX2Vycm9yKHItPnBvb2wsIGVyci0+c3RhdHVzLCAwLAotCQkJICAgICBhcF9wc3ByaW50ZihyLT5wb29sLAotCQkJCQkgIkNvdWxkIG5vdCBERUxFVEUgJXMuIiwKLQkJCQkJIGFwX2VzY2FwZV9odG1sKHItPnBvb2wsIHItPnVyaSkpLAotCQkJICAgICBlcnIpOwotCXJldHVybiBkYXZfaGFuZGxlX2VycihyLCBlcnIsIG11bHRpX3Jlc3BvbnNlKTsKLSAgICB9Ci0gICAgaWYgKGVycjIgIT0gTlVMTCkgewotCS8qIGp1c3QgbG9nIGEgd2FybmluZyAqLwotCWVyciA9IGRhdl9wdXNoX2Vycm9yKHItPnBvb2wsIGVycjItPnN0YXR1cywgMCwKLQkJCSAgICAgIlRoZSBERUxFVEUgd2FzIHN1Y2Nlc3NmdWwsIGJ1dCB0aGVyZSAiCi0JCQkgICAgICJ3YXMgYSBwcm9ibGVtIHJldmVydGluZyB0aGUgd3JpdGFiaWxpdHkgb2YgIgotCQkJICAgICAiaXRzIHBhcmVudCBjb2xsZWN0aW9uLiIsCi0JCQkgICAgIGVycjIpOwotCWRhdl9sb2dfZXJyKHIsIGVyciwgQVBMT0dfV0FSTklORyk7Ci0gICAgfQotCi0gICAgLyogIyMjIEhUVFBfTk9fQ09OVEVOVCBpZiBubyBib2R5LCBIVFRQX09LIGlmIHRoZXJlIGlzIGEgYm9keSAoc29tZSBkYXkpICovCi0KLSAgICAvKiBBcGFjaGUgd2lsbCBzdXBwbHkgYSBkZWZhdWx0IGVycm9yIGZvciB0aGlzLiAqLwotICAgIHJldHVybiBIVFRQX05PX0NPTlRFTlQ7Ci19Ci0KLS8qIGhhbmRsZSB0aGUgT1BUSU9OUyBtZXRob2QgKi8KLXN0YXRpYyBpbnQgZGF2X21ldGhvZF9vcHRpb25zKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvbnN0IGRhdl9ob29rc19sb2NrcyAqbG9ja3NfaG9va3MgPSBEQVZfR0VUX0hPT0tTX0xPQ0tTKHIpOwotICAgIGNvbnN0IGRhdl9ob29rc192c24gKnZzbl9ob29rcyA9IERBVl9HRVRfSE9PS1NfVlNOKHIpOwotICAgIGRhdl9yZXNvdXJjZSAqcmVzb3VyY2U7Ci0gICAgY29uc3QgY2hhciAqb3B0aW9uczsKLSAgICBjb25zdCBjaGFyICpkYXZfbGV2ZWw7Ci0gICAgY29uc3QgY2hhciAqdnNuX2xldmVsOwotICAgIGludCByZXN1bHQ7Ci0gICAgY29uc3QgZGF2X2Rpcl9jb25mICpjb25mOwotICAgIGNvbnN0IGRhdl9keW5faG9va3MgKmxwOwotCi0gICAgLyogcGVyIEhUVFAvMS4xIFM5LjIsIHdlIGNhbiBkaXNjYXJkIHRoaXMgYm9keSAqLwotICAgIGlmICgocmVzdWx0ID0gYXBfZGlzY2FyZF9yZXF1ZXN0X2JvZHkocikpICE9IE9LKSB7Ci0JcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKiBubyBib2R5ICovCi0gICAgYXBfc2V0X2NvbnRlbnRfbGVuZ3RoKHIsIDApOwotCi0gICAgLyogcmVzb2x2ZSB0aGUgcmVzb3VyY2UgKi8KLSAgICByZXN1bHQgPSBkYXZfZ2V0X3Jlc291cmNlKHIsICZyZXNvdXJjZSk7Ci0gICAgaWYgKHJlc3VsdCAhPSBPSykKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLQotICAgIC8qIGRldGVybWluZSB3aGljaCBwcm92aWRlcnMgYXJlIGF2YWlsYWJsZSAqLwotICAgIGRhdl9sZXZlbCA9ICIxIjsKLSAgICB2c25fbGV2ZWwgPSBOVUxMOwotCi0gICAgaWYgKGxvY2tzX2hvb2tzICE9IE5VTEwpIHsKLSAgICAgICAgZGF2X2xldmVsID0gIjEsMiI7Ci0gICAgfQotICAgIGlmICh2c25faG9va3MgIT0gTlVMTCkgewotICAgICAgICB2c25fbGV2ZWwgPSAoKnZzbl9ob29rcy0+Z2V0X3Zzbl9oZWFkZXIpKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqKiBJdGVyYXRlIHRocm91Z2ggdGhlIGxpdmUgcHJvcGVydHkgcHJvdmlkZXJzOyBhZGQgdGhlaXIgVVJJcyB0bwotICAgICoqIHRoZSBkYXZfbGV2ZWwgc3RyaW5nLgotICAgICovCi0gICAgY29uZiA9IChkYXZfZGlyX2NvbmYgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCQkgJmRhdl9tb2R1bGUpOwotICAgIGZvciAobHAgPSBjb25mLT5saXZlcHJvcDsgbHAgIT0gTlVMTDsgbHAgPSBscC0+bmV4dCkgewotICAgICAgICBjb25zdCBjaGFyICp1cmkgPSBEQVZfQVNfSE9PS1NfTElWRVBST1AobHApLT5wcm9wc2V0X3VyaTsKLQotICAgICAgICBpZiAodXJpICE9IE5VTEwpCi0gICAgICAgICAgICBkYXZfbGV2ZWwgPSBhcF9wc3RyY2F0KHItPnBvb2wsIGRhdl9sZXZlbCwgIiw8IiwgdXJpLCAiPiIsIE5VTEwpOwotICAgIH0KLQotICAgIC8qIHRoaXMgdGVsbHMgTVNGVCBwcm9kdWN0cyB0byBza2lwIGxvb2tpbmcgZm9yIEZyb250UGFnZSBleHRlbnNpb25zICovCi0gICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIk1TLUF1dGhvci1WaWEiLCAiREFWIik7Ci0KLSAgICAvKgotICAgICoqIFRocmVlIGNhc2VzOiAgcmVzb3VyY2UgaXMgbnVsbCAoMyksIGlzIGxvY2stbnVsbCAoNy40KSwgb3IgZXhpc3RzLgotICAgICoqCi0gICAgKiogQWxsIGNhc2VzIHN1cHBvcnQgT1BUSU9OUyBhbmQgTE9DSy4KLSAgICAqKiAoTG9jay0pIG51bGwgcmVzb3VyY2VzIGFsc28gc3VwcG9ydCBNS0NPTCBhbmQgUFVULgotICAgICoqIExvY2stbnVsbCBzdXBwb3J0IFBST1BGSU5EIGFuZCBVTkxPQ0suCi0gICAgKiogRXhpc3RpbmcgcmVzb3VyY2VzIHN1cHBvcnQgbG90cyBvZiBzdHVmZi4KLSAgICAqLwotCi0gICAgLyogIyMjIHRha2UgaW50byBhY2NvdW50IHJlc291cmNlIHR5cGUgKi8KLSAgICBzd2l0Y2ggKGRhdl9nZXRfcmVzb3VyY2Vfc3RhdGUociwgcmVzb3VyY2UpKQotICAgIHsKLSAgICBjYXNlIERBVl9SRVNPVVJDRV9FWElTVFM6Ci0JLyogcmVzb3VyY2UgZXhpc3RzICovCi0JaWYgKHJlc291cmNlLT5jb2xsZWN0aW9uKSB7Ci0JICAgIG9wdGlvbnMgPSBhcF9wc3RyY2F0KHItPnBvb2wsCi0JCSJPUFRJT05TLCAiCi0JCSJHRVQsIEhFQUQsIFBPU1QsIERFTEVURSwgVFJBQ0UsICIKLQkJIlBST1BGSU5ELCBQUk9QUEFUQ0gsIENPUFksIE1PVkUiLAotICAgICAgICAgICAgICAgIGxvY2tzX2hvb2tzICE9IE5VTEwgPyAiLCBMT0NLLCBVTkxPQ0siIDogIiIsCi0gICAgICAgICAgICAgICAgTlVMTCk7Ci0JfQotCWVsc2UgewotCSAgICAvKiBmaWxlcyBhbHNvIHN1cHBvcnQgUFVUICovCi0JICAgIG9wdGlvbnMgPSBhcF9wc3RyY2F0KHItPnBvb2wsCi0JCSJPUFRJT05TLCAiCi0JCSJHRVQsIEhFQUQsIFBPU1QsIERFTEVURSwgVFJBQ0UsICIKLQkJIlBST1BGSU5ELCBQUk9QUEFUQ0gsIENPUFksIE1PVkUsIFBVVCIsCi0gICAgICAgICAgICAgICAgbG9ja3NfaG9va3MgIT0gTlVMTCA/ICIsIExPQ0ssIFVOTE9DSyIgOiAiIiwKLSAgICAgICAgICAgICAgICBOVUxMKTsKLQl9Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIERBVl9SRVNPVVJDRV9MT0NLX05VTEw6Ci0JLyogcmVzb3VyY2UgaXMgbG9jay1udWxsLiAqLwotCW9wdGlvbnMgPSBhcF9wc3RyY2F0KHItPnBvb2wsICJPUFRJT05TLCBNS0NPTCwgUFVULCBQUk9QRklORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tzX2hvb2tzICE9IE5VTEwgPyAiLCBMT0NLLCBVTkxPQ0siIDogIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotCWJyZWFrOwotCi0gICAgY2FzZSBEQVZfUkVTT1VSQ0VfTlVMTDoKLQkvKiByZXNvdXJjZSBpcyBudWxsLiAqLwotCW9wdGlvbnMgPSBhcF9wc3RyY2F0KHItPnBvb2wsICJPUFRJT05TLCBNS0NPTCwgUFVUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja3NfaG9va3MgIT0gTlVMTCA/ICIsIExPQ0siIDogIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotCWJyZWFrOwotCi0gICAgZGVmYXVsdDoKLQkvKiAjIyMgaW50ZXJuYWwgZXJyb3IhICovCi0Jb3B0aW9ucyA9ICJPUFRJT05TIjsKLQlicmVhazsKLSAgICB9Ci0KLSAgICAvKiBJZiB0aGVyZSBpcyBhIHZlcnNpb25pbmcgcHJvdmlkZXIsIGFkZCB2ZXJzaW9uaW5nIG9wdGlvbnMgKi8KLSAgICBpZiAodnNuX2hvb2tzICE9IE5VTEwpIHsKLSAgICAgICAgY29uc3QgY2hhciAqdnNuX29wdGlvbnMgPSBOVUxMOwotCi0gICAgICAgIC8qICMjIyB0YWtlIGludG8gYWNjb3VudCByZXNvdXJjZSB0eXBlICovCi0gICAgICAgIGlmICghcmVzb3VyY2UtPmV4aXN0cykgewotICAgICAgICAgICAgaWYgKCgqdnNuX2hvb2tzLT52ZXJzaW9uYWJsZSkocmVzb3VyY2UpKQotICAgICAgICAgICAgICAgIHZzbl9vcHRpb25zID0gIiwgTUtSRVNPVVJDRSI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXJlc291cmNlLT52ZXJzaW9uZWQpIHsKLSAgICAgICAgICAgIGlmICgoKnZzbl9ob29rcy0+dmVyc2lvbmFibGUpKHJlc291cmNlKSkKLSAgICAgICAgICAgICAgICB2c25fb3B0aW9ucyA9ICIsIENIRUNLSU4iOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHJlc291cmNlLT53b3JraW5nKQotICAgICAgICAgICAgdnNuX29wdGlvbnMgPSAiLCBDSEVDS0lOLCBVTkNIRUNLT1VUIjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdnNuX29wdGlvbnMgPSAiLCBDSEVDS09VVCI7Ci0KLSAgICAgICAgaWYgKHZzbl9vcHRpb25zICE9IE5VTEwpCi0gICAgICAgICAgICBvcHRpb25zID0gYXBfcHN0cmNhdChyLT5wb29sLCBvcHRpb25zLCB2c25fb3B0aW9ucywgTlVMTCk7Ci0gICAgfQotCi0gICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkFsbG93Iiwgb3B0aW9ucyk7Ci0gICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkRBViIsIGRhdl9sZXZlbCk7Ci0KLSAgICBpZiAodnNuX2xldmVsICE9IE5VTEwpCi0gICAgICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJWZXJzaW9uaW5nIiwgdnNuX2xldmVsKTsKLQotICAgIC8qICMjIyB0aGlzIHdpbGwgc2VuZCBhIENvbnRlbnQtVHlwZS4gdGhlIGRlZmF1bHQgT1BUSU9OUyBkb2VzIG5vdC4gKi8KLSAgICBhcF9zZW5kX2h0dHBfaGVhZGVyKHIpOwotCi0gICAgLyogIyMjIHRoZSBkZWZhdWx0IChhcF9zZW5kX2h0dHBfb3B0aW9ucykgcmV0dXJucyBPSywgYnV0IEkgYmVsaWV2ZQotICAgICAqICMjIyB0aGF0IGlzIGJlY2F1c2UgaXQgaXMgdGhlIGRlZmF1bHQgaGFuZGxlciBhbmQgbm90aGluZyBlbHNlCi0gICAgICogIyMjIHdpbGwgcnVuIGFmdGVyIHRoZSB0aGluZy4gKi8KLQotICAgIC8qIHdlJ3ZlIHNlbnQgZXZlcnl0aGluZyBuZWNlc3NhcnkgdG8gdGhlIGNsaWVudC4gKi8KLSAgICByZXR1cm4gRE9ORTsKLX0KLQotc3RhdGljIHZvaWQgZGF2X2NhY2hlX2JhZHByb3BzKGRhdl93YWxrZXJfY3R4ICpjdHgpCi17Ci0gICAgY29uc3QgZGF2X3htbF9lbGVtICplbGVtOwotICAgIGRhdl90ZXh0X2hlYWRlciBoZHIgPSB7IDAgfTsKLQotICAgIC8qIGp1c3QgcmV0dXJuIGlmIHdlIGJ1aWx0IHRoZSB0aGluZyBhbHJlYWR5ICovCi0gICAgaWYgKGN0eC0+cHJvcHN0YXRfNDA0ICE9IE5VTEwpIHsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgZGF2X3RleHRfYXBwZW5kKGN0eC0+cG9vbCwgJmhkciwKLQkJICAgICI8RDpwcm9wc3RhdD4iIERFQlVHX0NSCi0JCSAgICAiPEQ6cHJvcD4iIERFQlVHX0NSKTsKLQotICAgIGVsZW0gPSBkYXZfZmluZF9jaGlsZChjdHgtPmRvYy0+cm9vdCwgInByb3AiKTsKLSAgICBmb3IgKGVsZW0gPSBlbGVtLT5maXJzdF9jaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0tPm5leHQpIHsKLQlkYXZfdGV4dF9hcHBlbmQoY3R4LT5wb29sLCAmaGRyLCBkYXZfZW1wdHlfZWxlbShjdHgtPnBvb2wsIGVsZW0pKTsKLSAgICB9Ci0KLSAgICBkYXZfdGV4dF9hcHBlbmQoY3R4LT5wb29sLCAmaGRyLAotCQkgICAgIjwvRDpwcm9wPiIgREVCVUdfQ1IKLQkJICAgICI8RDpzdGF0dXM+SFRUUC8xLjEgNDA0IE5vdCBGb3VuZDwvRDpzdGF0dXM+IiBERUJVR19DUgotCQkgICAgIjwvRDpwcm9wc3RhdD4iIERFQlVHX0NSKTsKLQotICAgIGN0eC0+cHJvcHN0YXRfNDA0ID0gaGRyLmZpcnN0OwotfQotCi1zdGF0aWMgZGF2X2Vycm9yICogZGF2X3Byb3BmaW5kX3dhbGtlcihkYXZfd2Fsa2VyX2N0eCAqY3R4LCBpbnQgY2FsbHR5cGUpCi17Ci0gICAgZGF2X2Vycm9yICplcnI7Ci0gICAgZGF2X3Byb3BkYiAqcHJvcGRiOwotICAgIGRhdl9nZXRfcHJvcHNfcmVzdWx0IHByb3BzdGF0cyA9IHsgMCB9OwotCi0gICAgLyoKLSAgICAqKiBOb3RlOiBjdHgtPmRvYyBjYW4gb25seSBiZSBOVUxMIGZvciBEQVZfUFJPUEZJTkRfSVNfQUxMUFJPUC4gU2luY2UKLSAgICAqKiBkYXZfZ2V0X2FsbHByb3BzKCkgZG9lcyBub3QgbmVlZCB0byBkbyBuYW1lc3BhY2UgdHJhbnNsYXRpb24sCi0gICAgKiogd2UncmUgb2theS4KLSAgICAqKgotICAgICoqIE5vdGU6IHdlIGNhc3QgdG8gbG9zZSB0aGUgImNvbnN0Ii4gVGhlIHByb3BkYiB3b24ndCB0cnkgdG8gY2hhbmdlCi0gICAgKiogdGhlIHJlc291cmNlLCBob3dldmVyLCBzaW5jZSB3ZSBhcmUgb3BlbmluZyByZWFkb25seS4KLSAgICAqLwotICAgIGVyciA9IGRhdl9vcGVuX3Byb3BkYihjdHgtPnIsIGN0eC0+bG9ja2RiLAotCQkJICAoZGF2X3Jlc291cmNlICopY3R4LT5yZXNvdXJjZSwgMSwKLQkJCSAgY3R4LT5kb2MgPyBjdHgtPmRvYy0+bmFtZXNwYWNlcyA6IE5VTEwsICZwcm9wZGIpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotCS8qICMjIyBkbyBzb21ldGhpbmcgd2l0aCBlcnIhICovCi0KLQlpZiAoY3R4LT5wcm9wZmluZF90eXBlID09IERBVl9QUk9QRklORF9JU19QUk9QKSB7Ci0JICAgIGRhdl9nZXRfcHJvcHNfcmVzdWx0IGJhZHByb3BzID0geyAwIH07Ci0KLQkgICAgLyogc29tZSBwcm9wcyB3ZXJlIGV4cGVjdGVkIG9uIHRoaXMgY29sbGVjdGlvbi9yZXNvdXJjZSAqLwotCSAgICBkYXZfY2FjaGVfYmFkcHJvcHMoY3R4KTsKLQkgICAgYmFkcHJvcHMucHJvcHN0YXRzID0gY3R4LT5wcm9wc3RhdF80MDQ7Ci0JICAgIGRhdl9hZGRfcmVzcG9uc2UoY3R4LCBjdHgtPnVyaS5idWYsIDAsICZiYWRwcm9wcyk7Ci0JfQotCWVsc2UgewotCSAgICAvKiBubyBwcm9wcyBvbiB0aGlzIGNvbGxlY3Rpb24vcmVzb3VyY2UgKi8KLQkgICAgZGF2X2FkZF9yZXNwb25zZShjdHgsIGN0eC0+dXJpLmJ1ZiwgSFRUUF9PSywgTlVMTCk7Ci0JfQotCXJldHVybiBOVUxMOwotICAgIH0KLSAgICAvKiAjIyMgd2hhdCB0byBkbyBhYm91dCBjbG9zaW5nIHRoZSBwcm9wZGIgb24gc2VydmVyIGZhaWx1cmU/ICovCi0KLSAgICBpZiAoY3R4LT5wcm9wZmluZF90eXBlID09IERBVl9QUk9QRklORF9JU19QUk9QKSB7Ci0JcHJvcHN0YXRzID0gZGF2X2dldF9wcm9wcyhwcm9wZGIsIGN0eC0+ZG9jKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JcHJvcHN0YXRzID0gZGF2X2dldF9hbGxwcm9wcyhwcm9wZGIsCi0JCQkgICAgIGN0eC0+cHJvcGZpbmRfdHlwZSA9PSBEQVZfUFJPUEZJTkRfSVNfQUxMUFJPUCk7Ci0gICAgfQotICAgIGRhdl9jbG9zZV9wcm9wZGIocHJvcGRiKTsKLQotICAgIGRhdl9hZGRfcmVzcG9uc2UoY3R4LCBjdHgtPnVyaS5idWYsIDAsICZwcm9wc3RhdHMpOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIGhhbmRsZSB0aGUgUFJPUEZJTkQgbWV0aG9kICovCi1zdGF0aWMgaW50IGRhdl9tZXRob2RfcHJvcGZpbmQocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgZGF2X3Jlc291cmNlICpyZXNvdXJjZTsKLSAgICBpbnQgZGVwdGg7Ci0gICAgZGF2X2Vycm9yICplcnI7Ci0gICAgaW50IHJlc3VsdDsKLSAgICBkYXZfeG1sX2RvYyAqZG9jOwotICAgIGNvbnN0IGRhdl94bWxfZWxlbSAqY2hpbGQ7Ci0gICAgZGF2X3dhbGtlcl9jdHggY3R4ID0geyAwIH07Ci0KLSAgICAvKiBBc2sgcmVwb3NpdG9yeSBtb2R1bGUgdG8gcmVzb2x2ZSB0aGUgcmVzb3VyY2UgKi8KLSAgICByZXN1bHQgPSBkYXZfZ2V0X3Jlc291cmNlKHIsICZyZXNvdXJjZSk7Ci0gICAgaWYgKHJlc3VsdCAhPSBPSykKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLQotICAgIGlmIChkYXZfZ2V0X3Jlc291cmNlX3N0YXRlKHIsIHJlc291cmNlKSA9PSBEQVZfUkVTT1VSQ0VfTlVMTCkgewotCS8qIEFwYWNoZSB3aWxsIHN1cHBseSBhIGRlZmF1bHQgZXJyb3IgZm9yIHRoaXMuICovCi0JcmV0dXJuIEhUVFBfTk9UX0ZPVU5EOwotICAgIH0KLQotICAgIGlmICgoZGVwdGggPSBkYXZfZ2V0X2RlcHRoKHIsIERBVl9JTkZJTklUWSkpIDwgMCkgewotCS8qIGRhdl9nZXRfZGVwdGgoKSBzdXBwbGllcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUKLQkgKiBkZWZhdWx0IG1lc3NhZ2UuICovCi0JcmV0dXJuIEhUVFBfQkFEX1JFUVVFU1Q7Ci0gICAgfQotCi0gICAgaWYgKGRlcHRoID09IERBVl9JTkZJTklUWSkgewotCWRhdl9kaXJfY29uZiAqY29uZjsKLQljb25mID0gKGRhdl9kaXJfY29uZiAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywKLQkJCQkJCSAgICAgJmRhdl9tb2R1bGUpOwotICAgICAgICAvKiBkZWZhdWx0IGlzIHRvIERJU0FMTE9XIHRoZXNlIHJlcXVlc3RzICovCi0JaWYgKGNvbmYtPmFsbG93X2RlcHRoaW5maW5pdHkgIT0gREFWX0VOQUJMRURfT04pIHsKLSAgICAgICAgICAgIHJldHVybiBkYXZfZXJyb3JfcmVzcG9uc2UociwgSFRUUF9GT1JCSURERU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX3BzcHJpbnRmKHItPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQUk9QRklORCByZXF1ZXN0cyB3aXRoIGEgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVwdGggb2YgXCJpbmZpbml0eVwiIGFyZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgYWxsb3dlZCBmb3IgJXMuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfZXNjYXBlX2h0bWwoci0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpKSkpOwotCX0KLSAgICB9Ci0KLSAgICBpZiAoKHJlc3VsdCA9IGRhdl9wYXJzZV9pbnB1dChyLCAmZG9jKSkgIT0gT0spIHsKLQlyZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAvKiBub3RlOiBkb2MgPT0gTlVMTCBpZiBubyByZXF1ZXN0IGJvZHkgKi8KLQotICAgIGlmIChkb2MgJiYgIWRhdl92YWxpZGF0ZV9yb290KGRvYywgInByb3BmaW5kIikpIHsKLQkvKiBUaGlzIHN1cHBsaWVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBkZWZhdWx0IG1lc3NhZ2UuICovCi0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIgfCBBUExPR19OT0VSUk5PLCByLAotCQkgICAgICAiVGhlIFwicHJvcGZpbmRcIiBlbGVtZW50IHdhcyBub3QgZm91bmQuIik7Ci0JcmV0dXJuIEhUVFBfQkFEX1JFUVVFU1Q7Ci0gICAgfQotCi0gICAgLyogIyMjIHZhbGlkYXRlIHRoYXQgb25seSBvbmUgb2YgdGhlc2UgdGhyZWUgZWxlbWVudHMgaXMgcHJlc2VudCAqLwotCi0gICAgaWYgKGRvYyA9PSBOVUxMCi0JfHwgKGNoaWxkID0gZGF2X2ZpbmRfY2hpbGQoZG9jLT5yb290LCAiYWxscHJvcCIpKSAhPSBOVUxMKSB7Ci0JLyogbm90ZTogbm8gcmVxdWVzdCBib2R5IGltcGxpZXMgYWxscHJvcCAqLwotCWN0eC5wcm9wZmluZF90eXBlID0gREFWX1BST1BGSU5EX0lTX0FMTFBST1A7Ci0gICAgfQotICAgIGVsc2UgaWYgKChjaGlsZCA9IGRhdl9maW5kX2NoaWxkKGRvYy0+cm9vdCwgInByb3BuYW1lIikpICE9IE5VTEwpIHsKLQljdHgucHJvcGZpbmRfdHlwZSA9IERBVl9QUk9QRklORF9JU19QUk9QTkFNRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKGNoaWxkID0gZGF2X2ZpbmRfY2hpbGQoZG9jLT5yb290LCAicHJvcCIpKSAhPSBOVUxMKSB7Ci0JY3R4LnByb3BmaW5kX3R5cGUgPSBEQVZfUFJPUEZJTkRfSVNfUFJPUDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JLyogInByb3BmaW5kIiBlbGVtZW50IG11c3QgaGF2ZSBvbmUgb2YgdGhlIGFib3ZlIHRocmVlIGNoaWxkcmVuICovCi0KLQkvKiBUaGlzIHN1cHBsaWVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBkZWZhdWx0IG1lc3NhZ2UuICovCi0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIgfCBBUExPR19OT0VSUk5PLCByLAotCQkgICAgICAiVGhlIFwicHJvcGZpbmRcIiBlbGVtZW50IGRvZXMgbm90IGNvbnRhaW4gb25lIG9mICIKLQkJICAgICAgInRoZSByZXF1aXJlZCBjaGlsZCBlbGVtZW50cyAodGhlIHNwZWNpZmljIGNvbW1hbmQpLiIpOwotCXJldHVybiBIVFRQX0JBRF9SRVFVRVNUOwotICAgIH0KLQotICAgIGN0eC53YWxrX3R5cGUgPSBEQVZfV0FMS1RZUEVfQUxMIHwgREFWX1dBTEtUWVBFX0FVVEg7Ci0gICAgY3R4LmZ1bmMgPSBkYXZfcHJvcGZpbmRfd2Fsa2VyOwotICAgIGN0eC5wb29sID0gci0+cG9vbDsKLSAgICBjdHguZG9jID0gZG9jOwotICAgIGN0eC5yID0gcjsKLSAgICBjdHgucmVzb3VyY2UgPSByZXNvdXJjZTsKLQotICAgIGRhdl9idWZmZXJfaW5pdChyLT5wb29sLCAmY3R4LnVyaSwgci0+dXJpKTsKLQotICAgIC8qICMjIyBzaG91bGQgb3BlbiByZWFkLW9ubHkgKi8KLSAgICBpZiAoKGVyciA9IGRhdl9vcGVuX2xvY2tkYihyLCAwLCAmY3R4LmxvY2tkYikpICE9IE5VTEwpIHsKLQllcnIgPSBkYXZfcHVzaF9lcnJvcihyLT5wb29sLCBlcnItPnN0YXR1cywgMCwKLQkJCSAgICAgIlRoZSBsb2NrIGRhdGFiYXNlIGNvdWxkIG5vdCBiZSBvcGVuZWQsICIKLQkJCSAgICAgInByZXZlbnRpbmcgYWNjZXNzIHRvIHRoZSB2YXJpb3VzIGxvY2sgIgotCQkJICAgICAicHJvcGVydGllcyBmb3IgdGhlIFBST1BGSU5ELiIsCi0JCQkgICAgIGVycik7Ci0JcmV0dXJuIGRhdl9oYW5kbGVfZXJyKHIsIGVyciwgTlVMTCk7Ci0gICAgfQotICAgIGlmIChjdHgubG9ja2RiICE9IE5VTEwpIHsKLQkvKiBpZiB3ZSBoYXZlIGEgbG9jayBkYXRhYmFzZSwgdGhlbiB3ZSBjYW4gd2FsayBsb2NrbnVsbCByZXNvdXJjZXMgKi8KLQljdHgud2Fsa190eXBlIHw9IERBVl9XQUxLVFlQRV9MT0NLTlVMTDsKLSAgICB9Ci0KLSAgICBlcnIgPSAoKnJlc291cmNlLT5ob29rcy0+d2FsaykoJmN0eCwgZGVwdGgpOwotCi0gICAgaWYgKGN0eC5sb2NrZGIgIT0gTlVMTCkgewotCSgqY3R4LmxvY2tkYi0+aG9va3MtPmNsb3NlX2xvY2tkYikoY3R4LmxvY2tkYik7Ci0gICAgfQotCi0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0JLyogIyMjIGFkZCBhIGhpZ2hlci1sZXZlbCBkZXNjcmlwdGlvbj8gKi8KLQlyZXR1cm4gZGF2X2hhbmRsZV9lcnIociwgZXJyLCBOVUxMKTsKLSAgICB9Ci0KLSAgICAvKiByZXR1cm4gYSAyMDcgKE11bHRpLVN0YXR1cykgcmVzcG9uc2Ugbm93LiAqLwotCi0gICAgLyogaWYgYSA0MDQgd2FzIGdlbmVyYXRlZCBmb3IgYW4gSFJFRiwgdGhlbiB3ZSBuZWVkIHRvIHNwaXQgb3V0IHRoZQotICAgICAqIGRvYydzIG5hbWVzcGFjZXMgZm9yIHVzZSBieSB0aGUgNDA0LiBOb3RlIHRoYXQgPHJlc3BvbnNlPiBlbGVtZW50cwotICAgICAqIHdpbGwgb3ZlcnJpZGUgdGhlc2UgbnMwLCBuczEsIGV0YywgYnV0IE5PVCB3aXRoaW4gdGhlIDxyZXNwb25zZT4KLSAgICAgKiBzY29wZSBmb3IgdGhlIGJhZHByb3BzLiAqLwotICAgIC8qIE5PVEU6IHByb3BzdGF0XzQwNCAhPSBOVUxMIGltcGxpZXMgZG9jICE9IE5VTEwgKi8KLSAgICBpZiAoY3R4LnByb3BzdGF0XzQwNCAhPSBOVUxMKSB7Ci0JZGF2X3NlbmRfbXVsdGlzdGF0dXMociwgSFRUUF9NVUxUSV9TVEFUVVMsIGN0eC5yZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jLT5uYW1lc3BhY2VzKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JZGF2X3NlbmRfbXVsdGlzdGF0dXMociwgSFRUUF9NVUxUSV9TVEFUVVMsIGN0eC5yZXNwb25zZSwgTlVMTCk7Ci0gICAgfQotCi0gICAgLyogdGhlIHJlc3BvbnNlIGhhcyBiZWVuIHNlbnQuICovCi0gICAgcmV0dXJuIERPTkU7Ci19Ci0KLXN0YXRpYyBkYXZfdGV4dCAqIGRhdl9mYWlsZWRfcHJvcHBhdGNoKHBvb2wgKnAsIGFycmF5X2hlYWRlciAqcHJvcF9jdHgpCi17Ci0gICAgZGF2X3RleHRfaGVhZGVyIGhkciA9IHsgMCB9OwotICAgIGludCBpID0gcHJvcF9jdHgtPm5lbHRzOwotICAgIGRhdl9wcm9wX2N0eCAqY3R4ID0gKGRhdl9wcm9wX2N0eCAqKXByb3BfY3R4LT5lbHRzOwotICAgIGRhdl9lcnJvciAqZXJyNDI0X3NldCA9IE5VTEw7Ci0gICAgZGF2X2Vycm9yICplcnI0MjRfZGVsZXRlID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICpzOwotCi0gICAgLyogIyMjIG1pZ2h0IGJlIG5pY2UgdG8gc29ydCBieSBzdGF0dXMgY29kZSBhbmQgZGVzY3JpcHRpb24gKi8KLQotICAgIGZvciAoIDsgaS0tID4gMDsgKytjdHggKSB7Ci0JZGF2X3RleHRfYXBwZW5kKHAsICZoZHIsCi0JCQkiPEQ6cHJvcHN0YXQ+IiBERUJVR19DUgotCQkJIjxEOnByb3A+Iik7Ci0JZGF2X3RleHRfYXBwZW5kKHAsICZoZHIsIGRhdl9lbXB0eV9lbGVtKHAsIGN0eC0+cHJvcCkpOwotCWRhdl90ZXh0X2FwcGVuZChwLCAmaGRyLCAiPC9EOnByb3A+IiBERUJVR19DUik7Ci0KLQlpZiAoY3R4LT5lcnIgPT0gTlVMTCkgewotCSAgICAvKiBub3RoaW5nIHdhcyBhc3NpZ25lZCBoZXJlIHlldCwgc28gbWFrZSBpdCBhIDQyNCAqLwotCi0JICAgIGlmIChjdHgtPm9wZXJhdGlvbiA9PSBEQVZfUFJPUF9PUF9TRVQpIHsKLQkJaWYgKGVycjQyNF9zZXQgPT0gTlVMTCkKLQkJICAgIGVycjQyNF9zZXQgPSBkYXZfbmV3X2Vycm9yKHAsIEhUVFBfRkFJTEVEX0RFUEVOREVOQ1ksIDAsCi0JCQkJCSAgICAgICAiQXR0ZW1wdGVkIERBVjpzZXQgb3BlcmF0aW9uICIKLQkJCQkJICAgICAgICJjb3VsZCBub3QgYmUgY29tcGxldGVkIGR1ZSAiCi0JCQkJCSAgICAgICAidG8gb3RoZXIgZXJyb3JzLiIpOwotCQljdHgtPmVyciA9IGVycjQyNF9zZXQ7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoY3R4LT5vcGVyYXRpb24gPT0gREFWX1BST1BfT1BfREVMRVRFKSB7Ci0JCWlmIChlcnI0MjRfZGVsZXRlID09IE5VTEwpCi0JCSAgICBlcnI0MjRfZGVsZXRlID0gZGF2X25ld19lcnJvcihwLCBIVFRQX0ZBSUxFRF9ERVBFTkRFTkNZLCAwLAotCQkJCQkJICAiQXR0ZW1wdGVkIERBVjpyZW1vdmUgIgotCQkJCQkJICAib3BlcmF0aW9uIGNvdWxkIG5vdCBiZSAiCi0JCQkJCQkgICJjb21wbGV0ZWQgZHVlIHRvIG90aGVyICIKLQkJCQkJCSAgImVycm9ycy4iKTsKLQkJY3R4LT5lcnIgPSBlcnI0MjRfZGVsZXRlOwotCSAgICB9Ci0JfQotCi0JcyA9IGFwX3BzcHJpbnRmKHAsCi0JCQkiPEQ6c3RhdHVzPiIKLQkJCSJIVFRQLzEuMSAlZCAoc3RhdHVzKSIKLQkJCSI8L0Q6c3RhdHVzPiIgREVCVUdfQ1IsCi0JCQljdHgtPmVyci0+c3RhdHVzKTsKLQlkYXZfdGV4dF9hcHBlbmQocCwgJmhkciwgcyk7Ci0KLQkvKiAjIyMgd2Ugc2hvdWxkIHVzZSBjb21wdXRlX2Rlc2MgaWYgbmVjZXNzYXJ5Li4uICovCi0JaWYgKGN0eC0+ZXJyLT5kZXNjICE9IE5VTEwpIHsKLQkgICAgZGF2X3RleHRfYXBwZW5kKHAsICZoZHIsICI8RDpyZXNwb25zZWRlc2NyaXB0aW9uPiIgREVCVUdfQ1IpOwotCSAgICBkYXZfdGV4dF9hcHBlbmQocCwgJmhkciwgY3R4LT5lcnItPmRlc2MpOwotCSAgICBkYXZfdGV4dF9hcHBlbmQocCwgJmhkciwgIjwvRDpyZXNwb25zZWRlc2NyaXB0aW9uPiIgREVCVUdfQ1IpOwotCX0KLQotCWRhdl90ZXh0X2FwcGVuZChwLCAmaGRyLCAiPC9EOnByb3BzdGF0PiIgREVCVUdfQ1IpOwotICAgIH0KLQotICAgIHJldHVybiBoZHIuZmlyc3Q7Ci19Ci0KLXN0YXRpYyBkYXZfdGV4dCAqIGRhdl9zdWNjZXNzX3Byb3BwYXRjaChwb29sICpwLCBhcnJheV9oZWFkZXIgKnByb3BfY3R4KQotewotICAgIGRhdl90ZXh0X2hlYWRlciBoZHIgPSB7IDAgfTsKLSAgICBpbnQgaSA9IHByb3BfY3R4LT5uZWx0czsKLSAgICBkYXZfcHJvcF9jdHggKmN0eCA9IChkYXZfcHJvcF9jdHggKilwcm9wX2N0eC0+ZWx0czsKLQotICAgIC8qCi0gICAgKiogIyMjIHdlIHByb2JhYmx5IG5lZWQgdG8gcmV2aXNlIHRoZSB3YXkgd2UgYXNzZW1ibGUgdGhlIHJlc3BvbnNlLi4uCi0gICAgKiogIyMjIHRoaXMgY29kZSBhc3N1bWVzIGV2ZXJ5dGhpbmcgd2lsbCByZXR1cm4gc3RhdHVzPT0yMDAuCi0gICAgKi8KLQotICAgIGRhdl90ZXh0X2FwcGVuZChwLCAmaGRyLAotCQkgICAgIjxEOnByb3BzdGF0PiIgREVCVUdfQ1IKLQkJICAgICI8RDpwcm9wPiIgREVCVUdfQ1IpOwotCi0gICAgZm9yICggOyBpLS0gPiAwOyArK2N0eCApIHsKLQlkYXZfdGV4dF9hcHBlbmQocCwgJmhkciwgZGF2X2VtcHR5X2VsZW0ocCwgY3R4LT5wcm9wKSk7Ci0gICAgfQotCi0gICAgZGF2X3RleHRfYXBwZW5kKHAsICZoZHIsCi0JCSAgICAiPC9EOnByb3A+IiBERUJVR19DUgotCQkgICAgIjxEOnN0YXR1cz5IVFRQLzEuMSAyMDAgT0s8L0Q6c3RhdHVzPiIgREVCVUdfQ1IKLQkJICAgICI8L0Q6cHJvcHN0YXQ+IiBERUJVR19DUik7Ci0KLSAgICByZXR1cm4gaGRyLmZpcnN0OwotfQotCi1zdGF0aWMgdm9pZCBkYXZfcHJvcF9sb2dfZXJyb3JzKGRhdl9wcm9wX2N0eCAqY3R4KQotewotICAgIGRhdl9sb2dfZXJyKGN0eC0+ciwgY3R4LT5lcnIsIEFQTE9HX0VSUik7Ci19Ci0KLS8qCi0qKiBDYWxsIDxmdW5jPiBmb3IgZWFjaCBjb250ZXh0LiBUaGlzIGNhbiBzdG9wIHdoZW4gYW4gZXJyb3Igb2NjdXJzLCBvcgotKiogc2ltcGx5IGl0ZXJhdGUgdGhyb3VnaCB0aGUgd2hvbGUgbGlzdC4KLSoqCi0qKiBSZXR1cm5zIDEgaWYgYW4gZXJyb3Igb2NjdXJzIChhbmQgdGhlIGl0ZXJhdGlvbiBpcyBhYm9ydGVkKS4gUmV0dXJucyAwCi0qKiBpZiBhbGwgZWxlbWVudHMgYXJlIHByb2Nlc3NlZC4KLSoqCi0qKiBJZiA8cmV2ZXJzZT4gaXMgdHJ1ZSAobm9uLXplcm8pLCB0aGVuIHRoZSBsaXN0IGlzIHRyYXZlcnNlZCBpbgotKiogcmV2ZXJzZSBvcmRlci4KLSovCi1zdGF0aWMgaW50IGRhdl9wcm9jZXNzX2N0eF9saXN0KHZvaWQgKCpmdW5jKShkYXZfcHJvcF9jdHggKmN0eCksCi0JCQkJYXJyYXlfaGVhZGVyICpjdHhfbGlzdCwgaW50IHN0b3Bfb25fZXJyb3IsCi0JCQkJaW50IHJldmVyc2UpCi17Ci0gICAgaW50IGkgPSBjdHhfbGlzdC0+bmVsdHM7Ci0gICAgZGF2X3Byb3BfY3R4ICpjdHggPSAoZGF2X3Byb3BfY3R4ICopY3R4X2xpc3QtPmVsdHM7Ci0KLSAgICBpZiAocmV2ZXJzZSkKLQljdHggKz0gaTsKLQotICAgIHdoaWxlIChpLS0pIHsKLQlpZiAocmV2ZXJzZSkKLQkgICAgLS1jdHg7Ci0KLQkoKmZ1bmMpKGN0eCk7Ci0JaWYgKHN0b3Bfb25fZXJyb3IgJiYgREFWX1BST1BfQ1RYX0hBU19FUlIoKmN0eCkpIHsKLQkgICAgcmV0dXJuIDE7Ci0JfQotCi0JaWYgKCFyZXZlcnNlKQotCSAgICArK2N0eDsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyogaGFuZGxlIHRoZSBQUk9QUEFUQ0ggbWV0aG9kICovCi1zdGF0aWMgaW50IGRhdl9tZXRob2RfcHJvcHBhdGNoKHJlcXVlc3RfcmVjICpyKQotewotICAgIGRhdl9lcnJvciAqZXJyOwotICAgIGRhdl9yZXNvdXJjZSAqcmVzb3VyY2U7Ci0gICAgaW50IHJlc3VsdDsKLSAgICBkYXZfeG1sX2RvYyAqZG9jOwotICAgIGRhdl94bWxfZWxlbSAqY2hpbGQ7Ci0gICAgZGF2X3Byb3BkYiAqcHJvcGRiOwotICAgIGludCBmYWlsdXJlID0gMDsKLSAgICBkYXZfcmVzcG9uc2UgcmVzcCA9IHsgMCB9OwotICAgIGRhdl90ZXh0ICpwcm9wc3RhdF90ZXh0OwotICAgIGFycmF5X2hlYWRlciAqY3R4X2xpc3Q7Ci0gICAgZGF2X3Byb3BfY3R4ICpjdHg7Ci0KLSAgICAvKiBBc2sgcmVwb3NpdG9yeSBtb2R1bGUgdG8gcmVzb2x2ZSB0aGUgcmVzb3VyY2UgKi8KLSAgICByZXN1bHQgPSBkYXZfZ2V0X3Jlc291cmNlKHIsICZyZXNvdXJjZSk7Ci0gICAgaWYgKHJlc3VsdCAhPSBPSykKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICBpZiAoIXJlc291cmNlLT5leGlzdHMpIHsKLQkvKiBBcGFjaGUgd2lsbCBzdXBwbHkgYSBkZWZhdWx0IGVycm9yIGZvciB0aGlzLiAqLwotCXJldHVybiBIVFRQX05PVF9GT1VORDsKLSAgICB9Ci0KLSAgICBpZiAoKHJlc3VsdCA9IGRhdl9wYXJzZV9pbnB1dChyLCAmZG9jKSkgIT0gT0spIHsKLQlyZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAvKiBub3RlOiBkb2MgPT0gTlVMTCBpZiBubyByZXF1ZXN0IGJvZHkgKi8KLQotICAgIGlmIChkb2MgPT0gTlVMTCB8fCAhZGF2X3ZhbGlkYXRlX3Jvb3QoZG9jLCAicHJvcGVydHl1cGRhdGUiKSkgewotCS8qIFRoaXMgc3VwcGxpZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIGRlZmF1bHQgbWVzc2FnZS4gKi8KLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiB8IEFQTE9HX05PRVJSTk8sIHIsCi0JCSAgICAgICJUaGUgcmVxdWVzdCBib2R5IGRvZXMgbm90IGNvbnRhaW4gIgotCQkgICAgICAiYSBcInByb3BlcnR5dXBkYXRlXCIgZWxlbWVudC4iKTsKLQlyZXR1cm4gSFRUUF9CQURfUkVRVUVTVDsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBJZi1IZWFkZXJzIGFuZCBleGlzdGluZyBsb2NrcyAqLwotICAgIC8qIE5vdGU6IGRlcHRoID09IDAuIEltcGxpZXMgbm8gbmVlZCBmb3IgYSBtdWx0aXN0YXR1cyByZXNwb25zZS4gKi8KLSAgICBpZiAoKGVyciA9IGRhdl92YWxpZGF0ZV9yZXF1ZXN0KHIsIHJlc291cmNlLCAwLCBOVUxMLCBOVUxMLAotCQkJCSAgICBEQVZfVkFMSURBVEVfUkVTT1VSQ0UsIE5VTEwpKSAhPSBOVUxMKSB7Ci0JLyogIyMjIGFkZCBhIGhpZ2hlci1sZXZlbCBkZXNjcmlwdGlvbj8gKi8KLQlyZXR1cm4gZGF2X2hhbmRsZV9lcnIociwgZXJyLCBOVUxMKTsKLSAgICB9Ci0KLSAgICBpZiAoKGVyciA9IGRhdl9vcGVuX3Byb3BkYihyLCBOVUxMLCByZXNvdXJjZSwgMCwgZG9jLT5uYW1lc3BhY2VzLAotCQkJICAgICAgICZwcm9wZGIpKSAhPSBOVUxMKSB7Ci0JZXJyID0gZGF2X3B1c2hfZXJyb3Ioci0+cG9vbCwgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsIDAsCi0JCQkgICAgIGFwX3BzcHJpbnRmKHItPnBvb2wsCi0JCQkJCSAiQ291bGQgbm90IG9wZW4gdGhlIHByb3BlcnR5ICIKLQkJCQkJICJkYXRhYmFzZSBmb3IgJXMuIiwKLQkJCQkJIGFwX2VzY2FwZV9odG1sKHItPnBvb2wsIHItPnVyaSkpLAotCQkJICAgICBlcnIpOwotCXJldHVybiBkYXZfaGFuZGxlX2VycihyLCBlcnIsIE5VTEwpOwotICAgIH0KLSAgICAvKiAjIyMgd2hhdCB0byBkbyBhYm91dCBjbG9zaW5nIHRoZSBwcm9wZGIgb24gc2VydmVyIGZhaWx1cmU/ICovCi0KLSAgICAvKiAjIyMgdmFsaWRhdGUgImxpdmUiIHByb3BlcnRpZXMgKi8KLQotICAgIC8qIHNldCB1cCBhbiBhcnJheSB0byBob2xkIHByb3BlcnR5IG9wZXJhdGlvbiBjb250ZXh0cyAqLwotICAgIGN0eF9saXN0ID0gYXBfbWFrZV9hcnJheShyLT5wb29sLCAxMCwgc2l6ZW9mKGRhdl9wcm9wX2N0eCkpOwotCi0gICAgLyogZG8gYSBmaXJzdCBwYXNzIHRvIGVuc3VyZSB0aGF0IGFsbCAicmVtb3ZlIiBwcm9wZXJ0aWVzIGV4aXN0ICovCi0gICAgZm9yIChjaGlsZCA9IGRvYy0+cm9vdC0+Zmlyc3RfY2hpbGQ7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7Ci0JaW50IGlzX3JlbW92ZTsKLQlkYXZfeG1sX2VsZW0gKnByb3BfZ3JvdXA7Ci0JZGF2X3htbF9lbGVtICpvbmVfcHJvcDsKLQotCS8qIElnbm9yZSBjaGlsZHJlbiB0aGF0IGFyZSBub3Qgc2V0L3JlbW92ZSAqLwotCWlmIChjaGlsZC0+bnMgIT0gREFWX05TX0RBVl9JRAotCSAgICB8fCAoIShpc19yZW1vdmUgPSBzdHJjbXAoY2hpbGQtPm5hbWUsICJyZW1vdmUiKSA9PSAwKQotCQkmJiBzdHJjbXAoY2hpbGQtPm5hbWUsICJzZXQiKSAhPSAwKSkgewotCSAgICBjb250aW51ZTsKLQl9Ci0KLQkvKiBtYWtlIHN1cmUgdGhhdCBhICJwcm9wIiBjaGlsZCBleGlzdHMgZm9yIHNldC9yZW1vdmUgKi8KLQlpZiAoKHByb3BfZ3JvdXAgPSBkYXZfZmluZF9jaGlsZChjaGlsZCwgInByb3AiKSkgPT0gTlVMTCkgewotCSAgICBkYXZfY2xvc2VfcHJvcGRiKHByb3BkYik7Ci0KLQkgICAgLyogVGhpcyBzdXBwbGllcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgZGVmYXVsdCBtZXNzYWdlLiAqLwotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiB8IEFQTE9HX05PRVJSTk8sIHIsCi0JCQkgICJBIFwicHJvcFwiIGVsZW1lbnQgaXMgbWlzc2luZyBpbnNpZGUgIgotCQkJICAidGhlIHByb3BlcnR5dXBkYXRlIGNvbW1hbmQuIik7Ci0JICAgIHJldHVybiBIVFRQX0JBRF9SRVFVRVNUOwotCX0KLQotCWZvciAob25lX3Byb3AgPSBwcm9wX2dyb3VwLT5maXJzdF9jaGlsZDsgb25lX3Byb3A7Ci0JICAgICBvbmVfcHJvcCA9IG9uZV9wcm9wLT5uZXh0KSB7Ci0KLQkgICAgY3R4ID0gKGRhdl9wcm9wX2N0eCAqKWFwX3B1c2hfYXJyYXkoY3R4X2xpc3QpOwotCSAgICBjdHgtPnByb3BkYiA9IHByb3BkYjsKLQkgICAgY3R4LT5vcGVyYXRpb24gPSBpc19yZW1vdmUgPyBEQVZfUFJPUF9PUF9ERUxFVEUgOiBEQVZfUFJPUF9PUF9TRVQ7Ci0JICAgIGN0eC0+cHJvcCA9IG9uZV9wcm9wOwotCi0gICAgICAgICAgICBjdHgtPnIgPSByOyAgICAgICAgIC8qIGZvciBsYXRlciB1c2UgYnkgZGF2X3Byb3BfbG9nX2Vycm9ycygpICovCi0KLQkgICAgZGF2X3Byb3BfdmFsaWRhdGUoY3R4KTsKLQotCSAgICBpZiAoIERBVl9QUk9QX0NUWF9IQVNfRVJSKCpjdHgpICkgewotCQlmYWlsdXJlID0gMTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICAvKiAjIyMgc2hvdWxkIHRlc3QgdGhhdCB3ZSBmb3VuZCBhdCBsZWFzdCBvbmUgc2V0L3JlbW92ZSAqLwotCi0gICAgLyogZXhlY3V0ZSBhbGwgb2YgdGhlIG9wZXJhdGlvbnMgKi8KLSAgICBpZiAoIWZhaWx1cmUgJiYgZGF2X3Byb2Nlc3NfY3R4X2xpc3QoZGF2X3Byb3BfZXhlYywgY3R4X2xpc3QsIDEsIDApKSB7Ci0JZmFpbHVyZSA9IDE7Ci0gICAgfQotCi0gICAgLyogZ2VuZXJhdGUgYSBmYWlsdXJlL3N1Y2Nlc3MgcmVzcG9uc2UgKi8KLSAgICBpZiAoZmFpbHVyZSkgewotCSh2b2lkKWRhdl9wcm9jZXNzX2N0eF9saXN0KGRhdl9wcm9wX3JvbGxiYWNrLCBjdHhfbGlzdCwgMCwgMSk7Ci0JcHJvcHN0YXRfdGV4dCA9IGRhdl9mYWlsZWRfcHJvcHBhdGNoKHItPnBvb2wsIGN0eF9saXN0KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JKHZvaWQpZGF2X3Byb2Nlc3NfY3R4X2xpc3QoZGF2X3Byb3BfY29tbWl0LCBjdHhfbGlzdCwgMCwgMCk7Ci0JcHJvcHN0YXRfdGV4dCA9IGRhdl9zdWNjZXNzX3Byb3BwYXRjaChyLT5wb29sLCBjdHhfbGlzdCk7Ci0gICAgfQotCi0gICAgLyogbWFrZSBzdXJlIHRoaXMgZ2V0cyBjbG9zZWQhICovCi0gICAgZGF2X2Nsb3NlX3Byb3BkYihwcm9wZGIpOwotCi0gICAgLyogbG9nIGFueSBlcnJvcnMgdGhhdCBvY2N1cnJlZCAqLwotICAgICh2b2lkKWRhdl9wcm9jZXNzX2N0eF9saXN0KGRhdl9wcm9wX2xvZ19lcnJvcnMsIGN0eF9saXN0LCAwLCAwKTsKLQotICAgIHJlc3AuaHJlZiA9IHJlc291cmNlLT51cmk7Ci0KLSAgICAvKiAjIyMgc2hvdWxkIHByb2JhYmx5IHVzZSBzb21ldGhpbmcgbmV3IHRvIHBhc3MgYWxvbmcgdGhpcyB0ZXh0Li4uICovCi0gICAgcmVzcC5wcm9wcmVzdWx0LnByb3BzdGF0cyA9IHByb3BzdGF0X3RleHQ7Ci0KLSAgICBkYXZfc2VuZF9tdWx0aXN0YXR1cyhyLCBIVFRQX01VTFRJX1NUQVRVUywgJnJlc3AsIGRvYy0+bmFtZXNwYWNlcyk7Ci0KLSAgICAvKiB0aGUgcmVzcG9uc2UgaGFzIGJlZW4gc2VudC4gKi8KLSAgICByZXR1cm4gRE9ORTsKLX0KLQotc3RhdGljIGludCBwcm9jZXNzX21rY29sX2JvZHkocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgLyogVGhpcyBpcyBzbmFyZmVkIGZyb20gYXBfc2V0dXBfY2xpZW50X2Jsb2NrKCkuIFdlIGNvdWxkIGdldCBwcmV0dHkKLSAgICAgKiBjbG9zZSB0byB0aGlzIGJlaGF2aW9yIGJ5IHBhc3NpbmcgUkVRVUVTVF9OT19CT0RZLCBidXQgd2UgbmVlZCB0bwotICAgICAqIHJldHVybiBIVFRQX1VOU1VQUE9SVEVEX01FRElBX1RZUEUgKHdoaWxlIGFwX3NldHVwX2NsaWVudF9ibG9jawotICAgICAqIHJldHVybnMgSFRUUF9SRVFVRVNUX0VOVElUWV9UT09fTEFSR0UpLiAqLwotCi0gICAgY29uc3QgY2hhciAqdGVuYyA9IGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiVHJhbnNmZXItRW5jb2RpbmciKTsKLSAgICBjb25zdCBjaGFyICpsZW5wID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJDb250ZW50LUxlbmd0aCIpOwotCi0gICAgLyogbWFrZSBzdXJlIHRvIHNldCB0aGUgQXBhY2hlIHJlcXVlc3QgZmllbGRzIHByb3Blcmx5LiAqLwotICAgIHItPnJlYWRfYm9keSA9IFJFUVVFU1RfTk9fQk9EWTsKLSAgICByLT5yZWFkX2NodW5rZWQgPSAwOwotICAgIHItPnJlbWFpbmluZyA9IDA7Ci0KLSAgICBpZiAodGVuYykgewotCWlmIChzdHJjYXNlY21wKHRlbmMsICJjaHVua2VkIikpIHsKLQkgICAgLyogVXNlIHRoaXMgaW5zdGVhZCBvZiBBcGFjaGUncyBkZWZhdWx0IGVycm9yIHN0cmluZyAqLwotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiB8IEFQTE9HX05PRVJSTk8sIHIsCi0JCQkgICJVbmtub3duIFRyYW5zZmVyLUVuY29kaW5nICVzIiwgdGVuYyk7Ci0JICAgIHJldHVybiBIVFRQX05PVF9JTVBMRU1FTlRFRDsKLQl9Ci0KLQlyLT5yZWFkX2NodW5rZWQgPSAxOwotICAgIH0KLSAgICBlbHNlIGlmIChsZW5wKSB7Ci0JY29uc3QgY2hhciAqcG9zID0gbGVucDsKLQotCXdoaWxlIChhcF9pc2RpZ2l0KCpwb3MpIHx8IGFwX2lzc3BhY2UoKnBvcykpIHsKLQkgICAgKytwb3M7Ci0JfQotCWlmICgqcG9zICE9ICdcMCcpIHsKLQkgICAgLyogVGhpcyBzdXBwbGllcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgZGVmYXVsdCBtZXNzYWdlLiAqLwotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiB8IEFQTE9HX05PRVJSTk8sIHIsCi0JCQkgICJJbnZhbGlkIENvbnRlbnQtTGVuZ3RoICVzIiwgbGVucCk7Ci0JICAgIHJldHVybiBIVFRQX0JBRF9SRVFVRVNUOwotCX0KLQotCXItPnJlbWFpbmluZyA9IGF0b2wobGVucCk7Ci0gICAgfQotCi0gICAgaWYgKHItPnJlYWRfY2h1bmtlZCB8fCByLT5yZW1haW5pbmcgPiAwKSB7Ci0JLyogIyMjIGxvZyBzb21ldGhpbmc/ICovCi0KLQkvKiBBcGFjaGUgd2lsbCBzdXBwbHkgYSBkZWZhdWx0IGVycm9yIGZvciB0aGlzLiAqLwotCXJldHVybiBIVFRQX1VOU1VQUE9SVEVEX01FRElBX1RZUEU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqKiBHZXQgcmlkIG9mIHRoZSBib2R5LiB0aGlzIHdpbGwgY2FsbCBhcF9zZXR1cF9jbGllbnRfYmxvY2soKSwgYnV0Ci0gICAgKiogb3VyIGNvcHkgYWJvdmUgaGFzIGFscmVhZHkgdmVyaWZpZWQgaXRzIHdvcmsuCi0gICAgKi8KLSAgICByZXR1cm4gYXBfZGlzY2FyZF9yZXF1ZXN0X2JvZHkocik7Ci19Ci0KLS8qIGhhbmRsZSB0aGUgTUtDT0wgbWV0aG9kICovCi1zdGF0aWMgaW50IGRhdl9tZXRob2RfbWtjb2wocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgZGF2X3Jlc291cmNlICpyZXNvdXJjZTsKLSAgICBpbnQgcmVzb3VyY2Vfc3RhdGU7Ci0gICAgZGF2X3Jlc291cmNlICpyZXNvdXJjZV9wYXJlbnQ7Ci0gICAgY29uc3QgZGF2X2hvb2tzX2xvY2tzICpsb2Nrc19ob29rcyA9IERBVl9HRVRfSE9PS1NfTE9DS1Mocik7Ci0gICAgZGF2X2Vycm9yICplcnI7Ci0gICAgZGF2X2Vycm9yICplcnIyOwotICAgIGludCByZXN1bHQ7Ci0gICAgZGF2X2Rpcl9jb25mICpjb25mOwotICAgIGludCBwYXJlbnRfd2FzX3dyaXRhYmxlID0gMDsKLSAgICBkYXZfcmVzcG9uc2UgKm11bHRpX3N0YXR1czsKLQotICAgIC8qIGhhbmRsZSB0aGUgcmVxdWVzdCBib2R5ICovCi0gICAgLyogIyMjIHRoaXMgbWF5IG1vdmUgbG93ZXIgb25jZSB3ZSBzdGFydCBwcm9jZXNzaW5nIGJvZGllcyAqLwotICAgIGlmICgocmVzdWx0ID0gcHJvY2Vzc19ta2NvbF9ib2R5KHIpKSAhPSBPSykgewotCXJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgY29uZiA9IChkYXZfZGlyX2NvbmYgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCQkgJmRhdl9tb2R1bGUpOwotCi0gICAgLyogQXNrIHJlcG9zaXRvcnkgbW9kdWxlIHRvIHJlc29sdmUgdGhlIHJlc291cmNlICovCi0gICAgcmVzdWx0ID0gZGF2X2dldF9yZXNvdXJjZShyLCAmcmVzb3VyY2UpOwotICAgIGlmIChyZXN1bHQgIT0gT0spCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICBpZiAocmVzb3VyY2UtPmV4aXN0cykgewotCS8qIG9vcHMuIHNvbWV0aGluZyB3YXMgYWxyZWFkeSB0aGVyZSEgKi8KLQotCS8qIEFwYWNoZSB3aWxsIHN1cHBseSBhIGRlZmF1bHQgZXJyb3IgZm9yIHRoaXMuICovCi0JLyogIyMjIHdlIHNob3VsZCBwcm92aWRlIGEgc3BlY2lmaWMgZXJyb3IgbWVzc2FnZSEgKi8KLQlyZXR1cm4gSFRUUF9NRVRIT0RfTk9UX0FMTE9XRUQ7Ci0gICAgfQotCi0gICAgcmVzb3VyY2Vfc3RhdGUgPSBkYXZfZ2V0X3Jlc291cmNlX3N0YXRlKHIsIHJlc291cmNlKTsKLQotICAgIC8qCi0gICAgKiogQ2hlY2sgSWYtSGVhZGVycyBhbmQgZXhpc3RpbmcgbG9ja3MuCi0gICAgKioKLSAgICAqKiBOb3RlOiBkZXB0aCA9PSAwIG5vcm1hbGx5IHJlcXVpcmVzIG5vIG11bHRpc3RhdHVzIHJlc3BvbnNlLiBIb3dldmVyLAotICAgICoqIGlmIHdlIHBhc3MgREFWX1ZBTElEQVRFX1BBUkVOVCwgdGhlbiB3ZSBjb3VsZCBnZXQgYW4gZXJyb3Igb24gYSBVUkkKLSAgICAqKiBvdGhlciB0aGFuIHRoZSBSZXF1ZXN0LVVSSSwgdGhlcmVieSByZXF1aXJpbmcgYSBtdWx0aXN0YXR1cy4KLSAgICAqKgotICAgICoqIElmIHRoZSByZXNvdXJjZSBkb2VzIG5vdCBleGlzdCAoREFWX1JFU09VUkNFX05VTEwpLCB0aGVuIHdlIG11c3QKLSAgICAqKiBjaGVjayB0aGUgcmVzb3VyY2UgKmFuZCogaXRzIHBhcmVudC4gSWYgdGhlIHJlc291cmNlIGV4aXN0cyBvciBpcwotICAgICoqIGEgbG9ja251bGwgcmVzb3VyY2UsIHRoZW4gd2UgY2hlY2sgb25seSB0aGUgcmVzb3VyY2UuCi0gICAgKi8KLSAgICBpZiAoKGVyciA9IGRhdl92YWxpZGF0ZV9yZXF1ZXN0KHIsIHJlc291cmNlLCAwLCBOVUxMLCAmbXVsdGlfc3RhdHVzLAotCQkJCSAgICByZXNvdXJjZV9zdGF0ZSA9PSBEQVZfUkVTT1VSQ0VfTlVMTCA/Ci0JCQkJICAgIERBVl9WQUxJREFURV9QQVJFTlQgOgotCQkJCSAgICBEQVZfVkFMSURBVEVfUkVTT1VSQ0UsIE5VTEwpKSAhPSBOVUxMKSB7Ci0JLyogIyMjIGFkZCBhIGhpZ2hlci1sZXZlbCBkZXNjcmlwdGlvbj8gKi8KLQlyZXR1cm4gZGF2X2hhbmRsZV9lcnIociwgZXJyLCBtdWx0aV9zdGF0dXMpOwotICAgIH0KLQotICAgIC8qIGlmIHZlcnNpb25lZCByZXNvdXJjZSwgbWFrZSBzdXJlIHBhcmVudCBpcyBjaGVja2VkIG91dCAqLwotICAgIGlmICgoZXJyID0gZGF2X2Vuc3VyZV9yZXNvdXJjZV93cml0YWJsZShyLCByZXNvdXJjZSwgMSAvKiBwYXJlbnRfb25seSAqLywKLQkJCQkJICAgICZyZXNvdXJjZV9wYXJlbnQsCi0JCQkJCSAgICBOVUxMLCBOVUxMLAotCQkJCQkgICAgJnBhcmVudF93YXNfd3JpdGFibGUpKSAhPSBOVUxMKSB7Ci0JLyogIyMjIGFkZCBhIGhpZ2hlci1sZXZlbCBkZXNjcmlwdGlvbj8gKi8KLQlyZXR1cm4gZGF2X2hhbmRsZV9lcnIociwgZXJyLCBOVUxMKTsKLSAgICB9Ci0KLSAgICAvKiB0cnkgdG8gY3JlYXRlIHRoZSBjb2xsZWN0aW9uICovCi0gICAgcmVzb3VyY2UtPmNvbGxlY3Rpb24gPSAxOwotICAgIGVyciA9ICgqcmVzb3VyY2UtPmhvb2tzLT5jcmVhdGVfY29sbGVjdGlvbikoci0+cG9vbCwgcmVzb3VyY2UpOwotCi0gICAgLyogcmVzdG9yZSBtb2RpZmlhYmlsaXR5IG9mIHBhcmVudCBiYWNrIHRvIHdoYXQgaXQgd2FzICovCi0gICAgZXJyMiA9IGRhdl9yZXZlcnRfcmVzb3VyY2Vfd3JpdGFiaWxpdHkociwgTlVMTCwgcmVzb3VyY2VfcGFyZW50LAotCQkJCQkgIGVyciAhPSBOVUxMIC8qIHVuZG8gaWYgZXJyb3IgKi8sCi0JCQkJCSAgMCwgMCwgcGFyZW50X3dhc193cml0YWJsZSk7Ci0KLSAgICAvKiBjaGVjayBmb3IgZXJyb3JzIG5vdyAqLwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotCXJldHVybiBkYXZfaGFuZGxlX2VycihyLCBlcnIsIE5VTEwpOwotICAgIH0KLSAgICBpZiAoZXJyMiAhPSBOVUxMKSB7Ci0JLyoganVzdCBsb2cgYSB3YXJuaW5nICovCi0JZXJyID0gZGF2X3B1c2hfZXJyb3Ioci0+cG9vbCwgZXJyLT5zdGF0dXMsIDAsCi0JCQkgICAgICJUaGUgTUtDT0wgd2FzIHN1Y2Nlc3NmdWwsIGJ1dCB0aGVyZSAiCi0JCQkgICAgICJ3YXMgYSBwcm9ibGVtIHJldmVydGluZyB0aGUgd3JpdGFiaWxpdHkgb2YgIgotCQkJICAgICAiaXRzIHBhcmVudCBjb2xsZWN0aW9uLiIsCi0JCQkgICAgIGVycjIpOwotCWRhdl9sb2dfZXJyKHIsIGVyciwgQVBMT0dfV0FSTklORyk7Ci0gICAgfQotCi0gICAgaWYgKGxvY2tzX2hvb2tzICE9IE5VTEwpIHsKLQlkYXZfbG9ja2RiICpsb2NrZGI7Ci0KLQlpZiAoKGVyciA9ICgqbG9ja3NfaG9va3MtPm9wZW5fbG9ja2RiKShyLCAwLCAwLCAmbG9ja2RiKSkgIT0gTlVMTCkgewotCSAgICAvKiBUaGUgZGlyZWN0b3J5IGNyZWF0aW9uIHdhcyBzdWNjZXNzZnVsLCBidXQgdGhlIGxvY2tpbmcgZmFpbGVkLiAqLwotCSAgICBlcnIgPSBkYXZfcHVzaF9lcnJvcihyLT5wb29sLCBlcnItPnN0YXR1cywgMCwKLQkJCQkgIlRoZSBNS0NPTCB3YXMgc3VjY2Vzc2Z1bCwgYnV0IHRoZXJlICIKLQkJCQkgIndhcyBhIHByb2JsZW0gb3BlbmluZyB0aGUgbG9jayBkYXRhYmFzZSAiCi0JCQkJICJ3aGljaCBwcmV2ZW50cyBpbmhlcml0aW5nIGxvY2tzIGZyb20gdGhlICIKLQkJCQkgInBhcmVudCByZXNvdXJjZXMuIiwKLQkJCQkgZXJyKTsKLQkgICAgcmV0dXJuIGRhdl9oYW5kbGVfZXJyKHIsIGVyciwgTlVMTCk7Ci0JfQotCi0JLyogbm90aWZ5IGxvY2sgc3lzdGVtIHRoYXQgd2UgaGF2ZSBjcmVhdGVkL3JlcGxhY2VkIGEgcmVzb3VyY2UgKi8KLQllcnIgPSBkYXZfbm90aWZ5X2NyZWF0ZWQociwgbG9ja2RiLCByZXNvdXJjZSwgcmVzb3VyY2Vfc3RhdGUsIDApOwotCi0JKCpsb2Nrc19ob29rcy0+Y2xvc2VfbG9ja2RiKShsb2NrZGIpOwotCi0JaWYgKGVyciAhPSBOVUxMKSB7Ci0JICAgIC8qIFRoZSBkaXIgY3JlYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGJ1dCB0aGUgbG9ja2luZyBmYWlsZWQuICovCi0JICAgIGVyciA9IGRhdl9wdXNoX2Vycm9yKHItPnBvb2wsIGVyci0+c3RhdHVzLCAwLAotCQkJCSAiVGhlIE1LQ09MIHdhcyBzdWNjZXNzZnVsLCBidXQgdGhlcmUgIgotCQkJCSAid2FzIGEgcHJvYmxlbSB1cGRhdGluZyBpdHMgbG9jayAiCi0JCQkJICJpbmZvcm1hdGlvbi4iLAotCQkJCSBlcnIpOwotCSAgICByZXR1cm4gZGF2X2hhbmRsZV9lcnIociwgZXJyLCBOVUxMKTsKLQl9Ci0gICAgfQotCi0gICAgLyogcmV0dXJuIGFuIGFwcHJvcHJpYXRlIHJlc3BvbnNlIChIVFRQX0NSRUFURUQpICovCi0gICAgcmV0dXJuIGRhdl9jcmVhdGVkKHIsIE5VTEwsIHJlc291cmNlLCAiQ29sbGVjdGlvbiIsIDApOwotfQotCi0vKiBoYW5kbGUgdGhlIENPUFkgYW5kIE1PVkUgbWV0aG9kcyAqLwotc3RhdGljIGludCBkYXZfbWV0aG9kX2NvcHltb3ZlKHJlcXVlc3RfcmVjICpyLCBpbnQgaXNfbW92ZSkKLXsKLSAgICBkYXZfcmVzb3VyY2UgKnJlc291cmNlOwotICAgIGRhdl9yZXNvdXJjZSAqcmVzb3VyY2VfcGFyZW50ID0gTlVMTDsKLSAgICBkYXZfcmVzb3VyY2UgKnJlc25ldzsKLSAgICBkYXZfcmVzb3VyY2UgKnJlc25ld19wYXJlbnQgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKmJvZHk7Ci0gICAgY29uc3QgY2hhciAqZGVzdDsKLSAgICBkYXZfZXJyb3IgKmVycjsKLSAgICBkYXZfZXJyb3IgKmVycjI7Ci0gICAgZGF2X2Vycm9yICplcnIzOwotICAgIGRhdl9yZXNwb25zZSAqbXVsdGlfcmVzcG9uc2U7Ci0gICAgZGF2X2xvb2t1cF9yZXN1bHQgbG9va3VwOwotICAgIGludCBpc19kaXI7Ci0gICAgaW50IG92ZXJ3cml0ZTsKLSAgICBpbnQgZGVwdGg7Ci0gICAgaW50IHJlc3VsdDsKLSAgICBkYXZfbG9ja2RiICpsb2NrZGI7Ci0gICAgaW50IHJlcGxhY2VkOwotICAgIGludCBzcmNfcGFyZW50X3dhc193cml0YWJsZSA9IDA7Ci0gICAgaW50IGRzdF9wYXJlbnRfd2FzX3dyaXRhYmxlID0gMDsKLQotICAgIC8qIEFzayByZXBvc2l0b3J5IG1vZHVsZSB0byByZXNvbHZlIHRoZSByZXNvdXJjZSAqLwotICAgIHJlc3VsdCA9IGRhdl9nZXRfcmVzb3VyY2UociwgJnJlc291cmNlKTsKLSAgICBpZiAocmVzdWx0ICE9IE9LKQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIGlmICghcmVzb3VyY2UtPmV4aXN0cykgewotCS8qIEFwYWNoZSB3aWxsIHN1cHBseSBhIGRlZmF1bHQgZXJyb3IgZm9yIHRoaXMuICovCi0JcmV0dXJuIEhUVFBfTk9UX0ZPVU5EOwotICAgIH0KLQotICAgIC8qIElmIG5vdCBhIGZpbGUgb3IgY29sbGVjdGlvbiByZXNvdXJjZSwgQ09QWS9NT1ZFIG5vdCBhbGxvd2VkICovCi0gICAgaWYgKHJlc291cmNlLT50eXBlICE9IERBVl9SRVNPVVJDRV9UWVBFX1JFR1VMQVIpIHsKLSAgICAgICAgYm9keSA9IGFwX3BzcHJpbnRmKHItPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IENPUFkvTU9WRSByZXNvdXJjZSAlcy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfZXNjYXBlX2h0bWwoci0+cG9vbCwgci0+dXJpKSk7Ci0JcmV0dXJuIGRhdl9lcnJvcl9yZXNwb25zZShyLCBIVFRQX01FVEhPRF9OT1RfQUxMT1dFRCwgYm9keSk7Ci0gICAgfQotCi0gICAgLyogZ2V0IHRoZSBkZXN0aW5hdGlvbiBVUkkgKi8KLSAgICBkZXN0ID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJEZXN0aW5hdGlvbiIpOwotICAgIGlmIChkZXN0ID09IE5VTEwpIHsKLQkvKiBMb29rIGluIGhlYWRlcnMgcHJvdmlkZWQgYnkgTmV0c2NhcGUncyBSb2FtaW5nIFByb2ZpbGVzICovCi0JY29uc3QgY2hhciAqbnNjcF9ob3N0ID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJIb3N0Iik7Ci0JY29uc3QgY2hhciAqbnNjcF9wYXRoID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJOZXctdXJpIik7Ci0KLQlpZiAobnNjcF9ob3N0ICE9IE5VTEwgJiYgbnNjcF9wYXRoICE9IE5VTEwpCi0JICAgIGRlc3QgPSBhcF9wc3ByaW50ZihyLT5wb29sLCAiaHR0cDovLyVzJXMiLCBuc2NwX2hvc3QsIG5zY3BfcGF0aCk7Ci0gICAgfQotICAgIGlmIChkZXN0ID09IE5VTEwpIHsKLQkvKiBUaGlzIHN1cHBsaWVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBkZWZhdWx0IG1lc3NhZ2UuICovCi0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIgfCBBUExPR19OT0VSUk5PLCByLAotCQkgICAgICAiVGhlIHJlcXVlc3QgaXMgbWlzc2luZyBhIERlc3RpbmF0aW9uIGhlYWRlci4iKTsKLQlyZXR1cm4gSFRUUF9CQURfUkVRVUVTVDsKLSAgICB9Ci0KLSAgICBsb29rdXAgPSBkYXZfbG9va3VwX3VyaShkZXN0LCByKTsKLSAgICBpZiAobG9va3VwLnJuZXcgPT0gTlVMTCkgewotCWlmIChsb29rdXAuZXJyLnN0YXR1cyA9PSBIVFRQX0JBRF9SRVFVRVNUKSB7Ci0JICAgIC8qIFRoaXMgc3VwcGxpZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIGRlZmF1bHQgbWVzc2FnZS4gKi8KLQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIgfCBBUExPR19OT0VSUk5PLCByLAotCQkJICBsb29rdXAuZXJyLmRlc2MpOwotCSAgICByZXR1cm4gSFRUUF9CQURfUkVRVUVTVDsKLQl9Ci0KLQkvKiAjIyMgdGhpcyBhc3N1bWVzIHRoYXQgZGF2X2xvb2t1cF91cmkoKSBvbmx5IGdlbmVyYXRlcyBhIHN0YXR1cwotCSAqICMjIyB0aGF0IEFwYWNoZSBjYW4gcHJvdmlkZSBhIHN0YXR1cyBsaW5lIGZvciEhICovCi0KLQlyZXR1cm4gZGF2X2Vycm9yX3Jlc3BvbnNlKHIsIGxvb2t1cC5lcnIuc3RhdHVzLCBsb29rdXAuZXJyLmRlc2MpOwotICAgIH0KLSAgICBpZiAobG9va3VwLnJuZXctPnN0YXR1cyAhPSBIVFRQX09LKSB7Ci0JLyogIyMjIGhvdyBiZXN0IHRvIHJlcG9ydCB0aGlzLi4uICovCi0JcmV0dXJuIGRhdl9lcnJvcl9yZXNwb25zZShyLCBsb29rdXAucm5ldy0+c3RhdHVzLAotCQkJCSAgIkRlc3RpbmF0aW9uIFVSSSBoYWQgYW4gZXJyb3IuIik7Ci0gICAgfQotCi0gICAgLyogUmVzb2x2ZSBkZXN0aW5hdGlvbiByZXNvdXJjZSAqLwotICAgIHJlc3VsdCA9IGRhdl9nZXRfcmVzb3VyY2UobG9va3VwLnJuZXcsICZyZXNuZXcpOwotICAgIGlmIChyZXN1bHQgIT0gT0spCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICAvKiBhcmUgdGhlIHR3byByZXNvdXJjZXMgaGFuZGxlZCBieSB0aGUgc2FtZSByZXBvc2l0b3J5PyAqLwotICAgIGlmIChyZXNvdXJjZS0+aG9va3MgIT0gcmVzbmV3LT5ob29rcykgewotCS8qICMjIyB0aGlzIG1lc3NhZ2UgZXhwb3NlcyBzb21lIGJhY2tlbmQgY29uZmlnLCBidXQgc2NyZXcgaXQuLi4gKi8KLQlyZXR1cm4gZGF2X2Vycm9yX3Jlc3BvbnNlKHIsIEhUVFBfQkFEX0dBVEVXQVksCi0JCQkJICAiRGVzdGluYXRpb24gVVJJIGlzIGhhbmRsZWQgYnkgYSAiCi0JCQkJICAiZGlmZmVyZW50IHJlcG9zaXRvcnkgdGhhbiB0aGUgc291cmNlIFVSSS4gIgotCQkJCSAgIk1PVkUgb3IgQ09QWSBiZXR3ZWVuIHJlcG9zaXRvcmllcyBpcyAiCi0JCQkJICAibm90IHBvc3NpYmxlLiIpOwotICAgIH0KLQotICAgIC8qIGdldCBhbmQgcGFyc2UgdGhlIG92ZXJ3cml0ZSBoZWFkZXIgdmFsdWUgKi8KLSAgICBpZiAoKG92ZXJ3cml0ZSA9IGRhdl9nZXRfb3ZlcndyaXRlKHIpKSA8IDApIHsKLQkvKiBkYXZfZ2V0X292ZXJ3cml0ZSgpIHN1cHBsaWVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZQotCSAqIGRlZmF1bHQgbWVzc2FnZS4gKi8KLQlyZXR1cm4gSFRUUF9CQURfUkVRVUVTVDsKLSAgICB9Ci0KLSAgICAvKiBxdWljayBmYWlsdXJlIHRlc3Q6IGlmIGRlc3QgZXhpc3RzIGFuZCBvdmVyd3JpdGUgaXMgZmFsc2UuICovCi0gICAgaWYgKHJlc25ldy0+ZXhpc3RzICYmICFvdmVyd3JpdGUpIHsKLQkvKiBTdXBwbHkgc29tZSB0ZXh0IGZvciB0aGUgZXJyb3IgcmVzcG9uc2UgYm9keS4gKi8KLQlyZXR1cm4gZGF2X2Vycm9yX3Jlc3BvbnNlKHIsIEhUVFBfUFJFQ09ORElUSU9OX0ZBSUxFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVzdGluYXRpb24gaXMgbm90IGVtcHR5IGFuZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk92ZXJ3cml0ZSBpcyBub3QgXCJUXCIiKTsKLSAgICB9Ci0KLSAgICAvKiBhcmUgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gdGhlIHNhbWU/ICovCi0gICAgaWYgKCgqcmVzb3VyY2UtPmhvb2tzLT5pc19zYW1lX3Jlc291cmNlKShyZXNvdXJjZSwgcmVzbmV3KSkgewotCS8qIFN1cHBseSBzb21lIHRleHQgZm9yIHRoZSBlcnJvciByZXNwb25zZSBib2R5LiAqLwotCXJldHVybiBkYXZfZXJyb3JfcmVzcG9uc2UociwgSFRUUF9GT1JCSURERU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvdXJjZSBhbmQgRGVzdGluYXRpb24gVVJJcyBhcmUgdGhlIHNhbWUuIik7Ci0KLSAgICB9Ci0KLSAgICBpc19kaXIgPSByZXNvdXJjZS0+Y29sbGVjdGlvbjsKLQotICAgIC8qIGdldCBhbmQgcGFyc2UgdGhlIERlcHRoIGhlYWRlciB2YWx1ZS4gIjAiIGFuZCAiaW5maW5pdHkiIGFyZSBsZWdhbC4gKi8KLSAgICBpZiAoKGRlcHRoID0gZGF2X2dldF9kZXB0aChyLCBEQVZfSU5GSU5JVFkpKSA8IDApIHsKLQkvKiBkYXZfZ2V0X2RlcHRoKCkgc3VwcGxpZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlCi0JICogZGVmYXVsdCBtZXNzYWdlLiAqLwotCXJldHVybiBIVFRQX0JBRF9SRVFVRVNUOwotICAgIH0KLSAgICBpZiAoZGVwdGggPT0gMSkgewotCS8qIFRoaXMgc3VwcGxpZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIGRlZmF1bHQgbWVzc2FnZS4gKi8KLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiB8IEFQTE9HX05PRVJSTk8sIHIsCi0JCSAgICJEZXB0aCBtdXN0IGJlIFwiMFwiIG9yIFwiaW5maW5pdHlcIiBmb3IgQ09QWSBvciBNT1ZFLiIpOwotCXJldHVybiBIVFRQX0JBRF9SRVFVRVNUOwotICAgIH0KLSAgICBpZiAoaXNfbW92ZSAmJiBpc19kaXIgJiYgZGVwdGggIT0gREFWX0lORklOSVRZKSB7Ci0JLyogVGhpcyBzdXBwbGllcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgZGVmYXVsdCBtZXNzYWdlLiAqLwotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSIHwgQVBMT0dfTk9FUlJOTywgciwKLQkJICAgICJEZXB0aCBtdXN0IGJlIFwiaW5maW5pdHlcIiB3aGVuIG1vdmluZyBhIGNvbGxlY3Rpb24uIik7Ci0JcmV0dXJuIEhUVFBfQkFEX1JFUVVFU1Q7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqKiBDaGVjayBJZi1IZWFkZXJzIGFuZCBleGlzdGluZyBsb2NrcyBmb3IgZWFjaCByZXNvdXJjZSBpbiB0aGUgc291cmNlCi0gICAgKiogaWYgd2UgYXJlIHBlcmZvcm1pbmcgYSBNT1ZFLiBXZSB3aWxsIHJldHVybiBhIDQyNCByZXNwb25zZSB3aXRoIGEKLSAgICAqKiBEQVY6bXVsdGlzdGF0dXMgYm9keS4gVGhlIG11bHRpc3RhdHVzIHJlc3BvbnNlcyB3aWxsIGNvbnRhaW4gdGhlCi0gICAgKiogaW5mb3JtYXRpb24gYWJvdXQgYW55IHJlc291cmNlIHRoYXQgZmFpbHMgdGhlIHZhbGlkYXRpb24uCi0gICAgKioKLSAgICAqKiBXZSBjaGVjayB0aGUgcGFyZW50IHJlc291cmNlLCB0b28sIHNpbmNlIHRoaXMgaXMgYSBNT1ZFLiBNb3ZpbmcgdGhlCi0gICAgKiogcmVzb3VyY2UgZWZmZWN0aXZlbHkgcmVtb3ZlcyBpdCBmcm9tIHRoZSBwYXJlbnQgY29sbGVjdGlvbiwgc28gd2UKLSAgICAqKiBtdXN0IGVuc3VyZSB0aGF0IHdlIGhhdmUgbWV0IHRoZSBhcHByb3ByaWF0ZSBjb25kaXRpb25zLgotICAgICoqCi0gICAgKiogSWYgYSBwcm9ibGVtIG9jY3VycyB3aXRoIHRoZSBSZXF1ZXN0LVVSSSBpdHNlbGYsIHRoZW4gYSBwbGFpbiBlcnJvcgotICAgICoqIChyYXRoZXIgdGhhbiBhIG11bHRpc3RhdHVzKSB3aWxsIGJlIHJldHVybmVkLgotICAgICovCi0gICAgaWYgKGlzX21vdmUKLQkmJiAoZXJyID0gZGF2X3ZhbGlkYXRlX3JlcXVlc3QociwgcmVzb3VyY2UsIGRlcHRoLCBOVUxMLAotCQkJCSAgICAgICAmbXVsdGlfcmVzcG9uc2UsCi0JCQkJICAgICAgIERBVl9WQUxJREFURV9QQVJFTlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgREFWX1ZBTElEQVRFX1VTRV80MjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgIT0gTlVMTCkgewotCWVyciA9IGRhdl9wdXNoX2Vycm9yKHItPnBvb2wsIGVyci0+c3RhdHVzLCAwLAotCQkJICAgICBhcF9wc3ByaW50ZihyLT5wb29sLAotCQkJCQkgIkNvdWxkIG5vdCBNT1ZFICVzIGR1ZSB0byBhIGZhaWxlZCAiCi0JCQkJCSAicHJlY29uZGl0aW9uIG9uIHRoZSBzb3VyY2UgIgotCQkJCQkgIihlLmcuIGxvY2tzKS4iLAotCQkJCQkgYXBfZXNjYXBlX2h0bWwoci0+cG9vbCwgci0+dXJpKSksCi0JCQkgICAgIGVycik7Ci0JcmV0dXJuIGRhdl9oYW5kbGVfZXJyKHIsIGVyciwgbXVsdGlfcmVzcG9uc2UpOwotICAgIH0KLQotICAgIC8qCi0gICAgKiogQ2hlY2sgSWYtSGVhZGVycyBhbmQgZXhpc3RpbmcgbG9ja3MgZm9yIGRlc3RpbmF0aW9uLiBOb3RlIHRoYXQgd2UKLSAgICAqKiB1c2UgZGVwdGg9PWluZmluaXR5IHNpbmNlIHRoZSB0YXJnZXQgKGhpZXJhcmNoeSkgd2lsbCBiZSBkZWxldGVkCi0gICAgKiogYmVmb3JlIHRoZSBtb3ZlL2NvcHkgaXMgY29tcGxldGVkLgotICAgICoqCi0gICAgKiogTm90ZSB0aGF0IHdlIGFyZSBvdmVyd3JpdGluZyB0aGUgdGFyZ2V0LCB3aGljaCBpbXBsaWVzIGEgREVMRVRFLCBzbwotICAgICoqIHdlIGFyZSBzdWJqZWN0IHRvIHRoZSBlcnJvci9yZXNwb25zZSBydWxlcyBhcyBhIERFTEVURS4gTmFtZWx5LCB3ZQotICAgICoqIHdpbGwgcmV0dXJuIGEgNDI0IGVycm9yIGlmIGFueSBvZiB0aGUgdmFsaWRhdGlvbnMgZmFpbC4KLSAgICAqKiAoc2VlIGRhdl9tZXRob2RfZGVsZXRlKCkgZm9yIG1vcmUgaW5mb3JtYXRpb24pCi0gICAgKi8KLSAgICBpZiAoKGVyciA9IGRhdl92YWxpZGF0ZV9yZXF1ZXN0KGxvb2t1cC5ybmV3LCByZXNuZXcsIERBVl9JTkZJTklUWSwgTlVMTCwKLQkJCQkgICAgJm11bHRpX3Jlc3BvbnNlLAotCQkJCSAgICBEQVZfVkFMSURBVEVfUEFSRU5UCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERBVl9WQUxJREFURV9VU0VfNDI0LCBOVUxMKSkgIT0gTlVMTCkgewotCWVyciA9IGRhdl9wdXNoX2Vycm9yKHItPnBvb2wsIGVyci0+c3RhdHVzLCAwLAotCQkJICAgICBhcF9wc3ByaW50ZihyLT5wb29sLAotCQkJCQkgIkNvdWxkIG5vdCBNT1ZFL0NPUFkgJXMgZHVlIHRvIGEgIgotCQkJCQkgImZhaWxlZCBwcmVjb25kaXRpb24gb24gdGhlICIKLQkJCQkJICJkZXN0aW5hdGlvbiAoZS5nLiBsb2NrcykuIiwKLQkJCQkJIGFwX2VzY2FwZV9odG1sKHItPnBvb2wsIHItPnVyaSkpLAotCQkJICAgICBlcnIpOwotCXJldHVybiBkYXZfaGFuZGxlX2VycihyLCBlcnIsIG11bHRpX3Jlc3BvbnNlKTsKLSAgICB9Ci0KLSAgICBpZiAoaXNfZGlyCi0JJiYgZGVwdGggPT0gREFWX0lORklOSVRZCi0JJiYgKCpyZXNvdXJjZS0+aG9va3MtPmlzX3BhcmVudF9yZXNvdXJjZSkocmVzb3VyY2UsIHJlc25ldykpIHsKLQkvKiBTdXBwbHkgc29tZSB0ZXh0IGZvciB0aGUgZXJyb3IgcmVzcG9uc2UgYm9keS4gKi8KLQlyZXR1cm4gZGF2X2Vycm9yX3Jlc3BvbnNlKHIsIEhUVFBfRk9SQklEREVOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb3VyY2UgY29sbGVjdGlvbiBjb250YWlucyB0aGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZXN0aW5hdGlvbi4iKTsKLQotICAgIH0KLSAgICBpZiAoaXNfZGlyCi0JJiYgKCpyZXNuZXctPmhvb2tzLT5pc19wYXJlbnRfcmVzb3VyY2UpKHJlc25ldywgcmVzb3VyY2UpKSB7Ci0JLyogVGhlIGRlc3RpbmF0aW9uIG11c3QgZXhpc3QgKHNpbmNlIGl0IGNvbnRhaW5zIHRoZSBzb3VyY2UpLCBhbmQKLQkgKiBhIGNvbmRpdGlvbiBhYm92ZSBpbXBsaWVzIE92ZXJ3cml0ZT09VC4gT2J2aW91c2x5LCB3ZSBjYW5ub3QKLQkgKiBkZWxldGUgdGhlIERlc3RpbmF0aW9uIGJlZm9yZSB0aGUgTU9WRS9DT1BZLCBhcyB0aGF0IHdvdWxkCi0JICogZGVsZXRlIHRoZSBTb3VyY2UuCi0JICovCi0KLQkvKiBTdXBwbHkgc29tZSB0ZXh0IGZvciB0aGUgZXJyb3IgcmVzcG9uc2UgYm9keS4gKi8KLQlyZXR1cm4gZGF2X2Vycm9yX3Jlc3BvbnNlKHIsIEhUVFBfRk9SQklEREVOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZXN0aW5hdGlvbiBjb2xsZWN0aW9uIGNvbnRhaW5zIHRoZSBTb3VyY2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgT3ZlcndyaXRlIGhhcyBiZWVuIHNwZWNpZmllZC4iKTsKLSAgICB9Ci0KLSAgICAvKiAjIyMgZm9yIG5vdywgd2UgZG9uJ3QgbmVlZCBhbnl0aGluZyBpbiB0aGUgYm9keSAqLwotICAgIGlmICgocmVzdWx0ID0gYXBfZGlzY2FyZF9yZXF1ZXN0X2JvZHkocikpICE9IE9LKSB7Ci0JcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBpZiAoKGVyciA9IGRhdl9vcGVuX2xvY2tkYihyLCAwLCAmbG9ja2RiKSkgIT0gTlVMTCkgewotCS8qICMjIyBhZGQgYSBoaWdoZXItbGV2ZWwgZGVzY3JpcHRpb24/ICovCi0JcmV0dXJuIGRhdl9oYW5kbGVfZXJyKHIsIGVyciwgTlVMTCk7Ci0gICAgfQotCi0gICAgLyogcmVtb3ZlIGFueSBsb2NrcyBmcm9tIHRoZSBvbGQgcmVzb3VyY2VzICovCi0gICAgLyoKLSAgICAqKiAjIyMgdGhpcyBpcyBZZXQgQW5vdGhlciBUcmF2ZXJzYWwuIGlmIHdlIGRvIGEgcmVuYW1lKCksIHRoZW4gd2UKLSAgICAqKiAjIyMgcmVhbGx5IGRvbid0IGhhdmUgdG8gZG8gdGhpcyBpbiBzb21lIGNhc2VzIHNpbmNlIHRoZSBpbm9kZQotICAgICoqICMjIyB2YWx1ZXMgd2lsbCByZW1haW4gY29uc3RhbnQgYWNyb3NzIHRoZSBtb3ZlLiBidXQgd2UgY2FuJ3QKLSAgICAqKiAjIyMga25vdyB0aGF0IGZhY3QgZnJvbSBvdXRzaWRlIHRoZSBwcm92aWRlciA6LSgKLSAgICAqKgotICAgICoqICMjIyBub3RlIHRoYXQgd2Ugbm93IGhhdmUgYSBwcm9ibGVtIGF0b21pY2l0eSBpbiB0aGUgbW92ZS9jb3B5Ci0gICAgKiogIyMjIHNpbmNlIGEgZmFpbHVyZSBhZnRlciB0aGlzIHdvdWxkIGhhdmUgcmVtb3ZlZCBsb2NrcyAodGVjaG5pY2FsbHksCi0gICAgKiogIyMjIHRoaXMgaXMgb2theSB0byBkbywgYnV0IHJlYWxseS4uLikKLSAgICAqLwotICAgIGlmIChpc19tb3ZlICYmIGxvY2tkYiAhPSBOVUxMKSB7Ci0JLyogIyMjIHRoaXMgaXMgd3JvbmchIGl0IGJsYXN0cyBkaXJlY3QgbG9ja3Mgb24gcGFyZW50IHJlc291cmNlcyAqLwotCS8qICMjIyBwYXNzIGxvY2tkYiEgKi8KLQkodm9pZClkYXZfdW5sb2NrKHIsIHJlc291cmNlLCBOVUxMKTsKLSAgICB9Ci0KLSAgICAvKiByZW1lbWJlciB3aGV0aGVyIHRhcmdldCByZXNvdXJjZSBleGlzdGVkICovCi0gICAgcmVwbGFjZWQgPSByZXNuZXctPmV4aXN0czsKLQotICAgIC8qIGlmIHRoaXMgaXMgYSBtb3ZlLCB0aGVuIHRoZSBzb3VyY2UgcGFyZW50IGNvbGxlY3Rpb24gd2lsbCBiZSBtb2RpZmllZCAqLwotICAgIGlmIChpc19tb3ZlKSB7Ci0gICAgICAgIGlmICgoZXJyID0gZGF2X2Vuc3VyZV9yZXNvdXJjZV93cml0YWJsZShyLCByZXNvdXJjZSwKLQkJCQkJCTEgLyogcGFyZW50X29ubHkgKi8sCi0JCQkJCQkmcmVzb3VyY2VfcGFyZW50LAotCQkJCQkJTlVMTCwgTlVMTCwKLQkJCQkJCSZzcmNfcGFyZW50X3dhc193cml0YWJsZSkpICE9IE5VTEwpIHsKLQkgICAgaWYgKGxvY2tkYiAhPSBOVUxMKQotCQkoKmxvY2tkYi0+aG9va3MtPmNsb3NlX2xvY2tkYikobG9ja2RiKTsKLQotCSAgICAvKiAjIyMgYWRkIGEgaGlnaGVyLWxldmVsIGRlc2NyaXB0aW9uPyAqLwotCSAgICByZXR1cm4gZGF2X2hhbmRsZV9lcnIociwgZXJyLCBOVUxMKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHByZXBhcmUgdGhlIGRlc3RpbmF0aW9uIGNvbGxlY3Rpb24gZm9yIG1vZGlmaWNhdGlvbiAqLwotICAgIGlmICgoZXJyID0gZGF2X2Vuc3VyZV9yZXNvdXJjZV93cml0YWJsZShyLCByZXNuZXcsIDEgLyogcGFyZW50X29ubHkgKi8sCi0JCQkJCSAgICAmcmVzbmV3X3BhcmVudCwKLQkJCQkJICAgIE5VTEwsIE5VTEwsCi0JCQkJCSAgICAmZHN0X3BhcmVudF93YXNfd3JpdGFibGUpKSAhPSBOVUxMKSB7Ci0gICAgICAgIC8qIGNvdWxkIG5vdCBtYWtlIGRlc3RpbmF0aW9uIHdyaXRhYmxlOgotCSAqIGlmIG1vdmUsIHJlc3RvcmUgc3RhdGUgb2Ygc291cmNlIHBhcmVudAotCSAqLwotICAgICAgICBpZiAoaXNfbW92ZSkgewotICAgICAgICAgICAgKHZvaWQpIGRhdl9yZXZlcnRfcmVzb3VyY2Vfd3JpdGFiaWxpdHkociwgTlVMTCwgcmVzb3VyY2VfcGFyZW50LAotCQkJCQkJICAgMSAvKiB1bmRvICovLAotCQkJCQkJICAgMCwgMCwKLQkJCQkJCSAgIHNyY19wYXJlbnRfd2FzX3dyaXRhYmxlKTsKLSAgICAgICAgfQotCi0JaWYgKGxvY2tkYiAhPSBOVUxMKQotCSAgICAoKmxvY2tkYi0+aG9va3MtPmNsb3NlX2xvY2tkYikobG9ja2RiKTsKLQotCS8qICMjIyBhZGQgYSBoaWdoZXItbGV2ZWwgZGVzY3JpcHRpb24/ICovCi0JcmV0dXJuIGRhdl9oYW5kbGVfZXJyKHIsIGVyciwgTlVMTCk7Ci0gICAgfQotCi0gICAgLyogSWYgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwYXJlbnRzIGFyZSB0aGUgc2FtZSwgdGhlbgotICAgICAqIHVzZSB0aGUgc2FtZSBvYmplY3QsIHNvIHN0YXR1cyB1cGRhdGVzIHRvIG9uZSBhcmUgcmVmbGVjdGVkCi0gICAgICogaW4gdGhlIG90aGVyLgotICAgICAqLwotICAgIGlmIChyZXNvdXJjZV9wYXJlbnQgIT0gTlVMTAotICAgICAgICAmJiAoKnJlc291cmNlX3BhcmVudC0+aG9va3MtPmlzX3NhbWVfcmVzb3VyY2UpKHJlc291cmNlX3BhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNuZXdfcGFyZW50KSkKLSAgICAgICAgcmVzbmV3X3BhcmVudCA9IHJlc291cmNlX3BhcmVudDsKLQotICAgIC8qIE5ldyByZXNvdXJjZSB3aWxsIGJlIHNhbWUga2luZCBhcyBzb3VyY2UgKi8KLSAgICByZXNuZXctPmNvbGxlY3Rpb24gPSByZXNvdXJjZS0+Y29sbGVjdGlvbjsKLQotICAgIC8qIElmIHRhcmdldCBleGlzdHMsIHJlbW92ZSBpdCBmaXJzdCAod2Uga25vdyBPdmV3cml0ZSBtdXN0IGJlIFRSVUUpLgotICAgICAqIFRoZW4gdHJ5IHRvIGNvcHkvbW92ZSB0aGUgcmVzb3VyY2UuCi0gICAgICovCi0gICAgaWYgKHJlc25ldy0+ZXhpc3RzKQotCWVyciA9ICgqcmVzbmV3LT5ob29rcy0+cmVtb3ZlX3Jlc291cmNlKShyZXNuZXcsICZtdWx0aV9yZXNwb25zZSk7Ci0KLSAgICBpZiAoZXJyID09IE5VTEwpIHsKLQlpZiAoaXNfbW92ZSkKLQkgICAgZXJyID0gKCpyZXNvdXJjZS0+aG9va3MtPm1vdmVfcmVzb3VyY2UpKHJlc291cmNlLCByZXNuZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm11bHRpX3Jlc3BvbnNlKTsKLQllbHNlCi0JICAgIGVyciA9ICgqcmVzb3VyY2UtPmhvb2tzLT5jb3B5X3Jlc291cmNlKShyZXNvdXJjZSwgcmVzbmV3LCBkZXB0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXVsdGlfcmVzcG9uc2UpOwotICAgIH0KLQotICAgIC8qIHJlc3RvcmUgcGFyZW50IGNvbGxlY3Rpb24gc3RhdGVzICovCi0gICAgZXJyMiA9IGRhdl9yZXZlcnRfcmVzb3VyY2Vfd3JpdGFiaWxpdHkociwgTlVMTCwgcmVzbmV3X3BhcmVudCwKLQkJCQkJICAgZXJyICE9IE5VTEwgLyogdW5kbyBpZiBlcnJvciAqLywKLQkJCQkJICAgMCwgMCwgZHN0X3BhcmVudF93YXNfd3JpdGFibGUpOwotCi0gICAgaWYgKGlzX21vdmUpIHsKLSAgICAgICAgZXJyMyA9IGRhdl9yZXZlcnRfcmVzb3VyY2Vfd3JpdGFiaWxpdHkociwgTlVMTCwgcmVzb3VyY2VfcGFyZW50LAotCQkJCQkgICAgICAgZXJyICE9IE5VTEwgLyogdW5kbyBpZiBlcnJvciAqLywKLQkJCQkJICAgICAgIDAsIDAsIHNyY19wYXJlbnRfd2FzX3dyaXRhYmxlKTsKLSAgICB9Ci0gICAgZWxzZQotCWVycjMgPSBOVUxMOwotCi0gICAgLyogY2hlY2sgZm9yIGVycm9yIGZyb20gcmVtb3ZlL2NvcHkvbW92ZSBvcGVyYXRpb25zICovCi0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0JaWYgKGxvY2tkYiAhPSBOVUxMKQotCSAgICAoKmxvY2tkYi0+aG9va3MtPmNsb3NlX2xvY2tkYikobG9ja2RiKTsKLQotCWVyciA9IGRhdl9wdXNoX2Vycm9yKHItPnBvb2wsIGVyci0+c3RhdHVzLCAwLAotCQkJICAgICBhcF9wc3ByaW50ZihyLT5wb29sLAotCQkJCQkgIkNvdWxkIG5vdCBNT1ZFL0NPUFkgJXMuIiwKLQkJCQkJIGFwX2VzY2FwZV9odG1sKHItPnBvb2wsIHItPnVyaSkpLAotCQkJICAgICBlcnIpOwotCXJldHVybiBkYXZfaGFuZGxlX2VycihyLCBlcnIsIG11bHRpX3Jlc3BvbnNlKTsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayBmb3IgZXJyb3JzIGZyb20gcmV2ZXJ0aW5nIHdyaXRhYmlsaXR5ICovCi0gICAgaWYgKGVycjIgIT0gTlVMTCkgewotCS8qIGp1c3QgbG9nIGEgd2FybmluZyAqLwotCWVyciA9IGRhdl9wdXNoX2Vycm9yKHItPnBvb2wsIGVycjItPnN0YXR1cywgMCwKLQkJCSAgICAgIlRoZSBNT1ZFL0NPUFkgd2FzIHN1Y2Nlc3NmdWwsIGJ1dCB0aGVyZSB3YXMgYSAiCi0JCQkgICAgICJwcm9ibGVtIHJldmVydGluZyB0aGUgd3JpdGFiaWxpdHkgb2YgdGhlICIKLQkJCSAgICAgInNvdXJjZSBwYXJlbnQgY29sbGVjdGlvbi4iLAotCQkJICAgICBlcnIyKTsKLQlkYXZfbG9nX2VycihyLCBlcnIsIEFQTE9HX1dBUk5JTkcpOwotICAgIH0KLSAgICBpZiAoZXJyMyAhPSBOVUxMKSB7Ci0JLyoganVzdCBsb2cgYSB3YXJuaW5nICovCi0JZXJyID0gZGF2X3B1c2hfZXJyb3Ioci0+cG9vbCwgZXJyMy0+c3RhdHVzLCAwLAotCQkJICAgICAiVGhlIE1PVkUvQ09QWSB3YXMgc3VjY2Vzc2Z1bCwgYnV0IHRoZXJlIHdhcyBhICIKLQkJCSAgICAgInByb2JsZW0gcmV2ZXJ0aW5nIHRoZSB3cml0YWJpbGl0eSBvZiB0aGUgIgotCQkJICAgICAiZGVzdGluYXRpb24gcGFyZW50IGNvbGxlY3Rpb24uIiwKLQkJCSAgICAgZXJyMyk7Ci0JZGF2X2xvZ19lcnIociwgZXJyLCBBUExPR19XQVJOSU5HKTsKLSAgICB9Ci0KLSAgICAvKiBwcm9wYWdhdGUgYW55IGluZGlyZWN0IGxvY2tzIGF0IHRoZSB0YXJnZXQgKi8KLSAgICBpZiAobG9ja2RiICE9IE5VTEwpIHsKLQlpbnQgcmVzb3VyY2Vfc3RhdGUgPSBkYXZfZ2V0X3Jlc291cmNlX3N0YXRlKGxvb2t1cC5ybmV3LCByZXNuZXcpOwotCi0JLyogbm90aWZ5IGxvY2sgc3lzdGVtIHRoYXQgd2UgaGF2ZSBjcmVhdGVkL3JlcGxhY2VkIGEgcmVzb3VyY2UgKi8KLQllcnIgPSBkYXZfbm90aWZ5X2NyZWF0ZWQociwgbG9ja2RiLCByZXNuZXcsIHJlc291cmNlX3N0YXRlLCBkZXB0aCk7Ci0KLQkoKmxvY2tkYi0+aG9va3MtPmNsb3NlX2xvY2tkYikobG9ja2RiKTsKLQotCWlmIChlcnIgIT0gTlVMTCkgewotCSAgICAvKiBUaGUgbW92ZS9jb3B5IHdhcyBzdWNjZXNzZnVsLCBidXQgdGhlIGxvY2tpbmcgZmFpbGVkLiAqLwotCSAgICBlcnIgPSBkYXZfcHVzaF9lcnJvcihyLT5wb29sLCBlcnItPnN0YXR1cywgMCwKLQkJCQkgIlRoZSBNT1ZFL0NPUFkgd2FzIHN1Y2Nlc3NmdWwsIGJ1dCB0aGVyZSAiCi0JCQkJICJ3YXMgYSBwcm9ibGVtIHVwZGF0aW5nIHRoZSBsb2NrICIKLQkJCQkgImluZm9ybWF0aW9uLiIsCi0JCQkJIGVycik7Ci0JICAgIHJldHVybiBkYXZfaGFuZGxlX2VycihyLCBlcnIsIE5VTEwpOwotCX0KLSAgICB9Ci0KLSAgICAvKiByZXR1cm4gYW4gYXBwcm9wcmlhdGUgcmVzcG9uc2UgKEhUVFBfQ1JFQVRFRCBvciBIVFRQX05PX0NPTlRFTlQpICovCi0gICAgcmV0dXJuIGRhdl9jcmVhdGVkKHIsIGxvb2t1cC5ybmV3LCByZXNuZXcsICJEZXN0aW5hdGlvbiIsIHJlcGxhY2VkKTsKLX0KLQotLyogZGF2X21ldGhvZF9sb2NrOiAgSGFuZGxlciB0byBpbXBsZW1lbnQgdGhlIERBViBMT0NLIG1ldGhvZAotKiogICAgUmV0dXJucyBhcHByb3ByaWF0ZSBIVFRQXyogcmVzcG9uc2UuCi0qLwotc3RhdGljIGludCBkYXZfbWV0aG9kX2xvY2socmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgZGF2X2Vycm9yICplcnI7Ci0gICAgZGF2X3Jlc291cmNlICpyZXNvdXJjZTsKLSAgICBjb25zdCBkYXZfaG9va3NfbG9ja3MgKmxvY2tzX2hvb2tzOwotICAgIGludCByZXN1bHQ7Ci0gICAgaW50IGRlcHRoOwotICAgIGludCBuZXdfbG9ja19yZXF1ZXN0ID0gMDsKLSAgICBkYXZfeG1sX2RvYyAqZG9jID0gTlVMTDsKLSAgICBkYXZfbG9jayAqbG9jazsKLSAgICBkYXZfcmVzcG9uc2UgKm11bHRpX3Jlc3BvbnNlID0gTlVMTDsKLSAgICBkYXZfbG9ja2RiICpsb2NrZGI7Ci0gICAgaW50IHJlc291cmNlX3N0YXRlOwotCi0gICAgLyogSWYgbm8gbG9ja3MgcHJvdmlkZXIsIGRlY2xpbmUgdGhlIHJlcXVlc3QgKi8KLSAgICBsb2Nrc19ob29rcyA9IERBVl9HRVRfSE9PS1NfTE9DS1Mocik7Ci0gICAgaWYgKGxvY2tzX2hvb2tzID09IE5VTEwpCi0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLQotICAgIGlmICgocmVzdWx0ID0gZGF2X3BhcnNlX2lucHV0KHIsICZkb2MpKSAhPSBPSykKLQlyZXR1cm4gcmVzdWx0OwotCi0gICAgZGVwdGggPSBkYXZfZ2V0X2RlcHRoKHIsIERBVl9JTkZJTklUWSk7Ci0gICAgaWYgKGRlcHRoICE9IDAgJiYgZGVwdGggIT0gREFWX0lORklOSVRZKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIgfCBBUExPR19OT0VSUk5PLCByLAotCQkgICAgICAiRGVwdGggbXVzdCBiZSAwIG9yIFwiaW5maW5pdHlcIiBmb3IgTE9DSy4iKTsKLQlyZXR1cm4gSFRUUF9CQURfUkVRVUVTVDsKLSAgICB9Ci0KLSAgICAvKiBBc2sgcmVwb3NpdG9yeSBtb2R1bGUgdG8gcmVzb2x2ZSB0aGUgcmVzb3VyY2UgKi8KLSAgICByZXN1bHQgPSBkYXZfZ2V0X3Jlc291cmNlKHIsICZyZXNvdXJjZSk7Ci0gICAgaWYgKHJlc3VsdCAhPSBPSykKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLQotICAgIC8qCi0gICAgKiogT3BlbiB3cml0YWJsZS4gVW5sZXNzIGFuIGVycm9yIG9jY3Vycywgd2UnbGwgYmUKLSAgICAqKiB3cml0aW5nIGludG8gdGhlIGRhdGFiYXNlLgotICAgICovCi0gICAgaWYgKChlcnIgPSAoKmxvY2tzX2hvb2tzLT5vcGVuX2xvY2tkYikociwgMCwgMCwgJmxvY2tkYikpICE9IE5VTEwpIHsKLQkvKiAjIyMgYWRkIGEgaGlnaGVyLWxldmVsIGRlc2NyaXB0aW9uPyAqLwotCXJldHVybiBkYXZfaGFuZGxlX2VycihyLCBlcnIsIE5VTEwpOwotICAgIH0KLQotICAgIGlmIChkb2MgIT0gTlVMTCkgewotICAgICAgICBpZiAoKGVyciA9IGRhdl9sb2NrX3BhcnNlX2xvY2tpbmZvKHIsIHJlc291cmNlLCBsb2NrZGIsIGRvYywKLQkgICAgCQkJICAgICAgICAgICAmbG9jaykpICE9IE5VTEwpIHsKLQkgICAgLyogIyMjIGFkZCBhIGhpZ2hlci1sZXZlbCBkZXNjcmlwdGlvbiB0byBlcnI/ICovCi0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0gICAgICAgIG5ld19sb2NrX3JlcXVlc3QgPSAxOwotCi0gICAgICAgIGxvY2stPmF1dGhfdXNlciA9IGFwX3BzdHJkdXAoci0+cG9vbCwgci0+Y29ubmVjdGlvbi0+dXNlcik7Ci0gICAgfQotCi0gICAgcmVzb3VyY2Vfc3RhdGUgPSBkYXZfZ2V0X3Jlc291cmNlX3N0YXRlKHIsIHJlc291cmNlKTsKLQotICAgIC8qCi0gICAgKiogQ2hlY2sgSWYtSGVhZGVycyBhbmQgZXhpc3RpbmcgbG9ja3MuCi0gICAgKioKLSAgICAqKiBJZiB0aGlzIHdpbGwgY3JlYXRlIGEgbG9ja251bGwgcmVzb3VyY2UsIHRoZW4gdGhlIExPQ0sgd2lsbCBhZmZlY3QKLSAgICAqKiB0aGUgcGFyZW50IGNvbGxlY3Rpb24gKG11Y2ggbGlrZSBhIFBVVC9NS0NPTCkuIEZvciB0aGF0IGNhc2UsIHdlIG11c3QKLSAgICAqKiB2YWxpZGF0ZSB0aGUgcGFyZW50IHJlc291cmNlJ3MgY29uZGl0aW9ucy4KLSAgICAqLwotICAgIGlmICgoZXJyID0gZGF2X3ZhbGlkYXRlX3JlcXVlc3QociwgcmVzb3VyY2UsIGRlcHRoLCBOVUxMLCAmbXVsdGlfcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzb3VyY2Vfc3RhdGUgPT0gREFWX1JFU09VUkNFX05VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IERBVl9WQUxJREFURV9QQVJFTlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IERBVl9WQUxJREFURV9SRVNPVVJDRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKG5ld19sb2NrX3JlcXVlc3QgPyBsb2NrLT5zY29wZSA6IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERBVl9WQUxJREFURV9BRERfTEQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrZGIpKSAhPSBPSykgewotCWVyciA9IGRhdl9wdXNoX2Vycm9yKHItPnBvb2wsIGVyci0+c3RhdHVzLCAwLAotCQkJICAgICBhcF9wc3ByaW50ZihyLT5wb29sLAotCQkJCQkgIkNvdWxkIG5vdCBMT0NLICVzIGR1ZSB0byBhIGZhaWxlZCAiCi0JCQkJCSAicHJlY29uZGl0aW9uIChlLmcuIG90aGVyIGxvY2tzKS4iLAotCQkJCQkgYXBfZXNjYXBlX2h0bWwoci0+cG9vbCwgci0+dXJpKSksCi0JCQkgICAgIGVycik7Ci0JZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBpZiAobmV3X2xvY2tfcmVxdWVzdCA9PSAwKSB7Ci0JZGF2X2xvY2t0b2tlbl9saXN0ICpsdGw7Ci0JCQotCS8qCi0JKiogUmVmcmVzaCByZXF1ZXN0IAotCSoqICMjIyBBc3N1bXB0aW9uOiAgV2UgY2FuIHJlbmV3IG11bHRpcGxlIGxvY2tzIG9uIHRoZSBzYW1lIHJlc291cmNlCi0JKiogIyMjIGF0IG9uY2UuIEZpcnN0IGhhcnZlc3QgYWxsIHRoZSBwb3NpdGl2ZSBsb2NrLXRva2VucyBnaXZlbiBpbgotCSoqICMjIyB0aGUgSWYgaGVhZGVyLiBUaGVuIG1vZGlmeSB0aGUgbG9jayBlbnRyaWVzIGZvciB0aGlzIHJlc291cmNlCi0JKiogIyMjIHdpdGggdGhlIG5ldyBUaW1lb3V0IHZhbC4KLQkqLwotCi0JaWYgKChlcnIgPSBkYXZfZ2V0X2xvY2t0b2tlbl9saXN0KHIsICZsdGwpKSAhPSBOVUxMKSB7Ci0JICAgIGVyciA9IGRhdl9wdXNoX2Vycm9yKHItPnBvb2wsIGVyci0+c3RhdHVzLCAwLAotCQkJCSBhcF9wc3ByaW50ZihyLT5wb29sLAotCQkJCQkgICAgICJUaGUgbG9jayByZWZyZXNoIGZvciAlcyBmYWlsZWQgIgotCQkJCQkgICAgICJiZWNhdXNlIG5vIGxvY2sgdG9rZW5zIHdlcmUgIgotCQkJCQkgICAgICJzcGVjaWZpZWQgaW4gYW4gXCJJZjpcIiAiCi0JCQkJCSAgICAgImhlYWRlci4iLAotCQkJCQkgICAgIGFwX2VzY2FwZV9odG1sKHItPnBvb2wsIHItPnVyaSkpLAotCQkJCSBlcnIpOwotCSAgICBnb3RvIGVycm9yOwotCX0KLQotCWlmICgoZXJyID0gKCpsb2Nrc19ob29rcy0+cmVmcmVzaF9sb2NrcykobG9ja2RiLCByZXNvdXJjZSwgbHRsLAotCQkJCQkJIGRhdl9nZXRfdGltZW91dChyKSwKLQkJCQkJCSAmbG9jaykpICE9IE5VTEwpIHsKLQkgICAgLyogIyMjIGFkZCBhIGhpZ2hlci1sZXZlbCBkZXNjcmlwdGlvbiB0byBlcnI/ICovCi0JICAgIGdvdG8gZXJyb3I7Ci0JfQotICAgIH0gZWxzZSB7Ci0JLyogTmV3IGxvY2sgcmVxdWVzdCAqLwotICAgICAgICBjaGFyICpsb2NrdG9rZW5fdHh0OwotCWRhdl9kaXJfY29uZiAqY29uZjsKLQotCWNvbmYgPSAoZGF2X2Rpcl9jb25mICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLAotCQkJCQkJICAgICAmZGF2X21vZHVsZSk7Ci0KLQkvKiBhcHBseSBsb3dlciBib3VuZCAoaWYgYW55KSBmcm9tIERBVk1pblRpbWVvdXQgZGlyZWN0aXZlICovCi0JaWYgKGxvY2stPnRpbWVvdXQgIT0gREFWX1RJTUVPVVRfSU5GSU5JVEUKLSAgICAgICAgICAgICYmIGxvY2stPnRpbWVvdXQgPCB0aW1lKE5VTEwpICsgY29uZi0+bG9ja3RpbWVvdXQpCi0JICAgIGxvY2stPnRpbWVvdXQgPSB0aW1lKE5VTEwpICsgY29uZi0+bG9ja3RpbWVvdXQ7Ci0KLSAgICAgICAgZXJyID0gZGF2X2FkZF9sb2NrKHIsIHJlc291cmNlLCBsb2NrZGIsIGxvY2ssICZtdWx0aV9yZXNwb25zZSk7Ci0JaWYgKGVyciAhPSBOVUxMKSB7Ci0JICAgIC8qICMjIyBhZGQgYSBoaWdoZXItbGV2ZWwgZGVzY3JpcHRpb24gdG8gZXJyPyAqLwotCSAgICBnb3RvIGVycm9yOwotCX0KLQotICAgICAgICBsb2NrdG9rZW5fdHh0ID0gYXBfcHN0cmNhdChyLT5wb29sLCAiPCIsCi0JCQkJICAgKCpsb2Nrc19ob29rcy0+Zm9ybWF0X2xvY2t0b2tlbikoci0+cG9vbCwgbG9jay0+bG9ja3Rva2VuKSwKLQkJCQkgICAiPiIsIE5VTEwpOwotCi0JYXBfdGFibGVfc2V0KHItPmhlYWRlcnNfb3V0LCAiTG9jay1Ub2tlbiIsIGxvY2t0b2tlbl90eHQpOwotICAgIH0KLQotICAgICgqbG9ja3NfaG9va3MtPmNsb3NlX2xvY2tkYikobG9ja2RiKTsKLQotICAgIHItPnN0YXR1cyA9IEhUVFBfT0s7Ci0gICAgci0+Y29udGVudF90eXBlID0gREFWX1hNTF9DT05URU5UX1RZUEU7Ci0KLSAgICBhcF9zZW5kX2h0dHBfaGVhZGVyKHIpOwotICAgIGFwX3NvZnRfdGltZW91dCgic2VuZCBMT0NLIHJlc3BvbnNlIiwgcik7Ci0KLSAgICBhcF9ycHV0cyhEQVZfWE1MX0hFQURFUiBERUJVR19DUiAiPEQ6cHJvcCB4bWxuczpEPVwiREFWOlwiPiIgREVCVUdfQ1IsIHIpOwotICAgIGlmIChsb2NrID09IE5VTEwpCi0JYXBfcnB1dHMoIjxEOmxvY2tkaXNjb3ZlcnkvPiIgREVCVUdfQ1IsIHIpOwotICAgIGVsc2UgewotCWFwX3JwcmludGYociwKLQkJICAgIjxEOmxvY2tkaXNjb3Zlcnk+IiBERUJVR19DUgotCQkgICAiJXMiIERFQlVHX0NSCi0JCSAgICI8L0Q6bG9ja2Rpc2NvdmVyeT4iIERFQlVHX0NSLAotCQkgICBkYXZfbG9ja19nZXRfYWN0aXZlbG9jayhyLCBsb2NrLCBOVUxMKSk7Ci0gICAgfQotICAgIGFwX3JwdXRzKCI8L0Q6cHJvcD4iLCByKTsKLQotICAgIGFwX2tpbGxfdGltZW91dChyKTsKLQotICAgIC8qIHRoZSByZXNwb25zZSBoYXMgYmVlbiBzZW50LiAqLwotICAgIHJldHVybiBET05FOwotCi0gIGVycm9yOgotICAgICgqbG9ja3NfaG9va3MtPmNsb3NlX2xvY2tkYikobG9ja2RiKTsKLSAgICByZXR1cm4gZGF2X2hhbmRsZV9lcnIociwgZXJyLCBtdWx0aV9yZXNwb25zZSk7Ci19Ci0KLS8qIGRhdl9tZXRob2RfdW5sb2NrOiAgSGFuZGxlciB0byBpbXBsZW1lbnQgdGhlIERBViBVTkxPQ0sgbWV0aG9kCi0gKiAgICBSZXR1cm5zIGFwcHJvcHJpYXRlIEhUVFBfKiByZXNwb25zZS4KLSAqLwotc3RhdGljIGludCBkYXZfbWV0aG9kX3VubG9jayhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBkYXZfZXJyb3IgKmVycjsKLSAgICBkYXZfcmVzb3VyY2UgKnJlc291cmNlOwotICAgIGNvbnN0IGRhdl9ob29rc19sb2NrcyAqbG9ja3NfaG9va3M7Ci0gICAgaW50IHJlc3VsdDsKLSAgICBjb25zdCBjaGFyICpjb25zdF9sb2NrdG9rZW5fdHh0OwotICAgIGNoYXIgKmxvY2t0b2tlbl90eHQ7Ci0gICAgZGF2X2xvY2t0b2tlbiAqbG9ja3Rva2VuID0gTlVMTDsKLSAgICBpbnQgcmVzb3VyY2Vfc3RhdGU7Ci0gICAgZGF2X3Jlc3BvbnNlICptdWx0aV9yZXNwb25zZTsKLQotICAgIC8qIElmIG5vIGxvY2tzIHByb3ZpZGVyLCBkZWNsaW5lIHRoZSByZXF1ZXN0ICovCi0gICAgbG9ja3NfaG9va3MgPSBEQVZfR0VUX0hPT0tTX0xPQ0tTKHIpOwotICAgIGlmIChsb2Nrc19ob29rcyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0KLSAgICBpZiAoKGNvbnN0X2xvY2t0b2tlbl90eHQgPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIkxvY2stVG9rZW4iKSkgPT0gTlVMTCkgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSIHwgQVBMT0dfTk9FUlJOTywgciwKLQkJICAgICAgIlVubG9jayBmYWlsZWQgKCVzKTogIE5vIExvY2stVG9rZW4gc3BlY2lmaWVkIGluIGhlYWRlciIsIHItPmZpbGVuYW1lKTsKLQlyZXR1cm4gSFRUUF9CQURfUkVRVUVTVDsKLSAgICB9Ci0KLSAgICBsb2NrdG9rZW5fdHh0ID0gYXBfcHN0cmR1cChyLT5wb29sLCBjb25zdF9sb2NrdG9rZW5fdHh0KTsKLSAgICBpZiAobG9ja3Rva2VuX3R4dFswXSAhPSAnPCcpIHsKLQkvKiAjIyMgc2hvdWxkIHByb3ZpZGUgbW9yZSBzcGVjaWZpY3MuLi4gKi8KLQlyZXR1cm4gSFRUUF9CQURfUkVRVUVTVDsKLSAgICB9Ci0gICAgbG9ja3Rva2VuX3R4dCsrOwotCi0gICAgaWYgKGxvY2t0b2tlbl90eHRbc3RybGVuKGxvY2t0b2tlbl90eHQpIC0gMV0gIT0gJz4nKSB7Ci0JLyogIyMjIHNob3VsZCBwcm92aWRlIG1vcmUgc3BlY2lmaWNzLi4uICovCi0JcmV0dXJuIEhUVFBfQkFEX1JFUVVFU1Q7Ci0gICAgfQotICAgIGxvY2t0b2tlbl90eHRbc3RybGVuKGxvY2t0b2tlbl90eHQpIC0gMV0gPSAnXDAnOwotCQkKLSAgICBpZiAoKGVyciA9ICgqbG9ja3NfaG9va3MtPnBhcnNlX2xvY2t0b2tlbikoci0+cG9vbCwgbG9ja3Rva2VuX3R4dCwKLQkJCQkJICAgICAgICZsb2NrdG9rZW4pKSAhPSBOVUxMKSB7Ci0JZXJyID0gZGF2X3B1c2hfZXJyb3Ioci0+cG9vbCwgSFRUUF9CQURfUkVRVUVTVCwgMCwKLQkJCSAgICAgYXBfcHNwcmludGYoci0+cG9vbCwKLQkJCQkJICJUaGUgVU5MT0NLIG9uICVzIGZhaWxlZCAtLSBhbiAiCi0JCQkJCSAiaW52YWxpZCBsb2NrIHRva2VuIHdhcyBzcGVjaWZpZWQgIgotCQkJCQkgImluIHRoZSBcIklmOlwiIGhlYWRlci4iLAotCQkJCQkgYXBfZXNjYXBlX2h0bWwoci0+cG9vbCwgci0+dXJpKSksCi0JCQkgICAgIGVycik7Ci0JcmV0dXJuIGRhdl9oYW5kbGVfZXJyKHIsIGVyciwgTlVMTCk7Ci0gICAgfQotCi0gICAgLyogQXNrIHJlcG9zaXRvcnkgbW9kdWxlIHRvIHJlc29sdmUgdGhlIHJlc291cmNlICovCi0gICAgcmVzdWx0ID0gZGF2X2dldF9yZXNvdXJjZShyLCAmcmVzb3VyY2UpOwotICAgIGlmIChyZXN1bHQgIT0gT0spCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICByZXNvdXJjZV9zdGF0ZSA9IGRhdl9nZXRfcmVzb3VyY2Vfc3RhdGUociwgcmVzb3VyY2UpOwotCi0gICAgLyoKLSAgICAqKiBDaGVjayBJZi1IZWFkZXJzIGFuZCBleGlzdGluZyBsb2Nrcy4KLSAgICAqKgotICAgICoqIE5vdGU6IGRlcHRoID09IDAgbm9ybWFsbHkgcmVxdWlyZXMgbm8gbXVsdGlzdGF0dXMgcmVzcG9uc2UuIEhvd2V2ZXIsCi0gICAgKiogaWYgd2UgcGFzcyBEQVZfVkFMSURBVEVfUEFSRU5ULCB0aGVuIHdlIGNvdWxkIGdldCBhbiBlcnJvciBvbiBhIFVSSQotICAgICoqIG90aGVyIHRoYW4gdGhlIFJlcXVlc3QtVVJJLCB0aGVyZWJ5IHJlcXVpcmluZyBhIG11bHRpc3RhdHVzLgotICAgICoqCi0gICAgKiogSWYgdGhlIHJlc291cmNlIGlzIGEgbG9ja251bGwgcmVzb3VyY2UsIHRoZW4gdGhlIFVOTE9DSyB3aWxsIGFmZmVjdAotICAgICoqIHRoZSBwYXJlbnQgY29sbGVjdGlvbiAobXVjaCBsaWtlIGEgZGVsZXRlKS4gRm9yIHRoYXQgY2FzZSwgd2UgbXVzdAotICAgICoqIHZhbGlkYXRlIHRoZSBwYXJlbnQgcmVzb3VyY2UncyBjb25kaXRpb25zLgotICAgICovCi0gICAgaWYgKChlcnIgPSBkYXZfdmFsaWRhdGVfcmVxdWVzdChyLCByZXNvdXJjZSwgMCwgbG9ja3Rva2VuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm11bHRpX3Jlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2Vfc3RhdGUgPT0gREFWX1JFU09VUkNFX0xPQ0tfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBEQVZfVkFMSURBVEVfUEFSRU5UCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IERBVl9WQUxJREFURV9SRVNPVVJDRSwgTlVMTCkpICE9IE5VTEwpIHsKLQkvKiAjIyMgYWRkIGEgaGlnaGVyLWxldmVsIGRlc2NyaXB0aW9uPyAqLwotCXJldHVybiBkYXZfaGFuZGxlX2VycihyLCBlcnIsIG11bHRpX3Jlc3BvbnNlKTsKLSAgICB9Ci0KLSAgICAvKiAjIyMgUkZDIDI1MTggcy4gOC4xMTogSWYgdGhpcyByZXNvdXJjZSBpcyBsb2NrZWQgYnkgbG9ja3Rva2VuLAotICAgICAqICAgICBfYWxsXyByZXNvdXJjZXMgbG9ja2VkIGJ5IGxvY2t0b2tlbiBhcmUgcmVsZWFzZWQuICBJdCBkb2VzIG5vdCBzYXkKLSAgICAgKiAgICAgcmVzb3VyY2UgaGFzIHRvIGJlIHRoZSByb290IG9mIGFuIGluZmludGUgbG9jay4gIFRodXMsIGFuIFVOTE9DSwotICAgICAqICAgICBvbiBhbnkgcGFydCBvZiBhbiBpbmZpbnRlIGxvY2sgd2lsbCByZW1vdmUgdGhlIGxvY2sgb24gYWxsIHJlc291cmNlcy4KLSAgICAgKiAgICAgCi0gICAgICogICAgIEZvciB1cywgaWYgci0+ZmlsZW5hbWUgcmVwcmVzZW50cyBhbiBpbmRpcmVjdCBsb2NrIChwYXJ0IG9mIGFuIGluZmluaXR5IGxvY2spLAotICAgICAqICAgICB3ZSBtdXN0IGFjdHVhbGx5IHBlcmZvcm0gYW4gVU5MT0NLIG9uIHRoZSBkaXJlY3QgbG9jayBmb3IgdGhpcyByZXNvdXJjZS4KLSAgICAgKi8gICAgIAotICAgIGlmICgocmVzdWx0ID0gZGF2X3VubG9jayhyLCByZXNvdXJjZSwgbG9ja3Rva2VuKSkgIT0gT0spIHsKLQlyZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHJldHVybiBIVFRQX05PX0NPTlRFTlQ7Ci19Ci0KLS8qIGhhbmRsZSB0aGUgU0VBUkNIIG1ldGhvZCBmcm9tIERBU0wgKi8KLXN0YXRpYyBpbnQgZGF2X21ldGhvZF9zZWFyY2gocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgLyogIyMjIHdlIGtub3cgdGhpcyBtZXRob2QsIGJ1dCB3ZSB3b24ndCBhbGxvdyBpdCB5ZXQgKi8KLSAgICAvKiBBcGFjaGUgd2lsbCBzdXBwbHkgYSBkZWZhdWx0IGVycm9yIGZvciB0aGlzLiAqLwotICAgIHJldHVybiBIVFRQX01FVEhPRF9OT1RfQUxMT1dFRDsKLQotICAgIC8qIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcsIGxpa2UgaWYgdGhlIHF1ZXJ5Z3JhbW1hciBpcwotICAgICAqIHN1cHBvcnRlZCBieSB0aGUgY29udGVudCB0eXBlLCBhbmQgdGhlbiBwYXNzIHRoZQotICAgICAqIHJlcXVlc3Qgb24gdG8gdGhlIGFwcHJvcHJpYXRlIHF1ZXJ5IG1vZHVsZS4KLSAgICAgKi8KLX0KLQotLyogaGFuZGxlIHRoZSBDSEVDS09VVCBtZXRob2QgKi8KLXN0YXRpYyBpbnQgZGF2X21ldGhvZF9jaGVja291dChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBkYXZfcmVzb3VyY2UgKnJlc291cmNlOwotICAgIGNvbnN0IGRhdl9ob29rc192c24gKnZzbl9ob29rcyA9IERBVl9HRVRfSE9PS1NfVlNOKHIpOwotICAgIGRhdl9lcnJvciAqZXJyOwotICAgIGludCByZXN1bHQ7Ci0KLSAgICAvKiBJZiBubyB2ZXJzaW9uaW5nIHByb3ZpZGVyLCBkZWNsaW5lIHRoZSByZXF1ZXN0ICovCi0gICAgaWYgKHZzbl9ob29rcyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0KLSAgICAvKiAjIyMgZXZlbnR1YWxseSBjaGVjayBib2R5IGZvciBEQVY6Y2hlY2tpbi1wb2xpY3kgKi8KLSAgICBpZiAoKHJlc3VsdCA9IGFwX2Rpc2NhcmRfcmVxdWVzdF9ib2R5KHIpKSAhPSBPSykgewotCXJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyogQXNrIHJlcG9zaXRvcnkgbW9kdWxlIHRvIHJlc29sdmUgdGhlIHJlc291cmNlICovCi0gICAgcmVzdWx0ID0gZGF2X2dldF9yZXNvdXJjZShyLCAmcmVzb3VyY2UpOwotICAgIGlmIChyZXN1bHQgIT0gT0spCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgaWYgKCFyZXNvdXJjZS0+ZXhpc3RzKSB7Ci0gICAgICAgIC8qIEFwYWNoZSB3aWxsIHN1cHBseSBhIGRlZmF1bHQgZXJyb3IgZm9yIHRoaXMuICovCi0gICAgICAgIHJldHVybiBIVFRQX05PVF9GT1VORDsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayB0aGUgc3RhdGUgb2YgdGhlIHJlc291cmNlOiBtdXN0IGJlIGEgZmlsZSBvciBjb2xsZWN0aW9uLAotICAgICAqIG11c3QgYmUgdmVyc2lvbmVkLCBhbmQgbXVzdCBub3QgYWxyZWFkeSBiZSBjaGVja2VkIG91dC4KLSAgICAgKi8KLSAgICBpZiAocmVzb3VyY2UtPnR5cGUgIT0gREFWX1JFU09VUkNFX1RZUEVfUkVHVUxBUikgewotCXJldHVybiBkYXZfZXJyb3JfcmVzcG9uc2UociwgSFRUUF9DT05GTElDVCwKLQkJCQkgICJDYW5ub3QgY2hlY2tvdXQgdGhpcyB0eXBlIG9mIHJlc291cmNlLiIpOwotICAgIH0KLQotICAgIGlmICghcmVzb3VyY2UtPnZlcnNpb25lZCkgewotCXJldHVybiBkYXZfZXJyb3JfcmVzcG9uc2UociwgSFRUUF9DT05GTElDVCwKLQkJCQkgICJDYW5ub3QgY2hlY2tvdXQgdW52ZXJzaW9uZWQgcmVzb3VyY2UuIik7Ci0gICAgfQotCi0gICAgaWYgKHJlc291cmNlLT53b3JraW5nKSB7Ci0JcmV0dXJuIGRhdl9lcnJvcl9yZXNwb25zZShyLCBIVFRQX0NPTkZMSUNULAotCQkJCSAgIlRoZSByZXNvdXJjZSBpcyBhbHJlYWR5IGNoZWNrZWQgb3V0IHRvIHRoZSB3b3Jrc3BhY2UuIik7Ci0gICAgfQotCi0gICAgLyogIyMjIGRvIGxvY2sgY2hlY2tzLCBvbmNlIGJlaGF2aW9yIGlzIGRlZmluZWQgKi8KLQotICAgIC8qIERvIHRoZSBjaGVja291dCAqLwotICAgIGlmICgoZXJyID0gKCp2c25faG9va3MtPmNoZWNrb3V0KShyZXNvdXJjZSkpICE9IE5VTEwpIHsKLQllcnIgPSBkYXZfcHVzaF9lcnJvcihyLT5wb29sLCBIVFRQX0NPTkZMSUNULCAwLAotCQkJICAgICBhcF9wc3ByaW50ZihyLT5wb29sLAotCQkJCQkgIkNvdWxkIG5vdCBDSEVDS09VVCByZXNvdXJjZSAlcy4iLAotCQkJCQkgYXBfZXNjYXBlX2h0bWwoci0+cG9vbCwgci0+dXJpKSksCi0JCQkgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBkYXZfaGFuZGxlX2VycihyLCBlcnIsIE5VTEwpOwotICAgIH0KLQotICAgIC8qIG5vIGJvZHkgKi8KLSAgICBhcF9zZXRfY29udGVudF9sZW5ndGgociwgMCk7Ci0gICAgYXBfc2VuZF9odHRwX2hlYWRlcihyKTsKLQotICAgIHJldHVybiBET05FOwotfQotCi0vKiBoYW5kbGUgdGhlIFVOQ0hFQ0tPVVQgbWV0aG9kICovCi1zdGF0aWMgaW50IGRhdl9tZXRob2RfdW5jaGVja291dChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBkYXZfcmVzb3VyY2UgKnJlc291cmNlOwotICAgIGNvbnN0IGRhdl9ob29rc192c24gKnZzbl9ob29rcyA9IERBVl9HRVRfSE9PS1NfVlNOKHIpOwotICAgIGRhdl9lcnJvciAqZXJyOwotICAgIGludCByZXN1bHQ7Ci0KLSAgICAvKiBJZiBubyB2ZXJzaW9uaW5nIHByb3ZpZGVyLCBkZWNsaW5lIHRoZSByZXF1ZXN0ICovCi0gICAgaWYgKHZzbl9ob29rcyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0KLSAgICBpZiAoKHJlc3VsdCA9IGFwX2Rpc2NhcmRfcmVxdWVzdF9ib2R5KHIpKSAhPSBPSykgewotCXJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyogQXNrIHJlcG9zaXRvcnkgbW9kdWxlIHRvIHJlc29sdmUgdGhlIHJlc291cmNlICovCi0gICAgcmVzdWx0ID0gZGF2X2dldF9yZXNvdXJjZShyLCAmcmVzb3VyY2UpOwotICAgIGlmIChyZXN1bHQgIT0gT0spCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgaWYgKCFyZXNvdXJjZS0+ZXhpc3RzKSB7Ci0gICAgICAgIC8qIEFwYWNoZSB3aWxsIHN1cHBseSBhIGRlZmF1bHQgZXJyb3IgZm9yIHRoaXMuICovCi0gICAgICAgIHJldHVybiBIVFRQX05PVF9GT1VORDsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayB0aGUgc3RhdGUgb2YgdGhlIHJlc291cmNlOiBtdXN0IGJlIGEgZmlsZSBvciBjb2xsZWN0aW9uLAotICAgICAqIG11c3QgYmUgdmVyc2lvbmVkLCBhbmQgbXVzdCBiZSBjaGVja2VkIG91dC4KLSAgICAgKi8KLSAgICBpZiAocmVzb3VyY2UtPnR5cGUgIT0gREFWX1JFU09VUkNFX1RZUEVfUkVHVUxBUikgewotCXJldHVybiBkYXZfZXJyb3JfcmVzcG9uc2UociwgSFRUUF9DT05GTElDVCwKLQkJCQkgICJDYW5ub3QgdW5jaGVja291dCB0aGlzIHR5cGUgb2YgcmVzb3VyY2UuIik7Ci0gICAgfQotCi0gICAgaWYgKCFyZXNvdXJjZS0+dmVyc2lvbmVkKSB7Ci0JcmV0dXJuIGRhdl9lcnJvcl9yZXNwb25zZShyLCBIVFRQX0NPTkZMSUNULAotCQkJCSAgIkNhbm5vdCB1bmNoZWNrb3V0IHVudmVyc2lvbmVkIHJlc291cmNlLiIpOwotICAgIH0KLQotICAgIGlmICghcmVzb3VyY2UtPndvcmtpbmcpIHsKLQlyZXR1cm4gZGF2X2Vycm9yX3Jlc3BvbnNlKHIsIEhUVFBfQ09ORkxJQ1QsCi0JCQkJICAiVGhlIHJlc291cmNlIGlzIG5vdCBjaGVja2VkIG91dCB0byB0aGUgd29ya3NwYWNlLiIpOwotICAgIH0KLQotICAgIC8qICMjIyBkbyBsb2NrIGNoZWNrcywgb25jZSBiZWhhdmlvciBpcyBkZWZpbmVkICovCi0KLSAgICAvKiBEbyB0aGUgdW5jaGVja291dCAqLwotICAgIGlmICgoZXJyID0gKCp2c25faG9va3MtPnVuY2hlY2tvdXQpKHJlc291cmNlKSkgIT0gTlVMTCkgewotCWVyciA9IGRhdl9wdXNoX2Vycm9yKHItPnBvb2wsIEhUVFBfQ09ORkxJQ1QsIDAsCi0JCQkgICAgIGFwX3BzcHJpbnRmKHItPnBvb2wsCi0JCQkJCSAiQ291bGQgbm90IFVOQ0hFQ0tPVVQgcmVzb3VyY2UgJXMuIiwKLQkJCQkJIGFwX2VzY2FwZV9odG1sKHItPnBvb2wsIHItPnVyaSkpLAotCQkJICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZGF2X2hhbmRsZV9lcnIociwgZXJyLCBOVUxMKTsKLSAgICB9Ci0KLSAgICAvKiBubyBib2R5ICovCi0gICAgYXBfc2V0X2NvbnRlbnRfbGVuZ3RoKHIsIDApOwotICAgIGFwX3NlbmRfaHR0cF9oZWFkZXIocik7Ci0KLSAgICByZXR1cm4gRE9ORTsKLX0KLQotLyogaGFuZGxlIHRoZSBDSEVDS0lOIG1ldGhvZCAqLwotc3RhdGljIGludCBkYXZfbWV0aG9kX2NoZWNraW4ocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgZGF2X3Jlc291cmNlICpyZXNvdXJjZTsKLSAgICBjb25zdCBkYXZfaG9va3NfdnNuICp2c25faG9va3MgPSBEQVZfR0VUX0hPT0tTX1ZTTihyKTsKLSAgICBkYXZfZXJyb3IgKmVycjsKLSAgICBpbnQgcmVzdWx0OwotCi0gICAgLyogSWYgbm8gdmVyc2lvbmluZyBwcm92aWRlciwgZGVjbGluZSB0aGUgcmVxdWVzdCAqLwotICAgIGlmICh2c25faG9va3MgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotCi0gICAgaWYgKChyZXN1bHQgPSBhcF9kaXNjYXJkX3JlcXVlc3RfYm9keShyKSkgIT0gT0spIHsKLQlyZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qIEFzayByZXBvc2l0b3J5IG1vZHVsZSB0byByZXNvbHZlIHRoZSByZXNvdXJjZSAqLwotICAgIHJlc3VsdCA9IGRhdl9nZXRfcmVzb3VyY2UociwgJnJlc291cmNlKTsKLSAgICBpZiAocmVzdWx0ICE9IE9LKQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIGlmICghcmVzb3VyY2UtPmV4aXN0cykgewotICAgICAgICAvKiBBcGFjaGUgd2lsbCBzdXBwbHkgYSBkZWZhdWx0IGVycm9yIGZvciB0aGlzLiAqLwotICAgICAgICByZXR1cm4gSFRUUF9OT1RfRk9VTkQ7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgdGhlIHN0YXRlIG9mIHRoZSByZXNvdXJjZTogbXVzdCBiZSBhIGZpbGUgb3IgY29sbGVjdGlvbiwKLSAgICAgKiBtdXN0IGJlIHZlcnNpb25lZCwgYW5kIG11c3QgYmUgY2hlY2tlZCBvdXQuCi0gICAgICovCi0gICAgaWYgKHJlc291cmNlLT50eXBlICE9IERBVl9SRVNPVVJDRV9UWVBFX1JFR1VMQVIpIHsKLQlyZXR1cm4gZGF2X2Vycm9yX3Jlc3BvbnNlKHIsIEhUVFBfQ09ORkxJQ1QsCi0JCQkJICAiQ2Fubm90IGNoZWNraW4gdGhpcyB0eXBlIG9mIHJlc291cmNlLiIpOwotICAgIH0KLQotICAgIGlmICghcmVzb3VyY2UtPnZlcnNpb25lZCkgewotCXJldHVybiBkYXZfZXJyb3JfcmVzcG9uc2UociwgSFRUUF9DT05GTElDVCwKLQkJCQkgICJDYW5ub3QgY2hlY2tpbiB1bnZlcnNpb25lZCByZXNvdXJjZS4iKTsKLSAgICB9Ci0KLSAgICBpZiAoIXJlc291cmNlLT53b3JraW5nKSB7Ci0JcmV0dXJuIGRhdl9lcnJvcl9yZXNwb25zZShyLCBIVFRQX0NPTkZMSUNULAotCQkJCSAgIlRoZSByZXNvdXJjZSBpcyBub3QgY2hlY2tlZCBvdXQgdG8gdGhlIHdvcmtzcGFjZS4iKTsKLSAgICB9Ci0KLSAgICAvKiAjIyMgZG8gbG9jayBjaGVja3MsIG9uY2UgYmVoYXZpb3IgaXMgZGVmaW5lZCAqLwotCi0gICAgLyogRG8gdGhlIGNoZWNraW4gKi8KLSAgICBpZiAoKGVyciA9ICgqdnNuX2hvb2tzLT5jaGVja2luKShyZXNvdXJjZSkpICE9IE5VTEwpIHsKLQllcnIgPSBkYXZfcHVzaF9lcnJvcihyLT5wb29sLCBIVFRQX0NPTkZMSUNULCAwLAotCQkJICAgICBhcF9wc3ByaW50ZihyLT5wb29sLAotCQkJCQkgIkNvdWxkIG5vdCBDSEVDS0lOIHJlc291cmNlICVzLiIsCi0JCQkJCSBhcF9lc2NhcGVfaHRtbChyLT5wb29sLCByLT51cmkpKSwKLQkJCSAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGRhdl9oYW5kbGVfZXJyKHIsIGVyciwgTlVMTCk7Ci0gICAgfQotCi0gICAgLyogbm8gYm9keSAqLwotICAgIGFwX3NldF9jb250ZW50X2xlbmd0aChyLCAwKTsKLSAgICBhcF9zZW5kX2h0dHBfaGVhZGVyKHIpOwotCi0gICAgcmV0dXJuIERPTkU7Ci19Ci0KLQotLyoKLSAqIFJlc3BvbnNlIGhhbmRsZXIgZm9yIERBViByZXNvdXJjZXMKLSAqLwotc3RhdGljIGludCBkYXZfaGFuZGxlcihyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBkYXZfZGlyX2NvbmYgKmNvbmY7Ci0KLSAgICAvKiBxdWlja2x5IGlnbm9yZSBhbnkgSFRUUC8wLjkgcmVxdWVzdHMgKi8KLSAgICBpZiAoci0+YXNzYmFja3dhcmRzKSB7Ci0JcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIC8qICMjIyBkbyB3ZSBuZWVkIHRvIGRvIGFueXRoaW5nIHdpdGggci0+cHJveHlyZXEgPz8gKi8KLQotICAgIGNvbmYgPSAoZGF2X2Rpcl9jb25mICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLAotCQkJCQkJICZkYXZfbW9kdWxlKTsKLQotICAgIC8qCi0gICAgICogU2V0IHVwIHRoZSBtZXRob2RzIG1hc2ssIHNpbmNlIHRoYXQncyBvbmUgb2YgdGhlIHJlYXNvbnMgdGhpcyBoYW5kbGVyCi0gICAgICogZ2V0cyBjYWxsZWQsIGFuZCBsb3dlci1sZXZlbCB0aGluZ3MgbWF5IG5lZWQgdGhlIGluZm8uCi0gICAgICoKLSAgICAgKiBGaXJzdCwgc2V0IHRoZSBtYXNrIHRvIHRoZSBtZXRob2RzIHdlIGhhbmRsZSBkaXJlY3RseS4gIFNpbmNlIGJ5Ci0gICAgICogZGVmaW5pdGlvbiB3ZSBvd24gb3VyIG1hbmFnZWQgc3BhY2UsIHdlIHVuY29uZGl0aW9uYWxseSBzZXQKLSAgICAgKiB0aGUgci0+YWxsb3dlZCBmaWVsZCByYXRoZXIgdGhhbiBPUmluZyBvdXIgdmFsdWVzIHdpdGggYW55dGhpbmcKLSAgICAgKiBhbnkgb3RoZXIgbW9kdWxlIG1heSBoYXZlIHB1dCBpbiB0aGVyZS4KLSAgICAgKgotICAgICAqIFRoZXNlIGFyZSB0aGUgSFRUUC1kZWZpbmVkIG1ldGhvZHMgdGhhdCB3ZSBoYW5kbGUgZGlyZWN0bHkuCi0gICAgICovCi0gICAgci0+YWxsb3dlZCA9IDAKLSAgICAgICAgfCAoMSA8PCBNX0dFVCkKLQl8ICgxIDw8IE1fUFVUKQotCXwgKDEgPDwgTV9ERUxFVEUpCi0JfCAoMSA8PCBNX09QVElPTlMpCi0JfCAoMSA8PCBNX0lOVkFMSUQpOwotICAgIC8qCi0gICAgICogVGhlc2UgYXJlIHRoZSBEQVYgbWV0aG9kcyB3ZSBoYW5kbGUuCi0gICAgICovCi0gICAgci0+YWxsb3dlZCB8PSAwCi0JfCAoMSA8PCBNX0NPUFkpCi0JfCAoMSA8PCBNX0xPQ0spCi0JfCAoMSA8PCBNX1VOTE9DSykKLQl8ICgxIDw8IE1fTUtDT0wpCi0JfCAoMSA8PCBNX01PVkUpCi0JfCAoMSA8PCBNX1BST1BGSU5EKQotCXwgKDEgPDwgTV9QUk9QUEFUQ0gpOwotICAgIC8qCi0gICAgICogVGhlc2UgYXJlIG1ldGhvZHMgdGhhdCB3ZSBkb24ndCBoYW5kbGUgZGlyZWN0bHksIGJ1dCBsZXQgdGhlCi0gICAgICogc2VydmVyJ3MgZGVmYXVsdCBoYW5kbGVyIGRvIGZvciB1cyBhcyBvdXIgYWdlbnQuCi0gICAgICovCi0gICAgci0+YWxsb3dlZCB8PSAwCi0JfCAoMSA8PCBNX1BPU1QpOwotIAotICAgIC8qICMjIyBocm0uIGlmIHdlIHJldHVybiBIVFRQX01FVEhPRF9OT1RfQUxMT1dFRCwgdGhlbiBhbiBBbGxvdyBoZWFkZXIKLSAgICAgKiAjIyMgaXMgc2VudDsgaXQgd2lsbCBuZWVkIHRoZSBvdGhlciBhbGxvd2VkIHN0YXRlczsgc2luY2UgdGhlIGRlZmF1bHQKLSAgICAgKiAjIyMgaGFuZGxlciBpcyBub3QgY2FsbGVkIG9uIGVycm9yLCB0aGVuIGl0IGRvZXNuJ3QgYWRkIHRoZSBvdGhlcgotICAgICAqICMjIyBhbGxvd2VkIHN0YXRlcywgc28gd2UgbXVzdCAqLwotICAgIC8qICMjIyB3ZSBtaWdodCBuZWVkIHRvIHJlZmluZSB0aGlzIGZvciBqdXN0IHdoZXJlIHdlIHJldHVybiB0aGUgZXJyb3IuCi0gICAgICogIyMjIGFsc28sIHRoZXJlIGlzIHRoZSBpc3N1ZSB3aXRoIG90aGVyIG1ldGhvZHMgKHNlZSBJU1NVRVMpICovCi0gICAgLyogIyMjIG1vcmUgd29yayBuZWNlc3NhcnksIG5vdyB0aGF0IHdlIGhhdmUgTV9mb28gZm9yIERBViBtZXRob2RzICovCi0KLSAgICAvKiBkaXNwYXRjaCB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kIGhhbmRsZXIgKi8KLSAgICBpZiAoci0+bWV0aG9kX251bWJlciA9PSBNX0dFVCkgewotCXJldHVybiBkYXZfbWV0aG9kX2dldChyKTsKLSAgICB9Ci0KLSAgICBpZiAoci0+bWV0aG9kX251bWJlciA9PSBNX1BVVCkgewotCXJldHVybiBkYXZfbWV0aG9kX3B1dChyKTsKLSAgICB9Ci0KLSAgICBpZiAoci0+bWV0aG9kX251bWJlciA9PSBNX1BPU1QpIHsKLQlyZXR1cm4gZGF2X21ldGhvZF9wb3N0KHIpOwotICAgIH0KLQotICAgIGlmIChyLT5tZXRob2RfbnVtYmVyID09IE1fREVMRVRFKSB7Ci0JcmV0dXJuIGRhdl9tZXRob2RfZGVsZXRlKHIpOwotICAgIH0KLQotICAgIGlmIChyLT5tZXRob2RfbnVtYmVyID09IE1fT1BUSU9OUykgewotCXJldHVybiBkYXZfbWV0aG9kX29wdGlvbnMocik7Ci0gICAgfQotCi0gICAgaWYgKHItPm1ldGhvZF9udW1iZXIgPT0gTV9QUk9QRklORCkgewotCXJldHVybiBkYXZfbWV0aG9kX3Byb3BmaW5kKHIpOwotICAgIH0KLQotICAgIGlmIChyLT5tZXRob2RfbnVtYmVyID09IE1fUFJPUFBBVENIKSB7Ci0JcmV0dXJuIGRhdl9tZXRob2RfcHJvcHBhdGNoKHIpOwotICAgIH0KLQotICAgIGlmIChyLT5tZXRob2RfbnVtYmVyID09IE1fTUtDT0wpIHsKLQlyZXR1cm4gZGF2X21ldGhvZF9ta2NvbChyKTsKLSAgICB9Ci0KLSAgICBpZiAoci0+bWV0aG9kX251bWJlciA9PSBNX0NPUFkpIHsKLQlyZXR1cm4gZGF2X21ldGhvZF9jb3B5bW92ZShyLCBEQVZfRE9fQ09QWSk7Ci0gICAgfQotCi0gICAgaWYgKHItPm1ldGhvZF9udW1iZXIgPT0gTV9NT1ZFKSB7Ci0JcmV0dXJuIGRhdl9tZXRob2RfY29weW1vdmUociwgREFWX0RPX01PVkUpOwotICAgIH0KLQotICAgIGlmIChyLT5tZXRob2RfbnVtYmVyID09IE1fTE9DSykgewotCXJldHVybiBkYXZfbWV0aG9kX2xvY2socik7Ci0gICAgfQotCi0gICAgaWYgKHItPm1ldGhvZF9udW1iZXIgPT0gTV9VTkxPQ0spIHsKLQlyZXR1cm4gZGF2X21ldGhvZF91bmxvY2socik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBOT1RFOiBXaGVuIEFwYWNoZSBtb3ZlcyBjcmVhdGVzIGRlZmluZXMgZm9yIHRoZSBhZGQnbCBEQVYgbWV0aG9kcywKLSAgICAgKiAgICAgICB0aGVuIGl0IHdpbGwgbm8gbG9uZ2VyIHVzZSBNX0lOVkFMSUQuIFRoaXMgY29kZSBtdXN0IGJlCi0gICAgICogICAgICAgdXBkYXRlZCBlYWNoIHRpbWUgQXBhY2hlIGFkZHMgbWV0aG9kIGRlZmluZXMuCi0gICAgICovCi0gICAgaWYgKHItPm1ldGhvZF9udW1iZXIgIT0gTV9JTlZBTElEKSB7Ci0JcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIGlmICghc3RyY21wKHItPm1ldGhvZCwgIlNFQVJDSCIpKSB7Ci0JcmV0dXJuIGRhdl9tZXRob2Rfc2VhcmNoKHIpOwotICAgIH0KLQotICAgIGlmICghc3RyY21wKHItPm1ldGhvZCwgIkNIRUNLT1VUIikpIHsKLQlyZXR1cm4gZGF2X21ldGhvZF9jaGVja291dChyKTsKLSAgICB9Ci0KLSAgICBpZiAoIXN0cmNtcChyLT5tZXRob2QsICJVTkNIRUNLT1VUIikpIHsKLQlyZXR1cm4gZGF2X21ldGhvZF91bmNoZWNrb3V0KHIpOwotICAgIH0KLQotICAgIGlmICghc3RyY21wKHItPm1ldGhvZCwgIkNIRUNLSU4iKSkgewotCXJldHVybiBkYXZfbWV0aG9kX2NoZWNraW4ocik7Ci0gICAgfQotCi0jaWYgMAotICAgIGlmICghc3RyY21wKHItPm1ldGhvZCwgIk1LUkVTT1VSQ0UiKSkgewotCXJldHVybiBkYXZfbWV0aG9kX21rcmVzb3VyY2Uocik7Ci0gICAgfQotCi0gICAgaWYgKCFzdHJjbXAoci0+bWV0aG9kLCAiUkVQT1JUIikpIHsKLQlyZXR1cm4gZGF2X21ldGhvZF9yZXBvcnQocik7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvKiAjIyMgYWRkJ2wgbWV0aG9kcyBmb3IgQWR2YW5jZWQgQ29sbGVjdGlvbnMsIEFDTHMsIERBU0wgKi8KLQotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotc3RhdGljIGludCBkYXZfdHlwZV9jaGVja2VyKHJlcXVlc3RfcmVjICpyKQotewotICAgIGRhdl9kaXJfY29uZiAqY29uZjsKLQotICAgIGNvbmYgPSAoZGF2X2Rpcl9jb25mICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLAotCQkJCQkJICZkYXZfbW9kdWxlKTsKLQotICAgIC8qIGlmIERBViBpcyBub3QgZW5hYmxlZCwgdGhlbiB3ZSd2ZSBnb3Qgbm90aGluZyB0byBkbyAqLwotICAgIGlmIChjb25mLT5lbmFibGVkICE9IERBVl9FTkFCTEVEX09OKSB7Ci0JcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIGlmIChyLT5tZXRob2RfbnVtYmVyID09IE1fR0VUKSB7Ci0JLyoKLQkqKiAjIyMgbmVlZCBzb21lIHdvcmsgdG8gcHVsbCBDb250ZW50LVR5cGUgYW5kIENvbnRlbnQtTGFuZ3VhZ2UKLQkqKiAjIyMgZnJvbSB0aGUgcHJvcGVydHkgZGF0YWJhc2UuCi0JKi8KLQkgICAgCi0JLyoKLQkqKiBJZiB0aGUgcmVwb3NpdG9yeSBoYXNuJ3QgaW5kaWNhdGVkIHRoYXQgaXQgd2lsbCBoYW5kbGUgdGhlCi0JKiogR0VUIG1ldGhvZCwgdGhlbiBqdXN0IHB1bnQuCi0JKioKLQkqKiAjIyMgdGhpcyBpc24ndCBxdWl0ZSByaWdodC4uLiB0YWtpbmcgb3ZlciB0aGUgcmVzcG9uc2UgY2FuIGJyZWFrCi0JKiogIyMjIHRoaW5ncyBsaWtlIG1vZF9uZWdvdGlhdGlvbi4gbmVlZCB0byBsb29rIGludG8gdGhpcyBzb21lIG1vcmUuCi0JKi8KLQlpZiAoIWNvbmYtPmhhbmRsZV9nZXQpCi0JICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICAvKiAjIyMgd2Ugc2hvdWxkIChpbnN0ZWFkKSB0cmFwIHRoZSBvbmVzIHRoYXQgd2UgRE8gdW5kZXJzdGFuZCAqLwotICAgIC8qICMjIyB0aGUgaGFuZGxlciBET0VTIGhhbmRsZSBQT1NULCBzbyB3ZSBuZWVkIHRvIGZpeCBvbmUgb2YgdGhlc2UgKi8KLSAgICBpZiAoci0+bWV0aG9kX251bWJlciAhPSBNX1BPU1QpIHsKLQotCS8qCi0JKiogIyMjIGFueXRoaW5nIGVsc2UgdG8gZG8gaGVyZT8gY291bGQgYW5vdGhlciBtb2R1bGUgYW5kL29yCi0JKiogIyMjIGNvbmZpZyBvcHRpb24gInRha2Ugb3ZlciIgdGhlIGhhbmRsZXIgaGVyZT8gaS5lLiBob3cgZG8KLQkqKiAjIyMgd2UgbG9jayBkb3duIHRoaXMgaGllcmFyY2h5IHNvIHRoYXQgd2UgYXJlIHRoZSB1bHRpbWF0ZQotCSoqICMjIyBhcmJpdGVyPyAob3IgZG8gd2Ugc2ltcGx5IGRlcGVuZCBvbiB0aGUgYWRtaW5pc3RyYXRvcgotCSoqICMjIyB0byBhdm9pZCBjb25mbGljdGluZyBjb25maWd1cmF0aW9ucz8pCi0JKioKLQkqKiAjIyMgSSB0aGluayB0aGUgT0sgc3RvcHMgcnVubmluZyB0eXBlLWNoZWNrZXJzLiBuZWVkIHRvIGxvb2suCi0JKi8KLQlyLT5oYW5kbGVyID0gImRhdi1oYW5kbGVyIjsKLQlyZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgcmV0dXJuIERFQ0xJTkVEOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qKgotKiogQ29uZmlndXJhdGlvbiBpbmZvIGZvciB0aGUgbW9kdWxlCi0qLwotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgZGF2X2NtZHNbXSA9Ci17Ci0gICAgewotCSJEQVYiLAotCWRhdl9jbWRfZGF2LAotCU5VTEwsCi0JQUNDRVNTX0NPTkYsICAgICAgICAgICAgLyogcGVyIGRpcmVjdG9yeS9sb2NhdGlvbiAqLwotCUZMQUcsCi0JInR1cm4gREFWIG9uL29mZiBmb3IgYSBkaXJlY3Rvcnkgb3IgbG9jYXRpb24iCi0gICAgfSwKLSAgICB7Ci0JIkRBVkxvY2tEQiIsCi0JZGF2X2NtZF9kYXZsb2NrZGIsCi0JTlVMTCwKLQlSU1JDX0NPTkYsICAgICAgICAgICAgICAvKiBwZXIgc2VydmVyICovCi0JVEFLRTEsCi0JInNwZWNpZnkgYSBsb2NrIGRhdGFiYXNlIgotICAgIH0sCi0gICAgewotCSJEQVZNaW5UaW1lb3V0IiwKLQlkYXZfY21kX2Rhdm1pbnRpbWVvdXQsCi0JTlVMTCwKLQlBQ0NFU1NfQ09ORnxSU1JDX0NPTkYsICAvKiBwZXIgZGlyZWN0b3J5L2xvY2F0aW9uLCBvciBwZXIgc2VydmVyICovCi0JVEFLRTEsCi0JInNwZWNpZnkgbWluaW11bSBhbGxvd2VkIHRpbWVvdXQiCi0gICAgfSwKLSAgICB7Ci0JIkRBVkRlcHRoSW5maW5pdHkiLAotCWRhdl9jbWRfZGF2ZGVwdGhpbmZpbml0eSwKLQlOVUxMLAotCUFDQ0VTU19DT05GfFJTUkNfQ09ORiwgIC8qIHBlciBkaXJlY3RvcnkvbG9jYXRpb24sIG9yIHBlciBzZXJ2ZXIgKi8KLQlGTEFHLAotCSJhbGxvdyBEZXB0aCBpbmZpbml0eSBQUk9QRklORCByZXF1ZXN0cyIKLSAgICB9LAotICAgIHsKLQkiREFWUGFyYW0iLAotCWRhdl9jbWRfZGF2cGFyYW0sCi0JTlVMTCwKLQlBQ0NFU1NfQ09ORnxSU1JDX0NPTkYsICAvKiBwZXIgZGlyZWN0b3J5L2xvY2F0aW9uLCBvciBwZXIgc2VydmVyICovCi0JVEFLRTIsCi0JIkRBVlBhcmFtIDxwYXJhbWV0ZXIgbmFtZT4gPHBhcmFtZXRlciB2YWx1ZT4iCi0gICAgfSwKLSAgICB7Ci0JIkxpbWl0WE1MUmVxdWVzdEJvZHkiLAotCWRhdl9jbWRfbGltaXR4bWxyZXF1ZXN0Ym9keSwKLQlOVUxMLAotCUFDQ0VTU19DT05GfFJTUkNfQ09ORiwgIC8qIHBlciBkaXJlY3RvcnkvbG9jYXRpb24sIG9yIHBlciBzZXJ2ZXIgKi8KLQlUQUtFMSwKLQkiTGltaXQgKGluIGJ5dGVzKSBvbiBtYXhpbXVtIHNpemUgb2YgYW4gWE1MLWJhc2VkIHJlcXVlc3QgYm9keSIKLSAgICB9LAotICAgIHsgTlVMTCB9Ci19OwotCi1zdGF0aWMgY29uc3QgaGFuZGxlcl9yZWMgZGF2X2hhbmRsZXJzW10gPQotewotICAgIHsiZGF2LWhhbmRsZXIiLCBkYXZfaGFuZGxlcn0sCi0gICAgeyBOVUxMIH0KLX07Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBkYXZfbW9kdWxlID0KLXsKLSAgICBTVEFOREFSRF9NT0RVTEVfU1RVRkYsCi0gICAgZGF2X2luaXRfaGFuZGxlciwJCS8qIGluaXRpYWxpemVyICovCi0gICAgZGF2X2NyZWF0ZV9kaXJfY29uZmlnLAkvKiBkaXIgY29uZmlnIGNyZWF0ZXIgKi8KLSAgICBkYXZfbWVyZ2VfZGlyX2NvbmZpZywJLyogZGlyIG1lcmdlciAtLS0gZGVmYXVsdCBpcyB0byBvdmVycmlkZSAqLwotICAgIGRhdl9jcmVhdGVfc2VydmVyX2NvbmZpZywJLyogc2VydmVyIGNvbmZpZyAqLwotICAgIGRhdl9tZXJnZV9zZXJ2ZXJfY29uZmlnLAkvKiBtZXJnZSBzZXJ2ZXIgY29uZmlnICovCi0gICAgZGF2X2NtZHMsCQkJLyogY29tbWFuZCB0YWJsZSAqLwotICAgIGRhdl9oYW5kbGVycywJCS8qIGhhbmRsZXJzICovCi0gICAgTlVMTCwJCQkvKiBmaWxlbmFtZSB0cmFuc2xhdGlvbiAqLwotICAgIE5VTEwsCQkJLyogY2hlY2tfdXNlcl9pZCAqLwotICAgIE5VTEwsCQkJLyogY2hlY2sgYXV0aCAqLwotICAgIE5VTEwsCQkJLyogY2hlY2sgYWNjZXNzICovCi0gICAgZGF2X3R5cGVfY2hlY2tlciwJCS8qIHR5cGVfY2hlY2tlciAqLwotICAgIE5VTEwsCQkJLyogZml4dXBzICovCi0gICAgTlVMTCwJCQkvKiBsb2dnZXIgKi8KLSAgICBOVUxMLAkJCS8qIGhlYWRlciBwYXJzZXIgKi8KLSAgICBOVUxMLAkJCS8qIGNoaWxkX2luaXQgKi8KLSAgICBOVUxMLAkJCS8qIGNoaWxkX2V4aXQgKi8KLSAgICBOVUxMCQkJLyogcG9zdCByZWFkLXJlcXVlc3QgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL2Rhdi9tYWluL21vZF9kYXYuZHNwIGIvbW9kdWxlcy9kYXYvbWFpbi9tb2RfZGF2LmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwM2E4ZC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2Rhdi9tYWluL21vZF9kYXYuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ibW9kX2RhdiIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyCi0KLUNGRz1tb2RfZGF2IC0gV2luMzIgUmVsZWFzZQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJtb2RfZGF2Lm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAibW9kX2Rhdi5tYWsiIENGRz0ibW9kX2RhdiAtIFdpbjMyIFJlbGVhc2UiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAibW9kX2RhdiAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgIm1vZF9kYXYgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLU1UTD1taWRsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJtb2RfZGF2IC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIi5cQXBhY2hlTW8iCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXEFwYWNoZU1vIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIi5cbW9kX2RhdlIiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxtb2RfZGF2UiIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvR1ggL08yIC9JICIuLlwuLlxtb2R1bGVzXGRhdlxtYWluIiAvSSAiLi5cLi5cbGliXHNkYm0iIC9JICIuLlwuLlxsaWJcZXhwYXQtbGl0ZSIgL0kgIi4uXC4uXGxpYlxhcHJcaW5jbHVkZSIgL0kgIi4uXC4uXGluY2x1ZGUiIC9JICIuLlwuLlxvc1x3aW4zMiIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJTSEFSRURfTU9EVUxFIiAvRCAiREFWX0VYUE9SVF9TWU1CT0xTIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBBcGFjaGVDb3JlLmxpYiBhcHJsaWIubGliIGtlcm5lbDMyLmxpYiB3czJfMzIubGliIG1zd3NvY2subGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvbWFjaGluZTpJMzg2IC9saWJwYXRoOiIuLlwuLlxDb3JlUiIgL2xpYnBhdGg6Ii4uXC4uXGxpYlxhcHJcUmVsZWFzZSIgL2Jhc2U6QEJhc2VBZGRyLnJlZixtb2RfZGF2Ci0jIEFERCBMSU5LMzIgQXBhY2hlQ29yZS5saWIgYXBybGliLmxpYiBrZXJuZWwzMi5saWIgd3MyXzMyLmxpYiBtc3dzb2NrLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYXAgL21hY2hpbmU6STM4NiAvbGlicGF0aDoiLi5cLi5cQ29yZVIiIC9saWJwYXRoOiIuLlwuLlxsaWJcYXByXFJlbGVhc2UiIC9iYXNlOkBCYXNlQWRkci5yZWYsbW9kX2RhdgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibW9kX2RhdiAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxBcGFjaGVNMCIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIi5cQXBhY2hlTTAiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiLlxtb2RfZGF2RCIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuXG1vZF9kYXZEIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTURkIC9XMyAvR20gL0dYIC9aSSAvT2QgL0kgIi4uXC4uXG1vZHVsZXNcZGF2XG1haW4iIC9JICIuLlwuLlxsaWJcc2RibSIgL0kgIi4uXC4uXGxpYlxleHBhdC1saXRlIiAvSSAiLi5cLi5cbGliXGFwclxpbmNsdWRlIiAvSSAiLi5cLi5caW5jbHVkZSIgL0kgIi4uXC4uXG9zXHdpbjMyIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIlNIQVJFRF9NT0RVTEUiIC9EICJEQVZfRVhQT1JUX1NZTUJPTFMiIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIEFwYWNoZUNvcmUubGliIGFwcmxpYi5saWIga2VybmVsMzIubGliIHdzMl8zMi5saWIgbXN3c29jay5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9saWJwYXRoOiIuLlwuLlxDb3JlRCIgL2xpYnBhdGg6Ii4uXC4uXGxpYlxhcHJcRGVidWciIC9iYXNlOkBCYXNlQWRkci5yZWYsbW9kX2RhdgotIyBBREQgTElOSzMyIEFwYWNoZUNvcmUubGliIGFwcmxpYi5saWIga2VybmVsMzIubGliIHdzMl8zMi5saWIgbXN3c29jay5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NiAvbGlicGF0aDoiLi5cLi5cQ29yZUQiIC9saWJwYXRoOiIuLlwuLlxsaWJcYXByXERlYnVnIiAvYmFzZTpAQmFzZUFkZHIucmVmLG1vZF9kYXYKLSMgU1VCVFJBQ1QgTElOSzMyIC9pbmNyZW1lbnRhbDpubyAvbWFwCi0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJtb2RfZGF2IC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAibW9kX2RhdiAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aHBqO2JhdDtmb3I7ZjkwIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cbW9kdWxlc1xkYXZcbWFpblxsaXZlcHJvcC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cbW9kdWxlc1xkYXZcbWFpblxtb2RfZGF2LmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxtb2R1bGVzXGRhdlxtYWluXHByb3BzLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxtb2R1bGVzXGRhdlxtYWluXHByb3ZpZGVycy5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cbW9kdWxlc1xkYXZcbWFpblx1dGlsLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxtb2R1bGVzXGRhdlxtYWluXHV0aWxfbG9jay5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sO2ZpO2ZkIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cbW9kdWxlc1xkYXZcbWFpblxtb2RfZGF2LmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9tb2R1bGVzL2Rhdi9tYWluL21vZF9kYXYuaCBiL21vZHVsZXMvZGF2L21haW4vbW9kX2Rhdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjM4ZDRmLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZGF2L21haW4vbW9kX2Rhdi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgwOSArMCwwIEBACi0vKgotKiogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAgR3JlZyBTdGVpbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoqCi0qKiBCeSB1c2luZyB0aGlzIGZpbGUsIHlvdSBhZ3JlZSB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgc2V0IGZvcnRoIGluCi0qKiB0aGUgTElDRU5TRS5odG1sIGZpbGUgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIG1vZF9kYXYKLSoqIGRpc3RyaWJ1dGlvbiBvciBhdCBodHRwOi8vd3d3LndlYmRhdi5vcmcvbW9kX2Rhdi9saWNlbnNlLTEuaHRtbC4KLSoqCi0qKiBDb250YWN0IGluZm9ybWF0aW9uOgotKiogICBHcmVnIFN0ZWluLCBQTyBCb3ggNzYwLCBQYWxvIEFsdG8sIENBLCA5NDMwMgotKiogICBnc3RlaW5AbHlyYS5vcmcsIGh0dHA6Ly93d3cud2ViZGF2Lm9yZy9tb2RfZGF2LwotKi8KLQotLyoKLSoqIERBViBleHRlbnNpb24gbW9kdWxlIGZvciBBcGFjaGUgMS4zLioKLSoqCi0qKiBXcml0dGVuIGJ5IEdyZWcgU3RlaW4sIGdzdGVpbkBseXJhLm9yZywgaHR0cDovL3d3dy5seXJhLm9yZy8KLSovCi0KLSNpZm5kZWYgX01PRF9EQVZfSF8KLSNkZWZpbmUgX01PRF9EQVZfSF8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLQotCi0jZGVmaW5lIERBVl9WRVJTSU9OCQkiMS4wLjEiCi0KLSNkZWZpbmUgREFWX1hNTF9IRUFERVIJCSI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJ1dGYtOFwiPz4iCi0jZGVmaW5lIERBVl9YTUxfQ09OVEVOVF9UWVBFCSJ0ZXh0L3htbDsgY2hhcnNldD1cInV0Zi04XCIiCi0KLSNkZWZpbmUgREFWX1JFQURfQkxPQ0tTSVpFCTIwNDgJLyogdXNlZCBmb3IgcmVhZGluZyBpbnB1dCBibG9ja3MgKi8KLQotI2lmZGVmIFdJTjMyCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci10eXBlZGVmIGludCBzc2l6ZV90OwotI2VuZGlmIC8qIFdJTjMyICovCi0KLSNkZWZpbmUgREFWX1JFU1BPTlNFX0JPRFlfMQkiPCFET0NUWVBFIEhUTUwgUFVCTElDIFwiLS8vSUVURi8vRFREIEhUTUwgMi4wLy9FTlwiPlxuPEhUTUw+PEhFQUQ+XG48VElUTEU+IgotI2RlZmluZSBEQVZfUkVTUE9OU0VfQk9EWV8yCSI8L1RJVExFPlxuPC9IRUFEPjxCT0RZPlxuPEgxPiIKLSNkZWZpbmUgREFWX1JFU1BPTlNFX0JPRFlfMwkiPC9IMT5cbiIKLSNkZWZpbmUgREFWX1JFU1BPTlNFX0JPRFlfNAkiPC9CT0RZPjwvSFRNTD5cbiIKLQotI2RlZmluZSBEQVZfRE9fQ09QWQkJMAotI2RlZmluZSBEQVZfRE9fTU9WRQkJMQotCi0KLSNpZiAxCi0jZGVmaW5lIERBVl9ERUJVRyAxCi0jZGVmaW5lIERFQlVHX0NSCSJcbiIKLSNkZWZpbmUgREJHMChmKQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIFwKLQkJCQlBUExPR19FUlJ8QVBMT0dfTk9FUlJOTywgTlVMTCwgKGYpKQotI2RlZmluZSBEQkcxKGYsYTEpCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBcCi0JCQkJQVBMT0dfRVJSfEFQTE9HX05PRVJSTk8sIE5VTEwsIGYsIGExKQotI2RlZmluZSBEQkcyKGYsYTEsYTIpCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBcCi0JCQkJQVBMT0dfRVJSfEFQTE9HX05PRVJSTk8sIE5VTEwsIGYsIGExLCBhMikKLSNkZWZpbmUgREJHMyhmLGExLGEyLGEzKSBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgXAotCQkJCUFQTE9HX0VSUnxBUExPR19OT0VSUk5PLCBOVUxMLCBmLCBhMSwgYTIsIGEzKQotI2Vsc2UKLSN1bmRlZiBEQVZfREVCVUcKLSNkZWZpbmUgREVCVUdfQ1IJIiIKLSNlbmRpZgotCi0jZGVmaW5lIERBVl9JTkZJTklUWQlJTlRfTUFYCS8qIGZvciB0aGUgRGVwdGg6IGhlYWRlciAqLwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qKgotKiogRVJST1IgTUFOQUdFTUVOVAotKi8KLQotLyoKLSoqIGRhdl9lcnJvciBzdHJ1Y3R1cmUuCi0qKgotKiogSW4gbW9zdCBjYXNlcywgbW9kX2RhdiB1c2VzIGEgcG9pbnRlciB0byBhIGRhdl9lcnJvciBzdHJ1Y3R1cmUuIElmIHRoZQotKiogcG9pbnRlciBpcyBOVUxMLCB0aGVuIG5vIGVycm9yIGhhcyBvY2N1cnJlZC4KLSoqCi0qKiBJbiBjZXJ0YWluIGNhc2VzLCBhIGRhdl9lcnJvciBzdHJ1Y3R1cmUgaXMgZGlyZWN0bHkgdXNlZC4gSW4gdGhlc2UgY2FzZXMsCi0qKiBhIHN0YXR1cyB2YWx1ZSBvZiAwIG1lYW5zIHRoYXQgYW4gZXJyb3IgaGFzIG5vdCBvY2N1cnJlZC4KLSoqCi0qKiBOb3RlOiB0aGlzIGltcGxpZXMgdGhhdCBzdGF0dXMgIT0gMCB3aGVuZXZlciBhbiBlcnJvciBvY2N1cnMuCi0qKgotKiogVGhlIGRlc2MgZmllbGQgaXMgb3B0aW9uYWwgKGl0IG1heSBiZSBOVUxMKS4gV2hlbiBOVUxMLCBpdCB0eXBpY2FsbHkKLSoqIGltcGxpZXMgdGhhdCBBcGFjaGUgaGFzIGEgcHJvcGVyIGRlc2NyaXB0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHN0YXR1cy4KLSovCi10eXBlZGVmIHN0cnVjdCBkYXZfZXJyb3IgewotICAgIGludCBzdGF0dXM7CQkJLyogc3VnZ2VzdGVkIEhUVFAgc3RhdHVzICgwIGZvciBubyBlcnJvcikgKi8KLSAgICBpbnQgZXJyb3JfaWQ7CQkvKiBEQVYtc3BlY2lmaWMgZXJyb3IgSUQgKi8KLSAgICBjb25zdCBjaGFyICpkZXNjOwkJLyogREFWOnJlc3BvbnNlZGVzY3JpcHRpb24gYW5kIGVycm9yIGxvZyAqLwotCi0gICAgaW50IHNhdmVfZXJybm87CQkvKiBjb3B5IG9mIGVycm5vIGNhdXNpbmcgdGhlIGVycm9yICovCi0KLSAgICBzdHJ1Y3QgZGF2X2Vycm9yICpwcmV2OwkvKiBwcmV2aW91cyBlcnJvciAoaW4gc3RhY2spICovCi0KLSAgICAvKiBkZWZlcnJlZCBjb21wdXRhdGlvbiBvZiB0aGUgZGVzY3JpcHRpb24gKi8KLSAgICB2b2lkICgqY29tcHV0ZV9kZXNjKShzdHJ1Y3QgZGF2X2Vycm9yICplcnIsIHBvb2wgKnApOwotICAgIGludCBjdHhfaTsKLSAgICBjb25zdCBjaGFyICpjdHhfczsKLSAgICB2b2lkICpjdHhfcDsKLQotfSBkYXZfZXJyb3I7Ci0KLS8qCi0qKiBDcmVhdGUgYSBuZXcgZXJyb3Igc3RydWN0dXJlLiBzYXZlX2Vycm5vIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIGN1cnJlbnQKLSoqIGVycm5vIHZhbHVlLgotKi8KLWRhdl9lcnJvciAqZGF2X25ld19lcnJvcihwb29sICpwLCBpbnQgc3RhdHVzLCBpbnQgZXJyb3JfaWQsIGNvbnN0IGNoYXIgKmRlc2MpOwotCi0vKgotKiogUHVzaCBhIG5ldyBlcnJvciBkZXNjcmlwdGlvbiBvbnRvIHRoZSBzdGFjayBvZiBlcnJvcnMuCi0qKgotKiogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHByb3ZpZGUgYW4gYWRkaXRpb25hbCBkZXNjcmlwdGlvbiB0byBhbiBleGlzdGluZwotKiogZXJyb3IuCi0qKgotKiogPHN0YXR1cz4gc2hvdWxkIGNvbnRhaW4gdGhlIGNhbGxlcidzIHZpZXcgb2Ygd2hhdCB0aGUgY3VycmVudCBzdGF0dXMgaXMsCi0qKiBnaXZlbiB0aGUgdW5kZXJseWluZyBlcnJvci4gSWYgaXQgZG9lc24ndCBoYXZlIGEgYmV0dGVyIGlkZWEsIHRoZW4gdGhlCi0qKiBjYWxsZXIgc2hvdWxkIHBhc3MgcHJldi0+c3RhdHVzLgotKioKLSoqIDxlcnJvcl9pZD4gY2FuIHNwZWNpZnkgYSBuZXcgZXJyb3JfaWQgc2luY2UgdGhlIHRvcG1vc3QgZGVzY3JpcHRpb24gaGFzCi0qKiBjaGFuZ2VkLgotKi8KLWRhdl9lcnJvciAqZGF2X3B1c2hfZXJyb3IocG9vbCAqcCwgaW50IHN0YXR1cywgaW50IGVycm9yX2lkLCBjb25zdCBjaGFyICpkZXNjLAotCQkJICBkYXZfZXJyb3IgKnByZXYpOwotCi0KLS8qIGVycm9yIElEIHZhbHVlcy4uLiAqLwotCi0vKiBJRjogaGVhZGVyIGVycm9ycyAqLwotI2RlZmluZSBEQVZfRVJSX0lGX1BBUlNFCQkxMDAJLyogZ2VuZXJhbCBwYXJzaW5nIGVycm9yICovCi0jZGVmaW5lIERBVl9FUlJfSUZfTVVMVElQTEVfTk9UCQkxMDEJLyogbXVsdGlwbGUgIk5vdCIgZm91bmQgKi8KLSNkZWZpbmUgREFWX0VSUl9JRl9VTktfQ0hBUgkJMTAyCS8qIHVua25vd24gY2hhciBpbiBoZWFkZXIgKi8KLSNkZWZpbmUgREFWX0VSUl9JRl9BQlNFTlQJCTEwMwkvKiBubyBsb2NrdG9rZW5zIGdpdmVuICovCi0jZGVmaW5lIERBVl9FUlJfSUZfVEFHR0VECQkxMDQJLyogaW4gcGFyc2luZyB0YWdnZWQtbGlzdCAqLwotI2RlZmluZSBEQVZfRVJSX0lGX1VOQ0xPU0VEX1BBUkVOCTEwNQkvKiBpbiBuby10YWdnZWQtbGlzdCAqLwotCi0vKiBQcm9wIERCIGVycm9ycyAqLwotI2RlZmluZSBEQVZfRVJSX1BST1BfQkFEX01BSk9SCQkyMDAJLyogbWFqb3IgdmVyc2lvbiB3YXMgd3JvbmcgKi8KLSNkZWZpbmUgREFWX0VSUl9QUk9QX1JFQURPTkxZCQkyMDEJLyogcHJvcCBpcyByZWFkLW9ubHkgKi8KLSNkZWZpbmUgREFWX0VSUl9QUk9QX05PX0RBVEFCQVNFCTIwMgkvKiB3cml0ZWFibGUgZGIgbm90IGF2YWlsICovCi0jZGVmaW5lIERBVl9FUlJfUFJPUF9OT1RfRk9VTkQJCTIwMwkvKiBwcm9wIG5vdCBmb3VuZCAqLwotI2RlZmluZSBEQVZfRVJSX1BST1BfQkFEX0xPQ0tEQgkJMjA0CS8qIGNvdWxkIG5vdCBvcGVuIGxvY2tkYiAqLwotI2RlZmluZSBEQVZfRVJSX1BST1BfT1BFTklORwkJMjA1CS8qIHByb2JsZW0gb3BlbmluZyBwcm9wZGIgKi8KLSNkZWZpbmUgREFWX0VSUl9QUk9QX0VYRUMJCTIwNgkvKiBwcm9ibGVtIGV4ZWMnaW5nIHBhdGNoICovCi0KLS8qIFByZWRlZmluZWQgREIgZXJyb3JzICovCi0vKiAjIyMgYW55IHRvIGRlZmluZT8/ICovCi0KLS8qIFByZWRlZmluZWQgbG9ja2luZyBzeXN0ZW0gZXJyb3JzICovCi0jZGVmaW5lIERBVl9FUlJfTE9DS19PUEVOREIJCTQwMAkvKiBjb3VsZCBub3Qgb3BlbiBsb2NrZGIgKi8KLSNkZWZpbmUgREFWX0VSUl9MT0NLX05PX0RCCQk0MDEJLyogbm8gZGF0YWJhc2UgZGVmaW5lZCAqLwotI2RlZmluZSBEQVZfRVJSX0xPQ0tfQ09SUlVQVF9EQgkJNDAyCS8qIERCIGlzIGNvcnJ1cHQgKi8KLSNkZWZpbmUgREFWX0VSUl9MT0NLX1VOS19TVEFURV9UT0tFTgk0MDMJLyogdW5rbm93biBTdGF0ZS10b2tlbiAqLwotI2RlZmluZSBEQVZfRVJSX0xPQ0tfUEFSU0VfVE9LRU4JNDA0CS8qIGJhZCBvcGFxdWVsb2NrdG9rZW4gKi8KLSNkZWZpbmUgREFWX0VSUl9MT0NLX1NBVkVfTE9DSwkJNDA1CS8qIGVyciBzYXZpbmcgbG9ja3MgKi8KLQotLyoKLSoqIFNvbWUgY29tbWVudHMgb24gRXJyb3IgSUQgdmFsdWVzOgotKioKLSoqIFRoZSBudW1iZXJzIGRvIG5vdCBuZWNlc3NhcmlseSBuZWVkIHRvIGJlIHVuaXF1ZS4gVW5pcXVlbmVzcyBzaW1wbHkgbWVhbnMKLSoqIHRoYXQgdHdvIGVycm9ycyB0aGF0IGhhdmUgbm90IGJlZW4gcHJlZGVmaW5lZCBhYm92ZSBjYW4gYmUgZGlzdGluZ3Vpc2hlZAotKiogZnJvbSBlYWNoIG90aGVyLiBBdCB0aGUgbW9tZW50LCBtb2RfZGF2IGRvZXMgbm90IHVzZSB0aGlzIGRpc3Rpbmd1aXNoaW5nCi0qKiBmZWF0dXJlLCBidXQgaXQgY291bGQgYmUgdXNlZCBpbiB0aGUgZnV0dXJlIHRvIGNvbGxhcHNlIDxyZXNwb25zZT4gZWxlbWVudHMKLSoqIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBlcnJvciBJRCAoYW5kIGFzc29jaWF0ZWQgcmVzcG9uc2VkZXNjcmlwdGlvbikuCi0qKgotKiogSWYgYSBjb21wdXRlX2Rlc2MgaXMgcHJvdmlkZWQsIHRoZW4gdGhlIGVycm9yIElEIHNob3VsZCBiZSB1bmlxdWUgd2l0aGluCi0qKiB0aGUgY29udGV4dCBvZiB0aGUgY29tcHV0ZV9kZXNjIGZ1bmN0aW9uIChzbyB0aGUgZnVuY3Rpb24gY2FuIGZpZ3VyZSBvdXQKLSoqIHdoYXQgdG8gZmlsbGVkIGludG8gdGhlIGRlc2MpLgotKioKLSoqIEJhc2ljYWxseSwgc3Vic3lzdGVtcyBjYW4gaWdub3JlIGRlZmluaW5nIG5ldyBlcnJvciBJRCB2YWx1ZXMgaWYgdGhleSB3YW50Ci0qKiB0by4gVGhlIHN1YnN5c3RlbXMgKmRvKiBuZWVkIHRvIHJldHVybiB0aGUgcHJlZGVmaW5lZCBlcnJvcnMgd2hlbgotKiogYXBwcm9wcmlhdGUsIHNvIHRoYXQgbW9kX2RhdiBjYW4gZmlndXJlIG91dCB3aGF0IHRvIGRvLiBTdWJzeXN0ZW1zIGNhbgotKiogc2ltcGx5IGxlYXZlIHRoZSBlcnJvciBJRCBmaWVsZCB1bmZpbGxlZCAoemVybykgaWYgdGhlcmUgaXNuJ3QgYW4gZXJyb3IKLSoqIHRoYXQgbXVzdCBiZSBwbGFjZWQgdGhlcmUuCi0qLwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qKgotKiogSE9PSyBTVFJVQ1RVUkVTCi0qKgotKiogVGhlc2UgYXJlIGhlcmUgZm9yIGZvcndhcmQtZGVjbGFyYXRpb24gcHVycG9zZXMuIEZvciBtb3JlIGluZm8sIHNlZQotKiogdGhlIHNlY3Rpb24gdGl0bGUgIkhPT0sgSEFORExJTkciIGZvciBtb3JlIGluZm9ybWF0aW9uLCBwbHVzIGVhY2gKLSoqIHN0cnVjdHVyZSBkZWZpbml0aW9uLgotKi8KLQotLyogZm9yd2FyZC1kZWNsYXJlIHRoaXMgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCBkYXZfaG9va3NfZGIgZGF2X2hvb2tzX2RiOwotdHlwZWRlZiBzdHJ1Y3QgZGF2X2hvb2tzX2xvY2tzIGRhdl9ob29rc19sb2NrczsKLXR5cGVkZWYgc3RydWN0IGRhdl9ob29rc192c24gZGF2X2hvb2tzX3ZzbjsKLXR5cGVkZWYgc3RydWN0IGRhdl9ob29rc19yZXBvc2l0b3J5IGRhdl9ob29rc19yZXBvc2l0b3J5OwotdHlwZWRlZiBzdHJ1Y3QgZGF2X2hvb2tzX2xpdmVwcm9wIGRhdl9ob29rc19saXZlcHJvcDsKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKioKLSoqIFJFU09VUkNFIEhBTkRMSU5HCi0qLwotCi0vKgotKiogUmVzb3VyY2UgVHlwZXM6Ci0qKiBUaGUgYmFzZSBwcm90b2NvbCBkZWZpbmVzIG9ubHkgZmlsZSBhbmQgY29sbGVjdGlvbiByZXNvdXJjZXMuCi0qKiBUaGUgdmVyc2lvbmluZyBwcm90b2NvbCBkZWZpbmVzIHNldmVyYWwgYWRkaXRpb25hbCByZXNvdXJjZSB0eXBlcwotKiogdG8gcmVwcmVzZW50IGFydGlmYWN0cyBvZiBhIHZlcnNpb24gY29udHJvbCBzeXN0ZW0uCi0qLwotdHlwZWRlZiBlbnVtIHsKLSAgICBEQVZfUkVTT1VSQ0VfVFlQRV9SRUdVTEFSLCAgICAgIC8qIGZpbGUgb3IgY29sbGVjdGlvbiwgd29ya2luZyByZXNvdXJjZQotCQkJCSAgICAgICBvciByZXZpc2lvbiAqLwotICAgIERBVl9SRVNPVVJDRV9UWVBFX1JFVklTSU9OLCAgICAgLyogZXhwbGljaXQgcmV2aXNpb24taWQgKi8KLSAgICBEQVZfUkVTT1VSQ0VfVFlQRV9ISVNUT1JZLCAgICAgIC8qIGV4cGxpY2l0IGhpc3RvcnktaWQgKi8KLSAgICBEQVZfUkVTT1VSQ0VfVFlQRV9XT1JLU1BBQ0UsICAgIC8qIHdvcmtzcGFjZSAqLwotICAgIERBVl9SRVNPVVJDRV9UWVBFX0FDVElWSVRZLCAgICAgLyogYWN0aXZpdHkgKi8KLSAgICBEQVZfUkVTT1VSQ0VfVFlQRV9DT05GSUdVUkFUSU9OIC8qIGNvbmZpZ3VyYXRpb24gKi8KLX0gZGF2X3Jlc291cmNlX3R5cGU7Ci0KLS8qCi0qKiBPcGFxdWUsIHJlcG9zaXRvcnktc3BlY2lmaWMgaW5mb3JtYXRpb24gZm9yIGEgcmVzb3VyY2UuCi0qLwotdHlwZWRlZiBzdHJ1Y3QgZGF2X3Jlc291cmNlX3ByaXZhdGUgZGF2X3Jlc291cmNlX3ByaXZhdGU7Ci0KLS8qIFJlc291cmNlIGRlc2NyaXB0b3IsIGdlbmVyYXRlZCBieSBhIHJlcG9zaXRvcnkgcHJvdmlkZXIuCi0gKiBOb3RlOiB0aGUgbG9jay1udWxsIHN0YXRlIGlzIG5vdCBleHBsaWNpdGx5IHJlcHJlc2VudGVkIGhlcmUsCi0gKiBzaW5jZSBpdCBtYXkgYmUgZXhwZW5zaXZlIHRvIGNvbXB1dGUuIFVzZSBkYXZfZ2V0X3Jlc291cmNlX3N0YXRlKCkKLSAqIHRvIGRldGVybWluZSB3aGV0aGVyIGEgbm9uLWV4aXN0ZW50IHJlc291cmNlIGlzIGEgbG9jay1udWxsIHJlc291cmNlLgotICovCi10eXBlZGVmIHN0cnVjdCBkYXZfcmVzb3VyY2UgewotICAgIGRhdl9yZXNvdXJjZV90eXBlIHR5cGU7Ci0KLSAgICBpbnQgZXhpc3RzOwkJLyogMCA9PiBudWxsIHJlc291cmNlICovCi0gICAgaW50IGNvbGxlY3Rpb247CS8qIDAgPT4gZmlsZSAoaWYgdHlwZSA9PSBEQVZfUkVTT1VSQ0VfVFlQRV9SRUdVTEFSKSAqLwotICAgIGludCB2ZXJzaW9uZWQ7CS8qIDAgPT4gdW52ZXJzaW9uZWQgKi8KLSAgICBpbnQgd29ya2luZzsJLyogMCA9PiByZXZpc2lvbiAoaWYgdmVyc2lvbmVkKSAqLwotICAgIGludCBiYXNlbGluZWQ7CS8qIDAgPT4gbm90IGJhc2VsaW5lZCAqLwotCi0gICAgY29uc3QgY2hhciAqdXJpOwkvKiB0aGUgVVJJIGZvciB0aGlzIHJlc291cmNlICovCi0KLSAgICBkYXZfcmVzb3VyY2VfcHJpdmF0ZSAqaW5mbzsKLQotICAgIGNvbnN0IGRhdl9ob29rc19yZXBvc2l0b3J5ICpob29rczsJLyogaG9va3MgdXNlZCBmb3IgdGhpcyByZXNvdXJjZSAqLwotCi19IGRhdl9yZXNvdXJjZTsKLQotLyoKLSoqIExvY2sgdG9rZW4gdHlwZS4gTG9jayBwcm92aWRlcnMgZGVmaW5lIHRoZSBkZXRhaWxzIG9mIGEgbG9jayB0b2tlbi4KLSoqIEhvd2V2ZXIsIGFsbCBwcm92aWRlcnMgYXJlIGV4cGVjdGVkIHRvIGF0IGxlYXN0IGJlIGFibGUgdG8gcGFyc2UKLSoqIHRoZSAib3BhcXVlbG9ja3Rva2VuIiBzY2hlbWUsIHdoaWNoIGlzIHJlcHJlc2VudGVkIGJ5IGEgdXVpZF90LgotKi8KLXR5cGVkZWYgc3RydWN0IGRhdl9sb2NrdG9rZW4gZGF2X2xvY2t0b2tlbjsKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKioKLSoqIEJVRkZFUiBIQU5ETElORwotKioKLSoqIFRoZXNlIGJ1ZmZlcnMgYXJlIHVzZWQgYXMgYSBsaWdodHdlaWdodCBidWZmZXIgcmV1c2UgbWVjaGFuaXNtLiBBcGFjaGUKLSoqIHByb3ZpZGVzIHN1Yi1wb29sIGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiB0byBtdWNoIHRoZSBzYW1lIGVmZmVjdCwgYnV0Ci0qKiB0aGUgc3ViLXBvb2xzIGFyZSBhIGJpdCBtb3JlIGdlbmVyYWwgYW5kIGhlYXZ5d2VpZ2h0IHRoYW4gdGhlc2UgYnVmZmVycy4KLSovCi0KLS8qIGJ1ZmZlciBmb3IgcmV1c2U7IGNhbiBncm93IHRvIGFjY29tb2RhdGUgbmVlZGVkIHNpemUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgc2l6ZV90IGFsbG9jX2xlbjsJLyogaG93IG11Y2ggaGFzIGJlZW4gYWxsb2NhdGVkICovCi0gICAgc2l6ZV90IGN1cl9sZW47CS8qIGhvdyBtdWNoIGlzIGN1cnJlbnRseSBiZWluZyB1c2VkICovCi0gICAgY2hhciAqYnVmOwkJLyogYnVmZmVyIGNvbnRlbnRzICovCi19IGRhdl9idWZmZXI7Ci0jZGVmaW5lIERBVl9CVUZGRVJfTUlOU0laRQkyNTYJLyogbWluaW11bSBzaXplIGZvciBidWZmZXIgKi8KLSNkZWZpbmUgREFWX0JVRkZFUl9QQUQJCTY0CS8qIGFtb3VudCBvZiBwYWQgd2hlbiBncm93aW5nICovCi0KLS8qIHNldCB0aGUgY3VyX2xlbiB0byB0aGUgZ2l2ZW4gc2l6ZSBhbmQgZW5zdXJlIHNwYWNlIGlzIGF2YWlsYWJsZSAqLwotdm9pZCBkYXZfc2V0X2J1ZnNpemUocG9vbCAqcCwgZGF2X2J1ZmZlciAqcGJ1Ziwgc2l6ZV90IHNpemUpOwotCi0vKiBpbml0aWFsaXplIGEgYnVmZmVyIGFuZCBjb3B5IHRoZSBzcGVjaWZpZWQgKG51bGwtdGVybSdkKSBzdHJpbmcgaW50byBpdCAqLwotdm9pZCBkYXZfYnVmZmVyX2luaXQocG9vbCAqcCwgZGF2X2J1ZmZlciAqcGJ1ZiwgY29uc3QgY2hhciAqc3RyKTsKLQotLyogY2hlY2sgdGhhdCB0aGUgYnVmZmVyIGNhbiBhY2NvbW9kYXRlIDxleHRyYV9uZWVkZWQ+IG1vcmUgYnl0ZXMgKi8KLXZvaWQgZGF2X2NoZWNrX2J1ZnNpemUocG9vbCAqcCwgZGF2X2J1ZmZlciAqcGJ1Ziwgc2l6ZV90IGV4dHJhX25lZWRlZCk7Ci0KLS8qIGFwcGVuZCBhIHN0cmluZyB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIsIGFkanVzdCBsZW5ndGggKi8KLXZvaWQgZGF2X2J1ZmZlcl9hcHBlbmQocG9vbCAqcCwgZGF2X2J1ZmZlciAqcGJ1ZiwgY29uc3QgY2hhciAqc3RyKTsKLQotLyogcGxhY2UgYSBzdHJpbmcgb24gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLCBkbyBOT1QgYWRqdXN0IGxlbmd0aCAqLwotdm9pZCBkYXZfYnVmZmVyX3BsYWNlKHBvb2wgKnAsIGRhdl9idWZmZXIgKnBidWYsIGNvbnN0IGNoYXIgKnN0cik7Ci0KLS8qIHBsYWNlIHNvbWUgbWVtb3J5IG9uIHRoZSBlbmQgb2YgYSBidWZmZXI7IGRvIE5PVCBhZGp1c3QgbGVuZ3RoICovCi12b2lkIGRhdl9idWZmZXJfcGxhY2VfbWVtKHBvb2wgKnAsIGRhdl9idWZmZXIgKnBidWYsIGNvbnN0IHZvaWQgKm1lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFtdCwgc2l6ZV90IHBhZCk7Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoqCi0qKiBIQU5EWSBVVElMSVRJRVMKLSovCi0KLS8qIHNpbXBsZSBzdHJ1dHVyZXMgdG8ga2VlcCBhIGxpbmtlZCBsaXN0IG9mIHBpZWNlcyBvZiB0ZXh0ICovCi10eXBlZGVmIHN0cnVjdCBkYXZfdGV4dAotewotICAgIGNvbnN0IGNoYXIgKnRleHQ7Ci0gICAgc3RydWN0IGRhdl90ZXh0ICpuZXh0OwotfSBkYXZfdGV4dDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBkYXZfdGV4dCAqZmlyc3Q7Ci0gICAgZGF2X3RleHQgKmxhc3Q7Ci19IGRhdl90ZXh0X2hlYWRlcjsKLQotLyogY29udGFpbnMgcmVzdWx0cyBmcm9tIG9uZSBvZiB0aGUgZ2V0cHJvcCBmdW5jdGlvbnMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgZGF2X3RleHQgKiBwcm9wc3RhdHM7CS8qIDxwcm9wc3RhdD4gZWxlbWVudCB0ZXh0ICovCi0gICAgZGF2X3RleHQgKiB4bWxuczsJCS8qIG5hbWVzcGFjZSBkZWNscyBmb3IgPHJlc3BvbnNlPiBlbGVtICovCi19IGRhdl9nZXRfcHJvcHNfcmVzdWx0OwotCi0vKiBob2xkcyB0aGUgY29udGVudHMgb2YgYSA8cmVzcG9uc2U+IGVsZW1lbnQgKi8KLXR5cGVkZWYgc3RydWN0IGRhdl9yZXNwb25zZQotewotICAgIGNvbnN0IGNoYXIgKmhyZWY7CQkvKiBhbHdheXMgKi8KLSAgICBjb25zdCBjaGFyICpkZXNjOwkJLyogb3B0aW9uYWwgZGVzY3JpcHRpb24gYXQgPHJlc3BvbnNlPiBsZXZlbCAqLwotCi0gICAgLyogdXNlIHN0YXR1cyBpZiBwcm9wcmVzdWx0LnByb3BzdGF0cyBpcyBOVUxMLiAqLwotICAgIGRhdl9nZXRfcHJvcHNfcmVzdWx0IHByb3ByZXN1bHQ7Ci0KLSAgICBpbnQgc3RhdHVzOwotCi0gICAgc3RydWN0IGRhdl9yZXNwb25zZSAqbmV4dDsKLX0gZGF2X3Jlc3BvbnNlOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHJlcXVlc3RfcmVjICpybmV3OwkJLyogbmV3IHN1YnJlcXVlc3QgKi8KLSAgICBkYXZfZXJyb3IgZXJyOwkJLyogcG90ZW50aWFsIGVycm9yIHJlc3BvbnNlICovCi19IGRhdl9sb29rdXBfcmVzdWx0OwotCi0KLXZvaWQgZGF2X3RleHRfYXBwZW5kKHBvb2wgKnAsIGRhdl90ZXh0X2hlYWRlciAqaGRyLCBjb25zdCBjaGFyICp0ZXh0KTsKLQotZGF2X2xvb2t1cF9yZXN1bHQgZGF2X2xvb2t1cF91cmkoY29uc3QgY2hhciAqdXJpLCByZXF1ZXN0X3JlYyAqcik7Ci0KLS8qIGZvcm1hdCBhIHRpbWUgc3RyaW5nIChidWYgbXVzdCBiZSBhdCBsZWFzdCBEQVZfVElNRUJVRl9TSVpFIGNoYXJzKSAqLwotI2RlZmluZSBEQVZfU1RZTEVfSVNPODYwMQkxCi0jZGVmaW5lIERBVl9TVFlMRV9SRkM4MjIJMgotI2RlZmluZSBEQVZfVElNRUJVRl9TSVpFCTMwCi0KLWludCBkYXZfZ2V0X2RlcHRoKHJlcXVlc3RfcmVjICpyLCBpbnQgZGVmX2RlcHRoKTsKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKioKLSoqIERZTkFNSUMgRVhURU5TSU9OUwotKi8KLQotLyogIyMjIGRvY2NvIGdvZXMgaGVyZS4uLiAqLwotCi0KLS8qCi0qKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgcnVudGltZSwgcGVyLWRpcmVjdG9yeS9sb2NhdGlvbgotKiogb3BlcmF0aW5nIGNvbnRleHQgZm9yIGEgc2luZ2xlIHByb3ZpZGVyLgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgaW50IGlkOwkJLyogcHJvdmlkZXIgSUQgKi8KLQotICAgIHZvaWQgKm1fY29udGV4dDsJLyogbW9kdWxlLWxldmVsIGNvbnRleHQgKGkuZS4gbWFuYWdlZCBnbG9iYWxzKSAqLwotCi0gICAgdm9pZCAqZF9jb250ZXh0OwkvKiBwZXItZGlyZWN0b3J5IGNvbnRleHQgKi8KLSAgICB0YWJsZSAqZF9wYXJhbXM7CS8qIHBlci1kaXJlY3RvcnkgREFWIGNvbmZpZyBwYXJhbWV0ZXJzICovCi0KLSAgICBpbnQgKm5zX21hcDsJLyogZm9yIExJVkVQUk9QLCBtYXAgcHJvdmlkZXIgVVJJIHRvIGdsb2JhbCBVUkkgKi8KLQotfSBkYXZfZHluX2NvbnRleHQ7Ci0KLS8qCi0qKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHNwZWNpZnkgYSBzZXQgb2YgaG9va3MgYW5kIGl0cyBhc3NvY2lhdGVkCi0qKiBjb250ZXh0LCBvbiBhIHBlci1kaXJlY3RvcnkvbG9jYXRpb24gYmFzaXMuCi0qKgotKiogTm90ZTogdGhlIGNvbnRleHQgaXMgYXNzZW1ibGVkIGZyb20gdmFyaW91cyBzb3VyY2VzLiBkYXZfZHluX2hvb2tzCi0qKiBzdHJ1Y3R1cmVzIHdpbGwgdHlwaWNhbGx5IGhhdmUgdGhlIHNhbWUgcG9pbnRlciB2YWx1ZXMgd2l0aGluIHRoZQotKiogY29udGV4dCAoZS5nLiBjdHgubV9jb250ZXh0IGlzIHNoYXJlZCBhY3Jvc3MgYWxsIHByb3ZpZGVycyBpbiBhIG1vZHVsZSkuCi0qLwotdHlwZWRlZiBzdHJ1Y3QgZGF2X2R5bl9ob29rcwotewotICAgIGRhdl9keW5fY29udGV4dCBjdHg7CS8qIGNvbnRleHQgZm9yIHRoaXMgc2V0IG9mIGhvb2tzICovCi0gICAgY29uc3Qgdm9pZCAqaG9va3M7CQkvKiB0aGUgdHlwZS1zcGVjaWZpYyBob29rcyAqLwotCi0gICAgc3RydWN0IGRhdl9keW5faG9va3MgKm5leHQ7CS8qIG5leHQgc2V0IG9mIGhvb2tzLCBpZiBhcHBsaWNhYmxlICovCi0KLX0gZGF2X2R5bl9ob29rczsKLQotLyoKLSoqIFRoZXNlIGVudW1lcmF0ZWQgdmFsdWVzIGRlZmluZSB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGZ1bmN0aW9uYWxpdHkgdGhhdAotKiogYSBwcm92aWRlciBjYW4gaW1wbGVtZW50LgotKi8KLWVudW0KLXsKLSAgICBEQVZfRFlOX1RZUEVfU0VOVElORUwsCi0KLSAgICBEQVZfRFlOX1RZUEVfUFJPUERCLAkvKiBwcm9wZXJ0eSBkYXRhYmFzZSAoMSBwZXIgZGlyKSAqLwotICAgIERBVl9EWU5fVFlQRV9MT0NLUywJCS8qIGxvY2sgaGFuZGxpbmcgKDEgcGVyIGRpcikgKi8KLSAgICBEQVZfRFlOX1RZUEVfUVVFUllfR1JBTU1BUiwJLyogREFTTCBzZWFyY2ggZ3JhbW1hciAoTiBwZXIgZGlyKSAqLwotICAgIERBVl9EWU5fVFlQRV9BQ0wsCQkvKiBBQ0wgaGFuZGxpbmcgKDEgcGVyIGRpcikgKi8KLSAgICBEQVZfRFlOX1RZUEVfVlNOLAkJLyogdmVyc2lvbmluZyAoMSBwZXIgZGlyKSAqLwotICAgIERBVl9EWU5fVFlQRV9SRVBPU0lUT1JZLAkvKiByZXNvdXJjZSByZXBvc2l0b3J5ICgxIHBlciBkaXIpICovCi0gICAgREFWX0RZTl9UWVBFX0xJVkVQUk9QLAkvKiBsaXZlIHByb3BlcnR5IGhhbmRsZXIgKE4gcGVyIGRpcikgKi8KLQotICAgIERBVl9EWU5fVFlQRV9NQVgKLX07Ci0KLS8qCi0qKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGEgcHJvdmlkZXIgZm9yIGEgcGFydGljdWxhciB0eXBlIG9mIGZ1bmN0aW9uYWxpdHkuCi0qKgotKiogVGhlIElEIGlzIHByaXZhdGUgdG8gYSBwcm92aWRlciBhbmQgY2FuIGJlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuCi0qKiBkaWZmZXJlbnQgc3ViY2xhc3NlcyBvZiBmdW5jdGlvbmFsaXR5IHdoaWNoIGFyZSBpbXBsZW1lbnRlZCB1c2luZyB0aGUKLSoqIHNhbWUgc2V0IG9mIGhvb2tzLiBGb3IgZXhhbXBsZSwgYSBob29rIGZ1bmN0aW9uIGNvdWxkIHBlcmZvcm0gdHdvIGVudGlyZWx5Ci0qKiBkaWZmZXJlbnQgb3BlcmF0aW9ucyBiYXNlZCBvbiB0aGUgSUQgd2hpY2ggaXMgcGFzc2VkLgotKioKLSoqIGlzX2FjdGl2ZSgpIGlzIHVzZWQgYnkgdGhlIHN5c3RlbSB0byBkZXRlcm1pbmUgd2hldGhlciBhIHBhcnRpY3VsYXIKLSoqIHByb3ZpZGVyIGlzICJhY3RpdmUiIGZvciB0aGUgZ2l2ZW4gY29udGV4dC4gSXQgaXMgcG9zc2libGUgdGhhdCBhIHByb3ZpZGVyCi0qKiBpcyBjb25maWd1cmVkIGZvciBhIGRpcmVjdG9yeSwgYnV0IGhhcyBub3QgYmVlbiBlbmFibGVkIC0tIHRoZSBpc19hY3RpdmUoKQotKiogZnVuY3Rpb24gaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhhdCBpbmZvcm1hdGlvbi4KLSoqCi0qKiAjIyMgaXNfYWN0aXZlIGlzIG5vdCB1c2VkIHJpZ2h0IG5vdwotKioKLSoqIE5vdGU6IGRhdl9keW5fcHJvdmlkZXIgc3RydWN0dXJlcyBhcmUgYWx3YXlzIHRyZWF0ZWQgYXMgImNvbnN0IiBieSBtb2RfZGF2LgotKi8KLXR5cGVkZWYgc3RydWN0IGRhdl9keW5fcHJvdmlkZXIKLXsKLSAgICBpbnQgaWQ7CQkJLyogcHJvdmlkZXIgSUQgKi8KLQotICAgIGludCB0eXBlOwkJCS8qIHByb3ZpZGVyJ3MgZnVuY3Rpb25hbGl0eSB0eXBlICovCi0gICAgY29uc3Qgdm9pZCAqaG9va3M7CQkvKiBwb2ludGVyIHRvIHR5cGUtc3BlY2lmaWMgaG9va3MgKi8KLQotICAgIGludCAoKmlzX2FjdGl2ZSkoZGF2X2R5bl9jb250ZXh0ICpjdHgsIGludCBpZCk7Ci0KLX0gZGF2X2R5bl9wcm92aWRlcjsKLQotI2RlZmluZSBEQVZfRFlOX0VORF9NQVJLRVIJeyAwLCBEQVZfRFlOX1RZUEVfU0VOVElORUwsIE5VTEwsIE5VTEwgfQotCi0vKgotKiogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhIG1vZHVsZSAoYSBzZXQgb2YgcHJvdmlkZXJzKS4KLSoqCi0qKiBUaGUgZnJpZW5kbHkgbmFtZSBzaG91bGQgYmUgYSBzaW5nbGUgd29yZC4gSXQgaXMgdXNlZCB3aXRoIHRoZSAiREFWIgotKiogZGlyZWN0aXZlIHRvIHNwZWNpZnkgdGhlIG1vZHVsZSB0byB1c2UgZm9yIGEgcGFydGljdWxhciBkaXJlY3RvcnkvbG9jYXRpb24uCi0qKgotKiogVGhlIG1vZHVsZV9vcGVuL2Nsb3NlIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBpbml0aWFsaXplIHBlci1tb2R1bGUgImdsb2JhbCIKLSoqIGRhdGEuIFRoZSBmdW5jdGlvbnMgYXJlIGV4cGVjdGVkIHRvIHVwZGF0ZSBjdHgtPm1fY29udGV4dC4KLSoqCi0qKiAjIyMgbW9kdWxlX29wZW4vY2xvc2UgYXJlIG5vdCB1c2VkIGF0IHRoZSBtb21lbnQKLSoqICMjIyBkaXJfKiBhcmUgbm90IHdlbGwtZGVmaW5lZCwgbm9yIGFyZSB0aGV5IHVzZWQKLSoqCi0qKiBOb3RlOiBUaGUgREFWX0RZTl9WRVJTSU9OIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUgZGF2X2R5bl9tb2R1bGUKLSoqICAgICAgIHN0cnVjdHVyZSBpdHNlbGYuIEl0IHdpbGwgYmUgdXBkYXRlZCBpZiBjaGFuZ2VzIGluIHRoZSBzdHJ1Y3R1cmUKLSoqICAgICAgIGFyZSBtYWRlLiBUaGVyZSBhcmUgbm8gcHJvdmlzaW9ucyBmb3IgZm9yd2FyZCBvciBiYWNrd2FyZAotKiogICAgICAgY29tcGF0aWJsZSBjaGFuZ2VzLgotKioKLSoqIE5vdGU6IGRhdl9keW5fbW9kdWxlIHN0cnVjdHVyZXMgYXJlIGFsd2F5cyB0cmVhdGVkIGFzICJjb25zdCIgYnkgbW9kX2Rhdi4KLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIGludCBtYWdpYzsKLSNkZWZpbmUgREFWX0RZTl9NQUdJQwkJMHg0NDQxNTYyMQkvKiAiREFWISIgKi8KLQotICAgIGludCB2ZXJzaW9uOwotI2RlZmluZSBEQVZfRFlOX1ZFUlNJT04JCTEJCS8qIG11c3QgbWF0Y2ggZXhhY3RseSAqLwotCi0gICAgY29uc3QgY2hhciAqbmFtZTsJCQkJLyogZnJpZW5kbHkgbmFtZSAqLwotCi0gICAgaW50ICgqbW9kdWxlX29wZW4pKGRhdl9keW5fY29udGV4dCAqY3R4KTsKLSAgICBpbnQgKCptb2R1bGVfY2xvc2UpKGRhdl9keW5fY29udGV4dCAqY3R4KTsKLQotICAgIGludCAoKmRpcl9vcGVuKShkYXZfZHluX2NvbnRleHQgKmN0eCk7Ci0gICAgaW50ICgqZGlyX3BhcmFtKShkYXZfZHluX2NvbnRleHQgKmN0eCwgY29uc3QgY2hhciAqcGFyYW1fbmFtZSwKLQkJICAgICBjb25zdCBjaGFyICpwYXJhbV92YWx1ZSk7Ci0gICAgaW50ICgqZGlyX21lcmdlKShkYXZfZHluX2NvbnRleHQgKmJhc2UsIGRhdl9keW5fY29udGV4dCAqb3ZlcnJpZGVzLAotCQkgICAgIGRhdl9keW5fY29udGV4dCAqcmVzdWx0KTsKLSAgICBpbnQgKCpkaXJfY2xvc2UpKGRhdl9keW5fY29udGV4dCAqY3R4KTsKLQotICAgIGNvbnN0IGRhdl9keW5fcHJvdmlkZXIgKnByb3ZpZGVyczsJCS8qIHByb3ZpZGVycyBpbiB0aGlzIG1vZHVsZSAqLwotCi19IGRhdl9keW5fbW9kdWxlOwotCi1pbnQgZGF2X2xvYWRfbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKm1vZHVsZV9zeW0sCi0JCSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSk7Ci1jb25zdCBkYXZfZHluX21vZHVsZSAqZGF2X2ZpbmRfbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpOwotCi0vKgotKiogVmFyaW91cyBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4KLSoqCi0qKiBOT1RFOiB0aGUgcG9vbCBzaG91bGQgYmUgdGhlICJjb25maWd1cmF0aW9uIHBvb2wiCi0qLwotdm9pZCBkYXZfcHJvY2Vzc19idWlsdGluX21vZHVsZXMocG9vbCAqcCk7Ci12b2lkIGRhdl9wcm9jZXNzX21vZHVsZShwb29sICpwLCBjb25zdCBkYXZfZHluX21vZHVsZSAqbW9kKTsKLQotaW50ICogZGF2X2NvbGxlY3RfbGl2ZXByb3BfdXJpcyhwb29sICpwLCBjb25zdCBkYXZfaG9va3NfbGl2ZXByb3AgKmhvb2tzKTsKLWV4dGVybiBhcnJheV9oZWFkZXIgKmRhdl9saXZlcHJvcF91cmlzOwotCi12b2lkICpkYXZfcHJlcGFyZV9zY2FuKHBvb2wgKnAsIGNvbnN0IGRhdl9keW5fbW9kdWxlICptb2QpOwotaW50IGRhdl9zY2FuX3Byb3ZpZGVycyh2b2lkICpjdHgsCi0JCSAgICAgICBjb25zdCBkYXZfZHluX3Byb3ZpZGVyICoqcHJvdmlkZXIsCi0JCSAgICAgICBkYXZfZHluX2hvb2tzICpvdXRwdXQpOwotCi0vKiBoYW5keSBtYWNyb3MgdG8gYXNzaXN0IHdpdGggZGF2X2R5bl9ob29rcy5ob29rcyB1c2FnZSAqLwotI2RlZmluZSBEQVZfQVNfSE9PS1NfUFJPUERCKHBoKQkJKChjb25zdCBkYXZfaG9va3NfZGIgKikoKHBoKS0+aG9va3MpKQotI2RlZmluZSBEQVZfQVNfSE9PS1NfTE9DS1MocGgpCQkoKGNvbnN0IGRhdl9ob29rc19sb2NrcyAqKSgocGgpLT5ob29rcykpCi0jZGVmaW5lIERBVl9BU19IT09LU19RVUVSWV9HUkFNTUFSKHBoKQkoKHZvaWQgKikoKHBoKS0+aG9va3MpKQotI2RlZmluZSBEQVZfQVNfSE9PS1NfQUNMKHBoKQkJKCh2b2lkICopKChwaCktPmhvb2tzKSkKLSNkZWZpbmUgREFWX0FTX0hPT0tTX1ZTTihwaCkJCSgoY29uc3QgZGF2X2hvb2tzX3ZzbiAqKSgocGgpLT5ob29rcykpCi0jZGVmaW5lIERBVl9BU19IT09LU19SRVBPU0lUT1JZKHBoKQkoKGNvbnN0IGRhdl9ob29rc19yZXBvc2l0b3J5ICopKChwaCktPmhvb2tzKSkKLSNkZWZpbmUgREFWX0FTX0hPT0tTX0xJVkVQUk9QKHBoKQkoKGNvbnN0IGRhdl9ob29rc19saXZlcHJvcCAqKSgocGgpLT5ob29rcykpCi0KLS8qIGdldCBwcm92aWRlciBob29rcywgZ2l2ZW4gYSByZXF1ZXN0IHJlY29yZCAqLwotY29uc3QgZGF2X2R5bl9ob29rcyAqZGF2X2dldF9wcm92aWRlcl9ob29rcyhyZXF1ZXN0X3JlYyAqciwgaW50IHByb3ZpZGVyX3R5cGUpOwotCi0jZGVmaW5lIERBVl9HRVRfSE9PS1NfUFJPUERCKHIpICAgICAgICAgREFWX0FTX0hPT0tTX1BST1BEQihkYXZfZ2V0X3Byb3ZpZGVyX2hvb2tzKHIsIERBVl9EWU5fVFlQRV9QUk9QREIpKQotI2RlZmluZSBEQVZfR0VUX0hPT0tTX0xPQ0tTKHIpICAgICAgICAgIERBVl9BU19IT09LU19MT0NLUyhkYXZfZ2V0X3Byb3ZpZGVyX2hvb2tzKHIsIERBVl9EWU5fVFlQRV9MT0NLUykpCi0jZGVmaW5lIERBVl9HRVRfSE9PS1NfUVVFUllfR1JBTU1BUihyKSAgREFWX0FTX0hPT0tTX1FVRVJZX0dSQU1NQVIoZGF2X2dldF9wcm92aWRlcl9ob29rcyhyLCBEQVZfRFlOX1RZUEVfUVVFUllfR1JBTU1BUikpCi0jZGVmaW5lIERBVl9HRVRfSE9PS1NfQUNMKHIpICAgICAgICAgICAgREFWX0FTX0hPT0tTX0FDTChkYXZfZ2V0X3Byb3ZpZGVyX2hvb2tzKHIsIERBVl9EWU5fVFlQRV9BQ0wpKQotI2RlZmluZSBEQVZfR0VUX0hPT0tTX1ZTTihyKSAgICAgICAgICAgIERBVl9BU19IT09LU19WU04oZGF2X2dldF9wcm92aWRlcl9ob29rcyhyLCBEQVZfRFlOX1RZUEVfVlNOKSkKLSNkZWZpbmUgREFWX0dFVF9IT09LU19SRVBPU0lUT1JZKHIpICAgICBEQVZfQVNfSE9PS1NfUkVQT1NJVE9SWShkYXZfZ2V0X3Byb3ZpZGVyX2hvb2tzKHIsIERBVl9EWU5fVFlQRV9SRVBPU0lUT1JZKSkKLSNkZWZpbmUgREFWX0dFVF9IT09LU19MSVZFUFJPUChyKSAgICAgICBEQVZfQVNfSE9PS1NfTElWRVBST1AoZGF2X2dldF9wcm92aWRlcl9ob29rcyhyLCBEQVZfRFlOX1RZUEVfTElWRVBST1ApKQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qKgotKiogSUYgSEVBREVSIFBST0NFU1NJTkcKLSoqCi0qKiBIZXJlIGlzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBJZjogaGVhZGVyIGZyb20gUkZDIDI1MTgsIFM5LjQ6Ci0qKgotKiogICAgSWYgPSAiSWYiICI6IiAoMSpOby10YWctbGlzdCB8IDEqVGFnZ2VkLWxpc3QpCi0qKiAgICBOby10YWctbGlzdCA9IExpc3QKLSoqICAgIFRhZ2dlZC1saXN0ID0gUmVzb3VyY2UgMSpMaXN0Ci0qKiAgICBSZXNvdXJjZSA9IENvZGVkLVVSTAotKiogICAgTGlzdCA9ICIoIiAxKihbIk5vdCJdKFN0YXRlLXRva2VuIHwgIlsiIGVudGl0eS10YWcgIl0iKSkgIikiCi0qKiAgICBTdGF0ZS10b2tlbiA9IENvZGVkLVVSTAotKiogICAgQ29kZWQtVVJMID0gIjwiIGFic29sdXRlVVJJICI+IiAgICAgICAgOyBhYnNvbHV0ZVVSSSBmcm9tIFJGQyAyNjE2Ci0qKgotKiogTGlzdCBjb3JyZXNwb25kcyB0byBkYXZfaWZfc3RhdGVfbGlzdC4gTm8tdGFnLWxpc3QgY29ycmVzcG9uZHMgdG8KLSoqIGRhdl9pZl9oZWFkZXIgd2l0aCB1cmk9PU5VTEwuIFRhZ2dlZC1saXN0IGNvcnJlc3BvbmRzIHRvIGEgc2VxdWVuY2Ugb2YKLSoqIGRhdl9pZl9oZWFkZXIgc3RydWN0dXJlcyB3aXRoIChkdXBsaWNhdGUpIHVyaT09UmVzb3VyY2UgLS0gb25lCi0qKiBkYXZfaWZfaGVhZGVyIHBlciBzdGF0ZV9saXN0LiBBIHNlY29uZCBUYWdnZWQtbGlzdCB3aWxsIHN0YXJ0IGEgbmV3Ci0qKiBzZXF1ZW5jZSBvZiBkYXZfaWZfaGVhZGVyIHN0cnVjdHVyZXMgd2l0aCB0aGUgbmV3IFVSSS4KLSoqCi0qKiBBIHN1bW1hcnkgb2YgdGhlIHNlbWFudGljcywgbWFwcGVkIGludG8gb3VyIHN0cnVjdHVyZXM6Ci0qKiAgICAtIENoYWluZWQgZGF2X2lmX2hlYWRlcnM6IE9SCi0qKiAgICAtIENoYWluZWQgZGF2X2lmX3N0YXRlX2xpc3RzOiBBTkQKLSoqICAgIC0gTlVMTCB1cmkgbWF0Y2hlcyBhbGwgcmVzb3VyY2VzCi0qLwotCi10eXBlZGVmIGVudW0KLXsKLSAgICBkYXZfaWZfZXRhZywKLSAgICBkYXZfaWZfb3BhcXVlbG9jawotfSBkYXZfaWZfc3RhdGVfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgZGF2X2lmX3N0YXRlX2xpc3QKLXsKLSAgICBkYXZfaWZfc3RhdGVfdHlwZSB0eXBlOwotCi0gICAgaW50IGNvbmRpdGlvbjsKLSNkZWZpbmUgREFWX0lGX0NPTkRfTk9STUFMCTAKLSNkZWZpbmUgREFWX0lGX0NPTkRfTk9UCQkxCS8qICJOb3QiIHdhcyBhcHBsaWVkICovCi0KLSAgICBjb25zdCBjaGFyICpldGFnOwkvKiBldGFnICovCi0gICAgZGF2X2xvY2t0b2tlbiAqbG9ja3Rva2VuOyAgIC8qIGxvY2t0b2tlbiAqLwotCi0gICAgc3RydWN0IGRhdl9pZl9zdGF0ZV9saXN0ICpuZXh0OwotfSBkYXZfaWZfc3RhdGVfbGlzdDsKLQotdHlwZWRlZiBzdHJ1Y3QgZGF2X2lmX2hlYWRlcgotewotICAgIGNvbnN0IGNoYXIgKnVyaTsKLSAgICBzaXplX3QgdXJpX2xlbjsKLSAgICBzdHJ1Y3QgZGF2X2lmX3N0YXRlX2xpc3QgKnN0YXRlOwotICAgIHN0cnVjdCBkYXZfaWZfaGVhZGVyICpuZXh0OwotCi0gICAgaW50IGR1bW15X2hlYWRlcjsJLyogdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBsb2NrL2V0YWcgdmFsaWRhdGlvbiAqLwotfSBkYXZfaWZfaGVhZGVyOwotCi10eXBlZGVmIHN0cnVjdCBkYXZfbG9ja3Rva2VuX2xpc3QgCi17Ci0gICAgZGF2X2xvY2t0b2tlbiAqbG9ja3Rva2VuOwotICAgIHN0cnVjdCBkYXZfbG9ja3Rva2VuX2xpc3QgKm5leHQ7Ci19IGRhdl9sb2NrdG9rZW5fbGlzdDsKLQotZGF2X2Vycm9yICogZGF2X2dldF9sb2NrdG9rZW5fbGlzdChyZXF1ZXN0X3JlYyAqciwgZGF2X2xvY2t0b2tlbl9saXN0ICoqbHRsKTsKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKioKLSoqIFhNTCBQQVJTSU5HCi0qLwotCi0vKgotKiogUXVhbGlmaWVkIG5hbWVzcGFjZSB2YWx1ZXMKLSoqCi0qKiBEQVZfTlNfREFWX0lECi0qKiAgICBXZSBhbHdheXMgaW5zZXJ0IHRoZSAiREFWOiIgbmFtZXNwYWNlIFVSSSBhdCB0aGUgaGVhZCBvZiB0aGUKLSoqICAgIG5hbWVzcGFjZSBhcnJheS4gVGhpcyBtZWFucyB0aGF0IGl0IHdpbGwgYWx3YXlzIGJlIGF0IElEPT0wLAotKiogICAgbWFraW5nIGl0IG11Y2ggZWFzaWVyIHRvIHRlc3QgZm9yLgotKioKLSoqIERBVl9OU19OT05FCi0qKiAgICBUaGlzIHNwZWNpYWwgSUQgaXMgdXNlZCBmb3IgdHdvIHNpdHVhdGlvbnM6Ci0qKgotKiogICAgMSkgVGhlIG5hbWVzcGFjZSBwcmVmaXggYmVnaW5zIHdpdGggInhtbCIgKGFuZCB3ZSBkbyBub3Qga25vdwotKiogICAgICAgd2hhdCBpdCBtZWFucykuIE5hbWVzcGFjZSBwcmVmaXhlcyB3aXRoICJ4bWwiIChhbnkgY2FzZSkgYXMKLSoqICAgICAgIHRoZWlyIGZpcnN0IHRocmVlIGNoYXJhY3RlcnMgYXJlIHJlc2VydmVkIGJ5IHRoZSBYTUwgTmFtZXNwYWNlcwotKiogICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZnV0dXJlIHVzZS4gbW9kX2RhdiB3aWxsIHBhc3MgdGhlc2UgdGhyb3VnaAotKiogICAgICAgdW5jaGFuZ2VkLiBXaGVuIHRoaXMgaWRlbnRpZmllciBpcyB1c2VkLCB0aGUgcHJlZml4IGlzIExFRlQgaW4KLSoqICAgICAgIHRoZSBlbGVtZW50L2F0dHJpYnV0ZSBuYW1lLiBEb3duc3RyZWFtIHByb2Nlc3Npbmcgc2hvdWxkIG5vdAotKiogICAgICAgcHJlcGVuZCBhbm90aGVyIHByZWZpeC4KLSoqCi0qKiAgICAyKSBUaGUgZWxlbWVudC9hdHRyaWJ1dGUgZG9lcyBub3QgaGF2ZSBhIG5hbWVzcGFjZS4KLSoqCi0qKiAgICAgICBhKSBObyBwcmVmaXggd2FzIHVzZWQsIGFuZCBhIGRlZmF1bHQgbmFtZXNwYWNlIGhhcyBub3QgYmVlbgotKiogICAgICAgICAgZGVmaW5lZC4KLSoqICAgICAgIGIpIE5vIHByZWZpeCB3YXMgdXNlZCwgYW5kIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSB3YXMgc3BlY2lmaWVkCi0qKiAgICAgICAgICB0byBtZWFuICJubyBuYW1lc3BhY2UiLiBUaGlzIGlzIGRvbmUgd2l0aCBhIG5hbWVzcGFjZQotKiogICAgICAgICAgZGVjbGFyYXRpb24gb2Y6ICB4bWxucz0iIgotKiogICAgICAgICAgKHRoaXMgZGVjbGFyYXRpb24gaXMgdHlwaWNhbGx5IHVzZWQgdG8gb3ZlcnJpZGUgYSBwcmV2aW91cwotKiogICAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGRlZmF1bHQgbmFtZXNwYWNlKQotKioKLSoqICAgICAgIEluIHRoZXNlIGNhc2VzLCB3ZSBuZWVkIHRvIHJlY29yZCB0aGF0IHRoZSBlbGVtL2F0dHIgaGFzIG5vCi0qKiAgICAgICBuYW1lc3BhY2Ugc28gdGhhdCB3ZSB3aWxsIG5vdCBhdHRlbXB0IHRvIHByZXBlbmQgYSBwcmVmaXguCi0qKiAgICAgICBBbGwgbmFtZXNwYWNlcyB0aGF0IGFyZSB1c2VkIHdpbGwgaGF2ZSBhIHByZWZpeCBhc3NpZ25lZCB0bwotKiogICAgICAgdGhlbSAtLSBtb2RfZGF2IHdpbGwgbmV2ZXIgc2V0IG9yIHVzZSB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSoqICAgICAgIHdoZW4gZ2VuZXJhdGluZyBYTUwuIFRoaXMgbWVhbnMgdGhhdCAibm8gcHJlZml4IiB3aWxsIGFsd2F5cwotKiogICAgICAgbWVhbiAibm8gbmFtZXNwYWNlIi4KLSoqCi0qKiAgICBJbiBib3RoIGNhc2VzLCB0aGUgWE1MIGdlbmVyYXRpb24gd2lsbCBhdm9pZCBwcmVwZW5kaW5nIGEgcHJlZml4LgotKiogICAgRm9yIHRoZSBmaXJzdCBjYXNlLCB0aGlzIG1lYW5zIHRoZSBvcmlnaW5hbCBwcmVmaXgvbmFtZSB3aWxsIGJlCi0qKiAgICBpbnNlcnRlZCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtLiBGb3IgdGhlIGxhdHRlciBjYXNlLCBpdCBtZWFucwotKiogICAgdGhlIG5hbWUgd2lsbCBoYXZlIG5vIHByZWZpeCwgYW5kIHNpbmNlIHdlIG5ldmVyIGRlZmluZSBhIGRlZmF1bHQKLSoqICAgIG5hbWVzcGFjZSwgdGhpcyBtZWFucyBpdCB3aWxsIGhhdmUgbm8gbmFtZXNwYWNlLgotKioKLSoqIE5vdGU6IGN1cnJlbnRseSwgbW9kX2RhdiB1bmRlcnN0YW5kcyB0aGUgInhtbG5zIiBwcmVmaXggYW5kIHRoZQotKiogICAgICJ4bWw6bGFuZyIgYXR0cmlidXRlLiBUaGVzZSBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgKHRoZXkgYXJlbid0Ci0qKiAgICAgbGVmdCB3aXRoaW4gdGhlIFhNTCB0cmVlKSwgc28gdGhlIERBVl9OU19OT05FIHZhbHVlIHdvbid0IGV2ZXIKLSoqICAgICByZWFsbHkgYXBwbHkgdG8gdGhlc2UgdmFsdWVzLgotKi8KLSNkZWZpbmUgREFWX05TX0RBVl9JRAkJMAkvKiBuYW1lc3BhY2UgSUQgZm9yICJEQVY6IiAqLwotI2RlZmluZSBEQVZfTlNfTk9ORQkJLTEwCS8qIG5vIG5hbWVzcGFjZSBmb3IgdGhpcyBlbGVtL2F0dHIgKi8KLQotI2RlZmluZSBEQVZfTlNfRVJST1JfQkFTRQktMTAwCS8qIHVzZWQgb25seSBkdXJpbmcgcHJvY2Vzc2luZyAqLwotI2RlZmluZSBEQVZfTlNfSVNfRVJST1IoZSkJKChlKSA8PSBEQVZfTlNfRVJST1JfQkFTRSkKLQotCi0vKgotKiogZGF2X3htbF9kb2M6IGhvbGRzIGEgcGFyc2VkIFhNTCBkb2N1bWVudAotKiogZGF2X3htbF9lbGVtOiBob2xkcyBhIHBhcnNlZCBYTUwgZWxlbWVudAotKiogZGF2X3htbF9hdHRyOiBob2xkcyBhIHBhcnNlZCBYTUwgYXR0cmlidXRlCi0qKgotKiogZGF2X3htbF9uc19zY29wZTogaW50ZXJuYWwgc3RydWN0IHVzZWQgZHVyaW5nIHByb2Nlc3NpbmcgdG8gc2NvcGUKLSoqICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMKLSovCi0KLXR5cGVkZWYgc3RydWN0IGRhdl94bWxfYXR0cgotewotICAgIGNvbnN0IGNoYXIgKm5hbWU7CQkJLyogYXR0cmlidXRlIG5hbWUgKi8KLSAgICBpbnQgbnM7CQkJCS8qIGluZGV4IGludG8gbmFtZXNwYWNlIGFycmF5ICovCi0KLSAgICBjb25zdCBjaGFyICp2YWx1ZTsJCQkvKiBhdHRyaWJ1dGUgdmFsdWUgKi8KLQotICAgIHN0cnVjdCBkYXZfeG1sX2F0dHIgKm5leHQ7CQkvKiBuZXh0IGF0dHJpYnV0ZSAqLwotfSBkYXZfeG1sX2F0dHI7Ci0KLXR5cGVkZWYgc3RydWN0IGRhdl94bWxfZWxlbQotewotICAgIGNvbnN0IGNoYXIgKm5hbWU7CQkJLyogZWxlbWVudCBuYW1lICovCi0gICAgaW50IG5zOwkJCQkvKiBpbmRleCBpbnRvIG5hbWVzcGFjZSBhcnJheSAqLwotICAgIGNvbnN0IGNoYXIgKmxhbmc7CQkJLyogeG1sOmxhbmcgZm9yIGF0dHJzL2NvbnRlbnRzICovCi0KLSAgICBkYXZfdGV4dF9oZWFkZXIgZmlyc3RfY2RhdGE7CS8qIGNkYXRhIHJpZ2h0IGFmdGVyIHN0YXJ0IHRhZyAqLwotICAgIGRhdl90ZXh0X2hlYWRlciBmb2xsb3dpbmdfY2RhdGE7CS8qIGNkYXRhIGFmdGVyIE1ZIGVuZCB0YWcgKi8KLQotICAgIHN0cnVjdCBkYXZfeG1sX2VsZW0gKnBhcmVudDsJLyogcGFyZW50IGVsZW1lbnQgKi8KLSAgICBzdHJ1Y3QgZGF2X3htbF9lbGVtICpuZXh0OwkJLyogbmV4dCAoc2libGluZykgZWxlbWVudCAqLwotICAgIHN0cnVjdCBkYXZfeG1sX2VsZW0gKmZpcnN0X2NoaWxkOwkvKiBmaXJzdCBjaGlsZCBlbGVtZW50ICovCi0gICAgc3RydWN0IGRhdl94bWxfYXR0ciAqYXR0cjsJCS8qIGZpcnN0IGF0dHJpYnV0ZSAqLwotCi0gICAgLyogdXNlZCBvbmx5IGR1cmluZyBwYXJzaW5nICovCi0gICAgc3RydWN0IGRhdl94bWxfZWxlbSAqbGFzdF9jaGlsZDsJLyogbGFzdCBjaGlsZCBlbGVtZW50ICovCi0gICAgc3RydWN0IGRhdl94bWxfbnNfc2NvcGUgKm5zX3Njb3BlOwkvKiBuYW1lc3BhY2VzIHNjb3BlZCBieSB0aGlzIGVsZW0gKi8KLQotICAgIC8qIHVzZWQgZHVyaW5nIHJlcXVlc3QgcHJvY2Vzc2luZyAqLwotICAgIGludCBwcm9waWQ7CQkJCS8qIGxpdmUgcHJvcGVydHkgSUQgKi8KLSAgICBjb25zdCBkYXZfaG9va3NfbGl2ZXByb3AgKnByb3ZpZGVyOwkvKiB0aGUgcHJvdmlkZXIgZGVmaW5pbmcgdGhpcyBwcm9wICovCi0gICAgY29uc3QgaW50ICpuc19tYXA7CQkJLyogbnMgbWFwIGZvciB0aGlzIHByb3ZpZGVyICovCi0KLX0gZGF2X3htbF9lbGVtOwotCi0jZGVmaW5lIERBVl9FTEVNX0lTX0VNUFRZKGUpCSgoZSktPmZpcnN0X2NoaWxkID09IE5VTEwgJiYgXAotCQkJCSAoZSktPmZpcnN0X2NkYXRhLmZpcnN0ID09IE5VTEwpCi0KLXR5cGVkZWYgc3RydWN0IGRhdl94bWxfZG9jCi17Ci0gICAgZGF2X3htbF9lbGVtICpyb290OwkJLyogcm9vdCBlbGVtZW50ICovCi0gICAgYXJyYXlfaGVhZGVyICpuYW1lc3BhY2VzOwkvKiBhcnJheSBvZiBuYW1lc3BhY2VzIHVzZWQgKi8KLQotfSBkYXZfeG1sX2RvYzsKLQotCi1pbnQgZGF2X3BhcnNlX2lucHV0KHJlcXVlc3RfcmVjICpyLCBkYXZfeG1sX2RvYyAqKnBkb2MpOwotCi1pbnQgZGF2X3ZhbGlkYXRlX3Jvb3QoY29uc3QgZGF2X3htbF9kb2MgKmRvYywgY29uc3QgY2hhciAqdGFnbmFtZSk7Ci0KLWRhdl94bWxfZWxlbSAqZGF2X2ZpbmRfY2hpbGQoCi0gICAgY29uc3QgZGF2X3htbF9lbGVtICplbGVtLAotICAgIGNvbnN0IGNoYXIgKnRhZ25hbWUpOwotCi12b2lkIGRhdl94bWwydGV4dCgKLSAgICBwb29sICpwLAotICAgIGNvbnN0IGRhdl94bWxfZWxlbSAqZWxlbSwKLSAgICBpbnQgc3R5bGUsCi0gICAgYXJyYXlfaGVhZGVyICpuYW1lc3BhY2VzLAotICAgIGludCAqbnNfbWFwLAotICAgIGNvbnN0IGNoYXIgKipwYnVmLAotICAgIHNpemVfdCAqcHNpemUKLSAgICApOwotI2RlZmluZSBEQVZfWDJUX0ZVTEwJCTAJLyogc3RhcnQgdGFnLCBjb250ZW50cywgZW5kIHRhZyAqLwotI2RlZmluZSBEQVZfWDJUX0lOTkVSCQkxCS8qIGNvbnRlbnRzIG9ubHkgKi8KLSNkZWZpbmUgREFWX1gyVF9MQU5HX0lOTkVSCTIJLyogeG1sOmxhbmcgKyBpbm5lciBjb250ZW50cyAqLwotI2RlZmluZSBEQVZfWDJUX0ZVTExfTlNfTEFORwkzCS8qIEZVTEwgKyBucyBkZWZucyArIHhtbDpsYW5nICovCi0KLWNvbnN0IGNoYXIgKmRhdl9lbXB0eV9lbGVtKHBvb2wgKnAsIGNvbnN0IGRhdl94bWxfZWxlbSAqZWxlbSk7Ci12b2lkIGRhdl9xdW90ZV94bWxfZWxlbShwb29sICpwLCBkYXZfeG1sX2VsZW0gKmVsZW0pOwotY29uc3QgY2hhciAqIGRhdl9xdW90ZV9zdHJpbmcocG9vbCAqcCwgY29uc3QgY2hhciAqcywgaW50IHF1b3Rlcyk7Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoqCi0qKiBMSVZFIFBST1BFUlRZIEhBTkRMSU5HCi0qLwotCi10eXBlZGVmIGVudW0gewotICAgIERBVl9QUk9QX0lOU0VSVF9OT1RNRSwJLyogcHJvcCBub3QgZGVmaW5lZCBieSB0aGlzIHByb3ZpZGVyICovCi0gICAgREFWX1BST1BfSU5TRVJUX05PVERFRiwJLyogcHJvcGVydHkgaXMgZGVmaW5lZCBieSB0aGlzIHByb3ZpZGVyLAotCQkJCSAgIGJ1dCBub3RoaW5nIHdhcyBpbnNlcnRlZCBiZWNhdXNlIHRoZQotCQkJCSAgIChsaXZlKSBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZCBmb3IgdGhpcwotCQkJCSAgIHJlc291cmNlIChpdCBtYXkgYmUgcHJlc2VudCBhcyBhIGRlYWQKLQkJCQkgICBwcm9wZXJ0eSkuICovCi0gICAgREFWX1BST1BfSU5TRVJUX05BTUUsCS8qIGEgcHJvcGVydHkgbmFtZSAoZW1wdHkgZWxlbSkgd2FzCi0JCQkJICAgaW5zZXJ0ZWQgaW50byB0aGUgdGV4dCBibG9jayAqLwotICAgIERBVl9QUk9QX0lOU0VSVF9WQUxVRQkvKiBhIHByb3BlcnR5IG5hbWUvdmFsdWUgcGFpciB3YXMgaW5zZXJ0ZWQKLQkJCQkgICBpbnRvIHRoZSB0ZXh0IGJsb2NrICovCi19IGRhdl9wcm9wX2luc2VydDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgICBEQVZfUFJPUF9SV19OT1RNRSwJCS8qIG5vdCBteSBwcm9wZXJ0eSAqLwotICAgIERBVl9QUk9QX1JXX05PLAkJLyogcHJvcGVydHkgaXMgTk9UIHdyaXRlYWJsZSAqLwotICAgIERBVl9QUk9QX1JXX1lFUwkJLyogcHJvcGVydHkgSVMgd3JpdGVhYmxlICovCi19IGRhdl9wcm9wX3J3OwotCi0vKiBvcGFxdWUgdHlwZSBmb3IgUFJPUFBBVENIIHJvbGxiYWNrIGluZm9ybWF0aW9uICovCi10eXBlZGVmIHN0cnVjdCBkYXZfbGl2ZXByb3Bfcm9sbGJhY2sgZGF2X2xpdmVwcm9wX3JvbGxiYWNrOwotCi1zdHJ1Y3QgZGF2X2hvb2tzX2xpdmVwcm9wCi17Ci0gICAgLyoKLSAgICAqKiBUaGlzIFVSSSBpcyByZXR1cm5lZCBpbiB0aGUgREFWOiBoZWFkZXIgdG8gbGV0IGNsaWVudHMga25vdyB3aGF0Ci0gICAgKiogc2V0cyBvZiBsaXZlIHByb3BlcnRpZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUgaW5zdGFsbGF0aW9uLiBtb2RfZGF2Ci0gICAgKiogd2lsbCBwbGFjZSBvcGVuL2Nsb3NlIGFuZ2xlIGJyYWNrZXRzIGFyb3VuZCB0aGlzIHZhbHVlIChtdWNoIGxpa2UKLSAgICAqKiBhIENvZGVkLVVSTCk7IHF1b3RlcyBhbmQgYnJhY2tldHMgc2hvdWxkIG5vdCBiZSBpbiB0aGUgdmFsdWUuCi0gICAgKioKLSAgICAqKiBFeGFtcGxlOiAgICBodHRwOi8vYXBhY2hlLm9yZy9kYXYvcHJvcHMvCi0gICAgKioKLSAgICAqKiAob2YgY291cnNlLCB1c2UgeW91ciBvd24gZG9tYWluIHRvIGVuc3VyZSBhIHVuaXF1ZSB2YWx1ZSkKLSAgICAqLwotICAgIGNvbnN0IGNoYXIgKiBwcm9wc2V0X3VyaTsKLQotICAgIC8qCi0gICAgKiogRmluZCBhIHByb3BlcnR5LCByZXR1cm5pbmcgYSBub24temVybywgdW5pcXVlLCBvcGFxdWUgaWRlbnRpZmllci4KLSAgICAqKgotICAgICoqIE5PVEU6IFByb3ZpZGVycyBtdXN0IGVuc3VyZSB0aGlzIGlkZW50aWZpZXIgaXMgdW5pdmVyc2FsbHkgdW5pcXVlLgotICAgICoqICAgICAgIFNlZSB0aGUgcmVnaXN0cmF0aW9uIHRhYmxlIGJlbG93LgotICAgICoqICMjIyBpdCB3b3VsZCBiZSBuaWNlIHRvIGF2b2lkIHRoaXMgdW5pcXVlbmVzcyBjb25zdHJhaW50LiBob3dldmVyLAotICAgICoqICMjIyB0aGF0IHdvdWxkIG1lYW4gb3VyIHhtbF9lbGVtIGFubm90YXRpb24gY29uY2VwdCB3b3VsZCBuZWVkIHRvCi0gICAgKiogIyMjIGNoYW5nZSAody5yLnQuIHRoZSBmYWN0IHRoYXQgaXQgYWN0cyBhcyBhIGNhY2hlIGZvciBmaW5kX3Byb3ApLgotICAgICoqCi0gICAgKiogUmV0dXJucyAwIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZCBieSB0aGlzIHByb3ZpZGVyLgotICAgICovCi0gICAgaW50ICgqZmluZF9wcm9wKShjb25zdCBjaGFyICpuc191cmksIGNvbnN0IGNoYXIgKm5hbWUpOwotCi0gICAgLyoKLSAgICAqKiBJbnNlcnQgYSBwcm9wZXJ0eSBuYW1lL3ZhbHVlIGludG8gYSB0ZXh0IGJsb2NrLiBUaGUgcHJvcGVydHkgdG8KLSAgICAqKiBpbnNlcnQgaXMgaWRlbnRpZmllZCBieSB0aGUgcHJvcGlkIHZhbHVlLiBQcm92aWRlcnMgc2hvdWxkIHJldHVybgotICAgICoqIERBVl9QUk9QX0lOU0VSVF9OT1RNRSBpZiB0aGV5IGRvIG5vdCBkZWZpbmUgdGhlIHNwZWNpZmllZCBwcm9waWQuCi0gICAgKiogSWYgaW5zdmFsdWUgaXMgdHJ1ZSwgdGhlbiB0aGUgcHJvcGVydHkncyB2YWx1ZSBzaG91bGQgYmUgaW5zZXJ0ZWQ7Ci0gICAgKiogb3RoZXJ3aXNlLCBhbiBlbXB0eSBlbGVtZW50IChpZS4ganVzdCB0aGUgcHJvcCdzIG5hbWUpIHNob3VsZCBiZQotICAgICoqIGluc2VydGVkLgotICAgICoqCi0gICAgKiogUmV0dXJucyBvbmUgb2YgREFWX1BST1BfSU5TRVJUXyogYmFzZWQgb24gd2hhdCBoYXBwZW5lZC4KLSAgICAqKgotICAgICoqICMjIyB3ZSBtYXkgbmVlZCBtb3JlIGNvbnRleHQuLi4gaWUuIHRoZSBsb2NrIGRhdGFiYXNlCi0gICAgKi8KLSAgICBkYXZfcHJvcF9pbnNlcnQgKCppbnNlcnRfcHJvcCkoY29uc3QgZGF2X3Jlc291cmNlICpyZXNvdXJjZSwKLQkJCQkgICBpbnQgcHJvcGlkLCBpbnQgaW5zdmFsdWUsCi0JCQkJICAgY29uc3QgaW50ICpuc19tYXAsIGRhdl90ZXh0X2hlYWRlciAqcGhkcik7Ci0KLSAgICAvKgotICAgICoqIEluc2VydCBhbGwga25vd24vZGVmaW5lZCBwcm9wZXJ0eSBuYW1lcyAoYW5kIHZhbHVlcykuIFRoaXMgaXMKLSAgICAqKiBzaW1pbGFyIHRvIGluc2VydF9wcm9wLCBidXQgKmFsbCogcHJvcGVydGllcyB3aWxsIGJlIGluc2VydGVkCi0gICAgKiogcmF0aGVyIHRoYW4gc3BlY2lmaWMsIGluZGl2aWR1YWwgcHJvcGVydGllcy4KLSAgICAqLwotICAgIHZvaWQgKCppbnNlcnRfYWxsKShjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlLCBpbnQgaW5zdmFsdWUsCi0JCSAgICAgICBjb25zdCBpbnQgKm5zX21hcCwgZGF2X3RleHRfaGVhZGVyICpwaGRyKTsKLQotICAgIC8qCi0gICAgKiogRGV0ZXJtaW5lIHdoZXRoZXIgYSBnaXZlbiBwcm9wZXJ0eSBpcyB3cml0ZWFibGUuCi0gICAgKioKLSAgICAqKiAjIyMgd2UgbWF5IHdhbnQgYSBkaWZmZXJlbnQgc2VtYW50aWMuIGkuZS4gbWF5YmUgaXQgc2hvdWxkIGJlCi0gICAgKiogIyMjICJjYW4gd2Ugd3JpdGUgPHZhbHVlPiBpbnRvIHRoaXMgcHJvcGVydHk/IgotICAgICoqCi0gICAgKiogUmV0dXJucyBhcHByb3ByaWF0ZSByZWFkL3dyaXRlIHN0YXR1cy4KLSAgICAqLwotICAgIGRhdl9wcm9wX3J3ICgqaXNfd3JpdGVhYmxlKShjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlLCBpbnQgcHJvcGlkKTsKLQotICAgIC8qCi0gICAgKiogVGhpcyBtZW1iZXIgZGVmaW5lcyB0aGUgc2V0IG9mIG5hbWVzcGFjZSBVUklzIHRoYXQgdGhlIHByb3ZpZGVyCi0gICAgKiogdXNlcyBmb3IgaXRzIHByb3BlcnRpZXMuIFdoZW4gaW5zZXJ0X2FsbCBpcyBjYWxsZWQsIGl0IHdpbGwgYmUKLSAgICAqKiBwYXNzZWQgYSBsaXN0IG9mIGludGVnZXJzIHRoYXQgbWFwIGZyb20gaW5kaWNlcyBpbnRvIHRoaXMgbGlzdAotICAgICoqIHRvIG5hbWVzcGFjZSBJRHMgZm9yIG91dHB1dCBnZW5lcmF0aW9uLgotICAgICoqCi0gICAgKiogVGhlIGxhc3QgZW50cnkgaW4gdGhpcyBsaXN0IHNob3VsZCBiZSBhIE5VTEwgdmFsdWUgKHNlbnRpbmVsKS4KLSAgICAqLwotICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqIG5hbWVzcGFjZV91cmlzOwotCi0gICAgLyoKLSAgICAqKiAjIyMgdGhpcyBpcyBub3QgdGhlIGZpbmFsIGRlc2lnbi4gd2Ugd2FudCBhbiBvcGVuLWVuZGVkIHdheSBmb3IKLSAgICAqKiAjIyMgbGl2ZXByb3AgcHJvdmlkZXJzIHRvIGF0dGFjaCAqbmV3KiBwcm9wZXJ0aWVzLiBUbyB0aGlzIGVuZCwKLSAgICAqKiAjIyMgd2UnbGwgaGF2ZSBhICJnaXZlIG1lIGEgbGlzdCBvZiB0aGUgcHJvcHMgeW91IGRlZmluZSIsIGEgd2F5Ci0gICAgKiogIyMjIHRvIGNoZWNrIGZvciBhIHByb3AncyBleGlzdGVuY2UsIGEgd2F5IHRvIHZhbGlkYXRlIGEgc2V0L3JlbW92ZQotICAgICoqICMjIyBvZiBhIHByb3AsIGFuZCBhIHdheSB0byBleGVjdXRlL2NvbW1pdC9yb2xsYmFjayB0aGF0IGNoYW5nZS4KLSAgICAqLwotCi0gICAgLyoKLSAgICAqKiBWYWxpZGF0ZSB0aGF0IHRoZSBsaXZlIHByb3BlcnR5IGNhbiBiZSBhc3NpZ25lZCBhIHZhbHVlLCBhbmQgdGhhdAotICAgICoqIHRoZSBwcm92aWRlZCB2YWx1ZSBpcyB2YWxpZC4KLSAgICAqKgotICAgICoqIGVsZW0gd2lsbCBwb2ludCB0byB0aGUgWE1MIGVsZW1lbnQgdGhhdCBuYW1lcyB0aGUgcHJvcGVydHkuIEZvcgotICAgICoqIGV4YW1wbGU6Ci0gICAgKiogICAgIDxscDE6ZXhlY3V0YWJsZT5UPC9scDE6ZXhlY3V0YWJsZT4KLSAgICAqKgotICAgICoqIFRoZSBwcm92aWRlciBjYW4gYWNjZXNzIHRoZSBjZGF0YSBmaWVsZHMgYW5kIHRoZSBjaGlsZCBlbGVtZW50cwotICAgICoqIHRvIGV4dHJhY3QgdGhlIHJlbGV2YW50IHBpZWNlcy4KLSAgICAqKgotICAgICoqIG9wZXJhdGlvbiBpcyBvbmUgb2YgREFWX1BST1BfT1BfU0VUIG9yIF9ERUxFVEUuCi0gICAgKioKLSAgICAqKiBUaGUgcHJvdmlkZXIgbWF5IHJldHVybiBhIHZhbHVlIGluICpjb250ZXh0IHdoaWNoIHdpbGwgYmUgcGFzc2VkCi0gICAgKiogdG8gZWFjaCBvZiB0aGUgZXhlYy9jb21taXQvcm9sbGJhY2sgZnVuY3Rpb25zLiBGb3IgZXhhbXBsZSwgdGhpcwotICAgICoqIG1heSBjb250YWluIGFuIGludGVybmFsIHZhbHVlIHdoaWNoIGhhcyBiZWVuIHByb2Nlc3NlZCBmcm9tIHRoZQotICAgICoqIGlucHV0IGVsZW1lbnQuCi0gICAgKioKLSAgICAqKiBUaGUgcHJvdmlkZXIgbXVzdCBzZXQgZGVmZXJfdG9fZGVhZCB0byB0cnVlIChub24temVybykgb3IgZmFsc2UuCi0gICAgKiogSWYgdHJ1ZSwgdGhlbiB0aGUgc2V0L3JlbW92ZSBpcyBkZWZlcnJlZCB0byB0aGUgZGVhZCBwcm9wZXJ0eQotICAgICoqIGRhdGFiYXNlLiBOb3RlOiBpdCB3aWxsIGJlIHNldCB0byB6ZXJvIG9uIGVudHJ5LgotICAgICovCi0gICAgZGF2X2Vycm9yICogKCpwYXRjaF92YWxpZGF0ZSkoY29uc3QgZGF2X3Jlc291cmNlICpyZXNvdXJjZSwKLQkJCQkgIGNvbnN0IGRhdl94bWxfZWxlbSAqZWxlbSwKLQkJCQkgIGludCBvcGVyYXRpb24sCi0JCQkJICB2b2lkICoqY29udGV4dCwKLQkJCQkgIGludCAqZGVmZXJfdG9fZGVhZCk7Ci0KLSAgICAvKiAjIyMgZG9jLi4uICovCi0gICAgZGF2X2Vycm9yICogKCpwYXRjaF9leGVjKShkYXZfcmVzb3VyY2UgKnJlc291cmNlLAotCQkJICAgICAgY29uc3QgZGF2X3htbF9lbGVtICplbGVtLAotCQkJICAgICAgaW50IG9wZXJhdGlvbiwKLQkJCSAgICAgIHZvaWQgKmNvbnRleHQsCi0JCQkgICAgICBkYXZfbGl2ZXByb3Bfcm9sbGJhY2sgKipyb2xsYmFja19jdHgpOwotCi0gICAgLyogIyMjIGRvYy4uLiAqLwotICAgIHZvaWQgKCpwYXRjaF9jb21taXQpKGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkgaW50IG9wZXJhdGlvbiwKLQkJCSB2b2lkICpjb250ZXh0LAotCQkJIGRhdl9saXZlcHJvcF9yb2xsYmFjayAqcm9sbGJhY2tfY3R4KTsKLQotICAgIC8qICMjIyBkb2MuLi4gKi8KLSAgICBkYXZfZXJyb3IgKiAoKnBhdGNoX3JvbGxiYWNrKShkYXZfcmVzb3VyY2UgKnJlc291cmNlLAotCQkJCSAgaW50IG9wZXJhdGlvbiwKLQkJCQkgIHZvaWQgKmNvbnRleHQsCi0JCQkJICBkYXZfbGl2ZXByb3Bfcm9sbGJhY2sgKnJvbGxiYWNrX2N0eCk7Ci19OwotCi0vKgotKiogUHJvcGVydHkgSWRlbnRpZmllciBSZWdpc3RyYXRpb24KLSoqCi0qKiBBdCB0aGUgbW9tZW50LCBtb2RfZGF2IHJlcXVpcmVzIGxpdmUgcHJvcGVydHkgcHJvdmlkZXJzIHRvIGVuc3VyZSB0aGF0Ci0qKiBlYWNoIHByb3BlcnR5IHJldHVybmVkIGhhcyBhIHVuaXF1ZSB2YWx1ZS4gRm9yIG5vdywgdGhpcyBpcyBkb25lIHRocm91Z2gKLSoqIGNlbnRyYWwgcmVnaXN0cmF0aW9uICh0aGVyZSBhcmUgbm8ga25vd24gcHJvdmlkZXJzIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQsCi0qKiBzbyB0aGlzIHJlbWFpbnMgbWFuYWdlYWJsZSkuCi0qKgotKiogV0FSTklORzogdGhlIFRFU1QgcmFuZ2VzIHNob3VsZCBuZXZlciBiZSAic2hpcHBlZCIuCi0qLwotI2RlZmluZSBEQVZfUFJPUElEX0NPUkUJCTEwMDAwCS8qIC4uMTAwOTkuIGRlZmluZWQgYnkgbW9kX2RhdiAqLwotI2RlZmluZSBEQVZfUFJPUElEX0ZTCQkxMDEwMAkvKiAuLjEwMjk5LgotCQkJCQkgICBtb2RfZGF2IGZpbGVzeXN0ZW0gcHJvdmlkZXIuICovCi0jZGVmaW5lIERBVl9QUk9QSURfVEVTVDEJMTAzMDAJLyogLi4xMDM5OSAqLwotI2RlZmluZSBEQVZfUFJPUElEX1RFU1QyCTEwNDAwCS8qIC4uMTA0OTkgKi8KLSNkZWZpbmUgREFWX1BST1BJRF9URVNUMwkxMDUwMAkvKiAuLjEwNTk5ICovCi0vKiBOZXh0OiAxMDYwMCAqLwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qKgotKiogREFUQUJBU0UgRlVOQ1RJT05TCi0qLwotCi10eXBlZGVmIHN0cnVjdCBkYXZfZGIgZGF2X2RiOwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBjaGFyICpkcHRyOwotICAgIHNpemVfdCBkc2l6ZTsKLX0gZGF2X2RhdHVtOwotCi0vKiBob29rIGZ1bmN0aW9ucyB0byBlbmFibGUgcGx1Z2dhYmxlIGRhdGFiYXNlcyAqLwotc3RydWN0IGRhdl9ob29rc19kYgotewotICAgIGRhdl9lcnJvciAqICgqb3BlbikocG9vbCAqcCwgY29uc3QgZGF2X3Jlc291cmNlICpyZXNvdXJjZSwgaW50IHJvLAotCQkJZGF2X2RiICoqcGRiKTsKLSAgICB2b2lkICgqY2xvc2UpKGRhdl9kYiAqZGIpOwotCi0gICAgLyoKLSAgICAqKiBGZXRjaCB0aGUgdmFsdWUgZnJvbSB0aGUgZGF0YWJhc2UuIElmIHRoZSB2YWx1ZSBkb2VzIG5vdCBleGlzdCwKLSAgICAqKiB0aGVuICpwdmFsdWUgc2hvdWxkIGJlIHplcm9lZC4KLSAgICAqKgotICAgICoqIE5vdGU6IGl0IGlzIE5PVCBhbiBlcnJvciBmb3IgdGhlIGtleS92YWx1ZSBwYWlyIHRvIG5vdCBleGlzdC4KLSAgICAqLwotICAgIGRhdl9lcnJvciAqICgqZmV0Y2gpKGRhdl9kYiAqZGIsIGRhdl9kYXR1bSBrZXksIGRhdl9kYXR1bSAqcHZhbHVlKTsKLQotICAgIGRhdl9lcnJvciAqICgqc3RvcmUpKGRhdl9kYiAqZGIsIGRhdl9kYXR1bSBrZXksIGRhdl9kYXR1bSB2YWx1ZSk7Ci0gICAgZGF2X2Vycm9yICogKCpyZW1vdmUpKGRhdl9kYiAqZGIsIGRhdl9kYXR1bSBrZXkpOwotCi0gICAgLyogcmV0dXJucyAxIGlmIHRoZSByZWNvcmQgc3BlY2lmaWVkIGJ5ICJrZXkiIGV4aXN0czsgMCBvdGhlcndpc2UgKi8KLSAgICBpbnQgKCpleGlzdHMpKGRhdl9kYiAqZGIsIGRhdl9kYXR1bSBrZXkpOwotCi0gICAgZGF2X2Vycm9yICogKCpmaXJzdGtleSkoZGF2X2RiICpkYiwgZGF2X2RhdHVtICpwa2V5KTsKLSAgICBkYXZfZXJyb3IgKiAoKm5leHRrZXkpKGRhdl9kYiAqZGIsIGRhdl9kYXR1bSAqcGtleSk7Ci0KLSAgICB2b2lkICgqZnJlZWRhdHVtKShkYXZfZGIgKmRiLCBkYXZfZGF0dW0gZGF0YSk7Ci19OwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qKgotKiogTE9DSyBGVU5DVElPTlMKLSovCi0KLS8qIFVzZWQgdG8gcmVwcmVzZW50IGEgVGltZW91dCBoZWFkZXIgb2YgIkluZmluaXR5IiAqLwotI2RlZmluZSBEQVZfVElNRU9VVF9JTkZJTklURSAwCi0KLXRpbWVfdCBkYXZfZ2V0X3RpbWVvdXQocmVxdWVzdF9yZWMgKnIpOwotCi0vKgotKiogT3BhcXVlLCByZXBvc2l0b3J5LXNwZWNpZmljIGluZm9ybWF0aW9uIGZvciBhIGxvY2sgZGF0YWJhc2UuCi0qLwotdHlwZWRlZiBzdHJ1Y3QgZGF2X2xvY2tkYl9wcml2YXRlIGRhdl9sb2NrZGJfcHJpdmF0ZTsKLQotLyoKLSoqIE9wYXF1ZSwgcmVwb3NpdG9yeS1zcGVjaWZpYyBpbmZvcm1hdGlvbiBmb3IgYSBsb2NrIHJlY29yZC4KLSovCi10eXBlZGVmIHN0cnVjdCBkYXZfbG9ja19wcml2YXRlIGRhdl9sb2NrX3ByaXZhdGU7Ci0KLS8qCi0qKiBMb2NrIGRhdGFiYXNlIHR5cGUuIExvY2sgcHJvdmlkZXJzIGFyZSB1cmdlZCB0byBpbXBsZW1lbnQgYSAibGF6eSIgb3Blbiwgc28KLSoqIGRvaW5nIGFuICJvcGVuIiBpcyBjaGVhcCB1bnRpbCBzb21ldGhpbmcgaXMgYWN0dWFsbHkgbmVlZGVkIGZyb20gdGhlIERCLgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgY29uc3QgZGF2X2hvb2tzX2xvY2tzICpob29rczsJLyogdGhlIGhvb2tzIHVzZWQgZm9yIHRoaXMgbG9ja2RiICovCi0gICAgaW50IHJvOwkJCQkvKiB3YXMgaXQgb3BlbmVkIHJlYWRvbmx5PyAqLwotCi0gICAgZGF2X2xvY2tkYl9wcml2YXRlICppbmZvOwotCi19IGRhdl9sb2NrZGI7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gICAgREFWX0xPQ0tTQ09QRV9VTktOT1dOLAotICAgIERBVl9MT0NLU0NPUEVfRVhDTFVTSVZFLAotICAgIERBVl9MT0NLU0NPUEVfU0hBUkVECi19IGRhdl9sb2NrX3Njb3BlOwotCi10eXBlZGVmIGVudW0gewotICAgIERBVl9MT0NLVFlQRV9VTktOT1dOLAotICAgIERBVl9MT0NLVFlQRV9XUklURQotfSBkYXZfbG9ja190eXBlOwotCi10eXBlZGVmIGVudW0gewotICAgIERBVl9MT0NLUkVDX0RJUkVDVCwJCQkvKiBsb2NrIGFzc2VydGVkIG9uIHRoaXMgcmVzb3VyY2UgKi8KLSAgICBEQVZfTE9DS1JFQ19JTkRJUkVDVCwJCS8qIGxvY2sgaW5oZXJpdGVkIGZyb20gYSBwYXJlbnQgKi8KLSAgICBEQVZfTE9DS1JFQ19JTkRJUkVDVF9QQVJUSUFMCS8qIG1vc3QgaW5mbyBpcyBub3QgZmlsbGVkIGluICovCi19IGRhdl9sb2NrX3JlY3R5cGU7Ci0KLS8qCi0qKiBkYXZfbG9jazogaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBhIGxvY2sgb24gYSByZXNvdXJjZS4KLSoqCi0qKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBib3RoIGRpcmVjdCBhbmQgaW5kaXJlY3QgbG9ja3MuIEEgZGlyZWN0IGxvY2sKLSoqIGlzIGEgbG9jayBhcHBsaWVkIHRvIGEgc3BlY2lmaWMgcmVzb3VyY2UgYnkgdGhlIGNsaWVudC4gQW4gaW5kaXJlY3QgbG9jawotKiogaXMgb25lIHRoYXQgaXMgaW5oZXJpdGVkIGZyb20gYSBwYXJlbnQgcmVzb3VyY2UgYnkgdmlydHVlIG9mIGEgbm9uLXplcm8KLSoqIERlcHRoOiBoZWFkZXIgd2hlbiB0aGUgbG9jayB3YXMgYXBwbGllZC4KLSoqCi0qKiBtb2RfZGF2IHJlY29yZHMgYm90aCB0eXBlcyBvZiBsb2NrcyBpbiB0aGUgbG9jayBkYXRhYmFzZSwgbWFuYWdpbmcgdGhlaXIKLSoqIGFkZGl0aW9uL3JlbW92YWwgYXMgcmVzb3VyY2VzIGFyZSBtb3ZlZCBhYm91dCB0aGUgbmFtZXNwYWNlLgotKioKLSoqIE5vdGUgdGhhdCB0aGUgbG9ja2RiIGlzIGZyZWUgdG8gbWFyc2hhbCB0aGlzIHN0cnVjdHVyZSBpbiBhbnkgZm9ybSB0aGF0Ci0qKiBpdCBsaWtlcy4KLSoqCi0qKiBGb3IgYSAicGFydGlhbCIgbG9jaywgdGhlIDxyZWN0eXBlPiBhbmQgPGxvY2t0b2tlbj4gZmllbGRzIG11c3QgYmUgZmlsbGVkCi0qKiBpbi4gQWxsIG90aGVyICh1c2VyKSBmaWVsZHMgc2hvdWxkIGJlIHplcm9lZC4gVGhlIGxvY2sgcHJvdmlkZXIgd2lsbAotKiogdXN1YWxseSBmaWxsIGluIHRoZSA8aW5mbz4gZmllbGQsIGFuZCB0aGUgPG5leHQ+IGZpZWxkIG1heSBiZSB1c2VkIHRvCi0qKiBjb25zdHJ1Y3QgYSBsaXN0IG9mIHBhcnRpYWwgbG9ja3MuCi0qKgotKiogVGhlIGxvY2sgcHJvdmlkZXIgTVVTVCB1c2UgdGhlIGluZm8gZmllbGQgdG8gc3RvcmUgYSB2YWx1ZSBzdWNoIHRoYXQgYQotKiogZGF2X2xvY2sgc3RydWN0dXJlIGNhbiBsb2NhdGUgaXRzZWxmIGluIHRoZSB1bmRlcmx5aW5nIGxvY2sgZGF0YWJhc2UuCi0qKiBUaGlzIHJlcXVpcmVtZW50IGlzIG5lZWRlZCBmb3IgcmVmcmVzaGluZzogd2hlbiBhbiBpbmRpcmVjdCBkYXZfbG9jayBpcwotKiogcmVmcmVzaGVkLCBpdHMgcmVmZXJlbmNlIHRvIHRoZSBkaXJlY3QgbG9jayBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBkaXJlY3QncwotKiogcmVzb3VyY2UsIHNvIHRoZSBvbmx5IHdheSB0byBsb2NhdGUgdGhlIChyZWZyZXNoZWQsIGRpcmVjdCkgbG9jayBpbiB0aGUKLSoqIGRhdGFiYXNlIGlzIHRvIHVzZSB0aGUgaW5mbyBmaWVsZC4KLSoqCi0qKiBOb3RlIHRoYXQgPGlzX2xvY2tudWxsPiBvbmx5IHJlZmVycyB0byB0aGUgcmVzb3VyY2Ugd2hlcmUgdGhpcyBsb2NrIHdhcwotKiogZm91bmQuCi0qKiAjIyMgaHJtLiB0aGF0IHNheXMgdGhlIGFic3RyYWN0aW9uIGlzIHdyb25nLiBpc19sb2NrbnVsbCBtYXkgZGlzYXBwZWFyLgotKi8KLXR5cGVkZWYgc3RydWN0IGRhdl9sb2NrCi17Ci0gICAgZGF2X2xvY2tfcmVjdHlwZSByZWN0eXBlOwkvKiB0eXBlIG9mIGxvY2sgcmVjb3JkICovCi0gICAgaW50IGlzX2xvY2tudWxsOwkJLyogbG9jayBlc3RhYmxpc2hlcyBhIGxvY2tudWxsIHJlc291cmNlICovCi0KLSAgICAvKiAjIyMgcHV0IHRoZSByZXNvdXJjZSBpbiBoZXJlPyAqLwotCi0gICAgZGF2X2xvY2tfc2NvcGUgc2NvcGU7CS8qIHNjb3BlIG9mIHRoZSBsb2NrICovCi0gICAgZGF2X2xvY2tfdHlwZSB0eXBlOwkJLyogdHlwZSBvZiBsb2NrICovCi0gICAgaW50IGRlcHRoOwkJCS8qIGRlcHRoIG9mIHRoZSBsb2NrICovCi0gICAgdGltZV90IHRpbWVvdXQ7CQkvKiB3aGVuIHRoZSBsb2NrIHdpbGwgdGltZW91dCAqLwotCi0gICAgY29uc3QgZGF2X2xvY2t0b2tlbiAqbG9ja3Rva2VuOwkvKiB0aGUgdG9rZW4gdGhhdCB3YXMgaXNzdWVkICovCi0KLSAgICBjb25zdCBjaGFyICpvd25lcjsJCS8qIChYTUwpIG93bmVyIG9mIHRoZSBsb2NrICovCi0gICAgY29uc3QgY2hhciAqYXV0aF91c2VyOwkvKiBhdXRoJ2QgdXNlcm5hbWUgb3duaW5nIGxvY2sgKi8KLQotICAgIGRhdl9sb2NrX3ByaXZhdGUgKmluZm87CS8qIHByaXZhdGUgdG8gdGhlIGxvY2tkYiAqLwotCi0gICAgc3RydWN0IGRhdl9sb2NrICpuZXh0OwkvKiBmb3IgbWFuYWdpbmcgYSBsaXN0IG9mIGxvY2tzICovCi19IGRhdl9sb2NrOwotCi0vKiBQcm9wZXJ0eS1yZWxhdGVkIHB1YmxpYyBsb2NrIGZ1bmN0aW9ucyAqLwotY29uc3QgY2hhciAqZGF2X2xvY2tfZ2V0X2FjdGl2ZWxvY2socmVxdWVzdF9yZWMgKnIsIGRhdl9sb2NrICpsb2NrcywKLQkJCQkgICAgZGF2X2J1ZmZlciAqcGJ1Zik7Ci0KLS8qIExvY2tEQi1yZWxhdGVkIHB1YmxpYyBsb2NrIGZ1bmN0aW9ucyAqLwotY29uc3QgY2hhciAqZGF2X2dldF9sb2NrZGJfcGF0aChjb25zdCByZXF1ZXN0X3JlYyAqcik7Ci1kYXZfZXJyb3IgKiBkYXZfbG9ja19wYXJzZV9sb2NraW5mbyhyZXF1ZXN0X3JlYyAqciwKLQkJCQkgICAgY29uc3QgZGF2X3Jlc291cmNlICpyZXNyb3VjZSwKLQkJCQkgICAgZGF2X2xvY2tkYiAqbG9ja2RiLAotCQkJCSAgICBjb25zdCBkYXZfeG1sX2RvYyAqZG9jLAotCQkJCSAgICBkYXZfbG9jayAqKmxvY2tfcmVxdWVzdCk7Ci1pbnQgZGF2X3VubG9jayhyZXF1ZXN0X3JlYyAqciwgY29uc3QgZGF2X3Jlc291cmNlICpyZXNvdXJjZSwKLQkgICAgICAgY29uc3QgZGF2X2xvY2t0b2tlbiAqbG9ja3Rva2VuKTsKLWRhdl9lcnJvciAqIGRhdl9hZGRfbG9jayhyZXF1ZXN0X3JlYyAqciwgY29uc3QgZGF2X3Jlc291cmNlICpyZXNvdXJjZSwKLQkJCSBkYXZfbG9ja2RiICpsb2NrZGIsIGRhdl9sb2NrICpyZXF1ZXN0LAotCQkJIGRhdl9yZXNwb25zZSAqKnJlc3BvbnNlKTsKLWRhdl9lcnJvciAqIGRhdl9ub3RpZnlfY3JlYXRlZChyZXF1ZXN0X3JlYyAqciwKLQkJCSAgICAgICBkYXZfbG9ja2RiICpsb2NrZGIsCi0JCQkgICAgICAgY29uc3QgZGF2X3Jlc291cmNlICpyZXNvdXJjZSwKLQkJCSAgICAgICBpbnQgcmVzb3VyY2Vfc3RhdGUsCi0JCQkgICAgICAgaW50IGRlcHRoKTsKLQotZGF2X2Vycm9yICogZGF2X2xvY2tfcXVlcnkoZGF2X2xvY2tkYiAqbG9ja2RiLCBjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlLAotCQkJICAgZGF2X2xvY2sgKipsb2Nrcyk7Ci0KLWRhdl9lcnJvciAqIGRhdl92YWxpZGF0ZV9yZXF1ZXN0KHJlcXVlc3RfcmVjICpyLCBkYXZfcmVzb3VyY2UgKnJlc291cmNlLAotCQkJCSBpbnQgZGVwdGgsIGRhdl9sb2NrdG9rZW4gKmxvY2t0b2tlbiwKLQkJCQkgZGF2X3Jlc3BvbnNlICoqcmVzcG9uc2UsIGludCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdl9sb2NrZGIgKmxvY2tkYik7Ci0vKgotKiogZmxhZ3M6Ci0qKiAgICAweDBGIC0tIHJlc2VydmVkIGZvciA8ZGF2X2xvY2tfc2NvcGU+IHZhbHVlcwotKioKLSoqICAgIG90aGVyIGZsYWdzLCBkZXRhaWxlZCBiZWxvdwotKi8KLSNkZWZpbmUgREFWX1ZBTElEQVRFX1JFU09VUkNFICAgMHgwMDEwICAvKiB2YWxpZGF0ZSBqdXN0IHRoZSByZXNvdXJjZSAqLwotI2RlZmluZSBEQVZfVkFMSURBVEVfUEFSRU5UICAgICAweDAwMjAgIC8qIHZhbGlkYXRlIHJlc291cmNlIEFORCBpdHMgcGFyZW50ICovCi0jZGVmaW5lIERBVl9WQUxJREFURV9BRERfTEQgICAgIDB4MDA0MCAgLyogYWRkIERBVjpsb2NrZGlzY292ZXJ5IGludG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgNDI0IERBVjpyZXNwb25zZSAqLwotI2RlZmluZSBEQVZfVkFMSURBVEVfVVNFXzQyNCAgICAweDAwODAgIC8qIHJldHVybiA0MjQgc3RhdHVzLCBub3QgMjA3ICovCi0jZGVmaW5lIERBVl9WQUxJREFURV9JU19QQVJFTlQgIDB4MDEwMCAgLyogZm9yIGludGVybmFsIHVzZSAqLwotCi0vKiBMb2NrLW51bGwgcmVsYXRlZCBwdWJsaWMgbG9jayBmdW5jdGlvbnMgKi8KLWludCBkYXZfZ2V0X3Jlc291cmNlX3N0YXRlKHJlcXVlc3RfcmVjICpyLCBjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlKTsKLQotLyogTG9jayBwcm92aWRlciBob29rcy4gTG9ja2luZyBpcyBvcHRpb25hbCwgc28gdGhlcmUgbWF5IGJlIG5vCi0gKiBsb2NrIHByb3ZpZGVyIGZvciBhIGdpdmVuIHJlcG9zaXRvcnkuCi0gKi8KLXN0cnVjdCBkYXZfaG9va3NfbG9ja3MKLXsKLSAgICAvKiBSZXR1cm4gdGhlIHN1cHBvcnRlZGxvY2sgcHJvcGVydHkgZm9yIHRoaXMgcHJvdmlkZXIgKi8KLSAgICAvKiAjIyMgbWF5YmUgdGhpcyBzaG91bGQgdGFrZSBhIHJlc291cmNlIGFyZ3VtZW50PyAqLwotICAgIGNvbnN0IGNoYXIgKiAoKmdldF9zdXBwb3J0ZWRsb2NrKSh2b2lkKTsKLQotICAgIC8qIFBhcnNlIGEgbG9jayB0b2tlbiBVUkksIHJldHVybmluZyBhIGxvY2sgdG9rZW4gb2JqZWN0IGFsbG9jYXRlZAotICAgICAqIGluIHRoZSBnaXZlbiBwb29sLgotICAgICAqLwotICAgIGRhdl9lcnJvciAqICgqcGFyc2VfbG9ja3Rva2VuKSgKLSAgICAgICAgcG9vbCAqcCwKLSAgICAgICAgY29uc3QgY2hhciAqY2hhcl90b2tlbiwKLSAgICAgICAgZGF2X2xvY2t0b2tlbiAqKmxvY2t0b2tlbl9wCi0gICAgKTsKLQotICAgIC8qIEZvcm1hdCBhIGxvY2sgdG9rZW4gb2JqZWN0IGludG8gYSBVUkkgc3RyaW5nLCBhbGxvY2F0ZWQgaW4KLSAgICAgKiB0aGUgZ2l2ZW4gcG9vbC4KLSAgICAgKgotICAgICAqIEFsd2F5cyByZXR1cm5zIG5vbi1OVUxMLgotICAgICAqLwotICAgIGNvbnN0IGNoYXIgKiAoKmZvcm1hdF9sb2NrdG9rZW4pKAotICAgICAgICBwb29sICpwLAotICAgICAgICBjb25zdCBkYXZfbG9ja3Rva2VuICpsb2NrdG9rZW4KLSAgICApOwotCi0gICAgLyogQ29tcGFyZSB0d28gbG9jayB0b2tlbnMuCi0gICAgICoKLSAgICAgKiBSZXN1bHQgPCAwICA9PiBsdDEgPCBsdDIKLSAgICAgKiBSZXN1bHQgPT0gMCA9PiBsdDEgPT0gbHQyCi0gICAgICogUmVzdWx0ID4gMCAgPT4gbHQxID4gbHQyCi0gICAgICovCi0gICAgaW50ICgqY29tcGFyZV9sb2NrdG9rZW4pKAotICAgICAgICBjb25zdCBkYXZfbG9ja3Rva2VuICpsdDEsCi0gICAgICAgIGNvbnN0IGRhdl9sb2NrdG9rZW4gKmx0MgotICAgICk7Ci0KLSAgICAvKiBPcGVuIHRoZSBwcm92aWRlcidzIGxvY2sgZGF0YWJhc2UuCi0gICAgICoKLSAgICAgKiBUaGUgcHJvdmlkZXIgbWF5IG9yIG1heSBub3QgdXNlIGEgInJlYWwiIGRhdGFiYXNlIGZvciBsb2NrcwotICAgICAqIChhIGxvY2sgY291bGQgYmUgYW4gYXR0cmlidXRlIG9uIGEgcmVzb3VyY2UsIGZvciBleGFtcGxlKS4KLSAgICAgKgotICAgICAqIFRoZSBwcm92aWRlciBtYXkgY2hvb3NlIHRvIHVzZSB0aGUgdmFsdWUgb2YgdGhlIERBVkxvY2tEQiBkaXJlY3RpdmUKLSAgICAgKiAoYXMgcmV0dXJuZWQgYnkgZGF2X2dldF9sb2NrZGJfcGF0aCgpKSB0byBkZWNpZGUgd2hlcmUgdG8gcGxhY2UKLSAgICAgKiBhbnkgc3RvcmFnZSBpdCBtYXkgbmVlZC4KLSAgICAgKgotICAgICAqIFRoZSByZXF1ZXN0IHN0b3JhZ2UgcG9vbCBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2NrZGIsCi0gICAgICogc28gaXQgY2FuIGJlIHVzZWQgaW4gc3Vic2VxdWVudCBvcGVyYXRpb25zLgotICAgICAqCi0gICAgICogSWYgcm8gIT0gMCwgb25seSByZWFkb25seSBvcGVyYXRpb25zIHdpbGwgYmUgcGVyZm9ybWVkLgotICAgICAqIElmIGZvcmNlID09IDAsIHRoZSBvcGVuIGNhbiBiZSAibGF6eSI7IG5vIHN1YnNlcXVlbnQgbG9ja2luZyBvcGVyYXRpb25zCi0gICAgICogbWF5IG9jY3VyLgotICAgICAqIElmIGZvcmNlICE9IDAsIGxvY2tpbmcgb3BlcmF0aW9ucyB3aWxsIGRlZmluaXRlbHkgb2NjdXIuCi0gICAgICovCi0gICAgZGF2X2Vycm9yICogKCpvcGVuX2xvY2tkYikoCi0gICAgICAgIHJlcXVlc3RfcmVjICpyLAotICAgICAgICBpbnQgcm8sCi0gICAgICAgIGludCBmb3JjZSwKLSAgICAgICAgZGF2X2xvY2tkYiAqKmxvY2tkYgotICAgICk7Ci0KLSAgICAvKiBJbmRpY2F0ZXMgY29tcGxldGlvbiBvZiBsb2NraW5nIG9wZXJhdGlvbnMgKi8KLSAgICB2b2lkICgqY2xvc2VfbG9ja2RiKSgKLSAgICAgICAgZGF2X2xvY2tkYiAqbG9ja2RiCi0gICAgKTsKLQotICAgIC8qIFRha2UgYSByZXNvdXJjZSBvdXQgb2YgdGhlIGxvY2stbnVsbCBzdGF0ZS4gKi8KLSAgICBkYXZfZXJyb3IgKiAoKnJlbW92ZV9sb2NrbnVsbF9zdGF0ZSkoCi0gICAgICAgIGRhdl9sb2NrZGIgKmxvY2tkYiwKLSAgICAgICAgY29uc3QgZGF2X3Jlc291cmNlICpyZXNvdXJjZQotICAgICk7Ci0KLSAgICAvKgotICAgICoqIENyZWF0ZSBhIChkaXJlY3QpIGxvY2sgc3RydWN0dXJlIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UuIEEgbG9ja3Rva2VuCi0gICAgKiogd2lsbCBiZSBjcmVhdGVkLgotICAgICoqCi0gICAgKiogVGhlIGxvY2sgcHJvdmlkZXIgbWF5IHN0b3JlIHByaXZhdGUgaW5mb3JtYXRpb24gaW50byBsb2NrLT5pbmZvLgotICAgICovCi0gICAgZGF2X2Vycm9yICogKCpjcmVhdGVfbG9jaykoZGF2X2xvY2tkYiAqbG9ja2RiLAotCQkJICAgICAgIGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkgICAgICAgZGF2X2xvY2sgKipsb2NrKTsKLQotICAgIC8qCi0gICAgKiogR2V0IHRoZSBsb2NrcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KLSAgICAqKgotICAgICoqIElmIHJlc29sdmVfbG9ja3MgaXMgdHJ1ZSAobm9uLXplcm8pLCB0aGVuIGFueSBpbmRpcmVjdCBsb2NrcyBhcmUKLSAgICAqKiByZXNvbHZlZCB0byB0aGVpciBhY3R1YWwsIGRpcmVjdCBsb2NrIChpLmUuIHRoZSByZWZlcmVuY2UgdG8gZm9sbG93ZWQKLSAgICAqKiB0byB0aGUgb3JpZ2luYWwgbG9jaykuCi0gICAgKioKLSAgICAqKiBUaGUgbG9ja3MsIGlmIGFueSwgYXJlIHJldHVybmVkIGFzIGEgbGlua2VkIGxpc3QgaW4gbm8gcGFydGljdWxhcgotICAgICoqIG9yZGVyLiBJZiBubyBsb2NrcyBhcmUgcHJlc2VudCwgdGhlbiAqbG9ja3Mgd2lsbCBiZSBOVUxMLgotICAgICovCi0gICAgZGF2X2Vycm9yICogKCpnZXRfbG9ja3MpKGRhdl9sb2NrZGIgKmxvY2tkYiwKLQkJCSAgICAgY29uc3QgZGF2X3Jlc291cmNlICpyZXNvdXJjZSwKLQkJCSAgICAgaW50IGNhbGx0eXBlLAotCQkJICAgICBkYXZfbG9jayAqKmxvY2tzKTsKLQotI2RlZmluZSBEQVZfR0VUTE9DS1NfUkVTT0xWRUQJMAkvKiByZXNvbHZlIGluZGlyZWN0cyB0byBkaXJlY3RzICovCi0jZGVmaW5lIERBVl9HRVRMT0NLU19QQVJUSUFMCTEJLyogbGVhdmUgaW5kaXJlY3RzIHBhcnRpYWxseSBmaWxsZWQgKi8KLSNkZWZpbmUgREFWX0dFVExPQ0tTX0NPTVBMRVRFCTIJLyogZmlsbCBvdXQgaW5kaXJlY3QgbG9ja3MgKi8KLQotICAgIC8qCi0gICAgKiogRmluZCBhIHBhcnRpY3VsYXIgbG9jayBvbiBhIHJlc291cmNlIChzcGVjaWZpZWQgYnkgaXRzIGxvY2t0b2tlbikuCi0gICAgKioKLSAgICAqKiAqbG9jayB3aWxsIGJlIHNldCB0byBOVUxMIGlmIHRoZSBsb2NrIGlzIG5vdCBmb3VuZC4KLSAgICAqKgotICAgICoqIE5vdGUgdGhhdCB0aGUgcHJvdmlkZXIgY2FuIG9wdGltaXplIHRoZSB1bm1hcnNoYWxsaW5nIC0tIG9ubHkgb25lCi0gICAgKiogbG9jayAob3Igbm9uZSkgbXVzdCBiZSBjb25zdHJ1Y3RlZCBhbmQgcmV0dXJuZWQuCi0gICAgKioKLSAgICAqKiBJZiBwYXJ0aWFsX29rIGlzIHRydWUgKG5vbi16ZXJvKSwgdGhlbiBhbiBpbmRpcmVjdCBsb2NrIGNhbiBiZQotICAgICoqIHBhcnRpYWxseSBmaWxsZWQgaW4uIE90aGVyd2lzZSwgYW5vdGhlciBsb29rdXAgaXMgZG9uZSBhbmQgdGhlCi0gICAgKiogbG9jayBzdHJ1Y3R1cmUgd2lsbCBiZSBmaWxsZWQgb3V0IGFzIGEgREFWX0xPQ0tSRUNfSU5ESVJFQ1QuCi0gICAgKi8KLSAgICBkYXZfZXJyb3IgKiAoKmZpbmRfbG9jaykoZGF2X2xvY2tkYiAqbG9ja2RiLAotCQkJICAgICBjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlLAotCQkJICAgICBjb25zdCBkYXZfbG9ja3Rva2VuICpsb2NrdG9rZW4sCi0JCQkgICAgIGludCBwYXJ0aWFsX29rLAotCQkJICAgICBkYXZfbG9jayAqKmxvY2spOwotCi0gICAgLyoKLSAgICAqKiBRdWljayB0ZXN0IHRvIHNlZSBpZiB0aGUgcmVzb3VyY2UgaGFzICphbnkqIGxvY2tzIG9uIGl0LgotICAgICoqCi0gICAgKiogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBub24tZXhpc3RlbnQgcmVzb3VyY2UKLSAgICAqKiBoYXMgYSBsb2NrIGFuZCBpcyAodGhlcmVmb3JlKSBhIGxvY2tudWxsIHJlc291cmNlLgotICAgICoqCi0gICAgKiogV0FSTklORzogdGhpcyBmdW5jdGlvbiBtYXkgcmV0dXJuIFRSVUUgZXZlbiB3aGVuIHRpbWVkLW91dCBsb2NrcwotICAgICoqICAgICAgICAgIGV4aXN0IChpLmUuIGl0IG1heSBub3QgcGVyZm9ybSB0aW1lb3V0IGNoZWNrcykuCi0gICAgKi8KLSAgICBkYXZfZXJyb3IgKiAoKmhhc19sb2NrcykoZGF2X2xvY2tkYiAqbG9ja2RiLAotCQkJICAgICBjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlLAotCQkJICAgICBpbnQgKmxvY2tzX3ByZXNlbnQpOwotCi0gICAgLyoKLSAgICAqKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBsb2NrKHMpIHRvIHRoZSBzZXQgb2YgbG9ja3Mgb24gdGhpcyByZXNvdXJjZS4KLSAgICAqKgotICAgICoqIElmICJtYWtlX2luZGlyZWN0IiBpcyB0cnVlIChub24temVybyksIHRoZW4gdGhlIHNwZWNpZmllZCBsb2NrKHMpCi0gICAgKiogc2hvdWxkIGJlIGNvbnZlcnRlZCB0byBhbiBpbmRpcmVjdCBsb2NrIChpZiBpdCBpcyBhIGRpcmVjdCBsb2NrKQotICAgICoqIGJlZm9yZSBhcHBlbmRpbmcuIE5vdGUgdGhhdCB0aGUgY29udmVyc2lvbiB0byBhbiBpbmRpcmVjdCBsb2NrIGRvZXMKLSAgICAqKiBub3QgYWx0ZXIgdGhlIHBhc3NlZC1pbiBsb2NrIC0tIHRoZSBjaGFuZ2UgaXMgaW50ZXJuYWwgdGhlCi0gICAgKiogYXBwZW5kX2xvY2tzIGZ1bmN0aW9uLgotICAgICoqCi0gICAgKiogTXVsdGlwbGUgbG9ja3MgYXJlIHNwZWNpZmllZCB1c2luZyB0aGUgbG9jay0+bmV4dCBsaW5rcy4KLSAgICAqLwotICAgIGRhdl9lcnJvciAqICgqYXBwZW5kX2xvY2tzKShkYXZfbG9ja2RiICpsb2NrZGIsCi0JCQkJY29uc3QgZGF2X3Jlc291cmNlICpyZXNvdXJjZSwKLQkJCQlpbnQgbWFrZV9pbmRpcmVjdCwKLQkJCQljb25zdCBkYXZfbG9jayAqbG9jayk7Ci0KLSAgICAvKgotICAgICoqIFJlbW92ZSBhbnkgbG9jayB0aGF0IGhhcyB0aGUgc3BlY2lmaWVkIGxvY2t0b2tlbi4KLSAgICAqKgotICAgICoqIElmIGxvY2t0b2tlbiA9PSBOVUxMLCB0aGVuIEFMTCBsb2NrcyBhcmUgcmVtb3ZlZC4KLSAgICAqLwotICAgIGRhdl9lcnJvciAqICgqcmVtb3ZlX2xvY2spKGRhdl9sb2NrZGIgKmxvY2tkYiwKLQkJCSAgICAgICBjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlLAotCQkJICAgICAgIGNvbnN0IGRhdl9sb2NrdG9rZW4gKmxvY2t0b2tlbik7Ci0KLSAgICAvKgotICAgICoqIFJlZnJlc2ggYWxsIGxvY2tzLCBmb3VuZCBvbiB0aGUgc3BlY2lmaWVkIHJlc291cmNlLCB3aGljaCBoYXMgYQotICAgICoqIGxvY2t0b2tlbiBpbiB0aGUgcHJvdmlkZWQgbGlzdC4KLSAgICAqKgotICAgICoqIElmIHRoZSBsb2NrIGlzIGluZGlyZWN0LCB0aGVuIHRoZSBkaXJlY3QgbG9jayBpcyByZWZlcmVuY2VkIGFuZAotICAgICoqIHJlZnJlc2hlZC4KLSAgICAqKgotICAgICoqIEVhY2ggbG9jayB0aGF0IGlzIHVwZGF0ZWQgaXMgcmV0dXJuZWQgaW4gdGhlIDxsb2Nrcz4gYXJndW1lbnQuCi0gICAgKiogTm90ZSB0aGF0IHRoZSBsb2NrcyB3aWxsIGJlIGZ1bGx5IHJlc29sdmVkLgotICAgICovCi0gICAgZGF2X2Vycm9yICogKCpyZWZyZXNoX2xvY2tzKShkYXZfbG9ja2RiICpsb2NrZGIsCi0JCQkJIGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkJIGNvbnN0IGRhdl9sb2NrdG9rZW5fbGlzdCAqbHRsLAotCQkJCSB0aW1lX3QgbmV3X3RpbWUsCi0JCQkJIGRhdl9sb2NrICoqbG9ja3MpOwotCi0gICAgLyoKLSAgICAqKiBMb29rIHVwIHRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIGxvY2t0b2tlbi4KLSAgICAqKgotICAgICoqIFRoZSBzZWFyY2ggYmVnaW5zIGF0IHRoZSBzcGVjaWZpZWQgPHN0YXJ0X3Jlc291cmNlPiBhbmQgdGhlIGxvY2sKLSAgICAqKiBzcGVjaWZpZWQgYnkgPGxvY2t0b2tlbj4uCi0gICAgKioKLSAgICAqKiBJZiB0aGUgcmVzb3VyY2UvdG9rZW4gc3BlY2lmaWVzIGFuIGluZGlyZWN0IGxvY2ssIHRoZW4gdGhlIGRpcmVjdAotICAgICoqIGxvY2sgd2lsbCBiZSBsb29rZWQgdXAsIGFuZCBUSEFUIHJlc291cmNlIHdpbGwgYmUgcmV0dXJuZWQuIEluIG90aGVyCi0gICAgKiogd29yZHMsIHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgdGhlIHJlc291cmNlIHdoZXJlIGEgcGFydGljdWxhcgotICAgICoqIGxvY2sgKHRva2VuKSB3YXMgYXNzZXJ0ZWQuCi0gICAgKioKLSAgICAqKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIHBvaW50ZXIgaXMgYWxsb3dlZCB0byBiZSBOVUxMLCBpbmRpY2F0aW5nIHRoYXQKLSAgICAqKiAgICAgICB0aGUgcHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHR5cGUgb2YgZnVuY3Rpb25hbGl0eS4gVGhlCi0gICAgKiogICAgICAgY2FsbGVyIHNob3VsZCB0aGVuIHRyYXZlcnNlIHVwIHRoZSByZXBvc2l0b3J5IGhpZXJhcmNoeSBsb29raW5nCi0gICAgKiogICAgICAgZm9yIHRoZSByZXNvdXJjZSBkZWZpbmluZyBhIGxvY2sgd2l0aCB0aGlzIGxvY2t0b2tlbi4KLSAgICAqLwotICAgIGRhdl9lcnJvciAqICgqbG9va3VwX3Jlc291cmNlKShkYXZfbG9ja2RiICpsb2NrZGIsCi0JCQkJICAgY29uc3QgZGF2X2xvY2t0b2tlbiAqbG9ja3Rva2VuLAotCQkJCSAgIGNvbnN0IGRhdl9yZXNvdXJjZSAqc3RhcnRfcmVzb3VyY2UsCi0JCQkJICAgY29uc3QgZGF2X3Jlc291cmNlICoqcmVzb3VyY2UpOwotfTsKLQotLyogd2hhdCB0eXBlcyBvZiByZXNvdXJjZXMgY2FuIGJlIGRpc2NvdmVyZWQgYnkgZGF2X2dldF9yZXNvdXJjZV9zdGF0ZSgpICovCi0jZGVmaW5lIERBVl9SRVNPVVJDRV9MT0NLX05VTEwJMTAJLyogcmVzb3VyY2UgbG9jay1udWxsICovCi0jZGVmaW5lIERBVl9SRVNPVVJDRV9OVUxMCTExCS8qIHJlc291cmNlIG51bGwgKi8KLSNkZWZpbmUgREFWX1JFU09VUkNFX0VYSVNUUwkxMgkvKiByZXNvdXJjZSBleGlzdHMgKi8KLSNkZWZpbmUgREFWX1JFU09VUkNFX0VSUk9SCTEzCS8qIGFuIGVycm9yIG9jY3VycmVkICovCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoqCi0qKiBQUk9QRVJUWSBIQU5ETElORwotKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZGF2X3Byb3BkYiBkYXZfcHJvcGRiOwotCi0KLWRhdl9lcnJvciAqZGF2X29wZW5fcHJvcGRiKAotICAgIHJlcXVlc3RfcmVjICpyLAotICAgIGRhdl9sb2NrZGIgKmxvY2tkYiwKLSAgICBkYXZfcmVzb3VyY2UgKnJlc291cmNlLAotICAgIGludCBybywKLSAgICBhcnJheV9oZWFkZXIgKm5zX3hsYXRlLAotICAgIGRhdl9wcm9wZGIgKipwcm9wZGIpOwotCi12b2lkIGRhdl9jbG9zZV9wcm9wZGIoZGF2X3Byb3BkYiAqZGIpOwotCi1kYXZfZ2V0X3Byb3BzX3Jlc3VsdCBkYXZfZ2V0X3Byb3BzKAotICAgIGRhdl9wcm9wZGIgKmRiLAotICAgIGRhdl94bWxfZG9jICpkb2MpOwotCi1kYXZfZ2V0X3Byb3BzX3Jlc3VsdCBkYXZfZ2V0X2FsbHByb3BzKAotICAgIGRhdl9wcm9wZGIgKmRiLAotICAgIGludCBnZXR2YWxzKTsKLQotLyoKLSoqIDMtcGhhc2UgcHJvcGVydHkgbW9kaWZpY2F0aW9uLgotKioKLSoqICAgMSkgdmFsaWRhdGUgcHJvcHMuIHJlYWRhYmxlPyB1bmxvY2tlZD8gQUNMcyBhbGxvdyBhY2Nlc3M/Ci0qKiAgIDIpIGV4ZWN1dGUgb3BlcmF0aW9uIChzZXQvZGVsZXRlKQotKiogICAzKSBjb21taXQgb3Igcm9sbGJhY2sKLSoqCi0qKiAjIyMgZXZlbnR1YWxseSwgYXV0aCBtdXN0IGJlIGF2YWlsYWJsZS4gYSByZWYgdG8gdGhlIHJlcXVlc3RfcmVjICh3aGljaAotKiogIyMjIGNvbnRhaW5zIHRoZSBhdXRoIGluZm8pIHNob3VsZCBiZSBpbiB0aGUgc2hhcmVkIGNvbnRleHQgc3RydWN0LgotKioKLSoqIEVhY2ggZnVuY3Rpb24gbWF5IGFsdGVyIHRoZSBlcnJvciB2YWx1ZXMgYW5kIGluZm9ybWF0aW9uIGNvbnRhaW5lZCB3aXRoaW4KLSoqIHRoZSBjb250ZXh0IHJlY29yZC4gVGhpcyBzaG91bGQgYmUgZG9uZSBhcyBhbiAiaW5jcmVhc2luZyIgbGV2ZWwgb2YKLSoqIGVycm9yLCByYXRoZXIgdGhhbiBvdmVyd3JpdGluZyBhbnkgcHJldmlvdXMgZXJyb3IuCi0qKgotKiogTm90ZSB0aGF0IGNvbW1pdCgpIGNhbm5vdCBnZW5lcmF0ZSBlcnJvcnMuIEl0IHNob3VsZCBzaW1wbHkgZnJlZSB0aGUKLSoqIHJvbGxiYWNrIGluZm9ybWF0aW9uLgotKioKLSoqIHJvbGxiYWNrKCkgbWF5IGdlbmVyYXRlIGFkZGl0aW9uYWwgZXJyb3JzIGJlY2F1c2UgdGhlIHJvbGxiYWNrIG9wZXJhdGlvbgotKiogY2FuIHNvbWV0aW1lcyBmYWlsKCEpLgotKioKLSoqIFRoZSBjYWxsZXIgc2hvdWxkIGFsbG9jYXRlIGFuIGFycmF5IG9mIHRoZXNlLCBvbmUgcGVyIG9wZXJhdGlvbi4gSXQgc2hvdWxkCi0qKiBiZSB6ZXJvLWluaXRpYWxpemVkLCB0aGVuIHRoZSBkYiwgb3BlcmF0aW9uLCBhbmQgcHJvcCBmaWVsZHMgc2hvdWxkIGJlCi0qKiBmaWxsZWQgaW4gYmVmb3JlIGNhbGxpbmcgZGF2X3Byb3BfdmFsaWRhdGUuIE5vdGUgdGhhdCB0aGUgc2V0L2RlbGV0ZQotKiogb3BlcmF0aW9ucyBhcmUgb3JkZXItZGVwZW5kZW50LiBGb3IgYSBnaXZlbiAobG9naWNhbCkgY29udGV4dCwgdGhlIHNhbWUKLSoqIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gZWFjaCBwaGFzZS4KLSoqCi0qKiBlcnJvcl90eXBlIGlzIGFuIGludGVybmFsIHZhbHVlLCBidXQgd2lsbCBoYXZlIHRoZSBzYW1lIG51bWVyaWMgdmFsdWUKLSoqIGZvciBlYWNoIHBvc3NpYmxlICJkZXNjIiB2YWx1ZS4gVGhpcyBhbGxvd3MgdGhlIGNhbGxlciB0byBncm91cCB0aGUKLSoqIGRlc2NyaXB0aW9ucyB2aWEgdGhlIGVycm9yX3R5cGUgdmFyaWFibGUsIHJhdGhlciB0aGFuIHRocm91Z2ggc3RyaW5nCi0qKiBjb21wYXJpc29ucy4gTm90ZSB0aGF0ICJzdGF0dXMiIGRvZXMgbm90IHByb3ZpZGUgZW5vdWdoIGdyYW51bGFyaXR5IHRvCi0qKiBkaWZmZXJlbnRpYXRlL2dyb3VwIHRoZSAiZGVzYyIgdmFsdWVzLgotKioKLSoqIE5vdGUgdGhhdCB0aGUgcHJvcGRiIHdpbGwgbWFpbnRhaW4gc29tZSAoZ2xvYmFsKSBjb250ZXh0IGFjcm9zcyBhbGwKLSoqIG9mIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgY29udGV4dHMuIFRoaXMgaW1wbGllcyB0aGF0IHlvdSBjYW4gaGF2ZSBvbmx5Ci0qKiBvbmUgb3BlbiB0cmFuc2FjdGlvbiBwZXIgcHJvcGRiLgotKi8KLXR5cGVkZWYgc3RydWN0IGRhdl9wcm9wX2N0eAotewotICAgIGRhdl9wcm9wZGIgKnByb3BkYjsKLQotICAgIGludCBvcGVyYXRpb247Ci0jZGVmaW5lIERBVl9QUk9QX09QX1NFVAkJMQkvKiBzZXQgYSBwcm9wZXJ0eSB2YWx1ZSAqLwotI2RlZmluZSBEQVZfUFJPUF9PUF9ERUxFVEUJMgkvKiBkZWxldGUgYSBwcm9wIHZhbHVlICovCi0vKiAjIyMgYWRkIGEgR0VUPyAqLwotCi0gICAgZGF2X3htbF9lbGVtICpwcm9wOwkJCS8qIHByb3BlcnR5IHRvIGFmZmVjdCAqLwotCi0gICAgZGF2X2Vycm9yICplcnI7CQkJLyogZXJyb3IgKGlmIGFueSkgKi8KLQotICAgIC8qIHByaXZhdGUgaXRlbXMgdG8gdGhlIHByb3BkYiAqLwotICAgIGludCBpc19saXZlcHJvcDsKLSAgICB2b2lkICpsaXZlcHJvcF9jdHg7Ci0gICAgc3RydWN0IGRhdl9yb2xsYmFja19pdGVtICpyb2xsYmFjazsJLyogb3B0aW9uYWwgcm9sbGJhY2sgaW5mbyAqLwotCi0gICAgLyogcHJpdmF0ZSB0byBtb2RfZGF2LmMgKi8KLSAgICByZXF1ZXN0X3JlYyAqcjsKLQotfSBkYXZfcHJvcF9jdHg7Ci0KLXZvaWQgZGF2X3Byb3BfdmFsaWRhdGUoZGF2X3Byb3BfY3R4ICpjdHgpOwotdm9pZCBkYXZfcHJvcF9leGVjKGRhdl9wcm9wX2N0eCAqY3R4KTsKLXZvaWQgZGF2X3Byb3BfY29tbWl0KGRhdl9wcm9wX2N0eCAqY3R4KTsKLXZvaWQgZGF2X3Byb3Bfcm9sbGJhY2soZGF2X3Byb3BfY3R4ICpjdHgpOwotCi0jZGVmaW5lIERBVl9QUk9QX0NUWF9IQVNfRVJSKGRwYykJKChkcGMpLmVyciAmJiAoZHBjKS5lcnItPnN0YXR1cyA+PSAzMDApCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoqCi0qKiBXQUxLRVIgU1RSVUNUVVJFCi0qLwotCi0vKiBwcml2YXRlLCBvcGFxdWUgaW5mbyBzdHJ1Y3R1cmUgZm9yIHJlcG9zaXRvcnkgd2Fsa2luZyBjb250ZXh0ICovCi10eXBlZGVmIHN0cnVjdCBkYXZfd2Fsa2VyX3ByaXZhdGUgZGF2X3dhbGtlcl9wcml2YXRlOwotCi0vKiBkaXJlY3RvcnkgdHJlZSB3YWxraW5nIGNvbnRleHQgKi8KLXR5cGVkZWYgc3RydWN0IGRhdl93YWxrZXJfY3R4Ci17Ci0gICAgaW50IHdhbGtfdHlwZTsKLSNkZWZpbmUgREFWX1dBTEtUWVBFX0FVVEgJMQkvKiBsaW1pdCB0byBhdXRob3JpemVkIGZpbGVzICovCi0jZGVmaW5lIERBVl9XQUxLVFlQRV9BTEwJMgkvKiB3YWxrIG5vcm1hbCBmaWxlcyAqLwotI2RlZmluZSBEQVZfV0FMS1RZUEVfSElEREVOCTQJLyogd2FsayBoaWRkZW4gZmlsZXMgKi8KLSNkZWZpbmUgREFWX1dBTEtUWVBFX0xPQ0tOVUxMCTgJLyogd2FsayBsb2NrbnVsbCByZXNvdXJjZXMgKi8KLQotICAgIGludCBwb3N0Zml4OwkJLyogY2FsbCBmdW5jIGZvciBkaXJzIGFmdGVyIGZpbGVzICovCi0KLSAgICBkYXZfZXJyb3IgKiAoKmZ1bmMpKHN0cnVjdCBkYXZfd2Fsa2VyX2N0eCAqY3R4LCBpbnQgY2FsbHR5cGUpOwotI2RlZmluZSBEQVZfQ0FMTFRZUEVfTUVNQkVSCTEJLyogY2FsbGVkIGZvciBhIG1lbWJlciByZXNvdXJjZSAqLwotI2RlZmluZSBEQVZfQ0FMTFRZUEVfQ09MTEVDVElPTgkyCS8qIGNhbGxlZCBmb3IgYSBjb2xsZWN0aW9uICovCi0jZGVmaW5lIERBVl9DQUxMVFlQRV9MT0NLTlVMTAkzCS8qIGNhbGxlZCBmb3IgYSBsb2NrbnVsbCByZXNvdXJjZSAqLwotI2RlZmluZSBEQVZfQ0FMTFRZUEVfUE9TVEZJWAk0CS8qIHBvc3RmaXggY2FsbCBmb3IgYSBjb2xsZWN0aW9uICovCi0KLSAgICBzdHJ1Y3QgcG9vbCAqcG9vbDsKLQotICAgIHJlcXVlc3RfcmVjICpyOwkJCS8qIG9yaWdpbmFsIHJlcXVlc3QgKi8KLSAgICBkYXZfYnVmZmVyIHVyaTsJCQkvKiBjdXJyZW50IFVSSSAqLwotICAgIGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzb3VyY2U7CS8qIGN1cnJlbnQgcmVzb3VyY2UgKi8KLSAgICBjb25zdCBkYXZfcmVzb3VyY2UgKnJlczI7CQkvKiBvcHRpb25hbCBzZWNvbmRhcnkgcmVzb3VyY2UgKi8KLQotICAgIGNvbnN0IGRhdl9yZXNvdXJjZSAqcm9vdDsJCS8qIFJPOiByb290IHJlc291cmNlIG9mIHRoZSB3YWxrICovCi0KLSAgICBkYXZfbG9ja2RiICpsb2NrZGI7Ci0KLSAgICBkYXZfcmVzcG9uc2UgKnJlc3BvbnNlOwkJLyogT1VUOiBtdWx0aXN0YXR1cyByZXNwb25zZXMgKi8KLQotICAgIC8qIGZvciBQUk9QRklORCBvcGVyYXRpb25zICovCi0gICAgZGF2X3htbF9kb2MgKmRvYzsKLSAgICBpbnQgcHJvcGZpbmRfdHlwZTsKLSNkZWZpbmUgREFWX1BST1BGSU5EX0lTX0FMTFBST1AJCTEKLSNkZWZpbmUgREFWX1BST1BGSU5EX0lTX1BST1BOQU1FCTIKLSNkZWZpbmUgREFWX1BST1BGSU5EX0lTX1BST1AJCTMKLQotICAgIGRhdl90ZXh0ICpwcm9wc3RhdF80MDQ7CS8qIChjYWNoZWQpIHByb3BzdGF0IGdpdmluZyBhIDQwNCBlcnJvciAqLwotCi0gICAgLyogZm9yIENPUFkgYW5kIE1PVkUgb3BlcmF0aW9ucyAqLwotICAgIGludCBpc19tb3ZlOwotICAgIGRhdl9idWZmZXIgd29ya19idWY7Ci0KLSAgICBjb25zdCBkYXZfaWZfaGVhZGVyICppZl9oZWFkZXI7CS8qIGZvciB2YWxpZGF0aW9uICovCi0gICAgY29uc3QgZGF2X2xvY2t0b2tlbiAqbG9ja3Rva2VuOwkvKiBmb3IgVU5MT0NLICovCi0gICAgY29uc3QgZGF2X2xvY2sgKmxvY2s7CQkvKiBmb3IgTE9DSyAqLwotICAgIGludCBza2lwX3Jvb3Q7CQkJLyogZm9yIGRhdl9pbmhlcml0X2xvY2tzKCkgKi8KLQotICAgIGludCBmbGFnczsKLQotICAgIGRhdl93YWxrZXJfcHJpdmF0ZSAqaW5mbzsgICAgICAgICAgIC8qIGZvciB1c2UgYnkgcmVwb3NpdG9yeSBtYW5hZ2VyICovCi0KLX0gZGF2X3dhbGtlcl9jdHg7Ci0KLXZvaWQgZGF2X2FkZF9yZXNwb25zZShkYXZfd2Fsa2VyX2N0eCAqY3R4LCBjb25zdCBjaGFyICpocmVmLCBpbnQgc3RhdHVzLAotCQkgICAgICBkYXZfZ2V0X3Byb3BzX3Jlc3VsdCAqcHJvcHN0YXRzKTsKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKioKLSoqICJTVFJFQU0iIFNUUlVDVFVSRQotKioKLSoqIG1vZF9kYXYgdXNlcyB0aGlzIGFic3RyYWN0aW9uIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSByZXBvc2l0b3J5Ci0qKiB3aGlsZSBmZXRjaGluZy9zdG9yaW5nIHJlc291cmNlcy4gbW9kX2RhdiB2aWV3cyByZXNvdXJjZXMgYXMgYSBzdHJlYW0KLSoqIG9mIGJ5dGVzLgotKioKLSoqIE5vdGUgdGhhdCB0aGUgc3RydWN0dXJlIGlzIG9wYXF1ZSAtLSBpdCBpcyBwcml2YXRlIHRvIHRoZSByZXBvc2l0b3J5Ci0qKiB0aGF0IGNyZWF0ZWQgdGhlIHN0cmVhbSBpbiB0aGUgcmVwb3NpdG9yeSdzICJvcGVuIiBmdW5jdGlvbi4KLSovCi0KLXR5cGVkZWYgc3RydWN0IGRhdl9zdHJlYW0gZGF2X3N0cmVhbTsKLQotdHlwZWRlZiBlbnVtIHsKLSAgICBEQVZfTU9ERV9SRUFELAkJLyogb3BlbiBmb3IgcmVhZGluZyAqLwotICAgIERBVl9NT0RFX1JFQURfU0VFS0FCTEUsCS8qIG9wZW4gZm9yIHJhbmRvbSBhY2Nlc3MgcmVhZGluZyAqLwotICAgIERBVl9NT0RFX1dSSVRFX1RSVU5DLAkvKiB0cnVuY2F0ZSBhbmQgb3BlbiBmb3Igd3JpdGluZyAqLwotICAgIERBVl9NT0RFX1dSSVRFX1NFRUtBQkxFCS8qIG9wZW4gZm9yIHdyaXRpbmc7IHJhbmRvbSBhY2Nlc3MgKi8KLX0gZGF2X3N0cmVhbV9tb2RlOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKioKLSoqIFJFUE9TSVRPUlkgRlVOQ1RJT05TCi0qLwotCi0vKiBSZXBvc2l0b3J5IHByb3ZpZGVyIGhvb2tzICovCi1zdHJ1Y3QgZGF2X2hvb2tzX3JlcG9zaXRvcnkKLXsKLSAgICAvKiBGbGFnIGZvciB3aGV0aGVyIHJlcG9zaXRvcnkgcmVxdWlyZXMgc3BlY2lhbCBHRVQgaGFuZGxpbmcuCi0gICAgICogSWYgcmVzb3VyY2VzIGluIHRoZSByZXBvc2l0b3J5IGFyZSBub3QgdmlzaWJsZSBpbiB0aGUKLSAgICAgKiBmaWxlc3lzdGVtIGxvY2F0aW9uIHdoaWNoIFVSTHMgbWFwIHRvLCB0aGVuIHNwZWNpYWwgaGFuZGxpbmcKLSAgICAgKiBpcyByZXF1aXJlZCB0byBmaXJzdCBmZXRjaCBhIHJlc291cmNlIGZyb20gdGhlIHJlcG9zaXRvcnksCi0gICAgICogcmVzcG9uZCB0byB0aGUgR0VUIHJlcXVlc3QsIHRoZW4gZnJlZSB0aGUgcmVzb3VyY2UgY29weS4KLSAgICAgKi8KLSAgICBpbnQgaGFuZGxlX2dldDsKLQotICAgIC8qIEdldCBhIHJlc291cmNlIGRlc2NyaXB0b3IgZm9yIHRoZSBVUkkgaW4gYSByZXF1ZXN0LgotICAgICAqIEEgZGVzY3JpcHRvciBpcyByZXR1cm5lZCBldmVuIGlmIHRoZSByZXNvdXJjZSBkb2VzIG5vdCBleGlzdC4KLSAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIHNob3VsZCBvbmx5IGJlIE5VTEwgZm9yIHNvbWUga2luZCBvZiBmYXRhbCBlcnJvci4KLSAgICAgKgotICAgICAqIFRoZSByb290X2RpciBpcyB0aGUgcm9vdCBvZiB0aGUgZGlyZWN0b3J5IGZvciB3aGljaCB0aGlzIHJlcG9zaXRvcnkKLSAgICAgKiBpcyBjb25maWd1cmVkLgotICAgICAqIFRoZSB3b3Jrc3BhY2UgaXMgdGhlIHZhbHVlIG9mIGFueSBUYXJnZXQtU2VsZWN0b3IgaGVhZGVyLCBvciBOVUxMCi0gICAgICogaWYgdGhlcmUgaXMgbm9uZS4KLSAgICAgKgotICAgICAqIFRoZSBwcm92aWRlciBtYXkgYXNzb2NpYXRlIHRoZSByZXF1ZXN0IHN0b3JhZ2UgcG9vbCB3aXRoIHRoZSByZXNvdXJjZSwKLSAgICAgKiB0byB1c2UgaW4gb3RoZXIgb3BlcmF0aW9ucyBvbiB0aGF0IHJlc291cmNlLgotICAgICAqLwotICAgIGRhdl9yZXNvdXJjZSAqICgqZ2V0X3Jlc291cmNlKSgKLSAgICAgICAgcmVxdWVzdF9yZWMgKnIsCi0gICAgICAgIGNvbnN0IGNoYXIgKnJvb3RfZGlyLAotICAgICAgICBjb25zdCBjaGFyICp3b3Jrc3BhY2UKLSAgICApOwotCi0gICAgLyogR2V0IGEgcmVzb3VyY2UgZGVzY3JpcHRvciBmb3IgdGhlIHBhcmVudCBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi0gICAgICogVGhlIHJlc291cmNlcyBuZWVkIG5vdCBleGlzdC4gIE5VTEwgaXMgcmV0dXJuZWQgaWYgdGhlIHJlc291cmNlIAotICAgICAqIGlzIHRoZSByb290IGNvbGxlY3Rpb24uCi0gICAgICovCi0gICAgZGF2X3Jlc291cmNlICogKCpnZXRfcGFyZW50X3Jlc291cmNlKSgKLSAgICAgICAgY29uc3QgZGF2X3Jlc291cmNlICpyZXNvdXJjZQotICAgICk7Ci0KLSAgICAvKiBEZXRlcm1pbmUgd2hldGhlciB0d28gcmVzb3VyY2UgZGVzY3JpcHRvcnMgcmVmZXIgdG8gdGhlIHNhbWUgcmVzb3VyY2UuCi0gICAgKgotICAgICAqIFJlc3VsdCAhPSAwID0+IHRoZSByZXNvdXJjZXMgYXJlIHRoZSBzYW1lLgotICAgICAqLwotICAgIGludCAoKmlzX3NhbWVfcmVzb3VyY2UpKAotICAgICAgICBjb25zdCBkYXZfcmVzb3VyY2UgKnJlczEsCi0gICAgICAgIGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzMgotICAgICk7Ci0KLSAgICAvKiBEZXRlcm1pbmUgd2hldGhlciBvbmUgcmVzb3VyY2UgaXMgYSBwYXJlbnQgKGltbWVkaWF0ZSBvciBvdGhlcndpc2UpCi0gICAgICogb2YgYW5vdGhlci4KLSAgICAgKgotICAgICAqIFJlc3VsdCAhPSAwID0+IHJlczEgaXMgYSBwYXJlbnQgb2YgcmVzMi4KLSAgICAgKi8KLSAgICBpbnQgKCppc19wYXJlbnRfcmVzb3VyY2UpKAotICAgICAgICBjb25zdCBkYXZfcmVzb3VyY2UgKnJlczEsCi0gICAgICAgIGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzMgotICAgICk7Ci0KLSAgICAvKgotICAgICoqIE9wZW4gYSBzdHJlYW0gZm9yIHRoaXMgcmVzb3VyY2UsIHVzaW5nIHRoZSBzcGVjaWZpZWQgbW9kZS4gVGhlCi0gICAgKiogc3RyZWFtIHdpbGwgYmUgcmV0dXJuZWQgaW4gKnN0cmVhbS4KLSAgICAqLwotICAgIGRhdl9lcnJvciAqICgqb3Blbl9zdHJlYW0pKGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkgICAgICAgZGF2X3N0cmVhbV9tb2RlIG1vZGUsCi0JCQkgICAgICAgZGF2X3N0cmVhbSAqKnN0cmVhbSk7Ci0KLSAgICAvKgotICAgICoqIENsb3NlIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotICAgICoqCi0gICAgKiogbW9kX2RhdiB3aWxsIChpZGVhbGx5KSBtYWtlIHN1cmUgdG8gY2FsbCB0aGlzLiBGb3Igc2FmZXR5IHB1cnBvc2VzLAotICAgICoqIGEgcHJvdmlkZXIgc2hvdWxkIChpZGVhbGx5KSByZWdpc3RlciBhIGNsZWFudXAgZnVuY3Rpb24gd2l0aCB0aGUKLSAgICAqKiByZXF1ZXN0IHBvb2wgdG8gZ2V0IHRoaXMgY2xvc2VkIGFuZCBjbGVhbmVkIHVwLgotICAgICoqCi0gICAgKiogTm90ZSB0aGUgcG9zc2liaWxpdHkgb2YgYW4gZXJyb3IgZnJvbSB0aGUgY2xvc2UgLS0gaXQgaXMgZW50aXJlbHkKLSAgICAqKiBmZWFzaWJsZSB0aGF0IHRoZSBjbG9zZSBkb2VzIGEgImNvbW1pdCIgb2Ygc29tZSBraW5kLCB3aGljaCBjYW4KLSAgICAqKiBwcm9kdWNlIGFuIGVycm9yLgotICAgICoqCi0gICAgKiogY29tbWl0IHNob3VsZCBiZSBUUlVFIChub24temVybykgb3IgRkFMU0UgKDApIGlmIHRoZSBzdHJlYW0gd2FzCi0gICAgKiogb3BlbmVkIGZvciB3cml0aW5nLiBUaGlzIGZsYWcgc3RhdGVzIHdoZXRoZXIgdG8gcmV0YWluIHRoZSBmaWxlCi0gICAgKiogb3Igbm90LgotICAgICoqIE5vdGU6IHRoZSBjb21taXQgZmxhZyBpcyBpZ25vcmVkIGZvciBzdHJlYW1zIG9wZW5lZCBmb3IgcmVhZGluZy4KLSAgICAqLwotICAgIGRhdl9lcnJvciAqICgqY2xvc2Vfc3RyZWFtKShkYXZfc3RyZWFtICpzdHJlYW0sIGludCBjb21taXQpOwotCi0gICAgLyoKLSAgICAqKiBSZWFkIGRhdGEgZnJvbSB0aGUgc3RyZWFtLgotICAgICoqCi0gICAgKiogVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBpcyBwYXNzZWQgaW4gKmJ1ZnNpemUsIGFuZCB0aGUgYW1vdW50IHJlYWQKLSAgICAqKiBpcyByZXR1cm5lZCBpbiAqYnVmc2l6ZS4KLSAgICAqKgotICAgICoqICpidWZzaXplIHNob3VsZCBiZSBzZXQgdG8gemVybyB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkLgotICAgICoqIEFzIGEgY29yb2xsYXJ5LCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBhbHdheXMgcmVhZCBhdCBsZWFzdCBvbmUgYnl0ZQotICAgICoqIG9uIGVhY2ggY2FsbCwgdW50aWwgdGhlIEVPRiBjb25kaXRpb24gaXMgbWV0LgotICAgICovCi0gICAgZGF2X2Vycm9yICogKCpyZWFkX3N0cmVhbSkoZGF2X3N0cmVhbSAqc3RyZWFtLAotCQkJICAgICAgIHZvaWQgKmJ1Ziwgc2l6ZV90ICpidWZzaXplKTsKLQotICAgIC8qCi0gICAgKiogV3JpdGUgZGF0YSB0byB0aGUgc3RyZWFtLgotICAgICoqCi0gICAgKiogQWxsIG9mIHRoZSBieXRlcyBtdXN0IGJlIHdyaXR0ZW4sIG9yIGFuIGVycm9yIHNob3VsZCBiZSByZXR1cm5lZC4KLSAgICAqLwotICAgIGRhdl9lcnJvciAqICgqd3JpdGVfc3RyZWFtKShkYXZfc3RyZWFtICpzdHJlYW0sCi0JCQkJY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgYnVmc2l6ZSk7Ci0KLSAgICAvKgotICAgICoqIFNlZWsgdG8gYW4gYWJzb2x1dGUgcG9zaXRpb24gaW4gdGhlIHN0cmVhbS4gVGhpcyBpcyB1c2VkIHRvIHN1cHBvcnQKLSAgICAqKiBDb250ZW50LVJhbmdlIGluIGEgR0VUL1BVVC4KLSAgICAqKgotICAgICoqIE5PVEU6IGlmIHRoaXMgZnVuY3Rpb24gaXMgTlVMTCAod2hpY2ggaXMgYWxsb3dlZCksIHRoZW4gYW55Ci0gICAgKiogICAgICAgb3BlcmF0aW9ucyB1c2luZyBDb250ZW50LVJhbmdlIHdpbGwgYmUgcmVmdXNlZC4KLSAgICAqLwotICAgIGRhdl9lcnJvciAqICgqc2Vla19zdHJlYW0pKGRhdl9zdHJlYW0gKnN0cmVhbSwgb2ZmX3QgYWJzX3Bvc2l0aW9uKTsKLQotICAgIC8qCi0gICAgKiogSWYgYSBHRVQgaXMgcHJvY2Vzc2VkIHVzaW5nIGEgc3RyZWFtIChvcGVuX3N0cmVhbSwgcmVhZF9zdHJlYW0pCi0gICAgKiogcmF0aGVyIHRoYW4gdmlhIGEgc3ViLXJlcXVlc3QgKG9uIGdldF9wYXRobmFtZSksIHRoZW4gdGhpcyBmdW5jdGlvbgotICAgICoqIGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgcmVwb3NpdG9yeSB3aXRoIGEgd2F5IHRvIHNldCB0aGUgaGVhZGVycwotICAgICoqIGluIHRoZSByZXNwb25zZS4KLSAgICAqKgotICAgICoqIEl0IG1heSBiZSBOVUxMIGlmIGdldF9wYXRobmFtZSBpcyBwcm92aWRlZC4KLSAgICAqLwotICAgIGRhdl9lcnJvciAqICgqc2V0X2hlYWRlcnMpKHJlcXVlc3RfcmVjICpyLAotCQkJICAgICAgIGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UpOwotCi0gICAgLyogR2V0IGEgcGF0aG5hbWUgZm9yIHRoZSBmaWxlIHJlcHJlc2VudGVkIGJ5IHRoZSByZXNvdXJjZSBkZXNjcmlwdG9yLgotICAgICAqIEEgcHJvdmlkZXIgbWF5IG5lZWQgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IGNvcHkgb2YgdGhlIGZpbGUsIGlmIGl0IGlzCi0gICAgICogbm90IGRpcmVjdGx5IGFjY2Vzc2libGUgaW4gYSBmaWxlc3lzdGVtLiBmcmVlX2hhbmRsZV9wIHdpbGwgYmUgc2V0IGJ5Ci0gICAgICogdGhlIHByb3ZpZGVyIHRvIHBvaW50IHRvIGluZm9ybWF0aW9uIG5lZWRlZCB0byBjbGVhbiB1cCBhbnkgdGVtcG9yYXJ5Ci0gICAgICogc3RvcmFnZSB1c2VkLgotICAgICAqCi0gICAgICogUmV0dXJucyBOVUxMIGlmIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSBtYWRlIGFjY2Vzc2libGUuCi0gICAgICovCi0gICAgY29uc3QgY2hhciAqICgqZ2V0X3BhdGhuYW1lKSgKLSAgICAgICAgY29uc3QgZGF2X3Jlc291cmNlICpyZXNvdXJjZSwKLSAgICAgICAgdm9pZCAqKmZyZWVfaGFuZGxlX3AKLSAgICApOwotCi0gICAgLyogRnJlZSBhbnkgdGVtcG9yYXJ5IHN0b3JhZ2UgYXNzb2NpYXRlZCB3aXRoIGEgZmlsZSBtYWRlIGFjY2Vzc2libGUgYnkKLSAgICAgKiBnZXRfcGF0aG5hbWUoKS4KLSAgICAgKi8KLSAgICB2b2lkICgqZnJlZV9maWxlKSgKLSAgICAgICAgdm9pZCAqZnJlZV9oYW5kbGUKLSAgICApOwotCi0gICAgLyogQ3JlYXRlIGEgY29sbGVjdGlvbiByZXNvdXJjZS4gVGhlIHJlc291cmNlIG11c3Qgbm90IGFscmVhZHkgZXhpc3QuCi0gICAgICoKLSAgICAgKiBSZXN1bHQgPT0gTlVMTCBpZiB0aGUgY29sbGVjdGlvbiB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuIEFsc28sIHRoZQotICAgICAqIHJlc291cmNlIG9iamVjdCBpcyB1cGRhdGVkIHRvIHJlZmxlY3QgdGhhdCB0aGUgcmVzb3VyY2UgZXhpc3RzLCBhbmQKLSAgICAgKiBpcyBhIGNvbGxlY3Rpb24uCi0gICAgICovCi0gICAgZGF2X2Vycm9yICogKCpjcmVhdGVfY29sbGVjdGlvbikoCi0gICAgICAgIHBvb2wgKnAsIGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UKLSAgICApOwotCi0gICAgLyogQ29weSBvbmUgcmVzb3VyY2UgdG8gYW5vdGhlci4gVGhlIGRlc3RpbmF0aW9uIG11c3Qgbm90IGV4aXN0LgotICAgICAqIEhhbmRsZXMgYm90aCBmaWxlcyBhbmQgY29sbGVjdGlvbnMuIFByb3BlcnRpZXMgYXJlIGNvcGllZCBhcyB3ZWxsLgotICAgICAqIFRoZSBkZXB0aCBhcmd1bWVudCBpcyBpZ25vcmVkIGZvciBhIGZpbGUsIGFuZCBjYW4gYmUgZWl0aGVyIDAgb3IKLSAgICAgKiBEQVZfSU5GSU5JVFkgZm9yIGEgY29sbGVjdGlvbi4KLSAgICAgKiBJZiBhbiBlcnJvciBvY2N1cnMgaW4gYSBjaGlsZCByZXNvdXJjZSwgdGhlbiB0aGUgcmV0dXJuIHZhbHVlIGlzCi0gICAgICogbm9uLU5VTEwsIGFuZCAqcmVzcG9uc2UgaXMgc2V0IHRvIGEgbXVsdGlzdGF0dXMgcmVzcG9uc2UuCi0gICAgICogSWYgdGhlIGNvcHkgaXMgc3VjY2Vzc2Z1bCwgdGhlIGRzdCByZXNvdXJjZSBvYmplY3QgaXMKLSAgICAgKiB1cGRhdGVkIHRvIHJlZmxlY3QgdGhhdCB0aGUgcmVzb3VyY2UgZXhpc3RzLgotICAgICAqLwotICAgIGRhdl9lcnJvciAqICgqY29weV9yZXNvdXJjZSkoCi0gICAgICAgIGNvbnN0IGRhdl9yZXNvdXJjZSAqc3JjLAotICAgICAgICBkYXZfcmVzb3VyY2UgKmRzdCwKLQlpbnQgZGVwdGgsCi0gICAgICAgIGRhdl9yZXNwb25zZSAqKnJlc3BvbnNlCi0gICAgKTsKLQotICAgIC8qIE1vdmUgb25lIHJlc291cmNlIHRvIGFub3RoZXIuIFRoZSBkZXN0aW5hdGlvbiBtdXN0IG5vdCBleGlzdC4KLSAgICAgKiBIYW5kbGVzIGJvdGggZmlsZXMgYW5kIGNvbGxlY3Rpb25zLiBQcm9wZXJ0aWVzIGFyZSBtb3ZlZCBhcyB3ZWxsLgotICAgICAqIElmIGFuIGVycm9yIG9jY3VycyBpbiBhIGNoaWxkIHJlc291cmNlLCB0aGVuIHRoZSByZXR1cm4gdmFsdWUgaXMKLSAgICAgKiBub24tTlVMTCwgYW5kICpyZXNwb25zZSBpcyBzZXQgdG8gYSBtdWx0aXN0YXR1cyByZXNwb25zZS4KLSAgICAgKiBJZiB0aGUgbW92ZSBpcyBzdWNjZXNzZnVsLCB0aGUgc3JjIGFuZCBkc3QgcmVzb3VyY2Ugb2JqZWN0cyBhcmUKLSAgICAgKiB1cGRhdGVkIHRvIHJlZmxlY3QgdGhhdCB0aGUgc291cmNlIG5vIGxvbmdlciBleGlzdHMsIGFuZCB0aGUKLSAgICAgKiBkZXN0aW5hdGlvbiBkb2VzLgotICAgICAqLwotICAgIGRhdl9lcnJvciAqICgqbW92ZV9yZXNvdXJjZSkoCi0gICAgICAgIGRhdl9yZXNvdXJjZSAqc3JjLAotICAgICAgICBkYXZfcmVzb3VyY2UgKmRzdCwKLSAgICAgICAgZGF2X3Jlc3BvbnNlICoqcmVzcG9uc2UKLSAgICApOwotCi0gICAgLyogUmVtb3ZlIGEgcmVzb3VyY2UuIEhhbmRsZXMgYm90aCBmaWxlcyBhbmQgY29sbGVjdGlvbnMuCi0gICAgICogUmVtb3ZlcyBhbnkgYXNzb2NpYXRlZCBwcm9wZXJ0aWVzIGFzIHdlbGwuCi0gICAgICogSWYgYW4gZXJyb3Igb2NjdXJzIGluIGEgY2hpbGQgcmVzb3VyY2UsIHRoZW4gdGhlIHJldHVybiB2YWx1ZSBpcwotICAgICAqIG5vbi1OVUxMLCBhbmQgKnJlc3BvbnNlIGlzIHNldCB0byBhIG11bHRpc3RhdHVzIHJlc3BvbnNlLgotICAgICAqIElmIHRoZSBkZWxldGUgaXMgc3VjY2Vzc2Z1bCwgdGhlIHJlc291cmNlIG9iamVjdCBpcyB1cGRhdGVkIHRvCi0gICAgICogcmVmbGVjdCB0aGF0IHRoZSByZXNvdXJjZSBubyBsb25nZXIgZXhpc3RzLgotICAgICAqLwotICAgIGRhdl9lcnJvciAqICgqcmVtb3ZlX3Jlc291cmNlKSgKLSAgICAgICAgZGF2X3Jlc291cmNlICpyZXNvdXJjZSwKLSAgICAgICAgZGF2X3Jlc3BvbnNlICoqcmVzcG9uc2UKLSAgICApOwotCi0gICAgLyogV2FsayBhIHJlc291cmNlIGhpZXJhcmNoeS4KLSAgICAgKgotICAgICAqIEl0ZXJhdGVzIG92ZXIgdGhlIHJlc291cmNlIGhpZXJhcmNoeSBzcGVjaWZpZWQgYnkgd2N0eC0+cmVzb3VyY2UuCi0gICAgICogUGFyYW1ldGVyIGZvciBjb250cm9sIG9mIHRoZSB3YWxrIGFuZCB0aGUgY2FsbGJhY2sgYXJlIHNwZWNpZmllZAotICAgICAqIGJ5IHdjdHguCi0gICAgICoKLSAgICAgKiBBbiBIVFRQXyogc3RhdHVzIGNvZGUgaXMgcmV0dXJuZWQgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUKLSAgICAgKiB3YWxrIG9yIHRoZSBjYWxsYmFjayBpbmRpY2F0ZXMgYW4gZXJyb3IuIE9LIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MuCi0gICAgICovCi0gICAgZGF2X2Vycm9yICogKCp3YWxrKShkYXZfd2Fsa2VyX2N0eCAqd2N0eCwgaW50IGRlcHRoKTsKLQotICAgIC8qIEdldCB0aGUgZW50aXR5IHRhZyBmb3IgYSByZXNvdXJjZSAqLwotICAgIGNvbnN0IGNoYXIgKiAoKmdldGV0YWcpKGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UpOwotfTsKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKioKLSoqIFZFUlNJT05JTkcgRlVOQ1RJT05TCi0qLwotCi0vKiBkYXZfZ2V0X3RhcmdldF9zZWxlY3RvcjoKLSAqCi0gKiBSZXR1cm5zIGFueSBUYXJnZXQtU2VsZWN0b3IgaGVhZGVyIGluIGEgcmVxdWVzdAotICogKHVzZWQgYnkgdmVyc2lvbmluZyBjbGllbnRzKQotICovCi1jb25zdCBjaGFyICpkYXZfZ2V0X3RhcmdldF9zZWxlY3RvcihyZXF1ZXN0X3JlYyAqcik7Ci0KLS8qIEVuc3VyZSB0aGF0IGEgcmVzb3VyY2UgaXMgd3JpdGFibGUuIElmIHRoZXJlIGlzIG5vIHZlcnNpb25pbmcKLSAqIHByb3ZpZGVyLCB0aGVuIHRoaXMgaXMgZXNzZW50aWFsbHkgYSBuby1vcC4gVmVyc2lvbmluZyByZXBvc2l0b3JpZXMKLSAqIHJlcXVpcmUgZXhwbGljaXQgcmVzb3VyY2UgY3JlYXRpb24gYW5kIGNoZWNrb3V0IGJlZm9yZSB0aGV5IGNhbgotICogYmUgd3JpdHRlbiB0by4gSWYgYSBuZXcgcmVzb3VyY2UgaXMgdG8gYmUgY3JlYXRlZCwgb3IgYW4gZXhpc3RpbmcKLSAqIHJlc291cmNlIGRlbGV0ZWQsIHRoZSBwYXJlbnQgY29sbGVjdGlvbiBtdXN0IGJlIGNoZWNrZWQgb3V0IGFzIHdlbGwuCi0gKgotICogU2V0IHRoZSBwYXJlbnRfb25seSBmbGFnIHRvIG9ubHkgbWFrZSB0aGUgcGFyZW50IGNvbGxlY3Rpb24gd3JpdGFibGUuCi0gKiBPdGhlcndpc2UsIGJvdGggcGFyZW50IGFuZCBjaGlsZCBhcmUgbWFkZSB3cml0YWJsZSBhcyBuZWVkZWQuIElmIHRoZQotICogY2hpbGQgZG9lcyBub3QgZXhpc3QsIHRoZW4gYSBuZXcgdmVyc2lvbmVkIHJlc291cmNlIGlzIGNyZWF0ZWQgYW5kCi0gKiBjaGVja2VkIG91dC4KLSAqCi0gKiBUaGUgcGFyZW50X3Jlc291cmNlIGFuZCBwYXJlbnRfd2FzX3dyaXRhYmxlIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwKLSAqIChpLmUuIHRoZXkgbWF5IGJlIE5VTEwpLiBJZiBwYXJlbnRfb25seSBpcyBzZXQsIHRoZW4gdGhlCi0gKiByZXNvdXJjZV9leGlzdGVkIGFuZCByZXNvdXJjZV93YXNfd3JpdGFibGUgYXJndW1lbnRzIGFyZSBpZ25vcmVkLgotICoKLSAqIFRoZSBwcmV2aW91cyBzdGF0ZXMgb2YgdGhlIHJlc291cmNlcyBhcmUgcmV0dXJuZWQsIHNvIHRoZXkgY2FuIGJlCi0gKiByZXN0b3JlZCBhZnRlciB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcyAoc2VlCi0gKiBkYXZfcmV2ZXJ0X3Jlc291cmNlX3dyaXRhYmlsaXR5KCkpCi0gKi8KLWRhdl9lcnJvciAqZGF2X2Vuc3VyZV9yZXNvdXJjZV93cml0YWJsZShyZXF1ZXN0X3JlYyAqciwKLQkJCQkJZGF2X3Jlc291cmNlICpyZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFyZW50X29ubHksCi0JCQkJCWRhdl9yZXNvdXJjZSAqKnBhcmVudF9yZXNvdXJjZSwKLQkJCQkJaW50ICpyZXNvdXJjZV9leGlzdGVkLAotCQkJCQlpbnQgKnJlc291cmNlX3dhc193cml0YWJsZSwKLQkJCQkJaW50ICpwYXJlbnRfd2FzX3dyaXRhYmxlKTsKLQotLyogUmV2ZXJ0IHRoZSB3cml0YWJpbGl0eSBvZiByZXNvdXJjZXMgYmFjayB0byB3aGF0IHRoZXkgd2VyZQotICogYmVmb3JlIHRoZXkgd2VyZSBtb2RpZmllZC4gSWYgdW5kbyA9PSAwLCB0aGVuIHRoZSByZXNvdXJjZQotICogbW9kaWZpY2F0aW9ucyBhcmUgbWFpbnRhaW5lZCAoaS5lLiB0aGV5IGFyZSBjaGVja2VkIGluKS4KLSAqIElmIHVuZG8gIT0gMCwgdGhlbiByZXNvdXJjZSBtb2RpZmljYXRpb25zIGFyZSBkaXNjYXJkZWQKLSAqIChpLmUuIHRoZXkgYXJlIHVuY2hlY2tlZCBvdXQpLgotICoKLSAqIFRoZSByZXNvdXJjZSBhbmQgcGFyZW50X3Jlc291cmNlIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwKLSAqIChpLmUuIHRoZXkgbWF5IGJlIE5VTEwpLgotICovCi1kYXZfZXJyb3IgKmRhdl9yZXZlcnRfcmVzb3VyY2Vfd3JpdGFiaWxpdHkocmVxdWVzdF9yZWMgKnIsCi0JCQkJCSAgIGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkJCSAgIGRhdl9yZXNvdXJjZSAqcGFyZW50X3Jlc291cmNlLAotCQkJCQkgICBpbnQgdW5kbywKLQkJCQkJICAgaW50IHJlc291cmNlX2V4aXN0ZWQsCi0JCQkJCSAgIGludCByZXNvdXJjZV93YXNfd3JpdGFibGUsCi0JCQkJCSAgIGludCBwYXJlbnRfd2FzX3dyaXRhYmxlKTsKLQotLyogVmVyc2lvbmluZyBwcm92aWRlciBob29rcyAqLwotc3RydWN0IGRhdl9ob29rc192c24KLXsKLSAgICAvKiBSZXR1cm4gc3VwcG9ydGVkIHZlcnNpb25pbmcgbGV2ZWwKLSAgICAgKiBmb3IgdGhlIFZlcnNpb25pbmcgaGVhZGVyCi0gICAgICovCi0gICAgY29uc3QgY2hhciAqICgqZ2V0X3Zzbl9oZWFkZXIpKHZvaWQpOwotCi0gICAgLyogQ3JlYXRlIGEgbmV3IChlbXB0eSkgcmVzb3VyY2UuIElmIHN1Y2Nlc3NmdWwsCi0gICAgICogdGhlIHJlc291cmNlIG9iamVjdCBzdGF0ZSBpcyB1cGRhdGVkIGFwcHJvcHJpYXRlbHkuCi0gICAgICovCi0gICAgZGF2X2Vycm9yICogKCpta3Jlc291cmNlKShkYXZfcmVzb3VyY2UgKnJlc291cmNlKTsKLQotICAgIC8qIENoZWNrb3V0IGEgcmVzb3VyY2UuIElmIHN1Y2Nlc3NmdWwsIHRoZSByZXNvdXJjZQotICAgICAqIG9iamVjdCBzdGF0ZSBpcyB1cGRhdGVkIGFwcHJvcHJpYXRlbHkuCi0gICAgICovCi0gICAgZGF2X2Vycm9yICogKCpjaGVja291dCkoZGF2X3Jlc291cmNlICpyZXNvdXJjZSk7Ci0KLSAgICAvKiBVbmNoZWNrb3V0IGEgcmVzb3VyY2UuIElmIHN1Y2Nlc3NmdWwsIHRoZSByZXNvdXJjZQotICAgICAqIG9iamVjdCBzdGF0ZSBpcyB1cGRhdGVkIGFwcHJvcHJpYXRlbHkuCi0gICAgICovCi0gICAgZGF2X2Vycm9yICogKCp1bmNoZWNrb3V0KShkYXZfcmVzb3VyY2UgKnJlc291cmNlKTsKLQotICAgIC8qIENoZWNraW4gYSB3b3JraW5nIHJlc291cmNlLiBJZiBzdWNjZXNzZnVsLCB0aGUgcmVzb3VyY2UKLSAgICAgKiBvYmplY3Qgc3RhdGUgaXMgdXBkYXRlZCBhcHByb3ByaWF0ZWx5LgotICAgICAqLwotICAgIGRhdl9lcnJvciAqICgqY2hlY2tpbikoZGF2X3Jlc291cmNlICpyZXNvdXJjZSk7Ci0KLSAgICAvKiBEZXRlcm1pbmUgd2hldGhlciBhIG5vbi12ZXJzaW9uZWQgKG9yIG5vbi1leGlzdGVudCkgcmVzb3VyY2UKLSAgICAgKiBpcyB2ZXJzaW9uYWJsZS4gUmV0dXJucyAhPSAwIGlmIHJlc291cmNlIGNhbiBiZSB2ZXJzaW9uZWQuCi0gICAgICovCi0gICAgaW50ICgqdmVyc2lvbmFibGUpKGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UpOwotCi0gICAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgYXV0by12ZXJzaW9uaW5nIGlzIGVuYWJsZWQgZm9yIGEgcmVzb3VyY2UKLSAgICAgKiAod2hpY2ggbWF5IG5vdCBleGlzdCwgb3IgbWF5IG5vdCBiZSB2ZXJzaW9uZWQpLgotICAgICAqIFJldHVybnMgIT0gMCBpZiBhdXRvLXZlcnNpb25pbmcgaXMgZW5hYmxlZC4KLSAgICAgKi8KLSAgICBpbnQgKCphdXRvX3ZlcnNpb25fZW5hYmxlZCkoY29uc3QgZGF2X3Jlc291cmNlICpyZXNvdXJjZSk7Ci19OwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qKgotKiogTUlTQ0VMTEFORU9VUyBTVFVGRgotKi8KLQotLyogYWxsb3cgcHJvdmlkZXJzIGFjY2VzcyB0byB0aGUgcGVyLWRpcmVjdG9yeSBwYXJhbWV0ZXJzICovCi10YWJsZSAqZGF2X2dldF9kaXJfcGFyYW1zKGNvbnN0IHJlcXVlc3RfcmVjICpyKTsKLQotLyogZmV0Y2ggdGhlICJMaW1pdFhNTFJlcXVlc3RCb2R5IiBpbiBmb3JjZSBmb3IgdGhpcyByZXNvdXJjZSAqLwotc2l6ZV90IGRhdl9nZXRfbGltaXRfeG1sX2JvZHkoY29uc3QgcmVxdWVzdF9yZWMgKnIpOwotCi0vKiBtYW5hZ2UgYW4gYXJyYXkgb2YgdW5pcXVlIFVSSXM6IGRhdl9pbnNlcnRfdXJpKCkgYW5kIERBVl9HRVRfVVJJX0lURU0oKSAqLwotCi0vKiByZXR1cm4gdGhlIFVSSSdzIChleGlzdGluZykgaW5kZXgsIG9yIGluc2VydCBpdCBhbmQgcmV0dXJuIGEgbmV3IGluZGV4ICovCi1pbnQgZGF2X2luc2VydF91cmkoYXJyYXlfaGVhZGVyICp1cmlfYXJyYXksIGNvbnN0IGNoYXIgKnVyaSk7Ci0jZGVmaW5lIERBVl9HRVRfVVJJX0lURU0oYXJ5LCBpKSAgICAoKChjb25zdCBjaGFyICogY29uc3QgKikoYXJ5KS0+ZWx0cylbaV0pCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9NT0RfREFWX0hfICovCmRpZmYgLS1naXQgYS9tb2R1bGVzL2Rhdi9tYWluL3Byb3BzLmMgYi9tb2R1bGVzL2Rhdi9tYWluL3Byb3BzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YWIyMDMuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9kYXYvbWFpbi9wcm9wcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUyNSArMCwwIEBACi0vKgotKiogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAgR3JlZyBTdGVpbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoqCi0qKiBCeSB1c2luZyB0aGlzIGZpbGUsIHlvdSBhZ3JlZSB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgc2V0IGZvcnRoIGluCi0qKiB0aGUgTElDRU5TRS5odG1sIGZpbGUgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIG1vZF9kYXYKLSoqIGRpc3RyaWJ1dGlvbiBvciBhdCBodHRwOi8vd3d3LndlYmRhdi5vcmcvbW9kX2Rhdi9saWNlbnNlLTEuaHRtbC4KLSoqCi0qKiBDb250YWN0IGluZm9ybWF0aW9uOgotKiogICBHcmVnIFN0ZWluLCBQTyBCb3ggNzYwLCBQYWxvIEFsdG8sIENBLCA5NDMwMgotKiogICBnc3RlaW5AbHlyYS5vcmcsIGh0dHA6Ly93d3cud2ViZGF2Lm9yZy9tb2RfZGF2LwotKi8KLQotLyoKLSoqIERBViBleHRlbnNpb24gbW9kdWxlIGZvciBBcGFjaGUgMS4zLioKLSoqICAtIFByb3BlcnR5IGRhdGFiYXNlIGhhbmRsaW5nIChyZXBvc2l0b3J5LWluZGVwZW5kZW50KQotKioKLSoqIFdyaXR0ZW4gYnkgR3JlZyBTdGVpbiwgZ3N0ZWluQGx5cmEub3JnLCBodHRwOi8vd3d3Lmx5cmEub3JnLwotKioKLSoqIE5PVEVTOgotKioKLSoqICAgUFJPUEVSVFkgREFUQUJBU0UKLSoqCi0qKiAgIFRoaXMgdmVyc2lvbiBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgYSBwZXItcmVzb3VyY2UgZGF0YWJhc2UgcHJvdmlkZXIKLSoqICAgdG8gcmVjb3JkIHByb3BlcnRpZXMuIFRoZSBkYXRhYmFzZSBwcm92aWRlciBkZWNpZGVzIGhvdyBhbmQgd2hlcmUgdG8KLSoqICAgc3RvcmUgdGhlc2UgZGF0YWJhc2VzLgotKioKLSoqICAgVGhlIERCTSBrZXlzIGZvciB0aGUgcHJvcGVydGllcyBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybToKLSoqCi0qKiAgICAgbmFtZXNwYWNlICI6IiBwcm9wbmFtZQotKioKLSoqICAgRm9yIGV4YW1wbGU6IDU6YXV0aG9yCi0qKgotKiogICBUaGUgbmFtZXNwYWNlIHByb3ZpZGVzIGFuIGludGVnZXIgaW5kZXggaW50byB0aGUgbmFtZXNwYWNlIHRhYmxlCi0qKiAgIChzZWUgYmVsb3cpLiBwcm9wbmFtZSBpcyBzaW1wbHkgdGhlIHByb3BlcnR5IG5hbWUsIHdpdGhvdXQgYSBuYW1lc3BhY2UKLSoqICAgcHJlZml4LgotKioKLSoqICAgQSBzcGVjaWFsIGNhc2UgZXhpc3RzIGZvciBwcm9wZXJ0aWVzIHRoYXQgaGFkIGEgcHJlZml4IHN0YXJ0aW5nIHdpdGgKLSoqICAgInhtbCIuIFRoZSBYTUwgU3BlY2lmaWNhdGlvbiByZXNlcnZlcyB0aGVzZSBmb3IgZnV0dXJlIHVzZS4gbW9kX2RhdgotKiogICBzdG9yZXMgYW5kIHJldHJpZXZlcyB0aGVtIHVuY2hhbmdlZC4gVGhlIGtleXMgZm9yIHRoZXNlIHByb3BlcnRpZXMKLSoqICAgaGF2ZSB0aGUgZm9ybToKLSoqCi0qKiAgICAgIjoiIHByb3BuYW1lCi0qKgotKiogICBUaGUgcHJvcG5hbWUgd2lsbCBjb250YWluIHRoZSBwcmVmaXggYW5kIHRoZSBwcm9wZXJ0eSBuYW1lLiBGb3IKLSoqICAgZXhhbXBsZSwgYSBrZXkgbWlnaHQgYmUgIjp4bWxmb286bmFtZSIKLSoqCi0qKiAgIFRoZSAiOm5hbWUiIHN0eWxlIHdpbGwgYWxzbyBiZSB1c2VkIGZvciBwcm9wZXJ0aWVzIHRoYXQgZG8gbm90Ci0qKiAgIGV4aXN0IHdpdGhpbiBhIG5hbWVzcGFjZS4KLSoqCi0qKiAgIFRoZSBEQk0gdmFsdWVzIGNvbnNpc3Qgb2YgdHdvIG51bGwtdGVybWluYXRlZCBzdHJpbmdzLCBhcHBlbmRlZAotKiogICB0b2dldGhlciAodGhlIG51bGwtdGVybXMgYXJlIHJldGFpbmVkIGFuZCBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlKS4KLSoqICAgVGhlIGZpcnN0IHN0cmluZyBpcyB0aGUgeG1sOmxhbmcgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eS4gQW4gZW1wdHkKLSoqICAgc3RyaW5nIHNpZ25pZmllcyB0aGF0IGEgbGFuZyB2YWx1ZSB3YXMgbm90IGluIGNvbnRleHQgZm9yIHRoZSB2YWx1ZS4KLSoqICAgVGhlIHNlY29uZCBzdHJpbmcgaXMgdGhlIHByb3BlcnR5IHZhbHVlIGl0c2VsZi4KLSoqCi0qKgotKiogICBOQU1FU1BBQ0UgVEFCTEUKLSoqCi0qKiAgIFRoZSBuYW1lc3BhY2UgdGFibGUgaXMgYW4gYXJyYXkgdGhhdCBsaXN0cyBlYWNoIG9mIHRoZSBuYW1lc3BhY2VzCi0qKiAgIHRoYXQgYXJlIGluIHVzZSBieSB0aGUgcHJvcGVydGllcyBpbiB0aGUgZ2l2ZW4gcHJvcGRiLiBFYWNoIGVudHJ5Ci0qKiAgIGluIHRoZSBhcnJheSBpcyBhIHNpbXBsZSBVUkkuCi0qKgotKiogICBGb3IgZXhhbXBsZTogaHR0cDovL3d3dy5mb28uYmFyL3N0YW5kYXJkcy9wcm9wcy8KLSoqCi0qKiAgIFRoZSBwcmVmaXggdXNlZCBmb3IgdGhlIHByb3BlcnR5IGlzIHN0cmlwcGVkIGFuZCB0aGUgVVJJIGZvciBpdAotKiogICBpcyBlbnRlcmVkIGludG8gdGhlIG5hbWVzcGFjZSB0YWJsZS4gQWxzbywgYW55IG5hbWVzcGFjZXMgdXNlZAotKiogICB3aXRoaW4gdGhlIHByb3BlcnR5IHZhbHVlIHdpbGwgYmUgZW50ZXJlZCBpbnRvIHRoZSB0YWJsZSAoYW5kCi0qKiAgIHN0cmlwcGVkIGZyb20gdGhlIGNoaWxkIGVsZW1lbnRzKS4KLSoqCi0qKiAgIFRoZSBuYW1lc3BhY2VzIGFyZSBzdG9yZWQgaW4gdGhlIERCTSBkYXRhYmFzZSB1bmRlciB0aGUgIk1FVEFEQVRBIiBrZXkuCi0qKgotKioKLSoqICAgU1RSSVBQSU5HIE5BTUVTUEFDRVMKLSoqCi0qKiAgIFdpdGhpbiB0aGUgcHJvcGVydHkgdmFsdWVzLCB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyAoeG1sbnMuLi4pCi0qKiAgIGFyZSBzdHJpcHBlZC4gRWFjaCBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgd2lsbCBoYXZlIGl0cyBwcmVmaXggcmVtb3ZlZAotKiogICBhbmQgYSBuZXcgcHJlZml4IGluc2VydGVkLgotKioKLSoqICAgVGhpcyBtdXN0IGJlIGRvbmUgc28gdGhhdCB3ZSBjYW4gcmV0dXJuIG11bHRpcGxlIHByb3BlcnRpZXMgaW4gYQotKiogICBQUk9QRklORCB3aGljaCBtYXkgaGF2ZSAob3JpZ2luYWxseSkgdXNlZCBjb25mbGljdGluZyBwcmVmaXhlcy4gRm9yCi0qKiAgIHRoYXQgY2FzZSwgd2UgbXVzdCBiaW5kIGFsbCBwcm9wZXJ0eSB2YWx1ZSBlbGVtZW50cyB0byBuZXcgbmFtZXNwYWNlCi0qKiAgIHZhbHVlcy4KLSoqCi0qKiAgIFRoaXMgaW1wbGllcyB0aGF0IGNsaWVudHMgbXVzdCBOT1QgYmUgc2Vuc2l0aXZlIHRvIHRoZSBuYW1lc3BhY2UKLSoqICAgcHJlZml4IHVzZWQgZm9yIHRoZWlyIHByb3BlcnRpZXMuIEl0IFdJTEwgY2hhbmdlIHdoZW4gdGhlIHByb3BlcnRpZXMKLSoqICAgYXJlIHJldHVybmVkICh3ZSByZXR1cm4gdGhlbSBhcyAibnM8aW5kZXg+IiwgZS5nLiAibnM1IikuIEFsc28sIHRoZQotKiogICBwcm9wZXJ0eSB2YWx1ZSBjYW4gY29udGFpbiBPTkxZIFhNTCBlbGVtZW50cyBhbmQgQ0RBVEEuIFBJIGFuZCBjb21tZW50Ci0qKiAgIGVsZW1lbnRzIHdpbGwgYmUgc3RyaXBwZWQuIENEQVRBIHdoaXRlc3BhY2Ugd2lsbCBiZSBwcmVzZXJ2ZWQsIGJ1dAotKiogICB3aGl0ZXNwYWNlIHdpdGhpbiBlbGVtZW50IHRhZ3Mgd2lsbCBiZSBhbHRlcmVkLiBBdHRyaWJ1dGUgb3JkZXJpbmcKLSoqICAgbWF5IGJlIGFsdGVyZWQuIEVsZW1lbnQgYW5kIENEQVRBIG9yZGVyaW5nIHdpbGwgYmUgcHJlc2VydmVkLgotKioKLSoqCi0qKiAgIEFUVFJJQlVURVMgT04gUFJPUEVSVFkgTkFNRSBFTEVNRU5UUwotKioKLSoqICAgV2hlbiBnZXR0aW5nL3NldHRpbmcgcHJvcGVydGllcywgdGhlIFhNTCB1c2VkIGxvb2tzIGxpa2U6Ci0qKgotKiogICAgIDxwcm9wPgotKiogICAgICAgPHByb3BuYW1lMT52YWx1ZTwvcHJvcG5hbWUxPgotKiogICAgICAgPHByb3BuYW1lMj52YWx1ZTwvcHJvcG5hbWUxPgotKiogICAgIDwvcHJvcD4KLSoqCi0qKiAgIFRoaXMgaW1wbGVtZW50YXRpb24gKG1vZF9kYXYpIERPRVMgTk9UIHNhdmUgYW55IGF0dHJpYnV0ZXMgdGhhdCBhcmUKLSoqICAgYXNzb2NpYXRlZCB3aXRoIHRoZSA8cHJvcG5hbWUxPiBlbGVtZW50LiBUaGUgcHJvcGVydHkgdmFsdWUgaXMgZGVlbWVkCi0qKiAgIHRvIGJlIG9ubHkgdGhlIGNvbnRlbnRzICgidmFsdWUiIGluIHRoZSBhYm92ZSBleGFtcGxlKS4KLSoqCi0qKiAgIFdlIGRvIHN0b3JlIHRoZSB4bWw6bGFuZyB2YWx1ZSAoaWYgYW55KSB0aGF0IGFwcGxpZXMgdG8gdGhlIGNvbnRleHQKLSoqICAgb2YgdGhlIDxwcm9wbmFtZTE+IGVsZW1lbnQuIFdoZXRoZXIgdGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBpcyBvbgotKiogICA8cHJvcG5hbWUxPiBpdHNlbGYsIG9yIGZyb20gYSBoaWdoZXIgbGV2ZWwgZWxlbWVudCwgd2Ugd2lsbCBzdG9yZSBpdAotKiogICB3aXRoIHRoZSBwcm9wZXJ0eSB2YWx1ZS4KLSoqCi0qKgotKiogICBWRVJTSU9OSU5HCi0qKgotKiogICBUaGUgREJNIGRiIGNvbnRhaW5zIGEga2V5IG5hbWVkICJNRVRBREFUQSIgdGhhdCBob2xkcyBkYXRhYmFzZS1sZXZlbAotKiogICBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgbmFtZXNwYWNlIHRhYmxlLiBUaGUgcmVjb3JkIGFsc28gY29udGFpbnMgdGhlCi0qKiAgIGRiJ3MgdmVyc2lvbiBudW1iZXIgYXMgdGhlIHZlcnkgZmlyc3QgMTYtYml0IHZhbHVlLiBUaGlzIGZpcnN0IG51bWJlcgotKiogICBpcyBhY3R1YWxseSBzdG9yZWQgYXMgdHdvIHNpbmdsZSBieXRlczogdGhlIGZpcnN0IGJ5dGUgaXMgYSAibWFqb3IiCi0qKiAgIHZlcnNpb24gbnVtYmVyLiBUaGUgc2Vjb25kIGJ5dGUgaXMgYSAibWlub3IiIG51bWJlci4KLSoqCi0qKiAgIElmIHRoZSBtYWpvciBudW1iZXIgaXMgbm90IHdoYXQgbW9kX2RhdiBleHBlY3RzLCB0aGVuIHRoZSBkYiBpcyBjbG9zZWQKLSoqICAgaW1tZWRpYXRlbHkgYW5kIGFuIGVycm9yIGlzIHJldHVybmVkLiBBIG1pbm9yIG51bWJlciBjaGFuZ2UgaXMKLSoqICAgYWNjZXB0YWJsZSAtLSBpdCBpcyBwcmVzdW1lZCB0aGF0IG9sZC9uZXcgZGF2X3Byb3BzLmMgY2FuIGRlYWwgd2l0aAotKiogICB0aGUgZGF0YWJhc2UgZm9ybWF0LiBGb3IgZXhhbXBsZSwgYSBuZXdlciBkYXZfcHJvcHMgbWlnaHQgdXBkYXRlIHRoZQotKiogICBtaW5vciB2YWx1ZSBhbmQgYXBwZW5kIGluZm9ybWF0aW9uIHRvIHRoZSBlbmQgb2YgdGhlIG1ldGFkYXRhIHJlY29yZAotKiogICAod2hpY2ggd291bGQgYmUgaWdub3JlZCBieSBwcmV2aW91cyB2ZXJzaW9ucykuCi0qKgotKioKLSoqIElTU1VFUzoKLSoqCi0qKiAgIEF0IHRoZSBtb21lbnQsIGZvciB0aGUgZGF2X2dldF9hbGxwcm9wcygpIGFuZCBkYXZfZ2V0X3Byb3BzKCkgZnVuY3Rpb25zLAotKiogICB3ZSBtdXN0IHJldHVybiBhIHNldCBvZiB4bWxuczogZGVjbGFyYXRpb25zIGZvciBBTEwga25vd24gbmFtZXNwYWNlcwotKiogICBpbiB0aGUgZmlsZS4gVGhlcmUgaXNuJ3QgYSB3YXkgdG8gZmlsdGVyIHRoaXMgYmVjYXVzZSB3ZSBkb24ndCBrbm93Ci0qKiAgIHdoaWNoIGFyZSBnb2luZyB0byBiZSB1c2VkIG9yIG5vdC4gRXhhbWluaW5nIHByb3BlcnR5IG5hbWVzIGlzIG5vdAotKiogICBzdWZmaWNpZW50IGJlY2F1c2UgdGhlIHByb3BlcnR5IHZhbHVlcyBjb3VsZCB1c2UgZW50aXJlbHkgZGlmZmVyZW50Ci0qKiAgIG5hbWVzcGFjZXMuCi0qKgotKiogICA9PT4gd2UgbXVzdCBkZXZpc2UgYSBzY2hlbWUgd2hlcmUgd2UgY2FuICJnYXJiYWdlIGNvbGxlY3QiIHRoZSBuYW1lc3BhY2UKLSoqICAgICAgIGVudHJpZXMgZnJvbSB0aGUgcHJvcGVydHkgZGF0YWJhc2UuCi0qLwotCi0jaW5jbHVkZSAibW9kX2Rhdi5oIgotCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLQotLyoKLSoqIFRoZXJlIGlzIHNvbWUgcm91Z2ggc3VwcG9ydCBmb3Igd3JpdGVhYmxlIERBVjpnZXRjb250ZW50dHlwZSBhbmQKLSoqIERBVjpnZXRjb250ZW50bGFuZ3VhZ2UgcHJvcGVydGllcy4gSWYgdGhpcyAjZGVmaW5lIGlzICgxKSwgdGhlbgotKiogdGhpcyBzdXBwb3J0IGlzIGRpc2FibGVkLgotKioKLSoqIFdlIGFyZSBkaXNhYmxpbmcgaXQgYmVjYXVzZSBvZiBhIGxhY2sgb2Ygc3VwcG9ydCBpbiBHRVQgYW5kIFBVVAotKiogb3BlcmF0aW9ucy4gRm9yIEdFVCwgaXQgd291bGQgYmUgImV4cGVuc2l2ZSIgdG8gbG9vayBmb3IgYSBwcm9wZGIsCi0qKiBvcGVuIGl0LCBhbmQgYXR0ZW1wdCB0byBleHRyYWN0IHRoZSBDb250ZW50LVR5cGUgYW5kIENvbnRlbnQtTGFuZ3VhZ2UKLSoqIHZhbHVlcyBmb3IgdGhlIHJlc3BvbnNlLgotKiogKEhhbmRsaW5nIHRoZSBQVVQgd291bGQgbm90IGJlIGRpZmZpY3VsdCwgdGhvdWdoKQotKi8KLSNkZWZpbmUgREFWX0RJU0FCTEVfV1JJVEVBQkxFX1BST1BTCTEKLQotI2RlZmluZSBEQVZfR0RCTV9OU19LRVkJCSJNRVRBREFUQSIKLSNkZWZpbmUgREFWX0dEQk1fTlNfS0VZX0xFTgk4Ci0KLSNkZWZpbmUgREFWX0VNUFRZX1ZBTFVFCQkiXDAiCS8qIFRXTyBudWxsIHRlcm1zICovCi0KLS8qIHRoZSBuYW1lc3BhY2UgVVJJIHdhcyBub3QgZm91bmQ7IG5vIElEIGlzIGF2YWlsYWJsZSAqLwotI2RlZmluZSBEQVZfTlNfRVJST1JfTk9UX0ZPVU5ECShEQVZfTlNfRVJST1JfQkFTRSkKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVuc2lnbmVkIGNoYXIgbWFqb3I7Ci0jZGVmaW5lIERBVl9EQlZTTl9NQUpPUgkJNAotICAgIC8qCi0gICAgKiogVjQgLS0gMC45LjkgLi4KLSAgICAqKiAgICAgICBQcmlvciB2ZXJzaW9ucyBjb3VsZCBoYXZlIGtleXMgb3IgdmFsdWVzIHdpdGggaW52YWxpZAotICAgICoqICAgICAgIG5hbWVzcGFjZSBwcmVmaXhlcyBhcyBhIHJlc3VsdCBvZiB0aGUgeG1sbnM9IiIgZm9ybSBub3QKLSAgICAqKiAgICAgICByZXNldHRpbmcgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIHRvIGJlICJubyBuYW1lc3BhY2UiLiBUaGUKLSAgICAqKiAgICAgICBuYW1lc3BhY2Ugd291bGQgYmUgc2V0IHRvICIiIHdoaWNoIGlzIGludmFsaWQ7IGl0IHNob3VsZAotICAgICoqICAgICAgIGJlIHNldCB0byAibm8gbmFtZXNwYWNlIi4KLSAgICAqKgotICAgICoqIFYzIC0tIDAuOS44Ci0gICAgKiogICAgICAgUHJpb3IgdmVyc2lvbnMgY291bGQgaGF2ZSB2YWx1ZXMgd2l0aCBpbnZhbGlkIG5hbWVzcGFjZQotICAgICoqICAgICAgIHByZWZpeGVzIGR1ZSB0byBhbiBpbmNvcnJlY3QgbWFwcGluZyBvZiBpbnB1dCB0byBwcm9wZGIKLSAgICAqKiAgICAgICBuYW1lc3BhY2UgaW5kaWNlcy4gVmVyc2lvbiBidW1wZWQgdG8gb2Jzb2xldGUgdGhlIG9sZAotICAgICoqICAgICAgIHZhbHVlcy4KLSAgICAqKgotICAgICoqIFYyIC0tIDAuOS43Ci0gICAgKiogICAgICAgVGhpcyBpbnRyb2R1Y2VkIHRoZSB4bWw6bGFuZyB2YWx1ZSBpbnRvIHRoZSBwcm9wZXJ0eSB2YWx1ZSdzCi0gICAgKiogICAgICAgcmVjb3JkIGluIHRoZSBwcm9wZGIuCi0gICAgKioKLSAgICAqKiBWMSAtLSAuLiAwLjkuNgotICAgICoqICAgICAgIEluaXRpYWwgdmVyc2lvbi4KLSAgICAqLwotCi0KLSAgICB1bnNpZ25lZCBjaGFyIG1pbm9yOwotI2RlZmluZSBEQVZfREJWU05fTUlOT1IJCTAKLQotICAgIHNob3J0IG5zX2NvdW50OwotCi19IGRhdl9wcm9wZGJfbWV0YWRhdGE7Ci0KLXN0cnVjdCBkYXZfcHJvcGRiIHsKLSAgICBpbnQgdmVyc2lvbjsJCS8qICptaW5vciogdmVyc2lvbiBvZiB0aGlzIGRiICovCi0KLSAgICBwb29sICpwOwkJCS8qIHRoZSBwb29sIHdlIHNob3VsZCB1c2UgKi8KLSAgICByZXF1ZXN0X3JlYyAqcjsJCS8qIHRoZSByZXF1ZXN0IHJlY29yZCAqLwotCi0gICAgZGF2X3Jlc291cmNlICpyZXNvdXJjZTsJLyogdGhlIHRhcmdldCByZXNvdXJjZSAqLwotCi0gICAgaW50IGRlZmVycmVkOwkJLyogb3BlbiBvZiBkYiBoYXMgYmVlbiBkZWZlcnJlZCAqLwotICAgIGRhdl9kYiAqZGI7CQkJLyogdW5kZXJseWluZyBkYXRhYmFzZSBjb250YWluaW5nIHByb3BzICovCi0KLSAgICBkYXZfYnVmZmVyIG5zX3RhYmxlOwkvKiB0YWJsZSBvZiBuYW1lc3BhY2UgVVJJcyAqLwotICAgIHNob3J0IG5zX2NvdW50OwkJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdGFibGUgKi8KLSAgICBpbnQgbnNfdGFibGVfZGlydHk7CQkvKiBuc190YWJsZSB3YXMgbW9kaWZpZWQgKi8KLQotICAgIGFycmF5X2hlYWRlciAqbnNfeGxhdGU7CS8qIHRyYW5zbGF0aW9uIG9mIGFuIGVsZW0tPm5zIHRvIFVSSSAqLwotICAgIGludCAqbnNfbWFwOwkJLyogbWFwIGVsZW0tPm5zIHRvIHByb3BkYiBucyB2YWx1ZXMgKi8KLSAgICBpbnQgaW5jb21wbGV0ZV9tYXA7CQkvKiBzb21lIG1hcHBpbmdzIGRvIG5vdCBleGlzdCAqLwotCi0gICAgZGF2X2xvY2tkYiAqbG9ja2RiOwkJLyogdGhlIGxvY2sgZGF0YWJhc2UgKi8KLQotICAgIGRhdl9idWZmZXIgd2Jfa2V5OwkJLyogd29yayBidWZmZXIgZm9yIGRhdl9nZGJtX2tleSAqLwotICAgIGRhdl9idWZmZXIgd2JfbG9jazsJCS8qIHdvcmsgYnVmZmVyIGZvciBsb2NrZGlzY292ZXJ5IHByb3BlcnR5ICovCi0KLSAgICAvKiBpZiB3ZSBldmVyIHJ1biBhIEdFVCBzdWJyZXEsIGl0IHdpbGwgYmUgc3RvcmVkIGhlcmUgKi8KLSAgICByZXF1ZXN0X3JlYyAqc3VicmVxOwotCi0gICAgLyogaG9va3Mgd2Ugc2hvdWxkIHVzZSBmb3IgcHJvY2Vzc2luZyAoYmFzZWQgb24gdGhlIHRhcmdldCByZXNvdXJjZSkgKi8KLSAgICBjb25zdCBkYXZfaG9va3NfZGIgKmRiX2hvb2tzOwotICAgIGNvbnN0IGRhdl9ob29rc192c24gKnZzbl9ob29rczsKLQotICAgIGNvbnN0IGRhdl9keW5faG9va3MgKmxpdmVwcm9wOwkvKiBoZWFkIG9mIGxpc3QgKi8KLX07Ci0KLS8qICMjIyBtb3ZlIHRoZXNlIGludG8gYSAiY29yZSIgbGl2ZXByb3AgcHJvdmlkZXI/ICovCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhdl9jb3JlX3Byb3BzW10gPQotewotICAgICJnZXRjb250ZW50dHlwZSIsCi0gICAgImdldGNvbnRlbnRsYW5ndWFnZSIsCi0gICAgImxvY2tkaXNjb3ZlcnkiLAotICAgICJyZXNvdXJjZXR5cGUiLAotICAgICJzdXBwb3J0ZWRsb2NrIiwKLQotICAgIE5VTEwJLyogc2VudGluZWwgKi8KLX07Ci1lbnVtIHsKLSAgICBEQVZfUFJPUElEX0NPUkVfZ2V0Y29udGVudHR5cGUgPSBEQVZfUFJPUElEX0NPUkUsCi0gICAgREFWX1BST1BJRF9DT1JFX2dldGNvbnRlbnRsYW5ndWFnZSwKLSAgICBEQVZfUFJPUElEX0NPUkVfbG9ja2Rpc2NvdmVyeSwKLSAgICBEQVZfUFJPUElEX0NPUkVfcmVzb3VyY2V0eXBlLAotICAgIERBVl9QUk9QSURfQ09SRV9zdXBwb3J0ZWRsb2NrLAotCi0gICAgREFWX1BST1BJRF9DT1JFX1VOS05PV04KLX07Ci0jZGVmaW5lIERBVl9JU19DT1JFX1BST1AocHJvcGlkKQkoKHByb3BpZCkgPj0gREFWX1BST1BJRF9DT1JFICYmIFwKLQkJCQkJIChwcm9waWQpIDw9IERBVl9QUk9QSURfQ09SRV9VTktOT1dOKQotCi0vKgotKiogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byB0cmFjayBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIGEgcm9sbGJhY2suCi0qKiBJZiBhIFNFVCB3YXMgcGVyZm9ybWVkIGFuZCBubyBwcmlvciB2YWx1ZSBleGlzdGVkLCB0aGVuIHZhbHVlLmRwdHIKLSoqIHdpbGwgYmUgTlVMTC4KLSovCi10eXBlZGVmIHN0cnVjdCBkYXZfcm9sbGJhY2tfaXRlbSB7Ci0gICAgZGF2X2RhdHVtIGtleTsJCS8qIGtleSBmb3IgdGhlIGl0ZW0gYmVpbmcgc2F2ZWQgKi8KLSAgICBkYXZfZGF0dW0gdmFsdWU7CQkvKiB2YWx1ZSBiZWZvcmUgc2V0L3JlcGxhY2UvZGVsZXRlICovCi0KLSAgICAvKiBvciB1c2UgdGhlIGZvbGxvd2luZyAoY2hvaWNlIHNlbGVjdGVkIGJ5IGRhdl9wcm9wX2N0eC5pc19saXZlcHJvcCkgKi8KLSAgICBzdHJ1Y3QgZGF2X2xpdmVwcm9wX3JvbGxiYWNrICpsaXZlcHJvcDsJLyogbGl2ZXByb3Agcm9sbGJhY2sgY3R4ICovCi0KLX0gZGF2X3JvbGxiYWNrX2l0ZW07Ci0KLQotI2lmIDAKLS8qICMjIyB1bnVzZWQgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpkYXZfZ2V0X25zX3RhYmxlX3VyaShkYXZfcHJvcGRiICpwcm9wZGIsIGludCBucykKLXsKLSAgICBjb25zdCBjaGFyICpwID0gcHJvcGRiLT5uc190YWJsZS5idWYgKyBzaXplb2YoZGF2X3Byb3BkYl9tZXRhZGF0YSk7Ci0KLSAgICB3aGlsZSAobnMtLSkKLQlwICs9IHN0cmxlbihwKSArIDE7Ci0KLSAgICByZXR1cm4gcDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBkYXZfZmluZF9saXZlcHJvcChkYXZfcHJvcGRiICpwcm9wZGIsIGRhdl94bWxfZWxlbSAqZWxlbSkKLXsKLSAgICBpbnQgcHJvcGlkOwotICAgIGNvbnN0IGNoYXIgKm5zX3VyaTsKLSAgICBjb25zdCBkYXZfZHluX2hvb2tzICpkZGg7Ci0KLSAgICBpZiAoZWxlbS0+bnMgPT0gREFWX05TX0RBVl9JRCkgewotCWNvbnN0IGNoYXIgKiBjb25zdCAqcCA9IGRhdl9jb3JlX3Byb3BzOwotCi0JZm9yIChwcm9waWQgPSBEQVZfUFJPUElEX0NPUkU7ICpwICE9IE5VTEw7ICsrcCwgKytwcm9waWQpCi0JICAgIGlmIChzdHJjbXAoZWxlbS0+bmFtZSwgKnApID09IDApIHsKLQkJZWxlbS0+cHJvcGlkID0gcHJvcGlkOwotCQlyZXR1cm47Ci0JICAgIH0KLQotCS8qIGRpZG4ndCBmaW5kIGl0LiBmYWxsIHRocnUuIGEgcHJvdmlkZXIgY2FuIGRlZmluZSBEQVY6IHByb3BzICovCi0gICAgfQotICAgIGVsc2UgaWYgKGVsZW0tPm5zID09IERBVl9OU19OT05FKSB7Ci0JLyogcG9saWN5OiBsaXZlcHJvcCBwcm92aWRlcnMgY2Fubm90IGRlZmluZSBuby1uYW1lc3BhY2UgcHJvcGVydGllcyAqLwotCWVsZW0tPnByb3BpZCA9IERBVl9QUk9QSURfQ09SRV9VTktOT1dOOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICBuc191cmkgPSBEQVZfR0VUX1VSSV9JVEVNKHByb3BkYi0+bnNfeGxhdGUsIGVsZW0tPm5zKTsKLQotICAgIGZvciAoZGRoID0gcHJvcGRiLT5saXZlcHJvcDsgZGRoICE9IE5VTEw7IGRkaCA9IGRkaC0+bmV4dCkgewotCXByb3BpZCA9ICgqREFWX0FTX0hPT0tTX0xJVkVQUk9QKGRkaCktPmZpbmRfcHJvcCkobnNfdXJpLCBlbGVtLT5uYW1lKTsKLQlpZiAocHJvcGlkICE9IDApIHsKLQkgICAgZWxlbS0+cHJvcGlkID0gcHJvcGlkOwotCSAgICBlbGVtLT5wcm92aWRlciA9IERBVl9BU19IT09LU19MSVZFUFJPUChkZGgpOwotCSAgICBlbGVtLT5uc19tYXAgPSBkZGgtPmN0eC5uc19tYXA7Ci0JICAgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gICAgZWxlbS0+cHJvcGlkID0gREFWX1BST1BJRF9DT1JFX1VOS05PV047Ci19Ci0KLS8qIGlzIHRoZSBsaXZlIHByb3BlcnR5IHJlYWQvd3JpdGU/ICovCi1zdGF0aWMgaW50IGRhdl9yd19saXZlcHJvcChkYXZfcHJvcGRiICpwcm9wZGIsIGludCBwcm9waWQpCi17Ci0gICAgZGF2X3Byb3Bfcncgcnc7Ci0gICAgY29uc3QgZGF2X2R5bl9ob29rcyAqZGRoOwotCi0gICAgLyogdGhlc2UgYXJlIGRlZmluZWQgYXMgcmVhZC1vbmx5ICovCi0gICAgaWYgKHByb3BpZCA9PSBEQVZfUFJPUElEX0NPUkVfbG9ja2Rpc2NvdmVyeQotCXx8IHByb3BpZCA9PSBEQVZfUFJPUElEX0NPUkVfcmVzb3VyY2V0eXBlCi0jaWYgREFWX0RJU0FCTEVfV1JJVEVBQkxFX1BST1BTCi0JfHwgcHJvcGlkID09IERBVl9QUk9QSURfQ09SRV9nZXRjb250ZW50dHlwZQotCXx8IHByb3BpZCA9PSBEQVZfUFJPUElEX0NPUkVfZ2V0Y29udGVudGxhbmd1YWdlCi0jZW5kaWYKLQl8fCBwcm9waWQgPT0gREFWX1BST1BJRF9DT1JFX3N1cHBvcnRlZGxvY2spIHsKLQotCXJldHVybiAwOwotICAgIH0KLQotICAgIC8qIHRoZXNlIGFyZSBkZWZpbmVkIGFzIHJlYWQvd3JpdGUgKi8KLSAgICBpZiAocHJvcGlkID09IERBVl9QUk9QSURfQ09SRV9nZXRjb250ZW50dHlwZQotCXx8IHByb3BpZCA9PSBEQVZfUFJPUElEX0NPUkVfZ2V0Y29udGVudGxhbmd1YWdlCi0JfHwgcHJvcGlkID09IERBVl9QUk9QSURfQ09SRV9VTktOT1dOKSB7Ci0KLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKgotICAgICoqIENoZWNrIHRoZSBsaXZlcHJvcCBwcm92aWRlcnMKLSAgICAqLwotICAgIGZvciAoZGRoID0gcHJvcGRiLT5saXZlcHJvcDsgZGRoICE9IE5VTEw7IGRkaCA9IGRkaC0+bmV4dCkgewotCXJ3ID0gKCpEQVZfQVNfSE9PS1NfTElWRVBST1AoZGRoKS0+aXNfd3JpdGVhYmxlKShwcm9wZGItPnJlc291cmNlLAotCQkJCQkJCSBwcm9waWQpOwotCWlmIChydyA9PSBEQVZfUFJPUF9SV19ZRVMpCi0JICAgIHJldHVybiAxOwotCWlmIChydyA9PSBEQVZfUFJPUF9SV19OTykKLQkgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqKiBObyBwcm92aWRlciByZWNvZ25pemVkIHRoZSBwcm9wZXJ0eSwgc28gaXQgbXVzdCBiZSBkZWFkIChhbmQgd3JpdGFibGUpCi0gICAgKi8KLSAgICByZXR1cm4gMTsKLX0KLQotLyogZG8gYSBzdWItcmVxdWVzdCB0byBmZXRjaCBwcm9wZXJ0aWVzIGZvciB0aGUgdGFyZ2V0IHJlc291cmNlJ3MgVVJJLiAqLwotc3RhdGljIHZvaWQgZGF2X2RvX3Byb3Bfc3VicmVxKGRhdl9wcm9wZGIgKnByb3BkYikKLXsKLSAgICAvKiBwZXJmb3JtIGEgIkdFVCIgb24gdGhlIHJlc291cmNlJ3MgVVJJIChub3RlIHRoYXQgdGhlIHJlc291cmNlCi0gICAgICAgbWF5IG5vdCBjb3JyZXNwb25kIHRvIHRoZSBjdXJyZW50IHJlcXVlc3QhKS4gKi8KLSAgICBwcm9wZGItPnN1YnJlcSA9IGFwX3N1Yl9yZXFfbG9va3VwX3VyaShwcm9wZGItPnJlc291cmNlLT51cmksIHByb3BkYi0+cik7Ci19Ci0KLXN0YXRpYyBkYXZfZXJyb3IgKiBkYXZfaW5zZXJ0X2NvcmVwcm9wKGRhdl9wcm9wZGIgKnByb3BkYiwKLQkJCQkgICAgICAgaW50IHByb3BpZCwgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkgICAgICAgaW50IGdldHZhbHMsCi0JCQkJICAgICAgIGRhdl90ZXh0X2hlYWRlciAqcGhkciwKLQkJCQkgICAgICAgaW50ICppbnNlcnRlZCkKLXsKLSAgICBjb25zdCBjaGFyICp2YWx1ZSA9IE5VTEw7Ci0KLSAgICAqaW5zZXJ0ZWQgPSAwOwotCi0gICAgLyogZmFzdC1wYXRoIHRoZSBjb21tb24gY2FzZSAqLwotICAgIGlmIChwcm9waWQgPT0gREFWX1BST1BJRF9DT1JFX1VOS05PV04pCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICBzd2l0Y2ggKHByb3BpZCkgewotCi0gICAgY2FzZSBEQVZfUFJPUElEX0NPUkVfcmVzb3VyY2V0eXBlOgotICAgICAgICBzd2l0Y2ggKHByb3BkYi0+cmVzb3VyY2UtPnR5cGUpIHsKLSAgICAgICAgY2FzZSBEQVZfUkVTT1VSQ0VfVFlQRV9SRUdVTEFSOgotICAgICAgICAgICAgaWYgKHByb3BkYi0+cmVzb3VyY2UtPmNvbGxlY3Rpb24pIHsKLQkgICAgICAgIHZhbHVlID0gIjxEOmNvbGxlY3Rpb24vPiI7Ci0gICAgICAgICAgICB9Ci0JICAgIGVsc2UgewotCQkvKiAjIyMgc2hvdWxkIHdlIGRlbm90ZSBsb2NrLW51bGwgcmVzb3VyY2VzPyAqLwotCi0JCXZhbHVlID0gIiI7CS8qIGJlY29tZXM6IDxEOnJlc291cmNldHlwZS8+ICovCi0JICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERBVl9SRVNPVVJDRV9UWVBFX0hJU1RPUlk6Ci0JICAgIHZhbHVlID0gIjxEOmhpc3RvcnkvPiI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEQVZfUkVTT1VSQ0VfVFlQRV9XT1JLU1BBQ0U6Ci0JICAgIHZhbHVlID0gIjxEOndvcmtzcGFjZS8+IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERBVl9SRVNPVVJDRV9UWVBFX0FDVElWSVRZOgotCSAgICB2YWx1ZSA9ICI8RDphY3Rpdml0eS8+IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERBVl9SRVNPVVJDRV9UWVBFX0NPTkZJR1VSQVRJT046Ci0JICAgIHZhbHVlID0gIjxEOmNvbmZpZ3VyYXRpb24vPiI7Ci0gICAgICAgICAgICBicmVhazsKLQljYXNlIERBVl9SRVNPVVJDRV9UWVBFX1JFVklTSU9OOgotCSAgICB2YWx1ZSA9ICI8RDpyZXZpc2lvbi8+IjsKLQkgICAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgICAvKiAjIyMgYmFkIGp1anUgKi8KLQkgICAgYnJlYWs7Ci0gICAgICAgIH0KLQlicmVhazsKLQotICAgIGNhc2UgREFWX1BST1BJRF9DT1JFX2xvY2tkaXNjb3Zlcnk6Ci0gICAgICAgIGlmIChwcm9wZGItPmxvY2tkYiAhPSBOVUxMKSB7Ci0JICAgIGRhdl9lcnJvciAqZXJyOwotCSAgICBkYXZfbG9jayAqbG9ja3M7Ci0KLQkgICAgaWYgKChlcnIgPSBkYXZfbG9ja19xdWVyeShwcm9wZGItPmxvY2tkYiwgcHJvcGRiLT5yZXNvdXJjZSwKLQkJCQkgICAgICAmbG9ja3MpKSAhPSBOVUxMKSB7Ci0JCXJldHVybiBkYXZfcHVzaF9lcnJvcihwcm9wZGItPnAsIGVyci0+c3RhdHVzLCAwLAotCQkJCSAgICAgICJEQVY6bG9ja2Rpc2NvdmVyeSBjb3VsZCBub3QgYmUgIgotCQkJCSAgICAgICJkZXRlcm1pbmVkIGR1ZSB0byBhIHByb2JsZW0gZmV0Y2hpbmcgIgotCQkJCSAgICAgICJ0aGUgbG9ja3MgZm9yIHRoaXMgcmVzb3VyY2UuIiwKLQkJCQkgICAgICBlcnIpOwotCSAgICB9Ci0KLQkgICAgLyogZmFzdC1wYXRoIHRoZSBuby1sb2NrcyBjYXNlICovCi0JICAgIGlmIChsb2NrcyA9PSBOVUxMKSB7Ci0JCXZhbHVlID0gIiI7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCS8qCi0JCSoqIFRoaXMgbWF5IG1vZGlmeSB0aGUgYnVmZmVyLiB2YWx1ZSBtYXkgcG9pbnQgdG8KLQkJKiogd2JfbG9jay5wYnVmIG9yIGEgc3RyaW5nIGNvbnN0YW50LgotCQkqLwotCQl2YWx1ZSA9IGRhdl9sb2NrX2dldF9hY3RpdmVsb2NrKHByb3BkYi0+ciwgbG9ja3MsCi0JCQkJCQkmcHJvcGRiLT53Yl9sb2NrKTsKLQotCQkvKiBtYWtlIGEgY29weSB0byBpc29sYXRlIGl0IGZyb20gY2hhbmdlcyB0byB3Yl9sb2NrICovCi0JCXZhbHVlID0gYXBfcHN0cmR1cChwcm9wZGItPnAsIHByb3BkYi0+d2JfbG9jay5idWYpOwotCSAgICB9Ci0gICAgICAgIH0KLQlicmVhazsKLQotICAgIGNhc2UgREFWX1BST1BJRF9DT1JFX3N1cHBvcnRlZGxvY2s6Ci0gICAgICAgIGlmIChwcm9wZGItPmxvY2tkYiAhPSBOVUxMKSB7Ci0JICAgIHZhbHVlID0gKCpwcm9wZGItPmxvY2tkYi0+aG9va3MtPmdldF9zdXBwb3J0ZWRsb2NrKSgpOwotICAgICAgICB9Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIERBVl9QUk9QSURfQ09SRV9nZXRjb250ZW50dHlwZToKLQlpZiAocHJvcGRiLT5zdWJyZXEgPT0gTlVMTCkgewotCSAgICBkYXZfZG9fcHJvcF9zdWJyZXEocHJvcGRiKTsKLQl9Ci0JaWYgKHByb3BkYi0+c3VicmVxLT5jb250ZW50X3R5cGUgIT0gTlVMTCkgewotCSAgICB2YWx1ZSA9IHByb3BkYi0+c3VicmVxLT5jb250ZW50X3R5cGU7Ci0JfQotCWJyZWFrOwotCi0gICAgY2FzZSBEQVZfUFJPUElEX0NPUkVfZ2V0Y29udGVudGxhbmd1YWdlOgotICAgIHsKLQljb25zdCBjaGFyICpsYW5nOwotCi0JaWYgKHByb3BkYi0+c3VicmVxID09IE5VTEwpIHsKLQkgICAgZGF2X2RvX3Byb3Bfc3VicmVxKHByb3BkYik7Ci0JfQotCWlmICgobGFuZyA9IGFwX3RhYmxlX2dldChwcm9wZGItPnN1YnJlcS0+aGVhZGVyc19vdXQsCi0JCQkJICJDb250ZW50LUxhbmd1YWdlIikpICE9IE5VTEwpIHsKLQkgICAgdmFsdWUgPSBsYW5nOwotCX0KLQlicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIERBVl9QUk9QSURfQ09SRV9VTktOT1dOOgotICAgIGRlZmF1bHQ6Ci0JLyogZmFsbCB0aHJvdWdoIHRvIGludGVycHJldCBhcyBhIGRlYWQgcHJvcGVydHkgKi8KLQlicmVhazsKLSAgICB9Ci0KLSAgICAvKiBpZiBzb21ldGhpbmcgd2FzIHN1cHBsaWVkLCB0aGVuIGluc2VydCBpdCAqLwotICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7Ci0JY29uc3QgY2hhciAqczsKLQotCWlmIChnZXR2YWxzICYmICp2YWx1ZSAhPSAnXDAnKSB7Ci0JICAgIC8qIHVzZSBEOiBwcmVmaXggdG8gcmVmZXIgdG8gdGhlIERBVjogbmFtZXNwYWNlIFVSSSAqLwotCSAgICBzID0gYXBfcHNwcmludGYocHJvcGRiLT5wLCAiPEQ6JXM+JXM8L0Q6JXM+IiBERUJVR19DUiwKLQkJCSAgICBuYW1lLCB2YWx1ZSwgbmFtZSk7Ci0JfQotCWVsc2UgewotCSAgICAvKiB1c2UgRDogcHJlZml4IHRvIHJlZmVyIHRvIHRoZSBEQVY6IG5hbWVzcGFjZSBVUkkgKi8KLQkgICAgcyA9IGFwX3BzcHJpbnRmKHByb3BkYi0+cCwgIjxEOiVzLz4iIERFQlVHX0NSLCBuYW1lKTsKLQl9Ci0JZGF2X3RleHRfYXBwZW5kKHByb3BkYi0+cCwgcGhkciwgcyk7Ci0KLQkqaW5zZXJ0ZWQgPSAxOwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgZGF2X2Vycm9yICogZGF2X2luc2VydF9saXZlcHJvcChkYXZfcHJvcGRiICpwcm9wZGIsCi0JCQkJICAgICAgIGNvbnN0IGRhdl94bWxfZWxlbSAqZWxlbSwKLQkJCQkgICAgICAgaW50IGdldHZhbHMsCi0JCQkJICAgICAgIGRhdl90ZXh0X2hlYWRlciAqcGhkciwKLQkJCQkgICAgICAgaW50ICppbnNlcnRlZCkKLXsKLSAgICBkYXZfcHJvcF9pbnNlcnQgcGk7Ci0KLSAgICAqaW5zZXJ0ZWQgPSAwOwotCi0gICAgaWYgKERBVl9JU19DT1JFX1BST1AoZWxlbS0+cHJvcGlkKSkKLQlyZXR1cm4gZGF2X2luc2VydF9jb3JlcHJvcChwcm9wZGIsIGVsZW0tPnByb3BpZCwgZWxlbS0+bmFtZSwKLQkJCQkgICBnZXR2YWxzLCBwaGRyLCBpbnNlcnRlZCk7Ci0KLSAgICAvKiBhc2sgdGhlIHByb3ZpZGVyICh0aGF0IGRlZmluZWQgdGhpcyBwcm9wKSB0byBpbnNlcnQgdGhlIHByb3AgKi8KLSAgICBwaSA9ICgqZWxlbS0+cHJvdmlkZXItPmluc2VydF9wcm9wKShwcm9wZGItPnJlc291cmNlLCBlbGVtLT5wcm9waWQsCi0JCQkJCWdldHZhbHMsIGVsZW0tPm5zX21hcCwgcGhkcik7Ci0jaWYgREFWX0RFQlVHCi0gICAgaWYgKHBpID09IERBVl9QUk9QX0lOU0VSVF9OT1RNRSkgewotCS8qICMjIyB0aGUgcHJvdmlkZXIgc2hvdWxkIGhhdmUgcmV0dXJuZWQgTk9UREVGLCBhdCBsZWFzdCAqLwotCXJldHVybiBkYXZfbmV3X2Vycm9yKHByb3BkYi0+cCwgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsIDAsCi0JCQkgICAgICJERVNJR04gRVJST1I6IGEgbGl2ZXByb3AgcHJvdmlkZXIgZGVmaW5lZCAiCi0JCQkgICAgICJhIHByb3BlcnR5LCBidXQgZGlkIG5vdCByZXNwb25kIHRvIHRoZSAiCi0JCQkgICAgICJpbnNlcnRfcHJvcCBob29rIGZvciBpdC4iKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGlmIChwaSAhPSBEQVZfUFJPUF9JTlNFUlRfTk9UREVGKQotCSppbnNlcnRlZCA9IDE7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgZGF2X2FwcGVuZF9wcm9wKGRhdl9wcm9wZGIgKnByb3BkYiwKLQkJCSAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwKLQkJCSAgICBkYXZfdGV4dF9oZWFkZXIgKnBoZHIpCi17Ci0gICAgY29uc3QgY2hhciAqczsKLSAgICBjb25zdCBjaGFyICpsYW5nID0gdmFsdWU7Ci0KLSAgICAvKiBza2lwIHBhc3QgdGhlIHhtbDpsYW5nIHZhbHVlICovCi0gICAgdmFsdWUgKz0gc3RybGVuKGxhbmcpICsgMTsKLQotICAgIGlmICgqdmFsdWUgPT0gJ1wwJykgewotCS8qIHRoZSBwcm9wZXJ0eSBpcyBhbiBlbXB0eSB2YWx1ZSAqLwotCWlmICgqbmFtZSA9PSAnOicpIHsKLQkgICAgLyogIm5vIG5hbWVzcGFjZSIgY2FzZSAqLwotCSAgICBzID0gYXBfcHNwcmludGYocHJvcGRiLT5wLCAiPCVzLz4iIERFQlVHX0NSLCBuYW1lKzEpOwotCX0KLQllbHNlIHsKLQkgICAgcyA9IGFwX3BzcHJpbnRmKHByb3BkYi0+cCwgIjxucyVzLz4iIERFQlVHX0NSLCBuYW1lKTsKLQl9Ci0gICAgfQotICAgIGVsc2UgaWYgKCpsYW5nICE9ICdcMCcpIHsKLQlpZiAoKm5hbWUgPT0gJzonKSB7Ci0JICAgIC8qICJubyBuYW1lc3BhY2UiIGNhc2UgKi8KLQkgICAgcyA9IGFwX3BzcHJpbnRmKHByb3BkYi0+cCwgIjwlcyB4bWw6bGFuZz1cIiVzXCI+JXM8LyVzPiIgREVCVUdfQ1IsCi0JCQkgICAgbmFtZSsxLCBsYW5nLCB2YWx1ZSwgbmFtZSsxKTsKLQl9Ci0JZWxzZSB7Ci0JICAgIHMgPSBhcF9wc3ByaW50Zihwcm9wZGItPnAsICI8bnMlcyB4bWw6bGFuZz1cIiVzXCI+JXM8L25zJXM+IiBERUJVR19DUiwKLQkJCSAgICBuYW1lLCBsYW5nLCB2YWx1ZSwgbmFtZSk7Ci0JfQotICAgIH0KLSAgICBlbHNlIGlmICgqbmFtZSA9PSAnOicpIHsKLQkvKiAibm8gbmFtZXNwYWNlIiBjYXNlICovCi0JcyA9IGFwX3BzcHJpbnRmKHByb3BkYi0+cCwgIjwlcz4lczwvJXM+IiBERUJVR19DUiwgbmFtZSsxLCB2YWx1ZSwgbmFtZSsxKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JcyA9IGFwX3BzcHJpbnRmKHByb3BkYi0+cCwgIjxucyVzPiVzPC9ucyVzPiIgREVCVUdfQ1IsIG5hbWUsIHZhbHVlLCBuYW1lKTsKLSAgICB9Ci0gICAgZGF2X3RleHRfYXBwZW5kKHByb3BkYi0+cCwgcGhkciwgcyk7Ci19Ci0KLS8qCi0qKiBQcmVwYXJlIHRoZSBuc19tYXAgdmFyaWFibGUgaW4gdGhlIHByb3BkYiBzdHJ1Y3R1cmUuIFRoaXMgZW50YWlscyBjb3B5aW5nCi0qKiBhbGwgVVJJcyBmcm9tIHRoZSAiaW5wdXQiIG5hbWVzcGFjZSBsaXN0IChpbiBwcm9wZGItPm5zX3hsYXRlKSBpbnRvIHRoZQotKiogcHJvcGRiJ3MgbGlzdCBvZiBuYW1lc3BhY2VzLiBBcyBlYWNoIFVSSSBpcyBjb3BpZWQgKG9yIHByZS1leGlzdGluZwotKiogVVJJIGxvb2tlZCB1cCksIHRoZSBpbmRleCBtYXBwaW5nIGlzIHN0b3JlZCBpbnRvIHRoZSBuc19tYXAgdmFyaWFibGUuCi0qKgotKiogTm90ZTogd2UgbXVzdCBjb3B5IGFsbCBkZWNsYXJlZCBuYW1lc3BhY2VzIGJlY2F1c2Ugd2UgY2Fubm90IGVhc2lseQotKiogICBkZXRlcm1pbmUgd2hpY2ggaW5wdXQgbmFtZXNwYWNlcyB3ZXJlIGFjdHVhbGx5IHVzZWQgd2l0aGluIHRoZSBwcm9wZXJ0eQotKiogICB2YWx1ZXMgdGhhdCBhcmUgYmVpbmcgc3RvcmVkIHdpdGhpbiB0aGUgcHJvcGRiLiBUaGVvcmV0aWNhbGx5LCB3ZSBjYW4KLSoqICAgZGV0ZXJtaW5lIHRoaXMgYXQgdGhlIHBvaW50IHdoZXJlIHdlIHNlcmlhbGl6ZSB0aGUgcHJvcGVydHkgdmFsdWVzCi0qKiAgIGJhY2sgaW50byBzdHJpbmdzLiBUaGlzIHdvdWxkIHJlcXVpcmUgYSBiaXQgbW9yZSB3b3JrLCBhbmQgd2lsbCBiZQotKiogICBsZWZ0IHRvIGZ1dHVyZSBvcHRpbWl6YXRpb25zLgotKioKLSoqICMjIyB3ZSBzaG91bGQgYWx3YXlzIGluaXRpYWxpemUgdGhlIHByb3BkYiBuYW1lc3BhY2UgYXJyYXkgd2l0aCAiREFWOiIKLSoqICMjIyBzaW5jZSB3ZSBrbm93IGl0IHdpbGwgYmUgZW50ZXJlZCBhbnlob3cgKGJ5IHZpcnR1ZSBvZiBpdCBhbHdheXMKLSoqICMjIyBvY2N1cnJpbmcgaW4gdGhlIG5zX3hsYXRlIGFycmF5KS4gVGhhdCB3aWxsIGFsbG93IHVzIHRvIHVzZQotKiogIyMjIERBVl9OU19EQVZfSUQgZm9yIHByb3BkYiBucyB2YWx1ZXMsIHRvby4KLSovCi1zdGF0aWMgdm9pZCBkYXZfcHJlcF9uc19tYXAoZGF2X3Byb3BkYiAqcHJvcGRiLCBpbnQgYWRkX25zKQotewotICAgIGludCBpOwotICAgIGNvbnN0IGNoYXIgKipwdXJpOwotICAgIGNvbnN0IGludCBvcmlnX2NvdW50ID0gcHJvcGRiLT5uc19jb3VudDsKLSAgICBpbnQgKnBtYXA7Ci0gICAgaW50IHVwZGF0aW5nID0gMDsJLyogYXJlIHdlIHVwZGF0aW5nIGFuIGV4aXN0aW5nIG5zX21hcD8gKi8KLQotICAgIGlmIChwcm9wZGItPm5zX21hcCkgewotCWlmIChhZGRfbnMgJiYgcHJvcGRiLT5pbmNvbXBsZXRlX21hcCkgewotCSAgICAvKiB3ZSBtdXN0IHJldmlzaXQgdGhlIG1hcCBhbmQgaW5zZXJ0IG5ldyBlbnRyaWVzICovCi0JICAgIHVwZGF0aW5nID0gMTsKLQkgICAgcHJvcGRiLT5pbmNvbXBsZXRlX21hcCA9IDA7Ci0JfQotCWVsc2UgewotCSAgICAvKiBub3RoaW5nIHRvIGRvOiB3ZSBoYXZlIGEgcHJvcGVyIG5zX21hcCAqLwotCSAgICByZXR1cm47Ci0JfQotICAgIH0KLSAgICBlbHNlIHsKLQlwcm9wZGItPm5zX21hcCA9IGFwX3BhbGxvYyhwcm9wZGItPnAsIHByb3BkYi0+bnNfeGxhdGUtPm5lbHRzICogc2l6ZW9mKCpwcm9wZGItPm5zX21hcCkpOwotICAgIH0KLQotICAgIHBtYXAgPSBwcm9wZGItPm5zX21hcDsKLQotICAgIC8qICMjIyBzdHVwaWQgTyhuICogb3JpZ19jb3VudCkgYWxnb3JpdGhtICovCi0gICAgZm9yIChpID0gcHJvcGRiLT5uc194bGF0ZS0+bmVsdHMsIHB1cmkgPSAoY29uc3QgY2hhciAqKilwcm9wZGItPm5zX3hsYXRlLT5lbHRzOwotCSBpLS0gPiAwOwotCSArK3B1cmksICsrcG1hcCkgewotCi0JY29uc3QgY2hhciAqdXJpID0gKnB1cmk7Ci0JY29uc3Qgc2l6ZV90IHVyaV9sZW4gPSBzdHJsZW4odXJpKTsKLQotCWlmICh1cGRhdGluZykgewotCSAgICAvKiB1cGRhdGluZyBhbiBleGlzdGluZyBtYXBwaW5nLi4uIHdlIGNhbiBza2lwIGEgbG90IG9mIHN0dWZmICovCi0KLQkgICAgaWYgKCpwbWFwICE9IERBVl9OU19FUlJPUl9OT1RfRk9VTkQpIHsKLQkJLyogVGhpcyBlbnRyeSBoYXMgYmVlbiBmaWxsZWQgaW4sIHNvIHdlIGNhbiBza2lwIGl0ICovCi0JCWNvbnRpbnVlOwotCSAgICB9Ci0JfQotCWVsc2UgewotCSAgICBpbnQgajsKLQkgICAgc2l6ZV90IGxlbjsKLQkgICAgY29uc3QgY2hhciAqcDsKLQotCSAgICAvKgotCSAgICAqKiBHSVZFTjogdXJpIChhIG5hbWVzcGFjZSBVUkkgZnJvbSB0aGUgcmVxdWVzdCBpbnB1dCkKLQkgICAgKioKLQkgICAgKiogRklORDogYW4gZXF1aXZhbGVudCBVUkkgaW4gdGhlIHByb3BkYiBuYW1lc3BhY2UgdGFibGUKLQkgICAgKi8KLQotCSAgICAvKiBvbmx5IHNjYW4gb3JpZ2luYWwgZW50cmllcyAod2UgbWF5IGhhdmUgYWRkZWQgc29tZSBpbiBoZXJlKSAqLwotCSAgICBmb3IgKHAgPSBwcm9wZGItPm5zX3RhYmxlLmJ1ZiArIHNpemVvZihkYXZfcHJvcGRiX21ldGFkYXRhKSwKLQkJICAgICBqID0gMDsKLQkJIGogPCBvcmlnX2NvdW50OwotCQkgKytqLCBwICs9IGxlbiArIDEpIHsKLQotCQlsZW4gPSBzdHJsZW4ocCk7Ci0KLQkJaWYgKHVyaV9sZW4gIT0gbGVuKQotCQkgICAgY29udGludWU7Ci0JCWlmIChtZW1jbXAodXJpLCBwLCBsZW4pID09IDApIHsKLQkJICAgICpwbWFwID0gajsKLQkJICAgIGdvdG8gbmV4dF9pbnB1dF91cmk7Ci0JCX0KLQkgICAgfQotCi0JICAgIGlmICghYWRkX25zKSB7Ci0JCSpwbWFwID0gREFWX05TX0VSUk9SX05PVF9GT1VORDsKLQotCQkvKgotCQkqKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgd2UgaGF2ZSBhbiBuc19tYXAgd2l0aCBtaXNzaW5nCi0JCSoqIGVudHJpZXMuIElmIGRhdl9wcmVwX25zX21hcCgpIGlzIGNhbGxlZCB3aXRoIGFkZF9ucz09MSBBTkQKLQkJKiogdGhpcyBmbGFnIGlzIHNldCwgdGhlbiB3ZSB6aXAgdGhydSB0aGUgYXJyYXkgYW5kIGFkZCB0aG9zZQotCQkqKiBVUklzIChlZmZlY3RpdmVseSB1cGRhdGluZyB0aGUgbnNfbWFwIGFzIGlmIGFkZF9ucz0xIHdhcwotCQkqKiBwYXNzZWQgd2hlbiB0aGUgaW5pdGlhbCBwcmVwIHdhcyBjYWxsZWQpLgotCQkqLwotCQlwcm9wZGItPmluY29tcGxldGVfbWFwID0gMTsKLQotCQljb250aW51ZTsKLQkgICAgfQotCX0KLQotCS8qCi0JKiogVGhlIGlucHV0IFVSSSB3YXMgbm90IGZvdW5kIGluIHRoZSBwcm9wZGIgbmFtZXNwYWNlIHRhYmxlLCBhbmQKLQkqKiB3ZSBhcmUgc3VwcG9zZWQgdG8gYWRkIGl0LiBBcHBlbmQgaXQgdG8gdGhlIHRhYmxlIGFuZCBzdG9yZQotCSoqIHRoZSBpbmRleCBpbnRvIHRoZSBuc19tYXAuCi0JKi8KLQlkYXZfY2hlY2tfYnVmc2l6ZShwcm9wZGItPnAsICZwcm9wZGItPm5zX3RhYmxlLCB1cmlfbGVuICsgMSk7Ci0JbWVtY3B5KHByb3BkYi0+bnNfdGFibGUuYnVmICsgcHJvcGRiLT5uc190YWJsZS5jdXJfbGVuLCB1cmksIHVyaV9sZW4gKyAxKTsKLQlwcm9wZGItPm5zX3RhYmxlLmN1cl9sZW4gKz0gdXJpX2xlbiArIDE7Ci0KLQlwcm9wZGItPm5zX3RhYmxlX2RpcnR5ID0gMTsKLQotCSpwbWFwID0gcHJvcGRiLT5uc19jb3VudCsrOwotCi0gICBuZXh0X2lucHV0X3VyaToKLQk7Ci0gICAgfQotfQotCi0vKiBmaW5kIHRoZSAiREFWOiIgbmFtZXNwYWNlIGluIG91ciB0YWJsZSBhbmQgcmV0dXJuIGl0cyBJRC4gKi8KLXN0YXRpYyBpbnQgZGF2X2ZpbmRfZGF2X2lkKGRhdl9wcm9wZGIgKnByb3BkYikKLXsKLSAgICBjb25zdCBjaGFyICpwID0gcHJvcGRiLT5uc190YWJsZS5idWYgKyBzaXplb2YoZGF2X3Byb3BkYl9tZXRhZGF0YSk7Ci0gICAgaW50IG5zOwotCi0gICAgZm9yIChucyA9IDA7IG5zIDwgcHJvcGRiLT5uc19jb3VudDsgKytucykgewotCXNpemVfdCBsZW4gPSBzdHJsZW4ocCk7Ci0KLQlpZiAobGVuID09IDQgJiYgbWVtY21wKHAsICJEQVY6IiwgNSkgPT0gMCkKLQkgICAgcmV0dXJuIG5zOwotCXAgKz0gbGVuICsgMTsKLSAgICB9Ci0KLSAgICAvKiB0aGUgIkRBVjoiIG5hbWVzcGFjZSBpcyBub3QgcHJlc2VudCAqLwotICAgIHJldHVybiAtMTsKLX0KLQotc3RhdGljIHZvaWQgZGF2X2luc2VydF94bWxucyhwb29sICpwLCBjb25zdCBjaGFyICpwcmVfcHJlZml4LCBpbnQgbnMsCi0JCQkgICAgIGNvbnN0IGNoYXIgKm5zX3VyaSwgZGF2X3RleHRfaGVhZGVyICpwaGRyKQotewotICAgIGNvbnN0IGNoYXIgKnM7Ci0KLSAgICBzID0gYXBfcHNwcmludGYocCwgIiB4bWxuczolcyVkPVwiJXNcIiIsIHByZV9wcmVmaXgsIG5zLCBuc191cmkpOwotICAgIGRhdl90ZXh0X2FwcGVuZChwLCBwaGRyLCBzKTsKLX0KLQotLyogcmV0dXJuIGFsbCBrbm93biBuYW1lc3BhY2VzIChpbiB0aGlzIHByb3BkYikgKi8KLXN0YXRpYyB2b2lkIGRhdl9nZXRfcHJvcGRiX3htbG5zKGRhdl9wcm9wZGIgKnByb3BkYiwgZGF2X3RleHRfaGVhZGVyICpwaGRyKQotewotICAgIGludCBpOwotICAgIGNvbnN0IGNoYXIgKnAgPSBwcm9wZGItPm5zX3RhYmxlLmJ1ZiArIHNpemVvZihkYXZfcHJvcGRiX21ldGFkYXRhKTsKLSAgICBzaXplX3QgbGVuOwotCi0gICAgLyogbm90ZTogbnNfY291bnQgPT0gMCB3aGVuIHdlIGhhdmUgbm8gcHJvcGRiIGZpbGUgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgcHJvcGRiLT5uc19jb3VudDsgKytpLCBwICs9IGxlbiArIDEpIHsKLQotCWxlbiA9IHN0cmxlbihwKTsKLQotCWRhdl9pbnNlcnRfeG1sbnMocHJvcGRiLT5wLCAibnMiLCBpLCBwLCBwaGRyKTsKLSAgICB9Ci19Ci0KLS8qIGFkZCBhIG5hbWVzcGFjZSBkZWNsIGZyb20gb25lIG9mIHRoZSBuYW1lc3BhY2UgdGFibGVzICovCi1zdGF0aWMgdm9pZCBkYXZfYWRkX21hcmtlZF94bWxucyhkYXZfcHJvcGRiICpwcm9wZGIsIGNoYXIgKm1hcmtzLCBpbnQgbnMsCi0JCQkJIGFycmF5X2hlYWRlciAqbnNfdGFibGUsCi0JCQkJIGNvbnN0IGNoYXIgKnByZV9wcmVmaXgsCi0JCQkJIGRhdl90ZXh0X2hlYWRlciAqcGhkcikKLXsKLSAgICBpZiAobWFya3NbbnNdKQotCXJldHVybjsKLSAgICBtYXJrc1tuc10gPSAxOwotCi0gICAgZGF2X2luc2VydF94bWxucyhwcm9wZGItPnAsCi0JCSAgICAgcHJlX3ByZWZpeCwgbnMsIERBVl9HRVRfVVJJX0lURU0obnNfdGFibGUsIG5zKSwKLQkJICAgICBwaGRyKTsKLX0KLQotLyoKLSoqIEludGVybmFsIGZ1bmN0aW9uIHRvIGJ1aWxkIGEga2V5Ci0qKgotKiogV0FSTklORzogcmV0dXJucyBhIHBvaW50ZXIgdG8gYSAic3RhdGljIiBidWZmZXIgaG9sZGluZyB0aGUga2V5LiBUaGUKLSoqICAgICAgICAgIHZhbHVlIG11c3QgYmUgY29waWVkIG9yIG5vIGxvbmdlciB1c2VkIGlmIHRoaXMgZnVuY3Rpb24gaXMKLSoqICAgICAgICAgIGNhbGxlZCBhZ2Fpbi4KLSovCi1zdGF0aWMgZGF2X2RhdHVtIGRhdl9nZGJtX2tleShkYXZfcHJvcGRiICpwcm9wZGIsIGNvbnN0IGRhdl94bWxfZWxlbSAqZWxlbSkKLXsKLSAgICBpbnQgbnM7Ci0gICAgY2hhciBuc2J1ZlsyMF07Ci0gICAgc2l6ZV90IGxfbnM7Ci0gICAgc2l6ZV90IGxfbmFtZSA9IHN0cmxlbihlbGVtLT5uYW1lKTsKLSAgICBkYXZfZGF0dW0ga2V5ID0geyAwIH07Ci0KLSAgICAvKgotICAgICAqIENvbnZlcnQgbmFtZXNwYWNlIElEIHRvIGEgc3RyaW5nLiAibm8gbmFtZXNwYWNlIiBpcyBhbiBlbXB0eSBzdHJpbmcsCi0gICAgICogc28gdGhlIGtleXMgd2lsbCBoYXZlIHRoZSBmb3JtICI6bmFtZSIuIE90aGVyd2lzZSwgdGhlIGtleXMgd2lsbAotICAgICAqIGhhdmUgdGhlIGZvcm0gIiM6bmFtZSIuCi0gICAgICovCi0gICAgaWYgKGVsZW0tPm5zID09IERBVl9OU19OT05FKSB7Ci0JbnNidWZbMF0gPSAnXDAnOwotCWxfbnMgPSAwOwotICAgIH0KLSAgICBlbHNlIHsKLQlpZiAocHJvcGRiLT5uc19tYXAgPT0gTlVMTCkgewotCSAgICAvKgotCSAgICAgKiBOb3RlIHRoYXQgd2UgcHJlcCB0aGUgbWFwIGFuZCBkbyBOT1QgYWRkIG5hbWVzcGFjZXMuIElmIHRoYXQKLQkgICAgICogaXMgcmVxdWlyZWQsIHRoZW4gdGhlIGNhbGxlciBzaG91bGQgaGF2ZSBjYWxsZWQgcHJlcAotCSAgICAgKiBiZWZvcmVoYW5kLCBwYXNzaW5nIHRoZSBjb3JyZWN0IHZhbHVlcy4KLQkgICAgICovCi0JICAgIGRhdl9wcmVwX25zX21hcChwcm9wZGIsIDApOwotCX0KLQotCW5zID0gcHJvcGRiLT5uc19tYXBbZWxlbS0+bnNdOwotCWlmIChEQVZfTlNfSVNfRVJST1IobnMpKQotCSAgICByZXR1cm4ga2V5OwkJLyogemVyb2VkICovCi0KLQlsX25zID0gc3ByaW50Zihuc2J1ZiwgIiVkIiwgbnMpOwotICAgIH0KLQotICAgIC8qIGFzc2VtYmxlOiAjOm5hbWUgKi8KLSAgICBkYXZfc2V0X2J1ZnNpemUocHJvcGRiLT5wLCAmcHJvcGRiLT53Yl9rZXksIGxfbnMgKyAxICsgbF9uYW1lICsgMSk7Ci0gICAgbWVtY3B5KHByb3BkYi0+d2Jfa2V5LmJ1ZiwgbnNidWYsIGxfbnMpOwotICAgIHByb3BkYi0+d2Jfa2V5LmJ1ZltsX25zXSA9ICc6JzsKLSAgICBtZW1jcHkoJnByb3BkYi0+d2Jfa2V5LmJ1ZltsX25zICsgMV0sIGVsZW0tPm5hbWUsIGxfbmFtZSArIDEpOwotCi0gICAgLyogYnVpbGQgdGhlIGRhdGFiYXNlIGtleSAqLwotICAgIGtleS5kc2l6ZSA9IGxfbnMgKyAxICsgbF9uYW1lICsgMTsKLSAgICBrZXkuZHB0ciA9IHByb3BkYi0+d2Jfa2V5LmJ1ZjsKLQotICAgIHJldHVybiBrZXk7Ci19Ci0KLWRhdl9lcnJvciAqZGF2X3JlYWxseV9vcGVuX2RiKGRhdl9wcm9wZGIgKnByb3BkYiwgaW50IHJvKQotewotICAgIGRhdl9lcnJvciAqZXJyOwotICAgIGRhdl9kYXR1bSBrZXk7Ci0gICAgZGF2X2RhdHVtIHZhbHVlID0geyAwIH07Ci0KLSAgICAvKiB3ZSdyZSB0cnlpbmcgdG8gb3BlbiB0aGUgZGI7IHR1cm4gb2ZmIHRoZSAnZGVmZXJyZWQnIGZsYWcgKi8KLSAgICBwcm9wZGItPmRlZmVycmVkID0gMDsKLQotICAgIC8qIGFzayB0aGUgREIgcHJvdmlkZXIgdG8gb3BlbiB0aGUgdGhpbmcgKi8KLSAgICBlcnIgPSAoKnByb3BkYi0+ZGJfaG9va3MtPm9wZW4pKHByb3BkYi0+cCwgcHJvcGRiLT5yZXNvdXJjZSwgcm8sCi0JCQkJICAgICZwcm9wZGItPmRiKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLQlyZXR1cm4gZGF2X3B1c2hfZXJyb3IocHJvcGRiLT5wLCBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKLQkJCSAgICAgIERBVl9FUlJfUFJPUF9PUEVOSU5HLAotCQkJICAgICAgIkNvdWxkIG5vdCBvcGVuIHRoZSBwcm9wZXJ0eSBkYXRhYmFzZS4iLAotCQkJICAgICAgZXJyKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICoqIE5PVEU6IHByb3BkYi0+ZGIgY291bGQgYmUgTlVMTCBpZiB3ZSBhdHRlbXB0ZWQgdG8gb3BlbiBhIHJlYWRvbmx5Ci0gICAgKiogICAgICAgZGF0YWJhc2UgdGhhdCBkb2Vzbid0IGV4aXN0LiBJZiB3ZSByZXF1aXJlIHJlYWQvd3JpdGUKLSAgICAqKiAgICAgICBhY2Nlc3MsIHRoZW4gYSBkYXRhYmFzZSB3YXMgY3JlYXRlZCBhbmQgb3BlbmVkLgotICAgICovCi0KLSAgICBpZiAocHJvcGRiLT5kYiAhPSBOVUxMKSB7Ci0Ja2V5LmRwdHIgPSBEQVZfR0RCTV9OU19LRVk7Ci0Ja2V5LmRzaXplID0gREFWX0dEQk1fTlNfS0VZX0xFTjsKLQlpZiAoKGVyciA9ICgqcHJvcGRiLT5kYl9ob29rcy0+ZmV0Y2gpKHByb3BkYi0+ZGIsIGtleSwKLQkJCQkJICAgICAgJnZhbHVlKSkgIT0gTlVMTCkgewotCSAgICAvKiAjIyMgcHVzaCBhIGhpZ2hlci1sZXZlbCBkZXNjcmlwdGlvbj8gKi8KLQkgICAgcmV0dXJuIGVycjsKLQl9Ci0gICAgfQotICAgIGlmICh2YWx1ZS5kcHRyID09IE5VTEwpIHsKLQlkYXZfcHJvcGRiX21ldGFkYXRhIG0gPSB7Ci0JICAgIERBVl9EQlZTTl9NQUpPUiwgREFWX0RCVlNOX01JTk9SLCAwCi0JfTsKLQotCWlmIChwcm9wZGItPmRiICE9IE5VTEwpIHsKLQkgICAgLyoKLQkgICAgICogSWYgdGhlcmUgaXMgbm8gTUVUQURBVEEga2V5LCB0aGVuIHRoZSBkYXRhYmFzZSBtYXkgYmUKLQkgICAgICogZnJvbSB2ZXJzaW9ucyAwLjkuMCAuLiAwLjkuNCAod2hpY2ggd291bGQgYmUgaW5jb21wYXRpYmxlKS4KLQkgICAgICogVGhlc2UgY2FuIGJlIGlkZW50aWZpZWQgYnkgdGhlIHByZXNlbmNlIG9mIGFuIE5TX1RBQkxFIGVudHJ5LgotCSAgICAgKi8KLQkgICAga2V5LmRwdHIgPSAiTlNfVEFCTEUiOwotCSAgICBrZXkuZHNpemUgPSA4OwotCSAgICBpZiAoKCpwcm9wZGItPmRiX2hvb2tzLT5leGlzdHMpKHByb3BkYi0+ZGIsIGtleSkpIHsKLQkJKCpwcm9wZGItPmRiX2hvb2tzLT5jbG9zZSkocHJvcGRiLT5kYik7Ci0KLQkJLyogY2FsbCBpdCBhIG1ham9yIHZlcnNpb24gZXJyb3IgKi8KLQkJcmV0dXJuIGRhdl9uZXdfZXJyb3IocHJvcGRiLT5wLCBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKLQkJCQkgICAgIERBVl9FUlJfUFJPUF9CQURfTUFKT1IsCi0JCQkJICAgICAiUHJvcCBkYXRhYmFzZSBoYXMgdGhlIHdyb25nIG1ham9yICIKLQkJCQkgICAgICJ2ZXJzaW9uIG51bWJlciBhbmQgY2Fubm90IGJlIHVzZWQuIik7Ci0JICAgIH0KLQl9Ci0KLQkvKiBpbml0aWFsaXplIGEgbmV3IG1ldGFkYXRhIHN0cnVjdHVyZSAqLwotCWRhdl9zZXRfYnVmc2l6ZShwcm9wZGItPnAsICZwcm9wZGItPm5zX3RhYmxlLCBzaXplb2YobSkpOwotCW1lbWNweShwcm9wZGItPm5zX3RhYmxlLmJ1ZiwgJm0sIHNpemVvZihtKSk7Ci0gICAgfQotICAgIGVsc2UgewotCWRhdl9wcm9wZGJfbWV0YWRhdGEgbTsKLQotCWRhdl9zZXRfYnVmc2l6ZShwcm9wZGItPnAsICZwcm9wZGItPm5zX3RhYmxlLCB2YWx1ZS5kc2l6ZSk7Ci0JbWVtY3B5KHByb3BkYi0+bnNfdGFibGUuYnVmLCB2YWx1ZS5kcHRyLCB2YWx1ZS5kc2l6ZSk7Ci0KLQltZW1jcHkoJm0sIHZhbHVlLmRwdHIsIHNpemVvZihtKSk7Ci0JaWYgKG0ubWFqb3IgIT0gREFWX0RCVlNOX01BSk9SKSB7Ci0JICAgICgqcHJvcGRiLT5kYl9ob29rcy0+Y2xvc2UpKHByb3BkYi0+ZGIpOwotCi0JICAgIHJldHVybiBkYXZfbmV3X2Vycm9yKHByb3BkYi0+cCwgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsCi0JCQkJIERBVl9FUlJfUFJPUF9CQURfTUFKT1IsCi0JCQkJICJQcm9wIGRhdGFiYXNlIGhhcyB0aGUgd3JvbmcgbWFqb3IgIgotCQkJCSAidmVyc2lvbiBudW1iZXIgYW5kIGNhbm5vdCBiZSB1c2VkLiIpOwotCX0KLQlwcm9wZGItPnZlcnNpb24gPSBtLm1pbm9yOwotCXByb3BkYi0+bnNfY291bnQgPSBudG9ocyhtLm5zX2NvdW50KTsKLQotCSgqcHJvcGRiLT5kYl9ob29rcy0+ZnJlZWRhdHVtKShwcm9wZGItPmRiLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWRhdl9lcnJvciAqZGF2X29wZW5fcHJvcGRiKHJlcXVlc3RfcmVjICpyLCBkYXZfbG9ja2RiICpsb2NrZGIsCi0JCQkgICBkYXZfcmVzb3VyY2UgKnJlc291cmNlLAotCQkJICAgaW50IHJvLAotCQkJICAgYXJyYXlfaGVhZGVyICogbnNfeGxhdGUsCi0JCQkgICBkYXZfcHJvcGRiICoqcF9wcm9wZGIpCi17Ci0gICAgZGF2X3Byb3BkYiAqcHJvcGRiID0gYXBfcGNhbGxvYyhyLT5wb29sLCBzaXplb2YoKnByb3BkYikpOwotICAgIGRhdl9lcnJvciAqZXJyOwotCi0gICAgKnBfcHJvcGRiID0gTlVMTDsKLQotI2lmIERBVl9ERUJVRwotICAgIGlmIChyZXNvdXJjZS0+dXJpID09IE5VTEwpIHsKLQlyZXR1cm4gZGF2X25ld19lcnJvcihyLT5wb29sLCBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgMCwKLQkJCSAgICAgIklOVEVSTkFMIERFU0lHTiBFUlJPUjogcmVzb3VyY2UgbXVzdCBkZWZpbmUgIgotCQkJICAgICAiaXRzIFVSSS4iKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHByb3BkYi0+dmVyc2lvbiA9IERBVl9EQlZTTl9NSU5PUjsKLSAgICBwcm9wZGItPnIgPSByOwotICAgIHByb3BkYi0+cCA9IHItPnBvb2w7IC8qICMjIyBnZXQgcmlkIG9mIHRoaXMgKi8KLSAgICBwcm9wZGItPnJlc291cmNlID0gcmVzb3VyY2U7Ci0gICAgcHJvcGRiLT5uc194bGF0ZSA9IG5zX3hsYXRlOwotCi0gICAgcHJvcGRiLT5kYl9ob29rcyA9IERBVl9HRVRfSE9PS1NfUFJPUERCKHIpOwotICAgIHByb3BkYi0+dnNuX2hvb2tzID0gREFWX0dFVF9IT09LU19WU04ocik7Ci0KLSAgICBwcm9wZGItPmxpdmVwcm9wID0gZGF2X2dldF9wcm92aWRlcl9ob29rcyhyLCBEQVZfRFlOX1RZUEVfTElWRVBST1ApOwotCi0gICAgcHJvcGRiLT5sb2NrZGIgPSBsb2NrZGI7Ci0KLSAgICBpZiAoIXJvKSB7Ci0JcHJvcGRiLT5kZWZlcnJlZCA9IDE7Ci0gICAgfQotICAgIGVsc2UgaWYgKChlcnIgPSBkYXZfcmVhbGx5X29wZW5fZGIocHJvcGRiLCAxIC8qIHJvICovKSkgIT0gTlVMTCkgewotCXJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogIyMjIHdoYXQgdG8gZG8gYWJvdXQgY2xvc2luZyB0aGUgcHJvcGRiIG9uIHNlcnZlciBmYWlsdXJlPyAqLwotCi0gICAgKnBfcHJvcGRiID0gcHJvcGRiOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIGRhdl9jbG9zZV9wcm9wZGIoZGF2X3Byb3BkYiAqcHJvcGRiKQotewotICAgIGlmIChwcm9wZGItPmRiID09IE5VTEwpCi0JcmV0dXJuOwotCi0gICAgaWYgKHByb3BkYi0+bnNfdGFibGVfZGlydHkpIHsKLQlkYXZfcHJvcGRiX21ldGFkYXRhIG07Ci0JZGF2X2RhdHVtIGtleTsKLQlkYXZfZGF0dW0gdmFsdWU7Ci0JZGF2X2Vycm9yICplcnI7Ci0KLQlrZXkuZHB0ciA9IERBVl9HREJNX05TX0tFWTsKLQlrZXkuZHNpemUgPSBEQVZfR0RCTV9OU19LRVlfTEVOOwotCi0JdmFsdWUuZHB0ciA9IHByb3BkYi0+bnNfdGFibGUuYnVmOwotCXZhbHVlLmRzaXplID0gcHJvcGRiLT5uc190YWJsZS5jdXJfbGVuOwotCi0JLyogZmlsbCBpbiB0aGUgbWV0YWRhdGEgdGhhdCB3ZSBzdG9yZSBpbnRvIHRoZSBwcm9wIGRiLiAqLwotCW0ubWFqb3IgPSBEQVZfREJWU05fTUFKT1I7Ci0JbS5taW5vciA9IHByb3BkYi0+dmVyc2lvbjsJLyogIyMjIGtlZXAgY3VycmVudCBtaW5vciB2ZXJzaW9uPyAqLwotCW0ubnNfY291bnQgPSBodG9ucyhwcm9wZGItPm5zX2NvdW50KTsKLQotCW1lbWNweShwcm9wZGItPm5zX3RhYmxlLmJ1ZiwgJm0sIHNpemVvZihtKSk7Ci0KLQllcnIgPSAoKnByb3BkYi0+ZGJfaG9va3MtPnN0b3JlKShwcm9wZGItPmRiLCBrZXksIHZhbHVlKTsKLQkvKiAjIyMgd2hhdCB0byBkbyB3aXRoIHRoZSBlcnJvcj8gKi8KLSAgICB9Ci0KLSAgICAoKnByb3BkYi0+ZGJfaG9va3MtPmNsb3NlKShwcm9wZGItPmRiKTsKLX0KLQotZGF2X2dldF9wcm9wc19yZXN1bHQgZGF2X2dldF9hbGxwcm9wcyhkYXZfcHJvcGRiICpwcm9wZGIsIGludCBnZXR2YWxzKQotewotICAgIGNvbnN0IGRhdl9ob29rc19kYiAqZGJfaG9va3MgPSBwcm9wZGItPmRiX2hvb2tzOwotICAgIGRhdl90ZXh0X2hlYWRlciBoZHIgPSB7IDAgfTsKLSAgICBkYXZfdGV4dF9oZWFkZXIgaGRyX25zID0geyAwIH07Ci0gICAgZGF2X2dldF9wcm9wc19yZXN1bHQgcmVzdWx0ID0geyAwIH07Ci0gICAgaW50IGZvdW5kX3Jlc291cmNldHlwZSA9IDA7Ci0gICAgaW50IGZvdW5kX2NvbnRlbnR0eXBlID0gMDsKLSAgICBpbnQgZm91bmRfY29udGVudGxhbmcgPSAwOwotICAgIGludCB1bnVzZWRfaW5zZXJ0ZWQ7Ci0gICAgaW50IGk7Ci0gICAgY29uc3QgY2hhciAqIGNvbnN0ICogc2Nhbl91cmk7Ci0gICAgY29uc3QgZGF2X2R5bl9ob29rcyAqZGRoOwotCi0gICAgLyogZ2VuZXJhdGUgYWxsIHRoZSBuYW1lc3BhY2VzIHRoYXQgYXJlIGluIHRoZSBwcm9wZGIgKi8KLSAgICBkYXZfZ2V0X3Byb3BkYl94bWxucyhwcm9wZGIsICZoZHJfbnMpOwotCi0gICAgLyogaW5pdGlhbGl6ZSB0aGUgcmVzdWx0IHdpdGggc29tZSBzdGFydCB0YWdzLi4uICovCi0gICAgZGF2X3RleHRfYXBwZW5kKHByb3BkYi0+cCwgJmhkciwKLQkJICAgICI8RDpwcm9wc3RhdD4iIERFQlVHX0NSCi0JCSAgICAiPEQ6cHJvcD4iIERFQlVHX0NSKTsKLQotICAgIC8qIGlmIHRoZXJlIEFSRSBwcm9wZXJ0aWVzLCB0aGVuIHNjYW4gdGhlbSAqLwotICAgIGlmIChwcm9wZGItPmRiICE9IE5VTEwpIHsKLQlkYXZfZGF0dW0ga2V5OwotCWludCBkYXZfaWQgPSBkYXZfZmluZF9kYXZfaWQocHJvcGRiKTsKLQotCSh2b2lkKSAoKmRiX2hvb2tzLT5maXJzdGtleSkocHJvcGRiLT5kYiwgJmtleSk7Ci0Jd2hpbGUgKGtleS5kcHRyKSB7Ci0JICAgIGRhdl9kYXR1bSBwcmV2a2V5OwotCi0JICAgIC8qIGFueSBrZXlzIHdpdGggbGVhZGluZyBjYXBpdGFsIGxldHRlcnMgc2hvdWxkIGJlIHNraXBwZWQKLQkgICAgICAgKHJlYWwga2V5cyBzdGFydCB3aXRoIGEgbnVtYmVyIG9yIGEgY29sb24pICovCi0JICAgIGlmICgqa2V5LmRwdHIgPj0gJ0EnICYmICprZXkuZHB0ciA8PSAnWicpCi0JCWdvdG8gbmV4dF9rZXk7Ci0KLQkgICAgLyoKLQkgICAgKiogU2VlIGlmIHRoaXMgaXMgdGhlIDxEQVY6cmVzb3VyY2V0eXBlPiBwcm9wZXJ0eS4gV2UgbmVlZCB0bwotCSAgICAqKiBrbm93IHdoZXRoZXIgaXQgd2FzIGZvdW5kIChhbmQgdGhlcmVmb3JlLCB3aGV0aGVyIHRvIHN1cHBseQotCSAgICAqKiBhIGRlZmF1bHQgbGF0ZXIpLgotCSAgICAqKgotCSAgICAqKiBXZSBhbHNvIGxvb2sgZm9yIDxEQVY6Z2V0Y29udGVudHR5cGU+IGFuZAotCSAgICAqKiA8REFWOmdldGNvbnRlbnRsYW5ndWFnZT4uIElmIHRoZXkgYXJlIG5vdCBzdG9yZWQgYXMgZGVhZAotCSAgICAqKiBwcm9wZXJ0aWVzLCB0aGVuIHdlIG5lZWQgdG8gcGVyZm9ybSBhIHN1YnJlcXVlc3QgdG8gZ2V0Ci0JICAgICoqIHRoZWlyIHZhbHVlcyAoaWYgYW55KS4KLQkgICAgKi8KLQkgICAgaWYgKGRhdl9pZCAhPSAtMQotCQkmJiAqa2V5LmRwdHIgIT0gJzonCi0JCSYmIGRhdl9pZCA9PSBhdG9pKGtleS5kcHRyKSkgewotCi0JCWNvbnN0IGNoYXIgKmNvbG9uOwotCi0JCS8qIGZpbmQgdGhlIGNvbG9uICovCi0JCWlmICgga2V5LmRwdHJbMV0gPT0gJzonICkgewotCQkgICAgY29sb24gPSBrZXkuZHB0ciArIDE7Ci0JCX0KLQkJZWxzZSB7Ci0JCSAgICBjb2xvbiA9IHN0cmNocihrZXkuZHB0ciArIDIsICc6Jyk7Ci0JCX0KLQotCQlpZiAoY29sb25bMV0gPT0gJ3InCi0JCSAgICAmJiBzdHJjbXAoY29sb24gKyAxLCAicmVzb3VyY2V0eXBlIikgPT0gMCkgewotCi0JCSAgICBmb3VuZF9yZXNvdXJjZXR5cGUgPSAxOwotCQl9Ci0JCWVsc2UgaWYgKGNvbG9uWzFdID09ICdnJykgewotCQkgICAgaWYgKHN0cmNtcChjb2xvbiArIDEsICJnZXRjb250ZW50dHlwZSIpID09IDApIHsKLQkJCWZvdW5kX2NvbnRlbnR0eXBlID0gMTsKLQkJICAgIH0KLQkJICAgIGVsc2UgaWYgKHN0cmNtcChjb2xvbiArIDEsICJnZXRjb250ZW50bGFuZ3VhZ2UiKSA9PSAwKSB7Ci0JCQlmb3VuZF9jb250ZW50bGFuZyA9IDE7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICAgIGlmIChnZXR2YWxzKSB7Ci0JCWRhdl9kYXR1bSB2YWx1ZTsKLQotCQkodm9pZCkgKCpkYl9ob29rcy0+ZmV0Y2gpKHByb3BkYi0+ZGIsIGtleSwgJnZhbHVlKTsKLQkJaWYgKHZhbHVlLmRwdHIgPT0gTlVMTCkgewotCQkgICAgLyogIyMjIGFueXRoaW5nIGJldHRlciB0byBkbz8gKi8KLQkJICAgIC8qICMjIyBwcm9iYWJseSBzaG91bGQgZW50ZXIgYSA1MDAgZXJyb3IgKi8KLQkJICAgIGdvdG8gbmV4dF9rZXk7Ci0JCX0KLQotCQkvKiBwdXQgdGhlIHByb3AgbmFtZSBhbmQgdmFsdWUgaW50byB0aGUgcmVzdWx0ICovCi0JCWRhdl9hcHBlbmRfcHJvcChwcm9wZGIsIGtleS5kcHRyLCB2YWx1ZS5kcHRyLCAmaGRyKTsKLQotCQkoKmRiX2hvb2tzLT5mcmVlZGF0dW0pKHByb3BkYi0+ZGIsIHZhbHVlKTsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJLyogc2ltcGxlLCBlbXB0eSBlbGVtZW50IGlmIGEgdmFsdWUgaXNuJ3QgbmVlZGVkICovCi0JCWRhdl9hcHBlbmRfcHJvcChwcm9wZGIsIGtleS5kcHRyLCBEQVZfRU1QVFlfVkFMVUUsICZoZHIpOwotCSAgICB9Ci0KLQkgIG5leHRfa2V5OgotCSAgICBwcmV2a2V5ID0ga2V5OwotCSAgICAodm9pZCkgKCpkYl9ob29rcy0+bmV4dGtleSkocHJvcGRiLT5kYiwgJmtleSk7Ci0JICAgICgqZGJfaG9va3MtPmZyZWVkYXR1bSkocHJvcGRiLT5kYiwgcHJldmtleSk7Ci0JfQotICAgIH0KLQotICAgIC8qIGFkZCBuYW1lc3BhY2VzIGZvciBhbGwgdGhlIGxpdmVwcm9wIHByb3ZpZGVycyAqLwotICAgIGZvciAoaSA9IDAsIHNjYW5fdXJpID0gKGNvbnN0IGNoYXIgKiBjb25zdCAqKWRhdl9saXZlcHJvcF91cmlzLT5lbHRzOwotCSBpIDwgZGF2X2xpdmVwcm9wX3VyaXMtPm5lbHRzOwotCSArK2ksICsrc2Nhbl91cmkpCi0JZGF2X2luc2VydF94bWxucyhwcm9wZGItPnAsICJscCIsIGksICpzY2FuX3VyaSwgJmhkcl9ucyk7Ci0gICAgCi0gICAgLyogYXNrIHRoZSBsaXZlcHJvcCBwcm92aWRlcnMgdG8gaW5zZXJ0IHRoZWlyIHByb3BlcnRpZXMgKi8KLSAgICBmb3IgKGRkaCA9IHByb3BkYi0+bGl2ZXByb3A7IGRkaCAhPSBOVUxMOyBkZGggPSBkZGgtPm5leHQpIHsKLQkoKkRBVl9BU19IT09LU19MSVZFUFJPUChkZGgpLT5pbnNlcnRfYWxsKShwcm9wZGItPnJlc291cmNlLCBnZXR2YWxzLAotCQkJCQkJICBkZGgtPmN0eC5uc19tYXAsCi0JCQkJCQkgICZoZHIpOwotICAgIH0KLQotICAgIC8qIGluc2VydCB0aGUgc3RhbmRhcmQgcHJvcGVydGllcyAqLwotICAgIC8qICMjIyBzaG91bGQgYmUgaGFuZGxpbmcgdGhlIHJldHVybiBlcnJvcnMgaGVyZSAqLwotICAgICh2b2lkKWRhdl9pbnNlcnRfY29yZXByb3AocHJvcGRiLAotCQkJICAgICAgREFWX1BST1BJRF9DT1JFX3N1cHBvcnRlZGxvY2ssICJzdXBwb3J0ZWRsb2NrIiwKLQkJCSAgICAgIGdldHZhbHMsICZoZHIsICZ1bnVzZWRfaW5zZXJ0ZWQpOwotICAgICh2b2lkKWRhdl9pbnNlcnRfY29yZXByb3AocHJvcGRiLAotCQkJICAgICAgREFWX1BST1BJRF9DT1JFX2xvY2tkaXNjb3ZlcnksICJsb2NrZGlzY292ZXJ5IiwKLQkJCSAgICAgIGdldHZhbHMsICZoZHIsICZ1bnVzZWRfaW5zZXJ0ZWQpOwotCi0gICAgLyogaWYgdGhlIHJlc291cmNldHlwZSB3YXNuJ3Qgc3RvcmVkLCB0aGVuIHByZXBhcmUgb25lICovCi0gICAgaWYgKCFmb3VuZF9yZXNvdXJjZXR5cGUpIHsKLQkvKiAjIyMgc2hvdWxkIGJlIGhhbmRsaW5nIHRoZSByZXR1cm4gZXJyb3IgaGVyZSAqLwotCSh2b2lkKWRhdl9pbnNlcnRfY29yZXByb3AocHJvcGRiLAotCQkJCSAgREFWX1BST1BJRF9DT1JFX3Jlc291cmNldHlwZSwgInJlc291cmNldHlwZSIsCi0JCQkJICBnZXR2YWxzLCAmaGRyLCAmdW51c2VkX2luc2VydGVkKTsKLSAgICB9Ci0KLSAgICAvKiBpZiB3ZSBkaWRuJ3QgZmluZCB0aGVzZSwgdGhlbiBkbyB0aGUgd2hvbGUgc3VicmVxIHRoaW5nLiAqLwotICAgIGlmICghZm91bmRfY29udGVudHR5cGUpIHsKLQkvKiAjIyMgc2hvdWxkIGJlIGhhbmRsaW5nIHRoZSByZXR1cm4gZXJyb3IgaGVyZSAqLwotCSh2b2lkKWRhdl9pbnNlcnRfY29yZXByb3AocHJvcGRiLAotCQkJCSAgREFWX1BST1BJRF9DT1JFX2dldGNvbnRlbnR0eXBlLAotCQkJCSAgImdldGNvbnRlbnR0eXBlIiwKLQkJCQkgIGdldHZhbHMsICZoZHIsICZ1bnVzZWRfaW5zZXJ0ZWQpOwotICAgIH0KLSAgICBpZiAoIWZvdW5kX2NvbnRlbnRsYW5nKSB7Ci0JLyogIyMjIHNob3VsZCBiZSBoYW5kbGluZyB0aGUgcmV0dXJuIGVycm9yIGhlcmUgKi8KLQkodm9pZClkYXZfaW5zZXJ0X2NvcmVwcm9wKHByb3BkYiwKLQkJCQkgIERBVl9QUk9QSURfQ09SRV9nZXRjb250ZW50bGFuZ3VhZ2UsCi0JCQkJICAiZ2V0Y29udGVudGxhbmd1YWdlIiwKLQkJCQkgIGdldHZhbHMsICZoZHIsICZ1bnVzZWRfaW5zZXJ0ZWQpOwotICAgIH0KLQotICAgIC8qIHRlcm1pbmF0ZSB0aGUgcmVzdWx0ICovCi0gICAgZGF2X3RleHRfYXBwZW5kKHByb3BkYi0+cCwgJmhkciwKLQkJICAgICI8L0Q6cHJvcD4iIERFQlVHX0NSCi0JCSAgICAiPEQ6c3RhdHVzPkhUVFAvMS4xIDIwMCBPSzwvRDpzdGF0dXM+IiBERUJVR19DUgotCQkgICAgIjwvRDpwcm9wc3RhdD4iIERFQlVHX0NSKTsKLQotICAgIHJlc3VsdC5wcm9wc3RhdHMgPSBoZHIuZmlyc3Q7Ci0gICAgcmVzdWx0LnhtbG5zID0gaGRyX25zLmZpcnN0OwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLWRhdl9nZXRfcHJvcHNfcmVzdWx0IGRhdl9nZXRfcHJvcHMoZGF2X3Byb3BkYiAqcHJvcGRiLCBkYXZfeG1sX2RvYyAqZG9jKQotewotICAgIGNvbnN0IGRhdl9ob29rc19kYiAqZGJfaG9va3MgPSBwcm9wZGItPmRiX2hvb2tzOwotICAgIGRhdl94bWxfZWxlbSAqZWxlbSA9IGRhdl9maW5kX2NoaWxkKGRvYy0+cm9vdCwgInByb3AiKTsKLSAgICBkYXZfdGV4dF9oZWFkZXIgaGRyX2dvb2QgPSB7IDAgfTsKLSAgICBkYXZfdGV4dF9oZWFkZXIgaGRyX2JhZCA9IHsgMCB9OwotICAgIGRhdl90ZXh0X2hlYWRlciBoZHJfbnMgPSB7IDAgfTsKLSAgICBpbnQgaGF2ZV9nb29kID0gMDsKLSAgICBkYXZfZ2V0X3Byb3BzX3Jlc3VsdCByZXN1bHQgPSB7IDAgfTsKLSAgICBjaGFyICptYXJrc19pbnB1dDsKLSAgICBjaGFyICptYXJrc19saXZlcHJvcDsKLQotICAgIC8qICMjIyBOT1RFOiB3ZSBzaG91bGQgcGFzcyBpbiBUV08gYnVmZmVycyAtLSBvbmUgZm9yIGtleXMsIG9uZSBmb3IKLSAgICAgICB0aGUgbWFya3MgKi8KLQotICAgIC8qIHdlIHdpbGwgQUxXQVlTIHByb3ZpZGUgYSAiZ29vZCIgcmVzdWx0LCBldmVuIGlmIGl0IGlzIEVNUFRZICovCi0gICAgZGF2X3RleHRfYXBwZW5kKHByb3BkYi0+cCwgJmhkcl9nb29kLAotCQkgICAgIjxEOnByb3BzdGF0PiIgREVCVUdfQ1IKLQkJICAgICI8RDpwcm9wPiIgREVCVUdfQ1IpOwotCi0gICAgLyogZ2VuZXJhdGUgYWxsIHRoZSBuYW1lc3BhY2VzIHRoYXQgYXJlIGluIHRoZSBwcm9wZGIgKi8KLSAgICBkYXZfZ2V0X3Byb3BkYl94bWxucyhwcm9wZGIsICZoZHJfbnMpOwotCi0gICAgLyogIyMjIHRoZSBtYXJrcyBzaG91bGQgYmUgaW4gYSBidWZmZXIhICovCi0gICAgLyogYWxsb2NhdGUgemVyb2VkLW1lbW9yeSBmb3IgdGhlIG1hcmtzLiBUaGVzZSBtYXJrcyBpbmRpY2F0ZSB3aGljaAotICAgICAgIGlucHV0IG5hbWVzcGFjZXMgd2UndmUgZ2VuZXJhdGVkIGludG8gdGhlIG91dHB1dCB4bWxucyBidWZmZXIgKi8KLSAgICBtYXJrc19pbnB1dCA9IGFwX3BjYWxsb2MocHJvcGRiLT5wLCBwcm9wZGItPm5zX3hsYXRlLT5uZWx0cyk7Ci0KLSAgICAvKiBzYW1lIGZvciB0aGUgbGl2ZXByb3BzICovCi0gICAgbWFya3NfbGl2ZXByb3AgPSBhcF9wY2FsbG9jKHByb3BkYi0+cCwgZGF2X2xpdmVwcm9wX3VyaXMtPm5lbHRzKTsKLQotICAgIGZvciAoZWxlbSA9IGVsZW0tPmZpcnN0X2NoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS0+bmV4dCkgewotCWRhdl9kYXR1bSBrZXk7Ci0JZGF2X2RhdHVtIHZhbHVlID0geyAwIH07Ci0KLQkvKgotCSoqIE5vdGU6IHRoZSBrZXkgbWF5IGJlIE5VTEwgaWYgd2UgaGF2ZSBubyBwcm9wZXJ0aWVzIHRoYXQgYXJlIGluCi0JKiogYSBuYW1lc3BhY2UgdGhhdCBtYXRjaGVzIHRoZSByZXF1ZXN0ZWQgcHJvcCdzIG5hbWVzcGFjZS4KLQkqLwotCWtleSA9IGRhdl9nZGJtX2tleShwcm9wZGIsIGVsZW0pOwotCi0JLyogZmV0Y2ggSUYgd2UgaGF2ZSBhIGRiIGFuZCBhIGtleS4gb3RoZXJ3aXNlLCB2YWx1ZSBpcyBOVUxMICovCi0JaWYgKHByb3BkYi0+ZGIgIT0gTlVMTCAmJiBrZXkuZHB0ciAhPSBOVUxMKSB7Ci0JICAgICh2b2lkKSAoKmRiX2hvb2tzLT5mZXRjaCkocHJvcGRiLT5kYiwga2V5LCAmdmFsdWUpOwotCX0KLQotCS8qCi0JKiogSWYgd2UgZGlkIG5vdCBmaW5kIHRoZSBwcm9wZXJ0eSBpbiB0aGUgZGF0YWJhc2UsIHRoZW4gaXQgbWF5Ci0JKiogYmUgYSBsaXZlcHJvcCB0aGF0IHdlIGNhbiBoYW5kbGUgc3BlY2lhbGx5LgotCSovCi0JaWYgKHZhbHVlLmRwdHIgPT0gTlVMTCkgewotCSAgICBkYXZfZXJyb3IgKmVycjsKLQkgICAgaW50IGluc2VydGVkOwotCi0JICAgIC8qIGNhY2hlIHRoZSBwcm9waWQ7IGRhdl9nZXRfcHJvcHMoKSBjb3VsZCBiZSBjYWxsZWQgbWFueSB0aW1lcyAqLwotCSAgICBpZiAoZWxlbS0+cHJvcGlkID09IDApCi0JCWRhdl9maW5kX2xpdmVwcm9wKHByb3BkYiwgZWxlbSk7Ci0KLQkgICAgLyogaW5zZXJ0IHRoZSBwcm9wZXJ0eS4gcmV0dXJucyAxIGlmIGFuIGluc2VydGlvbiB3YXMgZG9uZS4gKi8KLQkgICAgaWYgKChlcnIgPSBkYXZfaW5zZXJ0X2xpdmVwcm9wKHByb3BkYiwgZWxlbSwgMSwgJmhkcl9nb29kLAotCQkJCQkgICAmaW5zZXJ0ZWQpKSAhPSBOVUxMKSB7Ci0JCS8qICMjIyBuZWVkIHRvIHByb3BhZ2F0ZSB0aGUgZXJyb3IgdG8gdGhlIGNhbGxlci4uLiAqLwotCQkvKiAjIyMgc2tpcCBpdCBmb3Igbm93LCBhcyBpZiBub3RoaW5nIHdhcyBpbnNlcnRlZCAqLwotCSAgICB9Ci0JICAgIGlmIChpbnNlcnRlZCkgewotCQloYXZlX2dvb2QgPSAxOwotCi0JCS8qCi0JCSoqIEFkZCB0aGUgbGl2ZXByb3AncyBuYW1lc3BhY2UgVVJJcy4gTm90ZSB0aGF0IHByb3ZpZGVyPT1OVUxMCi0JCSoqIGZvciBjb3JlIHByb3BlcnRpZXMuCi0JCSovCi0JCWlmIChlbGVtLT5wcm92aWRlciAhPSBOVUxMKSB7Ci0JCSAgICBjb25zdCBjaGFyICogY29uc3QgKiBzY2FuX25zX3VyaTsKLQkJICAgIGNvbnN0IGludCAqIHNjYW5fbnM7Ci0KLQkJICAgIGZvciAoc2Nhbl9uc191cmkgPSBlbGVtLT5wcm92aWRlci0+bmFtZXNwYWNlX3VyaXMsCi0JCQkgICAgIHNjYW5fbnMgPSBlbGVtLT5uc19tYXA7Ci0JCQkgKnNjYW5fbnNfdXJpICE9IE5VTEw7Ci0JCQkgKytzY2FuX25zX3VyaSwgKytzY2FuX25zKSB7Ci0KLQkJCWRhdl9hZGRfbWFya2VkX3htbG5zKHByb3BkYiwgbWFya3NfbGl2ZXByb3AsICpzY2FuX25zLAotCQkJCQkgICAgIGRhdl9saXZlcHJvcF91cmlzLCAibHAiLCAmaGRyX25zKTsKLQkJICAgIH0KLQkJfQotCi0JCWNvbnRpbnVlOwotCSAgICB9Ci0JfQotCi0JaWYgKHZhbHVlLmRwdHIgPT0gTlVMTCkgewotCSAgICAvKiBub3QgZm91bmQuIGFkZCBhIHJlY29yZCB0byB0aGUgImJhZCIgcHJvcHN0YXRzICovCi0KLQkgICAgLyogbWFrZSBzdXJlIHdlJ3ZlIHN0YXJ0ZWQgb3VyICJiYWQiIHByb3BzdGF0ICovCi0JICAgIGlmIChoZHJfYmFkLmZpcnN0ID09IE5VTEwpIHsKLQkJZGF2X3RleHRfYXBwZW5kKHByb3BkYi0+cCwgJmhkcl9iYWQsCi0JCQkJIjxEOnByb3BzdGF0PiIgREVCVUdfQ1IKLQkJCQkiPEQ6cHJvcD4iIERFQlVHX0NSKTsKLQkgICAgfQotCi0JICAgIC8qIG5vdGU6IGtleS5kcHRyIG1heSBiZSBOVUxMIGlmIHRoZSBwcm9wZGIgZG9lc24ndCBoYXZlIGFuCi0JICAgICAgIGVxdWl2YWxlbnQgbmFtZXNwYWNlIHN0b3JlZCAqLwotCSAgICBpZiAoa2V5LmRwdHIgPT0gTlVMTCkgewotCQljb25zdCBjaGFyICpzOwotCi0JCWlmIChlbGVtLT5ucyA9PSBEQVZfTlNfTk9ORSkgewotCQkgICAgLyoKLQkJICAgICAqIGVsZW0gaGFzIGEgcHJlZml4IGFscmVhZHkgKHhtbC4uLjpuYW1lKSBvciB0aGUgZWxlbQotCQkgICAgICogc2ltcGx5IGhhcyBubyBuYW1lc3BhY2UuCi0JCSAgICAgKi8KLQkJICAgIHMgPSBhcF9wc3ByaW50Zihwcm9wZGItPnAsICI8JXMvPiIgREVCVUdfQ1IsIGVsZW0tPm5hbWUpOwotCQl9Ci0JCWVsc2UgewotCQkgICAgLyogZW5zdXJlIHRoYXQgYW4geG1sbnMgaXMgZ2VuZXJhdGVkIGZvciB0aGUKLQkJICAgICAgIGlucHV0IG5hbWVzcGFjZSAqLwotCQkgICAgZGF2X2FkZF9tYXJrZWRfeG1sbnMocHJvcGRiLCBtYXJrc19pbnB1dCwgZWxlbS0+bnMsCi0JCQkJCSBwcm9wZGItPm5zX3hsYXRlLCAiaSIsICZoZHJfbnMpOwotCQkgICAgcyA9IGFwX3BzcHJpbnRmKHByb3BkYi0+cCwgIjxpJWQ6JXMvPiIgREVCVUdfQ1IsCi0JCQkJICAgIGVsZW0tPm5zLCBlbGVtLT5uYW1lKTsKLQkJfQotCQlkYXZfdGV4dF9hcHBlbmQocHJvcGRiLT5wLCAmaGRyX2JhZCwgcyk7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCS8qIGFkZCBpbiB0aGUgYmFkIHByb3AgdXNpbmcgb3VyIG5hbWVzcGFjZSBkZWNsICovCi0JCWRhdl9hcHBlbmRfcHJvcChwcm9wZGIsIGtleS5kcHRyLCBEQVZfRU1QVFlfVkFMVUUsICZoZHJfYmFkKTsKLQkgICAgfQotCX0KLQllbHNlIHsKLQkgICAgLyogZm91bmQgaXQuIHB1dCB0aGUgdmFsdWUgaW50byB0aGUgImdvb2QiIHByb3BzdGF0cyAqLwotCi0JICAgIGhhdmVfZ29vZCA9IDE7Ci0KLQkgICAgZGF2X2FwcGVuZF9wcm9wKHByb3BkYiwga2V5LmRwdHIsIHZhbHVlLmRwdHIsICZoZHJfZ29vZCk7Ci0KLQkgICAgKCpkYl9ob29rcy0+ZnJlZWRhdHVtKShwcm9wZGItPmRiLCB2YWx1ZSk7Ci0JfQotICAgIH0KLQotICAgIGRhdl90ZXh0X2FwcGVuZChwcm9wZGItPnAsICZoZHJfZ29vZCwKLQkJICAgICI8L0Q6cHJvcD4iIERFQlVHX0NSCi0JCSAgICAiPEQ6c3RhdHVzPkhUVFAvMS4xIDIwMCBPSzwvRDpzdGF0dXM+IiBERUJVR19DUgotCQkgICAgIjwvRDpwcm9wc3RhdD4iIERFQlVHX0NSKTsKLQotICAgIC8qIGRlZmF1bHQgdG8gc3RhcnQgd2l0aCB0aGUgZ29vZCAqLwotICAgIHJlc3VsdC5wcm9wc3RhdHMgPSBoZHJfZ29vZC5maXJzdDsKLQotICAgIC8qIHdlIG1heSBub3QgaGF2ZSBhbnkgImJhZCIgcmVzdWx0cyAqLwotICAgIGlmIChoZHJfYmFkLmZpcnN0ICE9IE5VTEwpIHsKLQlkYXZfdGV4dF9hcHBlbmQocHJvcGRiLT5wLCAmaGRyX2JhZCwKLQkJCSI8L0Q6cHJvcD4iIERFQlVHX0NSCi0JCQkiPEQ6c3RhdHVzPkhUVFAvMS4xIDQwNCBOb3QgRm91bmQ8L0Q6c3RhdHVzPiIgREVCVUdfQ1IKLQkJCSI8L0Q6cHJvcHN0YXQ+IiBERUJVR19DUik7Ci0KLQkvKiBpZiB0aGVyZSBhcmUgbm8gZ29vZCBwcm9wcywgdGhlbiBqdXN0IHJldHVybiB0aGUgYmFkICovCi0JaWYgKCFoYXZlX2dvb2QpIHsKLQkgICAgcmVzdWx0LnByb3BzdGF0cyA9IGhkcl9iYWQuZmlyc3Q7Ci0JfQotCWVsc2UgewotCSAgICAvKiBob29rIHRoZSBiYWQgcHJvcHN0YXQgdG8gdGhlIGVuZCBvZiB0aGUgZ29vZCBvbmUgKi8KLQkgICAgaGRyX2dvb2QubGFzdC0+bmV4dCA9IGhkcl9iYWQuZmlyc3Q7Ci0JfQotICAgIH0KLQotICAgIHJlc3VsdC54bWxucyA9IGhkcl9ucy5maXJzdDsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIGRhdl9wcm9wX3ZhbGlkYXRlKGRhdl9wcm9wX2N0eCAqY3R4KQotewotICAgIGRhdl9wcm9wZGIgKnByb3BkYiA9IGN0eC0+cHJvcGRiOwotICAgIGRhdl94bWxfZWxlbSAqcHJvcCA9IGN0eC0+cHJvcDsKLQotICAgIC8qCi0gICAgKiogQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSBsaXZlIHByb3BlcnR5LCBhbmQgZmlsbCB0aGUgZmllbGRzCi0gICAgKiogaW4gdGhlIFhNTCBlbGVtLCBhcyBhcHByb3ByaWF0ZS4KLSAgICAqKgotICAgICoqIFZlcmlmeSB0aGF0IHRoZSBwcm9wZXJ0eSBpcyByZWFkL3dyaXRlLiBJZiBub3QsIHRoZW4gaXQgY2Fubm90Ci0gICAgKiogYmUgU0VUIG9yIERFTEVURWQuCi0gICAgKi8KLSAgICBpZiAocHJvcC0+cHJvcGlkID09IDApIHsKLQlkYXZfZmluZF9saXZlcHJvcChwcm9wZGIsIHByb3ApOwotCi0JLyogaXQncyBhIGxpdmVwcm9wIGlmIGEgcHJvdmlkZXIgd2FzIGZvdW5kICovCi0JLyogIyMjIGFjdHVhbGx5IHRoZSAiY29yZSIgcHJvcHMgc2hvdWxkIHJlYWxseSBiZSBsaXZlcHJvcHMsIGJ1dAotCSAgICMjIyB0aGVyZSBpcyBubyAicHJvdmlkZXIiIGZvciB0aG9zZSBhbmQgdGhlIHIvdyBwcm9wcyBhcmUKLQkgICAjIyMgdHJlYXRlZCBhcyBkZWFkIHByb3BzIGFueWhvdyAqLwotCWN0eC0+aXNfbGl2ZXByb3AgPSBwcm9wLT5wcm92aWRlciAhPSBOVUxMOwotICAgIH0KLQotICAgIGlmICghZGF2X3J3X2xpdmVwcm9wKHByb3BkYiwgcHJvcC0+cHJvcGlkKSkgewotCWN0eC0+ZXJyID0gZGF2X25ld19lcnJvcihwcm9wZGItPnAsIEhUVFBfQ09ORkxJQ1QsCi0JCQkJIERBVl9FUlJfUFJPUF9SRUFET05MWSwKLQkJCQkgIlByb3BlcnR5IGlzIHJlYWQtb25seS4iKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGN0eC0+aXNfbGl2ZXByb3ApIHsKLQlpbnQgZGVmZXJfdG9fZGVhZCA9IDA7Ci0KLQljdHgtPmVyciA9ICgqcHJvcC0+cHJvdmlkZXItPnBhdGNoX3ZhbGlkYXRlKShwcm9wZGItPnJlc291cmNlLAotCQkJCQkJICAgICBwcm9wLCBjdHgtPm9wZXJhdGlvbiwKLQkJCQkJCSAgICAgJmN0eC0+bGl2ZXByb3BfY3R4LAotCQkJCQkJICAgICAmZGVmZXJfdG9fZGVhZCk7Ci0JaWYgKGN0eC0+ZXJyICE9IE5VTEwgfHwgIWRlZmVyX3RvX2RlYWQpCi0JICAgIHJldHVybjsKLQotCS8qIGNsZWFyIGlzX2xpdmVwcm9wIC0tIGFjdCBhcyBhIGRlYWQgcHJvcCBub3cgKi8KLQljdHgtPmlzX2xpdmVwcm9wID0gMDsKLSAgICB9Ci0KLSAgICAvKgotICAgICoqIFRoZSBwcm9wZXJ0eSBpcyBzdXBwb3NlZCB0byBiZSBzdG9yZWQgaW50byB0aGUgZGVhZC1wcm9wZXJ0eQotICAgICoqIGRhdGFiYXNlLiBNYWtlIHN1cmUgdGhlIHRoaW5nIGlzIHRydWx5IG9wZW4gKGFuZCB3cml0ZWFibGUpLgotICAgICovCi0gICAgaWYgKHByb3BkYi0+ZGVmZXJyZWQKLQkmJiAoY3R4LT5lcnIgPSBkYXZfcmVhbGx5X29wZW5fZGIocHJvcGRiLCAwIC8qIHJvICovKSkgIT0gTlVMTCkgewotCXJldHVybjsKLSAgICB9Ci0KLSAgICAvKgotICAgICoqIFRoZXJlIHNob3VsZCBiZSBhbiBvcGVuLCB3cml0YWJsZSBkYXRhYmFzZSBpbiBoZXJlIQotICAgICoqCi0gICAgKiogTm90ZTogdGhlIGRhdGFiYXNlIHdvdWxkIGJlIE5VTEwgaWYgaXQgd2FzIG9wZW5lZCByZWFkb25seSBhbmQgaXQKLSAgICAqKiAgICAgICBkaWQgbm90IGV4aXN0LgotICAgICovCi0gICAgaWYgKHByb3BkYi0+ZGIgPT0gTlVMTCkgewotCWN0eC0+ZXJyID0gZGF2X25ld19lcnJvcihwcm9wZGItPnAsIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAotCQkJCSBEQVZfRVJSX1BST1BfTk9fREFUQUJBU0UsCi0JCQkJICJBdHRlbXB0ZWQgdG8gc2V0L3JlbW92ZSBhIHByb3BlcnR5ICIKLQkJCQkgIndpdGhvdXQgYSB2YWxpZCwgb3BlbiwgcmVhZC93cml0ZSAiCi0JCQkJICJwcm9wZXJ0eSBkYXRhYmFzZS4iKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGN0eC0+b3BlcmF0aW9uID09IERBVl9QUk9QX09QX1NFVCkgewotCS8qCi0JKiogUHJlcCB0aGUgZWxlbWVudCA9PiBwcm9wZGIgbmFtZXNwYWNlIGluZGV4IG1hcHBpbmcsIGluc2VydGluZwotCSoqIG5hbWVzcGFjZSBVUklzIGludG8gdGhlIHByb3BkYiB0aGF0IGRvbid0IGV4aXN0LgotCSovCi0JZGF2X3ByZXBfbnNfbWFwKHByb3BkYiwgMSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGN0eC0+b3BlcmF0aW9uID09IERBVl9QUk9QX09QX0RFTEVURSkgewotCS8qCi0JKiogVGhlcmUgYXJlIG5vIGNoZWNrcyB0byBwZXJmb3JtIGhlcmUuIElmIGEgcHJvcGVydHkgZXhpc3RzLCB0aGVuCi0JKiogd2Ugd2lsbCBkZWxldGUgaXQuIElmIGl0IGRvZXMgbm90IGV4aXN0LCB0aGVuIGl0IGRvZXMgbm90IG1hdHRlcgotCSoqIChzZWUgUzEyLjEzLjEpLgotCSoqCi0JKiogTm90ZSB0aGF0IGlmIGEgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QsIHRoYXQgZG9lcyBub3QgcnVsZSBvdXQKLQkqKiB0aGF0IGEgU0VUIHdpbGwgb2NjdXIgZHVyaW5nIHRoaXMgUFJPUFBBVENIICh0aHVzbHkgY3JlYXRpbmcgaXQpLgotCSovCi0gICAgfQotfQotCi12b2lkIGRhdl9wcm9wX2V4ZWMoZGF2X3Byb3BfY3R4ICpjdHgpCi17Ci0gICAgZGF2X3Byb3BkYiAqcHJvcGRiID0gY3R4LT5wcm9wZGI7Ci0gICAgZGF2X2Vycm9yICplcnIgPSBOVUxMOwotICAgIGRhdl9yb2xsYmFja19pdGVtICpyb2xsYmFjazsKLQotICAgIHJvbGxiYWNrID0gYXBfcGNhbGxvYyhwcm9wZGItPnAsIHNpemVvZigqcm9sbGJhY2spKTsKLSAgICBjdHgtPnJvbGxiYWNrID0gcm9sbGJhY2s7Ci0KLSAgICBpZiAoY3R4LT5pc19saXZlcHJvcCkgewotCWVyciA9ICgqY3R4LT5wcm9wLT5wcm92aWRlci0+cGF0Y2hfZXhlYykocHJvcGRiLT5yZXNvdXJjZSwKLQkJCQkJCSBjdHgtPnByb3AsIGN0eC0+b3BlcmF0aW9uLAotCQkJCQkJIGN0eC0+bGl2ZXByb3BfY3R4LAotCQkJCQkJICZjdHgtPnJvbGxiYWNrLT5saXZlcHJvcCk7Ci0gICAgfQotICAgIGVsc2UgewotCWRhdl9kYXR1bSBrZXk7Ci0KLQkvKiB3ZSdyZSBnb2luZyB0byBuZWVkIHRoZSBrZXkgZm9yIGFsbCBvcGVyYXRpb25zICovCi0Ja2V5ID0gZGF2X2dkYm1fa2V5KHByb3BkYiwgY3R4LT5wcm9wKTsKLQotCS8qIHNhdmUgdGhlIG9sZCB2YWx1ZSBzbyB0aGF0IHdlIGNhbiBkbyBhIHJvbGxiYWNrLiAqLwotCXJvbGxiYWNrLT5rZXkgPSBrZXk7Ci0JaWYgKChlcnIgPSAoKnByb3BkYi0+ZGJfaG9va3MtPmZldGNoKShwcm9wZGItPmRiLCBrZXksCi0JCQkJCSAgICAgICZyb2xsYmFjay0+dmFsdWUpKSAhPSBOVUxMKQotCSAgICBnb3RvIGVycm9yOwotCi0JaWYgKGN0eC0+b3BlcmF0aW9uID09IERBVl9QUk9QX09QX1NFVCkgewotCi0JICAgIGRhdl9kYXR1bSB2YWx1ZTsKLQotCSAgICAvKiBOb3RlOiBwcm9wZGItPm5zX21hcCB3YXMgc2V0IGluIGRhdl9wcm9wX3ZhbGlkYXRlKCkgKi8KLQotCSAgICAvKiBxdW90ZSBhbGwgdGhlIHZhbHVlcyBpbiB0aGUgZWxlbWVudCAqLwotCSAgICBkYXZfcXVvdGVfeG1sX2VsZW0ocHJvcGRiLT5wLCBjdHgtPnByb3ApOwotCi0JICAgIC8qIGdlbmVyYXRlIGEgdGV4dCBibG9iIGZvciB0aGUgeG1sOmxhbmcgcGx1cyB0aGUgY29udGVudHMgKi8KLQkgICAgZGF2X3htbDJ0ZXh0KHByb3BkYi0+cCwgY3R4LT5wcm9wLCBEQVZfWDJUX0xBTkdfSU5ORVIsIE5VTEwsCi0JCQkgcHJvcGRiLT5uc19tYXAsCi0JCQkgKGNvbnN0IGNoYXIgKiopJnZhbHVlLmRwdHIsICZ2YWx1ZS5kc2l6ZSk7Ci0KLQkgICAgZXJyID0gKCpwcm9wZGItPmRiX2hvb2tzLT5zdG9yZSkocHJvcGRiLT5kYiwga2V5LCB2YWx1ZSk7Ci0KLQkgICAgLyoKLQkgICAgKiogSWYgYW4gZXJyb3Igb2NjdXJyZWQsIHRoZW4gYXNzdW1lIHRoYXQgd2UgZGlkbid0IGNoYW5nZSB0aGUKLQkgICAgKiogdmFsdWUuIFJlbW92ZSB0aGUgcm9sbGJhY2sgaXRlbSBzbyB0aGF0IHdlIGRvbid0IHRyeSB0byBzZXQKLQkgICAgKiogaXRzIHZhbHVlIGR1cmluZyB0aGUgcm9sbGJhY2suCi0JICAgICovCi0JfQotCWVsc2UgaWYgKGN0eC0+b3BlcmF0aW9uID09IERBVl9QUk9QX09QX0RFTEVURSkgewotCi0JICAgIC8qCi0JICAgICoqIERlbGV0ZSB0aGUgcHJvcGVydHkuIElnbm9yZSBlcnJvcnMgLS0gdGhlIHByb3BlcnR5IGlzIHRoZXJlLCBvcgotCSAgICAqKiB3ZSBhcmUgZGVsZXRpbmcgaXQgZm9yIGEgc2Vjb25kIHRpbWUuCi0JICAgICovCi0JICAgIC8qICMjIyBidXQgd2hhdCBhYm91dCBvdGhlciBlcnJvcnM/ICovCi0JICAgICh2b2lkKSAoKnByb3BkYi0+ZGJfaG9va3MtPnJlbW92ZSkocHJvcGRiLT5kYiwga2V5KTsKLQl9Ci0gICAgfQotCi0gIGVycm9yOgotICAgIC8qIHB1c2ggYSBtb3JlIHNwZWNpZmljIGVycm9yIGhlcmUgKi8KLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLQkvKgotCSoqIFVzZSBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiBiZWNhdXNlIHdlIHNob3VsZG4ndCBoYXZlIHNlZW4KLQkqKiBhbnkgZXJyb3JzIGF0IHRoaXMgcG9pbnQuCi0JKi8KLQljdHgtPmVyciA9IGRhdl9wdXNoX2Vycm9yKHByb3BkYi0+cCwgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsCi0JCQkJICBEQVZfRVJSX1BST1BfRVhFQywKLQkJCQkgICJDb3VsZCBub3QgZXhlY3V0ZSBQUk9QUEFUQ0guIiwgZXJyKTsKLSAgICB9Ci19Ci0KLXZvaWQgZGF2X3Byb3BfY29tbWl0KGRhdl9wcm9wX2N0eCAqY3R4KQotewotICAgIC8qCi0gICAgKiogTm90ZSB0aGF0IGEgY29tbWl0IGltcGxpZXMgY3R4LT5lcnIgaXMgTlVMTC4gVGhlIGNhbGxlciBzaG91bGQgYXNzdW1lCi0gICAgKiogYSBzdGF0dXMgb2YgSFRUUF9PSyBmb3IgdGhpcyBjYXNlLgotICAgICovCi0KLSAgICBpZiAoY3R4LT5pc19saXZlcHJvcCkgewotCSgqY3R4LT5wcm9wLT5wcm92aWRlci0+cGF0Y2hfY29tbWl0KShjdHgtPnByb3BkYi0+cmVzb3VyY2UsCi0JCQkJCSAgICAgY3R4LT5vcGVyYXRpb24sCi0JCQkJCSAgICAgY3R4LT5saXZlcHJvcF9jdHgsCi0JCQkJCSAgICAgY3R4LT5yb2xsYmFjay0+bGl2ZXByb3ApOwotICAgIH0KLX0KLQotdm9pZCBkYXZfcHJvcF9yb2xsYmFjayhkYXZfcHJvcF9jdHggKmN0eCkKLXsKLSAgICBkYXZfZXJyb3IgKmVyciA9IE5VTEw7Ci0KLSAgICAvKiBkbyBub3RoaW5nIGlmIHRoZXJlIGlzIG5vIHJvbGxiYWNrIGluZm9ybWF0aW9uLiAqLwotICAgIGlmIChjdHgtPnJvbGxiYWNrID09IE5VTEwpCi0JcmV0dXJuOwotCi0gICAgLyoKLSAgICAqKiAjIyMgaWYgd2UgaGF2ZSBhbiBlcnJvciwgYW5kIGEgcm9sbGJhY2sgb2NjdXJzLCB0aGVuIHRoZSBuYW1lc3BhY2UKLSAgICAqKiAjIyMgbW9kcyBzaG91bGQgbm90IGhhcHBlbiBhdCBhbGwuIEJhc2ljYWxseSwgdGhlIG5hbWVzcGFjZSBtYW5hZ2VtZW50Ci0gICAgKiogIyMjIGlzIHNpbXBseSBhIGJpdGNoLgotICAgICovCi0KLSAgICBpZiAoY3R4LT5pc19saXZlcHJvcCkgewotCWVyciA9ICgqY3R4LT5wcm9wLT5wcm92aWRlci0+cGF0Y2hfcm9sbGJhY2spKGN0eC0+cHJvcGRiLT5yZXNvdXJjZSwKLQkJCQkJCSAgICAgY3R4LT5vcGVyYXRpb24sCi0JCQkJCQkgICAgIGN0eC0+bGl2ZXByb3BfY3R4LAotCQkJCQkJICAgICBjdHgtPnJvbGxiYWNrLT5saXZlcHJvcCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGN0eC0+cm9sbGJhY2stPnZhbHVlLmRwdHIgPT0gTlVMTCkgewotCS8qIGRvbid0IGZhaWwgaWYgdGhlIHRoaW5nIGlzbid0IHJlYWxseSB0aGVyZSAqLwotICAgICAgICAvKiAjIyMgYnV0IHdoYXQgYWJvdXQgb3RoZXIgZXJyb3JzPyAqLwotCSh2b2lkKSAoKmN0eC0+cHJvcGRiLT5kYl9ob29rcy0+cmVtb3ZlKShjdHgtPnByb3BkYi0+ZGIsCi0JCQkJCQljdHgtPnJvbGxiYWNrLT5rZXkpOwotICAgIH0KLSAgICBlbHNlIHsKLQllcnIgPSAoKmN0eC0+cHJvcGRiLT5kYl9ob29rcy0+c3RvcmUpKGN0eC0+cHJvcGRiLT5kYiwKLQkJCQkJICAgICAgY3R4LT5yb2xsYmFjay0+a2V5LAotCQkJCQkgICAgICBjdHgtPnJvbGxiYWNrLT52YWx1ZSk7Ci0gICAgfQotCi0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0JaWYgKGN0eC0+ZXJyID09IE5VTEwpCi0JICAgIGN0eC0+ZXJyID0gZXJyOwotCWVsc2UgewotCSAgICBkYXZfZXJyb3IgKnNjYW4gPSBlcnI7Ci0KLQkgICAgLyogaG9vayBwcmV2aW91cyBlcnJvcnMgYXQgdGhlIGVuZCBvZiB0aGUgcm9sbGJhY2sgZXJyb3IgKi8KLQkgICAgd2hpbGUgKHNjYW4tPnByZXYgIT0gTlVMTCkKLQkJc2NhbiA9IHNjYW4tPnByZXY7Ci0JICAgIHNjYW4tPnByZXYgPSBjdHgtPmVycjsKLQkgICAgY3R4LT5lcnIgPSBlcnI7Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21vZHVsZXMvZGF2L21haW4vcHJvdmlkZXJzLmMgYi9tb2R1bGVzL2Rhdi9tYWluL3Byb3ZpZGVycy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDE3MzA5Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZGF2L21haW4vcHJvdmlkZXJzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi0jaW5jbHVkZSAiYXByX3Bvb2xzLmgiCi0jaW5jbHVkZSAiYXByX2hhc2guaCIKLQotI2luY2x1ZGUgImFwX2hvb2tzLmgiICAgLyogIyMjIGZvciBhcF9nbG9iYWxfaG9va19wb29sICovCi0KLSNpbmNsdWRlICJtb2RfZGF2LmgiCi0KLQotc3RhdGljIGFwcl9oYXNoX3QgKmRhdl9yZXBvc19wcm92aWRlcnMgPSBOVUxMOwotCi0KLXN0YXRpYyBhcHJfc3RhdHVzX3QgZGF2X2NsZWFudXBfcHJvdmlkZXJzKHZvaWQgKmN0eCkKLXsKLSAgICBkYXZfcmVwb3NfcHJvdmlkZXJzID0gTlVMTDsKLSAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci19Ci0KLXZvaWQgZGF2X3JlZ2lzdGVyX3JlcG9zaXRvcnkoYXByX3Bvb2xfdCAqcCwgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF2X2hvb2tzX3JlcG9zaXRvcnkgKmhvb2tzKQotewotICAgIC8qICMjIyBpZ25vcmUgdGhlIHBvb2w7IGl0IGlzIE5VTEwgcmlnaHQgbm93ICovCi0gICAgcCA9IGFwX2dsb2JhbF9ob29rX3Bvb2w7Ci0KLSAgICBpZiAoZGF2X3JlcG9zX3Byb3ZpZGVycyA9PSBOVUxMKSB7Ci0gICAgICAgIGRhdl9yZXBvc19wcm92aWRlcnMgPSBhcHJfbWFrZV9oYXNoKHApOwotICAgICAgICBhcHJfcmVnaXN0ZXJfY2xlYW51cChwLCBOVUxMLCBkYXZfY2xlYW51cF9wcm92aWRlcnMsIGFwcl9udWxsX2NsZWFudXApOwotICAgIH0KLQotICAgIC8qIGp1c3Qgc2V0IGl0LiBubyBiaWdneSBpZiBpdCB3YXMgdGhlcmUgYmVmb3JlLiAqLwotICAgIGFwcl9oYXNoX3NldChkYXZfcmVwb3NfcHJvdmlkZXJzLCBuYW1lLCAwLCBob29rcyk7Ci19Ci0KLWNvbnN0IGRhdl9ob29rc19yZXBvc2l0b3J5ICogZGF2X2xvb2t1cF9yZXBvc2l0b3J5KGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgcmV0dXJuIGFwcl9oYXNoX2dldChkYXZfcmVwb3NfcHJvdmlkZXJzLCBuYW1lLCAwKTsKLX0KZGlmZiAtLWdpdCBhL21vZHVsZXMvZGF2L21haW4vc3RkX2xpdmVwcm9wLmMgYi9tb2R1bGVzL2Rhdi9tYWluL3N0ZF9saXZlcHJvcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2FjZDI0Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZGF2L21haW4vc3RkX2xpdmVwcm9wLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAidXRpbF94bWwuaCIKLSNpbmNsdWRlICJhcHJfc3RyaW5ncy5oIgotCi0jaW5jbHVkZSAibW9kX2Rhdi5oIgotCi0vKiBmb3J3YXJkLWRlY2xhcmUgKi8KLXN0YXRpYyBjb25zdCBkYXZfaG9va3NfbGl2ZXByb3AgZGF2X2NvcmVfaG9va3NfbGl2ZXByb3A7Ci0KLS8qCi0qKiBUaGUgbmFtZXNwYWNlIFVSSXMgdGhhdCB3ZSB1c2UuIFRoZXJlIHdpbGwgb25seSBldmVyIGJlICJEQVY6Ii4KLSovCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhdl9jb3JlX25hbWVzcGFjZV91cmlzW10gPQotewotICAgICJEQVY6IiwKLSAgICBOVUxMCS8qIHNlbnRpbmVsICovCi19OwotCi0vKgotKiogRGVmaW5lIGVhY2ggb2YgdGhlIGNvcmUgcHJvcGVydGllcyB0aGF0IHRoaXMgcHJvdmlkZXIgd2lsbCBoYW5kbGUuCi0qKiBOb3RlIHRoYXQgYWxsIG9mIHRoZW0gYXJlIGluIHRoZSBEQVY6IG5hbWVzcGFjZSwgd2hpY2ggaGFzIGEKLSoqIHByb3ZpZGVyLWxvY2FsIGluZGV4IG9mIDAuCi0qLwotc3RhdGljIGNvbnN0IGRhdl9saXZlcHJvcF9zcGVjIGRhdl9jb3JlX3Byb3BzW10gPQotewotICAgIHsgMCwgImNvbW1lbnQiLCAgICAgICAgICAgICAgREFWX1BST1BJRF9jb21tZW50LCAgICAgICAgICAgICAgMSB9LAotICAgIHsgMCwgImNyZWF0b3ItZGlzcGxheW5hbWUiLCAgREFWX1BST1BJRF9jcmVhdG9yX2Rpc3BsYXluYW1lLCAgMSB9LAotICAgIHsgMCwgImRpc3BsYXluYW1lIiwgICAgICAgICAgREFWX1BST1BJRF9kaXNwbGF5bmFtZSwgICAgICAgICAgMSB9LAotICAgIHsgMCwgInJlc291cmNldHlwZSIsICAgICAgICAgREFWX1BST1BJRF9yZXNvdXJjZXR5cGUsICAgICAgICAgMCB9LAotICAgIHsgMCwgInNvdXJjZSIsICAgICAgICAgICAgICAgREFWX1BST1BJRF9zb3VyY2UsICAgICAgICAgICAgICAgMSB9LAotICAgIHsgMCwgInN1cHBvcnRlZC1saXZlLXByb3BlcnR5LXNldCIsCi0gICAgICBEQVZfUFJPUElEX3N1cHBvcnRlZF9saXZlX3Byb3BlcnR5X3NldCwgMCB9LAotICAgIHsgMCwgInN1cHBvcnRlZC1tZXRob2Qtc2V0IiwgREFWX1BST1BJRF9zdXBwb3J0ZWRfbWV0aG9kX3NldCwgMCB9LAotICAgIHsgMCwgInN1cHBvcnRlZC1yZXBvcnQtc2V0IiwgREFWX1BST1BJRF9zdXBwb3J0ZWRfcmVwb3J0X3NldCwgMCB9LAotCi0gICAgeyAwIH0JLyogc2VudGluZWwgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBkYXZfbGl2ZXByb3BfZ3JvdXAgZGF2X2NvcmVfbGl2ZXByb3BfZ3JvdXAgPQotewotICAgIGRhdl9jb3JlX3Byb3BzLAotICAgIGRhdl9jb3JlX25hbWVzcGFjZV91cmlzLAotICAgICZkYXZfY29yZV9ob29rc19saXZlcHJvcAotfTsKLQotc3RhdGljIGRhdl9wcm9wX2luc2VydCBkYXZfY29yZV9pbnNlcnRfcHJvcChjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvcGlkLCBpbnQgaW5zdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX3RleHRfaGVhZGVyICpwaGRyKQotewotICAgIGNvbnN0IGNoYXIgKnZhbHVlOwotICAgIGNvbnN0IGNoYXIgKnM7Ci0gICAgZGF2X3Byb3BfaW5zZXJ0IHdoaWNoOwotICAgIGFwcl9wb29sX3QgKnAgPSByZXNvdXJjZS0+cG9vbDsKLSAgICBjb25zdCBkYXZfbGl2ZXByb3Bfc3BlYyAqaW5mbzsKLSAgICBpbnQgZ2xvYmFsX25zOwotCi0gICAgc3dpdGNoIChwcm9waWQpCi0gICAgewotICAgIGNhc2UgREFWX1BST1BJRF9yZXNvdXJjZXR5cGU6Ci0gICAgICAgIHN3aXRjaCAocmVzb3VyY2UtPnR5cGUpIHsKLSAgICAgICAgY2FzZSBEQVZfUkVTT1VSQ0VfVFlQRV9WRVJTSU9OOgotICAgICAgICAgICAgaWYgKHJlc291cmNlLT5iYXNlbGluZWQpIHsKLQkgICAgICAgIHZhbHVlID0gIjxEOmJhc2VsaW5lLz4iOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgIGNhc2UgREFWX1JFU09VUkNFX1RZUEVfUkVHVUxBUjoKLSAgICAgICAgY2FzZSBEQVZfUkVTT1VSQ0VfVFlQRV9XT1JLSU5HOgotICAgICAgICAgICAgaWYgKHJlc291cmNlLT5jb2xsZWN0aW9uKSB7Ci0JICAgICAgICB2YWx1ZSA9ICI8RDpjb2xsZWN0aW9uLz4iOwotICAgICAgICAgICAgfQotCSAgICBlbHNlIHsKLQkJLyogIyMjIHNob3VsZCB3ZSBkZW5vdGUgbG9jay1udWxsIHJlc291cmNlcz8gKi8KLQotCQl2YWx1ZSA9ICIiOwkvKiBiZWNvbWVzOiA8RDpyZXNvdXJjZXR5cGUvPiAqLwotCSAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEQVZfUkVTT1VSQ0VfVFlQRV9ISVNUT1JZOgotCSAgICB2YWx1ZSA9ICI8RDp2ZXJzaW9uLWhpc3RvcnkvPiI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEQVZfUkVTT1VSQ0VfVFlQRV9XT1JLU1BBQ0U6Ci0JICAgIHZhbHVlID0gIjxEOmNvbGxlY3Rpb24vPiI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEQVZfUkVTT1VSQ0VfVFlQRV9BQ1RJVklUWToKLQkgICAgdmFsdWUgPSAiPEQ6YWN0aXZpdHkvPiI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotCSAgICAvKiAjIyMgYmFkIGp1anUgKi8KLSAgICAgICAgICAgIHJldHVybiBEQVZfUFJPUF9JTlNFUlRfTk9UREVGOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEQVZfUFJPUElEX3N1cHBvcnRlZF9saXZlX3Byb3BlcnR5X3NldDoKLSAgICAgICAgLyogIyMjIGluc2VydCBhbGwgbGl2ZSBwcm9wZXJ0eSBuYW1lcyAjIyMgKi8KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERBVl9QUk9QSURfc3VwcG9ydGVkX21ldGhvZF9zZXQ6Ci0gICAgICAgIC8qICMjIyBsZXZlcmFnZSBjb2RlIGZyb20gZGF2X21ldGhvZF9vcHRpb25zICMjIyAqLwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgREFWX1BST1BJRF9zdXBwb3J0ZWRfcmVwb3J0X3NldDoKLSNpZiAwCi0gICAgewotICAgICAgICAvKiAjIyMgd2hlcmUgdG8gZ2V0ICJyIiA/Pz8gKi8KLSAgICAgICAgY29uc3QgZGF2X2hvb2tzX3ZzbiAqdnNuX2hvb2tzID0gZGF2X2dldF92c25faG9va3Mocik7Ci0KLSAgICAgICAgaWYgKHZzbl9ob29rcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjb25zdCBkYXZfcmVwb3J0X2VsZW0gKnJlcG9ydHM7Ci0gICAgICAgICAgICBkYXZfZXJyb3IgKmVycjsKLQotICAgICAgICAgICAgaWYgKChlcnIgPSAoKnZzbl9ob29rcy0+YXZhaWxfcmVwb3J0cykocmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwb3J0cykpICE9IE5VTEwpIHsKLQkgICAgICAgIGVyciA9IGRhdl9wdXNoX2Vycm9yKHAsIGVyci0+c3RhdHVzLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEQVY6c3VwcG9ydGVkLXJlcG9ydC1zZXQgY291bGQgbm90ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmUgZGV0ZXJtaW5lZCBkdWUgdG8gYSBwcm9ibGVtICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmV0Y2hpbmcgdGhlIGF2YWlsYWJsZSByZXBvcnRzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHRoaXMgcmVzb3VyY2UuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIC8qICMjIyBjYW4ndCByZXR1cm4gZXJyLi4uIHNpZ2guIHB1bnQgZm9yIG5vdy4gKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gREFWX1BST1BfSU5TRVJUX05PVERFRjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdmFsdWUgPSAiIjsKLQotICAgICAgICAgICAgaWYgKHJlcG9ydHMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIC8qIG5vIHJlcG9ydHMgYXJlIGRlZmluZWQuIGJyZWFrIHdpdGggdmFsdWU9IiIgKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yICg7IHJlcG9ydHMtPm5tc3BhY2UgIT0gTlVMTDsgKytyZXBvcnRzKSB7Ci0gICAgICAgICAgICAgICAgLyogTm90ZTogcHJlc3VtZSByZXBvcnRzLT5uYW1lc3BhY2UgaXMgWE1ML1VSTCBxdW90ZWQgKi8KLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ID0gYXByX3BzcHJpbnRmKHAsICI8JXMgeG1sbnM9XCIlc1wiLz4iIERFQlVHX0NSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0cy0+bmFtZSwgcmVwb3J0cy0+bm1zcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAvKiBUaGlzIGlzbid0IHZlcnkgbWVtb3J5LWVmZmljaWVudCwgYnV0IHRoZXJlIHNob3VsZCBvbmx5Ci0gICAgICAgICAgICAgICAgICAgYmUgYSBzbWFsbCBudW1iZXIgb2YgcmVwb3J0cyAqLwotICAgICAgICAgICAgICAgIHZhbHVlID0gYXByX3BzdHJjYXQocCwgdmFsdWUsIHYsIE5VTEwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSNlbmRpZgotICAgIC8qIGFib3ZlIGNvZGUgZGlzYWJsZWQuIEZBTExUSFJPVUdIICovCi0KLSAgICBjYXNlIERBVl9QUk9QSURfY29tbWVudDoKLSAgICBjYXNlIERBVl9QUk9QSURfY3JlYXRvcl9kaXNwbGF5bmFtZToKLSAgICBjYXNlIERBVl9QUk9QSURfZGlzcGxheW5hbWU6Ci0gICAgY2FzZSBEQVZfUFJPUElEX3NvdXJjZToKLSAgICBkZWZhdWx0OgotICAgICAgICAvKgotICAgICAgICAqKiBUaGlzIHByb3BlcnR5IGlzIGtub3duLCBidXQgbm90IGRlZmluZWQgYXMgYSBsaXZlcHJvcC4gSG93ZXZlciwKLSAgICAgICAgKiogaXQgbWF5IGJlIGEgZGVhZCBwcm9wZXJ0eS4KLSAgICAgICAgKi8KLSAgICAgICAgcmV0dXJuIERBVl9QUk9QX0lOU0VSVF9OT1RERUY7Ci0gICAgfQotCi0gICAgLyogYXNzZXJ0OiB2YWx1ZSAhPSBOVUxMICovCi0KLSAgICAvKiBnZXQgdGhlIGluZm9ybWF0aW9uIGFuZCBnbG9iYWwgTlMgaW5kZXggZm9yIHRoZSBwcm9wZXJ0eSAqLwotICAgIGdsb2JhbF9ucyA9IGRhdl9nZXRfbGl2ZXByb3BfaW5mbyhwcm9waWQsICZkYXZfY29yZV9saXZlcHJvcF9ncm91cCwgJmluZm8pOwotCi0gICAgLyogYXNzZXJ0OiBpbmZvICE9IE5VTEwgJiYgaW5mby0+bmFtZSAhPSBOVUxMICovCi0KLSAgICBpZiAoaW5zdmFsdWUpIHsKLSAgICAgICAgcyA9IGFwcl9wc3ByaW50ZihwLCAiPGxwJWQ6JXM+JXM8L2xwJWQ6JXM+IiBERUJVR19DUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfbnMsIGluZm8tPm5hbWUsIHZhbHVlLCBnbG9iYWxfbnMsIGluZm8tPm5hbWUpOwotICAgICAgICB3aGljaCA9IERBVl9QUk9QX0lOU0VSVF9WQUxVRTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHMgPSBhcHJfcHNwcmludGYocCwgIjxscCVkOiVzLz4iIERFQlVHX0NSLCBnbG9iYWxfbnMsIGluZm8tPm5hbWUpOwotICAgICAgICB3aGljaCA9IERBVl9QUk9QX0lOU0VSVF9OQU1FOwotICAgIH0KLSAgICBhcF90ZXh0X2FwcGVuZChwLCBwaGRyLCBzKTsKLQotICAgIC8qIHdlIGluc2VydGVkIGEgbmFtZSBvciB2YWx1ZSAodGhpcyBwcm9wIGlzIGRvbmUpICovCi0gICAgcmV0dXJuIHdoaWNoOwotfQotCi1zdGF0aWMgaW50IGRhdl9jb3JlX2lzX3dyaXRhYmxlKGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UsIGludCBwcm9waWQpCi17Ci0gICAgY29uc3QgZGF2X2xpdmVwcm9wX3NwZWMgKmluZm87Ci0KLSAgICAodm9pZCkgZGF2X2dldF9saXZlcHJvcF9pbmZvKHByb3BpZCwgJmRhdl9jb3JlX2xpdmVwcm9wX2dyb3VwLCAmaW5mbyk7Ci0gICAgcmV0dXJuIGluZm8tPmlzX3dyaXRhYmxlOwotfQotCi1zdGF0aWMgZGF2X2Vycm9yICogZGF2X2NvcmVfcGF0Y2hfdmFsaWRhdGUoY29uc3QgZGF2X3Jlc291cmNlICpyZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcF94bWxfZWxlbSAqZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3BlcmF0aW9uLCB2b2lkICoqY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmRlZmVyX3RvX2RlYWQpCi17Ci0gICAgLyogYWxsIG9mIG91ciB3cml0ZWFibGUgcHJvcHMgZ28gaW4gdGhlIGRlYWQgcHJvcCBkYXRhYmFzZSAqLwotICAgICpkZWZlcl90b19kZWFkID0gMTsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgZGF2X2hvb2tzX2xpdmVwcm9wIGRhdl9jb3JlX2hvb2tzX2xpdmVwcm9wID0gewotICAgIGRhdl9jb3JlX2luc2VydF9wcm9wLAotICAgIGRhdl9jb3JlX2lzX3dyaXRhYmxlLAotICAgIGRhdl9jb3JlX25hbWVzcGFjZV91cmlzLAotICAgIGRhdl9jb3JlX3BhdGNoX3ZhbGlkYXRlLAotICAgIE5VTEwsICAgICAgIC8qIHBhdGNoX2V4ZWMgKi8KLSAgICBOVUxMLCAgICAgICAvKiBwYXRjaF9jb21taXQgKi8KLSAgICBOVUxMLCAgICAgICAvKiBwYXRjaF9yb2xsYmFjayAqLwotfTsKLQotaW50IGRhdl9jb3JlX2ZpbmRfbGl2ZXByb3AocmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKm5zX3VyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXZfaG9va3NfbGl2ZXByb3AgKipob29rcykKLXsKLSAgICByZXR1cm4gZGF2X2RvX2ZpbmRfbGl2ZXByb3AobnNfdXJpLCBuYW1lLCAmZGF2X2NvcmVfbGl2ZXByb3BfZ3JvdXAsIGhvb2tzKTsKLX0KLQotdm9pZCBkYXZfY29yZV9pbnNlcnRfYWxsX2xpdmVwcm9wcyhyZXF1ZXN0X3JlYyAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF2X3Jlc291cmNlICpyZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluc3ZhbHVlLCBhcF90ZXh0X2hlYWRlciAqcGhkcikKLXsKLSAgICAodm9pZCkgZGF2X2NvcmVfaW5zZXJ0X3Byb3AocmVzb3VyY2UsIERBVl9QUk9QSURfcmVzb3VyY2V0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN2YWx1ZSwgcGhkcik7Ci0gICAgKHZvaWQpIGRhdl9jb3JlX2luc2VydF9wcm9wKHJlc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVZfUFJPUElEX3N1cHBvcnRlZF9saXZlX3Byb3BlcnR5X3NldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdmFsdWUsIHBoZHIpOwotICAgICh2b2lkKSBkYXZfY29yZV9pbnNlcnRfcHJvcChyZXNvdXJjZSwgREFWX1BST1BJRF9zdXBwb3J0ZWRfbWV0aG9kX3NldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdmFsdWUsIHBoZHIpOwotICAgICh2b2lkKSBkYXZfY29yZV9pbnNlcnRfcHJvcChyZXNvdXJjZSwgREFWX1BST1BJRF9zdXBwb3J0ZWRfcmVwb3J0X3NldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdmFsdWUsIHBoZHIpOwotfQotCi12b2lkIGRhdl9jb3JlX3JlZ2lzdGVyX3VyaXMoYXByX3Bvb2xfdCAqcCkKLXsKLSAgICAvKiByZWdpc3RlciB0aGUgbmFtZXNwYWNlIFVSSXMgKi8KLSAgICBkYXZfcmVnaXN0ZXJfbGl2ZXByb3BfZ3JvdXAocCwgJmRhdl9jb3JlX2xpdmVwcm9wX2dyb3VwKTsKLX0KZGlmZiAtLWdpdCBhL21vZHVsZXMvZGF2L21haW4vdXRpbC5jIGIvbW9kdWxlcy9kYXYvbWFpbi91dGlsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYWUyYzguLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9kYXYvbWFpbi91dGlsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDg3ICswLDAgQEAKLS8qCi0qKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCBHcmVnIFN0ZWluLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotKioKLSoqIEJ5IHVzaW5nIHRoaXMgZmlsZSwgeW91IGFncmVlIHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBzZXQgZm9ydGggaW4KLSoqIHRoZSBMSUNFTlNFLmh0bWwgZmlsZSB3aGljaCBjYW4gYmUgZm91bmQgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgbW9kX2RhdgotKiogZGlzdHJpYnV0aW9uIG9yIGF0IGh0dHA6Ly93d3cud2ViZGF2Lm9yZy9tb2RfZGF2L2xpY2Vuc2UtMS5odG1sLgotKioKLSoqIENvbnRhY3QgaW5mb3JtYXRpb246Ci0qKiAgIEdyZWcgU3RlaW4sIFBPIEJveCA3NjAsIFBhbG8gQWx0bywgQ0EsIDk0MzAyCi0qKiAgIGdzdGVpbkBseXJhLm9yZywgaHR0cDovL3d3dy53ZWJkYXYub3JnL21vZF9kYXYvCi0qLwotCi0vKgotKiogREFWIGV4dGVuc2lvbiBtb2R1bGUgZm9yIEFwYWNoZSAxLjMuKgotKiogIC0gdmFyaW91cyB1dGlsaXRpZXMsIHJlcG9zaXRvcnktaW5kZXBlbmRlbnQKLSoqCi0qKiBXcml0dGVuIGJ5IEdyZWcgU3RlaW4sIGdzdGVpbkBseXJhLm9yZywgaHR0cDovL3d3dy5seXJhLm9yZy8KLSovCi0KLSNpbmNsdWRlICJtb2RfZGF2LmgiCi0KLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfdmhvc3QuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLQotCi1kYXZfZXJyb3IgKmRhdl9uZXdfZXJyb3IocG9vbCAqcCwgaW50IHN0YXR1cywgaW50IGVycm9yX2lkLCBjb25zdCBjaGFyICpkZXNjKQotewotICAgIGludCBzYXZlX2Vycm5vID0gZXJybm87Ci0gICAgZGF2X2Vycm9yICplcnIgPSBhcF9wY2FsbG9jKHAsIHNpemVvZigqZXJyKSk7Ci0KLSAgICAvKiBEQkczKCJkYXZfbmV3X2Vycm9yOiAlZCAlZCAlcyIsIHN0YXR1cywgZXJyb3JfaWQsIGRlc2MgPyBkZXNjIDogIihubyBkZXNjKSIpOyAqLwotCi0gICAgZXJyLT5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgZXJyLT5lcnJvcl9pZCA9IGVycm9yX2lkOwotICAgIGVyci0+ZGVzYyA9IGRlc2M7Ci0gICAgZXJyLT5zYXZlX2Vycm5vID0gc2F2ZV9lcnJubzsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLWRhdl9lcnJvciAqZGF2X3B1c2hfZXJyb3IocG9vbCAqcCwgaW50IHN0YXR1cywgaW50IGVycm9yX2lkLCBjb25zdCBjaGFyICpkZXNjLAotCQkJICBkYXZfZXJyb3IgKnByZXYpCi17Ci0gICAgZGF2X2Vycm9yICplcnIgPSBhcF9wY2FsbG9jKHAsIHNpemVvZigqZXJyKSk7Ci0KLSAgICBlcnItPnN0YXR1cyA9IHN0YXR1czsKLSAgICBlcnItPmVycm9yX2lkID0gZXJyb3JfaWQ7Ci0gICAgZXJyLT5kZXNjID0gZGVzYzsKLSAgICBlcnItPnByZXYgPSBwcmV2OwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotdm9pZCBkYXZfdGV4dF9hcHBlbmQocG9vbCAqIHAsIGRhdl90ZXh0X2hlYWRlciAqaGRyLCBjb25zdCBjaGFyICp0ZXh0KQotewotICAgIGRhdl90ZXh0ICp0ID0gYXBfcGFsbG9jKHAsIHNpemVvZigqdCkpOwotCi0gICAgdC0+dGV4dCA9IHRleHQ7Ci0gICAgdC0+bmV4dCA9IE5VTEw7Ci0KLSAgICBpZiAoaGRyLT5maXJzdCA9PSBOVUxMKSB7Ci0JLyogbm8gdGV4dCBlbGVtZW50cyB5ZXQgKi8KLQloZHItPmZpcnN0ID0gaGRyLT5sYXN0ID0gdDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JLyogYXBwZW5kIHRvIHRoZSBsYXN0IHRleHQgZWxlbWVudCAqLwotCWhkci0+bGFzdC0+bmV4dCA9IHQ7Ci0JaGRyLT5sYXN0ID0gdDsKLSAgICB9Ci19Ci0KLXZvaWQgZGF2X2NoZWNrX2J1ZnNpemUocG9vbCAqIHAsIGRhdl9idWZmZXIgKnBidWYsIHNpemVfdCBleHRyYV9uZWVkZWQpCi17Ci0gICAgLyogZ3JvdyB0aGUgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLwotICAgIGlmIChwYnVmLT5jdXJfbGVuICsgZXh0cmFfbmVlZGVkID4gcGJ1Zi0+YWxsb2NfbGVuKSB7Ci0JY2hhciAqbmV3YnVmOwotCi0JcGJ1Zi0+YWxsb2NfbGVuICs9IGV4dHJhX25lZWRlZCArIERBVl9CVUZGRVJfUEFEOwotCW5ld2J1ZiA9IGFwX3BhbGxvYyhwLCBwYnVmLT5hbGxvY19sZW4pOwotCW1lbWNweShuZXdidWYsIHBidWYtPmJ1ZiwgcGJ1Zi0+Y3VyX2xlbik7Ci0JcGJ1Zi0+YnVmID0gbmV3YnVmOwotICAgIH0KLX0KLQotdm9pZCBkYXZfc2V0X2J1ZnNpemUocG9vbCAqIHAsIGRhdl9idWZmZXIgKnBidWYsIHNpemVfdCBzaXplKQotewotICAgIC8qIE5PVEU6IHRoaXMgZG9lcyBub3QgcmV0YWluIHByaW9yIGNvbnRlbnRzICovCi0KLSAgICAvKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW5pdCB0aGUgZmlyc3QgcG9pbnRlciwgdG9vLCBzaW5jZQotICAgICAgIHRoZSBQQUQgd2lsbCBiZSBsYXJnZXIgdGhhbiBhbGxvY19sZW4gKDApIGZvciB6ZXJvZWQgc3RydWN0dXJlcyAqLwotCi0gICAgLyogZ3JvdyBpZiB3ZSBkb24ndCBoYXZlIGVub3VnaCBmb3IgdGhlIHJlcXVlc3RlZCBzaXplIHBsdXMgcGFkZGluZyAqLwotICAgIGlmIChzaXplICsgREFWX0JVRkZFUl9QQUQgPiBwYnVmLT5hbGxvY19sZW4pIHsKLQkvKiBzZXQgdGhlIG5ldyBsZW5ndGg7IG1pbiBvZiBNSU5TSVpFICovCi0JcGJ1Zi0+YWxsb2NfbGVuID0gc2l6ZSArIERBVl9CVUZGRVJfUEFEOwotCWlmIChwYnVmLT5hbGxvY19sZW4gPCBEQVZfQlVGRkVSX01JTlNJWkUpCi0JICAgIHBidWYtPmFsbG9jX2xlbiA9IERBVl9CVUZGRVJfTUlOU0laRTsKLQotCXBidWYtPmJ1ZiA9IGFwX3BhbGxvYyhwLCBwYnVmLT5hbGxvY19sZW4pOwotICAgIH0KLSAgICBwYnVmLT5jdXJfbGVuID0gc2l6ZTsKLX0KLQotCi0vKiBpbml0aWFsaXplIGEgYnVmZmVyIGFuZCBjb3B5IHRoZSBzcGVjaWZpZWQgKG51bGwtdGVybSdkKSBzdHJpbmcgaW50byBpdCAqLwotdm9pZCBkYXZfYnVmZmVyX2luaXQocG9vbCAqcCwgZGF2X2J1ZmZlciAqcGJ1ZiwgY29uc3QgY2hhciAqc3RyKQotewotICAgIGRhdl9zZXRfYnVmc2l6ZShwLCBwYnVmLCBzdHJsZW4oc3RyKSk7Ci0gICAgbWVtY3B5KHBidWYtPmJ1Ziwgc3RyLCBwYnVmLT5jdXJfbGVuICsgMSk7Ci19Ci0KLS8qIGFwcGVuZCBhIHN0cmluZyB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIsIGFkanVzdCBsZW5ndGggKi8KLXZvaWQgZGF2X2J1ZmZlcl9hcHBlbmQocG9vbCAqcCwgZGF2X2J1ZmZlciAqcGJ1ZiwgY29uc3QgY2hhciAqc3RyKQotewotICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oc3RyKTsKLQotICAgIGRhdl9jaGVja19idWZzaXplKHAsIHBidWYsIGxlbiArIDEpOwotICAgIG1lbWNweShwYnVmLT5idWYgKyBwYnVmLT5jdXJfbGVuLCBzdHIsIGxlbiArIDEpOwotICAgIHBidWYtPmN1cl9sZW4gKz0gbGVuOwotfQotCi0vKiBwbGFjZSBhIHN0cmluZyBvbiB0aGUgZW5kIG9mIHRoZSBidWZmZXIsIGRvIE5PVCBhZGp1c3QgbGVuZ3RoICovCi12b2lkIGRhdl9idWZmZXJfcGxhY2UocG9vbCAqcCwgZGF2X2J1ZmZlciAqcGJ1ZiwgY29uc3QgY2hhciAqc3RyKQotewotICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oc3RyKTsKLQotICAgIGRhdl9jaGVja19idWZzaXplKHAsIHBidWYsIGxlbiArIDEpOwotICAgIG1lbWNweShwYnVmLT5idWYgKyBwYnVmLT5jdXJfbGVuLCBzdHIsIGxlbiArIDEpOwotfQotCi0vKiBwbGFjZSBzb21lIG1lbW9yeSBvbiB0aGUgZW5kIG9mIGEgYnVmZmVyOyBkbyBOT1QgYWRqdXN0IGxlbmd0aCAqLwotdm9pZCBkYXZfYnVmZmVyX3BsYWNlX21lbShwb29sICpwLCBkYXZfYnVmZmVyICpwYnVmLCBjb25zdCB2b2lkICptZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhbXQsIHNpemVfdCBwYWQpCi17Ci0gICAgZGF2X2NoZWNrX2J1ZnNpemUocCwgcGJ1ZiwgYW10ICsgcGFkKTsKLSAgICBtZW1jcHkocGJ1Zi0+YnVmICsgcGJ1Zi0+Y3VyX2xlbiwgbWVtLCBhbXQpOwotfQotCi0KLSNpZiBBUEFDSEVfUkVMRUFTRSA9PSAxMDMwNDEwMAotLyogIyMjIHRoaXMgY29kZSBjYW4gYmUgdXNlZCBmb3IgMS4zLjQgaW5zdGFsbGF0aW9ucy4gdXNlIHRoaXMgZnVuY3Rpb24KLSAqICMjIyBpbnN0ZWFkIG9mIGFwX3N1Yl9yZXFfbWV0aG9kX3VyaSgpCi0gKi8KLS8qCi0gKiAjIyMgZG9uJ3QgbG9vayBhdCB0aGlzIGNvZGUuCi0gKiAjIyMgaXQgaXMgYSBDcmltZSBBZ2FpbnN0IEFsbCBUaGF0IGlzIFJpZ2h0IGFuZCBHb29kCi0gKi8KLSNpbmNsdWRlICJodHRwX2NvcmUuaCIJCS8qIGZvciBTQVRJU0ZZXyogKi8KLXN0YXRpYyByZXF1ZXN0X3JlYyAqZ3Jvc3NfaGFjayhjb25zdCBjaGFyICpuZXdfZmlsZSwgY29uc3QgcmVxdWVzdF9yZWMgKiByKQotewotICAgIHJlcXVlc3RfcmVjICpybmV3ID0gYXBfc3ViX3JlcV9sb29rdXBfdXJpKG5ld19maWxlLCByKTsKLSAgICBpbnQgcmVzOwotCi0gICAgLyogIyMjIHRoZXNlIGFyZW4ndCBleHBvcnRlZCBwcm9wZXJseSBmcm9tIHRoZSBoZWFkZXJzICovCi0gICAgZXh0ZXJuIGludCBhcF9jaGVja19hY2Nlc3MocmVxdWVzdF9yZWMgKik7CS8qIGNoZWNrIGFjY2VzcyBvbiBub24tYXV0aCBiYXNpcyAqLwotICAgIGV4dGVybiBpbnQgYXBfY2hlY2tfdXNlcl9pZChyZXF1ZXN0X3JlYyAqKTsJCS8qIG9idGFpbiB2YWxpZCB1c2VybmFtZSBmcm9tIGNsaWVudCBhdXRoICovCi0gICAgZXh0ZXJuIGludCBhcF9jaGVja19hdXRoKHJlcXVlc3RfcmVjICopOwkvKiBjaGVjayAodmFsaWRhdGVkKSB1c2VyIGlzIGF1dGhvcml6ZWQgaGVyZSAqLwotCi0gICAgaWYgKHJuZXctPnN0YXR1cyAhPSBIVFRQX09LKQotCXJldHVybiBybmV3OwotCi0gICAgLyogcmUtcnVuIHBvcnRpb25zIHdpdGggYSBtb2RpZmllZCBtZXRob2QgKi8KLSAgICBybmV3LT5tZXRob2QgPSByLT5tZXRob2Q7Ci0gICAgcm5ldy0+bWV0aG9kX251bWJlciA9IHItPm1ldGhvZF9udW1iZXI7Ci0KLSAgICBpZiAoKGFwX3NhdGlzZmllcyhybmV3KSA9PSBTQVRJU0ZZX0FMTAotCSB8fCBhcF9zYXRpc2ZpZXMocm5ldykgPT0gU0FUSVNGWV9OT1NQRUMpCi0JPyAoKHJlcyA9IGFwX2NoZWNrX2FjY2VzcyhybmV3KSkKLQkgICB8fCAoYXBfc29tZV9hdXRoX3JlcXVpcmVkKHJuZXcpCi0JICAgICAgICYmICgocmVzID0gYXBfY2hlY2tfdXNlcl9pZChybmV3KSkKLQkJICAgfHwgKHJlcyA9IGFwX2NoZWNrX2F1dGgocm5ldykpKSkpCi0JOiAoKHJlcyA9IGFwX2NoZWNrX2FjY2VzcyhybmV3KSkKLQkgICAmJiAoIWFwX3NvbWVfYXV0aF9yZXF1aXJlZChybmV3KQotCSAgICAgICB8fCAoKHJlcyA9IGFwX2NoZWNrX3VzZXJfaWQocm5ldykpCi0JCSAgIHx8IChyZXMgPSBhcF9jaGVja19hdXRoKHJuZXcpKSkpKQotCSkgewotCXJuZXctPnN0YXR1cyA9IHJlczsKLSAgICB9Ci0KLSAgICByZXR1cm4gcm5ldzsKLX0KLSNlbmRpZiAvKiBBUEFDSEVfUkVMRUFTRSA9PSAxMDMwNDEwMCAqLwotCi0vKgotKiogZGF2X2xvb2t1cF91cmkoKQotKioKLSoqIEV4dGVuc2lvbiBmb3IgYXBfc3ViX3JlcV9sb29rdXBfdXJpKCkgd2hpY2ggY2FuJ3QgaGFuZGxlIGFic29sdXRlCi0qKiBVUklzIHByb3Blcmx5LgotKioKLSoqIElmIE5VTEwgaXMgcmV0dXJuZWQsIHRoZW4gYW4gZXJyb3Igb2NjdXJyZWQgd2l0aCBwYXJzaW5nIHRoZSBVUkkgb3IKLSoqIHRoZSBVUkkgZG9lcyBub3QgbWF0Y2ggdGhlIGN1cnJlbnQgc2VydmVyLgotKi8KLWRhdl9sb29rdXBfcmVzdWx0IGRhdl9sb29rdXBfdXJpKGNvbnN0IGNoYXIgKnVyaSwgcmVxdWVzdF9yZWMgKiByKQotewotICAgIGRhdl9sb29rdXBfcmVzdWx0IHJlc3VsdCA9IHsgMCB9OwotICAgIGNvbnN0IGNoYXIgKnNjaGVtZTsKLSAgICB1bnNpZ25lZCBzaG9ydCBwb3J0ID0gbnRvaHMoci0+Y29ubmVjdGlvbi0+bG9jYWxfYWRkci5zaW5fcG9ydCk7Ci0gICAgdXJpX2NvbXBvbmVudHMgY29tcDsKLSAgICBjaGFyICpuZXdfZmlsZTsKLSAgICBjb25zdCBjaGFyICpkb21haW47Ci0KLSAgICAvKiBmaXJzdCB0aGluZyB0byBkbyBpcyBwYXJzZSB0aGUgVVJJIGludG8gdmFyaW91cyBjb21wb25lbnRzICovCi0gICAgaWYgKGFwX3BhcnNlX3VyaV9jb21wb25lbnRzKHItPnBvb2wsIHVyaSwgJmNvbXApICE9IEhUVFBfT0spIHsKLQlyZXN1bHQuZXJyLnN0YXR1cyA9IEhUVFBfQkFEX1JFUVVFU1Q7Ci0JcmVzdWx0LmVyci5kZXNjID0gIkludmFsaWQgc3ludGF4IGluIERlc3RpbmF0aW9uIFVSSS4iOwotCXJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyogdGhlIFVSSSBtdXN0IGJlIGFuIGFic29sdXRlVVJJIChXRUJEQVYgUzkuMykgKi8KLSAgICBpZiAoY29tcC5zY2hlbWUgPT0gTlVMTCkgewotCXJlc3VsdC5lcnIuc3RhdHVzID0gSFRUUF9CQURfUkVRVUVTVDsKLQlyZXN1bHQuZXJyLmRlc2MgPSAiRGVzdGluYXRpb24gVVJJIG11c3QgYmUgYW4gYWJzb2x1dGUgVVJJLiI7Ci0JcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKiAjIyMgbm90IHN1cmUgdGhpcyB3b3JrcyBpZiB0aGUgY3VycmVudCByZXF1ZXN0IGNhbWUgaW4gdmlhIGh0dHBzOiAqLwotICAgIHNjaGVtZSA9IHItPnBhcnNlZF91cmkuc2NoZW1lOwotICAgIGlmIChzY2hlbWUgPT0gTlVMTCkKLQlzY2hlbWUgPSBhcF9odHRwX21ldGhvZChyKTsKLQotICAgIC8qIGluc2VydCBhIHBvcnQgaWYgdGhlIFVSSSBkaWQgbm90IGNvbnRhaW4gb25lICovCi0gICAgaWYgKGNvbXAucG9ydCA9PSAwKQotCWNvbXAucG9ydCA9IGFwX2RlZmF1bHRfcG9ydF9mb3Jfc2NoZW1lKGNvbXAuc2NoZW1lKTsKLQotICAgIC8qIG5vdywgdmVyaWZ5IHRoYXQgdGhlIFVSSSB1c2VzIHRoZSBzYW1lIHNjaGVtZSBhcyB0aGUgY3VycmVudCByZXF1ZXN0LgotICAgICAgIHRoZSBwb3J0LCBtdXN0IG1hdGNoIG91ciBwb3J0LgotICAgICAgIHRoZSBVUkkgbXVzdCBub3QgaGF2ZSBhIHF1ZXJ5IChhcmdzKSBvciBhIGZyYWdtZW50Ci0gICAgICovCi0gICAgaWYgKHN0cmNhc2VjbXAoY29tcC5zY2hlbWUsIHNjaGVtZSkgIT0gMCB8fAotCWNvbXAucG9ydCAhPSBwb3J0KSB7Ci0JcmVzdWx0LmVyci5zdGF0dXMgPSBIVFRQX0JBRF9HQVRFV0FZOwotCXJlc3VsdC5lcnIuZGVzYyA9IGFwX3BzcHJpbnRmKHItPnBvb2wsCi0JCQkJICAgICAgIkRlc3RpbmF0aW9uIFVSSSByZWZlcnMgdG8gZGlmZmVyZW50ICIKLQkJCQkgICAgICAic2NoZW1lIG9yIHBvcnQgKCVzOi8vaG9zdG5hbWU6JWQpXG4iCi0JCQkJICAgICAgIih3YW50OiAlczovL2hvc3RuYW1lOiVkKSIsCi0JCQkJICAgICAgY29tcC5zY2hlbWUgPyBjb21wLnNjaGVtZSA6IHNjaGVtZSwKLQkJCQkgICAgICBjb21wLnBvcnQgPyBjb21wLnBvcnQgOiBwb3J0LAotCQkJCSAgICAgIHNjaGVtZSwgcG9ydCk7Ci0JcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgaWYgKGNvbXAucXVlcnkgIT0gTlVMTCB8fCBjb21wLmZyYWdtZW50ICE9IE5VTEwpIHsKLQlyZXN1bHQuZXJyLnN0YXR1cyA9IEhUVFBfQkFEX1JFUVVFU1Q7Ci0JcmVzdWx0LmVyci5kZXNjID0KLQkgICAgIkRlc3RpbmF0aW9uIFVSSSBjb250YWlucyBpbnZhbGlkIGNvbXBvbmVudHMgIgotCSAgICAiKGEgcXVlcnkgb3IgYSBmcmFnbWVudCkuIjsKLQlyZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qIHdlIGhhdmUgdmVyaWZpZWQgdGhlIHNjaGVtZSwgcG9ydCwgYW5kIGdlbmVyYWwgc3RydWN0dXJlICovCi0KLSAgICAvKgotICAgICoqIEhybS4gIElFNSB3aWxsIHBhc3MgdW5xdWFsaWZpZWQgaG9zdG5hbWVzIGZvciBib3RoIHRoZSAKLSAgICAqKiBIb3N0OiBhbmQgRGVzdGluYXRpb246IGhlYWRlcnMuICBUaGlzIGJyZWFrcyB0aGUKLSAgICAqKiBodHRwX3Zob3N0LmM6Om1hdGNoZXNfYWxpYXNlcyBmdW5jdGlvbi4KLSAgICAqKgotICAgICoqIEZvciBub3csIHF1YWxpZnkgdW5xdWFsaWZpZWQgY29tcC5ob3N0bmFtZXMgd2l0aAotICAgICoqIHItPnNlcnZlci0+c2VydmVyX2hvc3RuYW1lLgotICAgICoqCi0gICAgKiogIyMjIHRoaXMgaXMgYSBiaWcgaGFjay4gQXBhY2hlIHNob3VsZCBwcm92aWRlIGEgYmV0dGVyIHdheS4KLSAgICAqKiAjIyMgbWF5YmUgdGhlIGFkbWluIHNob3VsZCBsaXN0IHRoZSB1bnF1YWxpZmllZCBob3N0cyBpbiBhCi0gICAgKiogIyMjIDxTZXJ2ZXJBbGlhcz4gYmxvY2s/Ci0gICAgKi8KLSAgICBpZiAoc3RycmNocihjb21wLmhvc3RuYW1lLCAnLicpID09IE5VTEwgJiYKLQkoZG9tYWluID0gc3RyY2hyKHItPnNlcnZlci0+c2VydmVyX2hvc3RuYW1lLCAnLicpKSAhPSBOVUxMKSB7Ci0JY29tcC5ob3N0bmFtZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgY29tcC5ob3N0bmFtZSwgZG9tYWluLCBOVUxMKTsKLSAgICB9Ci0KLSAgICAvKiBub3csIGlmIGEgaG9zdG5hbWUgd2FzIHByb3ZpZGVkLCB0aGVuIHZlcmlmeSB0aGF0IGl0IHJlcHJlc2VudHMgdGhlCi0gICAgICAgc2FtZSBzZXJ2ZXIgYXMgdGhlIGN1cnJlbnQgY29ubmVjdGlvbi4gbm90ZSB0aGF0IHdlIGp1c3QgdXNlIG91cgotICAgICAgIHBvcnQsIHNpbmNlIHdlJ3ZlIHZlcmlmaWVkIHRoZSBVUkkgbWF0Y2hlcyBvdXJzICovCi0gICAgaWYgKGNvbXAuaG9zdG5hbWUgIT0gTlVMTCAmJgotCSFhcF9tYXRjaGVzX3JlcXVlc3Rfdmhvc3QociwgY29tcC5ob3N0bmFtZSwgcG9ydCkpIHsKLQlyZXN1bHQuZXJyLnN0YXR1cyA9IEhUVFBfQkFEX0dBVEVXQVk7Ci0JcmVzdWx0LmVyci5kZXNjID0gIkRlc3RpbmF0aW9uIFVSSSByZWZlcnMgdG8gYSBkaWZmZXJlbnQgc2VydmVyLiI7Ci0JcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKiB3ZSBoYXZlIHZlcmlmaWVkIHRoYXQgdGhlIHJlcXVlc3RlZCBVUkkgZGVub3RlcyB0aGUgc2FtZSBzZXJ2ZXIgYXMKLSAgICAgICB0aGUgY3VycmVudCByZXF1ZXN0LiBUaGVyZWZvcmUsIHdlIGNhbiB1c2UgYXBfc3ViX3JlcV9sb29rdXBfdXJpKCkgKi8KLQotICAgIC8qIHJlY29uc3RydWN0IGEgVVJJIGFzIGp1c3QgdGhlIHBhdGggKi8KLSAgICBuZXdfZmlsZSA9IGFwX3VucGFyc2VfdXJpX2NvbXBvbmVudHMoci0+cG9vbCwgJmNvbXAsIFVOUF9PTUlUU0lURVBBUlQpOwotCi0gICAgLyoKLSAgICAgKiBMb29rdXAgdGhlIFVSSSBhbmQgcmV0dXJuIHRoZSBzdWItcmVxdWVzdC4gTm90ZSB0aGF0IHdlIHVzZSB0aGUKLSAgICAgKiBzYW1lIEhUVFAgbWV0aG9kIG9uIHRoZSBkZXN0aW5hdGlvbi4gVGhpcyBhbGxvd3MgdGhlIGRlc3RpbmF0aW9uCi0gICAgICogdG8gYXBwbHkgYXBwcm9wcmlhdGUgcmVzdHJpY3Rpb25zIChlLmcuIHJlYWRvbmx5KS4KLSAgICAgKi8KLSNpZiBBUEFDSEVfUkVMRUFTRSA9PSAxMDMwNDEwMAotICAgIHJlc3VsdC5ybmV3ID0gZ3Jvc3NfaGFjayhuZXdfZmlsZSwgcik7Ci0jZWxzZQotICAgIHJlc3VsdC5ybmV3ID0gYXBfc3ViX3JlcV9tZXRob2RfdXJpKHItPm1ldGhvZCwgbmV3X2ZpbGUsIHIpOwotI2VuZGlmCi0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoqCi0qKiBYTUwgVVRJTElUWSBGVU5DVElPTlMKLSovCi0KLS8qIHZhbGlkYXRlIHRoYXQgdGhlIHJvb3QgZWxlbWVudCB1c2VzIGEgZ2l2ZW4gREFWOiB0YWduYW1lIChUUlVFPT12YWxpZCkgKi8KLWludCBkYXZfdmFsaWRhdGVfcm9vdChjb25zdCBkYXZfeG1sX2RvYyAqZG9jLCBjb25zdCBjaGFyICp0YWduYW1lKQotewotICAgIHJldHVybiBkb2MtPnJvb3QgJiYKLQlkb2MtPnJvb3QtPm5zID09IERBVl9OU19EQVZfSUQgJiYKLQlzdHJjbXAoZG9jLT5yb290LT5uYW1lLCB0YWduYW1lKSA9PSAwOwotfQotCi0vKiBmaW5kIGFuZCByZXR1cm4gdGhlICh1bmlxdWUpIGNoaWxkIHdpdGggYSBnaXZlbiBEQVY6IHRhZ25hbWUgKi8KLWRhdl94bWxfZWxlbSAqZGF2X2ZpbmRfY2hpbGQoY29uc3QgZGF2X3htbF9lbGVtICplbGVtLCBjb25zdCBjaGFyICp0YWduYW1lKQotewotICAgIGRhdl94bWxfZWxlbSAqY2hpbGQgPSBlbGVtLT5maXJzdF9jaGlsZDsKLQotICAgIGZvciAoOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkKLQlpZiAoY2hpbGQtPm5zID09IERBVl9OU19EQVZfSUQgJiYgIXN0cmNtcChjaGlsZC0+bmFtZSwgdGFnbmFtZSkpCi0JICAgIHJldHVybiBjaGlsZDsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCi0vKiBob3cgbWFueSBjaGFyYWN0ZXJzIGZvciB0aGUgZ2l2ZW4gaW50ZWdlcj8gKi8KLSNkZWZpbmUgREFWX05TX0xFTihucykJKChucykgPCAxMCA/IDEgOiAobnMpIDwgMTAwID8gMiA6IChucykgPCAxMDAwID8gMyA6IFwKLQkJCSAobnMpIDwgMTAwMDAgPyA0IDogKG5zKSA8IDEwMDAwMCA/IDUgOiBcCi0JCQkgKG5zKSA8IDEwMDAwMDAgPyA2IDogKG5zKSA8IDEwMDAwMDAwID8gNyA6IFwKLQkJCSAobnMpIDwgMTAwMDAwMDAwID8gOCA6IChucykgPCAxMDAwMDAwMDAwID8gOSA6IDEwKQotCi1zdGF0aWMgaW50IGRhdl90ZXh0X3NpemUoY29uc3QgZGF2X3RleHQgKnQpCi17Ci0gICAgaW50IHNpemUgPSAwOwotCi0gICAgZm9yICg7IHQ7IHQgPSB0LT5uZXh0KQotCXNpemUgKz0gc3RybGVuKHQtPnRleHQpOwotICAgIHJldHVybiBzaXplOwotfQotCi1zdGF0aWMgc2l6ZV90IGRhdl9lbGVtX3NpemUoY29uc3QgZGF2X3htbF9lbGVtICplbGVtLCBpbnQgc3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfaGVhZGVyICpuYW1lc3BhY2VzLCBpbnQgKm5zX21hcCkKLXsKLSAgICBzaXplX3Qgc2l6ZTsKLQotICAgIGlmIChzdHlsZSA9PSBEQVZfWDJUX0ZVTEwgfHwgc3R5bGUgPT0gREFWX1gyVF9GVUxMX05TX0xBTkcpIHsKLQljb25zdCBkYXZfeG1sX2F0dHIgKmF0dHI7Ci0KLQlzaXplID0gMDsKLQotCWlmIChzdHlsZSA9PSBEQVZfWDJUX0ZVTExfTlNfTEFORykgewotCSAgICBpbnQgaTsKLQotCSAgICAvKgotCSAgICAqKiBUaGUgb3V0ZXIgZWxlbWVudCB3aWxsIGNvbnRhaW4geG1sbnM6bnMlZD0iJXMiIGF0dHJpYnV0ZXMKLQkgICAgKiogYW5kIGFuIHhtbDpsYW5nIGF0dHJpYnV0ZSwgaWYgYXBwbGljYWJsZS4KLQkgICAgKi8KLQotCSAgICBmb3IgKGkgPSBuYW1lc3BhY2VzLT5uZWx0czsgaS0tOykgewotCQkvKiBjb21wdXRlIHNpemUgb2Y6ICcgeG1sbnM6bnMlZD0iJXMiJyAqLwotCQlzaXplICs9ICg5ICsgREFWX05TX0xFTihpKSArIDIgKwotCQkJIHN0cmxlbihEQVZfR0VUX1VSSV9JVEVNKG5hbWVzcGFjZXMsIGkpKSArIDEpOwotCSAgICB9Ci0KLQkgICAgaWYgKGVsZW0tPmxhbmcgIT0gTlVMTCkgewotCQkvKiBjb21wdXRlIHNpemUgb2Y6ICcgeG1sOmxhbmc9IiVzIicgKi8KLQkJc2l6ZSArPSAxMSArIHN0cmxlbihlbGVtLT5sYW5nKSArIDE7Ci0JICAgIH0KLQl9Ci0KLQlpZiAoZWxlbS0+bnMgPT0gREFWX05TX05PTkUpIHsKLQkgICAgLyogY29tcHV0ZSBzaXplIG9mOiA8JXM+ICovCi0JICAgIHNpemUgKz0gMSArIHN0cmxlbihlbGVtLT5uYW1lKSArIDE7Ci0JfQotCWVsc2UgewotCSAgICBpbnQgbnMgPSBuc19tYXAgPyBuc19tYXBbZWxlbS0+bnNdIDogZWxlbS0+bnM7Ci0KLQkgICAgLyogY29tcHV0ZSBzaXplIG9mOiA8bnMlZDolcz4gKi8KLQkgICAgc2l6ZSArPSAzICsgREFWX05TX0xFTihucykgKyAxICsgc3RybGVuKGVsZW0tPm5hbWUpICsgMTsKLQl9Ci0KLQlpZiAoREFWX0VMRU1fSVNfRU1QVFkoZWxlbSkpIHsKLQkgICAgLyogaW5zZXJ0IGEgY2xvc2luZyAiLyIgKi8KLQkgICAgc2l6ZSArPSAxOwotCX0KLQllbHNlIHsKLQkgICAgLyoKLQkgICAgICogdHdvIG9mIGFib3ZlIHBsdXMgIi8iOgotCSAgICAgKiAgICAgPG5zJWQ6JXM+IC4uLiA8L25zJWQ6JXM+Ci0JICAgICAqIE9SICA8JXM+IC4uLiA8LyVzPgotCSAgICAgKi8KLQkgICAgc2l6ZSA9IDIgKiBzaXplICsgMTsKLQl9Ci0KLQlmb3IgKGF0dHIgPSBlbGVtLT5hdHRyOyBhdHRyOyBhdHRyID0gYXR0ci0+bmV4dCkgewotCSAgICBpZiAoYXR0ci0+bnMgPT0gREFWX05TX05PTkUpIHsKLQkJLyogY29tcHV0ZSBzaXplIG9mOiAnICVzPSIlcyInICovCi0JCXNpemUgKz0gMSArIHN0cmxlbihhdHRyLT5uYW1lKSArIDIgKyBzdHJsZW4oYXR0ci0+dmFsdWUpICsgMTsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJLyogY29tcHV0ZSBzaXplIG9mOiAnIG5zJWQ6JXM9IiVzIicgKi8KLQkJc2l6ZSArPSAzICsgREFWX05TX0xFTihhdHRyLT5ucykgKyAxICsgc3RybGVuKGF0dHItPm5hbWUpICsgMiArIHN0cmxlbihhdHRyLT52YWx1ZSkgKyAxOwotCSAgICB9Ci0JfQotCi0JLyoKLQkqKiBJZiB0aGUgZWxlbWVudCBoYXMgYW4geG1sOmxhbmcgdmFsdWUgdGhhdCBpcyAqZGlmZmVyZW50KiBmcm9tCi0JKiogaXRzIHBhcmVudCwgdGhlbiBhZGQgdGhlIHRoaW5nIGluOiAnIHhtbDpsYW5nPSIlcyInLgotCSoqCi0JKiogTk9URTogd2UgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIHBvaW50ZXIgZXF1YWxpdHkgZXN0YWJsaXNoZWQgYnkKLQkqKiB0aGUgcGFyc2luZyBmb3IgImluaGVyaXRpbmciIHRoZSB4bWw6bGFuZyB2YWx1ZXMgZnJvbSBwYXJlbnRzLgotCSovCi0JaWYgKGVsZW0tPmxhbmcgIT0gTlVMTCAmJgotCSAgICAoZWxlbS0+cGFyZW50ID09IE5VTEwgfHwgZWxlbS0+bGFuZyAhPSBlbGVtLT5wYXJlbnQtPmxhbmcpKSB7Ci0JICAgIHNpemUgKz0gMTEgKyBzdHJsZW4oZWxlbS0+bGFuZykgKyAxOwotCX0KLSAgICB9Ci0gICAgZWxzZSBpZiAoc3R5bGUgPT0gREFWX1gyVF9MQU5HX0lOTkVSKSB7Ci0JLyoKLQkgKiBUaGlzIHN0eWxlIHByZXBlbmRzIHRoZSB4bWw6bGFuZyB2YWx1ZSBwbHVzIGEgbnVsbCB0ZXJtaW5hdG9yLgotCSAqIElmIGEgbGFuZyB2YWx1ZSBpcyBub3QgcHJlc2VudCwgdGhlbiB3ZSBpbnNlcnQgYSBudWxsIHRlcm0uCi0JICovCi0Jc2l6ZSA9IGVsZW0tPmxhbmcgPyBzdHJsZW4oZWxlbS0+bGFuZykgKyAxIDogMTsKLSAgICB9Ci0gICAgZWxzZQotCXNpemUgPSAwOwotCi0gICAgc2l6ZSArPSBkYXZfdGV4dF9zaXplKGVsZW0tPmZpcnN0X2NkYXRhLmZpcnN0KTsKLQotICAgIGZvciAoZWxlbSA9IGVsZW0tPmZpcnN0X2NoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS0+bmV4dCkgewotCS8qIHRoZSBzaXplIG9mIHRoZSBjaGlsZCBlbGVtZW50IHBsdXMgdGhlIENEQVRBIHRoYXQgZm9sbG93cyBpdCAqLwotCXNpemUgKz0gKGRhdl9lbGVtX3NpemUoZWxlbSwgREFWX1gyVF9GVUxMLCBOVUxMLCBuc19tYXApICsKLQkJIGRhdl90ZXh0X3NpemUoZWxlbS0+Zm9sbG93aW5nX2NkYXRhLmZpcnN0KSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNpemU7Ci19Ci0KLXN0YXRpYyBjaGFyICpkYXZfd3JpdGVfdGV4dChjaGFyICpzLCBjb25zdCBkYXZfdGV4dCAqdCkKLXsKLSAgICBmb3IgKDsgdDsgdCA9IHQtPm5leHQpIHsKLQlzaXplX3QgbGVuID0gc3RybGVuKHQtPnRleHQpOwotCW1lbWNweShzLCB0LT50ZXh0LCBsZW4pOwotCXMgKz0gbGVuOwotICAgIH0KLSAgICByZXR1cm4gczsKLX0KLQotc3RhdGljIGNoYXIgKmRhdl93cml0ZV9lbGVtKGNoYXIgKnMsIGNvbnN0IGRhdl94bWxfZWxlbSAqZWxlbSwgaW50IHN0eWxlLAotCQkJICAgIGFycmF5X2hlYWRlciAqbmFtZXNwYWNlcywgaW50ICpuc19tYXApCi17Ci0gICAgY29uc3QgZGF2X3htbF9lbGVtICpjaGlsZDsKLSAgICBzaXplX3QgbGVuOwotICAgIGludCBuczsKLQotICAgIGlmIChzdHlsZSA9PSBEQVZfWDJUX0ZVTEwgfHwgc3R5bGUgPT0gREFWX1gyVF9GVUxMX05TX0xBTkcpIHsKLQlpbnQgZW1wdHkgPSBEQVZfRUxFTV9JU19FTVBUWShlbGVtKTsKLQljb25zdCBkYXZfeG1sX2F0dHIgKmF0dHI7Ci0KLQlpZiAoZWxlbS0+bnMgPT0gREFWX05TX05PTkUpIHsKLQkgICAgbGVuID0gc3ByaW50ZihzLCAiPCVzIiwgZWxlbS0+bmFtZSk7Ci0JfQotCWVsc2UgewotCSAgICBucyA9IG5zX21hcCA/IG5zX21hcFtlbGVtLT5uc10gOiBlbGVtLT5uczsKLQkgICAgbGVuID0gc3ByaW50ZihzLCAiPG5zJWQ6JXMiLCBucywgZWxlbS0+bmFtZSk7Ci0JfQotCXMgKz0gbGVuOwotCi0JZm9yIChhdHRyID0gZWxlbS0+YXR0cjsgYXR0cjsgYXR0ciA9IGF0dHItPm5leHQpIHsKLQkgICAgaWYgKGF0dHItPm5zID09IERBVl9OU19OT05FKQotCQlsZW4gPSBzcHJpbnRmKHMsICIgJXM9XCIlc1wiIiwgYXR0ci0+bmFtZSwgYXR0ci0+dmFsdWUpOwotCSAgICBlbHNlCi0JCWxlbiA9IHNwcmludGYocywgIiBucyVkOiVzPVwiJXNcIiIsIGF0dHItPm5zLCBhdHRyLT5uYW1lLCBhdHRyLT52YWx1ZSk7Ci0JICAgIHMgKz0gbGVuOwotCX0KLQotCS8qIGFkZCB0aGUgeG1sOmxhbmcgdmFsdWUgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKGVsZW0tPmxhbmcgIT0gTlVMTCAmJgotCSAgICAoc3R5bGUgPT0gREFWX1gyVF9GVUxMX05TX0xBTkcgfHwKLQkgICAgIGVsZW0tPnBhcmVudCA9PSBOVUxMIHx8Ci0JICAgICBlbGVtLT5sYW5nICE9IGVsZW0tPnBhcmVudC0+bGFuZykpIHsKLQkgICAgbGVuID0gc3ByaW50ZihzLCAiIHhtbDpsYW5nPVwiJXNcIiIsIGVsZW0tPmxhbmcpOwotCSAgICBzICs9IGxlbjsKLQl9Ci0KLQkvKiBhZGQgbmFtZXNwYWNlIGRlZmluaXRpb25zLCBpZiByZXF1aXJlZCAqLwotCWlmIChzdHlsZSA9PSBEQVZfWDJUX0ZVTExfTlNfTEFORykgewotCSAgICBpbnQgaTsKLQotCSAgICBmb3IgKGkgPSBuYW1lc3BhY2VzLT5uZWx0czsgaS0tOykgewotCQlsZW4gPSBzcHJpbnRmKHMsICIgeG1sbnM6bnMlZD1cIiVzXCIiLCBpLAotCQkJICAgICAgREFWX0dFVF9VUklfSVRFTShuYW1lc3BhY2VzLCBpKSk7Ci0JCXMgKz0gbGVuOwotCSAgICB9Ci0JfQotCi0JLyogbm8gbW9yZSB0byBkby4gY2xvc2UgaXQgdXAgYW5kIGdvLiAqLwotCWlmIChlbXB0eSkgewotCSAgICAqcysrID0gJy8nOwotCSAgICAqcysrID0gJz4nOwotCSAgICByZXR1cm4gczsKLQl9Ci0KLQkvKiBqdXN0IGNsb3NlIGl0ICovCi0JKnMrKyA9ICc+JzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3R5bGUgPT0gREFWX1gyVF9MQU5HX0lOTkVSKSB7Ci0JLyogcHJlcGVuZCB0aGUgeG1sOmxhbmcgdmFsdWUgKi8KLQlpZiAoZWxlbS0+bGFuZyAhPSBOVUxMKSB7Ci0JICAgIGxlbiA9IHN0cmxlbihlbGVtLT5sYW5nKTsKLQkgICAgbWVtY3B5KHMsIGVsZW0tPmxhbmcsIGxlbik7Ci0JICAgIHMgKz0gbGVuOwotCX0KLQkqcysrID0gJ1wwJzsKLSAgICB9Ci0KLSAgICBzID0gZGF2X3dyaXRlX3RleHQocywgZWxlbS0+Zmlyc3RfY2RhdGEuZmlyc3QpOwotCi0gICAgZm9yIChjaGlsZCA9IGVsZW0tPmZpcnN0X2NoaWxkOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgewotCXMgPSBkYXZfd3JpdGVfZWxlbShzLCBjaGlsZCwgREFWX1gyVF9GVUxMLCBOVUxMLCBuc19tYXApOwotCXMgPSBkYXZfd3JpdGVfdGV4dChzLCBjaGlsZC0+Zm9sbG93aW5nX2NkYXRhLmZpcnN0KTsKLSAgICB9Ci0KLSAgICBpZiAoc3R5bGUgPT0gREFWX1gyVF9GVUxMIHx8IHN0eWxlID09IERBVl9YMlRfRlVMTF9OU19MQU5HKSB7Ci0JaWYgKGVsZW0tPm5zID09IERBVl9OU19OT05FKSB7Ci0JICAgIGxlbiA9IHNwcmludGYocywgIjwvJXM+IiwgZWxlbS0+bmFtZSk7Ci0JfQotCWVsc2UgewotCSAgICBucyA9IG5zX21hcCA/IG5zX21hcFtlbGVtLT5uc10gOiBlbGVtLT5uczsKLQkgICAgbGVuID0gc3ByaW50ZihzLCAiPC9ucyVkOiVzPiIsIG5zLCBlbGVtLT5uYW1lKTsKLQl9Ci0JcyArPSBsZW47Ci0gICAgfQotCi0gICAgcmV0dXJuIHM7Ci19Ci0KLS8qIGNvbnZlcnQgYW4gZWxlbWVudCB0byBhIHRleHQgc3RyaW5nICovCi12b2lkIGRhdl94bWwydGV4dChwb29sICogcCwKLQkJICBjb25zdCBkYXZfeG1sX2VsZW0gKmVsZW0sCi0JCSAgaW50IHN0eWxlLAotCQkgIGFycmF5X2hlYWRlciAqbmFtZXNwYWNlcywKLQkJICBpbnQgKm5zX21hcCwKLQkJICBjb25zdCBjaGFyICoqcGJ1ZiwKLQkJICBzaXplX3QgKnBzaXplKQotewotICAgIC8qIGdldCB0aGUgZXhhY3Qgc2l6ZSwgcGx1cyBhIG51bGwgdGVybWluYXRvciAqLwotICAgIHNpemVfdCBzaXplID0gZGF2X2VsZW1fc2l6ZShlbGVtLCBzdHlsZSwgbmFtZXNwYWNlcywgbnNfbWFwKSArIDE7Ci0gICAgY2hhciAqcyA9IGFwX3BhbGxvYyhwLCBzaXplKTsKLQotICAgICh2b2lkKSBkYXZfd3JpdGVfZWxlbShzLCBlbGVtLCBzdHlsZSwgbmFtZXNwYWNlcywgbnNfbWFwKTsKLSAgICBzW3NpemUgLSAxXSA9ICdcMCc7Ci0KLSAgICAqcGJ1ZiA9IHM7Ci0gICAgaWYgKHBzaXplKQotCSpwc2l6ZSA9IHNpemU7Ci19Ci0KLWNvbnN0IGNoYXIgKmRhdl9lbXB0eV9lbGVtKHBvb2wgKiBwLCBjb25zdCBkYXZfeG1sX2VsZW0gKmVsZW0pCi17Ci0gICAgaWYgKGVsZW0tPm5zID09IERBVl9OU19OT05FKSB7Ci0JLyoKLQkgKiBUaGUgcHJlZml4ICh4bWwuLi4pIGlzIGFscmVhZHkgd2l0aGluIHRoZSBwcm9wIG5hbWUsIG9yCi0JICogdGhlIGVsZW1lbnQgc2ltcGx5IGhhcyBubyBwcmVmaXguCi0JICovCi0JcmV0dXJuIGFwX3BzcHJpbnRmKHAsICI8JXMvPiIgREVCVUdfQ1IsIGVsZW0tPm5hbWUpOwotICAgIH0KLQotICAgIHJldHVybiBhcF9wc3ByaW50ZihwLCAiPG5zJWQ6JXMvPiIgREVCVUdfQ1IsIGVsZW0tPm5zLCBlbGVtLT5uYW1lKTsKLX0KLQotLyoKLSoqIGRhdl9xdW90ZV9zdHJpbmc6IHF1b3RlIGFuIFhNTCBzdHJpbmcKLSoqCi0qKiBSZXBsYWNlICc8JywgJz4nLCBhbmQgJyYnIHdpdGggJyZsdDsnLCAnJmd0OycsIGFuZCAnJmFtcDsnLgotKiogSWYgcXVvdGVzIGlzIHRydWUsIHRoZW4gcmVwbGFjZSAnIicgd2l0aCAnJnF1b3Q7Jy4KLSoqCi0qKiBxdW90ZXMgaXMgdHlwaWNhbGx5IHNldCB0byB0cnVlIGZvciBYTUwgc3RyaW5ncyB0aGF0IHdpbGwgb2NjdXIgd2l0aGluCi0qKiBkb3VibGUgcXVvdGVzIC0tIGF0dHJpYnV0ZSB2YWx1ZXMuCi0qLwotY29uc3QgY2hhciAqIGRhdl9xdW90ZV9zdHJpbmcocG9vbCAqcCwgY29uc3QgY2hhciAqcywgaW50IHF1b3RlcykKLXsKLSAgICBjb25zdCBjaGFyICpzY2FuOwotICAgIGludCBsZW4gPSAwOwotICAgIGludCBleHRyYSA9IDA7Ci0gICAgY2hhciAqcXN0cjsKLSAgICBjaGFyICpxc2NhbjsKLSAgICBjaGFyIGM7Ci0KLSAgICBmb3IgKHNjYW4gPSBzOyAoYyA9ICpzY2FuKSAhPSAnXDAnOyArK3NjYW4sICsrbGVuKSB7Ci0JaWYgKGMgPT0gJzwnIHx8IGMgPT0gJz4nKQotCSAgICBleHRyYSArPSAzOwkJLyogJmx0OyBvciAmZ3Q7ICovCi0JZWxzZSBpZiAoYyA9PSAnJicpCi0JICAgIGV4dHJhICs9IDQ7CQkvKiAmYW1wOyAqLwotCWVsc2UgaWYgKHF1b3RlcyAmJiBjID09ICciJykKLQkgICAgZXh0cmEgKz0gNTsJCS8qICZxdW90OyAqLwotICAgIH0KLQotICAgIC8qIG5vdGhpbmcgdG8gZG8/ICovCi0gICAgaWYgKGV4dHJhID09IDApCi0JcmV0dXJuIHM7Ci0KLSAgICBxc3RyID0gYXBfcGFsbG9jKHAsIGxlbiArIGV4dHJhICsgMSk7Ci0gICAgZm9yIChzY2FuID0gcywgcXNjYW4gPSBxc3RyOyAoYyA9ICpzY2FuKSAhPSAnXDAnOyArK3NjYW4pIHsKLQlpZiAoYyA9PSAnPCcpIHsKLQkgICAgKnFzY2FuKysgPSAnJic7Ci0JICAgICpxc2NhbisrID0gJ2wnOwotCSAgICAqcXNjYW4rKyA9ICd0JzsKLQkgICAgKnFzY2FuKysgPSAnOyc7Ci0JfQotCWVsc2UgaWYgKGMgPT0gJz4nKSB7Ci0JICAgICpxc2NhbisrID0gJyYnOwotCSAgICAqcXNjYW4rKyA9ICdnJzsKLQkgICAgKnFzY2FuKysgPSAndCc7Ci0JICAgICpxc2NhbisrID0gJzsnOwotCX0KLQllbHNlIGlmIChjID09ICcmJykgewotCSAgICAqcXNjYW4rKyA9ICcmJzsKLQkgICAgKnFzY2FuKysgPSAnYSc7Ci0JICAgICpxc2NhbisrID0gJ20nOwotCSAgICAqcXNjYW4rKyA9ICdwJzsKLQkgICAgKnFzY2FuKysgPSAnOyc7Ci0JfQotCWVsc2UgaWYgKHF1b3RlcyAmJiBjID09ICciJykgewotCSAgICAqcXNjYW4rKyA9ICcmJzsKLQkgICAgKnFzY2FuKysgPSAncSc7Ci0JICAgICpxc2NhbisrID0gJ3UnOwotCSAgICAqcXNjYW4rKyA9ICdvJzsKLQkgICAgKnFzY2FuKysgPSAndCc7Ci0JICAgICpxc2NhbisrID0gJzsnOwotCX0KLQllbHNlIHsKLQkgICAgKnFzY2FuKysgPSBjOwotCX0KLSAgICB9Ci0KLSAgICAqcXNjYW4gPSAnXDAnOwotICAgIHJldHVybiBxc3RyOwotfQotCi12b2lkIGRhdl9xdW90ZV94bWxfZWxlbShwb29sICpwLCBkYXZfeG1sX2VsZW0gKmVsZW0pCi17Ci0gICAgZGF2X3RleHQgKnNjYW5fdHh0OwotICAgIGRhdl94bWxfYXR0ciAqc2Nhbl9hdHRyOwotICAgIGRhdl94bWxfZWxlbSAqc2Nhbl9lbGVtOwotCi0gICAgLyogY29udmVydCB0aGUgZWxlbWVudCdzIHRleHQgKi8KLSAgICBmb3IgKHNjYW5fdHh0ID0gZWxlbS0+Zmlyc3RfY2RhdGEuZmlyc3Q7Ci0JIHNjYW5fdHh0ICE9IE5VTEw7Ci0JIHNjYW5fdHh0ID0gc2Nhbl90eHQtPm5leHQpIHsKLQlzY2FuX3R4dC0+dGV4dCA9IGRhdl9xdW90ZV9zdHJpbmcocCwgc2Nhbl90eHQtPnRleHQsIDApOwotICAgIH0KLSAgICBmb3IgKHNjYW5fdHh0ID0gZWxlbS0+Zm9sbG93aW5nX2NkYXRhLmZpcnN0OwotCSBzY2FuX3R4dCAhPSBOVUxMOwotCSBzY2FuX3R4dCA9IHNjYW5fdHh0LT5uZXh0KSB7Ci0Jc2Nhbl90eHQtPnRleHQgPSBkYXZfcXVvdGVfc3RyaW5nKHAsIHNjYW5fdHh0LT50ZXh0LCAwKTsKLSAgICB9Ci0KLSAgICAvKiBjb252ZXJ0IHRoZSBhdHRyaWJ1dGUgdmFsdWVzICovCi0gICAgZm9yIChzY2FuX2F0dHIgPSBlbGVtLT5hdHRyOwotCSBzY2FuX2F0dHIgIT0gTlVMTDsKLQkgc2Nhbl9hdHRyID0gc2Nhbl9hdHRyLT5uZXh0KSB7Ci0Jc2Nhbl9hdHRyLT52YWx1ZSA9IGRhdl9xdW90ZV9zdHJpbmcocCwgc2Nhbl9hdHRyLT52YWx1ZSwgMSk7Ci0gICAgfQotCi0gICAgLyogY29udmVydCB0aGUgY2hpbGQgZWxlbWVudHMgKi8KLSAgICBmb3IgKHNjYW5fZWxlbSA9IGVsZW0tPmZpcnN0X2NoaWxkOwotCSBzY2FuX2VsZW0gIT0gTlVMTDsKLQkgc2Nhbl9lbGVtID0gc2Nhbl9lbGVtLT5uZXh0KSB7Ci0JZGF2X3F1b3RlX3htbF9lbGVtKHAsIHNjYW5fZWxlbSk7Ci0gICAgfQotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoqCi0qKiBUaW1lb3V0IGhlYWRlciBwcm9jZXNzaW5nCi0qKgotKi8KLQotLyogZGF2X2dldF90aW1lb3V0OiAgSWYgdGhlIFRpbWVvdXQ6IGhlYWRlciBleGlzdHMsIHJldHVybiBhIHRpbWVfdAotICogICAgd2hlbiB0aGlzIGxvY2sgaXMgZXhwZWN0ZWQgdG8gZXhwaXJlLiAgT3RoZXJ3aXNlLCByZXR1cm4KLSAqICAgIGEgdGltZV90IG9mIERBVl9USU1FT1VUX0lORklOSVRFLgotICoKLSAqICAgIEl0J3MgdW5jbGVhciBpZiBEQVYgY2xpZW50cyBhcmUgcmVxdWlyZWQgdG8gdW5kZXJzdGFuZAotICogICAgU2Vjb25kcy14eHggYW5kIEluZmluaXR5IHRpbWUgdmFsdWVzLiAgV2UgYXNzdW1lIHRoYXQgdGhleSBkby4KLSAqICAgIEluIGFkZGl0aW9uLCBmb3Igbm93LCB0aGF0J3MgYWxsIHdlIHVuZGVyc3RhbmQsIHRvby4KLSAqLwotdGltZV90IGRhdl9nZXRfdGltZW91dChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICB0aW1lX3Qgbm93LCBleHBpcmVzID0gREFWX1RJTUVPVVRfSU5GSU5JVEU7Ci0KLSAgICBjb25zdCBjaGFyICp0aW1lb3V0X2NvbnN0ID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJUaW1lb3V0Iik7Ci0gICAgY29uc3QgY2hhciAqdGltZW91dCA9IGFwX3BzdHJkdXAoci0+cG9vbCwgdGltZW91dF9jb25zdCksICp2YWw7Ci0KLSAgICBpZiAodGltZW91dCA9PSBOVUxMKQotCXJldHVybiBEQVZfVElNRU9VVF9JTkZJTklURTsKLQotICAgIC8qIFVzZSB0aGUgZmlyc3QgdGhpbmcgd2UgdW5kZXJzdGFuZCwgb3IgaW5maW5pdHkgaWYKLSAgICAgKiB3ZSBkb24ndCB1bmRlcnN0YW5kIGFueXRoaW5nLgotICAgICAqLwotCi0gICAgd2hpbGUgKCh2YWwgPSBhcF9nZXR3b3JkX3doaXRlKHItPnBvb2wsICZ0aW1lb3V0KSkgJiYgc3RybGVuKHZhbCkpIHsKLQlpZiAoIXN0cm5jbXAodmFsLCAiSW5maW5pdGUiLCA4KSkgewotCSAgICByZXR1cm4gREFWX1RJTUVPVVRfSU5GSU5JVEU7Ci0JfQotCi0JaWYgKCFzdHJuY21wKHZhbCwgIlNlY29uZC0iLCA3KSkgewotCSAgICB2YWwgKz0gNzsKLQkgICAgLyogIyMjIFdlIG5lZWQgdG8gaGFuZGxlIG92ZXJmbG93IGJldHRlcjoKLQkgICAgICogIyMjIHRpbWVvdXQgd2lsbCBiZSA8PSAyXjMyIC0gMQotCSAgICAgKi8KLQkgICAgZXhwaXJlcyA9IGF0b2wodmFsKTsKLQkgICAgbm93ICAgICA9IHRpbWUoTlVMTCk7Ci0JICAgIHJldHVybiBub3cgKyBleHBpcmVzOwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gREFWX1RJTUVPVVRfSU5GSU5JVEU7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKioKLSoqIElmIEhlYWRlciBwcm9jZXNzaW5nCi0qKgotKi8KLQotLyogYWRkX2lmX3Jlc291cmNlIHJldHVybnMgYSBuZXcgaWZfaGVhZGVyLCBsaW5raW5nIGl0IHRvIG5leHRfaWguCi0gKi8KLXN0YXRpYyBkYXZfaWZfaGVhZGVyICpkYXZfYWRkX2lmX3Jlc291cmNlKHBvb2wgKnAsIGRhdl9pZl9oZWFkZXIgKm5leHRfaWgsCi0JCQkJCSAgY29uc3QgY2hhciAqdXJpLCBzaXplX3QgdXJpX2xlbikKLXsKLSAgICBkYXZfaWZfaGVhZGVyICppaDsKLQotICAgIGlmICgoaWggPSBhcF9wY2FsbG9jKHAsIHNpemVvZigqaWgpKSkgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLQotICAgIGloLT51cmkgPSB1cmk7Ci0gICAgaWgtPnVyaV9sZW4gPSB1cmlfbGVuOwotICAgIGloLT5uZXh0ID0gbmV4dF9paDsKLQotICAgIHJldHVybiBpaDsKLX0KLQotLyogYWRkX2lmX3N0YXRlIGFkZHMgYSBjb25kaXRpb24gdG8gYW4gaWZfaGVhZGVyLgotICovCi1zdGF0aWMgZGF2X2Vycm9yICogZGF2X2FkZF9pZl9zdGF0ZShwb29sICpwLCBkYXZfaWZfaGVhZGVyICppaCwKLQkJCQkgICAgY29uc3QgY2hhciAqc3RhdGVfdG9rZW4sCi0JCQkJICAgIGRhdl9pZl9zdGF0ZV90eXBlIHQsIGludCBjb25kaXRpb24sCi0JCQkJICAgIGNvbnN0IGRhdl9ob29rc19sb2NrcyAqbG9ja3NfaG9va3MpCi17Ci0gICAgZGF2X2lmX3N0YXRlX2xpc3QgKm5ld19zbDsKLQotICAgIG5ld19zbCA9IGFwX3BjYWxsb2MocCwgc2l6ZW9mKCpuZXdfc2wpKTsKLQotICAgIG5ld19zbC0+Y29uZGl0aW9uID0gY29uZGl0aW9uOwotICAgIG5ld19zbC0+dHlwZSAgICAgID0gdDsKLSAgICAKLSAgICBpZiAodCA9PSBkYXZfaWZfb3BhcXVlbG9jaykgewotCWRhdl9lcnJvciAqZXJyOwotCi0JaWYgKChlcnIgPSAoKmxvY2tzX2hvb2tzLT5wYXJzZV9sb2NrdG9rZW4pKHAsIHN0YXRlX3Rva2VuLAotCQkJCQkJICAgJm5ld19zbC0+bG9ja3Rva2VuKSkgIT0gTlVMTCkgewotCSAgICAvKiAjIyMgbWF5YmUgYWRkIGEgaGlnaGVyLWxldmVsIGRlc2NyaXB0aW9uICovCi0JICAgIHJldHVybiBlcnI7Ci0JfQotICAgIH0KLSAgICBlbHNlCi0JbmV3X3NsLT5ldGFnID0gc3RhdGVfdG9rZW47Ci0KLSAgICBuZXdfc2wtPm5leHQgPSBpaC0+c3RhdGU7Ci0gICAgaWgtPnN0YXRlID0gbmV3X3NsOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIGZldGNoX25leHRfdG9rZW4gcmV0dXJucyB0aGUgc3Vic3RyaW5nIGZyb20gc3RyKzEKLSAqIHRvIHRoZSBuZXh0IG9jY3VyZW5jZSBvZiBjaGFyIHRlcm0sIG9yIFwwLCB3aGljaGV2ZXIKLSAqIG9jY3VycyBmaXJzdC4gIExlYWRpbmcgd2hpdGVzcGFjZSBpcyBpZ25vcmVkLgotICovCi1zdGF0aWMgY2hhciAqZGF2X2ZldGNoX25leHRfdG9rZW4oY2hhciAqKnN0ciwgY2hhciB0ZXJtKQotewotICAgIGNoYXIgKnNwOwotICAgIGNoYXIgKnRva2VuOwotCQotICAgIHRva2VuID0gKnN0ciArIDE7Ci0KLSAgICB3aGlsZSAoKnRva2VuICYmICgqdG9rZW4gPT0gJyAnIHx8ICp0b2tlbiA9PSAnXHQnKSkKLQl0b2tlbisrOwotCi0gICAgaWYgKChzcCA9IHN0cmNocih0b2tlbiwgdGVybSkpID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAqc3AgPSAnXDAnOwotICAgICpzdHIgPSBzcDsKLSAgICByZXR1cm4gdG9rZW47Ci19Ci0KLS8qIGRhdl9wcm9jZXNzX2lmX2hlYWRlcjoKLSAqCi0gKiAgIElmIE5VTEwgKG5vIGVycm9yKSBpcyByZXR1cm5lZCwgdGhlbiAqKmlmX2hlYWRlciBwb2ludHMgdG8gdGhlCi0gKiAgICJJZiIgcHJvZHVjdGlvbnMgc3RydWN0dXJlIChvciBOVUxMIGlmICJJZiIgaXMgbm90IHByZXNlbnQpLgotICoKLSAqICAgIyMjIHRoaXMgcGFydCBpcyBib2d1czoKLSAqICAgSWYgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQsIHRoZSBlcnJvciBpcyBsb2dnZWQuICBQYXJlbnQgc2hvdWxkCi0gKiAgIHJldHVybiBlcnItPnN0YXR1cy4KLSAqLwotc3RhdGljIGRhdl9lcnJvciAqIGRhdl9wcm9jZXNzX2lmX2hlYWRlcihyZXF1ZXN0X3JlYyAqciwgZGF2X2lmX2hlYWRlciAqKnBfaWgpCi17Ci0gICAgZGF2X2Vycm9yICplcnI7Ci0gICAgY2hhciAqc3RyOwotICAgIGNoYXIgKmxpc3Q7Ci0gICAgY29uc3QgY2hhciAqc3RhdGVfdG9rZW47Ci0gICAgY29uc3QgY2hhciAqdXJpID0gTlVMTDsJLyogc2NvcGUgb2YgY3VycmVudCBwcm9kdWN0aW9uOyBOVUxMPW5vLXRhZyAqLwotICAgIHNpemVfdCB1cmlfbGVuOwotICAgIGRhdl9pZl9oZWFkZXIgKmloID0gTlVMTDsKLSAgICB1cmlfY29tcG9uZW50cyBwYXJzZWRfdXJpOwotICAgIGNvbnN0IGRhdl9ob29rc19sb2NrcyAqbG9ja3NfaG9va3MgPSBEQVZfR0VUX0hPT0tTX0xPQ0tTKHIpOwotICAgIGVudW0ge25vX3RhZ2dlZCwgdGFnZ2VkLCB1bmtub3dufSBsaXN0X3R5cGUgPSB1bmtub3duOwotICAgIGludCBjb25kaXRpb247Ci0JCi0gICAgKnBfaWggPSBOVUxMOwotCi0gICAgaWYgKChzdHIgPSBhcF9wc3RyZHVwKHItPnBvb2wsIGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiSWYiKSkpID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICB3aGlsZSAoKnN0cikgewotCXN3aXRjaCgqc3RyKSB7Ci0JY2FzZSAnPCc6Ci0JICAgIC8qIFRhZ2dlZC1saXN0IHByb2R1Y3Rpb24gLSBmb2xsb3dpbmcgc3RhdGVzIGFwcGx5IHRvIHRoaXMgdXJpICovCi0JICAgIGlmIChsaXN0X3R5cGUgPT0gbm9fdGFnZ2VkCi0JCXx8ICgodXJpID0gZGF2X2ZldGNoX25leHRfdG9rZW4oJnN0ciwgJz4nKSkgPT0gTlVMTCkpIHsKLQkJcmV0dXJuIGRhdl9uZXdfZXJyb3Ioci0+cG9vbCwgSFRUUF9CQURfUkVRVUVTVCwKLQkJCQkgICAgIERBVl9FUlJfSUZfVEFHR0VELAotCQkJCSAgICAgIkludmFsaWQgSWYtaGVhZGVyOiB1bmNsb3NlZCBcIjxcIiBvciAiCi0JCQkJICAgICAidW5leHBlY3RlZCB0YWdnZWQtbGlzdCBwcm9kdWN0aW9uLiIpOwotCSAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIDI1MTggc3BlY2lmaWVzIHRoaXMgbXVzdCBiZSBhbiBhYnNvbHV0ZSBVUkk7IGp1c3QgdGFrZSB0aGUKLSAgICAgICAgICAgICAqIHJlbGF0aXZlIHBhcnQgZm9yIGxhdGVyIGNvbXBhcmlzb24gYWdhaW5zdCByLT51cmkgKi8KLSAgICAgICAgICAgIGlmIChhcF9wYXJzZV91cmlfY29tcG9uZW50cyhyLT5wb29sLCB1cmksICZwYXJzZWRfdXJpKSAhPSBIVFRQX09LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRhdl9uZXdfZXJyb3Ioci0+cG9vbCwgSFRUUF9CQURfUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVZfRVJSX0lGX1RBR0dFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBVUkkgaW4gdGFnZ2VkIElmLWhlYWRlci4iKTsKLSAgICAgICAgICAgIH0KLQkgICAgLyogbm90ZSB0aGF0IHBhcnNlZF91cmkucGF0aCBpcyBhbGxvY2F0ZWQ7IHdlIGNhbiB0cmFzaCBpdCAqLwotCi0JICAgIC8qIGNsZWFuIHVwIHRoZSBVUkkgYSBiaXQgKi8KLQkgICAgYXBfZ2V0cGFyZW50cyhwYXJzZWRfdXJpLnBhdGgpOwotCSAgICB1cmlfbGVuID0gc3RybGVuKHBhcnNlZF91cmkucGF0aCk7Ci0JICAgIGlmICh1cmlfbGVuID4gMSAmJiBwYXJzZWRfdXJpLnBhdGhbdXJpX2xlbiAtIDFdID09ICcvJykKLQkJcGFyc2VkX3VyaS5wYXRoWy0tdXJpX2xlbl0gPSAnXDAnOwotCi0JICAgIHVyaSA9IHBhcnNlZF91cmkucGF0aDsKLQkgICAgbGlzdF90eXBlID0gdGFnZ2VkOwotCSAgICBicmVhazsKLQotCWNhc2UgJygnOgotCSAgICAvKiBMaXN0IHByb2R1Y3Rpb24gKi8KLQotCSAgICAvKiBJZiBhIHVyaSBoYXMgbm90IGJlZW4gZW5jb3VudGVyZWQsIHRoaXMgaXMgYSBOby1UYWdnZWQtTGlzdCAqLwotCSAgICBpZiAobGlzdF90eXBlID09IHVua25vd24pCi0JCWxpc3RfdHlwZSA9IG5vX3RhZ2dlZDsKLQotCSAgICBpZiAoKGxpc3QgPSBkYXZfZmV0Y2hfbmV4dF90b2tlbigmc3RyLCAnKScpKSA9PSBOVUxMKSB7Ci0JCXJldHVybiBkYXZfbmV3X2Vycm9yKHItPnBvb2wsIEhUVFBfQkFEX1JFUVVFU1QsCi0JCQkJICAgICBEQVZfRVJSX0lGX1VOQ0xPU0VEX1BBUkVOLAotCQkJCSAgICAgIkludmFsaWQgSWYtaGVhZGVyOiB1bmNsb3NlZCBcIihcIi4iKTsKLQkgICAgfQotCi0JICAgIGlmICgoaWggPSBkYXZfYWRkX2lmX3Jlc291cmNlKHItPnBvb2wsIGloLCB1cmksIHVyaV9sZW4pKSA9PSBOVUxMKSB7Ci0JCS8qICMjIyBkYXZfYWRkX2lmX3Jlc291cmNlKCkgc2hvdWxkIHJldHVybiBhbiBlcnJvciBmb3IgdXMhICovCi0JCXJldHVybiBkYXZfbmV3X2Vycm9yKHItPnBvb2wsIEhUVFBfQkFEX1JFUVVFU1QsCi0JCQkJICAgICBEQVZfRVJSX0lGX1BBUlNFLAotCQkJCSAgICAgIkludGVybmFsIHNlcnZlciBlcnJvciBwYXJzaW5nIFwiSWY6XCIgIgotCQkJCSAgICAgImhlYWRlci4iKTsKLQkgICAgfQotCi0JICAgIGNvbmRpdGlvbiA9IERBVl9JRl9DT05EX05PUk1BTDsKLQotCSAgICB3aGlsZSAoKmxpc3QpIHsKLQkJLyogTGlzdCBpcyB0aGUgZW50aXJlIHByb2R1Y3Rpb24gKGluIGEgdXJpIHNjb3BlKSAqLwotCi0JCXN3aXRjaCAoKmxpc3QpIHsKLQkJY2FzZSAnPCc6Ci0JCSAgICBpZiAoKHN0YXRlX3Rva2VuID0gZGF2X2ZldGNoX25leHRfdG9rZW4oJmxpc3QsICc+JykpID09IE5VTEwpIHsKLQkJCS8qICMjIyBhZGQgYSBkZXNjcmlwdGlvbiB0byB0aGlzIGVycm9yICovCi0JCQlyZXR1cm4gZGF2X25ld19lcnJvcihyLT5wb29sLCBIVFRQX0JBRF9SRVFVRVNULAotCQkJCQkgICAgIERBVl9FUlJfSUZfUEFSU0UsIE5VTEwpOwotCQkgICAgfQotCi0JCSAgICBpZiAoKGVyciA9IGRhdl9hZGRfaWZfc3RhdGUoci0+cG9vbCwgaWgsIHN0YXRlX3Rva2VuLCBkYXZfaWZfb3BhcXVlbG9jaywKLQkJCQkJCWNvbmRpdGlvbiwgbG9ja3NfaG9va3MpKSAhPSBOVUxMKSB7Ci0JCQkvKiAjIyMgbWF5YmUgYWRkIGEgaGlnaGVyIGxldmVsIGRlc2NyaXB0aW9uICovCi0JCQlyZXR1cm4gZXJyOwotCQkgICAgfQotCQkgICAgY29uZGl0aW9uID0gREFWX0lGX0NPTkRfTk9STUFMOwotCQkgICAgYnJlYWs7Ci0KLQkJY2FzZSAnWyc6Ci0JCSAgICBpZiAoKHN0YXRlX3Rva2VuID0gZGF2X2ZldGNoX25leHRfdG9rZW4oJmxpc3QsICddJykpID09IE5VTEwpIHsKLQkJCS8qICMjIyBhZGQgYSBkZXNjcmlwdGlvbiB0byB0aGlzIGVycm9yICovCi0JCQlyZXR1cm4gZGF2X25ld19lcnJvcihyLT5wb29sLCBIVFRQX0JBRF9SRVFVRVNULAotCQkJCQkgICAgIERBVl9FUlJfSUZfUEFSU0UsIE5VTEwpOwotCQkgICAgfQotCi0JCSAgICBpZiAoKGVyciA9IGRhdl9hZGRfaWZfc3RhdGUoci0+cG9vbCwgaWgsIHN0YXRlX3Rva2VuLCBkYXZfaWZfZXRhZywKLQkJCQkJCWNvbmRpdGlvbiwgbG9ja3NfaG9va3MpKSAhPSBOVUxMKSB7Ci0JCQkvKiAjIyMgbWF5YmUgYWRkIGEgaGlnaGVyIGxldmVsIGRlc2NyaXB0aW9uICovCi0JCQlyZXR1cm4gZXJyOwotCQkgICAgfQotCQkgICAgY29uZGl0aW9uID0gREFWX0lGX0NPTkRfTk9STUFMOwotCQkgICAgYnJlYWs7Ci0KLQkJY2FzZSAnTic6Ci0JCSAgICBpZiAobGlzdFsxXSA9PSAnbycgJiYgbGlzdFsyXSA9PSAndCcpIHsKLQkJCWlmIChjb25kaXRpb24gIT0gREFWX0lGX0NPTkRfTk9STUFMKSB7Ci0JCQkgICAgcmV0dXJuIGRhdl9uZXdfZXJyb3Ioci0+cG9vbCwgSFRUUF9CQURfUkVRVUVTVCwKLQkJCQkJCSBEQVZfRVJSX0lGX01VTFRJUExFX05PVCwKLQkJCQkJCSAiSW52YWxpZCBcIklmOlwiIGhlYWRlcjogIgotCQkJCQkJICJNdWx0aXBsZSBcIm5vdFwiIGVudHJpZXMgIgotCQkJCQkJICJmb3IgdGhlIHNhbWUgc3RhdGUuIik7Ci0JCQl9Ci0JCQljb25kaXRpb24gPSBEQVZfSUZfQ09ORF9OT1Q7Ci0JCSAgICB9Ci0JCSAgICBsaXN0ICs9IDI7Ci0JCSAgICBicmVhazsKLQotCQljYXNlICcgJzoKLQkJY2FzZSAnXHQnOgotCQkgICAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICAgIHJldHVybiBkYXZfbmV3X2Vycm9yKHItPnBvb2wsIEhUVFBfQkFEX1JFUVVFU1QsCi0JCQkJCSBEQVZfRVJSX0lGX1VOS19DSEFSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9wc3ByaW50ZihyLT5wb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBcIklmOlwiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlYWRlcjogVW5leHBlY3RlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGFyYWN0ZXIgZW5jb3VudGVyZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDB4JTAyeCwgJyVjJykuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxpc3QsICpsaXN0KSk7Ci0JCX0KLQotCQlsaXN0Kys7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQljYXNlICcgJzoKLQljYXNlICdcdCc6Ci0JICAgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgICAgcmV0dXJuIGRhdl9uZXdfZXJyb3Ioci0+cG9vbCwgSFRUUF9CQURfUkVRVUVTVCwKLQkJCQkgREFWX0VSUl9JRl9VTktfQ0hBUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX3BzcHJpbnRmKHItPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBcIklmOlwiIGhlYWRlcjogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgY2hhcmFjdGVyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmNvdW50ZXJlZCAoMHglMDJ4LCAnJWMnKS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0ciwgKnN0cikpOwotCX0KLQotCXN0cisrOwotICAgIH0KLQotICAgICpwX2loID0gaWg7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgZGF2X2ZpbmRfc3VibWl0dGVkX2xvY2t0b2tlbihjb25zdCBkYXZfaWZfaGVhZGVyICppZl9oZWFkZXIsCi0JCQkJCWNvbnN0IGRhdl9sb2NrICpsb2NrX2xpc3QsCi0JCQkJCWNvbnN0IGRhdl9ob29rc19sb2NrcyAqbG9ja3NfaG9va3MpCi17Ci0gICAgZm9yICg7IGlmX2hlYWRlciAhPSBOVUxMOyBpZl9oZWFkZXIgPSBpZl9oZWFkZXItPm5leHQpIHsKLQljb25zdCBkYXZfaWZfc3RhdGVfbGlzdCAqc3RhdGVfbGlzdDsKLQotCWZvciAoc3RhdGVfbGlzdCA9IGlmX2hlYWRlci0+c3RhdGU7Ci0JICAgICBzdGF0ZV9saXN0ICE9IE5VTEw7Ci0JICAgICBzdGF0ZV9saXN0ID0gc3RhdGVfbGlzdC0+bmV4dCkgewotCi0JICAgIGlmIChzdGF0ZV9saXN0LT50eXBlID09IGRhdl9pZl9vcGFxdWVsb2NrKSB7Ci0JCWNvbnN0IGRhdl9sb2NrICpsb2NrOwotCi0JCS8qIGdpdmVuIHN0YXRlX2xpc3QtPmxvY2t0b2tlbiwgbWF0Y2ggaXQgKi8KLQotCQkvKgotCQkqKiBUaGUgcmVzb3VyY2Ugd2lsbCBoYXZlIG9uZSBvciBtb3JlIGxvY2sgdG9rZW5zLiBXZSBvbmx5Ci0JCSoqIG5lZWQgdG8gbWF0Y2ggb25lIG9mIHRoZW0gYWdhaW5zdCBhbnkgdG9rZW4gaW4gdGhlCi0JCSoqIElmOiBoZWFkZXIuCi0JCSoqCi0JCSoqIE9uZSB0b2tlbiBjYXNlOiBJdCBpcyBhbiBleGNsdXNpdmUgb3Igc2hhcmVkIGxvY2suIEVpdGhlcgotCQkqKiAgICAgICAgICAgICAgICAgd2F5LCB3ZSBtdXN0IGZpbmQgaXQuCi0JCSoqCi0JCSoqIE4gdG9rZW4gY2FzZTogVGhleSBhcmUgc2hhcmVkIGxvY2tzLiBCeSBwb2xpY3ksIHdlIG5lZWQKLQkJKiogICAgICAgICAgICAgICB0byBtYXRjaCBvbmx5IG9uZS4gVGhlIHJlc291cmNlJ3Mgb3RoZXIKLQkJKiogICAgICAgICAgICAgICB0b2tlbnMgbWF5IGJlbG9uZyB0byBzb21lYm9keSBlbHNlIChzbyB3ZQotCQkqKiAgICAgICAgICAgICAgIHNob3VsZG4ndCBzZWUgdGhlbSBpbiB0aGUgSWY6IGhlYWRlciBhbnl3YXkpCi0JCSovCi0JCWZvciAobG9jayA9IGxvY2tfbGlzdDsgbG9jayAhPSBOVUxMOyBsb2NrID0gbG9jay0+bmV4dCkgewotCi0JCSAgICBpZiAoISgqbG9ja3NfaG9va3MtPmNvbXBhcmVfbG9ja3Rva2VuKShzdGF0ZV9saXN0LT5sb2NrdG9rZW4sIGxvY2stPmxvY2t0b2tlbikpIHsKLQkJCXJldHVybiAxOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIGRhdl92YWxpZGF0ZV9yZXNvdXJjZV9zdGF0ZToKLSAqICAgIFJldHVybnMgTlVMTCBpZiBwYXRoL3VyaSBtZWV0cyBpZi1oZWFkZXIgYW5kIGxvY2sgcmVxdWlyZW1lbnRzCi0gKi8KLXN0YXRpYyBkYXZfZXJyb3IgKiBkYXZfdmFsaWRhdGVfcmVzb3VyY2Vfc3RhdGUocG9vbCAqcCwKLQkJCQkJICAgICAgIGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkJCSAgICAgICBkYXZfbG9ja2RiICpsb2NrZGIsCi0JCQkJCSAgICAgICBjb25zdCBkYXZfaWZfaGVhZGVyICppZl9oZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKLQkJCQkJICAgICAgIGRhdl9idWZmZXIgKnBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfcmVjICpyKQotewotICAgIGRhdl9lcnJvciAqZXJyOwotICAgIGNvbnN0IGNoYXIgKnVyaTsKLSAgICBjb25zdCBjaGFyICpldGFnOwotICAgIGNvbnN0IGRhdl9ob29rc19sb2NrcyAqbG9ja3NfaG9va3MgPSAobG9ja2RiID8gbG9ja2RiLT5ob29rcyA6IE5VTEwpOwotICAgIGNvbnN0IGRhdl9pZl9oZWFkZXIgKmlmaGRyX3NjYW47Ci0gICAgZGF2X2lmX3N0YXRlX2xpc3QgKnN0YXRlX2xpc3Q7Ci0gICAgZGF2X2xvY2sgKmxvY2tfbGlzdDsKLSAgICBkYXZfbG9jayAqbG9jazsKLSAgICBpbnQgbnVtX21hdGNoZWQ7Ci0gICAgaW50IG51bV90aGF0X2FwcGx5OwotICAgIGludCBzZWVuX2xvY2t0b2tlbjsKLSAgICBzaXplX3QgdXJpX2xlbjsKLSAgICBjb25zdCBjaGFyICpyZWFzb24gPSBOVUxMOwotCi0gICAgLyogREJHMSgidmFsaWRhdGU6IDwlcz4iLCByZXNvdXJjZS0+dXJpKTsgKi8KLQotICAgIC8qCi0gICAgKiogVGhlIHJlc291cmNlIHdpbGwgaGF2ZSBvbmUgb2YgdGhyZWUgc3RhdGVzOgotICAgICoqCi0gICAgKiogMSkgTm8gbG9ja3MuIFdlIGhhdmUgbm8gc3BlY2lhbCByZXF1aXJlbWVudHMgdGhhdCB0aGUgdXNlciBzdXBwbHkKLSAgICAqKiAgICBzcGVjaWZpYyBsb2NrdG9rZW5zLiBPbmUgb2YgdGhlIHN0YXRlIGxpc3RzIG11c3QgbWF0Y2gsIGFuZAotICAgICoqICAgIHdlJ3JlIGRvbmUuCi0gICAgKioKLSAgICAqKiAyKSBPbmUgZXhjbHVzaXZlIGxvY2suIFRoZSBsb2NrdG9rZW4gbXVzdCBhcHBlYXIgKmFueXdoZXJlKiBpbiB0aGUKLSAgICAqKiAgICBJZjogaGVhZGVyLiBPZiBjb3Vyc2UsIGFzc2VydGluZyB0aGUgdG9rZW4gaW4gYSAiTm90IiB0ZXJtIHdpbGwKLSAgICAqKiAgICBxdWlja2x5IGZhaWwgdGhhdCBzdGF0ZSBsaXN0IDotKS4gSWYgdGhlIGxvY2t0b2tlbiBhcHBlYXJzIGluCi0gICAgKiogICAgb25lIG9mIHRoZSBzdGF0ZSBsaXN0cyAqYW5kKiBvbmUgc3RhdGUgbGlzdCBtYXRjaGVzLCB0aGVuIHdlJ3JlCi0gICAgKiogICAgZG9uZS4KLSAgICAqKgotICAgICoqIDMpIE9uZSBvciBtb3JlIHNoYXJlZCBsb2Nrcy4gT25lIG9mIHRoZSBsb2NrdG9rZW5zIG11c3QgYXBwZWFyCi0gICAgKiogICAgKmFueXdoZXJlKiBpbiB0aGUgSWY6IGhlYWRlci4gSWYgb25lIG9mIHRoZSBsb2NrdG9rZW5zIGFwcGVhcnMsCi0gICAgKiogICAgYW5kIHdlIG1hdGNoIG9uZSBzdGF0ZSBsaXN0LCB0aGVuIHdlIGFyZSBkb25lLgotICAgICoqCi0gICAgKiogVGhlIDxzZWVuX2xvY2t0b2tlbj4gdmFyaWFibGUgZGV0ZXJtaW5lcyB3aGV0aGVyIHdlIGhhdmUgc2VlbiBvbmUKLSAgICAqKiBvZiB0aGlzIHJlc291cmNlJ3MgbG9ja3Rva2VucyBpbiB0aGUgSWY6IGhlYWRlci4KLSAgICAqLwotCi0gICAgLyoKLSAgICAqKiBJZiB0aGlzIGlzIGEgbmV3IGxvY2sgcmVxdWVzdCwgPGZsYWdzPiB3aWxsIGNvbnRhaW4gdGhlIHJlcXVlc3RlZAotICAgICoqIGxvY2sgc2NvcGUuICBUaHJlZSBydWxlcyBhcHBseToKLSAgICAqKgotICAgICoqIDEpIERvIG5vdCByZXF1aXJlIGEgKHNoYXJlZCkgbG9ja3Rva2VuIHRvIGJlIHNlZW4gKHdoZW4gd2UgYXJlCi0gICAgKiogICAgYXBwbHlpbmcgYW5vdGhlciBzaGFyZWQgbG9jaykKLSAgICAqKiAyKSBJZiB0aGUgc2NvcGUgaXMgZXhjbHVzaXZlIGFuZCB3ZSBzZWUgYW55IGxvY2tzLCBmYWlsLgotICAgICoqIDMpIElmIHRoZSBzY29wZSBpcyBzaGFyZWQgYW5kIHdlIHNlZSBhbiBleGNsdXNpdmUgbG9jaywgZmFpbC4KLSAgICAqLwotCi0gICAgaWYgKGxvY2tkYiA9PSBOVUxMKSB7Ci0JLyogd2UncmUgaW4gU3RhdGUgMS4gbm8gbG9ja3MuICovCi0JbG9ja19saXN0ID0gTlVMTDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JLyoKLQkqKiAjIyMgaHJtLi4uIHdlIGRvbid0IG5lZWQgdG8gaGF2ZSB0aGVzZSBmdWxseQotCSoqICMjIyByZXNvbHZlZCBzaW5jZSB3ZSdyZSBvbmx5IGxvb2tpbmcgYXQgdGhlCi0JKiogIyMjIGxvY2t0b2tlbnMuLi4KLQkqKgotCSoqICMjIyB1c2UgZ2V0X2xvY2tzIHcvIGNhbGx0eXBlPVBBUlRJQUwKLQkqLwotCWlmICgoZXJyID0gZGF2X2xvY2tfcXVlcnkobG9ja2RiLCByZXNvdXJjZSwgJmxvY2tfbGlzdCkpICE9IE5VTEwpIHsKLQkgICAgcmV0dXJuIGRhdl9wdXNoX2Vycm9yKHAsCi0JCQkJICBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgMCwKLQkJCQkgICJUaGUgbG9ja3MgY291bGQgbm90IGJlIHF1ZXJpZWQgZm9yICIKLQkJCQkgICJ2ZXJpZmljYXRpb24gYWdhaW5zdCBhIHBvc3NpYmxlIFwiSWY6XCIgIgotCQkJCSAgImhlYWRlci4iLAotCQkJCSAgZXJyKTsKLQl9Ci0KLQkvKiBsb2NrX2xpc3Qgbm93IGRldGVybWluZXMgd2hldGhlciB3ZSdyZSBpbiBTdGF0ZSAxLCAyLCBvciAzLiAqLwotICAgIH0KLQotICAgIC8qIAotICAgICoqIEZvciBhIG5ldywgZXhjbHVzaXZlIGxvY2s6IGlmIGFueSBsb2NrcyBleGlzdCwgZmFpbC4KLSAgICAqKiBGb3IgYSBuZXcsIHNoYXJlZCBsb2NrOiAgICBpZiBhbiBleGNsdXNpdmUgbG9jayBleGlzdHMsIGZhaWwuCi0gICAgKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSwgZG8gbm90IHJlcXVpcmUgYSB0b2tlbiB0byBiZSBzZWVuLgotICAgICovCi0gICAgaWYgKGZsYWdzICYgREFWX0xPQ0tTQ09QRV9FWENMVVNJVkUpIHsKLQlpZiAobG9ja19saXN0ICE9IE5VTEwpIHsKLQkgICAgcmV0dXJuIGRhdl9uZXdfZXJyb3IocCwgSFRUUF9MT0NLRUQsIDAsIAotCQkJCSAiRXhpc3RpbmcgbG9jayhzKSBvbiB0aGUgcmVxdWVzdGVkIHJlc291cmNlICIKLQkJCQkgInByZXZlbnQgYW4gZXhjbHVzaXZlIGxvY2suIik7Ci0JfQotCi0JLyoKLQkqKiBUaGVyZSBhcmUgbm8gbG9ja3MsIHNvIHdlIGNhbiBwcmV0ZW5kIHRoYXQgd2UndmUgYWxyZWFkeSBtZXQKLQkqKiBhbnkgcmVxdWlyZW1lbnQgdG8gZmluZCB0aGUgcmVzb3VyY2UncyBsb2NrcyBpbiBhbiBJZjogaGVhZGVyLgotCSovCi0Jc2Vlbl9sb2NrdG9rZW4gPSAxOwotICAgIH0KLSAgICBlbHNlIGlmIChmbGFncyAmIERBVl9MT0NLU0NPUEVfU0hBUkVEKSB7Ci0JLyoKLQkqKiBTdHJpY3RseSBzcGVha2luZywgd2UgZG9uJ3QgbmVlZCB0aGlzIGxvb3AuIEVpdGhlciB0aGUgZmlyc3QKLQkqKiAoYW5kIG9ubHkpIGxvY2sgd2lsbCBiZSBFWENMVVNJVkUsIG9yIG5vbmUgb2YgdGhlbSB3aWxsIGJlLgotCSovCi0gICAgICAgIGZvciAobG9jayA9IGxvY2tfbGlzdDsgbG9jayAhPSBOVUxMOyBsb2NrID0gbG9jay0+bmV4dCkgewotICAgICAgICAgICAgaWYgKGxvY2stPnNjb3BlID09IERBVl9MT0NLU0NPUEVfRVhDTFVTSVZFKSB7Ci0JCXJldHVybiBkYXZfbmV3X2Vycm9yKHAsIEhUVFBfTE9DS0VELCAwLAotCQkJCSAgICAgIlRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgaXMgYWxyZWFkeSAiCi0JCQkJICAgICAibG9ja2VkIGV4Y2x1c2l2ZWx5LiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQkvKgotCSoqIFRoZSBsb2NrcyBvbiB0aGUgcmVzb3VyY2UgKGlmIGFueSkgYXJlIGFsbCBzaGFyZWQuIFNldCB0aGUKLQkqKiA8c2Vlbl9sb2NrdG9rZW4+IGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSBkbyBub3QgbmVlZCB0byBmaW5kCi0JKiogdGhlIGxvY2tzIGluIGFuIElmOiBoZWFkZXIuCi0JKi8KLSAgICAgICAgc2Vlbl9sb2NrdG9rZW4gPSAxOwotICAgIH0KLSAgICBlbHNlIHsKLQkvKgotCSoqIEZvciBtZXRob2RzIG90aGVyIHRoYW4gTE9DSzoKLQkqKgotCSoqIElmIHdlIGhhdmUgbm8gbG9ja3MsIHRoZW4gPHNlZW5fbG9ja3Rva2VuPiBjYW4gYmUgc2V0IHRvIHRydWUgLS0KLQkqKiBwcmV0ZW5kaW5nIHRoYXQgd2UndmUgYWxyZWFkeSBtZXQgdGhlIHJlcXVpcmVtZW50IG9mIHNlZWluZyBvbmUKLQkqKiBvZiB0aGUgcmVzb3VyY2UncyBsb2NrcyBpbiB0aGUgSWY6IGhlYWRlci4KLQkqKgotCSoqIE90aGVyd2lzZSwgaXQgbXVzdCBiZSBjbGVhcmVkIGFuZCB3ZSdsbCBsb29rIGZvciBvbmUuCi0JKi8KLSAgICAgICAgc2Vlbl9sb2NrdG9rZW4gPSAobG9ja19saXN0ID09IE5VTEwpOwotICAgIH0KLQotICAgIC8qCi0gICAgKiogSWYgdGhlcmUgaXMgbm8gSWY6IGhlYWRlciwgdGhlbiB3ZSBjYW4gc2hvcnRjdXQgc29tZSBsb2dpYzoKLSAgICAqKgotICAgICoqIDEpIGlmIHdlIGRvIG5vdCBuZWVkIHRvIGZpbmQgYSBsb2NrdG9rZW4gaW4gdGhlIChub24tZXhpc3RlbnQpIElmOgotICAgICoqICAgIGhlYWRlciwgdGhlbiB3ZSBhcmUgc3VjY2Vzc2Z1bC4KLSAgICAqKgotICAgICoqIDIpIGlmIHdlIG11c3QgZmluZCBhIGxvY2t0b2tlbiBpbiB0aGUgKG5vbi1leGlzdGVudCkgSWY6IGhlYWRlciwgdGhlbgotICAgICoqICAgIHdlIGZhaWwuCi0gICAgKi8KLSAgICBpZiAoaWZfaGVhZGVyID09IE5VTEwpIHsKLQlpZiAoc2Vlbl9sb2NrdG9rZW4pCi0JICAgIHJldHVybiBOVUxMOwotCi0JcmV0dXJuIGRhdl9uZXdfZXJyb3IocCwgSFRUUF9MT0NLRUQsIDAsCi0JCQkgICAgICJUaGlzIHJlc291cmNlIGlzIGxvY2tlZCBhbmQgYW4gXCJJZjpcIiBoZWFkZXIgIgotCQkJICAgICAid2FzIG5vdCBzdXBwbGllZCB0byBhbGxvdyBhY2Nlc3MgdG8gdGhlICIKLQkJCSAgICAgInJlc291cmNlLiIpOwotICAgIH0KLSAgICAvKiB0aGUgSWY6IGhlYWRlciBpcyBwcmVzZW50ICovCi0KLSAgICAvKgotICAgICoqIElmIGEgZHVtbXkgaGVhZGVyIGlzIHByZXNlbnQgKGJlY2F1c2Ugb2YgYSBMb2NrLVRva2VuOiBoZWFkZXIpLCB0aGVuCi0gICAgKiogd2UgYXJlIHJlcXVpcmVkIHRvIGZpbmQgdGhhdCB0b2tlbiBpbiB0aGlzIHJlc291cmNlJ3Mgc2V0IG9mIGxvY2tzLgotICAgICoqIElmIHdlIGhhdmUgbm8gbG9ja3MsIHRoZW4gd2UgaW1tZWRpYXRlbHkgZmFpbC4KLSAgICAqKgotICAgICoqIFRoaXMgaXMgYSA0MDAgKEJhZCBSZXF1ZXN0KSBzaW5jZSB0aGV5IHNob3VsZCBvbmx5IHN1Ym1pdCBhIGxvY2t0b2tlbgotICAgICoqIHRoYXQgYWN0dWFsbHkgZXhpc3RzLgotICAgICoqCi0gICAgKiogRG9uJ3QgaXNzdWUgdGhpcyByZXNwb25zZSBpZiB3ZSdyZSB0YWxraW5nIGFib3V0IHRoZSBwYXJlbnQgcmVzb3VyY2UuCi0gICAgKiogSXQgaXMgb2theSBmb3IgdGhhdCByZXNvdXJjZSB0byBOT1QgaGF2ZSB0aGlzIGxvY2t0b2tlbi4KLSAgICAqKiAoaW4gZmFjdCwgaXQgY2VydGFpbmx5IHdpbGwgbm90OiBhIGR1bW15X2hlYWRlciBvbmx5IG9jY3VycyBmb3IgdGhlCi0gICAgKiogIFVOTE9DSyBtZXRob2QsIHRoZSBwYXJlbnQgaXMgY2hlY2tlZCBvbmx5IGZvciBsb2NrbnVsbCByZXNvdXJjZXMsCi0gICAgKiogIGFuZCB0aGUgcGFyZW50IGNlcnRhaW5seSBkb2VzIG5vdCBoYXZlIHRoZSAobG9ja251bGwncykgbG9ja3Rva2VuKQotICAgICovCi0gICAgaWYgKGxvY2tfbGlzdCA9PSBOVUxMICYmIGlmX2hlYWRlci0+ZHVtbXlfaGVhZGVyKSB7Ci0gICAgICAgIGlmIChmbGFncyAmIERBVl9WQUxJREFURV9JU19QQVJFTlQpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLQlyZXR1cm4gZGF2X25ld19lcnJvcihwLCBIVFRQX0JBRF9SRVFVRVNULCAwLAotCQkJICAgICAiVGhlIGxvY2t0b2tlbiBzcGVjaWZpZWQgaW4gdGhlIFwiTG9jay1Ub2tlbjpcIiAiCi0JCQkgICAgICJoZWFkZXIgaXMgaW52YWxpZCBiZWNhdXNlIHRoaXMgcmVzb3VyY2UgaGFzIG5vICIKLQkJCSAgICAgIm91dHN0YW5kaW5nIGxvY2tzLiIpOwotICAgIH0KLQotICAgIC8qCi0gICAgKiogUHJlcGFyZSB0aGUgaW5wdXQgVVJJLiBXZSB3YW50IHRoZSBVUkkgdG8gbmV2ZXIgaGF2ZSBhIHRyYWlsaW5nIHNsYXNoLgotICAgICoqCi0gICAgKiogV2hlbiBVUklzIGFyZSBwbGFjZWQgaW50byB0aGUgZGF2X2lmX2hlYWRlciBzdHJ1Y3R1cmUsIHRoZXkgYXJlCi0gICAgKiogZ3VhcmFudGVlZCB0byBuZXZlciBoYXZlIGEgdHJhaWxpbmcgc2xhc2guIElmIHRoZSBVUklzIGFyZSBlcXVpdmFsZW50LAotICAgICoqIHRoZW4gaXQgZG9lc24ndCBtYXR0ZXIgaWYgdGhleSBib3RoIGxhY2sgYSB0cmFpbGluZyBzbGFzaCAtLSB0aGV5J3JlCi0gICAgKiogc3RpbGwgZXF1aXZhbGVudC4KLSAgICAqKgotICAgICoqIE5vdGU6IHdlIGNvdWxkIGFsc28gZW5zdXJlIHRoYXQgYSB0cmFpbGluZyBzbGFzaCBpcyBwcmVzZW50IG9uIGJvdGgKLSAgICAqKiBVUklzLCBidXQgdGhlIG1ham9yaXR5IG9mIFVSSXMgcHJvdmlkZWQgdG8gdXMgdmlhIGEgcmVzb3VyY2Ugd2FsawotICAgICoqIHdpbGwgbm90IGNvbnRhaW4gdGhhdCB0cmFpbGluZyBzbGFzaC4KLSAgICAqLwotICAgIHVyaSA9IHJlc291cmNlLT51cmk7Ci0gICAgdXJpX2xlbiA9IHN0cmxlbih1cmkpOwotICAgIGlmICh1cmlbdXJpX2xlbiAtIDFdID09ICcvJykgewotCWRhdl9zZXRfYnVmc2l6ZShwLCBwYnVmLCB1cmlfbGVuKTsKLQltZW1jcHkocGJ1Zi0+YnVmLCB1cmksIHVyaV9sZW4pOwotCXBidWYtPmJ1ZlstLXVyaV9sZW5dID0gJ1wwJzsKLQl1cmkgPSBwYnVmLT5idWY7Ci0gICAgfQotCi0gICAgLyogZ2V0IHRoZSByZXNvdXJjZSdzIGV0YWc7IHdlIG1heSBuZWVkIGl0IGR1cmluZyB0aGUgY2hlY2tzICovCi0gICAgZXRhZyA9ICgqcmVzb3VyY2UtPmhvb2tzLT5nZXRldGFnKShyZXNvdXJjZSk7Ci0KLSAgICAvKiBob3cgbWFueSBzdGF0ZV9saXN0cyBhcHBseSB0byB0aGlzIFVSST8gKi8KLSAgICBudW1fdGhhdF9hcHBseSA9IDA7Ci0KLSAgICAvKiBJZiB0aGVyZSBhcmUgaWYtaGVhZGVycywgZmFpbCBpZiB0aGlzIHJlc291cmNlCi0gICAgICogZG9lcyBub3QgbWF0Y2ggYXQgbGVhc3Qgb25lIHN0YXRlX2xpc3QuCi0gICAgICovCi0gICAgZm9yIChpZmhkcl9zY2FuID0gaWZfaGVhZGVyOwotCSBpZmhkcl9zY2FuICE9IE5VTEw7Ci0JIGlmaGRyX3NjYW4gPSBpZmhkcl9zY2FuLT5uZXh0KSB7Ci0KLQkvKiBEQkcyKCJ1cmk9PCVzPiAgaWZfdXJpPTwlcz4iLCB1cmksIGlmaGRyX3NjYW4tPnVyaSA/IGlmaGRyX3NjYW4tPnVyaSA6ICIobm8gdXJpKSIpOyAqLwotCi0JaWYgKGlmaGRyX3NjYW4tPnVyaSAhPSBOVUxMCi0JICAgICYmICh1cmlfbGVuICE9IGlmaGRyX3NjYW4tPnVyaV9sZW4KLQkJfHwgbWVtY21wKHVyaSwgaWZoZHJfc2Nhbi0+dXJpLCB1cmlfbGVuKSAhPSAwKSkgewotCSAgICAvKgotCSAgICAqKiBBIHRhZ2dlZC1saXN0J3MgVVJJIGRvZXNuJ3QgbWF0Y2ggdGhpcyByZXNvdXJjZSdzIFVSSS4KLQkgICAgKiogU2tpcCB0byB0aGUgbmV4dCBzdGF0ZV9saXN0IHRvIHNlZSBpZiBpdCB3aWxsIG1hdGNoLgotCSAgICAqLwotCSAgICBjb250aW51ZTsKLQl9Ci0KLQkvKiB0aGlzIHN0YXRlX2xpc3QgYXBwbGllcyB0byB0aGlzIHJlc291cmNlICovCi0KLQkvKgotCSoqICMjIyBvbmx5IG9uZSBzdGF0ZV9saXN0IHNob3VsZCBldmVyIGFwcGx5ISBhIG5vLXRhZywgb3IgYSB0YWdnZWQKLQkqKiAjIyMgd2hlcmUgUzkuNC4yIHN0YXRlcyBvbmx5IG9uZSBjYW4gbWF0Y2guCi0JKioKLQkqKiAjIyMgcmV2YW1wIHRoaXMgY29kZSB0byBsb29wIHRocnUgaWZoZHJfc2NhbiB1bnRpbCB3ZSBmaW5kIHRoZQotCSoqICMjIyBtYXRjaGluZyBzdGF0ZV9saXN0LiBwcm9jZXNzIGl0LiBzdG9wLgotCSovCi0JKytudW1fdGhhdF9hcHBseTsKLQotCS8qIFRvIHN1Y2NlZWQsIHJlc291cmNlIG11c3QgbWF0Y2ggKmFsbCogb2YgdGhlIHN0YXRlcwotCSAqIHNwZWNpZmllZCBpbiB0aGUgc3RhdGVfbGlzdC4KLQkgKi8KLQlmb3IgKHN0YXRlX2xpc3QgPSBpZmhkcl9zY2FuLT5zdGF0ZTsKLQkgICAgIHN0YXRlX2xpc3QgIT0gTlVMTDsKLQkgICAgIHN0YXRlX2xpc3QgPSBzdGF0ZV9saXN0LT5uZXh0KSB7Ci0KLQkgICAgc3dpdGNoKHN0YXRlX2xpc3QtPnR5cGUpIHsKLQkgICAgY2FzZSBkYXZfaWZfZXRhZzoKLQkgICAgewotCQlpbnQgbWlzbWF0Y2ggPSBzdHJjbXAoc3RhdGVfbGlzdC0+ZXRhZywgZXRhZyk7Ci0KLQkJaWYgKHN0YXRlX2xpc3QtPmNvbmRpdGlvbiA9PSBEQVZfSUZfQ09ORF9OT1JNQUwgJiYgbWlzbWF0Y2gpIHsKLQkJICAgIC8qCi0JCSAgICAqKiBUaGUgc3BlY2lmaWVkIGVudGl0eS10YWcgZG9lcyBub3QgbWF0Y2ggdGhlCi0JCSAgICAqKiBlbnRpdHktdGFnIG9uIHRoZSByZXNvdXJjZS4gVGhpcyBzdGF0ZV9saXN0IGlzCi0JCSAgICAqKiBub3QgZ29pbmcgdG8gbWF0Y2guIEJ1c3Qgb3V0dGEgaGVyZS4KLQkJICAgICovCi0JCSAgICByZWFzb24gPQotCQkJImFuIGVudGl0eS10YWcgd2FzIHNwZWNpZmllZCwgYnV0IHRoZSByZXNvdXJjZSdzICIKLQkJCSJhY3R1YWwgRVRhZyBkb2VzIG5vdCBtYXRjaC4iOwotCQkgICAgZ290byBzdGF0ZV9saXN0X2ZhaWxlZDsKLQkJfQotCQllbHNlIGlmIChzdGF0ZV9saXN0LT5jb25kaXRpb24gPT0gREFWX0lGX0NPTkRfTk9UCi0JCQkgJiYgIW1pc21hdGNoKSB7Ci0JCSAgICAvKgotCQkgICAgKiogVGhlIHNwZWNpZmllZCBlbnRpdHktdGFnIERPRVMgbWF0Y2ggdGhlCi0JCSAgICAqKiBlbnRpdHktdGFnIG9uIHRoZSByZXNvdXJjZS4gVGhpcyBzdGF0ZV9saXN0IGlzCi0JCSAgICAqKiBub3QgZ29pbmcgdG8gbWF0Y2guIEJ1c3Qgb3V0dGEgaGVyZS4KLQkJICAgICovCi0JCSAgICByZWFzb24gPQotCQkJImFuIGVudGl0eS10YWcgd2FzIHNwZWNpZmllZCB1c2luZyB0aGUgXCJOb3RcIiBmb3JtLCAiCi0JCQkiYnV0IHRoZSByZXNvdXJjZSdzIGFjdHVhbCBFVGFnIG1hdGNoZXMgdGhlIHByb3ZpZGVkICIKLQkJCSJlbnRpdHktdGFnLiI7Ci0JCSAgICBnb3RvIHN0YXRlX2xpc3RfZmFpbGVkOwotCQl9Ci0JCWJyZWFrOwotCSAgICB9Ci0KLQkgICAgY2FzZSBkYXZfaWZfb3BhcXVlbG9jazoKLQkJaWYgKGxvY2tkYiA9PSBOVUxMKSB7Ci0JCSAgICBpZiAoc3RhdGVfbGlzdC0+Y29uZGl0aW9uID09IERBVl9JRl9DT05EX05PVCkgewotCQkJLyogdGhlIGxvY2t0b2tlbiBpcyBkZWZpbml0ZWx5IG5vdCB0aGVyZSEgKHN1Y2Nlc3MpICovCi0JCQljb250aW51ZTsKLQkJICAgIH0KLQotCQkgICAgLyogY29uZGl0aW9uID09IERBVl9JRl9DT05EX05PUk1BTCAqLwotCi0JCSAgICAvKgotCQkgICAgKiogSWYgbm8gbG9ja2RiIGlzIHByb3ZpZGVkLCB0aGVuIHZhbGlkYXRpb24gZmFpbHMgZm9yCi0JCSAgICAqKiB0aGlzIHN0YXRlX2xpc3QgKE5PUk1BTCBtZWFucyB3ZSB3ZXJlIHN1cHBvc2VkIHRvCi0JCSAgICAqKiBmaW5kIHRoZSB0b2tlbiwgd2hpY2ggd2Ugb2J2aW91c2x5IGNhbm5vdCBkbyB3aXRob3V0Ci0JCSAgICAqKiBhIGxvY2sgZGF0YWJhc2UpLgotCQkgICAgKioKLQkJICAgICoqIEdvIGFuZCB0cnkgdGhlIG5leHQgc3RhdGUgbGlzdC4KLQkJICAgICovCi0JCSAgICByZWFzb24gPQotCQkJImEgU3RhdGUtdG9rZW4gd2FzIHN1cHBsaWVkLCBidXQgYSBsb2NrIGRhdGFiYXNlICIKLQkJCSJpcyBub3QgYXZhaWxhYmxlIGZvciB0byBwcm92aWRlIHRoZSByZXF1aXJlZCBsb2NrLiI7Ci0JCSAgICBnb3RvIHN0YXRlX2xpc3RfZmFpbGVkOwotCQl9Ci0KLQkJLyogUmVzb3VyY2UgdmFsaWRhdGlvbiAnZmFpbHMnIGlmOgotCQkgKiAgICBBTlkgIG9mIHRoZSBsb2NrLT5sb2NrdG9rZW5zIG1hdGNoCi0JCSAqICAgICAgICAgYSBOT1Qgc3RhdGVfbGlzdC0+bG9ja3Rva2VuLAotCQkgKiBPUgotCQkgKiAgICBOT05FIG9mIHRoZSBsb2NrLT5sb2NrdG9rZW5zIG1hdGNoCi0JCSAqICAgICAgICAgYSBOT1JNQUwgc3RhdGVfbGlzdC0+bG9ja3Rva2VuLgotCQkgKi8KLQkJbnVtX21hdGNoZWQgPSAwOwotCQlmb3IgKGxvY2sgPSBsb2NrX2xpc3Q7IGxvY2sgIT0gTlVMTDsgbG9jayA9IGxvY2stPm5leHQpIHsKLQotCQkgICAgLyoKLQkJICAgIERCRzIoImNvbXBhcmU6IHJzcmM9JXMgIGlmaGRyPSVzIiwKLQkJCSAoKmxvY2tzX2hvb2tzLT5mb3JtYXRfbG9ja3Rva2VuKShwLCBsb2NrLT5sb2NrdG9rZW4pLAotCQkJICgqbG9ja3NfaG9va3MtPmZvcm1hdF9sb2NrdG9rZW4pKHAsIHN0YXRlX2xpc3QtPmxvY2t0b2tlbikpOwotCQkgICAgKi8KLQotCQkgICAgLyogbm90aGluZyB0byBkbyBpZiB0aGUgbG9ja3Rva2VucyBkbyBub3QgbWF0Y2guICovCi0JCSAgICBpZiAoKCpsb2Nrc19ob29rcy0+Y29tcGFyZV9sb2NrdG9rZW4pKHN0YXRlX2xpc3QtPmxvY2t0b2tlbiwgbG9jay0+bG9ja3Rva2VuKSkgewotCQkJY29udGludWU7Ci0JCSAgICB9Ci0KLQkJICAgIC8qCi0JCSAgICAqKiBXZSBoYXZlIG5vdyBtYXRjaGVkIHVwIG9uZSBvZiB0aGUgcmVzb3VyY2UncyBsb2NrdG9rZW5zCi0JCSAgICAqKiB0byBhIGxvY2t0b2tlbiBpbiBhIFN0YXRlLXRva2VuIGluIHRoZSBJZjogaGVhZGVyLgotCQkgICAgKiogTm90ZSB0aGlzIGZhY3QsIHNvIHRoYXQgd2UgY2FuIHBhc3MgdGhlIG92ZXJhbGwKLQkJICAgICoqIHJlcXVpcmVtZW50IG9mIHNlZWluZyBhdCBsZWFzdCBvbmUgb2YgdGhlIHJlc291cmNlJ3MKLQkJICAgICoqIGxvY2t0b2tlbnMuCi0JCSAgICAqLwotCQkgICAgc2Vlbl9sb2NrdG9rZW4gPSAxOwotCi0JCSAgICBpZiAoc3RhdGVfbGlzdC0+Y29uZGl0aW9uID09IERBVl9JRl9DT05EX05PVCkgewotCQkJLyoKLQkJCSoqIFRoaXMgc3RhdGUgcmVxdWlyZXMgdGhhdCB0aGUgc3BlY2lmaWVkIGxvY2t0b2tlbgotCQkJKiogaXMgTk9UIHByZXNlbnQgb24gdGhlIHJlc291cmNlLiBCdXQgd2UganVzdCBmb3VuZAotCQkJKiogaXQuIFRoZXJlIGlzIG5vIHdheSB0aGlzIHN0YXRlLWxpc3QgY2FuIG5vdwotCQkJKiogc3VjY2VlZCwgc28gZ28gdHJ5IGFub3RoZXIgb25lLgotCQkJKi8KLQkJCXJlYXNvbiA9Ci0JCQkgICAgImEgU3RhdGUtdG9rZW4gd2FzIHN1cHBsaWVkLCB3aGljaCB1c2VkIGEgIgotCQkJICAgICJcIk5vdFwiIGNvbmRpdGlvbi4gVGhlIFN0YXRlLXRva2VuIHdhcyBmb3VuZCAiCi0JCQkgICAgImluIHRoZSBsb2NrcyBvbiB0aGlzIHJlc291cmNlIjsKLQkJCWdvdG8gc3RhdGVfbGlzdF9mYWlsZWQ7Ci0JCSAgICB9Ci0KLQkJICAgIC8qIGNvbmRpdGlvbiA9PSBEQVZfSUZfQ09ORF9OT1JNQUwgKi8KLQotICAgICAgICAgICAgICAgICAgICAvKiBWYWxpZGF0ZSBhdXRoX3VzZXI6ICBJZiBhbiBhdXRoZW50aWNhdGVkIHVzZXIgY3JlYXRlZAotICAgICAgICAgICAgICAgICAgICAqKiB0aGUgbG9jaywgb25seSB0aGUgc2FtZSB1c2VyIG1heSBzdWJtaXQgdGhhdCBsb2NrdG9rZW4KLSAgICAgICAgICAgICAgICAgICAgKiogdG8gbWFuaXB1bGF0ZSBhIHJlc291cmNlLgotICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpZiAobG9jay0+YXV0aF91c2VyICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgKCFyLT5jb25uZWN0aW9uLT51c2VyIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKGxvY2stPmF1dGhfdXNlciwgci0+Y29ubmVjdGlvbi0+dXNlcikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm1zZyA9IGFwX3BzdHJjYXQocCwgIlVzZXIgXCIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5jb25uZWN0aW9uLT51c2VyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIHN1Ym1pdHRlZCBhIGxvY2t0b2tlbiBjcmVhdGVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5IHVzZXIgXCIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLT5hdXRoX3VzZXIsICJcIi4iLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXZfbmV3X2Vycm9yKHAsIEhUVFBfVU5BVVRIT1JJWkVELCAwLCBlcnJtc2cpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLQkJICAgIC8qCi0JCSAgICAqKiBXZSBqdXN0IG1hdGNoZWQgYSBzcGVjaWZpZWQgU3RhdGUtVG9rZW4gdG8gb25lIG9mIHRoZQotCQkgICAgKiogcmVzb3VyY2UncyBsb2NrdG9rZW5zLgotCQkgICAgKioKLQkJICAgICoqIEJyZWFrIG91dCBvZiB0aGUgbG9jayBzY2FuIC0tIHdlIG9ubHkgbmVlZGVkIHRvIGZpbmQKLQkJICAgICoqIG9uZSBtYXRjaCAoYWN0dWFsbHksIHRoZXJlIHNob3VsZG4ndCBiZSBhbnkgb3RoZXIKLQkJICAgICoqIG1hdGNoZXMgaW4gdGhlIGxvY2sgbGlzdCkuCi0JCSAgICAqLwotCQkgICAgbnVtX21hdGNoZWQgPSAxOwotCQkgICAgYnJlYWs7Ci0JCX0KLQotCQlpZiAobnVtX21hdGNoZWQgPT0gMAotCQkgICAgJiYgc3RhdGVfbGlzdC0+Y29uZGl0aW9uID09IERBVl9JRl9DT05EX05PUk1BTCkgewotCQkgICAgLyoKLQkJICAgICoqIFdlIGhhZCBhIE5PUk1BTCBzdGF0ZSwgbWVhbmluZyB0aGF0IHdlIHNob3VsZCBoYXZlCi0JCSAgICAqKiBmb3VuZCB0aGUgU3RhdGUtVG9rZW4gd2l0aGluIHRoZSBsb2NrcyBvbiB0aGlzCi0JCSAgICAqKiByZXNvdXJjZS4gV2UgZGlkbid0LCBzbyB0aGlzIHN0YXRlX2xpc3QgbXVzdCBmYWlsLgotCQkgICAgKi8KLQkJICAgIHJlYXNvbiA9Ci0JCQkiYSBTdGF0ZS10b2tlbiB3YXMgc3VwcGxpZWQsIGJ1dCBpdCB3YXMgbm90IGZvdW5kICIKLQkJCSJpbiB0aGUgbG9ja3Mgb24gdGhpcyByZXNvdXJjZS4iOwotCQkgICAgZ290byBzdGF0ZV9saXN0X2ZhaWxlZDsKLQkJfQotCi0JCWJyZWFrOwotCi0JICAgIH0gLyogc3dpdGNoICovCi0JfSAvKiBmb3JlYWNoICggc3RhdGVfbGlzdCApICovCi0KLQkvKgotCSoqIFdlJ3ZlIGNoZWNrZWQgZXZlcnkgc3RhdGUgaW4gdGhpcyBzdGF0ZV9saXN0IGFuZCBub25lIG9mIHRoZW0KLQkqKiBoYXZlIGZhaWxlZC4gU2luY2UgYWxsIG9mIHRoZW0gc3VjY2VlZGVkLCB0aGVuIHdlIGhhdmUgYSBtYXRjaGluZwotCSoqIHN0YXRlIGxpc3QgYW5kIHdlIG1heSBiZSBkb25lLgotCSoqCi0JKiogVGhlIG5leHQgcmVxdWlyZW1lbnQgaXMgdGhhdCB3ZSBoYXZlIHNlZW4gb25lIG9mIHRoZSByZXNvdXJjZSdzCi0JKiogbG9ja3Rva2VucyAoaWYgYW55KS4gSWYgd2UgaGF2ZSwgdGhlbiB3ZSBjYW4ganVzdCBleGl0LiBJZiB3ZQotCSoqIGhhdmVuJ3QsIHRoZW4gd2UgbmVlZCB0byBrZWVwIGxvb2tpbmcuCi0JKi8KLQlpZiAoc2Vlbl9sb2NrdG9rZW4pIHsKLQkgICAgLyogd29vIGhvbyEgKi8KLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyoKLQkqKiBIYXZlbid0IHNlZW4gb25lLiBMZXQncyBicmVhayBvdXQgb2YgdGhlIHNlYXJjaCBhbmQganVzdCBsb29rCi0JKiogZm9yIGEgbWF0Y2hpbmcgbG9ja3Rva2VuLgotCSovCi0JYnJlYWs7Ci0KLQkvKgotCSoqIFRoaXMgbGFiZWwgaXMgdXNlZCB3aGVuIHdlIGRldGVjdCB0aGF0IGEgc3RhdGVfbGlzdCBpcyBub3QKLQkqKiBnb2luZyB0byBtYXRjaCB0aGlzIHJlc291cmNlLiBXZSBidXN0IG91dCBhbmQgdHJ5IHRoZSBuZXh0Ci0JKiogc3RhdGVfbGlzdC4KLQkqLwotICAgICAgc3RhdGVfbGlzdF9mYWlsZWQ6Ci0JOwotCi0gICAgfSAvKiBmb3JlYWNoICggaWZoZHJfc2NhbiApICovCi0KLSAgICAvKgotICAgICoqIFRoZSBhYm92ZSBsb29wIGV4aXRzIGZvciBvbmUgb2YgdHdvIHJlYXNvbnM6Ci0gICAgKiogICAxKSBhIHN0YXRlX2xpc3QgbWF0Y2hlZCBhbmQgc2Vlbl9sb2NrdG9rZW4gaXMgZmFsc2UuCi0gICAgKiogICAyKSBhbGwgaWZfaGVhZGVyIHN0cnVjdHVyZXMgd2VyZSBzY2FubmVkLCB3aXRob3V0ICgxKSBvY2N1cnJpbmcKLSAgICAqLwotCi0gICAgaWYgKGlmaGRyX3NjYW4gPT0gTlVMTCkgewotCS8qCi0JKiogV2UgZmluaXNoZWQgdGhlIGxvb3Agd2l0aG91dCBmaW5kaW5nIGFueSBtYXRjaGluZyBzdGF0ZSBsaXN0cy4KLQkqLwotCi0JLyoKLQkqKiBJZiBub25lIG9mIHRoZSBzdGF0ZV9saXN0cyBhcHBseSB0byB0aGlzIHJlc291cmNlLCB0aGVuIHdlCi0JKiogbWF5IGhhdmUgc3VjY2VlZGVkLiBOb3RlIHRoYXQgdGhpcyBzY2VuYXJpbyBpbXBsaWVzIGEKLQkqKiB0YWdnZWQtbGlzdCB3aXRoIG5vIG1hdGNoaW5nIHN0YXRlX2xpc3RzLiBJZiB0aGUgSWY6IGhlYWRlcgotCSoqIHdhcyBhIG5vLXRhZy1saXN0LCB0aGVuIGl0IHdvdWxkIGhhdmUgYXBwbGllZCB0byB0aGlzIHJlc291cmNlLgotCSoqCi0JKiogUzkuNC4yIHN0YXRlcyB0aGF0IHdoZW4gbm8gc3RhdGVfbGlzdHMgYXBwbHksIHRoZW4gdGhlIGhlYWRlcgotCSoqIHNob3VsZCBiZSBpZ25vcmVkLgotCSoqCi0JKiogSWYgd2Ugc2F3IG9uZSBvZiB0aGUgcmVzb3VyY2UncyBsb2NrdG9rZW5zLCB0aGVuIHdlJ3JlIGRvbmUuCi0JKiogSWYgd2UgZGlkIG5vdCBzZWUgYSBsb2NrdG9rZW4sIHRoZW4gd2UgZmFpbC4KLQkqLwotCWlmIChudW1fdGhhdF9hcHBseSA9PSAwKSB7Ci0JICAgIGlmIChzZWVuX2xvY2t0b2tlbikKLQkJcmV0dXJuIE5VTEw7Ci0KLQkgICAgLyoKLQkgICAgKiogV2UgbWF5IGhhdmUgYWJvcnRlZCB0aGUgc2NhbiBiZWZvcmUgc2VlaW5nIHRoZSBsb2NrdG9rZW4uCi0JICAgICoqIFJlc2NhbiB0aGUgSWY6IGhlYWRlciB0byBzZWUgaWYgd2UgY2FuIGZpbmQgdGhlIGxvY2t0b2tlbgotCSAgICAqKiBzb21ld2hlcmUuCi0JICAgICovCi0JICAgIGlmIChkYXZfZmluZF9zdWJtaXR0ZWRfbG9ja3Rva2VuKGlmX2hlYWRlciwgbG9ja19saXN0LAotCQkJCQkgICAgIGxvY2tzX2hvb2tzKSkgewotCQkvKgotCQkqKiBXZSBmb3VuZCBhIG1hdGNoISBXZSdyZSBzZXQuLi4gbm9uZSBvZiB0aGUgSWY6IGhlYWRlcgotCQkqKiBhc3NlcnRpb25zIGFwcGx5IChpbXBsaWNpdCBzdWNjZXNzKSwgYW5kIHRoZSBJZjogaGVhZGVyCi0JCSoqIHNwZWNpZmllZCB0aGUgbG9ja3Rva2VuIHNvbWV3aGVyZS4gV2UncmUgZG9uZS4KLQkJKi8KLQkJcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQotCSAgICByZXR1cm4gZGF2X25ld19lcnJvcihwLCBIVFRQX0xPQ0tFRCwgMCAvKiBlcnJvcl9pZCAqLywKLQkJCQkgIlRoaXMgcmVzb3VyY2UgaXMgbG9ja2VkIGFuZCB0aGUgXCJJZjpcIiAiCi0JCQkJICJoZWFkZXIgZGlkIG5vdCBzcGVjaWZ5IG9uZSBvZiB0aGUgIgotCQkJCSAibG9ja3Rva2VucyBmb3IgdGhpcyByZXNvdXJjZSdzIGxvY2socykuIik7Ci0JfQotCS8qIGVsc2U6IG9uZSBvciBtb3JlIHN0YXRlX2xpc3RzIHdlcmUgYXBwbGljYWJsZSwgYnV0IGZhaWxlZC4gKi8KLQotCS8qCi0JKiogSWYgdGhlIGR1bW15X2hlYWRlciBkaWQgbm90IG1hdGNoLCB0aGVuIHRoZXkgc3BlY2lmaWVkIGFuCi0JKiogaW5jb3JyZWN0IHRva2VuIGluIHRoZSBMb2NrLVRva2VuIGhlYWRlci4gRm9yZ2V0IHdoZXRoZXIgdGhlCi0JKiogSWY6IHN0YXRlbWVudCBtYXRjaGVkIG9yIG5vdC4uLiB3ZSdsbCB0ZWxsIHRoZW0gYWJvdXQgdGhlCi0JKiogYmFkIExvY2stVG9rZW4gZmlyc3QuIFRoYXQgaXMgY29uc2lkZXJlZCBhIDQwMCAoQmFkIFJlcXVlc3QpLgotCSovCi0JaWYgKGlmX2hlYWRlci0+ZHVtbXlfaGVhZGVyKSB7Ci0JICAgIHJldHVybiBkYXZfbmV3X2Vycm9yKHAsIEhUVFBfQkFEX1JFUVVFU1QsIDAsCi0JCQkJICJUaGUgbG9ja3Rva2VuIHNwZWNpZmllZCBpbiB0aGUgIgotCQkJCSAiXCJMb2NrLVRva2VuOlwiIGhlYWRlciBkaWQgbm90IHNwZWNpZnkgb25lICIKLQkJCQkgIm9mIHRoaXMgcmVzb3VyY2UncyBsb2NrdG9rZW4ocykuIik7Ci0JfQotCi0JaWYgKHJlYXNvbiA9PSBOVUxMKSB7Ci0JICAgIHJldHVybiBkYXZfbmV3X2Vycm9yKHAsIEhUVFBfUFJFQ09ORElUSU9OX0ZBSUxFRCwgMCwKLQkJCQkgIlRoZSBwcmVjb25kaXRpb25zIHNwZWNpZmllZCBieSB0aGUgXCJJZjpcIiAiCi0JCQkJICJoZWFkZXIgZGlkIG5vdCBtYXRjaCB0aGlzIHJlc291cmNlLiIpOwotCX0KLQotCXJldHVybiBkYXZfbmV3X2Vycm9yKHAsIEhUVFBfUFJFQ09ORElUSU9OX0ZBSUxFRCwgMCwKLQkJCSAgICAgYXBfcHNwcmludGYocCwKLQkJCQkJICJUaGUgcHJlY29uZGl0aW9uKHMpIHNwZWNpZmllZCBieSAiCi0JCQkJCSAidGhlIFwiSWY6XCIgaGVhZGVyIGRpZCBub3QgbWF0Y2ggIgotCQkJCQkgInRoaXMgcmVzb3VyY2UuIEF0IGxlYXN0IG9uZSAiCi0JCQkJCSAiZmFpbHVyZSBpcyBiZWNhdXNlOiAlcyIsIHJlYXNvbikpOwotICAgIH0KLQotICAgIC8qIGFzc2VydCBzZWVuX2xvY2t0b2tlbiA9PSAwICovCi0KLSAgICAvKgotICAgICoqIGlmaGRyX3NjYW4gIT0gTlVMTCBpbXBsaWVzIHdlIGZvdW5kIGEgbWF0Y2hpbmcgc3RhdGVfbGlzdC4KLSAgICAqKgotICAgICoqIFNpbmNlIHdlJ3JlIHN0aWxsIGhlcmUsIGl0IGFsc28gbWVhbnMgdGhhdCB3ZSBoYXZlIG5vdCB5ZXQgZm91bmQKLSAgICAqKiBvbmUgdGhlIHJlc291cmNlJ3MgbG9ja3Rva2VucyBpbiB0aGUgSWY6IGhlYWRlci4KLSAgICAqKgotICAgICoqIFNjYW4gYWxsIHRoZSBpZl9oZWFkZXJzIGFuZCBzdGF0ZXMgbG9va2luZyBmb3Igb25lIG9mIHRoaXMKLSAgICAqKiByZXNvdXJjZSdzIGxvY2t0b2tlbnMuIE5vdGUgdGhhdCB3ZSBuZWVkIHRvIGdvIGJhY2sgYW5kIHNjYW4gdGhlbQotICAgICoqIGFsbCAtLSB3ZSBtYXkgaGF2ZSBhYm9ydGVkIGEgc2NhbiB3aXRoIGEgZmFpbHVyZSBiZWZvcmUgd2Ugc2F3IGEKLSAgICAqKiBtYXRjaGluZyB0b2tlbi4KLSAgICAqKgotICAgICoqIE5vdGUgdGhhdCBzZWVuX2xvY2t0b2tlbiA9PSAwIGltcGxpZXMgbG9ja19saXN0ICE9IE5VTEwgd2hpY2ggaW1wbGllcwotICAgICoqIGxvY2tzX2hvb2tzICE9IE5VTEwuCi0gICAgKi8KLSAgICBpZiAoZGF2X2ZpbmRfc3VibWl0dGVkX2xvY2t0b2tlbihpZl9oZWFkZXIsIGxvY2tfbGlzdCwgbG9ja3NfaG9va3MpKSB7Ci0JLyoKLQkqKiBXZSBmb3VuZCBhIG1hdGNoISBXZSdyZSBzZXQuLi4gd2UgaGF2ZSBhIG1hdGNoaW5nIHN0YXRlIGxpc3QsCi0JKiogYW5kIHRoZSBJZjogaGVhZGVyIHNwZWNpZmllZCB0aGUgbG9ja3Rva2VuIHNvbWV3aGVyZS4gV2UncmUgZG9uZS4KLQkqLwotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8qCi0gICAgKiogV2UgaGFkIGEgbWF0Y2hpbmcgc3RhdGUgbGlzdCwgYnV0IHRoZSB1c2VyIGFnZW50IGRpZCBub3Qgc3BlY2lmeSBvbmUKLSAgICAqKiBvZiB0aGlzIHJlc291cmNlJ3MgbG9ja3Rva2Vucy4gVGVsbCB0aGVtIHNvLgotICAgICoqCi0gICAgKiogTm90ZSB0aGF0IHdlIG5lZWQgdG8gc3BlY2lhbC1jYXNlIHRoZSBtZXNzYWdlIG9uIHdoZXRoZXIgYSAiZHVtbXkiCi0gICAgKiogaGVhZGVyIGV4aXN0cy4gSWYgaXQgZXhpc3RzLCB5ZXQgd2UgZGlkbid0IHNlZSBhIG5lZWRlZCBsb2NrdG9rZW4sCi0gICAgKiogdGhlbiB0aGF0IGltcGxpZXMgdGhlIGR1bW15IGhlYWRlciAoTG9jay1Ub2tlbiBoZWFkZXIpIGRpZCBOT1QKLSAgICAqKiBzcGVjaWZ5IG9uZSBvZiB0aGlzIHJlc291cmNlJ3MgbG9ja3Rva2Vucy4gKHRoaXMgaW1wbGllcyBzb21ldGhpbmcKLSAgICAqKiBpbiB0aGUgcmVhbCBJZjogaGVhZGVyIG1hdGNoZWQpCi0gICAgKioKLSAgICAqKiBXZSB3YW50IHRvIG5vdGUgdGhlIDQwMCAoQmFkIFJlcXVlc3QpIGluIGZhdm9yIG9mIGEgNDIzIChMb2NrZWQpLgotICAgICovCi0gICAgaWYgKGlmX2hlYWRlci0+ZHVtbXlfaGVhZGVyKSB7Ci0JcmV0dXJuIGRhdl9uZXdfZXJyb3IocCwgSFRUUF9CQURfUkVRVUVTVCwgMCwKLQkJCSAgICAgIlRoZSBsb2NrdG9rZW4gc3BlY2lmaWVkIGluIHRoZSAiCi0JCQkgICAgICJcIkxvY2stVG9rZW46XCIgaGVhZGVyIGRpZCBub3Qgc3BlY2lmeSBvbmUgIgotCQkJICAgICAib2YgdGhpcyByZXNvdXJjZSdzIGxvY2t0b2tlbihzKS4iKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZGF2X25ld19lcnJvcihwLCBIVFRQX0xPQ0tFRCwgMSAvKiBlcnJvcl9pZCAqLywKLQkJCSAiVGhpcyByZXNvdXJjZSBpcyBsb2NrZWQgYW5kIHRoZSBcIklmOlwiIGhlYWRlciAiCi0JCQkgImRpZCBub3Qgc3BlY2lmeSBvbmUgb2YgdGhlICIKLQkJCSAibG9ja3Rva2VucyBmb3IgdGhpcyByZXNvdXJjZSdzIGxvY2socykuIik7Ci19Ci0KLS8qIGRhdl92YWxpZGF0ZV93YWxrZXI6ICBXYWxrZXIgY2FsbGJhY2sgZnVuY3Rpb24gdG8gdmFsaWRhdGUgcmVzb3VyY2Ugc3RhdGUgKi8KLXN0YXRpYyBkYXZfZXJyb3IgKiBkYXZfdmFsaWRhdGVfd2Fsa2VyKGRhdl93YWxrZXJfY3R4ICpjdHgsIGludCBjYWxsdHlwZSkKLXsKLSAgICBkYXZfZXJyb3IgKmVycjsKLQotICAgIGlmICgoZXJyID0gZGF2X3ZhbGlkYXRlX3Jlc291cmNlX3N0YXRlKGN0eC0+cG9vbCwgY3R4LT5yZXNvdXJjZSwKLQkJCQkJICAgY3R4LT5sb2NrZGIsCi0JCQkJCSAgIGN0eC0+aWZfaGVhZGVyLCBjdHgtPmZsYWdzLAotCQkJCQkgICAmY3R4LT53b3JrX2J1ZiwgY3R4LT5yKSkgPT0gTlVMTCkgewotCS8qIFRoZXJlIHdhcyBubyBlcnJvciwgc28ganVzdCBidWcgb3V0LiAqLwotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8qCi0gICAgKiogSWYgd2UgaGF2ZSBhIHNlcmlvdXMgc2VydmVyIGVycm9yLCBvciBpZiB0aGUgcmVxdWVzdCBpdHNlbGYgZmFpbGVkLAotICAgICoqIHRoZW4ganVzdCByZXR1cm4gZXJyb3IgKG5vdCBhIG11bHRpc3RhdHVzKS4KLSAgICAqLwotICAgIGlmIChhcF9pc19IVFRQX1NFUlZFUl9FUlJPUihlcnItPnN0YXR1cykKLSAgICAgICAgfHwgKCpjdHgtPnJlc291cmNlLT5ob29rcy0+aXNfc2FtZV9yZXNvdXJjZSkoY3R4LT5yZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5yb290KSkgewotCS8qICMjIyBtYXliZSBwdXNoIGEgaGlnaGVyLWxldmVsIGRlc2NyaXB0aW9uPyAqLwotCXJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogYXNzb2NpYXRlIHRoZSBlcnJvciB3aXRoIHRoZSBjdXJyZW50IFVSSSAqLwotICAgIGRhdl9hZGRfcmVzcG9uc2UoY3R4LCBjdHgtPnVyaS5idWYsIGVyci0+c3RhdHVzLCBOVUxMKTsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi0vKgotKiogZGF2X3ZhbGlkYXRlX3JlcXVlc3Q6ICBWYWxpZGF0ZSBpZi1oZWFkZXJzIChhbmQgY2hlY2sgZm9yIGxvY2tzKSBvbjoKLSoqICAgICgxKSByLT5maWxlbmFtZSBAIGRlcHRoOwotKiogICAgKDIpIFBhcmVudCBvZiByLT5maWxlbmFtZSBpZiBjaGVja19wYXJlbnQgPT0gMQotKioKLSoqIFRoZSBjaGVjayBvZiBwYXJlbnQgc2hvdWxkIGJlIGRvbmUgd2hlbiBpdCBpcyBuZWNlc3NhcnkgdG8gdmVyaWZ5IHRoYXQKLSoqIHRoZSBwYXJlbnQgY29sbGVjdGlvbiB3aWxsIGFjY2VwdCBhIG5ldyBtZW1iZXIgKGllIGN1cnJlbnQgcmVzb3VyY2UKLSoqIHN0YXRlIGlzIG51bGwpLgotKioKLSoqIFJldHVybiBPSyBvbiBzdWNjZXNzZnVsIHZhbGlkYXRpb24uCi0qKiBPbiBlcnJvciwgcmV0dXJuIGFwcHJvcHJpYXRlIEhUVFBfKiBjb2RlLCBhbmQgbG9nIGVycm9yLiBJZiBhIG11bHRpLXN0YXQKLSoqIGVycm9yIGlzIG5lY2Vzc2FyeSwgcmVzcG9uc2Ugd2lsbCBwb2ludCB0byBpdCwgZWxzZSBOVUxMLgotKi8KLWRhdl9lcnJvciAqIGRhdl92YWxpZGF0ZV9yZXF1ZXN0KHJlcXVlc3RfcmVjICpyLCBkYXZfcmVzb3VyY2UgKnJlc291cmNlLAotCQkJCSBpbnQgZGVwdGgsIGRhdl9sb2NrdG9rZW4gKmxvY2t0b2tlbiwKLQkJCQkgZGF2X3Jlc3BvbnNlICoqcmVzcG9uc2UsIGludCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdl9sb2NrZGIgKmxvY2tkYikKLXsKLSAgICBkYXZfZXJyb3IgKmVycjsKLSAgICBpbnQgcmVzdWx0OwotICAgIGRhdl9pZl9oZWFkZXIgKmlmX2hlYWRlcjsKLSAgICBpbnQgbG9ja19kYl9vcGVuZWRfbG9jYWxseSA9IDA7Ci0gICAgY29uc3QgZGF2X2hvb2tzX2xvY2tzICpsb2Nrc19ob29rcyA9IERBVl9HRVRfSE9PS1NfTE9DS1Mocik7Ci0gICAgY29uc3QgZGF2X2hvb2tzX3JlcG9zaXRvcnkgKnJlcG9zX2hvb2tzID0gcmVzb3VyY2UtPmhvb2tzOwotICAgIGRhdl9idWZmZXIgd29ya19idWYgPSB7IDAgfTsKLSAgICBkYXZfcmVzcG9uc2UgKm5ld19yZXNwb25zZTsKLQotI2lmIERBVl9ERUJVRwotICAgIGlmIChkZXB0aCAmJiByZXNwb25zZSA9PSBOVUxMKSB7Ci0JLyoKLQkqKiAjIyMgYmxlY2suIHdlIGNhbid0IHJldHVybiBlcnJvcnMgZm9yIG90aGVyIFVSSXMgdW5sZXNzIHdlIGhhdmUKLSAgICAgICAgKiogIyMjIGEgInJlc3BvbnNlIiBwdHIuCi0JKi8KLQlyZXR1cm4gZGF2X25ld19lcnJvcihyLT5wb29sLCBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgMCwKLQkJCSAgICAgIkRFU0lHTiBFUlJPUjogZGF2X3ZhbGlkYXRlX3JlcXVlc3QgY2FsbGVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggZGVwdGg+MCwgYnV0IG5vIHJlc3BvbnNlIHB0ci4iKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGlmIChyZXNwb25zZSAhPSBOVUxMKQotCSpyZXNwb25zZSA9IE5VTEw7Ci0KLSAgICAvKiBEbyB0aGUgc3RhbmRhcmQgY2hlY2tzIGZvciBjb25kaXRpb25hbCByZXF1ZXN0cyB1c2luZyAKLSAgICAgKiBJZi0uLi1TaW5jZSwgSWYtTWF0Y2ggZXRjICovCi0gICAgaWYgKChyZXN1bHQgPSBhcF9tZWV0c19jb25kaXRpb25zKHIpKSAhPSBPSykgewotCS8qICMjIyBmaXggdGhpcyB1cC4uLiBob3c/ICovCi0JcmV0dXJuIGRhdl9uZXdfZXJyb3Ioci0+cG9vbCwgcmVzdWx0LCAwLCBOVUxMKTsKLSAgICB9Ci0KLSAgICAvKiBhbHdheXMgcGFyc2UgKGFuZCBsYXRlciBwcm9jZXNzKSB0aGUgSWY6IGhlYWRlciAqLwotICAgIGlmICgoZXJyID0gZGF2X3Byb2Nlc3NfaWZfaGVhZGVyKHIsICZpZl9oZWFkZXIpKSAhPSBOVUxMKSB7Ci0JLyogIyMjIG1heWJlIGFkZCBoaWdoZXItbGV2ZWwgZGVzY3JpcHRpb24gKi8KLQlyZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIElmIGEgbG9ja3Rva2VuIHdhcyBzcGVjaWZpZWQsIGNyZWF0ZSBhIGR1bW15IGlmX2hlYWRlciB3aXRoIHdoaWNoCi0gICAgICogdG8gdmFsaWRhdGUgcmVzb3VyY2VzLiAgSW4gdGhlIGludGVyaW0sIGZpZ3VyZSBvdXQgd2h5IERBViB1c2VzCi0gICAgICogbG9ja3Rva2VucyBpbiBhbiBpZi1oZWFkZXIgd2l0aG91dCBhIExvY2stVG9rZW4gaGVhZGVyIHRvIHJlZnJlc2gKLSAgICAgKiBsb2NrcywgYnV0IGEgTG9jay1Ub2tlbiBoZWFkZXIgd2l0aG91dCBhbiBpZi1oZWFkZXIgdG8gcmVtb3ZlIHRoZW0uCi0gICAgICovCi0gICAgaWYgKGxvY2t0b2tlbiAhPSBOVUxMKSB7Ci0JZGF2X2lmX2hlYWRlciAqaWZoZHJfbmV3OwotCi0JaWZoZHJfbmV3ID0gYXBfcGNhbGxvYyhyLT5wb29sLCBzaXplb2YoKmlmaGRyX25ldykpOwotCWlmaGRyX25ldy0+dXJpID0gcmVzb3VyY2UtPnVyaTsKLQlpZmhkcl9uZXctPnVyaV9sZW4gPSBzdHJsZW4ocmVzb3VyY2UtPnVyaSk7Ci0JaWZoZHJfbmV3LT5kdW1teV9oZWFkZXIgPSAxOwotCi0JaWZoZHJfbmV3LT5zdGF0ZSA9IGFwX3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKCppZmhkcl9uZXctPnN0YXRlKSk7Ci0JaWZoZHJfbmV3LT5zdGF0ZS0+dHlwZSA9IGRhdl9pZl9vcGFxdWVsb2NrOwotCWlmaGRyX25ldy0+c3RhdGUtPmNvbmRpdGlvbiA9IERBVl9JRl9DT05EX05PUk1BTDsKLQlpZmhkcl9uZXctPnN0YXRlLT5sb2NrdG9rZW4gPSBsb2NrdG9rZW47Ci0KLQlpZmhkcl9uZXctPm5leHQgPSBpZl9oZWFkZXI7Ci0JaWZfaGVhZGVyID0gaWZoZHJfbmV3OwotICAgIH0KLQotICAgIC8qCi0gICAgKiogSWYgbmVjZXNzYXJ5LCBvcGVuIHRoZSBsb2NrIGRhdGFiYXNlIChyZWFkLW9ubHksIGxhemlseSk7Ci0gICAgKiogdGhlIHZhbGlkYXRpb24gcHJvY2VzcyBtYXkgbmVlZCB0byByZXRyaWV2ZSBvciB1cGRhdGUgbG9jayBpbmZvLgotICAgICoqIE90aGVyd2lzZSwgYXNzdW1lIHByb3ZpZGVkIGxvY2tkYiBpcyB2YWxpZCBhbmQgb3BlbmVkIHJ3LgotICAgICovCi0gICAgaWYgKGxvY2tkYiA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChsb2Nrc19ob29rcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoKGVyciA9ICgqbG9ja3NfaG9va3MtPm9wZW5fbG9ja2RiKShyLCAwLCAwLCAmbG9ja2RiKSkgIT0gTlVMTCkgewotCSAgICAgICAgLyogIyMjIG1heWJlIGluc2VydCBoaWdoZXItbGV2ZWwgY29tbWVudCAqLwotCSAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvY2tfZGJfb3BlbmVkX2xvY2FsbHkgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGRhdl9uZXdfZXJyb3Ioci0+cG9vbCwgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsIDAsCi0JCQkJICJSZXNvdXJjZSB2YWxpZGF0aW9uIGZhaWxlZCBiZWNhdXNlIG5vICIKLQkJCQkgImxvY2sgaG9va3Mgd2VyZSBmb3VuZC4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qICgxKSBWYWxpZGF0ZSB0aGUgc3BlY2lmaWVkIHJlc291cmNlLCBhdCB0aGUgc3BlY2lmaWVkIGRlcHRoICovCi0gICAgaWYgKHJlc291cmNlLT5leGlzdHMgJiYgZGVwdGggPiAwKSB7Ci0JZGF2X3dhbGtlcl9jdHggY3R4ID0geyAwIH07Ci0KLQljdHgud2Fsa190eXBlID0gREFWX1dBTEtUWVBFX0FMTDsKLQljdHgucG9zdGZpeCA9IDA7Ci0JY3R4LmZ1bmMgPSBkYXZfdmFsaWRhdGVfd2Fsa2VyOwotCWN0eC5wb29sID0gci0+cG9vbDsKLQljdHguaWZfaGVhZGVyID0gaWZfaGVhZGVyOwotCWN0eC5yID0gcjsKLSAgICAgICAgY3R4LmZsYWdzID0gZmxhZ3M7Ci0gICAgICAgIGN0eC5yZXNvdXJjZSA9IHJlc291cmNlOwotCi0JaWYgKGxvY2tkYiAhPSBOVUxMKSB7Ci0JICAgIGN0eC5sb2NrZGIgPSBsb2NrZGI7Ci0JICAgIGN0eC53YWxrX3R5cGUgfD0gREFWX1dBTEtUWVBFX0xPQ0tOVUxMOwotCX0KLQotCWRhdl9idWZmZXJfaW5pdChyLT5wb29sLCAmY3R4LnVyaSwgcmVzb3VyY2UtPnVyaSk7Ci0KLQllcnIgPSAoKnJlcG9zX2hvb2tzLT53YWxrKSgmY3R4LCBEQVZfSU5GSU5JVFkpOwotCWlmIChlcnIgPT0gTlVMTCkgewotICAgICAgICAgICAgKnJlc3BvbnNlID0gY3R4LnJlc3BvbnNlOwotCX0KLSAgICAgICAgLyogZWxzZTogaW1wbGllcyBhIDV4eCBzdGF0dXMgY29kZSBvY2N1cnJlZC4gKi8KLSAgICB9Ci0gICAgZWxzZSB7Ci0JZXJyID0gZGF2X3ZhbGlkYXRlX3Jlc291cmNlX3N0YXRlKHItPnBvb2wsIHJlc291cmNlLCBsb2NrZGIsCi0JCQkJCSAgaWZfaGVhZGVyLCBmbGFncywgJndvcmtfYnVmLCByKTsKLSAgICB9Ci0KLSAgICAvKiAoMikgVmFsaWRhdGUgdGhlIHBhcmVudCByZXNvdXJjZSBpZiByZXF1ZXN0ZWQgKi8KLSAgICBpZiAoZXJyID09IE5VTEwgJiYgKGZsYWdzICYgREFWX1ZBTElEQVRFX1BBUkVOVCkpIHsKLSAgICAgICAgZGF2X3Jlc291cmNlICpwYXJlbnRfcmVzb3VyY2UgPSAoKnJlcG9zX2hvb2tzLT5nZXRfcGFyZW50X3Jlc291cmNlKShyZXNvdXJjZSk7Ci0KLQlpZiAocGFyZW50X3Jlc291cmNlID09IE5VTEwpIHsKLQkgICAgZXJyID0gZGF2X25ld19lcnJvcihyLT5wb29sLCBIVFRQX0ZPUkJJRERFTiwgMCwKLQkJCQkiQ2Fubm90IGFjY2VzcyBwYXJlbnQgb2YgcmVwb3NpdG9yeSByb290LiIpOwotCX0KLQllbHNlIHsKLQkgICAgZXJyID0gZGF2X3ZhbGlkYXRlX3Jlc291cmNlX3N0YXRlKHItPnBvb2wsIHBhcmVudF9yZXNvdXJjZSwgbG9ja2RiLAotCQkJCQkgICAgICBpZl9oZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfCBEQVZfVkFMSURBVEVfSVNfUEFSRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3b3JrX2J1Ziwgcik7Ci0JICAgIAotCSAgICAvKgotCSAgICAqKiBUaGlzIGVycm9yIG9jY3VycmVkIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UuIFRoaXMgaW1wbGllcyB0aGF0Ci0JICAgICoqIHdlIGhhdmUgdG8gY3JlYXRlIGEgbXVsdGlzdGF0dXMgcmVzcG9uc2UgKHRvIHJlcG9ydCB0aGUgZXJyb3IKLQkgICAgKiogYWdhaW5zdCBhIFVSSSBvdGhlciB0aGFuIHRoZSBSZXF1ZXN0LVVSSSkuICJDb252ZXJ0IiB0aGlzIGVycm9yCi0JICAgICoqIGludG8gYSBtdWx0aXN0YXR1cyByZXNwb25zZS4KLQkgICAgKi8KLQkgICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0JCW5ld19yZXNwb25zZSA9IGFwX3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKCpuZXdfcmVzcG9uc2UpKTsKLQkJCi0JCW5ld19yZXNwb25zZS0+aHJlZiA9IHBhcmVudF9yZXNvdXJjZS0+dXJpOwotCQluZXdfcmVzcG9uc2UtPnN0YXR1cyA9IGVyci0+c3RhdHVzOwotCQluZXdfcmVzcG9uc2UtPmRlc2MgPQotCQkgICAgIkEgdmFsaWRhdGlvbiBlcnJvciBoYXMgb2NjdXJyZWQgb24gdGhlIHBhcmVudCByZXNvdXJjZSwgIgotCQkgICAgInByZXZlbnRpbmcgdGhlIG9wZXJhdGlvbiBvbiB0aGUgcmVzb3VyY2Ugc3BlY2lmaWVkIGJ5ICIKLQkJICAgICJ0aGUgUmVxdWVzdC1VUkkuIjsKLSAgICAgICAgICAgICAgICBpZiAoZXJyLT5kZXNjICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3X3Jlc3BvbnNlLT5kZXNjID0gYXBfcHN0cmNhdChyLT5wb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19yZXNwb25zZS0+ZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFRoZSBlcnJvciB3YXM6ICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLT5kZXNjLCBOVUxMKTsKLSAgICAgICAgICAgICAgICB9Ci0JCQotCQkvKiBhc3NlcnQ6IERBVl9WQUxJREFURV9QQVJFTlQgaW1wbGllcyByZXNwb25zZSAhPSBOVUxMICovCi0JCW5ld19yZXNwb25zZS0+bmV4dCA9ICpyZXNwb25zZTsKLQkJKnJlc3BvbnNlID0gbmV3X3Jlc3BvbnNlOwotCQkKLQkJZXJyID0gTlVMTDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICBpZiAobG9ja19kYl9vcGVuZWRfbG9jYWxseSkKLSAgICAgICAgKCpsb2Nrc19ob29rcy0+Y2xvc2VfbG9ja2RiKShsb2NrZGIpOwotCi0gICAgLyoKLSAgICAqKiBJZiB3ZSBkb24ndCBoYXZlIGEgKHNlcmlvdXMpIGVycm9yLCBhbmQgd2UgaGF2ZSBtdWx0aXN0YXR1cyByZXNwb25zZXMsCi0gICAgKiogdGhlbiB3ZSBuZWVkIHRvIGNvbnN0cnVjdCBhbiAiZXJyb3IiLiBUaGlzIGVycm9yIHdpbGwgYmUgdGhlIG92ZXJhbGwKLSAgICAqKiBzdGF0dXMgcmV0dXJuZWQsIGFuZCB0aGUgbXVsdGlzdGF0dXMgcmVzcG9uc2VzIHdpbGwgZ28gaW50byBpdHMgYm9keS4KLSAgICAqKgotICAgICoqIEZvciBjZXJ0YWluIG1ldGhvZHMsIHRoZSBvdmVyYWxsIGVycm9yIHdpbGwgYmUgYSA0MjQuIFRoZSBkZWZhdWx0IGlzCi0gICAgKiogdG8gY29uc3RydWN0IGEgc3RhbmRhcmQgMjA3IHJlc3BvbnNlLgotICAgICovCi0gICAgaWYgKGVyciA9PSBOVUxMICYmIHJlc3BvbnNlICE9IE5VTEwgJiYgKnJlc3BvbnNlICE9IE5VTEwpIHsKLSAgICAgICAgZGF2X3RleHQgKnByb3BzdGF0ID0gTlVMTDsKLQotICAgICAgICBpZiAoKGZsYWdzICYgREFWX1ZBTElEQVRFX1VTRV80MjQpICE9IDApIHsKLSAgICAgICAgICAgIC8qIG1hbnVmYWN0dXJlIGEgNDI0IGVycm9yIHRvIGhvbGQgdGhlIG11bHRpc3RhdHVzIHJlc3BvbnNlKHMpICovCi0gICAgICAgICAgICByZXR1cm4gZGF2X25ld19lcnJvcihyLT5wb29sLCBIVFRQX0ZBSUxFRF9ERVBFTkRFTkNZLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFuIGVycm9yIG9jY3VycmVkIG9uIGFub3RoZXIgcmVzb3VyY2UsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmV2ZW50aW5nIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uIG9uICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHJlc291cmNlLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgKiogV2hhdGV2ZXIgY2F1c2VkIHRoZSBlcnJvciwgdGhlIFJlcXVlc3QtVVJJIHNob3VsZCBoYXZlIGEgNDI0Ci0gICAgICAgICoqIGFzc29jaWF0ZWQgd2l0aCBpdCBzaW5jZSB3ZSBjYW5ub3QgY29tcGxldGUgdGhlIG1ldGhvZC4KLSAgICAgICAgKioKLSAgICAgICAgKiogRm9yIGEgTE9DSyBvcGVyYXRpb24sIGluc2VydCBhbiBlbXB0eSBEQVY6bG9ja2Rpc2NvdmVyeSBwcm9wZXJ0eS4KLSAgICAgICAgKiogRm9yIG90aGVyIG1ldGhvZHMsIHJldHVybiBhIHNpbXBsZSA0MjQuCi0gICAgICAgICovCi0gICAgICAgIGlmICgoZmxhZ3MgJiBEQVZfVkFMSURBVEVfQUREX0xEKSAhPSAwKSB7Ci0gICAgICAgICAgICBwcm9wc3RhdCA9IGFwX3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKCpwcm9wc3RhdCkpOwotICAgICAgICAgICAgcHJvcHN0YXQtPnRleHQgPQotICAgICAgICAgICAgICAgICI8RDpwcm9wc3RhdD4iIERFQlVHX0NSCi0gICAgICAgICAgICAgICAgIjxEOnByb3A+PEQ6bG9ja2Rpc2NvdmVyeS8+PC9EOnByb3A+IiBERUJVR19DUgotICAgICAgICAgICAgICAgICI8RDpzdGF0dXM+SFRUUC8xLjEgNDI0IEZhaWxlZCBEZXBlbmRlbmN5PC9EOnN0YXR1cz4iIERFQlVHX0NSCi0gICAgICAgICAgICAgICAgIjwvRDpwcm9wc3RhdD4iIERFQlVHX0NSOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogY3JlYXRlIHRoZSA0MjQgcmVzcG9uc2UgKi8KLSAgICAgICAgbmV3X3Jlc3BvbnNlID0gYXBfcGNhbGxvYyhyLT5wb29sLCBzaXplb2YoKm5ld19yZXNwb25zZSkpOwotICAgICAgICBuZXdfcmVzcG9uc2UtPmhyZWYgPSByZXNvdXJjZS0+dXJpOwotICAgICAgICBuZXdfcmVzcG9uc2UtPnN0YXR1cyA9IEhUVFBfRkFJTEVEX0RFUEVOREVOQ1k7Ci0gICAgICAgIG5ld19yZXNwb25zZS0+cHJvcHJlc3VsdC5wcm9wc3RhdHMgPSBwcm9wc3RhdDsKLSAgICAgICAgbmV3X3Jlc3BvbnNlLT5kZXNjID0KLSAgICAgICAgICAgICJBbiBlcnJvciBvY2N1cnJlZCBvbiBhbm90aGVyIHJlc291cmNlLCBwcmV2ZW50aW5nIHRoZSAiCi0gICAgICAgICAgICAicmVxdWVzdGVkIG9wZXJhdGlvbiBvbiB0aGlzIHJlc291cmNlLiI7Ci0KLSAgICAgICAgbmV3X3Jlc3BvbnNlLT5uZXh0ID0gKnJlc3BvbnNlOwotICAgICAgICAqcmVzcG9uc2UgPSBuZXdfcmVzcG9uc2U7Ci0KLSAgICAgICAgLyogbWFudWZhY3R1cmUgYSAyMDcgZXJyb3IgZm9yIHRoZSBtdWx0aXN0YXR1cyByZXNwb25zZShzKSAqLwotICAgICAgICByZXR1cm4gZGF2X25ld19lcnJvcihyLT5wb29sLCBIVFRQX01VTFRJX1NUQVRVUywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yKHMpIG9jY3VycmVkIG9uIHJlc291cmNlcyBkdXJpbmcgdGhlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRpb24gcHJvY2Vzcy4iKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKiBkYXZfZ2V0X2xvY2t0b2tlbl9saXN0OgotICoKLSAqIFNldHMgbHRsIHRvIGEgbG9ja3Rva2VuX2xpc3Qgb2YgYWxsIHBvc2l0aXZlIGxvY2t0b2tlbnMgaW4gaGVhZGVyLAotICogZWxzZSBOVUxMIGlmIG5vIElmLWhlYWRlciwgb3Igbm8gcG9zaXRpdmUgbG9ja3Rva2Vucy4KLSAqLwotZGF2X2Vycm9yICogZGF2X2dldF9sb2NrdG9rZW5fbGlzdChyZXF1ZXN0X3JlYyAqciwgZGF2X2xvY2t0b2tlbl9saXN0ICoqbHRsKSAKLXsKLSAgICBkYXZfZXJyb3IgKmVycjsKLSAgICBkYXZfaWZfaGVhZGVyICppZl9oZWFkZXI7Ci0gICAgZGF2X2lmX3N0YXRlX2xpc3QgKmlmX3N0YXRlOwotICAgIGRhdl9sb2NrdG9rZW5fbGlzdCAqbG9ja190b2tlbiA9IE5VTEw7CQkKLQkKLSAgICAqbHRsID0gTlVMTDsKLQotICAgIGlmICgoZXJyID0gZGF2X3Byb2Nlc3NfaWZfaGVhZGVyKHIsICZpZl9oZWFkZXIpKSAhPSBOVUxMKSB7Ci0JLyogIyMjIGFkZCBhIGhpZ2hlci1sZXZlbCBkZXNjcmlwdGlvbj8gKi8KLQlyZXR1cm4gZXJyOwotICAgIH0KLSAJCQkKLSAgICB3aGlsZSAoaWZfaGVhZGVyICE9IE5VTEwpIHsKLQlpZl9zdGF0ZSA9IGlmX2hlYWRlci0+c3RhdGU7CS8qIEJlZ2luaW5nIG9mIHRoZSBpZl9zdGF0ZSBsaW5rZWQgbGlzdCAqLwotCXdoaWxlIChpZl9zdGF0ZSAhPSBOVUxMKQl7Ci0JICAgIGlmIChpZl9zdGF0ZS0+Y29uZGl0aW9uID09IERBVl9JRl9DT05EX05PUk1BTAotCSAgICAgICAgJiYgaWZfc3RhdGUtPnR5cGUgPT0gZGF2X2lmX29wYXF1ZWxvY2spIHsKLQkJbG9ja190b2tlbiA9IGFwX3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKGRhdl9sb2NrdG9rZW5fbGlzdCkpOwotCQlsb2NrX3Rva2VuLT5sb2NrdG9rZW4gPSBpZl9zdGF0ZS0+bG9ja3Rva2VuOwotCQlsb2NrX3Rva2VuLT5uZXh0ID0gKmx0bDsKLQkJKmx0bCA9IGxvY2tfdG9rZW47Ci0JICAgIH0KLQkgICAgaWZfc3RhdGUgPSBpZl9zdGF0ZS0+bmV4dDsgCi0JfQotCWlmX2hlYWRlciA9IGlmX2hlYWRlci0+bmV4dDsKLSAgICB9Ci0gICAgaWYgKCpsdGwgPT0gTlVMTCkgewotCS8qIE5vIG5vZGVzIGFkZGVkICovCi0JcmV0dXJuIGRhdl9uZXdfZXJyb3Ioci0+cG9vbCwgSFRUUF9CQURfUkVRVUVTVCwgREFWX0VSUl9JRl9BQlNFTlQsCi0JCQkgICAgICJObyBsb2NrdG9rZW5zIHdlcmUgc3BlY2lmaWVkIGluIHRoZSBcIklmOlwiICIKLQkJCSAgICAgImhlYWRlciwgc28gdGhlIHJlZnJlc2ggY291bGQgbm90IGJlIHBlcmZvcm1lZC4iKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogZGF2X2dldF90YXJnZXRfc2VsZWN0b3I6Ci0gKgotICogUmV0dXJucyBhbnkgVGFyZ2V0LVNlbGVjdG9yIGhlYWRlciBpbiBhIHJlcXVlc3QKLSAqICh1c2VkIGJ5IHZlcnNpb25pbmcgY2xpZW50cykKLSAqLwotY29uc3QgY2hhciAqZGF2X2dldF90YXJnZXRfc2VsZWN0b3IocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgcmV0dXJuIGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiVGFyZ2V0LVNlbGVjdG9yIik7Ci19Ci0KLS8qIEVuc3VyZSB0aGF0IGEgcmVzb3VyY2UgaXMgd3JpdGFibGUuIElmIHRoZXJlIGlzIG5vIHZlcnNpb25pbmcKLSAqIHByb3ZpZGVyLCB0aGVuIHRoaXMgaXMgZXNzZW50aWFsbHkgYSBuby1vcC4gVmVyc2lvbmluZyByZXBvc2l0b3JpZXMKLSAqIHJlcXVpcmUgZXhwbGljaXQgcmVzb3VyY2UgY3JlYXRpb24gYW5kIGNoZWNrb3V0IGJlZm9yZSB0aGV5IGNhbgotICogYmUgd3JpdHRlbiB0by4gSWYgYSBuZXcgcmVzb3VyY2UgaXMgdG8gYmUgY3JlYXRlZCwgb3IgYW4gZXhpc3RpbmcKLSAqIHJlc291cmNlIGRlbGV0ZWQsIHRoZSBwYXJlbnQgY29sbGVjdGlvbiBtdXN0IGJlIGNoZWNrZWQgb3V0IGFzIHdlbGwuCi0gKgotICogU2V0IHRoZSBwYXJlbnRfb25seSBmbGFnIHRvIG9ubHkgbWFrZSB0aGUgcGFyZW50IGNvbGxlY3Rpb24gd3JpdGFibGUuCi0gKiBPdGhlcndpc2UsIGJvdGggcGFyZW50IGFuZCBjaGlsZCBhcmUgbWFkZSB3cml0YWJsZSBhcyBuZWVkZWQuIElmIHRoZQotICogY2hpbGQgZG9lcyBub3QgZXhpc3QsIHRoZW4gYSBuZXcgdmVyc2lvbmVkIHJlc291cmNlIGlzIGNyZWF0ZWQgYW5kCi0gKiBjaGVja2VkIG91dC4KLSAqCi0gKiBUaGUgcGFyZW50X3Jlc291cmNlIGFuZCBwYXJlbnRfd2FzX3dyaXRhYmxlIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwKLSAqIChpLmUuIHRoZXkgbWF5IGJlIE5VTEwpLiBJZiBwYXJlbnRfb25seSBpcyBzZXQsIHRoZW4gdGhlCi0gKiByZXNvdXJjZV9leGlzdGVkIGFuZCByZXNvdXJjZV93YXNfd3JpdGFibGUgYXJndW1lbnRzIGFyZSBpZ25vcmVkLgotICoKLSAqIFRoZSBwcmV2aW91cyBzdGF0ZXMgb2YgdGhlIHJlc291cmNlcyBhcmUgcmV0dXJuZWQsIHNvIHRoZXkgY2FuIGJlCi0gKiByZXN0b3JlZCBhZnRlciB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcyAoc2VlCi0gKiBkYXZfcmV2ZXJ0X3Jlc291cmNlX3dyaXRhYmlsaXR5KCkpCi0gKi8KLWRhdl9lcnJvciAqZGF2X2Vuc3VyZV9yZXNvdXJjZV93cml0YWJsZShyZXF1ZXN0X3JlYyAqciwKLQkJCQkJICBkYXZfcmVzb3VyY2UgKnJlc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhcmVudF9vbmx5LAotCQkJCQkgIGRhdl9yZXNvdXJjZSAqKnBhcmVudF9yZXNvdXJjZSwKLQkJCQkJICBpbnQgKnJlc291cmNlX2V4aXN0ZWQsCi0JCQkJCSAgaW50ICpyZXNvdXJjZV93YXNfd3JpdGFibGUsCi0JCQkJCSAgaW50ICpwYXJlbnRfd2FzX3dyaXRhYmxlKQotewotICAgIGNvbnN0IGRhdl9ob29rc192c24gKnZzbl9ob29rcyA9IERBVl9HRVRfSE9PS1NfVlNOKHIpOwotICAgIGRhdl9yZXNvdXJjZSAqcGFyZW50ID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICpib2R5OwotICAgIGludCBhdXRvX3ZlcnNpb247Ci0gICAgZGF2X2Vycm9yICplcnI7Ci0KLSAgICBpZiAocGFyZW50X3Jlc291cmNlICE9IE5VTEwpCi0gICAgICAgICpwYXJlbnRfcmVzb3VyY2UgPSBOVUxMOwotCi0gICAgaWYgKCFwYXJlbnRfb25seSkgewotICAgICAgICAqcmVzb3VyY2VfZXhpc3RlZCA9IHJlc291cmNlLT5leGlzdHM7Ci0gICAgICAgICpyZXNvdXJjZV93YXNfd3JpdGFibGUgPSAwOwotICAgIH0KLQotICAgIGlmIChwYXJlbnRfd2FzX3dyaXRhYmxlICE9IE5VTEwpCi0gICAgICAgICpwYXJlbnRfd2FzX3dyaXRhYmxlID0gMDsKLQotICAgIC8qIGlmIGEgVGFyZ2V0LVNlbGVjdG9yIGhlYWRlciBpcyBwcmVzZW50LCB0aGVuIHRoZSBjbGllbnQga25vd3MgYWJvdXQKLSAgICAgKiB2ZXJzaW9uaW5nLCBzbyBpdCBzaG91bGQgbm90IGJlIHJlbHlpbmcgb24gaW1wbGljaXQgdmVyc2lvbmluZwotICAgICAqLwotICAgIGF1dG9fdmVyc2lvbiA9IChkYXZfZ2V0X3RhcmdldF9zZWxlY3RvcihyKSA9PSBOVUxMKTsKLQotICAgIC8qIGNoZWNrIHBhcmVudCByZXNvdXJjZSBpZiByZXF1ZXN0ZWQgb3IgaWYgcmVzb3VyY2UgbXVzdCBiZSBjcmVhdGVkICovCi0gICAgaWYgKCFyZXNvdXJjZS0+ZXhpc3RzIHx8IHBhcmVudF9vbmx5KSB7Ci0JcGFyZW50ID0gKCpyZXNvdXJjZS0+aG9va3MtPmdldF9wYXJlbnRfcmVzb3VyY2UpKHJlc291cmNlKTsKLSAgICAgICAgaWYgKHBhcmVudCA9PSBOVUxMIHx8ICFwYXJlbnQtPmV4aXN0cykgewotCSAgICBib2R5ID0gYXBfcHNwcmludGYoci0+cG9vbCwKLQkJCSAgICAgICAiTWlzc2luZyBvbmUgb3IgbW9yZSBpbnRlcm1lZGlhdGUgY29sbGVjdGlvbnMuICIKLQkJCSAgICAgICAiQ2Fubm90IGNyZWF0ZSByZXNvdXJjZSAlcy4iLAotCQkJICAgICAgIGFwX2VzY2FwZV9odG1sKHItPnBvb2wsIHJlc291cmNlLT51cmkpKTsKLQkgICAgcmV0dXJuIGRhdl9uZXdfZXJyb3Ioci0+cG9vbCwgSFRUUF9DT05GTElDVCwgMCwgYm9keSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFyZW50X3Jlc291cmNlICE9IE5VTEwpCi0JICAgICpwYXJlbnRfcmVzb3VyY2UgPSBwYXJlbnQ7Ci0KLQkvKiBpZiBwYXJlbnQgbm90IHZlcnNpb25lZCwgYXNzdW1lIGNoaWxkIGNhbiBiZSBjcmVhdGVkICovCi0JaWYgKCFwYXJlbnQtPnZlcnNpb25lZCkgewotICAgICAgICAgICAgaWYgKCFwYXJlbnRfb25seSkKLQkgICAgICAgICpyZXNvdXJjZV93YXNfd3JpdGFibGUgPSAxOwotCi0gICAgICAgICAgICBpZiAocGFyZW50X3dhc193cml0YWJsZSAhPSBOVUxMKQotCSAgICAgICAgKnBhcmVudF93YXNfd3JpdGFibGUgPSAxOwotCSAgICByZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiBpZiBubyB2ZXJzaW9uaW5nIHByb3ZpZGVyLCBzb21ldGhpbmcgaXMgdGVycmlibHkgd3JvbmcgKi8KLQlpZiAodnNuX2hvb2tzID09IE5VTEwpIHsKLQkgICAgcmV0dXJuIGRhdl9uZXdfZXJyb3Ioci0+cG9vbCwgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsIDAsCi0JCQkJICJJTlRFUk5BTCBFUlJPUjogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcnNpb25lZCByZXNvdXJjZSB3aXRoIG5vIHZlcnNpb25pbmcgIgotCQkJCSAicHJvdmlkZXI/Iik7Ci0JfQotCi0gICAgICAgIC8qIHJlbWVtYmVyIHdoZXRoZXIgcGFyZW50IHdhcyBhbHJlYWR5IHdyaXRhYmxlICovCi0gICAgICAgIGlmIChwYXJlbnRfd2FzX3dyaXRhYmxlICE9IE5VTEwpCi0JICAgICpwYXJlbnRfd2FzX3dyaXRhYmxlID0gcGFyZW50LT53b3JraW5nOwotCi0JLyogcGFyZW50IG11c3QgYmUgY2hlY2tlZCBvdXQgKi8KLQlpZiAoIXBhcmVudC0+d29ya2luZykgewotCSAgICBpZiAoKGVyciA9ICgqdnNuX2hvb2tzLT5jaGVja291dCkocGFyZW50KSkgIT0gTlVMTCkgewotCQlib2R5ID0gYXBfcHNwcmludGYoci0+cG9vbCwKLQkJCQkgICAiVW5hYmxlIHRvIGNoZWNrb3V0IHBhcmVudCBjb2xsZWN0aW9uLiAiCi0JCQkJICAgIkNhbm5vdCBjcmVhdGUgcmVzb3VyY2UgJXMuIiwKLQkJCQkgICBhcF9lc2NhcGVfaHRtbChyLT5wb29sLCByZXNvdXJjZS0+dXJpKSk7Ci0JCXJldHVybiBkYXZfcHVzaF9lcnJvcihyLT5wb29sLCBIVFRQX0NPTkZMSUNULCAwLCBib2R5LCBlcnIpOwotCSAgICB9Ci0JfQotCi0JLyogaWYgbm90IGp1c3QgY2hlY2tpbmcgcGFyZW50LCBjcmVhdGUgbmV3IGNoaWxkIHJlc291cmNlICovCi0gICAgICAgIGlmICghcGFyZW50X29ubHkpIHsKLQkgICAgaWYgKChlcnIgPSAoKnZzbl9ob29rcy0+bWtyZXNvdXJjZSkocmVzb3VyY2UpKSAhPSBOVUxMKSB7Ci0JICAgICAgICBib2R5ID0gYXBfcHNwcmludGYoci0+cG9vbCwKLQkJCSAgICAgICAgICAgIlVuYWJsZSB0byBjcmVhdGUgdmVyc2lvbmVkIHJlc291cmNlICVzLiIsCi0JCQkgICAgICAgICAgIGFwX2VzY2FwZV9odG1sKHItPnBvb2wsIHJlc291cmNlLT51cmkpKTsKLQkgICAgICAgIHJldHVybiBkYXZfcHVzaF9lcnJvcihyLT5wb29sLCBIVFRQX0NPTkZMSUNULCAwLCBib2R5LCBlcnIpOwotCSAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0JLyogcmVzb3VyY2UgZXhpc3RzOiBpZiBub3QgdmVyc2lvbmVkLCB0aGVuIGFzc3VtZSBpdCBpcyB3cml0YWJsZSAqLwotCWlmICghcmVzb3VyY2UtPnZlcnNpb25lZCkgewotCSAgICAqcmVzb3VyY2Vfd2FzX3dyaXRhYmxlID0gMTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotCi0JKnJlc291cmNlX3dhc193cml0YWJsZSA9IHJlc291cmNlLT53b3JraW5nOwotICAgIH0KLQotICAgIC8qIGlmIG5vdCBqdXN0IGNoZWNraW5nIHBhcmVudCwgbWFrZSBzdXJlIGNoaWxkIHJlc291cmNlIGlzIGNoZWNrZWQgb3V0ICovCi0gICAgaWYgKCFwYXJlbnRfb25seSAmJiAhcmVzb3VyY2UtPndvcmtpbmcpIHsKLQlpZiAoKGVyciA9ICgqdnNuX2hvb2tzLT5jaGVja291dCkocmVzb3VyY2UpKSAhPSBOVUxMKSB7Ci0JICAgIGJvZHkgPSBhcF9wc3ByaW50ZihyLT5wb29sLAotCQkJICAgICAgICJVbmFibGUgdG8gY2hlY2tvdXQgcmVzb3VyY2UgJXMuIiwKLQkJCSAgICAgICBhcF9lc2NhcGVfaHRtbChyLT5wb29sLCByZXNvdXJjZS0+dXJpKSk7Ci0JICAgIHJldHVybiBkYXZfcHVzaF9lcnJvcihyLT5wb29sLCBIVFRQX0NPTkZMSUNULCAwLCBib2R5LCBlcnIpOwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogUmV2ZXJ0IHRoZSB3cml0YWJpbGl0eSBvZiByZXNvdXJjZXMgYmFjayB0byB3aGF0IHRoZXkgd2VyZQotICogYmVmb3JlIHRoZXkgd2VyZSBtb2RpZmllZC4gSWYgdW5kbyA9PSAwLCB0aGVuIHRoZSByZXNvdXJjZQotICogbW9kaWZpY2F0aW9ucyBhcmUgbWFpbnRhaW5lZCAoaS5lLiB0aGV5IGFyZSBjaGVja2VkIGluKS4KLSAqIElmIHVuZG8gIT0gMCwgdGhlbiByZXNvdXJjZSBtb2RpZmljYXRpb25zIGFyZSBkaXNjYXJkZWQKLSAqIChpLmUuIHRoZXkgYXJlIHVuY2hlY2tlZCBvdXQpLgotICoKLSAqIFRoZSByZXNvdXJjZSBhbmQgcGFyZW50X3Jlc291cmNlIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwKLSAqIChpLmUuIHRoZXkgbWF5IGJlIE5VTEwpLgotICovCi1kYXZfZXJyb3IgKmRhdl9yZXZlcnRfcmVzb3VyY2Vfd3JpdGFiaWxpdHkocmVxdWVzdF9yZWMgKnIsCi0JCQkJCSAgIGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkJCSAgIGRhdl9yZXNvdXJjZSAqcGFyZW50X3Jlc291cmNlLAotCQkJCQkgICBpbnQgdW5kbywKLQkJCQkJICAgaW50IHJlc291cmNlX2V4aXN0ZWQsCi0JCQkJCSAgIGludCByZXNvdXJjZV93YXNfd3JpdGFibGUsCi0JCQkJCSAgIGludCBwYXJlbnRfd2FzX3dyaXRhYmxlKQotewotICAgIGNvbnN0IGRhdl9ob29rc192c24gKnZzbl9ob29rcyA9IERBVl9HRVRfSE9PS1NfVlNOKHIpOwotICAgIGNvbnN0IGNoYXIgKmJvZHk7Ci0gICAgZGF2X2Vycm9yICplcnI7Ci0KLSAgICBpZiAocmVzb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBpZiAoIXJlc291cmNlX3dhc193cml0YWJsZQotCSAgICAmJiByZXNvdXJjZS0+dmVyc2lvbmVkICYmIHJlc291cmNlLT53b3JraW5nKSB7Ci0KLSAgICAgICAgICAgIGlmICh1bmRvKQotICAgICAgICAgICAgICAgIGVyciA9ICgqdnNuX2hvb2tzLT51bmNoZWNrb3V0KShyZXNvdXJjZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZXJyID0gKCp2c25faG9va3MtPmNoZWNraW4pKHJlc291cmNlKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0JICAgICAgICBib2R5ID0gYXBfcHNwcmludGYoci0+cG9vbCwKLQkJCSAgICAgICAgICAgIlVuYWJsZSB0byAlcyByZXNvdXJjZSAlcy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRvID8gInVuY2hlY2tvdXQiIDogImNoZWNraW4iLAotCQkJICAgICAgICAgICBhcF9lc2NhcGVfaHRtbChyLT5wb29sLCByZXNvdXJjZS0+dXJpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRhdl9wdXNoX2Vycm9yKHItPnBvb2wsIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCAwLAotCQkJCSAgICAgIGJvZHksIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodW5kbyAmJiAhcmVzb3VyY2VfZXhpc3RlZCAmJiByZXNvdXJjZS0+ZXhpc3RzKSB7Ci0JICAgIGRhdl9yZXNwb25zZSAqcmVzcG9uc2U7Ci0KLQkgICAgLyogIyMjIHNob3VsZCB3ZSBkbyBhbnl0aGluZyB3aXRoIHRoZSByZXNwb25zZT8gKi8KLSAgICAgICAgICAgIGlmICgoZXJyID0gKCpyZXNvdXJjZS0+aG9va3MtPnJlbW92ZV9yZXNvdXJjZSkocmVzb3VyY2UsCi0JCQkJCQkJICAgJnJlc3BvbnNlKSkgIT0gTlVMTCkgewotCSAgICAgICAgYm9keSA9IGFwX3BzcHJpbnRmKHItPnBvb2wsCi0JCQkgICAgICAgICAgICJVbmFibGUgdG8gdW5kbyBjcmVhdGlvbiBvZiByZXNvdXJjZSAlcy4iLAotCQkJICAgICAgICAgICBhcF9lc2NhcGVfaHRtbChyLT5wb29sLCByZXNvdXJjZS0+dXJpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRhdl9wdXNoX2Vycm9yKHItPnBvb2wsIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCAwLAotCQkJCSAgICAgIGJvZHksIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocGFyZW50X3Jlc291cmNlICE9IE5VTEwgJiYgIXBhcmVudF93YXNfd3JpdGFibGUKLQkmJiBwYXJlbnRfcmVzb3VyY2UtPnZlcnNpb25lZCAmJiBwYXJlbnRfcmVzb3VyY2UtPndvcmtpbmcpIHsKLQotCWlmICh1bmRvKQotCSAgICBlcnIgPSAoKnZzbl9ob29rcy0+dW5jaGVja291dCkocGFyZW50X3Jlc291cmNlKTsKLQllbHNlCi0JICAgIGVyciA9ICgqdnNuX2hvb2tzLT5jaGVja2luKShwYXJlbnRfcmVzb3VyY2UpOwotCi0JaWYgKGVyciAhPSBOVUxMKSB7Ci0JICAgIGJvZHkgPSBhcF9wc3ByaW50ZihyLT5wb29sLAotCQkJICAgICAgICJVbmFibGUgdG8gJXMgcGFyZW50IGNvbGxlY3Rpb24gb2YgJXMuIiwKLQkJCSAgICAgICB1bmRvID8gInVuY2hlY2tvdXQiIDogImNoZWNraW4iLAotCQkJICAgICAgIGFwX2VzY2FwZV9odG1sKHItPnBvb2wsIHJlc291cmNlLT51cmkpKTsKLQkgICAgcmV0dXJuIGRhdl9wdXNoX2Vycm9yKHItPnBvb2wsIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCAwLAotCQkJCSAgYm9keSwgZXJyKTsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIHJldHVybiB0aGUgVVJJJ3MgKGV4aXN0aW5nKSBpbmRleCwgb3IgaW5zZXJ0IGl0IGFuZCByZXR1cm4gYSBuZXcgaW5kZXggKi8KLWludCBkYXZfaW5zZXJ0X3VyaShhcnJheV9oZWFkZXIgKnVyaV9hcnJheSwgY29uc3QgY2hhciAqdXJpKQotewotICAgIGludCBpOwotICAgIGNvbnN0IGNoYXIgKipwZWx0OwotCi0gICAgZm9yIChpID0gdXJpX2FycmF5LT5uZWx0czsgaS0tOykgewotCWlmIChzdHJjbXAodXJpLCBEQVZfR0VUX1VSSV9JVEVNKHVyaV9hcnJheSwgaSkpID09IDApCi0JICAgIHJldHVybiBpOwotICAgIH0KLQotICAgIHBlbHQgPSBhcF9wdXNoX2FycmF5KHVyaV9hcnJheSk7Ci0gICAgKnBlbHQgPSB1cmk7CQkvKiBhc3N1bWUgdXJpIGlzIGNvbnN0IG9yIGluIGEgcG9vbCAqLwotICAgIHJldHVybiB1cmlfYXJyYXktPm5lbHRzIC0gMTsKLX0KZGlmZiAtLWdpdCBhL21vZHVsZXMvZGF2L21haW4vdXRpbF9sb2NrLmMgYi9tb2R1bGVzL2Rhdi9tYWluL3V0aWxfbG9jay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzQ0MWJmLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZGF2L21haW4vdXRpbF9sb2NrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NjQgKzAsMCBAQAotLyoKLSoqIENvcHlyaWdodCAoQykgMTk5OC0yMDAwIEdyZWcgU3RlaW4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qKgotKiogQnkgdXNpbmcgdGhpcyBmaWxlLCB5b3UgYWdyZWUgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHNldCBmb3J0aCBpbgotKiogdGhlIExJQ0VOU0UuaHRtbCBmaWxlIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBtb2RfZGF2Ci0qKiBkaXN0cmlidXRpb24gb3IgYXQgaHR0cDovL3d3dy53ZWJkYXYub3JnL21vZF9kYXYvbGljZW5zZS0xLmh0bWwuCi0qKgotKiogQ29udGFjdCBpbmZvcm1hdGlvbjoKLSoqICAgR3JlZyBTdGVpbiwgUE8gQm94IDc2MCwgUGFsbyBBbHRvLCBDQSwgOTQzMDIKLSoqICAgZ3N0ZWluQGx5cmEub3JnLCBodHRwOi8vd3d3LndlYmRhdi5vcmcvbW9kX2Rhdi8KLSovCi0KLS8qCi0qKiBEQVYgcmVwb3NpdG9yeS1pbmRlcGVuZGVudCBsb2NrIGZ1bmN0aW9ucwotKioKLSoqIFdyaXR0ZW4gMDYvOTkgYnkgS2VpdGggV2FubmFtYWtlciwgd2FubmFtYWtAdXMuaWJtLmNvbQotKioKLSoqIE1vZGlmaWVkIDA4Lzk5IGJ5IEpvaG4gVmFzdGEsIHZhc3RhQHJhdGlvbmFsLmNvbSwgdG8gbW92ZSBmaWxlc3lzdGVtLWJhc2VkCi0qKiBpbXBsZW1lbnRhdGlvbiB0byBkYXZfZnNfbG9jay5jCi0qLwotCi0jaW5jbHVkZSAibW9kX2Rhdi5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAibWVtb3J5LmgiCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qKgotKiogUHJvcGVydHktcmVsYXRlZCBsb2NrIGZ1bmN0aW9ucwotKioKLSovCi0KLS8qCi0qKiBkYXZfbG9ja19nZXRfYWN0aXZlbG9jazogIFJldHVybnMgYSA8bG9ja2Rpc2NvdmVyeT4gY29udGFpbmluZwotKiogICAgYW4gYWN0aXZlbG9jayBlbGVtZW50IGZvciBldmVyeSBpdGVtIGluIHRoZSBsb2NrX2Rpc2NvdmVyeSB0cmVlCi0qLwotY29uc3QgY2hhciAqZGF2X2xvY2tfZ2V0X2FjdGl2ZWxvY2socmVxdWVzdF9yZWMgKnIsIGRhdl9sb2NrICpsb2NrLAotCQkJCSAgICBkYXZfYnVmZmVyICpwYnVmKQotewotICAgIGRhdl9sb2NrICpsb2NrX3NjYW47Ci0gICAgY29uc3QgZGF2X2hvb2tzX2xvY2tzICpob29rcyA9IERBVl9HRVRfSE9PS1NfTE9DS1Mocik7Ci0gICAgaW50IGNvdW50ID0gMDsKLSAgICBkYXZfYnVmZmVyIHdvcmtfYnVmID0geyAwIH07Ci0gICAgcG9vbCAqcCA9IHItPnBvb2w7Ci0KLSAgICAvKiBJZiBubyBsb2NrcyBvciBubyBsb2NrIHByb3ZpZGVyLCB0aGVyZSBhcmUgbm8gbG9ja3MgKi8KLSAgICBpZiAobG9jayA9PSBOVUxMIHx8IGhvb2tzID09IE5VTEwpIHsKLQkvKgotCSoqIFNpbmNlIHJlc291cmNlZGlzY292ZXJ5IGlzIGRlZmluZWQgd2l0aCAoYWN0aXZlbG9jaykqLCAKLQkqKiA8RDphY3RpdmVsb2NrLz4gc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSBmb3IgYW4gZW1wdHkgbG9jay4KLQkqLwotCXJldHVybiAiIjsKLSAgICB9Ci0KLSAgICAvKgotICAgICoqIE5vdGU6IGl0IGNvdWxkIGJlIGludGVyZXN0aW5nIHRvIHN1bSB0aGUgbGVuZ3RocyBvZiB0aGUgb3duZXJzCi0gICAgKiogICAgICAgYW5kIGxvY2t0b2tlbnMgZHVyaW5nIHRoaXMgbG9vcC4gSG93ZXZlciwgdGhlIGJ1ZmZlcgotICAgICoqICAgICAgIG1lY2hhbmlzbSBwcm92aWRlcyBzb21lIHJvdWdoIHBhZGRpbmcgc28gdGhhdCB3ZSBkb24ndAotICAgICoqICAgICAgIHJlYWxseSBuZWVkIHRvIGhhdmUgYW4gZXhhY3Qgc2l6ZS4gRnVydGhlciwgY29uc3RydWN0aW5nCi0gICAgKiogICAgICAgbG9ja3Rva2VuIHN0cmluZ3MgY291bGQgYmUgcmVsYXRpdmVseSBleHBlbnNpdmUuCi0gICAgKi8KLSAgICBmb3IgKGxvY2tfc2NhbiA9IGxvY2s7IGxvY2tfc2NhbiAhPSBOVUxMOyBsb2NrX3NjYW4gPSBsb2NrX3NjYW4tPm5leHQpCi0JY291bnQrKzsKLQotICAgIC8qIGlmIGEgYnVmZmVyIHdhcyBub3QgcHJvdmlkZWQsIHRoZW4gdXNlIGFuIGludGVybmFsIGJ1ZmZlciAqLwotICAgIGlmIChwYnVmID09IE5VTEwpCi0JcGJ1ZiA9ICZ3b3JrX2J1ZjsKLQotICAgIC8qIHJlc2V0IHRoZSBsZW5ndGggYmVmb3JlIHdlIHN0YXJ0IGFwcGVuZGluZyBzdHVmZiAqLwotICAgIHBidWYtPmN1cl9sZW4gPSAwOwotCi0gICAgLyogcHJlcCB0aGUgYnVmZmVyIHdpdGggYSAiZ29vZCIgc2l6ZSAqLwotICAgIGRhdl9jaGVja19idWZzaXplKHAsIHBidWYsIGNvdW50ICogMzAwKTsKLQotICAgIGZvciAoOyBsb2NrICE9IE5VTEw7IGxvY2sgPSBsb2NrLT5uZXh0KSB7Ci0JY2hhciB0bXBbMTAwXTsKLQotI2lmIERBVl9ERUJVRwotCWlmIChsb2NrLT5yZWN0eXBlID09IERBVl9MT0NLUkVDX0lORElSRUNUX1BBUlRJQUwpIHsKLQkgICAgLyogIyMjIGNyYXAuIGRlc2lnbiBlcnJvciAqLwotCSAgICBkYXZfYnVmZmVyX2FwcGVuZChwLCBwYnVmLAotCQkJICAgICAgIkRFU0lHTiBFUlJPUjogYXR0ZW1wdGVkIHRvIHByb2R1Y3QgYW4gIgotCQkJICAgICAgImFjdGl2ZWxvY2sgZWxlbWVudCBmcm9tIGEgcGFydGlhbCwgaW5kaXJlY3QgIgotCQkJICAgICAgImxvY2sgcmVjb3JkLiBDcmVhdGluZyBhbiBYTUwgcGFyc2luZyBlcnJvciAiCi0JCQkgICAgICAidG8gZWFzZSBkZXRlY3Rpb24gb2YgdGhpcyBzaXR1YXRpb246IDwiKTsKLQl9Ci0jZW5kaWYKLQotCWRhdl9idWZmZXJfYXBwZW5kKHAsIHBidWYsICI8RDphY3RpdmVsb2NrPiIgREVCVUdfQ1IgIjxEOmxvY2t0eXBlPiIpOwotCXN3aXRjaCAobG9jay0+dHlwZSkgewotCWNhc2UgREFWX0xPQ0tUWVBFX1dSSVRFOgotCSAgICBkYXZfYnVmZmVyX2FwcGVuZChwLCBwYnVmLCAiPEQ6d3JpdGUvPiIpOwotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICAvKiAjIyMgaW50ZXJuYWwgZXJyb3IuIGxvZyBzb21ldGhpbmc/ICovCi0JICAgIGJyZWFrOwotCX0KLQlkYXZfYnVmZmVyX2FwcGVuZChwLCBwYnVmLCAiPC9EOmxvY2t0eXBlPiIgREVCVUdfQ1IgIjxEOmxvY2tzY29wZT4iKTsKLQlzd2l0Y2ggKGxvY2stPnNjb3BlKSB7Ci0JY2FzZSBEQVZfTE9DS1NDT1BFX0VYQ0xVU0lWRToKLQkgICAgZGF2X2J1ZmZlcl9hcHBlbmQocCwgcGJ1ZiwgIjxEOmV4Y2x1c2l2ZS8+Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgREFWX0xPQ0tTQ09QRV9TSEFSRUQ6Ci0JICAgIGRhdl9idWZmZXJfYXBwZW5kKHAsIHBidWYsICI8RDpzaGFyZWQvPiIpOwotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICAvKiAjIyMgaW50ZXJuYWwgZXJyb3IuIGxvZyBzb21ldGhpbmc/ICovCi0JICAgIGJyZWFrOwotCX0KLQlkYXZfYnVmZmVyX2FwcGVuZChwLCBwYnVmLCAiPC9EOmxvY2tzY29wZT4iIERFQlVHX0NSKTsKLQlzcHJpbnRmKHRtcCwgIjxEOmRlcHRoPiVzPC9EOmRlcHRoPiIgREVCVUdfQ1IsCi0JCWxvY2stPmRlcHRoID09IERBVl9JTkZJTklUWSA/ICJpbmZpbml0eSIgOiAiMCIpOwotCWRhdl9idWZmZXJfYXBwZW5kKHAsIHBidWYsIHRtcCk7Ci0KLQlpZiAobG9jay0+b3duZXIpIHsKLQkgICAgLyoKLQkgICAgKiogVGhpcyBjb250YWlucyBhIGNvbXBsZXRlLCBzZWxmLWNvbnRhaW5lZCA8REFWOm93bmVyPiBlbGVtZW50LAotCSAgICAqKiB3aXRoIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgYW5kIHhtbDpsYW5nIGhhbmRsaW5nLiBKdXN0IGRyb3AKLQkgICAgKiogaXQgaW4uCi0JICAgICovCi0JICAgIGRhdl9idWZmZXJfYXBwZW5kKHAsIHBidWYsIGxvY2stPm93bmVyKTsKLQl9Ci0JCQotCWRhdl9idWZmZXJfYXBwZW5kKHAsIHBidWYsICI8RDp0aW1lb3V0PiIpOwotCWlmIChsb2NrLT50aW1lb3V0ID09IERBVl9USU1FT1VUX0lORklOSVRFKSB7Ci0JICAgIGRhdl9idWZmZXJfYXBwZW5kKHAsIHBidWYsICJJbmZpbml0ZSIpOwotCX0KLQllbHNlIHsKLQkgICAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7Ci0JICAgIHNwcmludGYodG1wLCAiU2Vjb25kLSVsdSIsIGxvY2stPnRpbWVvdXQgLSBub3cpOwotCSAgICBkYXZfYnVmZmVyX2FwcGVuZChwLCBwYnVmLCB0bXApOwotCX0KLQotCWRhdl9idWZmZXJfYXBwZW5kKHAsIHBidWYsCi0JCQkgICI8L0Q6dGltZW91dD4iIERFQlVHX0NSCi0JCQkgICI8RDpsb2NrdG9rZW4+IiBERUJVR19DUgotCQkJICAiPEQ6aHJlZj4iKTsKLQlkYXZfYnVmZmVyX2FwcGVuZChwLCBwYnVmLAotCQkJICAoKmhvb2tzLT5mb3JtYXRfbG9ja3Rva2VuKShwLCBsb2NrLT5sb2NrdG9rZW4pKTsKLQlkYXZfYnVmZmVyX2FwcGVuZChwLCBwYnVmLAotCQkJICAiPC9EOmhyZWY+IiBERUJVR19DUgotCQkJICAiPC9EOmxvY2t0b2tlbj4iIERFQlVHX0NSCi0JCQkgICI8L0Q6YWN0aXZlbG9jaz4iIERFQlVHX0NSKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcGJ1Zi0+YnVmOwotfQotCi0vKgotKiogZGF2X2xvY2tfcGFyc2VfbG9ja2luZm86ICBWYWxpZGF0ZXMgdGhlIGdpdmVuIHhtbF9kb2MgdG8gY29udGFpbiBhCi0qKiAgICBsb2NraW5mbyBYTUwgZWxlbWVudCwgdGhlbiBwb3B1bGF0ZXMgYSBkYXZfbG9jayBzdHJ1Y3R1cmUKLSoqICAgIHdpdGggaXRzIGNvbnRlbnRzLgotKi8KLWRhdl9lcnJvciAqIGRhdl9sb2NrX3BhcnNlX2xvY2tpbmZvKHJlcXVlc3RfcmVjICpyLAotCQkJCSAgICBjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlLAotCQkJCSAgICBkYXZfbG9ja2RiICpsb2NrZGIsCi0JCQkJICAgIGNvbnN0IGRhdl94bWxfZG9jICpkb2MsCi0JCQkJICAgIGRhdl9sb2NrICoqbG9ja19yZXF1ZXN0KQotewotICAgIGNvbnN0IGRhdl9ob29rc19sb2NrcyAqaG9va3MgPSBEQVZfR0VUX0hPT0tTX0xPQ0tTKHIpOwotICAgIHBvb2wgKnAgPSByLT5wb29sOwotICAgIGRhdl9lcnJvciAqZXJyOwotICAgIGRhdl94bWxfZWxlbSAqY2hpbGQ7Ci0gICAgZGF2X2xvY2sgKmxvY2s7Ci0JCi0gICAgaWYgKCFkYXZfdmFsaWRhdGVfcm9vdChkb2MsICJsb2NraW5mbyIpKSB7Ci0JcmV0dXJuIGRhdl9uZXdfZXJyb3IocCwgSFRUUF9CQURfUkVRVUVTVCwgMCwKLQkJCSAgICAgIlRoZSByZXF1ZXN0IGJvZHkgY29udGFpbnMgYW4gdW5leHBlY3RlZCAiCi0JCQkgICAgICJYTUwgcm9vdCBlbGVtZW50LiIpOwotICAgIH0KLQotICAgIGlmICgoZXJyID0gKCpob29rcy0+Y3JlYXRlX2xvY2spKGxvY2tkYiwgcmVzb3VyY2UsICZsb2NrKSkgIT0gTlVMTCkgewotCXJldHVybiBkYXZfcHVzaF9lcnJvcihwLCBlcnItPnN0YXR1cywgMCwKLQkJCSAgICAgICJDb3VsZCBub3QgcGFyc2UgdGhlIGxvY2tpbmZvIGR1ZSB0byBhbiAiCi0JCQkgICAgICAiaW50ZXJuYWwgcHJvYmxlbSBjcmVhdGluZyBhIGxvY2sgc3RydWN0dXJlLiIsCi0JCQkgICAgICBlcnIpOwotICAgIH0KLQotICAgIGxvY2stPmRlcHRoID0gZGF2X2dldF9kZXB0aChyLCBEQVZfSU5GSU5JVFkpOwotICAgIGlmIChsb2NrLT5kZXB0aCA9PSAtMSkgewotCXJldHVybiBkYXZfbmV3X2Vycm9yKHAsIEhUVFBfQkFEX1JFUVVFU1QsIDAsCi0JCQkgICAgICJBbiBpbnZhbGlkIERlcHRoIGhlYWRlciB3YXMgc3BlY2lmaWVkLiIpOwotICAgIH0KLSAgICBsb2NrLT50aW1lb3V0ID0gZGF2X2dldF90aW1lb3V0KHIpOwotCi0gICAgLyogUGFyc2UgZWxlbWVudHMgaW4gdGhlIFhNTCBib2R5ICovCi0gICAgZm9yIChjaGlsZCA9IGRvYy0+cm9vdC0+Zmlyc3RfY2hpbGQ7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7Ci0JaWYgKHN0cmNtcChjaGlsZC0+bmFtZSwgImxvY2t0eXBlIikgPT0gMAotCSAgICAmJiBjaGlsZC0+Zmlyc3RfY2hpbGQKLQkgICAgJiYgbG9jay0+dHlwZSA9PSBEQVZfTE9DS1RZUEVfVU5LTk9XTikgewotCSAgICBpZiAoc3RyY21wKGNoaWxkLT5maXJzdF9jaGlsZC0+bmFtZSwgIndyaXRlIikgPT0gMCkgewotCQlsb2NrLT50eXBlID0gREFWX0xPQ0tUWVBFX1dSSVRFOwotCQljb250aW51ZTsKLQkgICAgfQotCX0KLQlpZiAoc3RyY21wKGNoaWxkLT5uYW1lLCAibG9ja3Njb3BlIikgPT0gMAotCSAgICAmJiBjaGlsZC0+Zmlyc3RfY2hpbGQKLQkgICAgJiYgbG9jay0+c2NvcGUgPT0gREFWX0xPQ0tTQ09QRV9VTktOT1dOKSB7Ci0JICAgIGlmIChzdHJjbXAoY2hpbGQtPmZpcnN0X2NoaWxkLT5uYW1lLCAiZXhjbHVzaXZlIikgPT0gMCkKLQkJbG9jay0+c2NvcGUgPSBEQVZfTE9DS1NDT1BFX0VYQ0xVU0lWRTsKLQkgICAgZWxzZSBpZiAoc3RyY21wKGNoaWxkLT5maXJzdF9jaGlsZC0+bmFtZSwgInNoYXJlZCIpID09IDApCi0JCWxvY2stPnNjb3BlID0gREFWX0xPQ0tTQ09QRV9TSEFSRUQ7Ci0JICAgIGlmIChsb2NrLT5zY29wZSAhPSBEQVZfTE9DS1NDT1BFX1VOS05PV04pCi0JCWNvbnRpbnVlOwotCX0KLQotCWlmIChzdHJjbXAoY2hpbGQtPm5hbWUsICJvd25lciIpID09IDAgJiYgbG9jay0+b3duZXIgPT0gTlVMTCkgewotCSAgICBjb25zdCBjaGFyICp0ZXh0OwotCi0JICAgIC8qIHF1b3RlIGFsbCB0aGUgdmFsdWVzIGluIHRoZSA8REFWOm93bmVyPiBlbGVtZW50ICovCi0JICAgIGRhdl9xdW90ZV94bWxfZWxlbShwLCBjaGlsZCk7Ci0KLQkgICAgLyoKLQkgICAgKiogU3RvcmUgYSBmdWxsIDxEQVY6b3duZXI+IGVsZW1lbnQgd2l0aCBuYW1lc3BhY2UgZGVmaW5pdGlvbnMKLQkgICAgKiogYW5kIGFuIHhtbDpsYW5nIGRlZmluaXRpb24sIGlmIGFwcGxpY2FibGUuCi0JICAgICovCi0JICAgIGRhdl94bWwydGV4dChwLCBjaGlsZCwgREFWX1gyVF9GVUxMX05TX0xBTkcsIGRvYy0+bmFtZXNwYWNlcywgTlVMTCwKLQkJCSAmdGV4dCwgTlVMTCk7Ci0JICAgIGxvY2stPm93bmVyID0gdGV4dDsKLQotCSAgICBjb250aW51ZTsKLQl9Ci0KLQlyZXR1cm4gZGF2X25ld19lcnJvcihwLCBIVFRQX1BSRUNPTkRJVElPTl9GQUlMRUQsIDAsCi0JCQkgICAgIGFwX3BzcHJpbnRmKHAsCi0JCQkJCSAiVGhlIHNlcnZlciBjYW5ub3Qgc2F0aXNmeSB0aGUgIgotCQkJCQkgIkxPQ0sgcmVxdWVzdCBkdWUgdG8gYW4gdW5rbm93biBYTUwgIgotCQkJCQkgImVsZW1lbnQgKFwiJXNcIikgd2l0aGluIHRoZSAiCi0JCQkJCSAiREFWOmxvY2tpbmZvIGVsZW1lbnQuIiwKLQkJCQkJIGNoaWxkLT5uYW1lKSk7Ci0gICAgfQotCi0gICAgKmxvY2tfcmVxdWVzdCA9IGxvY2s7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKioKLSoqIEdlbmVyYWwgbG9jayBmdW5jdGlvbnMKLSoqCi0qLwotCi0vKiBkYXZfbG9ja193YWxrZXI6ICBXYWxrZXIgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcmVjb3JkIGluZGlyZWN0IGxvY2tzICovCi1zdGF0aWMgZGF2X2Vycm9yICogZGF2X2xvY2tfd2Fsa2VyKGRhdl93YWxrZXJfY3R4ICpjdHgsIGludCBjYWxsdHlwZSkKLXsKLSAgICBkYXZfZXJyb3IgKmVycjsKLQotICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gc2V0IGluZGlyZWN0cyBvbiB0aGUgdGFyZ2V0ICovCi0gICAgaWYgKCgqY3R4LT5yZXNvdXJjZS0+aG9va3MtPmlzX3NhbWVfcmVzb3VyY2UpKGN0eC0+cmVzb3VyY2UsIGN0eC0+cm9vdCkpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAoKGVyciA9ICgqY3R4LT5sb2NrZGItPmhvb2tzLT5hcHBlbmRfbG9ja3MpKGN0eC0+bG9ja2RiLCBjdHgtPnJlc291cmNlLAotCQkJCQkJICAgMSwKLQkJCQkJCSAgIGN0eC0+bG9jaykpICE9IE5VTEwpIHsKLQlpZiAoYXBfaXNfSFRUUF9TRVJWRVJfRVJST1IoZXJyLT5zdGF0dXMpKSB7Ci0JICAgIC8qICMjIyBhZGQgYSBoaWdoZXItbGV2ZWwgZGVzY3JpcHRpb24/ICovCi0JICAgIHJldHVybiBlcnI7Ci0JfQotCi0JLyogYWRkIHRvIHRoZSBtdWx0aXN0YXR1cyByZXNwb25zZSAqLwotCWRhdl9hZGRfcmVzcG9uc2UoY3R4LCBjdHgtPnJlc291cmNlLT51cmksIGVyci0+c3RhdHVzLCBOVUxMKTsKLQotCS8qCi0JKiogIyMjIGFjdHVhbGx5LCB0aGlzIGlzIHByb2JhYmx5IHdyb25nOiB3ZSB3YW50IHRvIGZhaWwgdGhlIHdob2xlCi0JKiogIyMjIExPQ0sgcHJvY2VzcyBpZiBzb21ldGhpbmcgZ29lcyBiYWQuIG1heWJlIHRoZSBjYWxsZXIgc2hvdWxkCi0JKiogIyMjIGRvIGEgZGF2X3VubG9jaygpIChlLmcuIGEgcm9sbGJhY2spIGlmIGFueSBlcnJvcnMgb2NjdXJyZWQuCi0JKi8KLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoKLSoqIGRhdl9hZGRfbG9jazogIEFkZCBhIGRpcmVjdCBsb2NrIGZvciByZXNvdXJjZSwgYW5kIGluZGlyZWN0IGxvY2tzIGZvcgotKiogICAgYWxsIGNoaWxkcmVuLCBib3VuZGVkIGJ5IGRlcHRoLgotKiogICAgIyMjIGFzc3VtZSByZXF1ZXN0IG9ubHkgY29udGFpbnMgb25lIGxvY2sKLSovCi1kYXZfZXJyb3IgKiBkYXZfYWRkX2xvY2socmVxdWVzdF9yZWMgKnIsIGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkgZGF2X2xvY2tkYiAqbG9ja2RiLCBkYXZfbG9jayAqbG9jaywKLQkJCSBkYXZfcmVzcG9uc2UgKipyZXNwb25zZSkKLXsKLSAgICBjb25zdCBkYXZfaG9va3NfbG9ja3MgKmhvb2tzID0gREFWX0dFVF9IT09LU19MT0NLUyhyKTsKLSAgICBkYXZfZXJyb3IgKmVycjsKLSAgICBpbnQgZGVwdGggPSBsb2NrLT5kZXB0aDsKLQotICAgICpyZXNwb25zZSA9IE5VTEw7Ci0KLSAgICAvKiBSZXF1ZXN0ZWQgbG9jayBjYW4gYmU6Ci0gICAgICogICBEZXB0aDogMCAgIGZvciBudWxsIHJlc291cmNlLCBleGlzdGluZyByZXNvdXJjZSwgb3IgZXhpc3RpbmcgY29sbGVjdGlvbgotICAgICAqICAgRGVwdGg6IEluZiBmb3IgZXhpc3RpbmcgY29sbGVjdGlvbgotICAgICAqLwotCi0gICAgLyoKLSAgICAqKiAyNTE4IDkuMiBzYXlzIHRvIGlnbm9yZSBkZXB0aCBpZiB0YXJnZXQgaXMgbm90IGEgY29sbGVjdGlvbiAoaXQgaGFzCi0gICAgKiogICBubyBpbnRlcm5hbCBjaGlsZHJlbik7IHByZXRlbmQgdGhlIGNsaWVudCBnYXZlIHRoZSBjb3JyZWN0IGRlcHRoLgotICAgICovCi0gICAgaWYgKCFyZXNvdXJjZS0+Y29sbGVjdGlvbikgewotCWRlcHRoID0gMDsKLSAgICB9Ci0KLSAgICAvKiBJbiBhbGwgY2FzZXMsIGZpcnN0IGFkZCBkaXJlY3QgZW50cnkgaW4gbG9ja2RiICovCi0KLSAgICAvKgotICAgICoqIEFwcGVuZCB0aGUgbmV3IChkaXJlY3QpIGxvY2sgdG8gdGhlIHJlc291cmNlJ3MgZXhpc3RpbmcgbG9ja3MuCi0gICAgKioKLSAgICAqKiBOb3RlOiB0aGlzIGFsc28gaGFuZGxlcyBsb2NrbnVsbCByZXNvdXJjZXMKLSAgICAqLwotICAgIGlmICgoZXJyID0gKCpob29rcy0+YXBwZW5kX2xvY2tzKShsb2NrZGIsIHJlc291cmNlLCAwLCBsb2NrKSkgIT0gTlVMTCkgewotCS8qICMjIyBtYXliZSBhZGQgYSBoaWdoZXItbGV2ZWwgZGVzY3JpcHRpb24gKi8KLQlyZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChkZXB0aCA+IDApIHsKLQkvKiBXYWxrIGV4aXN0aW5nIGNvbGxlY3Rpb24gYW5kIHNldCBpbmRpcmVjdCBsb2NrcyAqLwotCWRhdl93YWxrZXJfY3R4IGN0eCA9IHsgMCB9OwotCi0JY3R4LndhbGtfdHlwZSA9IERBVl9XQUxLVFlQRV9BTEwgfCBEQVZfV0FMS1RZUEVfQVVUSDsKLQljdHgucG9zdGZpeCA9IDA7Ci0JY3R4LmZ1bmMgPSBkYXZfbG9ja193YWxrZXI7Ci0JY3R4LnBvb2wgPSByLT5wb29sOwotCWN0eC5yID0gcjsKLSAgICAgICAgY3R4LnJlc291cmNlID0gcmVzb3VyY2U7Ci0JY3R4LmxvY2tkYiA9IGxvY2tkYjsKLQljdHgubG9jayA9IGxvY2s7Ci0KLQlkYXZfYnVmZmVyX2luaXQoci0+cG9vbCwgJmN0eC51cmksIHJlc291cmNlLT51cmkpOwotCi0JZXJyID0gKCpyZXNvdXJjZS0+aG9va3MtPndhbGspKCZjdHgsIERBVl9JTkZJTklUWSk7Ci0JaWYgKGVyciAhPSBOVUxMKSB7Ci0JICAgIC8qIGltcGxpZXMgYSA1eHggc3RhdHVzIGNvZGUgb2NjdXJyZWQuIHNjcmV3IHRoZSBtdWx0aXN0YXR1cyAqLwotCSAgICByZXR1cm4gZXJyOwotCX0KLQotCWlmIChjdHgucmVzcG9uc2UgIT0gTlVMTCkgewotCSAgICAvKiBtYW51ZmFjdHVyZSBhIDIwNyBlcnJvciBmb3IgdGhlIG11bHRpc3RhdHVzIHJlc3BvbnNlICovCi0JICAgICpyZXNwb25zZSA9IGN0eC5yZXNwb25zZTsKLQkgICAgcmV0dXJuIGRhdl9uZXdfZXJyb3Ioci0+cG9vbCwgSFRUUF9NVUxUSV9TVEFUVVMsIDAsCi0JCQkJICJFcnJvcihzKSBvY2N1cnJlZCBvbiByZXNvdXJjZXMgZHVyaW5nIHRoZSAiCi0JCQkJICJhZGRpdGlvbiBvZiBhIGRlcHRoIGxvY2suIik7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi0vKgotKiogZGF2X2xvY2tfcXVlcnk6ICBPcGVucyB0aGUgbG9jayBkYXRhYmFzZS4gUmV0dXJucyBhIGxpbmtlZCBsaXN0IG9mCi0qKiAgICBkYXZfbG9jayBzdHJ1Y3R1cmVzIGZvciBhbGwgZGlyZWN0IGxvY2tzIG9uIHBhdGguCi0qLwotZGF2X2Vycm9yICogZGF2X2xvY2tfcXVlcnkoZGF2X2xvY2tkYiAqbG9ja2RiLCBjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlLAotCQkJICAgZGF2X2xvY2sgKipsb2NrcykKLXsKLSAgICAvKiBJZiBubyBsb2NrIGRhdGFiYXNlLCByZXR1cm4gZW1wdHkgcmVzdWx0ICovCi0gICAgaWYgKGxvY2tkYiA9PSBOVUxMKSB7Ci0gICAgICAgICpsb2NrcyA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8qICMjIyBpbnNlcnQgYSBoaWdoZXItbGV2ZWwgZGVzY3JpcHRpb24/ICovCi0gICAgcmV0dXJuICgqbG9ja2RiLT5ob29rcy0+Z2V0X2xvY2tzKShsb2NrZGIsIHJlc291cmNlLAotCQkJCSAgICAgICBEQVZfR0VUTE9DS1NfUkVTT0xWRUQsCi0JCQkJICAgICAgIGxvY2tzKTsKLX0KLQotLyogZGF2X3VubG9ja193YWxrZXI6ICBXYWxrZXIgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcmVtb3ZlIGluZGlyZWN0IGxvY2tzICovCi1zdGF0aWMgZGF2X2Vycm9yICogZGF2X3VubG9ja193YWxrZXIoZGF2X3dhbGtlcl9jdHggKmN0eCwgaW50IGNhbGx0eXBlKQotewotICAgIGRhdl9lcnJvciAqZXJyOwotCi0gICAgaWYgKChlcnIgPSAoKmN0eC0+bG9ja2RiLT5ob29rcy0+cmVtb3ZlX2xvY2spKGN0eC0+bG9ja2RiLCBjdHgtPnJlc291cmNlLAotCQkJCQkJICBjdHgtPmxvY2t0b2tlbikpICE9IE5VTEwpIHsKLQkvKiAjIyMgc2hvdWxkIHdlIHN0b3Agb3IgcmV0dXJuIGEgbXVsdGlzdGF0dXM/IGxvb2tzIGxpa2UgU1RPUCAqLwotCS8qICMjIyBhZGQgYSBoaWdoZXItbGV2ZWwgZGVzY3JpcHRpb24/ICovCi0JcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoKLSoqIGRhdl9nZXRfZGlyZWN0X3Jlc291cmNlOgotKioKLSoqIEZpbmQgYSBsb2NrIG9uIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UsIHRoZW4gcmV0dXJuIHRoZSByZXNvdXJjZSB0aGUKLSoqIGxvY2sgd2FzIGFwcGxpZWQgdG8gKGluIG90aGVyIHdvcmRzLCBnaXZlbiBhIChwb3NzaWJseSkgaW5kaXJlY3QgbG9jaywKLSoqIHJldHVybiB0aGUgZGlyZWN0IGxvY2sncyBjb3JyZXNwb25kaW5nIHJlc291cmNlKS4KLSoqCi0qKiBJZiB0aGUgbG9jayBpcyBhbiBpbmRpcmVjdCBsb2NrLCB0aGlzIHVzdWFsbHkgbWVhbnMgdHJhdmVyc2luZyB1cCB0aGUKLSoqIG5hbWVzcGFjZSBbcmVwb3NpdG9yeV0gaGllcmFyY2h5LiBOb3RlIHRoYXQgc29tZSBsb2NrIHByb3ZpZGVycyBtYXkgYmUKLSoqIGFibGUgdG8gcmV0dXJuIHRoaXMgaW5mb3JtYXRpb24gd2l0aCBhIHRyYXZlcnNhbC4KLSovCi1zdGF0aWMgZGF2X2Vycm9yICogZGF2X2dldF9kaXJlY3RfcmVzb3VyY2UocG9vbCAqcCwKLQkJCQkJICAgZGF2X2xvY2tkYiAqbG9ja2RiLAotCQkJCQkgICBjb25zdCBkYXZfbG9ja3Rva2VuICpsb2NrdG9rZW4sCi0JCQkJCSAgIGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkJCSAgIGNvbnN0IGRhdl9yZXNvdXJjZSAqKmRpcmVjdF9yZXNvdXJjZSkKLXsKLSAgICBpZiAobG9ja2RiLT5ob29rcy0+bG9va3VwX3Jlc291cmNlICE9IE5VTEwpIHsKLQlyZXR1cm4gKCpsb2NrZGItPmhvb2tzLT5sb29rdXBfcmVzb3VyY2UpKGxvY2tkYiwgbG9ja3Rva2VuLAotCQkJCQkJIHJlc291cmNlLCBkaXJlY3RfcmVzb3VyY2UpOwotICAgIH0KLQotICAgICpkaXJlY3RfcmVzb3VyY2UgPSBOVUxMOwotCi0gICAgLyogRmluZCB0aGUgdG9wIG9mIHRoaXMgbG9jay0KLSAgICAgKiBJZiByLT5maWxlbmFtZSdzIGRpcmVjdCAgIGxvY2tzIGluY2x1ZGUgbG9ja3Rva2VuLCB1c2Ugci0+ZmlsZW5hbWUuCi0gICAgICogSWYgci0+ZmlsZW5hbWUncyBpbmRpcmVjdCBsb2NrcyBpbmNsdWRlIGxvY2t0b2tlbiwgcmV0cnkgci0+ZmlsZW5hbWUvLi4KLSAgICAgKiBFbHNlIGZhaWwuCi0gICAgICovCi0gICAgd2hpbGUgKHJlc291cmNlICE9IE5VTEwpIHsKLQlkYXZfZXJyb3IgKmVycjsKLQlkYXZfbG9jayAqbG9jazsKLQotCS8qCi0JKiogRmluZCB0aGUgbG9jayBzcGVjaWZpZWQgYnkgPGxvY2t0b2tlbj4gb24gPHJlc291cmNlPi4gSWYgaXQgaXMKLQkqKiBhbiBpbmRpcmVjdCBsb2NrLCB0aGVuIHBhcnRpYWwgcmVzdWx0cyBhcmUgb2theS4gV2UncmUganVzdAotCSoqIHRyeWluZyB0byBmaW5kIHRoZSB0aGluZyBhbmQga25vdyB3aGV0aGVyIGl0IGlzIGEgZGlyZWN0IG9yCi0JKiogYW4gaW5kaXJlY3QgbG9jay4KLQkqLwotCWlmICgoZXJyID0gKCpsb2NrZGItPmhvb2tzLT5maW5kX2xvY2spKGxvY2tkYiwgcmVzb3VyY2UsIGxvY2t0b2tlbiwKLQkJCQkJICAgICAgIDEsICZsb2NrKSkgIT0gTlVMTCkgewotCSAgICAvKiAjIyMgYWRkIGEgaGlnaGVyLWxldmVsIGRlc2M/ICovCi0JICAgIHJldHVybiBlcnI7Ci0JfQotCi0JLyogbm90IGZvdW5kISB0aGF0J3MgYW4gZXJyb3IuICovCi0JaWYgKGxvY2sgPT0gTlVMTCkgewotCSAgICByZXR1cm4gZGF2X25ld19lcnJvcihwLCBIVFRQX0JBRF9SRVFVRVNULCAwLAotCQkJCSAiVGhlIHNwZWNpZmllZCBsb2NrdG9rZW4gZG9lcyBub3QgY29ycmVzcG9uZCAiCi0JCQkJICJ0byBhbiBleGlzdGluZyBsb2NrIG9uIHRoaXMgcmVzb3VyY2UuIik7Ci0JfQotCi0JaWYgKGxvY2stPnJlY3R5cGUgPT0gREFWX0xPQ0tSRUNfRElSRUNUKSB7Ci0JICAgIC8qIHdlIGZvdW5kIHRoZSBkaXJlY3QgbG9jay4gcmV0dXJuIHRoaXMgcmVzb3VyY2UuICovCi0KLQkgICAgKmRpcmVjdF9yZXNvdXJjZSA9IHJlc291cmNlOwotCSAgICByZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiB0aGUgbG9jayB3YXMgaW5kaXJlY3QuIG1vdmUgdXAgYSBsZXZlbCBpbiB0aGUgVVJMIG5hbWVzcGFjZSAqLwotCXJlc291cmNlID0gKCpyZXNvdXJjZS0+aG9va3MtPmdldF9wYXJlbnRfcmVzb3VyY2UpKHJlc291cmNlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZGF2X25ld19lcnJvcihwLCBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgMCwKLQkJCSAiVGhlIGxvY2sgZGF0YWJhc2UgaXMgY29ycnVwdC4gQSBkaXJlY3QgbG9jayBjb3VsZCAiCi0JCQkgIm5vdCBiZSBmb3VuZCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgaW5kaXJlY3QgbG9jayAiCi0JCQkgIm9uIHRoaXMgcmVzb3VyY2UuIik7Ci19Ci0KLS8qCi0qKiBkYXZfdW5sb2NrOiAgUmVtb3ZlcyBhbGwgZGlyZWN0IGFuZCBpbmRpcmVjdCBsb2NrcyBmb3Igci0+ZmlsZW5hbWUsCi0qKiAgICB3aXRoIGdpdmVuIGxvY2t0b2tlbi4gIElmIGxvY2t0b2tlbiA9PSBudWxsX2xvY2t0b2tlbiwgYWxsIGxvY2tzCi0qKiAgICBhcmUgcmVtb3ZlZC4gIElmIHItPmZpbGVuYW1lIHJlcHJlc2VudHMgYW4gaW5kaXJlY3QgbG9jaywKLSoqICAgIHdlIG11c3QgdW5sb2NrIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3QgbG9jay4KLSoqICAgIFJldHVybnMgT0sgb3IgYXBwcm9wcmlhdGUgSFRUUF8qIHJlc3BvbnNlIGFuZCBsb2dzIGFueSBlcnJvcnMuCi0qKgotKiogIyMjIFdlJ3ZlIGFscmVhZHkgY3Jhd2xlZCB0aGUgdHJlZSB0byBlbnN1cmUgZXZlcnl0aGluZyB3YXMgbG9ja2VkCi0qKiAgICAgYnkgdXM7IHRoZXJlIHNob3VsZCBiZSBubyBuZWVkIHRvIGluY29ycG9yYXRlIGEgcm9sbGJhY2suCi0qLwotaW50IGRhdl91bmxvY2socmVxdWVzdF9yZWMgKnIsIGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JICAgICAgIGNvbnN0IGRhdl9sb2NrdG9rZW4gKmxvY2t0b2tlbikKLXsKLSAgICBpbnQgcmVzdWx0OwotICAgIGRhdl9sb2NrZGIgKmxvY2tkYjsKLSAgICBjb25zdCBkYXZfcmVzb3VyY2UgKmxvY2tfcmVzb3VyY2UgPSByZXNvdXJjZTsKLSAgICBjb25zdCBkYXZfaG9va3NfbG9ja3MgKmhvb2tzID0gREFWX0dFVF9IT09LU19MT0NLUyhyKTsKLSAgICBjb25zdCBkYXZfaG9va3NfcmVwb3NpdG9yeSAqcmVwb3NfaG9va3MgPSByZXNvdXJjZS0+aG9va3M7Ci0gICAgZGF2X2Vycm9yICplcnI7Ci0KLSAgICAvKiBJZiBubyBsb2NrcyBwcm92aWRlciwgd2Ugc2hvdWxkbid0IGhhdmUgYmVlbiBjYWxsZWQgKi8KLSAgICBpZiAoaG9va3MgPT0gTlVMTCkgewotCS8qICMjIyBtYXAgcmVzdWx0IHRvIHNvbWV0aGluZyBuaWNlOyBsb2cgYW4gZXJyb3IgKi8KLQlyZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgfQotCi0gICAgLyogMjUxOCByZXF1aXJlcyB0aGUgZW50aXJlIGxvY2sgdG8gYmUgcmVtb3ZlZCBpZiByZXNvdXJjZS9sb2NrdG9rZW4KLSAgICAgKiBwb2ludCB0byBhbiBpbmRpcmVjdCBsb2NrLiAgV2UgbmVlZCByZXNvdXJjZSBvZiB0aGUgX2RpcmVjdF8KLSAgICAgKiBsb2NrIGluIG9yZGVyIHRvIHdhbGsgZG93biB0aGUgdHJlZSBhbmQgcmVtb3ZlIHRoZSBsb2Nrcy4gIFNvLAotICAgICAqIElmIGxvY2t0b2tlbiAhPSBudWxsX2xvY2t0b2tlbiwgCi0gICAgICogICAgV2FsayB1cCB0aGUgcmVzb3VyY2UgaGllcmFyY2h5IHVudGlsIHdlIHNlZSBhIGRpcmVjdCBsb2NrLgotICAgICAqICAgIE9yLCB3ZSBjb3VsZCBnZXQgdGhlIGRpcmVjdCBsb2NrJ3MgZGIva2V5LCBwaWNrIG91dCB0aGUgVVJMCi0gICAgICogICAgYW5kIGRvIGEgc3VicmVxdWVzdC4gIEkgdGhpbmsgd2Fsa2luZyB1cCBpcyBmYXN0ZXIgYW5kIHdpbGwgd29yawotICAgICAqICAgIGFsbCB0aGUgdGltZS4KLSAgICAgKiBFbHNlCi0gICAgICogICAgSnVzdCBzdGFydCByZW1vdmluZyBhbGwgbG9ja3MgYXQgYW5kIGJlbG93IHJlc291cmNlLgotICAgICAqLwotCi0gICAgaWYgKChlcnIgPSAoKmhvb2tzLT5vcGVuX2xvY2tkYikociwgMCwgMSwgJmxvY2tkYikpICE9IE5VTEwpIHsKLQkvKiAjIyMgcmV0dXJuIGVyciEgbWF5YmUgYWRkIGEgaGlnaGVyLWxldmVsIGRlc2MgKi8KLQkvKiAjIyMgbWFwIHJlc3VsdCB0byBzb21ldGhpbmcgbmljZTsgbG9nIGFuIGVycm9yICovCi0JcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgIH0KLQotICAgIGlmIChsb2NrdG9rZW4gIT0gTlVMTAotCSYmIChlcnIgPSBkYXZfZ2V0X2RpcmVjdF9yZXNvdXJjZShyLT5wb29sLCBsb2NrZGIsCi0JCQkJCSAgbG9ja3Rva2VuLCByZXNvdXJjZSwKLQkJCQkJICAmbG9ja19yZXNvdXJjZSkpICE9IE5VTEwpIHsKLQkvKiAjIyMgYWRkIGEgaGlnaGVyLWxldmVsIGRlc2M/ICovCi0JLyogIyMjIHNob3VsZCByZXR1cm4gZXJyISAqLwotCXJldHVybiBlcnItPnN0YXR1czsKLSAgICB9Ci0KLSAgICAvKiBBdCB0aGlzIHBvaW50LCBsb2NrX3Jlc291cmNlL2xvY2t0b2tlbiByZWZlcnMgdG8gYSBkaXJlY3QgbG9jayAoa2V5KSwgaWUKLSAgICAgKiB0aGUgcm9vdCBvZiBhIGRlcHRoID4gMCBsb2NrLCBvciBsb2NrdG9rZW4gaXMgbnVsbC4KLSAgICAgKi8KLSAgICBpZiAoKGVyciA9ICgqaG9va3MtPnJlbW92ZV9sb2NrKShsb2NrZGIsIGxvY2tfcmVzb3VyY2UsCi0JCQkJICAgICBsb2NrdG9rZW4pKSAhPSBOVUxMKSB7Ci0JLyogIyMjIGFkZCBhIGhpZ2hlci1sZXZlbCBkZXNjPyAqLwotCS8qICMjIyByZXR1cm4gZXJyISAqLwotCXJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAobG9ja19yZXNvdXJjZS0+Y29sbGVjdGlvbikgewotCWRhdl93YWxrZXJfY3R4IGN0eCA9IHsgMCB9OwotCi0JY3R4LndhbGtfdHlwZSA9IERBVl9XQUxLVFlQRV9BTEwgfCBEQVZfV0FMS1RZUEVfTE9DS05VTEw7Ci0JY3R4LnBvc3RmaXggPSAwOwotCWN0eC5mdW5jID0gZGF2X3VubG9ja193YWxrZXI7Ci0JY3R4LnBvb2wgPSByLT5wb29sOwotICAgICAgICBjdHgucmVzb3VyY2UgPSBsb2NrX3Jlc291cmNlOwotCWN0eC5yID0gcjsKLQljdHgubG9ja2RiID0gbG9ja2RiOwotCWN0eC5sb2NrdG9rZW4gPSBsb2NrdG9rZW47Ci0KLQlkYXZfYnVmZmVyX2luaXQoci0+cG9vbCwgJmN0eC51cmksIGxvY2tfcmVzb3VyY2UtPnVyaSk7Ci0KLQllcnIgPSAoKnJlcG9zX2hvb2tzLT53YWxrKSgmY3R4LCBEQVZfSU5GSU5JVFkpOwotCi0JLyogIyMjIGZpeCB0aGlzISAqLwotCXJlc3VsdCA9IGVyciA9PSBOVUxMID8gT0sgOiBlcnItPnN0YXR1czsKLSAgICB9Ci0gICAgZWxzZQotCXJlc3VsdCA9IE9LOwotCi0gICAgKCpob29rcy0+Y2xvc2VfbG9ja2RiKShsb2NrZGIpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogZGF2X2luaGVyaXRfd2Fsa2VyOiAgV2Fsa2VyIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGluaGVyaXQgbG9ja3MgKi8KLXN0YXRpYyBkYXZfZXJyb3IgKiBkYXZfaW5oZXJpdF93YWxrZXIoZGF2X3dhbGtlcl9jdHggKmN0eCwgaW50IGNhbGx0eXBlKQotewotICAgIGlmIChjdHgtPnNraXBfcm9vdAotCSYmICgqY3R4LT5yZXNvdXJjZS0+aG9va3MtPmlzX3NhbWVfcmVzb3VyY2UpKGN0eC0+cmVzb3VyY2UsCi0JCQkJCQkgICAgIGN0eC0+cm9vdCkpIHsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvKiAjIyMgbWF5YmUgYWRkIGEgaGlnaGVyLWxldmVsIGRlc2MgKi8KLSAgICByZXR1cm4gKCpjdHgtPmxvY2tkYi0+aG9va3MtPmFwcGVuZF9sb2NrcykoY3R4LT5sb2NrZGIsIGN0eC0+cmVzb3VyY2UsIDEsCi0JCQkJCSAgICAgICBjdHgtPmxvY2spOwotfQotCi0vKgotKiogZGF2X2luaGVyaXRfbG9ja3M6ICBXaGVuIGEgcmVzb3VyY2Ugb3IgY29sbGVjdGlvbiBpcyBhZGRlZCB0byBhIGNvbGxlY3Rpb24sCi0qKiAgICBsb2NrcyBvbiB0aGUgY29sbGVjdGlvbiBzaG91bGQgYmUgaW5oZXJpdGVkIHRvIHRoZSByZXNvdXJjZS9jb2xsZWN0aW9uLgotKiogICAgKE1PVkUsIE1LQ09MLCBldGMpIEhlcmUgd2UgcHJvcGFnYXRlIGFueSBkaXJlY3Qgb3IgaW5kaXJlY3QgbG9ja3MgZnJvbQotKiogICAgcGFyZW50IG9mIHJlc291cmNlIHRvIHJlc291cmNlIGFuZCBiZWxvdy4KLSovCi1zdGF0aWMgZGF2X2Vycm9yICogZGF2X2luaGVyaXRfbG9ja3MocmVxdWVzdF9yZWMgKnIsIGRhdl9sb2NrZGIgKmxvY2tkYiwKLQkJCQkgICAgIGNvbnN0IGRhdl9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkJICAgICBpbnQgdXNlX3BhcmVudCkKLXsKLSAgICBkYXZfZXJyb3IgKmVycjsKLSAgICBjb25zdCBkYXZfcmVzb3VyY2UgKndoaWNoX3Jlc291cmNlOwotICAgIGRhdl9sb2NrICpsb2NrczsKLSAgICBkYXZfbG9jayAqc2NhbjsKLSAgICBkYXZfbG9jayAqcHJldjsKLSAgICBkYXZfd2Fsa2VyX2N0eCBjdHggPSB7IDAgfTsKLSAgICBjb25zdCBkYXZfaG9va3NfcmVwb3NpdG9yeSAqcmVwb3NfaG9va3MgPSByZXNvdXJjZS0+aG9va3M7Ci0KLSAgICBpZiAodXNlX3BhcmVudCkgewotCXdoaWNoX3Jlc291cmNlID0gKCpyZXBvc19ob29rcy0+Z2V0X3BhcmVudF9yZXNvdXJjZSkocmVzb3VyY2UpOwotCWlmICh3aGljaF9yZXNvdXJjZSA9PSBOVUxMKSB7Ci0JICAgIC8qICMjIyBtYXAgcmVzdWx0IHRvIHNvbWV0aGluZyBuaWNlOyBsb2cgYW4gZXJyb3IgKi8KLQkgICAgcmV0dXJuIGRhdl9uZXdfZXJyb3Ioci0+cG9vbCwgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsIDAsCi0JCQkJICJDb3VsZCBub3QgZmV0Y2ggcGFyZW50IHJlc291cmNlLiBVbmFibGUgdG8gIgotCQkJCSAiaW5oZXJpdCBsb2NrcyBmcm9tIHRoZSBwYXJlbnQgYW5kIGFwcGx5ICIKLQkJCQkgInRoZW0gdG8gdGhpcyByZXNvdXJjZS4iKTsKLQl9Ci0gICAgfQotICAgIGVsc2UgewotCXdoaWNoX3Jlc291cmNlID0gcmVzb3VyY2U7Ci0gICAgfQotCi0gICAgaWYgKChlcnIgPSAoKmxvY2tkYi0+aG9va3MtPmdldF9sb2NrcykobG9ja2RiLCB3aGljaF9yZXNvdXJjZSwKLQkJCQkJICAgREFWX0dFVExPQ0tTX1BBUlRJQUwsCi0JCQkJCSAgICZsb2NrcykpICE9IE5VTEwpIHsKLQkvKiAjIyMgbWF5YmUgYWRkIGEgaGlnaGVyLWxldmVsIGRlc2MgKi8KLQlyZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChsb2NrcyA9PSBOVUxMKSB7Ci0JLyogTm8gbG9ja3MgdG8gcHJvcGFnYXRlLCBqdXN0IHJldHVybiAqLwotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8qCi0gICAgKiogKDEpIENvcHkgYWxsIGluZGlyZWN0IGxvY2tzIGZyb20gb3VyIHBhcmVudDsKLSAgICAqKiAoMikgQ3JlYXRlIGluZGlyZWN0IGxvY2tzIGZvciB0aGUgZGVwdGggaW5maW5pdHksIGRpcmVjdCBsb2NrcwotICAgICoqICAgICBpbiBvdXIgcGFyZW50LgotICAgICoqCi0gICAgKiogVGhlIGFwcGVuZF9sb2NrcyBjYWxsIGluIHRoZSB3YWxrZXIgY2FsbGJhY2sgd2lsbCBkbyB0aGUgaW5kaXJlY3QKLSAgICAqKiBjb252ZXJzaW9uLCBidXQgd2UgbmVlZCB0byByZW1vdmUgYW55IGRpcmVjdCBsb2NrcyB0aGF0IGFyZSBOT1QKLSAgICAqKiBkZXB0aCAiaW5maW5pdHkiLgotICAgICovCi0gICAgZm9yIChzY2FuID0gbG9ja3MsIHByZXYgPSBOVUxMOwotCSBzY2FuICE9IE5VTEw7Ci0JIHByZXYgPSBzY2FuLCBzY2FuID0gc2Nhbi0+bmV4dCkgewotCi0JaWYgKHNjYW4tPnJlY3R5cGUgPT0gREFWX0xPQ0tSRUNfRElSRUNUCi0JICAgICYmIHNjYW4tPmRlcHRoICE9IERBVl9JTkZJTklUWSkgewotCi0JICAgIGlmIChwcmV2ID09IE5VTEwpCi0JCWxvY2tzID0gc2Nhbi0+bmV4dDsKLQkgICAgZWxzZQotCQlwcmV2LT5uZXh0ID0gc2Nhbi0+bmV4dDsKLQl9Ci0gICAgfQotCi0gICAgLyogPGxvY2tzPiBoYXMgYWxsIG91ciBuZXcgbG9ja3MuICBXYWxrIGRvd24gYW5kIHByb3BhZ2F0ZSB0aGVtLiAqLwotCi0gICAgY3R4LndhbGtfdHlwZSA9IERBVl9XQUxLVFlQRV9BTEwgfCBEQVZfV0FMS1RZUEVfTE9DS05VTEw7Ci0gICAgY3R4LnBvc3RmaXggPSAwOwotICAgIGN0eC5mdW5jID0gZGF2X2luaGVyaXRfd2Fsa2VyOwotICAgIGN0eC5wb29sID0gci0+cG9vbDsKLSAgICBjdHgucmVzb3VyY2UgPSByZXNvdXJjZTsKLSAgICBjdHguciA9IHI7Ci0gICAgY3R4LmxvY2tkYiA9IGxvY2tkYjsKLSAgICBjdHgubG9jayA9IGxvY2tzOwotICAgIGN0eC5za2lwX3Jvb3QgPSAhdXNlX3BhcmVudDsKLQotICAgIGRhdl9idWZmZXJfaW5pdChyLT5wb29sLCAmY3R4LnVyaSwgcmVzb3VyY2UtPnVyaSk7Ci0KLSAgICByZXR1cm4gKCpyZXBvc19ob29rcy0+d2FsaykoJmN0eCwgREFWX0lORklOSVRZKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qKgotKiogRnVuY3Rpb25zIGRlYWxpbmcgd2l0aCBsb2NrLW51bGwgcmVzb3VyY2VzCi0qKgotKi8KLQotLyoKLSoqIGRhdl9nZXRfcmVzb3VyY2Vfc3RhdGU6ICBSZXR1cm5zIHRoZSBzdGF0ZSBvZiB0aGUgcmVzb3VyY2UKLSoqICAgIHItPmZpbGVuYW1lOiAgREFWX1JFU09VUkNFX05VTEwsIERBVl9SRVNPVVJDRV9MT0NLX05VTEwsCi0qKiAgICBvciBEQVZfUkVTT1VSQ0VfRVhJU1QuCi0qKgotKiogICAgUmV0dXJucyBEQVZfUkVTT1VSQ0VfRVJST1IgaWYgYW4gZXJyb3Igb2NjdXJzLgotKi8KLWludCBkYXZfZ2V0X3Jlc291cmNlX3N0YXRlKHJlcXVlc3RfcmVjICpyLCBjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlKQotewotICAgIGNvbnN0IGRhdl9ob29rc19sb2NrcyAqaG9va3MgPSBEQVZfR0VUX0hPT0tTX0xPQ0tTKHIpOwotCi0gICAgaWYgKHJlc291cmNlLT5leGlzdHMpCi0JcmV0dXJuIERBVl9SRVNPVVJDRV9FWElTVFM7Ci0KLSAgICBpZiAoaG9va3MgIT0gTlVMTCkgewotCWRhdl9lcnJvciAqZXJyOwotCWRhdl9sb2NrZGIgKmxvY2tkYjsKLQlpbnQgbG9ja3NfcHJlc2VudDsKLQotCS8qCi0JKiogQSBsb2NrbnVsbCByZXNvdXJjZSBoYXMgdGhlIGZvcm06Ci0JKioKLQkqKiAgIGtub3duLWRpciAiLyIgbG9ja251bGwtZmlsZQotCSoqCi0JKiogSXQgd291bGQgYmUgbmljZSB0byBsb29rIGludG8gPHJlc291cmNlPiB0byB2ZXJpZnkgdGhpcyBmb3JtLAotCSoqIGJ1dCBpdCBkb2VzIG5vdCBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiBmb3IgdXMuIEluc3RlYWQsIHdlCi0JKiogY2FuIGxvb2sgYXQgdGhlIHBhdGhfaW5mby4gSWYgdGhlIGZvcm0gZG9lcyBub3QgbWF0Y2gsIHRoZW4KLQkqKiB0aGVyZSBpcyBubyB3YXkgd2UgY291bGQgaGF2ZSBhIGxvY2tudWxsIHJlc291cmNlIC0tIGl0IG11c3QKLQkqKiBiZSBhIHBsYWluLCBudWxsIHJlc291cmNlLgotCSoqCi0JKiogQXBhY2hlIHNldHMgci0+ZmlsZW5hbWUgdG8ga25vd24tZGlyL3Vua25vd24tZmlsZSBhbmQgci0+cGF0aF9pbmZvCi0JKiogdG8gIiIgZm9yIHRoZSAicHJvcGVyIiBjYXNlLiBJZiBhbnl0aGluZyBpcyBpbiBwYXRoX2luZm8sIHRoZW4KLQkqKiBpdCBjYW4ndCBiZSBhIGxvY2tudWxsIHJlc291cmNlLgotCSoqCi0JKiogIyMjIEkgYmV0IHRoaXMgcGF0aF9pbmZvIGhhY2sgZG9lc24ndCB3b3JrIGZvciByZXBvc2l0b3JpZXMuCi0JKiogIyMjIE5lZWQgaW5wdXQgZnJvbSByZXBvc2l0b3J5IGltcGxlbWVudG9ycyEgV2hhdCBraW5kIG9mCi0JKiogIyMjIHJlc3RydWN0dXJlIGRvIHdlIG5lZWQ/IE5ldyBwcm92aWRlciBBUElzPwotCSovCi0JaWYgKHItPnBhdGhfaW5mbyAhPSBOVUxMICYmICpyLT5wYXRoX2luZm8gIT0gJ1wwJykgewotCSAgICByZXR1cm4gREFWX1JFU09VUkNFX05VTEw7Ci0JfQotCQotICAgICAgICBpZiAoKGVyciA9ICgqaG9va3MtPm9wZW5fbG9ja2RiKShyLCAxLCAxLCAmbG9ja2RiKSkgPT0gTlVMTCkgewotCSAgICAvKiBub3RlIHRoYXQgd2UgbWlnaHQgc2VlIHNvbWUgZXhwaXJlZCBsb2Nrcy4uLiAqc2hydWcqICovCi0JICAgIGVyciA9ICgqaG9va3MtPmhhc19sb2NrcykobG9ja2RiLCByZXNvdXJjZSwgJmxvY2tzX3ByZXNlbnQpOwotCSAgICAoKmhvb2tzLT5jbG9zZV9sb2NrZGIpKGxvY2tkYik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXJyICE9IE5VTEwpIHsKLQkgICAgLyogIyMjIGRvbid0IGxvZyBhbiBlcnJvci4gcmV0dXJuIGVyci4gYWRkIGhpZ2hlci1sZXZlbCBkZXNjLiAqLwotCi0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSIHwgQVBMT0dfTk9FUlJOTywgciwKLQkJICAgICAgICAgICJGYWlsZWQgdG8gcXVlcnkgbG9jay1udWxsIHN0YXR1cyBmb3IgJXMiLAotCQkJICByLT5maWxlbmFtZSk7Ci0KLQkgICAgcmV0dXJuIERBVl9SRVNPVVJDRV9FUlJPUjsKLSAgICAgICAgfQotCi0JaWYgKGxvY2tzX3ByZXNlbnQpCi0JICAgIHJldHVybiBEQVZfUkVTT1VSQ0VfTE9DS19OVUxMOwotICAgIH0KLQotICAgIHJldHVybiBEQVZfUkVTT1VSQ0VfTlVMTDsKLX0KLQotZGF2X2Vycm9yICogZGF2X25vdGlmeV9jcmVhdGVkKHJlcXVlc3RfcmVjICpyLAotCQkJICAgICAgIGRhdl9sb2NrZGIgKmxvY2tkYiwKLQkJCSAgICAgICBjb25zdCBkYXZfcmVzb3VyY2UgKnJlc291cmNlLAotCQkJICAgICAgIGludCByZXNvdXJjZV9zdGF0ZSwKLQkJCSAgICAgICBpbnQgZGVwdGgpCi17Ci0gICAgZGF2X2Vycm9yICplcnI7Ci0KLSAgICBpZiAocmVzb3VyY2Vfc3RhdGUgPT0gREFWX1JFU09VUkNFX0xPQ0tfTlVMTCkgewotCi0JLyoKLQkqKiBUaGUgcmVzb3VyY2UgaXMgbm8gbG9uZ2VyIGEgbG9ja251bGwgcmVzb3VyY2UuIFRoaXMgd2lsbCByZW1vdmUKLQkqKiB0aGUgc3BlY2lhbCBtYXJrZXIuCi0JKioKLQkqKiBOb3RlIHRoYXQgYSBsb2NrbnVsbCByZXNvdXJjZSBoYXMgYWxyZWFkeSBpbmhlcml0ZWQgYWxsIG9mIHRoZQotCSoqIGxvY2tzIGZyb20gdGhlIHBhcmVudC4gV2UgZG8gbm90IG5lZWQgdG8gY2FsbCBkYXZfaW5oZXJpdF9sb2Nrcy4KLQkqKgotCSoqIE5PVEU6IHNvbWUgbG9jayBwcm92aWRlcnMgcmVjb3JkIGxvY2tzIGZvciBsb2NrbnVsbCByZXNvdXJjZXMgdXNpbmcKLQkqKiAgICAgICBhIGRpZmZlcmVudCBrZXkgdGhhbiBmb3IgcmVndWxhciByZXNvdXJjZXMuIHRoaXMgd2lsbCBzaGlmdAotCSoqICAgICAgIHRoZSBsb2NrIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIHR3byBrZXkgdHlwZXMuCi0JKi8KLQkodm9pZCkoKmxvY2tkYi0+aG9va3MtPnJlbW92ZV9sb2NrbnVsbF9zdGF0ZSkobG9ja2RiLCByZXNvdXJjZSk7Ci0KLQkvKgotCSoqIFRoZXJlIGFyZSByZXNvdXJjZXMgdW5kZXIgdGhpcyBvbmUsIHdoaWNoIGFyZSBuZXcuIFdlIG11c3QKLQkqKiBwcm9wYWdhdGUgdGhlIGxvY2tzIGRvd24gdG8gdGhlIG5ldyByZXNvdXJjZXMuCi0JKi8KLQlpZiAoZGVwdGggPiAwICYmCi0JICAgIChlcnIgPSBkYXZfaW5oZXJpdF9sb2NrcyhyLCBsb2NrZGIsIHJlc291cmNlLCAwKSkgIT0gTlVMTCkgewotCSAgICAvKiAjIyMgYWRkIGEgaGlnaGVyIGxldmVsIGRlc2M/ICovCi0JICAgIHJldHVybiBlcnI7Ci0JfQotICAgIH0KLSAgICBlbHNlIGlmIChyZXNvdXJjZV9zdGF0ZSA9PSBEQVZfUkVTT1VSQ0VfTlVMTCkgewotCi0JLyogIyMjIHNob3VsZCBwYXNzIGRlcHRoIHRvIGRhdl9pbmhlcml0X2xvY2tzIHNvIHRoYXQgaXQgY2FuCi0JKiogIyMjIG9wdGltaXplIGZvciB0aGUgZGVwdGg9PTAgY2FzZS4KLQkqLwotCi0JLyogdGhpcyByZXNvdXJjZSBzaG91bGQgaW5oZXJpdCBsb2NrcyBmcm9tIGl0cyBwYXJlbnQgKi8KLQlpZiAoKGVyciA9IGRhdl9pbmhlcml0X2xvY2tzKHIsIGxvY2tkYiwgcmVzb3VyY2UsIDEpKSAhPSBOVUxMKSB7Ci0KLQkgICAgZXJyID0gZGF2X3B1c2hfZXJyb3Ioci0+cG9vbCwgZXJyLT5zdGF0dXMsIDAsCi0JCQkJICJUaGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LCBidXQgIgotCQkJCSAidGhlcmUgd2FzIGEgcHJvYmxlbSBpbmhlcml0aW5nIGxvY2tzIGZyb20gIgotCQkJCSAidGhlIHBhcmVudCByZXNvdXJjZS4iLAotCQkJCSBlcnIpOwotCSAgICByZXR1cm4gZXJyOwotCX0KLSAgICB9Ci0gICAgLyogZWxzZSB0aGUgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgYW5kIGl0cyBsb2NrcyBhcmUgY29ycmVjdC4gKi8KLQotICAgIHJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9lY2hvLy5jdnNpZ25vcmUgYi9tb2R1bGVzL2VjaG8vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJmN2E3MC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2VjaG8vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS5kZXBzCi0ubGlicwotKi5sYQotbW9kdWxlcy5tawotTWFrZWZpbGUKLSoubG8KLSouc2xvCi0qLnNvCi0qLmRsbAotKi5kZWYKZGlmZiAtLWdpdCBhL21vZHVsZXMvZWNoby8uaW5kZW50LnBybyBiL21vZHVsZXMvZWNoby8uaW5kZW50LnBybwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlmYmU5Zi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2VjaG8vLmluZGVudC5wcm8KKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0taTQgLW5wc2wgLWRpMCAtYnIgLW5jZSAtZDAgLWNsaTAgLW5wY3MgLW5mYzEKLS1UQlVGRgotLVRGSUxFCi0tVFRSQU5TCi0tVFVJTlQ0Ci0tVF90cmFucwotLVRhbGxvd19vcHRpb25zX3QKLS1UYXBhY2hlX3NmaW8KLS1UYXJyYXlfaGVhZGVyCi0tVGJvb2xfaW50Ci0tVGJ1Zl9hcmVhCi0tVGJ1ZmZfc3RydWN0Ci0tVGJ1ZmZ5Ci0tVGNtZF9ob3cKLS1UY21kX3Bhcm1zCi0tVGNvbW1hbmRfcmVjCi0tVGNvbW1hbmRfc3RydWN0Ci0tVGNvbm5fcmVjCi0tVGNvcmVfZGlyX2NvbmZpZwotLVRjb3JlX3NlcnZlcl9jb25maWcKLS1UZGlyX21ha2VyX2Z1bmMKLS1UZXZlbnQKLS1UZ2xvYmFsc19zCi0tVGhhbmRsZXJfZnVuYwotLVRoYW5kbGVyX3JlYwotLVRqb2JsaXN0X3MKLS1UbGlzdGVuX3JlYwotLVRtZXJnZXJfZnVuYwotLVRtb2RlX3QKLS1UbW9kdWxlCi0tVG1vZHVsZV9zdHJ1Y3QKLS1UbXV0ZXgKLS1Ubl9sb25nCi0tVG90aGVyX2NoaWxkX3JlYwotLVRvdmVycmlkZXNfdAotLVRwYXJlbnRfc2NvcmUKLS1UcGlkX3QKLS1UcGlwZWRfbG9nCi0tVHBvb2wKLS1UcmVxdWVzdF9yZWMKLS1UcmVxdWlyZV9saW5lCi0tVHJsaW1fdAotLVRzY29yZWJvYXJkCi0tVHNlbWFwaG9yZQotLVRzZXJ2ZXJfYWRkcl9yZWMKLS1Uc2VydmVyX3JlYwotLVRzZXJ2ZXJfcmVjX2NoYWluCi0tVHNob3J0X3Njb3JlCi0tVHRhYmxlCi0tVHRhYmxlX2VudHJ5Ci0tVHRocmVhZAotLVR1X3dpZGVfaW50Ci0tVHZ0aW1lX3QKLS1Ud2lkZV9pbnQKZGlmZiAtLWdpdCBhL21vZHVsZXMvZWNoby9NYWtlZmlsZS5pbiBiL21vZHVsZXMvZWNoby9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY3YjM0My4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2VjaG8vTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotaW5jbHVkZSAkKHRvcF9zcmNkaXIpL2J1aWxkL3NwZWNpYWwubWsKLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9lY2hvL05XR05VbWFrZWZpbGUgYi9tb2R1bGVzL2VjaG8vTldHTlVtYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjMzczNC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2VjaG8vTldHTlVtYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0jCi0jIERlY2xhcmUgdGhlIHN1Yi1kaXJlY3RvcmllcyB0byBiZSBidWlsdCBoZXJlCi0jCi0KLVNVQkRJUlMgPSBcCi0JJChFT0xJU1QpIAotCi0jCi0jIEdldCB0aGUgJ2hlYWQnIG9mIHRoZSBidWlsZCBlbnZpcm9ubWVudC4gIFRoaXMgaW5jbHVkZXMgZGVmYXVsdCB0YXJnZXRzIGFuZAotIyBwYXRocyB0byB0b29scwotIwotCi1pbmNsdWRlICQoQVBfV09SSylcYnVpbGRcTldHTlVoZWFkLmluYwotCi0jCi0jIGJ1aWxkIHRoaXMgbGV2ZWwncyBmaWxlcwotCi0jCi0jIE1ha2Ugc3VyZSBhbGwgbmVlZGVkIG1hY3JvJ3MgYXJlIGRlZmluZWQKLSMKLQotIwotIyBUaGVzZSBkaXJlY3RvcmllcyB3aWxsIGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGluY2x1ZGUgbGlzdCwgZm9sbG93ZWQgYnkKLSMgSU5DRElSUwotIwotWElOQ0RJUlMJKz0gXAotCQkJJChBUF9XT1JLKS9pbmNsdWRlIFwKLQkJCSQoTldPUykgXAotCQkJJChBUF9XT1JLKS9tb2R1bGVzL2FyY2gvbmV0d2FyZSBcCi0JCQkkKEFQX1dPUkspL3NyY2xpYi9hcHIvaW5jbHVkZSBcCi0JCQkkKEFQX1dPUkspL3NyY2xpYi9hcHItdXRpbC9pbmNsdWRlIFwKLQkJCSQoQVBfV09SSykvc3JjbGliL2FwciBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBmbGFncyB3aWxsIGNvbWUgYWZ0ZXIgQ0ZMQUdTCi0jCi1YQ0ZMQUdTCQkrPSBcCi0JCQktcHJlZml4IHByZV9udy5oIFwKLQkJCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGRlZmluZXMgd2lsbCBjb21lIGFmdGVyIERFRklORVMKLSMKLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGZsYWdzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpbmsub3B0IGZpbGUKLSMKLVhMRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIHZhbHVlcyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBjb3JyZWN0IHZhcmlhYmxlcyBiYXNlZCBvbiB0aGUgdmFsdWUgb2YKLSMgUkVMRUFTRQotIwotaWZlcSAiJChSRUxFQVNFKSIgImRlYnVnIgotWElOQ0RJUlMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhDRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YREVGSU5FUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWExGTEFHUwkJKz0gXAotCQkgICAJJChFT0xJU1QpCi1lbmRpZgotCi1pZmVxICIkKFJFTEVBU0UpIiAibm9vcHQiCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCSAgIAkkKEVPTElTVCkKLWVuZGlmCi0KLWlmZXEgIiQoUkVMRUFTRSkiICJyZWxlYXNlIgotWElOQ0RJUlMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhDRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YREVGSU5FUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWExGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi1lbmRpZgotCi0jCi0jIFRoZXNlIGFyZSB1c2VkIGJ5IHRoZSBsaW5rIHRhcmdldCBpZiBhbiBOTE0gaXMgYmVpbmcgZ2VuZXJhdGVkCi0jIFRoaXMgaXMgdXNlZCBieSB0aGUgbGluayAnbmFtZScgZGlyZWN0aXZlIHRvIG5hbWUgdGhlIG5sbS4gIElmIGxlZnQgYmxhbmsKLSMgVEFSR0VUX25sbSAoc2VlIGJlbG93KSB3aWxsIGJlIHVzZWQuCi0jCi1OTE1fTkFNRQkJPSBlY2hvCi0KLSMKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rICctZGVzYyAnIGRpcmVjdGl2ZS4gCi0jIElmIGxlZnQgYmxhbmssIE5MTV9OQU1FIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9ERVNDUklQVElPTgk9IEVjaG8gTW9kdWxlCi0KLSMKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSAnLXRocmVhZG5hbWUnIGRpcmVjdGl2ZS4gIElmIGxlZnQgYmxhbmssCi0jIE5MTV9OQU1FIFRocmVhZCB3aWxsIGJlIHVzZWQuCi0jCi1OTE1fVEhSRUFEX05BTUUJPSBFY2hvIE1vZHVsZQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlIFZFUlNJT04gdmFsdWUgaW4gCi0jICQoQVBfV09SSylcYnVpbGRcTldHTlVlbnZpcm9ubWVudC5pbmMKLSMKLU5MTV9WRVJTSU9OCQk9Ci0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgb2YgNjRLCi0jCi1OTE1fU1RBQ0tfU0laRQk9IDgxOTIKLQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWVudHJ5JyBkaXJlY3RpdmUKLSMKLU5MTV9FTlRSWV9TWU0JPSBfTGliQ1ByZWx1ZGUKLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1leGl0JyBkaXJlY3RpdmUKLSMKLU5MTV9FWElUX1NZTQk9IF9MaWJDUG9zdGx1ZGUKLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1jaGVjaycgZGlyZWN0aXZlCi0jCi1OTE1fQ0hFQ0tfU1lNCT0KLQotIwotIyBJZiB0aGVzZSBhcmUgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWZsYWdzJyBkaXJlY3RpdmUKLSMKLU5MTV9GTEFHUwkJPSAgQVVUT1VOTE9BRCwgUFNFVURPUFJFRU1QVElPTgotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgbGlua2VkIGluIHdpdGggdGhlIFhEQ0RhdGEgb3B0aW9uIGluIHRoZSBkZWYgCi0jIGZpbGUgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBvZiAkKE5XT1MpL2FwYWNoZS54ZGMuICBYRENEYXRhIGNhbiBiZSBkaXNhYmxlZAotIyBieSBzZXR0aW5nIEFQQUNIRV9VTklQUk9DIGluIHRoZSBlbnZpcm9ubWVudAotIwotWERDREFUQSAgICAgICAgID0gCi0KLSMKLSMgSWYgdGhlcmUgaXMgYW4gTkxNIHRhcmdldCwgcHV0IGl0IGhlcmUKLSMKLVRBUkdFVF9ubG0gPSBcCi0JJChPQkpESVIpL2VjaG8ubmxtIFwKLQkkKEVPTElTVCkKLQotIwotIyBJZiB0aGVyZSBpcyBhbiBMSUIgdGFyZ2V0LCBwdXQgaXQgaGVyZQotIwotVEFSR0VUX2xpYiA9IFwKLQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBhcmUgdGhlIE9CSiBmaWxlcyBuZWVkZWQgdG8gY3JlYXRlIHRoZSBOTE0gdGFyZ2V0IGFib3ZlLgotIyBQYXRocyBtdXN0IGFsbCB1c2UgdGhlICcvJyBjaGFyYWN0ZXIKLSMKLUZJTEVTX25sbV9vYmpzID0gXAotCSQoT0JKRElSKS9tb2RfZWNoby5vIFwKLQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBhcmUgdGhlIExJQiBmaWxlcyBuZWVkZWQgdG8gY3JlYXRlIHRoZSBOTE0gdGFyZ2V0IGFib3ZlLgotIyBUaGVzZSB3aWxsIGJlIGFkZGVkIGFzIGEgbGlicmFyeSBjb21tYW5kIGluIHRoZSBsaW5rLm9wdCBmaWxlLgotIwotRklMRVNfbmxtX2xpYnMgPSBcCi0gICAJbGliY3ByZS5vIFwKLQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBhcmUgdGhlIG1vZHVsZXMgdGhhdCB0aGUgYWJvdmUgTkxNIHRhcmdldCBkZXBlbmRzIG9uIHRvIGxvYWQuCi0jIFRoZXNlIHdpbGwgYmUgYWRkZWQgYXMgYSBtb2R1bGUgY29tbWFuZCBpbiB0aGUgbGluay5vcHQgZmlsZS4KLSMKLUZJTEVTX25sbV9tb2R1bGVzID0gXAotCWFwcmxpYiBcCi0JbGliYyBcCi0JJChFT0xJU1QpCi0KLSMKLSMgSWYgdGhlIG5sbSBoYXMgYSBtc2cgZmlsZSwgcHV0IGl0J3MgcGF0aCBoZXJlCi0jCi1GSUxFX25sbV9tc2cgPQotIAotIwotIyBJZiB0aGUgbmxtIGhhcyBhIGhscCBmaWxlIHB1dCBpdCdzIHBhdGggaGVyZQotIwotRklMRV9ubG1faGxwID0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSAkKE5XT1MpXGNvcHlyaWdodC50eHQuCi0jCi1GSUxFX25sbV9jb3B5cmlnaHQgPQotCi0jCi0jIEFueSBhZGRpdGlvbmFsIGltcG9ydHMgZ28gaGVyZQotIwotRklMRVNfbmxtX1hpbXBvcnRzID0gXAotCUAkKEFQUikvYXBybGliLmltcCBcCi0JQCQoTldPUykvaHR0cGQuaW1wIFwKLQlAbGliYy5pbXAgXAotCSQoRU9MSVNUKQotIAotIyAgIAotIyBBbnkgc3ltYm9scyBleHBvcnRlZCB0byBoZXJlCi0jCi1GSUxFU19ubG1fZXhwb3J0cyA9IFwKLQllY2hvX21vZHVsZSBcCi0JJChFT0xJU1QpCi0JCi0jICAgCi0jIFRoZXNlIGFyZSB0aGUgT0JKIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIExJQiB0YXJnZXQgYWJvdmUuCi0jIFBhdGhzIG11c3QgYWxsIHVzZSB0aGUgJy8nIGNoYXJhY3RlcgotIwotRklMRVNfbGliX29ianMgPSBcCi0JCSQoRU9MSVNUKQotCi0jCi0jIGltcGxlbWVudCB0YXJnZXRzIGFuZCBkZXBlbmRhbmNpZXMgKGxlYXZlIHRoaXMgc2VjdGlvbiBhbG9uZSkKLSMKLQotbGlicyA6OiAkKE9CSkRJUikgJChUQVJHRVRfbGliKQotCi1ubG1zIDo6IGxpYnMgJChUQVJHRVRfbmxtKQotCi0jCi0jIFVwZGF0ZWQgdGhpcyB0YXJnZXQgdG8gY3JlYXRlIG5lY2Vzc2FyeSBkaXJlY3RvcmllcyBhbmQgY29weSBmaWxlcyB0byB0aGUgCi0jIGNvcnJlY3QgcGxhY2UuICAoU2VlICQoQVBfV09SSylcYnVpbGRcTldHTlVoZWFkLmluYyBmb3IgZXhhbXBsZXMpCi0jCi1pbnN0YWxsIDo6IG5sbXMgRk9SQ0UKLQljb3B5ICQoT0JKRElSKVwqLm5sbSAkKElOU1RBTEwpXEFwYWNoZTJcbW9kdWxlc1wqLioKLQotIwotIyBBbnkgc3BlY2lhbGl6ZWQgcnVsZXMgaGVyZQotIwotCi0jCi0jIEluY2x1ZGUgdGhlICd0YWlsJyBtYWtlZmlsZSB0aGF0IGhhcyB0YXJnZXRzIHRoYXQgZGVwZW5kIG9uIHZhcmlhYmxlcyBkZWZpbmVkCi0jIGluIHRoaXMgbWFrZWZpbGUKLSMKLQotaW5jbHVkZSAkKEFQX1dPUkspXGJ1aWxkXE5XR05VdGFpbC5pbmMKLQotCi0JCmRpZmYgLS1naXQgYS9tb2R1bGVzL2VjaG8vY29uZmlnLm00IGIvbW9kdWxlcy9lY2hvL2NvbmZpZy5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIyYjBiZC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2VjaG8vY29uZmlnLm00CisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotZG5sIG1vZHVsZXMgZW5hYmxlZCBpbiB0aGlzIGRpcmVjdG9yeSBieSBkZWZhdWx0Ci0KLWRubCBBQ19ERUZVTihtb2R1bGVuYW1lLCBtb2R1bGVzdHJ1Y3RuYW1lLCBkZWZhdWx0b25vcm9mZiwgY29uZmlnbWFjcm9zKQotZG5sIFhYWCAtIE5lZWQgdG8gYWxsb3cgLS1lbmFibGUtbW9kdWxlIHRvIGZhaWwgaWYgb3B0aW9uYWwgY29uZmlnIGZhaWxzCi0KLUFDX0RFRlVOKEFQQUNIRV9DSEVDS19TVEFOREFSRF9NT0RVTEUsIFsKLSAgQVBBQ0hFX01PRFVMRShbJDFdLFskMl0sLFskM10sWyQ0XSxbJDVdKQotXSkKLQotQVBBQ0hFX01PRFBBVEhfSU5JVChlY2hvKQotCi1BUEFDSEVfQ0hFQ0tfU1RBTkRBUkRfTU9EVUxFKGVjaG8sIEVDSE8gc2VydmVyLCAsIG5vKQotCi1MVEZMQUdTPSIkTFRGTEFHUyAtZXhwb3J0LWR5bmFtaWMiCi0KLUFQQUNIRV9NT0RQQVRIX0ZJTklTSAotICAgIAotQVBBQ0hFX1NVQlNUKFNUQU5EQVJEX0xJQlMpCmRpZmYgLS1naXQgYS9tb2R1bGVzL2VjaG8vbW9kX2VjaG8uYyBiL21vZHVsZXMvZWNoby9tb2RfZWNoby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTBjZmE3Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZWNoby9tb2RfZWNoby5jCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2Nvbm5lY3Rpb24uaCIKLQotQVBJX1ZBUl9FWFBPUlQgbW9kdWxlIGVjaG9fbW9kdWxlOwotCi10eXBlZGVmIHN0cnVjdAotICAgIHsKLSAgICBpbnQgYkVuYWJsZWQ7Ci0gICAgfSBFY2hvQ29uZmlnOwotCi1zdGF0aWMgdm9pZCAqY3JlYXRlX2VjaG9fc2VydmVyX2NvbmZpZyhwb29sICpwLHNlcnZlcl9yZWMgKnMpCi0gICAgewotICAgIEVjaG9Db25maWcgKnBDb25maWc9YXBfcGNhbGxvYyhwLHNpemVvZiAqcENvbmZpZyk7Ci0KLSAgICBwQ29uZmlnLT5iRW5hYmxlZD0wOwotCi0gICAgcmV0dXJuIHBDb25maWc7Ci0gICAgfQotCi1zdGF0aWMgY29uc3QgY2hhciAqZWNob19vbihjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLSAgICB7Ci0gICAgRWNob0NvbmZpZyAqcENvbmZpZz1hcF9nZXRfbW9kdWxlX2NvbmZpZyhjbWQtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywKLQkJCQkJICAgICAmZWNob19tb2R1bGUpOwotICAgIHBDb25maWctPmJFbmFibGVkPTE7Ci0KLSAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLXN0YXRpYyBpbnQgcHJvY2Vzc19lY2hvX2Nvbm5lY3Rpb24oY29ubl9yZWMgKmMpCi0gICAgewotICAgIGNoYXIgYnVmWzEwMjRdOwotICAgIEVjaG9Db25maWcgKnBDb25maWc9YXBfZ2V0X21vZHVsZV9jb25maWcoYy0+YmFzZV9zZXJ2ZXItPm1vZHVsZV9jb25maWcsCi0JCQkJCSAgICAgJmVjaG9fbW9kdWxlKTsKLQotICAgIGlmKCFwQ29uZmlnLT5iRW5hYmxlZCkKLQlyZXR1cm4gREVDTElORUQ7Ci0KLSAgICBmb3IoIDsgOyApCi0JewotCWludCB3OwotCWludCByPWFwX2JyZWFkKGMtPmNsaWVudCxidWYsc2l6ZW9mIGJ1Zik7Ci0JaWYociA8PSAwKQotCSAgICBicmVhazsKLQl3PWFwX2J3cml0ZShjLT5jbGllbnQsYnVmLHIpOwotCWlmKHcgIT0gcikKLQkgICAgYnJlYWs7Ci0JYXBfYmZsdXNoKGMtPmNsaWVudCk7Ci0JfQotICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBlY2hvX2NtZHNbXSA9IHsKLXsgIlByb3RvY29sRWNobyIsIGVjaG9fb24sIE5VTEwsIFJTUkNfQ09ORiwgUkFXX0FSR1MsCi0gICJSdW4gYW4gZWNobyBzZXJ2ZXIgb24gdGhpcyBob3N0IiB9LAoteyBOVUxMIH0KLX07Ci0KLXN0YXRpYyB2b2lkIHJlZ2lzdGVyX2hvb2tzKCkKLSAgICB7Ci0gICAgYXBfaG9va19wcm9jZXNzX2Nvbm5lY3Rpb24ocHJvY2Vzc19lY2hvX2Nvbm5lY3Rpb24sTlVMTCxOVUxMLEhPT0tfTUlERExFKTsKLSAgICB9Ci0KLUFQSV9WQVJfRVhQT1JUIG1vZHVsZSBlY2hvX21vZHVsZSA9IHsKLSAgICBTVEFOREFSRDIwX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLAkJCS8qIHByZV9jb21tYW5kX2xpbmUgKi8KLSAgICBOVUxMLAkJCS8qIHByZV9jb25maWcgKi8KLSAgICBOVUxMLAkJCS8qIHBvc3RfY29uZmlnICovCi0gICAgTlVMTCwJCQkvKiBvcGVuX2xvZ3MgKi8KLSAgICBOVUxMLCAJCQkvKiBjaGlsZF9pbml0ICovCi0gICAgTlVMTCwJCQkvKiBjcmVhdGUgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlICovCi0gICAgTlVMTCwJCQkvKiBtZXJnZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgY3JlYXRlX2VjaG9fc2VydmVyX2NvbmZpZywJLyogY3JlYXRlIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZSAqLwotICAgIE5VTEwsCQkJLyogbWVyZ2UgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIGVjaG9fY21kcywJCQkvKiBjb21tYW5kIHRhYmxlICovCi0gICAgTlVMTCwJCQkvKiBoYW5kbGVycyAqLwotICAgIE5VTEwsCQkJLyogY2hlY2sgYXV0aCAqLwotICAgIE5VTEwsCQkJLyogY2hlY2sgYWNjZXNzICovCi0gICAgTlVMTCwJCQkvKiB0eXBlX2NoZWNrZXIgKi8KLSAgICBOVUxMLAkJCS8qIHByZS1ydW4gZml4dXBzICovCi0gICAgcmVnaXN0ZXJfaG9va3MJCS8qIHJlZ2lzdGVyIGhvb2tzICovCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9leHBlcmltZW50YWwvLmN2c2lnbm9yZSBiL21vZHVsZXMvZXhwZXJpbWVudGFsLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNGM2ZTMuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9leHBlcmltZW50YWwvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotTWFrZWZpbGUKLSoubG8KLSouc28KZGlmZiAtLWdpdCBhL21vZHVsZXMvZXhwZXJpbWVudGFsLy5pbmRlbnQucHJvIGIvbW9kdWxlcy9leHBlcmltZW50YWwvLmluZGVudC5wcm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZmJlOWYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9leHBlcmltZW50YWwvLmluZGVudC5wcm8KKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0taTQgLW5wc2wgLWRpMCAtYnIgLW5jZSAtZDAgLWNsaTAgLW5wY3MgLW5mYzEKLS1UQlVGRgotLVRGSUxFCi0tVFRSQU5TCi0tVFVJTlQ0Ci0tVF90cmFucwotLVRhbGxvd19vcHRpb25zX3QKLS1UYXBhY2hlX3NmaW8KLS1UYXJyYXlfaGVhZGVyCi0tVGJvb2xfaW50Ci0tVGJ1Zl9hcmVhCi0tVGJ1ZmZfc3RydWN0Ci0tVGJ1ZmZ5Ci0tVGNtZF9ob3cKLS1UY21kX3Bhcm1zCi0tVGNvbW1hbmRfcmVjCi0tVGNvbW1hbmRfc3RydWN0Ci0tVGNvbm5fcmVjCi0tVGNvcmVfZGlyX2NvbmZpZwotLVRjb3JlX3NlcnZlcl9jb25maWcKLS1UZGlyX21ha2VyX2Z1bmMKLS1UZXZlbnQKLS1UZ2xvYmFsc19zCi0tVGhhbmRsZXJfZnVuYwotLVRoYW5kbGVyX3JlYwotLVRqb2JsaXN0X3MKLS1UbGlzdGVuX3JlYwotLVRtZXJnZXJfZnVuYwotLVRtb2RlX3QKLS1UbW9kdWxlCi0tVG1vZHVsZV9zdHJ1Y3QKLS1UbXV0ZXgKLS1Ubl9sb25nCi0tVG90aGVyX2NoaWxkX3JlYwotLVRvdmVycmlkZXNfdAotLVRwYXJlbnRfc2NvcmUKLS1UcGlkX3QKLS1UcGlwZWRfbG9nCi0tVHBvb2wKLS1UcmVxdWVzdF9yZWMKLS1UcmVxdWlyZV9saW5lCi0tVHJsaW1fdAotLVRzY29yZWJvYXJkCi0tVHNlbWFwaG9yZQotLVRzZXJ2ZXJfYWRkcl9yZWMKLS1Uc2VydmVyX3JlYwotLVRzZXJ2ZXJfcmVjX2NoYWluCi0tVHNob3J0X3Njb3JlCi0tVHRhYmxlCi0tVHRhYmxlX2VudHJ5Ci0tVHRocmVhZAotLVR1X3dpZGVfaW50Ci0tVHZ0aW1lX3QKLS1Ud2lkZV9pbnQKZGlmZiAtLWdpdCBhL21vZHVsZXMvZXhwZXJpbWVudGFsL01ha2VmaWxlLmluIGIvbW9kdWxlcy9leHBlcmltZW50YWwvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNWMxNDkuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9leHBlcmltZW50YWwvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgYSBtb2R1bGVzIE1ha2VmaWxlIGhhcyBubyBleHBsaWNpdCB0YXJnZXRzIC0tIHRoZXkgd2lsbCBiZSBkZWZpbmVkIGJ5Ci0jIHdoYXRldmVyIG1vZHVsZXMgYXJlIGVuYWJsZWQuIGp1c3QgZ3JhYiBzcGVjaWFsLm1rIHRvIGRlYWwgd2l0aCB0aGlzLgotaW5jbHVkZSAkKHRvcF9zcmNkaXIpL2J1aWxkL3NwZWNpYWwubWsKZGlmZiAtLWdpdCBhL21vZHVsZXMvZXhwZXJpbWVudGFsL1JFQURNRSBiL21vZHVsZXMvZXhwZXJpbWVudGFsL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdhYmMwOS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2V4cGVyaW1lbnRhbC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1SRUFETUUgZm9yIEFwYWNoZSAxLjIgRXhhbXBsZSBNb2R1bGUKLVtBcHJpbCwgMTk5N10KLQotVGhlIGZpbGVzIGluIHRoZSBzcmMvbW9kdWxlcy9leGFtcGxlIGRpcmVjdG9yeSB1bmRlciB0aGUgQXBhY2hlCi1kaXN0cmlidXRpb24gZGlyZWN0b3J5IHRyZWUgYXJlIHByb3ZpZGVkIGFzIGFuIGV4YW1wbGUgdG8gdGhvc2UgdGhhdAotd2lzaCB0byB3cml0ZSBtb2R1bGVzIHRoYXQgdXNlIHRoZSBBcGFjaGUgQVBJLgotCi1UaGUgbWFpbiBmaWxlIGlzIG1vZF9leGFtcGxlLmMsIHdoaWNoIGlsbHVzdHJhdGVzIGFsbCB0aGUgZGlmZmVyZW50Ci1jYWxsYmFjayBtZWNoYW5pc21zIGFuZCBjYWxsIHN5bnRhY2VzLiAgQnkgbm8gbWVhbnMgZG9lcyBhbiBhZGQtb24KLW1vZHVsZSBuZWVkIHRvIGluY2x1ZGUgcm91dGluZXMgZm9yIGFsbCBvZiB0aGUgY2FsbGJhY2tzIC0gcXVpdGUgdGhlCi1jb250cmFyeSEKLQotVGhlIGV4YW1wbGUgbW9kdWxlIGlzIGFuIGFjdHVhbCB3b3JraW5nIG1vZHVsZS4gIElmIHlvdSBsaW5rIGl0IGludG8KLXlvdXIgc2VydmVyLCBlbmFibGUgdGhlICJleGFtcGxlLWhhbmRsZXIiIGhhbmRsZXIgZm9yIGEgbG9jYXRpb24sIGFuZCB0aGVuCi1icm93c2UgdG8gdGhhdCBsb2NhdGlvbiwgeW91IHdpbGwgc2VlIGEgZGlzcGxheSBvZiBzb21lIG9mIHRoZSB0cmFjaW5nCi10aGUgZXhhbXBsZSBtb2R1bGUgZGlkIGFzIHRoZSB2YXJpb3VzIGNhbGxiYWNrcyB3ZXJlIG1hZGUuCi0KLVRvIGluY2x1ZGUgdGhlIGV4YW1wbGUgbW9kdWxlIGluIHlvdXIgc2VydmVyLCBmb2xsb3cgdGhlIHN0ZXBzIGJlbG93OgotCi0gICAgMS4gVW5jb21tZW50IHRoZSAiTW9kdWxlIGV4YW1wbGVfbW9kdWxlIiBsaW5lIG5lYXIgdGhlIGJvdHRvbSBvZgotICAgICAgIHRoZSBzcmMvQ29uZmlndXJhdGlvbiBmaWxlLiAgSWYgdGhlcmUgaXNuJ3Qgb25lLCBhZGQgaXQ7IGl0Ci0gICAgICAgc2hvdWxkIGxvb2sgbGlrZSB0aGlzOgotCi0gICAgICAgTW9kdWxlIGV4YW1wbGVfbW9kdWxlICAgICAgICBtb2R1bGVzL2V4YW1wbGUvbW9kX2V4YW1wbGUubwotCi0gICAgMi4gUnVuIHRoZSBzcmMvQ29uZmlndXJlIHNjcmlwdCAoImNkIHNyYzsgLi9Db25maWd1cmUiKS4gIFRoaXMgd2lsbAotICAgICAgIGJ1aWxkIHRoZSBNYWtlZmlsZSBmb3IgdGhlIHNlcnZlciBpdHNlbGYsIGFuZCB1cGRhdGUgdGhlCi0gICAgICAgc3JjL21vZHVsZXMvTWFrZWZpbGUgZm9yIGFueSBhZGRpdGlvbmFsIG1vZHVsZXMgeW91IGhhdmUKLSAgICAgICByZXF1ZXN0ZWQgZnJvbSBiZW5lYXRoIHRoYXQgc3ViZGlyZWN0b3J5LgotCi0gICAgMy4gTWFrZSB0aGUgc2VydmVyIChydW4gIm1ha2UiIGluIHRoZSBzcmMgZGlyZWN0b3J5KS4KLQotVG8gYWRkIGFub3RoZXIgbW9kdWxlIG9mIHlvdXIgb3duOgotCi0gICAgQS4gbWtkaXIgc3JjL21vZHVsZXMvbXltb2R1bGUKLSAgICBCLiBjcCBzcmMvbW9kdWxlcy9leGFtcGxlLyogc3JjL21vZHVsZXMvbXltb2R1bGUKLSAgICBDLiBNb2RpZnkgdGhlIGZpbGVzIGluIHRoZSBuZXcgZGlyZWN0b3J5Ci0gICAgRC4gRm9sbG93IHN0ZXBzIFsxXSB0aHJvdWdoIFszXSBhYm92ZSwgd2l0aCBhcHByb3ByaWF0ZSBjaGFuZ2VzLgotCi1UbyBhY3RpdmF0ZSB0aGUgZXhhbXBsZSBtb2R1bGUsIGluY2x1ZGUgYSBibG9jayBzaW1pbGFyIHRvIHRoZQotZm9sbG93aW5nIGluIHlvdXIgc3JtLmNvbmYgZmlsZToKLQotICAgIDxMb2NhdGlvbiAvZXhhbXBsZS1pbmZvPgotCVNldEhhbmRsZXIgZXhhbXBsZS1oYW5kbGVyCi0gICAgPC9Mb2NhdGlvbj4KLQotQXMgYW4gYWx0ZXJuYXRpdmUsIHlvdSBjYW4gcHV0IHRoZSBmb2xsb3dpbmcgaW50byBhIC5odGFjY2VzcyBmaWxlIGFuZAotdGhlbiByZXF1ZXN0IHRoZSBmaWxlICJ0ZXN0LmV4YW1wbGUiIGZyb20gdGhhdCBsb2NhdGlvbjoKLQotICAgIEFkZEhhbmRsZXIgZXhhbXBsZS1oYW5kbGVyIC5leGFtcGxlCi0KLUFmdGVyIHJlbG9hZGluZy9yZXN0YXJ0aW5nIHlvdXIgc2VydmVyLCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gYnJvd3NlCi10byB0aGlzIGxvY2F0aW9uIGFuZCBzZWUgdGhlIGJyaWVmIGRpc3BsYXkgbWVudGlvbmVkIGVhcmxpZXIuCmRpZmYgLS1naXQgYS9tb2R1bGVzL2V4cGVyaW1lbnRhbC9jYWNoZV9zdG9yYWdlLmMgYi9tb2R1bGVzL2V4cGVyaW1lbnRhbC9jYWNoZV9zdG9yYWdlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MDYyOGQuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9leHBlcmltZW50YWwvY2FjaGVfc3RvcmFnZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCi0gKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAotICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqLwotCi0jZGVmaW5lIENPUkVfUFJJVkFURQotCi0jaW5jbHVkZSAibW9kX2NhY2hlLmgiCi0KLUFQUl9IT09LX1NUUlVDVCgKLQlBUFJfSE9PS19MSU5LKHJlbW92ZV91cmwpCi0JQVBSX0hPT0tfTElOSyhjcmVhdGVfZW50aXR5KQotCUFQUl9IT09LX0xJTksob3Blbl9lbnRpdHkpCi0pCi0KLW1vZHVsZSBBUF9NT0RVTEVfREVDTEFSRV9EQVRBIHRjYWNoZV9tb2R1bGU7Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qCi0gKiBkZWxldGUgYWxsIFVSTCBlbnRpdGllcyBmcm9tIHRoZSBjYWNoZQotICoKLSAqLwotaW50IGNhY2hlX3JlbW92ZV91cmwocmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKnR5cGVzLCBjaGFyICp1cmwpCi17Ci0gICAgY29uc3QgY2hhciAqbmV4dCA9IHR5cGVzOwotICAgIGNvbnN0IGNoYXIgKnR5cGU7Ci0KLSAgICAvKiBmb3IgZWFjaCBzcGVjaWZpZWQgY2FjaGUgdHlwZSwgZGVsZXRlIHRoZSBVUkwgKi8KLSAgICB3aGlsZSAoKHR5cGUgPSBhcF9jYWNoZV90b2tzdHIoci0+cG9vbCwgbmV4dCwgJm5leHQpKSkgewotCWNhY2hlX3J1bl9yZW1vdmVfdXJsKHR5cGUsIHVybCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotCi0vKgotICogY3JlYXRlIGEgbmV3IFVSTCBlbnRpdHkgaW4gdGhlIGNhY2hlCi0gKgotICogSXQgaXMgcG9zc2libGUgdG8gc3RvcmUgbW9yZSB0aGFuIG9uY2UgZW50aXR5IHBlciBVUkwuIFRoaXMKLSAqIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIGNyZWF0ZSBhIG5ldyBlbnRpdHksIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgotICogb3RoZXIgZW50aXRpZXMgYWxyZWFkeSBleGlzdCBmb3IgdGhlIHNhbWUgVVJMLgotICoKLSAqIFRoZSBzaXplIG9mIHRoZSBlbnRpdHkgaXMgcHJvdmlkZWQgc28gdGhhdCBhIGNhY2hlIG1vZHVsZSBjYW4KLSAqIGRlY2lkZSB3aGV0aGVyIG9yIG5vdCBpdCB3YW50cyB0byBjYWNoZSB0aGlzIHBhcnRpY3VsYXIgZW50aXR5LgotICogSWYgdGhlIHNpemUgaXMgdW5rbm93biwgYSBzaXplIG9mIC0xIHNob3VsZCBiZSBzZXQuCi0gKi8KLWludCBjYWNoZV9jcmVhdGVfZW50aXR5KHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICp0eXBlcywgY2hhciAqdXJsLCBhcHJfc2l6ZV90IHNpemUpCi17Ci0gICAgY2FjaGVfaGFuZGxlICpoOwotICAgIGNvbnN0IGNoYXIgKm5leHQgPSB0eXBlczsKLSAgICBjb25zdCBjaGFyICp0eXBlOwotICAgIGFwcl9zdGF0dXNfdCBydjsKLSAgICBjYWNoZV9yZXF1ZXN0X3JlYyAqY2FjaGUgPSAoY2FjaGVfcmVxdWVzdF9yZWMgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cmVxdWVzdF9jb25maWcsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGNhY2hlX21vZHVsZSk7Ci0KLSAgICAvKiBmb3IgZWFjaCBzcGVjaWZpZWQgY2FjaGUgdHlwZSwgZGVsZXRlIHRoZSBVUkwgKi8KLSAgICB3aGlsZSAobmV4dCkgewotICAgICAgICB0eXBlID0gYXBfY2FjaGVfdG9rc3RyKHItPnBvb2wsIG5leHQsICZuZXh0KTsKLSAgICAgICAgc3dpdGNoIChydiA9IGNhY2hlX3J1bl9jcmVhdGVfZW50aXR5KCZoLCB0eXBlLCB1cmwsIHNpemUpKSB7Ci0gICAgICAgIGNhc2UgT0s6IHsKLSAgICAgICAgICAgIGNhY2hlLT5oYW5kbGUgPSBoOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgREVDTElORUQ6IHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIHJldHVybiBydjsKLSAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotLyoKLSAqIHJlbW92ZSBhIHNwZWNpZmljIFVSTCBlbnRpdHkgZnJvbSB0aGUgY2FjaGUKLSAqCi0gKiBUaGUgc3BlY2lmaWMgZW50aXR5IHJlZmVyZW5jZWQgYnkgdGhlIGNhY2hlX2hhbmRsZSBpcyByZW1vdmVkCi0gKiBmcm9tIHRoZSBjYWNoZSwgYW5kIHRoZSBjYWNoZV9oYW5kbGUgaXMgY2xvc2VkLgotICovCi1pbnQgY2FjaGVfcmVtb3ZlX2VudGl0eShyZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqdHlwZXMsIGNhY2hlX2hhbmRsZSAqaCkKLXsKLSAgICBjb25zdCBjaGFyICpuZXh0ID0gdHlwZXM7Ci0gICAgY29uc3QgY2hhciAqdHlwZTsKLQotICAgIHdoaWxlIChuZXh0KSB7Ci0gICAgICAgIHR5cGUgPSBhcF9jYWNoZV90b2tzdHIoci0+cG9vbCwgbmV4dCwgJm5leHQpOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotLyoKLSAqIHNlbGVjdCBhIHNwZWNpZmljIFVSTCBlbnRpdHkgaW4gdGhlIGNhY2hlCi0gKgotICogSXQgaXMgcG9zc2libGUgdG8gc3RvcmUgbW9yZSB0aGFuIG9uZSBlbnRpdHkgcGVyIFVSTC4gQ29udGVudAotICogbmVnb3RpYXRpb24gaXMgdXNlZCB0byBzZWxlY3QgYW4gZW50aXR5LiBPbmNlIGFuIGVudGl0eSBpcwotICogc2VsZWN0ZWQsIGRldGFpbHMgb2YgaXQgYXJlIHN0b3JlZCBpbiB0aGUgcGVyIHJlcXVlc3QKLSAqIGNvbmZpZyB0byBzYXZlIHRpbWUgd2hlbiBzZXJ2aW5nIHRoZSByZXF1ZXN0IGxhdGVyLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBPSyBpZiBzdWNjZXNzZnVsLCBERUNMSU5FRCBpZiBubwotICogY2FjaGVkIGVudGl0eSBmaXRzIHRoZSBiaWxsLgotICovCi1pbnQgY2FjaGVfc2VsZWN0X3VybChyZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqdHlwZXMsIGNoYXIgKnVybCkKLXsKLSAgICBjYWNoZV9oYW5kbGUgKmg7Ci0gICAgY29uc3QgY2hhciAqbmV4dCA9IHR5cGVzOwotICAgIGNvbnN0IGNoYXIgKnR5cGU7Ci0gICAgYXByX3N0YXR1c190IHJ2OwotICAgIGNhY2hlX3JlcXVlc3RfcmVjICpjYWNoZSA9IChjYWNoZV9yZXF1ZXN0X3JlYyAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5yZXF1ZXN0X2NvbmZpZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0Y2FjaGVfbW9kdWxlKTsKLQotICAgIC8qIGdvIHRocm91Z2ggdGhlIGNhY2hlIHR5cGVzIHRpbGwgd2UgZ2V0IGEgbWF0Y2ggKi8KLSAgICB3aGlsZSAobmV4dCkgewotICAgICAgICB0eXBlID0gYXBfY2FjaGVfdG9rc3RyKHItPnBvb2wsIG5leHQsICZuZXh0KTsKLSAgICAgICAgc3dpdGNoICgocnYgPSBjYWNoZV9ydW5fb3Blbl9lbnRpdHkoJmgsIHR5cGUsIHVybCkpKSB7Ci0gICAgICAgIGNhc2UgT0s6IHsKLSAgICAgICAgICAgIC8qIGNvb2wgYmFuYW5hcyEgKi8KLSAgICAgICAgICAgIGNhY2hlLT5oYW5kbGUgPSBoOwotLyoqKiBsb29wIHRocm91Z2ggcmV0dXJuZWQgZW50aXRpZXMgKi8KLS8qKiogZG8gZnJlc2huZXNzIGNhbGN1bGF0aW9uIGhlcmUgKi8KLSAgICAgICAgICAgIGNhY2hlLT5mcmVzaCA9IDE7Ci0vKioqIGRvIGNvbnRlbnQgbmVnb3RpYXRpb24gaGVyZSAqLwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgREVDTElORUQ6IHsKLSAgICAgICAgICAgIC8qIHRyeSBhZ2FpbiB3aXRoIG5leHQgY2FjaGUgdHlwZSAqLwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgLyogb28tZXIhIGFuIGVycm9yICovCi0gICAgICAgICAgICByZXR1cm4gcnY7Ci0gICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gREVDTElORUQ7Ci19Ci0KLWFwcl9zdGF0dXNfdCBjYWNoZV93cml0ZV9lbnRpdHlfaGVhZGVycyhjYWNoZV9oYW5kbGUgKmgsIHJlcXVlc3RfcmVjICpyLCBjYWNoZV9pbmZvICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcl90YWJsZV90ICpoZWFkZXJzX2luLCBhcHJfdGFibGVfdCAqaGVhZGVyc19vdXQpIAotewotICAgIGNvbnN0IGNoYXIgKmN0OwotCi0gICAgY3QgPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19vdXQsICJDb250ZW50LVR5cGUiKTsKLSAgICBpbmZvLT5jb250ZW50X3R5cGUgPSBjdDsKLSAgICBoLT53cml0ZV9oZWFkZXJzKGgsIHIsIGluZm8pOwotICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLX0KLWFwcl9zdGF0dXNfdCBjYWNoZV93cml0ZV9lbnRpdHlfYm9keShjYWNoZV9oYW5kbGUgKmgsIGFwcl9idWNrZXRfYnJpZ2FkZSAqYikgCi17Ci0gICAgYXByX3N0YXR1c190IHJ2ID0gQVBSX1NVQ0NFU1M7Ci0gICAgaWYgKGgtPndyaXRlX2JvZHkoaCwgYikgIT0gT0spIHsKLSAgICB9Ci0gICAgcmV0dXJuIHJ2OwotfQotCi1hcHJfc3RhdHVzX3QgY2FjaGVfcmVhZF9lbnRpdHlfaGVhZGVycyhjYWNoZV9oYW5kbGUgKmgsIHJlcXVlc3RfcmVjICpyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcl90YWJsZV90ICoqaGVhZGVycykKLXsKLSAgICBjYWNoZV9pbmZvICppbmZvOwotCi0gICAgLyogQmUgY2FyZWZ1bCB0byBub3QgbW9kaWZ5IGluZm8uICovCi0gICAgaC0+cmVhZF9oZWFkZXJzKGgsIHIsICZpbmZvKTsKLQotICAgIC8qIEJ1aWxkIHRoZSBoZWFkZXIgdGFibGUgZnJvbSBpbmZvIGluIHRoZSBpbmZvIHN0cnVjdCAqLwotICAgICpoZWFkZXJzID0gYXByX3RhYmxlX21ha2Uoci0+cG9vbCwgMTUpOwotICAgIC8qIENvbnRlbnQtTGVuZ3RoICovCi0gICAgaWYgKGluZm8tPmxlbikKLSAgICAgICAgYXByX3RhYmxlX3NldCgqaGVhZGVycywgIkNvbnRlbnQtTGVuZ3RoIiwgYXByX3BzcHJpbnRmKHItPnBvb2wsICIlbHUiLCBpbmZvLT5sZW4pKTsKLQotICAgIC8qIExhc3QtTW9kaWZpZWQgKi8KLSAgICBpZiAoaW5mby0+bGFzdG1vZCkgewotICAgIH0KLSAgICAvKiBFeHBpcmVzICovCi0gICAgaWYgKGluZm8tPmV4cGlyZSkgewotICAgIH0KLSAgICBpZiAoaW5mby0+Y29udGVudF90eXBlKSB7Ci0gICAgICAgIHItPmNvbnRlbnRfdHlwZSA9IGFwcl9wc3RyZHVwKHItPnBvb2wsIGluZm8tPmNvbnRlbnRfdHlwZSk7Ci0gICAgfQotICAgIC8qIERhdGUgKi8KLSAgICAKLSAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci19Ci1hcHJfc3RhdHVzX3QgY2FjaGVfcmVhZF9lbnRpdHlfYm9keShjYWNoZV9oYW5kbGUgKmgsIGFwcl9idWNrZXRfYnJpZ2FkZSAqYikgCi17Ci0gICAgaC0+cmVhZF9ib2R5KGgsIGIpOwotICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLX0KLQotQVBSX0lNUExFTUVOVF9FWFRFUk5BTF9IT09LX1JVTl9GSVJTVChjYWNoZSwgQ0FDSEUsIGludCwgY3JlYXRlX2VudGl0eSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYWNoZV9oYW5kbGUgKipocCwgY29uc3QgY2hhciAqdHlwZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnVybCwgYXByX3NpemVfdCBsZW4pLChocCx0eXBlLHVybCxsZW4pLERFQ0xJTkVEKQotQVBSX0lNUExFTUVOVF9FWFRFUk5BTF9IT09LX1JVTl9GSVJTVChjYWNoZSwgQ0FDSEUsIGludCwgb3Blbl9lbnRpdHksICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhY2hlX2hhbmRsZSAqKmhwLCBjb25zdCBjaGFyICp0eXBlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqdXJsKSwoaHAsdHlwZSx1cmwpLERFQ0xJTkVEKQotQVBSX0lNUExFTUVOVF9FWFRFUk5BTF9IT09LX1JVTl9BTEwoY2FjaGUsIENBQ0hFLCBpbnQsIHJlbW92ZV91cmwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKnR5cGUsIGNoYXIgKnVybCksKHR5cGUsdXJsKSxPSyxERUNMSU5FRCkKLSNpZiAwCi0vKiBCaWxsUyBkb2Vzbid0IHRoaW5rIHRoZXNlIHNob3VsZCBiZSBob29rcy4KLSAqIEFsbCBmdW5jdGlvbnMgd2hpY2ggYWNjZXB0IGEgY2FjaGVfaGFuZGxlICogYXJndW1lbnQgc2hvdWxkIHVzZQotICogZnVuY3Rpb24gcG9pbnRlcnMgaW4gdGhlIGNhY2hlX2hhbmRsZS4gTGVhdmUgdGhlbSBoZXJlIGZvciBub3cgYXMgCi0gKiBwb2ludHMgZm9yIGRpc2N1c3Npb24uLi4KLSAqLwotCi1BUFJfSU1QTEVNRU5UX0VYVEVSTkFMX0hPT0tfUlVOX0ZJUlNUKGNhY2hlLCBDQUNIRSwgaW50LCByZW1vdmVfZW50aXR5LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FjaGVfaGFuZGxlICpoKSwoaCksREVDTElORUQpCi0KLUFQUl9JTVBMRU1FTlRfRVhURVJOQUxfSE9PS19SVU5fRklSU1QoY2FjaGUsIENBQ0hFLCBpbnQsIHJlYWRfZW50aXR5X2hlYWRlcnMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYWNoZV9oYW5kbGUgKmgsIHJlcXVlc3RfcmVjICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHJfdGFibGVfdCAqKmhlYWRlcnMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaCxpbmZvLGhlYWRlcnNfaW4saGVhZGVyc19vdXQpLERFQ0xJTkVEKQotQVBSX0lNUExFTUVOVF9FWFRFUk5BTF9IT09LX1JVTl9GSVJTVChjYWNoZSwgQ0FDSEUsIGludCwgcmVhZF9lbnRpdHlfYm9keSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhY2hlX2hhbmRsZSAqaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXByX2J1Y2tldF9icmlnYWRlICpvdXQpLChoLG91dCksREVDTElORUQpCi1BUFJfSU1QTEVNRU5UX0VYVEVSTkFMX0hPT0tfUlVOX0ZJUlNUKGNhY2hlLCBDQUNIRSwgaW50LCB3cml0ZV9lbnRpdHlfaGVhZGVycywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhY2hlX2hhbmRsZSAqaCwgY2FjaGVfaW5mbyAqaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXByX3RhYmxlX3QgKmhlYWRlcnNfaW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHJfdGFibGVfdCAqaGVhZGVyc19vdXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaCxpbmZvLGhlYWRlcnNfaW4saGVhZGVyc19vdXQpLERFQ0xJTkVEKQotQVBSX0lNUExFTUVOVF9FWFRFUk5BTF9IT09LX1JVTl9GSVJTVChjYWNoZSwgQ0FDSEUsIGludCwgd3JpdGVfZW50aXR5X2JvZHksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYWNoZV9oYW5kbGUgKmgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcl9idWNrZXRfYnJpZ2FkZSAqaW4pLChoLGluKSxERUNMSU5FRCkKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9leHBlcmltZW50YWwvY2FjaGVfdXRpbC5jIGIvbW9kdWxlcy9leHBlcmltZW50YWwvY2FjaGVfdXRpbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzM3YWE5Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZXhwZXJpbWVudGFsL2NhY2hlX3V0aWwuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotI2RlZmluZSBDT1JFX1BSSVZBVEUKLQotI2luY2x1ZGUgIm1vZF9jYWNoZS5oIgotCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogcmV0dXJuIHRydWUgaWYgdGhlIHJlcXVlc3QgaXMgY29uZGl0aW9uYWwgKi8KLWludCBhcF9jYWNoZV9yZXF1ZXN0X2lzX2NvbmRpdGlvbmFsKHJlcXVlc3RfcmVjICpyKQotewotICAgIGlmIChhcHJfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJJZi1NYXRjaCIpIHx8Ci0gICAgICAgIGFwcl90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIklmLU5vbmUtTWF0Y2giKSB8fAotICAgICAgICBhcHJfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJJZi1Nb2RpZmllZC1TaW5jZSIpIHx8Ci0gICAgICAgIGFwcl90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIklmLVVubW9kaWZpZWQtU2luY2UiKSkgewotCi0JcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0KLS8qIHJlbW92ZSBvdGhlciBmaWx0ZXJzIGZyb20gZmlsdGVyIHN0YWNrICovCi12b2lkIGFwX2NhY2hlX3Jlc2V0X291dHB1dF9maWx0ZXJzKHJlcXVlc3RfcmVjICpyKQotewotICAgIGFwX2ZpbHRlcl90ICpmID0gci0+b3V0cHV0X2ZpbHRlcnM7Ci0KLSAgICB3aGlsZSAoZikgewotICAgICAgICBpZiAoIXN0cmNhc2VjbXAoZi0+ZnJlYy0+bmFtZSwgIkNPUkUiKSB8fAotICAgICAgICAgICAgIXN0cmNhc2VjbXAoZi0+ZnJlYy0+bmFtZSwgIkNPTlRFTlRfTEVOR1RIIikgfHwKLSAgICAgICAgICAgICFzdHJjYXNlY21wKGYtPmZyZWMtPm5hbWUsICJIVFRQX0hFQURFUiIpKSB7Ci0gICAgICAgICAgICBmID0gZi0+bmV4dDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXBfcmVtb3ZlX291dHB1dF9maWx0ZXIoZik7Ci0gICAgICAgICAgICBmID0gZi0+bmV4dDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotY29uc3QgY2hhciAqYXBfY2FjaGVfZ2V0X2NhY2hldHlwZShyZXF1ZXN0X3JlYyAqciwgY2FjaGVfc2VydmVyX2NvbmYgKmNvbmYsIGNvbnN0IGNoYXIgKnVybCkKLXsKLSAgICBjb25zdCBjaGFyICp0eXBlID0gTlVMTDsKLSAgICBpbnQgaTsKLQotICAgIC8qIGxvb3AgdGhyb3VnaCBhbGwgdGhlIGNhY2hlZW5hYmxlIGVudHJpZXMgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgY29uZi0+Y2FjaGVlbmFibGUtPm5lbHRzOyBpKyspIHsKLQlzdHJ1Y3QgY2FjaGVfZW5hYmxlICplbnQgPSAoc3RydWN0IGNhY2hlX2VuYWJsZSAqKSBjb25mLT5jYWNoZWVuYWJsZS0+ZWx0czsKLQljb25zdCBjaGFyICp0aGlzdXJsID0gZW50W2ldLnVybDsKLQljb25zdCBjaGFyICp0aGlzdHlwZSA9IGVudFtpXS50eXBlOwotCWlmICgodGhpc3VybCkgJiYgIXN0cm5jYXNlY21wKHRoaXN1cmwsIHVybCwgc3RybGVuKHRoaXN1cmwpKSkgewotCSAgICBpZiAoIXR5cGUpIHsKLQkJdHlwZSA9IHRoaXN0eXBlOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQl0eXBlID0gYXByX3BzdHJjYXQoci0+cG9vbCwgdHlwZSwgIiwiLCB0aGlzdHlwZSwgTlVMTCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgLyogdGhlbiBsb29wIHRocm91Z2ggYWxsIHRoZSBjYWNoZWRpc2FibGUgZW50cmllcyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBjb25mLT5jYWNoZWRpc2FibGUtPm5lbHRzOyBpKyspIHsKLQlzdHJ1Y3QgY2FjaGVfZGlzYWJsZSAqZW50ID0gKHN0cnVjdCBjYWNoZV9kaXNhYmxlICopIGNvbmYtPmNhY2hlZGlzYWJsZS0+ZWx0czsKLQljb25zdCBjaGFyICp0aGlzdXJsID0gZW50W2ldLnVybDsKLQlpZiAoKHRoaXN1cmwpICYmICFzdHJuY2FzZWNtcCh0aGlzdXJsLCB1cmwsIHN0cmxlbih0aGlzdXJsKSkpIHsKLQkgICAgdHlwZSA9IE5VTEw7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiB0eXBlOwotfQotCi0vKgotICogbGlzdCBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNhc2UtaW5zZW5zaXRpdmUgdG9rZW5zLCB3aXRoCi0gKiBvcHRpb25hbCB3aGl0ZXNwYWNlIGFyb3VuZCB0aGUgdG9rZW5zLgotICogVGhlIHJldHVybiByZXR1cm5zIDEgaWYgdGhlIHRva2VuIHZhbCBpcyBmb3VuZCBpbiB0aGUgbGlzdCwgb3IgMAotICogb3RoZXJ3aXNlLgotICovCi1pbnQgYXBfY2FjaGVfbGlzdHN0cihjb25zdCBjaGFyICpsaXN0LCBjb25zdCBjaGFyICprZXksIGNoYXIgKip2YWwpCi17Ci0gICAgaW50IGxlbiwgaTsKLSAgICBjaGFyICpwOwotICAgIGNoYXIgdmFsYnVmW0hVR0VfU1RSSU5HX0xFTl07Ci0gICAgdmFsYnVmW3NpemVvZih2YWxidWYpLTFdID0gMDsgLyogc2FmZXR5IHRlcm1pbmF0aW5nIHplcm8gKi8KLQotICAgIGxlbiA9IHN0cmxlbihrZXkpOwotCi0gICAgd2hpbGUgKGxpc3QgIT0gTlVMTCkgewotCXAgPSBzdHJjaHIoKGNoYXIgKikgbGlzdCwgJywnKTsKLQlpZiAocCAhPSBOVUxMKSB7Ci0JICAgIGkgPSBwIC0gbGlzdDsKLQkgICAgZG8KLQkJcCsrOwotCSAgICB3aGlsZSAoYXBfaXNzcGFjZSgqcCkpOwotCX0KLQllbHNlCi0JICAgIGkgPSBzdHJsZW4obGlzdCk7Ci0KLQl3aGlsZSAoaSA+IDAgJiYgYXBfaXNzcGFjZShsaXN0W2kgLSAxXSkpCi0JICAgIGktLTsKLQlpZiAoaSA9PSBsZW4gJiYgc3RybmNhc2VjbXAobGlzdCwga2V5LCBsZW4pID09IDApIHsKLQkgICAgaWYgKHZhbCkgewotCQlwID0gc3RyY2hyKChjaGFyICopIGxpc3QsICcsJyk7Ci0JCXdoaWxlIChhcF9pc3NwYWNlKCpsaXN0KSkgewotCQkgICAgbGlzdCsrOwotCQl9Ci0JCWlmICgnPScgPT0gbGlzdFswXSkKLQkJICAgIGxpc3QrKzsKLQkJd2hpbGUgKGFwX2lzc3BhY2UoKmxpc3QpKSB7Ci0JCSAgICBsaXN0Kys7Ci0JCX0KLQkJc3RybmNweSh2YWxidWYsIGxpc3QsIE1JTihwLWxpc3QsIHNpemVvZih2YWxidWYpLTEpKTsKLQkJKnZhbCA9IHZhbGJ1ZjsKLQkgICAgfQotCSAgICByZXR1cm4gMTsKLQl9Ci0JbGlzdCA9IHA7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKiByZXR1cm4gZWFjaCBjb21tYSBzZXBhcmF0ZWQgdG9rZW4sIG9uZSBhdCBhIHRpbWUgKi8KLWNvbnN0IGNoYXIgKmFwX2NhY2hlX3Rva3N0cihhcHJfcG9vbF90ICpwLCBjb25zdCBjaGFyICpsaXN0LCBjb25zdCBjaGFyICoqc3RyKQotewotICAgIGFwcl9vZmZfdCBsZW4sIGk7Ci0gICAgY29uc3QgY2hhciAqczsKLQotICAgIHMgPSBhcF9zdHJjaHJfYyhsaXN0LCAnLCcpOwotICAgIGlmIChzICE9IE5VTEwpIHsKLQlpID0gcyAtIGxpc3Q7Ci0JZG8KLQkgICAgcysrOwotCXdoaWxlIChhcHJfaXNzcGFjZSgqcykpOwotICAgIH0KLSAgICBlbHNlCi0JaSA9IHN0cmxlbihsaXN0KTsKLQotICAgIHdoaWxlIChpID4gMCAmJiBhcHJfaXNzcGFjZShsaXN0W2kgLSAxXSkpCi0JaS0tOwotCi0gICAgKnN0ciA9IHM7Ci0gICAgaWYgKGxlbikKLQlyZXR1cm4gYXByX3BzdHJuZHVwKHAsIGxpc3QsIGxlbik7Ci0gICAgZWxzZQotCXJldHVybiBOVUxMOwotCi19CmRpZmYgLS1naXQgYS9tb2R1bGVzL2V4cGVyaW1lbnRhbC9jb25maWcubTQgYi9tb2R1bGVzL2V4cGVyaW1lbnRhbC9jb25maWcubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NWZjNWQuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9leHBlcmltZW50YWwvY29uZmlnLm00CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0KLUFQQUNIRV9NT0RQQVRIX0lOSVQoZXhwZXJpbWVudGFsKQotCi1BUEFDSEVfTU9EVUxFKG1tYXBfc3RhdGljLCBtZW1vcnkgbWFwcGVkIGZpbGUgY2FjaGluZywgLCAsIG5vKQotQVBBQ0hFX01PRFVMRShjaGFyc2V0X2xpdGUsIGNoYXJhY3RlciBzZXQgdHJhbnNsYXRpb24sICwgLCBubykKLQotQVBBQ0hFX01PRFBBVEhfRklOSVNICmRpZmYgLS1naXQgYS9tb2R1bGVzL2V4cGVyaW1lbnRhbC9tb2RfYXV0aF9sZGFwLmMgYi9tb2R1bGVzL2V4cGVyaW1lbnRhbC9tb2RfYXV0aF9sZGFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZTg5MWMuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9leHBlcmltZW50YWwvbW9kX2F1dGhfbGRhcC5jCisrKyAvZGV2L251bGwKQEAgLTEsODYyICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotLyoKLSAqIG1vZF9hdXRoX2xkYXAuYzogTERBUCBhdXRoZW50aWNhdGlvbiBtb2R1bGUKLSAqIAotICogT3JpZ2luYWwgY29kZSBmcm9tIGF1dGhfbGRhcCBtb2R1bGUgZm9yIEFwYWNoZSB2MS4zOgotICogQ29weXJpZ2h0IDE5OTgsIDE5OTkgRW5icmlkZ2UgUGlwZWxpbmVzIEluYy4gCi0gKiBDb3B5cmlnaHQgMTk5OS0yMDAxIERhdmUgQ2FycmlnYW4KLSAqLwotCi0jaW5jbHVkZSA8YXByX2xkYXAuaD4KLSNpbmNsdWRlIDxhcHJfc3RyaW5ncy5oPgotCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaWYgQVBSX0hBVkVfVU5JU1REX0gKLS8qIGZvciBnZXRwaWQoKSAqLwotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLSNpbmNsdWRlICJ1dGlsX2xkYXAuaCIKLQotLyogcGVyIGRpcmVjdG9yeSBjb25maWd1cmF0aW9uICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgYXByX3Bvb2xfdCAqcG9vbDsJCQkvKiBQb29sIHRoYXQgdGhpcyBjb25maWcgaXMgYWxsb2NhdGVkIGZyb20gKi8KLSAgICBhcHJfbG9ja190ICpsb2NrOwkJCS8qIExvY2sgZm9yIHRoaXMgY29uZmlnICovCi0gICAgaW50IGF1dGhfYXV0aG9yaXRhdGl2ZTsJCS8qIElzIHRoaXMgYXV0aCBtZXRob2QgdGhlIG9uZSBhbmQgb25seT8gKi8KLSAgICBpbnQgZW5hYmxlZDsJCQkvKiBJcyBhdXRoX2xkYXAgZW5hYmxlZCBpbiB0aGlzIGRpcmVjdG9yeT8gKi8KLQotICAgIC8qIFRoZXNlIHBhcmFtZXRlcnMgYXJlIGFsbCBkZXJpdmVkIGZyb20gdGhlIEF1dGhMREFQVVJMIGRpcmVjdGl2ZSAqLwotICAgIGNoYXIgKnVybDsJCQkJLyogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBVUkwgKi8KLQotICAgIGNoYXIgKmhvc3Q7CQkJCS8qIE5hbWUgb2YgdGhlIExEQVAgc2VydmVyIChvciBzcGFjZSBzZXBhcmF0ZWQgbGlzdCkgKi8KLSAgICBpbnQgcG9ydDsJCQkJLyogUG9ydCBvZiB0aGUgTERBUCBzZXJ2ZXIgKi8KLSAgICBjaGFyICpiYXNlZG47CQkJLyogQmFzZSBETiB0byBkbyBhbGwgc2VhcmNoZXMgZnJvbSAqLwotICAgIGNoYXIgKmF0dHJpYnV0ZTsJCQkvKiBBdHRyaWJ1dGUgdG8gc2VhcmNoIGZvciAqLwotICAgIGNoYXIgKiphdHRyaWJ1dGVzOwkJCS8qIEFycmF5IG9mIGFsbCB0aGUgYXR0cmlidXRlcyB0byByZXR1cm4gKi8KLSAgICBpbnQgc2NvcGU7CQkJCS8qIFNjb3BlIG9mIHRoZSBzZWFyY2ggKi8KLSAgICBjaGFyICpmaWx0ZXI7CQkJLyogRmlsdGVyIHRvIGZ1cnRoZXIgbGltaXQgdGhlIHNlYXJjaCAgKi8KLSAgICBkZXJlZl9vcHRpb25zIGRlcmVmOwkJLyogaG93IHRvIGhhbmRsZSBhbGlhcyBkZXJlZmVyZW5pbmcgKi8KLSAgICBjaGFyICpiaW5kZG47CQkJLyogRE4gdG8gYmluZCB0byBzZXJ2ZXIgKGNhbiBiZSBOVUxMKSAqLwotICAgIGNoYXIgKmJpbmRwdzsJCQkvKiBQYXNzd29yZCB0byBiaW5kIHRvIHNlcnZlciAoY2FuIGJlIE5VTEwpICovCi0KLSAgICBpbnQgZnJvbnRwYWdlX2hhY2s7CQkJLyogSGFjayBmb3IgZnJvbnRwYWdlIHN1cHBvcnQgKi8KLSAgICBpbnQgdXNlcl9pc19kbjsJCQkvKiBJZiB0cnVlLCBjb25uZWN0aW9uLT51c2VyIGlzIEROIGluc3RlYWQgb2YgdXNlcmlkICovCi0gICAgaW50IGNvbXBhcmVfZG5fb25fc2VydmVyOwkJLyogSWYgdHJ1ZSwgd2lsbCB1c2Ugc2VydmVyIHRvIGRvIEROIGNvbXBhcmUgKi8KLQotICAgIGludCBoYXZlX2xkYXBfdXJsOwkJCS8qIFNldCBpZiB3ZSBoYXZlIGZvdW5kIGFuIExEQVAgdXJsICovCi0gCi0gICAgYXByX2FycmF5X2hlYWRlcl90ICpncm91cGF0dHI7CS8qIExpc3Qgb2YgR3JvdXAgYXR0cmlidXRlcyAqLwotICAgIGludCBncm91cF9hdHRyaWJfaXNfZG47CQkvKiBJZiB0cnVlLCB0aGUgZ3JvdXAgYXR0cmlidXRlIGlzIHRoZSBETiwgb3RoZXJ3aXNlLCAKLQkJCQkJICAgaXQncyB0aGUgZXhhY3Qgc3RyaW5nIHBhc3NlZCBieSB0aGUgSFRUUCBjbGllbnQgKi8KLQotICAgIGludCBuZXRzY2FwZXNzbDsJCQkvKiBUcnVlIGlmIE5ldHNjYXBlIFNTTCBpcyBlbmFibGVkICovCi0gICAgaW50IHN0YXJ0dGxzOyAgICAgICAgICAgICAgICAgICAgICAgLyogVHJ1ZSBpZiBTdGFydFRMUyBpcyBlbmFibGVkICovCi19IG1vZF9hdXRoX2xkYXBfY29uZmlnX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IG1vZF9hdXRoX2xkYXBfcmVxdWVzdF90IHsKLSAgICBjaGFyICpkbjsJCQkJLyogVGhlIHNhdmVkIGRuIGZyb20gYSBzdWNjZXNzZnVsIHNlYXJjaCAqLwotICAgIGNoYXIgKnVzZXI7CQkJCS8qIFRoZSB1c2VybmFtZSBwcm92aWRlZCBieSB0aGUgY2xpZW50ICovCi19IG1vZF9hdXRoX2xkYXBfcmVxdWVzdF90OwotCi0vKiBtYXhpbXVtIGdyb3VwIGVsZW1lbnRzIHN1cHBvcnRlZCAqLwotI2RlZmluZSBHUk9VUEFUVFJfTUFYX0VMVFMgMTAKLQotc3RydWN0IG1vZF9hdXRoX2xkYXBfZ3JvdXBhdHRyX2VudHJ5X3QgewotICAgIGNoYXIgKm5hbWU7Ci19OwotCi1tb2R1bGUgQVBfTU9EVUxFX0RFQ0xBUkVfREFUQSBhdXRoX2xkYXBfbW9kdWxlOwotCi0vKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCi12b2lkIG1vZF9hdXRoX2xkYXBfYnVpbGRfZmlsdGVyKGNoYXIgKmZpbHRidWYsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3JlYyAqciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZF9hdXRoX2xkYXBfY29uZmlnX3QgKnNlYyk7Ci1pbnQgbW9kX2F1dGhfbGRhcF9jaGVja191c2VyX2lkKHJlcXVlc3RfcmVjICpyKTsKLWludCBtb2RfYXV0aF9sZGFwX2F1dGhfY2hlY2tlcihyZXF1ZXN0X3JlYyAqcik7Ci12b2lkICptb2RfYXV0aF9sZGFwX2NyZWF0ZV9kaXJfY29uZmlnKGFwcl9wb29sX3QgKnAsIGNoYXIgKmQpOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLQotLyoKLSAqIEJ1aWxkIHRoZSBzZWFyY2ggZmlsdGVyLCBvciBhdCBsZWFzdCBhcyBtdWNoIG9mIHRoZSBzZWFyY2ggZmlsdGVyIHRoYXQKLSAqIHdpbGwgZml0IGluIHRoZSBidWZmZXIuIFdlIGRvbid0IHdvcnJ5IGFib3V0IHRoZSBidWZmZXIgbm90IGJlaW5nIGFibGUKLSAqIHRvIGhvbGQgdGhlIGVudGlyZSBmaWx0ZXIuIElmIHRoZSBidWZmZXIgd2Fzbid0IGJpZyBlbm91Z2ggdG8gaG9sZCB0aGUKLSAqIGZpbHRlciwgbGRhcF9zZWFyY2hfcyB3aWxsIGNvbXBsYWluLCBidXQgdGhlIG9ubHkgc2l0dWF0aW9uIHdoZXJlIHRoaXMKLSAqIGlzIGxpa2VseSB0byBoYXBwZW4gaXMgaWYgdGhlIGNsaWVudCBzZW50IGEgcmVhbGx5LCByZWFsbHkgbG9uZwotICogdXNlcm5hbWUsIG1vc3QgbGlrZWx5IGFzIHBhcnQgb2YgYW4gYXR0YWNrLgotICoKLSAqIFRoZSBzZWFyY2ggZmlsdGVyIGNvbnNpc3RzIG9mIHRoZSBmaWx0ZXIgcHJvdmlkZWQgd2l0aCB0aGUgVVJMLAotICogY29tYmluZWQgd2l0aCBhIGZpbHRlciBtYWRlIHVwIG9mIHRoZSBhdHRyaWJ1dGUgcHJvdmlkZWQgd2l0aCB0aGUgVVJMLAotICogYW5kIHRoZSBhY3R1YWwgdXNlcm5hbWUgcGFzc2VkIGJ5IHRoZSBIVFRQIGNsaWVudC4gRm9yIGV4YW1wbGUsIGFzc3VtZQotICogdGhhdCB0aGUgTERBUCBVUkwgaXMKLSAqIAotICogICBsZGFwOi8vbGRhcC5haXJpdXMuY29tL291PVBlb3BsZSwgbz1BaXJpdXM/dWlkPz8ocG9zaXhpZD0qKQotICoKLSAqIEZ1cnRoZXIsIGFzc3VtZSB0aGF0IHRoZSB1c2VyaWQgcGFzc2VkIGJ5IHRoZSBjbGllbnQgd2FzIGB1c2VyaicuICBUaGUKLSAqIHNlYXJjaCBmaWx0ZXIgd2lsbCBiZSAoJihwb3NpeGlkPSopKHVpZD11c2VyaikpLgotICovCi0jZGVmaW5lIEZJTFRFUl9MRU5HVEggTUFYX1NUUklOR19MRU4KLXZvaWQgbW9kX2F1dGhfbGRhcF9idWlsZF9maWx0ZXIoY2hhciAqZmlsdGJ1ZiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfcmVjICpyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kX2F1dGhfbGRhcF9jb25maWdfdCAqc2VjKQotewotICAgIGNoYXIgKnAsICpxLCAqZmlsdGJ1Zl9lbmQ7Ci0gICAgLyogCi0gICAgICogQ3JlYXRlIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBmaWx0ZXIsIHdoaWNoIGNvbnNpc3RzIG9mIHRoZSAKLSAgICAgKiBjb25maWctc3VwcGxpZWQgcG9ydGlvbnMuCi0gICAgICovCi0gICAgYXByX3NucHJpbnRmKGZpbHRidWYsIEZJTFRFUl9MRU5HVEgsICIoJiglcykoJXM9Iiwgc2VjLT5maWx0ZXIsIHNlYy0+YXR0cmlidXRlKTsKLQotICAgIC8qIAotICAgICAqIE5vdyBhZGQgdGhlIGNsaWVudC1zdXBwbGllZCB1c2VybmFtZSB0byB0aGUgZmlsdGVyLCBlbnN1cmluZyB0aGF0IGFueQotICAgICAqIExEQVAgZmlsdGVyIG1ldGFjaGFycyBhcmUgZXNjYXBlZC4KLSAgICAgKi8KLSAgICBmaWx0YnVmX2VuZCA9IGZpbHRidWYgKyBGSUxURVJfTEVOR1RIIC0gMTsKLSAgICBmb3IgKHAgPSByLT51c2VyLCBxPWZpbHRidWYgKyBzdHJsZW4oZmlsdGJ1Zik7Ci0gICAgICAgICAqcCAmJiBxIDwgZmlsdGJ1Zl9lbmQ7ICpxKysgPSAqcCsrKSB7Ci0gICAgICAgIGlmIChzdHJjaHIoIiooKVxcIiwgKnApICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpxKysgPSAnXFwnOwotICAgICAgICAgICAgaWYgKHEgPj0gZmlsdGJ1Zl9lbmQpIHsKLQkgICAgICAgIGJyZWFrOwotCSAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKnEgPSAnXDAnOwotCi0gICAgLyogCi0gICAgICogQXBwZW5kIHRoZSBjbG9zaW5nIHBhcmVucyBvZiB0aGUgZmlsdGVyLCB1bmxlc3MgZG9pbmcgc28gd291bGQgCi0gICAgICogb3ZlcnJ1biB0aGUgYnVmZmVyLgotICAgICAqLwotICAgIGlmIChxICsgMiA8PSBmaWx0YnVmX2VuZCkKLSAgICAgICAgc3RyY2F0KGZpbHRidWYsICIpKSIpOwotfQotCi0KLS8qCi0gKiBBdXRoZW50aWNhdGlvbiBQaGFzZQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBUaGlzIHBoYXNlIGF1dGhlbnRpY2F0ZXMgdGhlIGNyZWRlbnRpYWxzIHRoZSB1c2VyIGhhcyBzZW50IHdpdGgKLSAqIHRoZSByZXF1ZXN0IChpZSB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGFyZSBjaGVja2VkKS4gVGhpcyBpcyBkb25lCi0gKiBieSBtYWtpbmcgYW4gYXR0ZW1wdCB0byBiaW5kIHRvIHRoZSBMREFQIHNlcnZlciB1c2luZyB0aGlzIHVzZXIncwotICogRE4gYW5kIHRoZSBzdXBwbGllZCBwYXNzd29yZC4KLSAqCi0gKi8KLWludCBtb2RfYXV0aF9sZGFwX2NoZWNrX3VzZXJfaWQocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY29uc3QgY2hhciAqKnZhbHMgPSBOVUxMOwotICAgIGNoYXIgZmlsdGJ1ZltGSUxURVJfTEVOR1RIXTsKLSAgICBtb2RfYXV0aF9sZGFwX2NvbmZpZ190ICpzZWMgPQotICAgICAgICAobW9kX2F1dGhfbGRhcF9jb25maWdfdCAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLCAmYXV0aF9sZGFwX21vZHVsZSk7Ci0KLSAgICB1dGlsX2xkYXBfY29ubmVjdGlvbl90ICpsZGMgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKnNlbnRfcHc7Ci0gICAgaW50IHJlc3VsdCA9IDA7Ci0gICAgY29uc3QgY2hhciAqZG4gPSBOVUxMOwotCi0gICAgbW9kX2F1dGhfbGRhcF9yZXF1ZXN0X3QgKnJlcSA9Ci0gICAgICAgIChtb2RfYXV0aF9sZGFwX3JlcXVlc3RfdCAqKWFwcl9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihtb2RfYXV0aF9sZGFwX3JlcXVlc3RfdCkpOwotICAgIGFwX3NldF9tb2R1bGVfY29uZmlnKHItPnJlcXVlc3RfY29uZmlnLCAmYXV0aF9sZGFwX21vZHVsZSwgcmVxKTsKLQotICAgIGlmICghc2VjLT5lbmFibGVkKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICAvKiAKLSAgICAgKiBCYXNpYyBzYW5pdHkgY2hlY2tzIGJlZm9yZSBhbnkgTERBUCBvcGVyYXRpb25zIGV2ZW4gaGFwcGVuLgotICAgICAqLwotICAgIGlmICghc2VjLT5oYXZlX2xkYXBfdXJsKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICAvKiBUaGVyZSBpcyBhIGdvb2QgQXV0aExEQVBVUkwsIHJpZ2h0PyAqLwotICAgIGlmIChzZWMtPmhvc3QpIHsKLSAgICAgICAgbGRjID0gdXRpbF9sZGFwX2Nvbm5lY3Rpb25fZmluZChyLCBzZWMtPmhvc3QsIHNlYy0+cG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYy0+YmluZGRuLCBzZWMtPmJpbmRwdywgc2VjLT5kZXJlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYy0+bmV0c2NhcGVzc2wsIHNlYy0+c3RhcnR0bHMpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HfEFQTE9HX05PRVJSTk8sIDAsIHIsIAotICAgICAgICAgICAgICAgICAgICAgICJbJWRdIGF1dGhfbGRhcCBhdXRoZW50aWNhdGU6IG5vIHNlYy0+aG9zdCAtIHdlaXJkLi4uPyIsIGdldHBpZCgpKTsKLSAgICAgICAgcmV0dXJuIHNlYy0+YXV0aF9hdXRob3JpdGF0aXZlPyBIVFRQX1VOQVVUSE9SSVpFRCA6IERFQ0xJTkVEOwotICAgIH0KLQotICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfREVCVUd8QVBMT0dfTk9FUlJOTywgMCwgciwKLQkJICAiWyVkXSBhdXRoX2xkYXAgYXV0aGVudGljYXRlOiB1c2luZyBVUkwgJXMiLCBnZXRwaWQoKSwgc2VjLT51cmwpOwotCi0gICAgLyogR2V0IHRoZSBwYXNzd29yZCB0aGF0IHRoZSBjbGllbnQgc2VudCAqLwotICAgIGlmICgocmVzdWx0ID0gYXBfZ2V0X2Jhc2ljX2F1dGhfcHcociwgJnNlbnRfcHcpKSkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0RFQlVHfEFQTE9HX05PRVJSTk8sIDAsIHIsCi0JCSAgICAgICJbJWRdIGF1dGhfbGRhcCBhdXRoZW50aWNhdGU6ICIKLQkJICAgICAgImFwX2dldF9iYXNpY19hdXRoX3B3KCkgcmV0dXJucyAlZCIsIGdldHBpZCgpLCByZXN1bHQpOwotICAgICAgICB1dGlsX2xkYXBfY29ubmVjdGlvbl9jbG9zZShsZGMpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qIGJ1aWxkIHRoZSB1c2VybmFtZSBmaWx0ZXIgKi8KLSAgICBtb2RfYXV0aF9sZGFwX2J1aWxkX2ZpbHRlcihmaWx0YnVmLCByLCBzZWMpOwotCi0gICAgLyogZG8gdGhlIHVzZXIgc2VhcmNoICovCi0gICAgcmVzdWx0ID0gdXRpbF9sZGFwX2NhY2hlX2NoZWNrdXNlcmlkKHIsIGxkYywgc2VjLT51cmwsIHNlYy0+YmFzZWRuLCBzZWMtPnNjb3BlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWMtPmF0dHJpYnV0ZXMsIGZpbHRidWYsIHNlbnRfcHcsICZkbiwgJnZhbHMpOwotICAgIHV0aWxfbGRhcF9jb25uZWN0aW9uX2Nsb3NlKGxkYyk7Ci0KLSAgICBpZiAocmVzdWx0ICE9IExEQVBfU1VDQ0VTUykgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkd8QVBMT0dfTk9FUlJOTywgMCwgciwgCi0gICAgICAgICAgICAgICAgICAgICAgIlslZF0gYXV0aF9sZGFwIGF1dGhlbnRpY2F0ZTogIgotICAgICAgICAgICAgICAgICAgICAgICJ1c2VyICVzIGF1dGhlbnRpY2F0aW9uIGZhaWxlZDsgVVJJICVzIFslc11bJXNdIiwKLQkJICAgICAgZ2V0cGlkKCksIHItPnVzZXIsIHItPnVyaSwgbGRjLT5yZWFzb24sIGxkYXBfZXJyMnN0cmluZyhyZXN1bHQpKTsKLSAgICAgICAgaWYgKExEQVBfSU5WQUxJRF9DUkVERU5USUFMUyA9PSByZXN1bHQpIHsKLSAgICAgICAgICAgIGFwX25vdGVfYmFzaWNfYXV0aF9mYWlsdXJlKHIpOwotICAgICAgICAgICAgcmV0dXJuIEhUVFBfVU5BVVRIT1JJWkVEOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHNlYy0+YXV0aF9hdXRob3JpdGF0aXZlPyBIVFRQX1VOQVVUSE9SSVpFRDogREVDTElORUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBtYXJrIHRoZSB1c2VyIGFuZCBETiAqLwotICAgIHJlcS0+ZG4gPSBhcHJfcHN0cmR1cChyLT5wb29sLCBkbik7Ci0gICAgcmVxLT51c2VyID0gci0+dXNlcjsKLSAgICBpZiAoc2VjLT51c2VyX2lzX2RuKSB7Ci0gICAgICAgIHItPnVzZXIgPSByZXEtPmRuOwotICAgIH0KLQotICAgIC8qIGFkZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKi8KLSAgICBpZiAoc2VjLT5hdHRyaWJ1dGVzICYmIHZhbHMpIHsKLSAgICAgICAgYXByX3RhYmxlX3QgKmUgPSByLT5zdWJwcm9jZXNzX2VudjsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZSAoc2VjLT5hdHRyaWJ1dGVzW2ldKSB7Ci0gICAgICAgICAgICBjaGFyICpzdHIgPSBhcHJfcHN0cmNhdChyLT5wb29sLCAiQVVUSEVOVElDQVRFXyIsIHNlYy0+YXR0cmlidXRlc1tpXSwgTlVMTCk7Ci0gICAgICAgICAgICBpbnQgaiA9IDEzOwotICAgICAgICAgICAgd2hpbGUgKHN0cltqXSkgewotICAgICAgICAgICAgICAgIGlmIChzdHJbal0gPj0gJ2EnICYmIHN0cltqXSA8PSAneicpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyW2pdID0gc3RyW2pdIC0gKCdhJyAtICdBJyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFwcl90YWJsZV9zZXRuKGUsIHN0ciwgdmFsc1tpXSk7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0RFQlVHfEFQTE9HX05PRVJSTk8sIDAsIHIsIAotCQkgICJbJWRdIGF1dGhfbGRhcCBhdXRoZW50aWNhdGU6IGFjY2VwdGluZyAlcyIsIGdldHBpZCgpLCByLT51c2VyKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotCi0vKgotICogQXV0aG9yaXNhdGlvbiBQaGFzZQotICogLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIEFmdGVyIGNoZWNraW5nIHdoZXRoZXIgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBhcmUgY29ycmVjdCwgd2UgbmVlZAotICogdG8gY2hlY2sgd2hldGhlciB0aGF0IHVzZXIgaXMgYXV0aG9yaXNlZCB0byB2aWV3IHRoaXMgcmVzb3VyY2UuIFRoZQotICogcmVxdWlyZSBkaXJlY3RpdmUgaXMgdXNlZCB0byBkbyB0aGlzOgotICoKLSAqICByZXF1aXJlIHZhbGlkLXVzZXIJCUFueSBhdXRoZW50aWNhdGVkIGlzIGFsbG93ZWQgaW4uCi0gKiAgcmVxdWlyZSB1c2VyIDx1c2VybmFtZT4JVGhpcyBwYXJ0aWN1bGFyIHVzZXIgaXMgYWxsb3dlZCBpbi4KLSAqICByZXF1aXJlIGdyb3VwIDxncm91cG5hbWU+CVRoZSB1c2VyIG11c3QgYmUgYSBtZW1iZXIgb2YgdGhpcyBncm91cAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBvcmRlciB0byBiZSBhbGxvd2VkIGluLgotICogIHJlcXVpcmUgZG4gPGRuPiAgICAgICAgICAgICBUaGUgdXNlciBtdXN0IGhhdmUgdGhlIGZvbGxvd2luZyBETiBpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBUCB0cmVlIHRvIGJlIGxldCBpbi4KLSAqCi0gKi8KLWludCBtb2RfYXV0aF9sZGFwX2F1dGhfY2hlY2tlcihyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICBtb2RfYXV0aF9sZGFwX3JlcXVlc3RfdCAqcmVxID0KLSAgICAgICAgKG1vZF9hdXRoX2xkYXBfcmVxdWVzdF90ICopYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cmVxdWVzdF9jb25maWcsCi0gICAgICAgICZhdXRoX2xkYXBfbW9kdWxlKTsKLSAgICBtb2RfYXV0aF9sZGFwX2NvbmZpZ190ICpzZWMgPQotICAgICAgICAobW9kX2F1dGhfbGRhcF9jb25maWdfdCAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLCAKLSAgICAgICAgJmF1dGhfbGRhcF9tb2R1bGUpOwotCi0gICAgdXRpbF9sZGFwX2Nvbm5lY3Rpb25fdCAqbGRjID0gTlVMTDsKLSAgICBpbnQgbSA9IHItPm1ldGhvZF9udW1iZXI7Ci0KLSAgICBjb25zdCBhcHJfYXJyYXlfaGVhZGVyX3QgKnJlcXNfYXJyID0gYXBfcmVxdWlyZXMocik7Ci0gICAgcmVxdWlyZV9saW5lICpyZXFzID0gcmVxc19hcnIgPyAocmVxdWlyZV9saW5lICopcmVxc19hcnItPmVsdHMgOiBOVUxMOwotCi0gICAgcmVnaXN0ZXIgaW50IHg7Ci0gICAgY29uc3QgY2hhciAqdDsKLSAgICBjaGFyICp3OwotICAgIGludCBtZXRob2RfcmVzdHJpY3RlZCA9IDA7Ci0KLSAgICBpZiAoIXNlYy0+ZW5hYmxlZCkgewotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgfQotCi0gICAgaWYgKCFzZWMtPmhhdmVfbGRhcF91cmwpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIGlmIChzZWMtPmhvc3QpIHsKLSAgICAgICAgbGRjID0gdXRpbF9sZGFwX2Nvbm5lY3Rpb25fZmluZChyLCBzZWMtPmhvc3QsIHNlYy0+cG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYy0+YmluZGRuLCBzZWMtPmJpbmRwdywgc2VjLT5kZXJlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYy0+bmV0c2NhcGVzc2wsIHNlYy0+c3RhcnR0bHMpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HfEFQTE9HX05PRVJSTk8sIDAsIHIsIAotICAgICAgICAgICAgICAgICAgICAgICJbJWRdIGF1dGhfbGRhcCBhdXRob3Jpc2U6IG5vIHNlYy0+aG9zdCAtIHdlaXJkLi4uPyIsIGdldHBpZCgpKTsKLSAgICAgICAgcmV0dXJuIHNlYy0+YXV0aF9hdXRob3JpdGF0aXZlPyBIVFRQX1VOQVVUSE9SSVpFRCA6IERFQ0xJTkVEOwotICAgIH0KLQotICAgIC8qIAotICAgICAqIElmIHRoZXJlIGFyZSBubyBlbGVtZW50cyBpbiB0aGUgZ3JvdXAgYXR0cmlidXRlIGFycmF5LCB0aGUgZGVmYXVsdCBzaG91bGQgYmUKLSAgICAgKiBtZW1iZXIgYW5kIHVuaXF1ZW1lbWJlcjsgcG9wdWxhdGUgdGhlIGFycmF5IG5vdy4KLSAgICAgKi8KLSAgICBpZiAoc2VjLT5ncm91cGF0dHItPm5lbHRzID09IDApIHsKLSAgICAgICAgc3RydWN0IG1vZF9hdXRoX2xkYXBfZ3JvdXBhdHRyX2VudHJ5X3QgKmdycDsKLSAgICAgICAgYXByX2xvY2tfYWNxdWlyZShzZWMtPmxvY2spOwotICAgICAgICBncnAgPSBhcHJfYXJyYXlfcHVzaChzZWMtPmdyb3VwYXR0cik7Ci0gICAgICAgIGdycC0+bmFtZSA9ICJtZW1iZXIiOwotICAgICAgICBncnAgPSBhcHJfYXJyYXlfcHVzaChzZWMtPmdyb3VwYXR0cik7Ci0gICAgICAgIGdycC0+bmFtZSA9ICJ1bmlxdWVtZW1iZXIiOwotICAgICAgICBhcHJfbG9ja19yZWxlYXNlKHNlYy0+bG9jayk7Ci0gICAgfQotCi0gICAgaWYgKCFyZXFzX2FycikgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0RFQlVHfEFQTE9HX05PRVJSTk8sIDAsIHIsCi0JCSAgICAgICJbJWRdIGF1dGhfbGRhcCBhdXRob3Jpc2U6IG5vIHJlcXVpcmVtZW50cyBhcnJheSIsIGdldHBpZCgpKTsKLSAgICAgICAgcmV0dXJuIHNlYy0+YXV0aF9hdXRob3JpdGF0aXZlPyBIVFRQX1VOQVVUSE9SSVpFRCA6IERFQ0xJTkVEOwotICAgIH0KLQotICAgIC8qIExvb3AgdGhyb3VnaCB0aGUgcmVxdWlyZW1lbnRzIGFycmF5IHVudGlsIHRoZXJlJ3Mgbm8gZWxlbWVudHMKLSAgICAgKiBsZWZ0LCBvciBzb21ldGhpbmcgY2F1c2VzIGEgcmV0dXJuIGZyb20gaW5zaWRlIHRoZSBsb29wICovCi0gICAgZm9yKHg9MDsgeCA8IHJlcXNfYXJyLT5uZWx0czsgeCsrKSB7Ci0gICAgICAgIGlmICghIChyZXFzW3hdLm1ldGhvZF9tYXNrICYgKDEgPDwgbSkpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBtZXRob2RfcmVzdHJpY3RlZCA9IDE7Ci0JCi0gICAgICAgIHQgPSByZXFzW3hdLnJlcXVpcmVtZW50OwotICAgICAgICB3ID0gYXBfZ2V0d29yZChyLT5wb29sLCAmdCwgJyAnKTsKLSAgICAKLSAgICAgICAgaWYgKHN0cmNtcCh3LCAidmFsaWQtdXNlciIpID09IDApIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBWYWxpZCB1c2VyIHdpbGwgYWx3YXlzIGJlIHRydWUgaWYgd2UgYXV0aGVudGljYXRlZCB3aXRoIGxkYXAsCi0gICAgICAgICAgICAgKiBidXQgd2hlbiB1c2luZyBmcm9udCBwYWdlLCB2YWxpZCB1c2VyIHNob3VsZCBvbmx5IGJlIHRydWUgaWYKLSAgICAgICAgICAgICAqIGhlIGV4aXN0cyBpbiB0aGUgZnJvbnRwYWdlIHBhc3N3b3JkIGZpbGUuIFRoaXMgaGFjayB3aWxsIGdldAotICAgICAgICAgICAgICogYXV0aF9sZGFwIHRvIGxvb2sgdXAgdGhlIHVzZXIgaW4gdGhlIHRoZSBwdyBmaWxlIHRvIHJlYWxseSBiZQotICAgICAgICAgICAgICogc3VyZSB0aGF0IGhlJ3MgdmFsaWQuIE5hdHVyYWxseSwgaXQgcmVxdWlyZXMgbW9kX2F1dGggdG8gYmUKLSAgICAgICAgICAgICAqIGNvbXBpbGVkIGluLCBidXQgaWYgbW9kX2F1dGggd2Fzbid0IGluIHRoZXJlLCB0aGVuIHRoZSBuZWVkCi0gICAgICAgICAgICAgKiBmb3IgdGhpcyBoYWNrIHdvdWxkbid0IGV4aXN0IGFueXdheS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHNlYy0+ZnJvbnRwYWdlX2hhY2spIHsKLQkgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfREVCVUd8QVBMT0dfTk9FUlJOTywgMCwgciwgCi0JCQkgICAgICAiWyVkXSBhdXRoX2xkYXAgYXV0aG9yaXNlOiAiCi0JCQkgICAgICAiZGVmZXJyaW5nIGF1dGhvcmlzYXRpb24gdG8gbW9kX2F1dGggKEZQIEhhY2spIiwgCi0JCQkgICAgICBnZXRwaWQoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19ERUJVR3xBUExPR19OT0VSUk5PLCAwLCByLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbJWRdIGF1dGhfbGRhcCBhdXRob3Jpc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdWNjZXNzZnVsIGF1dGhvcmlzYXRpb24gYmVjYXVzZSB1c2VyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpcyB2YWxpZC11c2VyIiwgZ2V0cGlkKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJjbXAodywgInVzZXIiKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAocmVxLT5kbiA9PSBOVUxMIHx8IHN0cmxlbihyZXEtPmRuKSA9PSAwKSB7Ci0JICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0RFQlVHfEFQTE9HX05PRVJSTk8sIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWyVkXSBhdXRoX2xkYXAgYXV0aG9yaXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZSB1c2VyOiB1c2VyJ3MgRE4gaGFzIG5vdCBiZWVuIGRlZmluZWQ7IGZhaWxpbmcgYXV0aG9yaXNhdGlvbiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0cGlkKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBzZWMtPmF1dGhfYXV0aG9yaXRhdGl2ZT8gSFRUUF9VTkFVVEhPUklaRUQgOiBERUNMSU5FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIAotICAgICAgICAgICAgICogRmlyc3QgZG8gYSB3aG9sZS1saW5lIGNvbXBhcmUsIGluIGNhc2UgaXQncyBzb21ldGhpbmcgbGlrZQotICAgICAgICAgICAgICogICByZXF1aXJlIHVzZXIgQmFicyBKZW5zZW4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcmVzdWx0ID0gdXRpbF9sZGFwX2NhY2hlX2NvbXBhcmUociwgbGRjLCBzZWMtPnVybCwgcmVxLT5kbiwgc2VjLT5hdHRyaWJ1dGUsIHQpOwotICAgICAgICAgICAgc3dpdGNoKHJlc3VsdCkgewotICAgICAgICAgICAgICAgIGNhc2UgTERBUF9DT01QQVJFX1RSVUU6IHsKLSAgICAgICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19ERUJVR3xBUExPR19OT0VSUk5PLCAwLCByLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWyVkXSBhdXRoX2xkYXAgYXV0aG9yaXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmUgdXNlcjogYXV0aG9yaXNhdGlvbiBzdWNjZXNzZnVsIiwgZ2V0cGlkKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19ERUJVR3xBUExPR19OT0VSUk5PLCAwLCByLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWyVkXSBhdXRoX2xkYXAgYXV0aG9yaXNlOiByZXF1aXJlIHVzZXI6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXV0aG9yaXNhdGlvbiBmYWlsZWQgWyVzXVslc10iLCBnZXRwaWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZGMtPnJlYXNvbiwgbGRhcF9lcnIyc3RyaW5nKHJlc3VsdCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIAotICAgICAgICAgICAgICogTm93IGJyZWFrIGFwYXJ0IHRoZSBsaW5lIGFuZCBjb21wYXJlIGVhY2ggd29yZCBvbiBpdCAKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgd2hpbGUgKHRbMF0pIHsKLQkgICAgICAgIHcgPSBhcF9nZXR3b3JkX2NvbmYoci0+cG9vbCwgJnQpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHV0aWxfbGRhcF9jYWNoZV9jb21wYXJlKHIsIGxkYywgc2VjLT51cmwsIHJlcS0+ZG4sIHNlYy0+YXR0cmlidXRlLCB3KTsKLSAgICAgICAgICAgICAgICBzd2l0Y2gocmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTERBUF9DT01QQVJFX1RSVUU6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfREVCVUd8QVBMT0dfTk9FUlJOTywgMCwgciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbJWRdIGF1dGhfbGRhcCBhdXRob3Jpc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmUgdXNlcjogYXV0aG9yaXNhdGlvbiBzdWNjZXNzZnVsIiwgZ2V0cGlkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfREVCVUd8QVBMT0dfTk9FUlJOTywgMCwgciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbJWRdIGF1dGhfbGRhcCBhdXRob3Jpc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmUgdXNlcjogYXV0aG9yaXNhdGlvbiBmYWlsZWQgWyVzXVslc10iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRwaWQoKSwgbGRjLT5yZWFzb24sIGxkYXBfZXJyMnN0cmluZyhyZXN1bHQpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJjbXAodywgImRuIikgPT0gMCkgewotICAgICAgICAgICAgaWYgKHJlcS0+ZG4gPT0gTlVMTCB8fCBzdHJsZW4ocmVxLT5kbikgPT0gMCkgewotICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfREVCVUd8QVBMT0dfTk9FUlJOTywgMCwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbJWRdIGF1dGhfbGRhcCBhdXRob3Jpc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlIGRuOiB1c2VyJ3MgRE4gaGFzIG5vdCBiZWVuIGRlZmluZWQ7IGZhaWxpbmcgYXV0aG9yaXNhdGlvbiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0cGlkKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBzZWMtPmF1dGhfYXV0aG9yaXRhdGl2ZT8gSFRUUF9VTkFVVEhPUklaRUQgOiBERUNMSU5FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdWx0ID0gdXRpbF9sZGFwX2NhY2hlX2NvbXBhcmVkbihyLCBsZGMsIHNlYy0+dXJsLCByZXEtPmRuLCB0LCBzZWMtPmNvbXBhcmVfZG5fb25fc2VydmVyKTsKLSAgICAgICAgICAgIHN3aXRjaChyZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIExEQVBfQ09NUEFSRV9UUlVFOiB7Ci0gICAgICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfREVCVUd8QVBMT0dfTk9FUlJOTywgMCwgciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlslZF0gYXV0aF9sZGFwIGF1dGhvcmlzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlIGRuOiBhdXRob3Jpc2F0aW9uIHN1Y2Nlc3NmdWwiLCBnZXRwaWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0RFQlVHfEFQTE9HX05PRVJSTk8sIDAsIHIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbJWRdIGF1dGhfbGRhcCBhdXRob3Jpc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZSBkbjogTERBUCBlcnJvciBbJXNdWyVzXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0cGlkKCksIGxkYy0+cmVhc29uLCBsZGFwX2VycjJzdHJpbmcocmVzdWx0KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNtcCh3LCAiZ3JvdXAiKSA9PSAwKSB7Ci0gICAgICAgICAgICBzdHJ1Y3QgbW9kX2F1dGhfbGRhcF9ncm91cGF0dHJfZW50cnlfdCAqZW50ID0gKHN0cnVjdCBtb2RfYXV0aF9sZGFwX2dyb3VwYXR0cl9lbnRyeV90ICopIHNlYy0+Z3JvdXBhdHRyLT5lbHRzOwotICAgICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgICAgIGlmIChzZWMtPmdyb3VwX2F0dHJpYl9pc19kbikgewotICAgICAgICAgICAgICAgIGlmIChyZXEtPmRuID09IE5VTEwgfHwgc3RybGVuKHJlcS0+ZG4pID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19ERUJVR3xBUExPR19OT0VSUk5PLCAwLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbJWRdIGF1dGhfbGRhcCBhdXRob3Jpc2U6IHJlcXVpcmUgZ3JvdXA6IHVzZXIncyBETiBoYXMgbm90IGJlZW4gZGVmaW5lZDsgZmFpbGluZyBhdXRob3Jpc2F0aW9uIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0cGlkKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VjLT5hdXRoX2F1dGhvcml0YXRpdmU/IEhUVFBfVU5BVVRIT1JJWkVEIDogREVDTElORUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcS0+dXNlciA9PSBOVUxMIHx8IHN0cmxlbihyZXEtPnVzZXIpID09IDApIHsKLQkgICAgICAgICAgICAvKiBXZSB3ZXJlbid0IGNhbGxlZCBpbiB0aGUgYXV0aGVudGljYXRpb24gcGhhc2UsIHNvIHdlIGRpZG4ndCBoYXZlIGEgCi0gICAgICAgICAgICAgICAgICAgICAqIGNoYW5jZSB0byBzZXQgdGhlIHVzZXIgZmllbGQuIERvIHNvIG5vdy4gKi8KLSAgICAgICAgICAgICAgICAgICAgcmVxLT51c2VyID0gci0+dXNlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfREVCVUd8QVBMT0dfTk9FUlJOTywgMCwgciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJbJWRdIGF1dGhfbGRhcCBhdXRob3Jpc2U6IHJlcXVpcmUgZ3JvdXA6IHRlc3RpbmcgZm9yIGdyb3VwIG1lbWJlcnNoaXAgaW4gYCVzJyIsIAotCQkgICAgICAgICAgZ2V0cGlkKCksIHQpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2VjLT5ncm91cGF0dHItPm5lbHRzOyBpKyspIHsKLQkgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfREVCVUd8QVBMT0dfTk9FUlJOTywgMCwgciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWyVkXSBhdXRoX2xkYXAgYXV0aG9yaXNlOiByZXF1aXJlIGdyb3VwOiB0ZXN0aW5nIGZvciAlczogJXMgKCVzKSIsIGdldHBpZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50W2ldLm5hbWUsIHNlYy0+Z3JvdXBfYXR0cmliX2lzX2RuID8gcmVxLT5kbiA6IHJlcS0+dXNlciwgdCk7Ci0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSB1dGlsX2xkYXBfY2FjaGVfY29tcGFyZShyLCBsZGMsIHNlYy0+dXJsLCB0LCBlbnRbaV0ubmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjLT5ncm91cF9hdHRyaWJfaXNfZG4gPyByZXEtPmRuIDogcmVxLT51c2VyKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2gocmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTERBUF9DT01QQVJFX1RSVUU6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfREVCVUd8QVBMT0dfTk9FUlJOTywgMCwgciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbJWRdIGF1dGhfbGRhcCBhdXRob3Jpc2U6IHJlcXVpcmUgZ3JvdXA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1dGhvcmlzYXRpb24gc3VjY2Vzc2Z1bCAoYXR0cmlidXRlICVzKSBbJXNdWyVzXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHBpZCgpLCBlbnRbaV0ubmFtZSwgbGRjLT5yZWFzb24sIGxkYXBfZXJyMnN0cmluZyhyZXN1bHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0RFQlVHfEFQTE9HX05PRVJSTk8sIDAsIHIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWyVkXSBhdXRoX2xkYXAgYXV0aG9yaXNlOiByZXF1aXJlIGdyb3VwOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdXRob3Jpc2F0aW9uIGZhaWxlZCBbJXNdWyVzXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHBpZCgpLCBsZGMtPnJlYXNvbiwgbGRhcF9lcnIyc3RyaW5nKHJlc3VsdCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFtZXRob2RfcmVzdHJpY3RlZCkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0RFQlVHfEFQTE9HX05PRVJSTk8sIDAsIHIsIAotICAgICAgICAgICAgICAgICAgICAgICJbJWRdIGF1dGhfbGRhcCBhdXRob3Jpc2U6IGFncmVlaW5nIGJlY2F1c2Ugbm9uLXJlc3RyaWN0ZWQiLCAKLSAgICAgICAgICAgICAgICAgICAgICBnZXRwaWQoKSk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBpZiAoIXNlYy0+YXV0aF9hdXRob3JpdGF0aXZlKSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfREVCVUd8QVBMT0dfTk9FUlJOTywgMCwgciwgCi0gICAgICAgICAgICAgICAgICAgICAgIlslZF0gYXV0aF9sZGFwIGF1dGhvcmlzZTogZGVjbGluaW5nIHRvIGF1dGhvcmlzZSIsIGdldHBpZCgpKTsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfREVCVUd8QVBMT0dfTk9FUlJOTywgMCwgciwgCi0gICAgICAgICAgICAgICAgICAiWyVkXSBhdXRoX2xkYXAgYXV0aG9yaXNlOiBhdXRob3Jpc2F0aW9uIGRlbmllZCIsIGdldHBpZCgpKTsKLSAgICBhcF9ub3RlX2Jhc2ljX2F1dGhfZmFpbHVyZSAocik7Ci0KLSAgICByZXR1cm4gSFRUUF9VTkFVVEhPUklaRUQ7Ci19Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogY29uZmlnIGRpcmVjdGl2ZXMgKi8KLQotCi12b2lkICptb2RfYXV0aF9sZGFwX2NyZWF0ZV9kaXJfY29uZmlnKGFwcl9wb29sX3QgKnAsIGNoYXIgKmQpCi17Ci0gICAgbW9kX2F1dGhfbGRhcF9jb25maWdfdCAqc2VjID0gCi0gICAgICAgIChtb2RfYXV0aF9sZGFwX2NvbmZpZ190ICopYXByX3BjYWxsb2MocCwgc2l6ZW9mKG1vZF9hdXRoX2xkYXBfY29uZmlnX3QpKTsKLQotICAgIHNlYy0+cG9vbCA9IHA7Ci0gICAgYXByX2xvY2tfY3JlYXRlKCZzZWMtPmxvY2ssIEFQUl9NVVRFWCwgQVBSX0lOVFJBUFJPQ0VTUywgTlVMTCwgcCk7Ci0gICAgc2VjLT5hdXRoX2F1dGhvcml0YXRpdmUgPSAxOwotICAgIHNlYy0+ZW5hYmxlZCA9IDE7Ci0gICAgc2VjLT5ncm91cGF0dHIgPSBhcHJfYXJyYXlfbWFrZShwLCBHUk9VUEFUVFJfTUFYX0VMVFMsIAotCQkJCSAgIHNpemVvZihzdHJ1Y3QgbW9kX2F1dGhfbGRhcF9ncm91cGF0dHJfZW50cnlfdCkpOwotCi0gICAgc2VjLT5oYXZlX2xkYXBfdXJsID0gMDsKLSAgICBzZWMtPnVybCA9ICIiOwotICAgIHNlYy0+aG9zdCA9IE5VTEw7Ci0gICAgc2VjLT5iaW5kZG4gPSBOVUxMOwotICAgIHNlYy0+YmluZHB3ID0gTlVMTDsKLSAgICBzZWMtPmRlcmVmID0gYWx3YXlzOwotICAgIHNlYy0+Z3JvdXBfYXR0cmliX2lzX2RuID0gMTsKLQotICAgIHNlYy0+ZnJvbnRwYWdlX2hhY2sgPSAwOwotICAgIHNlYy0+bmV0c2NhcGVzc2wgPSAwOwotICAgIHNlYy0+c3RhcnR0bHMgPSAwOwotCi0gICAgc2VjLT51c2VyX2lzX2RuID0gMDsKLSAgICBzZWMtPmNvbXBhcmVfZG5fb25fc2VydmVyID0gMDsKLQotICAgIHJldHVybiBzZWM7Ci19Ci0KLS8qIAotICogVXNlIHRoZSBsZGFwIHVybCBwYXJzaW5nIHJvdXRpbmVzIHRvIGJyZWFrIHVwIHRoZSBsZGFwIHVybCBpbnRvCi0gKiBob3N0IGFuZCBwb3J0LgotICovCi1zdGF0aWMgY29uc3QgY2hhciAqbW9kX2F1dGhfbGRhcF9wYXJzZV91cmwoY21kX3Bhcm1zICpjbWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsKQotewotICAgIGludCByZXN1bHQ7Ci0gICAgTERBUFVSTERlc2MgKnVybGQ7Ci0KLSAgICBtb2RfYXV0aF9sZGFwX2NvbmZpZ190ICpzZWMgPSBjb25maWc7Ci0KLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfREVCVUd8QVBMT0dfTk9FUlJOTywgMCwKLQkgICAgICAgICBjbWQtPnNlcnZlciwgIlslZF0gYXV0aF9sZGFwIHVybCBwYXJzZTogYCVzJyIsIAotCSAgICAgICAgIGdldHBpZCgpLCB1cmwpOwotCi0gICAgcmVzdWx0ID0gbGRhcF91cmxfcGFyc2UodXJsLCAmKHVybGQpKTsKLSAgICBpZiAocmVzdWx0ICE9IExEQVBfU1VDQ0VTUykgewotICAgICAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICBjYXNlIExEQVBfVVJMX0VSUl9OT1RMREFQOgotICAgICAgICAgICAgcmV0dXJuICJMREFQIFVSTCBkb2VzIG5vdCBiZWdpbiB3aXRoIGxkYXA6Ly8iOwotICAgICAgICBjYXNlIExEQVBfVVJMX0VSUl9OT0ROOgotICAgICAgICAgICAgcmV0dXJuICJMREFQIFVSTCBkb2VzIG5vdCBoYXZlIGEgRE4iOwotICAgICAgICBjYXNlIExEQVBfVVJMX0VSUl9CQURTQ09QRToKLSAgICAgICAgICAgIHJldHVybiAiTERBUCBVUkwgaGFzIGFuIGludmFsaWQgc2NvcGUiOwotICAgICAgICBjYXNlIExEQVBfVVJMX0VSUl9NRU06Ci0gICAgICAgICAgICByZXR1cm4gIk91dCBvZiBtZW1vcnkgcGFyc2luZyBMREFQIFVSTCI7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gIkNvdWxkIG5vdCBwYXJzZSBMREFQIFVSTCI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc2VjLT51cmwgPSBhcHJfcHN0cmR1cChjbWQtPnBvb2wsIHVybCk7Ci0KLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfREVCVUd8QVBMT0dfTk9FUlJOTywgMCwKLQkgICAgICAgICBjbWQtPnNlcnZlciwgIlslZF0gYXV0aF9sZGFwIHVybCBwYXJzZTogSG9zdDogJXMiLCBnZXRwaWQoKSwgdXJsZC0+bHVkX2hvc3QpOwotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19ERUJVR3xBUExPR19OT0VSUk5PLCAwLAotCSAgICAgICAgIGNtZC0+c2VydmVyLCAiWyVkXSBhdXRoX2xkYXAgdXJsIHBhcnNlOiBQb3J0OiAlZCIsIGdldHBpZCgpLCB1cmxkLT5sdWRfcG9ydCk7Ci0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0RFQlVHfEFQTE9HX05PRVJSTk8sIDAsCi0JICAgICAgICAgY21kLT5zZXJ2ZXIsICJbJWRdIGF1dGhfbGRhcCB1cmwgcGFyc2U6IEROOiAlcyIsIGdldHBpZCgpLCB1cmxkLT5sdWRfZG4pOwotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19ERUJVR3xBUExPR19OT0VSUk5PLCAwLAotCSAgICAgICAgIGNtZC0+c2VydmVyLCAiWyVkXSBhdXRoX2xkYXAgdXJsIHBhcnNlOiBhdHRyaWI6ICVzIiwgZ2V0cGlkKCksIHVybGQtPmx1ZF9hdHRycz8gdXJsZC0+bHVkX2F0dHJzWzBdIDogIihudWxsKSIpOwotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19ERUJVR3xBUExPR19OT0VSUk5PLCAwLAotCSAgICAgICAgIGNtZC0+c2VydmVyLCAiWyVkXSBhdXRoX2xkYXAgdXJsIHBhcnNlOiBzY29wZTogJXMiLCBnZXRwaWQoKSwgCi0JICAgICAgICAgKHVybGQtPmx1ZF9zY29wZSA9PSBMREFQX1NDT1BFX1NVQlRSRUU/ICJzdWJ0cmVlIiA6IAotCQkgdXJsZC0+bHVkX3Njb3BlID09IExEQVBfU0NPUEVfQkFTRT8gImJhc2UiIDogCi0JCSB1cmxkLT5sdWRfc2NvcGUgPT0gTERBUF9TQ09QRV9PTkVMRVZFTD8gIm9uZWxldmVsIiA6ICJ1bmtub3duIikpOwotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19ERUJVR3xBUExPR19OT0VSUk5PLCAwLAotCSAgICAgICAgIGNtZC0+c2VydmVyLCAiWyVkXSBhdXRoX2xkYXAgdXJsIHBhcnNlOiBmaWx0ZXI6ICVzIiwgZ2V0cGlkKCksIHVybGQtPmx1ZF9maWx0ZXIpOwotCi0gICAgLyogU2V0IGFsbCB0aGUgdmFsdWVzLCBvciBhdCBsZWFzdCBzb21lIHNhbmUgZGVmYXVsdHMgKi8KLSAgICBpZiAoc2VjLT5ob3N0KSB7Ci0gICAgICAgIGNoYXIgKnAgPSBhcHJfcGFsbG9jKGNtZC0+cG9vbCwgc3RybGVuKHNlYy0+aG9zdCkgKyBzdHJsZW4odXJsZC0+bHVkX2hvc3QpICsgMik7Ci0gICAgICAgIHN0cmNweShwLCB1cmxkLT5sdWRfaG9zdCk7Ci0gICAgICAgIHN0cmNhdChwLCAiICIpOwotICAgICAgICBzdHJjYXQocCwgc2VjLT5ob3N0KTsKLSAgICAgICAgc2VjLT5ob3N0ID0gcDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHNlYy0+aG9zdCA9IHVybGQtPmx1ZF9ob3N0PyBhcHJfcHN0cmR1cChjbWQtPnBvb2wsIHVybGQtPmx1ZF9ob3N0KSA6ICJsb2NhbGhvc3QiOwotICAgIH0KLSAgICBzZWMtPmJhc2VkbiA9IHVybGQtPmx1ZF9kbj8gYXByX3BzdHJkdXAoY21kLT5wb29sLCB1cmxkLT5sdWRfZG4pIDogIiI7Ci0gICAgaWYgKHVybGQtPmx1ZF9hdHRycyAmJiB1cmxkLT5sdWRfYXR0cnNbMF0pIHsKLSAgICAgICAgaW50IGkgPSAxOwotICAgICAgICB3aGlsZSAodXJsZC0+bHVkX2F0dHJzW2ldKSB7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAgICAgc2VjLT5hdHRyaWJ1dGVzID0gYXByX3BjYWxsb2MoY21kLT5wb29sLCBzaXplb2YoY2hhciAqKSAqIChpKzEpKTsKLSAgICAgICAgaSA9IDA7Ci0gICAgICAgIHdoaWxlICh1cmxkLT5sdWRfYXR0cnNbaV0pIHsKLSAgICAgICAgICAgIHNlYy0+YXR0cmlidXRlc1tpXSA9IGFwcl9wc3RyZHVwKGNtZC0+cG9vbCwgdXJsZC0+bHVkX2F0dHJzW2ldKTsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgICAgICBzZWMtPmF0dHJpYnV0ZSA9IHNlYy0+YXR0cmlidXRlc1swXTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHNlYy0+YXR0cmlidXRlID0gInVpZCI7Ci0gICAgfQotCi0gICAgc2VjLT5zY29wZSA9IHVybGQtPmx1ZF9zY29wZSA9PSBMREFQX1NDT1BFX09ORUxFVkVMID8KLSAgICAgICAgTERBUF9TQ09QRV9PTkVMRVZFTCA6IExEQVBfU0NPUEVfU1VCVFJFRTsKLQotICAgIGlmICh1cmxkLT5sdWRfZmlsdGVyKSB7Ci0gICAgICAgIGlmICh1cmxkLT5sdWRfZmlsdGVyWzBdID09ICcoJykgewotICAgICAgICAgICAgLyogCi0JICAgICAqIEdldCByaWQgb2YgdGhlIHN1cnJvdW5kaW5nIHBhcmVuczsgbGF0ZXIgb24gd2hlbiBnZW5lcmF0aW5nIHRoZQotCSAgICAgKiBmaWx0ZXIsIHRoZXknbGwgYmUgcHV0IGJhY2suCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHNlYy0+ZmlsdGVyID0gYXByX3BzdHJkdXAoY21kLT5wb29sLCB1cmxkLT5sdWRfZmlsdGVyKzEpOwotICAgICAgICAgICAgc2VjLT5maWx0ZXJbc3RybGVuKHNlYy0+ZmlsdGVyKS0xXSA9ICdcMCc7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzZWMtPmZpbHRlciA9IGFwcl9wc3RyZHVwKGNtZC0+cG9vbCwgdXJsZC0+bHVkX2ZpbHRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHNlYy0+ZmlsdGVyID0gIm9iamVjdGNsYXNzPSoiOwotICAgIH0KLSAgICBpZiAoc3RybmNtcCh1cmwsICJsZGFwcyIsIDUpID09IDApIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0RFQlVHfEFQTE9HX05PRVJSTk8sIDAsCi0JCSAgICAgY21kLT5zZXJ2ZXIsICJbJWRdIGF1dGhfbGRhcCBwYXJzZSB1cmw6IHJlcXVlc3Rpbmcgc2VjdXJlIExEQVAiLCBnZXRwaWQoKSk7Ci0jaWZkZWYgQVBVX0hBU19MREFQX1NUQVJUVExTCi0gICAgICAgIHNlYy0+cG9ydCA9IHVybGQtPmx1ZF9wb3J0PyB1cmxkLT5sdWRfcG9ydCA6IExEQVBTX1BPUlQ7Ci0gICAgICAgIHNlYy0+c3RhcnR0bHMgPSAxOwotI2Vsc2UKLSNpZmRlZiBBUFVfSEFTX0xEQVBfTkVUU0NBUEVfU1NMCi0gICAgICAgIHNlYy0+cG9ydCA9IHVybGQtPmx1ZF9wb3J0PyB1cmxkLT5sdWRfcG9ydCA6IExEQVBTX1BPUlQ7Ci0gICAgICAgIHNlYy0+bmV0c2NhcGVzc2wgPSAxOwotI2Vsc2UKLSAgICAgICAgcmV0dXJuICJTZWN1cmUgTERBUCAobGRhcHM6Ly8pIG5vdCBzdXBwb3J0ZWQuIFJlYnVpbGQgQVBSLVV0aWwiOwotI2VuZGlmCi0jZW5kaWYKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19ERUJVR3xBUExPR19OT0VSUk5PLCAwLAotCQkgICAgIGNtZC0+c2VydmVyLCAiWyVkXSBhdXRoX2xkYXAgcGFyc2UgdXJsOiBub3QgcmVxdWVzdGluZyBzZWN1cmUgTERBUCIsIGdldHBpZCgpKTsKLSAgICAgICAgc2VjLT5uZXRzY2FwZXNzbCA9IDA7Ci0gICAgICAgIHNlYy0+c3RhcnR0bHMgPSAwOwotICAgICAgICBzZWMtPnBvcnQgPSB1cmxkLT5sdWRfcG9ydD8gdXJsZC0+bHVkX3BvcnQgOiBMREFQX1BPUlQ7Ci0gICAgfQotCi0gICAgc2VjLT5oYXZlX2xkYXBfdXJsID0gMTsKLSAgICBsZGFwX2ZyZWVfdXJsZGVzYyh1cmxkKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKm1vZF9hdXRoX2xkYXBfc2V0X2RlcmVmKGNtZF9wYXJtcyAqY21kLCB2b2lkICpjb25maWcsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBtb2RfYXV0aF9sZGFwX2NvbmZpZ190ICpzZWMgPSBjb25maWc7Ci0KLSAgICBpZiAoc3RyY21wKGFyZywgIm5ldmVyIikgPT0gMCB8fCBzdHJjYXNlY21wKGFyZywgIm9mZiIpID09IDApIHsKLSAgICAgICAgc2VjLT5kZXJlZiA9IG5ldmVyOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAic2VhcmNoaW5nIikgPT0gMCkgewotICAgICAgICBzZWMtPmRlcmVmID0gc2VhcmNoaW5nOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiZmluZGluZyIpID09IDApIHsKLSAgICAgICAgc2VjLT5kZXJlZiA9IGZpbmRpbmc7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICJhbHdheXMiKSA9PSAwIHx8IHN0cmNhc2VjbXAoYXJnLCAib24iKSA9PSAwKSB7Ci0gICAgICAgIHNlYy0+ZGVyZWYgPSBhbHdheXM7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXR1cm4gIlVucmVjb2duaXplZCB2YWx1ZSBmb3IgQXV0aExEQVBBbGlhc0RlcmVmZXJlbmNlIGRpcmVjdGl2ZSI7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqbW9kX2F1dGhfbGRhcF9hZGRfZ3JvdXBfYXR0cmlidXRlKGNtZF9wYXJtcyAqY21kLCB2b2lkICpjb25maWcsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBzdHJ1Y3QgbW9kX2F1dGhfbGRhcF9ncm91cGF0dHJfZW50cnlfdCAqbmV3OwotCi0gICAgbW9kX2F1dGhfbGRhcF9jb25maWdfdCAqc2VjID0gY29uZmlnOwotCi0gICAgaWYgKHNlYy0+Z3JvdXBhdHRyLT5uZWx0cyA+IEdST1VQQVRUUl9NQVhfRUxUUykKLSAgICAgICAgcmV0dXJuICJUb28gbWFueSBBdXRoTERBUEdyb3VwQXR0cmlidXRlIGRpcmVjdGl2ZXMiOwotCi0gICAgbmV3ID0gYXByX2FycmF5X3B1c2goc2VjLT5ncm91cGF0dHIpOwotICAgIG5ldy0+bmFtZSA9IGFwcl9wc3RyZHVwKGNtZC0+cG9vbCwgYXJnKTsKLSAgCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbW1hbmRfcmVjIG1vZF9hdXRoX2xkYXBfY21kc1tdID0gewotICAgIEFQX0lOSVRfVEFLRTEoIkF1dGhMREFQVVJMIiwgbW9kX2F1dGhfbGRhcF9wYXJzZV91cmwsIE5VTEwsIE9SX0FVVEhDRkcsIAotICAgICAgICAgICAgICAgICAgIlVSTCB0byBkZWZpbmUgTERBUCBjb25uZWN0aW9uLiBUaGlzIHNob3VsZCBiZSBhbiBSRkMgMjI1NSBjb21wbGFpbnRcbiIKLSAgICAgICAgICAgICAgICAgICJVUkwgb2YgdGhlIGZvcm0gbGRhcDovL2hvc3RbOnBvcnRdL2Jhc2Vkbls/YXR0cmliWz9zY29wZVs/ZmlsdGVyXV1dLlxuIgotICAgICAgICAgICAgICAgICAgIjx1bD5cbiIKLSAgICAgICAgICAgICAgICAgICI8bGk+SG9zdCBpcyB0aGUgbmFtZSBvZiB0aGUgTERBUCBzZXJ2ZXIuIFVzZSBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGhvc3RzIFxuIgotICAgICAgICAgICAgICAgICAgInRvIHNwZWNpZnkgcmVkdW5kYW50IHNlcnZlcnMuXG4iCi0gICAgICAgICAgICAgICAgICAiPGxpPlBvcnQgaXMgb3B0aW9uYWwsIGFuZCBzcGVjaWZpZXMgdGhlIHBvcnQgdG8gY29ubmVjdCB0by5cbiIKLSAgICAgICAgICAgICAgICAgICI8bGk+YmFzZWRuIHNwZWNpZmllcyB0aGUgYmFzZSBETiB0byBzdGFydCBzZWFyY2hlcyBmcm9tXG4iCi0gICAgICAgICAgICAgICAgICAiPGxpPkF0dHJpYiBzcGVjaWZpZXMgd2hhdCBhdHRyaWJ1dGUgdG8gc2VhcmNoIGZvciBpbiB0aGUgZGlyZWN0b3J5LiBJZiBub3QgIgotICAgICAgICAgICAgICAgICAgInByb3ZpZGVkLCBpdCBkZWZhdWx0cyB0byA8Yj51aWQ8L2I+LlxuIgotICAgICAgICAgICAgICAgICAgIjxsaT5TY29wZSBpcyB0aGUgc2NvcGUgb2YgdGhlIHNlYXJjaCwgYW5kIGNhbiBiZSBlaXRoZXIgPGI+c3ViPC9iPiBvciAiCi0gICAgICAgICAgICAgICAgICAiPGI+b25lPC9iPi4gSWYgbm90IHByb3ZpZGVkLCB0aGUgZGVmYXVsdCBpcyA8Yj5zdWI8L2I+LlxuIgotICAgICAgICAgICAgICAgICAgIjxsaT5GaWx0ZXIgaXMgYSBmaWx0ZXIgdG8gdXNlIGluIHRoZSBzZWFyY2guIElmIG5vdCBwcm92aWRlZCwgIgotICAgICAgICAgICAgICAgICAgImRlZmF1bHRzIHRvIDxiPihvYmplY3RDbGFzcz0qKTwvYj4uXG4iCi0gICAgICAgICAgICAgICAgICAiPC91bD5cbiIKLSAgICAgICAgICAgICAgICAgICJTZWFyY2hlcyBhcmUgcGVyZm9ybWVkIHVzaW5nIHRoZSBhdHRyaWJ1dGUgYW5kIHRoZSBmaWx0ZXIgY29tYmluZWQuICIKLSAgICAgICAgICAgICAgICAgICJGb3IgZXhhbXBsZSwgYXNzdW1lIHRoYXQgdGhlXG4iCi0gICAgICAgICAgICAgICAgICAiTERBUCBVUkwgaXMgPGI+bGRhcDovL2xkYXAuYWlyaXVzLmNvbS9vdT1QZW9wbGUsIG89QWlyaXVzP3VpZD9zdWI/KHBvc2l4aWQ9Kik8L2I+LiAiCi0gICAgICAgICAgICAgICAgICAiU2VhcmNoZXMgd2lsbFxuIgotICAgICAgICAgICAgICAgICAgImJlIGRvbmUgdXNpbmcgdGhlIGZpbHRlciA8Yj4oJigocG9zaXhpZD0qKSkodWlkPTxpPnVzZXJuYW1lPC9pPikpPC9iPiwgIgotICAgICAgICAgICAgICAgICAgIndoZXJlIDxpPnVzZXJuYW1lPC9pPlxuIgotICAgICAgICAgICAgICAgICAgImlzIHRoZSB1c2VyIG5hbWUgcGFzc2VkIGJ5IHRoZSBIVFRQIGNsaWVudC4gVGhlIHNlYXJjaCB3aWxsIGJlIGEgc3VidHJlZSAiCi0gICAgICAgICAgICAgICAgICAic2VhcmNoIG9uIHRoZSBicmFuY2ggPGI+b3U9UGVvcGxlLCBvPUFpcml1czwvYj4uIiksCi0KLSAgICBBUF9JTklUX1RBS0UxKCJBdXRoTERBUEJpbmRETiIsIGFwX3NldF9zdHJpbmdfc2xvdCwKLSAgICAgICAgICAgICAgICAgICh2b2lkICopQVBSX1h0T2Zmc2V0T2YobW9kX2F1dGhfbGRhcF9jb25maWdfdCwgYmluZGRuKSwgT1JfQVVUSENGRywKLSAgICAgICAgICAgICAgICAgICJETiB0byB1c2UgdG8gYmluZCB0byBMREFQIHNlcnZlci4gSWYgbm90IHByb3ZpZGVkLCB3aWxsIGRvIGFuIGFub255bW91cyBiaW5kLiIpLAotCi0gICAgQVBfSU5JVF9UQUtFMSgiQXV0aExEQVBCaW5kUGFzc3dvcmQiLCBhcF9zZXRfc3RyaW5nX3Nsb3QsCi0gICAgICAgICAgICAgICAgICAodm9pZCAqKUFQUl9YdE9mZnNldE9mKG1vZF9hdXRoX2xkYXBfY29uZmlnX3QsIGJpbmRwdyksIE9SX0FVVEhDRkcsCi0gICAgICAgICAgICAgICAgICAiUGFzc3dvcmQgdG8gdXNlIHRvIGJpbmQgdG8gTERBUCBzZXJ2ZXIuIElmIG5vdCBwcm92aWRlZCwgd2lsbCBkbyBhbiBhbm9ueW1vdXMgYmluZC4iKSwKLQotICAgIEFQX0lOSVRfRkxBRygiQXV0aExEQVBSZW1vdGVVc2VySXNETiIsIGFwX3NldF9mbGFnX3Nsb3QsCi0gICAgICAgICAgICAgICAgICh2b2lkICopQVBSX1h0T2Zmc2V0T2YobW9kX2F1dGhfbGRhcF9jb25maWdfdCwgdXNlcl9pc19kbiksIE9SX0FVVEhDRkcsCi0gICAgICAgICAgICAgICAgICJTZXQgdG8gJ29uJyB0byBzZXQgdGhlIFJFTU9URV9VU0VSIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGJlIHRoZSBmdWxsICIKLSAgICAgICAgICAgICAgICAgIkROIG9mIHRoZSByZW1vdGUgdXNlci4gQnkgZGVmYXVsdCwgdGhpcyBpcyBzZXQgdG8gb2ZmLCBtZWFuaW5nIHRoYXQgIgotICAgICAgICAgICAgICAgICAidGhlIFJFTU9URV9VU0VSIHZhcmlhYmxlIHdpbGwgY29udGFpbiB3aGF0ZXZlciB2YWx1ZSB0aGUgcmVtb3RlIHVzZXIgc2VudC4iKSwKLQotICAgIEFQX0lOSVRfRkxBRygiQXV0aExEQVBBdXRob3JpdGF0aXZlIiwgYXBfc2V0X2ZsYWdfc2xvdCwKLSAgICAgICAgICAgICAgICAgKHZvaWQgKilBUFJfWHRPZmZzZXRPZihtb2RfYXV0aF9sZGFwX2NvbmZpZ190LCBhdXRoX2F1dGhvcml0YXRpdmUpLCBPUl9BVVRIQ0ZHLAotICAgICAgICAgICAgICAgICAiU2V0IHRvICdvZmYnIHRvIGFsbG93IGFjY2VzcyBjb250cm9sIHRvIGJlIHBhc3NlZCBhbG9uZyB0byBsb3dlciBtb2R1bGVzIGlmICIKLSAgICAgICAgICAgICAgICAgInRoZSBVc2VySUQgYW5kL29yIGdyb3VwIGlzIG5vdCBrbm93biB0byB0aGlzIG1vZHVsZSIpLAotCi0gICAgQVBfSU5JVF9GTEFHKCJBdXRoTERBUENvbXBhcmVETk9uU2VydmVyIiwgYXBfc2V0X2ZsYWdfc2xvdCwKLSAgICAgICAgICAgICAgICAgKHZvaWQgKilBUFJfWHRPZmZzZXRPZihtb2RfYXV0aF9sZGFwX2NvbmZpZ190LCBjb21wYXJlX2RuX29uX3NlcnZlciksIE9SX0FVVEhDRkcsCi0gICAgICAgICAgICAgICAgICJTZXQgdG8gJ29uJyB0byBmb3JjZSBhdXRoX2xkYXAgdG8gZG8gRE4gY29tcGFyZXMgKGZvciB0aGUgXCJyZXF1aXJlIGRuXCIgIgotICAgICAgICAgICAgICAgICAiZGlyZWN0aXZlKSB1c2luZyB0aGUgc2VydmVyLCBhbmQgc2V0IGl0ICdvZmYnIHRvIGRvIHRoZSBjb21wYXJlcyBsb2NhbGx5ICIKLSAgICAgICAgICAgICAgICAgIihhdCB0aGUgZXhwZW5zZSBvZiBwb3NzaWJsZSBmYWxzZSBtYXRjaGVzKS4gU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciAiCi0gICAgICAgICAgICAgICAgICJhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoaXMgb3B0aW9uLiIpLAotCi0gICAgQVBfSU5JVF9JVEVSQVRFKCJBdXRoTERBUEdyb3VwQXR0cmlidXRlIiwgbW9kX2F1dGhfbGRhcF9hZGRfZ3JvdXBfYXR0cmlidXRlLCBOVUxMLCBPUl9BVVRIQ0ZHLAotICAgICAgICAgICAgICAgICAgICAiQSBsaXN0IG9mIGF0dHJpYnV0ZXMgdXNlZCB0byBkZWZpbmUgZ3JvdXAgbWVtYmVyc2hpcCAtIGRlZmF1bHRzIHRvICIKLSAgICAgICAgICAgICAgICAgICAgIm1lbWJlciBhbmQgdW5pcXVlbWVtYmVyIiksCi0KLSAgICBBUF9JTklUX0ZMQUcoIkF1dGhMREFQR3JvdXBBdHRyaWJ1dGVJc0ROIiwgYXBfc2V0X2ZsYWdfc2xvdCwKLSAgICAgICAgICAgICAgICAgKHZvaWQgKilBUFJfWHRPZmZzZXRPZihtb2RfYXV0aF9sZGFwX2NvbmZpZ190LCBncm91cF9hdHRyaWJfaXNfZG4pLCBPUl9BVVRIQ0ZHLAotICAgICAgICAgICAgICAgICAiSWYgc2V0IHRvICdvbicsIGF1dGhfbGRhcCB1c2VzIHRoZSBETiB0aGF0IGlzIHJldHJpZXZlZCBmcm9tIHRoZSBzZXJ2ZXIgZm9yIgotICAgICAgICAgICAgICAgICAic3Vic2VxdWVudCBncm91cCBjb21wYXJpc29ucy4gSWYgc2V0IHRvICdvZmYnLCBhdXRoX2xkYXAgdXNlcyB0aGUgc3RyaW5nIgotICAgICAgICAgICAgICAgICAicHJvdmlkZWQgYnkgdGhlIGNsaWVudCBkaXJlY3RseS4gRGVmYXVsdHMgdG8gJ29uJy4iKSwKLQotICAgIEFQX0lOSVRfVEFLRTEoIkF1dGhMREFQRGVyZWZlcmVuY2VBbGlhc2VzIiwgbW9kX2F1dGhfbGRhcF9zZXRfZGVyZWYsIE5VTEwsIE9SX0FVVEhDRkcsCi0gICAgICAgICAgICAgICAgICAiRGV0ZXJtaW5lcyBob3cgYWxpYXNlcyBhcmUgaGFuZGxlZCBkdXJpbmcgYSBzZWFyY2guIENhbiBibyBvbmUgb2YgdGhlIgotICAgICAgICAgICAgICAgICAgInZhbHVlcyBcIm5ldmVyXCIsIFwic2VhcmNoaW5nXCIsIFwiZmluZGluZ1wiLCBvciBcImFsd2F5c1wiLiAiCi0gICAgICAgICAgICAgICAgICAiRGVmYXVsdHMgdG8gYWx3YXlzLiIpLAotCi0gICAgQVBfSU5JVF9GTEFHKCJBdXRoTERBUEVuYWJsZWQiLCBhcF9zZXRfZmxhZ19zbG90LAotICAgICAgICAgICAgICAgICAodm9pZCAqKUFQUl9YdE9mZnNldE9mKG1vZF9hdXRoX2xkYXBfY29uZmlnX3QsIGVuYWJsZWQpLCBPUl9BVVRIQ0ZHLAotICAgICAgICAgICAgICAgICAiU2V0IHRvIG9mZiB0byBkaXNhYmxlIGF1dGhfbGRhcCwgZXZlbiBpZiBpdCdzIGJlZW4gZW5hYmxlZCBpbiBhIGhpZ2hlciB0cmVlIiksCi0gCi0gICAgQVBfSU5JVF9GTEFHKCJBdXRoTERBUEZyb250UGFnZUhhY2siLCBhcF9zZXRfZmxhZ19zbG90LAotICAgICAgICAgICAgICAgICAodm9pZCAqKUFQUl9YdE9mZnNldE9mKG1vZF9hdXRoX2xkYXBfY29uZmlnX3QsIGZyb250cGFnZV9oYWNrKSwgT1JfQVVUSENGRywKLSAgICAgICAgICAgICAgICAgIlNldCB0byAnb24nIHRvIHN1cHBvcnQgTWljcm9zb2Z0IEZyb250UGFnZSIpLAotCi0jaWZkZWYgQVBVX0hBU19MREFQX1NUQVJUVExTCi0gICAgQVBfSU5JVF9GTEFHKCJBdXRoTERBUFN0YXJ0VExTIiwgYXBfc2V0X2ZsYWdfc2xvdCwKLSAgICAgICAgICAgICAgICAgKHZvaWQgKilBUFJfWHRPZmZzZXRPZihtb2RfYXV0aF9sZGFwX2NvbmZpZ190LCBzdGFydHRscyksIE9SX0FVVEhDRkcsCi0gICAgICAgICAgICAgICAgICJTZXQgdG8gJ29uJyB0byBzdGFydCBUTFMgYWZ0ZXIgY29ubmVjdGluZyB0byB0aGUgTERBUCBzZXJ2ZXIuIiksCi0jZW5kaWYgLyogQVBVX0hBU19MREFQX1NUQVJUVExTICovCi0KLSAgICB7TlVMTH0KLX07Ci0KLXN0YXRpYyB2b2lkIG1vZF9hdXRoX2xkYXBfcmVnaXN0ZXJfaG9va3MoYXByX3Bvb2xfdCAqcCkKLXsKLSAgICBhcF9ob29rX2NoZWNrX3VzZXJfaWQobW9kX2F1dGhfbGRhcF9jaGVja191c2VyX2lkLCBOVUxMLCBOVUxMLCBBUFJfSE9PS19NSURETEUpOwotICAgIGFwX2hvb2tfYXV0aF9jaGVja2VyKG1vZF9hdXRoX2xkYXBfYXV0aF9jaGVja2VyLCBOVUxMLCBOVUxMLCBBUFJfSE9PS19NSURETEUpOwotfQotCi1tb2R1bGUgYXV0aF9sZGFwX21vZHVsZSA9IHsKLSAgIFNUQU5EQVJEMjBfTU9EVUxFX1NUVUZGLAotICAgbW9kX2F1dGhfbGRhcF9jcmVhdGVfZGlyX2NvbmZpZywJLyogZGlyIGNvbmZpZyBjcmVhdGVyICovCi0gICBOVUxMLAkJCQkvKiBkaXIgbWVyZ2VyIC0tLSBkZWZhdWx0IGlzIHRvIG92ZXJyaWRlICovCi0gICBOVUxMLAkJCQkvKiBzZXJ2ZXIgY29uZmlnICovCi0gICBOVUxMLAkJCQkvKiBtZXJnZSBzZXJ2ZXIgY29uZmlnICovCi0gICBtb2RfYXV0aF9sZGFwX2NtZHMsCQkJLyogY29tbWFuZCB0YWJsZSAqLwotICAgbW9kX2F1dGhfbGRhcF9yZWdpc3Rlcl9ob29rcywJLyogc2V0IHVwIHJlcXVlc3QgcHJvY2Vzc2luZyBob29rcyAqLwotfTsKZGlmZiAtLWdpdCBhL21vZHVsZXMvZXhwZXJpbWVudGFsL21vZF9hdXRoX2xkYXAuZGVmIGIvbW9kdWxlcy9leHBlcmltZW50YWwvbW9kX2F1dGhfbGRhcC5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5OTYzNmYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9leHBlcmltZW50YWwvbW9kX2F1dGhfbGRhcC5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUlNUE9SVCAgdXRpbF9sZGFwX2Nvbm5lY3Rpb25fZmluZAotSU1QT1JUICB1dGlsX2xkYXBfY29ubmVjdGlvbl9jbG9zZQotSU1QT1JUICB1dGlsX2xkYXBfY2FjaGVfY2hlY2t1c2VyaWQKLUlNUE9SVCAgdXRpbF9sZGFwX2NhY2hlX2NvbXBhcmUKLUlNUE9SVCAgdXRpbF9sZGFwX2NhY2hlX2NvbXBhcmVkbgotRVhQT1JUICBhdXRoX2xkYXBfbW9kdWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL2V4cGVyaW1lbnRhbC9tb2RfY2FjaGUuYyBiL21vZHVsZXMvZXhwZXJpbWVudGFsL21vZF9jYWNoZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDMxNTZkLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZXhwZXJpbWVudGFsL21vZF9jYWNoZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotI2luY2x1ZGUgImFwcl9zdHJpbmdzLmgiCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAidXRpbF9maWx0ZXIuaCIKLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAiaHR0cF9wcm90b2NvbC5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiCi0jaW5jbHVkZSAidXRpbF9zY3JpcHQuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIgCi0jaW5jbHVkZSAibW9kX2NhY2hlLmgiCi0jaW5jbHVkZSAiYXBfaG9va3MuaCIKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGNhY2hlX21vZHVsZTsKLQotQVBfSE9PS19TVFJVQ1QoCi0gICAgICAgICAgICBBUF9IT09LX0xJTksoc2VydmVfY2FjaGUpCi0gICAgICAgICAgICBBUF9IT09LX0xJTksoc3RvcmVfY2FjaGUpCi0pCi0KLUFQX0lNUExFTUVOVF9IT09LX1JVTl9GSVJTVChpbnQsc2VydmVfY2FjaGUsKHJlcXVlc3RfcmVjICpyKSwociksREVDTElORUQpCi1BUF9JTVBMRU1FTlRfSE9PS19SVU5fRklSU1QoaW50LHN0b3JlX2NhY2hlLChyZXF1ZXN0X3JlYyAqciwgYXBfYnVja2V0X2JyaWdhZGUgKmJiLCB2b2lkICoqY2YpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyLCBiYiwgY2YpLERFQ0xJTkVEKQotCi1zdGF0aWMgaW50IGNhY2hlX2hhbmRsZXIocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgLyogSSBhbSBzdXJlIHRoZXJlIGlzIGNvbW1vbiBlcnJvciBjaGVja2luZyB0aGF0IGJlbG9uZ3MgaW4gdGhpcyBmdW5jdGlvbiwKLSAgICAgKiBidXQgSSdtIG5vdCBzdXJlIHdoYXQgaXQgaXMuCi0gICAgICovCi0gICAgcmV0dXJuIGFwX3J1bl9zZXJ2ZV9jYWNoZShyKTsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgY2FjaGVfc3RydWN0IHsKLSAgICB2b2lkICpjZjsKLX0gY2FjaGVfc3RydWN0OwotCi1zdGF0aWMgaW50IGNhY2hlX2ZpbHRlcihhcF9maWx0ZXJfdCAqZiwgYXBfYnVja2V0X2JyaWdhZGUgKmJiKQotewotICAgIGNhY2hlX3N0cnVjdCAqY3R4ID0gZi0+Y3R4OwotICAgIAotICAgIGlmIChjdHggPT0gTlVMTCkgewotICAgICAgICBmLT5jdHggPSBjdHggPSBhcHJfcGNhbGxvYyhmLT5yLT5wb29sLCBzaXplb2YoKmN0eCkpOwotICAgIH0KLQotICAgIGFwX3J1bl9zdG9yZV9jYWNoZShmLT5yLCBiYiwgJmN0eC0+Y2YpOwotICAgIGFwX3Bhc3NfYnJpZ2FkZShmLT5uZXh0LCBiYik7Ci0gICAgcmV0dXJuIEFQUl9TVUNDRVNTOwkKLX0KLQotc3RhdGljIHZvaWQgY2FjaGVfcmVnaXN0ZXJfaG9vayh2b2lkKQotewotICAgIGFwX3JlZ2lzdGVyX291dHB1dF9maWx0ZXIoIkNBQ0hFIiwgY2FjaGVfZmlsdGVyLCBBUF9GVFlQRV9IVFRQX0hFQURFUik7Ci19Ci0KLXN0YXRpYyBjb25zdCBoYW5kbGVyX3JlYyBjYWNoZV9oYW5kbGVyc1tdID0KLXsKLSAgICB7IiovKiIsIGNhY2hlX2hhbmRsZXJ9LAotICAgIHtOVUxMfQotfTsKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGNhY2hlX21vZHVsZSA9IHsKLSAgICBTVEFOREFSRDIwX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLAkJCS8qIGNyZWF0ZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLSAgICBOVUxMLCAgICAgICAgCQkvKiBtZXJnZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgTlVMTCwJCQkvKiBjcmVhdGUgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlICovCi0gICAgTlVMTCwJCQkvKiBtZXJnZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgTlVMTCwJCQkvKiBjb21tYW5kIGFwcl90YWJsZV90ICovCi0gICAgY2FjaGVfaGFuZGxlcnMsICAgICAgCS8qIGhhbmRsZXJzICovCi0gICAgY2FjaGVfcmVnaXN0ZXJfaG9vawkJLyogcmVnaXN0ZXIgaG9va3MgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL2V4cGVyaW1lbnRhbC9tb2RfY2FjaGUuZHNwIGIvbW9kdWxlcy9leHBlcmltZW50YWwvbW9kX2NhY2hlLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYyNDU1ZC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2V4cGVyaW1lbnRhbC9tb2RfY2FjaGUuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ibW9kX2NhY2hlIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDIKLQotQ0ZHPW1vZF9jYWNoZSAtIFdpbjMyIERlYnVnCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIm1vZF9jYWNoZS5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIm1vZF9jYWNoZS5tYWsiIENGRz0ibW9kX2NhY2hlIC0gV2luMzIgRGVidWciCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAibW9kX2NhY2hlIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAibW9kX2NhY2hlIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1NVEw9bWlkbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAibW9kX2NhY2hlIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9EICJfTUJDUyIgL0QgIl9VU1JETEwiIC9EICJNT0RfQ0FDSEVfRVhQT1JUUyIgL1lYIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9JICIuLi8uLi9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHIvaW5jbHVkZSIgL0kgIi4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi9vcy93aW4zMiIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJfTUJDUyIgL0QgIl9VU1JETEwiIC9EICJDQUNIRV9ERUNMQVJFX0VYUE9SVCIgL0QgIk1PRF9DQUNIRV9FWFBPUlRTIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9kbGwgL21hY2hpbmU6STM4NiAvb3V0OiJSZWxlYXNlL21vZF9jYWNoZS5zbyIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9jYWNoZSAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9EICJfTUJDUyIgL0QgIl9VU1JETEwiIC9EICJNT0RfQ0FDSEVfRVhQT1JUUyIgL1lYIC9GRCAvR1ogL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1pJIC9PZCAvSSAiLi4vLi4vc3JjbGliL2Fwci11dGlsL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByL2luY2x1ZGUiIC9JICIuLi8uLi9pbmNsdWRlIiAvSSAiLi4vLi4vb3Mvd2luMzIiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJfVVNSRExMIiAvRCAiQ0FDSEVfREVDTEFSRV9FWFBPUlQiIC9EICJNT0RfQ0FDSEVfRVhQT1JUUyIgL1lYIC9GRCAvR1ogL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJEZWJ1Zy9tb2RfY2FjaGUuc28iIC9wZGJ0eXBlOnNlcHQKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIm1vZF9jYWNoZSAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgIm1vZF9jYWNoZSAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGNhY2hlX3N0b3JhZ2UuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cY2FjaGVfdXRpbC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2RfY2FjaGUuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kX21lbV9jYWNoZS5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2RfY2FjaGUuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiCi0jIEVuZCBHcm91cAotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9tb2R1bGVzL2V4cGVyaW1lbnRhbC9tb2RfY2FjaGUuaCBiL21vZHVsZXMvZXhwZXJpbWVudGFsL21vZF9jYWNoZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWE0ZDM3Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZXhwZXJpbWVudGFsL21vZF9jYWNoZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCi0gKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAotICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqLwotCi0jaW5jbHVkZSAiYXBfYnVja2V0cy5oIgotI2luY2x1ZGUgImFwX2hvb2tzLmgiCi0jaW5jbHVkZSAiaHR0cGQuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgY2FjaGVfZnVuY3MgY2FjaGVfZnVuY3M7Ci0KLUFQX0RFQ0xBUkVfSE9PSyhpbnQsc2VydmVfY2FjaGUsKHJlcXVlc3RfcmVjICpyKSk7Ci1BUF9ERUNMQVJFX0hPT0soaW50LHN0b3JlX2NhY2hlLChyZXF1ZXN0X3JlYyAqciwgYXBfYnVja2V0X2JyaWdhZGUgKmJiLCB2b2lkICoqY2YpKTsKLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9leHBlcmltZW50YWwvbW9kX2Nhc2VfZmlsdGVyLmMgYi9tb2R1bGVzL2V4cGVyaW1lbnRhbC9tb2RfY2FzZV9maWx0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAzNTU5NC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2V4cGVyaW1lbnRhbC9tb2RfY2FzZV9maWx0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vLyBCZW4gbWVzc2luZyBhcm91bmQuLi4KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJhcHJfZ2VuZXJhbC5oIgotI2luY2x1ZGUgInV0aWxfZmlsdGVyLmgiCi0jaW5jbHVkZSAiYXBfYnVja2V0cy5oIgotI2luY2x1ZGUgImh0dHBfcmVxdWVzdC5oIgotCi1zdGF0aWMgY29uc3QgY2hhciBzX3N6Q2FzZUZpbHRlck5hbWVbXT0iQ2FzZUZpbHRlciI7Ci1tb2R1bGUgY2FzZV9maWx0ZXJfbW9kdWxlOwotCi10eXBlZGVmIHN0cnVjdAotICAgIHsKLSAgICBpbnQgYkVuYWJsZWQ7Ci0gICAgfSBDYXNlRmlsdGVyQ29uZmlnOwotCi1zdGF0aWMgdm9pZCAqQ2FzZUZpbHRlckNyZWF0ZVNlcnZlckNvbmZpZyhhcHJfcG9vbF90ICpwLHNlcnZlcl9yZWMgKnMpCi0gICAgewotICAgIENhc2VGaWx0ZXJDb25maWcgKnBDb25maWc9YXByX3BjYWxsb2MocCxzaXplb2YgKnBDb25maWcpOwotCi0gICAgcENvbmZpZy0+YkVuYWJsZWQ9MDsKLQotICAgIHJldHVybiBwQ29uZmlnOwotICAgIH0KLQotc3RhdGljIHZvaWQgQ2FzZUZpbHRlckluc2VydEZpbHRlcihyZXF1ZXN0X3JlYyAqcikKLSAgICB7Ci0gICAgQ2FzZUZpbHRlckNvbmZpZyAqcENvbmZpZz1hcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsCi0JCQkJCQkgICAmY2FzZV9maWx0ZXJfbW9kdWxlKTsKLQotICAgIGlmKCFwQ29uZmlnLT5iRW5hYmxlZCkKLQlyZXR1cm47Ci0KLSAgICBhcF9hZGRfb3V0cHV0X2ZpbHRlcihzX3N6Q2FzZUZpbHRlck5hbWUsTlVMTCxyLHItPmNvbm5lY3Rpb24pOwotICAgIH0KLQotc3RhdGljIGFwcl9zdGF0dXNfdCBDYXNlRmlsdGVyT3V0RmlsdGVyKGFwX2ZpbHRlcl90ICpmLAotCQkJCQlhcF9idWNrZXRfYnJpZ2FkZSAqcGJiSW4pCi0gICAgewotICAgIGFwX2J1Y2tldCAqcGJrdEluOwotICAgIGFwX2J1Y2tldF9icmlnYWRlICpwYmJPdXQ7Ci0KLSAgICAvLyBYWFg6IGlzIHRoaXMgdGhlIG1vc3QgYXBwcm9wcmlhdGUgcG9vbD8KLSAgICBwYmJPdXQ9YXBfYnJpZ2FkZV9jcmVhdGUoZi0+ci0+cG9vbCk7Ci0gICAgQVBfQlJJR0FERV9GT1JFQUNIKHBia3RJbixwYmJJbikKLQl7Ci0JY29uc3QgY2hhciAqZGF0YTsKLQlhcHJfc2l6ZV90IGxlbjsKLQljaGFyICpidWY7Ci0JYXByX3NpemVfdCBuOwotCWFwX2J1Y2tldCAqcGJrdE91dDsKLQotCWlmKEFQX0JVQ0tFVF9JU19FT1MocGJrdEluKSkKLQkgICAgewotCSAgICAvLyBYWFg6IHdoeSBjYW4ndCBJIHJldXNlIHBia3RJbj8/PwotCSAgICBhcF9idWNrZXQgKnBia3RFT1M9YXBfYnVja2V0X2NyZWF0ZV9lb3MoKTsKLQkgICAgQVBfQlJJR0FERV9JTlNFUlRfVEFJTChwYmJPdXQscGJrdEVPUyk7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0KLQkvLyByZWFkCi0JYXBfYnVja2V0X3JlYWQocGJrdEluLCZkYXRhLCZsZW4sMSk7Ci0KLQkvLyB3cml0ZQotCWJ1Zj1hcHJfcGFsbG9jKGYtPnItPnBvb2wsbGVuKTsKLQlmb3Iobj0wIDsgbiA8IGxlbiA7ICsrbikKLQkgICAgYnVmW25dPXRvdXBwZXIoZGF0YVtuXSk7Ci0KLQkvLyBYWFg6IHNob3VsZCB3ZSB1c2UgYSBoZWFwIGJ1Y2tldCBpbnN0ZWFkPyBPciBhIHRyYW5zaWVudCAoaW4KLQkvLyB3aGljaCBjYXNlIHdlIG5lZWQgYSBzZXBhcmF0ZSBicmlnYWRlIGZvciBlYWNoIGJ1Y2tldCk/Ci0JcGJrdE91dD1hcF9idWNrZXRfY3JlYXRlX3Bvb2woYnVmLGxlbixmLT5yLT5wb29sKTsKLQlBUF9CUklHQURFX0lOU0VSVF9UQUlMKHBiYk91dCxwYmt0T3V0KTsKLQl9Ci0KLSAgICAvLyBYWFg6IGlzIHRoZXJlIGFueSBhZHZhbnRhZ2UgdG8gcGFzc2luZyBhIGJyaWdhZGUgZm9yIGVhY2ggYnVja2V0PwotICAgIHJldHVybiBhcF9wYXNzX2JyaWdhZGUoZi0+bmV4dCxwYmJPdXQpOwotICAgIH0KLQotc3RhdGljIGNvbnN0IGNoYXIgKkNhc2VGaWx0ZXJFbmFibGUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBpbnQgYXJnKQotICAgIHsKLSAgICBDYXNlRmlsdGVyQ29uZmlnICpwQ29uZmlnPWFwX2dldF9tb2R1bGVfY29uZmlnKGNtZC0+c2VydmVyLT5tb2R1bGVfY29uZmlnLAotCQkJCQkJICAgJmNhc2VfZmlsdGVyX21vZHVsZSk7Ci0gICAgcENvbmZpZy0+YkVuYWJsZWQ9YXJnOwotCi0gICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgQ2FzZUZpbHRlckNtZHNbXSA9IAotICAgIHsKLSAgICBBUF9JTklUX0ZMQUcoIkNhc2VGaWx0ZXIiLCBDYXNlRmlsdGVyRW5hYmxlLCBOVUxMLCBSU1JDX0NPTkYsCi0gICAgICAgICAgICAgICAgICJSdW4gYSBjYXNlIGZpbHRlciBvbiB0aGlzIGhvc3QiKSwKLSAgICB7IE5VTEwgfQotICAgIH07Ci0KLXN0YXRpYyB2b2lkIENhc2VGaWx0ZXJSZWdpc3Rlckhvb2tzKHZvaWQpCi0gICAgewotICAgIGFwX2hvb2tfaW5zZXJ0X2ZpbHRlcihDYXNlRmlsdGVySW5zZXJ0RmlsdGVyLE5VTEwsTlVMTCxBUF9IT09LX01JRERMRSk7Ci0gICAgYXBfcmVnaXN0ZXJfb3V0cHV0X2ZpbHRlcihzX3N6Q2FzZUZpbHRlck5hbWUsQ2FzZUZpbHRlck91dEZpbHRlciwKLQkJCSAgICAgIEFQX0ZUWVBFX0NPTlRFTlQpOwotICAgIH0KLQotbW9kdWxlIGNhc2VfZmlsdGVyX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIENhc2VGaWx0ZXJDcmVhdGVTZXJ2ZXJDb25maWcsCi0gICAgTlVMTCwKLSAgICBDYXNlRmlsdGVyQ21kcywKLSAgICBOVUxMLAotICAgIENhc2VGaWx0ZXJSZWdpc3Rlckhvb2tzCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9leHBlcmltZW50YWwvbW9kX2Nhc2VfZmlsdGVyX2luLmMgYi9tb2R1bGVzL2V4cGVyaW1lbnRhbC9tb2RfY2FzZV9maWx0ZXJfaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRhYjk3Zi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2V4cGVyaW1lbnRhbC9tb2RfY2FzZV9maWx0ZXJfaW4uYworKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vLyBCZW4gbWVzc2luZyBhcm91bmQgc29tZSBtb3JlLi4uCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiYXByX2dlbmVyYWwuaCIKLSNpbmNsdWRlICJ1dGlsX2ZpbHRlci5oIgotI2luY2x1ZGUgImFwcl9idWNrZXRzLmgiCi0jaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1zdGF0aWMgY29uc3QgY2hhciBzX3N6Q2FzZUZpbHRlck5hbWVbXT0iQ2FzZUZpbHRlciI7Ci1tb2R1bGUgY2FzZV9maWx0ZXJfaW5fbW9kdWxlOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIGludCBiRW5hYmxlZDsKLX0gQ2FzZUZpbHRlckluQ29uZmlnOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIGFwcl9idWNrZXRfYnJpZ2FkZSAqcGJiVG1wOwotfSBDYXNlRmlsdGVySW5Db250ZXh0OwotCi1zdGF0aWMgdm9pZCAqQ2FzZUZpbHRlckluQ3JlYXRlU2VydmVyQ29uZmlnKGFwcl9wb29sX3QgKnAsc2VydmVyX3JlYyAqcykKLXsKLSAgICBDYXNlRmlsdGVySW5Db25maWcgKnBDb25maWc9YXByX3BjYWxsb2MocCxzaXplb2YgKnBDb25maWcpOwotCi0gICAgcENvbmZpZy0+YkVuYWJsZWQ9MDsKLQotICAgIHJldHVybiBwQ29uZmlnOwotfQotCi1zdGF0aWMgdm9pZCBDYXNlRmlsdGVySW5JbnNlcnRGaWx0ZXIocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgQ2FzZUZpbHRlckluQ29uZmlnICpwQ29uZmlnPWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZywKLQkJCQkJCSAgICAgJmNhc2VfZmlsdGVyX2luX21vZHVsZSk7Ci0gICAgQ2FzZUZpbHRlckluQ29udGV4dCAqcEN0eDsKLQotICAgIGlmKCFwQ29uZmlnLT5iRW5hYmxlZCkKLQlyZXR1cm47Ci0KLSAgICBwQ3R4PWFwcl9wYWxsb2Moci0+cG9vbCxzaXplb2YgKnBDdHgpOwotICAgIHBDdHgtPnBiYlRtcD1hcHJfYnJpZ2FkZV9jcmVhdGUoci0+cG9vbCk7Ci0gICAgYXBfYWRkX2lucHV0X2ZpbHRlcihzX3N6Q2FzZUZpbHRlck5hbWUscEN0eCxyLE5VTEwpOwotfQotCi1zdGF0aWMgYXByX3N0YXR1c190IENhc2VGaWx0ZXJJbkZpbHRlcihhcF9maWx0ZXJfdCAqZiwKLQkJCQkgICAgICAgYXByX2J1Y2tldF9icmlnYWRlICpwYmJPdXQsCi0JCQkJICAgICAgIGFwX2lucHV0X21vZGVfdCBlTW9kZSxhcHJfc2l6ZV90IG5CeXRlcykKLXsKLSAgICBDYXNlRmlsdGVySW5Db250ZXh0ICpwQ3R4PWYtPmN0eDsKLSAgICBhcHJfc3RhdHVzX3QgcmV0OwotCi0gICAgYXBfYXNzZXJ0KEFQUl9CUklHQURFX0VNUFRZKHBDdHgtPnBiYlRtcCkpOwotICAgIAotICAgIHJldD1hcF9nZXRfYnJpZ2FkZShmLT5uZXh0LHBDdHgtPnBiYlRtcCxlTW9kZSxuQnl0ZXMpOwotICAgIGlmKGVNb2RlID09IEFQX01PREVfUEVFSyB8fCByZXQgIT0gQVBSX1NVQ0NFU1MpCi0JcmV0dXJuIHJldDsKLQotICAgIHdoaWxlKCFBUFJfQlJJR0FERV9FTVBUWShwQ3R4LT5wYmJUbXApKSB7Ci0JYXByX2J1Y2tldCAqcGJrdEluPUFQUl9CUklHQURFX0ZJUlNUKHBDdHgtPnBiYlRtcCk7Ci0JYXByX2J1Y2tldCAqcGJrdE91dDsKLQljb25zdCBjaGFyICpkYXRhOwotCWFwcl9zaXplX3QgbGVuOwotCWNoYXIgKmJ1ZjsKLQlpbnQgbjsKLQotCS8vIEl0IGlzIHRlbXB0aW5nIHRvIGRvIHRoaXMuLi4KLQkvL0FQUl9CVUNLRVRfUkVNT1ZFKHBCKTsKLQkvL0FQUl9CUklHQURFX0lOU0VSVF9UQUlMKHBiYk91dCxwQik7Ci0JLy8gYW5kIGNoYW5nZSB0aGUgY2FzZSBvZiB0aGUgYnVja2V0IGRhdGEsIGJ1dCB0aGF0IHdvdWxkIGJlIHdyb25nCi0JLy8gZm9yIGEgZmlsZSBvciBzb2NrZXQgYnVmZmVyLCBmb3IgZXhhbXBsZS4uLgotCi0JaWYoQVBSX0JVQ0tFVF9JU19FT1MocGJrdEluKSkgewotCSAgICBBUFJfQlVDS0VUX1JFTU9WRShwYmt0SW4pOwotCSAgICBBUFJfQlJJR0FERV9JTlNFUlRfVEFJTChwYmJPdXQscGJrdEluKTsKLQkgICAgYnJlYWs7Ci0JfQotCi0JcmV0PWFwcl9idWNrZXRfcmVhZChwYmt0SW4sJmRhdGEsJmxlbixlTW9kZSk7Ci0JaWYocmV0ICE9IEFQUl9TVUNDRVNTKQotCSAgICByZXR1cm4gcmV0OwotCi0JYnVmPW1hbGxvYyhsZW4pOwotCWZvcihuPTAgOyBuIDwgbGVuIDsgKytuKQotCSAgICBidWZbbl09dG91cHBlcihkYXRhW25dKTsKLQotCXBia3RPdXQ9YXByX2J1Y2tldF9oZWFwX2NyZWF0ZShidWYsbGVuLDAsTlVMTCk7Ci0JQVBSX0JSSUdBREVfSU5TRVJUX1RBSUwocGJiT3V0LHBia3RPdXQpOwotCWFwcl9idWNrZXRfZGVsZXRlKHBia3RJbik7Ci0gICAgfQotCi0gICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotfQotCSAgICAKLQkKLXN0YXRpYyBjb25zdCBjaGFyICpDYXNlRmlsdGVyRW5hYmxlKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgaW50IGFyZykKLSAgICB7Ci0gICAgQ2FzZUZpbHRlckluQ29uZmlnICpwQ29uZmlnCi0gICAgICA9YXBfZ2V0X21vZHVsZV9jb25maWcoY21kLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsJmNhc2VfZmlsdGVyX2luX21vZHVsZSk7Ci0gICAgcENvbmZpZy0+YkVuYWJsZWQ9YXJnOwotCi0gICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgQ2FzZUZpbHRlckluQ21kc1tdID0gCi0gICAgewotICAgIEFQX0lOSVRfRkxBRygiQ2FzZUZpbHRlckluIiwgQ2FzZUZpbHRlckVuYWJsZSwgTlVMTCwgUlNSQ19DT05GLAotICAgICAgICAgICAgICAgICAiUnVuIGFuIGlucHV0IGNhc2UgZmlsdGVyIG9uIHRoaXMgaG9zdCIpLAotICAgIHsgTlVMTCB9Ci0gICAgfTsKLQotCi1zdGF0aWMgdm9pZCBDYXNlRmlsdGVySW5SZWdpc3Rlckhvb2tzKGFwcl9wb29sX3QgKnApCi0gICAgewotICAgIGFwX2hvb2tfaW5zZXJ0X2ZpbHRlcihDYXNlRmlsdGVySW5JbnNlcnRGaWx0ZXIsTlVMTCxOVUxMLEFQUl9IT09LX01JRERMRSk7Ci0gICAgYXBfcmVnaXN0ZXJfaW5wdXRfZmlsdGVyKHNfc3pDYXNlRmlsdGVyTmFtZSxDYXNlRmlsdGVySW5GaWx0ZXIsCi0JCQkgICAgICBBUF9GVFlQRV9DT05URU5UKTsKLSAgICB9Ci0KLW1vZHVsZSBjYXNlX2ZpbHRlcl9pbl9tb2R1bGUgPQotewotICAgIFNUQU5EQVJEMjBfTU9EVUxFX1NUVUZGLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBDYXNlRmlsdGVySW5DcmVhdGVTZXJ2ZXJDb25maWcsCi0gICAgTlVMTCwKLSAgICBDYXNlRmlsdGVySW5DbWRzLAotICAgIENhc2VGaWx0ZXJJblJlZ2lzdGVySG9va3MKLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL2V4cGVyaW1lbnRhbC9tb2RfY2hhcnNldF9saXRlLmMgYi9tb2R1bGVzL2V4cGVyaW1lbnRhbC9tb2RfY2hhcnNldF9saXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZWI2ZDYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9leHBlcmltZW50YWwvbW9kX2NoYXJzZXRfbGl0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotLyoKLSAqIHNpbXBsZSBob2tleSBjaGFyc2V0IHJlY29kaW5nIGNvbmZpZ3VyYXRpb24gbW9kdWxlCi0gKgotICogU2VlIG1vZF9lYmNkaWMgYW5kIG1vZF9jaGFyc2V0IGZvciBtb3JlIHRob3VnaHQtb3V0IGV4YW1wbGVzLiAgVGhpcwotICogb25lIGlzIGp1c3Qgc28gSmVmZiBjYW4gbGVhcm4gaG93IGEgbW9kdWxlIHdvcmtzIGFuZCBleHBlcmltZW50IHdpdGgKLSAqIGJhc2ljIGNoYXJhY3RlciBzZXQgcmVjb2RpbmcgY29uZmlndXJhdGlvbi4KLSAqCi0gKiAhISFUaGlzIGlzIGFuIGV4dHJlbWVseSBjaGVhcCByaXBvZmYgb2YgbW9kX2NoYXJzZXQuYyBmcm9tIFJ1c3NpYW4gQXBhY2hlISEhCi0gKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLSNpbmNsdWRlICJ1dGlsX2NoYXJzZXQuaCIKLQotI2lmbmRlZiBBUEFDSEVfWExBVEUKLSNlcnJvciBtb2RfY2hhcnNldF9saXRlIGNhbm5vdCB3b3JrIHdpdGhvdXQgQVBBQ0hFX1hMQVRFIGVuYWJsZWQKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCBjaGFyc2V0X2Rpcl90IHsKLSAgICBlbnVtIHtOT19ERUJVRyA9IDEsIERFQlVHfSBkZWJ1ZzsgLyogd2hldGhlciBvciBub3QgdmVyYm9zZSBsb2dnaW5nIGlzIGVuYWJsZWQ7IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFucyB1bmluaXRpYWxpemVkICovCi0gICAgY29uc3QgY2hhciAqY2hhcnNldF9zb3VyY2U7IC8qIHNvdXJjZSBlbmNvZGluZyAqLwotICAgIGNvbnN0IGNoYXIgKmNoYXJzZXRfZGVmYXVsdDsgLyogaG93IHRvIHNoaXAgb24gd2lyZSAqLwotfSBjaGFyc2V0X2Rpcl90OwotCi1tb2R1bGUgY2hhcnNldF9saXRlX21vZHVsZTsKLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9jaGFyc2V0X2Rpcl9jb25mKGFwX3Bvb2xfdCAqcCxjaGFyICpkdW1teSkKLXsKLSAgcmV0dXJuIGFwX3BjYWxsb2MocCxzaXplb2YoY2hhcnNldF9kaXJfdCkpOwotfQotCi1zdGF0aWMgdm9pZCAqbWVyZ2VfY2hhcnNldF9kaXJfY29uZihhcF9wb29sX3QgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICpvdmVycmlkZXN2KQotewotICAgIGNoYXJzZXRfZGlyX3QgKmEgPSAoY2hhcnNldF9kaXJfdCAqKWFwX3BjYWxsb2MgKHAsIHNpemVvZihjaGFyc2V0X2Rpcl90KSk7Ci0gICAgY2hhcnNldF9kaXJfdCAqYmFzZSA9IChjaGFyc2V0X2Rpcl90ICopYmFzZXYsCi0gICAgICAgICpvdmVyID0gKGNoYXJzZXRfZGlyX3QgKilvdmVycmlkZXN2OwotCi0gICAgLyogSWYgaXQgaXMgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBjb250YWluZXIsIHVzZSBpdC4gIE90aGVyd2lzZSwgdXNlIHRoZSBvbmUKLSAgICAgKiBmcm9tIHRoZSBlbmNsb3NpbmcgY29udGFpbmVyLiAKLSAgICAgKi8KLQotICAgIGEtPmRlYnVnID0gCi0gICAgICAgIG92ZXItPmRlYnVnID8gb3Zlci0+ZGVidWcgOiBiYXNlLT5kZWJ1ZzsKLSAgICBhLT5jaGFyc2V0X2RlZmF1bHQgPSAKLSAgICAgICAgb3Zlci0+Y2hhcnNldF9kZWZhdWx0ID8gb3Zlci0+Y2hhcnNldF9kZWZhdWx0IDogYmFzZS0+Y2hhcnNldF9kZWZhdWx0OwotICAgIGEtPmNoYXJzZXRfc291cmNlID0gCi0gICAgICAgIG92ZXItPmNoYXJzZXRfc291cmNlID8gb3Zlci0+Y2hhcnNldF9zb3VyY2UgOiBiYXNlLT5jaGFyc2V0X3NvdXJjZTsKLSAgICByZXR1cm4gYTsKLX0KLQotLyogQ2hhcnNldFNvdXJjZUVuYyBjaGFyc2V0Ci0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICphZGRfY2hhcnNldF9zb3VyY2UoY21kX3Bhcm1zICpjbWQsIGNoYXJzZXRfZGlyX3QgKmRjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqbmFtZSkKLXsKLSAgICBkYy0+Y2hhcnNldF9zb3VyY2UgPSBuYW1lOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKiBDaGFyc2V0RGVmYXVsdCBjaGFyc2V0Ci0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICphZGRfY2hhcnNldF9kZWZhdWx0KGNtZF9wYXJtcyAqY21kLCBjaGFyc2V0X2Rpcl90ICpkYywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqbmFtZSkKLXsKLSAgICBkYy0+Y2hhcnNldF9kZWZhdWx0ID0gbmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogQ2hhcnNldERlZmF1bHQgY2hhcnNldAotICovCi1zdGF0aWMgY29uc3QgY2hhciAqYWRkX2NoYXJzZXRfZGVidWcoY21kX3Bhcm1zICpjbWQsIGNoYXJzZXRfZGlyX3QgKmRjLCBpbnQgYXJnKQotewotICAgIGlmIChhcmcpIHsKLSAgICAgICAgZGMtPmRlYnVnID0gREVCVUc7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBkYy0+ZGVidWcgPSBOT19ERUJVRzsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogZmluZF9jb2RlX3BhZ2UoKSBpcyBhIGZpeHVwIGhvb2sgdGhhdCBkZWNpZGVzIGlmIHRyYW5zbGF0aW9uIHNob3VsZCBiZQotICogZW5hYmxlZAotICovCi1zdGF0aWMgaW50IGZpbmRfY29kZV9wYWdlKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNoYXJzZXRfZGlyX3QgKmRjID0gYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsICZjaGFyc2V0X2xpdGVfbW9kdWxlKTsKLSAgICBhcF9zdGF0dXNfdCBydjsKLSAgICBhcF94bGF0ZV90ICp4bGF0ZTsKLSAgICBjb25zdCBjaGFyICptaW1lX3R5cGU7Ci0gICAgaW50IGRlYnVnID0gZGMtPmRlYnVnID09IERFQlVHOwotCi0gICAgbWltZV90eXBlID0gci0+Y29udGVudF90eXBlID8gci0+Y29udGVudF90eXBlIDogYXBfZGVmYXVsdF90eXBlKHIpOwotCi0gICAgaWYgKGRlYnVnKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLEFQTE9HX0RFQlVHfEFQTE9HX05PRVJSTk8sIDAsIHItPnNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICJFbnRlcmluZyBoYW5kbGVyLCBVUkk6ICVzIEZJTEVOQU1FOiAlcyBBUkdTOiAlcyBQQVRIX0lORk86ICVzICIKLSAgICAgICAgICAgICAgICAgICAgICJNSU1FVFlQRTogJXMgRkxBR1M6ICVkIFNVQlJFUTogJXMsIFJFRElSOiAlcywgUFJPWFk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgIHItPnVyaSwgci0+ZmlsZW5hbWUsIHItPmFyZ3MsIHItPnBhdGhfaW5mbywgbWltZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgci0+cnJ4ID8gMSA6IDAsCi0gICAgICAgICAgICAgICAgICAgICByLT5tYWluPyJZRVMiOiJOTyIsci0+cHJldj8iWUVTIjoiTk8iLAotICAgICAgICAgICAgICAgICAgICAgci0+cHJveHlyZXEgPyAiWUVTIiA6ICJOTyIpOwotICAgIH0KLQotICAgIC8qIGNhdGNoIHByb3h5IHJlcXVlc3RzICovCi0gICAgaWYgKHItPnByb3h5cmVxKSByZXR1cm4gREVDTElORUQ7Ci0gICAgLyogbW9kX3Jld3JpdGUgaW5kaWNhdG9ycyAqLwotICAgIGlmICghc3RybmNtcChyLT5maWxlbmFtZSwgInJlZGlyZWN0OiIsIDkpKSByZXR1cm4gREVDTElORUQ7IAotICAgIGlmICghc3RybmNtcChyLT5maWxlbmFtZSwgImdvbmU6IiwgNSkpIHJldHVybiBERUNMSU5FRDsgCi0gICAgaWYgKCFzdHJuY21wKHItPmZpbGVuYW1lLCAicGFzc3Rocm91Z2g6IiwgMTIpKSByZXR1cm4gREVDTElORUQ7IAotICAgIGlmICghc3RybmNtcChyLT5maWxlbmFtZSwgImZvcmJpZGRlbjoiLCAxMCkpIHJldHVybiBERUNMSU5FRDsgCi0gICAgCi0gICAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIGZ1bGwgZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24sIGJhaWwgb3V0LgotICAgICAqLwotICAgIGlmICghZGMtPmNoYXJzZXRfc291cmNlIHx8ICFkYy0+Y2hhcnNldF9kZWZhdWx0KSB7Ci0gICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0RFQlVHfEFQTE9HX05PRVJSTk8sIDAsIHItPnNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jb21wbGV0ZSBjb25maWd1cmF0aW9uOiBzcmMgJXMsIGRzdCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGMtPmNoYXJzZXRfc291cmNlID8gZGMtPmNoYXJzZXRfc291cmNlIDogInVuc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+Y2hhcnNldF9kZWZhdWx0ID8gZGMtPmNoYXJzZXRfZGVmYXVsdCA6ICJ1bnNwZWNpZmllZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICAvKiBJZiB0aGlzIGlzIGEgc3VicmVxdWVzdCwgYmFpbCBvdXQuICBXZSBkb24ndCB3YW50IHRvIGJlIHNldHRpbmcgdXAgCi0gICAgICogdHJhbnNsYXRpb24ganVzdCBiZWNhdXNlIHNvbWV0aGluZyBsaWtlIG1vZF9hdXRvaW5kZXggd2FudHMgdG8gZmluZCB0aGUKLSAgICAgKiBtaW1lIHR5cGUgZm9yIGRpcmVjdG9yeSBvYmplY3RzLgotICAgICAqIChJIHdvbid0IHN3ZWFyIHRoYXQgdGhlcmUgYXJlbid0IGNhc2VzIHdoZXJlIHdlIG5lZWQgdG8gcHJvY2VzcyAKLSAgICAgKiBzdWJyZXF1ZXN0cyA6KSApLgotICAgICAqLwotICAgIGlmIChyLT5tYWluKSB7Ci0gICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0RFQlVHfEFQTE9HX05PRVJSTk8sIDAsIHItPnNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAic2tpcHBpbmcgc3VicmVxdWVzdCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICAvKiBJZiBtaW1lIHR5cGUgaXNuJ3QgdGV4dCBvciBtZXNzYWdlLCBiYWlsIG91dC4KLSAgICAgKi8KLSAgICBpZiAoc3RybmNhc2VjbXAobWltZV90eXBlLCAidGV4dC8iLCA1KSAmJgotICAgICAgICBzdHJuY2FzZWNtcChtaW1lX3R5cGUsICJtZXNzYWdlLyIsIDgpKSB7Ci0gICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0RFQlVHfEFQTE9HX05PRVJSTk8sIDAsIHItPnNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAibWltZSB0eXBlIGlzICVzOyBubyB0cmFuc2xhdGlvbiBzZWxlY3RlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWltZV90eXBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgfQotCi0gICAgaWYgKGRlYnVnKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19ERUJVR3xBUExPR19OT0VSUk5PLCAwLCByLT5zZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAiZGM6ICVYIGNoYXJzZXRfc291cmNlOiAlcyBjaGFyc2V0X2RlZmF1bHQ6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClkYywKLSAgICAgICAgICAgICAgICAgICAgIGRjICYmIGRjLT5jaGFyc2V0X3NvdXJjZSA/IGRjLT5jaGFyc2V0X3NvdXJjZSA6ICIobm9uZSkiLAotICAgICAgICAgICAgICAgICAgICAgZGMgJiYgZGMtPmNoYXJzZXRfZGVmYXVsdCA/IGRjLT5jaGFyc2V0X2RlZmF1bHQgOiAiKG5vbmUpIik7Ci0gICAgfQotCi0gICAgcnYgPSBhcF94bGF0ZV9vcGVuKCZ4bGF0ZSwgZGMtPmNoYXJzZXRfZGVmYXVsdCwgZGMtPmNoYXJzZXRfc291cmNlLCByLT5wb29sKTsKLSAgICBpZiAocnYgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgcnYsIHItPnNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBvcGVuIHRyYW5zbGF0aW9uICVzLT4lcywgZXJyb3IgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICBkYy0+Y2hhcnNldF9zb3VyY2UsIGRjLT5jaGFyc2V0X2RlZmF1bHQsIHJ2KTsKLSAgICAgICAgcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgIH0KLSAgICBydiA9IGFwX3NldF9jb250ZW50X3hsYXRlKHIsIDEsIHhsYXRlKTsKLSAgICBpZiAocnYgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgcnYsIHItPnNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBzZXQgY29udGVudCB0cmFuc2xhdGlvbiwgZXJyb3IgJWRcbiIsIHJ2KTsKLSAgICAgICAgcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgIH0KLQotICAgIHJ2ID0gYXBfYnNldG9wdChyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJPX1dYTEFURSwgJnItPnJyeC0+dG9fbmV0KTsKLSAgICBpZiAocnYgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgcnYsIHItPnNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBzZXQgdHJhbnNsYXRpb247IEJPX1dYTEFURS0+JWRcbiIsIHJ2KTsKLSAgICAgICAgcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgIH0KLQotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIGNtZHNbXSA9Ci17Ci0gICAgewotICAgICAgICAiQ2hhcnNldFNvdXJjZUVuYyIsCi0gICAgICAgIGFkZF9jaGFyc2V0X3NvdXJjZSwKLSAgICAgICAgTlVMTCwKLSAgICAgICAgT1JfRklMRUlORk8sCi0gICAgICAgIFRBS0UxLAotICAgICAgICAic291cmNlIChodG1sLGNnaSxzc2kpIGZpbGUgY2hhcnNldCIKLSAgICB9LAotICAgIHsKLSAgICAgICAgIkNoYXJzZXREZWZhdWx0IiwgCi0gICAgICAgIGFkZF9jaGFyc2V0X2RlZmF1bHQsCi0gICAgICAgIE5VTEwsCi0gICAgICAgIE9SX0ZJTEVJTkZPLCAKLSAgICAgICAgVEFLRTEsCi0gICAgICAgICJuYW1lIG9mIGRlZmF1bHQgY2hhcnNldCIKLSAgICB9LAotICAgIHsKLSAgICAgICAgIkNoYXJzZXREZWJ1ZyIsCi0gICAgICAgIGFkZF9jaGFyc2V0X2RlYnVnLAotICAgICAgICBOVUxMLAotICAgICAgICBPUl9GSUxFSU5GTywKLSAgICAgICAgRkxBRywKLSAgICAgICAgIm1vZF9jaGFyc2V0X2xpdGUgZGVidWcgZmxhZyIKLSAgICB9LAotICAgIHtOVUxMfQotfTsKLQotc3RhdGljIHZvaWQgcmVnaXN0ZXJfaG9va3Modm9pZCkKLXsKLSAgICBhcF9ob29rX2ZpeHVwcyhmaW5kX2NvZGVfcGFnZSwgTlVMTCwgTlVMTCwgQVBfSE9PS19NSURETEUpOwotfQotCi1tb2R1bGUgY2hhcnNldF9saXRlX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsCi0gICAgY3JlYXRlX2NoYXJzZXRfZGlyX2NvbmYsCi0gICAgbWVyZ2VfY2hhcnNldF9kaXJfY29uZiwKLSAgICBOVUxMLCAKLSAgICBOVUxMLAotICAgIGNtZHMsCi0gICAgTlVMTCwKLSAgICByZWdpc3Rlcl9ob29rcywKLX07Ci0KZGlmZiAtLWdpdCBhL21vZHVsZXMvZXhwZXJpbWVudGFsL21vZF9jaGFyc2V0X2xpdGUuZXhwIGIvbW9kdWxlcy9leHBlcmltZW50YWwvbW9kX2NoYXJzZXRfbGl0ZS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMGJmMTQuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9leHBlcmltZW50YWwvbW9kX2NoYXJzZXRfbGl0ZS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1jaGFyc2V0X2xpdGVfbW9kdWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL2V4cGVyaW1lbnRhbC9tb2RfZGlza19jYWNoZS5jIGIvbW9kdWxlcy9leHBlcmltZW50YWwvbW9kX2Rpc2tfY2FjaGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBjOTE2NS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2V4cGVyaW1lbnRhbC9tb2RfZGlza19jYWNoZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotI2luY2x1ZGUgIm1vZF9jYWNoZS5oIgotI2luY2x1ZGUgImFwcl9maWxlX2lvLmgiCi0jaW5jbHVkZSAiYXByX3N0cmluZ3MuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAidXRpbF9maWx0ZXIuaCIKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGRpc2tfY2FjaGVfbW9kdWxlOwotCi1zdGF0aWMgaW50IGRpc2tfc2VydmUocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgYXBfYnVja2V0ICplOwotICAgIGFwX2J1Y2tldF9icmlnYWRlICpiYiA9IGFwX2JyaWdhZGVfY3JlYXRlKHItPnBvb2wpOyAKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICBhcHJfZmlsZV90ICpmZCA9IE5VTEw7Ci0gICAgYXByX3N0YXR1c190IHJ2OwotICAgIGFwX2ZpbHRlcl90ICpmOwotICAgIGNoYXIgc3RyWzI1Nl07Ci0gICAgYXByX29mZl90IG9mZnNldCA9IDA7Ci0KLSAgICBmaWxlbmFtZSA9IGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHItPnBvb2wsIAotICAgICAgICAgICAgICAgICAgICAgICAgYXByX3BzdHJjYXQoci0+cG9vbCwgInByb3h5Iiwgci0+dXJpLCBOVUxMKSk7Ci0gICAgaWYgKChydiA9IGFwcl9vcGVuKCZmZCwgZmlsZW5hbWUsIEFQUl9SRUFELCAKLSAgICAgICAgICAgICAgICAgQVBSX1VSRUFELCByLT5jb25uZWN0aW9uLT5wb29sKSkgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIC8qIHNraXAgdGhlIGNhY2hlZCBoZWFkZXJzLiAqLwotICAgIGRvIHsKLSAgICAgICAgYXByX2ZnZXRzKHN0ciwgMjU2LCBmZCk7Ci0gICAgICAgIG9mZnNldCArPSBzdHJsZW4oc3RyKTsKLSAgICB9IHdoaWxlIChzdHJjbXAoc3RyLCBDUkxGKSk7Ci0KLSAgICAvKiBJZiB3ZSBhcmUgc2VydmluZyBmcm9tIHRoZSBjYWNoZSwgd2UgZG9uJ3Qgd2FudCB0byB0cnkgdG8gY2FjaGUgaXQKLSAgICAgKiBhZ2Fpbi4KLSAgICAgKi8KLSAgICBmb3IgKChmID0gci0+b3V0cHV0X2ZpbHRlcnMpOyAoZiA9IGYtPm5leHQpOykgewotICAgICAgICBpZiAoIXN0cmNtcChmLT5mcmVjLT5uYW1lLCAiQ0FDSEUiKSkgewotICAgICAgICAgICAgYXBfcmVtb3ZlX291dHB1dF9maWx0ZXIoZik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBlID0gYXBfYnVja2V0X2NyZWF0ZV9maWxlKGZkLCBvZmZzZXQsIHItPmZpbmZvLnNpemUpOwotCi0gICAgQVBfQlJJR0FERV9JTlNFUlRfSEVBRChiYiwgZSk7Ci0gICAgZSA9IGFwX2J1Y2tldF9jcmVhdGVfZW9zKCk7Ci0gICAgQVBfQlJJR0FERV9JTlNFUlRfVEFJTChiYiwgZSk7Ci0KLSAgICBhcF9wYXNzX2JyaWdhZGUoci0+b3V0cHV0X2ZpbHRlcnMsIGJiKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IGNhY2hlX3N0cnVjdCB7Ci0gICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgYXByX2ZpbGVfdCAqZmQ7Ci0gICAgaW50IHN0YXRlOwotfSBjYWNoZV9zdHJ1Y3Q7Ci0KLXN0YXRpYyBpbnQgZGlza19jYWNoZShyZXF1ZXN0X3JlYyAqciwgYXBfYnVja2V0X2JyaWdhZGUgKmJiLCB2b2lkICoqY2YpCi17Ci0gICAgY2FjaGVfc3RydWN0ICpjdHggPSAqY2Y7Ci0gICAgYXBfYnVja2V0ICplOwotICAgIAotICAgIGlmIChjdHggPT0gTlVMTCkgewotICAgICAgICAqY2YgPSBjdHggPSBhcHJfcGNhbGxvYyhyLT5wb29sLCBzaXplb2YoKmN0eCkpOwotICAgIH0KLSAgICBpZiAoY3R4LT5maWxlbmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIGFwcl9zdGF0dXNfdCBydjsKLSAgICAgICAgYXByX21ha2VfZGlyKGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHItPnBvb2wsICJwcm94eSIpLCBBUFJfVVJFQUQgfCBBUFJfVVdSSVRFIHwgQVBSX1VFWEVDVVRFIHwgQVBSX0dSRUFEIHwgQVBSX0dXUklURSwgci0+cG9vbCk7Ci0KLSAgICAgICAgLyogY3VycmVudGx5LCB3ZSBhcmUgdXNpbmcgdGhlIHVyaSBhcyB0aGUgY2FjaGUga2V5LiAgVGhpcyBpcwotICAgICAgICAgKiBwcm9iYWJseSB3cm9uZywgYnV0IGl0IGlzIG11Y2ggYmV0dGVyIHRoYW4gYSBoYXJkLWNvZGVkIGZpbGVuYW1lLgotICAgICAgICAgKi8KLSAgICAgICAgY3R4LT5maWxlbmFtZSA9IGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHItPnBvb2wsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcl9wc3RyY2F0KHItPnBvb2wsICJwcm94eSIsIHItPnVyaSwgTlVMTCkpOwotICAgICAgICBpZiAoKHJ2ID0gYXByX29wZW4oJmN0eC0+ZmQsIGN0eC0+ZmlsZW5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgQVBSX1dSSVRFIHwgQVBSX0NSRUFURSB8IEFQUl9UUlVOQ0FURSB8IEFQUl9CVUZGRVJFRCwKLSAgICAgICAgICAgICAgICAgICAgIEFQUl9VUkVBRCB8IEFQUl9VV1JJVEUsIHItPnBvb2wpKSAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHJ2LCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIGNhY2hlIGZpbGUiKTsKLSAgICAgICAgICAgICpjZiA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgICAgIH0KLSAgICB9IAotICAgIEFQX0JSSUdBREVfRk9SRUFDSChlLCBiYikgewotICAgICAgICBjb25zdCBjaGFyICpzdHI7Ci0gICAgICAgIGFwcl9zc2l6ZV90IGxlbmd0aDsKLQotICAgICAgICBhcF9idWNrZXRfcmVhZChlLCAmc3RyLCAmbGVuZ3RoLCAwKTsKLSAgICAgICAgYXByX3dyaXRlKGN0eC0+ZmQsIHN0ciwgJmxlbmd0aCk7Ci0gICAgfQotICAgIGlmIChBUF9CVUNLRVRfSVNfRU9TKEFQX0JSSUdBREVfTEFTVChiYikpKSB7Ci0gICAgICAgIGFwcl9jbG9zZShjdHgtPmZkKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwkKLX0KLQotc3RhdGljIHZvaWQgZGlza19jYWNoZV9yZWdpc3Rlcl9ob29rKHZvaWQpCi17Ci0gICAgYXBfaG9va19zdG9yZV9jYWNoZShkaXNrX2NhY2hlLCBOVUxMLCBOVUxMLCBBUF9IT09LX01JRERMRSk7Ci0gICAgYXBfaG9va19zZXJ2ZV9jYWNoZShkaXNrX3NlcnZlLCBOVUxMLCBOVUxMLCBBUF9IT09LX01JRERMRSk7Ci19Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBkaXNrX2NhY2hlX21vZHVsZSA9IHsKLSAgICBTVEFOREFSRDIwX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLAkJCS8qIGNyZWF0ZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLSAgICBOVUxMLCAgICAgICAgCQkvKiBtZXJnZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgTlVMTCwJCQkvKiBjcmVhdGUgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlICovCi0gICAgTlVMTCwJCQkvKiBtZXJnZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgTlVMTCwJCQkvKiBjb21tYW5kIGFwcl90YWJsZV90ICovCi0gICAgTlVMTCwgICAgICAgICAgCQkvKiBoYW5kbGVycyAqLwotICAgIGRpc2tfY2FjaGVfcmVnaXN0ZXJfaG9vawkvKiByZWdpc3RlciBob29rcyAqLwotfTsKZGlmZiAtLWdpdCBhL21vZHVsZXMvZXhwZXJpbWVudGFsL21vZF9kaXNrX2NhY2hlLmRzcCBiL21vZHVsZXMvZXhwZXJpbWVudGFsL21vZF9kaXNrX2NhY2hlLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAwOGZmYy4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2V4cGVyaW1lbnRhbC9tb2RfZGlza19jYWNoZS5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJtb2RfZGlza19jYWNoZSIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyCi0KLUNGRz1tb2RfZGlza19jYWNoZSAtIFdpbjMyIERlYnVnCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIm1vZF9kaXNrX2NhY2hlLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAibW9kX2Rpc2tfY2FjaGUubWFrIiBDRkc9Im1vZF9kaXNrX2NhY2hlIC0gV2luMzIgRGVidWciCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAibW9kX2Rpc2tfY2FjaGUgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFICJtb2RfZGlza19jYWNoZSAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwCi0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotTVRMPW1pZGwuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9kaXNrX2NhY2hlIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiX1VTUkRMTCIgL0QgIk1PRF9ESVNLX0NBQ0hFX0VYUE9SVFMiIC9ZWCAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMiAvSSAiLi4vLi4vc3JjbGliL2Fwci11dGlsL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByL2luY2x1ZGUiIC9JICIuLi8uLi9pbmNsdWRlIiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiX1VTUkRMTCIgL0QgIk1PRF9ESVNLX0NBQ0hFX0VYUE9SVFMiIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9kbGwgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL2RsbCAvbWFjaGluZTpJMzg2Ci0KLSFFTFNFSUYgICIkKENGRykiID09ICJtb2RfZGlza19jYWNoZSAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9EICJfTUJDUyIgL0QgIl9VU1JETEwiIC9EICJNT0RfRElTS19DQUNIRV9FWFBPUlRTIiAvWVggL0ZEIC9HWiAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWkkgL09kIC9JICIuLi8uLi9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHIvaW5jbHVkZSIgL0kgIi4uLy4uL2luY2x1ZGUiIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJfVVNSRExMIiAvRCAiTU9EX0RJU0tfQ0FDSEVfRVhQT1JUUyIgL1lYIC9GRCAvR1ogL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0Ci0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJtb2RfZGlza19jYWNoZSAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgIm1vZF9kaXNrX2NhY2hlIC0gV2luMzIgRGVidWciCi0jIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kX2Rpc2tfY2FjaGUuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kX2NhY2hlLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIgotIyBFbmQgR3JvdXAKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9leHBlcmltZW50YWwvbW9kX2V4YW1wbGUuYyBiL21vZHVsZXMvZXhwZXJpbWVudGFsL21vZF9leGFtcGxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YTZiMDYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9leHBlcmltZW50YWwvbW9kX2V4YW1wbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDExNDkgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKiAKLSAqIEFwYWNoZSBleGFtcGxlIG1vZHVsZS4gIFByb3ZpZGUgZGVtb25zdHJhdGlvbnMgb2YgaG93IG1vZHVsZXMgZG8gdGhpbmdzLgotICoKLSAqLwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiCi0jaW5jbHVkZSAiaHR0cF9wcm90b2NvbC5oIgotI2luY2x1ZGUgInV0aWxfc2NyaXB0LmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRGF0YSBkZWNsYXJhdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEhlcmUgYXJlIHRoZSBzdGF0aWMgY2VsbHMgYW5kIHN0cnVjdHVyZSBkZWNsYXJhdGlvbnMgcHJpdmF0ZSB0byBvdXIgICAgICAqLwotLyogbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotICogU2FtcGxlIGNvbmZpZ3VyYXRpb24gcmVjb3JkLiAgVXNlZCBmb3IgYm90aCBwZXItZGlyZWN0b3J5IGFuZCBwZXItc2VydmVyCi0gKiBjb25maWd1cmF0aW9uIGRhdGEuCi0gKgotICogSXQncyBwZXJmZWN0bHkgcmVhc29uYWJsZSB0byBoYXZlIHR3byBkaWZmZXJlbnQgc3RydWN0dXJlcyBmb3IgdGhlIHR3bwotICogZGlmZmVyZW50IGVudmlyb25tZW50cy4gIFRoZSBzYW1lIGNvbW1hbmQgaGFuZGxlcnMgd2lsbCBiZSBjYWxsZWQgZm9yCi0gKiBib3RoLCB0aG91Z2gsIHNvIHRoZSBoYW5kbGVycyBuZWVkIHRvIGJlIGFibGUgdG8gdGVsbCB0aGVtIGFwYXJ0LiAgT25lCi0gKiBwb3NzaWJpbGl0eSBpcyBmb3IgYm90aCBzdHJ1Y3R1cmVzIHRvIHN0YXJ0IHdpdGggYW4gaW50IHdoaWNoIGlzIHplcm8gZm9yCi0gKiBvbmUgYW5kIDEgZm9yIHRoZSBvdGhlci4KLSAqCi0gKiBOb3RlIHRoYXQgd2hpbGUgdGhlIHBlci1kaXJlY3RvcnkgYW5kIHBlci1zZXJ2ZXIgY29uZmlndXJhdGlvbiByZWNvcmRzIGFyZQotICogYXZhaWxhYmxlIHRvIG1vc3Qgb2YgdGhlIG1vZHVsZSBoYW5kbGVycywgdGhleSBzaG91bGQgYmUgdHJlYXRlZCBhcwotICogUkVBRC1PTkxZIGJ5IGFsbCBleGNlcHQgdGhlIGNvbW1hbmQgYW5kIG1lcmdlIGhhbmRsZXJzLiAgU29tZXRpbWVzIGhhbmRsZXJzCi0gKiBhcmUgaGFuZGVkIGEgcmVjb3JkIHRoYXQgYXBwbGllcyB0byB0aGUgY3VycmVudCBsb2NhdGlvbiBieSBpbXBsaWNhdGlvbiBvcgotICogaW5oZXJpdGFuY2UsIGFuZCBtb2RpZnlpbmcgaXQgd2lsbCBjaGFuZ2UgdGhlIHJ1bGVzIGZvciBvdGhlciBsb2NhdGlvbnMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IGV4Y2ZnIHsKLSAgICBpbnQgY21vZGU7ICAgICAgICAgICAgICAgICAgLyogRW52aXJvbm1lbnQgdG8gd2hpY2ggcmVjb3JkIGFwcGxpZXMgKGRpcmVjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2VydmVyLCBvciBjb21iaW5hdGlvbikuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBDT05GSUdfTU9ERV9TRVJWRVIgMQotI2RlZmluZSBDT05GSUdfTU9ERV9ESVJFQ1RPUlkgMgotI2RlZmluZSBDT05GSUdfTU9ERV9DT01CTyAzICAgICAvKiBTaG91bGRuJ3QgZXZlciBoYXBwZW4uICovCi0gICAgaW50IGxvY2FsOyAgICAgICAgICAgICAgICAgIC8qIEJvb2xlYW46ICJFeGFtcGxlIiBkaXJlY3RpdmUgZGVjbGFyZWQgaGVyZT8gKi8KLSAgICBpbnQgY29uZ2VuaXRhbDsgICAgICAgICAgICAgLyogQm9vbGVhbjogZGlkIHdlIGluaGVyaXQgYW4gIkV4YW1wbGUiPyAqLwotICAgIGNoYXIgKnRyYWNlOyAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRyYWNlIHN0cmluZy4gKi8KLSAgICBjaGFyICpsb2M7ICAgICAgICAgICAgICAgICAgLyogTG9jYXRpb24gdG8gd2hpY2ggdGhpcyByZWNvcmQgYXBwbGllcy4gKi8KLX0gZXhjZmc7Ci0KLS8qCi0gKiBMZXQncyBzZXQgdXAgYSBtb2R1bGUtbG9jYWwgc3RhdGljIGNlbGwgdG8gcG9pbnQgdG8gdGhlIGFjY3JldGluZyBjYWxsYmFjawotICogdHJhY2UuICBBcyBlYWNoIEFQSSBjYWxsYmFjayBpcyBtYWRlIHRvIHVzLCB3ZSdsbCB0YWNrIG9uIHRoZSBwYXJ0aWN1bGFycwotICogdG8gd2hhdGV2ZXIgd2UndmUgYWxyZWFkeSByZWNvcmRlZC4gIFRvIGF2b2lkIG1hc3NpdmUgbWVtb3J5IGJsb2F0IGFzCi0gKiBkaXJlY3RvcmllcyBhcmUgd2Fsa2VkIGFnYWluIGFuZCBhZ2Fpbiwgd2UgcmVjb3JkIHRoZSByb3V0aW5lL2Vudmlyb25tZW50Ci0gKiB0aGUgZmlyc3QgdGltZSAobm9uLXJlcXVlc3QgY29udGV4dCBvbmx5KSwgYW5kIGlnbm9yZSBzdWJzZXF1ZW50IGNhbGxzIGZvcgotICogdGhlIHNhbWUgcm91dGluZS9lbnZpcm9ubWVudC4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKnRyYWNlID0gTlVMTDsKLXN0YXRpYyB0YWJsZSAqc3RhdGljX2NhbGxzX21hZGUgPSBOVUxMOwotCi0vKgotICogVG8gYXZvaWQgbGVha2luZyBtZW1vcnkgZnJvbSBwb29scyBvdGhlciB0aGFuIHRoZSBwZXItcmVxdWVzdCBvbmUsIHdlCi0gKiBhbGxvY2F0ZSBhIG1vZHVsZS1wcml2YXRlIHBvb2wsIGFuZCB0aGVuIHVzZSBhIHN1Yi1wb29sIG9mIHRoYXQgd2hpY2ggZ2V0cwotICogZnJlZWQgZWFjaCB0aW1lIHdlIG1vZGlmeSB0aGUgdHJhY2UuICBUaGF0IHdheSBwcmV2aW91cyBsYXllcnMgb2YgdHJhY2UKLSAqIGRhdGEgZG9uJ3QgZ2V0IGxvc3QuCi0gKi8KLXN0YXRpYyBwb29sICpleGFtcGxlX3Bvb2wgPSBOVUxMOwotc3RhdGljIHBvb2wgKmV4YW1wbGVfc3VicG9vbCA9IE5VTEw7Ci0KLS8qCi0gKiBEZWNsYXJlIG91cnNlbHZlcyBzbyB0aGUgY29uZmlndXJhdGlvbiByb3V0aW5lcyBjYW4gZmluZCBhbmQga25vdyB1cy4KLSAqIFdlJ2xsIGZpbGwgaXQgaW4gYXQgdGhlIGVuZCBvZiB0aGUgbW9kdWxlLgotICovCi1tb2R1bGUgZXhhbXBsZV9tb2R1bGU7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgZm9sbG93aW5nIHBzZXVkby1wcm90b3R5cGUgZGVjbGFyYXRpb25zIGlsbHVzdHJhdGUgdGhlIHBhcmFtZXRlcnMgICAgKi8KLS8qIHBhc3NlZCB0byBjb21tYW5kIGhhbmRsZXJzIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGRpcmVjdGl2ZSAgICAgICAgICAqLwotLyogc3ludGF4LiAgSWYgYW4gYXJndW1lbnQgd2FzIHNwZWNpZmllZCBpbiB0aGUgZGlyZWN0aXZlIGRlZmluaXRpb24gICAgICAgICovCi0vKiAobG9vayBmb3IgImNvbW1hbmRfcmVjIiBiZWxvdyksIGl0J3MgYXZhaWxhYmxlIHRvIHRoZSBjb21tYW5kIGhhbmRsZXIgICAgKi8KLS8qIHZpYSB0aGUgKHZvaWQgKikgaW5mbyBmaWVsZCBpbiB0aGUgY21kX3Bhcm1zIGFyZ3VtZW50IHBhc3NlZCB0byB0aGUgICAgICAqLwotLyogaGFuZGxlciAoY21kLT5pbmZvIGZvciB0aGUgZXhhbXBsZXMgYmVsb3cpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotICogQ29tbWFuZCBoYW5kbGVyIGZvciBhIE5PX0FSR1MgZGlyZWN0aXZlLgotICoKLSAqIHN0YXRpYyBjb25zdCBjaGFyICpoYW5kbGVfTk9fQVJHUyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqbWNvbmZpZyk7Ci0gKi8KLQotLyoKLSAqIENvbW1hbmQgaGFuZGxlciBmb3IgYSBSQVdfQVJHUyBkaXJlY3RpdmUuICBUaGUgImFyZ3MiIGFyZ3VtZW50IGlzIHRoZSB0ZXh0Ci0gKiBvZiB0aGUgY29tbWFuZGxpbmUgZm9sbG93aW5nIHRoZSBkaXJlY3RpdmUgaXRzZWxmLgotICoKLSAqIHN0YXRpYyBjb25zdCBjaGFyICpoYW5kbGVfUkFXX0FSR1MoY21kX3Bhcm1zICpjbWQsIHZvaWQgKm1jb25maWcsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFyZ3MpOwotICovCi0KLS8qCi0gKiBDb21tYW5kIGhhbmRsZXIgZm9yIGEgRkxBRyBkaXJlY3RpdmUuICBUaGUgc2luZ2xlIHBhcmFtZXRlciBpcyBwYXNzZWQgaW4KLSAqICJib29sIiwgd2hpY2ggaXMgZWl0aGVyIHplcm8gb3Igbm90IGZvciBPZmYgb3IgT24gcmVzcGVjdGl2ZWx5LgotICoKLSAqIHN0YXRpYyBjb25zdCBjaGFyICpoYW5kbGVfRkxBRyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqbWNvbmZpZywgaW50IGJvb2wpOwotICovCi0KLS8qCi0gKiBDb21tYW5kIGhhbmRsZXIgZm9yIGEgVEFLRTEgZGlyZWN0aXZlLiAgVGhlIHNpbmdsZSBwYXJhbWV0ZXIgaXMgcGFzc2VkIGluCi0gKiAid29yZDEiLgotICoKLSAqIHN0YXRpYyBjb25zdCBjaGFyICpoYW5kbGVfVEFLRTEoY21kX3Bhcm1zICpjbWQsIHZvaWQgKm1jb25maWcsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKndvcmQxKTsKLSAqLwotCi0vKgotICogQ29tbWFuZCBoYW5kbGVyIGZvciBhIFRBS0UyIGRpcmVjdGl2ZS4gIFRBS0UyIGNvbW1hbmRzIG11c3QgYWx3YXlzIGhhdmUKLSAqIGV4YWN0bHkgdHdvIGFyZ3VtZW50cy4KLSAqCi0gKiBzdGF0aWMgY29uc3QgY2hhciAqaGFuZGxlX1RBS0UyKGNtZF9wYXJtcyAqY21kLCB2b2lkICptY29uZmlnLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICp3b3JkMSwgY2hhciAqd29yZDIpOwotICovCi0KLS8qCi0gKiBDb21tYW5kIGhhbmRsZXIgZm9yIGEgVEFLRTMgZGlyZWN0aXZlLiAgTGlrZSBUQUtFMiwgdGhlc2UgbXVzdCBoYXZlIGV4YWN0bHkKLSAqIHRocmVlIGFyZ3VtZW50cywgb3IgdGhlIHBhcnNlciBjb21wbGFpbnMgYW5kIGRvZXNuJ3QgYm90aGVyIGNhbGxpbmcgdXMuCi0gKgotICogc3RhdGljIGNvbnN0IGNoYXIgKmhhbmRsZV9UQUtFMyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqbWNvbmZpZywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqd29yZDEsIGNoYXIgKndvcmQyLCBjaGFyICp3b3JkMyk7Ci0gKi8KLQotLyoKLSAqIENvbW1hbmQgaGFuZGxlciBmb3IgYSBUQUtFMTIgZGlyZWN0aXZlLiAgVGhlc2UgY2FuIHRha2UgZWl0aGVyIG9uZSBvciB0d28KLSAqIGFyZ3VtZW50cy4KLSAqIC0gd29yZDIgaXMgYSBOVUxMIHBvaW50ZXIgaWYgbm8gc2Vjb25kIGFyZ3VtZW50IHdhcyBzcGVjaWZpZWQuCi0gKgotICogc3RhdGljIGNvbnN0IGNoYXIgKmhhbmRsZV9UQUtFMTIoY21kX3Bhcm1zICpjbWQsIHZvaWQgKm1jb25maWcsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICp3b3JkMSwgY2hhciAqd29yZDIpOwotICovCi0KLS8qCi0gKiBDb21tYW5kIGhhbmRsZXIgZm9yIGEgVEFLRTEyMyBkaXJlY3RpdmUuICBBIFRBS0UxMjMgZGlyZWN0aXZlIGNhbiBiZSBnaXZlbiwKLSAqIGFzIG1pZ2h0IGJlIGV4cGVjdGVkLCBvbmUsIHR3bywgb3IgdGhyZWUgYXJndW1lbnRzLgotICogLSB3b3JkMiBpcyBhIE5VTEwgcG9pbnRlciBpZiBubyBzZWNvbmQgYXJndW1lbnQgd2FzIHNwZWNpZmllZC4KLSAqIC0gd29yZDMgaXMgYSBOVUxMIHBvaW50ZXIgaWYgbm8gdGhpcmQgYXJndW1lbnQgd2FzIHNwZWNpZmllZC4KLSAqCi0gKiBzdGF0aWMgY29uc3QgY2hhciAqaGFuZGxlX1RBS0UxMjMoY21kX3Bhcm1zICpjbWQsIHZvaWQgKm1jb25maWcsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqd29yZDEsIGNoYXIgKndvcmQyLCBjaGFyICp3b3JkMyk7Ci0gKi8KLQotLyoKLSAqIENvbW1hbmQgaGFuZGxlciBmb3IgYSBUQUtFMTMgZGlyZWN0aXZlLiAgRWl0aGVyIG9uZSBvciB0aHJlZSBhcmd1bWVudHMgYXJlCi0gKiBwZXJtaXR0ZWQgLSBubyB0d28tcGFyYW1ldGVycy1vbmx5IHN5bnRheCBpcyBhbGxvd2VkLgotICogLSB3b3JkMiBhbmQgd29yZDMgYXJlIE5VTEwgcG9pbnRlcnMgaWYgb25seSBvbmUgYXJndW1lbnQgd2FzIHNwZWNpZmllZC4KLSAqCi0gKiBzdGF0aWMgY29uc3QgY2hhciAqaGFuZGxlX1RBS0UxMyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqbWNvbmZpZywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKndvcmQxLCBjaGFyICp3b3JkMiwgY2hhciAqd29yZDMpOwotICovCi0KLS8qCi0gKiBDb21tYW5kIGhhbmRsZXIgZm9yIGEgVEFLRTIzIGRpcmVjdGl2ZS4gIEF0IGxlYXN0IHR3byBhbmQgYXMgbWFueSBhcyB0aHJlZQotICogYXJndW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkLgotICogLSB3b3JkMyBpcyBhIE5VTEwgcG9pbnRlciBpZiBubyB0aGlyZCBhcmd1bWVudCB3YXMgc3BlY2lmaWVkLgotICoKLSAqIHN0YXRpYyBjb25zdCBjaGFyICpoYW5kbGVfVEFLRTIzKGNtZF9wYXJtcyAqY21kLCB2b2lkICptY29uZmlnLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqd29yZDEsIGNoYXIgKndvcmQyLCBjaGFyICp3b3JkMyk7Ci0gKi8KLQotLyoKLSAqIENvbW1hbmQgaGFuZGxlciBmb3IgYSBJVEVSQVRFIGRpcmVjdGl2ZS4KLSAqIC0gSGFuZGxlciBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBvZiBuIGFyZ3VtZW50cyBnaXZlbiB0byB0aGUgZGlyZWN0aXZlLgotICogLSB3b3JkMSBwb2ludHMgdG8gZWFjaCBhcmd1bWVudCBpbiB0dXJuLgotICoKLSAqIHN0YXRpYyBjb25zdCBjaGFyICpoYW5kbGVfSVRFUkFURShjbWRfcGFybXMgKmNtZCwgdm9pZCAqbWNvbmZpZywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICp3b3JkMSk7Ci0gKi8KLQotLyoKLSAqIENvbW1hbmQgaGFuZGxlciBmb3IgYSBJVEVSQVRFMiBkaXJlY3RpdmUuCi0gKiAtIEhhbmRsZXIgaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggb2YgdGhlIHNlY29uZCBhbmQgc3Vic2VxdWVudCBhcmd1bWVudHMKLSAqICAgZ2l2ZW4gdG8gdGhlIGRpcmVjdGl2ZS4KLSAqIC0gd29yZDEgaXMgdGhlIHNhbWUgZm9yIGVhY2ggY2FsbCBmb3IgYSBwYXJ0aWN1bGFyIGRpcmVjdGl2ZSBpbnN0YW5jZSAodGhlCi0gKiAgIGZpcnN0IGFyZ3VtZW50KS4KLSAqIC0gd29yZDIgcG9pbnRzIHRvIGVhY2ggb2YgdGhlIHNlY29uZCBhbmQgc3Vic2VxdWVudCBhcmd1bWVudHMgaW4gdHVybi4KLSAqCi0gKiBzdGF0aWMgY29uc3QgY2hhciAqaGFuZGxlX0lURVJBVEUyKGNtZF9wYXJtcyAqY21kLCB2b2lkICptY29uZmlnLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICp3b3JkMSwgY2hhciAqd29yZDIpOwotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGVzZSByb3V0aW5lcyBhcmUgc3RyaWN0bHkgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCBzdXBwb3J0IGl0cyAgICAgKi8KLS8qIG9wZXJhdGlvbi4gIFRoZXkgYXJlIG5vdCByZWZlcmVuY2VkIGJ5IGFueSBleHRlcm5hbCBwb3J0aW9uIG9mIHRoZSAgICAgICAqLwotLyogc2VydmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotICogTG9jYXRlIG91ciBkaXJlY3RvcnkgY29uZmlndXJhdGlvbiByZWNvcmQgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QuCi0gKi8KLXN0YXRpYyBleGNmZyAqb3VyX2Rjb25maWcocmVxdWVzdF9yZWMgKnIpCi17Ci0KLSAgICByZXR1cm4gKGV4Y2ZnICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLCAmZXhhbXBsZV9tb2R1bGUpOwotfQotCi0jaWYgMAotLyoKLSAqIExvY2F0ZSBvdXIgc2VydmVyIGNvbmZpZ3VyYXRpb24gcmVjb3JkIGZvciB0aGUgc3BlY2lmaWVkIHNlcnZlci4KLSAqLwotc3RhdGljIGV4Y2ZnICpvdXJfc2NvbmZpZyhzZXJ2ZXJfcmVjICpzKQotewotCi0gICAgcmV0dXJuIChleGNmZyAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAmZXhhbXBsZV9tb2R1bGUpOwotfQotCi0vKgotICogTGlrZXdpc2UgZm9yIG91ciBjb25maWd1cmF0aW9uIHJlY29yZCBmb3IgdGhlIHNwZWNpZmllZCByZXF1ZXN0LgotICovCi1zdGF0aWMgZXhjZmcgKm91cl9yY29uZmlnKHJlcXVlc3RfcmVjICpyKQotewotCi0gICAgcmV0dXJuIChleGNmZyAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5yZXF1ZXN0X2NvbmZpZywgJmV4YW1wbGVfbW9kdWxlKTsKLX0KLSNlbmRpZgotCi0vKgotICogVGhpcyByb3V0aW5lIHNldHMgdXAgc29tZSBtb2R1bGUtd2lkZSBjZWxscyBpZiB0aGV5IGhhdmVuJ3QgYmVlbiBhbHJlYWR5LgotICovCi1zdGF0aWMgdm9pZCBzZXR1cF9tb2R1bGVfY2VsbHMoKQotewotICAgIC8qCi0gICAgICogSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGFsbG9jYXRlZCBvdXIgbW9kdWxlLXByaXZhdGUgcG9vbCwgZG8gc28gbm93LgotICAgICAqLwotICAgIGlmIChleGFtcGxlX3Bvb2wgPT0gTlVMTCkgewotICAgICAgICBleGFtcGxlX3Bvb2wgPSBhcF9tYWtlX3N1Yl9wb29sKE5VTEwpOwotICAgIH07Ci0gICAgLyoKLSAgICAgKiBMaWtld2lzZSBmb3IgdGhlIHRhYmxlIG9mIHJvdXRpbmUvZW52aXJvbm1lbnQgcGFpcnMgd2UgdmlzaXQgb3V0c2lkZSBvZgotICAgICAqIHJlcXVlc3QgY29udGV4dC4KLSAgICAgKi8KLSAgICBpZiAoc3RhdGljX2NhbGxzX21hZGUgPT0gTlVMTCkgewotICAgICAgICBzdGF0aWNfY2FsbHNfbWFkZSA9IGFwX21ha2VfdGFibGUoZXhhbXBsZV9wb29sLCAxNik7Ci0gICAgfTsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGFkZCBhIHRyYWNlIG9mIGEgY2FsbGJhY2sgdG8gdGhlIGxpc3QuICBXZSdyZQotICogcGFzc2VkIHRoZSBzZXJ2ZXIgcmVjb3JkIChpZiBhdmFpbGFibGUpLCB0aGUgcmVxdWVzdCByZWNvcmQgKGlmIGF2YWlsYWJsZSksCi0gKiBhIHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgY29uZmlndXJhdGlvbiByZWNvcmQgKGlmIGF2YWlsYWJsZSkgZm9yIHRoZQotICogZW52aXJvbm1lbnQgdG8gd2hpY2ggdGhlIGNhbGxiYWNrIGlzIHN1cHBvc2VkIHRvIGFwcGx5LCBhbmQgc29tZSB0ZXh0LiAgV2UKLSAqIHR1cm4gdGhpcyBpbnRvIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBhbmQgYWRkIGl0IHRvIHRoZSB0YWlsIG9mIHRoZSBsaXN0LgotICogVGhlIGxpc3QgY2FuIGJlIGRpc3BsYXllZCBieSB0aGUgZXhhbXBsZV9oYW5kbGVyKCkgcm91dGluZS4KLSAqCi0gKiBJZiB0aGUgY2FsbCBvY2N1cnMgd2l0aGluIGEgcmVxdWVzdCBjb250ZXh0IChpLmUuLCB3ZSdyZSBwYXNzZWQgYSByZXF1ZXN0Ci0gKiByZWNvcmQpLCB3ZSBwdXQgdGhlIHRyYWNlIGludG8gdGhlIHJlcXVlc3QgcG9vbCBhbmQgYXR0YWNoIGl0IHRvIHRoZQotICogcmVxdWVzdCB2aWEgdGhlIG5vdGVzIG1lY2hhbmlzbS4gIE90aGVyd2lzZSwgdGhlIHRyYWNlIGdldHMgYWRkZWQKLSAqIHRvIHRoZSBzdGF0aWMgKG5vbi1yZXF1ZXN0LXNwZWNpZmljKSBsaXN0LgotICoKLSAqIE5vdGUgdGhhdCB0aGUgci0+bm90ZXMgdGFibGUgaXMgb25seSBmb3Igc3RvcmluZyBzdHJpbmdzOyBpZiB5b3UgbmVlZCB0bwotICogbWFpbnRhaW4gcGVyLXJlcXVlc3QgZGF0YSBvZiBhbnkgb3RoZXIgdHlwZSwgeW91IG5lZWQgdG8gdXNlIGFub3RoZXIKLSAqIG1lY2hhbmlzbS4KLSAqLwotCi0jZGVmaW5lIFRSQUNFX05PVEUgImV4YW1wbGUtdHJhY2UiCi0KLXN0YXRpYyB2b2lkIHRyYWNlX2FkZChzZXJ2ZXJfcmVjICpzLCByZXF1ZXN0X3JlYyAqciwgZXhjZmcgKm1jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbm90ZSkKLXsKLQotICAgIGNvbnN0IGNoYXIgKnNvZmFyOwotICAgIGNoYXIgKmFkZG9uOwotICAgIGNoYXIgKndoZXJlOwotICAgIHBvb2wgKnA7Ci0gICAgY29uc3QgY2hhciAqdHJhY2VfY29weTsKLQotICAgIC8qCi0gICAgICogTWFrZSBzdXJlIG91ciBwb29scyBhbmQgdGFibGVzIGFyZSBzZXQgdXAgLSB3ZSBuZWVkICdlbS4KLSAgICAgKi8KLSAgICBzZXR1cF9tb2R1bGVfY2VsbHMoKTsKLSAgICAvKgotICAgICAqIE5vdywgaWYgd2UncmUgaW4gcmVxdWVzdC1jb250ZXh0LCB3ZSB1c2UgdGhlIHJlcXVlc3QgcG9vbC4KLSAgICAgKi8KLSAgICBpZiAociAhPSBOVUxMKSB7Ci0gICAgICAgIHAgPSByLT5wb29sOwotICAgICAgICBpZiAoKHRyYWNlX2NvcHkgPSBhcF90YWJsZV9nZXQoci0+bm90ZXMsIFRSQUNFX05PVEUpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICB0cmFjZV9jb3B5ID0gIiI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFdlJ3JlIG5vdCBpbiByZXF1ZXN0IGNvbnRleHQsIHNvIHRoZSB0cmFjZSBnZXRzIGF0dGFjaGVkIHRvIG91cgotICAgICAgICAgKiBtb2R1bGUtd2lkZSBwb29sLiAgV2UgZG8gdGhlIGNyZWF0ZS9kZXN0cm95IGV2ZXJ5IHRpbWUgd2UncmUgY2FsbGVkCi0gICAgICAgICAqIGluIG5vbi1yZXF1ZXN0IGNvbnRleHQ7IHRoaXMgYXZvaWRzIGxlYWtpbmcgbWVtb3J5IGluIHNvbWUgb2YKLSAgICAgICAgICogdGhlIHN1YnNlcXVlbnQgY2FsbHMgdGhhdCBhbGxvY2F0ZSBtZW1vcnkgb25seSBvbmNlIChzdWNoIGFzIHRoZQotICAgICAgICAgKiBrZXkgZm9ybWF0aW9uIGJlbG93KS4KLSAgICAgICAgICoKLSAgICAgICAgICogTWFrZSBhIG5ldyBzdWItcG9vbCBhbmQgY29weSBhbnkgZXhpc3RpbmcgdHJhY2UgdG8gaXQuICBQb2ludCB0aGUKLSAgICAgICAgICogdHJhY2UgY2VsbCBhdCB0aGUgY29waWVkIHZhbHVlLgotICAgICAgICAgKi8KLSAgICAgICAgcCA9IGFwX21ha2Vfc3ViX3Bvb2woZXhhbXBsZV9wb29sKTsKLSAgICAgICAgaWYgKHRyYWNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHRyYWNlID0gYXBfcHN0cmR1cChwLCB0cmFjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLyoKLSAgICAgICAgICogTm93LCBpZiB3ZSBoYXZlIGEgc3ViLXBvb2wgZnJvbSBiZWZvcmUsIG51a2UgaXQgYW5kIHJlcGxhY2Ugd2l0aAotICAgICAgICAgKiB0aGUgb25lIHdlIGp1c3QgYWxsb2NhdGVkLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGV4YW1wbGVfc3VicG9vbCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBhcF9kZXN0cm95X3Bvb2woZXhhbXBsZV9zdWJwb29sKTsKLSAgICAgICAgfQotICAgICAgICBleGFtcGxlX3N1YnBvb2wgPSBwOwotICAgICAgICB0cmFjZV9jb3B5ID0gdHJhY2U7Ci0gICAgfQotICAgIC8qCi0gICAgICogSWYgd2Ugd2VyZW4ndCBwYXNzZWQgYSBjb25maWd1cmF0aW9uIHJlY29yZCwgd2UgY2FuJ3QgZmlndXJlIG91dCB0bwotICAgICAqIHdoYXQgbG9jYXRpb24gdGhpcyBjYWxsIGFwcGxpZXMuICBUaGlzIG9ubHkgaGFwcGVucyBmb3IgY28tcm91dGluZXMKLSAgICAgKiB0aGF0IGRvbid0IG9wZXJhdGUgaW4gYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeSBvciBzZXJ2ZXIgY29udGV4dC4gIElmIHdlCi0gICAgICogZ290IGEgdmFsaWQgcmVjb3JkLCBleHRyYWN0IHRoZSBsb2NhdGlvbiAoZGlyZWN0b3J5IG9yIHNlcnZlcikgdG8gd2hpY2gKLSAgICAgKiBpdCBhcHBsaWVzLgotICAgICAqLwotICAgIHdoZXJlID0gKG1jb25maWcgIT0gTlVMTCkgPyBtY29uZmlnLT5sb2MgOiAibm93aGVyZSI7Ci0gICAgd2hlcmUgPSAod2hlcmUgIT0gTlVMTCkgPyB3aGVyZSA6ICIiOwotICAgIC8qCi0gICAgICogTm93LCBpZiB3ZSdyZSBub3QgaW4gcmVxdWVzdCBjb250ZXh0LCBzZWUgaWYgd2UndmUgYmVlbiBjYWxsZWQgd2l0aAotICAgICAqIHRoaXMgcGFydGljdWxhciBjb21iaW5hdGlvbiBiZWZvcmUuICBUaGUgdGFibGUgaXMgYWxsb2NhdGVkIGluIHRoZQotICAgICAqIG1vZHVsZSdzIHByaXZhdGUgcG9vbCwgd2hpY2ggZG9lc24ndCBnZXQgZGVzdHJveWVkLgotICAgICAqLwotICAgIGlmIChyID09IE5VTEwpIHsKLSAgICAgICAgY2hhciAqa2V5OwotCi0gICAgICAgIGtleSA9IGFwX3BzdHJjYXQocCwgbm90ZSwgIjoiLCB3aGVyZSwgTlVMTCk7Ci0gICAgICAgIGlmIChhcF90YWJsZV9nZXQoc3RhdGljX2NhbGxzX21hZGUsIGtleSkgIT0gTlVMTCkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEJlZW4gaGVyZSwgZG9uZSB0aGlzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogRmlyc3QgdGltZSBmb3IgdGhpcyBjb21iaW5hdGlvbiBvZiByb3V0aW5lIGFuZCBlbnZpcm9ubWVudCAtCi0gICAgICAgICAgICAgKiBsb2cgaXQgc28gd2UgZG9uJ3QgZG8gaXQgYWdhaW4uCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGFwX3RhYmxlX3NldChzdGF0aWNfY2FsbHNfbWFkZSwga2V5LCAiYmVlbiBoZXJlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYWRkb24gPSBhcF9wc3RyY2F0KHAsICIgICA8TEk+XG4iLCAiICAgIDxETD5cbiIsICIgICAgIDxEVD48U0FNUD4iLAotICAgICAgICAgICAgICAgICAgICBub3RlLCAiPC9TQU1QPlxuIiwgIiAgICAgPC9EVD5cbiIsICIgICAgIDxERD48U0FNUD5bIiwKLSAgICAgICAgICAgICAgICAgICAgd2hlcmUsICJdPC9TQU1QPlxuIiwgIiAgICAgPC9ERD5cbiIsICIgICAgPC9ETD5cbiIsCi0gICAgICAgICAgICAgICAgICAgICIgICA8L0xJPlxuIiwgTlVMTCk7Ci0gICAgc29mYXIgPSAodHJhY2VfY29weSA9PSBOVUxMKSA/ICIiIDogdHJhY2VfY29weTsKLSAgICB0cmFjZV9jb3B5ID0gYXBfcHN0cmNhdChwLCBzb2ZhciwgYWRkb24sIE5VTEwpOwotICAgIGlmIChyICE9IE5VTEwpIHsKLSAgICAgICAgYXBfdGFibGVfc2V0KHItPm5vdGVzLCBUUkFDRV9OT1RFLCB0cmFjZV9jb3B5KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHRyYWNlID0gdHJhY2VfY29weTsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBZb3UgKmNvdWxkKiBjaGFuZ2UgdGhlIGZvbGxvd2luZyBpZiB5b3Ugd2FudGVkIHRvIHNlZSB0aGUgY2FsbGluZwotICAgICAqIHNlcXVlbmNlIHJlcG9ydGVkIGluIHRoZSBzZXJ2ZXIncyBlcnJvcl9sb2csIGJ1dCBiZXdhcmUgLSBhbG1vc3QgYWxsIG9mCi0gICAgICogdGhlc2UgY28tcm91dGluZXMgYXJlIGNhbGxlZCBmb3IgZXZlcnkgc2luZ2xlIHJlcXVlc3QsIGFuZCB0aGUgaW1wYWN0Ci0gICAgICogb24gdGhlIHNpemUgKGFuZCByZWFkYWJpbGl0eSkgb2YgdGhlIGVycm9yX2xvZyBpcyBjb25zaWRlcmFibGUuCi0gICAgICovCi0jZGVmaW5lIEVYQU1QTEVfTE9HX0VBQ0ggMAotICAgIGlmIChFWEFNUExFX0xPR19FQUNIICYmIChzICE9IE5VTEwpKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19ERUJVRywgcywgIm1vZF9leGFtcGxlOiAlcyIsIG5vdGUpOwotICAgIH0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBXZSBwcm90b3R5cGVkIHRoZSB2YXJpb3VzIHN5bnRheCBmb3IgY29tbWFuZCBoYW5kbGVycyAocm91dGluZXMgdGhhdCAgICAgKi8KLS8qIGFyZSBjYWxsZWQgd2hlbiB0aGUgY29uZmlndXJhdGlvbiBwYXJzZXIgZGV0ZWN0cyBhIGRpcmVjdGl2ZSBkZWNsYXJlZCAgICAqLwotLyogYnkgb3VyIG1vZHVsZSkgZWFybGllci4gIE5vdyB3ZSBhY3R1YWxseSBkZWNsYXJlIGEgInJlYWwiIHJvdXRpbmUgdGhhdCAgICovCi0vKiB3aWxsIGJlIGludm9rZWQgYnkgdGhlIHBhcnNlciB3aGVuIG91ciAicmVhbCIgZGlyZWN0aXZlIGlzICAgICAgICAgICAgICAgKi8KLS8qIGVuY291bnRlcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBJZiBhIGNvbW1hbmQgaGFuZGxlciBlbmNvdW50ZXJzIGEgcHJvYmxlbSBwcm9jZXNzaW5nIHRoZSBkaXJlY3RpdmUsIGl0ICAgKi8KLS8qIHNpZ25hbHMgdGhpcyBmYWN0IGJ5IHJldHVybmluZyBhIG5vbi1OVUxMIHBvaW50ZXIgdG8gYSBzdHJpbmcgICAgICAgICAgICAqLwotLyogZGVzY3JpYmluZyB0aGUgcHJvYmxlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSBtYWdpYyByZXR1cm4gdmFsdWUgREVDTElORV9DTUQgaXMgdXNlZCB0byBkZWFsIHdpdGggZGlyZWN0aXZlcyAgICAgICAqLwotLyogdGhhdCBtaWdodCBiZSBkZWNsYXJlZCBieSBtdWx0aXBsZSBtb2R1bGVzLiAgSWYgdGhlIGNvbW1hbmQgaGFuZGxlciAgICAgICovCi0vKiByZXR1cm5zIE5VTEwsIHRoZSBkaXJlY3RpdmUgd2FzIHByb2Nlc3NlZDsgaWYgaXQgcmV0dXJucyBERUNMSU5FX0NNRCwgICAgKi8KLS8qIHRoZSBuZXh0IG1vZHVsZSAoaWYgYW55KSB0aGF0IGRlY2xhcmVzIHRoZSBkaXJlY3RpdmUgaXMgZ2l2ZW4gYSBjaGFuY2UgICAqLwotLyogYXQgaXQuICBJZiBpdCByZXR1cm5zIGFueSBvdGhlciB2YWx1ZSwgaXQncyB0cmVhdGVkIGFzIHRoZSB0ZXh0IG9mIGFuICAgICovCi0vKiBlcnJvciBtZXNzYWdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogCi0gKiBDb21tYW5kIGhhbmRsZXIgZm9yIHRoZSBOT19BUkdTICJFeGFtcGxlIiBkaXJlY3RpdmUuICBBbGwgd2UgZG8gaXMgbWFyayB0aGUKLSAqIGNhbGwgaW4gdGhlIHRyYWNlIGxvZywgYW5kIGZsYWcgdGhlIGFwcGxpY2FiaWxpdHkgb2YgdGhlIGRpcmVjdGl2ZSB0byB0aGUKLSAqIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhhdCBsb2NhdGlvbidzIGNvbmZpZ3VyYXRpb24gcmVjb3JkLgotICovCi1zdGF0aWMgY29uc3QgY2hhciAqY21kX2V4YW1wbGUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKm1jb25maWcpCi17Ci0KLSAgICBleGNmZyAqY2ZnID0gKGV4Y2ZnICopIG1jb25maWc7Ci0KLSAgICAvKgotICAgICAqICJFeGFtcGxlIFd1eiBIZXJlIgotICAgICAqLwotICAgIGNmZy0+bG9jYWwgPSAxOwotICAgIHRyYWNlX2FkZChjbWQtPnNlcnZlciwgTlVMTCwgY2ZnLCAiY21kX2V4YW1wbGUoKSIpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTm93IHdlIGRlY2xhcmUgb3VyIGNvbnRlbnQgaGFuZGxlcnMsIHdoaWNoIGFyZSBpbnZva2VkIHdoZW4gdGhlIHNlcnZlciAgICovCi0vKiBlbmNvdW50ZXJzIGEgZG9jdW1lbnQgd2hpY2ggb3VyIG1vZHVsZSBpcyBzdXBwb3NlZCB0byBoYXZlIGEgY2hhbmNlIHRvICAgKi8KLS8qIHNlZS4gIChTZWUgbW9kX21pbWUncyBTZXRIYW5kbGVyIGFuZCBBZGRIYW5kbGVyIGRpcmVjdGl2ZXMsIGFuZCB0aGUgICAgICAqLwotLyogbW9kX2luZm8gYW5kIG1vZF9zdGF0dXMgZXhhbXBsZXMsIGZvciBtb3JlIGRldGFpbHMuKSAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFNpbmNlIGNvbnRlbnQgaGFuZGxlcnMgYXJlIGR1bXBpbmcgZGF0YSBkaXJlY3RseSBpbnRvIHRoZSBjb25uZXhpb24gICAgICAqLwotLyogKHVzaW5nIHRoZSByKigpIHJvdXRpbmVzLCBzdWNoIGFzIHJwdXRzKCkgYW5kIHJwcmludGYoKSkgd2l0aG91dCAgICAgICAgICovCi0vKiBpbnRlcnZlbnRpb24gYnkgb3RoZXIgcGFydHMgb2YgdGhlIHNlcnZlciwgdGhleSBuZWVkIHRvIG1ha2UgICAgICAgICAgICAgKi8KLS8qIHN1cmUgYW55IGFjY3VtdWxhdGVkIEhUVFAgaGVhZGVycyBhcmUgc2VudCBmaXJzdC4gIFRoaXMgaXMgZG9uZSBieSAgICAgICAqLwotLyogY2FsbGluZyBzZW5kX2h0dHBfaGVhZGVyKCkuICBPdGhlcndpc2UsIG5vIGhlYWRlciB3aWxsIGJlIHNlbnQgYXQgYWxsLCAgICovCi0vKiBhbmQgdGhlIG91dHB1dCBzZW50IHRvIHRoZSBjbGllbnQgd2lsbCBhY3R1YWxseSBiZSBIVFRQLXVuY29tcGxpYW50LiAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogCi0gKiBTYW1wbGUgY29udGVudCBoYW5kbGVyLiAgQWxsIHRoaXMgZG9lcyBpcyBkaXNwbGF5IHRoZSBjYWxsIGxpc3QgdGhhdCBoYXMKLSAqIGJlZW4gYnVpbHQgdXAgc28gZmFyLgotICoKLSAqIFRoZSByZXR1cm4gdmFsdWUgaW5zdHJ1Y3RzIHRoZSBjYWxsZXIgY29uY2VybmluZyB3aGF0IGhhcHBlbmVkIGFuZCB3aGF0IHRvCi0gKiBkbyBuZXh0OgotICogIE9LICgid2UgZGlkIG91ciB0aGluZyIpCi0gKiAgREVDTElORUQgKCJ0aGlzIGlzbid0IHNvbWV0aGluZyB3aXRoIHdoaWNoIHdlIHdhbnQgdG8gZ2V0IGludm9sdmVkIikKLSAqICBIVFRQX211bWJsZSAoImFuIGVycm9yIHN0YXR1cyBzaG91bGQgYmUgcmVwb3J0ZWQiKQotICovCi1zdGF0aWMgaW50IGV4YW1wbGVfaGFuZGxlcihyZXF1ZXN0X3JlYyAqcikKLXsKLQotICAgIGV4Y2ZnICpkY2ZnOwotCi0gICAgZGNmZyA9IG91cl9kY29uZmlnKHIpOwotICAgIHRyYWNlX2FkZChyLT5zZXJ2ZXIsIHIsIGRjZmcsICJleGFtcGxlX2hhbmRsZXIoKSIpOwotICAgIC8qCi0gICAgICogV2UncmUgYWJvdXQgdG8gc3RhcnQgc2VuZGluZyBjb250ZW50LCBzbyB3ZSBuZWVkIHRvIGZvcmNlIHRoZSBIVFRQCi0gICAgICogaGVhZGVycyB0byBiZSBzZW50IGF0IHRoaXMgcG9pbnQuICBPdGhlcndpc2UsIG5vIGhlYWRlcnMgd2lsbCBiZSBzZW50Ci0gICAgICogYXQgYWxsLiAgV2UgY2FuIHNldCBhbnkgd2UgbGlrZSBmaXJzdCwgb2YgY291cnNlLiAgKipOT1RFKiogSGVyZSdzCi0gICAgICogd2hlcmUgeW91IHNldCB0aGUgIkNvbnRlbnQtdHlwZSIgaGVhZGVyLCBhbmQgeW91IGRvIHNvIGJ5IHB1dHRpbmcgaXQgaW4KLSAgICAgKiByLT5jb250ZW50X3R5cGUsICpub3QqIHItPmhlYWRlcnNfb3V0KCJDb250ZW50LXR5cGUiKS4gIElmIHlvdSBkb24ndAotICAgICAqIHNldCBpdCwgaXQgd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCB0aGUgc2VydmVyJ3MgZGVmYXVsdCB0eXBlICh0eXBpY2FsbHkKLSAgICAgKiAidGV4dC9wbGFpbiIpLiAgWW91ICptdXN0KiBhbHNvIGVuc3VyZSB0aGF0IHItPmNvbnRlbnRfdHlwZSBpcyBsb3dlcgotICAgICAqIGNhc2UuCi0gICAgICoKLSAgICAgKiBXZSBhbHNvIG5lZWQgdG8gc3RhcnQgYSB0aW1lciBzbyB0aGUgc2VydmVyIGNhbiBrbm93IGlmIHRoZSBjb25uZXhpb24KLSAgICAgKiBpcyBicm9rZW4uCi0gICAgICovCi0gICAgci0+Y29udGVudF90eXBlID0gInRleHQvaHRtbCI7Ci0gICAgYXBfc29mdF90aW1lb3V0KCJzZW5kIGV4YW1wbGUgY2FsbCB0cmFjZSIsIHIpOwotICAgIGFwX3NlbmRfaHR0cF9oZWFkZXIocik7Ci0gICAgLyoKLSAgICAgKiBJZiB3ZSdyZSBvbmx5IHN1cHBvc2VkIHRvIHNlbmQgaGVhZGVyIGluZm9ybWF0aW9uIChIRUFEIHJlcXVlc3QpLCB3ZSdyZQotICAgICAqIGFscmVhZHkgdGhlcmUuCi0gICAgICovCi0gICAgaWYgKHItPmhlYWRlcl9vbmx5KSB7Ci0gICAgICAgIGFwX2tpbGxfdGltZW91dChyKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIC8qCi0gICAgICogTm93IHNlbmQgb3VyIGFjdHVhbCBvdXRwdXQuICBTaW5jZSB3ZSB0YWdnZWQgdGhpcyBhcyBiZWluZwotICAgICAqICJ0ZXh0L2h0bWwiLCB3ZSBuZWVkIHRvIGVtYmVkIGFueSBIVE1MLgotICAgICAqLwotICAgIGFwX3JwdXRzKERPQ1RZUEVfSFRNTF8zXzIsIHIpOwotICAgIGFwX3JwdXRzKCI8SFRNTD5cbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgPEhFQUQ+XG4iLCByKTsKLSAgICBhcF9ycHV0cygiICA8VElUTEU+bW9kX2V4YW1wbGUgTW9kdWxlIENvbnRlbnQtSGFuZGxlciBPdXRwdXRcbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgIDwvVElUTEU+XG4iLCByKTsKLSAgICBhcF9ycHV0cygiIDwvSEVBRD5cbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgPEJPRFk+XG4iLCByKTsKLSAgICBhcF9ycHV0cygiICA8SDE+PFNBTVA+bW9kX2V4YW1wbGU8L1NBTVA+IE1vZHVsZSBDb250ZW50LUhhbmRsZXIgT3V0cHV0XG4iLCByKTsKLSAgICBhcF9ycHV0cygiICA8L0gxPlxuIiwgcik7Ci0gICAgYXBfcnB1dHMoIiAgPFA+XG4iLCByKTsKLSAgICBhcF9ycHJpbnRmKHIsICIgIEFwYWNoZSBIVFRQIFNlcnZlciB2ZXJzaW9uOiBcIiVzXCJcbiIsCi0JICAgIGFwX2dldF9zZXJ2ZXJfdmVyc2lvbigpKTsKLSAgICBhcF9ycHV0cygiICA8QlI+XG4iLCByKTsKLSAgICBhcF9ycHJpbnRmKHIsICIgIFNlcnZlciBidWlsdDogXCIlc1wiXG4iLCBhcF9nZXRfc2VydmVyX2J1aWx0KCkpOwotICAgIGFwX3JwdXRzKCIgIDwvUD5cbiIsIHIpOzsKLSAgICBhcF9ycHV0cygiICA8UD5cbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgIFRoZSBmb3JtYXQgZm9yIHRoZSBjYWxsYmFjayB0cmFjZSBpczpcbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgIDwvUD5cbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgIDxETD5cbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgICA8RFQ+PEVNPm48L0VNPi48U0FNUD4mbHQ7cm91dGluZS1uYW1lJmd0OyIsIHIpOwotICAgIGFwX3JwdXRzKCIoJmx0O3JvdXRpbmUtZGF0YSZndDspPC9TQU1QPlxuIiwgcik7Ci0gICAgYXBfcnB1dHMoIiAgIDwvRFQ+XG4iLCByKTsKLSAgICBhcF9ycHV0cygiICAgPEREPjxTQU1QPlsmbHQ7YXBwbGllcy10byZndDtdPC9TQU1QPlxuIiwgcik7Ci0gICAgYXBfcnB1dHMoIiAgIDwvREQ+XG4iLCByKTsKLSAgICBhcF9ycHV0cygiICA8L0RMPlxuIiwgcik7Ci0gICAgYXBfcnB1dHMoIiAgPFA+XG4iLCByKTsKLSAgICBhcF9ycHV0cygiICBUaGUgPFNBTVA+Jmx0O3JvdXRpbmUtZGF0YSZndDs8L1NBTVA+IGlzIHN1cHBsaWVkIGJ5XG4iLCByKTsKLSAgICBhcF9ycHV0cygiICB0aGUgcm91dGluZSB3aGVuIGl0IHJlcXVlc3RzIHRoZSB0cmFjZSxcbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgIGFuZCB0aGUgPFNBTVA+Jmx0O2FwcGxpZXMtdG8mZ3Q7PC9TQU1QPiBpcyBleHRyYWN0ZWRcbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gcmVjb3JkIGF0IHRoZSB0aW1lIG9mIHRoZSB0cmFjZS5cbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgIDxTVFJPTkc+U1ZSKCk8L1NUUk9ORz4gaW5kaWNhdGVzIGEgc2VydmVyIGVudmlyb25tZW50XG4iLCByKTsKLSAgICBhcF9ycHV0cygiICAoYmxhbmsgbWVhbnMgdGhlIG1haW4gb3IgZGVmYXVsdCBzZXJ2ZXIsIG90aGVyd2lzZSBpdCdzXG4iLCByKTsKLSAgICBhcF9ycHV0cygiICB0aGUgbmFtZSBvZiB0aGUgVmlydHVhbEhvc3QpOyA8U1RST05HPkRJUigpPC9TVFJPTkc+XG4iLCByKTsKLSAgICBhcF9ycHV0cygiICBpbmRpY2F0ZXMgYSBsb2NhdGlvbiBpbiB0aGUgVVJMIG9yIGZpbGVzeXN0ZW1cbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgIG5hbWVzcGFjZS5cbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgIDwvUD5cbiIsIHIpOwotICAgIGFwX3JwcmludGYociwgIiAgPEgyPlN0YXRpYyBjYWxsYmFja3Mgc28gZmFyOjwvSDI+XG4gIDxPTD5cbiVzICA8L09MPlxuIiwKLSAgICAgICAgICAgIHRyYWNlKTsKLSAgICBhcF9ycHV0cygiICA8SDI+UmVxdWVzdC1zcGVjaWZpYyBjYWxsYmFja3Mgc28gZmFyOjwvSDI+XG4iLCByKTsKLSAgICBhcF9ycHJpbnRmKHIsICIgIDxPTD5cbiVzICA8L09MPlxuIiwgYXBfdGFibGVfZ2V0KHItPm5vdGVzLCBUUkFDRV9OT1RFKSk7Ci0gICAgYXBfcnB1dHMoIiAgPEgyPkVudmlyb25tZW50IGZvciA8RU0+dGhpczwvRU0+IGNhbGw6PC9IMj5cbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgIDxVTD5cbiIsIHIpOwotICAgIGFwX3JwcmludGYociwgIiAgIDxMST5BcHBsaWVzLXRvOiA8U0FNUD4lczwvU0FNUD5cbiAgIDwvTEk+XG4iLCBkY2ZnLT5sb2MpOwotICAgIGFwX3JwcmludGYociwgIiAgIDxMST5cIkV4YW1wbGVcIiBkaXJlY3RpdmUgZGVjbGFyZWQgaGVyZTogJXNcbiAgIDwvTEk+XG4iLAotICAgICAgICAgICAgKGRjZmctPmxvY2FsID8gIllFUyIgOiAiTk8iKSk7Ci0gICAgYXBfcnByaW50ZihyLCAiICAgPExJPlwiRXhhbXBsZVwiIGluaGVyaXRlZDogJXNcbiAgIDwvTEk+XG4iLAotICAgICAgICAgICAgKGRjZmctPmNvbmdlbml0YWwgPyAiWUVTIiA6ICJOTyIpKTsKLSAgICBhcF9ycHV0cygiICA8L1VMPlxuIiwgcik7Ci0gICAgYXBfcnB1dHMoIiA8L0JPRFk+XG4iLCByKTsKLSAgICBhcF9ycHV0cygiPC9IVE1MPlxuIiwgcik7Ci0gICAgLyoKLSAgICAgKiBXZSdyZSBhbGwgZG9uZSwgc28gY2FuY2VsIHRoZSB0aW1lb3V0IHdlIHNldC4gIFNpbmNlIHRoaXMgaXMgcHJvYmFibHkKLSAgICAgKiB0aGUgZW5kIG9mIHRoZSByZXF1ZXN0IHdlICpjb3VsZCogYXNzdW1lIHRoaXMgd291bGQgYmUgZG9uZSBkdXJpbmcKLSAgICAgKiBwb3N0LXByb2Nlc3NpbmcgLSBidXQgaXQncyBwb3NzaWJsZSB0aGF0IGFub3RoZXIgaGFuZGxlciBtaWdodCBiZQotICAgICAqIGNhbGxlZCBhbmQgaW5oZXJpdCBvdXIgb3V0c3RhbmRpbmcgdGltZXIuICBOb3QgZ29vZDsgdG8gZWFjaCBpdHMgb3duLgotICAgICAqLwotICAgIGFwX2tpbGxfdGltZW91dChyKTsKLSAgICAvKgotICAgICAqIFdlIGRpZCB3aGF0IHdlIHdhbnRlZCB0byBkbywgc28gdGVsbCB0aGUgcmVzdCBvZiB0aGUgc2VydmVyIHdlCi0gICAgICogc3VjY2VlZGVkLgotICAgICAqLwotICAgIHJldHVybiBPSzsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5vdyBsZXQncyBkZWNsYXJlIHJvdXRpbmVzIGZvciBlYWNoIG9mIHRoZSBjYWxsYmFjayBwaGFzZSBpbiBvcmRlci4gICAgICAqLwotLyogKFRoYXQncyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSdyZSBsaXN0ZWQgaW4gdGhlIGNhbGxiYWNrIGxpc3QsICpub3QgICAgICovCi0vKiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHNlcnZlciBjYWxscyB0aGVtISAgU2VlIHRoZSBjb21tYW5kX3JlYyAgICAgICAgICAgKi8KLS8qIGRlY2xhcmF0aW9uIG5lYXIgdGhlIGJvdHRvbSBvZiB0aGlzIGZpbGUuKSAgTm90ZSB0aGF0IHRoZXNlIG1heSBiZSAgICAgICAqLwotLyogY2FsbGVkIGZvciBzaXR1YXRpb25zIHRoYXQgZG9uJ3QgcmVsYXRlIHByaW1hcmlseSB0byBvdXIgZnVuY3Rpb24gLSBpbiAgICovCi0vKiBvdGhlciB3b3JkcywgdGhlIGZpeHVwIGhhbmRsZXIgc2hvdWxkbid0IGFzc3VtZSB0aGF0IHRoZSByZXF1ZXN0IGhhcyAgICAgKi8KLS8qIHRvIGRvIHdpdGggImV4YW1wbGUiIHN0dWZmLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBXaXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIGNvbnRlbnQgaGFuZGxlciwgYWxsIG9mIG91ciByb3V0aW5lcyB3aWxsIGJlICAgKi8KLS8qIGNhbGxlZCBmb3IgZWFjaCByZXF1ZXN0LCB1bmxlc3MgYW4gZWFybGllciBoYW5kbGVyIGZyb20gYW5vdGhlciBtb2R1bGUgICAqLwotLyogYWJvcnRlZCB0aGUgc2VxdWVuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEhhbmRsZXJzIHRoYXQgYXJlIGRlY2xhcmVkIGFzICJpbnQiIGNhbiByZXR1cm4gdGhlIGZvbGxvd2luZzogICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT0sgICAgICAgICAgSGFuZGxlciBhY2NlcHRlZCB0aGUgcmVxdWVzdCBhbmQgZGlkIGl0cyB0aGluZyB3aXRoIGl0LiAgICAgKi8KLS8qICBERUNMSU5FRCAgICBIYW5kbGVyIHRvb2sgbm8gYWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEhUVFBfbXVtYmxlIEhhbmRsZXIgbG9va2VkIGF0IHJlcXVlc3QgYW5kIGZvdW5kIGl0IHdhbnRpbmcuICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFdoYXQgdGhlIHNlcnZlciBkb2VzIGFmdGVyIGNhbGxpbmcgYSBtb2R1bGUgaGFuZGxlciBkZXBlbmRzIHVwb24gdGhlICAgICAqLwotLyogaGFuZGxlcidzIHJldHVybiB2YWx1ZS4gIEluIGFsbCBjYXNlcywgaWYgdGhlIGhhbmRsZXIgcmV0dXJucyAgICAgICAgICAgICovCi0vKiBERUNMSU5FRCwgdGhlIHNlcnZlciB3aWxsIGNvbnRpbnVlIHRvIHRoZSBuZXh0IG1vZHVsZSB3aXRoIGFuIGhhbmRsZXIgICAgKi8KLS8qIGZvciB0aGUgY3VycmVudCBwaGFzZS4gIEhvd2V2ZXIsIGlmIHRoZSBoYW5kbGVyIHJldHVybiBhIG5vbi1PSywgICAgICAgICAqLwotLyogbm9uLURFQ0xJTkVEIHN0YXR1cywgdGhlIHNlcnZlciBhYm9ydHMgdGhlIHJlcXVlc3QgcmlnaHQgdGhlcmUuICBJZiAgICAgICovCi0vKiB0aGUgaGFuZGxlciByZXR1cm5zIE9LLCB0aGUgc2VydmVyJ3MgbmV4dCBhY3Rpb24gaXMgcGhhc2Utc3BlY2lmaWM7ICAgICAgKi8KLS8qIHNlZSB0aGUgaW5kaXZpZHVhbCBoYW5kbGVyIGNvbW1lbnRzIGJlbG93IGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIAotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIHNlcnZlciBpbml0aWFsaXNhdGlvbi4gIEFueSBpbmZvcm1hdGlvbgotICogdGhhdCBuZWVkcyB0byBiZSByZWNvcmRlZCBtdXN0IGJlIGluIHN0YXRpYyBjZWxscywgc2luY2UgdGhlcmUncyBubwotICogY29uZmlndXJhdGlvbiByZWNvcmQuCi0gKgotICogVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlLgotICovCi0KLS8qCi0gKiBBbGwgb3VyIG1vZHVsZS1pbml0aWFsaXNlciBkb2VzIGlzIGFkZCBpdHMgdHJhY2UgdG8gdGhlIGxvZy4KLSAqLwotc3RhdGljIHZvaWQgZXhhbXBsZV9pbml0KHNlcnZlcl9yZWMgKnMsIHBvb2wgKnApCi17Ci0KLSAgICBjaGFyICpub3RlOwotICAgIGNoYXIgKnNuYW1lID0gcy0+c2VydmVyX2hvc3RuYW1lOwotCi0gICAgLyoKLSAgICAgKiBTZXQgdXAgYW55IG1vZHVsZSBjZWxscyB0aGF0IG91Z2h0IHRvIGJlIGluaXRpYWxpc2VkLgotICAgICAqLwotICAgIHNldHVwX21vZHVsZV9jZWxscygpOwotICAgIC8qCi0gICAgICogVGhlIGFyYml0cmFyeSB0ZXh0IHdlIGFkZCB0byBvdXIgdHJhY2UgZW50cnkgaW5kaWNhdGVzIGZvciB3aGljaCBzZXJ2ZXIKLSAgICAgKiB3ZSdyZSBiZWluZyBjYWxsZWQuCi0gICAgICovCi0gICAgc25hbWUgPSAoc25hbWUgIT0gTlVMTCkgPyBzbmFtZSA6ICIiOwotICAgIG5vdGUgPSBhcF9wc3RyY2F0KHAsICJleGFtcGxlX2luaXQoIiwgc25hbWUsICIpIiwgTlVMTCk7Ci0gICAgdHJhY2VfYWRkKHMsIE5VTEwsIE5VTEwsIG5vdGUpOwotfQotCi0vKiAKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBzZXJ2ZXIgaW5pdGlhbGlzYXRpb24gd2hlbiBhbiBoZWF2eS13ZWlnaHQKLSAqIHByb2Nlc3MgKHN1Y2ggYXMgYSBjaGlsZCkgaXMgYmVpbmcgaW5pdGlhbGlzZWQuICBBcyB3aXRoIHRoZQotICogbW9kdWxlLWluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uLCBhbnkgaW5mb3JtYXRpb24gdGhhdCBuZWVkcyB0byBiZSByZWNvcmRlZAotICogbXVzdCBiZSBpbiBzdGF0aWMgY2VsbHMsIHNpbmNlIHRoZXJlJ3Mgbm8gY29uZmlndXJhdGlvbiByZWNvcmQuCi0gKgotICogVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlLgotICovCi0KLS8qCi0gKiBBbGwgb3VyIHByb2Nlc3MtaW5pdGlhbGlzZXIgZG9lcyBpcyBhZGQgaXRzIHRyYWNlIHRvIHRoZSBsb2cuCi0gKi8KLXN0YXRpYyB2b2lkIGV4YW1wbGVfY2hpbGRfaW5pdChzZXJ2ZXJfcmVjICpzLCBwb29sICpwKQotewotCi0gICAgY2hhciAqbm90ZTsKLSAgICBjaGFyICpzbmFtZSA9IHMtPnNlcnZlcl9ob3N0bmFtZTsKLQotICAgIC8qCi0gICAgICogU2V0IHVwIGFueSBtb2R1bGUgY2VsbHMgdGhhdCBvdWdodCB0byBiZSBpbml0aWFsaXNlZC4KLSAgICAgKi8KLSAgICBzZXR1cF9tb2R1bGVfY2VsbHMoKTsKLSAgICAvKgotICAgICAqIFRoZSBhcmJpdHJhcnkgdGV4dCB3ZSBhZGQgdG8gb3VyIHRyYWNlIGVudHJ5IGluZGljYXRlcyBmb3Igd2hpY2ggc2VydmVyCi0gICAgICogd2UncmUgYmVpbmcgY2FsbGVkLgotICAgICAqLwotICAgIHNuYW1lID0gKHNuYW1lICE9IE5VTEwpID8gc25hbWUgOiAiIjsKLSAgICBub3RlID0gYXBfcHN0cmNhdChwLCAiZXhhbXBsZV9jaGlsZF9pbml0KCIsIHNuYW1lLCAiKSIsIE5VTEwpOwotICAgIHRyYWNlX2FkZChzLCBOVUxMLCBOVUxMLCBub3RlKTsKLX0KLQotLyogCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIGhlYXZ5LXdlaWdodCBwcm9jZXNzIChzdWNoIGFzIGEgY2hpbGQpIGlzCi0gKiBiZWluZyBydW4gZG93biBvciBkZXN0cm95ZWQuICBBcyB3aXRoIHRoZSBjaGlsZC1pbml0aWFsaXNhdGlvbiBmdW5jdGlvbiwKLSAqIGFueSBpbmZvcm1hdGlvbiB0aGF0IG5lZWRzIHRvIGJlIHJlY29yZGVkIG11c3QgYmUgaW4gc3RhdGljIGNlbGxzLCBzaW5jZQotICogdGhlcmUncyBubyBjb25maWd1cmF0aW9uIHJlY29yZC4KLSAqCi0gKiBUaGVyZSBpcyBubyByZXR1cm4gdmFsdWUuCi0gKi8KLQotLyoKLSAqIEFsbCBvdXIgcHJvY2Vzcy1kZWF0aCByb3V0aW5lIGRvZXMgaXMgYWRkIGl0cyB0cmFjZSB0byB0aGUgbG9nLgotICovCi1zdGF0aWMgdm9pZCBleGFtcGxlX2NoaWxkX2V4aXQoc2VydmVyX3JlYyAqcywgcG9vbCAqcCkKLXsKLQotICAgIGNoYXIgKm5vdGU7Ci0gICAgY2hhciAqc25hbWUgPSBzLT5zZXJ2ZXJfaG9zdG5hbWU7Ci0KLSAgICAvKgotICAgICAqIFRoZSBhcmJpdHJhcnkgdGV4dCB3ZSBhZGQgdG8gb3VyIHRyYWNlIGVudHJ5IGluZGljYXRlcyBmb3Igd2hpY2ggc2VydmVyCi0gICAgICogd2UncmUgYmVpbmcgY2FsbGVkLgotICAgICAqLwotICAgIHNuYW1lID0gKHNuYW1lICE9IE5VTEwpID8gc25hbWUgOiAiIjsKLSAgICBub3RlID0gYXBfcHN0cmNhdChwLCAiZXhhbXBsZV9jaGlsZF9leGl0KCIsIHNuYW1lLCAiKSIsIE5VTEwpOwotICAgIHRyYWNlX2FkZChzLCBOVUxMLCBOVUxMLCBub3RlKTsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgdG8gY3JlYXRlIHVwIGEgcGVyLWRpcmVjdG9yeSBjb25maWd1cmF0aW9uCi0gKiByZWNvcmQuICBUaGlzIHdpbGwgYmUgY2FsbGVkIGZvciB0aGUgImRlZmF1bHQiIHNlcnZlciBlbnZpcm9ubWVudCwgYW5kIGZvcgotICogZWFjaCBkaXJlY3RvcnkgZm9yIHdoaWNoIHRoZSBwYXJzZXIgZmluZHMgYW55IG9mIG91ciBkaXJlY3RpdmVzIGFwcGxpY2FibGUuCi0gKiBJZiBhIGRpcmVjdG9yeSBkb2Vzbid0IGhhdmUgYW55IG9mIG91ciBkaXJlY3RpdmVzIGludm9sdmVkIChpLmUuLCB0aGV5Ci0gKiBhcmVuJ3QgaW4gdGhlIC5odGFjY2VzcyBmaWxlLCBvciBhIDxMb2NhdGlvbj4sIDxEaXJlY3Rvcnk+LCBvciByZWxhdGVkCi0gKiBibG9jayksIHRoaXMgcm91dGluZSB3aWxsICpub3QqIGJlIGNhbGxlZCAtIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUKLSAqIGNsb3Nlc3QgYW5jZXN0b3IgaXMgdXNlZC4KLSAqCi0gKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcG9pbnRlciB0byB0aGUgY3JlYXRlZCBtb2R1bGUtc3BlY2lmaWMKLSAqIHN0cnVjdHVyZS4KLSAqLwotc3RhdGljIHZvaWQgKmV4YW1wbGVfY3JlYXRlX2Rpcl9jb25maWcocG9vbCAqcCwgY2hhciAqZGlyc3BlYykKLXsKLQotICAgIGV4Y2ZnICpjZmc7Ci0gICAgY2hhciAqZG5hbWUgPSBkaXJzcGVjOwotCi0gICAgLyoKLSAgICAgKiBBbGxvY2F0ZSB0aGUgc3BhY2UgZm9yIG91ciByZWNvcmQgZnJvbSB0aGUgcG9vbCBzdXBwbGllZC4KLSAgICAgKi8KLSAgICBjZmcgPSAoZXhjZmcgKikgYXBfcGNhbGxvYyhwLCBzaXplb2YoZXhjZmcpKTsKLSAgICAvKgotICAgICAqIE5vdyBmaWxsIGluIHRoZSBkZWZhdWx0cy4gIElmIHRoZXJlIGFyZSBhbnkgYHBhcmVudCcgY29uZmlndXJhdGlvbgotICAgICAqIHJlY29yZHMsIHRoZXknbGwgZ2V0IG1lcmdlZCBhcyBwYXJ0IG9mIGEgc2VwYXJhdGUgY2FsbGJhY2suCi0gICAgICovCi0gICAgY2ZnLT5sb2NhbCA9IDA7Ci0gICAgY2ZnLT5jb25nZW5pdGFsID0gMDsKLSAgICBjZmctPmNtb2RlID0gQ09ORklHX01PREVfRElSRUNUT1JZOwotICAgIC8qCi0gICAgICogRmluYWxseSwgYWRkIG91ciB0cmFjZSB0byB0aGUgY2FsbGJhY2sgbGlzdC4KLSAgICAgKi8KLSAgICBkbmFtZSA9IChkbmFtZSAhPSBOVUxMKSA/IGRuYW1lIDogIiI7Ci0gICAgY2ZnLT5sb2MgPSBhcF9wc3RyY2F0KHAsICJESVIoIiwgZG5hbWUsICIpIiwgTlVMTCk7Ci0gICAgdHJhY2VfYWRkKE5VTEwsIE5VTEwsIGNmZywgImV4YW1wbGVfY3JlYXRlX2Rpcl9jb25maWcoKSIpOwotICAgIHJldHVybiAodm9pZCAqKSBjZmc7Ci19Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIHRvIG1lcmdlIHR3byBwZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24KLSAqIHJlY29yZHMuICBUaGlzIGlzIHR5cGljYWxseSBkb25lIHRvIGNvcGUgd2l0aCB0aGluZ3MgbGlrZSAuaHRhY2Nlc3MgZmlsZXMKLSAqIG9yIDxMb2NhdGlvbj4gZGlyZWN0aXZlcyBmb3IgZGlyZWN0b3JpZXMgdGhhdCBhcmUgYmVuZWF0aCBvbmUgZm9yIHdoaWNoIGEKLSAqIGNvbmZpZ3VyYXRpb24gcmVjb3JkIHdhcyBhbHJlYWR5IGNyZWF0ZWQuICBUaGUgcm91dGluZSBoYXMgdGhlCi0gKiByZXNwb25zaWJpbGl0eSBvZiBjcmVhdGluZyBhIG5ldyByZWNvcmQgYW5kIG1lcmdpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZQotICogb3RoZXIgdHdvIGludG8gaXQgYXBwcm9wcmlhdGVseS4gIElmIHRoZSBtb2R1bGUgZG9lc24ndCBkZWNsYXJlIGEgbWVyZ2UKLSAqIHJvdXRpbmUsIHRoZSByZWNvcmQgZm9yIHRoZSBjbG9zZXN0IGFuY2VzdG9yIGxvY2F0aW9uICh0aGF0IGhhcyBvbmUpIGlzCi0gKiB1c2VkIGV4Y2x1c2l2ZWx5LgotICoKLSAqIFRoZSByb3V0aW5lIE1VU1QgTk9UIG1vZGlmeSBhbnkgb2YgaXRzIGFyZ3VtZW50cyEKLSAqCi0gKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcG9pbnRlciB0byB0aGUgY3JlYXRlZCBtb2R1bGUtc3BlY2lmaWMgc3RydWN0dXJlCi0gKiBjb250YWluaW5nIHRoZSBtZXJnZWQgdmFsdWVzLgotICovCi1zdGF0aWMgdm9pZCAqZXhhbXBsZV9tZXJnZV9kaXJfY29uZmlnKHBvb2wgKnAsIHZvaWQgKnBhcmVudF9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpuZXdsb2NfY29uZikKLXsKLQotICAgIGV4Y2ZnICptZXJnZWRfY29uZmlnID0gKGV4Y2ZnICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKGV4Y2ZnKSk7Ci0gICAgZXhjZmcgKnBjb25mID0gKGV4Y2ZnICopIHBhcmVudF9jb25mOwotICAgIGV4Y2ZnICpuY29uZiA9IChleGNmZyAqKSBuZXdsb2NfY29uZjsKLSAgICBjaGFyICpub3RlOwotCi0gICAgLyoKLSAgICAgKiBTb21lIHRoaW5ncyBnZXQgY29waWVkIGRpcmVjdGx5IGZyb20gdGhlIG1vcmUtc3BlY2lmaWMgcmVjb3JkLCByYXRoZXIKLSAgICAgKiB0aGFuIGdldHRpbmcgbWVyZ2VkLgotICAgICAqLwotICAgIG1lcmdlZF9jb25maWctPmxvY2FsID0gbmNvbmYtPmxvY2FsOwotICAgIG1lcmdlZF9jb25maWctPmxvYyA9IGFwX3BzdHJkdXAocCwgbmNvbmYtPmxvYyk7Ci0gICAgLyoKLSAgICAgKiBPdGhlcnMsIGxpa2UgdGhlIHNldHRpbmcgb2YgdGhlIGBjb25nZW5pdGFsJyBmbGFnLCBnZXQgT1JlZCBpbi4gIFRoZQotICAgICAqIHNldHRpbmcgb2YgdGhhdCBwYXJ0aWN1bGFyIGZsYWcsIGZvciBpbnN0YW5jZSwgaXMgVFJVRSBpZiBpdCB3YXMgZXZlcgotICAgICAqIHRydWUgYW55d2hlcmUgaW4gdGhlIHVwc3RyZWFtIGNvbmZpZ3VyYXRpb24uCi0gICAgICovCi0gICAgbWVyZ2VkX2NvbmZpZy0+Y29uZ2VuaXRhbCA9IChwY29uZi0+Y29uZ2VuaXRhbCB8IHBjb25mLT5sb2NhbCk7Ci0gICAgLyoKLSAgICAgKiBJZiB3ZSdyZSBtZXJnaW5nIHJlY29yZHMgZm9yIHR3byBkaWZmZXJlbnQgdHlwZXMgb2YgZW52aXJvbm1lbnQgKHNlcnZlcgotICAgICAqIGFuZCBkaXJlY3RvcnkpLCBtYXJrIHRoZSBuZXcgcmVjb3JkIGFwcHJvcHJpYXRlbHkuICBPdGhlcndpc2UsIGluaGVyaXQKLSAgICAgKiB0aGUgY3VycmVudCB2YWx1ZS4KLSAgICAgKi8KLSAgICBtZXJnZWRfY29uZmlnLT5jbW9kZSA9Ci0gICAgICAgIChwY29uZi0+Y21vZGUgPT0gbmNvbmYtPmNtb2RlKSA/IHBjb25mLT5jbW9kZSA6IENPTkZJR19NT0RFX0NPTUJPOwotICAgIC8qCi0gICAgICogTm93IGp1c3QgcmVjb3JkIG91ciBiZWluZyBjYWxsZWQgaW4gdGhlIHRyYWNlIGxpc3QuICBJbmNsdWRlIHRoZQotICAgICAqIGxvY2F0aW9ucyB3ZSB3ZXJlIGFza2VkIHRvIG1lcmdlLgotICAgICAqLwotICAgIG5vdGUgPSBhcF9wc3RyY2F0KHAsICJleGFtcGxlX21lcmdlX2Rpcl9jb25maWcoXCIiLCBwY29uZi0+bG9jLCAiXCIsXCIiLAotICAgICAgICAgICAgICAgICAgIG5jb25mLT5sb2MsICJcIikiLCBOVUxMKTsKLSAgICB0cmFjZV9hZGQoTlVMTCwgTlVMTCwgbWVyZ2VkX2NvbmZpZywgbm90ZSk7Ci0gICAgcmV0dXJuICh2b2lkICopIG1lcmdlZF9jb25maWc7Ci19Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIHRvIGNyZWF0ZSBhIHBlci1zZXJ2ZXIgY29uZmlndXJhdGlvbgotICogcmVjb3JkLiAgSXQgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGZvciB0aGUgImRlZmF1bHQiIHNlcnZlci4KLSAqCi0gKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcG9pbnRlciB0byB0aGUgY3JlYXRlZCBtb2R1bGUtc3BlY2lmaWMKLSAqIHN0cnVjdHVyZS4KLSAqLwotc3RhdGljIHZvaWQgKmV4YW1wbGVfY3JlYXRlX3NlcnZlcl9jb25maWcocG9vbCAqcCwgc2VydmVyX3JlYyAqcykKLXsKLQotICAgIGV4Y2ZnICpjZmc7Ci0gICAgY2hhciAqc25hbWUgPSBzLT5zZXJ2ZXJfaG9zdG5hbWU7Ci0KLSAgICAvKgotICAgICAqIEFzIHdpdGggdGhlIGV4YW1wbGVfY3JlYXRlX2Rpcl9jb25maWcoKSByZW91dGluZSwgd2UgYWxsb2NhdGUgYW5kIGZpbGwKLSAgICAgKiBpbiBhbiBlbXB0eSByZWNvcmQuCi0gICAgICovCi0gICAgY2ZnID0gKGV4Y2ZnICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKGV4Y2ZnKSk7Ci0gICAgY2ZnLT5sb2NhbCA9IDA7Ci0gICAgY2ZnLT5jb25nZW5pdGFsID0gMDsKLSAgICBjZmctPmNtb2RlID0gQ09ORklHX01PREVfU0VSVkVSOwotICAgIC8qCi0gICAgICogTm90ZSB0aGF0IHdlIHdlcmUgY2FsbGVkIGluIHRoZSB0cmFjZSBsaXN0LgotICAgICAqLwotICAgIHNuYW1lID0gKHNuYW1lICE9IE5VTEwpID8gc25hbWUgOiAiIjsKLSAgICBjZmctPmxvYyA9IGFwX3BzdHJjYXQocCwgIlNWUigiLCBzbmFtZSwgIikiLCBOVUxMKTsKLSAgICB0cmFjZV9hZGQocywgTlVMTCwgY2ZnLCAiZXhhbXBsZV9jcmVhdGVfc2VydmVyX2NvbmZpZygpIik7Ci0gICAgcmV0dXJuICh2b2lkICopIGNmZzsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgdG8gbWVyZ2UgdHdvIHBlci1zZXJ2ZXIgY29uZmlndXJhdGlvbgotICogcmVjb3Jkcy4gIFRoaXMgaXMgdHlwaWNhbGx5IGRvbmUgdG8gY29wZSB3aXRoIHRoaW5ncyBsaWtlIHZpcnR1YWwgaG9zdHMgYW5kCi0gKiB0aGUgZGVmYXVsdCBzZXJ2ZXIgY29uZmlndXJhdGlvbiAgVGhlIHJvdXRpbmUgaGFzIHRoZSByZXNwb25zaWJpbGl0eSBvZgotICogY3JlYXRpbmcgYSBuZXcgcmVjb3JkIGFuZCBtZXJnaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgb3RoZXIgdHdvIGludG8gaXQKLSAqIGFwcHJvcHJpYXRlbHkuICBJZiB0aGUgbW9kdWxlIGRvZXNuJ3QgZGVjbGFyZSBhIG1lcmdlIHJvdXRpbmUsIHRoZSBtb3JlCi0gKiBzcGVjaWZpYyBleGlzdGluZyByZWNvcmQgaXMgdXNlZCBleGNsdXNpdmVseS4KLSAqCi0gKiBUaGUgcm91dGluZSBNVVNUIE5PVCBtb2RpZnkgYW55IG9mIGl0cyBhcmd1bWVudHMhCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgbW9kdWxlLXNwZWNpZmljIHN0cnVjdHVyZQotICogY29udGFpbmluZyB0aGUgbWVyZ2VkIHZhbHVlcy4KLSAqLwotc3RhdGljIHZvaWQgKmV4YW1wbGVfbWVyZ2Vfc2VydmVyX2NvbmZpZyhwb29sICpwLCB2b2lkICpzZXJ2ZXIxX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNlcnZlcjJfY29uZikKLXsKLQotICAgIGV4Y2ZnICptZXJnZWRfY29uZmlnID0gKGV4Y2ZnICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKGV4Y2ZnKSk7Ci0gICAgZXhjZmcgKnMxY29uZiA9IChleGNmZyAqKSBzZXJ2ZXIxX2NvbmY7Ci0gICAgZXhjZmcgKnMyY29uZiA9IChleGNmZyAqKSBzZXJ2ZXIyX2NvbmY7Ci0gICAgY2hhciAqbm90ZTsKLQotICAgIC8qCi0gICAgICogT3VyIGluaGVyaXRhbmNlIHJ1bGVzIGFyZSBvdXIgb3duLCBhbmQgcGFydCBvZiBvdXIgbW9kdWxlJ3Mgc2VtYW50aWNzLgotICAgICAqIEJhc2ljYWxseSwganVzdCBub3RlIHdoZW5jZSB3ZSBjYW1lLgotICAgICAqLwotICAgIG1lcmdlZF9jb25maWctPmNtb2RlID0KLSAgICAgICAgKHMxY29uZi0+Y21vZGUgPT0gczJjb25mLT5jbW9kZSkgPyBzMWNvbmYtPmNtb2RlIDogQ09ORklHX01PREVfQ09NQk87Ci0gICAgbWVyZ2VkX2NvbmZpZy0+bG9jYWwgPSBzMmNvbmYtPmxvY2FsOwotICAgIG1lcmdlZF9jb25maWctPmNvbmdlbml0YWwgPSAoczFjb25mLT5jb25nZW5pdGFsIHwgczFjb25mLT5sb2NhbCk7Ci0gICAgbWVyZ2VkX2NvbmZpZy0+bG9jID0gYXBfcHN0cmR1cChwLCBzMmNvbmYtPmxvYyk7Ci0gICAgLyoKLSAgICAgKiBUcmFjZSBvdXIgY2FsbCwgaW5jbHVkaW5nIHdoYXQgd2Ugd2VyZSBhc2tlZCB0byBtZXJnZS4KLSAgICAgKi8KLSAgICBub3RlID0gYXBfcHN0cmNhdChwLCAiZXhhbXBsZV9tZXJnZV9zZXJ2ZXJfY29uZmlnKFwiIiwgczFjb25mLT5sb2MsICJcIixcIiIsCi0gICAgICAgICAgICAgICAgICAgczJjb25mLT5sb2MsICJcIikiLCBOVUxMKTsKLSAgICB0cmFjZV9hZGQoTlVMTCwgTlVMTCwgbWVyZ2VkX2NvbmZpZywgbm90ZSk7Ci0gICAgcmV0dXJuICh2b2lkICopIG1lcmdlZF9jb25maWc7Ci19Ci0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHJlYWQgYnV0IGJlZm9yZSBhbnkgb3RoZXIKLSAqIHBoYXNlcyBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgVGhpcyBhbGxvd3MgdXMgdG8gbWFrZSBkZWNpc2lvbnMgYmFzZWQgdXBvbgotICogdGhlIGlucHV0IGhlYWRlciBmaWVsZHMuCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBpcyBPSywgREVDTElORUQsIG9yIEhUVFBfbXVtYmxlLiAgSWYgd2UgcmV0dXJuIE9LLCBubwotICogZnVydGhlciBtb2R1bGVzIGFyZSBjYWxsZWQgZm9yIHRoaXMgcGhhc2UuCi0gKi8KLXN0YXRpYyBpbnQgZXhhbXBsZV9wb3N0X3JlYWRfcmVxdWVzdChyZXF1ZXN0X3JlYyAqcikKLXsKLQotICAgIGV4Y2ZnICpjZmc7Ci0KLSAgICBjZmcgPSBvdXJfZGNvbmZpZyhyKTsKLSAgICAvKgotICAgICAqIFdlIGRvbid0IGFjdHVhbGx5ICpkbyogYW55dGhpbmcgaGVyZSwgZXhjZXB0IG5vdGUgdGhlIGZhY3QgdGhhdCB3ZSB3ZXJlCi0gICAgICogY2FsbGVkLgotICAgICAqLwotICAgIHRyYWNlX2FkZChyLT5zZXJ2ZXIsIHIsIGNmZywgImV4YW1wbGVfcG9zdF9yZWFkX3JlcXVlc3QoKSIpOwotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBnaXZlcyBvdXIgbW9kdWxlIGFuIG9wcG9ydHVuaXR5IHRvIHRyYW5zbGF0ZSB0aGUgVVJJIGludG8gYW4KLSAqIGFjdHVhbCBmaWxlbmFtZS4gIElmIHdlIGRvbid0IGRvIGFueXRoaW5nIHNwZWNpYWwsIHRoZSBzZXJ2ZXIncyBkZWZhdWx0Ci0gKiBydWxlcyAoQWxpYXMgZGlyZWN0aXZlcyBhbmQgdGhlIGxpa2UpIHdpbGwgY29udGludWUgdG8gYmUgZm9sbG93ZWQuCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBpcyBPSywgREVDTElORUQsIG9yIEhUVFBfbXVtYmxlLiAgSWYgd2UgcmV0dXJuIE9LLCBubwotICogZnVydGhlciBtb2R1bGVzIGFyZSBjYWxsZWQgZm9yIHRoaXMgcGhhc2UuCi0gKi8KLXN0YXRpYyBpbnQgZXhhbXBsZV90cmFuc2xhdGVfaGFuZGxlcihyZXF1ZXN0X3JlYyAqcikKLXsKLQotICAgIGV4Y2ZnICpjZmc7Ci0KLSAgICBjZmcgPSBvdXJfZGNvbmZpZyhyKTsKLSAgICAvKgotICAgICAqIFdlIGRvbid0IGFjdHVhbGx5ICpkbyogYW55dGhpbmcgaGVyZSwgZXhjZXB0IG5vdGUgdGhlIGZhY3QgdGhhdCB3ZSB3ZXJlCi0gICAgICogY2FsbGVkLgotICAgICAqLwotICAgIHRyYWNlX2FkZChyLT5zZXJ2ZXIsIHIsIGNmZywgImV4YW1wbGVfdHJhbnNsYXRlX2hhbmRsZXIoKSIpOwotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gY2hlY2sgdGhlIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIHNlbnQgd2l0aAotICogdGhlIHJlcXVlc3QgKHN1Y2ggYXMgbG9va2luZyB1cCB0aGUgdXNlciBpbiBhIGRhdGFiYXNlIGFuZCB2ZXJpZnlpbmcgdGhhdAotICogdGhlIFtlbmNyeXB0ZWRdIHBhc3N3b3JkIHNlbnQgbWF0Y2hlcyB0aGUgb25lIGluIHRoZSBkYXRhYmFzZSkuCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBpcyBPSywgREVDTElORUQsIG9yIHNvbWUgSFRUUF9tdW1ibGUgZXJyb3IgKHR5cGljYWxseQotICogSFRUUF9VTkFVVEhPUklaRUQpLiAgSWYgd2UgcmV0dXJuIE9LLCBubyBvdGhlciBtb2R1bGVzIGFyZSBnaXZlbiBhIGNoYW5jZQotICogYXQgdGhlIHJlcXVlc3QgZHVyaW5nIHRoaXMgcGhhc2UuCi0gKi8KLXN0YXRpYyBpbnQgZXhhbXBsZV9jaGVja191c2VyX2lkKHJlcXVlc3RfcmVjICpyKQotewotCi0gICAgZXhjZmcgKmNmZzsKLQotICAgIGNmZyA9IG91cl9kY29uZmlnKHIpOwotICAgIC8qCi0gICAgICogRG9uJ3QgZG8gYW55dGhpbmcgZXhjZXB0IGxvZyB0aGUgY2FsbC4KLSAgICAgKi8KLSAgICB0cmFjZV9hZGQoci0+c2VydmVyLCByLCBjZmcsICJleGFtcGxlX2NoZWNrX3VzZXJfaWQoKSIpOwotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gY2hlY2sgdG8gc2VlIGlmIHRoZSByZXNvdXJjZSBiZWluZyByZXF1ZXN0ZWQKLSAqIHJlcXVpcmVzIGF1dGhvcmlzYXRpb24uCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBpcyBPSywgREVDTElORUQsIG9yIEhUVFBfbXVtYmxlLiAgSWYgd2UgcmV0dXJuIE9LLCBubwotICogb3RoZXIgbW9kdWxlcyBhcmUgY2FsbGVkIGR1cmluZyB0aGlzIHBoYXNlLgotICoKLSAqIElmICphbGwqIG1vZHVsZXMgcmV0dXJuIERFQ0xJTkVELCB0aGUgcmVxdWVzdCBpcyBhYm9ydGVkIHdpdGggYSBzZXJ2ZXIKLSAqIGVycm9yLgotICovCi1zdGF0aWMgaW50IGV4YW1wbGVfYXV0aF9jaGVja2VyKHJlcXVlc3RfcmVjICpyKQotewotCi0gICAgZXhjZmcgKmNmZzsKLQotICAgIGNmZyA9IG91cl9kY29uZmlnKHIpOwotICAgIC8qCi0gICAgICogTG9nIHRoZSBjYWxsIGFuZCByZXR1cm4gT0ssIG9yIGFjY2VzcyB3aWxsIGJlIGRlbmllZCAoZXZlbiB0aG91Z2ggd2UKLSAgICAgKiBkaWRuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcpLgotICAgICAqLwotICAgIHRyYWNlX2FkZChyLT5zZXJ2ZXIsIHIsIGNmZywgImV4YW1wbGVfYXV0aF9jaGVja2VyKCkiKTsKLSAgICByZXR1cm4gREVDTElORUQ7Ci19Ci0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGNoZWNrIGZvciBhbnkgbW9kdWxlLXNwZWNpZmljIHJlc3RyaWN0aW9ucyBwbGFjZWQKLSAqIHVwb24gdGhlIHJlcXVlc3RlZCByZXNvdXJjZS4gIChTZWUgdGhlIG1vZF9hY2Nlc3MgbW9kdWxlIGZvciBhbiBleGFtcGxlLikKLSAqCi0gKiBUaGUgcmV0dXJuIHZhbHVlIGlzIE9LLCBERUNMSU5FRCwgb3IgSFRUUF9tdW1ibGUuICBBbGwgbW9kdWxlcyB3aXRoIGFuCi0gKiBoYW5kbGVyIGZvciB0aGlzIHBoYXNlIGFyZSBjYWxsZWQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZWlyIHByZWRlY2Vzc29ycwotICogcmV0dXJuIE9LIG9yIERFQ0xJTkVELiAgVGhlIGZpcnN0IG9uZSB0byByZXR1cm4gYW55IG90aGVyIHN0YXR1cywgaG93ZXZlciwKLSAqIHdpbGwgYWJvcnQgdGhlIHNlcXVlbmNlIChhbmQgdGhlIHJlcXVlc3QpIGFzIHVzdWFsLgotICovCi1zdGF0aWMgaW50IGV4YW1wbGVfYWNjZXNzX2NoZWNrZXIocmVxdWVzdF9yZWMgKnIpCi17Ci0KLSAgICBleGNmZyAqY2ZnOwotCi0gICAgY2ZnID0gb3VyX2Rjb25maWcocik7Ci0gICAgdHJhY2VfYWRkKHItPnNlcnZlciwgciwgY2ZnLCAiZXhhbXBsZV9hY2Nlc3NfY2hlY2tlcigpIik7Ci0gICAgcmV0dXJuIERFQ0xJTkVEOwotfQotCi0vKgotICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBkZXRlcm1pbmUgYW5kL29yIHNldCB0aGUgdmFyaW91cyBkb2N1bWVudCB0eXBlCi0gKiBpbmZvcm1hdGlvbiBiaXRzLCBsaWtlIENvbnRlbnQtdHlwZSAodmlhIHItPmNvbnRlbnRfdHlwZSksIGxhbmd1YWdlLCBldAotICogY2V0ZXJhLgotICoKLSAqIFRoZSByZXR1cm4gdmFsdWUgaXMgT0ssIERFQ0xJTkVELCBvciBIVFRQX211bWJsZS4gIElmIHdlIHJldHVybiBPSywgbm8KLSAqIGZ1cnRoZXIgbW9kdWxlcyBhcmUgZ2l2ZW4gYSBjaGFuY2UgYXQgdGhlIHJlcXVlc3QgZm9yIHRoaXMgcGhhc2UuCi0gKi8KLXN0YXRpYyBpbnQgZXhhbXBsZV90eXBlX2NoZWNrZXIocmVxdWVzdF9yZWMgKnIpCi17Ci0KLSAgICBleGNmZyAqY2ZnOwotCi0gICAgY2ZnID0gb3VyX2Rjb25maWcocik7Ci0gICAgLyoKLSAgICAgKiBMb2cgdGhlIGNhbGwsIGJ1dCBkb24ndCBkbyBhbnl0aGluZyBlbHNlIC0gYW5kIHJlcG9ydCB0cnV0aGZ1bGx5IHRoYXQKLSAgICAgKiB3ZSBkaWRuJ3QgZG8gYW55dGhpbmcuCi0gICAgICovCi0gICAgdHJhY2VfYWRkKHItPnNlcnZlciwgciwgY2ZnLCAiZXhhbXBsZV90eXBlX2NoZWNrZXIoKSIpOwotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gcGVyZm9ybSBhbnkgbW9kdWxlLXNwZWNpZmljIGZpeGluZyBvZiBoZWFkZXIKLSAqIGZpZWxkcywgZXQgY2V0ZXJhLiAgSXQgaXMgaW52b2tlZCBqdXN0IGJlZm9yZSBhbnkgY29udGVudC1oYW5kbGVyLgotICoKLSAqIFRoZSByZXR1cm4gdmFsdWUgaXMgT0ssIERFQ0xJTkVELCBvciBIVFRQX211bWJsZS4gIElmIHdlIHJldHVybiBPSywgdGhlCi0gKiBzZXJ2ZXIgd2lsbCBzdGlsbCBjYWxsIGFueSByZW1haW5pbmcgbW9kdWxlcyB3aXRoIGFuIGhhbmRsZXIgZm9yIHRoaXMKLSAqIHBoYXNlLgotICovCi1zdGF0aWMgaW50IGV4YW1wbGVfZml4ZXJfdXBwZXIocmVxdWVzdF9yZWMgKnIpCi17Ci0KLSAgICBleGNmZyAqY2ZnOwotCi0gICAgY2ZnID0gb3VyX2Rjb25maWcocik7Ci0gICAgLyoKLSAgICAgKiBMb2cgdGhlIGNhbGwgYW5kIGV4aXQuCi0gICAgICovCi0gICAgdHJhY2VfYWRkKHItPnNlcnZlciwgciwgY2ZnLCAiZXhhbXBsZV9maXhlcl91cHBlcigpIik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vKgotICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBwZXJmb3JtIGFueSBtb2R1bGUtc3BlY2lmaWMgbG9nZ2luZyBhY3Rpdml0aWVzCi0gKiBvdmVyIGFuZCBhYm92ZSB0aGUgbm9ybWFsIHNlcnZlciB0aGluZ3MuCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBpcyBPSywgREVDTElORUQsIG9yIEhUVFBfbXVtYmxlLiAgSWYgd2UgcmV0dXJuIE9LLCBhbnkKLSAqIHJlbWFpbmluZyBtb2R1bGVzIHdpdGggYW4gaGFuZGxlciBmb3IgdGhpcyBwaGFzZSB3aWxsIHN0aWxsIGJlIGNhbGxlZC4KLSAqLwotc3RhdGljIGludCBleGFtcGxlX2xvZ2dlcihyZXF1ZXN0X3JlYyAqcikKLXsKLQotICAgIGV4Y2ZnICpjZmc7Ci0KLSAgICBjZmcgPSBvdXJfZGNvbmZpZyhyKTsKLSAgICB0cmFjZV9hZGQoci0+c2VydmVyLCByLCBjZmcsICJleGFtcGxlX2xvZ2dlcigpIik7Ci0gICAgcmV0dXJuIERFQ0xJTkVEOwotfQotCi0vKgotICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBnaXZlIHRoZSBtb2R1bGUgYSBjaGFuY2UgdG8gbG9vayBhdCB0aGUgcmVxdWVzdAotICogaGVhZGVycyBhbmQgdGFrZSBhbnkgYXBwcm9wcmlhdGUgc3BlY2lmaWMgYWN0aW9ucyBlYXJseSBpbiB0aGUgcHJvY2Vzc2luZwotICogc2VxdWVuY2UuCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBpcyBPSywgREVDTElORUQsIG9yIEhUVFBfbXVtYmxlLiAgSWYgd2UgcmV0dXJuIE9LLCBhbnkKLSAqIHJlbWFpbmluZyBtb2R1bGVzIHdpdGggaGFuZGxlcnMgZm9yIHRoaXMgcGhhc2Ugd2lsbCBzdGlsbCBiZSBjYWxsZWQuCi0gKi8KLXN0YXRpYyBpbnQgZXhhbXBsZV9oZWFkZXJfcGFyc2VyKHJlcXVlc3RfcmVjICpyKQotewotCi0gICAgZXhjZmcgKmNmZzsKLQotICAgIGNmZyA9IG91cl9kY29uZmlnKHIpOwotICAgIHRyYWNlX2FkZChyLT5zZXJ2ZXIsIHIsIGNmZywgImV4YW1wbGVfaGVhZGVyX3BhcnNlcigpIik7Ci0gICAgcmV0dXJuIERFQ0xJTkVEOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQWxsIG9mIHRoZSByb3V0aW5lcyBoYXZlIGJlZW4gZGVjbGFyZWQgbm93LiAgSGVyZSdzIHRoZSBsaXN0IG9mICAgICAgICAgICovCi0vKiBkaXJlY3RpdmVzIHNwZWNpZmljIHRvIG91ciBtb2R1bGUsIGFuZCBpbmZvcm1hdGlvbiBhYm91dCB3aGVyZSB0aGV5ICAgICAgKi8KLS8qIG1heSBhcHBlYXIgYW5kIGhvdyB0aGUgY29tbWFuZCBwYXJzZXIgc2hvdWxkIHBhc3MgdGhlbSB0byB1cyBmb3IgICAgICAgICAqLwotLyogcHJvY2Vzc2luZy4gIE5vdGUgdGhhdCBjYXJlIG11c3QgYmUgdGFrZW4gdG8gZW5zdXJlIHRoYXQgdGhlcmUgYXJlIE5PICAgICovCi0vKiBjb2xsaXNpb25zIG9mIGRpcmVjdGl2ZSBuYW1lcyBiZXR3ZWVuIG1vZHVsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiAKLSAqIExpc3Qgb2YgZGlyZWN0aXZlcyBzcGVjaWZpYyB0byBvdXIgbW9kdWxlLgotICovCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgZXhhbXBsZV9jbWRzW10gPQotewotICAgIHsKLSAgICAgICAgIkV4YW1wbGUiLCAgICAgICAgICAgICAgLyogZGlyZWN0aXZlIG5hbWUgKi8KLSAgICAgICAgY21kX2V4YW1wbGUsICAgICAgICAgICAgLyogY29uZmlnIGFjdGlvbiByb3V0aW5lICovCi0gICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgIC8qIGFyZ3VtZW50IHRvIGluY2x1ZGUgaW4gY2FsbCAqLwotICAgICAgICBPUl9PUFRJT05TLCAgICAgICAgICAgICAvKiB3aGVyZSBhdmFpbGFibGUgKi8KLSAgICAgICAgTk9fQVJHUywgICAgICAgICAgICAgICAgLyogYXJndW1lbnRzICovCi0gICAgICAgICJFeGFtcGxlIGRpcmVjdGl2ZSAtIG5vIGFyZ3VtZW50cyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlyZWN0aXZlIGRlc2NyaXB0aW9uICovCi0gICAgfSwKLSAgICB7TlVMTH0KLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOb3cgdGhlIGxpc3Qgb2YgY29udGVudCBoYW5kbGVycyBhdmFpbGFibGUgZnJvbSB0aGlzIG1vZHVsZS4gICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiAKLSAqIExpc3Qgb2YgY29udGVudCBoYW5kbGVycyBvdXIgbW9kdWxlIHN1cHBsaWVzLiAgRWFjaCBoYW5kbGVyIGlzIGRlZmluZWQgYnkKLSAqIHR3byBwYXJ0czogYSBuYW1lIGJ5IHdoaWNoIGl0IGNhbiBiZSByZWZlcmVuY2VkIChzdWNoIGFzIGJ5Ci0gKiB7QWRkLFNldH1IYW5kbGVyKSwgYW5kIHRoZSBhY3R1YWwgcm91dGluZSBuYW1lLiAgVGhlIGxpc3QgaXMgdGVybWluYXRlZCBieQotICogYSBOVUxMIGJsb2NrLCBzaW5jZSBpdCBjYW4gYmUgb2YgdmFyaWFibGUgbGVuZ3RoLgotICoKLSAqIE5vdGUgdGhhdCBjb250ZW50LWhhbmRsZXJzIGFyZSBpbnZva2VkIG9uIGEgbW9zdC1zcGVjaWZpYyB0byBsZWFzdC1zcGVjaWZpYwotICogYmFzaXM7IHRoYXQgaXMsIGEgaGFuZGxlciB0aGF0IGlzIGRlY2xhcmVkIGZvciAidGV4dC9wbGFpbiIgd2lsbCBiZQotICogaW52b2tlZCBiZWZvcmUgb25lIHRoYXQgd2FzIGRlY2xhcmVkIGZvciAidGV4dCAvICoiLiAgTm90ZSBhbHNvIHRoYXQKLSAqIGlmIGEgY29udGVudC1oYW5kbGVyIHJldHVybnMgYW55dGhpbmcgZXhjZXB0IERFQ0xJTkVELCBubyBvdGhlcgotICogY29udGVudC1oYW5kbGVycyB3aWxsIGJlIGNhbGxlZC4KLSAqLwotc3RhdGljIGNvbnN0IGhhbmRsZXJfcmVjIGV4YW1wbGVfaGFuZGxlcnNbXSA9Ci17Ci0gICAgeyJleGFtcGxlLWhhbmRsZXIiLCBleGFtcGxlX2hhbmRsZXJ9LAotICAgIHtOVUxMfQotfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZpbmFsbHksIHRoZSBsaXN0IG9mIGNhbGxiYWNrIHJvdXRpbmVzIGFuZCBkYXRhIHN0cnVjdHVyZXMgdGhhdCAgICAgICAgICAqLwotLyogcHJvdmlkZSB0aGUgaG9va3MgaW50byBvdXIgbW9kdWxlIGZyb20gdGhlIG90aGVyIHBhcnRzIG9mIHRoZSBzZXJ2ZXIuICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogCi0gKiBNb2R1bGUgZGVmaW5pdGlvbiBmb3IgY29uZmlndXJhdGlvbi4gIElmIGEgcGFydGljdWxhciBjYWxsYmFjayBpcyBub3QKLSAqIG5lZWRlZCwgcmVwbGFjZSBpdHMgcm91dGluZSBuYW1lIGJlbG93IHdpdGggdGhlIHdvcmQgTlVMTC4KLSAqCi0gKiBUaGUgbnVtYmVyIGluIGJyYWNrZXRzIGluZGljYXRlcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHJvdXRpbmUgaXMgY2FsbGVkCi0gKiBkdXJpbmcgcmVxdWVzdCBwcm9jZXNzaW5nLiAgTm90ZSB0aGF0IG5vdCBhbGwgcm91dGluZXMgYXJlIG5lY2Vzc2FyaWx5Ci0gKiBjYWxsZWQgKHN1Y2ggYXMgaWYgYSByZXNvdXJjZSBkb2Vzbid0IGhhdmUgYWNjZXNzIHJlc3RyaWN0aW9ucykuCi0gKi8KLW1vZHVsZSBleGFtcGxlX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkRfTU9EVUxFX1NUVUZGLAotICAgIGV4YW1wbGVfaW5pdCwgICAgICAgICAgICAgICAvKiBtb2R1bGUgaW5pdGlhbGl6ZXIgKi8KLSAgICBleGFtcGxlX2NyZWF0ZV9kaXJfY29uZmlnLCAgLyogcGVyLWRpcmVjdG9yeSBjb25maWcgY3JlYXRvciAqLwotICAgIGV4YW1wbGVfbWVyZ2VfZGlyX2NvbmZpZywgICAvKiBkaXIgY29uZmlnIG1lcmdlciAqLwotICAgIGV4YW1wbGVfY3JlYXRlX3NlcnZlcl9jb25maWcsICAgICAgIC8qIHNlcnZlciBjb25maWcgY3JlYXRvciAqLwotICAgIGV4YW1wbGVfbWVyZ2Vfc2VydmVyX2NvbmZpZywgICAgICAgIC8qIHNlcnZlciBjb25maWcgbWVyZ2VyICovCi0gICAgZXhhbXBsZV9jbWRzLCAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgdGFibGUgKi8KLSAgICBleGFtcGxlX2hhbmRsZXJzLCAgICAgICAgICAgLyogWzddIGxpc3Qgb2YgaGFuZGxlcnMgKi8KLSAgICBleGFtcGxlX3RyYW5zbGF0ZV9oYW5kbGVyLCAgLyogWzJdIGZpbGVuYW1lLXRvLVVSSSB0cmFuc2xhdGlvbiAqLwotICAgIGV4YW1wbGVfY2hlY2tfdXNlcl9pZCwgICAgICAvKiBbNV0gY2hlY2svdmFsaWRhdGUgdXNlcl9pZCAqLwotICAgIGV4YW1wbGVfYXV0aF9jaGVja2VyLCAgICAgICAvKiBbNl0gY2hlY2sgdXNlcl9pZCBpcyB2YWxpZCAqaGVyZSogKi8KLSAgICBleGFtcGxlX2FjY2Vzc19jaGVja2VyLCAgICAgLyogWzRdIGNoZWNrIGFjY2VzcyBieSBob3N0IGFkZHJlc3MgKi8KLSAgICBleGFtcGxlX3R5cGVfY2hlY2tlciwgICAgICAgLyogWzddIE1JTUUgdHlwZSBjaGVja2VyL3NldHRlciAqLwotICAgIGV4YW1wbGVfZml4ZXJfdXBwZXIsICAgICAgICAvKiBbOF0gZml4dXBzICovCi0gICAgZXhhbXBsZV9sb2dnZXIsICAgICAgICAgICAgIC8qIFsxMF0gbG9nZ2VyICovCi0jaWYgTU9EVUxFX01BR0lDX05VTUJFUiA+PSAxOTk3MDEwMwotICAgIGV4YW1wbGVfaGVhZGVyX3BhcnNlciwgICAgICAvKiBbM10gaGVhZGVyIHBhcnNlciAqLwotI2VuZGlmCi0jaWYgTU9EVUxFX01BR0lDX05VTUJFUiA+PSAxOTk3MDcxOQotICAgIGV4YW1wbGVfY2hpbGRfaW5pdCwgICAgICAgICAvKiBwcm9jZXNzIGluaXRpYWxpemVyICovCi0jZW5kaWYKLSNpZiBNT0RVTEVfTUFHSUNfTlVNQkVSID49IDE5OTcwNzI4Ci0gICAgZXhhbXBsZV9jaGlsZF9leGl0LCAgICAgICAgIC8qIHByb2Nlc3MgZXhpdC9jbGVhbnVwICovCi0jZW5kaWYKLSNpZiBNT0RVTEVfTUFHSUNfTlVNQkVSID49IDE5OTcwOTAyCi0gICAgZXhhbXBsZV9wb3N0X3JlYWRfcmVxdWVzdCAgIC8qIFsxXSBwb3N0IHJlYWRfcmVxdWVzdCBoYW5kbGluZyAqLwotI2VuZGlmCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9leHBlcmltZW50YWwvbW9kX21lbV9jYWNoZS5jIGIvbW9kdWxlcy9leHBlcmltZW50YWwvbW9kX21lbV9jYWNoZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDI3ODFhLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZXhwZXJpbWVudGFsL21vZF9tZW1fY2FjaGUuYworKysgL2Rldi9udWxsCkBAIC0xLDUwOSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotI2RlZmluZSBDT1JFX1BSSVZBVEUKLQotI2luY2x1ZGUgIm1vZF9jYWNoZS5oIgotI2RlZmluZSBNQVhfQ0FDSEUgNTAwMAotbW9kdWxlIEFQX01PRFVMRV9ERUNMQVJFX0RBVEEgbWVtX2NhY2hlX21vZHVsZTsKLQotLyogCi0gKiBYWFgKLSAqIFRoaXMgY2FjaGUgdXNlcyBhcHJfaGFzaCBmdW5jdGlvbnMgd2hpY2ggbGVhayBzdG9yYWdlIHdoZW4gc29tZXRoaW5nIGlzIHJlbW92ZWQKLSAqIGZyb20gdGhlIGNhY2hlLiBUaGlzIGNhbiBiZSBmaXhlZCBpbiB0aGUgYXByX2hhc2ggZnVuY3Rpb25zIGJ5IG1ha2luZyB0aGVtIHVzZQotICogbWFsbG9jL2ZyZWUgcmF0aGVyIHRoYW4gcG9vbHMgdG8gbWFuYWdlIHRoZWlyIHN0b3JhZ2UgcmVxdWlyZW1lbnRzLgotICovCi0KLS8qCi0gKiBYWFggSW50cm9kdWNlIGEgdHlwZSBmaWVsZCB0aGF0IGlkZW50aWZpZXMgd2hldGhlciB0aGUgY2FjaGUgb2JqCi0gKiByZWZlcmVuY2VzIG1hbGxvYydlZCBvciBtbWFwIHN0b3JhZ2Ugb3IgYSBmaWxlIGRlc2NyaXB0b3IKLSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBDQUNIRV9UWVBFX0ZJTEUgPSAxLAotICAgIENBQ0hFX1RZUEVfTUFMTE9DLAotICAgIENBQ0hFX1RZUEVfTU1BUAotfSBjYWNoZV90eXBlX2U7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjYWNoZV90eXBlX2UgdHlwZTsKLSAgICBjaGFyICprZXk7Ci0gICAgdm9pZCAqbTsKLSAgICBhcHJfc2l6ZV90IG1fbGVuOwotICAgIGNhY2hlX2luZm8gaW5mbzsKLSAgICBpbnQgY29tcGxldGU7Ci19IGNhY2hlX29iamVjdF90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgYXByX2xvY2tfdCAqbG9jazsKLSAgICBhcHJfaGFzaF90ICpjYWNoZWh0OwotICAgIGludCBzcGFjZTsKLSAgICBhcHJfdGltZV90IG1heGV4cGlyZTsKLSAgICBhcHJfdGltZV90IGRlZmF1bHRleHBpcmU7Ci19IG1lbV9jYWNoZV9jb25mOwotc3RhdGljIG1lbV9jYWNoZV9jb25mICpzY29uZjsKLQotI2RlZmluZSBERUZBVUxUX0NBQ0hFX1NQQUNFIDEwMCoxMDI0Ci0jZGVmaW5lIENBQ0hFRklMRV9MRU4gMjAKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLXN0YXRpYyBpbnQgcmVtb3ZlX2VudGl0eShjYWNoZV9oYW5kbGUgKmgpOwotc3RhdGljIGludCB3cml0ZV9oZWFkZXJzKGNhY2hlX2hhbmRsZSAqaCwgcmVxdWVzdF9yZWMgKnIsIGNhY2hlX2luZm8gKmkpOwotc3RhdGljIGludCB3cml0ZV9ib2R5KGNhY2hlX2hhbmRsZSAqaCwgYXByX2J1Y2tldF9icmlnYWRlICpiKTsKLXN0YXRpYyBpbnQgcmVhZF9oZWFkZXJzKGNhY2hlX2hhbmRsZSAqaCwgcmVxdWVzdF9yZWMgKnIsIGNhY2hlX2luZm8gKippbmZvKTsKLXN0YXRpYyBpbnQgcmVhZF9ib2R5KGNhY2hlX2hhbmRsZSAqaCwgYXByX2J1Y2tldF9icmlnYWRlICpiYik7Ci0KLXN0YXRpYyB2b2lkIGNsZWFudXBfY2FjaGVfb2JqZWN0KGNhY2hlX29iamVjdF90ICpvYmopCi17Ci0gICAgLyogVGhlIGNhY2hlIG9iamVjdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGNhY2hlLiBOb3cgY2xlYW4KLSAgICAgKiBpdCB1cCwgZnJlZWluZyBhbnkgc3RvcmFnZSwgY2xvc2luZyBmaWxlIGRlc2NyaXB0b3JzLCBldGMuCi0gICAgICovCi0gICAgLyogWFhYIC0gCi0gICAgICogVGhlIGFjdGlvbiBvZiBmcmVlaW5nIGEgY2FjaGUgZW50cnkgaXMgYXN5bmNocm9ub3VzIHdpdGggdGhlIHJlc3Qgb2YgCi0gICAgICogdGhlIG9wZXJhdGlvbiBvZiB0aGUgY2FjaGUuIEZyZWVzIGNhbiBiZSBkcml2ZW4gYnkgZ2FyYmFnZSBjb2xsZWN0aW9uLAotICAgICAqIHRoZSByZXN1bHQgb2Ygc29tZSBjb21tYW5kIG9yIGFuIEhUVFAgcmVxdWVzdC4gIEl0IGlzIG9rYXkgdG8gcmVtb3ZlIAotICAgICAqIGFuIGVudHJ5IGZyb20gdGhlIGNhY2hlIGF0IGFueXRpbWUgYnV0IHdlIG5lZWQgYSBtZWNoYW5pc20gdG8ga2VlcCAKLSAgICAgKiB1cyBmcm9tIGNsZWFuaW5nIHVwIHRoZSBjYWNoZSBlbnRyeSBvdXQgZnJvbSB1bmRlciBvdGhlciB0aHJlYWRzIAotICAgICAqIHRoYXQgbWF5IHN0aWxsIGJlIHJlZmVyZW5jaW5nIGl0LgotICAgICAqIAotICAgICAqIEJpbGwgdGhpbmtzIHRoYXQgd2UgbmVlZCBhIHNwZWNpYWwgcHVycG9zZSByZWZlcmVuY2UgY291bnRlZCAKLSAgICAgKiBidWNrZXQgKG9yIHRocmVlKS4gIFdoZW4gYW4gZW50cnkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZSwgdGhlCi0gICAgICogYnVja2V0IGZvciB0aGF0IGVudHJ5IGlzIG1hcmtlZCBmb3IgY2xlYW51cC4gQSBidWNrZXQgbWFya2VkIGZvciAKLSAgICAgKiBjbGVhbnVwIGlzIGZyZWVkIGJ5IHRoZSBsYXN0IHJvdXRpbmUgcmVmZXJlbmNpbmcgdGhlIGJ1Y2tldCwKLSAgICAgKiBlaXRoZXIgZHVyaW5nIGJyaWdhZGUgZGVzdHJveSBvciB0aGlzIHJvdXRpbmUuCi0gICAgICovCi0KLSAgICAvKiAKLSAgICAgKiBSZWYgY291bnQgZGVjcmVtZW50aW5nIGFuZCBjaGVja2luZyBuZWVkcyB0byBiZSBhdG9taWMKLQotICAgICAgIG9iai0+cmVmX2NvdW50LS07Ci0gICAgICAgaWYgKG9iai0+cmVmX2NvdW50KSB7Ci0gICAgICAgICAgIGRlZmVyX2NsZWFudXAgKGxldCB0aGUgYnJpZ2FkZSBjbGVhbnVwIGZyZWUgdGhlIGJ1Y2tldCkKLSAgICAgICB9Ci0gICAgICAgZWxzZSB7Ci0gICAgICAgICAgIGZyZWUgdGhlIGJ1Y2tldAotICAgICAgIH0KLSAgICAqLwotCi0gICAgaWYgKG9iai0+aW5mby5jb250ZW50X3R5cGUpCi0gICAgICAgIGZyZWUob2JqLT5pbmZvLmNvbnRlbnRfdHlwZSk7Ci0gICAgaWYgKG9iai0+a2V5KQotICAgICAgICBmcmVlKG9iai0+a2V5KTsKLSAgICBpZiAob2JqLT5tKQotICAgICAgICBmcmVlKG9iai0+bSk7Ci0KLSAgICBmcmVlKG9iaik7Ci19Ci0KLXN0YXRpYyBhcHJfc3RhdHVzX3QgY2xlYW51cF9jYWNoZV9tZW0odm9pZCAqc2NvbmZ2KQotewotICAgIGNhY2hlX29iamVjdF90ICpvYmo7Ci0gICAgYXByX2hhc2hfaW5kZXhfdCAqaGk7Ci0gICAgbWVtX2NhY2hlX2NvbmYgKmNvID0gKG1lbV9jYWNoZV9jb25mKikgc2NvbmZ2OwotCi0gICAgaWYgKCFjbykgewotICAgICAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci0gICAgfQotCi0gICAgLyogSXRlcmF0ZSBvdmVyIHRoZSBmcmFnIGhhc2ggdGFibGUgYW5kIGNsZWFuIHVwIGVhY2ggZW50cnkgKi8KLSAgICAvKiBYWFggbmVlZCB0byBsb2NrIHRoZSBoYXNoICovCi0gICAgZm9yIChoaSA9IGFwcl9oYXNoX2ZpcnN0KE5VTEwsIGNvLT5jYWNoZWh0KTsgaGk7IGhpPWFwcl9oYXNoX25leHQoaGkpKSB7Ci0gICAgICAgIGFwcl9oYXNoX3RoaXMoaGksIE5VTEwsIE5VTEwsICh2b2lkICoqKSZvYmopOwotICAgICAgICBpZiAob2JqKQotICAgICAgICAgICAgY2xlYW51cF9jYWNoZV9vYmplY3Qob2JqKTsKLSAgICB9Ci0gICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotfQotc3RhdGljIHZvaWQgKmNyZWF0ZV9jYWNoZV9jb25maWcoYXByX3Bvb2xfdCAqcCwgc2VydmVyX3JlYyAqcykKLXsKLSAgICBzY29uZiA9IGFwcl9wY2FsbG9jKHAsIHNpemVvZihtZW1fY2FjaGVfY29uZikpOwotICAgIHNjb25mLT5zcGFjZSA9IERFRkFVTFRfQ0FDSEVfU1BBQ0U7Ci0jaWYgMAotICAgIHNjb25mLT5tYXhleHBpcmUgPSBERUZBVUxUX0NBQ0hFX01BWEVYUElSRTsKLSAgICBzY29uZi0+ZGVmYXVsdGV4cGlyZSA9IERFRkFVTFRfQ0FDSEVfRVhQSVJFOwotI2VuZGlmCi0KLSAgICBhcHJfbG9ja19jcmVhdGUoJnNjb25mLT5sb2NrLCBBUFJfTVVURVgsIEFQUl9JTlRSQVBST0NFU1MsICJmb28iLCBwKTsKLSAgICBzY29uZi0+Y2FjaGVodCA9IGFwcl9oYXNoX21ha2UocCk7Ci0gICAgYXByX3Bvb2xfY2xlYW51cF9yZWdpc3RlcihwLCBOVUxMLCBjbGVhbnVwX2NhY2hlX21lbSwgYXByX3Bvb2xfY2xlYW51cF9udWxsKTsKLQotICAgIHJldHVybiBzY29uZjsKLX0KLQotc3RhdGljIGludCBjcmVhdGVfZW50aXR5KGNhY2hlX2hhbmRsZSAqKmhwLCBjb25zdCBjaGFyICp0eXBlLCBjaGFyICprZXksIGFwcl9zaXplX3QgbGVuKSAKLXsKLSAgICBhcHJfc3RhdHVzX3QgcnY7Ci0gICAgY2FjaGVfb2JqZWN0X3QgKm9iajsKLSAgICBjYWNoZV9oYW5kbGUgKmg7Ci0KLSAgICAvKiBDcmVhdGUgdGhlIGNhY2hlIGhhbmRsZSBhbmQgYmVnaW4gcG9wdWxhdGluZyBpdC4KLSAgICAgKi8KLSAgICBpZiAoc3RyY2FzZWNtcCh0eXBlLCAibWVtIikpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIC8qIENoZWNrIGxlbiB0byBzZWUgaWYgaXQgaXMgd2l0aGluZyBhY2NlcHRhYmxlIGJvdW5kcyAKLSAgICAgKiBYWFggbWF4IGNhY2hlIGNoZWNrIHNob3VsZCBiZSBjb25maWd1cmFibGUgdmFyaWFibGUuCi0gICAgICovCi0gICAgaWYgKGxlbiA8IDAgfHwgbGVuID4gTUFYX0NBQ0hFKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0gICAgLyogQ2hlY2sgdG90YWwgY2FjaGUgc2l6ZSBhbmQgbnVtYmVyIG9mIGVudHJpZXMuIEFyZSB0aGV5IHdpdGhpbiB0aGUKLSAgICAgKiBjb25maWd1cmVkIGxpbWl0cz8gSWYgbm90LCBraWNrIG9mZiBnYXJiYWdlIGNvbGxlY3Rpb24gdGhyZWFkLgotICAgICAqLwotCi0gICAgLyogQWxsb2NhdGUgdGhlIGNhY2hlX2hhbmRsZSBhbmQgc2V0IHVwIGNhbGwgYmFjayBmdW5jdGlvbnMgc3BlY2lmaWMgdG8gCi0gICAgICogdGhpcyBjYWNoZSBoYW5kbGVyLgotICAgICAqLwotICAgIGggPSBtYWxsb2Moc2l6ZW9mKGNhY2hlX2hhbmRsZSkpOwotICAgICpocCA9IGg7Ci0gICAgaWYgKCFoKSB7Ci0gICAgICAgIC8qIGhhbmRsZSB0aGUgZXJyb3IgKi8KLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLSAgICBoLT5yZWFkX2JvZHkgPSAmcmVhZF9ib2R5OwotICAgIGgtPnJlYWRfaGVhZGVycyA9ICZyZWFkX2hlYWRlcnM7Ci0gICAgaC0+d3JpdGVfYm9keSA9ICZ3cml0ZV9ib2R5OwotICAgIGgtPndyaXRlX2hlYWRlcnMgPSAmd3JpdGVfaGVhZGVyczsKLQotICAgIC8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBjYWNoZSBvYmplY3QuIFRoZSBjYWNoZSBvYmplY3QgaXMKLSAgICAgKiB1bmlxdWUgdG8gdGhpcyBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICBvYmogPSBtYWxsb2Moc2l6ZW9mKCpvYmopKTsKLSAgICBpZiAoIW9iaikgewotICAgICAgICAvKiBIYW5kbGUgdGhlciBlcnJvciAqLwotICAgICAgICBmcmVlKGgpOwotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgfQotCi0gICAgb2JqLT5rZXkgPSBtYWxsb2Moc3RybGVuKGtleSkpOwotICAgIGlmICghb2JqLT5rZXkpIHsKLSAgICAgICAgLyogWFhYIFV1dWdoLCB0aGVyZSBoYXMgZ290IHRvIGJlIGEgYmV0dGVyIHdheSB0byBtYW5hZ2UgbWVtb3J5LgotICAgICAgICAgKi8KLSAgICAgICAgZnJlZShoKTsKLSAgICAgICAgZnJlZShvYmopOwotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgfQotICAgIG9iai0+bV9sZW4gPSBsZW47ICAgICAvKiBPbmUgb2YgdGhlc2UgbGVuIGZpZWxkcyBjYW4gZ28gKi8KLSAgICBvYmotPmluZm8ubGVuID0gbGVuOwotICAgIHN0cmNweShvYmotPmtleSwga2V5KTsKLSAgICBoLT5jYWNoZV9vYmogPSAodm9pZCAqKSBvYmo7Ci0gICAgCi0gICAgLyogTWFyayB0aGUgY2FjaGUgb2JqZWN0IGFzIGluY29tcGxldGUgYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSAqLwotICAgIG9iai0+Y29tcGxldGUgPSAwOwotCi0gICAgLyogWFhYIE5lZWQgYSB3YXkgdG8gaW5zZXJ0IGludG8gdGhlIGNhY2hlIHcvbyBzY2ggY29hcnNlIGdyYWluZWQgbG9ja2luZyAqLwotICAgIGFwcl9sb2NrX2FjcXVpcmUoc2NvbmYtPmxvY2spOwotICAgIGFwcl9oYXNoX3NldChzY29uZi0+Y2FjaGVodCwgb2JqLT5rZXksIHN0cmxlbihvYmotPmtleSksIG9iaik7Ci0gICAgYXByX2xvY2tfcmVsZWFzZShzY29uZi0+bG9jayk7Ci19Ci0KLXN0YXRpYyBpbnQgb3Blbl9lbnRpdHkoY2FjaGVfaGFuZGxlICoqaHAsIGNvbnN0IGNoYXIgKnR5cGUsIGNoYXIgKmtleSkgCi17Ci0gICAgY2FjaGVfb2JqZWN0X3QgKm9iajsKLSAgICBjYWNoZV9oYW5kbGUgKmg7Ci0KLSAgICAvKiBMb29rIHVwIGVudGl0eSBrZXllZCB0byAndXJsJyAqLwotICAgIGlmIChzdHJjYXNlY21wKHR5cGUsICJtZW0iKSkgewotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgfQotICAgIGFwcl9sb2NrX2FjcXVpcmUoc2NvbmYtPmxvY2spOwotICAgIG9iaiA9IChjYWNoZV9vYmplY3RfdCAqKSBhcHJfaGFzaF9nZXQoc2NvbmYtPmNhY2hlaHQsIGtleSwgQVBSX0hBU0hfS0VZX1NUUklORyk7Ci0gICAgYXByX2xvY2tfcmVsZWFzZShzY29uZi0+bG9jayk7Ci0KLSAgICBpZiAoIW9iaiB8fCAhKG9iai0+Y29tcGxldGUpKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICAvKiBBbGxvY2F0ZSB0aGUgY2FjaGVfaGFuZGxlIGFuZCBpbml0aWFsaXplIGl0ICovCi0gICAgaCA9IG1hbGxvYyhzaXplb2YoY2FjaGVfaGFuZGxlKSk7Ci0gICAgKmhwID0gaDsKLSAgICBpZiAoIWgpIHsKLSAgICAgICAgLyogaGFuZGxlIHRoZSBlcnJvciAqLwotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgfQotICAgIGgtPnJlYWRfYm9keSA9ICZyZWFkX2JvZHk7Ci0gICAgaC0+cmVhZF9oZWFkZXJzID0gJnJlYWRfaGVhZGVyczsKLSAgICBoLT53cml0ZV9ib2R5ID0gJndyaXRlX2JvZHk7Ci0gICAgaC0+d3JpdGVfaGVhZGVycyA9ICZ3cml0ZV9oZWFkZXJzOwotICAgIGgtPmNhY2hlX29iaiA9IG9iajsKLSAgICBpZiAoIW9iaiB8fCAhKG9iai0+Y29tcGxldGUpKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0aWMgaW50IHJlbW92ZV9lbnRpdHkoY2FjaGVfaGFuZGxlICpoKSAKLXsKLSAgICBjYWNoZV9vYmplY3RfdCAqb2JqID0gKGNhY2hlX29iamVjdF90ICopIGgtPmNhY2hlX29iajsKLQotICAgIGFwcl9sb2NrX2FjcXVpcmUoc2NvbmYtPmxvY2spOwotICAgIGFwcl9oYXNoX3NldChzY29uZi0+Y2FjaGVodCwgb2JqLT5rZXksIHN0cmxlbihvYmotPmtleSksIE5VTEwpOwotICAgIGFwcl9sb2NrX3JlbGVhc2Uoc2NvbmYtPmxvY2spOwotCi0gICAgY2xlYW51cF9jYWNoZV9vYmplY3Qob2JqKTsKLSAgICAKLSAgICAvKiBSZWluaXQgdGhlIGNhY2hlX2hhbmRsZSBmaWVsZHM/ICovCi0gICAgaC0+Y2FjaGVfb2JqID0gTlVMTDsKLQotICAgIC8qIFRoZSBjYWxsZXIgc2hvdWxkIGZyZWUgdGhlIGNhY2hlX2hhbmRsZSA/ICovCi0gICAgZnJlZShoKTsKLX0KLQotLyogRGVmaW5lIHJlcXVlc3QgcHJvY2Vzc2luZyBob29rIGhhbmRsZXJzICovCi1zdGF0aWMgaW50IHJlbW92ZV91cmwoY29uc3QgY2hhciAqdHlwZSwgY2hhciAqa2V5KSAKLXsKLSAgICBjYWNoZV9vYmplY3RfdCAqb2JqOwotCi0gICAgaWYgKHN0cmNhc2VjbXAodHlwZSwgIm1lbSIpKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICAvKiBXSUJOSUYKLSAgICAgKiBhcHJfaGFzaF9zZXQoLi4sLi4sLi4sTlVMTCkgcmV0dXJuZWQgcG9pbnRlciB0byB0aGUgb2JqZWN0IGp1c3QgcmVtb3ZlZC4KLSAgICAgKiBUaGF0IHdheSwgd2UgY291bGQgZnJlZSB0aGUgb2JqZWN0IHcvbyBkb2luZyBhbm90aGVyIGNhbGwgdG8gYW4KLSAgICAgKiBhcHJfaGFzaCBmdW5jdGlvbi4KLSAgICAgKi8KLQotICAgIC8qIEZpcnN0LCBmaW5kIHRoZSBvYmplY3QgaW4gdGhlIGNhY2hlICovCi0gICAgYXByX2xvY2tfYWNxdWlyZShzY29uZi0+bG9jayk7Ci0gICAgb2JqID0gKGNhY2hlX29iamVjdF90ICopIGFwcl9oYXNoX2dldChzY29uZi0+Y2FjaGVodCwga2V5LCBBUFJfSEFTSF9LRVlfU1RSSU5HKTsKLSAgICBhcHJfbG9ja19yZWxlYXNlKHNjb25mLT5sb2NrKTsKLQotICAgIGlmICghb2JqKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICAvKiBGb3VuZCBpdC4gTm93IHRha2UgaXQgb3V0IG9mIHRoZSBjYWNoZSBhbmQgZnJlZSBpdC4gKi8KLSAgICBhcHJfbG9ja19hY3F1aXJlKHNjb25mLT5sb2NrKTsKLSAgICBhcHJfaGFzaF9zZXQoc2NvbmYtPmNhY2hlaHQsIG9iai0+a2V5LCBzdHJsZW4ob2JqLT5rZXkpLCBOVUxMKTsKLSAgICBhcHJfbG9ja19yZWxlYXNlKHNjb25mLT5sb2NrKTsKLQotICAgIGNsZWFudXBfY2FjaGVfb2JqZWN0KG9iaik7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyBpbnQgcmVhZF9oZWFkZXJzKGNhY2hlX2hhbmRsZSAqaCwgcmVxdWVzdF9yZWMgKnIsIGNhY2hlX2luZm8gKippbmZvKSAKLXsKLSAgICBjYWNoZV9vYmplY3RfdCAqb2JqID0gKGNhY2hlX29iamVjdF90KikgaC0+Y2FjaGVfb2JqOwotCi0gICAgKmluZm8gPSAmKG9iai0+aW5mbyk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyBpbnQgcmVhZF9ib2R5KGNhY2hlX2hhbmRsZSAqaCwgYXByX2J1Y2tldF9icmlnYWRlICpiYikgCi17Ci0gICAgYXByX2J1Y2tldCAqYjsKLSAgICBjYWNoZV9vYmplY3RfdCAqb2JqID0gaC0+Y2FjaGVfb2JqOwotICAgIAotICAgIGIgPSBhcHJfYnVja2V0X2ltbW9ydGFsX2NyZWF0ZShvYmotPm0sIG9iai0+bV9sZW4pOwotICAgIEFQUl9CUklHQURFX0lOU0VSVF9UQUlMKGJiLCBiKTsKLSAgICBiID0gYXByX2J1Y2tldF9lb3NfY3JlYXRlKCk7Ci0gICAgQVBSX0JSSUdBREVfSU5TRVJUX1RBSUwoYmIsIGIpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0aWMgaW50IHdyaXRlX2hlYWRlcnMoY2FjaGVfaGFuZGxlICpoLCByZXF1ZXN0X3JlYyAqciwgY2FjaGVfaW5mbyAqaW5mbykKLXsKLSAgICBhcHJfc2l6ZV90IGxlbjsKLSAgICBjYWNoZV9vYmplY3RfdCAqb2JqID0gKGNhY2hlX29iamVjdF90KikgaC0+Y2FjaGVfb2JqOwotICAgIGlmIChpbmZvLT5kYXRlKSB7Ci0gICAgICAgIG9iai0+aW5mby5kYXRlID0gaW5mby0+ZGF0ZTsKLSAgICB9Ci0gICAgaWYgKGluZm8tPmxhc3Rtb2QpIHsKLSAgICAgICAgb2JqLT5pbmZvLmxhc3Rtb2QgPSBpbmZvLT5sYXN0bW9kOwotICAgIH0KLSAgICBpZiAoaW5mby0+ZXhwaXJlKSB7Ci0gICAgICAgIG9iai0+aW5mby5leHBpcmUgPSBpbmZvLT5leHBpcmU7Ci0gICAgfQotICAgIGlmIChpbmZvLT5jb250ZW50X3R5cGUpIHsKLSAgICAgICAgb2JqLT5pbmZvLmNvbnRlbnRfdHlwZSA9IChjaGFyKikgbWFsbG9jKHN0cmxlbihpbmZvLT5jb250ZW50X3R5cGUpKTsKLSAgICAgICAgaWYgKG9iai0+aW5mby5jb250ZW50X3R5cGUpCi0gICAgICAgICAgICBzdHJjcHkob2JqLT5pbmZvLmNvbnRlbnRfdHlwZSwgaW5mby0+Y29udGVudF90eXBlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyBpbnQgd3JpdGVfYm9keShjYWNoZV9oYW5kbGUgKmgsIGFwcl9idWNrZXRfYnJpZ2FkZSAqYikgCi17Ci0gICAgYXByX3N0YXR1c190IHJ2OwotICAgIGFwcl9zaXplX3QgaWR4ID0gMDsKLSAgICBjYWNoZV9vYmplY3RfdCAqb2JqID0gKGNhY2hlX29iamVjdF90ICopIGgtPmNhY2hlX29iajsKLSAgICBhcHJfcmVhZF90eXBlX2UgZWJsb2NrID0gQVBSX0JMT0NLX1JFQUQ7Ci0gICAgYXByX2J1Y2tldCAqZTsKLQotICAgIC8qIFhYWCBtbWFwLCBtYWxsb2Mgb3IgZmlsZT8gCi0gICAgICogRW5hYmxlIHRoaXMgZGVjaXNpb24gdG8gYmUgY29uZmlndXJlZC4uLi4KLSAgICAgKi8KLSAgICBjaGFyICptID0gbWFsbG9jKG9iai0+bV9sZW4pOwotICAgIG9iai0+bSA9IG07Ci0gICAgaWYgKCFtKSB7Ci0gICAgICAgIC8qIENsZWFudXAgY2FjaGUgZW50cnkgYW5kIHJldHVybiAqLwotICAgIH0KLSAgICBvYmotPnR5cGUgPSBDQUNIRV9UWVBFX01BTExPQzsKLQotICAgIC8qIEl0ZXJhdGUgYWNjcm9zcyB0aGUgYnJpZ2FkZSBhbmQgcG9wdWxhdGUgdGhlIGNhY2hlIHN0b3JhZ2UgKi8KLSAgICAvKiBYWFggZG9lc24ndCBoYW5kbGUgbXVsdGlwbGUgYnJpZ2FkZXMgKi8KLSAgICBBUFJfQlJJR0FERV9GT1JFQUNIKGUsIGIpIHsKLSAgICAgICAgY29uc3QgY2hhciAqczsKLSAgICAgICAgYXByX3NpemVfdCBsZW47Ci0KLSAgICAgICAgcnYgPSBhcHJfYnVja2V0X3JlYWQoZSwgJnMsICZsZW4sIGVibG9jayk7Ci0gICAgICAgIGlmIChydiAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICAgICAgLyogQmlnIHByb2JsZW0hICBDbGVhbnVwIGNhY2hlIGVudHJ5IGFuZCByZXR1cm4gKi8KLSAgICAgICAgfQotICAgICAgICAvKiBYWFggQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0gICAgICAgIGlmIChsZW4gKSB7Ci0gICAgICAgICAgICBtZW1jcHkobSwgcywgbGVuKTsKLSAgICAgICAgICAgIG0rPWxlbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFhYWCAtIENoZWNrIGZvciBFT1MgYmVmb3JlIHNldHRpbmcgb2JqLT5jb21wbGV0ZQotICAgICAqIE9wZW4gZm9yIGJ1c2luZXNzLiBUaGlzIGVudHJ5IGNhbiBiZSBzZXJ2ZWQgZnJvbSB0aGUgY2FjaGUgCi0gICAgICovCi0gICAgb2JqLT5jb21wbGV0ZSA9IDE7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAKLSpzZXRfY2FjaGVfc2l6ZShjbWRfcGFybXMgKnBhcm1zLCBjaGFyICpzdHJ1Y3RfcHRyLCBjaGFyICphcmcpCi17Ci0gICAgaW50IHZhbDsKLQotICAgIGlmIChzc2NhbmYoYXJnLCAiJWQiLCAmdmFsKSAhPSAxKQotICAgIHJldHVybiAiQ2FjaGVTaXplIHZhbHVlIG11c3QgYmUgYW4gaW50ZWdlciAoa0J5dGVzKSI7Ci0gICAgc2NvbmYtPnNwYWNlID0gdmFsOwotICAgIHJldHVybiBOVUxMOwotfQotI2lmIDAKLXN0YXRpYyBjb25zdCBjaGFyCi0qc2V0X2NhY2hlX2ZhY3RvcihjbWRfcGFybXMgKnBhcm1zLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGRvdWJsZSB2YWw7Ci0KLSAgICBpZiAoc3NjYW5mKGFyZywgIiVsZyIsICZ2YWwpICE9IDEpCi0gICAgICAgIHJldHVybiAiQ2FjaGVMYXN0TW9kaWZpZWRGYWN0b3IgdmFsdWUgbXVzdCBiZSBhIGZsb2F0IjsKLSAgICBzY29uZi0+bG1mYWN0b3IgPSB2YWw7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLSNlbmRpZgotI2lmIDAKLXN0YXRpYyBjb25zdCBjaGFyCi0qc2V0X2NhY2hlX21heGV4KGNtZF9wYXJtcyAqcGFybXMsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0gICAgbWVtX2NhY2hlX2NvbmYgKnBjID0gYXBfZ2V0X21vZHVsZV9jb25maWcocGFybXMtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgJm1lbV9jYWNoZV9tb2R1bGUpOwotICAgIGRvdWJsZSB2YWw7Ci0KLSAgICBpZiAoc3NjYW5mKGFyZywgIiVsZyIsICZ2YWwpICE9IDEpCi0gICAgICAgIHJldHVybiAiQ2FjaGVNYXhFeHBpcmUgdmFsdWUgbXVzdCBiZSBhIGZsb2F0IjsKLSAgICBzY29uZi0+bWF4ZXhwaXJlID0gKGFwcl90aW1lX3QpICh2YWwgKiBNU0VDX09ORV9IUik7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0jZW5kaWYKLSNpZiAwCi1zdGF0aWMgY29uc3QgY2hhcgotKnNldF9jYWNoZV9kZWZleChjbWRfcGFybXMgKnBhcm1zLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIG1lbV9jYWNoZV9jb25mICpwYyA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHBhcm1zLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsICZtZW1fY2FjaGVfbW9kdWxlKTsKLSAgICBkb3VibGUgdmFsOwotCi0gICAgaWYgKHNzY2FuZihhcmcsICIlbGciLCAmdmFsKSAhPSAxKQotICAgICAgICByZXR1cm4gIkNhY2hlRGVmYXVsdEV4cGlyZSB2YWx1ZSBtdXN0IGJlIGEgZmxvYXQiOwotICAgIHBjLT5kZWZhdWx0ZXhwaXJlID0gKGFwcl90aW1lX3QpICh2YWwgKiBNU0VDX09ORV9IUik7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0jZW5kaWYKLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBjYWNoZV9jbWRzW10gPQotewotICAgIC8qIFhYWAotICAgICAqIFdoYXQgY29uZmlnIGRpcmVjdGl2ZXMgZG9lcyB0aGlzIG1vZHVsZSBuZWVkPwotICAgICAqIFNob3VsZCB0aGlzIG1vZHVsZSBtYW5hZ2UgZXhwaXJlIHBvbGljeSBmb3IgaXRzIGVudHJpZXM/Ci0gICAgICogQ2VydGFpbmx5IGNhY2hlIGxpbWl0cyBsaWtlIG1heCBudW1iZXIgb2YgZW50cmllcywKLSAgICAgKiBtYXggZW50cnkgc2l6ZSwgYW5kIG1heCBzaXplIG9mIHRoZSBjYWNoZSBzaG91bGQKLSAgICAgKiBiZSBtYW5hZ2VkIGJ5IHRoaXMgbW9kdWxlLiAKLSAgICAgKi8KLSAgICBBUF9JTklUX1RBS0UxKCJDYWNoZVNpemVNZW0iLCBzZXRfY2FjaGVfc2l6ZSwgTlVMTCwgUlNSQ19DT05GLAotICAgICAiVGhlIG1heGltdW0gZGlzayBzcGFjZSB1c2VkIGJ5IHRoZSBjYWNoZSBpbiBLYiIpLAotICAgIHtOVUxMfQotfTsKLQotc3RhdGljIHZvaWQgcmVnaXN0ZXJfaG9va3MoYXByX3Bvb2xfdCAqcCkKLXsKLSAgICAvKiBjYWNoZSBpbml0aWFsaXplciAqLwotLyogICAgY2FjaGVfaG9va19jYWNoZV9pbml0KGNhY2hlX2luaXQsIE5VTEwsIE5VTEwsIEFQX0hPT0tfRklSU1QpOyAqLwotICAgIGNhY2hlX2hvb2tfY3JlYXRlX2VudGl0eShjcmVhdGVfZW50aXR5LCBOVUxMLCBOVUxMLCBBUFJfSE9PS19NSURETEUpOwotICAgIGNhY2hlX2hvb2tfb3Blbl9lbnRpdHkob3Blbl9lbnRpdHksICBOVUxMLCBOVUxMLCBBUFJfSE9PS19NSURETEUpOwotICAgIGNhY2hlX2hvb2tfcmVtb3ZlX3VybChyZW1vdmVfdXJsLCBOVUxMLCBOVUxMLCBBUFJfSE9PS19NSURETEUpOwotfQotCi1tb2R1bGUgQVBfTU9EVUxFX0RFQ0xBUkVfREFUQSBtZW1fY2FjaGVfbW9kdWxlID0KLXsKLSAgICBTVEFOREFSRDIwX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHBlci1kaXJlY3RvcnkgY29uZmlnIHN0cnVjdHVyZSAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAvKiBtZXJnZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgY3JlYXRlX2NhY2hlX2NvbmZpZywgICAgIC8qIGNyZWF0ZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgLyogbWVyZ2UgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIGNhY2hlX2NtZHMsICAgICAgICAgICAgICAvKiBjb21tYW5kIGFwcl90YWJsZV90ICovCi0gICAgcmVnaXN0ZXJfaG9va3MKLX07Ci0KZGlmZiAtLWdpdCBhL21vZHVsZXMvZXhwZXJpbWVudGFsL21vZF9tZW1fY2FjaGUuZHNwIGIvbW9kdWxlcy9leHBlcmltZW50YWwvbW9kX21lbV9jYWNoZS5kc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYzkxMjkuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9leHBlcmltZW50YWwvbW9kX21lbV9jYWNoZS5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJtb2RfbWVtX2NhY2hlIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDIKLQotQ0ZHPW1vZF9tZW1fY2FjaGUgLSBXaW4zMiBEZWJ1ZwotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJtb2RfbWVtX2NhY2hlLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAibW9kX21lbV9jYWNoZS5tYWsiIENGRz0ibW9kX21lbV9jYWNoZSAtIFdpbjMyIERlYnVnIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgIm1vZF9tZW1fY2FjaGUgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFICJtb2RfbWVtX2NhY2hlIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1NVEw9bWlkbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAibW9kX21lbV9jYWNoZSAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJfVVNSRExMIiAvRCAibW9kX21lbV9jYWNoZV9FWFBPUlRTIiAvWVggL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0kgIi4uLy4uL3NyY2xpYi9hcHItdXRpbC9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci9pbmNsdWRlIiAvSSAiLi4vLi4vaW5jbHVkZSIgL0kgIi4uLy4uL29zL3dpbjMyIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiX1VTUkRMTCIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL2RsbCAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9tYWNoaW5lOkkzODYgL291dDoiUmVsZWFzZS9tb2RfbWVtX2NhY2hlLnNvIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibW9kX21lbV9jYWNoZSAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9EICJfTUJDUyIgL0QgIl9VU1JETEwiIC9EICJtb2RfbWVtX2NhY2hlX0VYUE9SVFMiIC9ZWCAvRkQgL0daIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0kgIi4uLy4uL3NyY2xpYi9hcHItdXRpbC9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci9pbmNsdWRlIiAvSSAiLi4vLi4vaW5jbHVkZSIgL0kgIi4uLy4uL29zL3dpbjMyIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiX1VTUkRMTCIgL1lYIC9GRCAvR1ogL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJEZWJ1Zy9tb2RfbWVtX2NhY2hlLnNvIiAvcGRidHlwZTpzZXB0Ci0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJtb2RfbWVtX2NhY2hlIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAibW9kX21lbV9jYWNoZSAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZF9tZW1fY2FjaGUuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kX2NhY2hlLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIgotIyBFbmQgR3JvdXAKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9leHBlcmltZW50YWwvdXRpbF9sZGFwLmMgYi9tb2R1bGVzL2V4cGVyaW1lbnRhbC91dGlsX2xkYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU5Y2EwZS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2V4cGVyaW1lbnRhbC91dGlsX2xkYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDExMDUgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi0vKgotICogdXRpbF9sZGFwLmM6IExEQVAgdGhpbmdzCi0gKiAKLSAqIE9yaWdpbmFsIGNvZGUgZnJvbSBhdXRoX2xkYXAgbW9kdWxlIGZvciBBcGFjaGUgdjEuMzoKLSAqIENvcHlyaWdodCAxOTk4LCAxOTk5IEVuYnJpZGdlIFBpcGVsaW5lcyBJbmMuIAotICogQ29weXJpZ2h0IDE5OTktMjAwMSBEYXZlIENhcnJpZ2FuCi0gKi8KLQotI2luY2x1ZGUgPGFwcl9sZGFwLmg+Ci0KLSNpZmRlZiBBUFVfSEFTX0xEQVAKLQotI2luY2x1ZGUgPGFwcl9sb2NrLmg+Ci0jaW5jbHVkZSA8YXByX3N0cmluZ3MuaD4KLQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLSNpbmNsdWRlICJ1dGlsX2xkYXAuaCIKLSNpbmNsdWRlICJ1dGlsX2xkYXBfY2FjaGUuaCIKLQotI2lmIEFQUl9IQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotbW9kdWxlIEFQX01PRFVMRV9ERUNMQVJFX0RBVEEgbGRhcF9tb2R1bGU7Ci0KLWludCB1dGlsX2xkYXBfaGFuZGxlcihyZXF1ZXN0X3JlYyAqcik7Ci12b2lkICp1dGlsX2xkYXBfY3JlYXRlX2NvbmZpZyhhcHJfcG9vbF90ICpwLCBzZXJ2ZXJfcmVjICpzKTsKLQotCi0vKgotICogU29tZSBkZWZpbml0aW9ucyB0byBoZWxwIGJldHdlZW4gdmFyaW91cyB2ZXJzaW9ucyBvZiBhcGFjaGUuCi0gKi8KLQotI2lmbmRlZiBET0NUWVBFX0hUTUxfMl8wCi0jZGVmaW5lIERPQ1RZUEVfSFRNTF8yXzAgICI8IURPQ1RZUEUgSFRNTCBQVUJMSUMgXCItLy9JRVRGLy8iIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkRURCBIVE1MIDIuMC8vRU5cIj5cbiIKLSNlbmRpZgotCi0jaWZuZGVmIERPQ1RZUEVfSFRNTF8zXzIKLSNkZWZpbmUgRE9DVFlQRV9IVE1MXzNfMiAgIjwhRE9DVFlQRSBIVE1MIFBVQkxJQyBcIi0vL1czQy8vIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJEVEQgSFRNTCAzLjIgRmluYWwvL0VOXCI+XG4iCi0jZW5kaWYKLQotI2lmbmRlZiBET0NUWVBFX0hUTUxfNF8wUwotI2RlZmluZSBET0NUWVBFX0hUTUxfNF8wUyAiPCFET0NUWVBFIEhUTUwgUFVCTElDIFwiLS8vVzNDLy8iIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkRURCBIVE1MIDQuMC8vRU5cIlxuIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJcImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvc3RyaWN0LmR0ZFwiPlxuIgotI2VuZGlmCi0KLSNpZm5kZWYgRE9DVFlQRV9IVE1MXzRfMFQKLSNkZWZpbmUgRE9DVFlQRV9IVE1MXzRfMFQgIjwhRE9DVFlQRSBIVE1MIFBVQkxJQyBcIi0vL1czQy8vIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJEVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTlwiXG4iIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9sb29zZS5kdGRcIj5cbiIKLSNlbmRpZgotCi0jaWZuZGVmIERPQ1RZUEVfSFRNTF80XzBGCi0jZGVmaW5lIERPQ1RZUEVfSFRNTF80XzBGICI8IURPQ1RZUEUgSFRNTCBQVUJMSUMgXCItLy9XM0MvLyIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAiRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTlwiXG4iIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9mcmFtZXNldC5kdGRcIj5cbiIKLSNlbmRpZgotCi0vKgotICogU3RhdHVzIEhhbmRsZXIKLSAqIC0tLS0tLS0tLS0tLS0tCi0gKgotICogVGhpcyBoYW5kbGVyIGdlbmVyYXRlcyBhIHN0YXR1cyBwYWdlIGFib3V0IHRoZSBjdXJyZW50IHBlcmZvcm1hbmNlIG9mCi0gKiB0aGUgTERBUCBjYWNoZS4gSXQgaXMgZW5hYmxlZCBhcyBmb2xsb3dzOgotICoKLSAqIDxMb2NhdGlvbiAvbGRhcC1zdGF0dXM+Ci0gKiAgIFNldEhhbmRsZXIgbGRhcC1zdGF0dXMKLSAqIDwvTG9jYXRpb24+Ci0gKgotICovCi1pbnQgdXRpbF9sZGFwX2hhbmRsZXIocmVxdWVzdF9yZWMgKnIpCi17Ci0KLSAgICByLT5hbGxvd2VkIHw9ICgxIDw8IE1fR0VUKTsKLSAgICBpZiAoci0+bWV0aG9kX251bWJlciAhPSBNX0dFVCkKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotCi0gICAgaWYgKHN0cmNtcChyLT5oYW5kbGVyLCAibGRhcC1zdGF0dXMiKSkgewotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgfQotCi0gICAgci0+Y29udGVudF90eXBlID0gInRleHQvaHRtbCI7Ci0gICAgaWYgKHItPmhlYWRlcl9vbmx5KQotICAgICAgICByZXR1cm4gT0s7Ci0KLSAgICBhcF9ycHV0cyhET0NUWVBFX0hUTUxfM18yCi0gICAgICAgICAgICAgIjxodG1sPjxoZWFkPjx0aXRsZT5MREFQIENhY2hlIEluZm9ybWF0aW9uPC90aXRsZT48L2hlYWQ+XG4iLCByKTsKLSAgICBhcF9ycHV0cygiPGJvZHkgYmdjb2xvcj0nI2ZmZmZmZic+PGgxIGFsaWduPWNlbnRlcj5MREFQIENhY2hlIEluZm9ybWF0aW9uPC9oMT5cbiIsIHIpOwotCi0gICAgYXBfcnB1dHMoIjxwPlxuIgotICAgICAgICAgICAgICI8dGFibGUgYm9yZGVyPScwJz5cbiIKLSAgICAgICAgICAgICAiPHRyIGJnY29sb3I9JyMwMDAwMDAnPlxuIgotICAgICAgICAgICAgICI8dGQ+PGZvbnQgc2l6ZT0nLTEnIGZhY2U9J0FyaWFsLEhlbHZldGljYScgY29sb3I9JyNmZmZmZmYnPjxiPkNhY2hlIE5hbWU8L2I+PC9mb250PjwvdGQ+IgotICAgICAgICAgICAgICI8dGQ+PGZvbnQgc2l6ZT0nLTEnIGZhY2U9J0FyaWFsLEhlbHZldGljYScgY29sb3I9JyNmZmZmZmYnPjxiPkVudHJpZXM8L2I+PC9mb250PjwvdGQ+IgotICAgICAgICAgICAgICI8dGQ+PGZvbnQgc2l6ZT0nLTEnIGZhY2U9J0FyaWFsLEhlbHZldGljYScgY29sb3I9JyNmZmZmZmYnPjxiPkF2Zy4gQ2hhaW4gTGVuLjwvYj48L2ZvbnQ+PC90ZD4iCi0gICAgICAgICAgICAgIjx0ZCBjb2xzcGFuPScyJz48Zm9udCBzaXplPSctMScgZmFjZT0nQXJpYWwsSGVsdmV0aWNhJyBjb2xvcj0nI2ZmZmZmZic+PGI+SGl0czwvYj48L2ZvbnQ+PC90ZD4iCi0gICAgICAgICAgICAgIjx0ZD48Zm9udCBzaXplPSctMScgZmFjZT0nQXJpYWwsSGVsdmV0aWNhJyBjb2xvcj0nI2ZmZmZmZic+PGI+SW5zL1JlbTwvYj48L2ZvbnQ+PC90ZD4iCi0gICAgICAgICAgICAgIjx0ZCBjb2xzcGFuPScyJz48Zm9udCBzaXplPSctMScgZmFjZT0nQXJpYWwsSGVsdmV0aWNhJyBjb2xvcj0nI2ZmZmZmZic+PGI+UHVyZ2VzPC9iPjwvZm9udD48L3RkPiIKLSAgICAgICAgICAgICAiPHRkPjxmb250IHNpemU9Jy0xJyBmYWNlPSdBcmlhbCxIZWx2ZXRpY2EnIGNvbG9yPScjZmZmZmZmJz48Yj5BdmcgUHVyZ2UgVGltZTwvYj48L2ZvbnQ+PC90ZD4iCi0gICAgICAgICAgICAgIjwvdHI+XG4iLCByCi0gICAgICAgICAgICApOwotCi0gICAgYXBfcnB1dHModXRpbF9hbGRfY2FjaGVfZGlzcGxheShyLT5wb29sKSwgcik7Ci0KLSAgICBhcF9ycHV0cygiPC90YWJsZT5cbjwvcD5cbiIsIHIpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotCi0vKgotICogQ2xvc2VzIGFuIExEQVAgY29ubmVjdGlvbiBieSB1bmxvY2tpbmcgaXQuIFRoZSBuZXh0IHRpbWUKLSAqIHV0aWxfbGRhcF9jb25uZWN0aW9uX2ZpbmQoKSBpcyBjYWxsZWQgdGhpcyBjb25uZWN0aW9uIHdpbGwgYmUKLSAqIGF2YWlsYWJsZSBmb3IgcmV1c2UuCi0gKi8KLXZvaWQgdXRpbF9sZGFwX2Nvbm5lY3Rpb25fY2xvc2UodXRpbF9sZGFwX2Nvbm5lY3Rpb25fdCAqbGRjKQotewotCi0gICAgLyoKLSAgICAgKiBRVUVTVElPTjoKLSAgICAgKgotICAgICAqIElzIGl0IHNhZmUgbGVhdmluZyBib3VuZCBjb25uZWN0aW9ucyBmbG9hdGluZyBhcm91bmQgYmV0d2VlbiB0aGUKLSAgICAgKiBkaWZmZXJlbnQgbW9kdWxlcz8gS2VlcGluZyB0aGUgdXNlciBib3VuZCBpcyBhIHBlcmZvcm1hbmNlIGJvb3N0LAotICAgICAqIGJ1dCBpdCBpcyBhbHNvIGEgcG90ZW50aWFsIHNlY3VyaXR5IHByb2JsZW0gLSBtYXliZS4KLSAgICAgKgotICAgICAqIEZvciBub3cgd2UgdW5iaW5kIHRoZSB1c2VyIHdoZW4gd2UgZmluaXNoIHdpdGggYSBjb25uZWN0aW9uLCBidXQKLSAgICAgKiB3ZSBkb24ndCBoYXZlIHRvLi4uCi0gICAgICovCi0KLSAgICAvKiBtYXJrIG91ciBjb25uZWN0aW9uIGFzIGF2YWlsYWJsZSBmb3IgcmV1c2UgKi8KLSAgICBhcHJfbG9ja19yZWxlYXNlKGxkYy0+bG9jayk7Ci0KLX0KLQotCi0vKgotICogRGVzdHJveXMgYW4gTERBUCBjb25uZWN0aW9uIGJ5IHVuYmluZGluZy4gVGhpcyBmdW5jdGlvbiBpcyByZWdpc3RlcmVkCi0gKiB3aXRoIHRoZSBwb29sIGNsZWFudXAgZnVuY3Rpb24gLSBjYXVzaW5nIHRoZSBMREFQIGNvbm5lY3Rpb25zIHRvIGJlCi0gKiBzaHV0IGRvd24gY2xlYW5seSBvbiBncmFjZWZ1bCByZXN0YXJ0LgotICovCi1hcHJfc3RhdHVzX3QgdXRpbF9sZGFwX2Nvbm5lY3Rpb25fZGVzdHJveSh2b2lkICpwYXJhbSkKLXsKLSAgICB1dGlsX2xkYXBfY29ubmVjdGlvbl90ICpsZGMgPSBwYXJhbTsKLQotICAgIC8qIHVuYmluZGluZyBmcm9tIHRoZSBMREFQIHNlcnZlciAqLwotICAgIGlmIChsZGMtPmxkYXApIHsKLSAgICAgICAgbGRhcF91bmJpbmRfcyhsZGMtPmxkYXApOwotICAgICAgICBsZGMtPmJvdW5kID0gMDsKLSAgICAgICAgbGRjLT5sZGFwID0gTlVMTDsKLSAgICB9Ci0KLSAgICAvKiByZWxlYXNlIHRoZSBsb2NrIHdlIHdlcmUgdXNpbmcgKi8KLSAgICBhcHJfbG9ja19yZWxlYXNlKGxkYy0+bG9jayk7Ci0KLSAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci19Ci0KLQotLyoKLSAqIENvbm5lY3QgdG8gdGhlIExEQVAgc2VydmVyIGFuZCBiaW5kcy4gRG9lcyBub3QgY29ubmVjdCBpZiBhbHJlYWR5Ci0gKiBjb25uZWN0ZWQgKGkuZS4gbGRjLT5sZGFwIGlzIG5vbi1OVUxMLikgRG9lcyBub3QgYmluZCBpZiBhbHJlYWR5IGJvdW5kLgotICoKLSAqIFJldHVybnMgTERBUF9TVUNDRVNTIG9uIHN1Y2Nlc3M7IGFuZCBhbiBlcnJvciBjb2RlIG9uIGZhaWx1cmUKLSAqLwotaW50IHV0aWxfbGRhcF9jb25uZWN0aW9uX29wZW4odXRpbF9sZGFwX2Nvbm5lY3Rpb25fdCAqbGRjKQotewotICAgIGludCByZXN1bHQgPSAwOwotICAgIGludCBmYWlsdXJlcyA9IDA7Ci0KLQotc3RhcnRfb3ZlcjoKLSAgICBpZiAoZmFpbHVyZXMrKyA+IDEwKSB7Ci0JLyogdG9vIG1hbnkgZmFpbHVyZXMgLSBsZWF2ZSAqLwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIGlmICghbGRjLT5sZGFwKSB7Ci0gICAgICAgIGxkYy0+Ym91bmQgPSAwOwotCi0JLyogb3BlbmluZyBjb25uZWN0aW9uIHRvIExEQVAgc2VydmVyICovCi0gICAgICAgIGlmICgobGRjLT5sZGFwID0gbGRhcF9pbml0KGxkYy0+aG9zdCwgbGRjLT5wb3J0KSkgPT0gTlVMTCkgewotCSAgICAvKiBjb3VsZG4ndCBjb25uZWN0ICovCi0gICAgICAgICAgICBsZGMtPnJlYXNvbiA9ICJsZGFwX2luaXQoKSBmYWlsZWQiOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLQkvKiBhZGQgdGhlIGNsZWFudXAgdG8gdGhlIHBvb2wgKi8KLSAgICAgICAgYXByX3Bvb2xfY2xlYW51cF9yZWdpc3RlcihsZGMtPnBvb2wsIGxkYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsX2xkYXBfY29ubmVjdGlvbl9kZXN0cm95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcl9wb29sX2NsZWFudXBfbnVsbCk7Ci0KLSAgICAgICAgLyogU2V0IHRoZSBhbGlhcyBkZXJlZmVyZW5jaW5nIG9wdGlvbiAqLwotI2lmIExEQVBfVkVSU0lPTl9NQVggPT0gMgotICAgICAgICBsZGMtPmxkYXAtPmxkX2RlcmVmID0gbGRjLT5kZXJlZjsKLSNlbHNlCi0gICAgICAgIHJlc3VsdCA9IGxkYXBfc2V0X29wdGlvbihsZGMtPmxkYXAsIExEQVBfT1BUX0RFUkVGLCAmKGxkYy0+ZGVyZWYpKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBMREFQX1NVQ0NFU1MpIHsKLQkgICAgLyogc2V0dGluZyBMREFQIGRlcmVmZXJlbmNlIG9wdGlvbiBmYWlsZWQgKi8KLQkgICAgLyogd2UgaWdub3JlIHRoaXMgZXJyb3IgKi8KLSAgICAgICAgfQotI2VuZGlmIC8qIExEQVBfVkVSU0lPTl9NQVggKi8KLQotI2lmZGVmIEFQVV9IQVNfTERBUF9ORVRTQ0FQRV9TU0wKLSAgICAgICAgaWYgKGxkYy0+bmV0c2NhcGVzc2wpIHsKLSAgICAgICAgICAgIGlmICghbGRjLT5jZXJ0ZGIpIHsKLQkJLyogc2VjdXJlIExEQVAgcmVxdWVzdGVkLCBidXQgbm8gQ0EgY2VydCBkZWZpbmVkICovCi0gICAgICAgICAgICAgICAgbGRjLT5yZWFzb24gPSAic2VjdXJlIExEQVAgcmVxdWVzdGVkLCBidXQgbm8gQ0EgY2VydCBkZWZpbmVkIjsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxkYXBzc2xfaW5zdGFsbF9yb3V0aW5lcyhsZGMtPmxkYXApOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gTERBUF9TVUNDRVNTKSB7Ci0JCSAgICAvKiBTU0wgaW5pdGlhbGlzYXRpb24gZmFpbGVkICovCi0gICAgICAgICAgICAgICAgICAgIGxkYy0+cmVhc29uID0gImxkYXBzc2xfaW5zdGFsbF9yb3V0aW5lcygpIGZhaWxlZCI7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxkYXBfc2V0X29wdGlvbihsZGMtPmxkYXAsIExEQVBfT1BUX1NTTCwgTERBUF9PUFRfT04pOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gTERBUF9TVUNDRVNTKSB7Ci0JCSAgICAvKiBTU0wgb3B0aW9uIGZhaWxlZCAqLwotICAgICAgICAgICAgICAgICAgICBsZGMtPnJlYXNvbiA9ICJsZGFwX3NldF9vcHRpb24oKSBmYWlsZWQgdHJ5aW5nIHRvIHNldCBMREFQX09QVF9TU0wiOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2VuZGlmIC8qIEFQVV9IQVNfTERBUF9ORVRTQ0FQRV9TU0wgKi8KLQotI2lmZGVmIEFQVV9IQVNfTERBUF9TVEFSVFRMUwotICAgICAgICBpZiAobGRjLT5zdGFydHRscykgewotICAgICAgICAgICAgaW50IHZlcnNpb24gPSBMREFQX1ZFUlNJT04zOwotCi0gICAgICAgICAgICAvKiBBbHNvIHdlIGhhdmUgdG8gc2V0IHRoZSBjb25uZWN0aW9uIHRvIHVzZSBwcm90b2NvbCB2ZXJzaW9uIDMsCi0gICAgICAgICAgICAgKiBzaW5jZSB3ZSdyZSB1c2luZyBUTFMuICovCi0gICAgICAgICAgICBpZiAoKHJlc3VsdCA9IGxkYXBfc2V0X29wdGlvbihsZGMtPmxkYXAsIExEQVBfT1BUX1BST1RPQ09MX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZXJzaW9uKSkgIT0gTERBUF9TVUNDRVNTKSB7Ci0JCS8qIHNldHRpbmcgTERBUCB2ZXJzaW9uIGZhaWxlZCAtIGlnbm9yZSBlcnJvciAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiAKLSAgICAgICAgICAgICAqIEluIHV0aWxfbGRhcF9jb25uZWN0aW9uX2ZpbmQsIHdlIGNvbXBhcmUgbGRjLT53aXRodGxzIHRvCi0gICAgICAgICAgICAgKiBzZWMtPnN0YXJ0dGxzIHRvIHNlZSBpZiB3ZSBoYXZlIGEgY2FjaGUgbWF0Y2guIE9uIHRoZSBvZmYKLSAgICAgICAgICAgICAqIGNoYW5jZSB0aGF0IGFwYWNoZSdzIGNvbmZpZyBwcm9jZXNzaW5nIHJvdGluZXMgc2V0IHN0YXJ0dGxzIHRvCi0gICAgICAgICAgICAgKiBzb21lIG90aGVyIHRydWUgdmFsdWUgYmVzaWRlcyAxLCB3ZSBzZXQgaXQgdG8gMSBoZXJlIHRvIGVuc3VyZQotICAgICAgICAgICAgICogdGhhdCB0aGUgY29tcGFyaXNvbiBzdWNjZWVkcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbGRjLT5zdGFydHRscyA9IDE7Ci0KLSAgICAgICAgICAgIHJlc3VsdCA9IGxkYXBfc3RhcnRfdGxzX3MobGRjLT5sZGFwLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gTERBUF9TVUNDRVNTKSB7Ci0JCS8qIHN0YXJ0IFRMUyBmYWlsZWQgKi8KLQkJbGRjLT53aXRodGxzID0gMDsKLSAgICAgICAgICAgICAgICBsZGMtPnJlYXNvbiA9ICJsZGFwX3N0YXJ0X3Rsc19zKCkgZmFpbGVkIjsKLQkgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsZGMtPndpdGh0bHMgPSAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGRjLT53aXRodGxzID0gMDsKLSAgICAgICAgfQotI2VuZGlmIC8qIEFQVV9IQVNfTERBUF9TVEFSVFRMUyAqLwotICAgIH0KLQotICAgIC8qIAotICAgICAqIEF0IHRoaXMgcG9pbnQgdGhlIExEQVAgY29ubmVjdGlvbiBpcyBndWFyYW50ZWVkIGFsaXZlLiBJZiBib3VuZCBzYXlzCi0gICAgICogdGhhdCB3ZSdyZSBib3VuZCBhbHJlYWR5LCB3ZSBjYW4ganVzdCByZXR1cm4uCi0gICAgICovCi0gICAgaWYgKGxkYy0+Ym91bmQpIHsKLSAgICAgICAgbGRjLT5yZWFzb24gPSAiTERBUCBjb25uZWN0aW9uIG9wZW4gc3VjY2Vzc2Z1bCAoYWxyZWFkeSBib3VuZCkiOwotICAgICAgICByZXR1cm4gTERBUF9TVUNDRVNTOwotICAgIH0KLQotICAgIC8qIAotICAgICAqIE5vdyBiaW5kIHdpdGggdGhlIHVzZXJuYW1lL3Bhc3N3b3JkIHByb3ZpZGVkIGJ5IHRoZQotICAgICAqIGNvbmZpZ3VyYXRpb24uIEl0IHdpbGwgYmUgYW4gYW5vbnltb3VzIGJpbmQgaWYgbm8gdS9wIHdhcwotICAgICAqIHByb3ZpZGVkLiAKLSAgICAgKi8KLSAgICBpZiAoKHJlc3VsdCA9IGxkYXBfc2ltcGxlX2JpbmRfcyhsZGMtPmxkYXAsIGxkYy0+YmluZGRuLCBsZGMtPmJpbmRwdykpCi0gICAgICAgID09IExEQVBfU0VSVkVSX0RPV04pIHsKLQkvKiBjb3VsZG4ndCBjb25uZWN0IC0gdHJ5IGFnYWluICovCi0gICAgICAgIGxkYy0+cmVhc29uID0gImxkYXBfc2ltcGxlX2JpbmRfcygpIGZhaWxlZCB3aXRoIHNlcnZlciBkb3duIjsKLSAgICAgICAgZ290byBzdGFydF9vdmVyOwotICAgIH0KLQotICAgIGlmIChyZXN1bHQgIT0gTERBUF9TVUNDRVNTKSB7Ci0JLyogTERBUCBmYXRhbCBlcnJvciBvY2N1cmVkICovCi0gICAgICAgIGxkYy0+cmVhc29uID0gImxkYXBfc2ltcGxlX2JpbmRfcygpIGZhaWxlZCI7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyogbm90ZSBob3cgd2UgYXJlIGJvdW5kICovCi0gICAgbGRjLT5ib3VuZCA9IDE7Ci0KLSAgICBsZGMtPnJlYXNvbiA9ICJMREFQIGNvbm5lY3Rpb24gb3BlbiBzdWNjZXNzZnVsIjsKLSAgICByZXR1cm4gTERBUF9TVUNDRVNTOwotfQotCi0KLS8qCi0gKiBGaW5kIGFuIGV4aXN0aW5nIGxkYXAgY29ubmVjdGlvbiBzdHJ1Y3QgdGhhdCBtYXRjaGVzIHRoZQotICogcHJvdmlkZWQgbGRhcCBjb25uZWN0aW9uIHBhcmFtZXRlcnMuCi0gKgotICogSWYgbm90IGZvdW5kIGluIHRoZSBjYWNoZSwgYSBuZXcgbGRjIHN0cnVjdHVyZSB3aWxsIGJlIGFsbG9jYXRlZCBmcm9tIHN0LT5wb29sCi0gKiBhbmQgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4gSWYgZm91bmQgaW4gdGhlIGNhY2hlLCBhIHBvaW50ZXIgdG8gdGhlIGV4aXN0aW5nCi0gKiBsZGMgc3RydWN0dXJlIHdpbGwgYmUgcmV0dXJuZWQuCi0gKi8KLXV0aWxfbGRhcF9jb25uZWN0aW9uX3QgKnV0aWxfbGRhcF9jb25uZWN0aW9uX2ZpbmQocmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJpbmRkbiwgY29uc3QgY2hhciAqYmluZHB3LCBkZXJlZl9vcHRpb25zIGRlcmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXRzY2FwZXNzbCwgaW50IHN0YXJ0dGxzKQotewotICAgIHN0cnVjdCB1dGlsX2xkYXBfY29ubmVjdGlvbl90ICpsLCAqcDsJLyogVG8gdHJhdmVyc2UgdGhlIGxpbmtlZCBsaXN0ICovCi0KLSAgICB1dGlsX2xkYXBfc3RhdGVfdCAqc3QgPSAKLSAgICAgICAgKHV0aWxfbGRhcF9zdGF0ZV90ICopYXBfZ2V0X21vZHVsZV9jb25maWcoci0+c2VydmVyLT5tb2R1bGVfY29uZmlnLAotICAgICAgICAmbGRhcF9tb2R1bGUpOwotCi0KLSAgICAvKiBtdXRleCBsb2NrIHRoaXMgZnVuY3Rpb24gKi8KLSAgICBpZiAoIXN0LT5tdXRleCkgewotICAgICAgICBhcHJfbG9ja19jcmVhdGUoJnN0LT5tdXRleCwgQVBSX01VVEVYLCBBUFJfSU5UUkFQUk9DRVNTLCBOVUxMLCBzdC0+cG9vbCk7Ci0gICAgfQotICAgIGFwcl9sb2NrX2FjcXVpcmUoc3QtPm11dGV4KTsKLQotICAgIC8qIFNlYXJjaCBmb3IgYW4gZXhhY3QgY29ubmVjdGlvbiBtYXRjaCBpbiB0aGUgbGlzdCB0aGF0IGlzIG5vdAotICAgICAqIGJlaW5nIHVzZWQuCi0gICAgICovCi0gICAgZm9yIChsPXN0LT5jb25uZWN0aW9ucyxwPU5VTEw7IGw7IGw9bC0+bmV4dCkgewotICAgICAgICBpZiAoIChBUFJfU1VDQ0VTUyA9PSBhcHJfbG9ja190cnlhY3F1aXJlKGwtPmxvY2spKQotICAgICAgICAgICAgJiYgbC0+cG9ydCA9PSBwb3J0Ci0JICAgICYmIHN0cmNtcChsLT5ob3N0LCBob3N0KSA9PSAwCi0JICAgICYmICggKCFsLT5iaW5kZG4gJiYgIWJpbmRkbikgfHwgKGwtPmJpbmRkbiAmJiBiaW5kZG4gJiYgIXN0cmNtcChsLT5iaW5kZG4sIGJpbmRkbikpICkKLQkgICAgJiYgKCAoIWwtPmJpbmRwdyAmJiAhYmluZHB3KSB8fCAobC0+YmluZHB3ICYmIGJpbmRwdyAmJiAhc3RyY21wKGwtPmJpbmRwdywgYmluZHB3KSkgKQotICAgICAgICAgICAgJiYgbC0+ZGVyZWYgPT0gZGVyZWYKLSNpZmRlZiBBUFVfSEFTX0xEQVBfTkVUU0NBUEVfU1NMCi0gICAgICAgICAgICAmJiBsLT5uZXRzY2FwZXNzbCA9PSBuZXRzY2FwZXNzbAotI2VuZGlmCi0jaWZkZWYgQVBVX0hBU19MREFQX1NUQVJUVExTCi0JICAgICYmIGwtPndpdGh0bHMgPT0gc3RhcnR0bHMKLSNlbmRpZgotICAgICAgICAgICAgKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHAgPSBsOwotICAgIH0KLQotICAgIC8qIElmIG5vdGhpbmcgZm91bmQsIHNlYXJjaCBhZ2FpbiwgYnV0IHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlCi0gICAgICogYmluZGRuIGFuZCBiaW5kcHcgdGhpcyB0aW1lLgotICAgICAqLwotICAgIGlmICghbCkgewotICAgICAgICBmb3IgKGw9c3QtPmNvbm5lY3Rpb25zLHA9TlVMTDsgbDsgbD1sLT5uZXh0KSB7Ci0gICAgICAgICAgICBpZiAoIChBUFJfU1VDQ0VTUyA9PSBhcHJfbG9ja190cnlhY3F1aXJlKGwtPmxvY2spKQotICAgICAgICAgICAgICAgICYmIGwtPnBvcnQgPT0gcG9ydAotCSAgICAgICAgJiYgc3RyY21wKGwtPmhvc3QsIGhvc3QpID09IDAKLSAgICAgICAgICAgICAgICAmJiBsLT5kZXJlZiA9PSBkZXJlZgotI2lmZGVmIEFQVV9IQVNfTERBUF9ORVRTQ0FQRV9TU0wKLSAgICAgICAgICAgICAgICAmJiBsLT5uZXRzY2FwZXNzbCA9PSBuZXRzY2FwZXNzbAotI2VuZGlmCi0jaWZkZWYgQVBVX0hBU19MREFQX1NUQVJUVExTCi0gICAgICAgICAgICAgICAgJiYgbC0+d2l0aHRscyA9PSBzdGFydHRscwotI2VuZGlmCi0gICAgICAgICAgICAgICAgKSB7Ci0gICAgICAgICAgICAgICAgLyogdGhlIGJpbmQgY3JlZGVudGlhbHMgaGF2ZSBjaGFuZ2VkICovCi0gICAgICAgICAgICAgICAgbC0+Ym91bmQgPSAwOwotICAgICAgICAgICAgICAgIGwtPmJpbmRkbiA9IGFwcl9wc3RyZHVwKHN0LT5wb29sLCBiaW5kZG4pOwotICAgICAgICAgICAgICAgIGwtPmJpbmRwdyA9IGFwcl9wc3RyZHVwKHN0LT5wb29sLCBiaW5kcHcpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcCA9IGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLS8qIGFydGlmaWNpYWxseSBkaXNhYmxlIGNhY2hlICovCi0vL2wgPSBOVUxMOwotCi0gICAgLyogSWYgbm8gY29ubmVjdGlvbiB3aGF0IGZvdW5kIGFmdGVyIHRoZSBzZWNvbmQgc2VhcmNoLCB3ZQotICAgICAqIG11c3QgY3JlYXRlIG9uZS4KLSAgICAgKi8KLSAgICBpZiAoIWwpIHsKLQotICAgICAgICAvKiAKLSAgICAgICAgICogQWRkIHRoZSBuZXcgY29ubmVjdGlvbiBlbnRyeSB0byB0aGUgbGlua2VkIGxpc3QuIE5vdGUgdGhhdCB3ZQotICAgICAgICAgKiBkb24ndCBhY3R1YWxseSBlc3RhYmxpc2ggYW4gTERBUCBjb25uZWN0aW9uIHlldDsgdGhhdCBoYXBwZW5zCi0gICAgICAgICAqIHRoZSBmaXJzdCB0aW1lIGF1dGhlbnRpY2F0aW9uIGlzIHJlcXVlc3RlZC4KLSAgICAgICAgICovCi0gICAgICAgIC8qIGNyZWF0ZSB0aGUgZGV0YWlscyB0byB0aGUgcG9vbCBpbiBzdCAqLwotICAgICAgICBsID0gYXByX3BjYWxsb2Moc3QtPnBvb2wsIHNpemVvZih1dGlsX2xkYXBfY29ubmVjdGlvbl90KSk7Ci0gICAgICAgIGFwcl9sb2NrX2NyZWF0ZSgmbC0+bG9jaywgQVBSX01VVEVYLCBBUFJfSU5UUkFQUk9DRVNTLCBOVUxMLCBzdC0+cG9vbCk7Ci0gICAgICAgIGFwcl9sb2NrX2FjcXVpcmUobC0+bG9jayk7Ci0gICAgICAgIGwtPnBvb2wgPSBzdC0+cG9vbDsKLSAgICAgICAgbC0+Ym91bmQgPSAwOwotICAgICAgICBsLT5ob3N0ID0gYXByX3BzdHJkdXAoc3QtPnBvb2wsIGhvc3QpOwotICAgICAgICBsLT5wb3J0ID0gcG9ydDsKLSAgICAgICAgbC0+ZGVyZWYgPSBkZXJlZjsKLSAgICAgICAgbC0+YmluZGRuID0gYXByX3BzdHJkdXAoc3QtPnBvb2wsIGJpbmRkbik7Ci0gICAgICAgIGwtPmJpbmRwdyA9IGFwcl9wc3RyZHVwKHN0LT5wb29sLCBiaW5kcHcpOwotICAgICAgICBsLT5uZXRzY2FwZXNzbCA9IG5ldHNjYXBlc3NsOwotICAgICAgICBsLT5zdGFydHRscyA9IHN0YXJ0dGxzOwotICAgICAgICBsLT53aXRodGxzID0gMDsKLQotICAgICAgICBpZiAocCkgewotICAgICAgICAgICAgcC0+bmV4dCA9IGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzdC0+Y29ubmVjdGlvbnMgPSBsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXByX2xvY2tfcmVsZWFzZShzdC0+bXV0ZXgpOwotICAgIHJldHVybiBsOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoKLSAqIENvbXBhcmVzIHR3byBETnMgdG8gc2VlIGlmIHRoZXkncmUgZXF1YWwuIFRoZSBvbmx5IHdheSB0byBkbyB0aGlzIGNvcnJlY3RseSBpcyB0byAKLSAqIHNlYXJjaCBmb3IgdGhlIGRuIGFuZCB0aGVuIGRvIGxkYXBfZ2V0X2RuKCkgb24gdGhlIHJlc3VsdC4gVGhpcyBzaG91bGQgbWF0Y2ggdGhlIAotICogaW5pdGlhbCBkbiwgc2luY2UgaXQgd291bGQgaGF2ZSBiZWVuIGFsc28gcmV0cmlldmVkIHdpdGggbGRhcF9nZXRfZG4oKS4gVGhpcyBpcwotICogZXhwZW5zaXZlLCBzbyBpZiB0aGUgY29uZmlndXJhdGlvbiB2YWx1ZSBjb21wYXJlX2RuX29uX3NlcnZlciBpcwotICogZmFsc2UsIGp1c3QgZG9lcyBhbiBvcmRpbmFyeSBzdHJjbXAuCi0gKgotICogVGhlIGxvY2sgZm9yIHRoZSBsZGFwIGNhY2hlIHNob3VsZCBhbHJlYWR5IGJlIGFjcXVpcmVkLgotICovCi1pbnQgdXRpbF9sZGFwX2NhY2hlX2NvbXBhcmVkbihyZXF1ZXN0X3JlYyAqciwgdXRpbF9sZGFwX2Nvbm5lY3Rpb25fdCAqbGRjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IGNoYXIgKmRuLCBjb25zdCBjaGFyICpyZXFkbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBhcmVfZG5fb25fc2VydmVyKQotewotICAgIGludCByZXN1bHQgPSAwOwotICAgIHV0aWxfdXJsX25vZGVfdCAqY3VybDsgCi0gICAgdXRpbF91cmxfbm9kZV90IGN1cm5vZGU7Ci0gICAgdXRpbF9kbl9jb21wYXJlX25vZGVfdCAqbm9kZTsKLSAgICB1dGlsX2RuX2NvbXBhcmVfbm9kZV90IG5ld25vZGU7Ci0gICAgaW50IGZhaWx1cmVzID0gMDsKLSAgICBMREFQTWVzc2FnZSAqcmVzLCAqZW50cnk7Ci0gICAgY2hhciAqc2VhcmNoZG47Ci0KLSAgICB1dGlsX2xkYXBfc3RhdGVfdCAqc3QgPSAKLSAgICAgICAgKHV0aWxfbGRhcF9zdGF0ZV90ICopYXBfZ2V0X21vZHVsZV9jb25maWcoci0+c2VydmVyLT5tb2R1bGVfY29uZmlnLAotICAgICAgICAmbGRhcF9tb2R1bGUpOwotCi0KLSAgICAvKiByZWFkIGxvY2sgdGhpcyBmdW5jdGlvbiAqLwotICAgIGlmICghdXRpbF9sZGFwX2NhY2hlX2xvY2spIHsKLSAgICAgICAgYXByX2xvY2tfY3JlYXRlKCZ1dGlsX2xkYXBfY2FjaGVfbG9jaywgQVBSX1JFQURXUklURSwgQVBSX0lOVFJBUFJPQ0VTUywgTlVMTCwgc3QtPnBvb2wpOwotICAgIH0KLQotICAgIC8qIGdldCBjYWNoZSBlbnRyeSAob3IgY3JlYXRlIG9uZSkgKi8KLSAgICBhcHJfbG9ja19hY3F1aXJlX3J3KHV0aWxfbGRhcF9jYWNoZV9sb2NrLCBBUFJfV1JJVEVSKTsKLSAgICBjdXJub2RlLnVybCA9IHVybDsKLSAgICBjdXJsID0gdXRpbF9hbGRfY2FjaGVfZmV0Y2godXRpbF9sZGFwX2NhY2hlLCAmY3Vybm9kZSk7Ci0gICAgaWYgKGN1cmwgPT0gTlVMTCkgewotICAgICAgICBjdXJsID0gdXRpbF9hbGRfY3JlYXRlX2NhY2hlcyhzdCwgdXJsKTsKLSAgICB9Ci0gICAgYXByX2xvY2tfcmVsZWFzZSh1dGlsX2xkYXBfY2FjaGVfbG9jayk7Ci0KLSAgICAvKiBhIHNpbXBsZSBjb21wYXJlPyAqLwotICAgIGlmICghY29tcGFyZV9kbl9vbl9zZXJ2ZXIpIHsKLSAgICAgICAgLyogdW5sb2NrIHRoaXMgcmVhZCBsb2NrICovCi0gICAgICAgIGlmIChzdHJjbXAoZG4sIHJlcWRuKSkgewotICAgICAgICAgICAgbGRjLT5yZWFzb24gPSAiRE4gQ29tcGFyaXNvbiBGQUxTRSAoZGlyZWN0IHN0cmNtcCgpKSI7Ci0gICAgICAgICAgICByZXR1cm4gTERBUF9DT01QQVJFX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgbGRjLT5yZWFzb24gPSAiRE4gQ29tcGFyaXNvbiBUUlVFIChkaXJlY3Qgc3RyY21wKCkpIjsKLSAgICAgICAgICAgIHJldHVybiBMREFQX0NPTVBBUkVfVFJVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIG5vIC0gaXQncyBhIHNlcnZlciBzaWRlIGNvbXBhcmUgKi8KLSAgICBhcHJfbG9ja19hY3F1aXJlX3J3KHV0aWxfbGRhcF9jYWNoZV9sb2NrLCBBUFJfUkVBREVSKTsKLQotICAgIC8qIGlzIGl0IGluIHRoZSBjb21wYXJlIGNhY2hlPyAqLwotICAgIG5ld25vZGUucmVxZG4gPSAoY2hhciAqKXJlcWRuOwotICAgIG5vZGUgPSB1dGlsX2FsZF9jYWNoZV9mZXRjaChjdXJsLT5kbl9jb21wYXJlX2NhY2hlLCAmbmV3bm9kZSk7Ci0gICAgaWYgKG5vZGUgIT0gTlVMTCkgewotICAgICAgICAvKiBJZiBpdCdzIGluIHRoZSBjYWNoZSwgaXQncyBnb29kICovCi0gICAgICAgIC8qIHVubG9jayB0aGlzIHJlYWQgbG9jayAqLwotICAgICAgICBhcHJfbG9ja19yZWxlYXNlKHV0aWxfbGRhcF9jYWNoZV9sb2NrKTsKLSAgICAgICAgbGRjLT5yZWFzb24gPSAiRE4gQ29tcGFyaXNvbiBUUlVFIChjYWNoZWQpIjsKLSAgICAgICAgcmV0dXJuIExEQVBfQ09NUEFSRV9UUlVFOwotICAgIH0KLQotICAgIC8qIHVubG9jayB0aGlzIHJlYWQgbG9jayAqLwotICAgIGFwcl9sb2NrX3JlbGVhc2UodXRpbF9sZGFwX2NhY2hlX2xvY2spOwotCi1zdGFydF9vdmVyOgotICAgIGlmIChmYWlsdXJlcysrID4gMTApIHsKLQkvKiB0b28gbWFueSBmYWlsdXJlcyAqLwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qIG1ha2UgYSBzZXJ2ZXIgY29ubmVjdGlvbiAqLwotICAgIGlmIChMREFQX1NVQ0NFU1MgIT0gKHJlc3VsdCA9IHV0aWxfbGRhcF9jb25uZWN0aW9uX29wZW4obGRjKSkpIHsKLQkvKiBjb25uZWN0IHRvIHNlcnZlciBmYWlsZWQgKi8KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKiBzZWFyY2ggZm9yIHJlcWRuICovCi0gICAgaWYgKChyZXN1bHQgPSBsZGFwX3NlYXJjaF9leHRfcyhsZGMtPmxkYXAsIGNvbnN0X2Nhc3QocmVxZG4pLCBMREFQX1NDT1BFX0JBU0UsIAotCQkJCSAgICAiKG9iamVjdGNsYXNzPSopIiwgTlVMTCwgMSwgCi0JCQkJICAgIE5VTEwsIE5VTEwsIE5VTEwsIC0xLCAmcmVzKSkgPT0gTERBUF9TRVJWRVJfRE9XTikgewotICAgICAgICB1dGlsX2xkYXBfY29ubmVjdGlvbl9jbG9zZShsZGMpOwotICAgICAgICBsZGMtPnJlYXNvbiA9ICJETiBDb21wYXJpc29uIGxkYXBfc2VhcmNoX2V4dF9zKCkgZmFpbGVkIHdpdGggc2VydmVyIGRvd24iOwotICAgICAgICBnb3RvIHN0YXJ0X292ZXI7Ci0gICAgfQotICAgIGlmIChyZXN1bHQgIT0gTERBUF9TVUNDRVNTKSB7Ci0gICAgICAgIC8qIHNlYXJjaCBmb3IgcmVxZG4gZmFpbGVkIC0gbm8gbWF0Y2ggKi8KLSAgICAgICAgbGRjLT5yZWFzb24gPSAiRE4gQ29tcGFyaXNvbiBsZGFwX3NlYXJjaF9leHRfcygpIGZhaWxlZCI7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgZW50cnkgPSBsZGFwX2ZpcnN0X2VudHJ5KGxkYy0+bGRhcCwgcmVzKTsKLSAgICBzZWFyY2hkbiA9IGxkYXBfZ2V0X2RuKGxkYy0+bGRhcCwgZW50cnkpOwotCi0gICAgbGRhcF9tc2dmcmVlKHJlcyk7Ci0gICAgaWYgKHN0cmNtcChkbiwgc2VhcmNoZG4pICE9IDApIHsKLSAgICAgICAgLyogY29tcGFyZSB1bnN1Y2Nlc3NmdWwgKi8KLSAgICAgICAgbGRjLT5yZWFzb24gPSAiRE4gQ29tcGFyaXNvbiBGQUxTRSAoY2hlY2tlZCBvbiBzZXJ2ZXIpIjsKLSAgICAgICAgcmVzdWx0ID0gTERBUF9DT01QQVJFX0ZBTFNFOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogY29tcGFyZSBzdWNjZXNzZnVsIC0gYWRkIHRvIHRoZSBjb21wYXJlIGNhY2hlICovCi0gICAgICAgIGFwcl9sb2NrX2FjcXVpcmVfcncodXRpbF9sZGFwX2NhY2hlX2xvY2ssIEFQUl9SRUFERVIpOwotICAgICAgICBuZXdub2RlLnJlcWRuID0gKGNoYXIgKilyZXFkbjsKLSAgICAgICAgbmV3bm9kZS5kbiA9IChjaGFyICopZG47Ci0gICAgICAgIHV0aWxfYWxkX2NhY2hlX2luc2VydChjdXJsLT5kbl9jb21wYXJlX2NhY2hlLCAmbmV3bm9kZSk7Ci0gICAgICAgIGFwcl9sb2NrX3JlbGVhc2UodXRpbF9sZGFwX2NhY2hlX2xvY2spOwotICAgICAgICBsZGMtPnJlYXNvbiA9ICJETiBDb21wYXJpc29uIFRSVUUgKGNoZWNrZWQgb24gc2VydmVyKSI7Ci0gICAgICAgIHJlc3VsdCA9IExEQVBfQ09NUEFSRV9UUlVFOwotICAgIH0KLSAgICBsZGFwX21lbWZyZWUoc2VhcmNoZG4pOwotICAgIHJldHVybiByZXN1bHQ7Ci0KLX0KLQotLyoKLSAqIERvZXMgYW4gZ2VuZXJpYyBsZGFwX2NvbXBhcmUgb3BlcmF0aW9uLiBJdCBhY2NlcHRzIGEgY2FjaGUgdGhhdCBpdCB3aWxsIHVzZQotICogdG8gbG9va3VwIHRoZSBjb21wYXJlIGluIHRoZSBjYWNoZS4gV2UgY2FjaGUgdHdvIGtpbmRzIG9mIGNvbXBhcmVzIAotICogKHJlcXVpcmUgZ3JvdXAgY29tcGFyZXMpIGFuZCAocmVxdWlyZSB1c2VyIGNvbXBhcmVzKS4gRWFjaCBjb21wYXJlIGhhcyBhIGRpZmZlcmVudAotICogY2FjaGUgbm9kZTogcmVxdWlyZSBncm91cCBpbmNsdWRlcyB0aGUgRE47IHJlcXVpcmUgdXNlciBkb2VzIG5vdCBiZWNhdXNlIHRoZQotICogcmVxdWlyZSB1c2VyIGNhY2hlIGlzIG93bmVkIGJ5IHRoZSAKLSAqCi0gKi8KLWludCB1dGlsX2xkYXBfY2FjaGVfY29tcGFyZShyZXF1ZXN0X3JlYyAqciwgdXRpbF9sZGFwX2Nvbm5lY3Rpb25fdCAqbGRjLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IGNoYXIgKmRuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphdHRyaWIsIGNvbnN0IGNoYXIgKnZhbHVlKQotewotICAgIGludCByZXN1bHQgPSAwOwotICAgIHV0aWxfdXJsX25vZGVfdCAqY3VybDsgCi0gICAgdXRpbF91cmxfbm9kZV90IGN1cm5vZGU7Ci0gICAgdXRpbF9jb21wYXJlX25vZGVfdCAqY29tcGFyZV9ub2RlcDsKLSAgICB1dGlsX2NvbXBhcmVfbm9kZV90IHRoZV9jb21wYXJlX25vZGU7Ci0gICAgYXByX3RpbWVfdCBjdXJ0aW1lOwotICAgIGludCBmYWlsdXJlcyA9IDA7Ci0KLSAgICB1dGlsX2xkYXBfc3RhdGVfdCAqc3QgPSAKLSAgICAgICAgKHV0aWxfbGRhcF9zdGF0ZV90ICopYXBfZ2V0X21vZHVsZV9jb25maWcoci0+c2VydmVyLT5tb2R1bGVfY29uZmlnLAotICAgICAgICAmbGRhcF9tb2R1bGUpOwotCi0KLSAgICAvKiByZWFkIGxvY2sgdGhpcyBmdW5jdGlvbiAqLwotICAgIGlmICghdXRpbF9sZGFwX2NhY2hlX2xvY2spIHsKLSAgICAgICAgYXByX2xvY2tfY3JlYXRlKCZ1dGlsX2xkYXBfY2FjaGVfbG9jaywgQVBSX1JFQURXUklURSwgQVBSX0lOVFJBUFJPQ0VTUywgTlVMTCwgc3QtPnBvb2wpOwotICAgIH0KLQotICAgIC8qIGdldCBjYWNoZSBlbnRyeSAob3IgY3JlYXRlIG9uZSkgKi8KLSAgICBhcHJfbG9ja19hY3F1aXJlX3J3KHV0aWxfbGRhcF9jYWNoZV9sb2NrLCBBUFJfV1JJVEVSKTsKLSAgICBjdXJub2RlLnVybCA9IHVybDsKLSAgICBjdXJsID0gdXRpbF9hbGRfY2FjaGVfZmV0Y2godXRpbF9sZGFwX2NhY2hlLCAmY3Vybm9kZSk7Ci0gICAgaWYgKGN1cmwgPT0gTlVMTCkgewotICAgICAgICBjdXJsID0gdXRpbF9hbGRfY3JlYXRlX2NhY2hlcyhzdCwgdXJsKTsKLSAgICB9Ci0gICAgYXByX2xvY2tfcmVsZWFzZSh1dGlsX2xkYXBfY2FjaGVfbG9jayk7Ci0KLSAgICAvKiBtYWtlIGEgY29tcGFyaXNvbiB0byB0aGUgY2FjaGUgKi8KLSAgICBhcHJfbG9ja19hY3F1aXJlX3J3KHV0aWxfbGRhcF9jYWNoZV9sb2NrLCBBUFJfUkVBREVSKTsKLSAgICBjdXJ0aW1lID0gYXByX3RpbWVfbm93KCk7Ci0KLSAgICB0aGVfY29tcGFyZV9ub2RlLmRuID0gKGNoYXIgKilkbjsKLSAgICB0aGVfY29tcGFyZV9ub2RlLmF0dHJpYiA9IChjaGFyICopYXR0cmliOwotICAgIHRoZV9jb21wYXJlX25vZGUudmFsdWUgPSAoY2hhciAqKXZhbHVlOwotICAgIHRoZV9jb21wYXJlX25vZGUucmVzdWx0ID0gMDsKLQotICAgIGNvbXBhcmVfbm9kZXAgPSB1dGlsX2FsZF9jYWNoZV9mZXRjaChjdXJsLT5jb21wYXJlX2NhY2hlLCAmdGhlX2NvbXBhcmVfbm9kZSk7Ci0KLSAgICBpZiAoY29tcGFyZV9ub2RlcCAhPSBOVUxMKSB7Ci0gICAgICAgIC8qIGZvdW5kIGl0Li4uICovCi0gICAgICAgIGlmIChjdXJ0aW1lIC0gY29tcGFyZV9ub2RlcC0+bGFzdGNvbXBhcmUgPiBzdC0+Y29tcGFyZV9jYWNoZV90dGwpIHsKLSAgICAgICAgICAgIC8qIC4uLmJ1dCBpdCBpcyB0b28gb2xkICovCi0gICAgICAgICAgICB1dGlsX2FsZF9jYWNoZV9yZW1vdmUoY3VybC0+Y29tcGFyZV9jYWNoZSwgY29tcGFyZV9ub2RlcCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKiAuLi5hbmQgaXQgaXMgZ29vZCAqLwotICAgICAgICAgICAgLyogdW5sb2NrIHRoaXMgcmVhZCBsb2NrICovCi0gICAgICAgICAgICBhcHJfbG9ja19yZWxlYXNlKHV0aWxfbGRhcF9jYWNoZV9sb2NrKTsKLSAgICAgICAgICAgIGlmIChMREFQX0NPTVBBUkVfVFJVRSA9PSBjb21wYXJlX25vZGVwLT5yZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBsZGMtPnJlYXNvbiA9ICJDb21wYXJpc29uIHRydWUgKGNhY2hlZCkiOwotICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlX25vZGVwLT5yZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChMREFQX0NPTVBBUkVfRkFMU0UgPT0gY29tcGFyZV9ub2RlcC0+cmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgbGRjLT5yZWFzb24gPSAiQ29tcGFyaXNvbiBmYWxzZSAoY2FjaGVkKSI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVfbm9kZXAtPnJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKExEQVBfTk9fU1VDSF9BVFRSSUJVVEUgPT0gY29tcGFyZV9ub2RlcC0+cmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgbGRjLT5yZWFzb24gPSAiQ29tcGFyaXNvbiBubyBzdWNoIGF0dHJpYnV0ZSAoY2FjaGVkKSI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVfbm9kZXAtPnJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGxkYy0+cmVhc29uID0gIkNvbXBhcmlzb24gdW5kZWZpbmVkIChjYWNoZWQpIjsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZV9ub2RlcC0+cmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8qIHVubG9jayB0aGlzIHJlYWQgbG9jayAqLwotICAgIGFwcl9sb2NrX3JlbGVhc2UodXRpbF9sZGFwX2NhY2hlX2xvY2spOwotICAgIAotCi1zdGFydF9vdmVyOgotICAgIGlmIChmYWlsdXJlcysrID4gMTApIHsKLSAgICAgICAgLyogdG9vIG1hbnkgZmFpbHVyZXMgKi8KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgaWYgKExEQVBfU1VDQ0VTUyAhPSAocmVzdWx0ID0gdXRpbF9sZGFwX2Nvbm5lY3Rpb25fb3BlbihsZGMpKSkgewotICAgICAgICAvKiBjb25uZWN0IGZhaWxlZCAqLwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIGlmICgocmVzdWx0ID0gbGRhcF9jb21wYXJlX3MobGRjLT5sZGFwLCBjb25zdF9jYXN0KGRuKSwgCi0JCQkgICAgICAgICBjb25zdF9jYXN0KGF0dHJpYiksIGNvbnN0X2Nhc3QodmFsdWUpKSkKLSAgICAgICAgPT0gTERBUF9TRVJWRVJfRE9XTikgeyAKLSAgICAgICAgLyogY29ubmVjdGlvbiBmYWlsZWQgLSB0cnkgYWdhaW4gKi8KLSAgICAgICAgdXRpbF9sZGFwX2Nvbm5lY3Rpb25fY2xvc2UobGRjKTsKLSAgICAgICAgbGRjLT5yZWFzb24gPSAibGRhcF9jb21wYXJlX3MoKSBmYWlsZWQgd2l0aCBzZXJ2ZXIgZG93biI7Ci0gICAgICAgIGdvdG8gc3RhcnRfb3ZlcjsKLSAgICB9Ci0KLSAgICBsZGMtPnJlYXNvbiA9ICJDb21wYXJpc29uIGNvbXBsZXRlIjsKLSAgICBpZiAoKExEQVBfQ09NUEFSRV9UUlVFID09IHJlc3VsdCkgfHwgCi0gICAgICAgIChMREFQX0NPTVBBUkVfRkFMU0UgPT0gcmVzdWx0KSB8fAotICAgICAgICAoTERBUF9OT19TVUNIX0FUVFJJQlVURSA9PSByZXN1bHQpKSB7Ci0gICAgICAgIC8qIGNvbXBhcmUgY29tcGxldGVkOyBjYWNoaW5nIHJlc3VsdCAqLwotICAgICAgICBhcHJfbG9ja19hY3F1aXJlX3J3KHV0aWxfbGRhcF9jYWNoZV9sb2NrLCBBUFJfV1JJVEVSKTsKLSAgICAgICAgdGhlX2NvbXBhcmVfbm9kZS5sYXN0Y29tcGFyZSA9IGN1cnRpbWU7Ci0gICAgICAgIHRoZV9jb21wYXJlX25vZGUucmVzdWx0ID0gcmVzdWx0OwotICAgICAgICB1dGlsX2FsZF9jYWNoZV9pbnNlcnQoY3VybC0+Y29tcGFyZV9jYWNoZSwgJnRoZV9jb21wYXJlX25vZGUpOwotICAgICAgICBhcHJfbG9ja19yZWxlYXNlKHV0aWxfbGRhcF9jYWNoZV9sb2NrKTsKLSAgICAgICAgaWYgKExEQVBfQ09NUEFSRV9UUlVFID09IHJlc3VsdCkgewotICAgICAgICAgICAgbGRjLT5yZWFzb24gPSAiQ29tcGFyaXNvbiB0cnVlIChhZGRpbmcgdG8gY2FjaGUpIjsKLSAgICAgICAgICAgIHJldHVybiBMREFQX0NPTVBBUkVfVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChMREFQX0NPTVBBUkVfRkFMU0UgPT0gcmVzdWx0KSB7Ci0gICAgICAgICAgICBsZGMtPnJlYXNvbiA9ICJDb21wYXJpc29uIGZhbHNlIChhZGRpbmcgdG8gY2FjaGUpIjsKLSAgICAgICAgICAgIHJldHVybiBMREFQX0NPTVBBUkVfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBsZGMtPnJlYXNvbiA9ICJDb21wYXJpc29uIG5vIHN1Y2ggYXR0cmlidXRlIChhZGRpbmcgdG8gY2FjaGUpIjsKLSAgICAgICAgICAgIHJldHVybiBMREFQX05PX1NVQ0hfQVRUUklCVVRFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLWludCB1dGlsX2xkYXBfY2FjaGVfY2hlY2t1c2VyaWQocmVxdWVzdF9yZWMgKnIsIHV0aWxfbGRhcF9jb25uZWN0aW9uX3QgKmxkYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgY2hhciAqYmFzZWRuLCBpbnQgc2NvcGUsIGNoYXIgKiphdHRycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbHRlciwgY29uc3QgY2hhciAqYmluZHB3LCBjb25zdCBjaGFyICoqYmluZGRuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKipyZXR2YWxzKQotewotICAgIGNvbnN0IGNoYXIgKip2YWxzID0gTlVMTDsKLSAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICBMREFQTWVzc2FnZSAqcmVzLCAqZW50cnk7Ci0gICAgY2hhciAqZG47Ci0gICAgaW50IGNvdW50OwotICAgIGludCBmYWlsdXJlcyA9IDA7Ci0gICAgdXRpbF91cmxfbm9kZV90ICpjdXJsOwkJLyogQ2FjaGVkIFVSTCBub2RlICovCi0gICAgdXRpbF91cmxfbm9kZV90IGN1cm5vZGU7Ci0gICAgdXRpbF9zZWFyY2hfbm9kZV90ICpzZWFyY2hfbm9kZXA7CS8qIENhY2hlZCBzZWFyY2ggbm9kZSAqLwotICAgIHV0aWxfc2VhcmNoX25vZGVfdCB0aGVfc2VhcmNoX25vZGU7Ci0gICAgYXByX3RpbWVfdCBjdXJ0aW1lOwotCi0gICAgdXRpbF9sZGFwX3N0YXRlX3QgKnN0ID0gCi0gICAgICAgICh1dGlsX2xkYXBfc3RhdGVfdCAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZywKLSAgICAgICAgJmxkYXBfbW9kdWxlKTsKLQotICAgIC8qIHJlYWQgbG9jayB0aGlzIGZ1bmN0aW9uICovCi0gICAgaWYgKCF1dGlsX2xkYXBfY2FjaGVfbG9jaykgewotICAgICAgICBhcHJfbG9ja19jcmVhdGUoJnV0aWxfbGRhcF9jYWNoZV9sb2NrLCBBUFJfUkVBRFdSSVRFLCBBUFJfSU5UUkFQUk9DRVNTLCBOVUxMLCBzdC0+cG9vbCk7Ci0gICAgfQotCi0gICAgLyogR2V0IHRoZSBjYWNoZSBub2RlIGZvciB0aGlzIHVybCAqLwotICAgIGFwcl9sb2NrX2FjcXVpcmVfcncodXRpbF9sZGFwX2NhY2hlX2xvY2ssIEFQUl9XUklURVIpOwotICAgIGN1cm5vZGUudXJsID0gdXJsOwotICAgIGN1cmwgPSAodXRpbF91cmxfbm9kZV90ICopdXRpbF9hbGRfY2FjaGVfZmV0Y2godXRpbF9sZGFwX2NhY2hlLCAmY3Vybm9kZSk7Ci0gICAgaWYgKGN1cmwgPT0gTlVMTCkgewotICAgICAgICBjdXJsID0gdXRpbF9hbGRfY3JlYXRlX2NhY2hlcyhzdCwgdXJsKTsKLSAgICB9Ci0gICAgYXByX2xvY2tfcmVsZWFzZSh1dGlsX2xkYXBfY2FjaGVfbG9jayk7Ci0KLSAgICBhcHJfbG9ja19hY3F1aXJlX3J3KHV0aWxfbGRhcF9jYWNoZV9sb2NrLCBBUFJfUkVBREVSKTsKLSAgICB0aGVfc2VhcmNoX25vZGUudXNlcm5hbWUgPSBmaWx0ZXI7Ci0gICAgc2VhcmNoX25vZGVwID0gdXRpbF9hbGRfY2FjaGVfZmV0Y2goY3VybC0+c2VhcmNoX2NhY2hlLCAmdGhlX3NlYXJjaF9ub2RlKTsKLSAgICBpZiAoc2VhcmNoX25vZGVwICE9IE5VTEwgJiYgc2VhcmNoX25vZGVwLT5iaW5kcHcpIHsKLQotICAgICAgICAvKiBmb3VuZCBlbnRyeSBpbiBzZWFyY2ggY2FjaGUuLi4gKi8KLSAgICAgICAgY3VydGltZSA9IGFwcl90aW1lX25vdygpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFJlbW92ZSB0aGlzIGl0ZW0gZnJvbSB0aGUgY2FjaGUgaWYgaXRzIGV4cGlyZWQsIG9yIGlmIHRoZSAKLSAgICAgICAgICogc2VudCBwYXNzd29yZCBkb2Vzbid0IG1hdGNoIHRoZSBzdG9yZXBhc3N3b3JkLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKChjdXJ0aW1lIC0gc2VhcmNoX25vZGVwLT5sYXN0YmluZCkgPiBzdC0+c2VhcmNoX2NhY2hlX3R0bCkgewotICAgICAgICAgICAgLyogLi4uYnV0IGVudHJ5IGlzIHRvbyBvbGQgKi8KLSAgICAgICAgICAgIHV0aWxfYWxkX2NhY2hlX3JlbW92ZShjdXJsLT5zZWFyY2hfY2FjaGUsIHNlYXJjaF9ub2RlcCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RyY21wKHNlYXJjaF9ub2RlcC0+YmluZHB3LCBiaW5kcHcpICE9IDApIHsKLQkgICAgLyogLi4uYnV0IGNhY2hlZCBwYXNzd29yZCBkb2Vzbid0IG1hdGNoIHNlbnQgcGFzc3dvcmQgKi8KLSAgICAgICAgICAgIHV0aWxfYWxkX2NhY2hlX3JlbW92ZShjdXJsLT5zZWFyY2hfY2FjaGUsIHNlYXJjaF9ub2RlcCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKiAuLi5hbmQgZW50cnkgaXMgdmFsaWQgKi8KLSAgICAgICAgICAgICpiaW5kZG4gPSBzZWFyY2hfbm9kZXAtPmRuOwotICAgICAgICAgICAgKnJldHZhbHMgPSBzZWFyY2hfbm9kZXAtPnZhbHM7Ci0gICAgICAgICAgICBhcHJfbG9ja19yZWxlYXNlKHV0aWxfbGRhcF9jYWNoZV9sb2NrKTsKLSAgICAgICAgICAgIGxkYy0+cmVhc29uID0gIkF1dGhlbnRpY2F0aW9uIHN1Y2Nlc3NmdWwgKGNhY2hlZCkiOwotICAgICAgICAgICAgcmV0dXJuIExEQVBfU1VDQ0VTUzsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiB1bmxvY2sgdGhpcyByZWFkIGxvY2sgKi8KLSAgICBhcHJfbG9ja19yZWxlYXNlKHV0aWxfbGRhcF9jYWNoZV9sb2NrKTsKLQotCi0gICAgLyoJCi0gICAgICogQXQgdGhpcyBwb2ludCwgdGhlcmUgaXMgbm8gdmFsaWQgY2FjaGVkIHNlYXJjaCwgc28gbGV0cyBkbyB0aGUgc2VhcmNoLgotICAgICAqLwotCi0gICAgLyoKLSAgICAgKiBJZiBhbnkgTERBUCBvcGVyYXRpb24gZmFpbHMgZHVlIHRvIExEQVBfU0VSVkVSX0RPV04sIGNvbnRyb2wgcmV0dXJucyBoZXJlLgotICAgICAqLwotc3RhcnRfb3ZlcjoKLSAgICBpZiAoZmFpbHVyZXMrKyA+IDEwKSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGlmIChMREFQX1NVQ0NFU1MgIT0gKHJlc3VsdCA9IHV0aWxfbGRhcF9jb25uZWN0aW9uX29wZW4obGRjKSkpIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKiB0cnkgZG8gdGhlIHNlYXJjaCAqLwotICAgIGlmICgocmVzdWx0ID0gbGRhcF9zZWFyY2hfZXh0X3MobGRjLT5sZGFwLAotCQkJCSAgICBiYXNlZG4sIHNjb3BlLCAKLQkJCQkgICAgZmlsdGVyLCBhdHRycywgMCwgCi0JCQkJICAgIE5VTEwsIE5VTEwsIE5VTEwsIC0xLCAmcmVzKSkgPT0gTERBUF9TRVJWRVJfRE9XTikgewotICAgICAgICBsZGMtPnJlYXNvbiA9ICJsZGFwX3NlYXJjaF9leHRfcygpIGZvciB1c2VyIGZhaWxlZCB3aXRoIHNlcnZlciBkb3duIjsKLSAgICAgICAgZ290byBzdGFydF9vdmVyOwotICAgIH0KLQotICAgIC8qIGlmIHRoZXJlIGlzIGFuIGVycm9yIChpbmNsdWRpbmcgTERBUF9OT19TVUNIX09CSkVDVCkgcmV0dXJuIG5vdyAqLwotICAgIGlmIChyZXN1bHQgIT0gTERBUF9TVUNDRVNTKSB7Ci0gICAgICAgIGxkYy0+cmVhc29uID0gImxkYXBfc2VhcmNoX2V4dF9zKCkgZm9yIHVzZXIgZmFpbGVkIjsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKiAKLSAgICAgKiBXZSBzaG91bGQgaGF2ZSBmb3VuZCBleGFjdGx5IG9uZSBlbnRyeTsgdG8gZmluZCBhIGRpZmZlcmVudAotICAgICAqIG51bWJlciBpcyBhbiBlcnJvci4KLSAgICAgKi8KLSAgICBjb3VudCA9IGxkYXBfY291bnRfZW50cmllcyhsZGMtPmxkYXAsIHJlcyk7Ci0gICAgaWYgKGNvdW50ICE9IDEpIHsKLSAgICAgICAgbGRhcF9tc2dmcmVlKHJlcyk7Ci0gICAgICAgIGxkYy0+cmVhc29uID0gIlVzZXIgaXMgbm90IHVuaXF1ZSAoc2VhcmNoIGZvdW5kIHR3byBvciBtb3JlIG1hdGNoZXMpIjsKLSAgICAgICAgcmV0dXJuIExEQVBfTk9fU1VDSF9PQkpFQ1Q7Ci0gICAgfQotCi0gICAgZW50cnkgPSBsZGFwX2ZpcnN0X2VudHJ5KGxkYy0+bGRhcCwgcmVzKTsKLQotICAgIC8qIEdyYWIgdGhlIGRuLCBjb3B5IGl0IGludG8gdGhlIHBvb2wsIGFuZCBmcmVlIGl0IGFnYWluICovCi0gICAgZG4gPSBsZGFwX2dldF9kbihsZGMtPmxkYXAsIGVudHJ5KTsKLSAgICAqYmluZGRuID0gYXByX3BzdHJkdXAoc3QtPnBvb2wsIGRuKTsKLSAgICBsZGFwX21lbWZyZWUoZG4pOwotCi0gICAgLyogCi0gICAgICogQSBiaW5kIHRvIHRoZSBzZXJ2ZXIgd2l0aCBhbiBlbXB0eSBwYXNzd29yZCBhbHdheXMgc3VjY2VlZHMsIHNvCi0gICAgICogd2UgY2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIHBhc3N3b3JkIGlzIG5vdCBlbXB0eS4gVGhpcyBpbXBsaWVzCi0gICAgICogdGhhdCB1c2VycyB3aG8gYWN0dWFsbHkgZG8gaGF2ZSBlbXB0eSBwYXNzd29yZHMgd2lsbCBuZXZlciBiZQotICAgICAqIGFibGUgdG8gYXV0aGVudGljYXRlIHdpdGggdGhpcyBtb2R1bGUuIEkgZG9uJ3Qgc2VlIHRoaXMgYXMgYSBiaWcKLSAgICAgKiBwcm9ibGVtLgotICAgICAqLwotICAgIGlmIChzdHJsZW4oYmluZHB3KSA8PSAwKSB7Ci0gICAgICAgIGxkYXBfbXNnZnJlZShyZXMpOwotICAgICAgICBsZGMtPnJlYXNvbiA9ICJFbXB0eSBwYXNzd29yZCBub3QgYWxsb3dlZCI7Ci0gICAgICAgIHJldHVybiBMREFQX0lOVkFMSURfQ1JFREVOVElBTFM7Ci0gICAgfQotCi0gICAgLyogCi0gICAgICogQXR0ZW1wdCB0byBiaW5kIHdpdGggdGhlIHJldHJpZXZlZCBkbiBhbmQgdGhlIHBhc3N3b3JkLiBJZiB0aGUgYmluZAotICAgICAqIGZhaWxzLCBpdCBtZWFucyB0aGF0IHRoZSBwYXNzd29yZCBpcyB3cm9uZyAodGhlIGRuIG9idmlvdXNseQotICAgICAqIGV4aXN0cywgc2luY2Ugd2UganVzdCByZXRyaWV2ZWQgaXQpCi0gICAgICovCi0gICAgaWYgKChyZXN1bHQgPSAKLSAgICAgICAgIGxkYXBfc2ltcGxlX2JpbmRfcyhsZGMtPmxkYXAsICpiaW5kZG4sIGJpbmRwdykpID09IAotICAgICAgICAgTERBUF9TRVJWRVJfRE9XTikgewotICAgICAgICBsZGMtPnJlYXNvbiA9ICJsZGFwX3NpbXBsZV9iaW5kX3MoKSB0byBjaGVjayB1c2VyIGNyZWRlbnRpYWxzIGZhaWxlZCB3aXRoIHNlcnZlciBkb3duIjsKLSAgICAgICAgZ290byBzdGFydF9vdmVyOwotICAgIH0KLQotICAgIC8qIGZhaWx1cmU/IGlmIHNvIC0gcmV0dXJuICovCi0gICAgaWYgKHJlc3VsdCAhPSBMREFQX1NVQ0NFU1MpIHsKLSAgICAgICAgbGRjLT5yZWFzb24gPSAibGRhcF9zaW1wbGVfYmluZF9zKCkgdG8gY2hlY2sgdXNlciBjcmVkZW50aWFscyBmYWlsZWQiOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qCi0gICAgICogR2V0IHZhbHVlcyBmb3IgdGhlIHByb3ZpZGVkIGF0dHJpYnV0ZXMuCi0gICAgICovCi0gICAgaWYgKGF0dHJzKSB7Ci0gICAgICAgIGludCBrID0gMDsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZSAoYXR0cnNbaysrXSk7Ci0gICAgICAgIHZhbHMgPSBhcHJfcGNhbGxvYyhyLT5wb29sLCBzaXplb2YoY2hhciAqKSAqIChrKzEpKTsKLSAgICAgICAgd2hpbGUgKGF0dHJzW2ldKSB7Ci0gICAgICAgICAgICBjaGFyICoqdmFsdWVzOwotICAgICAgICAgICAgaW50IGogPSAwOwotICAgICAgICAgICAgY2hhciAqc3RyID0gTlVMTDsKLSAgICAgICAgICAgIC8qIGdldCB2YWx1ZXMgKi8KLSAgICAgICAgICAgIHZhbHVlcyA9IGxkYXBfZ2V0X3ZhbHVlcyhsZGMtPmxkYXAsIGVudHJ5LCBhdHRyc1tpXSk7Ci0gICAgICAgICAgICB3aGlsZSAodmFsdWVzICYmIHZhbHVlc1tqXSkgewotICAgICAgICAgICAgICAgIHN0ciA9IHN0ciA/IGFwcl9wc3RyY2F0KHItPnBvb2wsIHN0ciwgIjsgIiwgdmFsdWVzW2pdLCBOVUxMKSA6IGFwcl9wc3RyZHVwKHItPnBvb2wsIHZhbHVlc1tqXSk7Ci0gICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsc1tpXSA9IHN0cjsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgICAgICAqcmV0dmFscyA9IHZhbHM7Ci0gICAgfQotCi0gICAgLyogCQkKLSAgICAgKiBBZGQgdGhlIG5ldyB1c2VybmFtZSB0byB0aGUgc2VhcmNoIGNhY2hlLgotICAgICAqLwotICAgIGFwcl9sb2NrX2FjcXVpcmVfcncodXRpbF9sZGFwX2NhY2hlX2xvY2ssIEFQUl9XUklURVIpOwotICAgIHRoZV9zZWFyY2hfbm9kZS51c2VybmFtZSA9IGZpbHRlcjsKLSAgICB0aGVfc2VhcmNoX25vZGUuZG4gPSAqYmluZGRuOwotICAgIHRoZV9zZWFyY2hfbm9kZS5iaW5kcHcgPSBiaW5kcHc7Ci0gICAgdGhlX3NlYXJjaF9ub2RlLmxhc3RiaW5kID0gYXByX3RpbWVfbm93KCk7Ci0gICAgdGhlX3NlYXJjaF9ub2RlLnZhbHMgPSB2YWxzOwotICAgIHV0aWxfYWxkX2NhY2hlX2luc2VydChjdXJsLT5zZWFyY2hfY2FjaGUsICZ0aGVfc2VhcmNoX25vZGUpOwotICAgIGxkYXBfbXNnZnJlZShyZXMpOwotICAgIGFwcl9sb2NrX3JlbGVhc2UodXRpbF9sZGFwX2NhY2hlX2xvY2spOwotCi0gICAgbGRjLT5yZWFzb24gPSAiQXV0aGVudGljYXRpb24gc3VjY2Vzc2Z1bCI7Ci0gICAgcmV0dXJuIExEQVBfU1VDQ0VTUzsKLX0KLQotI2VuZGlmIC8qIEFQVV9IQVNfTERBUCAqLwotCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogY29uZmlnIGRpcmVjdGl2ZXMgKi8KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqdXRpbF9sZGFwX3NldF9jYWNoZV9ieXRlcyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNvbnN0IGNoYXIgKmJ5dGVzKQotewotICAgIHV0aWxfbGRhcF9zdGF0ZV90ICpzdCA9IAotICAgICAgICAodXRpbF9sZGFwX3N0YXRlX3QgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhjbWQtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgCi0JCQkJCQkgICZsZGFwX21vZHVsZSk7Ci0KLSAgICBzdC0+Y2FjaGVfYnl0ZXMgPSBhdG9sKGJ5dGVzKTsKLQotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19ERUJVR3xBUExPR19OT0VSUk5PLCAwLCBjbWQtPnNlcnZlciwgCi0gICAgICAgICAgICAgICAgICAgICAgIlslZF0gbGRhcCBjYWNoZTogU2V0dGluZyBzaGFyZWQgbWVtb3J5IGNhY2hlIHNpemUgdG8gJWQgYnl0ZXMuIiwgCi0gICAgICAgICAgICAgICAgICAgICAgZ2V0cGlkKCksIHN0LT5jYWNoZV9ieXRlcyk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnV0aWxfbGRhcF9zZXRfY2FjaGVfdHRsKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY29uc3QgY2hhciAqdHRsKQotewotICAgIHV0aWxfbGRhcF9zdGF0ZV90ICpzdCA9IAotICAgICAgICAodXRpbF9sZGFwX3N0YXRlX3QgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhjbWQtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgCi0JCQkJCQkgICZsZGFwX21vZHVsZSk7Ci0KLSAgICBzdC0+c2VhcmNoX2NhY2hlX3R0bCA9IGF0b2wodHRsKSAqIDEwMDAwMDA7Ci0KLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfREVCVUd8QVBMT0dfTk9FUlJOTywgMCwgY21kLT5zZXJ2ZXIsIAotICAgICAgICAgICAgICAgICAgICAgICJbJWRdIGxkYXAgY2FjaGU6IFNldHRpbmcgY2FjaGUgVFRMIHRvICVsZCBtaWNyb3NlY29uZHMuIiwgCi0gICAgICAgICAgICAgICAgICAgICAgZ2V0cGlkKCksIHN0LT5zZWFyY2hfY2FjaGVfdHRsKTsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqdXRpbF9sZGFwX3NldF9jYWNoZV9lbnRyaWVzKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY29uc3QgY2hhciAqc2l6ZSkKLXsKLSAgICB1dGlsX2xkYXBfc3RhdGVfdCAqc3QgPSAKLSAgICAgICAgKHV0aWxfbGRhcF9zdGF0ZV90ICopYXBfZ2V0X21vZHVsZV9jb25maWcoY21kLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsIAotCQkJCQkJICAmbGRhcF9tb2R1bGUpOwotCi0KLSAgICBzdC0+c2VhcmNoX2NhY2hlX3NpemUgPSBhdG9sKHNpemUpOwotICAgIGlmIChzdC0+c2VhcmNoX2NhY2hlX3NpemUgPCAwKSB7Ci0gICAgICAgIHN0LT5zZWFyY2hfY2FjaGVfc2l6ZSA9IDA7Ci0gICAgfQotCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0RFQlVHfEFQTE9HX05PRVJSTk8sIDAsIGNtZC0+c2VydmVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAiWyVkXSBsZGFwIGNhY2hlOiBTZXR0aW5nIHNlYXJjaCBjYWNoZSBzaXplIHRvICVsZCBlbnRyaWVzLiIsIAotICAgICAgICAgICAgICAgICAgICAgIGdldHBpZCgpLCBzdC0+c2VhcmNoX2NhY2hlX3NpemUpOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICp1dGlsX2xkYXBfc2V0X29wY2FjaGVfdHRsKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY29uc3QgY2hhciAqdHRsKQotewotICAgIHV0aWxfbGRhcF9zdGF0ZV90ICpzdCA9IAotICAgICAgICAodXRpbF9sZGFwX3N0YXRlX3QgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhjbWQtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgCi0JCQkJCQkgICZsZGFwX21vZHVsZSk7Ci0KLSAgICBzdC0+Y29tcGFyZV9jYWNoZV90dGwgPSBhdG9sKHR0bCkgKiAxMDAwMDAwOwotCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0RFQlVHfEFQTE9HX05PRVJSTk8sIDAsIGNtZC0+c2VydmVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAiWyVkXSBsZGFwIGNhY2hlOiBTZXR0aW5nIG9wZXJhdGlvbiBjYWNoZSBUVEwgdG8gJWxkIG1pY3Jvc2Vjb25kcy4iLCAKLSAgICAgICAgICAgICAgICAgICAgICBnZXRwaWQoKSwgc3QtPmNvbXBhcmVfY2FjaGVfdHRsKTsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqdXRpbF9sZGFwX3NldF9vcGNhY2hlX2VudHJpZXMoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjb25zdCBjaGFyICpzaXplKQotewotICAgIHV0aWxfbGRhcF9zdGF0ZV90ICpzdCA9IAotICAgICAgICAodXRpbF9sZGFwX3N0YXRlX3QgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhjbWQtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgCi0JCQkJCQkgICZsZGFwX21vZHVsZSk7Ci0KLSAgICBzdC0+Y29tcGFyZV9jYWNoZV9zaXplID0gYXRvbChzaXplKTsKLSAgICBpZiAoc3QtPmNvbXBhcmVfY2FjaGVfc2l6ZSA8IDApIHsKLSAgICAgICAgc3QtPmNvbXBhcmVfY2FjaGVfc2l6ZSA9IDA7Ci0gICAgfQotCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0RFQlVHfEFQTE9HX05PRVJSTk8sIDAsIGNtZC0+c2VydmVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAiWyVkXSBsZGFwIGNhY2hlOiBTZXR0aW5nIG9wZXJhdGlvbiBjYWNoZSBzaXplIHRvICVsZCBlbnRyaWVzLiIsIAotICAgICAgICAgICAgICAgICAgICAgIGdldHBpZCgpLCBzdC0+Y29tcGFyZV9jYWNoZV9zaXplKTsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi0jaWZkZWYgQVBVX0hBU19MREFQU1NMX0NMSUVOVF9JTklUCi1zdGF0aWMgY29uc3QgY2hhciAqdXRpbF9sZGFwX3NldF9jZXJ0ZGJwYXRoKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgICB1dGlsX2xkYXBfc3RhdGVfdCAqc3QgPSAKLSAgICAgICAgKHV0aWxfbGRhcF9zdGF0ZV90ICopYXBfZ2V0X21vZHVsZV9jb25maWcoY21kLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsIAotCQkJCQkJICAmbGRhcF9tb2R1bGUpOwotCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0RFQlVHfEFQTE9HX05PRVJSTk8sIDAsIGNtZC0+c2VydmVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAiWyVkXSBsZGFwIGNhY2hlOiBTZXR0aW5nIExEQVAgU1NMIGNsaWVudCBjZXJ0aWZpY2F0ZSBkYnBhdGggdG8gJXMuIiwgCi0gICAgICAgICAgICAgICAgICAgICAgZ2V0cGlkKCksIHBhdGgpOwotCi0gICAgc3QtPmhhdmVfY2VydGRiID0gMTsKLSAgICBpZiAobGRhcHNzbF9jbGllbnRfaW5pdChwYXRoLCBOVUxMKSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiAiQ291bGQgbm90IGluaXRpYWxpemUgU1NMIGNsaWVudCI7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0jZW5kaWYKLQotdm9pZCAqdXRpbF9sZGFwX2NyZWF0ZV9jb25maWcoYXByX3Bvb2xfdCAqcCwgc2VydmVyX3JlYyAqcykKLXsKLSAgICB1dGlsX2xkYXBfc3RhdGVfdCAqc3QgPSAKLSAgICAgICAgKHV0aWxfbGRhcF9zdGF0ZV90ICopYXByX3BjYWxsb2MocCwgc2l6ZW9mKHV0aWxfbGRhcF9zdGF0ZV90KSk7Ci0KLSAgICBzdC0+cG9vbCA9IHA7Ci0KLSAgICBzdC0+Y2FjaGVfYnl0ZXMgPSAxMDAwMDA7Ci0gICAgc3QtPnNlYXJjaF9jYWNoZV90dGwgPSA2MDAwMDAwMDA7Ci0gICAgc3QtPnNlYXJjaF9jYWNoZV9zaXplID0gMTAyNDsKLSAgICBzdC0+Y29tcGFyZV9jYWNoZV90dGwgPSA2MDAwMDAwMDA7Ci0gICAgc3QtPmNvbXBhcmVfY2FjaGVfc2l6ZSA9IDEwMjQ7Ci0KLSAgICBzdC0+Y29ubmVjdGlvbnMgPSBOVUxMOwotI2lmZGVmIEFQVV9IQVNfTERBUF9ORVRTQ0FQRV9TU0wKLSAgICBzdC0+aGF2ZV9jZXJ0ZGIgPSAwOwotI2VuZGlmCi0KLSAgICByZXR1cm4gc3Q7Ci19Ci0KLXN0YXRpYyB2b2lkIHV0aWxfbGRhcF9pbml0X21vZHVsZShhcHJfcG9vbF90ICpwb29sLCBzZXJ2ZXJfcmVjICpzKQotewotICAgIHV0aWxfbGRhcF9zdGF0ZV90ICpzdCA9IAotICAgICAgICAodXRpbF9sZGFwX3N0YXRlX3QgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAKLQkJCQkJCSAgJmxkYXBfbW9kdWxlKTsKLQotICAgIGFwcl9zdGF0dXNfdCByZXN1bHQgPSB1dGlsX2xkYXBfY2FjaGVfaW5pdChwb29sLCBzdC0+Y2FjaGVfYnl0ZXMpOwotICAgIGNoYXIgYnVmW01BWF9TVFJJTkdfTEVOXTsKLQotICAgIGFwcl9zdHJlcnJvcihyZXN1bHQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19ERUJVR3xBUExPR19OT0VSUk5PLCByZXN1bHQsIHMsIAotICAgICAgICAgICAgICAgICAgICAgICJbJWRdIGxkYXAgY2FjaGUgaW5pdDogJXMiLCAKLSAgICAgICAgICAgICAgICAgICAgICBnZXRwaWQoKSwgYnVmKTsKLX0KLQotCi1jb21tYW5kX3JlYyB1dGlsX2xkYXBfY21kc1tdID0gewotICAgIEFQX0lOSVRfVEFLRTEoIkxEQVBTaGFyZWRDYWNoZVNpemUiLCB1dGlsX2xkYXBfc2V0X2NhY2hlX2J5dGVzLCBOVUxMLCBSU1JDX0NPTkYsCi0gICAgICAgICAgICAgICAgICAiU2V0cyB0aGUgc2l6ZSBvZiB0aGUgc2hhcmVkIG1lbW9yeSBjYWNoZSBpbiBieXRlcy4gIgotICAgICAgICAgICAgICAgICAgIlplcm8gbWVhbnMgZGlzYWJsZSB0aGUgc2hhcmVkIG1lbW9yeSBjYWNoZS4gRGVmYXVsdHMgdG8gMTAwS0IuIiksCi0KLSAgICBBUF9JTklUX1RBS0UxKCJMREFQQ2FjaGVFbnRyaWVzIiwgdXRpbF9sZGFwX3NldF9jYWNoZV9lbnRyaWVzLCBOVUxMLCBSU1JDX0NPTkYsCi0gICAgICAgICAgICAgICAgICAiU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyB0aGF0IGFyZSBwb3NzaWJsZSBpbiB0aGUgTERBUCAiCi0gICAgICAgICAgICAgICAgICAic2VhcmNoIGNhY2hlLiAiCi0gICAgICAgICAgICAgICAgICAiWmVybyBtZWFucyBubyBsaW1pdDsgLTEgZGlzYWJsZXMgdGhlIGNhY2hlLiBEZWZhdWx0cyB0byAxMDI0IGVudHJpZXMuIiksCi0KLSAgICBBUF9JTklUX1RBS0UxKCJMREFQQ2FjaGVUVEwiLCB1dGlsX2xkYXBfc2V0X2NhY2hlX3R0bCwgTlVMTCwgUlNSQ19DT05GLAotICAgICAgICAgICAgICAgICAgIlNldHMgdGhlIG1heGltdW0gdGltZSAoaW4gc2Vjb25kcykgdGhhdCBhbiBpdGVtIGNhbiBiZSBjYWNoZWQgaW4gdGhlIExEQVAgIgotICAgICAgICAgICAgICAgICAgInNlYXJjaCBjYWNoZS4gWmVybyBtZWFucyBubyBsaW1pdC4gRGVmYXVsdHMgdG8gNjAwIHNlY29uZHMgKDEwIG1pbnV0ZXMpLiIpLAotCi0gICAgQVBfSU5JVF9UQUtFMSgiTERBUE9wQ2FjaGVFbnRyaWVzIiwgdXRpbF9sZGFwX3NldF9vcGNhY2hlX2VudHJpZXMsIE5VTEwsIFJTUkNfQ09ORiwKLSAgICAgICAgICAgICAgICAgICJTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIHRoYXQgYXJlIHBvc3NpYmxlIGluIHRoZSBMREFQICIKLSAgICAgICAgICAgICAgICAgICJjb21wYXJlIGNhY2hlLiAiCi0gICAgICAgICAgICAgICAgICAiWmVybyBtZWFucyBubyBsaW1pdDsgLTEgZGlzYWJsZXMgdGhlIGNhY2hlLiBEZWZhdWx0cyB0byAxMDI0IGVudHJpZXMuIiksCi0KLSAgICBBUF9JTklUX1RBS0UxKCJMREFQT3BDYWNoZVRUTCIsIHV0aWxfbGRhcF9zZXRfb3BjYWNoZV90dGwsIE5VTEwsIFJTUkNfQ09ORiwKLSAgICAgICAgICAgICAgICAgICJTZXRzIHRoZSBtYXhpbXVtIHRpbWUgKGluIHNlY29uZHMpIHRoYXQgYW4gaXRlbSBpcyBjYWNoZWQgaW4gdGhlIExEQVAgIgotICAgICAgICAgICAgICAgICAgIm9wZXJhdGlvbiBjYWNoZS4gWmVybyBtZWFucyBubyBsaW1pdC4gRGVmYXVsdHMgdG8gNjAwIHNlY29uZHMgKDEwIG1pbnV0ZXMpLiIpLAotCi0jaWZkZWYgQVBVX0hBU19MREFQU1NMX0NMSUVOVF9JTklUCi0gICAgQVBfSU5JVF9UQUtFMSgiTERBUENlcnREQlBhdGgiLCB1dGlsX2xkYXBfc2V0X2NlcnRkYnBhdGgsIE5VTEwsIFJTUkNfQ09ORiwKLSAgICAgICAgICAgICAgICAgICJTcGVjaWZpZXMgdGhlIGZpbGUgY29udGFpbmluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgY2VydGlmaWNhdGVzICIKLSAgICAgICAgICAgICAgICAgICJmb3IgdmFsaWRhdGluZyBzZWN1cmUgTERBUCBzZXJ2ZXIgY2VydGlmaWNhdGVzLiBUaGlzIGZpbGUgbXVzdCBiZSB0aGUgIgotICAgICAgICAgICAgICAgICAgImNlcnQ3LmRiIGRhdGFiYXNlIHVzZWQgYnkgTmV0c2NhcGUgQ29tbXVuaWNhdG9yIiksCi0jZW5kaWYKLQotICAgIHtOVUxMfQotfTsKLQotc3RhdGljIHZvaWQgdXRpbF9sZGFwX3JlZ2lzdGVyX2hvb2tzKGFwcl9wb29sX3QgKnApCi17Ci0gICAgYXBfaG9va19jaGlsZF9pbml0KHV0aWxfbGRhcF9pbml0X21vZHVsZSwgTlVMTCwgTlVMTCwgQVBSX0hPT0tfTUlERExFKTsKLSAgICBhcF9ob29rX2hhbmRsZXIodXRpbF9sZGFwX2hhbmRsZXIsIE5VTEwsIE5VTEwsIEFQUl9IT09LX01JRERMRSk7Ci19Ci0KLW1vZHVsZSBsZGFwX21vZHVsZSA9IHsKLSAgIFNUQU5EQVJEMjBfTU9EVUxFX1NUVUZGLAotICAgTlVMTCwJCQkJLyogZGlyIGNvbmZpZyBjcmVhdGVyICovCi0gICBOVUxMLAkJCQkvKiBkaXIgbWVyZ2VyIC0tLSBkZWZhdWx0IGlzIHRvIG92ZXJyaWRlICovCi0gICB1dGlsX2xkYXBfY3JlYXRlX2NvbmZpZywJCS8qIHNlcnZlciBjb25maWcgKi8KLSAgIE5VTEwsCQkJCS8qIG1lcmdlIHNlcnZlciBjb25maWcgKi8KLSAgIHV0aWxfbGRhcF9jbWRzLAkJCS8qIGNvbW1hbmQgdGFibGUgKi8KLSAgIHV0aWxfbGRhcF9yZWdpc3Rlcl9ob29rcywJCS8qIHNldCB1cCByZXF1ZXN0IHByb2Nlc3NpbmcgaG9va3MgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL2V4cGVyaW1lbnRhbC91dGlsX2xkYXAuZGVmIGIvbW9kdWxlcy9leHBlcmltZW50YWwvdXRpbF9sZGFwLmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmYWM4OS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2V4cGVyaW1lbnRhbC91dGlsX2xkYXAuZGVmCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1FWFBPUlQgIGxkYXBfbW9kdWxlCi1FWFBPUlQgIHV0aWxfbGRhcF9jb25uZWN0aW9uX2ZpbmQKLUVYUE9SVCAgdXRpbF9sZGFwX2Nvbm5lY3Rpb25fY2xvc2UKLUVYUE9SVCAgdXRpbF9sZGFwX2NhY2hlX2NoZWNrdXNlcmlkCi1FWFBPUlQgIHV0aWxfbGRhcF9jYWNoZV9jb21wYXJlCi1FWFBPUlQgIHV0aWxfbGRhcF9jYWNoZV9jb21wYXJlZG4KZGlmZiAtLWdpdCBhL21vZHVsZXMvZXhwZXJpbWVudGFsL3V0aWxfbGRhcF9jYWNoZS5jIGIvbW9kdWxlcy9leHBlcmltZW50YWwvdXRpbF9sZGFwX2NhY2hlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOTg0NGQuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9leHBlcmltZW50YWwvdXRpbF9sZGFwX2NhY2hlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi0vKgotICogdXRpbF9sZGFwX2NhY2hlLmM6IExEQVAgY2FjaGUgdGhpbmdzCi0gKiAKLSAqIE9yaWdpbmFsIGNvZGUgZnJvbSBhdXRoX2xkYXAgbW9kdWxlIGZvciBBcGFjaGUgdjEuMzoKLSAqIENvcHlyaWdodCAxOTk4LCAxOTk5IEVuYnJpZGdlIFBpcGVsaW5lcyBJbmMuIAotICogQ29weXJpZ2h0IDE5OTktMjAwMSBEYXZlIENhcnJpZ2FuCi0gKi8KLQotI2luY2x1ZGUgPGFwcl9sZGFwLmg+Ci0jaW5jbHVkZSAidXRpbF9sZGFwLmgiCi0jaW5jbHVkZSAidXRpbF9sZGFwX2NhY2hlLmgiCi0KLSNpZmRlZiBBUFVfSEFTX0xEQVAKLQotCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXVuc2lnbmVkIGxvbmcgdXRpbF9sZGFwX3VybF9ub2RlX2hhc2godm9pZCAqbikKLXsKLSAgICB1dGlsX3VybF9ub2RlX3QgKm5vZGUgPSAodXRpbF91cmxfbm9kZV90ICopbjsKLSAgICByZXR1cm4gdXRpbF9hbGRfaGFzaF9zdHJpbmcoMSwgbm9kZS0+dXJsKTsKLX0KLQotaW50IHV0aWxfbGRhcF91cmxfbm9kZV9jb21wYXJlKHZvaWQgKmEsIHZvaWQgKmIpCi17Ci0gICAgdXRpbF91cmxfbm9kZV90ICpuYSA9ICh1dGlsX3VybF9ub2RlX3QgKilhOwotICAgIHV0aWxfdXJsX25vZGVfdCAqbmIgPSAodXRpbF91cmxfbm9kZV90ICopYjsKLQotICAgIHJldHVybihzdHJjbXAobmEtPnVybCwgbmItPnVybCkgPT0gMCk7Ci19Ci0KLXZvaWQgKnV0aWxfbGRhcF91cmxfbm9kZV9jb3B5KHZvaWQgKmMpCi17Ci0gICAgdXRpbF91cmxfbm9kZV90ICpuID0gKHV0aWxfdXJsX25vZGVfdCAqKWM7Ci0gICAgdXRpbF91cmxfbm9kZV90ICpub2RlID0gKHV0aWxfdXJsX25vZGVfdCAqKXV0aWxfYWxkX2FsbG9jKHNpemVvZih1dGlsX3VybF9ub2RlX3QpKTsKLQotICAgIGlmIChub2RlKSB7Ci0gICAgICAgIGlmICghKG5vZGUtPnVybCA9IHV0aWxfYWxkX3N0cmR1cChuLT51cmwpKSkgewotICAgICAgICAgICAgdXRpbF9hbGRfZnJlZShub2RlLT51cmwpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZS0+c2VhcmNoX2NhY2hlID0gbi0+c2VhcmNoX2NhY2hlOwotICAgICAgICBub2RlLT5jb21wYXJlX2NhY2hlID0gbi0+Y29tcGFyZV9jYWNoZTsKLSAgICAgICAgbm9kZS0+ZG5fY29tcGFyZV9jYWNoZSA9IG4tPmRuX2NvbXBhcmVfY2FjaGU7Ci0gICAgICAgIHJldHVybiBub2RlOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi12b2lkIHV0aWxfbGRhcF91cmxfbm9kZV9mcmVlKHZvaWQgKm4pCi17Ci0gICAgdXRpbF91cmxfbm9kZV90ICpub2RlID0gKHV0aWxfdXJsX25vZGVfdCAqKW47Ci0KLSAgICB1dGlsX2FsZF9mcmVlKG5vZGUtPnVybCk7Ci0gICAgdXRpbF9hbGRfZGVzdHJveV9jYWNoZShub2RlLT5zZWFyY2hfY2FjaGUpOwotICAgIHV0aWxfYWxkX2Rlc3Ryb3lfY2FjaGUobm9kZS0+Y29tcGFyZV9jYWNoZSk7Ci0gICAgdXRpbF9hbGRfZGVzdHJveV9jYWNoZShub2RlLT5kbl9jb21wYXJlX2NhY2hlKTsKLSAgICB1dGlsX2FsZF9mcmVlKG5vZGUpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogQ2FjaGUgZnVuY3Rpb25zIGZvciBzZWFyY2ggbm9kZXMgKi8KLXVuc2lnbmVkIGxvbmcgdXRpbF9sZGFwX3NlYXJjaF9ub2RlX2hhc2godm9pZCAqbikKLXsKLSAgICB1dGlsX3NlYXJjaF9ub2RlX3QgKm5vZGUgPSAodXRpbF9zZWFyY2hfbm9kZV90ICopbjsKLSAgICByZXR1cm4gdXRpbF9hbGRfaGFzaF9zdHJpbmcoMSwgKCh1dGlsX3NlYXJjaF9ub2RlX3QgKikobm9kZSkpLT51c2VybmFtZSk7Ci19Ci0KLWludCB1dGlsX2xkYXBfc2VhcmNoX25vZGVfY29tcGFyZSh2b2lkICphLCB2b2lkICpiKQotewotICAgIHJldHVybihzdHJjbXAoKCh1dGlsX3NlYXJjaF9ub2RlX3QgKilhKS0+dXNlcm5hbWUsCi0JCSAgKCh1dGlsX3NlYXJjaF9ub2RlX3QgKiliKS0+dXNlcm5hbWUpID09IDApOwotfQotCi12b2lkICp1dGlsX2xkYXBfc2VhcmNoX25vZGVfY29weSh2b2lkICpjKQotewotICAgIHV0aWxfc2VhcmNoX25vZGVfdCAqbm9kZSA9ICh1dGlsX3NlYXJjaF9ub2RlX3QgKiljOwotICAgIHV0aWxfc2VhcmNoX25vZGVfdCAqbmV3bm9kZSA9IHV0aWxfYWxkX2FsbG9jKHNpemVvZih1dGlsX3NlYXJjaF9ub2RlX3QpKTsKLQotICAgIC8qIHNhZmV0eSBjaGVjayAqLwotICAgIGlmIChuZXdub2RlKSB7Ci0KLSAgICAgICAgLyogY29weSB2YWxzICovCi0gICAgICAgIGlmIChub2RlLT52YWxzKSB7Ci0gICAgICAgICAgICBpbnQgayA9IDA7Ci0gICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAobm9kZS0+dmFsc1trKytdKTsKLSAgICAgICAgICAgIGlmICghKG5ld25vZGUtPnZhbHMgPSB1dGlsX2FsZF9hbGxvYyhzaXplb2YoY2hhciAqKSAqIChrKzEpKSkpIHsKLSAgICAgICAgICAgICAgICB1dGlsX2xkYXBfc2VhcmNoX25vZGVfZnJlZShuZXdub2RlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChub2RlLT52YWxzW2ldKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEobmV3bm9kZS0+dmFsc1tpXSA9IHV0aWxfYWxkX3N0cmR1cChub2RlLT52YWxzW2ldKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdXRpbF9sZGFwX3NlYXJjaF9ub2RlX2ZyZWUobmV3bm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBuZXdub2RlLT52YWxzID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIShuZXdub2RlLT51c2VybmFtZSA9IHV0aWxfYWxkX3N0cmR1cChub2RlLT51c2VybmFtZSkpIHx8Ci0gICAgICAgICAgICAhKG5ld25vZGUtPmRuID0gdXRpbF9hbGRfc3RyZHVwKG5vZGUtPmRuKSkgfHwKLSAgICAgICAgICAgICEobmV3bm9kZS0+YmluZHB3ID0gdXRpbF9hbGRfc3RyZHVwKG5vZGUtPmJpbmRwdykpICkgewotICAgICAgICAgICAgdXRpbF9sZGFwX3NlYXJjaF9ub2RlX2ZyZWUobmV3bm9kZSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBuZXdub2RlLT5sYXN0YmluZCA9IG5vZGUtPmxhc3RiaW5kOwotCi0gICAgfQotICAgIHJldHVybiAodm9pZCAqKW5ld25vZGU7Ci19Ci0KLXZvaWQgdXRpbF9sZGFwX3NlYXJjaF9ub2RlX2ZyZWUodm9pZCAqbikKLXsKLSAgICBpbnQgaSA9IDA7Ci0gICAgdXRpbF9zZWFyY2hfbm9kZV90ICpub2RlID0gKHV0aWxfc2VhcmNoX25vZGVfdCAqKW47Ci0gICAgaWYgKG5vZGUtPnZhbHMpIHsKLSAgICAgICAgd2hpbGUgKG5vZGUtPnZhbHNbaV0pIHsKLSAgICAgICAgICAgIHV0aWxfYWxkX2ZyZWUobm9kZS0+dmFsc1tpKytdKTsKLSAgICAgICAgfQotICAgICAgICB1dGlsX2FsZF9mcmVlKG5vZGUtPnZhbHMpOwotICAgIH0KLSAgICB1dGlsX2FsZF9mcmVlKG5vZGUtPnVzZXJuYW1lKTsKLSAgICB1dGlsX2FsZF9mcmVlKG5vZGUtPmRuKTsKLSAgICB1dGlsX2FsZF9mcmVlKG5vZGUtPmJpbmRwdyk7Ci0gICAgdXRpbF9hbGRfZnJlZShub2RlKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXVuc2lnbmVkIGxvbmcgdXRpbF9sZGFwX2NvbXBhcmVfbm9kZV9oYXNoKHZvaWQgKm4pCi17Ci0gICAgdXRpbF9jb21wYXJlX25vZGVfdCAqbm9kZSA9ICh1dGlsX2NvbXBhcmVfbm9kZV90ICopbjsKLSAgICByZXR1cm4gdXRpbF9hbGRfaGFzaF9zdHJpbmcoMywgbm9kZS0+ZG4sIG5vZGUtPmF0dHJpYiwgbm9kZS0+dmFsdWUpOwotfQotCi1pbnQgdXRpbF9sZGFwX2NvbXBhcmVfbm9kZV9jb21wYXJlKHZvaWQgKmEsIHZvaWQgKmIpCi17Ci0gICAgdXRpbF9jb21wYXJlX25vZGVfdCAqbmEgPSAodXRpbF9jb21wYXJlX25vZGVfdCAqKWE7Ci0gICAgdXRpbF9jb21wYXJlX25vZGVfdCAqbmIgPSAodXRpbF9jb21wYXJlX25vZGVfdCAqKWI7Ci0gICAgcmV0dXJuIChzdHJjbXAobmEtPmRuLCBuYi0+ZG4pID09IDAgJiYKLQkgICAgc3RyY21wKG5hLT5hdHRyaWIsIG5iLT5hdHRyaWIpID09IDAgJiYKLQkgICAgc3RyY21wKG5hLT52YWx1ZSwgbmItPnZhbHVlKSA9PSAwKTsKLX0KLQotdm9pZCAqdXRpbF9sZGFwX2NvbXBhcmVfbm9kZV9jb3B5KHZvaWQgKmMpCi17Ci0gICAgdXRpbF9jb21wYXJlX25vZGVfdCAqbiA9ICh1dGlsX2NvbXBhcmVfbm9kZV90ICopYzsKLSAgICB1dGlsX2NvbXBhcmVfbm9kZV90ICpub2RlID0gKHV0aWxfY29tcGFyZV9ub2RlX3QgKil1dGlsX2FsZF9hbGxvYyhzaXplb2YodXRpbF9jb21wYXJlX25vZGVfdCkpOwotCi0gICAgaWYgKG5vZGUpIHsKLSAgICAgICAgaWYgKCEobm9kZS0+ZG4gPSB1dGlsX2FsZF9zdHJkdXAobi0+ZG4pKSB8fAotICAgICAgICAgICAgIShub2RlLT5hdHRyaWIgPSB1dGlsX2FsZF9zdHJkdXAobi0+YXR0cmliKSkgfHwKLSAgICAgICAgICAgICEobm9kZS0+dmFsdWUgPSB1dGlsX2FsZF9zdHJkdXAobi0+dmFsdWUpKSkgewotICAgICAgICAgICAgdXRpbF9sZGFwX2NvbXBhcmVfbm9kZV9mcmVlKG5vZGUpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZS0+bGFzdGNvbXBhcmUgPSBuLT5sYXN0Y29tcGFyZTsKLSAgICAgICAgbm9kZS0+cmVzdWx0ID0gbi0+cmVzdWx0OwotICAgICAgICByZXR1cm4gbm9kZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotdm9pZCB1dGlsX2xkYXBfY29tcGFyZV9ub2RlX2ZyZWUodm9pZCAqbikKLXsKLSAgICB1dGlsX2NvbXBhcmVfbm9kZV90ICpub2RlID0gKHV0aWxfY29tcGFyZV9ub2RlX3QgKiluOwotICAgIHV0aWxfYWxkX2ZyZWUobm9kZS0+ZG4pOwotICAgIHV0aWxfYWxkX2ZyZWUobm9kZS0+YXR0cmliKTsKLSAgICB1dGlsX2FsZF9mcmVlKG5vZGUtPnZhbHVlKTsKLSAgICB1dGlsX2FsZF9mcmVlKG5vZGUpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotdW5zaWduZWQgbG9uZyB1dGlsX2xkYXBfZG5fY29tcGFyZV9ub2RlX2hhc2godm9pZCAqbikKLXsKLSAgICByZXR1cm4gdXRpbF9hbGRfaGFzaF9zdHJpbmcoMSwgKCh1dGlsX2RuX2NvbXBhcmVfbm9kZV90ICopbiktPnJlcWRuKTsKLX0KLQotaW50IHV0aWxfbGRhcF9kbl9jb21wYXJlX25vZGVfY29tcGFyZSh2b2lkICphLCB2b2lkICpiKQotewotICAgIHJldHVybiAoc3RyY21wKCgodXRpbF9kbl9jb21wYXJlX25vZGVfdCAqKWEpLT5yZXFkbiwKLQkJICAgKCh1dGlsX2RuX2NvbXBhcmVfbm9kZV90ICopYiktPnJlcWRuKSA9PSAwKTsKLX0KLQotdm9pZCAqdXRpbF9sZGFwX2RuX2NvbXBhcmVfbm9kZV9jb3B5KHZvaWQgKmMpCi17Ci0gICAgdXRpbF9kbl9jb21wYXJlX25vZGVfdCAqbiA9ICh1dGlsX2RuX2NvbXBhcmVfbm9kZV90ICopYzsKLSAgICB1dGlsX2RuX2NvbXBhcmVfbm9kZV90ICpub2RlID0gKHV0aWxfZG5fY29tcGFyZV9ub2RlX3QgKil1dGlsX2FsZF9hbGxvYyhzaXplb2YodXRpbF9kbl9jb21wYXJlX25vZGVfdCkpOwotICAgIGlmIChub2RlKSB7Ci0gICAgICAgIGlmICghKG5vZGUtPnJlcWRuID0gdXRpbF9hbGRfc3RyZHVwKG4tPnJlcWRuKSkgfHwKLSAgICAgICAgICAgICEobm9kZS0+ZG4gPSB1dGlsX2FsZF9zdHJkdXAobi0+ZG4pKSkgewotICAgICAgICAgICAgdXRpbF9sZGFwX2RuX2NvbXBhcmVfbm9kZV9mcmVlKG5vZGUpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLXZvaWQgdXRpbF9sZGFwX2RuX2NvbXBhcmVfbm9kZV9mcmVlKHZvaWQgKm4pCi17Ci0gICAgdXRpbF9kbl9jb21wYXJlX25vZGVfdCAqbm9kZSA9ICh1dGlsX2RuX2NvbXBhcmVfbm9kZV90ICopbjsKLSAgICB1dGlsX2FsZF9mcmVlKG5vZGUtPnJlcWRuKTsKLSAgICB1dGlsX2FsZF9mcmVlKG5vZGUtPmRuKTsKLSAgICB1dGlsX2FsZF9mcmVlKG5vZGUpOwotfQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotYXByX3N0YXR1c190IHV0aWxfbGRhcF9jYWNoZV9jaGlsZF9raWxsKHZvaWQgKmRhdGEpOwotYXByX3N0YXR1c190IHV0aWxfbGRhcF9jYWNoZV9tb2R1bGVfa2lsbCh2b2lkICpkYXRhKTsKLQotYXByX3N0YXR1c190IHV0aWxfbGRhcF9jYWNoZV9tb2R1bGVfa2lsbCh2b2lkICpkYXRhKQotewotI2lmIEFQUl9IQVNfU0hBUkVEX01FTU9SWQotICAgIGlmICh1dGlsX2xkYXBfc2htICE9IE5VTEwpIHsKLSAgICAgICAgYXByX3N0YXR1c190IHJlc3VsdCA9IGFwcl9zaG1fZGVzdHJveSh1dGlsX2xkYXBfc2htKTsKLSAgICAgICAgdXRpbF9sZGFwX3NobSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotI2VuZGlmCi0gICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotfQotCi1hcHJfc3RhdHVzX3QgdXRpbF9sZGFwX2NhY2hlX2luaXQoYXByX3Bvb2xfdCAqcG9vbCwgYXByX3NpemVfdCByZXFzaXplKQotewotICAgIGFwcl9zdGF0dXNfdCByZXN1bHQgPSBBUFJfU1VDQ0VTUzsKLSAgICBhcHJfcG9vbF9jbGVhbnVwX3JlZ2lzdGVyKHBvb2wsIE5VTEwsIHV0aWxfbGRhcF9jYWNoZV9tb2R1bGVfa2lsbCwgYXByX3Bvb2xfY2xlYW51cF9udWxsKTsKLQotI2lmIEFQUl9IQVNfU0hBUkVEX01FTU9SWQotICAgIHJlc3VsdCA9IGFwcl9zaG1faW5pdCgmdXRpbF9sZGFwX3NobSwgcmVxc2l6ZSwgIi90bXAvbGRhcF9jYWNoZSIsIHBvb2wpOwotI2VuZGlmCi0gICAgdXRpbF9sZGFwX2NhY2hlID0gdXRpbF9hbGRfY3JlYXRlX2NhY2hlKDUwLAotCQkJCSAgICAgdXRpbF9sZGFwX3VybF9ub2RlX2hhc2gsCi0JCQkJICAgICB1dGlsX2xkYXBfdXJsX25vZGVfY29tcGFyZSwKLQkJCQkgICAgIHV0aWxfbGRhcF91cmxfbm9kZV9jb3B5LAotCQkJCSAgICAgdXRpbF9sZGFwX3VybF9ub2RlX2ZyZWUpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotI2VuZGlmIC8qIEFQVV9IQVNfTERBUCAqLwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9leHBlcmltZW50YWwvdXRpbF9sZGFwX2NhY2hlLmggYi9tb2R1bGVzL2V4cGVyaW1lbnRhbC91dGlsX2xkYXBfY2FjaGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg3OTBlYi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2V4cGVyaW1lbnRhbC91dGlsX2xkYXBfY2FjaGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLQotI2lmbmRlZiBBUFVfTERBUF9DQUNIRV9ICi0jZGVmaW5lIEFQVV9MREFQX0NBQ0hFX0gKLQotLyoKLSAqIFRoaXMgc3dpdGNoZXMgTERBUCBzdXBwb3J0IG9uIG9yIG9mZi4KLSAqLwotCi0vKiB0aGlzIHdob2xlIHRoaW5nIGRpc2FwcGVhcnMgaWYgTERBUCBpcyBub3QgZW5hYmxlZCAqLwotI2lmZGVmIEFQVV9IQVNfTERBUAotCi0KLS8qCi0gKiBMREFQIENhY2hlIE1hbmFnZXIKLSAqLwotCi0jaW5jbHVkZSA8YXByX3NobWVtLmg+Ci0KLXR5cGVkZWYgc3RydWN0IHV0aWxfY2FjaGVfbm9kZV90IHsKLSAgICB2b2lkICpwYXlsb2FkOwkJLyogUG9pbnRlciB0byB0aGUgcGF5bG9hZCAqLwotICAgIHRpbWVfdCBhZGRfdGltZTsJCS8qIFRpbWUgbm9kZSB3YXMgYWRkZWQgdG8gY2FjaGUgKi8KLSAgICBzdHJ1Y3QgdXRpbF9jYWNoZV9ub2RlX3QgKm5leHQ7Ci19IHV0aWxfY2FjaGVfbm9kZV90OwotCi10eXBlZGVmIHN0cnVjdCB1dGlsX2FsZF9jYWNoZV90IHsKLSAgICB1bnNpZ25lZCBsb25nIHNpemU7CQkvKiBTaXplIG9mIGNhY2hlIGFycmF5ICovCi0gICAgdW5zaWduZWQgbG9uZyBtYXhlbnRyaWVzOwkvKiBNYXhpbXVtIG51bWJlciBvZiBjYWNoZSBlbnRyaWVzICovCi0gICAgdW5zaWduZWQgbG9uZyBudW1lbnRyaWVzOwkvKiBDdXJyZW50IG51bWJlciBvZiBjYWNoZSBlbnRyaWVzICovCi0gICAgdW5zaWduZWQgbG9uZyBmdWxsbWFyazsJLyogVXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoZW4gY2FjaGUgYmVjb21lcyAzLzQgZnVsbCAqLwotICAgIHRpbWVfdCBtYXJrdGltZTsJCS8qIFRpbWUgdGhhdCB0aGUgY2FjaGUgYmVjYW1lIDMvNCBmdWxsICovCi0gICAgdW5zaWduZWQgbG9uZyAoKmhhc2gpKHZvaWQgKik7ICAvKiBGdW5jIHRvIGhhc2ggdGhlIHBheWxvYWQgKi8KLSAgICBpbnQgKCpjb21wYXJlKSh2b2lkICosIHZvaWQgKik7IC8qIEZ1bmMgdG8gY29tcGFyZSB0d28gcGF5bG9hZHMgKi8KLSAgICB2b2lkICogKCpjb3B5KSh2b2lkICopOwkvKiBGdW5jIHRvIGFsbG9jIG1lbSBhbmQgY29weSBwYXlsb2FkIHRvIG5ldyBtZW0gKi8KLSAgICB2b2lkICgqZnJlZSkodm9pZCAqKTsJCS8qIEZ1bmMgdG8gZnJlZSBtZW0gdXNlZCBieSB0aGUgcGF5bG9hZCAqLwotICAgIHV0aWxfY2FjaGVfbm9kZV90ICoqbm9kZXM7Ci0KLSAgICB1bnNpZ25lZCBsb25nIG51bXB1cmdlczsJLyogTm8uIG9mIHRpbWVzIHRoZSBjYWNoZSBoYXMgYmVlbiBwdXJnZWQgKi8KLSAgICBkb3VibGUgYXZnX3B1cmdldGltZTsJCS8qIEF2ZXJhZ2UgdGltZSB0byBwdXJnZSB0aGUgY2FjaGUgKi8KLSAgICB0aW1lX3QgbGFzdF9wdXJnZTsJCS8qIFRpbWUgb2YgdGhlIGxhc3QgcHVyZ2UgKi8KLSAgICB1bnNpZ25lZCBsb25nIG5wdXJnZWQ7CS8qIE51bWJlciBvZiBlbGVtZW50cyBwdXJnZWQgaW4gbGFzdCBwdXJnZS4gVGhpcyBpcyBub3QKLQkJCQkgICBvYnZpb3VzOiBpdCB3b24ndCBiZSAzLzQgdGhlIHNpemUgb2YgdGhlIGNhY2hlIGlmIAotCQkJCSAgIHRoZXJlIHdlcmUgYSBsb3Qgb2YgZXhwaXJlZCBlbnRyaWVzLiAqLwotCi0gICAgdW5zaWduZWQgbG9uZyBmZXRjaGVzOwkvKiBOdW1iZXIgb2YgZmV0Y2hlcyAqLwotICAgIHVuc2lnbmVkIGxvbmcgaGl0czsJCS8qIE51bWJlciBvZiBjYWNoZSBoaXRzICovCi0gICAgdW5zaWduZWQgbG9uZyBpbnNlcnRzOwkvKiBOdW1iZXIgb2YgaW5zZXJ0cyAqLwotICAgIHVuc2lnbmVkIGxvbmcgcmVtb3ZlczsJLyogTnVtYmVyIG9mIHJlbW92ZXMgKi8KLX0gdXRpbF9hbGRfY2FjaGVfdDsKLQotI2lmIEFQUl9IQVNfU0hBUkVEX01FTU9SWQotYXByX3NobWVtX3QgKnV0aWxfbGRhcF9zaG07Ci0jZW5kaWYKLXV0aWxfYWxkX2NhY2hlX3QgKnV0aWxfbGRhcF9jYWNoZTsKLWFwcl9sb2NrX3QgKnV0aWxfbGRhcF9jYWNoZV9sb2NrOwotCi0jaWZuZGVmIFdJTjMyCi0jZGVmaW5lIEFMRF9NTV9GSUxFX01PREUgKCBTX0lSVVNSfFNfSVdVU1IgKQotI2Vsc2UKLSNkZWZpbmUgQUxEX01NX0ZJTEVfTU9ERSAoIF9TX0lSRUFEfF9TX0lXUklURSApCi0jZW5kaWYKLQotCi0vKgotICogTERBUCBDYWNoZQotICovCi0KLS8qCi0gKiBNYWludGFpbiBhIGNhY2hlIG9mIExEQVAgVVJMcyB0aGF0IHRoZSBzZXJ2ZXIgaGFuZGxlcy4gRWFjaCBub2RlIGluCi0gKiB0aGUgY2FjaGUgY29udGFpbnMgdGhlIHNlYXJjaCBjYWNoZSBmb3IgdGhhdCBVUkwsIGFuZCBhIGNvbXBhcmUgY2FjaGUKLSAqIGZvciB0aGUgVVJMLiBUaGUgY29tcGFyZSBjYXNoIGlzIHBvcHVsYXRlZCB3aGVuIGRvaW5nIHJlcXVpcmUgZ3JvdXAKLSAqIGNvbXBhcmVzLgotICovCi10eXBlZGVmIHN0cnVjdCB1dGlsX3VybF9ub2RlX3QgewotICAgIGNvbnN0IGNoYXIgKnVybDsKLSAgICB1dGlsX2FsZF9jYWNoZV90ICpzZWFyY2hfY2FjaGU7Ci0gICAgdXRpbF9hbGRfY2FjaGVfdCAqY29tcGFyZV9jYWNoZTsKLSAgICB1dGlsX2FsZF9jYWNoZV90ICpkbl9jb21wYXJlX2NhY2hlOwotfSB1dGlsX3VybF9ub2RlX3Q7Ci0KLS8qCi0gKiBXZSBjYWNoZSBldmVyeSBzdWNjZXNzZnVsIHNlYXJjaCBhbmQgYmluZCBvcGVyYXRpb24sIHVzaW5nIHRoZSB1c2VybmFtZSAKLSAqIGFzIHRoZSBrZXkuIEVhY2ggbm9kZSBpbiB0aGUgY2FjaGUgY29udGFpbnMgdGhlIHJldHVybmVkIEROLCBwbHVzIHRoZSAKLSAqIHBhc3N3b3JkIHVzZWQgdG8gYmluZC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgdXRpbF9zZWFyY2hfbm9kZV90IHsKLSAgICBjb25zdCBjaGFyICp1c2VybmFtZTsJCS8qIENhY2hlIGtleSAqLwotICAgIGNvbnN0IGNoYXIgKmRuOwkJCS8qIEROIHJldHVybmVkIGZyb20gc2VhcmNoICovCi0gICAgY29uc3QgY2hhciAqYmluZHB3OwkJCS8qIFRoZSBtb3N0IHJlY2VudGx5IHVzZWQgYmluZCBwYXNzd29yZDsgCi0JCQkJCSAgIE5VTEwgaWYgdGhlIGJpbmQgZmFpbGVkICovCi0gICAgYXByX3RpbWVfdCBsYXN0YmluZDsJCS8qIFRpbWUgb2YgbGFzdCBzdWNjZXNzZnVsIGJpbmQgKi8KLSAgICBjb25zdCBjaGFyICoqdmFsczsJCQkvKiBWYWx1ZXMgb2YgcXVlcmllZCBhdHRyaWJ1dGVzICovCi19IHV0aWxfc2VhcmNoX25vZGVfdDsKLQotLyoKLSAqIFdlIGNhY2hlIGV2ZXJ5IHN1Y2Nlc3NmdWwgY29tcGFyZSBvcGVyYXRpb24sIHVzaW5nIHRoZSBETiwgYXR0cmliLCBhbmQKLSAqIHZhbHVlIGFzIHRoZSBrZXkuIAotICovCi10eXBlZGVmIHN0cnVjdCB1dGlsX2NvbXBhcmVfbm9kZV90IHsKLSAgICBjb25zdCBjaGFyICpkbjsJCQkvKiBETiwgYXR0cmliIGFuZCB2YWx1ZSBjb21iaW5lIHRvIGJlIHRoZSBrZXkgKi8KLSAgICBjb25zdCBjaGFyICphdHRyaWI7CQkJCi0gICAgY29uc3QgY2hhciAqdmFsdWU7Ci0gICAgYXByX3RpbWVfdCBsYXN0Y29tcGFyZTsKLSAgICBpbnQgcmVzdWx0OwotfSB1dGlsX2NvbXBhcmVfbm9kZV90OwotCi0vKgotICogV2UgY2FjaGUgZXZlcnkgc3VjY2Vzc2Z1bCBjb21wYXJlIGRuIG9wZXJhdGlvbiwgdXNpbmcgdGhlIGRuIGluIHRoZSByZXF1aXJlCi0gKiBzdGF0ZW1lbnQgYW5kIHRoZSBkbiBmZXRjaGVkIGJhc2VkIG9uIHRoZSBjbGllbnQtcHJvdmlkZWQgdXNlcm5hbWUuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHV0aWxfZG5fY29tcGFyZV9ub2RlX3QgewotICAgIGNvbnN0IGNoYXIgKnJlcWRuOwkJLyogVGhlIEROIGluIHRoZSByZXF1aXJlIGRuIHN0YXRlbWVudCAqLwotICAgIGNvbnN0IGNoYXIgKmRuOwkJCS8qIFRoZSBETiBmb3VuZCBpbiB0aGUgc2VhcmNoICovCi19IHV0aWxfZG5fY29tcGFyZV9ub2RlX3Q7Ci0KLQotLyoKLSAqIEZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIExEQVAgY2FjaGUKLSAqLwotCi0vKiB1dGlsX2xkYXBfY2FjaGUuYyAqLwotdW5zaWduZWQgbG9uZyB1dGlsX2xkYXBfdXJsX25vZGVfaGFzaCh2b2lkICpuKTsKLWludCB1dGlsX2xkYXBfdXJsX25vZGVfY29tcGFyZSh2b2lkICphLCB2b2lkICpiKTsKLXZvaWQgKnV0aWxfbGRhcF91cmxfbm9kZV9jb3B5KHZvaWQgKmMpOwotdm9pZCB1dGlsX2xkYXBfdXJsX25vZGVfZnJlZSh2b2lkICpuKTsKLXVuc2lnbmVkIGxvbmcgdXRpbF9sZGFwX3NlYXJjaF9ub2RlX2hhc2godm9pZCAqbik7Ci1pbnQgdXRpbF9sZGFwX3NlYXJjaF9ub2RlX2NvbXBhcmUodm9pZCAqYSwgdm9pZCAqYik7Ci12b2lkICp1dGlsX2xkYXBfc2VhcmNoX25vZGVfY29weSh2b2lkICpjKTsKLXZvaWQgdXRpbF9sZGFwX3NlYXJjaF9ub2RlX2ZyZWUodm9pZCAqbik7Ci11bnNpZ25lZCBsb25nIHV0aWxfbGRhcF9jb21wYXJlX25vZGVfaGFzaCh2b2lkICpuKTsKLWludCB1dGlsX2xkYXBfY29tcGFyZV9ub2RlX2NvbXBhcmUodm9pZCAqYSwgdm9pZCAqYik7Ci12b2lkICp1dGlsX2xkYXBfY29tcGFyZV9ub2RlX2NvcHkodm9pZCAqYyk7Ci12b2lkIHV0aWxfbGRhcF9jb21wYXJlX25vZGVfZnJlZSh2b2lkICpuKTsKLXVuc2lnbmVkIGxvbmcgdXRpbF9sZGFwX2RuX2NvbXBhcmVfbm9kZV9oYXNoKHZvaWQgKm4pOwotaW50IHV0aWxfbGRhcF9kbl9jb21wYXJlX25vZGVfY29tcGFyZSh2b2lkICphLCB2b2lkICpiKTsKLXZvaWQgKnV0aWxfbGRhcF9kbl9jb21wYXJlX25vZGVfY29weSh2b2lkICpjKTsKLXZvaWQgdXRpbF9sZGFwX2RuX2NvbXBhcmVfbm9kZV9mcmVlKHZvaWQgKm4pOwotCi0KLS8qIHV0aWxfbGRhcF9jYWNoZV9tZ3IuYyAqLwotCi12b2lkIHV0aWxfYWxkX2ZyZWUoY29uc3Qgdm9pZCAqcHRyKTsKLXZvaWQgKnV0aWxfYWxkX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci1jb25zdCBjaGFyICp1dGlsX2FsZF9zdHJkdXAoY29uc3QgY2hhciAqcyk7Ci11bnNpZ25lZCBsb25nIHV0aWxfYWxkX2hhc2hfc3RyaW5nKGludCBuc3RyLCAuLi4pOwotdm9pZCB1dGlsX2FsZF9jYWNoZV9wdXJnZSh1dGlsX2FsZF9jYWNoZV90ICpjYWNoZSk7Ci11dGlsX3VybF9ub2RlX3QgKnV0aWxfYWxkX2NyZWF0ZV9jYWNoZXModXRpbF9sZGFwX3N0YXRlX3QgKnMsIGNvbnN0IGNoYXIgKnVybCk7Ci11dGlsX2FsZF9jYWNoZV90ICp1dGlsX2FsZF9jcmVhdGVfY2FjaGUodW5zaWduZWQgbG9uZyBtYXhlbnRyaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICgqaGFzaGZ1bmMpKHZvaWQgKiksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpjb21wYXJlZnVuYykodm9pZCAqLCB2b2lkICopLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogKCpjb3B5ZnVuYykodm9pZCAqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmZyZWVmdW5jKSh2b2lkICopKTsKLXZvaWQgdXRpbF9hbGRfZGVzdHJveV9jYWNoZSh1dGlsX2FsZF9jYWNoZV90ICpjYWNoZSk7Ci12b2lkICp1dGlsX2FsZF9jYWNoZV9mZXRjaCh1dGlsX2FsZF9jYWNoZV90ICpjYWNoZSwgdm9pZCAqcGF5bG9hZCk7Ci12b2lkIHV0aWxfYWxkX2NhY2hlX2luc2VydCh1dGlsX2FsZF9jYWNoZV90ICpjYWNoZSwgdm9pZCAqcGF5bG9hZCk7Ci12b2lkIHV0aWxfYWxkX2NhY2hlX3JlbW92ZSh1dGlsX2FsZF9jYWNoZV90ICpjYWNoZSwgdm9pZCAqcGF5bG9hZCk7Ci1jaGFyICp1dGlsX2FsZF9jYWNoZV9kaXNwbGF5X3N0YXRzKGFwcl9wb29sX3QgKnAsIHV0aWxfYWxkX2NhY2hlX3QgKmNhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqbmFtZSk7Ci0KLSNlbmRpZiAvKiBBUFVfSEFTX0xEQVAgKi8KLSNlbmRpZiAvKiBBUFVfTERBUF9DQUNIRV9IICovCmRpZmYgLS1naXQgYS9tb2R1bGVzL2V4cGVyaW1lbnRhbC91dGlsX2xkYXBfY2FjaGVfbWdyLmMgYi9tb2R1bGVzL2V4cGVyaW1lbnRhbC91dGlsX2xkYXBfY2FjaGVfbWdyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZWVjZTg5Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZXhwZXJpbWVudGFsL3V0aWxfbGRhcF9jYWNoZV9tZ3IuYworKysgL2Rldi9udWxsCkBAIC0xLDUzNyArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLS8qCi0gKiB1dGlsX2xkYXBfY2FjaGVfbWdyLmM6IExEQVAgY2FjaGUgbWFuYWdlciB0aGluZ3MKLSAqIAotICogT3JpZ2luYWwgY29kZSBmcm9tIGF1dGhfbGRhcCBtb2R1bGUgZm9yIEFwYWNoZSB2MS4zOgotICogQ29weXJpZ2h0IDE5OTgsIDE5OTkgRW5icmlkZ2UgUGlwZWxpbmVzIEluYy4gCi0gKiBDb3B5cmlnaHQgMTk5OS0yMDAxIERhdmUgQ2FycmlnYW4KLSAqLwotCi0jaW5jbHVkZSA8YXByX2xkYXAuaD4KLSNpbmNsdWRlICJ1dGlsX2xkYXAuaCIKLSNpbmNsdWRlICJ1dGlsX2xkYXBfY2FjaGUuaCIKLSNpbmNsdWRlIDxhcHJfc3RyaW5ncy5oPgotCi0jaWZkZWYgQVBVX0hBU19MREFQCi0KLS8qIG9ubHkgaGVyZSB1bnRpbCBzdHJkdXAgaXMgZ29uZSAqLwotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKiBoZXJlIHRpbGwgbWFsbG9jIGlzIGdvbmUgKi8KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotc3RhdGljIGNvbnN0IGludCBwcmltZXNbXSA9Ci17Ci0gIDExLAotICAxOSwKLSAgMzcsCi0gIDczLAotICAxMDksCi0gIDE2MywKLSAgMjUxLAotICAzNjcsCi0gIDU1NywKLSAgODIzLAotICAxMjM3LAotICAxODYxLAotICAyNzc3LAotICA0MTc3LAotICA2MjQ3LAotICA5MzcxLAotICAxNDA1NywKLSAgMjEwODksCi0gIDMxNjI3LAotICA0NzQzMSwKLSAgNzExNDMsCi0gIDEwNjcyMSwKLSAgMTYwMDczLAotICAyNDAxMDEsCi0gIDM2MDE2MywKLSAgNTQwMjE3LAotICA4MTAzNDMsCi0gIDEyMTU0OTcsCi0gIDE4MjMyMzEsCi0gIDI3MzQ4NjcsCi0gIDQxMDIyODMsCi0gIDYxNTM0MDksCi0gIDkyMzAxMTMsCi0gIDEzODQ1MTYzLAotICAwCi19OwotCi12b2lkIHV0aWxfYWxkX2ZyZWUoY29uc3Qgdm9pZCAqcHRyKQotewotI2lmIEFQUl9IQVNfU0hBUkVEX01FTU9SWQotICAgIGlmICh1dGlsX2xkYXBfc2htKSB7Ci0gICAgICAgIGlmIChwdHIpCi0gICAgICAgICAgICBhcHJfc2htX2ZyZWUodXRpbF9sZGFwX3NobSwgKHZvaWQgKilwdHIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwdHIpCi0gICAgICAgICAgICBmcmVlKCh2b2lkICopcHRyKTsKLSAgICB9Ci0jZWxzZQotICAgIGlmIChwdHIpCi0gICAgICAgIGZyZWUoKHZvaWQgKilwdHIpOwotI2VuZGlmCi19Ci0KLXZvaWQgKnV0aWxfYWxkX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLSAgICBpZiAoMCA9PSBzaXplKQotICAgICAgICByZXR1cm4gTlVMTDsKLSNpZiBBUFJfSEFTX1NIQVJFRF9NRU1PUlkKLSAgICBpZiAodXRpbF9sZGFwX3NobSkgewotICAgICAgICByZXR1cm4gKHZvaWQgKilhcHJfc2htX2NhbGxvYyh1dGlsX2xkYXBfc2htLCBzaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gKHZvaWQgKiljYWxsb2Moc2l6ZW9mKGNoYXIpLCBzaXplKTsKLSAgICB9Ci0jZWxzZQotICAgIHJldHVybiAodm9pZCAqKWNhbGxvYyhzaXplb2YoY2hhciksIHNpemUpOwotI2VuZGlmCi19Ci0KLWNvbnN0IGNoYXIgKnV0aWxfYWxkX3N0cmR1cChjb25zdCBjaGFyICpzKQotewotI2lmIEFQUl9IQVNfU0hBUkVEX01FTU9SWQotICAgIGlmICh1dGlsX2xkYXBfc2htKSB7Ci0gICAgICAgIGNoYXIgKmJ1ZiA9IGFwcl9zaG1fbWFsbG9jKHV0aWxfbGRhcF9zaG0sIHN0cmxlbihzKSsxKTsKLSAgICAgICAgaWYgKGJ1ZikgewotICAgICAgICAgICAgc3RyY3B5KGJ1Ziwgcyk7Ci0gICAgICAgICAgICByZXR1cm4gYnVmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gc3RyZHVwKHMpOwotICAgIH0KLSNlbHNlCi0gICAgcmV0dXJuIHN0cmR1cChzKTsKLSNlbmRpZgotfQotCi0KLS8qCi0gKiBDb21wdXRlcyB0aGUgaGFzaCBvbiBhIHNldCBvZiBzdHJpbmdzLiBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIG51bWJlcgotICogb2Ygc3RyaW5ncyB0byBoYXNoLCB0aGUgcmVzdCBvZiB0aGUgYXJncyBhcmUgc3RyaW5ncy4gCi0gKiBBbGdvcml0aG0gdGFrZW4gZnJvbSBnbGliYy4KLSAqLwotdW5zaWduZWQgbG9uZyB1dGlsX2FsZF9oYXNoX3N0cmluZyhpbnQgbnN0ciwgLi4uKQotewotICAgIGludCBpOwotICAgIHZhX2xpc3QgYXJnczsKLSAgICB1bnNpZ25lZCBsb25nIGg9MCwgZzsKLSAgICBjaGFyICpzdHIsICpwOwotICAKLSAgICB2YV9zdGFydChhcmdzLCBuc3RyKTsKLSAgICBmb3IgKGk9MDsgaSA8IG5zdHI7ICsraSkgewotICAgICAgICBzdHIgPSB2YV9hcmcoYXJncywgY2hhciAqKTsKLSAgICAgICAgZm9yIChwID0gc3RyOyAqcDsgKytwKSB7Ci0gICAgICAgICAgICBoID0gKCBoIDw8IDQgKSArICpwOwotICAgICAgICAgICAgaWYgKCAoIGcgPSBoICYgMHhmMDAwMDAwMCApICkgewotCSAgICAgICAgaCA9IGggXiAoZyA+PiAyNCk7Ci0JICAgICAgICBoID0gaCBeIGc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdmFfZW5kKGFyZ3MpOwotCi0gICAgcmV0dXJuIGg7Ci19Ci0KLQotLyoKLSAgUHVyZ2VzIGEgY2FjaGUgdGhhdCBoYXMgZ290dGVuIGZ1bGwuIFdlIGtlZXAgdHJhY2sgb2YgdGhlIHRpbWUgdGhhdCB3ZQotICBhZGRlZCB0aGUgZW50cnkgdGhhdCBtYWRlIHRoZSBjYWNoZSAzLzQgZnVsbCwgdGhlbiBkZWxldGUgYWxsIGVudHJpZXMKLSAgdGhhdCB3ZXJlIGFkZGVkIGJlZm9yZSB0aGF0IHRpbWUuIEl0J3MgcHJldHR5IHNpbXBsaXN0aWMsIGJ1dCB0aW1lIHRvCi0gIHB1cmdlIGlzIG9ubHkgTyhuKSwgd2hpY2ggaXMgbW9yZSBpbXBvcnRhbnQuCi0qLwotdm9pZCB1dGlsX2FsZF9jYWNoZV9wdXJnZSh1dGlsX2FsZF9jYWNoZV90ICpjYWNoZSkKLXsKLSAgICBpbnQgaTsKLSAgICB1dGlsX2NhY2hlX25vZGVfdCAqcCwgKnE7Ci0gICAgYXByX3RpbWVfdCB0OwotCi0gICAgaWYgKCFjYWNoZSkKLSAgICAgICAgcmV0dXJuOwotICAKLSAgICBjYWNoZS0+bGFzdF9wdXJnZSA9IGFwcl90aW1lX25vdygpOwotICAgIGNhY2hlLT5ucHVyZ2VkID0gMDsKLSAgICBjYWNoZS0+bnVtcHVyZ2VzKys7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IGNhY2hlLT5zaXplOyArK2kpIHsKLSAgICAgICAgcCA9IGNhY2hlLT5ub2Rlc1tpXTsKLSAgICAgICAgd2hpbGUgKHAgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKHAtPmFkZF90aW1lIDwgY2FjaGUtPm1hcmt0aW1lKSB7Ci0JICAgICAgICBxID0gcC0+bmV4dDsKLQkgICAgICAgICgqY2FjaGUtPmZyZWUpKHAtPnBheWxvYWQpOwotCSAgICAgICAgdXRpbF9hbGRfZnJlZShwKTsKLQkgICAgICAgIGNhY2hlLT5udW1lbnRyaWVzLS07Ci0JICAgICAgICBjYWNoZS0+bnB1cmdlZCsrOwotCSAgICAgICAgcCA9IHE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLQkgICAgICAgIHAgPSBwLT5uZXh0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdCA9IGFwcl90aW1lX25vdygpOwotICAgIGNhY2hlLT5hdmdfcHVyZ2V0aW1lID0gCi0gICAgICAgICAoKHQgLSBjYWNoZS0+bGFzdF9wdXJnZSkgKyAoY2FjaGUtPmF2Z19wdXJnZXRpbWUgKiAoY2FjaGUtPm51bXB1cmdlcy0xKSkpIC8gCi0gICAgICAgICBjYWNoZS0+bnVtcHVyZ2VzOwotfQotCi0KLS8qCi0gKiBjcmVhdGUgY2FjaGVzCi0gKi8KLXV0aWxfdXJsX25vZGVfdCAqdXRpbF9hbGRfY3JlYXRlX2NhY2hlcyh1dGlsX2xkYXBfc3RhdGVfdCAqc3QsIGNvbnN0IGNoYXIgKnVybCkKLXsKLSAgICB1dGlsX3VybF9ub2RlX3QgKmN1cmwgPSBOVUxMOwotICAgIHV0aWxfYWxkX2NhY2hlX3QgKnNlYXJjaF9jYWNoZTsKLSAgICB1dGlsX2FsZF9jYWNoZV90ICpjb21wYXJlX2NhY2hlOwotICAgIHV0aWxfYWxkX2NhY2hlX3QgKmRuX2NvbXBhcmVfY2FjaGU7Ci0KLSAgICAvKiBjcmVhdGUgdGhlIHRocmVlIGNhY2hlcyAqLwotICAgIHNlYXJjaF9jYWNoZSA9IHV0aWxfYWxkX2NyZWF0ZV9jYWNoZShzdC0+c2VhcmNoX2NhY2hlX3NpemUsCi0JCQkJCSAgdXRpbF9sZGFwX3NlYXJjaF9ub2RlX2hhc2gsCi0JCQkJCSAgdXRpbF9sZGFwX3NlYXJjaF9ub2RlX2NvbXBhcmUsCi0JCQkJCSAgdXRpbF9sZGFwX3NlYXJjaF9ub2RlX2NvcHksCi0JCQkJCSAgdXRpbF9sZGFwX3NlYXJjaF9ub2RlX2ZyZWUpOwotICAgIGNvbXBhcmVfY2FjaGUgPSB1dGlsX2FsZF9jcmVhdGVfY2FjaGUoc3QtPmNvbXBhcmVfY2FjaGVfc2l6ZSwKLQkJCQkJICAgdXRpbF9sZGFwX2NvbXBhcmVfbm9kZV9oYXNoLAotCQkJCQkgICB1dGlsX2xkYXBfY29tcGFyZV9ub2RlX2NvbXBhcmUsCi0JCQkJCSAgIHV0aWxfbGRhcF9jb21wYXJlX25vZGVfY29weSwKLQkJCQkJICAgdXRpbF9sZGFwX2NvbXBhcmVfbm9kZV9mcmVlKTsKLSAgICBkbl9jb21wYXJlX2NhY2hlID0gdXRpbF9hbGRfY3JlYXRlX2NhY2hlKHN0LT5jb21wYXJlX2NhY2hlX3NpemUsCi0JCQkJCSAgICAgIHV0aWxfbGRhcF9kbl9jb21wYXJlX25vZGVfaGFzaCwKLQkJCQkJICAgICAgdXRpbF9sZGFwX2RuX2NvbXBhcmVfbm9kZV9jb21wYXJlLAotCQkJCQkgICAgICB1dGlsX2xkYXBfZG5fY29tcGFyZV9ub2RlX2NvcHksCi0JCQkJCSAgICAgIHV0aWxfbGRhcF9kbl9jb21wYXJlX25vZGVfZnJlZSk7Ci0KLSAgICAvKiBjaGVjayB0aGF0IGFsbCB0aGUgY2FjaGVzIGluaXRpYWxpc2VkIHN1Y2Nlc3NmdWxseSAqLwotICAgIGlmIChzZWFyY2hfY2FjaGUgJiYgY29tcGFyZV9jYWNoZSAmJiBkbl9jb21wYXJlX2NhY2hlKSB7Ci0KLSAgICAgICAgY3VybCA9ICh1dGlsX3VybF9ub2RlX3QgKilhcHJfcGNhbGxvYyhzdC0+cG9vbCwgc2l6ZW9mKHV0aWxfdXJsX25vZGVfdCkpOwotICAgICAgICBjdXJsLT51cmwgPSB1cmw7Ci0gICAgICAgIGN1cmwtPnNlYXJjaF9jYWNoZSA9IHNlYXJjaF9jYWNoZTsKLSAgICAgICAgY3VybC0+Y29tcGFyZV9jYWNoZSA9IGNvbXBhcmVfY2FjaGU7Ci0gICAgICAgIGN1cmwtPmRuX2NvbXBhcmVfY2FjaGUgPSBkbl9jb21wYXJlX2NhY2hlOwotCi0gICAgICAgIHV0aWxfYWxkX2NhY2hlX2luc2VydCh1dGlsX2xkYXBfY2FjaGUsIGN1cmwpOwotCi0gICAgfQotCi0gICAgcmV0dXJuIGN1cmw7Ci19Ci0KLQotdXRpbF9hbGRfY2FjaGVfdCAqdXRpbF9hbGRfY3JlYXRlX2NhY2hlKHVuc2lnbmVkIGxvbmcgbWF4ZW50cmllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAoKmhhc2hmdW5jKSh2b2lkICopLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqY29tcGFyZWZ1bmMpKHZvaWQgKiwgdm9pZCAqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqICgqY29weWZ1bmMpKHZvaWQgKiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpmcmVlZnVuYykodm9pZCAqKSkKLXsKLSAgICB1dGlsX2FsZF9jYWNoZV90ICpjYWNoZTsKLSAgICBpbnQgaTsKLQotICAgIGlmIChtYXhlbnRyaWVzIDw9IDApCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgY2FjaGUgPSAodXRpbF9hbGRfY2FjaGVfdCAqKXV0aWxfYWxkX2FsbG9jKHNpemVvZih1dGlsX2FsZF9jYWNoZV90KSk7Ci0gICAgaWYgKCFjYWNoZSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBjYWNoZS0+bWF4ZW50cmllcyA9IG1heGVudHJpZXM7Ci0gICAgY2FjaGUtPm51bWVudHJpZXMgPSAwOwotICAgIGNhY2hlLT5zaXplID0gbWF4ZW50cmllcyAvIDM7Ci0gICAgaWYgKGNhY2hlLT5zaXplIDwgNjQpIGNhY2hlLT5zaXplID0gNjQ7Ci0gICAgICAgIGZvciAoaSA9IDA7IHByaW1lc1tpXSAmJiBwcmltZXNbaV0gPCBjYWNoZS0+c2l6ZTsgKytpKSA7Ci0gICAgICAgICAgICBjYWNoZS0+c2l6ZSA9IHByaW1lc1tpXT8gcHJpbWVzW2ldIDogcHJpbWVzW2ktMV07Ci0KLSAgICBjYWNoZS0+bm9kZXMgPSAodXRpbF9jYWNoZV9ub2RlX3QgKiopdXRpbF9hbGRfYWxsb2MoY2FjaGUtPnNpemUgKiBzaXplb2YodXRpbF9jYWNoZV9ub2RlX3QgKikpOwotICAgIGlmICghY2FjaGUtPm5vZGVzKSB7Ci0gICAgICAgIHV0aWxfYWxkX2ZyZWUoY2FjaGUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKGk9MDsgaSA8IGNhY2hlLT5zaXplOyArK2kpCi0gICAgICAgIGNhY2hlLT5ub2Rlc1tpXSA9IE5VTEw7Ci0KLSAgICBjYWNoZS0+aGFzaCA9IGhhc2hmdW5jOwotICAgIGNhY2hlLT5jb21wYXJlID0gY29tcGFyZWZ1bmM7Ci0gICAgY2FjaGUtPmNvcHkgPSBjb3B5ZnVuYzsKLSAgICBjYWNoZS0+ZnJlZSA9IGZyZWVmdW5jOwotCi0gICAgY2FjaGUtPmZ1bGxtYXJrID0gY2FjaGUtPm1heGVudHJpZXMgLyA0ICogMzsKLSAgICBjYWNoZS0+bWFya3RpbWUgPSAwOwotICAgIGNhY2hlLT5hdmdfcHVyZ2V0aW1lID0gMC4wOwotICAgIGNhY2hlLT5udW1wdXJnZXMgPSAwOwotICAgIGNhY2hlLT5sYXN0X3B1cmdlID0gMDsKLSAgICBjYWNoZS0+bnB1cmdlZCA9IDA7Ci0KLSAgICBjYWNoZS0+ZmV0Y2hlcyA9IDA7Ci0gICAgY2FjaGUtPmhpdHMgPSAwOwotICAgIGNhY2hlLT5pbnNlcnRzID0gMDsKLSAgICBjYWNoZS0+cmVtb3ZlcyA9IDA7Ci0KLSAgICByZXR1cm4gY2FjaGU7Ci19Ci0KLXZvaWQgdXRpbF9hbGRfZGVzdHJveV9jYWNoZSh1dGlsX2FsZF9jYWNoZV90ICpjYWNoZSkKLXsKLSAgICBpbnQgaTsKLSAgICB1dGlsX2NhY2hlX25vZGVfdCAqcCwgKnE7Ci0KLSAgICBpZiAoY2FjaGUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGNhY2hlLT5zaXplOyArK2kpIHsKLSAgICAgICAgcCA9IGNhY2hlLT5ub2Rlc1tpXTsKLSAgICAgICAgcSA9IE5VTEw7Ci0gICAgICAgIHdoaWxlIChwICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHEgPSBwLT5uZXh0OwotICAgICAgICAgICAoKmNhY2hlLT5mcmVlKShwLT5wYXlsb2FkKTsKLSAgICAgICAgICAgdXRpbF9hbGRfZnJlZShwKTsKLSAgICAgICAgICAgcCA9IHE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdXRpbF9hbGRfZnJlZShjYWNoZS0+bm9kZXMpOwotfQotCi12b2lkICp1dGlsX2FsZF9jYWNoZV9mZXRjaCh1dGlsX2FsZF9jYWNoZV90ICpjYWNoZSwgdm9pZCAqcGF5bG9hZCkKLXsKLSAgICBpbnQgaGFzaHZhbDsKLSAgICB1dGlsX2NhY2hlX25vZGVfdCAqcDsKLQotICAgIGlmIChjYWNoZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIGNhY2hlLT5mZXRjaGVzKys7Ci0KLSAgICBoYXNodmFsID0gKCpjYWNoZS0+aGFzaCkocGF5bG9hZCkgJSBjYWNoZS0+c2l6ZTsKLSAgICBmb3IgKHAgPSBjYWNoZS0+bm9kZXNbaGFzaHZhbF07IAotICAgICAgICAgcCAmJiAhKCpjYWNoZS0+Y29tcGFyZSkocC0+cGF5bG9hZCwgcGF5bG9hZCk7Ci0gICAgcCA9IHAtPm5leHQpIDsKLQotICAgIGlmIChwICE9IE5VTEwpIHsKLSAgICAgICAgY2FjaGUtPmhpdHMrKzsKLSAgICAgICAgcmV0dXJuIHAtPnBheWxvYWQ7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLS8qCi0gKiBJbnNlcnQgYW4gaXRlbSBpbnRvIHRoZSBjYWNoZS4gCi0gKiAqKiogRG9lcyBub3QgY2F0Y2ggZHVwbGljYXRlcyEhISAqKioKLSAqLwotdm9pZCB1dGlsX2FsZF9jYWNoZV9pbnNlcnQodXRpbF9hbGRfY2FjaGVfdCAqY2FjaGUsIHZvaWQgKnBheWxvYWQpCi17Ci0gICAgaW50IGhhc2h2YWw7Ci0gICAgdXRpbF9jYWNoZV9ub2RlX3QgKm5vZGU7Ci0KLSAgICBpZiAoY2FjaGUgPT0gTlVMTCB8fCBwYXlsb2FkID09IE5VTEwpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhY2hlLT5pbnNlcnRzKys7Ci0gICAgaGFzaHZhbCA9ICgqY2FjaGUtPmhhc2gpKHBheWxvYWQpICUgY2FjaGUtPnNpemU7Ci0gICAgbm9kZSA9ICh1dGlsX2NhY2hlX25vZGVfdCAqKXV0aWxfYWxkX2FsbG9jKHNpemVvZih1dGlsX2NhY2hlX25vZGVfdCkpOwotICAgIG5vZGUtPmFkZF90aW1lID0gYXByX3RpbWVfbm93KCk7Ci0gICAgbm9kZS0+cGF5bG9hZCA9ICgqY2FjaGUtPmNvcHkpKHBheWxvYWQpOwotICAgIG5vZGUtPm5leHQgPSBjYWNoZS0+bm9kZXNbaGFzaHZhbF07Ci0gICAgY2FjaGUtPm5vZGVzW2hhc2h2YWxdID0gbm9kZTsKLSAgICBpZiAoKytjYWNoZS0+bnVtZW50cmllcyA9PSBjYWNoZS0+ZnVsbG1hcmspIAotICAgICAgICBjYWNoZS0+bWFya3RpbWU9YXByX3RpbWVfbm93KCk7Ci0gICAgaWYgKGNhY2hlLT5udW1lbnRyaWVzID49IGNhY2hlLT5tYXhlbnRyaWVzKQotICAgICAgICB1dGlsX2FsZF9jYWNoZV9wdXJnZShjYWNoZSk7Ci19Ci0KLXZvaWQgdXRpbF9hbGRfY2FjaGVfcmVtb3ZlKHV0aWxfYWxkX2NhY2hlX3QgKmNhY2hlLCB2b2lkICpwYXlsb2FkKQotewotICAgIGludCBoYXNodmFsOwotICAgIHV0aWxfY2FjaGVfbm9kZV90ICpwLCAqcTsKLSAgCi0gICAgaWYgKGNhY2hlID09IE5VTEwpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhY2hlLT5yZW1vdmVzKys7Ci0gICAgaGFzaHZhbCA9ICgqY2FjaGUtPmhhc2gpKHBheWxvYWQpICUgY2FjaGUtPnNpemU7Ci0gICAgZm9yIChwID0gY2FjaGUtPm5vZGVzW2hhc2h2YWxdLCBxPU5VTEw7Ci0gICAgICAgICBwICYmICEoKmNhY2hlLT5jb21wYXJlKShwLT5wYXlsb2FkLCBwYXlsb2FkKTsKLSAgICAgICAgIHAgPSBwLT5uZXh0KSB7Ci0gICAgICAgICBxID0gcDsKLSAgICB9Ci0KLSAgICAvKiBJZiBwIGlzIG51bGwsIGl0IG1lYW5zIHRoYXQgd2UgY291bGRuJ3QgZmluZCB0aGUgbm9kZSwgc28ganVzdCByZXR1cm4gKi8KLSAgICBpZiAocCA9PSBOVUxMKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAocSA9PSBOVUxMKSB7Ci0gICAgICAgIC8qIFdlIGZvdW5kIHRoZSBub2RlLCBhbmQgaXQncyB0aGUgZmlyc3QgaW4gdGhlIGxpc3QgKi8KLSAgICAgICAgY2FjaGUtPm5vZGVzW2hhc2h2YWxdID0gcC0+bmV4dDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIFdlIGZvdW5kIHRoZSBub2RlIGFuZCBpdCdzIG5vdCB0aGUgZmlyc3QgaW4gdGhlIGxpc3QgKi8KLSAgICAgICAgcS0+bmV4dCA9IHAtPm5leHQ7Ci0gICAgfQotICAgICgqY2FjaGUtPmZyZWUpKHAtPnBheWxvYWQpOwotICAgIHV0aWxfYWxkX2ZyZWUocCk7Ci0gICAgY2FjaGUtPm51bWVudHJpZXMtLTsKLX0KLQotY2hhciAqdXRpbF9hbGRfY2FjaGVfZGlzcGxheV9zdGF0cyhhcHJfcG9vbF90ICpwLCB1dGlsX2FsZF9jYWNoZV90ICpjYWNoZSwgY2hhciAqbmFtZSkKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgdG90Y2hhaW5sZW4gPSAwOwotICAgIGludCBuY2hhaW5zID0gMDsKLSAgICBkb3VibGUgY2hhaW5sZW47Ci0gICAgdXRpbF9jYWNoZV9ub2RlX3QgKm47Ci0gICAgY2hhciAqYnVmOwotCi0gICAgaWYgKGNhY2hlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotICAgIGZvciAoaT0wOyBpIDwgY2FjaGUtPnNpemU7ICsraSkgewotICAgICAgICBpZiAoY2FjaGUtPm5vZGVzW2ldICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG5jaGFpbnMrKzsKLSAgICAgICAgICAgIGZvciAobiA9IGNhY2hlLT5ub2Rlc1tpXTsgbiAhPSBOVUxMOyBuID0gbi0+bmV4dCkKLQkgICAgICAgIHRvdGNoYWlubGVuKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgY2hhaW5sZW4gPSBuY2hhaW5zPyAoZG91YmxlKXRvdGNoYWlubGVuIC8gKGRvdWJsZSluY2hhaW5zIDogMDsKLQotICAgIGJ1ZiA9IGFwcl9wc3ByaW50ZihwLCAKLSAgICAgICAgICAgICAiPHRyIHZhbGlnbj0ndG9wJz4iCi0gICAgICAgICAgICAgIjx0ZCBub3dyYXA+JXM8L3RkPiIKLSAgICAgICAgICAgICAiPHRkIGFsaWduPSdyaWdodCcgbm93cmFwPiVsdSAoJS4wZiUlIGZ1bGwpPC90ZD4iCi0gICAgICAgICAgICAgIjx0ZCBhbGlnbj0ncmlnaHQnPiUuMWY8L3RkPiIKLQkgICAgICI8dGQgYWxpZ249J3JpZ2h0Jz4lbHUvJWx1PC90ZD4iCi0JICAgICAiPHRkIGFsaWduPSdyaWdodCc+JS4wZiUlPC90ZD4iCi0gICAgICAgICAgICAgIjx0ZCBhbGlnbj0ncmlnaHQnPiVsdS8lbHU8L3RkPiIsCi0gICAgICAgICAgICAgbmFtZSwKLQkgICAgIGNhY2hlLT5udW1lbnRyaWVzLCAKLQkgICAgIChkb3VibGUpY2FjaGUtPm51bWVudHJpZXMgLyAoZG91YmxlKWNhY2hlLT5tYXhlbnRyaWVzICogMTAwLjAsCi0gICAgICAgICAgICAgY2hhaW5sZW4sCi0JICAgICBjYWNoZS0+aGl0cywgCSAgICAgCi0JICAgICBjYWNoZS0+ZmV0Y2hlcywKLQkgICAgIChjYWNoZS0+ZmV0Y2hlcyA+IDAgPyAoZG91YmxlKShjYWNoZS0+aGl0cykgLyAoZG91YmxlKShjYWNoZS0+ZmV0Y2hlcykgKiAxMDAuMCA6IDEwMC4wKSwKLQkgICAgIGNhY2hlLT5pbnNlcnRzLAotCSAgICAgY2FjaGUtPnJlbW92ZXMpOwotCi0gICAgaWYgKGNhY2hlLT5udW1wdXJnZXMpIHsKLSAgICAgICAgY2hhciBzdHJfY3RpbWVbQVBSX0NUSU1FX0xFTl07Ci0KLSAgICAgICAgYXByX2N0aW1lKHN0cl9jdGltZSwgY2FjaGUtPmxhc3RfcHVyZ2UpOwotICAgICAgICBidWYgPSBhcHJfcHNwcmludGYocCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyIKLQkgICAgICAgICAgICAgICAgICAgIjx0ZCBhbGlnbj0ncmlnaHQnPiVsdTwvdGQ+XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiPHRkIGFsaWduPSdyaWdodCcgbm93cmFwPiVzPC90ZD5cbiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLAotCSAgICAgICAgICAgICAgICAgICBjYWNoZS0+bnVtcHVyZ2VzLAotCSAgICAgICAgICAgICAgICAgICBzdHJfY3RpbWUpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgYnVmID0gYXByX3BzcHJpbnRmKHAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzPHRkIGNvbHNwYW49JzInIGFsaWduPSdjZW50ZXInPihub25lKTwvdGQ+XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmKTsKLSAgICB9Ci0KLSAgICBidWYgPSBhcHJfcHNwcmludGYocCwgIiVzPHRkIGFsaWduPSdyaWdodCc+JS4yZzwvdGQ+XG48L3RyPiIsIGJ1ZiwgY2FjaGUtPmF2Z19wdXJnZXRpbWUpOwotCi0gICAgcmV0dXJuIGJ1ZjsKLX0KLQotY2hhciAqdXRpbF9hbGRfY2FjaGVfZGlzcGxheShhcHJfcG9vbF90ICpwb29sKQotewotICAgIGludCBpOwotICAgIGNoYXIgKmJ1ZiwgKnQxLCAqdDIsICp0MzsKLQotICAgIGlmICghdXRpbF9sZGFwX2NhY2hlKSB7Ci0gICAgICAgIHJldHVybiAiPHRyIHZhbGlnbj0ndG9wJz48dGQgbm93cmFwIGNvbHNwYW49Nz5DYWNoZSBoYXMgbm90IGJlZW4gZW5hYmxlZC9pbml0aWFsaXNlZC48L3RkPjwvdHI+IjsKLSAgICB9Ci0KLSAgICBidWYgPSB1dGlsX2FsZF9jYWNoZV9kaXNwbGF5X3N0YXRzKHBvb2wsIHV0aWxfbGRhcF9jYWNoZSwgIkxEQVAgVVJMIENhY2hlIik7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IHV0aWxfbGRhcF9jYWNoZS0+c2l6ZTsgKytpKSB7Ci0gICAgICAgIHV0aWxfY2FjaGVfbm9kZV90ICpwOwotICAgICAgICBmb3IgKHAgPSB1dGlsX2xkYXBfY2FjaGUtPm5vZGVzW2ldOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KSB7Ci0gICAgICAgICAgICB1dGlsX3VybF9ub2RlX3QgKm47Ci0KLSAgICAgICAgICAgIG4gPSAodXRpbF91cmxfbm9kZV90ICopcC0+cGF5bG9hZDsKLQotICAgICAgICAgICAgdDEgPSBhcHJfcHNwcmludGYocG9vbCwgIiVzIChTZWFyY2hlcykiLCBuLT51cmwpOwotICAgICAgICAgICAgdDIgPSBhcHJfcHNwcmludGYocG9vbCwgIiVzIChDb21wYXJlcykiLCBuLT51cmwpOwotICAgICAgICAgICAgdDMgPSBhcHJfcHNwcmludGYocG9vbCwgIiVzIChETkNvbXBhcmVzKSIsIG4tPnVybCk7Ci0KLSAgICAgICAgICAgIGJ1ZiA9IGFwcl9wc3ByaW50Zihwb29sLCAiJXNcblxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlc1xuXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzXG5cbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXNcblxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbF9hbGRfY2FjaGVfZGlzcGxheV9zdGF0cyhwb29sLCBuLT5zZWFyY2hfY2FjaGUsIHQxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsX2FsZF9jYWNoZV9kaXNwbGF5X3N0YXRzKHBvb2wsIG4tPmNvbXBhcmVfY2FjaGUsIHQyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsX2FsZF9jYWNoZV9kaXNwbGF5X3N0YXRzKHBvb2wsIG4tPmRuX2NvbXBhcmVfY2FjaGUsIHQzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYnVmOwotfQotCi0jZW5kaWYgLyogQVBVX0hBU19MREFQICovCmRpZmYgLS1naXQgYS9tb2R1bGVzL2ZpbHRlcnMvLmN2c2lnbm9yZSBiL21vZHVsZXMvZmlsdGVycy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmY3YTcwLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZmlsdGVycy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLmRlcHMKLS5saWJzCi0qLmxhCi1tb2R1bGVzLm1rCi1NYWtlZmlsZQotKi5sbwotKi5zbG8KLSouc28KLSouZGxsCi0qLmRlZgpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9maWx0ZXJzLy5pbmRlbnQucHJvIGIvbW9kdWxlcy9maWx0ZXJzLy5pbmRlbnQucHJvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWZiZTlmLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZmlsdGVycy8uaW5kZW50LnBybworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS1pNCAtbnBzbCAtZGkwIC1iciAtbmNlIC1kMCAtY2xpMCAtbnBjcyAtbmZjMQotLVRCVUZGCi0tVEZJTEUKLS1UVFJBTlMKLS1UVUlOVDQKLS1UX3RyYW5zCi0tVGFsbG93X29wdGlvbnNfdAotLVRhcGFjaGVfc2ZpbwotLVRhcnJheV9oZWFkZXIKLS1UYm9vbF9pbnQKLS1UYnVmX2FyZWEKLS1UYnVmZl9zdHJ1Y3QKLS1UYnVmZnkKLS1UY21kX2hvdwotLVRjbWRfcGFybXMKLS1UY29tbWFuZF9yZWMKLS1UY29tbWFuZF9zdHJ1Y3QKLS1UY29ubl9yZWMKLS1UY29yZV9kaXJfY29uZmlnCi0tVGNvcmVfc2VydmVyX2NvbmZpZwotLVRkaXJfbWFrZXJfZnVuYwotLVRldmVudAotLVRnbG9iYWxzX3MKLS1UaGFuZGxlcl9mdW5jCi0tVGhhbmRsZXJfcmVjCi0tVGpvYmxpc3RfcwotLVRsaXN0ZW5fcmVjCi0tVG1lcmdlcl9mdW5jCi0tVG1vZGVfdAotLVRtb2R1bGUKLS1UbW9kdWxlX3N0cnVjdAotLVRtdXRleAotLVRuX2xvbmcKLS1Ub3RoZXJfY2hpbGRfcmVjCi0tVG92ZXJyaWRlc190Ci0tVHBhcmVudF9zY29yZQotLVRwaWRfdAotLVRwaXBlZF9sb2cKLS1UcG9vbAotLVRyZXF1ZXN0X3JlYwotLVRyZXF1aXJlX2xpbmUKLS1UcmxpbV90Ci0tVHNjb3JlYm9hcmQKLS1Uc2VtYXBob3JlCi0tVHNlcnZlcl9hZGRyX3JlYwotLVRzZXJ2ZXJfcmVjCi0tVHNlcnZlcl9yZWNfY2hhaW4KLS1Uc2hvcnRfc2NvcmUKLS1UdGFibGUKLS1UdGFibGVfZW50cnkKLS1UdGhyZWFkCi0tVHVfd2lkZV9pbnQKLS1UdnRpbWVfdAotLVR3aWRlX2ludApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9maWx0ZXJzL01ha2VmaWxlLmluIGIvbW9kdWxlcy9maWx0ZXJzL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjdiMzQzLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZmlsdGVycy9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi1pbmNsdWRlICQodG9wX3NyY2RpcikvYnVpbGQvc3BlY2lhbC5tawotCmRpZmYgLS1naXQgYS9tb2R1bGVzL2ZpbHRlcnMvY29uZmlnLm00IGIvbW9kdWxlcy9maWx0ZXJzL2NvbmZpZy5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4NTg5ZS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2ZpbHRlcnMvY29uZmlnLm00CisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotZG5sIG1vZHVsZXMgZW5hYmxlZCBpbiB0aGlzIGRpcmVjdG9yeSBieSBkZWZhdWx0Ci0KLWRubCBBQ19ERUZVTihtb2R1bGVuYW1lLCBtb2R1bGVzdHJ1Y3RuYW1lLCBkZWZhdWx0b25vcm9mZiwgY29uZmlnbWFjcm9zKQotZG5sIFhYWCAtIE5lZWQgdG8gYWxsb3cgLS1lbmFibGUtbW9kdWxlIHRvIGZhaWwgaWYgb3B0aW9uYWwgY29uZmlnIGZhaWxzCi0KLUFDX0RFRlVOKEFQQUNIRV9DSEVDS19TVEFOREFSRF9NT0RVTEUsIFsKLSAgQVBBQ0hFX01PRFVMRShbJDFdLFskMl0sLFskM10sWyQ0XSxbJDVdKQotXSkKLQotQVBBQ0hFX01PRFBBVEhfSU5JVChmaWx0ZXJzKQotCi1BUEFDSEVfQ0hFQ0tfU1RBTkRBUkRfTU9EVUxFKGluY2x1ZGUsIFNlcnZlciBTaWRlIEluY2x1ZGVzLCBpbmNsdWRlcywgeWVzKQotCi1MVEZMQUdTPSIkTFRGTEFHUyAtZXhwb3J0LWR5bmFtaWMiCi0KLUFQQUNIRV9NT0RQQVRIX0ZJTklTSAotICAgIAotQVBBQ0hFX1NVQlNUKFNUQU5EQVJEX0xJQlMpCmRpZmYgLS1naXQgYS9tb2R1bGVzL2ZpbHRlcnMvbW9kX2luY2x1ZGUuYyBiL21vZHVsZXMvZmlsdGVycy9tb2RfaW5jbHVkZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWU5NmRiLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZmlsdGVycy9tb2RfaW5jbHVkZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4NiArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBodHRwX2luY2x1ZGUuYzogSGFuZGxlcyB0aGUgc2VydmVyLXBhcnNlZCBIVE1MIGRvY3VtZW50cwotICogCi0gKiBPcmlnaW5hbCBieSBSb2IgTWNDb29sOyBzdWJzdGFudGlhbCBmaXh1cHMgYnkgRGF2aWQgUm9iaW5zb247Ci0gKiBpbmNvcnBvcmF0ZWQgaW50byB0aGUgQXBhY2hlIG1vZHVsZSBmcmFtZXdvcmsgYnkgcnN0LgotICogCi0gKi8KLS8qIAotICogc3ViIGtleSBtYXkgYmUgYW55dGhpbmcgYSBQZXJsKkhhbmRsZXIgY2FuIGJlOgotICogc3Vicm91dGluZSBuYW1lLCBwYWNrYWdlIG5hbWUgKGRlZmF1bHRzIHRvIHBhY2thZ2U6OmhhbmRsZXIpLAotICogQ2xhc3MtPm1ldGhvZCBjYWxsIG9yIGFub3ltb3VzIHN1YiB7fQotICoKLSAqIENoaWxkIDwhLS0jcGVybCBzdWI9InN1YiB7cHJpbnQgJCR9IiAtLT4gYWNjZXNzZWQKLSAqIDwhLS0jcGVybCBzdWI9InN1YiB7cHJpbnQgKyskQWNjZXNzOjpDbnQgfSIgLS0+IHRpbWVzLiA8YnI+Ci0gKgotICogPCEtLSNwZXJsIGFyZz0ib25lIiBzdWI9Im15bW9kOjppbmNsdWRlciIgLS0+Ci0gKgotICogLURvdWcgTWFjRWFjaGVybgotICovCi0KLSNpZmRlZiBVU0VfUEVSTF9TU0kKLSNpbmNsdWRlICJjb25maWcuaCIKLSN1bmRlZiBWT0lEVVNFRAotI2lmZGVmIFVTRV9TRklPCi0jdW5kZWYgVVNFX1NGSU8KLSNkZWZpbmUgVVNFX1NURElPCi0jZW5kaWYKLSNpbmNsdWRlICJtb2R1bGVzL3BlcmwvbW9kX3BlcmwuaCIKLSNlbHNlCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfcmVxdWVzdC5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotI2luY2x1ZGUgInV0aWxfc2NyaXB0LmgiCi0jZW5kaWYKLQotI2RlZmluZSBTVEFSVElOR19TRVFVRU5DRSAiPCEtLSMiCi0jZGVmaW5lIEVORElOR19TRVFVRU5DRSAiLS0+IgotI2RlZmluZSBERUZBVUxUX0VSUk9SX01TRyAiW2FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhpcyBkaXJlY3RpdmVdIgotI2RlZmluZSBERUZBVUxUX1RJTUVfRk9STUFUICIlQSwgJWQtJWItJVkgJUg6JU06JVMgJVoiCi0jZGVmaW5lIFNJWkVGTVRfQllURVMgMAotI2RlZmluZSBTSVpFRk1UX0tNRyAxCi0jaWZkZWYgQ0hBUlNFVF9FQkNESUMKLSNkZWZpbmUgUkFXX0FTQ0lJX0NIQVIoY2gpICBvc190b2ViY2RpY1sodW5zaWduZWQgY2hhciljaF0KLSNlbHNlIC8qQ0hBUlNFVF9FQkNESUMqLwotI2RlZmluZSBSQVdfQVNDSUlfQ0hBUihjaCkgIChjaCkKLSNlbmRpZiAvKkNIQVJTRVRfRUJDRElDKi8KLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGluY2x1ZGVzX21vZHVsZTsKLQotLyoganVzdCBuZWVkIHNvbWUgYXJiaXRyYXJ5IG5vbi1OVUxMIHBvaW50ZXIgd2hpY2ggY2FuJ3QgYWxzbyBiZSBhIHJlcXVlc3RfcmVjICovCi0jZGVmaW5lIE5FU1RFRF9JTkNMVURFX01BR0lDCSgmaW5jbHVkZXNfbW9kdWxlKQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW52aXJvbm1lbnQgZnVuY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogWFhYOiBjb3VsZCB1c2UgYXBfdGFibGVfb3ZlcmxhcCBoZXJlICovCi1zdGF0aWMgdm9pZCBhZGRfaW5jbHVkZV92YXJzKHJlcXVlc3RfcmVjICpyLCBjaGFyICp0aW1lZm10KQotewotI2lmbmRlZiBXSU4zMgotICAgIHN0cnVjdCBwYXNzd2QgKnB3OwotI2VuZGlmIC8qIG5kZWYgV0lOMzIgKi8KLSAgICB0YWJsZSAqZSA9IHItPnN1YnByb2Nlc3NfZW52OwotICAgIGNoYXIgKnQ7Ci0gICAgdGltZV90IGRhdGUgPSByLT5yZXF1ZXN0X3RpbWU7Ci0KLSAgICBhcF90YWJsZV9zZXRuKGUsICJEQVRFX0xPQ0FMIiwgYXBfaHRfdGltZShyLT5wb29sLCBkYXRlLCB0aW1lZm10LCAwKSk7Ci0gICAgYXBfdGFibGVfc2V0bihlLCAiREFURV9HTVQiLCBhcF9odF90aW1lKHItPnBvb2wsIGRhdGUsIHRpbWVmbXQsIDEpKTsKLSAgICBhcF90YWJsZV9zZXRuKGUsICJMQVNUX01PRElGSUVEIiwKLSAgICAgICAgICAgICAgYXBfaHRfdGltZShyLT5wb29sLCByLT5maW5mby5zdF9tdGltZSwgdGltZWZtdCwgMCkpOwotICAgIGFwX3RhYmxlX3NldG4oZSwgIkRPQ1VNRU5UX1VSSSIsIHItPnVyaSk7Ci0gICAgYXBfdGFibGVfc2V0bihlLCAiRE9DVU1FTlRfUEFUSF9JTkZPIiwgci0+cGF0aF9pbmZvKTsKLSNpZm5kZWYgV0lOMzIKLSAgICBwdyA9IGdldHB3dWlkKHItPmZpbmZvLnN0X3VpZCk7Ci0gICAgaWYgKHB3KSB7Ci0gICAgICAgIGFwX3RhYmxlX3NldG4oZSwgIlVTRVJfTkFNRSIsIGFwX3BzdHJkdXAoci0+cG9vbCwgcHctPnB3X25hbWUpKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGFwX3RhYmxlX3NldG4oZSwgIlVTRVJfTkFNRSIsIGFwX3BzcHJpbnRmKHItPnBvb2wsICJ1c2VyIyVsdSIsCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSByLT5maW5mby5zdF91aWQpKTsKLSAgICB9Ci0jZW5kaWYgLyogbmRlZiBXSU4zMiAqLwotCi0gICAgaWYgKCh0ID0gc3RycmNocihyLT5maWxlbmFtZSwgJy8nKSkpIHsKLSAgICAgICAgYXBfdGFibGVfc2V0bihlLCAiRE9DVU1FTlRfTkFNRSIsICsrdCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBhcF90YWJsZV9zZXRuKGUsICJET0NVTUVOVF9OQU1FIiwgci0+dXJpKTsKLSAgICB9Ci0gICAgaWYgKHItPmFyZ3MpIHsKLSAgICAgICAgY2hhciAqYXJnX2NvcHkgPSBhcF9wc3RyZHVwKHItPnBvb2wsIHItPmFyZ3MpOwotCi0gICAgICAgIGFwX3VuZXNjYXBlX3VybChhcmdfY29weSk7Ci0gICAgICAgIGFwX3RhYmxlX3NldG4oZSwgIlFVRVJZX1NUUklOR19VTkVTQ0FQRUQiLAotICAgICAgICAgICAgICAgICAgYXBfZXNjYXBlX3NoZWxsX2NtZChyLT5wb29sLCBhcmdfY29weSkpOwotICAgIH0KLX0KLQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYXJzZXIgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jZGVmaW5lIE9VVEJVRlNJWkUgNDA5NgotLyogUFVUX0NIQVIgYW5kIEZMVVNIX0JVRiBjdXJyZW50bHkgb25seSB3b3JrIHdpdGhpbiB0aGUgc2NvcGUgb2YgCi0gKiBmaW5kX3N0cmluZygpOyB0aGV5IGFyZSBoYWNrcyB0byBhdm9pZCBjYWxsaW5nIHJwdXRjIGZvciBlYWNoIGFuZAotICogZXZlcnkgY2hhcmFjdGVyIG91dHB1dC4gIEEgY29tbW9uIHNldCBvZiBidWZmZXJpbmcgY2FsbHMgZm9yIHRoaXMgCi0gKiB0eXBlIG9mIG91dHB1dCBTSE9VTEQgYmUgaW1wbGVtZW50ZWQuCi0gKi8KLSNkZWZpbmUgUFVUX0NIQVIoYyxyKSBcCi0geyBcCi0gICAgb3V0YnVmW291dGluZCsrXSA9IGM7IFwKLSAgICBpZiAob3V0aW5kID09IE9VVEJVRlNJWkUpIHsgXAotICAgICAgICBGTFVTSF9CVUYocikgXAotICAgIH07IFwKLSB9Ci0KLS8qIHRoZXJlIFNIT1VMRCBiZSBzb21lIGVycm9yIGNoZWNraW5nIG9uIHRoZSByZXR1cm4gdmFsdWUgb2YKLSAqIHJ3cml0ZSwgaG93ZXZlciBpdCBpcyB1bmNsZWFyIHdoYXQgdGhlIEFQSSBmb3IgcndyaXRlIHJldHVybmluZwotICogZXJyb3JzIGlzIGFuZCBsaXR0bGUgY2FuIHJlYWxseSBiZSBkb25lIHRvIGhlbHAgdGhlIGVycm9yIGluIAotICogYW55IGNhc2UuCi0gKi8KLSNkZWZpbmUgRkxVU0hfQlVGKHIpIFwKLSB7IFwKLSAgIGFwX3J3cml0ZShvdXRidWYsIG91dGluZCwgcik7IFwKLSAgIG91dGluZCA9IDA7IFwKLSB9Ci0KLS8qCi0gKiBmOiBmaWxlIGhhbmRsZSBiZWluZyByZWFkIGZyb20KLSAqIGM6IGNoYXJhY3RlciB0byByZWFkIGludG8KLSAqIHJldDogcmV0dXJuIHZhbHVlIHRvIHVzZSBpZiBpbnB1dCBmYWlscwotICogcjogY3VycmVudCByZXF1ZXN0X3JlYwotICoKLSAqIFRoaXMgbWFjcm8gaXMgcmVkZWZpbmVkIGFmdGVyIGZpbmRfc3RyaW5nKCkgZm9yIGhpc3RvcmljYWwgcmVhc29ucwotICogdG8gYXZvaWQgdG9vIG1hbnkgY29kZSBjaGFuZ2VzLiAgVGhpcyBpcyBvbmUgb2YgdGhlIG1hbnkgdGhpbmdzCi0gKiB0aGF0IHNob3VsZCBiZSBmaXhlZC4KLSAqLwotI2RlZmluZSBHRVRfQ0hBUihmLGMscmV0LHIpIFwKLSB7IFwKLSAgIGludCBpID0gZ2V0YyhmKTsgXAotICAgaWYgKGkgPT0gRU9GKSB7IC8qIGVpdGhlciBFT0Ygb3IgZXJyb3IgLS0gbmVlZHMgZXJyb3IgaGFuZGxpbmcgaWYgbGF0dGVyICovIFwKLSAgICAgICBpZiAoZmVycm9yKGYpKSB7IFwKLSAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJlbmNvdW50ZXJlZCBlcnJvciBpbiBHRVRfQ0hBUiBtYWNybywgIiBcCi0gICAgICAgICAgICAgICAgICAgIm1vZF9pbmNsdWRlLlxuIik7IFwKLSAgICAgICB9IFwKLSAgICAgICBGTFVTSF9CVUYocik7IFwKLSAgICAgICBhcF9wZmNsb3NlKHItPnBvb2wsIGYpOyBcCi0gICAgICAgcmV0dXJuIHJldDsgXAotICAgfSBcCi0gICBjID0gKGNoYXIpaTsgXAotIH0KLQotc3RhdGljIGludCBmaW5kX3N0cmluZyhGSUxFICppbiwgY29uc3QgY2hhciAqc3RyLCByZXF1ZXN0X3JlYyAqciwgaW50IHByaW50aW5nKQotewotICAgIGludCB4LCBsID0gc3RybGVuKHN0ciksIHA7Ci0gICAgY2hhciBvdXRidWZbT1VUQlVGU0laRV07Ci0gICAgaW50IG91dGluZCA9IDA7Ci0gICAgY2hhciBjOwotCi0gICAgcCA9IDA7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgR0VUX0NIQVIoaW4sIGMsIDEsIHIpOwotICAgICAgICBpZiAoYyA9PSBzdHJbcF0pIHsKLSAgICAgICAgICAgIGlmICgoKytwKSA9PSBsKSB7Ci0gICAgICAgICAgICAgICAgRkxVU0hfQlVGKHIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKHByaW50aW5nKSB7Ci0gICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHA7IHgrKykgewotICAgICAgICAgICAgICAgICAgICBQVVRfQ0hBUihzdHJbeF0sIHIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQVVRfQ0hBUihjLCByKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHAgPSAwOwotICAgICAgICB9Ci0gICAgfQotfQotCi0jdW5kZWYgRkxVU0hfQlVGCi0jdW5kZWYgUFVUX0NIQVIKLSN1bmRlZiBHRVRfQ0hBUgotI2RlZmluZSBHRVRfQ0hBUihmLGMscixwKSBcCi0geyBcCi0gICBpbnQgaSA9IGdldGMoZik7IFwKLSAgIGlmIChpID09IEVPRikgeyAvKiBlaXRoZXIgRU9GIG9yIGVycm9yIC0tIG5lZWRzIGVycm9yIGhhbmRsaW5nIGlmIGxhdHRlciAqLyBcCi0gICAgICAgaWYgKGZlcnJvcihmKSkgeyBcCi0gICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZW5jb3VudGVyZWQgZXJyb3IgaW4gR0VUX0NIQVIgbWFjcm8sICIgXAotICAgICAgICAgICAgICAgICAgICJtb2RfaW5jbHVkZS5cbiIpOyBcCi0gICAgICAgfSBcCi0gICAgICAgYXBfcGZjbG9zZShwLCBmKTsgXAotICAgICAgIHJldHVybiByOyBcCi0gICB9IFwKLSAgIGMgPSAoY2hhcilpOyBcCi0gfQotCi0vKgotICogZGVjb2RlcyBhIHN0cmluZyBjb250YWluaW5nIGh0bWwgZW50aXRpZXMgb3IgbnVtZXJpYyBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KLSAqICdzJyBpcyBvdmVyd3JpdHRlbiB3aXRoIHRoZSBkZWNvZGVkIHN0cmluZy4KLSAqIElmICdzJyBpcyBzeW50YXRpY2FsbHkgaW5jb3JyZWN0LCB0aGVuIHRoZSBmb2xsb3dlZCBmaXh1cHMgd2lsbCBiZSBtYWRlOgotICogICB1bmtub3duIGVudGl0aWVzIHdpbGwgYmUgbGVmdCB1bmRlY29kZWQ7Ci0gKiAgIHJlZmVyZW5jZXMgdG8gdW51c2VkIG51bWVyaWMgY2hhcmFjdGVycyB3aWxsIGJlIGRlbGV0ZWQuCi0gKiAgIEluIHBhcnRpY3VsYXIsICYjMDA7IHdpbGwgbm90IGJlIGRlY29kZWQsIGJ1dCB3aWxsIGJlIGRlbGV0ZWQuCi0gKgotICogZHJ0cgotICovCi0KLS8qIG1heGltdW0gbGVuZ3RoIG9mIGFueSBJU08tTEFUSU4tMSBIVE1MIGVudGl0eSBuYW1lLiAqLwotI2RlZmluZSBNQVhFTlRMRU4gKDYpCi0KLS8qIFRoZSBmb2xsb3dpbmcgaXMgYSBzaHJpbmtpbmcgdHJhbnNmb3JtYXRpb24sIHRoZXJlZm9yZSBzYWZlLiAqLwotCi1zdGF0aWMgdm9pZCBkZWNvZGVodG1sKGNoYXIgKnMpCi17Ci0gICAgaW50IHZhbCwgaSwgajsKLSAgICBjaGFyICpwID0gczsKLSAgICBjb25zdCBjaGFyICplbnRzOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZW50bGlzdFtNQVhFTlRMRU4gKyAxXSA9Ci0gICAgewotICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAvKiAwICovCi0gICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgIC8qIDEgKi8KLSAgICAgICAgImx0XDA3NGd0XDA3NiIsICAgICAgICAgLyogMiAqLwotICAgICAgICAiYW1wXDA0NkVUSFwzMjBldGhcMzYwIiwgICAgICAgIC8qIDMgKi8KLSAgICAgICAgInF1b3RcMDQyQXVtbFwzMDRFdW1sXDMxM0l1bWxcMzE3T3VtbFwzMjZVdW1sXDMzNGF1bWxcMzQ0ZXVtbFwzNTNcCi1pdW1sXDM1N291bWxcMzY2dXVtbFwzNzR5dW1sXDM3NyIsICAgICAgLyogNCAqLwotICAgICAgICAiQWNpcmNcMzAyQXJpbmdcMzA1QUVsaWdcMzA2RWNpcmNcMzEySWNpcmNcMzE2T2NpcmNcMzI0VWNpcmNcMzMzXAotVEhPUk5cMzM2c3psaWdcMzM3YWNpcmNcMzQyYXJpbmdcMzQ1YWVsaWdcMzQ2ZWNpcmNcMzUyaWNpcmNcMzU2b2NpcmNcMzY0XAotdWNpcmNcMzczdGhvcm5cMzc2IiwgICAgICAgICAgICAvKiA1ICovCi0gICAgICAgICJBZ3JhdmVcMzAwQWFjdXRlXDMwMUF0aWxkZVwzMDNDY2VkaWxcMzA3RWdyYXZlXDMxMEVhY3V0ZVwzMTFcCi1JZ3JhdmVcMzE0SWFjdXRlXDMxNU50aWxkZVwzMjFPZ3JhdmVcMzIyT2FjdXRlXDMyM090aWxkZVwzMjVPc2xhc2hcMzMwXAotVWdyYXZlXDMzMVVhY3V0ZVwzMzJZYWN1dGVcMzM1YWdyYXZlXDM0MGFhY3V0ZVwzNDFhdGlsZGVcMzQzY2NlZGlsXDM0N1wKLWVncmF2ZVwzNTBlYWN1dGVcMzUxaWdyYXZlXDM1NGlhY3V0ZVwzNTVudGlsZGVcMzYxb2dyYXZlXDM2Mm9hY3V0ZVwzNjNcCi1vdGlsZGVcMzY1b3NsYXNoXDM3MHVncmF2ZVwzNzF1YWN1dGVcMzcyeWFjdXRlXDM3NSIgICAgIC8qIDYgKi8KLSAgICB9OwotCi0gICAgZm9yICg7ICpzICE9ICdcMCc7IHMrKywgcCsrKSB7Ci0gICAgICAgIGlmICgqcyAhPSAnJicpIHsKLSAgICAgICAgICAgICpwID0gKnM7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvKiBmaW5kIGVuZCBvZiBlbnRpdHkgKi8KLSAgICAgICAgZm9yIChpID0gMTsgc1tpXSAhPSAnOycgJiYgc1tpXSAhPSAnXDAnOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNbaV0gPT0gJ1wwJykgeyAgICAgLyogdHJlYXQgYXMgbm9ybWFsIGRhdGEgKi8KLSAgICAgICAgICAgICpwID0gKnM7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGlzIGl0IG51bWVyaWMgPyAqLwotICAgICAgICBpZiAoc1sxXSA9PSAnIycpIHsKLSAgICAgICAgICAgIGZvciAoaiA9IDIsIHZhbCA9IDA7IGogPCBpICYmIGFwX2lzZGlnaXQoc1tqXSk7IGorKykgewotICAgICAgICAgICAgICAgIHZhbCA9IHZhbCAqIDEwICsgc1tqXSAtICcwJzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHMgKz0gaTsKLSAgICAgICAgICAgIGlmIChqIDwgaSB8fCB2YWwgPD0gOCB8fCAodmFsID49IDExICYmIHZhbCA8PSAzMSkgfHwKLSAgICAgICAgICAgICAgICAodmFsID49IDEyNyAmJiB2YWwgPD0gMTYwKSB8fCB2YWwgPj0gMjU2KSB7Ci0gICAgICAgICAgICAgICAgcC0tOyAgICAgICAgICAgIC8qIG5vIGRhdGEgdG8gb3V0cHV0ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAqcCA9IFJBV19BU0NJSV9DSEFSKHZhbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBqID0gaSAtIDE7Ci0gICAgICAgICAgICBpZiAoaiA+IE1BWEVOVExFTiB8fCBlbnRsaXN0W2pdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAvKiB3cm9uZyBsZW5ndGggKi8KLSAgICAgICAgICAgICAgICAqcCA9ICcmJzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgLyogc2tpcCBpdCAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChlbnRzID0gZW50bGlzdFtqXTsgKmVudHMgIT0gJ1wwJzsgZW50cyArPSBpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cm5jbXAocyArIDEsIGVudHMsIGopID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKmVudHMgPT0gJ1wwJykgewotICAgICAgICAgICAgICAgICpwID0gJyYnOyAgICAgICAvKiB1bmtub3duICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAqcCA9IFJBV19BU0NJSV9DSEFSKCgoY29uc3QgdW5zaWduZWQgY2hhciAqKSBlbnRzKVtqXSk7Ci0gICAgICAgICAgICAgICAgcyArPSBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgKnAgPSAnXDAnOwotfQotCi0vKgotICogZXh0cmFjdCB0aGUgbmV4dCB0YWcgbmFtZSBhbmQgdmFsdWUuCi0gKiBpZiB0aGVyZSBhcmUgbm8gbW9yZSB0YWdzLCBzZXQgdGhlIHRhZyBuYW1lIHRvICdkb25lJwotICogdGhlIHRhZyB2YWx1ZSBpcyBodG1sIGRlY29kZWQgaWYgZG9kZWNvZGUgaXMgbm9uLXplcm8KLSAqLwotCi1zdGF0aWMgY2hhciAqZ2V0X3RhZyhwb29sICpwLCBGSUxFICppbiwgY2hhciAqdGFnLCBpbnQgdGFnYnVmX2xlbiwgaW50IGRvZGVjb2RlKQotewotICAgIGNoYXIgKnQgPSB0YWcsICp0YWdfdmFsLCBjLCB0ZXJtOwotCi0gICAgLyogbWFrZXMgY29kZSBiZWxvdyBhIGxpdHRsZSBsZXNzIGNsdXR0ZXJlZCAqLwotICAgIC0tdGFnYnVmX2xlbjsKLQotICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBza2lwIHdoaXRlc3BhY2UgKi8KLSAgICAgICAgR0VUX0NIQVIoaW4sIGMsIE5VTEwsIHApOwotICAgIH0gd2hpbGUgKGFwX2lzc3BhY2UoYykpOwotCi0gICAgLyogdGFncyBjYW4ndCBzdGFydCB3aXRoIC0gKi8KLSAgICBpZiAoYyA9PSAnLScpIHsKLSAgICAgICAgR0VUX0NIQVIoaW4sIGMsIE5VTEwsIHApOwotICAgICAgICBpZiAoYyA9PSAnLScpIHsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBHRVRfQ0hBUihpbiwgYywgTlVMTCwgcCk7Ci0gICAgICAgICAgICB9IHdoaWxlIChhcF9pc3NwYWNlKGMpKTsKLSAgICAgICAgICAgIGlmIChjID09ICc+JykgewotICAgICAgICAgICAgICAgIGFwX2NweXN0cm4odGFnLCAiZG9uZSIsIHRhZ2J1Zl9sZW4pOwotICAgICAgICAgICAgICAgIHJldHVybiB0YWc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgLyogZmFpbGVkICovCi0gICAgfQotCi0gICAgLyogZmluZCBlbmQgb2YgdGFnIG5hbWUgKi8KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAodCAtIHRhZyA9PSB0YWdidWZfbGVuKSB7Ci0gICAgICAgICAgICAqdCA9ICdcMCc7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoYyA9PSAnPScgfHwgYXBfaXNzcGFjZShjKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgKih0KyspID0gYXBfdG9sb3dlcihjKTsKLSAgICAgICAgR0VUX0NIQVIoaW4sIGMsIE5VTEwsIHApOwotICAgIH0KLQotICAgICp0KysgPSAnXDAnOwotICAgIHRhZ192YWwgPSB0OwotCi0gICAgd2hpbGUgKGFwX2lzc3BhY2UoYykpIHsKLSAgICAgICAgR0VUX0NIQVIoaW4sIGMsIE5VTEwsIHApOyAgICAgICAvKiBzcGFjZSBiZWZvcmUgPSAqLwotICAgIH0KLSAgICBpZiAoYyAhPSAnPScpIHsKLSAgICAgICAgdW5nZXRjKGMsIGluKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgZG8gewotICAgICAgICBHRVRfQ0hBUihpbiwgYywgTlVMTCwgcCk7ICAgICAgIC8qIHNwYWNlIGFmdGVyID0gKi8KLSAgICB9IHdoaWxlIChhcF9pc3NwYWNlKGMpKTsKLQotICAgIC8qIHdlIHNob3VsZCBhbGxvdyBhICduYW1lJyBhcyBhIHZhbHVlICovCi0KLSAgICBpZiAoYyAhPSAnIicgJiYgYyAhPSAnXCcnKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB0ZXJtID0gYzsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBHRVRfQ0hBUihpbiwgYywgTlVMTCwgcCk7Ci0gICAgICAgIGlmICh0IC0gdGFnID09IHRhZ2J1Zl9sZW4pIHsKLSAgICAgICAgICAgICp0ID0gJ1wwJzsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0vKiBXYW50IHRvIGFjY2VwdCBcIiBhcyBhIHZhbGlkIGNoYXJhY3RlciB3aXRoaW4gYSBzdHJpbmcuICovCi0gICAgICAgIGlmIChjID09ICdcXCcpIHsKLSAgICAgICAgICAgICoodCsrKSA9IGM7ICAgICAgICAgLyogQWRkIGJhY2tzbGFzaCAqLwotICAgICAgICAgICAgR0VUX0NIQVIoaW4sIGMsIE5VTEwsIHApOwotICAgICAgICAgICAgaWYgKGMgPT0gdGVybSkgeyAgICAvKiBPbmx5IGlmICovCi0gICAgICAgICAgICAgICAgKigtLXQpID0gYzsgICAgIC8qIFJlcGxhY2UgYmFja3NsYXNoIE9OTFkgZm9yIHRlcm1pbmF0b3IgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjID09IHRlcm0pIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgICoodCsrKSA9IGM7Ci0gICAgfQotICAgICp0ID0gJ1wwJzsKLSAgICBpZiAoZG9kZWNvZGUpIHsKLSAgICAgICAgZGVjb2RlaHRtbCh0YWdfdmFsKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFwX3BzdHJkdXAocCwgdGFnX3ZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2RpcmVjdGl2ZShGSUxFICppbiwgY2hhciAqZGVzdCwgc2l6ZV90IGxlbiwgcG9vbCAqcCkKLXsKLSAgICBjaGFyICpkID0gZGVzdDsKLSAgICBjaGFyIGM7Ci0KLSAgICAvKiBtYWtlIHJvb20gZm9yIG51bCB0ZXJtaW5hdG9yICovCi0gICAgLS1sZW47Ci0KLSAgICAvKiBza2lwIGluaXRpYWwgd2hpdGVzcGFjZSAqLwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIEdFVF9DSEFSKGluLCBjLCAxLCBwKTsKLSAgICAgICAgaWYgKCFhcF9pc3NwYWNlKGMpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBub3cgZ2V0IGRpcmVjdGl2ZSAqLwotICAgIHdoaWxlICgxKSB7Ci0JaWYgKGQgLSBkZXN0ID09IGxlbikgewotCSAgICByZXR1cm4gMTsKLQl9Ci0gICAgICAgICpkKysgPSBhcF90b2xvd2VyKGMpOwotICAgICAgICBHRVRfQ0hBUihpbiwgYywgMSwgcCk7Ci0gICAgICAgIGlmIChhcF9pc3NwYWNlKGMpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICAqZCA9ICdcMCc7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBEbyB2YXJpYWJsZSBzdWJzdGl0dXRpb24gb24gc3RyaW5ncwotICovCi1zdGF0aWMgdm9pZCBwYXJzZV9zdHJpbmcocmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKmluLCBjaGFyICpvdXQsCi0JCQlzaXplX3QgbGVuZ3RoLCBpbnQgbGVhdmVfbmFtZSkKLXsKLSAgICBjaGFyIGNoOwotICAgIGNoYXIgKm5leHQgPSBvdXQ7Ci0gICAgY2hhciAqZW5kX291dDsKLQotICAgIC8qIGxlYXZlIHJvb20gZm9yIG51bCB0ZXJtaW5hdG9yICovCi0gICAgZW5kX291dCA9IG91dCArIGxlbmd0aCAtIDE7Ci0KLSAgICB3aGlsZSAoKGNoID0gKmluKyspICE9ICdcMCcpIHsKLSAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICBjYXNlICdcXCc6Ci0JICAgIGlmIChuZXh0ID09IGVuZF9vdXQpIHsKLQkJLyogdHJ1bmNhdGVkICovCi0JCSpuZXh0ID0gJ1wwJzsKLQkJcmV0dXJuOwotCSAgICB9Ci0gICAgICAgICAgICBpZiAoKmluID09ICckJykgewotICAgICAgICAgICAgICAgICpuZXh0KysgPSAqaW4rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICpuZXh0KysgPSBjaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICckJzoKLSAgICAgICAgICAgIHsKLQkJY2hhciB2YXJbTUFYX1NUUklOR19MRU5dOwotCQljb25zdCBjaGFyICpzdGFydF9vZl92YXJfbmFtZTsKLQkJY29uc3QgY2hhciAqZW5kX29mX3Zhcl9uYW1lOwkvKiBlbmQgb2YgdmFyIG5hbWUgKyAxICovCi0JCWNvbnN0IGNoYXIgKmV4cGFuc2lvbjsKLQkJY29uc3QgY2hhciAqdmFsOwotCQlzaXplX3QgbDsKLQotCQkvKiBndWVzcyB0aGF0IHRoZSBleHBhbnNpb24gd29uJ3QgaGFwcGVuICovCi0JCWV4cGFuc2lvbiA9IGluIC0gMTsKLQkJaWYgKCppbiA9PSAneycpIHsKLQkJICAgICsraW47Ci0JCSAgICBzdGFydF9vZl92YXJfbmFtZSA9IGluOwotCQkgICAgaW4gPSBzdHJjaHIoaW4sICd9Jyk7Ci0JCSAgICBpZiAoaW4gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwKLQkJCQkgICAgciwgIk1pc3NpbmcgJ30nIG9uIHZhcmlhYmxlIFwiJXNcIiIsCi0JCQkJICAgIGV4cGFuc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqbmV4dCA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLQkJICAgIGVuZF9vZl92YXJfbmFtZSA9IGluOwotCQkgICAgKytpbjsKLQkJfQotCQllbHNlIHsKLQkJICAgIHN0YXJ0X29mX3Zhcl9uYW1lID0gaW47Ci0JCSAgICB3aGlsZSAoYXBfaXNhbG51bSgqaW4pIHx8ICppbiA9PSAnXycpIHsKLQkJCSsraW47Ci0JCSAgICB9Ci0JCSAgICBlbmRfb2ZfdmFyX25hbWUgPSBpbjsKLQkJfQotCQkvKiB3aGF0IGEgcGFpbiwgdG9vIGJhZCB0aGVyZSdzIG5vIHRhYmxlX2dldG4gd2hlcmUgeW91IGNhbgotCQkgKiBwYXNzIGEgbm9uLW51bCB0ZXJtaW5hdGVkIHN0cmluZyAqLwotCQlsID0gZW5kX29mX3Zhcl9uYW1lIC0gc3RhcnRfb2ZfdmFyX25hbWU7Ci0JCWlmIChsICE9IDApIHsKLQkJICAgIGwgPSAobCA+IHNpemVvZih2YXIpIC0gMSkgPyAoc2l6ZW9mKHZhcikgLSAxKSA6IGw7Ci0JCSAgICBtZW1jcHkodmFyLCBzdGFydF9vZl92YXJfbmFtZSwgbCk7Ci0JCSAgICB2YXJbbF0gPSAnXDAnOwotCi0JCSAgICB2YWwgPSBhcF90YWJsZV9nZXQoci0+c3VicHJvY2Vzc19lbnYsIHZhcik7Ci0JCSAgICBpZiAodmFsKSB7Ci0JCQlleHBhbnNpb24gPSB2YWw7Ci0JCQlsID0gc3RybGVuKGV4cGFuc2lvbik7Ci0JCSAgICB9Ci0JCSAgICBlbHNlIGlmIChsZWF2ZV9uYW1lKSB7Ci0JCQlsID0gaW4gLSBleHBhbnNpb247Ci0JCSAgICB9Ci0JCSAgICBlbHNlIHsKLQkJCWJyZWFrOwkvKiBubyBleHBhbnNpb24gdG8gYmUgZG9uZSAqLwotCQkgICAgfQotCQl9Ci0JCWVsc2UgewotCQkgICAgLyogemVyby1sZW5ndGggdmFyaWFibGUgbmFtZSBjYXVzZXMganVzdCB0aGUgJCB0byBiZSBjb3BpZWQgKi8KLQkJICAgIGwgPSAxOwotCQl9Ci0JCWwgPSAobCA+IGVuZF9vdXQgLSBuZXh0KSA/IChlbmRfb3V0IC0gbmV4dCkgOiBsOwotCQltZW1jcHkobmV4dCwgZXhwYW5zaW9uLCBsKTsKLQkJbmV4dCArPSBsOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotCSAgICBpZiAobmV4dCA9PSBlbmRfb3V0KSB7Ci0JCS8qIHRydW5jYXRlZCAqLwotCQkqbmV4dCA9ICdcMCc7Ci0JCXJldHVybjsKLQkgICAgfQotICAgICAgICAgICAgKm5leHQrKyA9IGNoOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKm5leHQgPSAnXDAnOwotICAgIHJldHVybjsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFjdGlvbiBoYW5kbGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBpbnQgaW5jbHVkZV9jZ2koY2hhciAqcywgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgcmVxdWVzdF9yZWMgKnJyID0gYXBfc3ViX3JlcV9sb29rdXBfdXJpKHMsIHIpOwotICAgIGludCBycl9zdGF0dXM7Ci0KLSAgICBpZiAocnItPnN0YXR1cyAhPSBIVFRQX09LKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBObyBoYXJkd2lyZWQgcGF0aCBpbmZvIG9yIHF1ZXJ5IGFsbG93ZWQgKi8KLQotICAgIGlmICgocnItPnBhdGhfaW5mbyAmJiByci0+cGF0aF9pbmZvWzBdKSB8fCByci0+YXJncykgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChyci0+ZmluZm8uc3RfbW9kZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBTY3JpcHQgZ2V0cyBwYXJhbWV0ZXJzIG9mIHRoZSAqZG9jdW1lbnQqLCBmb3IgYmFjayBjb21wYXRpYmlsaXR5ICovCi0KLSAgICByci0+cGF0aF9pbmZvID0gci0+cGF0aF9pbmZvOyAgICAgICAvKiBoYXJkIHRvIGdldCByaWdodDsgc2VlIG1vZF9jZ2kuYyAqLwotICAgIHJyLT5hcmdzID0gci0+YXJnczsKLQotICAgIC8qIEZvcmNlIHN1Yl9yZXEgdG8gYmUgdHJlYXRlZCBhcyBhIENHSSByZXF1ZXN0LCBldmVuIGlmIG9yZGluYXJ5Ci0gICAgICogdHlwaW5nIHJ1bGVzIHdvdWxkIGhhdmUgY2FsbGVkIGl0IHNvbWV0aGluZyBlbHNlLgotICAgICAqLwotCi0gICAgcnItPmNvbnRlbnRfdHlwZSA9IENHSV9NQUdJQ19UWVBFOwotCi0gICAgLyogUnVuIGl0LiAqLwotCi0gICAgcnJfc3RhdHVzID0gYXBfcnVuX3N1Yl9yZXEocnIpOwotICAgIGlmIChhcF9pc19IVFRQX1JFRElSRUNUKHJyX3N0YXR1cykpIHsKLSAgICAgICAgY29uc3QgY2hhciAqbG9jYXRpb24gPSBhcF90YWJsZV9nZXQocnItPmhlYWRlcnNfb3V0LCAiTG9jYXRpb24iKTsKLSAgICAgICAgbG9jYXRpb24gPSBhcF9lc2NhcGVfaHRtbChyci0+cG9vbCwgbG9jYXRpb24pOwotICAgICAgICBhcF9ydnB1dHMociwgIjxBIEhSRUY9XCIiLCBsb2NhdGlvbiwgIlwiPiIsIGxvY2F0aW9uLCAiPC9BPiIsIE5VTEwpOwotICAgIH0KLQotICAgIGFwX2Rlc3Ryb3lfc3ViX3JlcShycik7Ci0jaWZuZGVmIFdJTjMyCi0gICAgYXBfY2hkaXJfZmlsZShyLT5maWxlbmFtZSk7Ci0jZW5kaWYKLQotICAgIHJldHVybiAwOwotfQotCi0vKiBlbnN1cmUgdGhhdCBwYXRoIGlzIHJlbGF0aXZlLCBhbmQgZG9lcyBub3QgY29udGFpbiAiLi4iIGVsZW1lbnRzCi0gKiBlbnNlbnRpYWxseSBlbnN1cmUgdGhhdCBpdCBkb2VzIG5vdCBtYXRjaCB0aGUgcmVnZXg6Ci0gKiAoXi98KF58LylcLlwuKC98JCkpCi0gKiBYWFg6IHRoaXMgbmVlZHMgb3MgYWJzdHJhY3Rpb24uLi4gY29uc2lkZXIgYzouLlxmb28gaW4gd2luMzIKLSAqLwotc3RhdGljIGludCBpc19vbmx5X2JlbG93KGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0jaWZkZWYgSEFWRV9EUklWRV9MRVRURVJTCi0gICAgaWYgKHBhdGhbMV0gPT0gJzonKQotCXJldHVybiAwOwotI2VuZGlmCi0gICAgaWYgKHBhdGhbMF0gPT0gJy8nKSB7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChwYXRoWzBdID09ICcuJyAmJiBwYXRoWzFdID09ICcuJwotCSYmIChwYXRoWzJdID09ICdcMCcgfHwgcGF0aFsyXSA9PSAnLycpKSB7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIHdoaWxlICgqcGF0aCkgewotCWlmICgqcGF0aCA9PSAnLycgJiYgcGF0aFsxXSA9PSAnLicgJiYgcGF0aFsyXSA9PSAnLicKLQkgICAgJiYgKHBhdGhbM10gPT0gJ1wwJyB8fCBwYXRoWzNdID09ICcvJykpIHsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCSsrcGF0aDsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgaGFuZGxlX2luY2x1ZGUoRklMRSAqaW4sIHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICplcnJvciwgaW50IG5vZXhlYykKLXsKLSAgICBjaGFyIHRhZ1tNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciBwYXJzZWRfc3RyaW5nW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjaGFyICp0YWdfdmFsOwotCi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKCEodGFnX3ZhbCA9IGdldF90YWcoci0+cG9vbCwgaW4sIHRhZywgc2l6ZW9mKHRhZyksIDEpKSkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFzdHJjbXAodGFnLCAiZmlsZSIpIHx8ICFzdHJjbXAodGFnLCAidmlydHVhbCIpKSB7Ci0gICAgICAgICAgICByZXF1ZXN0X3JlYyAqcnIgPSBOVUxMOwotICAgICAgICAgICAgY2hhciAqZXJyb3JfZm10ID0gTlVMTDsKLQotICAgICAgICAgICAgcGFyc2Vfc3RyaW5nKHIsIHRhZ192YWwsIHBhcnNlZF9zdHJpbmcsIHNpemVvZihwYXJzZWRfc3RyaW5nKSwgMCk7Ci0gICAgICAgICAgICBpZiAodGFnWzBdID09ICdmJykgewotICAgICAgICAgICAgICAgIC8qIGJlIHNhZmU7IG9ubHkgZmlsZXMgaW4gdGhpcyBkaXJlY3Rvcnkgb3IgYmVsb3cgYWxsb3dlZCAqLwotCQlpZiAoIWlzX29ubHlfYmVsb3cocGFyc2VkX3N0cmluZykpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JfZm10ID0gInVuYWJsZSB0byBpbmNsdWRlIGZpbGUgXCIlc1wiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJpbiBwYXJzZWQgZmlsZSAlcyI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICByciA9IGFwX3N1Yl9yZXFfbG9va3VwX2ZpbGUocGFyc2VkX3N0cmluZywgcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcnIgPSBhcF9zdWJfcmVxX2xvb2t1cF91cmkocGFyc2VkX3N0cmluZywgcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZXJyb3JfZm10ICYmIHJyLT5zdGF0dXMgIT0gSFRUUF9PSykgewotICAgICAgICAgICAgICAgIGVycm9yX2ZtdCA9ICJ1bmFibGUgdG8gaW5jbHVkZSBcIiVzXCIgaW4gcGFyc2VkIGZpbGUgJXMiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWVycm9yX2ZtdCAmJiBub2V4ZWMgJiYgcnItPmNvbnRlbnRfdHlwZQotICAgICAgICAgICAgICAgICYmIChzdHJuY21wKHJyLT5jb250ZW50X3R5cGUsICJ0ZXh0LyIsIDUpKSkgewotICAgICAgICAgICAgICAgIGVycm9yX2ZtdCA9ICJ1bmFibGUgdG8gaW5jbHVkZSBwb3RlbnRpYWwgZXhlYyBcIiVzXCIgIgotICAgICAgICAgICAgICAgICAgICAiaW4gcGFyc2VkIGZpbGUgJXMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVycm9yX2ZtdCA9PSBOVUxMKSB7Ci0JCS8qIHRyeSB0byBhdm9pZCByZWN1cnNpdmUgaW5jbHVkZXMuICBXZSBkbyB0aGlzIGJ5IHdhbGtpbmcKLQkJICogdXAgdGhlIHItPm1haW4gbGlzdCBvZiBzdWJyZXF1ZXN0cywgYW5kIGF0IGVhY2ggbGV2ZWwKLQkJICogd2Fsa2luZyBiYWNrIHRocm91Z2ggYW55IGludGVybmFsIHJlZGlyZWN0cy4gIEF0IGVhY2gKLQkJICogc3RlcCwgd2UgY29tcGFyZSB0aGUgZmlsZW5hbWVzIGFuZCB0aGUgVVJJcy4gIAotCQkgKgotCQkgKiBUaGUgZmlsZW5hbWUgY29tcGFyaXNvbiBjYXRjaGVzIGEgcmVjdXJzaXZlIGluY2x1ZGUKLQkJICogd2l0aCBhbiBldmVyLWNoYW5naW5nIFVSTCwgZWcuCi0JCSAqIDwhLS0jaW5jbHVkZSB2aXJ0dWFsPQotCQkgKiAgICAgICIkUkVRVUVTVF9VUkkvJFFVRVJZX1NUUklORz8kUVVFUllfU1RSSU5HL3giLS0+Ci0JCSAqIHdoaWNoLCBhbHRob3VnaCB0aGV5IHdvdWxkIGV2ZW50dWFsbHkgYmUgY2F1Z2h0IGJlY2F1c2UKLQkJICogd2UgaGF2ZSBhIGxpbWl0IG9uIHRoZSBsZW5ndGggb2YgZmlsZXMsIGV0Yy4sIGNhbiAKLQkJICogcmVjdXJzZSBmb3IgYSB3aGlsZS4KLQkJICoKLQkJICogVGhlIFVSSSBjb21wYXJpc29uIGNhdGNoZXMgdGhlIGNhc2Ugd2hlcmUgdGhlIGZpbGVuYW1lCi0JCSAqIGlzIGNoYW5nZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgcmVxdWVzdCwgc28gdGhlIAotCQkgKiBjdXJyZW50IG5hbWUgaXMgbmV2ZXIgdGhlIHNhbWUgYXMgYW55IHByZXZpb3VzIG9uZS4KLQkJICogVGhpcyBjYW4gaGFwcGVuIHdpdGggIkRvY3VtZW50Um9vdCAvZm9vIiB3aGVuIHlvdQotCQkgKiByZXF1ZXN0ICIvIiBvbiB0aGUgc2VydmVyIGFuZCBpdCBpbmNsdWRlcyAiLyIuCi0JCSAqIFRoaXMgb25seSBhcHBsaWVzIHRvIG1vZHVsZXMgc3VjaCBhcyBtb2RfZGlyIHRoYXQgCi0JCSAqIChzb21ld2hhdCBpbXByb3Blcmx5KSBtZXNzIHdpdGggci0+ZmlsZW5hbWUgb3V0c2lkZSAKLQkJICogb2YgYSBmaWxlbmFtZSB0cmFuc2xhdGlvbiBwaGFzZS4KLQkJICovCi0JCWludCBmb3VuZGR1cGUgPSAwOwotICAgICAgICAgICAgICAgIHJlcXVlc3RfcmVjICpwOwotICAgICAgICAgICAgICAgIGZvciAocCA9IHI7IHAgIT0gTlVMTCAmJiAhZm91bmRkdXBlOyBwID0gcC0+bWFpbikgewotCQkgICAgcmVxdWVzdF9yZWMgKnE7Ci0JCSAgICBmb3IgKHEgPSBwOyBxICE9IE5VTEw7IHEgPSBxLT5wcmV2KSB7Ci0JCQlpZiAoIChzdHJjbXAocS0+ZmlsZW5hbWUsIHJyLT5maWxlbmFtZSkgPT0gMCkgfHwKLQkJCSAgICAgKHN0cmNtcChxLT51cmksIHJyLT51cmkpID09IDApICl7Ci0JCQkgICAgZm91bmRkdXBlID0gMTsKLQkJCSAgICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQkJfQotCi0gICAgICAgICAgICAgICAgaWYgKHAgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBlcnJvcl9mbXQgPSAiUmVjdXJzaXZlIGluY2x1ZGUgb2YgXCIlc1wiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJpbiBwYXJzZWQgZmlsZSAlcyI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0JICAgIC8qIHNlZSB0aGUgS2x1ZGdlIGluIHNlbmRfcGFyc2VkX2ZpbGUgZm9yIHdoeSAqLwotCSAgICBpZiAocnIpIAotCQlhcF9zZXRfbW9kdWxlX2NvbmZpZyhyci0+cmVxdWVzdF9jb25maWcsICZpbmNsdWRlc19tb2R1bGUsIHIpOwotCi0gICAgICAgICAgICBpZiAoIWVycm9yX2ZtdCAmJiBhcF9ydW5fc3ViX3JlcShycikpIHsKLSAgICAgICAgICAgICAgICBlcnJvcl9mbXQgPSAidW5hYmxlIHRvIGluY2x1ZGUgXCIlc1wiIGluIHBhcnNlZCBmaWxlICVzIjsKLSAgICAgICAgICAgIH0KLSNpZm5kZWYgV0lOMzIKLSAgICAgICAgICAgIGFwX2NoZGlyX2ZpbGUoci0+ZmlsZW5hbWUpOwotI2VuZGlmCi0gICAgICAgICAgICBpZiAoZXJyb3JfZm10KSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwKLQkJCSAgICByLCBlcnJvcl9mbXQsIHRhZ192YWwsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICBhcF9ycHV0cyhlcnJvciwgcik7Ci0gICAgICAgICAgICB9Ci0KLQkgICAgLyogZGVzdHJveSB0aGUgc3ViIHJlcXVlc3QgaWYgaXQncyBub3QgYSBuZXN0ZWQgaW5jbHVkZSAqLwotICAgICAgICAgICAgaWYgKHJyICE9IE5VTEwKLQkJJiYgYXBfZ2V0X21vZHVsZV9jb25maWcocnItPnJlcXVlc3RfY29uZmlnLCAmaW5jbHVkZXNfbW9kdWxlKQotCQkgICAgIT0gTkVTVEVEX0lOQ0xVREVfTUFHSUMpIHsKLQkJYXBfZGVzdHJveV9zdWJfcmVxKHJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghc3RyY21wKHRhZywgImRvbmUiKSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gcGFyYW1ldGVyIFwiJXNcIiB0byB0YWcgaW5jbHVkZSBpbiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICB0YWcsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdHlwZWRlZiBzdHJ1Y3QgewotI2lmZGVmIFRQRgotICAgIFRQRl9GT1JLX0NISUxEIHQ7Ci0jZW5kaWYKLSAgICByZXF1ZXN0X3JlYyAqcjsKLSAgICBjaGFyICpzOwotfSBpbmNsdWRlX2NtZF9hcmc7Ci0KLXN0YXRpYyBpbnQgaW5jbHVkZV9jbWRfY2hpbGQodm9pZCAqYXJnLCBjaGlsZF9pbmZvICpwaW5mbykKLXsKLSAgICByZXF1ZXN0X3JlYyAqciA9ICgoaW5jbHVkZV9jbWRfYXJnICopIGFyZyktPnI7Ci0gICAgY2hhciAqcyA9ICgoaW5jbHVkZV9jbWRfYXJnICopIGFyZyktPnM7Ci0gICAgdGFibGUgKmVudiA9IHItPnN1YnByb2Nlc3NfZW52OwotICAgIGludCBjaGlsZF9waWQgPSAwOwotI2lmZGVmIERFQlVHX0lOQ0xVREVfQ01ECi0jaWZkZWYgT1MyCi0gICAgLyogdW5kZXIgT1MvMiAvZGV2L3R0eSBpcyByZWZlcmVuY2VkIGFzIGNvbiAqLwotICAgIEZJTEUgKmRiZyA9IGZvcGVuKCJjb24iLCAidyIpOwotI2Vsc2UKLSAgICBGSUxFICpkYmcgPSBmb3BlbigiL2Rldi90dHkiLCAidyIpOwotI2VuZGlmCi0jZW5kaWYKLSNpZm5kZWYgV0lOMzIKLSAgICBjaGFyIGVycl9zdHJpbmdbTUFYX1NUUklOR19MRU5dOwotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19JTkNMVURFX0NNRAotICAgIGZwcmludGYoZGJnLCAiQXR0ZW1wdGluZyB0byBpbmNsdWRlIGNvbW1hbmQgJyVzJ1xuIiwgcyk7Ci0jZW5kaWYKLQotICAgIGlmIChyLT5wYXRoX2luZm8gJiYgci0+cGF0aF9pbmZvWzBdICE9ICdcMCcpIHsKLSAgICAgICAgcmVxdWVzdF9yZWMgKnBhX3JlcTsKLQotICAgICAgICBhcF90YWJsZV9zZXRuKGVudiwgIlBBVEhfSU5GTyIsIGFwX2VzY2FwZV9zaGVsbF9jbWQoci0+cG9vbCwgci0+cGF0aF9pbmZvKSk7Ci0KLSAgICAgICAgcGFfcmVxID0gYXBfc3ViX3JlcV9sb29rdXBfdXJpKGFwX2VzY2FwZV91cmkoci0+cG9vbCwgci0+cGF0aF9pbmZvKSwgcik7Ci0gICAgICAgIGlmIChwYV9yZXEtPmZpbGVuYW1lKSB7Ci0gICAgICAgICAgICBhcF90YWJsZV9zZXRuKGVudiwgIlBBVEhfVFJBTlNMQVRFRCIsCi0gICAgICAgICAgICAgICAgICAgICAgYXBfcHN0cmNhdChyLT5wb29sLCBwYV9yZXEtPmZpbGVuYW1lLCBwYV9yZXEtPnBhdGhfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChyLT5hcmdzKSB7Ci0gICAgICAgIGNoYXIgKmFyZ19jb3B5ID0gYXBfcHN0cmR1cChyLT5wb29sLCByLT5hcmdzKTsKLQotICAgICAgICBhcF90YWJsZV9zZXRuKGVudiwgIlFVRVJZX1NUUklORyIsIHItPmFyZ3MpOwotICAgICAgICBhcF91bmVzY2FwZV91cmwoYXJnX2NvcHkpOwotICAgICAgICBhcF90YWJsZV9zZXRuKGVudiwgIlFVRVJZX1NUUklOR19VTkVTQ0FQRUQiLAotICAgICAgICAgICAgICAgICAgYXBfZXNjYXBlX3NoZWxsX2NtZChyLT5wb29sLCBhcmdfY29weSkpOwotICAgIH0KLQotICAgIGFwX2Vycm9yX2xvZzJzdGRlcnIoci0+c2VydmVyKTsKLQotI2lmZGVmIERFQlVHX0lOQ0xVREVfQ01ECi0gICAgZnByaW50ZihkYmcsICJBdHRlbXB0aW5nIHRvIGV4ZWMgJyVzJ1xuIiwgcyk7Ci0jZW5kaWYKLSNpZmRlZiBUUEYKLSAgICByZXR1cm4gKDApOwotI2Vsc2UKLSAgICBhcF9jbGVhbnVwX2Zvcl9leGVjKCk7Ci0gICAgLyogc2V0IHNoZWxsY21kIGZsYWcgdG8gcGFzcyBhcmcgdG8gU0hFTExfUEFUSCAqLwotICAgIGNoaWxkX3BpZCA9IGFwX2NhbGxfZXhlYyhyLCBwaW5mbywgcywgYXBfY3JlYXRlX2Vudmlyb25tZW50KHItPnBvb2wsIGVudiksCi0JCQkgICAgIDEpOwotI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoT1MyKQotICAgIHJldHVybiAoY2hpbGRfcGlkKTsKLSNlbHNlCi0gICAgLyogT2gsIGRyYXQuICBXZSdyZSBzdGlsbCBoZXJlLiAgVGhlIGxvZyBmaWxlIGRlc2NyaXB0b3JzIGFyZSBjbG9zZWQsCi0gICAgICogc28gd2UgaGF2ZSB0byB3aGltcGVyIGEgY29tcGxhaW50IG9udG8gc3RkZXJyLi4uCi0gICAgICovCi0KLSNpZmRlZiBERUJVR19JTkNMVURFX0NNRAotICAgIGZwcmludGYoZGJnLCAiRXhlYyBmYWlsZWRcbiIpOwotI2VuZGlmCi0gICAgYXBfc25wcmludGYoZXJyX3N0cmluZywgc2l6ZW9mKGVycl9zdHJpbmcpLAotICAgICAgICAgICAgICAgICJleGVjIG9mICVzIGZhaWxlZCwgcmVhc29uOiAlcyAoZXJybm8gPSAlZClcbiIsCi0gICAgICAgICAgICAgICAgU0hFTExfUEFUSCwgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7Ci0gICAgd3JpdGUoU1RERVJSX0ZJTEVOTywgZXJyX3N0cmluZywgc3RybGVuKGVycl9zdHJpbmcpKTsKLSAgICBleGl0KDApOwotICAgIC8qIE5PVCBSRUFDSEVEICovCi0gICAgcmV0dXJuIChjaGlsZF9waWQpOwotI2VuZGlmIC8qIFdJTjMyICovCi0jZW5kaWYgLyogVFBGICovCi19Ci0KLXN0YXRpYyBpbnQgaW5jbHVkZV9jbWQoY2hhciAqcywgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW5jbHVkZV9jbWRfYXJnIGFyZzsKLSAgICBCVUZGICpzY3JpcHRfaW47Ci0KLSAgICBhcmcuciA9IHI7Ci0gICAgYXJnLnMgPSBzOwotI2lmZGVmIFRQRgotICAgIGFyZy50LmZpbGVuYW1lID0gci0+ZmlsZW5hbWU7Ci0gICAgYXJnLnQuc3VicHJvY2Vzc19lbnYgPSByLT5zdWJwcm9jZXNzX2VudjsKLSAgICBhcmcudC5wcm9nX3R5cGUgPSBGT1JLX0ZJTEU7Ci0jZW5kaWYKLQotICAgIGlmICghYXBfYnNwYXduX2NoaWxkKHItPnBvb2wsIGluY2x1ZGVfY21kX2NoaWxkLCAmYXJnLAotCQkJIGtpbGxfYWZ0ZXJfdGltZW91dCwgTlVMTCwgJnNjcmlwdF9pbiwgTlVMTCkpIHsKLSAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsCi0JCSAgICAgImNvdWxkbid0IHNwYXduIGluY2x1ZGUgY29tbWFuZCIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgYXBfc2VuZF9mYihzY3JpcHRfaW4sIHIpOwotICAgIGFwX2JjbG9zZShzY3JpcHRfaW4pOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhhbmRsZV9leGVjKEZJTEUgKmluLCByZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqZXJyb3IpCi17Ci0gICAgY2hhciB0YWdbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgKnRhZ192YWw7Ci0gICAgY2hhciAqZmlsZSA9IHItPmZpbGVuYW1lOwotICAgIGNoYXIgcGFyc2VkX3N0cmluZ1tNQVhfU1RSSU5HX0xFTl07Ci0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoISh0YWdfdmFsID0gZ2V0X3RhZyhyLT5wb29sLCBpbiwgdGFnLCBzaXplb2YodGFnKSwgMSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXN0cmNtcCh0YWcsICJjbWQiKSkgewotICAgICAgICAgICAgcGFyc2Vfc3RyaW5nKHIsIHRhZ192YWwsIHBhcnNlZF9zdHJpbmcsIHNpemVvZihwYXJzZWRfc3RyaW5nKSwgMSk7Ci0gICAgICAgICAgICBpZiAoaW5jbHVkZV9jbWQocGFyc2VkX3N0cmluZywgcikgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGVjdXRpb24gZmFpbHVyZSBmb3IgcGFyYW1ldGVyIFwiJXNcIiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIHRhZyBleGVjIGluIGZpbGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZywgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIGp1c3QgaW4gY2FzZSBzb21lIHN0b29nZSBjaGFuZ2VkIGRpcmVjdG9yaWVzICovCi0jaWZuZGVmIFdJTjMyCi0gICAgICAgICAgICBhcF9jaGRpcl9maWxlKHItPmZpbGVuYW1lKTsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJjbXAodGFnLCAiY2dpIikpIHsKLSAgICAgICAgICAgIHBhcnNlX3N0cmluZyhyLCB0YWdfdmFsLCBwYXJzZWRfc3RyaW5nLCBzaXplb2YocGFyc2VkX3N0cmluZyksIDApOwotICAgICAgICAgICAgaWYgKGluY2x1ZGVfY2dpKHBhcnNlZF9zdHJpbmcsIHIpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBDR0kgcmVmIFwiJXNcIiBpbiAlcyIsIHRhZ192YWwsIGZpbGUpOwotICAgICAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIGdydW1ibGUgZ3JvYW4gKi8KLSNpZm5kZWYgV0lOMzIKLSAgICAgICAgICAgIGFwX2NoZGlyX2ZpbGUoci0+ZmlsZW5hbWUpOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCh0YWcsICJkb25lIikpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHBhcmFtZXRlciBcIiVzXCIgdG8gdGFnIGV4ZWMgaW4gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgdGFnLCBmaWxlKTsKLSAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi1zdGF0aWMgaW50IGhhbmRsZV9lY2hvKEZJTEUgKmluLCByZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqZXJyb3IpCi17Ci0gICAgY2hhciB0YWdbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgKnRhZ192YWw7Ci0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoISh0YWdfdmFsID0gZ2V0X3RhZyhyLT5wb29sLCBpbiwgdGFnLCBzaXplb2YodGFnKSwgMSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXN0cmNtcCh0YWcsICJ2YXIiKSkgewotICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsID0gYXBfdGFibGVfZ2V0KHItPnN1YnByb2Nlc3NfZW52LCB0YWdfdmFsKTsKLQotICAgICAgICAgICAgaWYgKHZhbCkgewotICAgICAgICAgICAgICAgIGFwX3JwdXRzKHZhbCwgcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBhcF9ycHV0cygiKG5vbmUpIiwgcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCh0YWcsICJkb25lIikpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHBhcmFtZXRlciBcIiVzXCIgdG8gdGFnIGVjaG8gaW4gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgdGFnLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICBhcF9ycHV0cyhlcnJvciwgcik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLSNpZmRlZiBVU0VfUEVSTF9TU0kKLXN0YXRpYyBpbnQgaGFuZGxlX3BlcmwoRklMRSAqaW4sIHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICplcnJvcikKLXsKLSAgICBjaGFyIHRhZ1tNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciBwYXJzZWRfc3RyaW5nW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjaGFyICp0YWdfdmFsOwotICAgIFNWICpzdWIgPSBOdWxsc3Y7Ci0gICAgQVYgKmF2ID0gbmV3QVYoKTsKLQotICAgIGlmIChhcF9hbGxvd19vcHRpb25zKHIpICYgT1BUX0lOQ05PRVhFQykgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotCQkgICAgICAiI3BlcmwgU1NJIGRpc2FsbG93ZWQgYnkgSW5jbHVkZXNOb0V4ZWMgaW4gJXMiLAotCQkgICAgICByLT5maWxlbmFtZSk7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKCEodGFnX3ZhbCA9IGdldF90YWcoci0+cG9vbCwgaW4sIHRhZywgc2l6ZW9mKHRhZyksIDEpKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0cm5FUSh0YWcsICJzdWIiLCAzKSkgewotICAgICAgICAgICAgc3ViID0gbmV3U1Zwdih0YWdfdmFsLCAwKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJuRVEodGFnLCAiYXJnIiwgMykpIHsKLSAgICAgICAgICAgIHBhcnNlX3N0cmluZyhyLCB0YWdfdmFsLCBwYXJzZWRfc3RyaW5nLCBzaXplb2YocGFyc2VkX3N0cmluZyksIDApOwotICAgICAgICAgICAgYXZfcHVzaChhdiwgbmV3U1ZwdihwYXJzZWRfc3RyaW5nLCAwKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RybkVRKHRhZywgImRvbmUiLCA0KSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcGVybF9zdGRvdXQyY2xpZW50KHIpOwotICAgIHBlcmxfc2V0dXBfZW52KHIpOwotICAgIHBlcmxfY2FsbF9oYW5kbGVyKHN1YiwgciwgYXYpOwotICAgIHJldHVybiBPSzsKLX0KLSNlbmRpZgotCi0vKiBlcnJvciBhbmQgdGYgbXVzdCBwb2ludCB0byBhIHN0cmluZyB3aXRoIHJvb20gZm9yIGF0IAotICogbGVhc3QgTUFYX1NUUklOR19MRU4gY2hhcmFjdGVycyAKLSAqLwotc3RhdGljIGludCBoYW5kbGVfY29uZmlnKEZJTEUgKmluLCByZXF1ZXN0X3JlYyAqciwgY2hhciAqZXJyb3IsIGNoYXIgKnRmLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2l6ZWZtdCkKLXsKLSAgICBjaGFyIHRhZ1tNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciAqdGFnX3ZhbDsKLSAgICBjaGFyIHBhcnNlZF9zdHJpbmdbTUFYX1NUUklOR19MRU5dOwotICAgIHRhYmxlICplbnYgPSByLT5zdWJwcm9jZXNzX2VudjsKLQotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmICghKHRhZ192YWwgPSBnZXRfdGFnKHItPnBvb2wsIGluLCB0YWcsIHNpemVvZih0YWcpLCAwKSkpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc3RyY21wKHRhZywgImVycm1zZyIpKSB7Ci0gICAgICAgICAgICBwYXJzZV9zdHJpbmcociwgdGFnX3ZhbCwgZXJyb3IsIE1BWF9TVFJJTkdfTEVOLCAwKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghc3RyY21wKHRhZywgInRpbWVmbXQiKSkgewotICAgICAgICAgICAgdGltZV90IGRhdGUgPSByLT5yZXF1ZXN0X3RpbWU7Ci0KLSAgICAgICAgICAgIHBhcnNlX3N0cmluZyhyLCB0YWdfdmFsLCB0ZiwgTUFYX1NUUklOR19MRU4sIDApOwotICAgICAgICAgICAgYXBfdGFibGVfc2V0bihlbnYsICJEQVRFX0xPQ0FMIiwgYXBfaHRfdGltZShyLT5wb29sLCBkYXRlLCB0ZiwgMCkpOwotICAgICAgICAgICAgYXBfdGFibGVfc2V0bihlbnYsICJEQVRFX0dNVCIsIGFwX2h0X3RpbWUoci0+cG9vbCwgZGF0ZSwgdGYsIDEpKTsKLSAgICAgICAgICAgIGFwX3RhYmxlX3NldG4oZW52LCAiTEFTVF9NT0RJRklFRCIsCi0gICAgICAgICAgICAgICAgICAgICAgYXBfaHRfdGltZShyLT5wb29sLCByLT5maW5mby5zdF9tdGltZSwgdGYsIDApKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghc3RyY21wKHRhZywgInNpemVmbXQiKSkgewotICAgICAgICAgICAgcGFyc2Vfc3RyaW5nKHIsIHRhZ192YWwsIHBhcnNlZF9zdHJpbmcsIHNpemVvZihwYXJzZWRfc3RyaW5nKSwgMCk7Ci0gICAgICAgICAgICBkZWNvZGVodG1sKHBhcnNlZF9zdHJpbmcpOwotICAgICAgICAgICAgaWYgKCFzdHJjbXAocGFyc2VkX3N0cmluZywgImJ5dGVzIikpIHsKLSAgICAgICAgICAgICAgICAqc2l6ZWZtdCA9IFNJWkVGTVRfQllURVM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKHBhcnNlZF9zdHJpbmcsICJhYmJyZXYiKSkgewotICAgICAgICAgICAgICAgICpzaXplZm10ID0gU0laRUZNVF9LTUc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCh0YWcsICJkb25lIikpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHBhcmFtZXRlciBcIiVzXCIgdG8gdGFnIGNvbmZpZyBpbiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICB0YWcsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCi1zdGF0aWMgaW50IGZpbmRfZmlsZShyZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqZGlyZWN0aXZlLCBjb25zdCBjaGFyICp0YWcsCi0gICAgICAgICAgICAgICAgICAgICBjaGFyICp0YWdfdmFsLCBzdHJ1Y3Qgc3RhdCAqZmluZm8sIGNvbnN0IGNoYXIgKmVycm9yKQotewotICAgIGNoYXIgKnRvX3NlbmQgPSB0YWdfdmFsOwotICAgIHJlcXVlc3RfcmVjICpyciA9IE5VTEw7Ci0gICAgaW50IHJldD0wOwotICAgIGNoYXIgKmVycm9yX2ZtdCA9IE5VTEw7Ci0KLSAgICBpZiAoIXN0cmNtcCh0YWcsICJmaWxlIikpIHsKLSAgICAgICAgLyogYmUgc2FmZTsgb25seSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBvciBiZWxvdyBhbGxvd2VkICovCi0gICAgICAgIGlmICghaXNfb25seV9iZWxvdyh0YWdfdmFsKSkgewotICAgICAgICAgICAgZXJyb3JfZm10ID0gInVuYWJsZSB0byBhY2Nlc3MgZmlsZSBcIiVzXCIgIgotICAgICAgICAgICAgICAgICAgICAgICAgImluIHBhcnNlZCBmaWxlICVzIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGFwX2dldHBhcmVudHModGFnX3ZhbCk7ICAgIC8qIGdldCByaWQgb2YgYW55IG5hc3RpZXMgKi8KLSAgICAgICAgICAgIHJyID0gYXBfc3ViX3JlcV9sb29rdXBfZmlsZSh0YWdfdmFsLCByKTsKLQotICAgICAgICAgICAgaWYgKHJyLT5zdGF0dXMgPT0gSFRUUF9PSyAmJiByci0+ZmluZm8uc3RfbW9kZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgdG9fc2VuZCA9IHJyLT5maWxlbmFtZTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdCh0b19zZW5kLCBmaW5mbykpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JfZm10ID0gInVuYWJsZSB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgXCIlc1wiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIHBhcnNlZCBmaWxlICVzIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnJvcl9mbXQgPSAidW5hYmxlIHRvIGxvb2t1cCBpbmZvcm1hdGlvbiBhYm91dCBcIiVzXCIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBwYXJzZWQgZmlsZSAlcyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXJyb3JfZm10KSB7Ci0gICAgICAgICAgICByZXQgPSAtMTsKLSAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLCBlcnJvcl9mbXQsIHRvX3NlbmQsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChycikgYXBfZGVzdHJveV9zdWJfcmVxKHJyKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAodGFnLCAidmlydHVhbCIpKSB7Ci0gICAgICAgIHJyID0gYXBfc3ViX3JlcV9sb29rdXBfdXJpKHRhZ192YWwsIHIpOwotCi0gICAgICAgIGlmIChyci0+c3RhdHVzID09IEhUVFBfT0sgJiYgcnItPmZpbmZvLnN0X21vZGUgIT0gMCkgewotICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIGZpbmZvLCAoY29uc3QgY2hhciAqKSAmcnItPmZpbmZvLAotICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc3RhdCkpOwotICAgICAgICAgICAgYXBfZGVzdHJveV9zdWJfcmVxKHJyKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IFwiJXNcIiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiaW4gcGFyc2VkIGZpbGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgdGFnX3ZhbCwgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgYXBfcnB1dHMoZXJyb3IsIHIpOwotICAgICAgICAgICAgYXBfZGVzdHJveV9zdWJfcmVxKHJyKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgInVua25vd24gcGFyYW1ldGVyIFwiJXNcIiB0byB0YWcgJXMgaW4gJXMiLAotICAgICAgICAgICAgICAgICAgICB0YWcsIGRpcmVjdGl2ZSwgci0+ZmlsZW5hbWUpOwotICAgICAgICBhcF9ycHV0cyhlcnJvciwgcik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIGludCBoYW5kbGVfZnNpemUoRklMRSAqaW4sIHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICplcnJvciwgaW50IHNpemVmbXQpCi17Ci0gICAgY2hhciB0YWdbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgKnRhZ192YWw7Ci0gICAgc3RydWN0IHN0YXQgZmluZm87Ci0gICAgY2hhciBwYXJzZWRfc3RyaW5nW01BWF9TVFJJTkdfTEVOXTsKLQotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmICghKHRhZ192YWwgPSBnZXRfdGFnKHItPnBvb2wsIGluLCB0YWcsIHNpemVvZih0YWcpLCAxKSkpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJjbXAodGFnLCAiZG9uZSIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHBhcnNlX3N0cmluZyhyLCB0YWdfdmFsLCBwYXJzZWRfc3RyaW5nLCBzaXplb2YocGFyc2VkX3N0cmluZyksIDApOwotICAgICAgICAgICAgaWYgKCFmaW5kX2ZpbGUociwgImZzaXplIiwgdGFnLCBwYXJzZWRfc3RyaW5nLCAmZmluZm8sIGVycm9yKSkgewotICAgICAgICAgICAgICAgIGlmIChzaXplZm10ID09IFNJWkVGTVRfS01HKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwX3NlbmRfc2l6ZShmaW5mby5zdF9zaXplLCByKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsLCB4OwotI2lmIGRlZmluZWQoQVBfT0ZGX1RfSVNfUVVBRCkKLSAgICAgICAgICAgICAgICAgICAgYXBfc25wcmludGYodGFnLCBzaXplb2YodGFnKSwgIiVxZCIsIGZpbmZvLnN0X3NpemUpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgYXBfc25wcmludGYodGFnLCBzaXplb2YodGFnKSwgIiVsZCIsIGZpbmZvLnN0X3NpemUpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIGwgPSBzdHJsZW4odGFnKTsgICAgLyogZ3JyciAqLwotICAgICAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgbDsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCAmJiAoISgobCAtIHgpICUgMykpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dGMoJywnLCByKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRjKHRhZ1t4XSwgcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgaGFuZGxlX2ZsYXN0bW9kKEZJTEUgKmluLCByZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqZXJyb3IsIGNvbnN0IGNoYXIgKnRmKQotewotICAgIGNoYXIgdGFnW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjaGFyICp0YWdfdmFsOwotICAgIHN0cnVjdCBzdGF0IGZpbmZvOwotICAgIGNoYXIgcGFyc2VkX3N0cmluZ1tNQVhfU1RSSU5HX0xFTl07Ci0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoISh0YWdfdmFsID0gZ2V0X3RhZyhyLT5wb29sLCBpbiwgdGFnLCBzaXplb2YodGFnKSwgMSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghc3RyY21wKHRhZywgImRvbmUiKSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwYXJzZV9zdHJpbmcociwgdGFnX3ZhbCwgcGFyc2VkX3N0cmluZywgc2l6ZW9mKHBhcnNlZF9zdHJpbmcpLCAwKTsKLSAgICAgICAgICAgIGlmICghZmluZF9maWxlKHIsICJmbGFzdG1vZCIsIHRhZywgcGFyc2VkX3N0cmluZywgJmZpbmZvLCBlcnJvcikpIHsKLSAgICAgICAgICAgICAgICBhcF9ycHV0cyhhcF9odF90aW1lKHItPnBvb2wsIGZpbmZvLnN0X210aW1lLCB0ZiwgMCksIHIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IHJlX2NoZWNrKHJlcXVlc3RfcmVjICpyLCBjaGFyICpzdHJpbmcsIGNoYXIgKnJleHApCi17Ci0gICAgcmVnZXhfdCAqY29tcGlsZWQ7Ci0gICAgaW50IHJlZ2V4X2Vycm9yOwotCi0gICAgY29tcGlsZWQgPSBhcF9wcmVnY29tcChyLT5wb29sLCByZXhwLCBSRUdfRVhURU5ERUQgfCBSRUdfTk9TVUIpOwotICAgIGlmIChjb21waWxlZCA9PSBOVUxMKSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0gICAgICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gY29tcGlsZSBwYXR0ZXJuIFwiJXNcIiIsIHJleHApOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHJlZ2V4X2Vycm9yID0gYXBfcmVnZXhlYyhjb21waWxlZCwgc3RyaW5nLCAwLCAocmVnbWF0Y2hfdCAqKSBOVUxMLCAwKTsKLSAgICBhcF9wcmVnZnJlZShyLT5wb29sLCBjb21waWxlZCk7Ci0gICAgcmV0dXJuICghcmVnZXhfZXJyb3IpOwotfQotCi1lbnVtIHRva2VuX3R5cGUgewotICAgIHRva2VuX3N0cmluZywKLSAgICB0b2tlbl9hbmQsIHRva2VuX29yLCB0b2tlbl9ub3QsIHRva2VuX2VxLCB0b2tlbl9uZSwKLSAgICB0b2tlbl9yYnJhY2UsIHRva2VuX2xicmFjZSwgdG9rZW5fZ3JvdXAsCi0gICAgdG9rZW5fZ2UsIHRva2VuX2xlLCB0b2tlbl9ndCwgdG9rZW5fbHQKLX07Ci1zdHJ1Y3QgdG9rZW4gewotICAgIGVudW0gdG9rZW5fdHlwZSB0eXBlOwotICAgIGNoYXIgdmFsdWVbTUFYX1NUUklOR19MRU5dOwotfTsKLQotLyogdGhlcmUgaXMgYW4gaW1wbGljaXQgYXNzdW1wdGlvbiBoZXJlIHRoYXQgc3RyaW5nIGlzIGF0IG1vc3QgTUFYX1NUUklOR19MRU4tMQotICogY2hhcmFjdGVycyBsb25nLi4uCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpnZXRfcHRva2VuKHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICpzdHJpbmcsIHN0cnVjdCB0b2tlbiAqdG9rZW4pCi17Ci0gICAgY2hhciBjaDsKLSAgICBpbnQgbmV4dCA9IDA7Ci0gICAgaW50IHFzID0gMDsKLQotICAgIC8qIFNraXAgbGVhZGluZyB3aGl0ZSBzcGFjZSAqLwotICAgIGlmIChzdHJpbmcgPT0gKGNoYXIgKikgTlVMTCkgewotICAgICAgICByZXR1cm4gKGNoYXIgKikgTlVMTDsKLSAgICB9Ci0gICAgd2hpbGUgKChjaCA9ICpzdHJpbmcrKykpIHsKLSAgICAgICAgaWYgKCFhcF9pc3NwYWNlKGNoKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGNoID09ICdcMCcpIHsKLSAgICAgICAgcmV0dXJuIChjaGFyICopIE5VTEw7Ci0gICAgfQotCi0gICAgdG9rZW4tPnR5cGUgPSB0b2tlbl9zdHJpbmc7IC8qIHRoZSBkZWZhdWx0IHR5cGUgKi8KLSAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgY2FzZSAnKCc6Ci0gICAgICAgIHRva2VuLT50eXBlID0gdG9rZW5fbGJyYWNlOwotICAgICAgICByZXR1cm4gKHN0cmluZyk7Ci0gICAgY2FzZSAnKSc6Ci0gICAgICAgIHRva2VuLT50eXBlID0gdG9rZW5fcmJyYWNlOwotICAgICAgICByZXR1cm4gKHN0cmluZyk7Ci0gICAgY2FzZSAnPSc6Ci0gICAgICAgIHRva2VuLT50eXBlID0gdG9rZW5fZXE7Ci0gICAgICAgIHJldHVybiAoc3RyaW5nKTsKLSAgICBjYXNlICchJzoKLSAgICAgICAgaWYgKCpzdHJpbmcgPT0gJz0nKSB7Ci0gICAgICAgICAgICB0b2tlbi0+dHlwZSA9IHRva2VuX25lOwotICAgICAgICAgICAgcmV0dXJuIChzdHJpbmcgKyAxKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRva2VuLT50eXBlID0gdG9rZW5fbm90OwotICAgICAgICAgICAgcmV0dXJuIChzdHJpbmcpOwotICAgICAgICB9Ci0gICAgY2FzZSAnXCcnOgotICAgICAgICB0b2tlbi0+dHlwZSA9IHRva2VuX3N0cmluZzsKLSAgICAgICAgcXMgPSAxOwotICAgICAgICBicmVhazsKLSAgICBjYXNlICd8JzoKLSAgICAgICAgaWYgKCpzdHJpbmcgPT0gJ3wnKSB7Ci0gICAgICAgICAgICB0b2tlbi0+dHlwZSA9IHRva2VuX29yOwotICAgICAgICAgICAgcmV0dXJuIChzdHJpbmcgKyAxKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlICcmJzoKLSAgICAgICAgaWYgKCpzdHJpbmcgPT0gJyYnKSB7Ci0gICAgICAgICAgICB0b2tlbi0+dHlwZSA9IHRva2VuX2FuZDsKLSAgICAgICAgICAgIHJldHVybiAoc3RyaW5nICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnPic6Ci0gICAgICAgIGlmICgqc3RyaW5nID09ICc9JykgewotICAgICAgICAgICAgdG9rZW4tPnR5cGUgPSB0b2tlbl9nZTsKLSAgICAgICAgICAgIHJldHVybiAoc3RyaW5nICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0b2tlbi0+dHlwZSA9IHRva2VuX2d0OwotICAgICAgICAgICAgcmV0dXJuIChzdHJpbmcpOwotICAgICAgICB9Ci0gICAgY2FzZSAnPCc6Ci0gICAgICAgIGlmICgqc3RyaW5nID09ICc9JykgewotICAgICAgICAgICAgdG9rZW4tPnR5cGUgPSB0b2tlbl9sZTsKLSAgICAgICAgICAgIHJldHVybiAoc3RyaW5nICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0b2tlbi0+dHlwZSA9IHRva2VuX2x0OwotICAgICAgICAgICAgcmV0dXJuIChzdHJpbmcpOwotICAgICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgdG9rZW4tPnR5cGUgPSB0b2tlbl9zdHJpbmc7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAvKiBXZSBzaG91bGQgb25seSBiZSBoZXJlIGlmIHdlIGFyZSBpbiBhIHN0cmluZyAqLwotICAgIGlmICghcXMpIHsKLSAgICAgICAgdG9rZW4tPnZhbHVlW25leHQrK10gPSBjaDsKLSAgICB9Ci0KLSAgICAvKiAKLSAgICAgKiBZZXMgSSBrbm93IHRoYXQgZ290bydzIGFyZSBCQUQuICBCdXQsIGMgZG9lc24ndCBhbGxvdyBtZSB0bwotICAgICAqIGV4aXQgYSBsb29wIGZyb20gYSBzd2l0Y2ggc3RhdGVtZW50LiAgWWVzLCBJIGNvdWxkIHVzZSBhIGZsYWcsCi0gICAgICogYnV0IHRoYXQgaXMgKElNSE8pIGV2ZW4gbGVzcyByZWFkYWJsZS9tYWludGFpbmFibGUgdGhhbiB0aGUgZ290by4KLSAgICAgKi8KLSAgICAvKiAKLSAgICAgKiBJIHVzZWQgdGhlICsrc3RyaW5nIHRocm91Z2hvdXQgdGhpcyBzZWN0aW9uIHNvIHRoYXQgc3RyaW5nCi0gICAgICogZW5kcyB1cCBwb2ludGluZyB0byB0aGUgbmV4dCB0b2tlbiBhbmQgSSBjYW4ganVzdCByZXR1cm4gaXQKLSAgICAgKi8KLSAgICBmb3IgKGNoID0gKnN0cmluZzsgY2ggIT0gJ1wwJzsgY2ggPSAqKytzdHJpbmcpIHsKLSAgICAgICAgaWYgKGNoID09ICdcXCcpIHsKLSAgICAgICAgICAgIGlmICgoY2ggPSAqKytzdHJpbmcpID09ICdcMCcpIHsKLSAgICAgICAgICAgICAgICBnb3RvIFRPS0VOX0RPTkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0b2tlbi0+dmFsdWVbbmV4dCsrXSA9IGNoOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFxcykgewotICAgICAgICAgICAgaWYgKGFwX2lzc3BhY2UoY2gpKSB7Ci0gICAgICAgICAgICAgICAgZ290byBUT0tFTl9ET05FOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICAgICAgY2FzZSAnKCc6Ci0gICAgICAgICAgICAgICAgZ290byBUT0tFTl9ET05FOwotICAgICAgICAgICAgY2FzZSAnKSc6Ci0gICAgICAgICAgICAgICAgZ290byBUT0tFTl9ET05FOwotICAgICAgICAgICAgY2FzZSAnPSc6Ci0gICAgICAgICAgICAgICAgZ290byBUT0tFTl9ET05FOwotICAgICAgICAgICAgY2FzZSAnISc6Ci0gICAgICAgICAgICAgICAgZ290byBUT0tFTl9ET05FOwotICAgICAgICAgICAgY2FzZSAnfCc6Ci0gICAgICAgICAgICAgICAgaWYgKCooc3RyaW5nICsgMSkgPT0gJ3wnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gVE9LRU5fRE9ORTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICcmJzoKLSAgICAgICAgICAgICAgICBpZiAoKihzdHJpbmcgKyAxKSA9PSAnJicpIHsKLSAgICAgICAgICAgICAgICAgICAgZ290byBUT0tFTl9ET05FOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJzwnOgotICAgICAgICAgICAgICAgIGdvdG8gVE9LRU5fRE9ORTsKLSAgICAgICAgICAgIGNhc2UgJz4nOgotICAgICAgICAgICAgICAgIGdvdG8gVE9LRU5fRE9ORTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRva2VuLT52YWx1ZVtuZXh0KytdID0gY2g7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoY2ggPT0gJ1wnJykgewotICAgICAgICAgICAgICAgIHFzID0gMDsKLSAgICAgICAgICAgICAgICArK3N0cmluZzsKLSAgICAgICAgICAgICAgICBnb3RvIFRPS0VOX0RPTkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0b2tlbi0+dmFsdWVbbmV4dCsrXSA9IGNoOwotICAgICAgICB9Ci0gICAgfQotICBUT0tFTl9ET05FOgotICAgIC8qIElmIHFzIGlzIHN0aWxsIHNldCwgSSBoYXZlIGFuIHVubWF0Y2hlZCAnICovCi0gICAgaWYgKHFzKSB7Ci0gICAgICAgIGFwX3JwdXRzKCJcblVubWF0Y2hlZCAnXG4iLCByKTsKLSAgICAgICAgbmV4dCA9IDA7Ci0gICAgfQotICAgIHRva2VuLT52YWx1ZVtuZXh0XSA9ICdcMCc7Ci0gICAgcmV0dXJuIChzdHJpbmcpOwotfQotCi0KLS8qCi0gKiBIZXkgSSBzdGlsbCBrbm93IHRoYXQgZ290bydzIGFyZSBCQUQuICBJIGRvbid0IHRoaW5rIHRoYXQgSSd2ZSBldmVyCi0gKiB1c2VkIHR3byBpbiB0aGUgc2FtZSBwcm9qZWN0LCBsZXQgYWxvbmUgdGhlIHNhbWUgZmlsZSBiZWZvcmUuICBCdXQsCi0gKiBJIGFic29sdXRlbHkgd2FudCB0byBtYWtlIHN1cmUgdGhhdCBJIGNsZWFuIHVwIHRoZSBtZW1vcnkgaW4gYWxsCi0gKiBjYXNlcy4gIEFuZCwgd2l0aG91dCByZXdyaXRpbmcgdGhpcyBjb21wbGV0ZWx5LCB0aGUgZWFzaWVzdCB3YXkKLSAqIGlzIHRvIGp1c3QgYnJhbmNoIHRvIHRoZSByZXR1cm4gY29kZSB3aGljaCBjbGVhbnMgaXQgdXAuCi0gKi8KLS8qIHRoZXJlIGlzIGFuIGltcGxpY2l0IGFzc3VtcHRpb24gaGVyZSB0aGF0IGV4cHIgaXMgYXQgbW9zdCBNQVhfU1RSSU5HX0xFTi0xCi0gKiBjaGFyYWN0ZXJzIGxvbmcuLi4KLSAqLwotc3RhdGljIGludCBwYXJzZV9leHByKHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICpleHByLCBjb25zdCBjaGFyICplcnJvcikKLXsKLSAgICBzdHJ1Y3QgcGFyc2Vfbm9kZSB7Ci0gICAgICAgIHN0cnVjdCBwYXJzZV9ub2RlICpsZWZ0LCAqcmlnaHQsICpwYXJlbnQ7Ci0gICAgICAgIHN0cnVjdCB0b2tlbiB0b2tlbjsKLSAgICAgICAgaW50IHZhbHVlLCBkb25lOwotICAgIH0gICAgICAgICAqcm9vdCwgKmN1cnJlbnQsICpuZXc7Ci0gICAgY29uc3QgY2hhciAqcGFyc2U7Ci0gICAgY2hhciBidWZmZXJbTUFYX1NUUklOR19MRU5dOwotICAgIHBvb2wgKmV4cHJfcG9vbDsKLSAgICBpbnQgcmV0dmFsID0gMDsKLQotICAgIGlmICgocGFyc2UgPSBleHByKSA9PSAoY2hhciAqKSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAoMCk7Ci0gICAgfQotICAgIHJvb3QgPSBjdXJyZW50ID0gKHN0cnVjdCBwYXJzZV9ub2RlICopIE5VTEw7Ci0gICAgZXhwcl9wb29sID0gYXBfbWFrZV9zdWJfcG9vbChyLT5wb29sKTsKLQotICAgIC8qIENyZWF0ZSBQYXJzZSBUcmVlICovCi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgbmV3ID0gKHN0cnVjdCBwYXJzZV9ub2RlICopIGFwX3BhbGxvYyhleHByX3Bvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBwYXJzZV9ub2RlKSk7Ci0gICAgICAgIG5ldy0+cGFyZW50ID0gbmV3LT5sZWZ0ID0gbmV3LT5yaWdodCA9IChzdHJ1Y3QgcGFyc2Vfbm9kZSAqKSBOVUxMOwotICAgICAgICBuZXctPmRvbmUgPSAwOwotICAgICAgICBpZiAoKHBhcnNlID0gZ2V0X3B0b2tlbihyLCBwYXJzZSwgJm5ldy0+dG9rZW4pKSA9PSAoY2hhciAqKSBOVUxMKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKG5ldy0+dG9rZW4udHlwZSkgewotCi0gICAgICAgIGNhc2UgdG9rZW5fc3RyaW5nOgotI2lmZGVmIERFQlVHX0lOQ0xVREUKLSAgICAgICAgICAgIGFwX3J2cHV0cyhyLCAiICAgICBUb2tlbjogc3RyaW5nICgiLCBuZXctPnRva2VuLnZhbHVlLCAiKVxuIiwgTlVMTCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmIChjdXJyZW50ID09IChzdHJ1Y3QgcGFyc2Vfbm9kZSAqKSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcm9vdCA9IGN1cnJlbnQgPSBuZXc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGN1cnJlbnQtPnRva2VuLnR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgdG9rZW5fc3RyaW5nOgotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LT50b2tlbi52YWx1ZVswXSAhPSAnXDAnKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cm5jYXQoY3VycmVudC0+dG9rZW4udmFsdWUsICIgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY3VycmVudC0+dG9rZW4udmFsdWUpCi0JCQkgICAgLSBzdHJsZW4oY3VycmVudC0+dG9rZW4udmFsdWUpIC0gMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0cm5jYXQoY3VycmVudC0+dG9rZW4udmFsdWUsIG5ldy0+dG9rZW4udmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGN1cnJlbnQtPnRva2VuLnZhbHVlKQotCQkJICAgIC0gc3RybGVuKGN1cnJlbnQtPnRva2VuLnZhbHVlKSAtIDEpOwotCQljdXJyZW50LT50b2tlbi52YWx1ZVtzaXplb2YoY3VycmVudC0+dG9rZW4udmFsdWUpIC0gMV0gPSAnXDAnOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSB0b2tlbl9lcToKLSAgICAgICAgICAgIGNhc2UgdG9rZW5fbmU6Ci0gICAgICAgICAgICBjYXNlIHRva2VuX2FuZDoKLSAgICAgICAgICAgIGNhc2UgdG9rZW5fb3I6Ci0gICAgICAgICAgICBjYXNlIHRva2VuX2xicmFjZToKLSAgICAgICAgICAgIGNhc2UgdG9rZW5fbm90OgotICAgICAgICAgICAgY2FzZSB0b2tlbl9nZToKLSAgICAgICAgICAgIGNhc2UgdG9rZW5fZ3Q6Ci0gICAgICAgICAgICBjYXNlIHRva2VuX2xlOgotICAgICAgICAgICAgY2FzZSB0b2tlbl9sdDoKLSAgICAgICAgICAgICAgICBuZXctPnBhcmVudCA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPnJpZ2h0ID0gbmV3OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGV4cHJlc3Npb24gXCIlc1wiIGluIGZpbGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICBhcF9ycHV0cyhlcnJvciwgcik7Ci0gICAgICAgICAgICAgICAgZ290byBSRVRVUk47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHRva2VuX2FuZDoKLSAgICAgICAgY2FzZSB0b2tlbl9vcjoKLSNpZmRlZiBERUJVR19JTkNMVURFCi0gICAgICAgICAgICBhcF9ycHV0cygiICAgICBUb2tlbjogYW5kL29yXG4iLCByKTsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT0gKHN0cnVjdCBwYXJzZV9ub2RlICopIE5VTEwpIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGV4cHJlc3Npb24gXCIlc1wiIGluIGZpbGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICBhcF9ycHV0cyhlcnJvciwgcik7Ci0gICAgICAgICAgICAgICAgZ290byBSRVRVUk47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBQZXJjb2xhdGUgdXB3YXJkcyAqLwotICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT0gKHN0cnVjdCBwYXJzZV9ub2RlICopIE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGN1cnJlbnQtPnRva2VuLnR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX3N0cmluZzoKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX2dyb3VwOgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fbm90OgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fZXE6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9uZToKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX2FuZDoKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX29yOgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fZ2U6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9ndDoKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX2xlOgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fbHQ6Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5wYXJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fbGJyYWNlOgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBleHByZXNzaW9uIFwiJXNcIiBpbiBmaWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciwgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cyhlcnJvciwgcik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gUkVUVVJOOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjdXJyZW50ID09IChzdHJ1Y3QgcGFyc2Vfbm9kZSAqKSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbmV3LT5sZWZ0ID0gcm9vdDsKLSAgICAgICAgICAgICAgICBuZXctPmxlZnQtPnBhcmVudCA9IG5ldzsKLSAgICAgICAgICAgICAgICBuZXctPnBhcmVudCA9IChzdHJ1Y3QgcGFyc2Vfbm9kZSAqKSBOVUxMOwotICAgICAgICAgICAgICAgIHJvb3QgPSBuZXc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBuZXctPmxlZnQgPSBjdXJyZW50LT5yaWdodDsKLSAgICAgICAgICAgICAgICBjdXJyZW50LT5yaWdodCA9IG5ldzsKLSAgICAgICAgICAgICAgICBuZXctPnBhcmVudCA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjdXJyZW50ID0gbmV3OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSB0b2tlbl9ub3Q6Ci0jaWZkZWYgREVCVUdfSU5DTFVERQotICAgICAgICAgICAgYXBfcnB1dHMoIiAgICAgVG9rZW46IG5vdFxuIiwgcik7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmIChjdXJyZW50ID09IChzdHJ1Y3QgcGFyc2Vfbm9kZSAqKSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcm9vdCA9IGN1cnJlbnQgPSBuZXc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBQZXJjb2xhdGUgdXB3YXJkcyAqLwotICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT0gKHN0cnVjdCBwYXJzZV9ub2RlICopIE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGN1cnJlbnQtPnRva2VuLnR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX25vdDoKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX2VxOgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fbmU6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9hbmQ6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9vcjoKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX2xicmFjZToKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX2dlOgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fZ3Q6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9sZToKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX2x0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBleHByZXNzaW9uIFwiJXNcIiBpbiBmaWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciwgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cyhlcnJvciwgcik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gUkVUVVJOOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjdXJyZW50ID09IChzdHJ1Y3QgcGFyc2Vfbm9kZSAqKSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbmV3LT5sZWZ0ID0gcm9vdDsKLSAgICAgICAgICAgICAgICBuZXctPmxlZnQtPnBhcmVudCA9IG5ldzsKLSAgICAgICAgICAgICAgICBuZXctPnBhcmVudCA9IChzdHJ1Y3QgcGFyc2Vfbm9kZSAqKSBOVUxMOwotICAgICAgICAgICAgICAgIHJvb3QgPSBuZXc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBuZXctPmxlZnQgPSBjdXJyZW50LT5yaWdodDsKLSAgICAgICAgICAgICAgICBjdXJyZW50LT5yaWdodCA9IG5ldzsKLSAgICAgICAgICAgICAgICBuZXctPnBhcmVudCA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjdXJyZW50ID0gbmV3OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSB0b2tlbl9lcToKLSAgICAgICAgY2FzZSB0b2tlbl9uZToKLSAgICAgICAgY2FzZSB0b2tlbl9nZToKLSAgICAgICAgY2FzZSB0b2tlbl9ndDoKLSAgICAgICAgY2FzZSB0b2tlbl9sZToKLSAgICAgICAgY2FzZSB0b2tlbl9sdDoKLSNpZmRlZiBERUJVR19JTkNMVURFCi0gICAgICAgICAgICBhcF9ycHV0cygiICAgICBUb2tlbjogZXEvbmUvZ2UvZ3QvbGUvbHRcbiIsIHIpOwotI2VuZGlmCi0gICAgICAgICAgICBpZiAoY3VycmVudCA9PSAoc3RydWN0IHBhcnNlX25vZGUgKikgTlVMTCkgewotICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZXhwcmVzc2lvbiBcIiVzXCIgaW4gZmlsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciwgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgICAgICAgICBnb3RvIFJFVFVSTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFBlcmNvbGF0ZSB1cHdhcmRzICovCi0gICAgICAgICAgICB3aGlsZSAoY3VycmVudCAhPSAoc3RydWN0IHBhcnNlX25vZGUgKikgTlVMTCkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoY3VycmVudC0+dG9rZW4udHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fc3RyaW5nOgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fZ3JvdXA6Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5wYXJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fbGJyYWNlOgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fYW5kOgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fb3I6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fbm90OgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fZXE6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9uZToKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX2dlOgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fZ3Q6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9sZToKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX2x0OgotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGV4cHJlc3Npb24gXCIlc1wiIGluIGZpbGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBSRVRVUk47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT0gKHN0cnVjdCBwYXJzZV9ub2RlICopIE5VTEwpIHsKLSAgICAgICAgICAgICAgICBuZXctPmxlZnQgPSByb290OwotICAgICAgICAgICAgICAgIG5ldy0+bGVmdC0+cGFyZW50ID0gbmV3OwotICAgICAgICAgICAgICAgIG5ldy0+cGFyZW50ID0gKHN0cnVjdCBwYXJzZV9ub2RlICopIE5VTEw7Ci0gICAgICAgICAgICAgICAgcm9vdCA9IG5ldzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIG5ldy0+bGVmdCA9IGN1cnJlbnQtPnJpZ2h0OwotICAgICAgICAgICAgICAgIGN1cnJlbnQtPnJpZ2h0ID0gbmV3OwotICAgICAgICAgICAgICAgIG5ldy0+cGFyZW50ID0gY3VycmVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGN1cnJlbnQgPSBuZXc7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHRva2VuX3JicmFjZToKLSNpZmRlZiBERUJVR19JTkNMVURFCi0gICAgICAgICAgICBhcF9ycHV0cygiICAgICBUb2tlbjogcmJyYWNlXG4iLCByKTsKLSNlbmRpZgotICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT0gKHN0cnVjdCBwYXJzZV9ub2RlICopIE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudC0+dG9rZW4udHlwZSA9PSB0b2tlbl9sYnJhY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dG9rZW4udHlwZSA9IHRva2VuX2dyb3VwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPnBhcmVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjdXJyZW50ID09IChzdHJ1Y3QgcGFyc2Vfbm9kZSAqKSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5tYXRjaGVkICcpJyBpbiBcIiVzXCIgaW4gZmlsZSAlcyIsCi0JCQkgICAgZXhwciwgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgICAgICAgICBnb3RvIFJFVFVSTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgdG9rZW5fbGJyYWNlOgotI2lmZGVmIERFQlVHX0lOQ0xVREUKLSAgICAgICAgICAgIGFwX3JwdXRzKCIgICAgIFRva2VuOiBsYnJhY2VcbiIsIHIpOwotI2VuZGlmCi0gICAgICAgICAgICBpZiAoY3VycmVudCA9PSAoc3RydWN0IHBhcnNlX25vZGUgKikgTlVMTCkgewotICAgICAgICAgICAgICAgIHJvb3QgPSBjdXJyZW50ID0gbmV3OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUGVyY29sYXRlIHVwd2FyZHMgKi8KLSAgICAgICAgICAgIHdoaWxlIChjdXJyZW50ICE9IChzdHJ1Y3QgcGFyc2Vfbm9kZSAqKSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjdXJyZW50LT50b2tlbi50eXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9ub3Q6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9lcToKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX25lOgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fYW5kOgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fb3I6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9sYnJhY2U6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9nZToKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX2d0OgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fbGU6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9sdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9zdHJpbmc6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9ncm91cDoKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBleHByZXNzaW9uIFwiJXNcIiBpbiBmaWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciwgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cyhlcnJvciwgcik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gUkVUVVJOOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjdXJyZW50ID09IChzdHJ1Y3QgcGFyc2Vfbm9kZSAqKSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbmV3LT5sZWZ0ID0gcm9vdDsKLSAgICAgICAgICAgICAgICBuZXctPmxlZnQtPnBhcmVudCA9IG5ldzsKLSAgICAgICAgICAgICAgICBuZXctPnBhcmVudCA9IChzdHJ1Y3QgcGFyc2Vfbm9kZSAqKSBOVUxMOwotICAgICAgICAgICAgICAgIHJvb3QgPSBuZXc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBuZXctPmxlZnQgPSBjdXJyZW50LT5yaWdodDsKLSAgICAgICAgICAgICAgICBjdXJyZW50LT5yaWdodCA9IG5ldzsKLSAgICAgICAgICAgICAgICBuZXctPnBhcmVudCA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjdXJyZW50ID0gbmV3OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEV2YWx1YXRlIFBhcnNlIFRyZWUgKi8KLSAgICBjdXJyZW50ID0gcm9vdDsKLSAgICB3aGlsZSAoY3VycmVudCAhPSAoc3RydWN0IHBhcnNlX25vZGUgKikgTlVMTCkgewotICAgICAgICBzd2l0Y2ggKGN1cnJlbnQtPnRva2VuLnR5cGUpIHsKLSAgICAgICAgY2FzZSB0b2tlbl9zdHJpbmc6Ci0jaWZkZWYgREVCVUdfSU5DTFVERQotICAgICAgICAgICAgYXBfcnB1dHMoIiAgICAgRXZhbHVhdGUgc3RyaW5nXG4iLCByKTsKLSNlbmRpZgotICAgICAgICAgICAgcGFyc2Vfc3RyaW5nKHIsIGN1cnJlbnQtPnRva2VuLnZhbHVlLCBidWZmZXIsIHNpemVvZihidWZmZXIpLCAwKTsKLQkgICAgYXBfY3B5c3RybihjdXJyZW50LT50b2tlbi52YWx1ZSwgYnVmZmVyLCBzaXplb2YoY3VycmVudC0+dG9rZW4udmFsdWUpKTsKLSAgICAgICAgICAgIGN1cnJlbnQtPnZhbHVlID0gKGN1cnJlbnQtPnRva2VuLnZhbHVlWzBdICE9ICdcMCcpOwotICAgICAgICAgICAgY3VycmVudC0+ZG9uZSA9IDE7Ci0gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+cGFyZW50OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSB0b2tlbl9hbmQ6Ci0gICAgICAgIGNhc2UgdG9rZW5fb3I6Ci0jaWZkZWYgREVCVUdfSU5DTFVERQotICAgICAgICAgICAgYXBfcnB1dHMoIiAgICAgRXZhbHVhdGUgYW5kL29yXG4iLCByKTsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKGN1cnJlbnQtPmxlZnQgPT0gKHN0cnVjdCBwYXJzZV9ub2RlICopIE5VTEwgfHwKLSAgICAgICAgICAgICAgICBjdXJyZW50LT5yaWdodCA9PSAoc3RydWN0IHBhcnNlX25vZGUgKikgTlVMTCkgewotICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZXhwcmVzc2lvbiBcIiVzXCIgaW4gZmlsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciwgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgICAgICAgICBnb3RvIFJFVFVSTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghY3VycmVudC0+bGVmdC0+ZG9uZSkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoY3VycmVudC0+bGVmdC0+dG9rZW4udHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fc3RyaW5nOgotICAgICAgICAgICAgICAgICAgICBwYXJzZV9zdHJpbmcociwgY3VycmVudC0+bGVmdC0+dG9rZW4udmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHNpemVvZihidWZmZXIpLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgYXBfY3B5c3RybihjdXJyZW50LT5sZWZ0LT50b2tlbi52YWx1ZSwgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjdXJyZW50LT5sZWZ0LT50b2tlbi52YWx1ZSkpOwotCQkgICAgY3VycmVudC0+bGVmdC0+dmFsdWUgPSAoY3VycmVudC0+bGVmdC0+dG9rZW4udmFsdWVbMF0gIT0gJ1wwJyk7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPmxlZnQtPmRvbmUgPSAxOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bGVmdDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFjdXJyZW50LT5yaWdodC0+ZG9uZSkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoY3VycmVudC0+cmlnaHQtPnRva2VuLnR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX3N0cmluZzoKLSAgICAgICAgICAgICAgICAgICAgcGFyc2Vfc3RyaW5nKHIsIGN1cnJlbnQtPnJpZ2h0LT50b2tlbi52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIDApOwotICAgICAgICAgICAgICAgICAgICBhcF9jcHlzdHJuKGN1cnJlbnQtPnJpZ2h0LT50b2tlbi52YWx1ZSwgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjdXJyZW50LT5yaWdodC0+dG9rZW4udmFsdWUpKTsKLQkJICAgIGN1cnJlbnQtPnJpZ2h0LT52YWx1ZSA9IChjdXJyZW50LT5yaWdodC0+dG9rZW4udmFsdWVbMF0gIT0gJ1wwJyk7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnJpZ2h0LT5kb25lID0gMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPnJpZ2h0OwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0jaWZkZWYgREVCVUdfSU5DTFVERQotICAgICAgICAgICAgYXBfcnZwdXRzKHIsICIgICAgIExlZnQ6ICIsIGN1cnJlbnQtPmxlZnQtPnZhbHVlID8gIjEiIDogIjAiLAotICAgICAgICAgICAgICAgICAgICJcbiIsIE5VTEwpOwotICAgICAgICAgICAgYXBfcnZwdXRzKHIsICIgICAgIFJpZ2h0OiAiLCBjdXJyZW50LT5yaWdodC0+dmFsdWUgPyAiMSIgOiAiMCIsCi0gICAgICAgICAgICAgICAgICAgIlxuIiwgTlVMTCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmIChjdXJyZW50LT50b2tlbi50eXBlID09IHRva2VuX2FuZCkgewotICAgICAgICAgICAgICAgIGN1cnJlbnQtPnZhbHVlID0gY3VycmVudC0+bGVmdC0+dmFsdWUgJiYgY3VycmVudC0+cmlnaHQtPnZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudC0+dmFsdWUgPSBjdXJyZW50LT5sZWZ0LT52YWx1ZSB8fCBjdXJyZW50LT5yaWdodC0+dmFsdWU7Ci0gICAgICAgICAgICB9Ci0jaWZkZWYgREVCVUdfSU5DTFVERQotICAgICAgICAgICAgYXBfcnZwdXRzKHIsICIgICAgIFJldHVybmluZyAiLCBjdXJyZW50LT52YWx1ZSA/ICIxIiA6ICIwIiwKLSAgICAgICAgICAgICAgICAgICAiXG4iLCBOVUxMKTsKLSNlbmRpZgotICAgICAgICAgICAgY3VycmVudC0+ZG9uZSA9IDE7Ci0gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+cGFyZW50OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSB0b2tlbl9lcToKLSAgICAgICAgY2FzZSB0b2tlbl9uZToKLSNpZmRlZiBERUJVR19JTkNMVURFCi0gICAgICAgICAgICBhcF9ycHV0cygiICAgICBFdmFsdWF0ZSBlcS9uZVxuIiwgcik7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmICgoY3VycmVudC0+bGVmdCA9PSAoc3RydWN0IHBhcnNlX25vZGUgKikgTlVMTCkgfHwKLSAgICAgICAgICAgICAgICAoY3VycmVudC0+cmlnaHQgPT0gKHN0cnVjdCBwYXJzZV9ub2RlICopIE5VTEwpIHx8Ci0gICAgICAgICAgICAgICAgKGN1cnJlbnQtPmxlZnQtPnRva2VuLnR5cGUgIT0gdG9rZW5fc3RyaW5nKSB8fAotICAgICAgICAgICAgICAgIChjdXJyZW50LT5yaWdodC0+dG9rZW4udHlwZSAhPSB0b2tlbl9zdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBleHByZXNzaW9uIFwiJXNcIiBpbiBmaWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgYXBfcnB1dHMoZXJyb3IsIHIpOwotICAgICAgICAgICAgICAgIGdvdG8gUkVUVVJOOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFyc2Vfc3RyaW5nKHIsIGN1cnJlbnQtPmxlZnQtPnRva2VuLnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIDApOwotICAgICAgICAgICAgYXBfY3B5c3RybihjdXJyZW50LT5sZWZ0LT50b2tlbi52YWx1ZSwgYnVmZmVyLAotCQkJc2l6ZW9mKGN1cnJlbnQtPmxlZnQtPnRva2VuLnZhbHVlKSk7Ci0gICAgICAgICAgICBwYXJzZV9zdHJpbmcociwgY3VycmVudC0+cmlnaHQtPnRva2VuLnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIDApOwotICAgICAgICAgICAgYXBfY3B5c3RybihjdXJyZW50LT5yaWdodC0+dG9rZW4udmFsdWUsIGJ1ZmZlciwKLQkJCXNpemVvZihjdXJyZW50LT5yaWdodC0+dG9rZW4udmFsdWUpKTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50LT5yaWdodC0+dG9rZW4udmFsdWVbMF0gPT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgaW50IGxlbjsKLSAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4oY3VycmVudC0+cmlnaHQtPnRva2VuLnZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudC0+cmlnaHQtPnRva2VuLnZhbHVlW2xlbiAtIDFdID09ICcvJykgewotICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT5yaWdodC0+dG9rZW4udmFsdWVbbGVuIC0gMV0gPSAnXDAnOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgcmV4cCBcIiVzXCIgaW4gZmlsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnJpZ2h0LT50b2tlbi52YWx1ZSwgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cyhlcnJvciwgcik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gUkVUVVJOOwotICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBERUJVR19JTkNMVURFCi0gICAgICAgICAgICAgICAgYXBfcnZwdXRzKHIsICIgICAgIFJlIENvbXBhcmUgKCIsIGN1cnJlbnQtPmxlZnQtPnRva2VuLnZhbHVlLAotICAgICAgICAgICAgICAgICAgIikgd2l0aCAvIiwgJmN1cnJlbnQtPnJpZ2h0LT50b2tlbi52YWx1ZVsxXSwgIi9cbiIsIE5VTEwpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgY3VycmVudC0+dmFsdWUgPQotICAgICAgICAgICAgICAgICAgICByZV9jaGVjayhyLCBjdXJyZW50LT5sZWZ0LT50b2tlbi52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1cnJlbnQtPnJpZ2h0LT50b2tlbi52YWx1ZVsxXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSNpZmRlZiBERUJVR19JTkNMVURFCi0gICAgICAgICAgICAgICAgYXBfcnZwdXRzKHIsICIgICAgIENvbXBhcmUgKCIsIGN1cnJlbnQtPmxlZnQtPnRva2VuLnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAiKSB3aXRoICgiLCBjdXJyZW50LT5yaWdodC0+dG9rZW4udmFsdWUsICIpXG4iLCBOVUxMKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIGN1cnJlbnQtPnZhbHVlID0KLSAgICAgICAgICAgICAgICAgICAgKHN0cmNtcChjdXJyZW50LT5sZWZ0LT50b2tlbi52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT5yaWdodC0+dG9rZW4udmFsdWUpID09IDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnRva2VuLnR5cGUgPT0gdG9rZW5fbmUpIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50LT52YWx1ZSA9ICFjdXJyZW50LT52YWx1ZTsKLSAgICAgICAgICAgIH0KLSNpZmRlZiBERUJVR19JTkNMVURFCi0gICAgICAgICAgICBhcF9ydnB1dHMociwgIiAgICAgUmV0dXJuaW5nICIsIGN1cnJlbnQtPnZhbHVlID8gIjEiIDogIjAiLAotICAgICAgICAgICAgICAgICAgICJcbiIsIE5VTEwpOwotI2VuZGlmCi0gICAgICAgICAgICBjdXJyZW50LT5kb25lID0gMTsKLSAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5wYXJlbnQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0b2tlbl9nZToKLSAgICAgICAgY2FzZSB0b2tlbl9ndDoKLSAgICAgICAgY2FzZSB0b2tlbl9sZToKLSAgICAgICAgY2FzZSB0b2tlbl9sdDoKLSNpZmRlZiBERUJVR19JTkNMVURFCi0gICAgICAgICAgICBhcF9ycHV0cygiICAgICBFdmFsdWF0ZSBnZS9ndC9sZS9sdFxuIiwgcik7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmICgoY3VycmVudC0+bGVmdCA9PSAoc3RydWN0IHBhcnNlX25vZGUgKikgTlVMTCkgfHwKLSAgICAgICAgICAgICAgICAoY3VycmVudC0+cmlnaHQgPT0gKHN0cnVjdCBwYXJzZV9ub2RlICopIE5VTEwpIHx8Ci0gICAgICAgICAgICAgICAgKGN1cnJlbnQtPmxlZnQtPnRva2VuLnR5cGUgIT0gdG9rZW5fc3RyaW5nKSB8fAotICAgICAgICAgICAgICAgIChjdXJyZW50LT5yaWdodC0+dG9rZW4udHlwZSAhPSB0b2tlbl9zdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBleHByZXNzaW9uIFwiJXNcIiBpbiBmaWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgYXBfcnB1dHMoZXJyb3IsIHIpOwotICAgICAgICAgICAgICAgIGdvdG8gUkVUVVJOOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFyc2Vfc3RyaW5nKHIsIGN1cnJlbnQtPmxlZnQtPnRva2VuLnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIDApOwotICAgICAgICAgICAgYXBfY3B5c3RybihjdXJyZW50LT5sZWZ0LT50b2tlbi52YWx1ZSwgYnVmZmVyLAotCQkJc2l6ZW9mKGN1cnJlbnQtPmxlZnQtPnRva2VuLnZhbHVlKSk7Ci0gICAgICAgICAgICBwYXJzZV9zdHJpbmcociwgY3VycmVudC0+cmlnaHQtPnRva2VuLnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIDApOwotICAgICAgICAgICAgYXBfY3B5c3RybihjdXJyZW50LT5yaWdodC0+dG9rZW4udmFsdWUsIGJ1ZmZlciwKLQkJCXNpemVvZihjdXJyZW50LT5yaWdodC0+dG9rZW4udmFsdWUpKTsKLSNpZmRlZiBERUJVR19JTkNMVURFCi0gICAgICAgICAgICBhcF9ydnB1dHMociwgIiAgICAgQ29tcGFyZSAoIiwgY3VycmVudC0+bGVmdC0+dG9rZW4udmFsdWUsCi0gICAgICAgICAgICAgICAgICAgIikgd2l0aCAoIiwgY3VycmVudC0+cmlnaHQtPnRva2VuLnZhbHVlLCAiKVxuIiwgTlVMTCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGN1cnJlbnQtPnZhbHVlID0KLSAgICAgICAgICAgICAgICBzdHJjbXAoY3VycmVudC0+bGVmdC0+dG9rZW4udmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnJpZ2h0LT50b2tlbi52YWx1ZSk7Ci0gICAgICAgICAgICBpZiAoY3VycmVudC0+dG9rZW4udHlwZSA9PSB0b2tlbl9nZSkgewotICAgICAgICAgICAgICAgIGN1cnJlbnQtPnZhbHVlID0gY3VycmVudC0+dmFsdWUgPj0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnQtPnRva2VuLnR5cGUgPT0gdG9rZW5fZ3QpIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50LT52YWx1ZSA9IGN1cnJlbnQtPnZhbHVlID4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnQtPnRva2VuLnR5cGUgPT0gdG9rZW5fbGUpIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50LT52YWx1ZSA9IGN1cnJlbnQtPnZhbHVlIDw9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50LT50b2tlbi50eXBlID09IHRva2VuX2x0KSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudC0+dmFsdWUgPSBjdXJyZW50LT52YWx1ZSA8IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50LT52YWx1ZSA9IDA7ICAgICAvKiBEb24ndCByZXR1cm4gLTEgaWYgdW5rbm93biB0b2tlbiAqLwotICAgICAgICAgICAgfQotI2lmZGVmIERFQlVHX0lOQ0xVREUKLSAgICAgICAgICAgIGFwX3J2cHV0cyhyLCAiICAgICBSZXR1cm5pbmcgIiwgY3VycmVudC0+dmFsdWUgPyAiMSIgOiAiMCIsCi0gICAgICAgICAgICAgICAgICAgIlxuIiwgTlVMTCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGN1cnJlbnQtPmRvbmUgPSAxOwotICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPnBhcmVudDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgdG9rZW5fbm90OgotICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnJpZ2h0ICE9IChzdHJ1Y3QgcGFyc2Vfbm9kZSAqKSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50LT5yaWdodC0+ZG9uZSkgewotICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+cmlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjdXJyZW50LT52YWx1ZSA9ICFjdXJyZW50LT5yaWdodC0+dmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50LT52YWx1ZSA9IDA7Ci0gICAgICAgICAgICB9Ci0jaWZkZWYgREVCVUdfSU5DTFVERQotICAgICAgICAgICAgYXBfcnZwdXRzKHIsICIgICAgIEV2YWx1YXRlICE6ICIsIGN1cnJlbnQtPnZhbHVlID8gIjEiIDogIjAiLAotICAgICAgICAgICAgICAgICAgICJcbiIsIE5VTEwpOwotI2VuZGlmCi0gICAgICAgICAgICBjdXJyZW50LT5kb25lID0gMTsKLSAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5wYXJlbnQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHRva2VuX2dyb3VwOgotICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnJpZ2h0ICE9IChzdHJ1Y3QgcGFyc2Vfbm9kZSAqKSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50LT5yaWdodC0+ZG9uZSkgewotICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+cmlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjdXJyZW50LT52YWx1ZSA9IGN1cnJlbnQtPnJpZ2h0LT52YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGN1cnJlbnQtPnZhbHVlID0gMTsKLSAgICAgICAgICAgIH0KLSNpZmRlZiBERUJVR19JTkNMVURFCi0gICAgICAgICAgICBhcF9ydnB1dHMociwgIiAgICAgRXZhbHVhdGUgKCk6ICIsIGN1cnJlbnQtPnZhbHVlID8gIjEiIDogIjAiLAotICAgICAgICAgICAgICAgICAgICJcbiIsIE5VTEwpOwotI2VuZGlmCi0gICAgICAgICAgICBjdXJyZW50LT5kb25lID0gMTsKLSAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5wYXJlbnQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHRva2VuX2xicmFjZToKLSAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiVW5tYXRjaGVkICcoJyBpbiBcIiVzXCIgaW4gZmlsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBleHByLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICBhcF9ycHV0cyhlcnJvciwgcik7Ci0gICAgICAgICAgICBnb3RvIFJFVFVSTjsKLQotICAgICAgICBjYXNlIHRva2VuX3JicmFjZToKLSAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiVW5tYXRjaGVkICcpJyBpbiBcIiVzXCIgaW4gZmlsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBleHByLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICBhcF9ycHV0cyhlcnJvciwgcik7Ci0gICAgICAgICAgICBnb3RvIFJFVFVSTjsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLQkJCSJiYWQgdG9rZW4gdHlwZSIpOwotICAgICAgICAgICAgYXBfcnB1dHMoZXJyb3IsIHIpOwotICAgICAgICAgICAgZ290byBSRVRVUk47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR2YWwgPSAocm9vdCA9PSAoc3RydWN0IHBhcnNlX25vZGUgKikgTlVMTCkgPyAwIDogcm9vdC0+dmFsdWU7Ci0gIFJFVFVSTjoKLSAgICBhcF9kZXN0cm95X3Bvb2woZXhwcl9wb29sKTsKLSAgICByZXR1cm4gKHJldHZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQgaGFuZGxlX2lmKEZJTEUgKmluLCByZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgKmNvbmRpdGlvbmFsX3N0YXR1cywgaW50ICpwcmludGluZykKLXsKLSAgICBjaGFyIHRhZ1tNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciAqdGFnX3ZhbDsKLSAgICBjaGFyICpleHByOwotCi0gICAgZXhwciA9IE5VTEw7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgdGFnX3ZhbCA9IGdldF90YWcoci0+cG9vbCwgaW4sIHRhZywgc2l6ZW9mKHRhZyksIDApOwotICAgICAgICBpZiAoKnRhZyA9PSAnXDAnKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghc3RyY21wKHRhZywgImRvbmUiKSkgewotCSAgICBpZiAoZXhwciA9PSBOVUxMKSB7Ci0JCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0JCQkgICAgIm1pc3NpbmcgZXhwciBpbiBpZiBzdGF0ZW1lbnQ6ICVzIiwKLQkJCSAgICByLT5maWxlbmFtZSk7Ci0JCWFwX3JwdXRzKGVycm9yLCByKTsKLQkJcmV0dXJuIDE7Ci0JICAgIH0KLSAgICAgICAgICAgICpwcmludGluZyA9ICpjb25kaXRpb25hbF9zdGF0dXMgPSBwYXJzZV9leHByKHIsIGV4cHIsIGVycm9yKTsKLSNpZmRlZiBERUJVR19JTkNMVURFCi0gICAgICAgICAgICBhcF9ydnB1dHMociwgIioqKiogaWYgY29uZGl0aW9uYWxfc3RhdHVzPVwiIiwKLSAgICAgICAgICAgICAgICAgICAqY29uZGl0aW9uYWxfc3RhdHVzID8gIjEiIDogIjAiLCAiXCJcbiIsIE5VTEwpOwotI2VuZGlmCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghc3RyY21wKHRhZywgImV4cHIiKSkgewotICAgICAgICAgICAgZXhwciA9IHRhZ192YWw7Ci0jaWZkZWYgREVCVUdfSU5DTFVERQotICAgICAgICAgICAgYXBfcnZwdXRzKHIsICIqKioqIGlmIGV4cHI9XCIiLCBleHByLCAiXCJcbiIsIE5VTEwpOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gcGFyYW1ldGVyIFwiJXNcIiB0byB0YWcgaWYgaW4gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgdGFnLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICBhcF9ycHV0cyhlcnJvciwgcik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgaGFuZGxlX2VsaWYoRklMRSAqaW4sIHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICplcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb25kaXRpb25hbF9zdGF0dXMsIGludCAqcHJpbnRpbmcpCi17Ci0gICAgY2hhciB0YWdbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgKnRhZ192YWw7Ci0gICAgY2hhciAqZXhwcjsKLQotICAgIGV4cHIgPSBOVUxMOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIHRhZ192YWwgPSBnZXRfdGFnKHItPnBvb2wsIGluLCB0YWcsIHNpemVvZih0YWcpLCAwKTsKLSAgICAgICAgaWYgKCp0YWcgPT0gJ1wwJykgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCh0YWcsICJkb25lIikpIHsKLSNpZmRlZiBERUJVR19JTkNMVURFCi0gICAgICAgICAgICBhcF9ydnB1dHMociwgIioqKiogZWxpZiBjb25kaXRpb25hbF9zdGF0dXM9XCIiLAotICAgICAgICAgICAgICAgICAgICpjb25kaXRpb25hbF9zdGF0dXMgPyAiMSIgOiAiMCIsICJcIlxuIiwgTlVMTCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmICgqY29uZGl0aW9uYWxfc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgKnByaW50aW5nID0gMDsKLSAgICAgICAgICAgICAgICByZXR1cm4gKDApOwotICAgICAgICAgICAgfQotCSAgICBpZiAoZXhwciA9PSBOVUxMKSB7Ci0JCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0JCQkgICAgIm1pc3NpbmcgZXhwciBpbiBlbGlmIHN0YXRlbWVudDogJXMiLAotCQkJICAgIHItPmZpbGVuYW1lKTsKLQkJYXBfcnB1dHMoZXJyb3IsIHIpOwotCQlyZXR1cm4gMTsKLQkgICAgfQotICAgICAgICAgICAgKnByaW50aW5nID0gKmNvbmRpdGlvbmFsX3N0YXR1cyA9IHBhcnNlX2V4cHIociwgZXhwciwgZXJyb3IpOwotI2lmZGVmIERFQlVHX0lOQ0xVREUKLSAgICAgICAgICAgIGFwX3J2cHV0cyhyLCAiKioqKiBlbGlmIGNvbmRpdGlvbmFsX3N0YXR1cz1cIiIsCi0gICAgICAgICAgICAgICAgICAgKmNvbmRpdGlvbmFsX3N0YXR1cyA/ICIxIiA6ICIwIiwgIlwiXG4iLCBOVUxMKTsKLSNlbmRpZgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCh0YWcsICJleHByIikpIHsKLSAgICAgICAgICAgIGV4cHIgPSB0YWdfdmFsOwotI2lmZGVmIERFQlVHX0lOQ0xVREUKLSAgICAgICAgICAgIGFwX3J2cHV0cyhyLCAiKioqKiBpZiBleHByPVwiIiwgZXhwciwgIlwiXG4iLCBOVUxMKTsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHBhcmFtZXRlciBcIiVzXCIgdG8gdGFnIGlmIGluICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhZywgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgYXBfcnB1dHMoZXJyb3IsIHIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IGhhbmRsZV9lbHNlKEZJTEUgKmluLCByZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCAqY29uZGl0aW9uYWxfc3RhdHVzLCBpbnQgKnByaW50aW5nKQotewotICAgIGNoYXIgdGFnW01BWF9TVFJJTkdfTEVOXTsKLQotICAgIGlmICghZ2V0X3RhZyhyLT5wb29sLCBpbiwgdGFnLCBzaXplb2YodGFnKSwgMSkpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAodGFnLCAiZG9uZSIpKSB7Ci0jaWZkZWYgREVCVUdfSU5DTFVERQotICAgICAgICBhcF9ydnB1dHMociwgIioqKiogZWxzZSBjb25kaXRpb25hbF9zdGF0dXM9XCIiLAotICAgICAgICAgICAgICAgKmNvbmRpdGlvbmFsX3N0YXR1cyA/ICIxIiA6ICIwIiwgIlwiXG4iLCBOVUxMKTsKLSNlbmRpZgotICAgICAgICAqcHJpbnRpbmcgPSAhKCpjb25kaXRpb25hbF9zdGF0dXMpOwotICAgICAgICAqY29uZGl0aW9uYWxfc3RhdHVzID0gMTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAiZWxzZSBkaXJlY3RpdmUgZG9lcyBub3QgdGFrZSB0YWdzIGluICVzIiwKLQkJICAgIHItPmZpbGVuYW1lKTsKLSAgICAgICAgaWYgKCpwcmludGluZykgewotICAgICAgICAgICAgYXBfcnB1dHMoZXJyb3IsIHIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgaGFuZGxlX2VuZGlmKEZJTEUgKmluLCByZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmNvbmRpdGlvbmFsX3N0YXR1cywgaW50ICpwcmludGluZykKLXsKLSAgICBjaGFyIHRhZ1tNQVhfU1RSSU5HX0xFTl07Ci0KLSAgICBpZiAoIWdldF90YWcoci0+cG9vbCwgaW4sIHRhZywgc2l6ZW9mKHRhZyksIDEpKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKHRhZywgImRvbmUiKSkgewotI2lmZGVmIERFQlVHX0lOQ0xVREUKLSAgICAgICAgYXBfcnZwdXRzKHIsICIqKioqIGVuZGlmIGNvbmRpdGlvbmFsX3N0YXR1cz1cIiIsCi0gICAgICAgICAgICAgICAqY29uZGl0aW9uYWxfc3RhdHVzID8gIjEiIDogIjAiLCAiXCJcbiIsIE5VTEwpOwotI2VuZGlmCi0gICAgICAgICpwcmludGluZyA9IDE7Ci0gICAgICAgICpjb25kaXRpb25hbF9zdGF0dXMgPSAxOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0gICAgICAgICAgICAgICAgICAgICJlbmRpZiBkaXJlY3RpdmUgZG9lcyBub3QgdGFrZSB0YWdzIGluICVzIiwKLQkJICAgIHItPmZpbGVuYW1lKTsKLSAgICAgICAgYXBfcnB1dHMoZXJyb3IsIHIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IGhhbmRsZV9zZXQoRklMRSAqaW4sIHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICplcnJvcikKLXsKLSAgICBjaGFyIHRhZ1tNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciBwYXJzZWRfc3RyaW5nW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjaGFyICp0YWdfdmFsOwotICAgIGNoYXIgKnZhcjsKLQotICAgIHZhciA9IChjaGFyICopIE5VTEw7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKCEodGFnX3ZhbCA9IGdldF90YWcoci0+cG9vbCwgaW4sIHRhZywgc2l6ZW9mKHRhZyksIDEpKSkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCh0YWcsICJkb25lIikpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJjbXAodGFnLCAidmFyIikpIHsKLSAgICAgICAgICAgIHZhciA9IHRhZ192YWw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCh0YWcsICJ2YWx1ZSIpKSB7Ci0gICAgICAgICAgICBpZiAodmFyID09IChjaGFyICopIE5VTEwpIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YXJpYWJsZSBtdXN0IHByZWNlZGUgdmFsdWUgaW4gc2V0IGRpcmVjdGl2ZSBpbiAlcyIsCi0JCQkgICAgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJzZV9zdHJpbmcociwgdGFnX3ZhbCwgcGFyc2VkX3N0cmluZywgc2l6ZW9mKHBhcnNlZF9zdHJpbmcpLCAwKTsKLSAgICAgICAgICAgIGFwX3RhYmxlX3NldG4oci0+c3VicHJvY2Vzc19lbnYsIHZhciwgYXBfcHN0cmR1cChyLT5wb29sLCBwYXJzZWRfc3RyaW5nKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgdGFnIGZvciBzZXQgZGlyZWN0aXZlIGluICVzIiwgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgYXBfcnB1dHMoZXJyb3IsIHIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IGhhbmRsZV9wcmludGVudihGSUxFICppbiwgcmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKmVycm9yKQotewotICAgIGNoYXIgdGFnW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjaGFyICp0YWdfdmFsOwotICAgIGFycmF5X2hlYWRlciAqYXJyID0gYXBfdGFibGVfZWx0cyhyLT5zdWJwcm9jZXNzX2Vudik7Ci0gICAgdGFibGVfZW50cnkgKmVsdHMgPSAodGFibGVfZW50cnkgKikgYXJyLT5lbHRzOwotICAgIGludCBpOwotCi0gICAgaWYgKCEodGFnX3ZhbCA9IGdldF90YWcoci0+cG9vbCwgaW4sIHRhZywgc2l6ZW9mKHRhZyksIDEpKSkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcCh0YWcsICJkb25lIikpIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyci0+bmVsdHM7ICsraSkgewotICAgICAgICAgICAgYXBfcnZwdXRzKHIsIGVsdHNbaV0ua2V5LCAiPSIsIGVsdHNbaV0udmFsLCAiXG4iLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0gICAgICAgICAgICAgICAgICAgICJwcmludGVudiBkaXJlY3RpdmUgZG9lcyBub3QgdGFrZSB0YWdzIGluICVzIiwKLQkJICAgIHItPmZpbGVuYW1lKTsKLSAgICAgICAgYXBfcnB1dHMoZXJyb3IsIHIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGhlIG1haW4gZnVuY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIFRoaXMgaXMgYSBzdHViIHdoaWNoIHBhcnNlcyBhIGZpbGUgZGVzY3JpcHRvci4gKi8KLQotc3RhdGljIHZvaWQgc2VuZF9wYXJzZWRfY29udGVudChGSUxFICpmLCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjaGFyIGRpcmVjdGl2ZVtNQVhfU1RSSU5HX0xFTl0sIGVycm9yW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjaGFyIHRpbWVmbXRbTUFYX1NUUklOR19MRU5dOwotICAgIGludCBub2V4ZWMgPSBhcF9hbGxvd19vcHRpb25zKHIpICYgT1BUX0lOQ05PRVhFQzsKLSAgICBpbnQgcmV0LCBzaXplZm10OwotICAgIGludCBpZl9uZXN0aW5nOwotICAgIGludCBwcmludGluZzsKLSAgICBpbnQgY29uZGl0aW9uYWxfc3RhdHVzOwotCi0gICAgYXBfY3B5c3RybihlcnJvciwgREVGQVVMVF9FUlJPUl9NU0csIHNpemVvZihlcnJvcikpOwotICAgIGFwX2NweXN0cm4odGltZWZtdCwgREVGQVVMVF9USU1FX0ZPUk1BVCwgc2l6ZW9mKHRpbWVmbXQpKTsKLSAgICBzaXplZm10ID0gU0laRUZNVF9LTUc7Ci0KLS8qICBUdXJuIHByaW50aW5nIG9uICovCi0gICAgcHJpbnRpbmcgPSBjb25kaXRpb25hbF9zdGF0dXMgPSAxOwotICAgIGlmX25lc3RpbmcgPSAwOwotCi0jaWZuZGVmIFdJTjMyCi0gICAgYXBfY2hkaXJfZmlsZShyLT5maWxlbmFtZSk7Ci0jZW5kaWYKLSAgICBpZiAoci0+YXJncykgeyAgICAgICAgICAgICAgLyogYWRkIFFVRVJZIHN0dWZmIHRvIGVudiBjYXVzZSBpdCBhaW4ndCB5ZXQgKi8KLSAgICAgICAgY2hhciAqYXJnX2NvcHkgPSBhcF9wc3RyZHVwKHItPnBvb2wsIHItPmFyZ3MpOwotCi0gICAgICAgIGFwX3RhYmxlX3NldG4oci0+c3VicHJvY2Vzc19lbnYsICJRVUVSWV9TVFJJTkciLCByLT5hcmdzKTsKLSAgICAgICAgYXBfdW5lc2NhcGVfdXJsKGFyZ19jb3B5KTsKLSAgICAgICAgYXBfdGFibGVfc2V0bihyLT5zdWJwcm9jZXNzX2VudiwgIlFVRVJZX1NUUklOR19VTkVTQ0FQRUQiLAotICAgICAgICAgICAgICAgICAgYXBfZXNjYXBlX3NoZWxsX2NtZChyLT5wb29sLCBhcmdfY29weSkpOwotICAgIH0KLQotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmICghZmluZF9zdHJpbmcoZiwgU1RBUlRJTkdfU0VRVUVOQ0UsIHIsIHByaW50aW5nKSkgewotICAgICAgICAgICAgaWYgKGdldF9kaXJlY3RpdmUoZiwgZGlyZWN0aXZlLCBzaXplb2YoZGlyZWN0aXZlKSwgci0+cG9vbCkpIHsKLQkJYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLQkJCSAgICAibW9kX2luY2x1ZGU6IGVycm9yIHJlYWRpbmcgZGlyZWN0aXZlIGluICVzIiwKLQkJCSAgICByLT5maWxlbmFtZSk7Ci0JCWFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChkaXJlY3RpdmUsICJpZiIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFwcmludGluZykgewotICAgICAgICAgICAgICAgICAgICBpZl9uZXN0aW5nKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVfaWYoZiwgciwgZXJyb3IsICZjb25kaXRpb25hbF9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJpbnRpbmcpOwotICAgICAgICAgICAgICAgICAgICBpZl9uZXN0aW5nID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGRpcmVjdGl2ZSwgImVsc2UiKSkgewotICAgICAgICAgICAgICAgIGlmICghaWZfbmVzdGluZykgewotICAgICAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVfZWxzZShmLCByLCBlcnJvciwgJmNvbmRpdGlvbmFsX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByaW50aW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGRpcmVjdGl2ZSwgImVsaWYiKSkgewotICAgICAgICAgICAgICAgIGlmICghaWZfbmVzdGluZykgewotICAgICAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVfZWxpZihmLCByLCBlcnJvciwgJmNvbmRpdGlvbmFsX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByaW50aW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGRpcmVjdGl2ZSwgImVuZGlmIikpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlmX25lc3RpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlX2VuZGlmKGYsIHIsIGVycm9yLCAmY29uZGl0aW9uYWxfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByaW50aW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmX25lc3RpbmctLTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXByaW50aW5nKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChkaXJlY3RpdmUsICJleGVjIikpIHsKLSAgICAgICAgICAgICAgICBpZiAobm9leGVjKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0JCQkJICAiZXhlYyB1c2VkIGJ1dCBub3QgYWxsb3dlZCBpbiAlcyIsCi0JCQkJICByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcmludGluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoZXJyb3IsIHIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IGZpbmRfc3RyaW5nKGYsIEVORElOR19TRVFVRU5DRSwgciwgMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVfZXhlYyhmLCByLCBlcnJvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChkaXJlY3RpdmUsICJjb25maWciKSkgewotICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZV9jb25maWcoZiwgciwgZXJyb3IsIHRpbWVmbXQsICZzaXplZm10KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZGlyZWN0aXZlLCAic2V0IikpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVfc2V0KGYsIHIsIGVycm9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZGlyZWN0aXZlLCAiaW5jbHVkZSIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlX2luY2x1ZGUoZiwgciwgZXJyb3IsIG5vZXhlYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGRpcmVjdGl2ZSwgImVjaG8iKSkgewotICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZV9lY2hvKGYsIHIsIGVycm9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZGlyZWN0aXZlLCAiZnNpemUiKSkgewotICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZV9mc2l6ZShmLCByLCBlcnJvciwgc2l6ZWZtdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGRpcmVjdGl2ZSwgImZsYXN0bW9kIikpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVfZmxhc3Rtb2QoZiwgciwgZXJyb3IsIHRpbWVmbXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChkaXJlY3RpdmUsICJwcmludGVudiIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlX3ByaW50ZW52KGYsIHIsIGVycm9yKTsKLSAgICAgICAgICAgIH0KLSNpZmRlZiBVU0VfUEVSTF9TU0kKLSAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZGlyZWN0aXZlLCAicGVybCIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlX3BlcmwoZiwgciwgZXJyb3IpOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotCQkJICAgICAgInVua25vd24gZGlyZWN0aXZlIFwiJXNcIiAiCi0JCQkgICAgICAiaW4gcGFyc2VkIGRvYyAlcyIsCi0JCQkgICAgICBkaXJlY3RpdmUsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAocHJpbnRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoZXJyb3IsIHIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXQgPSBmaW5kX3N0cmluZyhmLCBFTkRJTkdfU0VRVUVOQ0UsIHIsIDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0JCQkgICAgICAicHJlbWF0dXJlIEVPRiBpbiBwYXJzZWQgZmlsZSAlcyIsCi0JCQkgICAgICByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBYQklUSEFDSy4gIFNpZ2guLi4gIE5CIGl0J3MgY29uZmlndXJhYmxlIHBlci1kaXJlY3Rvcnk7IHRoZSBjb21waWxlLXRpbWUKLSAqIG9wdGlvbiBvbmx5IGNoYW5nZXMgdGhlIGRlZmF1bHQuCi0gKi8KLQotbW9kdWxlIGluY2x1ZGVzX21vZHVsZTsKLWVudW0geGJpdGhhY2sgewotICAgIHhiaXRoYWNrX29mZiwgeGJpdGhhY2tfb24sIHhiaXRoYWNrX2Z1bGwKLX07Ci0KLSNpZmRlZiBYQklUSEFDSwotI2RlZmluZSBERUZBVUxUX1hCSVRIQUNLIHhiaXRoYWNrX2Z1bGwKLSNlbHNlCi0jZGVmaW5lIERFRkFVTFRfWEJJVEhBQ0sgeGJpdGhhY2tfb2ZmCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9pbmNsdWRlc19kaXJfY29uZmlnKHBvb2wgKnAsIGNoYXIgKmR1bW15KQotewotICAgIGVudW0geGJpdGhhY2sgKnJlc3VsdCA9IChlbnVtIHhiaXRoYWNrICopIGFwX3BhbGxvYyhwLCBzaXplb2YoZW51bSB4Yml0aGFjaykpOwotICAgICpyZXN1bHQgPSBERUZBVUxUX1hCSVRIQUNLOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfeGJpdGhhY2soY21kX3Bhcm1zICpjbWQsIHZvaWQgKnhicCwgY2hhciAqYXJnKQotewotICAgIGVudW0geGJpdGhhY2sgKnN0YXRlID0gKGVudW0geGJpdGhhY2sgKikgeGJwOwotCi0gICAgaWYgKCFzdHJjYXNlY21wKGFyZywgIm9mZiIpKSB7Ci0gICAgICAgICpzdGF0ZSA9IHhiaXRoYWNrX29mZjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJnLCAib24iKSkgewotICAgICAgICAqc3RhdGUgPSB4Yml0aGFja19vbjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJnLCAiZnVsbCIpKSB7Ci0gICAgICAgICpzdGF0ZSA9IHhiaXRoYWNrX2Z1bGw7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXR1cm4gIlhCaXRIYWNrIG11c3QgYmUgc2V0IHRvIE9mZiwgT24sIG9yIEZ1bGwiOwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IHNlbmRfcGFyc2VkX2ZpbGUocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgRklMRSAqZjsKLSAgICBlbnVtIHhiaXRoYWNrICpzdGF0ZSA9Ci0gICAgKGVudW0geGJpdGhhY2sgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsICZpbmNsdWRlc19tb2R1bGUpOwotICAgIGludCBlcnJzdGF0dXM7Ci0gICAgcmVxdWVzdF9yZWMgKnBhcmVudDsKLQotICAgIGlmICghKGFwX2FsbG93X29wdGlvbnMocikgJiBPUFRfSU5DTFVERVMpKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0gICAgci0+YWxsb3dlZCB8PSAoMSA8PCBNX0dFVCk7Ci0gICAgaWYgKHItPm1ldGhvZF9udW1iZXIgIT0gTV9HRVQpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLSAgICBpZiAoci0+ZmluZm8uc3RfbW9kZSA9PSAwKSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0JCSAgICAiRmlsZSBkb2VzIG5vdCBleGlzdDogJXMiLAotICAgICAgICAgICAgICAgICAgICAoci0+cGF0aF9pbmZvCi0gICAgICAgICAgICAgICAgICAgICA/IGFwX3BzdHJjYXQoci0+cG9vbCwgci0+ZmlsZW5hbWUsIHItPnBhdGhfaW5mbywgTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgIDogci0+ZmlsZW5hbWUpKTsKLSAgICAgICAgcmV0dXJuIEhUVFBfTk9UX0ZPVU5EOwotICAgIH0KLQotICAgIGlmICghKGYgPSBhcF9wZm9wZW4oci0+cG9vbCwgci0+ZmlsZW5hbWUsICJyIikpKSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAiZmlsZSBwZXJtaXNzaW9ucyBkZW55IHNlcnZlciBhY2Nlc3M6ICVzIiwgci0+ZmlsZW5hbWUpOwotICAgICAgICByZXR1cm4gSFRUUF9GT1JCSURERU47Ci0gICAgfQotCi0gICAgaWYgKCgqc3RhdGUgPT0geGJpdGhhY2tfZnVsbCkKLSNpZiAhZGVmaW5lZChPUzIpICYmICFkZWZpbmVkKFdJTjMyKQotICAgIC8qICBPUy8yIGRvc2VuJ3Qgc3VwcG9ydCBHcm91cHMuICovCi0gICAgICAgICYmIChyLT5maW5mby5zdF9tb2RlICYgU19JWEdSUCkKLSNlbmRpZgotICAgICAgICApIHsKLSAgICAgICAgYXBfdXBkYXRlX210aW1lKHIsIHItPmZpbmZvLnN0X210aW1lKTsKLSAgICAgICAgYXBfc2V0X2xhc3RfbW9kaWZpZWQocik7Ci0gICAgfQotICAgIGlmICgoZXJyc3RhdHVzID0gYXBfbWVldHNfY29uZGl0aW9ucyhyKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycnN0YXR1czsKLSAgICB9Ci0KLSAgICBhcF9zZW5kX2h0dHBfaGVhZGVyKHIpOwotCi0gICAgaWYgKHItPmhlYWRlcl9vbmx5KSB7Ci0gICAgICAgIGFwX3BmY2xvc2Uoci0+cG9vbCwgZik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBpZiAoKHBhcmVudCA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnJlcXVlc3RfY29uZmlnLCAmaW5jbHVkZXNfbW9kdWxlKSkpIHsKLQkvKiBLbHVkZ2UgLS0tIGZvciBuZXN0ZWQgaW5jbHVkZXMsIHdlIHdhbnQgdG8ga2VlcCB0aGUgc3VicHJvY2VzcwotCSAqIGVudmlyb25tZW50IG9mIHRoZSBiYXNlIGRvY3VtZW50IChmb3IgY29tcGF0aWJpbGl0eSk7IHRoYXQgbWVhbnMKLQkgKiB0b3JxdWluZyBvdXIgb3duIGxhc3RfbW9kaWZpZWQgZGF0ZSBhcyB3ZWxsIHNvIHRoYXQgdGhlCi0JICogTEFTVF9NT0RJRklFRCB2YXJpYWJsZSBnZXRzIHJlc2V0IHRvIHRoZSBwcm9wZXIgdmFsdWUgaWYgdGhlCi0JICogbmVzdGVkIGRvY3VtZW50IHJlc2V0cyA8IS0tI2NvbmZpZyB0aW1lZm10LS0+LgotCSAqIFdlIGFsc28gaW5zaXN0IHRoYXQgdGhlIG1lbW9yeSBmb3IgdGhpcyBzdWJyZXF1ZXN0IG5vdCBiZQotCSAqIGRlc3Ryb3llZCwgdGhhdCdzIGRlYWx0IHdpdGggaW4gaGFuZGxlX2luY2x1ZGUoKS4KLQkgKi8KLQlyLT5zdWJwcm9jZXNzX2VudiA9IHBhcmVudC0+c3VicHJvY2Vzc19lbnY7Ci0JYXBfcG9vbF9qb2luKHBhcmVudC0+cG9vbCwgci0+cG9vbCk7Ci0Jci0+ZmluZm8uc3RfbXRpbWUgPSBwYXJlbnQtPmZpbmZvLnN0X210aW1lOwotICAgIH0KLSAgICBlbHNlIHsKLQkvKiB3ZSdyZSBub3QgYSBuZXN0ZWQgaW5jbHVkZSwgc28gd2UgY3JlYXRlIGFuIGluaXRpYWwKLQkgKiBlbnZpcm9ubWVudCAqLwotICAgICAgICBhcF9hZGRfY29tbW9uX3ZhcnMocik7Ci0gICAgICAgIGFwX2FkZF9jZ2lfdmFycyhyKTsKLSAgICAgICAgYWRkX2luY2x1ZGVfdmFycyhyLCBERUZBVUxUX1RJTUVfRk9STUFUKTsKLSAgICB9Ci0gICAgLyogWFhYOiB0aGlzIGlzIGJvZ3VzLCBhdCBzb21lIHBvaW50IHdlJ3JlIGdvaW5nIHRvIGRvIGEgc3VicmVxdWVzdCwKLSAgICAgKiBhbmQgd2hlbiB3ZSBkbyBpdCB3ZSdyZSBnb2luZyB0byBiZSBzdWJqZWN0aW5nIGNvZGUgdGhhdCBkb2Vzbid0Ci0gICAgICogZXhwZWN0IHRvIGJlIHNpZ25hbC1yZWFkeSB0byBTSUdBTFJNLiAgVGhlcmUgaXMgbm8gY2xlYW4gd2F5IHRvCi0gICAgICogZml4IHRoaXMsIGV4Y2VwdCB0byBwdXQgYWxhcm0gc3VwcG9ydCBpbnRvIEJVRkYuIC1kamcKLSAgICAgKi8KLSAgICBhcF9oYXJkX3RpbWVvdXQoInNlbmQgU1NJIiwgcik7Ci0KLSNpZmRlZiBDSEFSU0VUX0VCQ0RJQwotICAgIC8qIFhYWDpAQEAgSXMgdGhlIGdlbmVyYXRlZC9pbmNsdWRlZCBvdXRwdXQgQUxXQVlTIGluIHRleHQvZWJjZGljIGZvcm1hdD8gKi8KLSAgICBhcF9ic2V0ZmxhZyhyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJfRUJDRElDMkFTQ0lJLCAxKTsKLSNlbmRpZgotCi0gICAgc2VuZF9wYXJzZWRfY29udGVudChmLCByKTsKLQotICAgIGlmIChwYXJlbnQpIHsKLQkvKiBzaWduaWZ5IHRoYXQgdGhlIHN1YiByZXF1ZXN0IHNob3VsZCBub3QgYmUga2lsbGVkICovCi0JYXBfc2V0X21vZHVsZV9jb25maWcoci0+cmVxdWVzdF9jb25maWcsICZpbmNsdWRlc19tb2R1bGUsCi0JICAgIE5FU1RFRF9JTkNMVURFX01BR0lDKTsKLSAgICB9Ci0KLSAgICBhcF9raWxsX3RpbWVvdXQocik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0aWMgaW50IHNlbmRfc2h0bWxfZmlsZShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICByLT5jb250ZW50X3R5cGUgPSAidGV4dC9odG1sIjsKLSAgICByZXR1cm4gc2VuZF9wYXJzZWRfZmlsZShyKTsKLX0KLQotc3RhdGljIGludCB4Yml0aGFja19oYW5kbGVyKHJlcXVlc3RfcmVjICpyKQotewotI2lmIGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTjMyKQotICAgIC8qIE9TLzIgZG9zZW4ndCBjdXJyZW50bHkgc3VwcG9ydCB0aGUgeGJpdGhhY2suIFRoaXMgaXMgYmVpbmcgd29ya2VkIG9uLiAqLwotICAgIHJldHVybiBERUNMSU5FRDsKLSNlbHNlCi0gICAgZW51bSB4Yml0aGFjayAqc3RhdGU7Ci0KLSAgICBpZiAoIShyLT5maW5mby5zdF9tb2RlICYgU19JWFVTUikpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIHN0YXRlID0gKGVudW0geGJpdGhhY2sgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5jbHVkZXNfbW9kdWxlKTsKLQotICAgIGlmICgqc3RhdGUgPT0geGJpdGhhY2tfb2ZmKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0gICAgcmV0dXJuIHNlbmRfcGFyc2VkX2ZpbGUocik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIGluY2x1ZGVzX2NtZHNbXSA9Ci17Ci0gICAgeyJYQml0SGFjayIsIHNldF94Yml0aGFjaywgTlVMTCwgT1JfT1BUSU9OUywgVEFLRTEsICJPZmYsIE9uLCBvciBGdWxsIn0sCi0gICAge05VTEx9Ci19OwotCi1zdGF0aWMgY29uc3QgaGFuZGxlcl9yZWMgaW5jbHVkZXNfaGFuZGxlcnNbXSA9Ci17Ci0gICAge0lOQ0xVREVTX01BR0lDX1RZUEUsIHNlbmRfc2h0bWxfZmlsZX0sCi0gICAge0lOQ0xVREVTX01BR0lDX1RZUEUzLCBzZW5kX3NodG1sX2ZpbGV9LAotICAgIHsic2VydmVyLXBhcnNlZCIsIHNlbmRfcGFyc2VkX2ZpbGV9LAotICAgIHsidGV4dC9odG1sIiwgeGJpdGhhY2tfaGFuZGxlcn0sCi0gICAge05VTEx9Ci19OwotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgaW5jbHVkZXNfbW9kdWxlID0KLXsKLSAgICBTVEFOREFSRF9NT0RVTEVfU1RVRkYsCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemVyICovCi0gICAgY3JlYXRlX2luY2x1ZGVzX2Rpcl9jb25maWcsIC8qIGRpciBjb25maWcgY3JlYXRlciAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXIgbWVyZ2VyIC0tLSBkZWZhdWx0IGlzIHRvIG92ZXJyaWRlICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcnZlciBjb25maWcgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLwotICAgIGluY2x1ZGVzX2NtZHMsICAgICAgICAgICAgICAvKiBjb21tYW5kIHRhYmxlICovCi0gICAgaW5jbHVkZXNfaGFuZGxlcnMsICAgICAgICAgIC8qIGhhbmRsZXJzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGVuYW1lIHRyYW5zbGF0aW9uICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrX3VzZXJfaWQgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgYXV0aCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBhY2Nlc3MgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHlwZV9jaGVja2VyICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpeHVwcyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2dnZXIgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaGVhZGVyIHBhcnNlciAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGlsZF9pbml0ICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoaWxkX2V4aXQgKi8KLSAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdCByZWFkLXJlcXVlc3QgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL2ZpbHRlcnMvbW9kX2luY2x1ZGUuZHNwIGIvbW9kdWxlcy9maWx0ZXJzL21vZF9pbmNsdWRlLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRiNmRmYi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2ZpbHRlcnMvbW9kX2luY2x1ZGUuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ibW9kX2luY2x1ZGUiIC0gUGFja2FnZSBPd25lcj08ND4KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDAKLSMgKiogRE8gTk9UIEVESVQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDEwMgotCi1DRkc9bW9kX2luY2x1ZGUgLSBXaW4zMiBSZWxlYXNlCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIm1vZF9pbmNsdWRlLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAibW9kX2luY2x1ZGUubWFrIiBDRkc9Im1vZF9pbmNsdWRlIC0gV2luMzIgUmVsZWFzZSIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJtb2RfaW5jbHVkZSAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgIm1vZF9pbmNsdWRlIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1NVEw9bWlkbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAibW9kX2luY2x1ZGUgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9JICIuLi8uLi9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci11dGlsL2luY2x1ZGUiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRmQiUmVsZWFzZVxtb2RfaW5jbHVkZSIgL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9tYWNoaW5lOkkzODYgL291dDoiUmVsZWFzZS9tb2RfaW5jbHVkZS5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfaW5jbHVkZQotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYXAgL21hY2hpbmU6STM4NiAvb3V0OiJSZWxlYXNlL21vZF9pbmNsdWRlLnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF9pbmNsdWRlCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJtb2RfaW5jbHVkZSAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTURkIC9XMyAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTURkIC9XMyAvR1ggL1ppIC9PZCAvSSAiLi4vLi4vaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHIvaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHItdXRpbC9pbmNsdWRlIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0ZkIkRlYnVnXG1vZF9pbmNsdWRlIiAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9pbmNyZW1lbnRhbDpubyAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6IkRlYnVnL21vZF9pbmNsdWRlLnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF9pbmNsdWRlCi0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2luY3JlbWVudGFsOm5vIC9tYXAgL2RlYnVnIC9tYWNoaW5lOkkzODYgL291dDoiRGVidWcvbW9kX2luY2x1ZGUuc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX2luY2x1ZGUKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIm1vZF9pbmNsdWRlIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAibW9kX2luY2x1ZGUgLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kX2luY2x1ZGUuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kX2luY2x1ZGUuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kX2luY2x1ZGUucmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxidWlsZFx3aW4zMlx3aW4zMnZlci5hd2sKLQotIUlGICAiJChDRkcpIiA9PSAibW9kX2luY2x1ZGUgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIENyZWF0aW5nIFZlcnNpb24gUmVzb3VyY2UKLUlucHV0UGF0aD0uLlwuLlxidWlsZFx3aW4zMlx3aW4zMnZlci5hd2sKLQotIi5cbW9kX2luY2x1ZGUucmMiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JYXdrIC1mIC4uLy4uL2J1aWxkL3dpbjMyL3dpbjMydmVyLmF3ayBtb2RfaW5jbHVkZSAgImluY2x1ZGVfbW9kdWxlIGZvciBBcGFjaGUiIC4uLy4uL2luY2x1ZGUvYXBfcmVsZWFzZS5oID4gLlxtb2RfaW5jbHVkZS5yYwotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9pbmNsdWRlIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQ3JlYXRpbmcgVmVyc2lvbiBSZXNvdXJjZQotSW5wdXRQYXRoPS4uXC4uXGJ1aWxkXHdpbjMyXHdpbjMydmVyLmF3awotCi0iLlxtb2RfaW5jbHVkZS5yYyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQlhd2sgLWYgLi4vLi4vYnVpbGQvd2luMzIvd2luMzJ2ZXIuYXdrIG1vZF9pbmNsdWRlICAiaW5jbHVkZV9tb2R1bGUgZm9yIEFwYWNoZSIgLi4vLi4vaW5jbHVkZS9hcF9yZWxlYXNlLmggPiAuXG1vZF9pbmNsdWRlLnJjCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL21vZHVsZXMvZmlsdGVycy9tb2RfaW5jbHVkZS5leHAgYi9tb2R1bGVzL2ZpbHRlcnMvbW9kX2luY2x1ZGUuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzVkYTc0Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZmlsdGVycy9tb2RfaW5jbHVkZS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbmNsdWRlc19tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvZmlsdGVycy9tb2RfaW5jbHVkZS5oIGIvbW9kdWxlcy9maWx0ZXJzL21vZF9pbmNsdWRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NGQ5OTkuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9maWx0ZXJzL21vZF9pbmNsdWRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCi0gKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAotICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqLwotCi0jaWZuZGVmIF9NT0RfSU5DTFVERV9ICi0jZGVmaW5lIF9NT0RfSU5DTFVERV9IIDEKLQotCi0KLSNkZWZpbmUgU1RBUlRJTkdfU0VRVUVOQ0UgIjwhLS0jIgotI2RlZmluZSBFTkRJTkdfU0VRVUVOQ0UgIi0tPiIKLQotI2RlZmluZSBERUZBVUxUX0VSUk9SX01TRyAiW2FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhpcyBkaXJlY3RpdmVdIgotI2RlZmluZSBERUZBVUxUX1RJTUVfRk9STUFUICIlQSwgJWQtJWItJVkgJUg6JU06JVMgJVoiCi0jZGVmaW5lIFNJWkVGTVRfQllURVMgMAotI2RlZmluZSBTSVpFRk1UX0tNRyAxCi0jZGVmaW5lIFRNUF9CVUZfU0laRSAxMDI0Ci0jaWZkZWYgQ0hBUlNFVF9FQkNESUMKLSNkZWZpbmUgUkFXX0FTQ0lJX0NIQVIoY2gpICBhcHJfeGxhdGVfY29udl9ieXRlKGFwX2hkcnNfZnJvbV9hc2NpaSwgKHVuc2lnbmVkIGNoYXIpY2gpCi0jZWxzZSAvKkNIQVJTRVRfRUJDRElDKi8KLSNkZWZpbmUgUkFXX0FTQ0lJX0NIQVIoY2gpICAoY2gpCi0jZW5kaWYgLypDSEFSU0VUX0VCQ0RJQyovCi0KLW1vZHVsZSBBUF9NT0RVTEVfREVDTEFSRV9EQVRBIGluY2x1ZGVzX21vZHVsZTsKLQotLyoganVzdCBuZWVkIHNvbWUgYXJiaXRyYXJ5IG5vbi1OVUxMIHBvaW50ZXIgd2hpY2ggY2FuJ3QgYWxzbyBiZSBhIHJlcXVlc3RfcmVjICovCi0jZGVmaW5lIE5FU1RFRF9JTkNMVURFX01BR0lDCSgmaW5jbHVkZXNfbW9kdWxlKQotCi0vKiBUT0RPOiBjaGFuZ2luZyBkaXJlY3Rvcnkgc2hvdWxkIGJlIGhhbmRsZWQgYnkgQ3JlYXRlUHJvY2VzcyAqLwotI2RlZmluZSBhcF9jaGRpcl9maWxlKHgpIGRvIHt9IHdoaWxlKDApCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFVzZWQgdG8ga2VlcCBjb250ZXh0IGluZm9ybWF0aW9uIGR1cmluZyBwYXJzaW5nIG9mIGEgcmVxdWVzdCBmb3IgU1NJIHRhZ3MuCi0gKiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGlmIHRoZSB0YWcgc3RyZXRjaGVzIGFjcm9zcyBtdWx0aXBsZSBidWNrZXRzIG9yCi0gKiBicmlnYWRlcy4gVGhpcyBrZWVwcyB0cmFjayBvZiB3aGljaCBidWNrZXRzIG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUKLSAqIGNvbnRlbnQgZ2VuZXJhdGVkIGJ5IHRoZSBTU0kgdGFnLgotICoKLSAqIHN0YXRlOiBQUkVfSEVBRCAtIFN0YXRlIHByaW9yIHRvIGZpbmRpbmcgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgICAgICBTVEFSVElOR19TRVFVRU5DRS4gTmV4dCBzdGF0ZSBpcyBQQVJTRV9IRUFELgotICogICAgICAgIFBBUlNFX0hFQUQgLSBTdGF0ZSBlbnRlcmVkIG9uY2UgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgU1RBUlRJTkdfU0VRVUVOQ0UgaXMgZm91bmQgYW5kIGV4aXRlZCB3aGVuIHRoZQotICogICAgICAgICAgICAgICAgICAgICB0aGUgZnVsbCBTVEFSVElOR19TRVFVRU5DRSBoYXMgYmVlbiBtYXRjaGVkIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgIGEgbWF0Y2ggZmFpbHVyZSBvY2N1cnMuIE5leHQgc3RhdGUgaXMgUFJFX0hFQUQKLSAqICAgICAgICAgICAgICAgICAgICAgb3IgUEFSU0VfVEFHLgotICogICAgICAgIFBBUlNFX1RBRyAtIFN0YXRlIGVudGVyZWQgb25jZSB0aGUgU1RBUlRJTkcgc2VxdWVuY2UgaGFzIGJlZW4KLSAqICAgICAgICAgICAgICAgICAgICBtYXRjaGVkLiBJdCBpcyBleGl0ZWQgd2hlbiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluCi0gKiAgICAgICAgICAgICAgICAgICAgRU5ESU5HX1NFUVVFTkNFIGlzIGZvdW5kLiBOZXh0IHN0YXRlIGlzIFBBUlNFX1RBSUwuCi0gKiAgICAgICAgUEFSU0VfVEFJTCAtIFN0YXRlIGVudGVyZWQgZnJvbSBQQVJTRV9UQUcgc3RhdGUgd2hlbiB0aGUgZmlyc3QKLSAqICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyIGluIEVORElOR19TRVFVRU5DRSBpcyBlbmNvdW50ZXJlZC4gVGhpcwotICogICAgICAgICAgICAgICAgICAgICBzdGF0ZSBpcyBleGl0ZWQgd2hlbiB0aGUgRU5ESU5HX1NFUVVFTkNFIGhhcyBiZWVuCi0gKiAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlbHkgbWF0Y2hlZCwgb3Igd2hlbiBhIG1hdGNoIGZhaWx1cmUgb2NjdXJzLgotICogICAgICAgICAgICAgICAgICAgICBOZXh0IHN0YXRlIGlzIFBBUlNFX1RBRyBvciBQQVJTRUQuCi0gKiAgICAgICAgUEFSU0VEIC0gU3RhdGUgZW50ZXJlZCBmcm9tIFBBUlNFX1RBSUwgb25jZSB0aGUgY29tcGxldGUgCi0gKiAgICAgICAgICAgICAgICAgRU5ESU5HX1NFUVVFTkNFIGhhcyBiZWVuIG1hdGNoZWQuIFRoZSBTU0kgdGFnIGlzCi0gKiAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkIGFuZCB0aGUgU1NJIGJ1Y2tldHMgYXJlIHJlcGxhY2VkIHdpdGggdGhlCi0gKiAgICAgICAgICAgICAgICAgU1NJIGNvbnRlbnQgZHVyaW5nIHRoaXMgc3RhdGUuCi0gKiBwYXJzZV9wb3M6IEN1cnJlbnQgbWF0Y2hlZCBwb3NpdGlvbiB3aXRoaW4gdGhlIFNUQVJUSU5HX1NFUVVFTkNFIG9yCi0gKiAgICAgICAgICAgIEVORElOR19TRVFVRU5DRSBkdXJpbmcgdGhlIFBBUlNFX0hFQUQgYW5kIFBBUlNFX1RBSUwgc3RhdGVzLgotICogICAgICAgICAgICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gdGhlIHNlcXVlbmNlIHNwYW5zIGJyaWdhZGVzLgotICogWF9zdGFydF9idWNrZXQ6IFRoZXNlIHBvaW50IHRvIHRoZSBidWNrZXRzIGNvbnRhaW5pbmcgdGhlIGZpcnN0IGNoYXJhY3RlcgotICogICAgICAgICAgICAgICAgIG9mIHRoZSBTVEFSVElOR19TRVFVRU5DRSwgdGhlIGZpcnN0IG5vbi13aGl0ZXNwYWNlCi0gKiAgICAgICAgICAgICAgICAgY2hhcmFjdGVyIG9mIHRoZSB0YWcsIGFuZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZQotICogICAgICAgICAgICAgICAgIEVORElOR19TRVFVRU5DRSAoaGVhZF8sIHRhZ18sIGFuZCB0YWlsXyByZXNwZWN0aXZlbHkpLgotICogICAgICAgICAgICAgICAgIFRoZSBidWNrZXRzIGFyZSBrZXB0IGludGFjdCB1bnRpbCB0aGUgUEFSU0VEIHN0YXRlIGlzCi0gKiAgICAgICAgICAgICAgICAgcmVhY2hlZCwgYXQgd2hpY2ggdGltZSB0aGUgdGFnIGlzIGNvbnNvbGlkYXRlZCBhbmQgdGhlCi0gKiAgICAgICAgICAgICAgICAgYnVja2V0cyBhcmUgcmVsZWFzZWQuIFRoZSBidWNrZXRzIHRoYXQgdGhlc2UgcG9pbnQgdG8KLSAqICAgICAgICAgICAgICAgICBoYXZlIGFsbCBiZWVuIHNldCBhc2lkZSBpbiB0aGUgc3NpX3RhZ19icmlnYWRlIChhbG9uZwotICogICAgICAgICAgICAgICAgIHdpdGggYWxsIG9mIHRoZSBpbnRlcnZlbmluZyBidWNrZXRzKS4KLSAqIFhfc3RhcnRfaW5kZXg6IFRoZSBpbmRleCBwb2ludHMgd2l0aGluIHRoZSBzcGVjaWZpZWQgYnVja2V0IGNvbnRlbnRzCi0gKiAgICAgICAgICAgICAgICB3aGVyZSB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBTVEFSVElOR19TRVFVRU5DRSwKLSAqICAgICAgICAgICAgICAgIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgb2YgdGhlIHRhZywgYW5kIHRoZQotICogICAgICAgICAgICAgICAgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBFTkRJTkdfU0VRVUVOQ0UgY2FuIGJlIGZvdW5kCi0gKiAgICAgICAgICAgICAgICAoaGVhZF8sIHRhZ18sIGFuZCB0YWlsXyByZXNwZWN0aXZlbHkpLgotICogY29tYmluZWRfdGFnOiBPbmNlIHRoZSBQQVJTRUQgc3RhdGUgaXMgcmVhY2hlZCB0aGUgdGFnIGlzIGNvbGxlY3RlZCBmcm9tCi0gKiAgICAgICAgICAgICAgIHRoZSBidWNrZXQocykgaW4gdGhlIHNzaV90YWdfYnJpZ2FkZSBpbnRvIHRoaXMgY29udGlndW91cwotICogICAgICAgICAgICAgICBidWZmZXIuIFRoZSBidWNrZXRzIGluIHRoZSBzc2lfdGFnX2JyaWdhZGUgYXJlIHJlbGVhc2VkCi0gKiAgICAgICAgICAgICAgIGFuZCB0aGUgdGFnIGlzIHByb2Nlc3NlZC4KLSAqIGN1cnJfdGFnX3BvczogUHRyIHRvIHRoZSBjb21iaW5lZF90YWcgYnVmZmVyIGluZGljYXRpbmcgdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgcGFyc2UgcG9zaXRpb24uCi0gKiB0YWdfbGVuZ3RoOiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBhY3R1YWwgdGFnIChleGNsdWRpbmcgdGhlCi0gKiAgICAgICAgICAgICBTVEFSVElOR19TRVFVRU5DRSwgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSwKLSAqICAgICAgICAgICAgIGFuZCBFTkRJTkdfU0VRVUVOQ0UpLiBUaGlzIGxlbmd0aCBpcyBjb21wdXRlZCBhcyB0aGUKLSAqICAgICAgICAgICAgIGJ1Y2tldHMgYXJlIHBhcnNlZCBhbmQgc2V0IGFzaWRlIGR1cmluZyB0aGUgUEFSU0VfVEFHIHN0YXRlLgotICogc3NpX3RhZ19icmlnYWRlOiBUaGUgdGVtcG9yYXJ5IGJyaWdhZGUgdXNlZCBieSB0aGlzIGZpbHRlciB0byBzZXQgYXNpZGUKLSAqICAgICAgICAgICAgICAgICAgdGhlIGJ1Y2tldHMgY29udGFpbmluZyBwYXJ0cyBvZiB0aGUgc3NpIHRhZyBhbmQgaGVhZGVycy4KLSAqLwotdHlwZWRlZiBlbnVtIHtQUkVfSEVBRCwgUEFSU0VfSEVBRCwgUEFSU0VfVEFHLCBQQVJTRV9UQUlMLCBQQVJTRUR9IHN0YXRlczsKLXR5cGVkZWYgc3RydWN0IGluY2x1ZGVfZmlsdGVyX2N0eCB7Ci0gICAgc3RhdGVzICAgICAgIHN0YXRlOwotICAgIGxvbmcgICAgICAgICBmbGFnczsgICAgLyogU2VlIHRoZSBGTEFHX1hYWFhYIGRlZmluaXRpb25zLiAqLwotICAgIGludCAgICAgICAgICBpZl9uZXN0aW5nX2xldmVsOwotICAgIGFwcl9zc2l6ZV90ICBwYXJzZV9wb3M7Ci0gICAgCi0gICAgYXBfYnVja2V0ICAgKmhlYWRfc3RhcnRfYnVja2V0OwotICAgIGFwcl9zc2l6ZV90ICBoZWFkX3N0YXJ0X2luZGV4OwotCi0gICAgYXBfYnVja2V0ICAgKnRhZ19zdGFydF9idWNrZXQ7Ci0gICAgYXByX3NzaXplX3QgIHRhZ19zdGFydF9pbmRleDsKLQotICAgIGFwX2J1Y2tldCAgICp0YWlsX3N0YXJ0X2J1Y2tldDsKLSAgICBhcHJfc3NpemVfdCAgdGFpbF9zdGFydF9pbmRleDsKLQotICAgIGNoYXIgICAgICAgICpjb21iaW5lZF90YWc7Ci0gICAgY2hhciAgICAgICAgKmN1cnJfdGFnX3BvczsKLSAgICBhcHJfc3NpemVfdCAgdGFnX2xlbmd0aDsKLQotICAgIGFwcl9zc2l6ZV90ICBlcnJvcl9sZW5ndGg7Ci0gICAgY2hhciAgICAgICAgIGVycm9yX3N0cltNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciAgICAgICAgIHRpbWVfc3RyW01BWF9TVFJJTkdfTEVOXTsKLQotICAgIGFwX2J1Y2tldF9icmlnYWRlICpzc2lfdGFnX2JyaWdhZGU7Ci19IGluY2x1ZGVfY3R4X3Q7Ci0KLS8qIFRoZXNlIGZsYWdzIGFyZSB1c2VkIHRvIHNldCBmbGFnIGJpdHMuICovCi0jZGVmaW5lIEZMQUdfUFJJTlRJTkcgICAgICAgICAweDAwMDAwMDAxICAvKiBQcmludGluZyBjb25kaXRpb25hbCBsaW5lcy4gKi8KLSNkZWZpbmUgRkxBR19DT05EX1RSVUUgICAgICAgIDB4MDAwMDAwMDIgIC8qIENvbmRpdGlvbmFsIGV2YWwnZCB0byB0cnVlLiAqLwotI2RlZmluZSBGTEFHX1NJWkVfSU5fQllURVMgICAgMHgwMDAwMDAwNCAgLyogU2l6ZXMgZGlzcGxheWVkIGluIGJ5dGVzLiAgICovCi0jZGVmaW5lIEZMQUdfTk9fRVhFQyAgICAgICAgICAweDAwMDAwMDA4ICAvKiBObyBFeGVjIGluIGN1cnJlbnQgY29udGV4dC4gKi8KLQotLyogVGhlc2UgZmxhZ3MgYXJlIHVzZWQgdG8gY2xlYXIgZmxhZyBiaXRzLiAqLwotI2RlZmluZSBGTEFHX1NJWkVfQUJCUkVWICAgICAgMHhGRkZGRkZGQiAgLyogUmVzZXQgU0laRV9JTl9CWVRFUyBiaXQuICAgICovCi0jZGVmaW5lIEZMQUdfQ0xFQVJfUFJJTlRfQ09ORCAweEZGRkZGRkZDICAvKiBSZXNldCBQUklOVElORyBhbmQgQ09ORF9UUlVFKi8KLSNkZWZpbmUgRkxBR19DTEVBUl9QUklOVElORyAgIDB4RkZGRkZGRkUgIC8qIFJlc2V0IGp1c3QgUFJJTlRJTkcgYml0LiAgICAqLwotCi10eXBlZGVmIGVudW0ge1RPS19VTktOT1dOLCBUT0tfSUYsIFRPS19TRVQsIFRPS19FQ0hPLCBUT0tfRUxJRiwgVE9LX0VMU0UsCi0gICAgICAgICAgICAgIFRPS19FWEVDLCBUT0tfUEVSTCwgVE9LX0VORElGLCBUT0tfRlNJWkUsIFRPS19DT05GSUcsCi0gICAgICAgICAgICAgIFRPS19JTkNMVURFLCBUT0tfRkxBU1RNT0QsIFRPS19QUklOVEVOVn0gZGlyX3Rva2VuX2lkOwotCi0jZGVmaW5lIENSRUFURV9FUlJPUl9CVUNLRVQoY250eCwgdF9idWNrLCBoX3B0ciwgaW5zX2hlYWQpICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXByX3NzaXplX3QgZV93cnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdF9idWNrID0gYXBfYnVja2V0X2NyZWF0ZV9oZWFwKGNudHgtPmVycm9yX3N0ciwgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+ZXJyb3JfbGVuZ3RoLCAxLCAmZV93cnQpOyBcCi0gICAgQVBfQlVDS0VUX0lOU0VSVF9CRUZPUkUoaF9wdHIsIHRfYnVjayk7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGluc19oZWFkID09IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGluc19oZWFkID0gdF9idWNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgU1BMSVRfQU5EX1BBU1NfUFJFVEFHX0JVQ0tFVFMoYnJnZCwgY250eHQpICAgICAgICAgICAgICAgXAotaWYgKChBUF9CUklHQURFX0VNUFRZKGNudHh0LT5zc2lfdGFnX2JyaWdhZGUpKSAmJiAgICAgICAgICAgICAgICBcCi0gICAgKGNudHh0LT5oZWFkX3N0YXJ0X2J1Y2tldCAhPSBOVUxMKSkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhcF9idWNrZXRfYnJpZ2FkZSAqdGFnX3BsdXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdGFnX3BsdXMgPSBhcF9icmlnYWRlX3NwbGl0KGJyZ2QsIGNudHh0LT5oZWFkX3N0YXJ0X2J1Y2tldCk7IFwKLSAgICBhcF9wYXNzX2JyaWdhZGUoZi0+bmV4dCwgYnJnZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGJyZ2QgPSB0YWdfcGx1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNlbmRpZiAvKiBNT0RfSU5DTFVERSAqLwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9nZW5lcmF0b3JzLy5jdnNpZ25vcmUgYi9tb2R1bGVzL2dlbmVyYXRvcnMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJmN2E3MC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2dlbmVyYXRvcnMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS5kZXBzCi0ubGlicwotKi5sYQotbW9kdWxlcy5tawotTWFrZWZpbGUKLSoubG8KLSouc2xvCi0qLnNvCi0qLmRsbAotKi5kZWYKZGlmZiAtLWdpdCBhL21vZHVsZXMvZ2VuZXJhdG9ycy8uaW5kZW50LnBybyBiL21vZHVsZXMvZ2VuZXJhdG9ycy8uaW5kZW50LnBybwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlmYmU5Zi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2dlbmVyYXRvcnMvLmluZGVudC5wcm8KKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0taTQgLW5wc2wgLWRpMCAtYnIgLW5jZSAtZDAgLWNsaTAgLW5wY3MgLW5mYzEKLS1UQlVGRgotLVRGSUxFCi0tVFRSQU5TCi0tVFVJTlQ0Ci0tVF90cmFucwotLVRhbGxvd19vcHRpb25zX3QKLS1UYXBhY2hlX3NmaW8KLS1UYXJyYXlfaGVhZGVyCi0tVGJvb2xfaW50Ci0tVGJ1Zl9hcmVhCi0tVGJ1ZmZfc3RydWN0Ci0tVGJ1ZmZ5Ci0tVGNtZF9ob3cKLS1UY21kX3Bhcm1zCi0tVGNvbW1hbmRfcmVjCi0tVGNvbW1hbmRfc3RydWN0Ci0tVGNvbm5fcmVjCi0tVGNvcmVfZGlyX2NvbmZpZwotLVRjb3JlX3NlcnZlcl9jb25maWcKLS1UZGlyX21ha2VyX2Z1bmMKLS1UZXZlbnQKLS1UZ2xvYmFsc19zCi0tVGhhbmRsZXJfZnVuYwotLVRoYW5kbGVyX3JlYwotLVRqb2JsaXN0X3MKLS1UbGlzdGVuX3JlYwotLVRtZXJnZXJfZnVuYwotLVRtb2RlX3QKLS1UbW9kdWxlCi0tVG1vZHVsZV9zdHJ1Y3QKLS1UbXV0ZXgKLS1Ubl9sb25nCi0tVG90aGVyX2NoaWxkX3JlYwotLVRvdmVycmlkZXNfdAotLVRwYXJlbnRfc2NvcmUKLS1UcGlkX3QKLS1UcGlwZWRfbG9nCi0tVHBvb2wKLS1UcmVxdWVzdF9yZWMKLS1UcmVxdWlyZV9saW5lCi0tVHJsaW1fdAotLVRzY29yZWJvYXJkCi0tVHNlbWFwaG9yZQotLVRzZXJ2ZXJfYWRkcl9yZWMKLS1Uc2VydmVyX3JlYwotLVRzZXJ2ZXJfcmVjX2NoYWluCi0tVHNob3J0X3Njb3JlCi0tVHRhYmxlCi0tVHRhYmxlX2VudHJ5Ci0tVHRocmVhZAotLVR1X3dpZGVfaW50Ci0tVHZ0aW1lX3QKLS1Ud2lkZV9pbnQKZGlmZiAtLWdpdCBhL21vZHVsZXMvZ2VuZXJhdG9ycy9NYWtlZmlsZS5pbiBiL21vZHVsZXMvZ2VuZXJhdG9ycy9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY3YjM0My4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2dlbmVyYXRvcnMvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotaW5jbHVkZSAkKHRvcF9zcmNkaXIpL2J1aWxkL3NwZWNpYWwubWsKLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9nZW5lcmF0b3JzL05XR05VaW5mbyBiL21vZHVsZXMvZ2VuZXJhdG9ycy9OV0dOVWluZm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYWQwNjguLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9nZW5lcmF0b3JzL05XR05VaW5mbworKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0jCi0jIE1ha2Ugc3VyZSBhbGwgbmVlZGVkIG1hY3JvJ3MgYXJlIGRlZmluZWQKLSMKLQotIwotIyBHZXQgdGhlICdoZWFkJyBvZiB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaWYgbmVjZXNzYXJ5LiAgVGhpcyBpbmNsdWRlcyBkZWZhdWx0Ci0jIHRhcmdldHMgYW5kIHBhdGhzIHRvIHRvb2xzCi0jCi0KLWlmbmRlZiBFbnZpcm9ubWVudERlZmluZWQKLWluY2x1ZGUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jCi1lbmRpZgotCi0jCi0jIFRoZXNlIGRpcmVjdG9yaWVzIHdpbGwgYmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5jbHVkZSBsaXN0LCBmb2xsb3dlZCBieQotIyBJTkNESVJTCi0jCi1YSU5DRElSUwkrPSBcCi0JCQkkKEFQX1dPUkspL2luY2x1ZGUgXAotCQkJJChOV09TKSBcCi0JCQkkKEFQX1dPUkspL21vZHVsZXMvYXJjaC9uZXR3YXJlIFwKLQkJCSQoQVBfV09SSykvc3JjbGliL2Fwci9pbmNsdWRlIFwKLQkJCSQoQVBfV09SSykvc3JjbGliL2Fwci11dGlsL2luY2x1ZGUgXAotCQkJJChBUF9XT1JLKS9zcmNsaWIvYXByIFwKLQkJCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGZsYWdzIHdpbGwgY29tZSBhZnRlciBDRkxBR1MKLSMKLVhDRkxBR1MJCSs9IFwKLQkJCS1wcmVmaXggcHJlX253LmggXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZGVmaW5lcyB3aWxsIGNvbWUgYWZ0ZXIgREVGSU5FUwotIwotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZmxhZ3Mgd2lsbCBiZSBhZGRlZCB0byB0aGUgbGluay5vcHQgZmlsZQotIwotWExGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgdmFsdWVzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGNvcnJlY3QgdmFyaWFibGVzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZgotIyBSRUxFQVNFCi0jCi1pZmVxICIkKFJFTEVBU0UpIiAiZGVidWciCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCSAgIAkkKEVPTElTVCkKLWVuZGlmCi0KLWlmZXEgIiQoUkVMRUFTRSkiICJub29wdCIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJICAgCSQoRU9MSVNUKQotZW5kaWYKLQotaWZlcSAiJChSRUxFQVNFKSIgInJlbGVhc2UiCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLWVuZGlmCi0KLSMKLSMgVGhlc2UgYXJlIHVzZWQgYnkgdGhlIGxpbmsgdGFyZ2V0IGlmIGFuIE5MTSBpcyBiZWluZyBnZW5lcmF0ZWQKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rICduYW1lJyBkaXJlY3RpdmUgdG8gbmFtZSB0aGUgbmxtLiAgSWYgbGVmdCBibGFuawotIyBUQVJHRVRfbmxtIChzZWUgYmVsb3cpIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9OQU1FCQk9IGluZm8KLQotIwotIyBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmsgJy1kZXNjICcgZGlyZWN0aXZlLiAKLSMgSWYgbGVmdCBibGFuaywgTkxNX05BTUUgd2lsbCBiZSB1c2VkLgotIwotTkxNX0RFU0NSSVBUSU9OCT0gSW5mbyBNb2R1bGUKLQotIwotIyBUaGlzIGlzIHVzZWQgYnkgdGhlICctdGhyZWFkbmFtZScgZGlyZWN0aXZlLiAgSWYgbGVmdCBibGFuaywKLSMgTkxNX05BTUUgVGhyZWFkIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9USFJFQURfTkFNRQk9IEluZm8gTW9kdWxlCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgVkVSU0lPTiB2YWx1ZSBpbiAKLSMgJChBUF9XT1JLKVxidWlsZFxOV0dOVWVudmlyb25tZW50LmluYwotIwotTkxNX1ZFUlNJT04JCT0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBvZiA2NEsKLSMKLU5MTV9TVEFDS19TSVpFCT0gODE5MgotCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZW50cnknIGRpcmVjdGl2ZQotIwotTkxNX0VOVFJZX1NZTQk9IF9MaWJDUHJlbHVkZQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWV4aXQnIGRpcmVjdGl2ZQotIwotTkxNX0VYSVRfU1lNCT0gX0xpYkNQb3N0bHVkZQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWNoZWNrJyBkaXJlY3RpdmUKLSMKLU5MTV9DSEVDS19TWU0JPQotCi0jCi0jIElmIHRoZXNlIGFyZSBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZmxhZ3MnIGRpcmVjdGl2ZQotIwotTkxNX0ZMQUdTCQk9ICBBVVRPVU5MT0FELCBQU0VVRE9QUkVFTVBUSU9OCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSBsaW5rZWQgaW4gd2l0aCB0aGUgWERDRGF0YSBvcHRpb24gaW4gdGhlIGRlZiAKLSMgZmlsZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG9mICQoTldPUykvYXBhY2hlLnhkYy4gIFhEQ0RhdGEgY2FuIGJlIGRpc2FibGVkCi0jIGJ5IHNldHRpbmcgQVBBQ0hFX1VOSVBST0MgaW4gdGhlIGVudmlyb25tZW50Ci0jCi1YRENEQVRBICAgICAgICAgPSAKLQotIwotIyBJZiB0aGVyZSBpcyBhbiBOTE0gdGFyZ2V0LCBwdXQgaXQgaGVyZQotIwotVEFSR0VUX25sbSA9IFwKLQkkKE9CSkRJUikvaW5mby5ubG0gXAotCSQoRU9MSVNUKQotCi0jCi0jIElmIHRoZXJlIGlzIGFuIExJQiB0YXJnZXQsIHB1dCBpdCBoZXJlCi0jCi1UQVJHRVRfbGliID0gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgT0JKIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIE5MTSB0YXJnZXQgYWJvdmUuCi0jIFBhdGhzIG11c3QgYWxsIHVzZSB0aGUgJy8nIGNoYXJhY3RlcgotIwotRklMRVNfbmxtX29ianMgPSBcCi0JJChPQkpESVIpL21vZF9pbmZvLm8gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgTElCIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIE5MTSB0YXJnZXQgYWJvdmUuCi0jIFRoZXNlIHdpbGwgYmUgYWRkZWQgYXMgYSBsaWJyYXJ5IGNvbW1hbmQgaW4gdGhlIGxpbmsub3B0IGZpbGUuCi0jCi1GSUxFU19ubG1fbGlicyA9IFwKLSAgIAlsaWJjcHJlLm8gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgbW9kdWxlcyB0aGF0IHRoZSBhYm92ZSBOTE0gdGFyZ2V0IGRlcGVuZHMgb24gdG8gbG9hZC4KLSMgVGhlc2Ugd2lsbCBiZSBhZGRlZCBhcyBhIG1vZHVsZSBjb21tYW5kIGluIHRoZSBsaW5rLm9wdCBmaWxlLgotIwotRklMRVNfbmxtX21vZHVsZXMgPSBcCi0JYXBybGliIFwKLQlsaWJjIFwKLQkkKEVPTElTVCkKLQotIwotIyBJZiB0aGUgbmxtIGhhcyBhIG1zZyBmaWxlLCBwdXQgaXQncyBwYXRoIGhlcmUKLSMKLUZJTEVfbmxtX21zZyA9Ci0gCi0jCi0jIElmIHRoZSBubG0gaGFzIGEgaGxwIGZpbGUgcHV0IGl0J3MgcGF0aCBoZXJlCi0jCi1GSUxFX25sbV9obHAgPQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlICQoTldPUylcY29weXJpZ2h0LnR4dC4KLSMKLUZJTEVfbmxtX2NvcHlyaWdodCA9Ci0KLSMKLSMgQW55IGFkZGl0aW9uYWwgaW1wb3J0cyBnbyBoZXJlCi0jCi1GSUxFU19ubG1fWGltcG9ydHMgPSBcCi0JQCQoQVBSKS9hcHJsaWIuaW1wIFwKLQlAJChOV09TKS9odHRwZC5pbXAgXAotCUBsaWJjLmltcCBcCi0JJChFT0xJU1QpCi0gCi0jICAgCi0jIEFueSBzeW1ib2xzIGV4cG9ydGVkIHRvIGhlcmUKLSMKLUZJTEVTX25sbV9leHBvcnRzID0gXAotCWluZm9fbW9kdWxlIFwKLQkkKEVPTElTVCkKLQkKLSMgICAKLSMgVGhlc2UgYXJlIHRoZSBPQkogZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTElCIHRhcmdldCBhYm92ZS4KLSMgUGF0aHMgbXVzdCBhbGwgdXNlIHRoZSAnLycgY2hhcmFjdGVyCi0jCi1GSUxFU19saWJfb2JqcyA9IFwKLQkJJChFT0xJU1QpCi0KLSMKLSMgaW1wbGVtZW50IHRhcmdldHMgYW5kIGRlcGVuZGFuY2llcyAobGVhdmUgdGhpcyBzZWN0aW9uIGFsb25lKQotIwotCi1saWJzIDo6ICQoT0JKRElSKSAkKFRBUkdFVF9saWIpCi0KLW5sbXMgOjogbGlicyAkKFRBUkdFVF9ubG0pCi0KLSMKLSMgVXBkYXRlZCB0aGlzIHRhcmdldCB0byBjcmVhdGUgbmVjZXNzYXJ5IGRpcmVjdG9yaWVzIGFuZCBjb3B5IGZpbGVzIHRvIHRoZSAKLSMgY29ycmVjdCBwbGFjZS4gIChTZWUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jIGZvciBleGFtcGxlcykKLSMKLWluc3RhbGwgOjogbmxtcyBGT1JDRQotCi0jCi0jIEFueSBzcGVjaWFsaXplZCBydWxlcyBoZXJlCi0jCi0KLSMKLSMgSW5jbHVkZSB0aGUgJ3RhaWwnIG1ha2VmaWxlIHRoYXQgaGFzIHRhcmdldHMgdGhhdCBkZXBlbmQgb24gdmFyaWFibGVzIGRlZmluZWQKLSMgaW4gdGhpcyBtYWtlZmlsZQotIwotCi1pbmNsdWRlICQoQVBfV09SSylcYnVpbGRcTldHTlV0YWlsLmluYwotCmRpZmYgLS1naXQgYS9tb2R1bGVzL2dlbmVyYXRvcnMvTldHTlVtYWtlZmlsZSBiL21vZHVsZXMvZ2VuZXJhdG9ycy9OV0dOVW1ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjdkMzQzLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZ2VuZXJhdG9ycy9OV0dOVW1ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLSMKLSMgRGVjbGFyZSB0aGUgc3ViLWRpcmVjdG9yaWVzIHRvIGJlIGJ1aWx0IGhlcmUKLSMKLQotU1VCRElSUyA9IFwKLQkkKEVPTElTVCkgCi0KLSMKLSMgR2V0IHRoZSAnaGVhZCcgb2YgdGhlIGJ1aWxkIGVudmlyb25tZW50LiAgVGhpcyBpbmNsdWRlcyBkZWZhdWx0IHRhcmdldHMgYW5kCi0jIHBhdGhzIHRvIHRvb2xzCi0jCi0KLWluY2x1ZGUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jCi0KLSMKLSMgYnVpbGQgdGhpcyBsZXZlbCdzIGZpbGVzCi0KLSMKLSMgTWFrZSBzdXJlIGFsbCBuZWVkZWQgbWFjcm8ncyBhcmUgZGVmaW5lZAotIwotCi0jCi0jIFRoZXNlIGRpcmVjdG9yaWVzIHdpbGwgYmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5jbHVkZSBsaXN0LCBmb2xsb3dlZCBieQotIyBJTkNESVJTCi0jCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBmbGFncyB3aWxsIGNvbWUgYWZ0ZXIgQ0ZMQUdTCi0jCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBkZWZpbmVzIHdpbGwgY29tZSBhZnRlciBERUZJTkVTCi0jCi1YREVGSU5FUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBmbGFncyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaW5rLm9wdCBmaWxlCi0jCi1YTEZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSB2YWx1ZXMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgY29ycmVjdCB2YXJpYWJsZXMgYmFzZWQgb24gdGhlIHZhbHVlIG9mCi0jIFJFTEVBU0UKLSMKLWlmZXEgIiQoUkVMRUFTRSkiICJkZWJ1ZyIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJICAgCSQoRU9MSVNUKQotZW5kaWYKLQotaWZlcSAiJChSRUxFQVNFKSIgIm5vb3B0IgotWElOQ0RJUlMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhDRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YREVGSU5FUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWExGTEFHUwkJKz0gXAotCQkgICAJJChFT0xJU1QpCi1lbmRpZgotCi1pZmVxICIkKFJFTEVBU0UpIiAicmVsZWFzZSIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotZW5kaWYKLQotIwotIyBUaGVzZSBhcmUgdXNlZCBieSB0aGUgbGluayB0YXJnZXQgaWYgYW4gTkxNIGlzIGJlaW5nIGdlbmVyYXRlZAotIyBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmsgJ25hbWUnIGRpcmVjdGl2ZSB0byBuYW1lIHRoZSBubG0uICBJZiBsZWZ0IGJsYW5rCi0jIFRBUkdFVF9ubG0gKHNlZSBiZWxvdykgd2lsbCBiZSB1c2VkLgotIwotTkxNX05BTUUJCT0KLQotIwotIyBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmsgJy1kZXNjICcgZGlyZWN0aXZlLiAKLSMgSWYgbGVmdCBibGFuaywgTkxNX05BTUUgd2lsbCBiZSB1c2VkLgotIwotTkxNX0RFU0NSSVBUSU9OCT0KLQotIwotIyBUaGlzIGlzIHVzZWQgYnkgdGhlICctdGhyZWFkbmFtZScgZGlyZWN0aXZlLiAgSWYgbGVmdCBibGFuaywKLSMgTkxNX05BTUUgVGhyZWFkIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9USFJFQURfTkFNRQk9Ci0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgVkVSU0lPTiB2YWx1ZSBpbiAKLSMgJChBUF9XT1JLKVxidWlsZFxOV0dOVWVudmlyb25tZW50LmluYwotIwotTkxNX1ZFUlNJT04JCT0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBvZiA2NEsKLSMKLU5MTV9TVEFDS19TSVpFCT0KLQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWVudHJ5JyBkaXJlY3RpdmUKLSMKLU5MTV9FTlRSWV9TWU0JPQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWV4aXQnIGRpcmVjdGl2ZQotIwotTkxNX0VYSVRfU1lNCT0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1jaGVjaycgZGlyZWN0aXZlCi0jCi1OTE1fQ0hFQ0tfU1lNCT0KLQotIwotIyBJZiB0aGVzZSBhcmUgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWZsYWdzJyBkaXJlY3RpdmUKLSMKLU5MTV9GTEFHUwkJPQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgbGlua2VkIGluIHdpdGggdGhlIFhEQ0RhdGEgb3B0aW9uIGluIHRoZSBkZWYgCi0jIGZpbGUgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBvZiAkKE5XT1MpL2FwYWNoZS54ZGMuICBYRENEYXRhIGNhbiBiZSBkaXNhYmxlZAotIyBieSBzZXR0aW5nIEFQQUNIRV9VTklQUk9DIGluIHRoZSBlbnZpcm9ubWVudAotIwotWERDREFUQSAgICAgICAgID0gCi0KLSMKLSMgSWYgdGhlcmUgaXMgYW4gTkxNIHRhcmdldCwgcHV0IGl0IGhlcmUKLSMKLVRBUkdFVF9ubG0gPSBcCi0JJChPQkpESVIpL2luZm8ubmxtIFwKLQkkKE9CSkRJUikvc3RhdHVzLm5sbSBcCi0JJChFT0xJU1QpCi0KLSMKLSMgSWYgdGhlcmUgaXMgYW4gTElCIHRhcmdldCwgcHV0IGl0IGhlcmUKLSMKLVRBUkdFVF9saWIgPSBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBPQkogZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTkxNIHRhcmdldCBhYm92ZS4KLSMgUGF0aHMgbXVzdCBhbGwgdXNlIHRoZSAnLycgY2hhcmFjdGVyCi0jCi1GSUxFU19ubG1fb2JqcyA9IFwKLQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBhcmUgdGhlIExJQiBmaWxlcyBuZWVkZWQgdG8gY3JlYXRlIHRoZSBOTE0gdGFyZ2V0IGFib3ZlLgotIyBUaGVzZSB3aWxsIGJlIGFkZGVkIGFzIGEgbGlicmFyeSBjb21tYW5kIGluIHRoZSBsaW5rLm9wdCBmaWxlLgotIwotRklMRVNfbmxtX2xpYnMgPSBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBtb2R1bGVzIHRoYXQgdGhlIGFib3ZlIE5MTSB0YXJnZXQgZGVwZW5kcyBvbiB0byBsb2FkLgotIyBUaGVzZSB3aWxsIGJlIGFkZGVkIGFzIGEgbW9kdWxlIGNvbW1hbmQgaW4gdGhlIGxpbmsub3B0IGZpbGUuCi0jCi1GSUxFU19ubG1fbW9kdWxlcyA9IFwKLQkkKEVPTElTVCkKLQotIwotIyBJZiB0aGUgbmxtIGhhcyBhIG1zZyBmaWxlLCBwdXQgaXQncyBwYXRoIGhlcmUKLSMKLUZJTEVfbmxtX21zZyA9Ci0gCi0jCi0jIElmIHRoZSBubG0gaGFzIGEgaGxwIGZpbGUgcHV0IGl0J3MgcGF0aCBoZXJlCi0jCi1GSUxFX25sbV9obHAgPQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlICQoTldPUylcY29weXJpZ2h0LnR4dC4KLSMKLUZJTEVfbmxtX2NvcHlyaWdodCA9Ci0KLSMKLSMgQW55IGFkZGl0aW9uYWwgaW1wb3J0cyBnbyBoZXJlCi0jCi1GSUxFU19ubG1fWGltcG9ydHMgPSBcCi0JJChFT0xJU1QpCi0gCi0jICAgCi0jIEFueSBzeW1ib2xzIGV4cG9ydGVkIHRvIGhlcmUKLSMKLUZJTEVTX25sbV9leHBvcnRzID0gXAotCSQoRU9MSVNUKQotCQotIyAgIAotIyBUaGVzZSBhcmUgdGhlIE9CSiBmaWxlcyBuZWVkZWQgdG8gY3JlYXRlIHRoZSBMSUIgdGFyZ2V0IGFib3ZlLgotIyBQYXRocyBtdXN0IGFsbCB1c2UgdGhlICcvJyBjaGFyYWN0ZXIKLSMKLUZJTEVTX2xpYl9vYmpzID0gXAotCQkkKEVPTElTVCkKLQotIwotIyBpbXBsZW1lbnQgdGFyZ2V0cyBhbmQgZGVwZW5kYW5jaWVzIChsZWF2ZSB0aGlzIHNlY3Rpb24gYWxvbmUpCi0jCi0KLWxpYnMgOjogJChPQkpESVIpICQoVEFSR0VUX2xpYikKLQotbmxtcyA6OiBsaWJzICQoVEFSR0VUX25sbSkKLQotIwotIyBVcGRhdGVkIHRoaXMgdGFyZ2V0IHRvIGNyZWF0ZSBuZWNlc3NhcnkgZGlyZWN0b3JpZXMgYW5kIGNvcHkgZmlsZXMgdG8gdGhlIAotIyBjb3JyZWN0IHBsYWNlLiAgKFNlZSAkKEFQX1dPUkspXGJ1aWxkXE5XR05VaGVhZC5pbmMgZm9yIGV4YW1wbGVzKQotIwotaW5zdGFsbCA6OiBubG1zIEZPUkNFCi0JY29weSAkKE9CSkRJUilcKi5ubG0gJChJTlNUQUxMKVxBcGFjaGUyXG1vZHVsZXNcKi4qCi0KLSMKLSMgQW55IHNwZWNpYWxpemVkIHJ1bGVzIGhlcmUKLSMKLQotIwotIyBJbmNsdWRlIHRoZSAndGFpbCcgbWFrZWZpbGUgdGhhdCBoYXMgdGFyZ2V0cyB0aGF0IGRlcGVuZCBvbiB2YXJpYWJsZXMgZGVmaW5lZAotIyBpbiB0aGlzIG1ha2VmaWxlCi0jCi0KLWluY2x1ZGUgJChBUF9XT1JLKVxidWlsZFxOV0dOVXRhaWwuaW5jCi0KLQotCQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9nZW5lcmF0b3JzL05XR05Vc3RhdHVzIGIvbW9kdWxlcy9nZW5lcmF0b3JzL05XR05Vc3RhdHVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTkxMjM2Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZ2VuZXJhdG9ycy9OV0dOVXN0YXR1cworKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0jCi0jIE1ha2Ugc3VyZSBhbGwgbmVlZGVkIG1hY3JvJ3MgYXJlIGRlZmluZWQKLSMKLQotIwotIyBHZXQgdGhlICdoZWFkJyBvZiB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaWYgbmVjZXNzYXJ5LiAgVGhpcyBpbmNsdWRlcyBkZWZhdWx0Ci0jIHRhcmdldHMgYW5kIHBhdGhzIHRvIHRvb2xzCi0jCi0KLWlmbmRlZiBFbnZpcm9ubWVudERlZmluZWQKLWluY2x1ZGUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jCi1lbmRpZgotCi0jCi0jIFRoZXNlIGRpcmVjdG9yaWVzIHdpbGwgYmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5jbHVkZSBsaXN0LCBmb2xsb3dlZCBieQotIyBJTkNESVJTCi0jCi1YSU5DRElSUwkrPSBcCi0JCQkkKEFQX1dPUkspL2luY2x1ZGUgXAotCQkJJChOV09TKSBcCi0JCQkkKEFQX1dPUkspL21vZHVsZXMvYXJjaC9uZXR3YXJlIFwKLQkJCSQoQVBfV09SSykvc3JjbGliL2Fwci9pbmNsdWRlIFwKLQkJCSQoQVBfV09SSykvc3JjbGliL2Fwci11dGlsL2luY2x1ZGUgXAotCQkJJChBUF9XT1JLKS9zcmNsaWIvYXByIFwKLQkJCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGZsYWdzIHdpbGwgY29tZSBhZnRlciBDRkxBR1MKLSMKLVhDRkxBR1MJCSs9IFwKLQkJCS1wcmVmaXggcHJlX253LmggXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZGVmaW5lcyB3aWxsIGNvbWUgYWZ0ZXIgREVGSU5FUwotIwotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZmxhZ3Mgd2lsbCBiZSBhZGRlZCB0byB0aGUgbGluay5vcHQgZmlsZQotIwotWExGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgdmFsdWVzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGNvcnJlY3QgdmFyaWFibGVzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZgotIyBSRUxFQVNFCi0jCi1pZmVxICIkKFJFTEVBU0UpIiAiZGVidWciCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCSAgIAkkKEVPTElTVCkKLWVuZGlmCi0KLWlmZXEgIiQoUkVMRUFTRSkiICJub29wdCIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJICAgCSQoRU9MSVNUKQotZW5kaWYKLQotaWZlcSAiJChSRUxFQVNFKSIgInJlbGVhc2UiCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLWVuZGlmCi0KLSMKLSMgVGhlc2UgYXJlIHVzZWQgYnkgdGhlIGxpbmsgdGFyZ2V0IGlmIGFuIE5MTSBpcyBiZWluZyBnZW5lcmF0ZWQKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rICduYW1lJyBkaXJlY3RpdmUgdG8gbmFtZSB0aGUgbmxtLiAgSWYgbGVmdCBibGFuawotIyBUQVJHRVRfbmxtIChzZWUgYmVsb3cpIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9OQU1FCQk9IHN0YXR1cwotCi0jCi0jIFRoaXMgaXMgdXNlZCBieSB0aGUgbGluayAnLWRlc2MgJyBkaXJlY3RpdmUuIAotIyBJZiBsZWZ0IGJsYW5rLCBOTE1fTkFNRSB3aWxsIGJlIHVzZWQuCi0jCi1OTE1fREVTQ1JJUFRJT04JPSBTdGF0dXMgTW9kdWxlCi0KLSMKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSAnLXRocmVhZG5hbWUnIGRpcmVjdGl2ZS4gIElmIGxlZnQgYmxhbmssCi0jIE5MTV9OQU1FIFRocmVhZCB3aWxsIGJlIHVzZWQuCi0jCi1OTE1fVEhSRUFEX05BTUUJPSBTdGF0dXMgTW9kdWxlCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgVkVSU0lPTiB2YWx1ZSBpbiAKLSMgJChBUF9XT1JLKVxidWlsZFxOV0dOVWVudmlyb25tZW50LmluYwotIwotTkxNX1ZFUlNJT04JCT0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBvZiA2NEsKLSMKLU5MTV9TVEFDS19TSVpFCT0gODE5MgotCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZW50cnknIGRpcmVjdGl2ZQotIwotTkxNX0VOVFJZX1NZTQk9IF9MaWJDUHJlbHVkZQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWV4aXQnIGRpcmVjdGl2ZQotIwotTkxNX0VYSVRfU1lNCT0gX0xpYkNQb3N0bHVkZQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWNoZWNrJyBkaXJlY3RpdmUKLSMKLU5MTV9DSEVDS19TWU0JPQotCi0jCi0jIElmIHRoZXNlIGFyZSBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZmxhZ3MnIGRpcmVjdGl2ZQotIwotTkxNX0ZMQUdTCQk9ICBBVVRPVU5MT0FELCBQU0VVRE9QUkVFTVBUSU9OCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSBsaW5rZWQgaW4gd2l0aCB0aGUgWERDRGF0YSBvcHRpb24gaW4gdGhlIGRlZiAKLSMgZmlsZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG9mICQoTldPUykvYXBhY2hlLnhkYy4gIFhEQ0RhdGEgY2FuIGJlIGRpc2FibGVkCi0jIGJ5IHNldHRpbmcgQVBBQ0hFX1VOSVBST0MgaW4gdGhlIGVudmlyb25tZW50Ci0jCi1YRENEQVRBICAgICAgICAgPSAKLQotIwotIyBJZiB0aGVyZSBpcyBhbiBOTE0gdGFyZ2V0LCBwdXQgaXQgaGVyZQotIwotVEFSR0VUX25sbSA9IFwKLQkkKE9CSkRJUikvc3RhdHVzLm5sbSBcCi0JJChFT0xJU1QpCi0KLSMKLSMgSWYgdGhlcmUgaXMgYW4gTElCIHRhcmdldCwgcHV0IGl0IGhlcmUKLSMKLVRBUkdFVF9saWIgPSBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBPQkogZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTkxNIHRhcmdldCBhYm92ZS4KLSMgUGF0aHMgbXVzdCBhbGwgdXNlIHRoZSAnLycgY2hhcmFjdGVyCi0jCi1GSUxFU19ubG1fb2JqcyA9IFwKLQkkKE9CSkRJUikvbW9kX3N0YXR1cy5vIFwKLQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBhcmUgdGhlIExJQiBmaWxlcyBuZWVkZWQgdG8gY3JlYXRlIHRoZSBOTE0gdGFyZ2V0IGFib3ZlLgotIyBUaGVzZSB3aWxsIGJlIGFkZGVkIGFzIGEgbGlicmFyeSBjb21tYW5kIGluIHRoZSBsaW5rLm9wdCBmaWxlLgotIwotRklMRVNfbmxtX2xpYnMgPSBcCi0gICAJbGliY3ByZS5vIFwKLQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBhcmUgdGhlIG1vZHVsZXMgdGhhdCB0aGUgYWJvdmUgTkxNIHRhcmdldCBkZXBlbmRzIG9uIHRvIGxvYWQuCi0jIFRoZXNlIHdpbGwgYmUgYWRkZWQgYXMgYSBtb2R1bGUgY29tbWFuZCBpbiB0aGUgbGluay5vcHQgZmlsZS4KLSMKLUZJTEVTX25sbV9tb2R1bGVzID0gXAotCWFwcmxpYiBcCi0JbGliYyBcCi0JJChFT0xJU1QpCi0KLSMKLSMgSWYgdGhlIG5sbSBoYXMgYSBtc2cgZmlsZSwgcHV0IGl0J3MgcGF0aCBoZXJlCi0jCi1GSUxFX25sbV9tc2cgPQotIAotIwotIyBJZiB0aGUgbmxtIGhhcyBhIGhscCBmaWxlIHB1dCBpdCdzIHBhdGggaGVyZQotIwotRklMRV9ubG1faGxwID0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSAkKE5XT1MpXGNvcHlyaWdodC50eHQuCi0jCi1GSUxFX25sbV9jb3B5cmlnaHQgPQotCi0jCi0jIEFueSBhZGRpdGlvbmFsIGltcG9ydHMgZ28gaGVyZQotIwotRklMRVNfbmxtX1hpbXBvcnRzID0gXAotCUAkKEFQUikvYXBybGliLmltcCBcCi0JQCQoTldPUykvaHR0cGQuaW1wIFwKLQlAbGliYy5pbXAgXAotCSQoRU9MSVNUKQotIAotIyAgIAotIyBBbnkgc3ltYm9scyBleHBvcnRlZCB0byBoZXJlCi0jCi1GSUxFU19ubG1fZXhwb3J0cyA9IFwKLQlzdGF0dXNfbW9kdWxlIFwKLQkkKEVPTElTVCkKLQkKLSMgICAKLSMgVGhlc2UgYXJlIHRoZSBPQkogZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTElCIHRhcmdldCBhYm92ZS4KLSMgUGF0aHMgbXVzdCBhbGwgdXNlIHRoZSAnLycgY2hhcmFjdGVyCi0jCi1GSUxFU19saWJfb2JqcyA9IFwKLQkJJChFT0xJU1QpCi0KLSMKLSMgaW1wbGVtZW50IHRhcmdldHMgYW5kIGRlcGVuZGFuY2llcyAobGVhdmUgdGhpcyBzZWN0aW9uIGFsb25lKQotIwotCi1saWJzIDo6ICQoT0JKRElSKSAkKFRBUkdFVF9saWIpCi0KLW5sbXMgOjogbGlicyAkKFRBUkdFVF9ubG0pCi0KLSMKLSMgVXBkYXRlZCB0aGlzIHRhcmdldCB0byBjcmVhdGUgbmVjZXNzYXJ5IGRpcmVjdG9yaWVzIGFuZCBjb3B5IGZpbGVzIHRvIHRoZSAKLSMgY29ycmVjdCBwbGFjZS4gIChTZWUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jIGZvciBleGFtcGxlcykKLSMKLWluc3RhbGwgOjogbmxtcyBGT1JDRQotCi0jCi0jIEFueSBzcGVjaWFsaXplZCBydWxlcyBoZXJlCi0jCi0KLSMKLSMgSW5jbHVkZSB0aGUgJ3RhaWwnIG1ha2VmaWxlIHRoYXQgaGFzIHRhcmdldHMgdGhhdCBkZXBlbmQgb24gdmFyaWFibGVzIGRlZmluZWQKLSMgaW4gdGhpcyBtYWtlZmlsZQotIwotCi1pbmNsdWRlICQoQVBfV09SSylcYnVpbGRcTldHTlV0YWlsLmluYwotCmRpZmYgLS1naXQgYS9tb2R1bGVzL2dlbmVyYXRvcnMvY29uZmlnNS5tNCBiL21vZHVsZXMvZ2VuZXJhdG9ycy9jb25maWc1Lm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTFlZDhmLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZ2VuZXJhdG9ycy9jb25maWc1Lm00CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotZG5sIG1vZHVsZXMgZW5hYmxlZCBpbiB0aGlzIGRpcmVjdG9yeSBieSBkZWZhdWx0Ci0KLWRubCBBUEFDSEVfTU9EVUxFKG5hbWUsIGhlbHB0ZXh0Wywgb2JqZWN0c1ssIHN0cnVjdG5hbWVbLCBkZWZhdWx0WywgY29uZmlnXV1dXSkKLQotQVBBQ0hFX01PRFBBVEhfSU5JVChnZW5lcmF0b3JzKQotCi1BUEFDSEVfTU9EVUxFKHN0YXR1cywgcHJvY2Vzcy90aHJlYWQgbW9uaXRvcmluZywgLCAsIG5vKQotQVBBQ0hFX01PRFVMRShhdXRvaW5kZXgsIGRpcmVjdG9yeSBsaXN0aW5nLCAsICwgeWVzKQotQVBBQ0hFX01PRFVMRShhc2lzLCBhcy1pcyBmaWxldHlwZXMsICwgLCB5ZXMpCi1BUEFDSEVfTU9EVUxFKGluZm8sIHNlcnZlciBpbmZvcm1hdGlvbiwgLCAsIG5vKQotQVBBQ0hFX01PRFVMRShzdWV4ZWMsIHNldCB1aWQgYW5kIGdpZCBmb3Igc3Bhd25lZCBwcm9jZXNzZXMsICwgLCBubykKLQotTFRGTEFHUz0iJExURkxBR1MgLWV4cG9ydC1keW5hbWljIgotCi1pZiB0ZXN0ICIkYXBhY2hlX2N2X21wbSIgPSAibXBtdF9wdGhyZWFkIiAtbyAiJGFwYWNoZV9jdl9tcG0iID0gImRleHRlciI7IHRoZW4KLSMgaWYgd2UgYXJlIHVzaW5nIGEgdGhyZWFkZWQgTVBNLCB3ZSB3aWxsIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2Ugd2l0aAotIyBtb2RfY2dpZCwgc28gbWFrZSBpdCB0aGUgZGVmYXVsdC4KLSAgICBBUEFDSEVfTU9EVUxFKGNnaWQsIENHSSBzY3JpcHRzLCAsICwgeWVzKQotICAgIEFQQUNIRV9NT0RVTEUoY2dpLCBDR0kgc2NyaXB0cywgLCAsIG5vKQotZWxzZQotIyBpZiB3ZSBhcmUgdXNpbmcgYSBub24tdGhyZWFkZWQgTVBNLCBpdCBtYWtlcyBsaXR0bGUgc2Vuc2UgdG8gdXNlCi0jIG1vZF9jZ2lkLCBhbmQgaXQganVzdCBvcGVucyB1cCBob2xlcyB3ZSBkb24ndCBuZWVkLiAgTWFrZSBtb2RfY2dpIHRoZQotIyBkZWZhdWx0Ci0gICAgQVBBQ0hFX01PRFVMRShjZ2ksIENHSSBzY3JpcHRzLCAsICwgeWVzKQotICAgIEFQQUNIRV9NT0RVTEUoY2dpZCwgQ0dJIHNjcmlwdHMsICwgLCBubykKLWZpCi0KLUFQQUNIRV9NT0RQQVRIX0ZJTklTSApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9hc2lzLmMgYi9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2FzaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUyOTlkZi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2FzaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9wcm90b2NvbC5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAidXRpbF9zY3JpcHQuaCIKLSNpbmNsdWRlICJodHRwX21haW4uaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLQotc3RhdGljIGludCBhc2lzX2hhbmRsZXIocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgRklMRSAqZjsKLSAgICBjb25zdCBjaGFyICpsb2NhdGlvbjsKLQotICAgIHItPmFsbG93ZWQgfD0gKDEgPDwgTV9HRVQpOwotICAgIGlmIChyLT5tZXRob2RfbnVtYmVyICE9IE1fR0VUKQotCXJldHVybiBERUNMSU5FRDsKLSAgICBpZiAoci0+ZmluZm8uc3RfbW9kZSA9PSAwKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLQkJICAgICJGaWxlIGRvZXMgbm90IGV4aXN0OiAlcyIsIHItPmZpbGVuYW1lKTsKLQlyZXR1cm4gTk9UX0ZPVU5EOwotICAgIH0KLQotICAgIGYgPSBhcF9wZm9wZW4oci0+cG9vbCwgci0+ZmlsZW5hbWUsICJyIik7Ci0KLSAgICBpZiAoZiA9PSBOVUxMKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsCi0JCSAgICAiZmlsZSBwZXJtaXNzaW9ucyBkZW55IHNlcnZlciBhY2Nlc3M6ICVzIiwgci0+ZmlsZW5hbWUpOwotCXJldHVybiBGT1JCSURERU47Ci0gICAgfQotCi0gICAgYXBfc2Nhbl9zY3JpcHRfaGVhZGVyX2VycihyLCBmLCBOVUxMKTsKLSAgICBsb2NhdGlvbiA9IGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX291dCwgIkxvY2F0aW9uIik7Ci0KLSAgICBpZiAobG9jYXRpb24gJiYgbG9jYXRpb25bMF0gPT0gJy8nICYmCi0JKChyLT5zdGF0dXMgPT0gSFRUUF9PSykgfHwgYXBfaXNfSFRUUF9SRURJUkVDVChyLT5zdGF0dXMpKSkgewotCi0JYXBfcGZjbG9zZShyLT5wb29sLCBmKTsKLQotCS8qIEludGVybmFsIHJlZGlyZWN0IC0tIGZha2UtdXAgYSBwc2V1ZG8tcmVxdWVzdCAqLwotCXItPnN0YXR1cyA9IEhUVFBfT0s7Ci0KLQkvKiBUaGlzIHJlZGlyZWN0IG5lZWRzIHRvIGJlIGEgR0VUIG5vIG1hdHRlciB3aGF0IHRoZSBvcmlnaW5hbAotCSAqIG1ldGhvZCB3YXMuCi0JICovCi0Jci0+bWV0aG9kID0gYXBfcHN0cmR1cChyLT5wb29sLCAiR0VUIik7Ci0Jci0+bWV0aG9kX251bWJlciA9IE1fR0VUOwotCi0JYXBfaW50ZXJuYWxfcmVkaXJlY3RfaGFuZGxlcihsb2NhdGlvbiwgcik7Ci0JcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGFwX3NlbmRfaHR0cF9oZWFkZXIocik7Ci0gICAgaWYgKCFyLT5oZWFkZXJfb25seSkKLQlhcF9zZW5kX2ZkKGYsIHIpOwotCi0gICAgYXBfcGZjbG9zZShyLT5wb29sLCBmKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyBjb25zdCBoYW5kbGVyX3JlYyBhc2lzX2hhbmRsZXJzW10gPQotewotICAgIHtBU0lTX01BR0lDX1RZUEUsIGFzaXNfaGFuZGxlcn0sCi0gICAgeyJzZW5kLWFzLWlzIiwgYXNpc19oYW5kbGVyfSwKLSAgICB7TlVMTH0KLX07Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBhc2lzX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkRfTU9EVUxFX1NUVUZGLAotICAgIE5VTEwsCQkJLyogaW5pdGlhbGl6ZXIgKi8KLSAgICBOVUxMLAkJCS8qIGNyZWF0ZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLSAgICBOVUxMLAkJCS8qIG1lcmdlIHBlci1kaXJlY3RvcnkgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgICBOVUxMLAkJCS8qIGNyZWF0ZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLSAgICBOVUxMLAkJCS8qIG1lcmdlIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgICBOVUxMLAkJCS8qIGNvbW1hbmQgdGFibGUgKi8KLSAgICBhc2lzX2hhbmRsZXJzLAkJLyogaGFuZGxlcnMgKi8KLSAgICBOVUxMLAkJCS8qIHRyYW5zbGF0ZV9oYW5kbGVyICovCi0gICAgTlVMTCwJCQkvKiBjaGVja191c2VyX2lkICovCi0gICAgTlVMTCwJCQkvKiBjaGVjayBhdXRoICovCi0gICAgTlVMTCwJCQkvKiBjaGVjayBhY2Nlc3MgKi8KLSAgICBOVUxMLAkJCS8qIHR5cGVfY2hlY2tlciAqLwotICAgIE5VTEwsCQkJLyogcHJlLXJ1biBmaXh1cHMgKi8KLSAgICBOVUxMLAkJCS8qIGxvZ2dlciAqLwotICAgIE5VTEwsCQkJLyogaGVhZGVyIHBhcnNlciAqLwotICAgIE5VTEwsCQkJLyogY2hpbGRfaW5pdCAqLwotICAgIE5VTEwsCQkJLyogY2hpbGRfZXhpdCAqLwotICAgIE5VTEwJCQkvKiBwb3N0IHJlYWQtcmVxdWVzdCAqLwotfTsKZGlmZiAtLWdpdCBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfYXNpcy5kc3AgYi9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2FzaXMuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGQyYTQ3Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfYXNpcy5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJtb2RfYXNpcyIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyCi0KLUNGRz1tb2RfYXNpcyAtIFdpbjMyIFJlbGVhc2UKLSFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAibW9kX2FzaXMubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJtb2RfYXNpcy5tYWsiIENGRz0ibW9kX2FzaXMgLSBXaW4zMiBSZWxlYXNlIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgIm1vZF9hc2lzIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAibW9kX2FzaXMgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLU1UTD1taWRsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJtb2RfYXNpcyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0kgIi4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9GZCJSZWxlYXNlXG1vZF9hc2lzIiAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYXAgL21hY2hpbmU6STM4NiAvb3V0OiJSZWxlYXNlL21vZF9hc2lzLnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF9hc2lzCi0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvbWFjaGluZTpJMzg2IC9vdXQ6IlJlbGVhc2UvbW9kX2FzaXMuc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX2FzaXMKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9hc2lzIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HWCAvWmkgL09kIC9JICIuLi8uLi9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci11dGlsL2luY2x1ZGUiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRmQiRGVidWdcbW9kX2FzaXMiIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2luY3JlbWVudGFsOm5vIC9tYXAgL2RlYnVnIC9tYWNoaW5lOkkzODYgL291dDoiRGVidWcvbW9kX2FzaXMuc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX2FzaXMKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvaW5jcmVtZW50YWw6bm8gL21hcCAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJEZWJ1Zy9tb2RfYXNpcy5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfYXNpcwotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAibW9kX2FzaXMgLSBXaW4zMiBSZWxlYXNlIgotIyBOYW1lICJtb2RfYXNpcyAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2RfYXNpcy5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2RfYXNpcy5yYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXGJ1aWxkXHdpbjMyXHdpbjMydmVyLmF3awotCi0hSUYgICIkKENGRykiID09ICJtb2RfYXNpcyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQ3JlYXRpbmcgVmVyc2lvbiBSZXNvdXJjZQotSW5wdXRQYXRoPS4uXC4uXGJ1aWxkXHdpbjMyXHdpbjMydmVyLmF3awotCi0iLlxtb2RfYXNpcy5yYyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQlhd2sgLWYgLi4vLi4vYnVpbGQvd2luMzIvd2luMzJ2ZXIuYXdrIG1vZF9hc2lzICAiYXNpc19tb2R1bGUgZm9yIEFwYWNoZSIgLi4vLi4vaW5jbHVkZS9hcF9yZWxlYXNlLmggPiAuXG1vZF9hc2lzLnJjCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibW9kX2FzaXMgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBDcmVhdGluZyBWZXJzaW9uIFJlc291cmNlCi1JbnB1dFBhdGg9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSIuXG1vZF9hc2lzLnJjIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCWF3ayAtZiAuLi8uLi9idWlsZC93aW4zMi93aW4zMnZlci5hd2sgbW9kX2FzaXMgICJhc2lzX21vZHVsZSBmb3IgQXBhY2hlIiAuLi8uLi9pbmNsdWRlL2FwX3JlbGVhc2UuaCA+IC5cbW9kX2FzaXMucmMKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9hc2lzLmV4cCBiL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfYXNpcy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMzQ3ZDkuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9hc2lzLmV4cAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWFzaXNfbW9kdWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2F1dG9pbmRleC5jIGIvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9hdXRvaW5kZXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMyOGRjNC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2F1dG9pbmRleC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY3MyArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBtb2RfYXV0b2luZGV4LmM6IEhhbmRsZXMgdGhlIG9uLXRoZS1mbHkgaHRtbCBpbmRleCBnZW5lcmF0aW9uCi0gKiAKLSAqIFJvYiBNY0Nvb2wKLSAqIDMvMjMvOTMKLSAqIAotICogQWRhcHRlZCB0byBBcGFjaGUgYnkgcnN0LgotICovCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCi0jaW5jbHVkZSAiaHR0cF9wcm90b2NvbC5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiCi0jaW5jbHVkZSAidXRpbF9zY3JpcHQuaCIKLSNpbmNsdWRlICJmbm1hdGNoLmgiCi0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBhdXRvaW5kZXhfbW9kdWxlOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEhhbmRsaW5nIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcy4uLgotICovCi0KLSNkZWZpbmUgSFJVTEUgMQotI2RlZmluZSBOT19IUlVMRSAwCi0jZGVmaW5lIEZST05UX01BVFRFUiAxCi0jZGVmaW5lIEVORF9NQVRURVIgMAotCi0jZGVmaW5lIEZBTkNZX0lOREVYSU5HIDEJLyogSW5kZXhpbmcgb3B0aW9ucyAqLwotI2RlZmluZSBJQ09OU19BUkVfTElOS1MgMgotI2RlZmluZSBTQ0FOX0hUTUxfVElUTEVTIDQKLSNkZWZpbmUgU1VQUFJFU1NfTEFTVF9NT0QgOAotI2RlZmluZSBTVVBQUkVTU19TSVpFIDE2Ci0jZGVmaW5lIFNVUFBSRVNTX0RFU0MgMzIKLSNkZWZpbmUgU1VQUFJFU1NfUFJFQU1CTEUgNjQKLSNkZWZpbmUgU1VQUFJFU1NfQ09MU09SVCAxMjgKLSNkZWZpbmUgTk9fT1BUSU9OUyAyNTYKLQotI2RlZmluZSBLX1BBRCAxCi0jZGVmaW5lIEtfTk9QQUQgMAotCi0jZGVmaW5lIEtfTk9BREpVU1QgMAotI2RlZmluZSBLX0FESlVTVCAxCi0jZGVmaW5lIEtfVU5TRVQgMgotCi0vKgotICogRGVmaW5lIGtleXMgZm9yIHNvcnRpbmcuCi0gKi8KLSNkZWZpbmUgS19OQU1FICdOJwkJLyogU29ydCBieSBmaWxlIG5hbWUgKGRlZmF1bHQpICovCi0jZGVmaW5lIEtfTEFTVF9NT0QgJ00nCQkvKiBMYXN0IG1vZGlmaWNhdGlvbiBkYXRlICovCi0jZGVmaW5lIEtfU0laRSAnUycJCS8qIFNpemUgKGFic29sdXRlLCBub3QgYXMgZGlzcGxheWVkKSAqLwotI2RlZmluZSBLX0RFU0MgJ0QnCQkvKiBEZXNjcmlwdGlvbiAqLwotCi0jZGVmaW5lIERfQVNDRU5ESU5HICdBJwotI2RlZmluZSBEX0RFU0NFTkRJTkcgJ0QnCi0KLS8qCi0gKiBUaGVzZSBhcmUgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGRlZmF1bHQgaWNvbnMgc3VwcGxpZWQgd2l0aCBBcGFjaGUuCi0gKi8KLSNkZWZpbmUgREVGQVVMVF9JQ09OX1dJRFRIIDIwCi0jZGVmaW5lIERFRkFVTFRfSUNPTl9IRUlHSFQgMjIKLQotLyoKLSAqIE90aGVyIGRlZmF1bHQgZGltZW5zaW9ucy4KLSAqLwotI2RlZmluZSBERUZBVUxUX05BTUVfV0lEVEggMjMKLQotc3RydWN0IGl0ZW0gewotICAgIGNoYXIgKnR5cGU7Ci0gICAgY2hhciAqYXBwbHlfdG87Ci0gICAgY2hhciAqYXBwbHlfcGF0aDsKLSAgICBjaGFyICpkYXRhOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgYWlfZGVzY190IHsKLSAgICBjaGFyICpwYXR0ZXJuOwotICAgIGNoYXIgKmRlc2NyaXB0aW9uOwotICAgIGludCBmdWxsX3BhdGg7Ci0gICAgaW50IHdpbGRjYXJkczsKLX0gYWlfZGVzY190OwotCi10eXBlZGVmIHN0cnVjdCBhdXRvaW5kZXhfY29uZmlnX3N0cnVjdCB7Ci0KLSAgICBjaGFyICpkZWZhdWx0X2ljb247Ci0gICAgaW50IG9wdHM7Ci0gICAgaW50IGluY3JlbWVudGVkX29wdHM7Ci0gICAgaW50IGRlY3JlbWVudGVkX29wdHM7Ci0gICAgaW50IG5hbWVfd2lkdGg7Ci0gICAgaW50IG5hbWVfYWRqdXN0OwotICAgIGludCBpY29uX3dpZHRoOwotICAgIGludCBpY29uX2hlaWdodDsKLSAgICBjaGFyICpkZWZhdWx0X29yZGVyOwotCi0gICAgYXJyYXlfaGVhZGVyICppY29uX2xpc3Q7Ci0gICAgYXJyYXlfaGVhZGVyICphbHRfbGlzdDsKLSAgICBhcnJheV9oZWFkZXIgKmRlc2NfbGlzdDsKLSAgICBhcnJheV9oZWFkZXIgKmlnbl9saXN0OwotICAgIGFycmF5X2hlYWRlciAqaGRyX2xpc3Q7Ci0gICAgYXJyYXlfaGVhZGVyICpyZG1lX2xpc3Q7Ci0KLX0gYXV0b2luZGV4X2NvbmZpZ19yZWM7Ci0KLXN0YXRpYyBjaGFyIGNfYnlfZW5jb2RpbmcsIGNfYnlfdHlwZSwgY19ieV9wYXRoOwotCi0jZGVmaW5lIEJZX0VOQ09ESU5HICZjX2J5X2VuY29kaW5nCi0jZGVmaW5lIEJZX1RZUEUgJmNfYnlfdHlwZQotI2RlZmluZSBCWV9QQVRIICZjX2J5X3BhdGgKLQotLyoKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHJlZmVycyB0byB0aGUgcGFyZW50IGRpcmVjdG9yeSAoaS5lLiwKLSAqIG1hdGNoZXMgIi4uIiBvciAiLi4vIikuICBIb3BlZnVsbHkgdGhpcyBvbmUgY2FsbCBpcyBzaWduaWZpY2FudGx5IGxlc3MKLSAqIGV4cGVuc2l2ZSB0aGFuIG11bHRpcGxlIHN0cmNtcCgpIGNhbGxzLgotICovCi1zdGF0aWMgYXBfaW5saW5lIGludCBpc19wYXJlbnQoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICAvKgotICAgICAqIE5vdywgSUZGIHRoZSBmaXJzdCB0d28gYnl0ZXMgYXJlIGRvdHMsIGFuZCB0aGUgdGhpcmQgYnl0ZSBpcyBlaXRoZXIKLSAgICAgKiBFT1MgKFwwKSBvciBhIHNsYXNoIGZvbGxvd2VkIGJ5IEVPUywgd2UgaGF2ZSBhIG1hdGNoLgotICAgICAqLwotICAgIGlmICgoKG5hbWVbMF0gPT0gJy4nKSAmJiAobmFtZVsxXSA9PSAnLicpKQotCSYmICgobmFtZVsyXSA9PSAnXDAnKQotCSAgICB8fCAoKG5hbWVbMl0gPT0gJy8nKSAmJiAobmFtZVszXSA9PSAnXDAnKSkpKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBwdXRzIHRoZSBzdGFuZGFyZCBIVE1MIGhlYWRlciBhdCB0aGUgdG9wIG9mIHRoZSBpbmRleCBwYWdlLgotICogV2UgaW5jbHVkZSB0aGUgRE9DVFlQRSBiZWNhdXNlIHdlIG1heSBiZSB1c2luZyBmZWF0dXJlcyB0aGVyZWZyb20gKGkuZS4sCi0gKiBIRUlHSFQgYW5kIFdJRFRIIGF0dHJpYnV0ZXMgb24gdGhlIGljb25zIGlmIHdlJ3JlIEZhbmN5SW5kZXhpbmcpLgotICovCi1zdGF0aWMgdm9pZCBlbWl0X3ByZWFtYmxlKHJlcXVlc3RfcmVjICpyLCBjaGFyICp0aXRsZSkKLXsKLSAgICBhcF9ydnB1dHMociwgRE9DVFlQRV9IVE1MXzNfMiwKLQkgICAgICAiPEhUTUw+XG4gPEhFQUQ+XG4gIDxUSVRMRT5JbmRleCBvZiAiLCB0aXRsZSwKLQkgICAgICAiPC9USVRMRT5cbiA8L0hFQUQ+XG4gPEJPRFk+XG4iLCBOVUxMKTsKLX0KLQotc3RhdGljIHZvaWQgcHVzaF9pdGVtKGFycmF5X2hlYWRlciAqYXJyLCBjaGFyICp0eXBlLCBjaGFyICp0bywgY2hhciAqcGF0aCwKLQkJICAgICAgY2hhciAqZGF0YSkKLXsKLSAgICBzdHJ1Y3QgaXRlbSAqcCA9IChzdHJ1Y3QgaXRlbSAqKSBhcF9wdXNoX2FycmF5KGFycik7Ci0KLSAgICBpZiAoIXRvKSB7Ci0JdG8gPSAiIjsKLSAgICB9Ci0gICAgaWYgKCFwYXRoKSB7Ci0JcGF0aCA9ICIiOwotICAgIH0KLQotICAgIHAtPnR5cGUgPSB0eXBlOwotICAgIHAtPmRhdGEgPSBkYXRhID8gYXBfcHN0cmR1cChhcnItPnBvb2wsIGRhdGEpIDogTlVMTDsKLSAgICBwLT5hcHBseV9wYXRoID0gYXBfcHN0cmNhdChhcnItPnBvb2wsIHBhdGgsICIqIiwgTlVMTCk7Ci0KLSAgICBpZiAoKHR5cGUgPT0gQllfUEFUSCkgJiYgKCFhcF9pc19tYXRjaGV4cCh0bykpKSB7Ci0JcC0+YXBwbHlfdG8gPSBhcF9wc3RyY2F0KGFyci0+cG9vbCwgIioiLCB0bywgTlVMTCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHRvKSB7Ci0JcC0+YXBwbHlfdG8gPSBhcF9wc3RyZHVwKGFyci0+cG9vbCwgdG8pOwotICAgIH0KLSAgICBlbHNlIHsKLQlwLT5hcHBseV90byA9IE5VTEw7Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqYWRkX2FsdChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZCwgY2hhciAqYWx0LCBjaGFyICp0bykKLXsKLSAgICBpZiAoY21kLT5pbmZvID09IEJZX1BBVEgpIHsKLSAgICAgICAgaWYgKCFzdHJjbXAodG8sICIqKkRJUkVDVE9SWSoqIikpIHsKLQkgICAgdG8gPSAiXl5ESVJFQ1RPUlleXiI7Ci0JfQotICAgIH0KLSAgICBpZiAoY21kLT5pbmZvID09IEJZX0VOQ09ESU5HKSB7Ci0JYXBfc3RyX3RvbG93ZXIodG8pOwotICAgIH0KLQotICAgIHB1c2hfaXRlbSgoKGF1dG9pbmRleF9jb25maWdfcmVjICopIGQpLT5hbHRfbGlzdCwgY21kLT5pbmZvLCB0bywKLQkgICAgICBjbWQtPnBhdGgsIGFsdCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICphZGRfaWNvbihjbWRfcGFybXMgKmNtZCwgdm9pZCAqZCwgY2hhciAqaWNvbiwgY2hhciAqdG8pCi17Ci0gICAgY2hhciAqaWNvbmJhayA9IGFwX3BzdHJkdXAoY21kLT5wb29sLCBpY29uKTsKLQotICAgIGlmIChpY29uWzBdID09ICcoJykgewotCWNoYXIgKmFsdDsKLQljaGFyICpjbCA9IHN0cmNocihpY29uYmFrLCAnKScpOwotCi0JaWYgKGNsID09IE5VTEwpIHsKLQkgICAgcmV0dXJuICJtaXNzaW5nIGNsb3NpbmcgcGFyZW4iOwotCX0KLQlhbHQgPSBhcF9nZXR3b3JkX25jKGNtZC0+cG9vbCwgJmljb25iYWssICcsJyk7Ci0JKmNsID0gJ1wwJzsJCQkJLyogTG9zZSBjbG9zaW5nIHBhcmVuICovCi0JYWRkX2FsdChjbWQsIGQsICZhbHRbMV0sIHRvKTsKLSAgICB9Ci0gICAgaWYgKGNtZC0+aW5mbyA9PSBCWV9QQVRIKSB7Ci0gICAgICAgIGlmICghc3RyY21wKHRvLCAiKipESVJFQ1RPUlkqKiIpKSB7Ci0JICAgIHRvID0gIl5eRElSRUNUT1JZXl4iOwotCX0KLSAgICB9Ci0gICAgaWYgKGNtZC0+aW5mbyA9PSBCWV9FTkNPRElORykgewotCWFwX3N0cl90b2xvd2VyKHRvKTsKLSAgICB9Ci0KLSAgICBwdXNoX2l0ZW0oKChhdXRvaW5kZXhfY29uZmlnX3JlYyAqKSBkKS0+aWNvbl9saXN0LCBjbWQtPmluZm8sIHRvLAotCSAgICAgIGNtZC0+cGF0aCwgaWNvbmJhayk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBBZGQgZGVzY3JpcHRpb24gdGV4dCBmb3IgYSBmaWxlbmFtZSBwYXR0ZXJuLiAgSWYgdGhlIHBhdHRlcm4gaGFzCi0gKiB3aWxkY2FyZHMgYWxyZWFkeSAob3Igd2UgbmVlZCB0byBhZGQgdGhlbSksIGFkZCBsZWFkaW5nIGFuZAotICogdHJhaWxpbmcgd2lsZGNhcmRzIHRvIGl0IHRvIGVuc3VyZSBzdWJzdHJpbmcgcHJvY2Vzc2luZy4gIElmIHRoZQotICogcGF0dGVybiBjb250YWlucyBhICcvJyBhbnl3aGVyZSwgZm9yY2Ugd2lsZGNhcmQgbWF0Y2hpbmcgbW9kZSwKLSAqIGFkZCBhIHNsYXNoIHRvIHRoZSBwcmVmaXggc28gdGhhdCAiYmFyL2JsZXRjaCIgd29uJ3QgYmUgbWF0Y2hlZAotICogYnkgImZvb2Jhci9ibGV0Y2giLCBhbmQgbWFrZSBhIG5vdGUgdGhhdCB0aGVyZSdzIGEgZGVsaW1pdGVyOwotICogdGhlIG1hdGNoaW5nIHJvdXRpbmUgc2ltcGxpZmllcyB0byBqdXN0IHRoZSBhY3R1YWwgZmlsZW5hbWUKLSAqIHdoZW5ldmVyIGl0IGNhbi4gIFRoaXMgYWxsb3dzIGRlZmluaXRpb25zIGluIHBhcmVudCBkaXJlY3RvcmllcwotICogdG8gYmUgbWFkZSBmb3IgZmlsZXMgaW4gc3Vib3JkaW5hdGUgb25lcyB1c2luZyByZWxhdGl2ZSBwYXRocy4KLSAqLwotCi0vKgotICogQWJzZW50IGEgc3RyY2FzZXN0cigpIGZ1bmN0aW9uLCB3ZSBoYXZlIHRvIGZvcmNlIHdpbGRjYXJkcyBvbgotICogc3lzdGVtcyBmb3Igd2hpY2ggIkFBQSIgYW5kICJhYWEiIG1lYW4gdGhlIHNhbWUgZmlsZS4KLSAqLwotI2lmZGVmIENBU0VfQkxJTkRfRklMRVNZU1RFTQotI2RlZmluZSBXSUxEQ0FSRFNfUkVRVUlSRUQgMQotI2Vsc2UKLSNkZWZpbmUgV0lMRENBUkRTX1JFUVVJUkVEIDAKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgY2hhciAqYWRkX2Rlc2MoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmQsIGNoYXIgKmRlc2MsIGNoYXIgKnRvKQotewotICAgIGF1dG9pbmRleF9jb25maWdfcmVjICpkY2ZnID0gKGF1dG9pbmRleF9jb25maWdfcmVjICopIGQ7Ci0gICAgYWlfZGVzY190ICpkZXNjX2VudHJ5OwotICAgIGNoYXIgKnByZWZpeCA9ICIiOwotCi0gICAgZGVzY19lbnRyeSA9IChhaV9kZXNjX3QgKikgYXBfcHVzaF9hcnJheShkY2ZnLT5kZXNjX2xpc3QpOwotICAgIGRlc2NfZW50cnktPmZ1bGxfcGF0aCA9IChzdHJjaHIodG8sICcvJykgPT0gTlVMTCkgPyAwIDogMTsKLSAgICBkZXNjX2VudHJ5LT53aWxkY2FyZHMgPSAoV0lMRENBUkRTX1JFUVVJUkVECi0JCQkgICAgIHx8IGRlc2NfZW50cnktPmZ1bGxfcGF0aAotCQkJICAgICB8fCBhcF9pc19mbm1hdGNoKHRvKSk7Ci0gICAgaWYgKGRlc2NfZW50cnktPndpbGRjYXJkcykgewotCXByZWZpeCA9IGRlc2NfZW50cnktPmZ1bGxfcGF0aCA/ICIqLyIgOiAiKiI7Ci0JZGVzY19lbnRyeS0+cGF0dGVybiA9IGFwX3BzdHJjYXQoZGNmZy0+ZGVzY19saXN0LT5wb29sLAotCQkJCQkgcHJlZml4LCB0bywgIioiLCBOVUxMKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JZGVzY19lbnRyeS0+cGF0dGVybiA9IGFwX3BzdHJkdXAoZGNmZy0+ZGVzY19saXN0LT5wb29sLCB0byk7Ci0gICAgfQotICAgIGRlc2NfZW50cnktPmRlc2NyaXB0aW9uID0gYXBfcHN0cmR1cChkY2ZnLT5kZXNjX2xpc3QtPnBvb2wsIGRlc2MpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqYWRkX2lnbm9yZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqZCwgY2hhciAqZXh0KQotewotICAgIHB1c2hfaXRlbSgoKGF1dG9pbmRleF9jb25maWdfcmVjICopIGQpLT5pZ25fbGlzdCwgMCwgZXh0LCBjbWQtPnBhdGgsIE5VTEwpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqYWRkX2hlYWRlcihjbWRfcGFybXMgKmNtZCwgdm9pZCAqZCwgY2hhciAqbmFtZSkKLXsKLSAgICBwdXNoX2l0ZW0oKChhdXRvaW5kZXhfY29uZmlnX3JlYyAqKSBkKS0+aGRyX2xpc3QsIDAsIE5VTEwsIGNtZC0+cGF0aCwKLQkgICAgICBuYW1lKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmFkZF9yZWFkbWUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmQsIGNoYXIgKm5hbWUpCi17Ci0gICAgcHVzaF9pdGVtKCgoYXV0b2luZGV4X2NvbmZpZ19yZWMgKikgZCktPnJkbWVfbGlzdCwgMCwgTlVMTCwgY21kLT5wYXRoLAotCSAgICAgIG5hbWUpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKiBBIGxlZ2FjeSBkaXJlY3RpdmUsIEZhbmN5SW5kZXhpbmcgaXMgc3VwZXJzZWRlZCBieSB0aGUgSW5kZXhPcHRpb25zCi0gKiBrZXl3b3JkLiAgQnV0IGZvciBjb21wYXRpYmlsaXR5Li4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmZhbmN5X2luZGV4aW5nKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkLCBpbnQgYXJnKQotewotICAgIGludCBjdXJvcHRzOwotICAgIGludCBuZXdvcHRzOwotICAgIGF1dG9pbmRleF9jb25maWdfcmVjICpjZmc7Ci0KLSAgICBjZmcgPSAoYXV0b2luZGV4X2NvbmZpZ19yZWMgKikgZDsKLSAgICBjdXJvcHRzID0gY2ZnLT5vcHRzOwotICAgIGlmIChjdXJvcHRzICYgTk9fT1BUSU9OUykgewotCXJldHVybiAiRmFuY3lJbmRleGluZyBkaXJlY3RpdmUgY29uZmxpY3RzIHdpdGggZXhpc3RpbmcgIgotCSAgICAgICAiSW5kZXhPcHRpb25zIE5vbmUiOwotICAgIH0KLSAgICBuZXdvcHRzID0gKGFyZyA/IChjdXJvcHRzIHwgRkFOQ1lfSU5ERVhJTkcpIDogKGN1cm9wdHMgJiB+RkFOQ1lfSU5ERVhJTkcpKTsKLSAgICBjZmctPm9wdHMgPSBuZXdvcHRzOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqYWRkX29wdHMoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmQsIGNvbnN0IGNoYXIgKm9wdHN0cikKLXsKLSAgICBjaGFyICp3OwotICAgIGludCBvcHRzOwotICAgIGludCBvcHRzX2FkZDsKLSAgICBpbnQgb3B0c19yZW1vdmU7Ci0gICAgY2hhciBhY3Rpb247Ci0gICAgYXV0b2luZGV4X2NvbmZpZ19yZWMgKmRfY2ZnID0gKGF1dG9pbmRleF9jb25maWdfcmVjICopIGQ7Ci0KLSAgICBvcHRzID0gZF9jZmctPm9wdHM7Ci0gICAgb3B0c19hZGQgPSBkX2NmZy0+aW5jcmVtZW50ZWRfb3B0czsKLSAgICBvcHRzX3JlbW92ZSA9IGRfY2ZnLT5kZWNyZW1lbnRlZF9vcHRzOwotICAgIHdoaWxlIChvcHRzdHJbMF0pIHsKLQlpbnQgb3B0aW9uID0gMDsKLQotCXcgPSBhcF9nZXR3b3JkX2NvbmYoY21kLT5wb29sLCAmb3B0c3RyKTsKLQlpZiAoKCp3ID09ICcrJykgfHwgKCp3ID09ICctJykpIHsKLQkgICAgYWN0aW9uID0gKih3KyspOwotCX0KLQllbHNlIHsKLQkgICAgYWN0aW9uID0gJ1wwJzsKLQl9Ci0JaWYgKCFzdHJjYXNlY21wKHcsICJGYW5jeUluZGV4aW5nIikpIHsKLQkgICAgb3B0aW9uID0gRkFOQ1lfSU5ERVhJTkc7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJJY29uc0FyZUxpbmtzIikpIHsKLQkgICAgb3B0aW9uID0gSUNPTlNfQVJFX0xJTktTOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiU2NhbkhUTUxUaXRsZXMiKSkgewotCSAgICBvcHRpb24gPSBTQ0FOX0hUTUxfVElUTEVTOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiU3VwcHJlc3NMYXN0TW9kaWZpZWQiKSkgewotCSAgICBvcHRpb24gPSBTVVBQUkVTU19MQVNUX01PRDsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIlN1cHByZXNzU2l6ZSIpKSB7Ci0JICAgIG9wdGlvbiA9IFNVUFBSRVNTX1NJWkU7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJTdXBwcmVzc0Rlc2NyaXB0aW9uIikpIHsKLQkgICAgb3B0aW9uID0gU1VQUFJFU1NfREVTQzsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIlN1cHByZXNzSFRNTFByZWFtYmxlIikpIHsKLQkgICAgb3B0aW9uID0gU1VQUFJFU1NfUFJFQU1CTEU7Ci0JfQotICAgICAgICBlbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiU3VwcHJlc3NDb2x1bW5Tb3J0aW5nIikpIHsKLSAgICAgICAgICAgIG9wdGlvbiA9IFNVUFBSRVNTX0NPTFNPUlQ7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJOb25lIikpIHsKLQkgICAgaWYgKGFjdGlvbiAhPSAnXDAnKSB7Ci0JCXJldHVybiAiQ2Fubm90IGNvbWJpbmUgJysnIG9yICctJyB3aXRoICdOb25lJyBrZXl3b3JkIjsKLQkgICAgfQotCSAgICBvcHRzID0gTk9fT1BUSU9OUzsKLQkgICAgb3B0c19hZGQgPSAwOwotCSAgICBvcHRzX3JlbW92ZSA9IDA7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJJY29uV2lkdGgiKSkgewotCSAgICBpZiAoYWN0aW9uICE9ICctJykgewotCQlkX2NmZy0+aWNvbl93aWR0aCA9IERFRkFVTFRfSUNPTl9XSURUSDsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJZF9jZmctPmljb25fd2lkdGggPSAwOwotCSAgICB9Ci0JfQotCWVsc2UgaWYgKCFzdHJuY2FzZWNtcCh3LCAiSWNvbldpZHRoPSIsIDEwKSkgewotCSAgICBpZiAoYWN0aW9uID09ICctJykgewotCQlyZXR1cm4gIkNhbm5vdCBjb21iaW5lICctJyB3aXRoIEljb25XaWR0aD1uIjsKLQkgICAgfQotCSAgICBkX2NmZy0+aWNvbl93aWR0aCA9IGF0b2koJndbMTBdKTsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIkljb25IZWlnaHQiKSkgewotCSAgICBpZiAoYWN0aW9uICE9ICctJykgewotCQlkX2NmZy0+aWNvbl9oZWlnaHQgPSBERUZBVUxUX0lDT05fSEVJR0hUOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQlkX2NmZy0+aWNvbl9oZWlnaHQgPSAwOwotCSAgICB9Ci0JfQotCWVsc2UgaWYgKCFzdHJuY2FzZWNtcCh3LCAiSWNvbkhlaWdodD0iLCAxMSkpIHsKLQkgICAgaWYgKGFjdGlvbiA9PSAnLScpIHsKLQkJcmV0dXJuICJDYW5ub3QgY29tYmluZSAnLScgd2l0aCBJY29uSGVpZ2h0PW4iOwotCSAgICB9Ci0JICAgIGRfY2ZnLT5pY29uX2hlaWdodCA9IGF0b2koJndbMTFdKTsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIk5hbWVXaWR0aCIpKSB7Ci0JICAgIGlmIChhY3Rpb24gIT0gJy0nKSB7Ci0JCXJldHVybiAiTmFtZVdpZHRoIHdpdGggbm8gdmFsdWUgbWF5IG9ubHkgYXBwZWFyIGFzICIKLQkJICAgICAgICInLU5hbWVXaWR0aCciOwotCSAgICB9Ci0JICAgIGRfY2ZnLT5uYW1lX3dpZHRoID0gREVGQVVMVF9OQU1FX1dJRFRIOwotCSAgICBkX2NmZy0+bmFtZV9hZGp1c3QgPSBLX05PQURKVVNUOwotCX0KLQllbHNlIGlmICghc3RybmNhc2VjbXAodywgIk5hbWVXaWR0aD0iLCAxMCkpIHsKLQkgICAgaWYgKGFjdGlvbiA9PSAnLScpIHsKLQkJcmV0dXJuICJDYW5ub3QgY29tYmluZSAnLScgd2l0aCBOYW1lV2lkdGg9biI7Ci0JICAgIH0KLQkgICAgaWYgKHdbMTBdID09ICcqJykgewotCQlkX2NmZy0+bmFtZV9hZGp1c3QgPSBLX0FESlVTVDsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJaW50IHdpZHRoID0gYXRvaSgmd1sxMF0pOwotCi0JCWlmICh3aWR0aCA8IDUpIHsKLQkJICAgIHJldHVybiAiTmFtZVdpZHRoIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDUiOwotCQl9Ci0JCWRfY2ZnLT5uYW1lX3dpZHRoID0gd2lkdGg7Ci0JCWRfY2ZnLT5uYW1lX2FkanVzdCA9IEtfTk9BREpVU1Q7Ci0JICAgIH0KLQl9Ci0JZWxzZSB7Ci0JICAgIHJldHVybiAiSW52YWxpZCBkaXJlY3RvcnkgaW5kZXhpbmcgb3B0aW9uIjsKLQl9Ci0JaWYgKGFjdGlvbiA9PSAnXDAnKSB7Ci0JICAgIG9wdHMgfD0gb3B0aW9uOwotCSAgICBvcHRzX2FkZCA9IDA7Ci0JICAgIG9wdHNfcmVtb3ZlID0gMDsKLQl9Ci0JZWxzZSBpZiAoYWN0aW9uID09ICcrJykgewotCSAgICBvcHRzX2FkZCB8PSBvcHRpb247Ci0JICAgIG9wdHNfcmVtb3ZlICY9IH5vcHRpb247Ci0JfQotCWVsc2UgewotCSAgICBvcHRzX3JlbW92ZSB8PSBvcHRpb247Ci0JICAgIG9wdHNfYWRkICY9IH5vcHRpb247Ci0JfQotICAgIH0KLSAgICBpZiAoKG9wdHMgJiBOT19PUFRJT05TKSAmJiAob3B0cyAmIH5OT19PUFRJT05TKSkgewotCXJldHVybiAiQ2Fubm90IGNvbWJpbmUgb3RoZXIgSW5kZXhPcHRpb25zIGtleXdvcmRzIHdpdGggJ05vbmUnIjsKLSAgICB9Ci0gICAgZF9jZmctPmluY3JlbWVudGVkX29wdHMgPSBvcHRzX2FkZDsKLSAgICBkX2NmZy0+ZGVjcmVtZW50ZWRfb3B0cyA9IG9wdHNfcmVtb3ZlOwotICAgIGRfY2ZnLT5vcHRzID0gb3B0czsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9kZWZhdWx0X29yZGVyKGNtZF9wYXJtcyAqY21kLCB2b2lkICptLCBjaGFyICpkaXJlY3Rpb24sCi0JCQkJICAgICBjaGFyICprZXkpCi17Ci0gICAgY2hhciB0ZW1wWzRdOwotICAgIGF1dG9pbmRleF9jb25maWdfcmVjICpkX2NmZyA9IChhdXRvaW5kZXhfY29uZmlnX3JlYyAqKSBtOwotCi0gICAgYXBfY3B5c3Rybih0ZW1wLCAiaz1kIiwgc2l6ZW9mKHRlbXApKTsKLSAgICBpZiAoIXN0cmNhc2VjbXAoZGlyZWN0aW9uLCAiQXNjZW5kaW5nIikpIHsKLQl0ZW1wWzJdID0gRF9BU0NFTkRJTkc7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGRpcmVjdGlvbiwgIkRlc2NlbmRpbmciKSkgewotCXRlbXBbMl0gPSBEX0RFU0NFTkRJTkc7Ci0gICAgfQotICAgIGVsc2UgewotCXJldHVybiAiRmlyc3Qga2V5d29yZCBtdXN0IGJlICdBc2NlbmRpbmcnIG9yICdEZXNjZW5kaW5nJyI7Ci0gICAgfQotCi0gICAgaWYgKCFzdHJjYXNlY21wKGtleSwgIk5hbWUiKSkgewotCXRlbXBbMF0gPSBLX05BTUU7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGtleSwgIkRhdGUiKSkgewotCXRlbXBbMF0gPSBLX0xBU1RfTU9EOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY2FzZWNtcChrZXksICJTaXplIikpIHsKLQl0ZW1wWzBdID0gS19TSVpFOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY2FzZWNtcChrZXksICJEZXNjcmlwdGlvbiIpKSB7Ci0JdGVtcFswXSA9IEtfREVTQzsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JcmV0dXJuICJTZWNvbmQga2V5d29yZCBtdXN0IGJlICdOYW1lJywgJ0RhdGUnLCAnU2l6ZScsIG9yICIKLQkgICAgIidEZXNjcmlwdGlvbiciOwotICAgIH0KLQotICAgIGlmIChkX2NmZy0+ZGVmYXVsdF9vcmRlciA9PSBOVUxMKSB7Ci0JZF9jZmctPmRlZmF1bHRfb3JkZXIgPSBhcF9wYWxsb2MoY21kLT5wb29sLCA0KTsKLQlkX2NmZy0+ZGVmYXVsdF9vcmRlclszXSA9ICdcMCc7Ci0gICAgfQotICAgIGFwX2NweXN0cm4oZF9jZmctPmRlZmF1bHRfb3JkZXIsIHRlbXAsIHNpemVvZih0ZW1wKSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNkZWZpbmUgRElSX0NNRF9QRVJNUyBPUl9JTkRFWEVTCi0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBhdXRvaW5kZXhfY21kc1tdID0KLXsKLSAgICB7IkFkZEljb24iLCBhZGRfaWNvbiwgQllfUEFUSCwgRElSX0NNRF9QRVJNUywgSVRFUkFURTIsCi0gICAgICJhbiBpY29uIFVSTCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBmaWxlbmFtZXMifSwKLSAgICB7IkFkZEljb25CeVR5cGUiLCBhZGRfaWNvbiwgQllfVFlQRSwgRElSX0NNRF9QRVJNUywgSVRFUkFURTIsCi0gICAgICJhbiBpY29uIFVSTCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBNSU1FIHR5cGVzIn0sCi0gICAgeyJBZGRJY29uQnlFbmNvZGluZyIsIGFkZF9pY29uLCBCWV9FTkNPRElORywgRElSX0NNRF9QRVJNUywgSVRFUkFURTIsCi0gICAgICJhbiBpY29uIFVSTCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBjb250ZW50IGVuY29kaW5ncyJ9LAotICAgIHsiQWRkQWx0IiwgYWRkX2FsdCwgQllfUEFUSCwgRElSX0NNRF9QRVJNUywgSVRFUkFURTIsCi0gICAgICJhbHRlcm5hdGUgZGVzY3JpcHRpdmUgdGV4dCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBmaWxlbmFtZXMifSwKLSAgICB7IkFkZEFsdEJ5VHlwZSIsIGFkZF9hbHQsIEJZX1RZUEUsIERJUl9DTURfUEVSTVMsIElURVJBVEUyLAotICAgICAiYWx0ZXJuYXRlIGRlc2NyaXB0aXZlIHRleHQgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgTUlNRSB0eXBlcyJ9LAotICAgIHsiQWRkQWx0QnlFbmNvZGluZyIsIGFkZF9hbHQsIEJZX0VOQ09ESU5HLCBESVJfQ01EX1BFUk1TLCBJVEVSQVRFMiwKLSAgICAgImFsdGVybmF0ZSBkZXNjcmlwdGl2ZSB0ZXh0IGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGNvbnRlbnQgZW5jb2RpbmdzIn0sCi0gICAgeyJJbmRleE9wdGlvbnMiLCBhZGRfb3B0cywgTlVMTCwgRElSX0NNRF9QRVJNUywgUkFXX0FSR1MsCi0gICAgICJvbmUgb3IgbW9yZSBpbmRleCBvcHRpb25zIn0sCi0gICAgeyJJbmRleE9yZGVyRGVmYXVsdCIsIHNldF9kZWZhdWx0X29yZGVyLCBOVUxMLCBESVJfQ01EX1BFUk1TLCBUQUtFMiwKLSAgICAgIntBc2NlbmRpbmcsRGVzY2VuZGluZ30ge05hbWUsU2l6ZSxEZXNjcmlwdGlvbixEYXRlfSJ9LAotICAgIHsiSW5kZXhJZ25vcmUiLCBhZGRfaWdub3JlLCBOVUxMLCBESVJfQ01EX1BFUk1TLCBJVEVSQVRFLAotICAgICAib25lIG9yIG1vcmUgZmlsZSBleHRlbnNpb25zIn0sCi0gICAgeyJBZGREZXNjcmlwdGlvbiIsIGFkZF9kZXNjLCBCWV9QQVRILCBESVJfQ01EX1BFUk1TLCBJVEVSQVRFMiwKLSAgICAgIkRlc2NyaXB0aXZlIHRleHQgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgZmlsZW5hbWVzIn0sCi0gICAgeyJIZWFkZXJOYW1lIiwgYWRkX2hlYWRlciwgTlVMTCwgRElSX0NNRF9QRVJNUywgVEFLRTEsICJhIGZpbGVuYW1lIn0sCi0gICAgeyJSZWFkbWVOYW1lIiwgYWRkX3JlYWRtZSwgTlVMTCwgRElSX0NNRF9QRVJNUywgVEFLRTEsICJhIGZpbGVuYW1lIn0sCi0gICAgeyJGYW5jeUluZGV4aW5nIiwgZmFuY3lfaW5kZXhpbmcsIE5VTEwsIERJUl9DTURfUEVSTVMsIEZMQUcsCi0gICAgICJMaW1pdGVkIHRvICdvbicgb3IgJ29mZicgKHN1cGVyc2VkZWQgYnkgSW5kZXhPcHRpb25zIEZhbmN5SW5kZXhpbmcpIn0sCi0gICAgeyJEZWZhdWx0SWNvbiIsIGFwX3NldF9zdHJpbmdfc2xvdCwKLSAgICAgKHZvaWQgKikgWHRPZmZzZXRPZihhdXRvaW5kZXhfY29uZmlnX3JlYywgZGVmYXVsdF9pY29uKSwKLSAgICAgRElSX0NNRF9QRVJNUywgVEFLRTEsICJhbiBpY29uIFVSTCJ9LAotICAgIHtOVUxMfQotfTsKLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9hdXRvaW5kZXhfY29uZmlnKHBvb2wgKnAsIGNoYXIgKmR1bW15KQotewotICAgIGF1dG9pbmRleF9jb25maWdfcmVjICpuZXcgPQotICAgIChhdXRvaW5kZXhfY29uZmlnX3JlYyAqKSBhcF9wY2FsbG9jKHAsIHNpemVvZihhdXRvaW5kZXhfY29uZmlnX3JlYykpOwotCi0gICAgbmV3LT5pY29uX3dpZHRoID0gMDsKLSAgICBuZXctPmljb25faGVpZ2h0ID0gMDsKLSAgICBuZXctPm5hbWVfd2lkdGggPSBERUZBVUxUX05BTUVfV0lEVEg7Ci0gICAgbmV3LT5uYW1lX2FkanVzdCA9IEtfVU5TRVQ7Ci0gICAgbmV3LT5pY29uX2xpc3QgPSBhcF9tYWtlX2FycmF5KHAsIDQsIHNpemVvZihzdHJ1Y3QgaXRlbSkpOwotICAgIG5ldy0+YWx0X2xpc3QgPSBhcF9tYWtlX2FycmF5KHAsIDQsIHNpemVvZihzdHJ1Y3QgaXRlbSkpOwotICAgIG5ldy0+ZGVzY19saXN0ID0gYXBfbWFrZV9hcnJheShwLCA0LCBzaXplb2YoYWlfZGVzY190KSk7Ci0gICAgbmV3LT5pZ25fbGlzdCA9IGFwX21ha2VfYXJyYXkocCwgNCwgc2l6ZW9mKHN0cnVjdCBpdGVtKSk7Ci0gICAgbmV3LT5oZHJfbGlzdCA9IGFwX21ha2VfYXJyYXkocCwgNCwgc2l6ZW9mKHN0cnVjdCBpdGVtKSk7Ci0gICAgbmV3LT5yZG1lX2xpc3QgPSBhcF9tYWtlX2FycmF5KHAsIDQsIHNpemVvZihzdHJ1Y3QgaXRlbSkpOwotICAgIG5ldy0+b3B0cyA9IDA7Ci0gICAgbmV3LT5pbmNyZW1lbnRlZF9vcHRzID0gMDsKLSAgICBuZXctPmRlY3JlbWVudGVkX29wdHMgPSAwOwotICAgIG5ldy0+ZGVmYXVsdF9vcmRlciA9IE5VTEw7Ci0KLSAgICByZXR1cm4gKHZvaWQgKikgbmV3OwotfQotCi1zdGF0aWMgdm9pZCAqbWVyZ2VfYXV0b2luZGV4X2NvbmZpZ3MocG9vbCAqcCwgdm9pZCAqYmFzZXYsIHZvaWQgKmFkZHYpCi17Ci0gICAgYXV0b2luZGV4X2NvbmZpZ19yZWMgKm5ldzsKLSAgICBhdXRvaW5kZXhfY29uZmlnX3JlYyAqYmFzZSA9IChhdXRvaW5kZXhfY29uZmlnX3JlYyAqKSBiYXNldjsKLSAgICBhdXRvaW5kZXhfY29uZmlnX3JlYyAqYWRkID0gKGF1dG9pbmRleF9jb25maWdfcmVjICopIGFkZHY7Ci0KLSAgICBuZXcgPSAoYXV0b2luZGV4X2NvbmZpZ19yZWMgKikgYXBfcGNhbGxvYyhwLCBzaXplb2YoYXV0b2luZGV4X2NvbmZpZ19yZWMpKTsKLSAgICBuZXctPmRlZmF1bHRfaWNvbiA9IGFkZC0+ZGVmYXVsdF9pY29uID8gYWRkLT5kZWZhdWx0X2ljb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYmFzZS0+ZGVmYXVsdF9pY29uOwotICAgIG5ldy0+aWNvbl9oZWlnaHQgPSBhZGQtPmljb25faGVpZ2h0ID8gYWRkLT5pY29uX2hlaWdodCA6IGJhc2UtPmljb25faGVpZ2h0OwotICAgIG5ldy0+aWNvbl93aWR0aCA9IGFkZC0+aWNvbl93aWR0aCA/IGFkZC0+aWNvbl93aWR0aCA6IGJhc2UtPmljb25fd2lkdGg7Ci0KLSAgICBuZXctPmFsdF9saXN0ID0gYXBfYXBwZW5kX2FycmF5cyhwLCBhZGQtPmFsdF9saXN0LCBiYXNlLT5hbHRfbGlzdCk7Ci0gICAgbmV3LT5pZ25fbGlzdCA9IGFwX2FwcGVuZF9hcnJheXMocCwgYWRkLT5pZ25fbGlzdCwgYmFzZS0+aWduX2xpc3QpOwotICAgIG5ldy0+aGRyX2xpc3QgPSBhcF9hcHBlbmRfYXJyYXlzKHAsIGFkZC0+aGRyX2xpc3QsIGJhc2UtPmhkcl9saXN0KTsKLSAgICBuZXctPmRlc2NfbGlzdCA9IGFwX2FwcGVuZF9hcnJheXMocCwgYWRkLT5kZXNjX2xpc3QsIGJhc2UtPmRlc2NfbGlzdCk7Ci0gICAgbmV3LT5pY29uX2xpc3QgPSBhcF9hcHBlbmRfYXJyYXlzKHAsIGFkZC0+aWNvbl9saXN0LCBiYXNlLT5pY29uX2xpc3QpOwotICAgIG5ldy0+cmRtZV9saXN0ID0gYXBfYXBwZW5kX2FycmF5cyhwLCBhZGQtPnJkbWVfbGlzdCwgYmFzZS0+cmRtZV9saXN0KTsKLSAgICBpZiAoYWRkLT5vcHRzICYgTk9fT1BUSU9OUykgewotCS8qCi0JICogSWYgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHNheXMgJ25vIG9wdGlvbnMnIHRoZW4gd2UgYWxzbwotCSAqIGNsZWFyIGFueSBpbmNyZW1lbnRhbCBtb2RzIGZyb20gYmVpbmcgaW5oZXJpdGFibGUgZnVydGhlciBkb3duLgotCSAqLwotCW5ldy0+b3B0cyA9IE5PX09QVElPTlM7Ci0JbmV3LT5pbmNyZW1lbnRlZF9vcHRzID0gMDsKLQluZXctPmRlY3JlbWVudGVkX29wdHMgPSAwOwotICAgIH0KLSAgICBlbHNlIHsKLQkvKgotCSAqIElmIHRoZXJlIHdlcmUgYW55IG5vbi1pbmNyZW1lbnRhbCBvcHRpb25zIHNlbGVjdGVkIGZvcgotCSAqIHRoaXMgZGlyZWN0b3J5LCB0aGV5IGRvbWluYXRlIGFuZCB3ZSBkb24ndCBpbmhlcml0ICphbnl0aGluZy4qCi0JICogQ29udHJhcml3aXNlLCB3ZSAqZG8qIGluaGVyaXQgaWYgdGhlIG9ubHkgc2V0dGluZ3MgaGVyZSBhcmUKLQkgKiBpbmNyZW1lbnRhbCBvbmVzLgotCSAqLwotCWlmIChhZGQtPm9wdHMgPT0gMCkgewotCSAgICBuZXctPmluY3JlbWVudGVkX29wdHMgPSAoYmFzZS0+aW5jcmVtZW50ZWRfb3B0cyAKLQkJCQkgICAgIHwgYWRkLT5pbmNyZW1lbnRlZF9vcHRzKQotCQkgICAgICAgICAgICAgICAgICAgICYgfmFkZC0+ZGVjcmVtZW50ZWRfb3B0czsKLQkgICAgbmV3LT5kZWNyZW1lbnRlZF9vcHRzID0gKGJhc2UtPmRlY3JlbWVudGVkX29wdHMKLQkJCQkgICAgIHwgYWRkLT5kZWNyZW1lbnRlZF9vcHRzKTsKLQkgICAgLyoKLQkgICAgICogV2UgbWF5IGhhdmUgaW5jcmVtZW50YWwgc2V0dGluZ3MsIHNvIG1ha2Ugc3VyZSB3ZSBkb24ndAotCSAgICAgKiBpbmFkdmVydGVudGx5IGluaGVyaXQgYW4gSW5kZXhPcHRpb25zIE5vbmUgZnJvbSBhYm92ZS4KLQkgICAgICovCi0JICAgIG5ldy0+b3B0cyA9IChiYXNlLT5vcHRzICYgfk5PX09QVElPTlMpOwotCX0KLQllbHNlIHsKLQkgICAgLyoKLQkgICAgICogVGhlcmUgYXJlIGxvY2FsIG5vbi1pbmNyZW1lbnRhbCBzZXR0aW5ncywgd2hpY2ggY2xlYXIKLQkgICAgICogYWxsIGluaGVyaXRhbmNlIGZyb20gYWJvdmUuICBUaGV5ICphcmUqIHRoZSBuZXcgYmFzZSBzZXR0aW5ncy4KLQkgICAgICovCi0JICAgIG5ldy0+b3B0cyA9IGFkZC0+b3B0czs7Ci0JfQotCS8qCi0JICogV2UncmUgZ3VhcmFudGVlZCB0aGF0IHRoZXJlJ2xsIGJlIG5vIG92ZXJsYXAgYmV0d2VlbgotCSAqIHRoZSBhZGQtb3B0aW9ucyBhbmQgdGhlIHJlbW92ZS1vcHRpb25zLgotCSAqLwotCW5ldy0+b3B0cyB8PSBuZXctPmluY3JlbWVudGVkX29wdHM7Ci0JbmV3LT5vcHRzICY9IH5uZXctPmRlY3JlbWVudGVkX29wdHM7Ci0gICAgfQotICAgIC8qCi0gICAgICogSW5oZXJpdCB0aGUgTmFtZVdpZHRoIHNldHRpbmdzIGlmIHRoZXJlIGFyZW4ndCBhbnkgc3BlY2lmaWMgdG8KLSAgICAgKiB0aGUgbmV3IGxvY2F0aW9uOyBvdGhlcndpc2Ugd2UnbGwgZW5kIHVwIHVzaW5nIHRoZSBkZWZhdWx0cyBzZXQgaW4gdGhlCi0gICAgICogY29uZmlnLXJlYyBjcmVhdGlvbiByb3V0aW5lLgotICAgICAqLwotICAgIGlmIChhZGQtPm5hbWVfYWRqdXN0ID09IEtfVU5TRVQpIHsKLQluZXctPm5hbWVfd2lkdGggPSBiYXNlLT5uYW1lX3dpZHRoOwotCW5ldy0+bmFtZV9hZGp1c3QgPSBiYXNlLT5uYW1lX2FkanVzdDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JbmV3LT5uYW1lX3dpZHRoID0gYWRkLT5uYW1lX3dpZHRoOwotCW5ldy0+bmFtZV9hZGp1c3QgPSBhZGQtPm5hbWVfYWRqdXN0OwotICAgIH0KLQotICAgIG5ldy0+ZGVmYXVsdF9vcmRlciA9IChhZGQtPmRlZmF1bHRfb3JkZXIgIT0gTlVMTCkKLQk/IGFkZC0+ZGVmYXVsdF9vcmRlciA6IGJhc2UtPmRlZmF1bHRfb3JkZXI7Ci0gICAgcmV0dXJuIG5ldzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBMb29raW5nIHRoaW5ncyB1cCBpbiBjb25maWcgZW50cmllcy4uLgotICovCi0KLS8qIFN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgZW50cmllcyB3aGVuIHdlJ3JlIGFjdHVhbGx5IGJ1aWxkaW5nIGFuIGluZGV4ICovCi0KLXN0cnVjdCBlbnQgewotICAgIGNoYXIgKm5hbWU7Ci0gICAgY2hhciAqaWNvbjsKLSAgICBjaGFyICphbHQ7Ci0gICAgY2hhciAqZGVzYzsKLSAgICBvZmZfdCBzaXplOwotICAgIHRpbWVfdCBsbTsKLSAgICBzdHJ1Y3QgZW50ICpuZXh0OwotICAgIGludCBhc2NlbmRpbmc7Ci0gICAgY2hhciBrZXk7Ci19OwotCi1zdGF0aWMgY2hhciAqZmluZF9pdGVtKHJlcXVlc3RfcmVjICpyLCBhcnJheV9oZWFkZXIgKmxpc3QsIGludCBwYXRoX29ubHkpCi17Ci0gICAgY29uc3QgY2hhciAqY29udGVudF90eXBlID0gci0+Y29udGVudF90eXBlOwotICAgIGNvbnN0IGNoYXIgKmNvbnRlbnRfZW5jb2RpbmcgPSByLT5jb250ZW50X2VuY29kaW5nOwotICAgIGNoYXIgKnBhdGggPSByLT5maWxlbmFtZTsKLQotICAgIHN0cnVjdCBpdGVtICppdGVtcyA9IChzdHJ1Y3QgaXRlbSAqKSBsaXN0LT5lbHRzOwotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGxpc3QtPm5lbHRzOyArK2kpIHsKLQlzdHJ1Y3QgaXRlbSAqcCA9ICZpdGVtc1tpXTsKLQotCS8qIFNwZWNpYWwgY2FzZWQgZm9yIF5eRElSRUNUT1JZXl4gYW5kIF5eQkxBTktJQ09OXl4gKi8KLQlpZiAoKHBhdGhbMF0gPT0gJ14nKSB8fCAoIWFwX3N0cmNtcF9tYXRjaChwYXRoLCBwLT5hcHBseV9wYXRoKSkpIHsKLQkgICAgaWYgKCEqKHAtPmFwcGx5X3RvKSkgewotCQlyZXR1cm4gcC0+ZGF0YTsKLQkgICAgfQotCSAgICBlbHNlIGlmIChwLT50eXBlID09IEJZX1BBVEggfHwgcGF0aFswXSA9PSAnXicpIHsKLQkgICAgICAgIGlmICghYXBfc3RyY21wX21hdGNoKHBhdGgsIHAtPmFwcGx5X3RvKSkgewotCQkgICAgcmV0dXJuIHAtPmRhdGE7Ci0JCX0KLQkgICAgfQotCSAgICBlbHNlIGlmICghcGF0aF9vbmx5KSB7Ci0JCWlmICghY29udGVudF9lbmNvZGluZykgewotCQkgICAgaWYgKHAtPnR5cGUgPT0gQllfVFlQRSkgewotCQkJaWYgKGNvbnRlbnRfdHlwZQotCQkJICAgICYmICFhcF9zdHJjYXNlY21wX21hdGNoKGNvbnRlbnRfdHlwZSwKLQkJCQkJCSAgICBwLT5hcHBseV90bykpIHsKLQkJCSAgICByZXR1cm4gcC0+ZGF0YTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCQllbHNlIHsKLQkJICAgIGlmIChwLT50eXBlID09IEJZX0VOQ09ESU5HKSB7Ci0JCQlpZiAoIWFwX3N0cmNhc2VjbXBfbWF0Y2goY29udGVudF9lbmNvZGluZywKLQkJCQkJCSBwLT5hcHBseV90bykpIHsKLQkJCSAgICByZXR1cm4gcC0+ZGF0YTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotI2RlZmluZSBmaW5kX2ljb24oZCxwLHQpIGZpbmRfaXRlbShwLGQtPmljb25fbGlzdCx0KQotI2RlZmluZSBmaW5kX2FsdChkLHAsdCkgZmluZF9pdGVtKHAsZC0+YWx0X2xpc3QsdCkKLSNkZWZpbmUgZmluZF9oZWFkZXIoZCxwKSBmaW5kX2l0ZW0ocCxkLT5oZHJfbGlzdCwwKQotI2RlZmluZSBmaW5kX3JlYWRtZShkLHApIGZpbmRfaXRlbShwLGQtPnJkbWVfbGlzdCwwKQotCi1zdGF0aWMgY2hhciAqZmluZF9kZWZhdWx0X2ljb24oYXV0b2luZGV4X2NvbmZpZ19yZWMgKmQsIGNoYXIgKmJvZ3VzX25hbWUpCi17Ci0gICAgcmVxdWVzdF9yZWMgcjsKLQotICAgIC8qIEJsZWFoLiAgSSB0cmllZCB0byBjbGVhbiB1cCBmaW5kX2l0ZW0sIGFuZCBpdCBsZWFkIHRvIHRoaXMgYml0Ci0gICAgICogb2YgdWdsaW5lc3MuICAgTm90ZSB0aGF0IHRoZSBmaWVsZHMgaW5pdGlhbGl6ZWQgYXJlIHByZWNpc2VseQotICAgICAqIHRob3NlIHRoYXQgZmluZF9pdGVtIGxvb2tzIGF0Li4uCi0gICAgICovCi0KLSAgICByLmZpbGVuYW1lID0gYm9ndXNfbmFtZTsKLSAgICByLmNvbnRlbnRfdHlwZSA9IHIuY29udGVudF9lbmNvZGluZyA9IE5VTEw7Ci0KLSAgICByZXR1cm4gZmluZF9pdGVtKCZyLCBkLT5pY29uX2xpc3QsIDEpOwotfQotCi0vKgotICogTG9vayB0aHJvdWdoIHRoZSBsaXN0IG9mIHBhdHRlcm4vZGVzY3JpcHRpb24gcGFpcnMgYW5kIHJldHVybiB0aGUgZmlyc3Qgb25lCi0gKiBpZiBhbnkpIHRoYXQgbWF0Y2hlcyB0aGUgZmlsZW5hbWUgaW4gdGhlIHJlcXVlc3QuICBJZiBtdWx0aXBsZSBwYXR0ZXJucwotICogbWF0Y2gsIG9ubHkgdGhlIGZpcnN0IG9uZSBpcyB1c2VkOyBzaW5jZSB0aGUgb3JkZXIgaW4gdGhlIGFycmF5IGlzIHRoZQotICogc2FtZSBhcyB0aGUgb3JkZXIgaW4gd2hpY2ggZGlyZWN0aXZlcyB3ZXJlIHByb2Nlc3NlZCwgZWFybGllciBtYXRjaGluZwotICogZGlyZWN0aXZlcyB3aWxsIGRvbWluYXRlLgotICovCi0KLSNpZmRlZiBDQVNFX0JMSU5EX0ZJTEVTWVNURU0KLSNkZWZpbmUgTUFUQ0hfRkxBR1MgRk5NX0NBU0VfQkxJTkQKLSNlbHNlCi0jZGVmaW5lIE1BVENIX0ZMQUdTIDAKLSNlbmRpZgotCi1zdGF0aWMgY2hhciAqZmluZF9kZXNjKGF1dG9pbmRleF9jb25maWdfcmVjICpkY2ZnLCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpbnQgaTsKLSAgICBhaV9kZXNjX3QgKmxpc3QgPSAoYWlfZGVzY190ICopIGRjZmctPmRlc2NfbGlzdC0+ZWx0czsKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZV9mdWxsID0gci0+ZmlsZW5hbWU7Ci0gICAgY29uc3QgY2hhciAqZmlsZW5hbWVfb25seTsKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLQotICAgIC8qCi0gICAgICogSWYgdGhlIGZpbGVuYW1lIGluY2x1ZGVzIGEgcGF0aCwgZXh0cmFjdCBqdXN0IHRoZSBuYW1lIGl0c2VsZgotICAgICAqIGZvciB0aGUgc2ltcGxlIG1hdGNoZXMuCi0gICAgICovCi0gICAgaWYgKChmaWxlbmFtZV9vbmx5ID0gc3RycmNocihmaWxlbmFtZV9mdWxsLCAnLycpKSA9PSBOVUxMKSB7Ci0JZmlsZW5hbWVfb25seSA9IGZpbGVuYW1lX2Z1bGw7Ci0gICAgfQotICAgIGVsc2UgewotCWZpbGVuYW1lX29ubHkrKzsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IGRjZmctPmRlc2NfbGlzdC0+bmVsdHM7ICsraSkgewotCWFpX2Rlc2NfdCAqdHVwbGUgPSAmbGlzdFtpXTsKLQlpbnQgZm91bmQ7Ci0KLQkvKgotCSAqIE9ubHkgdXNlIHRoZSBmdWxsLXBhdGggZmlsZW5hbWUgaWYgdGhlIHBhdHRlcm4gY29udGFpbnMgJy8ncy4KLQkgKi8KLQlmaWxlbmFtZSA9ICh0dXBsZS0+ZnVsbF9wYXRoKSA/IGZpbGVuYW1lX2Z1bGwgOiBmaWxlbmFtZV9vbmx5OwotCS8qCi0JICogTWFrZSB0aGUgY29tcGFyaXNvbiB1c2luZyB0aGUgY2hlYXBlc3QgbWV0aG9kOyBvbmx5IGRvCi0JICogd2lsZGNhcmQgY2hlY2tpbmcgaWYgd2UgbXVzdC4KLQkgKi8KLQlpZiAodHVwbGUtPndpbGRjYXJkcykgewotCSAgICBmb3VuZCA9IChhcF9mbm1hdGNoKHR1cGxlLT5wYXR0ZXJuLCBmaWxlbmFtZSwgTUFUQ0hfRkxBR1MpID09IDApOwotCX0KLQllbHNlIHsKLQkgICAgZm91bmQgPSAoc3Ryc3RyKGZpbGVuYW1lLCB0dXBsZS0+cGF0dGVybikgIT0gTlVMTCk7Ci0JfQotCWlmIChmb3VuZCkgewotCSAgICByZXR1cm4gdHVwbGUtPmRlc2NyaXB0aW9uOwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgaWdub3JlX2VudHJ5KGF1dG9pbmRleF9jb25maWdfcmVjICpkLCBjaGFyICpwYXRoKQotewotICAgIGFycmF5X2hlYWRlciAqbGlzdCA9IGQtPmlnbl9saXN0OwotICAgIHN0cnVjdCBpdGVtICppdGVtcyA9IChzdHJ1Y3QgaXRlbSAqKSBsaXN0LT5lbHRzOwotICAgIGNoYXIgKnR0OwotICAgIGludCBpOwotCi0gICAgaWYgKCh0dCA9IHN0cnJjaHIocGF0aCwgJy8nKSkgPT0gTlVMTCkgewotCXR0ID0gcGF0aDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JdHQrKzsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC0+bmVsdHM7ICsraSkgewotCXN0cnVjdCBpdGVtICpwID0gJml0ZW1zW2ldOwotCWNoYXIgKmFwOwotCi0JaWYgKChhcCA9IHN0cnJjaHIocC0+YXBwbHlfdG8sICcvJykpID09IE5VTEwpIHsKLQkgICAgYXAgPSBwLT5hcHBseV90bzsKLQl9Ci0JZWxzZSB7Ci0JICAgIGFwKys7Ci0JfQotCi0jaWZuZGVmIENBU0VfQkxJTkRfRklMRVNZU1RFTQotCWlmICghYXBfc3RyY21wX21hdGNoKHBhdGgsIHAtPmFwcGx5X3BhdGgpCi0JICAgICYmICFhcF9zdHJjbXBfbWF0Y2godHQsIGFwKSkgewotCSAgICByZXR1cm4gMTsKLQl9Ci0jZWxzZSAgLyogIUNBU0VfQkxJTkRfRklMRVNZU1RFTSAqLwotCS8qCi0JICogT24gc29tZSBwbGF0Zm9ybXMsIHRoZSBtYXRjaCBtdXN0IGJlIGNhc2UtYmxpbmQuICBUaGlzIGlzIHJlYWxseQotCSAqIGEgZmFjdG9yIG9mIHRoZSBmaWxlc3lzdGVtIGludm9sdmVkLCBidXQgd2UgY2FuJ3QgZGV0ZWN0IHRoYXQKLQkgKiByZWxpYWJseSAtIHNvIHdlIGhhdmUgdG8gZ3JhbnVsYXJpc2UgYXQgdGhlIE9TIGxldmVsLgotCSAqLwotCWlmICghYXBfc3RyY2FzZWNtcF9tYXRjaChwYXRoLCBwLT5hcHBseV9wYXRoKQotCSAgICAmJiAhYXBfc3RyY2FzZWNtcF9tYXRjaCh0dCwgYXApKSB7Ci0JICAgIHJldHVybiAxOwotCX0KLSNlbmRpZiAvKiAhQ0FTRV9CTElORF9GSUxFU1lTVEVNICovCi0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBBY3R1YWxseSBnZW5lcmF0aW5nIG91dHB1dAotICovCi0KLS8qCi0gKiBFbGVtZW50cyBvZiB0aGUgZW1pdHRlZCBkb2N1bWVudDoKLSAqCVByZWFtYmxlCi0gKgkJRW1pdHRlZCB1bmxlc3MgU1VQUFJFU1NfUFJFQU1CTEUgaXMgc2V0IEFORCBhcF9ydW5fc3ViX3JlcQotICoJCXN1Y2NlZWRzIGZvciB0aGUgKGNvbnRlbnRfdHlwZSA9PSB0ZXh0L2h0bWwpIGhlYWRlciBmaWxlLgotICoJSGVhZGVyIGZpbGUKLSAqCQlFbWl0dGVkIGlmIGZvdW5kIChhbmQgYWJsZSkuCi0gKglIMSB0YWcgbGluZQotICoJCUVtaXR0ZWQgaWYgYSBoZWFkZXIgZmlsZSBpcyBOT1QgZW1pdHRlZC4KLSAqCURpcmVjdG9yeSBzdHVmZgotICoJCUFsd2F5cyBlbWl0dGVkLgotICoJSFIKLSAqCQlFbWl0dGVkIGlmIEZBTkNZX0lOREVYSU5HIGlzIHNldC4KLSAqCVJlYWRtZSBmaWxlCi0gKgkJRW1pdHRlZCBpZiBmb3VuZCAoYW5kIGFibGUpLgotICoJU2VydmVyU2lnCi0gKgkJRW1pdHRlZCBpZiBTZXJ2ZXJTaWduYXR1cmUgaXMgbm90IE9mZiBBTkQgYSByZWFkbWUgZmlsZQotICoJCWlzIE5PVCBlbWl0dGVkLgotICoJUG9zdGFtYmxlCi0gKgkJRW1pdHRlZCB1bmxlc3MgU1VQUFJFU1NfUFJFQU1CTEUgaXMgc2V0IEFORCBhcF9ydW5fc3ViX3JlcQotICoJCXN1Y2NlZWRzIGZvciB0aGUgKGNvbnRlbnRfdHlwZSA9PSB0ZXh0L2h0bWwpIHJlYWRtZSBmaWxlLgotICovCi0KLQotLyoKLSAqIGVtaXQgYSBwbGFpbiB0ZXh0IGZpbGUKLSAqLwotc3RhdGljIHZvaWQgZG9fZW1pdF9wbGFpbihyZXF1ZXN0X3JlYyAqciwgRklMRSAqZikKLXsKLSAgICBjaGFyIGJ1ZltJT0JVRlNJWkUgKyAxXTsKLSAgICBpbnQgaSwgbiwgYywgY2g7Ci0KLSAgICBhcF9ycHV0cygiPFBSRT5cbiIsIHIpOwotICAgIHdoaWxlICghZmVvZihmKSkgewotCWRvIHsKLQkgICAgbiA9IGZyZWFkKGJ1Ziwgc2l6ZW9mKGNoYXIpLCBJT0JVRlNJWkUsIGYpOwotCX0KLQl3aGlsZSAobiA9PSAtMSAmJiBmZXJyb3IoZikgJiYgZXJybm8gPT0gRUlOVFIpOwotCWlmIChuID09IC0xIHx8IG4gPT0gMCkgewotCSAgICBicmVhazsKLQl9Ci0JYnVmW25dID0gJ1wwJzsKLQljID0gMDsKLQl3aGlsZSAoYyA8IG4pIHsKLQkgICAgZm9yIChpID0gYzsgaSA8IG47IGkrKykgewotCQlpZiAoYnVmW2ldID09ICc8JyB8fCBidWZbaV0gPT0gJz4nIHx8IGJ1ZltpXSA9PSAnJicpIHsKLQkJICAgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgICAgY2ggPSBidWZbaV07Ci0JICAgIGJ1ZltpXSA9ICdcMCc7Ci0JICAgIGFwX3JwdXRzKCZidWZbY10sIHIpOwotCSAgICBpZiAoY2ggPT0gJzwnKSB7Ci0JCWFwX3JwdXRzKCImbHQ7Iiwgcik7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoY2ggPT0gJz4nKSB7Ci0JCWFwX3JwdXRzKCImZ3Q7Iiwgcik7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoY2ggPT0gJyYnKSB7Ci0JCWFwX3JwdXRzKCImYW1wOyIsIHIpOwotCSAgICB9Ci0JICAgIGMgPSBpICsgMTsKLQl9Ci0gICAgfQotICAgIGFwX3JwdXRzKCI8L1BSRT5cbiIsIHIpOwotfQotCi0vKgotICogSGFuZGxlIHRoZSBwcmVhbWJsZSB0aHJvdWdoIHRoZSBIMSB0YWcgbGluZSwgaW5jbHVzaXZlLiAgTG9jYXRlCi0gKiB0aGUgZmlsZSB3aXRoIGEgc3VicmVxdWVzdHMuICBQcm9jZXNzIHRleHQvaHRtbCBkb2N1bWVudHMgYnkgYWN0dWFsbHkKLSAqIHJ1bm5pbmcgdGhlIHN1YnJlcXVlc3Q7IHRleHQveHh4IGRvY3VtZW50cyBnZXQgY29waWVkIHZlcmJhdGltLAotICogYW5kIGFueSBvdGhlciBjb250ZW50IHR5cGUgaXMgaWdub3JlZC4gIFRoaXMgbWVhbnMgdGhhdCBhIG5vbi10ZXh0Ci0gKiBkb2N1bWVudCAoc3VjaCBhcyBIRUFERVIuZ2lmKSBtaWdodCBnZXQgbXVsdGl2aWV3ZWQgYXMgdGhlIHJlc3VsdAotICogaW5zdGVhZCBvZiBhIHRleHQgZG9jdW1lbnQsIG1lYW5pbmcgbm90aGluZyB3aWxsIGJlIGRpc3BsYXllZCwgYnV0Ci0gKiBvaCB3ZWxsLgotICovCi1zdGF0aWMgdm9pZCBlbWl0X2hlYWQocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmhlYWRlcl9mbmFtZSwgaW50IHN1cHByZXNzX2FtYmxlLAotCQkgICAgICBjaGFyICp0aXRsZSkKLXsKLSAgICBGSUxFICpmOwotICAgIHJlcXVlc3RfcmVjICpyciA9IE5VTEw7Ci0gICAgaW50IGVtaXRfYW1ibGUgPSAxOwotICAgIGludCBlbWl0X0gxID0gMTsKLQotICAgIC8qCi0gICAgICogSWYgdGhlcmUncyBhIGhlYWRlciBmaWxlLCBzZW5kIGEgc3VicmVxdWVzdCB0byBsb29rIGZvciBpdC4gIElmIGl0J3MKLSAgICAgKiBmb3VuZCBhbmQgYSB0ZXh0IGZpbGUsIGhhbmRsZSBpdCAtLSBvdGhlcndpc2UgZmFsbCB0aHJvdWdoIGFuZAotICAgICAqIHByZXRlbmQgdGhlcmUncyBub3RoaW5nIHRoZXJlLgotICAgICAqLwotICAgIGlmICgoaGVhZGVyX2ZuYW1lICE9IE5VTEwpCi0JJiYgKHJyID0gYXBfc3ViX3JlcV9sb29rdXBfdXJpKGhlYWRlcl9mbmFtZSwgcikpCi0JJiYgKHJyLT5zdGF0dXMgPT0gSFRUUF9PSykKLQkmJiAocnItPmZpbGVuYW1lICE9IE5VTEwpCi0JJiYgU19JU1JFRyhyci0+ZmluZm8uc3RfbW9kZSkpIHsKLQkvKgotCSAqIENoZWNrIGZvciB0aGUgdHdvIHNwZWNpZmljIGNhc2VzIHdlIGFsbG93OiB0ZXh0L2h0bWwgYW5kCi0JICogdGV4dC9hbnl0aGluZy1lbHNlLiAgVGhlIGZvcm1lciBpcyBhbGxvd2VkIHRvIGJlIHByb2Nlc3NlZCBmb3IKLQkgKiBTU0lzLgotCSAqLwotCWlmIChyci0+Y29udGVudF90eXBlICE9IE5VTEwpIHsKLQkgICAgaWYgKCFzdHJjYXNlY21wKGFwX2ZpZWxkX25vcGFyYW0oci0+cG9vbCwgcnItPmNvbnRlbnRfdHlwZSksCi0JCQkgICAgInRleHQvaHRtbCIpKSB7Ci0JCS8qIEhvcGUgZXZlcnl0aGluZyB3aWxsIHdvcmsuLi4gKi8KLQkJZW1pdF9hbWJsZSA9IDA7Ci0JCWVtaXRfSDEgPSAwOwotCi0JCWlmICghIHN1cHByZXNzX2FtYmxlKSB7Ci0JCSAgICBlbWl0X3ByZWFtYmxlKHIsIHRpdGxlKTsKLQkJfQotCQkvKgotCQkgKiBJZiB0aGVyZSdzIGEgcHJvYmxlbSBydW5uaW5nIHRoZSBzdWJyZXF1ZXN0LCBkaXNwbGF5IHRoZQotCQkgKiBwcmVhbWJsZSBpZiB3ZSBkaWRuJ3QgZG8gaXQgYmVmb3JlIC0tIHRoZSBoZWFkZXIgZmlsZQotCQkgKiBkaWRuJ3QgZ2V0IGRpc3BsYXllZC4KLQkJICovCi0JCWlmIChhcF9ydW5fc3ViX3JlcShycikgIT0gT0spIHsKLQkJICAgIC8qIEl0IGRpZG4ndCB3b3JrICovCi0JCSAgICBlbWl0X2FtYmxlID0gc3VwcHJlc3NfYW1ibGU7Ci0JCSAgICBlbWl0X0gxID0gMTsKLQkJfQotCSAgICB9Ci0JICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgidGV4dC8iLCByci0+Y29udGVudF90eXBlLCA1KSkgewotCQkvKgotCQkgKiBJZiB3ZSBjYW4gb3BlbiB0aGUgZmlsZSwgcHJlZml4IGl0IHdpdGggdGhlIHByZWFtYmxlCi0JCSAqIHJlZ2FyZGxlc3M7IHNpbmNlIHdlJ2xsIGJlIHNlbmRpbmcgYSA8UFJFPiBibG9jayBhcm91bmQKLQkJICogdGhlIGZpbGUncyBjb250ZW50cywgYW55IEhUTUwgaGVhZGVyIGl0IGhhZCB3b24ndCBlbmQgdXAKLQkJICogd2hlcmUgaXQgYmVsb25ncy4KLQkJICovCi0JCWlmICgoZiA9IGFwX3Bmb3BlbihyLT5wb29sLCByci0+ZmlsZW5hbWUsICJyIikpICE9IDApIHsKLQkJICAgIGVtaXRfcHJlYW1ibGUociwgdGl0bGUpOwotCQkgICAgZW1pdF9hbWJsZSA9IDA7Ci0JCSAgICBkb19lbWl0X3BsYWluKHIsIGYpOwotCQkgICAgYXBfcGZjbG9zZShyLT5wb29sLCBmKTsKLQkJICAgIGVtaXRfSDEgPSAwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgaWYgKGVtaXRfYW1ibGUpIHsKLQllbWl0X3ByZWFtYmxlKHIsIHRpdGxlKTsKLSAgICB9Ci0gICAgaWYgKGVtaXRfSDEpIHsKLQlhcF9ydnB1dHMociwgIjxIMT5JbmRleCBvZiAiLCB0aXRsZSwgIjwvSDE+XG4iLCBOVUxMKTsKLSAgICB9Ci0gICAgaWYgKHJyICE9IE5VTEwpIHsKLQlhcF9kZXN0cm95X3N1Yl9yZXEocnIpOwotICAgIH0KLX0KLQotCi0vKgotICogSGFuZGxlIHRoZSBSZWFkbWUgZmlsZSB0aHJvdWdoIHRoZSBwb3N0YW1ibGUsIGluY2x1c2l2ZS4gIExvY2F0ZQotICogdGhlIGZpbGUgd2l0aCBhIHN1YnJlcXVlc3RzLiAgUHJvY2VzcyB0ZXh0L2h0bWwgZG9jdW1lbnRzIGJ5IGFjdHVhbGx5Ci0gKiBydW5uaW5nIHRoZSBzdWJyZXF1ZXN0OyB0ZXh0L3h4eCBkb2N1bWVudHMgZ2V0IGNvcGllZCB2ZXJiYXRpbSwKLSAqIGFuZCBhbnkgb3RoZXIgY29udGVudCB0eXBlIGlzIGlnbm9yZWQuICBUaGlzIG1lYW5zIHRoYXQgYSBub24tdGV4dAotICogZG9jdW1lbnQgKHN1Y2ggYXMgRk9PVEVSLmdpZikgbWlnaHQgZ2V0IG11bHRpdmlld2VkIGFzIHRoZSByZXN1bHQKLSAqIGluc3RlYWQgb2YgYSB0ZXh0IGRvY3VtZW50LCBtZWFuaW5nIG5vdGhpbmcgd2lsbCBiZSBkaXNwbGF5ZWQsIGJ1dAotICogb2ggd2VsbC4KLSAqLwotc3RhdGljIHZvaWQgZW1pdF90YWlsKHJlcXVlc3RfcmVjICpyLCBjaGFyICpyZWFkbWVfZm5hbWUsIGludCBzdXBwcmVzc19hbWJsZSkKLXsKLSAgICBGSUxFICpmOwotICAgIHJlcXVlc3RfcmVjICpyciA9IE5VTEw7Ci0gICAgaW50IHN1cHByZXNzX3Bvc3QgPSAwOwotICAgIGludCBzdXBwcmVzc19zaWcgPSAwOwotCi0gICAgLyoKLSAgICAgKiBJZiB0aGVyZSdzIGEgcmVhZG1lIGZpbGUsIHNlbmQgYSBzdWJyZXF1ZXN0IHRvIGxvb2sgZm9yIGl0LiAgSWYgaXQncwotICAgICAqIGZvdW5kIGFuZCBhIHRleHQgZmlsZSwgaGFuZGxlIGl0IC0tIG90aGVyd2lzZSBmYWxsIHRocm91Z2ggYW5kCi0gICAgICogcHJldGVuZCB0aGVyZSdzIG5vdGhpbmcgdGhlcmUuCi0gICAgICovCi0gICAgaWYgKChyZWFkbWVfZm5hbWUgIT0gTlVMTCkKLQkmJiAocnIgPSBhcF9zdWJfcmVxX2xvb2t1cF91cmkocmVhZG1lX2ZuYW1lLCByKSkKLQkmJiAocnItPnN0YXR1cyA9PSBIVFRQX09LKQotCSYmIChyci0+ZmlsZW5hbWUgIT0gTlVMTCkKLQkmJiBTX0lTUkVHKHJyLT5maW5mby5zdF9tb2RlKSkgewotCS8qCi0JICogQ2hlY2sgZm9yIHRoZSB0d28gc3BlY2lmaWMgY2FzZXMgd2UgYWxsb3c6IHRleHQvaHRtbCBhbmQKLQkgKiB0ZXh0L2FueXRoaW5nLWVsc2UuICBUaGUgZm9ybWVyIGlzIGFsbG93ZWQgdG8gYmUgcHJvY2Vzc2VkIGZvcgotCSAqIFNTSXMuCi0JICovCi0JaWYgKHJyLT5jb250ZW50X3R5cGUgIT0gTlVMTCkgewotCSAgICBpZiAoIXN0cmNhc2VjbXAoYXBfZmllbGRfbm9wYXJhbShyLT5wb29sLCByci0+Y29udGVudF90eXBlKSwKLQkJCSAgICAidGV4dC9odG1sIikpIHsKLQkJaWYgKGFwX3J1bl9zdWJfcmVxKHJyKSA9PSBPSykgewotCQkgICAgLyogd29ya2VkLi4uICovCi0JCSAgICBzdXBwcmVzc19zaWcgPSAxOwotCQkgICAgc3VwcHJlc3NfcG9zdCA9IHN1cHByZXNzX2FtYmxlOwotCQl9Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoIXN0cm5jYXNlY21wKCJ0ZXh0LyIsIHJyLT5jb250ZW50X3R5cGUsIDUpKSB7Ci0JCS8qCi0JCSAqIElmIHdlIGNhbiBvcGVuIHRoZSBmaWxlLCBzdXBwcmVzcyB0aGUgc2lnbmF0dXJlLgotCQkgKi8KLQkJaWYgKChmID0gYXBfcGZvcGVuKHItPnBvb2wsIHJyLT5maWxlbmFtZSwgInIiKSkgIT0gMCkgewotCQkgICAgZG9fZW1pdF9wbGFpbihyLCBmKTsKLQkJICAgIGFwX3BmY2xvc2Uoci0+cG9vbCwgZik7Ci0JCSAgICBzdXBwcmVzc19zaWcgPSAxOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIAotICAgIGlmICghc3VwcHJlc3Nfc2lnKSB7Ci0JYXBfcnB1dHMoYXBfcHNpZ25hdHVyZSgiIiwgciksIHIpOwotICAgIH0KLSAgICBpZiAoIXN1cHByZXNzX3Bvc3QpIHsKLQlhcF9ycHV0cygiPC9CT0RZPjwvSFRNTD5cbiIsIHIpOwotICAgIH0KLSAgICBpZiAocnIgIT0gTlVMTCkgewotCWFwX2Rlc3Ryb3lfc3ViX3JlcShycik7Ci0gICAgfQotfQotCi0KLXN0YXRpYyBjaGFyICpmaW5kX3RpdGxlKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNoYXIgdGl0bGVidWZbTUFYX1NUUklOR19MRU5dLCAqZmluZCA9ICI8VElUTEU+IjsKLSAgICBGSUxFICp0aGVmaWxlID0gTlVMTDsKLSAgICBpbnQgeCwgeSwgbiwgcDsKLQotICAgIGlmIChyLT5zdGF0dXMgIT0gSFRUUF9PSykgewotCXJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoKHItPmNvbnRlbnRfdHlwZSAhPSBOVUxMKQotCSYmICghc3RyY2FzZWNtcChhcF9maWVsZF9ub3BhcmFtKHItPnBvb2wsIHItPmNvbnRlbnRfdHlwZSksCi0JCQkidGV4dC9odG1sIikKLQkgICAgfHwgIXN0cmNtcChyLT5jb250ZW50X3R5cGUsIElOQ0xVREVTX01BR0lDX1RZUEUpKQotCSYmICFyLT5jb250ZW50X2VuY29kaW5nKSB7Ci0gICAgICAgIGlmICghKHRoZWZpbGUgPSBhcF9wZm9wZW4oci0+cG9vbCwgci0+ZmlsZW5hbWUsICJyIikpKSB7Ci0JICAgIHJldHVybiBOVUxMOwotCX0KLQluID0gZnJlYWQodGl0bGVidWYsIHNpemVvZihjaGFyKSwgTUFYX1NUUklOR19MRU4gLSAxLCB0aGVmaWxlKTsKLQlpZiAobiA8PSAwKSB7Ci0JICAgIGFwX3BmY2xvc2Uoci0+cG9vbCwgdGhlZmlsZSk7Ci0JICAgIHJldHVybiBOVUxMOwotCX0KLQl0aXRsZWJ1ZltuXSA9ICdcMCc7Ci0JZm9yICh4ID0gMCwgcCA9IDA7IHRpdGxlYnVmW3hdOyB4KyspIHsKLQkgICAgaWYgKGFwX3RvdXBwZXIodGl0bGVidWZbeF0pID09IGZpbmRbcF0pIHsKLQkJaWYgKCFmaW5kWysrcF0pIHsKLQkJICAgIGlmICgocCA9IGFwX2luZCgmdGl0bGVidWZbKyt4XSwgJzwnKSkgIT0gLTEpIHsKLQkJCXRpdGxlYnVmW3ggKyBwXSA9ICdcMCc7Ci0JCSAgICB9Ci0JCSAgICAvKiBTY2FuIGZvciBsaW5lIGJyZWFrcyBmb3IgVGFubW95J3Mgc2VjcmV0YXJ5ICovCi0JCSAgICBmb3IgKHkgPSB4OyB0aXRsZWJ1Zlt5XTsgeSsrKSB7Ci0JCQlpZiAoKHRpdGxlYnVmW3ldID09IENSKSB8fCAodGl0bGVidWZbeV0gPT0gTEYpKSB7Ci0JCQkgICAgaWYgKHkgPT0geCkgewotCQkJCXgrKzsKLQkJCSAgICB9Ci0JCQkgICAgZWxzZSB7Ci0JCQkJdGl0bGVidWZbeV0gPSAnICc7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCQkgICAgYXBfcGZjbG9zZShyLT5wb29sLCB0aGVmaWxlKTsKLQkJICAgIHJldHVybiBhcF9wc3RyZHVwKHItPnBvb2wsICZ0aXRsZWJ1Zlt4XSk7Ci0JCX0KLQkgICAgfQotCSAgICBlbHNlIHsKLQkJcCA9IDA7Ci0JICAgIH0KLQl9Ci0JYXBfcGZjbG9zZShyLT5wb29sLCB0aGVmaWxlKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZW50ICptYWtlX2F1dG9pbmRleF9lbnRyeShjaGFyICpuYW1lLCBpbnQgYXV0b2luZGV4X29wdHMsCi0JCQkJCWF1dG9pbmRleF9jb25maWdfcmVjICpkLAotCQkJCQlyZXF1ZXN0X3JlYyAqciwgY2hhciBrZXlpZCwKLQkJCQkJY2hhciBkaXJlY3Rpb24pCi17Ci0gICAgc3RydWN0IGVudCAqcDsKLQotICAgIGlmICgobmFtZVswXSA9PSAnLicpICYmICghbmFtZVsxXSkpIHsKLQlyZXR1cm4gKE5VTEwpOwotICAgIH0KLQotICAgIGlmIChpZ25vcmVfZW50cnkoZCwgYXBfbWFrZV9mdWxsX3BhdGgoci0+cG9vbCwgci0+ZmlsZW5hbWUsIG5hbWUpKSkgewotICAgICAgICByZXR1cm4gKE5VTEwpOwotICAgIH0KLQotICAgIHAgPSAoc3RydWN0IGVudCAqKSBhcF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihzdHJ1Y3QgZW50KSk7Ci0gICAgcC0+bmFtZSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgbmFtZSk7Ci0gICAgcC0+c2l6ZSA9IC0xOwotICAgIHAtPmljb24gPSBOVUxMOwotICAgIHAtPmFsdCA9IE5VTEw7Ci0gICAgcC0+ZGVzYyA9IE5VTEw7Ci0gICAgcC0+bG0gPSAtMTsKLSAgICBwLT5rZXkgPSBhcF90b3VwcGVyKGtleWlkKTsKLSAgICBwLT5hc2NlbmRpbmcgPSAoYXBfdG91cHBlcihkaXJlY3Rpb24pID09IERfQVNDRU5ESU5HKTsKLQotICAgIGlmIChhdXRvaW5kZXhfb3B0cyAmIEZBTkNZX0lOREVYSU5HKSB7Ci0JcmVxdWVzdF9yZWMgKnJyID0gYXBfc3ViX3JlcV9sb29rdXBfZmlsZShuYW1lLCByKTsKLQotCWlmIChyci0+ZmluZm8uc3RfbW9kZSAhPSAwKSB7Ci0JICAgIHAtPmxtID0gcnItPmZpbmZvLnN0X210aW1lOwotCSAgICBpZiAoU19JU0RJUihyci0+ZmluZm8uc3RfbW9kZSkpIHsKLQkgICAgICAgIGlmICghKHAtPmljb24gPSBmaW5kX2ljb24oZCwgcnIsIDEpKSkgewotCQkgICAgcC0+aWNvbiA9IGZpbmRfZGVmYXVsdF9pY29uKGQsICJeXkRJUkVDVE9SWV5eIik7Ci0JCX0KLQkJaWYgKCEocC0+YWx0ID0gZmluZF9hbHQoZCwgcnIsIDEpKSkgewotCQkgICAgcC0+YWx0ID0gIkRJUiI7Ci0JCX0KLQkJcC0+c2l6ZSA9IC0xOwotCQlwLT5uYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCBuYW1lLCAiLyIsIE5VTEwpOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQlwLT5pY29uID0gZmluZF9pY29uKGQsIHJyLCAwKTsKLQkJcC0+YWx0ID0gZmluZF9hbHQoZCwgcnIsIDApOwotCQlwLT5zaXplID0gcnItPmZpbmZvLnN0X3NpemU7Ci0JICAgIH0KLQl9Ci0KLQlwLT5kZXNjID0gZmluZF9kZXNjKGQsIHJyKTsKLQotCWlmICgoIXAtPmRlc2MpICYmIChhdXRvaW5kZXhfb3B0cyAmIFNDQU5fSFRNTF9USVRMRVMpKSB7Ci0JICAgIHAtPmRlc2MgPSBhcF9wc3RyZHVwKHItPnBvb2wsIGZpbmRfdGl0bGUocnIpKTsKLQl9Ci0KLQlhcF9kZXN0cm95X3N1Yl9yZXEocnIpOwotICAgIH0KLSAgICAvKgotICAgICAqIFdlIGRvbid0IG5lZWQgdG8gdGFrZSBhbnkgc3BlY2lhbCBhY3Rpb24gZm9yIHRoZSBmaWxlIHNpemUga2V5LiAgSWYKLSAgICAgKiB3ZSBkaWQsIGl0IHdvdWxkIGdvIGhlcmUuCi0gICAgICovCi0gICAgaWYgKGtleWlkID09IEtfTEFTVF9NT0QpIHsKLSAgICAgICAgaWYgKHAtPmxtIDwgMCkgewotCSAgICBwLT5sbSA9IDA7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gKHApOwotfQotCi1zdGF0aWMgY2hhciAqdGVybWluYXRlX2Rlc2NyaXB0aW9uKGF1dG9pbmRleF9jb25maWdfcmVjICpkLCBjaGFyICpkZXNjLAotCQkJCSAgIGludCBhdXRvaW5kZXhfb3B0cykKLXsKLSAgICBpbnQgbWF4c2l6ZSA9IDIzOwotICAgIHJlZ2lzdGVyIGludCB4OwotCi0gICAgaWYgKGF1dG9pbmRleF9vcHRzICYgU1VQUFJFU1NfTEFTVF9NT0QpIHsKLQltYXhzaXplICs9IDE5OwotICAgIH0KLSAgICBpZiAoYXV0b2luZGV4X29wdHMgJiBTVVBQUkVTU19TSVpFKSB7Ci0JbWF4c2l6ZSArPSA3OwotICAgIH0KLQotICAgIGZvciAoeCA9IDA7IGRlc2NbeF0gJiYgKG1heHNpemUgPiAwIHx8IGRlc2NbeF09PSc8Jyk7IHgrKykgewotCWlmIChkZXNjW3hdID09ICc8JykgewotCSAgICB3aGlsZSAoZGVzY1t4XSAhPSAnPicpIHsKLQkJaWYgKCFkZXNjW3hdKSB7Ci0JCSAgICBtYXhzaXplID0gMDsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCSsreDsKLQkgICAgfQotCX0KLSAJZWxzZSBpZiAoZGVzY1t4XSA9PSAnJicpIHsKLSAJICAgIC8qIGVudGl0aWVzIGxpa2UgJmF1bWw7IGNvdW50IGFzIG9uZSBjaGFyYWN0ZXIgKi8KLSAJICAgIC0tbWF4c2l6ZTsKLSAJICAgIGZvciAoIDsgZGVzY1t4XSAhPSAnOyc7ICsreCkgewotIAkJaWYgKGRlc2NbeF0gPT0gJ1wwJykgewotICAgICAgICAgICAgICAgICAgICAgbWF4c2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJfQotCSAgICB9Ci0gICAgICAgIH0KLQllbHNlIHsKLQkgICAgLS1tYXhzaXplOwotCX0KLSAgICB9Ci0gICAgaWYgKCFtYXhzaXplICYmIGRlc2NbeF0gIT0gJ1wwJykgewotCWRlc2NbeCAtIDFdID0gJz4nOwkvKiBHcnVtcC4gKi8KLQlkZXNjW3hdID0gJ1wwJzsJCS8qIERvdWJsZSBHcnVtcCEgKi8KLSAgICB9Ci0gICAgcmV0dXJuIGRlc2M7Ci19Ci0KLS8qCi0gKiBFbWl0IHRoZSBhbmNob3IgZm9yIHRoZSBzcGVjaWZpZWQgZmllbGQuICBJZiBhIGZpZWxkIGlzIHRoZSBrZXkgZm9yIHRoZQotICogY3VycmVudCByZXF1ZXN0LCB0aGUgbGluayBjaGFuZ2VzIGl0cyBtZWFuaW5nIHRvIHJldmVyc2UgdGhlIG9yZGVyIHdoZW4KLSAqIHNlbGVjdGVkIGFnYWluLiAgTm9uLWFjdGl2ZSBmaWVsZHMgYWx3YXlzIHN0YXJ0IGluIGFzY2VuZGluZyBvcmRlci4KLSAqLwotc3RhdGljIHZvaWQgZW1pdF9saW5rKHJlcXVlc3RfcmVjICpyLCBjaGFyICphbmNob3IsIGNoYXIgZm5hbWUsIGNoYXIgY3Vya2V5LAotICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY3VyZGlyZWN0aW9uLCBpbnQgbm9zb3J0KQotewotICAgIGNoYXIgcXZhbHVlWzVdOwotICAgIGludCByZXZlcnNlOwotCi0gICAgaWYgKCFub3NvcnQpIHsKLQlxdmFsdWVbMF0gPSAnPyc7Ci0JcXZhbHVlWzFdID0gZm5hbWU7Ci0JcXZhbHVlWzJdID0gJz0nOwotCXF2YWx1ZVs0XSA9ICdcMCc7Ci0JcmV2ZXJzZSA9ICgoY3Vya2V5ID09IGZuYW1lKSAmJiAoY3VyZGlyZWN0aW9uID09IERfQVNDRU5ESU5HKSk7Ci0JcXZhbHVlWzNdID0gcmV2ZXJzZSA/IERfREVTQ0VORElORyA6IERfQVNDRU5ESU5HOwotCWFwX3J2cHV0cyhyLCAiPEEgSFJFRj1cIiIsIHF2YWx1ZSwgIlwiPiIsIGFuY2hvciwgIjwvQT4iLCBOVUxMKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGFwX3JwdXRzKGFuY2hvciwgcik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBvdXRwdXRfZGlyZWN0b3JpZXMoc3RydWN0IGVudCAqKmFyLCBpbnQgbiwKLQkJCSAgICAgICBhdXRvaW5kZXhfY29uZmlnX3JlYyAqZCwgcmVxdWVzdF9yZWMgKnIsCi0JCQkgICAgICAgaW50IGF1dG9pbmRleF9vcHRzLCBjaGFyIGtleWlkLCBjaGFyIGRpcmVjdGlvbikKLXsKLSAgICBpbnQgeDsKLSAgICBjaGFyICpuYW1lID0gci0+dXJpOwotICAgIGNoYXIgKnRwOwotICAgIGludCBzdGF0aWNfY29sdW1ucyA9IChhdXRvaW5kZXhfb3B0cyAmIFNVUFBSRVNTX0NPTFNPUlQpOwotICAgIHBvb2wgKnNjcmF0Y2ggPSBhcF9tYWtlX3N1Yl9wb29sKHItPnBvb2wpOwotICAgIGludCBuYW1lX3dpZHRoOwotICAgIGNoYXIgKm5hbWVfc2NyYXRjaDsKLSAgICBjaGFyICpwYWRfc2NyYXRjaDsKLQotICAgIGlmIChuYW1lWzBdID09ICdcMCcpIHsKLQluYW1lID0gIi8iOwotICAgIH0KLQotICAgIG5hbWVfd2lkdGggPSBkLT5uYW1lX3dpZHRoOwotICAgIGlmIChkLT5uYW1lX2FkanVzdCA9PSBLX0FESlVTVCkgewotCWZvciAoeCA9IDA7IHggPCBuOyB4KyspIHsKLQkgICAgaW50IHQgPSBzdHJsZW4oYXJbeF0tPm5hbWUpOwotCSAgICBpZiAodCA+IG5hbWVfd2lkdGgpIHsKLQkJbmFtZV93aWR0aCA9IHQ7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIG5hbWVfc2NyYXRjaCA9IGFwX3BhbGxvYyhyLT5wb29sLCBuYW1lX3dpZHRoICsgMSk7Ci0gICAgcGFkX3NjcmF0Y2ggPSBhcF9wYWxsb2Moci0+cG9vbCwgbmFtZV93aWR0aCArIDEpOwotICAgIG1lbXNldChwYWRfc2NyYXRjaCwgJyAnLCBuYW1lX3dpZHRoKTsKLSAgICBwYWRfc2NyYXRjaFtuYW1lX3dpZHRoXSA9ICdcMCc7Ci0KLSAgICBpZiAoYXV0b2luZGV4X29wdHMgJiBGQU5DWV9JTkRFWElORykgewotCWFwX3JwdXRzKCI8UFJFPiIsIHIpOwotCWlmICgodHAgPSBmaW5kX2RlZmF1bHRfaWNvbihkLCAiXl5CTEFOS0lDT05eXiIpKSkgewotCSAgICBhcF9ydnB1dHMociwgIjxJTUcgU1JDPVwiIiwgYXBfZXNjYXBlX2h0bWwoc2NyYXRjaCwgdHApLAotCQkgICAiXCIgQUxUPVwiICAgICBcIiIsIE5VTEwpOwotCSAgICBpZiAoZC0+aWNvbl93aWR0aCAmJiBkLT5pY29uX2hlaWdodCkgewotCQlhcF9ycHJpbnRmCi0JCSAgICAoCi0JCQlyLAotCQkJIiBIRUlHSFQ9XCIlZFwiIFdJRFRIPVwiJWRcIiIsCi0JCQlkLT5pY29uX2hlaWdodCwKLQkJCWQtPmljb25fd2lkdGgKLQkJICAgICk7Ci0JICAgIH0KLQkgICAgYXBfcnB1dHMoIj4gIiwgcik7Ci0JfQotICAgICAgICBlbWl0X2xpbmsociwgIk5hbWUiLCBLX05BTUUsIGtleWlkLCBkaXJlY3Rpb24sIHN0YXRpY19jb2x1bW5zKTsKLQlhcF9ycHV0cyhwYWRfc2NyYXRjaCArIDQsIHIpOwotCS8qCi0JICogRW1pdCB0aGUgZ3VhcmFudGVlZC1hdC1sZWFzdC1vbmUtc3BhY2UtYmV0d2Vlbi1jb2x1bW5zIGJ5dGUuCi0JICovCi0JYXBfcnB1dHMoIiAiLCByKTsKLQlpZiAoIShhdXRvaW5kZXhfb3B0cyAmIFNVUFBSRVNTX0xBU1RfTU9EKSkgewotICAgICAgICAgICAgZW1pdF9saW5rKHIsICJMYXN0IG1vZGlmaWVkIiwgS19MQVNUX01PRCwga2V5aWQsIGRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY29sdW1ucyk7Ci0JICAgIGFwX3JwdXRzKCIgICAgICAgIiwgcik7Ci0JfQotCWlmICghKGF1dG9pbmRleF9vcHRzICYgU1VQUFJFU1NfU0laRSkpIHsKLSAgICAgICAgICAgIGVtaXRfbGluayhyLCAiU2l6ZSIsIEtfU0laRSwga2V5aWQsIGRpcmVjdGlvbiwgc3RhdGljX2NvbHVtbnMpOwotCSAgICBhcF9ycHV0cygiICAiLCByKTsKLQl9Ci0JaWYgKCEoYXV0b2luZGV4X29wdHMgJiBTVVBQUkVTU19ERVNDKSkgewotICAgICAgICAgICAgZW1pdF9saW5rKHIsICJEZXNjcmlwdGlvbiIsIEtfREVTQywga2V5aWQsIGRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY29sdW1ucyk7Ci0JfQotCWFwX3JwdXRzKCJcbjxIUj5cbiIsIHIpOwotICAgIH0KLSAgICBlbHNlIHsKLQlhcF9ycHV0cygiPFVMPiIsIHIpOwotICAgIH0KLQotICAgIGZvciAoeCA9IDA7IHggPCBuOyB4KyspIHsKLQljaGFyICphbmNob3IsICp0LCAqdDI7Ci0JaW50IG53aWR0aDsKLQotCWFwX2NsZWFyX3Bvb2woc2NyYXRjaCk7Ci0KLQlpZiAoaXNfcGFyZW50KGFyW3hdLT5uYW1lKSkgewotCSAgICB0ID0gYXBfbWFrZV9mdWxsX3BhdGgoc2NyYXRjaCwgbmFtZSwgIi4uLyIpOwotCSAgICBhcF9nZXRwYXJlbnRzKHQpOwotCSAgICBpZiAodFswXSA9PSAnXDAnKSB7Ci0JCXQgPSAiLyI7Ci0JICAgIH0KLQkgICAgdDIgPSAiUGFyZW50IERpcmVjdG9yeSI7Ci0JICAgIGFuY2hvciA9IGFwX2VzY2FwZV9odG1sKHNjcmF0Y2gsIGFwX29zX2VzY2FwZV9wYXRoKHNjcmF0Y2gsIHQsIDApKTsKLQl9Ci0JZWxzZSB7Ci0JICAgIHQgPSBhclt4XS0+bmFtZTsKLQkgICAgdDIgPSB0OwotCSAgICBhbmNob3IgPSBhcF9lc2NhcGVfaHRtbChzY3JhdGNoLCBhcF9vc19lc2NhcGVfcGF0aChzY3JhdGNoLCB0LCAwKSk7Ci0JfQotCi0JaWYgKGF1dG9pbmRleF9vcHRzICYgRkFOQ1lfSU5ERVhJTkcpIHsKLQkgICAgaWYgKGF1dG9pbmRleF9vcHRzICYgSUNPTlNfQVJFX0xJTktTKSB7Ci0JCWFwX3J2cHV0cyhyLCAiPEEgSFJFRj1cIiIsIGFuY2hvciwgIlwiPiIsIE5VTEwpOwotCSAgICB9Ci0JICAgIGlmICgoYXJbeF0tPmljb24pIHx8IGQtPmRlZmF1bHRfaWNvbikgewotCQlhcF9ydnB1dHMociwgIjxJTUcgU1JDPVwiIiwKLQkJCSAgYXBfZXNjYXBlX2h0bWwoc2NyYXRjaCwKLQkJCQkJIGFyW3hdLT5pY29uID8gYXJbeF0tPmljb24KLQkJCQkJICAgICAgICAgICAgIDogZC0+ZGVmYXVsdF9pY29uKSwKLQkJCSAgIlwiIEFMVD1cIlsiLCAoYXJbeF0tPmFsdCA/IGFyW3hdLT5hbHQgOiAiICAgIiksCi0JCQkgICJdXCIiLCBOVUxMKTsKLQkJaWYgKGQtPmljb25fd2lkdGggJiYgZC0+aWNvbl9oZWlnaHQpIHsKLQkJICAgIGFwX3JwcmludGYociwgIiBIRUlHSFQ9XCIlZFwiIFdJRFRIPVwiJWRcIiIsCi0JCQkgICAgICAgZC0+aWNvbl9oZWlnaHQsIGQtPmljb25fd2lkdGgpOwotCQl9Ci0JCWFwX3JwdXRzKCI+Iiwgcik7Ci0JICAgIH0KLQkgICAgaWYgKGF1dG9pbmRleF9vcHRzICYgSUNPTlNfQVJFX0xJTktTKSB7Ci0JCWFwX3JwdXRzKCI8L0E+Iiwgcik7Ci0JICAgIH0KLQotCSAgICBud2lkdGggPSBzdHJsZW4odDIpOwotCSAgICBpZiAobndpZHRoID4gbmFtZV93aWR0aCkgewotCSAgICAgIG1lbWNweShuYW1lX3NjcmF0Y2gsIHQyLCBuYW1lX3dpZHRoIC0gMyk7Ci0JICAgICAgbmFtZV9zY3JhdGNoW25hbWVfd2lkdGggLSAzXSA9ICcuJzsKLQkgICAgICBuYW1lX3NjcmF0Y2hbbmFtZV93aWR0aCAtIDJdID0gJy4nOwotCSAgICAgIG5hbWVfc2NyYXRjaFtuYW1lX3dpZHRoIC0gMV0gPSAnPic7Ci0JICAgICAgbmFtZV9zY3JhdGNoW25hbWVfd2lkdGhdID0gMDsKLQkgICAgICB0MiA9IG5hbWVfc2NyYXRjaDsKLQkgICAgICBud2lkdGggPSBuYW1lX3dpZHRoOwotCSAgICB9Ci0JICAgIGFwX3J2cHV0cyhyLCAiIDxBIEhSRUY9XCIiLCBhbmNob3IsICJcIj4iLAotCSAgICAgIGFwX2VzY2FwZV9odG1sKHNjcmF0Y2gsIHQyKSwgIjwvQT4iLCBwYWRfc2NyYXRjaCArIG53aWR0aCwKLQkgICAgICBOVUxMKTsKLQkgICAgLyoKLQkgICAgICogVGhlIGJsYW5rIGJlZm9yZSB0aGUgc3Rvcm0uLiBlciwgYmVmb3JlIHRoZSBuZXh0IGZpZWxkLgotCSAgICAgKi8KLQkgICAgYXBfcnB1dHMoIiAiLCByKTsKLQkgICAgaWYgKCEoYXV0b2luZGV4X29wdHMgJiBTVVBQUkVTU19MQVNUX01PRCkpIHsKLQkJaWYgKGFyW3hdLT5sbSAhPSAtMSkgewotCQkgICAgY2hhciB0aW1lX3N0cltNQVhfU1RSSU5HX0xFTl07Ci0JCSAgICBzdHJ1Y3QgdG0gKnRzID0gbG9jYWx0aW1lKCZhclt4XS0+bG0pOwotCQkgICAgc3RyZnRpbWUodGltZV9zdHIsIE1BWF9TVFJJTkdfTEVOLCAiJWQtJWItJVkgJUg6JU0gICIsIHRzKTsKLQkJICAgIGFwX3JwdXRzKHRpbWVfc3RyLCByKTsKLQkJfQotCQllbHNlIHsKLQkJICAgIC8qTGVuZ3RoPSIyMi1GZWItMTk5OCAyMzo0MiAgIiAoc2VlIDQgbGluZXMgYWJvdmUpICovCi0JCSAgICBhcF9ycHV0cygiICAgICAgICAgICAgICAgICAgICIsIHIpOwotCQl9Ci0JICAgIH0KLQkgICAgaWYgKCEoYXV0b2luZGV4X29wdHMgJiBTVVBQUkVTU19TSVpFKSkgewotCQlhcF9zZW5kX3NpemUoYXJbeF0tPnNpemUsIHIpOwotCQlhcF9ycHV0cygiICAiLCByKTsKLQkgICAgfQotCSAgICBpZiAoIShhdXRvaW5kZXhfb3B0cyAmIFNVUFBSRVNTX0RFU0MpKSB7Ci0JCWlmIChhclt4XS0+ZGVzYykgewotCQkgICAgYXBfcnB1dHModGVybWluYXRlX2Rlc2NyaXB0aW9uKGQsIGFyW3hdLT5kZXNjLAotCQkJCQkJICAgYXV0b2luZGV4X29wdHMpLCByKTsKLQkJfQotCSAgICB9Ci0JfQotCWVsc2UgewotCSAgICBhcF9ydnB1dHMociwgIjxMST48QSBIUkVGPVwiIiwgYW5jaG9yLCAiXCI+ICIsIHQyLAotCQkgICAgICAiPC9BPiIsIE5VTEwpOwotCX0KLQlhcF9ycHV0YygnXG4nLCByKTsKLSAgICB9Ci0gICAgaWYgKGF1dG9pbmRleF9vcHRzICYgRkFOQ1lfSU5ERVhJTkcpIHsKLQlhcF9ycHV0cygiPC9QUkU+Iiwgcik7Ci0gICAgfQotICAgIGVsc2UgewotCWFwX3JwdXRzKCI8L1VMPiIsIHIpOwotICAgIH0KLX0KLQotLyoKLSAqIENvbXBhcmUgdHdvIGZpbGUgZW50cmllcyBhY2NvcmRpbmcgdG8gdGhlIHNvcnQgY3JpdGVyaWEuICBUaGUgcmV0dXJuCi0gKiBpcyBlc3NlbnRpYWxseSBhIHNpZ251bSBmdW5jdGlvbiB2YWx1ZS4KLSAqLwotCi1zdGF0aWMgaW50IGRzb3J0ZihzdHJ1Y3QgZW50ICoqZTEsIHN0cnVjdCBlbnQgKiplMikKLXsKLSAgICBzdHJ1Y3QgZW50ICpjMTsKLSAgICBzdHJ1Y3QgZW50ICpjMjsKLSAgICBpbnQgcmVzdWx0ID0gMDsKLQotICAgIC8qCi0gICAgICogRmlyc3QsIHNlZSBpZiBlaXRoZXIgb2YgdGhlIGVudHJpZXMgaXMgZm9yIHRoZSBwYXJlbnQgZGlyZWN0b3J5LgotICAgICAqIElmIHNvLCB0aGF0ICphbHdheXMqIHNvcnRzIGxvd2VyIHRoYW4gYW55dGhpbmcgZWxzZS4KLSAgICAgKi8KLSAgICBpZiAoaXNfcGFyZW50KCgqZTEpLT5uYW1lKSkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChpc19wYXJlbnQoKCplMiktPm5hbWUpKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICAvKgotICAgICAqIEFsbCBvZiBvdXIgY29tcGFyaXNvbnMgd2lsbCBiZSBvZiB0aGUgYzEgZW50cnkgYWdhaW5zdCB0aGUgYzIgb25lLAotICAgICAqIHNvIGFzc2lnbiB0aGVtIGFwcHJvcHJpYXRlbHkgdG8gdGFrZSBjYXJlIG9mIHRoZSBvcmRlcmluZy4KLSAgICAgKi8KLSAgICBpZiAoKCplMSktPmFzY2VuZGluZykgewotICAgICAgICBjMSA9ICplMTsKLSAgICAgICAgYzIgPSAqZTI7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBjMSA9ICplMjsKLSAgICAgICAgYzIgPSAqZTE7Ci0gICAgfQotICAgIHN3aXRjaCAoYzEtPmtleSkgewotICAgIGNhc2UgS19MQVNUX01PRDoKLQlpZiAoYzEtPmxtID4gYzItPmxtKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjMS0+bG0gPCBjMi0+bG0pIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfU0laRToKLSAgICAgICAgaWYgKGMxLT5zaXplID4gYzItPnNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGMxLT5zaXplIDwgYzItPnNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIEtfREVTQzoKLSAgICAgICAgcmVzdWx0ID0gc3RyY21wKGMxLT5kZXNjID8gYzEtPmRlc2MgOiAiIiwgYzItPmRlc2MgPyBjMi0+ZGVzYyA6ICIiKTsKLSAgICAgICAgaWYgKHJlc3VsdCkgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIHN0cmNtcChjMS0+bmFtZSwgYzItPm5hbWUpOwotfQotCi0KLXN0YXRpYyBpbnQgaW5kZXhfZGlyZWN0b3J5KHJlcXVlc3RfcmVjICpyLAotCQkJICAgYXV0b2luZGV4X2NvbmZpZ19yZWMgKmF1dG9pbmRleF9jb25mKQotewotICAgIGNoYXIgKnRpdGxlX25hbWUgPSBhcF9lc2NhcGVfaHRtbChyLT5wb29sLCByLT51cmkpOwotICAgIGNoYXIgKnRpdGxlX2VuZHA7Ci0gICAgY2hhciAqbmFtZSA9IHItPmZpbGVuYW1lOwotCi0gICAgRElSICpkOwotICAgIHN0cnVjdCBESVJfVFlQRSAqZHN0cnVjdDsKLSAgICBpbnQgbnVtX2VudCA9IDAsIHg7Ci0gICAgc3RydWN0IGVudCAqaGVhZCwgKnA7Ci0gICAgc3RydWN0IGVudCAqKmFyID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICpxc3RyaW5nOwotICAgIGludCBhdXRvaW5kZXhfb3B0cyA9IGF1dG9pbmRleF9jb25mLT5vcHRzOwotICAgIGNoYXIga2V5aWQ7Ci0gICAgY2hhciBkaXJlY3Rpb247Ci0KLSAgICBpZiAoIShkID0gYXBfcG9wZW5kaXIoci0+cG9vbCwgbmFtZSkpKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsCi0JCSAgICAiQ2FuJ3Qgb3BlbiBkaXJlY3RvcnkgZm9yIGluZGV4OiAlcyIsIHItPmZpbGVuYW1lKTsKLQlyZXR1cm4gSFRUUF9GT1JCSURERU47Ci0gICAgfQotCi0gICAgci0+Y29udGVudF90eXBlID0gInRleHQvaHRtbCI7Ci0KLSAgICBhcF9zZW5kX2h0dHBfaGVhZGVyKHIpOwotCi0gICAgaWYgKHItPmhlYWRlcl9vbmx5KSB7Ci0JYXBfcGNsb3NlZGlyKHItPnBvb2wsIGQpOwotCXJldHVybiAwOwotICAgIH0KLSAgICBhcF9oYXJkX3RpbWVvdXQoInNlbmQgZGlyZWN0b3J5Iiwgcik7Ci0KLSAgICAvKiBTcGV3IEhUTUwgcHJlYW1ibGUgKi8KLQotICAgIHRpdGxlX2VuZHAgPSB0aXRsZV9uYW1lICsgc3RybGVuKHRpdGxlX25hbWUpIC0gMTsKLQotICAgIHdoaWxlICh0aXRsZV9lbmRwID4gdGl0bGVfbmFtZSAmJiAqdGl0bGVfZW5kcCA9PSAnLycpIHsKLQkqdGl0bGVfZW5kcC0tID0gJ1wwJzsKLSAgICB9Ci0KLSAgICBlbWl0X2hlYWQociwgZmluZF9oZWFkZXIoYXV0b2luZGV4X2NvbmYsIHIpLAotCSAgICAgIGF1dG9pbmRleF9vcHRzICYgU1VQUFJFU1NfUFJFQU1CTEUsIHRpdGxlX25hbWUpOwotCi0gICAgLyoKLSAgICAgKiBGaWd1cmUgb3V0IHdoYXQgc29ydCBvZiBpbmRleGluZyAoaWYgYW55KSB3ZSdyZSBzdXBwb3NlZCB0byB1c2UuCi0gICAgICoKLSAgICAgKiBJZiBubyBRVUVSWV9TVFJJTkcgd2FzIHNwZWNpZmllZCBvciBjb2x1bW4gc29ydGluZyBoYXMgYmVlbgotICAgICAqIGV4cGxpY2l0bHkgZGlzYWJsZWQsIHdlIHVzZSB0aGUgZGVmYXVsdCBzcGVjaWZpZWQgYnkgdGhlCi0gICAgICogSW5kZXhPcmRlckRlZmF1bHQgZGlyZWN0aXZlIChpZiB0aGVyZSBpcyBvbmUpOyBvdGhlcndpc2UsCi0gICAgICogd2UgZmFsbCBiYWNrIHRvIGFzY2VuZGluZyBieSBuYW1lLgotICAgICAqLwotICAgIHFzdHJpbmcgPSByLT5hcmdzOwotICAgIGlmICgoYXV0b2luZGV4X29wdHMgJiBTVVBQUkVTU19DT0xTT1JUKQotCXx8ICgocXN0cmluZyA9PSBOVUxMKSB8fCAoKnFzdHJpbmcgPT0gJ1wwJykpKSB7Ci0JcXN0cmluZyA9IGF1dG9pbmRleF9jb25mLT5kZWZhdWx0X29yZGVyOwotICAgIH0KLSAgICAvKgotICAgICAqIElmIHRoZXJlIGlzIG5vIHNwZWNpZmljIG9yZGVyaW5nIGRlZmluZWQgZm9yIHRoaXMgZGlyZWN0b3J5LAotICAgICAqIGRlZmF1bHQgdG8gYXNjZW5kaW5nIGJ5IGZpbGVuYW1lLgotICAgICAqLwotICAgIGlmICgocXN0cmluZyA9PSBOVUxMKSB8fCAoKnFzdHJpbmcgPT0gJ1wwJykpIHsKLQlrZXlpZCA9IEtfTkFNRTsKLQlkaXJlY3Rpb24gPSBEX0FTQ0VORElORzsKLSAgICB9Ci0gICAgZWxzZSB7Ci0Ja2V5aWQgPSAqcXN0cmluZzsKLQlhcF9nZXR3b3JkKHItPnBvb2wsICZxc3RyaW5nLCAnPScpOwotCWlmIChxc3RyaW5nICE9ICdcMCcpIHsKLQkgICAgZGlyZWN0aW9uID0gKnFzdHJpbmc7Ci0JfQotCWVsc2UgewotCSAgICBkaXJlY3Rpb24gPSBEX0FTQ0VORElORzsKLQl9Ci0gICAgfQotCi0gICAgLyogCi0gICAgICogU2luY2Ugd2UgZG9uJ3Qga25vdyBob3cgbWFueSBkaXIuIGVudHJpZXMgdGhlcmUgYXJlLCBwdXQgdGhlbSBpbnRvIGEgCi0gICAgICogbGlua2VkIGxpc3QgYW5kIHRoZW4gYXJyYXlpZmljYXRlIHRoZW0gc28gcXNvcnQgY2FuIHVzZSB0aGVtLiAKLSAgICAgKi8KLSAgICBoZWFkID0gTlVMTDsKLSAgICB3aGlsZSAoKGRzdHJ1Y3QgPSByZWFkZGlyKGQpKSkgewotCXAgPSBtYWtlX2F1dG9pbmRleF9lbnRyeShkc3RydWN0LT5kX25hbWUsIGF1dG9pbmRleF9vcHRzLAotCQkJCSBhdXRvaW5kZXhfY29uZiwgciwga2V5aWQsIGRpcmVjdGlvbik7Ci0JaWYgKHAgIT0gTlVMTCkgewotCSAgICBwLT5uZXh0ID0gaGVhZDsKLQkgICAgaGVhZCA9IHA7Ci0JICAgIG51bV9lbnQrKzsKLQl9Ci0gICAgfQotICAgIGlmIChudW1fZW50ID4gMCkgewotCWFyID0gKHN0cnVjdCBlbnQgKiopIGFwX3BhbGxvYyhyLT5wb29sLAotCQkJCSAgICAgICBudW1fZW50ICogc2l6ZW9mKHN0cnVjdCBlbnQgKikpOwotCXAgPSBoZWFkOwotCXggPSAwOwotCXdoaWxlIChwKSB7Ci0JICAgIGFyW3grK10gPSBwOwotCSAgICBwID0gcC0+bmV4dDsKLQl9Ci0KLQlxc29ydCgodm9pZCAqKSBhciwgbnVtX2VudCwgc2l6ZW9mKHN0cnVjdCBlbnQgKiksCi0JICAgICAgKGludCAoKikoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKSBkc29ydGYpOwotICAgIH0KLSAgICBvdXRwdXRfZGlyZWN0b3JpZXMoYXIsIG51bV9lbnQsIGF1dG9pbmRleF9jb25mLCByLCBhdXRvaW5kZXhfb3B0cywga2V5aWQsCi0JCSAgICAgICBkaXJlY3Rpb24pOwotICAgIGFwX3BjbG9zZWRpcihyLT5wb29sLCBkKTsKLQotICAgIGlmIChhdXRvaW5kZXhfb3B0cyAmIEZBTkNZX0lOREVYSU5HKSB7Ci0JYXBfcnB1dHMoIjxIUj5cbiIsIHIpOwotICAgIH0KLSAgICBlbWl0X3RhaWwociwgZmluZF9yZWFkbWUoYXV0b2luZGV4X2NvbmYsIHIpLAotCSAgICAgIGF1dG9pbmRleF9vcHRzICYgU1VQUFJFU1NfUFJFQU1CTEUpOwotCi0gICAgYXBfa2lsbF90aW1lb3V0KHIpOwotICAgIHJldHVybiAwOwotfQotCi0vKiBUaGUgZm9ybWFsIGhhbmRsZXIuLi4gKi8KLQotc3RhdGljIGludCBoYW5kbGVfYXV0b2luZGV4KHJlcXVlc3RfcmVjICpyKQotewotICAgIGF1dG9pbmRleF9jb25maWdfcmVjICpkOwotICAgIGludCBhbGxvd19vcHRzID0gYXBfYWxsb3dfb3B0aW9ucyhyKTsKLQotICAgIGQgPSAoYXV0b2luZGV4X2NvbmZpZ19yZWMgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCQkgICAgICAmYXV0b2luZGV4X21vZHVsZSk7Ci0KLSAgICByLT5hbGxvd2VkIHw9ICgxIDw8IE1fR0VUKTsKLSAgICBpZiAoci0+bWV0aG9kX251bWJlciAhPSBNX0dFVCkgewotCXJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICAvKiBPSywgbm90aGluZyBlYXN5LiAgVHJvdCBvdXQgdGhlIGhlYXZ5IGFydGlsbGVyeS4uLiAqLwotCi0gICAgaWYgKGFsbG93X29wdHMgJiBPUFRfSU5ERVhFUykgewotCS8qIEtMVURHRSAtLS0gbWFrZSB0aGUgc3ViX3JlcSBsb29rdXBzIGhhcHBlbiBpbiB0aGUgcmlnaHQgZGlyZWN0b3J5LgotCSAqIEZpeGluZyB0aGlzIGluIHRoZSBzdWJfcmVxX2xvb2t1cCBmdW5jdGlvbnMgdGhlbXNlbHZlcyBpcyBkaWZmaWN1bHQsCi0JICogYW5kIHdvdWxkIHByb2JhYmx5IGJyZWFrIHZpcnR1YWwgaW5jbHVkZXMuLi4KLQkgKi8KLQotCWlmIChyLT5maWxlbmFtZVtzdHJsZW4oci0+ZmlsZW5hbWUpIC0gMV0gIT0gJy8nKSB7Ci0JICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCByLT5maWxlbmFtZSwgIi8iLCBOVUxMKTsKLQl9Ci0JcmV0dXJuIGluZGV4X2RpcmVjdG9yeShyLCBkKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLQkJICAgICAiRGlyZWN0b3J5IGluZGV4IGZvcmJpZGRlbiBieSBydWxlOiAlcyIsIHItPmZpbGVuYW1lKTsKLQlyZXR1cm4gSFRUUF9GT1JCSURERU47Ci0gICAgfQotfQotCi0KLXN0YXRpYyBjb25zdCBoYW5kbGVyX3JlYyBhdXRvaW5kZXhfaGFuZGxlcnNbXSA9Ci17Ci0gICAge0RJUl9NQUdJQ19UWVBFLCBoYW5kbGVfYXV0b2luZGV4fSwKLSAgICB7TlVMTH0KLX07Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBhdXRvaW5kZXhfbW9kdWxlID0KLXsKLSAgICBTVEFOREFSRF9NT0RVTEVfU1RVRkYsCi0gICAgTlVMTCwJCQkvKiBpbml0aWFsaXplciAqLwotICAgIGNyZWF0ZV9hdXRvaW5kZXhfY29uZmlnLAkvKiBkaXIgY29uZmlnIGNyZWF0ZXIgKi8KLSAgICBtZXJnZV9hdXRvaW5kZXhfY29uZmlncywJLyogZGlyIG1lcmdlciAtLS0gZGVmYXVsdCBpcyB0byBvdmVycmlkZSAqLwotICAgIE5VTEwsCQkJLyogc2VydmVyIGNvbmZpZyAqLwotICAgIE5VTEwsCQkJLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLwotICAgIGF1dG9pbmRleF9jbWRzLAkJLyogY29tbWFuZCB0YWJsZSAqLwotICAgIGF1dG9pbmRleF9oYW5kbGVycywJCS8qIGhhbmRsZXJzICovCi0gICAgTlVMTCwJCQkvKiBmaWxlbmFtZSB0cmFuc2xhdGlvbiAqLwotICAgIE5VTEwsCQkJLyogY2hlY2tfdXNlcl9pZCAqLwotICAgIE5VTEwsCQkJLyogY2hlY2sgYXV0aCAqLwotICAgIE5VTEwsCQkJLyogY2hlY2sgYWNjZXNzICovCi0gICAgTlVMTCwJCQkvKiB0eXBlX2NoZWNrZXIgKi8KLSAgICBOVUxMLAkJCS8qIGZpeHVwcyAqLwotICAgIE5VTEwsCQkJLyogbG9nZ2VyICovCi0gICAgTlVMTCwJCQkvKiBoZWFkZXIgcGFyc2VyICovCi0gICAgTlVMTCwJCQkvKiBjaGlsZF9pbml0ICovCi0gICAgTlVMTCwJCQkvKiBjaGlsZF9leGl0ICovCi0gICAgTlVMTAkJCS8qIHBvc3QgcmVhZC1yZXF1ZXN0ICovCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9hdXRvaW5kZXguZHNwIGIvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9hdXRvaW5kZXguZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDMwMzkxLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfYXV0b2luZGV4LmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9Im1vZF9hdXRvaW5kZXgiIC0gUGFja2FnZSBPd25lcj08ND4KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDAKLSMgKiogRE8gTk9UIEVESVQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDEwMgotCi1DRkc9bW9kX2F1dG9pbmRleCAtIFdpbjMyIFJlbGVhc2UKLSFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAibW9kX2F1dG9pbmRleC5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIm1vZF9hdXRvaW5kZXgubWFrIiBDRkc9Im1vZF9hdXRvaW5kZXggLSBXaW4zMiBSZWxlYXNlIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgIm1vZF9hdXRvaW5kZXggLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFICJtb2RfYXV0b2luZGV4IC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1NVEw9bWlkbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAibW9kX2F1dG9pbmRleCAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0kgIi4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9GZCJSZWxlYXNlXG1vZF9hdXRvaW5kZXgiIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvbWFjaGluZTpJMzg2IC9vdXQ6IlJlbGVhc2UvbW9kX2F1dG9pbmRleC5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfYXV0b2luZGV4Ci0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvbWFjaGluZTpJMzg2IC9vdXQ6IlJlbGVhc2UvbW9kX2F1dG9pbmRleC5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfYXV0b2luZGV4Ci0KLSFFTFNFSUYgICIkKENGRykiID09ICJtb2RfYXV0b2luZGV4IC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HWCAvWmkgL09kIC9JICIuLi8uLi9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci11dGlsL2luY2x1ZGUiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRmQiRGVidWdcbW9kX2F1dG9pbmRleCIgL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvaW5jcmVtZW50YWw6bm8gL21hcCAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJEZWJ1Zy9tb2RfYXV0b2luZGV4LnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF9hdXRvaW5kZXgKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvaW5jcmVtZW50YWw6bm8gL21hcCAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJEZWJ1Zy9tb2RfYXV0b2luZGV4LnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF9hdXRvaW5kZXgKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIm1vZF9hdXRvaW5kZXggLSBXaW4zMiBSZWxlYXNlIgotIyBOYW1lICJtb2RfYXV0b2luZGV4IC0gV2luMzIgRGVidWciCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZF9hdXRvaW5kZXguYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kX2F1dG9pbmRleC5yYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXGJ1aWxkXHdpbjMyXHdpbjMydmVyLmF3awotCi0hSUYgICIkKENGRykiID09ICJtb2RfYXV0b2luZGV4IC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBDcmVhdGluZyBWZXJzaW9uIFJlc291cmNlCi1JbnB1dFBhdGg9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSIuXG1vZF9hdXRvaW5kZXgucmMiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JYXdrIC1mIC4uLy4uL2J1aWxkL3dpbjMyL3dpbjMydmVyLmF3ayBtb2RfYXV0b2luZGV4ICAiYXV0b2luZGV4X21vZHVsZSBmb3IgQXBhY2hlIiAuLi8uLi9pbmNsdWRlL2FwX3JlbGVhc2UuaCA+IC5cbW9kX2F1dG9pbmRleC5yYwotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9hdXRvaW5kZXggLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBDcmVhdGluZyBWZXJzaW9uIFJlc291cmNlCi1JbnB1dFBhdGg9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSIuXG1vZF9hdXRvaW5kZXgucmMiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JYXdrIC1mIC4uLy4uL2J1aWxkL3dpbjMyL3dpbjMydmVyLmF3ayBtb2RfYXV0b2luZGV4ICAiYXV0b2luZGV4X21vZHVsZSBmb3IgQXBhY2hlIiAuLi8uLi9pbmNsdWRlL2FwX3JlbGVhc2UuaCA+IC5cbW9kX2F1dG9pbmRleC5yYwotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2F1dG9pbmRleC5leHAgYi9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2F1dG9pbmRleC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZjQwNTcuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9hdXRvaW5kZXguZXhwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYXV0b2luZGV4X21vZHVsZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9jZ2kuYyBiL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfY2dpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MmZiNWEuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9jZ2kuYworKysgL2Rldi9udWxsCkBAIC0xLDYwOSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBodHRwX3NjcmlwdDoga2VlcHMgYWxsIHNjcmlwdC1yZWxhdGVkIHJhbWJsaW5ncyB0b2dldGhlci4KLSAqIAotICogQ29tcGxpYW50IHRvIENHSS8xLjEgc3BlYwotICogCi0gKiBBZGFwdGVkIGJ5IHJzdCBmcm9tIG9yaWdpbmFsIE5DU0EgY29kZSBieSBSb2IgTWNDb29sCi0gKgotICogQXBhY2hlIGFkZHMgc29tZSBuZXcgZW52IHZhcnM7IFJFRElSRUNUX1VSTCBhbmQgUkVESVJFQ1RfUVVFUllfU1RSSU5HIGZvcgotICogY3VzdG9tIGVycm9yIHJlc3BvbnNlcywgYW5kIERPQ1VNRU5UX1JPT1QgYmVjYXVzZSB3ZSBmb3VuZCBpdCB1c2VmdWwuCi0gKiBJdCBhbHNvIGFkZHMgU0VSVkVSX0FETUlOIC0gdXNlZnVsIGZvciBzY3JpcHRzIHRvIGtub3cgd2hvIHRvIG1haWwgd2hlbiAKLSAqIHRoZXkgZmFpbC4KLSAqLwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfcmVxdWVzdC5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJodHRwX21haW4uaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgInV0aWxfc2NyaXB0LmgiCi0jaW5jbHVkZSAiaHR0cF9jb25mX2dsb2JhbHMuaCIKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGNnaV9tb2R1bGU7Ci0KLS8qIEtMVURHRSAtLS0gZm9yIGJhY2stY29tYmF0aWJpbGl0eSwgd2UgZG9uJ3QgaGF2ZSB0byBjaGVjayBFeGVjQ0dJCi0gKiBpbiBTY3JpcHRBbGlhc2VkIGRpcmVjdG9yaWVzLCB3aGljaCBtZWFucyB3ZSBuZWVkIHRvIGtub3cgaWYgdGhpcwotICogcmVxdWVzdCBjYW1lIHRocm91Z2ggU2NyaXB0QWxpYXMgb3Igbm90Li4uIHNvIHRoZSBBbGlhcyBtb2R1bGUKLSAqIGxlYXZlcyBhIG5vdGUgZm9yIHVzLgotICovCi0KLXN0YXRpYyBpbnQgaXNfc2NyaXB0YWxpYXNlZChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb25zdCBjaGFyICp0ID0gYXBfdGFibGVfZ2V0KHItPm5vdGVzLCAiYWxpYXMtZm9yY2VkLXR5cGUiKTsKLSAgICByZXR1cm4gdCAmJiAoIXN0cmNhc2VjbXAodCwgImNnaS1zY3JpcHQiKSk7Ci19Ci0KLS8qIENvbmZpZ3VyYXRpb24gc3R1ZmYgKi8KLQotI2RlZmluZSBERUZBVUxUX0xPR0JZVEVTIDEwMzg1NzYwCi0jZGVmaW5lIERFRkFVTFRfQlVGQllURVMgMTAyNAotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY2hhciAqbG9nbmFtZTsKLSAgICBsb25nIGxvZ2J5dGVzOwotICAgIGludCBidWZieXRlczsKLX0gY2dpX3NlcnZlcl9jb25mOwotCi1zdGF0aWMgdm9pZCAqY3JlYXRlX2NnaV9jb25maWcocG9vbCAqcCwgc2VydmVyX3JlYyAqcykKLXsKLSAgICBjZ2lfc2VydmVyX2NvbmYgKmMgPQotICAgIChjZ2lfc2VydmVyX2NvbmYgKikgYXBfcGNhbGxvYyhwLCBzaXplb2YoY2dpX3NlcnZlcl9jb25mKSk7Ci0KLSAgICBjLT5sb2duYW1lID0gTlVMTDsKLSAgICBjLT5sb2dieXRlcyA9IERFRkFVTFRfTE9HQllURVM7Ci0gICAgYy0+YnVmYnl0ZXMgPSBERUZBVUxUX0JVRkJZVEVTOwotCi0gICAgcmV0dXJuIGM7Ci19Ci0KLXN0YXRpYyB2b2lkICptZXJnZV9jZ2lfY29uZmlnKHBvb2wgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICpvdmVycmlkZXN2KQotewotICAgIGNnaV9zZXJ2ZXJfY29uZiAqYmFzZSA9IChjZ2lfc2VydmVyX2NvbmYgKikgYmFzZXYsICpvdmVycmlkZXMgPSAoY2dpX3NlcnZlcl9jb25mICopIG92ZXJyaWRlc3Y7Ci0KLSAgICByZXR1cm4gb3ZlcnJpZGVzLT5sb2duYW1lID8gb3ZlcnJpZGVzIDogYmFzZTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9zY3JpcHRsb2coY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0gICAgc2VydmVyX3JlYyAqcyA9IGNtZC0+c2VydmVyOwotICAgIGNnaV9zZXJ2ZXJfY29uZiAqY29uZiA9Ci0gICAgKGNnaV9zZXJ2ZXJfY29uZiAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAmY2dpX21vZHVsZSk7Ci0KLSAgICBjb25mLT5sb2duYW1lID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3NjcmlwdGxvZ19sZW5ndGgoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0gICAgc2VydmVyX3JlYyAqcyA9IGNtZC0+c2VydmVyOwotICAgIGNnaV9zZXJ2ZXJfY29uZiAqY29uZiA9Ci0gICAgKGNnaV9zZXJ2ZXJfY29uZiAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAmY2dpX21vZHVsZSk7Ci0KLSAgICBjb25mLT5sb2dieXRlcyA9IGF0b2woYXJnKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9zY3JpcHRsb2dfYnVmZmVyKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIHNlcnZlcl9yZWMgKnMgPSBjbWQtPnNlcnZlcjsKLSAgICBjZ2lfc2VydmVyX2NvbmYgKmNvbmYgPQotICAgIChjZ2lfc2VydmVyX2NvbmYgKikgYXBfZ2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywgJmNnaV9tb2R1bGUpOwotCi0gICAgY29uZi0+YnVmYnl0ZXMgPSBhdG9pKGFyZyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBjZ2lfY21kc1tdID0KLXsKLSAgICB7IlNjcmlwdExvZyIsIHNldF9zY3JpcHRsb2csIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICAgICJ0aGUgbmFtZSBvZiBhIGxvZyBmb3Igc2NyaXB0IGRlYnVnZ2luZyBpbmZvIn0sCi0gICAgeyJTY3JpcHRMb2dMZW5ndGgiLCBzZXRfc2NyaXB0bG9nX2xlbmd0aCwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAgInRoZSBtYXhpbXVtIGxlbmd0aCAoaW4gYnl0ZXMpIG9mIHRoZSBzY3JpcHQgZGVidWcgbG9nIn0sCi0gICAgeyJTY3JpcHRMb2dCdWZmZXIiLCBzZXRfc2NyaXB0bG9nX2J1ZmZlciwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAgInRoZSBtYXhpbXVtIHNpemUgKGluIGJ5dGVzKSB0byByZWNvcmQgb2YgYSBQT1NUIHJlcXVlc3QifSwKLSAgICB7TlVMTH0KLX07Ci0KLXN0YXRpYyBpbnQgbG9nX3NjcmlwdGVycm9yKHJlcXVlc3RfcmVjICpyLCBjZ2lfc2VydmVyX2NvbmYgKiBjb25mLCBpbnQgcmV0LAotCQkJICAgaW50IHNob3dfZXJybm8sIGNoYXIgKmVycm9yKQotewotICAgIEZJTEUgKmY7Ci0gICAgc3RydWN0IHN0YXQgZmluZm87Ci0KLSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIHNob3dfZXJybm98QVBMT0dfRVJSLCByLCAKLQkJIiVzOiAlcyIsIGVycm9yLCByLT5maWxlbmFtZSk7Ci0KLSAgICBpZiAoIWNvbmYtPmxvZ25hbWUgfHwKLQkoKHN0YXQoYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUoci0+cG9vbCwgY29uZi0+bG9nbmFtZSksICZmaW5mbykgPT0gMCkKLQkgJiYgICAoZmluZm8uc3Rfc2l6ZSA+IGNvbmYtPmxvZ2J5dGVzKSkgfHwKLSAgICAgICAgICgoZiA9IGFwX3Bmb3BlbihyLT5wb29sLCBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShyLT5wb29sLCBjb25mLT5sb2duYW1lKSwKLQkJICAgICAgImEiKSkgPT0gTlVMTCkpIHsKLQlyZXR1cm4gcmV0OwotICAgIH0KLQotICAgIC8qICIlJSBbV2VkIEp1biAxOSAxMDo1MzoyMSAxOTk2XSBHRVQgL2NnaS1iaW4vcHJpbnRlbnYgSFRUUC8xLjAiICovCi0gICAgZnByaW50ZihmLCAiJSUlJSBbJXNdICVzICVzJXMlcyAlc1xuIiwgYXBfZ2V0X3RpbWUoKSwgci0+bWV0aG9kLCByLT51cmksCi0JICAgIHItPmFyZ3MgPyAiPyIgOiAiIiwgci0+YXJncyA/IHItPmFyZ3MgOiAiIiwgci0+cHJvdG9jb2wpOwotICAgIC8qICIlJSA1MDAgL3Vzci9sb2NhbC9hcGFjaGUvY2dpLWJpbiAqLwotICAgIGZwcmludGYoZiwgIiUlJSUgJWQgJXNcbiIsIHJldCwgci0+ZmlsZW5hbWUpOwotCi0gICAgZnByaW50ZihmLCAiJSVlcnJvclxuJXNcbiIsIGVycm9yKTsKLQotICAgIGFwX3BmY2xvc2Uoci0+cG9vbCwgZik7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBsb2dfc2NyaXB0KHJlcXVlc3RfcmVjICpyLCBjZ2lfc2VydmVyX2NvbmYgKiBjb25mLCBpbnQgcmV0LAotCQkgIGNoYXIgKmRidWYsIGNvbnN0IGNoYXIgKnNidWYsIEJVRkYgKnNjcmlwdF9pbiwgQlVGRiAqc2NyaXB0X2VycikKLXsKLSAgICBhcnJheV9oZWFkZXIgKmhkcnNfYXJyID0gYXBfdGFibGVfZWx0cyhyLT5oZWFkZXJzX2luKTsKLSAgICB0YWJsZV9lbnRyeSAqaGRycyA9ICh0YWJsZV9lbnRyeSAqKSBoZHJzX2Fyci0+ZWx0czsKLSAgICBjaGFyIGFyZ3NidWZmZXJbSFVHRV9TVFJJTkdfTEVOXTsKLSAgICBGSUxFICpmOwotICAgIGludCBpOwotICAgIHN0cnVjdCBzdGF0IGZpbmZvOwotCi0gICAgaWYgKCFjb25mLT5sb2duYW1lIHx8Ci0JKChzdGF0KGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHItPnBvb2wsIGNvbmYtPmxvZ25hbWUpLCAmZmluZm8pID09IDApCi0JICYmICAgKGZpbmZvLnN0X3NpemUgPiBjb25mLT5sb2dieXRlcykpIHx8Ci0gICAgICAgICAoKGYgPSBhcF9wZm9wZW4oci0+cG9vbCwgYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUoci0+cG9vbCwgY29uZi0+bG9nbmFtZSksCi0JCSAgICAgICJhIikpID09IE5VTEwpKSB7Ci0JLyogU29hayB1cCBzY3JpcHQgb3V0cHV0ICovCi0Jd2hpbGUgKGFwX2JnZXRzKGFyZ3NidWZmZXIsIEhVR0VfU1RSSU5HX0xFTiwgc2NyaXB0X2luKSA+IDApCi0JICAgIGNvbnRpbnVlOwotI2lmZGVmIFdJTjMyCi0gICAgICAgIC8qIFNvYWsgdXAgc3RkZXJyIGFuZCByZWRpcmVjdCBpdCB0byB0aGUgZXJyb3IgbG9nLgotICAgICAgICAgKiBTY3JpcHQgb3V0cHV0IHRvIHN0ZGVyciBpcyBhbHJlYWR5IGRpcmVjdGVkIHRvIHRoZSBlcnJvciBsb2cKLSAgICAgICAgICogb24gVW5peCwgdGhhbmtzIHRvIHRoZSBtYWdpYyBvZiBmb3JrKCkuCi0gICAgICAgICAqLwotICAgICAgICB3aGlsZSAoYXBfYmdldHMoYXJnc2J1ZmZlciwgSFVHRV9TVFJJTkdfTEVOLCBzY3JpcHRfZXJyKSA+IDApIHsKLSAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSIHwgQVBMT0dfTk9FUlJOTywgciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIlcyIsIGFyZ3NidWZmZXIpOyAgICAgICAgICAgIAotICAgICAgICB9Ci0jZWxzZQotCXdoaWxlIChhcF9iZ2V0cyhhcmdzYnVmZmVyLCBIVUdFX1NUUklOR19MRU4sIHNjcmlwdF9lcnIpID4gMCkKLQkgICAgY29udGludWU7Ci0jZW5kaWYKLQlyZXR1cm4gcmV0OwotICAgIH0KLQotICAgIC8qICIlJSBbV2VkIEp1biAxOSAxMDo1MzoyMSAxOTk2XSBHRVQgL2NnaS1iaW4vcHJpbnRlbnYgSFRUUC8xLjAiICovCi0gICAgZnByaW50ZihmLCAiJSUlJSBbJXNdICVzICVzJXMlcyAlc1xuIiwgYXBfZ2V0X3RpbWUoKSwgci0+bWV0aG9kLCByLT51cmksCi0JICAgIHItPmFyZ3MgPyAiPyIgOiAiIiwgci0+YXJncyA/IHItPmFyZ3MgOiAiIiwgci0+cHJvdG9jb2wpOwotICAgIC8qICIlJSA1MDAgL3Vzci9sb2NhbC9hcGFjaGUvY2dpLWJpbiIgKi8KLSAgICBmcHJpbnRmKGYsICIlJSUlICVkICVzXG4iLCByZXQsIHItPmZpbGVuYW1lKTsKLQotICAgIGZwdXRzKCIlcmVxdWVzdFxuIiwgZik7Ci0gICAgZm9yIChpID0gMDsgaSA8IGhkcnNfYXJyLT5uZWx0czsgKytpKSB7Ci0JaWYgKCFoZHJzW2ldLmtleSkKLQkgICAgY29udGludWU7Ci0JZnByaW50ZihmLCAiJXM6ICVzXG4iLCBoZHJzW2ldLmtleSwgaGRyc1tpXS52YWwpOwotICAgIH0KLSAgICBpZiAoKHItPm1ldGhvZF9udW1iZXIgPT0gTV9QT1NUIHx8IHItPm1ldGhvZF9udW1iZXIgPT0gTV9QVVQpCi0JJiYgKmRidWYpIHsKLQlmcHJpbnRmKGYsICJcbiVzXG4iLCBkYnVmKTsKLSAgICB9Ci0KLSAgICBmcHV0cygiJXJlc3BvbnNlXG4iLCBmKTsKLSAgICBoZHJzX2FyciA9IGFwX3RhYmxlX2VsdHMoci0+ZXJyX2hlYWRlcnNfb3V0KTsKLSAgICBoZHJzID0gKHRhYmxlX2VudHJ5ICopIGhkcnNfYXJyLT5lbHRzOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGhkcnNfYXJyLT5uZWx0czsgKytpKSB7Ci0JaWYgKCFoZHJzW2ldLmtleSkKLQkgICAgY29udGludWU7Ci0JZnByaW50ZihmLCAiJXM6ICVzXG4iLCBoZHJzW2ldLmtleSwgaGRyc1tpXS52YWwpOwotICAgIH0KLQotICAgIGlmIChzYnVmICYmICpzYnVmKQotCWZwcmludGYoZiwgIiVzXG4iLCBzYnVmKTsKLQotICAgIGlmIChhcF9iZ2V0cyhhcmdzYnVmZmVyLCBIVUdFX1NUUklOR19MRU4sIHNjcmlwdF9pbikgPiAwKSB7Ci0JZnB1dHMoIiVzdGRvdXRcbiIsIGYpOwotCWZwdXRzKGFyZ3NidWZmZXIsIGYpOwotCXdoaWxlIChhcF9iZ2V0cyhhcmdzYnVmZmVyLCBIVUdFX1NUUklOR19MRU4sIHNjcmlwdF9pbikgPiAwKQotCSAgICBmcHV0cyhhcmdzYnVmZmVyLCBmKTsKLQlmcHV0cygiXG4iLCBmKTsKLSAgICB9Ci0KLSAgICBpZiAoYXBfYmdldHMoYXJnc2J1ZmZlciwgSFVHRV9TVFJJTkdfTEVOLCBzY3JpcHRfZXJyKSA+IDApIHsKLQlmcHV0cygiJXN0ZGVyclxuIiwgZik7Ci0JZnB1dHMoYXJnc2J1ZmZlciwgZik7Ci0Jd2hpbGUgKGFwX2JnZXRzKGFyZ3NidWZmZXIsIEhVR0VfU1RSSU5HX0xFTiwgc2NyaXB0X2VycikgPiAwKQotCSAgICBmcHV0cyhhcmdzYnVmZmVyLCBmKTsKLQlmcHV0cygiXG4iLCBmKTsKLSAgICB9Ci0KLSAgICBhcF9iY2xvc2Uoc2NyaXB0X2luKTsKLSAgICBhcF9iY2xvc2Uoc2NyaXB0X2Vycik7Ci0KLSAgICBhcF9wZmNsb3NlKHItPnBvb2wsIGYpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQWN0dWFsIENHSSBoYW5kbGluZy4uLgotICovCi0KLQotc3RydWN0IGNnaV9jaGlsZF9zdHVmZiB7Ci0jaWZkZWYgVFBGCi0gICAgVFBGX0ZPUktfQ0hJTEQgdDsKLSNlbmRpZgotICAgIHJlcXVlc3RfcmVjICpyOwotICAgIGludCBucGg7Ci0gICAgaW50IGRlYnVnOwotICAgIGNoYXIgKmFyZ3YwOwotfTsKLQotc3RhdGljIGludCBjZ2lfY2hpbGQodm9pZCAqY2hpbGRfc3R1ZmYsIGNoaWxkX2luZm8gKnBpbmZvKQotewotICAgIHN0cnVjdCBjZ2lfY2hpbGRfc3R1ZmYgKmNsZCA9IChzdHJ1Y3QgY2dpX2NoaWxkX3N0dWZmICopIGNoaWxkX3N0dWZmOwotICAgIHJlcXVlc3RfcmVjICpyID0gY2xkLT5yOwotICAgIGNoYXIgKmFyZ3YwID0gY2xkLT5hcmd2MDsKLSAgICBpbnQgY2hpbGRfcGlkOwotCi0jaWZkZWYgREVCVUdfQ0dJCi0jaWZkZWYgT1MyCi0gICAgLyogVW5kZXIgT1MvMiBuZWVkIHRvIHVzZSBkZXZpY2UgY29uLiAqLwotICAgIEZJTEUgKmRiZyA9IGZvcGVuKCJjb24iLCAidyIpOwotI2Vsc2UKLSAgICBGSUxFICpkYmcgPSBmb3BlbigiL2Rldi90dHkiLCAidyIpOwotI2VuZGlmCi0gICAgaW50IGk7Ci0jZW5kaWYKLQotICAgIGNoYXIgKiplbnY7Ci0KLSAgICBSQUlTRV9TSUdTVE9QKENHSV9DSElMRCk7Ci0jaWZkZWYgREVCVUdfQ0dJCi0gICAgZnByaW50ZihkYmcsICJBdHRlbXB0aW5nIHRvIGV4ZWMgJXMgYXMgJXNDR0kgY2hpbGQgKGFyZ3YwID0gJXMpXG4iLAotCSAgICByLT5maWxlbmFtZSwgY2xkLT5ucGggPyAiTlBIICIgOiAiIiwgYXJndjApOwotI2VuZGlmCi0KLSAgICBhcF9hZGRfY2dpX3ZhcnMocik7Ci0gICAgZW52ID0gYXBfY3JlYXRlX2Vudmlyb25tZW50KHItPnBvb2wsIHItPnN1YnByb2Nlc3NfZW52KTsKLQotI2lmZGVmIERFQlVHX0NHSQotICAgIGZwcmludGYoZGJnLCAiRW52aXJvbm1lbnQ6IFxuIik7Ci0gICAgZm9yIChpID0gMDsgZW52W2ldOyArK2kpCi0JZnByaW50ZihkYmcsICInJXMnXG4iLCBlbnZbaV0pOwotI2VuZGlmCi0KLSNpZm5kZWYgV0lOMzIKLSAgICBhcF9jaGRpcl9maWxlKHItPmZpbGVuYW1lKTsKLSNlbmRpZgotICAgIGlmICghY2xkLT5kZWJ1ZykKLQlhcF9lcnJvcl9sb2cyc3RkZXJyKHItPnNlcnZlcik7Ci0KLSAgICAvKiBUcmFuc3VtdXRlIG91dHNlbHZlcyBpbnRvIHRoZSBzY3JpcHQuCi0gICAgICogTkIgb25seSBJU0lOREVYIHNjcmlwdHMgZ2V0IGRlY29kZWQgYXJndW1lbnRzLgotICAgICAqLwotCi0jaWZkZWYgVFBGCi0gICAgcmV0dXJuICgwKTsKLSNlbHNlCi0gICAgYXBfY2xlYW51cF9mb3JfZXhlYygpOwotCi0gICAgY2hpbGRfcGlkID0gYXBfY2FsbF9leGVjKHIsIHBpbmZvLCBhcmd2MCwgZW52LCAwKTsKLSNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKE9TMikKLSAgICByZXR1cm4gKGNoaWxkX3BpZCk7Ci0jZWxzZQotCi0gICAgLyogVWggb2guICBTdGlsbCBoZXJlLiAgV2hlcmUncyB0aGUga2Fib29tPyAgVGhlcmUgd2FzIHN1cHBvc2VkIHRvIGJlIGFuCi0gICAgICogRUFSVEgtc2hhdHRlcmluZyBrYWJvb20hCi0gICAgICoKLSAgICAgKiBPaCwgd2VsbC4gIE11ZGRsZSB0aHJvdWdoIGFzIGJlc3Qgd2UgY2FuLi4uCi0gICAgICoKLSAgICAgKiBOb3RlIHRoYXQgb25seSBzdGRlcnIgaXMgYXZhaWxhYmxlIGF0IHRoaXMgcG9pbnQsIHNvIGRvbid0IHBhc3MgaW4KLSAgICAgKiBhIHNlcnZlciB0byBhcGxvZ19lcnJvci4KLSAgICAgKi8KLQotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIE5VTEwsICJleGVjIG9mICVzIGZhaWxlZCIsIHItPmZpbGVuYW1lKTsKLSAgICBleGl0KDApOwotICAgIC8qIE5PVCBSRUFDSEVEICovCi0gICAgcmV0dXJuICgwKTsKLSNlbmRpZgotI2VuZGlmICAvKiBUUEYgKi8KLX0KLQotc3RhdGljIGludCBjZ2lfaGFuZGxlcihyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpbnQgcmV0dmFsLCBucGgsIGRicG9zID0gMDsKLSAgICBjaGFyICphcmd2MCwgKmRidWYgPSBOVUxMOwotICAgIEJVRkYgKnNjcmlwdF9vdXQsICpzY3JpcHRfaW4sICpzY3JpcHRfZXJyOwotICAgIGNoYXIgYXJnc2J1ZmZlcltIVUdFX1NUUklOR19MRU5dOwotICAgIGludCBpc19pbmNsdWRlZCA9ICFzdHJjbXAoci0+cHJvdG9jb2wsICJJTkNMVURFRCIpOwotICAgIHZvaWQgKnNjb25mID0gci0+c2VydmVyLT5tb2R1bGVfY29uZmlnOwotICAgIGNnaV9zZXJ2ZXJfY29uZiAqY29uZiA9Ci0gICAgKGNnaV9zZXJ2ZXJfY29uZiAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzY29uZiwgJmNnaV9tb2R1bGUpOwotCi0gICAgc3RydWN0IGNnaV9jaGlsZF9zdHVmZiBjbGQ7Ci0KLSAgICBpZiAoci0+bWV0aG9kX251bWJlciA9PSBNX09QVElPTlMpIHsKLQkvKiA5OSBvdXQgb2YgMTAwIENHSSBzY3JpcHRzLCB0aGlzIGlzIGFsbCB0aGV5IHN1cHBvcnQgKi8KLQlyLT5hbGxvd2VkIHw9ICgxIDw8IE1fR0VUKTsKLQlyLT5hbGxvd2VkIHw9ICgxIDw8IE1fUE9TVCk7Ci0JcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIGlmICgoYXJndjAgPSBzdHJyY2hyKHItPmZpbGVuYW1lLCAnLycpKSAhPSBOVUxMKQotCWFyZ3YwKys7Ci0gICAgZWxzZQotCWFyZ3YwID0gci0+ZmlsZW5hbWU7Ci0KLSAgICBucGggPSAhKHN0cm5jbXAoYXJndjAsICJucGgtIiwgNCkpOwotCi0gICAgaWYgKCEoYXBfYWxsb3dfb3B0aW9ucyhyKSAmIE9QVF9FWEVDQ0dJKSAmJiAhaXNfc2NyaXB0YWxpYXNlZChyKSkKLQlyZXR1cm4gbG9nX3NjcmlwdGVycm9yKHIsIGNvbmYsIEZPUkJJRERFTiwgQVBMT0dfTk9FUlJOTywKLQkJCSAgICAgICAiT3B0aW9ucyBFeGVjQ0dJIGlzIG9mZiBpbiB0aGlzIGRpcmVjdG9yeSIpOwotICAgIGlmIChucGggJiYgaXNfaW5jbHVkZWQpCi0JcmV0dXJuIGxvZ19zY3JpcHRlcnJvcihyLCBjb25mLCBGT1JCSURERU4sIEFQTE9HX05PRVJSTk8sCi0JCQkgICAgICAgImF0dGVtcHQgdG8gaW5jbHVkZSBOUEggQ0dJIHNjcmlwdCIpOwotCi0jaWYgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lOMzIpCi0gICAgLyogQWxsb3cgZm9yIGNnaSBmaWxlcyB3aXRob3V0IHRoZSAuRVhFIGV4dGVuc2lvbiBvbiB0aGVtIHVuZGVyIE9TLzIgKi8KLSAgICBpZiAoci0+ZmluZm8uc3RfbW9kZSA9PSAwKSB7Ci0Jc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLQljaGFyICpuZXdmaWxlOwotCi0JbmV3ZmlsZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgci0+ZmlsZW5hbWUsICIuRVhFIiwgTlVMTCk7Ci0KLQlpZiAoKHN0YXQobmV3ZmlsZSwgJnN0YXRidWYpICE9IDApIHx8ICghU19JU1JFRyhzdGF0YnVmLnN0X21vZGUpKSkgewotCSAgICByZXR1cm4gbG9nX3NjcmlwdGVycm9yKHIsIGNvbmYsIE5PVF9GT1VORCwgMCwKLQkJCQkgICAic2NyaXB0IG5vdCBmb3VuZCBvciB1bmFibGUgdG8gc3RhdCIpOwotCX0gZWxzZSB7Ci0JICAgIHItPmZpbGVuYW1lID0gbmV3ZmlsZTsKLQl9Ci0gICAgfQotI2Vsc2UKLSAgICBpZiAoci0+ZmluZm8uc3RfbW9kZSA9PSAwKQotCXJldHVybiBsb2dfc2NyaXB0ZXJyb3IociwgY29uZiwgTk9UX0ZPVU5ELCBBUExPR19OT0VSUk5PLAotCQkJICAgICAgICJzY3JpcHQgbm90IGZvdW5kIG9yIHVuYWJsZSB0byBzdGF0Iik7Ci0jZW5kaWYKLSAgICBpZiAoU19JU0RJUihyLT5maW5mby5zdF9tb2RlKSkKLQlyZXR1cm4gbG9nX3NjcmlwdGVycm9yKHIsIGNvbmYsIEZPUkJJRERFTiwgQVBMT0dfTk9FUlJOTywKLQkJCSAgICAgICAiYXR0ZW1wdCB0byBpbnZva2UgZGlyZWN0b3J5IGFzIHNjcmlwdCIpOwotICAgIGlmICghYXBfc3VleGVjX2VuYWJsZWQpIHsKLQlpZiAoIWFwX2Nhbl9leGVjKCZyLT5maW5mbykpCi0JICAgIHJldHVybiBsb2dfc2NyaXB0ZXJyb3IociwgY29uZiwgRk9SQklEREVOLCBBUExPR19OT0VSUk5PLAotCQkJCSAgICJmaWxlIHBlcm1pc3Npb25zIGRlbnkgc2VydmVyIGV4ZWN1dGlvbiIpOwotICAgIH0KLQotICAgIGlmICgocmV0dmFsID0gYXBfc2V0dXBfY2xpZW50X2Jsb2NrKHIsIFJFUVVFU1RfQ0hVTktFRF9FUlJPUikpKQotCXJldHVybiByZXR2YWw7Ci0KLSAgICBhcF9hZGRfY29tbW9uX3ZhcnMocik7Ci0gICAgY2xkLmFyZ3YwID0gYXJndjA7Ci0gICAgY2xkLnIgPSByOwotICAgIGNsZC5ucGggPSBucGg7Ci0gICAgY2xkLmRlYnVnID0gY29uZi0+bG9nbmFtZSA/IDEgOiAwOwotI2lmZGVmIFRQRgotICAgIGNsZC50LmZpbGVuYW1lID0gci0+ZmlsZW5hbWU7Ci0gICAgY2xkLnQuc3VicHJvY2Vzc19lbnYgPSByLT5zdWJwcm9jZXNzX2VudjsKLSAgICBjbGQudC5wcm9nX3R5cGUgPSBGT1JLX0ZJTEU7Ci0jZW5kaWYgICAvKiBUUEYgKi8KLQotI2lmZGVmIENIQVJTRVRfRUJDRElDCi0gICAgLyogWFhYOkBAQCBJcyB0aGUgZ2VuZXJhdGVkL2luY2x1ZGVkIG91dHB1dCBBTFdBWVMgaW4gdGV4dC9lYmNkaWMgZm9ybWF0PyAqLwotICAgIC8qIE9yIG11c3Qgd2UgY2hlY2sgdGhlIENvbnRlbnQtVHlwZSBmaXJzdD8gKi8KLSAgICBhcF9ic2V0ZmxhZyhyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJfRUJDRElDMkFTQ0lJLCAxKTsKLSNlbmRpZiAvKkNIQVJTRVRfRUJDRElDKi8KLQotICAgIC8qCi0gICAgICogd2Ugc3Bhd24gb3V0IG9mIHItPm1haW4gaWYgaXQncyB0aGVyZSBzbyB0aGF0IHdlIGNhbiBhdm9pZAotICAgICAqIHdhaXRpbmcgZm9yIGZyZWVfcHJvY19jaGFpbiB0byBjbGVhbnVwIGluIHRoZSBtaWRkbGUgb2YgYW4KLSAgICAgKiBTU0kgcmVxdWVzdCAtZGpnCi0gICAgICovCi0gICAgaWYgKCFhcF9ic3Bhd25fY2hpbGQoci0+bWFpbiA/IHItPm1haW4tPnBvb2wgOiByLT5wb29sLCBjZ2lfY2hpbGQsCi0JCQkgKHZvaWQgKikgJmNsZCwga2lsbF9hZnRlcl90aW1lb3V0LAotCQkJICZzY3JpcHRfb3V0LCAmc2NyaXB0X2luLCAmc2NyaXB0X2VycikpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgciwKLQkJICAgICJjb3VsZG4ndCBzcGF3biBjaGlsZCBwcm9jZXNzOiAlcyIsIHItPmZpbGVuYW1lKTsKLQlyZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgfQotCi0gICAgLyogVHJhbnNmZXIgYW55IHB1dC9wb3N0IGFyZ3MsIENFUk4gc3R5bGUuLi4KLSAgICAgKiBOb3RlIHRoYXQgd2UgYWxyZWFkeSBpZ25vcmUgU0lHUElQRSBpbiB0aGUgY29yZSBzZXJ2ZXIuCi0gICAgICovCi0KLSAgICBpZiAoYXBfc2hvdWxkX2NsaWVudF9ibG9jayhyKSkgewotCWludCBkYnNpemUsIGxlbl9yZWFkOwotCi0JaWYgKGNvbmYtPmxvZ25hbWUpIHsKLQkgICAgZGJ1ZiA9IGFwX3BjYWxsb2Moci0+cG9vbCwgY29uZi0+YnVmYnl0ZXMgKyAxKTsKLQkgICAgZGJwb3MgPSAwOwotCX0KLQotCWFwX2hhcmRfdGltZW91dCgiY29weSBzY3JpcHQgYXJncyIsIHIpOwotCi0Jd2hpbGUgKChsZW5fcmVhZCA9Ci0JCWFwX2dldF9jbGllbnRfYmxvY2sociwgYXJnc2J1ZmZlciwgSFVHRV9TVFJJTkdfTEVOKSkgPiAwKSB7Ci0JICAgIGlmIChjb25mLT5sb2duYW1lKSB7Ci0JCWlmICgoZGJwb3MgKyBsZW5fcmVhZCkgPiBjb25mLT5idWZieXRlcykgewotCQkgICAgZGJzaXplID0gY29uZi0+YnVmYnl0ZXMgLSBkYnBvczsKLQkJfQotCQllbHNlIHsKLQkJICAgIGRic2l6ZSA9IGxlbl9yZWFkOwotCQl9Ci0JCW1lbWNweShkYnVmICsgZGJwb3MsIGFyZ3NidWZmZXIsIGRic2l6ZSk7Ci0JCWRicG9zICs9IGRic2l6ZTsKLQkgICAgfQotCSAgICBhcF9yZXNldF90aW1lb3V0KHIpOwotCSAgICBpZiAoYXBfYndyaXRlKHNjcmlwdF9vdXQsIGFyZ3NidWZmZXIsIGxlbl9yZWFkKSA8IGxlbl9yZWFkKSB7Ci0JCS8qIHNpbGx5IHNjcmlwdCBzdG9wcGVkIHJlYWRpbmcsIHNvYWsgdXAgcmVtYWluaW5nIG1lc3NhZ2UgKi8KLQkJd2hpbGUgKGFwX2dldF9jbGllbnRfYmxvY2sociwgYXJnc2J1ZmZlciwgSFVHRV9TVFJJTkdfTEVOKSA+IDApIHsKLQkJICAgIC8qIGR1bXAgaXQgKi8KLQkJfQotCQlicmVhazsKLQkgICAgfQotCX0KLQotCWFwX2JmbHVzaChzY3JpcHRfb3V0KTsKLQotCWFwX2tpbGxfdGltZW91dChyKTsKLSAgICB9Ci0KLSAgICBhcF9iY2xvc2Uoc2NyaXB0X291dCk7Ci0KLSAgICAvKiBIYW5kbGUgc2NyaXB0IHJldHVybi4uLiAqLwotICAgIGlmIChzY3JpcHRfaW4gJiYgIW5waCkgewotCWNvbnN0IGNoYXIgKmxvY2F0aW9uOwotCWNoYXIgc2J1ZltNQVhfU1RSSU5HX0xFTl07Ci0JaW50IHJldDsKLQotCWlmICgocmV0ID0gYXBfc2Nhbl9zY3JpcHRfaGVhZGVyX2Vycl9idWZmKHIsIHNjcmlwdF9pbiwgc2J1ZikpKSB7Ci0JICAgIHJldHVybiBsb2dfc2NyaXB0KHIsIGNvbmYsIHJldCwgZGJ1Ziwgc2J1Ziwgc2NyaXB0X2luLCBzY3JpcHRfZXJyKTsKLQl9Ci0KLSNpZmRlZiBDSEFSU0VUX0VCQ0RJQwotICAgICAgICAvKiBOb3cgY2hlY2sgdGhlIENvbnRlbnQtVHlwZSB0byBkZWNpZGUgaWYgY29udmVyc2lvbiBpcyBuZWVkZWQgKi8KLSAgICAgICAgYXBfY2hlY2tjb252KHIpOwotI2VuZGlmIC8qQ0hBUlNFVF9FQkNESUMqLwotCi0JbG9jYXRpb24gPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19vdXQsICJMb2NhdGlvbiIpOwotCi0JaWYgKGxvY2F0aW9uICYmIGxvY2F0aW9uWzBdID09ICcvJyAmJiByLT5zdGF0dXMgPT0gMjAwKSB7Ci0KLQkgICAgLyogU29hayB1cCBhbGwgdGhlIHNjcmlwdCBvdXRwdXQgKi8KLQkgICAgYXBfaGFyZF90aW1lb3V0KCJyZWFkIGZyb20gc2NyaXB0Iiwgcik7Ci0JICAgIHdoaWxlIChhcF9iZ2V0cyhhcmdzYnVmZmVyLCBIVUdFX1NUUklOR19MRU4sIHNjcmlwdF9pbikgPiAwKSB7Ci0JCWNvbnRpbnVlOwotCSAgICB9Ci0JICAgIHdoaWxlIChhcF9iZ2V0cyhhcmdzYnVmZmVyLCBIVUdFX1NUUklOR19MRU4sIHNjcmlwdF9lcnIpID4gMCkgewotCQljb250aW51ZTsKLQkgICAgfQotCSAgICBhcF9raWxsX3RpbWVvdXQocik7Ci0KLQotCSAgICAvKiBUaGlzIHJlZGlyZWN0IG5lZWRzIHRvIGJlIGEgR0VUIG5vIG1hdHRlciB3aGF0IHRoZSBvcmlnaW5hbAotCSAgICAgKiBtZXRob2Qgd2FzLgotCSAgICAgKi8KLQkgICAgci0+bWV0aG9kID0gYXBfcHN0cmR1cChyLT5wb29sLCAiR0VUIik7Ci0JICAgIHItPm1ldGhvZF9udW1iZXIgPSBNX0dFVDsKLQotCSAgICAvKiBXZSBhbHJlYWR5IHJlYWQgdGhlIG1lc3NhZ2UgYm9keSAoaWYgYW55KSwgc28gZG9uJ3QgYWxsb3cKLQkgICAgICogdGhlIHJlZGlyZWN0ZWQgcmVxdWVzdCB0byB0aGluayBpdCBoYXMgb25lLiAgV2UgY2FuIGlnbm9yZSAKLQkgICAgICogVHJhbnNmZXItRW5jb2RpbmcsIHNpbmNlIHdlIHVzZWQgUkVRVUVTVF9DSFVOS0VEX0VSUk9SLgotCSAgICAgKi8KLQkgICAgYXBfdGFibGVfdW5zZXQoci0+aGVhZGVyc19pbiwgIkNvbnRlbnQtTGVuZ3RoIik7Ci0KLQkgICAgYXBfaW50ZXJuYWxfcmVkaXJlY3RfaGFuZGxlcihsb2NhdGlvbiwgcik7Ci0JICAgIHJldHVybiBPSzsKLQl9Ci0JZWxzZSBpZiAobG9jYXRpb24gJiYgci0+c3RhdHVzID09IDIwMCkgewotCSAgICAvKiBYWCBOb3RlIHRoYXQgaWYgYSBzY3JpcHQgd2FudHMgdG8gcHJvZHVjZSBpdHMgb3duIFJlZGlyZWN0Ci0JICAgICAqIGJvZHksIGl0IG5vdyBoYXMgdG8gZXhwbGljaXRseSAqc2F5KiAiU3RhdHVzOiAzMDIiCi0JICAgICAqLwotCSAgICByZXR1cm4gUkVESVJFQ1Q7Ci0JfQotCi0JYXBfc2VuZF9odHRwX2hlYWRlcihyKTsKLQlpZiAoIXItPmhlYWRlcl9vbmx5KSB7Ci0JICAgIGFwX3NlbmRfZmIoc2NyaXB0X2luLCByKTsKLQl9Ci0JYXBfYmNsb3NlKHNjcmlwdF9pbik7Ci0KLQlhcF9zb2Z0X3RpbWVvdXQoInNvYWtpbmcgc2NyaXB0IHN0ZGVyciIsIHIpOwotCXdoaWxlIChhcF9iZ2V0cyhhcmdzYnVmZmVyLCBIVUdFX1NUUklOR19MRU4sIHNjcmlwdF9lcnIpID4gMCkgewotCSAgICBjb250aW51ZTsKLQl9Ci0JYXBfa2lsbF90aW1lb3V0KHIpOwotCWFwX2JjbG9zZShzY3JpcHRfZXJyKTsKLSAgICB9Ci0KLSAgICBpZiAoc2NyaXB0X2luICYmIG5waCkgewotCWFwX3NlbmRfZmIoc2NyaXB0X2luLCByKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7CQkJLyogTk9UIHItPnN0YXR1cywgZXZlbiBpZiBpdCBoYXMgY2hhbmdlZC4gKi8KLX0KLQotc3RhdGljIGNvbnN0IGhhbmRsZXJfcmVjIGNnaV9oYW5kbGVyc1tdID0KLXsKLSAgICB7Q0dJX01BR0lDX1RZUEUsIGNnaV9oYW5kbGVyfSwKLSAgICB7ImNnaS1zY3JpcHQiLCBjZ2lfaGFuZGxlcn0sCi0gICAge05VTEx9Ci19OwotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgY2dpX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkRfTU9EVUxFX1NUVUZGLAotICAgIE5VTEwsCQkJLyogaW5pdGlhbGl6ZXIgKi8KLSAgICBOVUxMLAkJCS8qIGRpciBjb25maWcgY3JlYXRlciAqLwotICAgIE5VTEwsCQkJLyogZGlyIG1lcmdlciAtLS0gZGVmYXVsdCBpcyB0byBvdmVycmlkZSAqLwotICAgIGNyZWF0ZV9jZ2lfY29uZmlnLAkJLyogc2VydmVyIGNvbmZpZyAqLwotICAgIG1lcmdlX2NnaV9jb25maWcsCQkvKiBtZXJnZSBzZXJ2ZXIgY29uZmlnICovCi0gICAgY2dpX2NtZHMsCQkJLyogY29tbWFuZCB0YWJsZSAqLwotICAgIGNnaV9oYW5kbGVycywJCS8qIGhhbmRsZXJzICovCi0gICAgTlVMTCwJCQkvKiBmaWxlbmFtZSB0cmFuc2xhdGlvbiAqLwotICAgIE5VTEwsCQkJLyogY2hlY2tfdXNlcl9pZCAqLwotICAgIE5VTEwsCQkJLyogY2hlY2sgYXV0aCAqLwotICAgIE5VTEwsCQkJLyogY2hlY2sgYWNjZXNzICovCi0gICAgTlVMTCwJCQkvKiB0eXBlX2NoZWNrZXIgKi8KLSAgICBOVUxMLAkJCS8qIGZpeHVwcyAqLwotICAgIE5VTEwsCQkJLyogbG9nZ2VyICovCi0gICAgTlVMTCwJCQkvKiBoZWFkZXIgcGFyc2VyICovCi0gICAgTlVMTCwJCQkvKiBjaGlsZF9pbml0ICovCi0gICAgTlVMTCwJCQkvKiBjaGlsZF9leGl0ICovCi0gICAgTlVMTAkJCS8qIHBvc3QgcmVhZC1yZXF1ZXN0ICovCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9jZ2kuZHNwIGIvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9jZ2kuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTRkNGE5Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfY2dpLmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9Im1vZF9jZ2kiIC0gUGFja2FnZSBPd25lcj08ND4KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDAKLSMgKiogRE8gTk9UIEVESVQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDEwMgotCi1DRkc9bW9kX2NnaSAtIFdpbjMyIFJlbGVhc2UKLSFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAibW9kX2NnaS5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIm1vZF9jZ2kubWFrIiBDRkc9Im1vZF9jZ2kgLSBXaW4zMiBSZWxlYXNlIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgIm1vZF9jZ2kgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFICJtb2RfY2dpIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1NVEw9bWlkbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAibW9kX2NnaSAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0kgIi4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9GZCJSZWxlYXNlXG1vZF9jZ2kiIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvbWFjaGluZTpJMzg2IC9vdXQ6IlJlbGVhc2UvbW9kX2NnaS5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfY2dpCi0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvbWFjaGluZTpJMzg2IC9vdXQ6IlJlbGVhc2UvbW9kX2NnaS5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfY2dpCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJtb2RfY2dpIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HWCAvWmkgL09kIC9JICIuLi8uLi9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci11dGlsL2luY2x1ZGUiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRmQiRGVidWdcbW9kX2NnaSIgL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvaW5jcmVtZW50YWw6bm8gL21hcCAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJEZWJ1Zy9tb2RfY2dpLnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF9jZ2kKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvaW5jcmVtZW50YWw6bm8gL21hcCAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJEZWJ1Zy9tb2RfY2dpLnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF9jZ2kKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIm1vZF9jZ2kgLSBXaW4zMiBSZWxlYXNlIgotIyBOYW1lICJtb2RfY2dpIC0gV2luMzIgRGVidWciCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZF9jZ2kuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kX2NnaS5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2RfY2dpLnJjCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9jZ2kgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIENyZWF0aW5nIFZlcnNpb24gUmVzb3VyY2UKLUlucHV0UGF0aD0uLlwuLlxidWlsZFx3aW4zMlx3aW4zMnZlci5hd2sKLQotIi5cbW9kX2NnaS5yYyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQlhd2sgLWYgLi4vLi4vYnVpbGQvd2luMzIvd2luMzJ2ZXIuYXdrIG1vZF9jZ2kgICJjZ2lfbW9kdWxlIGZvciBBcGFjaGUiIC4uLy4uL2luY2x1ZGUvYXBfcmVsZWFzZS5oID4gLlxtb2RfY2dpLnJjCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibW9kX2NnaSAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIENyZWF0aW5nIFZlcnNpb24gUmVzb3VyY2UKLUlucHV0UGF0aD0uLlwuLlxidWlsZFx3aW4zMlx3aW4zMnZlci5hd2sKLQotIi5cbW9kX2NnaS5yYyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQlhd2sgLWYgLi4vLi4vYnVpbGQvd2luMzIvd2luMzJ2ZXIuYXdrIG1vZF9jZ2kgICJjZ2lfbW9kdWxlIGZvciBBcGFjaGUiIC4uLy4uL2luY2x1ZGUvYXBfcmVsZWFzZS5oID4gLlxtb2RfY2dpLnJjCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfY2dpLmV4cCBiL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfY2dpLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZlYTBjMi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2NnaS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1jZ2lfbW9kdWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2NnaS5oIGIvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9jZ2kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhZGZhYS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2NnaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBiYXNlZCB1cG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUKLSAqIG9yaWdpbmFsbHkgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsCi0gKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICovCi0KLSNpZm5kZWYgX01PRF9DR0lfSAotI2RlZmluZSBfTU9EX0NHSV9IIDEKLQotCi0vKioKLSAqIFJlZ2lzdGVyYWJsZSBvcHRpb25hbCBmdW5jdGlvbiB0byBvdmVycmlkZSBDR0kgYmVoYXZpb3I7Ci0gKiBSZXByb2Nlc3MgdGhlIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyB0byBleGVjdXRlIHRoZSBnaXZlbiBDR0kgc2NyaXB0LgotICogQHBhcmFtIGNtZCBQb2ludGVyIHRvIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUgKG1heSBiZSBvdmVycmlkZGVuKQotICogQHBhcmFtIGFyZ3YgUG9pbnRlciB0byB0aGUgYXJndW1lbnRzIHRvIHBhc3MgKG1heSBiZSBvdmVycmlkZGVuKQotICogQHBhcmFtIHIgVGhlIGN1cnJlbnQgcmVxdWVzdAotICogQHBhcmFtIHAgVGhlIHBvb2wgdG8gYWxsb2NhdGUgY29ycmVjdCBjbWQvYXJndiBlbGVtZW50cyB3aXRoaW4uCi0gKiBAZGVmZnVuYyBhcHJfc3RhdHVzX3QgYXBfY2dpX2J1aWxkX2NvbW1hbmQoY29uc3QgY2hhciAqKmNtZCwgY29uc3QgY2hhciAqKiphcmd2LCByZXF1ZXN0X3JlYyAqciwgYXByX3Bvb2xfdCAqcCkKLSAqIEB0aXAgVGhpcyBjYWxsYmFjayBtYXkgYmUgcmVnaXN0ZXJlZCBieSB0aGUgb3Mtc3BlY2lmaWMgbW9kdWxlIAotICogdG8gY29ycmVjdCB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIGZvciBhcHJfcHJvY19jcmVhdGUgaW52b2NhdGlvbgotICogb24gYSBnaXZlbiBvcy4gIG1vZF9jZ2kgd2lsbCBjYWxsIHRoZSBmdW5jdGlvbiBpZiByZWdpc3RlcmVkLgotICovCi1BUFJfREVDTEFSRV9PUFRJT05BTF9GTihhcHJfc3RhdHVzX3QsIGFwX2NnaV9idWlsZF9jb21tYW5kLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICoqY21kLCBjb25zdCBjaGFyICoqKmFyZ3YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9yZWMgKnIsIGFwcl9wb29sX3QgKnApKTsKLQotI2VuZGlmIC8qIF9NT0RfQ0dJX0ggKi8KZGlmZiAtLWdpdCBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfY2dpZC5jIGIvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9jZ2lkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlOTBkNzYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9jZ2lkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDA2ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyAKLSAqIGFyZSBtZXQ6IAotICogCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKiAKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIAotICogdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSAKLSAqIGRpc3RyaWJ1dGlvbi4gCi0gKiAKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyAKLSAqIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAKLSAqICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAgCi0gKiBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIiAKLSAqIAotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0byAKLSAqIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAotICogcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCAKLSAqICogYXBhY2hlQGFwYWNoZS5vcmcuIAotICogCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiAKLSAqIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAKLSAqIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4gCi0gKiAKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcgCi0gKiBhY2tub3dsZWRnbWVudDogCi0gKiAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwIAotICogZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIgCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWSAKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SIAotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCAKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCAKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyAKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIAotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCAKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAotICogCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueSAKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZCAKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciAKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4gCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIAotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uIAotICogCi0gKi8gCi0KLS8qIAotICogaHR0cF9zY3JpcHQ6IGtlZXBzIGFsbCBzY3JpcHQtcmVsYXRlZCByYW1ibGluZ3MgdG9nZXRoZXIuIAotICogCi0gKiBDb21wbGlhbnQgdG8gY2dpLzEuMSBzcGVjIAotICogCi0gKiBBZGFwdGVkIGJ5IHJzdCBmcm9tIG9yaWdpbmFsIE5DU0EgY29kZSBieSBSb2IgTWNDb29sIAotICogCi0gKiBBcGFjaGUgYWRkcyBzb21lIG5ldyBlbnYgdmFyczsgUkVESVJFQ1RfVVJMIGFuZCBSRURJUkVDVF9RVUVSWV9TVFJJTkcgZm9yIAotICogY3VzdG9tIGVycm9yIHJlc3BvbnNlcywgYW5kIERPQ1VNRU5UX1JPT1QgYmVjYXVzZSB3ZSBmb3VuZCBpdCB1c2VmdWwuIAotICogSXQgYWxzbyBhZGRzIFNFUlZFUl9BRE1JTiAtIHVzZWZ1bCBmb3Igc2NyaXB0cyB0byBrbm93IHdobyB0byBtYWlsIHdoZW4gCi0gKiB0aGV5IGZhaWwuIAotICovIAotCi0KLQotI2RlZmluZSBDT1JFX1BSSVZBVEUgCi0KLSNpbmNsdWRlICJhcHJfbGliLmgiCi0jaW5jbHVkZSAiYXByX2dlbmVyYWwuaCIKLSNpbmNsdWRlICJhcHJfZmlsZV9pby5oIgotI2luY2x1ZGUgImFwcl9wb3J0YWJsZS5oIgotI2luY2x1ZGUgImh0dHBkLmgiIAotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiIAotI2luY2x1ZGUgImh0dHBfcmVxdWVzdC5oIiAKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIgCi0jaW5jbHVkZSAiaHR0cF9wcm90b2NvbC5oIiAKLSNpbmNsdWRlICJodHRwX21haW4uaCIgCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIgCi0jaW5jbHVkZSAidXRpbF9zY3JpcHQuaCIgCi0jaW5jbHVkZSAiaHR0cF9jb25mX2dsb2JhbHMuaCIgCi0jaW5jbHVkZSAiYnVmZi5oIiAKLSNpbmNsdWRlICJhcF9tcG0uaCIKLSNpbmNsdWRlICJpb2xfc29ja2V0LmgiCi0KLSNpZm5kZWYgVU5JWF9QQVRIX01BWAotI2RlZmluZSBVTklYX1BBVEhfTUFYIDEwOAotI2VuZGlmCi0KLSNpZm5kZWYgc29ja2FkZHJfdW4KLXN0cnVjdCBzb2NrYWRkcl91biB7Ci0gICAgdW5zaWduZWQgc2hvcnQgc3VuX2ZhbWlseTsKLSAgICBjaGFyIHN1bl9wYXRoW1VOSVhfUEFUSF9NQVhdOwotfTsKLSNlbmRpZgotCi0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBjZ2lkX21vZHVsZTsgCi0KLXN0YXRpYyB2b2lkIGNnaWRfaW5pdChhcF9jb250ZXh0X3QgKnAsIGFwX2NvbnRleHRfdCAqcGxvZywgYXBfY29udGV4dF90ICpwdGVtcCwgc2VydmVyX3JlYyAqbWFpbl9zZXJ2ZXIpOyAKLXN0YXRpYyBpbnQgb25jZV90aHJvdWdoID0gMDsgCi0KLXN0YXRpYyBhcF9jb250ZXh0X3QgKnBjZ2k7IAotCi0vKiBLTFVER0UgLS0tIGZvciBiYWNrLWNvbWJhdGliaWxpdHksIHdlIGRvbid0IGhhdmUgdG8gY2hlY2sgRXhlY2NnaWQgCi0gKiBpbiBTY3JpcHRBbGlhc2VkIGRpcmVjdG9yaWVzLCB3aGljaCBtZWFucyB3ZSBuZWVkIHRvIGtub3cgaWYgdGhpcyAKLSAqIHJlcXVlc3QgY2FtZSB0aHJvdWdoIFNjcmlwdEFsaWFzIG9yIG5vdC4uLiBzbyB0aGUgQWxpYXMgbW9kdWxlIAotICogbGVhdmVzIGEgbm90ZSBmb3IgdXMuIAotICovIAotCi1zdGF0aWMgaW50IGlzX3NjcmlwdGFsaWFzZWQocmVxdWVzdF9yZWMgKnIpIAoteyAKLSAgICBjb25zdCBjaGFyICp0ID0gYXBfdGFibGVfZ2V0KHItPm5vdGVzLCAiYWxpYXMtZm9yY2VkLXR5cGUiKTsgCi0gICAgcmV0dXJuIHQgJiYgKCFzdHJjYXNlY21wKHQsICJjZ2ktc2NyaXB0IikpOyAKLX0gCi0KLS8qIENvbmZpZ3VyYXRpb24gc3R1ZmYgKi8gCi0KLSNkZWZpbmUgREVGQVVMVF9MT0dCWVRFUyAxMDM4NTc2MCAKLSNkZWZpbmUgREVGQVVMVF9CVUZCWVRFUyAxMDI0IAotI2RlZmluZSBERUZBVUxUX1NPQ0tFVCAibG9ncy9jZ2lzb2NrIgotCi10eXBlZGVmIHN0cnVjdCB7IAotICAgIGNvbnN0IGNoYXIgKnNvY2tuYW1lOwotICAgIGNoYXIgKmxvZ25hbWU7IAotICAgIGxvbmcgbG9nYnl0ZXM7IAotICAgIGludCBidWZieXRlczsgCi0gICAgQlVGRiAqYmluOyAKLSAgICBCVUZGICpib3V0OyAKLSAgICBCVUZGICpiZXJyb3I7IAotfSBjZ2lkX3NlcnZlcl9jb25mOyAKLQotLyogSWYgYSByZXF1ZXN0IGluY2x1ZGVzIHF1ZXJ5IGluZm8gaW4gdGhlIFVSTCAoc3R1ZmYgYWZ0ZXIgIj8iKSwgYW5kCi0gKiB0aGUgcXVlcnkgaW5mbyBkb2VzIG5vdCBjb250YWluICI9IiAoaW5kaWNhdGl2ZSBvZiBhIEZPUk0gc3VibWlzc2lvbiksCi0gKiB0aGVuIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gY3JlYXRlIHRoZSBhcmd1bWVudCBsaXN0IHRvIGJlIHBhc3NlZAotICogdG8gdGhlIENHSSBzY3JpcHQuICBXaGVuIHN1ZXhlYyBpcyBlbmFibGVkLCB0aGUgc3VleGVjIHBhdGgsIHVzZXIsIGFuZAotICogZ3JvdXAgYXJlIHRoZSBmaXJzdCB0aHJlZSBhcmd1bWVudHMgdG8gYmUgcGFzc2VkOyBpZiBub3QsIGFsbCB0aHJlZQotICogbXVzdCBiZSBOVUxMLiAgVGhlIHF1ZXJ5IGluZm8gaXMgc3BsaXQgaW50byBzZXBhcmF0ZSBhcmd1bWVudHMsIHdoZXJlCi0gKiAiKyIgaXMgdGhlIHNlcGFyYXRvciBiZXR3ZWVuIGtleXdvcmQgYXJndW1lbnRzLgotICoKLSAqIFhYWFg6IG5vdGUgdGhhdCB0aGUgV0lOMzIgY29kZSB1c2VzIG9uZSBvZiB0aGUgc3VleGVjIHN0cmluZ3MKLSAqIHRvIHBhc3MgYW4gaW50ZXJwcmV0ZXIgbmFtZS4gIFJlbWVtYmVyIHRoaXMgaWYgY2hhbmdpbmcgdGhlIHdheSB0aGV5Ci0gKiBhcmUgaGFuZGxlZCBpbiBjcmVhdGVfYXJndi4KLSAqCi0gKi8KLXN0YXRpYyBjaGFyICoqY3JlYXRlX2FyZ3YoYXBfY29udGV4dF90ICpwLCBjaGFyICpwYXRoLCBjaGFyICp1c2VyLCBjaGFyICpncm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYXYwLCBjb25zdCBjaGFyICphcmdzKQotewotICAgIGludCB4LCBudW13b3JkczsKLSAgICBjaGFyICoqYXY7Ci0gICAgY2hhciAqdzsKLSAgICBpbnQgaWR4ID0gMDsKLQotICAgIC8qIGNvdW50IHRoZSBudW1iZXIgb2Yga2V5d29yZHMgKi8KLQotICAgIGZvciAoeCA9IDAsIG51bXdvcmRzID0gMTsgYXJnc1t4XTsgeCsrKSB7Ci0gICAgICAgIGlmIChhcmdzW3hdID09ICcrJykgewotICAgICAgICAgICAgKytudW13b3JkczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChudW13b3JkcyA+IEFQQUNIRV9BUkdfTUFYIC0gNSkgewotICAgICAgICBudW13b3JkcyA9IEFQQUNIRV9BUkdfTUFYIC0gNTsgIC8qIFRydW5jYXRlIGFyZ3MgdG8gcHJldmVudCBvdmVycnVuICovCi0gICAgfQotICAgIGF2ID0gKGNoYXIgKiopIGFwX3BhbGxvYyhwLCAobnVtd29yZHMgKyA1KSAqIHNpemVvZihjaGFyICopKTsKLQotICAgIGlmIChwYXRoKSB7Ci0gICAgICAgIGF2W2lkeCsrXSA9IHBhdGg7Ci0gICAgfQotICAgIGlmICh1c2VyKSB7Ci0gICAgICAgIGF2W2lkeCsrXSA9IHVzZXI7Ci0gICAgfQotICAgIGlmIChncm91cCkgewotICAgICAgICBhdltpZHgrK10gPSBncm91cDsKLSAgICAgfQotCi0gICAgYXZbaWR4KytdID0gYXYwOwotCi0gICAgZm9yICh4ID0gMTsgeCA8PSBudW13b3JkczsgeCsrKSB7Ci0gICAgICAgIHcgPSBhcF9nZXR3b3JkX251bGxzKHAsICZhcmdzLCAnKycpOwotICAgICAgICBhcF91bmVzY2FwZV91cmwodyk7Ci0gICAgICAgIGF2W2lkeCsrXSA9IGFwX2VzY2FwZV9zaGVsbF9jbWQocCwgdyk7Ci0gICAgfQotICAgIGF2W2lkeF0gPSBOVUxMOwotICAgIHJldHVybiBhdjsKLX0KLQotc3RhdGljIGludCBjYWxsX2V4ZWMocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmFyZ3YwLCBjaGFyICoqZW52LCBpbnQgc2hlbGxjbWQpCi17Ci0gICAgaW50IHBpZCA9IDA7Ci0gICAgaW50IGVycmZpbGVubyA9IFNUREVSUl9GSUxFTk87Ci0KLSAgICAvKiB0aGUgZmQgb24gci0+c2VydmVyLT5lcnJvcl9sb2cgaXMgY2xvc2VkLCBidXQgd2UgbmVlZCBzb21ld2hlcmUgdG8gICAgICAgICAgICAqIHB1dCB0aGUgZXJyb3IgbWVzc2FnZXMgZnJvbSB0aGUgbG9nXyogZnVuY3Rpb25zLiBTbywgd2UgdXNlIHN0ZGVyciwKLSAgICAgKiBzaW5jZSB0aGF0IGlzIGJldHRlciB0aGFuIGFsbG93aW5nIGVycm9ycyB0byBnbyB1bm5vdGljZWQuIAotICAgICAqLwotICAgIGFwX3B1dF9vc19maWxlKCZyLT5zZXJ2ZXItPmVycm9yX2xvZywgJmVycmZpbGVubywgci0+cG9vbCk7Ci0gICAgLyogVE9ETzogcmVpbXBsZW1lbnQgc3VleGVjICovCi0jaWYgMAotICAgIGlmIChhcF9zdWV4ZWNfZW5hYmxlZAotICAgICAgICAmJiAoKHItPnNlcnZlci0+c2VydmVyX3VpZCAhPSBhcF91c2VyX2lkKQotICAgICAgICAgICAgfHwgKHItPnNlcnZlci0+c2VydmVyX2dpZCAhPSBhcF9ncm91cF9pZCkKLSAgICAgICAgICAgIHx8ICghc3RybmNtcCgiL34iLCByLT51cmksIDIpKSkpIHsKLQotICAgICAgICBjaGFyICpleGVjdXNlciwgKmdycG5hbWU7Ci0gICAgICAgIHN0cnVjdCBwYXNzd2QgKnB3OwotICAgICAgICBzdHJ1Y3QgZ3JvdXAgKmdyOwotCi0gICAgICAgIGlmICghc3RybmNtcCgiL34iLCByLT51cmksIDIpKSB7Ci0gICAgICAgICAgICBnaWRfdCB1c2VyX2dpZDsKLSAgICAgICAgICAgIGNoYXIgKnVzZXJuYW1lID0gYXBfcHN0cmR1cChyLT5wb29sLCByLT51cmkgKyAyKTsKLSAgICAgICAgICAgIGNoYXIgKnBvcyA9IHN0cmNocih1c2VybmFtZSwgJy8nKTsKLQotICAgICAgICAgICAgaWYgKHBvcykgewotICAgICAgICAgICAgICAgICpwb3MgPSAnXDAnOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKHB3ID0gZ2V0cHduYW0odXNlcm5hbWUpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRwd25hbTogaW52YWxpZCB1c2VybmFtZSAlcyIsIHVzZXJuYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKHBpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBleGVjdXNlciA9IGFwX3BzdHJjYXQoci0+cG9vbCwgIn4iLCBwdy0+cHdfbmFtZSwgTlVMTCk7Ci0gICAgICAgICAgICB1c2VyX2dpZCA9IHB3LT5wd19naWQ7Ci0KLSAgICAgICAgICAgIGlmICgoZ3IgPSBnZXRncmdpZCh1c2VyX2dpZCkpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoKGdycG5hbWUgPSBhcF9wYWxsb2Moci0+cG9vbCwgMTYpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAocGlkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwX3NucHJpbnRmKGdycG5hbWUsIDE2LCAiJWxkIiwgKGxvbmcpIHVzZXJfZ2lkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBncnBuYW1lID0gZ3ItPmdyX25hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoKHB3ID0gZ2V0cHd1aWQoci0+c2VydmVyLT5zZXJ2ZXJfdWlkKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0cHd1aWQ6IGludmFsaWQgdXNlcmlkICVsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSByLT5zZXJ2ZXItPnNlcnZlcl91aWQpOwotICAgICAgICAgICAgICAgIHJldHVybiAocGlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV4ZWN1c2VyID0gYXBfcHN0cmR1cChyLT5wb29sLCBwdy0+cHdfbmFtZSk7Ci0KLSAgICAgICAgICAgIGlmICgoZ3IgPSBnZXRncmdpZChyLT5zZXJ2ZXItPnNlcnZlcl9naWQpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRncmdpZDogaW52YWxpZCBncm91cGlkICVsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSByLT5zZXJ2ZXItPnNlcnZlcl9naWQpOwotICAgICAgICAgICAgICAgIHJldHVybiAocGlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdycG5hbWUgPSBnci0+Z3JfbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzaGVsbGNtZCkgewotICAgICAgICAgICAgZXhlY2xlKFNVRVhFQ19CSU4sIFNVRVhFQ19CSU4sIGV4ZWN1c2VyLCBncnBuYW1lLCBhcmd2MCwKLSAgICAgICAgICAgICAgICAgICBOVUxMLCBlbnYpOwotICAgICAgICB9Ci0KLSAgICAgICAgZWxzZSBpZiAoKCFyLT5hcmdzKSB8fCAoIXItPmFyZ3NbMF0pIHx8IHN0cmNocihyLT5hcmdzLCAnPScpKSB7Ci0gICAgICAgICAgICBleGVjbGUoU1VFWEVDX0JJTiwgU1VFWEVDX0JJTiwgZXhlY3VzZXIsIGdycG5hbWUsIGFyZ3YwLAotICAgICAgICAgICAgICAgICAgIE5VTEwsIGVudik7Ci0gICAgICAgIH0KLQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGV4ZWN2ZShTVUVYRUNfQklOLAotICAgICAgICAgICAgICAgICAgIGNyZWF0ZV9hcmd2KHItPnBvb2wsIFNVRVhFQ19CSU4sIGV4ZWN1c2VyLCBncnBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3YwLCByLT5hcmdzKSwKLSAgICAgICAgICAgICAgICAgICBlbnYpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotI2VuZGlmCi0gICAgICAgIGlmIChzaGVsbGNtZCkgewotICAgICAgICAgICAgZXhlY2xlKFNIRUxMX1BBVEgsIFNIRUxMX1BBVEgsICItYyIsIGFyZ3YwLCBOVUxMLCBlbnYpOwotICAgICAgICB9Ci0KLSAgICAgICAgZWxzZSBpZiAoKCFyLT5hcmdzKSB8fCAoIXItPmFyZ3NbMF0pIHx8IHN0cmNocihyLT5hcmdzLCAnPScpKSB7Ci0gICAgICAgICAgICBleGVjbGUoci0+ZmlsZW5hbWUsIGFyZ3YwLCBOVUxMLCBlbnYpOwotICAgICAgICB9Ci0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBleGVjdmUoci0+ZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgY3JlYXRlX2FyZ3Yoci0+cG9vbCwgTlVMTCwgTlVMTCwgTlVMTCwgYXJndjAsIHItPmFyZ3MpLAotICAgICAgICAgICAgICAgICAgIGVudik7Ci0gICAgICAgIH0KLSNpZiAwCi0gICAgfQotI2VuZGlmCi0gICAgcmV0dXJuIChwaWQpOwotfQotCi1zdGF0aWMgdm9pZCBjZ2lkX21haW50KGludCByZWFzb24sIHZvaWQgKmRhdGEsIGFwX3dhaXRfdCBzdGF0dXMpCi17Ci0jaWZkZWYgSEFTX09USEVSX0NISUxECi0gICAgaW50ICpzZCA9IGRhdGE7Ci0gICAgc3dpdGNoIChyZWFzb24pIHsKLSAgICAgICAgY2FzZSBPQ19SRUFTT05fREVBVEg6Ci0gICAgICAgIGNhc2UgT0NfUkVBU09OX0xPU1Q6Ci0gICAgICAgICAgICAvKiBzdG9wIGdhcCB0byBtYWtlIHN1cmUgZXZlcnl0aGluZyBlbHNlIHdvcmtzLiAgSW4gdGhlIGVuZCwKLSAgICAgICAgICAgICAqIHdlJ2xsIGp1c3QgcmVzdGFydCB0aGUgY2dpZCBzZXJ2ZXIuICovICAgCi0gICAgICAgICAgICBraWxsKGdldHBwaWQoKSwgU0lHV0lOQ0gpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0NfUkVBU09OX1JFU1RBUlQ6Ci0gICAgICAgIGNhc2UgT0NfUkVBU09OX1VOUkVHSVNURVI6Ci0gICAgICAgICAgICBraWxsKCpzZCwgU0lHSFVQKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBnZXRfcmVxKGludCBmZCwgcmVxdWVzdF9yZWMgKnIsIGNoYXIgKipmaWxlbmFtZSwgY2hhciAqKmFyZ3YwLCBjaGFyICoqKmVudikgCi17IAotICAgIGludCBpLCBsZW4sIGo7IAotICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7IAotICAgIGNoYXIgKiplbnZpcm9uOyAKLSAgICBjaGFyIHRlbXBbTUFYX1NUUklOR19MRU5dOyAKLSAgICBjb3JlX2Rpcl9jb25maWcgKnRlbXBfY29yZTsgCi0gICAgdm9pZCAqKmRjb25mOyAKLQotICAgIHItPnNlcnZlciA9IGFwX3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKHNlcnZlcl9yZWMpKTsgCi0KLSAgICByZWFkKGZkLCAmaiwgc2l6ZW9mKGludCkpOyAKLSAgICByZWFkKGZkLCAmbGVuLCBzaXplb2YoaW50KSk7IAotICAgIGRhdGEgPSBhcF9wY2FsbG9jKHItPnBvb2wsIGxlbik7IAotICAgIGkgPSByZWFkKGZkLCBkYXRhLCBsZW4pOyAKLQotICAgIHItPmZpbGVuYW1lID0gYXBfZ2V0d29yZChyLT5wb29sLCAoY29uc3QgY2hhciAqKikmZGF0YSwgJ1xuJyk7IAotICAgICphcmd2MCA9IGFwX2dldHdvcmQoci0+cG9vbCwgKGNvbnN0IGNoYXIgKiopJmRhdGEsICdcbicpOyAKLQotICAgIHItPnVyaSA9IGFwX2dldHdvcmQoci0+cG9vbCwgKGNvbnN0IGNoYXIgKiopJmRhdGEsICdcbicpOyAKLSAgICAKLSAgICBlbnZpcm9uID0gYXBfcGNhbGxvYyhyLT5wb29sLCAoaiArIDIpICpzaXplb2YoY2hhciAqKSk7IAotICAgIGkgPSAwOyAKLSAgICBmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7IAotICAgICAgICBlbnZpcm9uW2ldID0gYXBfZ2V0d29yZChyLT5wb29sLCAoY29uc3QgY2hhciAqKikmZGF0YSwgJ1xuJyk7IAotICAgIH0gCi0gICAgKmVudiA9IGVudmlyb247IAotICAgIHItPmFyZ3MgPSBhcF9nZXR3b3JkKHItPnBvb2wsIChjb25zdCBjaGFyICoqKSZkYXRhLCAnXG4nKTsgCi0gIAotICAgIHJlYWQoZmQsICZyLT5zZXJ2ZXItPnNlcnZlcl91aWQsIHNpemVvZih1aWRfdCkpOyAKLSAgICByZWFkKGZkLCAmci0+c2VydmVyLT5zZXJ2ZXJfZ2lkLCBzaXplb2YoZ2lkX3QpKTsgCi0KLSAgICByZWFkKGZkLCAmaSwgc2l6ZW9mKGludCkpOyAKLSAgICAgCi0gICAgLyogYWRkIDEsIHNvIHRoYXQgaWYgaSA9PSAwLCB3ZSBzdGlsbCBtYWxsb2Mgc29tZXRoaW5nLiAqLyAKLSAgICBkY29uZiA9ICh2b2lkICoqKW1hbGxvYyhzaXplb2Yodm9pZCAqKSAqIGkgKyAxKTsgCi0KLSAgICB0ZW1wX2NvcmUgPSAoY29yZV9kaXJfY29uZmlnICopbWFsbG9jKHNpemVvZihjb3JlX21vZHVsZSkpOyAKLSNpZiAwCi0jaWZkZWYgUkxJTUlUX0NQVSAKLSAgICByZWFkKGZkLCAmaiwgc2l6ZW9mKGludCkpOyAKLSAgICBpZiAoaikgeyAKLSAgICAgICAgdGVtcF9jb3JlLT5saW1pdF9jcHUgPSAoc3RydWN0IHJsaW1pdCAqKW1hbGxvYyAoc2l6ZW9mKHN0cnVjdCBybGltaXQpKTsgCi0gICAgICAgIHJlYWQoZmQsIHRlbXBfY29yZS0+bGltaXRfY3B1LCBzaXplb2Yoc3RydWN0IHJsaW1pdCkpOyAKLSAgICB9IAotICAgIGVsc2UgeyAKLSAgICAgICAgdGVtcF9jb3JlLT5saW1pdF9jcHUgPSBOVUxMOyAKLSAgICB9IAotI2VuZGlmIAotCi0jaWYgZGVmaW5lZCAoUkxJTUlUX0RBVEEpIHx8IGRlZmluZWQoUkxJTUlUX1ZNRU0pIHx8IGRlZmluZWQoUkxJTUlUX0FTKSAKLSAgICByZWFkKGZkLCAmaiwgc2l6ZW9mKGludCkpOyAKLSAgICBpZiAoaikgeyAKLSAgICAgICAgdGVtcF9jb3JlLT5saW1pdF9tZW0gPSAoc3RydWN0IHJsaW1pdCAqKW1hbGxvYyAoc2l6ZW9mKHN0cnVjdCBybGltaXQpKTsgCi0gICAgICAgIHJlYWQoZmQsIHRlbXBfY29yZS0+bGltaXRfbWVtLCBzaXplb2Yoc3RydWN0IHJsaW1pdCkpOyAKLSAgICB9IAotICAgIGVsc2UgeyAKLSAgICAgICAgdGVtcF9jb3JlLT5saW1pdF9tZW0gPSBOVUxMOyAKLSAgICB9IAotI2VuZGlmIAotCi0jaWZkZWYgUkxJTUlUX05QUk9DIAotICAgIHJlYWQoZmQsICZqLCBzaXplb2YoaW50KSk7IAotICAgIGlmIChqKSB7IAotICAgICAgICB0ZW1wX2NvcmUtPmxpbWl0X25wcm9jID0gKHN0cnVjdCBybGltaXQgKiltYWxsb2MgKHNpemVvZihzdHJ1Y3QgcmxpbWl0KSk7IAotICAgICAgICByZWFkKGZkLCB0ZW1wX2NvcmUtPmxpbWl0X25wcm9jLCBzaXplb2Yoc3RydWN0IHJsaW1pdCkpOyAKLSAgICB9IAotICAgIGVsc2UgeyAKLSAgICAgICAgdGVtcF9jb3JlLT5saW1pdF9ucHJvYyA9IE5VTEw7IAotICAgIH0gCi0jZW5kaWYgCi0jZW5kaWYKLSAgICBkY29uZltpXSA9ICh2b2lkICopdGVtcF9jb3JlOyAKLSAgICByLT5wZXJfZGlyX2NvbmZpZyA9IGRjb25mOyAKLX0gCi0KLQotCi1zdGF0aWMgdm9pZCBzZW5kX3JlcShpbnQgZmQsIHJlcXVlc3RfcmVjICpyLCBjaGFyICphcmd2MCwgY2hhciAqKmVudikgCi17IAotICAgIGludCBsZW47IAotICAgIGludCBydjsKLSAgICBpbnQgaSA9IDA7IAotICAgIGNoYXIgKmRhdGE7IAotICAgIGNvcmVfZGlyX2NvbmZpZyAqY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29yZV9tb2R1bGUpOyAKLQotICAgIGRhdGEgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHItPmZpbGVuYW1lLCAiXG4iLCBhcmd2MCwgIlxuIiwgci0+dXJpLCAiXG4iLCAKLSAgICAgICAgICAgICAgICAgICAgIE5VTEwpOyAKLQotICAgIGZvciAoaSA9MDsgZW52W2ldOyBpKyspIHsgCi0gICAgICAgIGNvbnRpbnVlOyAKLSAgICB9IAotCi0gICAgaWYgKHdyaXRlKGZkLCAmaSwgc2l6ZW9mKGludCkpIDwgMCkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIHIsIAotICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIGNnaSBkYWVtb24gcHJvY2VzcyIpOyAKLSAgICAgICAgfSAgICAgCi0KLSAgICBmb3IgKGkgPSAwOyBlbnZbaV07IGkrKykgeyAKLSAgICAgICAgZGF0YSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgZGF0YSwgZW52W2ldLCAiXG4iLCBOVUxMKTsgCi0gICAgfSAKLSAgICBkYXRhID0gYXBfcHN0cmNhdChyLT5wb29sLCBkYXRhLCByLT5hcmdzLCBOVUxMKTsgCi0gICAgbGVuID0gc3RybGVuKGRhdGEpOyAKLSAgICBpZiAod3JpdGUoZmQsICZsZW4sIHNpemVvZihpbnQpKSA8IDApIHsgCi0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywgciwgCi0gICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gY2dpIGRhZW1vbiBwcm9jZXNzIik7IAotICAgICAgICB9ICAgICAKLSAgICBpZiAod3JpdGUoZmQsIGRhdGEsIGxlbikgPCAwKSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywgciwgCi0gICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gY2dpIGRhZW1vbiBwcm9jZXNzIik7IAotICAgICAgICB9ICAgICAKLSAgICBpZiAod3JpdGUoZmQsICZyLT5zZXJ2ZXItPnNlcnZlcl91aWQsIHNpemVvZih1aWRfdCkpIDwgMCkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIHIsIAotICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIGNnaSBkYWVtb24gcHJvY2VzcyIpOyAKLSAgICAgICAgfSAgICAgCi0gICAgaWYgKHdyaXRlKGZkLCAmci0+c2VydmVyLT5zZXJ2ZXJfZ2lkLCBzaXplb2YoZ2lkX3QpKSA8IDApIHsgCi0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywgciwgCi0gICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gY2dpIGRhZW1vbiBwcm9jZXNzIik7IAotICAgICAgICB9ICAgICAKLSAgICBpZiAod3JpdGUoZmQsICZjb3JlX21vZHVsZS5tb2R1bGVfaW5kZXgsIHNpemVvZihpbnQpKSA8IDApIHsgCi0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywgciwgCi0gICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gY2dpIGRhZW1vbiBwcm9jZXNzIik7IAotICAgICAgICB9ICAgICAKLSNpZiAwCi0jaWZkZWYgUkxJTUlUX0NQVSAKLSAgICBpZiAoY29uZi0+bGltaXRfY3B1KSB7IAotICAgICAgICBsZW4gPSAxOyAKLSAgICAgICAgd3JpdGUoZmQsICZsZW4sIHNpemVvZihpbnQpKTsgCi0gICAgICAgIHdyaXRlKGZkLCBjb25mLT5saW1pdF9jcHUsIHNpemVvZihzdHJ1Y3QgcmxpbWl0KSk7IAotICAgIH0gCi0gICAgZWxzZSB7IAotICAgICAgICBsZW4gPSAwOyAKLSAgICAgICAgd3JpdGUoZmQsICZsZW4sIHNpemVvZihpbnQpKTsgCi0gICAgfSAKLSNlbmRpZiAKLQotI2lmIGRlZmluZWQoUkxJTUlUX0RBVEEpIHx8IGRlZmluZWQoUkxJTUlUX1ZNRU0pIHx8IGRlZmluZWQoUkxJTUlUX0FTKSAKLSAgICBpZiAoY29uZi0+bGltaXRfbWVtKSB7IAotICAgICAgICBsZW4gPSAxOyAKLSAgICAgICAgd3JpdGUoZmQsICZsZW4sIHNpemVvZihpbnQpKTsgCi0gICAgICAgIHdyaXRlKGZkLCBjb25mLT5saW1pdF9tZW0sIHNpemVvZihzdHJ1Y3QgcmxpbWl0KSk7IAotICAgIH0gCi0gICAgZWxzZSB7IAotICAgICAgICBsZW4gPSAwOyAKLSAgICAgICAgd3JpdGUoZmQsICZsZW4sIHNpemVvZihpbnQpKTsgCi0gICAgfSAKLSNlbmRpZiAKLSAgCi0jaWZkZWYgUkxJTUlUX05QUk9DIAotICAgIGlmIChjb25mLT5saW1pdF9ucHJvYykgeyAKLSAgICAgICAgbGVuID0gMTsgCi0gICAgICAgIHdyaXRlKGZkLCAmbGVuLCBzaXplb2YoaW50KSk7IAotICAgICAgICB3cml0ZShmZCwgY29uZi0+bGltaXRfbnByb2MsIHNpemVvZihzdHJ1Y3QgcmxpbWl0KSk7IAotICAgIH0gCi0gICAgZWxzZSB7IAotICAgICAgICBsZW4gPSAwOyAKLSAgICAgICAgd3JpdGUoZmQsICZsZW4sIHNpemVvZihpbnQpKTsgCi0gICAgfSAKLSNlbmRpZgotI2VuZGlmIAotfSAKLQotc3RhdGljIGludCBjZ2lkX3NlcnZlcl9jaGlsZChpbnQgc2QpIAoteyAKLSAgICBjaGFyICphcmd2MDsgCi0gICAgY2hhciAqZmlsZW5hbWU7IAotICAgIGNoYXIgKiplbnY7IAotICAgIGFwX2NvbnRleHRfdCAqcDsgCi0gICAgcmVxdWVzdF9yZWMgKnI7IAotCi0gICAgYXBfY3JlYXRlX2NvbnRleHQoJnAsIHBjZ2kpOyAKLSAgICByID0gYXBfcGNhbGxvYyhwLCBzaXplb2YocmVxdWVzdF9yZWMpKTsgCi0gICAgci0+cG9vbCA9IHA7IAotICAgIGR1cDIoc2QsIFNURElOX0ZJTEVOTyk7IAotICAgIGR1cDIoc2QsIFNURE9VVF9GSUxFTk8pOyAKLSAgICBnZXRfcmVxKHNkLCByLCAmZmlsZW5hbWUsICZhcmd2MCwgJmVudik7IAotICAgIGNhbGxfZXhlYyhyLCBhcmd2MCwgZW52LCAwKTsgCi0gICAgZXhpdCgtMSk7ICAgLyogV2Ugc2hvdWxkIE5FVkVSIGdldCBoZXJlICovCi19IAotCi1zdGF0aWMgaW50IGNnaWRfc2VydmVyKHZvaWQgKmRhdGEpIAoteyAKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gdW5peF9hZGRyOwotICAgIGludCBwaWQ7IAotICAgIGludCBzZCwgc2QyLCBsZW47Ci0gICAgaW50IGVycmZpbGU7Ci0gICAgc2VydmVyX3JlYyAqbWFpbl9zZXJ2ZXIgPSBkYXRhOwotICAgIGNnaWRfc2VydmVyX2NvbmYgKnNjb25mID0gKGNnaWRfc2VydmVyX2NvbmYgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyggCi0gICAgICAgICAgICAgICAgICAgICAgIG1haW5fc2VydmVyLT5tb2R1bGVfY29uZmlnLCAmY2dpZF9tb2R1bGUpOyAKLQotICAgIHNpZ25hbChTSUdDSExELCBTSUdfSUdOKTsgCi0gICAgdW5saW5rKHNjb25mLT5zb2NrbmFtZSk7IAotCi0gICAgaWYgKChzZCA9IHNvY2tldChBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCkpIDwgMCkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywgbWFpbl9zZXJ2ZXIsIAotICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGNyZWF0ZSB1bml4IGRvbWFpbiBzb2NrZXQiKTsgCi0gICAgfSAKLQotICAgIG1lbXNldCgmdW5peF9hZGRyLCAwLCBzaXplb2YodW5peF9hZGRyKSk7Ci0gICAgdW5peF9hZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOwotICAgIHN0cmNweSh1bml4X2FkZHIuc3VuX3BhdGgsIHNjb25mLT5zb2NrbmFtZSk7Ci0KLSAgICBpZiAoYmluZChzZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZ1bml4X2FkZHIsIHNpemVvZih1bml4X2FkZHIpKSA8IDApIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIG1haW5fc2VydmVyLCAKLSAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBiaW5kIHVuaXggZG9tYWluIHNvY2tldCIpOyAKLSAgICB9IAotICAgIC8qIE1vc3QgaW1wbGVtZW50YXRpb25zIHNpbGVudGx5IGVuZm9yY2UgYSB2YWx1ZSBvZiA1IGFueXdheS4gIAotICAgICAqIFRoaXMgd2F5LCBpdCdsbCB3b3JrIHRoZSBzYW1lIGV2ZXJ5d2hlcmUuICovCi0gICAgaWYgKGxpc3RlbihzZCwgNSkgPCAwKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGVycm5vLCBtYWluX3NlcnZlciwgCi0gICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgbGlzdGVuIG9uIHVuaXggZG9tYWluIHNvY2tldCIpOyAKLSAgICB9IAotCi0gICAgd2hpbGUgKDEpIHsgCi0gICAgICAgIHNkMiA9IGFjY2VwdChzZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZ1bml4X2FkZHIsICZsZW4pOwotICAgICAgICBpZiAoc2QyIDwgMCkgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIChzZXJ2ZXJfcmVjICopZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgYWNjZXB0aW5nIG9uIGNnaWQgc29ja2V0LiIpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAKLSAgICAgICAgaWYgKChwaWQgPSBmb3JrKCkpID4gMCkgewotICAgICAgICAgICAgY2xvc2Uoc2QyKTsKLSAgICAgICAgfSAKLSAgICAgICAgZWxzZSBpZiAocGlkID09IDApIHsgCi0gICAgICAgICAgICAvKiBzZXR1cCB0aGUgU1RERVJSIGhlcmUsIGJlY2F1c2UgSSBoYXZlIGFsbCB0aGUgaW5mbwotICAgICAgICAgICAgICogZm9yIGl0LiAgSSdsbCBkbyB0aGUgU1RESU4gYW5kIFNURE9VVCBsYXRlciwgYnV0IEkgY2FuJ3QKLSAgICAgICAgICAgICAqIGRvIFNUREVSUiBhcyBlYXNpbHkuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChzY29uZi0+bG9nbmFtZSkgewotICAgICAgICAgICAgICAgIGR1cDIob3BlbihzY29uZi0+bG9nbmFtZSwgT19XUk9OTFkpLCBTVERFUlJfRklMRU5PKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGFwX2dldF9vc19maWxlKCZlcnJmaWxlLCBtYWluX3NlcnZlci0+ZXJyb3JfbG9nKTsKLSAgICAgICAgICAgICAgICBkdXAyKGVycmZpbGUsIFNUREVSUl9GSUxFTk8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2dpZF9zZXJ2ZXJfY2hpbGQoc2QyKTsgCi0gICAgICAgIH0gCi0gICAgICAgIGVsc2UgeyAKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGVycm5vLCAoc2VydmVyX3JlYyAqKWRhdGEsIAotICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBmb3JrIGNnaSBzY3JpcHQiKTsgCi0gICAgICAgIH0gCi0gICAgfSAKLSAgICByZXR1cm4gLTE7IAotfSAKLQotc3RhdGljIHZvaWQgY2dpZF9pbml0KGFwX2NvbnRleHRfdCAqcCwgYXBfY29udGV4dF90ICpwbG9nLCBhcF9jb250ZXh0X3QgKnB0ZW1wLCBzZXJ2ZXJfcmVjICptYWluX3NlcnZlcikgCi17IAotICAgIGludCBwaWQ7IAotICAgIGludCB0ZW1wZmQ7Ci0KLSAgICBjZ2lkX3NlcnZlcl9jb25mICpzY29uZiA9IChjZ2lkX3NlcnZlcl9jb25mICopYXBfZ2V0X21vZHVsZV9jb25maWcoIAotICAgICAgICAgICAgICAgICAgICAgICBtYWluX3NlcnZlci0+bW9kdWxlX2NvbmZpZywgJmNnaWRfbW9kdWxlKTsgCi0KLSAgICBpZiAob25jZV90aHJvdWdoID4gMCkgeyAKLSAgICAgICAgYXBfY3JlYXRlX2NvbnRleHQoJnBjZ2ksIHApOyAKLSAgICAgICAgdGVtcGZkID0gY3JlYXQoc2NvbmYtPnNvY2tuYW1lLCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lXR1JQIHwgU19JUk9USCB8IFNfSVdPVEgpOwotICAgICAgICBjbG9zZSh0ZW1wZmQpOyAgICAgICAgCi0KLSAgICAgICAgaWYgKChwaWQgPSBmb3JrKCkpIDwgMCkgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIG1haW5fc2VydmVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3Qgc3Bhd24gY2dpZCBkYWVtb24gcHJvY2VzcyIpOyAKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwaWQgPT0gMCkgewotICAgICAgICAgICAgY2dpZF9zZXJ2ZXIobWFpbl9zZXJ2ZXIpOwotICAgICAgICAgICAgZXhpdCgtMSk7Ci0gICAgICAgIH0gCi0jaWZkZWYgSEFTX09USEVSX0NISUxECi0gICAgICAgIGFwX3JlZ2lzdGVyX290aGVyX2NoaWxkKHBpZCwgY2dpZF9tYWludCwgJnBpZCwgLTEpOwotI2VuZGlmCi0gICAgfSAKLSAgICBlbHNlIG9uY2VfdGhyb3VnaCsrOyAKLX0gCi0KLXN0YXRpYyB2b2lkICpjcmVhdGVfY2dpZF9jb25maWcoYXBfY29udGV4dF90ICpwLCBzZXJ2ZXJfcmVjICpzKSAKLXsgCi0gICAgY2dpZF9zZXJ2ZXJfY29uZiAqYyA9IAotICAgIChjZ2lkX3NlcnZlcl9jb25mICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKGNnaWRfc2VydmVyX2NvbmYpKTsgCi0KLSAgICBjLT5sb2duYW1lID0gTlVMTDsgCi0gICAgYy0+bG9nYnl0ZXMgPSBERUZBVUxUX0xPR0JZVEVTOyAKLSAgICBjLT5idWZieXRlcyA9IERFRkFVTFRfQlVGQllURVM7IAotICAgIGMtPnNvY2tuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocCwgREVGQVVMVF9TT0NLRVQpOyAKLSAgICBjLT5iaW4gPSBjLT5ib3V0ID0gYy0+YmVycm9yID0gTlVMTDsgCi0gICAgcmV0dXJuIGM7IAotfSAKLQotc3RhdGljIHZvaWQgKm1lcmdlX2NnaWRfY29uZmlnKGFwX2NvbnRleHRfdCAqcCwgdm9pZCAqYmFzZXYsIHZvaWQgKm92ZXJyaWRlc3YpIAoteyAKLSAgICBjZ2lkX3NlcnZlcl9jb25mICpiYXNlID0gKGNnaWRfc2VydmVyX2NvbmYgKikgYmFzZXYsICpvdmVycmlkZXMgPSAoY2dpZF9zZXJ2ZXJfY29uZiAqKSBvdmVycmlkZXN2OyAKLQotICAgIHJldHVybiBvdmVycmlkZXMtPmxvZ25hbWUgPyBvdmVycmlkZXMgOiBiYXNlOyAKLX0gCi0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfc2NyaXB0bG9nKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsgCi0gICAgc2VydmVyX3JlYyAqcyA9IGNtZC0+c2VydmVyOyAKLSAgICBjZ2lkX3NlcnZlcl9jb25mICpjb25mID0gCi0gICAgKGNnaWRfc2VydmVyX2NvbmYgKikgYXBfZ2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywgJmNnaWRfbW9kdWxlKTsgCi0KLSAgICBjb25mLT5sb2duYW1lID0gYXJnOyAKLSAgICByZXR1cm4gTlVMTDsgCi19IAotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3NjcmlwdGxvZ19sZW5ndGgoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAoteyAKLSAgICBzZXJ2ZXJfcmVjICpzID0gY21kLT5zZXJ2ZXI7IAotICAgIGNnaWRfc2VydmVyX2NvbmYgKmNvbmYgPSAKLSAgICAoY2dpZF9zZXJ2ZXJfY29uZiAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAmY2dpZF9tb2R1bGUpOyAKLQotICAgIGNvbmYtPmxvZ2J5dGVzID0gYXRvbChhcmcpOyAKLSAgICByZXR1cm4gTlVMTDsgCi19IAotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3NjcmlwdGxvZ19idWZmZXIoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAoteyAKLSAgICBzZXJ2ZXJfcmVjICpzID0gY21kLT5zZXJ2ZXI7IAotICAgIGNnaWRfc2VydmVyX2NvbmYgKmNvbmYgPSAKLSAgICAoY2dpZF9zZXJ2ZXJfY29uZiAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAmY2dpZF9tb2R1bGUpOyAKLQotICAgIGNvbmYtPmJ1ZmJ5dGVzID0gYXRvaShhcmcpOyAKLSAgICByZXR1cm4gTlVMTDsgCi19IAotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3NjcmlwdF9zb2NrZXQoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAoteyAKLSAgICBzZXJ2ZXJfcmVjICpzID0gY21kLT5zZXJ2ZXI7IAotICAgIGNnaWRfc2VydmVyX2NvbmYgKmNvbmYgPSAKLSAgICAoY2dpZF9zZXJ2ZXJfY29uZiAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAmY2dpZF9tb2R1bGUpOyAKLQotICAgIGNvbmYtPnNvY2tuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUoY21kLT5wb29sLCBhcmcpOyAKLSAgICByZXR1cm4gTlVMTDsgCi19IAotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgY2dpZF9jbWRzW10gPSAKLXsgCi0gICAgeyJTY3JpcHRMb2ciLCBzZXRfc2NyaXB0bG9nLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLCAKLSAgICAgInRoZSBuYW1lIG9mIGEgbG9nIGZvciBzY3JpcHQgZGVidWdnaW5nIGluZm8ifSwgCi0gICAgeyJTY3JpcHRMb2dMZW5ndGgiLCBzZXRfc2NyaXB0bG9nX2xlbmd0aCwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwgCi0gICAgICJ0aGUgbWF4aW11bSBsZW5ndGggKGluIGJ5dGVzKSBvZiB0aGUgc2NyaXB0IGRlYnVnIGxvZyJ9LCAKLSAgICB7IlNjcmlwdExvZ0J1ZmZlciIsIHNldF9zY3JpcHRsb2dfYnVmZmVyLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLCAKLSAgICAgInRoZSBtYXhpbXVtIHNpemUgKGluIGJ5dGVzKSB0byByZWNvcmQgb2YgYSBQT1NUIHJlcXVlc3QifSwgCi0gICAgeyJTY3JpcHRzb2NrIiwgc2V0X3NjcmlwdF9zb2NrZXQsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsIAotICAgICAidGhlIG5hbWUgb2YgdGhlIHNvY2tldCB0byB1c2UgZm9yIGNvbW11bmljYXRpb24gd2l0aCB0aGUgY2dpIGRhZW1vbi4ifSwgCi0gICAge05VTEx9IAotfTsgCi0KLXN0YXRpYyBpbnQgbG9nX3NjcmlwdGVycm9yKHJlcXVlc3RfcmVjICpyLCBjZ2lkX3NlcnZlcl9jb25mICogY29uZiwgaW50IHJldCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hvd19lcnJubywgY2hhciAqZXJyb3IpIAoteyAKLSAgICBhcF9maWxlX3QgKmY7IAotICAgIHN0cnVjdCBzdGF0IGZpbmZvOyAKLQotICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgc2hvd19lcnJub3xBUExPR19FUlIsIGVycm5vLCByLCAKLSAgICAgICAgICAgICAgICAiJXM6ICVzIiwgZXJyb3IsIHItPmZpbGVuYW1lKTsgCi0KLSAgICBpZiAoIWNvbmYtPmxvZ25hbWUgfHwgCi0gICAgICAgICgoc3RhdChhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShyLT5wb29sLCBjb25mLT5sb2duYW1lKSwgJmZpbmZvKSA9PSAwKSAKLSAgICAgICAgICYmIChmaW5mby5zdF9zaXplID4gY29uZi0+bG9nYnl0ZXMpKSB8fCAKLSAgICAgICAgIChhcF9vcGVuKCZmLCBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShyLT5wb29sLCBjb25mLT5sb2duYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICBBUFJfQVBQRU5ELCBBUFJfT1NfREVGQVVMVCwgci0+cG9vbCkgIT0gQVBSX1NVQ0NFU1MpKSB7IAotICAgICAgICByZXR1cm4gcmV0OyAKLSAgICB9IAotCi0gICAgLyogIiUlIFtXZWQgSnVuIDE5IDEwOjUzOjIxIDE5OTZdIEdFVCAvY2dpZC1iaW4vcHJpbnRlbnYgSFRUUC8xLjAiICovIAotICAgIGFwX2ZwcmludGYoZiwgIiUlJSUgWyVzXSAlcyAlcyVzJXMgJXNcbiIsIGFwX2dldF90aW1lKCksIHItPm1ldGhvZCwgci0+dXJpLCAKLSAgICAgICAgICAgIHItPmFyZ3MgPyAiPyIgOiAiIiwgci0+YXJncyA/IHItPmFyZ3MgOiAiIiwgci0+cHJvdG9jb2wpOyAKLSAgICAvKiAiJSUgNTAwIC91c3IvbG9jYWwvYXBhY2hlL2NnaWQtYmluICovIAotICAgIGFwX2ZwcmludGYoZiwgIiUlJSUgJWQgJXNcbiIsIHJldCwgci0+ZmlsZW5hbWUpOyAKLQotICAgIGFwX2ZwcmludGYoZiwgIiUlZXJyb3JcbiVzXG4iLCBlcnJvcik7IAotCi0gICAgYXBfY2xvc2UoZik7IAotICAgIHJldHVybiByZXQ7IAotfSAKLQotc3RhdGljIGludCBsb2dfc2NyaXB0KHJlcXVlc3RfcmVjICpyLCBjZ2lkX3NlcnZlcl9jb25mICogY29uZiwgaW50IHJldCwgCi0gICAgICAgICAgICAgICAgICBjaGFyICpkYnVmLCBjb25zdCBjaGFyICpzYnVmLCBCVUZGICpzY3JpcHRfaW4sIEJVRkYgKnNjcmlwdF9lcnIpIAoteyAKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqaGRyc19hcnIgPSBhcF90YWJsZV9lbHRzKHItPmhlYWRlcnNfaW4pOyAKLSAgICBhcF90YWJsZV9lbnRyeV90ICpoZHJzID0gKGFwX3RhYmxlX2VudHJ5X3QgKikgaGRyc19hcnItPmVsdHM7IAotICAgIGNoYXIgYXJnc2J1ZmZlcltIVUdFX1NUUklOR19MRU5dOyAKLSAgICBhcF9maWxlX3QgKmY7IAotICAgIGludCBpOyAKLSAgICBzdHJ1Y3Qgc3RhdCBmaW5mbzsgCi0KLSAgICBpZiAoIWNvbmYtPmxvZ25hbWUgfHwgCi0gICAgICAgICgoc3RhdChhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShyLT5wb29sLCBjb25mLT5sb2duYW1lKSwgJmZpbmZvKSA9PSAwKSAKLSAgICAgICAgICYmIChmaW5mby5zdF9zaXplID4gY29uZi0+bG9nYnl0ZXMpKSB8fCAKLSAgICAgICAgIChhcF9vcGVuKCZmLCBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShyLT5wb29sLCBjb25mLT5sb2duYW1lKSwgCi0gICAgICAgICAgICAgICAgICBBUFJfQVBQRU5ELCBBUFJfT1NfREVGQVVMVCwgci0+cG9vbCkgIT0gQVBSX1NVQ0NFU1MpKSB7IAotICAgICAgICAvKiBTb2FrIHVwIHNjcmlwdCBvdXRwdXQgKi8gCi0gICAgICAgIHdoaWxlIChhcF9iZ2V0cyhhcmdzYnVmZmVyLCBIVUdFX1NUUklOR19MRU4sIHNjcmlwdF9pbikgPiAwKSAKLSAgICAgICAgICAgIGNvbnRpbnVlOyAKLSAgICAgICAgd2hpbGUgKGFwX2JnZXRzKGFyZ3NidWZmZXIsIEhVR0VfU1RSSU5HX0xFTiwgc2NyaXB0X2VycikgPiAwKSAKLSAgICAgICAgICAgIGNvbnRpbnVlOyAKLSAgICAgICAgcmV0dXJuIHJldDsgCi0gICAgfSAKLQotICAgIC8qICIlJSBbV2VkIEp1biAxOSAxMDo1MzoyMSAxOTk2XSBHRVQgL2NnaWQtYmluL3ByaW50ZW52IEhUVFAvMS4wIiAqLyAKLSAgICBhcF9mcHJpbnRmKGYsICIlJSUlIFslc10gJXMgJXMlcyVzICVzXG4iLCBhcF9nZXRfdGltZSgpLCByLT5tZXRob2QsIHItPnVyaSwgCi0gICAgICAgICAgICByLT5hcmdzID8gIj8iIDogIiIsIHItPmFyZ3MgPyByLT5hcmdzIDogIiIsIHItPnByb3RvY29sKTsgCi0gICAgLyogIiUlIDUwMCAvdXNyL2xvY2FsL2FwYWNoZS9jZ2lkLWJpbiIgKi8gCi0gICAgYXBfZnByaW50ZihmLCAiJSUlJSAlZCAlc1xuIiwgcmV0LCByLT5maWxlbmFtZSk7IAotCi0gICAgYXBfcHV0cygiJXJlcXVlc3RcbiIsIGYpOyAKLSAgICBmb3IgKGkgPSAwOyBpIDwgaGRyc19hcnItPm5lbHRzOyArK2kpIHsgCi0gICAgICAgIGlmICghaGRyc1tpXS5rZXkpIAotICAgICAgICAgICAgY29udGludWU7IAotICAgICAgICBhcF9mcHJpbnRmKGYsICIlczogJXNcbiIsIGhkcnNbaV0ua2V5LCBoZHJzW2ldLnZhbCk7IAotICAgIH0gCi0gICAgaWYgKChyLT5tZXRob2RfbnVtYmVyID09IE1fUE9TVCB8fCByLT5tZXRob2RfbnVtYmVyID09IE1fUFVUKSAKLSAgICAgICAgJiYgKmRidWYpIHsgCi0gICAgICAgIGFwX2ZwcmludGYoZiwgIlxuJXNcbiIsIGRidWYpOyAKLSAgICB9IAotCi0gICAgYXBfcHV0cygiJXJlc3BvbnNlXG4iLCBmKTsgCi0gICAgaGRyc19hcnIgPSBhcF90YWJsZV9lbHRzKHItPmVycl9oZWFkZXJzX291dCk7IAotICAgIGhkcnMgPSAoYXBfdGFibGVfZW50cnlfdCAqKSBoZHJzX2Fyci0+ZWx0czsgCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgaGRyc19hcnItPm5lbHRzOyArK2kpIHsgCi0gICAgICAgIGlmICghaGRyc1tpXS5rZXkpIAotICAgICAgICAgICAgY29udGludWU7IAotICAgICAgICBhcF9mcHJpbnRmKGYsICIlczogJXNcbiIsIGhkcnNbaV0ua2V5LCBoZHJzW2ldLnZhbCk7IAotICAgIH0gCi0KLSAgICBpZiAoc2J1ZiAmJiAqc2J1ZikgCi0gICAgICAgIGFwX2ZwcmludGYoZiwgIiVzXG4iLCBzYnVmKTsgCi0KLSAgICBpZiAoYXBfYmdldHMoYXJnc2J1ZmZlciwgSFVHRV9TVFJJTkdfTEVOLCBzY3JpcHRfaW4pID4gMCkgeyAKLSAgICAgICAgYXBfcHV0cygiJXN0ZG91dFxuIiwgZik7IAotICAgICAgICBhcF9wdXRzKGFyZ3NidWZmZXIsIGYpOyAKLSAgICAgICAgd2hpbGUgKGFwX2JnZXRzKGFyZ3NidWZmZXIsIEhVR0VfU1RSSU5HX0xFTiwgc2NyaXB0X2luKSA+IDApIAotICAgICAgICAgICAgYXBfcHV0cyhhcmdzYnVmZmVyLCBmKTsgCi0gICAgICAgIGFwX3B1dHMoIlxuIiwgZik7IAotICAgIH0gCi0KLSAgICBpZiAoYXBfYmdldHMoYXJnc2J1ZmZlciwgSFVHRV9TVFJJTkdfTEVOLCBzY3JpcHRfZXJyKSA+IDApIHsgCi0gICAgICAgIGFwX3B1dHMoIiVzdGRlcnJcbiIsIGYpOyAKLSAgICAgICAgYXBfcHV0cyhhcmdzYnVmZmVyLCBmKTsgCi0gICAgICAgIHdoaWxlIChhcF9iZ2V0cyhhcmdzYnVmZmVyLCBIVUdFX1NUUklOR19MRU4sIHNjcmlwdF9lcnIpID4gMCkgCi0gICAgICAgICAgICBhcF9wdXRzKGFyZ3NidWZmZXIsIGYpOyAKLSAgICAgICAgYXBfcHV0cygiXG4iLCBmKTsgCi0gICAgfSAKLQotICAgIGFwX2JjbG9zZShzY3JpcHRfaW4pOyAKLSAgICBhcF9iY2xvc2Uoc2NyaXB0X2Vycik7IAotCi0gICAgYXBfY2xvc2UoZik7IAotICAgIHJldHVybiByZXQ7IAotfSAKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiBBY3R1YWwgY2dpZCBoYW5kbGluZy4uLiAKLSAqLyAKLXN0YXRpYyBpbnQgY2dpZF9oYW5kbGVyKHJlcXVlc3RfcmVjICpyKSAKLXsgCi0gICAgaW50IHJldHZhbCwgbnBoLCBkYnBvcyA9IDA7IAotICAgIGNoYXIgKmFyZ3YwLCAqZGJ1ZiA9IE5VTEw7IAotICAgIEJVRkYgKnNjcmlwdCA9IE5VTEw7IAotICAgIGNoYXIgYXJnc2J1ZmZlcltIVUdFX1NUUklOR19MRU5dOyAKLSAgICB2b2lkICpzY29uZiA9IHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZzsgCi0gICAgY2dpZF9zZXJ2ZXJfY29uZiAqY29uZiA9IChjZ2lkX3NlcnZlcl9jb25mICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHNjb25mLCAmY2dpZF9tb2R1bGUpOyAKLSAgICBpbnQgaXNfaW5jbHVkZWQgPSAhc3RyY21wKHItPnByb3RvY29sLCAiSU5DTFVERUQiKTsgCi0gICAgaW50IHNkOwotICAgIGNoYXIgKiplbnY7IAotICAgIHN0cnVjdCBzb2NrYWRkcl91biB1bml4X2FkZHI7Ci0gICAgYXBfc29ja2V0X3QgKnRlbXBzb2NrID0gTlVMTDsKLSAgICBpbnQgbmJ5dGVzOwotICAgIGFwX2lvbCAqaW9sOwotICAgIHNjcmlwdCA9IGFwX2JjcmVhdGUoci0+cG9vbCwgQl9SRFdSKTsgCi0KLSAgICBpZiAoci0+bWV0aG9kX251bWJlciA9PSBNX09QVElPTlMpIHsgCi0gICAgICAgIC8qIDk5IG91dCBvZiAxMDAgY2dpZCBzY3JpcHRzLCB0aGlzIGlzIGFsbCB0aGV5IHN1cHBvcnQgKi8gCi0gICAgICAgIHItPmFsbG93ZWQgfD0gKDEgPDwgTV9HRVQpOyAKLSAgICAgICAgci0+YWxsb3dlZCB8PSAoMSA8PCBNX1BPU1QpOyAKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOyAKLSAgICB9IAotCi0gICAgaWYgKChhcmd2MCA9IHN0cnJjaHIoci0+ZmlsZW5hbWUsICcvJykpICE9IE5VTEwpCi0gICAgICAgIGFyZ3YwKys7Ci0gICAgZWxzZQotICAgICAgICBhcmd2MCA9IHItPmZpbGVuYW1lOwotIAotICAgIG5waCA9ICEoc3RybmNtcChhcmd2MCwgIm5waC0iLCA0KSk7IAotCi0gICAgaWYgKChhcmd2MCA9IHN0cnJjaHIoci0+ZmlsZW5hbWUsICcvJykpICE9IE5VTEwpIAotICAgICAgICBhcmd2MCsrOyAKLSAgICBlbHNlIAotICAgICAgICBhcmd2MCA9IHItPmZpbGVuYW1lOyAKLQotICAgIGlmICghKGFwX2FsbG93X29wdGlvbnMocikgJiBPUFRfRVhFQ0NHSSkgJiYgIWlzX3NjcmlwdGFsaWFzZWQocikpIAotICAgICAgICByZXR1cm4gbG9nX3NjcmlwdGVycm9yKHIsIGNvbmYsIEZPUkJJRERFTiwgQVBMT0dfTk9FUlJOTywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9wdGlvbnMgRXhlY0NHSSBpcyBvZmYgaW4gdGhpcyBkaXJlY3RvcnkiKTsgCi0gICAgaWYgKG5waCAmJiBpc19pbmNsdWRlZCkgCi0gICAgICAgIHJldHVybiBsb2dfc2NyaXB0ZXJyb3IociwgY29uZiwgRk9SQklEREVOLCBBUExPR19OT0VSUk5PLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0ZW1wdCB0byBpbmNsdWRlIE5QSCBDR0kgc2NyaXB0Iik7IAotCi0jaWYgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lOMzIpIAotICAgIC8qIEFsbG93IGZvciBjZ2lkIGZpbGVzIHdpdGhvdXQgdGhlIC5FWEUgZXh0ZW5zaW9uIG9uIHRoZW0gdW5kZXIgT1MvMiAqLyAKLSAgICBpZiAoci0+ZmluZm8uc3RfbW9kZSA9PSAwKSB7IAotICAgICAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOyAKLSAgICAgICAgY2hhciAqbmV3ZmlsZTsgCi0KLSAgICAgICAgbmV3ZmlsZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgci0+ZmlsZW5hbWUsICIuRVhFIiwgTlVMTCk7IAotCi0gICAgICAgIGlmICgoc3RhdChuZXdmaWxlLCAmc3RhdGJ1ZikgIT0gMCkgfHwgKCFTX0lTUkVHKHN0YXRidWYuc3RfbW9kZSkpKSB7IAotICAgICAgICAgICAgcmV0dXJuIGxvZ19zY3JpcHRlcnJvcihyLCBjb25mLCBOT1RfRk9VTkQsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2NyaXB0IG5vdCBmb3VuZCBvciB1bmFibGUgdG8gc3RhdCIpOyAKLSAgICAgICAgfSBlbHNlIHsgCi0gICAgICAgICAgICByLT5maWxlbmFtZSA9IG5ld2ZpbGU7IAotICAgICAgICB9IAotICAgIH0gCi0jZWxzZSAKLSAgICBpZiAoci0+ZmluZm8uc3RfbW9kZSA9PSAwKSAKLSAgICAgICAgcmV0dXJuIGxvZ19zY3JpcHRlcnJvcihyLCBjb25mLCBOT1RfRk9VTkQsIEFQTE9HX05PRVJSTk8sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY3JpcHQgbm90IGZvdW5kIG9yIHVuYWJsZSB0byBzdGF0Iik7IAotI2VuZGlmIAotICAgIGlmIChTX0lTRElSKHItPmZpbmZvLnN0X21vZGUpKSAKLSAgICAgICAgcmV0dXJuIGxvZ19zY3JpcHRlcnJvcihyLCBjb25mLCBGT1JCSURERU4sIEFQTE9HX05PRVJSTk8sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRlbXB0IHRvIGludm9rZSBkaXJlY3RvcnkgYXMgc2NyaXB0Iik7IAotLyoKLSAgICBpZiAoIWFwX3N1ZXhlY19lbmFibGVkKSB7IAotICAgICAgICBpZiAoIWFwX2Nhbl9leGVjKCZyLT5maW5mbykpIAotICAgICAgICAgICAgcmV0dXJuIGxvZ19zY3JpcHRlcnJvcihyLCBjb25mLCBGT1JCSURERU4sIEFQTE9HX05PRVJSTk8sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZSBwZXJtaXNzaW9ucyBkZW55IHNlcnZlciBleGVjdXRpb24iKTsgCi0gICAgfSAKLSovCi0gICAgYXBfYWRkX2NvbW1vbl92YXJzKHIpOyAKLSAgICBhcF9hZGRfY2dpX3ZhcnMocik7IAotICAgIGVudiA9IGFwX2NyZWF0ZV9lbnZpcm9ubWVudChyLT5wb29sLCByLT5zdWJwcm9jZXNzX2Vudik7IAotCi0gICAgaWYgKChzZCA9IHNvY2tldChBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCkpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIGxvZ19zY3JpcHRlcnJvcihyLCBjb25mLCBOT1RfRk9VTkQsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIGNyZWF0ZSBzb2NrZXQgdG8gY2dpIGRhZW1vbiIpOwotICAgIH0gCi0gICAgbWVtc2V0KCZ1bml4X2FkZHIsIDAsIHNpemVvZih1bml4X2FkZHIpKTsKLSAgICB1bml4X2FkZHIuc3VuX2ZhbWlseSA9IEFGX1VOSVg7Ci0gICAgc3RyY3B5KHVuaXhfYWRkci5zdW5fcGF0aCwgY29uZi0+c29ja25hbWUpOwotCi0gICAgaWYgKGNvbm5lY3Qoc2QsIChzdHJ1Y3Qgc29ja2FkZHIgKikmdW5peF9hZGRyLCBzaXplb2YodW5peF9hZGRyKSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbG9nX3NjcmlwdGVycm9yKHIsIGNvbmYsIE5PVF9GT1VORCwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gY29ubmVjdCB0byBjZ2kgZGFlbW9uIik7Ci0gICAgfSAKLQotICAgIHNlbmRfcmVxKHNkLCByLCBhcmd2MCwgZW52KTsgCi0KLSAgICBhcF9wdXRfb3Nfc29jaygmdGVtcHNvY2ssICZzZCwgcGNnaSk7Ci0KLSAgICBpb2wgPSB1bml4X2F0dGFjaF9zb2NrZXQodGVtcHNvY2spOwotCi0gICAgYXBfYnB1c2hfaW9sKHNjcmlwdCwgaW9sKTsgCi0KLSAgICBpZiAoKHJldHZhbCA9IGFwX3NldHVwX2NsaWVudF9ibG9jayhyLCBSRVFVRVNUX0NIVU5LRURfRVJST1IpKSkgCi0gICAgICAgIHJldHVybiByZXR2YWw7IAotICAgICAKLSAgICBpZiAoKGFyZ3YwID0gc3RycmNocihyLT5maWxlbmFtZSwgJy8nKSkgIT0gTlVMTCkgCi0gICAgICAgIGFyZ3YwKys7IAotICAgIGVsc2UgCi0gICAgICAgIGFyZ3YwID0gci0+ZmlsZW5hbWU7IAotCi0gICAgLyogVHJhbnNmZXIgYW55IHB1dC9wb3N0IGFyZ3MsIENFUk4gc3R5bGUuLi4gCi0gICAgICogTm90ZSB0aGF0IHdlIGFscmVhZHkgaWdub3JlIFNJR1BJUEUgaW4gdGhlIGNvcmUgc2VydmVyLiAKLSAgICAgKi8gCi0KLSAgICBpZiAoYXBfc2hvdWxkX2NsaWVudF9ibG9jayhyKSkgeyAKLSAgICAgICAgaW50IGRic2l6ZSwgbGVuX3JlYWQ7IAotCi0gICAgICAgIGlmIChjb25mLT5sb2duYW1lKSB7IAotICAgICAgICAgICAgZGJ1ZiA9IGFwX3BjYWxsb2Moci0+cG9vbCwgY29uZi0+YnVmYnl0ZXMgKyAxKTsgCi0gICAgICAgICAgICBkYnBvcyA9IDA7IAotICAgICAgICB9IAotCi0KLQotICAgICAgICB3aGlsZSAoKGxlbl9yZWFkID0gCi0gICAgICAgICAgICAgICAgYXBfZ2V0X2NsaWVudF9ibG9jayhyLCBhcmdzYnVmZmVyLCBIVUdFX1NUUklOR19MRU4pKSA+IDApIHsgCi0gICAgICAgICAgICBpZiAoY29uZi0+bG9nbmFtZSkgeyAKLSAgICAgICAgICAgICAgICBpZiAoKGRicG9zICsgbGVuX3JlYWQpID4gY29uZi0+YnVmYnl0ZXMpIHsgCi0gICAgICAgICAgICAgICAgICAgIGRic2l6ZSA9IGNvbmYtPmJ1ZmJ5dGVzIC0gZGJwb3M7IAotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgICAgZWxzZSB7IAotICAgICAgICAgICAgICAgICAgICBkYnNpemUgPSBsZW5fcmVhZDsgCi0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICBtZW1jcHkoZGJ1ZiArIGRicG9zLCBhcmdzYnVmZmVyLCBkYnNpemUpOyAKLSAgICAgICAgICAgICAgICBkYnBvcyArPSBkYnNpemU7IAotICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIGFwX2J3cml0ZShzY3JpcHQsIGFyZ3NidWZmZXIsIGxlbl9yZWFkLCAmbmJ5dGVzKTsKLSAgICAgICAgICAgIGlmIChuYnl0ZXMgPCBsZW5fcmVhZCkgeyAKLSAgICAgICAgICAgICAgICAvKiBzaWxseSBzY3JpcHQgc3RvcHBlZCByZWFkaW5nLCBzb2FrIHVwIHJlbWFpbmluZyBtZXNzYWdlICovIAotICAgICAgICAgICAgICAgIHdoaWxlIChhcF9nZXRfY2xpZW50X2Jsb2NrKHIsIGFyZ3NidWZmZXIsIEhVR0VfU1RSSU5HX0xFTikgPiAwKSB7IAotICAgICAgICAgICAgICAgICAgICAvKiBkdW1wIGl0ICovIAotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgICAgYnJlYWs7IAotICAgICAgICAgICAgfSAKLSAgICAgICAgfSAKLQotICAgICAgICBhcF9iZmx1c2goc2NyaXB0KTsgCi0KLSAgICB9IAotCi0gICAgLyogSGFuZGxlIHNjcmlwdCByZXR1cm4uLi4gKi8gCi0gICAgaWYgKHNjcmlwdCAmJiAhbnBoKSB7IAotICAgICAgICBjb25zdCBjaGFyICpsb2NhdGlvbjsgCi0gICAgICAgIGNoYXIgc2J1ZltNQVhfU1RSSU5HX0xFTl07IAotICAgICAgICBpbnQgcmV0OyAKLQotICAgICAgICBpZiAoKHJldCA9IGFwX3NjYW5fc2NyaXB0X2hlYWRlcl9lcnJfYnVmZihyLCBzY3JpcHQsIHNidWYpKSkgeyAKLSAgICAgICAgICAgIHJldHVybiBsb2dfc2NyaXB0KHIsIGNvbmYsIHJldCwgZGJ1Ziwgc2J1Ziwgc2NyaXB0LCBOVUxMKTsgCi0gICAgICAgIH0gCi0KLSNpZmRlZiBDSEFSU0VUX0VCQ0RJQyAKLSAgICAgICAgLyogTm93IGNoZWNrIHRoZSBDb250ZW50LVR5cGUgdG8gZGVjaWRlIGlmIGNvbnZlcnNpb24gaXMgbmVlZGVkICovIAotICAgICAgICBhcF9jaGVja2NvbnYocik7IAotI2VuZGlmIC8qQ0hBUlNFVF9FQkNESUMqLyAKLQotICAgICAgICBsb2NhdGlvbiA9IGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX291dCwgIkxvY2F0aW9uIik7IAotCi0gICAgICAgIGlmIChsb2NhdGlvbiAmJiBsb2NhdGlvblswXSA9PSAnLycgJiYgci0+c3RhdHVzID09IDIwMCkgeyAKLQotICAgICAgICAgICAgLyogU29hayB1cCBhbGwgdGhlIHNjcmlwdCBvdXRwdXQgKi8gCi0gICAgICAgICAgICB3aGlsZSAoYXBfYmdldHMoYXJnc2J1ZmZlciwgSFVHRV9TVFJJTkdfTEVOLCBzY3JpcHQpID4gMCkgeyAKLSAgICAgICAgICAgICAgICBjb250aW51ZTsgCi0gICAgICAgICAgICB9IAotICAgICAgICAgICAgLyogVGhpcyByZWRpcmVjdCBuZWVkcyB0byBiZSBhIEdFVCBubyBtYXR0ZXIgd2hhdCB0aGUgb3JpZ2luYWwgCi0gICAgICAgICAgICAgKiBtZXRob2Qgd2FzLiAKLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIHItPm1ldGhvZCA9IGFwX3BzdHJkdXAoci0+cG9vbCwgIkdFVCIpOyAKLSAgICAgICAgICAgIHItPm1ldGhvZF9udW1iZXIgPSBNX0dFVDsgCi0KLSAgICAgICAgICAgIC8qIFdlIGFscmVhZHkgcmVhZCB0aGUgbWVzc2FnZSBib2R5IChpZiBhbnkpLCBzbyBkb24ndCBhbGxvdyAKLSAgICAgICAgICAgICAqIHRoZSByZWRpcmVjdGVkIHJlcXVlc3QgdG8gdGhpbmsgaXQgaGFzIG9uZS4gV2UgY2FuIGlnbm9yZSAKLSAgICAgICAgICAgICAqIFRyYW5zZmVyLUVuY29kaW5nLCBzaW5jZSB3ZSB1c2VkIFJFUVVFU1RfQ0hVTktFRF9FUlJPUi4gCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBhcF90YWJsZV91bnNldChyLT5oZWFkZXJzX2luLCAiQ29udGVudC1MZW5ndGgiKTsgCi0KLSAgICAgICAgICAgIGFwX2ludGVybmFsX3JlZGlyZWN0X2hhbmRsZXIobG9jYXRpb24sIHIpOyAKLSAgICAgICAgICAgIHJldHVybiBPSzsgCi0gICAgICAgIH0gCi0gICAgICAgIGVsc2UgaWYgKGxvY2F0aW9uICYmIHItPnN0YXR1cyA9PSAyMDApIHsgCi0gICAgICAgICAgICAvKiBYWCBOb3RlIHRoYXQgaWYgYSBzY3JpcHQgd2FudHMgdG8gcHJvZHVjZSBpdHMgb3duIFJlZGlyZWN0IAotICAgICAgICAgICAgICogYm9keSwgaXQgbm93IGhhcyB0byBleHBsaWNpdGx5ICpzYXkqICJTdGF0dXM6IDMwMiIgCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICByZXR1cm4gUkVESVJFQ1Q7IAotICAgICAgICB9IAotCi0gICAgICAgIGFwX3NlbmRfaHR0cF9oZWFkZXIocik7IAotICAgICAgICBpZiAoIXItPmhlYWRlcl9vbmx5KSB7IAotICAgICAgICAgICAgYXBfc2VuZF9mYihzY3JpcHQsIHIpOyAKLSAgICAgICAgfSAKLSAgICAgICAgYXBfYmNsb3NlKHNjcmlwdCk7IAotICAgIH0gCi0KLSAgICBpZiAoc2NyaXB0ICYmIG5waCkgeyAKLSAgICAgICAgYXBfc2VuZF9mYihzY3JpcHQsIHIpOyAKLSAgICB9IAotCi1hcF9kZXN0cm95X3Bvb2wocGNnaSk7Ci0KLSAgICByZXR1cm4gT0s7IC8qIE5PVCByLT5zdGF0dXMsIGV2ZW4gaWYgaXQgaGFzIGNoYW5nZWQuICovIAotfSAKLQotc3RhdGljIGNvbnN0IGhhbmRsZXJfcmVjIGNnaWRfaGFuZGxlcnNbXSA9IAoteyAKLSAgICB7Q0dJX01BR0lDX1RZUEUsIGNnaWRfaGFuZGxlcn0sIAotICAgIHsiY2dpLXNjcmlwdCIsIGNnaWRfaGFuZGxlcn0sIAotICAgIHtOVUxMfSAKLX07Ci0KLXN0YXRpYyB2b2lkIHJlZ2lzdGVyX2hvb2sodm9pZCkKLXsKLSAgICBhcF9ob29rX3Bvc3RfY29uZmlnKGNnaWRfaW5pdCwgTlVMTCwgTlVMTCwgSE9PS19NSURETEUpOwotfQotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgY2dpZF9tb2R1bGUgPSB7IAotICAgIFNUQU5EQVJEMjBfTU9EVUxFX1NUVUZGLCAKLSAgICBOVUxMLCAvKiBkaXIgY29uZmlnIGNyZWF0ZXIgKi8gCi0gICAgTlVMTCwgLyogZGlyIG1lcmdlciAtLS0gZGVmYXVsdCBpcyB0byBvdmVycmlkZSAqLyAKLSAgICBjcmVhdGVfY2dpZF9jb25maWcsIC8qIHNlcnZlciBjb25maWcgKi8gCi0gICAgbWVyZ2VfY2dpZF9jb25maWcsIC8qIG1lcmdlIHNlcnZlciBjb25maWcgKi8gCi0gICAgY2dpZF9jbWRzLCAvKiBjb21tYW5kIHRhYmxlICovIAotICAgIGNnaWRfaGFuZGxlcnMsIC8qIGhhbmRsZXJzICovIAotICAgIHJlZ2lzdGVyX2hvb2sgLyogcmVnaXN0ZXJfaGFuZGxlcnMgKi8gCi19OyAKLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9jZ2lkLmV4cCBiL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfY2dpZC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMTBkNDguLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9jZ2lkLmV4cAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWNnaWRfbW9kdWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2luZm8uYyBiL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfaW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzk5NTg1Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfaW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsNjk1ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyogCi0gKiBJbmZvIE1vZHVsZS4gIERpc3BsYXkgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNlcnZlciBhbmQKLSAqIGFsbCBpbmNsdWRlZCBtb2R1bGVzLgotICoKLSAqIDxMb2NhdGlvbiAvc2VydmVyLWluZm8+Ci0gKiBTZXRIYW5kbGVyIHNlcnZlci1pbmZvCi0gKiA8L0xvY2F0aW9uPgotICoKLSAqIEdFVCAvc2VydmVyLWluZm8gLSBSZXR1cm5zIGZ1bGwgY29uZmlndXJhdGlvbiBwYWdlIGZvciBzZXJ2ZXIgYW5kIGFsbCBtb2R1bGVzCi0gKiBHRVQgL3NlcnZlci1pbmZvP3NlcnZlciAtIFJldHVybnMgc2VydmVyIGNvbmZpZ3VyYXRpb24gb25seQotICogR0VUIC9zZXJ2ZXItaW5mbz9tb2R1bGVfbmFtZSAtIFJldHVybnMgY29uZmlndXJhdGlvbiBmb3IgYSBzaW5nbGUgbW9kdWxlCi0gKiBHRVQgL3NlcnZlci1pbmZvP2xpc3QgLSBSZXR1cm5zIHF1aWNrIGxpc3Qgb2YgaW5jbHVkZWQgbW9kdWxlcwotICoKLSAqIFJhc211cyBMZXJkb3JmIDxyYXNtdXNAdmV4Lm5ldD4sIE1heSAxOTk2Ci0gKgotICogMDUuMDEuOTYgSW5pdGlhbCBWZXJzaW9uCi0gKgotICogTG91IExhbmdob2x0eiA8bGRsQHVzaS51dGFoLmVkdT4sIEp1bHkgMTk5NwotICoKLSAqIDA3LjExLjk3IEFkZGl0aW9uIG9mIHRoZSBBZGRNb2R1bGVJbmZvIGRpcmVjdGl2ZQotICogCi0gKi8KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJ1dGlsX3NjcmlwdC5oIgotI2luY2x1ZGUgImh0dHBfY29uZl9nbG9iYWxzLmgiCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgLyogbWF0Y2hpbmcgbW9kdWxlIG5hbWUgKi8KLSAgICBjaGFyICppbmZvOyAgICAgICAgICAgICAgICAgLyogYWRkaXRpb25hbCBpbmZvICovCi19IGluZm9fZW50cnk7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBhcnJheV9oZWFkZXIgKm1vcmVfaW5mbzsKLX0gaW5mb19zdnJfY29uZjsKLQotdHlwZWRlZiBzdHJ1Y3QgaW5mb19jZmdfbGluZXMgewotICAgIGNoYXIgKmNtZDsKLSAgICBjaGFyICpsaW5lOwotICAgIHN0cnVjdCBpbmZvX2NmZ19saW5lcyAqbmV4dDsKLX0gaW5mb19jZmdfbGluZXM7Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBpbmZvX21vZHVsZTsKLWV4dGVybiBtb2R1bGUgKnRvcF9tb2R1bGU7Ci0KLXN0YXRpYyB2b2lkICpjcmVhdGVfaW5mb19jb25maWcocG9vbCAqcCwgc2VydmVyX3JlYyAqcykKLXsKLSAgICBpbmZvX3N2cl9jb25mICpjb25mID0gKGluZm9fc3ZyX2NvbmYgKikgYXBfcGNhbGxvYyhwLCBzaXplb2YoaW5mb19zdnJfY29uZikpOwotCi0gICAgY29uZi0+bW9yZV9pbmZvID0gYXBfbWFrZV9hcnJheShwLCAyMCwgc2l6ZW9mKGluZm9fZW50cnkpKTsKLSAgICByZXR1cm4gY29uZjsKLX0KLQotc3RhdGljIHZvaWQgKm1lcmdlX2luZm9fY29uZmlnKHBvb2wgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICpvdmVycmlkZXN2KQotewotICAgIGluZm9fc3ZyX2NvbmYgKm5ldyA9IChpbmZvX3N2cl9jb25mICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKGluZm9fc3ZyX2NvbmYpKTsKLSAgICBpbmZvX3N2cl9jb25mICpiYXNlID0gKGluZm9fc3ZyX2NvbmYgKikgYmFzZXY7Ci0gICAgaW5mb19zdnJfY29uZiAqb3ZlcnJpZGVzID0gKGluZm9fc3ZyX2NvbmYgKikgb3ZlcnJpZGVzdjsKLQotICAgIG5ldy0+bW9yZV9pbmZvID0gYXBfYXBwZW5kX2FycmF5cyhwLCBvdmVycmlkZXMtPm1vcmVfaW5mbywgYmFzZS0+bW9yZV9pbmZvKTsKLSAgICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgY2hhciAqbW9kX2luZm9faHRtbF9jbWRfc3RyaW5nKGNvbnN0IGNoYXIgKnN0cmluZywgY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbikKLXsKLSAgICBjb25zdCBjaGFyICpzOwotICAgIGNoYXIgKnQ7Ci0gICAgY2hhciAqZW5kX2J1ZjsKLQotICAgIHMgPSBzdHJpbmc7Ci0gICAgdCA9IGJ1ZjsKLSAgICAvKiBrZWVwIHNwYWNlIGZvciBcMCBieXRlICovCi0gICAgZW5kX2J1ZiA9IGJ1ZiArIGJ1Zl9sZW4gLSAxOwotICAgIHdoaWxlICgoKnMpICYmICh0IDwgZW5kX2J1ZikpIHsKLSAgICAgICAgaWYgKCpzID09ICc8JykgewotICAgICAgICAgICAgc3RybmNweSh0LCAiJmx0OyIsIGVuZF9idWYgLSB0KTsKLSAgICAgICAgICAgIHQgKz0gNDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgqcyA9PSAnPicpIHsKLSAgICAgICAgICAgIHN0cm5jcHkodCwgIiZndDsiLCBlbmRfYnVmIC0gdCk7Ci0gICAgICAgICAgICB0ICs9IDQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKnMgPT0gJyYnKSB7Ci0gICAgICAgICAgICBzdHJuY3B5KHQsICImYW1wOyIsIGVuZF9idWYgLSB0KTsKLSAgICAgICAgICAgIHQgKz0gNTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICp0KysgPSAqczsKLSAgICAgICAgfQotICAgICAgICBzKys7Ci0gICAgfQotICAgIC8qIG9vcHMsIG92ZXJmbG93ZWQuLi4gZG9uJ3Qgb3ZlcndyaXRlICovCi0gICAgaWYgKHQgPiBlbmRfYnVmKSB7Ci0JKmVuZF9idWYgPSAnXDAnOwotICAgIH0KLSAgICBlbHNlIHsKLQkqdCA9ICdcMCc7Ci0gICAgfQotICAgIHJldHVybiAoYnVmKTsKLX0KLQotc3RhdGljIGluZm9fY2ZnX2xpbmVzICptb2RfaW5mb19sb2FkX2NvbmZpZyhwb29sICpwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY2hhciBzW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjb25maWdmaWxlX3QgKmZwOwotICAgIGluZm9fY2ZnX2xpbmVzICpuZXcsICpyZXQsICpwcmV2OwotICAgIGNvbnN0IGNoYXIgKnQ7Ci0KLSAgICBmcCA9IGFwX3BjZmdfb3BlbmZpbGUocCwgZmlsZW5hbWUpOwotICAgIGlmICghZnApIHsKLSAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCByLCAKLQkJICAgICJtb2RfaW5mbzogY291bGRuJ3Qgb3BlbiBjb25maWcgZmlsZSAlcyIsCi0JCSAgICBmaWxlbmFtZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXQgPSBOVUxMOwotICAgIHByZXYgPSBOVUxMOwotICAgIHdoaWxlICghYXBfY2ZnX2dldGxpbmUocywgTUFYX1NUUklOR19MRU4sIGZwKSkgewotICAgICAgICBpZiAoKnMgPT0gJyMnKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgIC8qIHNraXAgY29tbWVudHMgKi8KLSAgICAgICAgfQotICAgICAgICBuZXcgPSBhcF9wYWxsb2MocCwgc2l6ZW9mKHN0cnVjdCBpbmZvX2NmZ19saW5lcykpOwotICAgICAgICBuZXctPm5leHQgPSBOVUxMOwotICAgICAgICBpZiAoIXJldCkgewotICAgICAgICAgICAgcmV0ID0gbmV3OwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmV2KSB7Ci0gICAgICAgICAgICBwcmV2LT5uZXh0ID0gbmV3OwotICAgICAgICB9Ci0JdCA9IHM7Ci0JbmV3LT5jbWQgPSBhcF9nZXR3b3JkX2NvbmYocCwgJnQpOwotCWlmICgqdCkgewotCSAgICBuZXctPmxpbmUgPSBhcF9wc3RyZHVwKHAsIHQpOwotCX0KLQllbHNlIHsKLQkgICAgbmV3LT5saW5lID0gTlVMTDsKLQl9Ci0gICAgICAgIHByZXYgPSBuZXc7Ci0gICAgfQotICAgIGFwX2NmZ19jbG9zZWZpbGUoZnApOwotICAgIHJldHVybiAocmV0KTsKLX0KLQotc3RhdGljIHZvaWQgbW9kX2luZm9fbW9kdWxlX2NtZHMocmVxdWVzdF9yZWMgKnIsIGluZm9fY2ZnX2xpbmVzICpjZmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21tYW5kX3JlYyAqY21kcywgY2hhciAqbGFiZWwpCi17Ci0gICAgY29uc3QgY29tbWFuZF9yZWMgKmNtZCA9IGNtZHM7Ci0gICAgaW5mb19jZmdfbGluZXMgKmxpID0gY2ZnLCAqbGlfc3QgPSBOVUxMLCAqbGlfc2UgPSBOVUxMOwotICAgIGluZm9fY2ZnX2xpbmVzICpibG9ja19zdGFydCA9IE5VTEw7Ci0gICAgaW50IGxhYiA9IDAsIG5lc3QgPSAwOwotICAgIGNoYXIgYnVmW01BWF9TVFJJTkdfTEVOXTsKLQotICAgIHdoaWxlIChsaSkgewotICAgICAgICBpZiAoIXN0cm5jYXNlY21wKGxpLT5jbWQsICI8ZGlyZWN0b3J5IiwgMTApIHx8Ci0gICAgICAgICAgICAhc3RybmNhc2VjbXAobGktPmNtZCwgIjxsb2NhdGlvbiIsIDkpIHx8Ci0gICAgICAgICAgICAhc3RybmNhc2VjbXAobGktPmNtZCwgIjxsaW1pdCIsIDYpIHx8Ci0gICAgICAgICAgICAhc3RybmNhc2VjbXAobGktPmNtZCwgIjxmaWxlcyIsIDYpKSB7Ci0gICAgICAgICAgICBpZiAobmVzdCkgewotICAgICAgICAgICAgICAgIGxpX3NlID0gbGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBsaV9zdCA9IGxpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGkgPSBsaS0+bmV4dDsKLSAgICAgICAgICAgIG5lc3QrKzsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG5lc3QgJiYgKCFzdHJuY2FzZWNtcChsaS0+Y21kLCAiPC9saW1pdCIsIDcpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJuY2FzZWNtcChsaS0+Y21kLCAiPC9sb2NhdGlvbiIsIDEwKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RybmNhc2VjbXAobGktPmNtZCwgIjwvZGlyZWN0b3J5IiwgMTEpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJuY2FzZWNtcChsaS0+Y21kLCAiPC9maWxlcyIsIDcpKSkgewotICAgICAgICAgICAgaWYgKGJsb2NrX3N0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKChuZXN0ID09IDEgJiYgYmxvY2tfc3RhcnQgPT0gbGlfc3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChuZXN0ID09IDIgJiYgYmxvY2tfc3RhcnQgPT0gbGlfc2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8ZGQ+PHR0PiIsIHIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmVzdCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiJm5ic3A7Jm5ic3A7Iiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMobW9kX2luZm9faHRtbF9jbWRfc3RyaW5nKGxpLT5jbWQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpLCByKTsKLSAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIiAiLCByKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxpLT5saW5lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cyhtb2RfaW5mb19odG1sX2NtZF9zdHJpbmcobGktPmxpbmUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpLCByKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPC90dD5cbiIsIHIpOwotICAgICAgICAgICAgICAgICAgICBuZXN0LS07Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbmVzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfc3RhcnQgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgbGlfc3QgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfc3RhcnQgPSBsaV9zdDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsaV9zZSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBuZXN0LS07Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbmVzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGlfc3QgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxpX3NlID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBuZXN0LS07Ci0gICAgICAgICAgICAgICAgaWYgKCFuZXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpX3N0ID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGlfc2UgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGkgPSBsaS0+bmV4dDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGNtZCA9IGNtZHM7Ci0gICAgICAgIHdoaWxlIChjbWQpIHsKLSAgICAgICAgICAgIGlmIChjbWQtPm5hbWUpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoY21kLT5uYW1lLCBsaS0+Y21kKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWxhYikgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIjxkdD48c3Ryb25nPiIsIHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMobGFiZWwsIHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIjwvc3Ryb25nPlxuIiwgcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYWIgPSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoKG5lc3QgJiYgYmxvY2tfc3RhcnQgPT0gTlVMTCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAobmVzdCA9PSAyICYmIGJsb2NrX3N0YXJ0ID09IGxpX3N0KSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChzdHJuY2FzZWNtcChsaS0+Y21kLCAiPGRpcmVjdG9yeSIsIDEwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jYXNlY21wKGxpLT5jbWQsICI8bG9jYXRpb24iLCA5KSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jYXNlY21wKGxpLT5jbWQsICI8bGltaXQiLCA2KSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jYXNlY21wKGxpLT5jbWQsICI8L2xpbWl0IiwgNykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdHJuY2FzZWNtcChsaS0+Y21kLCAiPC9sb2NhdGlvbiIsIDEwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jYXNlY21wKGxpLT5jbWQsICI8L2RpcmVjdG9yeSIsIDExKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jYXNlY21wKGxpLT5jbWQsICI8L2ZpbGVzIiwgNykpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPGRkPjx0dD4iLCByKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKG1vZF9pbmZvX2h0bWxfY21kX3N0cmluZyhsaV9zdC0+Y21kLCBidWYsIHNpemVvZihidWYpKSwgcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiICIsIHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpX3N0LT5saW5lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMobW9kX2luZm9faHRtbF9jbWRfc3RyaW5nKGxpX3N0LT5saW5lLCBidWYsIHNpemVvZihidWYpKSwgcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPC90dD5cbiIsIHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfc3RhcnQgPSBsaV9zdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaV9zZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8ZGQ+PHR0PiZuYnNwOyZuYnNwOyIsIHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKG1vZF9pbmZvX2h0bWxfY21kX3N0cmluZyhsaV9zZS0+Y21kLCBidWYsIHNpemVvZihidWYpKSwgcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIiAiLCByKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlfc2UtPmxpbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMobW9kX2luZm9faHRtbF9jbWRfc3RyaW5nKGxpX3NlLT5saW5lLCBidWYsIHNpemVvZihidWYpKSwgcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8L3R0PlxuIiwgcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfc3RhcnQgPSBsaV9zZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPGRkPjx0dD4iLCByKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5lc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCImbmJzcDsmbmJzcDsiLCByKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobmVzdCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiJm5ic3A7Jm5ic3A7Iiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMobW9kX2luZm9faHRtbF9jbWRfc3RyaW5nKGxpLT5jbWQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpLCByKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxpLT5saW5lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiIDxpPiIsIHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMobW9kX2luZm9faHRtbF9jbWRfc3RyaW5nKGxpLT5saW5lLCBidWYsIHNpemVvZihidWYpKSwgcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPC9pPiIsIHIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0JCSAgICBhcF9ycHV0cygiPC90dD4iLCByKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjbWQrKzsKLSAgICAgICAgfQotICAgICAgICBsaSA9IGxpLT5uZXh0OwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKmZpbmRfbW9yZV9pbmZvKHNlcnZlcl9yZWMgKnMsIGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lKQotewotICAgIGludCBpOwotICAgIGluZm9fc3ZyX2NvbmYgKmNvbmYgPSAoaW5mb19zdnJfY29uZiAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mb19tb2R1bGUpOwotICAgIGluZm9fZW50cnkgKmVudHJ5ID0gKGluZm9fZW50cnkgKikgY29uZi0+bW9yZV9pbmZvLT5lbHRzOwotCi0gICAgaWYgKCFtb2R1bGVfbmFtZSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IGNvbmYtPm1vcmVfaW5mby0+bmVsdHM7IGkrKykgewotICAgICAgICBpZiAoIXN0cmNtcChtb2R1bGVfbmFtZSwgZW50cnktPm5hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZW50cnktPmluZm87Ci0gICAgICAgIH0KLSAgICAgICAgZW50cnkrKzsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZGlzcGxheV9pbmZvKHJlcXVlc3RfcmVjICpyKQotewotICAgIG1vZHVsZSAqbW9kcCA9IE5VTEw7Ci0gICAgY2hhciBidWZbTUFYX1NUUklOR19MRU5dLCAqY2ZuYW1lOwotICAgIGNoYXIgKm1vcmVfaW5mbzsKLSAgICBjb25zdCBjb21tYW5kX3JlYyAqY21kID0gTlVMTDsKLSAgICBjb25zdCBoYW5kbGVyX3JlYyAqaGFuZCA9IE5VTEw7Ci0gICAgc2VydmVyX3JlYyAqc2VydiA9IHItPnNlcnZlcjsKLSAgICBpbnQgY29tbWEgPSAwOwotICAgIGluZm9fY2ZnX2xpbmVzICptb2RfaW5mb19jZmdfaHR0cGQgPSBOVUxMOwotICAgIGluZm9fY2ZnX2xpbmVzICptb2RfaW5mb19jZmdfc3JtID0gTlVMTDsKLSAgICBpbmZvX2NmZ19saW5lcyAqbW9kX2luZm9fY2ZnX2FjY2VzcyA9IE5VTEw7Ci0KLSAgICByLT5hbGxvd2VkIHw9ICgxIDw8IE1fR0VUKTsKLSAgICBpZiAoci0+bWV0aG9kX251bWJlciAhPSBNX0dFVCkKLQlyZXR1cm4gREVDTElORUQ7Ci0KLSAgICByLT5jb250ZW50X3R5cGUgPSAidGV4dC9odG1sIjsKLSAgICBhcF9zZW5kX2h0dHBfaGVhZGVyKHIpOwotICAgIGlmIChyLT5oZWFkZXJfb25seSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgYXBfaGFyZF90aW1lb3V0KCJzZW5kIHNlcnZlciBpbmZvIiwgcik7Ci0KLSAgICBhcF9ycHV0cyhET0NUWVBFX0hUTUxfM18yCi0JICAgICAiPGh0bWw+PGhlYWQ+PHRpdGxlPlNlcnZlciBJbmZvcm1hdGlvbjwvdGl0bGU+PC9oZWFkPlxuIiwgcik7Ci0gICAgYXBfcnB1dHMoIjxib2R5PjxoMSBhbGlnbj1jZW50ZXI+QXBhY2hlIFNlcnZlciBJbmZvcm1hdGlvbjwvaDE+XG4iLCByKTsKLSAgICBpZiAoIXItPmFyZ3MgfHwgc3RyY2FzZWNtcChyLT5hcmdzLCAibGlzdCIpKSB7Ci0gICAgICAgIGNmbmFtZSA9IGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHItPnBvb2wsIGFwX3NlcnZlcl9jb25mbmFtZSk7Ci0gICAgICAgIG1vZF9pbmZvX2NmZ19odHRwZCA9IG1vZF9pbmZvX2xvYWRfY29uZmlnKHItPnBvb2wsIGNmbmFtZSwgcik7Ci0gICAgICAgIGNmbmFtZSA9IGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHItPnBvb2wsIHNlcnYtPnNybV9jb25mbmFtZSk7Ci0gICAgICAgIG1vZF9pbmZvX2NmZ19zcm0gPSBtb2RfaW5mb19sb2FkX2NvbmZpZyhyLT5wb29sLCBjZm5hbWUsIHIpOwotICAgICAgICBjZm5hbWUgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShyLT5wb29sLCBzZXJ2LT5hY2Nlc3NfY29uZm5hbWUpOwotICAgICAgICBtb2RfaW5mb19jZmdfYWNjZXNzID0gbW9kX2luZm9fbG9hZF9jb25maWcoci0+cG9vbCwgY2ZuYW1lLCByKTsKLSAgICAgICAgaWYgKCFyLT5hcmdzKSB7Ci0gICAgICAgICAgICBhcF9ycHV0cygiPHR0PjxhIGhyZWY9XCIjc2VydmVyXCI+U2VydmVyIFNldHRpbmdzPC9hPiwgIiwgcik7Ci0gICAgICAgICAgICBmb3IgKG1vZHAgPSB0b3BfbW9kdWxlOyBtb2RwOyBtb2RwID0gbW9kcC0+bmV4dCkgewotICAgICAgICAgICAgICAgIGFwX3JwcmludGYociwgIjxhIGhyZWY9XCIjJXNcIj4lczwvYT4iLCBtb2RwLT5uYW1lLCBtb2RwLT5uYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAobW9kcC0+bmV4dCkgewotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiLCAiLCByKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcF9ycHV0cygiPC90dD48aHI+Iiwgcik7Ci0KLSAgICAgICAgfQotICAgICAgICBpZiAoIXItPmFyZ3MgfHwgIXN0cmNhc2VjbXAoci0+YXJncywgInNlcnZlciIpKSB7Ci0gICAgICAgICAgICBhcF9ycHJpbnRmKHIsICI8YSBuYW1lPVwic2VydmVyXCI+PHN0cm9uZz5TZXJ2ZXIgVmVyc2lvbjo8L3N0cm9uZz4gIgotICAgICAgICAgICAgICAgICAgICAgICAgIjxmb250IHNpemU9KzE+PHR0PiVzPC90dD48L2E+PC9mb250Pjxicj5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBhcF9nZXRfc2VydmVyX3ZlcnNpb24oKSk7Ci0gICAgICAgICAgICBhcF9ycHJpbnRmKHIsICI8c3Ryb25nPlNlcnZlciBCdWlsdDo8L3N0cm9uZz4gIgotICAgICAgICAgICAgICAgICAgICAgICAgIjxmb250IHNpemU9KzE+PHR0PiVzPC90dD48L2E+PC9mb250Pjxicj5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBhcF9nZXRfc2VydmVyX2J1aWx0KCkpOwotICAgICAgICAgICAgYXBfcnByaW50ZihyLCAiPHN0cm9uZz5BUEkgVmVyc2lvbjo8L3N0cm9uZz4gIgotICAgICAgICAgICAgICAgICAgICAgICAgIjx0dD4lZDolZDwvdHQ+PGJyPlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1PRFVMRV9NQUdJQ19OVU1CRVJfTUFKT1IsIE1PRFVMRV9NQUdJQ19OVU1CRVJfTUlOT1IpOwotICAgICAgICAgICAgYXBfcnByaW50ZihyLCAiPHN0cm9uZz5SdW4gTW9kZTo8L3N0cm9uZz4gPHR0PiVzPC90dD48YnI+XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgKGFwX3N0YW5kYWxvbmUgPyAic3RhbmRhbG9uZSIgOiAiaW5ldGQiKSk7Ci0gICAgICAgICAgICBhcF9ycHJpbnRmKHIsICI8c3Ryb25nPlVzZXIvR3JvdXA6PC9zdHJvbmc+ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICI8dHQ+JXMoJWQpLyVkPC90dD48YnI+XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYXBfdXNlcl9uYW1lLCAoaW50KSBhcF91c2VyX2lkLCAoaW50KSBhcF9ncm91cF9pZCk7Ci0gICAgICAgICAgICBhcF9ycHJpbnRmKHIsICI8c3Ryb25nPkhvc3RuYW1lL3BvcnQ6PC9zdHJvbmc+ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICI8dHQ+JXM6JXU8L3R0Pjxicj5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2LT5zZXJ2ZXJfaG9zdG5hbWUsIHNlcnYtPnBvcnQpOwotICAgICAgICAgICAgYXBfcnByaW50ZihyLCAiPHN0cm9uZz5EYWVtb25zOjwvc3Ryb25nPiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiPHR0PnN0YXJ0OiAlZCAmbmJzcDsmbmJzcDsgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm1pbiBpZGxlOiAlZCAmbmJzcDsmbmJzcDsgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm1heCBpZGxlOiAlZCAmbmJzcDsmbmJzcDsgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm1heDogJWQ8L3R0Pjxicj5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBhcF9kYWVtb25zX3RvX3N0YXJ0LCBhcF9kYWVtb25zX21pbl9mcmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgYXBfZGFlbW9uc19tYXhfZnJlZSwgYXBfZGFlbW9uc19saW1pdCk7Ci0gICAgICAgICAgICBhcF9ycHJpbnRmKHIsICI8c3Ryb25nPk1heCBSZXF1ZXN0czo8L3N0cm9uZz4gIgotICAgICAgICAgICAgICAgICAgICAgICAgIjx0dD5wZXIgY2hpbGQ6ICVkICZuYnNwOyZuYnNwOyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAia2VlcCBhbGl2ZTogJXMgJm5ic3A7Jm5ic3A7ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJtYXggcGVyIGNvbm5lY3Rpb246ICVkPC90dD48YnI+XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYXBfbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzZXJ2LT5rZWVwX2FsaXZlID8gIm9uIiA6ICJvZmYiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnYtPmtlZXBfYWxpdmVfbWF4KTsKLSAgICAgICAgICAgIGFwX3JwcmludGYociwgIjxzdHJvbmc+VGhyZWFkczo8L3N0cm9uZz4gIgotICAgICAgICAgICAgICAgICAgICAgICAgIjx0dD5wZXIgY2hpbGQ6ICVkICZuYnNwOyZuYnNwOyA8L3R0Pjxicj5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBhcF90aHJlYWRzX3Blcl9jaGlsZCk7Ci0gICAgICAgICAgICBhcF9ycHJpbnRmKHIsICI8c3Ryb25nPkV4Y2VzcyByZXF1ZXN0czo8L3N0cm9uZz4gIgotICAgICAgICAgICAgICAgICAgICAgICAgIjx0dD5wZXIgY2hpbGQ6ICVkICZuYnNwOyZuYnNwOyA8L3R0Pjxicj5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBhcF9leGNlc3NfcmVxdWVzdHNfcGVyX2NoaWxkKTsKLSAgICAgICAgICAgIGFwX3JwcmludGYociwgIjxzdHJvbmc+VGltZW91dHM6PC9zdHJvbmc+ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICI8dHQ+Y29ubmVjdGlvbjogJWQgJm5ic3A7Jm5ic3A7ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJrZWVwLWFsaXZlOiAlZDwvdHQ+PGJyPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2LT50aW1lb3V0LCBzZXJ2LT5rZWVwX2FsaXZlX3RpbWVvdXQpOwotICAgICAgICAgICAgYXBfcnByaW50ZihyLCAiPHN0cm9uZz5TZXJ2ZXIgUm9vdDo8L3N0cm9uZz4gIgotICAgICAgICAgICAgICAgICAgICAgICAgIjx0dD4lczwvdHQ+PGJyPlxuIiwgYXBfc2VydmVyX3Jvb3QpOwotICAgICAgICAgICAgYXBfcnByaW50ZihyLCAiPHN0cm9uZz5Db25maWcgRmlsZTo8L3N0cm9uZz4gIgotICAgICAgICAgICAgICAgICAgICAgICAgIjx0dD4lczwvdHQ+PGJyPlxuIiwgYXBfc2VydmVyX2NvbmZuYW1lKTsKLSAgICAgICAgICAgIGFwX3JwcmludGYociwgIjxzdHJvbmc+UElEIEZpbGU6PC9zdHJvbmc+ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICI8dHQ+JXM8L3R0Pjxicj5cbiIsIGFwX3BpZF9mbmFtZSk7Ci0gICAgICAgICAgICBhcF9ycHJpbnRmKHIsICI8c3Ryb25nPlNjb3JlYm9hcmQgRmlsZTo8L3N0cm9uZz4gIgotICAgICAgICAgICAgICAgICAgICAgICAgIjx0dD4lczwvdHQ+PGJyPlxuIiwgYXBfc2NvcmVib2FyZF9mbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXBfcnB1dHMoIjxocj48ZGw+Iiwgcik7Ci0gICAgICAgIGZvciAobW9kcCA9IHRvcF9tb2R1bGU7IG1vZHA7IG1vZHAgPSBtb2RwLT5uZXh0KSB7Ci0gICAgICAgICAgICBpZiAoIXItPmFyZ3MgfHwgIXN0cmNhc2VjbXAobW9kcC0+bmFtZSwgci0+YXJncykpIHsKLSAgICAgICAgICAgICAgICBhcF9ycHJpbnRmKHIsICI8ZHQ+PGEgbmFtZT1cIiVzXCI+PHN0cm9uZz5Nb2R1bGUgTmFtZTo8L3N0cm9uZz4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8Zm9udCBzaXplPSsxPjx0dD4lczwvdHQ+PC9hPjwvZm9udD5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kcC0+bmFtZSwgbW9kcC0+bmFtZSk7Ci0gICAgICAgICAgICAgICAgYXBfcnB1dHMoIjxkdD48c3Ryb25nPkNvbnRlbnQgaGFuZGxlcnM6PC9zdHJvbmc+Iiwgcik7Ci0gICAgICAgICAgICAgICAgaGFuZCA9IG1vZHAtPmhhbmRsZXJzOwotICAgICAgICAgICAgICAgIGlmIChoYW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChoYW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZC0+Y29udGVudF90eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnByaW50ZihyLCAiIDx0dD4lczwvdHQ+XG4iLCBoYW5kLT5jb250ZW50X3R5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZCAmJiBoYW5kLT5jb250ZW50X3R5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiLCIsIHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPHR0PiA8RU0+bm9uZTwvRU0+PC90dD4iLCByKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXBfcnB1dHMoIjxkdD48c3Ryb25nPkNvbmZpZ3VyYXRpb24gUGhhc2UgUGFydGljaXBhdGlvbjo8L3N0cm9uZz4gXG4iLAotICAgICAgICAgICAgICAgICAgICAgIHIpOwotICAgICAgICAgICAgICAgIGlmIChtb2RwLT5jaGlsZF9pbml0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8dHQ+Q2hpbGQgSW5pdDwvdHQ+Iiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1vZHAtPmNyZWF0ZV9kaXJfY29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21tYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIiwgIiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIjx0dD5DcmVhdGUgRGlyZWN0b3J5IENvbmZpZzwvdHQ+Iiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1vZHAtPm1lcmdlX2Rpcl9jb25maWcpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiLCAiLCByKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPHR0Pk1lcmdlIERpcmVjdG9yeSBDb25maWdzPC90dD4iLCByKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWEgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobW9kcC0+Y3JlYXRlX3NlcnZlcl9jb25maWcpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiLCAiLCByKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPHR0PkNyZWF0ZSBTZXJ2ZXIgQ29uZmlnPC90dD4iLCByKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWEgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobW9kcC0+bWVyZ2Vfc2VydmVyX2NvbmZpZykgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCIsICIsIHIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8dHQ+TWVyZ2UgU2VydmVyIENvbmZpZ3M8L3R0PiIsIHIpOwotICAgICAgICAgICAgICAgICAgICBjb21tYSA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtb2RwLT5jaGlsZF9leGl0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21tYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIiwgIiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIjx0dD5DaGlsZCBFeGl0PC90dD4iLCByKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWEgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWNvbW1hKQotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPHR0PiA8RU0+bm9uZTwvRU0+PC90dD4iLCByKTsKLSAgICAgICAgICAgICAgICBjb21tYSA9IDA7Ci0gICAgICAgICAgICAgICAgYXBfcnB1dHMoIjxkdD48c3Ryb25nPlJlcXVlc3QgUGhhc2UgUGFydGljaXBhdGlvbjo8L3N0cm9uZz4gXG4iLAotICAgICAgICAgICAgICAgICAgICAgIHIpOwotICAgICAgICAgICAgICAgIGlmIChtb2RwLT5wb3N0X3JlYWRfcmVxdWVzdCkgewotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPHR0PlBvc3QtUmVhZCBSZXF1ZXN0PC90dD4iLCByKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWEgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobW9kcC0+aGVhZGVyX3BhcnNlcikgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCIsICIsIHIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8dHQ+SGVhZGVyIFBhcnNlPC90dD4iLCByKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWEgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobW9kcC0+dHJhbnNsYXRlX2hhbmRsZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiLCAiLCByKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPHR0PlRyYW5zbGF0ZSBQYXRoPC90dD4iLCByKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWEgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobW9kcC0+YWNjZXNzX2NoZWNrZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiLCAiLCByKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPHR0PkNoZWNrIEFjY2VzczwvdHQ+Iiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1vZHAtPmFwX2NoZWNrX3VzZXJfaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiLCAiLCByKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPHR0PlZlcmlmeSBVc2VyIElEPC90dD4iLCByKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWEgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobW9kcC0+YXV0aF9jaGVja2VyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21tYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIiwgIiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIjx0dD5WZXJpZnkgVXNlciBBY2Nlc3M8L3R0PiIsIHIpOwotICAgICAgICAgICAgICAgICAgICBjb21tYSA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtb2RwLT50eXBlX2NoZWNrZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiLCAiLCByKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPHR0PkNoZWNrIFR5cGU8L3R0PiIsIHIpOwotICAgICAgICAgICAgICAgICAgICBjb21tYSA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtb2RwLT5maXhlcl91cHBlcikgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCIsICIsIHIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8dHQ+Rml4dXBzPC90dD4iLCByKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWEgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobW9kcC0+bG9nZ2VyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21tYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIiwgIiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIjx0dD5Mb2dnaW5nPC90dD4iLCByKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWEgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWNvbW1hKQotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPHR0PiA8RU0+bm9uZTwvRU0+PC90dD4iLCByKTsKLSAgICAgICAgICAgICAgICBjb21tYSA9IDA7Ci0gICAgICAgICAgICAgICAgYXBfcnB1dHMoIjxkdD48c3Ryb25nPk1vZHVsZSBEaXJlY3RpdmVzOjwvc3Ryb25nPiAiLCByKTsKLSAgICAgICAgICAgICAgICBjbWQgPSBtb2RwLT5jbWRzOwotICAgICAgICAgICAgICAgIGlmIChjbWQpIHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNtZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNtZC0+bmFtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwcmludGYociwgIjxkZD48dHQ+JXMgLSA8aT4iLAotCQkJCSAgICBtb2RfaW5mb19odG1sX2NtZF9zdHJpbmcoY21kLT5uYW1lLAotCQkJCQlidWYsIHNpemVvZihidWYpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNtZC0+ZXJybXNnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKGNtZC0+ZXJybXNnLCByKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIjwvaT48L3R0PlxuIiwgcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNtZCsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8ZHQ+PHN0cm9uZz5DdXJyZW50IENvbmZpZ3VyYXRpb246PC9zdHJvbmc+XG4iLCByKTsKLSAgICAgICAgICAgICAgICAgICAgbW9kX2luZm9fbW9kdWxlX2NtZHMociwgbW9kX2luZm9fY2ZnX2h0dHBkLCBtb2RwLT5jbWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cGQuY29uZiIpOwotICAgICAgICAgICAgICAgICAgICBtb2RfaW5mb19tb2R1bGVfY21kcyhyLCBtb2RfaW5mb19jZmdfc3JtLCBtb2RwLT5jbWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3JtLmNvbmYiKTsKLSAgICAgICAgICAgICAgICAgICAgbW9kX2luZm9fbW9kdWxlX2NtZHMociwgbW9kX2luZm9fY2ZnX2FjY2VzcywgbW9kcC0+Y21kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjY2Vzcy5jb25mIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPHR0PiBub25lPC90dD5cbiIsIHIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtb3JlX2luZm8gPSBmaW5kX21vcmVfaW5mbyhzZXJ2LCBtb2RwLT5uYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAobW9yZV9pbmZvKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8ZHQ+PHN0cm9uZz5BZGRpdGlvbmFsIEluZm9ybWF0aW9uOjwvc3Ryb25nPlxuPGRkPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHIpOwotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cyhtb3JlX2luZm8sIHIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhcF9ycHV0cygiPGR0Pjxocj5cbiIsIHIpOwotICAgICAgICAgICAgICAgIGlmIChyLT5hcmdzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIW1vZHAgJiYgci0+YXJncyAmJiBzdHJjYXNlY21wKHItPmFyZ3MsICJzZXJ2ZXIiKSkgewotICAgICAgICAgICAgYXBfcnB1dHMoIjxiPk5vIHN1Y2ggbW9kdWxlPC9iPlxuIiwgcik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZvciAobW9kcCA9IHRvcF9tb2R1bGU7IG1vZHA7IG1vZHAgPSBtb2RwLT5uZXh0KSB7Ci0gICAgICAgICAgICBhcF9ycHV0cyhtb2RwLT5uYW1lLCByKTsKLSAgICAgICAgICAgIGlmIChtb2RwLT5uZXh0KSB7Ci0gICAgICAgICAgICAgICAgYXBfcnB1dHMoIjxicj4iLCByKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBhcF9ycHV0cygiPC9kbD5cbiIsIHIpOwotICAgIGFwX3JwdXRzKGFwX3BzaWduYXR1cmUoIiIsciksIHIpOwotICAgIGFwX3JwdXRzKCI8L2JvZHk+PC9odG1sPlxuIiwgcik7Ci0gICAgLyogRG9uZSwgdHVybiBvZmYgdGltZW91dCwgY2xvc2UgZmlsZSBhbmQgcmV0dXJuICovCi0gICAgYXBfa2lsbF90aW1lb3V0KHIpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqYWRkX21vZHVsZV9pbmZvKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqaW5mbykKLXsKLSAgICBzZXJ2ZXJfcmVjICpzID0gY21kLT5zZXJ2ZXI7Ci0gICAgaW5mb19zdnJfY29uZiAqY29uZiA9IChpbmZvX3N2cl9jb25mICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvX21vZHVsZSk7Ci0gICAgaW5mb19lbnRyeSAqbmV3ID0gYXBfcHVzaF9hcnJheShjb25mLT5tb3JlX2luZm8pOwotCi0gICAgbmV3LT5uYW1lID0gbmFtZTsKLSAgICBuZXctPmluZm8gPSBpbmZvOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgaW5mb19jbWRzW10gPQotewotICAgIHsiQWRkTW9kdWxlSW5mbyIsIGFkZF9tb2R1bGVfaW5mbywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMiwKLSAgICAgImEgbW9kdWxlIG5hbWUgYW5kIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gdGhhdCBtb2R1bGUifSwKLSAgICB7TlVMTH0KLX07Ci0KLXN0YXRpYyBjb25zdCBoYW5kbGVyX3JlYyBpbmZvX2hhbmRsZXJzW10gPQotewotICAgIHsic2VydmVyLWluZm8iLCBkaXNwbGF5X2luZm99LAotICAgIHtOVUxMfQotfTsKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGluZm9fbW9kdWxlID0KLXsKLSAgICBTVEFOREFSRF9NT0RVTEVfU1RVRkYsCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemVyICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpciBjb25maWcgY3JlYXRlciAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXIgbWVyZ2VyIC0tLSBkZWZhdWx0IGlzIHRvIG92ZXJyaWRlICovCi0gICAgY3JlYXRlX2luZm9fY29uZmlnLCAgICAgICAgIC8qIHNlcnZlciBjb25maWcgKi8KLSAgICBtZXJnZV9pbmZvX2NvbmZpZywgICAgICAgICAgLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLwotICAgIGluZm9fY21kcywgICAgICAgICAgICAgICAgICAvKiBjb21tYW5kIHRhYmxlICovCi0gICAgaW5mb19oYW5kbGVycywgICAgICAgICAgICAgIC8qIGhhbmRsZXJzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGVuYW1lIHRyYW5zbGF0aW9uICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrX3VzZXJfaWQgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgYXV0aCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBhY2Nlc3MgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHlwZV9jaGVja2VyICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpeHVwcyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2dnZXIgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaGVhZGVyIHBhcnNlciAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGlsZF9pbml0ICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoaWxkX2V4aXQgKi8KLSAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdCByZWFkLXJlcXVlc3QgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2luZm8uZHNwIGIvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9pbmZvLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y4NTY0Ni4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2luZm8uZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iQXBhY2hlTW9kdWxlSW5mbyIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNS4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyCi0KLUNGRz1BcGFjaGVNb2R1bGVJbmZvIC0gV2luMzIgUmVsZWFzZQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJBcGFjaGVNb2R1bGVJbmZvLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiQXBhY2hlTW9kdWxlSW5mby5tYWsiIENGRz0iQXBhY2hlTW9kdWxlSW5mbyAtIFdpbjMyIFJlbGVhc2UiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAiQXBhY2hlTW9kdWxlSW5mbyAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvblwKLSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgIkFwYWNoZU1vZHVsZUluZm8gLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uXAotICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotTVRMPW1pZGwuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIkFwYWNoZU1vZHVsZUluZm8gLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiLlxSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIi5cQXBhY2hlTW9kdWxlSW5mb1IiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVNb2R1bGVJbmZvUiIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvR1ggL08yIC9JICIuLlwuLlxpbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIlNIQVJFRF9NT0RVTEUiIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIC4uXC4uXENvcmVSXEFwYWNoZUNvcmUubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYWNoaW5lOkkzODYKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFwYWNoZU1vZHVsZUluZm8gLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIi5cRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXERlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIi5cQXBhY2hlTW9kdWxlSW5mb0QiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVNb2R1bGVJbmZvRCIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9JICIuLlwuLlxpbmNsdWRlIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIlNIQVJFRF9NT0RVTEUiIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiAuLlwuLlxDb3JlRFxBcGFjaGVDb3JlLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NgotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAiQXBhY2hlTW9kdWxlSW5mbyAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgIkFwYWNoZU1vZHVsZUluZm8gLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2hwajtiYXQ7Zm9yO2Y5MCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXG1vZHVsZXNcc3RhbmRhcmRcbW9kX2luZm8uYwotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubDtmaTtmZCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5ccmVhZGRpci5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIlJlc291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtjbnQ7cnRmO2dpZjtqcGc7anBlZztqcGUiCi0jIEVuZCBHcm91cAotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2luZm8uZXhwIGIvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9pbmZvLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMwNGZhNy4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2luZm8uZXhwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5mb19tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2Rfc3RhdHVzLmMgYi9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX3N0YXR1cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGZjMDg3Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2Rfc3RhdHVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NzMgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKiBTdGF0dXMgTW9kdWxlLiAgRGlzcGxheSBsb3RzIG9mIGludGVybmFsIGRhdGEgYWJvdXQgaG93IEFwYWNoZSBpcwotICogcGVyZm9ybWluZyBhbmQgdGhlIHN0YXRlIG9mIGFsbCBjaGlsZHJlbiBwcm9jZXNzZXMuCi0gKgotICogVG8gZW5hYmxlIHRoaXMsIGFkZCB0aGUgZm9sbG93aW5nIGxpbmVzIGludG8gYW55IGNvbmZpZyBmaWxlOgotICoKLSAqIDxMb2NhdGlvbiAvc2VydmVyLXN0YXR1cz4KLSAqIFNldEhhbmRsZXIgc2VydmVyLXN0YXR1cwotICogPC9Mb2NhdGlvbj4KLSAqCi0gKiBZb3UgbWF5IHdhbnQgdG8gcHJvdGVjdCB0aGlzIGxvY2F0aW9uIGJ5IHBhc3N3b3JkIG9yIGRvbWFpbiBzbyBubyBvbmUKLSAqIGVsc2UgY2FuIGxvb2sgYXQgaXQuICBUaGVuIHlvdSBjYW4gYWNjZXNzIHRoZSBzdGF0aXN0aWNzIHdpdGggYSBVUkwgbGlrZToKLSAqCi0gKiBodHRwOi8veW91cl9zZXJ2ZXJfbmFtZS9zZXJ2ZXItc3RhdHVzCi0gKgotICogL3NlcnZlci1zdGF0dXMgLSBSZXR1cm5zIHBhZ2UgdXNpbmcgdGFibGVzCi0gKiAvc2VydmVyLXN0YXR1cz9ub3RhYmxlIC0gUmV0dXJucyBwYWdlIGZvciBicm93c2VycyB3aXRob3V0IHRhYmxlIHN1cHBvcnQKLSAqIC9zZXJ2ZXItc3RhdHVzP3JlZnJlc2ggLSBSZXR1cm5zIHBhZ2Ugd2l0aCAxIHNlY29uZCByZWZyZXNoCi0gKiAvc2VydmVyLXN0YXR1cz9yZWZyZXNoPTYgLSBSZXR1cm5zIHBhZ2Ugd2l0aCByZWZyZXNoIGV2ZXJ5IDYgc2Vjb25kcwotICogL3NlcnZlci1zdGF0dXM/YXV0byAtIFJldHVybnMgcGFnZSB3aXRoIGRhdGEgZm9yIGF1dG9tYXRpYyBwYXJzaW5nCi0gKgotICogTWFyayBDb3gsIG1hcmtAdWt3ZWIuY29tLCBOb3ZlbWJlciAxOTk1Ci0gKgotICogMTIuMTEuOTUgSW5pdGlhbCB2ZXJzaW9uIGZvciB3d3cudGVsZXNjb3BlLm9yZwotICogMTMuMy45NiAgVXBkYXRlZCB0byByZW1vdmUgcnByaW50ZidzIFtNYXJrXQotICogMTguMy45NiAgQWRkZWQgQ1BVIHVzYWdlLCBwcm9jZXNzIGluZm9ybWF0aW9uLCBhbmQgdGlkaWVkIFtCZW4gTGF1cmllXQotICogMTguMy45NiAgTWFrZSBleHRyYSBTY29yZWJvYXJkIHZhcmlhYmxlcyAjZGVmaW5hYmxlCi0gKiAyNS4zLjk2ICBNYWtlIHNob3J0IHJlcG9ydCBoYXZlIGZ1bGwgcHJlY2lzaW9uIFtCZW4gTGF1cmllIHN1Z2dlc3RlZF0KLSAqIDI1LjMuOTYgIFNob3cgdXB0aW1lIGJldHRlciBbTWFyay9CZW4gTGF1cmllXQotICogMjkuMy45NiAgQmV0dGVyIEhUTUwgYW5kIGV4cGxhbmF0aW9uIFtNYXJrL1JvYiBIYXJ0aWxsIHN1Z2dlc3RlZF0KLSAqIDA5LjQuOTYgIEFkZGVkIG1lc3NhZ2UgZm9yIG5vbi1TVEFUVVMgY29tcGlsZWQgdmVyc2lvbgotICogMTguNC45NiAgQWRkZWQgcGVyIGNoaWxkIGFuZCBwZXIgc2xvdCBjb3VudGVycyBbSmltIEphZ2llbHNraV0KLSAqIDAxLjUuOTYgIFRhYmxlIGZvcm1hdCwgY2xlYW51cCwgZXZlbiBtb3JlIHNwaWZmeSBkYXRhIFtDaHVjayBNdXJja28vSmltIEouXQotICogMTguNS45NiAgQWRhcHRlZCB0byB1c2UgbmV3IHJwcmludGYoKSByb3V0aW5lLCBpbmNpZGVudGFsbHkgZml4aW5nIGEgbWlzc2luZwotICogICAgICAgICAgcGllY2UgaW4gc2hvcnQgcmVwb3J0cyBbQmVuIExhdXJpZV0KLSAqIDIxLjUuOTYgIEFkZGl0aW9uYWwgU3RhdHVzIGNvZGVzIChETlMgYW5kIExPR0dJTkcgb25seSBlbmFibGVkIGlmCi0gKiAgICAgICAgICBleHRlbmRlZCBTVEFUVVMgaXMgZW5hYmxlZCkgW0dlb3JnZSBCdXJneWFuL0ppbSBKLl0KLSAqIDEwLjguOTggIEFsbG93IGZvciBleHRlbmRlZCBzdGF0dXMgaW5mbyBhdCBydW50aW1lIChubyBtb3JlIFNUQVRVUykKLSAqICAgICAgICAgIFtKaW0gSi5dCi0gKi8KLQotI2RlZmluZSBDT1JFX1BSSVZBVEUKLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAiaHR0cF9wcm90b2NvbC5oIgotI2luY2x1ZGUgImh0dHBfY29uZl9nbG9iYWxzLmgiCS8qIGZvciBhcF9leHRlbmRlZF9zdGF0dXMgKi8KLSNpbmNsdWRlICJodHRwX21haW4uaCIKLSNpbmNsdWRlICJ1dGlsX3NjcmlwdC5oIgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlICJzY29yZWJvYXJkLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLQotI2lmZGVmIE5FWFQKLSNpZiAoTlhfQ1VSUkVOVF9DT01QSUxFUl9SRUxFQVNFID09IDQxMCkKLSNpZmRlZiBtNjhrCi0jZGVmaW5lIEhaIDY0Ci0jZWxzZQotI2RlZmluZSBIWiAxMDAKLSNlbmRpZgotI2Vsc2UKLSNpbmNsdWRlIDxtYWNoaW5lL3BhcmFtLmg+Ci0jZW5kaWYKLSNlbmRpZiAvKiBORVhUICovCi0KLSNkZWZpbmUgU1RBVFVTX01BWExJTkUJCTY0Ci0KLSNkZWZpbmUgS0JZVEUJCQkxMDI0Ci0jZGVmaW5lCU1CWVRFCQkJMTA0ODU3NkwKLSNkZWZpbmUJR0JZVEUJCQkxMDczNzQxODI0TAotCi0jaWZuZGVmIERFRkFVTFRfVElNRV9GT1JNQVQgCi0jZGVmaW5lIERFRkFVTFRfVElNRV9GT1JNQVQgIiVBLCAlZC0lYi0lWSAlSDolTTolUyAlWiIKLSNlbmRpZgotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgc3RhdHVzX21vZHVsZTsKLQotLyoKLSAqY29tbWFuZC1yZWxhdGVkIGNvZGUuIFRoaXMgaXMgaGVyZSB0byBwcmV2ZW50IHVzZSBvZiBFeHRlbmRlZFN0YXR1cwotICogd2l0aG91dCBzdGF0dXNfbW9kdWxlIGluY2x1ZGVkLgotICovCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2V4dGVuZGVkX3N0YXR1cyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGlmICghc3RyY2FzZWNtcChhcmcsICJvZmYiKSB8fCAhc3RyY21wKGFyZywgIjAiKSkgewotCWFwX2V4dGVuZGVkX3N0YXR1cyA9IDA7Ci0gICAgfQotICAgIGVsc2UgewotCWFwX2V4dGVuZGVkX3N0YXR1cyA9IDE7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgc3RhdHVzX21vZHVsZV9jbWRzW10gPQotewotICAgIHsgIkV4dGVuZGVkU3RhdHVzIiwgc2V0X2V4dGVuZGVkX3N0YXR1cywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAgICJcIk9uXCIgdG8gZW5hYmxlIGV4dGVuZGVkIHN0YXR1cyBpbmZvcm1hdGlvbiwgXCJPZmZcIiB0byBkaXNhYmxlIiB9LAotICAgIHtOVUxMfQotfTsKLQotLyogRm9ybWF0IHRoZSBudW1iZXIgb2YgYnl0ZXMgbmljZWx5ICovCi1zdGF0aWMgdm9pZCBmb3JtYXRfYnl0ZV9vdXQocmVxdWVzdF9yZWMgKnIsIHVuc2lnbmVkIGxvbmcgYnl0ZXMpCi17Ci0gICAgaWYgKGJ5dGVzIDwgKDUgKiBLQllURSkpCi0JYXBfcnByaW50ZihyLCAiJWQgQiIsIChpbnQpIGJ5dGVzKTsKLSAgICBlbHNlIGlmIChieXRlcyA8IChNQllURSAvIDIpKQotCWFwX3JwcmludGYociwgIiUuMWYga0IiLCAoZmxvYXQpIGJ5dGVzIC8gS0JZVEUpOwotICAgIGVsc2UgaWYgKGJ5dGVzIDwgKEdCWVRFIC8gMikpCi0JYXBfcnByaW50ZihyLCAiJS4xZiBNQiIsIChmbG9hdCkgYnl0ZXMgLyBNQllURSk7Ci0gICAgZWxzZQotCWFwX3JwcmludGYociwgIiUuMWYgR0IiLCAoZmxvYXQpIGJ5dGVzIC8gR0JZVEUpOwotfQotCi1zdGF0aWMgdm9pZCBmb3JtYXRfa2J5dGVfb3V0KHJlcXVlc3RfcmVjICpyLCB1bnNpZ25lZCBsb25nIGtieXRlcykKLXsKLSAgICBpZiAoa2J5dGVzIDwgS0JZVEUpCi0JYXBfcnByaW50ZihyLCAiJWQga0IiLCAoaW50KSBrYnl0ZXMpOwotICAgIGVsc2UgaWYgKGtieXRlcyA8IE1CWVRFKQotCWFwX3JwcmludGYociwgIiUuMWYgTUIiLCAoZmxvYXQpIGtieXRlcyAvIEtCWVRFKTsKLSAgICBlbHNlCi0JYXBfcnByaW50ZihyLCAiJS4xZiBHQiIsIChmbG9hdCkga2J5dGVzIC8gTUJZVEUpOwotfQotCi1zdGF0aWMgdm9pZCBzaG93X3RpbWUocmVxdWVzdF9yZWMgKnIsIHRpbWVfdCB0c2VjcykKLXsKLSAgICBsb25nIGRheXMsIGhycywgbWlucywgc2VjczsKLQotICAgIHNlY3MgPSB0c2VjcyAlIDYwOwotICAgIHRzZWNzIC89IDYwOwotICAgIG1pbnMgPSB0c2VjcyAlIDYwOwotICAgIHRzZWNzIC89IDYwOwotICAgIGhycyA9IHRzZWNzICUgMjQ7Ci0gICAgZGF5cyA9IHRzZWNzIC8gMjQ7Ci0gICAgaWYgKGRheXMpCi0JYXBfcnByaW50ZihyLCAiICVsZCBkYXklcyIsIGRheXMsIGRheXMgPT0gMSA/ICIiIDogInMiKTsKLSAgICBpZiAoaHJzKQotCWFwX3JwcmludGYociwgIiAlbGQgaG91ciVzIiwgaHJzLCBocnMgPT0gMSA/ICIiIDogInMiKTsKLSAgICBpZiAobWlucykKLQlhcF9ycHJpbnRmKHIsICIgJWxkIG1pbnV0ZSVzIiwgbWlucywgbWlucyA9PSAxID8gIiIgOiAicyIpOwotICAgIGlmIChzZWNzKQotCWFwX3JwcmludGYociwgIiAlbGQgc2Vjb25kJXMiLCBzZWNzLCBzZWNzID09IDEgPyAiIiA6ICJzIik7Ci19Ci0KLS8qIE1haW4gaGFuZGxlciBmb3IgeC1odHRwZC1zdGF0dXMgcmVxdWVzdHMgKi8KLQotLyogSUQgdmFsdWVzIGZvciBjb21tYW5kIHRhYmxlICovCi0KLSNkZWZpbmUgU1RBVF9PUFRfRU5ECQktMQotI2RlZmluZSBTVEFUX09QVF9SRUZSRVNICTAKLSNkZWZpbmUgU1RBVF9PUFRfTk9UQUJMRQkxCi0jZGVmaW5lIFNUQVRfT1BUX0FVVE8JCTIKLQotc3RydWN0IHN0YXRfb3B0IHsKLSAgICBpbnQgaWQ7Ci0gICAgY29uc3QgY2hhciAqZm9ybV9kYXRhX3N0cjsKLSAgICBjb25zdCBjaGFyICpoZHJfb3V0X3N0cjsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RhdF9vcHQgc3RhdHVzX29wdGlvbnNbXSA9CS8qIHNlZSAjZGVmaW5lcyBhYm92ZSAqLwotewotICAgIHtTVEFUX09QVF9SRUZSRVNILCAicmVmcmVzaCIsICJSZWZyZXNoIn0sCi0gICAge1NUQVRfT1BUX05PVEFCTEUsICJub3RhYmxlIiwgTlVMTH0sCi0gICAge1NUQVRfT1BUX0FVVE8sICJhdXRvIiwgTlVMTH0sCi0gICAge1NUQVRfT1BUX0VORCwgTlVMTCwgTlVMTH0KLX07Ci0KLXN0YXRpYyBjaGFyIHN0YXR1c19mbGFnc1tTRVJWRVJfTlVNX1NUQVRVU107Ci0KLXN0YXRpYyBpbnQgc3RhdHVzX2hhbmRsZXIocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY2hhciAqbG9jOwotICAgIHRpbWVfdCBub3d0aW1lID0gdGltZShOVUxMKTsKLSAgICB0aW1lX3QgdXBfdGltZTsKLSAgICBpbnQgaSwgcmVzOwotICAgIGludCByZWFkeSA9IDA7Ci0gICAgaW50IGJ1c3kgPSAwOwotICAgIHVuc2lnbmVkIGxvbmcgY291bnQgPSAwOwotICAgIHVuc2lnbmVkIGxvbmcgbHJlcywgYnl0ZXM7Ci0gICAgdW5zaWduZWQgbG9uZyBteV9scmVzLCBteV9ieXRlcywgY29ubl9ieXRlczsKLSAgICB1bnNpZ25lZCBzaG9ydCBjb25uX2xyZXM7Ci0gICAgdW5zaWduZWQgbG9uZyBiY291bnQgPSAwOwotICAgIHVuc2lnbmVkIGxvbmcga2Jjb3VudCA9IDA7Ci0gICAgbG9uZyByZXFfdGltZTsKLSNpZm5kZWYgTk9fVElNRVMKLSNpZmRlZiBfU0NfQ0xLX1RDSwotICAgIGZsb2F0IHRpY2sgPSBzeXNjb25mKF9TQ19DTEtfVENLKTsKLSNlbHNlCi0gICAgZmxvYXQgdGljayA9IEhaOwotI2VuZGlmCi0jZW5kaWYKLSAgICBpbnQgc2hvcnRfcmVwb3J0ID0gMDsKLSAgICBpbnQgbm9fdGFibGVfcmVwb3J0ID0gMDsKLSAgICBzaG9ydF9zY29yZSBzY29yZV9yZWNvcmQ7Ci0gICAgcGFyZW50X3Njb3JlIHBzX3JlY29yZDsKLSAgICBjaGFyIHN0YXRfYnVmZmVyW0hBUkRfU0VSVkVSX0xJTUlUXTsKLSAgICBpbnQgcGlkX2J1ZmZlcltIQVJEX1NFUlZFUl9MSU1JVF07Ci0gICAgY2xvY2tfdCB0dSwgdHMsIHRjdSwgdGNzOwotICAgIHNlcnZlcl9yZWMgKnZob3N0OwotCi0gICAgdHUgPSB0cyA9IHRjdSA9IHRjcyA9IDA7Ci0KLSAgICBpZiAoIWFwX2V4aXN0c19zY29yZWJvYXJkX2ltYWdlKCkpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotCQkgICAgIlNlcnZlciBzdGF0dXMgdW5hdmFpbGFibGUgaW4gaW5ldGQgbW9kZSIpOwotCXJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICB9Ci0gICAgci0+YWxsb3dlZCA9ICgxIDw8IE1fR0VUKTsKLSAgICBpZiAoci0+bWV0aG9kX251bWJlciAhPSBNX0dFVCkKLQlyZXR1cm4gREVDTElORUQ7Ci0KLSAgICByLT5jb250ZW50X3R5cGUgPSAidGV4dC9odG1sIjsKLQotICAgIC8qCi0gICAgICogU2ltcGxlIHRhYmxlLWRyaXZlbiBmb3JtIGRhdGEgc2V0IHBhcnNlciB0aGF0IGxldHMgeW91IGFsdGVyIHRoZSBoZWFkZXIKLSAgICAgKi8KLQotICAgIGlmIChyLT5hcmdzKSB7Ci0JaSA9IDA7Ci0Jd2hpbGUgKHN0YXR1c19vcHRpb25zW2ldLmlkICE9IFNUQVRfT1BUX0VORCkgewotCSAgICBpZiAoKGxvYyA9IHN0cnN0cihyLT5hcmdzLCBzdGF0dXNfb3B0aW9uc1tpXS5mb3JtX2RhdGFfc3RyKSkgIT0gTlVMTCkgewotCQlzd2l0Y2ggKHN0YXR1c19vcHRpb25zW2ldLmlkKSB7Ci0JCWNhc2UgU1RBVF9PUFRfUkVGUkVTSDoKLQkJICAgIGlmICgqKGxvYyArIHN0cmxlbihzdGF0dXNfb3B0aW9uc1tpXS5mb3JtX2RhdGFfc3RyKSkgPT0gJz0nKQotCQkJYXBfdGFibGVfc2V0KHItPmhlYWRlcnNfb3V0LAotCQkJICAgICAgc3RhdHVzX29wdGlvbnNbaV0uaGRyX291dF9zdHIsCi0JCQkgICAgICBsb2MgKyBzdHJsZW4oc3RhdHVzX29wdGlvbnNbaV0uaGRyX291dF9zdHIpICsgMSk7Ci0JCSAgICBlbHNlCi0JCQlhcF90YWJsZV9zZXQoci0+aGVhZGVyc19vdXQsCi0JCQkgICAgICBzdGF0dXNfb3B0aW9uc1tpXS5oZHJfb3V0X3N0ciwgIjEiKTsKLQkJICAgIGJyZWFrOwotCQljYXNlIFNUQVRfT1BUX05PVEFCTEU6Ci0JCSAgICBub190YWJsZV9yZXBvcnQgPSAxOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgU1RBVF9PUFRfQVVUTzoKLQkJICAgIHItPmNvbnRlbnRfdHlwZSA9ICJ0ZXh0L3BsYWluIjsKLQkJICAgIHNob3J0X3JlcG9ydCA9IDE7Ci0JCSAgICBicmVhazsKLQkJfQotCSAgICB9Ci0JICAgIGkrKzsKLQl9Ci0gICAgfQotCi0gICAgYXBfc2VuZF9odHRwX2hlYWRlcihyKTsKLQotICAgIGlmIChyLT5oZWFkZXJfb25seSkKLQlyZXR1cm4gMDsKLQotICAgIGFwX3N5bmNfc2NvcmVib2FyZF9pbWFnZSgpOwotICAgIGZvciAoaSA9IDA7IGkgPCBIQVJEX1NFUlZFUl9MSU1JVDsgKytpKSB7Ci0Jc2NvcmVfcmVjb3JkID0gYXBfc2NvcmVib2FyZF9pbWFnZS0+c2VydmVyc1tpXTsKLQlwc19yZWNvcmQgPSBhcF9zY29yZWJvYXJkX2ltYWdlLT5wYXJlbnRbaV07Ci0JcmVzID0gc2NvcmVfcmVjb3JkLnN0YXR1czsKLQlzdGF0X2J1ZmZlcltpXSA9IHN0YXR1c19mbGFnc1tyZXNdOwotCXBpZF9idWZmZXJbaV0gPSAoaW50KSBwc19yZWNvcmQucGlkOwotCWlmIChyZXMgPT0gU0VSVkVSX1JFQURZKQotCSAgICByZWFkeSsrOwotCWVsc2UgaWYgKHJlcyAhPSBTRVJWRVJfREVBRCkKLQkgICAgYnVzeSsrOwotCWlmIChhcF9leHRlbmRlZF9zdGF0dXMpIHsKLQkgICAgbHJlcyA9IHNjb3JlX3JlY29yZC5hY2Nlc3NfY291bnQ7Ci0JICAgIGJ5dGVzID0gc2NvcmVfcmVjb3JkLmJ5dGVzX3NlcnZlZDsKLQkgICAgaWYgKGxyZXMgIT0gMCB8fCAocmVzICE9IFNFUlZFUl9SRUFEWSAmJiByZXMgIT0gU0VSVkVSX0RFQUQpKSB7Ci0jaWZuZGVmIE5PX1RJTUVTCi0JCXR1ICs9IHNjb3JlX3JlY29yZC50aW1lcy50bXNfdXRpbWU7Ci0JCXRzICs9IHNjb3JlX3JlY29yZC50aW1lcy50bXNfc3RpbWU7Ci0JCXRjdSArPSBzY29yZV9yZWNvcmQudGltZXMudG1zX2N1dGltZTsKLQkJdGNzICs9IHNjb3JlX3JlY29yZC50aW1lcy50bXNfY3N0aW1lOwotI2VuZGlmIC8qIE5PX1RJTUVTICovCi0JCWNvdW50ICs9IGxyZXM7Ci0JCWJjb3VudCArPSBieXRlczsKLQkJaWYgKGJjb3VudCA+PSBLQllURSkgewotCQkgICAga2Jjb3VudCArPSAoYmNvdW50ID4+IDEwKTsKLQkJICAgIGJjb3VudCA9IGJjb3VudCAmIDB4M2ZmOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgdXBfdGltZSA9IG5vd3RpbWUgLSBhcF9yZXN0YXJ0X3RpbWU7Ci0KLSAgICBhcF9oYXJkX3RpbWVvdXQoInNlbmQgc3RhdHVzIGluZm8iLCByKTsKLQotICAgIGlmICghc2hvcnRfcmVwb3J0KSB7Ci0JYXBfcnB1dHMoRE9DVFlQRV9IVE1MXzNfMgotCQkgIjxIVE1MPjxIRUFEPlxuPFRJVExFPkFwYWNoZSBTdGF0dXM8L1RJVExFPlxuPC9IRUFEPjxCT0RZPlxuIiwKLQkJIHIpOwotCWFwX3JwdXRzKCI8SDE+QXBhY2hlIFNlcnZlciBTdGF0dXMgZm9yICIsIHIpOwotCWFwX3J2cHV0cyhyLCBhcF9nZXRfc2VydmVyX25hbWUociksICI8L0gxPlxuXG4iLCBOVUxMKTsKLQlhcF9ydnB1dHMociwgIlNlcnZlciBWZXJzaW9uOiAiLAotCSAgYXBfZ2V0X3NlcnZlcl92ZXJzaW9uKCksICI8YnI+XG4iLCBOVUxMKTsKLQlhcF9ydnB1dHMociwgIlNlcnZlciBCdWlsdDogIiwKLQkgIGFwX2dldF9zZXJ2ZXJfYnVpbHQoKSwgIjxicj5cbjxocj5cbiIsIE5VTEwpOwotCWFwX3J2cHV0cyhyLCAiQ3VycmVudCBUaW1lOiAiLAotCSAgYXBfaHRfdGltZShyLT5wb29sLCBub3d0aW1lLCBERUZBVUxUX1RJTUVfRk9STUFULCAwKSwgIjxicj5cbiIsIE5VTEwpOwotCWFwX3J2cHV0cyhyLCAiUmVzdGFydCBUaW1lOiAiLAotCSAgYXBfaHRfdGltZShyLT5wb29sLCBhcF9yZXN0YXJ0X3RpbWUsIERFRkFVTFRfVElNRV9GT1JNQVQsIDApLCAKLQkgICI8YnI+XG4iLCBOVUxMKTsKLQlhcF9ycHJpbnRmKHIsICJQYXJlbnQgU2VydmVyIEdlbmVyYXRpb246ICVkIDxicj5cbiIsIChpbnQpIGFwX215X2dlbmVyYXRpb24pOwotCWFwX3JwdXRzKCJTZXJ2ZXIgdXB0aW1lOiAiLCByKTsKLQlzaG93X3RpbWUociwgdXBfdGltZSk7Ci0JYXBfcnB1dHMoIjxicj5cbiIsIHIpOwotICAgIH0KLQotICAgIGlmIChhcF9leHRlbmRlZF9zdGF0dXMpIHsKLQlpZiAoc2hvcnRfcmVwb3J0KSB7Ci0JICAgIGFwX3JwcmludGYociwgIlRvdGFsIEFjY2Vzc2VzOiAlbHVcblRvdGFsIGtCeXRlczogJWx1XG4iLAotCQljb3VudCwga2Jjb3VudCk7Ci0KLSNpZm5kZWYgTk9fVElNRVMKLQkgICAgLyogQWxsb3cgZm9yIE9TLzIgbm90IGhhdmluZyBDUFUgc3RhdHMgKi8KLQkgICAgaWYgKHRzIHx8IHR1IHx8IHRjdSB8fCB0Y3MpCi0JCWFwX3JwcmludGYociwgIkNQVUxvYWQ6ICVnXG4iLAotCQkgICAgKHR1ICsgdHMgKyB0Y3UgKyB0Y3MpIC8gdGljayAvIHVwX3RpbWUgKiAxMDAuKTsKLSNlbmRpZgotCi0JICAgIGFwX3JwcmludGYociwgIlVwdGltZTogJWxkXG4iLCAobG9uZykgKHVwX3RpbWUpKTsKLQkgICAgaWYgKHVwX3RpbWUgPiAwKQotCQlhcF9ycHJpbnRmKHIsICJSZXFQZXJTZWM6ICVnXG4iLAotCQkgICAgKGZsb2F0KSBjb3VudCAvIChmbG9hdCkgdXBfdGltZSk7Ci0KLQkgICAgaWYgKHVwX3RpbWUgPiAwKQotCQlhcF9ycHJpbnRmKHIsICJCeXRlc1BlclNlYzogJWdcbiIsCi0JCSAgICBLQllURSAqIChmbG9hdCkga2Jjb3VudCAvIChmbG9hdCkgdXBfdGltZSk7Ci0KLQkgICAgaWYgKGNvdW50ID4gMCkKLQkJYXBfcnByaW50ZihyLCAiQnl0ZXNQZXJSZXE6ICVnXG4iLAotCQkgICAgS0JZVEUgKiAoZmxvYXQpIGtiY291bnQgLyAoZmxvYXQpIGNvdW50KTsKLQl9Ci0JZWxzZSB7CQkJLyogIXNob3J0X3JlcG9ydCAqLwotCSAgICBhcF9ycHJpbnRmKHIsICJUb3RhbCBhY2Nlc3NlczogJWx1IC0gVG90YWwgVHJhZmZpYzogIiwgY291bnQpOwotCSAgICBmb3JtYXRfa2J5dGVfb3V0KHIsIGtiY291bnQpOwotCi0jaWZuZGVmIE5PX1RJTUVTCi0JICAgIC8qIEFsbG93IGZvciBPUy8yIG5vdCBoYXZpbmcgQ1BVIHN0YXRzICovCi0JICAgIGFwX3JwdXRzKCI8YnI+XG4iLCByKTsKLQkgICAgYXBfcnByaW50ZihyLCAiQ1BVIFVzYWdlOiB1JWcgcyVnIGN1JWcgY3MlZyIsCi0JCSAgICB0dSAvIHRpY2ssIHRzIC8gdGljaywgdGN1IC8gdGljaywgdGNzIC8gdGljayk7Ci0KLQkgICAgaWYgKHRzIHx8IHR1IHx8IHRjdSB8fCB0Y3MpCi0JCWFwX3JwcmludGYociwgIiAtICUuM2clJSBDUFUgbG9hZCIsCi0JCSAgICAodHUgKyB0cyArIHRjdSArIHRjcykgLyB0aWNrIC8gdXBfdGltZSAqIDEwMC4pOwotI2VuZGlmCi0KLQkgICAgYXBfcnB1dHMoIjxicj5cbiIsIHIpOwotCi0JICAgIGlmICh1cF90aW1lID4gMCkKLQkJYXBfcnByaW50ZihyLCAiJS4zZyByZXF1ZXN0cy9zZWMgLSAiLAotCQkJKGZsb2F0KSBjb3VudCAvIChmbG9hdCkgdXBfdGltZSk7Ci0KLQkgICAgaWYgKHVwX3RpbWUgPiAwKSB7Ci0JCWZvcm1hdF9ieXRlX291dChyLCBLQllURSAqIChmbG9hdCkga2Jjb3VudCAvIChmbG9hdCkgdXBfdGltZSk7Ci0JCWFwX3JwdXRzKCIvc2Vjb25kIC0gIiwgcik7Ci0JICAgIH0KLQotCSAgICBpZiAoY291bnQgPiAwKSB7Ci0JCWZvcm1hdF9ieXRlX291dChyLCBLQllURSAqIChmbG9hdCkga2Jjb3VudCAvIChmbG9hdCkgY291bnQpOwotCQlhcF9ycHV0cygiL3JlcXVlc3QiLCByKTsKLQkgICAgfQotCi0JICAgIGFwX3JwdXRzKCI8YnI+XG4iLCByKTsKLQl9CQkJCS8qIHNob3J0X3JlcG9ydCAqLwotICAgIH0JCQkJCS8qIGFwX2V4dGVuZGVkX3N0YXR1cyAqLwotCi0gICAgaWYgKCFzaG9ydF9yZXBvcnQpCi0JYXBfcnByaW50ZihyLCAiXG4lZCByZXF1ZXN0cyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLCAlZCBpZGxlIHNlcnZlcnNcbiIKLQkJLGJ1c3ksIHJlYWR5KTsKLSAgICBlbHNlCi0JYXBfcnByaW50ZihyLCAiQnVzeVNlcnZlcnM6ICVkXG5JZGxlU2VydmVyczogJWRcbiIsIGJ1c3ksIHJlYWR5KTsKLQotICAgIC8qIHNlbmQgdGhlIHNjb3JlYm9hcmQgJ3RhYmxlJyBvdXQgKi8KLQotICAgIGlmICghc2hvcnRfcmVwb3J0KQotCWFwX3JwdXRzKCI8UFJFPiIsIHIpOwotICAgIGVsc2UKLQlhcF9ycHV0cygiU2NvcmVib2FyZDogIiwgcik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgSEFSRF9TRVJWRVJfTElNSVQ7ICsraSkgewotCWFwX3JwdXRjKHN0YXRfYnVmZmVyW2ldLCByKTsKLQlpZiAoKGkgJSBTVEFUVVNfTUFYTElORSA9PSAoU1RBVFVTX01BWExJTkUgLSAxKSkgJiYgIXNob3J0X3JlcG9ydCkKLQkgICAgYXBfcnB1dHMoIlxuIiwgcik7Ci0gICAgfQotCi0gICAgaWYgKHNob3J0X3JlcG9ydCkKLQlhcF9ycHV0cygiXG4iLCByKTsKLSAgICBlbHNlIHsKLQlhcF9ycHV0cygiPC9QUkU+XG4iLCByKTsKLQlhcF9ycHV0cygiU2NvcmVib2FyZCBLZXk6IDxicj5cbiIsIHIpOwotCWFwX3JwdXRzKCJcIjxCPjxjb2RlPl88L2NvZGU+PC9CPlwiIFdhaXRpbmcgZm9yIENvbm5lY3Rpb24sIFxuIiwgcik7Ci0JYXBfcnB1dHMoIlwiPEI+PGNvZGU+UzwvY29kZT48L0I+XCIgU3RhcnRpbmcgdXAsIFxuIiwgcik7Ci0JYXBfcnB1dHMoIlwiPEI+PGNvZGU+UjwvY29kZT48L0I+XCIgUmVhZGluZyBSZXF1ZXN0LDxCUj5cbiIsIHIpOwotCWFwX3JwdXRzKCJcIjxCPjxjb2RlPlc8L2NvZGU+PC9CPlwiIFNlbmRpbmcgUmVwbHksIFxuIiwgcik7Ci0JYXBfcnB1dHMoIlwiPEI+PGNvZGU+SzwvY29kZT48L0I+XCIgS2VlcGFsaXZlIChyZWFkKSwgXG4iLCByKTsKLQlhcF9ycHV0cygiXCI8Qj48Y29kZT5EPC9jb2RlPjwvQj5cIiBETlMgTG9va3VwLDxCUj5cbiIsIHIpOwotCWFwX3JwdXRzKCJcIjxCPjxjb2RlPkw8L2NvZGU+PC9CPlwiIExvZ2dpbmcsIFxuIiwgcik7Ci0JYXBfcnB1dHMoIlwiPEI+PGNvZGU+RzwvY29kZT48L0I+XCIgR3JhY2VmdWxseSBmaW5pc2hpbmcsIFxuIiwgcik7Ci0JYXBfcnB1dHMoIlwiPEI+PGNvZGU+LjwvY29kZT48L0I+XCIgT3BlbiBzbG90IHdpdGggbm8gY3VycmVudCBwcm9jZXNzPFA+XG4iLCByKTsKLQlhcF9ycHV0cygiPFA+XG4iLCByKTsKLQlpZiAoIWFwX2V4dGVuZGVkX3N0YXR1cykgewotCSAgICBpbnQgaiA9IDA7Ci0JICAgIGFwX3JwdXRzKCJQSUQgS2V5OiA8YnI+XG4iLCByKTsKLQkgICAgYXBfcnB1dHMoIjxQUkU+XG4iLCByKTsKLQkgICAgZm9yIChpID0gMDsgaSA8IEhBUkRfU0VSVkVSX0xJTUlUOyArK2kpIHsKLQkJaWYgKHN0YXRfYnVmZmVyW2ldICE9ICcuJykgewotCQkgICAgYXBfcnByaW50ZihyLCAiICAgJWQgaW4gc3RhdGU6ICVjICIsIHBpZF9idWZmZXJbaV0sCi0JCSAgICAgc3RhdF9idWZmZXJbaV0pOwotCQkgICAgaWYgKCsraiA+PSAzKSB7Ci0JCSAgICAJYXBfcnB1dHMoIlxuIiwgcik7Ci0JCQlqID0gMDsKLQkJICAgIH0gZWxzZQotCQkgICAgCWFwX3JwdXRzKCIsIiwgcik7Ci0JCX0KLQkgICAgfQotCSAgICBhcF9ycHV0cygiXG4iLCByKTsKLQkgICAgYXBfcnB1dHMoIjwvUFJFPlxuIiwgcik7Ci0JfQotICAgIH0KLQotICAgIGlmIChhcF9leHRlbmRlZF9zdGF0dXMpIHsKLQlpZiAoIXNob3J0X3JlcG9ydCkgewotCSAgICBpZiAobm9fdGFibGVfcmVwb3J0KQotCQlhcF9ycHV0cygiPHA+PGhyPjxoMj5TZXJ2ZXIgRGV0YWlsczwvaDI+XG5cbiIsIHIpOwotCSAgICBlbHNlCi0jaWZkZWYgTk9fVElNRVMKLQkJLyogQWxsb3cgZm9yIE9TLzIgbm90IGhhdmluZyBDUFUgc3RhdHMgKi8KLQkJYXBfcnB1dHMoIjxwPlxuXG48dGFibGUgYm9yZGVyPTA+PHRyPjx0aD5TcnY8dGg+UElEPHRoPkFjYzx0aD5NXG48dGg+U1M8dGg+UmVxPHRoPkNvbm48dGg+Q2hpbGQ8dGg+U2xvdDx0aD5DbGllbnQ8dGg+Vkhvc3Q8dGg+UmVxdWVzdDwvdHI+XG5cbiIsIHIpOwotI2Vsc2UKLQkJYXBfcnB1dHMoIjxwPlxuXG48dGFibGUgYm9yZGVyPTA+PHRyPjx0aD5TcnY8dGg+UElEPHRoPkFjYzx0aD5NPHRoPkNQVVxuPHRoPlNTPHRoPlJlcTx0aD5Db25uPHRoPkNoaWxkPHRoPlNsb3Q8dGg+Q2xpZW50PHRoPlZIb3N0PHRoPlJlcXVlc3Q8L3RyPlxuXG4iLCByKTsKLSNlbmRpZgotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBIQVJEX1NFUlZFUl9MSU1JVDsgKytpKSB7Ci0JICAgIHNjb3JlX3JlY29yZCA9IGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbaV07Ci0JICAgIHBzX3JlY29yZCA9IGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtpXTsKLQkgICAgdmhvc3QgPSBzY29yZV9yZWNvcmQudmhvc3RyZWM7Ci0JICAgIGlmIChwc19yZWNvcmQuZ2VuZXJhdGlvbiAhPSBhcF9teV9nZW5lcmF0aW9uKSB7Ci0JCXZob3N0ID0gTlVMTDsKLQkgICAgfQotCi0jaWYgZGVmaW5lZChOT19HRVRUSU1FT0ZEQVkpCi0jaWZuZGVmIE5PX1RJTUVTCi0JICAgIGlmIChzY29yZV9yZWNvcmQuc3RhcnRfdGltZSA9PSAoY2xvY2tfdCkgMCkKLSNlbmRpZiAvKiBOT19USU1FUyAqLwotCQlyZXFfdGltZSA9IDBMOwotI2lmbmRlZiBOT19USU1FUwotCSAgICBlbHNlIHsKLQkJcmVxX3RpbWUgPSBzY29yZV9yZWNvcmQuc3RvcF90aW1lIC0gc2NvcmVfcmVjb3JkLnN0YXJ0X3RpbWU7Ci0JCXJlcV90aW1lID0gKHJlcV90aW1lICogMTAwMCkgLyAoaW50KSB0aWNrOwotCSAgICB9Ci0jZW5kaWYgLyogTk9fVElNRVMgKi8KLSNlbHNlCi0JICAgIGlmIChzY29yZV9yZWNvcmQuc3RhcnRfdGltZS50dl9zZWMgPT0gMEwgJiYKLQkJc2NvcmVfcmVjb3JkLnN0YXJ0X3RpbWUudHZfdXNlYyA9PSAwTCkKLQkJcmVxX3RpbWUgPSAwTDsKLQkgICAgZWxzZQotCQlyZXFfdGltZSA9Ci0JCSAgICAoKHNjb3JlX3JlY29yZC5zdG9wX3RpbWUudHZfc2VjIC0gc2NvcmVfcmVjb3JkLnN0YXJ0X3RpbWUudHZfc2VjKSAqIDEwMDApICsKLQkJICAgICgoc2NvcmVfcmVjb3JkLnN0b3BfdGltZS50dl91c2VjIC0gc2NvcmVfcmVjb3JkLnN0YXJ0X3RpbWUudHZfdXNlYykgLyAxMDAwKTsKLSNlbmRpZgotCSAgICBpZiAocmVxX3RpbWUgPCAwTCkKLQkJcmVxX3RpbWUgPSAwTDsKLQotCSAgICBscmVzID0gc2NvcmVfcmVjb3JkLmFjY2Vzc19jb3VudDsKLQkgICAgbXlfbHJlcyA9IHNjb3JlX3JlY29yZC5teV9hY2Nlc3NfY291bnQ7Ci0JICAgIGNvbm5fbHJlcyA9IHNjb3JlX3JlY29yZC5jb25uX2NvdW50OwotCSAgICBieXRlcyA9IHNjb3JlX3JlY29yZC5ieXRlc19zZXJ2ZWQ7Ci0JICAgIG15X2J5dGVzID0gc2NvcmVfcmVjb3JkLm15X2J5dGVzX3NlcnZlZDsKLQkgICAgY29ubl9ieXRlcyA9IHNjb3JlX3JlY29yZC5jb25uX2J5dGVzOwotCSAgICBpZiAobHJlcyAhPSAwIHx8IChzY29yZV9yZWNvcmQuc3RhdHVzICE9IFNFUlZFUl9SRUFEWQotCQkJICAgICAgJiYgc2NvcmVfcmVjb3JkLnN0YXR1cyAhPSBTRVJWRVJfREVBRCkpIHsKLQkJaWYgKCFzaG9ydF9yZXBvcnQpIHsKLQkJICAgIGlmIChub190YWJsZV9yZXBvcnQpIHsKLQkJCWlmIChzY29yZV9yZWNvcmQuc3RhdHVzID09IFNFUlZFUl9ERUFEKQotCQkJICAgIGFwX3JwcmludGYociwKLQkJCQkiPGI+U2VydmVyICVkLSVkPC9iPiAoLSk6ICVkfCVsdXwlbHUgWyIsCi0JCQkJaSwgKGludCkgcHNfcmVjb3JkLmdlbmVyYXRpb24sIChpbnQpIGNvbm5fbHJlcywKLQkJCQlteV9scmVzLCBscmVzKTsKLQkJCWVsc2UKLQkJCSAgICBhcF9ycHJpbnRmKHIsCi0JCQkJIjxiPlNlcnZlciAlZC0lZDwvYj4gKCVkKTogJWR8JWx1fCVsdSBbIiwKLQkJCQlpLCAoaW50KSBwc19yZWNvcmQuZ2VuZXJhdGlvbiwKLQkJCQkoaW50KSBwc19yZWNvcmQucGlkLAotCQkJCShpbnQpIGNvbm5fbHJlcywgbXlfbHJlcywgbHJlcyk7Ci0KLQkJCXN3aXRjaCAoc2NvcmVfcmVjb3JkLnN0YXR1cykgewotCQkJY2FzZSBTRVJWRVJfUkVBRFk6Ci0JCQkgICAgYXBfcnB1dHMoIlJlYWR5Iiwgcik7Ci0JCQkgICAgYnJlYWs7Ci0JCQljYXNlIFNFUlZFUl9TVEFSVElORzoKLQkJCSAgICBhcF9ycHV0cygiU3RhcnRpbmciLCByKTsKLQkJCSAgICBicmVhazsKLQkJCWNhc2UgU0VSVkVSX0JVU1lfUkVBRDoKLQkJCSAgICBhcF9ycHV0cygiPGI+UmVhZDwvYj4iLCByKTsKLQkJCSAgICBicmVhazsKLQkJCWNhc2UgU0VSVkVSX0JVU1lfV1JJVEU6Ci0JCQkgICAgYXBfcnB1dHMoIjxiPldyaXRlPC9iPiIsIHIpOwotCQkJICAgIGJyZWFrOwotCQkJY2FzZSBTRVJWRVJfQlVTWV9LRUVQQUxJVkU6Ci0JCQkgICAgYXBfcnB1dHMoIjxiPktlZXBhbGl2ZTwvYj4iLCByKTsKLQkJCSAgICBicmVhazsKLQkJCWNhc2UgU0VSVkVSX0JVU1lfTE9HOgotCQkJICAgIGFwX3JwdXRzKCI8Yj5Mb2dnaW5nPC9iPiIsIHIpOwotCQkJICAgIGJyZWFrOwotCQkJY2FzZSBTRVJWRVJfQlVTWV9ETlM6Ci0JCQkgICAgYXBfcnB1dHMoIjxiPkROUyBsb29rdXA8L2I+Iiwgcik7Ci0JCQkgICAgYnJlYWs7Ci0JCQljYXNlIFNFUlZFUl9ERUFEOgotCQkJICAgIGFwX3JwdXRzKCJEZWFkIiwgcik7Ci0JCQkgICAgYnJlYWs7Ci0JCQljYXNlIFNFUlZFUl9HUkFDRUZVTDoKLQkJCSAgICBhcF9ycHV0cygiR3JhY2VmdWwiLCByKTsKLQkJCSAgICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgICAgYXBfcnB1dHMoIj9TVEFURT8iLCByKTsKLQkJCSAgICBicmVhazsKLQkJCX0KLSNpZmRlZiBOT19USU1FUwotCQkJLyogQWxsb3cgZm9yIE9TLzIgbm90IGhhdmluZyBDUFUgc3RhdHMgKi8KLQkJCWFwX3JwcmludGYociwgIl1cbiAlLjBmICVsZCAoIiwKLSNlbHNlCi0KLQkJCWFwX3JwcmludGYociwgIl0gdSVnIHMlZyBjdSVnIGNzJWdcbiAlLjBmICVsZCAoIiwKLQkJCSAgICBzY29yZV9yZWNvcmQudGltZXMudG1zX3V0aW1lIC8gdGljaywKLQkJCSAgICBzY29yZV9yZWNvcmQudGltZXMudG1zX3N0aW1lIC8gdGljaywKLQkJCSAgICBzY29yZV9yZWNvcmQudGltZXMudG1zX2N1dGltZSAvIHRpY2ssCi0JCQkgICAgc2NvcmVfcmVjb3JkLnRpbWVzLnRtc19jc3RpbWUgLyB0aWNrLAotI2VuZGlmCi0jaWZkZWYgT1BUSU1JWkVfVElNRU9VVFMKLQkJCSAgICBkaWZmdGltZShub3d0aW1lLCBwc19yZWNvcmQubGFzdF9ydGltZSksCi0jZWxzZQotCQkJICAgIGRpZmZ0aW1lKG5vd3RpbWUsIHNjb3JlX3JlY29yZC5sYXN0X3VzZWQpLAotI2VuZGlmCi0JCQkgICAgKGxvbmcpIHJlcV90aW1lKTsKLQkJCWZvcm1hdF9ieXRlX291dChyLCBjb25uX2J5dGVzKTsKLQkJCWFwX3JwdXRzKCJ8Iiwgcik7Ci0JCQlmb3JtYXRfYnl0ZV9vdXQociwgbXlfYnl0ZXMpOwotCQkJYXBfcnB1dHMoInwiLCByKTsKLQkJCWZvcm1hdF9ieXRlX291dChyLCBieXRlcyk7Ci0JCQlhcF9ycHV0cygiKVxuIiwgcik7Ci0JCQlhcF9ycHJpbnRmKHIsICIgPGk+JXMgeyVzfTwvaT4gPGI+WyVzXTwvYj48YnI+XG5cbiIsCi0JCQkgICAgc2NvcmVfcmVjb3JkLmNsaWVudCwKLQkJCSAgICBhcF9lc2NhcGVfaHRtbChyLT5wb29sLCBzY29yZV9yZWNvcmQucmVxdWVzdCksCi0JCQkgICAgdmhvc3QgPyB2aG9zdC0+c2VydmVyX2hvc3RuYW1lIDogIih1bmF2YWlsYWJsZSkiKTsKLQkJICAgIH0KLQkJICAgIGVsc2UgewkJLyogIW5vX3RhYmxlX3JlcG9ydCAqLwotCQkJaWYgKHNjb3JlX3JlY29yZC5zdGF0dXMgPT0gU0VSVkVSX0RFQUQpCi0JCQkgICAgYXBfcnByaW50ZihyLAotCQkJCSI8dHI+PHRkPjxiPiVkLSVkPC9iPjx0ZD4tPHRkPiVkLyVsdS8lbHUiLAotCQkJCWksIChpbnQpIHBzX3JlY29yZC5nZW5lcmF0aW9uLAotCQkJCShpbnQpIGNvbm5fbHJlcywgbXlfbHJlcywgbHJlcyk7Ci0JCQllbHNlCi0JCQkgICAgYXBfcnByaW50ZihyLAotCQkJCSI8dHI+PHRkPjxiPiVkLSVkPC9iPjx0ZD4lZDx0ZD4lZC8lbHUvJWx1IiwKLQkJCQlpLCAoaW50KSBwc19yZWNvcmQuZ2VuZXJhdGlvbiwKLQkJCQkoaW50KSBwc19yZWNvcmQucGlkLCAoaW50KSBjb25uX2xyZXMsCi0JCQkJbXlfbHJlcywgbHJlcyk7Ci0KLQkJCXN3aXRjaCAoc2NvcmVfcmVjb3JkLnN0YXR1cykgewotCQkJY2FzZSBTRVJWRVJfUkVBRFk6Ci0JCQkgICAgYXBfcnB1dHMoIjx0ZD5fIiwgcik7Ci0JCQkgICAgYnJlYWs7Ci0JCQljYXNlIFNFUlZFUl9TVEFSVElORzoKLQkJCSAgICBhcF9ycHV0cygiPHRkPjxiPlM8L2I+Iiwgcik7Ci0JCQkgICAgYnJlYWs7Ci0JCQljYXNlIFNFUlZFUl9CVVNZX1JFQUQ6Ci0JCQkgICAgYXBfcnB1dHMoIjx0ZD48Yj5SPC9iPiIsIHIpOwotCQkJICAgIGJyZWFrOwotCQkJY2FzZSBTRVJWRVJfQlVTWV9XUklURToKLQkJCSAgICBhcF9ycHV0cygiPHRkPjxiPlc8L2I+Iiwgcik7Ci0JCQkgICAgYnJlYWs7Ci0JCQljYXNlIFNFUlZFUl9CVVNZX0tFRVBBTElWRToKLQkJCSAgICBhcF9ycHV0cygiPHRkPjxiPks8L2I+Iiwgcik7Ci0JCQkgICAgYnJlYWs7Ci0JCQljYXNlIFNFUlZFUl9CVVNZX0xPRzoKLQkJCSAgICBhcF9ycHV0cygiPHRkPjxiPkw8L2I+Iiwgcik7Ci0JCQkgICAgYnJlYWs7Ci0JCQljYXNlIFNFUlZFUl9CVVNZX0ROUzoKLQkJCSAgICBhcF9ycHV0cygiPHRkPjxiPkQ8L2I+Iiwgcik7Ci0JCQkgICAgYnJlYWs7Ci0JCQljYXNlIFNFUlZFUl9ERUFEOgotCQkJICAgIGFwX3JwdXRzKCI8dGQ+LiIsIHIpOwotCQkJICAgIGJyZWFrOwotCQkJY2FzZSBTRVJWRVJfR1JBQ0VGVUw6Ci0JCQkgICAgYXBfcnB1dHMoIjx0ZD5HIiwgcik7Ci0JCQkgICAgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJICAgIGFwX3JwdXRzKCI8dGQ+PyIsIHIpOwotCQkJICAgIGJyZWFrOwotCQkJfQotI2lmZGVmIE5PX1RJTUVTCi0JCQkvKiBBbGxvdyBmb3IgT1MvMiBub3QgaGF2aW5nIENQVSBzdGF0cyAqLwotCQkJYXBfcnByaW50ZihyLCAiXG48dGQ+JS4wZjx0ZD4lbGQiLAotI2Vsc2UKLQkJCWFwX3JwcmludGYociwgIlxuPHRkPiUuMmY8dGQ+JS4wZjx0ZD4lbGQiLAotCQkJICAgIChzY29yZV9yZWNvcmQudGltZXMudG1zX3V0aW1lICsKLQkJCSAgICAgc2NvcmVfcmVjb3JkLnRpbWVzLnRtc19zdGltZSArCi0JCQkgICAgIHNjb3JlX3JlY29yZC50aW1lcy50bXNfY3V0aW1lICsKLQkJCSAgICAgc2NvcmVfcmVjb3JkLnRpbWVzLnRtc19jc3RpbWUpIC8gdGljaywKLSNlbmRpZgotI2lmZGVmIE9QVElNSVpFX1RJTUVPVVRTCi0JCQkgICAgZGlmZnRpbWUobm93dGltZSwgcHNfcmVjb3JkLmxhc3RfcnRpbWUpLAotI2Vsc2UKLQkJCSAgICBkaWZmdGltZShub3d0aW1lLCBzY29yZV9yZWNvcmQubGFzdF91c2VkKSwKLSNlbmRpZgotCQkJICAgIChsb25nKSByZXFfdGltZSk7Ci0JCQlhcF9ycHJpbnRmKHIsICI8dGQ+JS0xLjFmPHRkPiUtMi4yZjx0ZD4lLTIuMmZcbiIsCi0JCQkgICAoZmxvYXQpIGNvbm5fYnl0ZXMgLyBLQllURSwgKGZsb2F0KSBteV9ieXRlcyAvIE1CWVRFLAotCQkJICAgIChmbG9hdCkgYnl0ZXMgLyBNQllURSk7Ci0JCQlpZiAoc2NvcmVfcmVjb3JkLnN0YXR1cyA9PSBTRVJWRVJfQlVTWV9SRUFEKQotCQkJICAgIGFwX3JwcmludGYociwKLQkJCSAgICAgIjx0ZD4/PHRkIG5vd3JhcD4/PHRkIG5vd3JhcD4uLnJlYWRpbmcuLiA8L3RyPlxuXG4iKTsKLQkJCWVsc2UKLQkJCSAgICBhcF9ycHJpbnRmKHIsCi0JCQkgICAgICI8dGQ+JXM8dGQgbm93cmFwPiVzPHRkIG5vd3JhcD4lczwvdHI+XG5cbiIsCi0JCQkgICAgIHNjb3JlX3JlY29yZC5jbGllbnQsCi0JCQkgICAgIHZob3N0ID8gdmhvc3QtPnNlcnZlcl9ob3N0bmFtZSA6ICIodW5hdmFpbGFibGUpIiwKLQkJCSAgICAgYXBfZXNjYXBlX2h0bWwoci0+cG9vbCwgc2NvcmVfcmVjb3JkLnJlcXVlc3QpKTsKLQkJICAgIH0JCS8qIG5vX3RhYmxlX3JlcG9ydCAqLwotCQl9CQkJLyogIXNob3J0X3JlcG9ydCAqLwotCSAgICB9CQkJLyogaWYgKDxhY3RpdmUgY2hpbGQ+KSAqLwotCX0JCQkJLyogZm9yICgpICovCi0KLQlpZiAoIShzaG9ydF9yZXBvcnQgfHwgbm9fdGFibGVfcmVwb3J0KSkgewotI2lmZGVmIE5PX1RJTUVTCi0JICAgIGFwX3JwdXRzKCI8L3RhYmxlPlxuIFwKLTxocj4gXAotPHRhYmxlPlxuIFwKLTx0cj48dGg+U3J2PHRkPkNoaWxkIFNlcnZlciBudW1iZXIgLSBnZW5lcmF0aW9uXG4gXAotPHRyPjx0aD5QSUQ8dGQ+T1MgcHJvY2VzcyBJRFxuIFwKLTx0cj48dGg+QWNjPHRkPk51bWJlciBvZiBhY2Nlc3NlcyB0aGlzIGNvbm5lY3Rpb24gLyB0aGlzIGNoaWxkIC8gdGhpcyBzbG90XG4gXAotPHRyPjx0aD5NPHRkPk1vZGUgb2Ygb3BlcmF0aW9uXG4gXAotPHRyPjx0aD5TUzx0ZD5TZWNvbmRzIHNpbmNlIGJlZ2lubmluZyBvZiBtb3N0IHJlY2VudCByZXF1ZXN0XG4gXAotPHRyPjx0aD5SZXE8dGQ+TWlsbGlzZWNvbmRzIHJlcXVpcmVkIHRvIHByb2Nlc3MgbW9zdCByZWNlbnQgcmVxdWVzdFxuIFwKLTx0cj48dGg+Q29ubjx0ZD5LaWxvYnl0ZXMgdHJhbnNmZXJyZWQgdGhpcyBjb25uZWN0aW9uXG4gXAotPHRyPjx0aD5DaGlsZDx0ZD5NZWdhYnl0ZXMgdHJhbnNmZXJyZWQgdGhpcyBjaGlsZFxuIFwKLTx0cj48dGg+U2xvdDx0ZD5Ub3RhbCBtZWdhYnl0ZXMgdHJhbnNmZXJyZWQgdGhpcyBzbG90XG4gXAotPC90YWJsZT5cbiIsIHIpOwotI2Vsc2UKLQkgICAgYXBfcnB1dHMoIjwvdGFibGU+XG4gXAotPGhyPiBcCi08dGFibGU+XG4gXAotPHRyPjx0aD5TcnY8dGQ+Q2hpbGQgU2VydmVyIG51bWJlciAtIGdlbmVyYXRpb25cbiBcCi08dHI+PHRoPlBJRDx0ZD5PUyBwcm9jZXNzIElEXG4gXAotPHRyPjx0aD5BY2M8dGQ+TnVtYmVyIG9mIGFjY2Vzc2VzIHRoaXMgY29ubmVjdGlvbiAvIHRoaXMgY2hpbGQgLyB0aGlzIHNsb3RcbiBcCi08dHI+PHRoPk08dGQ+TW9kZSBvZiBvcGVyYXRpb25cbiBcCi08dHI+PHRoPkNQVTx0ZD5DUFUgdXNhZ2UsIG51bWJlciBvZiBzZWNvbmRzXG4gXAotPHRyPjx0aD5TUzx0ZD5TZWNvbmRzIHNpbmNlIGJlZ2lubmluZyBvZiBtb3N0IHJlY2VudCByZXF1ZXN0XG4gXAotPHRyPjx0aD5SZXE8dGQ+TWlsbGlzZWNvbmRzIHJlcXVpcmVkIHRvIHByb2Nlc3MgbW9zdCByZWNlbnQgcmVxdWVzdFxuIFwKLTx0cj48dGg+Q29ubjx0ZD5LaWxvYnl0ZXMgdHJhbnNmZXJyZWQgdGhpcyBjb25uZWN0aW9uXG4gXAotPHRyPjx0aD5DaGlsZDx0ZD5NZWdhYnl0ZXMgdHJhbnNmZXJyZWQgdGhpcyBjaGlsZFxuIFwKLTx0cj48dGg+U2xvdDx0ZD5Ub3RhbCBtZWdhYnl0ZXMgdHJhbnNmZXJyZWQgdGhpcyBzbG90XG4gXAotPC90YWJsZT5cbiIsIHIpOwotI2VuZGlmCi0JfQotCi0gICAgfSBlbHNlIHsKLQotICAgIGFwX3JwdXRzKCI8aHI+VG8gb2J0YWluIGEgZnVsbCByZXBvcnQgd2l0aCBjdXJyZW50IHN0YXR1cyBpbmZvcm1hdGlvbiAiLCByKTsKLSAgICBhcF9ycHV0cygieW91IG5lZWQgdG8gdXNlIHRoZSA8Y29kZT5FeHRlbmRlZFN0YXR1cyBPbjwvY29kZT4gZGlyZWN0aXZlLiBcbiIsIHIpOwotCi0gICAgfQotCi0gICAgaWYgKCFzaG9ydF9yZXBvcnQpIHsKLQlhcF9ycHV0cyhhcF9wc2lnbmF0dXJlKCI8SFI+XG4iLHIpLCByKTsKLQlhcF9ycHV0cygiPC9CT0RZPjwvSFRNTD5cbiIsIHIpOwotICAgIH0KLQotICAgIGFwX2tpbGxfdGltZW91dChyKTsKLSAgICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdm9pZCBzdGF0dXNfaW5pdChzZXJ2ZXJfcmVjICpzLCBwb29sICpwKQotewotICAgIHN0YXR1c19mbGFnc1tTRVJWRVJfREVBRF0gPSAnLic7CS8qIFdlIGRvbid0IHdhbnQgdG8gYXNzdW1lIHRoZXNlIGFyZSBpbiAqLwotICAgIHN0YXR1c19mbGFnc1tTRVJWRVJfUkVBRFldID0gJ18nOwkvKiBhbnkgcGFydGljdWxhciBvcmRlciBpbiBzY29yZWJvYXJkLmggKi8KLSAgICBzdGF0dXNfZmxhZ3NbU0VSVkVSX1NUQVJUSU5HXSA9ICdTJzsKLSAgICBzdGF0dXNfZmxhZ3NbU0VSVkVSX0JVU1lfUkVBRF0gPSAnUic7Ci0gICAgc3RhdHVzX2ZsYWdzW1NFUlZFUl9CVVNZX1dSSVRFXSA9ICdXJzsKLSAgICBzdGF0dXNfZmxhZ3NbU0VSVkVSX0JVU1lfS0VFUEFMSVZFXSA9ICdLJzsKLSAgICBzdGF0dXNfZmxhZ3NbU0VSVkVSX0JVU1lfTE9HXSA9ICdMJzsKLSAgICBzdGF0dXNfZmxhZ3NbU0VSVkVSX0JVU1lfRE5TXSA9ICdEJzsKLSAgICBzdGF0dXNfZmxhZ3NbU0VSVkVSX0dSQUNFRlVMXSA9ICdHJzsKLX0KLQotc3RhdGljIGNvbnN0IGhhbmRsZXJfcmVjIHN0YXR1c19oYW5kbGVyc1tdID0KLXsKLSAgICB7U1RBVFVTX01BR0lDX1RZUEUsIHN0YXR1c19oYW5kbGVyfSwKLSAgICB7InNlcnZlci1zdGF0dXMiLCBzdGF0dXNfaGFuZGxlcn0sCi0gICAge05VTEx9Ci19OwotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgc3RhdHVzX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkRfTU9EVUxFX1NUVUZGLAotICAgIHN0YXR1c19pbml0LAkJLyogaW5pdGlhbGl6ZXIgKi8KLSAgICBOVUxMLAkJCS8qIGRpciBjb25maWcgY3JlYXRlciAqLwotICAgIE5VTEwsCQkJLyogZGlyIG1lcmdlciAtLS0gZGVmYXVsdCBpcyB0byBvdmVycmlkZSAqLwotICAgIE5VTEwsCQkJLyogc2VydmVyIGNvbmZpZyAqLwotICAgIE5VTEwsCQkJLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLwotICAgIHN0YXR1c19tb2R1bGVfY21kcywJCS8qIGNvbW1hbmQgdGFibGUgKi8KLSAgICBzdGF0dXNfaGFuZGxlcnMsCQkvKiBoYW5kbGVycyAqLwotICAgIE5VTEwsCQkJLyogZmlsZW5hbWUgdHJhbnNsYXRpb24gKi8KLSAgICBOVUxMLAkJCS8qIGNoZWNrX3VzZXJfaWQgKi8KLSAgICBOVUxMLAkJCS8qIGNoZWNrIGF1dGggKi8KLSAgICBOVUxMLAkJCS8qIGNoZWNrIGFjY2VzcyAqLwotICAgIE5VTEwsCQkJLyogdHlwZV9jaGVja2VyICovCi0gICAgTlVMTCwJCQkvKiBmaXh1cHMgKi8KLSAgICBOVUxMLAkJCS8qIGxvZ2dlciAqLwotICAgIE5VTEwsCQkJLyogaGVhZGVyIHBhcnNlciAqLwotICAgIE5VTEwsCQkJLyogY2hpbGRfaW5pdCAqLwotICAgIE5VTEwsCQkJLyogY2hpbGRfZXhpdCAqLwotICAgIE5VTEwJCQkvKiBwb3N0IHJlYWQtcmVxdWVzdCAqLwotfTsKZGlmZiAtLWdpdCBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2Rfc3RhdHVzLmRzcCBiL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2Rfc3RhdHVzLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJjOTI3MS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX3N0YXR1cy5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJBcGFjaGVNb2R1bGVTdGF0dXMiIC0gUGFja2FnZSBPd25lcj08ND4KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDUuMDAKLSMgKiogRE8gTk9UIEVESVQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDEwMgotCi1DRkc9QXBhY2hlTW9kdWxlU3RhdHVzIC0gV2luMzIgUmVsZWFzZQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJBcGFjaGVNb2R1bGVTdGF0dXMubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJBcGFjaGVNb2R1bGVTdGF0dXMubWFrIlwKLSBDRkc9IkFwYWNoZU1vZHVsZVN0YXR1cyAtIFdpbjMyIFJlbGVhc2UiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAiQXBhY2hlTW9kdWxlU3RhdHVzIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uXAotICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAiQXBhY2hlTW9kdWxlU3RhdHVzIC0gV2luMzIgRGVidWciIChiYXNlZCBvblwKLSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLU1UTD1taWRsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJBcGFjaGVNb2R1bGVTdGF0dXMgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiLlxSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIi5cQXBhY2hlTW9kdWxlU3RhdHVzUiIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuXEFwYWNoZU1vZHVsZVN0YXR1c1IiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dYIC9PMiAvSSAiLi5cLi5caW5jbHVkZSIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJTSEFSRURfTU9EVUxFIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiAuLlwuLlxDb3JlUlxBcGFjaGVDb3JlLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFjaGluZTpJMzg2Ci0KLSFFTFNFSUYgICIkKENGRykiID09ICJBcGFjaGVNb2R1bGVTdGF0dXMgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIi5cRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXERlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIi5cQXBhY2hlTW9kdWxlU3RhdHVzRCIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuXEFwYWNoZU1vZHVsZVN0YXR1c0QiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvSSAiLi5cLi5caW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJTSEFSRURfTU9EVUxFIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgLi5cLi5cQ29yZURcQXBhY2hlQ29yZS5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIkFwYWNoZU1vZHVsZVN0YXR1cyAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgIkFwYWNoZU1vZHVsZVN0YXR1cyAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aHBqO2JhdDtmb3I7ZjkwIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cbW9kdWxlc1xzdGFuZGFyZFxtb2Rfc3RhdHVzLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmw7Zmk7ZmQiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHJlYWRkaXIuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47Y250O3J0ZjtnaWY7anBnO2pwZWc7anBlIgotIyBFbmQgR3JvdXAKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9zdGF0dXMuZXhwIGIvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9zdGF0dXMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDM4MDkzLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2Rfc3RhdHVzLmV4cAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXN0YXR1c19tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2Rfc3VleGVjLmMgYi9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX3N1ZXhlYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjNhNzBmLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2Rfc3VleGVjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCi0gKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAotICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqLwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotI2luY2x1ZGUgImh0dHBfcmVxdWVzdC5oIgotI2luY2x1ZGUgImFwcl9zdHJpbmdzLmgiCi0jaW5jbHVkZSAic3VleGVjLmgiCi0jaW5jbHVkZSAidW5peGQuaCIKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIHN1ZXhlY19tb2R1bGU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBhcF91bml4X2lkZW50aXR5X3QgdWdpZDsKLSAgICBpbnQgYWN0aXZlOwotfSBzdWV4ZWNfY29uZmlnX3Q7Ci0KLS8qCi0gKiBDcmVhdGUgYSBjb25maWd1cmF0aW9uIHNwZWNpZmljIHRvIHRoaXMgbW9kdWxlIGZvciBhIHNlcnZlciBvciBkaXJlY3RvcnkKLSAqIGxvY2F0aW9uLCBhbmQgZmlsbCBpdCB3aXRoIHRoZSBkZWZhdWx0IHNldHRpbmdzLgotICovCi1zdGF0aWMgdm9pZCAqbWtjb25maWcoYXByX3Bvb2xfdCAqcCkKLXsKLSAgICBzdWV4ZWNfY29uZmlnX3QgKmNmZyA9IGFwcl9wYWxsb2MocCwgc2l6ZW9mKHN1ZXhlY19jb25maWdfdCkpOwotCi0gICAgY2ZnLT5hY3RpdmUgPSAwOwotICAgIHJldHVybiBjZmc7Ci19Ci0KLS8qCi0gKiBSZXNwb25kIHRvIGEgY2FsbGJhY2sgdG8gY3JlYXRlIGNvbmZpZ3VyYXRpb24gcmVjb3JkIGZvciBhIHNlcnZlciBvcgotICogdmhvc3QgZW52aXJvbm1lbnQuCi0gKi8KLXN0YXRpYyB2b2lkICpjcmVhdGVfbWNvbmZpZ19mb3Jfc2VydmVyKGFwcl9wb29sX3QgKnAsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgcmV0dXJuIG1rY29uZmlnKHApOwotfQotCi0vKgotICogUmVzcG9uZCB0byBhIGNhbGxiYWNrIHRvIGNyZWF0ZSBhIGNvbmZpZyByZWNvcmQgZm9yIGEgc3BlY2lmaWMgZGlyZWN0b3J5LgotICovCi1zdGF0aWMgdm9pZCAqY3JlYXRlX21jb25maWdfZm9yX2RpcmVjdG9yeShhcHJfcG9vbF90ICpwLCBjaGFyICpkaXIpCi17Ci0gICAgcmV0dXJuIG1rY29uZmlnKHApOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3N1ZXhlY191Z2lkKGNtZF9wYXJtcyAqY21kLCB2b2lkICptY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICp1aWQsIGNoYXIgKmdpZCkKLXsKLSAgICBzdWV4ZWNfY29uZmlnX3QgKmNmZyA9IChzdWV4ZWNfY29uZmlnX3QgKikgbWNvbmZpZzsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIE5PVF9JTl9ESVJfTE9DX0ZJTEV8Tk9UX0lOX0xJTUlUKTsKLQotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBpZiAodW5peGRfY29uZmlnLnN1ZXhlY19lbmFibGVkKSB7Ci0gICAgICAgIGNmZy0+dWdpZC51aWQgPSBhcF91bmFtZTJpZCh1aWQpOwotICAgICAgICBjZmctPnVnaWQuZ2lkID0gYXBfZ25hbWUyaWQoZ2lkKTsKLSAgICAgICAgY2ZnLT5hY3RpdmUgPSAxOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAgICAgIldhcm5pbmc6IFN1ZXhlY1VzZXJHcm91cCBkaXJlY3RpdmUgcmVxdWlyZXMgU1VFWEVDIHdyYXBwZXIuXG4iKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBhcF91bml4X2lkZW50aXR5X3QgKmdldF9zdWV4ZWNfaWRfZG9lcihjb25zdCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBzdWV4ZWNfY29uZmlnX3QgKmNmZyA9Ci0gICAgKHN1ZXhlY19jb25maWdfdCAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywgJnN1ZXhlY19tb2R1bGUpOwotCi0gICAgcmV0dXJuIGNmZy0+YWN0aXZlID8gJmNmZy0+dWdpZCA6IE5VTEw7Ci19Ci0KLS8qCi0gKiBEZWZpbmUgdGhlIGRpcmVjdGl2ZXMgc3BlY2lmaWMgdG8gdGhpcyBtb2R1bGUuICBUaGlzIHN0cnVjdHVyZSBpcyByZWZlcmVuY2VkCi0gKiBsYXRlciBieSB0aGUgJ21vZHVsZScgc3RydWN0dXJlLgotICovCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgc3VleGVjX2NtZHNbXSA9Ci17Ci0gICAgLyogWFhYIC0gQW5vdGhlciBpbXBvcnRhbnQgcmVhc29uIG5vdCB0byBhbGxvdyB0aGlzIGluIC5odGFjY2VzcyBpcyB0aGF0Ci0gICAgICogdGhlIGFwX1t1Z11uYW1lMmlkKCkgaXMgbm90IHRocmVhZC1zYWZlICovCi0gICAgQVBfSU5JVF9UQUtFMigiU3VleGVjVXNlckdyb3VwIiwgc2V0X3N1ZXhlY191Z2lkLCBOVUxMLCBSU1JDX0NPTkYsCi0gICAgICAiVXNlciBhbmQgZ3JvdXAgZm9yIHNwYXduZWQgcHJvY2Vzc2VzIiksCi0gICAgeyBOVUxMIH0KLX07Ci0KLXN0YXRpYyB2b2lkIHN1ZXhlY19ob29rcyh2b2lkKQotewotICAgIGFwX2hvb2tfZ2V0X3N1ZXhlY19pZGVudGl0eShnZXRfc3VleGVjX2lkX2RvZXIsTlVMTCxOVUxMLEFQX0hPT0tfTUlERExFKTsKLX0KLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIHN1ZXhlY19tb2R1bGUgPQotewotICAgIFNUQU5EQVJEMjBfTU9EVUxFX1NUVUZGLAotICAgIGNyZWF0ZV9tY29uZmlnX2Zvcl9kaXJlY3RvcnksICAgLyogY3JlYXRlIHBlci1kaXIgY29uZmlnICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIG1lcmdlIHBlci1kaXIgY29uZmlnICovCi0gICAgY3JlYXRlX21jb25maWdfZm9yX3NlcnZlciwgIC8qIHNlcnZlciBjb25maWcgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLwotICAgIHN1ZXhlY19jbWRzLCAgICAgICAgICAgICAgICAvKiBjb21tYW5kIHRhYmxlICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGhhbmRsZXJzICovCi0gICAgc3VleGVjX2hvb2tzCQkvKiByZWdpc3RlciBob29rcyAqLwotfTsKZGlmZiAtLWdpdCBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2Rfc3VleGVjLmggYi9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX3N1ZXhlYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGIxM2FjLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2Rfc3VleGVjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBiYXNlZCB1cG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUKLSAqIG9yaWdpbmFsbHkgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsCi0gKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICovCi0jaW5jbHVkZSAidW5peGQuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGFwX3VuaXhfaWRlbnRpdHlfdCB1Z2lkOwotICAgIGludCBhY3RpdmU7Ci19IHN1ZXhlY19jb25maWdfdDsKLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9odHRwLy5jdnNpZ25vcmUgYi9tb2R1bGVzL2h0dHAvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJmN2E3MC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2h0dHAvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS5kZXBzCi0ubGlicwotKi5sYQotbW9kdWxlcy5tawotTWFrZWZpbGUKLSoubG8KLSouc2xvCi0qLnNvCi0qLmRsbAotKi5kZWYKZGlmZiAtLWdpdCBhL21vZHVsZXMvaHR0cC8uaW5kZW50LnBybyBiL21vZHVsZXMvaHR0cC8uaW5kZW50LnBybwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlmYmU5Zi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2h0dHAvLmluZGVudC5wcm8KKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0taTQgLW5wc2wgLWRpMCAtYnIgLW5jZSAtZDAgLWNsaTAgLW5wY3MgLW5mYzEKLS1UQlVGRgotLVRGSUxFCi0tVFRSQU5TCi0tVFVJTlQ0Ci0tVF90cmFucwotLVRhbGxvd19vcHRpb25zX3QKLS1UYXBhY2hlX3NmaW8KLS1UYXJyYXlfaGVhZGVyCi0tVGJvb2xfaW50Ci0tVGJ1Zl9hcmVhCi0tVGJ1ZmZfc3RydWN0Ci0tVGJ1ZmZ5Ci0tVGNtZF9ob3cKLS1UY21kX3Bhcm1zCi0tVGNvbW1hbmRfcmVjCi0tVGNvbW1hbmRfc3RydWN0Ci0tVGNvbm5fcmVjCi0tVGNvcmVfZGlyX2NvbmZpZwotLVRjb3JlX3NlcnZlcl9jb25maWcKLS1UZGlyX21ha2VyX2Z1bmMKLS1UZXZlbnQKLS1UZ2xvYmFsc19zCi0tVGhhbmRsZXJfZnVuYwotLVRoYW5kbGVyX3JlYwotLVRqb2JsaXN0X3MKLS1UbGlzdGVuX3JlYwotLVRtZXJnZXJfZnVuYwotLVRtb2RlX3QKLS1UbW9kdWxlCi0tVG1vZHVsZV9zdHJ1Y3QKLS1UbXV0ZXgKLS1Ubl9sb25nCi0tVG90aGVyX2NoaWxkX3JlYwotLVRvdmVycmlkZXNfdAotLVRwYXJlbnRfc2NvcmUKLS1UcGlkX3QKLS1UcGlwZWRfbG9nCi0tVHBvb2wKLS1UcmVxdWVzdF9yZWMKLS1UcmVxdWlyZV9saW5lCi0tVHJsaW1fdAotLVRzY29yZWJvYXJkCi0tVHNlbWFwaG9yZQotLVRzZXJ2ZXJfYWRkcl9yZWMKLS1Uc2VydmVyX3JlYwotLVRzZXJ2ZXJfcmVjX2NoYWluCi0tVHNob3J0X3Njb3JlCi0tVHRhYmxlCi0tVHRhYmxlX2VudHJ5Ci0tVHRocmVhZAotLVR1X3dpZGVfaW50Ci0tVHZ0aW1lX3QKLS1Ud2lkZV9pbnQKZGlmZiAtLWdpdCBhL21vZHVsZXMvaHR0cC9NYWtlZmlsZS5pbiBiL21vZHVsZXMvaHR0cC9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY3YjM0My4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2h0dHAvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotaW5jbHVkZSAkKHRvcF9zcmNkaXIpL2J1aWxkL3NwZWNpYWwubWsKLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9odHRwL2NvbmZpZzIubTQgYi9tb2R1bGVzL2h0dHAvY29uZmlnMi5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZlYzMwYy4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2h0dHAvY29uZmlnMi5tNAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWRubCBtb2R1bGVzIGVuYWJsZWQgaW4gdGhpcyBkaXJlY3RvcnkgYnkgZGVmYXVsdAotCi1BUEFDSEVfTU9EUEFUSF9JTklUKGh0dHApCi0KLWh0dHBfb2JqZWN0cz0iaHR0cF9jb3JlLmxvIGh0dHBfcHJvdG9jb2wubG8gaHR0cF9yZXF1ZXN0LmxvIgotCi1BUEFDSEVfTU9EVUxFKGh0dHAsIEhUVFAgcHJvdG9jb2wgaGFuZGxpbmcsICRodHRwX29iamVjdHMsICwgeWVzKQotQVBBQ0hFX01PRFVMRShtaW1lLCBtYXBwaW5nIG9mIGZpbGUtZXh0ZW5zaW9uIHRvIE1JTUUsICwgLCB5ZXMpCi0KLUFQQUNIRV9NT0RQQVRIX0ZJTklTSApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9odHRwL2h0dHBfY29yZS5jIGIvbW9kdWxlcy9odHRwL2h0dHBfY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDJkMzJlLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvaHR0cC9odHRwX2NvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDMyMTQgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jZGVmaW5lIENPUkVfUFJJVkFURQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCS8qIEZvciBpbmRleF9vZl9yZXNwb25zZSgpLiAgR3J1bXAuICovCi0jaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCi0jaW5jbHVkZSAiaHR0cF9jb25mX2dsb2JhbHMuaCIKLSNpbmNsdWRlICJodHRwX3Zob3N0LmgiCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiCQkvKiBGb3IgdGhlIGRlZmF1bHRfaGFuZGxlciBiZWxvdy4uLiAqLwotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAicmZjMTQxMy5oIgotI2luY2x1ZGUgInV0aWxfbWQ1LmgiCi0jaW5jbHVkZSAic2NvcmVib2FyZC5oIgotI2luY2x1ZGUgImZubWF0Y2guaCIKLQotI2lmZGVmIFVTRV9NTUFQX0ZJTEVTCi0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotLyogbW1hcCBzdXBwb3J0IGZvciBzdGF0aWMgZmlsZXMgYmFzZWQgb24gaWRlYXMgZnJvbSBKb2huIEhlaWRlbWFubidzCi0gKiBwYXRjaCBhZ2FpbnN0IDEuMC41LiAgU2VlCi0gKiA8aHR0cDovL3d3dy5pc2kuZWR1L35qb2huaC9TT0ZUV0FSRS9BUEFDSEUvaW5kZXguaHRtbD4uCi0gKi8KLQotLyogRmlsZXMgaGF2ZSB0byBiZSBhdCBsZWFzdCB0aGlzIGJpZyBiZWZvcmUgdGhleSdyZSBtbWFwKClkLiAgVGhpcyBpcyB0byBkZWFsCi0gKiB3aXRoIHN5c3RlbXMgd2hlcmUgdGhlIGV4cGVuc2Ugb2YgZG9pbmcgYW4gbW1hcCgpIGFuZCBhbiBtdW5tYXAoKSBvdXR3ZWlnaHMKLSAqIHRoZSBiZW5lZml0IGZvciBzbWFsbCBmaWxlcy4gIEl0IHNob3VsZG4ndCBiZSBzZXQgbG93ZXIgdGhhbiAxLgotICovCi0jaWZuZGVmIE1NQVBfVEhSRVNIT0xECi0jaWZkZWYgU1VOT1M0Ci0jZGVmaW5lIE1NQVBfVEhSRVNIT0xECQkoOCoxMDI0KQotI2Vsc2UKLSNkZWZpbmUgTU1BUF9USFJFU0hPTEQJCTEKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLSNpZm5kZWYgTU1BUF9MSU1JVAotI2RlZmluZSBNTUFQX0xJTUlUICAgICAgICAgICAgICAoNCoxMDI0KjEwMjQpCi0jZW5kaWYKLQotLyogU2VydmVyIGNvcmUgbW9kdWxlLi4uIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHJlYWxseSBiYXNpYwotICogc2VydmVyIG9wZXJhdGlvbnMsIGluY2x1ZGluZyBvcHRpb25zIGFuZCBjb21tYW5kcyB3aGljaCBjb250cm9sIHRoZQotICogb3BlcmF0aW9uIG9mIG90aGVyIG1vZHVsZXMuICBDb25zaWRlciB0aGlzIHRoZSBidXJlYXVjcmFjeSBtb2R1bGUuCi0gKgotICogVGhlIGNvcmUgbW9kdWxlIGFsc28gZGVmaW5lcyBoYW5kbGVycywgZXRjLiwgZG8gaGFuZGxlIGp1c3QgZW5vdWdoCi0gKiB0byBhbGxvdyBhIHNlcnZlciB3aXRoIHRoZSBjb3JlIG1vZHVsZSBPTkxZIHRvIGFjdHVhbGx5IHNlcnZlIGRvY3VtZW50cwotICogKHRob3VnaCBpdCBzbGFwcyBEZWZhdWx0VHlwZSBvbiBhbGwgb2YgJ2VtKTsgdGhpcyB3YXMgdXNlZnVsIGluIHRlc3RpbmcsCi0gKiBidXQgbWF5IG5vdCBiZSB3b3J0aCBwcmVzZXJ2aW5nLgotICoKLSAqIFRoaXMgZmlsZSBjb3VsZCBhbG1vc3QgYmUgbW9kX2NvcmUuYywgZXhjZXB0IGZvciB0aGUgc3R1ZmYgd2hpY2ggYWZmZWN0cwotICogdGhlIGh0dHBfY29uZl9nbG9iYWxzLgotICovCi0KLXN0YXRpYyB2b2lkICpjcmVhdGVfY29yZV9kaXJfY29uZmlnKHBvb2wgKmEsIGNoYXIgKmRpcikKLXsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvbmY7Ci0KLSAgICBjb25mID0gKGNvcmVfZGlyX2NvbmZpZyAqKWFwX3BjYWxsb2MoYSwgc2l6ZW9mKGNvcmVfZGlyX2NvbmZpZykpOwotICAgIGlmICghZGlyIHx8IGRpcltzdHJsZW4oZGlyKSAtIDFdID09ICcvJykgewotICAgICAgICBjb25mLT5kID0gZGlyOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJuY21wKGRpciwgInByb3h5OiIsIDYpID09IDApIHsKLSAgICAgICAgY29uZi0+ZCA9IGFwX3BzdHJkdXAoYSwgZGlyKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGNvbmYtPmQgPSBhcF9wc3RyY2F0KGEsIGRpciwgIi8iLCBOVUxMKTsKLSAgICB9Ci0gICAgY29uZi0+ZF9pc19mbm1hdGNoID0gY29uZi0+ZCA/IChhcF9pc19mbm1hdGNoKGNvbmYtPmQpICE9IDApIDogMDsKLSAgICBjb25mLT5kX2NvbXBvbmVudHMgPSBjb25mLT5kID8gYXBfY291bnRfZGlycyhjb25mLT5kKSA6IDA7Ci0KLSAgICBjb25mLT5vcHRzID0gZGlyID8gT1BUX1VOU0VUIDogT1BUX1VOU0VUfE9QVF9BTEw7Ci0gICAgY29uZi0+b3B0c19hZGQgPSBjb25mLT5vcHRzX3JlbW92ZSA9IE9QVF9OT05FOwotICAgIGNvbmYtPm92ZXJyaWRlID0gZGlyID8gT1JfVU5TRVQgOiBPUl9VTlNFVHxPUl9BTEw7Ci0KLSAgICBjb25mLT5jb250ZW50X21kNSA9IDI7Ci0KLSAgICBjb25mLT51c2VfY2Fub25pY2FsX25hbWUgPSBVU0VfQ0FOT05JQ0FMX05BTUVfVU5TRVQ7Ci0KLSAgICBjb25mLT5ob3N0bmFtZV9sb29rdXBzID0gSE9TVE5BTUVfTE9PS1VQX1VOU0VUOwotICAgIGNvbmYtPmRvX3JmYzE0MTMgPSBERUZBVUxUX1JGQzE0MTMgfCAyOyAvKiBzZXQgYml0IDEgdG8gaW5kaWNhdGUgZGVmYXVsdCAqLwotICAgIGNvbmYtPnNhdGlzZnkgPSBTQVRJU0ZZX05PU1BFQzsKLQotI2lmZGVmIFJMSU1JVF9DUFUKLSAgICBjb25mLT5saW1pdF9jcHUgPSBOVUxMOwotI2VuZGlmCi0jaWYgZGVmaW5lZChSTElNSVRfREFUQSkgfHwgZGVmaW5lZChSTElNSVRfVk1FTSkgfHwgZGVmaW5lZChSTElNSVRfQVMpCi0gICAgY29uZi0+bGltaXRfbWVtID0gTlVMTDsKLSNlbmRpZgotI2lmZGVmIFJMSU1JVF9OUFJPQwotICAgIGNvbmYtPmxpbWl0X25wcm9jID0gTlVMTDsKLSNlbmRpZgotCi0gICAgY29uZi0+bGltaXRfcmVxX2JvZHkgPSAwOwotICAgIGNvbmYtPnNlYyA9IGFwX21ha2VfYXJyYXkoYSwgMiwgc2l6ZW9mKHZvaWQgKikpOwotI2lmZGVmIFdJTjMyCi0gICAgY29uZi0+c2NyaXB0X2ludGVycHJldGVyX3NvdXJjZSA9IElOVEVSUFJFVEVSX1NPVVJDRV9VTlNFVDsKLSNlbmRpZgotCi0gICAgY29uZi0+c2VydmVyX3NpZ25hdHVyZSA9IHNydl9zaWdfdW5zZXQ7Ci0KLSAgICByZXR1cm4gKHZvaWQgKiljb25mOwotfQotCi1zdGF0aWMgdm9pZCAqbWVyZ2VfY29yZV9kaXJfY29uZmlncyhwb29sICphLCB2b2lkICpiYXNldiwgdm9pZCAqbmV3dikKLXsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmJhc2UgPSAoY29yZV9kaXJfY29uZmlnICopYmFzZXY7Ci0gICAgY29yZV9kaXJfY29uZmlnICpuZXcgPSAoY29yZV9kaXJfY29uZmlnICopbmV3djsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvbmY7Ci0gICAgaW50IGk7Ci0gIAotICAgIGNvbmYgPSAoY29yZV9kaXJfY29uZmlnICopYXBfcGFsbG9jKGEsIHNpemVvZihjb3JlX2Rpcl9jb25maWcpKTsKLSAgICBtZW1jcHkoKGNoYXIgKiljb25mLCAoY29uc3QgY2hhciAqKWJhc2UsIHNpemVvZihjb3JlX2Rpcl9jb25maWcpKTsKLSAgICBpZiAoYmFzZS0+cmVzcG9uc2VfY29kZV9zdHJpbmdzKSB7Ci0JY29uZi0+cmVzcG9uc2VfY29kZV9zdHJpbmdzID0KLQkgICAgYXBfcGFsbG9jKGEsIHNpemVvZigqY29uZi0+cmVzcG9uc2VfY29kZV9zdHJpbmdzKQotCQkgICAgICAqIFJFU1BPTlNFX0NPREVTKTsKLQltZW1jcHkoY29uZi0+cmVzcG9uc2VfY29kZV9zdHJpbmdzLCBiYXNlLT5yZXNwb25zZV9jb2RlX3N0cmluZ3MsCi0JICAgICAgIHNpemVvZigqY29uZi0+cmVzcG9uc2VfY29kZV9zdHJpbmdzKSAqIFJFU1BPTlNFX0NPREVTKTsKLSAgICB9Ci0gICAgCi0gICAgY29uZi0+ZCA9IG5ldy0+ZDsKLSAgICBjb25mLT5kX2lzX2ZubWF0Y2ggPSBuZXctPmRfaXNfZm5tYXRjaDsKLSAgICBjb25mLT5kX2NvbXBvbmVudHMgPSBuZXctPmRfY29tcG9uZW50czsKLSAgICBjb25mLT5yID0gbmV3LT5yOwotICAgIAotICAgIGlmIChuZXctPm9wdHMgJiBPUFRfVU5TRVQpIHsKLQkvKiB0aGVyZSB3YXMgbm8gZXhwbGljaXQgc2V0dGluZyBvZiBuZXctPm9wdHMsIHNvIHdlIG1lcmdlCi0JICogcHJlc2VydmUgdGhlIGludmFyaWFudCAob3B0c19hZGQgJiBvcHRzX3JlbW92ZSkgPT0gMAotCSAqLwotCWNvbmYtPm9wdHNfYWRkID0gKGNvbmYtPm9wdHNfYWRkICYgfm5ldy0+b3B0c19yZW1vdmUpIHwgbmV3LT5vcHRzX2FkZDsKLQljb25mLT5vcHRzX3JlbW92ZSA9IChjb25mLT5vcHRzX3JlbW92ZSAmIH5uZXctPm9wdHNfYWRkKQotCSAgICAgICAgICAgICAgICAgICAgfCBuZXctPm9wdHNfcmVtb3ZlOwotCWNvbmYtPm9wdHMgPSAoY29uZi0+b3B0cyAmIH5jb25mLT5vcHRzX3JlbW92ZSkgfCBjb25mLT5vcHRzX2FkZDsKLSAgICAgICAgaWYgKChiYXNlLT5vcHRzICYgT1BUX0lOQ05PRVhFQykgJiYgKG5ldy0+b3B0cyAmIE9QVF9JTkNMVURFUykpIHsKLSAgICAgICAgICAgIGNvbmYtPm9wdHMgPSAoY29uZi0+b3B0cyAmIH5PUFRfSU5DTk9FWEVDKSB8IE9QVF9JTkNMVURFUzsKLQl9Ci0gICAgfQotICAgIGVsc2UgewotCS8qIG90aGVyd2lzZSB3ZSBqdXN0IGNvcHksIGJlY2F1c2UgYW4gZXhwbGljaXQgb3B0cyBzZXR0aW5nCi0JICogb3ZlcnJpZGVzIGFsbCBlYXJsaWVyICsvLSBtb2RpZmllcnMKLQkgKi8KLQljb25mLT5vcHRzID0gbmV3LT5vcHRzOwotCWNvbmYtPm9wdHNfYWRkID0gbmV3LT5vcHRzX2FkZDsKLQljb25mLT5vcHRzX3JlbW92ZSA9IG5ldy0+b3B0c19yZW1vdmU7Ci0gICAgfQotCi0gICAgaWYgKCEobmV3LT5vdmVycmlkZSAmIE9SX1VOU0VUKSkgewotICAgICAgICBjb25mLT5vdmVycmlkZSA9IG5ldy0+b3ZlcnJpZGU7Ci0gICAgfQotICAgIGlmIChuZXctPmFwX2RlZmF1bHRfdHlwZSkgewotICAgICAgICBjb25mLT5hcF9kZWZhdWx0X3R5cGUgPSBuZXctPmFwX2RlZmF1bHRfdHlwZTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKG5ldy0+YXBfYXV0aF90eXBlKSB7Ci0gICAgICAgIGNvbmYtPmFwX2F1dGhfdHlwZSA9IG5ldy0+YXBfYXV0aF90eXBlOwotICAgIH0KLSAgICBpZiAobmV3LT5hcF9hdXRoX25hbWUpIHsKLSAgICAgICAgY29uZi0+YXBfYXV0aF9uYW1lID0gbmV3LT5hcF9hdXRoX25hbWU7Ci0gICAgfQotICAgIGlmIChuZXctPmFwX3JlcXVpcmVzKSB7Ci0gICAgICAgIGNvbmYtPmFwX3JlcXVpcmVzID0gbmV3LT5hcF9yZXF1aXJlczsKLSAgICB9Ci0KLSAgICBpZiAobmV3LT5yZXNwb25zZV9jb2RlX3N0cmluZ3MpIHsKLQlpZiAoY29uZi0+cmVzcG9uc2VfY29kZV9zdHJpbmdzID09IE5VTEwpIHsKLQkgICAgY29uZi0+cmVzcG9uc2VfY29kZV9zdHJpbmdzID0gYXBfcGFsbG9jKGEsCi0JCXNpemVvZigqY29uZi0+cmVzcG9uc2VfY29kZV9zdHJpbmdzKSAqIFJFU1BPTlNFX0NPREVTKTsKLQkgICAgbWVtY3B5KGNvbmYtPnJlc3BvbnNlX2NvZGVfc3RyaW5ncywgbmV3LT5yZXNwb25zZV9jb2RlX3N0cmluZ3MsCi0JCSAgIHNpemVvZigqY29uZi0+cmVzcG9uc2VfY29kZV9zdHJpbmdzKSAqIFJFU1BPTlNFX0NPREVTKTsKLQl9Ci0JZWxzZSB7Ci0JICAgIGZvciAoaSA9IDA7IGkgPCBSRVNQT05TRV9DT0RFUzsgKytpKSB7Ci0JICAgICAgICBpZiAobmV3LT5yZXNwb25zZV9jb2RlX3N0cmluZ3NbaV0gIT0gTlVMTCkgewotCQkgICAgY29uZi0+cmVzcG9uc2VfY29kZV9zdHJpbmdzW2ldCi0JCSAgICAgICAgPSBuZXctPnJlc3BvbnNlX2NvZGVfc3RyaW5nc1tpXTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgICBpZiAobmV3LT5ob3N0bmFtZV9sb29rdXBzICE9IEhPU1ROQU1FX0xPT0tVUF9VTlNFVCkgewotCWNvbmYtPmhvc3RuYW1lX2xvb2t1cHMgPSBuZXctPmhvc3RuYW1lX2xvb2t1cHM7Ci0gICAgfQotICAgIGlmICgobmV3LT5kb19yZmMxNDEzICYgMikgPT0gMCkgewotICAgICAgICBjb25mLT5kb19yZmMxNDEzID0gbmV3LT5kb19yZmMxNDEzOwotICAgIH0KLSAgICBpZiAoKG5ldy0+Y29udGVudF9tZDUgJiAyKSA9PSAwKSB7Ci0gICAgICAgIGNvbmYtPmNvbnRlbnRfbWQ1ID0gbmV3LT5jb250ZW50X21kNTsKLSAgICB9Ci0gICAgaWYgKG5ldy0+dXNlX2Nhbm9uaWNhbF9uYW1lICE9IFVTRV9DQU5PTklDQUxfTkFNRV9VTlNFVCkgewotCWNvbmYtPnVzZV9jYW5vbmljYWxfbmFtZSA9IG5ldy0+dXNlX2Nhbm9uaWNhbF9uYW1lOwotICAgIH0KLQotI2lmZGVmIFJMSU1JVF9DUFUKLSAgICBpZiAobmV3LT5saW1pdF9jcHUpIHsKLSAgICAgICAgY29uZi0+bGltaXRfY3B1ID0gbmV3LT5saW1pdF9jcHU7Ci0gICAgfQotI2VuZGlmCi0jaWYgZGVmaW5lZChSTElNSVRfREFUQSkgfHwgZGVmaW5lZChSTElNSVRfVk1FTSkgfHwgZGVmaW5lZChSTElNSVRfQVMpCi0gICAgaWYgKG5ldy0+bGltaXRfbWVtKSB7Ci0gICAgICAgIGNvbmYtPmxpbWl0X21lbSA9IG5ldy0+bGltaXRfbWVtOwotICAgIH0KLSNlbmRpZgotI2lmZGVmIFJMSU1JVF9OUFJPQyAgICAKLSAgICBpZiAobmV3LT5saW1pdF9ucHJvYykgewotICAgICAgICBjb25mLT5saW1pdF9ucHJvYyA9IG5ldy0+bGltaXRfbnByb2M7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpZiAobmV3LT5saW1pdF9yZXFfYm9keSkgewotICAgICAgICBjb25mLT5saW1pdF9yZXFfYm9keSA9IG5ldy0+bGltaXRfcmVxX2JvZHk7Ci0gICAgfQotICAgIGNvbmYtPnNlYyA9IGFwX2FwcGVuZF9hcnJheXMoYSwgYmFzZS0+c2VjLCBuZXctPnNlYyk7Ci0KLSAgICBpZiAobmV3LT5zYXRpc2Z5ICE9IFNBVElTRllfTk9TUEVDKSB7Ci0gICAgICAgIGNvbmYtPnNhdGlzZnkgPSBuZXctPnNhdGlzZnk7Ci0gICAgfQotCi0jaWZkZWYgV0lOMzIKLSAgICBpZiAobmV3LT5zY3JpcHRfaW50ZXJwcmV0ZXJfc291cmNlICE9IElOVEVSUFJFVEVSX1NPVVJDRV9VTlNFVCkgewotICAgICAgICBjb25mLT5zY3JpcHRfaW50ZXJwcmV0ZXJfc291cmNlID0gbmV3LT5zY3JpcHRfaW50ZXJwcmV0ZXJfc291cmNlOwotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKG5ldy0+c2VydmVyX3NpZ25hdHVyZSAhPSBzcnZfc2lnX3Vuc2V0KSB7Ci0JY29uZi0+c2VydmVyX3NpZ25hdHVyZSA9IG5ldy0+c2VydmVyX3NpZ25hdHVyZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKHZvaWQqKWNvbmY7Ci19Ci0KLXN0YXRpYyB2b2lkICpjcmVhdGVfY29yZV9zZXJ2ZXJfY29uZmlnKHBvb2wgKmEsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgY29yZV9zZXJ2ZXJfY29uZmlnICpjb25mOwotICAgIGludCBpc192aXJ0dWFsID0gcy0+aXNfdmlydHVhbDsKLSAgCi0gICAgY29uZiA9IChjb3JlX3NlcnZlcl9jb25maWcgKilhcF9wY2FsbG9jKGEsIHNpemVvZihjb3JlX3NlcnZlcl9jb25maWcpKTsKLSNpZmRlZiBHUFJPRgotICAgIGNvbmYtPmdwcm9mX2RpciA9IE5VTEw7Ci0jZW5kaWYKLSAgICBjb25mLT5hY2Nlc3NfbmFtZSA9IGlzX3ZpcnR1YWwgPyBOVUxMIDogREVGQVVMVF9BQ0NFU1NfRk5BTUU7Ci0gICAgY29uZi0+YXBfZG9jdW1lbnRfcm9vdCA9IGlzX3ZpcnR1YWwgPyBOVUxMIDogRE9DVU1FTlRfTE9DQVRJT047Ci0gICAgY29uZi0+c2VjID0gYXBfbWFrZV9hcnJheShhLCA0MCwgc2l6ZW9mKHZvaWQgKikpOwotICAgIGNvbmYtPnNlY191cmwgPSBhcF9tYWtlX2FycmF5KGEsIDQwLCBzaXplb2Yodm9pZCAqKSk7Ci0gICAgCi0gICAgcmV0dXJuICh2b2lkICopY29uZjsKLX0KLQotc3RhdGljIHZvaWQgKm1lcmdlX2NvcmVfc2VydmVyX2NvbmZpZ3MocG9vbCAqcCwgdm9pZCAqYmFzZXYsIHZvaWQgKnZpcnR2KQotewotICAgIGNvcmVfc2VydmVyX2NvbmZpZyAqYmFzZSA9IChjb3JlX3NlcnZlcl9jb25maWcgKiliYXNldjsKLSAgICBjb3JlX3NlcnZlcl9jb25maWcgKnZpcnQgPSAoY29yZV9zZXJ2ZXJfY29uZmlnICopdmlydHY7Ci0gICAgY29yZV9zZXJ2ZXJfY29uZmlnICpjb25mOwotCi0gICAgY29uZiA9IChjb3JlX3NlcnZlcl9jb25maWcgKilhcF9wY2FsbG9jKHAsIHNpemVvZihjb3JlX3NlcnZlcl9jb25maWcpKTsKLSAgICAqY29uZiA9ICp2aXJ0OwotICAgIGlmICghY29uZi0+YWNjZXNzX25hbWUpIHsKLSAgICAgICAgY29uZi0+YWNjZXNzX25hbWUgPSBiYXNlLT5hY2Nlc3NfbmFtZTsKLSAgICB9Ci0gICAgaWYgKCFjb25mLT5hcF9kb2N1bWVudF9yb290KSB7Ci0gICAgICAgIGNvbmYtPmFwX2RvY3VtZW50X3Jvb3QgPSBiYXNlLT5hcF9kb2N1bWVudF9yb290OwotICAgIH0KLSAgICBjb25mLT5zZWMgPSBhcF9hcHBlbmRfYXJyYXlzKHAsIGJhc2UtPnNlYywgdmlydC0+c2VjKTsKLSAgICBjb25mLT5zZWNfdXJsID0gYXBfYXBwZW5kX2FycmF5cyhwLCBiYXNlLT5zZWNfdXJsLCB2aXJ0LT5zZWNfdXJsKTsKLQotICAgIHJldHVybiBjb25mOwotfQotCi0vKiBBZGQgcGVyLWRpcmVjdG9yeSBjb25maWd1cmF0aW9uIGVudHJ5IChmb3IgPGRpcmVjdG9yeT4gc2VjdGlvbik7Ci0gKiB0aGVzZSBhcmUgcGFydCBvZiB0aGUgY29yZSBzZXJ2ZXIgY29uZmlnLgotICovCi0KLUNPUkVfRVhQT1JUKHZvaWQpIGFwX2FkZF9wZXJfZGlyX2NvbmYoc2VydmVyX3JlYyAqcywgdm9pZCAqZGlyX2NvbmZpZykKLXsKLSAgICBjb3JlX3NlcnZlcl9jb25maWcgKnNjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywKLQkJCQkJCSAgICAgJmNvcmVfbW9kdWxlKTsKLSAgICB2b2lkICoqbmV3X3NwYWNlID0gKHZvaWQgKiopYXBfcHVzaF9hcnJheShzY29uZi0+c2VjKTsKLSAgICAKLSAgICAqbmV3X3NwYWNlID0gZGlyX2NvbmZpZzsKLX0KLQotQ09SRV9FWFBPUlQodm9pZCkgYXBfYWRkX3Blcl91cmxfY29uZihzZXJ2ZXJfcmVjICpzLCB2b2lkICp1cmxfY29uZmlnKQotewotICAgIGNvcmVfc2VydmVyX2NvbmZpZyAqc2NvbmYgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLAotCQkJCQkJICAgICAmY29yZV9tb2R1bGUpOwotICAgIHZvaWQgKipuZXdfc3BhY2UgPSAodm9pZCAqKilhcF9wdXNoX2FycmF5KHNjb25mLT5zZWNfdXJsKTsKLSAgICAKLSAgICAqbmV3X3NwYWNlID0gdXJsX2NvbmZpZzsKLX0KLQotQ09SRV9FWFBPUlQodm9pZCkgYXBfYWRkX2ZpbGVfY29uZihjb3JlX2Rpcl9jb25maWcgKmNvbmYsIHZvaWQgKnVybF9jb25maWcpCi17Ci0gICAgdm9pZCAqKm5ld19zcGFjZSA9ICh2b2lkICoqKWFwX3B1c2hfYXJyYXkoY29uZi0+c2VjKTsKLSAgICAKLSAgICAqbmV3X3NwYWNlID0gdXJsX2NvbmZpZzsKLX0KLQotLyogY29yZV9yZW9yZGVyX2RpcmVjdG9yaWVzIHJlb3JkZXJzIHRoZSBkaXJlY3Rvcnkgc2VjdGlvbnMgc3VjaCB0aGF0IHRoZQotICogMS1jb21wb25lbnQgc2VjdGlvbnMgY29tZSBmaXJzdCwgdGhlbiB0aGUgMi1jb21wb25lbnQsIGFuZCBzbyBvbiwgZmluYWxseQotICogZm9sbG93ZWQgYnkgdGhlICJzcGVjaWFsIiBzZWN0aW9ucy4gIEEgc2VjdGlvbiBpcyAic3BlY2lhbCIgaWYgaXQncyBhIHJlZ2V4LAotICogb3IgaWYgaXQgZG9lc24ndCBzdGFydCB3aXRoIC8gLS0gY29uc2lkZXIgcHJveHk6IG1hdGNoaW5nLiAgQWxsIG1vdmVtZW50cwotICogYXJlIGluLW9yZGVyIHRvIHByZXNlcnZlIHRoZSBvcmRlcmluZyBvZiB0aGUgc2VjdGlvbnMgZnJvbSB0aGUgY29uZmlnIGZpbGVzLgotICogU2VlIGRpcmVjdG9yeV93YWxrKCkuCi0gKi8KLQotI2lmZGVmIEhBVkVfRFJJVkVfTEVUVEVSUwotI2RlZmluZSBJU19TUEVDSUFMKGVudHJ5X2NvcmUpCVwKLSAgICAoKGVudHJ5X2NvcmUpLT5yICE9IE5VTEwgXAotCXx8ICgoZW50cnlfY29yZSktPmRbMF0gIT0gJy8nICYmIChlbnRyeV9jb3JlKS0+ZFsxXSAhPSAnOicpKQotI2Vsc2UKLSNkZWZpbmUgSVNfU1BFQ0lBTChlbnRyeV9jb3JlKQlcCi0gICAgKChlbnRyeV9jb3JlKS0+ciAhPSBOVUxMIHx8IChlbnRyeV9jb3JlKS0+ZFswXSAhPSAnLycpCi0jZW5kaWYKLQotLyogV2UgbmVlZCB0byBkbyBhIHN0YWJsZSBzb3J0LCBxc29ydCBpc24ndCBzdGFibGUuICBTbyB0byBtYWtlIGl0IHN0YWJsZQotICogd2UnbGwgYmUgbWFpbnRhaW5pbmcgdGhlIG9yaWdpbmFsIGluZGV4IGludG8gdGhlIGxpc3QsIGFuZCB1c2luZyBpdAotICogYXMgdGhlIG1pbm9yIGtleSBkdXJpbmcgc29ydGluZy4gIFRoZSBtYWpvciBrZXkgaXMgdGhlIG51bWJlciBvZgotICogY29tcG9uZW50cyAod2hlcmUgYSAic3BlY2lhbCIgc2VjdGlvbiBoYXMgaW5maW5pdGUgY29tcG9uZW50cykuCi0gKi8KLXN0cnVjdCByZW9yZGVyX3NvcnRfcmVjIHsKLSAgICB2b2lkICplbHQ7Ci0gICAgaW50IG9yaWdfaW5kZXg7Ci19OwotCi1zdGF0aWMgaW50IHJlb3JkZXJfc29ydGVyKGNvbnN0IHZvaWQgKnZhLCBjb25zdCB2b2lkICp2YikKLXsKLSAgICBjb25zdCBzdHJ1Y3QgcmVvcmRlcl9zb3J0X3JlYyAqYSA9IHZhOwotICAgIGNvbnN0IHN0cnVjdCByZW9yZGVyX3NvcnRfcmVjICpiID0gdmI7Ci0gICAgY29yZV9kaXJfY29uZmlnICpjb3JlX2E7Ci0gICAgY29yZV9kaXJfY29uZmlnICpjb3JlX2I7Ci0KLSAgICBjb3JlX2EgPSAoY29yZV9kaXJfY29uZmlnICopYXBfZ2V0X21vZHVsZV9jb25maWcoYS0+ZWx0LCAmY29yZV9tb2R1bGUpOwotICAgIGNvcmVfYiA9IChjb3JlX2Rpcl9jb25maWcgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhiLT5lbHQsICZjb3JlX21vZHVsZSk7Ci0gICAgaWYgKElTX1NQRUNJQUwoY29yZV9hKSkgewotCWlmICghSVNfU1BFQ0lBTChjb3JlX2IpKSB7Ci0JICAgIHJldHVybiAxOwotCX0KLSAgICB9Ci0gICAgZWxzZSBpZiAoSVNfU1BFQ0lBTChjb3JlX2IpKSB7Ci0JcmV0dXJuIC0xOwotICAgIH0KLSAgICBlbHNlIHsKLQkvKiB3ZSBrbm93IHRoZXkncmUgYm90aCBub3Qgc3BlY2lhbCAqLwotCWlmIChjb3JlX2EtPmRfY29tcG9uZW50cyA8IGNvcmVfYi0+ZF9jb21wb25lbnRzKSB7Ci0JICAgIHJldHVybiAtMTsKLQl9Ci0JZWxzZSBpZiAoY29yZV9hLT5kX2NvbXBvbmVudHMgPiBjb3JlX2ItPmRfY29tcG9uZW50cykgewotCSAgICByZXR1cm4gMTsKLQl9Ci0gICAgfQotICAgIC8qIEVpdGhlciB0aGV5J3JlIGJvdGggc3BlY2lhbCwgb3IgdGhleSdyZSBib3RoIG5vdCBzcGVjaWFsIGFuZCBoYXZlIHRoZQotICAgICAqIHNhbWUgbnVtYmVyIG9mIGNvbXBvbmVudHMuICBJbiBhbnkgZXZlbnQsIHdlIG5vdyBoYXZlIHRvIGNvbXBhcmUKLSAgICAgKiB0aGUgbWlub3Iga2V5LiAqLwotICAgIHJldHVybiBhLT5vcmlnX2luZGV4IC0gYi0+b3JpZ19pbmRleDsKLX0KLQotdm9pZCBhcF9jb3JlX3Jlb3JkZXJfZGlyZWN0b3JpZXMocG9vbCAqcCwgc2VydmVyX3JlYyAqcykKLXsKLSAgICBjb3JlX3NlcnZlcl9jb25maWcgKnNjb25mOwotICAgIGFycmF5X2hlYWRlciAqc2VjOwotICAgIHN0cnVjdCByZW9yZGVyX3NvcnRfcmVjICpzb3J0YmluOwotICAgIGludCBuZWx0czsKLSAgICB2b2lkICoqZWx0czsKLSAgICBpbnQgaTsKLSAgICBwb29sICp0bXA7Ci0KLSAgICBzY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsICZjb3JlX21vZHVsZSk7Ci0gICAgc2VjID0gc2NvbmYtPnNlYzsKLSAgICBuZWx0cyA9IHNlYy0+bmVsdHM7Ci0gICAgZWx0cyA9ICh2b2lkICoqKXNlYy0+ZWx0czsKLQotICAgIC8qIHdlIGhhdmUgdG8gYWxsb2NhdGUgdG1wIHNwYWNlIHRvIGRvIGEgc3RhYmxlIHNvcnQgKi8KLSAgICB0bXAgPSBhcF9tYWtlX3N1Yl9wb29sKHApOwotICAgIHNvcnRiaW4gPSBhcF9wYWxsb2ModG1wLCBzZWMtPm5lbHRzICogc2l6ZW9mKCpzb3J0YmluKSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5lbHRzOyArK2kpIHsKLQlzb3J0YmluW2ldLm9yaWdfaW5kZXggPSBpOwotCXNvcnRiaW5baV0uZWx0ID0gZWx0c1tpXTsKLSAgICB9Ci0KLSAgICBxc29ydChzb3J0YmluLCBuZWx0cywgc2l6ZW9mKCpzb3J0YmluKSwgcmVvcmRlcl9zb3J0ZXIpOwotCi0gICAgLyogYW5kIG5vdyBjb3B5IGJhY2sgdG8gdGhlIG9yaWdpbmFsIGFycmF5ICovCi0gICAgZm9yIChpID0gMDsgaSA8IG5lbHRzOyArK2kpIHsKLSAgICAgIGVsdHNbaV0gPSBzb3J0YmluW2ldLmVsdDsKLSAgICB9Ci0KLSAgICBhcF9kZXN0cm95X3Bvb2wodG1wKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhlcmUgYXJlIHNvbWUgZWxlbWVudHMgb2YgdGhlIGNvcmUgY29uZmlnIHN0cnVjdHVyZXMgaW4gd2hpY2gKLSAqIG90aGVyIG1vZHVsZXMgaGF2ZSBhIGxlZ2l0aW1hdGUgaW50ZXJlc3QgKHRoaXMgaXMgdWdseSwgYnV0IG5lY2Vzc2FyeQotICogdG8gcHJlc2VydmUgTkNTQSBiYWNrLWNvbXBhdGliaWxpdHkpLiAgU28sIHdlIGhhdmUgYSBidW5jaCBvZiBhY2Nlc3NvcnMKLSAqIGhlcmUuLi4KLSAqLwotCi1BUElfRVhQT1JUKGludCkgYXBfYWxsb3dfb3B0aW9ucyhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvbmYgPSAKLSAgICAgIChjb3JlX2Rpcl9jb25maWcgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywgJmNvcmVfbW9kdWxlKTsgCi0KLSAgICByZXR1cm4gY29uZi0+b3B0czsgCi19IAotCi1BUElfRVhQT1JUKGludCkgYXBfYWxsb3dfb3ZlcnJpZGVzKHJlcXVlc3RfcmVjICpyKSAKLXsgCi0gICAgY29yZV9kaXJfY29uZmlnICpjb25mOwotICAgIGNvbmYgPSAoY29yZV9kaXJfY29uZmlnICopYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCQkgICAmY29yZV9tb2R1bGUpOyAKLQotICAgIHJldHVybiBjb25mLT5vdmVycmlkZTsgCi19IAotCi1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfYXV0aF90eXBlKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvcmVfZGlyX2NvbmZpZyAqY29uZjsKLQotICAgIGNvbmYgPSAoY29yZV9kaXJfY29uZmlnICopYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCQkgICAmY29yZV9tb2R1bGUpOyAKLSAgICByZXR1cm4gY29uZi0+YXBfYXV0aF90eXBlOwotfQotCi1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfYXV0aF9uYW1lKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvcmVfZGlyX2NvbmZpZyAqY29uZjsKLQotICAgIGNvbmYgPSAoY29yZV9kaXJfY29uZmlnICopYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCQkgICAmY29yZV9tb2R1bGUpOyAKLSAgICByZXR1cm4gY29uZi0+YXBfYXV0aF9uYW1lOwotfQotCi1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfZGVmYXVsdF90eXBlKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvcmVfZGlyX2NvbmZpZyAqY29uZjsKLQotICAgIGNvbmYgPSAoY29yZV9kaXJfY29uZmlnICopYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCQkgICAmY29yZV9tb2R1bGUpOyAKLSAgICByZXR1cm4gY29uZi0+YXBfZGVmYXVsdF90eXBlIAotICAgICAgICAgICAgICAgPyBjb25mLT5hcF9kZWZhdWx0X3R5cGUgCi0gICAgICAgICAgICAgICA6IERFRkFVTFRfQ09OVEVOVF9UWVBFOwotfQotCi1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfZG9jdW1lbnRfcm9vdChyZXF1ZXN0X3JlYyAqcikgLyogRG9uJ3QgdXNlIHRoaXMhICovCi17Ci0gICAgY29yZV9zZXJ2ZXJfY29uZmlnICpjb25mOwotCi0gICAgY29uZiA9IChjb3JlX3NlcnZlcl9jb25maWcgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsCi0JCQkJCQkgICAgICAmY29yZV9tb2R1bGUpOyAKLSAgICByZXR1cm4gY29uZi0+YXBfZG9jdW1lbnRfcm9vdDsKLX0KLQotQVBJX0VYUE9SVChjb25zdCBhcnJheV9oZWFkZXIgKikgYXBfcmVxdWlyZXMocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY29yZV9kaXJfY29uZmlnICpjb25mOwotCi0gICAgY29uZiA9IChjb3JlX2Rpcl9jb25maWcgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywKLQkJCQkJCSAgICZjb3JlX21vZHVsZSk7IAotICAgIHJldHVybiBjb25mLT5hcF9yZXF1aXJlczsKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX3NhdGlzZmllcyhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvbmY7Ci0KLSAgICBjb25mID0gKGNvcmVfZGlyX2NvbmZpZyAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLAotCQkJCQkJICAgJmNvcmVfbW9kdWxlKTsKLQotICAgIHJldHVybiBjb25mLT5zYXRpc2Z5OwotfQotCi0vKiBTaG91bGQgcHJvYmFibHkganVzdCBnZXQgcmlkIG9mIHRoaXMuLi4gdGhlIG9ubHkgY29kZSB0aGF0IGNhcmVzIGlzCi0gKiBwYXJ0IG9mIHRoZSBjb3JlIGFueXdheSAoYW5kIGluIGZhY3QsIGl0IGlzbid0IHB1YmxpY2lzZWQgdG8gb3RoZXIKLSAqIG1vZHVsZXMpLgotICovCi0KLWNoYXIgKmFwX3Jlc3BvbnNlX2NvZGVfc3RyaW5nKHJlcXVlc3RfcmVjICpyLCBpbnQgZXJyb3JfaW5kZXgpCi17Ci0gICAgY29yZV9kaXJfY29uZmlnICpjb25mOwotCi0gICAgY29uZiA9IChjb3JlX2Rpcl9jb25maWcgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywKLQkJCQkJCSAgICZjb3JlX21vZHVsZSk7IAotCi0gICAgaWYgKGNvbmYtPnJlc3BvbnNlX2NvZGVfc3RyaW5ncyA9PSBOVUxMKSB7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3NbZXJyb3JfaW5kZXhdOwotfQotCi0KLS8qIENvZGUgZnJvbSBIYXJhbGQgSGFuY2hlLU9sc2VuIDxoYW5jaGVAaW1mLnVuaXQubm8+ICovCi1zdGF0aWMgYXBfaW5saW5lIHZvaWQgZG9fZG91YmxlX3JldmVyc2UgKGNvbm5fcmVjICpjb25uKQotewotICAgIHN0cnVjdCBob3N0ZW50ICpocHRyOwotCi0gICAgaWYgKGNvbm4tPmRvdWJsZV9yZXZlcnNlKSB7Ci0JLyogYWxyZWFkeSBkb25lICovCi0JcmV0dXJuOwotICAgIH0KLSAgICBpZiAoY29ubi0+cmVtb3RlX2hvc3QgPT0gTlVMTCB8fCBjb25uLT5yZW1vdGVfaG9zdFswXSA9PSAnXDAnKSB7Ci0JLyogc2luZ2xlIHJldmVyc2UgZmFpbGVkLCBzbyBkb24ndCBib3RoZXIgKi8KLQljb25uLT5kb3VibGVfcmV2ZXJzZSA9IC0xOwotCXJldHVybjsKLSAgICB9Ci0gICAgaHB0ciA9IGdldGhvc3RieW5hbWUoY29ubi0+cmVtb3RlX2hvc3QpOwotICAgIGlmIChocHRyKSB7Ci0JY2hhciAqKmhhZGRyOwotCi0JZm9yIChoYWRkciA9IGhwdHItPmhfYWRkcl9saXN0OyAqaGFkZHI7IGhhZGRyKyspIHsKLQkgICAgaWYgKCgoc3RydWN0IGluX2FkZHIgKikoKmhhZGRyKSktPnNfYWRkcgotCQk9PSBjb25uLT5yZW1vdGVfYWRkci5zaW5fYWRkci5zX2FkZHIpIHsKLQkJY29ubi0+ZG91YmxlX3JldmVyc2UgPSAxOwotCQlyZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIGNvbm4tPmRvdWJsZV9yZXZlcnNlID0gLTE7Ci19Ci0KLUFQSV9FWFBPUlQoY29uc3QgY2hhciAqKSBhcF9nZXRfcmVtb3RlX2hvc3QoY29ubl9yZWMgKmNvbm4sIHZvaWQgKmRpcl9jb25maWcsCi0JCQkJCSAgICBpbnQgdHlwZSkKLXsKLSAgICBzdHJ1Y3QgaW5fYWRkciAqaWFkZHI7Ci0gICAgc3RydWN0IGhvc3RlbnQgKmhwdHI7Ci0gICAgaW50IGhvc3RuYW1lX2xvb2t1cHM7Ci0gICAgaW50IG9sZF9zdGF0ID0gU0VSVkVSX0RFQUQ7CS8qIHdlIHNob3VsZG4ndCBldmVyIGJlIGluIHRoaXMgc3RhdGUgKi8KLQotICAgIC8qIElmIHdlIGhhdmVuJ3QgY2hlY2tlZCB0aGUgaG9zdCBuYW1lLCBhbmQgd2Ugd2FudCB0byAqLwotICAgIGlmIChkaXJfY29uZmlnKSB7Ci0JaG9zdG5hbWVfbG9va3VwcyA9Ci0JICAgICgoY29yZV9kaXJfY29uZmlnICopYXBfZ2V0X21vZHVsZV9jb25maWcoZGlyX2NvbmZpZywgJmNvcmVfbW9kdWxlKSkKLQkJLT5ob3N0bmFtZV9sb29rdXBzOwotCWlmIChob3N0bmFtZV9sb29rdXBzID09IEhPU1ROQU1FX0xPT0tVUF9VTlNFVCkgewotCSAgICBob3N0bmFtZV9sb29rdXBzID0gSE9TVE5BTUVfTE9PS1VQX09GRjsKLQl9Ci0gICAgfQotICAgIGVsc2UgewotCS8qIHRoZSBkZWZhdWx0ICovCi0JaG9zdG5hbWVfbG9va3VwcyA9IEhPU1ROQU1FX0xPT0tVUF9PRkY7Ci0gICAgfQotCi0gICAgaWYgKHR5cGUgIT0gUkVNT1RFX05PTE9PS1VQCi0JJiYgY29ubi0+cmVtb3RlX2hvc3QgPT0gTlVMTAotCSYmICh0eXBlID09IFJFTU9URV9ET1VCTEVfUkVWCi0JICAgIHx8IGhvc3RuYW1lX2xvb2t1cHMgIT0gSE9TVE5BTUVfTE9PS1VQX09GRikpIHsKLQlvbGRfc3RhdCA9IGFwX3VwZGF0ZV9jaGlsZF9zdGF0dXMoY29ubi0+Y2hpbGRfbnVtLCBTRVJWRVJfQlVTWV9ETlMsCi0JCQkJCSAgKHJlcXVlc3RfcmVjKilOVUxMKTsKLQlpYWRkciA9ICYoY29ubi0+cmVtb3RlX2FkZHIuc2luX2FkZHIpOwotCWhwdHIgPSBnZXRob3N0YnlhZGRyKChjaGFyICopaWFkZHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkciksIEFGX0lORVQpOwotCWlmIChocHRyICE9IE5VTEwpIHsKLQkgICAgY29ubi0+cmVtb3RlX2hvc3QgPSBhcF9wc3RyZHVwKGNvbm4tPnBvb2wsICh2b2lkICopaHB0ci0+aF9uYW1lKTsKLQkgICAgYXBfc3RyX3RvbG93ZXIoY29ubi0+cmVtb3RlX2hvc3QpOwotCSAgIAotCSAgICBpZiAoaG9zdG5hbWVfbG9va3VwcyA9PSBIT1NUTkFNRV9MT09LVVBfRE9VQkxFKSB7Ci0JCWRvX2RvdWJsZV9yZXZlcnNlKGNvbm4pOwotCQlpZiAoY29ubi0+ZG91YmxlX3JldmVyc2UgIT0gMSkgewotCQkgICAgY29ubi0+cmVtb3RlX2hvc3QgPSBOVUxMOwotCQl9Ci0JICAgIH0KLQl9Ci0JLyogaWYgZmFpbGVkLCBzZXQgaXQgdG8gdGhlIE5VTEwgc3RyaW5nIHRvIGluZGljYXRlIGVycm9yICovCi0JaWYgKGNvbm4tPnJlbW90ZV9ob3N0ID09IE5VTEwpIHsKLQkgICAgY29ubi0+cmVtb3RlX2hvc3QgPSAiIjsKLQl9Ci0gICAgfQotICAgIGlmICh0eXBlID09IFJFTU9URV9ET1VCTEVfUkVWKSB7Ci0JZG9fZG91YmxlX3JldmVyc2UoY29ubik7Ci0JaWYgKGNvbm4tPmRvdWJsZV9yZXZlcnNlID09IC0xKSB7Ci0JICAgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0gICAgaWYgKG9sZF9zdGF0ICE9IFNFUlZFUl9ERUFEKSB7Ci0JKHZvaWQpYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhjb25uLT5jaGlsZF9udW0sIG9sZF9zdGF0LAotCQkJCSAgICAgKHJlcXVlc3RfcmVjKilOVUxMKTsKLSAgICB9Ci0KLS8qCi0gKiBSZXR1cm4gdGhlIGRlc2lyZWQgaW5mb3JtYXRpb247IGVpdGhlciB0aGUgcmVtb3RlIEROUyBuYW1lLCBpZiBmb3VuZCwKLSAqIG9yIGVpdGhlciBOVUxMIChpZiB0aGUgaG9zdG5hbWUgd2FzIHJlcXVlc3RlZCkgb3IgdGhlIElQIGFkZHJlc3MKLSAqIChpZiBhbnkgaWRlbnRpZmllciB3YXMgcmVxdWVzdGVkKS4KLSAqLwotICAgIGlmIChjb25uLT5yZW1vdGVfaG9zdCAhPSBOVUxMICYmIGNvbm4tPnJlbW90ZV9ob3N0WzBdICE9ICdcMCcpIHsKLQlyZXR1cm4gY29ubi0+cmVtb3RlX2hvc3Q7Ci0gICAgfQotICAgIGVsc2UgewotCWlmICh0eXBlID09IFJFTU9URV9IT1NUIHx8IHR5cGUgPT0gUkVNT1RFX0RPVUJMRV9SRVYpIHsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgewotCSAgICByZXR1cm4gY29ubi0+cmVtb3RlX2lwOwotCX0KLSAgICB9Ci19Ci0KLUFQSV9FWFBPUlQoY29uc3QgY2hhciAqKSBhcF9nZXRfcmVtb3RlX2xvZ25hbWUocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY29yZV9kaXJfY29uZmlnICpkaXJfY29uZjsKLQotICAgIGlmIChyLT5jb25uZWN0aW9uLT5yZW1vdGVfbG9nbmFtZSAhPSBOVUxMKSB7Ci0JcmV0dXJuIHItPmNvbm5lY3Rpb24tPnJlbW90ZV9sb2duYW1lOwotICAgIH0KLQotLyogSWYgd2UgaGF2ZW4ndCBjaGVja2VkIHRoZSBpZGVudGl0eSwgYW5kIHdlIHdhbnQgdG8gKi8KLSAgICBkaXJfY29uZiA9IChjb3JlX2Rpcl9jb25maWcgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywKLQkJCQkJCSAgICAgICAmY29yZV9tb2R1bGUpOwotCi0gICAgaWYgKGRpcl9jb25mLT5kb19yZmMxNDEzICYgMSkgewotCXJldHVybiBhcF9yZmMxNDEzKHItPmNvbm5lY3Rpb24sIHItPnNlcnZlcik7Ci0gICAgfQotICAgIGVsc2UgewotCXJldHVybiBOVUxMOwotICAgIH0KLX0KLQotLyogVGhlcmUgYXJlIHR3byBvcHRpb25zIHJlZ2FyZGluZyB3aGF0IHRoZSAibmFtZSIgb2YgYSBzZXJ2ZXIgaXMuICBUaGUKLSAqICJjYW5vbmljYWwiIG5hbWUgYXMgZGVmaW5lZCBieSBTZXJ2ZXJOYW1lIGFuZCBQb3J0LCBvciB0aGUgImNsaWVudCdzCi0gKiBuYW1lIiBhcyBzdXBwbGllZCBieSBhIHBvc3NpYmxlIEhvc3Q6IGhlYWRlciBvciBmdWxsIFVSSS4gIFdlIG5ldmVyCi0gKiB0cnVzdCB0aGUgcG9ydCBwYXNzZWQgaW4gdGhlIGNsaWVudCdzIGhlYWRlcnMsIHdlIGFsd2F5cyB1c2UgdGhlCi0gKiBwb3J0IG9mIHRoZSBhY3R1YWwgc29ja2V0LgotICoKLSAqIFRoZSBETlMgb3B0aW9uIHRvIFVzZUNhbm9uaWNhbE5hbWUgY2F1c2VzIHRoaXMgcm91dGluZSB0byBkbyBhCi0gKiByZXZlcnNlIGxvb2t1cCBvbiB0aGUgbG9jYWwgSVAgYWRkcmVzcyBvZiB0aGUgY29ubmVjdGlvbmEgYW5kIHVzZQotICogdGhhdCBmb3IgdGhlIFNlcnZlck5hbWUuIFRoaXMgbWFrZXMgaXRzIHZhbHVlIG1vcmUgcmVsaWFibGUgd2hpbGUKLSAqIGF0IHRoZSBzYW1lIHRpbWUgYWxsb3dpbmcgRGVtb24ncyBtYWdpYyB2aXJ0dWFsIGhvc3RpbmcgdG8gd29yay4KLSAqIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgRE5TIGxvb2t1cHMgYXJlIHN1ZmZpY2llbnRseSBxdWljay4uLgotICogLS0gZmFuZiAxOTk4LTEwLTAzCi0gKi8KLUFQSV9FWFBPUlQoY29uc3QgY2hhciAqKSBhcF9nZXRfc2VydmVyX25hbWUocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY29ubl9yZWMgKmNvbm4gPSByLT5jb25uZWN0aW9uOwotICAgIGNvcmVfZGlyX2NvbmZpZyAqZDsKLQotICAgIGQgPSAoY29yZV9kaXJfY29uZmlnICopYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCQkmY29yZV9tb2R1bGUpOwotCi0gICAgaWYgKGQtPnVzZV9jYW5vbmljYWxfbmFtZSA9PSBVU0VfQ0FOT05JQ0FMX05BTUVfT0ZGKSB7Ci0gICAgICAgIHJldHVybiByLT5ob3N0bmFtZSA/IHItPmhvc3RuYW1lIDogci0+c2VydmVyLT5zZXJ2ZXJfaG9zdG5hbWU7Ci0gICAgfQotICAgIGlmIChkLT51c2VfY2Fub25pY2FsX25hbWUgPT0gVVNFX0NBTk9OSUNBTF9OQU1FX0ROUykgewotICAgICAgICBpZiAoY29ubi0+bG9jYWxfaG9zdCA9PSBOVUxMKSB7Ci0JICAgIHN0cnVjdCBpbl9hZGRyICppYWRkcjsKLQkgICAgc3RydWN0IGhvc3RlbnQgKmhwdHI7Ci0gICAgICAgICAgICBpbnQgb2xkX3N0YXQ7Ci0JICAgIG9sZF9zdGF0ID0gYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhjb25uLT5jaGlsZF9udW0sCi0JCQkJCSAgICAgIFNFUlZFUl9CVVNZX0ROUywgcik7Ci0JICAgIGlhZGRyID0gJihjb25uLT5sb2NhbF9hZGRyLnNpbl9hZGRyKTsKLQkgICAgaHB0ciA9IGdldGhvc3RieWFkZHIoKGNoYXIgKilpYWRkciwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSwKLQkJCQkgQUZfSU5FVCk7Ci0JICAgIGlmIChocHRyICE9IE5VTEwpIHsKLQkgICAgICAgIGNvbm4tPmxvY2FsX2hvc3QgPSBhcF9wc3RyZHVwKGNvbm4tPnBvb2wsCi0JCQkJCSAgICAgICh2b2lkICopaHB0ci0+aF9uYW1lKTsKLQkJYXBfc3RyX3RvbG93ZXIoY29ubi0+bG9jYWxfaG9zdCk7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JICAgICAgICBjb25uLT5sb2NhbF9ob3N0ID0gYXBfcHN0cmR1cChjb25uLT5wb29sLAotCQkJCQkgICAgICByLT5zZXJ2ZXItPnNlcnZlcl9ob3N0bmFtZSk7Ci0JICAgIH0KLQkgICAgKHZvaWQpIGFwX3VwZGF0ZV9jaGlsZF9zdGF0dXMoY29ubi0+Y2hpbGRfbnVtLCBvbGRfc3RhdCwgcik7Ci0JfQotCXJldHVybiBjb25uLT5sb2NhbF9ob3N0OwotICAgIH0KLSAgICAvKiBkZWZhdWx0ICovCi0gICAgcmV0dXJuIHItPnNlcnZlci0+c2VydmVyX2hvc3RuYW1lOwotfQotCi1BUElfRVhQT1JUKHVuc2lnbmVkKSBhcF9nZXRfc2VydmVyX3BvcnQoY29uc3QgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgdW5zaWduZWQgcG9ydDsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmQgPQotICAgICAgKGNvcmVfZGlyX2NvbmZpZyAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLCAmY29yZV9tb2R1bGUpOwotICAgIAotICAgIHBvcnQgPSByLT5zZXJ2ZXItPnBvcnQgPyByLT5zZXJ2ZXItPnBvcnQgOiBhcF9kZWZhdWx0X3BvcnQocik7Ci0KLSAgICBpZiAoZC0+dXNlX2Nhbm9uaWNhbF9uYW1lID09IFVTRV9DQU5PTklDQUxfTkFNRV9PRkYKLQl8fCBkLT51c2VfY2Fub25pY2FsX25hbWUgPT0gVVNFX0NBTk9OSUNBTF9OQU1FX0ROUykgewotICAgICAgICByZXR1cm4gci0+aG9zdG5hbWUgPyBudG9ocyhyLT5jb25uZWN0aW9uLT5sb2NhbF9hZGRyLnNpbl9wb3J0KQotCQkJICAgOiBwb3J0OwotICAgIH0KLSAgICAvKiBkZWZhdWx0ICovCi0gICAgcmV0dXJuIHBvcnQ7Ci19Ci0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9jb25zdHJ1Y3RfdXJsKHBvb2wgKnAsIGNvbnN0IGNoYXIgKnVyaSwKLQkJCQkgICAgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgdW5zaWduZWQgcG9ydCA9IGFwX2dldF9zZXJ2ZXJfcG9ydChyKTsKLSAgICBjb25zdCBjaGFyICpob3N0ID0gYXBfZ2V0X3NlcnZlcl9uYW1lKHIpOwotCi0gICAgaWYgKGFwX2lzX2RlZmF1bHRfcG9ydChwb3J0LCByKSkgewotCXJldHVybiBhcF9wc3RyY2F0KHAsIGFwX2h0dHBfbWV0aG9kKHIpLCAiOi8vIiwgaG9zdCwgdXJpLCBOVUxMKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFwX3BzcHJpbnRmKHAsICIlczovLyVzOiV1JXMiLCBhcF9odHRwX21ldGhvZChyKSwgaG9zdCwgcG9ydCwgdXJpKTsKLX0KLQotQVBJX0VYUE9SVCh1bnNpZ25lZCBsb25nKSBhcF9nZXRfbGltaXRfcmVxX2JvZHkoY29uc3QgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY29yZV9kaXJfY29uZmlnICpkID0KLSAgICAgIChjb3JlX2Rpcl9jb25maWcgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywgJmNvcmVfbW9kdWxlKTsKLSAgICAKLSAgICByZXR1cm4gZC0+bGltaXRfcmVxX2JvZHk7Ci19Ci0KLSNpZmRlZiBXSU4zMgotc3RhdGljIGNoYXIqIGdldF9pbnRlcnByZXRlcl9mcm9tX3dpbjMyX3JlZ2lzdHJ5KHBvb2wgKnAsIGNvbnN0IGNoYXIqIGV4dCkgCi17Ci0gICAgY2hhciBleHRlbnNpb25fcGF0aFtdID0gIlNPRlRXQVJFXFxDbGFzc2VzXFwiOwotICAgIGNoYXIgZXhlY3V0YWJsZV9wYXRoW10gPSAiXFxTSEVMTFxcT1BFTlxcQ09NTUFORCI7Ci0KLSAgICBIS0VZIGhrZXlPcGVuOwotICAgIERXT1JEIHR5cGU7Ci0gICAgaW50IHNpemU7Ci0gICAgaW50IHJlc3VsdDsKLSAgICBjaGFyICprZXlOYW1lOwotICAgIGNoYXIgKmJ1ZmZlcjsKLSAgICBjaGFyICpzOwotCi0gICAgaWYgKCFleHQpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIC8qIAotICAgICAqIEZ1dHVyZSBvcHRpbWl6YXRpb246Ci0gICAgICogV2hlbiB0aGUgcmVnaXN0cnkgaXMgc3VjY2Vzc2Z1bGx5IHNlYXJjaGVkLCBzdG9yZSB0aGUgaW50ZXJwcmV0ZXIKLSAgICAgKiBzdHJpbmcgaW4gYSB0YWJsZSB0byBtYWtlIHN1YnNlcXVlbnQgbG9vay11cHMgZmFzdGVyCi0gICAgICovCi0KLSAgICAvKiBPcGVuIHRoZSBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBzY3JpcHQgZXh0ZW5zaW9uICovCi0gICAga2V5TmFtZSA9IGFwX3BzdHJjYXQocCwgZXh0ZW5zaW9uX3BhdGgsIGV4dCwgTlVMTCk7Ci0KLSAgICByZXN1bHQgPSBSZWdPcGVuS2V5RXgoSEtFWV9MT0NBTF9NQUNISU5FLCBrZXlOYW1lLCAwLCBLRVlfUVVFUllfVkFMVUUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAmaGtleU9wZW4pOwotCi0gICAgaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKSAKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBSZWFkIHRvIE5VTEwgYnVmZmVyIHRvIGZpbmQgdmFsdWUgc2l6ZSAqLwotICAgIHNpemUgPSAwOwotICAgIHJlc3VsdCA9IFJlZ1F1ZXJ5VmFsdWVFeChoa2V5T3BlbiwgIiIsIE5VTEwsICZ0eXBlLCBOVUxMLCAmc2l6ZSk7Ci0KLSAgICBpZiAocmVzdWx0ID09IEVSUk9SX1NVQ0NFU1MpIHsKLSAgICAgICAgYnVmZmVyID0gYXBfcGFsbG9jKHAsIHNpemUpOwotICAgICAgICByZXN1bHQgPSBSZWdRdWVyeVZhbHVlRXgoaGtleU9wZW4sICIiLCBOVUxMLCAmdHlwZSwgYnVmZmVyLCAmc2l6ZSk7Ci0gICAgfQotCi0gICAgUmVnQ2xvc2VLZXkoaGtleU9wZW4pOwotCi0gICAgaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIC8qIE9wZW4gdGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIGludGVycHJldGVyIHBhdGggKi8KLSAgICBrZXlOYW1lID0gYXBfcHN0cmNhdChwLCBleHRlbnNpb25fcGF0aCwgYnVmZmVyLCBleGVjdXRhYmxlX3BhdGgsIE5VTEwpOwotCi0gICAgcmVzdWx0ID0gUmVnT3BlbktleUV4KEhLRVlfTE9DQUxfTUFDSElORSwga2V5TmFtZSwgMCwgS0VZX1FVRVJZX1ZBTFVFLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmhrZXlPcGVuKTsKLQotICAgIGlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBSZWFkIHRvIE5VTEwgYnVmZmVyIHRvIGZpbmQgdmFsdWUgc2l6ZSAqLwotICAgIHNpemUgPSAwOwotICAgIHJlc3VsdCA9IFJlZ1F1ZXJ5VmFsdWVFeChoa2V5T3BlbiwgIiIsIDAsICZ0eXBlLCBOVUxMLCAmc2l6ZSk7Ci0KLSAgICBpZiAocmVzdWx0ID09IEVSUk9SX1NVQ0NFU1MpIHsKLSAgICAgICAgYnVmZmVyID0gYXBfcGFsbG9jKHAsIHNpemUpOwotICAgICAgICByZXN1bHQgPSBSZWdRdWVyeVZhbHVlRXgoaGtleU9wZW4sICIiLCAwLCAmdHlwZSwgYnVmZmVyLCAmc2l6ZSk7Ci0gICAgfQotCi0gICAgUmVnQ2xvc2VLZXkoaGtleU9wZW4pOwotCi0gICAgaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIC8qCi0gICAgICogVGhlIGNhbm9uaWNhbCB3YXkgc2hlbGwgY29tbWFuZCBlbnRyaWVzIGFyZSBlbnRlcmVkIGluIHRoZSBXaW4zMiAKLSAgICAgKiByZWdpc3RyeSBpcyBhcyBmb2xsb3dzOgotICAgICAqICAgc2hlbGwgW29wdGlvbnNdICIlMSIKLSAgICAgKiB3aGVyZQotICAgICAqICAgc2hlbGwgLSBmdWxsIHBhdGggbmFtZSB0byBpbnRlcnByZXRlciBvciBzaGVsbCB0byBydW4uCi0gICAgICogICAgICAgICAgIEUuZy4sIGM6XHVzclxsb2NhbFxudHJlc2tpdFxwZXJsXGJpblxwZXJsLmV4ZQotICAgICAqICAgb3B0aW9ucyAtIG9wdGlvbmFsIHN3aXRjaGVzCi0gICAgICogICAgICAgICAgICAgIEUuZy4sIFxDCi0gICAgICogICAiJTEiIC0gUGxhY2UgaG9sZGVyIGZvciBmaWxlIHRvIHJ1biB0aGUgc2hlbGwgYWdhaW5zdC4gCi0gICAgICogICAgICAgICAgVHlwaWNhbGx5IHF1b3RlZC4KLSAgICAgKgotICAgICAqIElmIHdlIGZpbmQgYSAlMSBvciBhIHF1b3RlZCAlMSwgbG9wIGl0IG9mZi4gCi0gICAgICovCi0gICAgaWYgKGJ1ZmZlciAmJiAqYnVmZmVyKSB7Ci0gICAgICAgIGlmICgocyA9IHN0cnN0cihidWZmZXIsICJcIiUxIikpKQotICAgICAgICAgICAgKnMgPSAnXDAnOwotICAgICAgICBlbHNlIGlmICgocyA9IHN0cnN0cihidWZmZXIsICIlMSIpKSkgCi0gICAgICAgICAgICAqcyA9ICdcMCc7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotQVBJX0VYUE9SVCAoZmlsZV90eXBlX2UpIGFwX2dldF93aW4zMl9pbnRlcnByZXRlcihjb25zdCAgcmVxdWVzdF9yZWMgKnIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiogaW50ZXJwcmV0ZXIgKQotewotICAgIEhBTkRMRSBoRmlsZTsKLSAgICBEV09SRCBuQnl0ZXNSZWFkOwotICAgIEJPT0xFQU4gYlJlc3VsdDsKLSAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmQ7Ci0gICAgaW50IGk7Ci0gICAgZmlsZV90eXBlX2UgZmlsZVR5cGUgPSBlRmlsZVR5cGVVTktOT1dOOwotICAgIGNoYXIgKmV4dCA9IE5VTEw7Ci0gICAgY2hhciAqZXhlbmFtZSA9IE5VTEw7Ci0KLSAgICBkID0gKGNvcmVfZGlyX2NvbmZpZyAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3JlX21vZHVsZSk7Ci0KLSAgICAvKiBGaW5kIHRoZSBmaWxlIGV4dGVuc2lvbiAqLwotICAgIGV4ZW5hbWUgPSBzdHJyY2hyKHItPmZpbGVuYW1lLCAnLycpOwotICAgIGlmICghZXhlbmFtZSkgewotICAgICAgICBleGVuYW1lID0gc3RycmNocihyLT5maWxlbmFtZSwgJ1xcJyk7Ci0gICAgfQotICAgIGlmICghZXhlbmFtZSkgewotICAgICAgICBleGVuYW1lID0gci0+ZmlsZW5hbWU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBleGVuYW1lKys7Ci0gICAgfQotICAgIGV4dCA9IHN0cnJjaHIoZXhlbmFtZSwgJy4nKTsKLQotICAgIGlmIChleHQgJiYgKCFzdHJjYXNlY21wKGV4dCwiLmJhdCIpIHx8ICFzdHJjYXNlY21wKGV4dCwiLmNtZCIpKSkgewotICAgICAgICByZXR1cm4gZUZpbGVUeXBlRVhFMzI7Ci0gICAgfQotCi0gICAgLyogSWYgdGhlIGZpbGUgaGFzIGFuIGV4dGVuc2lvbiBhbmQgaXQgaXMgbm90IC5jb20gYW5kIG5vdCAuZXhlIGFuZAotICAgICAqIHdlJ3ZlIGJlZW4gaW5zdHJ1Y3RlZCB0byBzZWFyY2ggdGhlIHJlZ2lzdHJ5LCB0aGVuIGRvIGl0IQotICAgICAqLwotICAgIGlmIChleHQgJiYgc3RyY2FzZWNtcChleHQsIi5leGUiKSAmJiBzdHJjYXNlY21wKGV4dCwiLmNvbSIpICYmCi0gICAgICAgIGQtPnNjcmlwdF9pbnRlcnByZXRlcl9zb3VyY2UgPT0gSU5URVJQUkVURVJfU09VUkNFX1JFR0lTVFJZKSB7Ci0gICAgICAgICAvKiBDaGVjayB0aGUgcmVnaXN0cnkgKi8KLSAgICAgICAgKmludGVycHJldGVyID0gZ2V0X2ludGVycHJldGVyX2Zyb21fd2luMzJfcmVnaXN0cnkoci0+cG9vbCwgZXh0KTsKLSAgICAgICAgaWYgKCppbnRlcnByZXRlcikKLSAgICAgICAgICAgIHJldHVybiBlRmlsZVR5cGVTQ1JJUFQ7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgci0+c2VydmVyLAotICAgICAgICAgICAgICJTY3JpcHRJbnRlcnByZXRlclNvdXJjZSBjb25maWcgZGlyZWN0aXZlIHNldCB0byBcInJlZ2lzdHJ5XCIuXG5cdCIKLSAgICAgICAgICAgICAiUmVnaXN0cnkgd2FzIHNlYXJjaGVkIGJ1dCBpbnRlcnByZXRlciBub3QgZm91bmQuIFRyeWluZyB0aGUgc2hlYmFuZyBsaW5lLiIpOwotICAgICAgICB9Ci0gICAgfSAgICAgICAgCi0KLSAgICAvKiBOZWVkIHRvIHBlZWsgaW50byB0aGUgZmlsZSBmaWd1cmUgb3V0IHdoYXQgaXQgcmVhbGx5IGlzLi4uICovCi0gICAgaEZpbGUgPSBDcmVhdGVGaWxlKHItPmZpbGVuYW1lLCBHRU5FUklDX1JFQUQsIEZJTEVfU0hBUkVfUkVBRCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgT1BFTl9FWElTVElORywgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKTsKLSAgICBpZiAoaEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLSAgICAgICAgcmV0dXJuIGVGaWxlVHlwZVVOS05PV047Ci0gICAgfQotICAgIGJSZXN1bHQgPSBSZWFkRmlsZShoRmlsZSwgKHZvaWQqKSAmYnVmZmVyLCBzaXplb2YoYnVmZmVyKSAtIDEsIAotICAgICAgICAgICAgICAgICAgICAgICAmbkJ5dGVzUmVhZCwgTlVMTCk7Ci0gICAgaWYgKCFiUmVzdWx0IHx8IChuQnl0ZXNSZWFkID09IDApKSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAgICJSZWFkRmlsZSglcykgZmFpbGVkIiwgci0+ZmlsZW5hbWUpOwotICAgICAgICBDbG9zZUhhbmRsZShoRmlsZSk7Ci0gICAgICAgIHJldHVybiBlRmlsZVR5cGVVTktOT1dOOwotICAgIH0KLSAgICBDbG9zZUhhbmRsZShoRmlsZSk7Ci0gICAgYnVmZmVyW25CeXRlc1JlYWRdID0gJ1wwJzsKLQotICAgIC8qIFNjcmlwdCBvciBleGVjdXRhYmxlLCB0aGF0IGlzIHRoZSBxdWVzdGlvbi4uLiAqLwotICAgIGlmICgoYnVmZmVyWzBdID09ICcjJykgJiYgKGJ1ZmZlclsxXSA9PSAnIScpKSB7Ci0gICAgICAgIC8qIEFzc3VtaW5nIGZpbGUgaXMgYSBzY3JpcHQgc2luY2UgaXQgc3RhcnRzIHdpdGggYSBzaGViYW5nICovCi0gICAgICAgIGZpbGVUeXBlID0gZUZpbGVUeXBlU0NSSVBUOwotICAgICAgICBmb3IgKGkgPSAyOyBpIDwgc2l6ZW9mKGJ1ZmZlcik7IGkrKykgewotICAgICAgICAgICAgaWYgKChidWZmZXJbaV0gPT0gJ1xyJykKLSAgICAgICAgICAgICAgICB8fCAoYnVmZmVyW2ldID09ICdcbicpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnVmZmVyW2ldID0gJ1wwJzsKLSAgICAgICAgZm9yIChpID0gMjsgYnVmZmVyW2ldID09ICcgJyA7ICsraSkKLSAgICAgICAgICAgIDsKLSAgICAgICAgKmludGVycHJldGVyID0gYXBfcHN0cmR1cChyLT5wb29sLCBidWZmZXIgKyBpICk7IAotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogTm90IGEgc2NyaXB0LCBpcyBpdCBhbiBleGVjdXRhYmxlPyAqLwotICAgICAgICBJTUFHRV9ET1NfSEVBREVSICpoZHIgPSAoSU1BR0VfRE9TX0hFQURFUiopYnVmZmVyOyAgICAKLSAgICAgICAgaWYgKChuQnl0ZXNSZWFkID49IHNpemVvZihJTUFHRV9ET1NfSEVBREVSKSkgJiYgKGhkci0+ZV9tYWdpYyA9PSBJTUFHRV9ET1NfU0lHTkFUVVJFKSkgewotICAgICAgICAgICAgaWYgKGhkci0+ZV9sZmFybGMgPCAweDQwKQotICAgICAgICAgICAgICAgIGZpbGVUeXBlID0gZUZpbGVUeXBlRVhFMTY7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZmlsZVR5cGUgPSBlRmlsZVR5cGVFWEUzMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmaWxlVHlwZSA9IGVGaWxlVHlwZVVOS05PV047Ci0gICAgfQotCi0gICAgcmV0dXJuIGZpbGVUeXBlOwotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvbW1hbmRzLi4uIHRoaXMgbW9kdWxlIGhhbmRsZXMgYWxtb3N0IGFsbCBvZiB0aGUgTkNTQSBodHRwZC5jb25mCi0gKiBjb21tYW5kcywgYnV0IG1vc3Qgb2YgdGhlIG9sZCBzcm0uY29uZiBpcyBpbiB0aGUgdGhlIG1vZHVsZXMuCi0gKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgZW5kX2RpcmVjdG9yeV9zZWN0aW9uW10gPSAiPC9EaXJlY3Rvcnk+IjsKLXN0YXRpYyBjb25zdCBjaGFyIGVuZF9kaXJlY3RvcnltYXRjaF9zZWN0aW9uW10gPSAiPC9EaXJlY3RvcnlNYXRjaD4iOwotc3RhdGljIGNvbnN0IGNoYXIgZW5kX2xvY2F0aW9uX3NlY3Rpb25bXSA9ICI8L0xvY2F0aW9uPiI7Ci1zdGF0aWMgY29uc3QgY2hhciBlbmRfbG9jYXRpb25tYXRjaF9zZWN0aW9uW10gPSAiPC9Mb2NhdGlvbk1hdGNoPiI7Ci1zdGF0aWMgY29uc3QgY2hhciBlbmRfZmlsZXNfc2VjdGlvbltdID0gIjwvRmlsZXM+IjsKLXN0YXRpYyBjb25zdCBjaGFyIGVuZF9maWxlc21hdGNoX3NlY3Rpb25bXSA9ICI8L0ZpbGVzTWF0Y2g+IjsKLXN0YXRpYyBjb25zdCBjaGFyIGVuZF92aXJ0dWFsaG9zdF9zZWN0aW9uW10gPSAiPC9WaXJ0dWFsSG9zdD4iOwotc3RhdGljIGNvbnN0IGNoYXIgZW5kX2lmbW9kdWxlX3NlY3Rpb25bXSA9ICI8L0lmTW9kdWxlPiI7Ci1zdGF0aWMgY29uc3QgY2hhciBlbmRfaWZkZWZpbmVfc2VjdGlvbltdID0gIjwvSWZEZWZpbmU+IjsKLQotCi1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfY2hlY2tfY21kX2NvbnRleHQoY21kX3Bhcm1zICpjbWQsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGZvcmJpZGRlbikKLXsKLSAgICBjb25zdCBjaGFyICpndCA9IChjbWQtPmNtZC0+bmFtZVswXSA9PSAnPCcKLQkJICAgICAgJiYgY21kLT5jbWQtPm5hbWVbc3RybGVuKGNtZC0+Y21kLT5uYW1lKS0xXSAhPSAnPicpCi0gICAgICAgICAgICAgICAgICAgICAgICAgPyAiPiIgOiAiIjsKLQotICAgIGlmICgoZm9yYmlkZGVuICYgTk9UX0lOX1ZJUlRVQUxIT1NUKSAmJiBjbWQtPnNlcnZlci0+aXNfdmlydHVhbCkgewotCXJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgY21kLT5jbWQtPm5hbWUsIGd0LAotCQkJICAiIGNhbm5vdCBvY2N1ciB3aXRoaW4gPFZpcnR1YWxIb3N0PiBzZWN0aW9uIiwgTlVMTCk7Ci0gICAgfQotCi0gICAgaWYgKChmb3JiaWRkZW4gJiBOT1RfSU5fTElNSVQpICYmIGNtZC0+bGltaXRlZCAhPSAtMSkgewotCXJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgY21kLT5jbWQtPm5hbWUsIGd0LAotCQkJICAiIGNhbm5vdCBvY2N1ciB3aXRoaW4gPExpbWl0PiBzZWN0aW9uIiwgTlVMTCk7Ci0gICAgfQotCi0gICAgaWYgKChmb3JiaWRkZW4gJiBOT1RfSU5fRElSX0xPQ19GSUxFKSA9PSBOT1RfSU5fRElSX0xPQ19GSUxFCi0JJiYgY21kLT5wYXRoICE9IE5VTEwpIHsKLQlyZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsIGNtZC0+Y21kLT5uYW1lLCBndCwKLQkJCSAgIiBjYW5ub3Qgb2NjdXIgd2l0aGluIDxEaXJlY3RvcnkvTG9jYXRpb24vRmlsZXM+ICIKLQkJCSAgInNlY3Rpb24iLCBOVUxMKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKCgoZm9yYmlkZGVuICYgTk9UX0lOX0RJUkVDVE9SWSkKLQkgJiYgKGNtZC0+ZW5kX3Rva2VuID09IGVuZF9kaXJlY3Rvcnlfc2VjdGlvbgotCSAgICAgfHwgY21kLT5lbmRfdG9rZW4gPT0gZW5kX2RpcmVjdG9yeW1hdGNoX3NlY3Rpb24pKSAKLQl8fCAoKGZvcmJpZGRlbiAmIE5PVF9JTl9MT0NBVElPTikKLQkgICAgJiYgKGNtZC0+ZW5kX3Rva2VuID09IGVuZF9sb2NhdGlvbl9zZWN0aW9uCi0JCXx8IGNtZC0+ZW5kX3Rva2VuID09IGVuZF9sb2NhdGlvbm1hdGNoX3NlY3Rpb24pKSAKLQl8fCAoKGZvcmJpZGRlbiAmIE5PVF9JTl9GSUxFUykKLQkgICAgJiYgKGNtZC0+ZW5kX3Rva2VuID09IGVuZF9maWxlc19zZWN0aW9uCi0JCXx8IGNtZC0+ZW5kX3Rva2VuID09IGVuZF9maWxlc21hdGNoX3NlY3Rpb24pKSkgewotCXJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgY21kLT5jbWQtPm5hbWUsIGd0LAotCQkJICAiIGNhbm5vdCBvY2N1ciB3aXRoaW4gPCIsIGNtZC0+ZW5kX3Rva2VuKzIsCi0JCQkgICIgc2VjdGlvbiIsIE5VTEwpOwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2FjY2Vzc19uYW1lKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIHZvaWQgKnNjb25mID0gY21kLT5zZXJ2ZXItPm1vZHVsZV9jb25maWc7Ci0gICAgY29yZV9zZXJ2ZXJfY29uZmlnICpjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcoc2NvbmYsICZjb3JlX21vZHVsZSk7Ci0KLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsCi0JCQkJCSAgIE5PVF9JTl9ESVJfTE9DX0ZJTEV8Tk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBjb25mLT5hY2Nlc3NfbmFtZSA9IGFwX3BzdHJkdXAoY21kLT5wb29sLCBhcmcpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0jaWZkZWYgR1BST0YKLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfZ3Byb2ZfZGlyKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIHZvaWQgKnNjb25mID0gY21kLT5zZXJ2ZXItPm1vZHVsZV9jb25maWc7Ci0gICAgY29yZV9zZXJ2ZXJfY29uZmlnICpjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcoc2NvbmYsICZjb3JlX21vZHVsZSk7Ci0KLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsCi0JCQkJCSAgIE5PVF9JTl9ESVJfTE9DX0ZJTEV8Tk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBjb25mLT5ncHJvZl9kaXIgPSBhcF9wc3RyZHVwKGNtZC0+cG9vbCwgYXJnKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLSNlbmRpZiAvKkdQUk9GKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9kb2N1bWVudF9yb290KGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIHZvaWQgKnNjb25mID0gY21kLT5zZXJ2ZXItPm1vZHVsZV9jb25maWc7Ci0gICAgY29yZV9zZXJ2ZXJfY29uZmlnICpjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcoc2NvbmYsICZjb3JlX21vZHVsZSk7Ci0gIAotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwKLQkJCQkJICAgTk9UX0lOX0RJUl9MT0NfRklMRXxOT1RfSU5fTElNSVQpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFyZyA9IGFwX29zX2Nhbm9uaWNhbF9maWxlbmFtZShjbWQtPnBvb2wsIGFyZyk7Ci0gICAgaWYgKGFwX2NvbmZpZ3Rlc3Rvbmx5ICYmIGFwX2RvY3Jvb3RjaGVjayAmJiAhYXBfaXNfZGlyZWN0b3J5KGFyZykpIHsKLQlpZiAoY21kLT5zZXJ2ZXItPmlzX3ZpcnR1YWwpIHsKLQkgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBEb2N1bWVudFJvb3QgWyVzXSBkb2VzIG5vdCBleGlzdFxuIiwKLQkJICAgIGFyZyk7Ci0JfQotCWVsc2UgewotCSAgICByZXR1cm4gIkRvY3VtZW50Um9vdCBtdXN0IGJlIGEgZGlyZWN0b3J5IjsKLQl9Ci0gICAgfQotICAgIAotICAgIGNvbmYtPmFwX2RvY3VtZW50X3Jvb3QgPSBhcmc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfY3VzdG9tX3Jlc3BvbnNlKHJlcXVlc3RfcmVjICpyLCBpbnQgc3RhdHVzLCBjaGFyICpzdHJpbmcpCi17Ci0gICAgY29yZV9kaXJfY29uZmlnICpjb25mID0gCi0JYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsICZjb3JlX21vZHVsZSk7Ci0gICAgaW50IGlkeDsKLQotICAgIGlmKGNvbmYtPnJlc3BvbnNlX2NvZGVfc3RyaW5ncyA9PSBOVUxMKSB7Ci0gICAgICAgIGNvbmYtPnJlc3BvbnNlX2NvZGVfc3RyaW5ncyA9IAotCSAgICBhcF9wY2FsbG9jKHItPnBvb2wsCi0JCSAgICBzaXplb2YoKmNvbmYtPnJlc3BvbnNlX2NvZGVfc3RyaW5ncykgKiAKLQkJICAgIFJFU1BPTlNFX0NPREVTKTsKLSAgICB9Ci0KLSAgICBpZHggPSBhcF9pbmRleF9vZl9yZXNwb25zZShzdGF0dXMpOwotCi0gICAgY29uZi0+cmVzcG9uc2VfY29kZV9zdHJpbmdzW2lkeF0gPSAKLSAgICAgICAoKGFwX2lzX3VybChzdHJpbmcpIHx8ICgqc3RyaW5nID09ICcvJykpICYmICgqc3RyaW5nICE9ICciJykpID8gCi0gICAgICAgYXBfcHN0cmR1cChyLT5wb29sLCBzdHJpbmcpIDogYXBfcHN0cmNhdChyLT5wb29sLCAiXCIiLCBzdHJpbmcsIE5VTEwpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2Vycm9yX2RvY3VtZW50KGNtZF9wYXJtcyAqY21kLCBjb3JlX2Rpcl9jb25maWcgKmNvbmYsCi0JCQkJICAgICAgY2hhciAqbGluZSkKLXsKLSAgICBpbnQgZXJyb3JfbnVtYmVyLCBpbmRleF9udW1iZXIsIGlkeDUwMDsKLSAgICBjaGFyICp3OwotICAgICAgICAgICAgICAgIAotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgTk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiAxc3QgcGFyYW1ldGVyIHNob3VsZCBiZSBhIDMgZGlnaXQgbnVtYmVyLCB3aGljaCB3ZSByZWNvZ25pemU7Ci0gICAgICogY29udmVydCBpdCBpbnRvIGFuIGFycmF5IGluZGV4Ci0gICAgICovCi0gIAotICAgIHcgPSBhcF9nZXR3b3JkX2NvbmZfbmMoY21kLT5wb29sLCAmbGluZSk7Ci0gICAgZXJyb3JfbnVtYmVyID0gYXRvaSh3KTsKLQotICAgIGlkeDUwMCA9IGFwX2luZGV4X29mX3Jlc3BvbnNlKEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKLQotICAgIGlmIChlcnJvcl9udW1iZXIgPT0gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpIHsKLSAgICAgICAgaW5kZXhfbnVtYmVyID0gaWR4NTAwOwotICAgIH0KLSAgICBlbHNlIGlmICgoaW5kZXhfbnVtYmVyID0gYXBfaW5kZXhfb2ZfcmVzcG9uc2UoZXJyb3JfbnVtYmVyKSkgPT0gaWR4NTAwKSB7Ci0gICAgICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIlVuc3VwcG9ydGVkIEhUVFAgcmVzcG9uc2UgY29kZSAiLAotCQkJICB3LCBOVUxMKTsKLSAgICB9Ci0KLSAgICAvKiBUaGUgZW50cnkgc2hvdWxkIGJlIGlnbm9yZWQgaWYgaXQgaXMgYSBmdWxsIFVSTCBmb3IgYSA0MDEgZXJyb3IgKi8KLQotICAgIGlmIChlcnJvcl9udW1iZXIgPT0gNDAxICYmCi0JbGluZVswXSAhPSAnLycgJiYgbGluZVswXSAhPSAnIicpIHsgLyogSWdub3JlIGl0Li4uICovCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCBjbWQtPnNlcnZlciwKLQkJICAgICAiY2Fubm90IHVzZSBhIGZ1bGwgVVJMIGluIGEgNDAxIEVycm9yRG9jdW1lbnQgIgotCQkgICAgICJkaXJlY3RpdmUgLS0tIGlnbm9yaW5nISIpOwotICAgIH0KLSAgICBlbHNlIHsgLyogU3RvcmUgaXQuLi4gKi8KLSAgICAJaWYgKGNvbmYtPnJlc3BvbnNlX2NvZGVfc3RyaW5ncyA9PSBOVUxMKSB7Ci0JICAgIGNvbmYtPnJlc3BvbnNlX2NvZGVfc3RyaW5ncyA9Ci0JCWFwX3BjYWxsb2MoY21kLT5wb29sLAotCQkJICAgc2l6ZW9mKCpjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3MpICogUkVTUE9OU0VfQ09ERVMpOwotICAgICAgICB9Ci0gICAgICAgIGNvbmYtPnJlc3BvbnNlX2NvZGVfc3RyaW5nc1tpbmRleF9udW1iZXJdID0gYXBfcHN0cmR1cChjbWQtPnBvb2wsIGxpbmUpOwotICAgIH0gICAKLQotICAgIHJldHVybiBOVUxMOwotfQotCi0vKiBhY2Nlc3MuY29uZiBjb21tYW5kcy4uLgotICoKLSAqIFRoZSAqb25seSogdGhpbmcgdGhhdCBjYW4gYXBwZWFyIGluIGFjY2Vzcy5jb25mIGF0IHRvcCBsZXZlbCBpcyBhCi0gKiA8RGlyZWN0b3J5PiBzZWN0aW9uLiAgTkIgd2UgbmVlZCB0byBoYXZlIGEgd2F5IHRvIGN1dCB0aGUgc3JtX2NvbW1hbmRfbG9vcAotICogaW52b2tlZCBieSBkaXJzZWN0aW9uIChpLmUuLCA8RGlyZWN0b3J5Pikgc2hvcnQgd2hlbiA8L0RpcmVjdG9yeT4gaXMgc2Vlbi4KLSAqIFdlIGRvIHRoYXQgYnkgcmV0dXJuaW5nIGFuIGVycm9yLCB3aGljaCBkaXJzZWN0aW9uIGl0c2VsZiByZWNvZ25pemVzIGFuZAotICogZGlzY2FyZHMgYXMgaGFybWxlc3MuICBDaGVlc3ksIGJ1dCBpdCB3b3Jrcy4KLSAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X292ZXJyaWRlKGNtZF9wYXJtcyAqY21kLCBjb3JlX2Rpcl9jb25maWcgKmQsCi0JCQkJY29uc3QgY2hhciAqbCkKLXsKLSAgICBjaGFyICp3OwotICAKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIE5PVF9JTl9MSU1JVCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZC0+b3ZlcnJpZGUgPSBPUl9OT05FOwotICAgIHdoaWxlIChsWzBdKSB7Ci0gICAgICAgIHcgPSBhcF9nZXR3b3JkX2NvbmYoY21kLT5wb29sLCAmbCk7Ci0JaWYgKCFzdHJjYXNlY21wKHcsICJMaW1pdCIpKSB7Ci0JICAgIGQtPm92ZXJyaWRlIHw9IE9SX0xJTUlUOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiT3B0aW9ucyIpKSB7Ci0JICAgIGQtPm92ZXJyaWRlIHw9IE9SX09QVElPTlM7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJGaWxlSW5mbyIpKSB7Ci0gICAgICAgICAgICBkLT5vdmVycmlkZSB8PSBPUl9GSUxFSU5GTzsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIkF1dGhDb25maWciKSkgewotCSAgICBkLT5vdmVycmlkZSB8PSBPUl9BVVRIQ0ZHOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiSW5kZXhlcyIpKSB7Ci0gICAgICAgICAgICBkLT5vdmVycmlkZSB8PSBPUl9JTkRFWEVTOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiTm9uZSIpKSB7Ci0JICAgIGQtPm92ZXJyaWRlID0gT1JfTk9ORTsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIkFsbCIpKSB7Ci0JICAgIGQtPm92ZXJyaWRlID0gT1JfQUxMOwotCX0KLQllbHNlIHsKLQkgICAgcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCAiSWxsZWdhbCBvdmVycmlkZSBvcHRpb24gIiwgdywgTlVMTCk7Ci0JfQotCWQtPm92ZXJyaWRlICY9IH5PUl9VTlNFVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9vcHRpb25zKGNtZF9wYXJtcyAqY21kLCBjb3JlX2Rpcl9jb25maWcgKmQsCi0JCQkgICAgICAgY29uc3QgY2hhciAqbCkKLXsKLSAgICBhbGxvd19vcHRpb25zX3Qgb3B0OwotICAgIGludCBmaXJzdCA9IDE7Ci0gICAgY2hhciBhY3Rpb247Ci0KLSAgICB3aGlsZSAobFswXSkgewotICAgICAgICBjaGFyICp3ID0gYXBfZ2V0d29yZF9jb25mKGNtZC0+cG9vbCwgJmwpOwotCWFjdGlvbiA9ICdcMCc7Ci0KLQlpZiAoKncgPT0gJysnIHx8ICp3ID09ICctJykgewotCSAgICBhY3Rpb24gPSAqKHcrKyk7Ci0JfQotCWVsc2UgaWYgKGZpcnN0KSB7Ci0gIAkgICAgZC0+b3B0cyA9IE9QVF9OT05FOwotICAgICAgICAgICAgZmlyc3QgPSAwOwotICAgICAgICB9Ci0JICAgIAotCWlmICghc3RyY2FzZWNtcCh3LCAiSW5kZXhlcyIpKSB7Ci0JICAgIG9wdCA9IE9QVF9JTkRFWEVTOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiSW5jbHVkZXMiKSkgewotCSAgICBvcHQgPSBPUFRfSU5DTFVERVM7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJJbmNsdWRlc05PRVhFQyIpKSB7Ci0JICAgIG9wdCA9IChPUFRfSU5DTFVERVMgfCBPUFRfSU5DTk9FWEVDKTsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIkZvbGxvd1N5bUxpbmtzIikpIHsKLQkgICAgb3B0ID0gT1BUX1NZTV9MSU5LUzsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIlN5bUxpbmtzSWZPd25lck1hdGNoIikpIHsKLQkgICAgb3B0ID0gT1BUX1NZTV9PV05FUjsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgImV4ZWNDR0kiKSkgewotCSAgICBvcHQgPSBPUFRfRVhFQ0NHSTsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIk11bHRpVmlld3MiKSkgewotCSAgICBvcHQgPSBPUFRfTVVMVEk7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJSdW5TY3JpcHRzIikpIHsgLyogQUkgYmFja2NvbXBhdC4gWXVjayAqLwotCSAgICBvcHQgPSBPUFRfTVVMVEl8T1BUX0VYRUNDR0k7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJOb25lIikpIHsKLQkgICAgb3B0ID0gT1BUX05PTkU7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJBbGwiKSkgewotCSAgICBvcHQgPSBPUFRfQUxMOwotCX0KLQllbHNlIHsKLQkgICAgcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCAiSWxsZWdhbCBvcHRpb24gIiwgdywgTlVMTCk7Ci0JfQotCi0JLyogd2UgZW5zdXJlIHRoZSBpbnZhcmlhbnQgKGQtPm9wdHNfYWRkICYgZC0+b3B0c19yZW1vdmUpID09IDAgKi8KLQlpZiAoYWN0aW9uID09ICctJykgewotCSAgICBkLT5vcHRzX3JlbW92ZSB8PSBvcHQ7Ci0JICAgIGQtPm9wdHNfYWRkICY9IH5vcHQ7Ci0JICAgIGQtPm9wdHMgJj0gfm9wdDsKLQl9Ci0JZWxzZSBpZiAoYWN0aW9uID09ICcrJykgewotCSAgICBkLT5vcHRzX2FkZCB8PSBvcHQ7Ci0JICAgIGQtPm9wdHNfcmVtb3ZlICY9IH5vcHQ7Ci0JICAgIGQtPm9wdHMgfD0gb3B0OwotCX0KLQllbHNlIHsKLQkgICAgZC0+b3B0cyB8PSBvcHQ7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2F0aXNmeShjbWRfcGFybXMgKmNtZCwgY29yZV9kaXJfY29uZmlnICpjLCBjaGFyICphcmcpCi17Ci0gICAgaWYgKCFzdHJjYXNlY21wKGFyZywgImFsbCIpKSB7Ci0gICAgICAgIGMtPnNhdGlzZnkgPSBTQVRJU0ZZX0FMTDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJnLCAiYW55IikpIHsKLSAgICAgICAgYy0+c2F0aXNmeSA9IFNBVElTRllfQU5ZOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcmV0dXJuICJTYXRpc2Z5IGVpdGhlciAnYW55JyBvciAnYWxsJy4iOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnJlcXVpcmUoY21kX3Bhcm1zICpjbWQsIGNvcmVfZGlyX2NvbmZpZyAqYywgY2hhciAqYXJnKQotewotICAgIHJlcXVpcmVfbGluZSAqcjsKLSAgCi0gICAgaWYgKCFjLT5hcF9yZXF1aXJlcykgewotICAgICAgICBjLT5hcF9yZXF1aXJlcyA9IGFwX21ha2VfYXJyYXkoY21kLT5wb29sLCAyLCBzaXplb2YocmVxdWlyZV9saW5lKSk7Ci0gICAgfQotICAgIHIgPSAocmVxdWlyZV9saW5lICopYXBfcHVzaF9hcnJheShjLT5hcF9yZXF1aXJlcyk7Ci0gICAgci0+cmVxdWlyZW1lbnQgPSBhcF9wc3RyZHVwKGNtZC0+cG9vbCwgYXJnKTsKLSAgICByLT5tZXRob2RfbWFzayA9IGNtZC0+bGltaXRlZDsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotQ09SRV9FWFBPUlRfTk9OU1REKGNvbnN0IGNoYXIgKikgYXBfbGltaXRfc2VjdGlvbihjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksCi0JCQkJCQkgIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICpsaW1pdGVkX21ldGhvZHMgPSBhcF9nZXR3b3JkKGNtZC0+cG9vbCwgJmFyZywgJz4nKTsKLSAgICB2b2lkICp0b2cgPSBjbWQtPmNtZC0+Y21kX2RhdGE7Ci0gICAgaW50IGxpbWl0ZWQgPSAwOwotICAKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIE5PVF9JTl9MSU1JVCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogWFhYOiBOQjogQ3VycmVudGx5LCB3ZSBoYXZlIG5vIHdheSBvZiBjaGVja2luZwotICAgICAqIHdoZXRoZXIgPExpbWl0PiBvciA8TGltaXRFeGNlcHQ+IHNlY3Rpb25zIGFyZSBjbG9zZWQgcHJvcGVybHkuCi0gICAgICogKElmIHdlIHdvdWxkIGFkZCBhIHNybV9jb21tYW5kX2xvb3AoKSBoZXJlIHdlIG1pZ2h0Li4uKQotICAgICAqLwotICAgIAotICAgIHdoaWxlIChsaW1pdGVkX21ldGhvZHNbMF0pIHsKLSAgICAgICAgY2hhciAqbWV0aG9kID0gYXBfZ2V0d29yZF9jb25mKGNtZC0+cG9vbCwgJmxpbWl0ZWRfbWV0aG9kcyk7Ci0gICAgICAgIGludCAgbWV0aG51bSA9IGFwX21ldGhvZF9udW1iZXJfb2YobWV0aG9kKTsKLQotICAgICAgICBpZiAobWV0aG51bSA9PSBNX1RSQUNFICYmICF0b2cpIHsKLSAgICAgICAgICAgIHJldHVybiAiVFJBQ0UgY2Fubm90IGJlIGNvbnRyb2xsZWQgYnkgPExpbWl0PiI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG51bSA9PSBNX0lOVkFMSUQpIHsKLSAgICAgICAgICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgInVua25vd24gbWV0aG9kIFwiIiwgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIGluIDxMaW1pdCIsIHRvZyA/ICJFeGNlcHQ+IiA6ICI+IiwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBsaW1pdGVkIHw9ICgxIDw8IG1ldGhudW0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogS2lsbGluZyB0d28gZmVhdHVyZXMgd2l0aCBvbmUgZnVuY3Rpb24sCi0gICAgICogaWYgKHRvZyA9PSBOVUxMKSA8TGltaXQ+LCBlbHNlIDxMaW1pdEV4Y2VwdD4KLSAgICAgKi8KLSAgICBjbWQtPmxpbWl0ZWQgPSB0b2cgPyB+bGltaXRlZCA6IGxpbWl0ZWQ7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICplbmRsaW1pdF9zZWN0aW9uKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgdm9pZCAqZHVtbXkyKQotewotICAgIHZvaWQgKnRvZyA9IGNtZC0+Y21kLT5jbWRfZGF0YTsKLQotICAgIGlmIChjbWQtPmxpbWl0ZWQgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIHRvZyA/ICI8L0xpbWl0RXhjZXB0PiB1bmV4cGVjdGVkIiA6ICI8L0xpbWl0PiB1bmV4cGVjdGVkIjsKLSAgICB9Ci0gICAgCi0gICAgY21kLT5saW1pdGVkID0gLTE7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBXaGVuIGEgc2VjdGlvbiBpcyBub3QgY2xvc2VkIHByb3Blcmx5IHdoZW4gZW5kLW9mLWZpbGUgaXMgcmVhY2hlZCwKLSAqIHRoZW4gYW4gZXJyb3IgbWVzc2FnZSBzaG91bGQgYmUgcHJpbnRlZDoKLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKm1pc3NpbmdfZW5kc2VjdGlvbihjbWRfcGFybXMgKmNtZCwgaW50IG5lc3QpCi17Ci0gICAgaWYgKG5lc3QgPCAyKSB7Ci0JcmV0dXJuIGFwX3BzcHJpbnRmKGNtZC0+cG9vbCwgIk1pc3NpbmcgJXMgZGlyZWN0aXZlIGF0IGVuZC1vZi1maWxlIiwKLQkJCSAgIGNtZC0+ZW5kX3Rva2VuKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFwX3BzcHJpbnRmKGNtZC0+cG9vbCwgIiVkIG1pc3NpbmcgJXMgZGlyZWN0aXZlcyBhdCBlbmQtb2YtZmlsZSIsCi0JCSAgICAgICBuZXN0LCBjbWQtPmVuZF90b2tlbik7Ci19Ci0KLS8qIFdlIHVzZSB0aGlzIGluIDxEaXJlY3RvcnlNYXRjaD4gYW5kIDxGaWxlc01hdGNoPiwgdG8gZW5zdXJlIHRoYXQgCi0gKiBwZW9wbGUgZG9uJ3QgZ2V0IGJpdHRlbiBieSB3cm9uZy1jYXNlZCByZWdleCBtYXRjaGVzCi0gKi8KLQotI2lmZGVmIFdJTjMyCi0jZGVmaW5lIFVTRV9JQ0FTRSBSRUdfSUNBU0UKLSNlbHNlCi0jZGVmaW5lIFVTRV9JQ0FTRSAwCi0jZW5kaWYKLQotc3RhdGljIGNvbnN0IGNoYXIgKmVuZF9uZXN0ZWRfc2VjdGlvbihjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXkpCi17Ci0gICAgaWYgKGNtZC0+ZW5kX3Rva2VuID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCBjbWQtPmNtZC0+bmFtZSwKLQkJCSAgIiB3aXRob3V0IG1hdGNoaW5nIDwiLCBjbWQtPmNtZC0+bmFtZSArIDIsIAotCQkJICAiIHNlY3Rpb24iLCBOVUxMKTsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBUaGlzICchPScgbWF5IGxvb2sgd2VpcmQgb24gYSBzdHJpbmcgY29tcGFyaXNvbiwgYnV0IGl0J3MgY29ycmVjdCAtLQotICAgICAqIGl0J3MgYmVlbiBzZXQgdXAgc28gdGhhdCBjaGVja2luZyBmb3IgdHdvIHBvaW50ZXJzIHRvIHRoZSBzYW1lIGRhdHVtCi0gICAgICogaXMgdmFsaWQgaGVyZS4gIEFuZCBmYXN0ZXIuCi0gICAgICovCi0gICAgaWYgKGNtZC0+Y21kLT5uYW1lICE9IGNtZC0+ZW5kX3Rva2VuKSB7Ci0JcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCAiRXhwZWN0ZWQgIiwgY21kLT5lbmRfdG9rZW4sICIgYnV0IHNhdyAiLAotCQkJICBjbWQtPmNtZC0+bmFtZSwgTlVMTCk7Ci0gICAgfQotICAgIHJldHVybiBjbWQtPmVuZF90b2tlbjsKLX0KLQotLyoKLSAqIFJlcG9ydCBhIG1pc3NpbmctJz4nIHN5bnRheCBlcnJvci4KLSAqLwotc3RhdGljIGNoYXIgKnVuY2xvc2VkX2RpcmVjdGl2ZShjbWRfcGFybXMgKmNtZCkKLXsKLSAgICByZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsIGNtZC0+Y21kLT5uYW1lLAotCQkgICAgICAiPiBkaXJlY3RpdmUgbWlzc2luZyBjbG9zaW5nICc+JyIsIE5VTEwpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqZGlyc2VjdGlvbihjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0gICAgY2hhciAqZW5kcCA9IHN0cnJjaHIoYXJnLCAnPicpOwotICAgIGludCBvbGRfb3ZlcnJpZGVzID0gY21kLT5vdmVycmlkZTsKLSAgICBjaGFyICpvbGRfcGF0aCA9IGNtZC0+cGF0aDsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvbmY7Ci0gICAgdm9pZCAqbmV3X2Rpcl9jb25mID0gYXBfY3JlYXRlX3Blcl9kaXJfY29uZmlnKGNtZC0+cG9vbCk7Ci0gICAgcmVnZXhfdCAqciA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciAqb2xkX2VuZF90b2tlbjsKLSAgICBjb25zdCBjb21tYW5kX3JlYyAqdGhpc2NtZCA9IGNtZC0+Y21kOwotCi0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLAotCQkJCQkgICBOT1RfSU5fRElSX0xPQ19GSUxFfE5PVF9JTl9MSU1JVCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKGVuZHAgPT0gTlVMTCkgewotCXJldHVybiB1bmNsb3NlZF9kaXJlY3RpdmUoY21kKTsKLSAgICB9Ci0KLSAgICAqZW5kcCA9ICdcMCc7Ci0KLSAgICBjbWQtPnBhdGggPSBhcF9nZXR3b3JkX2NvbmYoY21kLT5wb29sLCAmYXJnKTsKLSAgICBjbWQtPm92ZXJyaWRlID0gT1JfQUxMfEFDQ0VTU19DT05GOwotCi0gICAgaWYgKHRoaXNjbWQtPmNtZF9kYXRhKSB7IC8qIDxEaXJlY3RvcnlNYXRjaD4gKi8KLQlyID0gYXBfcHJlZ2NvbXAoY21kLT5wb29sLCBjbWQtPnBhdGgsIFJFR19FWFRFTkRFRHxVU0VfSUNBU0UpOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGNtZC0+cGF0aCwgIn4iKSkgewotCWNtZC0+cGF0aCA9IGFwX2dldHdvcmRfY29uZihjbWQtPnBvb2wsICZhcmcpOwotCXIgPSBhcF9wcmVnY29tcChjbWQtPnBvb2wsIGNtZC0+cGF0aCwgUkVHX0VYVEVOREVEfFVTRV9JQ0FTRSk7Ci0gICAgfQotICAgIGVsc2UgewotCS8qIEVuc3VyZSB0aGF0IHRoZSBwYXRobmFtZSBpcyBjYW5vbmljYWwgKi8KLQljbWQtPnBhdGggPSBhcF9vc19jYW5vbmljYWxfZmlsZW5hbWUoY21kLT5wb29sLCBjbWQtPnBhdGgpOwotICAgIH0KLQotICAgIG9sZF9lbmRfdG9rZW4gPSBjbWQtPmVuZF90b2tlbjsKLSAgICBjbWQtPmVuZF90b2tlbiA9IHRoaXNjbWQtPmNtZF9kYXRhID8gZW5kX2RpcmVjdG9yeW1hdGNoX3NlY3Rpb24gOiBlbmRfZGlyZWN0b3J5X3NlY3Rpb247Ci0gICAgZXJybXNnID0gYXBfc3JtX2NvbW1hbmRfbG9vcChjbWQsIG5ld19kaXJfY29uZik7Ci0gICAgaWYgKGVycm1zZyA9PSBOVUxMKSB7Ci0JZXJybXNnID0gbWlzc2luZ19lbmRzZWN0aW9uKGNtZCwgMSk7Ci0gICAgfQotICAgIGNtZC0+ZW5kX3Rva2VuID0gb2xkX2VuZF90b2tlbjsKLSAgICBpZiAoZXJybXNnICE9ICh0aGlzY21kLT5jbWRfZGF0YSAKLQkJICAgICAgID8gZW5kX2RpcmVjdG9yeW1hdGNoX3NlY3Rpb24gCi0JCSAgIDogZW5kX2RpcmVjdG9yeV9zZWN0aW9uKSkgewotCXJldHVybiBlcnJtc2c7Ci0gICAgfQotCi0gICAgY29uZiA9IChjb3JlX2Rpcl9jb25maWcgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhuZXdfZGlyX2NvbmYsICZjb3JlX21vZHVsZSk7Ci0gICAgY29uZi0+ciA9IHI7Ci0KLSAgICBhcF9hZGRfcGVyX2Rpcl9jb25mKGNtZC0+c2VydmVyLCBuZXdfZGlyX2NvbmYpOwotCi0gICAgaWYgKCphcmcgIT0gJ1wwJykgewotCXJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIk11bHRpcGxlICIsIHRoaXNjbWQtPm5hbWUsCi0JCQkgICI+IGFyZ3VtZW50cyBub3QgKHlldCkgc3VwcG9ydGVkLiIsIE5VTEwpOwotICAgIH0KLQotICAgIGNtZC0+cGF0aCA9IG9sZF9wYXRoOwotICAgIGNtZC0+b3ZlcnJpZGUgPSBvbGRfb3ZlcnJpZGVzOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICp1cmxzZWN0aW9uKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY29uc3QgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKLSAgICBjaGFyICplbmRwID0gc3RycmNocihhcmcsICc+Jyk7Ci0gICAgaW50IG9sZF9vdmVycmlkZXMgPSBjbWQtPm92ZXJyaWRlOwotICAgIGNoYXIgKm9sZF9wYXRoID0gY21kLT5wYXRoOwotICAgIGNvcmVfZGlyX2NvbmZpZyAqY29uZjsKLSAgICByZWdleF90ICpyID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICpvbGRfZW5kX3Rva2VuOwotICAgIGNvbnN0IGNvbW1hbmRfcmVjICp0aGlzY21kID0gY21kLT5jbWQ7Ci0KLSAgICB2b2lkICpuZXdfdXJsX2NvbmYgPSBhcF9jcmVhdGVfcGVyX2Rpcl9jb25maWcoY21kLT5wb29sKTsKLQotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwKLQkJCQkJICAgTk9UX0lOX0RJUl9MT0NfRklMRXxOT1RfSU5fTElNSVQpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChlbmRwID09IE5VTEwpIHsKLQlyZXR1cm4gdW5jbG9zZWRfZGlyZWN0aXZlKGNtZCk7Ci0gICAgfQotCi0gICAgKmVuZHAgPSAnXDAnOwotCi0gICAgY21kLT5wYXRoID0gYXBfZ2V0d29yZF9jb25mKGNtZC0+cG9vbCwgJmFyZyk7Ci0gICAgY21kLT5vdmVycmlkZSA9IE9SX0FMTHxBQ0NFU1NfQ09ORjsKLQotICAgIGlmICh0aGlzY21kLT5jbWRfZGF0YSkgeyAvKiA8TG9jYXRpb25NYXRjaD4gKi8KLQlyID0gYXBfcHJlZ2NvbXAoY21kLT5wb29sLCBjbWQtPnBhdGgsIFJFR19FWFRFTkRFRCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoY21kLT5wYXRoLCAifiIpKSB7Ci0JY21kLT5wYXRoID0gYXBfZ2V0d29yZF9jb25mKGNtZC0+cG9vbCwgJmFyZyk7Ci0JciA9IGFwX3ByZWdjb21wKGNtZC0+cG9vbCwgY21kLT5wYXRoLCBSRUdfRVhURU5ERUQpOwotICAgIH0KLQotICAgIG9sZF9lbmRfdG9rZW4gPSBjbWQtPmVuZF90b2tlbjsKLSAgICBjbWQtPmVuZF90b2tlbiA9IHRoaXNjbWQtPmNtZF9kYXRhID8gZW5kX2xvY2F0aW9ubWF0Y2hfc2VjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBlbmRfbG9jYXRpb25fc2VjdGlvbjsKLSAgICBlcnJtc2cgPSBhcF9zcm1fY29tbWFuZF9sb29wKGNtZCwgbmV3X3VybF9jb25mKTsKLSAgICBpZiAoZXJybXNnID09IE5VTEwpIHsKLQllcnJtc2cgPSBtaXNzaW5nX2VuZHNlY3Rpb24oY21kLCAxKTsKLSAgICB9Ci0gICAgY21kLT5lbmRfdG9rZW4gPSBvbGRfZW5kX3Rva2VuOwotICAgIGlmIChlcnJtc2cgIT0gKHRoaXNjbWQtPmNtZF9kYXRhIAotCQkgICAgICAgPyBlbmRfbG9jYXRpb25tYXRjaF9zZWN0aW9uIAotCQkgICAgICAgOiBlbmRfbG9jYXRpb25fc2VjdGlvbikpIHsKLQlyZXR1cm4gZXJybXNnOwotICAgIH0KLQotICAgIGNvbmYgPSAoY29yZV9kaXJfY29uZmlnICopYXBfZ2V0X21vZHVsZV9jb25maWcobmV3X3VybF9jb25mLCAmY29yZV9tb2R1bGUpOwotICAgIGNvbmYtPmQgPSBhcF9wc3RyZHVwKGNtZC0+cG9vbCwgY21kLT5wYXRoKTsJLyogTm8gbWFuZ2xpbmcsIHBsZWFzZSAqLwotICAgIGNvbmYtPmRfaXNfZm5tYXRjaCA9IGFwX2lzX2ZubWF0Y2goY29uZi0+ZCkgIT0gMDsKLSAgICBjb25mLT5yID0gcjsKLQotICAgIGFwX2FkZF9wZXJfdXJsX2NvbmYoY21kLT5zZXJ2ZXIsIG5ld191cmxfY29uZik7Ci0gICAgCi0gICAgaWYgKCphcmcgIT0gJ1wwJykgewotCXJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIk11bHRpcGxlICIsIHRoaXNjbWQtPm5hbWUsCi0JCQkgICI+IGFyZ3VtZW50cyBub3QgKHlldCkgc3VwcG9ydGVkLiIsIE5VTEwpOwotICAgIH0KLQotICAgIGNtZC0+cGF0aCA9IG9sZF9wYXRoOwotICAgIGNtZC0+b3ZlcnJpZGUgPSBvbGRfb3ZlcnJpZGVzOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpmaWxlc2VjdGlvbihjbWRfcGFybXMgKmNtZCwgY29yZV9kaXJfY29uZmlnICpjLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0gICAgY2hhciAqZW5kcCA9IHN0cnJjaHIoYXJnLCAnPicpOwotICAgIGludCBvbGRfb3ZlcnJpZGVzID0gY21kLT5vdmVycmlkZTsKLSAgICBjaGFyICpvbGRfcGF0aCA9IGNtZC0+cGF0aDsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvbmY7Ci0gICAgcmVnZXhfdCAqciA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciAqb2xkX2VuZF90b2tlbjsKLSAgICBjb25zdCBjb21tYW5kX3JlYyAqdGhpc2NtZCA9IGNtZC0+Y21kOwotCi0gICAgdm9pZCAqbmV3X2ZpbGVfY29uZiA9IGFwX2NyZWF0ZV9wZXJfZGlyX2NvbmZpZyhjbWQtPnBvb2wpOwotCi0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBOT1RfSU5fTElNSVR8Tk9UX0lOX0xPQ0FUSU9OKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoZW5kcCA9PSBOVUxMKSB7Ci0JcmV0dXJuIHVuY2xvc2VkX2RpcmVjdGl2ZShjbWQpOwotICAgIH0KLQotICAgICplbmRwID0gJ1wwJzsKLQotICAgIGNtZC0+cGF0aCA9IGFwX2dldHdvcmRfY29uZihjbWQtPnBvb2wsICZhcmcpOwotICAgIC8qIE9ubHkgaWYgbm90IGFuIC5odGFjY2VzcyBmaWxlICovCi0gICAgaWYgKCFvbGRfcGF0aCkgewotCWNtZC0+b3ZlcnJpZGUgPSBPUl9BTEx8QUNDRVNTX0NPTkY7Ci0gICAgfQotCi0gICAgaWYgKHRoaXNjbWQtPmNtZF9kYXRhKSB7IC8qIDxGaWxlc01hdGNoPiAqLwotICAgICAgICByID0gYXBfcHJlZ2NvbXAoY21kLT5wb29sLCBjbWQtPnBhdGgsIFJFR19FWFRFTkRFRHxVU0VfSUNBU0UpOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGNtZC0+cGF0aCwgIn4iKSkgewotCWNtZC0+cGF0aCA9IGFwX2dldHdvcmRfY29uZihjbWQtPnBvb2wsICZhcmcpOwotCXIgPSBhcF9wcmVnY29tcChjbWQtPnBvb2wsIGNtZC0+cGF0aCwgUkVHX0VYVEVOREVEfFVTRV9JQ0FTRSk7Ci0gICAgfQotICAgIGVsc2UgewotCS8qIEVuc3VyZSB0aGF0IHRoZSBwYXRobmFtZSBpcyBjYW5vbmljYWwgKi8KLQljbWQtPnBhdGggPSBhcF9vc19jYW5vbmljYWxfZmlsZW5hbWUoY21kLT5wb29sLCBjbWQtPnBhdGgpOwotICAgIH0KLQotICAgIG9sZF9lbmRfdG9rZW4gPSBjbWQtPmVuZF90b2tlbjsKLSAgICBjbWQtPmVuZF90b2tlbiA9IHRoaXNjbWQtPmNtZF9kYXRhID8gZW5kX2ZpbGVzbWF0Y2hfc2VjdGlvbiA6IGVuZF9maWxlc19zZWN0aW9uOwotICAgIGVycm1zZyA9IGFwX3NybV9jb21tYW5kX2xvb3AoY21kLCBuZXdfZmlsZV9jb25mKTsKLSAgICBpZiAoZXJybXNnID09IE5VTEwpIHsKLQllcnJtc2cgPSBtaXNzaW5nX2VuZHNlY3Rpb24oY21kLCAxKTsKLSAgICB9Ci0gICAgY21kLT5lbmRfdG9rZW4gPSBvbGRfZW5kX3Rva2VuOwotICAgIGlmIChlcnJtc2cgIT0gKHRoaXNjbWQtPmNtZF9kYXRhIAotCQkgICAgICAgPyBlbmRfZmlsZXNtYXRjaF9zZWN0aW9uIAotCQkgICA6IGVuZF9maWxlc19zZWN0aW9uKSkgewotCXJldHVybiBlcnJtc2c7Ci0gICAgfQotCi0gICAgY29uZiA9IChjb3JlX2Rpcl9jb25maWcgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhuZXdfZmlsZV9jb25mLAotCQkJCQkJICAgJmNvcmVfbW9kdWxlKTsKLSAgICBjb25mLT5kID0gY21kLT5wYXRoOwotICAgIGNvbmYtPmRfaXNfZm5tYXRjaCA9IGFwX2lzX2ZubWF0Y2goY29uZi0+ZCkgIT0gMDsKLSAgICBjb25mLT5yID0gcjsKLQotICAgIGFwX2FkZF9maWxlX2NvbmYoYywgbmV3X2ZpbGVfY29uZik7Ci0KLSAgICBpZiAoKmFyZyAhPSAnXDAnKSB7Ci0JcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCAiTXVsdGlwbGUgIiwgdGhpc2NtZC0+bmFtZSwKLQkJCSAgIj4gYXJndW1lbnRzIG5vdCAoeWV0KSBzdXBwb3J0ZWQuIiwgTlVMTCk7Ci0gICAgfQotCi0gICAgY21kLT5wYXRoID0gb2xkX3BhdGg7Ci0gICAgY21kLT5vdmVycmlkZSA9IG9sZF9vdmVycmlkZXM7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogWFhYOiBOQjogQ3VycmVudGx5LCB3ZSBoYXZlIG5vIHdheSBvZiBjaGVja2luZwotICogd2hldGhlciA8SWZNb2R1bGU+IHNlY3Rpb25zIGFyZSBjbG9zZWQgcHJvcGVybHkuCi0gKiBFeHRyYSAocmVkdW5kYW50LCB1bnBhaXJlZCkgPC9JZk1vZHVsZT4gZGlyZWN0aXZlcyBhcmUKLSAqIHNpbXBseSBzaWxlbnRseSBpZ25vcmVkLgotICovCi1zdGF0aWMgY29uc3QgY2hhciAqZW5kX2lmbW9kKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSkKLXsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnN0YXJ0X2lmbW9kKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGNoYXIgKmVuZHAgPSBzdHJyY2hyKGFyZywgJz4nKTsKLSAgICBjaGFyIGxbTUFYX1NUUklOR19MRU5dOwotICAgIGludCBub3QgPSAoYXJnWzBdID09ICchJyk7Ci0gICAgbW9kdWxlICpmb3VuZDsKLSAgICBpbnQgbmVzdCA9IDE7Ci0KLSAgICBpZiAoZW5kcCA9PSBOVUxMKSB7Ci0JcmV0dXJuIHVuY2xvc2VkX2RpcmVjdGl2ZShjbWQpOwotICAgIH0KLQotICAgICplbmRwID0gJ1wwJzsKLQotICAgIGlmIChub3QpIHsKLSAgICAgICAgYXJnKys7Ci0gICAgfQotCi0gICAgZm91bmQgPSBhcF9maW5kX2xpbmtlZF9tb2R1bGUoYXJnKTsKLQotICAgIGlmICgoIW5vdCAmJiBmb3VuZCkgfHwgKG5vdCAmJiAhZm91bmQpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHdoaWxlIChuZXN0ICYmICEoYXBfY2ZnX2dldGxpbmUobCwgTUFYX1NUUklOR19MRU4sIGNtZC0+Y29uZmlnX2ZpbGUpKSkgewotICAgICAgICBpZiAoIXN0cm5jYXNlY21wKGwsICI8SWZNb2R1bGUiLCA5KSkgewotCSAgICBuZXN0Kys7Ci0JfQotCWlmICghc3RyY2FzZWNtcChsLCAiPC9JZk1vZHVsZT4iKSkgewotCSAgbmVzdC0tOwotCX0KLSAgICB9Ci0KLSAgICBpZiAobmVzdCkgewotCWNtZC0+ZW5kX3Rva2VuID0gZW5kX2lmbW9kdWxlX3NlY3Rpb247Ci0JcmV0dXJuIG1pc3NpbmdfZW5kc2VjdGlvbihjbWQsIG5lc3QpOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX2V4aXN0c19jb25maWdfZGVmaW5lKGNoYXIgKm5hbWUpCi17Ci0gICAgY2hhciAqKmRlZmluZXM7Ci0gICAgaW50IGk7Ci0KLSAgICBkZWZpbmVzID0gKGNoYXIgKiopYXBfc2VydmVyX2NvbmZpZ19kZWZpbmVzLT5lbHRzOwotICAgIGZvciAoaSA9IDA7IGkgPCBhcF9zZXJ2ZXJfY29uZmlnX2RlZmluZXMtPm5lbHRzOyBpKyspIHsKLSAgICAgICAgaWYgKHN0cmNtcChkZWZpbmVzW2ldLCBuYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLQl9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqZW5kX2lmZGVmaW5lKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSkgCi17Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzdGFydF9pZmRlZmluZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBjaGFyICplbmRwOwotICAgIGNoYXIgbFtNQVhfU1RSSU5HX0xFTl07Ci0gICAgaW50IGRlZmluZWQ7Ci0gICAgaW50IG5vdCA9IDA7Ci0gICAgaW50IG5lc3QgPSAxOwotCi0gICAgZW5kcCA9IHN0cnJjaHIoYXJnLCAnPicpOwotICAgIGlmIChlbmRwID09IE5VTEwpIHsKLQlyZXR1cm4gdW5jbG9zZWRfZGlyZWN0aXZlKGNtZCk7Ci0gICAgfQotCi0gICAgKmVuZHAgPSAnXDAnOwotCi0gICAgaWYgKGFyZ1swXSA9PSAnIScpIHsKLSAgICAgICAgbm90ID0gMTsKLQlhcmcrKzsKLSAgICB9Ci0KLSAgICBkZWZpbmVkID0gYXBfZXhpc3RzX2NvbmZpZ19kZWZpbmUoYXJnKTsKLQotICAgIGlmICgoIW5vdCAmJiBkZWZpbmVkKSB8fCAobm90ICYmICFkZWZpbmVkKSkgewotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHdoaWxlIChuZXN0ICYmICEoYXBfY2ZnX2dldGxpbmUobCwgTUFYX1NUUklOR19MRU4sIGNtZC0+Y29uZmlnX2ZpbGUpKSkgewotICAgICAgICBpZiAoIXN0cm5jYXNlY21wKGwsICI8SWZEZWZpbmUiLCA5KSkgewotCSAgICBuZXN0Kys7Ci0JfQotCWlmICghc3RyY2FzZWNtcChsLCAiPC9JZkRlZmluZT4iKSkgewotCSAgICBuZXN0LS07Ci0JfQotICAgIH0KLSAgICBpZiAobmVzdCkgewotCWNtZC0+ZW5kX3Rva2VuID0gZW5kX2lmZGVmaW5lX3NlY3Rpb247Ci0JcmV0dXJuIG1pc3NpbmdfZW5kc2VjdGlvbihjbWQsIG5lc3QpOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogaHR0cGQuY29uZiBjb21tYW5kcy4uLiBiZWdpbm5pbmcgd2l0aCB0aGUgPFZpcnR1YWxIb3N0PiBidXNpbmVzcyAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqdmlydHVhbGhvc3Rfc2VjdGlvbihjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBzZXJ2ZXJfcmVjICptYWluX3NlcnZlciA9IGNtZC0+c2VydmVyLCAqczsKLSAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0gICAgY2hhciAqZW5kcCA9IHN0cnJjaHIoYXJnLCAnPicpOwotICAgIHBvb2wgKnAgPSBjbWQtPnBvb2wsICpwdGVtcCA9IGNtZC0+dGVtcF9wb29sOwotICAgIGNvbnN0IGNoYXIgKm9sZF9lbmRfdG9rZW47Ci0KLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoZW5kcCA9PSBOVUxMKSB7Ci0JcmV0dXJuIHVuY2xvc2VkX2RpcmVjdGl2ZShjbWQpOwotICAgIH0KLQotICAgICplbmRwID0gJ1wwJzsKLSAgICAKLSAgICAvKiBGSVhNRTogVGhlcmUncyBhbm90aGVyIGZlYXR1cmUgd2FpdGluZyB0byBoYXBwZW4gaGVyZSAtLSBzaW5jZSB5b3UKLQljYW4gbm93IHB1dCBtdWx0aXBsZSBhZGRyZXNzZXMvbmFtZXMgb24gYSBzaW5nbGUgPFZpcnR1YWxIb3N0PgotCXlvdSBtaWdodCB3YW50IHRvIHVzZSBpdCB0byBncm91cCBjb21tb24gZGVmaW5pdGlvbnMgYW5kIHRoZW4KLQlkZWZpbmUgb3RoZXIgInN1Ymhvc3RzIiB3aXRoIHRoZWlyIGluZGl2aWR1YWwgZGlmZmVyZW5jZXMuICBCdXQKLQlwZXJzb25hbGx5IEknZCByYXRoZXIganVzdCBkbyBpdCB3aXRoIGEgbWFjcm8gcHJlcHJvY2Vzc29yLiAtZGpnICovCi0gICAgaWYgKG1haW5fc2VydmVyLT5pc192aXJ0dWFsKSB7Ci0JcmV0dXJuICI8VmlydHVhbEhvc3Q+IGRvZXNuJ3QgbmVzdCEiOwotICAgIH0KLSAgICAKLSAgICBlcnJtc2cgPSBhcF9pbml0X3ZpcnR1YWxfaG9zdChwLCBhcmcsIG1haW5fc2VydmVyLCAmcyk7Ci0gICAgaWYgKGVycm1zZykgewotCXJldHVybiBlcnJtc2c7Ci0gICAgfQotCi0gICAgcy0+bmV4dCA9IG1haW5fc2VydmVyLT5uZXh0OwotICAgIG1haW5fc2VydmVyLT5uZXh0ID0gczsKLQotICAgIHMtPmRlZm5fbmFtZSA9IGNtZC0+Y29uZmlnX2ZpbGUtPm5hbWU7Ci0gICAgcy0+ZGVmbl9saW5lX251bWJlciA9IGNtZC0+Y29uZmlnX2ZpbGUtPmxpbmVfbnVtYmVyOwotCi0gICAgb2xkX2VuZF90b2tlbiA9IGNtZC0+ZW5kX3Rva2VuOwotICAgIGNtZC0+ZW5kX3Rva2VuID0gZW5kX3ZpcnR1YWxob3N0X3NlY3Rpb247Ci0gICAgY21kLT5zZXJ2ZXIgPSBzOwotICAgIGVycm1zZyA9IGFwX3NybV9jb21tYW5kX2xvb3AoY21kLCBzLT5sb29rdXBfZGVmYXVsdHMpOwotICAgIGNtZC0+c2VydmVyID0gbWFpbl9zZXJ2ZXI7Ci0gICAgaWYgKGVycm1zZyA9PSBOVUxMKSB7Ci0JZXJybXNnID0gbWlzc2luZ19lbmRzZWN0aW9uKGNtZCwgMSk7Ci0gICAgfQotICAgIGNtZC0+ZW5kX3Rva2VuID0gb2xkX2VuZF90b2tlbjsKLQotICAgIGlmIChzLT5zcm1fY29uZm5hbWUpIHsKLQlhcF9wcm9jZXNzX3Jlc291cmNlX2NvbmZpZyhzLCBzLT5zcm1fY29uZm5hbWUsIHAsIHB0ZW1wKTsKLSAgICB9Ci0KLSAgICBpZiAocy0+YWNjZXNzX2NvbmZuYW1lKSB7Ci0JYXBfcHJvY2Vzc19yZXNvdXJjZV9jb25maWcocywgcy0+YWNjZXNzX2NvbmZuYW1lLCBwLCBwdGVtcCk7Ci0gICAgfQotICAgIAotICAgIGlmIChlcnJtc2cgPT0gZW5kX3ZpcnR1YWxob3N0X3NlY3Rpb24pIHsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIGVycm1zZzsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9zZXJ2ZXJfYWxpYXMoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LAotCQkJCSAgICBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgaWYgKCFjbWQtPnNlcnZlci0+bmFtZXMpIHsKLQlyZXR1cm4gIlNlcnZlckFsaWFzIG9ubHkgdXNlZCBpbiA8VmlydHVhbEhvc3Q+IjsKLSAgICB9Ci0gICAgd2hpbGUgKCphcmcpIHsKLQljaGFyICoqaXRlbSwgKm5hbWUgPSBhcF9nZXR3b3JkX2NvbmYoY21kLT5wb29sLCAmYXJnKTsKLQlpZiAoYXBfaXNfbWF0Y2hleHAobmFtZSkpIHsKLQkgICAgaXRlbSA9IChjaGFyICoqKWFwX3B1c2hfYXJyYXkoY21kLT5zZXJ2ZXItPndpbGRfbmFtZXMpOwotCX0KLQllbHNlIHsKLQkgICAgaXRlbSA9IChjaGFyICoqKWFwX3B1c2hfYXJyYXkoY21kLT5zZXJ2ZXItPm5hbWVzKTsKLQl9Ci0JKml0ZW0gPSBuYW1lOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmFkZF9tb2R1bGVfY29tbWFuZChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoIWFwX2FkZF9uYW1lZF9tb2R1bGUoYXJnKSkgewotCXJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIkNhbm5vdCBhZGQgbW9kdWxlIHZpYSBuYW1lICciLCBhcmcsIAotCQkJICAiJzogbm90IGluIGxpc3Qgb2YgbG9hZGVkIG1vZHVsZXMiLCBOVUxMKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjbGVhcl9tb2R1bGVfbGlzdF9jb21tYW5kKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSkKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBhcF9jbGVhcl9tb2R1bGVfbGlzdCgpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3NlcnZlcl9zdHJpbmdfc2xvdChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksCi0JCQkJCSAgY2hhciAqYXJnKQotewotICAgIC8qIFRoaXMgb25lJ3MgcHJldHR5IGdlbmVyaWMuLi4gKi8KLSAgCi0gICAgaW50IG9mZnNldCA9IChpbnQpKGxvbmcpY21kLT5pbmZvOwotICAgIGNoYXIgKnN0cnVjdF9wdHIgPSAoY2hhciAqKWNtZC0+c2VydmVyOwotICAgIAotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgCi0JCQkJCSAgIE5PVF9JTl9ESVJfTE9DX0ZJTEV8Tk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAqKGNoYXIgKiopKHN0cnVjdF9wdHIgKyBvZmZzZXQpID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2VydmVyX3R5cGUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKCFzdHJjYXNlY21wKGFyZywgImluZXRkIikpIHsKLSAgICAgICAgYXBfc3RhbmRhbG9uZSA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZywgInN0YW5kYWxvbmUiKSkgewotICAgICAgICBhcF9zdGFuZGFsb25lID0gMTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJldHVybiAiU2VydmVyVHlwZSBtdXN0IGJlIGVpdGhlciAnaW5ldGQnIG9yICdzdGFuZGFsb25lJyI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXJ2ZXJfcG9ydChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIE5PVF9JTl9ESVJfTE9DX0ZJTEV8Tk9UX0lOX0xJTUlUKTsKLSAgICBpbnQgcG9ydDsKLQotICAgIGlmIChlcnIgIT0gTlVMTCkgewotCXJldHVybiBlcnI7Ci0gICAgfQotICAgIHBvcnQgPSBhdG9pKGFyZyk7Ci0gICAgaWYgKHBvcnQgPD0gMCB8fCBwb3J0ID49IDY1NTM2KSB7IC8qIDY1NTM2ID09IDE8PDE2ICovCi0JcmV0dXJuIGFwX3BzdHJjYXQoY21kLT50ZW1wX3Bvb2wsICJUaGUgcG9ydCBudW1iZXIgXCIiLCBhcmcsIAotCQkJICAiXCIgaXMgb3V0c2lkZSB0aGUgYXBwcm9wcmlhdGUgcmFuZ2UgIgotCQkJICAiKGkuZS4sIDEuLjY1NTM1KS4iLCBOVUxMKTsKLSAgICB9Ci0gICAgY21kLT5zZXJ2ZXItPnBvcnQgPSBwb3J0OwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3NpZ25hdHVyZV9mbGFnKGNtZF9wYXJtcyAqY21kLCBjb3JlX2Rpcl9jb25maWcgKmQsIAotCQkJCSAgICAgIGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIE5PVF9JTl9MSU1JVCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKHN0cmNhc2VjbXAoYXJnLCAiT24iKSA9PSAwKSB7Ci0JZC0+c2VydmVyX3NpZ25hdHVyZSA9IHNydl9zaWdfb247Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAoYXJnLCAiT2ZmIikgPT0gMCkgewotICAgICAgICBkLT5zZXJ2ZXJfc2lnbmF0dXJlID0gc3J2X3NpZ19vZmY7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAoYXJnLCAiRU1haWwiKSA9PSAwKSB7Ci0JZC0+c2VydmVyX3NpZ25hdHVyZSA9IHNydl9zaWdfd2l0aG1haWw7Ci0gICAgfQotICAgIGVsc2UgewotCXJldHVybiAiU2VydmVyU2lnbmF0dXJlOiB1c2Ugb25lIG9mOiBvZmYgfCBvbiB8IGVtYWlsIjsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfc2VuZF9idWZmZXJfc2l6ZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBpbnQgcyA9IGF0b2koYXJnKTsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAocyA8IDUxMiAmJiBzICE9IDApIHsKLSAgICAgICAgcmV0dXJuICJTZW5kQnVmZmVyU2l6ZSBtdXN0IGJlID49IDUxMiBieXRlcywgb3IgMCBmb3Igc3lzdGVtIGRlZmF1bHQuIjsKLSAgICB9Ci0gICAgY21kLT5zZXJ2ZXItPnNlbmRfYnVmZmVyX3NpemUgPSBzOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3VzZXIoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0jaWZkZWYgV0lOMzIKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19OT1RJQ0UsIGNtZC0+c2VydmVyLAotCQkgIlVzZXIgZGlyZWN0aXZlIGhhcyBubyBhZmZlY3Qgb24gV2luMzIiKTsKLSAgICBjbWQtPnNlcnZlci0+c2VydmVyX3VpZCA9IGFwX3VzZXJfaWQgPSAxOwotI2Vsc2UKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIE5PVF9JTl9ESVJfTE9DX0ZJTEV8Tk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoIWNtZC0+c2VydmVyLT5pc192aXJ0dWFsKSB7Ci0JYXBfdXNlcl9uYW1lID0gYXJnOwotCWNtZC0+c2VydmVyLT5zZXJ2ZXJfdWlkID0gYXBfdXNlcl9pZCA9IGFwX3VuYW1lMmlkKGFyZyk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBpZiAoYXBfc3VleGVjX2VuYWJsZWQpIHsKLQkgICAgY21kLT5zZXJ2ZXItPnNlcnZlcl91aWQgPSBhcF91bmFtZTJpZChhcmcpOwotCX0KLQllbHNlIHsKLQkgICAgY21kLT5zZXJ2ZXItPnNlcnZlcl91aWQgPSBhcF91c2VyX2lkOwotCSAgICBmcHJpbnRmKHN0ZGVyciwKLQkJICAgICJXYXJuaW5nOiBVc2VyIGRpcmVjdGl2ZSBpbiA8VmlydHVhbEhvc3Q+ICIKLQkJICAgICJyZXF1aXJlcyBTVUVYRUMgd3JhcHBlci5cbiIpOwotCX0KLSAgICB9Ci0jaWYgIWRlZmluZWQgKEJJR19TRUNVUklUWV9IT0xFKSAmJiAhZGVmaW5lZCAoT1MyKQotICAgIGlmIChjbWQtPnNlcnZlci0+c2VydmVyX3VpZCA9PSAwKSB7Ci0JZnByaW50ZihzdGRlcnIsCi0JCSJFcnJvcjpcdEFwYWNoZSBoYXMgbm90IGJlZW4gZGVzaWduZWQgdG8gc2VydmUgcGFnZXMgd2hpbGVcbiIKLQkJIlx0cnVubmluZyBhcyByb290LiAgVGhlcmUgYXJlIGtub3duIHJhY2UgY29uZGl0aW9ucyB0aGF0XG4iCi0JCSJcdHdpbGwgYWxsb3cgYW55IGxvY2FsIHVzZXIgdG8gcmVhZCBhbnkgZmlsZSBvbiB0aGUgc3lzdGVtLlxuIgotCQkiXHRJZiB5b3Ugc3RpbGwgZGVzaXJlIHRvIHNlcnZlIHBhZ2VzIGFzIHJvb3QgdGhlblxuIgotCQkiXHRhZGQgLURCSUdfU0VDVVJJVFlfSE9MRSB0byB0aGUgRVhUUkFfQ0ZMQUdTIGxpbmUgaW4geW91clxuIgotCQkiXHRzcmMvQ29uZmlndXJhdGlvbiBmaWxlIGFuZCByZWJ1aWxkIHRoZSBzZXJ2ZXIuICBJdCBpc1xuIgotCQkiXHRzdHJvbmdseSBzdWdnZXN0ZWQgdGhhdCB5b3UgaW5zdGVhZCBtb2RpZnkgdGhlIFVzZXJcbiIKLQkJIlx0ZGlyZWN0aXZlIGluIHlvdXIgaHR0cGQuY29uZiBmaWxlIHRvIGxpc3QgYSBub24tcm9vdFxuIgotCQkiXHR1c2VyLlxuIik7Ci0JZXhpdCAoMSk7Ci0gICAgfQotI2VuZGlmCi0jZW5kaWYgLyogV0lOMzIgKi8KLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2dyb3VwKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgTk9UX0lOX0RJUl9MT0NfRklMRXxOT1RfSU5fTElNSVQpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmICghY21kLT5zZXJ2ZXItPmlzX3ZpcnR1YWwpIHsKLQljbWQtPnNlcnZlci0+c2VydmVyX2dpZCA9IGFwX2dyb3VwX2lkID0gYXBfZ25hbWUyaWQoYXJnKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmIChhcF9zdWV4ZWNfZW5hYmxlZCkgewotCSAgICBjbWQtPnNlcnZlci0+c2VydmVyX2dpZCA9IGFwX2duYW1lMmlkKGFyZyk7Ci0JfQotCWVsc2UgewotCSAgICBjbWQtPnNlcnZlci0+c2VydmVyX2dpZCA9IGFwX2dyb3VwX2lkOwotCSAgICBmcHJpbnRmKHN0ZGVyciwKLQkJICAgICJXYXJuaW5nOiBHcm91cCBkaXJlY3RpdmUgaW4gPFZpcnR1YWxIb3N0PiByZXF1aXJlcyAiCi0JCSAgICAiU1VFWEVDIHdyYXBwZXIuXG4iKTsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfc2VydmVyX3Jvb3QoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotCi0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgYXJnID0gYXBfb3NfY2Fub25pY2FsX2ZpbGVuYW1lKGNtZC0+cG9vbCwgYXJnKTsKLQotICAgIGlmICghYXBfaXNfZGlyZWN0b3J5KGFyZykpIHsKLSAgICAgICAgcmV0dXJuICJTZXJ2ZXJSb290IG11c3QgYmUgYSB2YWxpZCBkaXJlY3RvcnkiOwotICAgIH0KLSAgICBhcF9jcHlzdHJuKGFwX3NlcnZlcl9yb290LCBhcmcsCi0JICAgICAgIHNpemVvZihhcF9zZXJ2ZXJfcm9vdCkpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3RpbWVvdXQoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBOT1RfSU5fRElSX0xPQ19GSUxFfE5PVF9JTl9MSU1JVCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgY21kLT5zZXJ2ZXItPnRpbWVvdXQgPSBhdG9pKGFyZyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfa2VlcF9hbGl2ZV90aW1lb3V0KGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwKLQkJCQkJICBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBOT1RfSU5fRElSX0xPQ19GSUxFfE5PVF9JTl9MSU1JVCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgY21kLT5zZXJ2ZXItPmtlZXBfYWxpdmVfdGltZW91dCA9IGF0b2koYXJnKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9rZWVwX2FsaXZlKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIE5PVF9JTl9ESVJfTE9DX0ZJTEV8Tk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBXZSd2ZSBjaGFuZ2VkIGl0IHRvIE9uL09mZiwgYnV0IHVzZWQgdG8gdXNlIG51bWJlcnMKLSAgICAgKiBzbyB3ZSBhY2NlcHQgYW55dGhpbmcgYnV0ICJPZmYiIG9yICIwIiBhcyAiT24iCi0gICAgICovCi0gICAgaWYgKCFzdHJjYXNlY21wKGFyZywgIm9mZiIpIHx8ICFzdHJjbXAoYXJnLCAiMCIpKSB7Ci0JY21kLT5zZXJ2ZXItPmtlZXBfYWxpdmUgPSAwOwotICAgIH0KLSAgICBlbHNlIHsKLQljbWQtPnNlcnZlci0+a2VlcF9hbGl2ZSA9IDE7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2tlZXBfYWxpdmVfbWF4KGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIE5PVF9JTl9ESVJfTE9DX0ZJTEV8Tk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBjbWQtPnNlcnZlci0+a2VlcF9hbGl2ZV9tYXggPSBhdG9pKGFyZyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfcGlkZmlsZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKGNtZC0+c2VydmVyLT5pc192aXJ0dWFsKSB7Ci0JcmV0dXJuICJQaWRGaWxlIGRpcmVjdGl2ZSBub3QgYWxsb3dlZCBpbiA8VmlydHVhbEhvc3Q+IjsKLSAgICB9Ci0gICAgYXBfcGlkX2ZuYW1lID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3Njb3JlYm9hcmQoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX3Njb3JlYm9hcmRfZm5hbWUgPSBhcmc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbG9ja2ZpbGUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX2xvY2tfZm5hbWUgPSBhcmc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfaWRjaGVjayhjbWRfcGFybXMgKmNtZCwgY29yZV9kaXJfY29uZmlnICpkLCBpbnQgYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIE5PVF9JTl9MSU1JVCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZC0+ZG9fcmZjMTQxMyA9IGFyZyAhPSAwOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2hvc3RuYW1lX2xvb2t1cHMoY21kX3Bhcm1zICpjbWQsIGNvcmVfZGlyX2NvbmZpZyAqZCwKLQkJCQkJY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgTk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoIXN0cmNhc2VjbXAoYXJnLCAib24iKSkgewotCWQtPmhvc3RuYW1lX2xvb2t1cHMgPSBIT1NUTkFNRV9MT09LVVBfT047Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZywgIm9mZiIpKSB7Ci0JZC0+aG9zdG5hbWVfbG9va3VwcyA9IEhPU1ROQU1FX0xPT0tVUF9PRkY7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZywgImRvdWJsZSIpKSB7Ci0JZC0+aG9zdG5hbWVfbG9va3VwcyA9IEhPU1ROQU1FX0xPT0tVUF9ET1VCTEU7Ci0gICAgfQotICAgIGVsc2UgewotCXJldHVybiAicGFyYW1ldGVyIG11c3QgYmUgJ29uJywgJ29mZicsIG9yICdkb3VibGUnIjsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfc2VydmVycGF0aChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBOT1RfSU5fRElSX0xPQ19GSUxFfE5PVF9JTl9MSU1JVCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgY21kLT5zZXJ2ZXItPnBhdGggPSBhcmc7Ci0gICAgY21kLT5zZXJ2ZXItPnBhdGhsZW4gPSBzdHJsZW4oYXJnKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9jb250ZW50X21kNShjbWRfcGFybXMgKmNtZCwgY29yZV9kaXJfY29uZmlnICpkLCBpbnQgYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgTk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBkLT5jb250ZW50X21kNSA9IGFyZyAhPSAwOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3VzZV9jYW5vbmljYWxfbmFtZShjbWRfcGFybXMgKmNtZCwgY29yZV9kaXJfY29uZmlnICpkLCAKLQkJCQkJICBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBOT1RfSU5fTElNSVQpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotCXJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKHN0cmNhc2VjbXAoYXJnLCAib24iKSA9PSAwKSB7Ci0gICAgICAgIGQtPnVzZV9jYW5vbmljYWxfbmFtZSA9IFVTRV9DQU5PTklDQUxfTkFNRV9PTjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcChhcmcsICJvZmYiKSA9PSAwKSB7Ci0gICAgICAgIGQtPnVzZV9jYW5vbmljYWxfbmFtZSA9IFVTRV9DQU5PTklDQUxfTkFNRV9PRkY7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAoYXJnLCAiZG5zIikgPT0gMCkgewotICAgICAgICBkLT51c2VfY2Fub25pY2FsX25hbWUgPSBVU0VfQ0FOT05JQ0FMX05BTUVfRE5TOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcmV0dXJuICJwYXJhbWV0ZXIgbXVzdCBiZSAnb24nLCAnb2ZmJywgb3IgJ2RucyciOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9kYWVtb25zX3RvX3N0YXJ0KGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSNpZmRlZiBXSU4zMgotICAgIGZwcmludGYoc3RkZXJyLCAiV0FSTklORzogU3RhcnRTZXJ2ZXJzIGhhcyBubyBlZmZlY3Qgb24gV2luMzJcbiIpOwotI2Vsc2UKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBhcF9kYWVtb25zX3RvX3N0YXJ0ID0gYXRvaShhcmcpOwotI2VuZGlmCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbWluX2ZyZWVfc2VydmVycyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBhcF9kYWVtb25zX21pbl9mcmVlID0gYXRvaShhcmcpOwotICAgIGlmIChhcF9kYWVtb25zX21pbl9mcmVlIDw9IDApIHsKLSAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkc6IGRldGVjdGVkIE1pblNwYXJlU2VydmVycyBzZXQgdG8gbm9uLXBvc2l0aXZlLlxuIik7Ci0gICAgICAgZnByaW50ZihzdGRlcnIsICJSZXNldHRpbmcgdG8gMSB0byBhdm9pZCBhbG1vc3QgY2VydGFpbiBBcGFjaGUgZmFpbHVyZS5cbiIpOwotICAgICAgIGZwcmludGYoc3RkZXJyLCAiUGxlYXNlIHJlYWQgdGhlIGRvY3VtZW50YXRpb24uXG4iKTsKLSAgICAgICBhcF9kYWVtb25zX21pbl9mcmVlID0gMTsKLSAgICB9Ci0gICAgICAgCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbWF4X2ZyZWVfc2VydmVycyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBhcF9kYWVtb25zX21heF9mcmVlID0gYXRvaShhcmcpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3NlcnZlcl9saW1pdCAoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX2RhZW1vbnNfbGltaXQgPSBhdG9pKGFyZyk7Ci0gICAgaWYgKGFwX2RhZW1vbnNfbGltaXQgPiBIQVJEX1NFUlZFUl9MSU1JVCkgewotICAgICAgIGZwcmludGYoc3RkZXJyLCAiV0FSTklORzogTWF4Q2xpZW50cyBvZiAlZCBleGNlZWRzIGNvbXBpbGUgdGltZSBsaW1pdCAiCi0gICAgICAgICAgICJvZiAlZCBzZXJ2ZXJzLFxuIiwgYXBfZGFlbW9uc19saW1pdCwgSEFSRF9TRVJWRVJfTElNSVQpOwotICAgICAgIGZwcmludGYoc3RkZXJyLCAiIGxvd2VyaW5nIE1heENsaWVudHMgdG8gJWQuICBUbyBpbmNyZWFzZSwgcGxlYXNlICIKLSAgICAgICAgICAgInNlZSB0aGVcbiIsIEhBUkRfU0VSVkVSX0xJTUlUKTsKLSAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiBIQVJEX1NFUlZFUl9MSU1JVCBkZWZpbmUgaW4gc3JjL2luY2x1ZGUvaHR0cGQuaC5cbiIpOwotICAgICAgIGFwX2RhZW1vbnNfbGltaXQgPSBIQVJEX1NFUlZFUl9MSU1JVDsKLSAgICB9IAotICAgIGVsc2UgaWYgKGFwX2RhZW1vbnNfbGltaXQgPCAxKSB7Ci0JZnByaW50ZihzdGRlcnIsICJXQVJOSU5HOiBSZXF1aXJlIE1heENsaWVudHMgPiAwLCBzZXR0aW5nIHRvIDFcbiIpOwotCWFwX2RhZW1vbnNfbGltaXQgPSAxOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9tYXhfcmVxdWVzdHMoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQgPSBhdG9pKGFyZyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfdGhyZWFkcyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykgewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX3RocmVhZHNfcGVyX2NoaWxkID0gYXRvaShhcmcpOwotICAgIGlmIChhcF90aHJlYWRzX3Blcl9jaGlsZCA+IEhBUkRfU0VSVkVSX0xJTUlUKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiV0FSTklORzogVGhyZWFkc1BlckNoaWxkIG9mICVkIGV4Y2VlZHMgY29tcGlsZSB0aW1lIGxpbWl0ICIKLSAgICAgICAgICAgICAgICAib2YgJWQgdGhyZWFkcyxcbiIsIGFwX3RocmVhZHNfcGVyX2NoaWxkLCBIQVJEX1NFUlZFUl9MSU1JVCk7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiIGxvd2VyaW5nIFRocmVhZHNQZXJDaGlsZCB0byAlZC4gIFRvIGluY3JlYXNlLCBwbGVhc2UgIgotICAgICAgICAgICAgICAgICJzZWUgdGhlXG4iLCBIQVJEX1NFUlZFUl9MSU1JVCk7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiIEhBUkRfU0VSVkVSX0xJTUlUIGRlZmluZSBpbiBzcmMvaW5jbHVkZS9odHRwZC5oLlxuIik7Ci0gICAgICAgIGFwX3RocmVhZHNfcGVyX2NoaWxkID0gSEFSRF9TRVJWRVJfTElNSVQ7Ci0gICAgfSAKLSAgICBlbHNlIGlmIChhcF90aHJlYWRzX3Blcl9jaGlsZCA8IDEpIHsKLQlmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkc6IFJlcXVpcmUgVGhyZWFkc1BlckNoaWxkID4gMCwgc2V0dGluZyB0byAxXG4iKTsKLQlhcF90aHJlYWRzX3Blcl9jaGlsZCA9IDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfZXhjZXNzX3JlcXVlc3RzKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBhcF9leGNlc3NfcmVxdWVzdHNfcGVyX2NoaWxkID0gYXRvaShhcmcpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0KLSNpZiBkZWZpbmVkKFJMSU1JVF9DUFUpIHx8IGRlZmluZWQoUkxJTUlUX0RBVEEpIHx8IGRlZmluZWQoUkxJTUlUX1ZNRU0pIHx8IGRlZmluZWQoUkxJTUlUX05QUk9DKSB8fCBkZWZpbmVkKFJMSU1JVF9BUykKLXN0YXRpYyB2b2lkIHNldF9ybGltaXQoY21kX3Bhcm1zICpjbWQsIHN0cnVjdCBybGltaXQgKipwbGltaXQsIGNvbnN0IGNoYXIgKmFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGFyZzIsIGludCB0eXBlKQotewotICAgIGNoYXIgKnN0cjsKLSAgICBzdHJ1Y3QgcmxpbWl0ICpsaW1pdDsKLSAgICAvKiBJZiB5b3VyIHBsYXRmb3JtIGRvZXNuJ3QgZGVmaW5lIHJsaW1fdCB0aGVuIHR5cGVkZWYgaXQgaW4gYXBfY29uZmlnLmggKi8KLSAgICBybGltX3QgY3VyID0gMDsKLSAgICBybGltX3QgbWF4ID0gMDsKLQotICAgICpwbGltaXQgPSAoc3RydWN0IHJsaW1pdCAqKWFwX3BjYWxsb2MoY21kLT5wb29sLCBzaXplb2YoKipwbGltaXQpKTsKLSAgICBsaW1pdCA9ICpwbGltaXQ7Ci0gICAgaWYgKChnZXRybGltaXQodHlwZSwgbGltaXQpKSAhPSAwKQl7Ci0JKnBsaW1pdCA9IE5VTEw7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgY21kLT5zZXJ2ZXIsCi0JCSAgICAgIiVzOiBnZXRybGltaXQgZmFpbGVkIiwgY21kLT5jbWQtPm5hbWUpOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoKHN0ciA9IGFwX2dldHdvcmRfY29uZihjbWQtPnBvb2wsICZhcmcpKSkgewotCWlmICghc3RyY2FzZWNtcChzdHIsICJtYXgiKSkgewotCSAgICBjdXIgPSBsaW1pdC0+cmxpbV9tYXg7Ci0JfQotCWVsc2UgewotCSAgICBjdXIgPSBhdG9sKHN0cik7Ci0JfQotICAgIH0KLSAgICBlbHNlIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIGNtZC0+c2VydmVyLAotCQkgICAgICJJbnZhbGlkIHBhcmFtZXRlcnMgZm9yICVzIiwgY21kLT5jbWQtPm5hbWUpOwotCXJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGFyZzIgJiYgKHN0ciA9IGFwX2dldHdvcmRfY29uZihjbWQtPnBvb2wsICZhcmcyKSkpIHsKLQltYXggPSBhdG9sKHN0cik7Ci0gICAgfQotCi0gICAgLyogaWYgd2UgYXJlbid0IHJ1bm5pbmcgYXMgcm9vdCwgY2Fubm90IGluY3JlYXNlIG1heCAqLwotICAgIGlmIChnZXRldWlkKCkpIHsKLQlsaW1pdC0+cmxpbV9jdXIgPSBjdXI7Ci0JaWYgKG1heCkgewotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIGNtZC0+c2VydmVyLAotCQkJICJNdXN0IGJlIHVpZCAwIHRvIHJhaXNlIG1heGltdW0gJXMiLCBjbWQtPmNtZC0+bmFtZSk7Ci0JfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKGN1cikgewotCSAgICBsaW1pdC0+cmxpbV9jdXIgPSBjdXI7Ci0JfQotICAgICAgICBpZiAobWF4KSB7Ci0JICAgIGxpbWl0LT5ybGltX21heCA9IG1heDsKLQl9Ci0gICAgfQotfQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoUkxJTUlUX0NQVSkgfHwgIShkZWZpbmVkIChSTElNSVRfREFUQSkgfHwgZGVmaW5lZCAoUkxJTUlUX1ZNRU0pIHx8IGRlZmluZWQoUkxJTUlUX0FTKSkgfHwgIWRlZmluZWQgKFJMSU1JVF9OUFJPQykKLXN0YXRpYyBjb25zdCBjaGFyICpub19zZXRfbGltaXQoY21kX3Bhcm1zICpjbWQsIGNvcmVfZGlyX2NvbmZpZyAqY29uZiwKLQkJCQljaGFyICphcmcsIGNoYXIgKmFyZzIpCi17Ci0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCBjbWQtPnNlcnZlciwKLQkJIiVzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIsIGNtZC0+Y21kLT5uYW1lKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLSNlbmRpZgotCi0jaWZkZWYgUkxJTUlUX0NQVQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9saW1pdF9jcHUoY21kX3Bhcm1zICpjbWQsIGNvcmVfZGlyX2NvbmZpZyAqY29uZiwgCi0JCQkJIGNoYXIgKmFyZywgY2hhciAqYXJnMikKLXsKLSAgICBzZXRfcmxpbWl0KGNtZCwgJmNvbmYtPmxpbWl0X2NwdSwgYXJnLCBhcmcyLCBSTElNSVRfQ1BVKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoUkxJTUlUX0RBVEEpIHx8IGRlZmluZWQgKFJMSU1JVF9WTUVNKSB8fCBkZWZpbmVkKFJMSU1JVF9BUykKLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbGltaXRfbWVtKGNtZF9wYXJtcyAqY21kLCBjb3JlX2Rpcl9jb25maWcgKmNvbmYsIAotCQkJCSBjaGFyICphcmcsIGNoYXIgKiBhcmcyKQotewotI2lmIGRlZmluZWQoUkxJTUlUX0FTKQotICAgIHNldF9ybGltaXQoY21kLCAmY29uZi0+bGltaXRfbWVtLCBhcmcsIGFyZzIgLFJMSU1JVF9BUyk7Ci0jZWxpZiBkZWZpbmVkKFJMSU1JVF9EQVRBKQotICAgIHNldF9ybGltaXQoY21kLCAmY29uZi0+bGltaXRfbWVtLCBhcmcsIGFyZzIsIFJMSU1JVF9EQVRBKTsKLSNlbGlmIGRlZmluZWQoUkxJTUlUX1ZNRU0pCi0gICAgc2V0X3JsaW1pdChjbWQsICZjb25mLT5saW1pdF9tZW0sIGFyZywgYXJnMiwgUkxJTUlUX1ZNRU0pOwotI2VuZGlmCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFJMSU1JVF9OUFJPQwotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9saW1pdF9ucHJvYyhjbWRfcGFybXMgKmNtZCwgY29yZV9kaXJfY29uZmlnICpjb25mLCAgCi0JCQkJICAgY2hhciAqYXJnLCBjaGFyICogYXJnMikKLXsKLSAgICBzZXRfcmxpbWl0KGNtZCwgJmNvbmYtPmxpbWl0X25wcm9jLCBhcmcsIGFyZzIsIFJMSU1JVF9OUFJPQyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9iaW5kX2FkZHJlc3MoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX2JpbmRfYWRkcmVzcy5zX2FkZHIgPSBhcF9nZXRfdmlydGhvc3RfYWRkcihhcmcsIE5VTEwpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2xpc3RlbmVyKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqaXBzKQotewotICAgIGxpc3Rlbl9yZWMgKm5ldzsKLSAgICBjaGFyICpwb3J0czsKLSAgICB1bnNpZ25lZCBzaG9ydCBwb3J0OwotCi0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcG9ydHMgPSBzdHJjaHIoaXBzLCAnOicpOwotICAgIGlmIChwb3J0cyAhPSBOVUxMKSB7Ci0JaWYgKHBvcnRzID09IGlwcykgewotCSAgICByZXR1cm4gIk1pc3NpbmcgSVAgYWRkcmVzcyI7Ci0JfQotCWVsc2UgaWYgKHBvcnRzWzFdID09ICdcMCcpIHsKLQkgICAgcmV0dXJuICJBZGRyZXNzIG11c3QgZW5kIGluIDo8cG9ydC1udW1iZXI+IjsKLQl9Ci0JKihwb3J0cysrKSA9ICdcMCc7Ci0gICAgfQotICAgIGVsc2UgewotCXBvcnRzID0gaXBzOwotICAgIH0KLQotICAgIG5ldz1hcF9wY2FsbG9jKGNtZC0+cG9vbCwgc2l6ZW9mKGxpc3Rlbl9yZWMpKTsKLSAgICBuZXctPmxvY2FsX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgaWYgKHBvcnRzID09IGlwcykgeyAvKiBubyBhZGRyZXNzICovCi0JbmV3LT5sb2NhbF9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOwotICAgIH0KLSAgICBlbHNlIHsKLQluZXctPmxvY2FsX2FkZHIuc2luX2FkZHIuc19hZGRyID0gYXBfZ2V0X3ZpcnRob3N0X2FkZHIoaXBzLCBOVUxMKTsKLSAgICB9Ci0gICAgcG9ydCA9IGF0b2kocG9ydHMpOwotICAgIGlmICghcG9ydCkgewotCXJldHVybiAiUG9ydCBtdXN0IGJlIG51bWVyaWMiOwotICAgIH0KLSAgICBuZXctPmxvY2FsX2FkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKLSAgICBuZXctPmZkID0gLTE7Ci0gICAgbmV3LT51c2VkID0gMDsKLSAgICBuZXctPm5leHQgPSBhcF9saXN0ZW5lcnM7Ci0gICAgYXBfbGlzdGVuZXJzID0gbmV3OwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2xpc3RlbmJhY2tsb2coY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGludCBiOwotCi0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgYiA9IGF0b2koYXJnKTsKLSAgICBpZiAoYiA8IDEpIHsKLSAgICAgICAgcmV0dXJuICJMaXN0ZW5CYWNrbG9nIG11c3QgYmUgPiAwIjsKLSAgICB9Ci0gICAgYXBfbGlzdGVuYmFja2xvZyA9IGI7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfY29yZWR1bXBkaXIgKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBzdHJ1Y3Qgc3RhdCBmaW5mbzsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBhcmcgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShjbWQtPnBvb2wsIGFyZyk7Ci0gICAgaWYgKChzdGF0KGFyZywgJmZpbmZvKSA9PSAtMSkgfHwgIVNfSVNESVIoZmluZm8uc3RfbW9kZSkpIHsKLQlyZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsICJDb3JlRHVtcERpcmVjdG9yeSAiLCBhcmcsIAotCQkJICAiIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhIGRpcmVjdG9yeSIsIE5VTEwpOwotICAgIH0KLSAgICBhcF9jcHlzdHJuKGFwX2NvcmVkdW1wX2RpciwgYXJnLCBzaXplb2YoYXBfY29yZWR1bXBfZGlyKSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICppbmNsdWRlX2NvbmZpZyAoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICpuYW1lKQotewotICAgIG5hbWUgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShjbWQtPnBvb2wsIG5hbWUpOwotICAgIAotICAgIGFwX3Byb2Nlc3NfcmVzb3VyY2VfY29uZmlnKGNtZC0+c2VydmVyLCBuYW1lLCBjbWQtPnBvb2wsIGNtZC0+dGVtcF9wb29sKTsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2xvZ2xldmVsKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY29uc3QgY2hhciAqYXJnKSAKLXsKLSAgICBjaGFyICpzdHI7Ci0gICAgCi0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLAotCQkJCQkgICBOT1RfSU5fRElSX0xPQ19GSUxFfE5PVF9JTl9MSU1JVCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKChzdHIgPSBhcF9nZXR3b3JkX2NvbmYoY21kLT5wb29sLCAmYXJnKSkpIHsKLSAgICAgICAgaWYgKCFzdHJjYXNlY21wKHN0ciwgImVtZXJnIikpIHsKLQkgICAgY21kLT5zZXJ2ZXItPmxvZ2xldmVsID0gQVBMT0dfRU1FUkc7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHN0ciwgImFsZXJ0IikpIHsKLQkgICAgY21kLT5zZXJ2ZXItPmxvZ2xldmVsID0gQVBMT0dfQUxFUlQ7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHN0ciwgImNyaXQiKSkgewotCSAgICBjbWQtPnNlcnZlci0+bG9nbGV2ZWwgPSBBUExPR19DUklUOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcChzdHIsICJlcnJvciIpKSB7Ci0JICAgIGNtZC0+c2VydmVyLT5sb2dsZXZlbCA9IEFQTE9HX0VSUjsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAoc3RyLCAid2FybiIpKSB7Ci0JICAgIGNtZC0+c2VydmVyLT5sb2dsZXZlbCA9IEFQTE9HX1dBUk5JTkc7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHN0ciwgIm5vdGljZSIpKSB7Ci0JICAgIGNtZC0+c2VydmVyLT5sb2dsZXZlbCA9IEFQTE9HX05PVElDRTsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAoc3RyLCAiaW5mbyIpKSB7Ci0JICAgIGNtZC0+c2VydmVyLT5sb2dsZXZlbCA9IEFQTE9HX0lORk87Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHN0ciwgImRlYnVnIikpIHsKLQkgICAgY21kLT5zZXJ2ZXItPmxvZ2xldmVsID0gQVBMT0dfREVCVUc7Ci0JfQotCWVsc2UgewotICAgICAgICAgICAgcmV0dXJuICJMb2dMZXZlbCByZXF1aXJlcyBsZXZlbCBrZXl3b3JkOiBvbmUgb2YgIgotCSAgICAgICAgICAgImVtZXJnL2FsZXJ0L2NyaXQvZXJyb3Ivd2Fybi9ub3RpY2UvaW5mby9kZWJ1ZyI7Ci0JfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcmV0dXJuICJMb2dMZXZlbCByZXF1aXJlcyBsZXZlbCBrZXl3b3JkIjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotQVBJX0VYUE9SVChjb25zdCBjaGFyICopIGFwX3BzaWduYXR1cmUoY29uc3QgY2hhciAqcHJlZml4LCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjaGFyIHNwb3J0WzIwXTsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvbmY7Ci0KLSAgICBjb25mID0gKGNvcmVfZGlyX2NvbmZpZyAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLAotCQkJCQkJICAgJmNvcmVfbW9kdWxlKTsKLSAgICBpZiAoKGNvbmYtPnNlcnZlcl9zaWduYXR1cmUgPT0gc3J2X3NpZ19vZmYpCi0JICAgIHx8IChjb25mLT5zZXJ2ZXJfc2lnbmF0dXJlID09IHNydl9zaWdfdW5zZXQpKSB7Ci0JcmV0dXJuICIiOwotICAgIH0KLQotICAgIGFwX3NucHJpbnRmKHNwb3J0LCBzaXplb2Ygc3BvcnQsICIldSIsICh1bnNpZ25lZCkgYXBfZ2V0X3NlcnZlcl9wb3J0KHIpKTsKLQotICAgIGlmIChjb25mLT5zZXJ2ZXJfc2lnbmF0dXJlID09IHNydl9zaWdfd2l0aG1haWwpIHsKLQlyZXR1cm4gYXBfcHN0cmNhdChyLT5wb29sLCBwcmVmaXgsICI8QUREUkVTUz4iIFNFUlZFUl9CQVNFVkVSU0lPTgotCQkJICAiIFNlcnZlciBhdCA8QSBIUkVGPVwibWFpbHRvOiIsCi0JCQkgIHItPnNlcnZlci0+c2VydmVyX2FkbWluLCAiXCI+IiwKLQkJCSAgYXBfZ2V0X3NlcnZlcl9uYW1lKHIpLCAiPC9BPiBQb3J0ICIsIHNwb3J0LAotCQkJICAiPC9BRERSRVNTPlxuIiwgTlVMTCk7Ci0gICAgfQotICAgIHJldHVybiBhcF9wc3RyY2F0KHItPnBvb2wsIHByZWZpeCwgIjxBRERSRVNTPiIgU0VSVkVSX0JBU0VWRVJTSU9OCi0JCSAgICAgICIgU2VydmVyIGF0ICIsIGFwX2dldF9zZXJ2ZXJfbmFtZShyKSwgIiBQb3J0ICIsIHNwb3J0LAotCQkgICAgICAiPC9BRERSRVNTPlxuIiwgTlVMTCk7Ci19Ci0KLS8qCi0gKiBMb2FkIGFuIGF1dGhvcmlzYXRpb24gcmVhbG0gaW50byBvdXIgbG9jYXRpb24gY29uZmlndXJhdGlvbiwgYXBwbHlpbmcgdGhlCi0gKiB1c3VhbCBydWxlcyB0aGF0IGFwcGx5IHRvIHJlYWxtcy4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9hdXRobmFtZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqbWNvbmZpZywgY2hhciAqd29yZDEpCi17Ci0gICAgY29yZV9kaXJfY29uZmlnICphY29uZmlnID0gKGNvcmVfZGlyX2NvbmZpZyAqKW1jb25maWc7Ci0KLSAgICBhY29uZmlnLT5hcF9hdXRoX25hbWUgPSBhcF9lc2NhcGVfcXVvdGVzKGNtZC0+cG9vbCwgd29yZDEpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0jaWZkZWYgX09TRF9QT1NJWCAvKiBCUzIwMDAgTG9nb24gUGFzc3dkIGZpbGUgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfYnMyMDAwX2FjY291bnQoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICpuYW1lKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBvc19zZXRfYWNjb3VudChjbWQtPnBvb2wsIG5hbWUpOwotfQotI2VuZGlmIC8qX09TRF9QT1NJWCovCi0KLS8qCi0gKiBIYW5kbGUgYSByZXF1ZXN0IHRvIGluY2x1ZGUgdGhlIHNlcnZlcidzIE9TIHBsYXRmb3JtIGluIHRoZSBTZXJ2ZXIKLSAqIHJlc3BvbnNlIGhlYWRlciBmaWVsZCAodGhlIFNlcnZlclRva2VucyBkaXJlY3RpdmUpLiAgVW5mb3J0dW5hdGVseQotICogdGhpcyByZXF1aXJlcyBhIG5ldyBnbG9iYWwgaW4gb3JkZXIgdG8gY29tbXVuaWNhdGUgdGhlIHNldHRpbmcgYmFjayB0bwotICogaHR0cF9tYWluIHNvIGl0IGNhbiBpbnNlcnQgdGhlIGluZm9ybWF0aW9uIGluIHRoZSByaWdodCBwbGFjZSBpbiB0aGUKLSAqIHN0cmluZy4KLSAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3NlcnZfdG9rZW5zKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoIXN0cmNhc2VjbXAoYXJnLCAiT1MiKSkgewotICAgICAgICBhcF9zZXJ2ZXJfdG9rZW5zID0gU3J2VGtfT1M7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZywgIk1pbiIpIHx8ICFzdHJjYXNlY21wKGFyZywgIk1pbmltYWwiKSkgewotICAgICAgICBhcF9zZXJ2ZXJfdG9rZW5zID0gU3J2VGtfTUlOOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgYXBfc2VydmVyX3Rva2VucyA9IFNydlRrX0ZVTEw7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2xpbWl0X3JlcV9saW5lKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1RfSU5fRElSX0xPQ19GSUxFfE5PVF9JTl9MSU1JVCk7Ci0gICAgaW50IGxpbTsKLQotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBsaW0gPSBhdG9pKGFyZyk7Ci0gICAgaWYgKGxpbSA8IDApIHsKLSAgICAgICAgcmV0dXJuIGFwX3BzdHJjYXQoY21kLT50ZW1wX3Bvb2wsICJMaW1pdFJlcXVlc3RMaW5lIFwiIiwgYXJnLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciIsIE5VTEwpOwotICAgIH0KLSAgICBpZiAobGltID4gREVGQVVMVF9MSU1JVF9SRVFVRVNUX0xJTkUpIHsKLSAgICAgICAgcmV0dXJuIGFwX3BzcHJpbnRmKGNtZC0+dGVtcF9wb29sLCAiTGltaXRSZXF1ZXN0TGluZSBcIiVzXCIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11c3Qgbm90IGV4Y2VlZCB0aGUgcHJlY29tcGlsZWQgbWF4aW11bSBvZiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIERFRkFVTFRfTElNSVRfUkVRVUVTVF9MSU5FKTsKLSAgICB9Ci0gICAgY21kLT5zZXJ2ZXItPmxpbWl0X3JlcV9saW5lID0gbGltOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2xpbWl0X3JlcV9maWVsZHNpemUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9UX0lOX0RJUl9MT0NfRklMRXxOT1RfSU5fTElNSVQpOwotICAgIGludCBsaW07Ci0KLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgbGltID0gYXRvaShhcmcpOwotICAgIGlmIChsaW0gPCAwKSB7Ci0gICAgICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+dGVtcF9wb29sLCAiTGltaXRSZXF1ZXN0RmllbGRzaXplIFwiIiwgYXJnLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciAoMCA9IG5vIGxpbWl0KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIH0KLSAgICBpZiAobGltID4gREVGQVVMVF9MSU1JVF9SRVFVRVNUX0ZJRUxEU0laRSkgewotICAgICAgICByZXR1cm4gYXBfcHNwcmludGYoY21kLT50ZW1wX3Bvb2wsICJMaW1pdFJlcXVlc3RGaWVsZHNpemUgXCIlc1wiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIm11c3Qgbm90IGV4Y2VlZCB0aGUgcHJlY29tcGlsZWQgbWF4aW11bSBvZiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIERFRkFVTFRfTElNSVRfUkVRVUVTVF9GSUVMRFNJWkUpOwotICAgIH0KLSAgICBjbWQtPnNlcnZlci0+bGltaXRfcmVxX2ZpZWxkc2l6ZSA9IGxpbTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9saW1pdF9yZXFfZmllbGRzKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1RfSU5fRElSX0xPQ19GSUxFfE5PVF9JTl9MSU1JVCk7Ci0gICAgaW50IGxpbTsKLQotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBsaW0gPSBhdG9pKGFyZyk7Ci0gICAgaWYgKGxpbSA8IDApIHsKLSAgICAgICAgcmV0dXJuIGFwX3BzdHJjYXQoY21kLT50ZW1wX3Bvb2wsICJMaW1pdFJlcXVlc3RGaWVsZHMgXCIiLCBhcmcsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyICgwID0gbm8gbGltaXQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgfQotICAgIGNtZC0+c2VydmVyLT5saW1pdF9yZXFfZmllbGRzID0gbGltOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2xpbWl0X3JlcV9ib2R5KGNtZF9wYXJtcyAqY21kLCBjb3JlX2Rpcl9jb25maWcgKmNvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBOT1RfSU5fTElNSVQpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIFdURjogSWYgc3RydG91bCBpcyBub3QgcG9ydGFibGUsIHRoZW4gd3JpdGUgYSByZXBsYWNlbWVudC4KLSAgICAgKiAgICAgIEluc3RlYWQgd2UgaGF2ZSBhbiBpZGlvdGljIGRlZmluZSBpbiBodHRwZC5oIHRoYXQgcHJldmVudHMKLSAgICAgKiAgICAgIGl0IGZyb20gYmVpbmcgdXNlZCBldmVuIHdoZW4gaXQgaXMgYXZhaWxhYmxlLiBTaGVlc2guCi0gICAgICovCi0gICAgY29uZi0+bGltaXRfcmVxX2JvZHkgPSAodW5zaWduZWQgbG9uZylzdHJ0b2woYXJnLCAoY2hhciAqKilOVUxMLCAxMCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNpZmRlZiBXSU4zMgotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9pbnRlcnByZXRlcl9zb3VyY2UoY21kX3Bhcm1zICpjbWQsIGNvcmVfZGlyX2NvbmZpZyAqZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmFyZykKLXsKLSAgICBpZiAoIXN0cmNhc2VjbXAoYXJnLCAicmVnaXN0cnkiKSkgewotICAgICAgICBkLT5zY3JpcHRfaW50ZXJwcmV0ZXJfc291cmNlID0gSU5URVJQUkVURVJfU09VUkNFX1JFR0lTVFJZOwotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJnLCAic2NyaXB0IikpIHsKLSAgICAgICAgZC0+c2NyaXB0X2ludGVycHJldGVyX3NvdXJjZSA9IElOVEVSUFJFVEVSX1NPVVJDRV9TSEVCQU5HOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGQtPnNjcmlwdF9pbnRlcnByZXRlcl9zb3VyY2UgPSBJTlRFUlBSRVRFUl9TT1VSQ0VfU0hFQkFORzsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0jZW5kaWYKLQotLyogTm90ZSAtLS0gRXJyb3JEb2N1bWVudCB3aWxsIG5vdyB3b3JrIGZyb20gLmh0YWNjZXNzIGZpbGVzLiAgCi0gKiBUaGUgQWxsb3dPdmVycmlkZSBvZiBGaWxlaW5mbyBhbGxvd3Mgd2VibWFzdGVycyB0byB0dXJuIGl0IG9mZgotICovCi0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBjb3JlX2NtZHNbXSA9IHsKLQotLyogT2xkIGFjY2VzcyBjb25maWcgZmlsZSBjb21tYW5kcyAqLwotCi17ICI8RGlyZWN0b3J5IiwgZGlyc2VjdGlvbiwgTlVMTCwgUlNSQ19DT05GLCBSQVdfQVJHUywKLSAgIkNvbnRhaW5lciBmb3IgZGlyZWN0aXZlcyBhZmZlY3RpbmcgcmVzb3VyY2VzIGxvY2F0ZWQgaW4gdGhlIHNwZWNpZmllZCAiCi0gICJkaXJlY3RvcmllcyIgfSwKLXsgZW5kX2RpcmVjdG9yeV9zZWN0aW9uLCBlbmRfbmVzdGVkX3NlY3Rpb24sIE5VTEwsIEFDQ0VTU19DT05GLCBOT19BUkdTLAotICAiTWFya3MgZW5kIG9mIDxEaXJlY3Rvcnk+IiB9LAoteyAiPExvY2F0aW9uIiwgdXJsc2VjdGlvbiwgTlVMTCwgUlNSQ19DT05GLCBSQVdfQVJHUywKLSAgIkNvbnRhaW5lciBmb3IgZGlyZWN0aXZlcyBhZmZlY3RpbmcgcmVzb3VyY2VzIGFjY2Vzc2VkIHRocm91Z2ggdGhlICIKLSAgInNwZWNpZmllZCBVUkwgcGF0aHMiIH0sCi17IGVuZF9sb2NhdGlvbl9zZWN0aW9uLCBlbmRfbmVzdGVkX3NlY3Rpb24sIE5VTEwsIEFDQ0VTU19DT05GLCBOT19BUkdTLAotICAiTWFya3MgZW5kIG9mIDxMb2NhdGlvbj4iIH0sCi17ICI8VmlydHVhbEhvc3QiLCB2aXJ0dWFsaG9zdF9zZWN0aW9uLCBOVUxMLCBSU1JDX0NPTkYsIFJBV19BUkdTLAotICAiQ29udGFpbmVyIHRvIG1hcCBkaXJlY3RpdmVzIHRvIGEgcGFydGljdWxhciB2aXJ0dWFsIGhvc3QsIHRha2VzIG9uZSBvciAiCi0gICJtb3JlIGhvc3QgYWRkcmVzc2VzIiB9LAoteyBlbmRfdmlydHVhbGhvc3Rfc2VjdGlvbiwgZW5kX25lc3RlZF9zZWN0aW9uLCBOVUxMLCBSU1JDX0NPTkYsIE5PX0FSR1MsCi0gICJNYXJrcyBlbmQgb2YgPFZpcnR1YWxIb3N0PiIgfSwKLXsgIjxGaWxlcyIsIGZpbGVzZWN0aW9uLCBOVUxMLCBPUl9BTEwsIFJBV19BUkdTLCAiQ29udGFpbmVyIGZvciBkaXJlY3RpdmVzICIKLSAgImFmZmVjdGluZyBmaWxlcyBtYXRjaGluZyBzcGVjaWZpZWQgcGF0dGVybnMiIH0sCi17IGVuZF9maWxlc19zZWN0aW9uLCBlbmRfbmVzdGVkX3NlY3Rpb24sIE5VTEwsIE9SX0FMTCwgTk9fQVJHUywKLSAgIk1hcmtzIGVuZCBvZiA8RmlsZXM+IiB9LAoteyAiPExpbWl0IiwgYXBfbGltaXRfc2VjdGlvbiwgTlVMTCwgT1JfQUxMLCBSQVdfQVJHUywgIkNvbnRhaW5lciBmb3IgIgotICAiYXV0aGVudGljYXRpb24gZGlyZWN0aXZlcyB3aGVuIGFjY2Vzc2VkIHVzaW5nIHNwZWNpZmllZCBIVFRQIG1ldGhvZHMiIH0sCi17ICI8L0xpbWl0PiIsIGVuZGxpbWl0X3NlY3Rpb24sIE5VTEwsIE9SX0FMTCwgTk9fQVJHUywKLSAgIk1hcmtzIGVuZCBvZiA8TGltaXQ+IiB9LAoteyAiPExpbWl0RXhjZXB0IiwgYXBfbGltaXRfc2VjdGlvbiwgKHZvaWQqKTEsIE9SX0FMTCwgUkFXX0FSR1MsCi0gICJDb250YWluZXIgZm9yIGF1dGhlbnRpY2F0aW9uIGRpcmVjdGl2ZXMgdG8gYmUgYXBwbGllZCB3aGVuIGFueSBIVFRQICIKLSAgIm1ldGhvZCBvdGhlciB0aGFuIHRob3NlIHNwZWNpZmllZCBpcyB1c2VkIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UiIH0sCi17ICI8L0xpbWl0RXhjZXB0PiIsIGVuZGxpbWl0X3NlY3Rpb24sICh2b2lkKikxLCBPUl9BTEwsIE5PX0FSR1MsCi0gICJNYXJrcyBlbmQgb2YgPExpbWl0RXhjZXB0PiIgfSwKLXsgIjxJZk1vZHVsZSIsIHN0YXJ0X2lmbW9kLCBOVUxMLCBPUl9BTEwsIFRBS0UxLAotICAiQ29udGFpbmVyIGZvciBkaXJlY3RpdmVzIGJhc2VkIG9uIGV4aXN0YW5jZSBvZiBzcGVjaWZpZWQgbW9kdWxlcyIgfSwKLXsgZW5kX2lmbW9kdWxlX3NlY3Rpb24sIGVuZF9pZm1vZCwgTlVMTCwgT1JfQUxMLCBOT19BUkdTLAotICAiTWFya3MgZW5kIG9mIDxJZk1vZHVsZT4iIH0sCi17ICI8SWZEZWZpbmUiLCBzdGFydF9pZmRlZmluZSwgTlVMTCwgT1JfQUxMLCBUQUtFMSwKLSAgIkNvbnRhaW5lciBmb3IgZGlyZWN0aXZlcyBiYXNlZCBvbiBleGlzdGFuY2Ugb2YgY29tbWFuZCBsaW5lIGRlZmluZXMiIH0sCi17IGVuZF9pZmRlZmluZV9zZWN0aW9uLCBlbmRfaWZkZWZpbmUsIE5VTEwsIE9SX0FMTCwgTk9fQVJHUywKLSAgIk1hcmtzIGVuZCBvZiA8SWZEZWZpbmU+IiB9LAoteyAiPERpcmVjdG9yeU1hdGNoIiwgZGlyc2VjdGlvbiwgKHZvaWQqKTEsIFJTUkNfQ09ORiwgUkFXX0FSR1MsCi0gICJDb250YWluZXIgZm9yIGRpcmVjdGl2ZXMgYWZmZWN0aW5nIHJlc291cmNlcyBsb2NhdGVkIGluIHRoZSAiCi0gICJzcGVjaWZpZWQgZGlyZWN0b3JpZXMiIH0sCi17IGVuZF9kaXJlY3RvcnltYXRjaF9zZWN0aW9uLCBlbmRfbmVzdGVkX3NlY3Rpb24sIE5VTEwsIEFDQ0VTU19DT05GLCBOT19BUkdTLAotICAiTWFya3MgZW5kIG9mIDxEaXJlY3RvcnlNYXRjaD4iIH0sCi17ICI8TG9jYXRpb25NYXRjaCIsIHVybHNlY3Rpb24sICh2b2lkKikxLCBSU1JDX0NPTkYsIFJBV19BUkdTLAotICAiQ29udGFpbmVyIGZvciBkaXJlY3RpdmVzIGFmZmVjdGluZyByZXNvdXJjZXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgIgotICAic3BlY2lmaWVkIFVSTCBwYXRocyIgfSwKLXsgZW5kX2xvY2F0aW9ubWF0Y2hfc2VjdGlvbiwgZW5kX25lc3RlZF9zZWN0aW9uLCBOVUxMLCBBQ0NFU1NfQ09ORiwgTk9fQVJHUywKLSAgIk1hcmtzIGVuZCBvZiA8TG9jYXRpb25NYXRjaD4iIH0sCi17ICI8RmlsZXNNYXRjaCIsIGZpbGVzZWN0aW9uLCAodm9pZCopMSwgT1JfQUxMLCBSQVdfQVJHUywKLSAgIkNvbnRhaW5lciBmb3IgZGlyZWN0aXZlcyBhZmZlY3RpbmcgZmlsZXMgbWF0Y2hpbmcgc3BlY2lmaWVkIHBhdHRlcm5zIiB9LAoteyBlbmRfZmlsZXNtYXRjaF9zZWN0aW9uLCBlbmRfbmVzdGVkX3NlY3Rpb24sIE5VTEwsIE9SX0FMTCwgTk9fQVJHUywKLSAgIk1hcmtzIGVuZCBvZiA8RmlsZXNNYXRjaD4iIH0sCi17ICJBdXRoVHlwZSIsIGFwX3NldF9zdHJpbmdfc2xvdCwKLSAgKHZvaWQqKVh0T2Zmc2V0T2YoY29yZV9kaXJfY29uZmlnLCBhcF9hdXRoX3R5cGUpLCBPUl9BVVRIQ0ZHLCBUQUtFMSwKLSAgIkFuIEhUVFAgYXV0aG9yaXphdGlvbiB0eXBlIChlLmcuLCBcIkJhc2ljXCIpIiB9LAoteyAiQXV0aE5hbWUiLCBzZXRfYXV0aG5hbWUsIE5VTEwsIE9SX0FVVEhDRkcsIFRBS0UxLAotICAiVGhlIGF1dGhlbnRpY2F0aW9uIHJlYWxtIChlLmcuIFwiTWVtYmVycyBPbmx5XCIpIiB9LAoteyAiUmVxdWlyZSIsIHJlcXVpcmUsIE5VTEwsIE9SX0FVVEhDRkcsIFJBV19BUkdTLAotICAiU2VsZWN0cyB3aGljaCBhdXRoZW50aWNhdGVkIHVzZXJzIG9yIGdyb3VwcyBtYXkgYWNjZXNzIGEgcHJvdGVjdGVkIHNwYWNlIiB9LAoteyAiU2F0aXNmeSIsIHNhdGlzZnksIE5VTEwsIE9SX0FVVEhDRkcsIFRBS0UxLAotICAiYWNjZXNzIHBvbGljeSBpZiBib3RoIGFsbG93IGFuZCByZXF1aXJlIHVzZWQgKCdhbGwnIG9yICdhbnknKSIgfSwgICAgCi0jaWZkZWYgR1BST0YKLXsgIkdwcm9mRGlyIiwgc2V0X2dwcm9mX2RpciwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIkRpcmVjdG9yeSB0byBwbG9wIGdtb24ub3V0IGZpbGVzIiB9LAotI2VuZGlmCi0KLS8qIE9sZCByZXNvdXJjZSBjb25maWcgZmlsZSBjb21tYW5kcyAqLwotICAKLXsgIkFjY2Vzc0ZpbGVOYW1lIiwgc2V0X2FjY2Vzc19uYW1lLCBOVUxMLCBSU1JDX0NPTkYsIFJBV19BUkdTLAotICAiTmFtZShzKSBvZiBwZXItZGlyZWN0b3J5IGNvbmZpZyBmaWxlcyAoZGVmYXVsdDogLmh0YWNjZXNzKSIgfSwKLXsgIkRvY3VtZW50Um9vdCIsIHNldF9kb2N1bWVudF9yb290LCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiUm9vdCBkaXJlY3Rvcnkgb2YgdGhlIGRvY3VtZW50IHRyZWUiICB9LAoteyAiRXJyb3JEb2N1bWVudCIsIHNldF9lcnJvcl9kb2N1bWVudCwgTlVMTCwgT1JfRklMRUlORk8sIFJBV19BUkdTLAotICAiQ2hhbmdlIHJlc3BvbnNlcyBmb3IgSFRUUCBlcnJvcnMiIH0sCi17ICJBbGxvd092ZXJyaWRlIiwgc2V0X292ZXJyaWRlLCBOVUxMLCBBQ0NFU1NfQ09ORiwgUkFXX0FSR1MsCi0gICJDb250cm9scyB3aGF0IGdyb3VwcyBvZiBkaXJlY3RpdmVzIGNhbiBiZSBjb25maWd1cmVkIGJ5IHBlci1kaXJlY3RvcnkgIgotICAiY29uZmlnIGZpbGVzIiB9LAoteyAiT3B0aW9ucyIsIHNldF9vcHRpb25zLCBOVUxMLCBPUl9PUFRJT05TLCBSQVdfQVJHUywKLSAgIlNldCBhIG51bWJlciBvZiBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGRpcmVjdG9yeSIgfSwKLXsgIkRlZmF1bHRUeXBlIiwgYXBfc2V0X3N0cmluZ19zbG90LAotICAodm9pZCopWHRPZmZzZXRPZiAoY29yZV9kaXJfY29uZmlnLCBhcF9kZWZhdWx0X3R5cGUpLAotICBPUl9GSUxFSU5GTywgVEFLRTEsICJ0aGUgZGVmYXVsdCBNSU1FIHR5cGUgZm9yIHVudHlwYWJsZSBmaWxlcyIgfSwKLQotLyogT2xkIHNlcnZlciBjb25maWcgZmlsZSBjb21tYW5kcyAqLwotCi17ICJTZXJ2ZXJUeXBlIiwgc2VydmVyX3R5cGUsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICInaW5ldGQnIG9yICdzdGFuZGFsb25lJyJ9LAoteyAiUG9ydCIsIHNlcnZlcl9wb3J0LCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLCAiQSBUQ1AgcG9ydCBudW1iZXIifSwKLXsgIkhvc3RuYW1lTG9va3VwcyIsIHNldF9ob3N0bmFtZV9sb29rdXBzLCBOVUxMLCBBQ0NFU1NfQ09ORnxSU1JDX0NPTkYsIFRBS0UxLAotICAiXCJvblwiIHRvIGVuYWJsZSwgXCJvZmZcIiB0byBkaXNhYmxlIHJldmVyc2UgRE5TIGxvb2t1cHMsIG9yIFwiZG91YmxlXCIgdG8gIgotICAiZW5hYmxlIGRvdWJsZS1yZXZlcnNlIEROUyBsb29rdXBzIiB9LAoteyAiVXNlciIsIHNldF91c2VyLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiRWZmZWN0aXZlIHVzZXIgaWQgZm9yIHRoaXMgc2VydmVyIn0sCi17ICJHcm91cCIsIHNldF9ncm91cCwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIkVmZmVjdGl2ZSBncm91cCBpZCBmb3IgdGhpcyBzZXJ2ZXIifSwKLXsgIlNlcnZlckFkbWluIiwgc2V0X3NlcnZlcl9zdHJpbmdfc2xvdCwKLSAgKHZvaWQgKilYdE9mZnNldE9mIChzZXJ2ZXJfcmVjLCBzZXJ2ZXJfYWRtaW4pLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiVGhlIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIHNlcnZlciBhZG1pbmlzdHJhdG9yIiB9LAoteyAiU2VydmVyTmFtZSIsIHNldF9zZXJ2ZXJfc3RyaW5nX3Nsb3QsCi0gICh2b2lkICopWHRPZmZzZXRPZiAoc2VydmVyX3JlYywgc2VydmVyX2hvc3RuYW1lKSwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIlRoZSBob3N0bmFtZSBvZiB0aGUgc2VydmVyIiB9LAoteyAiU2VydmVyU2lnbmF0dXJlIiwgc2V0X3NpZ25hdHVyZV9mbGFnLCBOVUxMLCBPUl9BTEwsIFRBS0UxLAotICAiRW4tL2Rpc2FibGUgc2VydmVyIHNpZ25hdHVyZSAob258b2ZmfGVtYWlsKSIgfSwKLXsgIlNlcnZlclJvb3QiLCBzZXRfc2VydmVyX3Jvb3QsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJDb21tb24gZGlyZWN0b3J5IG9mIHNlcnZlci1yZWxhdGVkIGZpbGVzIChsb2dzLCBjb25mcywgZXRjLikiIH0sCi17ICJFcnJvckxvZyIsIHNldF9zZXJ2ZXJfc3RyaW5nX3Nsb3QsCi0gICh2b2lkICopWHRPZmZzZXRPZiAoc2VydmVyX3JlYywgZXJyb3JfZm5hbWUpLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiVGhlIGZpbGVuYW1lIG9mIHRoZSBlcnJvciBsb2ciIH0sCi17ICJQaWRGaWxlIiwgc2V0X3BpZGZpbGUsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICAgIkEgZmlsZSBmb3IgbG9nZ2luZyB0aGUgc2VydmVyIHByb2Nlc3MgSUQifSwKLXsgIlNjb3JlQm9hcmRGaWxlIiwgc2V0X3Njb3JlYm9hcmQsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICAgIkEgZmlsZSBmb3IgQXBhY2hlIHRvIG1haW50YWluIHJ1bnRpbWUgcHJvY2VzcyBtYW5hZ2VtZW50IGluZm9ybWF0aW9uIn0sCi17ICJMb2NrRmlsZSIsIHNldF9sb2NrZmlsZSwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAiVGhlIGxvY2tmaWxlIHVzZWQgd2hlbiBBcGFjaGUgbmVlZHMgdG8gbG9jayB0aGUgYWNjZXB0KCkgY2FsbCJ9LAoteyAiQWNjZXNzQ29uZmlnIiwgc2V0X3NlcnZlcl9zdHJpbmdfc2xvdCwKLSAgKHZvaWQgKilYdE9mZnNldE9mIChzZXJ2ZXJfcmVjLCBhY2Nlc3NfY29uZm5hbWUpLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiVGhlIGZpbGVuYW1lIG9mIHRoZSBhY2Nlc3MgY29uZmlnIGZpbGUiIH0sCi17ICJSZXNvdXJjZUNvbmZpZyIsIHNldF9zZXJ2ZXJfc3RyaW5nX3Nsb3QsCi0gICh2b2lkICopWHRPZmZzZXRPZiAoc2VydmVyX3JlYywgc3JtX2NvbmZuYW1lKSwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIlRoZSBmaWxlbmFtZSBvZiB0aGUgcmVzb3VyY2UgY29uZmlnIGZpbGUiIH0sCi17ICJTZXJ2ZXJBbGlhcyIsIHNldF9zZXJ2ZXJfYWxpYXMsIE5VTEwsIFJTUkNfQ09ORiwgUkFXX0FSR1MsCi0gICJBIG5hbWUgb3IgbmFtZXMgYWx0ZXJuYXRlbHkgdXNlZCB0byBhY2Nlc3MgdGhlIHNlcnZlciIgfSwKLXsgIlNlcnZlclBhdGgiLCBzZXRfc2VydmVycGF0aCwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIlRoZSBwYXRobmFtZSB0aGUgc2VydmVyIGNhbiBiZSByZWFjaGVkIGF0IiB9LAoteyAiVGltZW91dCIsIHNldF90aW1lb3V0LCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLCAiVGltZW91dCBkdXJhdGlvbiAoc2VjKSIgfSwKLXsgIktlZXBBbGl2ZVRpbWVvdXQiLCBzZXRfa2VlcF9hbGl2ZV90aW1lb3V0LCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiS2VlcC1BbGl2ZSB0aW1lb3V0IGR1cmF0aW9uIChzZWMpIn0sCi17ICJNYXhLZWVwQWxpdmVSZXF1ZXN0cyIsIHNldF9rZWVwX2FsaXZlX21heCwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIk1heGltdW0gbnVtYmVyIG9mIEtlZXAtQWxpdmUgcmVxdWVzdHMgcGVyIGNvbm5lY3Rpb24sIG9yIDAgZm9yIGluZmluaXRlIiB9LAoteyAiS2VlcEFsaXZlIiwgc2V0X2tlZXBfYWxpdmUsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJXaGV0aGVyIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgc2hvdWxkIGJlIE9uIG9yIE9mZiIgfSwKLXsgIklkZW50aXR5Q2hlY2siLCBzZXRfaWRjaGVjaywgTlVMTCwgUlNSQ19DT05GfEFDQ0VTU19DT05GLCBGTEFHLAotICAiRW5hYmxlIGlkZW50ZCAoUkZDIDE0MTMpIHVzZXIgbG9va3VwcyAtIFNMT1ciIH0sCi17ICJDb250ZW50RGlnZXN0Iiwgc2V0X2NvbnRlbnRfbWQ1LCBOVUxMLCBPUl9PUFRJT05TLAotICBGTEFHLCAid2hldGhlciBvciBub3QgdG8gc2VuZCBhIENvbnRlbnQtTUQ1IGhlYWRlciB3aXRoIGVhY2ggcmVxdWVzdCIgfSwKLXsgIlVzZUNhbm9uaWNhbE5hbWUiLCBzZXRfdXNlX2Nhbm9uaWNhbF9uYW1lLCBOVUxMLAotICBSU1JDX0NPTkYsIFRBS0UxLAotICAiSG93IHRvIHdvcmsgb3V0IHRoZSBTZXJ2ZXJOYW1lIDogUG9ydCB3aGVuIGNvbnN0cnVjdGluZyBVUkxzIiB9LAoteyAiU3RhcnRTZXJ2ZXJzIiwgc2V0X2RhZW1vbnNfdG9fc3RhcnQsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJOdW1iZXIgb2YgY2hpbGQgcHJvY2Vzc2VzIGxhdW5jaGVkIGF0IHNlcnZlciBzdGFydHVwIiB9LAoteyAiTWluU3BhcmVTZXJ2ZXJzIiwgc2V0X21pbl9mcmVlX3NlcnZlcnMsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJNaW5pbXVtIG51bWJlciBvZiBpZGxlIGNoaWxkcmVuLCB0byBoYW5kbGUgcmVxdWVzdCBzcGlrZXMiIH0sCi17ICJNYXhTcGFyZVNlcnZlcnMiLCBzZXRfbWF4X2ZyZWVfc2VydmVycywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIk1heGltdW0gbnVtYmVyIG9mIGlkbGUgY2hpbGRyZW4iIH0sCi17ICJNYXhTZXJ2ZXJzIiwgc2V0X21heF9mcmVlX3NlcnZlcnMsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJEZXByZWNhdGVkIGVxdWl2YWxlbnQgdG8gTWF4U3BhcmVTZXJ2ZXJzIiB9LAoteyAiU2VydmVyc1NhZmV0eUxpbWl0Iiwgc2V0X3NlcnZlcl9saW1pdCwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIkRlcHJlY2F0ZWQgZXF1aXZhbGVudCB0byBNYXhDbGllbnRzIiB9LAoteyAiTWF4Q2xpZW50cyIsIHNldF9zZXJ2ZXJfbGltaXQsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJNYXhpbXVtIG51bWJlciBvZiBjaGlsZHJlbiBhbGl2ZSBhdCB0aGUgc2FtZSB0aW1lIiB9LAoteyAiTWF4UmVxdWVzdHNQZXJDaGlsZCIsIHNldF9tYXhfcmVxdWVzdHMsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJNYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cyBhIHBhcnRpY3VsYXIgY2hpbGQgc2VydmVzIGJlZm9yZSBkeWluZy4iIH0sCi17ICJSTGltaXRDUFUiLAotI2lmZGVmIFJMSU1JVF9DUFUKLSAgc2V0X2xpbWl0X2NwdSwgKHZvaWQqKVh0T2Zmc2V0T2YoY29yZV9kaXJfY29uZmlnLCBsaW1pdF9jcHUpLAotI2Vsc2UKLSAgbm9fc2V0X2xpbWl0LCBOVUxMLAotI2VuZGlmCi0gIE9SX0FMTCwgVEFLRTEyLCAiU29mdC9oYXJkIGxpbWl0cyBmb3IgbWF4IENQVSB1c2FnZSBpbiBzZWNvbmRzIiB9LAoteyAiUkxpbWl0TUVNIiwKLSNpZiBkZWZpbmVkIChSTElNSVRfREFUQSkgfHwgZGVmaW5lZCAoUkxJTUlUX1ZNRU0pIHx8IGRlZmluZWQgKFJMSU1JVF9BUykKLSAgc2V0X2xpbWl0X21lbSwgKHZvaWQqKVh0T2Zmc2V0T2YoY29yZV9kaXJfY29uZmlnLCBsaW1pdF9tZW0pLAotI2Vsc2UKLSAgbm9fc2V0X2xpbWl0LCBOVUxMLAotI2VuZGlmCi0gIE9SX0FMTCwgVEFLRTEyLCAiU29mdC9oYXJkIGxpbWl0cyBmb3IgbWF4IG1lbW9yeSB1c2FnZSBwZXIgcHJvY2VzcyIgfSwKLXsgIlJMaW1pdE5QUk9DIiwKLSNpZmRlZiBSTElNSVRfTlBST0MKLSAgc2V0X2xpbWl0X25wcm9jLCAodm9pZCopWHRPZmZzZXRPZihjb3JlX2Rpcl9jb25maWcsIGxpbWl0X25wcm9jKSwKLSNlbHNlCi0gIG5vX3NldF9saW1pdCwgTlVMTCwKLSNlbmRpZgotICAgT1JfQUxMLCBUQUtFMTIsICJzb2Z0L2hhcmQgbGltaXRzIGZvciBtYXggbnVtYmVyIG9mIHByb2Nlc3NlcyBwZXIgdWlkIiB9LAoteyAiQmluZEFkZHJlc3MiLCBzZXRfYmluZF9hZGRyZXNzLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiJyonLCBhIG51bWVyaWMgSVAgYWRkcmVzcywgb3IgdGhlIG5hbWUgb2YgYSBob3N0IHdpdGggYSB1bmlxdWUgSVAgYWRkcmVzcyJ9LAoteyAiTGlzdGVuIiwgc2V0X2xpc3RlbmVyLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiQSBwb3J0IG51bWJlciBvciBhIG51bWVyaWMgSVAgYWRkcmVzcyBhbmQgYSBwb3J0IG51bWJlciJ9LAoteyAiU2VuZEJ1ZmZlclNpemUiLCBzZXRfc2VuZF9idWZmZXJfc2l6ZSwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIlNlbmQgYnVmZmVyIHNpemUgaW4gYnl0ZXMifSwKLXsgIkFkZE1vZHVsZSIsIGFkZF9tb2R1bGVfY29tbWFuZCwgTlVMTCwgUlNSQ19DT05GLCBJVEVSQVRFLAotICAiVGhlIG5hbWUgb2YgYSBtb2R1bGUiIH0sCi17ICJDbGVhck1vZHVsZUxpc3QiLCBjbGVhcl9tb2R1bGVfbGlzdF9jb21tYW5kLCBOVUxMLCBSU1JDX0NPTkYsIE5PX0FSR1MsIAotICBOVUxMIH0sCi17ICJUaHJlYWRzUGVyQ2hpbGQiLCBzZXRfdGhyZWFkcywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIk51bWJlciBvZiB0aHJlYWRzIGEgY2hpbGQgY3JlYXRlcyIgfSwKLXsgIkV4Y2Vzc1JlcXVlc3RzUGVyQ2hpbGQiLCBzZXRfZXhjZXNzX3JlcXVlc3RzLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiTWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdHMgYSBwYXJ0aWN1bGFyIGNoaWxkIHNlcnZlcyBhZnRlciBpdCBpcyByZWFkeSAiCi0gICJ0byBkaWUuIiB9LAoteyAiTGlzdGVuQmFja2xvZyIsIHNldF9saXN0ZW5iYWNrbG9nLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiTWF4aW11bSBsZW5ndGggb2YgdGhlIHF1ZXVlIG9mIHBlbmRpbmcgY29ubmVjdGlvbnMsIGFzIHVzZWQgYnkgbGlzdGVuKDIpIiB9LAoteyAiQ29yZUR1bXBEaXJlY3RvcnkiLCBzZXRfY29yZWR1bXBkaXIsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJUaGUgbG9jYXRpb24gb2YgdGhlIGRpcmVjdG9yeSBBcGFjaGUgY2hhbmdlcyB0byBiZWZvcmUgZHVtcGluZyBjb3JlIiB9LAoteyAiSW5jbHVkZSIsIGluY2x1ZGVfY29uZmlnLCBOVUxMLCAoUlNSQ19DT05GIHwgQUNDRVNTX0NPTkYpLCBUQUtFMSwKLSAgIk5hbWUgb2YgdGhlIGNvbmZpZyBmaWxlIHRvIGJlIGluY2x1ZGVkIiB9LAoteyAiTG9nTGV2ZWwiLCBzZXRfbG9nbGV2ZWwsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJMZXZlbCBvZiB2ZXJib3NpdHkgaW4gZXJyb3IgbG9nZ2luZyIgfSwKLXsgIk5hbWVWaXJ0dWFsSG9zdCIsIGFwX3NldF9uYW1lX3ZpcnR1YWxfaG9zdCwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIkEgbnVtZXJpYyBJUCBhZGRyZXNzOnBvcnQsIG9yIHRoZSBuYW1lIG9mIGEgaG9zdCIgfSwKLSNpZmRlZiBfT1NEX1BPU0lYCi17ICJCUzIwMDBBY2NvdW50Iiwgc2V0X2JzMjAwMF9hY2NvdW50LCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiTmFtZSBvZiBzZXJ2ZXIgVXNlcidzIGJzMjAwMCBsb2dvbiBhY2NvdW50IG5hbWUiIH0sCi0jZW5kaWYKLSNpZmRlZiBXSU4zMgoteyAiU2NyaXB0SW50ZXJwcmV0ZXJTb3VyY2UiLCBzZXRfaW50ZXJwcmV0ZXJfc291cmNlLCBOVUxMLCBPUl9GSUxFSU5GTywgVEFLRTEsCi0gICJXaGVyZSB0byBmaW5kIGludGVycHJldGVyIHRvIHJ1biBXaW4zMiBzY3JpcHRzIChSZWdpc3RyeSBvciBzY3JpcHQgc2hlYmFuZyBsaW5lKSIgfSwKLSNlbmRpZgoteyAiU2VydmVyVG9rZW5zIiwgc2V0X3NlcnZfdG9rZW5zLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiRGV0ZXJtaW5lIHRva2VucyBkaXNwbGF5ZWQgaW4gdGhlIFNlcnZlcjogaGVhZGVyIC0gTWluKGltYWwpLCBPUyBvciBGdWxsIiB9LAoteyAiTGltaXRSZXF1ZXN0TGluZSIsIHNldF9saW1pdF9yZXFfbGluZSwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIkxpbWl0IG9uIG1heGltdW0gc2l6ZSBvZiBhbiBIVFRQIHJlcXVlc3QgbGluZSJ9LAoteyAiTGltaXRSZXF1ZXN0RmllbGRzaXplIiwgc2V0X2xpbWl0X3JlcV9maWVsZHNpemUsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJMaW1pdCBvbiBtYXhpbXVtIHNpemUgb2YgYW4gSFRUUCByZXF1ZXN0IGhlYWRlciBmaWVsZCJ9LAoteyAiTGltaXRSZXF1ZXN0RmllbGRzIiwgc2V0X2xpbWl0X3JlcV9maWVsZHMsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJMaW1pdCAoMCA9IHVubGltaXRlZCkgb24gbWF4IG51bWJlciBvZiBoZWFkZXIgZmllbGRzIGluIGEgcmVxdWVzdCBtZXNzYWdlIn0sCi17ICJMaW1pdFJlcXVlc3RCb2R5Iiwgc2V0X2xpbWl0X3JlcV9ib2R5LAotICAodm9pZCopWHRPZmZzZXRPZihjb3JlX2Rpcl9jb25maWcsIGxpbWl0X3JlcV9ib2R5KSwKLSAgT1JfQUxMLCBUQUtFMSwKLSAgIkxpbWl0IChpbiBieXRlcykgb24gbWF4aW11bSBzaXplIG9mIHJlcXVlc3QgbWVzc2FnZSBib2R5IiB9LAoteyBOVUxMIH0KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcmUgaGFuZGxlcnMgZm9yIHZhcmlvdXMgcGhhc2VzIG9mIHNlcnZlciBvcGVyYXRpb24uLi4KLSAqLwotCi1zdGF0aWMgaW50IGNvcmVfdHJhbnNsYXRlKHJlcXVlc3RfcmVjICpyKQotewotICAgIHZvaWQgKnNjb25mID0gci0+c2VydmVyLT5tb2R1bGVfY29uZmlnOwotICAgIGNvcmVfc2VydmVyX2NvbmZpZyAqY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHNjb25mLCAmY29yZV9tb2R1bGUpOwotICAKLSAgICBpZiAoci0+cHJveHlyZXEpIHsKLSAgICAgICAgcmV0dXJuIEhUVFBfRk9SQklEREVOOwotICAgIH0KLSAgICBpZiAoKHItPnVyaVswXSAhPSAnLycpICYmIHN0cmNtcChyLT51cmksICIqIikpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotCQkgICAgICJJbnZhbGlkIFVSSSBpbiByZXF1ZXN0ICVzIiwgci0+dGhlX3JlcXVlc3QpOwotCXJldHVybiBCQURfUkVRVUVTVDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKHItPnNlcnZlci0+cGF0aCAKLQkmJiAhc3RybmNtcChyLT51cmksIHItPnNlcnZlci0+cGF0aCwgci0+c2VydmVyLT5wYXRobGVuKQotCSYmIChyLT5zZXJ2ZXItPnBhdGhbci0+c2VydmVyLT5wYXRobGVuIC0gMV0gPT0gJy8nCi0JICAgIHx8IHItPnVyaVtyLT5zZXJ2ZXItPnBhdGhsZW5dID09ICcvJwotCSAgICB8fCByLT51cmlbci0+c2VydmVyLT5wYXRobGVuXSA9PSAnXDAnKSkgewotICAgICAgICByLT5maWxlbmFtZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgY29uZi0+YXBfZG9jdW1lbnRfcm9vdCwKLQkJCQkgKHItPnVyaSArIHItPnNlcnZlci0+cGF0aGxlbiksIE5VTEwpOwotICAgIH0KLSAgICBlbHNlIHsKLQkvKgotICAgICAgICAgKiBNYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3QgbWVzcyB1cCB0aGUgdHJhbnNsYXRpb24gYnkgYWRkaW5nIHR3bwotICAgICAgICAgKiAvJ3MgaW4gYSByb3cuICBUaGlzIGhhcHBlbnMgdW5kZXIgd2luZG93cyB3aGVuIHRoZSBkb2N1bWVudAotICAgICAgICAgKiByb290IGVuZHMgd2l0aCBhIC8KLSAgICAgICAgICovCi0gICAgICAgIGlmICgoY29uZi0+YXBfZG9jdW1lbnRfcm9vdFtzdHJsZW4oY29uZi0+YXBfZG9jdW1lbnRfcm9vdCktMV0gPT0gJy8nKQotCSAgICAmJiAoKihyLT51cmkpID09ICcvJykpIHsKLQkgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIGNvbmYtPmFwX2RvY3VtZW50X3Jvb3QsIHItPnVyaSsxLAotCQkJCSAgICAgTlVMTCk7Ci0JfQotCWVsc2UgewotCSAgICByLT5maWxlbmFtZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgY29uZi0+YXBfZG9jdW1lbnRfcm9vdCwgci0+dXJpLAotCQkJCSAgICAgTlVMTCk7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdGljIGludCBkb19ub3RoaW5nKHJlcXVlc3RfcmVjICpyKSB7IHJldHVybiBPSzsgfQotCi0jaWZkZWYgVVNFX01NQVBfRklMRVMKLXN0cnVjdCBtbWFwX3JlYyB7Ci0gICAgdm9pZCAqbW07Ci0gICAgc2l6ZV90IGxlbmd0aDsKLX07Ci0KLXN0YXRpYyB2b2lkIG1tYXBfY2xlYW51cCh2b2lkICptbXYpCi17Ci0gICAgc3RydWN0IG1tYXBfcmVjICptbWQgPSBtbXY7Ci0KLSAgICBpZiAobXVubWFwKG1tZC0+bW0sIG1tZC0+bGVuZ3RoKSA9PSAtMSkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBtdW5tYXAgbWVtb3J5IG9mIGxlbmd0aCAlbGQgYXQgMHglbHgiLAotICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIG1tZC0+bGVuZ3RoLCAobG9uZykgbW1kLT5tbSk7Ci0gICAgfQotfQotI2VuZGlmCi0KLS8qCi0gKiBEZWZhdWx0IGhhbmRsZXIgZm9yIE1JTUUgdHlwZXMgd2l0aG91dCBvdGhlciBoYW5kbGVycy4gIE9ubHkgR0VUCi0gKiBhbmQgT1BUSU9OUyBhdCB0aGlzIHBvaW50Li4uIGFueW9uZSB3aG8gd2FudHMgdG8gd3JpdGUgYSBnZW5lcmljCi0gKiBoYW5kbGVyIGZvciBQVVQgb3IgUE9TVCBpcyBmcmVlIHRvIGRvIHNvLCBidXQgaXQgc2VlbXMgdW53aXNlIHRvIHByb3ZpZGUKLSAqIGFueSBkZWZhdWx0cyB5ZXQuLi4gU28sIGZvciBub3csIHdlIGFzc3VtZSB0aGF0IHRoaXMgd2lsbCBhbHdheXMgYmUKLSAqIHRoZSBsYXN0IGhhbmRsZXIgY2FsbGVkIGFuZCByZXR1cm4gNDA1IG9yIDUwMS4KLSAqLwotCi1zdGF0aWMgaW50IGRlZmF1bHRfaGFuZGxlcihyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmQgPQotICAgICAgKGNvcmVfZGlyX2NvbmZpZyAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLCAmY29yZV9tb2R1bGUpOwotICAgIGludCByYW5nZXN0YXR1cywgZXJyc3RhdHVzOwotICAgIEZJTEUgKmY7Ci0jaWZkZWYgVVNFX01NQVBfRklMRVMKLSAgICBjYWRkcl90IG1tOwotI2VuZGlmCi0jaWZkZWYgQ0hBUlNFVF9FQkNESUMKLSAgICBpbnQgY29udmVydF9mbGFnOwotI2VuZGlmCi0KLSAgICAvKiBUaGlzIGhhbmRsZXIgaGFzIG5vIHVzZSBmb3IgYSByZXF1ZXN0IGJvZHkgKHlldCksIGJ1dCB3ZSBzdGlsbAotICAgICAqIG5lZWQgdG8gcmVhZCBhbmQgZGlzY2FyZCBpdCBpZiB0aGUgY2xpZW50IHNlbnQgb25lLgotICAgICAqLwotICAgIGlmICgoZXJyc3RhdHVzID0gYXBfZGlzY2FyZF9yZXF1ZXN0X2JvZHkocikpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnJzdGF0dXM7Ci0gICAgfQotCi0gICAgci0+YWxsb3dlZCB8PSAoMSA8PCBNX0dFVCkgfCAoMSA8PCBNX09QVElPTlMpOwotCi0gICAgaWYgKHItPm1ldGhvZF9udW1iZXIgPT0gTV9JTlZBTElEKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLQkJICAgICJJbnZhbGlkIG1ldGhvZCBpbiByZXF1ZXN0ICVzIiwgci0+dGhlX3JlcXVlc3QpOwotCXJldHVybiBOT1RfSU1QTEVNRU5URUQ7Ci0gICAgfQotICAgIGlmIChyLT5tZXRob2RfbnVtYmVyID09IE1fT1BUSU9OUykgewotICAgICAgICByZXR1cm4gYXBfc2VuZF9odHRwX29wdGlvbnMocik7Ci0gICAgfQotICAgIGlmIChyLT5tZXRob2RfbnVtYmVyID09IE1fUFVUKSB7Ci0gICAgICAgIHJldHVybiBNRVRIT0RfTk9UX0FMTE9XRUQ7Ci0gICAgfQotCi0gICAgaWYgKHItPmZpbmZvLnN0X21vZGUgPT0gMCB8fCAoci0+cGF0aF9pbmZvICYmICpyLT5wYXRoX2luZm8pKSB7Ci0JY2hhciAqZW1zZzsKLQotCWVtc2cgPSAiRmlsZSBkb2VzIG5vdCBleGlzdDogIjsKLQlpZiAoci0+cGF0aF9pbmZvID09IE5VTEwpIHsKLQkgICAgZW1zZyA9IGFwX3BzdHJjYXQoci0+cG9vbCwgZW1zZywgci0+ZmlsZW5hbWUsIE5VTEwpOwotCX0KLQllbHNlIHsKLQkgICAgZW1zZyA9IGFwX3BzdHJjYXQoci0+cG9vbCwgZW1zZywgci0+ZmlsZW5hbWUsIHItPnBhdGhfaW5mbywgTlVMTCk7Ci0JfQotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSfEFQTE9HX05PRVJSTk8sIHIsICIlcyIsIGVtc2cpOwotCXJldHVybiBIVFRQX05PVF9GT1VORDsKLSAgICB9Ci0gICAgaWYgKHItPm1ldGhvZF9udW1iZXIgIT0gTV9HRVQpIHsKLSAgICAgICAgcmV0dXJuIE1FVEhPRF9OT1RfQUxMT1dFRDsKLSAgICB9Ci0JCi0jaWYgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lOMzIpCi0gICAgLyogTmVlZCBiaW5hcnkgbW9kZSBmb3IgT1MvMiAqLwotICAgIGYgPSBhcF9wZm9wZW4oci0+cG9vbCwgci0+ZmlsZW5hbWUsICJyYiIpOwotI2Vsc2UKLSAgICBmID0gYXBfcGZvcGVuKHItPnBvb2wsIHItPmZpbGVuYW1lLCAiciIpOwotI2VuZGlmCi0KLSAgICBpZiAoZiA9PSBOVUxMKSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotCQkgICAgICJmaWxlIHBlcm1pc3Npb25zIGRlbnkgc2VydmVyIGFjY2VzczogJXMiLCByLT5maWxlbmFtZSk7Ci0gICAgICAgIHJldHVybiBGT1JCSURERU47Ci0gICAgfQotCQotICAgIGFwX3VwZGF0ZV9tdGltZShyLCByLT5maW5mby5zdF9tdGltZSk7Ci0gICAgYXBfc2V0X2xhc3RfbW9kaWZpZWQocik7Ci0gICAgYXBfc2V0X2V0YWcocik7Ci0gICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkFjY2VwdC1SYW5nZXMiLCAiYnl0ZXMiKTsKLSAgICBpZiAoKChlcnJzdGF0dXMgPSBhcF9tZWV0c19jb25kaXRpb25zKHIpKSAhPSBPSykKLQl8fCAoZXJyc3RhdHVzID0gYXBfc2V0X2NvbnRlbnRfbGVuZ3RoKHIsIHItPmZpbmZvLnN0X3NpemUpKSkgewotICAgICAgICByZXR1cm4gZXJyc3RhdHVzOwotICAgIH0KLQotI2lmZGVmIFVTRV9NTUFQX0ZJTEVTCi0gICAgYXBfYmxvY2tfYWxhcm1zKCk7Ci0gICAgaWYgKChyLT5maW5mby5zdF9zaXplID49IE1NQVBfVEhSRVNIT0xEKQotCSYmIChyLT5maW5mby5zdF9zaXplIDwgTU1BUF9MSU1JVCkKLQkmJiAoIXItPmhlYWRlcl9vbmx5IHx8IChkLT5jb250ZW50X21kNSAmIDEpKSkgewotCS8qIHdlIG5lZWQgdG8gcHJvdGVjdCBvdXJzZWx2ZXMgaW4gY2FzZSB3ZSBkaWUgd2hpbGUgd2UndmUgZ290IHRoZQotIAkgKiBmaWxlIG1tYXBwZWQgKi8KLQltbSA9IG1tYXAoTlVMTCwgci0+ZmluZm8uc3Rfc2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwKLQkJICBmaWxlbm8oZiksIDApOwotCWlmIChtbSA9PSAoY2FkZHJfdCktMSkgewotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0NSSVQsIHIsCi0JCQkgImRlZmF1bHRfaGFuZGxlcjogbW1hcCBmYWlsZWQ6ICVzIiwgci0+ZmlsZW5hbWUpOwotCX0KLSAgICB9Ci0gICAgZWxzZSB7Ci0JbW0gPSAoY2FkZHJfdCktMTsKLSAgICB9Ci0KLSAgICBpZiAobW0gPT0gKGNhZGRyX3QpLTEpIHsKLQlhcF91bmJsb2NrX2FsYXJtcygpOwotI2VuZGlmCi0KLSNpZmRlZiBDSEFSU0VUX0VCQ0RJQwotCS8qIFRvIG1ha2Ugc2VydmluZyBvZiAicmF3IEFTQ0lJIHRleHQiIGZpbGVzIGVhc3kgKHRoZXkgc2VydmUgZmFzdGVyCi0JICogc2luY2UgdGhleSBkb24ndCBoYXZlIHRvIGJlIGNvbnZlcnRlZCBmcm9tIEVCQ0RJQyksIGEgbmV3Ci0JICogIm1hZ2ljIiB0eXBlIHByZWZpeCB3YXMgaW52ZW50ZWQ6IHRleHQveC1hc2NpaS17cGxhaW4saHRtbCwuLi59Ci0JICogSWYgd2UgZGV0ZWN0IG9uZSBvZiB0aGVzZSBjb250ZW50IHR5cGVzIGhlcmUsIHdlIHNpbXBseSBjb3JyZWN0Ci0JICogdGhlIHR5cGUgdG8gdGhlIHJlYWwgdGV4dC97cGxhaW4saHRtbCwuLi59IHR5cGUuIE90aGVyd2lzZSwgd2UKLQkgKiBzZXQgYSBmbGFnIHRoYXQgdHJhbnNsYXRpb24gaXMgcmVxdWlyZWQgbGF0ZXIgb24uCi0JICovCi0JY29udmVydF9mbGFnID0gYXBfY2hlY2tjb252KHIpOwotCWlmIChkLT5jb250ZW50X21kNSAmIDEpIHsKLQkgICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkNvbnRlbnQtTUQ1IiwKLQkJCSAgYXBfbWQ1ZGlnZXN0KHItPnBvb2wsIGYsIGNvbnZlcnRfZmxhZykpOwotCX0KLSNlbHNlCi0JaWYgKGQtPmNvbnRlbnRfbWQ1ICYgMSkgewotCSAgICBhcF90YWJsZV9zZXRuKHItPmhlYWRlcnNfb3V0LCAiQ29udGVudC1NRDUiLAotCQkJICBhcF9tZDVkaWdlc3Qoci0+cG9vbCwgZikpOwotCX0KLSNlbmRpZiAvKiBDSEFSU0VUX0VCQ0RJQyAqLwotCi0JcmFuZ2VzdGF0dXMgPSBhcF9zZXRfYnl0ZXJhbmdlKHIpOwotCi0JYXBfc2VuZF9odHRwX2hlYWRlcihyKTsKLQkKLQlpZiAoIXItPmhlYWRlcl9vbmx5KSB7Ci0JICAgIGlmICghcmFuZ2VzdGF0dXMpIHsKLQkJYXBfc2VuZF9mZChmLCByKTsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJbG9uZyBvZmZzZXQsIGxlbmd0aDsKLQkJd2hpbGUgKGFwX2VhY2hfYnl0ZXJhbmdlKHIsICZvZmZzZXQsICZsZW5ndGgpKSB7Ci0JCSAgICAvKgotCQkgICAgICogTm9uIHplcm8gcmV0dXJucyBhcmUgbW9yZSBwb3J0YWJsZSB0aGFuIGNoZWNraW5nCi0JCSAgICAgKiBmb3IgYSByZXR1cm4gb2YgLTEuCi0JCSAgICAgKi8KLQkJICAgIGlmIChmc2VlayhmLCBvZmZzZXQsIFNFRUtfU0VUKSkgewotCQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgci0+c2VydmVyLAotCQkJICAgICAgIkZhaWxlZCB0byBmc2VlayBmb3IgYnl0ZXJhbmdlICglbGQsICVsZCkiLAotCQkJICAgICAgb2Zmc2V0LCBsZW5ndGgpOwotCQkgICAgfQotCQkgICAgZWxzZSB7Ci0JCQlhcF9zZW5kX2ZkX2xlbmd0aChmLCByLCBsZW5ndGgpOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0KLSNpZmRlZiBVU0VfTU1BUF9GSUxFUwotICAgIH0KLSAgICBlbHNlIHsKLQlzdHJ1Y3QgbW1hcF9yZWMgKm1tZDsKLQotCW1tZCA9IGFwX3BhbGxvYyhyLT5wb29sLCBzaXplb2YoKm1tZCkpOwotCW1tZC0+bW0gPSBtbTsKLQltbWQtPmxlbmd0aCA9IHItPmZpbmZvLnN0X3NpemU7Ci0JYXBfcmVnaXN0ZXJfY2xlYW51cChyLT5wb29sLCAodm9pZCAqKW1tZCwgbW1hcF9jbGVhbnVwLCBtbWFwX2NsZWFudXApOwotCWFwX3VuYmxvY2tfYWxhcm1zKCk7Ci0KLQlpZiAoZC0+Y29udGVudF9tZDUgJiAxKSB7Ci0JICAgIEFQX01ENV9DVFggY29udGV4dDsKLQkgICAgCi0JICAgIGFwX01ENUluaXQoJmNvbnRleHQpOwotCSAgICBhcF9NRDVVcGRhdGUoJmNvbnRleHQsICh2b2lkICopbW0sICh1bnNpZ25lZCBpbnQpci0+ZmluZm8uc3Rfc2l6ZSk7Ci0JICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJDb250ZW50LU1ENSIsCi0JCQkgIGFwX21kNWNvbnRleHRUbzY0KHItPnBvb2wsICZjb250ZXh0KSk7Ci0JfQotCi0JcmFuZ2VzdGF0dXMgPSBhcF9zZXRfYnl0ZXJhbmdlKHIpOwotCWFwX3NlbmRfaHR0cF9oZWFkZXIocik7Ci0JCi0JaWYgKCFyLT5oZWFkZXJfb25seSkgewotCSAgICBpZiAoIXJhbmdlc3RhdHVzKSB7Ci0JCWFwX3NlbmRfbW1hcChtbSwgciwgMCwgci0+ZmluZm8uc3Rfc2l6ZSk7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCWxvbmcgb2Zmc2V0LCBsZW5ndGg7Ci0JCXdoaWxlIChhcF9lYWNoX2J5dGVyYW5nZShyLCAmb2Zmc2V0LCAmbGVuZ3RoKSkgewotCQkgICAgYXBfc2VuZF9tbWFwKG1tLCByLCBvZmZzZXQsIGxlbmd0aCk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0jZW5kaWYKLQotICAgIGFwX3BmY2xvc2Uoci0+cG9vbCwgZik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0aWMgY29uc3QgaGFuZGxlcl9yZWMgY29yZV9oYW5kbGVyc1tdID0gewoteyAiKi8qIiwgZGVmYXVsdF9oYW5kbGVyIH0sCi17ICJkZWZhdWx0LWhhbmRsZXIiLCBkZWZhdWx0X2hhbmRsZXIgfSwKLXsgTlVMTCwgTlVMTCB9Ci19OwotCi1BUElfVkFSX0VYUE9SVCBtb2R1bGUgY29yZV9tb2R1bGUgPSB7Ci0gICAgU1RBTkRBUkRfTU9EVUxFX1NUVUZGLAotICAgIE5VTEwsCQkJLyogaW5pdGlhbGl6ZXIgKi8KLSAgICBjcmVhdGVfY29yZV9kaXJfY29uZmlnLAkvKiBjcmVhdGUgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlICovCi0gICAgbWVyZ2VfY29yZV9kaXJfY29uZmlncywJLyogbWVyZ2UgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIGNyZWF0ZV9jb3JlX3NlcnZlcl9jb25maWcsCS8qIGNyZWF0ZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLSAgICBtZXJnZV9jb3JlX3NlcnZlcl9jb25maWdzLAkvKiBtZXJnZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgY29yZV9jbWRzLAkJCS8qIGNvbW1hbmQgdGFibGUgKi8KLSAgICBjb3JlX2hhbmRsZXJzLAkJLyogaGFuZGxlcnMgKi8KLSAgICBjb3JlX3RyYW5zbGF0ZSwJCS8qIHRyYW5zbGF0ZV9oYW5kbGVyICovCi0gICAgTlVMTCwJCQkvKiBjaGVja191c2VyX2lkICovCi0gICAgTlVMTCwJCQkvKiBjaGVjayBhdXRoICovCi0gICAgZG9fbm90aGluZywJCQkvKiBjaGVjayBhY2Nlc3MgKi8KLSAgICBkb19ub3RoaW5nLAkJCS8qIHR5cGVfY2hlY2tlciAqLwotICAgIE5VTEwsCQkJLyogcHJlLXJ1biBmaXh1cHMgKi8KLSAgICBOVUxMLAkJCS8qIGxvZ2dlciAqLwotICAgIE5VTEwsCQkJLyogaGVhZGVyIHBhcnNlciAqLwotICAgIE5VTEwsCQkJLyogY2hpbGRfaW5pdCAqLwotICAgIE5VTEwsCQkJLyogY2hpbGRfZXhpdCAqLwotICAgIE5VTEwJCQkvKiBwb3N0X3JlYWRfcmVxdWVzdCAqLwotfTsKZGlmZiAtLWdpdCBhL21vZHVsZXMvaHR0cC9odHRwX3Byb3RvY29sLmMgYi9tb2R1bGVzL2h0dHAvaHR0cF9wcm90b2NvbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTc3OTMxLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvaHR0cC9odHRwX3Byb3RvY29sLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYzICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogaHR0cF9wcm90b2NvbC5jIC0tLSByb3V0aW5lcyB3aGljaCBkaXJlY3RseSBjb21tdW5pY2F0ZSB3aXRoIHRoZSBjbGllbnQuCi0gKgotICogQ29kZSBvcmlnaW5hbGx5IGJ5IFJvYiBNY0Nvb2w7IG11Y2ggcmVkb25lIGJ5IFJvYmVydCBTLiBUaGF1Ci0gKiBhbmQgdGhlIEFwYWNoZSBHcm91cC4KLSAqLwotCi0jZGVmaW5lIENPUkVfUFJJVkFURQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiCi0jaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCi0jaW5jbHVkZSAiaHR0cF92aG9zdC5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiICAgICAgICAgICAvKiBGb3IgZXJyb3JzIGRldGVjdGVkIGluIGJhc2ljIGF1dGggY29tbW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN1cHBvcnQgY29kZS4uLiAqLwotI2luY2x1ZGUgInV0aWxfZGF0ZS5oIiAgICAgICAgICAvKiBGb3IgcGFyc2VIVFRQZGF0ZSBhbmQgQkFEX0RBVEUgKi8KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlICJodHRwX2NvbmZfZ2xvYmFscy5oIgotCi0jZGVmaW5lIFNFVF9CWVRFU19TRU5UKHIpIFwKLSAgZG8geyBpZiAoci0+c2VudF9ib2R5Y3QpIFwKLSAgICAgICAgICBhcF9iZ2V0b3B0IChyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJPX0JZVEVDVCwgJnItPmJ5dGVzX3NlbnQpOyBcCi0gIH0gd2hpbGUgKDApCi0KLQotc3RhdGljIGludCBwYXJzZV9ieXRlcmFuZ2UoY2hhciAqcmFuZ2UsIGxvbmcgY2xlbmd0aCwgbG9uZyAqc3RhcnQsIGxvbmcgKmVuZCkKLXsKLSAgICBjaGFyICpkYXNoID0gc3RyY2hyKHJhbmdlLCAnLScpOwotCi0gICAgaWYgKCFkYXNoKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmICgoZGFzaCA9PSByYW5nZSkpIHsKLSAgICAgICAgLyogSW4gdGhlIGZvcm0gIi01IiAqLwotICAgICAgICAqc3RhcnQgPSBjbGVuZ3RoIC0gYXRvbChkYXNoICsgMSk7Ci0gICAgICAgICplbmQgPSBjbGVuZ3RoIC0gMTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgICpkYXNoID0gJ1wwJzsKLSAgICAgICAgZGFzaCsrOwotICAgICAgICAqc3RhcnQgPSBhdG9sKHJhbmdlKTsKLSAgICAgICAgaWYgKCpkYXNoKQotICAgICAgICAgICAgKmVuZCA9IGF0b2woZGFzaCk7Ci0gICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgIC8qICI1LSIgKi8KLSAgICAgICAgICAgICplbmQgPSBjbGVuZ3RoIC0gMTsKLSAgICB9Ci0KLSAgICBpZiAoKnN0YXJ0IDwgMCkKLQkqc3RhcnQgPSAwOwotCi0gICAgaWYgKCplbmQgPj0gY2xlbmd0aCkKLSAgICAgICAgKmVuZCA9IGNsZW5ndGggLSAxOwotCi0gICAgaWYgKCpzdGFydCA+ICplbmQpCi0JcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gKCpzdGFydCA+IDAgfHwgKmVuZCA8IGNsZW5ndGggLSAxKTsKLX0KLQotc3RhdGljIGludCBpbnRlcm5hbF9ieXRlcmFuZ2UoaW50LCBsb25nICosIHJlcXVlc3RfcmVjICosIGNvbnN0IGNoYXIgKiosIGxvbmcgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgKik7Ci0KLUFQSV9FWFBPUlQoaW50KSBhcF9zZXRfYnl0ZXJhbmdlKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvbnN0IGNoYXIgKnJhbmdlLCAqaWZfcmFuZ2UsICptYXRjaDsKLSAgICBsb25nIHJhbmdlX3N0YXJ0LCByYW5nZV9lbmQ7Ci0KLSAgICBpZiAoIXItPmNsZW5ndGggfHwgci0+YXNzYmFja3dhcmRzKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8qIENoZWNrIGZvciBSYW5nZSByZXF1ZXN0LWhlYWRlciAoSFRUUC8xLjEpIG9yIFJlcXVlc3QtUmFuZ2UgZm9yCi0gICAgICogYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgd2l0aCBzZWNvbmQtZHJhZnQgTHVvdG9uZW4vRnJhbmtzCi0gICAgICogYnl0ZS1yYW5nZXMgKGUuZy4gTmV0c2NhcGUgTmF2aWdhdG9yIDItMykuCi0gICAgICoKLSAgICAgKiBXZSBzdXBwb3J0IHRoaXMgZm9ybSwgd2l0aCBSZXF1ZXN0LVJhbmdlLCBhbmQgKGZhcnRoZXIgZG93bikgd2UKLSAgICAgKiBzZW5kIG11bHRpcGFydC94LWJ5dGVyYW5nZXMgaW5zdGVhZCBvZiBtdWx0aXBhcnQvYnl0ZXJhbmdlcyBmb3IKLSAgICAgKiBSZXF1ZXN0LVJhbmdlIGJhc2VkIHJlcXVlc3RzIHRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIE5ldHNjYXBlCi0gICAgICogTmF2aWdhdG9yIDItMyBhbmQgTVNJRSAzLgotICAgICAqLwotCi0gICAgaWYgKCEocmFuZ2UgPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIlJhbmdlIikpKQotICAgICAgICByYW5nZSA9IGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiUmVxdWVzdC1SYW5nZSIpOwotCi0gICAgaWYgKCFyYW5nZSB8fCBzdHJuY2FzZWNtcChyYW5nZSwgImJ5dGVzPSIsIDYpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIENoZWNrIHRoZSBJZi1SYW5nZSBoZWFkZXIgZm9yIEV0YWcgb3IgRGF0ZS4KLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBjaGVjayB3aWxsIHJldHVybiBmYWxzZSAoYXMgcmVxdWlyZWQpIGlmIGVpdGhlcgotICAgICAqIG9mIHRoZSB0d28gZXRhZ3MgYXJlIHdlYWsuCi0gICAgICovCi0gICAgaWYgKChpZl9yYW5nZSA9IGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiSWYtUmFuZ2UiKSkpIHsKLSAgICAgICAgaWYgKGlmX3JhbmdlWzBdID09ICciJykgewotICAgICAgICAgICAgaWYgKCEobWF0Y2ggPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19vdXQsICJFdGFnIikpIHx8Ci0gICAgICAgICAgICAgICAgKHN0cmNtcChpZl9yYW5nZSwgbWF0Y2gpICE9IDApKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCEobWF0Y2ggPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19vdXQsICJMYXN0LU1vZGlmaWVkIikpIHx8Ci0gICAgICAgICAgICAgICAgIChzdHJjbXAoaWZfcmFuZ2UsIG1hdGNoKSAhPSAwKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmICghc3RyY2hyKHJhbmdlLCAnLCcpKSB7Ci0gICAgICAgIC8qIEEgc2luZ2xlIHJhbmdlICovCi0gICAgICAgIGlmICghcGFyc2VfYnl0ZXJhbmdlKGFwX3BzdHJkdXAoci0+cG9vbCwgcmFuZ2UgKyA2KSwgci0+Y2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhbmdlX3N0YXJ0LCAmcmFuZ2VfZW5kKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIHItPmJ5dGVyYW5nZSA9IDE7Ci0KLSAgICAgICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkNvbnRlbnQtUmFuZ2UiLAotCSAgICBhcF9wc3ByaW50ZihyLT5wb29sLCAiYnl0ZXMgJWxkLSVsZC8lbGQiLAotCQlyYW5nZV9zdGFydCwgcmFuZ2VfZW5kLCByLT5jbGVuZ3RoKSk7Ci0gICAgICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJDb250ZW50LUxlbmd0aCIsCi0JICAgIGFwX3BzcHJpbnRmKHItPnBvb2wsICIlbGQiLCByYW5nZV9lbmQgLSByYW5nZV9zdGFydCArIDEpKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIGEgbXVsdGlwbGUgcmFuZ2UgKi8KLSAgICAgICAgY29uc3QgY2hhciAqcl9yYW5nZSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgcmFuZ2UgKyA2KTsKLSAgICAgICAgbG9uZyB0bGVuZ3RoID0gMDsKLQotICAgICAgICByLT5ieXRlcmFuZ2UgPSAyOwotICAgICAgICByLT5ib3VuZGFyeSA9IGFwX3BzcHJpbnRmKHItPnBvb2wsICIlbHglbHgiLAotCQkJCXItPnJlcXVlc3RfdGltZSwgKGxvbmcpIGdldHBpZCgpKTsKLSAgICAgICAgd2hpbGUgKGludGVybmFsX2J5dGVyYW5nZSgwLCAmdGxlbmd0aCwgciwgJnJfcmFuZ2UsIE5VTEwsIE5VTEwpKTsKLSAgICAgICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkNvbnRlbnQtTGVuZ3RoIiwKLQkgICAgYXBfcHNwcmludGYoci0+cG9vbCwgIiVsZCIsIHRsZW5ndGgpKTsKLSAgICB9Ci0KLSAgICByLT5zdGF0dXMgPSBQQVJUSUFMX0NPTlRFTlQ7Ci0gICAgci0+cmFuZ2UgPSByYW5nZSArIDY7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX2VhY2hfYnl0ZXJhbmdlKHJlcXVlc3RfcmVjICpyLCBsb25nICpvZmZzZXQsIGxvbmcgKmxlbmd0aCkKLXsKLSAgICByZXR1cm4gaW50ZXJuYWxfYnl0ZXJhbmdlKDEsIE5VTEwsIHIsICZyLT5yYW5nZSwgb2Zmc2V0LCBsZW5ndGgpOwotfQotCi0vKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIHJlYWxyZXE9MSwgaXQgd2lsbCBzcGl0IG91dAotICogdGhlIGNvcnJlY3QgaGVhZGVycyBmb3IgYSBieXRlcmFuZ2UgY2h1bmssIGFuZCBzZXQgb2Zmc2V0IGFuZAotICogbGVuZ3RoIHRvIHRoZSBwb3NpdGlvbnMgdGhleSBzaG91bGQgYmUuCi0gKgotICogSWYgaXQgaXMgY2FsbGVkIHdpdGggcmVhbHJlcT0wLCBpdCB3aWxsIGFkZCB0byB0bGVuZ3RoIHRoZSBsZW5ndGgKLSAqIGl0ICp3b3VsZCogaGF2ZSB1c2VkIHdpdGggcmVhbHJlcT0xLgotICoKLSAqIEVpdGhlciBjYXNlIHdpbGwgcmV0dXJuIDEgaWYgaXQgc2hvdWxkIGJlIGNhbGxlZCBhZ2FpbiwgYW5kIDAKLSAqIHdoZW4gZG9uZS4KLSAqLwotc3RhdGljIGludCBpbnRlcm5hbF9ieXRlcmFuZ2UoaW50IHJlYWxyZXEsIGxvbmcgKnRsZW5ndGgsIHJlcXVlc3RfcmVjICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKnJfcmFuZ2UsIGxvbmcgKm9mZnNldCwgbG9uZyAqbGVuZ3RoKQotewotICAgIGxvbmcgcmFuZ2Vfc3RhcnQsIHJhbmdlX2VuZDsKLSAgICBjaGFyICpyYW5nZTsKLQotICAgIGlmICghKipyX3JhbmdlKSB7Ci0gICAgICAgIGlmIChyLT5ieXRlcmFuZ2UgPiAxKSB7Ci0gICAgICAgICAgICBpZiAocmVhbHJlcSkKLSAgICAgICAgICAgICAgICBhcF9ydnB1dHMociwgIlwwMTVcMDEyLS0iLCByLT5ib3VuZGFyeSwgIi0tXDAxNVwwMTIiLCBOVUxMKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAqdGxlbmd0aCArPSA0ICsgc3RybGVuKHItPmJvdW5kYXJ5KSArIDQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmFuZ2UgPSBhcF9nZXR3b3JkKHItPnBvb2wsIHJfcmFuZ2UsICcsJyk7Ci0gICAgaWYgKCFwYXJzZV9ieXRlcmFuZ2UocmFuZ2UsIHItPmNsZW5ndGgsICZyYW5nZV9zdGFydCwgJnJhbmdlX2VuZCkpCi0gICAgICAgIC8qIFNraXAgdGhpcyBvbmUgKi8KLSAgICAgICAgcmV0dXJuIGludGVybmFsX2J5dGVyYW5nZShyZWFscmVxLCB0bGVuZ3RoLCByLCByX3JhbmdlLCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKLQotICAgIGlmIChyLT5ieXRlcmFuZ2UgPiAxKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKmN0ID0gci0+Y29udGVudF90eXBlID8gci0+Y29udGVudF90eXBlIDogYXBfZGVmYXVsdF90eXBlKHIpOwotICAgICAgICBjaGFyIHRzW01BWF9TVFJJTkdfTEVOXTsKLQotICAgICAgICBhcF9zbnByaW50Zih0cywgc2l6ZW9mKHRzKSwgIiVsZC0lbGQvJWxkIiwgcmFuZ2Vfc3RhcnQsIHJhbmdlX2VuZCwKLSAgICAgICAgICAgICAgICAgICAgci0+Y2xlbmd0aCk7Ci0gICAgICAgIGlmIChyZWFscmVxKQotICAgICAgICAgICAgYXBfcnZwdXRzKHIsICJcMDE1XDAxMi0tIiwgci0+Ym91bmRhcnksICJcMDE1XDAxMkNvbnRlbnQtdHlwZTogIiwKLSAgICAgICAgICAgICAgICAgICBjdCwgIlwwMTVcMDEyQ29udGVudC1yYW5nZTogYnl0ZXMgIiwgdHMsICJcMDE1XDAxMlwwMTVcMDEyIiwKLSAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgKnRsZW5ndGggKz0gNCArIHN0cmxlbihyLT5ib3VuZGFyeSkgKyAxNiArIHN0cmxlbihjdCkgKyAyMyArCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4odHMpICsgNDsKLSAgICB9Ci0KLSAgICBpZiAocmVhbHJlcSkgewotICAgICAgICAqb2Zmc2V0ID0gcmFuZ2Vfc3RhcnQ7Ci0gICAgICAgICpsZW5ndGggPSByYW5nZV9lbmQgLSByYW5nZV9zdGFydCArIDE7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAqdGxlbmd0aCArPSByYW5nZV9lbmQgLSByYW5nZV9zdGFydCArIDE7Ci0gICAgfQotICAgIHJldHVybiAxOwotfQotCi1BUElfRVhQT1JUKGludCkgYXBfc2V0X2NvbnRlbnRfbGVuZ3RoKHJlcXVlc3RfcmVjICpyLCBsb25nIGNsZW5ndGgpCi17Ci0gICAgci0+Y2xlbmd0aCA9IGNsZW5ndGg7Ci0gICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkNvbnRlbnQtTGVuZ3RoIiwgYXBfcHNwcmludGYoci0+cG9vbCwgIiVsZCIsIGNsZW5ndGgpKTsKLSAgICByZXR1cm4gMDsKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX3NldF9rZWVwYWxpdmUocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IGthX3NlbnQgPSAwOwotICAgIGludCB3aW1weSA9IGFwX2ZpbmRfdG9rZW4oci0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX291dCwgIkNvbm5lY3Rpb24iKSwgImNsb3NlIik7Ci0gICAgY29uc3QgY2hhciAqY29ubiA9IGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiQ29ubmVjdGlvbiIpOwotCi0gICAgLyogVGhlIGZvbGxvd2luZyBjb252b2x1dGVkIGNvbmRpdGlvbmFsIGRldGVybWluZXMgd2hldGhlciBvciBub3QKLSAgICAgKiB0aGUgY3VycmVudCBjb25uZWN0aW9uIHNob3VsZCByZW1haW4gcGVyc2lzdGVudCBhZnRlciB0aGlzIHJlc3BvbnNlCi0gICAgICogKGEuay5hLiBIVFRQIEtlZXAtQWxpdmUpIGFuZCB3aGV0aGVyIG9yIG5vdCB0aGUgb3V0cHV0IG1lc3NhZ2UKLSAgICAgKiBib2R5IHNob3VsZCB1c2UgdGhlIEhUVFAvMS4xIGNodW5rZWQgdHJhbnNmZXItY29kaW5nLiAgSW4gRW5nbGlzaCwKLSAgICAgKgotICAgICAqICAgSUYgIHdlIGhhdmUgbm90IG1hcmtlZCB0aGlzIGNvbm5lY3Rpb24gYXMgZXJyb3JlZDsKLSAgICAgKiAgIGFuZCB0aGUgcmVzcG9uc2UgYm9keSBoYXMgYSBkZWZpbmVkIGxlbmd0aCBkdWUgdG8gdGhlIHN0YXR1cyBjb2RlCi0gICAgICogICAgICAgYmVpbmcgMzA0IG9yIDIwNCwgdGhlIHJlcXVlc3QgbWV0aG9kIGJlaW5nIEhFQUQsIGFscmVhZHkKLSAgICAgKiAgICAgICBoYXZpbmcgZGVmaW5lZCBDb250ZW50LUxlbmd0aCBvciBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZCwgb3IKLSAgICAgKiAgICAgICB0aGUgcmVxdWVzdCB2ZXJzaW9uIGJlaW5nIEhUVFAvMS4xIGFuZCB0aHVzIGNhcGFibGUgb2YgYmVpbmcgc2V0Ci0gICAgICogICAgICAgYXMgY2h1bmtlZCBbd2Uga25vdyB0aGUgKHItPmNodW5rZWQgPSAxKSBzaWRlLWVmZmVjdCBpcyB1Z2x5XTsKLSAgICAgKiAgIGFuZCB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gZW5hYmxlcyBrZWVwLWFsaXZlOwotICAgICAqICAgYW5kIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBoYXMgYSByZWFzb25hYmxlIGludGVyLXJlcXVlc3QgdGltZW91dDsKLSAgICAgKiAgIGFuZCB0aGVyZSBpcyBubyBtYXhpbXVtICMgcmVxdWVzdHMgb3IgdGhlIG1heCBoYXNuJ3QgYmVlbiByZWFjaGVkOwotICAgICAqICAgYW5kIHRoZSByZXNwb25zZSBzdGF0dXMgZG9lcyBub3QgcmVxdWlyZSBhIGNsb3NlOwotICAgICAqICAgYW5kIHRoZSByZXNwb25zZSBnZW5lcmF0b3IgaGFzIG5vdCBhbHJlYWR5IGluZGljYXRlZCBjbG9zZTsKLSAgICAgKiAgIGFuZCB0aGUgY2xpZW50IGRpZCBub3QgcmVxdWVzdCBub24tcGVyc2lzdGVuY2UgKENvbm5lY3Rpb246IGNsb3NlKTsKLSAgICAgKiAgIGFuZCAgICB3ZSBoYXZlbid0IGJlZW4gY29uZmlndXJlZCB0byBpZ25vcmUgdGhlIGJ1Z2d5IHR3aXQKLSAgICAgKiAgICAgICBvciB0aGV5J3JlIGEgYnVnZ3kgdHdpdCBjb21pbmcgdGhyb3VnaCBhIEhUVFAvMS4xIHByb3h5Ci0gICAgICogICBhbmQgICAgdGhlIGNsaWVudCBpcyByZXF1ZXN0aW5nIGFuIEhUVFAvMS4wLXN0eWxlIGtlZXAtYWxpdmUKLSAgICAgKiAgICAgICBvciB0aGUgY2xpZW50IGNsYWltcyB0byBiZSBIVFRQLzEuMSBjb21wbGlhbnQgKHBlcmhhcHMgYSBwcm94eSk7Ci0gICAgICogICBUSEVOIHdlIGNhbiBiZSBwZXJzaXN0ZW50LCB3aGljaCByZXF1aXJlcyBtb3JlIGhlYWRlcnMgYmUgb3V0cHV0LgotICAgICAqCi0gICAgICogTm90ZSB0aGF0IHRoZSBjb25kaXRpb24gZXZhbHVhdGlvbiBvcmRlciBpcyBleHRyZW1lbHkgaW1wb3J0YW50LgotICAgICAqLwotICAgIGlmICgoci0+Y29ubmVjdGlvbi0+a2VlcGFsaXZlICE9IC0xKSAmJgotICAgICAgICAoKHItPnN0YXR1cyA9PSBIVFRQX05PVF9NT0RJRklFRCkgfHwKLSAgICAgICAgIChyLT5zdGF0dXMgPT0gSFRUUF9OT19DT05URU5UKSB8fAotICAgICAgICAgci0+aGVhZGVyX29ubHkgfHwKLSAgICAgICAgIGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX291dCwgIkNvbnRlbnQtTGVuZ3RoIikgfHwKLSAgICAgICAgIGFwX2ZpbmRfbGFzdF90b2tlbihyLT5wb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX291dCwgIlRyYW5zZmVyLUVuY29kaW5nIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgImNodW5rZWQiKSB8fAotICAgICAgICAgKChyLT5wcm90b19udW0gPj0gSFRUUF9WRVJTSU9OKDEsMSkpICYmCi0JICAoci0+Y2h1bmtlZCA9IDEpKSkgJiYgLyogVEhJUyBDT0RFIElTIENPUlJFQ1QsIHNlZSBjb21tZW50IGFib3ZlLiAqLwotICAgICAgICByLT5zZXJ2ZXItPmtlZXBfYWxpdmUgJiYKLSAgICAgICAgKHItPnNlcnZlci0+a2VlcF9hbGl2ZV90aW1lb3V0ID4gMCkgJiYKLSAgICAgICAgKChyLT5zZXJ2ZXItPmtlZXBfYWxpdmVfbWF4ID09IDApIHx8Ci0gICAgICAgICAoci0+c2VydmVyLT5rZWVwX2FsaXZlX21heCA+IHItPmNvbm5lY3Rpb24tPmtlZXBhbGl2ZXMpKSAmJgotICAgICAgICAhYXBfc3RhdHVzX2Ryb3BzX2Nvbm5lY3Rpb24oci0+c3RhdHVzKSAmJgotICAgICAgICAhd2ltcHkgJiYKLSAgICAgICAgIWFwX2ZpbmRfdG9rZW4oci0+cG9vbCwgY29ubiwgImNsb3NlIikgJiYKLSAgICAgICAgKCFhcF90YWJsZV9nZXQoci0+c3VicHJvY2Vzc19lbnYsICJub2tlZXBhbGl2ZSIpIHx8Ci0gICAgICAgICBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIlZpYSIpKSAmJgotICAgICAgICAoKGthX3NlbnQgPSBhcF9maW5kX3Rva2VuKHItPnBvb2wsIGNvbm4sICJrZWVwLWFsaXZlIikpIHx8Ci0gICAgICAgICAoci0+cHJvdG9fbnVtID49IEhUVFBfVkVSU0lPTigxLDEpKSkKLSAgICAgICApIHsKLSAgICAgICAgaW50IGxlZnQgPSByLT5zZXJ2ZXItPmtlZXBfYWxpdmVfbWF4IC0gci0+Y29ubmVjdGlvbi0+a2VlcGFsaXZlczsKLQotICAgICAgICByLT5jb25uZWN0aW9uLT5rZWVwYWxpdmUgPSAxOwotICAgICAgICByLT5jb25uZWN0aW9uLT5rZWVwYWxpdmVzKys7Ci0KLSAgICAgICAgLyogSWYgdGhleSBzZW50IGEgS2VlcC1BbGl2ZSB0b2tlbiwgc2VuZCBvbmUgYmFjayAqLwotICAgICAgICBpZiAoa2Ffc2VudCkgewotICAgICAgICAgICAgaWYgKHItPnNlcnZlci0+a2VlcF9hbGl2ZV9tYXgpCi0JCWFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJLZWVwLUFsaXZlIiwKLQkJICAgIGFwX3BzcHJpbnRmKHItPnBvb2wsICJ0aW1lb3V0PSVkLCBtYXg9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnNlcnZlci0+a2VlcF9hbGl2ZV90aW1lb3V0LCBsZWZ0KSk7Ci0gICAgICAgICAgICBlbHNlCi0JCWFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJLZWVwLUFsaXZlIiwKLQkJICAgIGFwX3BzcHJpbnRmKHItPnBvb2wsICJ0aW1lb3V0PSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5zZXJ2ZXItPmtlZXBfYWxpdmVfdGltZW91dCkpOwotICAgICAgICAgICAgYXBfdGFibGVfbWVyZ2VuKHItPmhlYWRlcnNfb3V0LCAiQ29ubmVjdGlvbiIsICJLZWVwLUFsaXZlIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiBPdGhlcndpc2UsIHdlIG5lZWQgdG8gaW5kaWNhdGUgdGhhdCB3ZSB3aWxsIGJlIGNsb3NpbmcgdGhpcwotICAgICAqIGNvbm5lY3Rpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGN1cnJlbnQgcmVzcG9uc2UuCi0gICAgICoKLSAgICAgKiBXZSBvbmx5IHJlYWxseSBuZWVkIHRvIHNlbmQgImNsb3NlIiB0byBIVFRQLzEuMSBjbGllbnRzLCBidXQgd2UKLSAgICAgKiBhbHdheXMgc2VuZCBpdCBhbnl3YXksIGJlY2F1c2UgYSBicm9rZW4gcHJveHkgbWF5IGlkZW50aWZ5IGl0c2VsZgotICAgICAqIGFzIEhUVFAvMS4wLCBidXQgcGFzcyBvdXIgcmVxdWVzdCBhbG9uZyB3aXRoIG91ciBIVFRQLzEuMSB0YWcKLSAgICAgKiB0byBhIEhUVFAvMS4xIGNsaWVudC4gQmV0dGVyIHNhZmUgdGhhbiBzb3JyeS4KLSAgICAgKi8KLSAgICBpZiAoIXdpbXB5KQotCWFwX3RhYmxlX21lcmdlbihyLT5oZWFkZXJzX291dCwgIkNvbm5lY3Rpb24iLCAiY2xvc2UiKTsKLQotICAgIHItPmNvbm5lY3Rpb24tPmtlZXBhbGl2ZSA9IDA7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIFJldHVybiB0aGUgbGF0ZXN0IHJhdGlvbmFsIHRpbWUgZnJvbSBhIHJlcXVlc3QvbXRpbWUgKG1vZGlmaWNhdGlvbiB0aW1lKQotICogcGFpci4gIFdlIHJldHVybiB0aGUgbXRpbWUgdW5sZXNzIGl0J3MgaW4gdGhlIGZ1dHVyZSwgaW4gd2hpY2ggY2FzZSB3ZQotICogcmV0dXJuIHRoZSBjdXJyZW50IHRpbWUuICBXZSB1c2UgdGhlIHJlcXVlc3QgdGltZSBhcyBhIHJlZmVyZW5jZSBpbiBvcmRlcgotICogdG8gbGltaXQgdGhlIG51bWJlciBvZiBjYWxscyB0byB0aW1lKCkuICBXZSBkb24ndCBjaGVjayBmb3IgZnV0dXJvc2l0eQotICogdW5sZXNzIHRoZSBtdGltZSBpcyBhdCBsZWFzdCBhcyBuZXcgYXMgdGhlIHJlZmVyZW5jZS4KLSAqLwotQVBJX0VYUE9SVCh0aW1lX3QpIGFwX3JhdGlvbmFsaXplX210aW1lKHJlcXVlc3RfcmVjICpyLCB0aW1lX3QgbXRpbWUpCi17Ci0gICAgdGltZV90IG5vdzsKLQotICAgIC8qIEZvciBhbGwgc3RhdGljIHJlc3BvbnNlcywgaXQncyBhbG1vc3QgY2VydGFpbiB0aGF0IHRoZSBmaWxlIHdhcwotICAgICAqIGxhc3QgbW9kaWZpZWQgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlcXVlc3QuICBTbyB0aGVyZSdzCi0gICAgICogbm8gcmVhc29uIHRvIGNhbGwgdGltZShOVUxMKSBhZ2Fpbi4gIEJ1dCBpZiB0aGUgcmVzcG9uc2UgaGFzIGJlZW4KLSAgICAgKiBjcmVhdGVkIG9uIGRlbWFuZCwgdGhlbiBpdCBtaWdodCBiZSBuZXdlciB0aGFuIHRoZSB0aW1lIHRoZSByZXF1ZXN0Ci0gICAgICogc3RhcnRlZC4gIEluIHRoaXMgZXZlbnQgd2UgcmVhbGx5IGhhdmUgdG8gY2FsbCB0aW1lKE5VTEwpIGFnYWluCi0gICAgICogc28gdGhhdCB3ZSBjYW4gZ2l2ZSB0aGUgY2xpZW50cyB0aGUgbW9zdCBhY2N1cmF0ZSBMYXN0LU1vZGlmaWVkLiAgSWYgd2UKLSAgICAgKiB3ZXJlIGdpdmVuIGEgdGltZSBpbiB0aGUgZnV0dXJlLCB3ZSByZXR1cm4gdGhlIGN1cnJlbnQgdGltZSAtIHRoZQotICAgICAqIExhc3QtTW9kaWZpZWQgY2FuJ3QgYmUgaW4gdGhlIGZ1dHVyZS4KLSAgICAgKi8KLSAgICBub3cgPSAobXRpbWUgPCByLT5yZXF1ZXN0X3RpbWUpID8gci0+cmVxdWVzdF90aW1lIDogdGltZShOVUxMKTsKLSAgICByZXR1cm4gKG10aW1lID4gbm93KSA/IG5vdyA6IG10aW1lOwotfQotCi1BUElfRVhQT1JUKGludCkgYXBfbWVldHNfY29uZGl0aW9ucyhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb25zdCBjaGFyICpldGFnID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfb3V0LCAiRVRhZyIpOwotICAgIGNvbnN0IGNoYXIgKmlmX21hdGNoLCAqaWZfbW9kaWZpZWRfc2luY2UsICppZl91bm1vZGlmaWVkLCAqaWZfbm9uZW1hdGNoOwotICAgIHRpbWVfdCBtdGltZTsKLQotICAgIC8qIENoZWNrIGZvciBjb25kaXRpb25hbCByZXF1ZXN0cyAtLS0gbm90ZSB0aGF0IHdlIG9ubHkgd2FudCB0byBkbwotICAgICAqIHRoaXMgaWYgd2UgYXJlIHN1Y2Nlc3NmdWwgc28gZmFyIGFuZCB3ZSBhcmUgbm90IHByb2Nlc3NpbmcgYQotICAgICAqIHN1YnJlcXVlc3Qgb3IgYW4gRXJyb3JEb2N1bWVudC4KLSAgICAgKgotICAgICAqIFRoZSBvcmRlciBvZiB0aGUgY2hlY2tzIGlzIGltcG9ydGFudCwgc2luY2UgRVRhZyBjaGVja3MgYXJlIHN1cHBvc2VkCi0gICAgICogdG8gYmUgbW9yZSBhY2N1cmF0ZSB0aGFuIGNoZWNrcyByZWxhdGl2ZSB0byB0aGUgbW9kaWZpY2F0aW9uIHRpbWUuCi0gICAgICogSG93ZXZlciwgbm90IGFsbCBkb2N1bWVudHMgYXJlIGd1YXJhbnRlZWQgdG8gKmhhdmUqIEVUYWdzLCBhbmQgc29tZQotICAgICAqIG1pZ2h0IGhhdmUgTGFzdC1Nb2RpZmllZCB2YWx1ZXMgdy9vIEVUYWdzLCBzbyB0aGlzIGdldHMgYSBsaXR0bGUKLSAgICAgKiBjb21wbGljYXRlZC4KLSAgICAgKi8KLQotICAgIGlmICghYXBfaXNfSFRUUF9TVUNDRVNTKHItPnN0YXR1cykgfHwgci0+bm9fbG9jYWxfY29weSkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgbXRpbWUgPSAoci0+bXRpbWUgIT0gMCkgPyByLT5tdGltZSA6IHRpbWUoTlVMTCk7Ci0KLSAgICAvKiBJZiBhbiBJZi1NYXRjaCByZXF1ZXN0LWhlYWRlciBmaWVsZCB3YXMgZ2l2ZW4KLSAgICAgKiBBTkQgdGhlIGZpZWxkIHZhbHVlIGlzIG5vdCAiKiIgKG1lYW5pbmcgbWF0Y2ggYW55dGhpbmcpCi0gICAgICogQU5EIGlmIG91ciBzdHJvbmcgRVRhZyBkb2VzIG5vdCBtYXRjaCBhbnkgZW50aXR5IHRhZyBpbiB0aGF0IGZpZWxkLAotICAgICAqICAgICByZXNwb25kIHdpdGggYSBzdGF0dXMgb2YgNDEyIChQcmVjb25kaXRpb24gRmFpbGVkKS4KLSAgICAgKi8KLSAgICBpZiAoKGlmX21hdGNoID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJJZi1NYXRjaCIpKSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChpZl9tYXRjaFswXSAhPSAnKicgJiYKLSAgICAgICAgICAgIChldGFnID09IE5VTEwgfHwgZXRhZ1swXSA9PSAnVycgfHwKLSAgICAgICAgICAgICAhYXBfZmluZF9saXN0X2l0ZW0oci0+cG9vbCwgaWZfbWF0Y2gsIGV0YWcpKSkgewotICAgICAgICAgICAgcmV0dXJuIEhUVFBfUFJFQ09ORElUSU9OX0ZBSUxFRDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogRWxzZSBpZiBhIHZhbGlkIElmLVVubW9kaWZpZWQtU2luY2UgcmVxdWVzdC1oZWFkZXIgZmllbGQgd2FzIGdpdmVuCi0gICAgICAgICAqIEFORCB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSB0aW1lCi0gICAgICAgICAqIHNwZWNpZmllZCBpbiB0aGlzIGZpZWxkLCB0aGVuIHRoZSBzZXJ2ZXIgTVVTVAotICAgICAgICAgKiAgICAgcmVzcG9uZCB3aXRoIGEgc3RhdHVzIG9mIDQxMiAoUHJlY29uZGl0aW9uIEZhaWxlZCkuCi0gICAgICAgICAqLwotICAgICAgICBpZl91bm1vZGlmaWVkID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJJZi1Vbm1vZGlmaWVkLVNpbmNlIik7Ci0gICAgICAgIGlmIChpZl91bm1vZGlmaWVkICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHRpbWVfdCBpdXMgPSBhcF9wYXJzZUhUVFBkYXRlKGlmX3VubW9kaWZpZWQpOwotCi0gICAgICAgICAgICBpZiAoKGl1cyAhPSBCQURfREFURSkgJiYgKG10aW1lID4gaXVzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBIVFRQX1BSRUNPTkRJVElPTl9GQUlMRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBJZiBhbiBJZi1Ob25lLU1hdGNoIHJlcXVlc3QtaGVhZGVyIGZpZWxkIHdhcyBnaXZlbgotICAgICAqIEFORCB0aGUgZmllbGQgdmFsdWUgaXMgIioiIChtZWFuaW5nIG1hdGNoIGFueXRoaW5nKQotICAgICAqICAgICBPUiBvdXIgRVRhZyBtYXRjaGVzIGFueSBvZiB0aGUgZW50aXR5IHRhZ3MgaW4gdGhhdCBmaWVsZCwgZmFpbC4KLSAgICAgKgotICAgICAqIElmIHRoZSByZXF1ZXN0IG1ldGhvZCB3YXMgR0VUIG9yIEhFQUQsIGZhaWx1cmUgbWVhbnMgdGhlIHNlcnZlcgotICAgICAqICAgIFNIT1VMRCByZXNwb25kIHdpdGggYSAzMDQgKE5vdCBNb2RpZmllZCkgcmVzcG9uc2UuCi0gICAgICogRm9yIGFsbCBvdGhlciByZXF1ZXN0IG1ldGhvZHMsIGZhaWx1cmUgbWVhbnMgdGhlIHNlcnZlciBNVVNUCi0gICAgICogICAgcmVzcG9uZCB3aXRoIGEgc3RhdHVzIG9mIDQxMiAoUHJlY29uZGl0aW9uIEZhaWxlZCkuCi0gICAgICoKLSAgICAgKiBHRVQgb3IgSEVBRCBhbGxvdyB3ZWFrIGV0YWcgY29tcGFyaXNvbiwgYWxsIG90aGVyIG1ldGhvZHMgcmVxdWlyZQotICAgICAqIHN0cm9uZyBjb21wYXJpc29uLiAgV2UgY2FuIG9ubHkgdXNlIHdlYWsgaWYgaXQncyBub3QgYSByYW5nZSByZXF1ZXN0LgotICAgICAqLwotICAgIGlmX25vbmVtYXRjaCA9IGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiSWYtTm9uZS1NYXRjaCIpOwotICAgIGlmIChpZl9ub25lbWF0Y2ggIT0gTlVMTCkgewotICAgICAgICBpZiAoci0+bWV0aG9kX251bWJlciA9PSBNX0dFVCkgewotICAgICAgICAgICAgaWYgKGlmX25vbmVtYXRjaFswXSA9PSAnKicpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEhUVFBfTk9UX01PRElGSUVEOwotICAgICAgICAgICAgaWYgKGV0YWcgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChhcF90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIlJhbmdlIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV0YWdbMF0gIT0gJ1cnICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBhcF9maW5kX2xpc3RfaXRlbShyLT5wb29sLCBpZl9ub25lbWF0Y2gsIGV0YWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSFRUUF9OT1RfTU9ESUZJRUQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3Ryc3RyKGlmX25vbmVtYXRjaCwgZXRhZykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEhUVFBfTk9UX01PRElGSUVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpZl9ub25lbWF0Y2hbMF0gPT0gJyonIHx8Ci0gICAgICAgICAgICAgICAgIChldGFnICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICAgIGFwX2ZpbmRfbGlzdF9pdGVtKHItPnBvb2wsIGlmX25vbmVtYXRjaCwgZXRhZykpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSFRUUF9QUkVDT05ESVRJT05fRkFJTEVEOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIEVsc2UgaWYgYSB2YWxpZCBJZi1Nb2RpZmllZC1TaW5jZSByZXF1ZXN0LWhlYWRlciBmaWVsZCB3YXMgZ2l2ZW4KLSAgICAgKiBBTkQgaXQgaXMgYSBHRVQgb3IgSEVBRCByZXF1ZXN0Ci0gICAgICogQU5EIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgaGFzIG5vdCBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSB0aW1lCi0gICAgICogc3BlY2lmaWVkIGluIHRoaXMgZmllbGQsIHRoZW4gdGhlIHNlcnZlciBNVVNUCi0gICAgICogICAgcmVzcG9uZCB3aXRoIGEgc3RhdHVzIG9mIDMwNCAoTm90IE1vZGlmaWVkKS4KLSAgICAgKiBBIGRhdGUgbGF0ZXIgdGhhbiB0aGUgc2VydmVyJ3MgY3VycmVudCByZXF1ZXN0IHRpbWUgaXMgaW52YWxpZC4KLSAgICAgKi8KLSAgICBlbHNlIGlmICgoci0+bWV0aG9kX251bWJlciA9PSBNX0dFVCkKLSAgICAgICAgICAgICAmJiAoKGlmX21vZGlmaWVkX3NpbmNlID0KLSAgICAgICAgICAgICAgICAgIGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiSWYtTW9kaWZpZWQtU2luY2UiKSkgIT0gTlVMTCkpIHsKLSAgICAgICAgdGltZV90IGltcyA9IGFwX3BhcnNlSFRUUGRhdGUoaWZfbW9kaWZpZWRfc2luY2UpOwotCi0gICAgICAgIGlmICgoaW1zID49IG10aW1lKSAmJiAoaW1zIDw9IHItPnJlcXVlc3RfdGltZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBIVFRQX05PVF9NT0RJRklFRDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8qCi0gKiBDb25zdHJ1Y3QgYW4gZW50aXR5IHRhZyAoRVRhZykgZnJvbSByZXNvdXJjZSBpbmZvcm1hdGlvbi4gIElmIGl0J3MgYSByZWFsCi0gKiBmaWxlLCBidWlsZCBpbiBzb21lIG9mIHRoZSBmaWxlIGNoYXJhY3RlcmlzdGljcy4gIElmIHRoZSBtb2RpZmljYXRpb24gdGltZQotICogaXMgbmV3ZXIgdGhhbiAocmVxdWVzdC10aW1lIG1pbnVzIDEgc2Vjb25kKSwgbWFyayB0aGUgRVRhZyBhcyB3ZWFrIC0gaXQKLSAqIGNvdWxkIGJlIG1vZGlmaWVkIGFnYWluIGluIGFzIHNob3J0IGFuIGludGVydmFsLiAgV2UgcmF0aW9uYWxpemUgdGhlCi0gKiBtb2RpZmljYXRpb24gdGltZSB3ZSdyZSBnaXZlbiB0byBrZWVwIGl0IGZyb20gYmVpbmcgaW4gdGhlIGZ1dHVyZS4KLSAqLwotQVBJX0VYUE9SVChjaGFyICopIGFwX21ha2VfZXRhZyhyZXF1ZXN0X3JlYyAqciwgaW50IGZvcmNlX3dlYWspCi17Ci0gICAgY2hhciAqZXRhZzsKLSAgICBjaGFyICp3ZWFrOwotCi0gICAgLyoKLSAgICAgKiBNYWtlIGFuIEVUYWcgaGVhZGVyIG91dCBvZiB2YXJpb3VzIHBpZWNlcyBvZiBpbmZvcm1hdGlvbi4gV2UgdXNlCi0gICAgICogdGhlIGxhc3QtbW9kaWZpZWQgZGF0ZSBhbmQsIGlmIHdlIGhhdmUgYSByZWFsIGZpbGUsIHRoZQotICAgICAqIGxlbmd0aCBhbmQgaW5vZGUgbnVtYmVyIC0gbm90ZSB0aGF0IHRoaXMgZG9lc24ndCBoYXZlIHRvIG1hdGNoCi0gICAgICogdGhlIGNvbnRlbnQtbGVuZ3RoIChpLmUuIGluY2x1ZGVzKSwgaXQganVzdCBoYXMgdG8gYmUgdW5pcXVlCi0gICAgICogZm9yIHRoZSBmaWxlLgotICAgICAqCi0gICAgICogSWYgdGhlIHJlcXVlc3Qgd2FzIG1hZGUgd2l0aGluIGEgc2Vjb25kIG9mIHRoZSBsYXN0LW1vZGlmaWVkIGRhdGUsCi0gICAgICogd2Ugc2VuZCBhIHdlYWsgdGFnIGluc3RlYWQgb2YgYSBzdHJvbmcgb25lLCBzaW5jZSBpdCBjb3VsZAotICAgICAqIGJlIG1vZGlmaWVkIGFnYWluIGxhdGVyIGluIHRoZSBzZWNvbmQsIGFuZCB0aGUgdmFsaWRhdGlvbgotICAgICAqIHdvdWxkIGJlIGluY29ycmVjdC4KLSAgICAgKi8KLSAgICAKLSAgICB3ZWFrID0gKChyLT5yZXF1ZXN0X3RpbWUgLSByLT5tdGltZSA+IDEpICYmICFmb3JjZV93ZWFrKSA/ICIiIDogIlcvIjsKLQotICAgIGlmIChyLT5maW5mby5zdF9tb2RlICE9IDApIHsKLSAgICAgICAgZXRhZyA9IGFwX3BzcHJpbnRmKHItPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICIlc1wiJWx4LSVseC0lbHhcIiIsIHdlYWssCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSByLT5maW5mby5zdF9pbm8sCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSByLT5maW5mby5zdF9zaXplLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgci0+bXRpbWUpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgZXRhZyA9IGFwX3BzcHJpbnRmKHItPnBvb2wsICIlc1wiJWx4XCIiLCB3ZWFrLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgci0+bXRpbWUpOwotICAgIH0KLQotICAgIHJldHVybiBldGFnOwotfQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX3NldF9ldGFnKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNoYXIgKmV0YWc7Ci0gICAgY2hhciAqdmFyaWFudF9ldGFnLCAqdmx2OwotICAgIGludCB2bHZfd2VhazsKLQotICAgIGlmICghci0+dmxpc3RfdmFsaWRhdG9yKSB7Ci0gICAgICAgIGV0YWcgPSBhcF9tYWtlX2V0YWcociwgMCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAvKiBJZiB3ZSBoYXZlIGEgdmFyaWFudCBsaXN0IHZhbGlkYXRvciAodmx2KSBkdWUgdG8gdGhlCi0gICAgICAgICAqIHJlc3BvbnNlIGJlaW5nIG5lZ290aWF0ZWQsIHRoZW4gd2UgY3JlYXRlIGEgc3RydWN0dXJlZAotICAgICAgICAgKiBlbnRpdHkgdGFnIHdoaWNoIG1lcmdlcyB0aGUgdmFyaWFudCBldGFnIHdpdGggdGhlIHZhcmlhbnQKLSAgICAgICAgICogbGlzdCB2YWxpZGF0b3IgKHZsdikuICBUaGlzIG1lcmdpbmcgbWFrZXMgcmV2YWxpZGF0aW9uCi0gICAgICAgICAqIHNvbWV3aGF0IHNhZmVyLCBlbnN1cmVzIHRoYXQgY2FjaGVzIHdoaWNoIGNhbiBkZWFsIHdpdGgKLSAgICAgICAgICogVmFyeSB3aWxsIChldmVudHVhbGx5KSBiZSB1cGRhdGVkIGlmIHRoZSBzZXQgb2YgdmFyaWFudHMgaXMKLSAgICAgICAgICogY2hhbmdlZCwgYW5kIGlzIGFsc28gYSBwcm90b2NvbCByZXF1aXJlbWVudCBmb3IgdHJhbnNwYXJlbnQKLSAgICAgICAgICogY29udGVudCBuZWdvdGlhdGlvbi4KLSAgICAgICAgICovCi0KLSAgICAgICAgLyogaWYgdGhlIHZhcmlhbnQgbGlzdCB2YWxpZGF0b3IgaXMgd2Vhaywgd2UgbWFrZSB0aGUgd2hvbGUKLSAgICAgICAgICogc3RydWN0dXJlZCBldGFnIHdlYWsuICBJZiB3ZSB3b3VsZCBub3QsIHRoZW4gY2xpZW50cyBjb3VsZAotICAgICAgICAgKiBoYXZlIHByb2JsZW1zIG1lcmdpbmcgcmFuZ2UgcmVzcG9uc2VzIGlmIHdlIGhhdmUgZGlmZmVyZW50Ci0gICAgICAgICAqIHZhcmlhbnRzIHdpdGggdGhlIHNhbWUgbm9uLWdsb2JhbGx5LXVuaXF1ZSBzdHJvbmcgZXRhZy4KLSAgICAgICAgICovCi0KLSAgICAgICAgdmx2ID0gci0+dmxpc3RfdmFsaWRhdG9yOwotICAgICAgICB2bHZfd2VhayA9ICh2bHZbMF0gPT0gJ1cnKTsKLSAgICAgICAgICAgICAgIAotICAgICAgICB2YXJpYW50X2V0YWcgPSBhcF9tYWtlX2V0YWcociwgdmx2X3dlYWspOwotCi0gICAgICAgIC8qIG1lcmdlIHZhcmlhbnRfZXRhZyBhbmQgdmx2IGludG8gYSBzdHJ1Y3R1cmVkIGV0YWcgKi8KLQotICAgICAgICB2YXJpYW50X2V0YWdbc3RybGVuKHZhcmlhbnRfZXRhZykgLSAxXSA9ICdcMCc7Ci0gICAgICAgIGlmICh2bHZfd2VhaykKLSAgICAgICAgICAgIHZsdiArPSAzOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2bHYrKzsKLSAgICAgICAgZXRhZyA9IGFwX3BzdHJjYXQoci0+cG9vbCwgdmFyaWFudF9ldGFnLCAiOyIsIHZsdiwgTlVMTCk7Ci0gICAgfQotCi0gICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkVUYWciLCBldGFnKTsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgTGFzdC1Nb2RpZmllZCBvdXRwdXQgaGVhZGVyIGZpZWxkIHRvIHRoZSB2YWx1ZQotICogb2YgdGhlIG10aW1lIGZpZWxkIGluIHRoZSByZXF1ZXN0IHN0cnVjdHVyZSAtIHJhdGlvbmFsaXplZCB0byBrZWVwIGl0IGZyb20KLSAqIGJlaW5nIGluIHRoZSBmdXR1cmUuCi0gKi8KLUFQSV9FWFBPUlQodm9pZCkgYXBfc2V0X2xhc3RfbW9kaWZpZWQocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgdGltZV90IG1vZF90aW1lID0gYXBfcmF0aW9uYWxpemVfbXRpbWUociwgci0+bXRpbWUpOwotCi0gICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkxhc3QtTW9kaWZpZWQiLAotICAgICAgICAgICAgICBhcF9nbV90aW1lc3RyXzgyMihyLT5wb29sLCBtb2RfdGltZSkpOwotfQotCi0vKiBHZXQgdGhlIG1ldGhvZCBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBzdHJpbmcsIGFzc3VtZWQgdG8KLSAqIGNvbnRhaW4gYW4gSFRUUCBtZXRob2QuICBSZXR1cm5zIE1fSU5WQUxJRCBpZiBub3QgcmVjb2duaXplZC4KLSAqCi0gKiBUaGlzIGlzIHRoZSBmaXJzdCBzdGVwIHRvd2FyZCBwbGFjaW5nIG1ldGhvZCBuYW1lcyBpbiBhIGNvbmZpZ3VyYWJsZQotICogbGlzdC4gIEhvcGVmdWxseSBpdCAoYW5kIG90aGVyIHJvdXRpbmVzKSBjYW4gZXZlbnR1YWxseSBiZSBtb3ZlZCB0bwotICogc29tZXRoaW5nIGxpa2UgYSBtb2RfaHR0cF9tZXRob2RzLmMsIGNvbXBsZXRlIHdpdGggY29uZmlnIHN0dWZmLgotICovCi1BUElfRVhQT1JUKGludCkgYXBfbWV0aG9kX251bWJlcl9vZihjb25zdCBjaGFyICptZXRob2QpCi17Ci0gICAgc3dpdGNoICgqbWV0aG9kKSB7Ci0gICAgICAgIGNhc2UgJ0gnOgotICAgICAgICAgICBpZiAoc3RyY21wKG1ldGhvZCwgIkhFQUQiKSA9PSAwKQotICAgICAgICAgICAgICAgcmV0dXJuIE1fR0VUOyAgIC8qIHNlZSBoZWFkZXJfb25seSBpbiByZXF1ZXN0X3JlYyAqLwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnRyc6Ci0gICAgICAgICAgIGlmIChzdHJjbXAobWV0aG9kLCAiR0VUIikgPT0gMCkKLSAgICAgICAgICAgICAgIHJldHVybiBNX0dFVDsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1AnOgotICAgICAgICAgICBpZiAoc3RyY21wKG1ldGhvZCwgIlBPU1QiKSA9PSAwKQotICAgICAgICAgICAgICAgcmV0dXJuIE1fUE9TVDsKLSAgICAgICAgICAgaWYgKHN0cmNtcChtZXRob2QsICJQVVQiKSA9PSAwKQotICAgICAgICAgICAgICAgcmV0dXJuIE1fUFVUOwotICAgICAgICAgICBpZiAoc3RyY21wKG1ldGhvZCwgIlBBVENIIikgPT0gMCkKLSAgICAgICAgICAgICAgIHJldHVybiBNX1BBVENIOwotICAgICAgICAgICBpZiAoc3RyY21wKG1ldGhvZCwgIlBST1BGSU5EIikgPT0gMCkKLSAgICAgICAgICAgICAgIHJldHVybiBNX1BST1BGSU5EOwotICAgICAgICAgICBpZiAoc3RyY21wKG1ldGhvZCwgIlBST1BQQVRDSCIpID09IDApCi0gICAgICAgICAgICAgICByZXR1cm4gTV9QUk9QUEFUQ0g7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdEJzoKLSAgICAgICAgICAgaWYgKHN0cmNtcChtZXRob2QsICJERUxFVEUiKSA9PSAwKQotICAgICAgICAgICAgICAgcmV0dXJuIE1fREVMRVRFOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnQyc6Ci0gICAgICAgICAgIGlmIChzdHJjbXAobWV0aG9kLCAiQ09OTkVDVCIpID09IDApCi0gICAgICAgICAgICAgICByZXR1cm4gTV9DT05ORUNUOwotICAgICAgICAgICBpZiAoc3RyY21wKG1ldGhvZCwgIkNPUFkiKSA9PSAwKQotICAgICAgICAgICAgICAgcmV0dXJuIE1fQ09QWTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ00nOgotICAgICAgICAgICBpZiAoc3RyY21wKG1ldGhvZCwgIk1LQ09MIikgPT0gMCkKLSAgICAgICAgICAgICAgIHJldHVybiBNX01LQ09MOwotICAgICAgICAgICBpZiAoc3RyY21wKG1ldGhvZCwgIk1PVkUiKSA9PSAwKQotICAgICAgICAgICAgICAgcmV0dXJuIE1fTU9WRTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ08nOgotICAgICAgICAgICBpZiAoc3RyY21wKG1ldGhvZCwgIk9QVElPTlMiKSA9PSAwKQotICAgICAgICAgICAgICAgcmV0dXJuIE1fT1BUSU9OUzsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1QnOgotICAgICAgICAgICBpZiAoc3RyY21wKG1ldGhvZCwgIlRSQUNFIikgPT0gMCkKLSAgICAgICAgICAgICAgIHJldHVybiBNX1RSQUNFOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnTCc6Ci0gICAgICAgICAgIGlmIChzdHJjbXAobWV0aG9kLCAiTE9DSyIpID09IDApCi0gICAgICAgICAgICAgICByZXR1cm4gTV9MT0NLOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnVSc6Ci0gICAgICAgICAgIGlmIChzdHJjbXAobWV0aG9kLCAiVU5MT0NLIikgPT0gMCkKLSAgICAgICAgICAgICAgIHJldHVybiBNX1VOTE9DSzsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBNX0lOVkFMSUQ7Ci19Ci0KLS8qIEdldCBhIGxpbmUgb2YgcHJvdG9jb2wgaW5wdXQsIGluY2x1ZGluZyBhbnkgY29udGludWF0aW9uIGxpbmVzCi0gKiBjYXVzZWQgYnkgTUlNRSBmb2xkaW5nIChvciBicm9rZW4gY2xpZW50cykgaWYgZm9sZCAhPSAwLCBhbmQgcGxhY2UgaXQKLSAqIGluIHRoZSBidWZmZXIgcywgb2Ygc2l6ZSBuIGJ5dGVzLCB3aXRob3V0IHRoZSBlbmRpbmcgbmV3bGluZS4KLSAqCi0gKiBSZXR1cm5zIC0xIG9uIGVycm9yLCBvciB0aGUgbGVuZ3RoIG9mIHMuCi0gKgotICogTm90ZTogQmVjYXVzZSBiZ2V0cyB1c2VzIDEgY2hhciBmb3IgbmV3bGluZSBhbmQgMSBjaGFyIGZvciBOVUwsCi0gKiAgICAgICB0aGUgbW9zdCB3ZSBjYW4gZ2V0IGlzIChuIC0gMikgYWN0dWFsIGNoYXJhY3RlcnMgaWYgaXQKLSAqICAgICAgIHdhcyBlbmRlZCBieSBhIG5ld2xpbmUsIG9yIChuIC0gMSkgY2hhcmFjdGVycyBpZiB0aGUgbGluZQotICogICAgICAgbGVuZ3RoIGV4Y2VlZGVkIChuIC0gMSkuICBTbywgaWYgdGhlIHJlc3VsdCA9PSAobiAtIDEpLAotICogICAgICAgdGhlbiB0aGUgYWN0dWFsIGlucHV0IGxpbmUgZXhjZWVkZWQgdGhlIGJ1ZmZlciBsZW5ndGgsCi0gKiAgICAgICBhbmQgaXQgd291bGQgYmUgYSBnb29kIGlkZWEgZm9yIHRoZSBjYWxsZXIgdG8gcHVrZSA0MDAgb3IgNDE0LgotICovCi1zdGF0aWMgaW50IGdldGxpbmUoY2hhciAqcywgaW50IG4sIEJVRkYgKmluLCBpbnQgZm9sZCkKLXsKLSAgICBjaGFyICpwb3MsIG5leHQ7Ci0gICAgaW50IHJldHZhbDsKLSAgICBpbnQgdG90YWwgPSAwOwotCi0gICAgcG9zID0gczsKLQotICAgIGRvIHsKLSAgICAgICAgcmV0dmFsID0gYXBfYmdldHMocG9zLCBuLCBpbik7ICAgICAvKiByZXR2YWwgPT0gLTEgaWYgZXJyb3IsIDAgaWYgRU9GICovCi0KLSAgICAgICAgaWYgKHJldHZhbCA8PSAwKQotICAgICAgICAgICAgcmV0dXJuICgocmV0dmFsIDwgMCkgJiYgKHRvdGFsID09IDApKSA/IC0xIDogdG90YWw7Ci0KLSAgICAgICAgLyogcmV0dmFsIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLCBub3QgaW5jbHVkaW5nIE5VTCAgICAgICovCi0KLSAgICAgICAgbiAtPSByZXR2YWw7ICAgICAgICAgICAgLyogS2VlcCB0cmFjayBvZiBob3cgbXVjaCBvZiBzIGlzIGZ1bGwgICAgICovCi0gICAgICAgIHBvcyArPSAocmV0dmFsIC0gMSk7ICAgIC8qIGFuZCB3aGVyZSBzIGVuZHMgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICB0b3RhbCArPSByZXR2YWw7ICAgICAgICAvKiBhbmQgaG93IGxvbmcgcyBoYXMgYmVjb21lICAgICAgICAgICAgICAgKi8KLQotICAgICAgICBpZiAoKnBvcyA9PSAnXG4nKSB7ICAgICAvKiBEaWQgd2UgZ2V0IGEgZnVsbCBsaW5lIG9mIGlucHV0PyAgICAgICAgKi8KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBUcmltIGFueSBleHRyYSB0cmFpbGluZyBzcGFjZXMgb3IgdGFicyBleGNlcHQgZm9yIHRoZSBmaXJzdAotICAgICAgICAgICAgICogc3BhY2Ugb3IgdGFiIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBibGFuayBzdHJpbmcuICBUaGlzIG1ha2VzCi0gICAgICAgICAgICAgKiBpdCBtdWNoIGVhc2llciB0byBjaGVjayBmaWVsZCB2YWx1ZXMgZm9yIGV4YWN0IG1hdGNoZXMsIGFuZAotICAgICAgICAgICAgICogc2F2ZXMgbWVtb3J5IGFzIHdlbGwuICBUZXJtaW5hdGUgc3RyaW5nIGF0IGVuZCBvZiBsaW5lLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICB3aGlsZSAocG9zID4gKHMgKyAxKSAmJiAoKihwb3MgLSAxKSA9PSAnICcgfHwgKihwb3MgLSAxKSA9PSAnXHQnKSkgewotICAgICAgICAgICAgICAgIC0tcG9zOyAgICAgICAgICAvKiB0cmltIGV4dHJhIHRyYWlsaW5nIHNwYWNlcyBvciB0YWJzICAgICAgKi8KLSAgICAgICAgICAgICAgICAtLXRvdGFsOyAgICAgICAgLyogYnV0IG5vdCBvbmUgYXQgdGhlIGJlZ2lubmluZyBvZiBsaW5lICAgICovCi0gICAgICAgICAgICAgICAgKytuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKnBvcyA9ICdcMCc7Ci0gICAgICAgICAgICAtLXRvdGFsOwotICAgICAgICAgICAgKytuOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiB0b3RhbDsgICAgICAgLyogaWYgbm90LCBpbnB1dCBsaW5lIGV4Y2VlZGVkIGJ1ZmZlciBzaXplICovCi0KLSAgICAgICAgLyogQ29udGludWUgYXBwZW5kaW5nIGlmIGxpbmUgZm9sZGluZyBpcyBkZXNpcmVkIGFuZAotICAgICAgICAgKiB0aGUgbGFzdCBsaW5lIHdhcyBub3QgZW1wdHkgYW5kIHdlIGhhdmUgcm9vbSBpbiB0aGUgYnVmZmVyIGFuZAotICAgICAgICAgKiB0aGUgbmV4dCBsaW5lIGJlZ2lucyB3aXRoIGEgY29udGludWF0aW9uIGNoYXJhY3Rlci4KLSAgICAgICAgICovCi0gICAgfSB3aGlsZSAoZm9sZCAmJiAocmV0dmFsICE9IDEpICYmIChuID4gMSkKLSAgICAgICAgICAgICAgICAgICYmIChhcF9ibG9va2MoJm5leHQsIGluKSA9PSAxKQotICAgICAgICAgICAgICAgICAgJiYgKChuZXh0ID09ICcgJykgfHwgKG5leHQgPT0gJ1x0JykpKTsKLQotICAgIHJldHVybiB0b3RhbDsKLX0KLQotLyogcGFyc2VfdXJpOiBicmVhayBhcGFydCB0aGUgdXJpCi0gKiBTaWRlIEVmZmVjdHM6Ci0gKiAtIHNldHMgci0+YXJncyB0byByZXN0IGFmdGVyICc/JyAob3IgTlVMTCBpZiBubyAnPycpCi0gKiAtIHNldHMgci0+dXJpIHRvIHJlcXVlc3QgdXJpICh3aXRob3V0IHItPmFyZ3MgcGFydCkKLSAqIC0gc2V0cyByLT5ob3N0bmFtZSAoaWYgbm90IHNldCBhbHJlYWR5KSBmcm9tIHJlcXVlc3QgKHNjaGVtZTovL2hvc3Q6cG9ydCkKLSAqLwotQ09SRV9FWFBPUlQodm9pZCkgYXBfcGFyc2VfdXJpKHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICp1cmkpCi17Ci0gICAgaW50IHN0YXR1cyA9IEhUVFBfT0s7Ci0KLSAgICByLT51bnBhcnNlZF91cmkgPSBhcF9wc3RyZHVwKHItPnBvb2wsIHVyaSk7Ci0KLSAgICBpZiAoci0+bWV0aG9kX251bWJlciA9PSBNX0NPTk5FQ1QpIHsKLQlzdGF0dXMgPSBhcF9wYXJzZV9ob3N0aW5mb19jb21wb25lbnRzKHItPnBvb2wsIHVyaSwgJnItPnBhcnNlZF91cmkpOwotICAgIH0gZWxzZSB7Ci0JLyogU2ltcGxlIHN5bnRheCBFcnJvcnMgaW4gVVJMcyBhcmUgdHJhcHBlZCBieSBwYXJzZV91cmlfY29tcG9uZW50cygpLiAqLwotCXN0YXR1cyA9IGFwX3BhcnNlX3VyaV9jb21wb25lbnRzKHItPnBvb2wsIHVyaSwgJnItPnBhcnNlZF91cmkpOwotICAgIH0KLQotICAgIGlmIChhcF9pc19IVFRQX1NVQ0NFU1Moc3RhdHVzKSkgewotCS8qIGlmIGl0IGhhcyBhIHNjaGVtZSB3ZSBtYXkgbmVlZCB0byBkbyBhYnNvbHV0ZVVSSSB2aG9zdCBzdHVmZiAqLwotCWlmIChyLT5wYXJzZWRfdXJpLnNjaGVtZQotCSAgICAmJiAhc3RyY2FzZWNtcChyLT5wYXJzZWRfdXJpLnNjaGVtZSwgYXBfaHR0cF9tZXRob2QocikpKSB7Ci0JICAgIHItPmhvc3RuYW1lID0gci0+cGFyc2VkX3VyaS5ob3N0bmFtZTsKLQl9IGVsc2UgaWYgKHItPm1ldGhvZF9udW1iZXIgPT0gTV9DT05ORUNUKSB7Ci0JICAgIHItPmhvc3RuYW1lID0gci0+cGFyc2VkX3VyaS5ob3N0bmFtZTsKLQl9Ci0Jci0+YXJncyA9IHItPnBhcnNlZF91cmkucXVlcnk7Ci0Jci0+dXJpID0gci0+cGFyc2VkX3VyaS5wYXRoID8gci0+cGFyc2VkX3VyaS5wYXRoCi0JCQkJICAgIDogYXBfcHN0cmR1cChyLT5wb29sLCAiLyIpOwotI2lmIGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTjMyKQotCS8qIEhhbmRsZSBwYXRoIHRyYW5zbGF0aW9ucyBmb3IgT1MvMiBhbmQgcGx1ZyBzZWN1cml0eSBob2xlLgotCSAqIFRoaXMgd2lsbCBwcmV2ZW50ICJodHRwOi8vd3d3LndoZXJldmVyLmNvbS8uLlwuLlwvIiBmcm9tCi0JICogcmV0dXJuaW5nIGEgZGlyZWN0b3J5IGZvciB0aGUgcm9vdCBkcml2ZS4KLQkgKi8KLQl7Ci0JICAgIGNoYXIgKng7Ci0KLQkgICAgZm9yICh4ID0gci0+dXJpOyAoeCA9IHN0cmNocih4LCAnXFwnKSkgIT0gTlVMTDsgKQotCQkqeCA9ICcvJzsKLQl9Ci0jZW5kaWYgIC8qIE9TMiB8fCBXSU4zMiAqLwotICAgIH0KLSAgICBlbHNlIHsKLQlyLT5hcmdzID0gTlVMTDsKLQlyLT5ob3N0bmFtZSA9IE5VTEw7Ci0Jci0+c3RhdHVzID0gc3RhdHVzOyAgICAgICAgICAgICAvKiBzZXQgZXJyb3Igc3RhdHVzICovCi0Jci0+dXJpID0gYXBfcHN0cmR1cChyLT5wb29sLCB1cmkpOwotICAgIH0KLX0KLQotc3RhdGljIGludCByZWFkX3JlcXVlc3RfbGluZShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjaGFyIGxbREVGQVVMVF9MSU1JVF9SRVFVRVNUX0xJTkUgKyAyXTsgLyogZ2V0bGluZSdzIHR3byBleHRyYSBmb3IgXG5cMCAqLwotICAgIGNvbnN0IGNoYXIgKmxsID0gbDsKLSAgICBjb25zdCBjaGFyICp1cmk7Ci0gICAgY29ubl9yZWMgKmNvbm4gPSByLT5jb25uZWN0aW9uOwotICAgIGludCBtYWpvciA9IDEsIG1pbm9yID0gMDsgICAvKiBBc3N1bWUgSFRUUC8xLjAgaWYgbm9uLSJIVFRQIiBwcm90b2NvbCAqLwotICAgIGludCBsZW47Ci0KLSAgICAvKiBSZWFkIHBhc3QgZW1wdHkgbGluZXMgdW50aWwgd2UgZ2V0IGEgcmVhbCByZXF1ZXN0IGxpbmUsCi0gICAgICogYSByZWFkIGVycm9yLCB0aGUgY29ubmVjdGlvbiBjbG9zZXMgKEVPRiksIG9yIHdlIHRpbWVvdXQuCi0gICAgICoKLSAgICAgKiBXZSBza2lwIGVtcHR5IGxpbmVzIGJlY2F1c2UgYnJvd3NlcnMgaGF2ZSB0byB0YWNrIGEgQ1JMRiBvbiB0byB0aGUgZW5kCi0gICAgICogb2YgUE9TVHMgdG8gc3VwcG9ydCBvbGQgQ0VSTiB3ZWJzZXJ2ZXJzLiAgQnV0IG5vdGUgdGhhdCB3ZSBtYXkgbm90Ci0gICAgICogaGF2ZSBmbHVzaGVkIGFueSBwcmV2aW91cyByZXNwb25zZSBjb21wbGV0ZWx5IHRvIHRoZSBjbGllbnQgeWV0LgotICAgICAqIFdlIGRlbGF5IHRoZSBmbHVzaCBhcyBsb25nIGFzIHBvc3NpYmxlIHNvIHRoYXQgd2UgY2FuIGltcHJvdmUKLSAgICAgKiBwZXJmb3JtYW5jZSBmb3IgY2xpZW50cyB0aGF0IGFyZSBwaXBlbGluaW5nIHJlcXVlc3RzLiAgSWYgYSByZXF1ZXN0Ci0gICAgICogaXMgcGlwZWxpbmVkIHRoZW4gd2Ugd29uJ3QgYmxvY2sgZHVyaW5nIHRoZSAoaW1wbGljaXQpIHJlYWQoKSBiZWxvdy4KLSAgICAgKiBJZiB0aGUgcmVxdWVzdHMgYXJlbid0IHBpcGVsaW5lZCwgdGhlbiB0aGUgY2xpZW50IGlzIHN0aWxsIHdhaXRpbmcKLSAgICAgKiBmb3IgdGhlIGZpbmFsIGJ1ZmZlciBmbHVzaCBmcm9tIHVzLCBhbmQgd2Ugd2lsbCBibG9jayBpbiB0aGUgaW1wbGljaXQKLSAgICAgKiByZWFkKCkuICBCX1NBRkVSRUFEIGVuc3VyZXMgdGhhdCB0aGUgQlVGRiBsYXllciBmbHVzaGVzIGlmIGl0IHdpbGwKLSAgICAgKiBoYXZlIHRvIGJsb2NrIGR1cmluZyBhIHJlYWQuCi0gICAgICovCi0gICAgYXBfYnNldGZsYWcoY29ubi0+Y2xpZW50LCBCX1NBRkVSRUFELCAxKTsKLSAgICB3aGlsZSAoKGxlbiA9IGdldGxpbmUobCwgc2l6ZW9mKGwpLCBjb25uLT5jbGllbnQsIDApKSA8PSAwKSB7Ci0gICAgICAgIGlmICgobGVuIDwgMCkgfHwgYXBfYmdldGZsYWcoY29ubi0+Y2xpZW50LCBCX0VPRikpIHsKLSAgICAgICAgICAgIGFwX2JzZXRmbGFnKGNvbm4tPmNsaWVudCwgQl9TQUZFUkVBRCwgMCk7Ci0JICAgIC8qIHRoaXMgaXMgYSBoYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHJlcXVlc3QgdGltZSBpcyBzZXQsCi0JICAgICAqIGl0J3Mgbm90IHBlcmZlY3QsIGJ1dCBpdCdzIGJldHRlciB0aGFuIG5vdGhpbmcgCi0JICAgICAqLwotCSAgICByLT5yZXF1ZXN0X3RpbWUgPSB0aW1lKDApOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogd2UndmUgcHJvYmFibHkgZ290IHNvbWV0aGluZyB0byBkbywgaWdub3JlIGdyYWNlZnVsIHJlc3RhcnQgcmVxdWVzdHMgKi8KLSNpZmRlZiBTSUdVU1IxCi0gICAgc2lnbmFsKFNJR1VTUjEsIFNJR19JR04pOwotI2VuZGlmCi0KLSAgICBhcF9ic2V0ZmxhZyhjb25uLT5jbGllbnQsIEJfU0FGRVJFQUQsIDApOwotCi0gICAgci0+cmVxdWVzdF90aW1lID0gdGltZShOVUxMKTsKLSAgICByLT50aGVfcmVxdWVzdCA9IGFwX3BzdHJkdXAoci0+cG9vbCwgbCk7Ci0gICAgci0+bWV0aG9kID0gYXBfZ2V0d29yZF93aGl0ZShyLT5wb29sLCAmbGwpOwotICAgIHVyaSA9IGFwX2dldHdvcmRfd2hpdGUoci0+cG9vbCwgJmxsKTsKLQotICAgIC8qIFByb3ZpZGUgcXVpY2sgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcXVlc3QgbWV0aG9kIGFzIHNvb24gYXMga25vd24gKi8KLQotICAgIHItPm1ldGhvZF9udW1iZXIgPSBhcF9tZXRob2RfbnVtYmVyX29mKHItPm1ldGhvZCk7Ci0gICAgaWYgKHItPm1ldGhvZF9udW1iZXIgPT0gTV9HRVQgJiYgci0+bWV0aG9kWzBdID09ICdIJykgewotICAgICAgICByLT5oZWFkZXJfb25seSA9IDE7Ci0gICAgfQotCi0gICAgYXBfcGFyc2VfdXJpKHIsIHVyaSk7Ci0KLSAgICAvKiBnZXRsaW5lIHJldHVybnMgKHNpemUgb2YgbWF4IGJ1ZmZlciAtIDEpIGlmIGl0IGZpbGxzIHVwIHRoZQotICAgICAqIGJ1ZmZlciBiZWZvcmUgZmluZGluZyB0aGUgZW5kLW9mLWxpbmUuICBUaGlzIGlzIG9ubHkgZ29pbmcgdG8KLSAgICAgKiBoYXBwZW4gaWYgaXQgZXhjZWVkcyB0aGUgY29uZmlndXJlZCBsaW1pdCBmb3IgYSByZXF1ZXN0LWxpbmUuCi0gICAgICovCi0gICAgaWYgKGxlbiA+IHItPnNlcnZlci0+bGltaXRfcmVxX2xpbmUpIHsKLSAgICAgICAgci0+c3RhdHVzICAgID0gSFRUUF9SRVFVRVNUX1VSSV9UT09fTEFSR0U7Ci0gICAgICAgIHItPnByb3RvX251bSA9IEhUVFBfVkVSU0lPTigxLDApOwotICAgICAgICByLT5wcm90b2NvbCAgPSBhcF9wc3RyZHVwKHItPnBvb2wsICJIVFRQLzEuMCIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByLT5hc3NiYWNrd2FyZHMgPSAobGxbMF0gPT0gJ1wwJyk7Ci0gICAgci0+cHJvdG9jb2wgPSBhcF9wc3RyZHVwKHItPnBvb2wsIGxsWzBdID8gbGwgOiAiSFRUUC8wLjkiKTsKLQotICAgIGlmICgyID09IHNzY2FuZihyLT5wcm90b2NvbCwgIkhUVFAvJXUuJXUiLCAmbWFqb3IsICZtaW5vcikKLSAgICAgICYmIG1pbm9yIDwgSFRUUF9WRVJTSU9OKDEsMCkpCS8qIGRvbid0IGFsbG93IEhUVFAvMC4xMDAwICovCi0Jci0+cHJvdG9fbnVtID0gSFRUUF9WRVJTSU9OKG1ham9yLCBtaW5vcik7Ci0gICAgZWxzZQotCXItPnByb3RvX251bSA9IEhUVFBfVkVSU0lPTigxLDApOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGdldF9taW1lX2hlYWRlcnMocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY2hhciBmaWVsZFtERUZBVUxUX0xJTUlUX1JFUVVFU1RfRklFTERTSVpFICsgMl07IC8qIGdldGxpbmUncyB0d28gZXh0cmEgKi8KLSAgICBjb25uX3JlYyAqYyA9IHItPmNvbm5lY3Rpb247Ci0gICAgY2hhciAqdmFsdWU7Ci0gICAgY2hhciAqY29weTsKLSAgICBpbnQgbGVuOwotICAgIHVuc2lnbmVkIGludCBmaWVsZHNfcmVhZCA9IDA7Ci0gICAgdGFibGUgKnRtcF9oZWFkZXJzOwotCi0gICAgLyogV2UnbGwgdXNlIGFwX292ZXJsYXBfdGFibGVzIGxhdGVyIHRvIG1lcmdlIHRoZXNlIGludG8gci0+aGVhZGVyc19pbi4gKi8KLSAgICB0bXBfaGVhZGVycyA9IGFwX21ha2VfdGFibGUoci0+cG9vbCwgNTApOwotCi0gICAgLyoKLSAgICAgKiBSZWFkIGhlYWRlciBsaW5lcyB1bnRpbCB3ZSBnZXQgdGhlIGVtcHR5IHNlcGFyYXRvciBsaW5lLCBhIHJlYWQgZXJyb3IsCi0gICAgICogdGhlIGNvbm5lY3Rpb24gY2xvc2VzIChFT0YpLCByZWFjaCB0aGUgc2VydmVyIGxpbWl0LCBvciB3ZSB0aW1lb3V0LgotICAgICAqLwotICAgIHdoaWxlICgobGVuID0gZ2V0bGluZShmaWVsZCwgc2l6ZW9mKGZpZWxkKSwgYy0+Y2xpZW50LCAxKSkgPiAwKSB7Ci0KLSAgICAgICAgaWYgKHItPnNlcnZlci0+bGltaXRfcmVxX2ZpZWxkcyAmJgotICAgICAgICAgICAgKCsrZmllbGRzX3JlYWQgPiByLT5zZXJ2ZXItPmxpbWl0X3JlcV9maWVsZHMpKSB7Ci0gICAgICAgICAgICByLT5zdGF0dXMgPSBIVFRQX0JBRF9SRVFVRVNUOwotICAgICAgICAgICAgYXBfdGFibGVfc2V0bihyLT5ub3RlcywgImVycm9yLW5vdGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBudW1iZXIgb2YgcmVxdWVzdCBoZWFkZXIgZmllbGRzIGV4Y2VlZHMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBzZXJ2ZXIncyBsaW1pdC48UD5cbiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIC8qIGdldGxpbmUgcmV0dXJucyAoc2l6ZSBvZiBtYXggYnVmZmVyIC0gMSkgaWYgaXQgZmlsbHMgdXAgdGhlCi0gICAgICAgICAqIGJ1ZmZlciBiZWZvcmUgZmluZGluZyB0aGUgZW5kLW9mLWxpbmUuICBUaGlzIGlzIG9ubHkgZ29pbmcgdG8KLSAgICAgICAgICogaGFwcGVuIGlmIGl0IGV4Y2VlZHMgdGhlIGNvbmZpZ3VyZWQgbGltaXQgZm9yIGEgZmllbGQgc2l6ZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChsZW4gPiByLT5zZXJ2ZXItPmxpbWl0X3JlcV9maWVsZHNpemUpIHsKLSAgICAgICAgICAgIHItPnN0YXR1cyA9IEhUVFBfQkFEX1JFUVVFU1Q7Ci0gICAgICAgICAgICBhcF90YWJsZV9zZXRuKHItPm5vdGVzLCAiZXJyb3Itbm90ZXMiLCBhcF9wc3RyY2F0KHItPnBvb2wsCi0gICAgICAgICAgICAgICAgIlNpemUgb2YgYSByZXF1ZXN0IGhlYWRlciBmaWVsZCBleGNlZWRzIHNlcnZlciBsaW1pdC48UD5cbiIKLSAgICAgICAgICAgICAgICAiPFBSRT5cbiIsIGZpZWxkLCAiPC9QUkU+XG4iLCBOVUxMKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29weSA9IGFwX3BhbGxvYyhyLT5wb29sLCBsZW4gKyAxKTsKLSAgICAgICAgbWVtY3B5KGNvcHksIGZpZWxkLCBsZW4gKyAxKTsKLQotICAgICAgICBpZiAoISh2YWx1ZSA9IHN0cmNocihjb3B5LCAnOicpKSkgeyAgICAgLyogRmluZCB0aGUgY29sb24gc2VwYXJhdG9yICovCi0gICAgICAgICAgICByLT5zdGF0dXMgPSBIVFRQX0JBRF9SRVFVRVNUOyAgICAgICAvKiBvciBhYm9ydCB0aGUgYmFkIHJlcXVlc3QgKi8KLSAgICAgICAgICAgIGFwX3RhYmxlX3NldG4oci0+bm90ZXMsICJlcnJvci1ub3RlcyIsIGFwX3BzdHJjYXQoci0+cG9vbCwKLSAgICAgICAgICAgICAgICAiUmVxdWVzdCBoZWFkZXIgZmllbGQgaXMgbWlzc2luZyBjb2xvbiBzZXBhcmF0b3IuPFA+XG4iCi0gICAgICAgICAgICAgICAgIjxQUkU+XG4iLCBjb3B5LCAiPC9QUkU+XG4iLCBOVUxMKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAqdmFsdWUgPSAnXDAnOwotICAgICAgICArK3ZhbHVlOwotICAgICAgICB3aGlsZSAoKnZhbHVlID09ICcgJyB8fCAqdmFsdWUgPT0gJ1x0JykKLSAgICAgICAgICAgICsrdmFsdWU7ICAgICAgICAgICAgLyogU2tpcCB0byBzdGFydCBvZiB2YWx1ZSAgICovCi0KLQlhcF90YWJsZV9hZGRuKHRtcF9oZWFkZXJzLCBjb3B5LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgYXBfb3ZlcmxhcF90YWJsZXMoci0+aGVhZGVyc19pbiwgdG1wX2hlYWRlcnMsIEFQX09WRVJMQVBfVEFCTEVTX01FUkdFKTsKLX0KLQotcmVxdWVzdF9yZWMgKmFwX3JlYWRfcmVxdWVzdChjb25uX3JlYyAqY29ubikKLXsKLSAgICByZXF1ZXN0X3JlYyAqcjsKLSAgICBwb29sICpwOwotICAgIGNvbnN0IGNoYXIgKmV4cGVjdDsKLSAgICBpbnQgYWNjZXNzX3N0YXR1czsKLQotICAgIHAgPSBhcF9tYWtlX3N1Yl9wb29sKGNvbm4tPnBvb2wpOwotICAgIHIgPSBhcF9wY2FsbG9jKHAsIHNpemVvZihyZXF1ZXN0X3JlYykpOwotICAgIHItPnBvb2wgICAgICAgICAgICA9IHA7Ci0gICAgci0+Y29ubmVjdGlvbiAgICAgID0gY29ubjsKLSAgICBjb25uLT5zZXJ2ZXIgICAgICAgPSBjb25uLT5iYXNlX3NlcnZlcjsKLSAgICByLT5zZXJ2ZXIgICAgICAgICAgPSBjb25uLT5zZXJ2ZXI7Ci0KLSAgICBjb25uLT5rZXB0YWxpdmUgICAgPSBjb25uLT5rZWVwYWxpdmUgPT0gMTsKLSAgICBjb25uLT5rZWVwYWxpdmUgICAgPSAwOwotCi0gICAgY29ubi0+dXNlciAgICAgICAgID0gTlVMTDsKLSAgICBjb25uLT5hcF9hdXRoX3R5cGUgICAgPSBOVUxMOwotCi0gICAgci0+aGVhZGVyc19pbiAgICAgID0gYXBfbWFrZV90YWJsZShyLT5wb29sLCA1MCk7Ci0gICAgci0+c3VicHJvY2Vzc19lbnYgID0gYXBfbWFrZV90YWJsZShyLT5wb29sLCA1MCk7Ci0gICAgci0+aGVhZGVyc19vdXQgICAgID0gYXBfbWFrZV90YWJsZShyLT5wb29sLCAxMik7Ci0gICAgci0+ZXJyX2hlYWRlcnNfb3V0ID0gYXBfbWFrZV90YWJsZShyLT5wb29sLCA1KTsKLSAgICByLT5ub3RlcyAgICAgICAgICAgPSBhcF9tYWtlX3RhYmxlKHItPnBvb2wsIDUpOwotCi0gICAgci0+cmVxdWVzdF9jb25maWcgID0gYXBfY3JlYXRlX3JlcXVlc3RfY29uZmlnKHItPnBvb2wpOwotICAgIHItPnBlcl9kaXJfY29uZmlnICA9IHItPnNlcnZlci0+bG9va3VwX2RlZmF1bHRzOwotCi0gICAgci0+c2VudF9ib2R5Y3QgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogYnl0ZWN0IGlzbid0IGZvciBib2R5ICovCi0KLSAgICByLT5yZWFkX2xlbmd0aCAgICAgPSAwOwotICAgIHItPnJlYWRfYm9keSAgICAgICA9IFJFUVVFU1RfTk9fQk9EWTsKLQotICAgIHItPnN0YXR1cyAgICAgICAgICA9IEhUVFBfUkVRVUVTVF9USU1FX09VVDsgIC8qIFVudGlsIHdlIGdldCBhIHJlcXVlc3QgKi8KLSAgICByLT50aGVfcmVxdWVzdCAgICAgPSBOVUxMOwotCi0jaWZkZWYgQ0hBUlNFVF9FQkNESUMKLSAgICBhcF9ic2V0ZmxhZyhyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJfQVNDSUkyRUJDRElDfEJfRUJDRElDMkFTQ0lJLCAxKTsKLSNlbmRpZgotCi0gICAgLyogR2V0IHRoZSByZXF1ZXN0Li4uICovCi0KLSAgICBhcF9rZWVwYWxpdmVfdGltZW91dCgicmVhZCByZXF1ZXN0IGxpbmUiLCByKTsKLSAgICBpZiAoIXJlYWRfcmVxdWVzdF9saW5lKHIpKSB7Ci0gICAgICAgIGFwX2tpbGxfdGltZW91dChyKTsKLSAgICAgICAgaWYgKHItPnN0YXR1cyA9PSBIVFRQX1JFUVVFU1RfVVJJX1RPT19MQVJHRSkgewotCi0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1ZXN0IGZhaWxlZDogVVJJIHRvbyBsb25nIik7Ci0gICAgICAgICAgICBhcF9zZW5kX2Vycm9yX3Jlc3BvbnNlKHIsIDApOwotICAgICAgICAgICAgYXBfbG9nX3RyYW5zYWN0aW9uKHIpOwotICAgICAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmICghci0+YXNzYmFja3dhcmRzKSB7Ci0gICAgICAgIGFwX2hhcmRfdGltZW91dCgicmVhZCByZXF1ZXN0IGhlYWRlcnMiLCByKTsKLSAgICAgICAgZ2V0X21pbWVfaGVhZGVycyhyKTsKLSAgICAgICAgYXBfa2lsbF90aW1lb3V0KHIpOwotICAgICAgICBpZiAoci0+c3RhdHVzICE9IEhUVFBfUkVRVUVTVF9USU1FX09VVCkgewotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWVzdCBmYWlsZWQ6IGVycm9yIHJlYWRpbmcgdGhlIGhlYWRlcnMiKTsKLSAgICAgICAgICAgIGFwX3NlbmRfZXJyb3JfcmVzcG9uc2UociwgMCk7Ci0gICAgICAgICAgICBhcF9sb2dfdHJhbnNhY3Rpb24ocik7Ci0gICAgICAgICAgICByZXR1cm4gcjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgYXBfa2lsbF90aW1lb3V0KHIpOwotCi0gICAgICAgIGlmIChyLT5oZWFkZXJfb25seSkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIENsaWVudCBhc2tlZCBmb3IgaGVhZGVycyBvbmx5IHdpdGggSFRUUC8wLjksIHdoaWNoIGRvZXNuJ3Qgc2VuZAotICAgICAgICAgICAgICogaGVhZGVycyEgSGF2ZSB0byBkaW5rIHRoaW5ncyBqdXN0IHRvIG1ha2Ugc3VyZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAgICAgICAgICogY29tZXMgdGhyb3VnaC4uLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xpZW50IHNlbnQgaW52YWxpZCBIVFRQLzAuOSByZXF1ZXN0OiBIRUFEICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpKTsKLSAgICAgICAgICAgIHItPmhlYWRlcl9vbmx5ID0gMDsKLSAgICAgICAgICAgIHItPnN0YXR1cyA9IEhUVFBfQkFEX1JFUVVFU1Q7Ci0gICAgICAgICAgICBhcF9zZW5kX2Vycm9yX3Jlc3BvbnNlKHIsIDApOwotICAgICAgICAgICAgYXBfbG9nX3RyYW5zYWN0aW9uKHIpOwotICAgICAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByLT5zdGF0dXMgPSBIVFRQX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVbnRpbCBmdXJ0aGVyIG5vdGljZS4gKi8KLQotICAgIC8qIHVwZGF0ZSB3aGF0IHdlIHRoaW5rIHRoZSB2aXJ0dWFsIGhvc3QgaXMgYmFzZWQgb24gdGhlIGhlYWRlcnMgd2UndmUKLSAgICAgKiBub3cgcmVhZAotICAgICAqLwotICAgIGFwX3VwZGF0ZV92aG9zdF9mcm9tX2hlYWRlcnMocik7Ci0KLSAgICAvKiB3ZSBtYXkgaGF2ZSBzd2l0Y2hlZCB0byBhbm90aGVyIHNlcnZlciAqLwotICAgIHItPnBlcl9kaXJfY29uZmlnID0gci0+c2VydmVyLT5sb29rdXBfZGVmYXVsdHM7Ci0KLSAgICBjb25uLT5rZXB0YWxpdmUgPSAwOyAgICAgICAgLyogV2Ugbm93IGhhdmUgYSByZXF1ZXN0IHRvIHBsYXkgd2l0aCAqLwotCi0gICAgaWYgKCghci0+aG9zdG5hbWUgJiYgKHItPnByb3RvX251bSA+PSBIVFRQX1ZFUlNJT04oMSwxKSkpIHx8Ci0gICAgICAgICgoci0+cHJvdG9fbnVtID09IEhUVFBfVkVSU0lPTigxLDEpKSAmJgotICAgICAgICAgIWFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiSG9zdCIpKSkgewotICAgICAgICAvKgotICAgICAgICAgKiBDbGllbnQgc2VudCB1cyBhbiBIVFRQLzEuMSBvciBsYXRlciByZXF1ZXN0IHdpdGhvdXQgdGVsbGluZyB1cyB0aGUKLSAgICAgICAgICogaG9zdG5hbWUsIGVpdGhlciB3aXRoIGEgZnVsbCBVUkwgb3IgYSBIb3N0OiBoZWFkZXIuIFdlIHRoZXJlZm9yZQotICAgICAgICAgKiBuZWVkIHRvIChhcyBwZXIgdGhlIDEuMSBzcGVjKSBzZW5kIGFuIGVycm9yLiAgQXMgYSBzcGVjaWFsIGNhc2UsCi0gICAgICAgICAqIEhUVFAvMS4xIG1lbnRpb25zIHR3aWNlIChTOSwgUzE0LjIzKSB0aGF0IGEgcmVxdWVzdCBNVVNUIGNvbnRhaW4KLSAgICAgICAgICogYSBIb3N0OiBoZWFkZXIsIGFuZCB0aGUgc2VydmVyIE1VU1QgcmVzcG9uZCB3aXRoIDQwMCBpZiBpdCBkb2Vzbid0LgotICAgICAgICAgKi8KLSAgICAgICAgci0+c3RhdHVzID0gSFRUUF9CQURfUkVRVUVTVDsKLSAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAiY2xpZW50IHNlbnQgSFRUUC8xLjEgcmVxdWVzdCB3aXRob3V0IGhvc3RuYW1lICIKLSAgICAgICAgICAgICAgICAgICAgICAiKHNlZSBSRkMyMDY4IHNlY3Rpb24gOSwgYW5kIDE0LjIzKTogJXMiLCByLT51cmkpOwotICAgICAgICBhcF9zZW5kX2Vycm9yX3Jlc3BvbnNlKHIsIDApOwotICAgICAgICBhcF9sb2dfdHJhbnNhY3Rpb24ocik7Ci0gICAgICAgIHJldHVybiByOwotICAgIH0KLSAgICBpZiAoKChleHBlY3QgPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIkV4cGVjdCIpKSAhPSBOVUxMKSAmJgotICAgICAgICAoZXhwZWN0WzBdICE9ICdcMCcpKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFRoZSBFeHBlY3QgaGVhZGVyIGZpZWxkIHdhcyBhZGRlZCB0byBIVFRQLzEuMSBhZnRlciBSRkMgMjA2OAotICAgICAgICAgKiBhcyBhIG1lYW5zIHRvIHNpZ25hbCB3aGVuIGEgMTAwIHJlc3BvbnNlIGlzIGRlc2lyZWQgYW5kLAotICAgICAgICAgKiB1bmZvcnR1bmF0ZWx5LCB0byBzaWduYWwgYSBwb29yIG1hbidzIG1hbmRhdG9yeSBleHRlbnNpb24gdGhhdAotICAgICAgICAgKiB0aGUgc2VydmVyIG11c3QgdW5kZXJzdGFuZCBvciByZXR1cm4gNDE3IEV4cGVjdGF0aW9uIEZhaWxlZC4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChzdHJjYXNlY21wKGV4cGVjdCwgIjEwMC1jb250aW51ZSIpID09IDApIHsKLSAgICAgICAgICAgIHItPmV4cGVjdGluZ18xMDAgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgci0+c3RhdHVzID0gSFRUUF9FWFBFQ1RBVElPTl9GQUlMRUQ7Ci0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWVudCBzZW50IGFuIHVucmVjb2duaXplZCBleHBlY3RhdGlvbiB2YWx1ZSBvZiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3Q6ICVzIiwgZXhwZWN0KTsKLSAgICAgICAgICAgIGFwX3NlbmRfZXJyb3JfcmVzcG9uc2UociwgMCk7Ci0gICAgICAgICAgICAodm9pZCkgYXBfZGlzY2FyZF9yZXF1ZXN0X2JvZHkocik7Ci0gICAgICAgICAgICBhcF9sb2dfdHJhbnNhY3Rpb24ocik7Ci0gICAgICAgICAgICByZXR1cm4gcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICgoYWNjZXNzX3N0YXR1cyA9IGFwX3J1bl9wb3N0X3JlYWRfcmVxdWVzdChyKSkpIHsKLSAgICAgICAgYXBfZGllKGFjY2Vzc19zdGF0dXMsIHIpOwotICAgICAgICBhcF9sb2dfdHJhbnNhY3Rpb24ocik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiByOwotfQotCi0vKgotICogQSBjb3VwbGUgb2Ygb3RoZXIgZnVuY3Rpb25zIHdoaWNoIGluaXRpYWxpemUgc29tZSBvZiB0aGUgZmllbGRzIG9mCi0gKiBhIHJlcXVlc3Qgc3RydWN0dXJlLCBhcyBhcHByb3ByaWF0ZSBmb3IgYWRqdW5jdHMgb2Ygb25lIGtpbmQgb3IgYW5vdGhlcgotICogdG8gYSByZXF1ZXN0IGluIHByb2dyZXNzLiAgQmVzdCBoZXJlLCByYXRoZXIgdGhhbiBlbHNld2hlcmUsIHNpbmNlCi0gKiAqc29tZW9uZSogaGFzIHRvIHNldCB0aGUgcHJvdG9jb2wtc3BlY2lmaWMgZmllbGRzLi4uCi0gKi8KLQotdm9pZCBhcF9zZXRfc3ViX3JlcV9wcm90b2NvbChyZXF1ZXN0X3JlYyAqcm5ldywgY29uc3QgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgcm5ldy0+dGhlX3JlcXVlc3QgICAgID0gci0+dGhlX3JlcXVlc3Q7ICAvKiBLZWVwIG9yaWdpbmFsIHJlcXVlc3QtbGluZSAqLwotCi0gICAgcm5ldy0+YXNzYmFja3dhcmRzICAgID0gMTsgICAvKiBEb24ndCBzZW5kIGhlYWRlcnMgZnJvbSB0aGlzLiAqLwotICAgIHJuZXctPm5vX2xvY2FsX2NvcHkgICA9IDE7ICAgLyogRG9uJ3QgdHJ5IHRvIHNlbmQgVVNFX0xPQ0FMX0NPUFkgZm9yIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZyYWdtZW50LiAqLwotICAgIHJuZXctPm1ldGhvZCAgICAgICAgICA9ICJHRVQiOwotICAgIHJuZXctPm1ldGhvZF9udW1iZXIgICA9IE1fR0VUOwotICAgIHJuZXctPnByb3RvY29sICAgICAgICA9ICJJTkNMVURFRCI7Ci0KLSAgICBybmV3LT5zdGF0dXMgICAgICAgICAgPSBIVFRQX09LOwotCi0gICAgcm5ldy0+aGVhZGVyc19pbiAgICAgID0gci0+aGVhZGVyc19pbjsKLSAgICBybmV3LT5zdWJwcm9jZXNzX2VudiAgPSBhcF9jb3B5X3RhYmxlKHJuZXctPnBvb2wsIHItPnN1YnByb2Nlc3NfZW52KTsKLSAgICBybmV3LT5oZWFkZXJzX291dCAgICAgPSBhcF9tYWtlX3RhYmxlKHJuZXctPnBvb2wsIDUpOwotICAgIHJuZXctPmVycl9oZWFkZXJzX291dCA9IGFwX21ha2VfdGFibGUocm5ldy0+cG9vbCwgNSk7Ci0gICAgcm5ldy0+bm90ZXMgICAgICAgICAgID0gYXBfbWFrZV90YWJsZShybmV3LT5wb29sLCA1KTsKLQotICAgIHJuZXctPmV4cGVjdGluZ18xMDAgICA9IHItPmV4cGVjdGluZ18xMDA7Ci0gICAgcm5ldy0+cmVhZF9sZW5ndGggICAgID0gci0+cmVhZF9sZW5ndGg7Ci0gICAgcm5ldy0+cmVhZF9ib2R5ICAgICAgID0gUkVRVUVTVF9OT19CT0RZOwotCi0gICAgcm5ldy0+bWFpbiA9IChyZXF1ZXN0X3JlYyAqKSByOwotfQotCi12b2lkIGFwX2ZpbmFsaXplX3N1Yl9yZXFfcHJvdG9jb2wocmVxdWVzdF9yZWMgKnN1YikKLXsKLSAgICBTRVRfQllURVNfU0VOVChzdWItPm1haW4pOwotfQotCi0vKgotICogU3VwcG9ydCBmb3IgdGhlIEJhc2ljIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sLCBhbmQgYSBiaXQgZm9yIERpZ2VzdC4KLSAqLwotCi1BUElfRVhQT1JUKHZvaWQpIGFwX25vdGVfYXV0aF9mYWlsdXJlKHJlcXVlc3RfcmVjICpyKQotewotICAgIGlmICghc3RyY2FzZWNtcChhcF9hdXRoX3R5cGUociksICJCYXNpYyIpKQotICAgICAgICBhcF9ub3RlX2Jhc2ljX2F1dGhfZmFpbHVyZShyKTsKLSAgICBlbHNlIGlmICghc3RyY2FzZWNtcChhcF9hdXRoX3R5cGUociksICJEaWdlc3QiKSkKLSAgICAgICAgYXBfbm90ZV9kaWdlc3RfYXV0aF9mYWlsdXJlKHIpOwotfQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX25vdGVfYmFzaWNfYXV0aF9mYWlsdXJlKHJlcXVlc3RfcmVjICpyKQotewotICAgIGlmIChzdHJjYXNlY21wKGFwX2F1dGhfdHlwZShyKSwgIkJhc2ljIikpCi0gICAgICAgIGFwX25vdGVfYXV0aF9mYWlsdXJlKHIpOwotICAgIGVsc2UKLSAgICAgICAgYXBfdGFibGVfc2V0bihyLT5lcnJfaGVhZGVyc19vdXQsCi0gICAgICAgICAgICAgICAgICByLT5wcm94eXJlcSA/ICJQcm94eS1BdXRoZW50aWNhdGUiIDogIldXVy1BdXRoZW50aWNhdGUiLAotICAgICAgICAgICAgICAgICAgYXBfcHN0cmNhdChyLT5wb29sLCAiQmFzaWMgcmVhbG09XCIiLCBhcF9hdXRoX25hbWUociksICJcIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKTsKLX0KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9ub3RlX2RpZ2VzdF9hdXRoX2ZhaWx1cmUocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgYXBfdGFibGVfc2V0bihyLT5lcnJfaGVhZGVyc19vdXQsCi0JICAgIHItPnByb3h5cmVxID8gIlByb3h5LUF1dGhlbnRpY2F0ZSIgOiAiV1dXLUF1dGhlbnRpY2F0ZSIsCi0JICAgIGFwX3BzcHJpbnRmKHItPnBvb2wsICJEaWdlc3QgcmVhbG09XCIlc1wiLCBub25jZT1cIiVsdVwiIiwKLQkJYXBfYXV0aF9uYW1lKHIpLCByLT5yZXF1ZXN0X3RpbWUpKTsKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX2dldF9iYXNpY19hdXRoX3B3KHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICoqcHcpCi17Ci0gICAgY29uc3QgY2hhciAqYXV0aF9saW5lID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnByb3h5cmVxID8gIlByb3h5LUF1dGhvcml6YXRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIkF1dGhvcml6YXRpb24iKTsKLSAgICBjb25zdCBjaGFyICp0OwotCi0gICAgaWYgKCEodCA9IGFwX2F1dGhfdHlwZShyKSkgfHwgc3RyY2FzZWNtcCh0LCAiQmFzaWMiKSkKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotCi0gICAgaWYgKCFhcF9hdXRoX25hbWUocikpIHsKLSAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwKLQkJICAgIHIsICJuZWVkIEF1dGhOYW1lOiAlcyIsIHItPnVyaSk7Ci0gICAgICAgIHJldHVybiBTRVJWRVJfRVJST1I7Ci0gICAgfQotCi0gICAgaWYgKCFhdXRoX2xpbmUpIHsKLSAgICAgICAgYXBfbm90ZV9iYXNpY19hdXRoX2ZhaWx1cmUocik7Ci0gICAgICAgIHJldHVybiBBVVRIX1JFUVVJUkVEOwotICAgIH0KLQotICAgIGlmIChzdHJjYXNlY21wKGFwX2dldHdvcmQoci0+cG9vbCwgJmF1dGhfbGluZSwgJyAnKSwgIkJhc2ljIikpIHsKLSAgICAgICAgLyogQ2xpZW50IHRyaWVkIHRvIGF1dGhlbnRpY2F0ZSB1c2luZyB3cm9uZyBhdXRoIHNjaGVtZSAqLwotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAiY2xpZW50IHVzZWQgd3JvbmcgYXV0aGVudGljYXRpb24gc2NoZW1lOiAlcyIsIHItPnVyaSk7Ci0gICAgICAgIGFwX25vdGVfYmFzaWNfYXV0aF9mYWlsdXJlKHIpOwotICAgICAgICByZXR1cm4gQVVUSF9SRVFVSVJFRDsKLSAgICB9Ci0KLSAgICAvKiBDSEFSU0VUX0VCQ0RJQyBJc3N1ZSdzIGhlcmUgPyE/IENvbXBhcmUgd2l0aCAzMi85IGluc3RlYWQKLSAgICAgKiBhcyB3ZSBhcmUgb3BlcmF0aW5nIG9uIGFuIG9jdGVkIHN0cmVhbSA/Ci0gICAgICovCi0gICAgd2hpbGUgKCphdXRoX2xpbmU9PSAnICcgfHwgKmF1dGhfbGluZT09ICdcdCcpCi0gICAgICAgIGF1dGhfbGluZSsrOwotCi0gICAgdCA9IGFwX3BiYXNlNjRkZWNvZGUoci0+cG9vbCwgYXV0aF9saW5lKTsKLSAgICAvKiBOb3RlIHRoYXQgdGhpcyBhbGxvY2F0aW9uIGhhcyB0byBiZSBtYWRlIGZyb20gci0+Y29ubmVjdGlvbi0+cG9vbAotICAgICAqIGJlY2F1c2UgaXQgaGFzIHRoZSBsaWZldGltZSBvZiB0aGUgY29ubmVjdGlvbi4gIFRoZSBvdGhlciBhbGxvY2F0aW9ucwotICAgICAqIGFyZSB0ZW1wb3JhcnkgYW5kIGNhbiBiZSB0b3NzZWQgYXdheSBhbnkgdGltZS4KLSAgICAgKi8KLSAgICByLT5jb25uZWN0aW9uLT51c2VyID0gYXBfZ2V0d29yZF9udWxscyAoci0+Y29ubmVjdGlvbi0+cG9vbCwgJnQsICc6Jyk7Ci0gICAgci0+Y29ubmVjdGlvbi0+YXBfYXV0aF90eXBlID0gIkJhc2ljIjsKLQotICAgICpwdyA9IHQ7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8qIE5ldyBBcGFjaGUgcm91dGluZSB0byBtYXAgc3RhdHVzIGNvZGVzIGludG8gYXJyYXkgaW5kaWNpZXMKLSAqICBlLmcuICAxMDAgLT4gMCwgIDEwMSAtPiAxLCAgMjAwIC0+IDIgLi4uCi0gKiBUaGUgbnVtYmVyIG9mIHN0YXR1cyBsaW5lcyBtdXN0IGVxdWFsIHRoZSB2YWx1ZSBvZiBSRVNQT05TRV9DT0RFUyAoaHR0cGQuaCkKLSAqIGFuZCBtdXN0IGJlIGxpc3RlZCBpbiBvcmRlci4KLSAqLwotCi0jaWZkZWYgVVRTMjEKLS8qIFRoZSBzZWNvbmQgY29uc3QgdHJpZ2dlcnMgYW4gYXNzZW1ibGVyIGJ1ZyBvbiBVVFMgMi4xLgotICogQW5vdGhlciB3b3JrYXJvdW5kIGlzIHRvIG1vdmUgc29tZSBjb2RlIG91dCBvZiB0aGlzIGZpbGUgaW50byBhbm90aGVyLAotICogICBidXQgdGhpcyBpcyBlYXNpZXIuICBEYXZlIER5a3N0cmEsIDMvMzEvOTkgCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICogc3RhdHVzX2xpbmVzW1JFU1BPTlNFX0NPREVTXSA9Ci0jZWxzZQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzdGF0dXNfbGluZXNbUkVTUE9OU0VfQ09ERVNdID0KLSNlbmRpZgotewotICAgICIxMDAgQ29udGludWUiLAotICAgICIxMDEgU3dpdGNoaW5nIFByb3RvY29scyIsCi0gICAgIjEwMiBQcm9jZXNzaW5nIiwKLSNkZWZpbmUgTEVWRUxfMjAwICAzCi0gICAgIjIwMCBPSyIsCi0gICAgIjIwMSBDcmVhdGVkIiwKLSAgICAiMjAyIEFjY2VwdGVkIiwKLSAgICAiMjAzIE5vbi1BdXRob3JpdGF0aXZlIEluZm9ybWF0aW9uIiwKLSAgICAiMjA0IE5vIENvbnRlbnQiLAotICAgICIyMDUgUmVzZXQgQ29udGVudCIsCi0gICAgIjIwNiBQYXJ0aWFsIENvbnRlbnQiLAotICAgICIyMDcgTXVsdGktU3RhdHVzIiwKLSNkZWZpbmUgTEVWRUxfMzAwIDExCi0gICAgIjMwMCBNdWx0aXBsZSBDaG9pY2VzIiwKLSAgICAiMzAxIE1vdmVkIFBlcm1hbmVudGx5IiwKLSAgICAiMzAyIEZvdW5kIiwKLSAgICAiMzAzIFNlZSBPdGhlciIsCi0gICAgIjMwNCBOb3QgTW9kaWZpZWQiLAotICAgICIzMDUgVXNlIFByb3h5IiwKLSAgICAiMzA2IHVudXNlZCIsCi0gICAgIjMwNyBUZW1wb3JhcnkgUmVkaXJlY3QiLAotI2RlZmluZSBMRVZFTF80MDAgMTkKLSAgICAiNDAwIEJhZCBSZXF1ZXN0IiwKLSAgICAiNDAxIEF1dGhvcml6YXRpb24gUmVxdWlyZWQiLAotICAgICI0MDIgUGF5bWVudCBSZXF1aXJlZCIsCi0gICAgIjQwMyBGb3JiaWRkZW4iLAotICAgICI0MDQgTm90IEZvdW5kIiwKLSAgICAiNDA1IE1ldGhvZCBOb3QgQWxsb3dlZCIsCi0gICAgIjQwNiBOb3QgQWNjZXB0YWJsZSIsCi0gICAgIjQwNyBQcm94eSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCIsCi0gICAgIjQwOCBSZXF1ZXN0IFRpbWUtb3V0IiwKLSAgICAiNDA5IENvbmZsaWN0IiwKLSAgICAiNDEwIEdvbmUiLAotICAgICI0MTEgTGVuZ3RoIFJlcXVpcmVkIiwKLSAgICAiNDEyIFByZWNvbmRpdGlvbiBGYWlsZWQiLAotICAgICI0MTMgUmVxdWVzdCBFbnRpdHkgVG9vIExhcmdlIiwKLSAgICAiNDE0IFJlcXVlc3QtVVJJIFRvbyBMYXJnZSIsCi0gICAgIjQxNSBVbnN1cHBvcnRlZCBNZWRpYSBUeXBlIiwKLSAgICAiNDE2IFJlcXVlc3RlZCBSYW5nZSBOb3QgU2F0aXNmaWFibGUiLAotICAgICI0MTcgRXhwZWN0YXRpb24gRmFpbGVkIiwKLSAgICAiNDE4IHVudXNlZCIsCi0gICAgIjQxOSB1bnVzZWQiLAotICAgICI0MjAgdW51c2VkIiwKLSAgICAiNDIxIHVudXNlZCIsCi0gICAgIjQyMiBVbnByb2Nlc3NhYmxlIEVudGl0eSIsCi0gICAgIjQyMyBMb2NrZWQiLAotICAgICI0MjQgRmFpbGVkIERlcGVuZGVuY3kiLAotI2RlZmluZSBMRVZFTF81MDAgNDQKLSAgICAiNTAwIEludGVybmFsIFNlcnZlciBFcnJvciIsCi0gICAgIjUwMSBNZXRob2QgTm90IEltcGxlbWVudGVkIiwKLSAgICAiNTAyIEJhZCBHYXRld2F5IiwKLSAgICAiNTAzIFNlcnZpY2UgVGVtcG9yYXJpbHkgVW5hdmFpbGFibGUiLAotICAgICI1MDQgR2F0ZXdheSBUaW1lLW91dCIsCi0gICAgIjUwNSBIVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZCIsCi0gICAgIjUwNiBWYXJpYW50IEFsc28gTmVnb3RpYXRlcyIsCi0gICAgIjUwNyBJbnN1ZmZpY2llbnQgU3RvcmFnZSIsCi0gICAgIjUwOCB1bnVzZWQiLAotICAgICI1MDkgdW51c2VkIiwKLSAgICAiNTEwIE5vdCBFeHRlbmRlZCIKLX07Ci0KLS8qIFRoZSBpbmRleCBpcyBmb3VuZCBieSBpdHMgb2Zmc2V0IGZyb20gdGhlIHgwMCBjb2RlIG9mIGVhY2ggbGV2ZWwuCi0gKiBBbHRob3VnaCB0aGlzIGlzIGZhc3QsIGl0IHdpbGwgbmVlZCB0byBiZSByZXBsYWNlZCBpZiBzb21lIG51dGNhc2UKLSAqIGRlY2lkZXMgdG8gZGVmaW5lIGEgaGlnaC1udW1iZXJlZCBjb2RlIGJlZm9yZSB0aGUgbG93ZXIgbnVtYmVycy4KLSAqIElmIHRoYXQgc2FkIGV2ZW50IG9jY3VycywgcmVwbGFjZSB0aGUgY29kZSBiZWxvdyB3aXRoIGEgbGluZWFyIHNlYXJjaAotICogZnJvbSBzdGF0dXNfbGluZXNbc2hvcnRjdXRbaV1dIHRvIHN0YXR1c19saW5lc1tzaG9ydGN1dFtpKzFdLTFdOwotICovCi1BUElfRVhQT1JUKGludCkgYXBfaW5kZXhfb2ZfcmVzcG9uc2UoaW50IHN0YXR1cykKLXsKLSAgICBzdGF0aWMgaW50IHNob3J0Y3V0WzZdID0gezAsIExFVkVMXzIwMCwgTEVWRUxfMzAwLCBMRVZFTF80MDAsCi0gICAgTEVWRUxfNTAwLCBSRVNQT05TRV9DT0RFU307Ci0gICAgaW50IGksIHBvczsKLQotICAgIGlmIChzdGF0dXMgPCAxMDApICAgICAgICAgICAvKiBCZWxvdyAxMDAgaXMgaWxsZWdhbCBmb3IgSFRUUCBzdGF0dXMgKi8KLSAgICAgICAgcmV0dXJuIExFVkVMXzUwMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKLSAgICAgICAgc3RhdHVzIC09IDEwMDsKLSAgICAgICAgaWYgKHN0YXR1cyA8IDEwMCkgewotICAgICAgICAgICAgcG9zID0gKHN0YXR1cyArIHNob3J0Y3V0W2ldKTsKLSAgICAgICAgICAgIGlmIChwb3MgPCBzaG9ydGN1dFtpICsgMV0pCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBvczsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gTEVWRUxfNTAwOyAgICAgICAvKiBzdGF0dXMgdW5rbm93biAoZmFsbHMgaW4gZ2FwKSAqLwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBMRVZFTF81MDA7ICAgICAgICAgICAvKiA2MDAgb3IgYWJvdmUgaXMgYWxzbyBpbGxlZ2FsICovCi19Ci0KLS8qIFNlbmQgYSBzaW5nbGUgSFRUUCBoZWFkZXIgZmllbGQgdG8gdGhlIGNsaWVudC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uCi0gKiBpcyB1c2VkIGluIGNhbGxzIHRvIHRhYmxlX2RvKCksIHNvIHRoZWlyIGludGVyZmFjZXMgYXJlIGNvLWRlcGVuZGVudC4KLSAqIEluIG90aGVyIHdvcmRzLCBkb24ndCBjaGFuZ2UgdGhpcyBvbmUgd2l0aG91dCBjaGVja2luZyB0YWJsZV9kbyBpbiBhbGxvYy5jLgotICogSXQgcmV0dXJucyB0cnVlIHVubGVzcyB0aGVyZSB3YXMgYSB3cml0ZSBlcnJvciBvZiBzb21lIGtpbmQuCi0gKi8KLUFQSV9FWFBPUlRfTk9OU1REKGludCkgYXBfc2VuZF9oZWFkZXJfZmllbGQocmVxdWVzdF9yZWMgKnIsCi0gICAgY29uc3QgY2hhciAqZmllbGRuYW1lLCBjb25zdCBjaGFyICpmaWVsZHZhbCkKLXsKLSAgICByZXR1cm4gKDAgPCBhcF9ydnB1dHMociwgZmllbGRuYW1lLCAiOiAiLCBmaWVsZHZhbCwgIlwwMTVcMDEyIiwgTlVMTCkpOwotfQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX2Jhc2ljX2h0dHBfaGVhZGVyKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNoYXIgKnByb3RvY29sOwotI2lmZGVmIENIQVJTRVRfRUJDRElDCi0gICAgaW50IGNvbnZlcnQgPSBhcF9iZ2V0ZmxhZyhyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJfRUJDRElDMkFTQ0lJKTsKLSNlbmRpZiAvKkNIQVJTRVRfRUJDRElDKi8KLQotICAgIGlmIChyLT5hc3NiYWNrd2FyZHMpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmICghci0+c3RhdHVzX2xpbmUpCi0gICAgICAgIHItPnN0YXR1c19saW5lID0gc3RhdHVzX2xpbmVzW2FwX2luZGV4X29mX3Jlc3BvbnNlKHItPnN0YXR1cyldOwotCi0gICAgLyogbW9kX3Byb3h5IGlzIG9ubHkgSFRUUC8xLjAsIHNvIGF2b2lkIHNlbmRpbmcgSFRUUC8xLjEgZXJyb3IgcmVzcG9uc2U7Ci0gICAgICoga2x1Z2UgYXJvdW5kIGJyb2tlbiBicm93c2VycyB3aGVuIGluZGljYXRlZCBieSBmb3JjZS1yZXNwb25zZS0xLjAKLSAgICAgKi8KLSAgICBpZiAoci0+cHJveHlyZXEKLSAgICAgICAgfHwgKHItPnByb3RvX251bSA9PSBIVFRQX1ZFUlNJT04oMSwwKQotICAgICAgICAgICAgJiYgYXBfdGFibGVfZ2V0KHItPnN1YnByb2Nlc3NfZW52LCAiZm9yY2UtcmVzcG9uc2UtMS4wIikpKSB7Ci0KLSAgICAgICAgcHJvdG9jb2wgPSAiSFRUUC8xLjAiOwotICAgICAgICByLT5jb25uZWN0aW9uLT5rZWVwYWxpdmUgPSAtMTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBwcm90b2NvbCA9IFNFUlZFUl9QUk9UT0NPTDsKLQotI2lmZGVmIENIQVJTRVRfRUJDRElDCi0gICAgYXBfYnNldGZsYWcoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCX0VCQ0RJQzJBU0NJSSwgMSk7Ci0jZW5kaWYgLypDSEFSU0VUX0VCQ0RJQyovCi0KLSAgICAvKiBPdXRwdXQgdGhlIEhUVFAvMS54IFN0YXR1cy1MaW5lIGFuZCB0aGUgRGF0ZSBhbmQgU2VydmVyIGZpZWxkcyAqLwotCi0gICAgYXBfcnZwdXRzKHIsIHByb3RvY29sLCAiICIsIHItPnN0YXR1c19saW5lLCAiXDAxNVwwMTIiLCBOVUxMKTsKLQotICAgIGFwX3NlbmRfaGVhZGVyX2ZpZWxkKHIsICJEYXRlIiwgYXBfZ21fdGltZXN0cl84MjIoci0+cG9vbCwgci0+cmVxdWVzdF90aW1lKSk7Ci0gICAgYXBfc2VuZF9oZWFkZXJfZmllbGQociwgIlNlcnZlciIsIGFwX2dldF9zZXJ2ZXJfdmVyc2lvbigpKTsKLQotICAgIGFwX3RhYmxlX3Vuc2V0KHItPmhlYWRlcnNfb3V0LCAiRGF0ZSIpOyAgICAgICAgLyogQXZvaWQgYm9nb3NpdHkgKi8KLSAgICBhcF90YWJsZV91bnNldChyLT5oZWFkZXJzX291dCwgIlNlcnZlciIpOwotI2lmZGVmIENIQVJTRVRfRUJDRElDCi0gICAgaWYgKCFjb252ZXJ0KQotICAgICAgICBhcF9ic2V0ZmxhZyhyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJfRUJDRElDMkFTQ0lJLCBjb252ZXJ0KTsKLSNlbmRpZiAvKkNIQVJTRVRfRUJDRElDKi8KLX0KLQotLyogTmF2aWdhdG9yIHZlcnNpb25zIDIueCwgMy54IGFuZCA0LjAgYmV0YXMgdXAgdG8gYW5kIGluY2x1ZGluZyA0LjBiMgotICogaGF2ZSBhIGhlYWRlciBwYXJzaW5nIGJ1Zy4gIElmIHRoZSB0ZXJtaW5hdGluZyBcclxuIG9jY3VyIHN0YXJ0aW5nCi0gKiBhdCBvZmZzZXQgMjU2LCAyNTcgb3IgMjU4IG9mIG91dHB1dCB0aGVuIGl0IHdpbGwgbm90IHByb3Blcmx5IHBhcnNlCi0gKiB0aGUgaGVhZGVycy4gIEN1cmlvdXNseSBpdCBkb2Vzbid0IGV4aGliaXQgdGhpcyBwcm9ibGVtIGF0IDUxMiwgNTEzLgotICogV2UgYXJlIGd1ZXNzaW5nIHRoYXQgdGhpcyBpcyBiZWNhdXNlIHRoZWlyIGluaXRpYWwgcmVhZCBvZiBhIG5ldyByZXF1ZXN0Ci0gKiB1c2VzIGEgMjU2IGJ5dGUgYnVmZmVyLCBhbmQgc3Vic2VxdWVudCByZWFkcyB1c2UgYSBsYXJnZXIgYnVmZmVyLgotICogU28gdGhlIHByb2JsZW0gbWlnaHQgZXhpc3QgYXQgZGlmZmVyZW50IG9mZnNldHMgYXMgd2VsbC4KLSAqCi0gKiBUaGlzIHNob3VsZCBhbHNvIHdvcmsgb24ga2VlcGFsaXZlIGNvbm5lY3Rpb25zIGFzc3VtaW5nIHRoZXkgdXNlIHRoZQotICogc2FtZSBzbWFsbCBidWZmZXIgZm9yIHRoZSBmaXJzdCByZWFkIG9mIGVhY2ggbmV3IHJlcXVlc3QuCi0gKgotICogQXQgYW55IHJhdGUsIHdlIGNoZWNrIHRoZSBieXRlcyB3cml0dGVuIHNvIGZhciBhbmQsIGlmIHdlIGFyZSBhYm91dCB0bwotICogdGlja2xlIHRoZSBidWcsIHdlIGluc3RlYWQgaW5zZXJ0IGEgYm9ndXMgcGFkZGluZyBoZWFkZXIuICBTaW5jZSB0aGUgYnVnCi0gKiBtYW5pZmVzdHMgYXMgYSBicm9rZW4gaW1hZ2UgaW4gTmF2aWdhdG9yLCB1c2VycyBibGFtZSB0aGUgc2VydmVyLiAgOigKLSAqIEl0IGlzIG1vcmUgZXhwZW5zaXZlIHRvIGNoZWNrIHRoZSBVc2VyLUFnZW50IHRoYW4gaXQgaXMgdG8ganVzdCBhZGQgdGhlCi0gKiBieXRlcywgc28gd2UgaGF2ZW4ndCB1c2VkIHRoZSBCcm93c2VyTWF0Y2ggZmVhdHVyZSBoZXJlLgotICovCi1zdGF0aWMgdm9pZCB0ZXJtaW5hdGVfaGVhZGVyKEJVRkYgKmNsaWVudCkKLXsKLSAgICBsb25nIGludCBiczsKLQotICAgIGFwX2JnZXRvcHQoY2xpZW50LCBCT19CWVRFQ1QsICZicyk7Ci0gICAgaWYgKGJzID49IDI1NSAmJiBicyA8PSAyNTcpCi0gICAgICAgIGFwX2JwdXRzKCJYLVBhZDogYXZvaWQgYnJvd3NlciBidWdcMDE1XDAxMiIsIGNsaWVudCk7Ci0KLSAgICBhcF9icHV0cygiXDAxNVwwMTIiLCBjbGllbnQpOyAgLyogU2VuZCB0aGUgdGVybWluYXRpbmcgZW1wdHkgbGluZSAqLwotfQotCi0vKiBCdWlsZCB0aGUgQWxsb3cgZmllbGQtdmFsdWUgZnJvbSB0aGUgcmVxdWVzdCBoYW5kbGVyIG1ldGhvZCBtYXNrLgotICogTm90ZSB0aGF0IHdlIGFsd2F5cyBhbGxvdyBUUkFDRSwgc2luY2UgaXQgaXMgaGFuZGxlZCBiZWxvdy4KLSAqLwotc3RhdGljIGNoYXIgKm1ha2VfYWxsb3cocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgcmV0dXJuIDIgKyBhcF9wc3RyY2F0KHItPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgKHItPmFsbG93ZWQgJiAoMSA8PCBNX0dFVCkpICAgICAgID8gIiwgR0VULCBIRUFEIiA6ICIiLAotICAgICAgICAgICAgICAgICAgIChyLT5hbGxvd2VkICYgKDEgPDwgTV9QT1NUKSkgICAgICA/ICIsIFBPU1QiICAgICAgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAoci0+YWxsb3dlZCAmICgxIDw8IE1fUFVUKSkgICAgICAgPyAiLCBQVVQiICAgICAgIDogIiIsCi0gICAgICAgICAgICAgICAgICAgKHItPmFsbG93ZWQgJiAoMSA8PCBNX0RFTEVURSkpICAgID8gIiwgREVMRVRFIiAgICA6ICIiLAotICAgICAgICAgICAgICAgICAgIChyLT5hbGxvd2VkICYgKDEgPDwgTV9DT05ORUNUKSkgICA/ICIsIENPTk5FQ1QiICAgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAoci0+YWxsb3dlZCAmICgxIDw8IE1fT1BUSU9OUykpICAgPyAiLCBPUFRJT05TIiAgIDogIiIsCi0gICAgICAgICAgICAgICAgICAgKHItPmFsbG93ZWQgJiAoMSA8PCBNX1BBVENIKSkgICAgID8gIiwgUEFUQ0giICAgICA6ICIiLAotICAgICAgICAgICAgICAgICAgIChyLT5hbGxvd2VkICYgKDEgPDwgTV9QUk9QRklORCkpICA/ICIsIFBST1BGSU5EIiAgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAoci0+YWxsb3dlZCAmICgxIDw8IE1fUFJPUFBBVENIKSkgPyAiLCBQUk9QUEFUQ0giIDogIiIsCi0gICAgICAgICAgICAgICAgICAgKHItPmFsbG93ZWQgJiAoMSA8PCBNX01LQ09MKSkgICAgID8gIiwgTUtDT0wiICAgICA6ICIiLAotICAgICAgICAgICAgICAgICAgIChyLT5hbGxvd2VkICYgKDEgPDwgTV9DT1BZKSkgICAgICA/ICIsIENPUFkiICAgICAgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAoci0+YWxsb3dlZCAmICgxIDw8IE1fTU9WRSkpICAgICAgPyAiLCBNT1ZFIiAgICAgIDogIiIsCi0gICAgICAgICAgICAgICAgICAgKHItPmFsbG93ZWQgJiAoMSA8PCBNX0xPQ0spKSAgICAgID8gIiwgTE9DSyIgICAgICA6ICIiLAotICAgICAgICAgICAgICAgICAgIChyLT5hbGxvd2VkICYgKDEgPDwgTV9VTkxPQ0spKSAgICA/ICIsIFVOTE9DSyIgICAgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAiLCBUUkFDRSIsCi0gICAgICAgICAgICAgICAgICAgTlVMTCk7Ci19Ci0KLUFQSV9FWFBPUlQoaW50KSBhcF9zZW5kX2h0dHBfdHJhY2UocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IHJ2OwotCi0gICAgLyogR2V0IHRoZSBvcmlnaW5hbCByZXF1ZXN0ICovCi0gICAgd2hpbGUgKHItPnByZXYpCi0gICAgICAgIHIgPSByLT5wcmV2OwotCi0gICAgaWYgKChydiA9IGFwX3NldHVwX2NsaWVudF9ibG9jayhyLCBSRVFVRVNUX05PX0JPRFkpKSkKLSAgICAgICAgcmV0dXJuIHJ2OwotCi0gICAgYXBfaGFyZF90aW1lb3V0KCJzZW5kIFRSQUNFIiwgcik7Ci0KLSAgICByLT5jb250ZW50X3R5cGUgPSAibWVzc2FnZS9odHRwIjsKLSAgICBhcF9zZW5kX2h0dHBfaGVhZGVyKHIpOwotCi0gICAgLyogTm93IHdlIHJlY3JlYXRlIHRoZSByZXF1ZXN0LCBhbmQgZWNobyBpdCBiYWNrICovCi0KLSAgICBhcF9ydnB1dHMociwgci0+dGhlX3JlcXVlc3QsICJcMDE1XDAxMiIsIE5VTEwpOwotCi0gICAgYXBfdGFibGVfZG8oKGludCAoKikgKHZvaWQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKQotICAgICAgICAgICAgICAgIGFwX3NlbmRfaGVhZGVyX2ZpZWxkLCAodm9pZCAqKSByLCByLT5oZWFkZXJzX2luLCBOVUxMKTsKLSAgICBhcF9ycHV0cygiXDAxNVwwMTIiLCByKTsKLQotICAgIGFwX2tpbGxfdGltZW91dChyKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLWludCBhcF9zZW5kX2h0dHBfb3B0aW9ucyhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb25zdCBsb25nIGludCB6ZXJvID0gMEw7Ci0KLSAgICBpZiAoci0+YXNzYmFja3dhcmRzKQotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0KLSAgICBhcF9oYXJkX3RpbWVvdXQoInNlbmQgT1BUSU9OUyIsIHIpOwotCi0gICAgYXBfYmFzaWNfaHR0cF9oZWFkZXIocik7Ci0KLSAgICBhcF90YWJsZV9zZXRuKHItPmhlYWRlcnNfb3V0LCAiQ29udGVudC1MZW5ndGgiLCAiMCIpOwotICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJBbGxvdyIsIG1ha2VfYWxsb3cocikpOwotICAgIGFwX3NldF9rZWVwYWxpdmUocik7Ci0KLSAgICBhcF90YWJsZV9kbygoaW50ICgqKSAodm9pZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpIGFwX3NlbmRfaGVhZGVyX2ZpZWxkLAotICAgICAgICAgICAgICh2b2lkICopIHIsIHItPmhlYWRlcnNfb3V0LCBOVUxMKTsKLQotICAgIHRlcm1pbmF0ZV9oZWFkZXIoci0+Y29ubmVjdGlvbi0+Y2xpZW50KTsKLQotICAgIGFwX2tpbGxfdGltZW91dChyKTsKLSAgICBhcF9ic2V0b3B0KHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQk9fQllURUNULCAmemVybyk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8qCi0gKiBIZXJlIHdlIHRyeSB0byBiZSBjb21wYXRpYmxlIHdpdGggY2xpZW50cyB0aGF0IHdhbnQgbXVsdGlwYXJ0L3gtYnl0ZXJhbmdlcwotICogaW5zdGVhZCBvZiBtdWx0aXBhcnQvYnl0ZXJhbmdlcyAoYWxzbyBzZWUgYWJvdmUpLCBhcyBwZXIgSFRUUC8xLjEuIFdlCi0gKiBsb29rIGZvciB0aGUgUmVxdWVzdC1SYW5nZSBoZWFkZXIgKGUuZy4gTmV0c2NhcGUgMiBhbmQgMykgYXMgYW4gaW5kaWNhdGlvbgotICogdGhhdCB0aGUgYnJvd3NlciBzdXBwb3J0cyBhbiBvbGRlciBwcm90b2NvbC4gV2UgYWxzbyBjaGVjayBVc2VyLUFnZW50Ci0gKiBmb3IgTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIDMsIHdoaWNoIG5lZWRzIHRoaXMgYXMgd2VsbC4KLSAqLwotc3RhdGljIGludCB1c2VfcmFuZ2VfeChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb25zdCBjaGFyICp1YTsKLSAgICByZXR1cm4gKGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiUmVxdWVzdC1SYW5nZSIpIHx8Ci0gICAgICAgICAgICAoKHVhID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJVc2VyLUFnZW50IikpCi0gICAgICAgICAgICAgJiYgc3Ryc3RyKHVhLCAiTVNJRSAzIikpKTsKLX0KLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSBhcF90YWJsZV9kbyBhbmQgbWVyZ2VzIGFsbCBpbnN0YW5jZXMgb2YKLSAqIHRoZSBwYXNzZWQgZmllbGQgdmFsdWVzIGludG8gYSBzaW5nbGUgYXJyYXkgdGhhdCB3aWxsIGJlIGZ1cnRoZXIKLSAqIHByb2Nlc3NlZCBieSBzb21lIGxhdGVyIHJvdXRpbmUuICBPcmlnaW5hbGx5IGludGVuZGVkIHRvIGhlbHAgc3BsaXQKLSAqIGFuZCByZWNvbWJpbmUgbXVsdGlwbGUgVmFyeSBmaWVsZHMsIHRob3VnaCBpdCBpcyBnZW5lcmljIHRvIGFueSBmaWVsZAotICogY29uc2lzdGluZyBvZiBjb21tYS9zcGFjZS1zZXBhcmF0ZWQgdG9rZW5zLgotICovCi1zdGF0aWMgaW50IHVuaXFfZmllbGRfdmFsdWVzKHZvaWQgKmQsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsKQotewotICAgIGFycmF5X2hlYWRlciAqdmFsdWVzOwotICAgIGNoYXIgKnN0YXJ0OwotICAgIGNoYXIgKmU7Ci0gICAgY2hhciAqKnN0cnBwOwotICAgIGludCAgaTsKLQotICAgIHZhbHVlcyA9IChhcnJheV9oZWFkZXIgKilkOwotCi0gICAgZSA9IGFwX3BzdHJkdXAodmFsdWVzLT5wb29sLCB2YWwpOwotCi0gICAgZG8gewotICAgICAgICAvKiBGaW5kIGEgbm9uLWVtcHR5IGZpZWxkbmFtZSAqLwotCi0gICAgICAgIHdoaWxlICgqZSA9PSAnLCcgfHwgYXBfaXNzcGFjZSgqZSkpIHsKLSAgICAgICAgICAgICsrZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKmUgPT0gJ1wwJykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhcnQgPSBlOwotICAgICAgICB3aGlsZSAoKmUgIT0gJ1wwJyAmJiAqZSAhPSAnLCcgJiYgIWFwX2lzc3BhY2UoKmUpKSB7Ci0gICAgICAgICAgICArK2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCplICE9ICdcMCcpIHsKLSAgICAgICAgICAgICplKysgPSAnXDAnOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogTm93IGFkZCBpdCB0byB2YWx1ZXMgaWYgaXQgaXNuJ3QgYWxyZWFkeSByZXByZXNlbnRlZC4KLSAgICAgICAgICogQ291bGQgYmUgcmVwbGFjZWQgYnkgYSBhcF9hcnJheV9zdHJjYXNlY21wKCkgaWYgd2UgaGFkIG9uZS4KLSAgICAgICAgICovCi0gICAgICAgIGZvciAoaSA9IDAsIHN0cnBwID0gKGNoYXIgKiopIHZhbHVlcy0+ZWx0czsgaSA8IHZhbHVlcy0+bmVsdHM7Ci0gICAgICAgICAgICAgKytpLCArK3N0cnBwKSB7Ci0gICAgICAgICAgICBpZiAoKnN0cnBwICYmIHN0cmNhc2VjbXAoKnN0cnBwLCBzdGFydCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChpID09IHZhbHVlcy0+bmVsdHMpIHsgIC8qIGlmIG5vdCBmb3VuZCAqLwotICAgICAgICAgICAqKGNoYXIgKiopYXBfcHVzaF9hcnJheSh2YWx1ZXMpID0gc3RhcnQ7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlICgqZSAhPSAnXDAnKTsKLQotICAgIHJldHVybiAxOwotfQotCi0vKgotICogU2luY2Ugc29tZSBjbGllbnRzIGNob2tlIHZpb2xlbnRseSBvbiBtdWx0aXBsZSBWYXJ5IGZpZWxkcywgb3IKLSAqIFZhcnkgZmllbGRzIHdpdGggZHVwbGljYXRlIHRva2VucywgY29tYmluZSBhbnkgbXVsdGlwbGVzIGFuZCByZW1vdmUKLSAqIGFueSBkdXBsaWNhdGVzLgotICovCi1zdGF0aWMgdm9pZCBmaXh1cF92YXJ5KHJlcXVlc3RfcmVjICpyKQotewotICAgIGFycmF5X2hlYWRlciAqdmFyaWVzOwotCi0gICAgdmFyaWVzID0gYXBfbWFrZV9hcnJheShyLT5wb29sLCA1LCBzaXplb2YoY2hhciAqKSk7Ci0KLSAgICAvKiBFeHRyYWN0IGFsbCBWYXJ5IGZpZWxkcyBmcm9tIHRoZSBoZWFkZXJzX291dCwgc2VwYXJhdGUgZWFjaCBpbnRvCi0gICAgICogaXRzIGNvbW1hLXNlcGFyYXRlZCBmaWVsZG5hbWUgdmFsdWVzLCBhbmQgdGhlbiBhZGQgdGhlbSB0byB2YXJpZXMKLSAgICAgKiBpZiBub3QgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBhcnJheS4KLSAgICAgKi8KLSAgICBhcF90YWJsZV9kbygoaW50ICgqKSh2b2lkICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSl1bmlxX2ZpZWxkX3ZhbHVlcywKLQkJKHZvaWQgKikgdmFyaWVzLCByLT5oZWFkZXJzX291dCwgIlZhcnkiLCBOVUxMKTsKLQotICAgIC8qIElmIHdlIGZvdW5kIGFueSwgcmVwbGFjZSBvbGQgVmFyeSBmaWVsZHMgd2l0aCB1bmlxdWUtaWZpZWQgdmFsdWUgKi8KLQotICAgIGlmICh2YXJpZXMtPm5lbHRzID4gMCkgewotCWFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJWYXJ5IiwKLQkJICAgICAgYXBfYXJyYXlfcHN0cmNhdChyLT5wb29sLCB2YXJpZXMsICcsJykpOwotICAgIH0KLX0KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9zZW5kX2h0dHBfaGVhZGVyKHJlcXVlc3RfcmVjICpyKQotewotICAgIGludCBpOwotICAgIGNvbnN0IGxvbmcgaW50IHplcm8gPSAwTDsKLSNpZmRlZiBDSEFSU0VUX0VCQ0RJQwotICAgIGludCBjb252ZXJ0ID0gYXBfYmdldGZsYWcoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCX0VCQ0RJQzJBU0NJSSk7Ci0jZW5kaWYgLypDSEFSU0VUX0VCQ0RJQyovCi0KLSAgICBpZiAoci0+YXNzYmFja3dhcmRzKSB7Ci0gICAgICAgIGlmICghci0+bWFpbikKLSAgICAgICAgICAgIGFwX2JzZXRvcHQoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCT19CWVRFQ1QsICZ6ZXJvKTsKLSAgICAgICAgci0+c2VudF9ib2R5Y3QgPSAxOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBOb3cgdGhhdCB3ZSBhcmUgcmVhZHkgdG8gc2VuZCBhIHJlc3BvbnNlLCB3ZSBuZWVkIHRvIGNvbWJpbmUgdGhlIHR3bwotICAgICAqIGhlYWRlciBmaWVsZCB0YWJsZXMgaW50byBhIHNpbmdsZSB0YWJsZS4gIElmIHdlIGRvbid0IGRvIHRoaXMsIG91cgotICAgICAqIGxhdGVyIGF0dGVtcHRzIHRvIHNldCBvciB1bnNldCBhIGdpdmVuIGZpZWxkbmFtZSBtaWdodCBiZSBieXBhc3NlZC4KLSAgICAgKi8KLSAgICBpZiAoIWFwX2lzX2VtcHR5X3RhYmxlKHItPmVycl9oZWFkZXJzX291dCkpCi0gICAgICAgIHItPmhlYWRlcnNfb3V0ID0gYXBfb3ZlcmxheV90YWJsZXMoci0+cG9vbCwgci0+ZXJyX2hlYWRlcnNfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0KTsKLQotICAgIC8qCi0gICAgICogUmVtb3ZlIHRoZSAnVmFyeScgaGVhZGVyIGZpZWxkIGlmIHRoZSBjbGllbnQgY2FuJ3QgaGFuZGxlIGl0LgotICAgICAqIFNpbmNlIHRoaXMgd2lsbCBoYXZlIG5hc3R5IGVmZmVjdHMgb24gSFRUUC8xLjEgY2FjaGVzLCBmb3JjZQotICAgICAqIHRoZSByZXNwb25zZSBpbnRvIEhUVFAvMS4wIG1vZGUuCi0gICAgICovCi0gICAgaWYgKGFwX3RhYmxlX2dldChyLT5zdWJwcm9jZXNzX2VudiwgImZvcmNlLW5vLXZhcnkiKSAhPSBOVUxMKSB7Ci0JYXBfdGFibGVfdW5zZXQoci0+aGVhZGVyc19vdXQsICJWYXJ5Iik7Ci0Jci0+cHJvdG9fbnVtID0gSFRUUF9WRVJTSU9OKDEsMCk7Ci0JYXBfdGFibGVfc2V0KHItPnN1YnByb2Nlc3NfZW52LCAiZm9yY2UtcmVzcG9uc2UtMS4wIiwgIjEiKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JZml4dXBfdmFyeShyKTsKLSAgICB9Ci0KLSAgICBhcF9oYXJkX3RpbWVvdXQoInNlbmQgaGVhZGVycyIsIHIpOwotCi0gICAgYXBfYmFzaWNfaHR0cF9oZWFkZXIocik7Ci0KLSNpZmRlZiBDSEFSU0VUX0VCQ0RJQwotICAgIGFwX2JzZXRmbGFnKHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQl9FQkNESUMyQVNDSUksIDEpOwotI2VuZGlmIC8qQ0hBUlNFVF9FQkNESUMqLwotCi0gICAgYXBfc2V0X2tlZXBhbGl2ZShyKTsKLQotICAgIGlmIChyLT5jaHVua2VkKSB7Ci0gICAgICAgIGFwX3RhYmxlX21lcmdlbihyLT5oZWFkZXJzX291dCwgIlRyYW5zZmVyLUVuY29kaW5nIiwgImNodW5rZWQiKTsKLSAgICAgICAgYXBfdGFibGVfdW5zZXQoci0+aGVhZGVyc19vdXQsICJDb250ZW50LUxlbmd0aCIpOwotICAgIH0KLQotICAgIGlmIChyLT5ieXRlcmFuZ2UgPiAxKQotICAgICAgICBhcF90YWJsZV9zZXRuKHItPmhlYWRlcnNfb3V0LCAiQ29udGVudC1UeXBlIiwKLSAgICAgICAgICAgICAgICAgIGFwX3BzdHJjYXQoci0+cG9vbCwgIm11bHRpcGFydCIsIHVzZV9yYW5nZV94KHIpID8gIi94LSIgOiAiLyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlcmFuZ2VzOyBib3VuZGFyeT0iLCByLT5ib3VuZGFyeSwgTlVMTCkpOwotICAgIGVsc2UgaWYgKHItPmNvbnRlbnRfdHlwZSkKLSAgICAgICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkNvbnRlbnQtVHlwZSIsIHItPmNvbnRlbnRfdHlwZSk7Ci0gICAgZWxzZQotICAgICAgICBhcF90YWJsZV9zZXRuKHItPmhlYWRlcnNfb3V0LCAiQ29udGVudC1UeXBlIiwgYXBfZGVmYXVsdF90eXBlKHIpKTsKLQotICAgIGlmIChyLT5jb250ZW50X2VuY29kaW5nKQotICAgICAgICBhcF90YWJsZV9zZXRuKHItPmhlYWRlcnNfb3V0LCAiQ29udGVudC1FbmNvZGluZyIsIHItPmNvbnRlbnRfZW5jb2RpbmcpOwotCi0gICAgaWYgKHItPmNvbnRlbnRfbGFuZ3VhZ2VzICYmIHItPmNvbnRlbnRfbGFuZ3VhZ2VzLT5uZWx0cykgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgci0+Y29udGVudF9sYW5ndWFnZXMtPm5lbHRzOyArK2kpIHsKLSAgICAgICAgICAgIGFwX3RhYmxlX21lcmdlbihyLT5oZWFkZXJzX291dCwgIkNvbnRlbnQtTGFuZ3VhZ2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgKChjaGFyICoqKSAoci0+Y29udGVudF9sYW5ndWFnZXMtPmVsdHMpKVtpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoci0+Y29udGVudF9sYW5ndWFnZSkKLSAgICAgICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkNvbnRlbnQtTGFuZ3VhZ2UiLCByLT5jb250ZW50X2xhbmd1YWdlKTsKLQotICAgIC8qCi0gICAgICogQ29udHJvbCBjYWNoYWJpbGl0eSBmb3Igbm9uLWNhY2hhYmxlIHJlc3BvbnNlcyBpZiBub3QgYWxyZWFkeSBzZXQgYnkKLSAgICAgKiBzb21lIG90aGVyIHBhcnQgb2YgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uLgotICAgICAqLwotICAgIGlmIChyLT5ub19jYWNoZSAmJiAhYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfb3V0LCAiRXhwaXJlcyIpKQotICAgICAgICBhcF90YWJsZV9hZGRuKHItPmhlYWRlcnNfb3V0LCAiRXhwaXJlcyIsCi0gICAgICAgICAgICAgICAgICBhcF9nbV90aW1lc3RyXzgyMihyLT5wb29sLCByLT5yZXF1ZXN0X3RpbWUpKTsKLQotICAgIC8qIFNlbmQgdGhlIGVudGlyZSB0YWJsZSBvZiBoZWFkZXIgZmllbGRzLCB0ZXJtaW5hdGVkIGJ5IGFuIGVtcHR5IGxpbmUuICovCi0KLSAgICBhcF90YWJsZV9kbygoaW50ICgqKSAodm9pZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpIGFwX3NlbmRfaGVhZGVyX2ZpZWxkLAotICAgICAgICAgICAgICh2b2lkICopIHIsIHItPmhlYWRlcnNfb3V0LCBOVUxMKTsKLQotICAgIHRlcm1pbmF0ZV9oZWFkZXIoci0+Y29ubmVjdGlvbi0+Y2xpZW50KTsKLQotICAgIGFwX2tpbGxfdGltZW91dChyKTsKLQotICAgIGFwX2JzZXRvcHQoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCT19CWVRFQ1QsICZ6ZXJvKTsKLSAgICByLT5zZW50X2JvZHljdCA9IDE7ICAgICAgICAgLyogV2hhdGV2ZXIgZm9sbG93cyBpcyByZWFsIGJvZHkgc3R1ZmYuLi4gKi8KLQotICAgIC8qIFNldCBidWZmZXIgZmxhZ3MgZm9yIHRoZSBib2R5ICovCi0gICAgaWYgKHItPmNodW5rZWQpCi0gICAgICAgIGFwX2JzZXRmbGFnKHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQl9DSFVOSywgMSk7Ci0jaWZkZWYgQ0hBUlNFVF9FQkNESUMKLSAgICBpZiAoIWNvbnZlcnQpCi0gICAgICAgIGFwX2JzZXRmbGFnKHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQl9FQkNESUMyQVNDSUksIGNvbnZlcnQpOwotI2VuZGlmIC8qQ0hBUlNFVF9FQkNESUMqLwotfQotCi0vKiBmaW5hbGl6ZV9yZXF1ZXN0X3Byb3RvY29sIGlzIGNhbGxlZCBhdCBjb21wbGV0aW9uIG9mIHNlbmRpbmcgdGhlCi0gKiByZXNwb25zZS4gIEl0J3Mgc29sZSBwdXJwb3NlIGlzIHRvIHNlbmQgdGhlIHRlcm1pbmF0aW5nIHByb3RvY29sCi0gKiBpbmZvcm1hdGlvbiBmb3IgYW55IHdyYXBwZXJzIGFyb3VuZCB0aGUgcmVzcG9uc2UgbWVzc2FnZSBib2R5Ci0gKiAoaS5lLiwgdHJhbnNmZXIgZW5jb2RpbmdzKS4gIEl0IHNob3VsZCBoYXZlIGJlZW4gbmFtZWQgZmluYWxpemVfcmVzcG9uc2UuCi0gKi8KLUFQSV9FWFBPUlQodm9pZCkgYXBfZmluYWxpemVfcmVxdWVzdF9wcm90b2NvbChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpZiAoci0+Y2h1bmtlZCAmJiAhci0+Y29ubmVjdGlvbi0+YWJvcnRlZCkgewotICAgICAgICAvKgotICAgICAgICAgKiBUdXJuIG9mZiBjaHVua2VkIGVuY29kaW5nIC0tLSB3ZSBjYW4gb25seSBkbyB0aGlzIG9uY2UuCi0gICAgICAgICAqLwotICAgICAgICByLT5jaHVua2VkID0gMDsKLSAgICAgICAgYXBfYnNldGZsYWcoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCX0NIVU5LLCAwKTsKLQotICAgICAgICBhcF9zb2Z0X3RpbWVvdXQoInNlbmQgZW5kaW5nIGNodW5rIiwgcik7Ci0gICAgICAgIGFwX3JwdXRzKCIwXDAxNVwwMTIiLCByKTsKLSAgICAgICAgLyogSWYgd2UgaGFkIGZvb3RlciAiaGVhZGVycyIsIHdlJ2Qgc2VuZCB0aGVtIG5vdyAqLwotICAgICAgICBhcF9ycHV0cygiXDAxNVwwMTIiLCByKTsKLSAgICAgICAgYXBfa2lsbF90aW1lb3V0KHIpOwotICAgIH0KLX0KLQotLyogSGVyZSB3ZSBkZWFsIHdpdGggZ2V0dGluZyB0aGUgcmVxdWVzdCBtZXNzYWdlIGJvZHkgZnJvbSB0aGUgY2xpZW50LgotICogV2hldGhlciBvciBub3QgdGhlIHJlcXVlc3QgY29udGFpbnMgYSBib2R5IGlzIHNpZ25hbGVkIGJ5IHRoZSBwcmVzZW5jZQotICogb2YgYSBub24temVybyBDb250ZW50LUxlbmd0aCBvciBieSBhIFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkLgotICoKLSAqIE5vdGUgdGhhdCB0aGlzIGlzIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBpdCB3YXMgaW4gQXBhY2hlIDEuMSBhbmQgcHJpb3IKLSAqIHZlcnNpb25zLCBiZWNhdXNlIGNodW5rZWQgc3VwcG9ydCBtZWFucyB0aGF0IHRoZSBtb2R1bGUgZG9lcyBsZXNzLgotICoKLSAqIFRoZSBwcm9wZXIgcHJvY2VkdXJlIGlzIHRoaXM6Ci0gKgotICogMS4gQ2FsbCBzZXR1cF9jbGllbnRfYmxvY2soKSBuZWFyIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlcXVlc3QKLSAqICAgIGhhbmRsZXIuIFRoaXMgd2lsbCBzZXQgdXAgYWxsIHRoZSBuZWNlc3NhcnkgcHJvcGVydGllcywgYW5kIHdpbGwKLSAqICAgIHJldHVybiBlaXRoZXIgT0ssIG9yIGFuIGVycm9yIGNvZGUuIElmIHRoZSBsYXR0ZXIsIHRoZSBtb2R1bGUgc2hvdWxkCi0gKiAgICByZXR1cm4gdGhhdCBlcnJvciBjb2RlLiBUaGUgc2Vjb25kIHBhcmFtZXRlciBzZWxlY3RzIHRoZSBwb2xpY3kgdG8KLSAqICAgIGFwcGx5IGlmIHRoZSByZXF1ZXN0IG1lc3NhZ2UgaW5kaWNhdGVzIGEgYm9keSwgYW5kIGhvdyBhIGNodW5rZWQKLSAqICAgIHRyYW5zZmVyLWNvZGluZyBzaG91bGQgYmUgaW50ZXJwcmV0ZWQuIENob29zZSBvbmUgb2YKLSAqCi0gKiAgICBSRVFVRVNUX05PX0JPRFkgICAgICAgICAgU2VuZCA0MTMgZXJyb3IgaWYgbWVzc2FnZSBoYXMgYW55IGJvZHkKLSAqICAgIFJFUVVFU1RfQ0hVTktFRF9FUlJPUiAgICBTZW5kIDQxMSBlcnJvciBpZiBib2R5IHdpdGhvdXQgQ29udGVudC1MZW5ndGgKLSAqICAgIFJFUVVFU1RfQ0hVTktFRF9ERUNIVU5LICBJZiBjaHVua2VkLCByZW1vdmUgdGhlIGNodW5rcyBmb3IgbWUuCi0gKiAgICBSRVFVRVNUX0NIVU5LRURfUEFTUyAgICAgUGFzcyB0aGUgY2h1bmtzIHRvIG1lIHdpdGhvdXQgcmVtb3ZhbC4KLSAqCi0gKiAgICBJbiBvcmRlciB0byB1c2UgdGhlIGxhc3QgdHdvIG9wdGlvbnMsIHRoZSBjYWxsZXIgTVVTVCBwcm92aWRlIGEgYnVmZmVyCi0gKiAgICBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhIGNodW5rLXNpemUgbGluZSwgaW5jbHVkaW5nIGFueSBleHRlbnNpb25zLgotICoKLSAqIDIuIFdoZW4geW91IGFyZSByZWFkeSB0byByZWFkIGEgYm9keSAoaWYgYW55KSwgY2FsbCBzaG91bGRfY2xpZW50X2Jsb2NrKCkuCi0gKiAgICBUaGlzIHdpbGwgdGVsbCB0aGUgbW9kdWxlIHdoZXRoZXIgb3Igbm90IHRvIHJlYWQgaW5wdXQuIElmIGl0IGlzIDAsCi0gKiAgICB0aGUgbW9kdWxlIHNob3VsZCBhc3N1bWUgdGhhdCB0aGVyZSBpcyBubyBtZXNzYWdlIGJvZHkgdG8gcmVhZC4KLSAqICAgIFRoaXMgc3RlcCBhbHNvIHNlbmRzIGEgMTAwIENvbnRpbnVlIHJlc3BvbnNlIHRvIEhUVFAvMS4xIGNsaWVudHMsCi0gKiAgICBzbyBzaG91bGQgbm90IGJlIGNhbGxlZCB1bnRpbCB0aGUgbW9kdWxlIGlzICpkZWZpbml0ZWx5KiByZWFkeSB0bwotICogICAgcmVhZCBjb250ZW50LiAob3RoZXJ3aXNlLCB0aGUgcG9pbnQgb2YgdGhlIDEwMCByZXNwb25zZSBpcyBkZWZlYXRlZCkuCi0gKiAgICBOZXZlciBjYWxsIHRoaXMgZnVuY3Rpb24gbW9yZSB0aGFuIG9uY2UuCi0gKgotICogMy4gRmluYWxseSwgY2FsbCBnZXRfY2xpZW50X2Jsb2NrIGluIGEgbG9vcC4gUGFzcyBpdCBhIGJ1ZmZlciBhbmQgaXRzIHNpemUuCi0gKiAgICBJdCB3aWxsIHB1dCBkYXRhIGludG8gdGhlIGJ1ZmZlciAobm90IG5lY2Vzc2FyaWx5IGEgZnVsbCBidWZmZXIpLCBhbmQKLSAqICAgIHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBibG9jay4gV2hlbiBpdCBpcyBkb25lIHJlYWRpbmcsIGl0IHdpbGwKLSAqICAgIHJldHVybiAwIGlmIEVPRiwgb3IgLTEgaWYgdGhlcmUgd2FzIGFuIGVycm9yLgotICogICAgSWYgYW4gZXJyb3Igb2NjdXJzIG9uIGlucHV0LCB3ZSBmb3JjZSBhbiBlbmQgdG8ga2VlcGFsaXZlLgotICovCi0KLUFQSV9FWFBPUlQoaW50KSBhcF9zZXR1cF9jbGllbnRfYmxvY2socmVxdWVzdF9yZWMgKnIsIGludCByZWFkX3BvbGljeSkKLXsKLSAgICBjb25zdCBjaGFyICp0ZW5jID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJUcmFuc2Zlci1FbmNvZGluZyIpOwotICAgIGNvbnN0IGNoYXIgKmxlbnAgPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIkNvbnRlbnQtTGVuZ3RoIik7Ci0gICAgdW5zaWduZWQgbG9uZyBtYXhfYm9keTsKLQotICAgIHItPnJlYWRfYm9keSA9IHJlYWRfcG9saWN5OwotICAgIHItPnJlYWRfY2h1bmtlZCA9IDA7Ci0gICAgci0+cmVtYWluaW5nID0gMDsKLQotICAgIGlmICh0ZW5jKSB7Ci0gICAgICAgIGlmIChzdHJjYXNlY21wKHRlbmMsICJjaHVua2VkIikpIHsKLSAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBUcmFuc2Zlci1FbmNvZGluZyAlcyIsIHRlbmMpOwotICAgICAgICAgICAgcmV0dXJuIEhUVFBfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyLT5yZWFkX2JvZHkgPT0gUkVRVUVTVF9DSFVOS0VEX0VSUk9SKSB7Ci0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgImNodW5rZWQgVHJhbnNmZXItRW5jb2RpbmcgZm9yYmlkZGVuOiAlcyIsIHItPnVyaSk7Ci0gICAgICAgICAgICByZXR1cm4gKGxlbnApID8gSFRUUF9CQURfUkVRVUVTVCA6IEhUVFBfTEVOR1RIX1JFUVVJUkVEOwotICAgICAgICB9Ci0KLSAgICAgICAgci0+cmVhZF9jaHVua2VkID0gMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobGVucCkgewotICAgICAgICBjb25zdCBjaGFyICpwb3MgPSBsZW5wOwotCi0gICAgICAgIHdoaWxlIChhcF9pc2RpZ2l0KCpwb3MpIHx8IGFwX2lzc3BhY2UoKnBvcykpCi0gICAgICAgICAgICArK3BvczsKLSAgICAgICAgaWYgKCpwb3MgIT0gJ1wwJykgewotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIENvbnRlbnQtTGVuZ3RoICVzIiwgbGVucCk7Ci0gICAgICAgICAgICByZXR1cm4gSFRUUF9CQURfUkVRVUVTVDsKLSAgICAgICAgfQotCi0gICAgICAgIHItPnJlbWFpbmluZyA9IGF0b2wobGVucCk7Ci0gICAgfQotCi0gICAgaWYgKChyLT5yZWFkX2JvZHkgPT0gUkVRVUVTVF9OT19CT0RZKSAmJgotICAgICAgICAoci0+cmVhZF9jaHVua2VkIHx8IChyLT5yZW1haW5pbmcgPiAwKSkpIHsKLSAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgIiVzIHdpdGggYm9keSBpcyBub3QgYWxsb3dlZCBmb3IgJXMiLCByLT5tZXRob2QsIHItPnVyaSk7Ci0gICAgICAgIHJldHVybiBIVFRQX1JFUVVFU1RfRU5USVRZX1RPT19MQVJHRTsKLSAgICB9Ci0KLSAgICBtYXhfYm9keSA9IGFwX2dldF9saW1pdF9yZXFfYm9keShyKTsKLSAgICBpZiAobWF4X2JvZHkgJiYgKHItPnJlbWFpbmluZyA+IG1heF9ib2R5KSkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICJSZXF1ZXN0IGNvbnRlbnQtbGVuZ3RoIG9mICVzIGlzIGxhcmdlciB0aGFuIHRoZSBjb25maWd1cmVkICIKLSAgICAgICAgICAibGltaXQgb2YgJWx1IiwgbGVucCwgbWF4X2JvZHkpOwotICAgICAgICByZXR1cm4gSFRUUF9SRVFVRVNUX0VOVElUWV9UT09fTEFSR0U7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1BUElfRVhQT1JUKGludCkgYXBfc2hvdWxkX2NsaWVudF9ibG9jayhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICAvKiBGaXJzdCBjaGVjayBpZiB3ZSBoYXZlIGFscmVhZHkgcmVhZCB0aGUgcmVxdWVzdCBib2R5ICovCi0KLSAgICBpZiAoci0+cmVhZF9sZW5ndGggfHwgKCFyLT5yZWFkX2NodW5rZWQgJiYgKHItPnJlbWFpbmluZyA8PSAwKSkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKHItPmV4cGVjdGluZ18xMDAgJiYgci0+cHJvdG9fbnVtID49IEhUVFBfVkVSU0lPTigxLDEpKSB7Ci0gICAgICAgIC8qIHNlbmRpbmcgMTAwIENvbnRpbnVlIGludGVyaW0gcmVzcG9uc2UgKi8KLSAgICAgICAgYXBfcnZwdXRzKHIsIFNFUlZFUl9QUk9UT0NPTCwgIiAiLCBzdGF0dXNfbGluZXNbMF0sICJcMDE1XDAxMlwwMTVcMDEyIiwKLSAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgICAgICBhcF9yZmx1c2gocik7Ci0gICAgfQotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBsb25nIGdldF9jaHVua19zaXplKGNoYXIgKmIpCi17Ci0gICAgbG9uZyBjaHVua3NpemUgPSAwOwotCi0gICAgd2hpbGUgKGFwX2lzeGRpZ2l0KCpiKSkgewotICAgICAgICBpbnQgeHZhbHVlID0gMDsKLQotICAgICAgICBpZiAoKmIgPj0gJzAnICYmICpiIDw9ICc5JykKLSAgICAgICAgICAgIHh2YWx1ZSA9ICpiIC0gJzAnOwotICAgICAgICBlbHNlIGlmICgqYiA+PSAnQScgJiYgKmIgPD0gJ0YnKQotICAgICAgICAgICAgeHZhbHVlID0gKmIgLSAnQScgKyAweGE7Ci0gICAgICAgIGVsc2UgaWYgKCpiID49ICdhJyAmJiAqYiA8PSAnZicpCi0gICAgICAgICAgICB4dmFsdWUgPSAqYiAtICdhJyArIDB4YTsKLQotICAgICAgICBjaHVua3NpemUgPSAoY2h1bmtzaXplIDw8IDQpIHwgeHZhbHVlOwotICAgICAgICArK2I7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNodW5rc2l6ZTsKLX0KLQotLyogZ2V0X2NsaWVudF9ibG9jayBpcyBjYWxsZWQgaW4gYSBsb29wIHRvIGdldCB0aGUgcmVxdWVzdCBtZXNzYWdlIGJvZHkuCi0gKiBUaGlzIGlzIHF1aXRlIHNpbXBsZSBpZiB0aGUgY2xpZW50IGluY2x1ZGVzIGEgY29udGVudC1sZW5ndGgKLSAqICh0aGUgbm9ybWFsIGNhc2UpLCBidXQgZ2V0cyBtZXNzeSBpZiB0aGUgYm9keSBpcyBjaHVua2VkLiBOb3RlIHRoYXQKLSAqIHItPnJlbWFpbmluZyBpcyB1c2VkIHRvIG1haW50YWluIHN0YXRlIGFjcm9zcyBjYWxscyBhbmQgdGhhdAotICogci0+cmVhZF9sZW5ndGggaXMgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBnaXZlbiB0byB0aGUgY2FsbGVyCi0gKiBhY3Jvc3MgYWxsIGludm9jYXRpb25zLiAgSXQgaXMgbWVzc3kgYmVjYXVzZSB3ZSBoYXZlIHRvIGJlIGNhcmVmdWwgbm90Ci0gKiB0byByZWFkIHBhc3QgdGhlIGRhdGEgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgc2luY2UgdGhlc2UgcmVhZHMgYmxvY2suCi0gKiBSZXR1cm5zIDAgb24gRW5kLW9mLWJvZHksIC0xIG9uIGVycm9yIG9yIHByZW1hdHVyZSBjaHVuayBlbmQuCi0gKgotICogUmVhZGluZyB0aGUgY2h1bmtlZCBlbmNvZGluZyByZXF1aXJlcyBhIGJ1ZmZlciBzaXplIGxhcmdlIGVub3VnaCB0bwotICogaG9sZCBhIGNodW5rLXNpemUgbGluZSwgaW5jbHVkaW5nIGFueSBleHRlbnNpb25zLiBGb3Igbm93LCB3ZSdsbCBsZWF2ZQotICogdGhhdCB0byB0aGUgY2FsbGVyLCBhdCBsZWFzdCB1bnRpbCB3ZSBjYW4gY29tZSB1cCB3aXRoIGEgYmV0dGVyIHNvbHV0aW9uLgotICovCi1BUElfRVhQT1JUKGxvbmcpIGFwX2dldF9jbGllbnRfYmxvY2socmVxdWVzdF9yZWMgKnIsIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZnNpeikKLXsKLSAgICBpbnQgYzsKLSAgICBsb25nIGxlbl9yZWFkLCBsZW5fdG9fcmVhZDsKLSAgICBsb25nIGNodW5rX3N0YXJ0ID0gMDsKLSAgICB1bnNpZ25lZCBsb25nIG1heF9ib2R5OwotCi0gICAgaWYgKCFyLT5yZWFkX2NodW5rZWQpIHsgICAgIC8qIENvbnRlbnQtbGVuZ3RoIHJlYWQgKi8KLSAgICAgICAgbGVuX3RvX3JlYWQgPSAoci0+cmVtYWluaW5nID4gYnVmc2l6KSA/IGJ1ZnNpeiA6IHItPnJlbWFpbmluZzsKLSAgICAgICAgbGVuX3JlYWQgPSBhcF9icmVhZChyLT5jb25uZWN0aW9uLT5jbGllbnQsIGJ1ZmZlciwgbGVuX3RvX3JlYWQpOwotICAgICAgICBpZiAobGVuX3JlYWQgPD0gMCkgewotICAgICAgICAgICAgaWYgKGxlbl9yZWFkIDwgMCkKLSAgICAgICAgICAgICAgICByLT5jb25uZWN0aW9uLT5rZWVwYWxpdmUgPSAtMTsKLSAgICAgICAgICAgIHJldHVybiBsZW5fcmVhZDsKLSAgICAgICAgfQotICAgICAgICByLT5yZWFkX2xlbmd0aCArPSBsZW5fcmVhZDsKLSAgICAgICAgci0+cmVtYWluaW5nIC09IGxlbl9yZWFkOwotICAgICAgICByZXR1cm4gbGVuX3JlYWQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBIYW5kbGUgY2h1bmtlZCByZWFkaW5nIE5vdGU6IHdlIGFyZSBjYXJlZnVsIHRvIHNob3J0ZW4gdGhlIGlucHV0Ci0gICAgICogYnVmc2l6IHNvIHRoYXQgdGhlcmUgd2lsbCBhbHdheXMgYmUgZW5vdWdoIHNwYWNlIGZvciB1cyB0byBhZGQgYSBDUkxGCi0gICAgICogKGlmIG5lY2Vzc2FyeSkuCi0gICAgICovCi0gICAgaWYgKHItPnJlYWRfYm9keSA9PSBSRVFVRVNUX0NIVU5LRURfUEFTUykKLSAgICAgICAgYnVmc2l6IC09IDI7Ci0gICAgaWYgKGJ1ZnNpeiA8PSAwKQotICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAvKiBDYW5ub3QgcmVhZCBjaHVua2VkIHdpdGggYSBzbWFsbCBidWZmZXIgKi8KLQotICAgIC8qIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFscmVhZHkgcmVhZCB0b28gbXVjaCByZXF1ZXN0IGRhdGEuCi0gICAgICogRm9yIGVmZmljaWVuY3kgcmVhc29ucywgd2Ugb25seSBjaGVjayB0aGlzIGF0IHRoZSB0b3Agb2YgZWFjaAotICAgICAqIGNhbGxlciByZWFkIHBhc3MsIHNpbmNlIHRoZSBsaW1pdCBleGlzdHMganVzdCB0byBzdG9wIGluZmluaXRlCi0gICAgICogbGVuZ3RoIHJlcXVlc3RzIGFuZCBub2JvZHkgY2FyZXMgaWYgaXQgZ29lcyBvdmVyIGJ5IG9uZSBidWZmZXIuCi0gICAgICovCi0gICAgbWF4X2JvZHkgPSBhcF9nZXRfbGltaXRfcmVxX2JvZHkocik7Ci0gICAgaWYgKG1heF9ib2R5ICYmIChyLT5yZWFkX2xlbmd0aCA+IG1heF9ib2R5KSkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgIkNodW5rZWQgcmVxdWVzdCBib2R5IGlzIGxhcmdlciB0aGFuIHRoZSBjb25maWd1cmVkIGxpbWl0IG9mICVsdSIsCi0gICAgICAgICAgICBtYXhfYm9keSk7Ci0gICAgICAgIHItPmNvbm5lY3Rpb24tPmtlZXBhbGl2ZSA9IC0xOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaWYgKHItPnJlbWFpbmluZyA9PSAwKSB7ICAgIC8qIFN0YXJ0IG9mIG5ldyBjaHVuayAqLwotCi0gICAgICAgIGNodW5rX3N0YXJ0ID0gZ2V0bGluZShidWZmZXIsIGJ1ZnNpeiwgci0+Y29ubmVjdGlvbi0+Y2xpZW50LCAwKTsKLSAgICAgICAgaWYgKChjaHVua19zdGFydCA8PSAwKSB8fCAoY2h1bmtfc3RhcnQgPj0gKGJ1ZnNpeiAtIDEpKQotICAgICAgICAgICAgfHwgIWFwX2lzeGRpZ2l0KCpidWZmZXIpKSB7Ci0gICAgICAgICAgICByLT5jb25uZWN0aW9uLT5rZWVwYWxpdmUgPSAtMTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIGxlbl90b19yZWFkID0gZ2V0X2NodW5rX3NpemUoYnVmZmVyKTsKLQotICAgICAgICBpZiAobGVuX3RvX3JlYWQgPT0gMCkgeyAvKiBMYXN0IGNodW5rIGluZGljYXRlZCwgZ2V0IGZvb3RlcnMgKi8KLSAgICAgICAgICAgIGlmIChyLT5yZWFkX2JvZHkgPT0gUkVRVUVTVF9DSFVOS0VEX0RFQ0hVTkspIHsKLSAgICAgICAgICAgICAgICBnZXRfbWltZV9oZWFkZXJzKHIpOwotICAgICAgICAgICAgICAgIGFwX3NucHJpbnRmKGJ1ZmZlciwgYnVmc2l6LCAiJWxkIiwgci0+cmVhZF9sZW5ndGgpOwotICAgICAgICAgICAgICAgIGFwX3RhYmxlX3Vuc2V0KHItPmhlYWRlcnNfaW4sICJUcmFuc2Zlci1FbmNvZGluZyIpOwotICAgICAgICAgICAgICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19pbiwgIkNvbnRlbnQtTGVuZ3RoIiwKLSAgICAgICAgICAgICAgICAgICAgYXBfcHN0cmR1cChyLT5wb29sLCBidWZmZXIpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHItPnJlbWFpbmluZyA9IC0xOyAgLyogSW5kaWNhdGUgZm9vdGVycyBpbi1wcm9ncmVzcyAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgci0+cmVtYWluaW5nID0gbGVuX3RvX3JlYWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHItPnJlYWRfYm9keSA9PSBSRVFVRVNUX0NIVU5LRURfUEFTUykgewotICAgICAgICAgICAgYnVmZmVyW2NodW5rX3N0YXJ0KytdID0gQ1I7IC8qIFJlc3RvcmUgY2h1bmstc2l6ZSBsaW5lIGVuZCAgKi8KLSAgICAgICAgICAgIGJ1ZmZlcltjaHVua19zdGFydCsrXSA9IExGOwotICAgICAgICAgICAgYnVmZmVyICs9IGNodW5rX3N0YXJ0OyAgICAgIC8qIGFuZCBwYXNzIGxpbmUgb24gdG8gY2FsbGVyICAgKi8KLSAgICAgICAgICAgIGJ1ZnNpeiAtPSBjaHVua19zdGFydDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIFJFUVVFU1RfQ0hVTktFRF9ERUNIVU5LIC0tIGRvIG5vdCBpbmNsdWRlIHRoZSBsZW5ndGggb2YgdGhlCi0gICAgICAgICAgICAgKiBoZWFkZXIgaW4gdGhlIHJldHVybiB2YWx1ZQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBjaHVua19zdGFydCA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdoZW4gUkVRVUVTVF9DSFVOS0VEX1BBU1MsIHdlIGFyZSAqLwotICAgIGlmIChyLT5yZW1haW5pbmcgPT0gLTEpIHsgICAvKiByZWFkaW5nIGZvb3RlcnMgdW50aWwgZW1wdHkgbGluZSAgKi8KLSAgICAgICAgbGVuX3JlYWQgPSBjaHVua19zdGFydDsKLQotICAgICAgICB3aGlsZSAoKGJ1ZnNpeiA+IDEpICYmICgobGVuX3JlYWQgPQotICAgICAgICAgICAgICAgICAgZ2V0bGluZShidWZmZXIsIGJ1ZnNpeiwgci0+Y29ubmVjdGlvbi0+Y2xpZW50LCAxKSkgPiAwKSkgewotCi0gICAgICAgICAgICBpZiAobGVuX3JlYWQgIT0gKGJ1ZnNpeiAtIDEpKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyW2xlbl9yZWFkKytdID0gQ1I7ICAgICAgICAvKiBSZXN0b3JlIGZvb3RlciBsaW5lIGVuZCAgKi8KLSAgICAgICAgICAgICAgICBidWZmZXJbbGVuX3JlYWQrK10gPSBMRjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNodW5rX3N0YXJ0ICs9IGxlbl9yZWFkOwotICAgICAgICAgICAgYnVmZmVyICs9IGxlbl9yZWFkOwotICAgICAgICAgICAgYnVmc2l6IC09IGxlbl9yZWFkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsZW5fcmVhZCA8IDApIHsKLSAgICAgICAgICAgIHItPmNvbm5lY3Rpb24tPmtlZXBhbGl2ZSA9IC0xOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxlbl9yZWFkID09IDApIHsgICAgLyogSW5kaWNhdGVzIGFuIGVtcHR5IGxpbmUgKi8KLSAgICAgICAgICAgIGJ1ZmZlclswXSA9IENSOwotICAgICAgICAgICAgYnVmZmVyWzFdID0gTEY7Ci0gICAgICAgICAgICBjaHVua19zdGFydCArPSAyOwotICAgICAgICAgICAgci0+cmVtYWluaW5nID0gLTI7Ci0gICAgICAgIH0KLSAgICAgICAgci0+cmVhZF9sZW5ndGggKz0gY2h1bmtfc3RhcnQ7Ci0gICAgICAgIHJldHVybiBjaHVua19zdGFydDsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdoZW4gUkVRVUVTVF9DSFVOS0VEX1BBU1MsIHdlICAgICAqLwotICAgIGlmIChyLT5yZW1haW5pbmcgPT0gLTIpIHsgICAvKiBmaW5pc2hlZCBmb290ZXJzIHdoZW4gbGFzdCBjYWxsZWQgKi8KLSAgICAgICAgci0+cmVtYWluaW5nID0gMDsgICAgICAgLyogc28gbm93IHdlIG11c3Qgc2lnbmFsIEVPRiAgICAgICAgICovCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIE90aGVyd2lzZSwgd2UgYXJlIGluIHRoZSBtaWRzdCBvZiByZWFkaW5nIGEgY2h1bmsgb2YgZGF0YSAqLwotCi0gICAgbGVuX3RvX3JlYWQgPSAoci0+cmVtYWluaW5nID4gYnVmc2l6KSA/IGJ1ZnNpeiA6IHItPnJlbWFpbmluZzsKLQotICAgIGxlbl9yZWFkID0gYXBfYnJlYWQoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBidWZmZXIsIGxlbl90b19yZWFkKTsKLSAgICBpZiAobGVuX3JlYWQgPD0gMCkgewotICAgICAgICByLT5jb25uZWN0aW9uLT5rZWVwYWxpdmUgPSAtMTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHItPnJlbWFpbmluZyAtPSBsZW5fcmVhZDsKLQotICAgIGlmIChyLT5yZW1haW5pbmcgPT0gMCkgeyAgICAvKiBFbmQgb2YgY2h1bmssIGdldCB0cmFpbGluZyBDUkxGICovCi0gICAgICAgIGlmICgoYyA9IGFwX2JnZXRjKHItPmNvbm5lY3Rpb24tPmNsaWVudCkpID09IENSKSB7Ci0gICAgICAgICAgICBjID0gYXBfYmdldGMoci0+Y29ubmVjdGlvbi0+Y2xpZW50KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYyAhPSBMRikgewotICAgICAgICAgICAgci0+Y29ubmVjdGlvbi0+a2VlcGFsaXZlID0gLTE7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHItPnJlYWRfYm9keSA9PSBSRVFVRVNUX0NIVU5LRURfUEFTUykgewotICAgICAgICAgICAgYnVmZmVyW2xlbl9yZWFkKytdID0gQ1I7Ci0gICAgICAgICAgICBidWZmZXJbbGVuX3JlYWQrK10gPSBMRjsKLSAgICAgICAgfQotICAgIH0KLSAgICByLT5yZWFkX2xlbmd0aCArPSAoY2h1bmtfc3RhcnQgKyBsZW5fcmVhZCk7Ci0KLSAgICByZXR1cm4gKGNodW5rX3N0YXJ0ICsgbGVuX3JlYWQpOwotfQotCi0vKiBJbiBIVFRQLzEuMSwgYW55IG1ldGhvZCBjYW4gaGF2ZSBhIGJvZHkuICBIb3dldmVyLCBtb3N0IEdFVCBoYW5kbGVycwotICogd291bGRuJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggYSByZXF1ZXN0IGJvZHkgaWYgdGhleSByZWNlaXZlZCBvbmUuCi0gKiBUaGlzIGhlbHBlciByb3V0aW5lIHRlc3RzIGZvciBhbmQgcmVhZHMgYW55IG1lc3NhZ2UgYm9keSBpbiB0aGUgcmVxdWVzdCwKLSAqIHNpbXBseSBkaXNjYXJkaW5nIHdoYXRldmVyIGl0IHJlY2VpdmVzLiAgV2UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2UKLSAqIGZhaWxpbmcgdG8gcmVhZCB0aGUgcmVxdWVzdCBib2R5IHdvdWxkIGNhdXNlIGl0IHRvIGJlIGludGVycHJldGVkCi0gKiBhcyB0aGUgbmV4dCByZXF1ZXN0IG9uIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uLgotICoKLSAqIFNpbmNlIHdlIHJldHVybiBhbiBlcnJvciBzdGF0dXMgaWYgdGhlIHJlcXVlc3QgaXMgbWFsZm9ybWVkLCB0aGlzCi0gKiByb3V0aW5lIHNob3VsZCBiZSBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIG5vLWJvZHkgaGFuZGxlciwgZS5nLiwKLSAqCi0gKiAgICBpZiAoKHJldHZhbCA9IGFwX2Rpc2NhcmRfcmVxdWVzdF9ib2R5KHIpKSAhPSBPSykKLSAqICAgICAgICByZXR1cm4gcmV0dmFsOwotICovCi1BUElfRVhQT1JUKGludCkgYXBfZGlzY2FyZF9yZXF1ZXN0X2JvZHkocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IHJ2OwotCi0gICAgaWYgKChydiA9IGFwX3NldHVwX2NsaWVudF9ibG9jayhyLCBSRVFVRVNUX0NIVU5LRURfUEFTUykpKQotICAgICAgICByZXR1cm4gcnY7Ci0KLSAgICAvKiBJbiBvcmRlciB0byBhdm9pZCBzZW5kaW5nIDEwMCBDb250aW51ZSB3aGVuIHdlIGFscmVhZHkga25vdyB0aGUKLSAgICAgKiBmaW5hbCByZXNwb25zZSBzdGF0dXMsIGFuZCB5ZXQgbm90IGtpbGwgdGhlIGNvbm5lY3Rpb24gaWYgdGhlcmUgaXMKLSAgICAgKiBubyByZXF1ZXN0IGJvZHkgdG8gYmUgcmVhZCwgd2UgbmVlZCB0byBkdXBsaWNhdGUgdGhlIHRlc3QgZnJvbQotICAgICAqIGFwX3Nob3VsZF9jbGllbnRfYmxvY2soKSBoZXJlIG5lZ2F0ZWQgcmF0aGVyIHRoYW4gY2FsbCBpdCBkaXJlY3RseS4KLSAgICAgKi8KLSAgICBpZiAoKHItPnJlYWRfbGVuZ3RoID09IDApICYmIChyLT5yZWFkX2NodW5rZWQgfHwgKHItPnJlbWFpbmluZyA+IDApKSkgewotICAgICAgICBjaGFyIGR1bXBidWZbSFVHRV9TVFJJTkdfTEVOXTsKLQotICAgICAgICBpZiAoci0+ZXhwZWN0aW5nXzEwMCkgewotICAgICAgICAgICAgci0+Y29ubmVjdGlvbi0+a2VlcGFsaXZlID0gLTE7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgYXBfaGFyZF90aW1lb3V0KCJyZWFkaW5nIHJlcXVlc3QgYm9keSIsIHIpOwotICAgICAgICB3aGlsZSAoKHJ2ID0gYXBfZ2V0X2NsaWVudF9ibG9jayhyLCBkdW1wYnVmLCBIVUdFX1NUUklOR19MRU4pKSA+IDApCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgYXBfa2lsbF90aW1lb3V0KHIpOwotCi0gICAgICAgIGlmIChydiA8IDApCi0gICAgICAgICAgICByZXR1cm4gSFRUUF9CQURfUkVRVUVTVDsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vKgotICogU2VuZCB0aGUgYm9keSBvZiBhIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQuCi0gKi8KLUFQSV9FWFBPUlQobG9uZykgYXBfc2VuZF9mZChGSUxFICpmLCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICByZXR1cm4gYXBfc2VuZF9mZF9sZW5ndGgoZiwgciwgLTEpOwotfQotCi1BUElfRVhQT1JUKGxvbmcpIGFwX3NlbmRfZmRfbGVuZ3RoKEZJTEUgKmYsIHJlcXVlc3RfcmVjICpyLCBsb25nIGxlbmd0aCkKLXsKLSAgICBjaGFyIGJ1ZltJT0JVRlNJWkVdOwotICAgIGxvbmcgdG90YWxfYnl0ZXNfc2VudCA9IDA7Ci0gICAgcmVnaXN0ZXIgaW50IG4sIHcsIG8sIGxlbjsKLQotICAgIGlmIChsZW5ndGggPT0gMCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBhcF9zb2Z0X3RpbWVvdXQoInNlbmQgYm9keSIsIHIpOwotCi0gICAgd2hpbGUgKCFyLT5jb25uZWN0aW9uLT5hYm9ydGVkKSB7Ci0gICAgICAgIGlmICgobGVuZ3RoID4gMCkgJiYgKHRvdGFsX2J5dGVzX3NlbnQgKyBJT0JVRlNJWkUpID4gbGVuZ3RoKQotICAgICAgICAgICAgbGVuID0gbGVuZ3RoIC0gdG90YWxfYnl0ZXNfc2VudDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbGVuID0gSU9CVUZTSVpFOwotCi0gICAgICAgIHdoaWxlICgobiA9IGZyZWFkKGJ1Ziwgc2l6ZW9mKGNoYXIpLCBsZW4sIGYpKSA8IDEKLSAgICAgICAgICAgICAgICYmIGZlcnJvcihmKSAmJiBlcnJubyA9PSBFSU5UUiAmJiAhci0+Y29ubmVjdGlvbi0+YWJvcnRlZCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGlmIChuIDwgMSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbyA9IDA7Ci0KLSAgICAgICAgd2hpbGUgKG4gJiYgIXItPmNvbm5lY3Rpb24tPmFib3J0ZWQpIHsKLSAgICAgICAgICAgIHcgPSBhcF9id3JpdGUoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCAmYnVmW29dLCBuKTsKLSAgICAgICAgICAgIGlmICh3ID4gMCkgewotICAgICAgICAgICAgICAgIGFwX3Jlc2V0X3RpbWVvdXQocik7IC8qIHJlc2V0IHRpbWVvdXQgYWZ0ZXIgc3VjY2Vzc2Z1bCB3cml0ZSAqLwotICAgICAgICAgICAgICAgIHRvdGFsX2J5dGVzX3NlbnQgKz0gdzsKLSAgICAgICAgICAgICAgICBuIC09IHc7Ci0gICAgICAgICAgICAgICAgbyArPSB3OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodyA8IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoIXItPmNvbm5lY3Rpb24tPmFib3J0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19JTkZPLCByLAotICAgICAgICAgICAgICAgICAgICAgImNsaWVudCBzdG9wcGVkIGNvbm5lY3Rpb24gYmVmb3JlIHNlbmQgYm9keSBjb21wbGV0ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgYXBfYnNldGZsYWcoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCX0VPVVQsIDEpOwotICAgICAgICAgICAgICAgICAgICByLT5jb25uZWN0aW9uLT5hYm9ydGVkID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBhcF9raWxsX3RpbWVvdXQocik7Ci0gICAgU0VUX0JZVEVTX1NFTlQocik7Ci0gICAgcmV0dXJuIHRvdGFsX2J5dGVzX3NlbnQ7Ci19Ci0KLS8qCi0gKiBTZW5kIHRoZSBib2R5IG9mIGEgcmVzcG9uc2UgdG8gdGhlIGNsaWVudC4KLSAqLwotQVBJX0VYUE9SVChsb25nKSBhcF9zZW5kX2ZiKEJVRkYgKmZiLCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICByZXR1cm4gYXBfc2VuZF9mYl9sZW5ndGgoZmIsIHIsIC0xKTsKLX0KLQotQVBJX0VYUE9SVChsb25nKSBhcF9zZW5kX2ZiX2xlbmd0aChCVUZGICpmYiwgcmVxdWVzdF9yZWMgKnIsIGxvbmcgbGVuZ3RoKQotewotICAgIGNoYXIgYnVmW0lPQlVGU0laRV07Ci0gICAgbG9uZyB0b3RhbF9ieXRlc19zZW50ID0gMDsKLSAgICByZWdpc3RlciBpbnQgbiwgdywgbywgbGVuLCBmZDsKLSAgICBmZF9zZXQgZmRzOwotCi0gICAgaWYgKGxlbmd0aCA9PSAwKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8qIE1ha2UgZmIgdW5idWZmZXJlZCBhbmQgbm9uLWJsb2NraW5nICovCi0gICAgYXBfYnNldGZsYWcoZmIsIEJfUkQsIDApOwotI2lmbmRlZiBUUEYgICAgCi0gICAgYXBfYm5vbmJsb2NrKGZiLCBCX1JEKTsKLSNlbmRpZgotICAgIGZkID0gYXBfYmZpbGVubyhmYiwgQl9SRCk7Ci0jaWZkZWYgQ0hFQ0tfRkRfU0VUU0laRQotICAgIGlmIChmZCA+PSBGRF9TRVRTSVpFKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfV0FSTklORywgTlVMTCwKLQkgICAgInNlbmQgYm9keTogZmlsZWRlc2NyaXB0b3IgKCV1KSBsYXJnZXIgdGhhbiBGRF9TRVRTSVpFICgldSkgIgotCSAgICAiZm91bmQsIHlvdSBwcm9iYWJseSBuZWVkIHRvIHJlYnVpbGQgQXBhY2hlIHdpdGggYSAiCi0JICAgICJsYXJnZXIgRkRfU0VUU0laRSIsIGZkLCBGRF9TRVRTSVpFKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGFwX3NvZnRfdGltZW91dCgic2VuZCBib2R5Iiwgcik7Ci0KLSAgICBGRF9aRVJPKCZmZHMpOwotICAgIHdoaWxlICghci0+Y29ubmVjdGlvbi0+YWJvcnRlZCkgewotI2lmZGVmIE5ERUxBWV9QSVBFX1JFVFVSTlNfWkVSTwotCS8qIENvbnRyaWJ1dGVkIGJ5IGR3ZEBiZWxsLWxhYnMuY29tIGZvciBVVFMgMi4xLjIsIHdoZXJlIHRoZSBmY250bCAqLwotCS8qICAgT19OREVMQVkgZmxhZyBjYXVzZXMgcmVhZCB0byByZXR1cm4gMCB3aGVuIHRoZXJlJ3Mgbm90aGluZyAqLwotCS8qICAgYXZhaWxhYmxlIHdoZW4gcmVhZGluZyBmcm9tIGEgcGlwZS4gIFRoYXQgbWFrZXMgaXQgdHJpY2t5ICovCi0JLyogICB0byBkZXRlY3QgZW5kLW9mLWZpbGUgOi0oLiAgVGhpcyBzdHVwaWQgYnVnIGlzIGV2ZW4gZG9jdW1lbnRlZCAqLwotCS8qICAgaW4gdGhlIHJlYWQoMikgbWFuIHBhZ2Ugd2hlcmUgaXQgc2F5cyB0aGF0IGV2ZXJ5dGhpbmcgYnV0ICovCi0JLyogICBwaXBlcyByZXR1cm4gLTEgYW5kIEVBR0FJTi4gIFRoYXQgbWFrZXMgaXQgYSBmZWF0dXJlLCByaWdodD8gKi8KLQlpbnQgYWZ0ZXJzZWxlY3QgPSAwOwotI2VuZGlmCi0gICAgICAgIGlmICgobGVuZ3RoID4gMCkgJiYgKHRvdGFsX2J5dGVzX3NlbnQgKyBJT0JVRlNJWkUpID4gbGVuZ3RoKQotICAgICAgICAgICAgbGVuID0gbGVuZ3RoIC0gdG90YWxfYnl0ZXNfc2VudDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbGVuID0gSU9CVUZTSVpFOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIG4gPSBhcF9icmVhZChmYiwgYnVmLCBsZW4pOwotI2lmZGVmIE5ERUxBWV9QSVBFX1JFVFVSTlNfWkVSTwotCSAgICBpZiAoKG4gPiAwKSB8fCAobiA9PSAwICYmIGFmdGVyc2VsZWN0KSkKLQkJYnJlYWs7Ci0jZWxzZQotICAgICAgICAgICAgaWYgKG4gPj0gMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKHItPmNvbm5lY3Rpb24tPmFib3J0ZWQpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpZiAobiA8IDAgJiYgZXJybm8gIT0gRUFHQUlOKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiB3ZSBuZWVkIHRvIGJsb2NrLCBzbyBmbHVzaCB0aGUgb3V0cHV0IGZpcnN0ICovCi0gICAgICAgICAgICBpZiAoYXBfYmZsdXNoKHItPmNvbm5lY3Rpb24tPmNsaWVudCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19JTkZPLCByLAotICAgICAgICAgICAgICAgICAgICAiY2xpZW50IHN0b3BwZWQgY29ubmVjdGlvbiBiZWZvcmUgc2VuZCBib2R5IGNvbXBsZXRlZCIpOwotICAgICAgICAgICAgICAgIGFwX2JzZXRmbGFnKHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQl9FT1VULCAxKTsKLSAgICAgICAgICAgICAgICByLT5jb25uZWN0aW9uLT5hYm9ydGVkID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZEX1NFVChmZCwgJmZkcyk7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogd2UgZG9uJ3QgY2FyZSB3aGF0IHNlbGVjdCBzYXlzLCB3ZSBtaWdodCBhcyB3ZWxsIGxvb3AgYmFjawotICAgICAgICAgICAgICogYXJvdW5kIGFuZCB0cnkgYW5vdGhlciByZWFkCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGFwX3NlbGVjdChmZCArIDEsICZmZHMsIE5VTEwsIE5VTEwsIE5VTEwpOwotI2lmZGVmIE5ERUxBWV9QSVBFX1JFVFVSTlNfWkVSTwotCSAgICBhZnRlcnNlbGVjdCA9IDE7Ci0jZW5kaWYKLSAgICAgICAgfSB3aGlsZSAoIXItPmNvbm5lY3Rpb24tPmFib3J0ZWQpOwotCi0gICAgICAgIGlmIChuIDwgMSB8fCByLT5jb25uZWN0aW9uLT5hYm9ydGVkKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBvID0gMDsKLQotICAgICAgICB3aGlsZSAobiAmJiAhci0+Y29ubmVjdGlvbi0+YWJvcnRlZCkgewotICAgICAgICAgICAgdyA9IGFwX2J3cml0ZShyLT5jb25uZWN0aW9uLT5jbGllbnQsICZidWZbb10sIG4pOwotICAgICAgICAgICAgaWYgKHcgPiAwKSB7Ci0gICAgICAgICAgICAgICAgYXBfcmVzZXRfdGltZW91dChyKTsgLyogcmVzZXQgdGltZW91dCBhZnRlciBzdWNjZXNzZnVsIHdyaXRlICovCi0gICAgICAgICAgICAgICAgdG90YWxfYnl0ZXNfc2VudCArPSB3OwotICAgICAgICAgICAgICAgIG4gLT0gdzsKLSAgICAgICAgICAgICAgICBvICs9IHc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh3IDwgMCkgewotICAgICAgICAgICAgICAgIGlmICghci0+Y29ubmVjdGlvbi0+YWJvcnRlZCkgewotICAgICAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0lORk8sIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICJjbGllbnQgc3RvcHBlZCBjb25uZWN0aW9uIGJlZm9yZSBzZW5kIGJvZHkgY29tcGxldGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIGFwX2JzZXRmbGFnKHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQl9FT1VULCAxKTsKLSAgICAgICAgICAgICAgICAgICAgci0+Y29ubmVjdGlvbi0+YWJvcnRlZCA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXBfa2lsbF90aW1lb3V0KHIpOwotICAgIFNFVF9CWVRFU19TRU5UKHIpOwotICAgIHJldHVybiB0b3RhbF9ieXRlc19zZW50OwotfQotCi0KLQotLyogVGhlIGNvZGUgd3JpdGVzIE1NQVBfU0VHTUVOVF9TSVpFIGJ5dGVzIGF0IGEgdGltZS4gIFRoaXMgaXMgZHVlIHRvIEFwYWNoZSdzCi0gKiB0aW1lb3V0IG1vZGVsLCB3aGljaCBpcyBhIHRpbWVvdXQgcGVyLXdyaXRlIHJhdGhlciB0aGFuIGEgdGltZSBmb3IgdGhlCi0gKiBlbnRpcmUgdHJhbnNhY3Rpb24gdG8gY29tcGxldGUuICBFc3NlbnRpYWxseSB0aGlzIHNob3VsZCBiZSBzbWFsbCBlbm91Z2gKLSAqIHNvIHRoYXQgaW4gb25lIFRpbWVvdXQgcGVyaW9kLCB5b3VyIHNsb3dlc3QgY2xpZW50cyBzaG91bGQgYmUgcmVhc29uYWJseQotICogYWJsZSB0byByZWNlaXZlIHRoaXMgbWFueSBieXRlcy4KLSAqCi0gKiBUbyB0YWtlIGFkdmFudGFnZSBvZiB6ZXJvLWNvcHkgVENQIHVuZGVyIFNvbGFyaXMgMi42IHRoaXMgc2hvdWxkIGJlIGEKLSAqIG11bHRpcGxlIG9mIDE2ay4gIChBbmQgeW91IG5lZWQgYSBTdW5BVE0yLjAgbmV0d29yayBjYXJkLikKLSAqLwotI2lmbmRlZiBNTUFQX1NFR01FTlRfU0laRQotI2RlZmluZSBNTUFQX1NFR01FTlRfU0laRSAgICAgICAzMjc2OAotI2VuZGlmCi0KLS8qIHNlbmQgZGF0YSBmcm9tIGFuIGluLW1lbW9yeSBidWZmZXIgKi8KLUFQSV9FWFBPUlQoc2l6ZV90KSBhcF9zZW5kX21tYXAodm9pZCAqbW0sIHJlcXVlc3RfcmVjICpyLCBzaXplX3Qgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKQotewotICAgIHNpemVfdCB0b3RhbF9ieXRlc19zZW50ID0gMDsKLSAgICBpbnQgbiwgdzsKLQotICAgIGlmIChsZW5ndGggPT0gMCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBhcF9zb2Z0X3RpbWVvdXQoInNlbmQgbW1hcCIsIHIpOwotCi0gICAgbGVuZ3RoICs9IG9mZnNldDsKLSAgICB3aGlsZSAoIXItPmNvbm5lY3Rpb24tPmFib3J0ZWQgJiYgb2Zmc2V0IDwgbGVuZ3RoKSB7Ci0gICAgICAgIGlmIChsZW5ndGggLSBvZmZzZXQgPiBNTUFQX1NFR01FTlRfU0laRSkgewotICAgICAgICAgICAgbiA9IE1NQVBfU0VHTUVOVF9TSVpFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgbiA9IGxlbmd0aCAtIG9mZnNldDsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChuICYmICFyLT5jb25uZWN0aW9uLT5hYm9ydGVkKSB7Ci0gICAgICAgICAgICB3ID0gYXBfYndyaXRlKHItPmNvbm5lY3Rpb24tPmNsaWVudCwgKGNoYXIgKikgbW0gKyBvZmZzZXQsIG4pOwotICAgICAgICAgICAgaWYgKHcgPiAwKSB7Ci0gICAgICAgICAgICAgICAgYXBfcmVzZXRfdGltZW91dChyKTsgLyogcmVzZXQgdGltZW91dCBhZnRlciBzdWNjZXNzZnVsIHdyaXRlICovCi0gICAgICAgICAgICAgICAgdG90YWxfYnl0ZXNfc2VudCArPSB3OwotICAgICAgICAgICAgICAgIG4gLT0gdzsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gdzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHcgPCAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFyLT5jb25uZWN0aW9uLT5hYm9ydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfSU5GTywgciwKLSAgICAgICAgICAgICAgICAgICAgICAgImNsaWVudCBzdG9wcGVkIGNvbm5lY3Rpb24gYmVmb3JlIHNlbmQgbW1hcCBjb21wbGV0ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgYXBfYnNldGZsYWcoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCX0VPVVQsIDEpOwotICAgICAgICAgICAgICAgICAgICByLT5jb25uZWN0aW9uLT5hYm9ydGVkID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBhcF9raWxsX3RpbWVvdXQocik7Ci0gICAgU0VUX0JZVEVTX1NFTlQocik7Ci0gICAgcmV0dXJuIHRvdGFsX2J5dGVzX3NlbnQ7Ci19Ci0KLUFQSV9FWFBPUlQoaW50KSBhcF9ycHV0YyhpbnQgYywgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaWYgKHItPmNvbm5lY3Rpb24tPmFib3J0ZWQpCi0gICAgICAgIHJldHVybiBFT0Y7Ci0KLSAgICBpZiAoYXBfYnB1dGMoYywgci0+Y29ubmVjdGlvbi0+Y2xpZW50KSA8IDApIHsKLSAgICAgICAgaWYgKCFyLT5jb25uZWN0aW9uLT5hYm9ydGVkKSB7Ci0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0lORk8sIHIsCi0gICAgICAgICAgICAgICAgImNsaWVudCBzdG9wcGVkIGNvbm5lY3Rpb24gYmVmb3JlIHJwdXRjIGNvbXBsZXRlZCIpOwotICAgICAgICAgICAgYXBfYnNldGZsYWcoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCX0VPVVQsIDEpOwotICAgICAgICAgICAgci0+Y29ubmVjdGlvbi0+YWJvcnRlZCA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEVPRjsKLSAgICB9Ci0gICAgU0VUX0JZVEVTX1NFTlQocik7Ci0gICAgcmV0dXJuIGM7Ci19Ci0KLUFQSV9FWFBPUlQoaW50KSBhcF9ycHV0cyhjb25zdCBjaGFyICpzdHIsIHJlcXVlc3RfcmVjICpyKQotewotICAgIGludCByY29kZTsKLQotICAgIGlmIChyLT5jb25uZWN0aW9uLT5hYm9ydGVkKQotICAgICAgICByZXR1cm4gRU9GOwotICAgIAotICAgIHJjb2RlID0gYXBfYnB1dHMoc3RyLCByLT5jb25uZWN0aW9uLT5jbGllbnQpOwotICAgIGlmIChyY29kZSA8IDApIHsKLSAgICAgICAgaWYgKCFyLT5jb25uZWN0aW9uLT5hYm9ydGVkKSB7Ci0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0lORk8sIHIsCi0gICAgICAgICAgICAgICAgImNsaWVudCBzdG9wcGVkIGNvbm5lY3Rpb24gYmVmb3JlIHJwdXRzIGNvbXBsZXRlZCIpOwotICAgICAgICAgICAgYXBfYnNldGZsYWcoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCX0VPVVQsIDEpOwotICAgICAgICAgICAgci0+Y29ubmVjdGlvbi0+YWJvcnRlZCA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEVPRjsKLSAgICB9Ci0gICAgU0VUX0JZVEVTX1NFTlQocik7Ci0gICAgcmV0dXJuIHJjb2RlOwotfQotCi1BUElfRVhQT1JUKGludCkgYXBfcndyaXRlKGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG5ieXRlLCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpbnQgbjsKLQotICAgIGlmIChyLT5jb25uZWN0aW9uLT5hYm9ydGVkKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBuID0gYXBfYndyaXRlKHItPmNvbm5lY3Rpb24tPmNsaWVudCwgYnVmLCBuYnl0ZSk7Ci0gICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgIGlmICghci0+Y29ubmVjdGlvbi0+YWJvcnRlZCkgewotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19JTkZPLCByLAotICAgICAgICAgICAgICAgICJjbGllbnQgc3RvcHBlZCBjb25uZWN0aW9uIGJlZm9yZSByd3JpdGUgY29tcGxldGVkIik7Ci0gICAgICAgICAgICBhcF9ic2V0ZmxhZyhyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJfRU9VVCwgMSk7Ci0gICAgICAgICAgICByLT5jb25uZWN0aW9uLT5hYm9ydGVkID0gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIFNFVF9CWVRFU19TRU5UKHIpOwotICAgIHJldHVybiBuOwotfQotCi1BUElfRVhQT1JUKGludCkgYXBfdnJwcmludGYocmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKLXsKLSAgICBpbnQgbjsKLQotICAgIGlmIChyLT5jb25uZWN0aW9uLT5hYm9ydGVkKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBuID0gYXBfdmJwcmludGYoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBmbXQsIGFwKTsKLQotICAgIGlmIChuIDwgMCkgewotICAgICAgICBpZiAoIXItPmNvbm5lY3Rpb24tPmFib3J0ZWQpIHsKLSAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfSU5GTywgciwKLSAgICAgICAgICAgICAgICAiY2xpZW50IHN0b3BwZWQgY29ubmVjdGlvbiBiZWZvcmUgdnJwcmludGYgY29tcGxldGVkIik7Ci0gICAgICAgICAgICBhcF9ic2V0ZmxhZyhyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJfRU9VVCwgMSk7Ci0gICAgICAgICAgICByLT5jb25uZWN0aW9uLT5hYm9ydGVkID0gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIFNFVF9CWVRFU19TRU5UKHIpOwotICAgIHJldHVybiBuOwotfQotCi1BUElfRVhQT1JUKGludCkgYXBfcnByaW50ZihyZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqZm10LC4uLikKLXsKLSAgICB2YV9saXN0IHZsaXN0OwotICAgIGludCBuOwotCi0gICAgaWYgKHItPmNvbm5lY3Rpb24tPmFib3J0ZWQpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIHZhX3N0YXJ0KHZsaXN0LCBmbXQpOwotICAgIG4gPSBhcF92YnByaW50ZihyLT5jb25uZWN0aW9uLT5jbGllbnQsIGZtdCwgdmxpc3QpOwotICAgIHZhX2VuZCh2bGlzdCk7Ci0KLSAgICBpZiAobiA8IDApIHsKLSAgICAgICAgaWYgKCFyLT5jb25uZWN0aW9uLT5hYm9ydGVkKSB7Ci0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0lORk8sIHIsCi0gICAgICAgICAgICAgICAgImNsaWVudCBzdG9wcGVkIGNvbm5lY3Rpb24gYmVmb3JlIHJwcmludGYgY29tcGxldGVkIik7Ci0gICAgICAgICAgICBhcF9ic2V0ZmxhZyhyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJfRU9VVCwgMSk7Ci0gICAgICAgICAgICByLT5jb25uZWN0aW9uLT5hYm9ydGVkID0gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIFNFVF9CWVRFU19TRU5UKHIpOwotICAgIHJldHVybiBuOwotfQotCi1BUElfRVhQT1JUX05PTlNURChpbnQpIGFwX3J2cHV0cyhyZXF1ZXN0X3JlYyAqciwuLi4pCi17Ci0gICAgdmFfbGlzdCBhcmdzOwotICAgIGludCBpLCBqLCBrOwotICAgIGNvbnN0IGNoYXIgKng7Ci0gICAgQlVGRiAqZmIgPSByLT5jb25uZWN0aW9uLT5jbGllbnQ7Ci0KLSAgICBpZiAoci0+Y29ubmVjdGlvbi0+YWJvcnRlZCkKLSAgICAgICAgcmV0dXJuIEVPRjsKLQotICAgIHZhX3N0YXJ0KGFyZ3MsIHIpOwotICAgIGZvciAoayA9IDA7OykgewotICAgICAgICB4ID0gdmFfYXJnKGFyZ3MsIGNvbnN0IGNoYXIgKik7Ci0gICAgICAgIGlmICh4ID09IE5VTEwpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaiA9IHN0cmxlbih4KTsKLSAgICAgICAgaSA9IGFwX2J3cml0ZShmYiwgeCwgaik7Ci0gICAgICAgIGlmIChpICE9IGopIHsKLSAgICAgICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgICAgIGlmICghci0+Y29ubmVjdGlvbi0+YWJvcnRlZCkgewotICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfSU5GTywgciwKLSAgICAgICAgICAgICAgICAgICAgImNsaWVudCBzdG9wcGVkIGNvbm5lY3Rpb24gYmVmb3JlIHJ2cHV0cyBjb21wbGV0ZWQiKTsKLSAgICAgICAgICAgICAgICBhcF9ic2V0ZmxhZyhyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJfRU9VVCwgMSk7Ci0gICAgICAgICAgICAgICAgci0+Y29ubmVjdGlvbi0+YWJvcnRlZCA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRU9GOwotICAgICAgICB9Ci0gICAgICAgIGsgKz0gaTsKLSAgICB9Ci0gICAgdmFfZW5kKGFyZ3MpOwotCi0gICAgU0VUX0JZVEVTX1NFTlQocik7Ci0gICAgcmV0dXJuIGs7Ci19Ci0KLUFQSV9FWFBPUlQoaW50KSBhcF9yZmx1c2gocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaWYgKGFwX2JmbHVzaChyLT5jb25uZWN0aW9uLT5jbGllbnQpIDwgMCkgewotICAgICAgICBpZiAoIXItPmNvbm5lY3Rpb24tPmFib3J0ZWQpIHsKLSAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfSU5GTywgciwKLSAgICAgICAgICAgICAgICAiY2xpZW50IHN0b3BwZWQgY29ubmVjdGlvbiBiZWZvcmUgcmZsdXNoIGNvbXBsZXRlZCIpOwotICAgICAgICAgICAgYXBfYnNldGZsYWcoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCX0VPVVQsIDEpOwotICAgICAgICAgICAgci0+Y29ubmVjdGlvbi0+YWJvcnRlZCA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEVPRjsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFdlIHNob3VsZCBoYXZlIG5hbWVkIHRoaXMgc2VuZF9jYW5uZWRfcmVzcG9uc2UsIHNpbmNlIGl0IGlzIHVzZWQgZm9yIGFueQotICogcmVzcG9uc2UgdGhhdCBjYW4gYmUgZ2VuZXJhdGVkIGJ5IHRoZSBzZXJ2ZXIgZnJvbSB0aGUgcmVxdWVzdCByZWNvcmQuCi0gKiBUaGlzIGluY2x1ZGVzIGFsbCAyMDQgKG5vIGNvbnRlbnQpLCAzeHggKHJlZGlyZWN0KSwgNHh4IChjbGllbnQgZXJyb3IpLAotICogYW5kIDV4eCAoc2VydmVyIGVycm9yKSBtZXNzYWdlcyB0aGF0IGhhdmUgbm90IGJlZW4gcmVkaXJlY3RlZCB0byBhbm90aGVyCi0gKiBoYW5kbGVyIHZpYSB0aGUgRXJyb3JEb2N1bWVudCBmZWF0dXJlLgotICovCi12b2lkIGFwX3NlbmRfZXJyb3JfcmVzcG9uc2UocmVxdWVzdF9yZWMgKnIsIGludCByZWN1cnNpdmVfZXJyb3IpCi17Ci0gICAgaW50IHN0YXR1cyA9IHItPnN0YXR1czsKLSAgICBpbnQgaWR4ID0gYXBfaW5kZXhfb2ZfcmVzcG9uc2Uoc3RhdHVzKTsKLSAgICBjaGFyICpjdXN0b21fcmVzcG9uc2U7Ci0gICAgY29uc3QgY2hhciAqbG9jYXRpb24gPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19vdXQsICJMb2NhdGlvbiIpOwotCi0gICAgLyoKLSAgICAgKiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIExvY2F0aW9uIGZpZWxkIG1pZ2h0IGJlIGluIHItPmVycl9oZWFkZXJzX291dAotICAgICAqIGluc3RlYWQgb2Ygci0+aGVhZGVyc19vdXQ7IHVzZSB0aGUgbGF0dGVyIGlmIHBvc3NpYmxlLCBlbHNlIHRoZQotICAgICAqIGZvcm1lci4KLSAgICAgKi8KLSAgICBpZiAobG9jYXRpb24gPT0gTlVMTCkgewotCWxvY2F0aW9uID0gYXBfdGFibGVfZ2V0KHItPmVycl9oZWFkZXJzX291dCwgIkxvY2F0aW9uIik7Ci0gICAgfQotICAgIC8qIFdlIG5lZWQgdG8gc3BlY2lhbC1jYXNlIHRoZSBoYW5kbGluZyBvZiAyMDQgYW5kIDMwNCByZXNwb25zZXMsCi0gICAgICogc2luY2UgdGhleSBoYXZlIHNwZWNpZmljIEhUVFAgcmVxdWlyZW1lbnRzIGFuZCBkbyBub3QgaW5jbHVkZSBhCi0gICAgICogbWVzc2FnZSBib2R5LiAgTm90ZSB0aGF0IGJlaW5nIGFzc2JhY2t3YXJkcyBoZXJlIGlzIG5vdCBhbiBvcHRpb24uCi0gICAgICovCi0gICAgaWYgKHN0YXR1cyA9PSBIVFRQX05PVF9NT0RJRklFRCkgewotICAgICAgICBpZiAoIWFwX2lzX2VtcHR5X3RhYmxlKHItPmVycl9oZWFkZXJzX291dCkpCi0gICAgICAgICAgICByLT5oZWFkZXJzX291dCA9IGFwX292ZXJsYXlfdGFibGVzKHItPnBvb2wsIHItPmVycl9oZWFkZXJzX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+aGVhZGVyc19vdXQpOwotICAgICAgICBhcF9oYXJkX3RpbWVvdXQoInNlbmQgMzA0Iiwgcik7Ci0KLSAgICAgICAgYXBfYmFzaWNfaHR0cF9oZWFkZXIocik7Ci0gICAgICAgIGFwX3NldF9rZWVwYWxpdmUocik7Ci0KLSAgICAgICAgYXBfdGFibGVfZG8oKGludCAoKikodm9pZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpIGFwX3NlbmRfaGVhZGVyX2ZpZWxkLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSByLCByLT5oZWFkZXJzX291dCwKLSAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24iLAotICAgICAgICAgICAgICAgICAgICAiS2VlcC1BbGl2ZSIsCi0gICAgICAgICAgICAgICAgICAgICJFVGFnIiwKLSAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQtTG9jYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAiRXhwaXJlcyIsCi0gICAgICAgICAgICAgICAgICAgICJDYWNoZS1Db250cm9sIiwKLSAgICAgICAgICAgICAgICAgICAgIlZhcnkiLAotICAgICAgICAgICAgICAgICAgICAiV2FybmluZyIsCi0gICAgICAgICAgICAgICAgICAgICJXV1ctQXV0aGVudGljYXRlIiwKLSAgICAgICAgICAgICAgICAgICAgIlByb3h5LUF1dGhlbnRpY2F0ZSIsCi0gICAgICAgICAgICAgICAgICAgIE5VTEwpOwotCi0gICAgICAgIHRlcm1pbmF0ZV9oZWFkZXIoci0+Y29ubmVjdGlvbi0+Y2xpZW50KTsKLQotICAgICAgICBhcF9raWxsX3RpbWVvdXQocik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzID09IEhUVFBfTk9fQ09OVEVOVCkgewotICAgICAgICBhcF9zZW5kX2h0dHBfaGVhZGVyKHIpOwotICAgICAgICBhcF9maW5hbGl6ZV9yZXF1ZXN0X3Byb3RvY29sKHIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFyLT5hc3NiYWNrd2FyZHMpIHsKLSAgICAgICAgdGFibGUgKnRtcCA9IHItPmhlYWRlcnNfb3V0OwotCi0gICAgICAgIC8qIEZvciBhbGwgSFRUUC8xLnggcmVzcG9uc2VzIGZvciB3aGljaCB3ZSBnZW5lcmF0ZSB0aGUgbWVzc2FnZSwKLSAgICAgICAgICogd2UgbmVlZCB0byBhdm9pZCBpbmhlcml0aW5nIHRoZSAibm9ybWFsIHN0YXR1cyIgaGVhZGVyIGZpZWxkcwotICAgICAgICAgKiB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IHRoZSByZXF1ZXN0IGhhbmRsZXIgYmVmb3JlIHRoZQotICAgICAgICAgKiBlcnJvciBvciByZWRpcmVjdCwgZXhjZXB0IGZvciBMb2NhdGlvbiBvbiBleHRlcm5hbCByZWRpcmVjdHMuCi0gICAgICAgICAqLwotICAgICAgICByLT5oZWFkZXJzX291dCA9IHItPmVycl9oZWFkZXJzX291dDsKLSAgICAgICAgci0+ZXJyX2hlYWRlcnNfb3V0ID0gdG1wOwotICAgICAgICBhcF9jbGVhcl90YWJsZShyLT5lcnJfaGVhZGVyc19vdXQpOwotCi0gICAgICAgIGlmIChhcF9pc19IVFRQX1JFRElSRUNUKHN0YXR1cykgfHwgKHN0YXR1cyA9PSBIVFRQX0NSRUFURUQpKSB7Ci0gICAgICAgICAgICBpZiAoKGxvY2F0aW9uICE9IE5VTEwpICYmICpsb2NhdGlvbikgewotCSAgICAgICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkxvY2F0aW9uIiwgbG9jYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9jYXRpb24gPSAiIjsgICAvKiBhdm9pZHMgY29yZWR1bXAgd2hlbiBwcmludGluZywgYmVsb3cgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHItPmNvbnRlbnRfbGFuZ3VhZ2UgPSBOVUxMOwotICAgICAgICByLT5jb250ZW50X2xhbmd1YWdlcyA9IE5VTEw7Ci0gICAgICAgIHItPmNvbnRlbnRfZW5jb2RpbmcgPSBOVUxMOwotICAgICAgICByLT5jbGVuZ3RoID0gMDsKLSAgICAgICAgci0+Y29udGVudF90eXBlID0gInRleHQvaHRtbCI7Ci0KLSAgICAgICAgaWYgKChzdGF0dXMgPT0gTUVUSE9EX05PVF9BTExPV0VEKSB8fCAoc3RhdHVzID09IE5PVF9JTVBMRU1FTlRFRCkpCi0gICAgICAgICAgICBhcF90YWJsZV9zZXRuKHItPmhlYWRlcnNfb3V0LCAiQWxsb3ciLCBtYWtlX2FsbG93KHIpKTsKLQotICAgICAgICBhcF9zZW5kX2h0dHBfaGVhZGVyKHIpOwotCi0gICAgICAgIGlmIChyLT5oZWFkZXJfb25seSkgewotICAgICAgICAgICAgYXBfZmluYWxpemVfcmVxdWVzdF9wcm90b2NvbChyKTsKLSAgICAgICAgICAgIGFwX3JmbHVzaChyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGFwX2hhcmRfdGltZW91dCgic2VuZCBlcnJvciBib2R5Iiwgcik7Ci0KLSAgICBpZiAoKGN1c3RvbV9yZXNwb25zZSA9IGFwX3Jlc3BvbnNlX2NvZGVfc3RyaW5nKHIsIGlkeCkpKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFdlIGhhdmUgYSBjdXN0b20gcmVzcG9uc2Ugb3V0cHV0LiBUaGlzIHNob3VsZCBvbmx5IGJlCi0gICAgICAgICAqIGEgdGV4dC1zdHJpbmcgdG8gd3JpdGUgYmFjay4gQnV0IGlmIHRoZSBFcnJvckRvY3VtZW50Ci0gICAgICAgICAqIHdhcyBhIGxvY2FsIHJlZGlyZWN0IGFuZCB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGZhaWxlZAotICAgICAgICAgKiBmb3IgYW55IHJlYXNvbiwgdGhlIGN1c3RvbV9yZXNwb25zZSB3aWxsIHN0aWxsIGhvbGQgdGhlCi0gICAgICAgICAqIHJlZGlyZWN0IFVSTC4gV2UgZG9uJ3QgcmVhbGx5IHdhbnQgdG8gb3V0cHV0IHRoaXMgVVJMCi0gICAgICAgICAqIGFzIGEgdGV4dCBtZXNzYWdlLCBzbyBmaXJzdCBjaGVjayB0aGUgY3VzdG9tIHJlc3BvbnNlCi0gICAgICAgICAqIHN0cmluZyB0byBlbnN1cmUgdGhhdCBpdCBpcyBhIHRleHQtc3RyaW5nICh1c2luZyB0aGUKLSAgICAgICAgICogc2FtZSB0ZXN0IHVzZWQgaW4gYXBfZGllKCksIGkuZS4gZG9lcyBpdCBzdGFydCB3aXRoIGEgIikuCi0gICAgICAgICAqIElmIGl0IGRvZXNuJ3QsIHdlJ3ZlIGdvdCBhIHJlY3Vyc2l2ZSBlcnJvciwgc28gZmluZAotICAgICAgICAgKiB0aGUgb3JpZ2luYWwgZXJyb3IgYW5kIG91dHB1dCB0aGF0IGFzIHdlbGwuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoY3VzdG9tX3Jlc3BvbnNlWzBdID09ICdcIicpIHsKLSAgICAgICAgICAgIGFwX3JwdXRzKGN1c3RvbV9yZXNwb25zZSArIDEsIHIpOwotICAgICAgICAgICAgYXBfa2lsbF90aW1lb3V0KHIpOwotICAgICAgICAgICAgYXBfZmluYWxpemVfcmVxdWVzdF9wcm90b2NvbChyKTsKLSAgICAgICAgICAgIGFwX3JmbHVzaChyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvKgotICAgICAgICAgKiBSZWRpcmVjdCBmYWlsZWQsIHNvIGdldCBiYWNrIHRoZSBvcmlnaW5hbCBlcnJvcgotICAgICAgICAgKi8KLSAgICAgICAgd2hpbGUgKHItPnByZXYgJiYgKHItPnByZXYtPnN0YXR1cyAhPSBIVFRQX09LKSkKLSAgICAgICAgICAgIHIgPSByLT5wcmV2OwotICAgIH0KLSAgICB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnRpdGxlID0gc3RhdHVzX2xpbmVzW2lkeF07Ci0gICAgICAgIGNvbnN0IGNoYXIgKmgxOwotICAgICAgICBjb25zdCBjaGFyICplcnJvcl9ub3RlczsKLQotICAgICAgICAvKiBBY2NlcHQgYSBzdGF0dXNfbGluZSBzZXQgYnkgYSBtb2R1bGUsIGJ1dCBvbmx5IGlmIGl0IGJlZ2lucwotICAgICAgICAgKiB3aXRoIHRoZSAzIGRpZ2l0IHN0YXR1cyBjb2RlCi0gICAgICAgICAqLwotICAgICAgICBpZiAoci0+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+XG4iLCBOVUxMKTsKLQkgICAgfQotCSAvKgotCSAgKiBJdCB3b3VsZCBiZSBuaWNlIHRvIGdpdmUgdGhlIHVzZXIgdGhlIGluZm9ybWF0aW9uIHRoZXkgbmVlZCB0bwotCSAgKiBmaXggdGhlIHByb2JsZW0gZGlyZWN0bHkgc2luY2UgbWFueSB1c2VycyBkb24ndCBoYXZlIGFjY2VzcyB0bwotCSAgKiB0aGUgZXJyb3JfbG9nICh0aGluayBVbml2ZXJzaXR5IHNpdGVzKSBldmVuIHRob3VnaCB0aGV5IGNhbiBlYXNpbHkKLQkgICogZ2V0IHRoaXMgZXJyb3IgYnkgbWlzY29uZmlndXJpbmcgYW4gaHRhY2Nlc3MgZmlsZS4gIEhvd2V2ZXIsIHRoZQotCSAgKiBlcnJvciBub3RlcyB0ZW5kIHRvIGluY2x1ZGUgdGhlIHJlYWwgZmlsZSBwYXRobmFtZSBpbiB0aGlzIGNhc2UsCi0JICAqIHdoaWNoIHNvbWUgcGVvcGxlIGNvbnNpZGVyIHRvIGJlIGEgYnJlYWNoIG9mIHByaXZhY3kuICBVbnRpbCB3ZQotCSAgKiBjYW4gZmlndXJlIG91dCBhIHdheSB0byByZW1vdmUgdGhlIHBhdGhuYW1lLCBsZWF2ZSB0aGlzIGNvbW1lbnRlZC4KLQkgICoKLQkgICogaWYgKChlcnJvcl9ub3RlcyA9IGFwX3RhYmxlX2dldChyLT5ub3RlcywgImVycm9yLW5vdGVzIikpICE9IE5VTEwpIHsKLQkgICogICAgIGFwX3J2cHV0cyhyLCBlcnJvcl9ub3RlcywgIjxQPlxuIiwgTlVMTCk7Ci0JICAqIH0KLQkgICovCi0JICAgIGJyZWFrOwotCX0KLQotICAgICAgICBpZiAocmVjdXJzaXZlX2Vycm9yKSB7Ci0gICAgICAgICAgICBhcF9ydnB1dHMociwgIjxQPkFkZGl0aW9uYWxseSwgYSAiLAotICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c19saW5lc1thcF9pbmRleF9vZl9yZXNwb25zZShyZWN1cnNpdmVfZXJyb3IpXSwKLSAgICAgICAgICAgICAgICAgICAgICAiXG5lcnJvciB3YXMgZW5jb3VudGVyZWQgd2hpbGUgdHJ5aW5nIHRvIHVzZSBhbiAiCi0gICAgICAgICAgICAgICAgICAgICAgIkVycm9yRG9jdW1lbnQgdG8gaGFuZGxlIHRoZSByZXF1ZXN0LlxuIiwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXBfcnB1dHMoYXBfcHNpZ25hdHVyZSgiPEhSPlxuIiwgciksIHIpOwotICAgICAgICBhcF9ycHV0cygiPC9CT0RZPjwvSFRNTD5cbiIsIHIpOwotICAgIH0KLSAgICBhcF9raWxsX3RpbWVvdXQocik7Ci0gICAgYXBfZmluYWxpemVfcmVxdWVzdF9wcm90b2NvbChyKTsKLSAgICBhcF9yZmx1c2gocik7Ci19CmRpZmYgLS1naXQgYS9tb2R1bGVzL2h0dHAvaHR0cF9yZXF1ZXN0LmMgYi9tb2R1bGVzL2h0dHAvaHR0cF9yZXF1ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNGQ0NWYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9odHRwL2h0dHBfcmVxdWVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM3NCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIGh0dHBfcmVxdWVzdC5jOiBmdW5jdGlvbnMgdG8gZ2V0IGFuZCBwcm9jZXNzIHJlcXVlc3RzCi0gKgotICogUm9iIE1jQ29vbCAzLzIxLzkzCi0gKgotICogVGhvcm91Z2hseSByZXZhbXBlZCBieSByc3QgZm9yIEFwYWNoZS4gIE5CIHRoaXMgZmlsZSByZWFkcwotICogYmVzdCBmcm9tIHRoZSBib3R0b20gdXAuCi0gKgotICovCi0KLSNkZWZpbmUgQ09SRV9QUklWQVRFCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfcmVxdWVzdC5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZfZ2xvYmFscy5oIgkvKiBmb3IgYXBfZXh0ZW5kZWRfc3RhdHVzICovCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX21haW4uaCIKLSNpbmNsdWRlICJzY29yZWJvYXJkLmgiCi0jaW5jbHVkZSAiZm5tYXRjaC5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBHZXR0aW5nIGFuZCBjaGVja2luZyBkaXJlY3RvcnkgY29uZmlndXJhdGlvbi4gIEFsc28gY2hlY2tzIHRoZQotICogRm9sbG93U3ltbGlua3MgYW5kIEZvbGxvd1N5bU93bmVyIHN0dWZmLCBzaW5jZSB0aGlzIGlzIHJlYWxseSB0aGUKLSAqIG9ubHkgcGxhY2UgdGhhdCBjYW4gaGFwcGVuIChiYXJyaW5nIGEgbmV3IG1pZF9kaXJfd2FsayBjYWxsb3V0KS4KLSAqCi0gKiBXZSBjYW4ndCBkbyBpdCBhcyBhbiBhY2Nlc3NfY2hlY2tlciBtb2R1bGUgZnVuY3Rpb24gd2hpY2ggZ2V0cwotICogY2FsbGVkIHdpdGggdGhlIGZpbmFsIHBlcl9kaXJfY29uZmlnLCBzaW5jZSB3ZSBjb3VsZCBoYXZlIGEgZGlyZWN0b3J5Ci0gKiB3aXRoIEZvbGxvd1N5bUxpbmtzIGRpc2FibGVkLCB3aGljaCBjb250YWlucyBhIHN5bWxpbmsgdG8gYW5vdGhlcgotICogd2l0aCBhIC5odGFjY2VzcyBmaWxlIHdoaWNoIHR1cm5zIEZvbGxvd1N5bUxpbmtzIGJhY2sgb24gLS0tIGFuZAotICogYWNjZXNzIGluIHN1Y2ggYSBjYXNlIG11c3QgYmUgZGVuaWVkLiAgU28sIHdoYXRldmVyIGl0IGlzIHRoYXQKLSAqIGNoZWNrcyBGb2xsb3dTeW1MaW5rcyBuZWVkcyB0byBrbm93IHRoZSBzdGF0ZSBvZiB0aGUgb3B0aW9ucyBhcwotICogdGhleSBjaGFuZ2UsIGFsbCB0aGUgd2F5IGRvd24uCi0gKi8KLQotLyoKLSAqIFdlIGRvbid0IHdhbnQgcGVvcGxlIGFibGUgdG8gc2VydmUgdXAgcGlwZXMsIG9yIHVuaXggc29ja2V0cywgb3Igb3RoZXIKLSAqIHNjYXJ5IHRoaW5ncy4gIE5vdGUgdGhhdCBzeW1saW5rIHRlc3RzIGFyZSBwZXJmb3JtZWQgbGF0ZXIuCi0gKi8KLXN0YXRpYyBpbnQgY2hlY2tfc2FmZV9maWxlKHJlcXVlc3RfcmVjICpyKQotewotICAgIGlmIChyLT5maW5mby5zdF9tb2RlID09IDAgICAgICAgICAvKiBkb2Vzbid0IGV4aXN0ICovCi0gICAgICAgIHx8IFNfSVNESVIoci0+ZmluZm8uc3RfbW9kZSkKLSAgICAgICAgfHwgU19JU1JFRyhyLT5maW5mby5zdF9tb2RlKQotICAgICAgICB8fCBTX0lTTE5LKHItPmZpbmZvLnN0X21vZGUpKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAib2JqZWN0IGlzIG5vdCBhIGZpbGUsIGRpcmVjdG9yeSBvciBzeW1saW5rOiAlcyIsCi0gICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUpOwotICAgIHJldHVybiBIVFRQX0ZPUkJJRERFTjsKLX0KLQotCi1zdGF0aWMgaW50IGNoZWNrX3N5bWxpbmtzKGNoYXIgKmQsIGludCBvcHRzKQotewotI2lmIGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTjMyKQotICAgIC8qIE9TLzIgZG9lc24ndCBoYXZlIHN5bWxpbmtzICovCi0gICAgcmV0dXJuIE9LOwotI2Vsc2UKLSAgICBzdHJ1Y3Qgc3RhdCBsZmksIGZpOwotICAgIGNoYXIgKmxhc3RwOwotICAgIGludCByZXM7Ci0KLSAgICBpZiAob3B0cyAmIE9QVF9TWU1fTElOS1MpCi0gICAgICAgIHJldHVybiBPSzsKLQotICAgIC8qCi0gICAgICogU3RyaXAgdHJhaWxpbmcgJy8nLCBpZiBhbnksIG9mZiB3aGF0IHdlJ3JlIGNoZWNraW5nOyB0cmFpbGluZyBzbGFzaGVzCi0gICAgICogbWFrZSBzb21lIHN5c3RlbXMgZm9sbG93IHN5bWxpbmtzIHRvIGRpcmVjdG9yaWVzIGV2ZW4gaW4gbHN0YXQoKS4KLSAgICAgKiBBZnRlciB3ZSd2ZSBkb25lIHRoZSBsc3RhdCwgcHV0IGl0IGJhY2suICBBbHNvLCBkb24ndCBib3RoZXIgY2hlY2tpbmcKLSAgICAgKiAnLycgYXQgYWxsLi4uCi0gICAgICogCi0gICAgICogTm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgbXVsdGlwbGUgc2xhc2hlcyBoZXJlIGJlY2F1c2Ugb2YKLSAgICAgKiBubzJzbGFzaCgpIGJlbG93Li4uCi0gICAgICovCi0KLSAgICBsYXN0cCA9IGQgKyBzdHJsZW4oZCkgLSAxOwotICAgIGlmIChsYXN0cCA9PSBkKQotICAgICAgICByZXR1cm4gT0s7ICAgICAgICAgICAgICAvKiBSb290IGRpcmVjdG9yeSwgJy8nICovCi0KLSAgICBpZiAoKmxhc3RwID09ICcvJykKLSAgICAgICAgKmxhc3RwID0gJ1wwJzsKLSAgICBlbHNlCi0gICAgICAgIGxhc3RwID0gTlVMTDsKLQotICAgIHJlcyA9IGxzdGF0KGQsICZsZmkpOwotCi0gICAgaWYgKGxhc3RwKQotICAgICAgICAqbGFzdHAgPSAnLyc7Ci0KLSAgICAvKgotICAgICAqIE5vdGUgdGhhdCB3ZSBkb24ndCByZWplY3QgYWNjZXNzZXMgdG8gbm9uZXhpc3RlbnQgZmlsZXMgKG11bHRpdmlld3Mgb3IKLSAgICAgKiB0aGUgbGlrZSBtYXkgY29ucyB1cCBhIHdheSB0byBydW4gdGhlIHRyYW5zYWN0aW9uIGFueXdheSkuLi4KLSAgICAgKi8KLQotICAgIGlmICghKHJlcyA+PSAwKSB8fCAhU19JU0xOSyhsZmkuc3RfbW9kZSkpCi0gICAgICAgIHJldHVybiBPSzsKLQotICAgIC8qIE9LLCBpdCdzIGEgc3ltbGluay4gIE1heSBzdGlsbCBiZSBPSyB3aXRoIE9QVF9TWU1fT1dORVIgKi8KLQotICAgIGlmICghKG9wdHMgJiBPUFRfU1lNX09XTkVSKSkKLSAgICAgICAgcmV0dXJuIEhUVFBfRk9SQklEREVOOwotCi0gICAgaWYgKHN0YXQoZCwgJmZpKSA8IDApCi0gICAgICAgIHJldHVybiBIVFRQX0ZPUkJJRERFTjsKLQotICAgIHJldHVybiAoZmkuc3RfdWlkID09IGxmaS5zdF91aWQpID8gT0sgOiBIVFRQX0ZPUkJJRERFTjsKLQotI2VuZGlmCi19Ci0KLS8qIERlYWxpbmcgd2l0aCB0aGUgZmlsZSBzeXN0ZW0gdG8gZ2V0IFBBVEhfSU5GTwotICovCi1zdGF0aWMgaW50IGdldF9wYXRoX2luZm8ocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY2hhciAqY3A7Ci0gICAgY2hhciAqcGF0aCA9IHItPmZpbGVuYW1lOwotICAgIGNoYXIgKmVuZCA9ICZwYXRoW3N0cmxlbihwYXRoKV07Ci0gICAgY2hhciAqbGFzdF9jcCA9IE5VTEw7Ci0gICAgaW50IHJ2OwotI2lmZGVmIEhBVkVfRFJJVkVfTEVUVEVSUwotICAgIGNoYXIgYlN0cmlwU2xhc2g9MTsKLSNlbmRpZgotCi0gICAgaWYgKHItPmZpbmZvLnN0X21vZGUpIHsKLQkvKiBhc3N1bWUgcGF0aF9pbmZvIGFscmVhZHkgc2V0ICovCi0JcmV0dXJuIE9LOwotICAgIH0KLQotI2lmZGVmIEhBVkVfRFJJVkVfTEVUVEVSUwotICAgIC8qIElmIHRoZSBkaXJlY3RvcnkgaXMgeDpcLCB0aGVuIHdlIGRvbid0IHdhbnQgdG8gc3RyaXAKLSAgICAgKiB0aGUgdHJhaWxpbmcgc2xhc2ggc2luY2UgeDogaXMgbm90IGEgdmFsaWQgZGlyZWN0b3J5LgotICAgICAqLwotICAgIGlmIChzdHJsZW4ocGF0aCkgPT0gMyAmJiBwYXRoWzFdID09ICc6JyAmJiBwYXRoWzJdID09ICcvJykKLSAgICAgICAgYlN0cmlwU2xhc2ggPSAwOwotCi0KLSAgICAvKiBJZiBVTkMgbmFtZSA9PSAvL21hY2hpbmUvc2hhcmUvLCBkbyBub3QgCi0gICAgICogYWR2YW5jZSBvdmVyIHRoZSB0cmFpbGluZyBzbGFzaC4gIEFueSBvdGhlcgotICAgICAqIFVOQyBuYW1lIGlzIE9LIHRvIHN0cmlwIHRoZSBzbGFzaC4KLSAgICAgKi8KLSAgICBjcCA9IGVuZDsKLSAgICBpZiAoc3RybGVuKHBhdGgpID4gMiAmJiBwYXRoWzBdID09ICcvJyAmJiBwYXRoWzFdID09ICcvJyAmJiAKLSAgICAgICAgcGF0aFsyXSAhPSAnLycgJiYgY3BbLTFdID09ICcvJykgewotICAgICAgICBjaGFyICpwOwotICAgICAgICBpbnQgaUNvdW50PTA7Ci0gICAgICAgIHAgPSBwYXRoOwotICAgICAgICB3aGlsZSAocCA9IHN0cmNocihwLCcvJykpIHsKLSAgICAgICAgICAgIHArKzsKLSAgICAgICAgICAgIGlDb3VudCsrOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIGlmIChpQ291bnQgPT0gNCkKLSAgICAgICAgICAgIGJTdHJpcFNsYXNoID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoYlN0cmlwU2xhc2gpCi0jZW5kaWYKLSAgICAgICAgLyogQWR2YW5jZSBvdmVyIHRyYWlsaW5nIHNsYXNoZXMgLi4uIE5PVCBwYXJ0IG9mIGZpbGVuYW1lIAotICAgICAgICAgKiBpZiBmaWxlIGlzIG5vdCBhIFVOQyBuYW1lIChXaW4zMiBvbmx5KS4KLSAgICAgICAgICovCi0gICAgICAgIGZvciAoY3AgPSBlbmQ7IGNwID4gcGF0aCAmJiBjcFstMV0gPT0gJy8nOyAtLWNwKQotICAgICAgICAgICAgY29udGludWU7Ci0KLQotICAgIHdoaWxlIChjcCA+IHBhdGgpIHsKLQotICAgICAgICAvKiBTZWUgaWYgdGhlIHBhdGhuYW1lIGVuZGluZyBoZXJlIGV4aXN0cy4uLiAqLwotCi0gICAgICAgICpjcCA9ICdcMCc7Ci0KLSAgICAgICAgLyogV2UgbXVzdCBub3Qgc3RhdCgpIGZpbGVuYW1lcyB0aGF0IG1heSBjYXVzZSBvcy1zcGVjaWZpYyBzeXN0ZW0KLSAgICAgICAgICogcHJvYmxlbXMsIHN1Y2ggYXMgIi9maWxlL2F1eCIgb24gRE9TLWFidXNlZCBmaWxlc3lzdGVtcy4KLSAgICAgICAgICogU28gcHJldGVuZCB0aGF0IHRoZXkgZG8gbm90IGV4aXN0IGJ5IHJldHVybmluZyBhbiBFTk9FTlQgZXJyb3IuCi0gICAgICAgICAqIFRoaXMgd2lsbCBmb3JjZSB1cyB0byBkcm9wIHRoYXQgcGFydCBvZiB0aGUgcGF0aCBhbmQga2VlcAotICAgICAgICAgKiBsb29raW5nIGJhY2sgZm9yIGEgInJlYWwiIGZpbGUgdGhhdCBleGlzdHMsIHdoaWxlIHN0aWxsIGFsbG93aW5nCi0gICAgICAgICAqIHRoZSAiaW52YWxpZCIgcGF0aCBwYXJ0cyB3aXRoaW4gdGhlIFBBVEhfSU5GTy4KLSAgICAgICAgICovCi0gICAgICAgIGlmICghYXBfb3NfaXNfZmlsZW5hbWVfdmFsaWQocGF0aCkpIHsKLSAgICAgICAgICAgIGVycm5vID0gRU5PRU5UOwotICAgICAgICAgICAgcnYgPSAtMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGVycm5vID0gMDsKLSAgICAgICAgICAgIHJ2ID0gc3RhdChwYXRoLCAmci0+ZmluZm8pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNwICE9IGVuZCkKLSAgICAgICAgICAgICpjcCA9ICcvJzsKLQotICAgICAgICBpZiAoIXJ2KSB7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBBaGEhICBGb3VuZCBzb21ldGhpbmcuICBJZiBpdCB3YXMgYSBkaXJlY3RvcnksIHdlIHdpbGwgc2VhcmNoCi0gICAgICAgICAgICAgKiBjb250ZW50cyBvZiB0aGF0IGRpcmVjdG9yeSBmb3IgYSBtdWx0aV9tYXRjaCwgc28gdGhlIFBBVEhfSU5GTwotICAgICAgICAgICAgICogYXJndW1lbnQgc3RhcnRzIHdpdGggdGhlIGNvbXBvbmVudCBhZnRlciB0aGF0LgotICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIGlmIChTX0lTRElSKHItPmZpbmZvLnN0X21vZGUpICYmIGxhc3RfY3ApIHsKLSAgICAgICAgICAgICAgICByLT5maW5mby5zdF9tb2RlID0gMDsgICAvKiBObyBzdWNoIGZpbGUuLi4gKi8KLSAgICAgICAgICAgICAgICBjcCA9IGxhc3RfY3A7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHItPnBhdGhfaW5mbyA9IGFwX3BzdHJkdXAoci0+cG9vbCwgY3ApOwotICAgICAgICAgICAgKmNwID0gJ1wwJzsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotCS8qIG11c3Qgc2V0IHRoaXMgdG8gemVybywgc29tZSBzdGF0KClzIG1heSBoYXZlIGNvcnJ1cHRlZCBpdAotCSAqIGV2ZW4gaWYgdGhleSByZXR1cm5lZCBhbiBlcnJvci4KLQkgKi8KLQlyLT5maW5mby5zdF9tb2RlID0gMDsKLSNpZiBkZWZpbmVkKEVOT0VOVCkgJiYgZGVmaW5lZChFTk9URElSKQotICAgICAgICBpZiAoZXJybm8gPT0gRU5PRU5UIHx8IGVycm5vID09IEVOT1RESVIpIHsKLSAgICAgICAgICAgIGxhc3RfY3AgPSBjcDsKLQotICAgICAgICAgICAgd2hpbGUgKC0tY3AgPiBwYXRoICYmICpjcCAhPSAnLycpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIHdoaWxlIChjcCA+IHBhdGggJiYgY3BbLTFdID09ICcvJykKLSAgICAgICAgICAgICAgICAtLWNwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotI2lmIGRlZmluZWQoRUFDQ0VTKQotICAgICAgICAgICAgaWYgKGVycm5vICE9IEVBQ0NFUykKLSNlbmRpZgotICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY2Nlc3MgdG8gJXMgZmFpbGVkIiwgci0+dXJpKTsKLSAgICAgICAgICAgIHJldHVybiBIVFRQX0ZPUkJJRERFTjsKLSAgICAgICAgfQotI2Vsc2UKLSNlcnJvciBFTk9FTlQgfHwgRU5PVERJUiBub3QgZGVmaW5lZDsgcGxlYXNlIHNlZSB0aGUKLSNlcnJvciBjb21tZW50cyBhdCB0aGlzIGxpbmUgaW4gdGhlIHNvdXJjZSBmb3IgYSB3b3JrYXJvdW5kLgotICAgICAgICAvKgotICAgICAgICAgKiBJZiBFTk9FTlQgfHwgRU5PVERJUiBpcyBub3QgZGVmaW5lZCBpbiBvbmUgb2YgdGhlIHlvdXIgT1MncwotICAgICAgICAgKiBpbmNsdWRlIGZpbGVzLCBBcGFjaGUgZG9lcyBub3Qga25vdyBob3cgdG8gY2hlY2sgdG8gc2VlIHdoeSB0aGUKLSAgICAgICAgICogc3RhdCgpIG9mIHRoZSBpbmRleCBmaWxlIGZhaWxlZDsgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIGl0IGNhbiBmYWlsCi0gICAgICAgICAqIGV2ZW4gdGhvdWdoIHRoZSBmaWxlIGV4aXN0cy4gIFRoaXMgbWVhbnMgdGhhdCBpdCBpcyBwb3NzaWJsZSBmb3IKLSAgICAgICAgICogc29tZW9uZSB0byBnZXQgYSBkaXJlY3RvcnkgbGlzdGluZyBvZiBhIGRpcmVjdG9yeSBldmVuIHRob3VnaAotICAgICAgICAgKiB0aGVyZSBpcyBhbiBpbmRleCAoZWcuIGluZGV4Lmh0bWwpIGZpbGUgaW4gaXQuICBJZiB5b3UgZG8gbm90IGhhdmUKLSAgICAgICAgICogYSBwcm9ibGVtIHdpdGggdGhpcywgZGVsZXRlIHRoZSBhYm92ZSAjZXJyb3IgbGluZXMgYW5kIHN0YXJ0IHRoZQotICAgICAgICAgKiBjb21waWxlIGFnYWluLiAgSWYgeW91IG5lZWQgdG8gZG8gdGhpcywgcGxlYXNlIHN1Ym1pdCBhIGJ1ZyByZXBvcnQKLSAgICAgICAgICogZnJvbSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvYnVnX3JlcG9ydC5odG1sIGxldHRpbmcgdXMga25vdyB0aGF0Ci0gICAgICAgICAqIHlvdSBuZWVkZWQgdG8gZG8gdGhpcy4gIFBsZWFzZSBiZSBzdXJlIHRvIGluY2x1ZGUgdGhlIG9wZXJhdGluZwotICAgICAgICAgKiBzeXN0ZW0geW91IGFyZSB1c2luZy4KLSAgICAgICAgICovCi0JbGFzdF9jcCA9IGNwOwotCi0Jd2hpbGUgKC0tY3AgPiBwYXRoICYmICpjcCAhPSAnLycpCi0JICAgIGNvbnRpbnVlOwotCi0Jd2hpbGUgKGNwID4gcGF0aCAmJiBjcFstMV0gPT0gJy8nKQotCSAgICAtLWNwOwotI2VuZGlmICAvKiBFTk9FTlQgJiYgRU5PVERJUiAqLwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyBpbnQgZGlyZWN0b3J5X3dhbGsocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY29yZV9zZXJ2ZXJfY29uZmlnICpzY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcmVfbW9kdWxlKTsKLSAgICB2b2lkICpwZXJfZGlyX2RlZmF1bHRzID0gci0+c2VydmVyLT5sb29rdXBfZGVmYXVsdHM7Ci0gICAgdm9pZCAqKnNlYyA9ICh2b2lkICoqKSBzY29uZi0+c2VjLT5lbHRzOwotICAgIGludCBudW1fc2VjID0gc2NvbmYtPnNlYy0+bmVsdHM7Ci0gICAgY2hhciAqdGVzdF9maWxlbmFtZTsKLSAgICBjaGFyICp0ZXN0X2Rpcm5hbWU7Ci0gICAgaW50IHJlczsKLSAgICB1bnNpZ25lZCBpLCBudW1fZGlycywgaVN0YXJ0OwotICAgIGludCBqLCB0ZXN0X2ZpbGVuYW1lX2xlbjsKLQotICAgIC8qCi0gICAgICogQXJlIHdlIGRlYWxpbmcgd2l0aCBhIGZpbGU/IElmIG5vdCwgd2UgY2FuIChob3BlZnVseSkgc2FmZWx5IGFzc3VtZSB3ZQotICAgICAqIGhhdmUgYSBoYW5kbGVyIHRoYXQgZG9lc24ndCByZXF1aXJlIG9uZSwgYnV0IGZvciBzYWZldHkncyBzYWtlLCBhbmQgc28KLSAgICAgKiB3ZSBoYXZlIHNvbWV0aGluZyBmaW5kX3R5cGVzKCkgY2FuIGdldCBzb21ldGhpbmcgb3V0IG9mLCBmYWtlIG9uZS4gQnV0Ci0gICAgICogZG9uJ3QgcnVuIHRocm91Z2ggdGhlIGRpcmVjdG9yeSBlbnRyaWVzLgotICAgICAqLwotCi0gICAgaWYgKHItPmZpbGVuYW1lID09IE5VTEwpIHsKLSAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyZHVwKHItPnBvb2wsIHItPnVyaSk7Ci0gICAgICAgIHItPmZpbmZvLnN0X21vZGUgPSAwOyAgIC8qIE5vdCByZWFsbHkgYSBmaWxlLi4uICovCi0gICAgICAgIHItPnBlcl9kaXJfY29uZmlnID0gcGVyX2Rpcl9kZWZhdWx0czsKLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBHbyBkb3duIHRoZSBkaXJlY3RvcnkgaGllcmFyY2h5LiAgV2hlcmUgd2UgaGF2ZSB0byBjaGVjayBmb3Igc3ltbGlua3MsCi0gICAgICogZG8gc28uICBXaGVyZSBhIC5odGFjY2VzcyBmaWxlIGhhcyBwZXJtaXNzaW9uIHRvIG92ZXJyaWRlIGFueXRoaW5nLAotICAgICAqIHRyeSB0byBmaW5kIG9uZS4gIElmIGVpdGhlciBvZiB0aGVzZSB0aGluZ3MgZmFpbHMsIHdlIGNvdWxkIHBva2UKLSAgICAgKiBhcm91bmQsIHNlZSB3aHksIGFuZCBhZGp1c3QgdGhlIGxvb2t1cF9yZWMgYWNjb3JkaW5nbHkgLS0tIHRoaXMgbWlnaHQKLSAgICAgKiBzYXZlIHVzIGEgY2FsbCB0byBnZXRfcGF0aF9pbmZvICh3aXRoIHRoZSBhdHRlbmRhbnQgc3RhdCgpcyk7IGhvd2V2ZXIsCi0gICAgICogZm9yIHRoZSBtb21lbnQsIHRoYXQncyBub3Qgd29ydGggdGhlIHRyb3VibGUuCi0gICAgICoKLSAgICAgKiBGYWtlIGZpbGVuYW1lcyAoaS5lLiBwcm94eTopIG9ubHkgbWF0Y2ggRGlyZWN0b3J5IHNlY3Rpb25zLgotICAgICAqLwotCi0gICAgaWYgKCFhcF9vc19pc19wYXRoX2Fic29sdXRlKHItPmZpbGVuYW1lKSkKLSAgICB7Ci0gICAgICAgIHZvaWQgKnRoaXNfY29uZiwgKmVudHJ5X2NvbmZpZzsKLSAgICAgICAgY29yZV9kaXJfY29uZmlnICplbnRyeV9jb3JlOwotICAgICAgICBjaGFyICplbnRyeV9kaXI7Ci0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bV9zZWM7ICsraikgewotCi0gICAgICAgICAgICBlbnRyeV9jb25maWcgPSBzZWNbal07Ci0KLSAgICAgICAgICAgIGVudHJ5X2NvcmUgPSAoY29yZV9kaXJfY29uZmlnICopCi0gICAgICAgICAgICAgICAgYXBfZ2V0X21vZHVsZV9jb25maWcoZW50cnlfY29uZmlnLCAmY29yZV9tb2R1bGUpOwotICAgICAgICAgICAgZW50cnlfZGlyID0gZW50cnlfY29yZS0+ZDsKLQotICAgICAgICAgICAgdGhpc19jb25mID0gTlVMTDsKLSAgICAgICAgICAgIGlmIChlbnRyeV9jb3JlLT5yKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFhcF9yZWdleGVjKGVudHJ5X2NvcmUtPnIsIHItPmZpbGVuYW1lLCAwLCBOVUxMLCAwKSkKLSAgICAgICAgICAgICAgICAgICAgdGhpc19jb25mID0gZW50cnlfY29uZmlnOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoZW50cnlfY29yZS0+ZF9pc19mbm1hdGNoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFhcF9mbm1hdGNoKGVudHJ5X2Rpciwgci0+ZmlsZW5hbWUsIDApKQotICAgICAgICAgICAgICAgICAgICB0aGlzX2NvbmYgPSBlbnRyeV9jb25maWc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghc3RybmNtcChyLT5maWxlbmFtZSwgZW50cnlfZGlyLCBzdHJsZW4oZW50cnlfZGlyKSkpCi0gICAgICAgICAgICAgICAgdGhpc19jb25mID0gZW50cnlfY29uZmlnOwotCi0gICAgICAgICAgICBpZiAodGhpc19jb25mKQotICAgICAgICAgICAgICAgIHBlcl9kaXJfZGVmYXVsdHMgPSBhcF9tZXJnZV9wZXJfZGlyX2NvbmZpZ3Moci0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcl9kaXJfZGVmYXVsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2NvbmYpOwotICAgICAgICB9Ci0KLSAgICAgICAgci0+cGVyX2Rpcl9jb25maWcgPSBwZXJfZGlyX2RlZmF1bHRzOwotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICByLT5maWxlbmFtZSAgID0gYXBfb3NfY2FzZV9jYW5vbmljYWxfZmlsZW5hbWUoci0+cG9vbCwgci0+ZmlsZW5hbWUpOwotCi0gICAgcmVzID0gZ2V0X3BhdGhfaW5mbyhyKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgci0+ZmlsZW5hbWUgICA9IGFwX29zX2Nhbm9uaWNhbF9maWxlbmFtZShyLT5wb29sLCByLT5maWxlbmFtZSk7Ci0KLSAgICB0ZXN0X2ZpbGVuYW1lID0gYXBfcHN0cmR1cChyLT5wb29sLCByLT5maWxlbmFtZSk7Ci0KLSAgICBhcF9ubzJzbGFzaCh0ZXN0X2ZpbGVuYW1lKTsKLSAgICBudW1fZGlycyA9IGFwX2NvdW50X2RpcnModGVzdF9maWxlbmFtZSk7Ci0KLSAgICBpZiAoIWFwX29zX2lzX2ZpbGVuYW1lX3ZhbGlkKHItPmZpbGVuYW1lKSkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAgICJGaWxlbmFtZSBpcyBub3QgdmFsaWQ6ICVzIiwgci0+ZmlsZW5hbWUpOwotICAgICAgICByZXR1cm4gSFRUUF9GT1JCSURERU47Ci0gICAgfQotCi0gICAgaWYgKChyZXMgPSBjaGVja19zYWZlX2ZpbGUocikpKSB7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgdGVzdF9maWxlbmFtZV9sZW4gPSBzdHJsZW4odGVzdF9maWxlbmFtZSk7Ci0gICAgaWYgKHRlc3RfZmlsZW5hbWVbdGVzdF9maWxlbmFtZV9sZW4gLSAxXSA9PSAnLycpCi0gICAgICAgIC0tbnVtX2RpcnM7Ci0KLSAgICBpZiAoU19JU0RJUihyLT5maW5mby5zdF9tb2RlKSkKLSAgICAgICAgKytudW1fZGlyczsKLQotICAgIC8qCi0gICAgICogV2Ugd2lsbCB1c2UgdGVzdF9kaXJuYW1lIGFzIHNjcmF0Y2ggc3BhY2Ugd2hpbGUgd2UgYnVpbGQgZGlyZWN0b3J5Ci0gICAgICogbmFtZXMgZHVyaW5nIHRoZSB3YWxrLiAgUHJvZmlsaW5nIHNob3dzIGRpcmVjdG9yeV93YWxrIHRvIGJlIGEgYnVzeQotICAgICAqIGZ1bmN0aW9uIHNvIHdlIHRyeSB0byBhdm9pZCBhbGxvY2F0aW5nIGxvdHMgb2YgZXh0cmEgbWVtb3J5IGhlcmUuCi0gICAgICogV2UgbmVlZCAyIGV4dHJhIGJ5dGVzLCBvbmUgZm9yIHRyYWlsaW5nIFwwIGFuZCBvbmUgYmVjYXVzZQotICAgICAqIG1ha2VfZGlyc3RyX3ByZWZpeCB3aWxsIGFkZCBwb3RlbnRpYWxseSBvbmUgZXh0cmEgLy4KLSAgICAgKi8KLSAgICB0ZXN0X2Rpcm5hbWUgPSBhcF9wYWxsb2Moci0+cG9vbCwgdGVzdF9maWxlbmFtZV9sZW4gKyAyKTsKLQotICAgIGlTdGFydCA9IDE7Ci0jaWZkZWYgV0lOMzIKLSAgICAvKiBJZiB0aGUgbmFtZSBpcyBhIFVOQyBuYW1lLCB0aGVuIGRvIG5vdCB3YWxrIHRocm91Z2ggdGhlCi0gICAgICogbWFjaGluZSBhbmQgc2hhcmUgbmFtZSAoZS5nLiBcXG1hY2hpbmVcc2hhcmVcKQotICAgICAqLwotICAgIGlmIChudW1fZGlycyA+IDMgJiYgdGVzdF9maWxlbmFtZVswXSA9PSAnLycgJiYgdGVzdF9maWxlbmFtZVsxXSA9PSAnLycpCi0gICAgICAgIGlTdGFydCA9IDQ7Ci0jZW5kaWYKLQotICAgIC8qIGoga2VlcHMgdHJhY2sgb2Ygd2hpY2ggc2VjdGlvbiB3ZSdyZSBvbiwgc2VlIGNvcmVfcmVvcmRlcl9kaXJlY3RvcmllcyAqLwotICAgIGogPSAwOwotICAgIGZvciAoaSA9IGlTdGFydDsgaSA8PSBudW1fZGlyczsgKytpKSB7Ci0gICAgICAgIGludCBvdmVycmlkZXNfaGVyZTsKLSAgICAgICAgY29yZV9kaXJfY29uZmlnICpjb3JlX2RpciA9IChjb3JlX2Rpcl9jb25maWcgKikKLSAgICAgICAgICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKHBlcl9kaXJfZGVmYXVsdHMsICZjb3JlX21vZHVsZSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogWFhYOiB0aGlzIGNvdWxkIGJlIG1hZGUgZmFzdGVyIGJ5IG9ubHkgY29weWluZyB0aGUgbmV4dCBjb21wb25lbnQKLSAgICAgICAgICogcmF0aGVyIHRoYW4gY29weWluZyB0aGUgZW50aXJlIHRoaW5nIGFsbCBvdmVyLgotICAgICAgICAgKi8KLSAgICAgICAgYXBfbWFrZV9kaXJzdHJfcHJlZml4KHRlc3RfZGlybmFtZSwgdGVzdF9maWxlbmFtZSwgaSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogRG8gc3ltbGluayBjaGVja3MgZmlyc3QsIGJlY2F1c2UgdGhleSBhcmUgZG9uZSB3aXRoIHRoZQotICAgICAgICAgKiBwZXJtaXNzaW9ucyBhcHByb3ByaWF0ZSB0byB0aGUgKnBhcmVudCogZGlyZWN0b3J5Li4uCi0gICAgICAgICAqLwotCi0gICAgICAgIGlmICgocmVzID0gY2hlY2tfc3ltbGlua3ModGVzdF9kaXJuYW1lLCBjb3JlX2Rpci0+b3B0cykpKSB7Ci0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgIlN5bWJvbGljIGxpbmsgbm90IGFsbG93ZWQ6ICVzIiwgdGVzdF9kaXJuYW1lKTsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBCZWdpbiAqdGhpcyogbGV2ZWwgYnkgbG9va2luZyBmb3IgbWF0Y2hpbmcgPERpcmVjdG9yeT4gc2VjdGlvbnMKLSAgICAgICAgICogZnJvbSBhY2Nlc3MuY29uZi4KLSAgICAgICAgICovCi0KLSAgICAgICAgZm9yICg7IGogPCBudW1fc2VjOyArK2opIHsKLSAgICAgICAgICAgIHZvaWQgKmVudHJ5X2NvbmZpZyA9IHNlY1tqXTsKLSAgICAgICAgICAgIGNvcmVfZGlyX2NvbmZpZyAqZW50cnlfY29yZTsKLSAgICAgICAgICAgIGNoYXIgKmVudHJ5X2RpcjsKLSAgICAgICAgICAgIHZvaWQgKnRoaXNfY29uZjsKLQotICAgICAgICAgICAgZW50cnlfY29yZSA9IChjb3JlX2Rpcl9jb25maWcgKikKLSAgICAgICAgICAgICAgICAgICAgICAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhlbnRyeV9jb25maWcsICZjb3JlX21vZHVsZSk7Ci0gICAgICAgICAgICBlbnRyeV9kaXIgPSBlbnRyeV9jb3JlLT5kOwotCi0gICAgICAgICAgICBpZiAoZW50cnlfY29yZS0+cgotCQl8fCAhYXBfb3NfaXNfcGF0aF9hYnNvbHV0ZShlbnRyeV9kaXIpCi0gICAgICAgICAgICAgICAgfHwgZW50cnlfY29yZS0+ZF9jb21wb25lbnRzID4gaSkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgdGhpc19jb25mID0gTlVMTDsKLSAgICAgICAgICAgIGlmIChlbnRyeV9jb3JlLT5kX2lzX2ZubWF0Y2gpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWFwX2ZubWF0Y2goZW50cnlfZGlyLCB0ZXN0X2Rpcm5hbWUsIEZOTV9QQVRITkFNRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpc19jb25mID0gZW50cnlfY29uZmlnOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAodGVzdF9kaXJuYW1lLCBlbnRyeV9kaXIpKQotICAgICAgICAgICAgICAgIHRoaXNfY29uZiA9IGVudHJ5X2NvbmZpZzsKLQotICAgICAgICAgICAgaWYgKHRoaXNfY29uZikgewotICAgICAgICAgICAgICAgIHBlcl9kaXJfZGVmYXVsdHMgPSBhcF9tZXJnZV9wZXJfZGlyX2NvbmZpZ3Moci0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcl9kaXJfZGVmYXVsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2NvbmYpOwotICAgICAgICAgICAgICAgIGNvcmVfZGlyID0gKGNvcmVfZGlyX2NvbmZpZyAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfZ2V0X21vZHVsZV9jb25maWcocGVyX2Rpcl9kZWZhdWx0cywgJmNvcmVfbW9kdWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBvdmVycmlkZXNfaGVyZSA9IGNvcmVfZGlyLT5vdmVycmlkZTsKLQotICAgICAgICAvKiBJZiAuaHRhY2Nlc3MgZmlsZXMgYXJlIGVuYWJsZWQsIGNoZWNrIGZvciBvbmUuICovCi0KLSAgICAgICAgaWYgKG92ZXJyaWRlc19oZXJlKSB7Ci0gICAgICAgICAgICB2b2lkICpodGFjY2Vzc19jb25mID0gTlVMTDsKLQotICAgICAgICAgICAgcmVzID0gYXBfcGFyc2VfaHRhY2Nlc3MoJmh0YWNjZXNzX2NvbmYsIHIsIG92ZXJyaWRlc19oZXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfcHN0cmR1cChyLT5wb29sLCB0ZXN0X2Rpcm5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvbmYtPmFjY2Vzc19uYW1lKTsKLSAgICAgICAgICAgIGlmIChyZXMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKLQotICAgICAgICAgICAgaWYgKGh0YWNjZXNzX2NvbmYpIHsKLSAgICAgICAgICAgICAgICBwZXJfZGlyX2RlZmF1bHRzID0gYXBfbWVyZ2VfcGVyX2Rpcl9jb25maWdzKHItPnBvb2wsCi0JCQkJCQkJICAgIHBlcl9kaXJfZGVmYXVsdHMsCi0JCQkJCQkJICAgIGh0YWNjZXNzX2NvbmYpOwotCQlyLT5wZXJfZGlyX2NvbmZpZyA9IHBlcl9kaXJfZGVmYXVsdHM7Ci0JICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogVGhlcmUncyB0d28gdHlwZXMgb2YgSVNfU1BFQ0lBTCBzZWN0aW9ucyAoc2VlIGh0dHBfY29yZS5jKSwgYW5kIHdlJ3ZlCi0gICAgICogYWxyZWFkeSBoYW5kbGVkIHRoZSBwcm94eTotc3R5bGUgc3R1ZmYuICBOb3cgd2UnbGwgZGVhbCB3aXRoIHRoZQotICAgICAqIHJlZ2V4ZXMuCi0gICAgICovCi0gICAgZm9yICg7IGogPCBudW1fc2VjOyArK2opIHsKLSAgICAgICAgdm9pZCAqZW50cnlfY29uZmlnID0gc2VjW2pdOwotICAgICAgICBjb3JlX2Rpcl9jb25maWcgKmVudHJ5X2NvcmU7Ci0KLSAgICAgICAgZW50cnlfY29yZSA9IChjb3JlX2Rpcl9jb25maWcgKikKLSAgICAgICAgICAgICAgICAgICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKGVudHJ5X2NvbmZpZywgJmNvcmVfbW9kdWxlKTsKLQotICAgICAgICBpZiAoZW50cnlfY29yZS0+cikgewotICAgICAgICAgICAgaWYgKCFhcF9yZWdleGVjKGVudHJ5X2NvcmUtPnIsIHRlc3RfZGlybmFtZSwgMCwgTlVMTCwgUkVHX05PVEVPTCkpIHsKLSAgICAgICAgICAgICAgICBwZXJfZGlyX2RlZmF1bHRzID0KLSAgICAgICAgICAgICAgICAgICAgYXBfbWVyZ2VfcGVyX2Rpcl9jb25maWdzKHItPnBvb2wsIHBlcl9kaXJfZGVmYXVsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeV9jb25maWcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHItPnBlcl9kaXJfY29uZmlnID0gcGVyX2Rpcl9kZWZhdWx0czsKLQotICAgIC8qCi0gICAgICogU3ltbGluayBwZXJtaXNzaW9ucyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgcGFyZW50LiAgSWYgdGhlIHJlcXVlc3QgaXMKLSAgICAgKiBmb3IgYSBkaXJlY3RvcnkgdGhlbiBhcHBseWluZyB0aGUgc3ltbGluayB0ZXN0IGhlcmUgd291bGQgdXNlIHRoZQotICAgICAqIHBlcm1pc3Npb25zIG9mIHRoZSBkaXJlY3RvcnkgYXMgb3Bwb3NlZCB0byBpdHMgcGFyZW50LiAgQ29uc2lkZXIgYQotICAgICAqIHN5bWxpbmsgcG9pbnRpbmcgdG8gYSBkaXIgd2l0aCBhIC5odGFjY2VzcyBkaXNhbGxvd2luZyBzeW1saW5rcy4gIElmCi0gICAgICogeW91IGFjY2VzcyAvc3ltbGluayAob3IgL3N5bWxpbmsvKSB5b3Ugd291bGQgZ2V0IGEgNDAzIHdpdGhvdXQgdGhpcwotICAgICAqIFNfSVNESVIgdGVzdC4gIEJ1dCBpZiB5b3UgYWNjZXNzZWQgL3N5bWxpbmsvaW5kZXguaHRtbCwgZm9yIGV4YW1wbGUsCi0gICAgICogeW91IHdvdWxkICpub3QqIGdldCB0aGUgNDAzLgotICAgICAqLwotICAgIGlmICghU19JU0RJUihyLT5maW5mby5zdF9tb2RlKQotICAgICAgICAmJiAocmVzID0gY2hlY2tfc3ltbGlua3Moci0+ZmlsZW5hbWUsIGFwX2FsbG93X29wdGlvbnMocikpKSkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAiU3ltYm9saWMgbGluayBub3QgYWxsb3dlZDogJXMiLCByLT5maWxlbmFtZSk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotICAgIHJldHVybiBPSzsgICAgICAgICAgICAgICAgICAvKiBDYW4gb25seSAiZmFpbCIgaWYgYWNjZXNzIGRlbmllZCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3ltbGluayBnb29wLiAqLwotfQotCi1zdGF0aWMgaW50IGxvY2F0aW9uX3dhbGsocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY29yZV9zZXJ2ZXJfY29uZmlnICpzY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcmVfbW9kdWxlKTsKLSAgICB2b2lkICpwZXJfZGlyX2RlZmF1bHRzID0gci0+cGVyX2Rpcl9jb25maWc7Ci0gICAgdm9pZCAqKnVybCA9ICh2b2lkICoqKSBzY29uZi0+c2VjX3VybC0+ZWx0czsKLSAgICBpbnQgbGVuLCBudW1fdXJsID0gc2NvbmYtPnNlY191cmwtPm5lbHRzOwotICAgIGNoYXIgKnRlc3RfbG9jYXRpb247Ci0gICAgdm9pZCAqdGhpc19jb25mLCAqZW50cnlfY29uZmlnOwotICAgIGNvcmVfZGlyX2NvbmZpZyAqZW50cnlfY29yZTsKLSAgICBjaGFyICplbnRyeV91cmw7Ci0gICAgaW50IGo7Ci0KLSAgICBpZiAoIW51bV91cmwpIHsKLQlyZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgLyogTG9jYXRpb24gYW5kIExvY2F0aW9uTWF0Y2ggZGlmZmVyIG9uIHRoZWlyIGJlaGF2aW91ciB3LnIudC4gbXVsdGlwbGUKLSAgICAgKiBzbGFzaGVzLiAgTG9jYXRpb24gbWF0Y2hlcyBtdWx0aXBsZSBzbGFzaGVzIHdpdGggYSBzaW5nbGUgc2xhc2gsCi0gICAgICogTG9jYXRpb25NYXRjaCBkb2Vzbid0LiAgQW4gZXhjZXB0aW9uLCBmb3IgYmFja3dhcmRzIGJyb2tlbm5lc3MgaXMKLSAgICAgKiBhYnNvbHV0ZVVSSXMuLi4gaW4gd2hpY2ggY2FzZSBuZWl0aGVyIG1hdGNoIG11bHRpcGxlIHNsYXNoZXMuCi0gICAgICovCi0gICAgaWYgKHItPnVyaVswXSAhPSAnLycpIHsKLQl0ZXN0X2xvY2F0aW9uID0gci0+dXJpOwotICAgIH0KLSAgICBlbHNlIHsKLQl0ZXN0X2xvY2F0aW9uID0gYXBfcHN0cmR1cChyLT5wb29sLCByLT51cmkpOwotCWFwX25vMnNsYXNoKHRlc3RfbG9jYXRpb24pOwotICAgIH0KLQotICAgIC8qIEdvIHRocm91Z2ggdGhlIGxvY2F0aW9uIGVudHJpZXMsIGFuZCBjaGVjayBmb3IgbWF0Y2hlcy4gKi8KLQotICAgIC8qIHdlIGFwcGx5IHRoZSBkaXJlY3RpdmUgc2VjdGlvbnMgaW4gc29tZSBvcmRlcjsKLSAgICAgKiBzaG91bGQgcmVhbGx5IHRyeSB0aGVtIHdpdGggdGhlIG1vc3QgZ2VuZXJhbCBmaXJzdC4KLSAgICAgKi8KLSAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3VybDsgKytqKSB7Ci0KLQllbnRyeV9jb25maWcgPSB1cmxbal07Ci0KLQllbnRyeV9jb3JlID0gKGNvcmVfZGlyX2NvbmZpZyAqKQotCSAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhlbnRyeV9jb25maWcsICZjb3JlX21vZHVsZSk7Ci0JZW50cnlfdXJsID0gZW50cnlfY29yZS0+ZDsKLQotCWxlbiA9IHN0cmxlbihlbnRyeV91cmwpOwotCi0JdGhpc19jb25mID0gTlVMTDsKLQotCWlmIChlbnRyeV9jb3JlLT5yKSB7Ci0JICAgIGlmICghYXBfcmVnZXhlYyhlbnRyeV9jb3JlLT5yLCByLT51cmksIDAsIE5VTEwsIDApKQotCQl0aGlzX2NvbmYgPSBlbnRyeV9jb25maWc7Ci0JfQotCWVsc2UgaWYgKGVudHJ5X2NvcmUtPmRfaXNfZm5tYXRjaCkgewotCSAgICBpZiAoIWFwX2ZubWF0Y2goZW50cnlfdXJsLCB0ZXN0X2xvY2F0aW9uLCBGTk1fUEFUSE5BTUUpKSB7Ci0JCXRoaXNfY29uZiA9IGVudHJ5X2NvbmZpZzsKLQkgICAgfQotCX0KLQllbHNlIGlmICghc3RybmNtcCh0ZXN0X2xvY2F0aW9uLCBlbnRyeV91cmwsIGxlbikgJiYKLQkJICAgIChlbnRyeV91cmxbbGVuIC0gMV0gPT0gJy8nIHx8Ci0JCXRlc3RfbG9jYXRpb25bbGVuXSA9PSAnLycgfHwgdGVzdF9sb2NhdGlvbltsZW5dID09ICdcMCcpKQotCSAgICB0aGlzX2NvbmYgPSBlbnRyeV9jb25maWc7Ci0KLQlpZiAodGhpc19jb25mKQotCSAgICBwZXJfZGlyX2RlZmF1bHRzID0gYXBfbWVyZ2VfcGVyX2Rpcl9jb25maWdzKHItPnBvb2wsCi0JCQkJCSAgICBwZXJfZGlyX2RlZmF1bHRzLCB0aGlzX2NvbmYpOwotICAgIH0KLSAgICByLT5wZXJfZGlyX2NvbmZpZyA9IHBlcl9kaXJfZGVmYXVsdHM7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyBpbnQgZmlsZV93YWxrKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvcmVfZGlyX2NvbmZpZyAqY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLCAmY29yZV9tb2R1bGUpOwotICAgIHZvaWQgKnBlcl9kaXJfZGVmYXVsdHMgPSByLT5wZXJfZGlyX2NvbmZpZzsKLSAgICB2b2lkICoqZmlsZSA9ICh2b2lkICoqKSBjb25mLT5zZWMtPmVsdHM7Ci0gICAgaW50IG51bV9maWxlcyA9IGNvbmYtPnNlYy0+bmVsdHM7Ci0gICAgY2hhciAqdGVzdF9maWxlOwotCi0gICAgLyogZ2V0IHRoZSBiYXNlbmFtZSAqLwotICAgIHRlc3RfZmlsZSA9IHN0cnJjaHIoci0+ZmlsZW5hbWUsICcvJyk7Ci0gICAgaWYgKHRlc3RfZmlsZSA9PSBOVUxMKSB7Ci0JdGVzdF9maWxlID0gci0+ZmlsZW5hbWU7Ci0gICAgfQotICAgIGVsc2UgewotCSsrdGVzdF9maWxlOwotICAgIH0KLQotICAgIC8qIEdvIHRocm91Z2ggdGhlIGZpbGUgZW50cmllcywgYW5kIGNoZWNrIGZvciBtYXRjaGVzLiAqLwotCi0gICAgaWYgKG51bV9maWxlcykgewotICAgICAgICB2b2lkICp0aGlzX2NvbmYsICplbnRyeV9jb25maWc7Ci0gICAgICAgIGNvcmVfZGlyX2NvbmZpZyAqZW50cnlfY29yZTsKLSAgICAgICAgY2hhciAqZW50cnlfZmlsZTsKLSAgICAgICAgaW50IGo7Ci0KLSAgICAgICAgLyogd2UgYXBwbHkgdGhlIGRpcmVjdGl2ZSBzZWN0aW9ucyBpbiBzb21lIG9yZGVyOwotICAgICAgICAgKiBzaG91bGQgcmVhbGx5IHRyeSB0aGVtIHdpdGggdGhlIG1vc3QgZ2VuZXJhbCBmaXJzdC4KLSAgICAgICAgICovCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fZmlsZXM7ICsraikgewotCi0gICAgICAgICAgICBlbnRyeV9jb25maWcgPSBmaWxlW2pdOwotCi0gICAgICAgICAgICBlbnRyeV9jb3JlID0gKGNvcmVfZGlyX2NvbmZpZyAqKQotICAgICAgICAgICAgICAgICAgICAgICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKGVudHJ5X2NvbmZpZywgJmNvcmVfbW9kdWxlKTsKLSAgICAgICAgICAgIGVudHJ5X2ZpbGUgPSBlbnRyeV9jb3JlLT5kOwotCi0gICAgICAgICAgICB0aGlzX2NvbmYgPSBOVUxMOwotCi0gICAgICAgICAgICBpZiAoZW50cnlfY29yZS0+cikgewotICAgICAgICAgICAgICAgIGlmICghYXBfcmVnZXhlYyhlbnRyeV9jb3JlLT5yLCB0ZXN0X2ZpbGUsIDAsIE5VTEwsIDApKQotICAgICAgICAgICAgICAgICAgICB0aGlzX2NvbmYgPSBlbnRyeV9jb25maWc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChlbnRyeV9jb3JlLT5kX2lzX2ZubWF0Y2gpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWFwX2ZubWF0Y2goZW50cnlfZmlsZSwgdGVzdF9maWxlLCBGTk1fUEFUSE5BTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXNfY29uZiA9IGVudHJ5X2NvbmZpZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKHRlc3RfZmlsZSwgZW50cnlfZmlsZSkpIHsKLSAgICAgICAgICAgICAgICB0aGlzX2NvbmYgPSBlbnRyeV9jb25maWc7Ci0JICAgIH0KLQotICAgICAgICAgICAgaWYgKHRoaXNfY29uZikKLSAgICAgICAgICAgICAgICBwZXJfZGlyX2RlZmF1bHRzID0gYXBfbWVyZ2VfcGVyX2Rpcl9jb25maWdzKHItPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJfZGlyX2RlZmF1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19jb25mKTsKLSAgICAgICAgfQotICAgICAgICByLT5wZXJfZGlyX2NvbmZpZyA9IHBlcl9kaXJfZGVmYXVsdHM7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhlIHN1Yl9yZXF1ZXN0IG1lY2hhbmlzbS4KLSAqCi0gKiBGbnMgdG8gbG9vayB1cCBhIHJlbGF0aXZlIFVSSSBmcm9tLCBlLmcuLCBhIG1hcCBmaWxlIG9yIFNTSSBkb2N1bWVudC4KLSAqIFRoZXNlIGRvIGFsbCBhY2Nlc3MgY2hlY2tzLCBldGMuLCBidXQgZG9uJ3QgYWN0dWFsbHkgcnVuIHRoZSB0cmFuc2FjdGlvbgotICogLi4uIHVzZSBydW5fc3ViX3JlcSBiZWxvdyBmb3IgdGhhdC4gIEFsc28sIGJlIHN1cmUgdG8gdXNlIGRlc3Ryb3lfc3ViX3JlcQotICogYXMgYXBwcm9wcmlhdGUgaWYgeW91J3JlIGxpa2VseSB0byBiZSBjcmVhdGluZyBtb3JlIHRoYW4gYSBmZXcgb2YgdGhlc2UuCi0gKiAoQW4gZWFybHkgQXBhY2hlIHZlcnNpb24gZGlkbid0IGRlc3Ryb3kgdGhlIHN1Yl9yZXFzIHVzZWQgaW4gZGlyZWN0b3J5Ci0gKiBpbmRleGluZy4gIFRoZSByZXN1bHQsIHdoZW4gaW5kZXhpbmcgYSBkaXJlY3Rvcnkgd2l0aCA4MDAtb2RkIGZpbGVzIGluCi0gKiBpdCwgd2FzIG1hc3NpdmVseSBleGNlc3NpdmUgc3RvcmFnZSBhbGxvY2F0aW9uKS4KLSAqCi0gKiBOb3RlIG1vcmUgbWFuaXB1bGF0aW9uIG9mIHByb3RvY29sLXNwZWNpZmljIHZhcnMgaW4gdGhlIHJlcXVlc3QKLSAqIHN0cnVjdHVyZS4uLgotICovCi0KLXN0YXRpYyByZXF1ZXN0X3JlYyAqbWFrZV9zdWJfcmVxdWVzdChjb25zdCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBwb29sICpycnAgPSBhcF9tYWtlX3N1Yl9wb29sKHItPnBvb2wpOwotICAgIHJlcXVlc3RfcmVjICpyciA9IGFwX3BjYWxsb2MocnJwLCBzaXplb2YocmVxdWVzdF9yZWMpKTsKLQotICAgIHJyLT5wb29sID0gcnJwOwotICAgIHJldHVybiBycjsKLX0KLQotQVBJX0VYUE9SVChyZXF1ZXN0X3JlYyAqKSBhcF9zdWJfcmVxX21ldGhvZF91cmkoY29uc3QgY2hhciAqbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmV3X2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICByZXF1ZXN0X3JlYyAqcm5ldzsKLSAgICBpbnQgcmVzOwotICAgIGNoYXIgKnVkaXI7Ci0KLSAgICBybmV3ID0gbWFrZV9zdWJfcmVxdWVzdChyKTsKLSAgICBybmV3LT5ob3N0bmFtZSAgICAgICA9IHItPmhvc3RuYW1lOwotICAgIHJuZXctPnJlcXVlc3RfdGltZSAgID0gci0+cmVxdWVzdF90aW1lOwotICAgIHJuZXctPmNvbm5lY3Rpb24gICAgID0gci0+Y29ubmVjdGlvbjsKLSAgICBybmV3LT5zZXJ2ZXIgICAgICAgICA9IHItPnNlcnZlcjsKLSAgICBybmV3LT5yZXF1ZXN0X2NvbmZpZyA9IGFwX2NyZWF0ZV9yZXF1ZXN0X2NvbmZpZyhybmV3LT5wb29sKTsKLSAgICBybmV3LT5odGFjY2VzcyAgICAgICA9IHItPmh0YWNjZXNzOwotICAgIHJuZXctPnBlcl9kaXJfY29uZmlnID0gci0+c2VydmVyLT5sb29rdXBfZGVmYXVsdHM7Ci0KLSAgICBhcF9zZXRfc3ViX3JlcV9wcm90b2NvbChybmV3LCByKTsKLQotICAgIC8qIHdvdWxkIGJlIG5pY2VyIHRvIHBhc3MgIm1ldGhvZCIgdG8gYXBfc2V0X3N1Yl9yZXFfcHJvdG9jb2wgKi8KLSAgICBybmV3LT5tZXRob2QgPSBtZXRob2Q7Ci0gICAgcm5ldy0+bWV0aG9kX251bWJlciA9IGFwX21ldGhvZF9udW1iZXJfb2YobWV0aG9kKTsKLQotICAgIGlmIChuZXdfZmlsZVswXSA9PSAnLycpCi0gICAgICAgIGFwX3BhcnNlX3VyaShybmV3LCBuZXdfZmlsZSk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIHVkaXIgPSBhcF9tYWtlX2RpcnN0cl9wYXJlbnQocm5ldy0+cG9vbCwgci0+dXJpKTsKLSAgICAgICAgdWRpciA9IGFwX2VzY2FwZV91cmkocm5ldy0+cG9vbCwgdWRpcik7ICAgIC8qIHJlLWVzY2FwZSBpdCAqLwotICAgICAgICBhcF9wYXJzZV91cmkocm5ldywgYXBfbWFrZV9mdWxsX3BhdGgocm5ldy0+cG9vbCwgdWRpciwgbmV3X2ZpbGUpKTsKLSAgICB9Ci0KLSAgICByZXMgPSBhcF91bmVzY2FwZV91cmwocm5ldy0+dXJpKTsKLSAgICBpZiAocmVzKSB7Ci0gICAgICAgIHJuZXctPnN0YXR1cyA9IHJlczsKLSAgICAgICAgcmV0dXJuIHJuZXc7Ci0gICAgfQotCi0gICAgYXBfZ2V0cGFyZW50cyhybmV3LT51cmkpOwotCi0gICAgaWYgKChyZXMgPSBsb2NhdGlvbl93YWxrKHJuZXcpKSkgewotICAgICAgICBybmV3LT5zdGF0dXMgPSByZXM7Ci0gICAgICAgIHJldHVybiBybmV3OwotICAgIH0KLQotICAgIHJlcyA9IGFwX3RyYW5zbGF0ZV9uYW1lKHJuZXcpOwotICAgIGlmIChyZXMpIHsKLSAgICAgICAgcm5ldy0+c3RhdHVzID0gcmVzOwotICAgICAgICByZXR1cm4gcm5ldzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFdlIGNvdWxkIGJlIGNsZXZlciBhdCB0aGlzIHBvaW50LCBhbmQgYXZvaWQgY2FsbGluZyBkaXJlY3Rvcnlfd2FsaywKLSAgICAgKiBldGMuIEhvd2V2ZXIsIHdlJ2QgbmVlZCB0byB0ZXN0IHRoYXQgdGhlIG9sZCBhbmQgbmV3IGZpbGVuYW1lcyBjb250YWluCi0gICAgICogdGhlIHNhbWUgZGlyZWN0b3J5IGNvbXBvbmVudHMsIHNvIGl0IHdvdWxkIHJlcXVpcmUgZHVwbGljYXRpbmcgdGhlCi0gICAgICogc3RhcnQgb2YgdHJhbnNsYXRlX25hbWUuIEluc3RlYWQgd2UgcmVseSBvbiB0aGUgY2FjaGUgb2YgLmh0YWNjZXNzCi0gICAgICogcmVzdWx0cy4KLSAgICAgKgotICAgICAqIE5COiBkaXJlY3Rvcnlfd2FsaygpIGNsZWFycyB0aGUgcGVyX2Rpcl9jb25maWcsIHNvIHdlIGRvbid0IGluaGVyaXQKLSAgICAgKiBmcm9tIGxvY2F0aW9uX3dhbGsoKSBhYm92ZQotICAgICAqLwotCi0gICAgaWYgKChyZXMgPSBkaXJlY3Rvcnlfd2FsayhybmV3KSkKLSAgICAgICAgfHwgKHJlcyA9IGZpbGVfd2FsayhybmV3KSkKLSAgICAgICAgfHwgKHJlcyA9IGxvY2F0aW9uX3dhbGsocm5ldykpCi0gICAgICAgIHx8ICgoYXBfc2F0aXNmaWVzKHJuZXcpID09IFNBVElTRllfQUxMCi0gICAgICAgICAgICAgfHwgYXBfc2F0aXNmaWVzKHJuZXcpID09IFNBVElTRllfTk9TUEVDKQotICAgICAgICAgICAgPyAoKHJlcyA9IGFwX2NoZWNrX2FjY2VzcyhybmV3KSkKLSAgICAgICAgICAgICAgIHx8IChhcF9zb21lX2F1dGhfcmVxdWlyZWQocm5ldykKLSAgICAgICAgICAgICAgICAgICAmJiAoKHJlcyA9IGFwX2NoZWNrX3VzZXJfaWQocm5ldykpCi0gICAgICAgICAgICAgICAgICAgICAgIHx8IChyZXMgPSBhcF9jaGVja19hdXRoKHJuZXcpKSkpKQotICAgICAgICAgICAgOiAoKHJlcyA9IGFwX2NoZWNrX2FjY2VzcyhybmV3KSkKLSAgICAgICAgICAgICAgICYmICghYXBfc29tZV9hdXRoX3JlcXVpcmVkKHJuZXcpCi0gICAgICAgICAgICAgICAgICAgfHwgKChyZXMgPSBhcF9jaGVja191c2VyX2lkKHJuZXcpKQotICAgICAgICAgICAgICAgICAgICAgICB8fCAocmVzID0gYXBfY2hlY2tfYXV0aChybmV3KSkpKSkKLSAgICAgICAgICAgKQotICAgICAgICB8fCAocmVzID0gYXBfZmluZF90eXBlcyhybmV3KSkKLSAgICAgICAgfHwgKHJlcyA9IGFwX3J1bl9maXh1cHMocm5ldykpCi0gICAgICAgKSB7Ci0gICAgICAgIHJuZXctPnN0YXR1cyA9IHJlczsKLSAgICB9Ci0gICAgcmV0dXJuIHJuZXc7Ci19Ci0KLUFQSV9FWFBPUlQocmVxdWVzdF9yZWMgKikgYXBfc3ViX3JlcV9sb29rdXBfdXJpKGNvbnN0IGNoYXIgKm5ld19maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgcmV0dXJuIGFwX3N1Yl9yZXFfbWV0aG9kX3VyaSgiR0VUIiwgbmV3X2ZpbGUsIHIpOwotfQotCi1BUElfRVhQT1JUKHJlcXVlc3RfcmVjICopIGFwX3N1Yl9yZXFfbG9va3VwX2ZpbGUoY29uc3QgY2hhciAqbmV3X2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgcmVxdWVzdF9yZWMgKnJuZXc7Ci0gICAgaW50IHJlczsKLSAgICBjaGFyICpmZGlyOwotCi0gICAgcm5ldyA9IG1ha2Vfc3ViX3JlcXVlc3Qocik7Ci0gICAgcm5ldy0+aG9zdG5hbWUgICAgICAgPSByLT5ob3N0bmFtZTsKLSAgICBybmV3LT5yZXF1ZXN0X3RpbWUgICA9IHItPnJlcXVlc3RfdGltZTsKLSAgICBybmV3LT5jb25uZWN0aW9uICAgICA9IHItPmNvbm5lY3Rpb247Ci0gICAgcm5ldy0+c2VydmVyICAgICAgICAgPSByLT5zZXJ2ZXI7Ci0gICAgcm5ldy0+cmVxdWVzdF9jb25maWcgPSBhcF9jcmVhdGVfcmVxdWVzdF9jb25maWcocm5ldy0+cG9vbCk7Ci0gICAgcm5ldy0+aHRhY2Nlc3MgICAgICAgPSByLT5odGFjY2VzczsKLQotICAgIGFwX3NldF9zdWJfcmVxX3Byb3RvY29sKHJuZXcsIHIpOwotICAgIGZkaXIgPSBhcF9tYWtlX2RpcnN0cl9wYXJlbnQocm5ldy0+cG9vbCwgci0+ZmlsZW5hbWUpOwotCi0gICAgLyoKLSAgICAgKiBDaGVjayBmb3IgYSBzcGVjaWFsIGNhc2UuLi4gaWYgdGhlcmUgYXJlIG5vICcvJyBjaGFyYWN0ZXJzIGluIG5ld19maWxlCi0gICAgICogYXQgYWxsLCB0aGVuIHdlIGFyZSBsb29raW5nIGF0IGEgcmVsYXRpdmUgbG9va3VwIGluIHRoZSBzYW1lCi0gICAgICogZGlyZWN0b3J5LiBUaGF0IG1lYW5zIHdlIHdvbid0IGhhdmUgdG8gcmVkbyBkaXJlY3Rvcnlfd2FsaywgYW5kIHdlIG1heQotICAgICAqIG5vdCBldmVuIGhhdmUgdG8gcmVkbyBhY2Nlc3MgY2hlY2tzLgotICAgICAqLwotCi0gICAgaWYgKHN0cmNocihuZXdfZmlsZSwgJy8nKSA9PSBOVUxMKSB7Ci0gICAgICAgIGNoYXIgKnVkaXIgPSBhcF9tYWtlX2RpcnN0cl9wYXJlbnQocm5ldy0+cG9vbCwgci0+dXJpKTsKLQotICAgICAgICBybmV3LT51cmkgPSBhcF9tYWtlX2Z1bGxfcGF0aChybmV3LT5wb29sLCB1ZGlyLCBuZXdfZmlsZSk7Ci0gICAgICAgIHJuZXctPmZpbGVuYW1lID0gYXBfbWFrZV9mdWxsX3BhdGgocm5ldy0+cG9vbCwgZmRpciwgbmV3X2ZpbGUpOwotICAgICAgICBhcF9wYXJzZV91cmkocm5ldywgcm5ldy0+dXJpKTsgICAgLyogZmlsbCBpbiBwYXJzZWRfdXJpIHZhbHVlcyAqLwotICAgICAgICBpZiAoc3RhdChybmV3LT5maWxlbmFtZSwgJnJuZXctPmZpbmZvKSA8IDApIHsKLSAgICAgICAgICAgIHJuZXctPmZpbmZvLnN0X21vZGUgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChyZXMgPSBjaGVja19zYWZlX2ZpbGUocm5ldykpKSB7Ci0gICAgICAgICAgICBybmV3LT5zdGF0dXMgPSByZXM7Ci0gICAgICAgICAgICByZXR1cm4gcm5ldzsKLSAgICAgICAgfQotCi0gICAgICAgIHJuZXctPnBlcl9kaXJfY29uZmlnID0gci0+cGVyX2Rpcl9jb25maWc7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogbm8gbWF0dGVyIHdoYXQsIGlmIGl0J3MgYSBzdWJkaXJlY3RvcnksIHdlIG5lZWQgdG8gcmUtcnVuCi0gICAgICAgICAqIGRpcmVjdG9yeV93YWxrCi0gICAgICAgICAqLwotICAgICAgICBpZiAoU19JU0RJUihybmV3LT5maW5mby5zdF9tb2RlKSkgewotICAgICAgICAgICAgcmVzID0gZGlyZWN0b3J5X3dhbGsocm5ldyk7Ci0gICAgICAgICAgICBpZiAoIXJlcykgewotICAgICAgICAgICAgICAgIHJlcyA9IGZpbGVfd2FsayhybmV3KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmICgocmVzID0gY2hlY2tfc3ltbGlua3Mocm5ldy0+ZmlsZW5hbWUsIGFwX2FsbG93X29wdGlvbnMocm5ldykpKSkgewotICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHJuZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN5bWJvbGljIGxpbmsgbm90IGFsbG93ZWQ6ICVzIiwgcm5ldy0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIHJuZXctPnN0YXR1cyA9IHJlczsKLSAgICAgICAgICAgICAgICByZXR1cm4gcm5ldzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBkbyBhIGZpbGVfd2FsaywgaWYgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHBlcl9kaXJfY29uZmlnIHRoZW4KLSAgICAgICAgICAgICAqIHdlIGtub3cgdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHJlZG8gYWxsIHRoZSBhY2Nlc3MgY2hlY2tzCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICgocmVzID0gZmlsZV93YWxrKHJuZXcpKSkgewotICAgICAgICAgICAgICAgIHJuZXctPnN0YXR1cyA9IHJlczsKLSAgICAgICAgICAgICAgICByZXR1cm4gcm5ldzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChybmV3LT5wZXJfZGlyX2NvbmZpZyA9PSByLT5wZXJfZGlyX2NvbmZpZykgewotICAgICAgICAgICAgICAgIGlmICgocmVzID0gYXBfZmluZF90eXBlcyhybmV3KSkgfHwgKHJlcyA9IGFwX3J1bl9maXh1cHMocm5ldykpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJuZXctPnN0YXR1cyA9IHJlczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJuZXc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0JLyogWFhYOiBAQEA6IFdoYXQgc2hvdWxkIGJlIGRvbmUgd2l0aCB0aGUgcGFyc2VkX3VyaSB2YWx1ZXM/ICovCi0JYXBfcGFyc2VfdXJpKHJuZXcsIG5ld19maWxlKTsJLyogZmlsbCBpbiBwYXJzZWRfdXJpIHZhbHVlcyAqLwotICAgICAgICAvKgotICAgICAgICAgKiBYWFg6IHRoaXMgc2hvdWxkIGJlIHNldCBwcm9wZXJseSBsaWtlIGl0IGlzIGluIHRoZSBzYW1lLWRpciBjYXNlCi0gICAgICAgICAqIGJ1dCBpdCdzIGFjdHVhbGx5IHNvbWV0aW1lcyB0byBpbXBvc3NpYmxlIHRvIGRvIGl0Li4uIGJlY2F1c2UgdGhlCi0gICAgICAgICAqIGZpbGUgbWF5IG5vdCBoYXZlIGEgdXJpIGFzc29jaWF0ZWQgd2l0aCBpdCAtZGpnCi0gICAgICAgICAqLwotICAgICAgICBybmV3LT51cmkgPSAiSU5URVJOQUxMWSBHRU5FUkFURUQgZmlsZS1yZWxhdGl2ZSByZXEiOwotICAgICAgICBybmV3LT5maWxlbmFtZSA9ICgoYXBfb3NfaXNfcGF0aF9hYnNvbHV0ZShuZXdfZmlsZSkpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfcHN0cmR1cChybmV3LT5wb29sLCBuZXdfZmlsZSkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9tYWtlX2Z1bGxfcGF0aChybmV3LT5wb29sLCBmZGlyLCBuZXdfZmlsZSkpOwotICAgICAgICBybmV3LT5wZXJfZGlyX2NvbmZpZyA9IHItPnNlcnZlci0+bG9va3VwX2RlZmF1bHRzOwotICAgICAgICByZXMgPSBkaXJlY3Rvcnlfd2FsayhybmV3KTsKLSAgICAgICAgaWYgKCFyZXMpIHsKLSAgICAgICAgICAgIHJlcyA9IGZpbGVfd2FsayhybmV3KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChyZXMKLSAgICAgICAgfHwgKChhcF9zYXRpc2ZpZXMocm5ldykgPT0gU0FUSVNGWV9BTEwKLSAgICAgICAgICAgICB8fCBhcF9zYXRpc2ZpZXMocm5ldykgPT0gU0FUSVNGWV9OT1NQRUMpCi0gICAgICAgICAgICA/ICgocmVzID0gYXBfY2hlY2tfYWNjZXNzKHJuZXcpKQotICAgICAgICAgICAgICAgfHwgKGFwX3NvbWVfYXV0aF9yZXF1aXJlZChybmV3KQotICAgICAgICAgICAgICAgICAgICYmICgocmVzID0gYXBfY2hlY2tfdXNlcl9pZChybmV3KSkKLSAgICAgICAgICAgICAgICAgICAgICAgfHwgKHJlcyA9IGFwX2NoZWNrX2F1dGgocm5ldykpKSkpCi0gICAgICAgICAgICA6ICgocmVzID0gYXBfY2hlY2tfYWNjZXNzKHJuZXcpKQotICAgICAgICAgICAgICAgJiYgKCFhcF9zb21lX2F1dGhfcmVxdWlyZWQocm5ldykKLSAgICAgICAgICAgICAgICAgICB8fCAoKHJlcyA9IGFwX2NoZWNrX3VzZXJfaWQocm5ldykpCi0gICAgICAgICAgICAgICAgICAgICAgIHx8IChyZXMgPSBhcF9jaGVja19hdXRoKHJuZXcpKSkpKQotICAgICAgICAgICApCi0gICAgICAgIHx8IChyZXMgPSBhcF9maW5kX3R5cGVzKHJuZXcpKQotICAgICAgICB8fCAocmVzID0gYXBfcnVuX2ZpeHVwcyhybmV3KSkKLSAgICAgICApIHsKLSAgICAgICAgcm5ldy0+c3RhdHVzID0gcmVzOwotICAgIH0KLSAgICByZXR1cm4gcm5ldzsKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX3J1bl9zdWJfcmVxKHJlcXVlc3RfcmVjICpyKQotewotI2lmbmRlZiBDSEFSU0VUX0VCQ0RJQwotICAgIGludCByZXR2YWwgPSBhcF9pbnZva2VfaGFuZGxlcihyKTsKLSNlbHNlIC8qQ0hBUlNFVF9FQkNESUMqLwotICAgIC8qIFNhdmUgdGhlIEVCQ0RJQyBjb252ZXJzaW9uIHNldHRpbmcgb2YgdGhlIGNhbGxlciBhY3Jvc3Mgc3VicmVxdWVzdHMgKi8KLSAgICBpbnQgY29udmVydCA9IGFwX2JnZXRmbGFnKHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQl9FQkNESUMyQVNDSUkpOwotICAgIGludCByZXR2YWwgID0gYXBfaW52b2tlX2hhbmRsZXIocik7Ci0gICAgYXBfYnNldGZsYWcoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCX0VCQ0RJQzJBU0NJSSwgY29udmVydCk7Ci0jZW5kaWYgLypDSEFSU0VUX0VCQ0RJQyovCi0gICAgYXBfZmluYWxpemVfc3ViX3JlcV9wcm90b2NvbChyKTsKLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX2Rlc3Ryb3lfc3ViX3JlcShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICAvKiBSZWNsYWltIHRoZSBzcGFjZSAqLwotICAgIGFwX2Rlc3Ryb3lfcG9vbChyLT5wb29sKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTWFpbmxpbmUgcmVxdWVzdCBwcm9jZXNzaW5nLi4uCi0gKi8KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9kaWUoaW50IHR5cGUsIHJlcXVlc3RfcmVjICpyKQotewotICAgIGludCBlcnJvcl9pbmRleCA9IGFwX2luZGV4X29mX3Jlc3BvbnNlKHR5cGUpOwotICAgIGNoYXIgKmN1c3RvbV9yZXNwb25zZSA9IGFwX3Jlc3BvbnNlX2NvZGVfc3RyaW5nKHIsIGVycm9yX2luZGV4KTsKLSAgICBpbnQgcmVjdXJzaXZlX2Vycm9yID0gMDsKLQotICAgIGlmICh0eXBlID09IERPTkUpIHsKLSAgICAgICAgYXBfZmluYWxpemVfcmVxdWVzdF9wcm90b2NvbChyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVGhlIGZvbGxvd2luZyB0YWtlcyBjYXJlIG9mIEFwYWNoZSByZWRpcmVjdHMgdG8gY3VzdG9tIHJlc3BvbnNlIFVSTHMKLSAgICAgKiBOb3RlIHRoYXQgaWYgd2UgYXJlIGFscmVhZHkgZGVhbGluZyB3aXRoIHRoZSByZXNwb25zZSB0byBzb21lIG90aGVyCi0gICAgICogZXJyb3IgY29uZGl0aW9uLCB3ZSBqdXN0IHJlcG9ydCBvbiB0aGUgb3JpZ2luYWwgZXJyb3IsIGFuZCBnaXZlIHVwIG9uCi0gICAgICogYW55IGF0dGVtcHQgdG8gaGFuZGxlIHRoZSBvdGhlciB0aGluZyAiaW50ZWxsaWdlbnRseSIuLi4KLSAgICAgKi8KLQotICAgIGlmIChyLT5zdGF0dXMgIT0gSFRUUF9PSykgewotICAgICAgICByZWN1cnNpdmVfZXJyb3IgPSB0eXBlOwotCi0gICAgICAgIHdoaWxlIChyLT5wcmV2ICYmIChyLT5wcmV2LT5zdGF0dXMgIT0gSFRUUF9PSykpCi0gICAgICAgICAgICByID0gci0+cHJldjsgICAgICAgIC8qIEdldCBiYWNrIHRvIG9yaWdpbmFsIGVycm9yICovCi0KLSAgICAgICAgdHlwZSA9IHItPnN0YXR1czsKLSAgICAgICAgY3VzdG9tX3Jlc3BvbnNlID0gTlVMTDsgLyogRG8gTk9UIHJldHJ5IHRoZSBjdXN0b20gdGhpbmchICovCi0gICAgfQotCi0gICAgci0+c3RhdHVzID0gdHlwZTsKLQotICAgIC8qCi0gICAgICogVGhpcyB0ZXN0IGlzIGRvbmUgaGVyZSBzbyB0aGF0IG5vbmUgb2YgdGhlIGF1dGggbW9kdWxlcyBuZWVkcyB0byBrbm93Ci0gICAgICogYWJvdXQgcHJveHkgYXV0aGVudGljYXRpb24uICBUaGV5IHRyZWF0IGl0IGxpa2Ugbm9ybWFsIGF1dGgsIGFuZCB0aGVuCi0gICAgICogd2UgdHdlYWsgdGhlIHN0YXR1cy4KLSAgICAgKi8KLSAgICBpZiAoci0+c3RhdHVzID09IEFVVEhfUkVRVUlSRUQgJiYgci0+cHJveHlyZXEpIHsKLSAgICAgICAgci0+c3RhdHVzID0gSFRUUF9QUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIElmIHdlIHdhbnQgdG8ga2VlcCB0aGUgY29ubmVjdGlvbiwgYmUgc3VyZSB0aGF0IHRoZSByZXF1ZXN0IGJvZHkKLSAgICAgKiAoaWYgYW55KSBoYXMgYmVlbiByZWFkLgotICAgICAqLwotICAgIGlmICgoci0+c3RhdHVzICE9IEhUVFBfTk9UX01PRElGSUVEKSAmJiAoci0+c3RhdHVzICE9IEhUVFBfTk9fQ09OVEVOVCkKLSAgICAgICAgJiYgIWFwX3N0YXR1c19kcm9wc19jb25uZWN0aW9uKHItPnN0YXR1cykKLSAgICAgICAgJiYgci0+Y29ubmVjdGlvbiAmJiAoci0+Y29ubmVjdGlvbi0+a2VlcGFsaXZlICE9IC0xKSkgewotCi0gICAgICAgICh2b2lkKSBhcF9kaXNjYXJkX3JlcXVlc3RfYm9keShyKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFR3byB0eXBlcyBvZiBjdXN0b20gcmVkaXJlY3RzIC0tLSBwbGFpbiB0ZXh0LCBhbmQgVVJMcy4gUGxhaW4gdGV4dCBoYXMKLSAgICAgKiBhIGxlYWRpbmcgJyInLCBzbyB0aGUgVVJMIGNvZGUsIGhlcmUsIGlzIHRyaWdnZXJlZCBvbiBpdHMgYWJzZW5jZQotICAgICAqLwotCi0gICAgaWYgKGN1c3RvbV9yZXNwb25zZSAmJiBjdXN0b21fcmVzcG9uc2VbMF0gIT0gJyInKSB7Ci0KLSAgICAgICAgaWYgKGFwX2lzX3VybChjdXN0b21fcmVzcG9uc2UpKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVGhlIFVSTCBpc24ndCBsb2NhbCwgc28gbGV0cyBkcm9wIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhpcwotICAgICAgICAgICAgICogYXBhY2hlIGNvZGUsIGFuZCBjb250aW51ZSB3aXRoIHRoZSB1c3VhbCBSRURJUkVDVCBoYW5kbGVyLgotICAgICAgICAgICAgICogQnV0IG5vdGUgdGhhdCB0aGUgY2xpZW50IHdpbGwgdWx0aW1hdGVseSBzZWUgdGhlIHdyb25nCi0gICAgICAgICAgICAgKiBzdGF0dXMuLi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgci0+c3RhdHVzID0gUkVESVJFQ1Q7Ci0gICAgICAgICAgICBhcF90YWJsZV9zZXRuKHItPmhlYWRlcnNfb3V0LCAiTG9jYXRpb24iLCBjdXN0b21fcmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGN1c3RvbV9yZXNwb25zZVswXSA9PSAnLycpIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9yX25vdGVzOwotICAgICAgICAgICAgci0+bm9fbG9jYWxfY29weSA9IDE7ICAgICAgIC8qIERvIE5PVCBzZW5kIFVTRV9MT0NBTF9DT1BZIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGVycm9yIGRvY3VtZW50cyEgKi8KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBUaGlzIHJlZGlyZWN0IG5lZWRzIHRvIGJlIGEgR0VUIG5vIG1hdHRlciB3aGF0IHRoZSBvcmlnaW5hbAotICAgICAgICAgICAgICogbWV0aG9kIHdhcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYXBfdGFibGVfc2V0bihyLT5zdWJwcm9jZXNzX2VudiwgIlJFUVVFU1RfTUVUSE9EIiwgci0+bWV0aG9kKTsKLQotCSAgICAvKgotCSAgICAgKiBQcm92aWRlIGEgc3BlY2lhbCBtZXRob2QgZm9yIG1vZHVsZXMgdG8gY29tbXVuaWNhdGUKLQkgICAgICogbW9yZSBpbmZvcm1hdGl2ZSAodGhhbiB0aGUgcGxhaW4gY2FubmVkKSBtZXNzYWdlcyB0byB1cy4KLQkgICAgICogUHJvcGFnYXRlIHRoZW0gdG8gRXJyb3JEb2N1bWVudHMgdmlhIHRoZSBFUlJPUl9OT1RFUyB2YXJpYWJsZToKLQkgICAgICovCi0gICAgICAgICAgICBpZiAoKGVycm9yX25vdGVzID0gYXBfdGFibGVfZ2V0KHItPm5vdGVzLCAiZXJyb3Itbm90ZXMiKSkgIT0gTlVMTCkgewotCQlhcF90YWJsZV9zZXRuKHItPnN1YnByb2Nlc3NfZW52LCAiRVJST1JfTk9URVMiLCBlcnJvcl9ub3Rlcyk7Ci0JICAgIH0KLSAgICAgICAgICAgIHItPm1ldGhvZCA9IGFwX3BzdHJkdXAoci0+cG9vbCwgIkdFVCIpOwotICAgICAgICAgICAgci0+bWV0aG9kX251bWJlciA9IE1fR0VUOwotICAgICAgICAgICAgYXBfaW50ZXJuYWxfcmVkaXJlY3QoY3VzdG9tX3Jlc3BvbnNlLCByKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBEdW1iIHVzZXIgaGFzIGdpdmVuIHVzIGEgYmFkIHVybCB0byByZWRpcmVjdCB0byAtLS0gZmFrZSB1cAotICAgICAgICAgICAgICogZHlpbmcgd2l0aCBhIHJlY3Vyc2l2ZSBzZXJ2ZXIgZXJyb3IuLi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcmVjdXJzaXZlX2Vycm9yID0gU0VSVkVSX0VSUk9SOwotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGVycm9yIHJlZGlyZWN0aW9uIGRpcmVjdGl2ZTogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tX3Jlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBhcF9zZW5kX2Vycm9yX3Jlc3BvbnNlKHIsIHJlY3Vyc2l2ZV9lcnJvcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlY2xfZGllKGludCBzdGF0dXMsIGNoYXIgKnBoYXNlLCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpZiAoc3RhdHVzID09IERFQ0xJTkVEKSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19DUklULCByLAotICAgICAgICAgICAgICAgICAgICAiY29uZmlndXJhdGlvbiBlcnJvcjogIGNvdWxkbid0ICVzOiAlcyIsIHBoYXNlLCByLT51cmkpOwotICAgICAgICBhcF9kaWUoU0VSVkVSX0VSUk9SLCByKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBhcF9kaWUoc3RhdHVzLCByKTsKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX3NvbWVfYXV0aF9yZXF1aXJlZChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICAvKiBJcyB0aGVyZSBhIHJlcXVpcmUgbGluZSBjb25maWd1cmVkIGZvciB0aGUgdHlwZSBvZiAqdGhpcyogcmVxPyAqLwotCi0gICAgY29uc3QgYXJyYXlfaGVhZGVyICpyZXFzX2FyciA9IGFwX3JlcXVpcmVzKHIpOwotICAgIHJlcXVpcmVfbGluZSAqcmVxczsKLSAgICBpbnQgaTsKLQotICAgIGlmICghcmVxc19hcnIpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmVxcyA9IChyZXF1aXJlX2xpbmUgKikgcmVxc19hcnItPmVsdHM7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcmVxc19hcnItPm5lbHRzOyArK2kpCi0gICAgICAgIGlmIChyZXFzW2ldLm1ldGhvZF9tYXNrICYgKDEgPDwgci0+bWV0aG9kX251bWJlcikpCi0gICAgICAgICAgICByZXR1cm4gMTsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBwcm9jZXNzX3JlcXVlc3RfaW50ZXJuYWwocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IGFjY2Vzc19zdGF0dXM7Ci0KLSAgICAvKiBJZ25vcmUgZW1iZWRkZWQgJTJGJ3MgaW4gcGF0aCBmb3IgcHJveHkgcmVxdWVzdHMgKi8KLSAgICBpZiAoIXItPnByb3h5cmVxICYmIHItPnBhcnNlZF91cmkucGF0aCkgewotCWFjY2Vzc19zdGF0dXMgPSBhcF91bmVzY2FwZV91cmwoci0+cGFyc2VkX3VyaS5wYXRoKTsKLQlpZiAoYWNjZXNzX3N0YXR1cykgewotCSAgICBhcF9kaWUoYWNjZXNzX3N0YXR1cywgcik7Ci0JICAgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gICAgYXBfZ2V0cGFyZW50cyhyLT51cmkpOyAgICAgLyogT0sgLS0tIHNocmlua2luZyB0cmFuc2Zvcm1hdGlvbnMuLi4gKi8KLQotICAgIGlmICgoYWNjZXNzX3N0YXR1cyA9IGxvY2F0aW9uX3dhbGsocikpKSB7Ci0gICAgICAgIGFwX2RpZShhY2Nlc3Nfc3RhdHVzLCByKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICgoYWNjZXNzX3N0YXR1cyA9IGFwX3RyYW5zbGF0ZV9uYW1lKHIpKSkgewotICAgICAgICBkZWNsX2RpZShhY2Nlc3Nfc3RhdHVzLCAidHJhbnNsYXRlIiwgcik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIXItPnByb3h5cmVxKSB7Ci0JLyoKLQkgKiBXZSBkb24ndCB3YW50IFRSQUNFIHRvIHJ1biB0aHJvdWdoIHRoZSBub3JtYWwgaGFuZGxlciBzZXQsIHdlCi0JICogaGFuZGxlIGl0IHNwZWNpYWxseS4KLQkgKi8KLQlpZiAoci0+bWV0aG9kX251bWJlciA9PSBNX1RSQUNFKSB7Ci0JICAgIGlmICgoYWNjZXNzX3N0YXR1cyA9IGFwX3NlbmRfaHR0cF90cmFjZShyKSkpCi0JCWFwX2RpZShhY2Nlc3Nfc3RhdHVzLCByKTsKLQkgICAgZWxzZQotCQlhcF9maW5hbGl6ZV9yZXF1ZXN0X3Byb3RvY29sKHIpOwotCSAgICByZXR1cm47Ci0JfQotICAgIH0KLQotICAgIGlmIChyLT5wcm90b19udW0gPiBIVFRQX1ZFUlNJT04oMSwwKSAmJiBhcF90YWJsZV9nZXQoci0+c3VicHJvY2Vzc19lbnYsICJkb3duZ3JhZGUtMS4wIikpIHsKLSAgICAgICAgci0+cHJvdG9fbnVtID0gSFRUUF9WRVJTSU9OKDEsMCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBOQjogZGlyZWN0b3J5X3dhbGsoKSBjbGVhcnMgdGhlIHBlcl9kaXJfY29uZmlnLCBzbyB3ZSBkb24ndCBpbmhlcml0Ci0gICAgICogZnJvbSBsb2NhdGlvbl93YWxrKCkgYWJvdmUKLSAgICAgKi8KLQotICAgIGlmICgoYWNjZXNzX3N0YXR1cyA9IGRpcmVjdG9yeV93YWxrKHIpKSkgewotICAgICAgICBhcF9kaWUoYWNjZXNzX3N0YXR1cywgcik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoKGFjY2Vzc19zdGF0dXMgPSBmaWxlX3dhbGsocikpKSB7Ci0gICAgICAgIGFwX2RpZShhY2Nlc3Nfc3RhdHVzLCByKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICgoYWNjZXNzX3N0YXR1cyA9IGxvY2F0aW9uX3dhbGsocikpKSB7Ci0gICAgICAgIGFwX2RpZShhY2Nlc3Nfc3RhdHVzLCByKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICgoYWNjZXNzX3N0YXR1cyA9IGFwX2hlYWRlcl9wYXJzZShyKSkpIHsKLSAgICAgICAgYXBfZGllKGFjY2Vzc19zdGF0dXMsIHIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3dpdGNoIChhcF9zYXRpc2ZpZXMocikpIHsKLSAgICBjYXNlIFNBVElTRllfQUxMOgotICAgIGNhc2UgU0FUSVNGWV9OT1NQRUM6Ci0gICAgICAgIGlmICgoYWNjZXNzX3N0YXR1cyA9IGFwX2NoZWNrX2FjY2VzcyhyKSkgIT0gMCkgewotICAgICAgICAgICAgZGVjbF9kaWUoYWNjZXNzX3N0YXR1cywgImNoZWNrIGFjY2VzcyIsIHIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhcF9zb21lX2F1dGhfcmVxdWlyZWQocikpIHsKLSAgICAgICAgICAgIGlmICgoKGFjY2Vzc19zdGF0dXMgPSBhcF9jaGVja191c2VyX2lkKHIpKSAhPSAwKSB8fCAhYXBfYXV0aF90eXBlKHIpKSB7Ci0gICAgICAgICAgICAgICAgZGVjbF9kaWUoYWNjZXNzX3N0YXR1cywgYXBfYXV0aF90eXBlKHIpCi0JCSAgICA/ICJjaGVjayB1c2VyLiAgTm8gdXNlciBmaWxlPyIKLQkJICAgIDogInBlcmZvcm0gYXV0aGVudGljYXRpb24uIEF1dGhUeXBlIG5vdCBzZXQhIiwgcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCgoYWNjZXNzX3N0YXR1cyA9IGFwX2NoZWNrX2F1dGgocikpICE9IDApIHx8ICFhcF9hdXRoX3R5cGUocikpIHsKLSAgICAgICAgICAgICAgICBkZWNsX2RpZShhY2Nlc3Nfc3RhdHVzLCBhcF9hdXRoX3R5cGUocikKLQkJICAgID8gImNoZWNrIGFjY2Vzcy4gIE5vIGdyb3VwcyBmaWxlPyIKLQkJICAgIDogInBlcmZvcm0gYXV0aGVudGljYXRpb24uIEF1dGhUeXBlIG5vdCBzZXQhIiwgcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU0FUSVNGWV9BTlk6Ci0gICAgICAgIGlmICgoKGFjY2Vzc19zdGF0dXMgPSBhcF9jaGVja19hY2Nlc3MocikpICE9IDApIHx8ICFhcF9hdXRoX3R5cGUocikpIHsKLSAgICAgICAgICAgIGlmICghYXBfc29tZV9hdXRoX3JlcXVpcmVkKHIpKSB7Ci0gICAgICAgICAgICAgICAgZGVjbF9kaWUoYWNjZXNzX3N0YXR1cywgYXBfYXV0aF90eXBlKHIpCi0JCSAgICA/ICJjaGVjayBhY2Nlc3MiCi0JCSAgICA6ICJwZXJmb3JtIGF1dGhlbnRpY2F0aW9uLiBBdXRoVHlwZSBub3Qgc2V0ISIsIHIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoKGFjY2Vzc19zdGF0dXMgPSBhcF9jaGVja191c2VyX2lkKHIpKSAhPSAwKSB8fCAhYXBfYXV0aF90eXBlKHIpKSB7Ci0gICAgICAgICAgICAgICAgZGVjbF9kaWUoYWNjZXNzX3N0YXR1cywgYXBfYXV0aF90eXBlKHIpCi0JCSAgICA/ICJjaGVjayB1c2VyLiAgTm8gdXNlciBmaWxlPyIKLQkJICAgIDogInBlcmZvcm0gYXV0aGVudGljYXRpb24uIEF1dGhUeXBlIG5vdCBzZXQhIiwgcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCgoYWNjZXNzX3N0YXR1cyA9IGFwX2NoZWNrX2F1dGgocikpICE9IDApIHx8ICFhcF9hdXRoX3R5cGUocikpIHsKLSAgICAgICAgICAgICAgICBkZWNsX2RpZShhY2Nlc3Nfc3RhdHVzLCBhcF9hdXRoX3R5cGUocikKLQkJICAgID8gImNoZWNrIGFjY2Vzcy4gIE5vIGdyb3VwcyBmaWxlPyIKLQkJICAgIDogInBlcmZvcm0gYXV0aGVudGljYXRpb24uIEF1dGhUeXBlIG5vdCBzZXQhIiwgcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmICghIChyLT5wcm94eXJlcSAKLQkgICAmJiByLT5wYXJzZWRfdXJpLnNjaGVtZSAhPSBOVUxMCi0JICAgJiYgc3RyY21wKHItPnBhcnNlZF91cmkuc2NoZW1lLCAiaHR0cCIpID09IDApICkgewotCWlmICgoYWNjZXNzX3N0YXR1cyA9IGFwX2ZpbmRfdHlwZXMocikpICE9IDApIHsKLQkgICAgZGVjbF9kaWUoYWNjZXNzX3N0YXR1cywgImZpbmQgdHlwZXMiLCByKTsKLQkgICAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgICBpZiAoKGFjY2Vzc19zdGF0dXMgPSBhcF9ydW5fZml4dXBzKHIpKSAhPSAwKSB7Ci0gICAgICAgIGFwX2RpZShhY2Nlc3Nfc3RhdHVzLCByKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICgoYWNjZXNzX3N0YXR1cyA9IGFwX2ludm9rZV9oYW5kbGVyKHIpKSAhPSAwKSB7Ci0gICAgICAgIGFwX2RpZShhY2Nlc3Nfc3RhdHVzLCByKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIFRha2UgY2FyZSBvZiBsaXR0bGUgdGhpbmdzIHRoYXQgbmVlZCB0byBoYXBwZW4gd2hlbiB3ZSdyZSBkb25lICovCi0gICAgYXBfZmluYWxpemVfcmVxdWVzdF9wcm90b2NvbChyKTsKLX0KLQotdm9pZCBhcF9wcm9jZXNzX3JlcXVlc3QocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IG9sZF9zdGF0OwotCi0gICAgaWYgKGFwX2V4dGVuZGVkX3N0YXR1cykKLQlhcF90aW1lX3Byb2Nlc3NfcmVxdWVzdChyLT5jb25uZWN0aW9uLT5jaGlsZF9udW0sIFNUQVJUX1BSRVFVRVNUKTsKLQotICAgIHByb2Nlc3NfcmVxdWVzdF9pbnRlcm5hbChyKTsKLQotICAgIG9sZF9zdGF0ID0gYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhyLT5jb25uZWN0aW9uLT5jaGlsZF9udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFUlZFUl9CVVNZX0xPRywgcik7Ci0KLSAgICAvKgotICAgICAqIFdlIHdhbnQgdG8gZmx1c2ggdGhlIGxhc3QgcGFja2V0IGlmIHRoaXMgaXNuJ3QgYSBwaXBlbGluaW5nIGNvbm5lY3Rpb24KLSAgICAgKiAqYmVmb3JlKiB3ZSBzdGFydCBpbnRvIGxvZ2dpbmcuICBTdXBwb3NlIHRoYXQgdGhlIGxvZ2dpbmcgY2F1c2VzIGEgRE5TCi0gICAgICogbG9va3VwIHRvIG9jY3VyLCB3aGljaCBtYXkgaGF2ZSBhIGhpZ2ggbGF0ZW5jeS4gIElmIHdlIGhvbGQgb2ZmIG9uCi0gICAgICogdGhpcyBwYWNrZXQsIHRoZW4gaXQnbGwgYXBwZWFyIGxpa2UgdGhlIGxpbmsgaXMgc3RhbGxlZCB3aGVuIHJlYWxseQotICAgICAqIGl0J3MgdGhlIGFwcGxpY2F0aW9uIHRoYXQncyBzdGFsbGVkLgotICAgICAqLwotICAgIGFwX2JoYWxmZHVwbGV4KHItPmNvbm5lY3Rpb24tPmNsaWVudCk7Ci0gICAgYXBfbG9nX3RyYW5zYWN0aW9uKHIpOwotCi0gICAgKHZvaWQpIGFwX3VwZGF0ZV9jaGlsZF9zdGF0dXMoci0+Y29ubmVjdGlvbi0+Y2hpbGRfbnVtLCBvbGRfc3RhdCwgcik7Ci0gICAgaWYgKGFwX2V4dGVuZGVkX3N0YXR1cykKLQlhcF90aW1lX3Byb2Nlc3NfcmVxdWVzdChyLT5jb25uZWN0aW9uLT5jaGlsZF9udW0sIFNUT1BfUFJFUVVFU1QpOwotfQotCi1zdGF0aWMgdGFibGUgKnJlbmFtZV9vcmlnaW5hbF9lbnYocG9vbCAqcCwgdGFibGUgKnQpCi17Ci0gICAgYXJyYXlfaGVhZGVyICplbnZfYXJyID0gYXBfdGFibGVfZWx0cyh0KTsKLSAgICB0YWJsZV9lbnRyeSAqZWx0cyA9ICh0YWJsZV9lbnRyeSAqKSBlbnZfYXJyLT5lbHRzOwotICAgIHRhYmxlICpuZXcgPSBhcF9tYWtlX3RhYmxlKHAsIGVudl9hcnItPm5hbGxvYyk7Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgZW52X2Fyci0+bmVsdHM7ICsraSkgewotICAgICAgICBpZiAoIWVsdHNbaV0ua2V5KQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGFwX3RhYmxlX3NldG4obmV3LCBhcF9wc3RyY2F0KHAsICJSRURJUkVDVF8iLCBlbHRzW2ldLmtleSwgTlVMTCksCi0gICAgICAgICAgICAgICAgICBlbHRzW2ldLnZhbCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIHJlcXVlc3RfcmVjICppbnRlcm5hbF9pbnRlcm5hbF9yZWRpcmVjdChjb25zdCBjaGFyICpuZXdfdXJpLCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpbnQgYWNjZXNzX3N0YXR1czsKLSAgICByZXF1ZXN0X3JlYyAqbmV3ID0gKHJlcXVlc3RfcmVjICopIGFwX3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKHJlcXVlc3RfcmVjKSk7Ci0KLSAgICBuZXctPmNvbm5lY3Rpb24gPSByLT5jb25uZWN0aW9uOwotICAgIG5ldy0+c2VydmVyICAgICA9IHItPnNlcnZlcjsKLSAgICBuZXctPnBvb2wgICAgICAgPSByLT5wb29sOwotCi0gICAgLyoKLSAgICAgKiBBIHdob2xlIGxvdCBvZiB0aGlzIHJlYWxseSBvdWdodCB0byBiZSBzaGFyZWQgd2l0aCBodHRwX3Byb3RvY29sLmMuLi4KLSAgICAgKiBhbm90aGVyIG1pc3NpbmcgY2xlYW51cC4gIEl0J3MgcGFydGljdWxhcmx5IGluYXBwcm9wcmlhdGUgdG8gYmUKLSAgICAgKiBzZXR0aW5nIGhlYWRlcl9vbmx5LCBldGMuLCBoZXJlLgotICAgICAqLwotCi0gICAgbmV3LT5tZXRob2QgICAgICAgICAgPSByLT5tZXRob2Q7Ci0gICAgbmV3LT5tZXRob2RfbnVtYmVyICAgPSByLT5tZXRob2RfbnVtYmVyOwotICAgIGFwX3BhcnNlX3VyaShuZXcsIG5ld191cmkpOwotICAgIG5ldy0+cmVxdWVzdF9jb25maWcgPSBhcF9jcmVhdGVfcmVxdWVzdF9jb25maWcoci0+cG9vbCk7Ci0gICAgbmV3LT5wZXJfZGlyX2NvbmZpZyA9IHItPnNlcnZlci0+bG9va3VwX2RlZmF1bHRzOwotCi0gICAgbmV3LT5wcmV2ID0gcjsKLSAgICByLT5uZXh0ICAgPSBuZXc7Ci0KLSAgICAvKiBJbmhlcml0IHRoZSByZXN0IG9mIHRoZSBwcm90b2NvbCBpbmZvLi4uICovCi0KLSAgICBuZXctPnRoZV9yZXF1ZXN0ID0gci0+dGhlX3JlcXVlc3Q7Ci0KLSAgICBuZXctPmFsbG93ZWQgICAgICAgICA9IHItPmFsbG93ZWQ7Ci0KLSAgICBuZXctPnN0YXR1cyAgICAgICAgICA9IHItPnN0YXR1czsKLSAgICBuZXctPmFzc2JhY2t3YXJkcyAgICA9IHItPmFzc2JhY2t3YXJkczsKLSAgICBuZXctPmhlYWRlcl9vbmx5ICAgICA9IHItPmhlYWRlcl9vbmx5OwotICAgIG5ldy0+cHJvdG9jb2wgICAgICAgID0gci0+cHJvdG9jb2w7Ci0gICAgbmV3LT5wcm90b19udW0gICAgICAgPSByLT5wcm90b19udW07Ci0gICAgbmV3LT5ob3N0bmFtZSAgICAgICAgPSByLT5ob3N0bmFtZTsKLSAgICBuZXctPnJlcXVlc3RfdGltZSAgICA9IHItPnJlcXVlc3RfdGltZTsKLSAgICBuZXctPm1haW4gICAgICAgICAgICA9IHItPm1haW47Ci0KLSAgICBuZXctPmhlYWRlcnNfaW4gICAgICA9IHItPmhlYWRlcnNfaW47Ci0gICAgbmV3LT5oZWFkZXJzX291dCAgICAgPSBhcF9tYWtlX3RhYmxlKHItPnBvb2wsIDEyKTsKLSAgICBuZXctPmVycl9oZWFkZXJzX291dCA9IHItPmVycl9oZWFkZXJzX291dDsKLSAgICBuZXctPnN1YnByb2Nlc3NfZW52ICA9IHJlbmFtZV9vcmlnaW5hbF9lbnYoci0+cG9vbCwgci0+c3VicHJvY2Vzc19lbnYpOwotICAgIG5ldy0+bm90ZXMgICAgICAgICAgID0gYXBfbWFrZV90YWJsZShyLT5wb29sLCA1KTsKLQotICAgIG5ldy0+aHRhY2Nlc3MgICAgICAgID0gci0+aHRhY2Nlc3M7Ci0gICAgbmV3LT5ub19jYWNoZSAgICAgICAgPSByLT5ub19jYWNoZTsKLSAgICBuZXctPmV4cGVjdGluZ18xMDAJID0gci0+ZXhwZWN0aW5nXzEwMDsKLSAgICBuZXctPm5vX2xvY2FsX2NvcHkgICA9IHItPm5vX2xvY2FsX2NvcHk7Ci0gICAgbmV3LT5yZWFkX2xlbmd0aCAgICAgPSByLT5yZWFkX2xlbmd0aDsgICAgIC8qIFdlIGNhbiBvbmx5IHJlYWQgaXQgb25jZSAqLwotICAgIG5ldy0+dmxpc3RfdmFsaWRhdG9yID0gci0+dmxpc3RfdmFsaWRhdG9yOwotCi0gICAgYXBfdGFibGVfc2V0bihuZXctPnN1YnByb2Nlc3NfZW52LCAiUkVESVJFQ1RfU1RBVFVTIiwKLQlhcF9wc3ByaW50ZihyLT5wb29sLCAiJWQiLCByLT5zdGF0dXMpKTsKLQotICAgIC8qCi0gICAgICogWFhYOiBobW0uICBUaGlzIGlzIGJlY2F1c2UgbW9kX3NldGVudmlmIGFuZCBtb2RfdW5pcXVlX2lkIHJlYWxseSBuZWVkCi0gICAgICogdG8gZG8gdGhlaXIgdGhpbmcgb24gaW50ZXJuYWwgcmVkaXJlY3RzIGFzIHdlbGwuICBQZXJoYXBzIHRoaXMgaXMgYQotICAgICAqIG1pc25hbWVkIGZ1bmN0aW9uLgotICAgICAqLwotICAgIGlmICgoYWNjZXNzX3N0YXR1cyA9IGFwX3J1bl9wb3N0X3JlYWRfcmVxdWVzdChuZXcpKSkgewotICAgICAgICBhcF9kaWUoYWNjZXNzX3N0YXR1cywgbmV3KTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ldzsKLX0KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9pbnRlcm5hbF9yZWRpcmVjdChjb25zdCBjaGFyICpuZXdfdXJpLCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICByZXF1ZXN0X3JlYyAqbmV3ID0gaW50ZXJuYWxfaW50ZXJuYWxfcmVkaXJlY3QobmV3X3VyaSwgcik7Ci0gICAgcHJvY2Vzc19yZXF1ZXN0X2ludGVybmFsKG5ldyk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgZm9yIHRoaW5ncyBsaWtlIGFjdGlvbnMgb3IgQ0dJIHNjcmlwdHMsIHdoZW4KLSAqIHVzaW5nIEFkZEhhbmRsZXIsIGFuZCB5b3Ugd2FudCB0byBwcmVzZXJ2ZSB0aGUgY29udGVudCB0eXBlIGFjcm9zcwotICogYW4gaW50ZXJuYWwgcmVkaXJlY3QuCi0gKi8KLUFQSV9FWFBPUlQodm9pZCkgYXBfaW50ZXJuYWxfcmVkaXJlY3RfaGFuZGxlcihjb25zdCBjaGFyICpuZXdfdXJpLCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICByZXF1ZXN0X3JlYyAqbmV3ID0gaW50ZXJuYWxfaW50ZXJuYWxfcmVkaXJlY3QobmV3X3VyaSwgcik7Ci0gICAgaWYgKHItPmhhbmRsZXIpCi0gICAgICAgIG5ldy0+Y29udGVudF90eXBlID0gci0+Y29udGVudF90eXBlOwotICAgIHByb2Nlc3NfcmVxdWVzdF9pbnRlcm5hbChuZXcpOwotfQotCi0vKgotICogSXMgaXQgdGhlIGluaXRpYWwgbWFpbiByZXF1ZXN0LCB3aGljaCB3ZSBvbmx5IGdldCAqb25jZSogcGVyIEhUVFAgcmVxdWVzdD8KLSAqLwotQVBJX0VYUE9SVChpbnQpIGFwX2lzX2luaXRpYWxfcmVxKHJlcXVlc3RfcmVjICpyKQotewotICAgIHJldHVybgotICAgICAgICAoci0+bWFpbiA9PSBOVUxMKSAgICAgICAvKiBvdGhlcndpc2UsIHRoaXMgaXMgYSBzdWItcmVxdWVzdCAqLwotICAgICAgICAmJgotICAgICAgICAoci0+cHJldiA9PSBOVUxMKTsgICAgICAvKiBvdGhlcndpc2UsIHRoaXMgaXMgYW4gaW50ZXJuYWwgcmVkaXJlY3QgKi8KLX0KLQotLyoKLSAqIEZ1bmN0aW9uIHRvIHNldCB0aGUgci0+bXRpbWUgZmllbGQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBpZiBpdCdzIGxhdGVyCi0gKiB0aGFuIHdoYXQncyBhbHJlYWR5IHRoZXJlLgotICovCi1BUElfRVhQT1JUKHRpbWVfdCkgYXBfdXBkYXRlX210aW1lKHJlcXVlc3RfcmVjICpyLCB0aW1lX3QgZGVwZW5kZW5jeV9tdGltZSkKLXsKLSAgICBpZiAoci0+bXRpbWUgPCBkZXBlbmRlbmN5X210aW1lKSB7Ci0gICAgICAgIHItPm10aW1lID0gZGVwZW5kZW5jeV9tdGltZTsKLSAgICB9Ci0gICAgcmV0dXJuIHItPm10aW1lOwotfQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9odHRwL21vZF9jb3JlLmggYi9tb2R1bGVzL2h0dHAvbW9kX2NvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFjMzVlMC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2h0dHAvbW9kX2NvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLSNpZm5kZWYgTU9EX0NPUkVfSAotI2RlZmluZSBNT0RfQ09SRV9ICi0KLSNpbmNsdWRlICJhcHIuaCIKLSNpbmNsdWRlICJhcHJfYnVja2V0cy5oIgotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJ1dGlsX2ZpbHRlci5oIgotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqCi0gKiBAcGFja2FnZSBtb2RfY29yZSBwcml2YXRlIGhlYWRlciBmaWxlCi0gKi8KLQotLyoKLSAqIFRoZXNlIChvdXRwdXQpIGZpbHRlcnMgYXJlIGludGVybmFsIHRvIHRoZSBtb2RfY29yZSBvcGVyYXRpb24uCi0gKi8KLUFQX0NPUkVfREVDTEFSRV9OT05TVEQoYXByX3N0YXR1c190KSBhcF9ieXRlcmFuZ2VfZmlsdGVyKGFwX2ZpbHRlcl90ICpmLCBhcHJfYnVja2V0X2JyaWdhZGUgKmIpOwotQVBfQ09SRV9ERUNMQVJFX05PTlNURChhcHJfc3RhdHVzX3QpIGFwX2h0dHBfaGVhZGVyX2ZpbHRlcihhcF9maWx0ZXJfdCAqZiwgYXByX2J1Y2tldF9icmlnYWRlICpiKTsKLUFQX0NPUkVfREVDTEFSRV9OT05TVEQoYXByX3N0YXR1c190KSBhcF9jb250ZW50X2xlbmd0aF9maWx0ZXIoYXBfZmlsdGVyX3QgKiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcl9idWNrZXRfYnJpZ2FkZSAqKTsKLUFQX0NPUkVfREVDTEFSRV9OT05TVEQoYXByX3N0YXR1c190KSBhcF9vbGRfd3JpdGVfZmlsdGVyKGFwX2ZpbHRlcl90ICpmLCBhcHJfYnVja2V0X2JyaWdhZGUgKmIpOwotCi0vKgotICogVGhlc2UgKGlucHV0KSBmaWx0ZXJzIGFyZSBpbnRlcm5hbCB0byB0aGUgbW9kX2NvcmUgb3BlcmF0aW9uLgotICovCi1hcHJfc3RhdHVzX3QgYXBfaHR0cF9maWx0ZXIoYXBfZmlsdGVyX3QgKmYsIGFwcl9idWNrZXRfYnJpZ2FkZSAqYiwgYXBfaW5wdXRfbW9kZV90IG1vZGUpOwotYXByX3N0YXR1c190IGFwX2RlY2h1bmtfZmlsdGVyKGFwX2ZpbHRlcl90ICpmLCBhcHJfYnVja2V0X2JyaWdhZGUgKmIsIGFwX2lucHV0X21vZGVfdCBtb2RlKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCS8qICFNT0RfQ09SRV9IICovCmRpZmYgLS1naXQgYS9tb2R1bGVzL2h0dHAvbW9kX21pbWUuYyBiL21vZHVsZXMvaHR0cC9tb2RfbWltZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjczNTZiLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvaHR0cC9tb2RfbWltZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIGh0dHBfbWltZS5jOiBTZW5kcy9nZXRzIE1JTUUgaGVhZGVycyBmb3IgcmVxdWVzdHMKLSAqIAotICogUm9iIE1jQ29vbAotICogCi0gKi8KLQotI2RlZmluZSBNSU1FX1BSSVZBVEUKLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotCi10eXBlZGVmIHN0cnVjdCBoYW5kbGVyc19pbmZvIHsKLSAgICBjaGFyICpuYW1lOwotfSBoYW5kbGVyc19pbmZvOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdGFibGUgKmZvcmNlZF90eXBlczsgICAgICAgIC8qIEFkZGl0aW9uYWwgQWRkVHlwZWQgc3R1ZmYgKi8KLSAgICB0YWJsZSAqZW5jb2RpbmdfdHlwZXM7ICAgICAgLyogQWRkZWQgd2l0aCBBZGRFbmNvZGluZy4uLiAqLwotICAgIHRhYmxlICpsYW5ndWFnZV90eXBlczsgICAgICAvKiBBZGRlZCB3aXRoIEFkZExhbmd1YWdlLi4uICovCi0gICAgdGFibGUgKmhhbmRsZXJzOyAgICAgICAgICAgIC8qIEFkZGVkIHdpdGggQWRkSGFuZGxlci4uLiAgKi8KLSAgICBhcnJheV9oZWFkZXIgKmhhbmRsZXJzX3JlbW92ZTsgICAgIC8qIExpc3Qgb2YgaGFuZGxlcnMgdG8gcmVtb3ZlICovCi0KLSAgICBjaGFyICp0eXBlOyAgICAgICAgICAgICAgICAgLyogVHlwZSBmb3JjZWQgd2l0aCBGb3JjZVR5cGUgICovCi0gICAgY2hhciAqaGFuZGxlcjsgICAgICAgICAgICAgIC8qIEhhbmRsZXIgZm9yY2VkIHdpdGggU2V0SGFuZGxlciAqLwotICAgIGNoYXIgKmRlZmF1bHRfbGFuZ3VhZ2U7ICAgICAvKiBMYW5ndWFnZSBpZiBubyBBZGRMYW5ndWFnZSBleHQgZm91bmQgKi8KLX0gbWltZV9kaXJfY29uZmlnOwotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgbWltZV9tb2R1bGU7Ci0KLXN0YXRpYyB2b2lkICpjcmVhdGVfbWltZV9kaXJfY29uZmlnKHBvb2wgKnAsIGNoYXIgKmR1bW15KQotewotICAgIG1pbWVfZGlyX2NvbmZpZyAqbmV3ID0KLSAgICAobWltZV9kaXJfY29uZmlnICopIGFwX3BhbGxvYyhwLCBzaXplb2YobWltZV9kaXJfY29uZmlnKSk7Ci0KLSAgICBuZXctPmZvcmNlZF90eXBlcyA9IGFwX21ha2VfdGFibGUocCwgNCk7Ci0gICAgbmV3LT5lbmNvZGluZ190eXBlcyA9IGFwX21ha2VfdGFibGUocCwgNCk7Ci0gICAgbmV3LT5sYW5ndWFnZV90eXBlcyA9IGFwX21ha2VfdGFibGUocCwgNCk7Ci0gICAgbmV3LT5oYW5kbGVycyA9IGFwX21ha2VfdGFibGUocCwgNCk7Ci0gICAgbmV3LT5oYW5kbGVyc19yZW1vdmUgPSBhcF9tYWtlX2FycmF5KHAsIDQsIHNpemVvZihoYW5kbGVyc19pbmZvKSk7Ci0KLSAgICBuZXctPnR5cGUgPSBOVUxMOwotICAgIG5ldy0+aGFuZGxlciA9IE5VTEw7Ci0gICAgbmV3LT5kZWZhdWx0X2xhbmd1YWdlID0gTlVMTDsKLQotICAgIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyB2b2lkICptZXJnZV9taW1lX2Rpcl9jb25maWdzKHBvb2wgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICphZGR2KQotewotICAgIG1pbWVfZGlyX2NvbmZpZyAqYmFzZSA9IChtaW1lX2Rpcl9jb25maWcgKikgYmFzZXY7Ci0gICAgbWltZV9kaXJfY29uZmlnICphZGQgPSAobWltZV9kaXJfY29uZmlnICopIGFkZHY7Ci0gICAgbWltZV9kaXJfY29uZmlnICpuZXcgPQotICAgICAgICAobWltZV9kaXJfY29uZmlnICopIGFwX3BhbGxvYyhwLCBzaXplb2YobWltZV9kaXJfY29uZmlnKSk7Ci0gICAgaW50IGk7Ci0gICAgaGFuZGxlcnNfaW5mbyAqaGFuZDsKLQotICAgIGhhbmQgPSAoaGFuZGxlcnNfaW5mbyAqKSBhZGQtPmhhbmRsZXJzX3JlbW92ZS0+ZWx0czsKLSAgICBmb3IgKGkgPSAwOyBpIDwgYWRkLT5oYW5kbGVyc19yZW1vdmUtPm5lbHRzOyBpKyspIHsKLSAgICAgICAgYXBfdGFibGVfdW5zZXQoYmFzZS0+aGFuZGxlcnMsIGhhbmRbaV0ubmFtZSk7Ci0gICAgfQotCi0gICAgbmV3LT5mb3JjZWRfdHlwZXMgPSBhcF9vdmVybGF5X3RhYmxlcyhwLCBhZGQtPmZvcmNlZF90eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPmZvcmNlZF90eXBlcyk7Ci0gICAgbmV3LT5lbmNvZGluZ190eXBlcyA9IGFwX292ZXJsYXlfdGFibGVzKHAsIGFkZC0+ZW5jb2RpbmdfdHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPmVuY29kaW5nX3R5cGVzKTsKLSAgICBuZXctPmxhbmd1YWdlX3R5cGVzID0gYXBfb3ZlcmxheV90YWJsZXMocCwgYWRkLT5sYW5ndWFnZV90eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+bGFuZ3VhZ2VfdHlwZXMpOwotICAgIG5ldy0+aGFuZGxlcnMgPSBhcF9vdmVybGF5X3RhYmxlcyhwLCBhZGQtPmhhbmRsZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5oYW5kbGVycyk7Ci0KLSAgICBuZXctPnR5cGUgPSBhZGQtPnR5cGUgPyBhZGQtPnR5cGUgOiBiYXNlLT50eXBlOwotICAgIG5ldy0+aGFuZGxlciA9IGFkZC0+aGFuZGxlciA/IGFkZC0+aGFuZGxlciA6IGJhc2UtPmhhbmRsZXI7Ci0gICAgbmV3LT5kZWZhdWx0X2xhbmd1YWdlID0gYWRkLT5kZWZhdWx0X2xhbmd1YWdlID8KLSAgICAgICAgYWRkLT5kZWZhdWx0X2xhbmd1YWdlIDogYmFzZS0+ZGVmYXVsdF9sYW5ndWFnZTsKLQotICAgIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICphZGRfdHlwZShjbWRfcGFybXMgKmNtZCwgbWltZV9kaXJfY29uZmlnICogbSwgY2hhciAqY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZXh0KQotewotICAgIGlmICgqZXh0ID09ICcuJykKLSAgICAgICAgKytleHQ7Ci0gICAgYXBfc3RyX3RvbG93ZXIoY3QpOwotICAgIGFwX3RhYmxlX3NldG4obS0+Zm9yY2VkX3R5cGVzLCBleHQsIGN0KTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmFkZF9lbmNvZGluZyhjbWRfcGFybXMgKmNtZCwgbWltZV9kaXJfY29uZmlnICogbSwgY2hhciAqZW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpleHQpCi17Ci0gICAgaWYgKCpleHQgPT0gJy4nKQotICAgICAgICArK2V4dDsKLSAgICBhcF9zdHJfdG9sb3dlcihlbmMpOwotICAgIGFwX3RhYmxlX3NldG4obS0+ZW5jb2RpbmdfdHlwZXMsIGV4dCwgZW5jKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmFkZF9sYW5ndWFnZShjbWRfcGFybXMgKmNtZCwgbWltZV9kaXJfY29uZmlnICogbSwgY2hhciAqbGFuZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZXh0KQotewotICAgIGlmICgqZXh0ID09ICcuJykKLSAgICAgICAgKytleHQ7Ci0gICAgYXBfc3RyX3RvbG93ZXIobGFuZyk7Ci0gICAgYXBfdGFibGVfc2V0bihtLT5sYW5ndWFnZV90eXBlcywgZXh0LCBsYW5nKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmFkZF9oYW5kbGVyKGNtZF9wYXJtcyAqY21kLCBtaW1lX2Rpcl9jb25maWcgKiBtLCBjaGFyICpoZGxyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmV4dCkKLXsKLSAgICBpZiAoKmV4dCA9PSAnLicpCi0gICAgICAgICsrZXh0OwotICAgIGFwX3N0cl90b2xvd2VyKGhkbHIpOwotICAgIGFwX3RhYmxlX3NldG4obS0+aGFuZGxlcnMsIGV4dCwgaGRscik7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBOb3RlIGhhbmRsZXIgbmFtZXMgdGhhdCBzaG91bGQgYmUgdW4tYWRkZWQgZm9yIHRoaXMgbG9jYXRpb24uICBUaGlzCi0gKiB3aWxsIGtlZXAgdGhlIGFzc29jaWF0aW9uIGZyb20gYmVpbmcgaW5oZXJpdGVkLCBhcyB3ZWxsLCBidXQgbm90Ci0gKiBmcm9tIGJlaW5nIHJlLWFkZGVkIGF0IGEgc3Vib3JkaW5hdGUgbGV2ZWwuCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpyZW1vdmVfaGFuZGxlcihjbWRfcGFybXMgKmNtZCwgdm9pZCAqbSwgY2hhciAqZXh0KQotewotICAgIG1pbWVfZGlyX2NvbmZpZyAqbWNmZyA9IChtaW1lX2Rpcl9jb25maWcgKikgbTsKLSAgICBoYW5kbGVyc19pbmZvICpoYW5kOwotCi0gICAgaWYgKCpleHQgPT0gJy4nKSB7Ci0gICAgICAgICsrZXh0OwotICAgIH0KLSAgICBoYW5kID0gKGhhbmRsZXJzX2luZm8gKikgYXBfcHVzaF9hcnJheShtY2ZnLT5oYW5kbGVyc19yZW1vdmUpOwotICAgIGhhbmQtPm5hbWUgPSBhcF9wc3RyZHVwKGNtZC0+cG9vbCwgZXh0KTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogVGhlIHNvbGUgYml0IG9mIHNlcnZlciBjb25maWd1cmF0aW9uIHRoYXQgdGhlIE1JTUUgbW9kdWxlIGhhcyBpcwotICogdGhlIG5hbWUgb2YgaXRzIGNvbmZpZyBmaWxlLCBzby4uLgotICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfdHlwZXNfY29uZmlnKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGFwX3NldF9tb2R1bGVfY29uZmlnKGNtZC0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCAmbWltZV9tb2R1bGUsIGFyZyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBtaW1lX2NtZHNbXSA9Ci17Ci0gICAgeyJBZGRUeXBlIiwgYWRkX3R5cGUsIE5VTEwsIE9SX0ZJTEVJTkZPLCBJVEVSQVRFMiwKLSAgICAgImEgbWltZSB0eXBlIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGZpbGUgZXh0ZW5zaW9ucyJ9LAotICAgIHsiQWRkRW5jb2RpbmciLCBhZGRfZW5jb2RpbmcsIE5VTEwsIE9SX0ZJTEVJTkZPLCBJVEVSQVRFMiwKLSAgICAgImFuIGVuY29kaW5nIChlLmcuLCBnemlwKSwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgZmlsZSBleHRlbnNpb25zIn0sCi0gICAgeyJBZGRMYW5ndWFnZSIsIGFkZF9sYW5ndWFnZSwgTlVMTCwgT1JfRklMRUlORk8sIElURVJBVEUyLAotICAgICAiYSBsYW5ndWFnZSAoZS5nLiwgZnIpLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBmaWxlIGV4dGVuc2lvbnMifSwKLSAgICB7IkFkZEhhbmRsZXIiLCBhZGRfaGFuZGxlciwgTlVMTCwgT1JfRklMRUlORk8sIElURVJBVEUyLAotICAgICAiYSBoYW5kbGVyIG5hbWUgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgZmlsZSBleHRlbnNpb25zIn0sCi0gICAgeyJGb3JjZVR5cGUiLCBhcF9zZXRfc3RyaW5nX3Nsb3RfbG93ZXIsIAotICAgICAodm9pZCAqKVh0T2Zmc2V0T2YobWltZV9kaXJfY29uZmlnLCB0eXBlKSwgT1JfRklMRUlORk8sIFRBS0UxLCAKLSAgICAgImEgbWVkaWEgdHlwZSJ9LAotICAgIHsiUmVtb3ZlSGFuZGxlciIsIHJlbW92ZV9oYW5kbGVyLCBOVUxMLCBPUl9GSUxFSU5GTywgSVRFUkFURSwKLSAgICAgIm9uZSBvciBtb3JlIGZpbGUgZXh0ZW5zaW9ucyJ9LAotICAgIHsiU2V0SGFuZGxlciIsIGFwX3NldF9zdHJpbmdfc2xvdF9sb3dlciwgCi0gICAgICh2b2lkICopWHRPZmZzZXRPZihtaW1lX2Rpcl9jb25maWcsIGhhbmRsZXIpLCBPUl9GSUxFSU5GTywgVEFLRTEsIAotICAgICAiYSBoYW5kbGVyIG5hbWUifSwKLSAgICB7IlR5cGVzQ29uZmlnIiwgc2V0X3R5cGVzX2NvbmZpZywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAgInRoZSBNSU1FIHR5cGVzIGNvbmZpZyBmaWxlIn0sCi0gICAgeyJEZWZhdWx0TGFuZ3VhZ2UiLCBhcF9zZXRfc3RyaW5nX3Nsb3QsCi0gICAgICh2b2lkKilYdE9mZnNldE9mKG1pbWVfZGlyX2NvbmZpZywgZGVmYXVsdF9sYW5ndWFnZSksIE9SX0ZJTEVJTkZPLCBUQUtFMSwKLSAgICAgImxhbmd1YWdlIHRvIHVzZSBmb3IgZG9jdW1lbnRzIHdpdGggbm8gb3RoZXIgbGFuZ3VhZ2UgZmlsZSBleHRlbnNpb24iIH0sCi0gICAge05VTEx9Ci19OwotCi0vKiBIYXNoIHRhYmxlICAtLS0gb25seSBvbmUgb2YgdGhlc2UgcGVyIGRhZW1vbjsgdmlydHVhbCBob3N0cyBjYW4KLSAqIGdldCBwcml2YXRlIHZlcnNpb25zIHRocm91Z2ggQWRkVHlwZS4uLgotICovCi0KLSNkZWZpbmUgTUlNRV9IQVNIU0laRSAoMzIpCi0jZGVmaW5lIGhhc2goaSkgKGFwX3RvbG93ZXIoaSkgJSBNSU1FX0hBU0hTSVpFKQotCi1zdGF0aWMgdGFibGUgKmhhc2hfYnVja2V0c1tNSU1FX0hBU0hTSVpFXTsKLQotc3RhdGljIHZvaWQgaW5pdF9taW1lKHNlcnZlcl9yZWMgKnMsIHBvb2wgKnApCi17Ci0gICAgY29uZmlnZmlsZV90ICpmOwotICAgIGNoYXIgbFtNQVhfU1RSSU5HX0xFTl07Ci0gICAgaW50IHg7Ci0gICAgY2hhciAqdHlwZXNfY29uZm5hbWUgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAmbWltZV9tb2R1bGUpOwotCi0gICAgaWYgKCF0eXBlc19jb25mbmFtZSkKLSAgICAgICAgdHlwZXNfY29uZm5hbWUgPSBUWVBFU19DT05GSUdfRklMRTsKLQotICAgIHR5cGVzX2NvbmZuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocCwgdHlwZXNfY29uZm5hbWUpOwotCi0gICAgaWYgKCEoZiA9IGFwX3BjZmdfb3BlbmZpbGUocCwgdHlwZXNfY29uZm5hbWUpKSkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzLAotCQkgICAgICJjb3VsZCBub3Qgb3BlbiBtaW1lIHR5cGVzIGxvZyBmaWxlICVzLiIsIHR5cGVzX2NvbmZuYW1lKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBmb3IgKHggPSAwOyB4IDwgTUlNRV9IQVNIU0laRTsgeCsrKQotICAgICAgICBoYXNoX2J1Y2tldHNbeF0gPSBhcF9tYWtlX3RhYmxlKHAsIDEwKTsKLQotICAgIHdoaWxlICghKGFwX2NmZ19nZXRsaW5lKGwsIE1BWF9TVFJJTkdfTEVOLCBmKSkpIHsKLSAgICAgICAgY29uc3QgY2hhciAqbGwgPSBsLCAqY3Q7Ci0KLSAgICAgICAgaWYgKGxbMF0gPT0gJyMnKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGN0ID0gYXBfZ2V0d29yZF9jb25mKHAsICZsbCk7Ci0KLSAgICAgICAgd2hpbGUgKGxsWzBdKSB7Ci0gICAgICAgICAgICBjaGFyICpleHQgPSBhcF9nZXR3b3JkX2NvbmYocCwgJmxsKTsKLSAgICAgICAgICAgIGFwX3N0cl90b2xvd2VyKGV4dCk7ICAgLyogPz8/ICovCi0gICAgICAgICAgICBhcF90YWJsZV9zZXRuKGhhc2hfYnVja2V0c1toYXNoKGV4dFswXSldLCBleHQsIGN0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBhcF9jZmdfY2xvc2VmaWxlKGYpOwotfQotCi1zdGF0aWMgaW50IGZpbmRfY3QocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY29uc3QgY2hhciAqZm4gPSBzdHJyY2hyKHItPmZpbGVuYW1lLCAnLycpOwotICAgIG1pbWVfZGlyX2NvbmZpZyAqY29uZiA9Ci0gICAgKG1pbWVfZGlyX2NvbmZpZyAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywgJm1pbWVfbW9kdWxlKTsKLSAgICBjaGFyICpleHQ7Ci0gICAgY29uc3QgY2hhciAqb3JpZ2hhbmRsZXIgPSByLT5oYW5kbGVyOwotICAgIGNvbnN0IGNoYXIgKnR5cGU7Ci0KLSAgICBpZiAoU19JU0RJUihyLT5maW5mby5zdF9tb2RlKSkgewotICAgICAgICByLT5jb250ZW50X3R5cGUgPSBESVJfTUFHSUNfVFlQRTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIC8qIFRNIC0tIEZJWE1FCi0gICAgICogaWYgci0+ZmlsZW5hbWUgZG9lcyBub3QgY29udGFpbiBhICcvJywgdGhlIGZvbGxvd2luZyBwYXNzZXMgYSBudWxsCi0gICAgICogcG9pbnRlciB0byBnZXR3b3JkLCBjYXVzaW5nIGEgU0VHViAuLgotICAgICAqLwotCi0gICAgaWYgKGZuID09IE5VTEwpCi0gICAgICAgIGZuID0gci0+ZmlsZW5hbWU7Ci0KLSAgICAvKiBQYXJzZSBmaWxlbmFtZSBleHRlbnNpb25zLCB3aGljaCBjYW4gYmUgaW4gYW55IG9yZGVyICovCi0gICAgd2hpbGUgKChleHQgPSBhcF9nZXR3b3JkKHItPnBvb2wsICZmbiwgJy4nKSkgJiYgKmV4dCkgewotICAgICAgICBpbnQgZm91bmQgPSAwOwotCi0gICAgICAgIC8qIENoZWNrIGZvciBDb250ZW50LVR5cGUgKi8KLSAgICAgICAgaWYgKCh0eXBlID0gYXBfdGFibGVfZ2V0KGNvbmYtPmZvcmNlZF90eXBlcywgZXh0KSkKLSAgICAgICAgICAgIHx8ICh0eXBlID0gYXBfdGFibGVfZ2V0KGhhc2hfYnVja2V0c1toYXNoKCpleHQpXSwgZXh0KSkpIHsKLSAgICAgICAgICAgIHItPmNvbnRlbnRfdHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICBmb3VuZCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDaGVjayBmb3IgQ29udGVudC1MYW5ndWFnZSAqLwotICAgICAgICBpZiAoKHR5cGUgPSBhcF90YWJsZV9nZXQoY29uZi0+bGFuZ3VhZ2VfdHlwZXMsIGV4dCkpKSB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICoqbmV3OwotCi0gICAgICAgICAgICByLT5jb250ZW50X2xhbmd1YWdlID0gdHlwZTsgICAgICAgICAvKiBiYWNrIGNvbXBhdC4gb25seSAqLwotICAgICAgICAgICAgaWYgKCFyLT5jb250ZW50X2xhbmd1YWdlcykKLSAgICAgICAgICAgICAgICByLT5jb250ZW50X2xhbmd1YWdlcyA9IGFwX21ha2VfYXJyYXkoci0+cG9vbCwgMiwgc2l6ZW9mKGNoYXIgKikpOwotICAgICAgICAgICAgbmV3ID0gKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoci0+Y29udGVudF9sYW5ndWFnZXMpOwotICAgICAgICAgICAgKm5ldyA9IHR5cGU7Ci0gICAgICAgICAgICBmb3VuZCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDaGVjayBmb3IgQ29udGVudC1FbmNvZGluZyAqLwotICAgICAgICBpZiAoKHR5cGUgPSBhcF90YWJsZV9nZXQoY29uZi0+ZW5jb2RpbmdfdHlwZXMsIGV4dCkpKSB7Ci0gICAgICAgICAgICBpZiAoIXItPmNvbnRlbnRfZW5jb2RpbmcpCi0gICAgICAgICAgICAgICAgci0+Y29udGVudF9lbmNvZGluZyA9IHR5cGU7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgci0+Y29udGVudF9lbmNvZGluZyA9IGFwX3BzdHJjYXQoci0+cG9vbCwgci0+Y29udGVudF9lbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCAiLCB0eXBlLCBOVUxMKTsKLSAgICAgICAgICAgIGZvdW5kID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENoZWNrIGZvciBhIHNwZWNpYWwgaGFuZGxlciwgYnV0IG5vdCBmb3IgcHJveHkgcmVxdWVzdCAqLwotICAgICAgICBpZiAoKHR5cGUgPSBhcF90YWJsZV9nZXQoY29uZi0+aGFuZGxlcnMsIGV4dCkpICYmICFyLT5wcm94eXJlcSkgewotICAgICAgICAgICAgci0+aGFuZGxlciA9IHR5cGU7Ci0gICAgICAgICAgICBmb3VuZCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBUaGlzIGlzIHRvIGRlYWwgd2l0aCBjYXNlcyBzdWNoIGFzIGZvby5naWYuYmFrLCB3aGljaCB3ZSB3YW50Ci0gICAgICAgICAqIHRvIG5vdCBoYXZlIGEgdHlwZS4gU28gaWYgd2UgZmluZCBhbiB1bmtub3duIGV4dGVuc2lvbiwgd2UKLSAgICAgICAgICogemFwIHRoZSB0eXBlL2xhbmd1YWdlL2VuY29kaW5nIGFuZCByZXNldCB0aGUgaGFuZGxlcgotICAgICAgICAgKi8KLQotICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICByLT5jb250ZW50X3R5cGUgPSBOVUxMOwotICAgICAgICAgICAgci0+Y29udGVudF9sYW5ndWFnZSA9IE5VTEw7Ci0gICAgICAgICAgICByLT5jb250ZW50X2xhbmd1YWdlcyA9IE5VTEw7Ci0gICAgICAgICAgICByLT5jb250ZW50X2VuY29kaW5nID0gTlVMTDsKLSAgICAgICAgICAgIHItPmhhbmRsZXIgPSBvcmlnaGFuZGxlcjsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyogU2V0IGRlZmF1bHQgbGFuZ3VhZ2UsIGlmIG5vbmUgd2FzIHNwZWNpZmllZCBieSB0aGUgZXh0ZW5zaW9ucwotICAgICAqIGFuZCB3ZSBoYXZlIGEgRGVmYXVsdExhbmd1YWdlIHNldHRpbmcgaW4gZm9yY2UKLSAgICAgKi8KLQotICAgIGlmICghci0+Y29udGVudF9sYW5ndWFnZXMgJiYgY29uZi0+ZGVmYXVsdF9sYW5ndWFnZSkgewotICAgICAgICBjb25zdCBjaGFyICoqbmV3OwotCi0gICAgICAgIHItPmNvbnRlbnRfbGFuZ3VhZ2UgPSBjb25mLT5kZWZhdWx0X2xhbmd1YWdlOyAvKiBiYWNrIGNvbXBhdC4gb25seSAqLwotICAgICAgICBpZiAoIXItPmNvbnRlbnRfbGFuZ3VhZ2VzKQotICAgICAgICAgICAgci0+Y29udGVudF9sYW5ndWFnZXMgPSBhcF9tYWtlX2FycmF5KHItPnBvb2wsIDIsIHNpemVvZihjaGFyICopKTsKLSAgICAgICAgbmV3ID0gKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoci0+Y29udGVudF9sYW5ndWFnZXMpOwotICAgICAgICAqbmV3ID0gY29uZi0+ZGVmYXVsdF9sYW5ndWFnZTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBmb3Igb3ZlcnJpZGVzIHdpdGggRm9yY2VUeXBlL1NldEhhbmRsZXIgKi8KLQotICAgIGlmIChjb25mLT50eXBlICYmIHN0cmNtcChjb25mLT50eXBlLCAibm9uZSIpKQotICAgICAgICByLT5jb250ZW50X3R5cGUgPSBjb25mLT50eXBlOwotICAgIGlmIChjb25mLT5oYW5kbGVyICYmIHN0cmNtcChjb25mLT5oYW5kbGVyLCAibm9uZSIpKQotICAgICAgICByLT5oYW5kbGVyID0gY29uZi0+aGFuZGxlcjsKLQotICAgIGlmICghci0+Y29udGVudF90eXBlKQotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBtaW1lX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkRfTU9EVUxFX1NUVUZGLAotICAgIGluaXRfbWltZSwgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplciAqLwotICAgIGNyZWF0ZV9taW1lX2Rpcl9jb25maWcsICAgICAvKiBkaXIgY29uZmlnIGNyZWF0b3IgKi8KLSAgICBtZXJnZV9taW1lX2Rpcl9jb25maWdzLCAgICAgLyogZGlyIGNvbmZpZyBtZXJnZXIgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogc2VydmVyIGNvbmZpZyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBtZXJnZSBzZXJ2ZXIgY29uZmlnICovCi0gICAgbWltZV9jbWRzLCAgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgdGFibGUgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaGFuZGxlcnMgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsZW5hbWUgdHJhbnNsYXRpb24gKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2tfdXNlcl9pZCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBhdXRoICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGFjY2VzcyAqLwotICAgIGZpbmRfY3QsICAgICAgICAgICAgICAgICAgICAvKiB0eXBlX2NoZWNrZXIgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogZml4dXBzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvZ2dlciAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBoZWFkZXIgcGFyc2VyICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoaWxkX2luaXQgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hpbGRfZXhpdCAqLwotICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb3N0IHJlYWQtcmVxdWVzdCAqLwotfTsKZGlmZiAtLWdpdCBhL21vZHVsZXMvaHR0cC9tb2RfbWltZS5kc3AgYi9tb2R1bGVzL2h0dHAvbW9kX21pbWUuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWYyN2ZiLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvaHR0cC9tb2RfbWltZS5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJtb2RfbWltZSIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyCi0KLUNGRz1tb2RfbWltZSAtIFdpbjMyIFJlbGVhc2UKLSFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAibW9kX21pbWUubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJtb2RfbWltZS5tYWsiIENGRz0ibW9kX21pbWUgLSBXaW4zMiBSZWxlYXNlIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgIm1vZF9taW1lIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAibW9kX21pbWUgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLU1UTD1taWRsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJtb2RfbWltZSAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0kgIi4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9GZCJSZWxlYXNlXG1vZF9taW1lIiAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYXAgL21hY2hpbmU6STM4NiAvb3V0OiJSZWxlYXNlL21vZF9taW1lLnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF9taW1lCi0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvbWFjaGluZTpJMzg2IC9vdXQ6IlJlbGVhc2UvbW9kX21pbWUuc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX21pbWUKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9taW1lIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HWCAvWmkgL09kIC9JICIuLi8uLi9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci11dGlsL2luY2x1ZGUiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRmQiRGVidWdcbW9kX21pbWUiIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2luY3JlbWVudGFsOm5vIC9tYXAgL2RlYnVnIC9tYWNoaW5lOkkzODYgL291dDoiRGVidWcvbW9kX21pbWUuc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX21pbWUKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvaW5jcmVtZW50YWw6bm8gL21hcCAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJEZWJ1Zy9tb2RfbWltZS5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfbWltZQotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAibW9kX21pbWUgLSBXaW4zMiBSZWxlYXNlIgotIyBOYW1lICJtb2RfbWltZSAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2RfbWltZS5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2RfbWltZS5yYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXGJ1aWxkXHdpbjMyXHdpbjMydmVyLmF3awotCi0hSUYgICIkKENGRykiID09ICJtb2RfbWltZSAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQ3JlYXRpbmcgVmVyc2lvbiBSZXNvdXJjZQotSW5wdXRQYXRoPS4uXC4uXGJ1aWxkXHdpbjMyXHdpbjMydmVyLmF3awotCi0iLlxtb2RfbWltZS5yYyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQlhd2sgLWYgLi4vLi4vYnVpbGQvd2luMzIvd2luMzJ2ZXIuYXdrIG1vZF9taW1lICAibWltZV9tb2R1bGUgZm9yIEFwYWNoZSIgLi4vLi4vaW5jbHVkZS9hcF9yZWxlYXNlLmggPiAuXG1vZF9taW1lLnJjCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibW9kX21pbWUgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBDcmVhdGluZyBWZXJzaW9uIFJlc291cmNlCi1JbnB1dFBhdGg9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSIuXG1vZF9taW1lLnJjIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCWF3ayAtZiAuLi8uLi9idWlsZC93aW4zMi93aW4zMnZlci5hd2sgbW9kX21pbWUgICJtaW1lX21vZHVsZSBmb3IgQXBhY2hlIiAuLi8uLi9pbmNsdWRlL2FwX3JlbGVhc2UuaCA+IC5cbW9kX21pbWUucmMKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9odHRwL21vZF9taW1lLmV4cCBiL21vZHVsZXMvaHR0cC9tb2RfbWltZS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZTM4ZGIuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9odHRwL21vZF9taW1lLmV4cAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW1pbWVfbW9kdWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL2xvZ2dlcnMvLmN2c2lnbm9yZSBiL21vZHVsZXMvbG9nZ2Vycy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmY3YTcwLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbG9nZ2Vycy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLmRlcHMKLS5saWJzCi0qLmxhCi1tb2R1bGVzLm1rCi1NYWtlZmlsZQotKi5sbwotKi5zbG8KLSouc28KLSouZGxsCi0qLmRlZgpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9sb2dnZXJzLy5pbmRlbnQucHJvIGIvbW9kdWxlcy9sb2dnZXJzLy5pbmRlbnQucHJvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWZiZTlmLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbG9nZ2Vycy8uaW5kZW50LnBybworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS1pNCAtbnBzbCAtZGkwIC1iciAtbmNlIC1kMCAtY2xpMCAtbnBjcyAtbmZjMQotLVRCVUZGCi0tVEZJTEUKLS1UVFJBTlMKLS1UVUlOVDQKLS1UX3RyYW5zCi0tVGFsbG93X29wdGlvbnNfdAotLVRhcGFjaGVfc2ZpbwotLVRhcnJheV9oZWFkZXIKLS1UYm9vbF9pbnQKLS1UYnVmX2FyZWEKLS1UYnVmZl9zdHJ1Y3QKLS1UYnVmZnkKLS1UY21kX2hvdwotLVRjbWRfcGFybXMKLS1UY29tbWFuZF9yZWMKLS1UY29tbWFuZF9zdHJ1Y3QKLS1UY29ubl9yZWMKLS1UY29yZV9kaXJfY29uZmlnCi0tVGNvcmVfc2VydmVyX2NvbmZpZwotLVRkaXJfbWFrZXJfZnVuYwotLVRldmVudAotLVRnbG9iYWxzX3MKLS1UaGFuZGxlcl9mdW5jCi0tVGhhbmRsZXJfcmVjCi0tVGpvYmxpc3RfcwotLVRsaXN0ZW5fcmVjCi0tVG1lcmdlcl9mdW5jCi0tVG1vZGVfdAotLVRtb2R1bGUKLS1UbW9kdWxlX3N0cnVjdAotLVRtdXRleAotLVRuX2xvbmcKLS1Ub3RoZXJfY2hpbGRfcmVjCi0tVG92ZXJyaWRlc190Ci0tVHBhcmVudF9zY29yZQotLVRwaWRfdAotLVRwaXBlZF9sb2cKLS1UcG9vbAotLVRyZXF1ZXN0X3JlYwotLVRyZXF1aXJlX2xpbmUKLS1UcmxpbV90Ci0tVHNjb3JlYm9hcmQKLS1Uc2VtYXBob3JlCi0tVHNlcnZlcl9hZGRyX3JlYwotLVRzZXJ2ZXJfcmVjCi0tVHNlcnZlcl9yZWNfY2hhaW4KLS1Uc2hvcnRfc2NvcmUKLS1UdGFibGUKLS1UdGFibGVfZW50cnkKLS1UdGhyZWFkCi0tVHVfd2lkZV9pbnQKLS1UdnRpbWVfdAotLVR3aWRlX2ludApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9sb2dnZXJzL01ha2VmaWxlLmluIGIvbW9kdWxlcy9sb2dnZXJzL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjdiMzQzLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbG9nZ2Vycy9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi1pbmNsdWRlICQodG9wX3NyY2RpcikvYnVpbGQvc3BlY2lhbC5tawotCmRpZmYgLS1naXQgYS9tb2R1bGVzL2xvZ2dlcnMvY29uZmlnLm00IGIvbW9kdWxlcy9sb2dnZXJzL2NvbmZpZy5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwNWQ0ZC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2xvZ2dlcnMvY29uZmlnLm00CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotZG5sIG1vZHVsZXMgZW5hYmxlZCBpbiB0aGlzIGRpcmVjdG9yeSBieSBkZWZhdWx0Ci1BUEFDSEVfTU9EUEFUSF9JTklUKHN0YW5kYXJkKQotCi1kbmwgQVBBQ0hFX01PRFVMRSh2aG9zdF9hbGlhcyxibGFibGEpCi0JCi1BUEFDSEVfTU9EVUxFKGxvZ19jb25maWcsIGxvZ2dpbmcgY29uZmlndXJhdGlvbiwgLCBjb25maWdfbG9nLCB5ZXMpCi0KLUFQQUNIRV9NT0RQQVRIX0ZJTklTSAotICAgIAotQVBBQ0hFX1NVQlNUKFNUQU5EQVJEX0xJQlMpCmRpZmYgLS1naXQgYS9tb2R1bGVzL2xvZ2dlcnMvbW9kX2xvZ19jb25maWcuYyBiL21vZHVsZXMvbG9nZ2Vycy9tb2RfbG9nX2NvbmZpZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2RlYmNjLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbG9nZ2Vycy9tb2RfbG9nX2NvbmZpZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEzNyArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBNb2RpZmllZCBieSBkam1AdmEucHVibml4LmNvbToKLSAqIElmIG5vIFRyYW5zZmVyTG9nIGlzIGdpdmVuIGV4cGxpY2l0bHksIGRlY2xpbmUgdG8gbG9nLgotICoKLSAqIFRoaXMgaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIFRyYW5zZmVyTG9nIGRpcmVjdGl2ZSAoc2FtZSBhcyB0aGUKLSAqIGNvbW1vbiBsb2cgbW9kdWxlKSwgYW5kIGFkZGl0aW9uYWwgZGlyZWN0aXZlcywgTG9nRm9ybWF0IGFuZCBDdXN0b21Mb2cuCi0gKgotICoKLSAqIFN5bnRheDoKLSAqCi0gKiAgICBUcmFuc2ZlckxvZyBmbiAgICAgIExvZ3MgdHJhbnNmZXJzIHRvIGZuIGluIHN0YW5kYXJkIGxvZyBmb3JtYXQsIHVubGVzcwotICogICAgICAgICAgICAgICAgICAgICAgICBhIGN1c3RvbSBmb3JtYXQgaXMgc2V0IHdpdGggTG9nRm9ybWF0Ci0gKiAgICBMb2dGb3JtYXQgZm9ybWF0ICAgIFNldCBhIGxvZyBmb3JtYXQgZnJvbSBUcmFuc2ZlckxvZyBmaWxlcwotICogICAgQ3VzdG9tTG9nIGZuIGZvcm1hdAotICogICAgICAgICAgICAgICAgICAgICAgICBMb2cgdG8gZmlsZSBmbiB3aXRoIGZvcm1hdCBnaXZlbiBieSB0aGUgZm9ybWF0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50Ci0gKgotICogICAgQ29va2llTG9nIGZuICAgICAgICBGb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkgd2l0aCBvbGQgQ29va2llCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcgbW9kdWxlIC0gbm93IGRlcHJlY2F0ZWQuCi0gKgotICogVGhlcmUgY2FuIGJlIGFueSBudW1iZXIgb2YgVHJhbnNmZXJMb2cgYW5kIEN1c3RvbUxvZwotICogY29tbWFuZHMuIEVhY2ggcmVxdWVzdCB3aWxsIGJlIGxvZ2dlZCB0byBfQUxMXyB0aGUKLSAqIG5hbWVkIGZpbGVzLCBpbiB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0LgotICoKLSAqIElmIG5vIFRyYW5zZmVyTG9nIG9yIEN1c3RvbUxvZyBkaXJlY3RpdmUgYXBwZWFycyBpbiBhIFZpcnR1YWxIb3N0LAotICogdGhlIHJlcXVlc3Qgd2lsbCBiZSBsb2dnZWQgdG8gdGhlIGxvZyBmaWxlKHMpIGRlZmluZWQgb3V0c2lkZQotICogdGhlIHZpcnR1YWwgaG9zdCBzZWN0aW9uLiBJZiBhIFRyYW5zZmVyTG9nIG9yIEN1c3RvbUxvZyBkaXJlY3RpdmUKLSAqIGFwcGVhcnMgaW4gdGhlIFZpcnR1YWxIb3N0IHNlY3Rpb24sIHRoZSBsb2cgZmlsZXMgZGVmaW5lZCBvdXRzaWRlCi0gKiB0aGUgVmlydHVhbEhvc3Qgd2lsbCBfbm90XyBiZSB1c2VkLiBUaGlzIG1ha2VzIHRoaXMgbW9kdWxlIGNvbXBhdGFibGUKLSAqIHdpdGggdGhlIENMRiBhbmQgY29uZmlnIGxvZyBtb2R1bGVzLCB3aGVyZSB0aGUgdXNlIG9mIFRyYW5zZmVyTG9nCi0gKiBpbnNpZGUgdGhlIFZpcnR1YWxIb3N0IHNlY3Rpb24gb3ZlcnJpZGVzIGl0cyB1c2Ugb3V0c2lkZS4KLSAqIAotICogRXhhbXBsZXM6Ci0gKgotICogICAgVHJhbnNmZXJMb2cgICAgbG9ncy9hY2Nlc3NfbG9nCi0gKiAgICA8VmlydHVhbEhvc3Q+Ci0gKiAgICBMb2dGb3JtYXQgICAgICAiLi4uIGN1c3RvbSBmb3JtYXQgLi4uIgotICogICAgVHJhbnNmZXJMb2cgICAgbG9nL3ZpcnR1YWxfb25seQotICogICAgQ3VzdG9tTG9nICAgICAgbG9nL3ZpcnR1YWxfdXNlcmFnZW50cyAiJXQgJXt1c2VyLWFnZW50fWkiCi0gKiAgICA8L1ZpcnR1YWxIb3N0PgotICoKLSAqIFRoaXMgd2lsbCBsb2cgdXNpbmcgQ0xGIHRvIGFjY2Vzc19sb2cgYW55IHJlcXVlc3RzIGhhbmRsZWQgYnkgdGhlCi0gKiBtYWluIHNlcnZlciwgd2hpbGUgYW55IHJlcXVlc3RzIHRvIHRoZSB2aXJ0dWFsIGhvc3Qgd2lsbCBiZSBsb2dnZWQKLSAqIHdpdGggdGhlICIuLi4gY3VzdG9tIGZvcm1hdC4uLiIgdG8gdmlydHVhbF9vbmx5IF9BTkRfIHVzaW5nCi0gKiB0aGUgY3VzdG9tIHVzZXItYWdlbnQgbG9nIHRvIHZpcnR1YWxfdXNlcmFnZW50cy4KLSAqCi0gKiBOb3RlIHRoYXQgdGhlIE5DU0EgcmVmZXJlciBhbmQgdXNlci1hZ2VudCBsb2dzIGFyZSBlYXNpbHkgYWRkZWQgd2l0aAotICogQ3VzdG9tTG9nOgotICogICBDdXN0b21Mb2cgICBsb2dzL3JlZmVyZXIgICIle3JlZmVyZXJ9aSAtPiAlVSIKLSAqICAgQ3VzdG9tTG9nICAgbG9ncy9hZ2VudCAgICAiJXt1c2VyLWFnZW50fWkiCi0gKgotICogUmVmZXJlcklnbm9yZSBmdW5jdGlvbmFsaXR5IGNhbiBiZSBvYnRhaW5lZCB3aXRoIGNvbmRpdGlvbmFsCi0gKiBsb2dnaW5nIChTZXRFbnZJZiBhbmQgQ3VzdG9tTG9nIC4uLiBlbnY9IVZBUikuCi0gKgotICogQnV0IHVzaW5nIHRoaXMgbWV0aG9kIGFsbG93cyBtdWNoIGVhc2llciBtb2RpZmljYXRpb24gb2YgdGhlCi0gKiBsb2cgZm9ybWF0LCBlLmcuIHRvIGxvZyBob3N0cyBhbG9uZyB3aXRoIFVBOgotICogICBDdXN0b21Mb2cgICBsb2dzL3JlZmVyZXIgIiV7cmVmZXJlcn1pICVVICVoIgotICoKLSAqIFRoZSBhcmd1bWVudCB0byBMb2dGb3JtYXQgYW5kIEN1c3RvbUxvZyBpcyBhIHN0cmluZywgd2hpY2ggY2FuIGluY2x1ZGUKLSAqIGxpdGVyYWwgY2hhcmFjdGVycyBjb3BpZWQgaW50byB0aGUgbG9nIGZpbGVzLCBhbmQgJyUnIGRpcmVjdGl2ZXMgYXMKLSAqIGZvbGxvd3M6Ci0gKgotICogJS4uLmI6ICBieXRlcyBzZW50LCBleGNsdWRpbmcgSFRUUCBoZWFkZXJzLgotICogJS4uLntGT09CQVJ9ZTogIFRoZSBjb250ZW50cyBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgRk9PQkFSCi0gKiAlLi4uZjogIGZpbGVuYW1lCi0gKiAlLi4uaDogIHJlbW90ZSBob3N0Ci0gKiAlLi4uYTogIHJlbW90ZSBJUC1hZGRyZXNzCi0gKiAlLi4uQTogIGxvY2FsIElQLWFkZHJlc3MKLSAqICUuLi57Rm9vYmFyfWk6ICBUaGUgY29udGVudHMgb2YgRm9vYmFyOiBoZWFkZXIgbGluZShzKSBpbiB0aGUgcmVxdWVzdAotICogICAgICAgICAgICAgICAgIHNlbnQgdG8gdGhlIGNsaWVudC4KLSAqICUuLi5sOiAgcmVtb3RlIGxvZ25hbWUgKGZyb20gaWRlbnRkLCBpZiBzdXBwbGllZCkKLSAqICUuLi57Rm9vYmFyfW46ICBUaGUgY29udGVudHMgb2Ygbm90ZSAiRm9vYmFyIiBmcm9tIGFub3RoZXIgbW9kdWxlLgotICogJS4uLntGb29iYXJ9bzogIFRoZSBjb250ZW50cyBvZiBGb29iYXI6IGhlYWRlciBsaW5lKHMpIGluIHRoZSByZXBseS4KLSAqICUuLi5wOiAgdGhlIHBvcnQgdGhlIHJlcXVlc3Qgd2FzIHNlcnZlZCB0bwotICogJS4uLlA6ICB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgY2hpbGQgdGhhdCBzZXJ2aWNlZCB0aGUgcmVxdWVzdC4KLSAqICUuLi5yOiAgZmlyc3QgbGluZSBvZiByZXF1ZXN0Ci0gKiAlLi4uczogIHN0YXR1cy4gIEZvciByZXF1ZXN0cyB0aGF0IGdvdCBpbnRlcm5hbGx5IHJlZGlyZWN0ZWQsIHRoaXMKLSAqICAgICAgICAgaXMgc3RhdHVzIG9mIHRoZSAqb3JpZ2luYWwqIHJlcXVlc3QgLS0tICUuLi4+cyBmb3IgdGhlIGxhc3QuCi0gKiAlLi4udDogIHRpbWUsIGluIGNvbW1vbiBsb2cgZm9ybWF0IHRpbWUgZm9ybWF0Ci0gKiAlLi4ue2Zvcm1hdH10OiAgVGhlIHRpbWUsIGluIHRoZSBmb3JtIGdpdmVuIGJ5IGZvcm1hdCwgd2hpY2ggc2hvdWxkCi0gKiAgICAgICAgICAgICAgICAgYmUgaW4gc3RyZnRpbWUoMykgZm9ybWF0LgotICogJS4uLlQ6ICB0aGUgdGltZSB0YWtlbiB0byBzZXJ2ZSB0aGUgcmVxdWVzdCwgaW4gc2Vjb25kcy4KLSAqICUuLi51OiAgcmVtb3RlIHVzZXIgKGZyb20gYXV0aDsgbWF5IGJlIGJvZ3VzIGlmIHJldHVybiBzdGF0dXMgKCVzKSBpcyA0MDEpCi0gKiAlLi4uVTogIHRoZSBVUkwgcGF0aCByZXF1ZXN0ZWQuCi0gKiAlLi4udjogIHRoZSBjb25maWd1cmVkIG5hbWUgb2YgdGhlIHNlcnZlciAoaS5lLiB3aGljaCB2aXJ0dWFsIGhvc3Q/KQotICogJS4uLlY6ICB0aGUgc2VydmVyIG5hbWUgYWNjb3JkaW5nIHRvIHRoZSBVc2VDYW5vbmljYWxOYW1lIHNldHRpbmcKLSAqCi0gKiBUaGUgJy4uLicgY2FuIGJlIG5vdGhpbmcgYXQgYWxsIChlLmcuICIlaCAldSAlciAlcyAlYiIpLCBvciBpdCBjYW4KLSAqIGluZGljYXRlIGNvbmRpdGlvbnMgZm9yIGluY2x1c2lvbiBvZiB0aGUgaXRlbSAod2hpY2ggd2lsbCBjYXVzZSBpdAotICogdG8gYmUgcmVwbGFjZWQgd2l0aCAnLScgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0KS4gIE5vdGUgdGhhdAotICogdGhlcmUgaXMgbm8gZXNjYXBpbmcgcGVyZm9ybWVkIG9uIHRoZSBzdHJpbmdzIGZyb20gJXIsICUuLi5pIGFuZAotICogJS4uLm87IHNvbWUgd2l0aCBsb25nIG1lbW9yaWVzIG1heSByZW1lbWJlciB0aGF0IEkgdGhvdWdodCB0aGlzIHdhcwotICogYSBiYWQgaWRlYSwgb25jZSB1cG9uIGEgdGltZSwgYW5kIEknbSBzdGlsbCBub3QgY29tZm9ydGFibGUgd2l0aAotICogaXQsIGJ1dCBpdCBpcyBkaWZmaWN1bHQgdG8gc2VlIGhvdyB0byAiZG8gdGhlIHJpZ2h0IHRoaW5nIiB3aXRoIGFsbAotICogb2YgJyUuLmknLCB1bmxlc3Mgd2UgVVJMLWVzY2FwZSBldmVyeXRoaW5nIGFuZCBicmVhayB3aXRoIENMRi4KLSAqCi0gKiBUaGUgZm9ybXMgb2YgY29uZGl0aW9uIGFyZSBhIGxpc3Qgb2YgSFRUUCBzdGF0dXMgY29kZXMsIHdoaWNoIG1heQotICogb3IgbWF5IG5vdCBiZSBwcmVjZWRlZCBieSAnIScuICBUaHVzLCAnJTQwMCw1MDF7VXNlci1hZ2VudH1pJyBsb2dzCi0gKiBVc2VyLWFnZW50OiBvbiA0MDAgZXJyb3JzIGFuZCA1MDEgZXJyb3JzIChCYWQgUmVxdWVzdCwgTm90Ci0gKiBJbXBsZW1lbnRlZCkgb25seTsgJyUhMjAwLDMwNCwzMDJ7UmVmZXJlcn1pJyBsb2dzIFJlZmVyZXI6IG9uIGFsbAotICogcmVxdWVzdHMgd2hpY2ggZGlkICpub3QqIHJldHVybiBzb21lIHNvcnQgb2Ygbm9ybWFsIHN0YXR1cy4KLSAqCi0gKiBUaGUgZGVmYXVsdCBMb2dGb3JtYXQgcmVwcm9kdWNlcyBDTEY7IHNlZSBiZWxvdy4KLSAqCi0gKiBUaGUgd2F5IHRoaXMgaXMgc3VwcG9zZWQgdG8gd29yayB3aXRoIHZpcnR1YWwgaG9zdHMgaXMgYXMgZm9sbG93czoKLSAqIGEgdmlydHVhbCBob3N0IGNhbiBoYXZlIGl0cyBvd24gTG9nRm9ybWF0LCBvciBpdHMgb3duIFRyYW5zZmVyTG9nLgotICogSWYgaXQgZG9lc24ndCBoYXZlIGl0cyBvd24gTG9nRm9ybWF0LCBpdCBpbmhlcml0cyBmcm9tIHRoZSBtYWluCi0gKiBzZXJ2ZXIuICBJZiBpdCBkb2Vzbid0IGhhdmUgaXRzIG93biBUcmFuc2ZlckxvZywgaXQgd3JpdGVzIHRvIHRoZQotICogc2FtZSBkZXNjcmlwdG9yIChtZWFuaW5nIHRoZSBzYW1lIHByb2Nlc3MgZm9yICJ8IC4uLiIpLgotICoKLSAqIC0tLSByc3QgKi8KLQotI2RlZmluZSBERUZBVUxUX0xPR19GT1JNQVQgIiVoICVsICV1ICV0IFwiJXJcIiAlPnMgJWIiCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiICAgICAgICAgIC8qIEZvciBSRU1PVEVfTkFNRSAqLwotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBjb25maWdfbG9nX21vZHVsZTsKLQotc3RhdGljIGludCB4ZmVyX2ZsYWdzID0gKE9fV1JPTkxZIHwgT19BUFBFTkQgfCBPX0NSRUFUKTsKLSNpZiBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChXSU4zMikKLS8qIE9TLzIgZG9zZW4ndCBzdXBwb3J0IHVzZXJzIGFuZCBncm91cHMgKi8KLXN0YXRpYyBtb2RlX3QgeGZlcl9tb2RlID0gKFNfSVJFQUQgfCBTX0lXUklURSk7Ci0jZWxzZQotc3RhdGljIG1vZGVfdCB4ZmVyX21vZGUgPSAoU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USCk7Ci0jZW5kaWYKLQotLyogUE9TSVguMSBkZWZpbmVzIFBJUEVfQlVGIGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IGlzCi0gKiBndWFyYW50ZWVkIHRvIGJlIGF0b21pYyB3aGVuIHdyaXRpbmcgYSBwaXBlLiAgQW5kIFBJUEVfQlVGID49IDUxMgotICogaXMgZ3VhcmFudGVlZC4gIFNvIHdlJ2xsIGp1c3QgZ3Vlc3MgNTEyIGluIHRoZSBldmVudCB0aGUgc3lzdGVtCi0gKiBkb2Vzbid0IGhhdmUgdGhpcy4gIE5vdywgZm9yIGZpbGUgd3JpdGVzIHRoZXJlIGlzIGFjdHVhbGx5IG5vIGxpbWl0LAotICogdGhlIGVudGlyZSB3cml0ZSBpcyBhdG9taWMuICBXaGV0aGVyIGFsbCBzeXN0ZW1zIGltcGxlbWVudCB0aGlzCi0gKiBjb3JyZWN0bHkgaXMgYW5vdGhlciBxdWVzdGlvbiBlbnRpcmVseSAuLi4gc28gd2UnbGwganVzdCB1c2UgUElQRV9CVUYKLSAqIGJlY2F1c2UgaXQncyBwcm9iYWJseSBhIGdvb2QgZ3Vlc3MgYXMgdG8gd2hhdCBpcyBpbXBsZW1lbnRlZCBjb3JyZWN0bHkKLSAqIGV2ZXJ5d2hlcmUuCi0gKi8KLSNpZmRlZiBQSVBFX0JVRgotI2RlZmluZSBMT0dfQlVGU0laRSAgICAgUElQRV9CVUYKLSNlbHNlCi0jZGVmaW5lIExPR19CVUZTSVpFICAgICAoNTEyKQotI2VuZGlmCi0KLS8qCi0gKiBtdWx0aV9sb2dfc3RhdGUgaXMgb3VyIHBlci0odmlydHVhbCktc2VydmVyIGNvbmZpZ3VyYXRpb24uIFdlIHN0b3JlCi0gKiBhbiBhcnJheSBvZiB0aGUgbG9ncyB3ZSBhcmUgZ29pbmcgdG8gdXNlLCBlYWNoIG9mIHR5cGUgY29uZmlnX2xvZ19zdGF0ZS4KLSAqIElmIGEgZGVmYXVsdCBsb2cgZm9ybWF0IGlzIGdpdmVuIGJ5IExvZ0Zvcm1hdCwgc3RvcmUgaW4gZGVmYXVsdF9mb3JtYXQKLSAqIChiYWNrd2FyZCBjb21wYXQuIHdpdGggbW9kX2xvZ19jb25maWcpLiAgV2UgYWxzbyBzdG9yZSBmb3IgZWFjaCB2aXJ0dWFsCi0gKiBzZXJ2ZXIgYSBwb2ludGVyIHRvIHRoZSBsb2dzIHNwZWNpZmllZCBmb3IgdGhlIG1haW4gc2VydmVyLCBzbyB0aGF0IGlmIHRoaXMKLSAqIHZob3N0IGhhcyBubyBsb2dzIGRlZmluZWQsIHdlIGNhbiB1c2UgdGhlIG1haW4gc2VydmVyJ3MgbG9ncyBpbnN0ZWFkLgotICoKLSAqIFNvLCBmb3IgdGhlIG1haW4gc2VydmVyLCBjb25maWdfbG9ncyBjb250YWlucyBhIGxpc3Qgb2YgdGhlIGxvZyBmaWxlcwotICogYW5kIHNlcnZlcl9jb25maWdfbG9ncyBpbiBlbXB0eS4gRm9yIGEgdmhvc3QsIHNlcnZlcl9jb25maWdfbG9ncwotICogcG9pbnRzIHRvIHRoZSBzYW1lIGFycmF5IGFzIGNvbmZpZ19sb2dzIGluIHRoZSBtYWluIHNlcnZlciwgYW5kCi0gKiBjb25maWdfbG9ncyBwb2ludHMgdG8gdGhlIGFycmF5IG9mIGxvZ3MgZGVmaW5lZCBpbnNpZGUgdGhpcyB2aG9zdCwKLSAqIHdoaWNoIG1pZ2h0IGJlIGVtcHR5LgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjaGFyICpkZWZhdWx0X2Zvcm1hdF9zdHJpbmc7Ci0gICAgYXJyYXlfaGVhZGVyICpkZWZhdWx0X2Zvcm1hdDsKLSAgICBhcnJheV9oZWFkZXIgKmNvbmZpZ19sb2dzOwotICAgIGFycmF5X2hlYWRlciAqc2VydmVyX2NvbmZpZ19sb2dzOwotICAgIHRhYmxlICpmb3JtYXRzOwotfSBtdWx0aV9sb2dfc3RhdGU7Ci0KLS8qCi0gKiBjb25maWdfbG9nX3N0YXRlIGhvbGRzIHRoZSBzdGF0dXMgb2YgYSBzaW5nbGUgbG9nIGZpbGUuIGZuYW1lIG1pZ2h0Ci0gKiBiZSBOVUxMLCB3aGljaCBtZWFucyB0aGlzIG1vZHVsZSBkb2VzIG5vIGxvZ2dpbmcgZm9yIHRoaXMKLSAqIHJlcXVlc3QuIGZvcm1hdCBtaWdodCBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIHRoZSBkZWZhdWx0X2Zvcm1hdAotICogZnJvbSB0aGUgbXVsdGlfbG9nX3N0YXRlIHNob3VsZCBiZSB1c2VkLCBvciBpZiB0aGF0IGlzIE5VTEwgYXMKLSAqIHdlbGwsIHVzZSB0aGUgQ0xGLiBsb2dfZmQgaXMgLTEgYmVmb3JlIHRoZSBsb2cgZmlsZSBpcyBvcGVuZWQgYW5kCi0gKiBzZXQgdG8gYSB2YWxpZCBmZCBhZnRlciBpdCBpcyBvcGVuZWQuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNoYXIgKmZuYW1lOwotICAgIGNoYXIgKmZvcm1hdF9zdHJpbmc7Ci0gICAgYXJyYXlfaGVhZGVyICpmb3JtYXQ7Ci0gICAgaW50IGxvZ19mZDsKLSAgICBjaGFyICpjb25kaXRpb25fdmFyOwotI2lmZGVmIEJVRkZFUkVEX0xPR1MKLSAgICBpbnQgb3V0Y250OwotICAgIGNoYXIgb3V0YnVmW0xPR19CVUZTSVpFXTsKLSNlbmRpZgotfSBjb25maWdfbG9nX3N0YXRlOwotCi0vKgotICogRm9ybWF0IGl0ZW1zLi4uCi0gKiBOb3RlIHRoYXQgbWFueSBvZiB0aGVzZSBjb3VsZCBoYXZlIGFwX3NwcmludGZzIHJlcGxhY2VkIHdpdGggc3RhdGljIGJ1ZmZlcnMuCi0gKi8KLQotdHlwZWRlZiBjb25zdCBjaGFyICooKml0ZW1fa2V5X2Z1bmMpIChyZXF1ZXN0X3JlYyAqLCBjaGFyICopOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaXRlbV9rZXlfZnVuYyBmdW5jOwotICAgIGNoYXIgKmFyZzsKLSAgICBpbnQgY29uZGl0aW9uX3NlbnNlOwotICAgIGludCB3YW50X29yaWc7Ci0gICAgYXJyYXlfaGVhZGVyICpjb25kaXRpb25zOwotfSBsb2dfZm9ybWF0X2l0ZW07Ci0KLXN0YXRpYyBjaGFyICpmb3JtYXRfaW50ZWdlcihwb29sICpwLCBpbnQgaSkKLXsKLSAgICByZXR1cm4gYXBfcHNwcmludGYocCwgIiVkIiwgaSk7Ci19Ci0KLXN0YXRpYyBjaGFyICpwZm10KHBvb2wgKnAsIGludCBpKQotewotICAgIGlmIChpIDw9IDApIHsKLSAgICAgICAgcmV0dXJuICItIjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJldHVybiBmb3JtYXRfaW50ZWdlcihwLCBpKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdGFudF9pdGVtKHJlcXVlc3RfcmVjICpkdW1teSwgY2hhciAqc3R1ZmYpCi17Ci0gICAgcmV0dXJuIHN0dWZmOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqbG9nX3JlbW90ZV9ob3N0KHJlcXVlc3RfcmVjICpyLCBjaGFyICphKQotewotICAgIHJldHVybiBhcF9nZXRfcmVtb3RlX2hvc3Qoci0+Y29ubmVjdGlvbiwgci0+cGVyX2Rpcl9jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRU1PVEVfTkFNRSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpsb2dfcmVtb3RlX2FkZHJlc3MocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmEpCi17Ci0gICAgcmV0dXJuIHItPmNvbm5lY3Rpb24tPnJlbW90ZV9pcDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmxvZ19sb2NhbF9hZGRyZXNzKHJlcXVlc3RfcmVjICpyLCBjaGFyICphKQotewotICAgIHJldHVybiByLT5jb25uZWN0aW9uLT5sb2NhbF9pcDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmxvZ19yZW1vdGVfbG9nbmFtZShyZXF1ZXN0X3JlYyAqciwgY2hhciAqYSkKLXsKLSAgICByZXR1cm4gYXBfZ2V0X3JlbW90ZV9sb2duYW1lKHIpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqbG9nX3JlbW90ZV91c2VyKHJlcXVlc3RfcmVjICpyLCBjaGFyICphKQotewotICAgIGNoYXIgKnJ2YWx1ZSA9IHItPmNvbm5lY3Rpb24tPnVzZXI7Ci0KLSAgICBpZiAocnZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgcnZhbHVlID0gIi0iOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJsZW4ocnZhbHVlKSA9PSAwKSB7Ci0gICAgICAgIHJ2YWx1ZSA9ICJcIlwiIjsKLSAgICB9Ci0gICAgcmV0dXJuIHJ2YWx1ZTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmxvZ19yZXF1ZXN0X2xpbmUocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmEpCi17Ci0JICAgIC8qIE5PVEU6IElmIHRoZSBvcmlnaW5hbCByZXF1ZXN0IGNvbnRhaW5lZCBhIHBhc3N3b3JkLCB3ZQotCSAgICAgKiByZS13cml0ZSB0aGUgcmVxdWVzdCBsaW5lIGhlcmUgdG8gY29udGFpbiBYWFhYWFggaW5zdGVhZDoKLQkgICAgICogKG5vdGUgdGhlIHRydW5jYXRpb24gYmVmb3JlIHRoZSBwcm90b2NvbCBzdHJpbmcgZm9yIEhUVFAvMC45IHJlcXVlc3RzKQotCSAgICAgKiAobm90ZSBhbHNvIHRoYXQgci0+dGhlX3JlcXVlc3QgY29udGFpbnMgdGhlIHVubW9kaWZpZWQgcmVxdWVzdCkKLQkgICAgICovCi0gICAgcmV0dXJuIChyLT5wYXJzZWRfdXJpLnBhc3N3b3JkKSA/IGFwX3BzdHJjYXQoci0+cG9vbCwgci0+bWV0aG9kLCAiICIsCi0JCQkJCSBhcF91bnBhcnNlX3VyaV9jb21wb25lbnRzKHItPnBvb2wsICZyLT5wYXJzZWRfdXJpLCAwKSwKLQkJCQkJIHItPmFzc2JhY2t3YXJkcyA/IE5VTEwgOiAiICIsIHItPnByb3RvY29sLCBOVUxMKQotCQkJCQk6IHItPnRoZV9yZXF1ZXN0OwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqbG9nX3JlcXVlc3RfZmlsZShyZXF1ZXN0X3JlYyAqciwgY2hhciAqYSkKLXsKLSAgICByZXR1cm4gci0+ZmlsZW5hbWU7Ci19Ci1zdGF0aWMgY29uc3QgY2hhciAqbG9nX3JlcXVlc3RfdXJpKHJlcXVlc3RfcmVjICpyLCBjaGFyICphKQotewotICAgIHJldHVybiByLT51cmk7Ci19Ci1zdGF0aWMgY29uc3QgY2hhciAqbG9nX3N0YXR1cyhyZXF1ZXN0X3JlYyAqciwgY2hhciAqYSkKLXsKLSAgICByZXR1cm4gcGZtdChyLT5wb29sLCByLT5zdGF0dXMpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqbG9nX2J5dGVzX3NlbnQocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmEpCi17Ci0gICAgaWYgKCFyLT5zZW50X2JvZHljdCkgewotICAgICAgICByZXR1cm4gIi0iOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgbG9uZyBpbnQgYnM7Ci0gICAgICAgIGFwX2JnZXRvcHQoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCT19CWVRFQ1QsICZicyk7Ci0JcmV0dXJuIGFwX3BzcHJpbnRmKHItPnBvb2wsICIlbGQiLCBicyk7Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqbG9nX2hlYWRlcl9pbihyZXF1ZXN0X3JlYyAqciwgY2hhciAqYSkKLXsKLSAgICByZXR1cm4gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sIGEpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqbG9nX2hlYWRlcl9vdXQocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmEpCi17Ci0gICAgY29uc3QgY2hhciAqY3AgPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19vdXQsIGEpOwotICAgIGlmICghc3RyY2FzZWNtcChhLCAiQ29udGVudC10eXBlIikgJiYgci0+Y29udGVudF90eXBlKSB7Ci0gICAgICAgIGNwID0gci0+Y29udGVudF90eXBlOwotICAgIH0KLSAgICBpZiAoY3ApIHsKLSAgICAgICAgcmV0dXJuIGNwOwotICAgIH0KLSAgICByZXR1cm4gYXBfdGFibGVfZ2V0KHItPmVycl9oZWFkZXJzX291dCwgYSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpsb2dfbm90ZShyZXF1ZXN0X3JlYyAqciwgY2hhciAqYSkKLXsKLSAgICByZXR1cm4gYXBfdGFibGVfZ2V0KHItPm5vdGVzLCBhKTsKLX0KLXN0YXRpYyBjb25zdCBjaGFyICpsb2dfZW52X3ZhcihyZXF1ZXN0X3JlYyAqciwgY2hhciAqYSkKLXsKLSAgICByZXR1cm4gYXBfdGFibGVfZ2V0KHItPnN1YnByb2Nlc3NfZW52LCBhKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmxvZ19yZXF1ZXN0X3RpbWUocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmEpCi17Ci0gICAgaW50IHRpbXo7Ci0gICAgc3RydWN0IHRtICp0OwotICAgIGNoYXIgdHN0cltNQVhfU1RSSU5HX0xFTl07Ci0KLSAgICB0ID0gYXBfZ2V0X2dtdG9mZigmdGlteik7Ci0KLSAgICBpZiAoYSAmJiAqYSkgeyAgICAgICAgICAgICAgLyogQ3VzdG9tIGZvcm1hdCAqLwotICAgICAgICBzdHJmdGltZSh0c3RyLCBNQVhfU1RSSU5HX0xFTiwgYSwgdCk7Ci0gICAgfQotICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBDTEYgZm9ybWF0ICovCi0gICAgICAgIGNoYXIgc2lnbiA9ICh0aW16IDwgMCA/ICctJyA6ICcrJyk7Ci0KLSAgICAgICAgaWYgKHRpbXogPCAwKSB7Ci0gICAgICAgICAgICB0aW16ID0gLXRpbXo7Ci0gICAgICAgIH0KLSAgICAgICAgYXBfc25wcmludGYodHN0ciwgc2l6ZW9mKHRzdHIpLCAiWyUwMmQvJXMvJWQ6JTAyZDolMDJkOiUwMmQgJWMlLjJkJS4yZF0iLAotICAgICAgICAgICAgICAgIHQtPnRtX21kYXksIGFwX21vbnRoX3NuYW1lc1t0LT50bV9tb25dLCB0LT50bV95ZWFyKzE5MDAsIAotICAgICAgICAgICAgICAgIHQtPnRtX2hvdXIsIHQtPnRtX21pbiwgdC0+dG1fc2VjLAotICAgICAgICAgICAgICAgIHNpZ24sIHRpbXogLyA2MCwgdGlteiAlIDYwKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYXBfcHN0cmR1cChyLT5wb29sLCB0c3RyKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmxvZ19yZXF1ZXN0X2R1cmF0aW9uKHJlcXVlc3RfcmVjICpyLCBjaGFyICphKQotewotICAgIHJldHVybiBhcF9wc3ByaW50ZihyLT5wb29sLCAiJWxkIiwgdGltZShOVUxMKSAtIHItPnJlcXVlc3RfdGltZSk7Ci19Ci0KLS8qIFRoZXNlIG5leHQgdHdvIHJvdXRpbmVzIHVzZSB0aGUgY2Fub25pY2FsIG5hbWU6cG9ydCBzbyB0aGF0IGxvZwotICogcGFyc2VycyBkb24ndCBuZWVkIHRvIGR1cGxpY2F0ZSBhbGwgdGhlIHZob3N0IHBhcnNpbmcgY3J1ZC4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmxvZ192aXJ0dWFsX2hvc3QocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmEpCi17Ci0gICAgcmV0dXJuIHItPnNlcnZlci0+c2VydmVyX2hvc3RuYW1lOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqbG9nX3NlcnZlcl9wb3J0KHJlcXVlc3RfcmVjICpyLCBjaGFyICphKQotewotICAgIHJldHVybiBhcF9wc3ByaW50ZihyLT5wb29sLCAiJXUiLAotCXItPnNlcnZlci0+cG9ydCA/IHItPnNlcnZlci0+cG9ydCA6IGFwX2RlZmF1bHRfcG9ydChyKSk7Ci19Ci0KLS8qIFRoaXMgcmVzcGVjdHMgdGhlIHNldHRpbmcgb2YgVXNlQ2Fub25pY2FsTmFtZSBzbyB0aGF0Ci0gKiB0aGUgZHluYW1pYyBtYXNzIHZpcnR1YWwgaG9zdGluZyB0cmljayB3b3JrcyBiZXR0ZXIuCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpsb2dfc2VydmVyX25hbWUocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmEpCi17Ci0gICAgcmV0dXJuIGFwX2dldF9zZXJ2ZXJfbmFtZShyKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmxvZ19jaGlsZF9waWQocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmEpCi17Ci0gICAgcmV0dXJuIGFwX3BzcHJpbnRmKHItPnBvb2wsICIlbGQiLCAobG9uZykgZ2V0cGlkKCkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBQYXJzaW5nIHRoZSBsb2cgZm9ybWF0IHN0cmluZwotICovCi0KLXN0YXRpYyBzdHJ1Y3QgbG9nX2l0ZW1fbGlzdCB7Ci0gICAgY2hhciBjaDsKLSAgICBpdGVtX2tleV9mdW5jIGZ1bmM7Ci0gICAgaW50IHdhbnRfb3JpZ19kZWZhdWx0OwotfSBsb2dfaXRlbV9rZXlzW10gPSB7Ci0KLSAgICB7Ci0gICAgICAgICdoJywgbG9nX3JlbW90ZV9ob3N0LCAwCi0gICAgfSwKLSAgICB7ICAgCi0gICAgICAgICdhJywgbG9nX3JlbW90ZV9hZGRyZXNzLCAwIAotICAgIH0sCi0gICAgeyAgIAotICAgICAgICAnQScsIGxvZ19sb2NhbF9hZGRyZXNzLCAwIAotICAgIH0sCi0gICAgewotICAgICAgICAnbCcsIGxvZ19yZW1vdGVfbG9nbmFtZSwgMAotICAgIH0sCi0gICAgewotICAgICAgICAndScsIGxvZ19yZW1vdGVfdXNlciwgMAotICAgIH0sCi0gICAgewotICAgICAgICAndCcsIGxvZ19yZXF1ZXN0X3RpbWUsIDAKLSAgICB9LAotICAgIHsKLSAgICAgICAgJ1QnLCBsb2dfcmVxdWVzdF9kdXJhdGlvbiwgMQotICAgIH0sCi0gICAgewotICAgICAgICAncicsIGxvZ19yZXF1ZXN0X2xpbmUsIDEKLSAgICB9LAotICAgIHsKLSAgICAgICAgJ2YnLCBsb2dfcmVxdWVzdF9maWxlLCAwCi0gICAgfSwKLSAgICB7Ci0gICAgICAgICdVJywgbG9nX3JlcXVlc3RfdXJpLCAxCi0gICAgfSwKLSAgICB7Ci0gICAgICAgICdzJywgbG9nX3N0YXR1cywgMQotICAgIH0sCi0gICAgewotICAgICAgICAnYicsIGxvZ19ieXRlc19zZW50LCAwCi0gICAgfSwKLSAgICB7Ci0gICAgICAgICdpJywgbG9nX2hlYWRlcl9pbiwgMAotICAgIH0sCi0gICAgewotICAgICAgICAnbycsIGxvZ19oZWFkZXJfb3V0LCAwCi0gICAgfSwKLSAgICB7Ci0gICAgICAgICduJywgbG9nX25vdGUsIDAKLSAgICB9LAotICAgIHsKLSAgICAgICAgJ2UnLCBsb2dfZW52X3ZhciwgMAotICAgIH0sCi0gICAgewotICAgICAgICAnVicsIGxvZ19zZXJ2ZXJfbmFtZSwgMAotICAgIH0sCi0gICAgewotICAgICAgICAndicsIGxvZ192aXJ0dWFsX2hvc3QsIDAKLSAgICB9LAotICAgIHsKLSAgICAgICAgJ3AnLCBsb2dfc2VydmVyX3BvcnQsIDAKLSAgICB9LAotICAgIHsKLSAgICAgICAgJ1AnLCBsb2dfY2hpbGRfcGlkLCAwCi0gICAgfSwKLSAgICB7Ci0gICAgICAgICdcMCcKLSAgICB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGxvZ19pdGVtX2xpc3QgKmZpbmRfbG9nX2Z1bmMoY2hhciBrKQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgbG9nX2l0ZW1fa2V5c1tpXS5jaDsgKytpKQotICAgICAgICBpZiAoayA9PSBsb2dfaXRlbV9rZXlzW2ldLmNoKSB7Ci0gICAgICAgICAgICByZXR1cm4gJmxvZ19pdGVtX2tleXNbaV07Ci0gICAgICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY2hhciAqcGFyc2VfbG9nX21pc2Nfc3RyaW5nKHBvb2wgKnAsIGxvZ19mb3JtYXRfaXRlbSAqaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipzYSkKLXsKLSAgICBjb25zdCBjaGFyICpzOwotICAgIGNoYXIgKmQ7Ci0KLSAgICBpdC0+ZnVuYyA9IGNvbnN0YW50X2l0ZW07Ci0gICAgaXQtPmNvbmRpdGlvbnMgPSBOVUxMOwotCi0gICAgcyA9ICpzYTsKLSAgICB3aGlsZSAoKnMgJiYgKnMgIT0gJyUnKSB7Ci0JcysrOwotICAgIH0KLSAgICAvKgotICAgICAqIFRoaXMgbWlnaHQgYWxsb2NhdGUgYSBmZXcgY2hhcnMgZXh0cmEgaWYgdGhlcmUncyBhIGJhY2tzbGFzaAotICAgICAqIGVzY2FwZSBpbiB0aGUgZm9ybWF0IHN0cmluZy4KLSAgICAgKi8KLSAgICBpdC0+YXJnID0gYXBfcGFsbG9jKHAsIHMgLSAqc2EgKyAxKTsKLQotICAgIGQgPSBpdC0+YXJnOwotICAgIHMgPSAqc2E7Ci0gICAgd2hpbGUgKCpzICYmICpzICE9ICclJykgewotCWlmICgqcyAhPSAnXFwnKSB7Ci0JICAgICpkKysgPSAqcysrOwotCX0KLQllbHNlIHsKLQkgICAgcysrOwotCSAgICBzd2l0Y2ggKCpzKSB7Ci0JICAgIGNhc2UgJ1xcJzoKLQkJKmQrKyA9ICdcXCc7Ci0JCXMrKzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgJ24nOgotCQkqZCsrID0gJ1xuJzsKLQkJcysrOwotCQlicmVhazsKLQkgICAgY2FzZSAndCc6CQotCQkqZCsrID0gJ1x0JzsKLQkJcysrOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJLyogY29weSB2ZXJiYXRpbSAqLwotCQkqZCsrID0gJ1xcJzsKLQkJLyoKLQkJICogQWxsb3cgdGhlIGxvb3AgdG8gZGVhbCB3aXRoIHRoaXMgKnMgaW4gdGhlIG5vcm1hbAotCQkgKiBmYXNoaW9uIHNvIHRoYXQgaXQgaGFuZGxlcyBlbmQgb2Ygc3RyaW5nIGV0Yy4KLQkJICogcHJvcGVybHkuCi0JCSAqLwotCQlicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gICAgKmQgPSAnXDAnOwotCi0gICAgKnNhID0gczsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNoYXIgKnBhcnNlX2xvZ19pdGVtKHBvb2wgKnAsIGxvZ19mb3JtYXRfaXRlbSAqaXQsIGNvbnN0IGNoYXIgKipzYSkKLXsKLSAgICBjb25zdCBjaGFyICpzID0gKnNhOwotCi0gICAgaWYgKCpzICE9ICclJykgewotICAgICAgICByZXR1cm4gcGFyc2VfbG9nX21pc2Nfc3RyaW5nKHAsIGl0LCBzYSk7Ci0gICAgfQotCi0gICAgKytzOwotICAgIGl0LT5jb25kaXRpb25fc2Vuc2UgPSAwOwotICAgIGl0LT5jb25kaXRpb25zID0gTlVMTDsKLSAgICBpdC0+d2FudF9vcmlnID0gLTE7Ci0gICAgaXQtPmFyZyA9ICIiOyAgICAgICAgICAgICAgIC8qIEZvciBzYWZldHkncyBzYWtlLi4uICovCi0KLSAgICB3aGlsZSAoKnMpIHsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIHN0cnVjdCBsb2dfaXRlbV9saXN0ICpsOwotCi0gICAgICAgIHN3aXRjaCAoKnMpIHsKLSAgICAgICAgY2FzZSAnISc6Ci0gICAgICAgICAgICArK3M7Ci0gICAgICAgICAgICBpdC0+Y29uZGl0aW9uX3NlbnNlID0gIWl0LT5jb25kaXRpb25fc2Vuc2U7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICc8JzoKLSAgICAgICAgICAgICsrczsKLSAgICAgICAgICAgIGl0LT53YW50X29yaWcgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnPic6Ci0gICAgICAgICAgICArK3M7Ci0gICAgICAgICAgICBpdC0+d2FudF9vcmlnID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJywnOgotICAgICAgICAgICAgKytzOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAneyc6Ci0gICAgICAgICAgICArK3M7Ci0gICAgICAgICAgICBpdC0+YXJnID0gYXBfZ2V0d29yZChwLCAmcywgJ30nKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJzAnOgotICAgICAgICBjYXNlICcxJzoKLSAgICAgICAgY2FzZSAnMic6Ci0gICAgICAgIGNhc2UgJzMnOgotICAgICAgICBjYXNlICc0JzoKLSAgICAgICAgY2FzZSAnNSc6Ci0gICAgICAgIGNhc2UgJzYnOgotICAgICAgICBjYXNlICc3JzoKLSAgICAgICAgY2FzZSAnOCc6Ci0gICAgICAgIGNhc2UgJzknOgotICAgICAgICAgICAgaSA9ICpzIC0gJzAnOwotICAgICAgICAgICAgd2hpbGUgKGFwX2lzZGlnaXQoKisrcykpIHsKLSAgICAgICAgICAgICAgICBpID0gaSAqIDEwICsgKCpzKSAtICcwJzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaXQtPmNvbmRpdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBpdC0+Y29uZGl0aW9ucyA9IGFwX21ha2VfYXJyYXkocCwgNCwgc2l6ZW9mKGludCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKihpbnQgKikgYXBfcHVzaF9hcnJheShpdC0+Y29uZGl0aW9ucykgPSBpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGwgPSBmaW5kX2xvZ19mdW5jKCpzKyspOwotICAgICAgICAgICAgaWYgKCFsKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBkdW1teVsyXTsKLQotICAgICAgICAgICAgICAgIGR1bW15WzBdID0gc1stMV07Ci0gICAgICAgICAgICAgICAgZHVtbXlbMV0gPSAnXDAnOwotICAgICAgICAgICAgICAgIHJldHVybiBhcF9wc3RyY2F0KHAsICJVbnJlY29nbml6ZWQgTG9nRm9ybWF0IGRpcmVjdGl2ZSAlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1teSwgTlVMTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpdC0+ZnVuYyA9IGwtPmZ1bmM7Ci0gICAgICAgICAgICBpZiAoaXQtPndhbnRfb3JpZyA9PSAtMSkgewotICAgICAgICAgICAgICAgIGl0LT53YW50X29yaWcgPSBsLT53YW50X29yaWdfZGVmYXVsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpzYSA9IHM7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAiUmFuIG9mZiBlbmQgb2YgTG9nRm9ybWF0IHBhcnNpbmcgYXJncyB0byBzb21lIGRpcmVjdGl2ZSI7Ci19Ci0KLXN0YXRpYyBhcnJheV9oZWFkZXIgKnBhcnNlX2xvZ19zdHJpbmcocG9vbCAqcCwgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqKmVycikKLXsKLSAgICBhcnJheV9oZWFkZXIgKmEgPSBhcF9tYWtlX2FycmF5KHAsIDMwLCBzaXplb2YobG9nX2Zvcm1hdF9pdGVtKSk7Ci0gICAgY2hhciAqcmVzOwotCi0gICAgd2hpbGUgKCpzKSB7Ci0gICAgICAgIGlmICgocmVzID0gcGFyc2VfbG9nX2l0ZW0ocCwgKGxvZ19mb3JtYXRfaXRlbSAqKSBhcF9wdXNoX2FycmF5KGEpLCAmcykpKSB7Ci0gICAgICAgICAgICAqZXJyID0gcmVzOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzID0gIlxuIjsKLSAgICBwYXJzZV9sb2dfaXRlbShwLCAobG9nX2Zvcm1hdF9pdGVtICopIGFwX3B1c2hfYXJyYXkoYSksICZzKTsKLSAgICByZXR1cm4gYTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQWN0dWFsbHkgbG9nZ2luZy4KLSAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqcHJvY2Vzc19pdGVtKHJlcXVlc3RfcmVjICpyLCByZXF1ZXN0X3JlYyAqb3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX2Zvcm1hdF9pdGVtICppdGVtKQotewotICAgIGNvbnN0IGNoYXIgKmNwOwotCi0gICAgLyogRmlyc3QsIHNlZSBpZiB3ZSBuZWVkIHRvIHByb2Nlc3MgdGhpcyB0aGluZyBhdCBhbGwuLi4gKi8KLQotICAgIGlmIChpdGVtLT5jb25kaXRpb25zICYmIGl0ZW0tPmNvbmRpdGlvbnMtPm5lbHRzICE9IDApIHsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGludCAqY29uZHMgPSAoaW50ICopIGl0ZW0tPmNvbmRpdGlvbnMtPmVsdHM7Ci0gICAgICAgIGludCBpbl9saXN0ID0gMDsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbS0+Y29uZGl0aW9ucy0+bmVsdHM7ICsraSkgewotICAgICAgICAgICAgaWYgKHItPnN0YXR1cyA9PSBjb25kc1tpXSkgewotICAgICAgICAgICAgICAgIGluX2xpc3QgPSAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChpdGVtLT5jb25kaXRpb25fc2Vuc2UgJiYgaW5fbGlzdCkKLSAgICAgICAgICAgIHx8ICghaXRlbS0+Y29uZGl0aW9uX3NlbnNlICYmICFpbl9saXN0KSkgewotICAgICAgICAgICAgcmV0dXJuICItIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFdlIGRvLiAgRG8gaXQuLi4gKi8KLQotICAgIGNwID0gKCppdGVtLT5mdW5jKSAoaXRlbS0+d2FudF9vcmlnID8gb3JpZyA6IHIsIGl0ZW0tPmFyZyk7Ci0gICAgcmV0dXJuIGNwID8gY3AgOiAiLSI7Ci19Ci0KLSNpZmRlZiBCVUZGRVJFRF9MT0dTCi1zdGF0aWMgdm9pZCBmbHVzaF9sb2coY29uZmlnX2xvZ19zdGF0ZSAqY2xzKQotewotICAgIGlmIChjbHMtPm91dGNudCAmJiBjbHMtPmxvZ19mZCAhPSAtMSkgewotICAgICAgICB3cml0ZShjbHMtPmxvZ19mZCwgY2xzLT5vdXRidWYsIGNscy0+b3V0Y250KTsKLSAgICAgICAgY2xzLT5vdXRjbnQgPSAwOwotICAgIH0KLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IGNvbmZpZ19sb2dfdHJhbnNhY3Rpb24ocmVxdWVzdF9yZWMgKnIsIGNvbmZpZ19sb2dfc3RhdGUgKmNscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9oZWFkZXIgKmRlZmF1bHRfZm9ybWF0KQotewotICAgIGxvZ19mb3JtYXRfaXRlbSAqaXRlbXM7Ci0gICAgY2hhciAqc3RyLCAqczsKLSAgICBjb25zdCBjaGFyICoqc3RyczsKLSAgICBpbnQgKnN0cmw7Ci0gICAgcmVxdWVzdF9yZWMgKm9yaWc7Ci0gICAgaW50IGk7Ci0gICAgaW50IGxlbiA9IDA7Ci0gICAgYXJyYXlfaGVhZGVyICpmb3JtYXQ7Ci0gICAgY2hhciAqZW52YXI7Ci0KLSAgICBpZiAoY2xzLT5mbmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNlZSBpZiB3ZSd2ZSBnb3QgYW55IGNvbmRpdGlvbmFsIGVudmFyaWFibGUtY29udHJvbGxlZCBsb2dnaW5nIGRlY2lzaW9ucwotICAgICAqIHRvIG1ha2UuCi0gICAgICovCi0gICAgaWYgKGNscy0+Y29uZGl0aW9uX3ZhciAhPSBOVUxMKSB7Ci0JZW52YXIgPSBjbHMtPmNvbmRpdGlvbl92YXI7Ci0JaWYgKCplbnZhciAhPSAnIScpIHsKLQkgICAgaWYgKGFwX3RhYmxlX2dldChyLT5zdWJwcm9jZXNzX2VudiwgZW52YXIpID09IE5VTEwpIHsKLQkJcmV0dXJuIERFQ0xJTkVEOwotCSAgICB9Ci0JfQotCWVsc2UgewotCSAgICBpZiAoYXBfdGFibGVfZ2V0KHItPnN1YnByb2Nlc3NfZW52LCAmZW52YXJbMV0pICE9IE5VTEwpIHsKLQkJcmV0dXJuIERFQ0xJTkVEOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIGZvcm1hdCA9IGNscy0+Zm9ybWF0ID8gY2xzLT5mb3JtYXQgOiBkZWZhdWx0X2Zvcm1hdDsKLQotICAgIHN0cnMgPSBhcF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKGNoYXIgKikgKiAoZm9ybWF0LT5uZWx0cykpOwotICAgIHN0cmwgPSBhcF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKGludCkgKiAoZm9ybWF0LT5uZWx0cykpOwotICAgIGl0ZW1zID0gKGxvZ19mb3JtYXRfaXRlbSAqKSBmb3JtYXQtPmVsdHM7Ci0KLSAgICBvcmlnID0gcjsKLSAgICB3aGlsZSAob3JpZy0+cHJldikgewotICAgICAgICBvcmlnID0gb3JpZy0+cHJldjsKLSAgICB9Ci0gICAgd2hpbGUgKHItPm5leHQpIHsKLSAgICAgICAgciA9IHItPm5leHQ7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IGZvcm1hdC0+bmVsdHM7ICsraSkgewotICAgICAgICBzdHJzW2ldID0gcHJvY2Vzc19pdGVtKHIsIG9yaWcsICZpdGVtc1tpXSk7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IGZvcm1hdC0+bmVsdHM7ICsraSkgewotICAgICAgICBsZW4gKz0gc3RybFtpXSA9IHN0cmxlbihzdHJzW2ldKTsKLSAgICB9Ci0KLSNpZmRlZiBCVUZGRVJFRF9MT0dTCi0gICAgaWYgKGxlbiArIGNscy0+b3V0Y250ID4gTE9HX0JVRlNJWkUpIHsKLSAgICAgICAgZmx1c2hfbG9nKGNscyk7Ci0gICAgfQotICAgIGlmIChsZW4gPj0gTE9HX0JVRlNJWkUpIHsKLSAgICAgICAgc3RyID0gYXBfcGFsbG9jKHItPnBvb2wsIGxlbiArIDEpOwotICAgICAgICBmb3IgKGkgPSAwLCBzID0gc3RyOyBpIDwgZm9ybWF0LT5uZWx0czsgKytpKSB7Ci0gICAgICAgICAgICBtZW1jcHkocywgc3Ryc1tpXSwgc3RybFtpXSk7Ci0gICAgICAgICAgICBzICs9IHN0cmxbaV07Ci0gICAgICAgIH0KLSAgICAgICAgd3JpdGUoY2xzLT5sb2dfZmQsIHN0ciwgbGVuKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZvciAoaSA9IDAsIHMgPSAmY2xzLT5vdXRidWZbY2xzLT5vdXRjbnRdOyBpIDwgZm9ybWF0LT5uZWx0czsgKytpKSB7Ci0gICAgICAgICAgICBtZW1jcHkocywgc3Ryc1tpXSwgc3RybFtpXSk7Ci0gICAgICAgICAgICBzICs9IHN0cmxbaV07Ci0gICAgICAgIH0KLSAgICAgICAgY2xzLT5vdXRjbnQgKz0gbGVuOwotICAgIH0KLSNlbHNlCi0gICAgc3RyID0gYXBfcGFsbG9jKHItPnBvb2wsIGxlbiArIDEpOwotCi0gICAgZm9yIChpID0gMCwgcyA9IHN0cjsgaSA8IGZvcm1hdC0+bmVsdHM7ICsraSkgewotICAgICAgICBtZW1jcHkocywgc3Ryc1tpXSwgc3RybFtpXSk7Ci0gICAgICAgIHMgKz0gc3RybFtpXTsKLSAgICB9Ci0KLSAgICB3cml0ZShjbHMtPmxvZ19mZCwgc3RyLCBsZW4pOwotI2VuZGlmCi0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyBpbnQgbXVsdGlfbG9nX3RyYW5zYWN0aW9uKHJlcXVlc3RfcmVjICpyKQotewotICAgIG11bHRpX2xvZ19zdGF0ZSAqbWxzID0gYXBfZ2V0X21vZHVsZV9jb25maWcoci0+c2VydmVyLT5tb2R1bGVfY29uZmlnLAotCQkJCQkJJmNvbmZpZ19sb2dfbW9kdWxlKTsKLSAgICBjb25maWdfbG9nX3N0YXRlICpjbHNhcnJheTsKLSAgICBpbnQgaTsKLQotICAgIC8qCi0gICAgICogTG9nIHRoaXMgdHJhbnNhY3Rpb24uLgotICAgICAqLwotICAgIGlmIChtbHMtPmNvbmZpZ19sb2dzLT5uZWx0cykgewotICAgICAgICBjbHNhcnJheSA9IChjb25maWdfbG9nX3N0YXRlICopIG1scy0+Y29uZmlnX2xvZ3MtPmVsdHM7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBtbHMtPmNvbmZpZ19sb2dzLT5uZWx0czsgKytpKSB7Ci0gICAgICAgICAgICBjb25maWdfbG9nX3N0YXRlICpjbHMgPSAmY2xzYXJyYXlbaV07Ci0KLSAgICAgICAgICAgIGNvbmZpZ19sb2dfdHJhbnNhY3Rpb24ociwgY2xzLCBtbHMtPmRlZmF1bHRfZm9ybWF0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChtbHMtPnNlcnZlcl9jb25maWdfbG9ncykgewotICAgICAgICBjbHNhcnJheSA9IChjb25maWdfbG9nX3N0YXRlICopIG1scy0+c2VydmVyX2NvbmZpZ19sb2dzLT5lbHRzOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWxzLT5zZXJ2ZXJfY29uZmlnX2xvZ3MtPm5lbHRzOyArK2kpIHsKLSAgICAgICAgICAgIGNvbmZpZ19sb2dfc3RhdGUgKmNscyA9ICZjbHNhcnJheVtpXTsKLQotICAgICAgICAgICAgY29uZmlnX2xvZ190cmFuc2FjdGlvbihyLCBjbHMsIG1scy0+ZGVmYXVsdF9mb3JtYXQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgZ2x1ZS4uLgotICovCi0KLXN0YXRpYyB2b2lkICptYWtlX2NvbmZpZ19sb2dfc3RhdGUocG9vbCAqcCwgc2VydmVyX3JlYyAqcykKLXsKLSAgICBtdWx0aV9sb2dfc3RhdGUgKm1sczsKLQotICAgIG1scyA9IChtdWx0aV9sb2dfc3RhdGUgKikgYXBfcGFsbG9jKHAsIHNpemVvZihtdWx0aV9sb2dfc3RhdGUpKTsKLSAgICBtbHMtPmNvbmZpZ19sb2dzID0gYXBfbWFrZV9hcnJheShwLCAxLCBzaXplb2YoY29uZmlnX2xvZ19zdGF0ZSkpOwotICAgIG1scy0+ZGVmYXVsdF9mb3JtYXRfc3RyaW5nID0gTlVMTDsKLSAgICBtbHMtPmRlZmF1bHRfZm9ybWF0ID0gTlVMTDsKLSAgICBtbHMtPnNlcnZlcl9jb25maWdfbG9ncyA9IE5VTEw7Ci0gICAgbWxzLT5mb3JtYXRzID0gYXBfbWFrZV90YWJsZShwLCA0KTsKLSAgICBhcF90YWJsZV9zZXRuKG1scy0+Zm9ybWF0cywgIkNMRiIsIERFRkFVTFRfTE9HX0ZPUk1BVCk7Ci0KLSAgICByZXR1cm4gbWxzOwotfQotCi0vKgotICogVXNlIHRoZSBtZXJnZXIgdG8gc2ltcGx5IGFkZCBhIHBvaW50ZXIgZnJvbSB0aGUgdmhvc3QgbG9nIHN0YXRlCi0gKiB0byB0aGUgbG9nIG9mIGxvZ3Mgc3BlY2lmaWVkIGZvciB0aGUgbm9uLXZob3N0IGNvbmZpZ3VyYXRpb24uICBNYWtlIHN1cmUKLSAqIHZob3N0cyBpbmhlcml0IGFueSBnbG9iYWxseS1kZWZpbmVkIGZvcm1hdCBuYW1lcy4KLSAqLwotCi1zdGF0aWMgdm9pZCAqbWVyZ2VfY29uZmlnX2xvZ19zdGF0ZShwb29sICpwLCB2b2lkICpiYXNldiwgdm9pZCAqYWRkdikKLXsKLSAgICBtdWx0aV9sb2dfc3RhdGUgKmJhc2UgPSAobXVsdGlfbG9nX3N0YXRlICopIGJhc2V2OwotICAgIG11bHRpX2xvZ19zdGF0ZSAqYWRkID0gKG11bHRpX2xvZ19zdGF0ZSAqKSBhZGR2OwotCi0gICAgYWRkLT5zZXJ2ZXJfY29uZmlnX2xvZ3MgPSBiYXNlLT5jb25maWdfbG9nczsKLSAgICBpZiAoIWFkZC0+ZGVmYXVsdF9mb3JtYXQpIHsKLSAgICAgICAgYWRkLT5kZWZhdWx0X2Zvcm1hdF9zdHJpbmcgPSBiYXNlLT5kZWZhdWx0X2Zvcm1hdF9zdHJpbmc7Ci0gICAgICAgIGFkZC0+ZGVmYXVsdF9mb3JtYXQgPSBiYXNlLT5kZWZhdWx0X2Zvcm1hdDsKLSAgICB9Ci0gICAgYWRkLT5mb3JtYXRzID0gYXBfb3ZlcmxheV90YWJsZXMocCwgYmFzZS0+Zm9ybWF0cywgYWRkLT5mb3JtYXRzKTsKLQotICAgIHJldHVybiBhZGQ7Ci19Ci0KLS8qCi0gKiBTZXQgdGhlIGRlZmF1bHQgbG9nZmlsZSBmb3JtYXQsIG9yIGRlZmluZSBhIG5pY2tuYW1lIGZvciBhIGZvcm1hdCBzdHJpbmcuCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpsb2dfZm9ybWF0KGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqZm10LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqbmFtZSkKLXsKLSAgICBjb25zdCBjaGFyICplcnJfc3RyaW5nID0gTlVMTDsKLSAgICBtdWx0aV9sb2dfc3RhdGUgKm1scyA9IGFwX2dldF9tb2R1bGVfY29uZmlnKGNtZC0+c2VydmVyLT5tb2R1bGVfY29uZmlnLAotCQkJCQkJJmNvbmZpZ19sb2dfbW9kdWxlKTsKLQotICAgIC8qCi0gICAgICogSWYgd2Ugd2VyZSBnaXZlbiB0d28gYXJndW1lbnRzLCB0aGUgc2Vjb25kIGlzIGEgbmFtZSB0byBiZSBnaXZlbiB0byB0aGUKLSAgICAgKiBmb3JtYXQuICBUaGlzIHN5bnRheCBqdXN0IGRlZmluZXMgdGhlIG5pY2tuYW1lIC0gaXQgZG9lc24ndCBhY3R1YWxseQotICAgICAqIG1ha2UgdGhlIGZvcm1hdCB0aGUgZGVmYXVsdC4KLSAgICAgKi8KLSAgICBpZiAobmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgIHBhcnNlX2xvZ19zdHJpbmcoY21kLT5wb29sLCBmbXQsICZlcnJfc3RyaW5nKTsKLSAgICAgICAgaWYgKGVycl9zdHJpbmcgPT0gTlVMTCkgewotICAgICAgICAgICAgYXBfdGFibGVfc2V0bihtbHMtPmZvcm1hdHMsIG5hbWUsIGZtdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIG1scy0+ZGVmYXVsdF9mb3JtYXRfc3RyaW5nID0gZm10OwotICAgICAgICBtbHMtPmRlZmF1bHRfZm9ybWF0ID0gcGFyc2VfbG9nX3N0cmluZyhjbWQtPnBvb2wsIGZtdCwgJmVycl9zdHJpbmcpOwotICAgIH0KLSAgICByZXR1cm4gZXJyX3N0cmluZzsKLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqYWRkX2N1c3RvbV9sb2coY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICpmbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmbXQsIGNoYXIgKmVudmNsYXVzZSkKLXsKLSAgICBjb25zdCBjaGFyICplcnJfc3RyaW5nID0gTlVMTDsKLSAgICBtdWx0aV9sb2dfc3RhdGUgKm1scyA9IGFwX2dldF9tb2R1bGVfY29uZmlnKGNtZC0+c2VydmVyLT5tb2R1bGVfY29uZmlnLAotCQkJCQkJJmNvbmZpZ19sb2dfbW9kdWxlKTsKLSAgICBjb25maWdfbG9nX3N0YXRlICpjbHM7Ci0KLSAgICBjbHMgPSAoY29uZmlnX2xvZ19zdGF0ZSAqKSBhcF9wdXNoX2FycmF5KG1scy0+Y29uZmlnX2xvZ3MpOwotICAgIGNscy0+Y29uZGl0aW9uX3ZhciA9IE5VTEw7Ci0gICAgaWYgKGVudmNsYXVzZSAhPSBOVUxMKSB7Ci0JaWYgKHN0cm5jYXNlY21wKGVudmNsYXVzZSwgImVudj0iLCA0KSAhPSAwKSB7Ci0JICAgIHJldHVybiAiZXJyb3IgaW4gY29uZGl0aW9uIGNsYXVzZSI7Ci0JfQotCWlmICgoZW52Y2xhdXNlWzRdID09ICdcMCcpCi0JICAgIHx8ICgoZW52Y2xhdXNlWzRdID09ICchJykgJiYgKGVudmNsYXVzZVs1XSA9PSAnXDAnKSkpIHsKLQkgICAgcmV0dXJuICJtaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUiOwotCX0KLQljbHMtPmNvbmRpdGlvbl92YXIgPSBhcF9wc3RyZHVwKGNtZC0+cG9vbCwgJmVudmNsYXVzZVs0XSk7Ci0gICAgfQotCi0gICAgY2xzLT5mbmFtZSA9IGZuOwotICAgIGNscy0+Zm9ybWF0X3N0cmluZyA9IGZtdDsKLSAgICBpZiAoZm10ID09IE5VTEwpIHsKLSAgICAgICAgY2xzLT5mb3JtYXQgPSBOVUxMOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgY2xzLT5mb3JtYXQgPSBwYXJzZV9sb2dfc3RyaW5nKGNtZC0+cG9vbCwgZm10LCAmZXJyX3N0cmluZyk7Ci0gICAgfQotICAgIGNscy0+bG9nX2ZkID0gLTE7Ci0KLSAgICByZXR1cm4gZXJyX3N0cmluZzsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF90cmFuc2Zlcl9sb2coY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICpmbikKLXsKLSAgICByZXR1cm4gYWRkX2N1c3RvbV9sb2coY21kLCBkdW1teSwgZm4sIE5VTEwsIE5VTEwpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2Nvb2tpZV9sb2coY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICpmbikKLXsKLSAgICByZXR1cm4gYWRkX2N1c3RvbV9sb2coY21kLCBkdW1teSwgZm4sICIle0Nvb2tpZX1uIFwiJXJcIiAldCIsIE5VTEwpOwotfQotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgY29uZmlnX2xvZ19jbWRzW10gPQotewotICAgIHsiQ3VzdG9tTG9nIiwgYWRkX2N1c3RvbV9sb2csIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTIzLAotICAgICAiYSBmaWxlIG5hbWUsIGEgY3VzdG9tIGxvZyBmb3JtYXQgc3RyaW5nIG9yIGZvcm1hdCBuYW1lLCAiCi0gICAgICJhbmQgYW4gb3B0aW9uYWwgXCJlbnY9XCIgY2xhdXNlIChzZWUgZG9jcykifSwKLSAgICB7IlRyYW5zZmVyTG9nIiwgc2V0X3RyYW5zZmVyX2xvZywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAgInRoZSBmaWxlbmFtZSBvZiB0aGUgYWNjZXNzIGxvZyJ9LAotICAgIHsiTG9nRm9ybWF0IiwgbG9nX2Zvcm1hdCwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMTIsCi0gICAgICJhIGxvZyBmb3JtYXQgc3RyaW5nIChzZWUgZG9jcykgYW5kIGFuIG9wdGlvbmFsIGZvcm1hdCBuYW1lIn0sCi0gICAgeyJDb29raWVMb2ciLCBzZXRfY29va2llX2xvZywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAgInRoZSBmaWxlbmFtZSBvZiB0aGUgY29va2llIGxvZyJ9LAotICAgIHtOVUxMfQotfTsKLQotc3RhdGljIGNvbmZpZ19sb2dfc3RhdGUgKm9wZW5fY29uZmlnX2xvZyhzZXJ2ZXJfcmVjICpzLCBwb29sICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfbG9nX3N0YXRlICpjbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X2hlYWRlciAqZGVmYXVsdF9mb3JtYXQpCi17Ci0gICAgaWYgKGNscy0+bG9nX2ZkID4gMCkgewotICAgICAgICByZXR1cm4gY2xzOyAgICAgICAgICAgICAvKiB2aXJ0dWFsIGNvbmZpZyBzaGFyZWQgdy9tYWluIHNlcnZlciAqLwotICAgIH0KLQotICAgIGlmIChjbHMtPmZuYW1lID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGNsczsgICAgICAgICAgICAgLyogTGVhdmUgaXQgTlVMTCB0byBkZWNsaW5lLiAgKi8KLSAgICB9Ci0KLSAgICBpZiAoKmNscy0+Zm5hbWUgPT0gJ3wnKSB7Ci0gICAgICAgIHBpcGVkX2xvZyAqcGw7Ci0KLSAgICAgICAgcGwgPSBhcF9vcGVuX3BpcGVkX2xvZyhwLCBjbHMtPmZuYW1lICsgMSk7Ci0gICAgICAgIGlmIChwbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgICAgIGNscy0+bG9nX2ZkID0gYXBfcGlwZWRfbG9nX3dyaXRlX2ZkKHBsKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGNoYXIgKmZuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocCwgY2xzLT5mbmFtZSk7Ci0gICAgICAgIGlmICgoY2xzLT5sb2dfZmQgPSBhcF9wb3BlbmYocCwgZm5hbWUsIHhmZXJfZmxhZ3MsIHhmZXJfbW9kZSkpIDwgMCkgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IG9wZW4gdHJhbnNmZXIgbG9nIGZpbGUgJXMuIiwgZm5hbWUpOwotICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgIH0KLSNpZmRlZiBCVUZGRVJFRF9MT0dTCi0gICAgY2xzLT5vdXRjbnQgPSAwOwotI2VuZGlmCi0KLSAgICByZXR1cm4gY2xzOwotfQotCi1zdGF0aWMgY29uZmlnX2xvZ19zdGF0ZSAqb3Blbl9tdWx0aV9sb2dzKHNlcnZlcl9yZWMgKnMsIHBvb2wgKnApCi17Ci0gICAgaW50IGk7Ci0gICAgbXVsdGlfbG9nX3N0YXRlICptbHMgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZ19sb2dfbW9kdWxlKTsKLSAgICBjb25maWdfbG9nX3N0YXRlICpjbHNhcnJheTsKLSAgICBjb25zdCBjaGFyICpkdW1teTsKLSAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0KLSAgICBpZiAobWxzLT5kZWZhdWx0X2Zvcm1hdF9zdHJpbmcpIHsKLQlmb3JtYXQgPSBhcF90YWJsZV9nZXQobWxzLT5mb3JtYXRzLCBtbHMtPmRlZmF1bHRfZm9ybWF0X3N0cmluZyk7Ci0JaWYgKGZvcm1hdCkgewotCSAgICBtbHMtPmRlZmF1bHRfZm9ybWF0ID0gcGFyc2VfbG9nX3N0cmluZyhwLCBmb3JtYXQsICZkdW1teSk7Ci0JfQotICAgIH0gICAgCi0KLSAgICBpZiAoIW1scy0+ZGVmYXVsdF9mb3JtYXQpIHsKLSAgICAgICAgbWxzLT5kZWZhdWx0X2Zvcm1hdCA9IHBhcnNlX2xvZ19zdHJpbmcocCwgREVGQVVMVF9MT0dfRk9STUFULCAmZHVtbXkpOwotICAgIH0KLQotICAgIGlmIChtbHMtPmNvbmZpZ19sb2dzLT5uZWx0cykgewotICAgICAgICBjbHNhcnJheSA9IChjb25maWdfbG9nX3N0YXRlICopIG1scy0+Y29uZmlnX2xvZ3MtPmVsdHM7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBtbHMtPmNvbmZpZ19sb2dzLT5uZWx0czsgKytpKSB7Ci0gICAgICAgICAgICBjb25maWdfbG9nX3N0YXRlICpjbHMgPSAmY2xzYXJyYXlbaV07Ci0KLQkgICAgaWYgKGNscy0+Zm9ybWF0X3N0cmluZykgewotCQlmb3JtYXQgPSBhcF90YWJsZV9nZXQobWxzLT5mb3JtYXRzLCBjbHMtPmZvcm1hdF9zdHJpbmcpOwotCQlpZiAoZm9ybWF0KSB7Ci0JCSAgICBjbHMtPmZvcm1hdCA9IHBhcnNlX2xvZ19zdHJpbmcocCwgZm9ybWF0LCAmZHVtbXkpOwotCQl9Ci0JICAgIH0KLQotICAgICAgICAgICAgY2xzID0gb3Blbl9jb25maWdfbG9nKHMsIHAsIGNscywgbWxzLT5kZWZhdWx0X2Zvcm1hdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAobWxzLT5zZXJ2ZXJfY29uZmlnX2xvZ3MpIHsKLSAgICAgICAgY2xzYXJyYXkgPSAoY29uZmlnX2xvZ19zdGF0ZSAqKSBtbHMtPnNlcnZlcl9jb25maWdfbG9ncy0+ZWx0czsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG1scy0+c2VydmVyX2NvbmZpZ19sb2dzLT5uZWx0czsgKytpKSB7Ci0gICAgICAgICAgICBjb25maWdfbG9nX3N0YXRlICpjbHMgPSAmY2xzYXJyYXlbaV07Ci0KLQkgICAgaWYgKGNscy0+Zm9ybWF0X3N0cmluZykgewotCQlmb3JtYXQgPSBhcF90YWJsZV9nZXQobWxzLT5mb3JtYXRzLCBjbHMtPmZvcm1hdF9zdHJpbmcpOwotCQlpZiAoZm9ybWF0KSB7Ci0JCSAgICBjbHMtPmZvcm1hdCA9IHBhcnNlX2xvZ19zdHJpbmcocCwgZm9ybWF0LCAmZHVtbXkpOwotCQl9Ci0JICAgIH0KLQotICAgICAgICAgICAgY2xzID0gb3Blbl9jb25maWdfbG9nKHMsIHAsIGNscywgbWxzLT5kZWZhdWx0X2Zvcm1hdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgaW5pdF9jb25maWdfbG9nKHNlcnZlcl9yZWMgKnMsIHBvb2wgKnApCi17Ci0gICAgLyogRmlyc3QsIGRvICJwaHlzaWNhbCIgc2VydmVyLCB3aGljaCBnZXRzIGRlZmF1bHQgbG9nIGZkIGFuZCBmb3JtYXQKLSAgICAgKiBmb3IgdGhlIHZpcnR1YWwgc2VydmVycywgaWYgdGhleSBkb24ndCBvdmVycmlkZS4uLgotICAgICAqLwotCi0gICAgb3Blbl9tdWx0aV9sb2dzKHMsIHApOwotCi0gICAgLyogVGhlbiwgdmlydHVhbCBzZXJ2ZXJzICovCi0KLSAgICBmb3IgKHMgPSBzLT5uZXh0OyBzOyBzID0gcy0+bmV4dCkgewotICAgICAgICBvcGVuX211bHRpX2xvZ3MocywgcCk7Ci0gICAgfQotfQotCi0jaWZkZWYgQlVGRkVSRURfTE9HUwotc3RhdGljIHZvaWQgZmx1c2hfYWxsX2xvZ3Moc2VydmVyX3JlYyAqcywgcG9vbCAqcCkKLXsKLSAgICBtdWx0aV9sb2dfc3RhdGUgKm1sczsKLSAgICBhcnJheV9oZWFkZXIgKmxvZ19saXN0OwotICAgIGNvbmZpZ19sb2dfc3RhdGUgKmNsc2FycmF5OwotICAgIGludCBpOwotCi0gICAgZm9yICg7IHM7IHMgPSBzLT5uZXh0KSB7Ci0gICAgICAgIG1scyA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsICZjb25maWdfbG9nX21vZHVsZSk7Ci0gICAgICAgIGxvZ19saXN0ID0gTlVMTDsKLSAgICAgICAgaWYgKG1scy0+Y29uZmlnX2xvZ3MtPm5lbHRzKSB7Ci0gICAgICAgICAgICBsb2dfbGlzdCA9IG1scy0+Y29uZmlnX2xvZ3M7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWxzLT5zZXJ2ZXJfY29uZmlnX2xvZ3MpIHsKLSAgICAgICAgICAgIGxvZ19saXN0ID0gbWxzLT5zZXJ2ZXJfY29uZmlnX2xvZ3M7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvZ19saXN0KSB7Ci0gICAgICAgICAgICBjbHNhcnJheSA9IChjb25maWdfbG9nX3N0YXRlICopIGxvZ19saXN0LT5lbHRzOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxvZ19saXN0LT5uZWx0czsgKytpKSB7Ci0gICAgICAgICAgICAgICAgZmx1c2hfbG9nKCZjbHNhcnJheVtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0jZW5kaWYKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGNvbmZpZ19sb2dfbW9kdWxlID0KLXsKLSAgICBTVEFOREFSRF9NT0RVTEVfU1RVRkYsCi0gICAgaW5pdF9jb25maWdfbG9nLCAgICAgICAgICAgIC8qIGluaXRpYWxpemVyICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBwZXItZGlyIGNvbmZpZyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBtZXJnZSBwZXItZGlyIGNvbmZpZyAqLwotICAgIG1ha2VfY29uZmlnX2xvZ19zdGF0ZSwgICAgICAvKiBzZXJ2ZXIgY29uZmlnICovCi0gICAgbWVyZ2VfY29uZmlnX2xvZ19zdGF0ZSwgICAgIC8qIG1lcmdlIHNlcnZlciBjb25maWcgKi8KLSAgICBjb25maWdfbG9nX2NtZHMsICAgICAgICAgICAgLyogY29tbWFuZCB0YWJsZSAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBoYW5kbGVycyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxlbmFtZSB0cmFuc2xhdGlvbiAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVja191c2VyX2lkICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGF1dGggKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgYWNjZXNzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHR5cGVfY2hlY2tlciAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXh1cHMgKi8KLSAgICBtdWx0aV9sb2dfdHJhbnNhY3Rpb24sICAgICAgLyogbG9nZ2VyICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGhlYWRlciBwYXJzZXIgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hpbGRfaW5pdCAqLwotI2lmZGVmIEJVRkZFUkVEX0xPR1MKLSAgICBmbHVzaF9hbGxfbG9ncywgICAgICAgICAgICAgLyogY2hpbGRfZXhpdCAqLwotI2Vsc2UKLSAgICBOVUxMLAotI2VuZGlmCi0gICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvc3QgcmVhZC1yZXF1ZXN0ICovCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9sb2dnZXJzL21vZF9sb2dfY29uZmlnLmRzcCBiL21vZHVsZXMvbG9nZ2Vycy9tb2RfbG9nX2NvbmZpZy5kc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNDNkYWIuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9sb2dnZXJzL21vZF9sb2dfY29uZmlnLmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9Im1vZF9sb2dfY29uZmlnIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDIKLQotQ0ZHPW1vZF9sb2dfY29uZmlnIC0gV2luMzIgUmVsZWFzZQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJtb2RfbG9nX2NvbmZpZy5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIm1vZF9sb2dfY29uZmlnLm1hayIgQ0ZHPSJtb2RfbG9nX2NvbmZpZyAtIFdpbjMyIFJlbGVhc2UiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAibW9kX2xvZ19jb25maWcgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFICJtb2RfbG9nX2NvbmZpZyAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwCi0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotTVRMPW1pZGwuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9sb2dfY29uZmlnIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvSSAiLi4vLi4vaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHIvaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHItdXRpbC9pbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0ZkIlJlbGVhc2VcbW9kX2xvZ19jb25maWciIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvbWFjaGluZTpJMzg2IC9vdXQ6IlJlbGVhc2UvbW9kX2xvZ19jb25maWcuc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX2xvZ19jb25maWcKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9tYWNoaW5lOkkzODYgL291dDoiUmVsZWFzZS9tb2RfbG9nX2NvbmZpZy5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfbG9nX2NvbmZpZwotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibW9kX2xvZ19jb25maWcgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aaSAvT2QgL0kgIi4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9GZCJEZWJ1Z1xtb2RfbG9nX2NvbmZpZyIgL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvaW5jcmVtZW50YWw6bm8gL21hcCAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJEZWJ1Zy9tb2RfbG9nX2NvbmZpZy5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfbG9nX2NvbmZpZwotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9pbmNyZW1lbnRhbDpubyAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6IkRlYnVnL21vZF9sb2dfY29uZmlnLnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF9sb2dfY29uZmlnCi0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJtb2RfbG9nX2NvbmZpZyAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgIm1vZF9sb2dfY29uZmlnIC0gV2luMzIgRGVidWciCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZF9sb2dfY29uZmlnLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZF9sb2dfY29uZmlnLnJjCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9sb2dfY29uZmlnIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBDcmVhdGluZyBWZXJzaW9uIFJlc291cmNlCi1JbnB1dFBhdGg9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSIuXG1vZF9sb2dfY29uZmlnLnJjIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCWF3ayAtZiAuLi8uLi9idWlsZC93aW4zMi93aW4zMnZlci5hd2sgbW9kX2xvZ19jb25maWcgICJsb2dfY29uZmlnX21vZHVsZSBmb3IgQXBhY2hlIiAuLi8uLi9pbmNsdWRlL2FwX3JlbGVhc2UuaCA+IC5cbW9kX2xvZ19jb25maWcucmMKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJtb2RfbG9nX2NvbmZpZyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIENyZWF0aW5nIFZlcnNpb24gUmVzb3VyY2UKLUlucHV0UGF0aD0uLlwuLlxidWlsZFx3aW4zMlx3aW4zMnZlci5hd2sKLQotIi5cbW9kX2xvZ19jb25maWcucmMiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JYXdrIC1mIC4uLy4uL2J1aWxkL3dpbjMyL3dpbjMydmVyLmF3ayBtb2RfbG9nX2NvbmZpZyAgImxvZ19jb25maWdfbW9kdWxlIGZvciBBcGFjaGUiIC4uLy4uL2luY2x1ZGUvYXBfcmVsZWFzZS5oID4gLlxtb2RfbG9nX2NvbmZpZy5yYwotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9tb2R1bGVzL2xvZ2dlcnMvbW9kX2xvZ19jb25maWcuZXhwIGIvbW9kdWxlcy9sb2dnZXJzL21vZF9sb2dfY29uZmlnLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFiOTI2Zi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2xvZ2dlcnMvbW9kX2xvZ19jb25maWcuZXhwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotY29uZmlnX2xvZ19tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvbG9nZ2Vycy9tb2RfbG9nX2NvbmZpZy5oIGIvbW9kdWxlcy9sb2dnZXJzL21vZF9sb2dfY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMDQwOWYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9sb2dnZXJzL21vZF9sb2dfY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotI2luY2x1ZGUgImFwcl9vcHRpb25hbC5oIgotI2luY2x1ZGUgImh0dHBkLmgiCi0KLSNpZm5kZWYgX01PRF9MT0dfQ09ORklHX0gKLSNkZWZpbmUgX01PRF9MT0dfQ09ORklHX0ggMQotCi10eXBlZGVmIGNvbnN0IGNoYXIgKmFwX2xvZ19oYW5kbGVyX2ZuX3QocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmEpOwotCi10eXBlZGVmIHN0cnVjdCBhcF9sb2dfaGFuZGxlciB7Ci0gICAgYXBfbG9nX2hhbmRsZXJfZm5fdCAqZnVuYzsKLSAgICBpbnQgd2FudF9vcmlnX2RlZmF1bHQ7Ci19IGFwX2xvZ19oYW5kbGVyOwotCi1BUFJfREVDTEFSRV9PUFRJT05BTF9GTih2b2lkLCBhcF9yZWdpc3Rlcl9sb2dfaGFuZGxlciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAoYXByX3Bvb2xfdCAqcCwgY2hhciAqdGFnLCBhcF9sb2dfaGFuZGxlcl9mbl90ICpmdW5jLCBpbnQgZGVmKSk7Ci0KLSNlbmRpZiAvKiBNT0RfTE9HX0NPTkZJRyAqLwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tYXBwZXJzLy5jdnNpZ25vcmUgYi9tb2R1bGVzL21hcHBlcnMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJmN2E3MC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21hcHBlcnMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS5kZXBzCi0ubGlicwotKi5sYQotbW9kdWxlcy5tawotTWFrZWZpbGUKLSoubG8KLSouc2xvCi0qLnNvCi0qLmRsbAotKi5kZWYKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWFwcGVycy8uaW5kZW50LnBybyBiL21vZHVsZXMvbWFwcGVycy8uaW5kZW50LnBybwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlmYmU5Zi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21hcHBlcnMvLmluZGVudC5wcm8KKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0taTQgLW5wc2wgLWRpMCAtYnIgLW5jZSAtZDAgLWNsaTAgLW5wY3MgLW5mYzEKLS1UQlVGRgotLVRGSUxFCi0tVFRSQU5TCi0tVFVJTlQ0Ci0tVF90cmFucwotLVRhbGxvd19vcHRpb25zX3QKLS1UYXBhY2hlX3NmaW8KLS1UYXJyYXlfaGVhZGVyCi0tVGJvb2xfaW50Ci0tVGJ1Zl9hcmVhCi0tVGJ1ZmZfc3RydWN0Ci0tVGJ1ZmZ5Ci0tVGNtZF9ob3cKLS1UY21kX3Bhcm1zCi0tVGNvbW1hbmRfcmVjCi0tVGNvbW1hbmRfc3RydWN0Ci0tVGNvbm5fcmVjCi0tVGNvcmVfZGlyX2NvbmZpZwotLVRjb3JlX3NlcnZlcl9jb25maWcKLS1UZGlyX21ha2VyX2Z1bmMKLS1UZXZlbnQKLS1UZ2xvYmFsc19zCi0tVGhhbmRsZXJfZnVuYwotLVRoYW5kbGVyX3JlYwotLVRqb2JsaXN0X3MKLS1UbGlzdGVuX3JlYwotLVRtZXJnZXJfZnVuYwotLVRtb2RlX3QKLS1UbW9kdWxlCi0tVG1vZHVsZV9zdHJ1Y3QKLS1UbXV0ZXgKLS1Ubl9sb25nCi0tVG90aGVyX2NoaWxkX3JlYwotLVRvdmVycmlkZXNfdAotLVRwYXJlbnRfc2NvcmUKLS1UcGlkX3QKLS1UcGlwZWRfbG9nCi0tVHBvb2wKLS1UcmVxdWVzdF9yZWMKLS1UcmVxdWlyZV9saW5lCi0tVHJsaW1fdAotLVRzY29yZWJvYXJkCi0tVHNlbWFwaG9yZQotLVRzZXJ2ZXJfYWRkcl9yZWMKLS1Uc2VydmVyX3JlYwotLVRzZXJ2ZXJfcmVjX2NoYWluCi0tVHNob3J0X3Njb3JlCi0tVHRhYmxlCi0tVHRhYmxlX2VudHJ5Ci0tVHRocmVhZAotLVR1X3dpZGVfaW50Ci0tVHZ0aW1lX3QKLS1Ud2lkZV9pbnQKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWFwcGVycy9NYWtlZmlsZS5pbiBiL21vZHVsZXMvbWFwcGVycy9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY3YjM0My4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21hcHBlcnMvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotaW5jbHVkZSAkKHRvcF9zcmNkaXIpL2J1aWxkL3NwZWNpYWwubWsKLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tYXBwZXJzL05XR05VbWFrZWZpbGUgYi9tb2R1bGVzL21hcHBlcnMvTldHTlVtYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJjOTYyNC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21hcHBlcnMvTldHTlVtYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0jCi0jIERlY2xhcmUgdGhlIHN1Yi1kaXJlY3RvcmllcyB0byBiZSBidWlsdCBoZXJlCi0jCi0KLVNVQkRJUlMgPSBcCi0JJChFT0xJU1QpIAotCi0jCi0jIEdldCB0aGUgJ2hlYWQnIG9mIHRoZSBidWlsZCBlbnZpcm9ubWVudC4gIFRoaXMgaW5jbHVkZXMgZGVmYXVsdCB0YXJnZXRzIGFuZAotIyBwYXRocyB0byB0b29scwotIwotCi1pbmNsdWRlICQoQVBfV09SSylcYnVpbGRcTldHTlVoZWFkLmluYwotCi0jCi0jIGJ1aWxkIHRoaXMgbGV2ZWwncyBmaWxlcwotCi0jCi0jIE1ha2Ugc3VyZSBhbGwgbmVlZGVkIG1hY3JvJ3MgYXJlIGRlZmluZWQKLSMKLQotIwotIyBUaGVzZSBkaXJlY3RvcmllcyB3aWxsIGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGluY2x1ZGUgbGlzdCwgZm9sbG93ZWQgYnkKLSMgSU5DRElSUwotIwotWElOQ0RJUlMJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZmxhZ3Mgd2lsbCBjb21lIGFmdGVyIENGTEFHUwotIwotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZGVmaW5lcyB3aWxsIGNvbWUgYWZ0ZXIgREVGSU5FUwotIwotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZmxhZ3Mgd2lsbCBiZSBhZGRlZCB0byB0aGUgbGluay5vcHQgZmlsZQotIwotWExGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgdmFsdWVzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGNvcnJlY3QgdmFyaWFibGVzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZgotIyBSRUxFQVNFCi0jCi1pZmVxICIkKFJFTEVBU0UpIiAiZGVidWciCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCSAgIAkkKEVPTElTVCkKLWVuZGlmCi0KLWlmZXEgIiQoUkVMRUFTRSkiICJub29wdCIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJICAgCSQoRU9MSVNUKQotZW5kaWYKLQotaWZlcSAiJChSRUxFQVNFKSIgInJlbGVhc2UiCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLWVuZGlmCi0KLSMKLSMgVGhlc2UgYXJlIHVzZWQgYnkgdGhlIGxpbmsgdGFyZ2V0IGlmIGFuIE5MTSBpcyBiZWluZyBnZW5lcmF0ZWQKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rICduYW1lJyBkaXJlY3RpdmUgdG8gbmFtZSB0aGUgbmxtLiAgSWYgbGVmdCBibGFuawotIyBUQVJHRVRfbmxtIChzZWUgYmVsb3cpIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9OQU1FCQk9Ci0KLSMKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rICctZGVzYyAnIGRpcmVjdGl2ZS4gCi0jIElmIGxlZnQgYmxhbmssIE5MTV9OQU1FIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9ERVNDUklQVElPTgk9Ci0KLSMKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSAnLXRocmVhZG5hbWUnIGRpcmVjdGl2ZS4gIElmIGxlZnQgYmxhbmssCi0jIE5MTV9OQU1FIFRocmVhZCB3aWxsIGJlIHVzZWQuCi0jCi1OTE1fVEhSRUFEX05BTUUJPQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlIFZFUlNJT04gdmFsdWUgaW4gCi0jICQoQVBfV09SSylcYnVpbGRcTldHTlVlbnZpcm9ubWVudC5pbmMKLSMKLU5MTV9WRVJTSU9OCQk9Ci0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgb2YgNjRLCi0jCi1OTE1fU1RBQ0tfU0laRQk9Ci0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1lbnRyeScgZGlyZWN0aXZlCi0jCi1OTE1fRU5UUllfU1lNCT0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1leGl0JyBkaXJlY3RpdmUKLSMKLU5MTV9FWElUX1NZTQk9Ci0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctY2hlY2snIGRpcmVjdGl2ZQotIwotTkxNX0NIRUNLX1NZTQk9Ci0KLSMKLSMgSWYgdGhlc2UgYXJlIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1mbGFncycgZGlyZWN0aXZlCi0jCi1OTE1fRkxBR1MJCT0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIGxpbmtlZCBpbiB3aXRoIHRoZSBYRENEYXRhIG9wdGlvbiBpbiB0aGUgZGVmIAotIyBmaWxlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb2YgJChOV09TKS9hcGFjaGUueGRjLiAgWERDRGF0YSBjYW4gYmUgZGlzYWJsZWQKLSMgYnkgc2V0dGluZyBBUEFDSEVfVU5JUFJPQyBpbiB0aGUgZW52aXJvbm1lbnQKLSMKLVhEQ0RBVEEgICAgICAgICA9IAotCi0jCi0jIElmIHRoZXJlIGlzIGFuIE5MTSB0YXJnZXQsIHB1dCBpdCBoZXJlCi0jCi1UQVJHRVRfbmxtID0gXAotCSQoT0JKRElSKS9yZXdyaXRlLm5sbSBcCi0JJChPQkpESVIpL3NwZWxpbmcubmxtIFwKLQkkKE9CSkRJUikvdmhvc3QubmxtIFwKLQkkKEVPTElTVCkKLQotIwotIyBJZiB0aGVyZSBpcyBhbiBMSUIgdGFyZ2V0LCBwdXQgaXQgaGVyZQotIwotVEFSR0VUX2xpYiA9IFwKLQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBhcmUgdGhlIE9CSiBmaWxlcyBuZWVkZWQgdG8gY3JlYXRlIHRoZSBOTE0gdGFyZ2V0IGFib3ZlLgotIyBQYXRocyBtdXN0IGFsbCB1c2UgdGhlICcvJyBjaGFyYWN0ZXIKLSMKLUZJTEVTX25sbV9vYmpzID0gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgTElCIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIE5MTSB0YXJnZXQgYWJvdmUuCi0jIFRoZXNlIHdpbGwgYmUgYWRkZWQgYXMgYSBsaWJyYXJ5IGNvbW1hbmQgaW4gdGhlIGxpbmsub3B0IGZpbGUuCi0jCi1GSUxFU19ubG1fbGlicyA9IFwKLQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBhcmUgdGhlIG1vZHVsZXMgdGhhdCB0aGUgYWJvdmUgTkxNIHRhcmdldCBkZXBlbmRzIG9uIHRvIGxvYWQuCi0jIFRoZXNlIHdpbGwgYmUgYWRkZWQgYXMgYSBtb2R1bGUgY29tbWFuZCBpbiB0aGUgbGluay5vcHQgZmlsZS4KLSMKLUZJTEVTX25sbV9tb2R1bGVzID0gXAotCSQoRU9MSVNUKQotCi0jCi0jIElmIHRoZSBubG0gaGFzIGEgbXNnIGZpbGUsIHB1dCBpdCdzIHBhdGggaGVyZQotIwotRklMRV9ubG1fbXNnID0KLSAKLSMKLSMgSWYgdGhlIG5sbSBoYXMgYSBobHAgZmlsZSBwdXQgaXQncyBwYXRoIGhlcmUKLSMKLUZJTEVfbmxtX2hscCA9Ci0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgJChOV09TKVxjb3B5cmlnaHQudHh0LgotIwotRklMRV9ubG1fY29weXJpZ2h0ID0KLQotIwotIyBBbnkgYWRkaXRpb25hbCBpbXBvcnRzIGdvIGhlcmUKLSMKLUZJTEVTX25sbV9YaW1wb3J0cyA9IFwKLQkkKEVPTElTVCkKLSAKLSMgICAKLSMgQW55IHN5bWJvbHMgZXhwb3J0ZWQgdG8gaGVyZQotIwotRklMRVNfbmxtX2V4cG9ydHMgPSBcCi0JJChFT0xJU1QpCi0JCi0jICAgCi0jIFRoZXNlIGFyZSB0aGUgT0JKIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIExJQiB0YXJnZXQgYWJvdmUuCi0jIFBhdGhzIG11c3QgYWxsIHVzZSB0aGUgJy8nIGNoYXJhY3RlcgotIwotRklMRVNfbGliX29ianMgPSBcCi0JCSQoRU9MSVNUKQotCi0jCi0jIGltcGxlbWVudCB0YXJnZXRzIGFuZCBkZXBlbmRhbmNpZXMgKGxlYXZlIHRoaXMgc2VjdGlvbiBhbG9uZSkKLSMKLQotbGlicyA6OiAkKE9CSkRJUikgJChUQVJHRVRfbGliKQotCi1ubG1zIDo6IGxpYnMgJChUQVJHRVRfbmxtKQotCi0jCi0jIFVwZGF0ZWQgdGhpcyB0YXJnZXQgdG8gY3JlYXRlIG5lY2Vzc2FyeSBkaXJlY3RvcmllcyBhbmQgY29weSBmaWxlcyB0byB0aGUgCi0jIGNvcnJlY3QgcGxhY2UuICAoU2VlICQoQVBfV09SSylcYnVpbGRcTldHTlVoZWFkLmluYyBmb3IgZXhhbXBsZXMpCi0jCi1pbnN0YWxsIDo6IG5sbXMgRk9SQ0UKLQljb3B5ICQoT0JKRElSKVwqLm5sbSAkKElOU1RBTEwpXEFwYWNoZTJcbW9kdWxlc1wqLioKLQotIwotIyBBbnkgc3BlY2lhbGl6ZWQgcnVsZXMgaGVyZQotIwotCi0jCi0jIEluY2x1ZGUgdGhlICd0YWlsJyBtYWtlZmlsZSB0aGF0IGhhcyB0YXJnZXRzIHRoYXQgZGVwZW5kIG9uIHZhcmlhYmxlcyBkZWZpbmVkCi0jIGluIHRoaXMgbWFrZWZpbGUKLSMKLQotaW5jbHVkZSAkKEFQX1dPUkspXGJ1aWxkXE5XR05VdGFpbC5pbmMKLQotCmRpZmYgLS1naXQgYS9tb2R1bGVzL21hcHBlcnMvTldHTlVyZXdyaXRlIGIvbW9kdWxlcy9tYXBwZXJzL05XR05VcmV3cml0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU4YjIxZi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21hcHBlcnMvTldHTlVyZXdyaXRlCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLSMKLSMgTWFrZSBzdXJlIGFsbCBuZWVkZWQgbWFjcm8ncyBhcmUgZGVmaW5lZAotIwotCi0jCi0jIEdldCB0aGUgJ2hlYWQnIG9mIHRoZSBidWlsZCBlbnZpcm9ubWVudCBpZiBuZWNlc3NhcnkuICBUaGlzIGluY2x1ZGVzIGRlZmF1bHQKLSMgdGFyZ2V0cyBhbmQgcGF0aHMgdG8gdG9vbHMKLSMKLQotaWZuZGVmIEVudmlyb25tZW50RGVmaW5lZAotaW5jbHVkZSAkKEFQX1dPUkspXGJ1aWxkXE5XR05VaGVhZC5pbmMKLWVuZGlmCi0KLSMKLSMgVGhlc2UgZGlyZWN0b3JpZXMgd2lsbCBiZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbmNsdWRlIGxpc3QsIGZvbGxvd2VkIGJ5Ci0jIElOQ0RJUlMKLSMKLVhJTkNESVJTCSs9IFwKLQkJCSQoQVBfV09SSykvaW5jbHVkZSBcCi0JCQkkKE5XT1MpIFwKLQkJCSQoQVBfV09SSykvbW9kdWxlcy9hcmNoL25ldHdhcmUgXAotCQkJJChBUF9XT1JLKS9zcmNsaWIvYXByL2luY2x1ZGUgXAotCQkJJChBUF9XT1JLKS9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSBcCi0JCQkkKEFQX1dPUkspL3NyY2xpYi9hcHIgXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZmxhZ3Mgd2lsbCBjb21lIGFmdGVyIENGTEFHUwotIwotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZGVmaW5lcyB3aWxsIGNvbWUgYWZ0ZXIgREVGSU5FUwotIwotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZmxhZ3Mgd2lsbCBiZSBhZGRlZCB0byB0aGUgbGluay5vcHQgZmlsZQotIwotWExGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgdmFsdWVzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGNvcnJlY3QgdmFyaWFibGVzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZgotIyBSRUxFQVNFCi0jCi1pZmVxICIkKFJFTEVBU0UpIiAiZGVidWciCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCSAgIAkkKEVPTElTVCkKLWVuZGlmCi0KLWlmZXEgIiQoUkVMRUFTRSkiICJub29wdCIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJICAgCSQoRU9MSVNUKQotZW5kaWYKLQotaWZlcSAiJChSRUxFQVNFKSIgInJlbGVhc2UiCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLWVuZGlmCi0KLSMKLSMgVGhlc2UgYXJlIHVzZWQgYnkgdGhlIGxpbmsgdGFyZ2V0IGlmIGFuIE5MTSBpcyBiZWluZyBnZW5lcmF0ZWQKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rICduYW1lJyBkaXJlY3RpdmUgdG8gbmFtZSB0aGUgbmxtLiAgSWYgbGVmdCBibGFuawotIyBUQVJHRVRfbmxtIChzZWUgYmVsb3cpIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9OQU1FCQk9IHJld3JpdGUKLQotIwotIyBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmsgJy1kZXNjICcgZGlyZWN0aXZlLiAKLSMgSWYgbGVmdCBibGFuaywgTkxNX05BTUUgd2lsbCBiZSB1c2VkLgotIwotTkxNX0RFU0NSSVBUSU9OCT0gUmV3cml0ZSBNb2R1bGUKLQotIwotIyBUaGlzIGlzIHVzZWQgYnkgdGhlICctdGhyZWFkbmFtZScgZGlyZWN0aXZlLiAgSWYgbGVmdCBibGFuaywKLSMgTkxNX05BTUUgVGhyZWFkIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9USFJFQURfTkFNRQk9IFJld3JpdGUgTW9kdWxlCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgVkVSU0lPTiB2YWx1ZSBpbiAKLSMgJChBUF9XT1JLKVxidWlsZFxOV0dOVWVudmlyb25tZW50LmluYwotIwotTkxNX1ZFUlNJT04JCT0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBvZiA2NEsKLSMKLU5MTV9TVEFDS19TSVpFCT0gODE5MgotCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZW50cnknIGRpcmVjdGl2ZQotIwotTkxNX0VOVFJZX1NZTQk9IF9MaWJDUHJlbHVkZQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWV4aXQnIGRpcmVjdGl2ZQotIwotTkxNX0VYSVRfU1lNCT0gX0xpYkNQb3N0bHVkZQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWNoZWNrJyBkaXJlY3RpdmUKLSMKLU5MTV9DSEVDS19TWU0JPQotCi0jCi0jIElmIHRoZXNlIGFyZSBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZmxhZ3MnIGRpcmVjdGl2ZQotIwotTkxNX0ZMQUdTCQk9ICBBVVRPVU5MT0FELCBQU0VVRE9QUkVFTVBUSU9OCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSBsaW5rZWQgaW4gd2l0aCB0aGUgWERDRGF0YSBvcHRpb24gaW4gdGhlIGRlZiAKLSMgZmlsZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG9mICQoTldPUykvYXBhY2hlLnhkYy4gIFhEQ0RhdGEgY2FuIGJlIGRpc2FibGVkCi0jIGJ5IHNldHRpbmcgQVBBQ0hFX1VOSVBST0MgaW4gdGhlIGVudmlyb25tZW50Ci0jCi1YRENEQVRBICAgICAgICAgPSAKLQotIwotIyBJZiB0aGVyZSBpcyBhbiBOTE0gdGFyZ2V0LCBwdXQgaXQgaGVyZQotIwotVEFSR0VUX25sbSA9IFwKLQkkKE9CSkRJUikvcmV3cml0ZS5ubG0gXAotCSQoRU9MSVNUKQotCi0jCi0jIElmIHRoZXJlIGlzIGFuIExJQiB0YXJnZXQsIHB1dCBpdCBoZXJlCi0jCi1UQVJHRVRfbGliID0gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgT0JKIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIE5MTSB0YXJnZXQgYWJvdmUuCi0jIFBhdGhzIG11c3QgYWxsIHVzZSB0aGUgJy8nIGNoYXJhY3RlcgotIwotRklMRVNfbmxtX29ianMgPSBcCi0JJChPQkpESVIpL21vZF9yZXdyaXRlLm8gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgTElCIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIE5MTSB0YXJnZXQgYWJvdmUuCi0jIFRoZXNlIHdpbGwgYmUgYWRkZWQgYXMgYSBsaWJyYXJ5IGNvbW1hbmQgaW4gdGhlIGxpbmsub3B0IGZpbGUuCi0jCi1GSUxFU19ubG1fbGlicyA9IFwKLSAgIAlsaWJjcHJlLm8gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgbW9kdWxlcyB0aGF0IHRoZSBhYm92ZSBOTE0gdGFyZ2V0IGRlcGVuZHMgb24gdG8gbG9hZC4KLSMgVGhlc2Ugd2lsbCBiZSBhZGRlZCBhcyBhIG1vZHVsZSBjb21tYW5kIGluIHRoZSBsaW5rLm9wdCBmaWxlLgotIwotRklMRVNfbmxtX21vZHVsZXMgPSBcCi0JYXBybGliIFwKLQlsaWJjIFwKLQkkKEVPTElTVCkKLQotIwotIyBJZiB0aGUgbmxtIGhhcyBhIG1zZyBmaWxlLCBwdXQgaXQncyBwYXRoIGhlcmUKLSMKLUZJTEVfbmxtX21zZyA9Ci0gCi0jCi0jIElmIHRoZSBubG0gaGFzIGEgaGxwIGZpbGUgcHV0IGl0J3MgcGF0aCBoZXJlCi0jCi1GSUxFX25sbV9obHAgPQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlICQoTldPUylcY29weXJpZ2h0LnR4dC4KLSMKLUZJTEVfbmxtX2NvcHlyaWdodCA9Ci0KLSMKLSMgQW55IGFkZGl0aW9uYWwgaW1wb3J0cyBnbyBoZXJlCi0jCi1GSUxFU19ubG1fWGltcG9ydHMgPSBcCi0JQCQoQVBSKS9hcHJsaWIuaW1wIFwKLQlAJChOV09TKS9odHRwZC5pbXAgXAotCUBsaWJjLmltcCBcCi0JJChFT0xJU1QpCi0gCi0jICAgCi0jIEFueSBzeW1ib2xzIGV4cG9ydGVkIHRvIGhlcmUKLSMKLUZJTEVTX25sbV9leHBvcnRzID0gXAotCXJld3JpdGVfbW9kdWxlIFwKLQkkKEVPTElTVCkKLQkKLSMgICAKLSMgVGhlc2UgYXJlIHRoZSBPQkogZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTElCIHRhcmdldCBhYm92ZS4KLSMgUGF0aHMgbXVzdCBhbGwgdXNlIHRoZSAnLycgY2hhcmFjdGVyCi0jCi1GSUxFU19saWJfb2JqcyA9IFwKLQkJJChFT0xJU1QpCi0KLSMKLSMgaW1wbGVtZW50IHRhcmdldHMgYW5kIGRlcGVuZGFuY2llcyAobGVhdmUgdGhpcyBzZWN0aW9uIGFsb25lKQotIwotCi1saWJzIDo6ICQoT0JKRElSKSAkKFRBUkdFVF9saWIpCi0KLW5sbXMgOjogbGlicyAkKFRBUkdFVF9ubG0pCi0KLSMKLSMgVXBkYXRlZCB0aGlzIHRhcmdldCB0byBjcmVhdGUgbmVjZXNzYXJ5IGRpcmVjdG9yaWVzIGFuZCBjb3B5IGZpbGVzIHRvIHRoZSAKLSMgY29ycmVjdCBwbGFjZS4gIChTZWUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jIGZvciBleGFtcGxlcykKLSMKLWluc3RhbGwgOjogbmxtcyBGT1JDRQotCi0jCi0jIEFueSBzcGVjaWFsaXplZCBydWxlcyBoZXJlCi0jCi0KLSMKLSMgSW5jbHVkZSB0aGUgJ3RhaWwnIG1ha2VmaWxlIHRoYXQgaGFzIHRhcmdldHMgdGhhdCBkZXBlbmQgb24gdmFyaWFibGVzIGRlZmluZWQKLSMgaW4gdGhpcyBtYWtlZmlsZQotIwotCi1pbmNsdWRlICQoQVBfV09SSylcYnVpbGRcTldHTlV0YWlsLmluYwotCmRpZmYgLS1naXQgYS9tb2R1bGVzL21hcHBlcnMvTldHTlVzcGVsaW5nIGIvbW9kdWxlcy9tYXBwZXJzL05XR05Vc3BlbGluZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRkNDI2My4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21hcHBlcnMvTldHTlVzcGVsaW5nCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLSMKLSMgTWFrZSBzdXJlIGFsbCBuZWVkZWQgbWFjcm8ncyBhcmUgZGVmaW5lZAotIwotCi0jCi0jIEdldCB0aGUgJ2hlYWQnIG9mIHRoZSBidWlsZCBlbnZpcm9ubWVudCBpZiBuZWNlc3NhcnkuICBUaGlzIGluY2x1ZGVzIGRlZmF1bHQKLSMgdGFyZ2V0cyBhbmQgcGF0aHMgdG8gdG9vbHMKLSMKLQotaWZuZGVmIEVudmlyb25tZW50RGVmaW5lZAotaW5jbHVkZSAkKEFQX1dPUkspXGJ1aWxkXE5XR05VaGVhZC5pbmMKLWVuZGlmCi0KLSMKLSMgVGhlc2UgZGlyZWN0b3JpZXMgd2lsbCBiZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbmNsdWRlIGxpc3QsIGZvbGxvd2VkIGJ5Ci0jIElOQ0RJUlMKLSMKLVhJTkNESVJTCSs9IFwKLQkJCSQoQVBfV09SSykvaW5jbHVkZSBcCi0JCQkkKE5XT1MpIFwKLQkJCSQoQVBfV09SSykvbW9kdWxlcy9hcmNoL25ldHdhcmUgXAotCQkJJChBUF9XT1JLKS9zcmNsaWIvYXByL2luY2x1ZGUgXAotCQkJJChBUF9XT1JLKS9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSBcCi0JCQkkKEFQX1dPUkspL3NyY2xpYi9hcHIgXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZmxhZ3Mgd2lsbCBjb21lIGFmdGVyIENGTEFHUwotIwotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZGVmaW5lcyB3aWxsIGNvbWUgYWZ0ZXIgREVGSU5FUwotIwotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZmxhZ3Mgd2lsbCBiZSBhZGRlZCB0byB0aGUgbGluay5vcHQgZmlsZQotIwotWExGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgdmFsdWVzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGNvcnJlY3QgdmFyaWFibGVzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZgotIyBSRUxFQVNFCi0jCi1pZmVxICIkKFJFTEVBU0UpIiAiZGVidWciCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCSAgIAkkKEVPTElTVCkKLWVuZGlmCi0KLWlmZXEgIiQoUkVMRUFTRSkiICJub29wdCIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJICAgCSQoRU9MSVNUKQotZW5kaWYKLQotaWZlcSAiJChSRUxFQVNFKSIgInJlbGVhc2UiCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLWVuZGlmCi0KLSMKLSMgVGhlc2UgYXJlIHVzZWQgYnkgdGhlIGxpbmsgdGFyZ2V0IGlmIGFuIE5MTSBpcyBiZWluZyBnZW5lcmF0ZWQKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rICduYW1lJyBkaXJlY3RpdmUgdG8gbmFtZSB0aGUgbmxtLiAgSWYgbGVmdCBibGFuawotIyBUQVJHRVRfbmxtIChzZWUgYmVsb3cpIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9OQU1FCQk9IHNwZWxpbmcKLQotIwotIyBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmsgJy1kZXNjICcgZGlyZWN0aXZlLiAKLSMgSWYgbGVmdCBibGFuaywgTkxNX05BTUUgd2lsbCBiZSB1c2VkLgotIwotTkxNX0RFU0NSSVBUSU9OCT0gU3BlbGluZyBNb2R1bGUKLQotIwotIyBUaGlzIGlzIHVzZWQgYnkgdGhlICctdGhyZWFkbmFtZScgZGlyZWN0aXZlLiAgSWYgbGVmdCBibGFuaywKLSMgTkxNX05BTUUgVGhyZWFkIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9USFJFQURfTkFNRQk9IFNwZWxpbmcgTW9kdWxlCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgVkVSU0lPTiB2YWx1ZSBpbiAKLSMgJChBUF9XT1JLKVxidWlsZFxOV0dOVWVudmlyb25tZW50LmluYwotIwotTkxNX1ZFUlNJT04JCT0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBvZiA2NEsKLSMKLU5MTV9TVEFDS19TSVpFCT0gODE5MgotCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZW50cnknIGRpcmVjdGl2ZQotIwotTkxNX0VOVFJZX1NZTQk9IF9MaWJDUHJlbHVkZQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWV4aXQnIGRpcmVjdGl2ZQotIwotTkxNX0VYSVRfU1lNCT0gX0xpYkNQb3N0bHVkZQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWNoZWNrJyBkaXJlY3RpdmUKLSMKLU5MTV9DSEVDS19TWU0JPQotCi0jCi0jIElmIHRoZXNlIGFyZSBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZmxhZ3MnIGRpcmVjdGl2ZQotIwotTkxNX0ZMQUdTCQk9ICBBVVRPVU5MT0FELCBQU0VVRE9QUkVFTVBUSU9OCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSBsaW5rZWQgaW4gd2l0aCB0aGUgWERDRGF0YSBvcHRpb24gaW4gdGhlIGRlZiAKLSMgZmlsZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG9mICQoTldPUykvYXBhY2hlLnhkYy4gIFhEQ0RhdGEgY2FuIGJlIGRpc2FibGVkCi0jIGJ5IHNldHRpbmcgQVBBQ0hFX1VOSVBST0MgaW4gdGhlIGVudmlyb25tZW50Ci0jCi1YRENEQVRBICAgICAgICAgPSAKLQotIwotIyBJZiB0aGVyZSBpcyBhbiBOTE0gdGFyZ2V0LCBwdXQgaXQgaGVyZQotIwotVEFSR0VUX25sbSA9IFwKLQkkKE9CSkRJUikvc3BlbGluZy5ubG0gXAotCSQoRU9MSVNUKQotCi0jCi0jIElmIHRoZXJlIGlzIGFuIExJQiB0YXJnZXQsIHB1dCBpdCBoZXJlCi0jCi1UQVJHRVRfbGliID0gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgT0JKIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIE5MTSB0YXJnZXQgYWJvdmUuCi0jIFBhdGhzIG11c3QgYWxsIHVzZSB0aGUgJy8nIGNoYXJhY3RlcgotIwotRklMRVNfbmxtX29ianMgPSBcCi0JJChPQkpESVIpL21vZF9zcGVsaW5nLm8gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgTElCIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIE5MTSB0YXJnZXQgYWJvdmUuCi0jIFRoZXNlIHdpbGwgYmUgYWRkZWQgYXMgYSBsaWJyYXJ5IGNvbW1hbmQgaW4gdGhlIGxpbmsub3B0IGZpbGUuCi0jCi1GSUxFU19ubG1fbGlicyA9IFwKLSAgIAlsaWJjcHJlLm8gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgbW9kdWxlcyB0aGF0IHRoZSBhYm92ZSBOTE0gdGFyZ2V0IGRlcGVuZHMgb24gdG8gbG9hZC4KLSMgVGhlc2Ugd2lsbCBiZSBhZGRlZCBhcyBhIG1vZHVsZSBjb21tYW5kIGluIHRoZSBsaW5rLm9wdCBmaWxlLgotIwotRklMRVNfbmxtX21vZHVsZXMgPSBcCi0JYXBybGliIFwKLQlsaWJjIFwKLQkkKEVPTElTVCkKLQotIwotIyBJZiB0aGUgbmxtIGhhcyBhIG1zZyBmaWxlLCBwdXQgaXQncyBwYXRoIGhlcmUKLSMKLUZJTEVfbmxtX21zZyA9Ci0gCi0jCi0jIElmIHRoZSBubG0gaGFzIGEgaGxwIGZpbGUgcHV0IGl0J3MgcGF0aCBoZXJlCi0jCi1GSUxFX25sbV9obHAgPQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlICQoTldPUylcY29weXJpZ2h0LnR4dC4KLSMKLUZJTEVfbmxtX2NvcHlyaWdodCA9Ci0KLSMKLSMgQW55IGFkZGl0aW9uYWwgaW1wb3J0cyBnbyBoZXJlCi0jCi1GSUxFU19ubG1fWGltcG9ydHMgPSBcCi0JQCQoQVBSKS9hcHJsaWIuaW1wIFwKLQlAJChOV09TKS9odHRwZC5pbXAgXAotCUBsaWJjLmltcCBcCi0JJChFT0xJU1QpCi0gCi0jICAgCi0jIEFueSBzeW1ib2xzIGV4cG9ydGVkIHRvIGhlcmUKLSMKLUZJTEVTX25sbV9leHBvcnRzID0gXAotCXNwZWxpbmdfbW9kdWxlIFwKLQkkKEVPTElTVCkKLQkKLSMgICAKLSMgVGhlc2UgYXJlIHRoZSBPQkogZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTElCIHRhcmdldCBhYm92ZS4KLSMgUGF0aHMgbXVzdCBhbGwgdXNlIHRoZSAnLycgY2hhcmFjdGVyCi0jCi1GSUxFU19saWJfb2JqcyA9IFwKLQkJJChFT0xJU1QpCi0KLSMKLSMgaW1wbGVtZW50IHRhcmdldHMgYW5kIGRlcGVuZGFuY2llcyAobGVhdmUgdGhpcyBzZWN0aW9uIGFsb25lKQotIwotCi1saWJzIDo6ICQoT0JKRElSKSAkKFRBUkdFVF9saWIpCi0KLW5sbXMgOjogbGlicyAkKFRBUkdFVF9ubG0pCi0KLSMKLSMgVXBkYXRlZCB0aGlzIHRhcmdldCB0byBjcmVhdGUgbmVjZXNzYXJ5IGRpcmVjdG9yaWVzIGFuZCBjb3B5IGZpbGVzIHRvIHRoZSAKLSMgY29ycmVjdCBwbGFjZS4gIChTZWUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jIGZvciBleGFtcGxlcykKLSMKLWluc3RhbGwgOjogbmxtcyBGT1JDRQotCi0jCi0jIEFueSBzcGVjaWFsaXplZCBydWxlcyBoZXJlCi0jCi0KLSMKLSMgSW5jbHVkZSB0aGUgJ3RhaWwnIG1ha2VmaWxlIHRoYXQgaGFzIHRhcmdldHMgdGhhdCBkZXBlbmQgb24gdmFyaWFibGVzIGRlZmluZWQKLSMgaW4gdGhpcyBtYWtlZmlsZQotIwotCi1pbmNsdWRlICQoQVBfV09SSylcYnVpbGRcTldHTlV0YWlsLmluYwotCmRpZmYgLS1naXQgYS9tb2R1bGVzL21hcHBlcnMvTldHTlV2aG9zdCBiL21vZHVsZXMvbWFwcGVycy9OV0dOVXZob3N0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmVlNzc4Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWFwcGVycy9OV0dOVXZob3N0CisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLSMKLSMgTWFrZSBzdXJlIGFsbCBuZWVkZWQgbWFjcm8ncyBhcmUgZGVmaW5lZAotIwotCi0jCi0jIEdldCB0aGUgJ2hlYWQnIG9mIHRoZSBidWlsZCBlbnZpcm9ubWVudCBpZiBuZWNlc3NhcnkuICBUaGlzIGluY2x1ZGVzIGRlZmF1bHQKLSMgdGFyZ2V0cyBhbmQgcGF0aHMgdG8gdG9vbHMKLSMKLQotaWZuZGVmIEVudmlyb25tZW50RGVmaW5lZAotaW5jbHVkZSAkKEFQX1dPUkspXGJ1aWxkXE5XR05VaGVhZC5pbmMKLWVuZGlmCi0KLSMKLSMgVGhlc2UgZGlyZWN0b3JpZXMgd2lsbCBiZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbmNsdWRlIGxpc3QsIGZvbGxvd2VkIGJ5Ci0jIElOQ0RJUlMKLSMKLVhJTkNESVJTCSs9IFwKLQkJCSQoQVBfV09SSykvaW5jbHVkZSBcCi0JCQkkKE5XT1MpIFwKLQkJCSQoQVBfV09SSykvbW9kdWxlcy9hcmNoL25ldHdhcmUgXAotCQkJJChBUF9XT1JLKS9zcmNsaWIvYXByL2luY2x1ZGUgXAotCQkJJChBUF9XT1JLKS9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSBcCi0JCQkkKEFQX1dPUkspL3NyY2xpYi9hcHIgXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZmxhZ3Mgd2lsbCBjb21lIGFmdGVyIENGTEFHUwotIwotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZGVmaW5lcyB3aWxsIGNvbWUgYWZ0ZXIgREVGSU5FUwotIwotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZmxhZ3Mgd2lsbCBiZSBhZGRlZCB0byB0aGUgbGluay5vcHQgZmlsZQotIwotWExGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgdmFsdWVzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGNvcnJlY3QgdmFyaWFibGVzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZgotIyBSRUxFQVNFCi0jCi1pZmVxICIkKFJFTEVBU0UpIiAiZGVidWciCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCSAgIAkkKEVPTElTVCkKLWVuZGlmCi0KLWlmZXEgIiQoUkVMRUFTRSkiICJub29wdCIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJICAgCSQoRU9MSVNUKQotZW5kaWYKLQotaWZlcSAiJChSRUxFQVNFKSIgInJlbGVhc2UiCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLWVuZGlmCi0KLSMKLSMgVGhlc2UgYXJlIHVzZWQgYnkgdGhlIGxpbmsgdGFyZ2V0IGlmIGFuIE5MTSBpcyBiZWluZyBnZW5lcmF0ZWQKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rICduYW1lJyBkaXJlY3RpdmUgdG8gbmFtZSB0aGUgbmxtLiAgSWYgbGVmdCBibGFuawotIyBUQVJHRVRfbmxtIChzZWUgYmVsb3cpIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9OQU1FCQk9IHZob3N0Ci0KLSMKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rICctZGVzYyAnIGRpcmVjdGl2ZS4gCi0jIElmIGxlZnQgYmxhbmssIE5MTV9OQU1FIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9ERVNDUklQVElPTgk9IFZob3N0IEFsaWFzIE1vZHVsZQotCi0jCi0jIFRoaXMgaXMgdXNlZCBieSB0aGUgJy10aHJlYWRuYW1lJyBkaXJlY3RpdmUuICBJZiBsZWZ0IGJsYW5rLAotIyBOTE1fTkFNRSBUaHJlYWQgd2lsbCBiZSB1c2VkLgotIwotTkxNX1RIUkVBRF9OQU1FCT0gVmhvc3QgQWxpYXMgTW9kdWxlCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgVkVSU0lPTiB2YWx1ZSBpbiAKLSMgJChBUF9XT1JLKVxidWlsZFxOV0dOVWVudmlyb25tZW50LmluYwotIwotTkxNX1ZFUlNJT04JCT0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBvZiA2NEsKLSMKLU5MTV9TVEFDS19TSVpFCT0gODE5MgotCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZW50cnknIGRpcmVjdGl2ZQotIwotTkxNX0VOVFJZX1NZTQk9IF9MaWJDUHJlbHVkZQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWV4aXQnIGRpcmVjdGl2ZQotIwotTkxNX0VYSVRfU1lNCT0gX0xpYkNQb3N0bHVkZQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWNoZWNrJyBkaXJlY3RpdmUKLSMKLU5MTV9DSEVDS19TWU0JPQotCi0jCi0jIElmIHRoZXNlIGFyZSBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZmxhZ3MnIGRpcmVjdGl2ZQotIwotTkxNX0ZMQUdTCQk9ICBBVVRPVU5MT0FELCBQU0VVRE9QUkVFTVBUSU9OCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSBsaW5rZWQgaW4gd2l0aCB0aGUgWERDRGF0YSBvcHRpb24gaW4gdGhlIGRlZiAKLSMgZmlsZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG9mICQoTldPUykvYXBhY2hlLnhkYy4gIFhEQ0RhdGEgY2FuIGJlIGRpc2FibGVkCi0jIGJ5IHNldHRpbmcgQVBBQ0hFX1VOSVBST0MgaW4gdGhlIGVudmlyb25tZW50Ci0jCi1YRENEQVRBICAgICAgICAgPSAKLQotIwotIyBJZiB0aGVyZSBpcyBhbiBOTE0gdGFyZ2V0LCBwdXQgaXQgaGVyZQotIwotVEFSR0VUX25sbSA9IFwKLQkkKE9CSkRJUikvdmhvc3QubmxtIFwKLQkkKEVPTElTVCkKLQotIwotIyBJZiB0aGVyZSBpcyBhbiBMSUIgdGFyZ2V0LCBwdXQgaXQgaGVyZQotIwotVEFSR0VUX2xpYiA9IFwKLQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBhcmUgdGhlIE9CSiBmaWxlcyBuZWVkZWQgdG8gY3JlYXRlIHRoZSBOTE0gdGFyZ2V0IGFib3ZlLgotIyBQYXRocyBtdXN0IGFsbCB1c2UgdGhlICcvJyBjaGFyYWN0ZXIKLSMKLUZJTEVTX25sbV9vYmpzID0gXAotCSQoT0JKRElSKS9tb2Rfdmhvc3RfYWxpYXMubyBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBMSUIgZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTkxNIHRhcmdldCBhYm92ZS4KLSMgVGhlc2Ugd2lsbCBiZSBhZGRlZCBhcyBhIGxpYnJhcnkgY29tbWFuZCBpbiB0aGUgbGluay5vcHQgZmlsZS4KLSMKLUZJTEVTX25sbV9saWJzID0gXAotICAgCWxpYmNwcmUubyBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBtb2R1bGVzIHRoYXQgdGhlIGFib3ZlIE5MTSB0YXJnZXQgZGVwZW5kcyBvbiB0byBsb2FkLgotIyBUaGVzZSB3aWxsIGJlIGFkZGVkIGFzIGEgbW9kdWxlIGNvbW1hbmQgaW4gdGhlIGxpbmsub3B0IGZpbGUuCi0jCi1GSUxFU19ubG1fbW9kdWxlcyA9IFwKLQlhcHJsaWIgXAotCWxpYmMgXAotCSQoRU9MSVNUKQotCi0jCi0jIElmIHRoZSBubG0gaGFzIGEgbXNnIGZpbGUsIHB1dCBpdCdzIHBhdGggaGVyZQotIwotRklMRV9ubG1fbXNnID0KLSAKLSMKLSMgSWYgdGhlIG5sbSBoYXMgYSBobHAgZmlsZSBwdXQgaXQncyBwYXRoIGhlcmUKLSMKLUZJTEVfbmxtX2hscCA9Ci0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgJChOV09TKVxjb3B5cmlnaHQudHh0LgotIwotRklMRV9ubG1fY29weXJpZ2h0ID0KLQotIwotIyBBbnkgYWRkaXRpb25hbCBpbXBvcnRzIGdvIGhlcmUKLSMKLUZJTEVTX25sbV9YaW1wb3J0cyA9IFwKLQlAJChBUFIpL2FwcmxpYi5pbXAgXAotCUAkKE5XT1MpL2h0dHBkLmltcCBcCi0JQGxpYmMuaW1wIFwKLQkkKEVPTElTVCkKLSAKLSMgICAKLSMgQW55IHN5bWJvbHMgZXhwb3J0ZWQgdG8gaGVyZQotIwotRklMRVNfbmxtX2V4cG9ydHMgPSBcCi0Jdmhvc3RfYWxpYXNfbW9kdWxlIFwKLQkkKEVPTElTVCkKLQkKLSMgICAKLSMgVGhlc2UgYXJlIHRoZSBPQkogZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTElCIHRhcmdldCBhYm92ZS4KLSMgUGF0aHMgbXVzdCBhbGwgdXNlIHRoZSAnLycgY2hhcmFjdGVyCi0jCi1GSUxFU19saWJfb2JqcyA9IFwKLQkJJChFT0xJU1QpCi0KLSMKLSMgaW1wbGVtZW50IHRhcmdldHMgYW5kIGRlcGVuZGFuY2llcyAobGVhdmUgdGhpcyBzZWN0aW9uIGFsb25lKQotIwotCi1saWJzIDo6ICQoT0JKRElSKSAkKFRBUkdFVF9saWIpCi0KLW5sbXMgOjogbGlicyAkKFRBUkdFVF9ubG0pCi0KLSMKLSMgVXBkYXRlZCB0aGlzIHRhcmdldCB0byBjcmVhdGUgbmVjZXNzYXJ5IGRpcmVjdG9yaWVzIGFuZCBjb3B5IGZpbGVzIHRvIHRoZSAKLSMgY29ycmVjdCBwbGFjZS4gIChTZWUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jIGZvciBleGFtcGxlcykKLSMKLWluc3RhbGwgOjogbmxtcyBGT1JDRQotCi0jCi0jIEFueSBzcGVjaWFsaXplZCBydWxlcyBoZXJlCi0jCi0KLSMKLSMgSW5jbHVkZSB0aGUgJ3RhaWwnIG1ha2VmaWxlIHRoYXQgaGFzIHRhcmdldHMgdGhhdCBkZXBlbmQgb24gdmFyaWFibGVzIGRlZmluZWQKLSMgaW4gdGhpcyBtYWtlZmlsZQotIwotCi1pbmNsdWRlICQoQVBfV09SSylcYnVpbGRcTldHTlV0YWlsLmluYwotCmRpZmYgLS1naXQgYS9tb2R1bGVzL21hcHBlcnMvY29uZmlnOS5tNCBiL21vZHVsZXMvbWFwcGVycy9jb25maWc5Lm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjBkZmQ3Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWFwcGVycy9jb25maWc5Lm00CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotZG5sIG1vZHVsZXMgZW5hYmxlZCBpbiB0aGlzIGRpcmVjdG9yeSBieSBkZWZhdWx0Ci0KLWRubCBBUEFDSEVfTU9EVUxFKG5hbWUsIGhlbHB0ZXh0Wywgb2JqZWN0c1ssIHN0cnVjdG5hbWVbLCBkZWZhdWx0WywgY29uZmlnXV1dXSkKLQotQVBBQ0hFX01PRFBBVEhfSU5JVChtYXBwZXJzKQotCi1BUEFDSEVfTU9EVUxFKHZob3N0X2FsaWFzLCBtYXNzIGhvc3RpbmcgbW9kdWxlKQotQVBBQ0hFX01PRFVMRShuZWdvdGlhdGlvbiwgY29udGVudCBuZWdvYXRpYXRpb24sICwgLCB5ZXMpCi1BUEFDSEVfTU9EVUxFKGRpciwgZGlyZWN0b3J5IHJlcXVlc3QgaGFuZGxpbmcsICwgLCB5ZXMpCi1BUEFDSEVfTU9EVUxFKGltYXAsIGludGVybmFsIGltYWdlbWFwcywgLCAsIHllcykKLUFQQUNIRV9NT0RVTEUoYWN0aW9ucywgQWN0aW9uIHRyaWdnZXJpbmcgb24gcmVxdWVzdHMsICwgLCB5ZXMpCi1BUEFDSEVfTU9EVUxFKHNwZWxpbmcsIGNvcnJlY3QgY29tbW9uIFVSTCBtaXNzcGVsbGluZ3MpCi1BUEFDSEVfTU9EVUxFKHVzZXJkaXIsIG1hcHBpbmcgb2YgdXNlciByZXF1ZXN0cywgLCAsIHllcykKLUFQQUNIRV9NT0RVTEUoYWxpYXMsIHRyYW5zbGF0aW9uIG9mIHJlcXVlc3RzLCAsICwgeWVzKQotCi1BUEFDSEVfTU9EVUxFKHJld3JpdGUsIHJlZ2V4IFVSTCB0cmFuc2xhdGlvbiwgLCAsIG1vc3QsIFsKLSAgRVhUUkFfQ0ZMQUdTPSIkRVhUUkFfQ0ZMQUdTIC1ETk9fREJNX1JFV1JJVEVNQVAiCi1dKQotCi1kbmwgIyMjIHRoaXMgaXNuJ3QgZ29pbmcgdG8gd29yayBxdWl0ZSByaWdodCBiZWNhdXNlIG9mIG9yZGVyaW5nIGlzc3VlcwotZG5sICMjIyBhbW9uZyB0aGUgY29uZmlnLm00IGZpbGVzLiBpdCBpcyBwb3NzaWJsZSB0aGF0IGEgKmxhdGVyKiBtb2R1bGUKLWRubCAjIyMgaXMgbWFya2VkIGFzIHNoYXJlZCAodGh1cyBzZXR0aW5nIHNoYXJlZG9ianMpLCBzbyB3ZSB3b24ndCBzZWUKLWRubCAjIyMgaXQgaGVyZS4gd2UgbmVlZCB0byBzaGlmdCAqdGhpcyogY29uZmlnLm00IHRvIGJlICJsYXN0IiBvciB3ZQotZG5sICMjIyBuZWVkIHRvIGZpbmQgYSBkaWZmZXJlbnQgd2F5IHRvIHNldCB1cCB0aGlzIGRlZmF1bHQgYW5kIG1vZHVsZSBzcGVjLgotaWYgdGVzdCAiJHNoYXJlZG9ianMiID0gInllcyI7IHRoZW4KLSAgICBBUEFDSEVfTU9EVUxFKHNvLCBEU08gY2FwYWJpbGl0eSwgLCAsIHllcykKLWVsc2UKLSAgICBBUEFDSEVfTU9EVUxFKHNvLCBEU08gY2FwYWJpbGl0eSwgLCAsIG5vKQotZmkKLWRubCAjIyMgd2h5IHNhdmUgdGhlIGNhY2hlPwotQUNfQ0FDSEVfU0FWRQotCi1BUEFDSEVfTU9EUEFUSF9GSU5JU0gKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWFwcGVycy9tb2RfYWN0aW9ucy5jIGIvbW9kdWxlcy9tYXBwZXJzL21vZF9hY3Rpb25zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MDZlZTQuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tYXBwZXJzL21vZF9hY3Rpb25zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogbW9kX2FjdGlvbnMuYzogZXhlY3V0ZXMgc2NyaXB0cyBiYXNlZCBvbiBNSU1FIHR5cGUgb3IgSFRUUCBtZXRob2QKLSAqCi0gKiBieSBBbGV4ZWkgS29zdXQ7IGJhc2VkIG9uIG1vZF9jZ2kuYywgbW9kX21pbWUuYyBhbmQgbW9kX2luY2x1ZGVzLmMsCi0gKiBhZGFwdGVkIGJ5IHJzdCBmcm9tIG9yaWdpbmFsIE5DU0EgY29kZSBieSBSb2IgTWNDb29sCi0gKgotICogVXNhZ2UgaW5zdHJ1Y3Rpb25zOgotICoKLSAqIEFjdGlvbiBtaW1lL3R5cGUgL2NnaS1iaW4vc2NyaXB0Ci0gKiAKLSAqIHdpbGwgYWN0aXZhdGUgL2NnaS1iaW4vc2NyaXB0IHdoZW4gYSBmaWxlIG9mIGNvbnRlbnQgdHlwZSBtaW1lL3R5cGUgaXMgCi0gKiByZXF1ZXN0ZWQuIEl0IHNlbmRzIHRoZSBVUkwgYW5kIGZpbGUgcGF0aCBvZiB0aGUgcmVxdWVzdGVkIGRvY3VtZW50IHVzaW5nIAotICogdGhlIHN0YW5kYXJkIENHSSBQQVRIX0lORk8gYW5kIFBBVEhfVFJBTlNMQVRFRCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCi0gKgotICogU2NyaXB0IFBVVCAvY2dpLWJpbi9zY3JpcHQKLSAqCi0gKiB3aWxsIGFjdGl2YXRlIC9jZ2ktYmluL3NjcmlwdCB3aGVuIGEgcmVxdWVzdCBpcyByZWNlaXZlZCB3aXRoIHRoZQotICogSFRUUCBtZXRob2QgIlBVVCIuICBUaGUgYXZhaWxhYmxlIG1ldGhvZCBuYW1lcyBhcmUgZGVmaW5lZCBpbiBodHRwZC5oLgotICogSWYgdGhlIG1ldGhvZCBpcyBHRVQsIHRoZSBzY3JpcHQgd2lsbCBvbmx5IGJlIGFjdGl2YXRlZCBpZiB0aGUgcmVxdWVzdGVkCi0gKiBVUkkgaW5jbHVkZXMgcXVlcnkgaW5mb3JtYXRpb24gKHN0dWZmIGFmdGVyIGEgPy1tYXJrKS4KLSAqLwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfcmVxdWVzdC5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJodHRwX21haW4uaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgInV0aWxfc2NyaXB0LmgiCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB0YWJsZSAqYWN0aW9uX3R5cGVzOyAgICAgICAvKiBBZGRlZCB3aXRoIEFjdGlvbi4uLiAqLwotICAgIGNoYXIgKnNjcmlwdGVkW01FVEhPRFNdOyAgIC8qIEFkZGVkIHdpdGggU2NyaXB0Li4uICovCi19IGFjdGlvbl9kaXJfY29uZmlnOwotCi1tb2R1bGUgYWN0aW9uX21vZHVsZTsKLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9hY3Rpb25fZGlyX2NvbmZpZyhwb29sICpwLCBjaGFyICpkdW1teSkKLXsKLSAgICBhY3Rpb25fZGlyX2NvbmZpZyAqbmV3ID0KLSAgICAoYWN0aW9uX2Rpcl9jb25maWcgKikgYXBfcGFsbG9jKHAsIHNpemVvZihhY3Rpb25fZGlyX2NvbmZpZykpOwotCi0gICAgbmV3LT5hY3Rpb25fdHlwZXMgPSBhcF9tYWtlX3RhYmxlKHAsIDQpOwotICAgIG1lbXNldChuZXctPnNjcmlwdGVkLCAwLCBzaXplb2YobmV3LT5zY3JpcHRlZCkpOwotCi0gICAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIHZvaWQgKm1lcmdlX2FjdGlvbl9kaXJfY29uZmlncyhwb29sICpwLCB2b2lkICpiYXNldiwgdm9pZCAqYWRkdikKLXsKLSAgICBhY3Rpb25fZGlyX2NvbmZpZyAqYmFzZSA9IChhY3Rpb25fZGlyX2NvbmZpZyAqKSBiYXNldjsKLSAgICBhY3Rpb25fZGlyX2NvbmZpZyAqYWRkID0gKGFjdGlvbl9kaXJfY29uZmlnICopIGFkZHY7Ci0gICAgYWN0aW9uX2Rpcl9jb25maWcgKm5ldyA9IChhY3Rpb25fZGlyX2NvbmZpZyAqKSBhcF9wYWxsb2MocCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYWN0aW9uX2Rpcl9jb25maWcpKTsKLSAgICBpbnQgaTsKLQotICAgIG5ldy0+YWN0aW9uX3R5cGVzID0gYXBfb3ZlcmxheV90YWJsZXMocCwgYWRkLT5hY3Rpb25fdHlwZXMsCi0JCQkJICAgICAgIGJhc2UtPmFjdGlvbl90eXBlcyk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUVUSE9EUzsgKytpKSB7Ci0gICAgICAgIG5ldy0+c2NyaXB0ZWRbaV0gPSBhZGQtPnNjcmlwdGVkW2ldID8gYWRkLT5zY3JpcHRlZFtpXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGJhc2UtPnNjcmlwdGVkW2ldOwotICAgIH0KLSAgICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqYWRkX2FjdGlvbihjbWRfcGFybXMgKmNtZCwgYWN0aW9uX2Rpcl9jb25maWcgKiBtLCBjaGFyICp0eXBlLAotCQkJICAgICAgY2hhciAqc2NyaXB0KQotewotICAgIGFwX3RhYmxlX3NldG4obS0+YWN0aW9uX3R5cGVzLCB0eXBlLCBzY3JpcHQpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3NjcmlwdChjbWRfcGFybXMgKmNtZCwgYWN0aW9uX2Rpcl9jb25maWcgKiBtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqbWV0aG9kLCBjaGFyICpzY3JpcHQpCi17Ci0gICAgaW50IG1ldGhudW07Ci0KLSAgICBtZXRobnVtID0gYXBfbWV0aG9kX251bWJlcl9vZihtZXRob2QpOwotICAgIGlmIChtZXRobnVtID09IE1fVFJBQ0UpCi0gICAgICAgIHJldHVybiAiVFJBQ0Ugbm90IGFsbG93ZWQgZm9yIFNjcmlwdCI7Ci0gICAgZWxzZSBpZiAobWV0aG51bSA9PSBNX0lOVkFMSUQpCi0gICAgICAgIHJldHVybiAiVW5rbm93biBtZXRob2QgdHlwZSBmb3IgU2NyaXB0IjsKLSAgICBlbHNlCi0gICAgICAgIG0tPnNjcmlwdGVkW21ldGhudW1dID0gc2NyaXB0OwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBhY3Rpb25fY21kc1tdID0KLXsKLSAgICB7IkFjdGlvbiIsIGFkZF9hY3Rpb24sIE5VTEwsIE9SX0ZJTEVJTkZPLCBUQUtFMiwKLSAgICAgImEgbWVkaWEgdHlwZSBmb2xsb3dlZCBieSBhIHNjcmlwdCBuYW1lIn0sCi0gICAgeyJTY3JpcHQiLCBzZXRfc2NyaXB0LCBOVUxMLCBBQ0NFU1NfQ09ORiB8IFJTUkNfQ09ORiwgVEFLRTIsCi0gICAgICJhIG1ldGhvZCBmb2xsb3dlZCBieSBhIHNjcmlwdCBuYW1lIn0sCi0gICAge05VTEx9Ci19OwotCi1zdGF0aWMgaW50IGFjdGlvbl9oYW5kbGVyKHJlcXVlc3RfcmVjICpyKQotewotICAgIGFjdGlvbl9kaXJfY29uZmlnICpjb25mID0gKGFjdGlvbl9kaXJfY29uZmlnICopCi0gICAgICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLCAmYWN0aW9uX21vZHVsZSk7Ci0gICAgY29uc3QgY2hhciAqdCwgKmFjdGlvbiA9IHItPmhhbmRsZXIgPyByLT5oYW5kbGVyIDogci0+Y29udGVudF90eXBlOwotICAgIGNvbnN0IGNoYXIgKnNjcmlwdDsKLSAgICBpbnQgaTsKLQotICAgIC8qIFNldCBhbGxvd2VkIHN0dWZmICovCi0gICAgZm9yIChpID0gMDsgaSA8IE1FVEhPRFM7ICsraSkgewotICAgICAgICBpZiAoY29uZi0+c2NyaXB0ZWRbaV0pCi0gICAgICAgICAgICByLT5hbGxvd2VkIHw9ICgxIDw8IGkpOwotICAgIH0KLQotICAgIC8qIEZpcnN0LCBjaGVjayBmb3IgdGhlIG1ldGhvZC1oYW5kbGluZyBzY3JpcHRzICovCi0gICAgaWYgKHItPm1ldGhvZF9udW1iZXIgPT0gTV9HRVQpIHsKLSAgICAgICAgaWYgKHItPmFyZ3MpCi0gICAgICAgICAgICBzY3JpcHQgPSBjb25mLT5zY3JpcHRlZFtNX0dFVF07Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNjcmlwdCA9IE5VTEw7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBzY3JpcHQgPSBjb25mLT5zY3JpcHRlZFtyLT5tZXRob2RfbnVtYmVyXTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBmb3IgbG9vcGluZywgd2hpY2ggY2FuIGhhcHBlbiBpZiB0aGUgQ0dJIHNjcmlwdCBpc24ndCAqLwotICAgIGlmIChzY3JpcHQgJiYgci0+cHJldiAmJiByLT5wcmV2LT5wcmV2KQotCXJldHVybiBERUNMSU5FRDsKLQotICAgIC8qIFNlY29uZCwgY2hlY2sgZm9yIGFjdGlvbnMgKHdoaWNoIG92ZXJyaWRlIHRoZSBtZXRob2Qgc2NyaXB0cykgKi8KLSAgICBpZiAoKHQgPSBhcF90YWJsZV9nZXQoY29uZi0+YWN0aW9uX3R5cGVzLAotCQkgICAgICAgYWN0aW9uID8gYWN0aW9uIDogYXBfZGVmYXVsdF90eXBlKHIpKSkpIHsKLQlzY3JpcHQgPSB0OwotCWlmIChyLT5maW5mby5zdF9tb2RlID09IDApIHsKLQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLQkJCSJGaWxlIGRvZXMgbm90IGV4aXN0OiAlcyIsIHItPmZpbGVuYW1lKTsKLQkgICAgcmV0dXJuIE5PVF9GT1VORDsKLQl9Ci0gICAgfQotCi0gICAgaWYgKHNjcmlwdCA9PSBOVUxMKQotCXJldHVybiBERUNMSU5FRDsKLQotICAgIGFwX2ludGVybmFsX3JlZGlyZWN0X2hhbmRsZXIoYXBfcHN0cmNhdChyLT5wb29sLCBzY3JpcHQsIGFwX2VzY2FwZV91cmkoci0+cG9vbCwKLQkJCSAgci0+dXJpKSwgci0+YXJncyA/ICI/IiA6IE5VTEwsIHItPmFyZ3MsIE5VTEwpLCByKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyBjb25zdCBoYW5kbGVyX3JlYyBhY3Rpb25faGFuZGxlcnNbXSA9Ci17Ci0gICAgeyIqLyoiLCBhY3Rpb25faGFuZGxlcn0sCi0gICAge05VTEx9Ci19OwotCi1tb2R1bGUgYWN0aW9uX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkRfTU9EVUxFX1NUVUZGLAotICAgIE5VTEwsCQkJLyogaW5pdGlhbGl6ZXIgKi8KLSAgICBjcmVhdGVfYWN0aW9uX2Rpcl9jb25maWcsCS8qIGRpciBjb25maWcgY3JlYXRlciAqLwotICAgIG1lcmdlX2FjdGlvbl9kaXJfY29uZmlncywJLyogZGlyIG1lcmdlciAtLS0gZGVmYXVsdCBpcyB0byBvdmVycmlkZSAqLwotICAgIE5VTEwsCQkJLyogc2VydmVyIGNvbmZpZyAqLwotICAgIE5VTEwsCQkJLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLwotICAgIGFjdGlvbl9jbWRzLAkJLyogY29tbWFuZCB0YWJsZSAqLwotICAgIGFjdGlvbl9oYW5kbGVycywJCS8qIGhhbmRsZXJzICovCi0gICAgTlVMTCwJCQkvKiBmaWxlbmFtZSB0cmFuc2xhdGlvbiAqLwotICAgIE5VTEwsCQkJLyogY2hlY2tfdXNlcl9pZCAqLwotICAgIE5VTEwsCQkJLyogY2hlY2sgYXV0aCAqLwotICAgIE5VTEwsCQkJLyogY2hlY2sgYWNjZXNzICovCi0gICAgTlVMTCwJCQkvKiB0eXBlX2NoZWNrZXIgKi8KLSAgICBOVUxMLAkJCS8qIGZpeHVwcyAqLwotICAgIE5VTEwsCQkJLyogbG9nZ2VyICovCi0gICAgTlVMTCwJCQkvKiBoZWFkZXIgcGFyc2VyICovCi0gICAgTlVMTCwJCQkvKiBjaGlsZF9pbml0ICovCi0gICAgTlVMTCwJCQkvKiBjaGlsZF9leGl0ICovCi0gICAgTlVMTAkJCS8qIHBvc3QgcmVhZC1yZXF1ZXN0ICovCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tYXBwZXJzL21vZF9hY3Rpb25zLmRzcCBiL21vZHVsZXMvbWFwcGVycy9tb2RfYWN0aW9ucy5kc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZmVkMTYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tYXBwZXJzL21vZF9hY3Rpb25zLmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9Im1vZF9hY3Rpb25zIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDIKLQotQ0ZHPW1vZF9hY3Rpb25zIC0gV2luMzIgUmVsZWFzZQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJtb2RfYWN0aW9ucy5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIm1vZF9hY3Rpb25zLm1hayIgQ0ZHPSJtb2RfYWN0aW9ucyAtIFdpbjMyIFJlbGVhc2UiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAibW9kX2FjdGlvbnMgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFICJtb2RfYWN0aW9ucyAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwCi0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotTVRMPW1pZGwuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9hY3Rpb25zIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvSSAiLi4vLi4vaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHIvaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHItdXRpbC9pbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0ZkIlJlbGVhc2VcbW9kX2FjdGlvbnMiIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvbWFjaGluZTpJMzg2IC9vdXQ6IlJlbGVhc2UvbW9kX2FjdGlvbnMuc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX2FjdGlvbnMKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9tYWNoaW5lOkkzODYgL291dDoiUmVsZWFzZS9tb2RfYWN0aW9ucy5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfYWN0aW9ucwotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibW9kX2FjdGlvbnMgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aaSAvT2QgL0kgIi4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9GZCJEZWJ1Z1xtb2RfYWN0aW9ucyIgL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvaW5jcmVtZW50YWw6bm8gL21hcCAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJEZWJ1Zy9tb2RfYWN0aW9ucy5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfYWN0aW9ucwotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9pbmNyZW1lbnRhbDpubyAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6IkRlYnVnL21vZF9hY3Rpb25zLnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF9hY3Rpb25zCi0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJtb2RfYWN0aW9ucyAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgIm1vZF9hY3Rpb25zIC0gV2luMzIgRGVidWciCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZF9hY3Rpb25zLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZF9hY3Rpb25zLnJjCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9hY3Rpb25zIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBDcmVhdGluZyBWZXJzaW9uIFJlc291cmNlCi1JbnB1dFBhdGg9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSIuXG1vZF9hY3Rpb25zLnJjIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCWF3ayAtZiAuLi8uLi9idWlsZC93aW4zMi93aW4zMnZlci5hd2sgbW9kX2FjdGlvbnMgICJhY3Rpb25zX21vZHVsZSBmb3IgQXBhY2hlIiAuLi8uLi9pbmNsdWRlL2FwX3JlbGVhc2UuaCA+IC5cbW9kX2FjdGlvbnMucmMKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJtb2RfYWN0aW9ucyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIENyZWF0aW5nIFZlcnNpb24gUmVzb3VyY2UKLUlucHV0UGF0aD0uLlwuLlxidWlsZFx3aW4zMlx3aW4zMnZlci5hd2sKLQotIi5cbW9kX2FjdGlvbnMucmMiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JYXdrIC1mIC4uLy4uL2J1aWxkL3dpbjMyL3dpbjMydmVyLmF3ayBtb2RfYWN0aW9ucyAgImFjdGlvbnNfbW9kdWxlIGZvciBBcGFjaGUiIC4uLy4uL2luY2x1ZGUvYXBfcmVsZWFzZS5oID4gLlxtb2RfYWN0aW9ucy5yYwotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9tb2R1bGVzL21hcHBlcnMvbW9kX2FjdGlvbnMuZXhwIGIvbW9kdWxlcy9tYXBwZXJzL21vZF9hY3Rpb25zLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE1ZGZmMi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21hcHBlcnMvbW9kX2FjdGlvbnMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYWN0aW9uX21vZHVsZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tYXBwZXJzL21vZF9hbGlhcy5jIGIvbW9kdWxlcy9tYXBwZXJzL21vZF9hbGlhcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTJkOTgyLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWFwcGVycy9tb2RfYWxpYXMuYworKysgL2Rldi9udWxsCkBAIC0xLDQxOCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBodHRwX2FsaWFzLmM6IFN0dWZmIGZvciBkZWFsaW5nIHdpdGggZGlyZWN0b3J5IGFsaWFzZXMKLSAqIAotICogT3JpZ2luYWwgYnkgUm9iIE1jQ29vbCwgcmV3cml0dGVuIGluIHN1Y2Nlc3Npb24gYnkgRGF2aWQgUm9iaW5zb24KLSAqIGFuZCByc3QuCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY2hhciAqcmVhbDsKLSAgICBjaGFyICpmYWtlOwotICAgIGNoYXIgKmhhbmRsZXI7Ci0gICAgcmVnZXhfdCAqcmVnZXhwOwotICAgIGludCByZWRpcl9zdGF0dXM7CQkvKiAzMDEsIDMwMiwgMzAzLCA0MTAsIGV0YyAqLwotfSBhbGlhc19lbnRyeTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGFycmF5X2hlYWRlciAqYWxpYXNlczsKLSAgICBhcnJheV9oZWFkZXIgKnJlZGlyZWN0czsKLX0gYWxpYXNfc2VydmVyX2NvbmY7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBhcnJheV9oZWFkZXIgKnJlZGlyZWN0czsKLX0gYWxpYXNfZGlyX2NvbmY7Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBhbGlhc19tb2R1bGU7Ci0KLXN0YXRpYyB2b2lkICpjcmVhdGVfYWxpYXNfY29uZmlnKHBvb2wgKnAsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgYWxpYXNfc2VydmVyX2NvbmYgKmEgPQotICAgIChhbGlhc19zZXJ2ZXJfY29uZiAqKSBhcF9wY2FsbG9jKHAsIHNpemVvZihhbGlhc19zZXJ2ZXJfY29uZikpOwotCi0gICAgYS0+YWxpYXNlcyA9IGFwX21ha2VfYXJyYXkocCwgMjAsIHNpemVvZihhbGlhc19lbnRyeSkpOwotICAgIGEtPnJlZGlyZWN0cyA9IGFwX21ha2VfYXJyYXkocCwgMjAsIHNpemVvZihhbGlhc19lbnRyeSkpOwotICAgIHJldHVybiBhOwotfQotCi1zdGF0aWMgdm9pZCAqY3JlYXRlX2FsaWFzX2Rpcl9jb25maWcocG9vbCAqcCwgY2hhciAqZCkKLXsKLSAgICBhbGlhc19kaXJfY29uZiAqYSA9Ci0gICAgKGFsaWFzX2Rpcl9jb25mICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKGFsaWFzX2Rpcl9jb25mKSk7Ci0gICAgYS0+cmVkaXJlY3RzID0gYXBfbWFrZV9hcnJheShwLCAyLCBzaXplb2YoYWxpYXNfZW50cnkpKTsKLSAgICByZXR1cm4gYTsKLX0KLQotc3RhdGljIHZvaWQgKm1lcmdlX2FsaWFzX2NvbmZpZyhwb29sICpwLCB2b2lkICpiYXNldiwgdm9pZCAqb3ZlcnJpZGVzdikKLXsKLSAgICBhbGlhc19zZXJ2ZXJfY29uZiAqYSA9Ci0gICAgKGFsaWFzX3NlcnZlcl9jb25mICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKGFsaWFzX3NlcnZlcl9jb25mKSk7Ci0gICAgYWxpYXNfc2VydmVyX2NvbmYgKmJhc2UgPSAoYWxpYXNfc2VydmVyX2NvbmYgKikgYmFzZXYsICpvdmVycmlkZXMgPSAoYWxpYXNfc2VydmVyX2NvbmYgKikgb3ZlcnJpZGVzdjsKLQotICAgIGEtPmFsaWFzZXMgPSBhcF9hcHBlbmRfYXJyYXlzKHAsIG92ZXJyaWRlcy0+YWxpYXNlcywgYmFzZS0+YWxpYXNlcyk7Ci0gICAgYS0+cmVkaXJlY3RzID0gYXBfYXBwZW5kX2FycmF5cyhwLCBvdmVycmlkZXMtPnJlZGlyZWN0cywgYmFzZS0+cmVkaXJlY3RzKTsKLSAgICByZXR1cm4gYTsKLX0KLQotc3RhdGljIHZvaWQgKm1lcmdlX2FsaWFzX2Rpcl9jb25maWcocG9vbCAqcCwgdm9pZCAqYmFzZXYsIHZvaWQgKm92ZXJyaWRlc3YpCi17Ci0gICAgYWxpYXNfZGlyX2NvbmYgKmEgPQotICAgIChhbGlhc19kaXJfY29uZiAqKSBhcF9wY2FsbG9jKHAsIHNpemVvZihhbGlhc19kaXJfY29uZikpOwotICAgIGFsaWFzX2Rpcl9jb25mICpiYXNlID0gKGFsaWFzX2Rpcl9jb25mICopIGJhc2V2LCAqb3ZlcnJpZGVzID0gKGFsaWFzX2Rpcl9jb25mICopIG92ZXJyaWRlc3Y7Ci0gICAgYS0+cmVkaXJlY3RzID0gYXBfYXBwZW5kX2FycmF5cyhwLCBvdmVycmlkZXMtPnJlZGlyZWN0cywgYmFzZS0+cmVkaXJlY3RzKTsKLSAgICByZXR1cm4gYTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmFkZF9hbGlhc19pbnRlcm5hbChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmYsIGNoYXIgKnIsCi0JCQkJICAgICAgaW50IHVzZV9yZWdleCkKLXsKLSAgICBzZXJ2ZXJfcmVjICpzID0gY21kLT5zZXJ2ZXI7Ci0gICAgYWxpYXNfc2VydmVyX2NvbmYgKmNvbmYgPQotICAgIChhbGlhc19zZXJ2ZXJfY29uZiAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAmYWxpYXNfbW9kdWxlKTsKLSAgICBhbGlhc19lbnRyeSAqbmV3ID0gYXBfcHVzaF9hcnJheShjb25mLT5hbGlhc2VzKTsKLQotICAgIC8qIFhYIHIgY2FuIE5PVCBiZSByZWxhdGl2ZSB0byBEb2N1bWVudFJvb3QgaGVyZS4uLiBjb21wYXQgYnVnLiAqLwotCi0gICAgaWYgKHVzZV9yZWdleCkgewotCW5ldy0+cmVnZXhwID0gYXBfcHJlZ2NvbXAoY21kLT5wb29sLCBmLCBSRUdfRVhURU5ERUQpOwotCWlmIChuZXctPnJlZ2V4cCA9PSBOVUxMKQotCSAgICByZXR1cm4gIlJlZ3VsYXIgZXhwcmVzc2lvbiBjb3VsZCBub3QgYmUgY29tcGlsZWQuIjsKLSAgICB9Ci0KLSAgICBuZXctPmZha2UgPSBmOwotICAgIG5ldy0+cmVhbCA9IHI7Ci0gICAgbmV3LT5oYW5kbGVyID0gY21kLT5pbmZvOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICphZGRfYWxpYXMoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICpmLCBjaGFyICpyKQotewotICAgIHJldHVybiBhZGRfYWxpYXNfaW50ZXJuYWwoY21kLCBkdW1teSwgZiwgciwgMCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICphZGRfYWxpYXNfcmVnZXgoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICpmLCBjaGFyICpyKQotewotICAgIHJldHVybiBhZGRfYWxpYXNfaW50ZXJuYWwoY21kLCBkdW1teSwgZiwgciwgMSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICphZGRfcmVkaXJlY3RfaW50ZXJuYWwoY21kX3Bhcm1zICpjbWQsIGFsaWFzX2Rpcl9jb25mICogZGlyY29uZiwKLQkJCQkJIGNoYXIgKmFyZzEsIGNoYXIgKmFyZzIsIGNoYXIgKmFyZzMsCi0JCQkJCSBpbnQgdXNlX3JlZ2V4KQotewotICAgIGFsaWFzX2VudHJ5ICpuZXc7Ci0gICAgc2VydmVyX3JlYyAqcyA9IGNtZC0+c2VydmVyOwotICAgIGFsaWFzX3NlcnZlcl9jb25mICpzZXJ2ZXJjb25mID0KLSAgICAoYWxpYXNfc2VydmVyX2NvbmYgKikgYXBfZ2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywgJmFsaWFzX21vZHVsZSk7Ci0gICAgaW50IHN0YXR1cyA9IChpbnQpIChsb25nKSBjbWQtPmluZm87Ci0gICAgcmVnZXhfdCAqciA9IE5VTEw7Ci0gICAgY2hhciAqZiA9IGFyZzI7Ci0gICAgY2hhciAqdXJsID0gYXJnMzsKLQotICAgIGlmICghc3RyY2FzZWNtcChhcmcxLCAiZ29uZSIpKQotCXN0YXR1cyA9IEhUVFBfR09ORTsKLSAgICBlbHNlIGlmICghc3RyY2FzZWNtcChhcmcxLCAicGVybWFuZW50IikpCi0Jc3RhdHVzID0gSFRUUF9NT1ZFRF9QRVJNQU5FTlRMWTsKLSAgICBlbHNlIGlmICghc3RyY2FzZWNtcChhcmcxLCAidGVtcCIpKQotCXN0YXR1cyA9IEhUVFBfTU9WRURfVEVNUE9SQVJJTFk7Ci0gICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJnMSwgInNlZW90aGVyIikpCi0Jc3RhdHVzID0gSFRUUF9TRUVfT1RIRVI7Ci0gICAgZWxzZSBpZiAoYXBfaXNkaWdpdCgqYXJnMSkpCi0Jc3RhdHVzID0gYXRvaShhcmcxKTsKLSAgICBlbHNlIHsKLQlmID0gYXJnMTsKLQl1cmwgPSBhcmcyOwotICAgIH0KLQotICAgIGlmICh1c2VfcmVnZXgpIHsKLQlyID0gYXBfcHJlZ2NvbXAoY21kLT5wb29sLCBmLCBSRUdfRVhURU5ERUQpOwotCWlmIChyID09IE5VTEwpCi0JICAgIHJldHVybiAiUmVndWxhciBleHByZXNzaW9uIGNvdWxkIG5vdCBiZSBjb21waWxlZC4iOwotICAgIH0KLQotICAgIGlmIChhcF9pc19IVFRQX1JFRElSRUNUKHN0YXR1cykpIHsKLQlpZiAoIXVybCkKLQkgICAgcmV0dXJuICJVUkwgdG8gcmVkaXJlY3QgdG8gaXMgbWlzc2luZyI7Ci0JaWYgKCF1c2VfcmVnZXggJiYgIWFwX2lzX3VybCh1cmwpKQotCSAgICByZXR1cm4gIlJlZGlyZWN0IHRvIG5vbi1VUkwiOwotICAgIH0KLSAgICBlbHNlIHsKLQlpZiAodXJsKQotCSAgICByZXR1cm4gIlJlZGlyZWN0IFVSTCBub3QgdmFsaWQgZm9yIHRoaXMgc3RhdHVzIjsKLSAgICB9Ci0KLSAgICBpZiAoY21kLT5wYXRoKQotCW5ldyA9IGFwX3B1c2hfYXJyYXkoZGlyY29uZi0+cmVkaXJlY3RzKTsKLSAgICBlbHNlCi0JbmV3ID0gYXBfcHVzaF9hcnJheShzZXJ2ZXJjb25mLT5yZWRpcmVjdHMpOwotCi0gICAgbmV3LT5mYWtlID0gZjsKLSAgICBuZXctPnJlYWwgPSB1cmw7Ci0gICAgbmV3LT5yZWdleHAgPSByOwotICAgIG5ldy0+cmVkaXJfc3RhdHVzID0gc3RhdHVzOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqYWRkX3JlZGlyZWN0KGNtZF9wYXJtcyAqY21kLCBhbGlhc19kaXJfY29uZiAqIGRpcmNvbmYsIGNoYXIgKmFyZzEsCi0JCQkJY2hhciAqYXJnMiwgY2hhciAqYXJnMykKLXsKLSAgICByZXR1cm4gYWRkX3JlZGlyZWN0X2ludGVybmFsKGNtZCwgZGlyY29uZiwgYXJnMSwgYXJnMiwgYXJnMywgMCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICphZGRfcmVkaXJlY3RfcmVnZXgoY21kX3Bhcm1zICpjbWQsIGFsaWFzX2Rpcl9jb25mICogZGlyY29uZiwKLQkJCQkgICAgICBjaGFyICphcmcxLCBjaGFyICphcmcyLCBjaGFyICphcmczKQotewotICAgIHJldHVybiBhZGRfcmVkaXJlY3RfaW50ZXJuYWwoY21kLCBkaXJjb25mLCBhcmcxLCBhcmcyLCBhcmczLCAxKTsKLX0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIGFsaWFzX2NtZHNbXSA9Ci17Ci0gICAgeyJBbGlhcyIsIGFkZF9hbGlhcywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMiwKLSAgICAgImEgZmFrZW5hbWUgYW5kIGEgcmVhbG5hbWUifSwKLSAgICB7IlNjcmlwdEFsaWFzIiwgYWRkX2FsaWFzLCAiY2dpLXNjcmlwdCIsIFJTUkNfQ09ORiwgVEFLRTIsCi0gICAgICJhIGZha2VuYW1lIGFuZCBhIHJlYWxuYW1lIn0sCi0gICAgeyJSZWRpcmVjdCIsIGFkZF9yZWRpcmVjdCwgKHZvaWQgKikgSFRUUF9NT1ZFRF9URU1QT1JBUklMWSwKLSAgICAgT1JfRklMRUlORk8sIFRBS0UyMywKLSAgImFuIG9wdGlvbmFsIHN0YXR1cywgdGhlbiBkb2N1bWVudCB0byBiZSByZWRpcmVjdGVkIGFuZCBkZXN0aW5hdGlvbiBVUkwifSwKLSAgICB7IkFsaWFzTWF0Y2giLCBhZGRfYWxpYXNfcmVnZXgsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTIsCi0gICAgICJhIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgYSBmaWxlbmFtZSJ9LAotICAgIHsiU2NyaXB0QWxpYXNNYXRjaCIsIGFkZF9hbGlhc19yZWdleCwgImNnaS1zY3JpcHQiLCBSU1JDX0NPTkYsIFRBS0UyLAotICAgICAiYSByZWd1bGFyIGV4cHJlc3Npb24gYW5kIGEgZmlsZW5hbWUifSwKLSAgICB7IlJlZGlyZWN0TWF0Y2giLCBhZGRfcmVkaXJlY3RfcmVnZXgsICh2b2lkICopIEhUVFBfTU9WRURfVEVNUE9SQVJJTFksCi0gICAgIE9SX0ZJTEVJTkZPLCBUQUtFMjMsCi0gICAgICJhbiBvcHRpb25hbCBzdGF0dXMsIHRoZW4gYSByZWd1bGFyIGV4cHJlc3Npb24gYW5kIGRlc3RpbmF0aW9uIFVSTCJ9LAotICAgIHsiUmVkaXJlY3RUZW1wIiwgYWRkX3JlZGlyZWN0LCAodm9pZCAqKSBIVFRQX01PVkVEX1RFTVBPUkFSSUxZLAotICAgICBPUl9GSUxFSU5GTywgVEFLRTIsCi0gICAgICJhIGRvY3VtZW50IHRvIGJlIHJlZGlyZWN0ZWQsIHRoZW4gdGhlIGRlc3RpbmF0aW9uIFVSTCJ9LAotICAgIHsiUmVkaXJlY3RQZXJtYW5lbnQiLCBhZGRfcmVkaXJlY3QsICh2b2lkICopIEhUVFBfTU9WRURfUEVSTUFORU5UTFksCi0gICAgIE9SX0ZJTEVJTkZPLCBUQUtFMiwKLSAgICAgImEgZG9jdW1lbnQgdG8gYmUgcmVkaXJlY3RlZCwgdGhlbiB0aGUgZGVzdGluYXRpb24gVVJMIn0sCi0gICAge05VTEx9Ci19OwotCi1zdGF0aWMgaW50IGFsaWFzX21hdGNoZXMoY29uc3QgY2hhciAqdXJpLCBjb25zdCBjaGFyICphbGlhc19mYWtlbmFtZSkKLXsKLSAgICBjb25zdCBjaGFyICplbmRfZmFrZW5hbWUgPSBhbGlhc19mYWtlbmFtZSArIHN0cmxlbihhbGlhc19mYWtlbmFtZSk7Ci0gICAgY29uc3QgY2hhciAqYWxpYXNwID0gYWxpYXNfZmFrZW5hbWUsICp1cmlwID0gdXJpOwotCi0gICAgd2hpbGUgKGFsaWFzcCA8IGVuZF9mYWtlbmFtZSkgewotCWlmICgqYWxpYXNwID09ICcvJykgewotCSAgICAvKiBhbnkgbnVtYmVyIG9mICcvJyBpbiB0aGUgYWxpYXMgbWF0Y2hlcyBhbnkgbnVtYmVyIGluCi0JICAgICAqIHRoZSBzdXBwbGllZCBVUkksIGJ1dCB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZS4uLgotCSAgICAgKi8KLQkgICAgaWYgKCp1cmlwICE9ICcvJykKLQkJcmV0dXJuIDA7Ci0KLQkgICAgd2hpbGUgKCphbGlhc3AgPT0gJy8nKQotCQkrK2FsaWFzcDsKLQkgICAgd2hpbGUgKCp1cmlwID09ICcvJykKLQkJKyt1cmlwOwotCX0KLQllbHNlIHsKLQkgICAgLyogT3RoZXIgY2hhcmFjdGVycyBhcmUgY29tcGFyZWQgbGl0ZXJhbGx5ICovCi0JICAgIGlmICgqdXJpcCsrICE9ICphbGlhc3ArKykKLQkJcmV0dXJuIDA7Ci0JfQotICAgIH0KLQotICAgIC8qIENoZWNrIGxhc3QgYWxpYXMgcGF0aCBjb21wb25lbnQgbWF0Y2hlZCBhbGwgdGhlIHdheSAqLwotCi0gICAgaWYgKGFsaWFzcFstMV0gIT0gJy8nICYmICp1cmlwICE9ICdcMCcgJiYgKnVyaXAgIT0gJy8nKQotCXJldHVybiAwOwotCi0gICAgLyogUmV0dXJuIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gVVJJIHdoaWNoIG1hdGNoZWQgKG1heSBiZQotICAgICAqIGdyZWF0ZXIgdGhhbiBsZW5ndGggb2YgYWxpYXMsIHNpbmNlIHdlIG1heSBoYXZlIG1hdGNoZWQKLSAgICAgKiBkb3VibGVkIHNsYXNoZXMpCi0gICAgICovCi0KLSAgICByZXR1cm4gdXJpcCAtIHVyaTsKLX0KLQotc3RhdGljIGNoYXIgKnRyeV9hbGlhc19saXN0KHJlcXVlc3RfcmVjICpyLCBhcnJheV9oZWFkZXIgKmFsaWFzZXMsIGludCBkb2VzYywgaW50ICpzdGF0dXMpCi17Ci0gICAgYWxpYXNfZW50cnkgKmVudHJpZXMgPSAoYWxpYXNfZW50cnkgKikgYWxpYXNlcy0+ZWx0czsKLSAgICByZWdtYXRjaF90IHJlZ21bMTBdOwotICAgIGNoYXIgKmZvdW5kID0gTlVMTDsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBhbGlhc2VzLT5uZWx0czsgKytpKSB7Ci0JYWxpYXNfZW50cnkgKnAgPSAmZW50cmllc1tpXTsKLQlpbnQgbDsKLQotCWlmIChwLT5yZWdleHApIHsKLQkgICAgaWYgKCFhcF9yZWdleGVjKHAtPnJlZ2V4cCwgci0+dXJpLCBwLT5yZWdleHAtPnJlX25zdWIgKyAxLCByZWdtLCAwKSkgewotCQlpZiAocC0+cmVhbCkgewotCQkgICAgZm91bmQgPSBhcF9wcmVnc3ViKHItPnBvb2wsIHAtPnJlYWwsIHItPnVyaSwKLQkJCQkgICAgcC0+cmVnZXhwLT5yZV9uc3ViICsgMSwgcmVnbSk7Ci0JCSAgICBpZiAoZm91bmQgJiYgZG9lc2MpIHsKLQkJCWZvdW5kID0gYXBfZXNjYXBlX3VyaShyLT5wb29sLCBmb3VuZCk7Ci0JCSAgICB9Ci0JCX0KLQkJZWxzZSB7Ci0JCSAgICAvKiBuZWVkIHNvbWV0aGluZyBub24tbnVsbCAqLwotCQkgICAgZm91bmQgPSBhcF9wc3RyZHVwKHItPnBvb2wsICIiKTsKLQkJfQotCSAgICB9Ci0JfQotCWVsc2UgewotCSAgICBsID0gYWxpYXNfbWF0Y2hlcyhyLT51cmksIHAtPmZha2UpOwotCi0JICAgIGlmIChsID4gMCkgewotCQlpZiAoZG9lc2MpIHsKLQkJICAgIGNoYXIgKmVzY3VybDsKLQkJICAgIGVzY3VybCA9IGFwX29zX2VzY2FwZV9wYXRoKHItPnBvb2wsIHItPnVyaSArIGwsIDEpOwotCi0JCSAgICBmb3VuZCA9IGFwX3BzdHJjYXQoci0+cG9vbCwgcC0+cmVhbCwgZXNjdXJsLCBOVUxMKTsKLQkJfQotCQllbHNlCi0JCSAgICBmb3VuZCA9IGFwX3BzdHJjYXQoci0+cG9vbCwgcC0+cmVhbCwgci0+dXJpICsgbCwgTlVMTCk7Ci0JICAgIH0KLQl9Ci0KLQlpZiAoZm91bmQpIHsKLQkgICAgaWYgKHAtPmhhbmRsZXIpIHsJLyogU2V0IGhhbmRsZXIsIGFuZCBsZWF2ZSBhIG5vdGUgZm9yIG1vZF9jZ2kgKi8KLQkJci0+aGFuZGxlciA9IHAtPmhhbmRsZXI7Ci0JCWFwX3RhYmxlX3NldG4oci0+bm90ZXMsICJhbGlhcy1mb3JjZWQtdHlwZSIsIHItPmhhbmRsZXIpOwotCSAgICB9Ci0KLQkgICAgKnN0YXR1cyA9IHAtPnJlZGlyX3N0YXR1czsKLQotCSAgICByZXR1cm4gZm91bmQ7Ci0JfQotCi0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgdHJhbnNsYXRlX2FsaWFzX3JlZGlyKHJlcXVlc3RfcmVjICpyKQotewotICAgIHZvaWQgKnNjb25mID0gci0+c2VydmVyLT5tb2R1bGVfY29uZmlnOwotICAgIGFsaWFzX3NlcnZlcl9jb25mICpzZXJ2ZXJjb25mID0KLSAgICAoYWxpYXNfc2VydmVyX2NvbmYgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoc2NvbmYsICZhbGlhc19tb2R1bGUpOwotICAgIGNoYXIgKnJldDsKLSAgICBpbnQgc3RhdHVzOwotCi0gICAgaWYgKHItPnVyaVswXSAhPSAnLycgJiYgci0+dXJpWzBdICE9ICdcMCcpCi0JcmV0dXJuIERFQ0xJTkVEOwotCi0gICAgaWYgKChyZXQgPSB0cnlfYWxpYXNfbGlzdChyLCBzZXJ2ZXJjb25mLT5yZWRpcmVjdHMsIDEsICZzdGF0dXMpKSAhPSBOVUxMKSB7Ci0JaWYgKGFwX2lzX0hUVFBfUkVESVJFQ1Qoc3RhdHVzKSkgewotCSAgICAvKiBpbmNsdWRlIFFVRVJZX1NUUklORyBpZiBhbnkgKi8KLQkgICAgaWYgKHItPmFyZ3MpIHsKLQkJcmV0ID0gYXBfcHN0cmNhdChyLT5wb29sLCByZXQsICI/Iiwgci0+YXJncywgTlVMTCk7Ci0JICAgIH0KLQkgICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkxvY2F0aW9uIiwgcmV0KTsKLQl9Ci0JcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBpZiAoKHJldCA9IHRyeV9hbGlhc19saXN0KHIsIHNlcnZlcmNvbmYtPmFsaWFzZXMsIDAsICZzdGF0dXMpKSAhPSBOVUxMKSB7Ci0Jci0+ZmlsZW5hbWUgPSByZXQ7Ci0JcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotc3RhdGljIGludCBmaXh1cF9yZWRpcihyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICB2b2lkICpkY29uZiA9IHItPnBlcl9kaXJfY29uZmlnOwotICAgIGFsaWFzX2Rpcl9jb25mICpkaXJjb25mID0KLSAgICAoYWxpYXNfZGlyX2NvbmYgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoZGNvbmYsICZhbGlhc19tb2R1bGUpOwotICAgIGNoYXIgKnJldDsKLSAgICBpbnQgc3RhdHVzOwotCi0gICAgLyogSXQgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSBsYXN0IHRpbWUsIHNvIHRyeSBhZ2FpbiAqLwotCi0gICAgaWYgKChyZXQgPSB0cnlfYWxpYXNfbGlzdChyLCBkaXJjb25mLT5yZWRpcmVjdHMsIDEsICZzdGF0dXMpKSAhPSBOVUxMKSB7Ci0JaWYgKGFwX2lzX0hUVFBfUkVESVJFQ1Qoc3RhdHVzKSkKLQkgICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkxvY2F0aW9uIiwgcmV0KTsKLQlyZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGFsaWFzX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkRfTU9EVUxFX1NUVUZGLAotICAgIE5VTEwsCQkJLyogaW5pdGlhbGl6ZXIgKi8KLSAgICBjcmVhdGVfYWxpYXNfZGlyX2NvbmZpZywJLyogZGlyIGNvbmZpZyBjcmVhdGVyICovCi0gICAgbWVyZ2VfYWxpYXNfZGlyX2NvbmZpZywJLyogZGlyIG1lcmdlciAtLS0gZGVmYXVsdCBpcyB0byBvdmVycmlkZSAqLwotICAgIGNyZWF0ZV9hbGlhc19jb25maWcsCS8qIHNlcnZlciBjb25maWcgKi8KLSAgICBtZXJnZV9hbGlhc19jb25maWcsCQkvKiBtZXJnZSBzZXJ2ZXIgY29uZmlncyAqLwotICAgIGFsaWFzX2NtZHMsCQkJLyogY29tbWFuZCB0YWJsZSAqLwotICAgIE5VTEwsCQkJLyogaGFuZGxlcnMgKi8KLSAgICB0cmFuc2xhdGVfYWxpYXNfcmVkaXIsCS8qIGZpbGVuYW1lIHRyYW5zbGF0aW9uICovCi0gICAgTlVMTCwJCQkvKiBjaGVja191c2VyX2lkICovCi0gICAgTlVMTCwJCQkvKiBjaGVjayBhdXRoICovCi0gICAgTlVMTCwJCQkvKiBjaGVjayBhY2Nlc3MgKi8KLSAgICBOVUxMLAkJCS8qIHR5cGVfY2hlY2tlciAqLwotICAgIGZpeHVwX3JlZGlyLAkJLyogZml4dXBzICovCi0gICAgTlVMTCwJCQkvKiBsb2dnZXIgKi8KLSAgICBOVUxMLAkJCS8qIGhlYWRlciBwYXJzZXIgKi8KLSAgICBOVUxMLAkJCS8qIGNoaWxkX2luaXQgKi8KLSAgICBOVUxMLAkJCS8qIGNoaWxkX2V4aXQgKi8KLSAgICBOVUxMCQkJLyogcG9zdCByZWFkLXJlcXVlc3QgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL21hcHBlcnMvbW9kX2FsaWFzLmRzcCBiL21vZHVsZXMvbWFwcGVycy9tb2RfYWxpYXMuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDljN2FmLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWFwcGVycy9tb2RfYWxpYXMuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ibW9kX2FsaWFzIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDIKLQotQ0ZHPW1vZF9hbGlhcyAtIFdpbjMyIFJlbGVhc2UKLSFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAibW9kX2FsaWFzLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAibW9kX2FsaWFzLm1hayIgQ0ZHPSJtb2RfYWxpYXMgLSBXaW4zMiBSZWxlYXNlIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgIm1vZF9hbGlhcyAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgIm1vZF9hbGlhcyAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwCi0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotTVRMPW1pZGwuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9hbGlhcyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0kgIi4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9GZCJSZWxlYXNlXG1vZF9hbGlhcyIgL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9tYWNoaW5lOkkzODYgL291dDoiUmVsZWFzZS9tb2RfYWxpYXMuc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX2FsaWFzCi0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvbWFjaGluZTpJMzg2IC9vdXQ6IlJlbGVhc2UvbW9kX2FsaWFzLnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF9hbGlhcwotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibW9kX2FsaWFzIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HWCAvWmkgL09kIC9JICIuLi8uLi9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci11dGlsL2luY2x1ZGUiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRmQiRGVidWdcbW9kX2FsaWFzIiAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9pbmNyZW1lbnRhbDpubyAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6IkRlYnVnL21vZF9hbGlhcy5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfYWxpYXMKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvaW5jcmVtZW50YWw6bm8gL21hcCAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJEZWJ1Zy9tb2RfYWxpYXMuc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX2FsaWFzCi0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJtb2RfYWxpYXMgLSBXaW4zMiBSZWxlYXNlIgotIyBOYW1lICJtb2RfYWxpYXMgLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kX2FsaWFzLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZF9hbGlhcy5yYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXGJ1aWxkXHdpbjMyXHdpbjMydmVyLmF3awotCi0hSUYgICIkKENGRykiID09ICJtb2RfYWxpYXMgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIENyZWF0aW5nIFZlcnNpb24gUmVzb3VyY2UKLUlucHV0UGF0aD0uLlwuLlxidWlsZFx3aW4zMlx3aW4zMnZlci5hd2sKLQotIi5cbW9kX2FsaWFzLnJjIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCWF3ayAtZiAuLi8uLi9idWlsZC93aW4zMi93aW4zMnZlci5hd2sgbW9kX2FsaWFzICAiYWxpYXNfbW9kdWxlIGZvciBBcGFjaGUiIC4uLy4uL2luY2x1ZGUvYXBfcmVsZWFzZS5oID4gLlxtb2RfYWxpYXMucmMKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJtb2RfYWxpYXMgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBDcmVhdGluZyBWZXJzaW9uIFJlc291cmNlCi1JbnB1dFBhdGg9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSIuXG1vZF9hbGlhcy5yYyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQlhd2sgLWYgLi4vLi4vYnVpbGQvd2luMzIvd2luMzJ2ZXIuYXdrIG1vZF9hbGlhcyAgImFsaWFzX21vZHVsZSBmb3IgQXBhY2hlIiAuLi8uLi9pbmNsdWRlL2FwX3JlbGVhc2UuaCA+IC5cbW9kX2FsaWFzLnJjCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWFwcGVycy9tb2RfYWxpYXMuZXhwIGIvbW9kdWxlcy9tYXBwZXJzL21vZF9hbGlhcy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMzg2ZWMuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tYXBwZXJzL21vZF9hbGlhcy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1hbGlhc19tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWFwcGVycy9tb2RfZGlyLmMgYi9tb2R1bGVzL21hcHBlcnMvbW9kX2Rpci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzJiMzkwLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWFwcGVycy9tb2RfZGlyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogbW9kX2Rpci5jOiBoYW5kbGUgZGVmYXVsdCBpbmRleCBmaWxlcywgYW5kIHRyYWlsaW5nLS8gcmVkaXJlY3RzCi0gKi8KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX21haW4uaCIKLSNpbmNsdWRlICJ1dGlsX3NjcmlwdC5oIgotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgZGlyX21vZHVsZTsKLQotdHlwZWRlZiBzdHJ1Y3QgZGlyX2NvbmZpZ19zdHJ1Y3QgewotICAgIGFycmF5X2hlYWRlciAqaW5kZXhfbmFtZXM7Ci19IGRpcl9jb25maWdfcmVjOwotCi0jZGVmaW5lIERJUl9DTURfUEVSTVMgT1JfSU5ERVhFUwotCi1zdGF0aWMgY29uc3QgY2hhciAqYWRkX2luZGV4KGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGRpcl9jb25maWdfcmVjICpkID0gZHVtbXk7Ci0KLSAgICBpZiAoIWQtPmluZGV4X25hbWVzKSB7Ci0JZC0+aW5kZXhfbmFtZXMgPSBhcF9tYWtlX2FycmF5KGNtZC0+cG9vbCwgMiwgc2l6ZW9mKGNoYXIgKikpOwotICAgIH0KLSAgICAqKGNoYXIgKiopYXBfcHVzaF9hcnJheShkLT5pbmRleF9uYW1lcykgPSBhcmc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBkaXJfY21kc1tdID0KLXsKLSAgICB7IkRpcmVjdG9yeUluZGV4IiwgYWRkX2luZGV4LCBOVUxMLAotICAgICBESVJfQ01EX1BFUk1TLCBJVEVSQVRFLAotICAgICAiYSBsaXN0IG9mIGZpbGUgbmFtZXMifSwKLSAgICB7TlVMTH0KLX07Ci0KLXN0YXRpYyB2b2lkICpjcmVhdGVfZGlyX2NvbmZpZyhwb29sICpwLCBjaGFyICpkdW1teSkKLXsKLSAgICBkaXJfY29uZmlnX3JlYyAqbmV3ID0KLSAgICAoZGlyX2NvbmZpZ19yZWMgKikgYXBfcGNhbGxvYyhwLCBzaXplb2YoZGlyX2NvbmZpZ19yZWMpKTsKLQotICAgIG5ldy0+aW5kZXhfbmFtZXMgPSBOVUxMOwotICAgIHJldHVybiAodm9pZCAqKSBuZXc7Ci19Ci0KLXN0YXRpYyB2b2lkICptZXJnZV9kaXJfY29uZmlncyhwb29sICpwLCB2b2lkICpiYXNldiwgdm9pZCAqYWRkdikKLXsKLSAgICBkaXJfY29uZmlnX3JlYyAqbmV3ID0gKGRpcl9jb25maWdfcmVjICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKGRpcl9jb25maWdfcmVjKSk7Ci0gICAgZGlyX2NvbmZpZ19yZWMgKmJhc2UgPSAoZGlyX2NvbmZpZ19yZWMgKikgYmFzZXY7Ci0gICAgZGlyX2NvbmZpZ19yZWMgKmFkZCA9IChkaXJfY29uZmlnX3JlYyAqKSBhZGR2OwotCi0gICAgbmV3LT5pbmRleF9uYW1lcyA9IGFkZC0+aW5kZXhfbmFtZXMgPyBhZGQtPmluZGV4X25hbWVzIDogYmFzZS0+aW5kZXhfbmFtZXM7Ci0gICAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIGludCBoYW5kbGVfZGlyKHJlcXVlc3RfcmVjICpyKQotewotICAgIGRpcl9jb25maWdfcmVjICpkID0KLSAgICAoZGlyX2NvbmZpZ19yZWMgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJfbW9kdWxlKTsKLSAgICBjaGFyICpkdW1teV9wdHJbMV07Ci0gICAgY2hhciAqKm5hbWVzX3B0cjsKLSAgICBpbnQgbnVtX25hbWVzOwotICAgIGludCBlcnJvcl9ub3Rmb3VuZCA9IDA7Ci0KLSAgICBpZiAoci0+dXJpWzBdID09ICdcMCcgfHwgci0+dXJpW3N0cmxlbihyLT51cmkpIC0gMV0gIT0gJy8nKSB7Ci0gICAgICAgIGNoYXIgKmlmaWxlOwotICAgICAgICBpZiAoci0+YXJncyAhPSBOVUxMKQotICAgICAgICAgICAgaWZpbGUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIGFwX2VzY2FwZV91cmkoci0+cG9vbCwgci0+dXJpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIsICI/Iiwgci0+YXJncywgTlVMTCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGlmaWxlID0gYXBfcHN0cmNhdChyLT5wb29sLCBhcF9lc2NhcGVfdXJpKHItPnBvb2wsIHItPnVyaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8iLCBOVUxMKTsKLQotICAgICAgICBhcF90YWJsZV9zZXRuKHItPmhlYWRlcnNfb3V0LCAiTG9jYXRpb24iLAotICAgICAgICAgICAgICAgICAgYXBfY29uc3RydWN0X3VybChyLT5wb29sLCBpZmlsZSwgcikpOwotICAgICAgICByZXR1cm4gSFRUUF9NT1ZFRF9QRVJNQU5FTlRMWTsKLSAgICB9Ci0KLSAgICAvKiBLTFVER0UgLS0tIG1ha2UgdGhlIHN1Yl9yZXEgbG9va3VwcyBoYXBwZW4gaW4gdGhlIHJpZ2h0IGRpcmVjdG9yeS4KLSAgICAgKiBGaXhpbmcgdGhpcyBpbiB0aGUgc3ViX3JlcV9sb29rdXAgZnVuY3Rpb25zIHRoZW1zZWx2ZXMgaXMgZGlmZmljdWx0LAotICAgICAqIGFuZCB3b3VsZCBwcm9iYWJseSBicmVhayB2aXJ0dWFsIGluY2x1ZGVzLi4uCi0gICAgICovCi0KLSAgICBpZiAoci0+ZmlsZW5hbWVbc3RybGVuKHItPmZpbGVuYW1lKSAtIDFdICE9ICcvJykgewotICAgICAgICByLT5maWxlbmFtZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgci0+ZmlsZW5hbWUsICIvIiwgTlVMTCk7Ci0gICAgfQotCi0gICAgaWYgKGQtPmluZGV4X25hbWVzKSB7Ci0JbmFtZXNfcHRyID0gKGNoYXIgKiopZC0+aW5kZXhfbmFtZXMtPmVsdHM7Ci0JbnVtX25hbWVzID0gZC0+aW5kZXhfbmFtZXMtPm5lbHRzOwotICAgIH0KLSAgICBlbHNlIHsKLQlkdW1teV9wdHJbMF0gPSBERUZBVUxUX0lOREVYOwotCW5hbWVzX3B0ciA9IGR1bW15X3B0cjsKLQludW1fbmFtZXMgPSAxOwotICAgIH0KLQotICAgIGZvciAoOyBudW1fbmFtZXM7ICsrbmFtZXNfcHRyLCAtLW51bV9uYW1lcykgewotICAgICAgICBjaGFyICpuYW1lX3B0ciA9ICpuYW1lc19wdHI7Ci0gICAgICAgIHJlcXVlc3RfcmVjICpyciA9IGFwX3N1Yl9yZXFfbG9va3VwX3VyaShuYW1lX3B0ciwgcik7Ci0KLSAgICAgICAgaWYgKHJyLT5zdGF0dXMgPT0gSFRUUF9PSyAmJiBTX0lTUkVHKHJyLT5maW5mby5zdF9tb2RlKSkgewotICAgICAgICAgICAgY2hhciAqbmV3X3VyaSA9IGFwX2VzY2FwZV91cmkoci0+cG9vbCwgcnItPnVyaSk7Ci0KLSAgICAgICAgICAgIGlmIChyci0+YXJncyAhPSBOVUxMKQotICAgICAgICAgICAgICAgIG5ld191cmkgPSBhcF9wc3RyY2F0KHItPnBvb2wsIG5ld191cmksICI/IiwgcnItPmFyZ3MsIE5VTEwpOwotICAgICAgICAgICAgZWxzZSBpZiAoci0+YXJncyAhPSBOVUxMKQotICAgICAgICAgICAgICAgIG5ld191cmkgPSBhcF9wc3RyY2F0KHItPnBvb2wsIG5ld191cmksICI/Iiwgci0+YXJncywgTlVMTCk7Ci0KLSAgICAgICAgICAgIGFwX2Rlc3Ryb3lfc3ViX3JlcShycik7Ci0gICAgICAgICAgICBhcF9pbnRlcm5hbF9yZWRpcmVjdChuZXdfdXJpLCByKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIElmIHRoZSByZXF1ZXN0IHJldHVybmVkIGEgcmVkaXJlY3QsIHByb3BhZ2F0ZSBpdCB0byB0aGUgY2xpZW50ICovCi0KLSAgICAgICAgaWYgKGFwX2lzX0hUVFBfUkVESVJFQ1QocnItPnN0YXR1cykgfHwKLSAgICAgICAgICAgIChyci0+c3RhdHVzID09IEhUVFBfTk9UX0FDQ0VQVEFCTEUgJiYgbnVtX25hbWVzID09IDEpKSB7Ci0KLSAgICAgICAgICAgIGFwX3Bvb2xfam9pbihyLT5wb29sLCByci0+cG9vbCk7Ci0gICAgICAgICAgICBlcnJvcl9ub3Rmb3VuZCA9IHJyLT5zdGF0dXM7Ci0gICAgICAgICAgICByLT5ub3RlcyA9IGFwX292ZXJsYXlfdGFibGVzKHItPnBvb2wsIHItPm5vdGVzLCByci0+bm90ZXMpOwotICAgICAgICAgICAgci0+aGVhZGVyc19vdXQgPSBhcF9vdmVybGF5X3RhYmxlcyhyLT5wb29sLCByLT5oZWFkZXJzX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnItPmhlYWRlcnNfb3V0KTsKLSAgICAgICAgICAgIHItPmVycl9oZWFkZXJzX291dCA9IGFwX292ZXJsYXlfdGFibGVzKHItPnBvb2wsIHItPmVycl9oZWFkZXJzX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJyLT5lcnJfaGVhZGVyc19vdXQpOwotICAgICAgICAgICAgcmV0dXJuIGVycm9yX25vdGZvdW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSWYgdGhlIHJlcXVlc3QgcmV0dXJuZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gNDA0IChvciAyMDApLAotICAgICAgICAgKiBpdCBtZWFucyB0aGUgbW9kdWxlIGVuY291bnRlcmVkIHNvbWUgc29ydCBvZiBwcm9ibGVtLiBUbyBiZQotICAgICAgICAgKiBzZWN1cmUsIHdlIHNob3VsZCByZXR1cm4gdGhlIGVycm9yLCByYXRoZXIgdGhhbiBjcmVhdGUKLSAgICAgICAgICogYWxvbmcgYSAocG9zc2libHkgdW5zYWZlKSBkaXJlY3RvcnkgaW5kZXguCi0gICAgICAgICAqCi0gICAgICAgICAqIFNvIHdlIHN0b3JlIHRoZSBlcnJvciwgYW5kIGlmIG5vbmUgb2YgdGhlIGxpc3RlZCBmaWxlcwotICAgICAgICAgKiBleGlzdCwgd2UgcmV0dXJuIHRoZSBsYXN0IGVycm9yIHJlc3BvbnNlIHdlIGdvdCwgaW5zdGVhZAotICAgICAgICAgKiBvZiBhIGRpcmVjdG9yeSBsaXN0aW5nLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHJyLT5zdGF0dXMgJiYgcnItPnN0YXR1cyAhPSBIVFRQX05PVF9GT1VORCAmJiByci0+c3RhdHVzICE9IEhUVFBfT0spCi0gICAgICAgICAgICBlcnJvcl9ub3Rmb3VuZCA9IHJyLT5zdGF0dXM7Ci0KLSAgICAgICAgYXBfZGVzdHJveV9zdWJfcmVxKHJyKTsKLSAgICB9Ci0KLSAgICBpZiAoZXJyb3Jfbm90Zm91bmQpCi0gICAgICAgIHJldHVybiBlcnJvcl9ub3Rmb3VuZDsKLQotICAgIGlmIChyLT5tZXRob2RfbnVtYmVyICE9IE1fR0VUKQotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0KLSAgICAvKiBub3RoaW5nIGZvciB1cyB0byBkbywgcGFzcyBvbiB0aHJvdWdoICovCi0KLSAgICByZXR1cm4gREVDTElORUQ7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGhhbmRsZXJfcmVjIGRpcl9oYW5kbGVyc1tdID0KLXsKLSAgICB7RElSX01BR0lDX1RZUEUsIGhhbmRsZV9kaXJ9LAotICAgIHtOVUxMfQotfTsKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGRpcl9tb2R1bGUgPQotewotICAgIFNUQU5EQVJEX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZXIgKi8KLSAgICBjcmVhdGVfZGlyX2NvbmZpZywgICAgICAgICAgLyogZGlyIGNvbmZpZyBjcmVhdGVyICovCi0gICAgbWVyZ2VfZGlyX2NvbmZpZ3MsICAgICAgICAgIC8qIGRpciBtZXJnZXIgLS0tIGRlZmF1bHQgaXMgdG8gb3ZlcnJpZGUgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogc2VydmVyIGNvbmZpZyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBtZXJnZSBzZXJ2ZXIgY29uZmlnICovCi0gICAgZGlyX2NtZHMsICAgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgdGFibGUgKi8KLSAgICBkaXJfaGFuZGxlcnMsICAgICAgICAgICAgICAgLyogaGFuZGxlcnMgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsZW5hbWUgdHJhbnNsYXRpb24gKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2tfdXNlcl9pZCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBhdXRoICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGFjY2VzcyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiB0eXBlX2NoZWNrZXIgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogZml4dXBzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvZ2dlciAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBoZWFkZXIgcGFyc2VyICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoaWxkX2luaXQgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hpbGRfZXhpdCAqLwotICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb3N0IHJlYWQtcmVxdWVzdCAqLwotfTsKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWFwcGVycy9tb2RfZGlyLmRzcCBiL21vZHVsZXMvbWFwcGVycy9tb2RfZGlyLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFkMTk4ZS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21hcHBlcnMvbW9kX2Rpci5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJtb2RfZGlyIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDIKLQotQ0ZHPW1vZF9kaXIgLSBXaW4zMiBSZWxlYXNlCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIm1vZF9kaXIubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJtb2RfZGlyLm1hayIgQ0ZHPSJtb2RfZGlyIC0gV2luMzIgUmVsZWFzZSIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJtb2RfZGlyIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAibW9kX2RpciAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwCi0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotTVRMPW1pZGwuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9kaXIgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9JICIuLi8uLi9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci11dGlsL2luY2x1ZGUiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRmQiUmVsZWFzZVxtb2RfZGlyIiAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYXAgL21hY2hpbmU6STM4NiAvb3V0OiJSZWxlYXNlL21vZF9kaXIuc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX2RpcgotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYXAgL21hY2hpbmU6STM4NiAvb3V0OiJSZWxlYXNlL21vZF9kaXIuc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX2RpcgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibW9kX2RpciAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTURkIC9XMyAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTURkIC9XMyAvR1ggL1ppIC9PZCAvSSAiLi4vLi4vaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHIvaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHItdXRpbC9pbmNsdWRlIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0ZkIkRlYnVnXG1vZF9kaXIiIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2luY3JlbWVudGFsOm5vIC9tYXAgL2RlYnVnIC9tYWNoaW5lOkkzODYgL291dDoiRGVidWcvbW9kX2Rpci5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfZGlyCi0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2luY3JlbWVudGFsOm5vIC9tYXAgL2RlYnVnIC9tYWNoaW5lOkkzODYgL291dDoiRGVidWcvbW9kX2Rpci5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfZGlyCi0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJtb2RfZGlyIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAibW9kX2RpciAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2RfZGlyLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZF9kaXIucmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxidWlsZFx3aW4zMlx3aW4zMnZlci5hd2sKLQotIUlGICAiJChDRkcpIiA9PSAibW9kX2RpciAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQ3JlYXRpbmcgVmVyc2lvbiBSZXNvdXJjZQotSW5wdXRQYXRoPS4uXC4uXGJ1aWxkXHdpbjMyXHdpbjMydmVyLmF3awotCi0iLlxtb2RfZGlyLnJjIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCWF3ayAtZiAuLi8uLi9idWlsZC93aW4zMi93aW4zMnZlci5hd2sgbW9kX2RpciAgImRpcl9tb2R1bGUgZm9yIEFwYWNoZSIgLi4vLi4vaW5jbHVkZS9hcF9yZWxlYXNlLmggPiAuXG1vZF9kaXIucmMKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJtb2RfZGlyIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQ3JlYXRpbmcgVmVyc2lvbiBSZXNvdXJjZQotSW5wdXRQYXRoPS4uXC4uXGJ1aWxkXHdpbjMyXHdpbjMydmVyLmF3awotCi0iLlxtb2RfZGlyLnJjIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCWF3ayAtZiAuLi8uLi9idWlsZC93aW4zMi93aW4zMnZlci5hd2sgbW9kX2RpciAgImRpcl9tb2R1bGUgZm9yIEFwYWNoZSIgLi4vLi4vaW5jbHVkZS9hcF9yZWxlYXNlLmggPiAuXG1vZF9kaXIucmMKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tYXBwZXJzL21vZF9kaXIuZXhwIGIvbW9kdWxlcy9tYXBwZXJzL21vZF9kaXIuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmJmNzcyLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWFwcGVycy9tb2RfZGlyLmV4cAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWRpcl9tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWFwcGVycy9tb2RfaW1hcC5jIGIvbW9kdWxlcy9tYXBwZXJzL21vZF9pbWFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MTUyZTcuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tYXBwZXJzL21vZF9pbWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MTkgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUJ1MgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIFRoaXMgaW1hZ2VtYXAgbW9kdWxlIHN0YXJ0ZWQgYXMgYSBwb3J0IG9mIHRoZSBvcmlnaW5hbCBpbWFnZW1hcC5jCi0gKiB3cml0dGVuIGJ5IFJvYiBNY0Nvb2wgKDExLzEzLzkzIHJvYm1AbmNzYS51aXVjLmVkdSkuCi0gKiBUaGlzIHZlcnNpb24gaW5jbHVkZXMgdGhlIG1hcHBpbmcgYWxnb3JpdGhtcyBmb3VuZCBpbiB2ZXJzaW9uIDEuMwotICogb2YgaW1hZ2VtYXAuYy4KLSAqCi0gKiBDb250cmlidXRvcnMgdG8gdGhpcyBjb2RlIGluY2x1ZGU6Ci0gKgotICogS2V2aW4gSHVnaGVzLCBrZXZpbmhAcHVsdWEuaGNjLmhhd2FpaS5lZHUKLSAqCi0gKiBFcmljIEhhaW5lcywgZXJpY2hAZXllLmNvbQotICogIm1hY21hcnRpbml6ZWQiIHBvbHlnb24gY29kZSBjb3B5cmlnaHQgMTk5MiBieSBFcmljIEhhaW5lcywgZXJpY2hAZXllLmNvbQotICoKLSAqIFJhbmR5IFRlcmJ1c2gsIHJhbmR5QHp5enp5dmEuY29tCi0gKiBwb3J0IHRvIEFwYWNoZSBtb2R1bGUgZm9ybWF0LCAiYmFzZV91cmkiIGFuZCBzdXBwb3J0IGZvciByZWxhdGl2ZSBVUkxzCi0gKiAKLSAqIEphbWVzIEguIENsb29zLCBKci4sIGNsb29zQGpoY2xvb3MuY29tCi0gKiBBZGRlZCBwb2ludCBkYXRhdHlwZSwgdXNpbmcgY29kZSBpbiBOQ1NBJ3MgdmVyc2lvbiAxLjggaW1hZ2VtYXAuYwotICogcHJvZ3JhbSwgYXMgZGlzdHJpYnV0ZWQgd2l0aCB2ZXJzaW9uIDEuNC4xIG9mIHRoZWlyIHNlcnZlci4KLSAqIFRoZSBwb2ludCBjb2RlIGlzIG9yaWdpbmFsbHkgYWRkZWQgYnkgQ3JhaWcgTWlsbyBSb2dlcnMsIFJvZ2Vyc0BJU0kuRWR1Ci0gKgotICogTmF0aGFuIEt1cnosIG5hdGVAdHJpcG9kLmNvbQotICogUmV3cml0ZS9yZW9yZ2FuaXphdGlvbi4gIE5ldyBoYW5kbGluZyBvZiBkZWZhdWx0LCBiYXNlIGFuZCByZWxhdGl2ZSBVUkxzLiAgCi0gKiBOZXcgQ29uZmlndXJhdGlvbiBkaXJlY3RpdmVzOgotICogICAgSW1hcE1lbnUge25vbmUsIGZvcm1hdHRlZCwgc2VtaWZvcm1hdHRlZCwgdW5mb3JtYXR0ZWR9Ci0gKiAgICBJbWFwRGVmYXVsdCB7ZXJyb3IsIG5vY29udGVudCwgcmVmZXJlciwgbWVudSwgVVJMfQotICogICAgSW1hcEJhc2Uge21hcCwgcmVmZXJlciwgVVJMfQotICogU3VwcG9ydCBmb3IgY3JlYXRpbmcgbm9uLWdyYXBoaWNhbCBtZW51IGFkZGVkLiAgKGJhY2t3YXJkcyBjb21wYXRpYmxlKToKLSAqICAgIE9sZDogIGRpcmVjdGl2ZSBVUkwgW3gseSAuLi5dCi0gKiAgICBOZXc6ICBkaXJlY3RpdmUgVVJMICJNZW51IHRleHQiIFt4LHkgLi4uXQotICogICAgIG9yOiAgZGlyZWN0aXZlIFVSTCB4LHkgLi4uICJNZW51IHRleHQiCi0gKiBNYXAgZm9ybWF0IGFuZCBtZW51IGNvbmNlcHQgY291cnRlc3kgSm9zaHVhIEJlbGwsIGpzYmVsbEBhY3MudWNhbGdhcnkuY2EuCi0gKgotICogTWFyayBDb3gsIG1hcmtAdWt3ZWIuY29tLCBBbGxvdyByZWxhdGl2ZSBVUkxzIGV2ZW4gd2hlbiBubyBiYXNlIHNwZWNpZmllZAotICovCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAiaHR0cF9wcm90b2NvbC5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAidXRpbF9zY3JpcHQuaCIKLQotI2RlZmluZSBJTUFQX01BR0lDX1RZUEUgImFwcGxpY2F0aW9uL3gtaHR0cGQtaW1hcCIKLSNkZWZpbmUgTUFYVkVSVFMgMTAwCi0jZGVmaW5lIFggMAotI2RlZmluZSBZIDEKLQotI2RlZmluZSBJTUFQX01FTlVfREVGQVVMVCAiZm9ybWF0dGVkIgotI2RlZmluZSBJTUFQX0RFRkFVTFRfREVGQVVMVCAibm9jb250ZW50IgotI2RlZmluZSBJTUFQX0JBU0VfREVGQVVMVCAibWFwIgotCi0jaWZkZWYgU1VOT1M0Ci1kb3VibGUgc3RydG9kKCk7ICAgICAgICAgICAgICAgIC8qIFN1bk9TIG5lZWRlZCB0aGlzICovCi0jZW5kaWYKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGltYXBfbW9kdWxlOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY2hhciAqaW1hcF9tZW51OwotICAgIGNoYXIgKmltYXBfZGVmYXVsdDsKLSAgICBjaGFyICppbWFwX2Jhc2U7Ci19IGltYXBfY29uZl9yZWM7Ci0KLXN0YXRpYyB2b2lkICpjcmVhdGVfaW1hcF9kaXJfY29uZmlnKHBvb2wgKnAsIGNoYXIgKmR1bW15KQotewotICAgIGltYXBfY29uZl9yZWMgKmljciA9Ci0gICAgKGltYXBfY29uZl9yZWMgKikgYXBfcGFsbG9jKHAsIHNpemVvZihpbWFwX2NvbmZfcmVjKSk7Ci0KLSAgICBpY3ItPmltYXBfbWVudSA9IE5VTEw7Ci0gICAgaWNyLT5pbWFwX2RlZmF1bHQgPSBOVUxMOwotICAgIGljci0+aW1hcF9iYXNlID0gTlVMTDsKLQotICAgIHJldHVybiBpY3I7Ci19Ci0KLXN0YXRpYyB2b2lkICptZXJnZV9pbWFwX2Rpcl9jb25maWdzKHBvb2wgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICphZGR2KQotewotICAgIGltYXBfY29uZl9yZWMgKm5ldyA9IChpbWFwX2NvbmZfcmVjICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKGltYXBfY29uZl9yZWMpKTsKLSAgICBpbWFwX2NvbmZfcmVjICpiYXNlID0gKGltYXBfY29uZl9yZWMgKikgYmFzZXY7Ci0gICAgaW1hcF9jb25mX3JlYyAqYWRkID0gKGltYXBfY29uZl9yZWMgKikgYWRkdjsKLQotICAgIG5ldy0+aW1hcF9tZW51ID0gYWRkLT5pbWFwX21lbnUgPyBhZGQtPmltYXBfbWVudSA6IGJhc2UtPmltYXBfbWVudTsKLSAgICBuZXctPmltYXBfZGVmYXVsdCA9IGFkZC0+aW1hcF9kZWZhdWx0ID8gYWRkLT5pbWFwX2RlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYmFzZS0+aW1hcF9kZWZhdWx0OwotICAgIG5ldy0+aW1hcF9iYXNlID0gYWRkLT5pbWFwX2Jhc2UgPyBhZGQtPmltYXBfYmFzZSA6IGJhc2UtPmltYXBfYmFzZTsKLQotICAgIHJldHVybiBuZXc7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIGltYXBfY21kc1tdID0KLXsKLSAgICB7IkltYXBNZW51IiwgYXBfc2V0X3N0cmluZ19zbG90LAotICAgICAodm9pZCAqKSBYdE9mZnNldE9mKGltYXBfY29uZl9yZWMsIGltYXBfbWVudSksIE9SX0lOREVYRVMsIFRBS0UxLAotICJ0aGUgdHlwZSBvZiBtZW51IGdlbmVyYXRlZDogbm9uZSwgZm9ybWF0dGVkLCBzZW1pZm9ybWF0dGVkLCB1bmZvcm1hdHRlZCJ9LAotICAgIHsiSW1hcERlZmF1bHQiLCBhcF9zZXRfc3RyaW5nX3Nsb3QsCi0gICAgICh2b2lkICopIFh0T2Zmc2V0T2YoaW1hcF9jb25mX3JlYywgaW1hcF9kZWZhdWx0KSwgT1JfSU5ERVhFUywgVEFLRTEsCi0gICAgICJ0aGUgYWN0aW9uIHRha2VuIGlmIG5vIG1hdGNoOiBlcnJvciwgbm9jb250ZW50LCByZWZlcmVyLCBtZW51LCBVUkwifSwKLSAgICB7IkltYXBCYXNlIiwgYXBfc2V0X3N0cmluZ19zbG90LAotICAgICAodm9pZCAqKSBYdE9mZnNldE9mKGltYXBfY29uZl9yZWMsIGltYXBfYmFzZSksIE9SX0lOREVYRVMsIFRBS0UxLAotICAgICAidGhlIGJhc2UgZm9yIGFsbCBVUkwnczogbWFwLCByZWZlcmVyLCBVUkwgKG9yIHN0YXJ0IG9mKSJ9LAotICAgIHtOVUxMfQotfTsKLQotc3RhdGljIGludCBwb2ludGlucmVjdChjb25zdCBkb3VibGUgcG9pbnRbMl0sIGRvdWJsZSBjb29yZHNbTUFYVkVSVFNdWzJdKQotewotICAgIGRvdWJsZSBtYXhbMl0sIG1pblsyXTsKLSAgICBpZiAoY29vcmRzWzBdW1hdID4gY29vcmRzWzFdW1hdKSB7Ci0gICAgICAgIG1heFswXSA9IGNvb3Jkc1swXVtYXTsKLSAgICAgICAgbWluWzBdID0gY29vcmRzWzFdW1hdOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgbWF4WzBdID0gY29vcmRzWzFdW1hdOwotICAgICAgICBtaW5bMF0gPSBjb29yZHNbMF1bWF07Ci0gICAgfQotCi0gICAgaWYgKGNvb3Jkc1swXVtZXSA+IGNvb3Jkc1sxXVtZXSkgewotICAgICAgICBtYXhbMV0gPSBjb29yZHNbMF1bWV07Ci0gICAgICAgIG1pblsxXSA9IGNvb3Jkc1sxXVtZXTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIG1heFsxXSA9IGNvb3Jkc1sxXVtZXTsKLSAgICAgICAgbWluWzFdID0gY29vcmRzWzBdW1ldOwotICAgIH0KLQotICAgIHJldHVybiAoKHBvaW50W1hdID49IG1pblswXSAmJiBwb2ludFtYXSA8PSBtYXhbMF0pICYmCi0gICAgICAgICAgICAocG9pbnRbWV0gPj0gbWluWzFdICYmIHBvaW50W1ldIDw9IG1heFsxXSkpOwotfQotCi1zdGF0aWMgaW50IHBvaW50aW5jaXJjbGUoY29uc3QgZG91YmxlIHBvaW50WzJdLCBkb3VibGUgY29vcmRzW01BWFZFUlRTXVsyXSkKLXsKLSAgICBkb3VibGUgcmFkaXVzMSwgcmFkaXVzMjsKLQotICAgIHJhZGl1czEgPSAoKGNvb3Jkc1swXVtZXSAtIGNvb3Jkc1sxXVtZXSkgKiAoY29vcmRzWzBdW1ldIC0gY29vcmRzWzFdW1ldKSkKLSAgICAgICAgKyAoKGNvb3Jkc1swXVtYXSAtIGNvb3Jkc1sxXVtYXSkgKiAoY29vcmRzWzBdW1hdIC0gY29vcmRzWzFdW1hdKSk7Ci0KLSAgICByYWRpdXMyID0gKChjb29yZHNbMF1bWV0gLSBwb2ludFtZXSkgKiAoY29vcmRzWzBdW1ldIC0gcG9pbnRbWV0pKQotICAgICAgICArICgoY29vcmRzWzBdW1hdIC0gcG9pbnRbWF0pICogKGNvb3Jkc1swXVtYXSAtIHBvaW50W1hdKSk7Ci0KLSAgICByZXR1cm4gKHJhZGl1czIgPD0gcmFkaXVzMSk7Ci19Ci0KLSNkZWZpbmUgZm1pbihhLGIpICgoKGEpPihiKSk/KGIpOihhKSkKLSNkZWZpbmUgZm1heChhLGIpICgoKGEpPihiKSk/KGEpOihiKSkKLQotc3RhdGljIGludCBwb2ludGlucG9seShjb25zdCBkb3VibGUgcG9pbnRbMl0sIGRvdWJsZSBwZ29uW01BWFZFUlRTXVsyXSkKLXsKLSAgICBpbnQgaSwgbnVtdmVydHMsIGNyb3NzaW5ncyA9IDA7Ci0gICAgZG91YmxlIHggPSBwb2ludFtYXSwgeSA9IHBvaW50W1ldOwotCi0gICAgZm9yIChudW12ZXJ0cyA9IDA7IHBnb25bbnVtdmVydHNdW1hdICE9IC0xICYmIG51bXZlcnRzIDwgTUFYVkVSVFM7Ci0JbnVtdmVydHMrKykgewotCS8qIGp1c3QgY291bnRpbmcgdGhlIHZlcnRleGVzICovCi0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bXZlcnRzOyBpKyspIHsKLSAgICAgICAgZG91YmxlIHgxPXBnb25baV1bWF07Ci0gICAgICAgIGRvdWJsZSB5MT1wZ29uW2ldW1ldOwotICAgICAgICBkb3VibGUgeDI9cGdvblsoaSArIDEpICUgbnVtdmVydHNdW1hdOwotICAgICAgICBkb3VibGUgeTI9cGdvblsoaSArIDEpICUgbnVtdmVydHNdW1ldOwotICAgICAgICBkb3VibGUgZD0oeSAtIHkxKSAqICh4MiAtIHgxKSAtICh4IC0geDEpICogKHkyIC0geTEpOwotCi0gICAgICAgIGlmICgoeTEgPj0geSkgIT0gKHkyID49IHkpKSB7Ci0JICAgIGNyb3NzaW5ncyArPXkyIC0geTEgPj0gMCA/IGQgPj0gMCA6IGQgPD0gMDsKLQl9Ci0gICAgICAgIGlmICghZCAmJiBmbWluKHgxLHgyKSA8PSB4ICYmIHggPD0gZm1heCh4MSx4MikKLQkgICAgJiYgZm1pbih5MSx5MikgPD0geSAmJiB5IDw9IGZtYXgoeTEseTIpKSB7Ci0JICAgIHJldHVybiAxOwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIGNyb3NzaW5ncyAmIDB4MDE7Ci19Ci0KLQotc3RhdGljIGludCBpc19jbG9zZXIoY29uc3QgZG91YmxlIHBvaW50WzJdLCBkb3VibGUgY29vcmRzW01BWFZFUlRTXVsyXSwKLSAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqY2xvc2VzdCkKLXsKLSAgICBkb3VibGUgZGlzdF9zcXVhcmVkID0gKChwb2ludFtYXSAtIGNvb3Jkc1swXVtYXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogKHBvaW50W1hdIC0gY29vcmRzWzBdW1hdKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKHBvaW50W1ldIC0gY29vcmRzWzBdW1ldKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChwb2ludFtZXSAtIGNvb3Jkc1swXVtZXSkpOwotCi0gICAgaWYgKHBvaW50W1hdIDwgMCB8fCBwb2ludFtZXSA8IDApIHsKLSAgICAgICAgcmV0dXJuICgwKTsgICAgICAgICAgLyogZG9uJ3QgbWVzcyBhcm91bmQgd2l0aCBuZWdhdGl2ZSBjb29yZGluYXRlcyAqLwotICAgIH0KLQotICAgIGlmICgqY2xvc2VzdCA8IDAgfHwgZGlzdF9zcXVhcmVkIDwgKmNsb3Nlc3QpIHsKLSAgICAgICAgKmNsb3Nlc3QgPSBkaXN0X3NxdWFyZWQ7Ci0gICAgICAgIHJldHVybiAoMSk7ICAgICAgICAgIC8qIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHBvaW50IG9yIGlzIHRoZSBjbG9zZXN0IHlldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgJ2Nsb3Nlc3QnIGVxdWFsIHRvIHRoaXMgZGlzdGFuY2VeMiAqLwotICAgIH0KLQotICAgIHJldHVybiAoMCk7ICAgICAgICAgICAgICAvKiBpZiBpdCdzIG5vdCB0aGUgZmlyc3Qgb3IgY2xvc2VzdCAqLwotCi19Ci0KLXN0YXRpYyBkb3VibGUgZ2V0X3hfY29vcmQoY29uc3QgY2hhciAqYXJncykKLXsKLSAgICBjaGFyICplbmRwdHI7ICAgICAgICAgICAgICAgLyogd2Ugd2FudCBpdCBub24tbnVsbCAqLwotICAgIGRvdWJsZSB4X2Nvb3JkID0gLTE7ICAgICAgICAvKiAtMSBpcyByZXR1cm5lZCBpZiBubyBjb29yZGluYXRlIGlzIGdpdmVuICovCi0KLSAgICBpZiAoYXJncyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAoLTEpOyAgICAgICAgICAgIC8qIGluIGNhc2Ugd2UgYXJlbid0IHBhc3NlZCBhbnl0aGluZyAqLwotICAgIH0KLQotICAgIHdoaWxlICgqYXJncyAmJiAhYXBfaXNkaWdpdCgqYXJncykgJiYgKmFyZ3MgIT0gJywnKSB7Ci0gICAgICAgIGFyZ3MrKzsgICAgICAgICAgICAgICAgIC8qIGp1bXAgdG8gdGhlIGZpcnN0IGRpZ2l0LCBidXQgbm90IHBhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBjb21tYSBvciBlbmQgKi8KLSAgICB9Ci0KLSAgICB4X2Nvb3JkID0gc3RydG9kKGFyZ3MsICZlbmRwdHIpOwotCi0gICAgaWYgKGVuZHB0ciA+IGFyZ3MpIHsgICAgICAgIC8qIGlmIGEgY29udmVyc2lvbiB3YXMgbWFkZSAqLwotICAgICAgICByZXR1cm4gKHhfY29vcmQpOwotICAgIH0KLQotICAgIHJldHVybiAoLTEpOyAgICAgICAgICAgICAgICAvKiBlbHNlIGlmIG5vIGNvbnZlcnNpb24gd2FzIG1hZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIG5vIGFyZ3Mgd2FzIGdpdmVuICovCi19Ci0KLXN0YXRpYyBkb3VibGUgZ2V0X3lfY29vcmQoY29uc3QgY2hhciAqYXJncykKLXsKLSAgICBjaGFyICplbmRwdHI7ICAgICAgICAgICAgICAgLyogd2Ugd2FudCBpdCBub24tbnVsbCAqLwotICAgIGNoYXIgKnN0YXJ0X29mX3kgPSBOVUxMOwotICAgIGRvdWJsZSB5X2Nvb3JkID0gLTE7ICAgICAgICAvKiAtMSBpcyByZXR1cm5lZCBvbiBlcnJvciAqLwotCi0gICAgaWYgKGFyZ3MgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gKC0xKTsgICAgICAgICAgICAvKiBpbiBjYXNlIHdlIGFyZW4ndCBwYXNzZWQgYW55dGhpbmcgKi8KLSAgICB9Ci0KLSAgICBzdGFydF9vZl95ID0gc3RyY2hyKGFyZ3MsICcsJyk7ICAgICAvKiB0aGUgY29tbWEgKi8KLQotICAgIGlmIChzdGFydF9vZl95KSB7Ci0KLSAgICAgICAgc3RhcnRfb2ZfeSsrOyAgICAgICAgICAgLyogc3RhcnQgbG9va2luZyBhdCB0aGUgY2hhcmFjdGVyIGFmdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb21tYSAqLwotCi0gICAgICAgIHdoaWxlICgqc3RhcnRfb2ZfeSAmJiAhYXBfaXNkaWdpdCgqc3RhcnRfb2ZfeSkpIHsKLSAgICAgICAgICAgIHN0YXJ0X29mX3krKzsgICAgICAgLyoganVtcCB0byB0aGUgZmlyc3QgZGlnaXQsIGJ1dCBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdCB0aGUgZW5kICovCi0JfQotCi0gICAgICAgIHlfY29vcmQgPSBzdHJ0b2Qoc3RhcnRfb2ZfeSwgJmVuZHB0cik7Ci0KLSAgICAgICAgaWYgKGVuZHB0ciA+IHN0YXJ0X29mX3kpIHsKLSAgICAgICAgICAgIHJldHVybiAoeV9jb29yZCk7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiAoLTEpOyAgICAgICAgICAgICAgICAvKiBpZiBubyBjb252ZXJzaW9uIHdhcyBtYWRlLCBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBjb21tYSB3YXMgZm91bmQgaW4gYXJncyAqLwotfQotCi0KLS8qIFNlZSBpZiBzdHJpbmcgaGFzIGEgInF1b3RlZCBwYXJ0IiwgYW5kIGlmIHNvIHNldCAqcXVvdGVkX3BhcnQgdG8KLSAqIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHF1b3RlZCBwYXJ0LCB0aGVuIGhhbW1lciBhIFwwIG9udG8gdGhlCi0gKiB0cmFpbGluZyBxdW90ZSwgYW5kIHNldCAqc3RyaW5nIHRvIHBvaW50IGF0IHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAqIHBhc3QgdGhlIHNlY29uZCBxdW90ZS4KLSAqCi0gKiBPdGhlcndpc2Ugc2V0ICpxdW90ZWRfcGFydCB0byBOVUxMLCBhbmQgbGVhdmUgKnN0cmluZyBhbG9uZS4KLSAqLwotc3RhdGljIHZvaWQgcmVhZF9xdW90ZWQoY2hhciAqKnN0cmluZywgY2hhciAqKnF1b3RlZF9wYXJ0KQotewotICAgIGNoYXIgKnN0cnAgPSAqc3RyaW5nOwotCi0gICAgLyogYXNzdW1lIHRoZXJlJ3Mgbm8gcXVvdGVkIHBhcnQgKi8KLSAgICAqcXVvdGVkX3BhcnQgPSBOVUxMOwotCi0gICAgd2hpbGUgKGFwX2lzc3BhY2UoKnN0cnApKSB7Ci0gICAgICAgIHN0cnArKzsgICAgICAgICAgICAgICAJLyogZ28gYWxvbmcgc3RyaW5nIHVudGlsIG5vbi13aGl0ZXNwYWNlICovCi0gICAgfQotCi0gICAgaWYgKCpzdHJwID09ICciJykgeyAgICAgICAJLyogaWYgdGhhdCBjaGFyYWN0ZXIgaXMgYSBkb3VibGUgcXVvdGUgKi8KLSAgICAgICAgc3RycCsrOyAgICAgICAgICAgICAgIAkvKiBzdGVwIG92ZXIgaXQgKi8KLQkqcXVvdGVkX3BhcnQgPSBzdHJwOyAgCS8qIG5vdGUgd2hlcmUgdGhlIHF1b3RlZCBwYXJ0IGJlZ2lucyAqLwotCi0gICAgICAgIHdoaWxlICgqc3RycCAmJiAqc3RycCAhPSAnIicpIHsKLQkgICAgKytzdHJwOwkJLyogc2tpcCB0aGUgcXVvdGVkIHBvcnRpb24gKi8KLSAgICAgICAgfQotCi0gICAgICAgICpzdHJwID0gJ1wwJzsgICAgCS8qIGVuZCB0aGUgc3RyaW5nIHdpdGggYSBOVUwgKi8KLQotICAgICAgICBzdHJwKys7ICAgICAgICAgICAgICAgCS8qIHN0ZXAgb3ZlciB0aGUgbGFzdCBkb3VibGUgcXVvdGUgKi8KLQkqc3RyaW5nID0gc3RycDsKLSAgICB9Ci19Ci0KLS8qCi0gKiByZXR1cm5zIHRoZSBtYXBwZWQgVVJMIG9yIE5VTEwuCi0gKi8KLXN0YXRpYyBjaGFyICppbWFwX3VybChyZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqYmFzZSwgY29uc3QgY2hhciAqdmFsdWUpCi17Ci0vKiB0cmFuc2xhdGVzIGEgdmFsdWUgaW50byBhIFVSTC4gKi8KLSAgICBpbnQgc2xlbiwgY2xlbjsKLSAgICBjaGFyICpzdHJpbmdfcG9zID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICpzdHJpbmdfcG9zX2NvbnN0ID0gTlVMTDsKLSAgICBjaGFyICpkaXJlY3RvcnkgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKnJlZmVyZXIgPSBOVUxMOwotICAgIGNoYXIgKm15X2Jhc2U7Ci0KLSAgICBpZiAoIXN0cmNhc2VjbXAodmFsdWUsICJtYXAiKSB8fCAhc3RyY2FzZWNtcCh2YWx1ZSwgIm1lbnUiKSkgewotCXJldHVybiBhcF9jb25zdHJ1Y3RfdXJsKHItPnBvb2wsIHItPnVyaSwgcik7Ci0gICAgfQotCi0gICAgaWYgKCFzdHJjYXNlY21wKHZhbHVlLCAibm9jb250ZW50IikgfHwgIXN0cmNhc2VjbXAodmFsdWUsICJlcnJvciIpKSB7Ci0gICAgICAgIHJldHVybiBhcF9wc3RyZHVwKHItPnBvb2wsIHZhbHVlKTsgICAgICAvKiB0aGVzZSBhcmUgaGFuZGxlZCBlbHNld2hlcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyBqdXN0IGNvcHkgdGhlbSAqLwotICAgIH0KLQotICAgIGlmICghc3RyY2FzZWNtcCh2YWx1ZSwgInJlZmVyZXIiKSkgewotICAgICAgICByZWZlcmVyID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJSZWZlcmVyIik7Ci0gICAgICAgIGlmIChyZWZlcmVyICYmICpyZWZlcmVyKSB7Ci0JICAgIHJldHVybiBhcF9wc3RyZHVwKHItPnBvb2wsIHJlZmVyZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotCSAgICAvKiBYWFg6ICBUaGlzIHVzZWQgdG8gZG8gKnZhbHVlID0gJ1wwJzsgLi4uIHdoaWNoIGlzIHRvdGFsbHkgYm9ndXMKLQkgICAgICogYmVjYXVzZSBpdCBoYW1tZXJzIHRoZSBwYXNzZWQgaW4gdmFsdWUsIHdoaWNoIGNhbiBiZSBhIHN0cmluZwotICAgICAgICAgICAgICogY29uc3RhbnQsIG9yIHBhcnQgb2YgYSBjb25maWcsIG9yIHdoYXRldmVyLiAgVG90YWwgZ2FyYmFnZS4KLSAgICAgICAgICAgICAqIFRoaXMgd29ya3MgYXJvdW5kIHRoYXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgcmVzdCBvZiB0aGlzCi0gICAgICAgICAgICAgKiBjb2RlIG11Y2gKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgdmFsdWUgPSAiIjsgICAgICAvKiBpZiAncmVmZXJlcicgYnV0IG5vIHJlZmVycmluZyBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIHRoZSB2YWx1ZSAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RyaW5nX3Bvc19jb25zdCA9IHZhbHVlOwotICAgIHdoaWxlIChhcF9pc2FscGhhKCpzdHJpbmdfcG9zX2NvbnN0KSkgewotCXN0cmluZ19wb3NfY29uc3QrKzsgICAgICAgICAgIC8qIGdvIGFsb25nIHRoZSBVUkwgZnJvbSB0aGUgbWFwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVudGlsIGEgbm9uLWxldHRlciAqLwotICAgIH0KLSAgICBpZiAoKnN0cmluZ19wb3NfY29uc3QgPT0gJzonKSB7Ci0JLyogaWYgbGV0dGVycyBhbmQgdGhlbiBhIGNvbG9uIChsaWtlIGh0dHA6KSAqLwotCS8qIGl0J3MgYW4gYWJzb2x1dGUgVVJMLCBzbyB1c2UgaXQhICovCi0JcmV0dXJuIGFwX3BzdHJkdXAoci0+cG9vbCwgdmFsdWUpOwotICAgIH0KLQotICAgIGlmICghYmFzZSB8fCAhKmJhc2UpIHsKLSAgICAgICAgaWYgKHZhbHVlICYmICp2YWx1ZSkgewotCSAgICByZXR1cm4gYXBfcHN0cmR1cChyLT5wb29sLCB2YWx1ZSk7IC8qIG5vIGJhc2U6IHVzZSB3aGF0IGlzIGdpdmVuICovCi0gICAgICAgIH0KLQkvKiBubyBiYXNlLCBubyB2YWx1ZTogcGljayBhIHNpbXBsZSBkZWZhdWx0ICovCi0JcmV0dXJuIGFwX2NvbnN0cnVjdF91cmwoci0+cG9vbCwgIi8iLCByKTsKLSAgICB9Ci0KLSAgICAvKiBtdXN0IGJlIGEgcmVsYXRpdmUgVVJMIHRvIGJlIGNvbWJpbmVkIHdpdGggYmFzZSAqLwotICAgIGlmIChzdHJjaHIoYmFzZSwgJy8nKSA9PSBOVUxMICYmICghc3RybmNtcCh2YWx1ZSwgIi4uLyIsIDMpCi0gICAgICAgIHx8ICFzdHJjbXAodmFsdWUsICIuLiIpKSkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBiYXNlIGRpcmVjdGl2ZSBpbiBtYXAgZmlsZTogJXMiLCByLT51cmkpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgbXlfYmFzZSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgYmFzZSk7Ci0gICAgc3RyaW5nX3BvcyA9IG15X2Jhc2U7Ci0gICAgd2hpbGUgKCpzdHJpbmdfcG9zKSB7Ci0gICAgICAgIGlmICgqc3RyaW5nX3BvcyA9PSAnLycgJiYgKihzdHJpbmdfcG9zICsgMSkgPT0gJy8nKSB7Ci0gICAgICAgICAgICBzdHJpbmdfcG9zICs9IDI7ICAgIC8qIGlmIHRoZXJlIGFyZSB0d28gc2xhc2hlcywganVtcCBvdmVyIHRoZW0gKi8KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICgqc3RyaW5nX3BvcyA9PSAnLycpIHsgICAgICAgLyogdGhlIGZpcnN0IHNpbmdsZSBzbGFzaCAqLwotICAgICAgICAgICAgaWYgKHZhbHVlWzBdID09ICcvJykgewotICAgICAgICAgICAgICAgICpzdHJpbmdfcG9zID0gJ1wwJzsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogaWYgdGhlIFVSTCBmcm9tIHRoZSBtYXAgc3RhcnRzIGZyb20gcm9vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kIHRoZSBiYXNlIFVSTCBzdHJpbmcgYXQgdGhlIGZpcnN0IHNpbmdsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGFzaCAqLwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gc3RyaW5nX3BvczsgICAgICAgICAvKiBzYXZlIHRoZSBzdGFydCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRpcmVjdG9yeSBwb3J0aW9uICovCi0KLSAgICAgICAgICAgICAgICBzdHJpbmdfcG9zID0gc3RycmNocihzdHJpbmdfcG9zLCAnLycpOyAgLyogbm93IHJldXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19wb3MgKi8KLSAgICAgICAgICAgICAgICBzdHJpbmdfcG9zKys7ICAgLyogc3RlcCBvdmVyIHRoYXQgbGFzdCBzbGFzaCAqLwotICAgICAgICAgICAgICAgICpzdHJpbmdfcG9zID0gJ1wwJzsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogYnV0IGlmIHRoZSBtYXAgdXJsIGlzIHJlbGF0aXZlLCBsZWF2ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xhc2ggb24gdGhlIGJhc2UgKGlmIHRoZXJlIGlzIG9uZSkgKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHN0cmluZ19wb3MrKzsgICAgICAgICAgIC8qIHVudGlsIHdlIGdldCB0byB0aGUgZW5kIG9mIG15X2Jhc2Ugd2l0aG91dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kaW5nIGEgc2xhc2ggYnkgaXRzZWxmICovCi0gICAgfQotCi0gICAgd2hpbGUgKCFzdHJuY21wKHZhbHVlLCAiLi4vIiwgMykgfHwgIXN0cmNtcCh2YWx1ZSwgIi4uIikpIHsKLQotICAgICAgICBpZiAoZGlyZWN0b3J5ICYmIChzbGVuID0gc3RybGVuKGRpcmVjdG9yeSkpKSB7Ci0KLSAgICAgICAgICAgIC8qIGZvciBlYWNoICcuLicsICBrbm9jayBhIGRpcmVjdG9yeSBvZmYgdGhlIGVuZCAKLSAgICAgICAgICAgICAgIGJ5IGVuZGluZyB0aGUgc3RyaW5nIHJpZ2h0IGF0IHRoZSBsYXN0IHNsYXNoLgotICAgICAgICAgICAgICAgQnV0IG9ubHkgY29uc2lkZXIgdGhlIGRpcmVjdG9yeSBwb3J0aW9uOiBkb24ndCBlYXQKLSAgICAgICAgICAgICAgIGludG8gdGhlIHNlcnZlciBuYW1lLiAgQW5kIG9ubHkgdHJ5IGlmIGEgZGlyZWN0b3J5Ci0gICAgICAgICAgICAgICBwb3J0aW9uIHdhcyBmb3VuZCAqLwotCi0gICAgICAgICAgICBjbGVuID0gc2xlbiAtIDE7Ci0KLSAgICAgICAgICAgIHdoaWxlICgoc2xlbiAtIGNsZW4pID09IDEpIHsKLQotICAgICAgICAgICAgICAgIGlmICgoc3RyaW5nX3BvcyA9IHN0cnJjaHIoZGlyZWN0b3J5LCAnLycpKSkgewotICAgICAgICAgICAgICAgICAgICAqc3RyaW5nX3BvcyA9ICdcMCc7Ci0JCX0KLSAgICAgICAgICAgICAgICBjbGVuID0gc3RybGVuKGRpcmVjdG9yeSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNsZW4gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2YWx1ZSArPSAyOyAgICAgICAgIC8qIGp1bXAgb3ZlciB0aGUgJy4uJyB0aGF0IHdlIGZvdW5kIGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGRpcmVjdG9yeSkgewotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGRpcmVjdG9yeSBuYW1lIGluIG1hcCBmaWxlOiAlcyIsIHItPnVyaSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghc3RybmNtcCh2YWx1ZSwgIi8uLi8iLCA0KSB8fCAhc3RyY21wKHZhbHVlLCAiLy4uIikpIHsKLSAgICAgICAgICAgIHZhbHVlKys7ICAgICAgICAgICAgLyogc3RlcCBvdmVyIHRoZSAnLycgaWYgdGhlcmUgYXJlIG1vcmUgJy4uJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBkby4gIFRoaXMgd2F5LCB3ZSBsZWF2ZSB0aGUgc3RhcnRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nIG9uIHZhbHVlIGFmdGVyIHRoZSBsYXN0ICcuLicsIGJ1dCBnZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlkIG9mIGl0IG90aGVyd2lzZSAqLwotCX0KLQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBieSB0aGlzIHBvaW50LCB2YWx1ZSBkb2VzIG5vdCBzdGFydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoICcuLicgKi8KLQotICAgIGlmICh2YWx1ZSAmJiAqdmFsdWUpIHsKLQlyZXR1cm4gYXBfcHN0cmNhdChyLT5wb29sLCBteV9iYXNlLCB2YWx1ZSwgTlVMTCk7Ci0gICAgfQotICAgIHJldHVybiBteV9iYXNlOwotfQotCi1zdGF0aWMgaW50IGltYXBfcmVwbHkocmVxdWVzdF9yZWMgKnIsIGNoYXIgKnJlZGlyZWN0KQotewotICAgIGlmICghc3RyY2FzZWNtcChyZWRpcmVjdCwgImVycm9yIikpIHsKLSAgICAgICAgcmV0dXJuIFNFUlZFUl9FUlJPUjsgICAgLyogdGhleSBhY3R1YWxseSByZXF1ZXN0ZWQgYW4gZXJyb3IhICovCi0gICAgfQotICAgIGlmICghc3RyY2FzZWNtcChyZWRpcmVjdCwgIm5vY29udGVudCIpKSB7Ci0gICAgICAgIHJldHVybiBIVFRQX05PX0NPTlRFTlQ7IC8qIHRlbGwgdGhlIGNsaWVudCB0byBrZWVwIHRoZSBwYWdlIGl0IGhhcyAqLwotICAgIH0KLSAgICBpZiAocmVkaXJlY3QgJiYgKnJlZGlyZWN0KSB7Ci0gICAgICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJMb2NhdGlvbiIsIHJlZGlyZWN0KTsKLSAgICAgICAgcmV0dXJuIFJFRElSRUNUOyAgICAgICAgLyogbXVzdCBiZSBhIFVSTCwgc28gcmVkaXJlY3QgdG8gaXQgKi8KLSAgICB9Ci0gICAgcmV0dXJuIFNFUlZFUl9FUlJPUjsKLX0KLQotc3RhdGljIHZvaWQgbWVudV9oZWFkZXIocmVxdWVzdF9yZWMgKnIsIGNoYXIgKm1lbnUpCi17Ci0gICAgci0+Y29udGVudF90eXBlID0gInRleHQvaHRtbCI7Ci0gICAgYXBfc2VuZF9odHRwX2hlYWRlcihyKTsKLSAgICBhcF9oYXJkX3RpbWVvdXQoInNlbmQgbWVudSIsIHIpOyAgICAgICAvKiBraWxsZWQgaW4gbWVudV9mb290ZXIgKi8KLQotICAgIGFwX3J2cHV0cyhyLCBET0NUWVBFX0hUTUxfM18yLCAiPGh0bWw+PGhlYWQ+XG48dGl0bGU+TWVudSBmb3IgIiwgci0+dXJpLAotICAgICAgICAgICAiPC90aXRsZT5cbjwvaGVhZD48Ym9keT5cbiIsIE5VTEwpOwotCi0gICAgaWYgKCFzdHJjYXNlY21wKG1lbnUsICJmb3JtYXR0ZWQiKSkgewotICAgICAgICBhcF9ydnB1dHMociwgIjxoMT5NZW51IGZvciAiLCByLT51cmksICI8L2gxPlxuPGhyPlxuXG4iLCBOVUxMKTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIG1lbnVfYmxhbmsocmVxdWVzdF9yZWMgKnIsIGNoYXIgKm1lbnUpCi17Ci0gICAgaWYgKCFzdHJjYXNlY21wKG1lbnUsICJmb3JtYXR0ZWQiKSkgewotICAgICAgICBhcF9ycHV0cygiXG4iLCByKTsKLSAgICB9Ci0gICAgaWYgKCFzdHJjYXNlY21wKG1lbnUsICJzZW1pZm9ybWF0dGVkIikpIHsKLSAgICAgICAgYXBfcnB1dHMoIjxicj5cbiIsIHIpOwotICAgIH0KLSAgICBpZiAoIXN0cmNhc2VjbXAobWVudSwgInVuZm9ybWF0dGVkIikpIHsKLSAgICAgICAgYXBfcnB1dHMoIlxuIiwgcik7Ci0gICAgfQotICAgIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgbWVudV9jb21tZW50KHJlcXVlc3RfcmVjICpyLCBjaGFyICptZW51LCBjaGFyICpjb21tZW50KQotewotICAgIGlmICghc3RyY2FzZWNtcChtZW51LCAiZm9ybWF0dGVkIikpIHsKLSAgICAgICAgYXBfcnB1dHMoIlxuIiwgcik7ICAgICAgICAgLyogcHJpbnQganVzdCBhIG5ld2xpbmUgaWYgJ2Zvcm1hdHRlZCcgKi8KLSAgICB9Ci0gICAgaWYgKCFzdHJjYXNlY21wKG1lbnUsICJzZW1pZm9ybWF0dGVkIikgJiYgKmNvbW1lbnQpIHsKLSAgICAgICAgYXBfcnZwdXRzKHIsIGNvbW1lbnQsICJcbiIsIE5VTEwpOwotICAgIH0KLSAgICBpZiAoIXN0cmNhc2VjbXAobWVudSwgInVuZm9ybWF0dGVkIikgJiYgKmNvbW1lbnQpIHsKLSAgICAgICAgYXBfcnZwdXRzKHIsIGNvbW1lbnQsICJcbiIsIE5VTEwpOwotICAgIH0KLSAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgLyogY29tbWVudHMgYXJlIGlnbm9yZWQgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb3JtYXR0ZWQnIGZvcm0gKi8KLX0KLQotc3RhdGljIHZvaWQgbWVudV9kZWZhdWx0KHJlcXVlc3RfcmVjICpyLCBjaGFyICptZW51LCBjaGFyICpocmVmLCBjaGFyICp0ZXh0KQotewotICAgIGlmICghc3RyY2FzZWNtcChocmVmLCAiZXJyb3IiKSB8fCAhc3RyY2FzZWNtcChocmVmLCAibm9jb250ZW50IikpIHsKLSAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgLyogZG9uJ3QgcHJpbnQgc3VjaCBsaW5lcywgdGhlc2UgYXJlbid0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxseSBocmVmJ3MgKi8KLSAgICB9Ci0gICAgaWYgKCFzdHJjYXNlY21wKG1lbnUsICJmb3JtYXR0ZWQiKSkgewotICAgICAgICBhcF9ydnB1dHMociwgIjxwcmU+KERlZmF1bHQpIDxhIGhyZWY9XCIiLCBocmVmLCAiXCI+IiwgdGV4dCwKLSAgICAgICAgICAgICAgICI8L2E+PC9wcmU+XG4iLCBOVUxMKTsKLSAgICB9Ci0gICAgaWYgKCFzdHJjYXNlY21wKG1lbnUsICJzZW1pZm9ybWF0dGVkIikpIHsKLSAgICAgICAgYXBfcnZwdXRzKHIsICI8cHJlPihEZWZhdWx0KSA8YSBocmVmPVwiIiwgaHJlZiwgIlwiPiIsIHRleHQsCi0gICAgICAgICAgICAgICAiPC9hPjwvcHJlPlxuIiwgTlVMTCk7Ci0gICAgfQotICAgIGlmICghc3RyY2FzZWNtcChtZW51LCAidW5mb3JtYXR0ZWQiKSkgewotICAgICAgICBhcF9ydnB1dHMociwgIjxhIGhyZWY9XCIiLCBocmVmLCAiXCI+IiwgdGV4dCwgIjwvYT4iLCBOVUxMKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBtZW51X2RpcmVjdGl2ZShyZXF1ZXN0X3JlYyAqciwgY2hhciAqbWVudSwgY2hhciAqaHJlZiwgY2hhciAqdGV4dCkKLXsKLSAgICBpZiAoIXN0cmNhc2VjbXAoaHJlZiwgImVycm9yIikgfHwgIXN0cmNhc2VjbXAoaHJlZiwgIm5vY29udGVudCIpKSB7Ci0gICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgIC8qIGRvbid0IHByaW50IHN1Y2ggbGluZXMsIGFzIHRoaXMgaXNuJ3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGx5IGFuIGhyZWYgKi8KLSAgICB9Ci0gICAgaWYgKCFzdHJjYXNlY21wKG1lbnUsICJmb3JtYXR0ZWQiKSkgewotICAgICAgICBhcF9ydnB1dHMociwgIjxwcmU+ICAgICAgICAgIDxhIGhyZWY9XCIiLCBocmVmLCAiXCI+IiwgdGV4dCwKLSAgICAgICAgICAgICAgICI8L2E+PC9wcmU+XG4iLCBOVUxMKTsKLSAgICB9Ci0gICAgaWYgKCFzdHJjYXNlY21wKG1lbnUsICJzZW1pZm9ybWF0dGVkIikpIHsKLSAgICAgICAgYXBfcnZwdXRzKHIsICI8cHJlPiAgICAgICAgICA8YSBocmVmPVwiIiwgaHJlZiwgIlwiPiIsIHRleHQsCi0gICAgICAgICAgICAgICAiPC9hPjwvcHJlPlxuIiwgTlVMTCk7Ci0gICAgfQotICAgIGlmICghc3RyY2FzZWNtcChtZW51LCAidW5mb3JtYXR0ZWQiKSkgewotICAgICAgICBhcF9ydnB1dHMociwgIjxhIGhyZWY9XCIiLCBocmVmLCAiXCI+IiwgdGV4dCwgIjwvYT4iLCBOVUxMKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBtZW51X2Zvb3RlcihyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBhcF9ycHV0cygiXG5cbjwvYm9keT5cbjwvaHRtbD5cbiIsIHIpOyAgICAgICAgIC8qIGZpbmlzaCB0aGUgbWVudSAqLwotICAgIGFwX2tpbGxfdGltZW91dChyKTsKLX0KLQotc3RhdGljIGludCBpbWFwX2hhbmRsZXIocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY2hhciBpbnB1dFtNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciAqZGlyZWN0aXZlOwotICAgIGNoYXIgKnZhbHVlOwotICAgIGNoYXIgKmhyZWZfdGV4dDsKLSAgICBjaGFyICpiYXNlOwotICAgIGNoYXIgKnJlZGlyZWN0OwotICAgIGNoYXIgKm1hcGRmbHQ7Ci0gICAgY2hhciAqY2xvc2VzdCA9IE5VTEw7Ci0gICAgZG91YmxlIGNsb3Nlc3RfeWV0ID0gLTE7Ci0KLSAgICBkb3VibGUgdGVzdHBvaW50WzJdOwotICAgIGRvdWJsZSBwb2ludGFycmF5W01BWFZFUlRTICsgMV1bMl07Ci0gICAgaW50IHZlcnRleDsKLQotICAgIGNoYXIgKnN0cmluZ19wb3M7Ci0gICAgaW50IHNob3dtZW51ID0gMDsKLQotICAgIGltYXBfY29uZl9yZWMgKmljciA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLCAmaW1hcF9tb2R1bGUpOwotCi0gICAgY2hhciAqaW1hcF9tZW51ID0gaWNyLT5pbWFwX21lbnUgPyBpY3ItPmltYXBfbWVudSA6IElNQVBfTUVOVV9ERUZBVUxUOwotICAgIGNoYXIgKmltYXBfZGVmYXVsdCA9IGljci0+aW1hcF9kZWZhdWx0Ci0JCQkgICAgPyAgaWNyLT5pbWFwX2RlZmF1bHQgOiBJTUFQX0RFRkFVTFRfREVGQVVMVDsKLSAgICBjaGFyICppbWFwX2Jhc2UgPSBpY3ItPmltYXBfYmFzZSA/IGljci0+aW1hcF9iYXNlIDogSU1BUF9CQVNFX0RFRkFVTFQ7Ci0KLSAgICBjb25maWdmaWxlX3QgKmltYXA7IAotCi0gICAgaWYgKHItPm1ldGhvZF9udW1iZXIgIT0gTV9HRVQpIHsKLQlyZXR1cm4gREVDTElORUQ7Ci0gICAgfQotCi0gICAgaW1hcCA9IGFwX3BjZmdfb3BlbmZpbGUoci0+cG9vbCwgci0+ZmlsZW5hbWUpOwotCi0gICAgaWYgKCFpbWFwKSB7Ci0gICAgICAgIHJldHVybiBOT1RfRk9VTkQ7Ci0gICAgfQotCi0gICAgYmFzZSA9IGltYXBfdXJsKHIsIE5VTEwsIGltYXBfYmFzZSk7ICAgICAgICAgLyogc2V0IGJhc2UgYWNjb3JkaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZGVmYXVsdCAqLwotICAgIGlmICghYmFzZSkgewotCXJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICB9Ci0gICAgbWFwZGZsdCA9IGltYXBfdXJsKHIsIE5VTEwsIGltYXBfZGVmYXVsdCk7ICAgLyogYW5kIGRlZmF1bHQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwgZGVmYXVsdCAqLwotICAgIGlmICghbWFwZGZsdCkgewotCXJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICB9Ci0KLSAgICB0ZXN0cG9pbnRbWF0gPSBnZXRfeF9jb29yZChyLT5hcmdzKTsKLSAgICB0ZXN0cG9pbnRbWV0gPSBnZXRfeV9jb29yZChyLT5hcmdzKTsKLQotICAgIGlmICgodGVzdHBvaW50W1hdID09IC0xIHx8IHRlc3Rwb2ludFtZXSA9PSAtMSkgfHwKLSAgICAgICAgKHRlc3Rwb2ludFtYXSA9PSAwICYmIHRlc3Rwb2ludFtZXSA9PSAwKSkgewotICAgICAgICAvKiBpZiBlaXRoZXIgaXMgLTEgb3IgaWYgYm90aCBhcmUgemVybyAobmV3IEx5bngpICovCi0gICAgICAgIC8qIHdlIGRvbid0IGhhdmUgdmFsaWQgY29vcmRpbmF0ZXMgKi8KLSAgICAgICAgdGVzdHBvaW50W1hdID0gLTE7Ci0gICAgICAgIHRlc3Rwb2ludFtZXSA9IC0xOwotICAgICAgICBpZiAoc3RybmNhc2VjbXAoaW1hcF9tZW51LCAibm9uZSIsIDIpKSB7Ci0gICAgICAgICAgICBzaG93bWVudSA9IDE7ICAgICAgIC8qIHNob3cgdGhlIG1lbnUgX3VubGVzc18gSW1hcE1lbnUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vbmUnIG9yICdubycgKi8KLQl9Ci0gICAgfQotCi0gICAgaWYgKHNob3dtZW51KSB7ICAgICAgICAgICAgIC8qIHNlbmQgc3RhcnQgb2YgaW1hZ2VtYXAgbWVudSBpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZSdyZSBnb2luZyB0byAqLwotICAgICAgICBtZW51X2hlYWRlcihyLCBpbWFwX21lbnUpOwotICAgIH0KLQotICAgIHdoaWxlICghYXBfY2ZnX2dldGxpbmUoaW5wdXQsIHNpemVvZihpbnB1dCksIGltYXApKSB7Ci0gICAgICAgIGlmICghaW5wdXRbMF0pIHsKLSAgICAgICAgICAgIGlmIChzaG93bWVudSkgewotICAgICAgICAgICAgICAgIG1lbnVfYmxhbmsociwgaW1hcF9tZW51KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlucHV0WzBdID09ICcjJykgewotICAgICAgICAgICAgaWYgKHNob3dtZW51KSB7Ci0gICAgICAgICAgICAgICAgbWVudV9jb21tZW50KHIsIGltYXBfbWVudSwgaW5wdXQgKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBibGFuayBsaW5lcyBhbmQgY29tbWVudHMgYXJlIGlnbm9yZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgd2UgYXJlbid0IHByaW50aW5nIGEgbWVudSAqLwotCi0JLyogZmluZCB0aGUgZmlyc3QgdHdvIHNwYWNlIGRlbGltaXRlZCBmaWVsZHMsIHJlY2FsbCB0aGF0Ci0JICogYXBfY2ZnX2dldGxpbmUgaGFzIHJlbW92ZWQgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlLgotCSAqCi0JICogbm90ZSB0aGF0IHdlJ3JlIHRva2VuaXppbmcgYXMgd2UgZ28uLi4gaWYgd2Ugd2VyZSB0byB1c2UgdGhlCi0JICogYXBfZ2V0d29yZCgpIGNsYXNzIG9mIGZ1bmN0aW9ucyB3ZSB3b3VsZCBlbmQgdXAgYWxsb2NhdGluZyBleHRyYQotCSAqIG1lbW9yeSBmb3IgZXZlcnkgbGluZSBvZiB0aGUgbWFwIGZpbGUKLQkgKi8KLSAgICAgICAgc3RyaW5nX3BvcyA9IGlucHV0OwotCWlmICghKnN0cmluZ19wb3MpIHsJCS8qIG5lZWQgYXQgbGVhc3QgdHdvIGZpZWxkcyAqLwotCSAgICBnb3RvIG5lZWRfMl9maWVsZHM7Ci0JfQotCi0JZGlyZWN0aXZlID0gc3RyaW5nX3BvczsKLQl3aGlsZSAoKnN0cmluZ19wb3MgJiYgIWFwX2lzc3BhY2UoKnN0cmluZ19wb3MpKSB7CS8qIHBhc3QgZGlyZWN0aXZlICovCi0JICAgICsrc3RyaW5nX3BvczsKLQl9Ci0JaWYgKCEqc3RyaW5nX3BvcykgewkJLyogbmVlZCBhdCBsZWFzdCB0d28gZmllbGRzICovCi0JICAgIGdvdG8gbmVlZF8yX2ZpZWxkczsKLQl9Ci0JKnN0cmluZ19wb3MrKyA9ICdcMCc7Ci0KLQlpZiAoISpzdHJpbmdfcG9zKSB7CQkvKiBuZWVkIGF0IGxlYXN0IHR3byBmaWVsZHMgKi8KLQkgICAgZ290byBuZWVkXzJfZmllbGRzOwotCX0KLQl3aGlsZSgqc3RyaW5nX3BvcyAmJiBhcF9pc3NwYWNlKCpzdHJpbmdfcG9zKSkgeyAvKiBwYXN0IHdoaXRlc3BhY2UgKi8KLQkgICAgKytzdHJpbmdfcG9zOwotCX0KLQotCXZhbHVlID0gc3RyaW5nX3BvczsKLQl3aGlsZSAoKnN0cmluZ19wb3MgJiYgIWFwX2lzc3BhY2UoKnN0cmluZ19wb3MpKSB7CS8qIHBhc3QgdmFsdWUgKi8KLQkgICAgKytzdHJpbmdfcG9zOwotCX0KLQlpZiAoYXBfaXNzcGFjZSgqc3RyaW5nX3BvcykpIHsKLQkgICAgKnN0cmluZ19wb3MrKyA9ICdcMCc7Ci0JfQotCWVsc2UgewotCSAgICAvKiBlbmQgb2YgaW5wdXQsIGRvbid0IGFkdmFuY2UgcGFzdCBpdCAqLwotCSAgICAqc3RyaW5nX3BvcyA9ICdcMCc7Ci0JfQotCi0gICAgICAgIGlmICghc3RybmNhc2VjbXAoZGlyZWN0aXZlLCAiYmFzZSIsIDQpKSB7ICAgICAgIC8qIGJhc2UsIGJhc2VfdXJpICovCi0gICAgICAgICAgICBiYXNlID0gaW1hcF91cmwociwgTlVMTCwgdmFsdWUpOwotCSAgICBpZiAoIWJhc2UpIHsKLQkJZ290byBtZW51X2JhaWw7Ci0JICAgIH0KLSAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgLyogYmFzZSBpcyBuZXZlciBwcmludGVkIHRvIGEgbWVudSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcmVhZF9xdW90ZWQoJnN0cmluZ19wb3MsICZocmVmX3RleHQpOwotCi0gICAgICAgIGlmICghc3RyY2FzZWNtcChkaXJlY3RpdmUsICJkZWZhdWx0IikpIHsgICAgICAgIC8qIGRlZmF1bHQgKi8KLSAgICAgICAgICAgIG1hcGRmbHQgPSBpbWFwX3VybChyLCBOVUxMLCB2YWx1ZSk7Ci0JICAgIGlmICghbWFwZGZsdCkgewotCQlnb3RvIG1lbnVfYmFpbDsKLQkgICAgfQotICAgICAgICAgICAgaWYgKHNob3dtZW51KSB7ICAgICAvKiBwcmludCB0aGUgZGVmYXVsdCBpZiB0aGVyZSdzIGEgbWVudSAqLwotICAgICAgICAgICAgICAgIHJlZGlyZWN0ID0gaW1hcF91cmwociwgYmFzZSwgbWFwZGZsdCk7Ci0JCWlmICghcmVkaXJlY3QpIHsKLQkJICAgIGdvdG8gbWVudV9iYWlsOwotCQl9Ci0gICAgICAgICAgICAgICAgbWVudV9kZWZhdWx0KHIsIGltYXBfbWVudSwgcmVkaXJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWZfdGV4dCA/IGhyZWZfdGV4dCA6IG1hcGRmbHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICB2ZXJ0ZXggPSAwOwotICAgICAgICB3aGlsZSAodmVydGV4IDwgTUFYVkVSVFMgJiYKLSAgICAgICAgICAgICAgIHNzY2FuZihzdHJpbmdfcG9zLCAiJWxmJSpbLCBdJWxmIiwKLSAgICAgICAgICAgICAgICAgICAgICAmcG9pbnRhcnJheVt2ZXJ0ZXhdW1hdLCAmcG9pbnRhcnJheVt2ZXJ0ZXhdW1ldKSA9PSAyKSB7Ci0gICAgICAgICAgICAvKiBOb3cgc2tpcCB3aGF0IHdlIGp1c3QgcmVhZC4uLiB3ZSBjYW4ndCB1c2UgQU5TSWlzbSAlbiAqLwotICAgICAgICAgICAgd2hpbGUgKGFwX2lzc3BhY2UoKnN0cmluZ19wb3MpKSB7ICAgICAgLyogcGFzdCB3aGl0ZXNwYWNlICovCi0gICAgICAgICAgICAgICAgc3RyaW5nX3BvcysrOwotCSAgICB9Ci0gICAgICAgICAgICB3aGlsZSAoYXBfaXNkaWdpdCgqc3RyaW5nX3BvcykpIHsgICAgICAvKiBhbmQgdGhlIDFzdCBudW1iZXIgKi8KLSAgICAgICAgICAgICAgICBzdHJpbmdfcG9zKys7Ci0JICAgIH0KLSAgICAgICAgICAgIHN0cmluZ19wb3MrKzsgICAgICAgLyogc2tpcCB0aGUgJywnICovCi0gICAgICAgICAgICB3aGlsZSAoYXBfaXNzcGFjZSgqc3RyaW5nX3BvcykpIHsgICAgICAvKiBwYXN0IGFueSBtb3JlIHdoaXRlc3BhY2UgKi8KLSAgICAgICAgICAgICAgICBzdHJpbmdfcG9zKys7Ci0JICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChhcF9pc2RpZ2l0KCpzdHJpbmdfcG9zKSkgeyAgICAgIC8qIDJuZCBudW1iZXIgKi8KLSAgICAgICAgICAgICAgICBzdHJpbmdfcG9zKys7Ci0JICAgIH0KLSAgICAgICAgICAgIHZlcnRleCsrOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBzbyBsb25nIGFzIHRoZXJlIGFyZSBtb3JlIHZlcnRpY2VzIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQsIGFuZCB3ZSBoYXZlIHJvb20sIHJlYWQgdGhlbSBpbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2Ugc3RhcnQgd2hlcmUgd2UgbGVmdCBvZmYgb2YgdGhlIGxhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NjYW5mLCBub3QgYXQgdGhlIGJlZ2lubmluZy4gKi8KLQotICAgICAgICBwb2ludGFycmF5W3ZlcnRleF1bWF0gPSAtMTsgICAgIC8qIHNpZ25hbHMgdGhlIGVuZCBvZiB2ZXJ0aWNlcyAqLwotCi0gICAgICAgIGlmIChzaG93bWVudSkgewotCSAgICBpZiAoIWhyZWZfdGV4dCkgewotCQlyZWFkX3F1b3RlZCgmc3RyaW5nX3BvcywgJmhyZWZfdGV4dCk7ICAgICAvKiBocmVmIHRleHQgY291bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBoZXJlIGluc3RlYWQgKi8KLQkgICAgfQotICAgICAgICAgICAgcmVkaXJlY3QgPSBpbWFwX3VybChyLCBiYXNlLCB2YWx1ZSk7Ci0JICAgIGlmICghcmVkaXJlY3QpIHsKLQkJZ290byBtZW51X2JhaWw7Ci0JICAgIH0KLSAgICAgICAgICAgIG1lbnVfZGlyZWN0aXZlKHIsIGltYXBfbWVudSwgcmVkaXJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmX3RleHQgPyBocmVmX3RleHQgOiB2YWx1ZSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvKiBub3RlIHRoYXQgd2UgZG9uJ3QgbWFrZSBpdCBwYXN0IGhlcmUgaWYgd2UgYXJlIG1ha2luZyBhIG1lbnUgKi8KLQotICAgICAgICBpZiAodGVzdHBvaW50W1hdID09IC0xIHx8IHBvaW50YXJyYXlbMF1bWF0gPT0gLTEpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgLyogZG9uJ3QgdHJ5IHRoZSBmb2xsb3dpbmcgdGVzdHMgaWYgdGVzdHBvaW50cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgaW52YWxpZCwgb3IgaWYgdGhlcmUgYXJlIG5vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzICovCi0JfQotCi0gICAgICAgIGlmICghc3RyY2FzZWNtcChkaXJlY3RpdmUsICJwb2x5IikpIHsgICAvKiBwb2x5ICovCi0KLSAgICAgICAgICAgIGlmIChwb2ludGlucG9seSh0ZXN0cG9pbnQsIHBvaW50YXJyYXkpKSB7Ci0JCWFwX2NmZ19jbG9zZWZpbGUoaW1hcCk7Ci0gICAgICAgICAgICAgICAgcmVkaXJlY3QgPSBpbWFwX3VybChyLCBiYXNlLCB2YWx1ZSk7Ci0JCWlmICghcmVkaXJlY3QpIHsKLQkJICAgIHJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLQkJfQotICAgICAgICAgICAgICAgIHJldHVybiAoaW1hcF9yZXBseShyLCByZWRpcmVjdCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXN0cmNhc2VjbXAoZGlyZWN0aXZlLCAiY2lyY2xlIikpIHsgICAgICAgICAvKiBjaXJjbGUgKi8KLQotICAgICAgICAgICAgaWYgKHBvaW50aW5jaXJjbGUodGVzdHBvaW50LCBwb2ludGFycmF5KSkgewotCQlhcF9jZmdfY2xvc2VmaWxlKGltYXApOwotICAgICAgICAgICAgICAgIHJlZGlyZWN0ID0gaW1hcF91cmwociwgYmFzZSwgdmFsdWUpOwotCQlpZiAoIXJlZGlyZWN0KSB7Ci0JCSAgICByZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0JCX0KLSAgICAgICAgICAgICAgICByZXR1cm4gKGltYXBfcmVwbHkociwgcmVkaXJlY3QpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFzdHJjYXNlY21wKGRpcmVjdGl2ZSwgInJlY3QiKSkgeyAgIC8qIHJlY3QgKi8KLQotICAgICAgICAgICAgaWYgKHBvaW50aW5yZWN0KHRlc3Rwb2ludCwgcG9pbnRhcnJheSkpIHsKLQkJYXBfY2ZnX2Nsb3NlZmlsZShpbWFwKTsKLSAgICAgICAgICAgICAgICByZWRpcmVjdCA9IGltYXBfdXJsKHIsIGJhc2UsIHZhbHVlKTsKLQkJaWYgKCFyZWRpcmVjdCkgewotCQkgICAgcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotCQl9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChpbWFwX3JlcGx5KHIsIHJlZGlyZWN0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghc3RyY2FzZWNtcChkaXJlY3RpdmUsICJwb2ludCIpKSB7ICAvKiBwb2ludCAqLwotCi0gICAgICAgICAgICBpZiAoaXNfY2xvc2VyKHRlc3Rwb2ludCwgcG9pbnRhcnJheSwgJmNsb3Nlc3RfeWV0KSkgewotCQljbG9zZXN0ID0gYXBfcHN0cmR1cChyLT5wb29sLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3ZlIG9uIHRvIG5leHQgbGluZSB3aGV0aGVyIGl0J3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdCBvciBub3QgKi8KLQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3RoaW5nIG1hdGNoZWQsIHNvIHdlIGdldCBhbm90aGVyIGxpbmUhICovCi0KLSAgICBhcF9jZmdfY2xvc2VmaWxlKGltYXApOyAgICAgICAgLyogd2UgYXJlIGRvbmUgd2l0aCB0aGUgbWFwIGZpbGU7IGNsb3NlIGl0ICovCi0KLSAgICBpZiAoc2hvd21lbnUpIHsKLSAgICAgICAgbWVudV9mb290ZXIocik7ICAgICAgICAgLyogZmluaXNoIHRoZSBtZW51IGFuZCB3ZSBhcmUgZG9uZSAqLwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgaWYgKGNsb3Nlc3QpIHsgICAgICAgICAgICAgLyogaWYgYSAncG9pbnQnIGRpcmVjdGl2ZSBoYXMgYmVlbiBzZWVuICovCi0gICAgICAgIHJlZGlyZWN0ID0gaW1hcF91cmwociwgYmFzZSwgY2xvc2VzdCk7Ci0JaWYgKCFyZWRpcmVjdCkgewotCSAgICByZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0JfQotICAgICAgICByZXR1cm4gKGltYXBfcmVwbHkociwgcmVkaXJlY3QpKTsKLSAgICB9Ci0KLSAgICBpZiAobWFwZGZsdCkgeyAgICAgICAgICAgICAvKiBhIGRlZmF1bHQgc2hvdWxkIGJlIGRlZmluZWQsIGV2ZW4gaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5ICdub2NvbnRlbnQnICovCi0gICAgICAgIHJlZGlyZWN0ID0gaW1hcF91cmwociwgYmFzZSwgbWFwZGZsdCk7Ci0JaWYgKCFyZWRpcmVjdCkgewotCSAgICByZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0JfQotICAgICAgICByZXR1cm4gKGltYXBfcmVwbHkociwgcmVkaXJlY3QpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7ICAgICAgICAvKiBJZiB3ZSBtYWtlIGl0IHRoaXMgZmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlIGZhaWxlZC4gVGhleSBsb3NlISAqLwotCi1uZWVkXzJfZmllbGRzOgotICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0JCSJtYXAgZmlsZSAlcywgbGluZSAlZCBzeW50YXggZXJyb3I6IHJlcXVpcmVzIGF0ICIKLSAgICAgICAgICAgICAgICAibGVhc3QgdHdvIGZpZWxkcyIsIHItPnVyaSwgaW1hcC0+bGluZV9udW1iZXIpOwotICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotbWVudV9iYWlsOgotICAgIGFwX2NmZ19jbG9zZWZpbGUoaW1hcCk7Ci0gICAgaWYgKHNob3dtZW51KSB7Ci0JLyogVGhlcmUncyBub3QgbXVjaCBlbHNlIHdlIGNhbiBkbyAuLi4gd2UndmUgYWxyZWFkeSBzZW50IHRoZSBoZWFkZXJzCi0JICogdG8gdGhlIGNsaWVudC4KLQkgKi8KLQlhcF9ycHV0cygiXG5cblthbiBpbnRlcm5hbCBzZXJ2ZXIgZXJyb3Igb2NjdXJlZF1cbiIsIHIpOwotCW1lbnVfZm9vdGVyKHIpOwotCXJldHVybiBPSzsKLSAgICB9Ci0gICAgcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotfQotCi0KLXN0YXRpYyBjb25zdCBoYW5kbGVyX3JlYyBpbWFwX2hhbmRsZXJzW10gPQotewotICAgIHtJTUFQX01BR0lDX1RZUEUsIGltYXBfaGFuZGxlcn0sCi0gICAgeyJpbWFwLWZpbGUiLCBpbWFwX2hhbmRsZXJ9LAotICAgIHtOVUxMfQotfTsKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGltYXBfbW9kdWxlID0KLXsKLSAgICBTVEFOREFSRF9NT0RVTEVfU1RVRkYsCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemVyICovCi0gICAgY3JlYXRlX2ltYXBfZGlyX2NvbmZpZywgICAgIC8qIGRpciBjb25maWcgY3JlYXRlciAqLwotICAgIG1lcmdlX2ltYXBfZGlyX2NvbmZpZ3MsICAgICAvKiBkaXIgbWVyZ2VyIC0tLSBkZWZhdWx0IGlzIHRvIG92ZXJyaWRlICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcnZlciBjb25maWcgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLwotICAgIGltYXBfY21kcywgICAgICAgICAgICAgICAgICAvKiBjb21tYW5kIHRhYmxlICovCi0gICAgaW1hcF9oYW5kbGVycywgICAgICAgICAgICAgIC8qIGhhbmRsZXJzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGVuYW1lIHRyYW5zbGF0aW9uICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrX3VzZXJfaWQgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgYXV0aCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBhY2Nlc3MgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHlwZV9jaGVja2VyICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpeHVwcyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2dnZXIgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaGVhZGVyIHBhcnNlciAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGlsZF9pbml0ICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoaWxkX2V4aXQgKi8KLSAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdCByZWFkLXJlcXVlc3QgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL21hcHBlcnMvbW9kX2ltYXAuZHNwIGIvbW9kdWxlcy9tYXBwZXJzL21vZF9pbWFwLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ1NzA2OS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21hcHBlcnMvbW9kX2ltYXAuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ibW9kX2ltYXAiIC0gUGFja2FnZSBPd25lcj08ND4KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDAKLSMgKiogRE8gTk9UIEVESVQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDEwMgotCi1DRkc9bW9kX2ltYXAgLSBXaW4zMiBSZWxlYXNlCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIm1vZF9pbWFwLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAibW9kX2ltYXAubWFrIiBDRkc9Im1vZF9pbWFwIC0gV2luMzIgUmVsZWFzZSIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJtb2RfaW1hcCAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgIm1vZF9pbWFwIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1NVEw9bWlkbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAibW9kX2ltYXAgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9JICIuLi8uLi9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci11dGlsL2luY2x1ZGUiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRmQiUmVsZWFzZVxtb2RfaW1hcCIgL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9tYWNoaW5lOkkzODYgL291dDoiUmVsZWFzZS9tb2RfaW1hcC5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfaW1hcAotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYXAgL21hY2hpbmU6STM4NiAvb3V0OiJSZWxlYXNlL21vZF9pbWFwLnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF9pbWFwCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJtb2RfaW1hcCAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTURkIC9XMyAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTURkIC9XMyAvR1ggL1ppIC9PZCAvSSAiLi4vLi4vaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHIvaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHItdXRpbC9pbmNsdWRlIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0ZkIkRlYnVnXG1vZF9pbWFwIiAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9pbmNyZW1lbnRhbDpubyAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6IkRlYnVnL21vZF9pbWFwLnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF9pbWFwCi0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2luY3JlbWVudGFsOm5vIC9tYXAgL2RlYnVnIC9tYWNoaW5lOkkzODYgL291dDoiRGVidWcvbW9kX2ltYXAuc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX2ltYXAKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIm1vZF9pbWFwIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAibW9kX2ltYXAgLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kX2ltYXAuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kX2ltYXAucmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxidWlsZFx3aW4zMlx3aW4zMnZlci5hd2sKLQotIUlGICAiJChDRkcpIiA9PSAibW9kX2ltYXAgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIENyZWF0aW5nIFZlcnNpb24gUmVzb3VyY2UKLUlucHV0UGF0aD0uLlwuLlxidWlsZFx3aW4zMlx3aW4zMnZlci5hd2sKLQotIi5cbW9kX2ltYXAucmMiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JYXdrIC1mIC4uLy4uL2J1aWxkL3dpbjMyL3dpbjMydmVyLmF3ayBtb2RfaW1hcCAgImltYXBfbW9kdWxlIGZvciBBcGFjaGUiIC4uLy4uL2luY2x1ZGUvYXBfcmVsZWFzZS5oID4gLlxtb2RfaW1hcC5yYwotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9pbWFwIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQ3JlYXRpbmcgVmVyc2lvbiBSZXNvdXJjZQotSW5wdXRQYXRoPS4uXC4uXGJ1aWxkXHdpbjMyXHdpbjMydmVyLmF3awotCi0iLlxtb2RfaW1hcC5yYyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQlhd2sgLWYgLi4vLi4vYnVpbGQvd2luMzIvd2luMzJ2ZXIuYXdrIG1vZF9pbWFwICAiaW1hcF9tb2R1bGUgZm9yIEFwYWNoZSIgLi4vLi4vaW5jbHVkZS9hcF9yZWxlYXNlLmggPiAuXG1vZF9pbWFwLnJjCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWFwcGVycy9tb2RfaW1hcC5leHAgYi9tb2R1bGVzL21hcHBlcnMvbW9kX2ltYXAuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTBlMGI4Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWFwcGVycy9tb2RfaW1hcC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbWFwX21vZHVsZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tYXBwZXJzL21vZF9uZWdvdGlhdGlvbi5jIGIvbW9kdWxlcy9tYXBwZXJzL21vZF9uZWdvdGlhdGlvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjc0MTEyLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWFwcGVycy9tb2RfbmVnb3RpYXRpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDI3NDggKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogbW9kX25lZ290aWF0aW9uLmM6IGtlZXBzIHRyYWNrIG9mIE1JTUUgdHlwZXMgdGhlIGNsaWVudCBpcyB3aWxsaW5nIHRvCi0gKiBhY2NlcHQsIGFuZCBjb250YWlucyBjb2RlIHRvIGhhbmRsZSB0eXBlIGFyYml0cmF0aW9uLgotICoKLSAqIHJzdAotICovCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCi0jaW5jbHVkZSAiaHR0cF9wcm90b2NvbC5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAidXRpbF9zY3JpcHQuaCIKLQotLyogQ29tbWFuZHMgLS0tIGNvbmZpZ3VyaW5nIGRvY3VtZW50IGNhY2hpbmcgb24gYSBwZXIgKHZpcnR1YWw/KQotICogc2VydmVyIGJhc2lzLi4uIAotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBhcnJheV9oZWFkZXIgKmxhbmd1YWdlX3ByaW9yaXR5OwotfSBuZWdfZGlyX2NvbmZpZzsKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIG5lZ290aWF0aW9uX21vZHVsZTsKLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9uZWdfZGlyX2NvbmZpZyhwb29sICpwLCBjaGFyICpkdW1teSkKLXsKLSAgICBuZWdfZGlyX2NvbmZpZyAqbmV3ID0gKG5lZ19kaXJfY29uZmlnICopIGFwX3BhbGxvYyhwLCBzaXplb2YobmVnX2Rpcl9jb25maWcpKTsKLQotICAgIG5ldy0+bGFuZ3VhZ2VfcHJpb3JpdHkgPSBhcF9tYWtlX2FycmF5KHAsIDQsIHNpemVvZihjaGFyICopKTsKLSAgICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgdm9pZCAqbWVyZ2VfbmVnX2Rpcl9jb25maWdzKHBvb2wgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICphZGR2KQotewotICAgIG5lZ19kaXJfY29uZmlnICpiYXNlID0gKG5lZ19kaXJfY29uZmlnICopIGJhc2V2OwotICAgIG5lZ19kaXJfY29uZmlnICphZGQgPSAobmVnX2Rpcl9jb25maWcgKikgYWRkdjsKLSAgICBuZWdfZGlyX2NvbmZpZyAqbmV3ID0gKG5lZ19kaXJfY29uZmlnICopIGFwX3BhbGxvYyhwLCBzaXplb2YobmVnX2Rpcl9jb25maWcpKTsKLQotICAgIC8qIGdpdmUgcHJpb3JpdHkgdG8gdGhlIGNvbmZpZyBpbiB0aGUgc3ViZGlyZWN0b3J5ICovCi0gICAgbmV3LT5sYW5ndWFnZV9wcmlvcml0eSA9IGFwX2FwcGVuZF9hcnJheXMocCwgYWRkLT5sYW5ndWFnZV9wcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5sYW5ndWFnZV9wcmlvcml0eSk7Ci0gICAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9sYW5ndWFnZV9wcmlvcml0eShjbWRfcGFybXMgKmNtZCwgdm9pZCAqbiwgY2hhciAqbGFuZykKLXsKLSAgICBhcnJheV9oZWFkZXIgKmFyciA9ICgobmVnX2Rpcl9jb25maWcgKikgbiktPmxhbmd1YWdlX3ByaW9yaXR5OwotICAgIGNoYXIgKipsYW5ncCA9IChjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycik7Ci0KLSAgICAqbGFuZ3AgPSBsYW5nOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqY2FjaGVfbmVnb3RpYXRlZF9kb2NzKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZHVtbXkyKQotewotICAgIHZvaWQgKnNlcnZlcl9jb25mID0gY21kLT5zZXJ2ZXItPm1vZHVsZV9jb25maWc7Ci0KLSAgICBhcF9zZXRfbW9kdWxlX2NvbmZpZyhzZXJ2ZXJfY29uZiwgJm5lZ290aWF0aW9uX21vZHVsZSwgIkNhY2hlIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgZG9fY2FjaGVfbmVnb3RpYXRlZF9kb2NzKHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgcmV0dXJuIChhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAmbmVnb3RpYXRpb25fbW9kdWxlKSAhPSBOVUxMKTsKLX0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIG5lZ290aWF0aW9uX2NtZHNbXSA9Ci17Ci0gICAgeyJDYWNoZU5lZ290aWF0ZWREb2NzIiwgY2FjaGVfbmVnb3RpYXRlZF9kb2NzLCBOVUxMLCBSU1JDX0NPTkYsIE5PX0FSR1MsCi0gICAgICJubyBhcmd1bWVudHMgKGVpdGhlciBwcmVzZW50IG9yIGFic2VudCkifSwKLSAgICB7Ikxhbmd1YWdlUHJpb3JpdHkiLCBzZXRfbGFuZ3VhZ2VfcHJpb3JpdHksIE5VTEwsIE9SX0ZJTEVJTkZPLCBJVEVSQVRFLAotICAgICAic3BhY2UtZGVsaW1pdGVkIGxpc3Qgb2YgTUlNRSBsYW5ndWFnZSBhYmJyZXZpYXRpb25zIn0sCi0gICAge05VTEx9Ci19OwotCi0vKgotICogUmVjb3JkIG9mIGF2YWlsYWJsZSBpbmZvIG9uIGEgbWVkaWEgdHlwZSBzcGVjaWZpZWQgYnkgdGhlIGNsaWVudAotICogKHdlIGFsc28gdXNlICdlbSBmb3IgZW5jb2RpbmdzIGFuZCBsYW5ndWFnZXMpCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgYWNjZXB0X3JlYyB7Ci0gICAgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAgIC8qIE1VU1QgYmUgbG93ZXJjYXNlICovCi0gICAgZmxvYXQgcXVhbGl0eTsKLSAgICBmbG9hdCBsZXZlbDsKLSAgICBjaGFyICpjaGFyc2V0OyAgICAgICAgICAgICAgLyogZm9yIGNvbnRlbnQtdHlwZSBvbmx5ICovCi19IGFjY2VwdF9yZWM7Ci0KLS8qCi0gKiBSZWNvcmQgb2YgYXZhaWxhYmxlIGluZm8gb24gYSBwYXJ0aWN1bGFyIHZhcmlhbnQKLSAqCi0gKiBOb3RlIHRoYXQgYSBmZXcgb2YgdGhlc2UgZmllbGRzIGFyZSB1cGRhdGVkIGJ5IHRoZSBhY3R1YWwgbmVnb3RpYXRpb24KLSAqIGNvZGUuICBUaGVzZSBhcmU6Ci0gKgotICogbGV2ZWxfbWF0Y2hlZCAtLS0gaW5pdGlhbGl6ZWQgdG8gemVyby4gIFNldCB0byB0aGUgdmFsdWUgb2YgbGV2ZWwKLSAqICAgICAgICAgICAgIGlmIHRoZSBjbGllbnQgYWN0dWFsbHkgYWNjZXB0cyB0aGlzIG1lZGlhIHR5cGUgYXQgdGhhdAotICogICAgICAgICAgICAgbGV2ZWwgKGFuZCAqbm90KiBpZiBpdCBnb3QgaW4gb24gYSB3aWxkY2FyZCkuICBTZWUgbGV2ZWxfY21wCi0gKiAgICAgICAgICAgICBiZWxvdy4KLSAqIG1pbWVfc3RhcnMgLS0gaW5pdGlhbGl6ZWQgdG8gemVyby4gIFNldCB0byB0aGUgbnVtYmVyIG9mIHN0YXJzCi0gKiAgICAgICAgICAgICAgIHByZXNlbnQgaW4gdGhlIGJlc3QgbWF0Y2hpbmcgQWNjZXB0IGhlYWRlciBlbGVtZW50LgotICogICAgICAgICAgICAgICAxIGZvciBzdGFyL3N0YXIsIDIgZm9yIHR5cGUvc3RhciBhbmQgMyBmb3IKLSAqICAgICAgICAgICAgICAgdHlwZS9zdWJ0eXBlLgotICoKLSAqIGRlZmluaXRlIC0tIGluaXRpYWxpemVkIHRvIDEuICBTZXQgdG8gMCBpZiB0aGVyZSBpcyBhIG1hdGNoIHdoaWNoCi0gKiAgICAgICAgICAgICBtYWtlcyB0aGUgdmFyaWFudCBub24tZGVmaW5pdGUgYWNjb3JkaW5nIHRvIHRoZSBydWxlcwotICogICAgICAgICAgICAgaW4gcmZjMjI5Ni4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB2YXJfcmVjIHsKLSAgICByZXF1ZXN0X3JlYyAqc3ViX3JlcTsgICAgICAgLyogTWF5IGJlIE5VTEwgKGlzLCBmb3IgbWFwIGZpbGVzKSAqLwotICAgIGNoYXIgKm1pbWVfdHlwZTsgICAgICAgICAgICAvKiBNVVNUIGJlIGxvd2VyY2FzZSAqLwotICAgIGNoYXIgKmZpbGVfbmFtZTsKLSAgICBjb25zdCBjaGFyICpjb250ZW50X2VuY29kaW5nOwotICAgIGFycmF5X2hlYWRlciAqY29udGVudF9sYW5ndWFnZXM7ICAgLyogbGlzdCBvZiBsYW5ndWFnZXMgZm9yIHRoaXMgdmFyaWFudCAqLwotICAgIGNoYXIgKmNvbnRlbnRfY2hhcnNldDsKLSAgICBjaGFyICpkZXNjcmlwdGlvbjsKLQotICAgIC8qIFRoZSBuZXh0IGZpdmUgaXRlbXMgZ2l2ZSB0aGUgcXVhbGl0eSB2YWx1ZXMgZm9yIHRoZSBkaW1lbnNpb25zCi0gICAgICogb2YgbmVnb3RpYXRpb24gZm9yIHRoaXMgdmFyaWFudC4gVGhleSBhcmUgb2J0YWluZWQgZnJvbSB0aGUKLSAgICAgKiBhcHByb3ByaWF0ZSBoZWFkZXIgbGluZXMsIGV4Y2VwdCBmb3Igc291cmNlX3F1YWxpdHksIHdoaWNoCi0gICAgICogaXMgb2J0YWluZWQgZnJvbSB0aGUgdmFyaWFudCBpdHNlbGYgKHRoZSAncXMnIHBhcmFtZXRlciB2YWx1ZQotICAgICAqIGZyb20gdGhlIHZhcmlhbnQncyBtaW1lLXR5cGUpLiBBcGFydCBmcm9tIHNvdXJjZV9xdWFsaXR5LAotICAgICAqIHRoZXNlIHZhbHVlcyBhcmUgc2V0IHdoZW4gd2UgZmluZCB0aGUgcXVhbGl0eSBmb3IgZWFjaCB2YXJpYW50Ci0gICAgICogKHNlZSBiZXN0X21hdGNoKCkpLiBzb3VyY2VfcXVhbGl0eSBpcyBzZXQgZnJvbSB0aGUgJ3FzJyBwYXJhbWV0ZXIKLSAgICAgKiBvZiB0aGUgdmFyaWFudCBkZXNjcmlwdGlvbiBvciBtaW1lIHR5cGU6IHNlZSBzZXRfbWltZV9maWVsZHMoKS4KLSAgICAgKi8KLSAgICBmbG9hdCBsYW5nX3F1YWxpdHk7ICAgICAgICAgLyogcXVhbGl0eSBvZiB0aGlzIHZhcmlhbnQncyBsYW5ndWFnZSAqLwotICAgIGZsb2F0IGVuY29kaW5nX3F1YWxpdHk7ICAgICAvKiBkaXR0byBlbmNvZGluZyAqLwotICAgIGZsb2F0IGNoYXJzZXRfcXVhbGl0eTsgICAgICAvKiBkaXR0byBjaGFyc2V0ICovCi0gICAgZmxvYXQgbWltZV90eXBlX3F1YWxpdHk7ICAgIC8qIGRpdHRvIG1lZGlhIHR5cGUgKi8KLSAgICBmbG9hdCBzb3VyY2VfcXVhbGl0eTsgICAgICAgLyogc291cmNlIHF1YWxpdHkgZm9yIHRoaXMgdmFyaWFudCAqLwotCi0gICAgLyogTm93IHNvbWUgc3BlY2lhbCB2YWx1ZXMgKi8KLSAgICBmbG9hdCBsZXZlbDsgICAgICAgICAgICAgICAgLyogQXV4aWxpYXJ5IHRvIGNvbnRlbnQtdHlwZS4uLiAqLwotICAgIGZsb2F0IGJ5dGVzOyAgICAgICAgICAgICAgICAvKiBjb250ZW50IGxlbmd0aCwgaWYga25vd24gKi8KLSAgICBpbnQgbGFuZ19pbmRleDsgICAgICAgICAgICAgLyogcHJlIEhUVFAvMS4xIGxhbmd1YWdlIHByaW9yaXR5IHN0dWZmICovCi0gICAgaW50IGlzX3BzZXVkb19odG1sOyAgICAgICAgIC8qIHRleHQvaHRtbCwgKm9yKiB0aGUgSU5DTFVERVNfTUFHSUNfVFlQRXMgKi8KLQotICAgIC8qIEFib3ZlIGFyZSBhbGwgd3JpdHRlbi1vbmNlIHByb3BlcnRpZXMgb2YgdGhlIHZhcmlhbnQuICBUaGUKLSAgICAgKiB0aHJlZSBmaWVsZHMgYmVsb3cgYXJlIGNoYW5nZWQgZHVyaW5nIG5lZ290aWF0aW9uOgotICAgICAqLwotCi0gICAgZmxvYXQgbGV2ZWxfbWF0Y2hlZDsKLSAgICBpbnQgbWltZV9zdGFyczsKLSAgICBpbnQgZGVmaW5pdGU7Ci19IHZhcl9yZWM7Ci0KLS8qIFNvbWV0aGluZyB0byBjYXJyeSBhcm91bmQgdGhlIHN0YXRlIG9mIG5lZ290aWF0aW9uIChhbmQgdG8ga2VlcAotICogYWxsIG9mIHRoaXMgdGhyZWFkLXNhZmUpLi4uCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHBvb2wgKnBvb2w7Ci0gICAgcmVxdWVzdF9yZWMgKnI7Ci0gICAgY2hhciAqZGlyX25hbWU7Ci0gICAgaW50IGFjY2VwdF9xOyAgICAgICAgICAgICAgIC8qIDEgaWYgYW4gQWNjZXB0IGl0ZW0gaGFzIGEgcT0gcGFyYW0gKi8KLSAgICBmbG9hdCBkZWZhdWx0X2xhbmdfcXVhbGl0eTsgLyogZmlkZGxlIGxhbmcgcSBmb3IgdmFyaWFudHMgd2l0aCBubyBsYW5nICovCi0KLSAgICAvKiB0aGUgYXJyYXkgcG9pbnRlcnMgYmVsb3cgYXJlIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgYWNjZXB0Ci0gICAgICogaGVhZGVycyBhcmUgbm90IHByZXNlbnQKLSAgICAgKi8KLSAgICBhcnJheV9oZWFkZXIgKmFjY2VwdHM7ICAgICAgICAgICAgLyogYWNjZXB0X3JlY3MgKi8KLSAgICBhcnJheV9oZWFkZXIgKmFjY2VwdF9lbmNvZGluZ3M7ICAgLyogYWNjZXB0X3JlY3MgKi8KLSAgICBhcnJheV9oZWFkZXIgKmFjY2VwdF9jaGFyc2V0czsgICAgLyogYWNjZXB0X3JlY3MgKi8KLSAgICBhcnJheV9oZWFkZXIgKmFjY2VwdF9sYW5nczsgICAgICAgLyogYWNjZXB0X3JlY3MgKi8KLQotICAgIGFycmF5X2hlYWRlciAqYXZhaWxfdmFyczsgICAgICAgICAvKiBhdmFpbGFibGUgdmFyaWFudHMgKi8KLQotICAgIGludCBjb3VudF9tdWx0aXZpZXdzX3ZhcmlhbnRzOyAgICAvKiBudW1iZXIgb2YgdmFyaWFudHMgZm91bmQgb24gZGlzayAqLwotCi0gICAgaW50IGlzX3RyYW5zcGFyZW50OyAgICAgICAvKiAxIGlmIHRoaXMgcmVzb3VyY2UgaXMgdHJhbnMuIG5lZ290aWFibGUgKi8KLQotICAgIGludCBkb250X2ZpZGRsZV9oZWFkZXJzOyAgLyogMSBpZiB3ZSBtYXkgbm90IGZpZGRsZSB3aXRoIGFjY2VwdCBoZHJzICovCi0gICAgaW50IHVhX3N1cHBvcnRzX3RyYW5zOyAgICAvKiAxIGlmIHVhIHN1cHBvcnRzIHRyYW5zIG5lZ290aWF0aW9uICovCi0gICAgaW50IHNlbmRfYWx0ZXJuYXRlczsgICAgICAvKiAxIGlmIHdlIHdhbnQgdG8gc2VuZCBhbiBBbHRlcm5hdGVzIGhlYWRlciAqLwotICAgIGludCBtYXlfY2hvb3NlOyAgICAgICAgICAgLyogMSBpZiB3ZSBtYXkgY2hvb3NlIGEgdmFyaWFudCBmb3IgdGhlIGNsaWVudCAqLwotICAgIGludCB1c2VfcnZzYTsgICAgICAgICAgICAgLyogMSBpZiB3ZSBtdXN0IHVzZSBSVlNBLzEuMCBuZWdvdGlhdGlvbiBhbGdvICovCi19IG5lZ290aWF0aW9uX3N0YXRlOwotCi0vKiBBIGZldyBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSB2YXJfcmVjcy4KLSAqIENsZWFuaW5nIG91dCB0aGUgZmllbGRzLi4uCi0gKi8KLQotc3RhdGljIHZvaWQgY2xlYW5fdmFyX3JlYyh2YXJfcmVjICptaW1lX2luZm8pCi17Ci0gICAgbWltZV9pbmZvLT5zdWJfcmVxID0gTlVMTDsKLSAgICBtaW1lX2luZm8tPm1pbWVfdHlwZSA9ICIiOwotICAgIG1pbWVfaW5mby0+ZmlsZV9uYW1lID0gIiI7Ci0gICAgbWltZV9pbmZvLT5jb250ZW50X2VuY29kaW5nID0gTlVMTDsKLSAgICBtaW1lX2luZm8tPmNvbnRlbnRfbGFuZ3VhZ2VzID0gTlVMTDsKLSAgICBtaW1lX2luZm8tPmNvbnRlbnRfY2hhcnNldCA9ICIiOwotICAgIG1pbWVfaW5mby0+ZGVzY3JpcHRpb24gPSAiIjsKLQotICAgIG1pbWVfaW5mby0+aXNfcHNldWRvX2h0bWwgPSAwOwotICAgIG1pbWVfaW5mby0+bGV2ZWwgPSAwLjBmOwotICAgIG1pbWVfaW5mby0+bGV2ZWxfbWF0Y2hlZCA9IDAuMGY7Ci0gICAgbWltZV9pbmZvLT5ieXRlcyA9IDAuMGY7Ci0gICAgbWltZV9pbmZvLT5sYW5nX2luZGV4ID0gLTE7Ci0gICAgbWltZV9pbmZvLT5taW1lX3N0YXJzID0gMDsKLSAgICBtaW1lX2luZm8tPmRlZmluaXRlID0gMTsKLQotICAgIG1pbWVfaW5mby0+Y2hhcnNldF9xdWFsaXR5ID0gMS4wZjsKLSAgICBtaW1lX2luZm8tPmVuY29kaW5nX3F1YWxpdHkgPSAxLjBmOwotICAgIG1pbWVfaW5mby0+bGFuZ19xdWFsaXR5ID0gMS4wZjsKLSAgICBtaW1lX2luZm8tPm1pbWVfdHlwZV9xdWFsaXR5ID0gMS4wZjsKLSAgICBtaW1lX2luZm8tPnNvdXJjZV9xdWFsaXR5ID0gMC4wZjsKLX0KLQotLyogSW5pdGlhbGl6aW5nIHRoZSByZWxldmFudCBmaWVsZHMgb2YgYSB2YXJpYW50IHJlY29yZCBmcm9tIHRoZQotICogYWNjZXB0X2luZm8gcmVhZCBvdXQgb2YgaXRzIGNvbnRlbnQtdHlwZSwgb25lIHdheSBvciBhbm90aGVyLgotICovCi0KLXN0YXRpYyB2b2lkIHNldF9taW1lX2ZpZWxkcyh2YXJfcmVjICp2YXIsIGFjY2VwdF9yZWMgKm1pbWVfaW5mbykKLXsKLSAgICB2YXItPm1pbWVfdHlwZSA9IG1pbWVfaW5mby0+bmFtZTsKLSAgICB2YXItPnNvdXJjZV9xdWFsaXR5ID0gbWltZV9pbmZvLT5xdWFsaXR5OwotICAgIHZhci0+bGV2ZWwgPSBtaW1lX2luZm8tPmxldmVsOwotICAgIHZhci0+Y29udGVudF9jaGFyc2V0ID0gbWltZV9pbmZvLT5jaGFyc2V0OwotCi0gICAgdmFyLT5pc19wc2V1ZG9faHRtbCA9ICghc3RyY21wKHZhci0+bWltZV90eXBlLCAidGV4dC9odG1sIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAodmFyLT5taW1lX3R5cGUsIElOQ0xVREVTX01BR0lDX1RZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhc3RyY21wKHZhci0+bWltZV90eXBlLCBJTkNMVURFU19NQUdJQ19UWVBFMykpOwotfQotCi0vKiBDcmVhdGUgYSB2YXJpYW50IGxpc3QgdmFsaWRhdG9yIGluIHIgdXNpbmcgaW5mbyBmcm9tIHZsaXN0ci4gKi8KLQotc3RhdGljIHZvaWQgc2V0X3ZsaXN0X3ZhbGlkYXRvcihyZXF1ZXN0X3JlYyAqciwgcmVxdWVzdF9yZWMgKnZsaXN0cikKLXsKLSAgICAvKiBDYWxjdWxhdGluZyB0aGUgdmFyaWFudCBsaXN0IHZhbGlkYXRvciBpcyBzaW1pbGFyIHRvCi0gICAgICogY2FsY3VsYXRpbmcgYW4gZXRhZyBmb3IgdGhlIHNvdXJjZSBvZiB0aGUgdmFyaWFudCBsaXN0Ci0gICAgICogaW5mb3JtYXRpb24sIHNvIHdlIHVzZSBhcF9tYWtlX2V0YWcoKS4gIE5vdGUgdGhhdCB0aGlzCi0gICAgICogdmFsaWRhdG9yIGNhbiBiZSAnd2VhaycgaW4gZXh0cmVtZSBjYXNlLgotICAgICAqLwotCi0gICAgYXBfdXBkYXRlX210aW1lICh2bGlzdHIsIHZsaXN0ci0+ZmluZm8uc3RfbXRpbWUpOwotICAgIHItPnZsaXN0X3ZhbGlkYXRvciA9IGFwX21ha2VfZXRhZyh2bGlzdHIsIDApOwotCi0gICAgLyogYXBfc2V0X2V0YWcgd2lsbCBsYXRlciB0YWtlIHItPnZsaXN0X3ZhbGlkYXRvciBpbnRvIGFjY291bnQKLSAgICAgKiB3aGVuIGNyZWF0aW5nIHRoZSBldGFnIGhlYWRlcgotICAgICAqLwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFBhcnNpbmcgKGxpc3RzIG9mKSBtZWRpYSB0eXBlcyBhbmQgdGhlaXIgcGFyYW1ldGVycywgYXMgc2VlbiBpbgotICogSFRUUEQgaGVhZGVyIGxpbmVzIGFuZCBlbHNld2hlcmUuCi0gKi8KLQotLyoKLSAqIEdldCBhIHNpbmdsZSBtaW1lIHR5cGUgZW50cnkgLS0tIG9uZSBtZWRpYSB0eXBlIGFuZCBwYXJhbWV0ZXJzOwotICogZW50ZXIgdGhlIHZhbHVlcyB3ZSByZWNvZ25pemUgaW50byB0aGUgYXJndW1lbnQgYWNjZXB0X3JlYwotICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpnZXRfZW50cnkocG9vbCAqcCwgYWNjZXB0X3JlYyAqcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphY2NlcHRfbGluZSkKLXsKLSAgICByZXN1bHQtPnF1YWxpdHkgPSAxLjBmOwotICAgIHJlc3VsdC0+bGV2ZWwgPSAwLjBmOwotICAgIHJlc3VsdC0+Y2hhcnNldCA9ICIiOwotCi0gICAgLyoKLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBoYW5kbGVzIHdoYXQgSSBnYXRoZXIgaXMgdGhlICJvbGQgZm9ybWF0IiwKLSAgICAgKgotICAgICAqICAgIEFjY2VwdDogdGV4dC9odG1sIHRleHQvcGxhaW4gbW9vL3pvdAotICAgICAqCi0gICAgICogd2l0aG91dCBhbnkgY29tcGF0aWJpbGl0eSBrbHVkZ2VzIC0tLSBpZiB0aGUgdG9rZW4gYWZ0ZXIgdGhlCi0gICAgICogTUlNRSB0eXBlIGJlZ2lucyB3aXRoIGEgc2VtaWNvbG9uLCB3ZSBrbm93IHdlJ3JlIGxvb2tpbmcgYXQgcGFybXMsCi0gICAgICogb3RoZXJ3aXNlLCB3ZSBrbm93IHdlIGFyZW4ndC4gIChTbyB3aHkgYWxsIHRoZSBwaXNzaW5nIGFuZCBtb2FuaW5nCi0gICAgICogaW4gdGhlIENFUk4gc2VydmVyIGNvZGU/ICBJIG11c3QgYmUgbWlzc2luZyBzb21ldGhpbmcpLgotICAgICAqLwotCi0gICAgcmVzdWx0LT5uYW1lID0gYXBfZ2V0X3Rva2VuKHAsICZhY2NlcHRfbGluZSwgMCk7Ci0gICAgYXBfc3RyX3RvbG93ZXIocmVzdWx0LT5uYW1lKTsgICAgIC8qIFlvdSB3YW50IGNhc2UtaW5zZW5zaXRpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHlvdSdsbCAqZ2V0KiBjYXNlLWluc2Vuc2l0aXZlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIC8qIEtMVURHRSEhISBEZWZhdWx0IEhUTUwgdG8gbGV2ZWwgMi4wIHVubGVzcyB0aGUgYnJvd3NlcgotICAgICAqICpleHBsaWNpdGx5KiBzYXlzIHNvbWV0aGluZyBlbHNlLgotICAgICAqLwotCi0gICAgaWYgKCFzdHJjbXAocmVzdWx0LT5uYW1lLCAidGV4dC9odG1sIikgJiYgKHJlc3VsdC0+bGV2ZWwgPT0gMC4wKSkgewotICAgICAgICByZXN1bHQtPmxldmVsID0gMi4wZjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChyZXN1bHQtPm5hbWUsIElOQ0xVREVTX01BR0lDX1RZUEUpKSB7Ci0gICAgICAgIHJlc3VsdC0+bGV2ZWwgPSAyLjBmOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKHJlc3VsdC0+bmFtZSwgSU5DTFVERVNfTUFHSUNfVFlQRTMpKSB7Ci0gICAgICAgIHJlc3VsdC0+bGV2ZWwgPSAzLjBmOwotICAgIH0KLQotICAgIHdoaWxlICgqYWNjZXB0X2xpbmUgPT0gJzsnKSB7Ci0gICAgICAgIC8qIFBhcmFtZXRlcnMgLi4uICovCi0KLSAgICAgICAgY2hhciAqcGFybTsKLSAgICAgICAgY2hhciAqY3A7Ci0gICAgICAgIGNoYXIgKmVuZDsKLQotICAgICAgICArK2FjY2VwdF9saW5lOwotICAgICAgICBwYXJtID0gYXBfZ2V0X3Rva2VuKHAsICZhY2NlcHRfbGluZSwgMSk7Ci0KLSAgICAgICAgLyogTG9vayBmb3IgJ3ZhciA9IHZhbHVlJyAtLS0gYW5kIG1ha2Ugc3VyZSB0aGUgdmFyIGlzIGluIGxjYXNlLiAqLwotCi0gICAgICAgIGZvciAoY3AgPSBwYXJtOyAoKmNwICYmICFhcF9pc3NwYWNlKCpjcCkgJiYgKmNwICE9ICc9Jyk7ICsrY3ApIHsKLSAgICAgICAgICAgICpjcCA9IGFwX3RvbG93ZXIoKmNwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghKmNwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgIC8qIE5vICc9JzsganVzdCBpZ25vcmUgaXQuICovCi0gICAgICAgIH0KLQotICAgICAgICAqY3ArKyA9ICdcMCc7ICAgICAgICAgICAvKiBEZWxpbWl0IHZhciAqLwotICAgICAgICB3aGlsZSAoKmNwICYmIChhcF9pc3NwYWNlKCpjcCkgfHwgKmNwID09ICc9JykpIHsKLSAgICAgICAgICAgICsrY3A7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKmNwID09ICciJykgewotICAgICAgICAgICAgKytjcDsKLSAgICAgICAgICAgIGZvciAoZW5kID0gY3A7Ci0gICAgICAgICAgICAgICAgICgqZW5kICYmICplbmQgIT0gJ1xuJyAmJiAqZW5kICE9ICdccicgJiYgKmVuZCAhPSAnXCInKTsKLSAgICAgICAgICAgICAgICAgZW5kKyspOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZm9yIChlbmQgPSBjcDsgKCplbmQgJiYgIWFwX2lzc3BhY2UoKmVuZCkpOyBlbmQrKyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCplbmQpIHsKLSAgICAgICAgICAgICplbmQgPSAnXDAnOyAgICAgICAgLyogc3RyaXAgZW5kaW5nIHF1b3RlIG9yIHJldHVybiAqLwotICAgICAgICB9Ci0gICAgICAgIGFwX3N0cl90b2xvd2VyKGNwKTsKLQotICAgICAgICBpZiAocGFybVswXSA9PSAncScKLSAgICAgICAgICAgICYmIChwYXJtWzFdID09ICdcMCcgfHwgKHBhcm1bMV0gPT0gJ3MnICYmIHBhcm1bMl0gPT0gJ1wwJykpKSB7Ci0gICAgICAgICAgICByZXN1bHQtPnF1YWxpdHkgPSBhdG9mKGNwKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJtWzBdID09ICdsJyAmJiAhc3RyY21wKCZwYXJtWzFdLCAiZXZlbCIpKSB7Ci0gICAgICAgICAgICByZXN1bHQtPmxldmVsID0gYXRvZihjcCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChwYXJtLCAiY2hhcnNldCIpKSB7Ci0gICAgICAgICAgICByZXN1bHQtPmNoYXJzZXQgPSBjcDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICgqYWNjZXB0X2xpbmUgPT0gJywnKSB7Ci0gICAgICAgICsrYWNjZXB0X2xpbmU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFjY2VwdF9saW5lOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBEZWFsaW5nIHdpdGggaGVhZGVyIGxpbmVzIC4uLgotICoKLSAqIEFjY2VwdCwgQWNjZXB0LUNoYXJzZXQsIEFjY2VwdC1MYW5ndWFnZSBhbmQgQWNjZXB0LUVuY29kaW5nCi0gKiBhcmUgaGFuZGxlZCBieSBkb19oZWFkZXJfbGluZSgpIC0gdGhleSBhbGwgaGF2ZSB0aGUgc2FtZQotICogYmFzaWMgc3RydWN0dXJlIG9mIGEgbGlzdCBvZiBpdGVtcyBvZiB0aGUgZm9ybWF0Ci0gKiAgICBuYW1lOyBxPU47IGNoYXJzZXQ9VEVYVAotICoKLSAqIHdoZXJlIGNoYXJzZXQgaXMgb25seSB2YWxpZCBpbiBBY2NlcHQuCi0gKi8KLQotc3RhdGljIGFycmF5X2hlYWRlciAqZG9faGVhZGVyX2xpbmUocG9vbCAqcCwgY29uc3QgY2hhciAqYWNjZXB0X2xpbmUpCi17Ci0gICAgYXJyYXlfaGVhZGVyICphY2NlcHRfcmVjczsKLQotICAgIGlmICghYWNjZXB0X2xpbmUpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgYWNjZXB0X3JlY3MgPSBhcF9tYWtlX2FycmF5KHAsIDQwLCBzaXplb2YoYWNjZXB0X3JlYykpOwotCi0gICAgd2hpbGUgKCphY2NlcHRfbGluZSkgewotICAgICAgICBhY2NlcHRfcmVjICpuZXcgPSAoYWNjZXB0X3JlYyAqKSBhcF9wdXNoX2FycmF5KGFjY2VwdF9yZWNzKTsKLSAgICAgICAgYWNjZXB0X2xpbmUgPSBnZXRfZW50cnkocCwgbmV3LCBhY2NlcHRfbGluZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFjY2VwdF9yZWNzOwotfQotCi0vKiBHaXZlbiB0aGUgdGV4dCBvZiB0aGUgQ29udGVudC1MYW5ndWFnZXM6IGxpbmUgZnJvbSB0aGUgdmFyIG1hcCBmaWxlLAotICogcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGxhbmd1YWdlcyBvZiB0aGlzIHZhcmlhbnQKLSAqLwotCi1zdGF0aWMgYXJyYXlfaGVhZGVyICpkb19sYW5ndWFnZXNfbGluZShwb29sICpwLCBjb25zdCBjaGFyICoqbGFuZ19saW5lKQotewotICAgIGFycmF5X2hlYWRlciAqbGFuZ19yZWNzID0gYXBfbWFrZV9hcnJheShwLCAyLCBzaXplb2YoY2hhciAqKSk7Ci0KLSAgICBpZiAoIWxhbmdfbGluZSkgewotICAgICAgICByZXR1cm4gbGFuZ19yZWNzOwotICAgIH0KLQotICAgIHdoaWxlICgqKmxhbmdfbGluZSkgewotICAgICAgICBjaGFyICoqbmV3ID0gKGNoYXIgKiopIGFwX3B1c2hfYXJyYXkobGFuZ19yZWNzKTsKLSAgICAgICAgKm5ldyA9IGFwX2dldF90b2tlbihwLCBsYW5nX2xpbmUsIDApOwotICAgICAgICBhcF9zdHJfdG9sb3dlcigqbmV3KTsKLSAgICAgICAgaWYgKCoqbGFuZ19saW5lID09ICcsJyB8fCAqKmxhbmdfbGluZSA9PSAnOycpIHsKLSAgICAgICAgICAgICsrKCpsYW5nX2xpbmUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGxhbmdfcmVjczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogSGFuZGxpbmcgaGVhZGVyIGxpbmVzIGZyb20gY2xpZW50cy4uLgotICovCi0KLXN0YXRpYyBuZWdvdGlhdGlvbl9zdGF0ZSAqcGFyc2VfYWNjZXB0X2hlYWRlcnMocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgbmVnb3RpYXRpb25fc3RhdGUgKm5ldyA9Ci0gICAgICAgIChuZWdvdGlhdGlvbl9zdGF0ZSAqKSBhcF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZWdvdGlhdGlvbl9zdGF0ZSkpOwotICAgIGFjY2VwdF9yZWMgKmVsdHM7Ci0gICAgdGFibGUgKmhkcnMgPSByLT5oZWFkZXJzX2luOwotICAgIGludCBpOwotCi0gICAgbmV3LT5wb29sID0gci0+cG9vbDsKLSAgICBuZXctPnIgPSByOwotICAgIG5ldy0+ZGlyX25hbWUgPSBhcF9tYWtlX2RpcnN0cl9wYXJlbnQoci0+cG9vbCwgci0+ZmlsZW5hbWUpOwotCi0gICAgbmV3LT5hY2NlcHRzID0gZG9faGVhZGVyX2xpbmUoci0+cG9vbCwgYXBfdGFibGVfZ2V0KGhkcnMsICJBY2NlcHQiKSk7Ci0KLSAgICAvKiBjYWxjdWxhdGUgbmV3LT5hY2NlcHRfcSB2YWx1ZSAqLwotICAgIGlmIChuZXctPmFjY2VwdHMpIHsKLSAgICAgICAgZWx0cyA9IChhY2NlcHRfcmVjICopIG5ldy0+YWNjZXB0cy0+ZWx0czsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmV3LT5hY2NlcHRzLT5uZWx0czsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoZWx0c1tpXS5xdWFsaXR5IDwgMS4wKSB7Ci0gICAgICAgICAgICAgICAgbmV3LT5hY2NlcHRfcSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBuZXctPmFjY2VwdF9lbmNvZGluZ3MgPQotICAgICAgICBkb19oZWFkZXJfbGluZShyLT5wb29sLCBhcF90YWJsZV9nZXQoaGRycywgIkFjY2VwdC1FbmNvZGluZyIpKTsKLSAgICBuZXctPmFjY2VwdF9sYW5ncyA9Ci0gICAgICAgIGRvX2hlYWRlcl9saW5lKHItPnBvb2wsIGFwX3RhYmxlX2dldChoZHJzLCAiQWNjZXB0LUxhbmd1YWdlIikpOwotICAgIG5ldy0+YWNjZXB0X2NoYXJzZXRzID0KLSAgICAgICAgZG9faGVhZGVyX2xpbmUoci0+cG9vbCwgYXBfdGFibGVfZ2V0KGhkcnMsICJBY2NlcHQtQ2hhcnNldCIpKTsKLQotICAgIG5ldy0+YXZhaWxfdmFycyA9IGFwX21ha2VfYXJyYXkoci0+cG9vbCwgNDAsIHNpemVvZih2YXJfcmVjKSk7Ci0KLSAgICByZXR1cm4gbmV3OwotfQotCi0KLXN0YXRpYyB2b2lkIHBhcnNlX25lZ290aWF0ZV9oZWFkZXIocmVxdWVzdF9yZWMgKnIsIG5lZ290aWF0aW9uX3N0YXRlICpuZWcpCi17Ci0gICAgY29uc3QgY2hhciAqbmVnb3RpYXRlID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJOZWdvdGlhdGUiKTsKLSAgICBjaGFyICp0b2s7Ci0gICAgCi0gICAgLyogRmlyc3QsIGRlZmF1bHQgdG8gbm8gVENOLCBubyBBbHRlcm5hdGVzLCBhbmQgdGhlIG9yaWdpbmFsIEFwYWNoZQotICAgICAqIG5lZ290aWF0aW9uIGFsZ29yaXRobSB3aXRoIGZpZGRsZXMgZm9yIGJyb2tlbiBicm93c2VyIGNvbmZpZ3MuCi0gICAgICoKLSAgICAgKiBUbyBzYXZlIG5ldHdvcmsgYmFuZHdpZHRoLCB3ZSBkbyBub3QgY29uZmlndXJlIHRvIHNlbmQgYW4KLSAgICAgKiBBbHRlcm5hdGVzIGhlYWRlciB0byB0aGUgdXNlciBhZ2VudCBieSBkZWZhdWx0LiAgVXNlcgotICAgICAqIGFnZW50cyB0aGF0IHdhbnQgYW4gQWx0ZXJuYXRlcyBoZWFkZXIgZm9yIGFnZW50LWRyaXZlbgotICAgICAqIG5lZ290aWF0aW9uIHdpbGwgaGF2ZSB0byByZXF1ZXN0IGl0IGJ5IHNlbmRpbmcgYW4KLSAgICAgKiBhcHByb3ByaWF0ZSBOZWdvdGlhdGUgaGVhZGVyLgotICAgICAqLwotICAgIG5lZy0+dWFfc3VwcG9ydHNfdHJhbnMgICA9IDA7Ci0gICAgbmVnLT5zZW5kX2FsdGVybmF0ZXMgICAgID0gMDsKLSAgICBuZWctPm1heV9jaG9vc2UgICAgICAgICAgPSAxOwotICAgIG5lZy0+dXNlX3J2c2EgICAgICAgICAgICA9IDA7Ci0gICAgbmVnLT5kb250X2ZpZGRsZV9oZWFkZXJzID0gMDsKLQotICAgIGlmICghbmVnb3RpYXRlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoc3RyY21wKG5lZ290aWF0ZSwgInRyYW5zIikgPT0gMCkgewotICAgICAgICAvKiBMeW54IDIuNyBhbmQgMi44IHNlbmQgJ25lZ290aWF0ZTogdHJhbnMnIGV2ZW4gdGhvdWdoIHRoZXkKLSAgICAgICAgICogZG8gbm90IHN1cHBvcnQgdHJhbnNwYXJlbnQgY29udGVudCBuZWdvdGlhdGlvbiwgc28gZm9yIEx5bnggd2UKLSAgICAgICAgICogaWdub3JlIHRoZSBuZWdvdGlhdGUgaGVhZGVyIHdoZW4gaXRzIGNvbnRlbnRzIGFyZSBleGFjdGx5ICJ0cmFucyIuCi0gICAgICAgICAqIElmIGZ1dHVyZSB2ZXJzaW9ucyBvZiBMeW54IGV2ZXIgbmVlZCB0byBzYXkgJ25lZ290aWF0ZTogdHJhbnMnLAotICAgICAgICAgKiB0aGV5IGNhbiBzZW5kIHRoZSBlcXVpdmFsZW50ICduZWdvdGlhdGU6IHRyYW5zLCB0cmFucycgaW5zdGVhZAotICAgICAgICAgKiB0byBhdm9pZCB0cmlnZ2VyaW5nIHRoZSB3b3JrYXJvdW5kIGJlbG93LiAKLSAgICAgICAgICovCi0gICAgICAgIGNvbnN0IGNoYXIgKnVhID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJVc2VyLUFnZW50Iik7Ci0KLSAgICAgICAgaWYgKHVhICYmIChzdHJuY21wKHVhLCAiTHlueCIsIDQpID09IDApKQotICAgICAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG5lZy0+bWF5X2Nob29zZSA9IDA7ICAvKiBBbiBlbXB0eSBOZWdvdGlhdGUgd291bGQgcmVxdWlyZSAzMDAgcmVzcG9uc2UgKi8KLQotICAgIHdoaWxlICgodG9rID0gYXBfZ2V0X2xpc3RfaXRlbShuZWctPnBvb2wsICZuZWdvdGlhdGUpKSAhPSBOVUxMKSB7Ci0KLSAgICAgICAgaWYgKHN0cmNtcCh0b2ssICJ0cmFucyIpID09IDAgfHwKLSAgICAgICAgICAgIHN0cmNtcCh0b2ssICJ2bGlzdCIpID09IDAgfHwKLSAgICAgICAgICAgIHN0cmNtcCh0b2ssICJndWVzcy1zbWFsbCIpID09IDAgfHwKLSAgICAgICAgICAgIGFwX2lzZGlnaXQodG9rWzBdKSB8fAotICAgICAgICAgICAgc3RyY21wKHRvaywgIioiKSA9PSAwKSB7Ci0KLSAgICAgICAgICAgIC8qIFRoZSB1c2VyIGFnZW50IHN1cHBvcnRzIHRyYW5zcGFyZW50IG5lZ290aWF0aW9uICovCi0gICAgICAgICAgICBuZWctPnVhX3N1cHBvcnRzX3RyYW5zID0gMTsKLQotICAgICAgICAgICAgLyogU2VuZC1hbHRlcm5hdGVzIGNvdWxkIGJlIGNvbmZpZ3VyYWJsZSwgYnV0IG5vdGUKLSAgICAgICAgICAgICAqIHRoYXQgaXQgbXVzdCBiZSAxIGlmIHdlIGhhdmUgJ3ZsaXN0JyBpbiB0aGUKLSAgICAgICAgICAgICAqIG5lZ290aWF0ZSBoZWFkZXIuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG5lZy0+c2VuZF9hbHRlcm5hdGVzID0gMTsKLQotICAgICAgICAgICAgaWYgKHN0cmNtcCh0b2ssICIxLjAiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLyogd2UgbWF5IHVzZSB0aGUgUlZTQS8xLjAgYWxnb3JpdGhtLCBjb25maWd1cmUgZm9yIGl0ICovCi0gICAgICAgICAgICAgICAgbmVnLT5tYXlfY2hvb3NlID0gMTsKLSAgICAgICAgICAgICAgICBuZWctPnVzZV9ydnNhID0gMTsKLSAgICAgICAgICAgICAgICBuZWctPmRvbnRfZmlkZGxlX2hlYWRlcnMgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodG9rWzBdID09ICcqJykgewotICAgICAgICAgICAgICAgIC8qIHdlIG1heSB1c2UgYW55IHZhcmlhbnQgc2VsZWN0aW9uIGFsZ29yaXRobSwgY29uZmlndXJlCi0gICAgICAgICAgICAgICAgICogdG8gdXNlIHRoZSBBcGFjaGUgYWxnb3JpdGhtCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgbmVnLT5tYXlfY2hvb3NlID0gMTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKiBXZSBkaXNhYmxlIGhlYWRlciBmaWRkbGVzIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgYQotICAgICAgICAgICAgICAgICAqIGNsaWVudCBzZW5kaW5nIE5lZ290aWF0ZSBrbm93cyBob3cgdG8gc2VuZCBjb3JyZWN0Ci0gICAgICAgICAgICAgICAgICogaGVhZGVycyB3aGljaCBkb24ndCBuZWVkIGZpZGRsaW5nLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIG5lZy0+ZG9udF9maWRkbGVfaGVhZGVycyA9IDE7IAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0jaWZkZWYgTkVHX0RFQlVHCi0gICAgZnByaW50ZihzdGRlcnIsICJkb250X2ZpZGRsZV9oZWFkZXJzPSVkIHVzZV9ydnNhPSVkIHVhX3N1cHBvcnRzX3RyYW5zPSVkICIKLSAgICAgICAgICAgICJzZW5kX2FsdGVybmF0ZXM9JWQsIG1heV9jaG9vc2U9JWRcbiIsCi0gICAgICAgICAgICBuZWctPmRvbnRfZmlkZGxlX2hlYWRlcnMsIG5lZy0+dXNlX3J2c2EsICAKLSAgICAgICAgICAgIG5lZy0+dWFfc3VwcG9ydHNfdHJhbnMsIG5lZy0+c2VuZF9hbHRlcm5hdGVzLCBuZWctPm1heV9jaG9vc2UpOwotI2VuZGlmCi0KLX0KLQotLyogU29tZXRpbWVzIGNsaWVudHMgd2lsbCBnaXZlIHVzIG5vIEFjY2VwdCBpbmZvIGF0IGFsbDsgdGhpcyByb3V0aW5lIHNldHMKLSAqIHVwIHRoZSBzdGFuZGFyZCBkZWZhdWx0IGZvciB0aGF0IGNhc2UsIGFuZCBhbHNvIGFycmFuZ2VzIGZvciB1cyB0byBiZQotICogd2lsbGluZyB0byBydW4gYSBDR0kgc2NyaXB0IGlmIHdlIGZpbmQgb25lLiAgKEluIGZhY3QsIHdlIHNldCB1cCB0bwotICogZHJhbWF0aWNhbGx5IHByZWZlciBDR0kgc2NyaXB0cyBpbiBjYXNlcyB3aGVyZSB0aGF0J3MgYXBwcm9wcmlhdGUsCi0gKiBlLmcuLCBQT1NUIG9yIHdoZW4gVVJJIGluY2x1ZGVzIHF1ZXJ5IGFyZ3Mgb3IgZXh0cmEgcGF0aCBpbmZvKS4KLSAqLwotc3RhdGljIHZvaWQgbWF5YmVfYWRkX2RlZmF1bHRfYWNjZXB0cyhuZWdvdGlhdGlvbl9zdGF0ZSAqbmVnLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWZlcl9zY3JpcHRzKQotewotICAgIGFjY2VwdF9yZWMgKm5ld19hY2NlcHQ7Ci0KLSAgICBpZiAoIW5lZy0+YWNjZXB0cykgewotICAgICAgICBuZWctPmFjY2VwdHMgPSBhcF9tYWtlX2FycmF5KG5lZy0+cG9vbCwgNCwgc2l6ZW9mKGFjY2VwdF9yZWMpKTsKLQotICAgICAgICBuZXdfYWNjZXB0ID0gKGFjY2VwdF9yZWMgKikgYXBfcHVzaF9hcnJheShuZWctPmFjY2VwdHMpOwotICAgICAgICAKLSAgICAgICAgbmV3X2FjY2VwdC0+bmFtZSA9ICIqLyoiOwotICAgICAgICBuZXdfYWNjZXB0LT5xdWFsaXR5ID0gMS4wZjsKLSAgICAgICAgbmV3X2FjY2VwdC0+bGV2ZWwgPSAwLjBmOwotICAgIH0gICAgCi0KLSAgICBuZXdfYWNjZXB0ID0gKGFjY2VwdF9yZWMgKikgYXBfcHVzaF9hcnJheShuZWctPmFjY2VwdHMpOwotCi0gICAgbmV3X2FjY2VwdC0+bmFtZSA9IENHSV9NQUdJQ19UWVBFOwotICAgIGlmIChuZWctPnVzZV9ydnNhKSB7Ci0gICAgICAgIG5ld19hY2NlcHQtPnF1YWxpdHkgPSAwOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgbmV3X2FjY2VwdC0+cXVhbGl0eSA9IHByZWZlcl9zY3JpcHRzID8gMi4wZiA6IDAuMDAxZjsKLSAgICB9Ci0gICAgbmV3X2FjY2VwdC0+bGV2ZWwgPSAwLjBmOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBQYXJzaW5nIHR5cGUtbWFwIGZpbGVzLCBpbiBSb3kncyBtZXRhL2h0dHAgZm9ybWF0IGF1Z21lbnRlZCB3aXRoCi0gKiAjLWNvbW1lbnRzLgotICovCi0KLS8qIFJlYWRpbmcgUkZDODIyLXN0eWxlIGhlYWRlciBsaW5lcywgaWdub3JpbmcgIy1jb21tZW50cyBhbmQKLSAqIGhhbmRsaW5nIGNvbnRpbnVhdGlvbnMuCi0gKi8KLQotZW51bSBoZWFkZXJfc3RhdGUgewotICAgIGhlYWRlcl9lb2YsIGhlYWRlcl9zZWVuLCBoZWFkZXJfc2VwCi19OwotCi1zdGF0aWMgZW51bSBoZWFkZXJfc3RhdGUgZ2V0X2hlYWRlcl9saW5lKGNoYXIgKmJ1ZmZlciwgaW50IGxlbiwgRklMRSAqbWFwKQotewotICAgIGNoYXIgKmJ1Zl9lbmQgPSBidWZmZXIgKyBsZW47Ci0gICAgY2hhciAqY3A7Ci0gICAgaW50IGM7Ci0KLSAgICAvKiBHZXQgYSBub25jb21tZW50ZWQgbGluZSAqLwotCi0gICAgZG8gewotICAgICAgICBpZiAoZmdldHMoYnVmZmVyLCBNQVhfU1RSSU5HX0xFTiwgbWFwKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gaGVhZGVyX2VvZjsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKGJ1ZmZlclswXSA9PSAnIycpOwotCi0gICAgLyogSWYgYmxhbmssIGp1c3QgcmV0dXJuIGl0IC0tLSB0aGlzIGVuZHMgaW5mb3JtYXRpb24gb24gdGhpcyB2YXJpYW50ICovCi0KLSAgICBmb3IgKGNwID0gYnVmZmVyOyAoKmNwICYmIGFwX2lzc3BhY2UoKmNwKSk7ICsrY3ApIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgaWYgKCpjcCA9PSAnXDAnKSB7Ci0gICAgICAgIHJldHVybiBoZWFkZXJfc2VwOwotICAgIH0KLQotICAgIC8qIElmIG5vbi1ibGFuaywgZ28gbG9va2luZyBmb3IgaGVhZGVyIGxpbmVzLCBidXQgbm90ZSB0aGF0IHdlIHN0aWxsCi0gICAgICogaGF2ZSB0byB0cmVhdCBjb21tZW50cyBzcGVjaWFsbHkuLi4KLSAgICAgKi8KLQotICAgIGNwICs9IHN0cmxlbihjcCk7Ci0KLSAgICB3aGlsZSAoKGMgPSBnZXRjKG1hcCkpICE9IEVPRikgewotICAgICAgICBpZiAoYyA9PSAnIycpIHsKLSAgICAgICAgICAgIC8qIENvbW1lbnQgbGluZSAqLwotICAgICAgICAgICAgd2hpbGUgKChjID0gZ2V0YyhtYXApKSAhPSBFT0YgJiYgYyAhPSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYXBfaXNzcGFjZShjKSkgewotICAgICAgICAgICAgLyogTGVhZGluZyB3aGl0ZXNwYWNlLiAgUE9TU0lCTEUgY29udGludWF0aW9uIGxpbmUKLSAgICAgICAgICAgICAqIEFsc28sIHBvc3NpYmx5IGJsYW5rIC0tLSBpZiBzbywgd2UgdW5nZXRjKCkgdGhlIGZpbmFsIG5ld2xpbmUKLSAgICAgICAgICAgICAqIHNvIHRoYXQgd2Ugd2lsbCBwaWNrIHVwIHRoZSBibGFuayBsaW5lIHRoZSBuZXh0IHRpbWUgJ3JvdW5kLgotICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIHdoaWxlIChjICE9IEVPRiAmJiBjICE9ICdcbicgJiYgYXBfaXNzcGFjZShjKSkgewotICAgICAgICAgICAgICAgIGMgPSBnZXRjKG1hcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVuZ2V0YyhjLCBtYXApOwotCi0gICAgICAgICAgICBpZiAoYyA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGhlYWRlcl9zZWVuOyAgICAgLyogQmxhbmsgbGluZSAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBDb250aW51YXRpb24gKi8KLQotICAgICAgICAgICAgd2hpbGUgKGNwIDwgYnVmX2VuZCAtIDIgJiYgKGMgPSBnZXRjKG1hcCkpICE9IEVPRiAmJiBjICE9ICdcbicpIHsKLSAgICAgICAgICAgICAgICAqY3ArKyA9IGM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICpjcCsrID0gJ1xuJzsKLSAgICAgICAgICAgICpjcCA9ICdcMCc7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0KLSAgICAgICAgICAgIC8qIExpbmUgYmVnaW5uaW5nIHdpdGggc29tZXRoaW5nIG90aGVyIHRoYW4gd2hpdGVzcGFjZSAqLwotCi0gICAgICAgICAgICB1bmdldGMoYywgbWFwKTsKLSAgICAgICAgICAgIHJldHVybiBoZWFkZXJfc2VlbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBoZWFkZXJfc2VlbjsKLX0KLQotLyogU3RyaXBwaW5nIG91dCBSRkM4MjIgY29tbWVudHMgKi8KLQotc3RhdGljIHZvaWQgc3RyaXBfcGFyZW5fY29tbWVudHMoY2hhciAqaGRyKQotewotICAgIC8qIEhtbW0uLi4gaXMgdGhpcyBjb3JyZWN0PyAgSW4gUm95J3MgbGF0ZXN0IGRyYWZ0LCAoY29tbWVudHMpIGNhbiBuZXN0ISAqLwotICAgIC8qIE5vcGUsIGl0IGlzbid0IGNvcnJlY3QuICBGYWlscyB0byBoYW5kbGUgYmFja3NsYXNoIGVzY2FwZSBhcyB3ZWxsLiAgICAqLwotCi0gICAgd2hpbGUgKCpoZHIpIHsKLSAgICAgICAgaWYgKCpoZHIgPT0gJyInKSB7Ci0gICAgICAgICAgICBoZHIgPSBzdHJjaHIoaGRyLCAnIicpOwotICAgICAgICAgICAgaWYgKGhkciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKytoZHI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKmhkciA9PSAnKCcpIHsKLSAgICAgICAgICAgIHdoaWxlICgqaGRyICYmICpoZHIgIT0gJyknKSB7Ci0gICAgICAgICAgICAgICAgKmhkcisrID0gJyAnOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKmhkcikgewotICAgICAgICAgICAgICAgICpoZHIrKyA9ICcgJzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICsraGRyOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKiBHZXR0aW5nIHRvIGEgaGVhZGVyIGJvZHkgZnJvbSB0aGUgaGVhZGVyICovCi0KLXN0YXRpYyBjaGFyICpsY2FzZV9oZWFkZXJfbmFtZV9yZXR1cm5fYm9keShjaGFyICpoZWFkZXIsIHJlcXVlc3RfcmVjICpyKQotewotICAgIGNoYXIgKmNwID0gaGVhZGVyOwotCi0gICAgZm9yICggOyAqY3AgJiYgKmNwICE9ICc6JyA7ICsrY3ApIHsKLSAgICAgICAgKmNwID0gYXBfdG9sb3dlcigqY3ApOwotICAgIH0KLQotICAgIGlmICghKmNwKSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgIlN5bnRheCBlcnJvciBpbiB0eXBlIG1hcCAtLS0gbm8gJzonOiAlcyIsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgZG8gewotICAgICAgICArK2NwOwotICAgIH0gd2hpbGUgKCpjcCAmJiBhcF9pc3NwYWNlKCpjcCkpOwotCi0gICAgaWYgKCEqY3ApIHsKLSAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAiU3ludGF4IGVycm9yIGluIHR5cGUgbWFwIC0tLSBubyBoZWFkZXIgYm9keTogJXMiLAotICAgICAgICAgICAgICAgICAgICAgIHItPmZpbGVuYW1lKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNwOwotfQotCi1zdGF0aWMgaW50IHJlYWRfdHlwZV9tYXAobmVnb3RpYXRpb25fc3RhdGUgKm5lZywgcmVxdWVzdF9yZWMgKnJyKQotewotICAgIHJlcXVlc3RfcmVjICpyID0gbmVnLT5yOwotICAgIEZJTEUgKm1hcDsKLSAgICBjaGFyIGJ1ZmZlcltNQVhfU1RSSU5HX0xFTl07Ci0gICAgZW51bSBoZWFkZXJfc3RhdGUgaHN0YXRlOwotICAgIHN0cnVjdCB2YXJfcmVjIG1pbWVfaW5mbzsKLSAgICBpbnQgaGFzX2NvbnRlbnQ7Ci0KLSAgICAvKiBXZSBhcmUgbm90IHVzaW5nIG11bHRpdmlld3MgKi8KLSAgICBuZWctPmNvdW50X211bHRpdmlld3NfdmFyaWFudHMgPSAwOwotCi0gICAgbWFwID0gYXBfcGZvcGVuKG5lZy0+cG9vbCwgcnItPmZpbGVuYW1lLCAiciIpOwotICAgIGlmIChtYXAgPT0gTlVMTCkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGFjY2VzcyB0eXBlIG1hcCBmaWxlOiAlcyIsIHJyLT5maWxlbmFtZSk7Ci0gICAgICAgIHJldHVybiBIVFRQX0ZPUkJJRERFTjsKLSAgICB9Ci0KLSAgICBjbGVhbl92YXJfcmVjKCZtaW1lX2luZm8pOwotICAgIGhhc19jb250ZW50ID0gMDsKLQotICAgIGRvIHsKLSAgICAgICAgaHN0YXRlID0gZ2V0X2hlYWRlcl9saW5lKGJ1ZmZlciwgTUFYX1NUUklOR19MRU4sIG1hcCk7Ci0KLSAgICAgICAgaWYgKGhzdGF0ZSA9PSBoZWFkZXJfc2VlbikgewotICAgICAgICAgICAgY2hhciAqYm9keTEgPSBsY2FzZV9oZWFkZXJfbmFtZV9yZXR1cm5fYm9keShidWZmZXIsIG5lZy0+cik7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpib2R5OwotCi0gICAgICAgICAgICBpZiAoYm9keTEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTRVJWRVJfRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0cmlwX3BhcmVuX2NvbW1lbnRzKGJvZHkxKTsKLSAgICAgICAgICAgIGJvZHkgPSBib2R5MTsKLQotICAgICAgICAgICAgaWYgKCFzdHJuY21wKGJ1ZmZlciwgInVyaToiLCA0KSkgewotICAgICAgICAgICAgICAgIG1pbWVfaW5mby5maWxlX25hbWUgPSBhcF9nZXRfdG9rZW4obmVnLT5wb29sLCAmYm9keSwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghc3RybmNtcChidWZmZXIsICJjb250ZW50LXR5cGU6IiwgMTMpKSB7Ci0gICAgICAgICAgICAgICAgc3RydWN0IGFjY2VwdF9yZWMgYWNjZXB0X2luZm87Ci0KLSAgICAgICAgICAgICAgICBnZXRfZW50cnkobmVnLT5wb29sLCAmYWNjZXB0X2luZm8sIGJvZHkpOwotICAgICAgICAgICAgICAgIHNldF9taW1lX2ZpZWxkcygmbWltZV9pbmZvLCAmYWNjZXB0X2luZm8pOwotICAgICAgICAgICAgICAgIGhhc19jb250ZW50ID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJuY21wKGJ1ZmZlciwgImNvbnRlbnQtbGVuZ3RoOiIsIDE1KSkgewotICAgICAgICAgICAgICAgIG1pbWVfaW5mby5ieXRlcyA9IGF0b2YoYm9keSk7Ci0gICAgICAgICAgICAgICAgaGFzX2NvbnRlbnQgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIXN0cm5jbXAoYnVmZmVyLCAiY29udGVudC1sYW5ndWFnZToiLCAxNykpIHsKLSAgICAgICAgICAgICAgICBtaW1lX2luZm8uY29udGVudF9sYW5ndWFnZXMgPSBkb19sYW5ndWFnZXNfbGluZShuZWctPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvZHkpOwotICAgICAgICAgICAgICAgIGhhc19jb250ZW50ID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJuY21wKGJ1ZmZlciwgImNvbnRlbnQtZW5jb2Rpbmc6IiwgMTcpKSB7Ci0gICAgICAgICAgICAgICAgbWltZV9pbmZvLmNvbnRlbnRfZW5jb2RpbmcgPSBhcF9nZXRfdG9rZW4obmVnLT5wb29sLCAmYm9keSwgMCk7Ci0gICAgICAgICAgICAgICAgaGFzX2NvbnRlbnQgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIXN0cm5jbXAoYnVmZmVyLCAiZGVzY3JpcHRpb246IiwgMTIpKSB7Ci0gICAgICAgICAgICAgICAgY2hhciAqZGVzYyA9IGFwX3BzdHJkdXAobmVnLT5wb29sLCBib2R5KTsKLSAgICAgICAgICAgICAgICBjaGFyICpjcDsKLQotICAgICAgICAgICAgICAgIGZvciAoY3AgPSBkZXNjOyAqY3A7ICsrY3ApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCpjcD09J1xuJykgKmNwPScgJzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNwPmRlc2MpICooY3AtMSk9MDsKLSAgICAgICAgICAgICAgICBtaW1lX2luZm8uZGVzY3JpcHRpb24gPSBkZXNjOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKCptaW1lX2luZm8uZmlsZV9uYW1lICYmIGhhc19jb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgdm9pZCAqbmV3X3ZhciA9IGFwX3B1c2hfYXJyYXkobmVnLT5hdmFpbF92YXJzKTsKLQotICAgICAgICAgICAgICAgIG1lbWNweShuZXdfdmFyLCAodm9pZCAqKSAmbWltZV9pbmZvLCBzaXplb2YodmFyX3JlYykpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjbGVhbl92YXJfcmVjKCZtaW1lX2luZm8pOwotICAgICAgICAgICAgaGFzX2NvbnRlbnQgPSAwOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoaHN0YXRlICE9IGhlYWRlcl9lb2YpOwotCi0gICAgYXBfcGZjbG9zZShuZWctPnBvb2wsIG1hcCk7Ci0KLSAgICBzZXRfdmxpc3RfdmFsaWRhdG9yKHIsIHJyKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotCi0vKiBTb3J0IGZ1bmN0aW9uIHVzZWQgYnkgcmVhZF90eXBlc19tdWx0aS4gKi8KLXN0YXRpYyBpbnQgdmFyaWFudHNvcnRmKHZhcl9yZWMgKmEsIHZhcl9yZWMgKmIpIHsKLQotICAgIC8qIEZpcnN0IGtleSBpcyB0aGUgc291cmNlIHF1YWxpdHksIHNvcnQgaW4gZGVzY2VuZGluZyBvcmRlci4gKi8KLQotICAgIC8qIFhYWDogbm90ZSB0aGF0IHdlIGN1cnJlbnRseSBpbXBsZW1lbnQgbm8gbWV0aG9kIG9mIHNldHRpbmcgdGhlCi0gICAgICogc291cmNlIHF1YWxpdHkgZm9yIG11bHRpdmlld3MgdmFyaWFudHMsIHNvIHdlIGFyZSBhbHdheXMgY29tcGFyaW5nCi0gICAgICogMS4wIHRvIDEuMCBmb3Igbm93Ci0gICAgICovCi0gICAgaWYgKGEtPnNvdXJjZV9xdWFsaXR5IDwgYi0+c291cmNlX3F1YWxpdHkpCi0gICAgICAgIHJldHVybiAxOwotICAgIGlmIChhLT5zb3VyY2VfcXVhbGl0eSA+IGItPnNvdXJjZV9xdWFsaXR5KQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAvKiBTZWNvbmQga2V5IGlzIHRoZSB2YXJpYW50IG5hbWUgKi8KLSAgICByZXR1cm4gc3RyY21wKGEtPmZpbGVfbmFtZSwgYi0+ZmlsZV9uYW1lKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogU2FtZSBhcyByZWFkX3R5cGVfbWFwLCBleGNlcHQgd2UgdXNlIGEgZmlsdGVyZWQgZGlyZWN0b3J5IGxpc3RpbmcKLSAqIGFzIHRoZSBtYXAuLi4gIAotICovCi0KLXN0YXRpYyBpbnQgcmVhZF90eXBlc19tdWx0aShuZWdvdGlhdGlvbl9zdGF0ZSAqbmVnKQotewotICAgIHJlcXVlc3RfcmVjICpyID0gbmVnLT5yOwotCi0gICAgY2hhciAqZmlscDsKLSAgICBpbnQgcHJlZml4X2xlbjsKLSAgICBESVIgKmRpcnA7Ci0gICAgc3RydWN0IERJUl9UWVBFICpkaXJfZW50cnk7Ci0gICAgc3RydWN0IHZhcl9yZWMgbWltZV9pbmZvOwotICAgIHN0cnVjdCBhY2NlcHRfcmVjIGFjY2VwdF9pbmZvOwotICAgIHZvaWQgKm5ld192YXI7Ci0KLSAgICBjbGVhbl92YXJfcmVjKCZtaW1lX2luZm8pOwotCi0gICAgaWYgKCEoZmlscCA9IHN0cnJjaHIoci0+ZmlsZW5hbWUsICcvJykpKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsgICAgICAgIC8qIFdlaXJkLi4uICovCi0gICAgfQotCi0gICAgaWYgKHN0cm5jbXAoci0+ZmlsZW5hbWUsICJwcm94eToiLCA2KSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICArK2ZpbHA7Ci0gICAgcHJlZml4X2xlbiA9IHN0cmxlbihmaWxwKTsKLQotICAgIGRpcnAgPSBhcF9wb3BlbmRpcihuZWctPnBvb2wsIG5lZy0+ZGlyX25hbWUpOwotCi0gICAgaWYgKGRpcnAgPT0gTlVMTCkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgImNhbm5vdCByZWFkIGRpcmVjdG9yeSBmb3IgbXVsdGk6ICVzIiwgbmVnLT5kaXJfbmFtZSk7Ci0gICAgICAgIHJldHVybiBIVFRQX0ZPUkJJRERFTjsKLSAgICB9Ci0KLSAgICB3aGlsZSAoKGRpcl9lbnRyeSA9IHJlYWRkaXIoZGlycCkpKSB7Ci0gICAgICAgIHJlcXVlc3RfcmVjICpzdWJfcmVxOwotCi0gICAgICAgIC8qIERvIHdlIGhhdmUgYSBtYXRjaD8gKi8KLQotICAgICAgICBpZiAoc3RybmNtcChkaXJfZW50cnktPmRfbmFtZSwgZmlscCwgcHJlZml4X2xlbikpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkaXJfZW50cnktPmRfbmFtZVtwcmVmaXhfbGVuXSAhPSAnLicpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogWWVwLiAgU2VlIGlmIGl0J3Mgc29tZXRoaW5nIHdoaWNoIHdlIGhhdmUgYWNjZXNzIHRvLCBhbmQgCi0gICAgICAgICAqIHdoaWNoIGhhcyBhIGtub3duIHR5cGUgYW5kIGVuY29kaW5nIChhcyBvcHBvc2VkIHRvIHNvbWV0aGluZwotICAgICAgICAgKiB3aGljaCB3ZSdsbCBiZSBzbGFwcGluZyBkZWZhdWx0X3R5cGUgb24gbGF0ZXIpLgotICAgICAgICAgKi8KLQotICAgICAgICBzdWJfcmVxID0gYXBfc3ViX3JlcV9sb29rdXBfZmlsZShkaXJfZW50cnktPmRfbmFtZSwgcik7Ci0KLSAgICAgICAgLyogSWYgaXQgaGFzIGEgaGFuZGxlciwgd2UnbGwgcHJldGVuZCBpdCdzIGEgQ0dJIHNjcmlwdCwKLSAgICAgICAgICogc2luY2UgdGhhdCdzIGEgZ29vZCBpbmRpY2F0aW9uIG9mIHRoZSBzb3J0IG9mIHRoaW5nIGl0Ci0gICAgICAgICAqIG1pZ2h0IGJlIGRvaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHN1Yl9yZXEtPmhhbmRsZXIgJiYgIXN1Yl9yZXEtPmNvbnRlbnRfdHlwZSkgewotICAgICAgICAgICAgc3ViX3JlcS0+Y29udGVudF90eXBlID0gQ0dJX01BR0lDX1RZUEU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3ViX3JlcS0+c3RhdHVzICE9IEhUVFBfT0sgfHwgIXN1Yl9yZXEtPmNvbnRlbnRfdHlwZSkgewotICAgICAgICAgICAgYXBfZGVzdHJveV9zdWJfcmVxKHN1Yl9yZXEpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBJZiBpdCdzIGEgbWFwIGZpbGUsIHdlIHVzZSB0aGF0IGluc3RlYWQgb2YgdGhlIG1hcAotICAgICAgICAgKiB3ZSdyZSBidWlsZGluZy4uLgotICAgICAgICAgKi8KLQotICAgICAgICBpZiAoKChzdWJfcmVxLT5jb250ZW50X3R5cGUpICYmCi0gICAgICAgICAgICAgIXN0cmNtcChzdWJfcmVxLT5jb250ZW50X3R5cGUsIE1BUF9GSUxFX01BR0lDX1RZUEUpKSB8fAotICAgICAgICAgICAgKChzdWJfcmVxLT5oYW5kbGVyKSAmJgotICAgICAgICAgICAgICFzdHJjbXAoc3ViX3JlcS0+aGFuZGxlciwgInR5cGUtbWFwIikpKSB7Ci0KLSAgICAgICAgICAgIGFwX3BjbG9zZWRpcihuZWctPnBvb2wsIGRpcnApOwotICAgICAgICAgICAgbmVnLT5hdmFpbF92YXJzLT5uZWx0cyA9IDA7Ci0gICAgICAgICAgICBpZiAoc3ViX3JlcS0+c3RhdHVzICE9IEhUVFBfT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3ViX3JlcS0+c3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlYWRfdHlwZV9tYXAobmVnLCBzdWJfcmVxKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEhhdmUgcmVhc29uYWJsZSB2YXJpYW50IC0tLSBnYXRoZXIgbm90ZXMuICovCi0KLSAgICAgICAgbWltZV9pbmZvLnN1Yl9yZXEgPSBzdWJfcmVxOwotICAgICAgICBtaW1lX2luZm8uZmlsZV9uYW1lID0gYXBfcHN0cmR1cChuZWctPnBvb2wsIGRpcl9lbnRyeS0+ZF9uYW1lKTsKLSAgICAgICAgaWYgKHN1Yl9yZXEtPmNvbnRlbnRfZW5jb2RpbmcpIHsKLSAgICAgICAgICAgIG1pbWVfaW5mby5jb250ZW50X2VuY29kaW5nID0gc3ViX3JlcS0+Y29udGVudF9lbmNvZGluZzsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3ViX3JlcS0+Y29udGVudF9sYW5ndWFnZXMpIHsKLSAgICAgICAgICAgIG1pbWVfaW5mby5jb250ZW50X2xhbmd1YWdlcyA9IHN1Yl9yZXEtPmNvbnRlbnRfbGFuZ3VhZ2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2V0X2VudHJ5KG5lZy0+cG9vbCwgJmFjY2VwdF9pbmZvLCBzdWJfcmVxLT5jb250ZW50X3R5cGUpOwotICAgICAgICBzZXRfbWltZV9maWVsZHMoJm1pbWVfaW5mbywgJmFjY2VwdF9pbmZvKTsKLQotICAgICAgICBuZXdfdmFyID0gYXBfcHVzaF9hcnJheShuZWctPmF2YWlsX3ZhcnMpOwotICAgICAgICBtZW1jcHkobmV3X3ZhciwgKHZvaWQgKikgJm1pbWVfaW5mbywgc2l6ZW9mKHZhcl9yZWMpKTsKLQotICAgICAgICBuZWctPmNvdW50X211bHRpdmlld3NfdmFyaWFudHMrKzsKLQotICAgICAgICBjbGVhbl92YXJfcmVjKCZtaW1lX2luZm8pOwotICAgIH0KLQotICAgIGFwX3BjbG9zZWRpcihuZWctPnBvb2wsIGRpcnApOwotCi0gICAgc2V0X3ZsaXN0X3ZhbGlkYXRvcihyLCByKTsKLQotICAgIC8qIFNvcnQgdGhlIHZhcmlhbnRzIGludG8gYSBjYW5vbmljYWwgb3JkZXIuICBUaGUgbmVnb3RpYXRpb24KLSAgICAgKiByZXN1bHQgc29tZXRpbWVzIGRlcGVuZHMgb24gdGhlIG9yZGVyIG9mIHRoZSB2YXJpYW50cy4gIEJ5Ci0gICAgICogc29ydGluZyB0aGUgdmFyaWFudHMgaW50byBhIGNhbm9uaWNhbCBvcmRlciwgcmF0aGVyIHRoYW4gdXNpbmcKLSAgICAgKiB0aGUgb3JkZXIgaW4gd2hpY2ggcmVhZGRpcigpIGhhcHBlbnMgdG8gcmV0dXJuIHRoZW0sIHdlIGVuc3VyZQotICAgICAqIHRoYXQgdGhlIG5lZ290aWF0aW9uIHJlc3VsdCB3aWxsIGJlIGNvbnNpc3RlbnQgb3ZlciBmaWxlc3lzdGVtCi0gICAgICogYmFja3VwL3Jlc3RvcmVzIGFuZCBvdmVyIGFsbCBtaXJyb3Igc2l0ZXMuCi0gICAgICovCi0gICAgICAgCi0gICAgcXNvcnQoKHZvaWQgKikgbmVnLT5hdmFpbF92YXJzLT5lbHRzLCBuZWctPmF2YWlsX3ZhcnMtPm5lbHRzLAotICAgICAgICAgIHNpemVvZih2YXJfcmVjKSwgKGludCAoKikoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKSB2YXJpYW50c29ydGYpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQW5kIG5vdyBmb3IgdGhlIGNvZGUgeW91J3ZlIGJlZW4gd2FpdGluZyBmb3IuLi4gYWN0dWFsbHkKLSAqIGZpbmRpbmcgYSBtYXRjaCB0byB0aGUgY2xpZW50J3MgcmVxdWlyZW1lbnRzLiAgCi0gKi8KLQotLyogTWF0Y2hpbmcgTUlNRSB0eXBlcyAuLi4gdGhlIHN0YXIvc3RhciBhbmQgZm9vL3N0YXIgY29tbWVudGluZyBjb252ZW50aW9ucwotICogYXJlIGltcGxlbWVudGVkIGhlcmUuICAoWW91IGtub3cgd2hhdCBJIG1lYW4gYnkgc3Rhci9zdGFyLCBidXQganVzdAotICogdHJ5IG1lbnRpb25pbmcgdGhvc2UgdGhyZWUgY2hhcmFjdGVycyBpbiBhIEMgY29tbWVudCkuICBVc2luZyBzdHJjbXAoKQotICogaXMgbGVnaXQsIGJlY2F1c2UgZXZlcnl0aGluZyBoYXMgYWxyZWFkeSBiZWVuIHNtYXNoZWQgdG8gbG93ZXJjYXNlLgotICoKLSAqIE5vdGUgYWxzbyB0aGF0IGlmIHdlIGdldCBhbiBleGFjdCBtYXRjaCBvbiB0aGUgbWVkaWEgdHlwZSwgd2UgdXBkYXRlCi0gKiBsZXZlbF9tYXRjaGVkIGZvciB1c2UgaW4gbGV2ZWxfY21wIGJlbG93Li4uCi0gKiAKLSAqIFdlIGFsc28gZ2l2ZSBhIHZhbHVlIGZvciBtaW1lX3N0YXJzLCB3aGljaCBpcyB1c2VkIGxhdGVyLiBJdCBzaG91bGQKLSAqIGJlIDEgZm9yIHN0YXIvc3RhciwgMiBmb3IgdHlwZS9zdGFyIGFuZCAzIGZvciB0eXBlL3N1YnR5cGUuCi0gKi8KLQotc3RhdGljIGludCBtaW1lX21hdGNoKGFjY2VwdF9yZWMgKmFjY2VwdF9yLCB2YXJfcmVjICphdmFpbCkKLXsKLSAgICBjaGFyICphY2NlcHRfdHlwZSA9IGFjY2VwdF9yLT5uYW1lOwotICAgIGNoYXIgKmF2YWlsX3R5cGUgPSBhdmFpbC0+bWltZV90eXBlOwotICAgIGludCBsZW4gPSBzdHJsZW4oYWNjZXB0X3R5cGUpOwotCi0gICAgaWYgKGFjY2VwdF90eXBlWzBdID09ICcqJykgeyAgICAgICAgLyogQW55dGhpbmcgbWF0Y2hlcyBzdGFyL3N0YXIgKi8KLSAgICAgICAgaWYgKGF2YWlsLT5taW1lX3N0YXJzIDwgMSkgewotICAgICAgICAgICAgYXZhaWwtPm1pbWVfc3RhcnMgPSAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBlbHNlIGlmICgoYWNjZXB0X3R5cGVbbGVuIC0gMV0gPT0gJyonKSAmJgotICAgICAgICAgICAgICFzdHJuY21wKGFjY2VwdF90eXBlLCBhdmFpbF90eXBlLCBsZW4gLSAyKSkgewotICAgICAgICBpZiAoYXZhaWwtPm1pbWVfc3RhcnMgPCAyKSB7Ci0gICAgICAgICAgICBhdmFpbC0+bWltZV9zdGFycyA9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYWNjZXB0X3R5cGUsIGF2YWlsX3R5cGUpCi0gICAgICAgICAgICAgfHwgKCFzdHJjbXAoYWNjZXB0X3R5cGUsICJ0ZXh0L2h0bWwiKQotICAgICAgICAgICAgICAgICAmJiAoIXN0cmNtcChhdmFpbF90eXBlLCBJTkNMVURFU19NQUdJQ19UWVBFKQotICAgICAgICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdmFpbF90eXBlLCBJTkNMVURFU19NQUdJQ19UWVBFMykpKSkgewotICAgICAgICBpZiAoYWNjZXB0X3ItPmxldmVsID49IGF2YWlsLT5sZXZlbCkgewotICAgICAgICAgICAgYXZhaWwtPmxldmVsX21hdGNoZWQgPSBhdmFpbC0+bGV2ZWw7Ci0gICAgICAgICAgICBhdmFpbC0+bWltZV9zdGFycyA9IDM7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotLyogVGhpcyBjb2RlIGltcGxlbWVudHMgYSBwaWVjZSBvZiB0aGUgdGllLWJyZWFraW5nIGFsZ29yaXRobSBiZXR3ZWVuCi0gKiB2YXJpYW50cyBvZiBlcXVhbCBxdWFsaXR5LiAgVGhpcyBwaWVjZSBpcyB0aGUgdHJlYXRtZW50IG9mIHZhcmlhbnRzCi0gKiBvZiB0aGUgc2FtZSBiYXNlIG1lZGlhIHR5cGUsIGJ1dCBkaWZmZXJlbnQgbGV2ZWxzLiAgV2hhdCB3ZSB3YW50IHRvCi0gKiByZXR1cm4gaXMgdGhlIHZhcmlhbnQgYXQgdGhlIGhpZ2hlc3QgbGV2ZWwgdGhhdCB0aGUgY2xpZW50IGV4cGxpY2l0bHkKLSAqIGNsYWltZWQgdG8gYWNjZXB0LgotICoKLSAqIElmIGFsbCB0aGUgdmFyaWFudHMgYXZhaWxhYmxlIGFyZSBhdCBhIGhpZ2hlciBsZXZlbCB0aGFuIHRoYXQsIG9yIGlmCi0gKiB0aGUgY2xpZW50IGRpZG4ndCBzYXkgYW55dGhpbmcgc3BlY2lmaWMgYWJvdXQgdGhpcyBtZWRpYSB0eXBlIGF0IGFsbAotICogYW5kIHRoZXNlIHZhcmlhbnRzIGp1c3QgZ290IGluIG9uIGEgd2lsZGNhcmQsIHdlIHByZWZlciB0aGUgbG93ZXN0Ci0gKiBsZXZlbCwgb24gZ3JvdW5kcyB0aGF0IHRoYXQncyB0aGUgb25lIHRoYXQgdGhlIGNsaWVudCBpcyBsZWFzdCBsaWtlbHkKLSAqIHRvIGNob2tlIG9uLgotICoKLSAqIChUaGlzIGlzIGFsbCBtb3RpdmF0ZWQgYnkgdHJlYXRtZW50IG9mIGxldmVscyBpbiBIVE1MIC0tLSB3ZSBvbmx5Ci0gKiB3YW50IHRvIGdpdmUgbGV2ZWwgMyB0byBicm93c2VycyB0aGF0IGV4cGxpY2l0bHkgYXNrIGZvciBpdDsgYnJvd3NlcnMKLSAqIHRoYXQgZG9uJ3QsIGluY2x1ZGluZyBIVFRQLzAuOSBicm93c2VycyB0aGF0IG9ubHkgZ2V0IHRoZSBpbXBsaWNpdAotICogIkFjY2VwdDogKiAvICoiIFtzcGFjZSBhZGRlZCB0byBhdm9pZCBjb25mdXNpbmcgY3BwIC0tLSBubywgdGhhdAotICogc3ludGF4IGRvZXNuJ3QgcmVhbGx5IHdvcmtdIHNob3VsZCBnZXQgSFRNTDIgaWYgYXZhaWxhYmxlKS4KLSAqCi0gKiAoTm90ZSB0aGF0IHRoaXMgY29kZSBvbmx5IGNvbWVzIGludG8gcGxheSB3aGVuIHdlIGFyZSBjaG9vc2luZyBhbW9uZwotICogdmFyaWFudHMgb2YgZXF1YWwgcXVhbGl0eSwgd2hlcmUgdGhlIGRyYWZ0IHN0YW5kYXJkIGdpdmVzIHVzIGEgZmFpcgotICogYml0IG9mIGxlZXdheSBhYm91dCB3aGF0IHRvIGRvLiAgSXQgYWluJ3Qgc3BlY2lmaWVkIGJ5IHRoZSBzdGFuZGFyZDsKLSAqIHJhdGhlciwgaXQgaXMgYSBjaG9pY2UgbWFkZSBieSB0aGlzIHNlcnZlciBhYm91dCB3aGF0IHRvIGRvIGluIGNhc2VzCi0gKiB3aGVyZSB0aGUgc3RhbmRhcmQgZG9lcyBub3Qgc3BlY2lmeSBhIHVuaXF1ZSBjb3Vyc2Ugb2YgYWN0aW9uKS4KLSAqLwotCi1zdGF0aWMgaW50IGxldmVsX2NtcCh2YXJfcmVjICp2YXIxLCB2YXJfcmVjICp2YXIyKQotewotICAgIC8qIExldmVscyBhcmUgb25seSBjb21wYXJhYmxlIGJldHdlZW4gbWF0Y2hpbmcgbWVkaWEgdHlwZXMgKi8KLQotICAgIGlmICh2YXIxLT5pc19wc2V1ZG9faHRtbCAmJiAhdmFyMi0+aXNfcHNldWRvX2h0bWwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKCF2YXIxLT5pc19wc2V1ZG9faHRtbCAmJiBzdHJjbXAodmFyMS0+bWltZV90eXBlLCB2YXIyLT5taW1lX3R5cGUpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAvKiBUaGUgcmVzdWx0IG9mIHRoZSBhYm92ZSBpZiBzdGF0ZW1lbnRzIGlzIHRoYXQsIGlmIHdlIGdldCB0bwotICAgICAqIGhlcmUsIGJvdGggdmFyaWFudHMgaGF2ZSB0aGUgc2FtZSBtaW1lX3R5cGUgb3IgYm90aCBhcmUKLSAgICAgKiBwc2V1ZG8taHRtbC4KLSAgICAgKi8gICAgCi0KLSAgICAvKiBUYWtlIGhpZ2hlc3QgbGV2ZWwgdGhhdCBtYXRjaGVkLCBpZiBlaXRoZXIgZGlkIG1hdGNoLiAqLwotCi0gICAgaWYgKHZhcjEtPmxldmVsX21hdGNoZWQgPiB2YXIyLT5sZXZlbF9tYXRjaGVkKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpZiAodmFyMS0+bGV2ZWxfbWF0Y2hlZCA8IHZhcjItPmxldmVsX21hdGNoZWQpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIE5laXRoZXIgbWF0Y2hlZC4gIFRha2UgbG93ZXN0IGxldmVsLCBpZiB0aGVyZSdzIGEgZGlmZmVyZW5jZS4gKi8KLQotICAgIGlmICh2YXIxLT5sZXZlbCA8IHZhcjItPmxldmVsKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpZiAodmFyMS0+bGV2ZWwgPiB2YXIyLT5sZXZlbCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogVGllZCAqLwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIEZpbmRpbmcgbGFuZ3VhZ2VzLiAgVGhlIG1haW4gZW50cnkgcG9pbnQgaXMgc2V0X2xhbmd1YWdlX3F1YWxpdHkoKQotICogd2hpY2ggaXMgY2FsbGVkIGZvciBlYWNoIHZhcmlhbnQuIEl0IHNldHMgdHdvIGVsZW1lbnRzIGluIHRoZQotICogdmFyaWFudCByZWNvcmQ6Ci0gKiAgICBsYW5ndWFnZV9xdWFsaXR5ICAtIHRoZSAncScgdmFsdWUgb2YgdGhlICdiZXN0JyBtYXRjaGluZyBsYW5ndWFnZQotICogICAgICAgICAgICAgICAgICAgICAgICBmcm9tIEFjY2VwdC1MYW5ndWFnZTogaGVhZGVyIChIVFRQLzEuMSkKLSAqICAgIGxhbmdfaW5kZXggICAgLSAgICAgUHJlIEhUVFAvMS4xIGxhbmd1YWdlIHByaW9yaXR5LCB1c2luZwotICogICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiBvZiBsYW5ndWFnZSBvbiB0aGUgQWNjZXB0LUxhbmd1YWdlOgotICogICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIsIGlmIHByZXNlbnQsIGVsc2UgTGFuZ3VhZ2VQcmlvcml0eQotICogICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmUgb3JkZXIuCi0gKgotICogV2hlbiB3ZSBkbyB0aGUgdmFyaWFudCBjaGVja2luZyBmb3IgYmVzdCB2YXJpYW50LCB3ZSB1c2UgbGFuZ3VhZ2UKLSAqIHF1YWxpdHkgZmlyc3QsIGFuZCBpZiBhIHRpZSwgbGFuZ3VhZ2VfaW5kZXggbmV4dCAodGhpcyBvbmx5IGFwcGxpZXMKLSAqIHdoZW4gX25vdF8gdXNpbmcgdGhlIFJWU0EvMS4wIGFsZ29yaXRobSkuIElmIHVzaW5nIHRoZSBSVlNBLzEuMAotICogYWxnb3JpdGhtLCBsYW5nX2luZGV4IGlzIG5ldmVyIHVzZWQuCi0gKgotICogc2V0X2xhbmd1YWdlX3F1YWxpdHkoKSBjYWxscyBmaW5kX2xhbmdfaW5kZXgoKSBhbmQgZmluZF9kZWZhdWx0X2luZGV4KCkKLSAqIHRvIHNldCBsYW5nX2luZGV4LiAgCi0gKi8KLQotc3RhdGljIGludCBmaW5kX2xhbmdfaW5kZXgoYXJyYXlfaGVhZGVyICphY2NlcHRfbGFuZ3MsIGNoYXIgKmxhbmcpCi17Ci0gICAgYWNjZXB0X3JlYyAqYWNjczsKLSAgICBpbnQgaTsKLQotICAgIGlmICghbGFuZyB8fCAhYWNjZXB0X2xhbmdzKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBhY2NzID0gKGFjY2VwdF9yZWMgKikgYWNjZXB0X2xhbmdzLT5lbHRzOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGFjY2VwdF9sYW5ncy0+bmVsdHM7ICsraSkgewotICAgICAgICBpZiAoIXN0cm5jbXAobGFuZywgYWNjc1tpXS5uYW1lLCBzdHJsZW4oYWNjc1tpXS5uYW1lKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIC0xOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHByaW9yaXR5IG9mIGEgZ2l2ZW4gbGFuZ3VhZ2UKLSAqIGFjY29yZGluZyB0byBMYW5ndWFnZVByaW9yaXR5LiAgSXQgaXMgdXNlZCBpbiBjYXNlIG9mIGEgdGllCi0gKiBiZXR3ZWVuIHNldmVyYWwgbGFuZ3VhZ2VzLgotICovCi0KLXN0YXRpYyBpbnQgZmluZF9kZWZhdWx0X2luZGV4KG5lZ19kaXJfY29uZmlnICpjb25mLCBjaGFyICpsYW5nKQotewotICAgIGFycmF5X2hlYWRlciAqYXJyOwotICAgIGludCBuZWx0czsKLSAgICBjaGFyICoqZWx0czsKLSAgICBpbnQgaTsKLQotICAgIGlmICghbGFuZykgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgYXJyID0gY29uZi0+bGFuZ3VhZ2VfcHJpb3JpdHk7Ci0gICAgbmVsdHMgPSBhcnItPm5lbHRzOwotICAgIGVsdHMgPSAoY2hhciAqKikgYXJyLT5lbHRzOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG5lbHRzOyArK2kpIHsKLSAgICAgICAgaWYgKCFzdHJjYXNlY21wKGVsdHNbaV0sIGxhbmcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAtMTsKLX0KLQotLyogc2V0X2RlZmF1bHRfbGFuZ19xdWFsaXR5KCkgc2V0cyB0aGUgcXVhbGl0eSB3ZSBhcHBseSB0byB2YXJpYW50cwotICogd2hpY2ggaGF2ZSBubyBsYW5ndWFnZSBhc3NpZ25lZCB0byB0aGVtLiBJZiBub25lIG9mIHRoZSB2YXJpYW50cwotICogaGF2ZSBhIGxhbmd1YWdlLCB3ZSBhcmUgbm90IG5lZ290aWF0aW5nIG9uIGxhbmd1YWdlLCBzbyBhbGwgYXJlCi0gKiBhY2NlcHRhYmxlLCBhbmQgd2Ugc2V0IHRoZSBkZWZhdWx0IHEgdmFsdWUgdG8gMS4wLiBIb3dldmVyIGlmCi0gKiBzb21lIG9mIHRoZSB2YXJpYW50cyBoYXZlIGxhbmd1YWdlcywgd2Ugc2V0IHRoaXMgZGVmYXVsdCB0byAwLjAwMS4KLSAqIFRoZSB2YWx1ZSBvZiB0aGlzIGRlZmF1bHQgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCB2YXJpYW50cyB3aXRoCi0gKiBubyBleHBsaWNpdCBsYW5ndWFnZSAtLSB3aGljaCB3aWxsIGhhdmUgdGhlIGVmZmVjdCBvZiBtYWtpbmcgdGhlbQotICogYWNjZXB0YWJsZSwgYnV0IG9ubHkgaWYgbm8gdmFyaWFudHMgd2l0aCBhbiBleHBsaWNpdCBsYW5ndWFnZQotICogYXJlIGFjY2VwdGFibGUuIFRoZSBkZWZhdWx0IHEgdmFsdWUgc2V0IGhlcmUgaXMgYXNzaWduZWQgdG8gdmFyaWFudHMKLSAqIHdpdGggbm8gbGFuZ3VhZ2UgdHlwZSBpbiBzZXRfbGFuZ3VhZ2VfcXVhbGl0eSgpLgotICoKLSAqIE5vdGUgdGhhdCBpZiB1c2luZyB0aGUgUlZTQS8xLjAgYWxnb3JpdGhtLCB3ZSBkb24ndCB1c2UgdGhpcwotICogZmlkZGxlLiAgCi0gKi8KLQotc3RhdGljIHZvaWQgc2V0X2RlZmF1bHRfbGFuZ19xdWFsaXR5KG5lZ290aWF0aW9uX3N0YXRlICpuZWcpCi17Ci0gICAgdmFyX3JlYyAqYXZhaWxfcmVjcyA9ICh2YXJfcmVjICopIG5lZy0+YXZhaWxfdmFycy0+ZWx0czsKLSAgICBpbnQgajsKLQotICAgIGlmICghbmVnLT5kb250X2ZpZGRsZV9oZWFkZXJzKSB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBuZWctPmF2YWlsX3ZhcnMtPm5lbHRzOyArK2opIHsKLSAgICAgICAgICAgIHZhcl9yZWMgKnZhcmlhbnQgPSAmYXZhaWxfcmVjc1tqXTsKLSAgICAgICAgICAgIGlmICh2YXJpYW50LT5jb250ZW50X2xhbmd1YWdlcyAmJgotICAgICAgICAgICAgICAgIHZhcmlhbnQtPmNvbnRlbnRfbGFuZ3VhZ2VzLT5uZWx0cykgewotICAgICAgICAgICAgICAgIG5lZy0+ZGVmYXVsdF9sYW5nX3F1YWxpdHkgPSAwLjAwMWY7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgbmVnLT5kZWZhdWx0X2xhbmdfcXVhbGl0eSA9IDEuMGY7Ci19Ci0KLS8qIFNldCB0aGUgbGFuZ3VhZ2VfcXVhbGl0eSB2YWx1ZSBpbiB0aGUgdmFyaWFudCByZWNvcmQuIEFsc28KLSAqIGFzc2lnbnMgbGFuZ19pbmRleCBmb3IgYmFjay1jb21wYXQuIAotICoKLSAqIFRvIGZpbmQgdGhlIGxhbmd1YWdlX3F1YWxpdHkgdmFsdWUsIHdlIGxvb2sgZm9yIHRoZSAncScgdmFsdWUKLSAqIG9mIHRoZSAnYmVzdCcgbWF0Y2hpbmcgbGFuZ3VhZ2Ugb24gdGhlIEFjY2VwdC1MYW5ndWFnZQotICogaGVhZGVyLiBUaGUgJ2Jlc3QnIG1hdGNoIGlzIHRoZSBsYW5ndWFnZSBvbiBBY2NlcHQtTGFuZ3VhZ2UKLSAqIGhlYWRlciB3aGljaCBtYXRjaGVzIHRoZSBsYW5ndWFnZSBvZiB0aGlzIHZhcmlhbnQgZWl0aGVyIGZ1bGx5LAotICogb3IgYXMgZmFyIGFzIHRoZSBwcmVmaXggbWFya2VyICgtKS4gSWYgdHdvIG9yIG1vcmUgbGFuZ3VhZ2VzCi0gKiBtYXRjaCwgdXNlIHRoZSBsb25nZXN0IHN0cmluZyBmcm9tIHRoZSBBY2NlcHQtTGFuZ3VhZ2UgaGVhZGVyCi0gKiAoc2VlIEhUVFAvMS4xIFsxNC40XSkKLSAqCi0gKiBXaGVuIGEgdmFyaWFudCBoYXMgbXVsdGlwbGUgbGFuZ3VhZ2VzLCB3ZSBmaW5kIHRoZSAnYmVzdCcKLSAqIG1hdGNoIGZvciBlYWNoIHZhcmlhbnQgbGFuZ3VhZ2UgdGFnIGFzIGFib3ZlLCB0aGVuIHNlbGVjdCB0aGUKLSAqIG9uZSB3aXRoIHRoZSBoaWdoZXN0IHEgdmFsdWUuIEJlY2F1c2UgYm90aCB0aGUgYWNjZXB0LWhlYWRlcgotICogYW5kIHZhcmlhbnQgY2FuIGhhdmUgbXVsdGlwbGUgbGFuZ3VhZ2VzLCB3ZSBub3cgaGF2ZSBhIGhhaXJ5Ci0gKiBsb29wLXdpdGhpbi1hLWxvb3AgaGVyZS4KLSAqCi0gKiBJZiB0aGUgdmFyaWFudCBoYXMgbm8gbGFuZ3VhZ2UgYW5kIHdlIGhhdmUgbm8gQWNjZXB0LUxhbmd1YWdlCi0gKiBpdGVtcywgbGVhdmUgdGhlIHF1YWxpdHkgYXQgMS4wIGFuZCByZXR1cm4uCi0gKgotICogSWYgdGhlIHZhcmlhbnQgaGFzIG5vIGxhbmd1YWdlLCB3ZSB1c2UgdGhlIGRlZmF1bHQgYXMgc2V0IGJ5Ci0gKiBzZXRfZGVmYXVsdF9sYW5nX3F1YWxpdHkoKSAoMS4wIGlmIHdlIGFyZSBub3QgbmVnb3RpYXRpbmcgb24KLSAqIGxhbmd1YWdlLCAwLjAwMSBpZiB3ZSBhcmUpLgotICoKLSAqIEZvbGxvd2luZyB0aGUgc2V0dGluZyBvZiB0aGUgbGFuZ3VhZ2UgcXVhbGl0eSwgd2UgZHJvcCB0aHJvdWdoIHRvCi0gKiBzZXQgdGhlIG9sZCAnbGFuZ19pbmRleCcuIFRoaXMgaXMgc2V0IGJhc2VkIG9uIGVpdGhlciB0aGUgb3JkZXIKLSAqIG9mIHRoZSBsYW5ndWFnZXMgb24gdGhlIEFjY2VwdC1MYW5ndWFnZSBoZWFkZXIsIG9yIHRoZQotICogb3JkZXIgb24gdGhlIExhbmd1YWdlUHJpb3JpdHkgZGlyZWN0aXZlLiBUaGlzIGlzIG9ubHkgdXNlZAotICogaW4gdGhlIG5lZ290aWF0aW9uIGlmIHRoZSBsYW5ndWFnZSBxdWFsaXRpZXMgdGllLgotICovCi0KLXN0YXRpYyB2b2lkIHNldF9sYW5ndWFnZV9xdWFsaXR5KG5lZ290aWF0aW9uX3N0YXRlICpuZWcsIHZhcl9yZWMgKnZhcmlhbnQpCi17Ci0gICAgY2hhciAqZmlyc3RsYW5nOwotICAgIGludCBpZHg7Ci0KLSAgICBpZiAoIXZhcmlhbnQtPmNvbnRlbnRfbGFuZ3VhZ2VzIHx8ICF2YXJpYW50LT5jb250ZW50X2xhbmd1YWdlcy0+bmVsdHMpIHsKLSAgICAgICAgLyogVGhpcyB2YXJpYW50IGhhcyBubyBjb250ZW50LWxhbmd1YWdlLCBzbyB1c2UgdGhlIGRlZmF1bHQKLSAgICAgICAgICogcXVhbGl0eSBmYWN0b3IgZm9yIHZhcmlhbnRzIHdpdGggbm8gY29udGVudC1sYW5ndWFnZQotICAgICAgICAgKiAocHJldmlvdXNseSBzZXQgYnkgc2V0X2RlZmF1bHRfbGFuZ19xdWFsaXR5KCkpLgotICAgICAgICAgKiBMZWF2ZSB0aGUgZmFjdG9yIGFsb25lIChpdCByZW1haW5zIGF0IDEuMCkgd2hlbiB3ZSBtYXkgbm90IGZpZGRsZQotICAgICAgICAgKiB3aXRoIHRoZSBoZWFkZXJzLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCFuZWctPmRvbnRfZmlkZGxlX2hlYWRlcnMpIHsKLSAgICAgICAgICAgIHZhcmlhbnQtPmxhbmdfcXVhbGl0eSA9IG5lZy0+ZGVmYXVsdF9sYW5nX3F1YWxpdHk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFuZWctPmFjY2VwdF9sYW5ncykgewotICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAvKiBubyBhY2NlcHQtbGFuZ3VhZ2UgaGVhZGVyICovCi0gICAgICAgIH0KLQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogVmFyaWFudCBoYXMgb25lIChvciBtb3JlKSBsYW5ndWFnZXMuICBMb29rIGZvciB0aGUgYmVzdAotICAgICAgICAgKiBtYXRjaC4gV2UgZG8gdGhpcyBieSBnb2luZyB0aHJvdWdoIGVhY2ggbGFuZ3VhZ2Ugb24gdGhlCi0gICAgICAgICAqIHZhcmlhbnQgZGVzY3JpcHRpb24gbG9va2luZyBmb3IgYSBtYXRjaCBvbiB0aGUKLSAgICAgICAgICogQWNjZXB0LUxhbmd1YWdlIGhlYWRlci4gVGhlIGJlc3QgbWF0Y2ggaXMgdGhlIGxvbmdlc3QKLSAgICAgICAgICogbWF0Y2hpbmcgbGFuZ3VhZ2Ugb24gdGhlIGhlYWRlci4gVGhlIGZpbmFsIHJlc3VsdCBpcyB0aGUKLSAgICAgICAgICogYmVzdCBxIHZhbHVlIGZyb20gYWxsIHRoZSBsYW5ndWFnZXMgb24gdGhlIHZhcmlhbnQKLSAgICAgICAgICogZGVzY3JpcHRpb24uCi0gICAgICAgICAqLwotCi0gICAgICAgIGlmICghbmVnLT5hY2NlcHRfbGFuZ3MpIHsKLSAgICAgICAgICAgIC8qIG5vIGFjY2VwdC1sYW5ndWFnZSBoZWFkZXIgbWFrZXMgdGhlIHZhcmlhbnQgaW5kZWZpbml0ZSAqLwotICAgICAgICAgICAgdmFyaWFudC0+ZGVmaW5pdGUgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgeyAgICAvKiBUaGVyZSBpcyBhbiBhY2NlcHQtbGFuZ3VhZ2Ugd2l0aCAwIG9yIG1vcmUgaXRlbXMgKi8KLSAgICAgICAgICAgIGFjY2VwdF9yZWMgKmFjY3MgPSAoYWNjZXB0X3JlYyAqKSBuZWctPmFjY2VwdF9sYW5ncy0+ZWx0czsKLSAgICAgICAgICAgIGFjY2VwdF9yZWMgKmJlc3QgPSBOVUxMLCAqc3RhciA9IE5VTEw7Ci0gICAgICAgICAgICBhY2NlcHRfcmVjICpiZXN0dGhpc3RhZzsKLSAgICAgICAgICAgIGNoYXIgKmxhbmcsICpwOwotICAgICAgICAgICAgZmxvYXQgZmlkZGxlX3EgPSAwLjBmOwotICAgICAgICAgICAgaW50IGFueV9tYXRjaF9vbl9zdGFyID0gMDsKLSAgICAgICAgICAgIGludCBpLCBqLCBhbGVuLCBsb25nZXN0X2xhbmdfcmFuZ2VfbGVuOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdmFyaWFudC0+Y29udGVudF9sYW5ndWFnZXMtPm5lbHRzOyArK2opIHsKLSAgICAgICAgICAgICAgICBwID0gTlVMTDsKLSAgICAgICAgICAgICAgICBiZXN0dGhpc3RhZyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgbG9uZ2VzdF9sYW5nX3JhbmdlX2xlbiA9IDA7Ci0gICAgICAgICAgICAgICAgYWxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyogbGFuZyBpcyB0aGUgdmFyaWFudCdzIGxhbmd1YWdlLXRhZywgd2hpY2ggaXMgdGhlIG9uZQotICAgICAgICAgICAgICAgICAqIHdlIGFyZSBhbGxvd2VkIHRvIHVzZSB0aGUgcHJlZml4IG9mIGluIEhUVFAvMS4xCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgbGFuZyA9ICgoY2hhciAqKikgKHZhcmlhbnQtPmNvbnRlbnRfbGFuZ3VhZ2VzLT5lbHRzKSlbal07Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyogbm93IGZpbmQgdGhlIGJlc3QgKGkuZS4gbG9uZ2VzdCkgbWF0Y2hpbmcKLSAgICAgICAgICAgICAgICAgKiBBY2NlcHQtTGFuZ3VhZ2UgaGVhZGVyIGxhbmd1YWdlLiBXZSBwdXQgdGhlIGJlc3QgbWF0Y2gKLSAgICAgICAgICAgICAgICAgKiBmb3IgdGhpcyB0YWcgaW4gYmVzdHRoaXN0YWcuIFdlIGNhbm5vdCB1cGRhdGUgdGhlCi0gICAgICAgICAgICAgICAgICogb3ZlcmFsbCBiZXN0IChiYXNlZCBvbiBxIHZhbHVlKSBiZWNhdXNlIHRoZSBiZXN0IG1hdGNoCi0gICAgICAgICAgICAgICAgICogZm9yIHRoaXMgdGFnIGlzIHRoZSBsb25nZXN0IGxhbmd1YWdlIGl0ZW0gb24gdGhlIGFjY2VwdAotICAgICAgICAgICAgICAgICAqIGhlYWRlciwgbm90IG5lY2Vzc2FyaWx5IHRoZSBoaWdoZXN0IHEuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5lZy0+YWNjZXB0X2xhbmdzLT5uZWx0czsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc3RyY21wKGFjY3NbaV0ubmFtZSwgIioiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhciA9ICZhY2NzW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogRmluZCBsYW5ndWFnZS4gV2UgbWF0Y2ggaWYgZWl0aGVyIHRoZSB2YXJpYW50Ci0gICAgICAgICAgICAgICAgICAgICAqIGxhbmd1YWdlIHRhZyBleGFjdGx5IG1hdGNoZXMgdGhlIGxhbmd1YWdlIHJhbmdlCi0gICAgICAgICAgICAgICAgICAgICAqIGZyb20gdGhlIGFjY2VwdCBoZWFkZXIsIG9yIGEgcHJlZml4IG9mIHRoZSB2YXJpYW50Ci0gICAgICAgICAgICAgICAgICAgICAqIGxhbmd1YWdlIHRhZyB1cCB0byBhICctJyBjaGFyYWN0ZXIgbWF0Y2hlcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICogd2hvbGUgb2YgdGhlIGxhbmd1YWdlIHJhbmdlIGluIHRoZSBBY2NlcHQtTGFuZ3VhZ2UKLSAgICAgICAgICAgICAgICAgICAgICogaGVhZGVyLiAgTm90ZSB0aGF0IEhUVFAvMS54IGFsbG93cyBhbnkgbnVtYmVyIG9mCi0gICAgICAgICAgICAgICAgICAgICAqICctJyBjaGFyYWN0ZXJzIGluIGEgdGFnIG9yIHJhbmdlLCBjdXJyZW50bHkgb25seQotICAgICAgICAgICAgICAgICAgICAgKiB0YWdzIHdpdGggemVybyBvciBvbmUgJy0nIGNoYXJhY3RlcnMgYXJlIGRlZmluZWQKLSAgICAgICAgICAgICAgICAgICAgICogZm9yIGdlbmVyYWwgdXNlIChzZWUgcmZjMTc2NikuCi0gICAgICAgICAgICAgICAgICAgICAqICAKLSAgICAgICAgICAgICAgICAgICAgICogV2Ugb25seSB1c2UgbGFuZ3VhZ2UgcmFuZ2UgaW4gdGhlIEFjY2VwdC1MYW5ndWFnZQotICAgICAgICAgICAgICAgICAgICAgKiBoZWFkZXIgdGhlIGJlc3QgbWF0Y2ggZm9yIHRoZSB2YXJpYW50IGxhbmd1YWdlIHRhZwotICAgICAgICAgICAgICAgICAgICAgKiBpZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgcHJldmlvdXMgYmVzdCBtYXRjaC4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBhbGVuID0gc3RybGVuKGFjY3NbaV0ubmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cmxlbihsYW5nKSA+PSBhbGVuKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIXN0cm5jbXAobGFuZywgYWNjc1tpXS5uYW1lLCBhbGVuKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKChsYW5nW2FsZW5dID09IDApIHx8IChsYW5nW2FsZW5dID09ICctJykpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxlbiA+IGxvbmdlc3RfbGFuZ19yYW5nZV9sZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nZXN0X2xhbmdfcmFuZ2VfbGVuID0gYWxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0dGhpc3RhZyA9ICZhY2NzW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoIWJlc3R0aGlzdGFnICYmICFuZWctPmRvbnRfZmlkZGxlX2hlYWRlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBuZXh0IGJpdCBpcyBhIGZpZGRsZS4gU29tZSBicm93c2VycyBtaWdodAotICAgICAgICAgICAgICAgICAgICAgICAgICogYmUgY29uZmlndXJlZCB0byBzZW5kIG1vcmUgc3BlY2lmaWMgbGFuZ3VhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHJhbmdlcyB0aGFuIGRlc2lyYWJsZS4gRm9yIGV4YW1wbGUsIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBBY2NlcHQtTGFuZ3VhZ2Ugb2YgZW4tVVMgc2hvdWxkIG5ldmVyIG1hdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiB2YXJpYW50cyB3aXRoIGxhbmd1YWdlcyBlbiBvciBlbi1HQi4gQnV0IFVTCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBFbmdsaXNoIHNwZWFrZXJzIG1pZ2h0IHBpY2sgZW4tVVMgYXMgdGhlaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGxhbmd1YWdlIGNob2ljZS4gIFNvIHRoaXMgZmlkZGxlIGNoZWNrcyBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGxhbmd1YWdlIHJhbmdlIGhhcyBhIHByZWZpeCwgYW5kIGlmIHNvLCBpdAotICAgICAgICAgICAgICAgICAgICAgICAgICogbWF0Y2hlcyB2YXJpYW50cyB3aGljaCBtYXRjaCB0aGF0IHByZWZpeCB3aXRoIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHByaW9yaXR5IG9mIDAuMDAxLiBTbyBhIHJlcXVlc3QgZm9yIGVuLVVTIHdvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBtYXRjaCB2YXJpYW50cyBvZiB0eXBlcyBlbiBhbmQgZW4tR0IsIGJ1dCBhdAotICAgICAgICAgICAgICAgICAgICAgICAgICogbXVjaCBsb3dlciBwcmlvcml0eSB0aGFuIG1hdGNoZXMgb2YgZW4tVVMKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGRpcmVjdGx5LCBvciBvZiBhbnkgb3RoZXIgbGFuZ3VhZ2UgbGlzdGVkIG9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgQWNjZXB0LUxhbmd1YWdlIGhlYWRlci4gTm90ZSB0aGF0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpZGRsZSBkb2VzIG5vdCBoYW5kbGUgbXVsdGktbGV2ZWwgcHJlZml4ZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocCA9IHN0cmNocihhY2NzW2ldLm5hbWUsICctJykpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsZW4gPSBwIC0gYWNjc1tpXS5uYW1lOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJuY21wKGxhbmcsIGFjY3NbaV0ubmFtZSwgcGxlbikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlkZGxlX3EgPSAwLjAwMWY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIEZpbmlzaGVkIGxvb2tpbmcgYXQgQWNjZXB0LUxhbmd1YWdlIGhlYWRlcnMsIHRoZSBiZXN0Ci0gICAgICAgICAgICAgICAgICogKGxvbmdlc3QpIG1hdGNoIGlzIGluIGJlc3R0aGlzdGFnLCBvciBOVUxMIGlmIG5vIG1hdGNoCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKCFiZXN0IHx8Ci0gICAgICAgICAgICAgICAgICAgIChiZXN0dGhpc3RhZyAmJiBiZXN0dGhpc3RhZy0+cXVhbGl0eSA+IGJlc3QtPnF1YWxpdHkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3QgPSBiZXN0dGhpc3RhZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyogU2VlIGlmIHRoZSB0YWcgbWF0Y2hlcyBvbiBhICogaW4gdGhlIEFjY2VwdC1MYW5ndWFnZQotICAgICAgICAgICAgICAgICAqIGhlYWRlci4gSWYgc28sIHJlY29yZCB0aGlzIGZhY3QgZm9yIGxhdGVyIHVzZSAKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoIWJlc3R0aGlzdGFnICYmIHN0YXIpIHsKLSAgICAgICAgICAgICAgICAgICAgYW55X21hdGNoX29uX3N0YXIgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogSWYgb25lIG9mIHRoZSBsYW5ndWFnZSB0YWdzIG9mIHRoZSB2YXJpYW50IG1hdGNoZWQgb24gKiwgd2UKLSAgICAgICAgICAgICAqIG5lZWQgdG8gc2VlIGlmIGl0cyBxIGlzIGJldHRlciB0aGFuIHRoYXQgb2YgYW55IG5vbi0qIG1hdGNoCi0gICAgICAgICAgICAgKiBvbiBhbnkgb3RoZXIgdGFnIG9mIHRoZSB2YXJpYW50LiAgSWYgc28gdGhlICogbWF0Y2ggdGFrZXMKLSAgICAgICAgICAgICAqIHByZWNlZGVuY2UgYW5kIHRoZSBvdmVyYWxsIG1hdGNoIGlzIG5vdCBkZWZpbml0ZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCBhbnlfbWF0Y2hfb25fc3RhciAmJgotICAgICAgICAgICAgICAgICgoYmVzdCAmJiBzdGFyLT5xdWFsaXR5ID4gYmVzdC0+cXVhbGl0eSkgfHwKLSAgICAgICAgICAgICAgICAgKCFiZXN0KSkgKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IHN0YXI7Ci0gICAgICAgICAgICAgICAgdmFyaWFudC0+ZGVmaW5pdGUgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB2YXJpYW50LT5sYW5nX3F1YWxpdHkgPSBiZXN0ID8gYmVzdC0+cXVhbGl0eSA6IGZpZGRsZV9xOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogTm93IHNldCB0aGUgb2xkIGxhbmdfaW5kZXggZmllbGQuIFNpbmNlIHRoaXMgaXMgb2xkIAotICAgICAqIHN0dWZmIGFueXdheSwgZG9uJ3QgYm90aGVyIHdpdGggaGFuZGxpbmcgbXVsdGlwbGUgbGFuZ3VhZ2VzCi0gICAgICogcGVyIHZhcmlhbnQsIGp1c3QgdXNlIHRoZSBmaXJzdCBvbmUgYXNzaWduZWQgdG8gaXQgCi0gICAgICovCi0gICAgaWR4ID0gMDsKLSAgICBpZiAodmFyaWFudC0+Y29udGVudF9sYW5ndWFnZXMgJiYgdmFyaWFudC0+Y29udGVudF9sYW5ndWFnZXMtPm5lbHRzKSB7Ci0gICAgICAgIGZpcnN0bGFuZyA9ICgoY2hhciAqKikgdmFyaWFudC0+Y29udGVudF9sYW5ndWFnZXMtPmVsdHMpWzBdOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgZmlyc3RsYW5nID0gIiI7Ci0gICAgfQotICAgIGlmICghbmVnLT5hY2NlcHRfbGFuZ3MpIHsgICAvKiBDbGllbnQgZG9lc24ndCBjYXJlICovCi0gICAgICAgIGlkeCA9IGZpbmRfZGVmYXVsdF9pbmRleCgobmVnX2Rpcl9jb25maWcgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnLT5yLT5wZXJfZGlyX2NvbmZpZywgJm5lZ290aWF0aW9uX21vZHVsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdGxhbmcpOwotICAgIH0KLSAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLyogQ2xpZW50IGhhcyBBY2NlcHQtTGFuZ3VhZ2UgKi8KLSAgICAgICAgaWR4ID0gZmluZF9sYW5nX2luZGV4KG5lZy0+YWNjZXB0X2xhbmdzLCBmaXJzdGxhbmcpOwotICAgIH0KLSAgICB2YXJpYW50LT5sYW5nX2luZGV4ID0gaWR4OwotCi0gICAgcmV0dXJuOwotfQotCi0vKiBEZXRlcm1pbmluZyB0aGUgY29udGVudCBsZW5ndGggLS0tIGlmIHRoZSBtYXAgZGlkbid0IHRlbGwgdXMsCi0gKiB3ZSBoYXZlIHRvIGRvIGEgc3RhdCgpIGFuZCByZW1lbWJlciBmb3IgbmV4dCB0aW1lLgotICoKLSAqIEdydW1wLiAgRm9yIEFwYWNoZSwgZXZlbiB0aGUgZmlyc3Qgc3RhdCBoZXJlIG1heSB3ZWxsIGJlCi0gKiByZWR1bmRhbnQgKGZvciBtdWx0aXZpZXdzKSB3aXRoIGEgc3RhdCgpIGRvbmUgYnkgdGhlIHN1Yl9yZXEKLSAqIG1hY2hpbmVyeS4gIEF0IHNvbWUgcG9pbnQsIHRoYXQgb3VnaHQgdG8gYmUgZml4ZWQuCi0gKi8KLQotc3RhdGljIGZsb2F0IGZpbmRfY29udGVudF9sZW5ndGgobmVnb3RpYXRpb25fc3RhdGUgKm5lZywgdmFyX3JlYyAqdmFyaWFudCkKLXsKLSAgICBzdHJ1Y3Qgc3RhdCBzdGF0YjsKLQotICAgIGlmICh2YXJpYW50LT5ieXRlcyA9PSAwKSB7Ci0gICAgICAgIGNoYXIgKmZ1bGxuYW1lID0gYXBfbWFrZV9mdWxsX3BhdGgobmVnLT5wb29sLCBuZWctPmRpcl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQtPmZpbGVfbmFtZSk7Ci0KLSAgICAgICAgaWYgKHN0YXQoZnVsbG5hbWUsICZzdGF0YikgPj0gMCkgewotICAgICAgICAgICAgLyogTm90ZSwgcHJlY2lzaW9uIG1heSBiZSBsb3N0ICovCi0gICAgICAgICAgICB2YXJpYW50LT5ieXRlcyA9IChmbG9hdCkgc3RhdGIuc3Rfc2l6ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB2YXJpYW50LT5ieXRlczsKLX0KLQotLyogRm9yIGEgZ2l2ZW4gdmFyaWFudCwgZmluZCB0aGUgYmVzdCBtYXRjaGluZyBBY2NlcHQ6IGhlYWRlcgotICogYW5kIGFzc2lnbiB0aGUgQWNjZXB0OiBoZWFkZXIncyBxdWFsaXR5IHZhbHVlIHRvIHRoZQotICogbWltZV90eXBlX3F1YWxpdHkgZmllbGQgb2YgdGhlIHZhcmlhbnQsIGZvciBsYXRlciB1c2UgaW4KLSAqIGRldGVybWluaW5nIHRoZSBiZXN0IG1hdGNoaW5nIHZhcmlhbnQuCi0gKi8KLQotc3RhdGljIHZvaWQgc2V0X2FjY2VwdF9xdWFsaXR5KG5lZ290aWF0aW9uX3N0YXRlICpuZWcsIHZhcl9yZWMgKnZhcmlhbnQpCi17Ci0gICAgaW50IGk7Ci0gICAgYWNjZXB0X3JlYyAqYWNjZXB0X3JlY3M7Ci0gICAgZmxvYXQgcSA9IDAuMGY7Ci0gICAgaW50IHFfZGVmaW5pdGUgPSAxOwotCi0gICAgLyogaWYgbm8gQWNjZXB0OiBoZWFkZXIsIGxlYXZlIHF1YWxpdHkgYWxvbmUgKHdpbGwKLSAgICAgKiByZW1haW4gYXQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgMSkgCi0gICAgICoKLSAgICAgKiBYWFg6IFRoaXMgaWYgaXMgY3VycmVudGx5IG5ldmVyIHRydWUgYmVjYXVzZSBvZiB0aGUgZWZmZWN0IG9mCi0gICAgICogbWF5YmVfYWRkX2RlZmF1bHRfYWNjZXB0cygpLgotICAgICAqLwotICAgIGlmICghbmVnLT5hY2NlcHRzKSB7Ci0gICAgICAgIGlmICh2YXJpYW50LT5taW1lX3R5cGUgJiYgKnZhcmlhbnQtPm1pbWVfdHlwZSkKLSAgICAgICAgICAgIHZhcmlhbnQtPmRlZmluaXRlID0gMDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGFjY2VwdF9yZWNzID0gKGFjY2VwdF9yZWMgKikgbmVnLT5hY2NlcHRzLT5lbHRzOwotCi0gICAgLyoKLSAgICAgKiBHbyB0aHJvdWdoIGVhY2ggb2YgdGhlIHJhbmdlcyBvbiB0aGUgQWNjZXB0OiBoZWFkZXIsCi0gICAgICogbG9va2luZyBmb3IgdGhlICdiZXN0JyBtYXRjaCB3aXRoIHRoaXMgdmFyaWFudCdzCi0gICAgICogY29udGVudC10eXBlLiBXZSB1c2UgdGhlIGJlc3QgbWF0Y2gncyBxdWFsaXR5Ci0gICAgICogdmFsdWUgKGZyb20gdGhlIEFjY2VwdDogaGVhZGVyKSBmb3IgdGhpcyB2YXJpYW50J3MKLSAgICAgKiBtaW1lX3R5cGVfcXVhbGl0eSBmaWVsZC4KLSAgICAgKgotICAgICAqIFRoZSBiZXN0IG1hdGNoIGlzIGRldGVybWluZWQgbGlrZSB0aGlzOgotICAgICAqICAgIHR5cGUvdHlwZSBpcyBiZXR0ZXIgdGhhbiB0eXBlLyAqIGlzIGJldHRlciB0aGFuICogLyAqCi0gICAgICogICAgaWYgbWF0Y2ggaXMgdHlwZS90eXBlLCB1c2UgdGhlIGxldmVsIG1pbWUgcGFyYW0gaWYgYXZhaWxhYmxlCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IG5lZy0+YWNjZXB0cy0+bmVsdHM7ICsraSkgewotCi0gICAgICAgIGFjY2VwdF9yZWMgKnR5cGUgPSAmYWNjZXB0X3JlY3NbaV07Ci0gICAgICAgIGludCBwcmV2X21pbWVfc3RhcnM7Ci0KLSAgICAgICAgcHJldl9taW1lX3N0YXJzID0gdmFyaWFudC0+bWltZV9zdGFyczsKLQotICAgICAgICBpZiAoIW1pbWVfbWF0Y2godHlwZSwgdmFyaWFudCkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgLyogZGlkbid0IG1hdGNoIHRoZSBjb250ZW50IHR5cGUgYXQgYWxsICovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKiBkaWQgbWF0Y2ggLSBzZWUgaWYgdGhlcmUgd2VyZSBsZXNzIG9yIG1vcmUgc3RhcnMgdGhhbgotICAgICAgICAgICAgICogaW4gcHJldmlvdXMgbWF0Y2gKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHByZXZfbWltZV9zdGFycyA9PSB2YXJpYW50LT5taW1lX3N0YXJzKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgIC8qIG1vcmUgc3RhcnMgPT4gbm90IGFzIGdvb2QgYSBtYXRjaCAqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogSWYgd2UgYXJlIGFsbG93ZWQgdG8gbWVzcyB3aXRoIHRoZSBxLXZhbHVlcwotICAgICAgICAgKiBhbmQgaGF2ZSBubyBleHBsaWNpdCBxPSBwYXJhbWV0ZXJzIGluIHRoZSBhY2NlcHQgaGVhZGVyLAotICAgICAgICAgKiBtYWtlIHdpbGRjYXJkcyB2ZXJ5IGxvdywgc28gd2UgaGF2ZSBhIGxvdyBjaGFuY2UKLSAgICAgICAgICogb2YgZW5kaW5nIHVwIHdpdGggdGhlbSBpZiB0aGVyZSdzIHNvbWV0aGluZyBiZXR0ZXIuCi0gICAgICAgICAqLwotCi0gICAgICAgIGlmICghbmVnLT5kb250X2ZpZGRsZV9oZWFkZXJzICYmICFuZWctPmFjY2VwdF9xICYmCi0gICAgICAgICAgICB2YXJpYW50LT5taW1lX3N0YXJzID09IDEpIHsKLSAgICAgICAgICAgIHEgPSAwLjAxZjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghbmVnLT5kb250X2ZpZGRsZV9oZWFkZXJzICYmICFuZWctPmFjY2VwdF9xICYmCi0gICAgICAgICAgICAgICAgIHZhcmlhbnQtPm1pbWVfc3RhcnMgPT0gMikgewotICAgICAgICAgICAgcSA9IDAuMDJmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcSA9IHR5cGUtPnF1YWxpdHk7Ci0gICAgICAgIH0KLQotICAgICAgICBxX2RlZmluaXRlID0gKHZhcmlhbnQtPm1pbWVfc3RhcnMgPT0gMyk7Ci0gICAgfQotICAgIHZhcmlhbnQtPm1pbWVfdHlwZV9xdWFsaXR5ID0gcTsKLSAgICB2YXJpYW50LT5kZWZpbml0ZSA9IHZhcmlhbnQtPmRlZmluaXRlICYmIHFfZGVmaW5pdGU7Ci0KLX0KLQotLyogRm9yIGEgZ2l2ZW4gdmFyaWFudCwgZmluZCB0aGUgJ3EnIHZhbHVlIG9mIHRoZSBjaGFyc2V0IGdpdmVuCi0gKiBvbiB0aGUgQWNjZXB0LUNoYXJzZXQgbGluZS4gSWYgbm8gY2hhcnNldHMgYXJlIGxpc3RlZCwKLSAqIGFzc3VtZSB2YWx1ZSBvZiAnMScuCi0gKi8KLXN0YXRpYyB2b2lkIHNldF9jaGFyc2V0X3F1YWxpdHkobmVnb3RpYXRpb25fc3RhdGUgKm5lZywgdmFyX3JlYyAqdmFyaWFudCkKLXsKLSAgICBpbnQgaTsKLSAgICBhY2NlcHRfcmVjICphY2NlcHRfcmVjczsKLSAgICBjaGFyICpjaGFyc2V0ID0gdmFyaWFudC0+Y29udGVudF9jaGFyc2V0OwotICAgIGFjY2VwdF9yZWMgKnN0YXIgPSBOVUxMOwotCi0gICAgLyogaWYgbm8gQWNjZXB0LUNoYXJzZXQ6IGhlYWRlciwgbGVhdmUgcXVhbGl0eSBhbG9uZSAod2lsbAotICAgICAqIHJlbWFpbiBhdCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiAxKQotICAgICAqLwotICAgIGlmICghbmVnLT5hY2NlcHRfY2hhcnNldHMpIHsKLSAgICAgICAgaWYgKGNoYXJzZXQgJiYgKmNoYXJzZXQpCi0gICAgICAgICAgICB2YXJpYW50LT5kZWZpbml0ZSA9IDA7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhY2NlcHRfcmVjcyA9IChhY2NlcHRfcmVjICopIG5lZy0+YWNjZXB0X2NoYXJzZXRzLT5lbHRzOwotCi0gICAgaWYgKGNoYXJzZXQgPT0gTlVMTCB8fCAhKmNoYXJzZXQpIHsKLSAgICAgICAgLyogQ2hhcnNldCBvZiB2YXJpYW50IG5vdCBrbm93biAqLwotCi0gICAgICAgIC8qIGlmIG5vdCBhIHRleHQgLyAqIHR5cGUsIGxlYXZlIHF1YWxpdHkgYWxvbmUgKi8KLSAgICAgICAgaWYgKCEoIXN0cm5jbXAodmFyaWFudC0+bWltZV90eXBlLCAidGV4dC8iLCA1KQotICAgICAgICAgICAgICB8fCAhc3RyY21wKHZhcmlhbnQtPm1pbWVfdHlwZSwgSU5DTFVERVNfTUFHSUNfVFlQRSkKLSAgICAgICAgICAgICAgfHwgIXN0cmNtcCh2YXJpYW50LT5taW1lX3R5cGUsIElOQ0xVREVTX01BR0lDX1RZUEUzKSAKLSAgICAgICAgICAgICAgKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvKiBEb24ndCBnbyBndWVzc2luZyBpZiB3ZSBhcmUgaW4gc3RyaWN0IGhlYWRlciBtb2RlLAotICAgICAgICAgKiBlLmcuIHdoZW4gcnVubmluZyB0aGUgcnZzYSwgYXMgYW55IGd1ZXNzIHdvbid0IGJlIHJlZmxlY3RlZAotICAgICAgICAgKiBpbiB0aGUgdmFyaWFudCBsaXN0IG9yIGNvbnRlbnQtbG9jYXRpb24gaGVhZGVycy4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChuZWctPmRvbnRfZmlkZGxlX2hlYWRlcnMpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgY2hhcnNldCA9ICJpc28tODg1OS0xIjsgLyogVGhlIGRlZmF1bHQgY2hhcnNldCBmb3IgSFRUUCB0ZXh0IHR5cGVzICovCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBHbyB0aHJvdWdoIGVhY2ggb2YgdGhlIGl0ZW1zIG9uIHRoZSBBY2NlcHQtQ2hhcnNldCBoZWFkZXIsCi0gICAgICogbG9va2luZyBmb3IgYSBtYXRjaCB3aXRoIHRoaXMgdmFyaWFudCdzIGNoYXJzZXQuIElmIG5vbmUKLSAgICAgKiBtYXRjaCwgY2hhcnNldCBpcyB1bmFjY2VwdGFibGUsIHNvIHNldCBxdWFsaXR5IHRvIDAuCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IG5lZy0+YWNjZXB0X2NoYXJzZXRzLT5uZWx0czsgKytpKSB7Ci0KLSAgICAgICAgYWNjZXB0X3JlYyAqdHlwZSA9ICZhY2NlcHRfcmVjc1tpXTsKLQotICAgICAgICBpZiAoIXN0cmNtcCh0eXBlLT5uYW1lLCBjaGFyc2V0KSkgewotICAgICAgICAgICAgdmFyaWFudC0+Y2hhcnNldF9xdWFsaXR5ID0gdHlwZS0+cXVhbGl0eTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJjbXAodHlwZS0+bmFtZSwgIioiKSA9PSAwKSB7Ci0gICAgICAgICAgICBzdGFyID0gdHlwZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBObyBleHBsaWNpdCBtYXRjaCAqLwotICAgIGlmIChzdGFyKSB7Ci0gICAgICAgIHZhcmlhbnQtPmNoYXJzZXRfcXVhbGl0eSA9IHN0YXItPnF1YWxpdHk7Ci0gICAgICAgIHZhcmlhbnQtPmRlZmluaXRlID0gMDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvKiBJZiB0aGlzIHZhcmlhbnQgaXMgaW4gY2hhcnNldCBpc28tODg1OS0xLCB0aGUgZGVmYXVsdCBpcyAxLjAgKi8KLSAgICBpZiAoc3RyY21wKGNoYXJzZXQsICJpc28tODg1OS0xIikgPT0gMCkgewotICAgICAgICB2YXJpYW50LT5jaGFyc2V0X3F1YWxpdHkgPSAxLjBmOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgdmFyaWFudC0+Y2hhcnNldF9xdWFsaXR5ID0gMC4wZjsKLSAgICB9Ci19Ci0KLQotLyogaXNfaWRlbnRpdHlfZW5jb2RpbmcgaXMgaW5jbHVkZWQgZm9yIGJhY2stY29tcGF0LCBidXQgZG9lcyBhbnlvbmUKLSAqIHVzZSA3Yml0LCA4YmluIG9yIGJpbmFyeSBpbiB0aGVpciB2YXIgZmlsZXM/PwotICovCi0KLXN0YXRpYyBpbnQgaXNfaWRlbnRpdHlfZW5jb2RpbmcoY29uc3QgY2hhciAqZW5jKQotewotICAgIHJldHVybiAoIWVuYyB8fCAhZW5jWzBdIHx8ICFzdHJjbXAoZW5jLCAiN2JpdCIpIHx8ICFzdHJjbXAoZW5jLCAiOGJpdCIpCi0gICAgICAgICAgICB8fCAhc3RyY21wKGVuYywgImJpbmFyeSIpKTsKLX0KLQotLyoKLSAqIHNldF9lbmNvZGluZ19xdWFsaXR5IGRldGVybWluZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgZm9yIGEgcGFydGljdWxhcgotICogdmFyaWFudCBpcyBhY2NlcHRhYmxlIGZvciB0aGUgdXNlci1hZ2VudC4KLSAqCi0gKiBUaGUgcnVsZXMgZm9yIGVuY29kaW5nIGFyZSB0aGF0IGlmIHRoZSB1c2VyLWFnZW50IGRvZXMgbm90IHN1cHBseQotICogYW55IEFjY2VwdC1FbmNvZGluZyBoZWFkZXIsIHRoZW4gYWxsIGVuY29kaW5ncyBhcmUgYWxsb3dlZCBidXQgYQotICogdmFyaWFudCB3aXRoIG5vIGVuY29kaW5nIHNob3VsZCBiZSBwcmVmZXJyZWQuCi0gKiBJZiB0aGVyZSBpcyBhbiBlbXB0eSBBY2NlcHQtRW5jb2RpbmcgaGVhZGVyLCB0aGVuIG5vIGVuY29kaW5ncyBhcmUgCi0gKiBhY2NlcHRhYmxlLiBJZiB0aGVyZSBpcyBhIG5vbi1lbXB0eSBBY2NlcHQtRW5jb2RpbmcgaGVhZGVyLCB0aGVuCi0gKiBhbnkgb2YgdGhlIGxpc3RlZCBlbmNvZGluZ3MgYXJlIGFjY2VwdGFibGUsIGFzIHdlbGwgYXMgbm8gZW5jb2RpbmcKLSAqIHVubGVzcyB0aGUgImlkZW50aXR5IiBlbmNvZGluZyBpcyBzcGVjaWZpY2FsbHkgZXhjbHVkZWQuCi0gKi8KLXN0YXRpYyB2b2lkIHNldF9lbmNvZGluZ19xdWFsaXR5KG5lZ290aWF0aW9uX3N0YXRlICpuZWcsIHZhcl9yZWMgKnZhcmlhbnQpCi17Ci0gICAgYWNjZXB0X3JlYyAqYWNjZXB0X3JlY3M7Ci0gICAgY29uc3QgY2hhciAqZW5jID0gdmFyaWFudC0+Y29udGVudF9lbmNvZGluZzsKLSAgICBhY2NlcHRfcmVjICpzdGFyID0gTlVMTDsKLSAgICBmbG9hdCB2YWx1ZV9pZl9ub3RfZm91bmQgPSAwLjBmOwotICAgIGludCBpOwotCi0gICAgaWYgKCFuZWctPmFjY2VwdF9lbmNvZGluZ3MpIHsKLSAgICAgICAgLyogV2UgaGFkIG5vIEFjY2VwdC1FbmNvZGluZyBoZWFkZXIsIGFzc3VtZSB0aGF0IGFsbAotICAgICAgICAgKiBlbmNvZGluZ3MgYXJlIGFjY2VwdGFibGUgd2l0aCBhIGxvdyBxdWFsaXR5LAotICAgICAgICAgKiBidXQgd2UgcHJlZmVyIG5vIGVuY29kaW5nIGlmIGF2YWlsYWJsZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICghZW5jIHx8IGlzX2lkZW50aXR5X2VuY29kaW5nKGVuYykpCi0gICAgICAgICAgICB2YXJpYW50LT5lbmNvZGluZ19xdWFsaXR5ID0gMS4wZjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdmFyaWFudC0+ZW5jb2RpbmdfcXVhbGl0eSA9IDAuNWY7Ci0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghZW5jIHx8IGlzX2lkZW50aXR5X2VuY29kaW5nKGVuYykpIHsKLSAgICAgICAgZW5jID0gImlkZW50aXR5IjsKLSAgICAgICAgdmFsdWVfaWZfbm90X2ZvdW5kID0gMC4wMDAxZjsKLSAgICB9Ci0KLSAgICBhY2NlcHRfcmVjcyA9IChhY2NlcHRfcmVjICopIG5lZy0+YWNjZXB0X2VuY29kaW5ncy0+ZWx0czsKLQotICAgIC8qIEdvIHRocm91Z2ggZWFjaCBvZiB0aGUgZW5jb2RpbmdzIG9uIHRoZSBBY2NlcHQtRW5jb2Rpbmc6IGhlYWRlciwKLSAgICAgKiBsb29raW5nIGZvciBhIG1hdGNoIHdpdGggb3VyIGVuY29kaW5nLiB4LSBwcmVmaXhlcyBhcmUgaWdub3JlZC4KLSAgICAgKi8KLSAgICBpZiAoZW5jWzBdID09ICd4JyAmJiBlbmNbMV0gPT0gJy0nKSB7Ci0gICAgICAgIGVuYyArPSAyOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbmVnLT5hY2NlcHRfZW5jb2RpbmdzLT5uZWx0czsgKytpKSB7Ci0KLSAgICAgICAgY2hhciAqbmFtZSA9IGFjY2VwdF9yZWNzW2ldLm5hbWU7Ci0KLSAgICAgICAgaWYgKG5hbWVbMF0gPT0gJ3gnICYmIG5hbWVbMV0gPT0gJy0nKSB7Ci0gICAgICAgICAgICBuYW1lICs9IDI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCBlbmMpKSB7Ci0gICAgICAgICAgICB2YXJpYW50LT5lbmNvZGluZ19xdWFsaXR5ID0gYWNjZXB0X3JlY3NbaV0ucXVhbGl0eTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdHJjbXAobmFtZSwgIioiKSA9PSAwKSB7Ci0gICAgICAgICAgICBzdGFyID0gJmFjY2VwdF9yZWNzW2ldOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgLyogTm8gZXhwbGljaXQgbWF0Y2ggKi8KLSAgICBpZiAoc3RhcikgewotICAgICAgICB2YXJpYW50LT5lbmNvZGluZ19xdWFsaXR5ID0gc3Rhci0+cXVhbGl0eTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIEVuY29kaW5nIG5vdCBmb3VuZCBvbiBBY2NlcHQtRW5jb2Rpbmc6IGhlYWRlciwgc28gaXQgaXMKLSAgICAgKiBfbm90XyBhY2NlcHRhYmxlIHVubGVzcyBpdCBpcyB0aGUgaWRlbnRpdHkgKG5vIGVuY29kaW5nKQotICAgICAqLwotICAgIHZhcmlhbnQtPmVuY29kaW5nX3F1YWxpdHkgPSB2YWx1ZV9pZl9ub3RfZm91bmQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogUG9zc2libGUgcmVzdWx0cyBvZiB0aGUgdmFyaWFudCBzZWxlY3Rpb24gYWxnb3JpdGhtIAotICovCi1lbnVtIGFsZ29yaXRobV9yZXN1bHRzIHsKLSAgICBhbGdfY2hvaWNlID0gMSwgICAgICAgICAgICAgIC8qIGNob29zZSB2YXJpYW50ICovCi0gICAgYWxnX2xpc3QgICAgICAgICAgICAgICAgICAgICAvKiBsaXN0IHZhcmlhbnRzICovCi19OwotCi0vKiBCZWxvdyBpcyB0aGUgJ2Jlc3RfbWF0Y2gnIGZ1bmN0aW9uLiBJdCByZXR1cm5zIGFuIGludCwgd2hpY2ggaGFzCi0gKiBvbmUgb2YgdGhlIHR3byB2YWx1ZXMgYWxnX2Nob2ljZSBvciBhbGdfbGlzdCwgd2hpY2ggZ2l2ZSB0aGUgcmVzdWx0Ci0gKiBvZiB0aGUgdmFyaWFudCBzZWxlY3Rpb24gYWxnb3JpdGhtLiAgYWxnX2xpc3QgbWVhbnMgdGhhdCBubyBiZXN0Ci0gKiB2YXJpYW50IHdhcyBmb3VuZCBieSB0aGUgYWxnb3JpdGhtLCBhbGdfY2hvaWNlIG1lYW5zIHRoYXQgYSBiZXN0Ci0gKiB2YXJpYW50IHdhcyBmb3VuZCBhbmQgc2hvdWxkIGJlIHJldHVybmVkLiAgVGhlIGxpc3QvY2hvaWNlCi0gKiB0ZXJtaW5vbG9neSBjb21lcyBmcm9tIFRDTiAocmZjMjI5NSksIGJ1dCBpcyB1c2VkIGluIGEgbW9yZSBnZW5lcmljCi0gKiB3YXkgaGVyZS4gIFRoZSBiZXN0IHZhcmlhbnQgaXMgcmV0dXJuZWQgaW4gKnBiZXN0LiBiZXN0X21hdGNoIGhhcwotICogdHdvIHBvc3NpYmxlIGFsZ29yaXRobXMgZm9yIGRldGVybWluaW5nIHRoZSBiZXN0IHZhcmlhbnQ6IHRoZQotICogUlZTQS8xLjAgYWxnb3JpdGhtIChmcm9tIFJGQzIyOTYpLCBhbmQgdGhlIHN0YW5kYXJkIEFwYWNoZQotICogYWxnb3JpdGhtLiBUaGVzZSBhcmUgc3BsaXQgb3V0IGludG8gc2VwYXJhdGUgZnVuY3Rpb25zCi0gKiAoaXNfdmFyaWFudF9iZXR0ZXJfcnZzYSgpIGFuZCBpc192YXJpYW50X2JldHRlcigpKS4gIFNlbGVjdGlvbiBvZgotICogb25lIGlzIHRocm91Z2ggdGhlIG5lZy0+dXNlX3J2c2EgZmxhZy4KLSAqCi0gKiBUaGUgY2FsbCB0byBiZXN0X21hdGNoIGFsc28gY3JlYXRlcyBmdWxsIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcKLSAqIGxhbmd1YWdlLCBjaGFyc2V0LCBldGMgcXVhbGl0eSBmb3IgX2V2ZXJ5XyB2YXJpYW50LiBUaGlzIGlzIG5lZWRlZAotICogZm9yIGdlbmVyYXRpbmcgYSBjb3JyZWN0IFZhcnkgaGVhZGVyLCBhbmQgY2FuIGJlIHVzZWQgZm9yIHRoZQotICogQWx0ZXJuYXRlcyBoZWFkZXIsIHRoZSBodW1hbi1yZWFkYWJsZSBsaXN0IHJlc3BvbnNlcyBhbmQgNDA2IGVycm9ycy4KLSAqLwotCi0vKiBGaXJzdGx5LCB0aGUgUlZTQS8xLjAgKEhUVFAgUmVtb3RlIFZhcmlhbnQgU2VsZWN0aW9uIEFsZ29yaXRobQotICogdjEuMCkgZnJvbSByZmMyMjk2LiAgVGhpcyBpcyB0aGUgYWxnb3JpdGhtIHRoYXQgZ29lcyB0b2dldGhlciB3aXRoCi0gKiB0cmFuc3BhcmVudCBjb250ZW50IG5lZ290aWF0aW9uIChUQ04pLgotICovCi1zdGF0aWMgaW50IGlzX3ZhcmlhbnRfYmV0dGVyX3J2c2EobmVnb3RpYXRpb25fc3RhdGUgKm5lZywgdmFyX3JlYyAqdmFyaWFudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfcmVjICpiZXN0LCBmbG9hdCAqcF9iZXN0cSkKLXsKLSAgICBmbG9hdCBiZXN0cSA9ICpwX2Jlc3RxLCBxOwotCi0gICAgLyogVENOIGRvZXMgbm90IGNvdmVyIG5lZ290aWF0aW9uIG9uIGNvbnRlbnQtZW5jb2RpbmcuICBGb3Igbm93LAotICAgICAqIHdlIGlnbm9yZSB0aGUgZW5jb2RpbmcgdW5sZXNzIGl0IHdhcyBleHBsaWNpdGx5IGV4Y2x1ZGVkLgotICAgICAqLwotICAgIGlmICh2YXJpYW50LT5lbmNvZGluZ19xdWFsaXR5ID09IDAuMGYpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIHEgPSB2YXJpYW50LT5taW1lX3R5cGVfcXVhbGl0eSAqCi0gICAgICAgIHZhcmlhbnQtPnNvdXJjZV9xdWFsaXR5ICoKLSAgICAgICAgdmFyaWFudC0+Y2hhcnNldF9xdWFsaXR5ICoKLSAgICAgICAgdmFyaWFudC0+bGFuZ19xdWFsaXR5OwotCi0gICAvKiBSRkMgMjI5NiBjYWxscyBmb3IgdGhlIHJlc3VsdCB0byBiZSByb3VuZGVkIHRvIDUgZGVjaW1hbCBwbGFjZXMsCi0gICAgKiBidXQgd2UgZG9uJ3QgZG8gdGhhdCBiZWNhdXNlIGl0IHNlcnZlcyBubyB1c2VmdWwgcHVycG9zZSBvdGhlcgotICAgICogdGhhbiB0byBlbnN1cmUgdGhhdCBhIHJlbW90ZSBhbGdvcml0aG0gb3BlcmF0ZXMgb24gdGhlIHNhbWUKLSAgICAqIHByZWNpc2lvbiBhcyBvdXJzLiAgVGhhdCBpcyBzaWxseSwgc2luY2Ugd2hhdCB3ZSBvYnZpb3VzbHkgd2FudAotICAgICogaXMgZm9yIHRoZSBhbGdvcml0aG0gdG8gb3BlcmF0ZSBvbiB0aGUgYmVzdCBhdmFpbGFibGUgcHJlY2lzaW9uCi0gICAgKiByZWdhcmRsZXNzIG9mIHdobyBydW5zIGl0LiAgU2luY2UgdGhlIGFib3ZlIGNhbGN1bGF0aW9uIG1heQotICAgICogcmVzdWx0IGluIHNpZ25pZmljYW50IHZhcmlhbmNlIGF0IDFlLTEyLCByb3VuZGluZyB3b3VsZCBiZSBib2d1cy4KLSAgICAqLwotCi0jaWZkZWYgTkVHX0RFQlVHCi0gICAgZnByaW50ZihzdGRlcnIsICJWYXJpYW50OiBmaWxlPSVzIHR5cGU9JXMgbGFuZz0lcyBzb3VyY2VxPSUxLjNmICIKLSAgICAgICAgICAgIm1pbWVxPSUxLjNmIGxhbmdxPSUxLjNmIGNoYXJxPSUxLjNmIGVuY3E9JTEuM2YgIgotICAgICAgICAgICAicT0lMS41ZiBkZWZpbml0ZT0lZFxuIiwgICAgICAgICAgICAKLSAgICAgICAgICAgICh2YXJpYW50LT5maWxlX25hbWUgPyB2YXJpYW50LT5maWxlX25hbWUgOiAiIiksCi0gICAgICAgICAgICAodmFyaWFudC0+bWltZV90eXBlID8gdmFyaWFudC0+bWltZV90eXBlIDogIiIpLAotICAgICAgICAgICAgKHZhcmlhbnQtPmNvbnRlbnRfbGFuZ3VhZ2VzCi0gICAgICAgICAgICAgPyBhcF9hcnJheV9wc3RyY2F0KG5lZy0+cG9vbCwgdmFyaWFudC0+Y29udGVudF9sYW5ndWFnZXMsICcsJykKLSAgICAgICAgICAgICA6ICIiKSwKLSAgICAgICAgICAgIHZhcmlhbnQtPnNvdXJjZV9xdWFsaXR5LAotICAgICAgICAgICAgdmFyaWFudC0+bWltZV90eXBlX3F1YWxpdHksCi0gICAgICAgICAgICB2YXJpYW50LT5sYW5nX3F1YWxpdHksCi0gICAgICAgICAgICB2YXJpYW50LT5jaGFyc2V0X3F1YWxpdHksCi0gICAgICAgICAgICB2YXJpYW50LT5lbmNvZGluZ19xdWFsaXR5LAotICAgICAgICAgICAgcSwKLSAgICAgICAgICAgIHZhcmlhbnQtPmRlZmluaXRlKTsKLSNlbmRpZgotCi0gICAgaWYgKHEgPD0gMC4wZikgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHEgPiBiZXN0cSkgewotICAgICAgICAqcF9iZXN0cSA9IHE7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpZiAocSA9PSBiZXN0cSkgewotICAgICAgICAvKiBJZiB0aGUgYmVzdCB2YXJpYW50J3MgZW5jb2RpbmcgaXMgb2YgbGVzc2VyIHF1YWxpdHkgdGhhbgotICAgICAgICAgKiB0aGlzIHZhcmlhbnQsIHRoZW4gd2UgcHJlZmVyIHRoaXMgdmFyaWFudAotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHZhcmlhbnQtPmVuY29kaW5nX3F1YWxpdHkgPiBiZXN0LT5lbmNvZGluZ19xdWFsaXR5KSB7Ci0gICAgICAgICAgICAqcF9iZXN0cSA9IHE7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyogTmVnb3RpYXRpb24gYWxnb3JpdGhtIGFzIHVzZWQgYnkgcHJldmlvdXMgdmVyc2lvbnMgb2YgQXBhY2hlCi0gKiAoanVzdCBhYm91dCkuIAotICovCi0KLXN0YXRpYyBpbnQgaXNfdmFyaWFudF9iZXR0ZXIobmVnb3RpYXRpb25fc3RhdGUgKm5lZywgdmFyX3JlYyAqdmFyaWFudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX3JlYyAqYmVzdCwgZmxvYXQgKnBfYmVzdHEpCi17Ci0gICAgZmxvYXQgYmVzdHEgPSAqcF9iZXN0cSwgcTsKLSAgICBpbnQgbGV2Y21wOwotCi0gICAgLyogRm9yIG5vbi10cmFuc3BhcmVudCBuZWdvdGlhdGlvbiwgc2VydmVyIGNhbiBjaG9vc2UgaG93Ci0gICAgICogdG8gaGFuZGxlIHRoZSBuZWdvdGlhdGlvbi4gV2UnbGwgdXNlIHRoZSBmb2xsb3dpbmcgaW4KLSAgICAgKiBvcmRlcjogY29udGVudC10eXBlLCBsYW5ndWFnZSwgY29udGVudC10eXBlIGxldmVsLCBjaGFyc2V0LAotICAgICAqIGNvbnRlbnQgZW5jb2RpbmcsIGNvbnRlbnQgbGVuZ3RoLgotICAgICAqCi0gICAgICogRm9yIGVhY2ggY2hlY2ssIHdlIGhhdmUgdGhyZWUgcG9zc2libGUgb3V0Y29tZXM6Ci0gICAgICogICBUaGlzIHZhcmlhbnQgaXMgd29yc2UgdGhhbiBjdXJyZW50IGJlc3Q6IHJldHVybiAwCi0gICAgICogICBUaGlzIHZhcmlhbnQgaXMgYmV0dGVyIHRoYW4gdGhlIGN1cnJlbnQgYmVzdDoKLSAgICAgKiAgICAgICAgICBhc3NpZ24gdGhpcyB2YXJpYW50J3MgcSB0byAqcF9iZXN0cSwgYW5kIHJldHVybiAxCi0gICAgICogICBUaGlzIHZhcmlhbnQgaXMganVzdCBhcyBkZXNpcmFibGUgYXMgdGhlIGN1cnJlbnQgYmVzdDoKLSAgICAgKiAgICAgICAgICBkcm9wIHRocm91Z2ggdG8gdGhlIG5leHQgdGVzdC4KLSAgICAgKgotICAgICAqIFRoaXMgY29kZSBpcyB3cml0dGVuIGluIHRoaXMgbG9uZy13aW5kZWQgd2F5IHRvIGFsbG93IGZ1dHVyZQotICAgICAqIGN1c3RvbWlzYXRpb24sIGVpdGhlciBieSB0aGUgYWRkaXRpb24gb2YgYWRkaXRpb25hbAotICAgICAqIGNoZWNrcywgb3IgdG8gYWxsb3cgdGhlIG9yZGVyIG9mIHRoZSBjaGVja3MgdG8gYmUgZGV0ZXJtaW5lZAotICAgICAqIGJ5IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAoZS5nLiB3ZSBtaWdodCBwcmVmZXIgdG8gY2hlY2sKLSAgICAgKiBsYW5ndWFnZSBxdWFsaXR5IF9iZWZvcmVfIGNvbnRlbnQgdHlwZSkuCi0gICAgICovCi0KLSAgICAvKiBGaXJzdCB0aG91Z2gsIGVsaW1pbmF0ZSB0aGlzIHZhcmlhbnQgaWYgaXQgaXMgbm90Ci0gICAgICogYWNjZXB0YWJsZSBieSB0eXBlLCBjaGFyc2V0LCBlbmNvZGluZyBvciBsYW5ndWFnZS4KLSAgICAgKi8KLQotI2lmZGVmIE5FR19ERUJVRwotICAgIGZwcmludGYoc3RkZXJyLCAiVmFyaWFudDogZmlsZT0lcyB0eXBlPSVzIGxhbmc9JXMgc291cmNlcT0lMS4zZiAiCi0gICAgICAgICAgICJtaW1lcT0lMS4zZiBsYW5ncT0lMS4zZiBsYW5naWR4PSVkIGNoYXJxPSUxLjNmIGVuY3E9JTEuM2YgXG4iLAotICAgICAgICAgICAgKHZhcmlhbnQtPmZpbGVfbmFtZSA/IHZhcmlhbnQtPmZpbGVfbmFtZSA6ICIiKSwKLSAgICAgICAgICAgICh2YXJpYW50LT5taW1lX3R5cGUgPyB2YXJpYW50LT5taW1lX3R5cGUgOiAiIiksCi0gICAgICAgICAgICAodmFyaWFudC0+Y29udGVudF9sYW5ndWFnZXMKLSAgICAgICAgICAgICA/IGFwX2FycmF5X3BzdHJjYXQobmVnLT5wb29sLCB2YXJpYW50LT5jb250ZW50X2xhbmd1YWdlcywgJywnKQotICAgICAgICAgICAgIDogIiIpLAotICAgICAgICAgICAgdmFyaWFudC0+c291cmNlX3F1YWxpdHksCi0gICAgICAgICAgICB2YXJpYW50LT5taW1lX3R5cGVfcXVhbGl0eSwKLSAgICAgICAgICAgIHZhcmlhbnQtPmxhbmdfcXVhbGl0eSwKLSAgICAgICAgICAgIHZhcmlhbnQtPmxhbmdfaW5kZXgsCi0gICAgICAgICAgICB2YXJpYW50LT5jaGFyc2V0X3F1YWxpdHksCi0gICAgICAgICAgICB2YXJpYW50LT5lbmNvZGluZ19xdWFsaXR5KTsKLSNlbmRpZgotCi0gICAgaWYgKHZhcmlhbnQtPmVuY29kaW5nX3F1YWxpdHkgPT0gMC4wZiB8fAotICAgICAgICB2YXJpYW50LT5sYW5nX3F1YWxpdHkgPT0gMC4wZiB8fAotICAgICAgICB2YXJpYW50LT5zb3VyY2VfcXVhbGl0eSA9PSAwLjBmIHx8Ci0gICAgICAgIHZhcmlhbnQtPmNoYXJzZXRfcXVhbGl0eSA9PSAwLjBmIHx8Ci0gICAgICAgIHZhcmlhbnQtPm1pbWVfdHlwZV9xdWFsaXR5ID09IDAuMGYpIHsKLSAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgLyogZG9uJ3QgY29uc2lkZXIgdW5hY2NlcHRhYmxlcyAqLwotICAgIH0KLQotICAgIHEgPSB2YXJpYW50LT5taW1lX3R5cGVfcXVhbGl0eSAqIHZhcmlhbnQtPnNvdXJjZV9xdWFsaXR5OwotICAgIGlmIChxID09IDAuMCB8fCBxIDwgYmVzdHEpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChxID4gYmVzdHEgfHwgIWJlc3QpIHsKLSAgICAgICAgKnBfYmVzdHEgPSBxOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiBsYW5ndWFnZSAqLwotICAgIGlmICh2YXJpYW50LT5sYW5nX3F1YWxpdHkgPCBiZXN0LT5sYW5nX3F1YWxpdHkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmICh2YXJpYW50LT5sYW5nX3F1YWxpdHkgPiBiZXN0LT5sYW5nX3F1YWxpdHkpIHsKLSAgICAgICAgKnBfYmVzdHEgPSBxOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiBpZiBsYW5ndWFnZSBxdWFsaXRpZXMgd2VyZSBlcXVhbCwgdHJ5IHRoZSBMYW5ndWFnZVByaW9yaXR5IHN0dWZmICovCi0gICAgaWYgKGJlc3QtPmxhbmdfaW5kZXggIT0gLTEgJiYKLSAgICAgICAgKHZhcmlhbnQtPmxhbmdfaW5kZXggPT0gLTEgfHwgdmFyaWFudC0+bGFuZ19pbmRleCA+IGJlc3QtPmxhbmdfaW5kZXgpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAodmFyaWFudC0+bGFuZ19pbmRleCAhPSAtMSAmJgotICAgICAgICAoYmVzdC0+bGFuZ19pbmRleCA9PSAtMSB8fCB2YXJpYW50LT5sYW5nX2luZGV4IDwgYmVzdC0+bGFuZ19pbmRleCkpIHsKLSAgICAgICAgKnBfYmVzdHEgPSBxOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiBjb250ZW50LXR5cGUgbGV2ZWwgKHNvbWV0aW1lcyB1c2VkIHdpdGggdGV4dC9odG1sLCB0aG91Z2ggd2UKLSAgICAgKiBzdXBwb3J0IGl0IG9uIG90aGVyIHR5cGVzIHRvbykKLSAgICAgKi8KLSAgICBsZXZjbXAgPSBsZXZlbF9jbXAodmFyaWFudCwgYmVzdCk7Ci0gICAgaWYgKGxldmNtcCA9PSAtMSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGxldmNtcCA9PSAxKSB7Ci0gICAgICAgICpwX2Jlc3RxID0gcTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLyogY2hhcnNldCAqLwotICAgIGlmICh2YXJpYW50LT5jaGFyc2V0X3F1YWxpdHkgPCBiZXN0LT5jaGFyc2V0X3F1YWxpdHkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIC8qIElmIHRoZSBiZXN0IHZhcmlhbnQncyBjaGFyc2V0IGlzIElTTy04ODU5LTEgYW5kIHRoaXMgdmFyaWFudCBoYXMKLSAgICAgKiB0aGUgc2FtZSBjaGFyc2V0IHF1YWxpdHksIHRoZW4gd2UgcHJlZmVyIHRoaXMgdmFyaWFudAotICAgICAqLwotCi0gICAgaWYgKHZhcmlhbnQtPmNoYXJzZXRfcXVhbGl0eSA+IGJlc3QtPmNoYXJzZXRfcXVhbGl0eSB8fAotICAgICAgICAoKHZhcmlhbnQtPmNvbnRlbnRfY2hhcnNldCAhPSBOVUxMICYmCi0gICAgICAgICAgKnZhcmlhbnQtPmNvbnRlbnRfY2hhcnNldCAhPSAnXDAnICYmCi0gICAgICAgICAgc3RyY21wKHZhcmlhbnQtPmNvbnRlbnRfY2hhcnNldCwgImlzby04ODU5LTEiKSAhPSAwKSAmJgotICAgICAgICAgKGJlc3QtPmNvbnRlbnRfY2hhcnNldCA9PSBOVUxMIHx8Ci0gICAgICAgICAgKmJlc3QtPmNvbnRlbnRfY2hhcnNldCA9PSAnXDAnIHx8Ci0gICAgICAgICAgc3RyY21wKGJlc3QtPmNvbnRlbnRfY2hhcnNldCwgImlzby04ODU5LTEiKSA9PSAwKSkpIHsKLSAgICAgICAgKnBfYmVzdHEgPSBxOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiBQcmVmZXIgdGhlIGhpZ2hlc3QgdmFsdWUgZm9yIGVuY29kaW5nX3F1YWxpdHkuCi0gICAgICovCi0gICAgaWYgKHZhcmlhbnQtPmVuY29kaW5nX3F1YWxpdHkgPCBiZXN0LT5lbmNvZGluZ19xdWFsaXR5KSB7Ci0gICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmICh2YXJpYW50LT5lbmNvZGluZ19xdWFsaXR5ID4gYmVzdC0+ZW5jb2RpbmdfcXVhbGl0eSkgewotICAgICAgICpwX2Jlc3RxID0gcTsKLSAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiBjb250ZW50IGxlbmd0aCBpZiBhbGwgZWxzZSBlcXVhbCAqLwotICAgIGlmIChmaW5kX2NvbnRlbnRfbGVuZ3RoKG5lZywgdmFyaWFudCkgPj0gZmluZF9jb250ZW50X2xlbmd0aChuZWcsIGJlc3QpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIG9rLCB0byBnZXQgaGVyZSBtZWFucyBldmVyeSB0aGluZyB0dXJuZWQgb3V0IGVxdWFsLCBleGNlcHQKLSAgICAgKiB3ZSBoYXZlIGEgc2hvcnRlciBjb250ZW50IGxlbmd0aCwgc28gdXNlIHRoaXMgdmFyaWFudAotICAgICAqLwotICAgICpwX2Jlc3RxID0gcTsKLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBiZXN0X21hdGNoKG5lZ290aWF0aW9uX3N0YXRlICpuZWcsIHZhcl9yZWMgKipwYmVzdCkKLXsKLSAgICBpbnQgajsKLSAgICB2YXJfcmVjICpiZXN0ID0gTlVMTDsKLSAgICBmbG9hdCBiZXN0cSA9IDAuMGY7Ci0gICAgZW51bSBhbGdvcml0aG1fcmVzdWx0cyBhbGdvcml0aG1fcmVzdWx0OwotCi0gICAgdmFyX3JlYyAqYXZhaWxfcmVjcyA9ICh2YXJfcmVjICopIG5lZy0+YXZhaWxfdmFycy0+ZWx0czsKLQotICAgIHNldF9kZWZhdWx0X2xhbmdfcXVhbGl0eShuZWcpOwotCi0gICAgLyoKLSAgICAgKiBGaW5kIHRoZSAnYmVzdCcgdmFyaWFudCAKLSAgICAgKi8KLQotICAgIGZvciAoaiA9IDA7IGogPCBuZWctPmF2YWlsX3ZhcnMtPm5lbHRzOyArK2opIHsKLSAgICAgICAgdmFyX3JlYyAqdmFyaWFudCA9ICZhdmFpbF9yZWNzW2pdOwotCi0gICAgICAgIC8qIEZpbmQgYWxsIHRoZSByZWxldmFudCAncXVhbGl0eScgdmFsdWVzIGZyb20gdGhlCi0gICAgICAgICAqIEFjY2VwdC4uLiBoZWFkZXJzLCBhbmQgc3RvcmUgaW4gdGhlIHZhcmlhbnQuICBUaGlzIGFsc28KLSAgICAgICAgICogcHJlcGFyZXMgZm9yIHNlbmRpbmcgYW4gQWx0ZXJuYXRlcyBoZWFkZXIgZXRjIHNvIHdlIG5lZWQgdG8KLSAgICAgICAgICogZG8gaXQgZXZlbiBpZiB3ZSBkbyBub3QgYWN0dWFsbHkgcGxhbiB0byBmaW5kIGEgYmVzdAotICAgICAgICAgKiB2YXJpYW50LiAgCi0gICAgICAgICAqLwotICAgICAgICBzZXRfYWNjZXB0X3F1YWxpdHkobmVnLCB2YXJpYW50KTsKLSAgICAgICAgc2V0X2xhbmd1YWdlX3F1YWxpdHkobmVnLCB2YXJpYW50KTsKLSAgICAgICAgc2V0X2VuY29kaW5nX3F1YWxpdHkobmVnLCB2YXJpYW50KTsKLSAgICAgICAgc2V0X2NoYXJzZXRfcXVhbGl0eShuZWcsIHZhcmlhbnQpOwotCi0gICAgICAgIC8qIE9ubHkgZG8gdmFyaWFudCBzZWxlY3Rpb24gaWYgd2UgbWF5IGFjdHVhbGx5IGNob29zZSBhCi0gICAgICAgICAqIHZhcmlhbnQgZm9yIHRoZSBjbGllbnQgCi0gICAgICAgICAqLwotICAgICAgICBpZiAobmVnLT5tYXlfY2hvb3NlKSB7Ci0KLSAgICAgICAgICAgIC8qIE5vdyBmaW5kIG91dCBpZiB0aGlzIHZhcmlhbnQgaXMgYmV0dGVyIHRoYW4gdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAqIGJlc3QsIGVpdGhlciB1c2luZyB0aGUgUlZTQS8xLjAgYWxnb3JpdGhtLCBvciBBcGFjaGUncwotICAgICAgICAgICAgICogaW50ZXJuYWwgc2VydmVyLWRyaXZlbiBhbGdvcml0aG0uIFByZXN1bWFibHkgb3RoZXIKLSAgICAgICAgICAgICAqIHNlcnZlci1kcml2ZW4gYWxnb3JpdGhtcyBhcmUgcG9zc2libGUsIGFuZCBjb3VsZCBiZQotICAgICAgICAgICAgICogaW1wbGVtZW50ZWQgaGVyZS4KLSAgICAgICAgICAgICAqLwotICAgICAKLSAgICAgICAgICAgIGlmIChuZWctPnVzZV9ydnNhKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzX3ZhcmlhbnRfYmV0dGVyX3J2c2EobmVnLCB2YXJpYW50LCBiZXN0LCAmYmVzdHEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3QgPSB2YXJpYW50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChpc192YXJpYW50X2JldHRlcihuZWcsIHZhcmlhbnQsIGJlc3QsICZiZXN0cSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYmVzdCA9IHZhcmlhbnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogV2Ugbm93IGVpdGhlciBoYXZlIGEgYmVzdCB2YXJpYW50LCBvciBubyBiZXN0IHZhcmlhbnQgKi8KLQotICAgIGlmIChuZWctPnVzZV9ydnNhKSAgICB7Ci0gICAgICAgIC8qIGNhbGN1bGF0ZSByZXN1bHQgZm9yIFJWU0EvMS4wIGFsZ29yaXRobToKLSAgICAgICAgICogb25seSBhIGNob2ljZSByZXNwb25zZSBpZiB0aGUgYmVzdCB2YXJpYW50IGhhcyBxPjAKLSAgICAgICAgICogYW5kIGlzIGRlZmluaXRlCi0gICAgICAgICAqLwotICAgICAgICBhbGdvcml0aG1fcmVzdWx0ID0gKGJlc3QgJiYgYmVzdC0+ZGVmaW5pdGUpICYmIChiZXN0cSA+IDApID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ19jaG9pY2UgOiBhbGdfbGlzdDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIGNhbGN1bGF0ZSByZXN1bHQgZm9yIEFwYWNoZSBuZWdvdGlhdGlvbiBhbGdvcml0aG0gKi8KLSAgICAgICAgYWxnb3JpdGhtX3Jlc3VsdCA9IGJlc3RxID4gMCA/IGFsZ19jaG9pY2UgOiBhbGdfbGlzdDsgICAgICAgIAotICAgIH0KLQotICAgIC8qIFJldHVybmluZyBhIGNob2ljZSByZXNwb25zZSB3aXRoIGEgbm9uLW5laWdoYm9yaW5nIHZhcmlhbnQgaXMgYQotICAgICAqIHByb3RvY29sIHNlY3VyaXR5IGVycm9yIGluIFRDTiAoc2VlIHJmYzIyOTUpLiAgV2UgZG8gKm5vdCoKLSAgICAgKiB2ZXJpZnkgaGVyZSB0aGF0IHRoZSB2YXJpYW50IGFuZCBVUkkgYXJlIG5laWdoYm9ycywgZXZlbiB0aG91Z2gKLSAgICAgKiB3ZSBtYXkgcmV0dXJuIGFsZ19jaG9pY2UuICBXZSBkZXBlbmQgb24gdGhlIGVudmlyb25tZW50ICh0aGUKLSAgICAgKiBjYWxsZXIpIHRvIG9ubHkgZGVjbGFyZSB0aGUgcmVzb3VyY2UgdHJhbnNwYXJlbnRseSBuZWdvdGlhYmxlIGlmCi0gICAgICogYWxsIHZhcmlhbnRzIGFyZSBuZWlnaGJvcnMuCi0gICAgICovCi0gICAgKnBiZXN0ID0gYmVzdDsKLSAgICByZXR1cm4gYWxnb3JpdGhtX3Jlc3VsdDsKLX0KLQotLyogU2V0cyByZXNwb25zZSBoZWFkZXJzIGZvciBhIG5lZ290aWF0ZWQgcmVzcG9uc2UuCi0gKiBuZWctPmlzX3RyYW5zcGFyZW50IGRldGVybWluZXMgd2hldGhlciBhIHRyYW5zcGFyZW50bHkgbmVnb3RpYXRlZAotICogcmVzcG9uc2Ugb3IgYSBwbGFpbiBgc2VydmVyIGRyaXZlbiBuZWdvdGlhdGlvbicgcmVzcG9uc2UgaXMKLSAqIGNyZWF0ZWQuICAgQXBwbGljYWJsZSBoZWFkZXJzIGFyZSBBbHRlcm5hdGVzLCBWYXJ5LCBhbmQgVENOLgotICoKLSAqIFRoZSBWYXJ5IGhlYWRlciB3ZSBjcmVhdGUgaXMgc29tZXRpbWVzIGxvbmdlciB0aGFuIGlzIHJlcXVpcmVkIGZvcgotICogdGhlIGNvcnJlY3QgY2FjaGluZyBvZiBuZWdvdGlhdGVkIHJlc3VsdHMgYnkgSFRUUC8xLjEgY2FjaGVzLiAgRm9yCi0gKiBleGFtcGxlIGlmIHdlIGhhdmUgMyB2YXJpYW50cyB4Lmh0bWwsIHgucHMuZW4gYW5kIHgucHMubmwsIGFuZCBpZgotICogdGhlIEFjY2VwdDogaGVhZGVyIGFzc2lnbnMgYSAwIHF1YWxpdHkgdG8gLnBzLCB0aGVuIHRoZSByZXN1bHRzIG9mCi0gKiB0aGUgdHdvIHNlcnZlci1zaWRlIG5lZ290aWF0aW9uIGFsZ29yaXRobXMgd2UgY3VycmVudGx5IGltcGxlbWVudAotICogd2lsbCBuZXZlciBkZXBlbmQgb24gQWNjZXB0LUxhbmd1YWdlIHNvIHdlIGNvdWxkIHJldHVybiBgVmFyeToKLSAqIG5lZ290aWF0ZSwgYWNjZXB0JyBpbnN0ZWFkIG9mIHRoZSBsb25nZXIgJ1Zhcnk6IG5lZ290aWF0ZSwgYWNjZXB0LAotICogYWNjZXB0LWxhbmd1YWdlJyB3aGljaCB0aGUgY29kZSBiZWxvdyB3aWxsIHJldHVybi4gIEEgcm91dGluZSBmb3IKLSAqIGNvbXB1dGluZyB0aGUgZXhhY3QgbWluaW1hbCBWYXJ5IGhlYWRlciB3b3VsZCBiZSBhIGh1Z2UgcGFpbiB0byBjb2RlCi0gKiBhbmQgbWFpbnRhaW4gdGhvdWdoLCBlc3BlY2lhbGx5IGJlY2F1c2Ugd2UgbmVlZCB0byB0YWtlIGFsbCBwb3NzaWJsZQotICogdHdpZGRsZXMgaW4gdGhlIHNlcnZlci1zaWRlIG5lZ290aWF0aW9uIGFsZ29yaXRobXMgaW50byBhY2NvdW50LgotICovCi1zdGF0aWMgdm9pZCBzZXRfbmVnX2hlYWRlcnMocmVxdWVzdF9yZWMgKnIsIG5lZ290aWF0aW9uX3N0YXRlICpuZWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsZ19yZXN1bHQpCi17Ci0gICAgdGFibGUgKmhkcnM7Ci0gICAgdmFyX3JlYyAqYXZhaWxfcmVjcyA9ICh2YXJfcmVjICopIG5lZy0+YXZhaWxfdmFycy0+ZWx0czsKLSAgICBjb25zdCBjaGFyICpzYW1wbGVfdHlwZSA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciAqc2FtcGxlX2xhbmd1YWdlID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICpzYW1wbGVfZW5jb2RpbmcgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKnNhbXBsZV9jaGFyc2V0ID0gTlVMTDsKLSAgICBjaGFyICpsYW5nOwotICAgIGNoYXIgKnFzdHI7Ci0gICAgY2hhciAqbGVuc3RyOwotICAgIGxvbmcgbGVuOwotICAgIGFycmF5X2hlYWRlciAqYXJyOwotICAgIGludCBtYXhfdmxpc3RfYXJyYXkgPSAobmVnLT5hdmFpbF92YXJzLT5uZWx0cyAqIDIxKTsKLSAgICBpbnQgZmlyc3RfdmFyaWFudCA9IDE7Ci0gICAgaW50IHZhcnlfYnlfdHlwZSA9IDA7Ci0gICAgaW50IHZhcnlfYnlfbGFuZ3VhZ2UgPSAwOwotICAgIGludCB2YXJ5X2J5X2NoYXJzZXQgPSAwOwotICAgIGludCB2YXJ5X2J5X2VuY29kaW5nID0gMDsKLSAgICBpbnQgajsKLQotICAgIC8qIEluIG9yZGVyIHRvIGF2b2lkIE8obl4yKSBtZW1vcnkgY29waWVzIGluIGJ1aWxkaW5nIEFsdGVybmF0ZXMsCi0gICAgICogd2UgcHJlYWxsb2NhdGUgYSB0YWJsZSB3aXRoIHRoZSBtYXhpbXVtIHN1YnN0cmluZ3MgcG9zc2libGUsCi0gICAgICogZmlsbCBpdCB3aXRoIHRoZSB2YXJpYW50IGxpc3QsIGFuZCB0aGVuIGNvbmNhdGVuYXRlIHRoZSBlbnRpcmUgYXJyYXkuCi0gICAgICogTm90ZSB0aGF0IGlmIHlvdSBjaGFuZ2UgdGhlIG51bWJlciBvZiBzdWJzdHJpbmdzIHB1c2hlZCwgeW91IGFsc28KLSAgICAgKiBuZWVkIHRvIGNoYW5nZSB0aGUgY2FsY3VsYXRpb24gb2YgbWF4X3ZsaXN0X2FycmF5IGFib3ZlLgotICAgICAqLwotICAgIGlmIChuZWctPnNlbmRfYWx0ZXJuYXRlcyAmJiBuZWctPmF2YWlsX3ZhcnMtPm5lbHRzKQotICAgICAgICBhcnIgPSBhcF9tYWtlX2FycmF5KHItPnBvb2wsIG1heF92bGlzdF9hcnJheSwgc2l6ZW9mKGNoYXIgKikpOwotICAgIGVsc2UKLSAgICAgICAgYXJyID0gTlVMTDsKLQotICAgIC8qIFB1dCBoZWFkZXJzIGludG8gZXJyX2hlYWRlcnNfb3V0LCBzaW5jZSBzZW5kX2h0dHBfaGVhZGVyKCkKLSAgICAgKiBvdXRwdXRzIGJvdGggaGVhZGVyc19vdXQgYW5kIGVycl9oZWFkZXJzX291dC4KLSAgICAgKi8KLSAgICBoZHJzID0gci0+ZXJyX2hlYWRlcnNfb3V0OwotCi0gICAgZm9yIChqID0gMDsgaiA8IG5lZy0+YXZhaWxfdmFycy0+bmVsdHM7ICsraikgewotICAgICAgICB2YXJfcmVjICp2YXJpYW50ID0gJmF2YWlsX3JlY3Nbal07Ci0KLSAgICAgICAgaWYgKHZhcmlhbnQtPmNvbnRlbnRfbGFuZ3VhZ2VzICYmIHZhcmlhbnQtPmNvbnRlbnRfbGFuZ3VhZ2VzLT5uZWx0cykgewotICAgICAgICAgICAgbGFuZyA9IGFwX2FycmF5X3BzdHJjYXQoci0+cG9vbCwgdmFyaWFudC0+Y29udGVudF9sYW5ndWFnZXMsICcsJyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBsYW5nID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENhbGN1bGF0ZSBWYXJ5IGJ5IGxvb2tpbmcgZm9yIGFueSBkaWZmZXJlbmNlIGJldHdlZW4gdmFyaWFudHMgKi8KLQotICAgICAgICBpZiAoZmlyc3RfdmFyaWFudCkgewotICAgICAgICAgICAgc2FtcGxlX3R5cGUgICAgID0gdmFyaWFudC0+bWltZV90eXBlOwotICAgICAgICAgICAgc2FtcGxlX2NoYXJzZXQgID0gdmFyaWFudC0+Y29udGVudF9jaGFyc2V0OwotICAgICAgICAgICAgc2FtcGxlX2xhbmd1YWdlID0gbGFuZzsKLSAgICAgICAgICAgIHNhbXBsZV9lbmNvZGluZyA9IHZhcmlhbnQtPmNvbnRlbnRfZW5jb2Rpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIXZhcnlfYnlfdHlwZSAmJgotICAgICAgICAgICAgICAgIHN0cmNtcChzYW1wbGVfdHlwZSA/IHNhbXBsZV90eXBlIDogIiIsIAotICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50LT5taW1lX3R5cGUgPyB2YXJpYW50LT5taW1lX3R5cGUgOiAiIikpIHsKLSAgICAgICAgICAgICAgICB2YXJ5X2J5X3R5cGUgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCF2YXJ5X2J5X2NoYXJzZXQgJiYKLSAgICAgICAgICAgICAgICBzdHJjbXAoc2FtcGxlX2NoYXJzZXQgPyBzYW1wbGVfY2hhcnNldCA6ICIiLAotICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50LT5jb250ZW50X2NoYXJzZXQgPwotICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50LT5jb250ZW50X2NoYXJzZXQgOiAiIikpIHsKLSAgICAgICAgICAgICAgICB2YXJ5X2J5X2NoYXJzZXQgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCF2YXJ5X2J5X2xhbmd1YWdlICYmCi0gICAgICAgICAgICAgICAgc3RyY21wKHNhbXBsZV9sYW5ndWFnZSA/IHNhbXBsZV9sYW5ndWFnZSA6ICIiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgbGFuZyA/IGxhbmcgOiAiIikpIHsKLSAgICAgICAgICAgICAgICB2YXJ5X2J5X2xhbmd1YWdlID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghdmFyeV9ieV9lbmNvZGluZyAmJgotICAgICAgICAgICAgICAgIHN0cmNtcChzYW1wbGVfZW5jb2RpbmcgPyBzYW1wbGVfZW5jb2RpbmcgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudC0+Y29udGVudF9lbmNvZGluZyA/IAotICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50LT5jb250ZW50X2VuY29kaW5nIDogIiIpKSB7Ci0gICAgICAgICAgICAgICAgdmFyeV9ieV9lbmNvZGluZyA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmlyc3RfdmFyaWFudCA9IDA7Ci0KLSAgICAgICAgaWYgKCFuZWctPnNlbmRfYWx0ZXJuYXRlcykKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8qIEdlbmVyYXRlIHRoZSBzdHJpbmcgY29tcG9uZW50cyBmb3IgdGhpcyBBbHRlcm5hdGVzIGVudHJ5ICovCi0KLSAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9ICJ7XCIiOwotICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gdmFyaWFudC0+ZmlsZV9uYW1lOwotICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gIlwiICI7Ci0KLSAgICAgICAgcXN0ciA9IChjaGFyICopIGFwX3BhbGxvYyhyLT5wb29sLCA2KTsKLSAgICAgICAgYXBfc25wcmludGYocXN0ciwgNiwgIiUxLjNmIiwgdmFyaWFudC0+c291cmNlX3F1YWxpdHkpOwotCi0gICAgICAgIC8qIFN0cmlwIHRyYWlsaW5nIHplcm9zIChzYXZlcyB0aG9zZSB2YWx1YWJsZSBuZXR3b3JrIGJ5dGVzKSAqLwotICAgICAgICBpZiAocXN0cls0XSA9PSAnMCcpIHsKLSAgICAgICAgICAgIHFzdHJbNF0gPSAnXDAnOwotICAgICAgICAgICAgaWYgKHFzdHJbM10gPT0gJzAnKSB7Ci0gICAgICAgICAgICAgICAgcXN0clszXSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgaWYgKHFzdHJbMl0gPT0gJzAnKSB7Ci0gICAgICAgICAgICAgICAgICAgIHFzdHJbMV0gPSAnXDAnOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gcXN0cjsKLQotICAgICAgICBpZiAodmFyaWFudC0+bWltZV90eXBlICYmICp2YXJpYW50LT5taW1lX3R5cGUpIHsKLSAgICAgICAgICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSAiIHt0eXBlICI7Ci0gICAgICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gdmFyaWFudC0+bWltZV90eXBlOwotICAgICAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9ICJ9IjsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFyaWFudC0+Y29udGVudF9jaGFyc2V0ICYmICp2YXJpYW50LT5jb250ZW50X2NoYXJzZXQpIHsKLSAgICAgICAgICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSAiIHtjaGFyc2V0ICI7Ci0gICAgICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gdmFyaWFudC0+Y29udGVudF9jaGFyc2V0OwotICAgICAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9ICJ9IjsKLSAgICAgICAgfQotICAgICAgICBpZiAobGFuZykgewotICAgICAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9ICIge2xhbmd1YWdlICI7Ci0gICAgICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gbGFuZzsKLSAgICAgICAgICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSAifSI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhcmlhbnQtPmNvbnRlbnRfZW5jb2RpbmcgJiYgKnZhcmlhbnQtPmNvbnRlbnRfZW5jb2RpbmcpIHsKLSAgICAgICAgICAgIC8qIFN0cmljdGx5IHNwZWFraW5nLCB0aGlzIGlzIG5vbi1zdGFuZGFyZCwgYnV0IHNvIGlzIFRDTiAqLwotCi0gICAgICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gIiB7ZW5jb2RpbmcgIjsKLSAgICAgICAgICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSB2YXJpYW50LT5jb250ZW50X2VuY29kaW5nOwotICAgICAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9ICJ9IjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIE5vdGUgdGhhdCB0aGUgQWx0ZXJuYXRlcyBzcGVjaWZpY2F0aW9uIChpbiByZmMyMjk1KSBkb2VzCi0gICAgICAgICAqIG5vdCByZXF1aXJlIHRoYXQgd2UgaW5jbHVkZSB7bGVuZ3RoIHh9LCBzbyB3ZSBjb3VsZCBvbWl0IGl0Ci0gICAgICAgICAqIGlmIGRldGVybWluaW5nIHRoZSBsZW5ndGggaXMgdG9vIGV4cGVuc2l2ZS4gIFdlIGN1cnJlbnRseQotICAgICAgICAgKiBhbHdheXMgaW5jbHVkZSBpdCB0aG91Z2guICAyMiBieXRlcyBpcyBlbm91Z2ggZm9yIDJeNjQuCi0gICAgICAgICAqCi0gICAgICAgICAqIElmIHRoZSB2YXJpYW50IGlzIGEgQ0dJIHNjcmlwdCwgZmluZF9jb250ZW50X2xlbmd0aCB3b3VsZAotICAgICAgICAgKiByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgc2NyaXB0LCBub3QgdGhlIG91dHB1dCBpdAotICAgICAgICAgKiBwcm9kdWNlcywgc28gd2UgY2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBhIGhhbmRsZXIgYW5kIGlmCi0gICAgICAgICAqIHRoZXJlIGlzIG9uZSB3ZSBkb24ndCBhZGQgYSBsZW5ndGguCi0gICAgICAgICAqIAotICAgICAgICAgKiBYWFg6IFRPRE86IFRoaXMgY2hlY2sgZG9lcyBub3QgZGV0ZWN0IGEgQ0dJIHNjcmlwdCBpZiB3ZQotICAgICAgICAgKiBnZXQgdGhlIHZhcmlhbnQgZnJvbSBhIHR5cGUgbWFwLiAgVGhpcyBuZWVkcyB0byBiZSBmaXhlZAotICAgICAgICAgKiAod2l0aG91dCBicmVha2luZyB0aGluZ3MgaWYgdGhlIHR5cGUgbWFwIHNwZWNpZmllcyBhCi0gICAgICAgICAqIGNvbnRlbnQtbGVuZ3RoLCB3aGljaCBjdXJyZW50bHkgbGVhZHMgdG8gdGhlIGNvcnJlY3QgcmVzdWx0KS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICghKHZhcmlhbnQtPnN1Yl9yZXEgJiYgdmFyaWFudC0+c3ViX3JlcS0+aGFuZGxlcikKLSAgICAgICAgICAgICYmIChsZW4gPSBmaW5kX2NvbnRlbnRfbGVuZ3RoKG5lZywgdmFyaWFudCkpICE9IDApIHsKLQotICAgICAgICAgICAgbGVuc3RyID0gKGNoYXIgKikgYXBfcGFsbG9jKHItPnBvb2wsIDIyKTsKLSAgICAgICAgICAgIGFwX3NucHJpbnRmKGxlbnN0ciwgMjIsICIlbGQiLCBsZW4pOwotICAgICAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9ICIge2xlbmd0aCAiOwotICAgICAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9IGxlbnN0cjsKLSAgICAgICAgICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSAifSI7Ci0gICAgICAgIH0KLSAgICAgIAotICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gIn0iOwotICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gIiwgIjsgLyogdHJpbW1lZCBiZWxvdyAqLwotICAgIH0KLQotICAgIGlmIChuZWctPnNlbmRfYWx0ZXJuYXRlcyAmJiBuZWctPmF2YWlsX3ZhcnMtPm5lbHRzKSB7Ci0gICAgICAgIGFyci0+bmVsdHMtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW1vdmUgbGFzdCBjb21tYSAqLwotICAgICAgICBhcF90YWJsZV9tZXJnZW4oaGRycywgIkFsdGVybmF0ZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgYXBfYXJyYXlfcHN0cmNhdChyLT5wb29sLCBhcnIsICdcMCcpKTsKLSAgICB9IAotCi0gICAgaWYgKG5lZy0+aXNfdHJhbnNwYXJlbnQgfHwgdmFyeV9ieV90eXBlIHx8IHZhcnlfYnlfbGFuZ3VhZ2UgfHwKLSAgICAgICAgdmFyeV9ieV9sYW5ndWFnZSB8fCB2YXJ5X2J5X2NoYXJzZXQgfHwgdmFyeV9ieV9lbmNvZGluZykgewotCi0gICAgICAgIGFwX3RhYmxlX21lcmdlbihoZHJzLCAiVmFyeSIsIDIgKyBhcF9wc3RyY2F0KHItPnBvb2wsCi0gICAgICAgICAgICBuZWctPmlzX3RyYW5zcGFyZW50ID8gIiwgbmVnb3RpYXRlIiAgICAgICA6ICIiLAotICAgICAgICAgICAgdmFyeV9ieV90eXBlICAgICAgICA/ICIsIGFjY2VwdCIgICAgICAgICAgOiAiIiwKLSAgICAgICAgICAgIHZhcnlfYnlfbGFuZ3VhZ2UgICAgPyAiLCBhY2NlcHQtbGFuZ3VhZ2UiIDogIiIsCi0gICAgICAgICAgICB2YXJ5X2J5X2NoYXJzZXQgICAgID8gIiwgYWNjZXB0LWNoYXJzZXQiICA6ICIiLAotICAgICAgICAgICAgdmFyeV9ieV9lbmNvZGluZyAgICA/ICIsIGFjY2VwdC1lbmNvZGluZyIgOiAiIiwgTlVMTCkpOwotICAgIH0KLQotICAgIGlmIChuZWctPmlzX3RyYW5zcGFyZW50KSB7IC8qIENyZWF0ZSBUQ04gcmVzcG9uc2UgaGVhZGVyICovCi0gICAgICAgIGFwX3RhYmxlX3NldG4oaGRycywgIlRDTiIsCi0gICAgICAgICAgICAgICAgICAgICAgYWxnX3Jlc3VsdCA9PSBhbGdfbGlzdCA/ICJsaXN0IiA6ICJjaG9pY2UiKTsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogUmV0dXJuIGFuIEhUTUwgbGlzdCBvZiB2YXJpYW50cy4gVGhpcyBpcyBvdXRwdXQgYXMgcGFydCBvZiB0aGUKLSAqIGNob2ljZSByZXNwb25zZSBvciA0MDYgc3RhdHVzIGJvZHkuCi0gKi8KLQotc3RhdGljIGNoYXIgKm1ha2VfdmFyaWFudF9saXN0KHJlcXVlc3RfcmVjICpyLCBuZWdvdGlhdGlvbl9zdGF0ZSAqbmVnKQotewotICAgIGFycmF5X2hlYWRlciAqYXJyOwotICAgIGludCBpOwotICAgIGludCBtYXhfdmxpc3RfYXJyYXkgPSAobmVnLT5hdmFpbF92YXJzLT5uZWx0cyAqIDE1KSArIDI7Ci0KLSAgICAvKiBJbiBvcmRlciB0byBhdm9pZCBPKG5eMikgbWVtb3J5IGNvcGllcyBpbiBidWlsZGluZyB0aGUgbGlzdCwKLSAgICAgKiB3ZSBwcmVhbGxvY2F0ZSBhIHRhYmxlIHdpdGggdGhlIG1heGltdW0gc3Vic3RyaW5ncyBwb3NzaWJsZSwKLSAgICAgKiBmaWxsIGl0IHdpdGggdGhlIHZhcmlhbnQgbGlzdCwgYW5kIHRoZW4gY29uY2F0ZW5hdGUgdGhlIGVudGlyZSBhcnJheS4KLSAgICAgKi8KLSAgICBhcnIgPSBhcF9tYWtlX2FycmF5KHItPnBvb2wsIG1heF92bGlzdF9hcnJheSwgc2l6ZW9mKGNoYXIgKikpOwotCi0gICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9ICJBdmFpbGFibGUgdmFyaWFudHM6XG48dWw+XG4iOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG5lZy0+YXZhaWxfdmFycy0+bmVsdHM7ICsraSkgewotICAgICAgICB2YXJfcmVjICp2YXJpYW50ID0gJigodmFyX3JlYyAqKSBuZWctPmF2YWlsX3ZhcnMtPmVsdHMpW2ldOwotICAgICAgICBjaGFyICpmaWxlbmFtZSA9IHZhcmlhbnQtPmZpbGVfbmFtZSA/IHZhcmlhbnQtPmZpbGVfbmFtZSA6ICIiOwotICAgICAgICBhcnJheV9oZWFkZXIgKmxhbmd1YWdlcyA9IHZhcmlhbnQtPmNvbnRlbnRfbGFuZ3VhZ2VzOwotICAgICAgICBjaGFyICpkZXNjcmlwdGlvbiA9IHZhcmlhbnQtPmRlc2NyaXB0aW9uID8gdmFyaWFudC0+ZGVzY3JpcHRpb24gOiAiIjsKLQotICAgICAgICAvKiBUaGUgZm9ybWF0IGlzbid0IHZlcnkgbmVhdCwgYW5kIGl0IHdvdWxkIGJlIG5pY2UgdG8gbWFrZQotICAgICAgICAgKiB0aGUgdGFncyBodW1hbiByZWFkYWJsZSAoZWcgcmVwbGFjZSAnbGFuZ3VhZ2UgZW4nIHdpdGggJ0VuZ2xpc2gnKS4KLSAgICAgICAgICogTm90ZSB0aGF0IGlmIHlvdSBjaGFuZ2UgdGhlIG51bWJlciBvZiBzdWJzdHJpbmdzIHB1c2hlZCwgeW91IGFsc28KLSAgICAgICAgICogbmVlZCB0byBjaGFuZ2UgdGhlIGNhbGN1bGF0aW9uIG9mIG1heF92bGlzdF9hcnJheSBhYm92ZS4KLSAgICAgICAgICovCi0gICAgICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSAiPGxpPjxhIGhyZWY9XCIiOwotICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gZmlsZW5hbWU7Ci0gICAgICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSAiXCI+IjsKLSAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9IGZpbGVuYW1lOwotICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gIjwvYT4gIjsKLSAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9IGRlc2NyaXB0aW9uOwotCi0gICAgICAgIGlmICh2YXJpYW50LT5taW1lX3R5cGUgJiYgKnZhcmlhbnQtPm1pbWVfdHlwZSkgewotICAgICAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9ICIsIHR5cGUgIjsKLSAgICAgICAgICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSB2YXJpYW50LT5taW1lX3R5cGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxhbmd1YWdlcyAmJiBsYW5ndWFnZXMtPm5lbHRzKSB7Ci0gICAgICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gIiwgbGFuZ3VhZ2UgIjsKLSAgICAgICAgICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSBhcF9hcnJheV9wc3RyY2F0KHItPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VzLCAnLCcpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YXJpYW50LT5jb250ZW50X2NoYXJzZXQgJiYgKnZhcmlhbnQtPmNvbnRlbnRfY2hhcnNldCkgewotICAgICAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9ICIsIGNoYXJzZXQgIjsKLSAgICAgICAgICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSB2YXJpYW50LT5jb250ZW50X2NoYXJzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhcmlhbnQtPmNvbnRlbnRfZW5jb2RpbmcpIHsKLSAgICAgICAgICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSAiLCBlbmNvZGluZyAiOwotICAgICAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9IHZhcmlhbnQtPmNvbnRlbnRfZW5jb2Rpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9ICJcbiI7Ci0gICAgfQotICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSAiPC91bD5cbiI7Ci0KLSAgICByZXR1cm4gYXBfYXJyYXlfcHN0cmNhdChyLT5wb29sLCBhcnIsICdcMCcpOwotfQotCi1zdGF0aWMgdm9pZCBzdG9yZV92YXJpYW50X2xpc3QocmVxdWVzdF9yZWMgKnIsIG5lZ290aWF0aW9uX3N0YXRlICpuZWcpCi17Ci0gICAgaWYgKHItPm1haW4gPT0gTlVMTCkgewotICAgICAgICBhcF90YWJsZV9zZXRuKHItPm5vdGVzLCAidmFyaWFudC1saXN0IiwgbWFrZV92YXJpYW50X2xpc3QociwgbmVnKSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBhcF90YWJsZV9zZXRuKHItPm1haW4tPm5vdGVzLCAidmFyaWFudC1saXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICBtYWtlX3ZhcmlhbnRfbGlzdChyLT5tYWluLCBuZWcpKTsKLSAgICB9Ci19Ci0KLS8qIENhbGxlZCBpZiB3ZSBnb3QgYSAiQ2hvaWNlIiByZXNwb25zZSBmcm9tIHRoZSB2YXJpYW50IHNlbGVjdGlvbiBhbGdvcml0aG0uCi0gKiBJdCBjaGVja3MgdGhlIHJlc3VsdCBvZiB0aGUgY2hvc2VuIHZhcmlhbnQgdG8gc2VlIGlmIGl0Ci0gKiBpcyBpdHNlbGYgbmVnb3RpYXRlZCAoaWYgc28sIHJldHVybiBlcnJvciBWQVJJQU5UX0FMU09fVkFSSUVTKS4KLSAqIE90aGVyd2lzZSwgYWRkIHRoZSBhcHByb3ByaWF0ZSBoZWFkZXJzIHRvIHRoZSBjdXJyZW50IHJlc3BvbnNlLgotICovCi0KLXN0YXRpYyBpbnQgc2V0dXBfY2hvaWNlX3Jlc3BvbnNlKHJlcXVlc3RfcmVjICpyLCBuZWdvdGlhdGlvbl9zdGF0ZSAqbmVnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX3JlYyAqdmFyaWFudCkKLXsKLSAgICByZXF1ZXN0X3JlYyAqc3ViX3JlcTsKLSAgICBjb25zdCBjaGFyICpzdWJfdmFyeTsKLQotICAgIGlmICghdmFyaWFudC0+c3ViX3JlcSkgewotICAgICAgICBpbnQgc3RhdHVzOwotCi0gICAgICAgIHN1Yl9yZXEgPSBhcF9zdWJfcmVxX2xvb2t1cF9maWxlKHZhcmlhbnQtPmZpbGVfbmFtZSwgcik7Ci0gICAgICAgIHN0YXR1cyA9IHN1Yl9yZXEtPnN0YXR1czsKLQotICAgICAgICBpZiAoc3RhdHVzICE9IEhUVFBfT0sgJiYgCi0gICAgICAgICAgICAhYXBfdGFibGVfZ2V0KHN1Yl9yZXEtPmVycl9oZWFkZXJzX291dCwgIlRDTiIpKSB7Ci0gICAgICAgICAgICBhcF9kZXN0cm95X3N1Yl9yZXEoc3ViX3JlcSk7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHZhcmlhbnQtPnN1Yl9yZXEgPSBzdWJfcmVxOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc3ViX3JlcSA9IHZhcmlhbnQtPnN1Yl9yZXE7Ci0gICAgfQotCi0gICAgLyogVGhlIHZhcmlhbnQgc2VsZWN0aW9uIGFsZ29yaXRobSB0b2xkIHVzIHRvIHJldHVybiBhICJDaG9pY2UiCi0gICAgICogcmVzcG9uc2UuIFRoaXMgaXMgdGhlIG5vcm1hbCB2YXJpYW50IHJlc3BvbnNlLCB3aXRoCi0gICAgICogc29tZSBleHRyYSBoZWFkZXJzLiBGaXJzdCwgZW5zdXJlIHRoYXQgdGhlIGNob3NlbgotICAgICAqIHZhcmlhbnQgZGlkIG9yIHdpbGwgbm90IGl0c2VsZiBlbmdhZ2UgaW4gdHJhbnNwYXJlbnQgbmVnb3RpYXRpb24uCi0gICAgICogSWYgbm90LCBzZXQgdGhlIGFwcHJvcHJpYXRlIGhlYWRlcnMsIGFuZCBmYWxsIHRocm91Z2ggdG8KLSAgICAgKiB0aGUgbm9ybWFsIHZhcmlhbnQgaGFuZGxpbmcgCi0gICAgICovCi0KLSAgICAvKiBUaGlzIGNhdGNoZXMgdGhlIGVycm9yIHRoYXQgYSB0cmFuc3BhcmVudCB0eXBlIG1hcCBzZWxlY3RzIGEKLSAgICAgKiB0cmFuc3BhcmVudCBtdWx0aXZpZXdzIHJlc291cmNlIGFzIHRoZSBiZXN0IHZhcmlhbnQuCi0gICAgICoKLSAgICAgKiBYWFg6IFdlIGRvIG5vdCBzaWduYWwgYW4gZXJyb3IgaWYgYSB0cmFuc3BhcmVudCB0eXBlIG1hcAotICAgICAqIHNlbGVjdHMgYSBfbm9uX3RyYW5zcGFyZW50IG11bHRpdmlld3MgcmVzb3VyY2UgYXMgdGhlIGJlc3QKLSAgICAgKiB2YXJpYW50LCBiZWNhdXNlIHdlIGNhbiBnZW5lcmF0ZSBhIGxlZ2FsIG5lZ290aWF0aW9uIHJlc3BvbnNlCi0gICAgICogaW4gdGhpcyBjYXNlLiAgSW4gdGhpcyBjYXNlLCB0aGUgdmxpc3RfdmFsaWRhdG9yIG9mIHRoZQotICAgICAqIG5vbnRyYW5zcGFyZW50IHN1YnJlcXVlc3Qgd2lsbCBiZSBsb3N0IGhvd2V2ZXIuICBUaGlzIGNvdWxkCi0gICAgICogbGVhZCB0byBjYXNlcyBpbiB3aGljaCBhIGNoYW5nZSBpbiB0aGUgc2V0IG9mIHZhcmlhbnRzIG9yIHRoZQotICAgICAqIG5lZ290aWF0aW9uIGFsZ29yaXRobSBvZiB0aGUgbm9udHJhbnNwYXJlbnQgcmVzb3VyY2UgaXMgbmV2ZXIKLSAgICAgKiBwcm9wYWdhdGVkIHVwIHRvIGEgSFRUUC8xLjEgY2FjaGUgd2hpY2ggaW50ZXJwcmV0cyBWYXJ5LiAgVG8gYmUKLSAgICAgKiBjb21wbGV0ZWx5IG9uIHRoZSBzYWZlIHNpZGUgd2Ugc2hvdWxkIHJldHVybiBWQVJJQU5UX0FMU09fVkFSSUVTCi0gICAgICogZm9yIHRoaXMgdHlwZSBvZiByZWN1cnNpdmUgbmVnb3RpYXRpb24gdG9vLgotICAgICAqLwotICAgIGlmIChuZWctPmlzX3RyYW5zcGFyZW50ICYmCi0gICAgICAgIGFwX3RhYmxlX2dldChzdWJfcmVxLT5lcnJfaGVhZGVyc19vdXQsICJUQ04iKSkgewotICAgICAgICByZXR1cm4gVkFSSUFOVF9BTFNPX1ZBUklFUzsKLSAgICB9Ci0KLSAgICAvKiBUaGlzIGNhdGNoZXMgdGhlIGVycm9yIHRoYXQgYSB0cmFuc3BhcmVudCB0eXBlIG1hcCByZWN1cnNpdmVseQotICAgICAqIHNlbGVjdHMsIGFzIHRoZSBiZXN0IHZhcmlhbnQsIGFub3RoZXIgdHlwZSBtYXAgd2hpY2ggaXRzZWxmCi0gICAgICogY2F1c2VzIHRyYW5zcGFyZW50IG5lZ290aWF0aW9uIHRvIGJlIGRvbmUuCi0gICAgICoKLSAgICAgKiBYWFg6IEFjdHVhbGx5LCB3ZSBjYXRjaCB0aGlzIGVycm9yIGJ5IGNhdGNoaW5nIGFsbCBjYXNlcyBvZgotICAgICAqIHR5cGUgbWFwIHJlY3Vyc2lvbi4gIFRoZXJlIGFyZSBzb21lIGJvcmRlcmxpbmUgcmVjdXJzaXZlIHR5cGUKLSAgICAgKiBtYXAgYXJyYW5nZW1lbnRzIHdoaWNoIHdvdWxkIG5vdCBwcm9kdWNlIHRyYW5zcGFyZW50Ci0gICAgICogbmVnb3RpYXRpb24gcHJvdG9jb2wgZXJyb3JzIG9yIGxhY2sgb2YgY2FjaGUgcHJvcGFnYXRpb24KLSAgICAgKiBwcm9ibGVtcywgYnV0IHN1Y2ggYXJyYW5nZW1lbnRzIGFyZSB2ZXJ5IGhhcmQgdG8gZGV0ZWN0IGF0IHRoaXMKLSAgICAgKiBwb2ludCBpbiB0aGUgY29udHJvbCBmbG93LCBzbyB3ZSBkbyBub3QgYm90aGVyIHRvIHNpbmdsZSB0aGVtCi0gICAgICogb3V0LgotICAgICAqCi0gICAgICogUmVjdXJzaXZlIHR5cGUgbWFwcyBpbXBseSBhIHJlY3Vyc2l2ZSBhcnJhbmdlbWVudCBvZiBuZWdvdGlhdGVkCi0gICAgICogcmVzb3VyY2VzIHdoaWNoIGlzIHZpc2libGUgdG8gb3V0c2lkZSBjbGllbnRzLCBhbmQgdGhpcyBpcyBub3QKLSAgICAgKiBzdXBwb3J0ZWQgYnkgdGhlIHRyYW5zcGFyZW50IG5lZ290aWF0aW9uIGNhY2hpbmcgcHJvdG9jb2xzLCBzbwotICAgICAqIGlmIHdlIGFyZSB0byBoYXZlIGdlbmVyaWMgc3VwcG9ydCBmb3IgcmVjdXJzaXZlIHR5cGUgbWFwcywgd2UKLSAgICAgKiBoYXZlIHRvIGNyZWF0ZSBzb21lIGNvbmZpZ3VyYXRpb24gc2V0dGluZyB3aGljaCBtYWtlcyBhbGwgdHlwZQotICAgICAqIG1hcHMgbm9uLXRyYW5zcGFyZW50IHdoZW4gcmVjdXJzaW9uIGlzIGVuYWJsZWQuICBBbHNvLCBpZiB3ZQotICAgICAqIHdhbnQgcmVjdXJzaXZlIHR5cGUgbWFwIHN1cHBvcnQgd2hpY2ggZW5zdXJlcyBwcm9wYWdhdGlvbiBvZgotICAgICAqIHR5cGUgbWFwIGNoYW5nZXMgaW50byBIVFRQLzEuMSBjYWNoZXMgdGhhdCBoYW5kbGUgVmFyeSwgd2UKLSAgICAgKiB3b3VsZCBoYXZlIHRvIGV4dGVuZCB0aGUgY3VycmVudCBtZWNoYW5pc20gZm9yIGdlbmVyYXRpbmcKLSAgICAgKiB2YXJpYW50IGxpc3QgdmFsaWRhdG9ycy4KLSAgICAgKi8KLSAgICBpZiAoc3ViX3JlcS0+aGFuZGxlciAmJiBzdHJjbXAoc3ViX3JlcS0+aGFuZGxlciwgInR5cGUtbWFwIikgPT0gMCkgewotICAgICAgICByZXR1cm4gVkFSSUFOVF9BTFNPX1ZBUklFUzsKLSAgICB9Ci0KLSAgICAvKiBUaGlzIGFkZHMgYW4gYXBwcm9wcmlhdGUgVmFyaWFudC1WYXJ5IGhlYWRlciBpZiB0aGUgc3VicmVxdWVzdAotICAgICAqIGlzIGEgbXVsdGl2aWV3cyByZXNvdXJjZS4KLSAgICAgKgotICAgICAqIFhYWDogVE9ETzogTm90ZSB0aGF0IHRoaXMgZG9lcyBfbm90XyBoYW5kbGUgYW55IFZhcnkgaGVhZGVyCi0gICAgICogcmV0dXJuZWQgYnkgYSBDR0kgaWYgc3ViX3JlcSBpcyBhIENHSSBzY3JpcHQsIGJlY2F1c2Ugd2UgZG9uJ3QKLSAgICAgKiBzZWUgdGhhdCBWYXJ5IGhlYWRlciB5ZXQgYXQgdGhpcyBwb2ludCBpbiB0aGUgY29udHJvbCBmbG93LgotICAgICAqIFRoaXMgd29uJ3QgY2F1c2UgYW55IGNhY2hlIGNvbnNpc3RlbmN5IHByb2JsZW1zIF91bmxlc3NfIHRoZQotICAgICAqIENHSSBzY3JpcHQgYWxzbyByZXR1cm5zIGEgQ2FjaGUtQ29udHJvbCBoZWFkZXIgbWFya2luZyB0aGUKLSAgICAgKiByZXNwb25zZSBhcyBjYWNoYWJsZS4gIFRoaXMgbmVlZHMgdG8gYmUgZml4ZWQsIGFsc28gdGhlcmUgYXJlCi0gICAgICogcHJvYmxlbXMgaWYgYSBDR0kgcmV0dXJucyBhbiBFdGFnIGhlYWRlciB3aGljaCBhbHNvIG5lZWQgdG8gYmUKLSAgICAgKiBmaXhlZC4KLSAgICAgKi8KLSAgICBpZiAoKHN1Yl92YXJ5ID0gYXBfdGFibGVfZ2V0KHN1Yl9yZXEtPmVycl9oZWFkZXJzX291dCwgIlZhcnkiKSkgIT0gTlVMTCkgewotICAgICAgICBhcF90YWJsZV9zZXRuKHItPmVycl9oZWFkZXJzX291dCwgIlZhcmlhbnQtVmFyeSIsIHN1Yl92YXJ5KTsKLQotICAgICAgICAvKiBNb3ZlIHRoZSBzdWJyZXEgVmFyeSBoZWFkZXIgaW50byB0aGUgbWFpbiByZXF1ZXN0IHRvCi0gICAgICAgICAqIHByZXZlbnQgaGF2aW5nIHR3byBWYXJ5IGhlYWRlcnMgaW4gdGhlIHJlc3BvbnNlLCB3aGljaAotICAgICAgICAgKiB3b3VsZCBiZSBsZWdhbCBidXQgc3RyYW5nZS4KLSAgICAgICAgICovCi0gICAgICAgIGFwX3RhYmxlX3NldG4oci0+ZXJyX2hlYWRlcnNfb3V0LCAiVmFyeSIsIHN1Yl92YXJ5KTsKLSAgICAgICAgYXBfdGFibGVfdW5zZXQoc3ViX3JlcS0+ZXJyX2hlYWRlcnNfb3V0LCAiVmFyeSIpOwotICAgIH0KLSAgICAKLSAgICBhcF90YWJsZV9zZXRuKHItPmVycl9oZWFkZXJzX291dCwgIkNvbnRlbnQtTG9jYXRpb24iLAotICAgICAgICAgICAgICAgICAgYXBfcHN0cmR1cChyLT5wb29sLCB2YXJpYW50LT5maWxlX25hbWUpKTsKLQotICAgIHNldF9uZWdfaGVhZGVycyhyLCBuZWcsIGFsZ19jaG9pY2UpOyAgICAgICAgIC8qIGFkZCBBbHRlcm5hdGVzIGFuZCBWYXJ5ICovCi0KLSAgICAvKiBTdGlsbCB0byBkbyBieSBjYWxsZXI6IGFkZCBFeHBpcmVzICovCi0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBFeGVjdXRpdmUuLi4KLSAqLwotCi1zdGF0aWMgaW50IGRvX25lZ290aWF0aW9uKHJlcXVlc3RfcmVjICpyLCBuZWdvdGlhdGlvbl9zdGF0ZSAqbmVnLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX3JlYyAqKmJlc3RwLCBpbnQgcHJlZmVyX3NjcmlwdHMpIAotewotICAgIHZhcl9yZWMgKmF2YWlsX3JlY3MgPSAodmFyX3JlYyAqKSBuZWctPmF2YWlsX3ZhcnMtPmVsdHM7Ci0gICAgaW50IGFsZ19yZXN1bHQ7ICAgICAgICAgICAgICAvKiByZXN1bHQgb2YgdmFyaWFudCBzZWxlY3Rpb24gYWxnb3JpdGhtICovCi0gICAgaW50IHJlczsKLSAgICBpbnQgajsKLQotICAgIC8qIERlY2lkZSBpZiByZXNvdXJjZSBpcyB0cmFuc3BhcmVudGx5IG5lZ290aWFibGUgKi8KLQotICAgIC8qIEdFVCBvciBIRUFEPyAoSEVBRCBoYXMgc2FtZSBtZXRob2QgbnVtYmVyIGFzIEdFVCkgKi8KLSAgICBpZiAoci0+bWV0aG9kX251bWJlciA9PSBNX0dFVCkgewotCi0gICAgICAgIC8qIG1heWJlIHRoaXMgc2hvdWxkIGJlIGNvbmZpZ3VyYWJsZSwgc2VlIGFsc28gdGhlIGNvbW1lbnQKLSAgICAgICAgICogYWJvdXQgcmVjdXJzaXZlIHR5cGUgbWFwcyBpbiBzZXR1cF9jaG9pY2VfcmVzcG9uc2UoKQotICAgICAgICAgKi8KLSAgICAgICAgbmVnLT5pc190cmFuc3BhcmVudCA9IDE7ICAgICAgIAotCi0gICAgICAgIC8qIFdlIGNhbid0IGJlIHRyYW5zcGFyZW50IGlmIHdlIGFyZSBhIG1hcCBmaWxlIGluIHRoZSBtaWRkbGUKLSAgICAgICAgICogb2YgdGhlIHJlcXVlc3QgVVJJLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHItPnBhdGhfaW5mbyAmJiAqci0+cGF0aF9pbmZvKQotICAgICAgICAgICAgbmVnLT5pc190cmFuc3BhcmVudCA9IDA7Ci0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IG5lZy0+YXZhaWxfdmFycy0+bmVsdHM7ICsraikgewotICAgICAgICAgICAgdmFyX3JlYyAqdmFyaWFudCA9ICZhdmFpbF9yZWNzW2pdOwotCi0gICAgICAgICAgICAvKiBXZSBjYW4ndCBiZSB0cmFuc3BhcmVudCwgYmVjYXVzZSBvZiBpbnRlcm5hbAotICAgICAgICAgICAgICogYXNzdW1wdGlvbnMgaW4gYmVzdF9tYXRjaCgpLCBpZiB0aGVyZSBpcyBhCi0gICAgICAgICAgICAgKiBub24tbmVpZ2hib3JpbmcgdmFyaWFudC4gIFdlIGNhbiBoYXZlIGEgbm9uLW5laWdoYm9yaW5nCi0gICAgICAgICAgICAgKiB2YXJpYW50IHdoZW4gcHJvY2Vzc2luZyBhIHR5cGUgbWFwLiAgCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChzdHJjaHIodmFyaWFudC0+ZmlsZV9uYW1lLCAnLycpKQotICAgICAgICAgICAgICAgIG5lZy0+aXNfdHJhbnNwYXJlbnQgPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5lZy0+aXNfdHJhbnNwYXJlbnQpICB7Ci0gICAgICAgIHBhcnNlX25lZ290aWF0ZV9oZWFkZXIociwgbmVnKTsKLSAgICB9Ci0gICAgZWxzZSB7IC8qIGNvbmZpZ3VyZSBuZWdvdGlhdGlvbiBvbiBub24tdHJhbnNwYXJlbnQgcmVzb3VyY2UgKi8KLSAgICAgICAgbmVnLT5tYXlfY2hvb3NlID0gMTsKLSAgICB9Ci0KLSAgICBtYXliZV9hZGRfZGVmYXVsdF9hY2NlcHRzKG5lZywgcHJlZmVyX3NjcmlwdHMpOwotCi0gICAgYWxnX3Jlc3VsdCA9IGJlc3RfbWF0Y2gobmVnLCBiZXN0cCk7Ci0KLSAgICAvKiBhbGdfcmVzdWx0IGlzIG9uZSBvZgotICAgICAqICAgYWxnX2Nob2ljZTogYSBiZXN0IHZhcmlhbnQgaXMgY2hvc2VuCi0gICAgICogICBhbGdfbGlzdDogbm8gYmVzdCB2YXJpYW50IGlzIGNob3NlbgotICAgICAqLwotCi0gICAgaWYgKGFsZ19yZXN1bHQgPT0gYWxnX2xpc3QpIHsKLSAgICAgICAgLyogc2VuZCBhIGxpc3QgcmVzcG9uc2Ugb3IgTk9UX0FDQ0VQVEFCTEUgZXJyb3IgcmVzcG9uc2UgICovCi0KLSAgICAgICAgbmVnLT5zZW5kX2FsdGVybmF0ZXMgPSAxOyAvKiBhbHdheXMgaW5jbHVkZSBBbHRlcm5hdGVzIGhlYWRlciAqLwotICAgICAgICBzZXRfbmVnX2hlYWRlcnMociwgbmVnLCBhbGdfcmVzdWx0KTsgCi0gICAgICAgIHN0b3JlX3ZhcmlhbnRfbGlzdChyLCBuZWcpOwotCi0gICAgICAgIGlmIChuZWctPmlzX3RyYW5zcGFyZW50ICYmIG5lZy0+dWFfc3VwcG9ydHNfdHJhbnMpIHsKLSAgICAgICAgICAgIC8qIFhYWCB0b2RvOiBleHBpcmVzPyBjYWNoYWJpbGl0eT8gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogU29tZSBIVFRQLzEuMCBjbGllbnRzIGFyZSBrbm93biB0byBjaG9rZSB3aGVuIHRoZXkgZ2V0Ci0gICAgICAgICAgICAgKiBhIDMwMCAobXVsdGlwbGUgY2hvaWNlcykgcmVzcG9uc2Ugd2l0aG91dCBhIExvY2F0aW9uCi0gICAgICAgICAgICAgKiBoZWFkZXIuICBIb3dldmVyIHRoZSAzMDAgY29kZSByZXNwb25zZSB3ZSBhcmUgYXJlIGFib3V0Ci0gICAgICAgICAgICAgKiB0byBnZW5lcmF0ZSB3aWxsIG9ubHkgcmVhY2ggMS4wIGNsaWVudHMgd2hpY2ggc3VwcG9ydAotICAgICAgICAgICAgICogdHJhbnNwYXJlbnQgbmVnb3RpYXRpb24sIGFuZCB0aGV5IHNob3VsZCBiZSBPSy4gVGhlCi0gICAgICAgICAgICAgKiByZXNwb25zZSBzaG91bGQgbmV2ZXIgcmVhY2ggb2xkZXIgMS4wIGNsaWVudHMsIGV2ZW4gaWYKLSAgICAgICAgICAgICAqIHdlIGhhdmUgQ2FjaGVOZWdvdGlhdGVkRG9jcyBlbmFibGVkLCBiZWNhdXNlIG5vIDEuMAotICAgICAgICAgICAgICogcHJveHkgY2FjaGUgKHdlIGtub3cgb2YpIHdpbGwgY2FjaGUgYW5kIHJldHVybiAzMDAKLSAgICAgICAgICAgICAqIHJlc3BvbnNlcyAodGhleSBjZXJ0YWlubHkgd29uJ3QgaWYgdGhleSBjb25mb3JtIHRvIHRoZQotICAgICAgICAgICAgICogSFRUUC8xLjAgc3BlY2lmaWNhdGlvbikuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHJldHVybiBNVUxUSVBMRV9DSE9JQ0VTOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoISpiZXN0cCkgewotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vIGFjY2VwdGFibGUgdmFyaWFudDogJXMiLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9UX0FDQ0VQVEFCTEU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBWYXJpYW50IHNlbGVjdGlvbiBjaG9zZSBhIHZhcmlhbnQgKi8KLQotICAgIC8qIFhYWCB0b2RvOiBtZXJnZSB0aGUgdHdvIGNhc2VzIGluIHRoZSBpZiBzdGF0ZW1lbnQgYmVsb3cgKi8KLSAgICBpZiAobmVnLT5pc190cmFuc3BhcmVudCkgewotCi0gICAgICAgIGlmICgocmVzID0gc2V0dXBfY2hvaWNlX3Jlc3BvbnNlKHIsIG5lZywgKmJlc3RwKSkgIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIHJlczsgLyogcmV0dXJuIGlmIGVycm9yICovCi0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHNldF9uZWdfaGVhZGVycyhyLCBuZWcsIGFsZ19yZXN1bHQpOwotICAgIH0KLQotICAgIC8qIE1ha2Ugc3VyZSBjYWNoaW5nIHdvcmtzIC0gVmFyeSBzaG91bGQgaGFuZGxlIEhUVFAvMS4xLCBidXQgZm9yCi0gICAgICogSFRUUC8xLjAsIHdlIGNhbid0IGFsbG93IGNhY2hpbmcgYXQgYWxsLgotICAgICAqLwotCi0gICAgLyogWFhYOiBOb3RlIHRoYXQgd2Ugb25seSBzZXQgci0+bm9fY2FjaGUgdG8gMSwgd2hpY2ggY2F1c2VzCi0gICAgICogRXhwaXJlczogPG5vdz4gdG8gYmUgYWRkZWQsIHdoZW4gcmVzcG9uZGluZyB0byBhIEhUVFAvMS4wCi0gICAgICogY2xpZW50LiAgSWYgd2UgcmV0dXJuIHRoZSByZXNwb25zZSB0byBhIDEuMSBjbGllbnQsIHdlIGRvIG5vdAotICAgICAqIGFkZCBFeHBpcmVzIDxub3c+LCBiZWNhdXNlIGRvaW5nIHNvIHdvdWxkIGRlZ3JhZGUgMS4xIGNhY2hlCi0gICAgICogcGVyZm9ybWFuY2UgYnkgcHJldmVudGluZyByZS11c2Ugb2YgdGhlIHJlc3BvbnNlIHdpdGhvdXQgcHJpb3IKLSAgICAgKiByZXZhbGlkYXRpb24uICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlIDEuMSBjbGllbnQgaXMgYSBwcm94eQotICAgICAqIHdoaWNoIHdhcyBpdHNlbGYgY29udGFjdGVkIGJ5IGEgMS4wIGNsaWVudCwgb3IgYSBwcm94eSBjYWNoZQotICAgICAqIHdoaWNoIGNhbiBiZSBjb250YWN0ZWQgbGF0ZXIgYnkgMS4wIGNsaWVudHMsIHRoZW4gd2UgY3VycmVudGx5Ci0gICAgICogcmVseSBvbiB0aGlzIDEuMSBwcm94eSB0byBhZGQgdGhlIEV4cGlyZXM6IDxub3c+IHdoZW4gaXQKLSAgICAgKiBmb3J3YXJkcyB0aGUgcmVzcG9uc2UuCi0gICAgICoKLSAgICAgKiBYWFg6IFRPRE86IEZpbmQgb3V0IGlmIHRoZSAxLjEgc3BlYyByZXF1aXJlcyBwcm94aWVzIGFuZAotICAgICAqIHR1bm5lbHMgdG8gYWRkIEV4cGlyZXM6IDxub3c+IHdoZW4gZm9yd2FyZGluZyB0aGUgcmVzcG9uc2UgdG8KLSAgICAgKiAxLjAgY2xpZW50cy4gIEkgKGtoKSByZWNhbGwgaXQgaXMgcmF0aGVyIHZhZ3VlIG9uIHRoaXMgcG9pbnQuCi0gICAgICogVGVzdGluZyBhY3R1YWwgMS4xIHByb3h5IGltcGxlbWVudGF0aW9ucyB3b3VsZCBhbHNvIGJlIG5pY2UuIElmCi0gICAgICogRXhwaXJlczogPG5vdz4gaXMgbm90IGFkZGVkIGJ5IHByb3hpZXMgdGhlbiB3ZSBuZWVkIHRvIGFsd2F5cwotICAgICAqIGluY2x1ZGUgRXhwaXJlczogPG5vdz4gb3Vyc2VsdmVzIHRvIGVuc3VyZSBjb3JyZWN0IGNhY2hpbmcsIGJ1dAotICAgICAqIHRoaXMgd291bGQgZGVncmFkZSBIVFRQLzEuMSBjYWNoZSBlZmZpY2llbmN5IHVubGVzcyB3ZSBhbHNvIGFkZAotICAgICAqIENhY2hlLUNvbnRyb2w6IG1heC1hZ2U9Tiwgd2hpY2ggd2UgY3VycmVudGx5IGRvbid0LgotICAgICAqCi0gICAgICogUm95OiBObywgd2UgYXJlIG5vdCBnb2luZyB0byBzY3JldyBvdmVyIEhUVFAgZnV0dXJlIGp1c3QgdG8KLSAgICAgKiAgICAgIGVuc3VyZSB0aGF0IHBlb3BsZSB3aG8gY2FuJ3QgYmUgYm90aGVyZWQgdG8gdXBncmFkZSB0aGVpcgotICAgICAqICAgICAgY2xpZW50cyB3aWxsIGFsd2F5cyByZWNlaXZlIHBlcmZlY3Qgc2VydmVyLXNpZGUgbmVnb3RpYXRpb24uCi0gICAgICogICAgICBIZWxsLCB0aG9zZSBjbGllbnRzIGFyZSBzZW5kaW5nIGJvZ3VzIGFjY2VwdCBoZWFkZXJzIGFueXdheS4KLSAgICAgKgotICAgICAqICAgICAgTWFudWFsIHNldHRpbmcgb2YgY2FjaGUtY29udHJvbC9leHBpcmVzIGFsd2F5cyBvdmVycmlkZXMgdGhpcwotICAgICAqICAgICAgYXV0b21hdGVkIGtsdWdlLCBvbiBwdXJwb3NlLgotICAgICAqLwotICAgIAotICAgIGlmICgoIWRvX2NhY2hlX25lZ290aWF0ZWRfZG9jcyhyLT5zZXJ2ZXIpCi0gICAgICAgICAmJiAoci0+cHJvdG9fbnVtIDwgSFRUUF9WRVJTSU9OKDEsMSkpKSAgICAgICAgCi0gICAgICAgICAmJiBuZWctPmNvdW50X211bHRpdmlld3NfdmFyaWFudHMgIT0gMSkgewotICAgICAgICByLT5ub19jYWNoZSA9IDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0aWMgaW50IGhhbmRsZV9tYXBfZmlsZShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBuZWdvdGlhdGlvbl9zdGF0ZSAqbmVnID0gcGFyc2VfYWNjZXB0X2hlYWRlcnMocik7Ci0gICAgdmFyX3JlYyAqYmVzdDsKLSAgICBpbnQgcmVzOwotCi0gICAgY2hhciAqdWRpcjsKLQotICAgIGlmICgocmVzID0gcmVhZF90eXBlX21hcChuZWcsIHIpKSkgewotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIHJlcyA9IGRvX25lZ290aWF0aW9uKHIsIG5lZywgJmJlc3QsIDApOwotICAgIGlmIChyZXMgIT0gMCkgcmV0dXJuIHJlczsKLQotICAgIGlmIChyLT5wYXRoX2luZm8gJiYgKnItPnBhdGhfaW5mbykgewotICAgICAgICByLT51cmlbYXBfZmluZF9wYXRoX2luZm8oci0+dXJpLCByLT5wYXRoX2luZm8pXSA9ICdcMCc7Ci0gICAgfQotICAgIHVkaXIgPSBhcF9tYWtlX2RpcnN0cl9wYXJlbnQoci0+cG9vbCwgci0+dXJpKTsKLSAgICB1ZGlyID0gYXBfZXNjYXBlX3VyaShyLT5wb29sLCB1ZGlyKTsKLSAgICBhcF9pbnRlcm5hbF9yZWRpcmVjdChhcF9wc3RyY2F0KHItPnBvb2wsIHVkaXIsIGJlc3QtPmZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnBhdGhfaW5mbywgTlVMTCksIHIpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdGljIGludCBoYW5kbGVfbXVsdGkocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgbmVnb3RpYXRpb25fc3RhdGUgKm5lZzsKLSAgICB2YXJfcmVjICpiZXN0LCAqYXZhaWxfcmVjczsKLSAgICByZXF1ZXN0X3JlYyAqc3ViX3JlcTsKLSAgICBpbnQgcmVzOwotICAgIGludCBqOwotCi0gICAgaWYgKHItPmZpbmZvLnN0X21vZGUgIT0gMCB8fCAhKGFwX2FsbG93X29wdGlvbnMocikgJiBPUFRfTVVMVEkpKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICBuZWcgPSBwYXJzZV9hY2NlcHRfaGVhZGVycyhyKTsKLQotICAgIGlmICgocmVzID0gcmVhZF90eXBlc19tdWx0aShuZWcpKSkgewotICAgICAgcmV0dXJuX2Zyb21fbXVsdGk6Ci0gICAgICAgIC8qIGZyZWUgYWxsIGFsbG9jYXRlZCBtZW1vcnkgZnJvbSBzdWJyZXF1ZXN0cyAqLwotICAgICAgICBhdmFpbF9yZWNzID0gKHZhcl9yZWMgKikgbmVnLT5hdmFpbF92YXJzLT5lbHRzOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgbmVnLT5hdmFpbF92YXJzLT5uZWx0czsgKytqKSB7Ci0gICAgICAgICAgICB2YXJfcmVjICp2YXJpYW50ID0gJmF2YWlsX3JlY3Nbal07Ci0gICAgICAgICAgICBpZiAodmFyaWFudC0+c3ViX3JlcSkgewotICAgICAgICAgICAgICAgIGFwX2Rlc3Ryb3lfc3ViX3JlcSh2YXJpYW50LT5zdWJfcmVxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLSAgICBpZiAobmVnLT5hdmFpbF92YXJzLT5uZWx0cyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICByZXMgPSBkb19uZWdvdGlhdGlvbihyLCBuZWcsICZiZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIChyLT5tZXRob2RfbnVtYmVyICE9IE1fR0VUKSB8fCByLT5hcmdzIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKHItPnBhdGhfaW5mbyAmJiAqci0+cGF0aF9pbmZvKSk7Ci0gICAgaWYgKHJlcyAhPSAwKQotICAgICAgICBnb3RvIHJldHVybl9mcm9tX211bHRpOwotCi0gICAgaWYgKCEoc3ViX3JlcSA9IGJlc3QtPnN1Yl9yZXEpKSB7Ci0gICAgICAgIC8qIFdlIGdvdCB0aGlzIG91dCBvZiBhIG1hcCBmaWxlLCBzbyB3ZSBkb24ndCBhY3R1YWxseSBoYXZlCi0gICAgICAgICAqIGEgc3ViX3JlcSBzdHJ1Y3R1cmUgeWV0LiAgR2V0IG9uZSBub3cuCi0gICAgICAgICAqLwotCi0gICAgICAgIHN1Yl9yZXEgPSBhcF9zdWJfcmVxX2xvb2t1cF9maWxlKGJlc3QtPmZpbGVfbmFtZSwgcik7Ci0gICAgICAgIGlmIChzdWJfcmVxLT5zdGF0dXMgIT0gSFRUUF9PSykgewotICAgICAgICAgICAgcmVzID0gc3ViX3JlcS0+c3RhdHVzOwotICAgICAgICAgICAgYXBfZGVzdHJveV9zdWJfcmVxKHN1Yl9yZXEpOwotICAgICAgICAgICAgZ290byByZXR1cm5fZnJvbV9tdWx0aTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEJMRUNIIC0tLSBkb24ndCBtdWx0aS1yZXNvbHZlIG5vbi1vcmRpbmFyeSBmaWxlcyAqLwotCi0gICAgaWYgKCFTX0lTUkVHKHN1Yl9yZXEtPmZpbmZvLnN0X21vZGUpKSB7Ci0gICAgICAgIHJlcyA9IE5PVF9GT1VORDsKLSAgICAgICAgZ290byByZXR1cm5fZnJvbV9tdWx0aTsKLSAgICB9Ci0KLSAgICAvKiBPdGhlcndpc2UsIHVzZSBpdC4gKi8KLQotICAgIC8qIG5vdyBkbyBhICJmYXN0IHJlZGlyZWN0IiAuLi4gcHJvbW90ZSB0aGUgc3ViX3JlcSBpbnRvIHRoZSBtYWluIHJlcSAqLwotICAgIC8qIFdlIG5lZWQgdG8gdGVsbCBQT09MX0RFQlVHIHRoYXQgd2UncmUgZ3VhcmFudGVlaW5nIHRoYXQgc3ViX3JlcS0+cG9vbAotICAgICAqIHdpbGwgZXhpc3QgYXMgbG9uZyBhcyByLT5wb29sLiAgT3RoZXJ3aXNlIHdlIHJ1biBpbnRvIHRyb3VibGVzIGJlY2F1c2UKLSAgICAgKiBzb21lIHZhbHVlcyBpbiB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBhbGxvY2F0ZWQgaW4gci0+cG9vbCwgYW5kIG90aGVycyBpbgotICAgICAqIHN1Yl9yZXEtPnBvb2wuCi0gICAgICovCi0gICAgYXBfcG9vbF9qb2luKHItPnBvb2wsIHN1Yl9yZXEtPnBvb2wpOwotICAgIHItPm10aW1lID0gMDsgLyogcmVzZXQgZXRhZyBpbmZvIGZvciBzdWJyZXF1ZXN0ICovCi0gICAgci0+ZmlsZW5hbWUgPSBzdWJfcmVxLT5maWxlbmFtZTsKLSAgICByLT5oYW5kbGVyID0gc3ViX3JlcS0+aGFuZGxlcjsKLSAgICByLT5jb250ZW50X3R5cGUgPSBzdWJfcmVxLT5jb250ZW50X3R5cGU7Ci0gICAgci0+Y29udGVudF9lbmNvZGluZyA9IHN1Yl9yZXEtPmNvbnRlbnRfZW5jb2Rpbmc7Ci0gICAgci0+Y29udGVudF9sYW5ndWFnZXMgPSBzdWJfcmVxLT5jb250ZW50X2xhbmd1YWdlczsKLSAgICByLT5jb250ZW50X2xhbmd1YWdlID0gc3ViX3JlcS0+Y29udGVudF9sYW5ndWFnZTsKLSAgICByLT5maW5mbyA9IHN1Yl9yZXEtPmZpbmZvOwotICAgIHItPnBlcl9kaXJfY29uZmlnID0gc3ViX3JlcS0+cGVyX2Rpcl9jb25maWc7Ci0gICAgLyogY29weSBvdXRwdXQgaGVhZGVycyBmcm9tIHN1YnJlcXVlc3QsIGJ1dCBsZWF2ZSBuZWdvdGlhdGlvbiBoZWFkZXJzICovCi0gICAgci0+bm90ZXMgPSBhcF9vdmVybGF5X3RhYmxlcyhyLT5wb29sLCBzdWJfcmVxLT5ub3Rlcywgci0+bm90ZXMpOwotICAgIHItPmhlYWRlcnNfb3V0ID0gYXBfb3ZlcmxheV90YWJsZXMoci0+cG9vbCwgc3ViX3JlcS0+aGVhZGVyc19vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5oZWFkZXJzX291dCk7Ci0gICAgci0+ZXJyX2hlYWRlcnNfb3V0ID0gYXBfb3ZlcmxheV90YWJsZXMoci0+cG9vbCwgc3ViX3JlcS0+ZXJyX2hlYWRlcnNfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPmVycl9oZWFkZXJzX291dCk7Ci0gICAgci0+c3VicHJvY2Vzc19lbnYgPSBhcF9vdmVybGF5X3RhYmxlcyhyLT5wb29sLCBzdWJfcmVxLT5zdWJwcm9jZXNzX2VudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnN1YnByb2Nlc3NfZW52KTsKLSAgICBhdmFpbF9yZWNzID0gKHZhcl9yZWMgKikgbmVnLT5hdmFpbF92YXJzLT5lbHRzOwotICAgIGZvciAoaiA9IDA7IGogPCBuZWctPmF2YWlsX3ZhcnMtPm5lbHRzOyArK2opIHsKLSAgICAgICAgdmFyX3JlYyAqdmFyaWFudCA9ICZhdmFpbF9yZWNzW2pdOwotICAgICAgICBpZiAodmFyaWFudCAhPSBiZXN0ICYmIHZhcmlhbnQtPnN1Yl9yZXEpIHsKLSAgICAgICAgICAgIGFwX2Rlc3Ryb3lfc3ViX3JlcSh2YXJpYW50LT5zdWJfcmVxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogVGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggY29udGVudC1lbmNvZGluZywgYXMgc29tZSBjbGllbnRzIHNlbmQgYW5kCi0gKiBleHBlY3QgYW4geC0gdG9rZW4gKGUuZy4geC1nemlwKSB3aGlsZSBvdGhlcnMgZXhwZWN0IHRoZSBwbGFpbiB0b2tlbgotICogKGkuZS4gZ3ppcCkuIFRvIHRyeSBhbmQgZGVhbCB3aXRoIHRoaXMgYXMgYmVzdCBhcyBwb3NzaWJsZSB3ZSBkbwotICogdGhlIGZvbGxvd2luZzogaWYgdGhlIGNsaWVudCBzZW50IGFuIEFjY2VwdC1FbmNvZGluZyBoZWFkZXIgYW5kIGl0Ci0gKiBjb250YWlucyBhIHBsYWluIHRva2VuIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbnRlbnQgZW5jb2Rpbmcgb2YgdGhlCi0gKiByZXNwb25zZSwgdGhlbiBzZXQgY29udGVudCBlbmNvZGluZyB1c2luZyB0aGUgcGxhaW4gdG9rZW4uIEVsc2UgaWYKLSAqIHRoZSBBLUUgaGVhZGVyIGNvbnRhaW5zIHRoZSB4LSB0b2tlbiB1c2UgdGhlIHgtIHRva2VuIGluIHRoZSBDLUUKLSAqIGhlYWRlci4gRWxzZSBkb24ndCBkbyBhbnl0aGluZy4KLSAqCi0gKiBOb3RlIHRoYXQgaWYgbm8gQS1FIGhlYWRlciB3YXMgc2VudCwgb3IgaXQgZG9lcyBub3QgY29udGFpbiBhIHRva2VuCi0gKiBjb21wYXRpYmxlIHdpdGggdGhlIGZpbmFsIGNvbnRlbnQgZW5jb2RpbmcsIHRoZW4gdGhlIHRva2VuIGluIHRoZQotICogQy1FIGhlYWRlciB3aWxsIGJlIHdoYXRldmVyIHdhcyBzcGVjaWZpZWQgaW4gdGhlIEFkZEVuY29kaW5nCi0gKiBkaXJlY3RpdmUuCi0gKi8KLXN0YXRpYyBpbnQgZml4X2VuY29kaW5nKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvbnN0IGNoYXIgKmVuYyA9IHItPmNvbnRlbnRfZW5jb2Rpbmc7Ci0gICAgY2hhciAqeF9lbmMgPSBOVUxMOwotICAgIGFycmF5X2hlYWRlciAqYWNjZXB0X2VuY29kaW5nczsKLSAgICBhY2NlcHRfcmVjICphY2NlcHRfcmVjczsKLSAgICBpbnQgaTsKLQotICAgIGlmICghZW5jIHx8ICEqZW5jKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICBpZiAoZW5jWzBdID09ICd4JyAmJiBlbmNbMV0gPT0gJy0nKSB7Ci0gICAgICAgIGVuYyArPSAyOwotICAgIH0KLQotICAgIGlmICgoYWNjZXB0X2VuY29kaW5ncyA9IGRvX2hlYWRlcl9saW5lKHItPnBvb2wsCi0gICAgICAgICAgICAgYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJBY2NlcHQtRW5jb2RpbmciKSkpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIGFjY2VwdF9yZWNzID0gKGFjY2VwdF9yZWMgKikgYWNjZXB0X2VuY29kaW5ncy0+ZWx0czsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBhY2NlcHRfZW5jb2RpbmdzLT5uZWx0czsgKytpKSB7Ci0gICAgICAgIGNoYXIgKm5hbWUgPSBhY2NlcHRfcmVjc1tpXS5uYW1lOwotCi0gICAgICAgIGlmICghc3RyY21wKG5hbWUsIGVuYykpIHsKLSAgICAgICAgICAgIHItPmNvbnRlbnRfZW5jb2RpbmcgPSBuYW1lOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5hbWVbMF0gPT0gJ3gnICYmIG5hbWVbMV0gPT0gJy0nICYmICFzdHJjbXAobmFtZSsyLCBlbmMpKSB7Ci0gICAgICAgICAgICB4X2VuYyA9IG5hbWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoeF9lbmMpIHsKLSAgICAgICAgci0+Y29udGVudF9lbmNvZGluZyA9IHhfZW5jOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgcmV0dXJuIERFQ0xJTkVEOwotfQotCi1zdGF0aWMgY29uc3QgaGFuZGxlcl9yZWMgbmVnb3RpYXRpb25faGFuZGxlcnNbXSA9Ci17Ci0gICAge01BUF9GSUxFX01BR0lDX1RZUEUsIGhhbmRsZV9tYXBfZmlsZX0sCi0gICAgeyJ0eXBlLW1hcCIsIGhhbmRsZV9tYXBfZmlsZX0sCi0gICAge05VTEx9Ci19OwotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgbmVnb3RpYXRpb25fbW9kdWxlID0KLXsKLSAgICBTVEFOREFSRF9NT0RVTEVfU1RVRkYsCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemVyICovCi0gICAgY3JlYXRlX25lZ19kaXJfY29uZmlnLCAgICAgIC8qIGRpciBjb25maWcgY3JlYXRvciAqLwotICAgIG1lcmdlX25lZ19kaXJfY29uZmlncywgICAgICAvKiBkaXIgbWVyZ2VyIC0tLSBkZWZhdWx0IGlzIHRvIG92ZXJyaWRlICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcnZlciBjb25maWcgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLwotICAgIG5lZ290aWF0aW9uX2NtZHMsICAgICAgICAgICAvKiBjb21tYW5kIHRhYmxlICovCi0gICAgbmVnb3RpYXRpb25faGFuZGxlcnMsICAgICAgIC8qIGhhbmRsZXJzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGVuYW1lIHRyYW5zbGF0aW9uICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrX3VzZXJfaWQgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgYXV0aCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBhY2Nlc3MgKi8KLSAgICBoYW5kbGVfbXVsdGksICAgICAgICAgICAgICAgLyogdHlwZV9jaGVja2VyICovCi0gICAgZml4X2VuY29kaW5nLCAgICAgICAgICAgICAgIC8qIGZpeHVwcyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2dnZXIgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaGVhZGVyIHBhcnNlciAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGlsZF9pbml0ICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoaWxkX2V4aXQgKi8KLSAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdCByZWFkLXJlcXVlc3QgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL21hcHBlcnMvbW9kX25lZ290aWF0aW9uLmRzcCBiL21vZHVsZXMvbWFwcGVycy9tb2RfbmVnb3RpYXRpb24uZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDI2NGZiLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWFwcGVycy9tb2RfbmVnb3RpYXRpb24uZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ibW9kX25lZ290aWF0aW9uIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDIKLQotQ0ZHPW1vZF9uZWdvdGlhdGlvbiAtIFdpbjMyIFJlbGVhc2UKLSFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAibW9kX25lZ290aWF0aW9uLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAibW9kX25lZ290aWF0aW9uLm1hayIgQ0ZHPSJtb2RfbmVnb3RpYXRpb24gLSBXaW4zMiBSZWxlYXNlIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgIm1vZF9uZWdvdGlhdGlvbiAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgIm1vZF9uZWdvdGlhdGlvbiAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwCi0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotTVRMPW1pZGwuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9uZWdvdGlhdGlvbiAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0kgIi4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9GZCJSZWxlYXNlXG1vZF9uZWdvdGlhdGlvbiIgL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9tYWNoaW5lOkkzODYgL291dDoiUmVsZWFzZS9tb2RfbmVnb3RpYXRpb24uc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX25lZ290aWF0aW9uCi0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvbWFjaGluZTpJMzg2IC9vdXQ6IlJlbGVhc2UvbW9kX25lZ290aWF0aW9uLnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF9uZWdvdGlhdGlvbgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibW9kX25lZ290aWF0aW9uIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HWCAvWmkgL09kIC9JICIuLi8uLi9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci11dGlsL2luY2x1ZGUiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRmQiRGVidWdcbW9kX25lZ290aWF0aW9uIiAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9pbmNyZW1lbnRhbDpubyAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6IkRlYnVnL21vZF9uZWdvdGlhdGlvbi5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfbmVnb3RpYXRpb24KLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvaW5jcmVtZW50YWw6bm8gL21hcCAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJEZWJ1Zy9tb2RfbmVnb3RpYXRpb24uc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX25lZ290aWF0aW9uCi0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJtb2RfbmVnb3RpYXRpb24gLSBXaW4zMiBSZWxlYXNlIgotIyBOYW1lICJtb2RfbmVnb3RpYXRpb24gLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kX25lZ290aWF0aW9uLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZF9uZWdvdGlhdGlvbi5yYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXGJ1aWxkXHdpbjMyXHdpbjMydmVyLmF3awotCi0hSUYgICIkKENGRykiID09ICJtb2RfbmVnb3RpYXRpb24gLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIENyZWF0aW5nIFZlcnNpb24gUmVzb3VyY2UKLUlucHV0UGF0aD0uLlwuLlxidWlsZFx3aW4zMlx3aW4zMnZlci5hd2sKLQotIi5cbW9kX25lZ290aWF0aW9uLnJjIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCWF3ayAtZiAuLi8uLi9idWlsZC93aW4zMi93aW4zMnZlci5hd2sgbW9kX25lZ290aWF0aW9uICAibmVnb3RpYXRpb25fbW9kdWxlIGZvciBBcGFjaGUiIC4uLy4uL2luY2x1ZGUvYXBfcmVsZWFzZS5oID4gLlxtb2RfbmVnb3RpYXRpb24ucmMKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJtb2RfbmVnb3RpYXRpb24gLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBDcmVhdGluZyBWZXJzaW9uIFJlc291cmNlCi1JbnB1dFBhdGg9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSIuXG1vZF9uZWdvdGlhdGlvbi5yYyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQlhd2sgLWYgLi4vLi4vYnVpbGQvd2luMzIvd2luMzJ2ZXIuYXdrIG1vZF9uZWdvdGlhdGlvbiAgIm5lZ290aWF0aW9uX21vZHVsZSBmb3IgQXBhY2hlIiAuLi8uLi9pbmNsdWRlL2FwX3JlbGVhc2UuaCA+IC5cbW9kX25lZ290aWF0aW9uLnJjCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWFwcGVycy9tb2RfbmVnb3RpYXRpb24uZXhwIGIvbW9kdWxlcy9tYXBwZXJzL21vZF9uZWdvdGlhdGlvbi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YzE4ZGEuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tYXBwZXJzL21vZF9uZWdvdGlhdGlvbi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1uZWdvdGlhdGlvbl9tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWFwcGVycy9tb2RfcmV3cml0ZS5jIGIvbW9kdWxlcy9tYXBwZXJzL21vZF9yZXdyaXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NGRlMGQuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tYXBwZXJzL21vZF9yZXdyaXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjYzICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0KLS8qICAgICAgICAgICAgICAgICAgICAgICBfICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gXwotKiogICBfIF9fIF9fXyAgIF9fXyAgIF9ffCB8ICAgIF8gX18gX19fX18gICAgICBfX18gX18oXykgfF8gX19fCi0qKiAgfCAnXyBgIF8gXCAvIF8gXCAvIF9gIHwgICB8ICdfXy8gXyBcIFwgL1wgLyAvICdfX3wgfCBfXy8gXyBcCi0qKiAgfCB8IHwgfCB8IHwgKF8pIHwgKF98IHwgICB8IHwgfCAgX18vXCBWICBWIC98IHwgIHwgfCB8fCAgX18vCi0qKiAgfF98IHxffCB8X3xcX19fLyBcX18sX3xfX198X3wgIFxfX198IFxfL1xfLyB8X3wgIHxffFxfX1xfX198Ci0qKiAgICAgICAgICAgICAgICAgICAgICAgfF9fX19ffAotKioKLSoqICBVUkwgUmV3cml0aW5nIE1vZHVsZQotKioKLSoqICBUaGlzIG1vZHVsZSB1c2VzIGEgcnVsZS1iYXNlZCByZXdyaXRpbmcgZW5naW5lIChiYXNlZCBvbiBhCi0qKiAgcmVndWxhci1leHByZXNzaW9uIHBhcnNlcikgdG8gcmV3cml0ZSByZXF1ZXN0ZWQgVVJMcyBvbiB0aGUgZmx5LgotKioKLSoqICBJdCBzdXBwb3J0cyBhbiB1bmxpbWl0ZWQgbnVtYmVyIG9mIGFkZGl0aW9uYWwgcnVsZSBjb25kaXRpb25zICh3aGljaCBjYW4KLSoqICBvcGVyYXRlIG9uIGEgbG90IG9mIHZhcmlhYmxlcywgZXZlbiBvbiBIVFRQIGhlYWRlcnMpIGZvciBncmFudWxhcgotKiogIG1hdGNoaW5nIGFuZCBldmVuIGV4dGVybmFsIGRhdGFiYXNlIGxvb2t1cHMgKGVpdGhlciB2aWEgcGxhaW4gdGV4dAotKiogIHRhYmxlcywgREJNIGhhc2ggZmlsZXMgb3IgZXZlbiBleHRlcm5hbCBwcm9jZXNzZXMpIGZvciBhZHZhbmNlZCBVUkwKLSoqICBzdWJzdGl0dXRpb24uCi0qKgotKiogIEl0IG9wZXJhdGVzIG9uIHRoZSBmdWxsIFVSTHMgKGluY2x1ZGluZyB0aGUgUEFUSF9JTkZPIHBhcnQpIGJvdGggaW4KLSoqICBwZXItc2VydmVyIGNvbnRleHQgKGh0dHBkLmNvbmYpIGFuZCBwZXItZGlyIGNvbnRleHQgKC5odGFjY2VzcykgYW5kIGV2ZW4KLSoqICBjYW4gZ2VuZXJhdGUgUVVFUllfU1RSSU5HIHBhcnRzIG9uIHJlc3VsdC4gICBUaGUgcmV3cml0aW5nIHJlc3VsdCBmaW5hbGx5Ci0qKiAgY2FuIGxlYWQgdG8gaW50ZXJuYWwgc3VicHJvY2Vzc2luZywgZXh0ZXJuYWwgcmVxdWVzdCByZWRpcmVjdGlvbiBvciBldmVuCi0qKiAgdG8gaW50ZXJuYWwgcHJveHkgdGhyb3VnaHB1dC4KLSoqCi0qKiAgVGhpcyBtb2R1bGUgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBpbiBBcHJpbCAxOTk2IGFuZAotKiogIGdpZnRlZCBleGNsdXNpdmVseSB0byB0aGUgVGhlIEFwYWNoZSBHcm91cCBpbiBKdWx5IDE5OTcgYnkKLSoqCi0qKiAgICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwKLSoqICAgICAgcnNlQGVuZ2Vsc2NoYWxsLmNvbQotKiogICAgICB3d3cuZW5nZWxzY2hhbGwuY29tCi0qLwotCi0KLSNpbmNsdWRlICJtb2RfcmV3cml0ZS5oIgotCi0jaWZuZGVmIE5PX1dSSVRFVgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy91aW8uaD4KLSNlbmRpZgotCi0vKgotKiogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSoqIHwgICAgICAgICAgICAgc3RhdGljIG1vZHVsZSBjb25maWd1cmF0aW9uCi0qKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSoqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLQotCi0vKgotKiogIE91ciBpbnRlcmZhY2UgdG8gdGhlIEFwYWNoZSBzZXJ2ZXIga2VybmVsOgotKioKLSoqICBvICBSdW50aW1lIGxvZ2ljIG9mIGEgcmVxdWVzdCBpcyBhcyBmb2xsb3dpbmc6Ci0qKiAgICAgICB3aGlsZShyZXF1ZXN0IG9yIHN1YnJlcXVlc3QpCi0qKiAgICAgICAgICAgZm9yZWFjaChzdGFnZSAjMC4uLiM5KQotKiogICAgICAgICAgICAgICBmb3JlYWNoKG1vZHVsZSkgKCoqKQotKiogICAgICAgICAgICAgICAgICAgdHJ5IHRvIHJ1biBob29rCi0qKgotKiogIG8gIHRoZSBvcmRlciBvZiBtb2R1bGVzIGF0ICgqKikgaXMgdGhlIGludmVydGVkIG9yZGVyIGFzCi0qKiAgICAgZ2l2ZW4gaW4gdGhlICJDb25maWd1cmF0aW9uIiBmaWxlLCBpLmUuIHRoZSBsYXN0IG1vZHVsZQotKiogICAgIHNwZWNpZmllZCBpcyB0aGUgZmlyc3Qgb25lIGNhbGxlZCBmb3IgZWFjaCBob29rIQotKiogICAgIFRoZSBjb3JlIG1vZHVsZSBpcyBhbHdheXMgdGhlIGxhc3QhCi0qKgotKiogIG8gIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHR5cGVzIG9mIHJlc3VsdCBjaGVja2luZyBhbmQKLSoqICAgICBjb250aW51ZSBwcm9jZXNzaW5nOgotKiogICAgIGZvciBob29rICMwLCMxLCM0LCM1LCM2LCM4OgotKiogICAgICAgICBob29rIHJ1biBsb29wIHN0b3BzIG9uIGZpcnN0IG1vZHVsZXMgd2hpY2ggZ2l2ZXMKLSoqICAgICAgICAgYmFjayBhIHJlc3VsdCAhPSBERUNMSU5FRCwgaS5lLiBpdCB1c3VhbGx5IHJldHVybnMgT0sKLSoqICAgICAgICAgd2hpY2ggc2F5cyAiT0ssIG1vZHVsZSBoYXMgaGFuZGxlZCB0aGlzIF9zdGFnZV8iIGFuZCBmb3IgIzEKLSoqICAgICAgICAgdGhpcyBoYXZlIG5vdCB0byBtZWFuICJPaywgdGhlIGZpbGVuYW1lIGlzIG5vdyB2YWxpZCIuCi0qKiAgICAgZm9yIGhvb2sgIzIsIzMsIzcsIzk6Ci0qKiAgICAgICAgIGFsbCBob29rcyBhcmUgcnVuLCBpbmRlcGVuZGVuZCBvZiByZXN1bHQKLSoqCi0qKiAgbyAgYXQgdGhlIGxhc3Qgc3RhZ2UsIHRoZSBjb3JlIG1vZHVsZSBhbHdheXMKLSoqICAgICAgIC0gc2F5cyAiQkFEX1JFUVVFU1QiIGlmIHItPmZpbGVuYW1lIGRvZXMgbm90IGJlZ2luIHdpdGggIi8iCi0qKiAgICAgICAtIHByZWZpeCBVUkwgd2l0aCBkb2N1bWVudF9yb290IG9yIHJlcGxhY2VkIHNlcnZlcl9yb290Ci0qKiAgICAgICAgIHdpdGggZG9jdW1lbnRfcm9vdCBhbmQgc2V0cyByLT5maWxlbmFtZQotKiogICAgICAgLSBhbHdheXMgcmV0dXJuIGEgIk9LIiBpbmRlcGVuZGVkIGlmIHRoZSBmaWxlIHJlYWxseSBleGlzdHMKLSoqICAgICAgICAgb3Igbm90IQotKi8KLQotICAgIC8qIFRoZSBzZWN0aW9uIGZvciB0aGUgQ29uZmlndXJlIHNjcmlwdDoKLSAgICAgKiBNT0RVTEUtREVGSU5JVElPTi1TVEFSVAotICAgICAqIE5hbWU6IHJld3JpdGVfbW9kdWxlCi0gICAgICogQ29uZmlnU3RhcnQKLSAgICAuIC4vaGVscGVycy9maW5kLWRibS1saWIKLSAgICBpZiBbICJ4JGZvdW5kX2RibSIgPSAieDEiIF07IHRoZW4KLSAgICAgICAgZWNobyAiICAgICAgZW5hYmxpbmcgREJNIHN1cHBvcnQgZm9yIG1vZF9yZXdyaXRlIgotICAgIGVsc2UKLSAgICAgICAgZWNobyAiICAgICAgZGlzYWJsaW5nIERCTSBzdXBwb3J0IGZvciBtb2RfcmV3cml0ZSIKLSAgICAgICAgZWNobyAiICAgICAgKHBlcmhhcHMgeW91IG5lZWQgdG8gYWRkIC1sZGJtLCAtbG5kYm0gb3IgLWxnZGJtIHRvIEVYVFJBX0xJQlMpIgotICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLUROT19EQk1fUkVXUklURU1BUCIKLSAgICBmaQotICAgICAqIENvbmZpZ0VuZAotICAgICAqIE1PRFVMRS1ERUZJTklUSU9OLUVORAotICAgICAqLwotCi0gICAgLyogdGhlIHRhYmxlIG9mIGNvbW1hbmRzIHdlIHByb3ZpZGUgKi8KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBjb21tYW5kX3RhYmxlW10gPSB7Ci0gICAgeyAiUmV3cml0ZUVuZ2luZSIsICAgY21kX3Jld3JpdGVlbmdpbmUsICAgTlVMTCwgT1JfRklMRUlORk8sIEZMQUcsCi0gICAgICAiT24gb3IgT2ZmIHRvIGVuYWJsZSBvciBkaXNhYmxlIChkZWZhdWx0KSB0aGUgd2hvbGUgcmV3cml0aW5nIGVuZ2luZSIgfSwKLSAgICB7ICJSZXdyaXRlT3B0aW9ucyIsICBjbWRfcmV3cml0ZW9wdGlvbnMsICBOVUxMLCBPUl9GSUxFSU5GTywgSVRFUkFURSwKLSAgICAgICJMaXN0IG9mIG9wdGlvbiBzdHJpbmdzIHRvIHNldCIgfSwKLSAgICB7ICJSZXdyaXRlQmFzZSIsICAgICBjbWRfcmV3cml0ZWJhc2UsICAgICBOVUxMLCBPUl9GSUxFSU5GTywgVEFLRTEsCi0gICAgICAidGhlIGJhc2UgVVJMIG9mIHRoZSBwZXItZGlyZWN0b3J5IGNvbnRleHQiIH0sCi0gICAgeyAiUmV3cml0ZUNvbmQiLCAgICAgY21kX3Jld3JpdGVjb25kLCAgICAgTlVMTCwgT1JfRklMRUlORk8sIFJBV19BUkdTLAotICAgICAgImFuIGlucHV0IHN0cmluZyBhbmQgYSB0byBiZSBhcHBsaWVkIHJlZ2V4cC1wYXR0ZXJuIiB9LAotICAgIHsgIlJld3JpdGVSdWxlIiwgICAgIGNtZF9yZXdyaXRlcnVsZSwgICAgIE5VTEwsIE9SX0ZJTEVJTkZPLCBSQVdfQVJHUywKLSAgICAgICJhbiBVUkwtYXBwbGllZCByZWdleHAtcGF0dGVybiBhbmQgYSBzdWJzdGl0dXRpb24gVVJMIiB9LAotICAgIHsgIlJld3JpdGVNYXAiLCAgICAgIGNtZF9yZXdyaXRlbWFwLCAgICAgIE5VTEwsIFJTUkNfQ09ORiwgICBUQUtFMiwKLSAgICAgICJhIG1hcG5hbWUgYW5kIGEgZmlsZW5hbWUiIH0sCi0gICAgeyAiUmV3cml0ZUxvY2siLCAgICAgY21kX3Jld3JpdGVsb2NrLCAgICAgTlVMTCwgUlNSQ19DT05GLCAgIFRBS0UxLAotICAgICAgInRoZSBmaWxlbmFtZSBvZiBhIGxvY2tmaWxlIHVzZWQgZm9yIGludGVyLXByb2Nlc3Mgc3luY2hyb25pemF0aW9uIn0sCi0gICAgeyAiUmV3cml0ZUxvZyIsICAgICAgY21kX3Jld3JpdGVsb2csICAgICAgTlVMTCwgUlNSQ19DT05GLCAgIFRBS0UxLAotICAgICAgInRoZSBmaWxlbmFtZSBvZiB0aGUgcmV3cml0aW5nIGxvZ2ZpbGUiIH0sCi0gICAgeyAiUmV3cml0ZUxvZ0xldmVsIiwgY21kX3Jld3JpdGVsb2dsZXZlbCwgTlVMTCwgUlNSQ19DT05GLCAgIFRBS0UxLAotICAgICAgInRoZSBsZXZlbCBvZiB0aGUgcmV3cml0aW5nIGxvZ2ZpbGUgdmVyYm9zaXR5ICIKLSAgICAgICIoMD1ub25lLCAxPXN0ZCwgLi4sIDk9bWF4KSIgfSwKLSAgICB7IE5VTEwgfQotfTsKLQotICAgIC8qIHRoZSB0YWJsZSBvZiBjb250ZW50IGhhbmRsZXJzIHdlIHByb3ZpZGUgKi8KLXN0YXRpYyBjb25zdCBoYW5kbGVyX3JlYyBoYW5kbGVyX3RhYmxlW10gPSB7Ci0gICAgeyAicmVkaXJlY3QtaGFuZGxlciIsIGhhbmRsZXJfcmVkaXJlY3QgfSwKLSAgICB7IE5VTEwgfQotfTsKLQotICAgIC8qIHRoZSBtYWluIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCByZXdyaXRlX21vZHVsZSA9IHsKLSAgIFNUQU5EQVJEX01PRFVMRV9TVFVGRiwKLSAgIGluaXRfbW9kdWxlLCAgICAgICAgICAgICAgICAgLyogbW9kdWxlIGluaXRpYWxpemVyICAgICAgICAgICAgICAgICAgKi8KLSAgIGNvbmZpZ19wZXJkaXJfY3JlYXRlLCAgICAgICAgLyogY3JlYXRlIHBlci1kaXIgICAgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgIGNvbmZpZ19wZXJkaXJfbWVyZ2UsICAgICAgICAgLyogbWVyZ2UgIHBlci1kaXIgICAgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgIGNvbmZpZ19zZXJ2ZXJfY3JlYXRlLCAgICAgICAgLyogY3JlYXRlIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgIGNvbmZpZ19zZXJ2ZXJfbWVyZ2UsICAgICAgICAgLyogbWVyZ2UgIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgIGNvbW1hbmRfdGFibGUsICAgICAgICAgICAgICAgLyogdGFibGUgb2YgY29uZmlnIGZpbGUgY29tbWFuZHMgICAgICAgKi8KLSAgIGhhbmRsZXJfdGFibGUsICAgICAgICAgICAgICAgLyogWyM4XSBNSU1FLXR5cGVkLWRpc3BhdGNoZWQgaGFuZGxlcnMgKi8KLSAgIGhvb2tfdXJpMmZpbGUsICAgICAgICAgICAgICAgLyogWyMxXSBVUkkgdG8gZmlsZW5hbWUgdHJhbnNsYXRpb24gICAgKi8KLSAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogWyM0XSB2YWxpZGF0ZSB1c2VyIGlkIGZyb20gcmVxdWVzdCAgKi8KLSAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogWyM1XSBjaGVjayBpZiB0aGUgdXNlciBpcyBvayBfaGVyZV8gKi8KLSAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogWyMzXSBjaGVjayBhY2Nlc3MgYnkgaG9zdCBhZGRyZXNzICAgKi8KLSAgIGhvb2tfbWltZXR5cGUsICAgICAgICAgICAgICAgLyogWyM2XSBkZXRlcm1pbmUgTUlNRSB0eXBlICAgICAgICAgICAgKi8KLSAgIGhvb2tfZml4dXAsICAgICAgICAgICAgICAgICAgLyogWyM3XSBwcmUtcnVuIGZpeHVwcyAgICAgICAgICAgICAgICAgKi8KLSAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogWyM5XSBsb2cgYSB0cmFuc2FjdGlvbiAgICAgICAgICAgICAgKi8KLSAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogWyMyXSBoZWFkZXIgcGFyc2VyICAgICAgICAgICAgICAgICAgKi8KLSAgIGluaXRfY2hpbGQsICAgICAgICAgICAgICAgICAgLyogY2hpbGRfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hpbGRfZXhpdCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWyMwXSBwb3N0IHJlYWQtcmVxdWVzdCAgICAgICAgICAgICAgKi8KLX07Ci0KLSAgICAvKiB0aGUgY2FjaGUgKi8KLXN0YXRpYyBjYWNoZSAqY2FjaGVwOwotCi0gICAgLyogd2hldGhlciBwcm94eSBtb2R1bGUgaXMgYXZhaWxhYmxlIG9yIG5vdCAqLwotc3RhdGljIGludCBwcm94eV9hdmFpbGFibGU7Ci0KLXN0YXRpYyBjaGFyICpsb2NrbmFtZTsKLXN0YXRpYyBpbnQgbG9ja2ZkID0gLTE7Ci0KLS8qCi0qKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSoqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiogfCAgICAgICAgICAgY29uZmlndXJhdGlvbiBkaXJlY3RpdmUgaGFuZGxpbmcKLSoqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotCi0vKgotKioKLSoqICBwZXItc2VydmVyIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGhhbmRsaW5nCi0qKgotKi8KLQotc3RhdGljIHZvaWQgKmNvbmZpZ19zZXJ2ZXJfY3JlYXRlKHBvb2wgKnAsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgcmV3cml0ZV9zZXJ2ZXJfY29uZiAqYTsKLQotICAgIGEgPSAocmV3cml0ZV9zZXJ2ZXJfY29uZiAqKWFwX3BjYWxsb2MocCwgc2l6ZW9mKHJld3JpdGVfc2VydmVyX2NvbmYpKTsKLQotICAgIGEtPnN0YXRlICAgICAgICAgICA9IEVOR0lORV9ESVNBQkxFRDsKLSAgICBhLT5vcHRpb25zICAgICAgICAgPSBPUFRJT05fTk9ORTsKLSAgICBhLT5yZXdyaXRlbG9nZmlsZSAgPSBOVUxMOwotICAgIGEtPnJld3JpdGVsb2dmcCAgICA9IC0xOwotICAgIGEtPnJld3JpdGVsb2dsZXZlbCA9IDA7Ci0gICAgYS0+cmV3cml0ZW1hcHMgICAgID0gYXBfbWFrZV9hcnJheShwLCAyLCBzaXplb2YocmV3cml0ZW1hcF9lbnRyeSkpOwotICAgIGEtPnJld3JpdGVjb25kcyAgICA9IGFwX21ha2VfYXJyYXkocCwgMiwgc2l6ZW9mKHJld3JpdGVjb25kX2VudHJ5KSk7Ci0gICAgYS0+cmV3cml0ZXJ1bGVzICAgID0gYXBfbWFrZV9hcnJheShwLCAyLCBzaXplb2YocmV3cml0ZXJ1bGVfZW50cnkpKTsKLSAgICBhLT5zZXJ2ZXIgICAgICAgICAgPSBzOwotCi0gICAgcmV0dXJuICh2b2lkICopYTsKLX0KLQotc3RhdGljIHZvaWQgKmNvbmZpZ19zZXJ2ZXJfbWVyZ2UocG9vbCAqcCwgdm9pZCAqYmFzZXYsIHZvaWQgKm92ZXJyaWRlc3YpCi17Ci0gICAgcmV3cml0ZV9zZXJ2ZXJfY29uZiAqYSwgKmJhc2UsICpvdmVycmlkZXM7Ci0KLSAgICBhICAgICAgICAgPSAocmV3cml0ZV9zZXJ2ZXJfY29uZiAqKWFwX3BjYWxsb2MocCwgc2l6ZW9mKHJld3JpdGVfc2VydmVyX2NvbmYpKTsKLSAgICBiYXNlICAgICAgPSAocmV3cml0ZV9zZXJ2ZXJfY29uZiAqKWJhc2V2OwotICAgIG92ZXJyaWRlcyA9IChyZXdyaXRlX3NlcnZlcl9jb25mICopb3ZlcnJpZGVzdjsKLQotICAgIGEtPnN0YXRlICAgPSBvdmVycmlkZXMtPnN0YXRlOwotICAgIGEtPm9wdGlvbnMgPSBvdmVycmlkZXMtPm9wdGlvbnM7Ci0gICAgYS0+c2VydmVyICA9IG92ZXJyaWRlcy0+c2VydmVyOwotCi0gICAgaWYgKGEtPm9wdGlvbnMgJiBPUFRJT05fSU5IRVJJVCkgewotICAgICAgICAvKgotICAgICAgICAgKiAgbG9jYWwgZGlyZWN0aXZlcyBvdmVycmlkZQotICAgICAgICAgKiAgYW5kIGFueXRoaW5nIGVsc2UgaXMgaW5oZXJpdGVkCi0gICAgICAgICAqLwotICAgICAgICBhLT5yZXdyaXRlbG9nbGV2ZWwgPSBvdmVycmlkZXMtPnJld3JpdGVsb2dsZXZlbCAhPSAwIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG92ZXJyaWRlcy0+cmV3cml0ZWxvZ2xldmVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYmFzZS0+cmV3cml0ZWxvZ2xldmVsOwotICAgICAgICBhLT5yZXdyaXRlbG9nZmlsZSAgPSBvdmVycmlkZXMtPnJld3JpdGVsb2dmaWxlICE9IE5VTEwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gb3ZlcnJpZGVzLT5yZXdyaXRlbG9nZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGJhc2UtPnJld3JpdGVsb2dmaWxlOwotICAgICAgICBhLT5yZXdyaXRlbG9nZnAgICAgPSBvdmVycmlkZXMtPnJld3JpdGVsb2dmcCAhPSAtMSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBvdmVycmlkZXMtPnJld3JpdGVsb2dmcCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiYXNlLT5yZXdyaXRlbG9nZnA7Ci0gICAgICAgIGEtPnJld3JpdGVtYXBzICAgICA9IGFwX2FwcGVuZF9hcnJheXMocCwgb3ZlcnJpZGVzLT5yZXdyaXRlbWFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5yZXdyaXRlbWFwcyk7Ci0gICAgICAgIGEtPnJld3JpdGVjb25kcyAgICA9IGFwX2FwcGVuZF9hcnJheXMocCwgb3ZlcnJpZGVzLT5yZXdyaXRlY29uZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+cmV3cml0ZWNvbmRzKTsKLSAgICAgICAgYS0+cmV3cml0ZXJ1bGVzICAgID0gYXBfYXBwZW5kX2FycmF5cyhwLCBvdmVycmlkZXMtPnJld3JpdGVydWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5yZXdyaXRlcnVsZXMpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogIGxvY2FsIGRpcmVjdGl2ZXMgb3ZlcnJpZGUKLSAgICAgICAgICogIGFuZCBhbnl0aGluZyBlbHNlIGdldHMgZGVmYXVsdHMKLSAgICAgICAgICovCi0gICAgICAgIGEtPnJld3JpdGVsb2dsZXZlbCA9IG92ZXJyaWRlcy0+cmV3cml0ZWxvZ2xldmVsOwotICAgICAgICBhLT5yZXdyaXRlbG9nZmlsZSAgPSBvdmVycmlkZXMtPnJld3JpdGVsb2dmaWxlOwotICAgICAgICBhLT5yZXdyaXRlbG9nZnAgICAgPSBvdmVycmlkZXMtPnJld3JpdGVsb2dmcDsKLSAgICAgICAgYS0+cmV3cml0ZW1hcHMgICAgID0gb3ZlcnJpZGVzLT5yZXdyaXRlbWFwczsKLSAgICAgICAgYS0+cmV3cml0ZWNvbmRzICAgID0gb3ZlcnJpZGVzLT5yZXdyaXRlY29uZHM7Ci0gICAgICAgIGEtPnJld3JpdGVydWxlcyAgICA9IG92ZXJyaWRlcy0+cmV3cml0ZXJ1bGVzOwotICAgIH0KLQotICAgIHJldHVybiAodm9pZCAqKWE7Ci19Ci0KLQotLyoKLSoqCi0qKiAgcGVyLWRpcmVjdG9yeSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBoYW5kbGluZwotKioKLSovCi0KLXN0YXRpYyB2b2lkICpjb25maWdfcGVyZGlyX2NyZWF0ZShwb29sICpwLCBjaGFyICpwYXRoKQotewotICAgIHJld3JpdGVfcGVyZGlyX2NvbmYgKmE7Ci0KLSAgICBhID0gKHJld3JpdGVfcGVyZGlyX2NvbmYgKilhcF9wY2FsbG9jKHAsIHNpemVvZihyZXdyaXRlX3BlcmRpcl9jb25mKSk7Ci0KLSAgICBhLT5zdGF0ZSAgICAgICAgICAgPSBFTkdJTkVfRElTQUJMRUQ7Ci0gICAgYS0+b3B0aW9ucyAgICAgICAgID0gT1BUSU9OX05PTkU7Ci0gICAgYS0+YmFzZXVybCAgICAgICAgID0gTlVMTDsKLSAgICBhLT5yZXdyaXRlY29uZHMgICAgPSBhcF9tYWtlX2FycmF5KHAsIDIsIHNpemVvZihyZXdyaXRlY29uZF9lbnRyeSkpOwotICAgIGEtPnJld3JpdGVydWxlcyAgICA9IGFwX21ha2VfYXJyYXkocCwgMiwgc2l6ZW9mKHJld3JpdGVydWxlX2VudHJ5KSk7Ci0KLSAgICBpZiAocGF0aCA9PSBOVUxMKSB7Ci0gICAgICAgIGEtPmRpcmVjdG9yeSA9IE5VTEw7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAvKiBtYWtlIHN1cmUgaXQgaGFzIGEgdHJhaWxpbmcgc2xhc2ggKi8KLSAgICAgICAgaWYgKHBhdGhbc3RybGVuKHBhdGgpLTFdID09ICcvJykgewotICAgICAgICAgICAgYS0+ZGlyZWN0b3J5ID0gYXBfcHN0cmR1cChwLCBwYXRoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGEtPmRpcmVjdG9yeSA9IGFwX3BzdHJjYXQocCwgcGF0aCwgIi8iLCBOVUxMKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAodm9pZCAqKWE7Ci19Ci0KLXN0YXRpYyB2b2lkICpjb25maWdfcGVyZGlyX21lcmdlKHBvb2wgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICpvdmVycmlkZXN2KQotewotICAgIHJld3JpdGVfcGVyZGlyX2NvbmYgKmEsICpiYXNlLCAqb3ZlcnJpZGVzOwotCi0gICAgYSAgICAgICAgID0gKHJld3JpdGVfcGVyZGlyX2NvbmYgKilhcF9wY2FsbG9jKHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyZXdyaXRlX3BlcmRpcl9jb25mKSk7Ci0gICAgYmFzZSAgICAgID0gKHJld3JpdGVfcGVyZGlyX2NvbmYgKiliYXNldjsKLSAgICBvdmVycmlkZXMgPSAocmV3cml0ZV9wZXJkaXJfY29uZiAqKW92ZXJyaWRlc3Y7Ci0KLSAgICBhLT5zdGF0ZSAgICAgPSBvdmVycmlkZXMtPnN0YXRlOwotICAgIGEtPm9wdGlvbnMgICA9IG92ZXJyaWRlcy0+b3B0aW9uczsKLSAgICBhLT5kaXJlY3RvcnkgPSBvdmVycmlkZXMtPmRpcmVjdG9yeTsKLSAgICBhLT5iYXNldXJsICAgPSBvdmVycmlkZXMtPmJhc2V1cmw7Ci0KLSAgICBpZiAoYS0+b3B0aW9ucyAmIE9QVElPTl9JTkhFUklUKSB7Ci0gICAgICAgIGEtPnJld3JpdGVjb25kcyA9IGFwX2FwcGVuZF9hcnJheXMocCwgb3ZlcnJpZGVzLT5yZXdyaXRlY29uZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+cmV3cml0ZWNvbmRzKTsKLSAgICAgICAgYS0+cmV3cml0ZXJ1bGVzID0gYXBfYXBwZW5kX2FycmF5cyhwLCBvdmVycmlkZXMtPnJld3JpdGVydWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5yZXdyaXRlcnVsZXMpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgYS0+cmV3cml0ZWNvbmRzID0gb3ZlcnJpZGVzLT5yZXdyaXRlY29uZHM7Ci0gICAgICAgIGEtPnJld3JpdGVydWxlcyA9IG92ZXJyaWRlcy0+cmV3cml0ZXJ1bGVzOwotICAgIH0KLQotICAgIHJldHVybiAodm9pZCAqKWE7Ci19Ci0KLQotLyoKLSoqCi0qKiAgdGhlIGNvbmZpZ3VyYXRpb24gY29tbWFuZHMKLSoqCi0qLwotCi1zdGF0aWMgY29uc3QgY2hhciAqY21kX3Jld3JpdGVlbmdpbmUoY21kX3Bhcm1zICpjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0ZV9wZXJkaXJfY29uZiAqZGNvbmYsIGludCBmbGFnKQotewotICAgIHJld3JpdGVfc2VydmVyX2NvbmYgKnNjb25mOwotCi0gICAgc2NvbmYgPSAKLSAgICAgICAgKHJld3JpdGVfc2VydmVyX2NvbmYgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhjbWQtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV3cml0ZV9tb2R1bGUpOwotCi0gICAgaWYgKGNtZC0+cGF0aCA9PSBOVUxMKSB7IC8qIGlzIHNlcnZlciBjb21tYW5kICovCi0gICAgICAgIHNjb25mLT5zdGF0ZSA9IChmbGFnID8gRU5HSU5FX0VOQUJMRUQgOiBFTkdJTkVfRElTQUJMRUQpOwotICAgIH0KLSAgICBlbHNlICAgICAgICAgICAgICAgICAgIC8qIGlzIHBlci1kaXJlY3RvcnkgY29tbWFuZCAqLyB7Ci0gICAgICAgIGRjb25mLT5zdGF0ZSA9IChmbGFnID8gRU5HSU5FX0VOQUJMRUQgOiBFTkdJTkVfRElTQUJMRUQpOwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqY21kX3Jld3JpdGVvcHRpb25zKGNtZF9wYXJtcyAqY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXdyaXRlX3BlcmRpcl9jb25mICpkY29uZiwgY2hhciAqb3B0aW9uKQotewotICAgIHJld3JpdGVfc2VydmVyX2NvbmYgKnNjb25mOwotICAgIGNvbnN0IGNoYXIgKmVycjsKLQotICAgIHNjb25mID0gKHJld3JpdGVfc2VydmVyX2NvbmYgKikKLSAgICAgICAgICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKGNtZC0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCAmcmV3cml0ZV9tb2R1bGUpOwotCi0gICAgaWYgKGNtZC0+cGF0aCA9PSBOVUxMKSB7IC8qIGlzIHNlcnZlciBjb21tYW5kICovCi0gICAgICAgIGVyciA9IGNtZF9yZXdyaXRlb3B0aW9uc19zZXRvcHRpb24oY21kLT5wb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc2NvbmYtPm9wdGlvbnMpLCBvcHRpb24pOwotICAgIH0KLSAgICBlbHNlIHsgICAgICAgICAgICAgICAgIC8qIGlzIHBlci1kaXJlY3RvcnkgY29tbWFuZCAqLwotICAgICAgICBlcnIgPSBjbWRfcmV3cml0ZW9wdGlvbnNfc2V0b3B0aW9uKGNtZC0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGRjb25mLT5vcHRpb25zKSwgb3B0aW9uKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqY21kX3Jld3JpdGVvcHRpb25zX3NldG9wdGlvbihwb29sICpwLCBpbnQgKm9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpuYW1lKQotewotICAgIGlmIChzdHJjYXNlY21wKG5hbWUsICJpbmhlcml0IikgPT0gMCkgewotICAgICAgICAqb3B0aW9ucyB8PSBPUFRJT05fSU5IRVJJVDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJldHVybiBhcF9wc3RyY2F0KHAsICJSZXdyaXRlT3B0aW9uczogdW5rbm93biBvcHRpb24gJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsICInXG4iLCBOVUxMKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjbWRfcmV3cml0ZWxvZyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZGNvbmYsIGNoYXIgKmExKQotewotICAgIHJld3JpdGVfc2VydmVyX2NvbmYgKnNjb25mOwotCi0gICAgc2NvbmYgPSAocmV3cml0ZV9zZXJ2ZXJfY29uZiAqKQotICAgICAgICAgICAgYXBfZ2V0X21vZHVsZV9jb25maWcoY21kLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsICZyZXdyaXRlX21vZHVsZSk7Ci0KLSAgICBzY29uZi0+cmV3cml0ZWxvZ2ZpbGUgPSBhMTsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqY21kX3Jld3JpdGVsb2dsZXZlbChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZGNvbmYsIGNoYXIgKmExKQotewotICAgIHJld3JpdGVfc2VydmVyX2NvbmYgKnNjb25mOwotCi0gICAgc2NvbmYgPSAocmV3cml0ZV9zZXJ2ZXJfY29uZiAqKQotICAgICAgICAgICAgYXBfZ2V0X21vZHVsZV9jb25maWcoY21kLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsICZyZXdyaXRlX21vZHVsZSk7Ci0KLSAgICBzY29uZi0+cmV3cml0ZWxvZ2xldmVsID0gYXRvaShhMSk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9yZXdyaXRlbWFwKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkY29uZiwgY2hhciAqYTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYTIpCi17Ci0gICAgcmV3cml0ZV9zZXJ2ZXJfY29uZiAqc2NvbmY7Ci0gICAgcmV3cml0ZW1hcF9lbnRyeSAqbmV3OwotICAgIHN0cnVjdCBzdGF0IHN0OwotCi0gICAgc2NvbmYgPSAocmV3cml0ZV9zZXJ2ZXJfY29uZiAqKQotICAgICAgICAgICAgYXBfZ2V0X21vZHVsZV9jb25maWcoY21kLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsICZyZXdyaXRlX21vZHVsZSk7Ci0KLSAgICBuZXcgPSBhcF9wdXNoX2FycmF5KHNjb25mLT5yZXdyaXRlbWFwcyk7Ci0KLSAgICBuZXctPm5hbWUgPSBhMTsKLSAgICBuZXctPmZ1bmMgPSBOVUxMOwotICAgIGlmIChzdHJuY21wKGEyLCAidHh0OiIsIDQpID09IDApIHsKLSAgICAgICAgbmV3LT50eXBlICAgICAgPSBNQVBUWVBFX1RYVDsKLSAgICAgICAgbmV3LT5kYXRhZmlsZSAgPSBhMis0OwotICAgICAgICBuZXctPmNoZWNrZmlsZSA9IGEyKzQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cm5jbXAoYTIsICJybmQ6IiwgNCkgPT0gMCkgewotICAgICAgICBuZXctPnR5cGUgICAgICA9IE1BUFRZUEVfUk5EOwotICAgICAgICBuZXctPmRhdGFmaWxlICA9IGEyKzQ7Ci0gICAgICAgIG5ldy0+Y2hlY2tmaWxlID0gYTIrNDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RybmNtcChhMiwgImRibToiLCA0KSA9PSAwKSB7Ci0jaWZuZGVmIE5PX0RCTV9SRVdSSVRFTUFQCi0gICAgICAgIG5ldy0+dHlwZSAgICAgID0gTUFQVFlQRV9EQk07Ci0gICAgICAgIG5ldy0+ZGF0YWZpbGUgID0gYTIrNDsKLSAgICAgICAgbmV3LT5jaGVja2ZpbGUgPSBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgYTIrNCwgTkRCTV9GSUxFX1NVRkZJWCwgTlVMTCk7Ci0jZWxzZQotICAgICAgICByZXR1cm4gYXBfcHN0cmR1cChjbWQtPnBvb2wsICJSZXdyaXRlTWFwOiBjYW5ub3QgdXNlIE5EQk0gbWFwZmlsZSwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVjYXVzZSBubyBOREJNIHN1cHBvcnQgaXMgY29tcGlsZWQgaW4iKTsKLSNlbmRpZgotICAgIH0KLSAgICBlbHNlIGlmIChzdHJuY21wKGEyLCAicHJnOiIsIDQpID09IDApIHsKLSAgICAgICAgbmV3LT50eXBlID0gTUFQVFlQRV9QUkc7Ci0gICAgICAgIG5ldy0+ZGF0YWZpbGUgPSBhMis0OwotICAgICAgICBuZXctPmNoZWNrZmlsZSA9IGEyKzQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cm5jbXAoYTIsICJpbnQ6IiwgNCkgPT0gMCkgewotICAgICAgICBuZXctPnR5cGUgICAgICA9IE1BUFRZUEVfSU5UOwotICAgICAgICBuZXctPmRhdGFmaWxlICA9IE5VTEw7Ci0gICAgICAgIG5ldy0+Y2hlY2tmaWxlID0gTlVMTDsKLSAgICAgICAgaWYgKHN0cmNtcChhMis0LCAidG9sb3dlciIpID09IDApIHsKLSAgICAgICAgICAgIG5ldy0+ZnVuYyA9IHJld3JpdGVfbWFwZnVuY190b2xvd2VyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNtcChhMis0LCAidG91cHBlciIpID09IDApIHsKLSAgICAgICAgICAgIG5ldy0+ZnVuYyA9IHJld3JpdGVfbWFwZnVuY190b3VwcGVyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNtcChhMis0LCAiZXNjYXBlIikgPT0gMCkgewotICAgICAgICAgICAgbmV3LT5mdW5jID0gcmV3cml0ZV9tYXBmdW5jX2VzY2FwZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJjbXAoYTIrNCwgInVuZXNjYXBlIikgPT0gMCkgewotICAgICAgICAgICAgbmV3LT5mdW5jID0gcmV3cml0ZV9tYXBmdW5jX3VuZXNjYXBlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHNjb25mLT5zdGF0ZSA9PSBFTkdJTkVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCAiUmV3cml0ZU1hcDogaW50ZXJuYWwgbWFwIG5vdCBmb3VuZDoiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTIrNCwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIG5ldy0+dHlwZSAgICAgID0gTUFQVFlQRV9UWFQ7Ci0gICAgICAgIG5ldy0+ZGF0YWZpbGUgID0gYTI7Ci0gICAgICAgIG5ldy0+Y2hlY2tmaWxlID0gYTI7Ci0gICAgfQotICAgIG5ldy0+ZnBpbiAgPSAtMTsKLSAgICBuZXctPmZwb3V0ID0gLTE7Ci0KLSAgICBpZiAobmV3LT5jaGVja2ZpbGUgJiYgKHNjb25mLT5zdGF0ZSA9PSBFTkdJTkVfRU5BQkxFRCkKLSAgICAgICAgJiYgKHN0YXQobmV3LT5jaGVja2ZpbGUsICZzdCkgPT0gLTEpKSB7Ci0gICAgICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlJld3JpdGVNYXA6IG1hcCBmaWxlIG9yIHByb2dyYW0gbm90IGZvdW5kOiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5ldy0+Y2hlY2tmaWxlLCBOVUxMKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9yZXdyaXRlbG9jayhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZGNvbmYsIGNoYXIgKmExKQotewotICAgIGNvbnN0IGNoYXIgKmVycm9yOwotCi0gICAgaWYgKChlcnJvciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpKSAhPSBOVUxMKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBsb2NrbmFtZSA9IGExOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjbWRfcmV3cml0ZWJhc2UoY21kX3Bhcm1zICpjbWQsIHJld3JpdGVfcGVyZGlyX2NvbmYgKmRjb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICphMSkKLXsKLSAgICBpZiAoY21kLT5wYXRoID09IE5VTEwgfHwgZGNvbmYgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gIlJld3JpdGVCYXNlOiBvbmx5IHZhbGlkIGluIHBlci1kaXJlY3RvcnkgY29uZmlnIGZpbGVzIjsKLSAgICB9Ci0gICAgaWYgKGExWzBdID09ICdcMCcpIHsKLSAgICAgICAgcmV0dXJuICJSZXdyaXRlQmFzZTogZW1wdHkgVVJMIG5vdCBhbGxvd2VkIjsKLSAgICB9Ci0gICAgaWYgKGExWzBdICE9ICcvJykgewotICAgICAgICByZXR1cm4gIlJld3JpdGVCYXNlOiBhcmd1bWVudCBpcyBub3QgYSB2YWxpZCBVUkwiOwotICAgIH0KLQotICAgIGRjb25mLT5iYXNldXJsID0gYTE7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9yZXdyaXRlY29uZChjbWRfcGFybXMgKmNtZCwgcmV3cml0ZV9wZXJkaXJfY29uZiAqZGNvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN0cikKLXsKLSAgICByZXdyaXRlX3NlcnZlcl9jb25mICpzY29uZjsKLSAgICByZXdyaXRlY29uZF9lbnRyeSAqbmV3OwotICAgIHJlZ2V4X3QgKnJlZ2V4cDsKLSAgICBjaGFyICphMTsKLSAgICBjaGFyICphMjsKLSAgICBjaGFyICphMzsKLSAgICBjaGFyICpjcDsKLSAgICBjb25zdCBjaGFyICplcnI7Ci0gICAgaW50IHJjOwotCi0gICAgc2NvbmYgPSAocmV3cml0ZV9zZXJ2ZXJfY29uZiAqKQotICAgICAgICAgICAgYXBfZ2V0X21vZHVsZV9jb25maWcoY21kLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsICZyZXdyaXRlX21vZHVsZSk7Ci0KLSAgICAvKiAgbWFrZSBhIG5ldyBlbnRyeSBpbiB0aGUgaW50ZXJuYWwgdGVtcG9yYXJ5IHJld3JpdGUgcnVsZSBsaXN0ICovCi0gICAgaWYgKGNtZC0+cGF0aCA9PSBOVUxMKSB7ICAgLyogaXMgc2VydmVyIGNvbW1hbmQgKi8KLSAgICAgICAgbmV3ID0gYXBfcHVzaF9hcnJheShzY29uZi0+cmV3cml0ZWNvbmRzKTsKLSAgICB9Ci0gICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgLyogaXMgcGVyLWRpcmVjdG9yeSBjb21tYW5kICovCi0gICAgICAgIG5ldyA9IGFwX3B1c2hfYXJyYXkoZGNvbmYtPnJld3JpdGVjb25kcyk7Ci0gICAgfQotCi0gICAgLyogIHBhcnNlIHRoZSBhcmd1bWVudCBsaW5lIG91cnNlbGYgKi8KLSAgICBpZiAocGFyc2VhcmdsaW5lKHN0ciwgJmExLCAmYTIsICZhMykpIHsKLSAgICAgICAgcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCAiUmV3cml0ZUNvbmQ6IGJhZCBhcmd1bWVudCBsaW5lICciLCBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICInXG4iLCBOVUxMKTsKLSAgICB9Ci0KLSAgICAvKiAgYXJnMTogdGhlIGlucHV0IHN0cmluZyAqLwotICAgIG5ldy0+aW5wdXQgPSBhcF9wc3RyZHVwKGNtZC0+cG9vbCwgYTEpOwotCi0gICAgLyogYXJnMzogb3B0aW9uYWwgZmxhZ3MgZmllbGQKLSAgICAgICAodGhpcyBoYXZlIHRvIGJlIGZpcnN0IHBhcnNlZCwgYmVjYXVzZSB3ZSBuZWVkIHRvCi0gICAgICAgIGtub3cgaWYgdGhlIHJlZ2V4IHNob3VsZCBiZSBjb21waWxlZCB3aXRoIElDQVNFISkgKi8KLSAgICBuZXctPmZsYWdzID0gQ09OREZMQUdfTk9ORTsKLSAgICBpZiAoYTMgIT0gTlVMTCkgewotICAgICAgICBpZiAoKGVyciA9IGNtZF9yZXdyaXRlY29uZF9wYXJzZWZsYWdmaWVsZChjbWQtPnBvb2wsIG5ldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTMpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogIGFyZzI6IHRoZSBwYXR0ZXJuCi0gICAgICAgIHRyeSB0byBjb21waWxlIHRoZSByZWdleHAgdG8gdGVzdCBpZiBpcyBvayAqLwotICAgIGNwID0gYTI7Ci0gICAgaWYgKGNwWzBdID09ICchJykgewotICAgICAgICBuZXctPmZsYWdzIHw9IENPTkRGTEFHX05PVE1BVENIOwotICAgICAgICBjcCsrOwotICAgIH0KLQotICAgIC8qIG5vdyBiZSBjYXJlZnVsOiBVbmRlciB0aGUgUE9TSVggcmVnZXggbGlicmFyeQotICAgICAgIHdlIGNhbiBjb21waWxlIHRoZSBwYXR0ZXJuIGZvciBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nLAotICAgICAgIHVuZGVyIHRoZSBvbGQgVjggbGlicmFyeSB3ZSBoYXZlIHRvIGRvIGl0IHNlbGYgdmlhIGEgaGFjayAqLwotICAgIGlmIChuZXctPmZsYWdzICYgQ09OREZMQUdfTk9DQVNFKSB7Ci0gICAgICAgIHJjID0gKChyZWdleHAgPSBhcF9wcmVnY29tcChjbWQtPnBvb2wsIGNwLCBSRUdfRVhURU5ERUR8UkVHX0lDQVNFKSkKLSAgICAgICAgICAgICAgPT0gTlVMTCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByYyA9ICgocmVnZXhwID0gYXBfcHJlZ2NvbXAoY21kLT5wb29sLCBjcCwgUkVHX0VYVEVOREVEKSkgPT0gTlVMTCk7Ci0gICAgfQotICAgIGlmIChyYykgewotICAgICAgICByZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJSZXdyaXRlQ29uZDogY2Fubm90IGNvbXBpbGUgcmVndWxhciBleHByZXNzaW9uICciLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhMiwgIidcbiIsIE5VTEwpOwotICAgIH0KLQotICAgIG5ldy0+cGF0dGVybiA9IGFwX3BzdHJkdXAoY21kLT5wb29sLCBjcCk7Ci0gICAgbmV3LT5yZWdleHAgID0gcmVnZXhwOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjbWRfcmV3cml0ZWNvbmRfcGFyc2VmbGFnZmllbGQocG9vbCAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0ZWNvbmRfZW50cnkgKmNmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3RyKQotewotICAgIGNoYXIgKmNwOwotICAgIGNoYXIgKmNwMTsKLSAgICBjaGFyICpjcDI7Ci0gICAgY2hhciAqY3AzOwotICAgIGNoYXIgKmtleTsKLSAgICBjaGFyICp2YWw7Ci0gICAgY29uc3QgY2hhciAqZXJyOwotCi0gICAgaWYgKHN0clswXSAhPSAnWycgfHwgc3RyW3N0cmxlbihzdHIpLTFdICE9ICddJykgewotICAgICAgICByZXR1cm4gIlJld3JpdGVDb25kOiBiYWQgZmxhZyBkZWxpbWl0ZXJzIjsKLSAgICB9Ci0KLSAgICBjcCA9IHN0cisxOwotICAgIHN0cltzdHJsZW4oc3RyKS0xXSA9ICcsJzsgLyogZm9yIHNpbXBsZXIgcGFyc2luZyAqLwotICAgIGZvciAoIDsgKmNwICE9ICdcMCc7ICkgewotICAgICAgICAvKiBza2lwIHdoaXRlc3BhY2VzICovCi0gICAgICAgIGZvciAoIDsgKCpjcCA9PSAnICcgfHwgKmNwID09ICdcdCcpICYmICpjcCAhPSAnXDAnOyBjcCsrKQotICAgICAgICAgICAgOwotICAgICAgICBpZiAoKmNwID09ICdcMCcpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNwMSA9IGNwOwotICAgICAgICBpZiAoKGNwMiA9IHN0cmNocihjcCwgJywnKSkgIT0gTlVMTCkgewotICAgICAgICAgICAgY3AgPSBjcDIrMTsKLSAgICAgICAgICAgIGZvciAoIDsgKCooY3AyLTEpID09ICcgJyB8fCAqKGNwMi0xKSA9PSAnXHQnKTsgY3AyLS0pCi0gICAgICAgICAgICAgICAgOwotICAgICAgICAgICAgKmNwMiA9ICdcMCc7Ci0gICAgICAgICAgICBpZiAoKGNwMyA9IHN0cmNocihjcDEsICc9JykpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqY3AzID0gJ1wwJzsKLSAgICAgICAgICAgICAgICBrZXkgPSBjcDE7Ci0gICAgICAgICAgICAgICAgdmFsID0gY3AzKzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBrZXkgPSBjcDE7Ci0gICAgICAgICAgICAgICAgdmFsID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGVyciA9IGNtZF9yZXdyaXRlY29uZF9zZXRmbGFnKHAsIGNmZywga2V5LCB2YWwpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjbWRfcmV3cml0ZWNvbmRfc2V0ZmxhZyhwb29sICpwLCByZXdyaXRlY29uZF9lbnRyeSAqY2ZnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmtleSwgY2hhciAqdmFsKQotewotICAgIGlmICggICBzdHJjYXNlY21wKGtleSwgIm5vY2FzZSIpID09IDAKLSAgICAgICAgfHwgc3RyY2FzZWNtcChrZXksICJOQyIpID09IDAgICAgKSB7Ci0gICAgICAgIGNmZy0+ZmxhZ3MgfD0gQ09OREZMQUdfTk9DQVNFOwotICAgIH0KLSAgICBlbHNlIGlmICggICBzdHJjYXNlY21wKGtleSwgIm9ybmV4dCIpID09IDAKLSAgICAgICAgICAgICB8fCBzdHJjYXNlY21wKGtleSwgIk9SIikgPT0gMCAgICApIHsKLSAgICAgICAgY2ZnLT5mbGFncyB8PSBDT05ERkxBR19PUk5FWFQ7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXR1cm4gYXBfcHN0cmNhdChwLCAiUmV3cml0ZUNvbmQ6IHVua25vd24gZmxhZyAnIiwga2V5LCAiJ1xuIiwgTlVMTCk7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqY21kX3Jld3JpdGVydWxlKGNtZF9wYXJtcyAqY21kLCByZXdyaXRlX3BlcmRpcl9jb25mICpkY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3RyKQotewotICAgIHJld3JpdGVfc2VydmVyX2NvbmYgKnNjb25mOwotICAgIHJld3JpdGVydWxlX2VudHJ5ICpuZXc7Ci0gICAgcmVnZXhfdCAqcmVnZXhwOwotICAgIGNoYXIgKmExOwotICAgIGNoYXIgKmEyOwotICAgIGNoYXIgKmEzOwotICAgIGNoYXIgKmNwOwotICAgIGNvbnN0IGNoYXIgKmVycjsKLSAgICBpbnQgbW9kZTsKLQotICAgIHNjb25mID0gKHJld3JpdGVfc2VydmVyX2NvbmYgKikKLSAgICAgICAgICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKGNtZC0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCAmcmV3cml0ZV9tb2R1bGUpOwotCi0gICAgLyogIG1ha2UgYSBuZXcgZW50cnkgaW4gdGhlIGludGVybmFsIHJld3JpdGUgcnVsZSBsaXN0ICovCi0gICAgaWYgKGNtZC0+cGF0aCA9PSBOVUxMKSB7ICAgLyogaXMgc2VydmVyIGNvbW1hbmQgKi8KLSAgICAgICAgbmV3ID0gYXBfcHVzaF9hcnJheShzY29uZi0+cmV3cml0ZXJ1bGVzKTsKLSAgICB9Ci0gICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgLyogaXMgcGVyLWRpcmVjdG9yeSBjb21tYW5kICovCi0gICAgICAgIG5ldyA9IGFwX3B1c2hfYXJyYXkoZGNvbmYtPnJld3JpdGVydWxlcyk7Ci0gICAgfQotCi0gICAgLyogIHBhcnNlIHRoZSBhcmd1bWVudCBsaW5lIG91cnNlbGYgKi8KLSAgICBpZiAocGFyc2VhcmdsaW5lKHN0ciwgJmExLCAmYTIsICZhMykpIHsKLSAgICAgICAgcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCAiUmV3cml0ZVJ1bGU6IGJhZCBhcmd1bWVudCBsaW5lICciLCBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICInXG4iLCBOVUxMKTsKLSAgICB9Ci0KLSAgICAvKiBhcmczOiBvcHRpb25hbCBmbGFncyBmaWVsZCAqLwotICAgIG5ldy0+Zm9yY2VkX21pbWV0eXBlICAgICA9IE5VTEw7Ci0gICAgbmV3LT5mb3JjZWRfcmVzcG9uc2Vjb2RlID0gSFRUUF9NT1ZFRF9URU1QT1JBUklMWTsKLSAgICBuZXctPmZsYWdzICA9IFJVTEVGTEFHX05PTkU7Ci0gICAgbmV3LT5lbnZbMF0gPSBOVUxMOwotICAgIG5ldy0+c2tpcCAgID0gMDsKLSAgICBpZiAoYTMgIT0gTlVMTCkgewotICAgICAgICBpZiAoKGVyciA9IGNtZF9yZXdyaXRlcnVsZV9wYXJzZWZsYWdmaWVsZChjbWQtPnBvb2wsIG5ldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTMpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogIGFyZzE6IHRoZSBwYXR0ZXJuCi0gICAgICogIHRyeSB0byBjb21waWxlIHRoZSByZWdleHAgdG8gdGVzdCBpZiBpcyBvawotICAgICAqLwotICAgIGNwID0gYTE7Ci0gICAgaWYgKGNwWzBdID09ICchJykgewotICAgICAgICBuZXctPmZsYWdzIHw9IFJVTEVGTEFHX05PVE1BVENIOwotICAgICAgICBjcCsrOwotICAgIH0KLSAgICBtb2RlID0gUkVHX0VYVEVOREVEOwotICAgIGlmIChuZXctPmZsYWdzICYgUlVMRUZMQUdfTk9DQVNFKSB7Ci0gICAgICAgIG1vZGUgfD0gUkVHX0lDQVNFOwotICAgIH0KLSAgICBpZiAoKHJlZ2V4cCA9IGFwX3ByZWdjb21wKGNtZC0+cG9vbCwgY3AsIG1vZGUpKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlJld3JpdGVSdWxlOiBjYW5ub3QgY29tcGlsZSByZWd1bGFyIGV4cHJlc3Npb24gJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGExLCAiJ1xuIiwgTlVMTCk7Ci0gICAgfQotICAgIG5ldy0+cGF0dGVybiA9IGFwX3BzdHJkdXAoY21kLT5wb29sLCBjcCk7Ci0gICAgbmV3LT5yZWdleHAgID0gcmVnZXhwOwotCi0gICAgLyogIGFyZzI6IHRoZSBvdXRwdXQgc3RyaW5nCi0gICAgICogIHJlcGxhY2UgdGhlICQ8Tj4gYnkgXDxuPiB3aGljaCBpcyBuZWVkZWQgYnkgdGhlIGN1cnJlbnRseQotICAgICAqICB1c2VkIFJlZ3VsYXIgRXhwcmVzc2lvbiBsaWJyYXJ5Ci0gICAgICovCi0gICAgbmV3LT5vdXRwdXQgPSBhcF9wc3RyZHVwKGNtZC0+cG9vbCwgYTIpOwotCi0gICAgLyogbm93LCBpZiB0aGUgc2VydmVyIG9yIHBlci1kaXIgY29uZmlnIGhvbGRzIGFuCi0gICAgICogYXJyYXkgb2YgUmV3cml0ZUNvbmQgZW50cmllcywgd2UgdGFrZSBpdCBmb3IgdXMKLSAgICAgKiBhbmQgY2xlYXIgdGhlIGFycmF5Ci0gICAgICovCi0gICAgaWYgKGNtZC0+cGF0aCA9PSBOVUxMKSB7ICAvKiBpcyBzZXJ2ZXIgY29tbWFuZCAqLwotICAgICAgICBuZXctPnJld3JpdGVjb25kcyAgID0gc2NvbmYtPnJld3JpdGVjb25kczsKLSAgICAgICAgc2NvbmYtPnJld3JpdGVjb25kcyA9IGFwX21ha2VfYXJyYXkoY21kLT5wb29sLCAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocmV3cml0ZWNvbmRfZW50cnkpKTsKLSAgICB9Ci0gICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBpcyBwZXItZGlyZWN0b3J5IGNvbW1hbmQgKi8KLSAgICAgICAgbmV3LT5yZXdyaXRlY29uZHMgICA9IGRjb25mLT5yZXdyaXRlY29uZHM7Ci0gICAgICAgIGRjb25mLT5yZXdyaXRlY29uZHMgPSBhcF9tYWtlX2FycmF5KGNtZC0+cG9vbCwgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJld3JpdGVjb25kX2VudHJ5KSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjbWRfcmV3cml0ZXJ1bGVfcGFyc2VmbGFnZmllbGQocG9vbCAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0ZXJ1bGVfZW50cnkgKmNmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3RyKQotewotICAgIGNoYXIgKmNwOwotICAgIGNoYXIgKmNwMTsKLSAgICBjaGFyICpjcDI7Ci0gICAgY2hhciAqY3AzOwotICAgIGNoYXIgKmtleTsKLSAgICBjaGFyICp2YWw7Ci0gICAgY29uc3QgY2hhciAqZXJyOwotCi0gICAgaWYgKHN0clswXSAhPSAnWycgfHwgc3RyW3N0cmxlbihzdHIpLTFdICE9ICddJykgewotICAgICAgICByZXR1cm4gIlJld3JpdGVSdWxlOiBiYWQgZmxhZyBkZWxpbWl0ZXJzIjsKLSAgICB9Ci0KLSAgICBjcCA9IHN0cisxOwotICAgIHN0cltzdHJsZW4oc3RyKS0xXSA9ICcsJzsgLyogZm9yIHNpbXBsZXIgcGFyc2luZyAqLwotICAgIGZvciAoIDsgKmNwICE9ICdcMCc7ICkgewotICAgICAgICAvKiBza2lwIHdoaXRlc3BhY2VzICovCi0gICAgICAgIGZvciAoIDsgKCpjcCA9PSAnICcgfHwgKmNwID09ICdcdCcpICYmICpjcCAhPSAnXDAnOyBjcCsrKQotICAgICAgICAgICAgOwotICAgICAgICBpZiAoKmNwID09ICdcMCcpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNwMSA9IGNwOwotICAgICAgICBpZiAoKGNwMiA9IHN0cmNocihjcCwgJywnKSkgIT0gTlVMTCkgewotICAgICAgICAgICAgY3AgPSBjcDIrMTsKLSAgICAgICAgICAgIGZvciAoIDsgKCooY3AyLTEpID09ICcgJyB8fCAqKGNwMi0xKSA9PSAnXHQnKTsgY3AyLS0pCi0gICAgICAgICAgICAgICAgOwotICAgICAgICAgICAgKmNwMiA9ICdcMCc7Ci0gICAgICAgICAgICBpZiAoKGNwMyA9IHN0cmNocihjcDEsICc9JykpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqY3AzID0gJ1wwJzsKLSAgICAgICAgICAgICAgICBrZXkgPSBjcDE7Ci0gICAgICAgICAgICAgICAgdmFsID0gY3AzKzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBrZXkgPSBjcDE7Ci0gICAgICAgICAgICAgICAgdmFsID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGVyciA9IGNtZF9yZXdyaXRlcnVsZV9zZXRmbGFnKHAsIGNmZywga2V5LCB2YWwpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjbWRfcmV3cml0ZXJ1bGVfc2V0ZmxhZyhwb29sICpwLCByZXdyaXRlcnVsZV9lbnRyeSAqY2ZnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmtleSwgY2hhciAqdmFsKQotewotICAgIGludCBzdGF0dXMgPSAwOwotICAgIGludCBpOwotCi0gICAgaWYgKCAgIHN0cmNhc2VjbXAoa2V5LCAicmVkaXJlY3QiKSA9PSAwCi0gICAgICAgIHx8IHN0cmNhc2VjbXAoa2V5LCAiUiIpID09IDAgICAgICAgKSB7Ci0gICAgICAgIGNmZy0+ZmxhZ3MgfD0gUlVMRUZMQUdfRk9SQ0VSRURJUkVDVDsKLSAgICAgICAgaWYgKHN0cmxlbih2YWwpID4gMCkgewotICAgICAgICAgICAgaWYgKHN0cmNhc2VjbXAodmFsLCAicGVybWFuZW50IikgPT0gMCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEhUVFBfTU9WRURfUEVSTUFORU5UTFk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhbCwgInRlbXAiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSFRUUF9NT1ZFRF9URU1QT1JBUklMWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodmFsLCAic2Vlb3RoZXIiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSFRUUF9TRUVfT1RIRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChhcF9pc2RpZ2l0KCp2YWwpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gYXRvaSh2YWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFhcF9pc19IVFRQX1JFRElSRUNUKHN0YXR1cykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlJld3JpdGVSdWxlOiBpbnZhbGlkIEhUVFAgcmVzcG9uc2UgY29kZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICJmb3IgZmxhZyAnUiciOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2ZnLT5mb3JjZWRfcmVzcG9uc2Vjb2RlID0gc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKCAgIHN0cmNhc2VjbXAoa2V5LCAibGFzdCIpID09IDAKLSAgICAgICAgICAgICB8fCBzdHJjYXNlY21wKGtleSwgIkwiKSA9PSAwICAgKSB7Ci0gICAgICAgIGNmZy0+ZmxhZ3MgfD0gUlVMRUZMQUdfTEFTVFJVTEU7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAgIHN0cmNhc2VjbXAoa2V5LCAibmV4dCIpID09IDAKLSAgICAgICAgICAgICB8fCBzdHJjYXNlY21wKGtleSwgIk4iKSA9PSAwICAgKSB7Ci0gICAgICAgIGNmZy0+ZmxhZ3MgfD0gUlVMRUZMQUdfTkVXUk9VTkQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAgIHN0cmNhc2VjbXAoa2V5LCAiY2hhaW4iKSA9PSAwCi0gICAgICAgICAgICAgfHwgc3RyY2FzZWNtcChrZXksICJDIikgPT0gMCAgICApIHsKLSAgICAgICAgY2ZnLT5mbGFncyB8PSBSVUxFRkxBR19DSEFJTjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoICAgc3RyY2FzZWNtcChrZXksICJ0eXBlIikgPT0gMAotICAgICAgICAgICAgIHx8IHN0cmNhc2VjbXAoa2V5LCAiVCIpID09IDAgICApIHsKLSAgICAgICAgY2ZnLT5mb3JjZWRfbWltZXR5cGUgPSBhcF9wc3RyZHVwKHAsIHZhbCk7Ci0gICAgICAgIGFwX3N0cl90b2xvd2VyKGNmZy0+Zm9yY2VkX21pbWV0eXBlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoICAgc3RyY2FzZWNtcChrZXksICJlbnYiKSA9PSAwCi0gICAgICAgICAgICAgfHwgc3RyY2FzZWNtcChrZXksICJFIikgPT0gMCAgICkgewotICAgICAgICBmb3IgKGkgPSAwOyAoY2ZnLT5lbnZbaV0gIT0gTlVMTCkgJiYgKGkgPCBNQVhfRU5WX0ZMQUdTKTsgaSsrKQotICAgICAgICAgICAgOwotICAgICAgICBpZiAoaSA8IE1BWF9FTlZfRkxBR1MpIHsKLSAgICAgICAgICAgIGNmZy0+ZW52W2ldID0gYXBfcHN0cmR1cChwLCB2YWwpOwotICAgICAgICAgICAgY2ZnLT5lbnZbaSsxXSA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIlJld3JpdGVSdWxlOiB0b28gbWFueSBlbnZpcm9ubWVudCBmbGFncyAnRSciOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKCAgIHN0cmNhc2VjbXAoa2V5LCAibm9zdWJyZXEiKSA9PSAwCi0gICAgICAgICAgICAgfHwgc3RyY2FzZWNtcChrZXksICJOUyIpID09IDAgICAgICApIHsKLSAgICAgICAgY2ZnLT5mbGFncyB8PSBSVUxFRkxBR19JR05PUkVPTlNVQlJFUTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoICAgc3RyY2FzZWNtcChrZXksICJwcm94eSIpID09IDAKLSAgICAgICAgICAgICB8fCBzdHJjYXNlY21wKGtleSwgIlAiKSA9PSAwICAgICAgKSB7Ci0gICAgICAgIGNmZy0+ZmxhZ3MgfD0gUlVMRUZMQUdfUFJPWFk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAgIHN0cmNhc2VjbXAoa2V5LCAicGFzc3Rocm91Z2giKSA9PSAwCi0gICAgICAgICAgICAgfHwgc3RyY2FzZWNtcChrZXksICJQVCIpID09IDAgICAgICApIHsKLSAgICAgICAgY2ZnLT5mbGFncyB8PSBSVUxFRkxBR19QQVNTVEhST1VHSDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoICAgc3RyY2FzZWNtcChrZXksICJza2lwIikgPT0gMAotICAgICAgICAgICAgIHx8IHN0cmNhc2VjbXAoa2V5LCAiUyIpID09IDAgICApIHsKLSAgICAgICAgY2ZnLT5za2lwID0gYXRvaSh2YWwpOwotICAgIH0KLSAgICBlbHNlIGlmICggICBzdHJjYXNlY21wKGtleSwgImZvcmJpZGRlbiIpID09IDAKLSAgICAgICAgICAgICB8fCBzdHJjYXNlY21wKGtleSwgIkYiKSA9PSAwICAgKSB7Ci0gICAgICAgIGNmZy0+ZmxhZ3MgfD0gUlVMRUZMQUdfRk9SQklEREVOOwotICAgIH0KLSAgICBlbHNlIGlmICggICBzdHJjYXNlY21wKGtleSwgImdvbmUiKSA9PSAwCi0gICAgICAgICAgICAgfHwgc3RyY2FzZWNtcChrZXksICJHIikgPT0gMCAgICkgewotICAgICAgICBjZmctPmZsYWdzIHw9IFJVTEVGTEFHX0dPTkU7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAgIHN0cmNhc2VjbXAoa2V5LCAicXNhcHBlbmQiKSA9PSAwCi0gICAgICAgICAgICAgfHwgc3RyY2FzZWNtcChrZXksICJRU0EiKSA9PSAwICAgKSB7Ci0gICAgICAgIGNmZy0+ZmxhZ3MgfD0gUlVMRUZMQUdfUVNBUFBFTkQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAgIHN0cmNhc2VjbXAoa2V5LCAibm9jYXNlIikgPT0gMAotICAgICAgICAgICAgIHx8IHN0cmNhc2VjbXAoa2V5LCAiTkMiKSA9PSAwICAgICkgewotICAgICAgICBjZmctPmZsYWdzIHw9IFJVTEVGTEFHX05PQ0FTRTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJldHVybiBhcF9wc3RyY2F0KHAsICJSZXdyaXRlUnVsZTogdW5rbm93biBmbGFnICciLCBrZXksICInXG4iLCBOVUxMKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotLyoKLSoqCi0qKiAgR2xvYmFsIE1vZHVsZSBJbml0aWFsaXphdGlvbgotKiogIFtjYWxsZWQgZnJvbSByZWFkX2NvbmZpZygpIGFmdGVyIGFsbAotKiogIGNvbmZpZyBjb21tYW5kcyB3ZXJlIGFscmVhZHkgY2FsbGVkXQotKioKLSovCi0KLXN0YXRpYyB2b2lkIGluaXRfbW9kdWxlKHNlcnZlcl9yZWMgKnMsIHBvb2wgKnApCi17Ci0gICAgLyogY2hlY2sgaWYgcHJveHkgbW9kdWxlIGlzIGF2YWlsYWJsZSAqLwotICAgIHByb3h5X2F2YWlsYWJsZSA9IChhcF9maW5kX2xpbmtlZF9tb2R1bGUoIm1vZF9wcm94eS5jIikgIT0gTlVMTCk7Ci0KLSAgICAvKiBjcmVhdGUgdGhlIHJld3JpdGluZyBsb2NrZmlsZSBpbiB0aGUgcGFyZW50ICovCi0gICAgcmV3cml0ZWxvY2tfY3JlYXRlKHMsIHApOwotICAgIGFwX3JlZ2lzdGVyX2NsZWFudXAocCwgKHZvaWQgKilzLCByZXdyaXRlbG9ja19yZW1vdmUsIGFwX251bGxfY2xlYW51cCk7Ci0KLSAgICAvKiBzdGVwIHRocm91Z2ggdGhlIHNlcnZlcnMgYW5kCi0gICAgICogLSBvcGVuIGVhY2ggcmV3cml0aW5nIGxvZ2ZpbGUKLSAgICAgKiAtIG9wZW4gdGhlIFJld3JpdGVNYXAgcHJnOnh4eCBwcm9ncmFtcwotICAgICAqLwotICAgIGZvciAoOyBzOyBzID0gcy0+bmV4dCkgewotICAgICAgICBvcGVuX3Jld3JpdGVsb2cocywgcCk7Ci0gICAgICAgIHJ1bl9yZXdyaXRlbWFwX3Byb2dyYW1zKHMsIHApOwotICAgIH0KLX0KLQotCi0vKgotKioKLSoqICBQZXItQ2hpbGQgTW9kdWxlIEluaXRpYWxpemF0aW9uCi0qKiAgW2NhbGxlZCBhZnRlciBhIGNoaWxkIHByb2Nlc3MgaXMgc3Bhd25lZF0KLSoqCi0qLwotCi1zdGF0aWMgdm9pZCBpbml0X2NoaWxkKHNlcnZlcl9yZWMgKnMsIHBvb2wgKnApCi17Ci0gICAgIC8qIG9wZW4gdGhlIHJld3JpdGluZyBsb2NrZmlsZSAqLwotICAgICByZXdyaXRlbG9ja19vcGVuKHMsIHApOwotCi0gICAgIC8qIGNyZWF0ZSB0aGUgbG9va3VwIGNhY2hlICovCi0gICAgIGNhY2hlcCA9IGluaXRfY2FjaGUocCk7Ci19Ci0KLQotLyoKLSoqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKiogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qKiB8ICAgICAgICAgICAgICAgICAgICAgcnVudGltZSBob29rcwotKiogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi0KLS8qCi0qKgotKiogIFVSSS10by1maWxlbmFtZSBob29rCi0qKgotKiogIFt1c2VkIGZvciB0aGUgcmV3cml0aW5nIGVuZ2luZSB0cmlnZ2VyZWQgYnkKLSoqICB0aGUgcGVyLXNlcnZlciAnUmV3cml0ZVJ1bGUnIGRpcmVjdGl2ZXNdCi0qKgotKi8KLQotc3RhdGljIGludCBob29rX3VyaTJmaWxlKHJlcXVlc3RfcmVjICpyKQotewotICAgIHZvaWQgKnNjb25mOwotICAgIHJld3JpdGVfc2VydmVyX2NvbmYgKmNvbmY7Ci0gICAgY29uc3QgY2hhciAqdmFyOwotICAgIGNvbnN0IGNoYXIgKnRoaXNzZXJ2ZXI7Ci0gICAgY2hhciAqdGhpc3BvcnQ7Ci0gICAgY29uc3QgY2hhciAqdGhpc3VybDsKLSAgICBjaGFyIGJ1Zls1MTJdOwotICAgIGNoYXIgZG9jcm9vdFs1MTJdOwotICAgIGNoYXIgKmNwLCAqY3AyOwotICAgIGNvbnN0IGNoYXIgKmNjcDsKLSAgICBzdHJ1Y3Qgc3RhdCBmaW5mbzsKLSAgICB1bnNpZ25lZCBpbnQgcG9ydDsKLSAgICBpbnQgbjsKLSAgICBpbnQgbDsKLQotICAgIC8qCi0gICAgICogIHJldHJpZXZlIHRoZSBjb25maWcgc3RydWN0dXJlcwotICAgICAqLwotICAgIHNjb25mID0gci0+c2VydmVyLT5tb2R1bGVfY29uZmlnOwotICAgIGNvbmYgID0gKHJld3JpdGVfc2VydmVyX2NvbmYgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhzY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJld3JpdGVfbW9kdWxlKTsKLQotICAgIC8qCi0gICAgICogIG9ubHkgZG8gc29tZXRoaW5nIHVuZGVyIHJ1bnRpbWUgaWYgdGhlIGVuZ2luZSBpcyByZWFsbHkgZW5hYmxlZCwKLSAgICAgKiAgZWxzZSByZXR1cm4gaW1tZWRpYXRlbHkhCi0gICAgICovCi0gICAgaWYgKGNvbmYtPnN0YXRlID09IEVOR0lORV9ESVNBQkxFRCkgewotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgY2hlY2sgZm9yIHRoZSB1Z2x5IEFQSSBjYXNlIG9mIGEgdmlydHVhbCBob3N0IHNlY3Rpb24gd2hlcmUgbm8KLSAgICAgKiAgbW9kX3Jld3JpdGUgZGlyZWN0aXZlcyBleGlzdHMuIEluIHRoaXMgc2l0dWF0aW9uIHdlIGJlY2FtZSBubyBjaGFuY2UKLSAgICAgKiAgYnkgdGhlIEFQSSB0byBzZXR1cCBvdXIgZGVmYXVsdCBwZXItc2VydmVyIGNvbmZpZyBzbyB3ZSBoYXZlIHRvCi0gICAgICogIG9uLXRoZS1mbHkgYXNzdW1lIHdlIGhhdmUgdGhlIGRlZmF1bHQgY29uZmlnLiBCdXQgYmVjYXVzZSB0aGUgZGVmYXVsdAotICAgICAqICBjb25maWcgaGFzIGEgZGlzYWJsZWQgcmV3cml0aW5nIGVuZ2luZSB3ZSBhcmUgbHVja3kgYmVjYXVzZSBjYW4KLSAgICAgKiAganVzdCBzdG9wIG9wZXJhdGluZyBub3cuCi0gICAgICovCi0gICAgaWYgKGNvbmYtPnNlcnZlciAhPSByLT5zZXJ2ZXIpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIGFkZCB0aGUgU0NSSVBUX1VSTCB2YXJpYWJsZSB0byB0aGUgZW52LiB0aGlzIGlzIGEgYml0IGNvbXBsaWNhdGVkCi0gICAgICogIGR1ZSB0byB0aGUgZmFjdCB0aGF0IGFwYWNoZSB1c2VzIHN1YnJlcXVlc3RzIGFuZCBpbnRlcm5hbCByZWRpcmVjdHMKLSAgICAgKi8KLQotICAgIGlmIChyLT5tYWluID09IE5VTEwpIHsKLSAgICAgICAgIHZhciA9IGFwX3BzdHJjYXQoci0+cG9vbCwgIlJFRElSRUNUXyIsIEVOVlZBUl9TQ1JJUFRfVVJMLCBOVUxMKTsKLSAgICAgICAgIHZhciA9IGFwX3RhYmxlX2dldChyLT5zdWJwcm9jZXNzX2VudiwgdmFyKTsKLSAgICAgICAgIGlmICh2YXIgPT0gTlVMTCkgewotICAgICAgICAgICAgIGFwX3RhYmxlX3NldG4oci0+c3VicHJvY2Vzc19lbnYsIEVOVlZBUl9TQ1JJUFRfVVJMLCByLT51cmkpOwotICAgICAgICAgfQotICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgYXBfdGFibGVfc2V0bihyLT5zdWJwcm9jZXNzX2VudiwgRU5WVkFSX1NDUklQVF9VUkwsIHZhcik7Ci0gICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAgdmFyID0gYXBfdGFibGVfZ2V0KHItPm1haW4tPnN1YnByb2Nlc3NfZW52LCBFTlZWQVJfU0NSSVBUX1VSTCk7Ci0gICAgICAgICBhcF90YWJsZV9zZXRuKHItPnN1YnByb2Nlc3NfZW52LCBFTlZWQVJfU0NSSVBUX1VSTCwgdmFyKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICBjcmVhdGUgdGhlIFNDUklQVF9VUkkgdmFyaWFibGUgZm9yIHRoZSBlbnYKLSAgICAgKi8KLQotICAgIC8qIGFkZCB0aGUgY2Fub25pY2FsIFVSSSBvZiB0aGlzIFVSTCAqLwotICAgIHRoaXNzZXJ2ZXIgPSBhcF9nZXRfc2VydmVyX25hbWUocik7Ci0gICAgcG9ydCA9IGFwX2dldF9zZXJ2ZXJfcG9ydChyKTsKLSAgICBpZiAoYXBfaXNfZGVmYXVsdF9wb3J0KHBvcnQsIHIpKSB7Ci0gICAgICAgIHRoaXNwb3J0ID0gIiI7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBhcF9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiOiV1IiwgcG9ydCk7Ci0gICAgICAgIHRoaXNwb3J0ID0gYnVmOwotICAgIH0KLSAgICB0aGlzdXJsID0gYXBfdGFibGVfZ2V0KHItPnN1YnByb2Nlc3NfZW52LCBFTlZWQVJfU0NSSVBUX1VSTCk7Ci0KLSAgICAvKiBzZXQgdGhlIHZhcmlhYmxlICovCi0gICAgdmFyID0gYXBfcHN0cmNhdChyLT5wb29sLCBhcF9odHRwX21ldGhvZChyKSwgIjovLyIsIHRoaXNzZXJ2ZXIsIHRoaXNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgdGhpc3VybCwgTlVMTCk7Ci0gICAgYXBfdGFibGVfc2V0bihyLT5zdWJwcm9jZXNzX2VudiwgRU5WVkFSX1NDUklQVF9VUkksIHZhcik7Ci0KLSAgICAvKiBpZiBmaWxlbmFtZSB3YXMgbm90IGluaXRpYWxseSBzZXQsCi0gICAgICogd2Ugc3RhcnQgd2l0aCB0aGUgcmVxdWVzdGVkIFVSSQotICAgICAqLwotICAgIGlmIChyLT5maWxlbmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmR1cChyLT5wb29sLCByLT51cmkpOwotICAgICAgICByZXdyaXRlbG9nKHIsIDIsICJpbml0IHJld3JpdGUgZW5naW5lIHdpdGggcmVxdWVzdGVkIHVyaSAlcyIsCi0gICAgICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIG5vdyBhcHBseSB0aGUgcnVsZXMgLi4uCi0gICAgICovCi0gICAgaWYgKGFwcGx5X3Jld3JpdGVfbGlzdChyLCBjb25mLT5yZXdyaXRlcnVsZXMsIE5VTEwpKSB7Ci0KLSAgICAgICAgaWYgKHN0cmxlbihyLT5maWxlbmFtZSkgPiA2ICYmCi0gICAgICAgICAgICBzdHJuY21wKHItPmZpbGVuYW1lLCAicHJveHk6IiwgNikgPT0gMCkgewotICAgICAgICAgICAgLyogaXQgc2hvdWxkIGJlIGdvIG9uIGFzIGFuIGludGVybmFsIHByb3h5IHJlcXVlc3QgKi8KLQotICAgICAgICAgICAgLyogY2hlY2sgaWYgdGhlIHByb3h5IG1vZHVsZSBpcyBlbmFibGVkLCBzbwotICAgICAgICAgICAgICogd2UgY2FuIGFjdHVhbGx5IHVzZSBpdCEKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCFwcm94eV9hdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0ZW1wdCB0byBtYWtlIHJlbW90ZSByZXF1ZXN0IGZyb20gbW9kX3Jld3JpdGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aG91dCBwcm94eSBlbmFibGVkOiAlcyIsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRk9SQklEREVOOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBtYWtlIHN1cmUgdGhlIFFVRVJZX1NUUklORyBhbmQKLSAgICAgICAgICAgICAqIFBBVEhfSU5GTyBwYXJ0cyBnZXQgaW5jb3Jwb3JhdGVkCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChyLT5wYXRoX2luZm8gIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCByLT5maWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+cGF0aF9pbmZvLCBOVUxMKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyLT5hcmdzICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICByLT51cmkgPT0gci0+dW5wYXJzZWRfdXJpKSB7Ci0gICAgICAgICAgICAgICAgLyogc2VlIHByb3h5X2h0dHA6cHJveHlfaHR0cF9jYW5vbigpICovCi0gICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHItPmZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPyIsIHItPmFyZ3MsIE5VTEwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBub3cgbWFrZSBzdXJlIHRoZSByZXF1ZXN0IGdldHMgaGFuZGxlZCBieSB0aGUgcHJveHkgaGFuZGxlciAqLwotICAgICAgICAgICAgci0+cHJveHlyZXEgPSAxOwotICAgICAgICAgICAgci0+aGFuZGxlciAgPSAicHJveHktc2VydmVyIjsKLQotICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAxLCAiZ28tYWhlYWQgd2l0aCBwcm94eSByZXF1ZXN0ICVzIFtPS10iLAotICAgICAgICAgICAgICAgICAgICAgICByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoICAoc3RybGVuKHItPmZpbGVuYW1lKSA+IDcgJiYKLSAgICAgICAgICAgICAgICAgICAgc3RybmNhc2VjbXAoci0+ZmlsZW5hbWUsICJodHRwOi8vIiwgNykgPT0gMCkKLSAgICAgICAgICAgICAgICB8fCAoc3RybGVuKHItPmZpbGVuYW1lKSA+IDggJiYKLSAgICAgICAgICAgICAgICAgICAgc3RybmNhc2VjbXAoci0+ZmlsZW5hbWUsICJodHRwczovLyIsIDgpID09IDApCi0gICAgICAgICAgICAgICAgfHwgKHN0cmxlbihyLT5maWxlbmFtZSkgPiA5ICYmCi0gICAgICAgICAgICAgICAgICAgIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAiZ29waGVyOi8vIiwgOSkgPT0gMCkKLSAgICAgICAgICAgICAgICB8fCAoc3RybGVuKHItPmZpbGVuYW1lKSA+IDYgJiYKLSAgICAgICAgICAgICAgICAgICAgc3RybmNhc2VjbXAoci0+ZmlsZW5hbWUsICJmdHA6Ly8iLCA2KSA9PSAwKSAgICApIHsKLSAgICAgICAgICAgIC8qIGl0IHdhcyBmaW5hbGx5IHJld3JpdHRlbiB0byBhIHJlbW90ZSBVUkwgKi8KLQotICAgICAgICAgICAgLyogc2tpcCAnc2NoZW1lOicgKi8KLSAgICAgICAgICAgIGZvciAoY3AgPSByLT5maWxlbmFtZTsgKmNwICE9ICc6JyAmJiAqY3AgIT0gJ1wwJzsgY3ArKykKLSAgICAgICAgICAgICAgICA7Ci0gICAgICAgICAgICAvKiBza2lwICc6Ly8nICovCi0gICAgICAgICAgICBjcCArPSAzOwotICAgICAgICAgICAgLyogc2tpcCBob3N0IHBhcnQgKi8KLSAgICAgICAgICAgIGZvciAoIDsgKmNwICE9ICcvJyAmJiAqY3AgIT0gJ1wwJzsgY3ArKykKLSAgICAgICAgICAgICAgICA7Ci0gICAgICAgICAgICBpZiAoKmNwICE9ICdcMCcpIHsKLSAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDEsICJlc2NhcGluZyAlcyBmb3IgcmVkaXJlY3QiLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgY3AyID0gYXBfZXNjYXBlX3VyaShyLT5wb29sLCBjcCk7Ci0gICAgICAgICAgICAgICAgKmNwID0gJ1wwJzsKLSAgICAgICAgICAgICAgICByLT5maWxlbmFtZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgci0+ZmlsZW5hbWUsIGNwMiwgTlVMTCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGFwcGVuZCB0aGUgUVVFUllfU1RSSU5HIHBhcnQgKi8KLSAgICAgICAgICAgIGlmIChyLT5hcmdzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCByLT5maWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPyIsIHItPmFyZ3MsIE5VTEwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBkZXRlcm1pbmUgSFRUUCByZWRpcmVjdCByZXNwb25zZSBjb2RlICovCi0gICAgICAgICAgICBpZiAoYXBfaXNfSFRUUF9SRURJUkVDVChyLT5zdGF0dXMpKSB7Ci0gICAgICAgICAgICAgICAgbiA9IHItPnN0YXR1czsKLSAgICAgICAgICAgICAgICByLT5zdGF0dXMgPSBIVFRQX09LOyAvKiBtYWtlIEFwYWNoZSBrZXJuZWwgaGFwcHkgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIG4gPSBSRURJUkVDVDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogbm93IGRvIHRoZSByZWRpcmVjdGlvbiAqLwotICAgICAgICAgICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkxvY2F0aW9uIiwgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAxLCAicmVkaXJlY3QgdG8gJXMgW1JFRElSRUNULyVkXSIsIHItPmZpbGVuYW1lLCBuKTsKLSAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0cmxlbihyLT5maWxlbmFtZSkgPiAxMCAmJgotICAgICAgICAgICAgICAgICBzdHJuY21wKHItPmZpbGVuYW1lLCAiZm9yYmlkZGVuOiIsIDEwKSA9PSAwKSB7Ci0gICAgICAgICAgICAvKiBUaGlzIFVSTHMgaXMgZm9yY2VkIHRvIGJlIGZvcmJpZGRlbiBmb3IgdGhlIHJlcXVlc3RlciAqLwotICAgICAgICAgICAgcmV0dXJuIEZPUkJJRERFTjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJsZW4oci0+ZmlsZW5hbWUpID4gNSAmJgotICAgICAgICAgICAgICAgICBzdHJuY21wKHItPmZpbGVuYW1lLCAiZ29uZToiLCA1KSA9PSAwKSB7Ci0gICAgICAgICAgICAvKiBUaGlzIFVSTHMgaXMgZm9yY2VkIHRvIGJlIGdvbmUgKi8KLSAgICAgICAgICAgIHJldHVybiBIVFRQX0dPTkU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RybGVuKHItPmZpbGVuYW1lKSA+IDEyICYmCi0gICAgICAgICAgICAgICAgIHN0cm5jbXAoci0+ZmlsZW5hbWUsICJwYXNzdGhyb3VnaDoiLCAxMikgPT0gMCkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEhhY2sgYmVjYXVzZSBvZiB1bmRlcnBvd2VyZWQgQVBJOiBwYXNzaW5nIHRoZSBjdXJyZW50Ci0gICAgICAgICAgICAgKiByZXdyaXR0ZW4gZmlsZW5hbWUgdGhyb3VnaCB0byBvdGhlciBVUkwtdG8tZmlsZW5hbWUgaGFuZGxlcnMKLSAgICAgICAgICAgICAqIGp1c3QgYXMgaXQgd2VyZSB0aGUgcmVxdWVzdGVkIFVSTC4gVGhpcyBpcyB0byBlbmFibGUKLSAgICAgICAgICAgICAqIHBvc3QtcHJvY2Vzc2luZyBieSBtb2RfYWxpYXMsIGV0Yy4gIHdoaWNoIGFsd2F5cyBhY3Qgb24KLSAgICAgICAgICAgICAqIHItPnVyaSEgVGhlIGRpZmZlcmVuY2UgaGVyZSBpczogV2UgZG8gbm90IHRyeSB0bwotICAgICAgICAgICAgICogYWRkIHRoZSBkb2N1bWVudCByb290Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHItPnVyaSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgci0+ZmlsZW5hbWUrMTIpOwotICAgICAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLyogaXQgd2FzIGZpbmFsbHkgcmV3cml0dGVuIHRvIGEgbG9jYWwgcGF0aCAqLwotCi0gICAgICAgICAgICAvKiBleHBhbmQgIi9+dXNlciIgcHJlZml4ICovCi0jaWZuZGVmIFdJTjMyCi0gICAgICAgICAgICByLT5maWxlbmFtZSA9IGV4cGFuZF90aWxkZXBhdGhzKHIsIHItPmZpbGVuYW1lKTsKLSNlbmRpZgotICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAyLCAibG9jYWwgcGF0aCByZXN1bHQ6ICVzIiwgci0+ZmlsZW5hbWUpOwotCi0gICAgICAgICAgICAvKiB0aGUgZmlsZW5hbWUgaGFzIHRvIHN0YXJ0IHdpdGggYSBzbGFzaCEgKi8KLSAgICAgICAgICAgIGlmIChyLT5maWxlbmFtZVswXSAhPSAnLycpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1JFUVVFU1Q7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGlmIHRoZXJlIGlzIG5vIHZhbGlkIHByZWZpeCwgd2UgaGF2ZQotICAgICAgICAgICAgICogdG8gZW11bGF0ZSB0aGUgdHJhbnNsYXRvciBmcm9tIHRoZSBjb3JlIGFuZAotICAgICAgICAgICAgICogcHJlZml4IHRoZSBmaWxlbmFtZSB3aXRoIGRvY3VtZW50X3Jvb3QKLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBOT1RJQ0U6Ci0gICAgICAgICAgICAgKiBXZSBjYW5ub3QgbGVhdmUgb3V0IHRoZSBwcmVmaXhfc3RhdCBiZWNhdXNlCi0gICAgICAgICAgICAgKiAtIHdoZW4gd2UgYWx3YXlzIHByZWZpeCB3aXRoIGRvY3VtZW50X3Jvb3QKLSAgICAgICAgICAgICAqICAgdGhlbiBubyBhYnNvbHV0ZSBwYXRoIGNhbiBiZSBjcmVhdGVkLCBlLmcuIHZpYQotICAgICAgICAgICAgICogICBlbXVsYXRpbmcgYSBTY3JpcHRBbGlhcyBkaXJlY3RpdmUsIGV0Yy4KLSAgICAgICAgICAgICAqIC0gd2hlbiB3ZSBhbHdheXMgTk9UIHByZWZpeCB3aXRoIGRvY3VtZW50X3Jvb3QKLSAgICAgICAgICAgICAqICAgdGhlbiB0aGUgZmlsZXMgdW5kZXIgZG9jdW1lbnRfcm9vdCBoYXZlIHRvCi0gICAgICAgICAgICAgKiAgIGJlIHJlZmVyZW5jZXMgZGlyZWN0bHkgYW5kIGRvY3VtZW50X3Jvb3QKLSAgICAgICAgICAgICAqICAgZ2V0cyBuZXZlciB1c2VkIGFuZCB3aWxsIGJlIGEgZHVtbXkgcGFyYW1ldGVyIC0KLSAgICAgICAgICAgICAqICAgdGhpcyBpcyBhbHNvIGJhZAotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIEJVVDoKLSAgICAgICAgICAgICAqIFVuZGVyIHJlYWwgVW5peCBzeXN0ZW1zIHRoaXMgaXMgbm8gcHJvYmxlbSwKLSAgICAgICAgICAgICAqIGJlY2F1c2Ugd2Ugb25seSBkbyBzdGF0KCkgb24gdGhlIGZpcnN0IGRpcmVjdG9yeQotICAgICAgICAgICAgICogYW5kIHRoaXMgZ2V0cyBjYWNoZWQgYnkgdGhlIGtlcm5lbCBmb3IgYWxvbmcgdGltZSEKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbiA9IHByZWZpeF9zdGF0KHItPmZpbGVuYW1lLCAmZmluZm8pOwotICAgICAgICAgICAgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgICAgIGlmICgoY2NwID0gYXBfZG9jdW1lbnRfcm9vdChyKSkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBsID0gYXBfY3B5c3Rybihkb2Nyb290LCBjY3AsIHNpemVvZihkb2Nyb290KSkgLSBkb2Nyb290OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIGFsd2F5cyBOT1QgaGF2ZSBhIHRyYWlsaW5nIHNsYXNoICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChkb2Nyb290W2wtMV0gPT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb2Nyb290W2wtMV0gPSAnXDAnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyLT5zZXJ2ZXItPnBhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICFzdHJuY21wKHItPmZpbGVuYW1lLCByLT5zZXJ2ZXItPnBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5zZXJ2ZXItPnBhdGhsZW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByLT5maWxlbmFtZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgZG9jcm9vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoci0+ZmlsZW5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5zZXJ2ZXItPnBhdGhsZW4pLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCBkb2Nyb290LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5maWxlbmFtZSwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAyLCAicHJlZml4ZWQgd2l0aCBkb2N1bWVudF9yb290IHRvICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXdyaXRlbG9nKHIsIDEsICJnby1haGVhZCB3aXRoICVzIFtPS10iLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJld3JpdGVsb2cociwgMSwgInBhc3MgdGhyb3VnaCAlcyIsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLX0KLQotCi0vKgotKioKLSoqICBNSU1FLXR5cGUgaG9vawotKioKLSoqICBbdXNlZCB0byBzdXBwb3J0IHRoZSBmb3JjZWQtTUlNRS10eXBlIGZlYXR1cmVdCi0qKgotKi8KLQotc3RhdGljIGludCBob29rX21pbWV0eXBlKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvbnN0IGNoYXIgKnQ7Ci0KLSAgICAvKiBub3cgY2hlY2sgaWYgd2UgaGF2ZSB0byBmb3JjZSBhIE1JTUUtdHlwZSAqLwotICAgIHQgPSBhcF90YWJsZV9nZXQoci0+bm90ZXMsIFJFV1JJVEVfRk9SQ0VEX01JTUVUWVBFX05PVEVWQVIpOwotICAgIGlmICh0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcmV3cml0ZWxvZyhyLCAxLCAiZm9yY2UgZmlsZW5hbWUgJXMgdG8gaGF2ZSBNSU1FLXR5cGUgJyVzJyIsCi0gICAgICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUsIHQpOwotICAgICAgICByLT5jb250ZW50X3R5cGUgPSB0OwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotfQotCi0KLS8qCi0qKgotKiogIEZpeHVwIGhvb2sKLSoqCi0qKiAgW3VzZWQgZm9yIHRoZSByZXdyaXRpbmcgZW5naW5lIHRyaWdnZXJlZCBieQotKiogIHRoZSBwZXItZGlyZWN0b3J5ICdSZXdyaXRlUnVsZScgZGlyZWN0aXZlc10KLSoqCi0qLwotCi1zdGF0aWMgaW50IGhvb2tfZml4dXAocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgcmV3cml0ZV9wZXJkaXJfY29uZiAqZGNvbmY7Ci0gICAgY2hhciAqY3A7Ci0gICAgY2hhciAqY3AyOwotICAgIGNvbnN0IGNoYXIgKmNjcDsKLSAgICBjaGFyICpwcmVmaXg7Ci0gICAgaW50IGw7Ci0gICAgaW50IG47Ci0gICAgY2hhciAqb2ZpbGVuYW1lOwotCi0gICAgZGNvbmYgPSAocmV3cml0ZV9wZXJkaXJfY29uZiAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV3cml0ZV9tb2R1bGUpOwotCi0gICAgLyogaWYgdGhlcmUgaXMgbm8gcGVyLWRpciBjb25maWcgd2UgcmV0dXJuIGltbWVkaWF0ZWx5ICovCi0gICAgaWYgKGRjb25mID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIC8qIHdlIHNob3VsZG4ndCBkbyBhbnl0aGluZyBpbiBzdWJyZXF1ZXN0cyAqLwotICAgIGlmIChyLT5tYWluICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIC8qIGlmIHRoZXJlIGFyZSBubyByZWFsIChpLmUuIG5vIFJld3JpdGVSdWxlIGRpcmVjdGl2ZXMhKQotICAgICAgIHBlci1kaXIgY29uZmlnIG9mIHVzLCB3ZSByZXR1cm4gYWxzbyBpbW1lZGlhdGVseSAqLwotICAgIGlmIChkY29uZi0+ZGlyZWN0b3J5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIG9ubHkgZG8gc29tZXRoaW5nIHVuZGVyIHJ1bnRpbWUgaWYgdGhlIGVuZ2luZSBpcyByZWFsbHkgZW5hYmxlZCwKLSAgICAgKiAgZm9yIHRoaXMgZGlyZWN0b3J5LCBlbHNlIHJldHVybiBpbW1lZGlhdGVseSEKLSAgICAgKi8KLSAgICBpZiAoIShhcF9hbGxvd19vcHRpb25zKHIpICYgKE9QVF9TWU1fTElOS1MgfCBPUFRfU1lNX09XTkVSKSkpIHsKLSAgICAgICAgLyogRm9sbG93U3ltTGlua3MgaXMgbWFuZGF0b3J5ISAqLwotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAgIk9wdGlvbnMgRm9sbG93U3ltTGlua3Mgb3IgU3ltTGlua3NJZk93bmVyTWF0Y2ggaXMgb2ZmICIKLSAgICAgICAgICAgICAgICAgICAgICJ3aGljaCBpbXBsaWVzIHRoYXQgUmV3cml0ZVJ1bGUgZGlyZWN0aXZlIGlzIGZvcmJpZGRlbjogIgotICAgICAgICAgICAgICAgICAgICAgIiVzIiwgci0+ZmlsZW5hbWUpOwotICAgICAgICByZXR1cm4gRk9SQklEREVOOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogRm9sbG93U3ltTGlua3MgaXMgZ2l2ZW4sIGJ1dCB0aGUgdXNlciBjYW4KLSAgICAgICAgICogc3RpbGwgdHVybiBvZmYgdGhlIHJld3JpdGluZyBlbmdpbmUKLSAgICAgICAgICovCi0gICAgICAgIGlmIChkY29uZi0+c3RhdGUgPT0gRU5HSU5FX0RJU0FCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqICByZW1lbWJlciB0aGUgY3VycmVudCBmaWxlbmFtZSBiZWZvcmUgcmV3cml0aW5nIGZvciBsYXRlciBjaGVjawotICAgICAqICB0byBwcmV2ZW50IGRlYWRsb29waW5nIGJlY2F1c2Ugb2YgaW50ZXJuYWwgcmVkaXJlY3RzCi0gICAgICogIG9uIGZpbmFsIFVSTC9maWxlbmFtZSB3aGljaCBjYW4gYmUgZXF1YWwgdG8gdGhlIGluaXRhbCBvbmUuCi0gICAgICovCi0gICAgb2ZpbGVuYW1lID0gci0+ZmlsZW5hbWU7Ci0KLSAgICAvKgotICAgICAqICBub3cgYXBwbHkgdGhlIHJ1bGVzIC4uLgotICAgICAqLwotICAgIGlmIChhcHBseV9yZXdyaXRlX2xpc3QociwgZGNvbmYtPnJld3JpdGVydWxlcywgZGNvbmYtPmRpcmVjdG9yeSkpIHsKLQotICAgICAgICBpZiAoc3RybGVuKHItPmZpbGVuYW1lKSA+IDYgJiYKLSAgICAgICAgICAgIHN0cm5jbXAoci0+ZmlsZW5hbWUsICJwcm94eToiLCA2KSA9PSAwKSB7Ci0gICAgICAgICAgICAvKiBpdCBzaG91bGQgZ28gb24gYXMgYW4gaW50ZXJuYWwgcHJveHkgcmVxdWVzdCAqLwotCi0gICAgICAgICAgICAvKiBtYWtlIHN1cmUgdGhlIFFVRVJZX1NUUklORyBhbmQKLSAgICAgICAgICAgICAqIFBBVEhfSU5GTyBwYXJ0cyBnZXQgaW5jb3Jwb3JhdGVkCi0gICAgICAgICAgICAgKiAoci0+cGF0aF9pbmZvIHdhcyBhbHJlYWR5IGFwcGVuZGVkIGJ5IHRoZQotICAgICAgICAgICAgICogcmV3cml0aW5nIGVuZ2luZSBiZWNhdXNlIG9mIHRoZSBwZXItZGlyIGNvbnRleHQhKQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoci0+YXJncyAhPSBOVUxMCi0gICAgICAgICAgICAgICAgJiYgci0+dXJpID09IHItPnVucGFyc2VkX3VyaSkgewotICAgICAgICAgICAgICAgIC8qIHNlZSBwcm94eV9odHRwOnByb3h5X2h0dHBfY2Fub24oKSAqLwotICAgICAgICAgICAgICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCByLT5maWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj8iLCByLT5hcmdzLCBOVUxMKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogbm93IG1ha2Ugc3VyZSB0aGUgcmVxdWVzdCBnZXRzIGhhbmRsZWQgYnkgdGhlIHByb3h5IGhhbmRsZXIgKi8KLSAgICAgICAgICAgIHItPnByb3h5cmVxID0gMTsKLSAgICAgICAgICAgIHItPmhhbmRsZXIgID0gInByb3h5LXNlcnZlciI7Ci0KLSAgICAgICAgICAgIHJld3JpdGVsb2cociwgMSwgIltwZXItZGlyICVzXSBnby1haGVhZCB3aXRoIHByb3h5IHJlcXVlc3QgIgotICAgICAgICAgICAgICAgICAgICAgICAiJXMgW09LXSIsIGRjb25mLT5kaXJlY3RvcnksIHItPmZpbGVuYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggIChzdHJsZW4oci0+ZmlsZW5hbWUpID4gNyAmJgotICAgICAgICAgICAgICAgICAgICBzdHJuY21wKHItPmZpbGVuYW1lLCAiaHR0cDovLyIsIDcpID09IDApCi0gICAgICAgICAgICAgICAgfHwgKHN0cmxlbihyLT5maWxlbmFtZSkgPiA4ICYmCi0gICAgICAgICAgICAgICAgICAgIHN0cm5jbXAoci0+ZmlsZW5hbWUsICJodHRwczovLyIsIDgpID09IDApCi0gICAgICAgICAgICAgICAgfHwgKHN0cmxlbihyLT5maWxlbmFtZSkgPiA5ICYmCi0gICAgICAgICAgICAgICAgICAgIHN0cm5jbXAoci0+ZmlsZW5hbWUsICJnb3BoZXI6Ly8iLCA5KSA9PSAwKQotICAgICAgICAgICAgICAgIHx8IChzdHJsZW4oci0+ZmlsZW5hbWUpID4gNiAmJgotICAgICAgICAgICAgICAgICAgICBzdHJuY21wKHItPmZpbGVuYW1lLCAiZnRwOi8vIiwgNikgPT0gMCkgICAgKSB7Ci0gICAgICAgICAgICAvKiBpdCB3YXMgZmluYWxseSByZXdyaXR0ZW4gdG8gYSByZW1vdGUgVVJMICovCi0KLSAgICAgICAgICAgIC8qIGJlY2F1c2Ugd2UgYXJlIGluIGEgcGVyLWRpciBjb250ZXh0Ci0gICAgICAgICAgICAgKiBmaXJzdCB0cnkgdG8gcmVwbGFjZSB0aGUgZGlyZWN0b3J5IHdpdGggaXRzIGJhc2UtVVJMCi0gICAgICAgICAgICAgKiBpZiB0aGVyZSBpcyBhIGJhc2UtVVJMIGF2YWlsYWJsZQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoZGNvbmYtPmJhc2V1cmwgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIC8qIHNraXAgJ3NjaGVtZTonICovCi0gICAgICAgICAgICAgICAgZm9yIChjcCA9IHItPmZpbGVuYW1lOyAqY3AgIT0gJzonICYmICpjcCAhPSAnXDAnOyBjcCsrKQotICAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgICAgICAgICAgLyogc2tpcCAnOi8vJyAqLwotICAgICAgICAgICAgICAgIGNwICs9IDM7Ci0gICAgICAgICAgICAgICAgaWYgKChjcCA9IHN0cmNocihjcCwgJy8nKSkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltwZXItZGlyICVzXSB0cnlpbmcgdG8gcmVwbGFjZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZWZpeCAlcyB3aXRoICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY29uZi0+ZGlyZWN0b3J5LCBkY29uZi0+ZGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjb25mLT5iYXNldXJsKTsKLSAgICAgICAgICAgICAgICAgICAgY3AyID0gc3Vic3RfcHJlZml4X3BhdGgociwgY3AsIGRjb25mLT5kaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjb25mLT5iYXNldXJsKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChjcDIsIGNwKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqY3AgPSAnXDAnOwotICAgICAgICAgICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHItPmZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwMiwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIG5vdyBwcmVwYXJlIHRoZSByZWRpcmVjdC4uLiAqLwotCi0gICAgICAgICAgICAvKiBza2lwICdzY2hlbWU6JyAqLwotICAgICAgICAgICAgZm9yIChjcCA9IHItPmZpbGVuYW1lOyAqY3AgIT0gJzonICYmICpjcCAhPSAnXDAnOyBjcCsrKQotICAgICAgICAgICAgICAgIDsKLSAgICAgICAgICAgIC8qIHNraXAgJzovLycgKi8KLSAgICAgICAgICAgIGNwICs9IDM7Ci0gICAgICAgICAgICAvKiBza2lwIGhvc3QgcGFydCAqLwotICAgICAgICAgICAgZm9yICggOyAqY3AgIT0gJy8nICYmICpjcCAhPSAnXDAnOyBjcCsrKQotICAgICAgICAgICAgICAgIDsKLSAgICAgICAgICAgIGlmICgqY3AgIT0gJ1wwJykgewotICAgICAgICAgICAgICAgIHJld3JpdGVsb2cociwgMSwgIltwZXItZGlyICVzXSBlc2NhcGluZyAlcyBmb3IgcmVkaXJlY3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNvbmYtPmRpcmVjdG9yeSwgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIGNwMiA9IGFwX2VzY2FwZV91cmkoci0+cG9vbCwgY3ApOwotICAgICAgICAgICAgICAgICpjcCA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHItPmZpbGVuYW1lLCBjcDIsIE5VTEwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBhcHBlbmQgdGhlIFFVRVJZX1NUUklORyBwYXJ0ICovCi0gICAgICAgICAgICBpZiAoci0+YXJncyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHItPmZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPyIsIHItPmFyZ3MsIE5VTEwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBkZXRlcm1pbmUgSFRUUCByZWRpcmVjdCByZXNwb25zZSBjb2RlICovCi0gICAgICAgICAgICBpZiAoYXBfaXNfSFRUUF9SRURJUkVDVChyLT5zdGF0dXMpKSB7Ci0gICAgICAgICAgICAgICAgbiA9IHItPnN0YXR1czsKLSAgICAgICAgICAgICAgICByLT5zdGF0dXMgPSBIVFRQX09LOyAvKiBtYWtlIEFwYWNoZSBrZXJuZWwgaGFwcHkgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIG4gPSBSRURJUkVDVDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogbm93IGRvIHRoZSByZWRpcmVjdGlvbiAqLwotICAgICAgICAgICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkxvY2F0aW9uIiwgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAxLCAiW3Blci1kaXIgJXNdIHJlZGlyZWN0IHRvICVzIFtSRURJUkVDVC8lZF0iLAotICAgICAgICAgICAgICAgICAgICAgICBkY29uZi0+ZGlyZWN0b3J5LCByLT5maWxlbmFtZSwgbik7Ci0gICAgICAgICAgICByZXR1cm4gbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJsZW4oci0+ZmlsZW5hbWUpID4gMTAgJiYKLSAgICAgICAgICAgICAgICAgc3RybmNtcChyLT5maWxlbmFtZSwgImZvcmJpZGRlbjoiLCAxMCkgPT0gMCkgewotICAgICAgICAgICAgLyogVGhpcyBVUkwgaXMgZm9yY2VkIHRvIGJlIGZvcmJpZGRlbiBmb3IgdGhlIHJlcXVlc3RlciAqLwotICAgICAgICAgICAgcmV0dXJuIEZPUkJJRERFTjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJsZW4oci0+ZmlsZW5hbWUpID4gNSAmJgotICAgICAgICAgICAgICAgICBzdHJuY21wKHItPmZpbGVuYW1lLCAiZ29uZToiLCA1KSA9PSAwKSB7Ci0gICAgICAgICAgICAvKiBUaGlzIFVSTCBpcyBmb3JjZWQgdG8gYmUgZ29uZSAqLwotICAgICAgICAgICAgcmV0dXJuIEhUVFBfR09ORTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIGl0IHdhcyBmaW5hbGx5IHJld3JpdHRlbiB0byBhIGxvY2FsIHBhdGggKi8KLQotICAgICAgICAgICAgLyogaWYgc29tZW9uZSB1c2VkIHRoZSBQQVNTVEhST1VHSCBmbGFnIGluIHBlci1kaXIKLSAgICAgICAgICAgICAqIGNvbnRleHQgd2UganVzdCBpZ25vcmUgaXQuIEl0IGlzIG9ubHkgdXNlZnVsCi0gICAgICAgICAgICAgKiBpbiBwZXItc2VydmVyIGNvbnRleHQKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHN0cmxlbihyLT5maWxlbmFtZSkgPiAxMiAmJgotICAgICAgICAgICAgICAgIHN0cm5jbXAoci0+ZmlsZW5hbWUsICJwYXNzdGhyb3VnaDoiLCAxMikgPT0gMCkgewotICAgICAgICAgICAgICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmR1cChyLT5wb29sLCByLT5maWxlbmFtZSsxMik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIHRoZSBmaWxlbmFtZSBoYXMgdG8gc3RhcnQgd2l0aCBhIHNsYXNoISAqLwotICAgICAgICAgICAgaWYgKHItPmZpbGVuYW1lWzBdICE9ICcvJykgewotICAgICAgICAgICAgICAgIHJldHVybiBCQURfUkVRVUVTVDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogQ2hlY2sgZm9yIGRlYWRsb29waW5nOgotICAgICAgICAgICAgICogQXQgdGhpcyBwb2ludCB3ZSBLTk9XIHRoYXQgYXQgbGVhc3Qgb25lIHJld3JpdGluZwotICAgICAgICAgICAgICogcnVsZSB3YXMgYXBwbGllZCwgYnV0IHdoZW4gdGhlIHJlc3VsdGluZyBVUkwgaXMKLSAgICAgICAgICAgICAqIHRoZSBzYW1lIGFzIHRoZSBpbml0aWFsIFVSTCwgd2UgYXJlIG5vdCBhbGxvd2VkIHRvCi0gICAgICAgICAgICAgKiB1c2UgdGhlIGZvbGxvd2luZyBpbnRlcm5hbCByZWRpcmVjdGlvbiBzdHVmZiBiZWNhdXNlCi0gICAgICAgICAgICAgKiB0aGlzIHdvdWxkIGxlYWQgdG8gYSBkZWFkbG9vcC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHN0cmNtcChyLT5maWxlbmFtZSwgb2ZpbGVuYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAxLCAiW3Blci1kaXIgJXNdIGluaXRpYWwgVVJMIGVxdWFsIHJld3JpdHRlbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiVVJMOiAlcyBbSUdOT1JJTkcgUkVXUklURV0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNvbmYtPmRpcmVjdG9yeSwgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogaWYgdGhlcmUgaXMgYSB2YWxpZCBiYXNlLVVSTCB0aGVuIHN1YnN0aXR1dGUKLSAgICAgICAgICAgICAqIHRoZSBwZXItZGlyIHByZWZpeCB3aXRoIHRoaXMgYmFzZS1VUkwgaWYgdGhlCi0gICAgICAgICAgICAgKiBjdXJyZW50IGZpbGVuYW1lIHN0aWxsIGlzIGluc2lkZSB0aGlzIHBlci1kaXIKLSAgICAgICAgICAgICAqIGNvbnRleHQuIElmIG5vdCB0aGVuIHRyZWF0IHRoZSByZXN1bHQgYXMgYQotICAgICAgICAgICAgICogcGxhaW4gVVJMCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChkY29uZi0+YmFzZXVybCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIltwZXItZGlyICVzXSB0cnlpbmcgdG8gcmVwbGFjZSBwcmVmaXggJXMgd2l0aCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkY29uZi0+ZGlyZWN0b3J5LCBkY29uZi0+ZGlyZWN0b3J5LCBkY29uZi0+YmFzZXVybCk7Ci0gICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUgPSBzdWJzdF9wcmVmaXhfcGF0aChyLCByLT5maWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjb25mLT5kaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY29uZi0+YmFzZXVybCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBpZiBubyBleHBsaWNpdCBiYXNlLVVSTCBleGlzdHMgd2UgYXNzdW1lCi0gICAgICAgICAgICAgICAgICogdGhhdCB0aGUgZGlyZWN0b3J5IHByZWZpeCBpcyBhbHNvIGEgdmFsaWQgVVJMCi0gICAgICAgICAgICAgICAgICogZm9yIHRoaXMgd2Vic2VydmVyIGFuZCBvbmx5IHRyeSB0byByZW1vdmUgdGhlCi0gICAgICAgICAgICAgICAgICogZG9jdW1lbnRfcm9vdCBpZiBpdCBpcyBwcmVmaXgKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoKGNjcCA9IGFwX2RvY3VtZW50X3Jvb3QocikpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gYXBfcHN0cmR1cChyLT5wb29sLCBjY3ApOwotICAgICAgICAgICAgICAgICAgICAvKiBhbHdheXMgTk9UIGhhdmUgYSB0cmFpbGluZyBzbGFzaCAqLwotICAgICAgICAgICAgICAgICAgICBsID0gc3RybGVuKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXhbbC0xXSA9PSAnLycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeFtsLTFdID0gJ1wwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGwtLTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoc3RybmNtcChyLT5maWxlbmFtZSwgcHJlZml4LCBsKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbcGVyLWRpciAlc10gc3RyaXAgZG9jdW1lbnRfcm9vdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmVmaXg6ICVzIC0+ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNvbmYtPmRpcmVjdG9yeSwgci0+ZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPmZpbGVuYW1lK2wpOwotICAgICAgICAgICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyZHVwKHItPnBvb2wsIHItPmZpbGVuYW1lK2wpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBub3cgaW5pdGlhdGUgdGhlIGludGVybmFsIHJlZGlyZWN0ICovCi0gICAgICAgICAgICByZXdyaXRlbG9nKHIsIDEsICJbcGVyLWRpciAlc10gaW50ZXJuYWwgcmVkaXJlY3Qgd2l0aCAlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICJbSU5URVJOQUwgUkVESVJFQ1RdIiwgZGNvbmYtPmRpcmVjdG9yeSwgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsICJyZWRpcmVjdDoiLCByLT5maWxlbmFtZSwgTlVMTCk7Ci0gICAgICAgICAgICByLT5oYW5kbGVyID0gInJlZGlyZWN0LWhhbmRsZXIiOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXdyaXRlbG9nKHIsIDEsICJbcGVyLWRpciAlc10gcGFzcyB0aHJvdWdoICVzIiwgCi0gICAgICAgICAgICAgICAgICAgZGNvbmYtPmRpcmVjdG9yeSwgci0+ZmlsZW5hbWUpOwotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgfQotfQotCi0KLS8qCi0qKgotKiogIENvbnRlbnQtSGFuZGxlcnMKLSoqCi0qKiAgW3VzZWQgZm9yIHJlZGlyZWN0IHN1cHBvcnRdCi0qKgotKi8KLQotc3RhdGljIGludCBoYW5kbGVyX3JlZGlyZWN0KHJlcXVlc3RfcmVjICpyKQotewotICAgIC8qIGp1c3QgbWFrZSBzdXJlIHRoYXQgd2UgYXJlIHJlYWxseSBtZWFudCEgKi8KLSAgICBpZiAoc3RybmNtcChyLT5maWxlbmFtZSwgInJlZGlyZWN0OiIsIDkpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIC8qIG5vdyBkbyB0aGUgaW50ZXJuYWwgcmVkaXJlY3QgKi8KLSAgICBhcF9pbnRlcm5hbF9yZWRpcmVjdChhcF9wc3RyY2F0KHItPnBvb2wsIHItPmZpbGVuYW1lKzksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5hcmdzID8gIj8iIDogTlVMTCwgci0+YXJncywgTlVMTCksIHIpOwotCi0gICAgLyogYW5kIHJldHVybiBncmFjZWZ1bGx5ICovCi0gICAgcmV0dXJuIE9LOwotfQotCi0KLS8qCi0qKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSoqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiogfCAgICAgICAgICAgICAgICAgIHRoZSByZXdyaXRpbmcgZW5naW5lCi0qKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSoqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLQotLyoKLSAqICBBcHBseSBhIGNvbXBsZXRlIHJ1bGUgc2V0LAotICogIGkuZS4gYSBsaXN0IG9mIHJld3JpdGUgcnVsZXMKLSAqLwotc3RhdGljIGludCBhcHBseV9yZXdyaXRlX2xpc3QocmVxdWVzdF9yZWMgKnIsIGFycmF5X2hlYWRlciAqcmV3cml0ZXJ1bGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGVyZGlyKQotewotICAgIHJld3JpdGVydWxlX2VudHJ5ICplbnRyaWVzOwotICAgIHJld3JpdGVydWxlX2VudHJ5ICpwOwotICAgIGludCBpOwotICAgIGludCBjaGFuZ2VkOwotICAgIGludCByYzsKLSAgICBpbnQgczsKLQotICAgIC8qCi0gICAgICogIEl0ZXJhdGUgb3ZlciBhbGwgZXhpc3RpbmcgcnVsZXMKLSAgICAgKi8KLSAgICBlbnRyaWVzID0gKHJld3JpdGVydWxlX2VudHJ5ICopcmV3cml0ZXJ1bGVzLT5lbHRzOwotICAgIGNoYW5nZWQgPSAwOwotICAgIGxvb3A6Ci0gICAgZm9yIChpID0gMDsgaSA8IHJld3JpdGVydWxlcy0+bmVsdHM7IGkrKykgewotICAgICAgICBwID0gJmVudHJpZXNbaV07Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogIElnbm9yZSB0aGlzIHJ1bGUgb24gc3VicmVxdWVzdHMgaWYgd2UgYXJlIGV4cGxpY2l0bHkKLSAgICAgICAgICogIGFza2VkIHRvIGRvIHNvIG9yIHRoaXMgaXMgYSBwcm94eS10aHJvdWdocHV0IG9yIGEKLSAgICAgICAgICogIGZvcmNlZCByZWRpcmVjdCBydWxlLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHItPm1haW4gIT0gTlVMTCAmJgotICAgICAgICAgICAgKHAtPmZsYWdzICYgUlVMRUZMQUdfSUdOT1JFT05TVUJSRVEgfHwKLSAgICAgICAgICAgICBwLT5mbGFncyAmIFJVTEVGTEFHX1BST1hZICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgcC0+ZmxhZ3MgJiBSVUxFRkxBR19GT1JDRVJFRElSRUNUICAgICkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogIEFwcGx5IHRoZSBjdXJyZW50IHJ1bGUuCi0gICAgICAgICAqLwotICAgICAgICByYyA9IGFwcGx5X3Jld3JpdGVfcnVsZShyLCBwLCBwZXJkaXIpOwotICAgICAgICBpZiAocmMpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiAgSW5kaWNhdGUgYSBjaGFuZ2UgaWYgdGhpcyB3YXMgbm90IGEgbWF0Y2gtb25seSBydWxlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAocmMgIT0gMikgewotICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogIFBhc3MtVGhyb3VnaCBGZWF0dXJlIChgUmV3cml0ZVJ1bGUgLi4gLi4gW1BUXScpOgotICAgICAgICAgICAgICogIEJlY2F1c2UgdGhlIEFwYWNoZSAxLnggQVBJIGlzIHZlcnkgbGltaXRlZCB3ZQotICAgICAgICAgICAgICogIG5lZWQgdGhpcyBoYWNrIHRvIHBhc3MgdGhlIHJld3JpdHRlbiBVUkwgdG8gb3RoZXIKLSAgICAgICAgICAgICAqICBtb2R1bGVzIGxpa2UgbW9kX2FsaWFzLCBtb2RfdXNlcmRpciwgZXRjLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAocC0+ZmxhZ3MgJiBSVUxFRkxBR19QQVNTVEhST1VHSCkgewotICAgICAgICAgICAgICAgIHJld3JpdGVsb2cociwgMiwgImZvcmNpbmcgJyVzJyB0byBnZXQgcGFzc2VkIHRocm91Z2ggIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIG5leHQgQVBJIFVSSS10by1maWxlbmFtZSBoYW5kbGVyIiwgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCAicGFzc3Rocm91Z2g6IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUsIE5VTEwpOwotICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogIFJ1bGUgaGFzIHRoZSAiZm9yYmlkZGVuIiBmbGFnIHNldCB3aGljaCBtZWFucyB0aGF0Ci0gICAgICAgICAgICAgKiAgd2Ugc3RvcCBwcm9jZXNzaW5nIGFuZCBpbmRpY2F0ZSB0aGlzIHRvIHRoZSBjYWxsZXIuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChwLT5mbGFncyAmIFJVTEVGTEFHX0ZPUkJJRERFTikgewotICAgICAgICAgICAgICAgIHJld3JpdGVsb2cociwgMiwgImZvcmNpbmcgJyVzJyB0byBiZSBmb3JiaWRkZW4iLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsICJmb3JiaWRkZW46IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUsIE5VTEwpOwotICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogIFJ1bGUgaGFzIHRoZSAiZ29uZSIgZmxhZyBzZXQgd2hpY2ggbWVhbnMgdGhhdAotICAgICAgICAgICAgICogIHdlIHN0b3AgcHJvY2Vzc2luZyBhbmQgaW5kaWNhdGUgdGhpcyB0byB0aGUgY2FsbGVyLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAocC0+ZmxhZ3MgJiBSVUxFRkxBR19HT05FKSB7Ci0gICAgICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAyLCAiZm9yY2luZyAnJXMnIHRvIGJlIGdvbmUiLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsICJnb25lOiIsIHItPmZpbGVuYW1lLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBjaGFuZ2VkID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqICBTdG9wIHByb2Nlc3NpbmcgYWxzbyBvbiBwcm94eSBwYXNzLXRocm91Z2ggYW5kCi0gICAgICAgICAgICAgKiAgbGFzdC1ydWxlIGFuZCBuZXctcm91bmQgZmxhZ3MuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChwLT5mbGFncyAmIFJVTEVGTEFHX1BST1hZKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocC0+ZmxhZ3MgJiBSVUxFRkxBR19MQVNUUlVMRSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogIE9uICJuZXctcm91bmQiIGZsYWcgd2UganVzdCBzdGFydCBmcm9tIHRoZSB0b3Agb2YKLSAgICAgICAgICAgICAqICB0aGUgcmV3cml0aW5nIHJ1bGVzZXQgYWdhaW4uCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChwLT5mbGFncyAmIFJVTEVGTEFHX05FV1JPVU5EKSB7Ci0gICAgICAgICAgICAgICAgZ290byBsb29wOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogIElmIHdlIGFyZSBmb3JjZWQgdG8gc2tpcCBOIG5leHQgcnVsZXMsIGRvIGl0IG5vdy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHAtPnNraXAgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcyA9IHAtPnNraXA7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCAgIGkgPCByZXdyaXRlcnVsZXMtPm5lbHRzCi0gICAgICAgICAgICAgICAgICAgICAgICYmIHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgcCA9ICZlbnRyaWVzW2ldOwotICAgICAgICAgICAgICAgICAgICBzLS07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqICBJZiBjdXJyZW50IHJ1bGUgaXMgY2hhaW5lZCB3aXRoIG5leHQgcnVsZShzKSwKLSAgICAgICAgICAgICAqICBza2lwIGFsbCB0aGlzIG5leHQgcnVsZShzKQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICB3aGlsZSAoICAgaSA8IHJld3JpdGVydWxlcy0+bmVsdHMKLSAgICAgICAgICAgICAgICAgICAmJiBwLT5mbGFncyAmIFJVTEVGTEFHX0NIQUlOKSB7Ci0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIHAgPSAmZW50cmllc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gY2hhbmdlZDsKLX0KLQotLyoKLSAqICBBcHBseSBhIHNpbmdsZSghKSByZXdyaXRlIHJ1bGUKLSAqLwotc3RhdGljIGludCBhcHBseV9yZXdyaXRlX3J1bGUocmVxdWVzdF9yZWMgKnIsIHJld3JpdGVydWxlX2VudHJ5ICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGVyZGlyKQotewotICAgIGNoYXIgKnVyaTsKLSAgICBjaGFyICpvdXRwdXQ7Ci0gICAgY29uc3QgY2hhciAqdmFyeTsKLSAgICBjaGFyIG5ld3VyaVtNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciBlbnZbTUFYX1NUUklOR19MRU5dOwotICAgIHJlZ2V4X3QgKnJlZ2V4cDsKLSAgICByZWdtYXRjaF90IHJlZ21hdGNoW01BWF9OTUFUQ0hdOwotICAgIGJhY2tyZWZpbmZvICpicmlSUiA9IE5VTEw7Ci0gICAgYmFja3JlZmluZm8gKmJyaVJDID0gTlVMTDsKLSAgICBpbnQgcHJlZml4c3RyaXA7Ci0gICAgaW50IGZhaWxlZDsKLSAgICBhcnJheV9oZWFkZXIgKnJld3JpdGVjb25kczsKLSAgICByZXdyaXRlY29uZF9lbnRyeSAqY29uZHM7Ci0gICAgcmV3cml0ZWNvbmRfZW50cnkgKmM7Ci0gICAgaW50IGk7Ci0gICAgaW50IHJjOwotCi0gICAgLyoKLSAgICAgKiAgSW5pdGlhbGlzYXRpb24KLSAgICAgKi8KLSAgICB1cmkgICAgID0gci0+ZmlsZW5hbWU7Ci0gICAgcmVnZXhwICA9IHAtPnJlZ2V4cDsKLSAgICBvdXRwdXQgID0gcC0+b3V0cHV0OwotCi0gICAgLyoKLSAgICAgKiAgQWRkIChwZXJoYXBzIHNwbGl0dGVkIGF3YXkpIFBBVEhfSU5GTyBwb3N0Zml4IHRvIFVSTCB0bwotICAgICAqICBtYWtlIHN1cmUgd2UgcmVhbGx5IG1hdGNoIGFnYWluc3QgdGhlIGNvbXBsZXRlIFVSTC4KLSAgICAgKi8KLSAgICBpZiAocGVyZGlyICE9IE5VTEwgJiYgci0+cGF0aF9pbmZvICE9IE5VTEwgJiYgci0+cGF0aF9pbmZvWzBdICE9ICdcMCcpIHsKLSAgICAgICAgcmV3cml0ZWxvZyhyLCAzLCAiW3Blci1kaXIgJXNdIGFkZCBwYXRoLWluZm8gcG9zdGZpeDogJXMgLT4gJXMlcyIsCi0gICAgICAgICAgICAgICAgICAgcGVyZGlyLCB1cmksIHVyaSwgci0+cGF0aF9pbmZvKTsKLSAgICAgICAgdXJpID0gYXBfcHN0cmNhdChyLT5wb29sLCB1cmksIHItPnBhdGhfaW5mbywgTlVMTCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgT24gcGVyLWRpcmVjdG9yeSBjb250ZXh0ICguaHRhY2Nlc3MpIHN0cmlwIHRoZSBsb2NhdGlvbgotICAgICAqICBwcmVmaXggZnJvbSB0aGUgVVJMIHRvIG1ha2Ugc3VyZSBwYXR0ZXJucyBhcHBseSBvbmx5IHRvCi0gICAgICogIHRoZSBsb2NhbCBwYXJ0LiAgQWRkaXRpb25hbGx5IGluZGljYXRlIHRoaXMgc3BlY2lhbAotICAgICAqICB0aHJlYXRtZW50IGluIHRoZSBsb2dmaWxlLgotICAgICAqLwotICAgIHByZWZpeHN0cmlwID0gMDsKLSAgICBpZiAocGVyZGlyICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCAgIHN0cmxlbih1cmkpID49IHN0cmxlbihwZXJkaXIpCi0gICAgICAgICAgICAmJiBzdHJuY21wKHVyaSwgcGVyZGlyLCBzdHJsZW4ocGVyZGlyKSkgPT0gMCkgewotICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAzLCAiW3Blci1kaXIgJXNdIHN0cmlwIHBlci1kaXIgcHJlZml4OiAlcyAtPiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgIHBlcmRpciwgdXJpLCB1cmkrc3RybGVuKHBlcmRpcikpOwotICAgICAgICAgICAgdXJpID0gdXJpK3N0cmxlbihwZXJkaXIpOwotICAgICAgICAgICAgcHJlZml4c3RyaXAgPSAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgVHJ5IHRvIG1hdGNoIHRoZSBVUkkgYWdhaW5zdCB0aGUgUmV3cml0ZVJ1bGUgcGF0dGVybgotICAgICAqICBhbmQgZXhpdCBpbW1lZGRpYXRlbHkgaWYgaXQgZGlkbid0IGFwcGx5LgotICAgICAqLwotICAgIGlmIChwZXJkaXIgPT0gTlVMTCkgewotICAgICAgICByZXdyaXRlbG9nKHIsIDMsICJhcHBseWluZyBwYXR0ZXJuICclcycgdG8gdXJpICclcyciLAotICAgICAgICAgICAgICAgICAgIHAtPnBhdHRlcm4sIHVyaSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXdyaXRlbG9nKHIsIDMsICJbcGVyLWRpciAlc10gYXBwbHlpbmcgcGF0dGVybiAnJXMnIHRvIHVyaSAnJXMnIiwKLSAgICAgICAgICAgICAgICAgICBwZXJkaXIsIHAtPnBhdHRlcm4sIHVyaSk7Ci0gICAgfQotICAgIHJjID0gKGFwX3JlZ2V4ZWMocmVnZXhwLCB1cmksIHJlZ2V4cC0+cmVfbnN1YisxLCByZWdtYXRjaCwgMCkgPT0gMCk7Ci0gICAgaWYgKCEgKCggcmMgJiYgIShwLT5mbGFncyAmIFJVTEVGTEFHX05PVE1BVENIKSkgfHwKLSAgICAgICAgICAgKCFyYyAmJiAgKHAtPmZsYWdzICYgUlVMRUZMQUdfTk9UTUFUQ0gpKSAgICkgKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIEVsc2UgY3JlYXRlIHRoZSBSZXdyaXRlUnVsZSBgcmVnc3ViaW5mbycgc3RydWN0dXJlIHdoaWNoCi0gICAgICogIGhvbGRzIHRoZSBzdWJzdGl0dXRpb24gaW5mb3JtYXRpb24uCi0gICAgICovCi0gICAgYnJpUlIgPSAoYmFja3JlZmluZm8gKilhcF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKGJhY2tyZWZpbmZvKSk7Ci0gICAgaWYgKCFyYyAmJiAocC0+ZmxhZ3MgJiBSVUxFRkxBR19OT1RNQVRDSCkpIHsKLSAgICAgICAgLyogIGVtcHR5IGluZm8gb24gbmVnYXRpdmUgcGF0dGVybnMgICovCi0gICAgICAgIGJyaVJSLT5zb3VyY2UgPSAiIjsKLSAgICAgICAgYnJpUlItPm5zdWIgICA9IDA7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBicmlSUi0+c291cmNlID0gYXBfcHN0cmR1cChyLT5wb29sLCB1cmkpOwotICAgICAgICBicmlSUi0+bnN1YiAgID0gcmVnZXhwLT5yZV9uc3ViOwotICAgICAgICBtZW1jcHkoKHZvaWQgKikoYnJpUlItPnJlZ21hdGNoKSwgKHZvaWQgKikocmVnbWF0Y2gpLAotICAgICAgICAgICAgICAgc2l6ZW9mKHJlZ21hdGNoKSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgSW5pdGlhbGxhbGx5IGNyZWF0ZSB0aGUgUmV3cml0ZUNvbmQgYmFja3JlZmluZm8gd2l0aAotICAgICAqICBlbXB0eSBiYWNrcmVmaW5mbywgaS5lLiBub3Qgc3Vic3QgcGFydHMKLSAgICAgKiAgKHRoaXMgb25lIGlzIGFkanVzdGVkIGluc2lkZSBhcHBseV9yZXdyaXRlX2NvbmQoKSBsYXRlciEhKQotICAgICAqLwotICAgIGJyaVJDID0gKGJhY2tyZWZpbmZvICopYXBfcGNhbGxvYyhyLT5wb29sLCBzaXplb2YoYmFja3JlZmluZm8pKTsKLSAgICBicmlSQy0+c291cmNlID0gIiI7Ci0gICAgYnJpUkMtPm5zdWIgICA9IDA7Ci0KLSAgICAvKgotICAgICAqICBPaywgd2UgYWxyZWFkeSBrbm93IHRoZSBwYXR0ZXJuIGhhcyBtYXRjaGVkLCBidXQgd2Ugbm93Ci0gICAgICogIGFkZGl0aW9uYWxseSBoYXZlIHRvIGNoZWNrIGZvciBhbGwgZXhpc3RpbmcgcHJlY29uZGl0aW9ucwotICAgICAqICAoUmV3cml0ZUNvbmQpIHdoaWNoIGhhdmUgdG8gYmUgYWxzbyB0cnVlLiBXZSBkbyB0aGlzIGF0Ci0gICAgICogIHRoaXMgdmVyeSBsYXRlIHN0YWdlIHRvIGF2b2lkIHVubmVzc2VzYXJ5IGNoZWNrcyB3aGljaAotICAgICAqICB3b3VsZCBzbG93IGRvd24gdGhlIHJld3JpdGluZyBlbmdpbmUhIQotICAgICAqLwotICAgIHJld3JpdGVjb25kcyA9IHAtPnJld3JpdGVjb25kczsKLSAgICBjb25kcyA9IChyZXdyaXRlY29uZF9lbnRyeSAqKXJld3JpdGVjb25kcy0+ZWx0czsKLSAgICBmYWlsZWQgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCByZXdyaXRlY29uZHMtPm5lbHRzOyBpKyspIHsKLSAgICAgICAgYyA9ICZjb25kc1tpXTsKLSAgICAgICAgcmMgPSBhcHBseV9yZXdyaXRlX2NvbmQociwgYywgcGVyZGlyLCBicmlSUiwgYnJpUkMpOwotICAgICAgICBpZiAoYy0+ZmxhZ3MgJiBDT05ERkxBR19PUk5FWFQpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiAgVGhlICJPUiIgY2FzZQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAocmMgPT0gMCkgewotICAgICAgICAgICAgICAgIC8qICBPbmUgY29uZGl0aW9uIGlzIGZhbHNlLCBidXQgYW5vdGhlciBjYW4gYmUKLSAgICAgICAgICAgICAgICAgKiAgc3RpbGwgdHJ1ZSwgc28gd2UgaGF2ZSB0byBjb250aW51ZS4uLgotICAgICAgICAgICAgICAgICAqLwotCSAgICAgICAgYXBfdGFibGVfdW5zZXQoci0+bm90ZXMsIFZBUllfS0VZX1RISVMpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogIE9uZSB0cnVlIGNvbmRpdGlvbiBpcyBlbm91Z2ggaW4gIm9yIiBjYXNlLCBzbwotICAgICAgICAgICAgICAgICAqICBza2lwIHRoZSBvdGhlciBjb25kaXRpb25zIHdoaWNoIGFyZSAib3JuZXh0IgotICAgICAgICAgICAgICAgICAqICBjaGFpbmVkCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgd2hpbGUgKCAgIGkgPCByZXdyaXRlY29uZHMtPm5lbHRzCi0gICAgICAgICAgICAgICAgICAgICAgICYmIGMtPmZsYWdzICYgQ09OREZMQUdfT1JORVhUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgYyA9ICZjb25kc1tpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogIFRoZSAiQU5EIiBjYXNlLCBpLmUuIG5vICJvciIgZmxhZywKLSAgICAgICAgICAgICAqICBzbyBhIHNpbmdsZSBmYWlsdXJlIG1lYW5zIHRvdGFsIGZhaWx1cmUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZmFpbGVkID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCXZhcnkgPSBhcF90YWJsZV9nZXQoci0+bm90ZXMsIFZBUllfS0VZX1RISVMpOwotCWlmICh2YXJ5ICE9IE5VTEwpIHsKLQkgICAgYXBfdGFibGVfbWVyZ2Uoci0+bm90ZXMsIFZBUllfS0VZLCB2YXJ5KTsKLQkgICAgYXBfdGFibGVfdW5zZXQoci0+bm90ZXMsIFZBUllfS0VZX1RISVMpOwotCX0KLSAgICB9Ci0gICAgLyogIGlmIGFueSBjb25kaXRpb24gZmFpbHMgdGhlIGNvbXBsZXRlIHJ1bGUgZmFpbHMgICovCi0gICAgaWYgKGZhaWxlZCkgewotICAgICAgICBhcF90YWJsZV91bnNldChyLT5ub3RlcywgVkFSWV9LRVkpOwotICAgICAgICBhcF90YWJsZV91bnNldChyLT5ub3RlcywgVkFSWV9LRVlfVEhJUyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUmVnYXJkbGVzcyBvZiB3aGF0IHdlIGRvIG5leHQsIHdlJ3ZlIGZvdW5kIGEgbWF0Y2guICBDaGVjayB0byBzZWUKLSAgICAgKiBpZiBhbnkgb2YgdGhlIHJlcXVlc3QgaGVhZGVyIGZpZWxkcyB3ZXJlIGludm9sdmVkLCBhbmQgYWRkIHRoZW0KLSAgICAgKiB0byB0aGUgVmFyeSBmaWVsZCBvZiB0aGUgcmVzcG9uc2UuCi0gICAgICovCi0gICAgaWYgKCh2YXJ5ID0gYXBfdGFibGVfZ2V0KHItPm5vdGVzLCBWQVJZX0tFWSkpICE9IE5VTEwpIHsKLSAgICAgICAgYXBfdGFibGVfbWVyZ2Uoci0+aGVhZGVyc19vdXQsICJWYXJ5IiwgdmFyeSk7Ci0JYXBfdGFibGVfdW5zZXQoci0+bm90ZXMsIFZBUllfS0VZKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICBJZiB0aGlzIGlzIGEgcHVyZSBtYXRjaGluZyBydWxlIChgUmV3cml0ZVJ1bGUgPHBhdD4gLScpCi0gICAgICogIHdlIHN0b3AgcHJvY2Vzc2luZyBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LiBUaGUgb25seSB0aGluZwotICAgICAqICB3ZSBoYXZlIG5vdCB0byBmb3JnZXQgYXJlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLSAgICAgKiAgKGBSZXdyaXRlUnVsZSA8cGF0PiAtIFtFPS4uLl0nKQotICAgICAqLwotICAgIGlmIChzdHJjbXAob3V0cHV0LCAiLSIpID09IDApIHsKLSAgICAgICAgZm9yIChpID0gMDsgcC0+ZW52W2ldICE9IE5VTEw7IGkrKykgewotICAgICAgICAgICAgLyogIDEuIHRha2UgdGhlIHN0cmluZyAgKi8KLSAgICAgICAgICAgIGFwX2NweXN0cm4oZW52LCBwLT5lbnZbaV0sIHNpemVvZihlbnYpKTsKLSAgICAgICAgICAgIC8qICAyLiBleHBhbmQgJE4gKGkuZS4gYmFja3JlZnMgdG8gUmV3cml0ZVJ1bGUgcGF0dGVybikgICovCi0gICAgICAgICAgICBleHBhbmRfYmFja3JlZl9pbmJ1ZmZlcihyLT5wb29sLCBlbnYsIHNpemVvZihlbnYpLCBicmlSUiwgJyQnKTsKLSAgICAgICAgICAgIC8qICAzLiBleHBhbmQgJU4gKGkuZS4gYmFja3JlZnMgdG8gbGF0ZXN0IFJld3JpdGVDb25kIHBhdHRlcm4pICAqLwotICAgICAgICAgICAgZXhwYW5kX2JhY2tyZWZfaW5idWZmZXIoci0+cG9vbCwgZW52LCBzaXplb2YoZW52KSwgYnJpUkMsICclJyk7Ci0gICAgICAgICAgICAvKiAgNC4gZXhwYW5kICV7Li4ufSAoaS5lLiB2YXJpYWJsZXMpICovCi0gICAgICAgICAgICBleHBhbmRfdmFyaWFibGVzX2luYnVmZmVyKHIsIGVudiwgc2l6ZW9mKGVudikpOwotICAgICAgICAgICAgLyogIDUuIGV4cGFuZCAkey4uLn0gKFJld3JpdGVNYXAgbG9va3VwcykgICovCi0gICAgICAgICAgICBleHBhbmRfbWFwX2xvb2t1cHMociwgZW52LCBzaXplb2YoZW52KSk7Ci0gICAgICAgICAgICAvKiAgYW5kIGFkZCB0aGUgdmFyaWFibGUgdG8gQXBhY2hlJ3Mgc3RydWN0dXJlcyAgKi8KLSAgICAgICAgICAgIGFkZF9lbnZfdmFyaWFibGUociwgZW52KTsKLSAgICAgICAgfQotICAgICAgICBpZiAocC0+Zm9yY2VkX21pbWV0eXBlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChwZXJkaXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIC8qIEluIHRoZSBwZXItc2VydmVyIGNvbnRleHQgd2UgY2FuIGZvcmNlIHRoZSBNSU1FLXR5cGUKLSAgICAgICAgICAgICAgICAgKiB0aGUgY29ycmVjdCB3YXkgYnkgbm90aWZ5aW5nIG91ciBNSU1FLXR5cGUgaG9vayBoYW5kbGVyCi0gICAgICAgICAgICAgICAgICogdG8gZG8gdGhlIGpvYiB3aGVuIHRoZSBNSU1FLXR5cGUgQVBJIHN0YWdlIGlzIHJlYWNoZWQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAyLCAicmVtZW1iZXIgJXMgdG8gaGF2ZSBNSU1FLXR5cGUgJyVzJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByLT5maWxlbmFtZSwgcC0+Zm9yY2VkX21pbWV0eXBlKTsKLSAgICAgICAgICAgICAgICBhcF90YWJsZV9zZXRuKHItPm5vdGVzLCBSRVdSSVRFX0ZPUkNFRF9NSU1FVFlQRV9OT1RFVkFSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Zm9yY2VkX21pbWV0eXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8qIEluIHBlci1kaXJlY3RvcnkgY29udGV4dCB3ZSBvcGVyYXRlIGluIHRoZSBGaXh1cCBBUEkgaG9vawotICAgICAgICAgICAgICAgICAqIHdoaWNoIGlzIGFmdGVyIHRoZSBNSU1FLXR5cGUgaG9vaywgc28gb3VyIE1JTUUtdHlwZSBoYW5kbGVyCi0gICAgICAgICAgICAgICAgICogaGFzIG5vIGNoYW5jZSB0byBzZXQgci0+Y29udGVudF90eXBlLiBBbmQgYmVjYXVzZSB3ZSBhcmUKLSAgICAgICAgICAgICAgICAgKiBpbiB0aGUgc2l0dWF0aW9uIHdoZXJlIG5vIHN1YnN0aXR1dGlvbiB0YWtlcyBwbGFjZSBubwotICAgICAgICAgICAgICAgICAqIHN1Yi1yZXF1ZXN0IHdpbGwgaGFwcGVuICh3aGljaCBjb3VsZCBzb2x2ZSB0aGUKLSAgICAgICAgICAgICAgICAgKiByZXN0cmljdGlvbikuIEFzIGEgd29ya2Fyb3VuZCB3ZSBkbyBpdCBvdXJzZWxmIG5vdwotICAgICAgICAgICAgICAgICAqIGltbWVkaWF0ZWx5IGFsdGhvdWdoIHRoaXMgaXMgbm90IHN0cmljdGx5IEFQSS1jb25mb3JtaW5nLgotICAgICAgICAgICAgICAgICAqIEJ1dCBpdCdzIHRoZSBvbmx5IGNoYW5jZSB3ZSBoYXZlLi4uCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAxLCAiW3Blci1kaXIgJXNdIGZvcmNlICVzIHRvIGhhdmUgTUlNRS10eXBlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIiwgcGVyZGlyLCByLT5maWxlbmFtZSwgcC0+Zm9yY2VkX21pbWV0eXBlKTsKLSAgICAgICAgICAgICAgICByLT5jb250ZW50X3R5cGUgPSBwLT5mb3JjZWRfbWltZXR5cGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgT2ssIG5vdyB3ZSBmaW5hbGx5IGtub3cgYWxsIHBhdHRlcm5zIGhhdmUgbWF0Y2hlZCBhbmQKLSAgICAgKiAgdGhhdCB0aGVyZSBpcyBzb21ldGhpbmcgdG8gcmVwbGFjZSwgc28gd2UgY3JlYXRlIHRoZQotICAgICAqICBzdWJzdGl0dXRpb24gVVJMIHN0cmluZyBpbiBgbmV3dXJpJy4KLSAgICAgKi8KLSAgICAvKiAgMS4gdGFrZSB0aGUgb3V0cHV0IHN0cmluZyAgKi8KLSAgICBhcF9jcHlzdHJuKG5ld3VyaSwgb3V0cHV0LCBzaXplb2YobmV3dXJpKSk7Ci0gICAgLyogIDIuIGV4cGFuZCAkTiAoaS5lLiBiYWNrcmVmcyB0byBSZXdyaXRlUnVsZSBwYXR0ZXJuKSAgKi8KLSAgICBleHBhbmRfYmFja3JlZl9pbmJ1ZmZlcihyLT5wb29sLCBuZXd1cmksIHNpemVvZihuZXd1cmkpLCBicmlSUiwgJyQnKTsKLSAgICAvKiAgMy4gZXhwYW5kICVOIChpLmUuIGJhY2tyZWZzIHRvIGxhdGVzdCBSZXdyaXRlQ29uZCBwYXR0ZXJuKSAgKi8KLSAgICBleHBhbmRfYmFja3JlZl9pbmJ1ZmZlcihyLT5wb29sLCBuZXd1cmksIHNpemVvZihuZXd1cmkpLCBicmlSQywgJyUnKTsKLSAgICAvKiAgNC4gZXhwYW5kICV7Li4ufSAoaS5lLiB2YXJpYWJsZXMpICovCi0gICAgZXhwYW5kX3ZhcmlhYmxlc19pbmJ1ZmZlcihyLCBuZXd1cmksIHNpemVvZihuZXd1cmkpKTsKLSAgICAvKiAgNS4gZXhwYW5kICR7Li4ufSAoUmV3cml0ZU1hcCBsb29rdXBzKSAgKi8KLSAgICBleHBhbmRfbWFwX2xvb2t1cHMociwgbmV3dXJpLCBzaXplb2YobmV3dXJpKSk7Ci0gICAgLyogIGFuZCBsb2cgdGhlIHJlc3VsdC4uLiAqLwotICAgIGlmIChwZXJkaXIgPT0gTlVMTCkgewotICAgICAgICByZXdyaXRlbG9nKHIsIDIsICJyZXdyaXRlICVzIC0+ICVzIiwgdXJpLCBuZXd1cmkpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcmV3cml0ZWxvZyhyLCAyLCAiW3Blci1kaXIgJXNdIHJld3JpdGUgJXMgLT4gJXMiLCBwZXJkaXIsIHVyaSwgbmV3dXJpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICBBZGRpdGlvbmFsbHkgZG8gZXhwYW5zaW9uIGZvciB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLSAgICAgKiAgc3RyaW5ncyAoYFJld3JpdGVSdWxlIC4uIC4uIFtFPTxzdHJpbmc+XScpLgotICAgICAqLwotICAgIGZvciAoaSA9IDA7IHAtPmVudltpXSAhPSBOVUxMOyBpKyspIHsKLSAgICAgICAgLyogIDEuIHRha2UgdGhlIHN0cmluZyAgKi8KLSAgICAgICAgYXBfY3B5c3RybihlbnYsIHAtPmVudltpXSwgc2l6ZW9mKGVudikpOwotICAgICAgICAvKiAgMi4gZXhwYW5kICROIChpLmUuIGJhY2tyZWZzIHRvIFJld3JpdGVSdWxlIHBhdHRlcm4pICAqLwotICAgICAgICBleHBhbmRfYmFja3JlZl9pbmJ1ZmZlcihyLT5wb29sLCBlbnYsIHNpemVvZihlbnYpLCBicmlSUiwgJyQnKTsKLSAgICAgICAgLyogIDMuIGV4cGFuZCAlTiAoaS5lLiBiYWNrcmVmcyB0byBsYXRlc3QgUmV3cml0ZUNvbmQgcGF0dGVybikgICovCi0gICAgICAgIGV4cGFuZF9iYWNrcmVmX2luYnVmZmVyKHItPnBvb2wsIGVudiwgc2l6ZW9mKGVudiksIGJyaVJDLCAnJScpOwotICAgICAgICAvKiAgNC4gZXhwYW5kICV7Li4ufSAoaS5lLiB2YXJpYWJsZXMpICovCi0gICAgICAgIGV4cGFuZF92YXJpYWJsZXNfaW5idWZmZXIociwgZW52LCBzaXplb2YoZW52KSk7Ci0gICAgICAgIC8qICA1LiBleHBhbmQgJHsuLi59IChSZXdyaXRlTWFwIGxvb2t1cHMpICAqLwotICAgICAgICBleHBhbmRfbWFwX2xvb2t1cHMociwgZW52LCBzaXplb2YoZW52KSk7Ci0gICAgICAgIC8qICBhbmQgYWRkIHRoZSB2YXJpYWJsZSB0byBBcGFjaGUncyBzdHJ1Y3R1cmVzICAqLwotICAgICAgICBhZGRfZW52X3ZhcmlhYmxlKHIsIGVudik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgTm93IHJlcGxhY2UgQVBJJ3Mga25vd2xlZGdlIG9mIHRoZSBjdXJyZW50IFVSSToKLSAgICAgKiAgUmVwbGFjZSByLT5maWxlbmFtZSB3aXRoIHRoZSBuZXcgVVJJIHN0cmluZyBhbmQgc3BsaXQgb3V0Ci0gICAgICogIGFuIG9uLXRoZS1mbHkgZ2VuZXJhdGVkIFFVRVJZX1NUUklORyBwYXJ0IGludG8gci0+YXJncwotICAgICAqLwotICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmR1cChyLT5wb29sLCBuZXd1cmkpOwotICAgIHNwbGl0b3V0X3F1ZXJ5YXJncyhyLCBwLT5mbGFncyAmIFJVTEVGTEFHX1FTQVBQRU5EKTsKLQotICAgIC8qCi0gICAgICogICBBZ2FpbiBhZGQgdGhlIHByZXZpb3VzbHkgc3RyaXBwZWQgcGVyLWRpcmVjdG9yeSBsb2NhdGlvbgotICAgICAqICAgcHJlZml4IGlmIHRoZSBuZXcgVVJJIGlzIG5vdCBhIG5ldyBvbmUgZm9yIHRoaXMKLSAgICAgKiAgIGxvY2F0aW9uLCBpLmUuIGlmIGl0J3Mgbm90IHN0YXJ0aW5nIHdpdGggZWl0aGVyIGEgc2xhc2gKLSAgICAgKiAgIG9yIGEgZnVsbHkgcXVhbGlmaWVkIFVSTCBzY2hlbWUuCi0gICAgICovCi0gICAgaSA9IHN0cmxlbihyLT5maWxlbmFtZSk7Ci0gICAgaWYgKCAgIHByZWZpeHN0cmlwCi0gICAgICAgICYmICEoICAgci0+ZmlsZW5hbWVbMF0gPT0gJy8nCi0gICAgICAgICAgICAgfHwgKCAgIChpID4gNyAmJiBzdHJuY2FzZWNtcChyLT5maWxlbmFtZSwgImh0dHA6Ly8iLCA3KSA9PSAwKQotICAgICAgICAgICAgICAgICB8fCAoaSA+IDggJiYgc3RybmNhc2VjbXAoci0+ZmlsZW5hbWUsICJodHRwczovLyIsIDgpID09IDApCi0gICAgICAgICAgICAgICAgIHx8IChpID4gOSAmJiBzdHJuY2FzZWNtcChyLT5maWxlbmFtZSwgImdvcGhlcjovLyIsIDkpID09IDApCi0gICAgICAgICAgICAgICAgIHx8IChpID4gNiAmJiBzdHJuY2FzZWNtcChyLT5maWxlbmFtZSwgImZ0cDovLyIsIDYpID09IDApKSkpIHsKLSAgICAgICAgcmV3cml0ZWxvZyhyLCAzLCAiW3Blci1kaXIgJXNdIGFkZCBwZXItZGlyIHByZWZpeDogJXMgLT4gJXMlcyIsCi0gICAgICAgICAgICAgICAgICAgcGVyZGlyLCByLT5maWxlbmFtZSwgcGVyZGlyLCByLT5maWxlbmFtZSk7Ci0gICAgICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCBwZXJkaXIsIHItPmZpbGVuYW1lLCBOVUxMKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICBJZiB0aGlzIHJ1bGUgaXMgZm9yY2VkIGZvciBwcm94eSB0aHJvdWdocHV0Ci0gICAgICogIChgUmV3cml0ZVJ1bGUgLi4uIC4uLiBbUF0nKSB0aGVuIGVtdWxhdGUgbW9kX3Byb3h5J3MKLSAgICAgKiAgVVJMLXRvLWZpbGVuYW1lIGhhbmRsZXIgdG8gYmUgc3VyZSBtb2RfcHJveHkgaXMgdHJpZ2dlcmVkCi0gICAgICogIGZvciB0aGlzIFVSTCBsYXRlciBpbiB0aGUgQXBhY2hlIEFQSS4gQnV0IG1ha2Ugc3VyZSBpdCBpcwotICAgICAqICBhIGZ1bGx5LXF1YWxpZmllZCBVUkwuIChJZiBub3QgaXQgaXMgcXVhbGlmaWVkIHdpdGgKLSAgICAgKiAgb3Vyc2VsZikuCi0gICAgICovCi0gICAgaWYgKHAtPmZsYWdzICYgUlVMRUZMQUdfUFJPWFkpIHsKLSAgICAgICAgZnVsbHlfcXVhbGlmeV91cmkocik7Ci0gICAgICAgIGlmIChwZXJkaXIgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAyLCAiZm9yY2luZyBwcm94eS10aHJvdWdocHV0IHdpdGggJXMiLCByLT5maWxlbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXdyaXRlbG9nKHIsIDIsICJbcGVyLWRpciAlc10gZm9yY2luZyBwcm94eS10aHJvdWdocHV0IHdpdGggJXMiLAotICAgICAgICAgICAgICAgICAgICAgICBwZXJkaXIsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgfQotICAgICAgICByLT5maWxlbmFtZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgInByb3h5OiIsIHItPmZpbGVuYW1lLCBOVUxMKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgSWYgdGhpcyBydWxlIGlzIGV4cGxpY2l0bHkgZm9yY2VkIGZvciBIVFRQIHJlZGlyZWN0aW9uCi0gICAgICogIChgUmV3cml0ZVJ1bGUgLi4gLi4gW1JdJykgdGhlbiBmb3JjZSBhbiBleHRlcm5hbCBIVFRQCi0gICAgICogIHJlZGlyZWN0LiBCdXQgbWFrZSBzdXJlIGl0IGlzIGEgZnVsbHktcXVhbGlmaWVkIFVSTC4gKElmCi0gICAgICogIG5vdCBpdCBpcyBxdWFsaWZpZWQgd2l0aCBvdXJzZWxmKS4KLSAgICAgKi8KLSAgICBpZiAocC0+ZmxhZ3MgJiBSVUxFRkxBR19GT1JDRVJFRElSRUNUKSB7Ci0gICAgICAgIGZ1bGx5X3F1YWxpZnlfdXJpKHIpOwotICAgICAgICBpZiAocGVyZGlyID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJld3JpdGVsb2cociwgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgImV4cGxpY2l0bHkgZm9yY2luZyByZWRpcmVjdCB3aXRoICVzIiwgci0+ZmlsZW5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAyLAotICAgICAgICAgICAgICAgICAgICAgICAiW3Blci1kaXIgJXNdIGV4cGxpY2l0bHkgZm9yY2luZyByZWRpcmVjdCB3aXRoICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgcGVyZGlyLCByLT5maWxlbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgci0+c3RhdHVzID0gcC0+Zm9yY2VkX3Jlc3BvbnNlY29kZTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgU3BlY2lhbCBSZXdyaXRpbmcgRmVhdHVyZTogU2VsZi1SZWR1Y3Rpb24KLSAgICAgKiAgV2UgcmVkdWNlIHRoZSBVUkwgYnkgc3RyaXBwaW5nIGEgcG9zc2libGUKLSAgICAgKiAgaHR0cFtzXTovLzxvdXJob3N0Pls6PHBvcnQ+XSBwcmVmaXgsIGkuZS4gYSBwcmVmaXggd2hpY2gKLSAgICAgKiAgY29ycmVzcG9uZHMgdG8gb3Vyc2VsZi4gVGhpcyBpcyB0byBzaW1wbGlmeSByZXdyaXRlIG1hcHMKLSAgICAgKiAgYW5kIHRvIGF2b2lkIHJlY3Vyc2lvbiwgZXRjLiBXaGVuIHRoaXMgcHJlZml4IGlzIG5vdCBhCi0gICAgICogIGNvaW5jaWRlbmNlIHRoZW4gdGhlIHVzZXIgaGFzIHRvIHVzZSBbUl0gZXhwbGljaXRseSAoc2VlCi0gICAgICogIGFib3ZlKS4KLSAgICAgKi8KLSAgICByZWR1Y2VfdXJpKHIpOwotCi0gICAgLyoKLSAgICAgKiAgSWYgdGhpcyBydWxlIGlzIHN0aWxsIGltcGxpY2l0bHkgZm9yY2VkIGZvciBIVFRQCi0gICAgICogIHJlZGlyZWN0aW9uIChgUmV3cml0ZVJ1bGUgLi4gPHNjaGVtZT46Ly8uLi4nKSB0aGVuCi0gICAgICogIGRpcmVjdGx5IGZvcmNlIGFuIGV4dGVybmFsIEhUVFAgcmVkaXJlY3QuCi0gICAgICovCi0gICAgaSA9IHN0cmxlbihyLT5maWxlbmFtZSk7Ci0gICAgaWYgKCAgIChpID4gNyAmJiBzdHJuY2FzZWNtcChyLT5maWxlbmFtZSwgImh0dHA6Ly8iLCA3KSAgID09IDApCi0gICAgICAgIHx8IChpID4gOCAmJiBzdHJuY2FzZWNtcChyLT5maWxlbmFtZSwgImh0dHBzOi8vIiwgOCkgID09IDApCi0gICAgICAgIHx8IChpID4gOSAmJiBzdHJuY2FzZWNtcChyLT5maWxlbmFtZSwgImdvcGhlcjovLyIsIDkpID09IDApCi0gICAgICAgIHx8IChpID4gNiAmJiBzdHJuY2FzZWNtcChyLT5maWxlbmFtZSwgImZ0cDovLyIsIDYpICAgID09IDApKSB7Ci0gICAgICAgIGlmIChwZXJkaXIgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAyLAotICAgICAgICAgICAgICAgICAgICAgICAiaW1wbGljaXRseSBmb3JjaW5nIHJlZGlyZWN0IChyYz0lZCkgd2l0aCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgIHAtPmZvcmNlZF9yZXNwb25zZWNvZGUsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJld3JpdGVsb2cociwgMiwgIltwZXItZGlyICVzXSBpbXBsaWNpdGx5IGZvcmNpbmcgcmVkaXJlY3QgIgotICAgICAgICAgICAgICAgICAgICAgICAiKHJjPSVkKSB3aXRoICVzIiwgcGVyZGlyLCBwLT5mb3JjZWRfcmVzcG9uc2Vjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICByLT5maWxlbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgci0+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+YXJncyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi0KLS8qCi0qKgotKiogIHN0cmlwICdodHRwW3NdOi8vb3VyaG9zdC8nIGZyb20gVVJJCi0qKgotKi8KLQotc3RhdGljIHZvaWQgcmVkdWNlX3VyaShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjaGFyICpjcDsKLSAgICB1bnNpZ25lZCBzaG9ydCBwb3J0OwotICAgIGNoYXIgKnBvcnRwOwotICAgIGNoYXIgKmhvc3RwOwotICAgIGNoYXIgKnVybDsKLSAgICBjaGFyIGM7Ci0gICAgY2hhciBob3N0W0xPTkdfU1RSSU5HX0xFTl07Ci0gICAgY2hhciBidWZbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgKm9sZHVyaTsKLSAgICBpbnQgbDsKLQotICAgIGNwID0gYXBfaHR0cF9tZXRob2Qocik7Ci0gICAgbCAgPSBzdHJsZW4oY3ApOwotICAgIGlmICggICBzdHJsZW4oci0+ZmlsZW5hbWUpID4gbCszIAotICAgICAgICAmJiBzdHJuY2FzZWNtcChyLT5maWxlbmFtZSwgY3AsIGwpID09IDAKLSAgICAgICAgJiYgci0+ZmlsZW5hbWVbbF0gICA9PSAnOicKLSAgICAgICAgJiYgci0+ZmlsZW5hbWVbbCsxXSA9PSAnLycKLSAgICAgICAgJiYgci0+ZmlsZW5hbWVbbCsyXSA9PSAnLycgICAgICAgICAgICAgKSB7Ci0gICAgICAgIC8qIHRoZXJlIHdhcyByZWFsbHkgYSByZXdyaXRlIHRvIGEgcmVtb3RlIHBhdGggKi8KLQotICAgICAgICBvbGR1cmkgPSBhcF9wc3RyZHVwKHItPnBvb2wsIHItPmZpbGVuYW1lKTsgLyogc2F2ZSBmb3IgbG9nZ2luZyAqLwotCi0gICAgICAgIC8qIGN1dCB0aGUgaG9zdG5hbWUgYW5kIHBvcnQgb3V0IG9mIHRoZSBVUkkgKi8KLSAgICAgICAgYXBfY3B5c3RybihidWYsIHItPmZpbGVuYW1lKyhsKzMpLCBzaXplb2YoYnVmKSk7Ci0gICAgICAgIGhvc3RwID0gYnVmOwotICAgICAgICBmb3IgKGNwID0gaG9zdHA7ICpjcCAhPSAnXDAnICYmICpjcCAhPSAnLycgJiYgKmNwICE9ICc6JzsgY3ArKykKLSAgICAgICAgICAgIDsKLSAgICAgICAgaWYgKCpjcCA9PSAnOicpIHsKLSAgICAgICAgICAgIC8qIHNldCBob3N0ICovCi0gICAgICAgICAgICAqY3ArKyA9ICdcMCc7Ci0gICAgICAgICAgICBhcF9jcHlzdHJuKGhvc3QsIGhvc3RwLCBzaXplb2YoaG9zdCkpOwotICAgICAgICAgICAgLyogc2V0IHBvcnQgKi8KLSAgICAgICAgICAgIHBvcnRwID0gY3A7Ci0gICAgICAgICAgICBmb3IgKDsgKmNwICE9ICdcMCcgJiYgKmNwICE9ICcvJzsgY3ArKykKLSAgICAgICAgICAgICAgICA7Ci0gICAgICAgICAgICBjID0gKmNwOwotICAgICAgICAgICAgKmNwID0gJ1wwJzsKLSAgICAgICAgICAgIHBvcnQgPSBhdG9pKHBvcnRwKTsKLSAgICAgICAgICAgICpjcCA9IGM7Ci0gICAgICAgICAgICAvKiBzZXQgcmVtYWluaW5nIHVybCAqLwotICAgICAgICAgICAgdXJsID0gY3A7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKmNwID09ICcvJykgewotICAgICAgICAgICAgLyogc2V0IGhvc3QgKi8KLSAgICAgICAgICAgICpjcCA9ICdcMCc7Ci0gICAgICAgICAgICBhcF9jcHlzdHJuKGhvc3QsIGhvc3RwLCBzaXplb2YoaG9zdCkpOwotICAgICAgICAgICAgKmNwID0gJy8nOwotICAgICAgICAgICAgLyogc2V0IHBvcnQgKi8KLSAgICAgICAgICAgIHBvcnQgPSBhcF9kZWZhdWx0X3BvcnQocik7Ci0gICAgICAgICAgICAvKiBzZXQgcmVtYWluaW5nIHVybCAqLwotICAgICAgICAgICAgdXJsID0gY3A7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKiBzZXQgaG9zdCAqLwotICAgICAgICAgICAgYXBfY3B5c3Rybihob3N0LCBob3N0cCwgc2l6ZW9mKGhvc3QpKTsKLSAgICAgICAgICAgIC8qIHNldCBwb3J0ICovCi0gICAgICAgICAgICBwb3J0ID0gYXBfZGVmYXVsdF9wb3J0KHIpOwotICAgICAgICAgICAgLyogc2V0IHJlbWFpbmluZyB1cmwgKi8KLSAgICAgICAgICAgIHVybCA9ICIvIjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIG5vdyBjaGVjayB3aGV0aGVyIHdlIGNvdWxkIHJlZHVjZSBpdCB0byBhIGxvY2FsIHBhdGguLi4gKi8KLSAgICAgICAgaWYgKGFwX21hdGNoZXNfcmVxdWVzdF92aG9zdChyLCBob3N0LCBwb3J0KSkgewotICAgICAgICAgICAgLyogdGhpcyBpcyBvdXIgaG9zdCwgc28gb25seSB0aGUgVVJMIHJlbWFpbnMgKi8KLSAgICAgICAgICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmR1cChyLT5wb29sLCB1cmwpOwotICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAzLCAicmVkdWNlICVzIC0+ICVzIiwgb2xkdXJpLCByLT5maWxlbmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi0KLS8qCi0qKgotKiogIGFkZCAnaHR0cFtzXTovL291cmhvc3RbOm91cnBvcnRdLycgdG8gVVJJCi0qKiAgaWYgVVJJIGlzIHN0aWxsIG5vdCBmdWxseSBxdWFsaWZpZWQKLSoqCi0qLwotCi1zdGF0aWMgdm9pZCBmdWxseV9xdWFsaWZ5X3VyaShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpbnQgaTsKLSAgICBjaGFyIGJ1ZlszMl07Ci0gICAgY29uc3QgY2hhciAqdGhpc3NlcnZlcjsKLSAgICBjaGFyICp0aGlzcG9ydDsKLSAgICBpbnQgcG9ydDsKLQotICAgIGkgPSBzdHJsZW4oci0+ZmlsZW5hbWUpOwotICAgIGlmICghKCAgIChpID4gNyAmJiBzdHJuY2FzZWNtcChyLT5maWxlbmFtZSwgImh0dHA6Ly8iLCA3KSAgID09IDApCi0gICAgICAgICAgfHwgKGkgPiA4ICYmIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAiaHR0cHM6Ly8iLCA4KSAgPT0gMCkKLSAgICAgICAgICB8fCAoaSA+IDkgJiYgc3RybmNhc2VjbXAoci0+ZmlsZW5hbWUsICJnb3BoZXI6Ly8iLCA5KSA9PSAwKQotICAgICAgICAgIHx8IChpID4gNiAmJiBzdHJuY2FzZWNtcChyLT5maWxlbmFtZSwgImZ0cDovLyIsIDYpICAgID09IDApKSkgewotCi0gICAgICAgIHRoaXNzZXJ2ZXIgPSBhcF9nZXRfc2VydmVyX25hbWUocik7Ci0gICAgICAgIHBvcnQgPSBhcF9nZXRfc2VydmVyX3BvcnQocik7Ci0gICAgICAgIGlmIChhcF9pc19kZWZhdWx0X3BvcnQocG9ydCxyKSkgewotICAgICAgICAgICAgdGhpc3BvcnQgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGFwX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICI6JXUiLCBwb3J0KTsKLSAgICAgICAgICAgIHRoaXNwb3J0ID0gYnVmOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHItPmZpbGVuYW1lWzBdID09ICcvJykgewotICAgICAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3ByaW50ZihyLT5wb29sLCAiJXM6Ly8lcyVzJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9odHRwX21ldGhvZChyKSwgdGhpc3NlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc3BvcnQsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHItPmZpbGVuYW1lID0gYXBfcHNwcmludGYoci0+cG9vbCwgIiVzOi8vJXMlcy8lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX2h0dHBfbWV0aG9kKHIpLCB0aGlzc2VydmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzcG9ydCwgci0+ZmlsZW5hbWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybjsKLX0KLQotCi0vKgotKioKLSoqICBFeHBhbmQgdGhlICUwLSU5IG9yICQwLSQ5IHJlZ2V4IGJhY2tyZWZlcmVuY2VzCi0qKgotKi8KLQotc3RhdGljIHZvaWQgZXhwYW5kX2JhY2tyZWZfaW5idWZmZXIocG9vbCAqcCwgY2hhciAqYnVmLCBpbnQgbmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tyZWZpbmZvICpicmksIGNoYXIgYykKLXsKLSAgICBpbnQgaTsKLQotICAgIGlmIChicmktPm5zdWIgPCAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoYyAhPSAnJCcpIHsKLSAgICAgICAgLyogc2FmZSBleGlzdGluZyAkTiBiYWNrcmVmcyBhbmQgcmVwbGFjZSA8Yz5OIHdpdGggJE4gYmFja3JlZnMgKi8KLSAgICAgICAgZm9yIChpID0gMDsgYnVmW2ldICE9ICdcMCcgJiYgaSA8IG5idWY7IGkrKykgewotICAgICAgICAgICAgaWYgKGJ1ZltpXSA9PSAnJCcgJiYgKGJ1ZltpKzFdID49ICcwJyAmJiBidWZbaSsxXSA8PSAnOScpKSB7Ci0gICAgICAgICAgICAgICAgYnVmW2krK10gPSAnXDAwMSc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChidWZbaV0gPT0gYyAmJiAoYnVmW2krMV0gPj0gJzAnICYmIGJ1ZltpKzFdIDw9ICc5JykpIHsKLSAgICAgICAgICAgICAgICBidWZbaSsrXSA9ICckJzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIG5vdyBhcHBseSB0aGUgcHJlZ3N1YigpIGZ1bmN0aW9uICovCi0gICAgYXBfY3B5c3RybihidWYsIGFwX3ByZWdzdWIocCwgYnVmLCBicmktPnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBicmktPm5zdWIrMSwgYnJpLT5yZWdtYXRjaCksIG5idWYpOwotCi0gICAgaWYgKGMgIT0gJyQnKSB7Ci0gICAgICAgIC8qIHJlc3RvcmUgdGhlIG9yaWdpbmFsICROIGJhY2tyZWZzICovCi0gICAgICAgIGZvciAoaSA9IDA7IGJ1ZltpXSAhPSAnXDAnICYmIGkgPCBuYnVmOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChidWZbaV0gPT0gJ1wwMDEnICYmIChidWZbaSsxXSA+PSAnMCcgJiYgYnVmW2krMV0gPD0gJzknKSkgewotICAgICAgICAgICAgICAgIGJ1ZltpKytdID0gJyQnOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0KLS8qCi0qKgotKiogIEV4cGFuZCB0aWxkZS1wYXRocyAoL351c2VyKSB0aHJvdWdoCi0qKiAgVW5peCAvZXRjL3Bhc3N3ZCBkYXRhYmFzZSBpbmZvcm1hdGlvbgotKioKLSovCi0jaWZuZGVmIFdJTjMyCi1zdGF0aWMgY2hhciAqZXhwYW5kX3RpbGRlcGF0aHMocmVxdWVzdF9yZWMgKnIsIGNoYXIgKnVyaSkKLXsKLSAgICBjaGFyIHVzZXJbTE9OR19TVFJJTkdfTEVOXTsKLSAgICBzdHJ1Y3QgcGFzc3dkICpwdzsKLSAgICBjaGFyICpuZXd1cmk7Ci0gICAgaW50IGksIGo7Ci0KLSAgICBuZXd1cmkgPSB1cmk7Ci0gICAgaWYgKHVyaSAhPSBOVUxMICYmIHN0cmxlbih1cmkpID4gMiAmJiB1cmlbMF0gPT0gJy8nICYmIHVyaVsxXSA9PSAnficpIHsKLSAgICAgICAgLyogY3V0IG91dCB0aGUgdXNlcm5hbWUgKi8KLSAgICAgICAgZm9yIChqID0gMCwgaSA9IDI7IGogPCBzaXplb2YodXNlciktMQotICAgICAgICAgICAgICAgJiYgdXJpW2ldICE9ICdcMCcKLSAgICAgICAgICAgICAgICYmIHVyaVtpXSAhPSAnLycgIDsgKSB7Ci0gICAgICAgICAgICB1c2VyW2orK10gPSB1cmlbaSsrXTsKLSAgICAgICAgfQotICAgICAgICB1c2VyW2pdID0gJ1wwJzsKLQotICAgICAgICAvKiBsb29rdXAgdXNlcm5hbWUgaW4gc3lzdGVtcyBwYXNzd2QgZmlsZSAqLwotICAgICAgICBpZiAoKHB3ID0gZ2V0cHduYW0odXNlcikpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIC8qIG9rLCB1c2VyIHdhcyBmb3VuZCwgc28gZXhwYW5kIHRoZSB+dXNlciBzdHJpbmcgKi8KLSAgICAgICAgICAgIGlmICh1cmlbaV0gIT0gJ1wwJykgewotICAgICAgICAgICAgICAgIC8qIH51c2VyL2FueXRoaW5nLi4uICBoYXMgdG8gYmUgZXhwYW5kZWQgKi8KLSAgICAgICAgICAgICAgICBpZiAocHctPnB3X2RpcltzdHJsZW4ocHctPnB3X2RpciktMV0gPT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB3LT5wd19kaXJbc3RybGVuKHB3LT5wd19kaXIpLTFdID0gJ1wwJzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmV3dXJpID0gYXBfcHN0cmNhdChyLT5wb29sLCBwdy0+cHdfZGlyLCB1cmkraSwgTlVMTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBvbmx5IH51c2VyIGhhcyB0byBiZSBleHBhbmRlZCAqLwotICAgICAgICAgICAgICAgIG5ld3VyaSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgcHctPnB3X2Rpcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5ld3VyaTsKLX0KLSNlbmRpZgotCi0vKgotKioKLSoqICBtYXBmaWxlIGV4cGFuc2lvbiBzdXBwb3J0Ci0qKiAgaS5lLiBleHBhbnNpb24gb2YgTUFQIGxvb2t1cCBkaXJlY3RpdmVzCi0qKiAgJHs8bWFwbmFtZT46PGtleT59IGluIFJld3JpdGVSdWxlIHJocwotKioKLSovCi0KLSNkZWZpbmUgbGltaXRfbGVuZ3RoKG4pIChuID4gTE9OR19TVFJJTkdfTEVOLTEgPyBMT05HX1NUUklOR19MRU4tMSA6IG4pCi0KLXN0YXRpYyB2b2lkIGV4cGFuZF9tYXBfbG9va3VwcyhyZXF1ZXN0X3JlYyAqciwgY2hhciAqdXJpLCBpbnQgdXJpX2xlbikKLXsKLSAgICBjaGFyIG5ld3VyaVtNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciAqY3BJOwotICAgIGNoYXIgKmNwSUU7Ci0gICAgY2hhciAqY3BPOwotICAgIGNoYXIgKmNwVDsKLSAgICBjaGFyICpjcFQyOwotICAgIGNoYXIgbWFwbmFtZVtMT05HX1NUUklOR19MRU5dOwotICAgIGNoYXIgbWFwa2V5W0xPTkdfU1RSSU5HX0xFTl07Ci0gICAgY2hhciBkZWZhdWx0dmFsdWVbTE9OR19TVFJJTkdfTEVOXTsKLSAgICBpbnQgbjsKLQotICAgIGNwSSA9IHVyaTsKLSAgICBjcElFID0gY3BJK3N0cmxlbihjcEkpOwotICAgIGNwTyA9IG5ld3VyaTsKLSAgICB3aGlsZSAoY3BJIDwgY3BJRSkgewotICAgICAgICBpZiAoY3BJKzYgPCBjcElFICYmIHN0cm5jbXAoY3BJLCAiJHsiLCAyKSA9PSAwKSB7Ci0gICAgICAgICAgICAvKiBtaXNzaW5nIGRlbGltaXRlciAtPiB0YWtlIGl0IGFzIHBsYWluIHRleHQgKi8KLSAgICAgICAgICAgIGlmICggICBzdHJjaHIoY3BJKzIsICc6JykgPT0gTlVMTAotICAgICAgICAgICAgICAgIHx8IHN0cmNocihjcEkrMiwgJ30nKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGNwTywgY3BJLCAyKTsKLSAgICAgICAgICAgICAgICBjcE8gKz0gMjsKLSAgICAgICAgICAgICAgICBjcEkgKz0gMjsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNwSSArPSAyOwotCi0gICAgICAgICAgICBjcFQgPSBzdHJjaHIoY3BJLCAnOicpOwotICAgICAgICAgICAgbiA9IGNwVC1jcEk7Ci0gICAgICAgICAgICBtZW1jcHkobWFwbmFtZSwgY3BJLCBsaW1pdF9sZW5ndGgobikpOwotICAgICAgICAgICAgbWFwbmFtZVtsaW1pdF9sZW5ndGgobildID0gJ1wwJzsKLSAgICAgICAgICAgIGNwSSArPSBuKzE7Ci0KLSAgICAgICAgICAgIGNwVDIgPSBzdHJjaHIoY3BJLCAnfCcpOwotICAgICAgICAgICAgY3BUID0gc3RyY2hyKGNwSSwgJ30nKTsKLSAgICAgICAgICAgIGlmIChjcFQyICE9IE5VTEwgJiYgY3BUMiA8IGNwVCkgewotICAgICAgICAgICAgICAgIG4gPSBjcFQyLWNwSTsKLSAgICAgICAgICAgICAgICBtZW1jcHkobWFwa2V5LCBjcEksIGxpbWl0X2xlbmd0aChuKSk7Ci0gICAgICAgICAgICAgICAgbWFwa2V5W2xpbWl0X2xlbmd0aChuKV0gPSAnXDAnOwotICAgICAgICAgICAgICAgIGNwSSArPSBuKzE7Ci0KLSAgICAgICAgICAgICAgICBuID0gY3BULWNwSTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoZGVmYXVsdHZhbHVlLCBjcEksIGxpbWl0X2xlbmd0aChuKSk7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdHZhbHVlW2xpbWl0X2xlbmd0aChuKV0gPSAnXDAnOwotICAgICAgICAgICAgICAgIGNwSSArPSBuKzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBuID0gY3BULWNwSTsKLSAgICAgICAgICAgICAgICBtZW1jcHkobWFwa2V5LCBjcEksIGxpbWl0X2xlbmd0aChuKSk7Ci0gICAgICAgICAgICAgICAgbWFwa2V5W2xpbWl0X2xlbmd0aChuKV0gPSAnXDAnOwotICAgICAgICAgICAgICAgIGNwSSArPSBuKzE7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0dmFsdWVbMF0gPSAnXDAnOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjcFQgPSBsb29rdXBfbWFwKHIsIG1hcG5hbWUsIG1hcGtleSk7Ci0gICAgICAgICAgICBpZiAoY3BUICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBuID0gc3RybGVuKGNwVCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNwTyArIG4gPj0gbmV3dXJpICsgc2l6ZW9mKG5ld3VyaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsICJpbnN1ZmZpY2llbnQgc3BhY2UgaW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGFuZF9tYXBfbG9va3VwcywgYWJvcnRpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkoY3BPLCBjcFQsIG4pOwotICAgICAgICAgICAgICAgIGNwTyArPSBuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbiA9IHN0cmxlbihkZWZhdWx0dmFsdWUpOwotICAgICAgICAgICAgICAgIGlmIChjcE8gKyBuID49IG5ld3VyaSArIHNpemVvZihuZXd1cmkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciwgImluc3VmZmljaWVudCBzcGFjZSBpbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwYW5kX21hcF9sb29rdXBzLCBhYm9ydGluZyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweShjcE8sIGRlZmF1bHR2YWx1ZSwgbik7Ci0gICAgICAgICAgICAgICAgY3BPICs9IG47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjcFQgPSBzdHJzdHIoY3BJLCAiJHsiKTsKLSAgICAgICAgICAgIGlmIChjcFQgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBjcFQgPSBjcEkrc3RybGVuKGNwSSk7Ci0gICAgICAgICAgICBuID0gY3BULWNwSTsKLSAgICAgICAgICAgIGlmIChjcE8gKyBuID49IG5ld3VyaSArIHNpemVvZihuZXd1cmkpKSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsICJpbnN1ZmZpY2llbnQgc3BhY2UgaW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwYW5kX21hcF9sb29rdXBzLCBhYm9ydGluZyIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweShjcE8sIGNwSSwgbik7Ci0gICAgICAgICAgICBjcE8gKz0gbjsKLSAgICAgICAgICAgIGNwSSArPSBuOwotICAgICAgICB9Ci0gICAgfQotICAgICpjcE8gPSAnXDAnOwotICAgIGFwX2NweXN0cm4odXJpLCBuZXd1cmksIHVyaV9sZW4pOwotICAgIHJldHVybjsKLX0KLQotI3VuZGVmIGxpbWl0X2xlbmd0aAotCi0KLQotLyoKLSoqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKiogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qKiB8ICAgICAgICAgICAgICBEQk0gaGFzaGZpbGUgc3VwcG9ydAotKiogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi0KLQotc3RhdGljIGNoYXIgKmxvb2t1cF9tYXAocmVxdWVzdF9yZWMgKnIsIGNoYXIgKm5hbWUsIGNoYXIgKmtleSkKLXsKLSAgICB2b2lkICpzY29uZjsKLSAgICByZXdyaXRlX3NlcnZlcl9jb25mICpjb25mOwotICAgIGFycmF5X2hlYWRlciAqcmV3cml0ZW1hcHM7Ci0gICAgcmV3cml0ZW1hcF9lbnRyeSAqZW50cmllczsKLSAgICByZXdyaXRlbWFwX2VudHJ5ICpzOwotICAgIGNoYXIgKnZhbHVlOwotICAgIHN0cnVjdCBzdGF0IHN0OwotICAgIGludCBpOwotCi0gICAgLyogZ2V0IG1hcCBjb25maWd1cmF0aW9uICovCi0gICAgc2NvbmYgPSByLT5zZXJ2ZXItPm1vZHVsZV9jb25maWc7Ci0gICAgY29uZiAgPSAocmV3cml0ZV9zZXJ2ZXJfY29uZiAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHNjb25mLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJld3JpdGVfbW9kdWxlKTsKLSAgICByZXdyaXRlbWFwcyA9IGNvbmYtPnJld3JpdGVtYXBzOwotCi0gICAgZW50cmllcyA9IChyZXdyaXRlbWFwX2VudHJ5ICopcmV3cml0ZW1hcHMtPmVsdHM7Ci0gICAgZm9yIChpID0gMDsgaSA8IHJld3JpdGVtYXBzLT5uZWx0czsgaSsrKSB7Ci0gICAgICAgIHMgPSAmZW50cmllc1tpXTsKLSAgICAgICAgaWYgKHN0cmNtcChzLT5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAocy0+dHlwZSA9PSBNQVBUWVBFX1RYVCkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0KHMtPmNoZWNrZmlsZSwgJnN0KSA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2RfcmV3cml0ZTogY2FuJ3QgYWNjZXNzIHRleHQgUmV3cml0ZU1hcCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZSAlcyIsIHMtPmNoZWNrZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJld3JpdGVsb2cociwgMSwgImNhbid0IG9wZW4gUmV3cml0ZU1hcCBmaWxlLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlZSBlcnJvciBsb2ciKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0X2NhY2hlX3N0cmluZyhjYWNoZXAsIHMtPm5hbWUsIENBQ0hFTU9ERV9UUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Quc3RfbXRpbWUsIGtleSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCA2LCAiY2FjaGUgbG9va3VwIEZBSUxFRCwgZm9yY2luZyBuZXcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXAgbG9va3VwIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodmFsdWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cF9tYXBfdHh0ZmlsZShyLCBzLT5kYXRhZmlsZSwga2V5KSkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCA1LCAibWFwIGxvb2t1cCBPSzogbWFwPSVzIGtleT0lc1t0eHRdICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+IHZhbD0lcyIsIHMtPm5hbWUsIGtleSwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2NhY2hlX3N0cmluZyhjYWNoZXAsIHMtPm5hbWUsIENBQ0hFTU9ERV9UUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Quc3RfbXRpbWUsIGtleSwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCA1LCAibWFwIGxvb2t1cCBGQUlMRUQ6IG1hcD0lc1t0eHRdICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImtleT0lcyIsIHMtPm5hbWUsIGtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfY2FjaGVfc3RyaW5nKGNhY2hlcCwgcy0+bmFtZSwgQ0FDSEVNT0RFX1RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC5zdF9tdGltZSwga2V5LCAiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCA1LCAiY2FjaGUgbG9va3VwIE9LOiBtYXA9JXNbdHh0XSBrZXk9JXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItPiB2YWw9JXMiLCBzLT5uYW1lLCBrZXksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlWzBdICE9ICdcMCcgPyB2YWx1ZSA6IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocy0+dHlwZSA9PSBNQVBUWVBFX0RCTSkgewotI2lmbmRlZiBOT19EQk1fUkVXUklURU1BUAotICAgICAgICAgICAgICAgIGlmIChzdGF0KHMtPmNoZWNrZmlsZSwgJnN0KSA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2RfcmV3cml0ZTogY2FuJ3QgYWNjZXNzIERCTSBSZXdyaXRlTWFwICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlICVzIiwgcy0+Y2hlY2tmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAxLCAiY2FuJ3Qgb3BlbiBEQk0gUmV3cml0ZU1hcCBmaWxlLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlZSBlcnJvciBsb2ciKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0X2NhY2hlX3N0cmluZyhjYWNoZXAsIHMtPm5hbWUsIENBQ0hFTU9ERV9UUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Quc3RfbXRpbWUsIGtleSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCA2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWNoZSBsb29rdXAgRkFJTEVELCBmb3JjaW5nIG5ldyBtYXAgbG9va3VwIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodmFsdWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cF9tYXBfZGJtZmlsZShyLCBzLT5kYXRhZmlsZSwga2V5KSkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCA1LCAibWFwIGxvb2t1cCBPSzogbWFwPSVzW2RibV0ga2V5PSVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+IHZhbD0lcyIsIHMtPm5hbWUsIGtleSwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2NhY2hlX3N0cmluZyhjYWNoZXAsIHMtPm5hbWUsIENBQ0hFTU9ERV9UUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Quc3RfbXRpbWUsIGtleSwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCA1LCAibWFwIGxvb2t1cCBGQUlMRUQ6IG1hcD0lc1tkYm1dICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImtleT0lcyIsIHMtPm5hbWUsIGtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfY2FjaGVfc3RyaW5nKGNhY2hlcCwgcy0+bmFtZSwgQ0FDSEVNT0RFX1RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC5zdF9tdGltZSwga2V5LCAiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCA1LCAiY2FjaGUgbG9va3VwIE9LOiBtYXA9JXNbZGJtXSBrZXk9JXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItPiB2YWw9JXMiLCBzLT5uYW1lLCBrZXksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlWzBdICE9ICdcMCcgPyB2YWx1ZSA6IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSNlbmRpZgotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocy0+dHlwZSA9PSBNQVBUWVBFX1BSRykgewotICAgICAgICAgICAgICAgIGlmICgodmFsdWUgPQotICAgICAgICAgICAgICAgICAgICAgbG9va3VwX21hcF9wcm9ncmFtKHIsIHMtPmZwaW4sIHMtPmZwb3V0LCBrZXkpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJld3JpdGVsb2cociwgNSwgIm1hcCBsb29rdXAgT0s6IG1hcD0lcyBrZXk9JXMgLT4gdmFsPSVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5uYW1lLCBrZXksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCA1LCAibWFwIGxvb2t1cCBGQUlMRUQ6IG1hcD0lcyBrZXk9JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm5hbWUsIGtleSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocy0+dHlwZSA9PSBNQVBUWVBFX0lOVCkgewotICAgICAgICAgICAgICAgIGlmICgodmFsdWUgPSBsb29rdXBfbWFwX2ludGVybmFsKHIsIHMtPmZ1bmMsIGtleSkpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCA1LCAibWFwIGxvb2t1cCBPSzogbWFwPSVzIGtleT0lcyAtPiB2YWw9JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm5hbWUsIGtleSwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDUsICJtYXAgbG9va3VwIEZBSUxFRDogbWFwPSVzIGtleT0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bmFtZSwga2V5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzLT50eXBlID09IE1BUFRZUEVfUk5EKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXQocy0+Y2hlY2tmaWxlLCAmc3QpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vZF9yZXdyaXRlOiBjYW4ndCBhY2Nlc3MgdGV4dCBSZXdyaXRlTWFwICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlICVzIiwgcy0+Y2hlY2tmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAxLCAiY2FuJ3Qgb3BlbiBSZXdyaXRlTWFwIGZpbGUsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VlIGVycm9yIGxvZyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRfY2FjaGVfc3RyaW5nKGNhY2hlcCwgcy0+bmFtZSwgQ0FDSEVNT0RFX1RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC5zdF9tdGltZSwga2V5KTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDYsICJjYWNoZSBsb29rdXAgRkFJTEVELCBmb3JjaW5nIG5ldyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hcCBsb29rdXAiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh2YWx1ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwX21hcF90eHRmaWxlKHIsIHMtPmRhdGFmaWxlLCBrZXkpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDUsICJtYXAgbG9va3VwIE9LOiBtYXA9JXMga2V5PSVzW3R4dF0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLT4gdmFsPSVzIiwgcy0+bmFtZSwga2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfY2FjaGVfc3RyaW5nKGNhY2hlcCwgcy0+bmFtZSwgQ0FDSEVNT0RFX1RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC5zdF9tdGltZSwga2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDUsICJtYXAgbG9va3VwIEZBSUxFRDogbWFwPSVzW3R4dF0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia2V5PSVzIiwgcy0+bmFtZSwga2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9jYWNoZV9zdHJpbmcoY2FjaGVwLCBzLT5uYW1lLCBDQUNIRU1PREVfVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LnN0X210aW1lLCBrZXksICIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDUsICJjYWNoZSBsb29rdXAgT0s6IG1hcD0lc1t0eHRdIGtleT0lcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+IHZhbD0lcyIsIHMtPm5hbWUsIGtleSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodmFsdWVbMF0gIT0gJ1wwJykgewotICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZWN0X3JhbmRvbV92YWx1ZV9wYXJ0KHIsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDUsICJyYW5kb21seSBjaG9vc2VuIHRoZSBzdWJ2YWx1ZSBgJXMnIiwgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjaGFyICpsb29rdXBfbWFwX3R4dGZpbGUocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmZpbGUsIGNoYXIgKmtleSkKLXsKLSAgICBGSUxFICpmcCA9IE5VTEw7Ci0gICAgY2hhciBsaW5lWzEwMjRdOwotICAgIGNoYXIgKnZhbHVlID0gTlVMTDsKLSAgICBjaGFyICpjcFQ7Ci0gICAgc2l6ZV90IHNraXA7Ci0gICAgY2hhciAqY3Vya2V5OwotICAgIGNoYXIgKmN1cnZhbDsKLQotICAgIGlmICgoZnAgPSBhcF9wZm9wZW4oci0+cG9vbCwgZmlsZSwgInIiKSkgPT0gTlVMTCkgewotICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChsaW5lWzBdID09ICcjJykKLSAgICAgICAgICAgIGNvbnRpbnVlOyAvKiBpZ25vcmUgY29tbWVudHMgKi8KLSAgICAgICAgY3BUID0gbGluZTsKLSAgICAgICAgY3Vya2V5ID0gY3BUOwotICAgICAgICBza2lwID0gc3RyY3NwbihjcFQsIiBcdFxyXG4iKTsKLSAgICAgICAgaWYgKHNraXAgPT0gMCkKLSAgICAgICAgICAgIGNvbnRpbnVlOyAvKiBpZ25vcmUgbGluZXMgdGhhdCBzdGFydCB3aXRoIGEgc3BhY2UsIHRhYiwgQ1IsIG9yIExGICovCi0gICAgICAgIGNwVCArPSBza2lwOwotICAgICAgICAqY3BUID0gJ1wwJzsKLSAgICAgICAgaWYgKHN0cmNtcChjdXJrZXksIGtleSkgIT0gMCkKLSAgICAgICAgICAgIGNvbnRpbnVlOyAvKiBrZXkgZG9lcyBub3QgbWF0Y2guLi4gKi8KLSAgICAgICAgICAgIAotICAgICAgICAvKiBmb3VuZCBhIG1hdGNoaW5nIGtleTsgbm93IGV4dHJhY3QgYW5kIHJldHVybiB0aGUgdmFsdWUgKi8KLSAgICAgICAgKytjcFQ7Ci0gICAgICAgIHNraXAgPSBzdHJzcG4oY3BULCAiIFx0XHJcbiIpOwotICAgICAgICBjcFQgKz0gc2tpcDsKLSAgICAgICAgY3VydmFsID0gY3BUOwotICAgICAgICBza2lwID0gc3RyY3NwbihjcFQsICIgXHRcclxuIik7Ci0gICAgICAgIGlmIChza2lwID09IDApCi0gICAgICAgICAgICBjb250aW51ZTsgLyogbm8gdmFsdWUuLi4gKi8KLSAgICAgICAgY3BUICs9IHNraXA7Ci0gICAgICAgICpjcFQgPSAnXDAnOwotICAgICAgICB2YWx1ZSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgY3VydmFsKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGFwX3BmY2xvc2Uoci0+cG9vbCwgZnApOwotICAgIHJldHVybiB2YWx1ZTsKLX0KLQotI2lmbmRlZiBOT19EQk1fUkVXUklURU1BUAotc3RhdGljIGNoYXIgKmxvb2t1cF9tYXBfZGJtZmlsZShyZXF1ZXN0X3JlYyAqciwgY2hhciAqZmlsZSwgY2hhciAqa2V5KQotewotICAgIERCTSAqZGJtZnAgPSBOVUxMOwotICAgIGRhdHVtIGRibWtleTsKLSAgICBkYXR1bSBkYm12YWw7Ci0gICAgY2hhciAqdmFsdWUgPSBOVUxMOwotICAgIGNoYXIgYnVmW01BWF9TVFJJTkdfTEVOXTsKLQotICAgIGRibWtleS5kcHRyICA9IGtleTsKLSAgICBkYm1rZXkuZHNpemUgPSBzdHJsZW4oa2V5KTsKLSAgICBpZiAoKGRibWZwID0gZGJtX29wZW4oZmlsZSwgT19SRE9OTFksIDA2NjYpKSAhPSBOVUxMKSB7Ci0gICAgICAgIGRibXZhbCA9IGRibV9mZXRjaChkYm1mcCwgZGJta2V5KTsKLSAgICAgICAgaWYgKGRibXZhbC5kcHRyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1lbWNweShidWYsIGRibXZhbC5kcHRyLCAKLSAgICAgICAgICAgICAgICAgICBkYm12YWwuZHNpemUgPCBzaXplb2YoYnVmKS0xID8gCi0gICAgICAgICAgICAgICAgICAgZGJtdmFsLmRzaXplIDogc2l6ZW9mKGJ1ZiktMSAgKTsKLSAgICAgICAgICAgIGJ1ZltkYm12YWwuZHNpemVdID0gJ1wwJzsKLSAgICAgICAgICAgIHZhbHVlID0gYXBfcHN0cmR1cChyLT5wb29sLCBidWYpOwotICAgICAgICB9Ci0gICAgICAgIGRibV9jbG9zZShkYm1mcCk7Ci0gICAgfQotICAgIHJldHVybiB2YWx1ZTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgY2hhciAqbG9va3VwX21hcF9wcm9ncmFtKHJlcXVlc3RfcmVjICpyLCBpbnQgZnBpbiwgaW50IGZwb3V0LCBjaGFyICprZXkpCi17Ci0gICAgY2hhciBidWZbTE9OR19TVFJJTkdfTEVOXTsKLSAgICBjaGFyIGM7Ci0gICAgaW50IGk7Ci0jaWZuZGVmIE5PX1dSSVRFVgotICAgIHN0cnVjdCBpb3ZlYyBpb3ZbMl07Ci0jZW5kaWYKLQotICAgIC8qIHdoZW4gYFJld3JpdGVFbmdpbmUgb2ZmJyB3YXMgdXNlZCBpbiB0aGUgcGVyLXNlcnZlcgotICAgICAqIGNvbnRleHQgdGhlbiB0aGUgcmV3cml0ZW1hcC1wcm9ncmFtcyB3ZXJlIG5vdCBzcGF3bmVkLgotICAgICAqIEluIHRoaXMgY2FzZSB1c2luZyBzdWNoIGEgbWFwICh1c3VhbGx5IGluIHBlci1kaXIgY29udGV4dCkKLSAgICAgKiBpcyB1c2VsZXNzIGJlY2F1c2UgaXQgaXMgbm90IGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBpZiAoZnBpbiA9PSAtMSB8fCBmcG91dCA9PSAtMSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvKiB0YWtlIHRoZSBsb2NrICovCi0gICAgcmV3cml0ZWxvY2tfYWxsb2Mocik7Ci0KLSAgICAvKiB3cml0ZSBvdXQgdGhlIHJlcXVlc3Qga2V5ICovCi0jaWZkZWYgTk9fV1JJVEVWCi0gICAgd3JpdGUoZnBpbiwga2V5LCBzdHJsZW4oa2V5KSk7Ci0gICAgd3JpdGUoZnBpbiwgIlxuIiwgMSk7Ci0jZWxzZQotICAgIGlvdlswXS5pb3ZfYmFzZSA9IGtleTsKLSAgICBpb3ZbMF0uaW92X2xlbiA9IHN0cmxlbihrZXkpOwotICAgIGlvdlsxXS5pb3ZfYmFzZSA9ICJcbiI7Ci0gICAgaW92WzFdLmlvdl9sZW4gPSAxOwotICAgIHdyaXRldihmcGluLCBpb3YsIDIpOwotI2VuZGlmCi0KLSAgICAvKiByZWFkIGluIHRoZSByZXNwb25zZSB2YWx1ZSAqLwotICAgIGkgPSAwOwotICAgIHdoaWxlIChyZWFkKGZwb3V0LCAmYywgMSkgPT0gMSAmJiAoaSA8IExPTkdfU1RSSU5HX0xFTi0xKSkgewotICAgICAgICBpZiAoYyA9PSAnXG4nKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBidWZbaSsrXSA9IGM7Ci0gICAgfQotICAgIGJ1ZltpXSA9ICdcMCc7Ci0KLSAgICAvKiBnaXZlIHRoZSBsb2NrIGJhY2sgKi8KLSAgICByZXdyaXRlbG9ja19mcmVlKHIpOwotCi0gICAgaWYgKHN0cmNhc2VjbXAoYnVmLCAiTlVMTCIpID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXR1cm4gYXBfcHN0cmR1cChyLT5wb29sLCBidWYpOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKmxvb2t1cF9tYXBfaW50ZXJuYWwocmVxdWVzdF9yZWMgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICooKmZ1bmMpKHJlcXVlc3RfcmVjICosIGNoYXIgKiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICprZXkpCi17Ci0gICAgLyogY3VycmVudGx5IHdlIGp1c3QgbGV0IHRoZSBmdW5jdGlvbiBjb252ZXJ0Ci0gICAgICAgdGhlIGtleSB0byBhIGNvcnJlc3BvbmRpbmcgdmFsdWUgKi8KLSAgICByZXR1cm4gZnVuYyhyLCBrZXkpOwotfQotCi1zdGF0aWMgY2hhciAqcmV3cml0ZV9tYXBmdW5jX3RvdXBwZXIocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmtleSkKLXsKLSAgICBjaGFyICp2YWx1ZSwgKmNwOwotCi0gICAgZm9yIChjcCA9IHZhbHVlID0gYXBfcHN0cmR1cChyLT5wb29sLCBrZXkpOyBjcCAhPSBOVUxMICYmICpjcCAhPSAnXDAnOwotICAgICAgICAgY3ArKykgewotICAgICAgICAqY3AgPSBhcF90b3VwcGVyKCpjcCk7Ci0gICAgfQotICAgIHJldHVybiB2YWx1ZTsKLX0KLQotc3RhdGljIGNoYXIgKnJld3JpdGVfbWFwZnVuY190b2xvd2VyKHJlcXVlc3RfcmVjICpyLCBjaGFyICprZXkpCi17Ci0gICAgY2hhciAqdmFsdWUsICpjcDsKLQotICAgIGZvciAoY3AgPSB2YWx1ZSA9IGFwX3BzdHJkdXAoci0+cG9vbCwga2V5KTsgY3AgIT0gTlVMTCAmJiAqY3AgIT0gJ1wwJzsKLSAgICAgICAgIGNwKyspIHsKLSAgICAgICAgKmNwID0gYXBfdG9sb3dlcigqY3ApOwotICAgIH0KLSAgICByZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyBjaGFyICpyZXdyaXRlX21hcGZ1bmNfZXNjYXBlKHJlcXVlc3RfcmVjICpyLCBjaGFyICprZXkpCi17Ci0gICAgY2hhciAqdmFsdWU7Ci0KLSAgICB2YWx1ZSA9IGFwX2VzY2FwZV91cmkoci0+cG9vbCwga2V5KTsKLSAgICByZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyBjaGFyICpyZXdyaXRlX21hcGZ1bmNfdW5lc2NhcGUocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmtleSkKLXsKLSAgICBjaGFyICp2YWx1ZTsKLQotICAgIHZhbHVlID0gYXBfcHN0cmR1cChyLT5wb29sLCBrZXkpOwotICAgIGFwX3VuZXNjYXBlX3VybCh2YWx1ZSk7Ci0gICAgcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgaW50IHJld3JpdGVfcmFuZF9pbml0X2RvbmUgPSAwOwotCi1zdGF0aWMgdm9pZCByZXdyaXRlX3JhbmRfaW5pdCh2b2lkKQotewotICAgIGlmICghcmV3cml0ZV9yYW5kX2luaXRfZG9uZSkgewotICAgICAgICBzcmFuZCgodW5zaWduZWQpKGdldHBpZCgpKSk7Ci0gICAgICAgIHJld3JpdGVfcmFuZF9pbml0X2RvbmUgPSAxOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQgcmV3cml0ZV9yYW5kKGludCBsLCBpbnQgaCkKLXsKLSAgICBpbnQgaTsKLSAgICBjaGFyIGJ1Zls1MF07Ci0KLSAgICByZXdyaXRlX3JhbmRfaW5pdCgpOwotICAgIGFwX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlLjBmIiwgCi0gICAgICAgICAgICAgICAgKCgoZG91YmxlKShyYW5kKCklUkFORF9NQVgpL1JBTkRfTUFYKSooaC1sKSkpOwotICAgIGkgPSBhdG9pKGJ1ZikrMTsKLSAgICBpZiAoaSA8IGwpIGkgPSBsOwotICAgIGlmIChpID4gaCkgaSA9IGg7Ci0gICAgcmV0dXJuIGk7Ci19Ci0KLXN0YXRpYyBjaGFyICpzZWxlY3RfcmFuZG9tX3ZhbHVlX3BhcnQocmVxdWVzdF9yZWMgKnIsIGNoYXIgKnZhbHVlKQotewotICAgIGNoYXIgKmJ1ZjsKLSAgICBpbnQgbiwgaSwgazsKLQotICAgIC8qICBjb3VudCBudW1iZXIgb2YgZGlzdGluY3QgdmFsdWVzICAqLwotICAgIGZvciAobiA9IDEsIGkgPSAwOyB2YWx1ZVtpXSAhPSAnXDAnOyBpKyspIHsKLSAgICAgICAgaWYgKHZhbHVlW2ldID09ICd8JykgewotICAgICAgICAgICAgbisrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogIHdoZW4gb25seSBvbmUgdmFsdWUgd2UgaGF2ZSBubyBvcHRpb24gdG8gY2hvb3NlICAqLwotICAgIGlmIChuID09IDEpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qICBlbHNlIHJhbmRvbWx5IHNlbGVjdCBvbmUgICovCi0gICAgayA9IHJld3JpdGVfcmFuZCgxLCBuKTsKLQotICAgIC8qICBhbmQgZ3JlcCBpdCBvdXQgICovCi0gICAgZm9yIChuID0gMSwgaSA9IDA7IHZhbHVlW2ldICE9ICdcMCc7IGkrKykgewotICAgICAgICBpZiAobiA9PSBrKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWVbaV0gPT0gJ3wnKSB7Ci0gICAgICAgICAgICBuKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYnVmID0gYXBfcHN0cmR1cChyLT5wb29sLCAmdmFsdWVbaV0pOwotICAgIGZvciAoaSA9IDA7IGJ1ZltpXSAhPSAnXDAnICYmIGJ1ZltpXSAhPSAnfCc7IGkrKykKLSAgICAgICAgOwotICAgIGJ1ZltpXSA9ICdcMCc7Ci0gICAgcmV0dXJuIGJ1ZjsKLX0KLQotCi0vKgotKiogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSoqIHwgICAgICAgICAgICAgIHJld3JpdGluZyBsb2dmaWxlIHN1cHBvcnQKLSoqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotCi0KLXN0YXRpYyB2b2lkIG9wZW5fcmV3cml0ZWxvZyhzZXJ2ZXJfcmVjICpzLCBwb29sICpwKQotewotICAgIHJld3JpdGVfc2VydmVyX2NvbmYgKmNvbmY7Ci0gICAgY2hhciAqZm5hbWU7Ci0gICAgcGlwZWRfbG9nICpwbDsKLSAgICBpbnQgICAgcmV3cml0ZWxvZ19mbGFncyA9ICggT19XUk9OTFl8T19BUFBFTkR8T19DUkVBVCApOwotI2lmZGVmIFdJTjMyCi0gICAgbW9kZV90IHJld3JpdGVsb2dfbW9kZSAgPSAoIF9TX0lSRUFEfF9TX0lXUklURSApOwotI2Vsc2UKLSAgICBtb2RlX3QgcmV3cml0ZWxvZ19tb2RlICA9ICggU19JUlVTUnxTX0lXVVNSfFNfSVJHUlB8U19JUk9USCApOwotI2VuZGlmCi0KLSAgICBjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywgJnJld3JpdGVfbW9kdWxlKTsKLQotICAgIGlmIChjb25mLT5yZXdyaXRlbG9nZmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCooY29uZi0+cmV3cml0ZWxvZ2ZpbGUpID09ICdcMCcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoY29uZi0+cmV3cml0ZWxvZ2ZwID4gMCkgewotICAgICAgICByZXR1cm47IC8qIHZpcnR1YWwgbG9nIHNoYXJlZCB3LyBtYWluIHNlcnZlciAqLwotICAgIH0KLQotICAgIGZuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocCwgY29uZi0+cmV3cml0ZWxvZ2ZpbGUpOwotCi0gICAgaWYgKCpjb25mLT5yZXdyaXRlbG9nZmlsZSA9PSAnfCcpIHsKLSAgICAgICAgaWYgKChwbCA9IGFwX29wZW5fcGlwZWRfbG9nKHAsIGNvbmYtPnJld3JpdGVsb2dmaWxlKzEpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAibW9kX3Jld3JpdGU6IGNvdWxkIG5vdCBvcGVuIHJlbGlhYmxlIHBpcGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJ0byBSZXdyaXRlTG9nIGZpbHRlciAlcyIsIGNvbmYtPnJld3JpdGVsb2dmaWxlKzEpOwotICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgICBjb25mLT5yZXdyaXRlbG9nZnAgPSBhcF9waXBlZF9sb2dfd3JpdGVfZmQocGwpOwotICAgIH0KLSAgICBlbHNlIGlmICgqY29uZi0+cmV3cml0ZWxvZ2ZpbGUgIT0gJ1wwJykgewotICAgICAgICBpZiAoKGNvbmYtPnJld3JpdGVsb2dmcCA9IGFwX3BvcGVuZihwLCBmbmFtZSwgcmV3cml0ZWxvZ19mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0ZWxvZ19tb2RlKSkgPCAwKSB7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzLCAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICJtb2RfcmV3cml0ZTogY291bGQgbm90IG9wZW4gUmV3cml0ZUxvZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUgJXMiLCBmbmFtZSk7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgcmV3cml0ZWxvZyhyZXF1ZXN0X3JlYyAqciwgaW50IGxldmVsLCBjb25zdCBjaGFyICp0ZXh0LCAuLi4pCi17Ci0gICAgcmV3cml0ZV9zZXJ2ZXJfY29uZiAqY29uZjsKLSAgICBjb25uX3JlYyAqY29ubjsKLSAgICBjaGFyICpzdHIxOwotICAgIGNoYXIgc3RyMls1MTJdOwotICAgIGNoYXIgc3RyM1sxMDI0XTsKLSAgICBjaGFyIHR5cGVbMjBdOwotICAgIGNoYXIgcmVkaXJbMjBdOwotICAgIHZhX2xpc3QgYXA7Ci0gICAgaW50IGk7Ci0gICAgcmVxdWVzdF9yZWMgKnJlcTsKLSAgICBjaGFyICpydXNlcjsKLSAgICBjb25zdCBjaGFyICpyaG9zdDsKLQotICAgIHZhX3N0YXJ0KGFwLCB0ZXh0KTsKLSAgICBjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcoci0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCAmcmV3cml0ZV9tb2R1bGUpOwotICAgIGNvbm4gPSByLT5jb25uZWN0aW9uOwotCi0gICAgaWYgKGNvbmYtPnJld3JpdGVsb2dmcCA8IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoY29uZi0+cmV3cml0ZWxvZ2ZpbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICgqKGNvbmYtPnJld3JpdGVsb2dmaWxlKSA9PSAnXDAnKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobGV2ZWwgPiBjb25mLT5yZXdyaXRlbG9nbGV2ZWwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChjb25uLT51c2VyID09IE5VTEwpIHsKLSAgICAgICAgcnVzZXIgPSAiLSI7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmxlbihjb25uLT51c2VyKSAhPSAwKSB7Ci0gICAgICAgIHJ1c2VyID0gY29ubi0+dXNlcjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJ1c2VyID0gIlwiXCIiOwotICAgIH0KLQotICAgIHJob3N0ID0gYXBfZ2V0X3JlbW90ZV9ob3N0KGNvbm4sIHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVNT1RFX05PTE9PS1VQKTsKLSAgICBpZiAocmhvc3QgPT0gTlVMTCkgewotICAgICAgICByaG9zdCA9ICJVTktOT1dOLUhPU1QiOwotICAgIH0KLQotICAgIHN0cjEgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHJob3N0LCAiICIsCi0gICAgICAgICAgICAgICAgICAgICAgKGNvbm4tPnJlbW90ZV9sb2duYW1lICE9IE5VTEwgPwotICAgICAgICAgICAgICAgICAgICAgIGNvbm4tPnJlbW90ZV9sb2duYW1lIDogIi0iKSwgIiAiLAotICAgICAgICAgICAgICAgICAgICAgIHJ1c2VyLCBOVUxMKTsKLSAgICBhcF92c25wcmludGYoc3RyMiwgc2l6ZW9mKHN0cjIpLCB0ZXh0LCBhcCk7Ci0KLSAgICBpZiAoci0+bWFpbiA9PSBOVUxMKSB7Ci0gICAgICAgIHN0cmNweSh0eXBlLCAiaW5pdGlhbCIpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc3RyY3B5KHR5cGUsICJzdWJyZXEiKTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwLCByZXEgPSByOyByZXEtPnByZXYgIT0gTlVMTDsgcmVxID0gcmVxLT5wcmV2KSB7Ci0gICAgICAgIGkrKzsKLSAgICB9Ci0gICAgaWYgKGkgPT0gMCkgewotICAgICAgICByZWRpclswXSA9ICdcMCc7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBhcF9zbnByaW50ZihyZWRpciwgc2l6ZW9mKHJlZGlyKSwgIi9yZWRpciMlZCIsIGkpOwotICAgIH0KLQotICAgIGFwX3NucHJpbnRmKHN0cjMsIHNpemVvZihzdHIzKSwKLSAgICAgICAgICAgICAgICAiJXMgJXMgWyVzL3NpZCMlbHhdW3JpZCMlbHgvJXMlc10gKCVkKSAlc1xuIiwgc3RyMSwKLSAgICAgICAgICAgICAgICBjdXJyZW50X2xvZ3RpbWUociksIGFwX2dldF9zZXJ2ZXJfbmFtZShyKSwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykoci0+c2VydmVyKSwgKHVuc2lnbmVkIGxvbmcpciwKLSAgICAgICAgICAgICAgICB0eXBlLCByZWRpciwgbGV2ZWwsIHN0cjIpOwotCi0gICAgZmRfbG9jayhyLCBjb25mLT5yZXdyaXRlbG9nZnApOwotICAgIHdyaXRlKGNvbmYtPnJld3JpdGVsb2dmcCwgc3RyMywgc3RybGVuKHN0cjMpKTsKLSAgICBmZF91bmxvY2sociwgY29uZi0+cmV3cml0ZWxvZ2ZwKTsKLQotICAgIHZhX2VuZChhcCk7Ci0gICAgcmV0dXJuOwotfQotCi1zdGF0aWMgY2hhciAqY3VycmVudF9sb2d0aW1lKHJlcXVlc3RfcmVjICpyKQotewotICAgIGludCB0aW16OwotICAgIHN0cnVjdCB0bSAqdDsKLSAgICBjaGFyIHRzdHJbODBdOwotICAgIGNoYXIgc2lnbjsKLQotICAgIHQgPSBhcF9nZXRfZ210b2ZmKCZ0aW16KTsKLSAgICBzaWduID0gKHRpbXogPCAwID8gJy0nIDogJysnKTsKLSAgICBpZiAodGlteiA8IDApIHsKLSAgICAgICAgdGlteiA9IC10aW16OwotICAgIH0KLQotICAgIHN0cmZ0aW1lKHRzdHIsIDgwLCAiWyVkLyViLyVZOiVIOiVNOiVTICIsIHQpOwotICAgIGFwX3NucHJpbnRmKHRzdHIgKyBzdHJsZW4odHN0ciksIDgwLXN0cmxlbih0c3RyKSwgIiVjJS4yZCUuMmRdIiwKLSAgICAgICAgICAgICAgICBzaWduLCB0aW16LzYwLCB0aW16JTYwKTsKLSAgICByZXR1cm4gYXBfcHN0cmR1cChyLT5wb29sLCB0c3RyKTsKLX0KLQotCi0KLQotLyoKLSoqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKiogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qKiB8ICAgICAgICAgICAgICByZXdyaXRpbmcgbG9ja2ZpbGUgc3VwcG9ydAotKiogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi0KLSNpZmRlZiBXSU4zMgotI2RlZmluZSBSRVdSSVRFTE9DS19NT0RFICggX1NfSVJFQUR8X1NfSVdSSVRFICkKLSNlbHNlCi0jZGVmaW5lIFJFV1JJVEVMT0NLX01PREUgKCBTX0lSVVNSfFNfSVdVU1J8U19JUkdSUHxTX0lST1RIICkKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCByZXdyaXRlbG9ja19jcmVhdGUoc2VydmVyX3JlYyAqcywgcG9vbCAqcCkKLXsKLSAgICByZXdyaXRlX3NlcnZlcl9jb25mICpjb25mOwotCi0gICAgY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsICZyZXdyaXRlX21vZHVsZSk7Ci0KLSAgICAvKiBvbmx5IG9wZXJhdGUgaWYgYSBsb2NrZmlsZSBpcyB1c2VkICovCi0gICAgaWYgKGxvY2tuYW1lID09IE5VTEwgfHwgKihsb2NrbmFtZSkgPT0gJ1wwJykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogZml4dXAgdGhlIHBhdGgsIGVzcGVjaWFsbHkgZm9yIHJld3JpdGVsb2NrX3JlbW92ZSgpICovCi0gICAgbG9ja25hbWUgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShwLCBsb2NrbmFtZSk7Ci0KLSAgICAvKiBjcmVhdGUgdGhlIGxvY2tmaWxlICovCi0gICAgdW5saW5rKGxvY2tuYW1lKTsKLSAgICBpZiAoKGxvY2tmZCA9IGFwX3BvcGVuZihwLCBsb2NrbmFtZSwgT19XUk9OTFl8T19DUkVBVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXUklURUxPQ0tfTU9ERSkpIDwgMCkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzLAotICAgICAgICAgICAgICAgICAgICAgIm1vZF9yZXdyaXRlOiBQYXJlbnQgY291bGQgbm90IGNyZWF0ZSBSZXdyaXRlTG9jayAiCi0gICAgICAgICAgICAgICAgICAgICAiZmlsZSAlcyIsIGxvY2tuYW1lKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0jaWYgIWRlZmluZWQoT1MyKSAmJiAhZGVmaW5lZChXSU4zMikKLSAgICAvKiBtYWtlIHN1cmUgdGhlIGNoaWxkcyBoYXZlIGFjY2VzcyB0byB0aGlzIGZpbGUgKi8KLSAgICBpZiAoZ2V0ZXVpZCgpID09IDAgLyogaXMgc3VwZXJ1c2VyICovKQotICAgICAgICBjaG93bihsb2NrbmFtZSwgYXBfdXNlcl9pZCwgLTEgLyogbm8gZ2lkIGNoYW5nZSAqLyk7Ci0jZW5kaWYKLQotICAgIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgcmV3cml0ZWxvY2tfb3BlbihzZXJ2ZXJfcmVjICpzLCBwb29sICpwKQotewotICAgIHJld3JpdGVfc2VydmVyX2NvbmYgKmNvbmY7Ci0KLSAgICBjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywgJnJld3JpdGVfbW9kdWxlKTsKLQotICAgIC8qIG9ubHkgb3BlcmF0ZSBpZiBhIGxvY2tmaWxlIGlzIHVzZWQgKi8KLSAgICBpZiAobG9ja25hbWUgPT0gTlVMTCB8fCAqKGxvY2tuYW1lKSA9PSAnXDAnKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBvcGVuIHRoZSBsb2NrZmlsZSAob25jZSBwZXIgY2hpbGQpIHRvIGdldCBhIHVuaXF1ZSBmZCAqLwotICAgIGlmICgobG9ja2ZkID0gYXBfcG9wZW5mKHAsIGxvY2tuYW1lLCBPX1dST05MWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXUklURUxPQ0tfTU9ERSkpIDwgMCkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzLAotICAgICAgICAgICAgICAgICAgICAgIm1vZF9yZXdyaXRlOiBDaGlsZCBjb3VsZCBub3Qgb3BlbiBSZXdyaXRlTG9jayAiCi0gICAgICAgICAgICAgICAgICAgICAiZmlsZSAlcyIsIGxvY2tuYW1lKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCByZXdyaXRlbG9ja19yZW1vdmUodm9pZCAqZGF0YSkKLXsKLSAgICAvKiBvbmx5IG9wZXJhdGUgaWYgYSBsb2NrZmlsZSBpcyB1c2VkICovCi0gICAgaWYgKGxvY2tuYW1lID09IE5VTEwgfHwgKihsb2NrbmFtZSkgPT0gJ1wwJykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogcmVtb3ZlIHRoZSBsb2NrZmlsZSAqLwotICAgIHVubGluayhsb2NrbmFtZSk7Ci0gICAgbG9ja25hbWUgPSBOVUxMOwotICAgIGxvY2tmZCA9IC0xOwotfQotCi1zdGF0aWMgdm9pZCByZXdyaXRlbG9ja19hbGxvYyhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpZiAobG9ja2ZkICE9IC0xKSB7Ci0gICAgICAgIGZkX2xvY2sociwgbG9ja2ZkKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCByZXdyaXRlbG9ja19mcmVlKHJlcXVlc3RfcmVjICpyKQotewotICAgIGlmIChsb2NrZmQgIT0gLTEpIHsKLSAgICAgICAgZmRfdW5sb2NrKHIsIGxvY2tmZCk7Ci0gICAgfQotICAgIHJldHVybjsKLX0KLQotCi0vKgotKiogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSoqIHwgICAgICAgICAgICAgICAgICBwcm9ncmFtIG1hcCBzdXBwb3J0Ci0qKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSoqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLQotc3RhdGljIHZvaWQgcnVuX3Jld3JpdGVtYXBfcHJvZ3JhbXMoc2VydmVyX3JlYyAqcywgcG9vbCAqcCkKLXsKLSAgICByZXdyaXRlX3NlcnZlcl9jb25mICpjb25mOwotICAgIEZJTEUgKmZwaW47Ci0gICAgRklMRSAqZnBvdXQ7Ci0gICAgRklMRSAqZnBlcnI7Ci0gICAgYXJyYXlfaGVhZGVyICpyZXdyaXRlbWFwczsKLSAgICByZXdyaXRlbWFwX2VudHJ5ICplbnRyaWVzOwotICAgIHJld3JpdGVtYXBfZW50cnkgKm1hcDsKLSAgICBpbnQgaTsKLSAgICBpbnQgcmM7Ci0KLSAgICBjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywgJnJld3JpdGVfbW9kdWxlKTsKLQotICAgIC8qICBJZiB0aGUgZW5naW5lIGlzbid0IHR1cm5lZCBvbiwKLSAgICAgKiAgZG9uJ3QgZXZlbiB0cnkgdG8gZG8gYW55dGhpbmcuCi0gICAgICovCi0gICAgaWYgKGNvbmYtPnN0YXRlID09IEVOR0lORV9ESVNBQkxFRCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcmV3cml0ZW1hcHMgPSBjb25mLT5yZXdyaXRlbWFwczsKLSAgICBlbnRyaWVzID0gKHJld3JpdGVtYXBfZW50cnkgKilyZXdyaXRlbWFwcy0+ZWx0czsKLSAgICBmb3IgKGkgPSAwOyBpIDwgcmV3cml0ZW1hcHMtPm5lbHRzOyBpKyspIHsKLSAgICAgICAgbWFwID0gJmVudHJpZXNbaV07Ci0gICAgICAgIGlmIChtYXAtPnR5cGUgIT0gTUFQVFlQRV9QUkcpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYXAtPmRhdGFmaWxlID09IE5VTEwKLSAgICAgICAgICAgIHx8ICoobWFwLT5kYXRhZmlsZSkgPT0gJ1wwJwotICAgICAgICAgICAgfHwgbWFwLT5mcGluICAhPSAtMQotICAgICAgICAgICAgfHwgbWFwLT5mcG91dCAhPSAtMSAgICAgICAgKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBmcGluICA9IE5VTEw7Ci0gICAgICAgIGZwb3V0ID0gTlVMTDsKLSAgICAgICAgcmMgPSBhcF9zcGF3bl9jaGlsZChwLCByZXdyaXRlbWFwX3Byb2dyYW1fY2hpbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltYXAtPmRhdGFmaWxlLCBraWxsX2FmdGVyX3RpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZwaW4sICZmcG91dCwgJmZwZXJyKTsKLSAgICAgICAgaWYgKHJjID09IDAgfHwgZnBpbiA9PSBOVUxMIHx8IGZwb3V0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIm1vZF9yZXdyaXRlOiBjb3VsZCBub3QgZm9yayBjaGlsZCBmb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJSZXdyaXRlTWFwIHByb2Nlc3MiKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgbWFwLT5mcGluICA9IGZpbGVubyhmcGluKTsKLSAgICAgICAgbWFwLT5mcG91dCA9IGZpbGVubyhmcG91dCk7Ci0gICAgICAgIG1hcC0+ZnBlcnIgPSBmaWxlbm8oZnBlcnIpOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLS8qIGNoaWxkIHByb2Nlc3MgY29kZSAqLwotc3RhdGljIGludCByZXdyaXRlbWFwX3Byb2dyYW1fY2hpbGQodm9pZCAqY21kLCBjaGlsZF9pbmZvICpwaW5mbykKLXsKLSAgICBpbnQgY2hpbGRfcGlkID0gMTsKLQotICAgIC8qCi0gICAgICogUHJlcGFyZSBmb3IgZXhlYwotICAgICAqLwotICAgIGFwX2NsZWFudXBfZm9yX2V4ZWMoKTsKLSNpZmRlZiBTSUdIVVAKLSAgICBzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKLSNlbmRpZgotCi0gICAgLyoKLSAgICAgKiBFeGVjKCkgdGhlIGNoaWxkIHByb2dyYW0KLSAgICAgKi8KLSNpZiBkZWZpbmVkKFdJTjMyKQotICAgIC8qIE1TIFdpbmRvd3MgKi8KLSAgICB7Ci0gICAgICAgIGNoYXIgcENvbW1hbmRbTUFYX1NUUklOR19MRU5dOwotICAgICAgICBTVEFSVFVQSU5GTyBzaTsKLSAgICAgICAgUFJPQ0VTU19JTkZPUk1BVElPTiBwaTsKLQotICAgICAgICBhcF9zbnByaW50ZihwQ29tbWFuZCwgc2l6ZW9mKHBDb21tYW5kKSwgIiVzIC9DICVzIiwgU0hFTExfUEFUSCwgY21kKTsKLQotICAgICAgICBtZW1zZXQoJnNpLCAwLCBzaXplb2Yoc2kpKTsKLSAgICAgICAgbWVtc2V0KCZwaSwgMCwgc2l6ZW9mKHBpKSk7Ci0KLSAgICAgICAgc2kuY2IgICAgICAgICAgPSBzaXplb2Yoc2kpOwotICAgICAgICBzaS5kd0ZsYWdzICAgICA9IFNUQVJURl9VU0VTSE9XV0lORE9XIHwgU1RBUlRGX1VTRVNUREhBTkRMRVM7Ci0gICAgICAgIHNpLndTaG93V2luZG93ID0gU1dfSElERTsKLSAgICAgICAgc2kuaFN0ZElucHV0ICAgPSBwaW5mby0+aFBpcGVJbnB1dFJlYWQ7Ci0gICAgICAgIHNpLmhTdGRPdXRwdXQgID0gcGluZm8tPmhQaXBlT3V0cHV0V3JpdGU7Ci0gICAgICAgIHNpLmhTdGRFcnJvciAgID0gcGluZm8tPmhQaXBlRXJyb3JXcml0ZTsKLQotICAgICAgICBpZiAoQ3JlYXRlUHJvY2VzcyhOVUxMLCBwQ29tbWFuZCwgTlVMTCwgTlVMTCwgVFJVRSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbiwgTlVMTCwgJnNpLCAmcGkpKSB7Ci0gICAgICAgICAgICBDbG9zZUhhbmRsZShwaS5oUHJvY2Vzcyk7Ci0gICAgICAgICAgICBDbG9zZUhhbmRsZShwaS5oVGhyZWFkKTsKLSAgICAgICAgICAgIGNoaWxkX3BpZCA9IHBpLmR3UHJvY2Vzc0lkOwotICAgICAgICB9Ci0gICAgfQotI2VsaWYgZGVmaW5lZChPUzIpCi0gICAgLyogSUJNIE9TLzIgKi8KLSAgICBleGVjbChTSEVMTF9QQVRILCBTSEVMTF9QQVRILCAiL2MiLCAoY2hhciAqKWNtZCwgTlVMTCk7Ci0jZWxzZQotICAgIC8qIFN0YW5kYXJkIFVuaXggKi8KLSAgICBleGVjbChTSEVMTF9QQVRILCBTSEVMTF9QQVRILCAiLWMiLCAoY2hhciAqKWNtZCwgTlVMTCk7Ci0jZW5kaWYKLSAgICByZXR1cm4oY2hpbGRfcGlkKTsKLX0KLQotCi0KLQotLyoKLSoqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKiogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qKiB8ICAgICAgICAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlIHN1cHBvcnQKLSoqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotCi0KLXN0YXRpYyB2b2lkIGV4cGFuZF92YXJpYWJsZXNfaW5idWZmZXIocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmJ1ZiwgaW50IGJ1Zl9sZW4pCi17Ci0gICAgY2hhciAqbmV3YnVmOwotICAgIG5ld2J1ZiA9IGV4cGFuZF92YXJpYWJsZXMociwgYnVmKTsKLSAgICBpZiAoc3RyY21wKG5ld2J1ZiwgYnVmKSAhPSAwKSB7Ci0gICAgICAgIGFwX2NweXN0cm4oYnVmLCBuZXdidWYsIGJ1Zl9sZW4pOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyBjaGFyICpleHBhbmRfdmFyaWFibGVzKHJlcXVlc3RfcmVjICpyLCBjaGFyICpzdHIpCi17Ci0gICAgY2hhciBvdXRwdXRbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgaW5wdXRbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgKmNwOwotICAgIGNoYXIgKmNwMjsKLSAgICBjaGFyICpjcDM7Ci0gICAgaW50IGV4cGFuZGVkOwotICAgIGNoYXIgKm91dHA7Ci0gICAgY2hhciAqZW5kcDsKLQotICAgIGFwX2NweXN0cm4oaW5wdXQsIHN0ciwgc2l6ZW9mKGlucHV0KSk7Ci0gICAgb3V0cHV0WzBdID0gJ1wwJzsKLSAgICBvdXRwID0gb3V0cHV0OwotICAgIGVuZHAgPSBvdXRwdXQgKyBzaXplb2Yob3V0cHV0KTsKLSAgICBleHBhbmRlZCA9IDA7Ci0gICAgZm9yIChjcCA9IGlucHV0OyBjcCA8IGlucHV0K01BWF9TVFJJTkdfTEVOOyApIHsKLSAgICAgICAgaWYgKChjcDIgPSBzdHJzdHIoY3AsICIleyIpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoKGNwMyA9IHN0cnN0cihjcDIsICJ9IikpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqY3AyID0gJ1wwJzsKLSAgICAgICAgICAgICAgICBvdXRwID0gYXBfY3B5c3RybihvdXRwLCBjcCwgZW5kcCAtIG91dHApOwotCi0gICAgICAgICAgICAgICAgY3AyICs9IDI7Ci0gICAgICAgICAgICAgICAgKmNwMyA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgb3V0cCA9IGFwX2NweXN0cm4ob3V0cCwgbG9va3VwX3ZhcmlhYmxlKHIsIGNwMiksIGVuZHAgLSBvdXRwKTsKLQotICAgICAgICAgICAgICAgIGNwID0gY3AzKzE7Ci0gICAgICAgICAgICAgICAgZXhwYW5kZWQgPSAxOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG91dHAgPSBhcF9jcHlzdHJuKG91dHAsIGNwLCBlbmRwIC0gb3V0cCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gZXhwYW5kZWQgPyBhcF9wc3RyZHVwKHItPnBvb2wsIG91dHB1dCkgOiBzdHI7Ci19Ci0KLXN0YXRpYyBjaGFyICpsb29rdXBfdmFyaWFibGUocmVxdWVzdF9yZWMgKnIsIGNoYXIgKnZhcikKLXsKLSAgICBjb25zdCBjaGFyICpyZXN1bHQ7Ci0gICAgY2hhciByZXN1bHRidWZbTE9OR19TVFJJTkdfTEVOXTsKLSAgICB0aW1lX3QgdGM7Ci0gICAgc3RydWN0IHRtICp0bTsKLSAgICByZXF1ZXN0X3JlYyAqcnN1YjsKLSNpZm5kZWYgV0lOMzIKLSAgICBzdHJ1Y3QgcGFzc3dkICpwdzsKLSAgICBzdHJ1Y3QgZ3JvdXAgKmdyOwotICAgIHN0cnVjdCBzdGF0IGZpbmZvOwotI2VuZGlmCi0KLSAgICByZXN1bHQgPSBOVUxMOwotCi0gICAgLyogSFRUUCBoZWFkZXJzICovCi0gICAgaWYgKHN0cmNhc2VjbXAodmFyLCAiSFRUUF9VU0VSX0FHRU5UIikgPT0gMCkgewotICAgICAgICByZXN1bHQgPSBsb29rdXBfaGVhZGVyKHIsICJVc2VyLUFnZW50Iik7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodmFyLCAiSFRUUF9SRUZFUkVSIikgPT0gMCkgewotICAgICAgICByZXN1bHQgPSBsb29rdXBfaGVhZGVyKHIsICJSZWZlcmVyIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodmFyLCAiSFRUUF9DT09LSUUiKSA9PSAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IGxvb2t1cF9oZWFkZXIociwgIkNvb2tpZSIpOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIkhUVFBfRk9SV0FSREVEIikgPT0gMCkgewotICAgICAgICByZXN1bHQgPSBsb29rdXBfaGVhZGVyKHIsICJGb3J3YXJkZWQiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJIVFRQX0hPU1QiKSA9PSAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IGxvb2t1cF9oZWFkZXIociwgIkhvc3QiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJIVFRQX1BST1hZX0NPTk5FQ1RJT04iKSA9PSAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IGxvb2t1cF9oZWFkZXIociwgIlByb3h5LUNvbm5lY3Rpb24iKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJIVFRQX0FDQ0VQVCIpID09IDApIHsKLSAgICAgICAgcmVzdWx0ID0gbG9va3VwX2hlYWRlcihyLCAiQWNjZXB0Iik7Ci0gICAgfQotICAgIC8qIGFsbCBvdGhlciBoZWFkZXJzIGZyb20gd2hpY2ggd2UgYXJlIHN0aWxsIG5vdCBrbm93IGFib3V0ICovCi0gICAgZWxzZSBpZiAoc3RybGVuKHZhcikgPiA1ICYmIHN0cm5jYXNlY21wKHZhciwgIkhUVFA6IiwgNSkgPT0gMCkgewotICAgICAgICByZXN1bHQgPSBsb29rdXBfaGVhZGVyKHIsIHZhcis1KTsKLSAgICB9Ci0KLSAgICAvKiBjb25uZWN0aW9uIHN0dWZmICovCi0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJSRU1PVEVfQUREUiIpID09IDApIHsKLSAgICAgICAgcmVzdWx0ID0gci0+Y29ubmVjdGlvbi0+cmVtb3RlX2lwOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIlJFTU9URV9IT1NUIikgPT0gMCkgewotICAgICAgICByZXN1bHQgPSAoY2hhciAqKWFwX2dldF9yZW1vdGVfaG9zdChyLT5jb25uZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5wZXJfZGlyX2NvbmZpZywgUkVNT1RFX05BTUUpOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIlJFTU9URV9VU0VSIikgPT0gMCkgewotICAgICAgICByZXN1bHQgPSByLT5jb25uZWN0aW9uLT51c2VyOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIlJFTU9URV9JREVOVCIpID09IDApIHsKLSAgICAgICAgcmVzdWx0ID0gKGNoYXIgKilhcF9nZXRfcmVtb3RlX2xvZ25hbWUocik7Ci0gICAgfQotCi0gICAgLyogcmVxdWVzdCBzdHVmZiAqLwotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodmFyLCAiVEhFX1JFUVVFU1QiKSA9PSAwKSB7IC8qIG5vbi1zdGFuZGFyZCAqLwotICAgICAgICByZXN1bHQgPSByLT50aGVfcmVxdWVzdDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJSRVFVRVNUX01FVEhPRCIpID09IDApIHsKLSAgICAgICAgcmVzdWx0ID0gci0+bWV0aG9kOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIlJFUVVFU1RfVVJJIikgPT0gMCkgeyAvKiBub24tc3RhbmRhcmQgKi8KLSAgICAgICAgcmVzdWx0ID0gci0+dXJpOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIlNDUklQVF9GSUxFTkFNRSIpID09IDAgfHwKLSAgICAgICAgICAgICBzdHJjYXNlY21wKHZhciwgIlJFUVVFU1RfRklMRU5BTUUiKSA9PSAwICApIHsKLSAgICAgICAgcmVzdWx0ID0gci0+ZmlsZW5hbWU7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodmFyLCAiUEFUSF9JTkZPIikgPT0gMCkgewotICAgICAgICByZXN1bHQgPSByLT5wYXRoX2luZm87Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodmFyLCAiUVVFUllfU1RSSU5HIikgPT0gMCkgewotICAgICAgICByZXN1bHQgPSByLT5hcmdzOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIkFVVEhfVFlQRSIpID09IDApIHsKLSAgICAgICAgcmVzdWx0ID0gci0+Y29ubmVjdGlvbi0+YXBfYXV0aF90eXBlOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIklTX1NVQlJFUSIpID09IDApIHsgLyogbm9uLXN0YW5kYXJkICovCi0gICAgICAgIHJlc3VsdCA9IChyLT5tYWluICE9IE5VTEwgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICB9Ci0KLSAgICAvKiBpbnRlcm5hbCBzZXJ2ZXIgc3R1ZmYgKi8KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIkRPQ1VNRU5UX1JPT1QiKSA9PSAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IGFwX2RvY3VtZW50X3Jvb3Qocik7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodmFyLCAiU0VSVkVSX0FETUlOIikgPT0gMCkgewotICAgICAgICByZXN1bHQgPSByLT5zZXJ2ZXItPnNlcnZlcl9hZG1pbjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJTRVJWRVJfTkFNRSIpID09IDApIHsKLSAgICAgICAgcmVzdWx0ID0gYXBfZ2V0X3NlcnZlcl9uYW1lKHIpOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIlNFUlZFUl9BRERSIikgPT0gMCkgeyAvKiBub24tc3RhbmRhcmQgKi8KLSAgICAgICAgcmVzdWx0ID0gci0+Y29ubmVjdGlvbi0+bG9jYWxfaXA7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodmFyLCAiU0VSVkVSX1BPUlQiKSA9PSAwKSB7Ci0gICAgICAgIGFwX3NucHJpbnRmKHJlc3VsdGJ1Ziwgc2l6ZW9mKHJlc3VsdGJ1ZiksICIldSIsIGFwX2dldF9zZXJ2ZXJfcG9ydChyKSk7Ci0gICAgICAgIHJlc3VsdCA9IHJlc3VsdGJ1ZjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJTRVJWRVJfUFJPVE9DT0wiKSA9PSAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IHItPnByb3RvY29sOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIlNFUlZFUl9TT0ZUV0FSRSIpID09IDApIHsKLSAgICAgICAgcmVzdWx0ID0gYXBfZ2V0X3NlcnZlcl92ZXJzaW9uKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodmFyLCAiQVBJX1ZFUlNJT04iKSA9PSAwKSB7IC8qIG5vbi1zdGFuZGFyZCAqLwotICAgICAgICBhcF9zbnByaW50ZihyZXN1bHRidWYsIHNpemVvZihyZXN1bHRidWYpLCAiJWQ6JWQiLAotCQkgICAgTU9EVUxFX01BR0lDX05VTUJFUl9NQUpPUiwgTU9EVUxFX01BR0lDX05VTUJFUl9NSU5PUik7Ci0gICAgICAgIHJlc3VsdCA9IHJlc3VsdGJ1ZjsKLSAgICB9Ci0KLSAgICAvKiB1bmRlcmxheWluZyBVbml4IHN5c3RlbSBzdHVmZiAqLwotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodmFyLCAiVElNRV9ZRUFSIikgPT0gMCkgewotICAgICAgICB0YyA9IHRpbWUoTlVMTCk7Ci0gICAgICAgIHRtID0gbG9jYWx0aW1lKCZ0Yyk7Ci0gICAgICAgIGFwX3NucHJpbnRmKHJlc3VsdGJ1Ziwgc2l6ZW9mKHJlc3VsdGJ1ZiksICIlMDJkJTAyZCIsCi0gICAgICAgICAgICAgICAgICAgICh0bS0+dG1feWVhciAvIDEwMCkgKyAxOSwgdG0tPnRtX3llYXIgJSAxMDApOwotICAgICAgICByZXN1bHQgPSByZXN1bHRidWY7Ci0gICAgfQotI2RlZmluZSBNS1RJTUVTVFIoZm9ybWF0LCB0bWZpZWxkKSBcCi0gICAgdGMgPSB0aW1lKE5VTEwpOyBcCi0gICAgdG0gPSBsb2NhbHRpbWUoJnRjKTsgXAotICAgIGFwX3NucHJpbnRmKHJlc3VsdGJ1Ziwgc2l6ZW9mKHJlc3VsdGJ1ZiksIGZvcm1hdCwgdG0tPnRtZmllbGQpOyBcCi0gICAgcmVzdWx0ID0gcmVzdWx0YnVmOwotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodmFyLCAiVElNRV9NT04iKSA9PSAwKSB7Ci0gICAgICAgIE1LVElNRVNUUigiJTAyZCIsIHRtX21vbisxKQotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIlRJTUVfREFZIikgPT0gMCkgewotICAgICAgICBNS1RJTUVTVFIoIiUwMmQiLCB0bV9tZGF5KQotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIlRJTUVfSE9VUiIpID09IDApIHsKLSAgICAgICAgTUtUSU1FU1RSKCIlMDJkIiwgdG1faG91cikKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJUSU1FX01JTiIpID09IDApIHsKLSAgICAgICAgTUtUSU1FU1RSKCIlMDJkIiwgdG1fbWluKQotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIlRJTUVfU0VDIikgPT0gMCkgewotICAgICAgICBNS1RJTUVTVFIoIiUwMmQiLCB0bV9zZWMpCi0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodmFyLCAiVElNRV9XREFZIikgPT0gMCkgewotICAgICAgICBNS1RJTUVTVFIoIiVkIiwgdG1fd2RheSkKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJUSU1FIikgPT0gMCkgewotICAgICAgICB0YyA9IHRpbWUoTlVMTCk7Ci0gICAgICAgIHRtID0gbG9jYWx0aW1lKCZ0Yyk7Ci0gICAgICAgIGFwX3NucHJpbnRmKHJlc3VsdGJ1Ziwgc2l6ZW9mKHJlc3VsdGJ1ZiksCi0gICAgICAgICAgICAgICAgICAgICIlMDJkJTAyZCUwMmQlMDJkJTAyZCUwMmQlMDJkIiwgKHRtLT50bV95ZWFyIC8gMTAwKSArIDE5LAotICAgICAgICAgICAgICAgICAgICAodG0tPnRtX3llYXIgJSAxMDApLCB0bS0+dG1fbW9uKzEsIHRtLT50bV9tZGF5LAotICAgICAgICAgICAgICAgICAgICB0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7Ci0gICAgICAgIHJlc3VsdCA9IHJlc3VsdGJ1ZjsKLSAgICAgICAgcmV3cml0ZWxvZyhyLCAxLCAiUkVTVUxUPSclcyciLCByZXN1bHQpOwotICAgIH0KLQotICAgIC8qIGFsbCBvdGhlciBlbnYtdmFyaWFibGVzIGZyb20gdGhlIHBhcmVudCBBcGFjaGUgcHJvY2VzcyAqLwotICAgIGVsc2UgaWYgKHN0cmxlbih2YXIpID4gNCAmJiBzdHJuY2FzZWNtcCh2YXIsICJFTlY6IiwgNCkgPT0gMCkgewotICAgICAgICAvKiBmaXJzdCB0cnkgdGhlIGludGVybmFsIEFwYWNoZSBub3RlcyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgcmVzdWx0ID0gYXBfdGFibGVfZ2V0KHItPm5vdGVzLCB2YXIrNCk7Ci0gICAgICAgIC8qIHNlY29uZCB0cnkgdGhlIGludGVybmFsIEFwYWNoZSBlbnYgc3RydWN0dXJlICAqLwotICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGFwX3RhYmxlX2dldChyLT5zdWJwcm9jZXNzX2VudiwgdmFyKzQpOwotICAgICAgICB9Ci0gICAgICAgIC8qIHRoaXJkIHRyeSB0aGUgZXh0ZXJuYWwgT1MgZW52ICovCi0gICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgewotICAgICAgICAgICAgcmVzdWx0ID0gZ2V0ZW52KHZhcis0KTsKLSAgICAgICAgfQotICAgIH0KLQotI2RlZmluZSBMT09LQUhFQUQoc3VicmVjZnVuYykgXAotICAgICAgICBpZiAoIFwKLSAgICAgICAgICAvKiBmaWxlbmFtZSBpcyBzYWZlIHRvIHVzZSAqLyBcCi0gICAgICAgICAgci0+ZmlsZW5hbWUgIT0gTlVMTCBcCi0gICAgICAgICAgICAgIC8qIC0gYW5kIHdlJ3JlIGVpdGhlciBub3QgaW4gYSBzdWJyZXF1ZXN0ICovIFwKLSAgICAgICAgICAgICAgJiYgKCByLT5tYWluID09IE5VTEwgXAotICAgICAgICAgICAgICAgICAgLyogLSBvciBpbiBhIHN1YnJlcXVlc3Qgd2hlcmUgcGF0aHMgYXJlIG5vbi1OVUxMLi4uICovIFwKLSAgICAgICAgICAgICAgICAgICAgfHwgKCByLT5tYWluLT51cmkgIT0gTlVMTCAmJiByLT51cmkgIT0gTlVMTCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiAgIC4uLmFuZCBzdWIgYW5kIG1haW4gcGF0aHMgZGlmZmVyICovIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHN0cmNtcChyLT5tYWluLT51cmksIHItPnVyaSkgIT0gMCkpKSB7IFwKLSAgICAgICAgICAgIC8qIHByb2Nlc3MgYSBmaWxlLWJhc2VkIHN1YnJlcXVlc3QgKi8gXAotICAgICAgICAgICAgcnN1YiA9IHN1YnJlY2Z1bmMoci0+ZmlsZW5hbWUsIHIpOyBcCi0gICAgICAgICAgICAvKiBub3cgcmVjdXJzaXZlbHkgbG9va3VwIHRoZSB2YXJpYWJsZSBpbiB0aGUgc3ViX3JlcSAqLyBcCi0gICAgICAgICAgICByZXN1bHQgPSBsb29rdXBfdmFyaWFibGUocnN1YiwgdmFyKzUpOyBcCi0gICAgICAgICAgICAvKiBjb3B5IGl0IHVwIHRvIG91ciBzY29wZSBiZWZvcmUgd2UgZGVzdHJveSBzdWJfcmVxJ3MgcG9vbCAqLyBcCi0gICAgICAgICAgICByZXN1bHQgPSBhcF9wc3RyZHVwKHItPnBvb2wsIHJlc3VsdCk7IFwKLSAgICAgICAgICAgIC8qIGNsZWFudXAgYnkgZGVzdHJveWluZyB0aGUgc3VicmVxdWVzdCAqLyBcCi0gICAgICAgICAgICBhcF9kZXN0cm95X3N1Yl9yZXEocnN1Yik7IFwKLSAgICAgICAgICAgIC8qIGxvZyBpdCAqLyBcCi0gICAgICAgICAgICByZXdyaXRlbG9nKHIsIDUsICJsb29rYWhlYWQ6IHBhdGg9JXMgdmFyPSVzIC0+IHZhbD0lcyIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUsIHZhcis1LCByZXN1bHQpOyBcCi0gICAgICAgICAgICAvKiByZXR1cm4gb3Vyc2VsZiB0byBwcmV2ZW50IHJlLXBzdHJkdXAgKi8gXAotICAgICAgICAgICAgcmV0dXJuIChjaGFyICopcmVzdWx0OyBcCi0gICAgICAgIH0KLQotICAgIC8qIGxvb2stYWhlYWQgZm9yIHBhcmFtZXRlciB0aHJvdWdoIFVSSS1iYXNlZCBzdWItcmVxdWVzdCAqLwotICAgIGVsc2UgaWYgKHN0cmxlbih2YXIpID4gNSAmJiBzdHJuY2FzZWNtcCh2YXIsICJMQS1VOiIsIDUpID09IDApIHsKLSAgICAgICAgTE9PS0FIRUFEKGFwX3N1Yl9yZXFfbG9va3VwX3VyaSkKLSAgICB9Ci0gICAgLyogbG9vay1haGVhZCBmb3IgcGFyYW1ldGVyIHRocm91Z2ggZmlsZS1iYXNlZCBzdWItcmVxdWVzdCAqLwotICAgIGVsc2UgaWYgKHN0cmxlbih2YXIpID4gNSAmJiBzdHJuY2FzZWNtcCh2YXIsICJMQS1GOiIsIDUpID09IDApIHsKLSAgICAgICAgTE9PS0FIRUFEKGFwX3N1Yl9yZXFfbG9va3VwX2ZpbGUpCi0gICAgfQotCi0jaWZuZGVmIFdJTjMyCi0gICAgLyogV2luMzIgaGFzIGEgcmF0aGVyIGRpZmZlcmVudCB2aWV3IG9mIGZpbGUgb3duZXJzaGlwcy4KLSAgICAgICBGb3Igbm93LCBqdXN0IGZvcmdldCBpdCAqLwotCi0gICAgLyogZmlsZSBzdHVmZiAqLwotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodmFyLCAiU0NSSVBUX1VTRVIiKSA9PSAwKSB7Ci0gICAgICAgIHJlc3VsdCA9ICI8dW5rbm93bj4iOwotICAgICAgICBpZiAoci0+ZmluZm8uc3RfbW9kZSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoKHB3ID0gZ2V0cHd1aWQoci0+ZmluZm8uc3RfdWlkKSkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHB3LT5wd19uYW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKHN0YXQoci0+ZmlsZW5hbWUsICZmaW5mbykgPT0gMCkgewotICAgICAgICAgICAgICAgIGlmICgocHcgPSBnZXRwd3VpZChmaW5mby5zdF91aWQpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHB3LT5wd19uYW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIlNDUklQVF9HUk9VUCIpID09IDApIHsKLSAgICAgICAgcmVzdWx0ID0gIjx1bmtub3duPiI7Ci0gICAgICAgIGlmIChyLT5maW5mby5zdF9tb2RlICE9IDApIHsKLSAgICAgICAgICAgIGlmICgoZ3IgPSBnZXRncmdpZChyLT5maW5mby5zdF9naWQpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZ3ItPmdyX25hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc3RhdChyLT5maWxlbmFtZSwgJmZpbmZvKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChnciA9IGdldGdyZ2lkKGZpbmZvLnN0X2dpZCkpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ3ItPmdyX25hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotI2VuZGlmIC8qIG5kZWYgV0lOMzIgKi8KLQotICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gYXBfcHN0cmR1cChyLT5wb29sLCAiIik7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXR1cm4gYXBfcHN0cmR1cChyLT5wb29sLCByZXN1bHQpOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKmxvb2t1cF9oZWFkZXIocmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgYXJyYXlfaGVhZGVyICpoZHJzX2FycjsKLSAgICB0YWJsZV9lbnRyeSAqaGRyczsKLSAgICBpbnQgaTsKLQotICAgIGhkcnNfYXJyID0gYXBfdGFibGVfZWx0cyhyLT5oZWFkZXJzX2luKTsKLSAgICBoZHJzID0gKHRhYmxlX2VudHJ5ICopaGRyc19hcnItPmVsdHM7Ci0gICAgZm9yIChpID0gMDsgaSA8IGhkcnNfYXJyLT5uZWx0czsgKytpKSB7Ci0gICAgICAgIGlmIChoZHJzW2ldLmtleSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RyY2FzZWNtcChoZHJzW2ldLmtleSwgbmFtZSkgPT0gMCkgewotCSAgICBhcF90YWJsZV9tZXJnZShyLT5ub3RlcywgVkFSWV9LRVlfVEhJUywgbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gaGRyc1tpXS52YWw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotCi0KLS8qCi0qKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSoqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiogfCAgICAgICAgICAgICAgICAgICAgY2FjaGluZyBzdXBwb3J0Ci0qKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSoqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLQotCi1zdGF0aWMgY2FjaGUgKmluaXRfY2FjaGUocG9vbCAqcCkKLXsKLSAgICBjYWNoZSAqYzsKLQotICAgIGMgPSAoY2FjaGUgKilhcF9wYWxsb2MocCwgc2l6ZW9mKGNhY2hlKSk7Ci0gICAgYy0+cG9vbCA9IGFwX21ha2Vfc3ViX3Bvb2wocCk7Ci0gICAgYy0+bGlzdHMgPSBhcF9tYWtlX2FycmF5KGMtPnBvb2wsIDIsIHNpemVvZihjYWNoZWxpc3QpKTsKLSAgICByZXR1cm4gYzsKLX0KLQotc3RhdGljIHZvaWQgc2V0X2NhY2hlX3N0cmluZyhjYWNoZSAqYywgY2hhciAqcmVzLCBpbnQgbW9kZSwgdGltZV90IHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmtleSwgY2hhciAqdmFsdWUpCi17Ci0gICAgY2FjaGVlbnRyeSBjZTsKLQotICAgIGNlLnRpbWUgID0gdDsKLSAgICBjZS5rZXkgICA9IGtleTsKLSAgICBjZS52YWx1ZSA9IHZhbHVlOwotICAgIHN0b3JlX2NhY2hlX3N0cmluZyhjLCByZXMsICZjZSk7Ci0gICAgcmV0dXJuOwotfQotCi1zdGF0aWMgY2hhciAqZ2V0X2NhY2hlX3N0cmluZyhjYWNoZSAqYywgY2hhciAqcmVzLCBpbnQgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCB0LCBjaGFyICprZXkpCi17Ci0gICAgY2FjaGVlbnRyeSAqY2U7Ci0KLSAgICBjZSA9IHJldHJpZXZlX2NhY2hlX3N0cmluZyhjLCByZXMsIGtleSk7Ci0gICAgaWYgKGNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChtb2RlICYgQ0FDSEVNT0RFX1RTKSB7Ci0gICAgICAgIGlmICh0ICE9IGNlLT50aW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlICYgQ0FDSEVNT0RFX1RUTCkgewotICAgICAgICBpZiAodCA+IGNlLT50aW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYXBfcHN0cmR1cChjLT5wb29sLCBjZS0+dmFsdWUpOwotfQotCi1zdGF0aWMgaW50IGNhY2hlX3RsYl9oYXNoKGNoYXIgKmtleSkKLXsKLSAgICB1bnNpZ25lZCBsb25nIG47Ci0gICAgY2hhciAqcDsKLQotICAgIG4gPSAwOwotICAgIGZvciAocD1rZXk7ICpwICE9ICdcMCc7ICsrcCkgewotICAgICAgICBuID0gbiAqIDUzNzExICsgMTM0NTYxICsgKHVuc2lnbmVkKSgqcCAmIDB4ZmYpOwotICAgIH0KLQotICAgIHJldHVybiBuICUgQ0FDSEVfVExCX1JPV1M7Ci19Ci0KLXN0YXRpYyBjYWNoZWVudHJ5ICpjYWNoZV90bGJfbG9va3VwKGNhY2hldGxiZW50cnkgKnRsYiwgY2FjaGVlbnRyeSAqZWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqa2V5KQotewotICAgIGludCBpeCA9IGNhY2hlX3RsYl9oYXNoKGtleSk7Ci0gICAgaW50IGk7Ci0gICAgaW50IGo7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IENBQ0hFX1RMQl9DT0xTOyArK2kpIHsKLSAgICAgICAgaiA9IHRsYltpeF0udFtpXTsKLSAgICAgICAgaWYgKGogPCAwKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmIChzdHJjbXAoZWx0W2pdLmtleSwga2V5KSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuICZlbHRbal07Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBjYWNoZV90bGJfcmVwbGFjZShjYWNoZXRsYmVudHJ5ICp0bGIsIGNhY2hlZW50cnkgKmVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZW50cnkgKmUpCi17Ci0gICAgaW50IGl4ID0gY2FjaGVfdGxiX2hhc2goZS0+a2V5KTsKLSAgICBpbnQgaTsKLQotICAgIHRsYiA9ICZ0bGJbaXhdOwotCi0gICAgZm9yIChpPTE7IGkgPCBDQUNIRV9UTEJfQ09MUzsgKytpKQotICAgICAgICB0bGItPnRbaV0gPSB0bGItPnRbaS0xXTsKLQotICAgIHRsYi0+dFswXSA9IGUgLSBlbHQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0b3JlX2NhY2hlX3N0cmluZyhjYWNoZSAqYywgY2hhciAqcmVzLCBjYWNoZWVudHJ5ICpjZSkKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgajsKLSAgICBjYWNoZWxpc3QgKmw7Ci0gICAgY2FjaGVlbnRyeSAqZTsKLSAgICBjYWNoZXRsYmVudHJ5ICp0OwotICAgIGludCBmb3VuZF9saXN0OwotCi0gICAgZm91bmRfbGlzdCA9IDA7Ci0gICAgLyogZmlyc3QgdHJ5IHRvIGVkaXQgYW4gZXhpc3RpbmcgZW50cnkgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgYy0+bGlzdHMtPm5lbHRzOyBpKyspIHsKLSAgICAgICAgbCA9ICYoKChjYWNoZWxpc3QgKiljLT5saXN0cy0+ZWx0cylbaV0pOwotICAgICAgICBpZiAoc3RyY21wKGwtPnJlc291cmNlLCByZXMpID09IDApIHsKLSAgICAgICAgICAgIGZvdW5kX2xpc3QgPSAxOwotCi0gICAgICAgICAgICBlID0gY2FjaGVfdGxiX2xvb2t1cCgoY2FjaGV0bGJlbnRyeSAqKWwtPnRsYi0+ZWx0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYWNoZWVudHJ5ICopbC0+ZW50cmllcy0+ZWx0cywgY2UtPmtleSk7Ci0gICAgICAgICAgICBpZiAoZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZS0+dGltZSAgPSBjZS0+dGltZTsKLSAgICAgICAgICAgICAgICBlLT52YWx1ZSA9IGFwX3BzdHJkdXAoYy0+cG9vbCwgY2UtPnZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsLT5lbnRyaWVzLT5uZWx0czsgaisrKSB7Ci0gICAgICAgICAgICAgICAgZSA9ICYoKChjYWNoZWVudHJ5ICopbC0+ZW50cmllcy0+ZWx0cylbal0pOwotICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoZS0+a2V5LCBjZS0+a2V5KSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUtPnRpbWUgID0gY2UtPnRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIGUtPnZhbHVlID0gYXBfcHN0cmR1cChjLT5wb29sLCBjZS0+dmFsdWUpOwotICAgICAgICAgICAgICAgICAgY2FjaGVfdGxiX3JlcGxhY2UoKGNhY2hldGxiZW50cnkgKilsLT50bGItPmVsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FjaGVlbnRyeSAqKWwtPmVudHJpZXMtPmVsdHMsIGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogY3JlYXRlIGEgbmVlZGVkIG5ldyBsaXN0ICovCi0gICAgaWYgKCFmb3VuZF9saXN0KSB7Ci0gICAgICAgIGwgPSBhcF9wdXNoX2FycmF5KGMtPmxpc3RzKTsKLSAgICAgICAgbC0+cmVzb3VyY2UgPSBhcF9wc3RyZHVwKGMtPnBvb2wsIHJlcyk7Ci0gICAgICAgIGwtPmVudHJpZXMgID0gYXBfbWFrZV9hcnJheShjLT5wb29sLCAyLCBzaXplb2YoY2FjaGVlbnRyeSkpOwotICAgICAgICBsLT50bGIgICAgICA9IGFwX21ha2VfYXJyYXkoYy0+cG9vbCwgQ0FDSEVfVExCX1JPV1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2FjaGV0bGJlbnRyeSkpOwotICAgICAgICBmb3IgKGk9MDsgaTxDQUNIRV9UTEJfUk9XUzsgKytpKSB7Ci0gICAgICAgICAgICB0ID0gJigoY2FjaGV0bGJlbnRyeSAqKWwtPnRsYi0+ZWx0cylbaV07Ci0gICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8Q0FDSEVfVExCX0NPTFM7ICsraikKLSAgICAgICAgICAgICAgICAgICAgdC0+dFtqXSA9IC0xOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogY3JlYXRlIHRoZSBuZXcgZW50cnkgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgYy0+bGlzdHMtPm5lbHRzOyBpKyspIHsKLSAgICAgICAgbCA9ICYoKChjYWNoZWxpc3QgKiljLT5saXN0cy0+ZWx0cylbaV0pOwotICAgICAgICBpZiAoc3RyY21wKGwtPnJlc291cmNlLCByZXMpID09IDApIHsKLSAgICAgICAgICAgIGUgPSBhcF9wdXNoX2FycmF5KGwtPmVudHJpZXMpOwotICAgICAgICAgICAgZS0+dGltZSAgPSBjZS0+dGltZTsKLSAgICAgICAgICAgIGUtPmtleSAgID0gYXBfcHN0cmR1cChjLT5wb29sLCBjZS0+a2V5KTsKLSAgICAgICAgICAgIGUtPnZhbHVlID0gYXBfcHN0cmR1cChjLT5wb29sLCBjZS0+dmFsdWUpOwotICAgICAgICAgICAgY2FjaGVfdGxiX3JlcGxhY2UoKGNhY2hldGxiZW50cnkgKilsLT50bGItPmVsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FjaGVlbnRyeSAqKWwtPmVudHJpZXMtPmVsdHMsIGUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogbm90IHJlYWNoZWQsIGJ1dCB3aGVuIGl0IGlzIG5vIHByb2JsZW0uLi4gKi8KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyBjYWNoZWVudHJ5ICpyZXRyaWV2ZV9jYWNoZV9zdHJpbmcoY2FjaGUgKmMsIGNoYXIgKnJlcywgY2hhciAqa2V5KQotewotICAgIGludCBpOwotICAgIGludCBqOwotICAgIGNhY2hlbGlzdCAqbDsKLSAgICBjYWNoZWVudHJ5ICplOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGMtPmxpc3RzLT5uZWx0czsgaSsrKSB7Ci0gICAgICAgIGwgPSAmKCgoY2FjaGVsaXN0ICopYy0+bGlzdHMtPmVsdHMpW2ldKTsKLSAgICAgICAgaWYgKHN0cmNtcChsLT5yZXNvdXJjZSwgcmVzKSA9PSAwKSB7Ci0KLSAgICAgICAgICAgIGUgPSBjYWNoZV90bGJfbG9va3VwKChjYWNoZXRsYmVudHJ5ICopbC0+dGxiLT5lbHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhY2hlZW50cnkgKilsLT5lbnRyaWVzLT5lbHRzLCBrZXkpOwotICAgICAgICAgICAgaWYgKGUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZTsKLQotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGwtPmVudHJpZXMtPm5lbHRzOyBqKyspIHsKLSAgICAgICAgICAgICAgICBlID0gJigoKGNhY2hlZW50cnkgKilsLT5lbnRyaWVzLT5lbHRzKVtqXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmNtcChlLT5rZXksIGtleSkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotCi0KLS8qCi0qKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSoqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiogfCAgICAgICAgICAgICAgICAgICAgbWlzYyBmdW5jdGlvbnMKLSoqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotCi1zdGF0aWMgY2hhciAqc3Vic3RfcHJlZml4X3BhdGgocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmlucHV0LCBjaGFyICptYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzdWJzdCkKLXsKLSAgICBjaGFyIG1hdGNoYnVmW0xPTkdfU1RSSU5HX0xFTl07Ci0gICAgY2hhciBzdWJzdGJ1ZltMT05HX1NUUklOR19MRU5dOwotICAgIGNoYXIgKm91dHB1dDsKLSAgICBpbnQgbDsKLQotICAgIG91dHB1dCA9IGlucHV0OwotCi0gICAgLyogZmlyc3QgY3JlYXRlIGEgbWF0Y2ggc3RyaW5nIHdoaWNoIGFsd2F5cyBoYXMgYSB0cmFpbGluZyBzbGFzaCAqLwotICAgIGwgPSBhcF9jcHlzdHJuKG1hdGNoYnVmLCBtYXRjaCwgc2l6ZW9mKG1hdGNoYnVmKSkgLSBtYXRjaGJ1ZjsKLSAgICBpZiAobWF0Y2hidWZbbC0xXSAhPSAnLycpIHsKLSAgICAgICBtYXRjaGJ1ZltsXSA9ICcvJzsKLSAgICAgICBtYXRjaGJ1ZltsKzFdID0gJ1wwJzsKLSAgICAgICBsKys7Ci0gICAgfQotICAgIC8qIG5vdyBjb21wYXJlIHRoZSBwcmVmaXggKi8KLSAgICBpZiAoc3RybmNtcChpbnB1dCwgbWF0Y2hidWYsIGwpID09IDApIHsKLSAgICAgICAgcmV3cml0ZWxvZyhyLCA1LCAic3RyaXAgbWF0Y2hpbmcgcHJlZml4OiAlcyAtPiAlcyIsIG91dHB1dCwgb3V0cHV0K2wpOwotICAgICAgICBvdXRwdXQgPSBhcF9wc3RyZHVwKHItPnBvb2wsIG91dHB1dCtsKTsKLQotICAgICAgICAvKiBhbmQgbm93IGFkZCB0aGUgYmFzZS1VUkwgYXMgcmVwbGFjZW1lbnQgcHJlZml4ICovCi0gICAgICAgIGwgPSBhcF9jcHlzdHJuKHN1YnN0YnVmLCBzdWJzdCwgc2l6ZW9mKHN1YnN0YnVmKSkgLSBzdWJzdGJ1ZjsKLSAgICAgICAgaWYgKHN1YnN0YnVmW2wtMV0gIT0gJy8nKSB7Ci0gICAgICAgICAgIHN1YnN0YnVmW2xdID0gJy8nOwotICAgICAgICAgICBzdWJzdGJ1ZltsKzFdID0gJ1wwJzsKLSAgICAgICAgICAgbCsrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvdXRwdXRbMF0gPT0gJy8nKSB7Ci0gICAgICAgICAgICByZXdyaXRlbG9nKHIsIDQsICJhZGQgc3Vic3QgcHJlZml4OiAlcyAtPiAlcyVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LCBzdWJzdGJ1Ziwgb3V0cHV0KzEpOwotICAgICAgICAgICAgb3V0cHV0ID0gYXBfcHN0cmNhdChyLT5wb29sLCBzdWJzdGJ1Ziwgb3V0cHV0KzEsIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCA0LCAiYWRkIHN1YnN0IHByZWZpeDogJXMgLT4gJXMlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwgc3Vic3RidWYsIG91dHB1dCk7Ci0gICAgICAgICAgICBvdXRwdXQgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHN1YnN0YnVmLCBvdXRwdXQsIE5VTEwpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBvdXRwdXQ7Ci19Ci0KLQotLyoKLSoqCi0qKiAgb3duIGNvbW1hbmQgbGluZSBwYXJzZXIgd2hpY2ggZG9uJ3QgaGF2ZSB0aGUgJ1xcJyBwcm9ibGVtCi0qKgotKi8KLQotc3RhdGljIGludCBwYXJzZWFyZ2xpbmUoY2hhciAqc3RyLCBjaGFyICoqYTEsIGNoYXIgKiphMiwgY2hhciAqKmEzKQotewotICAgIGNoYXIgKmNwOwotICAgIGludCBpc3F1b3RlZDsKLQotI2RlZmluZSBTS0lQX1dISVRFU1BBQ0UoY3ApIFwKLSAgICBmb3IgKCA7ICpjcCA9PSAnICcgfHwgKmNwID09ICdcdCc7ICkgeyBcCi0gICAgICAgIGNwKys7IFwKLSAgICB9OwotCi0jZGVmaW5lIENIRUNLX1FVT1RBVElPTihjcCxpc3F1b3RlZCkgXAotICAgIGlzcXVvdGVkID0gMDsgXAotICAgIGlmICgqY3AgPT0gJyInKSB7IFwKLSAgICAgICAgaXNxdW90ZWQgPSAxOyBcCi0gICAgICAgIGNwKys7IFwKLSAgICB9Ci0KLSNkZWZpbmUgREVURVJNSU5FX05FWFRTVFJJTkcoY3AsaXNxdW90ZWQpIFwKLSAgICBmb3IgKCA7ICpjcCAhPSAnXDAnOyBjcCsrKSB7IFwKLSAgICAgICAgaWYgKCAgIChpc3F1b3RlZCAgICAmJiAoKmNwICAgICA9PSAnICcgfHwgKmNwICAgICA9PSAnXHQnKSkgXAotICAgICAgICAgICAgfHwgKCpjcCA9PSAnXFwnICYmICgqKGNwKzEpID09ICcgJyB8fCAqKGNwKzEpID09ICdcdCcpKSkgeyBcCi0gICAgICAgICAgICBjcCsrOyBcCi0gICAgICAgICAgICBjb250aW51ZTsgXAotICAgICAgICB9IFwKLSAgICAgICAgaWYgKCAgICghaXNxdW90ZWQgJiYgKCpjcCA9PSAnICcgfHwgKmNwID09ICdcdCcpKSBcCi0gICAgICAgICAgICB8fCAoaXNxdW90ZWQgICYmICpjcCA9PSAnIicpICAgICAgICAgICAgICAgICAgKSB7IFwKLSAgICAgICAgICAgIGJyZWFrOyBcCi0gICAgICAgIH0gXAotICAgIH0KLQotICAgIGNwID0gc3RyOwotICAgIFNLSVBfV0hJVEVTUEFDRShjcCk7Ci0KLSAgICAvKiAgZGV0ZXJtaW5lIGZpcnN0IGFyZ3VtZW50ICovCi0gICAgQ0hFQ0tfUVVPVEFUSU9OKGNwLCBpc3F1b3RlZCk7Ci0gICAgKmExID0gY3A7Ci0gICAgREVURVJNSU5FX05FWFRTVFJJTkcoY3AsIGlzcXVvdGVkKTsKLSAgICBpZiAoKmNwID09ICdcMCcpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgICpjcCsrID0gJ1wwJzsKLQotICAgIFNLSVBfV0hJVEVTUEFDRShjcCk7Ci0KLSAgICAvKiAgZGV0ZXJtaW5lIHNlY29uZCBhcmd1bWVudCAqLwotICAgIENIRUNLX1FVT1RBVElPTihjcCwgaXNxdW90ZWQpOwotICAgICphMiA9IGNwOwotICAgIERFVEVSTUlORV9ORVhUU1RSSU5HKGNwLCBpc3F1b3RlZCk7Ci0gICAgaWYgKCpjcCA9PSAnXDAnKSB7Ci0gICAgICAgICpjcCsrID0gJ1wwJzsKLSAgICAgICAgKmEzID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgICpjcCsrID0gJ1wwJzsKLQotICAgIFNLSVBfV0hJVEVTUEFDRShjcCk7Ci0KLSAgICAvKiBhZ2FpbiBjaGVjayBpZiB0aGVyZSBhcmUgb25seSB0d28gYXJndW1lbnRzICovCi0gICAgaWYgKCpjcCA9PSAnXDAnKSB7Ci0gICAgICAgICpjcCsrID0gJ1wwJzsKLSAgICAgICAgKmEzID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogIGRldGVybWluZSBzZWNvbmQgYXJndW1lbnQgKi8KLSAgICBDSEVDS19RVU9UQVRJT04oY3AsIGlzcXVvdGVkKTsKLSAgICAqYTMgPSBjcDsKLSAgICBERVRFUk1JTkVfTkVYVFNUUklORyhjcCwgaXNxdW90ZWQpOwotICAgICpjcCsrID0gJ1wwJzsKLQotICAgIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyB2b2lkIGFkZF9lbnZfdmFyaWFibGUocmVxdWVzdF9yZWMgKnIsIGNoYXIgKnMpCi17Ci0gICAgY2hhciB2YXJbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgdmFsW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjaGFyICpjcDsKLSAgICBpbnQgbjsKLQotICAgIGlmICgoY3AgPSBzdHJjaHIocywgJzonKSkgIT0gTlVMTCkgewotICAgICAgICBuID0gKChjcC1zKSA+IE1BWF9TVFJJTkdfTEVOLTEgPyBNQVhfU1RSSU5HX0xFTi0xIDogKGNwLXMpKTsKLSAgICAgICAgbWVtY3B5KHZhciwgcywgbik7Ci0gICAgICAgIHZhcltuXSA9ICdcMCc7Ci0gICAgICAgIGFwX2NweXN0cm4odmFsLCBjcCsxLCBzaXplb2YodmFsKSk7Ci0gICAgICAgIGFwX3RhYmxlX3NldChyLT5zdWJwcm9jZXNzX2VudiwgdmFyLCB2YWwpOwotICAgICAgICByZXdyaXRlbG9nKHIsIDUsICJzZXR0aW5nIGVudiB2YXJpYWJsZSAnJXMnIHRvICclcyciLCB2YXIsIHZhbCk7Ci0gICAgfQotfQotCi0KLQotLyoKLSoqCi0qKiAgc3RhdCgpIGZvciBvbmx5IHRoZSBwcmVmaXggb2YgYSBwYXRoCi0qKgotKi8KLQotc3RhdGljIGludCBwcmVmaXhfc3RhdChjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3Qgc3RhdCAqc2IpCi17Ci0gICAgY2hhciBjdXJwYXRoW0xPTkdfU1RSSU5HX0xFTl07Ci0gICAgY2hhciAqY3A7Ci0KLSAgICBhcF9jcHlzdHJuKGN1cnBhdGgsIHBhdGgsIHNpemVvZihjdXJwYXRoKSk7Ci0gICAgaWYgKGN1cnBhdGhbMF0gIT0gJy8nKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoKGNwID0gc3RyY2hyKGN1cnBhdGgrMSwgJy8nKSkgIT0gTlVMTCkgewotICAgICAgICAqY3AgPSAnXDAnOwotICAgIH0KLSAgICBpZiAoc3RhdChjdXJwYXRoLCBzYikgPT0gMCkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotCi0vKgotKioKLSoqICBGaWxlIGxvY2tpbmcKLSoqCi0qLwotCi0jaWZkZWYgVVNFX0ZDTlRMCi1zdGF0aWMgc3RydWN0IGZsb2NrICAgbG9ja19pdDsKLXN0YXRpYyBzdHJ1Y3QgZmxvY2sgdW5sb2NrX2l0OwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGZkX2xvY2socmVxdWVzdF9yZWMgKnIsIGludCBmZCkKLXsKLSAgICBpbnQgcmM7Ci0KLSNpZmRlZiBVU0VfRkNOVEwKLSAgICBsb2NrX2l0Lmxfd2hlbmNlID0gU0VFS19TRVQ7IC8qIGZyb20gY3VycmVudCBwb2ludCAqLwotICAgIGxvY2tfaXQubF9zdGFydCAgPSAwOyAgICAgICAgLyogLSItICovCi0gICAgbG9ja19pdC5sX2xlbiAgICA9IDA7ICAgICAgICAvKiB1bnRpbCBlbmQgb2YgZmlsZSAqLwotICAgIGxvY2tfaXQubF90eXBlICAgPSBGX1dSTENLOyAgLyogc2V0IGV4Y2x1c2l2ZS93cml0ZSBsb2NrICovCi0gICAgbG9ja19pdC5sX3BpZCAgICA9IDA7ICAgICAgICAvKiBwaWQgbm90IGFjdHVhbGx5IGludGVyZXN0aW5nICovCi0KLSAgICB3aGlsZSAoICAgKChyYyA9IGZjbnRsKGZkLCBGX1NFVExLVywgJmxvY2tfaXQpKSA8IDApCi0gICAgICAgICAgICAgICYmIChlcnJubyA9PSBFSU5UUikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgIH0KLSNlbmRpZgotI2lmZGVmIFVTRV9GTE9DSwotICAgIHdoaWxlICggICAoKHJjID0gZmxvY2soZmQsIExPQ0tfRVgpKSA8IDApCi0gICAgICAgICAgICAgICYmIChlcnJubyA9PSBFSU5UUikgICAgICAgICAgICAgICApIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgfQotI2VuZGlmCi0jaWZkZWYgVVNFX0xPQ0tJTkcKLSAgICAvKiBMb2NrIHRoZSBmaXJzdCBieXRlLCBhbHdheXMsIGFzc3VtZSB3ZSB3YW50IHRvIGFwcGVuZAotICAgICAgIGFuZCBzZWVrIHRvIHRoZSBlbmQgYWZ0ZXJ3YXJkcyAqLwotICAgIGxzZWVrKGZkLCAwLCBTRUVLX1NFVCk7Ci0gICAgcmMgPSBfbG9ja2luZyhmZCwgX0xLX0xPQ0ssIDEpOwotICAgIGxzZWVrKGZkLCAwLCBTRUVLX0VORCk7Ci0jZW5kaWYKLQotICAgIGlmIChyYyA8IDApIHsKLSAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsCi0gICAgICAgICAgICAgICAgICAgICAibW9kX3Jld3JpdGU6IGZhaWxlZCB0byBsb2NrIGZpbGUgZGVzY3JpcHRvciIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGZkX3VubG9jayhyZXF1ZXN0X3JlYyAqciwgaW50IGZkKQotewotICAgIGludCByYzsKLQotI2lmZGVmIFVTRV9GQ05UTAotICAgIHVubG9ja19pdC5sX3doZW5jZSA9IFNFRUtfU0VUOyAvKiBmcm9tIGN1cnJlbnQgcG9pbnQgKi8KLSAgICB1bmxvY2tfaXQubF9zdGFydCAgPSAwOyAgICAgICAgLyogLSItICovCi0gICAgdW5sb2NrX2l0LmxfbGVuICAgID0gMDsgICAgICAgIC8qIHVudGlsIGVuZCBvZiBmaWxlICovCi0gICAgdW5sb2NrX2l0LmxfdHlwZSAgID0gRl9VTkxDSzsgIC8qIHVubG9jayAqLwotICAgIHVubG9ja19pdC5sX3BpZCAgICA9IDA7ICAgICAgICAvKiBwaWQgbm90IGFjdHVhbGx5IGludGVyZXN0aW5nICovCi0KLSAgICByYyA9IGZjbnRsKGZkLCBGX1NFVExLVywgJnVubG9ja19pdCk7Ci0jZW5kaWYKLSNpZmRlZiBVU0VfRkxPQ0sKLSAgICByYyA9IGZsb2NrKGZkLCBMT0NLX1VOKTsKLSNlbmRpZgotI2lmZGVmIFVTRV9MT0NLSU5HCi0gICAgbHNlZWsoZmQsIDAsIFNFRUtfU0VUKTsKLSAgICByYyA9IF9sb2NraW5nKGZkLCBfTEtfVU5MQ0ssIDEpOwotICAgIGxzZWVrKGZkLCAwLCBTRUVLX0VORCk7Ci0jZW5kaWYKLQotICAgIGlmIChyYyA8IDApIHsKLSAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsCi0gICAgICAgICAgICAgICAgICAgICAibW9kX3Jld3JpdGU6IGZhaWxlZCB0byB1bmxvY2sgZmlsZSBkZXNjcmlwdG9yIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotfQotCi0vKgotKioKLSoqICBMZXhpY29ncmFwaGljIENvbXBhcmUKLSoqCi0qLwotCi1zdGF0aWMgaW50IGNvbXBhcmVfbGV4aWNvZ3JhcGh5KGNoYXIgKmNwTnVtMSwgY2hhciAqY3BOdW0yKQotewotICAgIGludCBpOwotICAgIGludCBuMSwgbjI7Ci0KLSAgICBuMSA9IHN0cmxlbihjcE51bTEpOwotICAgIG4yID0gc3RybGVuKGNwTnVtMik7Ci0gICAgaWYgKG4xID4gbjIpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmIChuMSA8IG4yKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IG4xOyBpKyspIHsKLSAgICAgICAgaWYgKGNwTnVtMVtpXSA+IGNwTnVtMltpXSkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNwTnVtMVtpXSA8IGNwTnVtMltpXSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0KLS8qRU9GKi8KZGlmZiAtLWdpdCBhL21vZHVsZXMvbWFwcGVycy9tb2RfcmV3cml0ZS5kc3AgYi9tb2R1bGVzL21hcHBlcnMvbW9kX3Jld3JpdGUuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTBmZmQxLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWFwcGVycy9tb2RfcmV3cml0ZS5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJBcGFjaGVNb2R1bGVSZXdyaXRlIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDIKLQotQ0ZHPUFwYWNoZU1vZHVsZVJld3JpdGUgLSBXaW4zMiBSZWxlYXNlCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIkFwYWNoZU1vZHVsZVJld3JpdGUubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJBcGFjaGVNb2R1bGVSZXdyaXRlLm1hayJcCi0gQ0ZHPSJBcGFjaGVNb2R1bGVSZXdyaXRlIC0gV2luMzIgUmVsZWFzZSIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJBcGFjaGVNb2R1bGVSZXdyaXRlIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uXAotICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAiQXBhY2hlTW9kdWxlUmV3cml0ZSAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb25cCi0gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1NVEw9bWlkbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAiQXBhY2hlTW9kdWxlUmV3cml0ZSAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiLlxBcGFjaGVNb2R1bGVSZXdyaXRlUiIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuXEFwYWNoZU1vZHVsZVJld3JpdGVSIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvTzIgL0kgIi4uXC4uXGluY2x1ZGUiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiTk9fREJNX1JFV1JJVEVNQVAiIC9EICJTSEFSRURfTU9EVUxFIiAvRCAiV0lOMzJfTEVBTl9BTkRfTUVBTiIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgLi5cLi5cQ29yZVJcQXBhY2hlQ29yZS5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIHdzMl8zMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFjaGluZTpJMzg2Ci0KLSFFTFNFSUYgICIkKENGRykiID09ICJBcGFjaGVNb2R1bGVSZXdyaXRlIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuXERlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiLlxEZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICIuXEFwYWNoZU1vZHVsZVJld3JpdGVEIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi5cQXBhY2hlTW9kdWxlUmV3cml0ZUQiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvSSAiLi5cLi5caW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJOT19EQk1fUkVXUklURU1BUCIgL0QgIlNIQVJFRF9NT0RVTEUiIC9EICJXSU4zMl9MRUFOX0FORF9NRUFOIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgLi5cLi5cQ29yZURcQXBhY2hlQ29yZS5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIHdzMl8zMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NgotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAiQXBhY2hlTW9kdWxlUmV3cml0ZSAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgIkFwYWNoZU1vZHVsZVJld3JpdGUgLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2hwajtiYXQ7Zm9yO2Y5MCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXG1vZHVsZXNcc3RhbmRhcmRcbW9kX3Jld3JpdGUuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5ccGFzc3dkLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmw7Zmk7ZmQiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHJlYWRkaXIuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47Y250O3J0ZjtnaWY7anBnO2pwZWc7anBlIgotIyBFbmQgR3JvdXAKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tYXBwZXJzL21vZF9yZXdyaXRlLmV4cCBiL21vZHVsZXMvbWFwcGVycy9tb2RfcmV3cml0ZS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMjE2NWIuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tYXBwZXJzL21vZF9yZXdyaXRlLmV4cAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXJld3JpdGVfbW9kdWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL21hcHBlcnMvbW9kX3Jld3JpdGUuaCBiL21vZHVsZXMvbWFwcGVycy9tb2RfcmV3cml0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmZmMzM3Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWFwcGVycy9tb2RfcmV3cml0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDk3ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0KLSNpZm5kZWYgX01PRF9SRVdSSVRFX0gKLSNkZWZpbmUgX01PRF9SRVdSSVRFX0ggMQotCi0vKgotKiogICAgICAgICAgICAgICAgICAgICAgIF8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXyBfCi0qKiAgIF8gX18gX19fICAgX19fICAgX198IHwgICAgXyBfXyBfX19fXyAgICAgIF9fXyBfXyhfKSB8XyBfX18KLSoqICB8ICdfIGAgXyBcIC8gXyBcIC8gX2AgfCAgIHwgJ19fLyBfIFwgXCAvXCAvIC8gJ19ffCB8IF9fLyBfIFwKLSoqICB8IHwgfCB8IHwgfCAoXykgfCAoX3wgfCAgIHwgfCB8ICBfXy9cIFYgIFYgL3wgfCAgfCB8IHx8ICBfXy8KLSoqICB8X3wgfF98IHxffFxfX18vIFxfXyxffF9fX3xffCAgXF9fX3wgXF8vXF8vIHxffCAgfF98XF9fXF9fX3wKLSoqICAgICAgICAgICAgICAgICAgICAgICB8X19fX198Ci0qKgotKiogIFVSTCBSZXdyaXRpbmcgTW9kdWxlCi0qKgotKiogIFRoaXMgbW9kdWxlIHVzZXMgYSBydWxlLWJhc2VkIHJld3JpdGluZyBlbmdpbmUgKGJhc2VkIG9uIGEKLSoqICByZWd1bGFyLWV4cHJlc3Npb24gcGFyc2VyKSB0byByZXdyaXRlIHJlcXVlc3RlZCBVUkxzIG9uIHRoZSBmbHkuCi0qKgotKiogIEl0IHN1cHBvcnRzIGFuIHVubGltaXRlZCBudW1iZXIgb2YgYWRkaXRpb25hbCBydWxlIGNvbmRpdGlvbnMgKHdoaWNoIGNhbgotKiogIG9wZXJhdGUgb24gYSBsb3Qgb2YgdmFyaWFibGVzLCBldmVuIG9uIEhUVFAgaGVhZGVycykgZm9yIGdyYW51bGFyCi0qKiAgbWF0Y2hpbmcgYW5kIGV2ZW4gZXh0ZXJuYWwgZGF0YWJhc2UgbG9va3VwcyAoZWl0aGVyIHZpYSBwbGFpbiB0ZXh0Ci0qKiAgdGFibGVzLCBEQk0gaGFzaCBmaWxlcyBvciBldmVuIGV4dGVybmFsIHByb2Nlc3NlcykgZm9yIGFkdmFuY2VkIFVSTAotKiogIHN1YnN0aXR1dGlvbi4KLSoqCi0qKiAgSXQgb3BlcmF0ZXMgb24gdGhlIGZ1bGwgVVJMcyAoaW5jbHVkaW5nIHRoZSBQQVRIX0lORk8gcGFydCkgYm90aCBpbgotKiogIHBlci1zZXJ2ZXIgY29udGV4dCAoaHR0cGQuY29uZikgYW5kIHBlci1kaXIgY29udGV4dCAoLmh0YWNjZXNzKSBhbmQgZXZlbgotKiogIGNhbiBnZW5lcmF0ZSBRVUVSWV9TVFJJTkcgcGFydHMgb24gcmVzdWx0LiAgIFRoZSByZXdyaXRpbmcgcmVzdWx0IGZpbmFsbHkKLSoqICBjYW4gbGVhZCB0byBpbnRlcm5hbCBzdWJwcm9jZXNzaW5nLCBleHRlcm5hbCByZXF1ZXN0IHJlZGlyZWN0aW9uIG9yIGV2ZW4KLSoqICB0byBpbnRlcm5hbCBwcm94eSB0aHJvdWdocHV0LgotKioKLSoqICBUaGlzIG1vZHVsZSB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGluIEFwcmlsIDE5OTYgYW5kCi0qKiAgZ2lmdGVkIGV4Y2x1c2l2ZWx5IHRvIHRoZSBUaGUgQXBhY2hlIEdyb3VwIGluIEp1bHkgMTk5NyBieQotKioKLSoqICAgICAgUmFsZiBTLiBFbmdlbHNjaGFsbAotKiogICAgICByc2VAZW5nZWxzY2hhbGwuY29tCi0qKiAgICAgIHd3dy5lbmdlbHNjaGFsbC5jb20KLSovCi0KLQotICAgIC8qIEluY2x1ZGUgZnJvbSB0aGUgdW5kZXJsYXlpbmcgVW5peCBzeXN0ZW0gLi4uICovCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0gICAgLyogSW5jbHVkZSBmcm9tIHRoZSBBcGFjaGUgc2VydmVyIC4uLiAqLwotI2RlZmluZSBDT1JFX1BSSVZBVEUKLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25mX2dsb2JhbHMuaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfdmhvc3QuaCIKLQotICAgIC8qCi0gICAgICogVGhlIGtleSBpbiB0aGUgci0+bm90ZXMgdGFibGUgd2hlcmVpbiB3ZSBzdG9yZSBvdXIgYWNjdW11bGF0ZWQKLSAgICAgKiBWYXJ5IHZhbHVlcywgYW5kIHRoZSBvbmUgdXNlZCBmb3IgcGVyLWNvbmRpdGlvbiBjaGVja3MgaW4gYSBjaGFpbi4KLSAgICAgKi8KLSNkZWZpbmUgVkFSWV9LRVkgInJld3JpdGUtVmFyeSIKLSNkZWZpbmUgVkFSWV9LRVlfVEhJUyAicmV3cml0ZS1WYXJ5LXRoaXMiCi0KLSAgICAvKiBUaGUgTkRCTSBzdXBwb3J0OgotICAgICAqIFdlIHN1cHBvcnQgb25seSBOREJNIGZpbGVzLgotICAgICAqIEJ1dCB3ZSBoYXZlIHRvIHN0YXQgdGhlIGZpbGUgZm9yIHRoZSBtdGltZSwKLSAgICAgKiBzbyB3ZSBhbHNvIG5lZWQgdG8ga25vdyB0aGUgZmlsZSBleHRlbnNpb24KLSAgICAgKi8KLSNpZm5kZWYgTk9fREJNX1JFV1JJVEVNQVAKLSNpZiBkZWZpbmVkKF9fR0xJQkNfXykgJiYgZGVmaW5lZChfX0dMSUJDX01JTk9SX18pIFwKLSAgICAmJiBfX0dMSUJDX18gPj0gMiAmJiBfX0dMSUJDX01JTk9SX18gPj0gMQotI2luY2x1ZGUgPGRiMS9uZGJtLmg+Ci0jZWxzZQotI2luY2x1ZGUgPG5kYm0uaD4KLSNlbmRpZgotI2lmIGRlZmluZWQoREJNX1NVRkZJWCkKLSNkZWZpbmUgTkRCTV9GSUxFX1NVRkZJWCBEQk1fU1VGRklYCi0jZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCAoZGVmaW5lZChEQl9MT0NLKSAmJiBkZWZpbmVkKERCX1NITUVNKSkKLSNkZWZpbmUgTkRCTV9GSUxFX1NVRkZJWCAiLmRiIgotI2Vsc2UKLSNkZWZpbmUgTkRCTV9GSUxFX1NVRkZJWCAiLnBhZyIKLSNlbmRpZgotI2VuZGlmCi0KLQotICAgIC8qIFRoZSBsb2NraW5nIHN1cHBvcnQ6Ci0gICAgICogVHJ5IHRvIGRldGVybWluZSB3aGV0aGVyIHdlIHNob3VsZCB1c2UgZmNudGwoKSBvciBmbG9jaygpLgotICAgICAqIFdvdWxkIGJlIGJldHRlciBhcF9jb25maWcuaCBjb3VsZCBwcm92aWRlIHRoaXMuLi4gOi0oCi0gICAgICovCi0jaWYgZGVmaW5lZChVU0VfRkNOVExfU0VSSUFMSVpFRF9BQ0NFUFQpCi0jZGVmaW5lIFVTRV9GQ05UTCAxCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNlbmRpZgotI2lmIGRlZmluZWQoVVNFX0ZMT0NLX1NFUklBTElaRURfQUNDRVBUKQotI2RlZmluZSBVU0VfRkxPQ0sgMQotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZChVU0VfRkNOVEwpICYmICFkZWZpbmVkKFVTRV9GTE9DSykKLSNkZWZpbmUgVVNFX0ZMT0NLIDEKLSNpZiAhZGVmaW5lZChNUEUpICYmICFkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChfX1RBTkRFTSkKLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotI2VuZGlmCi0jaWZuZGVmIExPQ0tfVU4KLSN1bmRlZiBVU0VfRkxPQ0sKLSNkZWZpbmUgVVNFX0ZDTlRMIDEKLSNpbmNsdWRlIDxmY250bC5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBBSVgKLSN1bmRlZiBVU0VfRkxPQ0sKLSNkZWZpbmUgVVNFX0ZDTlRMIDEKLSNpbmNsdWRlIDxmY250bC5oPgotI2VuZGlmCi0jaWZkZWYgV0lOMzIKLSN1bmRlZiBVU0VfRkNOVEwKLSNkZWZpbmUgVVNFX0xPQ0tJTkcKLSNpbmNsdWRlIDxzeXMvbG9ja2luZy5oPgotI2VuZGlmCi0KLQotLyoKLSoqCi0qKiAgU29tZSBkZWZpbmVzCi0qKgotKi8KLQotI2RlZmluZSBFTlZWQVJfU0NSSVBUX1VSTCAiU0NSSVBUX1VSTCIKLSNkZWZpbmUgRU5WVkFSX1NDUklQVF9VUkkgIlNDUklQVF9VUkkiCi0KLSNpZm5kZWYgU1VQUE9SVF9EQk1fUkVXUklURU1BUAotI2RlZmluZSBTVVBQT1JUX0RCTV9SRVdSSVRFTUFQIDAKLSNlbmRpZgotCi0jZGVmaW5lIFJFV1JJVEVfRk9SQ0VEX01JTUVUWVBFX05PVEVWQVIgInJld3JpdGUtZm9yY2VkLW1pbWV0eXBlIgotCi0jZGVmaW5lIENPTkRGTEFHX05PTkUgICAgICAgICAgICAgICAxPDwwCi0jZGVmaW5lIENPTkRGTEFHX05PQ0FTRSAgICAgICAgICAgICAxPDwxCi0jZGVmaW5lIENPTkRGTEFHX05PVE1BVENIICAgICAgICAgICAxPDwyCi0jZGVmaW5lIENPTkRGTEFHX09STkVYVCAgICAgICAgICAgICAxPDwzCi0KLSNkZWZpbmUgUlVMRUZMQUdfTk9ORSAgICAgICAgICAgICAgIDE8PDAKLSNkZWZpbmUgUlVMRUZMQUdfRk9SQ0VSRURJUkVDVCAgICAgIDE8PDEKLSNkZWZpbmUgUlVMRUZMQUdfTEFTVFJVTEUgICAgICAgICAgIDE8PDIKLSNkZWZpbmUgUlVMRUZMQUdfTkVXUk9VTkQgICAgICAgICAgIDE8PDMKLSNkZWZpbmUgUlVMRUZMQUdfQ0hBSU4gICAgICAgICAgICAgIDE8PDQKLSNkZWZpbmUgUlVMRUZMQUdfSUdOT1JFT05TVUJSRVEgICAgIDE8PDUKLSNkZWZpbmUgUlVMRUZMQUdfTk9UTUFUQ0ggICAgICAgICAgIDE8PDYKLSNkZWZpbmUgUlVMRUZMQUdfUFJPWFkgICAgICAgICAgICAgIDE8PDcKLSNkZWZpbmUgUlVMRUZMQUdfUEFTU1RIUk9VR0ggICAgICAgIDE8PDgKLSNkZWZpbmUgUlVMRUZMQUdfRk9SQklEREVOICAgICAgICAgIDE8PDkKLSNkZWZpbmUgUlVMRUZMQUdfR09ORSAgICAgICAgICAgICAgIDE8PDEwCi0jZGVmaW5lIFJVTEVGTEFHX1FTQVBQRU5EICAgICAgICAgICAxPDwxMQotI2RlZmluZSBSVUxFRkxBR19OT0NBU0UgICAgICAgICAgICAgMTw8MTIKLQotI2RlZmluZSBNQVBUWVBFX1RYVCAgICAgICAgICAgICAgICAgMTw8MAotI2RlZmluZSBNQVBUWVBFX0RCTSAgICAgICAgICAgICAgICAgMTw8MQotI2RlZmluZSBNQVBUWVBFX1BSRyAgICAgICAgICAgICAgICAgMTw8MgotI2RlZmluZSBNQVBUWVBFX0lOVCAgICAgICAgICAgICAgICAgMTw8MwotI2RlZmluZSBNQVBUWVBFX1JORCAgICAgICAgICAgICAgICAgMTw8NAotCi0jZGVmaW5lIEVOR0lORV9ESVNBQkxFRCAgICAgICAgICAgICAxPDwwCi0jZGVmaW5lIEVOR0lORV9FTkFCTEVEICAgICAgICAgICAgICAxPDwxCi0KLSNkZWZpbmUgT1BUSU9OX05PTkUgICAgICAgICAgICAgICAgIDE8PDAKLSNkZWZpbmUgT1BUSU9OX0lOSEVSSVQgICAgICAgICAgICAgIDE8PDEKLQotI2RlZmluZSBDQUNIRU1PREVfVFMgICAgICAgICAgICAgICAgMTw8MAotI2RlZmluZSBDQUNIRU1PREVfVFRMICAgICAgICAgICAgICAgMTw8MQotCi0jZGVmaW5lIENBQ0hFX1RMQl9ST1dTIDEwMjQKLSNkZWZpbmUgQ0FDSEVfVExCX0NPTFMgNAotCi0jaWZuZGVmIEZBTFNFCi0jZGVmaW5lIEZBTFNFIDAKLSNkZWZpbmUgVFJVRSAgIUZBTFNFCi0jZW5kaWYKLQotI2lmbmRlZiBOTwotI2RlZmluZSBOTyAgICBGQUxTRQotI2RlZmluZSBZRVMgICBUUlVFCi0jZW5kaWYKLQotI2lmbmRlZiBSQU5EX01BWAotI2RlZmluZSBSQU5EX01BWCAzMjc2NwotI2VuZGlmCi0KLSNpZm5kZWYgTE9OR19TVFJJTkdfTEVOCi0jZGVmaW5lIExPTkdfU1RSSU5HX0xFTiAyMDQ4Ci0jZW5kaWYKLQotI2RlZmluZSBNQVhfRU5WX0ZMQUdTIDE1Ci0KLSNkZWZpbmUgTUFYX05NQVRDSCAgICAxMAotCi0vKgotKioKLSoqICBvdXIgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZXMgd2UgaGFuZGxlIHdpdGgKLSoqCi0qLwotCi0gICAgLyogdGhlIGxpc3Qgc3RydWN0dXJlcyBmb3IgaG9sZGluZyB0aGUgbWFwZmlsZSBpbmZvcm1hdGlvbgotICAgICAqIGFuZCB0aGUgcmV3cml0ZSBydWxlcwotICAgICAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAgICAvKiB0aGUgbmFtZSBvZiB0aGUgbWFwICovCi0gICAgY2hhciAqZGF0YWZpbGU7ICAgICAgICAgICAgICAgIC8qIGZpbGVuYW1lIGZvciBtYXAgZGF0YSBmaWxlcyAqLwotICAgIGNoYXIgKmNoZWNrZmlsZTsgICAgICAgICAgICAgICAvKiBmaWxlbmFtZSB0byBjaGVjayBmb3IgbWFwIGV4aXN0ZW5jZSAqLwotICAgIGludCAgIHR5cGU7ICAgICAgICAgICAgICAgICAgICAvKiB0aGUgdHlwZSBvZiB0aGUgbWFwICovCi0gICAgaW50ICAgZnBpbjsgICAgICAgICAgICAgICAgICAgIC8qIGluICBmaWxlIHBvaW50ZXIgZm9yIHByb2dyYW0gbWFwcyAqLwotICAgIGludCAgIGZwb3V0OyAgICAgICAgICAgICAgICAgICAvKiBvdXQgZmlsZSBwb2ludGVyIGZvciBwcm9ncmFtIG1hcHMgKi8KLSAgICBpbnQgICBmcGVycjsgICAgICAgICAgICAgICAgICAgLyogZXJyIGZpbGUgcG9pbnRlciBmb3IgcHJvZ3JhbSBtYXBzICovCi0gICAgY2hhciAqKCpmdW5jKShyZXF1ZXN0X3JlYyAqLCAgIC8qIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIGludGVybmFsIG1hcHMgKi8KLSAgICAgICAgICAgICAgICAgIGNoYXIgKik7Ci19IHJld3JpdGVtYXBfZW50cnk7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjaGFyICAgICppbnB1dDsgICAgICAgICAgICAgICAgLyogSW5wdXQgc3RyaW5nIG9mIFJld3JpdGVDb25kICovCi0gICAgY2hhciAgICAqcGF0dGVybjsgICAgICAgICAgICAgIC8qIHRoZSBSZWdFeHAgcGF0dGVybiBzdHJpbmcgKi8KLSAgICByZWdleF90ICpyZWdleHA7Ci0gICAgaW50ICAgICAgZmxhZ3M7ICAgICAgICAgICAgICAgIC8qIEZsYWdzIHdoaWNoIGNvbnRyb2wgdGhlIG1hdGNoICovCi19IHJld3JpdGVjb25kX2VudHJ5OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgYXJyYXlfaGVhZGVyICpyZXdyaXRlY29uZHM7ICAgIC8qIHRoZSBjb3JyZXNwb25kaW5nIFJld3JpdGVDb25kIGVudHJpZXMgKi8KLSAgICBjaGFyICAgICpwYXR0ZXJuOyAgICAgICAgICAgICAgLyogdGhlIFJlZ0V4cCBwYXR0ZXJuIHN0cmluZyAqLwotICAgIHJlZ2V4X3QgKnJlZ2V4cDsgICAgICAgICAgICAgICAvKiB0aGUgUmVnRXhwIHBhdHRlcm4gY29tcGlsYXRpb24gKi8KLSAgICBjaGFyICAgICpvdXRwdXQ7ICAgICAgICAgICAgICAgLyogdGhlIFN1YnN0aXR1dGlvbiBzdHJpbmcgKi8KLSAgICBpbnQgICAgICBmbGFnczsgICAgICAgICAgICAgICAgLyogRmxhZ3Mgd2hpY2ggY29udHJvbCB0aGUgc3Vic3RpdHV0aW9uICovCi0gICAgY2hhciAgICAqZm9yY2VkX21pbWV0eXBlOyAgICAgIC8qIGZvcmNlZCBNSU1FIHR5cGUgb2Ygc3Vic3RpdHV0aW9uICovCi0gICAgaW50ICAgICAgZm9yY2VkX3Jlc3BvbnNlY29kZTsgIC8qIGZvcmNlZCBIVFRQIHJlZGlyZWN0IHJlc3BvbnNlIHN0YXR1cyAqLwotICAgIGNoYXIgICAgKmVudltNQVhfRU5WX0ZMQUdTKzFdOyAvKiBhZGRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKi8KLSAgICBpbnQgICAgICBza2lwOyAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIG5leHQgcnVsZXMgdG8gc2tpcCAqLwotfSByZXdyaXRlcnVsZV9lbnRyeTsKLQotCi0gICAgLyogdGhlIHBlci1zZXJ2ZXIgb3IgcGVyLXZpcnR1YWwtc2VydmVyIGNvbmZpZ3VyYXRpb24KLSAgICAgKiBzdGF0aWNhbGx5IGdlbmVyYXRlZCBvbmNlIG9uIHN0YXJ0dXAgZm9yIGV2ZXJ5IHNlcnZlcgotICAgICAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCAgICAgICAgICAgc3RhdGU7ICAgICAgICAgICAvKiB0aGUgUmV3cml0ZUVuZ2luZSBzdGF0ZSAqLwotICAgIGludCAgICAgICAgICAgb3B0aW9uczsgICAgICAgICAvKiB0aGUgUmV3cml0ZU9wdGlvbiBzdGF0ZSAqLwotICAgIGNoYXIgICAgICAgICAqcmV3cml0ZWxvZ2ZpbGU7ICAvKiB0aGUgUmV3cml0ZUxvZyBmaWxlbmFtZSAqLwotICAgIGludCAgICAgICAgICAgcmV3cml0ZWxvZ2ZwOyAgICAvKiB0aGUgUmV3cml0ZUxvZyBvcGVuIGZpbGVwb2ludGVyICovCi0gICAgaW50ICAgICAgICAgICByZXdyaXRlbG9nbGV2ZWw7IC8qIHRoZSBSZXdyaXRlTG9nIGxldmVsIG9mIHZlcmJvc2l0eSAqLwotICAgIGFycmF5X2hlYWRlciAqcmV3cml0ZW1hcHM7ICAgICAvKiB0aGUgUmV3cml0ZU1hcCBlbnRyaWVzICovCi0gICAgYXJyYXlfaGVhZGVyICpyZXdyaXRlY29uZHM7ICAgIC8qIHRoZSBSZXdyaXRlQ29uZCBlbnRyaWVzICh0ZW1wb3JhcnkpICovCi0gICAgYXJyYXlfaGVhZGVyICpyZXdyaXRlcnVsZXM7ICAgIC8qIHRoZSBSZXdyaXRlUnVsZSBlbnRyaWVzICovCi0gICAgc2VydmVyX3JlYyAgICpzZXJ2ZXI7ICAgICAgICAgIC8qIHRoZSBjb3JyZXNwb25kaW5nIHNlcnZlciBpbmRpY2F0b3IgKi8KLX0gcmV3cml0ZV9zZXJ2ZXJfY29uZjsKLQotCi0gICAgLyogdGhlIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbgotICAgICAqIGdlbmVyYXRlZCBvbi10aGUtZmx5IGJ5IEFwYWNoZSBzZXJ2ZXIgZm9yIGN1cnJlbnQgcmVxdWVzdAotICAgICAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCAgICAgICAgICAgc3RhdGU7ICAgICAgICAgICAvKiB0aGUgUmV3cml0ZUVuZ2luZSBzdGF0ZSAqLwotICAgIGludCAgICAgICAgICAgb3B0aW9uczsgICAgICAgICAvKiB0aGUgUmV3cml0ZU9wdGlvbiBzdGF0ZSAqLwotICAgIGFycmF5X2hlYWRlciAqcmV3cml0ZWNvbmRzOyAgICAvKiB0aGUgUmV3cml0ZUNvbmQgZW50cmllcyAodGVtcG9yYXJ5KSAqLwotICAgIGFycmF5X2hlYWRlciAqcmV3cml0ZXJ1bGVzOyAgICAvKiB0aGUgUmV3cml0ZVJ1bGUgZW50cmllcyAqLwotICAgIGNoYXIgICAgICAgICAqZGlyZWN0b3J5OyAgICAgICAvKiB0aGUgZGlyZWN0b3J5IHdoZXJlIGl0IGFwcGxpZXMgKi8KLSAgICBjaGFyICAgICAgICAgKmJhc2V1cmw7ICAgICAgICAgLyogdGhlIGJhc2UtVVJMICB3aGVyZSBpdCBhcHBsaWVzICovCi19IHJld3JpdGVfcGVyZGlyX2NvbmY7Ci0KLQotICAgIC8qIHRoZSBjYWNoZSBzdHJ1Y3R1cmVzLAotICAgICAqIGEgNC13YXkgaGFzaCB0YWJsZSB3aXRoIExSVSBmdW5jdGlvbmFsaXR5Ci0gICAgICovCi10eXBlZGVmIHN0cnVjdCBjYWNoZWVudHJ5IHsKLSAgICB0aW1lX3QgdGltZTsKLSAgICBjaGFyICAqa2V5OwotICAgIGNoYXIgICp2YWx1ZTsKLX0gY2FjaGVlbnRyeTsKLQotdHlwZWRlZiBzdHJ1Y3QgdGxiZW50cnkgewotICAgIGludCB0W0NBQ0hFX1RMQl9DT0xTXTsKLX0gY2FjaGV0bGJlbnRyeTsKLQotdHlwZWRlZiBzdHJ1Y3QgY2FjaGVsaXN0IHsKLSAgICBjaGFyICAgICAgICAgKnJlc291cmNlOwotICAgIGFycmF5X2hlYWRlciAqZW50cmllczsKLSAgICBhcnJheV9oZWFkZXIgKnRsYjsKLX0gY2FjaGVsaXN0OwotCi10eXBlZGVmIHN0cnVjdCBjYWNoZSB7Ci0gICAgcG9vbCAgICAgICAgICpwb29sOwotICAgIGFycmF5X2hlYWRlciAqbGlzdHM7Ci19IGNhY2hlOwotCi0KLSAgICAvKiB0aGUgcmVnZXggc3RydWN0dXJlIGZvciB0aGUKLSAgICAgKiBzdWJzdGl0dXRpb24gb2YgYmFja3JlZmVyZW5jZXMKLSAgICAgKi8KLXR5cGVkZWYgc3RydWN0IGJhY2tyZWZpbmZvIHsKLSAgICBjaGFyICpzb3VyY2U7Ci0gICAgaW50IG5zdWI7Ci0gICAgcmVnbWF0Y2hfdCByZWdtYXRjaFsxMF07Ci19IGJhY2tyZWZpbmZvOwotCi0KLS8qCi0qKgotKiogIGZvcndhcmQgZGVjbGFyYXRpb25zCi0qKgotKi8KLQotICAgIC8qIGNvbmZpZyBzdHJ1Y3R1cmUgaGFuZGxpbmcgKi8KLXN0YXRpYyB2b2lkICpjb25maWdfc2VydmVyX2NyZWF0ZShwb29sICpwLCBzZXJ2ZXJfcmVjICpzKTsKLXN0YXRpYyB2b2lkICpjb25maWdfc2VydmVyX21lcmdlIChwb29sICpwLCB2b2lkICpiYXNldiwgdm9pZCAqb3ZlcnJpZGVzdik7Ci1zdGF0aWMgdm9pZCAqY29uZmlnX3BlcmRpcl9jcmVhdGUocG9vbCAqcCwgY2hhciAqcGF0aCk7Ci1zdGF0aWMgdm9pZCAqY29uZmlnX3BlcmRpcl9tZXJnZSAocG9vbCAqcCwgdm9pZCAqYmFzZXYsIHZvaWQgKm92ZXJyaWRlc3YpOwotCi0gICAgLyogY29uZmlnIGRpcmVjdGl2ZSBoYW5kbGluZyAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9yZXdyaXRlZW5naW5lKGNtZF9wYXJtcyAqY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJld3JpdGVfcGVyZGlyX2NvbmYgKmRjb25mLCBpbnQgZmxhZyk7Ci1zdGF0aWMgY29uc3QgY2hhciAqY21kX3Jld3JpdGVvcHRpb25zKGNtZF9wYXJtcyAqY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXdyaXRlX3BlcmRpcl9jb25mICpkY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqb3B0aW9uKTsKLXN0YXRpYyBjb25zdCBjaGFyICpjbWRfcmV3cml0ZW9wdGlvbnNfc2V0b3B0aW9uKHBvb2wgKnAsIGludCAqb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm5hbWUpOwotc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9yZXdyaXRlbG9nICAgICAoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmRjb25mLCBjaGFyICphMSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqY21kX3Jld3JpdGVsb2dsZXZlbChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZGNvbmYsIGNoYXIgKmExKTsKLXN0YXRpYyBjb25zdCBjaGFyICpjbWRfcmV3cml0ZW1hcCAgICAgKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkY29uZiwgY2hhciAqYTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICphMik7Ci1zdGF0aWMgY29uc3QgY2hhciAqY21kX3Jld3JpdGVsb2NrKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkY29uZiwgY2hhciAqYTEpOwotc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9yZXdyaXRlYmFzZShjbWRfcGFybXMgKmNtZCwgcmV3cml0ZV9wZXJkaXJfY29uZiAqZGNvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmExKTsKLXN0YXRpYyBjb25zdCBjaGFyICpjbWRfcmV3cml0ZWNvbmQoY21kX3Bhcm1zICpjbWQsIHJld3JpdGVfcGVyZGlyX2NvbmYgKmRjb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzdHIpOwotc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9yZXdyaXRlY29uZF9wYXJzZWZsYWdmaWVsZChwb29sICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXdyaXRlY29uZF9lbnRyeSAqbmV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzdHIpOwotc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9yZXdyaXRlY29uZF9zZXRmbGFnKHBvb2wgKnAsIHJld3JpdGVjb25kX2VudHJ5ICpjZmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqa2V5LCBjaGFyICp2YWwpOwotc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9yZXdyaXRlcnVsZShjbWRfcGFybXMgKmNtZCwgcmV3cml0ZV9wZXJkaXJfY29uZiAqZGNvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN0cik7Ci1zdGF0aWMgY29uc3QgY2hhciAqY21kX3Jld3JpdGVydWxlX3BhcnNlZmxhZ2ZpZWxkKHBvb2wgKnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJld3JpdGVydWxlX2VudHJ5ICpuZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN0cik7Ci1zdGF0aWMgY29uc3QgY2hhciAqY21kX3Jld3JpdGVydWxlX3NldGZsYWcocG9vbCAqcCwgcmV3cml0ZXJ1bGVfZW50cnkgKmNmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICprZXksIGNoYXIgKnZhbCk7Ci0KLSAgICAvKiBpbml0aWFsaXNhdGlvbiAqLwotc3RhdGljIHZvaWQgaW5pdF9tb2R1bGUoc2VydmVyX3JlYyAqcywgcG9vbCAqcCk7Ci1zdGF0aWMgdm9pZCBpbml0X2NoaWxkKHNlcnZlcl9yZWMgKnMsIHBvb2wgKnApOwotCi0gICAgLyogcnVudGltZSBob29rcyAqLwotc3RhdGljIGludCBob29rX3VyaTJmaWxlICAgKHJlcXVlc3RfcmVjICpyKTsKLXN0YXRpYyBpbnQgaG9va19taW1ldHlwZSAgIChyZXF1ZXN0X3JlYyAqcik7Ci1zdGF0aWMgaW50IGhvb2tfZml4dXAgICAgICAocmVxdWVzdF9yZWMgKnIpOwotc3RhdGljIGludCBoYW5kbGVyX3JlZGlyZWN0KHJlcXVlc3RfcmVjICpyKTsKLQotICAgIC8qIHJld3JpdGluZyBlbmdpbmUgKi8KLXN0YXRpYyBpbnQgYXBwbHlfcmV3cml0ZV9saXN0KHJlcXVlc3RfcmVjICpyLCBhcnJheV9oZWFkZXIgKnJld3JpdGVydWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBlcmRpcik7Ci1zdGF0aWMgaW50IGFwcGx5X3Jld3JpdGVfcnVsZShyZXF1ZXN0X3JlYyAqciwgcmV3cml0ZXJ1bGVfZW50cnkgKnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwZXJkaXIpOwotc3RhdGljIGludCBhcHBseV9yZXdyaXRlX2NvbmQocmVxdWVzdF9yZWMgKnIsIHJld3JpdGVjb25kX2VudHJ5ICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGVyZGlyLCBiYWNrcmVmaW5mbyAqYnJpUlIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrcmVmaW5mbyAqYnJpUkMpOwotCi0gICAgLyogVVJJIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uICovCi1zdGF0aWMgdm9pZCAgc3BsaXRvdXRfcXVlcnlhcmdzKHJlcXVlc3RfcmVjICpyLCBpbnQgcXNhcHBlbmQpOwotc3RhdGljIHZvaWQgIGZ1bGx5X3F1YWxpZnlfdXJpKHJlcXVlc3RfcmVjICpyKTsKLXN0YXRpYyB2b2lkICByZWR1Y2VfdXJpKHJlcXVlc3RfcmVjICpyKTsKLXN0YXRpYyB2b2lkICBleHBhbmRfYmFja3JlZl9pbmJ1ZmZlcihwb29sICpwLCBjaGFyICpidWYsIGludCBuYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tyZWZpbmZvICpicmksIGNoYXIgYyk7Ci1zdGF0aWMgY2hhciAqZXhwYW5kX3RpbGRlcGF0aHMocmVxdWVzdF9yZWMgKnIsIGNoYXIgKnVyaSk7Ci1zdGF0aWMgdm9pZCAgZXhwYW5kX21hcF9sb29rdXBzKHJlcXVlc3RfcmVjICpyLCBjaGFyICp1cmksIGludCB1cmlfbGVuKTsKLQotICAgIC8qIHJld3JpdGUgbWFwIHN1cHBvcnQgZnVuY3Rpb25zICovCi1zdGF0aWMgY2hhciAqbG9va3VwX21hcChyZXF1ZXN0X3JlYyAqciwgY2hhciAqbmFtZSwgY2hhciAqa2V5KTsKLXN0YXRpYyBjaGFyICpsb29rdXBfbWFwX3R4dGZpbGUocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmZpbGUsIGNoYXIgKmtleSk7Ci0jaWZuZGVmIE5PX0RCTV9SRVdSSVRFTUFQCi1zdGF0aWMgY2hhciAqbG9va3VwX21hcF9kYm1maWxlKHJlcXVlc3RfcmVjICpyLCBjaGFyICpmaWxlLCBjaGFyICprZXkpOwotI2VuZGlmCi1zdGF0aWMgY2hhciAqbG9va3VwX21hcF9wcm9ncmFtKHJlcXVlc3RfcmVjICpyLCBpbnQgZnBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZwb3V0LCBjaGFyICprZXkpOwotc3RhdGljIGNoYXIgKmxvb2t1cF9tYXBfaW50ZXJuYWwocmVxdWVzdF9yZWMgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICooKmZ1bmMpKHJlcXVlc3RfcmVjICpyLCBjaGFyICprZXkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqa2V5KTsKLXN0YXRpYyBjaGFyICpyZXdyaXRlX21hcGZ1bmNfdG91cHBlcihyZXF1ZXN0X3JlYyAqciwgY2hhciAqa2V5KTsKLXN0YXRpYyBjaGFyICpyZXdyaXRlX21hcGZ1bmNfdG9sb3dlcihyZXF1ZXN0X3JlYyAqciwgY2hhciAqa2V5KTsKLXN0YXRpYyBjaGFyICpyZXdyaXRlX21hcGZ1bmNfZXNjYXBlKHJlcXVlc3RfcmVjICpyLCBjaGFyICprZXkpOwotc3RhdGljIGNoYXIgKnJld3JpdGVfbWFwZnVuY191bmVzY2FwZShyZXF1ZXN0X3JlYyAqciwgY2hhciAqa2V5KTsKLXN0YXRpYyBjaGFyICpzZWxlY3RfcmFuZG9tX3ZhbHVlX3BhcnQocmVxdWVzdF9yZWMgKnIsIGNoYXIgKnZhbHVlKTsKLXN0YXRpYyB2b2lkICByZXdyaXRlX3JhbmRfaW5pdCh2b2lkKTsKLXN0YXRpYyBpbnQgICByZXdyaXRlX3JhbmQoaW50IGwsIGludCBoKTsKLQotICAgIC8qIHJld3JpdGluZyBsb2dmaWxlIHN1cHBvcnQgKi8KLXN0YXRpYyB2b2lkICBvcGVuX3Jld3JpdGVsb2coc2VydmVyX3JlYyAqcywgcG9vbCAqcCk7Ci1zdGF0aWMgdm9pZCAgcmV3cml0ZWxvZyhyZXF1ZXN0X3JlYyAqciwgaW50IGxldmVsLCBjb25zdCBjaGFyICp0ZXh0LCAuLi4pCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLDMsNCkpKTsKLXN0YXRpYyBjaGFyICpjdXJyZW50X2xvZ3RpbWUocmVxdWVzdF9yZWMgKnIpOwotCi0gICAgLyogcmV3cml0aW5nIGxvY2tmaWxlIHN1cHBvcnQgKi8KLXN0YXRpYyB2b2lkIHJld3JpdGVsb2NrX2NyZWF0ZShzZXJ2ZXJfcmVjICpzLCBwb29sICpwKTsKLXN0YXRpYyB2b2lkIHJld3JpdGVsb2NrX29wZW4oc2VydmVyX3JlYyAqcywgcG9vbCAqcCk7Ci1zdGF0aWMgdm9pZCByZXdyaXRlbG9ja19yZW1vdmUodm9pZCAqZGF0YSk7Ci1zdGF0aWMgdm9pZCByZXdyaXRlbG9ja19hbGxvYyhyZXF1ZXN0X3JlYyAqcik7Ci1zdGF0aWMgdm9pZCByZXdyaXRlbG9ja19mcmVlKHJlcXVlc3RfcmVjICpyKTsKLQotICAgIC8qIHByb2dyYW0gbWFwIHN1cHBvcnQgKi8KLXN0YXRpYyB2b2lkICBydW5fcmV3cml0ZW1hcF9wcm9ncmFtcyhzZXJ2ZXJfcmVjICpzLCBwb29sICpwKTsKLXN0YXRpYyBpbnQgICByZXdyaXRlbWFwX3Byb2dyYW1fY2hpbGQodm9pZCAqY21kLCBjaGlsZF9pbmZvICpwaW5mbyk7Ci0KLSAgICAvKiBlbnYgdmFyaWFibGUgc3VwcG9ydCAqLwotc3RhdGljIHZvaWQgIGV4cGFuZF92YXJpYWJsZXNfaW5idWZmZXIocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmJ1ZiwgaW50IGJ1Zl9sZW4pOwotc3RhdGljIGNoYXIgKmV4cGFuZF92YXJpYWJsZXMocmVxdWVzdF9yZWMgKnIsIGNoYXIgKnN0cik7Ci1zdGF0aWMgY2hhciAqbG9va3VwX3ZhcmlhYmxlKHJlcXVlc3RfcmVjICpyLCBjaGFyICp2YXIpOwotc3RhdGljIGNoYXIgKmxvb2t1cF9oZWFkZXIocmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKm5hbWUpOwotCi0gICAgLyogY2FjaGluZyBmdW5jdGlvbnMgKi8KLXN0YXRpYyBjYWNoZSAqaW5pdF9jYWNoZShwb29sICpwKTsKLXN0YXRpYyBjaGFyICAqZ2V0X2NhY2hlX3N0cmluZyhjYWNoZSAqYywgY2hhciAqcmVzLCBpbnQgbW9kZSwgdGltZV90IG10aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmtleSk7Ci1zdGF0aWMgdm9pZCAgIHNldF9jYWNoZV9zdHJpbmcoY2FjaGUgKmMsIGNoYXIgKnJlcywgaW50IG1vZGUsIHRpbWVfdCBtdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICprZXksIGNoYXIgKnZhbHVlKTsKLXN0YXRpYyBjYWNoZWVudHJ5ICpyZXRyaWV2ZV9jYWNoZV9zdHJpbmcoY2FjaGUgKmMsIGNoYXIgKnJlcywgY2hhciAqa2V5KTsKLXN0YXRpYyB2b2lkICAgc3RvcmVfY2FjaGVfc3RyaW5nKGNhY2hlICpjLCBjaGFyICpyZXMsIGNhY2hlZW50cnkgKmNlKTsKLQotICAgIC8qIG1pc2MgZnVuY3Rpb25zICovCi1zdGF0aWMgY2hhciAgKnN1YnN0X3ByZWZpeF9wYXRoKHJlcXVlc3RfcmVjICpyLCBjaGFyICppbnB1dCwgY2hhciAqbWF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN1YnN0KTsKLXN0YXRpYyBpbnQgICAgcGFyc2VhcmdsaW5lKGNoYXIgKnN0ciwgY2hhciAqKmExLCBjaGFyICoqYTIsIGNoYXIgKiphMyk7Ci1zdGF0aWMgaW50ICAgIHByZWZpeF9zdGF0KGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBzdGF0ICpzYik7Ci1zdGF0aWMgdm9pZCAgIGFkZF9lbnZfdmFyaWFibGUocmVxdWVzdF9yZWMgKnIsIGNoYXIgKnMpOwotCi0gICAgLyogRmlsZSBsb2NraW5nICovCi1zdGF0aWMgdm9pZCBmZF9sb2NrKHJlcXVlc3RfcmVjICpyLCBpbnQgZmQpOwotc3RhdGljIHZvaWQgZmRfdW5sb2NrKHJlcXVlc3RfcmVjICpyLCBpbnQgZmQpOwotCi0gICAgLyogTGV4aWNvZ3JhcGhpYyBDb21wYXJpc29uICovCi1zdGF0aWMgaW50IGNvbXBhcmVfbGV4aWNvZ3JhcGh5KGNoYXIgKmNwTnVtMSwgY2hhciAqY3BOdW0yKTsKLQotI2VuZGlmIC8qIF9NT0RfUkVXUklURV9IICovCi0KLS8qRU9GKi8KZGlmZiAtLWdpdCBhL21vZHVsZXMvbWFwcGVycy9tb2Rfc28uYyBiL21vZHVsZXMvbWFwcGVycy9tb2Rfc28uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYwYjYzZC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21hcHBlcnMvbW9kX3NvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjAgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKiAKLSAqIFRoaXMgbW9kdWxlIGlzIHVzZWQgdG8gbG9hZCBBcGFjaGUgbW9kdWxlcyBhdCBydW50aW1lLiBUaGlzIG1lYW5zIHRoYXQgdGhlCi0gKiBzZXJ2ZXIgZnVuY3Rpb25hbGl0eSBjYW4gYmUgZXh0ZW5kZWQgd2l0aG91dCByZWNvbXBpbGluZyBhbmQgZXZlbiB3aXRob3V0Ci0gKiB0YWtpbmcgdGhlIHNlcnZlciBkb3duIGF0IGFsbC4gT25seSBhIEhVUCBvciBVU1IxIHNpZ25hbCBuZWVkcyB0byBiZSBzZW5kCi0gKiB0byB0aGUgc2VydmVyIHRvIHJlbG9hZCB0aGUgZHluYW1pY2FsbHkgbG9hZGVkIG1vZHVsZXMuCi0gKgotICogVG8gdXNlLCB5b3UnbGwgZmlyc3QgbmVlZCB0byBidWlsZCB5b3VyIG1vZHVsZSBhcyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuCi0gKiB1cGRhdGUgeW91ciBjb25maWd1cmF0aW9uIChodHRwZC5jb25mKSB0byBnZXQgdGhlIEFwYWNoZSBjb3JlIHRvIGxvYWQgdGhlCi0gKiBtb2R1bGUgYXQgc3RhcnQtdXAuCi0gKgotICogVGhlIGVhc2llc3Qgd2F5IHRvIGJ1aWxkIGEgbW9kdWxlIGFzIGEgc2hhcmVkIGxpYnJhcnkgaXMgdG8gdXNlIHRoZQotICogYFNoYXJlZE1vZHVsZScgY29tbWFuZCBpbiB0aGUgQ29uZmlndXJhdGlvbiBmaWxlLCBpbnN0ZWFkIG9mIGBBZGRNb2R1bGUnLgotICogWW91IHNob3VsZCBhbHNvIGNoYW5nZSB0aGUgZmlsZSBleHRlbnNpb24gZnJvbSBgLm8nIHRvIGAuc28nLiBTbywgZm9yCi0gKiBleGFtcGxlLCB0byBidWlsZCB0aGUgc3RhdHVzIG1vZHVsZSBhcyBhIHNoYXJlZCBsaWJyYXJ5IGVkaXQgQ29uZmlndXJhdGlvbgotICogYW5kIGNoYW5nZQotICogICBBZGRNb2R1bGUgICAgbW9kdWxlcy9zdGFuZGFyZC9tb2Rfc3RhdHVzLm8KLSAqIHRvCi0gKiAgIFNoYXJlZE1vZHVsZSBtb2R1bGVzL3N0YW5kYXJkL21vZF9zdGF0dXMuc28KLSAqCi0gKiBSdW4gQ29uZmlndXJlIGFuZCBtYWtlLiBOb3cgQXBhY2hlJ3MgaHR0cGQgYmluYXJ5IHdpbGwgX25vdF8gaW5jbHVkZQotICogbW9kX3N0YXR1cy4gSW5zdGVhZCBhIHNoYXJlZCBvYmplY3QgY2FsbGVkIG1vZF9zdGF0dXMuc28gd2lsbCBiZSBidWlsZCwgaW4KLSAqIHRoZSBtb2R1bGVzL3N0YW5kYXJkIGRpcmVjdG9yeS4gWW91IGNhbiBidWlsZCBtb3N0IG9mIHRoZSBtb2R1bGVzIGFzIHNoYXJlZAotICogbGlicmFyaWVzIGxpa2UgdGhpcy4KLSAqCi0gKiBUbyB1c2UgdGhlIHNoYXJlZCBtb2R1bGUsIG1vdmUgdGhlIC5zbyBmaWxlKHMpIGludG8gYW4gYXBwcm9wcmlhdGUKLSAqIGRpcmVjdG9yeS4gWW91IG1pZ2h0IGxpa2UgdG8gY3JlYXRlIGEgZGlyZWN0b3J5IGNhbGxlZCAibW9kdWxlcyIgdW5kZXIgeW91Ci0gKiBzZXJ2ZXIgcm9vdCBmb3IgdGhpcyAoZS5nLiAvdXNyL2xvY2FsL2h0dHBkL21vZHVsZXMpLiAKLSAqCi0gKiBUaGVuIGVkaXQgeW91ciBjb25mL2h0dHBkLmNvbmYgZmlsZSwgYW5kIGFkZCBMb2FkTW9kdWxlIGxpbmVzLiBGb3IKLSAqIGV4YW1wbGUKLSAqICAgTG9hZE1vZHVsZSAgc3RhdHVzX21vZHVsZSAgIG1vZHVsZXMvbW9kX3N0YXR1cy5zbwotICoKLSAqIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgbW9kdWxlJ3Mgc3RydWN0dXJlIG5hbWUgKGxvb2sgYXQgdGhlIGVuZCBvZiB0aGUKLSAqIG1vZHVsZSBzb3VyY2UgdG8gZmluZCB0aGlzKS4gVGhlIHNlY29uZCBvcHRpb24gaXMgdGhlIHBhdGggdG8gdGhlIG1vZHVsZQotICogZmlsZSwgcmVsYXRpdmUgdG8gdGhlIHNlcnZlciByb290LiAgUHV0IHRoZXNlIGRpcmVjdGl2ZXMgcmlnaHQgYXQgdGhlIHRvcAotICogb2YgeW91ciBodHRwZC5jb25mIGZpbGUuCi0gKgotICogTm93IHlvdSBjYW4gc3RhcnQgQXBhY2hlLiBBIG1lc3NhZ2Ugd2lsbCBiZSBsb2dnZWQgYXQgImRlYnVnIiBsZXZlbCB0byB5b3VyCi0gKiBlcnJvcl9sb2cgdG8gY29uZmlybSB0aGF0IHRoZSBtb2R1bGUocykgYXJlIGxvYWRlZCAodXNlICJMb2dMZXZlbCBkZWJ1ZyIKLSAqIGRpcmVjdGl2ZSB0byBnZXQgdGhlc2UgbG9nIG1lc3NhZ2VzKS4KLSAqCi0gKiBJZiB5b3UgZWRpdCB0aGUgTG9hZE1vZHVsZSBkaXJlY3RpdmVzIHdoaWxlIHRoZSBzZXJ2ZXIgaXMgbGl2ZSB5b3UgY2FuIGdldAotICogQXBhY2hlIHRvIHJlLWxvYWQgdGhlIG1vZHVsZXMgYnkgc2VuZGluZyBpdCBhIEhVUCBvciBVU1IxIHNpZ25hbCBhcyBub3JtYWwuCi0gKiBZb3UgY2FuIHVzZSB0aGlzIHRvIGR5bmFtaWNhbGx5IGNoYW5nZSB0aGUgY2FwYWJpbGl0eSBvZiB5b3VyIHNlcnZlcgotICogd2l0aG91dCBicmluZ2luZyBpdCBkb3duLgotICoKLSAqIEJlY2F1c2UgY3VycmVudGx5IHRoZXJlIGlzIG9ubHkgbGltaXRlZCBidWlsdC1pbiBzdXBwb3J0IGluIHRoZSBDb25maWd1cmUKLSAqIHNjcmlwdCBmb3IgY3JlYXRpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5IGZpbGVzIChgLnNvJyksIHBsZWFzZSBjb25zdWx0IHlvdXIKLSAqIHZlbmRvcnMgY2MoMSksIGxkKDEpIGFuZCBkbG9wZW4oMykgbWFucGFnZXMgdG8gZmluZCBvdXQgdGhlIGFwcHJvcHJpYXRlCi0gKiBjb21waWxlciBhbmQgbGlua2VyIGZsYWdzIGFuZCBpbnNlcnQgdGhlbSBtYW51YWxseSBpbnRvIHRoZSBDb25maWd1cmF0aW9uCi0gKiBmaWxlIHVuZGVyIENGTEFHU19TSExJQiwgTERGTEFHU19TSExJQiBhbmQgTERGTEFHU19TSExJQl9FWFBPUlQuCi0gKgotICogSWYgeW91IHN0aWxsIGhhdmUgcHJvYmxlbXMgZmlndXJpbmcgb3V0IHRoZSBmbGFncyBib3RoIHRyeSB0aGUgcGFwZXIKLSAqICAgICBodHRwOi8vZGV2ZWxvcGVyLm5ldHNjYXBlLmNvbS9saWJyYXJ5L2RvY3VtZW50YXRpb24vZW50ZXJwcmlzZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvdW5peC9zdnJwbHVnLmh0bSMxMDEzODA3Ci0gKiBvciBpbnN0YWxsIGEgUGVybCA1IGludGVycHJldGVyIG9uIHlvdXIgcGxhdGZvcm0gYW5kIHRoZW4gcnVuIHRoZSBjb21tYW5kCi0gKgotICogICAgICQgcGVybCAtVjp1c2VkbCAtVjpjY2RsZmxhZ3MgLVY6Y2NjZGxmbGFncyAtVjpsZGRsZmxhZ3MKLSAqCi0gKiBUaGlzIGdpdmVzIHlvdSB3aGF0IHR5cGUgb2YgZHluYW1pYyBsb2FkaW5nIFBlcmwgNSB1c2VzIG9uIHlvdXIgcGxhdGZvcm0KLSAqIGFuZCB3aGljaCBjb21waWxlciBhbmQgbGlua2VyIGZsYWdzIFBlcmwgNSB1c2VzIHRvIGNyZWF0ZSB0aGUgc2hhcmVkIG9iamVjdAotICogZmlsZXMuCi0gKgotICogQW5vdGhlciBsb2NhdGlvbiB3aGVyZSB5b3UgY2FuIGZpbmQgdXNlZnVsIGhpbnRzIGlzIHRoZSBgbHRjb25maWcnIHNjcmlwdAotICogb2YgdGhlIEdOVSBsaWJ0b29sIDEuMiBwYWNrYWdlLiBTZWFyY2ggZm9yIHlvdXIgcGxhdGZvcm0gbmFtZSBpbnNpZGUgdGhlCi0gKiB2YXJpb3VzICJjYXNlIiBjb25zdHJ1Y3RzLgotICoKLSAqLwotCi0KLSNkZWZpbmUgQ09SRV9QUklWQVRFCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBzb19tb2R1bGU7Ci0KLQotLyoKLSAqIFNlcnZlciBjb25maWd1cmF0aW9uIHRvIGtlZXAgdHJhY2sgb2YgYWN0dWFsbHkKLSAqIGxvYWRlZCBtb2R1bGVzIGFuZCB0aGUgY29ycmVzcG9uZGluZyBtb2R1bGUgbmFtZS4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCBtb2R1bGVpbmZvIHsKLSAgICBjaGFyICpuYW1lOwotICAgIG1vZHVsZSAqbW9kcDsKLX0gbW9kdWxlaW5mbzsKLQotdHlwZWRlZiBzdHJ1Y3Qgc29fc2VydmVyX2NvbmYgewotICAgIGFycmF5X2hlYWRlciAqbG9hZGVkX21vZHVsZXM7Ci19IHNvX3NlcnZlcl9jb25mOwotCi1zdGF0aWMgdm9pZCAqc29fc2NvbmZfY3JlYXRlKHBvb2wgKnAsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgc29fc2VydmVyX2NvbmYgKnNvYzsKLQotICAgIHNvYyA9IChzb19zZXJ2ZXJfY29uZiAqKWFwX3BjYWxsb2MocCwgc2l6ZW9mKHNvX3NlcnZlcl9jb25mKSk7Ci0gICAgc29jLT5sb2FkZWRfbW9kdWxlcyA9IGFwX21ha2VfYXJyYXkocCwgRFlOQU1JQ19NT0RVTEVfTElNSVQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihtb2R1bGVpbmZvKSk7Ci0jaWZuZGVmIE5PX0RMT1BFTgotICAgIGFwX29zX2Rzb19pbml0KCk7Ci0jZW5kaWYKLQotICAgIHJldHVybiAodm9pZCAqKXNvYzsKLX0KLQotI2lmbmRlZiBOT19ETE9QRU4KLQotLyoKLSAqIFRoaXMgaXMgdGhlIGNsZWFudXAgZm9yIGEgbG9hZGVkIHNoYXJlZCBvYmplY3QuIEl0IHVubG9hZHMgdGhlIG1vZHVsZS4KLSAqIFRoaXMgaXMgY2FsbGVkIGFzIGEgY2xlYW51cCBmdW5jdGlvbiBmcm9tIHRoZSBjb3JlLgotICovCi0KLXN0YXRpYyB2b2lkIHVubG9hZF9tb2R1bGUobW9kdWxlaW5mbyAqbW9kaSkKLXsKLSAgICAvKiBvbmx5IHVubG9hZCBpZiBtb2R1bGUgaW5mb3JtYXRpb24gaXMgc3RpbGwgZXhpc3RpbmcgKi8KLSAgICBpZiAobW9kaS0+bW9kcCA9PSBOVUxMKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvKiByZW1vdmUgdGhlIG1vZHVsZSBwb2ludGVyIGZyb20gdGhlIGNvcmUgc3RydWN0dXJlICovCi0gICAgYXBfcmVtb3ZlX2xvYWRlZF9tb2R1bGUobW9kaS0+bW9kcCk7Ci0KLSAgICAvKiB1bmxvYWQgdGhlIG1vZHVsZSBzcGFjZSBpdHNlbGYgKi8KLSAgICBhcF9vc19kc29fdW5sb2FkKChhcF9vc19kc29faGFuZGxlX3QpbW9kaS0+bW9kcC0+ZHluYW1pY19sb2FkX2hhbmRsZSk7Ci0KLSAgICAvKiBkZXN0cm95IHRoZSBtb2R1bGUgaW5mb3JtYXRpb24gKi8KLSAgICBtb2RpLT5tb2RwID0gTlVMTDsKLSAgICBtb2RpLT5uYW1lID0gTlVMTDsKLX0KLQotLyogCi0gKiBUaGlzIGlzIHRoZSBjbGVhbnVwIHJvdXRpbmUgZm9yIGZpbGVzIGxvYWRlZCBieQotICogbG9hZF9maWxlKCkuIFVuZm9ydHVuYXRlbHkgd2UgZG9uJ3Qga2VlcCBhIHJlY29yZCBvZiB0aGUgZmlsZW5hbWUKLSAqIHRoYXQgd2FzIGxvYWRlZCwgc28gd2UgY2FuJ3QgcmVwb3J0IHRoZSB1bmxvYWQgZm9yIGRlYnVnIHB1cnBvc2VzCi0gKiBvciBpbmNsdWRlIHRoZSBmaWxlbmFtZSBpbiBlcnJvciBtZXNzYWdlLgotICovCi0KLXN0YXRpYyB2b2lkIHVubG9hZF9maWxlKHZvaWQgKmhhbmRsZSkKLXsKLSAgICBhcF9vc19kc29fdW5sb2FkKChhcF9vc19kc29faGFuZGxlX3QpaGFuZGxlKTsKLX0KLQotLyogCi0gKiBUaGlzIGlzIGNhbGxlZCBmb3IgdGhlIGRpcmVjdGl2ZSBMb2FkTW9kdWxlIGFuZCBhY3R1YWxseSBsb2FkcwotICogYSBzaGFyZWQgb2JqZWN0IGZpbGUgaW50byB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgc2VydmVyIHByb2Nlc3MuCi0gKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKmxvYWRfbW9kdWxlKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqbW9kbmFtZSwgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgYXBfb3NfZHNvX2hhbmRsZV90IG1vZGhhbmRsZTsKLSAgICBtb2R1bGUgKm1vZHA7Ci0gICAgY29uc3QgY2hhciAqc3pNb2R1bGVGaWxlPWFwX3NlcnZlcl9yb290X3JlbGF0aXZlKGNtZC0+cG9vbCwgZmlsZW5hbWUpOwotICAgIHNvX3NlcnZlcl9jb25mICpzY29uZjsKLSAgICBtb2R1bGVpbmZvICptb2RpOwotICAgIG1vZHVsZWluZm8gKm1vZGllOwotICAgIGludCBpOwotCi0gICAgLyogCi0gICAgICogY2hlY2sgZm9yIGFscmVhZHkgZXhpc3RpbmcgbW9kdWxlCi0gICAgICogSWYgaXQgYWxyZWFkeSBleGlzdHMsIHdlIGhhdmUgbm90aGluZyB0byBkbyAKLSAgICAgKi8KLSAgICBzY29uZiA9IChzb19zZXJ2ZXJfY29uZiAqKWFwX2dldF9tb2R1bGVfY29uZmlnKGNtZC0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvX21vZHVsZSk7Ci0gICAgbW9kaWUgPSAobW9kdWxlaW5mbyAqKXNjb25mLT5sb2FkZWRfbW9kdWxlcy0+ZWx0czsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2NvbmYtPmxvYWRlZF9tb2R1bGVzLT5uZWx0czsgaSsrKSB7Ci0gICAgICAgIG1vZGkgPSAmbW9kaWVbaV07Ci0gICAgICAgIGlmIChtb2RpLT5uYW1lICE9IE5VTEwgJiYgc3RyY21wKG1vZGktPm5hbWUsIG1vZG5hbWUpID09IDApCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgbW9kaSA9IGFwX3B1c2hfYXJyYXkoc2NvbmYtPmxvYWRlZF9tb2R1bGVzKTsKLSAgICBtb2RpLT5uYW1lID0gbW9kbmFtZTsKLQotICAgIC8qCi0gICAgICogTG9hZCB0aGUgZmlsZSBpbnRvIHRoZSBBcGFjaGUgYWRkcmVzcyBzcGFjZQotICAgICAqLwotICAgIGlmICghKG1vZGhhbmRsZSA9IGFwX29zX2Rzb19sb2FkKHN6TW9kdWxlRmlsZSkpKSB7Ci0JY29uc3QgY2hhciAqbXlfZXJyb3IgPSBhcF9vc19kc29fZXJyb3IoKTsKLQlyZXR1cm4gYXBfcHN0cmNhdCAoY21kLT5wb29sLCAiQ2Fubm90IGxvYWQgIiwgc3pNb2R1bGVGaWxlLAotCQkJIiBpbnRvIHNlcnZlcjogIiwgCi0JCQlteV9lcnJvciA/IG15X2Vycm9yIDogIihyZWFzb24gdW5rbm93bikiLAotCQkJTlVMTCk7Ci0gICAgfQotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19ERUJVR3xBUExPR19OT0VSUk5PLCBOVUxMLAotCQkibG9hZGVkIG1vZHVsZSAlcyIsIG1vZG5hbWUpOwotCi0gICAgLyoKLSAgICAgKiBSZXRyaWV2ZSB0aGUgcG9pbnRlciB0byB0aGUgbW9kdWxlIHN0cnVjdHVyZSB0aHJvdWdoIHRoZSBtb2R1bGUgbmFtZToKLSAgICAgKiBGaXJzdCB3aXRoIHRoZSBoaWRkZW4gdmFyaWFudCAocHJlZml4IGBBUF8nKSBhbmQgdGhlbiB3aXRoIHRoZSBwbGFpbgotICAgICAqIHN5bWJvbCBuYW1lLgotICAgICAqLwotICAgIGlmICghKG1vZHAgPSAobW9kdWxlICopKGFwX29zX2Rzb19zeW0obW9kaGFuZGxlLCBtb2RuYW1lKSkpKSB7Ci0JcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCAiQ2FuJ3QgbG9jYXRlIEFQSSBtb2R1bGUgc3RydWN0dXJlIGAiLCBtb2RuYW1lLAotCQkgICAgICAgIicgaW4gZmlsZSAiLCBzek1vZHVsZUZpbGUsICI6ICIsIGFwX29zX2Rzb19lcnJvcigpLCBOVUxMKTsKLSAgICB9Ci0gICAgbW9kaS0+bW9kcCA9IG1vZHA7Ci0gICAgbW9kcC0+ZHluYW1pY19sb2FkX2hhbmRsZSA9ICh2b2lkICopbW9kaGFuZGxlOwotCi0gICAgLyogCi0gICAgICogTWFrZSBzdXJlIHRoZSBmb3VuZCBtb2R1bGUgc3RydWN0dXJlIGlzIHJlYWxseSBhIG1vZHVsZSBzdHJ1Y3R1cmUKLSAgICAgKiAKLSAgICAgKi8KLSAgICBpZiAobW9kcC0+bWFnaWMgIT0gTU9EVUxFX01BR0lDX0NPT0tJRSkgewotICAgICAgICByZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsICJBUEkgbW9kdWxlIHN0cnVjdHVyZSBgIiwgbW9kbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIicgaW4gZmlsZSAiLCBzek1vZHVsZUZpbGUsICIgaXMgZ2FyYmxlZCAtIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiIHBlcmhhcHMgdGhpcyBpcyBub3QgYW4gQXBhY2hlIG1vZHVsZSBEU08/IiwgTlVMTCk7Ci0gICAgfQotCi0gICAgLyogCi0gICAgICogQWRkIHRoaXMgbW9kdWxlIHRvIHRoZSBBcGFjaGUgY29yZSBzdHJ1Y3R1cmVzCi0gICAgICovCi0gICAgYXBfYWRkX2xvYWRlZF9tb2R1bGUobW9kcCk7Ci0KLSAgICAvKiAKLSAgICAgKiBSZWdpc3RlciBhIGNsZWFudXAgaW4gdGhlIGNvbmZpZyBwb29sIChub3JtYWxseSBwY29uZikuIFdoZW4KLSAgICAgKiB3ZSBkbyBhIHJlc3RhcnQgKG9yIHNodXRkb3duKSB0aGlzIGNsZWFudXAgd2lsbCBjYXVzZSB0aGUKLSAgICAgKiBzaGFyZWQgb2JqZWN0IHRvIGJlIHVubG9hZGVkLgotICAgICAqLwotICAgIGFwX3JlZ2lzdGVyX2NsZWFudXAoY21kLT5wb29sLCBtb2RpLCAKLQkJICAgICAodm9pZCAoKikodm9pZCopKXVubG9hZF9tb2R1bGUsIGFwX251bGxfY2xlYW51cCk7Ci0KLSAgICAvKiAKLSAgICAgKiBGaW5hbGx5IHdlIG5lZWQgdG8gcnVuIHRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3MgZm9yIHRoZSBtb2R1bGUKLSAgICAgKi8KLSAgICBhcF9zaW5nbGVfbW9kdWxlX2NvbmZpZ3VyZShjbWQtPnBvb2wsIGNtZC0+c2VydmVyLCBtb2RwKTsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi0vKiAKLSAqIFRoaXMgaW1wbGVtZW50cyB0aGUgTG9hZEZpbGUgZGlyZWN0aXZlIGFuZCBsb2FkcyBhbiBhcmJpdHJhcnkKLSAqIHNoYXJlZCBvYmplY3QgZmlsZSBpbnRvIHRoZSBhZHJlc3Mgc3BhY2Ugb2YgdGhlIHNlcnZlciBwcm9jZXNzLgotICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpsb2FkX2ZpbGUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICBhcF9vc19kc29faGFuZGxlX3QgaGFuZGxlOwotICAgIGNoYXIgKmZpbGU7Ci0KLSAgICBmaWxlID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUoY21kLT5wb29sLCBmaWxlbmFtZSk7Ci0gICAgCi0gICAgaWYgKCEoaGFuZGxlID0gYXBfb3NfZHNvX2xvYWQoZmlsZSkpKSB7Ci0JY29uc3QgY2hhciAqbXlfZXJyb3IgPSBhcF9vc19kc29fZXJyb3IoKTsKLQlyZXR1cm4gYXBfcHN0cmNhdCAoY21kLT5wb29sLCAiQ2Fubm90IGxvYWQgIiwgZmlsZW5hbWUsIAotCQkJIiBpbnRvIHNlcnZlcjoiLCAKLQkJCW15X2Vycm9yID8gbXlfZXJyb3IgOiAiKHJlYXNvbiB1bmtub3duKSIsCi0JCQlOVUxMKTsKLSAgICB9Ci0gICAgCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0RFQlVHfEFQTE9HX05PRVJSTk8sIE5VTEwsCi0JCSJsb2FkZWQgZmlsZSAlcyIsIGZpbGVuYW1lKTsKLQotICAgIGFwX3JlZ2lzdGVyX2NsZWFudXAoY21kLT5wb29sLCAodm9pZCAqKWhhbmRsZSwgdW5sb2FkX2ZpbGUsIGFwX251bGxfY2xlYW51cCk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotI2Vsc2UgLyogbm90IE5PX0RMT1BFTiAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqbG9hZF9maWxlKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgZnByaW50ZihzdGRlcnIsICJXQVJOSU5HOiBMb2FkRmlsZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm1cbiIpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqbG9hZF9tb2R1bGUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCAKLQkgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm1vZG5hbWUsIGNoYXIgKmZpbGVuYW1lKQotewotICAgIGZwcmludGYoc3RkZXJyLCAiV0FSTklORzogTG9hZE1vZHVsZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm1cbiIpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0jZW5kaWYgLyogTk9fRExPUEVOICovCi0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBzb19jbWRzW10gPSB7Ci0gICAgeyAiTG9hZE1vZHVsZSIsIGxvYWRfbW9kdWxlLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UyLAotICAgICAgImEgbW9kdWxlIG5hbWUgYW5kIHRoZSBuYW1lIG9mIGEgc2hhcmVkIG9iamVjdCBmaWxlIHRvIGxvYWQgaXQgZnJvbSJ9LAotICAgIHsgIkxvYWRGaWxlIiwgbG9hZF9maWxlLCBOVUxMLCBSU1JDX0NPTkYsIElURVJBVEUsCi0gICAgICAic2hhcmVkIG9iamVjdCBmaWxlIG9yIGxpYnJhcnkgdG8gbG9hZCBpbnRvIHRoZSBzZXJ2ZXIgYXQgcnVudGltZSJ9LAotICAgIHsgTlVMTCB9Ci19OwotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgc29fbW9kdWxlID0gewotICAgU1RBTkRBUkRfTU9EVUxFX1NUVUZGLAotICAgTlVMTCwJCQkvKiBpbml0aWFsaXplciAqLwotICAgTlVMTCwJCQkvKiBjcmVhdGUgcGVyLWRpciBjb25maWcgKi8KLSAgIE5VTEwsCQkJLyogbWVyZ2UgcGVyLWRpciBjb25maWcgKi8KLSAgIHNvX3Njb25mX2NyZWF0ZSwJCS8qIHNlcnZlciBjb25maWcgKi8KLSAgIE5VTEwsCQkJLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLwotICAgc29fY21kcywJCQkvKiBjb21tYW5kIHRhYmxlICovCi0gICBOVUxMLAkJCS8qIGhhbmRsZXJzICovCi0gICBOVUxMLAkJCS8qIGZpbGVuYW1lIHRyYW5zbGF0aW9uICovCi0gICBOVUxMLAkJCS8qIGNoZWNrX3VzZXJfaWQgKi8KLSAgIE5VTEwsCQkJLyogY2hlY2sgYXV0aCAqLwotICAgTlVMTCwJCQkvKiBjaGVjayBhY2Nlc3MgKi8KLSAgIE5VTEwsCQkJLyogdHlwZV9jaGVja2VyICovCi0gICBOVUxMLAkJCS8qIGZpeGVyX3VwcGVyICovCi0gICBOVUxMLAkJCS8qIGxvZ2dlciAqLwotICAgTlVMTCwJCQkvKiBoZWFkZXIgcGFyc2VyICovCi0gICBOVUxMLAkJCS8qIGNoaWxkX2luaXQgKi8KLSAgIE5VTEwsCQkJLyogY2hpbGRfZXhpdCAqLwotICAgTlVMTAkJCQkvKiBwb3N0IHJlYWQtcmVxdWVzdCAqLwotfTsKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWFwcGVycy9tb2Rfc3BlbGluZy5jIGIvbW9kdWxlcy9tYXBwZXJzL21vZF9zcGVsaW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2N2ZkNzcuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tYXBwZXJzL21vZF9zcGVsaW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTggKzAsMCBAQAotI2RlZmluZSBXQU5UX0JBU0VOQU1FX01BVENICi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotCi0vKiBtb2Rfc3BlbGluZy5jIC0gYnkgQWxleGVpIEtvc3V0IDxha29zdXRAb3JnYW5pYy5jb20+IEp1bmUsIDE5OTYKLSAqCi0gKiBUaGlzIG1vZHVsZSBpcyB0cmFuc3BhcmVudCwgYW5kIHNpbXBsZS4gSXQgYXR0ZW1wdHMgdG8gY29ycmVjdAotICogbWlzc3BlbGxpbmdzIG9mIFVSTHMgdGhhdCB1c2VycyBtaWdodCBoYXZlIGVudGVyZWQsIG5hbWVseSBieSBjaGVja2luZwotICogY2FwaXRhbGl6YXRpb25zLiBJZiBpdCBmaW5kcyBhIG1hdGNoLCBpdCBzZW5kcyBhIHJlZGlyZWN0LgotICoKLSAqIDA4LUF1Zy0xOTk3IDxNYXJ0aW4uS3JhZW1lckBNY2guU05JLkRlPgotICogbyBVcGdyYWRlZCBtb2R1bGUgaW50ZXJmYWNlIHRvIGFwYWNoZV8xLjNhMi1kZXYgQVBJIChtb3JlIE5VTEwncyBpbgotICogICBzcGVsaW5nX21vZHVsZSkuCi0gKiBvIEludGVncmF0ZWQgdGNzaCdzICJzcGVsbGluZyBjb3JyZWN0aW9uIiByb3V0aW5lIHdoaWNoIGFsbG93cyBvbmUKLSAqICAgbWlzc3BlbGxpbmcgKGNoYXJhY3RlciBpbnNlcnRpb24vb21pc3Npb24vdHlwby90cmFuc3Bvc2l0aW9uKS4KLSAqICAgUmV3cm90ZSBpdCB0byBpZ25vcmUgY2FzZSBhcyB3ZWxsLiBUaGlzIG91Z2h0IHRvIGNhdGNoIHRoZSBtYWpvcml0eQotICogICBvZiBtaXNzcGVsbGVkIHJlcXVlc3RzLgotICogbyBDb21tZW50ZWQgb3V0IHRoZSBzZWNvbmQgcGFzcyB3aGVyZSBmaWxlcycgc3VmZml4ZXMgYXJlIHN0cmlwcGVkLgotICogICBHaXZlbiB0aGUgYmV0dGVyIGhpdCByYXRlIG9mIHRoZSBmaXJzdCBwYXNzLCB0aGlzIHJhdGhlciB1Z2x5Ci0gKiAgIChyZXF1ZXN0IGluZGV4Lmh0bWwsIHJlY2VpdmUgaW5kZXguZGIgPyE/ISkgc29sdXRpb24gY2FuIGJlCi0gKiAgIG9taXR0ZWQuCi0gKiBvIHdyb3RlIGEgImtpbmQgb2YiIGh0bWwgcGFnZSBmb3IgbW9kX3NwZWxpbmcKLSAqCi0gKiBBY3RpdmF0ZSBpdCB3aXRoICJDaGVja1NwZWxsaW5nIE9uIgotICovCi0KLU1PRFVMRV9WQVJfRVhQT1JUIG1vZHVsZSBzcGVsaW5nX21vZHVsZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCBlbmFibGVkOwotfSBzcGNvbmZpZzsKLQotLyoKLSAqIENyZWF0ZSBhIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMgdG8gdGhpcyBtb2R1bGUgZm9yIGEgc2VydmVyIG9yIGRpcmVjdG9yeQotICogbG9jYXRpb24sIGFuZCBmaWxsIGl0IHdpdGggdGhlIGRlZmF1bHQgc2V0dGluZ3MuCi0gKgotICogVGhlIEFQSSBzYXlzIHRoYXQgaW4gdGhlIGFic2VuY2Ugb2YgYSBtZXJnZSBmdW5jdGlvbiwgdGhlIHJlY29yZCBmb3IgdGhlCi0gKiBjbG9zZXN0IGFuY2VzdG9yIGlzIHVzZWQgZXhjbHVzaXZlbHkuICBUaGF0J3Mgd2hhdCB3ZSB3YW50LCBzbyB3ZSBkb24ndAotICogYm90aGVyIHRvIGhhdmUgc3VjaCBhIGZ1bmN0aW9uLgotICovCi0KLXN0YXRpYyB2b2lkICpta2NvbmZpZyhwb29sICpwKQotewotICAgIHNwY29uZmlnICpjZmcgPSBhcF9wY2FsbG9jKHAsIHNpemVvZihzcGNvbmZpZykpOwotCi0gICAgY2ZnLT5lbmFibGVkID0gMDsKLSAgICByZXR1cm4gY2ZnOwotfQotCi0vKgotICogUmVzcG9uZCB0byBhIGNhbGxiYWNrIHRvIGNyZWF0ZSBjb25maWd1cmF0aW9uIHJlY29yZCBmb3IgYSBzZXJ2ZXIgb3IKLSAqIHZob3N0IGVudmlyb25tZW50LgotICovCi1zdGF0aWMgdm9pZCAqY3JlYXRlX21jb25maWdfZm9yX3NlcnZlcihwb29sICpwLCBzZXJ2ZXJfcmVjICpzKQotewotICAgIHJldHVybiBta2NvbmZpZyhwKTsKLX0KLQotLyoKLSAqIFJlc3BvbmQgdG8gYSBjYWxsYmFjayB0byBjcmVhdGUgYSBjb25maWcgcmVjb3JkIGZvciBhIHNwZWNpZmljIGRpcmVjdG9yeS4KLSAqLwotc3RhdGljIHZvaWQgKmNyZWF0ZV9tY29uZmlnX2Zvcl9kaXJlY3RvcnkocG9vbCAqcCwgY2hhciAqZGlyKQotewotICAgIHJldHVybiBta2NvbmZpZyhwKTsKLX0KLQotLyoKLSAqIEhhbmRsZXIgZm9yIHRoZSBDaGVja1NwZWxsaW5nIGRpcmVjdGl2ZSwgd2hpY2ggaXMgRkxBRy4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9zcGVsaW5nKGNtZF9wYXJtcyAqY21kLCB2b2lkICptY29uZmlnLCBpbnQgYXJnKQotewotICAgIHNwY29uZmlnICpjZmcgPSAoc3Bjb25maWcgKikgbWNvbmZpZzsKLQotICAgIGNmZy0+ZW5hYmxlZCA9IGFyZzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIERlZmluZSB0aGUgZGlyZWN0aXZlcyBzcGVjaWZpYyB0byB0aGlzIG1vZHVsZS4gIFRoaXMgc3RydWN0dXJlIGlzIHJlZmVyZW5jZWQKLSAqIGxhdGVyIGJ5IHRoZSAnbW9kdWxlJyBzdHJ1Y3R1cmUuCi0gKi8KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBzcGVsaW5nX2NtZHNbXSA9Ci17Ci0gICAgeyAiQ2hlY2tTcGVsbGluZyIsIHNldF9zcGVsaW5nLCBOVUxMLCBPUl9PUFRJT05TLCBGTEFHLAotICAgICAgIndoZXRoZXIgb3Igbm90IHRvIGZpeCBtaXNjYXBpdGFsaXplZC9taXNzcGVsbGVkIHJlcXVlc3RzIiB9LAotICAgIHsgTlVMTCB9Ci19OwotCi10eXBlZGVmIGVudW0gewotICAgIFNQX0lERU5USUNBTCA9IDAsCi0gICAgU1BfTUlTQ0FQSVRBTElaRUQgPSAxLAotICAgIFNQX1RSQU5TUE9TSVRJT04gPSAyLAotICAgIFNQX01JU1NJTkdDSEFSID0gMywKLSAgICBTUF9FWFRSQUNIQVIgPSA0LAotICAgIFNQX1NJTVBMRVRZUE8gPSA1LAotICAgIFNQX1ZFUllESUZGRVJFTlQgPSA2Ci19IHNwX3JlYXNvbjsKLQotc3RhdGljIGNvbnN0IGNoYXIgKnNwX3JlYXNvbl9zdHJbXSA9Ci17Ci0gICAgImlkZW50aWNhbCIsCi0gICAgIm1pc2NhcGl0YWxpemVkIiwKLSAgICAidHJhbnNwb3NlZCBjaGFyYWN0ZXJzIiwKLSAgICAiY2hhcmFjdGVyIG1pc3NpbmciLAotICAgICJleHRyYSBjaGFyYWN0ZXIiLAotICAgICJtaXN0eXBlZCBjaGFyYWN0ZXIiLAotICAgICJjb21tb24gYmFzZW5hbWUiLAotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgc3BfcmVhc29uIHF1YWxpdHk7Ci19IG1pc3NwZWxsZWRfZmlsZTsKLQotLyoKLSAqIHNwZGlzdCgpIGlzIHRha2VuIGZyb20gS2VybmlnaGFuICYgUGlrZSwKLSAqICBfVGhlX1VOSVhfUHJvZ3JhbW1pbmdfRW52aXJvbm1lbnRfCi0gKiBhbmQgYWRhcHRlZCBzb21ld2hhdCB0byBjb3JyZXNwb25kIGJldHRlciB0byBwc3ljaG9sb2dpY2FsIHJlYWxpdHkuCi0gKiAoTm90ZSB0aGUgY2hhbmdlcyB0byB0aGUgcmV0dXJuIHZhbHVlcykKLSAqCi0gKiBBY2NvcmRpbmcgdG8gUG9sbG9jayBhbmQgWmFtb3JhLCBDQUNNIEFwcmlsIDE5ODQgKFYuIDI3LCBOby4gNCksCi0gKiBwYWdlIDM2MywgdGhlIGNvcnJlY3Qgb3JkZXIgZm9yIHRoaXMgaXM6Ci0gKiBPTUlTU0lPTiA9IFRSQU5TUE9TSVRJT04gPiBJTlNFUlRJT04gPiBTVUJTVElUVVRJT04KLSAqIHRodXMsIGl0IHdhcyBleGFjdGx5IGJhY2t3YXJkcyBpbiB0aGUgb2xkIHZlcnNpb24uIC0tIFBXUAotICoKLSAqIFRoaXMgcm91dGluZSB3YXMgdGFrZW4gb3V0IG9mIHRjc2gncyBzcGVsbGluZyBjb3JyZWN0aW9uIGNvZGUKLSAqICh0Y3NoLTYuMDcuMDQpIGFuZCByZS1jb252ZXJ0ZWQgdG8gYXBhY2hlIGRhdGEgdHlwZXMgKCJjaGFyIiB0eXBlCi0gKiBpbnN0ZWFkIG9mIHRjc2gncyBOTFMnZWQgIkNoYXIiKS4gUGx1cyBpdCBub3cgaWdub3JlcyB0aGUgY2FzZQotICogZHVyaW5nIGNvbXBhcmlzb25zLCBzbyBpcyBhICJhcHByb3hpbWF0ZSBzdHJjYXNlY21wKCkiLgotICogTk9URSB0aGF0IGlzIHN0aWxsIGFsbG93cyBvbmx5IF9vbmVfIHJlYWwgInR5cG8iLAotICogaXQgZG9lcyBOT1QgdHJ5IHRvIGNvcnJlY3QgbXVsdGlwbGUgZXJyb3JzLgotICovCi0KLXN0YXRpYyBzcF9yZWFzb24gc3BkaXN0KGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnQpCi17Ci0gICAgZm9yICg7IGFwX3RvbG93ZXIoKnMpID09IGFwX3RvbG93ZXIoKnQpOyB0KyssIHMrKykgewotICAgICAgICBpZiAoKnQgPT0gJ1wwJykgewotICAgICAgICAgICAgcmV0dXJuIFNQX01JU0NBUElUQUxJWkVEOyAgIC8qIGV4YWN0IG1hdGNoIChzYW5zIGNhc2UpICovCi0JfQotICAgIH0KLSAgICBpZiAoKnMpIHsKLSAgICAgICAgaWYgKCp0KSB7Ci0gICAgICAgICAgICBpZiAoc1sxXSAmJiB0WzFdICYmIGFwX3RvbG93ZXIoKnMpID09IGFwX3RvbG93ZXIodFsxXSkKLQkJJiYgYXBfdG9sb3dlcigqdCkgPT0gYXBfdG9sb3dlcihzWzFdKQotCQkmJiBzdHJjYXNlY21wKHMgKyAyLCB0ICsgMikgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTUF9UUkFOU1BPU0lUSU9OOyAgICAgICAgLyogdHJhbnNwb3NpdGlvbiAqLwotCSAgICB9Ci0gICAgICAgICAgICBpZiAoc3RyY2FzZWNtcChzICsgMSwgdCArIDEpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU1BfU0lNUExFVFlQTzsgICAvKiAxIGNoYXIgbWlzbWF0Y2ggKi8KLQkgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzdHJjYXNlY21wKHMgKyAxLCB0KSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gU1BfRVhUUkFDSEFSOyAgICAgICAgLyogZXh0cmEgY2hhcmFjdGVyICovCi0JfQotICAgIH0KLSAgICBpZiAoKnQgJiYgc3RyY2FzZWNtcChzLCB0ICsgMSkgPT0gMCkgewotICAgICAgICByZXR1cm4gU1BfTUlTU0lOR0NIQVI7ICAvKiBtaXNzaW5nIGNoYXJhY3RlciAqLwotICAgIH0KLSAgICByZXR1cm4gU1BfVkVSWURJRkZFUkVOVDsgICAgLyogZGlzdGFuY2UgdG9vIGxhcmdlIHRvIGZpeC4gKi8KLX0KLQotc3RhdGljIGludCBzb3J0X2J5X3F1YWxpdHkoY29uc3Qgdm9pZCAqbGVmdCwgY29uc3Qgdm9pZCAqcml0ZSkKLXsKLSAgICByZXR1cm4gKGludCkgKCgobWlzc3BlbGxlZF9maWxlICopIGxlZnQpLT5xdWFsaXR5KQotICAgICAgICAtIChpbnQpICgoKG1pc3NwZWxsZWRfZmlsZSAqKSByaXRlKS0+cXVhbGl0eSk7Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2tfc3BlbGluZyhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBzcGNvbmZpZyAqY2ZnOwotICAgIGNoYXIgKmdvb2QsICpiYWQsICpwb3N0Z29vZCwgKnVybDsKLSAgICBpbnQgZmlsb2MsIGRvdGxvYywgdXJsZW4sIHBnbGVuOwotICAgIERJUiAqZGlycDsKLSAgICBzdHJ1Y3QgRElSX1RZUEUgKmRpcl9lbnRyeTsKLSAgICBhcnJheV9oZWFkZXIgKmNhbmRpZGF0ZXMgPSBOVUxMOwotCi0gICAgY2ZnID0gYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsICZzcGVsaW5nX21vZHVsZSk7Ci0gICAgaWYgKCFjZmctPmVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIC8qIFdlIG9ubHkgd2FudCB0byB3b3JyeSBhYm91dCBHRVRzICovCi0gICAgaWYgKHItPm1ldGhvZF9udW1iZXIgIT0gTV9HRVQpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIC8qIFdlJ3ZlIGFscmVhZHkgZ290IGEgZmlsZSBvZiBzb21lIGtpbmQgb3IgYW5vdGhlciAqLwotICAgIGlmIChyLT5wcm94eXJlcSB8fCAoci0+ZmluZm8uc3RfbW9kZSAhPSAwKSkgewotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgfQotCi0gICAgLyogVGhpcyBpcyBhIHN1YiByZXF1ZXN0IC0gZG9uJ3QgbWVzcyB3aXRoIGl0ICovCi0gICAgaWYgKHItPm1haW4pIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVGhlIHJlcXVlc3Qgc2hvdWxkIGVuZCB1cCBsb29raW5nIGxpa2UgdGhpczoKLSAgICAgKiByLT51cmk6IC9jb3JyZWN0LXVybC9taXNwZWxsaW5nL21vcmUKLSAgICAgKiByLT5maWxlbmFtZTogL2NvcnJlY3QtZmlsZS9taXNwZWxsaW5nIHItPnBhdGhfaW5mbzogL21vcmUKLSAgICAgKgotICAgICAqIFNvIHdlIGRvIHRoaXMgaW4gc3RlcHMuIEZpcnN0IGJyZWFrIHItPmZpbGVuYW1lIGludG8gdHdvIHBpZWNlcwotICAgICAqLwotCi0gICAgZmlsb2MgPSBhcF9yaW5kKHItPmZpbGVuYW1lLCAnLycpOwotICAgIC8qCi0gICAgICogRG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlIHJlcXVlc3QgZG9lc24ndCBjb250YWluIGEgc2xhc2gsIG9yCi0gICAgICogcmVxdWVzdHMgIi8iIAotICAgICAqLwotICAgIGlmIChmaWxvYyA9PSAtMSB8fCBzdHJjbXAoci0+dXJpLCAiLyIpID09IDApIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIC8qIGdvb2QgPSAvY29ycmVjdC1maWxlICovCi0gICAgZ29vZCA9IGFwX3BzdHJuZHVwKHItPnBvb2wsIHItPmZpbGVuYW1lLCBmaWxvYyk7Ci0gICAgLyogYmFkID0gbWlzcGVsbGluZyAqLwotICAgIGJhZCA9IGFwX3BzdHJkdXAoci0+cG9vbCwgci0+ZmlsZW5hbWUgKyBmaWxvYyArIDEpOwotICAgIC8qIHBvc3Rnb29kID0gbWlzcGVsbGluZy9tb3JlICovCi0gICAgcG9zdGdvb2QgPSBhcF9wc3RyY2F0KHItPnBvb2wsIGJhZCwgci0+cGF0aF9pbmZvLCBOVUxMKTsKLQotICAgIHVybGVuID0gc3RybGVuKHItPnVyaSk7Ci0gICAgcGdsZW4gPSBzdHJsZW4ocG9zdGdvb2QpOwotCi0gICAgLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBVUkwgcGllY2VzIGFkZCB1cCAqLwotICAgIGlmIChzdHJjbXAocG9zdGdvb2QsIHItPnVyaSArICh1cmxlbiAtIHBnbGVuKSkpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIC8qIHVybCA9IC9jb3JyZWN0LXVybCAqLwotICAgIHVybCA9IGFwX3BzdHJuZHVwKHItPnBvb2wsIHItPnVyaSwgKHVybGVuIC0gcGdsZW4pKTsKLQotICAgIC8qIE5vdyBvcGVuIHRoZSBkaXJlY3RvcnkgYW5kIGRvIG91cnNlbHZlcyBhIGNoZWNrLi4uICovCi0gICAgZGlycCA9IGFwX3BvcGVuZGlyKHItPnBvb2wsIGdvb2QpOwotICAgIGlmIChkaXJwID09IE5VTEwpIHsgICAgICAgICAgLyogT29wcywgbm90IGEgZGlyZWN0b3J5Li4uICovCi0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICBjYW5kaWRhdGVzID0gYXBfbWFrZV9hcnJheShyLT5wb29sLCAyLCBzaXplb2YobWlzc3BlbGxlZF9maWxlKSk7Ci0KLSAgICBkb3Rsb2MgPSBhcF9pbmQoYmFkLCAnLicpOwotICAgIGlmIChkb3Rsb2MgPT0gLTEpIHsKLSAgICAgICAgZG90bG9jID0gc3RybGVuKGJhZCk7Ci0gICAgfQotCi0gICAgd2hpbGUgKChkaXJfZW50cnkgPSByZWFkZGlyKGRpcnApKSAhPSBOVUxMKSB7Ci0gICAgICAgIHNwX3JlYXNvbiBxOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIElmIHdlIGVuZCB1cCB3aXRoIGEgImZpeGVkIiBVUkwgd2hpY2ggaXMgaWRlbnRpY2FsIHRvIHRoZQotICAgICAgICAgKiByZXF1ZXN0ZWQgb25lLCB3ZSBtdXN0IGhhdmUgZm91bmQgYSBicm9rZW4gc3ltbGluayBvciBzb21lIHN1Y2guCi0gICAgICAgICAqIERvIF9ub3RfIHRyeSB0byByZWRpcmVjdCB0aGlzLCBpdCBjYXVzZXMgYSBsb29wIQotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHN0cmNtcChiYWQsIGRpcl9lbnRyeS0+ZF9uYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICBhcF9wY2xvc2VkaXIoci0+cG9vbCwgZGlycCk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgLyoKLSAgICAgICAgICogbWlzY2FwaXRhbGl6YXRpb24gZXJyb3JzIGFyZSBjaGVja2VkIGZpcnN0IChsaWtlLCBlLmcuLCBsb3dlciBjYXNlCi0gICAgICAgICAqIGZpbGUsIHVwcGVyIGNhc2UgcmVxdWVzdCkKLSAgICAgICAgICovCi0gICAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAoYmFkLCBkaXJfZW50cnktPmRfbmFtZSkgPT0gMCkgewotICAgICAgICAgICAgbWlzc3BlbGxlZF9maWxlICpzcF9uZXc7Ci0KLQkgICAgc3BfbmV3ID0gKG1pc3NwZWxsZWRfZmlsZSAqKSBhcF9wdXNoX2FycmF5KGNhbmRpZGF0ZXMpOwotICAgICAgICAgICAgc3BfbmV3LT5uYW1lID0gYXBfcHN0cmR1cChyLT5wb29sLCBkaXJfZW50cnktPmRfbmFtZSk7Ci0gICAgICAgICAgICBzcF9uZXctPnF1YWxpdHkgPSBTUF9NSVNDQVBJVEFMSVpFRDsKLSAgICAgICAgfQotICAgICAgICAvKgotICAgICAgICAgKiBzaW1wbGUgdHlwaW5nIGVycm9ycyBhcmUgY2hlY2tlZCBuZXh0IChsaWtlLCBlLmcuLAotICAgICAgICAgKiBtaXNzaW5nL2V4dHJhL3RyYW5zcG9zZWQgY2hhcikKLSAgICAgICAgICovCi0gICAgICAgIGVsc2UgaWYgKChxID0gc3BkaXN0KGJhZCwgZGlyX2VudHJ5LT5kX25hbWUpKSAhPSBTUF9WRVJZRElGRkVSRU5UKSB7Ci0gICAgICAgICAgICBtaXNzcGVsbGVkX2ZpbGUgKnNwX25ldzsKLQotCSAgICBzcF9uZXcgPSAobWlzc3BlbGxlZF9maWxlICopIGFwX3B1c2hfYXJyYXkoY2FuZGlkYXRlcyk7Ci0gICAgICAgICAgICBzcF9uZXctPm5hbWUgPSBhcF9wc3RyZHVwKHItPnBvb2wsIGRpcl9lbnRyeS0+ZF9uYW1lKTsKLSAgICAgICAgICAgIHNwX25ldy0+cXVhbGl0eSA9IHE7Ci0gICAgICAgIH0KLSAgICAgICAgLyoKLQkgKiBUaGUgc3BkaXN0KCkgc2hvdWxkIGhhdmUgZm91bmQgdGhlIG1ham9yaXR5IG9mIHRoZSBtaXNzcGVsbGVkCi0JICogcmVxdWVzdHMuICBJdCBpcyBvZiBxdWVzdGlvbmFibGUgdXNlIHRvIGNvbnRpbnVlIGxvb2tpbmcgZm9yCi0JICogZmlsZXMgd2l0aCB0aGUgc2FtZSBiYXNlIG5hbWUsIGJ1dCBwb3RlbnRpYWxseSBvZiB0b3RhbGx5IHdyb25nCi0JICogdHlwZSAoaW5kZXguaHRtbCA8LT4gaW5kZXguZGIpLgotCSAqIEkgd291bGQgcHJvcG9zZSB0byBub3Qgc2V0IHRoZSBXQU5UX0JBU0VOQU1FX01BVENIIGRlZmluZS4KLSAgICAgICAgICogICAgICAwOC1BdWctMTk5NyA8TWFydGluLktyYWVtZXJATWNoLlNOSS5EZT4KLSAgICAgICAgICoKLSAgICAgICAgICogSG93ZXZlciwgQWxleGVpIHJlcGxpZWQgZ2l2aW5nIHNvbWUgcmVhc29ucyB0byBhZGQgaXQgYW55d2F5OgotICAgICAgICAgKiA+IE9oLCBieSB0aGUgd2F5LCBJIHJlbWVtYmVyZWQgd2h5IGhhdmluZyB0aGUKLSAgICAgICAgICogPiBleHRlbnNpb24tc3RyaXBwaW5nLWFuZC1tYXRjaGluZyBzdHVmZiBpcyBhIGdvb2QgaWRlYToKLSAgICAgICAgICogPgotICAgICAgICAgKiA+IElmIHlvdSdyZSB1c2luZyBNdWx0aVZpZXdzLCBhbmQgaGF2ZSBhIGZpbGUgbmFtZWQgZm9vYmFyLmh0bWwsCi0JICogPiB3aGljaCB5b3UgcmVmZXIgdG8gYXMgImZvb2JhciIsIGFuZCBzb21lb25lIHRyaWVkIHRvIGFjY2VzcwotCSAqID4gIkZvb2JhciIsIG1vZF9zcGVsaW5nIHdvbid0IGZpbmQgaXQsIGJlY2F1c2UgaXQgd29uJ3QgZmluZAotCSAqID4gYW55dGhpbmcgbWF0Y2hpbmcgdGhhdCBzcGVsbGluZy4gV2l0aCB0aGUgZXh0ZW5zaW9uLW11bmdpbmcsCi0JICogPiBpdCB3b3VsZCBsb2NhdGUgImZvb2Jhci5odG1sIi4gTm90IHBlcmZlY3QsIGJ1dCBJIHJhbiBpbnRvCi0JICogPiB0aGF0IHByb2JsZW0gd2hlbiBJIGZpcnN0IHdyb3RlIHRoZSBtb2R1bGUuCi0JICovCi0gICAgICAgIGVsc2UgewotI2lmZGVmIFdBTlRfQkFTRU5BTUVfTUFUQ0gKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBPa2F5Li4uIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLiBOb3cgd2UgdGFrZSBvdXQgdGhlIGhhcmQtY29yZQotICAgICAgICAgICAgICogcG93ZXIgdG9vbHMuIFRoZXJlIGFyZSBzZXZlcmFsIGNhc2VzIGhlcmUuIFNvbWVvbmUgbWlnaHQgaGF2ZQotICAgICAgICAgICAgICogZW50ZXJlZCBhIHdyb25nIGV4dGVuc2lvbiAoLmh0bSBpbnN0ZWFkIG9mIC5odG1sIG9yIHZpY2UKLSAgICAgICAgICAgICAqIHZlcnNhKSBvciB0aGUgZG9jdW1lbnQgY291bGQgYmUgbmVnb3RpYXRlZC4gQXQgYW55IHJhdGUsIG5vdwotICAgICAgICAgICAgICogd2UganVzdCBjb21wYXJlIHN0dWZmIGJlZm9yZSB0aGUgZmlyc3QgZG90LiBJZiBpdCBtYXRjaGVzLCB3ZQotICAgICAgICAgICAgICogZmlndXJlIHdlIGdvdCB1cyBhIG1hdGNoLiBUaGlzIGNhbiByZXN1bHQgaW4gd3JvbmcgdGhpbmdzIGlmCi0gICAgICAgICAgICAgKiB0aGVyZSBhcmUgZmlsZXMgb2YgZGlmZmVyZW50IGNvbnRlbnQgdHlwZXMgYnV0IHRoZSBzYW1lIHByZWZpeAotICAgICAgICAgICAgICogKGUuZy4gZm9vLmdpZiBhbmQgZm9vLmh0bWwpIFRoaXMgY29kZSB3aWxsIHBpY2sgdGhlIGZpcnN0IG9uZQotICAgICAgICAgICAgICogaXQgZmluZHMuIEJldHRlciB0aGFuIGEgTm90IEZvdW5kLCB0aG91Z2guCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGludCBlbnRsb2MgPSBhcF9pbmQoZGlyX2VudHJ5LT5kX25hbWUsICcuJyk7Ci0gICAgICAgICAgICBpZiAoZW50bG9jID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgZW50bG9jID0gc3RybGVuKGRpcl9lbnRyeS0+ZF9uYW1lKTsKLQkgICAgfQotCi0gICAgICAgICAgICBpZiAoKGRvdGxvYyA9PSBlbnRsb2MpCi0gICAgICAgICAgICAgICAgJiYgIXN0cm5jYXNlY21wKGJhZCwgZGlyX2VudHJ5LT5kX25hbWUsIGRvdGxvYykpIHsKLSAgICAgICAgICAgICAgICBtaXNzcGVsbGVkX2ZpbGUgKnNwX25ldzsKLQotCQlzcF9uZXcgPSAobWlzc3BlbGxlZF9maWxlICopIGFwX3B1c2hfYXJyYXkoY2FuZGlkYXRlcyk7Ci0gICAgICAgICAgICAgICAgc3BfbmV3LT5uYW1lID0gYXBfcHN0cmR1cChyLT5wb29sLCBkaXJfZW50cnktPmRfbmFtZSk7Ci0gICAgICAgICAgICAgICAgc3BfbmV3LT5xdWFsaXR5ID0gU1BfVkVSWURJRkZFUkVOVDsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICB9Ci0gICAgfQotICAgIGFwX3BjbG9zZWRpcihyLT5wb29sLCBkaXJwKTsKLQotICAgIGlmIChjYW5kaWRhdGVzLT5uZWx0cyAhPSAwKSB7Ci0gICAgICAgIC8qIFdvdy4uLiB3ZSBmb3VuZCB1cyBhIG1pc3BlbGxpbmcuIENvbnN0cnVjdCBhIGZpeGVkIHVybCAqLwotICAgICAgICBjaGFyICpudXJpOwotCWNvbnN0IGNoYXIgKnJlZjsKLSAgICAgICAgbWlzc3BlbGxlZF9maWxlICp2YXJpYW50ID0gKG1pc3NwZWxsZWRfZmlsZSAqKSBjYW5kaWRhdGVzLT5lbHRzOwotICAgICAgICBpbnQgaTsKLQotICAgICAgICByZWYgPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIlJlZmVyZXIiKTsKLQotICAgICAgICBxc29ydCgodm9pZCAqKSBjYW5kaWRhdGVzLT5lbHRzLCBjYW5kaWRhdGVzLT5uZWx0cywKLSAgICAgICAgICAgICAgc2l6ZW9mKG1pc3NwZWxsZWRfZmlsZSksIHNvcnRfYnlfcXVhbGl0eSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ29uZGl0aW9ucyBmb3IgaW1tZWRpYXRlIHJlZGlyZWN0aW9uOiAKLSAgICAgICAgICogICAgIGEpIHRoZSBmaXJzdCBjYW5kaWRhdGUgd2FzIG5vdCBmb3VuZCBieSBzdHJpcHBpbmcgdGhlIHN1ZmZpeCAKLSAgICAgICAgICogQU5EIGIpIHRoZXJlIGV4aXN0cyBvbmx5IG9uZSBjYW5kaWRhdGUgT1IgdGhlIGJlc3QgbWF0Y2ggaXMgbm90Ci0JICogICAgICAgIGFtYmlndW91cwotICAgICAgICAgKiB0aGVuIHJldHVybiBhIHJlZGlyZWN0aW9uIHJpZ2h0IGF3YXkuCi0gICAgICAgICAqLwotICAgICAgICBpZiAodmFyaWFudFswXS5xdWFsaXR5ICE9IFNQX1ZFUllESUZGRVJFTlQKLQkgICAgJiYgKGNhbmRpZGF0ZXMtPm5lbHRzID09IDEKLQkJfHwgdmFyaWFudFswXS5xdWFsaXR5ICE9IHZhcmlhbnRbMV0ucXVhbGl0eSkpIHsKLQotICAgICAgICAgICAgbnVyaSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgdXJsLCB2YXJpYW50WzBdLm5hbWUsIHItPnBhdGhfaW5mbywKLQkJCSAgICAgIHItPnBhcnNlZF91cmkucXVlcnkgPyAiPyIgOiAiIiwKLQkJCSAgICAgIHItPnBhcnNlZF91cmkucXVlcnkgPyByLT5wYXJzZWRfdXJpLnF1ZXJ5IDogIiIsCi0JCQkgICAgICBOVUxMKTsKLQotICAgICAgICAgICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkxvY2F0aW9uIiwKLQkJCSAgYXBfY29uc3RydWN0X3VybChyLT5wb29sLCBudXJpLCByKSk7Ci0KLSAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0lORk8sIHIsCi0JCQkgcmVmID8gIkZpeGVkIHNwZWxsaW5nOiAlcyB0byAlcyBmcm9tICVzIgotCQkJICAgICA6ICJGaXhlZCBzcGVsbGluZzogJXMgdG8gJXMiLAotCQkJIHItPnVyaSwgbnVyaSwgcmVmKTsKLQotICAgICAgICAgICAgcmV0dXJuIEhUVFBfTU9WRURfUEVSTUFORU5UTFk7Ci0gICAgICAgIH0KLSAgICAgICAgLyoKLSAgICAgICAgICogT3RoZXJ3aXNlLCBhICJbMzAwXSBNdWx0aXBsZSBDaG9pY2VzIiBsaXN0IHdpdGggdGhlIHZhcmlhbnRzIGlzCi0gICAgICAgICAqIHJldHVybmVkLgotICAgICAgICAgKi8KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwb29sICpwOwotICAgICAgICAgICAgdGFibGUgKm5vdGVzOwotCSAgICBwb29sICpzdWJfcG9vbDsKLQkgICAgYXJyYXlfaGVhZGVyICp0OwotCSAgICBhcnJheV9oZWFkZXIgKnY7Ci0KLQotICAgICAgICAgICAgaWYgKHItPm1haW4gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHAgPSByLT5wb29sOwotICAgICAgICAgICAgICAgIG5vdGVzID0gci0+bm90ZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBwID0gci0+bWFpbi0+cG9vbDsKLSAgICAgICAgICAgICAgICBub3RlcyA9IHItPm1haW4tPm5vdGVzOwotICAgICAgICAgICAgfQotCi0JICAgIHN1Yl9wb29sID0gYXBfbWFrZV9zdWJfcG9vbChwKTsKLQkgICAgdCA9IGFwX21ha2VfYXJyYXkoc3ViX3Bvb2wsIGNhbmRpZGF0ZXMtPm5lbHRzICogOCArIDgsCi0JCQkgICAgICBzaXplb2YoY2hhciAqKSk7Ci0JICAgIHYgPSBhcF9tYWtlX2FycmF5KHN1Yl9wb29sLCBjYW5kaWRhdGVzLT5uZWx0cyAqIDUsCi0JCQkgICAgICBzaXplb2YoY2hhciAqKSk7Ci0KLSAgICAgICAgICAgIC8qIEdlbmVyYXRlIHRoZSByZXNwb25zZSB0ZXh0LiAqLwotCi0JICAgICooY29uc3QgY2hhciAqKilhcF9wdXNoX2FycmF5KHQpID0KLQkJCSAgIlRoZSBkb2N1bWVudCBuYW1lIHlvdSByZXF1ZXN0ZWQgKDxjb2RlPiI7Ci0JICAgICooY29uc3QgY2hhciAqKilhcF9wdXNoX2FycmF5KHQpID0gci0+dXJpOwotCSAgICAqKGNvbnN0IGNoYXIgKiopYXBfcHVzaF9hcnJheSh0KSA9Ci0JCQkgICAiPC9jb2RlPikgY291bGQgbm90IGJlIGZvdW5kIG9uIHRoaXMgc2VydmVyLlxuIgotCQkJICAgIkhvd2V2ZXIsIHdlIGZvdW5kIGRvY3VtZW50cyB3aXRoIG5hbWVzIHNpbWlsYXIgIgotCQkJICAgInRvIHRoZSBvbmUgeW91IHJlcXVlc3RlZC48cD4iCi0JCQkgICAiQXZhaWxhYmxlIGRvY3VtZW50czpcbjx1bD5cbiI7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjYW5kaWRhdGVzLT5uZWx0czsgKytpKSB7Ci0JCWNoYXIgKnZ1cmk7Ci0JCWNvbnN0IGNoYXIgKnJlYXNvbjsKLQotCQlyZWFzb24gPSBzcF9yZWFzb25fc3RyWyhpbnQpICh2YXJpYW50W2ldLnF1YWxpdHkpXTsKLSAgICAgICAgICAgICAgICAvKiBUaGUgZm9ybWF0IGlzbid0IHZlcnkgbmVhdC4uLiAqLwotCQl2dXJpID0gYXBfcHN0cmNhdChzdWJfcG9vbCwgdXJsLCB2YXJpYW50W2ldLm5hbWUsIHItPnBhdGhfaW5mbywKLQkJCQkgIChyLT5wYXJzZWRfdXJpLnF1ZXJ5ICE9IE5VTEwpID8gIj8iIDogIiIsCi0JCQkJICAoci0+cGFyc2VkX3VyaS5xdWVyeSAhPSBOVUxMKQotCQkJCSAgICAgID8gci0+cGFyc2VkX3VyaS5xdWVyeSA6ICIiLAotCQkJCSAgTlVMTCk7Ci0JCSooY29uc3QgY2hhciAqKilhcF9wdXNoX2FycmF5KHYpID0gIlwiIjsKLQkJKihjb25zdCBjaGFyICoqKWFwX3B1c2hfYXJyYXkodikgPSB2dXJpOwotCQkqKGNvbnN0IGNoYXIgKiopYXBfcHVzaF9hcnJheSh2KSA9ICJcIjtcIiI7Ci0JCSooY29uc3QgY2hhciAqKilhcF9wdXNoX2FycmF5KHYpID0gcmVhc29uOwotCQkqKGNvbnN0IGNoYXIgKiopYXBfcHVzaF9hcnJheSh2KSA9ICJcIiI7Ci0KLQkJKihjb25zdCBjaGFyICoqKWFwX3B1c2hfYXJyYXkodCkgPSAiPGxpPjxhIGhyZWY9XCIiOwotCQkqKGNvbnN0IGNoYXIgKiopYXBfcHVzaF9hcnJheSh0KSA9IHZ1cmk7Ci0JCSooY29uc3QgY2hhciAqKilhcF9wdXNoX2FycmF5KHQpID0gIlwiPiI7Ci0JCSooY29uc3QgY2hhciAqKilhcF9wdXNoX2FycmF5KHQpID0gdnVyaTsKLQkJKihjb25zdCBjaGFyICoqKWFwX3B1c2hfYXJyYXkodCkgPSAiPC9hPiAoIjsKLQkJKihjb25zdCBjaGFyICoqKWFwX3B1c2hfYXJyYXkodCkgPSByZWFzb247Ci0JCSooY29uc3QgY2hhciAqKilhcF9wdXNoX2FycmF5KHQpID0gIilcbiI7Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIHdoZW4gd2UgaGF2ZSBwcmludGVkIHRoZSAiY2xvc2UgbWF0Y2hlcyIgYW5kIHRoZXJlIGFyZQotICAgICAgICAgICAgICAgICAqIG1vcmUgImRpc3RhbnQgbWF0Y2hlcyIgKG1hdGNoZWQgYnkgc3RyaXBwaW5nIHRoZSBzdWZmaXgpLAotICAgICAgICAgICAgICAgICAqIHRoZW4gd2UgaW5zZXJ0IGFuIGFkZGl0aW9uYWwgc2VwYXJhdG9yIHRleHQgdG8gc3VnZ2VzdAotICAgICAgICAgICAgICAgICAqIHRoYXQgdGhlIHVzZXIgTE9PSyBDTE9TRUxZIHdoZXRoZXIgdGhlc2UgYXJlIHJlYWxseSB0aGUKLSAgICAgICAgICAgICAgICAgKiBmaWxlcyBzaGUgd2FudGVkLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChpID4gMCAmJiBpIDwgY2FuZGlkYXRlcy0+bmVsdHMgLSAxCi0gICAgICAgICAgICAgICAgICAgICYmIHZhcmlhbnRbaV0ucXVhbGl0eSAhPSBTUF9WRVJZRElGRkVSRU5UCi0gICAgICAgICAgICAgICAgICAgICYmIHZhcmlhbnRbaSArIDFdLnF1YWxpdHkgPT0gU1BfVkVSWURJRkZFUkVOVCkgewotCQkgICAgKihjb25zdCBjaGFyICoqKWFwX3B1c2hfYXJyYXkodCkgPSAKLQkJCQkgICAiPC91bD5cbkZ1cnRoZXJtb3JlLCB0aGUgZm9sbG93aW5nIHJlbGF0ZWQgIgotCQkJCSAgICJkb2N1bWVudHMgd2VyZSBmb3VuZDpcbjx1bD5cbiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCSAgICAqKGNvbnN0IGNoYXIgKiopYXBfcHVzaF9hcnJheSh0KSA9ICI8L3VsPlxuIjsKLQotICAgICAgICAgICAgLyogSWYgd2Uga25vdyB0aGVyZSB3YXMgYSByZWZlcnJpbmcgcGFnZSwgYWRkIGEgbm90ZTogKi8KLSAgICAgICAgICAgIGlmIChyZWYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICooY29uc3QgY2hhciAqKilhcF9wdXNoX2FycmF5KHQpID0KLQkJCSAgICAgICAiUGxlYXNlIGNvbnNpZGVyIGluZm9ybWluZyB0aGUgb3duZXIgb2YgdGhlICIKLQkJCSAgICAgICAiPGEgaHJlZj1cIiI7Ci0gICAgICAgICAgICAgICAgKihjb25zdCBjaGFyICoqKWFwX3B1c2hfYXJyYXkodCkgPSByZWY7Ci0gICAgICAgICAgICAgICAgKihjb25zdCBjaGFyICoqKWFwX3B1c2hfYXJyYXkodCkgPSAiXCI+cmVmZXJyaW5nIHBhZ2U8L2E+ICIKLQkJCSAgICAgICAiYWJvdXQgdGhlIGJyb2tlbiBsaW5rLlxuIjsKLQkgICAgfQotCi0KLSAgICAgICAgICAgIC8qIFBhc3Mgb3VyIHRhYmxlIHRvIGh0dHBfcHJvdG9jb2wuYyAoc2VlIG1vZF9uZWdvdGlhdGlvbik6ICovCi0gICAgICAgICAgICBhcF90YWJsZV9zZXRuKG5vdGVzLCAidmFyaWFudC1saXN0IiwgYXBfYXJyYXlfcHN0cmNhdChwLCB0LCAwKSk7Ci0KLQkgICAgYXBfdGFibGVfbWVyZ2VuKHItPnN1YnByb2Nlc3NfZW52LCAiVkFSSUFOVFMiLAotCQkJICAgIGFwX2FycmF5X3BzdHJjYXQocCwgdiwgJywnKSk7Ci0JICAKLQkgICAgYXBfZGVzdHJveV9wb29sKHN1Yl9wb29sKTsKLQotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfSU5GTywgciwKLQkJCSByZWYgPyAiU3BlbGxpbmcgZml4OiAlczogJWQgY2FuZGlkYXRlcyBmcm9tICVzIgotCQkJICAgICA6ICJTcGVsbGluZyBmaXg6ICVzOiAlZCBjYW5kaWRhdGVzIiwKLQkJCSByLT51cmksIGNhbmRpZGF0ZXMtPm5lbHRzLCByZWYpOwotCi0gICAgICAgICAgICByZXR1cm4gSFRUUF9NVUxUSVBMRV9DSE9JQ0VTOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgc3BlbGluZ19tb2R1bGUgPQotewotICAgIFNUQU5EQVJEX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZXIgKi8KLSAgICBjcmVhdGVfbWNvbmZpZ19mb3JfZGlyZWN0b3J5LCAgLyogY3JlYXRlIHBlci1kaXIgY29uZmlnICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIG1lcmdlIHBlci1kaXIgY29uZmlnICovCi0gICAgY3JlYXRlX21jb25maWdfZm9yX3NlcnZlciwgIC8qIHNlcnZlciBjb25maWcgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLwotICAgIHNwZWxpbmdfY21kcywgICAgICAgICAgICAgICAvKiBjb21tYW5kIHRhYmxlICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGhhbmRsZXJzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGVuYW1lIHRyYW5zbGF0aW9uICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrX3VzZXJfaWQgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgYXV0aCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBhY2Nlc3MgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHlwZV9jaGVja2VyICovCi0gICAgY2hlY2tfc3BlbGluZywgICAgICAgICAgICAgIC8qIGZpeHVwcyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2dnZXIgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaGVhZGVyIHBhcnNlciAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGlsZF9pbml0ICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoaWxkX2V4aXQgKi8KLSAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdCByZWFkLXJlcXVlc3QgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL21hcHBlcnMvbW9kX3NwZWxpbmcuZHNwIGIvbW9kdWxlcy9tYXBwZXJzL21vZF9zcGVsaW5nLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk5YTcyZi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21hcHBlcnMvbW9kX3NwZWxpbmcuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iQXBhY2hlTW9kdWxlU3BlbGluZyIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNS4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyCi0KLUNGRz1BcGFjaGVNb2R1bGVTcGVsaW5nIC0gV2luMzIgUmVsZWFzZQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJBcGFjaGVNb2R1bGVTcGVsaW5nLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiQXBhY2hlTW9kdWxlU3BlbGluZy5tYWsiXAotIENGRz0iQXBhY2hlTW9kdWxlU3BlbGluZyAtIFdpbjMyIFJlbGVhc2UiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAiQXBhY2hlTW9kdWxlU3BlbGluZyAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvblwKLSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgIkFwYWNoZU1vZHVsZVNwZWxpbmcgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uXAotICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotTVRMPW1pZGwuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIkFwYWNoZU1vZHVsZVNwZWxpbmcgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiLlxSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIi5cQXBhY2hlTW9kdWxlU3BlbGluZ1IiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVNb2R1bGVTcGVsaW5nUiIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvR1ggL08yIC9JICIuLlwuLlxpbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIlNIQVJFRF9NT0RVTEUiIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIC4uXC4uXENvcmVSXEFwYWNoZUNvcmUubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYWNoaW5lOkkzODYKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFwYWNoZU1vZHVsZVNwZWxpbmcgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIi5cRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXERlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIi5cQXBhY2hlTW9kdWxlU3BlbGluZ0QiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVNb2R1bGVTcGVsaW5nRCIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9JICIuLlwuLlxpbmNsdWRlIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIlNIQVJFRF9NT0RVTEUiIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiAuLlwuLlxDb3JlRFxBcGFjaGVDb3JlLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NgotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAiQXBhY2hlTW9kdWxlU3BlbGluZyAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgIkFwYWNoZU1vZHVsZVNwZWxpbmcgLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2hwajtiYXQ7Zm9yO2Y5MCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXG1vZHVsZXNcc3RhbmRhcmRcbW9kX3NwZWxpbmcuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubDtmaTtmZCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5ccmVhZGRpci5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIlJlc291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtjbnQ7cnRmO2dpZjtqcGc7anBlZztqcGUiCi0jIEVuZCBHcm91cAotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9tb2R1bGVzL21hcHBlcnMvbW9kX3NwZWxpbmcuZXhwIGIvbW9kdWxlcy9tYXBwZXJzL21vZF9zcGVsaW5nLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZlZThiNS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21hcHBlcnMvbW9kX3NwZWxpbmcuZXhwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc3BlbGluZ19tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWFwcGVycy9tb2RfdXNlcmRpci5jIGIvbW9kdWxlcy9tYXBwZXJzL21vZF91c2VyZGlyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMGUyNmQuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tYXBwZXJzL21vZF91c2VyZGlyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBtb2RfdXNlcmRpci4uLiBpbXBsZW1lbnQgdGhlIFVzZXJEaXIgY29tbWFuZC4gIEJyb2tlbiBhd2F5IGZyb20gdGhlCi0gKiBBbGlhcyBzdHVmZiBmb3IgYSBjb3VwbGUgb2YgZ29vZCBhbmQgbm90LXNvLWdvb2QgcmVhc29uczoKLSAqCi0gKiAxKSBJdCBzaG93cyBhIHJlYWwgbWluaW1hbCB3b3JraW5nIGV4YW1wbGUgb2YgaG93IHRvIGRvIHNvbWV0aGluZyBsaWtlCi0gKiAgICB0aGlzLgotICogMikgSSBrbm93IHBlb3BsZSB3aG8gYXJlIGFjdHVhbGx5IGludGVyZXN0ZWQgaW4gY2hhbmdpbmcgdGhpcyAqcGFydGljdWxhcioKLSAqICAgIGFzcGVjdCBvZiBzZXJ2ZXIgZnVuY3Rpb25hbGl0eSB3aXRob3V0IGNoYW5naW5nIHRoZSByZXN0IG9mIGl0LiAgVGhhdCdzCi0gKiAgICB3aGF0IHRoaXMgd2hvbGUgbW9kdWxhciBhcnJhbmdlbWVudCBpcyBzdXBwb3NlZCB0byBiZSBnb29kIGF0Li4uCi0gKgotICogTW9kaWZpZWQgYnkgQWxleGVpIEtvc3V0IHRvIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RzCi0gKiAoc2VydmVyIHJ1bm5pbmcgYXQgd3d3LmZvby5jb20sIHJlcXVlc3QgZm9yIC9+YmFyL29uZS90d28uaHRtbCkKLSAqCi0gKiBVc2VyRGlyIHB1YmxpY19odG1sICAgICAgLT4gfmJhci9wdWJsaWNfaHRtbC9vbmUvdHdvLmh0bWwKLSAqIFVzZXJEaXIgL3Vzci93ZWIgICAgICAgICAtPiAvdXNyL3dlYi9iYXIvb25lL3R3by5odG1sCi0gKiBVc2VyRGlyIC9ob21lLyAqIC93d3cgICAgIC0+IC9ob21lL2Jhci93d3cvb25lL3R3by5odG1sCi0gKiAgTk9URTogdGhlc2VzIF4gXiBzcGFjZSBvbmx5IGFkZGVkIGFsbG93IGl0IHRvIHdvcmsgaW4gYSBjb21tZW50LCBpZ25vcmUKLSAqIFVzZXJEaXIgaHR0cDovL3gvdXNlcnMgICAtPiAoMzAyKSBodHRwOi8veC91c2Vycy9iYXIvb25lL3R3by5odG1sCi0gKiBVc2VyRGlyIGh0dHA6Ly94LyAqIC95ICAgICAtPiAoMzAyKSBodHRwOi8veC9iYXIveS9vbmUvdHdvLmh0bWwKLSAqICBOT1RFOiBoZXJlIGFsc28gXiBeCi0gKgotICogSW4gYWRkaXRpb24sIHlvdSBjYW4gdXNlIG11bHRpcGxlIGVudHJpZXMsIHRvIHNwZWNpZnkgYWx0ZXJuYXRlCi0gKiB1c2VyIGRpcmVjdG9yaWVzIChhIGxhIERpcmVjdG9yeSBJbmRleCkuIEZvciBleGFtcGxlOgotICoKLSAqIFVzZXJEaXIgcHVibGljX2h0bWwgL3Vzci93ZWIgaHR0cDovL3d3dy54eXouY29tL3VzZXJzCi0gKgotICogTW9kaWZpZWQgYnkgS2VuIENvYXIgdG8gcHJvdmlkZSBmb3IgdGhlIGZvbGxvd2luZzoKLSAqCi0gKiBVc2VyRGlyIGRpc2FibGVbZF0gdXNlcm5hbWUgLi4uCi0gKiBVc2VyRGlyIGVuYWJsZVtkXSB1c2VybmFtZSAuLi4KLSAqCi0gKiBJZiAiZGlzYWJsZWQiIGhhcyBubyBvdGhlciBhcmd1bWVudHMsICphbGwqIH48dXNlcm5hbWU+IHJlZmVyZW5jZXMgYXJlCi0gKiBkaXNhYmxlZCwgZXhjZXB0IHRob3NlIGV4cGxpY2l0bHkgdHVybmVkIG9uIHdpdGggdGhlICJlbmFibGVkIiBrZXl3b3JkLgotICovCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0KLW1vZHVsZSB1c2VyZGlyX21vZHVsZTsKLQotdHlwZWRlZiBzdHJ1Y3QgdXNlcmRpcl9jb25maWcgewotICAgIGludCBnbG9iYWxseV9kaXNhYmxlZDsKLSAgICBjaGFyICp1c2VyZGlyOwotICAgIHRhYmxlICplbmFibGVkX3VzZXJzOwotICAgIHRhYmxlICpkaXNhYmxlZF91c2VyczsKLX0gICAgICAgICAgICAgIHVzZXJkaXJfY29uZmlnOwotCi0vKgotICogU2VydmVyIGNvbmZpZyBmb3IgdGhpcyBtb2R1bGU6IGdsb2JhbCBkaXNhYmxlbWVudCBmbGFnLCBhIGxpc3Qgb2YgdXNlcm5hbWVzCi0gKiBpbmVsaWdpYmxlIGZvciBVc2VyRGlyIGFjY2VzcywgYSBsaXN0IG9mIHRob3NlIGltbXVuZSB0byBnbG9iYWwgKGJ1dCBub3QKLSAqIGV4cGxpY2l0KSBkaXNhYmxlbWVudCwgYW5kIHRoZSByZXBsYWNlbWVudCBzdHJpbmcgZm9yIGFsbCBvdGhlcnMuCi0gKi8KLQotc3RhdGljIHZvaWQgKmNyZWF0ZV91c2VyZGlyX2NvbmZpZyhwb29sICpwLCBzZXJ2ZXJfcmVjICpzKQotewotICAgIHVzZXJkaXJfY29uZmlnCi0gICAgKiBuZXdjZmcgPSAodXNlcmRpcl9jb25maWcgKikgYXBfcGNhbGxvYyhwLCBzaXplb2YodXNlcmRpcl9jb25maWcpKTsKLQotICAgIG5ld2NmZy0+Z2xvYmFsbHlfZGlzYWJsZWQgPSAwOwotICAgIG5ld2NmZy0+dXNlcmRpciA9IERFRkFVTFRfVVNFUl9ESVI7Ci0gICAgbmV3Y2ZnLT5lbmFibGVkX3VzZXJzID0gYXBfbWFrZV90YWJsZShwLCA0KTsKLSAgICBuZXdjZmctPmRpc2FibGVkX3VzZXJzID0gYXBfbWFrZV90YWJsZShwLCA0KTsKLSAgICByZXR1cm4gKHZvaWQgKikgbmV3Y2ZnOwotfQotCi0jZGVmaW5lIE9fREVGQVVMVCAwCi0jZGVmaW5lIE9fRU5BQkxFIDEKLSNkZWZpbmUgT19ESVNBQkxFIDIKLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF91c2VyX2RpcihjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICB1c2VyZGlyX2NvbmZpZwotICAgICogc19jZmcgPSAodXNlcmRpcl9jb25maWcgKikgYXBfZ2V0X21vZHVsZV9jb25maWcKLSAgICAoCi0gICAgIGNtZC0+c2VydmVyLT5tb2R1bGVfY29uZmlnLAotICAgICAmdXNlcmRpcl9tb2R1bGUKLSAgICApOwotICAgIGNoYXIgKnVzZXJuYW1lOwotICAgIGNvbnN0IGNoYXIKLSAgICAgICAgKnVzZXJuYW1lcyA9IGFyZzsKLSAgICBjaGFyICprdyA9IGFwX2dldHdvcmRfY29uZihjbWQtPnBvb2wsICZ1c2VybmFtZXMpOwotICAgIHRhYmxlICp1c2VydGFibGU7Ci0KLSAgICAvKgotICAgICAqIExldCdzIGRvIHRoZSBjb21wYXJpc29ucyBvbmNlLgotICAgICAqLwotICAgIGlmICgoIXN0cmNhc2VjbXAoa3csICJkaXNhYmxlIikpIHx8ICghc3RyY2FzZWNtcChrdywgImRpc2FibGVkIikpKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIElmIHRoZXJlIGFyZSBubyB1c2VybmFtZXMgc3BlY2lmaWVkLCB0aGlzIGlzIGEgZ2xvYmFsIGRpc2FibGUgLSB3ZQotICAgICAgICAgKiBuZWVkIGRvIG5vIG1vcmUgYXQgdGhpcyBwb2ludCB0aGFuIHJlY29yZCB0aGUgZmFjdC4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChzdHJsZW4odXNlcm5hbWVzKSA9PSAwKSB7Ci0gICAgICAgICAgICBzX2NmZy0+Z2xvYmFsbHlfZGlzYWJsZWQgPSAxOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgdXNlcnRhYmxlID0gc19jZmctPmRpc2FibGVkX3VzZXJzOwotICAgIH0KLSAgICBlbHNlIGlmICgoIXN0cmNhc2VjbXAoa3csICJlbmFibGUiKSkgfHwgKCFzdHJjYXNlY21wKGt3LCAiZW5hYmxlZCIpKSkgewotICAgICAgICAvKgotICAgICAgICAgKiBUaGUgImRpc2FibGUiIGtleXdvcmQgY2FuIHN0YW5kIGFsb25lIG9yIHRha2UgYSBsaXN0IG9mIG5hbWVzLCBidXQKLSAgICAgICAgICogdGhlICJlbmFibGUiIGtleXdvcmQgcmVxdWlyZXMgdGhlIGxpc3QuICBXaGluZ2UgaWYgaXQgZG9lc24ndCBoYXZlCi0gICAgICAgICAqIGl0LgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHN0cmxlbih1c2VybmFtZXMpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAiVXNlckRpciBcImVuYWJsZVwiIGtleXdvcmQgcmVxdWlyZXMgYSBsaXN0IG9mIHVzZXJuYW1lcyI7Ci0gICAgICAgIH0KLSAgICAgICAgdXNlcnRhYmxlID0gc19jZmctPmVuYWJsZWRfdXNlcnM7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAvKgotICAgICAgICAgKiBJZiB0aGUgZmlyc3QgKG9ubHk/KSB2YWx1ZSBpc24ndCBvbmUgb2Ygb3VyIGtleXdvcmRzLCBqdXN0IGNvcHkKLSAgICAgICAgICogdGhlIHN0cmluZyB0byB0aGUgdXNlcmRpciBzdHJpbmcuCi0gICAgICAgICAqLwotICAgICAgICBzX2NmZy0+dXNlcmRpciA9IGFwX3BzdHJkdXAoY21kLT5wb29sLCBhcmcpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBOb3cgd2UganVzdCB0YWtlIGVhY2ggd29yZCBpbiB0dXJuIGZyb20gdGhlIGNvbW1hbmQgbGluZSBhbmQgYWRkIGl0IHRvCi0gICAgICogdGhlIGFwcHJvcHJpYXRlIHRhYmxlLgotICAgICAqLwotICAgIHdoaWxlICgqdXNlcm5hbWVzKSB7Ci0gICAgICAgIHVzZXJuYW1lID0gYXBfZ2V0d29yZF9jb25mKGNtZC0+cG9vbCwgJnVzZXJuYW1lcyk7Ci0gICAgICAgIGFwX3RhYmxlX3NldG4odXNlcnRhYmxlLCB1c2VybmFtZSwga3cpOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIHVzZXJkaXJfY21kc1tdID0gewotICAgIHsiVXNlckRpciIsIHNldF91c2VyX2RpciwgTlVMTCwgUlNSQ19DT05GLCBSQVdfQVJHUywKLSAgICAidGhlIHB1YmxpYyBzdWJkaXJlY3RvcnkgaW4gdXNlcnMnIGhvbWUgZGlyZWN0b3JpZXMsIG9yICdkaXNhYmxlZCcsIG9yICdkaXNhYmxlZCB1c2VybmFtZSB1c2VybmFtZS4uLicsIG9yICdlbmFibGVkIHVzZXJuYW1lIHVzZXJuYW1lLi4uJyJ9LAotICAgIHtOVUxMfQotfTsKLQotc3RhdGljIGludCB0cmFuc2xhdGVfdXNlcmRpcihyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICB2b2lkICpzZXJ2ZXJfY29uZiA9IHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZzsKLSAgICBjb25zdCB1c2VyZGlyX2NvbmZpZyAqc19jZmcgPQotICAgICh1c2VyZGlyX2NvbmZpZyAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzZXJ2ZXJfY29uZiwgJnVzZXJkaXJfbW9kdWxlKTsKLSAgICBjaGFyICpuYW1lID0gci0+dXJpOwotICAgIGNvbnN0IGNoYXIgKnVzZXJkaXJzID0gc19jZmctPnVzZXJkaXI7Ci0gICAgY29uc3QgY2hhciAqdywgKmRuYW1lOwotICAgIGNoYXIgKnJlZGlyZWN0OwotICAgIGNoYXIgKnggPSBOVUxMOwotICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0KLSAgICAvKgotICAgICAqIElmIHRoZSBVUkkgZG9lc24ndCBtYXRjaCBvdXIgYmFzaWMgcGF0dGVybiwgd2UndmUgbm90aGluZyB0byBkbyB3aXRoCi0gICAgICogaXQuCi0gICAgICovCi0gICAgaWYgKAotICAgICAgICAoc19jZmctPnVzZXJkaXIgPT0gTlVMTCkgfHwKLSAgICAgICAgKG5hbWVbMF0gIT0gJy8nKSB8fAotICAgICAgICAobmFtZVsxXSAhPSAnficpCi0gICAgICAgICkgewotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgfQotCi0gICAgZG5hbWUgPSBuYW1lICsgMjsKLSAgICB3ID0gYXBfZ2V0d29yZChyLT5wb29sLCAmZG5hbWUsICcvJyk7Ci0KLSAgICAvKgotICAgICAqIFRoZSAnZG5hbWUnIGZ1bm55IGJ1c2luZXNzIGludm9sdmVzIGJhY2tpbmcgaXQgdXAgdG8gY2FwdHVyZSB0aGUgJy8nCi0gICAgICogZGVsaW1pdGluZyB0aGUgIi9+dXNlciIgcGFydCBmcm9tIHRoZSByZXN0IG9mIHRoZSBVUkwsIGluIGNhc2UgdGhlcmUKLSAgICAgKiB3YXMgb25lICh0aGUgY2FzZSB3aGVyZSB0aGVyZSB3YXNuJ3QgYmVpbmcganVzdCAiR0VUIC9+dXNlciBIVFRQLzEuMCIsCi0gICAgICogZm9yIHdoaWNoIHdlIGRvbid0IHdhbnQgdG8gdGFjayBvbiBhICcvJyBvbnRvIHRoZSBmaWxlbmFtZSkuCi0gICAgICovCi0KLSAgICBpZiAoZG5hbWVbLTFdID09ICcvJykgewotICAgICAgICAtLWRuYW1lOwotICAgIH0KLQotICAgIC8qCi0gICAgICogSWYgdGhlcmUncyBubyB1c2VybmFtZSwgaXQncyBub3QgZm9yIHVzLiAgSWdub3JlIC4gYW5kIC4uIGFzIHdlbGwuCi0gICAgICovCi0gICAgaWYgKHdbMF0gPT0gJ1wwJyB8fCAod1sxXSA9PSAnLicgJiYgKHdbMl0gPT0gJ1wwJyB8fCAod1syXSA9PSAnLicgJiYgd1szXSA9PSAnXDAnKSkpKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBOb3IgaWYgdGhlcmUncyBhbiB1c2VybmFtZSBidXQgaXQncyBpbiB0aGUgZGlzYWJsZWQgbGlzdC4KLSAgICAgKi8KLSAgICBpZiAoYXBfdGFibGVfZ2V0KHNfY2ZnLT5kaXNhYmxlZF91c2VycywgdykgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgfQotICAgIC8qCi0gICAgICogSWYgdGhlcmUncyBhIGdsb2JhbCBpbnRlcmRpY3Rpb24gb24gVXNlckRpcnMsIGNoZWNrIHRvIHNlZSBpZiB0aGlzCi0gICAgICogbmFtZSBpcyBvbmUgb2YgdGhlIEJsZXNzZWQuCi0gICAgICovCi0gICAgaWYgKAotICAgICAgICBzX2NmZy0+Z2xvYmFsbHlfZGlzYWJsZWQgJiYKLSAgICAgICAgKGFwX3RhYmxlX2dldChzX2NmZy0+ZW5hYmxlZF91c2VycywgdykgPT0gTlVMTCkKLSAgICAgICAgKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNwZWNpYWwgY2FzZXMgYWxsIGNoZWNrZWQsIG9ud2FyZCB0byBub3JtYWwgc3Vic3RpdHV0aW9uIHByb2Nlc3NpbmcuCi0gICAgICovCi0KLSAgICB3aGlsZSAoKnVzZXJkaXJzKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnVzZXJkaXIgPSBhcF9nZXR3b3JkX2NvbmYoci0+cG9vbCwgJnVzZXJkaXJzKTsKLSAgICAgICAgY2hhciAqZmlsZW5hbWUgPSBOVUxMOwotCi0gICAgICAgIGlmIChzdHJjaHIodXNlcmRpciwgJyonKSkKLSAgICAgICAgICAgIHggPSBhcF9nZXR3b3JkKHItPnBvb2wsICZ1c2VyZGlyLCAnKicpOwotCi0JaWYgKHVzZXJkaXJbMF0gPT0gJ1wwJyB8fCBhcF9vc19pc19wYXRoX2Fic29sdXRlKHVzZXJkaXIpKSB7Ci0gICAgICAgICAgICBpZiAoeCkgewotI2lmZGVmIEhBVkVfRFJJVkVfTEVUVEVSUwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogQ3J1bW15IGhhY2suIE5lZWQgdG8gZmlndXJlIG91dCB3aGV0aGVyIHdlIGhhdmUgYmVlbgotICAgICAgICAgICAgICAgICAqIHJlZGlyZWN0ZWQgdG8gYSBVUkwgb3IgdG8gYSBmaWxlIG9uIHNvbWUgZHJpdmUuIFNpbmNlIEkKLSAgICAgICAgICAgICAgICAgKiBrbm93IG9mIG5vIHByb3RvY29scyB0aGF0IGFyZSBhIHNpbmdsZSBsZXR0ZXIsIGlmIHRoZSA6IGlzCi0gICAgICAgICAgICAgICAgICogdGhlIHNlY29uZCBjaGFyYWN0ZXIsIEkgd2lsbCBhc3N1bWUgYSBmaWxlIHdhcyBzcGVjaWZpZWQKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoc3RyY2hyKHggKyAyLCAnOicpKQotI2Vsc2UKLSAgICAgICAgICAgICAgICBpZiAoc3RyY2hyKHgsICc6JykpCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdJTjMyICovCi0JCXsKLSAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3QgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHgsIHcsIHVzZXJkaXIsIGRuYW1lLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkxvY2F0aW9uIiwgcmVkaXJlY3QpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUkVESVJFQ1Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHgsIHcsIHVzZXJkaXIsIE5VTEwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCB1c2VyZGlyLCAiLyIsIHcsIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNocih1c2VyZGlyLCAnOicpKSB7Ci0gICAgICAgICAgICByZWRpcmVjdCA9IGFwX3BzdHJjYXQoci0+cG9vbCwgdXNlcmRpciwgIi8iLCB3LCBkbmFtZSwgTlVMTCk7Ci0gICAgICAgICAgICBhcF90YWJsZV9zZXRuKHItPmhlYWRlcnNfb3V0LCAiTG9jYXRpb24iLCByZWRpcmVjdCk7Ci0gICAgICAgICAgICByZXR1cm4gUkVESVJFQ1Q7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0jaWZkZWYgV0lOMzIKLSAgICAgICAgICAgIC8qIE5lZWQgdG8gZmlndXJlIG91dCBob21lIGRpcnMgb24gTlQgKi8KLSAgICAgICAgICAgIHJldHVybiBERUNMSU5FRDsKLSNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0lOMzIgKi8KLSAgICAgICAgICAgIHN0cnVjdCBwYXNzd2QgKnB3OwotICAgICAgICAgICAgaWYgKChwdyA9IGdldHB3bmFtKHcpKSkgewotI2lmZGVmIE9TMgotICAgICAgICAgICAgICAgIC8qIE5lZWQgdG8gbWFudWFsbHkgYWRkIHVzZXIgbmFtZSBmb3IgT1MvMiAqLwotICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCBwdy0+cHdfZGlyLCB3LCAiLyIsIHVzZXJkaXIsIE5VTEwpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgcHctPnB3X2RpciwgIi8iLCB1c2VyZGlyLCBOVUxMKTsKLSNlbmRpZgotICAgICAgICAgICAgfQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXSU4zMiAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogTm93IHNlZSBpZiBpdCBleGlzdHMsIG9yIHdlJ3JlIGF0IHRoZSBsYXN0IGVudHJ5LiBJZiB3ZSBhcmUgYXQgdGhlCi0gICAgICAgICAqIGxhc3QgZW50cnksIHRoZW4gdXNlIHRoZSBmaWxlbmFtZSBnZW5lcmF0ZWQgKGlmIHRoZXJlIGlzIG9uZSkKLSAgICAgICAgICogYW55d2F5LCBpbiB0aGUgaG9wZSB0aGF0IHNvbWUgaGFuZGxlciBtaWdodCBoYW5kbGUgaXQuIFRoaXMgY2FuIGJlCi0gICAgICAgICAqIHVzZWQsIGZvciBleGFtcGxlLCB0byBydW4gYSBDR0kgc2NyaXB0IGZvciB0aGUgdXNlci4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChmaWxlbmFtZSAmJiAoISp1c2VyZGlycyB8fCBzdGF0KGZpbGVuYW1lLCAmc3RhdGJ1ZikgIT0gLTEpKSB7Ci0gICAgICAgICAgICByLT5maWxlbmFtZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgZmlsZW5hbWUsIGRuYW1lLCBOVUxMKTsKLQkgICAgLyogd2hlbiBzdGF0YnVmIGNvbnRhaW5zIGluZm8gb24gci0+ZmlsZW5hbWUgd2UgY2FuIHNhdmUgYSBzeXNjYWxsCi0JICAgICAqIGJ5IGNvcHlpbmcgaXQgdG8gci0+ZmluZm8KLQkgICAgICovCi0JICAgIGlmICgqdXNlcmRpcnMgJiYgZG5hbWVbMF0gPT0gMCkKLQkJci0+ZmluZm8gPSBzdGF0YnVmOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIERFQ0xJTkVEOwotfQotCi1tb2R1bGUgdXNlcmRpcl9tb2R1bGUgPSB7Ci0gICAgU1RBTkRBUkRfTU9EVUxFX1NUVUZGLAotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplciAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXIgY29uZmlnIGNyZWF0ZXIgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogZGlyIG1lcmdlciAtLS0gZGVmYXVsdCBpcyB0byBvdmVycmlkZSAqLwotICAgIGNyZWF0ZV91c2VyZGlyX2NvbmZpZywgICAgICAvKiBzZXJ2ZXIgY29uZmlnICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIG1lcmdlIHNlcnZlciBjb25maWcgKi8KLSAgICB1c2VyZGlyX2NtZHMsICAgICAgICAgICAgICAgLyogY29tbWFuZCB0YWJsZSAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBoYW5kbGVycyAqLwotICAgIHRyYW5zbGF0ZV91c2VyZGlyLCAgICAgICAgICAvKiBmaWxlbmFtZSB0cmFuc2xhdGlvbiAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVja191c2VyX2lkICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGF1dGggKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgYWNjZXNzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHR5cGVfY2hlY2tlciAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXh1cHMgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogbG9nZ2VyICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGhlYWRlciBwYXJzZXIgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hpbGRfaW5pdCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGlsZF9leGl0ICovCi0gICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvc3QgcmVhZC1yZXF1ZXN0ICovCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tYXBwZXJzL21vZF91c2VyZGlyLmRzcCBiL21vZHVsZXMvbWFwcGVycy9tb2RfdXNlcmRpci5kc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNjA2YTkuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tYXBwZXJzL21vZF91c2VyZGlyLmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9Im1vZF91c2VyZGlyIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDIKLQotQ0ZHPW1vZF91c2VyZGlyIC0gV2luMzIgUmVsZWFzZQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJtb2RfdXNlcmRpci5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIm1vZF91c2VyZGlyLm1hayIgQ0ZHPSJtb2RfdXNlcmRpciAtIFdpbjMyIFJlbGVhc2UiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAibW9kX3VzZXJkaXIgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFICJtb2RfdXNlcmRpciAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwCi0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotTVRMPW1pZGwuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIm1vZF91c2VyZGlyIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvSSAiLi4vLi4vaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHIvaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHItdXRpbC9pbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0ZkIlJlbGVhc2VcbW9kX3VzZXJkaXIiIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvbWFjaGluZTpJMzg2IC9vdXQ6IlJlbGVhc2UvbW9kX3VzZXJkaXIuc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX3VzZXJkaXIKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9tYWNoaW5lOkkzODYgL291dDoiUmVsZWFzZS9tb2RfdXNlcmRpci5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfdXNlcmRpcgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibW9kX3VzZXJkaXIgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aaSAvT2QgL0kgIi4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9GZCJEZWJ1Z1xtb2RfdXNlcmRpciIgL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvaW5jcmVtZW50YWw6bm8gL21hcCAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJEZWJ1Zy9tb2RfdXNlcmRpci5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfdXNlcmRpcgotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9pbmNyZW1lbnRhbDpubyAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6IkRlYnVnL21vZF91c2VyZGlyLnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF91c2VyZGlyCi0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJtb2RfdXNlcmRpciAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgIm1vZF91c2VyZGlyIC0gV2luMzIgRGVidWciCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZF91c2VyZGlyLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZF91c2VyZGlyLnJjCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIm1vZF91c2VyZGlyIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBDcmVhdGluZyBWZXJzaW9uIFJlc291cmNlCi1JbnB1dFBhdGg9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSIuXG1vZF91c2VyZGlyLnJjIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCWF3ayAtZiAuLi8uLi9idWlsZC93aW4zMi93aW4zMnZlci5hd2sgbW9kX3VzZXJkaXIgICJ1c2VyZGlyX21vZHVsZSBmb3IgQXBhY2hlIiAuLi8uLi9pbmNsdWRlL2FwX3JlbGVhc2UuaCA+IC5cbW9kX3VzZXJkaXIucmMKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJtb2RfdXNlcmRpciAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIENyZWF0aW5nIFZlcnNpb24gUmVzb3VyY2UKLUlucHV0UGF0aD0uLlwuLlxidWlsZFx3aW4zMlx3aW4zMnZlci5hd2sKLQotIi5cbW9kX3VzZXJkaXIucmMiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JYXdrIC1mIC4uLy4uL2J1aWxkL3dpbjMyL3dpbjMydmVyLmF3ayBtb2RfdXNlcmRpciAgInVzZXJkaXJfbW9kdWxlIGZvciBBcGFjaGUiIC4uLy4uL2luY2x1ZGUvYXBfcmVsZWFzZS5oID4gLlxtb2RfdXNlcmRpci5yYwotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9tb2R1bGVzL21hcHBlcnMvbW9kX3VzZXJkaXIuZXhwIGIvbW9kdWxlcy9tYXBwZXJzL21vZF91c2VyZGlyLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI4YjgxZC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21hcHBlcnMvbW9kX3VzZXJkaXIuZXhwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdXNlcmRpcl9tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWFwcGVycy9tb2Rfdmhvc3RfYWxpYXMuYyBiL21vZHVsZXMvbWFwcGVycy9tb2Rfdmhvc3RfYWxpYXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVjYzVhMi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21hcHBlcnMvbW9kX3Zob3N0X2FsaWFzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogbW9kX3Zob3N0X2FsaWFzLmM6IHN1cHBvcnQgZm9yIGR5bmFtaWNhbGx5IGNvbmZpZ3VyZWQgbWFzcyB2aXJ0dWFsIGhvc3RpbmcKLSAqIAotICogQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGVtb24gSW50ZXJuZXQgTHRkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgd2FzIHN1Ym1pdHRlZCBieSBEZW1vbiBJbnRlcm5ldCB0byB0aGUgQXBhY2hlIEdyb3VwCi0gKiBpbiBNYXkgMTk5OS4gRnV0dXJlIHJldmlzaW9ucyBhbmQgZGVyaXZhdGl2ZXMgb2YgdGhpcyBzb3VyY2UgY29kZQotICogbXVzdCBhY2tub3dsZWRnZSBEZW1vbiBJbnRlcm5ldCBhcyB0aGUgb3JpZ2luYWwgY29udHJpYnV0b3Igb2YKLSAqIHRoaXMgbW9kdWxlLiBBbGwgb3RoZXIgbGljZW5zaW5nIGFuZCB1c2FnZSBjb25kaXRpb25zIGFyZSB0aG9zZQotICogb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgVG9ueSBGaW5jaCA8ZmFuZkBkZW1vbi5uZXQ+IDxkb3RAZG90YXQuYXQ+LgotICoKLSAqIEltcGxlbWVudGF0aW9uIGlkZWFzIHdlcmUgdGFrZW4gZnJvbSBtb2RfYWxpYXMuYy4gVGhlIG92ZXJhbGwKLSAqIGNvbmNlcHQgaXMgZGVyaXZlZCBmcm9tIHRoZSBPVkVSUklERV9ET0NfUk9PVC9PVkVSUklERV9DR0lESVIKLSAqIHBhdGNoIHRvIEFwYWNoZSAxLjNiMyBhbmQgYSBzaW1pbGFyIGZlYXR1cmUgaW4gRGVtb24ncyB0aHR0cGQsCi0gKiBib3RoIHdyaXR0ZW4gYnkgSmFtZXMgR3JpbnRlciA8anJnQGJsb2R3ZW4uZGVtb24uY28udWs+LgotICovCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0KLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIHZob3N0X2FsaWFzX21vZHVsZTsKLQotCi0vKgotICogYmFzaWMgY29uZmlndXJhdGlvbiB0aGluZ3MKLSAqIHdlIGFiYnJldmlhdGUgIm1vZF92aG9zdF9hbGlhcyIgdG8gIm12YSIgZm9yIHNob3J0ZXIgbmFtZXMKLSAqLwotCi10eXBlZGVmIGVudW0gewotICAgIFZIT1NUX0FMSUFTX1VOU0VULCBWSE9TVF9BTElBU19OT05FLCBWSE9TVF9BTElBU19OQU1FLCBWSE9TVF9BTElBU19JUAotfSBtdmFfbW9kZV9lOwotCi0vKgotICogUGVyLXNlcnZlciBtb2R1bGUgY29uZmlnIHJlY29yZC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgbXZhX3Njb25mX3QgewotICAgIGNoYXIgKmRvY19yb290OwotICAgIGNoYXIgKmNnaV9yb290OwotICAgIG12YV9tb2RlX2UgZG9jX3Jvb3RfbW9kZTsKLSAgICBtdmFfbW9kZV9lIGNnaV9yb290X21vZGU7Ci19IG12YV9zY29uZl90OwotCi1zdGF0aWMgdm9pZCAqbXZhX2NyZWF0ZV9zZXJ2ZXJfY29uZmlnKHBvb2wgKnAsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgbXZhX3Njb25mX3QgKmNvbmY7Ci0KLSAgICBjb25mID0gKG12YV9zY29uZl90ICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKG12YV9zY29uZl90KSk7Ci0gICAgY29uZi0+ZG9jX3Jvb3QgPSBOVUxMOwotICAgIGNvbmYtPmNnaV9yb290ID0gTlVMTDsKLSAgICBjb25mLT5kb2Nfcm9vdF9tb2RlID0gVkhPU1RfQUxJQVNfVU5TRVQ7Ci0gICAgY29uZi0+Y2dpX3Jvb3RfbW9kZSA9IFZIT1NUX0FMSUFTX1VOU0VUOwotICAgIHJldHVybiBjb25mOwotfQotCi1zdGF0aWMgdm9pZCAqbXZhX21lcmdlX3NlcnZlcl9jb25maWcocG9vbCAqcCwgdm9pZCAqcGFyZW50diwgdm9pZCAqY2hpbGR2KQotewotICAgIG12YV9zY29uZl90ICpwYXJlbnQgPSAobXZhX3Njb25mX3QgKikgcGFyZW50djsKLSAgICBtdmFfc2NvbmZfdCAqY2hpbGQgPSAobXZhX3Njb25mX3QgKikgY2hpbGR2OwotICAgIG12YV9zY29uZl90ICpjb25mOwotCi0gICAgY29uZiA9IChtdmFfc2NvbmZfdCAqKSBhcF9wY2FsbG9jKHAsIHNpemVvZigqY29uZikpOwotICAgIGlmIChjaGlsZC0+ZG9jX3Jvb3RfbW9kZSA9PSBWSE9TVF9BTElBU19VTlNFVCkgewotCWNvbmYtPmRvY19yb290X21vZGUgPSBwYXJlbnQtPmRvY19yb290X21vZGU7Ci0JY29uZi0+ZG9jX3Jvb3QgPSBwYXJlbnQtPmRvY19yb290OwotICAgIH0KLSAgICBlbHNlIHsKLQljb25mLT5kb2Nfcm9vdF9tb2RlID0gY2hpbGQtPmRvY19yb290X21vZGU7Ci0JY29uZi0+ZG9jX3Jvb3QgPSBjaGlsZC0+ZG9jX3Jvb3Q7Ci0gICAgfQotICAgIGlmIChjaGlsZC0+Y2dpX3Jvb3RfbW9kZSA9PSBWSE9TVF9BTElBU19VTlNFVCkgewotCWNvbmYtPmNnaV9yb290X21vZGUgPSBwYXJlbnQtPmNnaV9yb290X21vZGU7Ci0JY29uZi0+Y2dpX3Jvb3QgPSBwYXJlbnQtPmNnaV9yb290OwotICAgIH0KLSAgICBlbHNlIHsKLQljb25mLT5jZ2lfcm9vdF9tb2RlID0gY2hpbGQtPmNnaV9yb290X21vZGU7Ci0JY29uZi0+Y2dpX3Jvb3QgPSBjaGlsZC0+Y2dpX3Jvb3Q7Ci0gICAgfQotICAgIHJldHVybiBjb25mOwotfQotCi0KLS8qCi0gKiBUaGVzZSBhcmUganVzdCBoZXJlIHRvIHRlbGwgdXMgd2hhdCB2aG9zdF9hbGlhc19zZXQgc2hvdWxkIGRvLgotICogV2UgZG9uJ3QgcHV0IGFueXRoaW5nIGludG8gdGhlbTsgd2UganVzdCB1c2UgdGhlIGNlbGwgYWRkcmVzc2VzLgotICovCi1zdGF0aWMgaW50IHZob3N0X2FsaWFzX3NldF9kb2Nfcm9vdF9pcCwKLSAgICB2aG9zdF9hbGlhc19zZXRfY2dpX3Jvb3RfaXAsCi0gICAgdmhvc3RfYWxpYXNfc2V0X2RvY19yb290X25hbWUsCi0gICAgdmhvc3RfYWxpYXNfc2V0X2NnaV9yb290X25hbWU7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICp2aG9zdF9hbGlhc19zZXQoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICptYXApCi17Ci0gICAgbXZhX3Njb25mX3QgKmNvbmY7Ci0gICAgbXZhX21vZGVfZSBtb2RlLCAqcG1vZGU7Ci0gICAgY2hhciAqKnBtYXA7Ci0gICAgY2hhciAqcDsKLSAgCi0gICAgY29uZiA9IChtdmFfc2NvbmZfdCAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhjbWQtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywKLQkJCQkJCSZ2aG9zdF9hbGlhc19tb2R1bGUpOwotICAgIC8qIHRoZXJlIG91Z2h0IHRvIGJlIGEgYmV0dGVyIHdheSBvZiBkb2luZyB0aGlzICovCi0gICAgaWYgKCZ2aG9zdF9hbGlhc19zZXRfZG9jX3Jvb3RfaXAgPT0gY21kLT5pbmZvKSB7Ci0JbW9kZSA9IFZIT1NUX0FMSUFTX0lQOwotCXBtYXAgPSAmY29uZi0+ZG9jX3Jvb3Q7Ci0JcG1vZGUgPSAmY29uZi0+ZG9jX3Jvb3RfbW9kZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoJnZob3N0X2FsaWFzX3NldF9jZ2lfcm9vdF9pcCA9PSBjbWQtPmluZm8pIHsKLQltb2RlID0gVkhPU1RfQUxJQVNfSVA7Ci0JcG1hcCA9ICZjb25mLT5jZ2lfcm9vdDsKLQlwbW9kZSA9ICZjb25mLT5jZ2lfcm9vdF9tb2RlOwotICAgIH0KLSAgICBlbHNlIGlmICgmdmhvc3RfYWxpYXNfc2V0X2RvY19yb290X25hbWUgPT0gY21kLT5pbmZvKSB7Ci0JbW9kZSA9IFZIT1NUX0FMSUFTX05BTUU7Ci0JcG1hcCA9ICZjb25mLT5kb2Nfcm9vdDsKLQlwbW9kZSA9ICZjb25mLT5kb2Nfcm9vdF9tb2RlOwotICAgIH0KLSAgICBlbHNlIGlmICgmdmhvc3RfYWxpYXNfc2V0X2NnaV9yb290X25hbWUgPT0gY21kLT5pbmZvKSB7Ci0JbW9kZSA9IFZIT1NUX0FMSUFTX05BTUU7Ci0JcG1hcCA9ICZjb25mLT5jZ2lfcm9vdDsKLQlwbW9kZSA9ICZjb25mLT5jZ2lfcm9vdF9tb2RlOwotICAgIH0KLSAgICBlbHNlIHsKLQlyZXR1cm4gIklOVEVSTkFMIEVSUk9SOiB1bmtub3duIGNvbW1hbmQgaW5mbyI7Ci0gICAgfQotCi0gICAgaWYgKCptYXAgIT0gJy8nKSB7Ci0JaWYgKHN0cmNhc2VjbXAobWFwLCAibm9uZSIpKSB7Ci0JICAgIHJldHVybiAiZm9ybWF0IHN0cmluZyBtdXN0IHN0YXJ0IHdpdGggJy8nIG9yIGJlICdub25lJyI7Ci0JfQotCSpwbWFwID0gTlVMTDsKLQkqcG1vZGUgPSBWSE9TVF9BTElBU19OT05FOwotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8qIHNhbml0eSBjaGVjayAqLwotICAgIHAgPSBtYXA7Ci0gICAgd2hpbGUgKCpwICE9ICdcMCcpIHsKLQlpZiAoKnArKyAhPSAnJScpIHsKLQkgICAgY29udGludWU7Ci0JfQotCS8qIHdlIGp1c3QgZm91bmQgYSAnJScgKi8KLQlpZiAoKnAgPT0gJ3AnIHx8ICpwID09ICclJykgewotCSAgICArK3A7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQkvKiBvcHRpb25hbCBkYXNoICovCi0JaWYgKCpwID09ICctJykgewotCSAgICArK3A7Ci0JfQotCS8qIGRpZ2l0IE4gKi8KLQlpZiAoYXBfaXNkaWdpdCgqcCkpIHsKLQkgICAgKytwOwotCX0KLQllbHNlIHsKLQkgICAgcmV0dXJuICJzeW50YXggZXJyb3IgaW4gZm9ybWF0IHN0cmluZyI7Ci0JfQotCS8qIG9wdGlvbmFsIHBsdXMgKi8KLQlpZiAoKnAgPT0gJysnKSB7Ci0JICAgICsrcDsKLQl9Ci0JLyogZG8gd2UgZW5kIGhlcmU/ICovCi0JaWYgKCpwICE9ICcuJykgewotCSAgICBjb250aW51ZTsKLQl9Ci0JKytwOwotCS8qIG9wdGlvbmFsIGRhc2ggKi8KLQlpZiAoKnAgPT0gJy0nKSB7Ci0JICAgICsrcDsKLQl9Ci0JLyogZGlnaXQgTSAqLwotCWlmIChhcF9pc2RpZ2l0KCpwKSkgewotCSAgICArK3A7Ci0JfQotCWVsc2UgewotCSAgICByZXR1cm4gInN5bnRheCBlcnJvciBpbiBmb3JtYXQgc3RyaW5nIjsKLQl9Ci0JLyogb3B0aW9uYWwgcGx1cyAqLwotCWlmICgqcCA9PSAnKycpIHsKLQkgICAgKytwOwotCX0KLSAgICB9Ci0gICAgKnBtYXAgPSBtYXA7Ci0gICAgKnBtb2RlID0gbW9kZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIG12YV9jb21tYW5kc1tdID0KLXsKLSAgICB7IlZpcnR1YWxTY3JpcHRBbGlhcyIsIHZob3N0X2FsaWFzX3NldCwgJnZob3N0X2FsaWFzX3NldF9jZ2lfcm9vdF9uYW1lLAotICAgICBSU1JDX0NPTkYsIFRBS0UxLCAiaG93IHRvIGNyZWF0ZSBhIFNjcmlwdEFsaWFzIGJhc2VkIG9uIHRoZSBob3N0In0sCi0gICAgeyJWaXJ0dWFsRG9jdW1lbnRSb290Iiwgdmhvc3RfYWxpYXNfc2V0LCAmdmhvc3RfYWxpYXNfc2V0X2RvY19yb290X25hbWUsCi0gICAgIFJTUkNfQ09ORiwgVEFLRTEsICJob3cgdG8gY3JlYXRlIHRoZSBEb2N1bWVudFJvb3QgYmFzZWQgb24gdGhlIGhvc3QifSwKLSAgICB7IlZpcnR1YWxTY3JpcHRBbGlhc0lQIiwgdmhvc3RfYWxpYXNfc2V0LCAmdmhvc3RfYWxpYXNfc2V0X2NnaV9yb290X2lwLAotICAgICBSU1JDX0NPTkYsIFRBS0UxLCAiaG93IHRvIGNyZWF0ZSBhIFNjcmlwdEFsaWFzIGJhc2VkIG9uIHRoZSBob3N0In0sCi0gICAgeyJWaXJ0dWFsRG9jdW1lbnRSb290SVAiLCB2aG9zdF9hbGlhc19zZXQsICZ2aG9zdF9hbGlhc19zZXRfZG9jX3Jvb3RfaXAsCi0gICAgIFJTUkNfQ09ORiwgVEFLRTEsICJob3cgdG8gY3JlYXRlIHRoZSBEb2N1bWVudFJvb3QgYmFzZWQgb24gdGhlIGhvc3QifSwKLSAgICB7IE5VTEwgfQotfTsKLQotCi0vKgotICogVGhpcyByZWFsbHkgd2FudHMgdG8gYmUgYSBuZXN0ZWQgZnVuY3Rpb24KLSAqIGJ1dCBDIGlzIHRvbyBmZWVibGUgdG8gc3VwcG9ydCB0aGVtLgotICovCi1zdGF0aWMgYXBfaW5saW5lIHZvaWQgdmhvc3RfYWxpYXNfY2hlY2tzcGFjZShyZXF1ZXN0X3JlYyAqciwgY2hhciAqYnVmLAotCQkJCQkgICAgIGNoYXIgKipwZGVzdCwgaW50IHNpemUpCi17Ci0gICAgLyogWFhYOiB3aGF0IGlmIHNpemUgPiBIVUdFX1NUUklOR19MRU4/ICovCi0gICAgaWYgKCpwZGVzdCArIHNpemUgPiBidWYgKyBIVUdFX1NUUklOR19MRU4pIHsKLQkqKnBkZXN0ID0gJ1wwJzsKLQlpZiAoci0+ZmlsZW5hbWUpIHsKLQkgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHItPmZpbGVuYW1lLCBidWYsIE5VTEwpOwotCX0KLQllbHNlIHsKLQkgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyZHVwKHItPnBvb2wsIGJ1Zik7Ci0JfQotCSpwZGVzdCA9IGJ1ZjsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHZob3N0X2FsaWFzX2ludGVycG9sYXRlKHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICpuYW1lLAotCQkJCSAgICBjb25zdCBjaGFyICptYXAsIGNvbnN0IGNoYXIgKnVyaSkKLXsKLSAgICAvKiAwLi45IDkuLjAgKi8KLSAgICBlbnVtIHsgTUFYRE9UUyA9IDE5IH07Ci0gICAgY29uc3QgY2hhciAqZG90c1tNQVhET1RTKzFdOwotICAgIGludCBuZG90czsKLQotICAgIGNoYXIgYnVmW0hVR0VfU1RSSU5HX0xFTl07Ci0gICAgY2hhciAqZGVzdCwgbGFzdDsKLQotICAgIGludCBOLCBNLCBOcCwgTXAsIE5kLCBNZDsKLSAgICBjb25zdCBjaGFyICpzdGFydCwgKmVuZDsKLQotICAgIGNvbnN0IGNoYXIgKnA7Ci0KLSAgICBuZG90cyA9IDA7Ci0gICAgZG90c1tuZG90cysrXSA9IG5hbWUtMTsgLyogc2xpZ2h0bHkgbmF1Z2h0eSAqLwotICAgIGZvciAocCA9IG5hbWU7ICpwOyArK3ApewotCWlmICgqcCA9PSAnLicgJiYgbmRvdHMgPCBNQVhET1RTKSB7Ci0JICAgIGRvdHNbbmRvdHMrK10gPSBwOwotCX0KLSAgICB9Ci0gICAgZG90c1tuZG90c10gPSBwOwotCi0gICAgci0+ZmlsZW5hbWUgPSBOVUxMOwotICAKLSAgICBkZXN0ID0gYnVmOwotICAgIGxhc3QgPSAnXDAnOwotICAgIHdoaWxlICgqbWFwKSB7Ci0JaWYgKCptYXAgIT0gJyUnKSB7Ci0JICAgIC8qIG5vcm1hbCBjaGFyYWN0ZXJzICovCi0JICAgIHZob3N0X2FsaWFzX2NoZWNrc3BhY2UociwgYnVmLCAmZGVzdCwgMSk7Ci0JICAgIGxhc3QgPSAqZGVzdCsrID0gKm1hcCsrOwotCSAgICBjb250aW51ZTsKLQl9Ci0JLyogd2UgYXJlIGluIGEgZm9ybWF0IHNwZWNpZmllciAqLwotCSsrbWFwOwotCS8qIGNhbid0IGJlIGEgc2xhc2ggKi8KLQlsYXN0ID0gJ1wwJzsKLQkvKiAlJSAtPiAlICovCi0JaWYgKCptYXAgPT0gJyUnKSB7Ci0JICAgICsrbWFwOwotCSAgICB2aG9zdF9hbGlhc19jaGVja3NwYWNlKHIsIGJ1ZiwgJmRlc3QsIDEpOwotCSAgICAqZGVzdCsrID0gJyUnOwotCSAgICBjb250aW51ZTsKLQl9Ci0JLyogcG9ydCBudW1iZXIgKi8KLQlpZiAoKm1hcCA9PSAncCcpIHsKLQkgICAgKyttYXA7Ci0JICAgIC8qIG5vLiBvZiBkZWNpbWFsIGRpZ2l0cyBpbiBhIHNob3J0IHBsdXMgb25lICovCi0JICAgIHZob3N0X2FsaWFzX2NoZWNrc3BhY2UociwgYnVmLCAmZGVzdCwgNyk7Ci0JICAgIGRlc3QgKz0gYXBfc25wcmludGYoZGVzdCwgNywgIiVkIiwgYXBfZ2V0X3NlcnZlcl9wb3J0KHIpKTsKLQkgICAgY29udGludWU7Ci0JfQotCS8qIGRlYWwgd2l0aCAlLU4rLi1NKyAtLSBzeW50YXggaXMgYWxyZWFkeSBjaGVja2VkICovCi0JTiA9IE0gPSAwOyAgIC8qIHZhbHVlICovCi0JTnAgPSBNcCA9IDA7IC8qIGlzIHRoZXJlIGEgcGx1cz8gKi8KLQlOZCA9IE1kID0gMDsgLyogaXMgdGhlcmUgYSBkYXNoPyAqLwotCWlmICgqbWFwID09ICctJykgKyttYXAsIE5kID0gMTsKLQlOID0gKm1hcCsrIC0gJzAnOwotCWlmICgqbWFwID09ICcrJykgKyttYXAsIE5wID0gMTsKLQlpZiAoKm1hcCA9PSAnLicpIHsKLQkgICAgKyttYXA7Ci0JICAgIGlmICgqbWFwID09ICctJykgewotCQkrK21hcCwgTWQgPSAxOwotCSAgICB9Ci0JICAgIE0gPSAqbWFwKysgLSAnMCc7Ci0JICAgIGlmICgqbWFwID09ICcrJykgewotCQkrK21hcCwgTXAgPSAxOwotCSAgICB9Ci0JfQotCS8qIG5vdGUgdGhhdCBOIGFuZCBNIGFyZSBvbmUtYmFzZWQgaW5kaWNlcywgbm90IHplcm8tYmFzZWQgKi8KLQlzdGFydCA9IGRvdHNbMF0rMTsgLyogcHRyIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgKi8KLQllbmQgPSBkb3RzW25kb3RzXTsgLyogcHRyIHRvIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGxhc3Qgb25lICovCi0JaWYgKE4gIT0gMCkgewotCSAgICBpZiAoTiA+IG5kb3RzKSB7Ci0JCXN0YXJ0ID0gIl8iOwotCQllbmQgPSBzdGFydCsxOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKCFOZCkgewotCQlzdGFydCA9IGRvdHNbTi0xXSsxOwotCQlpZiAoIU5wKSB7Ci0JCSAgICBlbmQgPSBkb3RzW05dOwotCQl9Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCWlmICghTnApIHsKLQkJICAgIHN0YXJ0ID0gZG90c1tuZG90cy1OXSsxOwotCQl9Ci0JCWVuZCA9IGRvdHNbbmRvdHMtTisxXTsKLQkgICAgfQotCX0KLQlpZiAoTSAhPSAwKSB7Ci0JICAgIGlmIChNID4gZW5kIC0gc3RhcnQpIHsKLQkJc3RhcnQgPSAiXyI7Ci0JCWVuZCA9IHN0YXJ0KzE7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoIU1kKSB7Ci0JCXN0YXJ0ID0gc3RhcnQrTS0xOwotCQlpZiAoIU1wKSB7Ci0JCSAgICBlbmQgPSBzdGFydCsxOwotCQl9Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCWlmICghTXApIHsKLQkJICAgIHN0YXJ0ID0gZW5kLU07Ci0JCX0KLQkJZW5kID0gZW5kLU0rMTsKLQkgICAgfQotCX0KLQl2aG9zdF9hbGlhc19jaGVja3NwYWNlKHIsIGJ1ZiwgJmRlc3QsIGVuZCAtIHN0YXJ0KTsKLQlmb3IgKHAgPSBzdGFydDsgcCA8IGVuZDsgKytwKSB7Ci0JICAgICpkZXN0KysgPSBhcF90b2xvd2VyKCpwKTsKLQl9Ci0gICAgfQotICAgICpkZXN0ID0gJ1wwJzsKLSAgICAvKiBubyBkb3VibGUgc2xhc2hlcyAqLwotICAgIGlmIChsYXN0ID09ICcvJykgewotCSsrdXJpOwotICAgIH0KLSAgICBpZiAoci0+ZmlsZW5hbWUpIHsKLQlyLT5maWxlbmFtZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgci0+ZmlsZW5hbWUsIGJ1ZiwgdXJpLCBOVUxMKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0Jci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIGJ1ZiwgdXJpLCBOVUxMKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgbXZhX3RyYW5zbGF0ZShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBtdmFfc2NvbmZfdCAqY29uZjsKLSAgICBjb25zdCBjaGFyICpuYW1lLCAqbWFwLCAqdXJpOwotICAgIG12YV9tb2RlX2UgbW9kZTsKLSAgICBpbnQgY2dpOwotICAKLSAgICBjb25mID0gKG12YV9zY29uZl90ICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZywKLQkJCQkJICAgICAgJnZob3N0X2FsaWFzX21vZHVsZSk7Ci0gICAgaWYgKCFzdHJuY21wKHItPnVyaSwgIi9jZ2ktYmluLyIsIDkpKSB7Ci0JbW9kZSA9IGNvbmYtPmNnaV9yb290X21vZGU7Ci0JbWFwID0gY29uZi0+Y2dpX3Jvb3Q7Ci0JdXJpID0gci0+dXJpICsgODsKLQkvKgotCSAqIGNhbid0IGZvcmNlIGNnaSBpbW1lZGlhdGVseSBiZWNhdXNlIHdlIG1pZ2h0IG5vdCBoYW5kbGUgdGhpcwotCSAqIGNhbGwgaWYgdGhlIG1vZGUgaXMgd3JvbmcKLQkgKi8KLQljZ2kgPSAxOwotICAgIH0KLSAgICBlbHNlIGlmIChyLT51cmlbMF0gPT0gJy8nKSB7Ci0JbW9kZSA9IGNvbmYtPmRvY19yb290X21vZGU7Ci0JbWFwID0gY29uZi0+ZG9jX3Jvb3Q7Ci0JdXJpID0gci0+dXJpOwotCWNnaSA9IDA7Ci0gICAgfQotICAgIGVsc2UgewotCXJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0gIAotICAgIGlmIChtb2RlID09IFZIT1NUX0FMSUFTX05BTUUpIHsKLQluYW1lID0gYXBfZ2V0X3NlcnZlcl9uYW1lKHIpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlID09IFZIT1NUX0FMSUFTX0lQKSB7Ci0JbmFtZSA9IHItPmNvbm5lY3Rpb24tPmxvY2FsX2lwOwotICAgIH0KLSAgICBlbHNlIHsKLQlyZXR1cm4gREVDTElORUQ7Ci0gICAgfQotCi0gICAgdmhvc3RfYWxpYXNfaW50ZXJwb2xhdGUociwgbmFtZSwgbWFwLCB1cmkpOwotCi0gICAgaWYgKGNnaSkgewotCS8qIHNlZSBpc19zY3JpcHRhbGlhc2VkKCkgaW4gbW9kX2NnaSAqLwotCXItPmhhbmRsZXIgPSAiY2dpLXNjcmlwdCI7Ci0JYXBfdGFibGVfc2V0bihyLT5ub3RlcywgImFsaWFzLWZvcmNlZC10eXBlIiwgci0+aGFuZGxlcik7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCB2aG9zdF9hbGlhc19tb2R1bGUgPQotewotICAgIFNUQU5EQVJEX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLAkJCS8qIGluaXRpYWxpemVyICovCi0gICAgTlVMTCwJCQkvKiBkaXIgY29uZmlnIGNyZWF0ZXIgKi8KLSAgICBOVUxMLAkJCS8qIGRpciBtZXJnZXIgLS0tIGRlZmF1bHQgaXMgdG8gb3ZlcnJpZGUgKi8KLSAgICBtdmFfY3JlYXRlX3NlcnZlcl9jb25maWcsCS8qIHNlcnZlciBjb25maWcgKi8KLSAgICBtdmFfbWVyZ2Vfc2VydmVyX2NvbmZpZywJLyogbWVyZ2Ugc2VydmVyIGNvbmZpZ3MgKi8KLSAgICBtdmFfY29tbWFuZHMsCQkvKiBjb21tYW5kIHRhYmxlICovCi0gICAgTlVMTCwJCQkvKiBoYW5kbGVycyAqLwotICAgIG12YV90cmFuc2xhdGUsCQkvKiBmaWxlbmFtZSB0cmFuc2xhdGlvbiAqLwotICAgIE5VTEwsCQkJLyogY2hlY2tfdXNlcl9pZCAqLwotICAgIE5VTEwsCQkJLyogY2hlY2sgYXV0aCAqLwotICAgIE5VTEwsCQkJLyogY2hlY2sgYWNjZXNzICovCi0gICAgTlVMTCwJCQkvKiB0eXBlX2NoZWNrZXIgKi8KLSAgICBOVUxMLAkJCS8qIGZpeHVwcyAqLwotICAgIE5VTEwsCQkJLyogbG9nZ2VyICovCi0gICAgTlVMTCwJCQkvKiBoZWFkZXIgcGFyc2VyICovCi0gICAgTlVMTCwJCQkvKiBjaGlsZF9pbml0ICovCi0gICAgTlVMTCwJCQkvKiBjaGlsZF9leGl0ICovCi0gICAgTlVMTAkJCS8qIHBvc3QgcmVhZC1yZXF1ZXN0ICovCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tYXBwZXJzL21vZF92aG9zdF9hbGlhcy5kc3AgYi9tb2R1bGVzL21hcHBlcnMvbW9kX3Zob3N0X2FsaWFzLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E4OTJiZi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21hcHBlcnMvbW9kX3Zob3N0X2FsaWFzLmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9Im1vZF92aG9zdF9hbGlhcyIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyCi0KLUNGRz1tb2Rfdmhvc3RfYWxpYXMgLSBXaW4zMiBSZWxlYXNlCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIm1vZF92aG9zdF9hbGlhcy5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIm1vZF92aG9zdF9hbGlhcy5tYWsiIENGRz0ibW9kX3Zob3N0X2FsaWFzIC0gV2luMzIgUmVsZWFzZSIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJtb2Rfdmhvc3RfYWxpYXMgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFICJtb2Rfdmhvc3RfYWxpYXMgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLU1UTD1taWRsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJtb2Rfdmhvc3RfYWxpYXMgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9JICIuLlwuLlxpbmNsdWRlIiAvSSAiLi5cLi5cb3Ncd2luMzIiIC9JICIuLlwuLlxzcmNsaWJcYXByXGluY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9GZCJSZWxlYXNlXG1vZF92aG9zdF9hbGlhcyIgL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9tYWNoaW5lOkkzODYgL291dDoiUmVsZWFzZS9tb2Rfdmhvc3RfYWxpYXMuc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX3Zob3N0X2FsaWFzCi0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvbWFjaGluZTpJMzg2IC9vdXQ6IlJlbGVhc2UvbW9kX3Zob3N0X2FsaWFzLnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF92aG9zdF9hbGlhcwotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibW9kX3Zob3N0X2FsaWFzIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HWCAvWmkgL09kIC9JICIuLlwuLlxpbmNsdWRlIiAvSSAiLi5cLi5cb3Ncd2luMzIiIC9JICIuLlwuLlxzcmNsaWJcYXByXGluY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9GZCJEZWJ1Z1xtb2Rfdmhvc3RfYWxpYXMiIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2luY3JlbWVudGFsOm5vIC9tYXAgL2RlYnVnIC9tYWNoaW5lOkkzODYgL291dDoiRGVidWcvbW9kX3Zob3N0X2FsaWFzLnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF92aG9zdF9hbGlhcwotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9pbmNyZW1lbnRhbDpubyAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6IkRlYnVnL21vZF92aG9zdF9hbGlhcy5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2Rfdmhvc3RfYWxpYXMKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIm1vZF92aG9zdF9hbGlhcyAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgIm1vZF92aG9zdF9hbGlhcyAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2Rfdmhvc3RfYWxpYXMuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kX3Zob3N0X2FsaWFzLnJjCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIm1vZF92aG9zdF9hbGlhcyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQ3JlYXRpbmcgVmVyc2lvbiBSZXNvdXJjZQotSW5wdXRQYXRoPS4uXC4uXGJ1aWxkXHdpbjMyXHdpbjMydmVyLmF3awotCi0iLlxtb2Rfdmhvc3RfYWxpYXMucmMiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JYXdrIC1mIC4uLy4uL2J1aWxkL3dpbjMyL3dpbjMydmVyLmF3ayBtb2Rfdmhvc3RfYWxpYXMgICJ2aG9zdF9hbGlhc19tb2R1bGUgZm9yIEFwYWNoZSIgLi4vLi4vaW5jbHVkZS9hcF9yZWxlYXNlLmggPiAuXG1vZF92aG9zdF9hbGlhcy5yYwotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIm1vZF92aG9zdF9hbGlhcyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIENyZWF0aW5nIFZlcnNpb24gUmVzb3VyY2UKLUlucHV0UGF0aD0uLlwuLlxidWlsZFx3aW4zMlx3aW4zMnZlci5hd2sKLQotIi5cbW9kX3Zob3N0X2FsaWFzLnJjIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCWF3ayAtZiAuLi8uLi9idWlsZC93aW4zMi93aW4zMnZlci5hd2sgbW9kX3Zob3N0X2FsaWFzICAidmhvc3RfYWxpYXNfbW9kdWxlIGZvciBBcGFjaGUiIC4uLy4uL2luY2x1ZGUvYXBfcmVsZWFzZS5oID4gLlxtb2Rfdmhvc3RfYWxpYXMucmMKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tYXBwZXJzL21vZF92aG9zdF9hbGlhcy5leHAgYi9tb2R1bGVzL21hcHBlcnMvbW9kX3Zob3N0X2FsaWFzLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE3NjY2Zi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21hcHBlcnMvbW9kX3Zob3N0X2FsaWFzLmV4cAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXZob3N0X2FsaWFzX21vZHVsZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tZXRhZGF0YS8uY3ZzaWdub3JlIGIvbW9kdWxlcy9tZXRhZGF0YS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmY3YTcwLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWV0YWRhdGEvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS5kZXBzCi0ubGlicwotKi5sYQotbW9kdWxlcy5tawotTWFrZWZpbGUKLSoubG8KLSouc2xvCi0qLnNvCi0qLmRsbAotKi5kZWYKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWV0YWRhdGEvLmluZGVudC5wcm8gYi9tb2R1bGVzL21ldGFkYXRhLy5pbmRlbnQucHJvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWZiZTlmLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWV0YWRhdGEvLmluZGVudC5wcm8KKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0taTQgLW5wc2wgLWRpMCAtYnIgLW5jZSAtZDAgLWNsaTAgLW5wY3MgLW5mYzEKLS1UQlVGRgotLVRGSUxFCi0tVFRSQU5TCi0tVFVJTlQ0Ci0tVF90cmFucwotLVRhbGxvd19vcHRpb25zX3QKLS1UYXBhY2hlX3NmaW8KLS1UYXJyYXlfaGVhZGVyCi0tVGJvb2xfaW50Ci0tVGJ1Zl9hcmVhCi0tVGJ1ZmZfc3RydWN0Ci0tVGJ1ZmZ5Ci0tVGNtZF9ob3cKLS1UY21kX3Bhcm1zCi0tVGNvbW1hbmRfcmVjCi0tVGNvbW1hbmRfc3RydWN0Ci0tVGNvbm5fcmVjCi0tVGNvcmVfZGlyX2NvbmZpZwotLVRjb3JlX3NlcnZlcl9jb25maWcKLS1UZGlyX21ha2VyX2Z1bmMKLS1UZXZlbnQKLS1UZ2xvYmFsc19zCi0tVGhhbmRsZXJfZnVuYwotLVRoYW5kbGVyX3JlYwotLVRqb2JsaXN0X3MKLS1UbGlzdGVuX3JlYwotLVRtZXJnZXJfZnVuYwotLVRtb2RlX3QKLS1UbW9kdWxlCi0tVG1vZHVsZV9zdHJ1Y3QKLS1UbXV0ZXgKLS1Ubl9sb25nCi0tVG90aGVyX2NoaWxkX3JlYwotLVRvdmVycmlkZXNfdAotLVRwYXJlbnRfc2NvcmUKLS1UcGlkX3QKLS1UcGlwZWRfbG9nCi0tVHBvb2wKLS1UcmVxdWVzdF9yZWMKLS1UcmVxdWlyZV9saW5lCi0tVHJsaW1fdAotLVRzY29yZWJvYXJkCi0tVHNlbWFwaG9yZQotLVRzZXJ2ZXJfYWRkcl9yZWMKLS1Uc2VydmVyX3JlYwotLVRzZXJ2ZXJfcmVjX2NoYWluCi0tVHNob3J0X3Njb3JlCi0tVHRhYmxlCi0tVHRhYmxlX2VudHJ5Ci0tVHRocmVhZAotLVR1X3dpZGVfaW50Ci0tVHZ0aW1lX3QKLS1Ud2lkZV9pbnQKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWV0YWRhdGEvTWFrZWZpbGUuaW4gYi9tb2R1bGVzL21ldGFkYXRhL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjdiMzQzLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWV0YWRhdGEvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotaW5jbHVkZSAkKHRvcF9zcmNkaXIpL2J1aWxkL3NwZWNpYWwubWsKLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tZXRhZGF0YS9OV0dOVWNlcm5tZXRhIGIvbW9kdWxlcy9tZXRhZGF0YS9OV0dOVWNlcm5tZXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmM0Y2FiLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWV0YWRhdGEvTldHTlVjZXJubWV0YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0jCi0jIE1ha2Ugc3VyZSBhbGwgbmVlZGVkIG1hY3JvJ3MgYXJlIGRlZmluZWQKLSMKLQotIwotIyBHZXQgdGhlICdoZWFkJyBvZiB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaWYgbmVjZXNzYXJ5LiAgVGhpcyBpbmNsdWRlcyBkZWZhdWx0Ci0jIHRhcmdldHMgYW5kIHBhdGhzIHRvIHRvb2xzCi0jCi0KLWlmbmRlZiBFbnZpcm9ubWVudERlZmluZWQKLWluY2x1ZGUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jCi1lbmRpZgotCi0jCi0jIFRoZXNlIGRpcmVjdG9yaWVzIHdpbGwgYmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5jbHVkZSBsaXN0LCBmb2xsb3dlZCBieQotIyBJTkNESVJTCi0jCi1YSU5DRElSUwkrPSBcCi0JCQkkKEFQX1dPUkspL2luY2x1ZGUgXAotCQkJJChOV09TKSBcCi0JCQkkKEFQX1dPUkspL21vZHVsZXMvYXJjaC9uZXR3YXJlIFwKLQkJCSQoQVBfV09SSykvc3JjbGliL2Fwci9pbmNsdWRlIFwKLQkJCSQoQVBfV09SSykvc3JjbGliL2Fwci11dGlsL2luY2x1ZGUgXAotCQkJJChBUF9XT1JLKS9zcmNsaWIvYXByIFwKLQkJCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGZsYWdzIHdpbGwgY29tZSBhZnRlciBDRkxBR1MKLSMKLVhDRkxBR1MJCSs9IFwKLQkJCS1wcmVmaXggcHJlX253LmggXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZGVmaW5lcyB3aWxsIGNvbWUgYWZ0ZXIgREVGSU5FUwotIwotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZmxhZ3Mgd2lsbCBiZSBhZGRlZCB0byB0aGUgbGluay5vcHQgZmlsZQotIwotWExGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgdmFsdWVzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGNvcnJlY3QgdmFyaWFibGVzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZgotIyBSRUxFQVNFCi0jCi1pZmVxICIkKFJFTEVBU0UpIiAiZGVidWciCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCSAgIAkkKEVPTElTVCkKLWVuZGlmCi0KLWlmZXEgIiQoUkVMRUFTRSkiICJub29wdCIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJICAgCSQoRU9MSVNUKQotZW5kaWYKLQotaWZlcSAiJChSRUxFQVNFKSIgInJlbGVhc2UiCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLWVuZGlmCi0KLSMKLSMgVGhlc2UgYXJlIHVzZWQgYnkgdGhlIGxpbmsgdGFyZ2V0IGlmIGFuIE5MTSBpcyBiZWluZyBnZW5lcmF0ZWQKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rICduYW1lJyBkaXJlY3RpdmUgdG8gbmFtZSB0aGUgbmxtLiAgSWYgbGVmdCBibGFuawotIyBUQVJHRVRfbmxtIChzZWUgYmVsb3cpIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9OQU1FCQk9IGNlcm5tZXRhCi0KLSMKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rICctZGVzYyAnIGRpcmVjdGl2ZS4gCi0jIElmIGxlZnQgYmxhbmssIE5MTV9OQU1FIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9ERVNDUklQVElPTgk9IENFUk4gTWV0YSBNb2R1bGUKLQotIwotIyBUaGlzIGlzIHVzZWQgYnkgdGhlICctdGhyZWFkbmFtZScgZGlyZWN0aXZlLiAgSWYgbGVmdCBibGFuaywKLSMgTkxNX05BTUUgVGhyZWFkIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9USFJFQURfTkFNRQk9IENFUk4gTWV0YSBNb2R1bGUKLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSBWRVJTSU9OIHZhbHVlIGluIAotIyAkKEFQX1dPUkspXGJ1aWxkXE5XR05VZW52aXJvbm1lbnQuaW5jCi0jCi1OTE1fVkVSU0lPTgkJPQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG9mIDY0SwotIwotTkxNX1NUQUNLX1NJWkUJPSA4MTkyCi0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1lbnRyeScgZGlyZWN0aXZlCi0jCi1OTE1fRU5UUllfU1lNCT0gX0xpYkNQcmVsdWRlCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZXhpdCcgZGlyZWN0aXZlCi0jCi1OTE1fRVhJVF9TWU0JPSBfTGliQ1Bvc3RsdWRlCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctY2hlY2snIGRpcmVjdGl2ZQotIwotTkxNX0NIRUNLX1NZTQk9Ci0KLSMKLSMgSWYgdGhlc2UgYXJlIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1mbGFncycgZGlyZWN0aXZlCi0jCi1OTE1fRkxBR1MJCT0gIEFVVE9VTkxPQUQsIFBTRVVET1BSRUVNUFRJT04KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIGxpbmtlZCBpbiB3aXRoIHRoZSBYRENEYXRhIG9wdGlvbiBpbiB0aGUgZGVmIAotIyBmaWxlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb2YgJChOV09TKS9hcGFjaGUueGRjLiAgWERDRGF0YSBjYW4gYmUgZGlzYWJsZWQKLSMgYnkgc2V0dGluZyBBUEFDSEVfVU5JUFJPQyBpbiB0aGUgZW52aXJvbm1lbnQKLSMKLVhEQ0RBVEEgICAgICAgICA9IAotCi0jCi0jIElmIHRoZXJlIGlzIGFuIE5MTSB0YXJnZXQsIHB1dCBpdCBoZXJlCi0jCi1UQVJHRVRfbmxtID0gXAotCSQoT0JKRElSKS9jZXJubWV0YS5ubG0gXAotCSQoRU9MSVNUKQotCi0jCi0jIElmIHRoZXJlIGlzIGFuIExJQiB0YXJnZXQsIHB1dCBpdCBoZXJlCi0jCi1UQVJHRVRfbGliID0gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgT0JKIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIE5MTSB0YXJnZXQgYWJvdmUuCi0jIFBhdGhzIG11c3QgYWxsIHVzZSB0aGUgJy8nIGNoYXJhY3RlcgotIwotRklMRVNfbmxtX29ianMgPSBcCi0JJChPQkpESVIpL21vZF9jZXJuX21ldGEubyBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBMSUIgZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTkxNIHRhcmdldCBhYm92ZS4KLSMgVGhlc2Ugd2lsbCBiZSBhZGRlZCBhcyBhIGxpYnJhcnkgY29tbWFuZCBpbiB0aGUgbGluay5vcHQgZmlsZS4KLSMKLUZJTEVTX25sbV9saWJzID0gXAotICAgCWxpYmNwcmUubyBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBtb2R1bGVzIHRoYXQgdGhlIGFib3ZlIE5MTSB0YXJnZXQgZGVwZW5kcyBvbiB0byBsb2FkLgotIyBUaGVzZSB3aWxsIGJlIGFkZGVkIGFzIGEgbW9kdWxlIGNvbW1hbmQgaW4gdGhlIGxpbmsub3B0IGZpbGUuCi0jCi1GSUxFU19ubG1fbW9kdWxlcyA9IFwKLQlhcHJsaWIgXAotCWxpYmMgXAotCSQoRU9MSVNUKQotCi0jCi0jIElmIHRoZSBubG0gaGFzIGEgbXNnIGZpbGUsIHB1dCBpdCdzIHBhdGggaGVyZQotIwotRklMRV9ubG1fbXNnID0KLSAKLSMKLSMgSWYgdGhlIG5sbSBoYXMgYSBobHAgZmlsZSBwdXQgaXQncyBwYXRoIGhlcmUKLSMKLUZJTEVfbmxtX2hscCA9Ci0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgJChOV09TKVxjb3B5cmlnaHQudHh0LgotIwotRklMRV9ubG1fY29weXJpZ2h0ID0KLQotIwotIyBBbnkgYWRkaXRpb25hbCBpbXBvcnRzIGdvIGhlcmUKLSMKLUZJTEVTX25sbV9YaW1wb3J0cyA9IFwKLQlAJChBUFIpL2FwcmxpYi5pbXAgXAotCUAkKE5XT1MpL2h0dHBkLmltcCBcCi0JQGxpYmMuaW1wIFwKLQkkKEVPTElTVCkKLSAKLSMgICAKLSMgQW55IHN5bWJvbHMgZXhwb3J0ZWQgdG8gaGVyZQotIwotRklMRVNfbmxtX2V4cG9ydHMgPSBcCi0JY2Vybl9tZXRhX21vZHVsZSBcCi0JJChFT0xJU1QpCi0JCi0jICAgCi0jIFRoZXNlIGFyZSB0aGUgT0JKIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIExJQiB0YXJnZXQgYWJvdmUuCi0jIFBhdGhzIG11c3QgYWxsIHVzZSB0aGUgJy8nIGNoYXJhY3RlcgotIwotRklMRVNfbGliX29ianMgPSBcCi0JCSQoRU9MSVNUKQotCi0jCi0jIGltcGxlbWVudCB0YXJnZXRzIGFuZCBkZXBlbmRhbmNpZXMgKGxlYXZlIHRoaXMgc2VjdGlvbiBhbG9uZSkKLSMKLQotbGlicyA6OiAkKE9CSkRJUikgJChUQVJHRVRfbGliKQotCi1ubG1zIDo6IGxpYnMgJChUQVJHRVRfbmxtKQotCi0jCi0jIFVwZGF0ZWQgdGhpcyB0YXJnZXQgdG8gY3JlYXRlIG5lY2Vzc2FyeSBkaXJlY3RvcmllcyBhbmQgY29weSBmaWxlcyB0byB0aGUgCi0jIGNvcnJlY3QgcGxhY2UuICAoU2VlICQoQVBfV09SSylcYnVpbGRcTldHTlVoZWFkLmluYyBmb3IgZXhhbXBsZXMpCi0jCi1pbnN0YWxsIDo6IG5sbXMgRk9SQ0UKLQotIwotIyBBbnkgc3BlY2lhbGl6ZWQgcnVsZXMgaGVyZQotIwotCi0jCi0jIEluY2x1ZGUgdGhlICd0YWlsJyBtYWtlZmlsZSB0aGF0IGhhcyB0YXJnZXRzIHRoYXQgZGVwZW5kIG9uIHZhcmlhYmxlcyBkZWZpbmVkCi0jIGluIHRoaXMgbWFrZWZpbGUKLSMKLQotaW5jbHVkZSAkKEFQX1dPUkspXGJ1aWxkXE5XR05VdGFpbC5pbmMKLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tZXRhZGF0YS9OV0dOVWV4cGlyZXMgYi9tb2R1bGVzL21ldGFkYXRhL05XR05VZXhwaXJlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU1ZmEwZC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21ldGFkYXRhL05XR05VZXhwaXJlcworKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0jCi0jIE1ha2Ugc3VyZSBhbGwgbmVlZGVkIG1hY3JvJ3MgYXJlIGRlZmluZWQKLSMKLQotIwotIyBHZXQgdGhlICdoZWFkJyBvZiB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaWYgbmVjZXNzYXJ5LiAgVGhpcyBpbmNsdWRlcyBkZWZhdWx0Ci0jIHRhcmdldHMgYW5kIHBhdGhzIHRvIHRvb2xzCi0jCi0KLWlmbmRlZiBFbnZpcm9ubWVudERlZmluZWQKLWluY2x1ZGUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jCi1lbmRpZgotCi0jCi0jIFRoZXNlIGRpcmVjdG9yaWVzIHdpbGwgYmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5jbHVkZSBsaXN0LCBmb2xsb3dlZCBieQotIyBJTkNESVJTCi0jCi1YSU5DRElSUwkrPSBcCi0JCQkkKEFQX1dPUkspL2luY2x1ZGUgXAotCQkJJChOV09TKSBcCi0JCQkkKEFQX1dPUkspL21vZHVsZXMvYXJjaC9uZXR3YXJlIFwKLQkJCSQoQVBfV09SSykvc3JjbGliL2Fwci9pbmNsdWRlIFwKLQkJCSQoQVBfV09SSykvc3JjbGliL2Fwci11dGlsL2luY2x1ZGUgXAotCQkJJChBUF9XT1JLKS9zcmNsaWIvYXByIFwKLQkJCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGZsYWdzIHdpbGwgY29tZSBhZnRlciBDRkxBR1MKLSMKLVhDRkxBR1MJCSs9IFwKLQkJCS1wcmVmaXggcHJlX253LmggXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZGVmaW5lcyB3aWxsIGNvbWUgYWZ0ZXIgREVGSU5FUwotIwotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZmxhZ3Mgd2lsbCBiZSBhZGRlZCB0byB0aGUgbGluay5vcHQgZmlsZQotIwotWExGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgdmFsdWVzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGNvcnJlY3QgdmFyaWFibGVzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZgotIyBSRUxFQVNFCi0jCi1pZmVxICIkKFJFTEVBU0UpIiAiZGVidWciCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCSAgIAkkKEVPTElTVCkKLWVuZGlmCi0KLWlmZXEgIiQoUkVMRUFTRSkiICJub29wdCIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJICAgCSQoRU9MSVNUKQotZW5kaWYKLQotaWZlcSAiJChSRUxFQVNFKSIgInJlbGVhc2UiCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLWVuZGlmCi0KLSMKLSMgVGhlc2UgYXJlIHVzZWQgYnkgdGhlIGxpbmsgdGFyZ2V0IGlmIGFuIE5MTSBpcyBiZWluZyBnZW5lcmF0ZWQKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rICduYW1lJyBkaXJlY3RpdmUgdG8gbmFtZSB0aGUgbmxtLiAgSWYgbGVmdCBibGFuawotIyBUQVJHRVRfbmxtIChzZWUgYmVsb3cpIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9OQU1FCQk9IGV4cGlyZXMKLQotIwotIyBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmsgJy1kZXNjICcgZGlyZWN0aXZlLiAKLSMgSWYgbGVmdCBibGFuaywgTkxNX05BTUUgd2lsbCBiZSB1c2VkLgotIwotTkxNX0RFU0NSSVBUSU9OCT0gRXhwaXJlcyBNb2R1bGUKLQotIwotIyBUaGlzIGlzIHVzZWQgYnkgdGhlICctdGhyZWFkbmFtZScgZGlyZWN0aXZlLiAgSWYgbGVmdCBibGFuaywKLSMgTkxNX05BTUUgVGhyZWFkIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9USFJFQURfTkFNRQk9IEV4cGlyZXMgTW9kdWxlCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgVkVSU0lPTiB2YWx1ZSBpbiAKLSMgJChBUF9XT1JLKVxidWlsZFxOV0dOVWVudmlyb25tZW50LmluYwotIwotTkxNX1ZFUlNJT04JCT0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBvZiA2NEsKLSMKLU5MTV9TVEFDS19TSVpFCT0gODE5MgotCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZW50cnknIGRpcmVjdGl2ZQotIwotTkxNX0VOVFJZX1NZTQk9IF9MaWJDUHJlbHVkZQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWV4aXQnIGRpcmVjdGl2ZQotIwotTkxNX0VYSVRfU1lNCT0gX0xpYkNQb3N0bHVkZQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWNoZWNrJyBkaXJlY3RpdmUKLSMKLU5MTV9DSEVDS19TWU0JPQotCi0jCi0jIElmIHRoZXNlIGFyZSBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZmxhZ3MnIGRpcmVjdGl2ZQotIwotTkxNX0ZMQUdTCQk9ICBBVVRPVU5MT0FELCBQU0VVRE9QUkVFTVBUSU9OCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSBsaW5rZWQgaW4gd2l0aCB0aGUgWERDRGF0YSBvcHRpb24gaW4gdGhlIGRlZiAKLSMgZmlsZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG9mICQoTldPUykvYXBhY2hlLnhkYy4gIFhEQ0RhdGEgY2FuIGJlIGRpc2FibGVkCi0jIGJ5IHNldHRpbmcgQVBBQ0hFX1VOSVBST0MgaW4gdGhlIGVudmlyb25tZW50Ci0jCi1YRENEQVRBICAgICAgICAgPSAKLQotIwotIyBJZiB0aGVyZSBpcyBhbiBOTE0gdGFyZ2V0LCBwdXQgaXQgaGVyZQotIwotVEFSR0VUX25sbSA9IFwKLQkkKE9CSkRJUikvZXhwaXJlcy5ubG0gXAotCSQoRU9MSVNUKQotCi0jCi0jIElmIHRoZXJlIGlzIGFuIExJQiB0YXJnZXQsIHB1dCBpdCBoZXJlCi0jCi1UQVJHRVRfbGliID0gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgT0JKIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIE5MTSB0YXJnZXQgYWJvdmUuCi0jIFBhdGhzIG11c3QgYWxsIHVzZSB0aGUgJy8nIGNoYXJhY3RlcgotIwotRklMRVNfbmxtX29ianMgPSBcCi0JJChPQkpESVIpL21vZF9leHBpcmVzLm8gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgTElCIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIE5MTSB0YXJnZXQgYWJvdmUuCi0jIFRoZXNlIHdpbGwgYmUgYWRkZWQgYXMgYSBsaWJyYXJ5IGNvbW1hbmQgaW4gdGhlIGxpbmsub3B0IGZpbGUuCi0jCi1GSUxFU19ubG1fbGlicyA9IFwKLSAgIAlsaWJjcHJlLm8gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgbW9kdWxlcyB0aGF0IHRoZSBhYm92ZSBOTE0gdGFyZ2V0IGRlcGVuZHMgb24gdG8gbG9hZC4KLSMgVGhlc2Ugd2lsbCBiZSBhZGRlZCBhcyBhIG1vZHVsZSBjb21tYW5kIGluIHRoZSBsaW5rLm9wdCBmaWxlLgotIwotRklMRVNfbmxtX21vZHVsZXMgPSBcCi0JYXBybGliIFwKLQlsaWJjIFwKLQkkKEVPTElTVCkKLQotIwotIyBJZiB0aGUgbmxtIGhhcyBhIG1zZyBmaWxlLCBwdXQgaXQncyBwYXRoIGhlcmUKLSMKLUZJTEVfbmxtX21zZyA9Ci0gCi0jCi0jIElmIHRoZSBubG0gaGFzIGEgaGxwIGZpbGUgcHV0IGl0J3MgcGF0aCBoZXJlCi0jCi1GSUxFX25sbV9obHAgPQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlICQoTldPUylcY29weXJpZ2h0LnR4dC4KLSMKLUZJTEVfbmxtX2NvcHlyaWdodCA9Ci0KLSMKLSMgQW55IGFkZGl0aW9uYWwgaW1wb3J0cyBnbyBoZXJlCi0jCi1GSUxFU19ubG1fWGltcG9ydHMgPSBcCi0JQCQoQVBSKS9hcHJsaWIuaW1wIFwKLQlAJChOV09TKS9odHRwZC5pbXAgXAotCUBsaWJjLmltcCBcCi0JJChFT0xJU1QpCi0gCi0jICAgCi0jIEFueSBzeW1ib2xzIGV4cG9ydGVkIHRvIGhlcmUKLSMKLUZJTEVTX25sbV9leHBvcnRzID0gXAotCWV4cGlyZXNfbW9kdWxlIFwKLQkkKEVPTElTVCkKLQkKLSMgICAKLSMgVGhlc2UgYXJlIHRoZSBPQkogZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTElCIHRhcmdldCBhYm92ZS4KLSMgUGF0aHMgbXVzdCBhbGwgdXNlIHRoZSAnLycgY2hhcmFjdGVyCi0jCi1GSUxFU19saWJfb2JqcyA9IFwKLQkJJChFT0xJU1QpCi0KLSMKLSMgaW1wbGVtZW50IHRhcmdldHMgYW5kIGRlcGVuZGFuY2llcyAobGVhdmUgdGhpcyBzZWN0aW9uIGFsb25lKQotIwotCi1saWJzIDo6ICQoT0JKRElSKSAkKFRBUkdFVF9saWIpCi0KLW5sbXMgOjogbGlicyAkKFRBUkdFVF9ubG0pCi0KLSMKLSMgVXBkYXRlZCB0aGlzIHRhcmdldCB0byBjcmVhdGUgbmVjZXNzYXJ5IGRpcmVjdG9yaWVzIGFuZCBjb3B5IGZpbGVzIHRvIHRoZSAKLSMgY29ycmVjdCBwbGFjZS4gIChTZWUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jIGZvciBleGFtcGxlcykKLSMKLWluc3RhbGwgOjogbmxtcyBGT1JDRQotCi0jCi0jIEFueSBzcGVjaWFsaXplZCBydWxlcyBoZXJlCi0jCi0KLSMKLSMgSW5jbHVkZSB0aGUgJ3RhaWwnIG1ha2VmaWxlIHRoYXQgaGFzIHRhcmdldHMgdGhhdCBkZXBlbmQgb24gdmFyaWFibGVzIGRlZmluZWQKLSMgaW4gdGhpcyBtYWtlZmlsZQotIwotCi1pbmNsdWRlICQoQVBfV09SSylcYnVpbGRcTldHTlV0YWlsLmluYwotCmRpZmYgLS1naXQgYS9tb2R1bGVzL21ldGFkYXRhL05XR05VaGVhZGVycyBiL21vZHVsZXMvbWV0YWRhdGEvTldHTlVoZWFkZXJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGJlNThlLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWV0YWRhdGEvTldHTlVoZWFkZXJzCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLSMKLSMgTWFrZSBzdXJlIGFsbCBuZWVkZWQgbWFjcm8ncyBhcmUgZGVmaW5lZAotIwotCi0jCi0jIEdldCB0aGUgJ2hlYWQnIG9mIHRoZSBidWlsZCBlbnZpcm9ubWVudCBpZiBuZWNlc3NhcnkuICBUaGlzIGluY2x1ZGVzIGRlZmF1bHQKLSMgdGFyZ2V0cyBhbmQgcGF0aHMgdG8gdG9vbHMKLSMKLQotaWZuZGVmIEVudmlyb25tZW50RGVmaW5lZAotaW5jbHVkZSAkKEFQX1dPUkspXGJ1aWxkXE5XR05VaGVhZC5pbmMKLWVuZGlmCi0KLSMKLSMgVGhlc2UgZGlyZWN0b3JpZXMgd2lsbCBiZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbmNsdWRlIGxpc3QsIGZvbGxvd2VkIGJ5Ci0jIElOQ0RJUlMKLSMKLVhJTkNESVJTCSs9IFwKLQkJCSQoQVBfV09SSykvaW5jbHVkZSBcCi0JCQkkKE5XT1MpIFwKLQkJCSQoQVBfV09SSykvbW9kdWxlcy9hcmNoL25ldHdhcmUgXAotCQkJJChBUF9XT1JLKS9zcmNsaWIvYXByL2luY2x1ZGUgXAotCQkJJChBUF9XT1JLKS9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSBcCi0JCQkkKEFQX1dPUkspL3NyY2xpYi9hcHIgXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZmxhZ3Mgd2lsbCBjb21lIGFmdGVyIENGTEFHUwotIwotWENGTEFHUwkJKz0gXAotCQkJLXByZWZpeCBwcmVfbncuaCBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBkZWZpbmVzIHdpbGwgY29tZSBhZnRlciBERUZJTkVTCi0jCi1YREVGSU5FUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBmbGFncyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaW5rLm9wdCBmaWxlCi0jCi1YTEZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSB2YWx1ZXMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgY29ycmVjdCB2YXJpYWJsZXMgYmFzZWQgb24gdGhlIHZhbHVlIG9mCi0jIFJFTEVBU0UKLSMKLWlmZXEgIiQoUkVMRUFTRSkiICJkZWJ1ZyIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJICAgCSQoRU9MSVNUKQotZW5kaWYKLQotaWZlcSAiJChSRUxFQVNFKSIgIm5vb3B0IgotWElOQ0RJUlMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhDRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YREVGSU5FUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWExGTEFHUwkJKz0gXAotCQkgICAJJChFT0xJU1QpCi1lbmRpZgotCi1pZmVxICIkKFJFTEVBU0UpIiAicmVsZWFzZSIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotZW5kaWYKLQotIwotIyBUaGVzZSBhcmUgdXNlZCBieSB0aGUgbGluayB0YXJnZXQgaWYgYW4gTkxNIGlzIGJlaW5nIGdlbmVyYXRlZAotIyBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmsgJ25hbWUnIGRpcmVjdGl2ZSB0byBuYW1lIHRoZSBubG0uICBJZiBsZWZ0IGJsYW5rCi0jIFRBUkdFVF9ubG0gKHNlZSBiZWxvdykgd2lsbCBiZSB1c2VkLgotIwotTkxNX05BTUUJCT0gaGVhZGVycwotCi0jCi0jIFRoaXMgaXMgdXNlZCBieSB0aGUgbGluayAnLWRlc2MgJyBkaXJlY3RpdmUuIAotIyBJZiBsZWZ0IGJsYW5rLCBOTE1fTkFNRSB3aWxsIGJlIHVzZWQuCi0jCi1OTE1fREVTQ1JJUFRJT04JPSBIZWFkZXJzIE1vZHVsZQotCi0jCi0jIFRoaXMgaXMgdXNlZCBieSB0aGUgJy10aHJlYWRuYW1lJyBkaXJlY3RpdmUuICBJZiBsZWZ0IGJsYW5rLAotIyBOTE1fTkFNRSBUaHJlYWQgd2lsbCBiZSB1c2VkLgotIwotTkxNX1RIUkVBRF9OQU1FCT0gSGVhZGVycyBNb2R1bGUKLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSBWRVJTSU9OIHZhbHVlIGluIAotIyAkKEFQX1dPUkspXGJ1aWxkXE5XR05VZW52aXJvbm1lbnQuaW5jCi0jCi1OTE1fVkVSU0lPTgkJPQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG9mIDY0SwotIwotTkxNX1NUQUNLX1NJWkUJPSA4MTkyCi0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1lbnRyeScgZGlyZWN0aXZlCi0jCi1OTE1fRU5UUllfU1lNCT0gX0xpYkNQcmVsdWRlCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZXhpdCcgZGlyZWN0aXZlCi0jCi1OTE1fRVhJVF9TWU0JPSBfTGliQ1Bvc3RsdWRlCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctY2hlY2snIGRpcmVjdGl2ZQotIwotTkxNX0NIRUNLX1NZTQk9Ci0KLSMKLSMgSWYgdGhlc2UgYXJlIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1mbGFncycgZGlyZWN0aXZlCi0jCi1OTE1fRkxBR1MJCT0gIEFVVE9VTkxPQUQsIFBTRVVET1BSRUVNUFRJT04KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIGxpbmtlZCBpbiB3aXRoIHRoZSBYRENEYXRhIG9wdGlvbiBpbiB0aGUgZGVmIAotIyBmaWxlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb2YgJChOV09TKS9hcGFjaGUueGRjLiAgWERDRGF0YSBjYW4gYmUgZGlzYWJsZWQKLSMgYnkgc2V0dGluZyBBUEFDSEVfVU5JUFJPQyBpbiB0aGUgZW52aXJvbm1lbnQKLSMKLVhEQ0RBVEEgICAgICAgICA9IAotCi0jCi0jIElmIHRoZXJlIGlzIGFuIE5MTSB0YXJnZXQsIHB1dCBpdCBoZXJlCi0jCi1UQVJHRVRfbmxtID0gXAotCSQoT0JKRElSKS9oZWFkZXJzLm5sbSBcCi0JJChFT0xJU1QpCi0KLSMKLSMgSWYgdGhlcmUgaXMgYW4gTElCIHRhcmdldCwgcHV0IGl0IGhlcmUKLSMKLVRBUkdFVF9saWIgPSBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBPQkogZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTkxNIHRhcmdldCBhYm92ZS4KLSMgUGF0aHMgbXVzdCBhbGwgdXNlIHRoZSAnLycgY2hhcmFjdGVyCi0jCi1GSUxFU19ubG1fb2JqcyA9IFwKLQkkKE9CSkRJUikvbW9kX2hlYWRlcnMubyBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBMSUIgZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTkxNIHRhcmdldCBhYm92ZS4KLSMgVGhlc2Ugd2lsbCBiZSBhZGRlZCBhcyBhIGxpYnJhcnkgY29tbWFuZCBpbiB0aGUgbGluay5vcHQgZmlsZS4KLSMKLUZJTEVTX25sbV9saWJzID0gXAotICAgCWxpYmNwcmUubyBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBtb2R1bGVzIHRoYXQgdGhlIGFib3ZlIE5MTSB0YXJnZXQgZGVwZW5kcyBvbiB0byBsb2FkLgotIyBUaGVzZSB3aWxsIGJlIGFkZGVkIGFzIGEgbW9kdWxlIGNvbW1hbmQgaW4gdGhlIGxpbmsub3B0IGZpbGUuCi0jCi1GSUxFU19ubG1fbW9kdWxlcyA9IFwKLQlhcHJsaWIgXAotCWxpYmMgXAotCSQoRU9MSVNUKQotCi0jCi0jIElmIHRoZSBubG0gaGFzIGEgbXNnIGZpbGUsIHB1dCBpdCdzIHBhdGggaGVyZQotIwotRklMRV9ubG1fbXNnID0KLSAKLSMKLSMgSWYgdGhlIG5sbSBoYXMgYSBobHAgZmlsZSBwdXQgaXQncyBwYXRoIGhlcmUKLSMKLUZJTEVfbmxtX2hscCA9Ci0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgJChOV09TKVxjb3B5cmlnaHQudHh0LgotIwotRklMRV9ubG1fY29weXJpZ2h0ID0KLQotIwotIyBBbnkgYWRkaXRpb25hbCBpbXBvcnRzIGdvIGhlcmUKLSMKLUZJTEVTX25sbV9YaW1wb3J0cyA9IFwKLQlAJChBUFIpL2FwcmxpYi5pbXAgXAotCUAkKE5XT1MpL2h0dHBkLmltcCBcCi0JQGxpYmMuaW1wIFwKLQkkKEVPTElTVCkKLSAKLSMgICAKLSMgQW55IHN5bWJvbHMgZXhwb3J0ZWQgdG8gaGVyZQotIwotRklMRVNfbmxtX2V4cG9ydHMgPSBcCi0JaGVhZGVyc19tb2R1bGUgXAotCSQoRU9MSVNUKQotCQotIyAgIAotIyBUaGVzZSBhcmUgdGhlIE9CSiBmaWxlcyBuZWVkZWQgdG8gY3JlYXRlIHRoZSBMSUIgdGFyZ2V0IGFib3ZlLgotIyBQYXRocyBtdXN0IGFsbCB1c2UgdGhlICcvJyBjaGFyYWN0ZXIKLSMKLUZJTEVTX2xpYl9vYmpzID0gXAotCQkkKEVPTElTVCkKLQotIwotIyBpbXBsZW1lbnQgdGFyZ2V0cyBhbmQgZGVwZW5kYW5jaWVzIChsZWF2ZSB0aGlzIHNlY3Rpb24gYWxvbmUpCi0jCi0KLWxpYnMgOjogJChPQkpESVIpICQoVEFSR0VUX2xpYikKLQotbmxtcyA6OiBsaWJzICQoVEFSR0VUX25sbSkKLQotIwotIyBVcGRhdGVkIHRoaXMgdGFyZ2V0IHRvIGNyZWF0ZSBuZWNlc3NhcnkgZGlyZWN0b3JpZXMgYW5kIGNvcHkgZmlsZXMgdG8gdGhlIAotIyBjb3JyZWN0IHBsYWNlLiAgKFNlZSAkKEFQX1dPUkspXGJ1aWxkXE5XR05VaGVhZC5pbmMgZm9yIGV4YW1wbGVzKQotIwotaW5zdGFsbCA6OiBubG1zIEZPUkNFCi0KLSMKLSMgQW55IHNwZWNpYWxpemVkIHJ1bGVzIGhlcmUKLSMKLQotIwotIyBJbmNsdWRlIHRoZSAndGFpbCcgbWFrZWZpbGUgdGhhdCBoYXMgdGFyZ2V0cyB0aGF0IGRlcGVuZCBvbiB2YXJpYWJsZXMgZGVmaW5lZAotIyBpbiB0aGlzIG1ha2VmaWxlCi0jCi0KLWluY2x1ZGUgJChBUF9XT1JLKVxidWlsZFxOV0dOVXRhaWwuaW5jCi0KZGlmZiAtLWdpdCBhL21vZHVsZXMvbWV0YWRhdGEvTldHTlVtYWtlZmlsZSBiL21vZHVsZXMvbWV0YWRhdGEvTldHTlVtYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzZTc2Mi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21ldGFkYXRhL05XR05VbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotIwotIyBEZWNsYXJlIHRoZSBzdWItZGlyZWN0b3JpZXMgdG8gYmUgYnVpbHQgaGVyZQotIwotCi1TVUJESVJTID0gXAotCSQoRU9MSVNUKSAKLQotIwotIyBHZXQgdGhlICdoZWFkJyBvZiB0aGUgYnVpbGQgZW52aXJvbm1lbnQuICBUaGlzIGluY2x1ZGVzIGRlZmF1bHQgdGFyZ2V0cyBhbmQKLSMgcGF0aHMgdG8gdG9vbHMKLSMKLQotaW5jbHVkZSAkKEFQX1dPUkspXGJ1aWxkXE5XR05VaGVhZC5pbmMKLQotIwotIyBidWlsZCB0aGlzIGxldmVsJ3MgZmlsZXMKLQotIwotIyBNYWtlIHN1cmUgYWxsIG5lZWRlZCBtYWNybydzIGFyZSBkZWZpbmVkCi0jCi0KLQotIwotIyBUaGVzZSBkaXJlY3RvcmllcyB3aWxsIGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGluY2x1ZGUgbGlzdCwgZm9sbG93ZWQgYnkKLSMgSU5DRElSUwotIwotWElOQ0RJUlMJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZmxhZ3Mgd2lsbCBjb21lIGFmdGVyIENGTEFHUwotIwotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZGVmaW5lcyB3aWxsIGNvbWUgYWZ0ZXIgREVGSU5FUwotIwotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZmxhZ3Mgd2lsbCBiZSBhZGRlZCB0byB0aGUgbGluay5vcHQgZmlsZQotIwotWExGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgdmFsdWVzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGNvcnJlY3QgdmFyaWFibGVzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZgotIyBSRUxFQVNFCi0jCi1pZmVxICIkKFJFTEVBU0UpIiAiZGVidWciCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCSAgIAkkKEVPTElTVCkKLWVuZGlmCi0KLWlmZXEgIiQoUkVMRUFTRSkiICJub29wdCIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJICAgCSQoRU9MSVNUKQotZW5kaWYKLQotaWZlcSAiJChSRUxFQVNFKSIgInJlbGVhc2UiCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLWVuZGlmCi0KLSMKLSMgVGhlc2UgYXJlIHVzZWQgYnkgdGhlIGxpbmsgdGFyZ2V0IGlmIGFuIE5MTSBpcyBiZWluZyBnZW5lcmF0ZWQKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rICduYW1lJyBkaXJlY3RpdmUgdG8gbmFtZSB0aGUgbmxtLiAgSWYgbGVmdCBibGFuawotIyBUQVJHRVRfbmxtIChzZWUgYmVsb3cpIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9OQU1FCQk9Ci0KLSMKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rICctZGVzYyAnIGRpcmVjdGl2ZS4gCi0jIElmIGxlZnQgYmxhbmssIE5MTV9OQU1FIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9ERVNDUklQVElPTgk9Ci0KLSMKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSAnLXRocmVhZG5hbWUnIGRpcmVjdGl2ZS4gIElmIGxlZnQgYmxhbmssCi0jIE5MTV9OQU1FIFRocmVhZCB3aWxsIGJlIHVzZWQuCi0jCi1OTE1fVEhSRUFEX05BTUUJPQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlIFZFUlNJT04gdmFsdWUgaW4gCi0jICQoQVBfV09SSylcYnVpbGRcTldHTlVlbnZpcm9ubWVudC5pbmMKLSMKLU5MTV9WRVJTSU9OCQk9Ci0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgb2YgNjRLCi0jCi1OTE1fU1RBQ0tfU0laRQk9Ci0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1lbnRyeScgZGlyZWN0aXZlCi0jCi1OTE1fRU5UUllfU1lNCT0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1leGl0JyBkaXJlY3RpdmUKLSMKLU5MTV9FWElUX1NZTQk9Ci0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctY2hlY2snIGRpcmVjdGl2ZQotIwotTkxNX0NIRUNLX1NZTQk9Ci0KLSMKLSMgSWYgdGhlc2UgYXJlIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1mbGFncycgZGlyZWN0aXZlCi0jCi1OTE1fRkxBR1MJCT0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIGxpbmtlZCBpbiB3aXRoIHRoZSBYRENEYXRhIG9wdGlvbiBpbiB0aGUgZGVmIAotIyBmaWxlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb2YgJChOV09TKS9hcGFjaGUueGRjLiAgWERDRGF0YSBjYW4gYmUgZGlzYWJsZWQKLSMgYnkgc2V0dGluZyBBUEFDSEVfVU5JUFJPQyBpbiB0aGUgZW52aXJvbm1lbnQKLSMKLVhEQ0RBVEEgICAgICAgICA9IAotCi0jCi0jIElmIHRoZXJlIGlzIGFuIE5MTSB0YXJnZXQsIHB1dCBpdCBoZXJlCi0jCi1UQVJHRVRfbmxtID0gXAotCSQoT0JKRElSKS9jZXJubWV0YS5ubG0gXAotCSQoT0JKRElSKS9leHBpcmVzLm5sbSBcCi0JJChPQkpESVIpL2hlYWRlcnMubmxtIFwKLQkkKE9CSkRJUikvbWltZW1hZ2kubmxtIFwKLQkkKE9CSkRJUikvdW5pcXVlaWQubmxtIFwKLQkkKE9CSkRJUikvdXNlcnRyay5ubG0gXAotCSQoRU9MSVNUKQotCi0jCi0jIElmIHRoZXJlIGlzIGFuIExJQiB0YXJnZXQsIHB1dCBpdCBoZXJlCi0jCi1UQVJHRVRfbGliID0gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgT0JKIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIE5MTSB0YXJnZXQgYWJvdmUuCi0jIFBhdGhzIG11c3QgYWxsIHVzZSB0aGUgJy8nIGNoYXJhY3RlcgotIwotRklMRVNfbmxtX29ianMgPSBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBMSUIgZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTkxNIHRhcmdldCBhYm92ZS4KLSMgVGhlc2Ugd2lsbCBiZSBhZGRlZCBhcyBhIGxpYnJhcnkgY29tbWFuZCBpbiB0aGUgbGluay5vcHQgZmlsZS4KLSMKLUZJTEVTX25sbV9saWJzID0gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgbW9kdWxlcyB0aGF0IHRoZSBhYm92ZSBOTE0gdGFyZ2V0IGRlcGVuZHMgb24gdG8gbG9hZC4KLSMgVGhlc2Ugd2lsbCBiZSBhZGRlZCBhcyBhIG1vZHVsZSBjb21tYW5kIGluIHRoZSBsaW5rLm9wdCBmaWxlLgotIwotRklMRVNfbmxtX21vZHVsZXMgPSBcCi0JJChFT0xJU1QpCi0KLSMKLSMgSWYgdGhlIG5sbSBoYXMgYSBtc2cgZmlsZSwgcHV0IGl0J3MgcGF0aCBoZXJlCi0jCi1GSUxFX25sbV9tc2cgPQotIAotIwotIyBJZiB0aGUgbmxtIGhhcyBhIGhscCBmaWxlIHB1dCBpdCdzIHBhdGggaGVyZQotIwotRklMRV9ubG1faGxwID0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSAkKE5XT1MpXGNvcHlyaWdodC50eHQuCi0jCi1GSUxFX25sbV9jb3B5cmlnaHQgPQotCi0jCi0jIEFueSBhZGRpdGlvbmFsIGltcG9ydHMgZ28gaGVyZQotIwotRklMRVNfbmxtX1hpbXBvcnRzID0gXAotCSQoRU9MSVNUKQotIAotIyAgIAotIyBBbnkgc3ltYm9scyBleHBvcnRlZCB0byBoZXJlCi0jCi1GSUxFU19ubG1fZXhwb3J0cyA9IFwKLQkkKEVPTElTVCkKLQkKLSMgICAKLSMgVGhlc2UgYXJlIHRoZSBPQkogZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTElCIHRhcmdldCBhYm92ZS4KLSMgUGF0aHMgbXVzdCBhbGwgdXNlIHRoZSAnLycgY2hhcmFjdGVyCi0jCi1GSUxFU19saWJfb2JqcyA9IFwKLQkJJChFT0xJU1QpCi0KLSMKLSMgaW1wbGVtZW50IHRhcmdldHMgYW5kIGRlcGVuZGFuY2llcyAobGVhdmUgdGhpcyBzZWN0aW9uIGFsb25lKQotIwotCi1saWJzIDo6ICQoT0JKRElSKSAkKFRBUkdFVF9saWIpCi0KLW5sbXMgOjogbGlicyAkKFRBUkdFVF9ubG0pCi0KLSMKLSMgVXBkYXRlZCB0aGlzIHRhcmdldCB0byBjcmVhdGUgbmVjZXNzYXJ5IGRpcmVjdG9yaWVzIGFuZCBjb3B5IGZpbGVzIHRvIHRoZSAKLSMgY29ycmVjdCBwbGFjZS4gIChTZWUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jIGZvciBleGFtcGxlcykKLSMKLWluc3RhbGwgOjogbmxtcyBGT1JDRQotCWNvcHkgJChPQkpESVIpXCoubmxtICQoSU5TVEFMTClcQXBhY2hlMlxtb2R1bGVzXCouKgotCi0jCi0jIEFueSBzcGVjaWFsaXplZCBydWxlcyBoZXJlCi0jCi0KLSMKLSMgSW5jbHVkZSB0aGUgJ3RhaWwnIG1ha2VmaWxlIHRoYXQgaGFzIHRhcmdldHMgdGhhdCBkZXBlbmQgb24gdmFyaWFibGVzIGRlZmluZWQKLSMgaW4gdGhpcyBtYWtlZmlsZQotIwotCi1pbmNsdWRlICQoQVBfV09SSylcYnVpbGRcTldHTlV0YWlsLmluYwotCi0KZGlmZiAtLWdpdCBhL21vZHVsZXMvbWV0YWRhdGEvTldHTlVtaW1lbWFnaSBiL21vZHVsZXMvbWV0YWRhdGEvTldHTlVtaW1lbWFnaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE5ODllMy4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21ldGFkYXRhL05XR05VbWltZW1hZ2kKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotIwotIyBNYWtlIHN1cmUgYWxsIG5lZWRlZCBtYWNybydzIGFyZSBkZWZpbmVkCi0jCi0KLSMKLSMgR2V0IHRoZSAnaGVhZCcgb2YgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlmIG5lY2Vzc2FyeS4gIFRoaXMgaW5jbHVkZXMgZGVmYXVsdAotIyB0YXJnZXRzIGFuZCBwYXRocyB0byB0b29scwotIwotCi1pZm5kZWYgRW52aXJvbm1lbnREZWZpbmVkCi1pbmNsdWRlICQoQVBfV09SSylcYnVpbGRcTldHTlVoZWFkLmluYwotZW5kaWYKLQotIwotIyBUaGVzZSBkaXJlY3RvcmllcyB3aWxsIGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGluY2x1ZGUgbGlzdCwgZm9sbG93ZWQgYnkKLSMgSU5DRElSUwotIwotWElOQ0RJUlMJKz0gXAotCQkJJChBUF9XT1JLKS9pbmNsdWRlIFwKLQkJCSQoTldPUykgXAotCQkJJChBUF9XT1JLKS9tb2R1bGVzL2FyY2gvbmV0d2FyZSBcCi0JCQkkKEFQX1dPUkspL3NyY2xpYi9hcHIvaW5jbHVkZSBcCi0JCQkkKEFQX1dPUkspL3NyY2xpYi9hcHItdXRpbC9pbmNsdWRlIFwKLQkJCSQoQVBfV09SSykvc3JjbGliL2FwciBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBmbGFncyB3aWxsIGNvbWUgYWZ0ZXIgQ0ZMQUdTCi0jCi1YQ0ZMQUdTCQkrPSBcCi0JCQktcHJlZml4IHByZV9udy5oIFwKLQkJCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGRlZmluZXMgd2lsbCBjb21lIGFmdGVyIERFRklORVMKLSMKLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGZsYWdzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpbmsub3B0IGZpbGUKLSMKLVhMRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIHZhbHVlcyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBjb3JyZWN0IHZhcmlhYmxlcyBiYXNlZCBvbiB0aGUgdmFsdWUgb2YKLSMgUkVMRUFTRQotIwotaWZlcSAiJChSRUxFQVNFKSIgImRlYnVnIgotWElOQ0RJUlMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhDRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YREVGSU5FUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWExGTEFHUwkJKz0gXAotCQkgICAJJChFT0xJU1QpCi1lbmRpZgotCi1pZmVxICIkKFJFTEVBU0UpIiAibm9vcHQiCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCSAgIAkkKEVPTElTVCkKLWVuZGlmCi0KLWlmZXEgIiQoUkVMRUFTRSkiICJyZWxlYXNlIgotWElOQ0RJUlMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhDRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YREVGSU5FUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWExGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi1lbmRpZgotCi0jCi0jIFRoZXNlIGFyZSB1c2VkIGJ5IHRoZSBsaW5rIHRhcmdldCBpZiBhbiBOTE0gaXMgYmVpbmcgZ2VuZXJhdGVkCi0jIFRoaXMgaXMgdXNlZCBieSB0aGUgbGluayAnbmFtZScgZGlyZWN0aXZlIHRvIG5hbWUgdGhlIG5sbS4gIElmIGxlZnQgYmxhbmsKLSMgVEFSR0VUX25sbSAoc2VlIGJlbG93KSB3aWxsIGJlIHVzZWQuCi0jCi1OTE1fTkFNRQkJPSBtaW1lbWFnaQotCi0jCi0jIFRoaXMgaXMgdXNlZCBieSB0aGUgbGluayAnLWRlc2MgJyBkaXJlY3RpdmUuIAotIyBJZiBsZWZ0IGJsYW5rLCBOTE1fTkFNRSB3aWxsIGJlIHVzZWQuCi0jCi1OTE1fREVTQ1JJUFRJT04JPSBDRVJOIE1ldGEgTW9kdWxlCi0KLSMKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSAnLXRocmVhZG5hbWUnIGRpcmVjdGl2ZS4gIElmIGxlZnQgYmxhbmssCi0jIE5MTV9OQU1FIFRocmVhZCB3aWxsIGJlIHVzZWQuCi0jCi1OTE1fVEhSRUFEX05BTUUJPSBDRVJOIE1ldGEgTW9kdWxlCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgVkVSU0lPTiB2YWx1ZSBpbiAKLSMgJChBUF9XT1JLKVxidWlsZFxOV0dOVWVudmlyb25tZW50LmluYwotIwotTkxNX1ZFUlNJT04JCT0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBvZiA2NEsKLSMKLU5MTV9TVEFDS19TSVpFCT0gODE5MgotCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZW50cnknIGRpcmVjdGl2ZQotIwotTkxNX0VOVFJZX1NZTQk9IF9MaWJDUHJlbHVkZQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWV4aXQnIGRpcmVjdGl2ZQotIwotTkxNX0VYSVRfU1lNCT0gX0xpYkNQb3N0bHVkZQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWNoZWNrJyBkaXJlY3RpdmUKLSMKLU5MTV9DSEVDS19TWU0JPQotCi0jCi0jIElmIHRoZXNlIGFyZSBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZmxhZ3MnIGRpcmVjdGl2ZQotIwotTkxNX0ZMQUdTCQk9ICBBVVRPVU5MT0FELCBQU0VVRE9QUkVFTVBUSU9OCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSBsaW5rZWQgaW4gd2l0aCB0aGUgWERDRGF0YSBvcHRpb24gaW4gdGhlIGRlZiAKLSMgZmlsZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG9mICQoTldPUykvYXBhY2hlLnhkYy4gIFhEQ0RhdGEgY2FuIGJlIGRpc2FibGVkCi0jIGJ5IHNldHRpbmcgQVBBQ0hFX1VOSVBST0MgaW4gdGhlIGVudmlyb25tZW50Ci0jCi1YRENEQVRBICAgICAgICAgPSAKLQotIwotIyBJZiB0aGVyZSBpcyBhbiBOTE0gdGFyZ2V0LCBwdXQgaXQgaGVyZQotIwotVEFSR0VUX25sbSA9IFwKLQkkKE9CSkRJUikvbWltZW1hZ2kubmxtIFwKLQkkKEVPTElTVCkKLQotIwotIyBJZiB0aGVyZSBpcyBhbiBMSUIgdGFyZ2V0LCBwdXQgaXQgaGVyZQotIwotVEFSR0VUX2xpYiA9IFwKLQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBhcmUgdGhlIE9CSiBmaWxlcyBuZWVkZWQgdG8gY3JlYXRlIHRoZSBOTE0gdGFyZ2V0IGFib3ZlLgotIyBQYXRocyBtdXN0IGFsbCB1c2UgdGhlICcvJyBjaGFyYWN0ZXIKLSMKLUZJTEVTX25sbV9vYmpzID0gXAotCSQoT0JKRElSKS9tb2RfbWltZV9tYWdpYy5vIFwKLQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBhcmUgdGhlIExJQiBmaWxlcyBuZWVkZWQgdG8gY3JlYXRlIHRoZSBOTE0gdGFyZ2V0IGFib3ZlLgotIyBUaGVzZSB3aWxsIGJlIGFkZGVkIGFzIGEgbGlicmFyeSBjb21tYW5kIGluIHRoZSBsaW5rLm9wdCBmaWxlLgotIwotRklMRVNfbmxtX2xpYnMgPSBcCi0gICAJbGliY3ByZS5vIFwKLQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBhcmUgdGhlIG1vZHVsZXMgdGhhdCB0aGUgYWJvdmUgTkxNIHRhcmdldCBkZXBlbmRzIG9uIHRvIGxvYWQuCi0jIFRoZXNlIHdpbGwgYmUgYWRkZWQgYXMgYSBtb2R1bGUgY29tbWFuZCBpbiB0aGUgbGluay5vcHQgZmlsZS4KLSMKLUZJTEVTX25sbV9tb2R1bGVzID0gXAotCWFwcmxpYiBcCi0JbGliYyBcCi0JJChFT0xJU1QpCi0KLSMKLSMgSWYgdGhlIG5sbSBoYXMgYSBtc2cgZmlsZSwgcHV0IGl0J3MgcGF0aCBoZXJlCi0jCi1GSUxFX25sbV9tc2cgPQotIAotIwotIyBJZiB0aGUgbmxtIGhhcyBhIGhscCBmaWxlIHB1dCBpdCdzIHBhdGggaGVyZQotIwotRklMRV9ubG1faGxwID0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSAkKE5XT1MpXGNvcHlyaWdodC50eHQuCi0jCi1GSUxFX25sbV9jb3B5cmlnaHQgPQotCi0jCi0jIEFueSBhZGRpdGlvbmFsIGltcG9ydHMgZ28gaGVyZQotIwotRklMRVNfbmxtX1hpbXBvcnRzID0gXAotCUAkKEFQUikvYXBybGliLmltcCBcCi0JQCQoTldPUykvaHR0cGQuaW1wIFwKLQlAbGliYy5pbXAgXAotCSQoRU9MSVNUKQotIAotIyAgIAotIyBBbnkgc3ltYm9scyBleHBvcnRlZCB0byBoZXJlCi0jCi1GSUxFU19ubG1fZXhwb3J0cyA9IFwKLQltaW1lX21hZ2ljX21vZHVsZSBcCi0JJChFT0xJU1QpCi0JCi0jICAgCi0jIFRoZXNlIGFyZSB0aGUgT0JKIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIExJQiB0YXJnZXQgYWJvdmUuCi0jIFBhdGhzIG11c3QgYWxsIHVzZSB0aGUgJy8nIGNoYXJhY3RlcgotIwotRklMRVNfbGliX29ianMgPSBcCi0JCSQoRU9MSVNUKQotCi0jCi0jIGltcGxlbWVudCB0YXJnZXRzIGFuZCBkZXBlbmRhbmNpZXMgKGxlYXZlIHRoaXMgc2VjdGlvbiBhbG9uZSkKLSMKLQotbGlicyA6OiAkKE9CSkRJUikgJChUQVJHRVRfbGliKQotCi1ubG1zIDo6IGxpYnMgJChUQVJHRVRfbmxtKQotCi0jCi0jIFVwZGF0ZWQgdGhpcyB0YXJnZXQgdG8gY3JlYXRlIG5lY2Vzc2FyeSBkaXJlY3RvcmllcyBhbmQgY29weSBmaWxlcyB0byB0aGUgCi0jIGNvcnJlY3QgcGxhY2UuICAoU2VlICQoQVBfV09SSylcYnVpbGRcTldHTlVoZWFkLmluYyBmb3IgZXhhbXBsZXMpCi0jCi1pbnN0YWxsIDo6IG5sbXMgRk9SQ0UKLQotIwotIyBBbnkgc3BlY2lhbGl6ZWQgcnVsZXMgaGVyZQotIwotCi0jCi0jIEluY2x1ZGUgdGhlICd0YWlsJyBtYWtlZmlsZSB0aGF0IGhhcyB0YXJnZXRzIHRoYXQgZGVwZW5kIG9uIHZhcmlhYmxlcyBkZWZpbmVkCi0jIGluIHRoaXMgbWFrZWZpbGUKLSMKLQotaW5jbHVkZSAkKEFQX1dPUkspXGJ1aWxkXE5XR05VdGFpbC5pbmMKLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tZXRhZGF0YS9OV0dOVXVuaXF1ZWlkIGIvbW9kdWxlcy9tZXRhZGF0YS9OV0dOVXVuaXF1ZWlkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2RhY2U0Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWV0YWRhdGEvTldHTlV1bmlxdWVpZAorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0jCi0jIE1ha2Ugc3VyZSBhbGwgbmVlZGVkIG1hY3JvJ3MgYXJlIGRlZmluZWQKLSMKLQotIwotIyBHZXQgdGhlICdoZWFkJyBvZiB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaWYgbmVjZXNzYXJ5LiAgVGhpcyBpbmNsdWRlcyBkZWZhdWx0Ci0jIHRhcmdldHMgYW5kIHBhdGhzIHRvIHRvb2xzCi0jCi0KLWlmbmRlZiBFbnZpcm9ubWVudERlZmluZWQKLWluY2x1ZGUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jCi1lbmRpZgotCi0jCi0jIFRoZXNlIGRpcmVjdG9yaWVzIHdpbGwgYmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5jbHVkZSBsaXN0LCBmb2xsb3dlZCBieQotIyBJTkNESVJTCi0jCi1YSU5DRElSUwkrPSBcCi0JCQkkKEFQX1dPUkspL2luY2x1ZGUgXAotCQkJJChOV09TKSBcCi0JCQkkKEFQX1dPUkspL21vZHVsZXMvYXJjaC9uZXR3YXJlIFwKLQkJCSQoQVBfV09SSykvc3JjbGliL2Fwci9pbmNsdWRlIFwKLQkJCSQoQVBfV09SSykvc3JjbGliL2Fwci11dGlsL2luY2x1ZGUgXAotCQkJJChBUF9XT1JLKS9zcmNsaWIvYXByIFwKLQkJCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGZsYWdzIHdpbGwgY29tZSBhZnRlciBDRkxBR1MKLSMKLVhDRkxBR1MJCSs9IFwKLQkJCS1wcmVmaXggcHJlX253LmggXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZGVmaW5lcyB3aWxsIGNvbWUgYWZ0ZXIgREVGSU5FUwotIwotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZmxhZ3Mgd2lsbCBiZSBhZGRlZCB0byB0aGUgbGluay5vcHQgZmlsZQotIwotWExGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgdmFsdWVzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGNvcnJlY3QgdmFyaWFibGVzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZgotIyBSRUxFQVNFCi0jCi1pZmVxICIkKFJFTEVBU0UpIiAiZGVidWciCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCSAgIAkkKEVPTElTVCkKLWVuZGlmCi0KLWlmZXEgIiQoUkVMRUFTRSkiICJub29wdCIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJICAgCSQoRU9MSVNUKQotZW5kaWYKLQotaWZlcSAiJChSRUxFQVNFKSIgInJlbGVhc2UiCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLWVuZGlmCi0KLSMKLSMgVGhlc2UgYXJlIHVzZWQgYnkgdGhlIGxpbmsgdGFyZ2V0IGlmIGFuIE5MTSBpcyBiZWluZyBnZW5lcmF0ZWQKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rICduYW1lJyBkaXJlY3RpdmUgdG8gbmFtZSB0aGUgbmxtLiAgSWYgbGVmdCBibGFuawotIyBUQVJHRVRfbmxtIChzZWUgYmVsb3cpIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9OQU1FCQk9IHVuaXF1ZWlkCi0KLSMKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rICctZGVzYyAnIGRpcmVjdGl2ZS4gCi0jIElmIGxlZnQgYmxhbmssIE5MTV9OQU1FIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9ERVNDUklQVElPTgk9IFVuaXF1ZSBJRCBNb2R1bGUKLQotIwotIyBUaGlzIGlzIHVzZWQgYnkgdGhlICctdGhyZWFkbmFtZScgZGlyZWN0aXZlLiAgSWYgbGVmdCBibGFuaywKLSMgTkxNX05BTUUgVGhyZWFkIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9USFJFQURfTkFNRQk9IFVuaXF1ZSBJRCBNb2R1bGUKLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSBWRVJTSU9OIHZhbHVlIGluIAotIyAkKEFQX1dPUkspXGJ1aWxkXE5XR05VZW52aXJvbm1lbnQuaW5jCi0jCi1OTE1fVkVSU0lPTgkJPQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG9mIDY0SwotIwotTkxNX1NUQUNLX1NJWkUJPSA4MTkyCi0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1lbnRyeScgZGlyZWN0aXZlCi0jCi1OTE1fRU5UUllfU1lNCT0gX0xpYkNQcmVsdWRlCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZXhpdCcgZGlyZWN0aXZlCi0jCi1OTE1fRVhJVF9TWU0JPSBfTGliQ1Bvc3RsdWRlCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctY2hlY2snIGRpcmVjdGl2ZQotIwotTkxNX0NIRUNLX1NZTQk9Ci0KLSMKLSMgSWYgdGhlc2UgYXJlIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1mbGFncycgZGlyZWN0aXZlCi0jCi1OTE1fRkxBR1MJCT0gIEFVVE9VTkxPQUQsIFBTRVVET1BSRUVNUFRJT04KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIGxpbmtlZCBpbiB3aXRoIHRoZSBYRENEYXRhIG9wdGlvbiBpbiB0aGUgZGVmIAotIyBmaWxlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb2YgJChOV09TKS9hcGFjaGUueGRjLiAgWERDRGF0YSBjYW4gYmUgZGlzYWJsZWQKLSMgYnkgc2V0dGluZyBBUEFDSEVfVU5JUFJPQyBpbiB0aGUgZW52aXJvbm1lbnQKLSMKLVhEQ0RBVEEgICAgICAgICA9IAotCi0jCi0jIElmIHRoZXJlIGlzIGFuIE5MTSB0YXJnZXQsIHB1dCBpdCBoZXJlCi0jCi1UQVJHRVRfbmxtID0gXAotCSQoT0JKRElSKS91bmlxdWVpZC5ubG0gXAotCSQoRU9MSVNUKQotCi0jCi0jIElmIHRoZXJlIGlzIGFuIExJQiB0YXJnZXQsIHB1dCBpdCBoZXJlCi0jCi1UQVJHRVRfbGliID0gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgT0JKIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIE5MTSB0YXJnZXQgYWJvdmUuCi0jIFBhdGhzIG11c3QgYWxsIHVzZSB0aGUgJy8nIGNoYXJhY3RlcgotIwotRklMRVNfbmxtX29ianMgPSBcCi0JJChPQkpESVIpL21vZF91bmlxdWVfaWQubyBcCi0JJChPQkpESVIpL2xpYnByZXdzLm8gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgTElCIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIE5MTSB0YXJnZXQgYWJvdmUuCi0jIFRoZXNlIHdpbGwgYmUgYWRkZWQgYXMgYSBsaWJyYXJ5IGNvbW1hbmQgaW4gdGhlIGxpbmsub3B0IGZpbGUuCi0jCi1GSUxFU19ubG1fbGlicyA9IFwKLSAgIAlsaWJjcHJlLm8gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgbW9kdWxlcyB0aGF0IHRoZSBhYm92ZSBOTE0gdGFyZ2V0IGRlcGVuZHMgb24gdG8gbG9hZC4KLSMgVGhlc2Ugd2lsbCBiZSBhZGRlZCBhcyBhIG1vZHVsZSBjb21tYW5kIGluIHRoZSBsaW5rLm9wdCBmaWxlLgotIwotRklMRVNfbmxtX21vZHVsZXMgPSBcCi0JYXBybGliIFwKLQlsaWJjIFwKLQkkKEVPTElTVCkKLQotIwotIyBJZiB0aGUgbmxtIGhhcyBhIG1zZyBmaWxlLCBwdXQgaXQncyBwYXRoIGhlcmUKLSMKLUZJTEVfbmxtX21zZyA9Ci0gCi0jCi0jIElmIHRoZSBubG0gaGFzIGEgaGxwIGZpbGUgcHV0IGl0J3MgcGF0aCBoZXJlCi0jCi1GSUxFX25sbV9obHAgPQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlICQoTldPUylcY29weXJpZ2h0LnR4dC4KLSMKLUZJTEVfbmxtX2NvcHlyaWdodCA9Ci0KLSMKLSMgQW55IGFkZGl0aW9uYWwgaW1wb3J0cyBnbyBoZXJlCi0jCi1GSUxFU19ubG1fWGltcG9ydHMgPSBcCi0JQCQoQVBSKS9hcHJsaWIuaW1wIFwKLQlAJChOV09TKS9odHRwZC5pbXAgXAotCUBsaWJjLmltcCBcCi0JQHdzMm5sbS5pbXAgXAotCSQoRU9MSVNUKQotIAotIyAgIAotIyBBbnkgc3ltYm9scyBleHBvcnRlZCB0byBoZXJlCi0jCi1GSUxFU19ubG1fZXhwb3J0cyA9IFwKLQl1bmlxdWVfaWRfbW9kdWxlIFwKLQkkKEVPTElTVCkKLQkKLSMgICAKLSMgVGhlc2UgYXJlIHRoZSBPQkogZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTElCIHRhcmdldCBhYm92ZS4KLSMgUGF0aHMgbXVzdCBhbGwgdXNlIHRoZSAnLycgY2hhcmFjdGVyCi0jCi1GSUxFU19saWJfb2JqcyA9IFwKLQkJJChFT0xJU1QpCi0KLSMKLSMgaW1wbGVtZW50IHRhcmdldHMgYW5kIGRlcGVuZGFuY2llcyAobGVhdmUgdGhpcyBzZWN0aW9uIGFsb25lKQotIwotCi1saWJzIDo6ICQoT0JKRElSKSAkKFRBUkdFVF9saWIpCi0KLW5sbXMgOjogbGlicyAkKFRBUkdFVF9ubG0pCi0KLSMKLSMgVXBkYXRlZCB0aGlzIHRhcmdldCB0byBjcmVhdGUgbmVjZXNzYXJ5IGRpcmVjdG9yaWVzIGFuZCBjb3B5IGZpbGVzIHRvIHRoZSAKLSMgY29ycmVjdCBwbGFjZS4gIChTZWUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jIGZvciBleGFtcGxlcykKLSMKLWluc3RhbGwgOjogbmxtcyBGT1JDRQotCi0jCi0jIEFueSBzcGVjaWFsaXplZCBydWxlcyBoZXJlCi0jCi0KLSQoT0JKRElSKS8lLm86IC4uL2FyY2gvbmV0d2FyZS8lLmMgJChPQkpESVIpXGNjLm9wdAotCUBlY2hvIGNvbXBpbGluZyAkPAotCSQoQ0MpICQ8IC1vPSQoT0JKRElSKVwkKEBGKSBAJChPQkpESVIpXGNjLm9wdAotCi0jCi0jIEluY2x1ZGUgdGhlICd0YWlsJyBtYWtlZmlsZSB0aGF0IGhhcyB0YXJnZXRzIHRoYXQgZGVwZW5kIG9uIHZhcmlhYmxlcyBkZWZpbmVkCi0jIGluIHRoaXMgbWFrZWZpbGUKLSMKLQotaW5jbHVkZSAkKEFQX1dPUkspXGJ1aWxkXE5XR05VdGFpbC5pbmMKLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tZXRhZGF0YS9OV0dOVXVzZXJ0cmsgYi9tb2R1bGVzL21ldGFkYXRhL05XR05VdXNlcnRyawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRiY2I0OC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21ldGFkYXRhL05XR05VdXNlcnRyaworKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0jCi0jIE1ha2Ugc3VyZSBhbGwgbmVlZGVkIG1hY3JvJ3MgYXJlIGRlZmluZWQKLSMKLQotIwotIyBHZXQgdGhlICdoZWFkJyBvZiB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaWYgbmVjZXNzYXJ5LiAgVGhpcyBpbmNsdWRlcyBkZWZhdWx0Ci0jIHRhcmdldHMgYW5kIHBhdGhzIHRvIHRvb2xzCi0jCi0KLWlmbmRlZiBFbnZpcm9ubWVudERlZmluZWQKLWluY2x1ZGUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jCi1lbmRpZgotCi0jCi0jIFRoZXNlIGRpcmVjdG9yaWVzIHdpbGwgYmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5jbHVkZSBsaXN0LCBmb2xsb3dlZCBieQotIyBJTkNESVJTCi0jCi1YSU5DRElSUwkrPSBcCi0JCQkkKEFQX1dPUkspL2luY2x1ZGUgXAotCQkJJChOV09TKSBcCi0JCQkkKEFQX1dPUkspL21vZHVsZXMvYXJjaC9uZXR3YXJlIFwKLQkJCSQoQVBfV09SSykvc3JjbGliL2Fwci9pbmNsdWRlIFwKLQkJCSQoQVBfV09SSykvc3JjbGliL2Fwci11dGlsL2luY2x1ZGUgXAotCQkJJChBUF9XT1JLKS9zcmNsaWIvYXByIFwKLQkJCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGZsYWdzIHdpbGwgY29tZSBhZnRlciBDRkxBR1MKLSMKLVhDRkxBR1MJCSs9IFwKLQkJCS1wcmVmaXggcHJlX253LmggXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZGVmaW5lcyB3aWxsIGNvbWUgYWZ0ZXIgREVGSU5FUwotIwotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZmxhZ3Mgd2lsbCBiZSBhZGRlZCB0byB0aGUgbGluay5vcHQgZmlsZQotIwotWExGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgdmFsdWVzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGNvcnJlY3QgdmFyaWFibGVzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZgotIyBSRUxFQVNFCi0jCi1pZmVxICIkKFJFTEVBU0UpIiAiZGVidWciCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCSAgIAkkKEVPTElTVCkKLWVuZGlmCi0KLWlmZXEgIiQoUkVMRUFTRSkiICJub29wdCIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJICAgCSQoRU9MSVNUKQotZW5kaWYKLQotaWZlcSAiJChSRUxFQVNFKSIgInJlbGVhc2UiCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLWVuZGlmCi0KLSMKLSMgVGhlc2UgYXJlIHVzZWQgYnkgdGhlIGxpbmsgdGFyZ2V0IGlmIGFuIE5MTSBpcyBiZWluZyBnZW5lcmF0ZWQKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rICduYW1lJyBkaXJlY3RpdmUgdG8gbmFtZSB0aGUgbmxtLiAgSWYgbGVmdCBibGFuawotIyBUQVJHRVRfbmxtIChzZWUgYmVsb3cpIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9OQU1FCQk9IHVzZXJ0cmsKLQotIwotIyBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmsgJy1kZXNjICcgZGlyZWN0aXZlLiAKLSMgSWYgbGVmdCBibGFuaywgTkxNX05BTUUgd2lsbCBiZSB1c2VkLgotIwotTkxNX0RFU0NSSVBUSU9OCT0gVXNlciBUcmFjayBNb2R1bGUKLQotIwotIyBUaGlzIGlzIHVzZWQgYnkgdGhlICctdGhyZWFkbmFtZScgZGlyZWN0aXZlLiAgSWYgbGVmdCBibGFuaywKLSMgTkxNX05BTUUgVGhyZWFkIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9USFJFQURfTkFNRQk9IFVzZXIgVHJhY2sgTW9kdWxlCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgVkVSU0lPTiB2YWx1ZSBpbiAKLSMgJChBUF9XT1JLKVxidWlsZFxOV0dOVWVudmlyb25tZW50LmluYwotIwotTkxNX1ZFUlNJT04JCT0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBvZiA2NEsKLSMKLU5MTV9TVEFDS19TSVpFCT0gODE5MgotCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZW50cnknIGRpcmVjdGl2ZQotIwotTkxNX0VOVFJZX1NZTQk9IF9MaWJDUHJlbHVkZQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWV4aXQnIGRpcmVjdGl2ZQotIwotTkxNX0VYSVRfU1lNCT0gX0xpYkNQb3N0bHVkZQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWNoZWNrJyBkaXJlY3RpdmUKLSMKLU5MTV9DSEVDS19TWU0JPQotCi0jCi0jIElmIHRoZXNlIGFyZSBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZmxhZ3MnIGRpcmVjdGl2ZQotIwotTkxNX0ZMQUdTCQk9ICBBVVRPVU5MT0FELCBQU0VVRE9QUkVFTVBUSU9OCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSBsaW5rZWQgaW4gd2l0aCB0aGUgWERDRGF0YSBvcHRpb24gaW4gdGhlIGRlZiAKLSMgZmlsZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG9mICQoTldPUykvYXBhY2hlLnhkYy4gIFhEQ0RhdGEgY2FuIGJlIGRpc2FibGVkCi0jIGJ5IHNldHRpbmcgQVBBQ0hFX1VOSVBST0MgaW4gdGhlIGVudmlyb25tZW50Ci0jCi1YRENEQVRBICAgICAgICAgPSAKLQotIwotIyBJZiB0aGVyZSBpcyBhbiBOTE0gdGFyZ2V0LCBwdXQgaXQgaGVyZQotIwotVEFSR0VUX25sbSA9IFwKLQkkKE9CSkRJUikvdXNlcnRyay5ubG0gXAotCSQoRU9MSVNUKQotCi0jCi0jIElmIHRoZXJlIGlzIGFuIExJQiB0YXJnZXQsIHB1dCBpdCBoZXJlCi0jCi1UQVJHRVRfbGliID0gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgT0JKIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIE5MTSB0YXJnZXQgYWJvdmUuCi0jIFBhdGhzIG11c3QgYWxsIHVzZSB0aGUgJy8nIGNoYXJhY3RlcgotIwotRklMRVNfbmxtX29ianMgPSBcCi0JJChPQkpESVIpL21vZF91c2VydHJhY2subyBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBMSUIgZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTkxNIHRhcmdldCBhYm92ZS4KLSMgVGhlc2Ugd2lsbCBiZSBhZGRlZCBhcyBhIGxpYnJhcnkgY29tbWFuZCBpbiB0aGUgbGluay5vcHQgZmlsZS4KLSMKLUZJTEVTX25sbV9saWJzID0gXAotICAgCWxpYmNwcmUubyBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBtb2R1bGVzIHRoYXQgdGhlIGFib3ZlIE5MTSB0YXJnZXQgZGVwZW5kcyBvbiB0byBsb2FkLgotIyBUaGVzZSB3aWxsIGJlIGFkZGVkIGFzIGEgbW9kdWxlIGNvbW1hbmQgaW4gdGhlIGxpbmsub3B0IGZpbGUuCi0jCi1GSUxFU19ubG1fbW9kdWxlcyA9IFwKLQlhcHJsaWIgXAotCWxpYmMgXAotCSQoRU9MSVNUKQotCi0jCi0jIElmIHRoZSBubG0gaGFzIGEgbXNnIGZpbGUsIHB1dCBpdCdzIHBhdGggaGVyZQotIwotRklMRV9ubG1fbXNnID0KLSAKLSMKLSMgSWYgdGhlIG5sbSBoYXMgYSBobHAgZmlsZSBwdXQgaXQncyBwYXRoIGhlcmUKLSMKLUZJTEVfbmxtX2hscCA9Ci0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgJChOV09TKVxjb3B5cmlnaHQudHh0LgotIwotRklMRV9ubG1fY29weXJpZ2h0ID0KLQotIwotIyBBbnkgYWRkaXRpb25hbCBpbXBvcnRzIGdvIGhlcmUKLSMKLUZJTEVTX25sbV9YaW1wb3J0cyA9IFwKLQlAJChBUFIpL2FwcmxpYi5pbXAgXAotCUAkKE5XT1MpL2h0dHBkLmltcCBcCi0JQGxpYmMuaW1wIFwKLQkkKEVPTElTVCkKLSAKLSMgICAKLSMgQW55IHN5bWJvbHMgZXhwb3J0ZWQgdG8gaGVyZQotIwotRklMRVNfbmxtX2V4cG9ydHMgPSBcCi0JdXNlcnRyYWNrX21vZHVsZSBcCi0JJChFT0xJU1QpCi0JCi0jICAgCi0jIFRoZXNlIGFyZSB0aGUgT0JKIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIExJQiB0YXJnZXQgYWJvdmUuCi0jIFBhdGhzIG11c3QgYWxsIHVzZSB0aGUgJy8nIGNoYXJhY3RlcgotIwotRklMRVNfbGliX29ianMgPSBcCi0JCSQoRU9MSVNUKQotCi0jCi0jIGltcGxlbWVudCB0YXJnZXRzIGFuZCBkZXBlbmRhbmNpZXMgKGxlYXZlIHRoaXMgc2VjdGlvbiBhbG9uZSkKLSMKLQotbGlicyA6OiAkKE9CSkRJUikgJChUQVJHRVRfbGliKQotCi1ubG1zIDo6IGxpYnMgJChUQVJHRVRfbmxtKQotCi0jCi0jIFVwZGF0ZWQgdGhpcyB0YXJnZXQgdG8gY3JlYXRlIG5lY2Vzc2FyeSBkaXJlY3RvcmllcyBhbmQgY29weSBmaWxlcyB0byB0aGUgCi0jIGNvcnJlY3QgcGxhY2UuICAoU2VlICQoQVBfV09SSylcYnVpbGRcTldHTlVoZWFkLmluYyBmb3IgZXhhbXBsZXMpCi0jCi1pbnN0YWxsIDo6IG5sbXMgRk9SQ0UKLQotIwotIyBBbnkgc3BlY2lhbGl6ZWQgcnVsZXMgaGVyZQotIwotCi0jCi0jIEluY2x1ZGUgdGhlICd0YWlsJyBtYWtlZmlsZSB0aGF0IGhhcyB0YXJnZXRzIHRoYXQgZGVwZW5kIG9uIHZhcmlhYmxlcyBkZWZpbmVkCi0jIGluIHRoaXMgbWFrZWZpbGUKLSMKLQotaW5jbHVkZSAkKEFQX1dPUkspXGJ1aWxkXE5XR05VdGFpbC5pbmMKLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tZXRhZGF0YS9jb25maWcubTQgYi9tb2R1bGVzL21ldGFkYXRhL2NvbmZpZy5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzM2Q3NS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21ldGFkYXRhL2NvbmZpZy5tNAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLWRubCBtb2R1bGVzIGVuYWJsZWQgaW4gdGhpcyBkaXJlY3RvcnkgYnkgZGVmYXVsdAotCi1kbmwgQUNfREVGVU4obW9kdWxlbmFtZSwgbW9kdWxlc3RydWN0bmFtZSwgZGVmYXVsdG9ub3JvZmYsIGNvbmZpZ21hY3JvcykKLWRubCBYWFggLSBOZWVkIHRvIGFsbG93IC0tZW5hYmxlLW1vZHVsZSB0byBmYWlsIGlmIG9wdGlvbmFsIGNvbmZpZyBmYWlscwotCi1BQ19ERUZVTihBUEFDSEVfQ0hFQ0tfTUVUQURBVEFfTU9EVUxFLCBbCi0gIEFQQUNIRV9NT0RVTEUoWyQxXSxbJDJdLCxbJDNdLFskNF0sWyQ1XSkKLV0pCi0KLUFQQUNIRV9NT0RQQVRIX0lOSVQobWV0YWRhdGEpCi0KLUFQQUNIRV9DSEVDS19NRVRBREFUQV9NT0RVTEUoZW52LCBjbGVhcmluZy9zZXR0aW5nIG9mIEVOViB2YXJzLCAsIHllcykKLUFQQUNIRV9DSEVDS19NRVRBREFUQV9NT0RVTEUobWltZV9tYWdpYywgYXV0b21hZ2ljYWxseSBkZXRlcm1pbmluZyBNSU1FIHR5cGUsICwgbm8pCi1BUEFDSEVfQ0hFQ0tfTUVUQURBVEFfTU9EVUxFKGNlcm5fbWV0YSwgQ0VSTi10eXBlIG1ldGEgZmlsZXMsICwgbm8pCi1BUEFDSEVfQ0hFQ0tfTUVUQURBVEFfTU9EVUxFKGV4cGlyZXMsIEV4cGlyZXMgaGVhZGVyIGNvbnRyb2wsICwgbm8pCi1BUEFDSEVfQ0hFQ0tfTUVUQURBVEFfTU9EVUxFKGhlYWRlcnMsIEhUVFAgaGVhZGVyIGNvbnRyb2wsICwgbm8pCi0KLUFQQUNIRV9DSEVDS19NRVRBREFUQV9NT0RVTEUodXNlcnRyYWNrLCB1c2VyLXNlc3Npb24gdHJhY2tpbmcsICwgbm8sIFsKLSAgQUNfQ0hFQ0tfSEVBREVSUyhzeXMvdGltZXMuaCkKLSAgQUNfQ0hFQ0tfRlVOQ1ModGltZXMpCi1dKQotCi1BUEFDSEVfQ0hFQ0tfTUVUQURBVEFfTU9EVUxFKHVuaXF1ZV9pZCwgcGVyLXJlcXVlc3QgdW5pcXVlIGlkcywgLCBubykKLUFQQUNIRV9DSEVDS19NRVRBREFUQV9NT0RVTEUoc2V0ZW52aWYsIGJhc2luZyBFTlYgdmFycyBvbiBoZWFkZXJzLCAsIHllcykKLQotTFRGTEFHUz0iJExURkxBR1MgLWV4cG9ydC1keW5hbWljIgotCi1BUEFDSEVfTU9EUEFUSF9GSU5JU0gKLSAgICAKLUFQQUNIRV9TVUJTVChTVEFOREFSRF9MSUJTKQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfY2Vybl9tZXRhLmMgYi9tb2R1bGVzL21ldGFkYXRhL21vZF9jZXJuX21ldGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJjMWRlNi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21ldGFkYXRhL21vZF9jZXJuX21ldGEuYworKysgL2Rldi9udWxsCkBAIC0xLDM5NSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVQnUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogbW9kX2Nlcm5fbWV0YS5jCi0gKiB2ZXJzaW9uIDAuMS4wCi0gKiBzdGF0dXMgYmV0YQotICogCi0gKiBBbmRyZXcgV2lsc29uIDxBbmRyZXcuV2lsc29uQGNtLmNmLmFjLnVrPiAyNS5KYW4uOTYKLSAqCi0gKiAqKiogSU1QT1JUQU5UICoqKgotICogVGhpcyB2ZXJzaW9uIG9mIG1vZF9jZXJuX21ldGEuYyBjb250cm9scyBNZXRhIEZpbGUgYmVoYXZpb3VyIG9uIGEKLSAqIHBlci1kaXJlY3RvcnkgYmFzaXMuICBQcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGUgbW9kdWxlIGRlZmluZWQgYmVoYXZpb3VyCi0gKiBvbiBhIHBlci1zZXJ2ZXIgYmFzaXMuICBUaGUgdXBzaG90IGlzIHRoYXQgeW91J2xsIG5lZWQgdG8gcmV2aXNpdCB5b3VyIAotICogY29uZmlndXJhdGlvbiBmaWxlcyBpbiBvcmRlciB0byBtYWtlIHVzZSBvZiB0aGUgbmV3IG1vZHVsZS4KLSAqICoqKgotICoKLSAqIEVtdWxhdGUgdGhlIENFUk4gSFRUUEQgTWV0YSBmaWxlIHNlbWFudGljcy4gIE1ldGEgZmlsZXMgYXJlIEhUVFAKLSAqIGhlYWRlcnMgdGhhdCBjYW4gYmUgb3V0cHV0IGluIGFkZGl0aW9uIHRvIHRoZSBub3JtYWwgcmFuZ2Ugb2YKLSAqIGhlYWRlcnMgZm9yIGVhY2ggZmlsZSBhY2Nlc3NlZC4gIFRoZXkgYXBwZWFyIHJhdGhlciBsaWtlIHRoZSBBcGFjaGUKLSAqIC5hc2lzIGZpbGVzLCBhbmQgYXJlIGFibGUgdG8gcHJvdmlkZSBhIGNydWRlIHdheSBvZiBpbmZsdWVuY2luZwotICogdGhlIEV4cGlyZXM6IGhlYWRlciwgYXMgd2VsbCBhcyBwcm92aWRpbmcgb3RoZXIgY3VyaW9zaXRpZXMuCi0gKiBUaGVyZSBhcmUgbWFueSB3YXlzIHRvIG1hbmFnZSBtZXRhIGluZm9ybWF0aW9uLCB0aGlzIG9uZSB3YXMKLSAqIGNob3NlbiBiZWNhdXNlIHRoZXJlIGlzIGFscmVhZHkgYSBsYXJnZSBudW1iZXIgb2YgQ0VSTiB1c2VycwotICogd2hvIGNhbiBleHBsb2l0IHRoaXMgbW9kdWxlLiAgSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhlcmUgYXJlIHByb2JhYmx5Ci0gKiBtb3JlIHNlbnNpdGl2ZSB3YXlzIG9mIG1hbmFnaW5nIHRoZSBFeHBpcmVzOiBoZWFkZXIgc3BlY2lmaWNhbGx5LgotICoKLSAqIFRoZSBtb2R1bGUgb2JleXMgdGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzLCB3aGljaCBjYW4gYXBwZWFyIAotICogaW4gdGhlIHNlcnZlcidzIC5jb25mIGZpbGVzIGFuZCBpbiAuaHRhY2Nlc3MgZmlsZXMuCi0gKgotICogIE1ldGFGaWxlcyA8b258b2ZmPiAKLSAqCi0gKiAgICB0dXJucyBvbnxvZmYgbWV0YSBmaWxlIHByb2Nlc3NpbmcgZm9yIGFueSBkaXJlY3RvcnkuICAKLSAqICAgIERlZmF1bHQgdmFsdWUgaXMgb2ZmCi0gKgotICogICAgICAgICMgdHVybiBvbiBNZXRhRmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkKLSAqICAgICAgICBNZXRhRmlsZXMgb24KLSAqCi0gKiAgTWV0YURpciA8ZGlyZWN0b3J5IG5hbWU+Ci0gKiAgICAgIAotICogICAgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggQXBhY2hlIGNhbiBmaW5kCi0gKiAgICBtZXRhIGluZm9ybWF0aW9uIGZpbGVzLiAgVGhlIGRpcmVjdG9yeSBpcyB1c3VhbGx5IGEgJ2hpZGRlbicKLSAqICAgIHN1YmRpcmVjdG9yeSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlIGZpbGUgYmVpbmcKLSAqICAgIGFjY2Vzc2VkLiAgZWc6Ci0gKgotICogICAgICAgICMgLm1ldGEgZmlsZXMgYXJlIGluIHRoZSAqc2FtZSogZGlyZWN0b3J5IGFzIHRoZSAKLSAqICAgICAgICAjIGZpbGUgYmVpbmcgYWNjZXNzZWQKLSAqICAgICAgICBNZXRhRGlyIC4KLSAqCi0gKiAgICB0aGUgZGVmYXVsdCBpcyB0byBsb29rIGluIGEgJy53ZWInIHN1YmRpcmVjdG9yeS4gVGhpcyBpcyB0aGUKLSAqICAgIHNhbWUgYXMgZm9yIENFUk4gMy4rIHdlYnNlcnZlcnMgYW5kIGJlaGF2aW91ciBpcyB0aGUgc2FtZSBhcyAKLSAqICAgIGZvciB0aGUgZGlyZWN0aXZlOgotICoKLSAqICAgICAgICBNZXRhRGlyIC53ZWIKLSAqCi0gKiAgTWV0YVN1ZmZpeCA8bWV0YSBmaWxlIHN1ZmZpeD4KLSAqCi0gKiAgICBzcGVjaWZpZXMgdGhlIGZpbGUgbmFtZSBzdWZmaXggZm9yIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gKiAgICBtZXRhIGluZm9ybWF0aW9uLiAgZWc6Ci0gKgotICogICAgICAgIyBvdXIgbWV0YSBmaWxlcyBhcmUgc3VmZml4ZWQgd2l0aCAnLmNlcm5fbWV0YScKLSAqICAgICAgIE1ldGFTdWZmaXggLmNlcm5fbWV0YQotICoKLSAqICAgIHRoZSBkZWZhdWx0IGlzIHRvIGxvb2sgZm9yIGZpbGVzIHdpdGggdGhlIHN1ZmZpeCAnLm1ldGEnLiAgVGhpcwotICogICAgYmVoYXZpb3VyIGlzIHRoZSBzYW1lIGFzIGZvciB0aGUgZGlyZWN0aXZlOgotICoKLSAqICAgICAgIE1ldGFTdWZmaXggLm1ldGEKLSAqCi0gKiBXaGVuIGFjY2Vzc2luZyB0aGUgZmlsZQotICoKLSAqICAgRE9DVU1FTlRfUk9PVC9zb21lZGlyL2luZGV4Lmh0bWwKLSAqCi0gKiB0aGlzIG1vZHVsZSB3aWxsIGxvb2sgZm9yIHRoZSBmaWxlCi0gKgotICogICBET0NVTUVOVF9ST09UL3NvbWVkaXIvLndlYi9pbmRleC5odG1sLm1ldGEKLSAqCi0gKiBhbmQgd2lsbCB1c2UgaXRzIGNvbnRlbnRzIHRvIGdlbmVyYXRlIGFkZGl0aW9uYWwgTUlNRSBoZWFkZXIgCi0gKiBpbmZvcm1hdGlvbi4KLSAqCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQ0VSTiBNZXRhIGZpbGUgc2VtYW50aWNzIHNlZToKLSAqCi0gKiAgIGh0dHA6Ly93d3cudzMub3JnL2h5cGVydGV4dC9XV1cvRGFlbW9uL1VzZXIvQ29uZmlnL0dlbmVyYWwuaHRtbCNNZXRhRGlyCi0gKgotICogQ2hhbmdlLWxvZzoKLSAqIDI5Lkphbi45NiBwZm9wZW4vcGZjbG9zZSBpbnN0ZWFkIG9mIGZvcGVuL2ZjbG9zZQotICogICAgICAgICAgIERFQ0xJTkUgd2hlbiByZWFsIGZpbGUgbm90IGZvdW5kLCB3ZSBtYXkgYmUgY2hlY2tpbmcgZWFjaAotICogICAgICAgICAgIG9mIHRoZSBpbmRleC5odG1sL2luZGV4LnNodG1sL2luZGV4Lmh0bSB2YXJpYW50cyBhbmQgZG9uJ3QKLSAqICAgICAgICAgICBuZWVkIHRvIHJlcG9ydCBtaXNzaW5nIG9uZXMgYXMgc3B1cmlvdXMgZXJyb3JzLiAKLSAqIDMxLkphbi45NiBsb2dfZXJyb3IgcmVwb3J0cyBhYm91dCBhIG1hbGZvcm1lZCAubWV0YSBmaWxlLCByYXRoZXIKLSAqICAgICAgICAgICB0aGFuIGEgc2NyaXB0IGVycm9yLgotICogMjAuSnVuLjk2IE1ldGFGaWxlcyA8b258b2ZmPiBkZWZhdWx0IG9mZiwgYWRkZWQsIHNvIHRoYXQgbW9kdWxlCi0gKiAgICAgICAgICAgY2FuIGJlIGNvbmZpZ3VyZWQgcGVyLWRpcmVjdG9yeS4gIFByaW9yIHRvIHRoaXMgdGhlIG1vZHVsZQotICogICAgICAgICAgIHdhcyBydW5uaW5nIGZvciBlYWNoIHJlcXVlc3QgYW55d2hlcmUgb24gdGhlIHNlcnZlciwgbmF1Z2h0eS4uCi0gKiAyOS5KdW4uOTYgQWxsIGRpcmVjdGl2ZXMgbWFkZSBwZXItZGlyZWN0b3J5LgotICovCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlICJ1dGlsX3NjcmlwdC5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCi0KLSNkZWZpbmUgRElSX0NNRF9QRVJNUyBPUl9JTkRFWEVTCi0KLSNkZWZpbmUgREVGQVVMVF9NRVRBRElSCQkiLndlYiIKLSNkZWZpbmUgREVGQVVMVF9NRVRBU1VGRklYCSIubWV0YSIKLSNkZWZpbmUgREVGQVVMVF9NRVRBRklMRVMJMAotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgY2Vybl9tZXRhX21vZHVsZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNoYXIgKm1ldGFkaXI7Ci0gICAgY2hhciAqbWV0YXN1ZmZpeDsKLSAgICBjaGFyICptZXRhZmlsZXM7Ci19IGNlcm5fbWV0YV9kaXJfY29uZmlnOwotCi1zdGF0aWMgdm9pZCAqY3JlYXRlX2Nlcm5fbWV0YV9kaXJfY29uZmlnKHBvb2wgKnAsIGNoYXIgKmR1bW15KQotewotICAgIGNlcm5fbWV0YV9kaXJfY29uZmlnICpuZXcgPQotICAgIChjZXJuX21ldGFfZGlyX2NvbmZpZyAqKSBhcF9wYWxsb2MocCwgc2l6ZW9mKGNlcm5fbWV0YV9kaXJfY29uZmlnKSk7Ci0KLSAgICBuZXctPm1ldGFkaXIgPSBOVUxMOwotICAgIG5ldy0+bWV0YXN1ZmZpeCA9IE5VTEw7Ci0gICAgbmV3LT5tZXRhZmlsZXMgPSBERUZBVUxUX01FVEFGSUxFUzsKLQotICAgIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyB2b2lkICptZXJnZV9jZXJuX21ldGFfZGlyX2NvbmZpZ3MocG9vbCAqcCwgdm9pZCAqYmFzZXYsIHZvaWQgKmFkZHYpCi17Ci0gICAgY2Vybl9tZXRhX2Rpcl9jb25maWcgKmJhc2UgPSAoY2Vybl9tZXRhX2Rpcl9jb25maWcgKikgYmFzZXY7Ci0gICAgY2Vybl9tZXRhX2Rpcl9jb25maWcgKmFkZCA9IChjZXJuX21ldGFfZGlyX2NvbmZpZyAqKSBhZGR2OwotICAgIGNlcm5fbWV0YV9kaXJfY29uZmlnICpuZXcgPQotICAgIChjZXJuX21ldGFfZGlyX2NvbmZpZyAqKSBhcF9wYWxsb2MocCwgc2l6ZW9mKGNlcm5fbWV0YV9kaXJfY29uZmlnKSk7Ci0KLSAgICBuZXctPm1ldGFkaXIgPSBhZGQtPm1ldGFkaXIgPyBhZGQtPm1ldGFkaXIgOiBiYXNlLT5tZXRhZGlyOwotICAgIG5ldy0+bWV0YXN1ZmZpeCA9IGFkZC0+bWV0YXN1ZmZpeCA/IGFkZC0+bWV0YXN1ZmZpeCA6IGJhc2UtPm1ldGFzdWZmaXg7Ci0gICAgbmV3LT5tZXRhZmlsZXMgPSBhZGQtPm1ldGFmaWxlczsKLQotICAgIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbWV0YWRpcihjbWRfcGFybXMgKnBhcm1zLCBjZXJuX21ldGFfZGlyX2NvbmZpZyAqIGRjb25mLCBjaGFyICphcmcpCi17Ci0gICAgZGNvbmYtPm1ldGFkaXIgPSBhcmc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbWV0YXN1ZmZpeChjbWRfcGFybXMgKnBhcm1zLCBjZXJuX21ldGFfZGlyX2NvbmZpZyAqIGRjb25mLCBjaGFyICphcmcpCi17Ci0gICAgZGNvbmYtPm1ldGFzdWZmaXggPSBhcmc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbWV0YWZpbGVzKGNtZF9wYXJtcyAqcGFybXMsIGNlcm5fbWV0YV9kaXJfY29uZmlnICogZGNvbmYsIGNoYXIgKmFyZykKLXsKLSAgICBkY29uZi0+bWV0YWZpbGVzID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBjZXJuX21ldGFfY21kc1tdID0KLXsKLSAgICB7Ik1ldGFGaWxlcyIsIHNldF9tZXRhZmlsZXMsIE5VTEwsIERJUl9DTURfUEVSTVMsIEZMQUcsCi0gICAgIkxpbWl0ZWQgdG8gJ29uJyBvciAnb2ZmJyJ9LAotICAgIHsiTWV0YURpciIsIHNldF9tZXRhZGlyLCBOVUxMLCBESVJfQ01EX1BFUk1TLCBUQUtFMSwKLSAgICAgInRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBtZXRhIGZpbGVzIn0sCi0gICAgeyJNZXRhU3VmZml4Iiwgc2V0X21ldGFzdWZmaXgsIE5VTEwsIERJUl9DTURfUEVSTVMsIFRBS0UxLAotICAgICAidGhlIGZpbGVuYW1lIHN1ZmZpeCBmb3IgbWV0YSBmaWxlcyJ9LAotICAgIHtOVUxMfQotfTsKLQotLyogWFhYOiB0aGlzIGlzIHZlcnkgc2ltaWxhciB0byBhcF9zY2FuX3NjcmlwdF9oZWFkZXJfZXJyX2NvcmUuLi4KLSAqIGFyZSB0aGUgZGlmZmVyZW5jZXMgZGVsaWJlcmF0ZSwgb3IganVzdCBhIHJlc3VsdCBvZiBiaXQgcm90PwotICovCi1zdGF0aWMgaW50IHNjYW5fbWV0YV9maWxlKHJlcXVlc3RfcmVjICpyLCBGSUxFICpmKQotewotICAgIGNoYXIgd1tNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciAqbDsKLSAgICBpbnQgcDsKLSAgICB0YWJsZSAqdG1wX2hlYWRlcnM7Ci0KLSAgICB0bXBfaGVhZGVycyA9IGFwX21ha2VfdGFibGUoci0+cG9vbCwgNSk7Ci0gICAgd2hpbGUgKGZnZXRzKHcsIE1BWF9TVFJJTkdfTEVOIC0gMSwgZikgIT0gTlVMTCkgewotCi0JLyogRGVsZXRlIHRlcm1pbmFsIChDUj8pTEYgKi8KLQotCXAgPSBzdHJsZW4odyk7Ci0JaWYgKHAgPiAwICYmIHdbcCAtIDFdID09ICdcbicpIHsKLQkgICAgaWYgKHAgPiAxICYmIHdbcCAtIDJdID09ICdcMDE1JykKLQkJd1twIC0gMl0gPSAnXDAnOwotCSAgICBlbHNlCi0JCXdbcCAtIDFdID0gJ1wwJzsKLQl9Ci0KLQlpZiAod1swXSA9PSAnXDAnKSB7Ci0JICAgIHJldHVybiBPSzsKLQl9Ci0KLQkvKiBpZiB3ZSBzZWUgYSBib2d1cyBoZWFkZXIgZG9uJ3QgaWdub3JlIGl0LiBTaG91dCBhbmQgc2NyZWFtICovCi0KLQlpZiAoIShsID0gc3RyY2hyKHcsICc6JykpKSB7Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0JCQkibWFsZm9ybWVkIGhlYWRlciBpbiBtZXRhIGZpbGU6ICVzIiwgci0+ZmlsZW5hbWUpOwotCSAgICByZXR1cm4gU0VSVkVSX0VSUk9SOwotCX0KLQotCSpsKysgPSAnXDAnOwotCXdoaWxlICgqbCAmJiBhcF9pc3NwYWNlKCpsKSkKLQkgICAgKytsOwotCi0JaWYgKCFzdHJjYXNlY21wKHcsICJDb250ZW50LXR5cGUiKSkgewotCSAgICBjaGFyICp0bXA7Ci0JICAgIC8qIE51a2UgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLwotCi0JICAgIGNoYXIgKmVuZHAgPSBsICsgc3RybGVuKGwpIC0gMTsKLQkgICAgd2hpbGUgKGVuZHAgPiBsICYmIGFwX2lzc3BhY2UoKmVuZHApKQotCQkqZW5kcC0tID0gJ1wwJzsKLQotCSAgICB0bXAgPSBhcF9wc3RyZHVwKHItPnBvb2wsIGwpOwotCSAgICBhcF9jb250ZW50X3R5cGVfdG9sb3dlcih0bXApOwotCSAgICByLT5jb250ZW50X3R5cGUgPSB0bXA7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJTdGF0dXMiKSkgewotCSAgICBzc2NhbmYobCwgIiVkIiwgJnItPnN0YXR1cyk7Ci0JICAgIHItPnN0YXR1c19saW5lID0gYXBfcHN0cmR1cChyLT5wb29sLCBsKTsKLQl9Ci0JZWxzZSB7Ci0JICAgIGFwX3RhYmxlX3NldCh0bXBfaGVhZGVycywgdywgbCk7Ci0JfQotICAgIH0KLSAgICBhcF9vdmVybGFwX3RhYmxlcyhyLT5oZWFkZXJzX291dCwgdG1wX2hlYWRlcnMsIEFQX09WRVJMQVBfVEFCTEVTX1NFVCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0aWMgaW50IGFkZF9jZXJuX21ldGFfZGF0YShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjaGFyICptZXRhZmlsZW5hbWU7Ci0gICAgY2hhciAqbGFzdF9zbGFzaDsKLSAgICBjaGFyICpyZWFsX2ZpbGU7Ci0gICAgY2hhciAqc2NyYXBfYm9vazsKLSAgICBGSUxFICpmOwotICAgIGNlcm5fbWV0YV9kaXJfY29uZmlnICpkY29uZjsKLSAgICBpbnQgcnY7Ci0gICAgcmVxdWVzdF9yZWMgKnJyOwotCi0gICAgZGNvbmYgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywgJmNlcm5fbWV0YV9tb2R1bGUpOwotCi0gICAgaWYgKCFkY29uZi0+bWV0YWZpbGVzKSB7Ci0JcmV0dXJuIERFQ0xJTkVEOwotICAgIH07Ci0KLSAgICAvKiBpZiAuLy53ZWIvJDEubWV0YSBleGlzdHMgdGhlbiBvdXRwdXQgJ2FzaXMnICovCi0KLSAgICBpZiAoci0+ZmluZm8uc3RfbW9kZSA9PSAwKSB7Ci0JcmV0dXJuIERFQ0xJTkVEOwotICAgIH07Ci0KLSAgICAvKiBpcyB0aGlzIGEgZGlyZWN0b3J5PyAqLwotICAgIGlmIChTX0lTRElSKHItPmZpbmZvLnN0X21vZGUpIHx8IHItPnVyaVtzdHJsZW4oci0+dXJpKSAtIDFdID09ICcvJykgewotCXJldHVybiBERUNMSU5FRDsKLSAgICB9OwotCi0gICAgLyogd2hhdCBkaXJlY3RvcnkgaXMgdGhpcyBmaWxlIGluPyAqLwotICAgIHNjcmFwX2Jvb2sgPSBhcF9wc3RyZHVwKHItPnBvb2wsIHItPmZpbGVuYW1lKTsKLSAgICAvKiBza2lwIGxlYWRpbmcgc2xhc2gsIHJlY292ZXJlZCBpbiBsYXRlciBwcm9jZXNzaW5nICovCi0gICAgc2NyYXBfYm9vaysrOwotICAgIGxhc3Rfc2xhc2ggPSBzdHJyY2hyKHNjcmFwX2Jvb2ssICcvJyk7Ci0gICAgaWYgKGxhc3Rfc2xhc2ggIT0gTlVMTCkgewotCS8qIHNraXAgb3ZlciBsYXN0IHNsYXNoICovCi0JcmVhbF9maWxlID0gbGFzdF9zbGFzaDsKLQlyZWFsX2ZpbGUrKzsKLQkqbGFzdF9zbGFzaCA9ICdcMCc7Ci0gICAgfQotICAgIGVsc2UgewotCS8qIG5vIGxhc3Qgc2xhc2gsIGJ1aD8hICovCi0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgciwKLQkJICAgICJpbnRlcm5hbCBlcnJvciBpbiBtb2RfY2Vybl9tZXRhOiAlcyIsIHItPmZpbGVuYW1lKTsKLQkvKiBzaG91bGQgcmVhbGx5IGJhcmYsIGJ1dCBoZXksIGxldCdzIGJlIGZyaWVuZHMuLi4gKi8KLQlyZXR1cm4gREVDTElORUQ7Ci0gICAgfTsKLQotICAgIG1ldGFmaWxlbmFtZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgIi8iLCBzY3JhcF9ib29rLCAiLyIsCi0JCQkgICBkY29uZi0+bWV0YWRpciA/IGRjb25mLT5tZXRhZGlyIDogREVGQVVMVF9NRVRBRElSLAotCQkJICAgIi8iLCByZWFsX2ZpbGUsCi0JCSBkY29uZi0+bWV0YXN1ZmZpeCA/IGRjb25mLT5tZXRhc3VmZml4IDogREVGQVVMVF9NRVRBU1VGRklYLAotCQkJICAgTlVMTCk7Ci0KLSAgICAvKiBYWFg6IGl0IHN1Y2tzIHRvIHJlcXVpcmUgdGhpcyBzdWJyZXF1ZXN0IHRvIGNvbXBsZXRlLCBiZWNhdXNlIHRoaXMKLSAgICAgKiBtZWFucyBwZW9wbGUgbXVzdCBsZWF2ZSB0aGVpciBtZXRhIGZpbGVzIGFjY2Vzc2libGUgdG8gdGhlIHdvcmxkLgotICAgICAqIEEgYmV0dGVyIHNvbHV0aW9uIG1pZ2h0IGJlIGEgInNhZmUgb3BlbiIgZmVhdHVyZSBvZiBwZm9wZW4gdG8gYXZvaWQKLSAgICAgKiBwaXBlcywgc3ltbGlua3MsIGFuZCBjcmFwIGxpa2UgdGhhdC4KLSAgICAgKi8KLSAgICByciA9IGFwX3N1Yl9yZXFfbG9va3VwX2ZpbGUobWV0YWZpbGVuYW1lLCByKTsKLSAgICBpZiAocnItPnN0YXR1cyAhPSBIVFRQX09LKSB7Ci0JYXBfZGVzdHJveV9zdWJfcmVxKHJyKTsKLQlyZXR1cm4gREVDTElORUQ7Ci0gICAgfQotICAgIGFwX2Rlc3Ryb3lfc3ViX3JlcShycik7Ci0KLSAgICBmID0gYXBfcGZvcGVuKHItPnBvb2wsIG1ldGFmaWxlbmFtZSwgInIiKTsKLSAgICBpZiAoZiA9PSBOVUxMKSB7Ci0JaWYgKGVycm5vID09IEVOT0VOVCkgewotCSAgICByZXR1cm4gREVDTElORUQ7Ci0JfQotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotCSAgICAgICJtZXRhIGZpbGUgcGVybWlzc2lvbnMgZGVueSBzZXJ2ZXIgYWNjZXNzOiAlcyIsIG1ldGFmaWxlbmFtZSk7Ci0JcmV0dXJuIEZPUkJJRERFTjsKLSAgICB9OwotCi0gICAgLyogcmVhZCB0aGUgaGVhZGVycyBpbiAqLwotICAgIHJ2ID0gc2Nhbl9tZXRhX2ZpbGUociwgZik7Ci0gICAgYXBfcGZjbG9zZShyLT5wb29sLCBmKTsKLQotICAgIHJldHVybiBydjsKLX0KLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGNlcm5fbWV0YV9tb2R1bGUgPQotewotICAgIFNUQU5EQVJEX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLAkJCS8qIGluaXRpYWxpemVyICovCi0gICAgY3JlYXRlX2Nlcm5fbWV0YV9kaXJfY29uZmlnLAkvKiBkaXIgY29uZmlnIGNyZWF0ZXIgKi8KLSAgICBtZXJnZV9jZXJuX21ldGFfZGlyX2NvbmZpZ3MsCS8qIGRpciBtZXJnZXIgLS0tIGRlZmF1bHQgaXMgdG8gb3ZlcnJpZGUgKi8KLSAgICBOVUxMLAkJCS8qIHNlcnZlciBjb25maWcgKi8KLSAgICBOVUxMLAkJCS8qIG1lcmdlIHNlcnZlciBjb25maWdzICovCi0gICAgY2Vybl9tZXRhX2NtZHMsCQkvKiBjb21tYW5kIHRhYmxlICovCi0gICAgTlVMTCwJCQkvKiBoYW5kbGVycyAqLwotICAgIE5VTEwsCQkJLyogZmlsZW5hbWUgdHJhbnNsYXRpb24gKi8KLSAgICBOVUxMLAkJCS8qIGNoZWNrX3VzZXJfaWQgKi8KLSAgICBOVUxMLAkJCS8qIGNoZWNrIGF1dGggKi8KLSAgICBOVUxMLAkJCS8qIGNoZWNrIGFjY2VzcyAqLwotICAgIE5VTEwsCQkJLyogdHlwZV9jaGVja2VyICovCi0gICAgYWRkX2Nlcm5fbWV0YV9kYXRhLAkJLyogZml4dXBzICovCi0gICAgTlVMTCwJCQkvKiBsb2dnZXIgKi8KLSAgICBOVUxMLAkJCS8qIGhlYWRlciBwYXJzZXIgKi8KLSAgICBOVUxMLAkJCS8qIGNoaWxkX2luaXQgKi8KLSAgICBOVUxMLAkJCS8qIGNoaWxkX2V4aXQgKi8KLSAgICBOVUxMCQkJLyogcG9zdCByZWFkLXJlcXVlc3QgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL21ldGFkYXRhL21vZF9jZXJuX21ldGEuZHNwIGIvbW9kdWxlcy9tZXRhZGF0YS9tb2RfY2Vybl9tZXRhLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU2NGMwZS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21ldGFkYXRhL21vZF9jZXJuX21ldGEuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iQXBhY2hlTW9kdWxlQ0VSTk1ldGEiIC0gUGFja2FnZSBPd25lcj08ND4KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDUuMDAKLSMgKiogRE8gTk9UIEVESVQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDEwMgotCi1DRkc9QXBhY2hlTW9kdWxlQ0VSTk1ldGEgLSBXaW4zMiBSZWxlYXNlCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIkFwYWNoZU1vZHVsZUNFUk5NZXRhLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiQXBhY2hlTW9kdWxlQ0VSTk1ldGEubWFrIlwKLSBDRkc9IkFwYWNoZU1vZHVsZUNFUk5NZXRhIC0gV2luMzIgUmVsZWFzZSIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJBcGFjaGVNb2R1bGVDRVJOTWV0YSAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvblwKLSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgIkFwYWNoZU1vZHVsZUNFUk5NZXRhIC0gV2luMzIgRGVidWciIChiYXNlZCBvblwKLSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLU1UTD1taWRsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJBcGFjaGVNb2R1bGVDRVJOTWV0YSAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiLlxBcGFjaGVNb2R1bGVDRVJOTWV0YVIiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVNb2R1bGVDRVJOTWV0YVIiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dYIC9PMiAvSSAiLi5cLi5caW5jbHVkZSIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJTSEFSRURfTU9EVUxFIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiAuLlwuLlxDb3JlUlxBcGFjaGVDb3JlLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFjaGluZTpJMzg2Ci0KLSFFTFNFSUYgICIkKENGRykiID09ICJBcGFjaGVNb2R1bGVDRVJOTWV0YSAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxEZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIi5cRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiLlxBcGFjaGVNb2R1bGVDRVJOTWV0YUQiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVNb2R1bGVDRVJOTWV0YUQiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvSSAiLi5cLi5caW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJTSEFSRURfTU9EVUxFIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgLi5cLi5cQ29yZURcQXBhY2hlQ29yZS5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIkFwYWNoZU1vZHVsZUNFUk5NZXRhIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAiQXBhY2hlTW9kdWxlQ0VSTk1ldGEgLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2hwajtiYXQ7Zm9yO2Y5MCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXG1vZHVsZXNcc3RhbmRhcmRcbW9kX2Nlcm5fbWV0YS5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sO2ZpO2ZkIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxyZWFkZGlyLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO2NudDtydGY7Z2lmO2pwZztqcGVnO2pwZSIKLSMgRW5kIEdyb3VwCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX2Nlcm5fbWV0YS5leHAgYi9tb2R1bGVzL21ldGFkYXRhL21vZF9jZXJuX21ldGEuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzZlMmJlLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX2Nlcm5fbWV0YS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1jZXJuX21ldGFfbW9kdWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL21ldGFkYXRhL21vZF9lbnYuYyBiL21vZHVsZXMvbWV0YWRhdGEvbW9kX2Vudi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTFhNDg3Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX2Vudi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVCdTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBtb2RfZW52LmMKLSAqIHZlcnNpb24gMC4wLjUKLSAqIHN0YXR1cyBiZXRhCi0gKiBQYXNzIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBDR0kvU1NJIHNjcmlwdHMuCi0gKiAKLSAqIEFuZHJldyBXaWxzb24gPEFuZHJldy5XaWxzb25AY20uY2YuYWMudWs+IDA2LkRlYy45NQotICoKLSAqIENoYW5nZSBsb2c6Ci0gKiAwOC5EZWMuOTUgTm93IGFsbG93cyBQYXNzRW52IGRpcmVjdGl2ZSB0byBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgaW4KLSAqICAgICAgICAgICBjb25mIGZpbGVzLgotICogMTAuRGVjLjk1IG9wdGltaXNhdGlvbi4gIGdldGVudigpIG9ubHkgY2FsbGVkIGF0IHN0YXJ0dXAgYW5kIHVzZWQgCi0gKiAgICAgICAgICAgdG8gYnVpbGQgYSBmYXN0LXRvLWFjY2VzcyB0YWJsZS4gIHRhYmxlIHVzZWQgdG8gYnVpbGQgCi0gKiAgICAgICAgICAgcGVyLXNlcnZlciBlbnZpcm9ubWVudCBmb3IgZWFjaCByZXF1ZXN0LgotICogICAgICAgICAgIHJvYnVzdG5lc3MuICBiZXR0ZXIgYWJsZSB0byBoYW5kbGUgZXJyb3JzIGluIGNvbmZpZ3VyYXRpb24KLSAqICAgICAgICAgICBmaWxlczoKLSAqICAgICAgICAgICAxKSAgUGFzc0VudiBkaXJlY3RpdmUgcHJlc2VudCwgYnV0IG5vIGVudmlyb25tZW50IHZhcmlhYmxlIGxpc3RlZAotICogICAgICAgICAgIDIpICBQYXNzRW52IEZPTyBwcmVzZW50LCBidXQgJEZPTyBub3QgcHJlc2VudCBpbiBlbnZpcm9ubWVudAotICogICAgICAgICAgIDMpICBubyBQYXNzRW52IGRpcmVjdGl2ZSBwcmVzZW50Ci0gKiAyMy5EZWMuOTUgTm93IGFsbG93cyBTZXRFbnYgZGlyZWN0aXZlIHdpdGggc2FtZSBzZW1hbnRpY3MgYXMgJ3NoJyBzZXRlbnY6Ci0gKiAgICAgICAgICAgICAgU2V0RW52IFZhciAgICAgIHNldHMgVmFyIHRvIHRoZSBlbXB0eSBzdHJpbmcKLSAqICAgICAgICAgICAgICBTZXRFbnYgVmFyIFZhbCAgc2V0cyBWYXIgdG8gdGhlIHZhbHVlIFZhbAotICogICAgICAgICAgIFZhbHVlcyBjb250YWluaW5nIHdoaXRlc3BhY2Ugc2hvdWxkIGJlIHF1b3RlZCwgZWc6Ci0gKiAgICAgICAgICAgICAgU2V0RW52IFZhciAidGhpcyBpcyBzb21lIHRleHQiCi0gKiAgICAgICAgICAgRW52aXJvbm1lbnQgdmFyaWFibGVzIHRha2UgdGhlaXIgdmFsdWUgZnJvbSB0aGUgbGFzdCBpbnN0YW5jZQotICogICAgICAgICAgIG9mIFBhc3NFbnYgLyBTZXRFbnYgdG8gYmUgcmVhY2hlZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotICogICAgICAgICAgIEZvciBleGFtcGxlLCB0aGUgc2VxdWVuY2U6Ci0gKiAgICAgICAgICAgICAgUGFzc0VudiBGT08KLSAqICAgICAgICAgICAgICBTZXRFbnYgRk9PIG92ZXJyaWRlCi0gKiAgICAgICAgICAgQ2F1c2VzIEZPTyB0byB0YWtlIHRoZSB2YWx1ZSAnb3ZlcnJpZGUnLgotICogMjMuRmViLjk2IEFkZGVkIFVuc2V0RW52IGRpcmVjdGl2ZSB0byBhbGxvdyBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLSAqICAgICAgICAgICB0byBiZSByZW1vdmVkLgotICogICAgICAgICAgIFZpcnR1YWwgaG9zdHMgbm93ICdpbmhlcml0JyBwYXJlbnQgc2VydmVyIGVudmlyb25tZW50IHdoaWNoCi0gKiAgICAgICAgICAgdGhleSdyZSBhYmxlIHRvIG92ZXJ3cml0ZSB3aXRoIHRoZWlyIG93biBkaXJlY3RpdmVzIG9yCi0gKiAgICAgICAgICAgc2VsZWN0aXZlbHkgaWdub3JlIHdpdGggVW5zZXRFbnYuCi0gKiAgICAgICAqKiogSU1QT1JUQU5UIC0gdGhlIHdheSB0aGF0IHZpcnR1YWwgaG9zdHMgaW5oZXJpdCB0aGVpciAqKioKLSAqICAgICAgICoqKiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSB0aGUgZGVmYXVsdCBzZXJ2ZXIncyAgICAgICoqKgotICogICAgICAgKioqIGNvbmZpZ3VyYXRpb24gaGFzIGNoYW5nZWQuICBZb3Ugc2hvdWxkIHRlc3QgeW91ciAgICAgKioqCi0gKiAgICAgICAqKiogY29uZmlndXJhdGlvbiBjYXJlZnVsbHkgYmVmb3JlIGFjY2VwdGluZyB0aGlzICAgICAgICAqKioKLSAqICAgICAgICoqKiB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUgaW4gYSBsaXZlIHdlYnNlcnZlciB3aGljaCB1c2VkICoqKgotICogICAgICAgKioqIG9sZGVyIHZlcnNpb25zIG9mIHRoZSBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgKioqCi0gKi8KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHRhYmxlICp2YXJzOwotICAgIGNoYXIgKnVuc2V0ZW52OwotICAgIGludCB2YXJzX3ByZXNlbnQ7Ci19IGVudl9kaXJfY29uZmlnX3JlYzsKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGVudl9tb2R1bGU7Ci0KLXN0YXRpYyB2b2lkICpjcmVhdGVfZW52X2Rpcl9jb25maWcocG9vbCAqcCwgY2hhciAqZHVtbXkpCi17Ci0gICAgZW52X2Rpcl9jb25maWdfcmVjICpuZXcgPQotICAgIChlbnZfZGlyX2NvbmZpZ19yZWMgKikgYXBfcGFsbG9jKHAsIHNpemVvZihlbnZfZGlyX2NvbmZpZ19yZWMpKTsKLSAgICBuZXctPnZhcnMgPSBhcF9tYWtlX3RhYmxlKHAsIDUwKTsKLSAgICBuZXctPnVuc2V0ZW52ID0gIiI7Ci0gICAgbmV3LT52YXJzX3ByZXNlbnQgPSAwOwotICAgIHJldHVybiAodm9pZCAqKSBuZXc7Ci19Ci0KLXN0YXRpYyB2b2lkICptZXJnZV9lbnZfZGlyX2NvbmZpZ3MocG9vbCAqcCwgdm9pZCAqYmFzZXYsIHZvaWQgKmFkZHYpCi17Ci0gICAgZW52X2Rpcl9jb25maWdfcmVjICpiYXNlID0gKGVudl9kaXJfY29uZmlnX3JlYyAqKSBiYXNldjsKLSAgICBlbnZfZGlyX2NvbmZpZ19yZWMgKmFkZCA9IChlbnZfZGlyX2NvbmZpZ19yZWMgKikgYWRkdjsKLSAgICBlbnZfZGlyX2NvbmZpZ19yZWMgKm5ldyA9Ci0gICAgKGVudl9kaXJfY29uZmlnX3JlYyAqKSBhcF9wYWxsb2MocCwgc2l6ZW9mKGVudl9kaXJfY29uZmlnX3JlYykpOwotCi0gICAgdGFibGUgKm5ld190YWJsZTsKLSAgICB0YWJsZV9lbnRyeSAqZWx0czsKLSAgICBhcnJheV9oZWFkZXIgKmFycjsKLQotICAgIGludCBpOwotICAgIGNvbnN0IGNoYXIgKnVlbnYsICp1bnNldDsKLQotICAgIC8qIAotICAgICAqIG5ld190YWJsZSA9IGNvcHlfdGFibGUoIHAsIGJhc2UtPnZhcnMgKTsKLSAgICAgKiBmb3JlYWNoICRlbGVtZW50ICggQGFkZC0+dmFycyApIHsKLSAgICAgKiAgICAgdGFibGVfc2V0KCBuZXdfdGFibGUsICRlbGVtZW50LmtleSwgJGVsZW1lbnQudmFsICk7Ci0gICAgICogfTsKLSAgICAgKiBmb3JlYWNoICR1bnNldGVudiAoIEBVTlNFVEVOViApIHsKLSAgICAgKiAgICAgdGFibGVfdW5zZXQoIG5ld190YWJsZSwgJHVuc2V0ZW52ICk7Ci0gICAgICogfQotICAgICAqLwotCi0gICAgbmV3X3RhYmxlID0gYXBfY29weV90YWJsZShwLCBiYXNlLT52YXJzKTsKLQotICAgIGFyciA9IGFwX3RhYmxlX2VsdHMoYWRkLT52YXJzKTsKLSAgICBlbHRzID0gKHRhYmxlX2VudHJ5ICopYXJyLT5lbHRzOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGFyci0+bmVsdHM7ICsraSkgewotICAgICAgICBhcF90YWJsZV9zZXRuKG5ld190YWJsZSwgZWx0c1tpXS5rZXksIGVsdHNbaV0udmFsKTsKLSAgICB9Ci0KLSAgICB1bnNldCA9IGFkZC0+dW5zZXRlbnY7Ci0gICAgdWVudiA9IGFwX2dldHdvcmRfY29uZihwLCAmdW5zZXQpOwotICAgIHdoaWxlICh1ZW52WzBdICE9ICdcMCcpIHsKLSAgICAgICAgYXBfdGFibGVfdW5zZXQobmV3X3RhYmxlLCB1ZW52KTsKLSAgICAgICAgdWVudiA9IGFwX2dldHdvcmRfY29uZihwLCAmdW5zZXQpOwotICAgIH0KLQotICAgIG5ldy0+dmFycyA9IG5ld190YWJsZTsKLQotICAgIG5ldy0+dmFyc19wcmVzZW50ID0gYmFzZS0+dmFyc19wcmVzZW50IHx8IGFkZC0+dmFyc19wcmVzZW50OwotCi0gICAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmFkZF9lbnZfbW9kdWxlX3ZhcnNfcGFzc2VkKGNtZF9wYXJtcyAqY21kLAotCQkJCQkgICAgICBlbnZfZGlyX2NvbmZpZ19yZWMgKnNjb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICB0YWJsZSAqdmFycyA9IHNjb25mLT52YXJzOwotICAgIGNoYXIgKmVudl92YXI7Ci0gICAgY2hhciAqbmFtZV9wdHI7Ci0KLSAgICB3aGlsZSAoKmFyZykgewotICAgICAgICBuYW1lX3B0ciA9IGFwX2dldHdvcmRfY29uZihjbWQtPnBvb2wsICZhcmcpOwotICAgICAgICBlbnZfdmFyID0gZ2V0ZW52KG5hbWVfcHRyKTsKLSAgICAgICAgaWYgKGVudl92YXIgIT0gTlVMTCkgewotICAgICAgICAgICAgc2NvbmYtPnZhcnNfcHJlc2VudCA9IDE7Ci0gICAgICAgICAgICBhcF90YWJsZV9zZXRuKHZhcnMsIG5hbWVfcHRyLCBhcF9wc3RyZHVwKGNtZC0+cG9vbCwgZW52X3ZhcikpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqYWRkX2Vudl9tb2R1bGVfdmFyc19zZXQoY21kX3Bhcm1zICpjbWQsCi0JCQkJCSAgIGVudl9kaXJfY29uZmlnX3JlYyAqc2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXJnKQotewotICAgIHRhYmxlICp2YXJzID0gc2NvbmYtPnZhcnM7Ci0gICAgY2hhciAqbmFtZSwgKnZhbHVlOwotCi0gICAgbmFtZSA9IGFwX2dldHdvcmRfY29uZihjbWQtPnBvb2wsICZhcmcpOwotICAgIHZhbHVlID0gYXBfZ2V0d29yZF9jb25mKGNtZC0+cG9vbCwgJmFyZyk7Ci0KLSAgICAvKiBuYW1lIGlzIG1hbmRhdG9yeSwgdmFsdWUgaXMgb3B0aW9uYWwuICBubyB2YWx1ZSBtZWFucwotICAgICAqIHNldCB0aGUgdmFyaWFibGUgdG8gYW4gZW1wdHkgc3RyaW5nCi0gICAgICovCi0KLQotICAgIGlmICgoKm5hbWUgPT0gJ1wwJykgfHwgKCphcmcgIT0gJ1wwJykpIHsKLSAgICAgICAgcmV0dXJuICJTZXRFbnYgdGFrZXMgb25lIG9yIHR3byBhcmd1bWVudHMuICBBbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIGFuZCBhbiBvcHRpb25hbCB2YWx1ZSB0byBwYXNzIHRvIENHSS4iOwotICAgIH0KLQotICAgIHNjb25mLT52YXJzX3ByZXNlbnQgPSAxOwotICAgIGFwX3RhYmxlX3NldG4odmFycywgbmFtZSwgdmFsdWUpOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICphZGRfZW52X21vZHVsZV92YXJzX3Vuc2V0KGNtZF9wYXJtcyAqY21kLAotCQkJCQkgICAgIGVudl9kaXJfY29uZmlnX3JlYyAqc2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICphcmcpCi17Ci0gICAgc2NvbmYtPnVuc2V0ZW52ID0gc2NvbmYtPnVuc2V0ZW52ID8KLSAgICAgICAgYXBfcHN0cmNhdChjbWQtPnBvb2wsIHNjb25mLT51bnNldGVudiwgIiAiLCBhcmcsIE5VTEwpIDoKLSAgICAgICAgIGFyZzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIGVudl9tb2R1bGVfY21kc1tdID0KLXsKLSAgICB7IlBhc3NFbnYiLCBhZGRfZW52X21vZHVsZV92YXJzX3Bhc3NlZCwgTlVMTCwKLSAgICAgT1JfRklMRUlORk8sIFJBV19BUkdTLCAiYSBsaXN0IG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBwYXNzIHRvIENHSS4ifSwKLSAgICB7IlNldEVudiIsIGFkZF9lbnZfbW9kdWxlX3ZhcnNfc2V0LCBOVUxMLAotICAgICBPUl9GSUxFSU5GTywgUkFXX0FSR1MsICJhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIGFuZCBhIHZhbHVlIHRvIHBhc3MgdG8gQ0dJLiJ9LAotICAgIHsiVW5zZXRFbnYiLCBhZGRfZW52X21vZHVsZV92YXJzX3Vuc2V0LCBOVUxMLAotICAgICBPUl9GSUxFSU5GTywgUkFXX0FSR1MsICJhIGxpc3Qgb2YgdmFyaWFibGVzIHRvIHJlbW92ZSBmcm9tIHRoZSBDR0kgZW52aXJvbm1lbnQuIn0sCi0gICAge05VTEx9LAotfTsKLQotc3RhdGljIGludCBmaXh1cF9lbnZfbW9kdWxlKHJlcXVlc3RfcmVjICpyKQotewotICAgIHRhYmxlICplID0gci0+c3VicHJvY2Vzc19lbnY7Ci0gICAgZW52X2Rpcl9jb25maWdfcmVjICpzY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW52X21vZHVsZSk7Ci0gICAgdGFibGUgKnZhcnMgPSBzY29uZi0+dmFyczsKLQotICAgIGlmICghc2NvbmYtPnZhcnNfcHJlc2VudCkKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotCi0gICAgci0+c3VicHJvY2Vzc19lbnYgPSBhcF9vdmVybGF5X3RhYmxlcyhyLT5wb29sLCBlLCB2YXJzKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGVudl9tb2R1bGUgPQotewotICAgIFNUQU5EQVJEX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZXIgKi8KLSAgICBjcmVhdGVfZW52X2Rpcl9jb25maWcsICAgICAgLyogZGlyIGNvbmZpZyBjcmVhdGVyICovCi0gICAgbWVyZ2VfZW52X2Rpcl9jb25maWdzLCAgICAgIC8qIGRpciBtZXJnZXIgLS0tIGRlZmF1bHQgaXMgdG8gb3ZlcnJpZGUgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogc2VydmVyIGNvbmZpZyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBtZXJnZSBzZXJ2ZXIgY29uZmlncyAqLwotICAgIGVudl9tb2R1bGVfY21kcywgICAgICAgICAgICAvKiBjb21tYW5kIHRhYmxlICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGhhbmRsZXJzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGVuYW1lIHRyYW5zbGF0aW9uICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrX3VzZXJfaWQgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgYXV0aCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBhY2Nlc3MgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHlwZV9jaGVja2VyICovCi0gICAgZml4dXBfZW52X21vZHVsZSwgICAgICAgICAgIC8qIGZpeHVwcyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2dnZXIgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaGVhZGVyIHBhcnNlciAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGlsZF9pbml0ICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoaWxkX2V4aXQgKi8KLSAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdCByZWFkLXJlcXVlc3QgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL21ldGFkYXRhL21vZF9lbnYuZHNwIGIvbW9kdWxlcy9tZXRhZGF0YS9tb2RfZW52LmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhNDEyMy4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21ldGFkYXRhL21vZF9lbnYuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ibW9kX2VudiIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyCi0KLUNGRz1tb2RfZW52IC0gV2luMzIgUmVsZWFzZQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJtb2RfZW52Lm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAibW9kX2Vudi5tYWsiIENGRz0ibW9kX2VudiAtIFdpbjMyIFJlbGVhc2UiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAibW9kX2VudiAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgIm1vZF9lbnYgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLU1UTD1taWRsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJtb2RfZW52IC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvSSAiLi4vLi4vaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHIvaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHItdXRpbC9pbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0ZkIlJlbGVhc2VcbW9kX2VudiIgL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9tYWNoaW5lOkkzODYgL291dDoiUmVsZWFzZS9tb2RfZW52LnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF9lbnYKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9tYWNoaW5lOkkzODYgL291dDoiUmVsZWFzZS9tb2RfZW52LnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF9lbnYKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9lbnYgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aaSAvT2QgL0kgIi4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9GZCJEZWJ1Z1xtb2RfZW52IiAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9pbmNyZW1lbnRhbDpubyAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6IkRlYnVnL21vZF9lbnYuc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX2VudgotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9pbmNyZW1lbnRhbDpubyAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6IkRlYnVnL21vZF9lbnYuc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX2VudgotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAibW9kX2VudiAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgIm1vZF9lbnYgLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kX2Vudi5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2RfZW52LnJjCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9lbnYgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIENyZWF0aW5nIFZlcnNpb24gUmVzb3VyY2UKLUlucHV0UGF0aD0uLlwuLlxidWlsZFx3aW4zMlx3aW4zMnZlci5hd2sKLQotIi5cbW9kX2Vudi5yYyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQlhd2sgLWYgLi4vLi4vYnVpbGQvd2luMzIvd2luMzJ2ZXIuYXdrIG1vZF9lbnYgICJlbnZfbW9kdWxlIGZvciBBcGFjaGUiIC4uLy4uL2luY2x1ZGUvYXBfcmVsZWFzZS5oICA+IC5cbW9kX2Vudi5yYwotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9lbnYgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBDcmVhdGluZyBWZXJzaW9uIFJlc291cmNlCi1JbnB1dFBhdGg9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSIuXG1vZF9lbnYucmMiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JYXdrIC1mIC4uLy4uL2J1aWxkL3dpbjMyL3dpbjMydmVyLmF3ayBtb2RfZW52ICAiZW52X21vZHVsZSBmb3IgQXBhY2hlIiAuLi8uLi9pbmNsdWRlL2FwX3JlbGVhc2UuaCAgPiAuXG1vZF9lbnYucmMKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfZW52LmV4cCBiL21vZHVsZXMvbWV0YWRhdGEvbW9kX2Vudi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ODdiZjAuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfZW52LmV4cAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWVudl9tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX2V4cGlyZXMuYyBiL21vZHVsZXMvbWV0YWRhdGEvbW9kX2V4cGlyZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjZjUxYS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21ldGFkYXRhL21vZF9leHBpcmVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTAgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUJ1MgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIG1vZF9leHBpcmVzLmMKLSAqIHZlcnNpb24gMC4wLjExCi0gKiBzdGF0dXMgYmV0YQotICogCi0gKiBBbmRyZXcgV2lsc29uIDxBbmRyZXcuV2lsc29uQGNtLmNmLmFjLnVrPiAyNi5KYW4uOTYKLSAqCi0gKiBUaGlzIG1vZHVsZSBhbGxvd3MgeW91IHRvIGNvbnRyb2wgdGhlIGZvcm0gb2YgdGhlIEV4cGlyZXM6IGhlYWRlcgotICogdGhhdCBBcGFjaGUgaXNzdWVzIGZvciBlYWNoIGFjY2Vzcy4gIERpcmVjdGl2ZXMgY2FuIGFwcGVhciBpbgotICogY29uZmlndXJhdGlvbiBmaWxlcyBvciBpbiAuaHRhY2Nlc3MgZmlsZXMgc28gZXhwaXJ5IHNlbWFudGljcyBjYW4KLSAqIGJlIGRlZmluZWQgb24gYSBwZXItZGlyZWN0b3J5IGJhc2lzLiAgCi0gKgotICogRElSRUNUSVZFIFNZTlRBWAotICoKLSAqIFZhbGlkIGRpcmVjdGl2ZXMgYXJlOgotICoKLSAqICAgICBFeHBpcmVzQWN0aXZlIG9uIHwgb2ZmCi0gKiAgICAgRXhwaXJlc0RlZmF1bHQgPGNvZGU+PHNlY29uZHM+Ci0gKiAgICAgRXhwaXJlc0J5VHlwZSB0eXBlL2VuY29kaW5nIDxjb2RlPjxzZWNvbmRzPgotICoKLSAqIFZhbGlkIHZhbHVlcyBmb3IgPGNvZGU+IGFyZToKLSAqCi0gKiAgICAgJ00nICAgICAgZXhwaXJlcyBoZWFkZXIgc2hvd3MgZmlsZSBtb2RpZmljYXRpb24gZGF0ZSArIDxzZWNvbmRzPgotICogICAgICdBJyAgICAgIGV4cGlyZXMgaGVhZGVyIHNob3dzIGFjY2VzcyB0aW1lICsgPHNlY29uZHM+Ci0gKgotICogICAgICAgICAgICAgIFtJJ20gbm90IHN1cmUgd2hpY2ggb2YgdGhlc2UgaXMgYmVzdCB1bmRlciBkaWZmZXJlbnQKLSAqICAgICAgICAgICAgICBjaXJjdW1zdGFuY2VzLCBJIGd1ZXNzIGl0J3MgZm9yIG90aGVyIHBlb3BsZSB0byBleHBsb3JlLgotICogICAgICAgICAgICAgIFRoZSBlZmZlY3RzIG1heSBiZSBpbmRpc3Rpbmd1aXNoYWJsZSBmb3IgYSBudW1iZXIgb2YgY2FzZXNdCi0gKgotICogPHNlY29uZHM+IHNob3VsZCBiZSBhbiBpbnRlZ2VyIHZhbHVlIFthY2NlcHRhYmxlIHRvIGF0b2koKV0KLSAqCi0gKiBUaGVyZSBpcyBOTyBzcGFjZSBiZXR3ZWVuIHRoZSA8Y29kZT4gYW5kIDxzZWNvbmRzPi4KLSAqCi0gKiBGb3IgZXhhbXBsZSwgYSBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gd2hpY2ggY2hhbmdlcwotICogZnJlcXVlbnRseSBtaWdodCBjb250YWluOgotICoKLSAqICAgICAjIHJlcG9ydHMgZ2VuZXJhdGVkIGJ5IGNyb24gZXZlcnkgaG91ci4gIGRvbid0IGxldCBjYWNoZXMKLSAqICAgICAjIGhvbGQgb250byBzdGFsZSBpbmZvcm1hdGlvbgotICogICAgIEV4cGlyZXNEZWZhdWx0IE0zNjAwCi0gKgotICogQW5vdGhlciBleGFtcGxlLCBvdXIgaHRtbCBwYWdlcyBjYW4gY2hhbmdlIGFsbCB0aGUgdGltZSwgdGhlIGdpZnMKLSAqIHRlbmQgbm90IHRvIGNoYW5nZSBvZnRlbjoKLSAqIAotICogICAgICMgcGFnZXMgYXJlIGhvdCAoMSB3ZWVrKSwgaW1hZ2VzIGFyZSBjb2xkICgxIG1vbnRoKQotICogICAgIEV4cGlyZXNCeVR5cGUgdGV4dC9odG1sIEE2MDQ4MDAKLSAqICAgICBFeHBpcmVzQnlUeXBlIGltYWdlL2dpZiBBMjU5MjAwMAotICoKLSAqIEV4cGlyZXMgY2FuIGJlIHR1cm5lZCBvbiBmb3IgYWxsIFVSTHMgb24gdGhlIHNlcnZlciBieSBwbGFjaW5nIHRoZQotICogZm9sbG93aW5nIGRpcmVjdGl2ZSBpbiBhIGNvbmYgZmlsZToKLSAqCi0gKiAgICAgRXhwaXJlc0FjdGl2ZSBvbgotICoKLSAqIEV4cGlyZXNBY3RpdmUgY2FuIGFsc28gYXBwZWFyIGluIC5odGFjY2VzcyBmaWxlcywgZW5hYmxpbmcgdGhlCi0gKiBiZWhhdmlvdXIgdG8gYmUgdHVybmVkIG9uIG9yIG9mZiBmb3IgZWFjaCBjaG9zZW4gZGlyZWN0b3J5LgotICoKLSAqICAgICAjIHR1cm4gb2ZmIEV4cGlyZXMgYmVoYXZpb3VyIGluIHRoaXMgZGlyZWN0b3J5Ci0gKiAgICAgIyBhbmQgc3ViZGlyZWN0b3JpZXMKLSAqICAgICBFeHBpcmVzQWN0aXZlIG9mZgotICoKLSAqIERpcmVjdGl2ZXMgZGVmaW5lZCBmb3IgYSBkaXJlY3RvcnkgYXJlIHZhbGlkIGluIHN1YmRpcmVjdG9yaWVzCi0gKiB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuIGJ5IG5ldyBkaXJlY3RpdmVzIGluIHRoZSBzdWJkaXJlY3RvcnkKLSAqIC5odGFjY2VzcyBmaWxlcy4KLSAqCi0gKiBBTFRFUk5BVElWRSBESVJFQ1RJVkUgU1lOVEFYCi0gKgotICogRGlyZWN0aXZlcyBjYW4gYWxzbyBiZSBkZWZpbmVkIGluIGEgbW9yZSByZWFkYWJsZSBzeW50YXggb2YgdGhlIGZvcm06Ci0gKgotICogICAgIEV4cGlyZXNEZWZhdWx0ICI8YmFzZT4gW3BsdXNdIHs8bnVtPiA8dHlwZT59KiIKLSAqICAgICBFeHBpcmVzQnlUeXBlIHR5cGUvZW5jb2RpbmcgIjxiYXNlPiBbcGx1c10gezxudW0+IDx0eXBlPn0qIgotICoKLSAqIHdoZXJlIDxiYXNlPiBpcyBvbmUgb2Y6Ci0gKiAgICAgIGFjY2VzcyAgCi0gKiAgICAgIG5vdyAgICAgICAgICAgICBlcXVpdmFsZW50IHRvICdhY2Nlc3MnCi0gKiAgICAgIG1vZGlmaWNhdGlvbgotICoKLSAqIHdoZXJlIHRoZSAncGx1cycga2V5d29yZCBpcyBvcHRpb25hbAotICoKLSAqIHdoZXJlIDxudW0+IHNob3VsZCBiZSBhbiBpbnRlZ2VyIHZhbHVlIFthY2NlcHRhYmxlIHRvIGF0b2koKV0KLSAqCi0gKiB3aGVyZSA8dHlwZT4gaXMgb25lIG9mOgotICogICAgICB5ZWFycwotICogICAgICBtb250aHMKLSAqICAgICAgd2Vla3MKLSAqICAgICAgZGF5cwotICogICAgICBob3VycwotICogICAgICBtaW51dGVzCi0gKiAgICAgIHNlY29uZHMKLSAqCi0gKiBGb3IgZXhhbXBsZSwgYW55IG9mIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlcyBjYW4gYmUgdXNlZCB0byBtYWtlCi0gKiBkb2N1bWVudHMgZXhwaXJlIDEgbW9udGggYWZ0ZXIgYmVpbmcgYWNjZXNzZWQsIGJ5IGRlZmF1bHQ6Ci0gKgotICogICAgICBFeHBpcmVzRGVmYXVsdCAiYWNjZXNzIHBsdXMgMSBtb250aCIKLSAqICAgICAgRXhwaXJlc0RlZmF1bHQgImFjY2VzcyBwbHVzIDQgd2Vla3MiCi0gKiAgICAgIEV4cGlyZXNEZWZhdWx0ICJhY2Nlc3MgcGx1cyAzMCBkYXlzIgotICoKLSAqIFRoZSBleHBpcnkgdGltZSBjYW4gYmUgZmluZS10dW5lZCBieSBhZGRpbmcgc2V2ZXJhbCAnPG51bT4gPHR5cGU+JwotICogY2xhdXNlczoKLSAqCi0gKiAgICAgIEV4cGlyZXNCeVR5cGUgdGV4dC9odG1sICJhY2Nlc3MgcGx1cyAxIG1vbnRoIDE1IGRheXMgMiBob3VycyIKLSAqICAgICAgRXhwaXJlc0J5VHlwZSBpbWFnZS9naWYgIm1vZGlmaWNhdGlvbiBwbHVzIDUgaG91cnMgMyBtaW51dGVzIgotICoKLSAqIC0tLQotICoKLSAqIENoYW5nZS1sb2c6Ci0gKiAyOS5KYW4uOTYgICAgSGFyZGVuZWQgdGhlIGFkZF8qIGZ1bmN0aW9ucy4gIFNlcnZlciB3aWxsIG5vdyBiYWlsIG91dAotICogICAgICAgICAgICAgIGlmIGJhZCBkaXJlY3RpdmVzIGFyZSBnaXZlbiBpbiB0aGUgY29uZiBmaWxlcy4KLSAqIDAyLkZlYi45NiAgICBSZXR1cm5zIERFQ0xJTkVEIGlmIG5vdCAnRXhwaXJlc0FjdGl2ZSBvbicsIGdpdmluZyBvdGhlcgotICogICAgICAgICAgICAgIGV4cGlyZXMtYXdhcmUgbW9kdWxlcyBhIGNoYW5jZSB0byBwbGF5IHdpdGggdGhlIHNhbWUKLSAqICAgICAgICAgICAgICBkaXJlY3RpdmVzLiBbTWljaGFlbCBSdXRtYW5dCi0gKiAwMy5GZWIuOTYgICAgQ2FsbCB0enNldCgpIGJlZm9yZSBsb2NhbHRpbWUoKS4gIFRyeWluZyB0byBnZXQgdGhlIG1vZHVsZQotICogICAgICAgICAgICAgIHRvIHdvcmsgcHJvcGVybHkgaW4gbm9uIEdNVCB0aW1lem9uZXMuCi0gKiAxMi5GZWIuOTYgICAgTW9kaWZpZWQgZGlyZWN0aXZlIHN5bnRheCB0byBhbGxvdyBtb3JlIHJlYWRhYmxlIGNvbW1hbmRzOgotICogICAgICAgICAgICAgICAgRXhwaXJlc0RlZmF1bHQgIm5vdyBwbHVzIDEwIGRheXMgMjAgc2Vjb25kcyIKLSAqICAgICAgICAgICAgICAgIEV4cGlyZXNEZWZhdWx0ICJhY2Nlc3MgcGx1cyAzMCBkYXlzIgotICogICAgICAgICAgICAgICAgRXhwaXJlc0RlZmF1bHQgIm1vZGlmaWNhdGlvbiBwbHVzIDEgeWVhciAxMCBtb250aHMgMzAgZGF5cyIKLSAqIDEzLkZlYi45NiAgICBGaXggY2FsbCB0byB0YWJsZV9nZXQoKSB3aXRoIE5VTEwgMm5kIHBhcmFtZXRlciBbUm9iIEhhcnRpbGxdCi0gKiAxOS5GZWIuOTYgICAgQ2FsbCBnbV90aW1lc3RyXzgyMigpIHRvIGdldCB0aW1lIGZvcm1hdHRlZCBjb3JyZWN0bHksIGNhbid0Ci0gKiAgICAgICAgICAgICAgcmVseSBvbiBwcmVzZW5jZSBvZiBIVFRQX1RJTUVfRk9STUFUIGluIEFwYWNoZSAxLjErLgotICogMjEuRmViLjk2ICAgIFRoaXMgdmVyc2lvbiAoMC4wLjkpIHJldmVyc2VzIGFzc3VtcHRpb25zIG1hZGUgaW4gMC4wLjgKLSAqICAgICAgICAgICAgICBhYm91dCBzdGFyL3N0YXIgaGFuZGxlcnMuICBSZXZlcnRpbmcgdG8gMC4wLjcgYmVoYXZpb3VyLgotICogMDguSnVuLjk2ICAgIGFsbG93cyBFeHBpcmVzRGVmYXVsdCB0byBiZSB1c2VkIHdpdGggcmVzcG9uc2VzIHRoYXQgdXNlIAotICogICAgICAgICAgICAgIHRoZSBEZWZhdWx0VHlwZSBieSBub3QgREVDTElOSU5HLCBidXQgaW5zdGVhZCBza2lwcGluZyAKLSAqICAgICAgICAgICAgICB0aGUgdGFibGVfZ2V0IGNoZWNrIGFuZCB0aGVuIGxvb2tpbmcgZm9yIGFuIEV4cGlyZXNEZWZhdWx0LgotICogICAgICAgICAgICAgIFtSb2IgSGFydGlsbF0KLSAqIDA0Lk5vdi45NiAgICAnY29uc3QnIGRlZmluaXRpb25zIGFkZGVkLgotICoKLSAqIFRPRE8KLSAqIGFkZCBzdXBwb3J0IGZvciBDYWNoZS1Db250cm9sOiBtYXgtYWdlPTIwIGZyb20gdGhlIEhUVFAvMS4xCi0gKiBwcm9wb3NhbCAoaW4gdGhpcyBjYXNlLCBhIHR0bCBvZiAyMCBzZWNvbmRzKSBbYXNrIHJveV0KLSAqIGFkZCBwZXItZmlsZSBleHBpcnkgYW5kIGV4cGxpY2l0IGV4cGlyeSB0aW1lcyAtIGR1cGxpY2F0ZXMgc29tZQotICogb2YgdGhlIG1vZF9jZXJuX21ldGEuYyBmdW5jdGlvbmFsaXR5LiAgZWc6Ci0gKiAgICAgICAgICAgICAgRXhwaXJlc0V4cGxpY2l0IGluZGV4Lmh0bWwgIm1vZGlmaWNhdGlvbiBwbHVzIDMwIGRheXMiCi0gKgotICogQlVHUwotICogSGksIHdlbGNvbWUgdG8gdGhlIGludGVybmV0LgotICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50IGFjdGl2ZTsKLSAgICBjaGFyICpleHBpcmVzZGVmYXVsdDsKLSAgICB0YWJsZSAqZXhwaXJlc2J5dHlwZTsKLX0gZXhwaXJlc19kaXJfY29uZmlnOwotCi0vKiBmcm9tIG1vZF9kaXIsIHdoeSBpcyB0aGlzIGFsaWFzIHVzZWQ/Ci0gKi8KLSNkZWZpbmUgRElSX0NNRF9QRVJNUyBPUl9JTkRFWEVTCi0KLSNkZWZpbmUgQUNUSVZFX09OICAgICAgIDEKLSNkZWZpbmUgQUNUSVZFX09GRiAgICAgIDAKLSNkZWZpbmUgQUNUSVZFX0RPTlRDQVJFIDIKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGV4cGlyZXNfbW9kdWxlOwotCi1zdGF0aWMgdm9pZCAqY3JlYXRlX2Rpcl9leHBpcmVzX2NvbmZpZyhwb29sICpwLCBjaGFyICpkdW1teSkKLXsKLSAgICBleHBpcmVzX2Rpcl9jb25maWcgKm5ldyA9Ci0gICAgKGV4cGlyZXNfZGlyX2NvbmZpZyAqKSBhcF9wY2FsbG9jKHAsIHNpemVvZihleHBpcmVzX2Rpcl9jb25maWcpKTsKLSAgICBuZXctPmFjdGl2ZSA9IEFDVElWRV9ET05UQ0FSRTsKLSAgICBuZXctPmV4cGlyZXNkZWZhdWx0ID0gIiI7Ci0gICAgbmV3LT5leHBpcmVzYnl0eXBlID0gYXBfbWFrZV90YWJsZShwLCA0KTsKLSAgICByZXR1cm4gKHZvaWQgKikgbmV3OwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2V4cGlyZXNhY3RpdmUoY21kX3Bhcm1zICpjbWQsIGV4cGlyZXNfZGlyX2NvbmZpZyAqIGRpcl9jb25maWcsIGludCBhcmcpCi17Ci0gICAgLyogaWYgd2UncmUgaGVyZSBhdCBhbGwgaXQncyBiZWNhdXNlIHNvbWVvbmUgZXhwbGljaXRseQotICAgICAqIHNldCB0aGUgYWN0aXZlIGZsYWcKLSAgICAgKi8KLSAgICBkaXJfY29uZmlnLT5hY3RpdmUgPSBBQ1RJVkVfT047Ci0gICAgaWYgKGFyZyA9PSAwKSB7Ci0gICAgICAgIGRpcl9jb25maWctPmFjdGl2ZSA9IEFDVElWRV9PRkY7Ci0gICAgfTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogY2hlY2tfY29kZSgpIHBhcnNlICdjb2RlJyBhbmQgcmV0dXJuIE5VTEwgb3IgYW4gZXJyb3IgcmVzcG9uc2UKLSAqIHN0cmluZy4gIElmIHdlIHJldHVybiBOVUxMIHRoZW4gcmVhbF9jb2RlIGNvbnRhaW5zIGNvZGUgY29udmVydGVkCi0gKiB0byB0aGUgY25ubm4gZm9ybWF0LgotICovCi1zdGF0aWMgY2hhciAqY2hlY2tfY29kZShwb29sICpwLCBjb25zdCBjaGFyICpjb2RlLCBjaGFyICoqcmVhbF9jb2RlKQotewotICAgIGNoYXIgKndvcmQ7Ci0gICAgY2hhciBiYXNlID0gJ1gnOwotICAgIGludCBtb2RpZmllciA9IDA7Ci0gICAgaW50IG51bSA9IDA7Ci0gICAgaW50IGZhY3RvciA9IDA7Ci0KLSAgICAvKiAwLjAuNCBjb21wYXRpYmlsaXR5PwotICAgICAqLwotICAgIGlmICgoY29kZVswXSA9PSAnQScpIHx8IChjb2RlWzBdID09ICdNJykpIHsKLSAgICAgICAgKnJlYWxfY29kZSA9IChjaGFyICopY29kZTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfTsKLQotICAgIC8qIDxiYXNlPiBbcGx1c10gezxudW0+IDx0eXBlPn0qCi0gICAgICovCi0KLSAgICAvKiA8YmFzZT4KLSAgICAgKi8KLSAgICB3b3JkID0gYXBfZ2V0d29yZF9jb25mKHAsICZjb2RlKTsKLSAgICBpZiAoIXN0cm5jYXNlY21wKHdvcmQsICJub3ciLCAxKSB8fAotICAgICAgICAhc3RybmNhc2VjbXAod29yZCwgImFjY2VzcyIsIDEpKSB7Ci0gICAgICAgIGJhc2UgPSAnQSc7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCh3b3JkLCAibW9kaWZpY2F0aW9uIiwgMSkpIHsKLSAgICAgICAgYmFzZSA9ICdNJzsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJldHVybiBhcF9wc3RyY2F0KHAsICJiYWQgZXhwaXJlcyBjb2RlLCB1bnJlY29nbmlzZWQgPGJhc2U+ICciLAotICAgICAgICAgICAgICAgICAgICAgICB3b3JkLCAiJyIsIE5VTEwpOwotICAgIH07Ci0KLSAgICAvKiBbcGx1c10KLSAgICAgKi8KLSAgICB3b3JkID0gYXBfZ2V0d29yZF9jb25mKHAsICZjb2RlKTsKLSAgICBpZiAoIXN0cm5jYXNlY21wKHdvcmQsICJwbHVzIiwgMSkpIHsKLSAgICAgICAgd29yZCA9IGFwX2dldHdvcmRfY29uZihwLCAmY29kZSk7Ci0gICAgfTsKLQotICAgIC8qIHs8bnVtPiA8dHlwZT59KgotICAgICAqLwotICAgIHdoaWxlICh3b3JkWzBdKSB7Ci0gICAgICAgIC8qIDxudW0+Ci0gICAgICAgICAqLwotICAgICAgICBpZiAoYXBfaXNkaWdpdCh3b3JkWzBdKSkgewotICAgICAgICAgICAgbnVtID0gYXRvaSh3b3JkKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBhcF9wc3RyY2F0KHAsICJiYWQgZXhwaXJlcyBjb2RlLCBudW1lcmljIHZhbHVlIGV4cGVjdGVkIDxudW0+ICciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZCwgIiciLCBOVUxMKTsKLSAgICAgICAgfTsKLQotICAgICAgICAvKiA8dHlwZT4KLSAgICAgICAgICovCi0gICAgICAgIHdvcmQgPSBhcF9nZXR3b3JkX2NvbmYocCwgJmNvZGUpOwotICAgICAgICBpZiAod29yZFswXSkgewotICAgICAgICAgICAgLyogZG8gbm90aGluZyAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGFwX3BzdHJjYXQocCwgImJhZCBleHBpcmVzIGNvZGUsIG1pc3NpbmcgPHR5cGU+IiwgTlVMTCk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgZmFjdG9yID0gMDsKLSAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCh3b3JkLCAieWVhcnMiLCAxKSkgewotICAgICAgICAgICAgZmFjdG9yID0gNjAgKiA2MCAqIDI0ICogMzY1OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCh3b3JkLCAibW9udGhzIiwgMikpIHsKLSAgICAgICAgICAgIGZhY3RvciA9IDYwICogNjAgKiAyNCAqIDMwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCh3b3JkLCAid2Vla3MiLCAxKSkgewotICAgICAgICAgICAgZmFjdG9yID0gNjAgKiA2MCAqIDI0ICogNzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghc3RybmNhc2VjbXAod29yZCwgImRheXMiLCAxKSkgewotICAgICAgICAgICAgZmFjdG9yID0gNjAgKiA2MCAqIDI0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCh3b3JkLCAiaG91cnMiLCAxKSkgewotICAgICAgICAgICAgZmFjdG9yID0gNjAgKiA2MDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghc3RybmNhc2VjbXAod29yZCwgIm1pbnV0ZXMiLCAyKSkgewotICAgICAgICAgICAgZmFjdG9yID0gNjA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXN0cm5jYXNlY21wKHdvcmQsICJzZWNvbmRzIiwgMSkpIHsKLSAgICAgICAgICAgIGZhY3RvciA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gYXBfcHN0cmNhdChwLCAiYmFkIGV4cGlyZXMgY29kZSwgdW5yZWNvZ25pc2VkIDx0eXBlPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiJyIsIHdvcmQsICInIiwgTlVMTCk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgbW9kaWZpZXIgPSBtb2RpZmllciArIGZhY3RvciAqIG51bTsKLQotICAgICAgICAvKiBuZXh0IDxudW0+Ci0gICAgICAgICAqLwotICAgICAgICB3b3JkID0gYXBfZ2V0d29yZF9jb25mKHAsICZjb2RlKTsKLSAgICB9OwotCi0gICAgKnJlYWxfY29kZSA9IGFwX3BzcHJpbnRmKHAsICIlYyVkIiwgYmFzZSwgbW9kaWZpZXIpOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfZXhwaXJlc2J5dHlwZShjbWRfcGFybXMgKmNtZCwgZXhwaXJlc19kaXJfY29uZmlnICogZGlyX2NvbmZpZywgY2hhciAqbWltZSwgY2hhciAqY29kZSkKLXsKLSAgICBjaGFyICpyZXNwb25zZSwgKnJlYWxfY29kZTsKLQotICAgIGlmICgocmVzcG9uc2UgPSBjaGVja19jb2RlKGNtZC0+cG9vbCwgY29kZSwgJnJlYWxfY29kZSkpID09IE5VTEwpIHsKLSAgICAgICAgYXBfdGFibGVfc2V0bihkaXJfY29uZmlnLT5leHBpcmVzYnl0eXBlLCBtaW1lLCByZWFsX2NvZGUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9OwotICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwKLSAgICAgICAgICAgICAgICAgIidFeHBpcmVzQnlUeXBlICIsIG1pbWUsICIgIiwgY29kZSwgIic6ICIsIHJlc3BvbnNlLCBOVUxMKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9leHBpcmVzZGVmYXVsdChjbWRfcGFybXMgKmNtZCwgZXhwaXJlc19kaXJfY29uZmlnICogZGlyX2NvbmZpZywgY2hhciAqY29kZSkKLXsKLSAgICBjaGFyICpyZXNwb25zZSwgKnJlYWxfY29kZTsKLQotICAgIGlmICgocmVzcG9uc2UgPSBjaGVja19jb2RlKGNtZC0+cG9vbCwgY29kZSwgJnJlYWxfY29kZSkpID09IE5VTEwpIHsKLSAgICAgICAgZGlyX2NvbmZpZy0+ZXhwaXJlc2RlZmF1bHQgPSByZWFsX2NvZGU7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH07Ci0gICAgcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLAotICAgICAgICAgICAgICAgICAgICInRXhwaXJlc0RlZmF1bHQgIiwgY29kZSwgIic6ICIsIHJlc3BvbnNlLCBOVUxMKTsKLX0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIGV4cGlyZXNfY21kc1tdID0KLXsKLSAgICB7IkV4cGlyZXNBY3RpdmUiLCBzZXRfZXhwaXJlc2FjdGl2ZSwgTlVMTCwgRElSX0NNRF9QRVJNUywgRkxBRywKLSAgICAgIkxpbWl0ZWQgdG8gJ29uJyBvciAnb2ZmJyJ9LAotICAgIHsiRXhwaXJlc0J5dHlwZSIsIHNldF9leHBpcmVzYnl0eXBlLCBOVUxMLCBESVJfQ01EX1BFUk1TLCBUQUtFMiwKLSAgICAgImEgTUlNRSB0eXBlIGZvbGxvd2VkIGJ5IGFuIGV4cGlyeSBkYXRlIGNvZGUifSwKLSAgICB7IkV4cGlyZXNEZWZhdWx0Iiwgc2V0X2V4cGlyZXNkZWZhdWx0LCBOVUxMLCBESVJfQ01EX1BFUk1TLCBUQUtFMSwKLSAgICAgImFuIGV4cGlyeSBkYXRlIGNvZGUifSwKLSAgICB7TlVMTH0KLX07Ci0KLXN0YXRpYyB2b2lkICptZXJnZV9leHBpcmVzX2Rpcl9jb25maWdzKHBvb2wgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICphZGR2KQotewotICAgIGV4cGlyZXNfZGlyX2NvbmZpZyAqbmV3ID0gKGV4cGlyZXNfZGlyX2NvbmZpZyAqKSBhcF9wY2FsbG9jKHAsIHNpemVvZihleHBpcmVzX2Rpcl9jb25maWcpKTsKLSAgICBleHBpcmVzX2Rpcl9jb25maWcgKmJhc2UgPSAoZXhwaXJlc19kaXJfY29uZmlnICopIGJhc2V2OwotICAgIGV4cGlyZXNfZGlyX2NvbmZpZyAqYWRkID0gKGV4cGlyZXNfZGlyX2NvbmZpZyAqKSBhZGR2OwotCi0gICAgaWYgKGFkZC0+YWN0aXZlID09IEFDVElWRV9ET05UQ0FSRSkgewotICAgICAgICBuZXctPmFjdGl2ZSA9IGJhc2UtPmFjdGl2ZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIG5ldy0+YWN0aXZlID0gYWRkLT5hY3RpdmU7Ci0gICAgfTsKLQotICAgIGlmIChhZGQtPmV4cGlyZXNkZWZhdWx0ICE9ICdcMCcpIHsKLSAgICAgICAgbmV3LT5leHBpcmVzZGVmYXVsdCA9IGFkZC0+ZXhwaXJlc2RlZmF1bHQ7Ci0gICAgfTsKLQotICAgIG5ldy0+ZXhwaXJlc2J5dHlwZSA9IGFwX292ZXJsYXlfdGFibGVzKHAsIGFkZC0+ZXhwaXJlc2J5dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5leHBpcmVzYnl0eXBlKTsKLSAgICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgaW50IGFkZF9leHBpcmVzKHJlcXVlc3RfcmVjICpyKQotewotICAgIGV4cGlyZXNfZGlyX2NvbmZpZyAqY29uZjsKLSAgICBjaGFyICpjb2RlOwotICAgIHRpbWVfdCBiYXNlOwotICAgIHRpbWVfdCBhZGRpdGlvbmFsOwotICAgIHRpbWVfdCBleHBpcmVzOwotICAgIGNoYXIgYWdlWzIwXTsKLQotICAgIGlmIChhcF9pc19IVFRQX0VSUk9SKHItPnN0YXR1cykpICAgICAgIC8qIERvbid0IGFkZCBFeHBpcmVzIGhlYWRlcnMgdG8gZXJyb3JzICovCi0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLQotICAgIGlmIChyLT5tYWluICE9IE5VTEwpICAgICAgICAvKiBTYXkgbm8gdG8gc3VicmVxdWVzdHMgKi8KLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotCi0gICAgY29uZiA9IChleHBpcmVzX2Rpcl9jb25maWcgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsICZleHBpcmVzX21vZHVsZSk7Ci0gICAgaWYgKGNvbmYgPT0gTlVMTCkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAiaW50ZXJuYWwgZXJyb3I6ICVzIiwgci0+ZmlsZW5hbWUpOwotICAgICAgICByZXR1cm4gU0VSVkVSX0VSUk9SOwotICAgIH07Ci0KLSAgICBpZiAoY29uZi0+YWN0aXZlICE9IEFDVElWRV9PTikKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotCi0gICAgLyogd2UgcGVyaGFwcyBjb3VsZCB1c2UgdGhlIGRlZmF1bHRfdHlwZShyKSBpbiBpdHMgcGxhY2UgYnV0IHRoYXQKLSAgICAgKiBtYXkgYmUgMm5kIGd1ZXNpbmcgdGhlIGRlc2lyZWQgY29uZmlndXJhdGlvbi4uLiAgY2FsbGluZyB0YWJsZV9nZXQKLSAgICAgKiB3aXRoIGEgTlVMTCBrZXkgd2lsbCBTRUdWIHVzCi0gICAgICoKLSAgICAgKiBJIHN0aWxsIGRvbid0IGtub3cgKndoeSogci0+Y29udGVudF90eXBlIHdvdWxkIGV2ZXIgYmUgTlVMTCwgdGhpcwotICAgICAqIGlzIHBvc3NpYmx5IGEgcmVzdWx0IG9mIGZpeHVwcyBiZWluZyBjYWxsZWQgaW4gbWFueSBkaWZmZXJlbnQKLSAgICAgKiBwbGFjZXMuICBGaXh1cHMgaXMgcHJvYmFibHkgdGhlIHdyb25nIHBsYWNlIHRvIGJlIGRvaW5nIGFsbCB0aGlzCi0gICAgICogd29yay4uLiAgQmFoLgotICAgICAqCi0gICAgICogQ2hhbmdlZCBhcyBvZiAwOC5KdW4uOTYgZG9uJ3QgREVDTElORSwgbG9vayBmb3IgYW4gRXhwaXJlc0RlZmF1bHQuCi0gICAgICovCi0gICAgaWYgKHItPmNvbnRlbnRfdHlwZSA9PSBOVUxMKQotICAgICAgICBjb2RlID0gTlVMTDsKLSAgICBlbHNlCi0gICAgICAgIGNvZGUgPSAoY2hhciAqKSBhcF90YWJsZV9nZXQoY29uZi0+ZXhwaXJlc2J5dHlwZSwgci0+Y29udGVudF90eXBlKTsKLQotICAgIGlmIChjb2RlID09IE5VTEwpIHsKLSAgICAgICAgLyogbm8gZXhwaXJlcyBkZWZpbmVkIGZvciB0aGF0IHR5cGUsIGlzIHRoZXJlIGEgZGVmYXVsdD8gKi8KLSAgICAgICAgY29kZSA9IGNvbmYtPmV4cGlyZXNkZWZhdWx0OwotCi0gICAgICAgIGlmIChjb2RlWzBdID09ICdcMCcpCi0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgfTsKLQotICAgIC8qIHdlIGhhdmUgb3VyIGNvZGUgKi8KLQotICAgIHN3aXRjaCAoY29kZVswXSkgewotICAgIGNhc2UgJ00nOgotCWlmIChyLT5maW5mby5zdF9tb2RlID09IDApIHsgCi0JICAgIC8qIGZpbGUgZG9lc24ndCBleGlzdCBvbiBkaXNrLCBzbyB3ZSBjYW4ndCBkbyBhbnl0aGluZyBiYXNlZCBvbgotCSAgICAgKiBtb2RpZmljYXRpb24gdGltZS4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgX25vdF8gbG9nIGFuIGVycm9yLgotCSAgICAgKi8KLQkgICAgcmV0dXJuIERFQ0xJTkVEOwotCX0KLSAgICAgICAgYmFzZSA9IHItPmZpbmZvLnN0X210aW1lOwotICAgICAgICBhZGRpdGlvbmFsID0gYXRvaSgmY29kZVsxXSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0EnOgotICAgICAgICAvKiB0aGVyZSdzIGJlZW4gc29tZSBkaXNjdXNzaW9uIGFuZCBpdCdzIHBvc3NpYmxlIHRoYXQgCi0gICAgICAgICAqICdhY2Nlc3MgdGltZScgd2lsbCBiZSBzdG9yZWQgaW4gcmVxdWVzdCBzdHJ1Y3R1cmUKLSAgICAgICAgICovCi0gICAgICAgIGJhc2UgPSByLT5yZXF1ZXN0X3RpbWU7Ci0gICAgICAgIGFkZGl0aW9uYWwgPSBhdG9pKCZjb2RlWzFdKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgLyogZXhwZWN0aW5nIHRoZSBhZGRfKiByb3V0aW5lcyB0byBiZSBjYXNlLWhhcmRlbmVkIHRoaXMgCi0gICAgICAgICAqIGlzIGp1c3QgYSByZW1pbmRlciB0aGF0IG1vZHVsZSBpcyBiZXRhCi0gICAgICAgICAqLwotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAiaW50ZXJuYWwgZXJyb3I6IGJhZCBleHBpcmVzIGNvZGU6ICVzIiwgci0+ZmlsZW5hbWUpOwotICAgICAgICByZXR1cm4gU0VSVkVSX0VSUk9SOwotICAgIH07Ci0KLSAgICBleHBpcmVzID0gYmFzZSArIGFkZGl0aW9uYWw7Ci0gICAgYXBfc25wcmludGYoYWdlLCBzaXplb2YoYWdlKSwgIm1heC1hZ2U9JWQiLCAoaW50KSBleHBpcmVzIC0gKGludCkgci0+cmVxdWVzdF90aW1lKTsKLSAgICBhcF90YWJsZV9zZXRuKHItPmhlYWRlcnNfb3V0LCAiQ2FjaGUtQ29udHJvbCIsIGFwX3BzdHJkdXAoci0+cG9vbCwgYWdlKSk7Ci0gICAgdHpzZXQoKTsgICAgICAgICAgICAgICAgICAgIC8qIHJlZHVuZGFudD8gY2FsbGVkIGltcGxpY2l0bHkgYnkgbG9jYWx0aW1lLCBhdCBsZWFzdCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdW5kZXIgRnJlZUJTRAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBhcF90YWJsZV9zZXRuKHItPmhlYWRlcnNfb3V0LCAiRXhwaXJlcyIsIGFwX2dtX3RpbWVzdHJfODIyKHItPnBvb2wsIGV4cGlyZXMpKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBleHBpcmVzX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkRfTU9EVUxFX1NUVUZGLAotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplciAqLwotICAgIGNyZWF0ZV9kaXJfZXhwaXJlc19jb25maWcsICAvKiBkaXIgY29uZmlnIGNyZWF0ZXIgKi8KLSAgICBtZXJnZV9leHBpcmVzX2Rpcl9jb25maWdzLCAgLyogZGlyIG1lcmdlciAtLS0gZGVmYXVsdCBpcyB0byBvdmVycmlkZSAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXJ2ZXIgY29uZmlnICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIG1lcmdlIHNlcnZlciBjb25maWdzICovCi0gICAgZXhwaXJlc19jbWRzLCAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgdGFibGUgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaGFuZGxlcnMgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsZW5hbWUgdHJhbnNsYXRpb24gKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2tfdXNlcl9pZCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBhdXRoICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGFjY2VzcyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiB0eXBlX2NoZWNrZXIgKi8KLSAgICBhZGRfZXhwaXJlcywgICAgICAgICAgICAgICAgLyogZml4dXBzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvZ2dlciAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBoZWFkZXIgcGFyc2VyICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoaWxkX2luaXQgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hpbGRfZXhpdCAqLwotICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb3N0IHJlYWQtcmVxdWVzdCAqLwotfTsKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX2V4cGlyZXMuZHNwIGIvbW9kdWxlcy9tZXRhZGF0YS9tb2RfZXhwaXJlcy5kc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMmZlOTAuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfZXhwaXJlcy5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJBcGFjaGVNb2R1bGVFeHBpcmVzIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDIKLQotQ0ZHPUFwYWNoZU1vZHVsZUV4cGlyZXMgLSBXaW4zMiBSZWxlYXNlCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIkFwYWNoZU1vZHVsZUV4cGlyZXMubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJBcGFjaGVNb2R1bGVFeHBpcmVzLm1hayJcCi0gQ0ZHPSJBcGFjaGVNb2R1bGVFeHBpcmVzIC0gV2luMzIgUmVsZWFzZSIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJBcGFjaGVNb2R1bGVFeHBpcmVzIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uXAotICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAiQXBhY2hlTW9kdWxlRXhwaXJlcyAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb25cCi0gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1NVEw9bWlkbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAiQXBhY2hlTW9kdWxlRXhwaXJlcyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiLlxBcGFjaGVNb2R1bGVFeHBpcmVzUiIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuXEFwYWNoZU1vZHVsZUV4cGlyZXNSIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvTzIgL0kgIi4uXC4uXGluY2x1ZGUiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiU0hBUkVEX01PRFVMRSIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgLi5cLi5cQ29yZVJcQXBhY2hlQ29yZS5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hY2hpbmU6STM4NgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiQXBhY2hlTW9kdWxlRXhwaXJlcyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxEZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIi5cRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiLlxBcGFjaGVNb2R1bGVFeHBpcmVzRCIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuXEFwYWNoZU1vZHVsZUV4cGlyZXNEIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTURkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0kgIi4uXC4uXGluY2x1ZGUiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiU0hBUkVEX01PRFVMRSIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIC4uXC4uXENvcmVEXEFwYWNoZUNvcmUubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2Ci0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJBcGFjaGVNb2R1bGVFeHBpcmVzIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAiQXBhY2hlTW9kdWxlRXhwaXJlcyAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aHBqO2JhdDtmb3I7ZjkwIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cbW9kdWxlc1xzdGFuZGFyZFxtb2RfZXhwaXJlcy5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sO2ZpO2ZkIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxyZWFkZGlyLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO2NudDtydGY7Z2lmO2pwZztqcGVnO2pwZSIKLSMgRW5kIEdyb3VwCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX2V4cGlyZXMuZXhwIGIvbW9kdWxlcy9tZXRhZGF0YS9tb2RfZXhwaXJlcy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2M2E5NjguLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfZXhwaXJlcy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1leHBpcmVzX21vZHVsZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfaGVhZGVycy5jIGIvbW9kdWxlcy9tZXRhZGF0YS9tb2RfaGVhZGVycy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2Q1MDUwLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX2hlYWRlcnMuYworKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBtb2RfaGVhZGVycy5jOiBBZGQvYXBwZW5kL3JlbW92ZSBIVFRQIHJlc3BvbnNlIGhlYWRlcnMKLSAqICAgICBXcml0dGVuIGJ5IFBhdWwgU3V0dG9uLCBwYXVsQHVrd2ViLmNvbSwgMSBPY3QgMTk5NgotICoKLSAqIE5ldyBkaXJlY3RpdmUsIEhlYWRlciwgY2FuIGJlIHVzZWQgdG8gYWRkL3JlcGxhY2UvcmVtb3ZlIEhUVFAgaGVhZGVycy4KLSAqIFZhbGlkIGluIGJvdGggcGVyLXNlcnZlciBhbmQgcGVyLWRpciBjb25maWd1cmF0aW9ucy4KLSAqCi0gKiBTeW50YXggaXM6Ci0gKgotICogICBIZWFkZXIgYWN0aW9uIGhlYWRlciB2YWx1ZQotICoKLSAqIFdoZXJlIGFjdGlvbiBpcyBvbmUgb2Y6Ci0gKiAgICAgc2V0ICAgIC0gc2V0IHRoaXMgaGVhZGVyLCByZXBsYWNpbmcgYW55IG9sZCB2YWx1ZQotICogICAgIGFkZCAgICAtIGFkZCB0aGlzIGhlYWRlciwgcG9zc2libGUgcmVzdWx0aW5nIGluIHR3byBvciBtb3JlCi0gKiAgICAgICAgICAgICAgaGVhZGVycyB3aXRoIHRoZSBzYW1lIG5hbWUKLSAqICAgICBhcHBlbmQgLSBhcHBlbmQgdGhpcyB0ZXh0IG9udG8gYW55IGV4aXN0aW5nIGhlYWRlciBvZiB0aGlzIHNhbWUKLSAqICAgICB1bnNldCAgLSByZW1vdmUgdGhpcyBoZWFkZXIKLSAqCi0gKiBXaGVyZSBhY3Rpb24gaXMgdW5zZXQsIHRoZSB0aGlyZCBhcmd1bWVudCAodmFsdWUpIHNob3VsZCBub3QgYmUgZ2l2ZW4uCi0gKiBUaGUgaGVhZGVyIG5hbWUgY2FuIGluY2x1ZGUgdGhlIGNvbG9uLCBvciBub3QuCi0gKgotICogVGhlIEhlYWRlciBkaXJlY3RpdmUgY2FuIG9ubHkgYmUgdXNlZCB3aGVyZSBhbGxvd2VkIGJ5IHRoZSBGaWxlSW5mbyAKLSAqIG92ZXJyaWRlLgotICoKLSAqIFdoZW4gdGhlIHJlcXVlc3QgaXMgcHJvY2Vzc2VkLCB0aGUgaGVhZGVyIGRpcmVjdGl2ZXMgYXJlIHByb2Nlc3NlZCBpbgotICogdGhpcyBvcmRlcjogZmlyc3RseSwgdGhlIG1haW4gc2VydmVyLCB0aGVuIHRoZSB2aXJ0dWFsIHNlcnZlciBoYW5kbGluZwotICogdGhpcyByZXF1ZXN0IChpZiBhbnkpLCB0aGVuIGFueSA8RGlyZWN0b3J5PiBzZWN0aW9ucyAod29ya2luZyBkb3dud2FyZHMgCi0gKiBmcm9tIHRoZSByb290IGRpciksIHRoZW4gYW4gPExvY2F0aW9uPiBzZWN0aW9ucyAod29ya2luZyBkb3duIGZyb20gCi0gKiBzaG9ydGVzdCBVUkwgY29tcG9uZW50KSwgdGhlIGFueSA8RmlsZT4gc2VjdGlvbnMuIFRoaXMgb3JkZXIgaXMKLSAqIGltcG9ydGFudCBpZiBhbnkgJ3NldCcgb3IgJ3Vuc2V0JyBhY3Rpb25zIGFyZSB1c2VkLiBGb3IgZXhhbXBsZSwKLSAqIHRoZSBmb2xsb3dpbmcgdHdvIGRpcmVjdGl2ZXMgaGF2ZSBkaWZmZXJlbnQgZWZmZWN0IGlmIGFwcGxpZWQgaW4KLSAqIHRoZSByZXZlcnNlIG9yZGVyOgotICoKLSAqICAgSGVhZGVyIGFwcGVuZCBBdXRob3IgIkpvaG4gUC4gRG9lIgotICogICBIZWFkZXIgdW5zZXQgQXV0aG9yCi0gKgotICogRXhhbXBsZXM6Ci0gKgotICogIFRvIHNldCB0aGUgIkF1dGhvciIgaGVhZGVyLCB1c2UKLSAqICAgICBIZWFkZXIgYWRkIEF1dGhvciAiSm9obiBQLiBEb2UiCi0gKgotICogIFRvIHJlbW92ZSBhIGhlYWRlcjoKLSAqICAgICBIZWFkZXIgdW5zZXQgQXV0aG9yCi0gKgotICovCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgaGRyX2FkZCA9ICdhJywgICAgICAgICAgICAgIC8qIGFkZCBoZWFkZXIgKGNvdWxkIG1lYW4gbXVsdGlwbGUgaGRycykgKi8KLSAgICBoZHJfc2V0ID0gJ3MnLCAgICAgICAgICAgICAgLyogc2V0IChyZXBsYWNlIG9sZCB2YWx1ZSkgKi8KLSAgICBoZHJfYXBwZW5kID0gJ20nLCAgICAgICAgICAgLyogYXBwZW5kIChtZXJnZSBpbnRvIGFueSBvbGQgdmFsdWUpICovCi0gICAgaGRyX3Vuc2V0ID0gJ3UnICAgICAgICAgICAgIC8qIHVuc2V0IGhlYWRlciAqLwotfSBoZHJfYWN0aW9uczsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGhkcl9hY3Rpb25zIGFjdGlvbjsKLSAgICBjaGFyICpoZWFkZXI7Ci0gICAgY2hhciAqdmFsdWU7Ci19IGhlYWRlcl9lbnRyeTsKLQotLyoKLSAqIGhlYWRlcnNfY29uZiBpcyBvdXIgcGVyLW1vZHVsZSBjb25maWd1cmF0aW9uLiBUaGlzIGlzIHVzZWQgYXMgYm90aAotICogYSBwZXItZGlyIGFuZCBwZXItc2VydmVyIGNvbmZpZwotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgYXJyYXlfaGVhZGVyICpoZWFkZXJzOwotfSBoZWFkZXJzX2NvbmY7Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBoZWFkZXJzX21vZHVsZTsKLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9oZWFkZXJzX2NvbmZpZyhwb29sICpwLCBzZXJ2ZXJfcmVjICpzKQotewotICAgIGhlYWRlcnNfY29uZiAqYSA9Ci0gICAgKGhlYWRlcnNfY29uZiAqKSBhcF9wY2FsbG9jKHAsIHNpemVvZihoZWFkZXJzX2NvbmYpKTsKLQotICAgIGEtPmhlYWRlcnMgPSBhcF9tYWtlX2FycmF5KHAsIDIsIHNpemVvZihoZWFkZXJfZW50cnkpKTsKLSAgICByZXR1cm4gYTsKLX0KLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9oZWFkZXJzX2Rpcl9jb25maWcocG9vbCAqcCwgY2hhciAqZCkKLXsKLSAgICByZXR1cm4gKGhlYWRlcnNfY29uZiAqKSBjcmVhdGVfaGVhZGVyc19jb25maWcocCwgTlVMTCk7Ci19Ci0KLXN0YXRpYyB2b2lkICptZXJnZV9oZWFkZXJzX2NvbmZpZyhwb29sICpwLCB2b2lkICpiYXNldiwgdm9pZCAqb3ZlcnJpZGVzdikKLXsKLSAgICBoZWFkZXJzX2NvbmYgKmEgPQotICAgIChoZWFkZXJzX2NvbmYgKikgYXBfcGNhbGxvYyhwLCBzaXplb2YoaGVhZGVyc19jb25mKSk7Ci0gICAgaGVhZGVyc19jb25mICpiYXNlID0gKGhlYWRlcnNfY29uZiAqKSBiYXNldiwgKm92ZXJyaWRlcyA9IChoZWFkZXJzX2NvbmYgKikgb3ZlcnJpZGVzdjsKLQotICAgIGEtPmhlYWRlcnMgPSBhcF9hcHBlbmRfYXJyYXlzKHAsIGJhc2UtPmhlYWRlcnMsIG92ZXJyaWRlcy0+aGVhZGVycyk7Ci0KLSAgICByZXR1cm4gYTsKLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqaGVhZGVyX2NtZChjbWRfcGFybXMgKmNtZCwgaGVhZGVyc19jb25mICogZGlyY29uZiwgY2hhciAqYWN0aW9uLCBjaGFyICpoZHIsIGNoYXIgKnZhbHVlKQotewotICAgIGhlYWRlcl9lbnRyeSAqbmV3OwotICAgIHNlcnZlcl9yZWMgKnMgPSBjbWQtPnNlcnZlcjsKLSAgICBoZWFkZXJzX2NvbmYgKnNlcnZlcmNvbmYgPQotICAgIChoZWFkZXJzX2NvbmYgKikgYXBfZ2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywgJmhlYWRlcnNfbW9kdWxlKTsKLSAgICBjaGFyICpjb2xvbjsKLQotICAgIGlmIChjbWQtPnBhdGgpIHsKLSAgICAgICAgbmV3ID0gKGhlYWRlcl9lbnRyeSAqKSBhcF9wdXNoX2FycmF5KGRpcmNvbmYtPmhlYWRlcnMpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgbmV3ID0gKGhlYWRlcl9lbnRyeSAqKSBhcF9wdXNoX2FycmF5KHNlcnZlcmNvbmYtPmhlYWRlcnMpOwotICAgIH0KLQotICAgIGlmICghc3RyY2FzZWNtcChhY3Rpb24sICJzZXQiKSkKLSAgICAgICAgbmV3LT5hY3Rpb24gPSBoZHJfc2V0OwotICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGFjdGlvbiwgImFkZCIpKQotICAgICAgICBuZXctPmFjdGlvbiA9IGhkcl9hZGQ7Ci0gICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAoYWN0aW9uLCAiYXBwZW5kIikpCi0gICAgICAgIG5ldy0+YWN0aW9uID0gaGRyX2FwcGVuZDsKLSAgICBlbHNlIGlmICghc3RyY2FzZWNtcChhY3Rpb24sICJ1bnNldCIpKQotICAgICAgICBuZXctPmFjdGlvbiA9IGhkcl91bnNldDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhZGQsIHNldCwgYXBwZW5kIG9yIHVuc2V0LiI7Ci0KLSAgICBpZiAobmV3LT5hY3Rpb24gPT0gaGRyX3Vuc2V0KSB7Ci0gICAgICAgIGlmICh2YWx1ZSkKLSAgICAgICAgICAgIHJldHVybiAiSGVhZGVyIHVuc2V0IHRha2VzIHR3byBhcmd1bWVudHMiOwotICAgIH0KLSAgICBlbHNlIGlmICghdmFsdWUpCi0gICAgICAgIHJldHVybiAiSGVhZGVyIHJlcXVpcmVzIHRocmVlIGFyZ3VtZW50cyI7Ci0KLSAgICBpZiAoKGNvbG9uID0gc3RyY2hyKGhkciwgJzonKSkpCi0gICAgICAgICpjb2xvbiA9ICdcMCc7Ci0KLSAgICBuZXctPmhlYWRlciA9IGhkcjsKLSAgICBuZXctPnZhbHVlID0gdmFsdWU7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIGhlYWRlcnNfY21kc1tdID0KLXsKLSAgICB7IkhlYWRlciIsIGhlYWRlcl9jbWQsIE5VTEwsIE9SX0ZJTEVJTkZPLCBUQUtFMjMsCi0gICAgICJhbiBhY3Rpb24sIGhlYWRlciBhbmQgdmFsdWUifSwKLSAgICB7TlVMTH0KLX07Ci0KLXN0YXRpYyB2b2lkIGRvX2hlYWRlcnNfZml4dXAocmVxdWVzdF9yZWMgKnIsIGFycmF5X2hlYWRlciAqaGVhZGVycykKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBoZWFkZXJzLT5uZWx0czsgKytpKSB7Ci0gICAgICAgIGhlYWRlcl9lbnRyeSAqaGRyID0gJigoaGVhZGVyX2VudHJ5ICopIChoZWFkZXJzLT5lbHRzKSlbaV07Ci0gICAgICAgIHN3aXRjaCAoaGRyLT5hY3Rpb24pIHsKLSAgICAgICAgY2FzZSBoZHJfYWRkOgotICAgICAgICAgICAgYXBfdGFibGVfYWRkbihyLT5oZWFkZXJzX291dCwgaGRyLT5oZWFkZXIsIGhkci0+dmFsdWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgaGRyX2FwcGVuZDoKLSAgICAgICAgICAgIGFwX3RhYmxlX21lcmdlbihyLT5oZWFkZXJzX291dCwgaGRyLT5oZWFkZXIsIGhkci0+dmFsdWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgaGRyX3NldDoKLSAgICAgICAgICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsIGhkci0+aGVhZGVyLCBoZHItPnZhbHVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGhkcl91bnNldDoKLSAgICAgICAgICAgIGFwX3RhYmxlX3Vuc2V0KHItPmhlYWRlcnNfb3V0LCBoZHItPmhlYWRlcik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi1zdGF0aWMgaW50IGZpeHVwX2hlYWRlcnMocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgdm9pZCAqc2NvbmYgPSByLT5zZXJ2ZXItPm1vZHVsZV9jb25maWc7Ci0gICAgaGVhZGVyc19jb25mICpzZXJ2ZXJjb25mID0KLSAgICAoaGVhZGVyc19jb25mICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHNjb25mLCAmaGVhZGVyc19tb2R1bGUpOwotICAgIHZvaWQgKmRjb25mID0gci0+cGVyX2Rpcl9jb25maWc7Ci0gICAgaGVhZGVyc19jb25mICpkaXJjb25mID0KLSAgICAoaGVhZGVyc19jb25mICopIGFwX2dldF9tb2R1bGVfY29uZmlnKGRjb25mLCAmaGVhZGVyc19tb2R1bGUpOwotCi0gICAgZG9faGVhZGVyc19maXh1cChyLCBzZXJ2ZXJjb25mLT5oZWFkZXJzKTsKLSAgICBkb19oZWFkZXJzX2ZpeHVwKHIsIGRpcmNvbmYtPmhlYWRlcnMpOwotCi0gICAgcmV0dXJuIERFQ0xJTkVEOwotfQotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgaGVhZGVyc19tb2R1bGUgPQotewotICAgIFNUQU5EQVJEX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZXIgKi8KLSAgICBjcmVhdGVfaGVhZGVyc19kaXJfY29uZmlnLCAgLyogZGlyIGNvbmZpZyBjcmVhdGVyICovCi0gICAgbWVyZ2VfaGVhZGVyc19jb25maWcsICAgICAgIC8qIGRpciBtZXJnZXIgLS0tIGRlZmF1bHQgaXMgdG8gb3ZlcnJpZGUgKi8KLSAgICBjcmVhdGVfaGVhZGVyc19jb25maWcsICAgICAgLyogc2VydmVyIGNvbmZpZyAqLwotICAgIG1lcmdlX2hlYWRlcnNfY29uZmlnLCAgICAgICAvKiBtZXJnZSBzZXJ2ZXIgY29uZmlncyAqLwotICAgIGhlYWRlcnNfY21kcywgICAgICAgICAgICAgICAvKiBjb21tYW5kIHRhYmxlICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGhhbmRsZXJzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGVuYW1lIHRyYW5zbGF0aW9uICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrX3VzZXJfaWQgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgYXV0aCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBhY2Nlc3MgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHlwZV9jaGVja2VyICovCi0gICAgZml4dXBfaGVhZGVycywgICAgICAgICAgICAgIC8qIGZpeHVwcyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2dnZXIgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaGVhZGVyIHBhcnNlciAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGlsZF9pbml0ICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoaWxkX2V4aXQgKi8KLSAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdCByZWFkLXJlcXVlc3QgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL21ldGFkYXRhL21vZF9oZWFkZXJzLmRzcCBiL21vZHVsZXMvbWV0YWRhdGEvbW9kX2hlYWRlcnMuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGM3NjAyLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX2hlYWRlcnMuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iQXBhY2hlTW9kdWxlSGVhZGVycyIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNS4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyCi0KLUNGRz1BcGFjaGVNb2R1bGVIZWFkZXJzIC0gV2luMzIgUmVsZWFzZQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJBcGFjaGVNb2R1bGVIZWFkZXJzLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiQXBhY2hlTW9kdWxlSGVhZGVycy5tYWsiXAotIENGRz0iQXBhY2hlTW9kdWxlSGVhZGVycyAtIFdpbjMyIFJlbGVhc2UiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAiQXBhY2hlTW9kdWxlSGVhZGVycyAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvblwKLSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgIkFwYWNoZU1vZHVsZUhlYWRlcnMgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uXAotICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotTVRMPW1pZGwuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIkFwYWNoZU1vZHVsZUhlYWRlcnMgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiLlxSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIi5cQXBhY2hlTW9kdWxlSGVhZGVyc1IiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVNb2R1bGVIZWFkZXJzUiIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvR1ggL08yIC9JICIuLlwuLlxpbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIlNIQVJFRF9NT0RVTEUiIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIC4uXC4uXENvcmVSXEFwYWNoZUNvcmUubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYWNoaW5lOkkzODYKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFwYWNoZU1vZHVsZUhlYWRlcnMgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIi5cRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXERlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIi5cQXBhY2hlTW9kdWxlSGVhZGVyc0QiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVNb2R1bGVIZWFkZXJzRCIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9JICIuLlwuLlxpbmNsdWRlIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIlNIQVJFRF9NT0RVTEUiIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiAuLlwuLlxDb3JlRFxBcGFjaGVDb3JlLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NgotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAiQXBhY2hlTW9kdWxlSGVhZGVycyAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgIkFwYWNoZU1vZHVsZUhlYWRlcnMgLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2hwajtiYXQ7Zm9yO2Y5MCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXG1vZHVsZXNcc3RhbmRhcmRcbW9kX2hlYWRlcnMuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubDtmaTtmZCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5ccmVhZGRpci5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIlJlc291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtjbnQ7cnRmO2dpZjtqcGc7anBlZztqcGUiCi0jIEVuZCBHcm91cAotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9tb2R1bGVzL21ldGFkYXRhL21vZF9oZWFkZXJzLmV4cCBiL21vZHVsZXMvbWV0YWRhdGEvbW9kX2hlYWRlcnMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjMwNjM4Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX2hlYWRlcnMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaGVhZGVyc19tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX21pbWVfbWFnaWMuYyBiL21vZHVsZXMvbWV0YWRhdGEvbW9kX21pbWVfbWFnaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0ZDZiYS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21ldGFkYXRhL21vZF9taW1lX21hZ2ljLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDc0ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogbW9kX21pbWVfbWFnaWM6IE1JTUUgdHlwZSBsb29rdXAgdmlhIGZpbGUgbWFnaWMgbnVtYmVycwotICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTcgQ2lzY28gU3lzdGVtcywgSW5jLgotICoKLSAqIFRoaXMgc29mdHdhcmUgd2FzIHN1Ym1pdHRlZCBieSBDaXNjbyBTeXN0ZW1zIHRvIHRoZSBBcGFjaGUgR3JvdXAgaW4gSnVseQotICogMTk5Ny4gIEZ1dHVyZSByZXZpc2lvbnMgYW5kIGRlcml2YXRpdmVzIG9mIHRoaXMgc291cmNlIGNvZGUgbXVzdAotICogYWNrbm93bGVkZ2UgQ2lzY28gU3lzdGVtcyBhcyB0aGUgb3JpZ2luYWwgY29udHJpYnV0b3Igb2YgdGhpcyBtb2R1bGUuCi0gKiBBbGwgb3RoZXIgbGljZW5zaW5nIGFuZCB1c2FnZSBjb25kaXRpb25zIGFyZSB0aG9zZSBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFNvbWUgb2YgdGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgZnJlZSB2ZXJzaW9uIG9mIHRoZSBmaWxlIGNvbW1hbmQKLSAqIG9yaWdpbmFsbHkgcG9zdGVkIHRvIGNvbXAuc291cmNlcy51bml4LiAgQ29weXJpZ2h0IGluZm8gZm9yIHRoYXQgcHJvZ3JhbQotICogaXMgaW5jbHVkZWQgYmVsb3cgYXMgcmVxdWlyZWQuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIC0gQ29weXJpZ2h0IChjKSBJYW4gRi4gRGFyd2luLCAxOTg3LiBXcml0dGVuIGJ5IElhbiBGLiBEYXJ3aW4uCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBub3Qgc3ViamVjdCB0byBhbnkgbGljZW5zZSBvZiB0aGUgQW1lcmljYW4gVGVsZXBob25lIGFuZAotICogVGVsZWdyYXBoIENvbXBhbnkgb3Igb2YgdGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBvbiBhbnkKLSAqIGNvbXB1dGVyIHN5c3RlbSwgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQgZnJlZWx5LCBzdWJqZWN0IHRvCi0gKiB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLSAqCi0gKiAxLiBUaGUgYXV0aG9yIGlzIG5vdCByZXNwb25zaWJsZSBmb3IgdGhlIGNvbnNlcXVlbmNlcyBvZiB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUsIG5vIG1hdHRlciBob3cgYXdmdWwsIGV2ZW4gaWYgdGhleSBhcmlzZSBmcm9tIGZsYXdzIGluIGl0LgotICoKLSAqIDIuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZCwgZWl0aGVyIGJ5Ci0gKiBleHBsaWNpdCBjbGFpbSBvciBieSBvbWlzc2lvbi4gIFNpbmNlIGZldyB1c2VycyBldmVyIHJlYWQgc291cmNlcywgY3JlZGl0cwotICogbXVzdCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24uCi0gKgotICogMy4gQWx0ZXJlZCB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICogbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiAgU2luY2UgZmV3IHVzZXJzIGV2ZXIgcmVhZAotICogc291cmNlcywgY3JlZGl0cyBtdXN0IGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KLSAqCi0gKiA0LiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZC4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBGb3IgY29tcGxpYW5jZSB3aXRoIE1yIERhcndpbidzIHRlcm1zOiB0aGlzIGhhcyBiZWVuIHZlcnkgc2lnbmlmaWNhbnRseQotICogbW9kaWZpZWQgZnJvbSB0aGUgZnJlZSAiZmlsZSIgY29tbWFuZC4KLSAqIC0gYWxsLWluLW9uZSBmaWxlIGZvciBjb21waWxhdGlvbiBjb252ZW5pZW5jZSB3aGVuIG1vdmluZyBmcm9tIG9uZQotICogICB2ZXJzaW9uIG9mIEFwYWNoZSB0byB0aGUgbmV4dC4KLSAqIC0gTWVtb3J5IGFsbG9jYXRpb24gaXMgZG9uZSB0aHJvdWdoIHRoZSBBcGFjaGUgQVBJJ3MgcG9vbCBzdHJ1Y3R1cmUuCi0gKiAtIEFsbCBmdW5jdGlvbnMgaGF2ZSBoYWQgbmVjZXNzYXJ5IEFwYWNoZSBBUEkgcmVxdWVzdCBvciBzZXJ2ZXIKLSAqICAgc3RydWN0dXJlcyBwYXNzZWQgdG8gdGhlbSB3aGVyZSBuZWNlc3NhcnkgdG8gY2FsbCBvdGhlciBBcGFjaGUgQVBJCi0gKiAgIHJvdXRpbmVzLiAgKGkuZS4gdXN1YWxseSBmb3IgbG9nZ2luZywgZmlsZXMsIG9yIG1lbW9yeSBhbGxvY2F0aW9uIGluCi0gKiAgIGl0c2VsZiBvciBhIGNhbGxlZCBmdW5jdGlvbi4pCi0gKiAtIHN0cnVjdCBtYWdpYyBoYXMgYmVlbiBjb252ZXJ0ZWQgZnJvbSBhbiBhcnJheSB0byBhIHNpbmdsZS1lbmRlZCBsaW5rZWQKLSAqICAgbGlzdCBiZWNhdXNlIGl0IG9ubHkgZ3Jvd3Mgb25lIHJlY29yZCBhdCBhIHRpbWUsIGl0J3Mgb25seSBhY2Nlc3NlZAotICogICBzZXF1ZW50aWFsbHksIGFuZCB0aGUgQXBhY2hlIEFQSSBoYXMgbm8gZXF1aXZhbGVudCBvZiByZWFsbG9jKCkuCi0gKiAtIEZ1bmN0aW9ucyBoYXZlIGJlZW4gY2hhbmdlZCB0byBnZXQgdGhlaXIgcGFyYW1ldGVycyBmcm9tIHRoZSBzZXJ2ZXIKLSAqICAgY29uZmlndXJhdGlvbiBpbnN0ZWFkIG9mIGdsb2JhbHMuICAoSXQgc2hvdWxkIGJlIHJlZW50cmFudCBub3cgYnV0IGhhcwotICogICBub3QgYmVlbiB0ZXN0ZWQgaW4gYSB0aHJlYWRlZCBlbnZpcm9ubWVudC4pCi0gKiAtIFBsYWNlcyB3aGVyZSBpdCB1c2VkIHRvIHByaW50IHJlc3VsdHMgdG8gc3Rkb3V0IG5vdyBzYXZlcyB0aGVtIGluIGEKLSAqICAgbGlzdCB3aGVyZSB0aGV5J3JlIHVzZWQgdG8gc2V0IHRoZSBNSU1FIHR5cGUgaW4gdGhlIEFwYWNoZSByZXF1ZXN0Ci0gKiAgIHJlY29yZC4KLSAqIC0gQ29tbWFuZC1saW5lIGZsYWdzIGhhdmUgYmVlbiByZW1vdmVkIHNpbmNlIHRoZXkgd2lsbCBuZXZlciBiZSB1c2VkIGhlcmUuCi0gKgotICogSWFuIEtsdWZ0IDxpa2x1ZnRAY2lzY28uY29tPgotICogRW5naW5lZXJpbmcgSW5mb3JtYXRpb24gRnJhbWV3b3JrCi0gKiBDZW50cmFsIEVuZ2luZWVyaW5nCi0gKiBDaXNjbyBTeXN0ZW1zLCBJbmMuCi0gKiBTYW4gSm9zZSwgQ0EsIFVTQQotICoKLSAqIEluaXRpYWwgaW5zdGFsbGF0aW9uICAgICAgICAgIEp1bHkvQXVndXN0IDE5OTYKLSAqIE1pc2MgYnVnIGZpeGVzICAgICAgICAgICAgICAgIE1heSAxOTk3Ci0gKiBTdWJtaXNzaW9uIHRvIEFwYWNoZSBHcm91cCAgICBKdWx5IDE5OTcKLSAqCi0gKi8KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLQotI2luY2x1ZGUgPHV0aW1lLmg+Ci0KLQotLyoKLSAqIGRhdGEgc3RydWN0dXJlcyBhbmQgcmVsYXRlZCBjb25zdGFudHMKLSAqLwotCi0jZGVmaW5lIE1PRE5BTUUgICAgICAgICJtb2RfbWltZV9tYWdpYyIKLSNkZWZpbmUgTUlNRV9NQUdJQ19ERUJVRyAgICAgICAgMAotCi0jZGVmaW5lIE1JTUVfQklOQVJZX1VOS05PV04gICAgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIKLSNkZWZpbmUgTUlNRV9URVhUX1VOS05PV04gICAgInRleHQvcGxhaW4iCi0KLSNkZWZpbmUgTUFYTUlNRVNUUklORyAgICAgICAgMjU2Ci0KLS8qIEhPV01BTlkgbXVzdCBiZSBhdCBsZWFzdCA0MDk2IHRvIG1ha2UgZ3ppcCAtZGNxIHdvcmsgKi8KLSNkZWZpbmUgSE9XTUFOWQk0MDk2Ci0vKiBTTUFMTF9IT1dNQU5ZIGxpbWl0cyBob3cgbXVjaCB3b3JrIHdlIGRvIHRvIGZpZ3VyZSBvdXQgdGV4dCBmaWxlcyAqLwotI2RlZmluZSBTTUFMTF9IT1dNQU5ZIDEwMjQKLSNkZWZpbmUgTUFYREVTQyAgICA1MAkJLyogbWF4IGxlbmcgb2YgdGV4dCBkZXNjcmlwdGlvbiAqLwotI2RlZmluZSBNQVhzdHJpbmcgNjQJCS8qIG1heCBsZW5nIG9mICJzdHJpbmciIHR5cGVzICovCi0KLXN0cnVjdCBtYWdpYyB7Ci0gICAgc3RydWN0IG1hZ2ljICpuZXh0OwkJLyogbGluayB0byBuZXh0IGVudHJ5ICovCi0gICAgaW50IGxpbmVubzsJCQkvKiBsaW5lIG51bWJlciBmcm9tIG1hZ2ljIGZpbGUgKi8KLQotICAgIHNob3J0IGZsYWc7Ci0jZGVmaW5lIElORElSICAgIDEJCS8qIGlmICc+KC4uLiknIGFwcGVhcnMsICAqLwotI2RlZmluZSAgICBVTlNJR05FRCAyCQkvKiBjb21wYXJpc29uIGlzIHVuc2lnbmVkICovCi0gICAgc2hvcnQgY29udF9sZXZlbDsJCS8qIGxldmVsIG9mICI+IiAqLwotICAgIHN0cnVjdCB7Ci0JY2hhciB0eXBlOwkJLyogYnl0ZSBzaG9ydCBsb25nICovCi0JbG9uZyBvZmZzZXQ7CQkvKiBvZmZzZXQgZnJvbSBpbmRpcmVjdGlvbiAqLwotICAgIH0gaW47Ci0gICAgbG9uZyBvZmZzZXQ7CQkvKiBvZmZzZXQgdG8gbWFnaWMgbnVtYmVyICovCi0gICAgdW5zaWduZWQgY2hhciByZWxuOwkJLyogcmVsYXRpb24gKDA9ZXEsICc+Jz1ndCwgZXRjKSAqLwotICAgIGNoYXIgdHlwZTsJCQkvKiBpbnQsIHNob3J0LCBsb25nIG9yIHN0cmluZy4gKi8KLSAgICBjaGFyIHZhbGxlbjsJCS8qIGxlbmd0aCBvZiBzdHJpbmcgdmFsdWUsIGlmIGFueSAqLwotI2RlZmluZSBCWVRFICAgIDEKLSNkZWZpbmUgU0hPUlQgICAgMgotI2RlZmluZSBMT05HICAgIDQKLSNkZWZpbmUgU1RSSU5HICAgIDUKLSNkZWZpbmUgREFURSAgICA2Ci0jZGVmaW5lIEJFU0hPUlQgICAgNwotI2RlZmluZSBCRUxPTkcgICAgOAotI2RlZmluZSBCRURBVEUgICAgOQotI2RlZmluZSBMRVNIT1JUICAgIDEwCi0jZGVmaW5lIExFTE9ORyAgICAxMQotI2RlZmluZSBMRURBVEUgICAgMTIKLSAgICB1bmlvbiBWQUxVRVRZUEUgewotCXVuc2lnbmVkIGNoYXIgYjsKLQl1bnNpZ25lZCBzaG9ydCBoOwotCXVuc2lnbmVkIGxvbmcgbDsKLQljaGFyIHNbTUFYc3RyaW5nXTsKLQl1bnNpZ25lZCBjaGFyIGhzWzJdOwkvKiAyIGJ5dGVzIG9mIGEgZml4ZWQtZW5kaWFuICJzaG9ydCIgKi8KLQl1bnNpZ25lZCBjaGFyIGhsWzRdOwkvKiAyIGJ5dGVzIG9mIGEgZml4ZWQtZW5kaWFuICJsb25nIiAqLwotICAgIH0gdmFsdWU7CQkJLyogZWl0aGVyIG51bWJlciBvciBzdHJpbmcgKi8KLSAgICB1bnNpZ25lZCBsb25nIG1hc2s7CQkvKiBtYXNrIGJlZm9yZSBjb21wYXJpc29uIHdpdGggdmFsdWUgKi8KLSAgICBjaGFyIG5vc3BmbGFnOwkJLyogc3VwcmVzcyBzcGFjZSBjaGFyYWN0ZXIgKi8KLQotICAgIC8qIE5PVEU6IHRoaXMgc3RyaW5nIGlzIHN1c3BlY3RlZCBvZiBvdmVycnVubmluZyAtIGZpbmQgaXQhICovCi0gICAgY2hhciBkZXNjW01BWERFU0NdOwkJLyogZGVzY3JpcHRpb24gKi8KLX07Ci0KLS8qCi0gKiBkYXRhIHN0cnVjdHVyZXMgZm9yIHRhciBmaWxlIHJlY29nbml0aW9uCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogSGVhZGVyIGZpbGUgZm9yIHB1YmxpYyBkb21haW4gdGFyICh0YXBlIGFyY2hpdmUpIHByb2dyYW0uCi0gKgotICogQCgjKXRhci5oIDEuMjAgODYvMTAvMjkgICAgUHVibGljIERvbWFpbi4gQ3JlYXRlZCAyNSBBdWd1c3QgMTk4NSBieSBKb2huCi0gKiBHaWxtb3JlLCBpaG5wNCFob3B0b2FkIWdudS4KLSAqCi0gKiBIZWFkZXIgYmxvY2sgb24gdGFwZS4KLSAqCi0gKiBJJ20gZ29pbmcgdG8gdXNlIHRyYWRpdGlvbmFsIERQIG5hbWluZyBjb252ZW50aW9ucyBoZXJlLiBBICJibG9jayIgaXMgYSBiaWcKLSAqIGNodW5rIG9mIHN0dWZmIHRoYXQgd2UgZG8gSS9PIG9uLiBBICJyZWNvcmQiIGlzIGEgcGllY2Ugb2YgaW5mbyB0aGF0IHdlCi0gKiBjYXJlIGFib3V0LiBUeXBpY2FsbHkgbWFueSAicmVjb3JkInMgZml0IGludG8gYSAiYmxvY2siLgotICovCi0jZGVmaW5lIFJFQ09SRFNJWkUgICAgNTEyCi0jZGVmaW5lIE5BTVNJWiAgICAxMDAKLSNkZWZpbmUgVFVOTUxFTiAgICAzMgotI2RlZmluZSBUR05NTEVOICAgIDMyCi0KLXVuaW9uIHJlY29yZCB7Ci0gICAgY2hhciBjaGFycHRyW1JFQ09SRFNJWkVdOwotICAgIHN0cnVjdCBoZWFkZXIgewotCWNoYXIgbmFtZVtOQU1TSVpdOwotCWNoYXIgbW9kZVs4XTsKLQljaGFyIHVpZFs4XTsKLQljaGFyIGdpZFs4XTsKLQljaGFyIHNpemVbMTJdOwotCWNoYXIgbXRpbWVbMTJdOwotCWNoYXIgY2hrc3VtWzhdOwotCWNoYXIgbGlua2ZsYWc7Ci0JY2hhciBsaW5rbmFtZVtOQU1TSVpdOwotCWNoYXIgbWFnaWNbOF07Ci0JY2hhciB1bmFtZVtUVU5NTEVOXTsKLQljaGFyIGduYW1lW1RHTk1MRU5dOwotCWNoYXIgZGV2bWFqb3JbOF07Ci0JY2hhciBkZXZtaW5vcls4XTsKLSAgICB9IGhlYWRlcjsKLX07Ci0KLS8qIFRoZSBtYWdpYyBmaWVsZCBpcyBmaWxsZWQgd2l0aCB0aGlzIGlmIHVuYW1lIGFuZCBnbmFtZSBhcmUgdmFsaWQuICovCi0jZGVmaW5lICAgIFRNQUdJQyAgICAgICAgInVzdGFyICAiCS8qIDcgY2hhcnMgYW5kIGEgbnVsbCAqLwotCi0vKgotICogZmlsZS1mdW5jdGlvbiBwcm90b3R5cGVzCi0gKi8KLXN0YXRpYyBpbnQgYXNjbWFnaWMocmVxdWVzdF9yZWMgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQpOwotc3RhdGljIGludCBpc190YXIodW5zaWduZWQgY2hhciAqLCBpbnQpOwotc3RhdGljIGludCBzb2Z0bWFnaWMocmVxdWVzdF9yZWMgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQpOwotc3RhdGljIHZvaWQgdHJ5aXQocmVxdWVzdF9yZWMgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQsIGludCk7Ci1zdGF0aWMgaW50IHptYWdpYyhyZXF1ZXN0X3JlYyAqLCB1bnNpZ25lZCBjaGFyICosIGludCk7Ci0KLXN0YXRpYyBpbnQgZ2V0dmFsdWUoc2VydmVyX3JlYyAqLCBzdHJ1Y3QgbWFnaWMgKiwgY2hhciAqKik7Ci1zdGF0aWMgaW50IGhleHRvaW50KGludCk7Ci1zdGF0aWMgY2hhciAqZ2V0c3RyKHNlcnZlcl9yZWMgKiwgY2hhciAqLCBjaGFyICosIGludCwgaW50ICopOwotc3RhdGljIGludCBwYXJzZShzZXJ2ZXJfcmVjICosIHBvb2wgKnAsIGNoYXIgKiwgaW50KTsKLQotc3RhdGljIGludCBtYXRjaChyZXF1ZXN0X3JlYyAqLCB1bnNpZ25lZCBjaGFyICosIGludCk7Ci1zdGF0aWMgaW50IG1nZXQocmVxdWVzdF9yZWMgKiwgdW5pb24gVkFMVUVUWVBFICosIHVuc2lnbmVkIGNoYXIgKiwKLQkJc3RydWN0IG1hZ2ljICosIGludCk7Ci1zdGF0aWMgaW50IG1jaGVjayhyZXF1ZXN0X3JlYyAqLCB1bmlvbiBWQUxVRVRZUEUgKiwgc3RydWN0IG1hZ2ljICopOwotc3RhdGljIHZvaWQgbXByaW50KHJlcXVlc3RfcmVjICosIHVuaW9uIFZBTFVFVFlQRSAqLCBzdHJ1Y3QgbWFnaWMgKik7Ci0KLXN0YXRpYyBpbnQgdW5jb21wcmVzcyhyZXF1ZXN0X3JlYyAqLCBpbnQsIAotCQkgICAgICB1bnNpZ25lZCBjaGFyICoqLCBpbnQpOwotc3RhdGljIGxvbmcgZnJvbV9vY3QoaW50LCBjaGFyICopOwotc3RhdGljIGludCBmc21hZ2ljKHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICpmbik7Ci0KLS8qCi0gKiBpbmNsdWRlcyBmb3IgQVNDSUkgc3Vic3RyaW5nIHJlY29nbml0aW9uIGZvcm1lcmx5ICJuYW1lcy5oIiBpbiBmaWxlCi0gKiBjb21tYW5kCi0gKgotICogT3JpZ2luYWwgbm90ZXM6IG5hbWVzIGFuZCB0eXBlcyB1c2VkIGJ5IGFzY21hZ2ljIGluIGZpbGUoMSkuIFRoZXNlIHRva2VucyBhcmUKLSAqIGhlcmUgYmVjYXVzZSB0aGV5IGNhbiBhcHBlYXIgYW55d2hlcmUgaW4gdGhlIGZpcnN0IEhPV01BTlkgYnl0ZXMsIHdoaWxlCi0gKiB0b2tlbnMgaW4gL2V0Yy9tYWdpYyBtdXN0IGFwcGVhciBhdCBmaXhlZCBvZmZzZXRzIGludG8gdGhlIGZpbGUuIERvbid0Ci0gKiBtYWtlIEhPV01BTlkgdG9vIGhpZ2ggdW5sZXNzIHlvdSBoYXZlIGEgdmVyeSBmYXN0IENQVS4KLSAqLwotCi0vKiB0aGVzZSB0eXBlcyBhcmUgdXNlZCB0byBpbmRleCB0aGUgdGFibGUgJ3R5cGVzJzoga2VlcCBlbSBpbiBzeW5jISAqLwotLyogSFRNTCBpbnNlcnRlZCBpbiBmaXJzdCBiZWNhdXNlIHRoaXMgaXMgYSB3ZWIgc2VydmVyIG1vZHVsZSBub3cgKi8KLSNkZWZpbmUgTF9IVE1MICAgIDAJCS8qIEhUTUwgKi8KLSNkZWZpbmUgTF9DICAgICAgIDEJCS8qIGZpcnN0IGFuZCBmb3JlbW9zdCBvbiBVTklYICovCi0jZGVmaW5lIExfRk9SVCAgICAyCQkvKiB0aGUgb2xkZXN0IG9uZSAqLwotI2RlZmluZSBMX01BS0UgICAgMwkJLyogTWFrZWZpbGVzICovCi0jZGVmaW5lIExfUExJICAgICA0CQkvKiBQTC8xICovCi0jZGVmaW5lIExfTUFDSCAgICA1CQkvKiBzb21lIGtpbmRhIGFzc2VtYmxlciAqLwotI2RlZmluZSBMX0VORyAgICAgNgkJLyogRW5nbGlzaCAqLwotI2RlZmluZSBMX1BBUyAgICAgNwkJLyogUGFzY2FsICovCi0jZGVmaW5lIExfTUFJTCAgICA4CQkvKiBFbGVjdHJvbmljIG1haWwgKi8KLSNkZWZpbmUgTF9ORVdTICAgIDkJCS8qIFVzZW5ldCBOZXRuZXdzICovCi0KLXN0YXRpYyBjaGFyICp0eXBlc1tdID0KLXsKLSAgICAidGV4dC9odG1sIiwJCS8qIEhUTUwgKi8KLSAgICAidGV4dC9wbGFpbiIsCQkvKiAiYyBwcm9ncmFtIHRleHQiLCAqLwotICAgICJ0ZXh0L3BsYWluIiwJCS8qICJmb3J0cmFuIHByb2dyYW0gdGV4dCIsICovCi0gICAgInRleHQvcGxhaW4iLAkJLyogIm1ha2UgY29tbWFuZHMgdGV4dCIsICovCi0gICAgInRleHQvcGxhaW4iLAkJLyogInBsLzEgcHJvZ3JhbSB0ZXh0IiwgKi8KLSAgICAidGV4dC9wbGFpbiIsCQkvKiAiYXNzZW1ibGVyIHByb2dyYW0gdGV4dCIsICovCi0gICAgInRleHQvcGxhaW4iLAkJLyogIkVuZ2xpc2ggdGV4dCIsICovCi0gICAgInRleHQvcGxhaW4iLAkJLyogInBhc2NhbCBwcm9ncmFtIHRleHQiLCAqLwotICAgICJtZXNzYWdlL3JmYzgyMiIsCQkvKiAibWFpbCB0ZXh0IiwgKi8KLSAgICAibWVzc2FnZS9uZXdzIiwJCS8qICJuZXdzIHRleHQiLCAqLwotICAgICJhcHBsaWNhdGlvbi9iaW5hcnkiLAkvKiAiY2FuJ3QgaGFwcGVuIGVycm9yIG9uIG5hbWVzLmgvdHlwZXMiLCAqLwotICAgIDAKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbmFtZXMgewotICAgIGNoYXIgKm5hbWU7Ci0gICAgc2hvcnQgdHlwZTsKLX0gbmFtZXNbXSA9IHsKLQotICAgIC8qIFRoZXNlIG11c3QgYmUgc29ydGVkIGJ5IGV5ZSBmb3Igb3B0aW1hbCBoaXQgcmF0ZSAqLwotICAgIC8qIEFkZCB0byB0aGlzIGxpc3Qgb25seSBhZnRlciBzdWJzdGFudGlhbCBtZWRpdGF0aW9uICovCi0gICAgewotCSI8aHRtbD4iLCBMX0hUTUwKLSAgICB9LAotICAgIHsKLQkiPEhUTUw+IiwgTF9IVE1MCi0gICAgfSwKLSAgICB7Ci0JIjxoZWFkPiIsIExfSFRNTAotICAgIH0sCi0gICAgewotCSI8SEVBRD4iLCBMX0hUTUwKLSAgICB9LAotICAgIHsKLQkiPHRpdGxlPiIsIExfSFRNTAotICAgIH0sCi0gICAgewotCSI8VElUTEU+IiwgTF9IVE1MCi0gICAgfSwKLSAgICB7Ci0JIjxoMT4iLCBMX0hUTUwKLSAgICB9LAotICAgIHsKLQkiPEgxPiIsIExfSFRNTAotICAgIH0sCi0gICAgewotCSI8IS0tIiwgTF9IVE1MCi0gICAgfSwKLSAgICB7Ci0JIjwhRE9DVFlQRSBIVE1MIiwgTF9IVE1MCi0gICAgfSwKLSAgICB7Ci0JIi8qIiwgTF9DCi0gICAgfSwJCQkJLyogbXVzdCBwcmVjZWRlICJUaGUiLCAidGhlIiwgZXRjLiAqLwotICAgIHsKLQkiI2luY2x1ZGUiLCBMX0MKLSAgICB9LAotICAgIHsKLQkiY2hhciIsIExfQwotICAgIH0sCi0gICAgewotCSJUaGUiLCBMX0VORwotICAgIH0sCi0gICAgewotCSJ0aGUiLCBMX0VORwotICAgIH0sCi0gICAgewotCSJkb3VibGUiLCBMX0MKLSAgICB9LAotICAgIHsKLQkiZXh0ZXJuIiwgTF9DCi0gICAgfSwKLSAgICB7Ci0JImZsb2F0IiwgTF9DCi0gICAgfSwKLSAgICB7Ci0JInJlYWwiLCBMX0MKLSAgICB9LAotICAgIHsKLQkic3RydWN0IiwgTF9DCi0gICAgfSwKLSAgICB7Ci0JInVuaW9uIiwgTF9DCi0gICAgfSwKLSAgICB7Ci0JIkNGTEFHUyIsIExfTUFLRQotICAgIH0sCi0gICAgewotCSJMREZMQUdTIiwgTF9NQUtFCi0gICAgfSwKLSAgICB7Ci0JImFsbDoiLCBMX01BS0UKLSAgICB9LAotICAgIHsKLQkiLlBSRUNJT1VTIiwgTF9NQUtFCi0gICAgfSwKLSAgICAvKgotICAgICAqIFRvbyBtYW55IGZpbGVzIG9mIHRleHQgaGF2ZSB0aGVzZSB3b3JkcyBpbiB0aGVtLiAgRmluZCBhbm90aGVyIHdheSB0bwotICAgICAqIHJlY29nbml6ZSBGb3J0cmFzaC4KLSAgICAgKi8KLSNpZmRlZiAgICBOT1RERUYKLSAgICB7Ci0JInN1YnJvdXRpbmUiLCBMX0ZPUlQKLSAgICB9LAotICAgIHsKLQkiZnVuY3Rpb24iLCBMX0ZPUlQKLSAgICB9LAotICAgIHsKLQkiYmxvY2siLCBMX0ZPUlQKLSAgICB9LAotICAgIHsKLQkiY29tbW9uIiwgTF9GT1JUCi0gICAgfSwKLSAgICB7Ci0JImRpbWVuc2lvbiIsIExfRk9SVAotICAgIH0sCi0gICAgewotCSJpbnRlZ2VyIiwgTF9GT1JUCi0gICAgfSwKLSAgICB7Ci0JImRhdGEiLCBMX0ZPUlQKLSAgICB9LAotI2VuZGlmIC8qIE5PVERFRiAqLwotICAgIHsKLQkiLmFzY2lpIiwgTF9NQUNICi0gICAgfSwKLSAgICB7Ci0JIi5hc2NpaXoiLCBMX01BQ0gKLSAgICB9LAotICAgIHsKLQkiLmJ5dGUiLCBMX01BQ0gKLSAgICB9LAotICAgIHsKLQkiLmV2ZW4iLCBMX01BQ0gKLSAgICB9LAotICAgIHsKLQkiLmdsb2JsIiwgTF9NQUNICi0gICAgfSwKLSAgICB7Ci0JImNsciIsIExfTUFDSAotICAgIH0sCi0gICAgewotCSIoaW5wdXQsIiwgTF9QQVMKLSAgICB9LAotICAgIHsKLQkiZGNsIiwgTF9QTEkKLSAgICB9LAotICAgIHsKLQkiUmVjZWl2ZWQ6IiwgTF9NQUlMCi0gICAgfSwKLSAgICB7Ci0JIj5Gcm9tIiwgTF9NQUlMCi0gICAgfSwKLSAgICB7Ci0JIlJldHVybi1QYXRoOiIsIExfTUFJTAotICAgIH0sCi0gICAgewotCSJDYzoiLCBMX01BSUwKLSAgICB9LAotICAgIHsKLQkiTmV3c2dyb3VwczoiLCBMX05FV1MKLSAgICB9LAotICAgIHsKLQkiUGF0aDoiLCBMX05FV1MKLSAgICB9LAotICAgIHsKLQkiT3JnYW5pemF0aW9uOiIsIExfTkVXUwotICAgIH0sCi0gICAgewotCU5VTEwsIDAKLSAgICB9Ci19OwotCi0jZGVmaW5lIE5OQU1FUyAoKHNpemVvZihuYW1lcykvc2l6ZW9mKHN0cnVjdCBuYW1lcykpIC0gMSkKLQotLyoKLSAqIFJlc3VsdCBTdHJpbmcgTGlzdCAoUlNMKQotICoKLSAqIFRoZSBmaWxlKDEpIGNvbW1hbmQgcHJpbnRzIGl0cyBvdXRwdXQuICBJbnN0ZWFkLCB3ZSBzdG9yZSB0aGUgdmFyaW91cwotICogInByaW50ZWQiIHN0cmluZ3MgaW4gYSBsaXN0IChhbGxvY2F0aW5nIG1lbW9yeSBhcyB3ZSBnbykgYW5kIGNvbmNhdGVuYXRlCi0gKiB0aGVtIGF0IHRoZSBlbmQgd2hlbiB3ZSBmaW5hbGx5IGtub3cgaG93IG11Y2ggc3BhY2UgdGhleSdsbCBuZWVkLgotICovCi0KLXR5cGVkZWYgc3RydWN0IG1hZ2ljX3JzbF9zIHsKLSAgICBjaGFyICpzdHI7CQkJLyogc3RyaW5nLCBwb3NzaWJseSBhIGZyYWdtZW50ICovCi0gICAgc3RydWN0IG1hZ2ljX3JzbF9zICpuZXh0OwkvKiBwb2ludGVyIHRvIG5leHQgZnJhZ21lbnQgKi8KLX0gbWFnaWNfcnNsOwotCi0vKgotICogQXBhY2hlIG1vZHVsZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZXMKLSAqLwotCi0vKiBwZXItc2VydmVyIGluZm8gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjaGFyICptYWdpY2ZpbGU7CQkvKiB3aGVyZSBtYWdpYyBiZSBmb3VuZCAqLwotICAgIHN0cnVjdCBtYWdpYyAqbWFnaWM7CS8qIGhlYWQgb2YgbWFnaWMgY29uZmlnIGxpc3QgKi8KLSAgICBzdHJ1Y3QgbWFnaWMgKmxhc3Q7Ci19IG1hZ2ljX3NlcnZlcl9jb25maWdfcmVjOwotCi0vKiBwZXItcmVxdWVzdCBpbmZvICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgbWFnaWNfcnNsICpoZWFkOwkJLyogcmVzdWx0IHN0cmluZyBsaXN0ICovCi0gICAgbWFnaWNfcnNsICp0YWlsOwotICAgIHVuc2lnbmVkIHN1Zl9yZWN1cnNpb247CS8qIHJlY3Vyc2lvbiBkZXB0aCBpbiBzdWZmaXggY2hlY2sgKi8KLX0gbWFnaWNfcmVxX3JlYzsKLQotLyoKLSAqIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIC0gY2FsbGVkIGJ5IEFwYWNoZSBBUEkgcm91dGluZXMKLSAqLwotCi1tb2R1bGUgbWltZV9tYWdpY19tb2R1bGU7Ci0KLXN0YXRpYyB2b2lkICpjcmVhdGVfbWFnaWNfc2VydmVyX2NvbmZpZyhwb29sICpwLCBzZXJ2ZXJfcmVjICpkKQotewotICAgIC8qIGFsbG9jYXRlIHRoZSBjb25maWcgLSB1c2UgcGNhbGxvYyBiZWNhdXNlIGl0IG5lZWRzIHRvIGJlIHplcm9lZCAqLwotICAgIHJldHVybiBhcF9wY2FsbG9jKHAsIHNpemVvZihtYWdpY19zZXJ2ZXJfY29uZmlnX3JlYykpOwotfQotCi1zdGF0aWMgdm9pZCAqbWVyZ2VfbWFnaWNfc2VydmVyX2NvbmZpZyhwb29sICpwLCB2b2lkICpiYXNldiwgdm9pZCAqYWRkdikKLXsKLSAgICBtYWdpY19zZXJ2ZXJfY29uZmlnX3JlYyAqYmFzZSA9IChtYWdpY19zZXJ2ZXJfY29uZmlnX3JlYyAqKSBiYXNldjsKLSAgICBtYWdpY19zZXJ2ZXJfY29uZmlnX3JlYyAqYWRkID0gKG1hZ2ljX3NlcnZlcl9jb25maWdfcmVjICopIGFkZHY7Ci0gICAgbWFnaWNfc2VydmVyX2NvbmZpZ19yZWMgKm5ldyA9IChtYWdpY19zZXJ2ZXJfY29uZmlnX3JlYyAqKQotCQkJICAgIGFwX3BhbGxvYyhwLCBzaXplb2YobWFnaWNfc2VydmVyX2NvbmZpZ19yZWMpKTsKLQotICAgIG5ldy0+bWFnaWNmaWxlID0gYWRkLT5tYWdpY2ZpbGUgPyBhZGQtPm1hZ2ljZmlsZSA6IGJhc2UtPm1hZ2ljZmlsZTsKLSAgICBuZXctPm1hZ2ljID0gTlVMTDsKLSAgICBuZXctPmxhc3QgPSBOVUxMOwotICAgIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbWFnaWNmaWxlKGNtZF9wYXJtcyAqY21kLCBjaGFyICpkLCBjaGFyICphcmcpCi17Ci0gICAgbWFnaWNfc2VydmVyX2NvbmZpZ19yZWMgKmNvbmYgPSAobWFnaWNfc2VydmVyX2NvbmZpZ19yZWMgKikKLSAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhjbWQtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywKLQkJICAgICAgJm1pbWVfbWFnaWNfbW9kdWxlKTsKLQotICAgIGlmICghY29uZikgewotCXJldHVybiBNT0ROQU1FICI6IHNlcnZlciBzdHJ1Y3R1cmUgbm90IGFsbG9jYXRlZCI7Ci0gICAgfQotICAgIGNvbmYtPm1hZ2ljZmlsZSA9IGFyZzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIGNvbmZpZ3VyYXRpb24gZmlsZSBjb21tYW5kcyAtIGV4cG9ydGVkIHRvIEFwYWNoZSBBUEkKLSAqLwotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgbWltZV9tYWdpY19jbWRzW10gPQotewotICAgIHsiTWltZU1hZ2ljRmlsZSIsIHNldF9tYWdpY2ZpbGUsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICAgICJQYXRoIHRvIE1JTUUgTWFnaWMgZmlsZSAoaW4gZmlsZSgxKSBmb3JtYXQpIn0sCi0gICAge05VTEx9Ci19OwotCi0vKgotICogUlNMIChyZXN1bHQgc3RyaW5nIGxpc3QpIHByb2Nlc3Npbmcgcm91dGluZXMKLSAqCi0gKiBUaGVzZSBjb2xsZWN0IHN0cmluZ3MgdGhhdCB3b3VsZCBoYXZlIGJlZW4gcHJpbnRlZCBpbiBmcmFnbWVudHMgYnkgZmlsZSgxKQotICogaW50byBhIGxpc3Qgb2YgbWFnaWNfcnNsIHN0cnVjdHVyZXMgd2l0aCB0aGUgc3RyaW5ncy4gV2hlbiBjb21wbGV0ZSwKLSAqIHRoZXkncmUgY29uY2F0ZW5hdGVkIHRvZ2V0aGVyIHRvIGJlY29tZSB0aGUgTUlNRSBjb250ZW50IGFuZCBlbmNvZGluZwotICogdHlwZXMuCi0gKgotICogcmV0dXJuIHZhbHVlIGNvbnZlbnRpb25zIGZvciB0aGVzZSBmdW5jdGlvbnM6IGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gaW50OgotICogZmFpbHVyZSA9IC0xLCBvdGhlciA9IHJlc3VsdCBmdW5jdGlvbnMgd2hpY2ggcmV0dXJuIHBvaW50ZXJzOiBmYWlsdXJlID0gMCwKLSAqIG90aGVyID0gcmVzdWx0Ci0gKi8KLQotLyogYWxsb2NhdGUgYSBwZXItcmVxdWVzdCBzdHJ1Y3R1cmUgYW5kIHB1dCBpdCBpbiB0aGUgcmVxdWVzdCByZWNvcmQgKi8KLXN0YXRpYyBtYWdpY19yZXFfcmVjICptYWdpY19zZXRfY29uZmlnKHJlcXVlc3RfcmVjICpyKQotewotICAgIG1hZ2ljX3JlcV9yZWMgKnJlcV9kYXQgPSAobWFnaWNfcmVxX3JlYyAqKSBhcF9wYWxsb2Moci0+cG9vbCwKLQkJCQkJCSAgICAgIHNpemVvZihtYWdpY19yZXFfcmVjKSk7Ci0KLSAgICByZXFfZGF0LT5oZWFkID0gcmVxX2RhdC0+dGFpbCA9IChtYWdpY19yc2wgKikgTlVMTDsKLSAgICBhcF9zZXRfbW9kdWxlX2NvbmZpZyhyLT5yZXF1ZXN0X2NvbmZpZywgJm1pbWVfbWFnaWNfbW9kdWxlLCByZXFfZGF0KTsKLSAgICByZXR1cm4gcmVxX2RhdDsKLX0KLQotLyogYWRkIGEgc3RyaW5nIHRvIHRoZSByZXN1bHQgc3RyaW5nIGxpc3QgZm9yIHRoaXMgcmVxdWVzdCAqLwotLyogaXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gYWxsb2NhdGUgInN0ciIgKi8KLXN0YXRpYyBpbnQgbWFnaWNfcnNsX2FkZChyZXF1ZXN0X3JlYyAqciwgY2hhciAqc3RyKQotewotICAgIG1hZ2ljX3JlcV9yZWMgKnJlcV9kYXQgPSAobWFnaWNfcmVxX3JlYyAqKQotCQkgICAgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cmVxdWVzdF9jb25maWcsICZtaW1lX21hZ2ljX21vZHVsZSk7Ci0gICAgbWFnaWNfcnNsICpyc2w7Ci0KLSAgICAvKiBtYWtlIHN1cmUgd2UgaGF2ZSBhIGxpc3QgdG8gcHV0IGl0IGluICovCi0gICAgaWYgKCFyZXFfZGF0KSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfRVJSLCByLAotCQkgICAgTU9ETkFNRSAiOiByZXF1ZXN0IGNvbmZpZyBzaG91bGQgbm90IGJlIE5VTEwiKTsKLQlpZiAoIShyZXFfZGF0ID0gbWFnaWNfc2V0X2NvbmZpZyhyKSkpIHsKLQkgICAgLyogZmFpbHVyZSAqLwotCSAgICByZXR1cm4gLTE7Ci0JfQotICAgIH0KLQotICAgIC8qIGFsbG9jYXRlIHRoZSBsaXN0IGVudHJ5ICovCi0gICAgcnNsID0gKG1hZ2ljX3JzbCAqKSBhcF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG1hZ2ljX3JzbCkpOwotCi0gICAgLyogZmlsbCBpdCAqLwotICAgIHJzbC0+c3RyID0gc3RyOwotICAgIHJzbC0+bmV4dCA9IChtYWdpY19yc2wgKikgTlVMTDsKLQotICAgIC8qIGFwcGVuZCB0byB0aGUgbGlzdCAqLwotICAgIGlmIChyZXFfZGF0LT5oZWFkICYmIHJlcV9kYXQtPnRhaWwpIHsKLQlyZXFfZGF0LT50YWlsLT5uZXh0ID0gcnNsOwotCXJlcV9kYXQtPnRhaWwgPSByc2w7Ci0gICAgfQotICAgIGVsc2UgewotCXJlcV9kYXQtPmhlYWQgPSByZXFfZGF0LT50YWlsID0gcnNsOwotICAgIH0KLQotICAgIC8qIHN1Y2Nlc3MgKi8KLSAgICByZXR1cm4gMDsKLX0KLQotLyogUlNMIGhvb2sgZm9yIHB1dHMtdHlwZSBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgbWFnaWNfcnNsX3B1dHMocmVxdWVzdF9yZWMgKnIsIGNoYXIgKnN0cikKLXsKLSAgICByZXR1cm4gbWFnaWNfcnNsX2FkZChyLCBzdHIpOwotfQotCi0vKiBSU0wgaG9vayBmb3IgcHJpbnRmLXR5cGUgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IG1hZ2ljX3JzbF9wcmludGYocmVxdWVzdF9yZWMgKnIsIGNoYXIgKnN0ciwuLi4pCi17Ci0gICAgdmFfbGlzdCBhcDsKLQotICAgIGNoYXIgYnVmW01BWE1JTUVTVFJJTkddOwotCi0gICAgLyogYXNzZW1ibGUgdGhlIHN0cmluZyBpbnRvIHRoZSBidWZmZXIgKi8KLSAgICB2YV9zdGFydChhcCwgc3RyKTsKLSAgICBhcF92c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgc3RyLCBhcCk7Ci0gICAgdmFfZW5kKGFwKTsKLQotICAgIC8qIGFkZCB0aGUgYnVmZmVyIHRvIHRoZSBsaXN0ICovCi0gICAgcmV0dXJuIG1hZ2ljX3JzbF9hZGQociwgc3RyZHVwKGJ1ZikpOwotfQotCi0vKiBSU0wgaG9vayBmb3IgcHV0Y2hhci10eXBlIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBtYWdpY19yc2xfcHV0Y2hhcihyZXF1ZXN0X3JlYyAqciwgY2hhciBjKQotewotICAgIGNoYXIgc3RyWzJdOwotCi0gICAgLyogaGlnaCBvdmVyaGVhZCBmb3IgMSBjaGFyIC0ganVzdCBob3BlIHRoZXkgZG9uJ3QgZG8gdGhpcyBtdWNoICovCi0gICAgc3RyWzBdID0gYzsKLSAgICBzdHJbMV0gPSAnXDAnOwotICAgIHJldHVybiBtYWdpY19yc2xfYWRkKHIsIHN0cik7Ci19Ci0KLS8qIGFsbG9jYXRlIGFuZCBjb3B5IGEgY29udGlndW91cyBzdHJpbmcgZnJvbSBhIHJlc3VsdCBzdHJpbmcgbGlzdCAqLwotc3RhdGljIGNoYXIgKnJzbF9zdHJkdXAocmVxdWVzdF9yZWMgKnIsIGludCBzdGFydF9mcmFnLCBpbnQgc3RhcnRfcG9zLCBpbnQgbGVuKQotewotICAgIGNoYXIgKnJlc3VsdDsJCS8qIHJldHVybiB2YWx1ZSAqLwotICAgIGludCBjdXJfZnJhZywJCS8qIGN1cnJlbnQgZnJhZ21lbnQgbnVtYmVyL2NvdW50ZXIgKi8KLSAgICAgICAgY3VyX3BvcywJCS8qIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIGZyYWdtZW50ICovCi0gICAgICAgIHJlc19wb3M7CQkvKiBwb3NpdGlvbiBpbiByZXN1bHQgc3RyaW5nICovCi0gICAgbWFnaWNfcnNsICpmcmFnOwkJLyogbGlzdC10cmF2ZXJzYWwgcG9pbnRlciAqLwotICAgIG1hZ2ljX3JlcV9yZWMgKnJlcV9kYXQgPSAobWFnaWNfcmVxX3JlYyAqKQotCQkgICAgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cmVxdWVzdF9jb25maWcsICZtaW1lX21hZ2ljX21vZHVsZSk7Ci0KLSAgICAvKiBhbGxvY2F0ZSB0aGUgcmVzdWx0IHN0cmluZyAqLwotICAgIHJlc3VsdCA9IChjaGFyICopIGFwX3BhbGxvYyhyLT5wb29sLCBsZW4gKyAxKTsKLQotICAgIC8qIGxvb3AgdGhyb3VnaCBhbmQgY29sbGVjdCB0aGUgc3RyaW5nICovCi0gICAgcmVzX3BvcyA9IDA7Ci0gICAgZm9yIChmcmFnID0gcmVxX2RhdC0+aGVhZCwgY3VyX2ZyYWcgPSAwOwotCSBmcmFnLT5uZXh0OwotCSBmcmFnID0gZnJhZy0+bmV4dCwgY3VyX2ZyYWcrKykgewotCS8qIGxvb3AgdG8gdGhlIGZpcnN0IGZyYWdtZW50ICovCi0JaWYgKGN1cl9mcmFnIDwgc3RhcnRfZnJhZykKLQkgICAgY29udGludWU7Ci0KLQkvKiBsb29wIHRocm91Z2ggYW5kIGNvbGxlY3QgY2hhcnMgKi8KLQlmb3IgKGN1cl9wb3MgPSAoY3VyX2ZyYWcgPT0gc3RhcnRfZnJhZykgPyBzdGFydF9wb3MgOiAwOwotCSAgICAgZnJhZy0+c3RyW2N1cl9wb3NdOwotCSAgICAgY3VyX3BvcysrKSB7Ci0JICAgIGlmIChjdXJfZnJhZyA+PSBzdGFydF9mcmFnCi0JCSYmIGN1cl9wb3MgPj0gc3RhcnRfcG9zCi0JCSYmIHJlc19wb3MgPD0gbGVuKSB7Ci0JCXJlc3VsdFtyZXNfcG9zKytdID0gZnJhZy0+c3RyW2N1cl9wb3NdOwotCQlpZiAocmVzX3BvcyA+IGxlbikgewotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICAvKiBjbGVhbiB1cCBhbmQgcmV0dXJuICovCi0gICAgcmVzdWx0W3Jlc19wb3NdID0gMDsKLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0gICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIHIsCi0JICAgICBNT0ROQU1FICI6IHJzbF9zdHJkdXAoKSAlZCBjaGFyczogJXMiLCByZXNfcG9zIC0gMSwgcmVzdWx0KTsKLSNlbmRpZgotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIHN0YXRlcyBmb3IgdGhlIHN0YXRlLW1hY2hpbmUgYWxnb3JpdGhtIGluIG1hZ2ljX3JzbF90b19yZXF1ZXN0KCkgKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgcnNsX2xlYWRpbmdfc3BhY2UsIHJzbF90eXBlLCByc2xfc3VidHlwZSwgcnNsX3NlcGFyYXRvciwgcnNsX2VuY29kaW5nCi19IHJzbF9zdGF0ZXM7Ci0KLS8qIHByb2Nlc3MgdGhlIFJTTCBhbmQgc2V0IHRoZSBNSU1FIGluZm8gaW4gdGhlIHJlcXVlc3QgcmVjb3JkICovCi1zdGF0aWMgaW50IG1hZ2ljX3JzbF90b19yZXF1ZXN0KHJlcXVlc3RfcmVjICpyKQotewotICAgIGludCBjdXJfZnJhZywJCS8qIGN1cnJlbnQgZnJhZ21lbnQgbnVtYmVyL2NvdW50ZXIgKi8KLSAgICAgICAgY3VyX3BvcywJCS8qIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIGZyYWdtZW50ICovCi0gICAgICAgIHR5cGVfZnJhZywJCS8qIGNvbnRlbnQgdHlwZSBzdGFydGluZyBwb2ludDogZnJhZ21lbnQgKi8KLSAgICAgICAgdHlwZV9wb3MsCQkvKiBjb250ZW50IHR5cGUgc3RhcnRpbmcgcG9pbnQ6IHBvc2l0aW9uICovCi0gICAgICAgIHR5cGVfbGVuLAkJLyogY29udGVudCB0eXBlIGxlbmd0aCAqLwotICAgICAgICBlbmNvZGluZ19mcmFnLAkJLyogY29udGVudCBlbmNvZGluZyBzdGFydGluZyBwb2ludDogZnJhZ21lbnQgKi8KLSAgICAgICAgZW5jb2RpbmdfcG9zLAkJLyogY29udGVudCBlbmNvZGluZyBzdGFydGluZyBwb2ludDogcG9zaXRpb24gKi8KLSAgICAgICAgZW5jb2RpbmdfbGVuOwkJLyogY29udGVudCBlbmNvZGluZyBsZW5ndGggKi8KLQotICAgIG1hZ2ljX3JzbCAqZnJhZzsJCS8qIGxpc3QtdHJhdmVyc2FsIHBvaW50ZXIgKi8KLSAgICByc2xfc3RhdGVzIHN0YXRlOwotCi0gICAgbWFnaWNfcmVxX3JlYyAqcmVxX2RhdCA9IChtYWdpY19yZXFfcmVjICopCi0JCSAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5yZXF1ZXN0X2NvbmZpZywgJm1pbWVfbWFnaWNfbW9kdWxlKTsKLQotICAgIC8qIGNoZWNrIGlmIHdlIGhhdmUgYSByZXN1bHQgKi8KLSAgICBpZiAoIXJlcV9kYXQgfHwgIXJlcV9kYXQtPmhlYWQpIHsKLQkvKiBlbXB0eSAtIG5vIG1hdGNoLCB3ZSBkZWZlciB0byBvdGhlciBBcGFjaGUgbW9kdWxlcyAqLwotCXJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICAvKiBzdGFydCBzZWFyY2hpbmcgZm9yIHRoZSB0eXBlIGFuZCBlbmNvZGluZyAqLwotICAgIHN0YXRlID0gcnNsX2xlYWRpbmdfc3BhY2U7Ci0gICAgdHlwZV9mcmFnID0gdHlwZV9wb3MgPSB0eXBlX2xlbiA9IDA7Ci0gICAgZW5jb2RpbmdfZnJhZyA9IGVuY29kaW5nX3BvcyA9IGVuY29kaW5nX2xlbiA9IDA7Ci0gICAgZm9yIChmcmFnID0gcmVxX2RhdC0+aGVhZCwgY3VyX2ZyYWcgPSAwOwotCSBmcmFnICYmIGZyYWctPm5leHQ7Ci0JIGZyYWcgPSBmcmFnLT5uZXh0LCBjdXJfZnJhZysrKSB7Ci0JLyogbG9vcCB0aHJvdWdoIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBmcmFnbWVudCAqLwotCWZvciAoY3VyX3BvcyA9IDA7IGZyYWctPnN0cltjdXJfcG9zXTsgY3VyX3BvcysrKSB7Ci0JICAgIGlmIChhcF9pc3NwYWNlKGZyYWctPnN0cltjdXJfcG9zXSkpIHsKLQkJLyogcHJvY2VzcyB3aGl0ZXNwYWNlIGFjdGlvbnMgZm9yIGVhY2ggc3RhdGUgKi8KLQkJaWYgKHN0YXRlID09IHJzbF9sZWFkaW5nX3NwYWNlKSB7Ci0JCSAgICAvKiBlYXQgd2hpdGVzcGFjZSBpbiB0aGlzIHN0YXRlICovCi0JCSAgICBjb250aW51ZTsKLQkJfQotCQllbHNlIGlmIChzdGF0ZSA9PSByc2xfdHlwZSkgewotCQkgICAgLyogd2hpdGVzcGFjZTogdHlwZSBoYXMgbm8gc2xhc2ghICovCi0JCSAgICByZXR1cm4gREVDTElORUQ7Ci0JCX0KLQkJZWxzZSBpZiAoc3RhdGUgPT0gcnNsX3N1YnR5cGUpIHsKLQkJICAgIC8qIHdoaXRlc3BhY2U6IGVuZCBvZiBNSU1FIHR5cGUgKi8KLQkJICAgIHN0YXRlKys7Ci0JCSAgICBjb250aW51ZTsKLQkJfQotCQllbHNlIGlmIChzdGF0ZSA9PSByc2xfc2VwYXJhdG9yKSB7Ci0JCSAgICAvKiBlYXQgd2hpdGVzcGFjZSBpbiB0aGlzIHN0YXRlICovCi0JCSAgICBjb250aW51ZTsKLQkJfQotCQllbHNlIGlmIChzdGF0ZSA9PSByc2xfZW5jb2RpbmcpIHsKLQkJICAgIC8qIHdoaXRlc3BhY2U6IGVuZCBvZiBNSU1FIGVuY29kaW5nICovCi0JCSAgICAvKiB3ZSdyZSBkb25lICovCi0JCSAgICBmcmFnID0gcmVxX2RhdC0+dGFpbDsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCWVsc2UgewotCQkgICAgLyogc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSAqLwotCQkgICAgLyogYWJhbmRvbiBtYWxmdW5jdGlvbmluZyBtb2R1bGUgKi8KLQkJICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0VSUiwgciwKLQkJCQlNT0ROQU1FICI6IGJhZCBzdGF0ZSAlZCAod3MpIiwgc3RhdGUpOwotCQkgICAgcmV0dXJuIERFQ0xJTkVEOwotCQl9Ci0JCS8qIE5PVFJFQUNIRUQgKi8KLQkgICAgfQotCSAgICBlbHNlIGlmIChzdGF0ZSA9PSByc2xfdHlwZSAmJgotCQkgICAgIGZyYWctPnN0cltjdXJfcG9zXSA9PSAnLycpIHsKLQkJLyogY29weSB0aGUgY2hhciBhbmQgZ28gdG8gcnNsX3N1YnR5cGUgc3RhdGUgKi8KLQkJdHlwZV9sZW4rKzsKLQkJc3RhdGUrKzsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJLyogcHJvY2VzcyBub24tc3BhY2UgYWN0aW9ucyBmb3IgZWFjaCBzdGF0ZSAqLwotCQlpZiAoc3RhdGUgPT0gcnNsX2xlYWRpbmdfc3BhY2UpIHsKLQkJICAgIC8qIG5vbi1zcGFjZTogYmVnaW4gTUlNRSB0eXBlICovCi0JCSAgICBzdGF0ZSsrOwotCQkgICAgdHlwZV9mcmFnID0gY3VyX2ZyYWc7Ci0JCSAgICB0eXBlX3BvcyA9IGN1cl9wb3M7Ci0JCSAgICB0eXBlX2xlbiA9IDE7Ci0JCSAgICBjb250aW51ZTsKLQkJfQotCQllbHNlIGlmIChzdGF0ZSA9PSByc2xfdHlwZSB8fAotCQkJIHN0YXRlID09IHJzbF9zdWJ0eXBlKSB7Ci0JCSAgICAvKiBub24tc3BhY2U6IGFkZHMgdG8gdHlwZSAqLwotCQkgICAgdHlwZV9sZW4rKzsKLQkJICAgIGNvbnRpbnVlOwotCQl9Ci0JCWVsc2UgaWYgKHN0YXRlID09IHJzbF9zZXBhcmF0b3IpIHsKLQkJICAgIC8qIG5vbi1zcGFjZTogYmVnaW4gTUlNRSBlbmNvZGluZyAqLwotCQkgICAgc3RhdGUrKzsKLQkJICAgIGVuY29kaW5nX2ZyYWcgPSBjdXJfZnJhZzsKLQkJICAgIGVuY29kaW5nX3BvcyA9IGN1cl9wb3M7Ci0JCSAgICBlbmNvZGluZ19sZW4gPSAxOwotCQkgICAgY29udGludWU7Ci0JCX0KLQkJZWxzZSBpZiAoc3RhdGUgPT0gcnNsX2VuY29kaW5nKSB7Ci0JCSAgICAvKiBub24tc3BhY2U6IGFkZHMgdG8gZW5jb2RpbmcgKi8KLQkJICAgIGVuY29kaW5nX2xlbisrOwotCQkgICAgY29udGludWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCSAgICAvKiBzaG91bGQgbm90IGJlIHBvc3NpYmxlICovCi0JCSAgICAvKiBhYmFuZG9uIG1hbGZ1bmN0aW9uaW5nIG1vZHVsZSAqLwotCQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfRVJSLCByLAotCQkJCU1PRE5BTUUgIjogYmFkIHN0YXRlICVkIChucykiLCBzdGF0ZSk7Ci0JCSAgICByZXR1cm4gREVDTElORUQ7Ci0JCX0KLQkJLyogTk9UUkVBQ0hFRCAqLwotCSAgICB9Ci0JICAgIC8qIE5PVFJFQUNIRUQgKi8KLQl9Ci0gICAgfQotCi0gICAgLyogaWYgd2UgZW5kZWQgcHJpb3IgdG8gc3RhdGUgcnNsX3N1YnR5cGUsIHdlIGhhZCBpbmNvbXBsZXRlIGluZm8gKi8KLSAgICBpZiAoc3RhdGUgIT0gcnNsX3N1YnR5cGUgJiYgc3RhdGUgIT0gcnNsX3NlcGFyYXRvciAmJgotCXN0YXRlICE9IHJzbF9lbmNvZGluZykgewotCS8qIGRlZmVyIHRvIG90aGVyIG1vZHVsZXMgKi8KLQlyZXR1cm4gREVDTElORUQ7Ci0gICAgfQotCi0gICAgLyogc2F2ZSB0aGUgaW5mbyBpbiB0aGUgcmVxdWVzdCByZWNvcmQgKi8KLSAgICBpZiAoc3RhdGUgPT0gcnNsX3N1YnR5cGUgfHwgc3RhdGUgPT0gcnNsX2VuY29kaW5nIHx8Ci0Jc3RhdGUgPT0gcnNsX2VuY29kaW5nKSB7Ci0gICAgICAgIGNoYXIgKnRtcDsKLQl0bXAgPSByc2xfc3RyZHVwKHIsIHR5cGVfZnJhZywgdHlwZV9wb3MsIHR5cGVfbGVuKTsKLQkvKiBYWFg6IHRoaXMgY291bGQgYmUgZG9uZSBhdCBjb25maWcgdGltZSBJJ20gc3VyZS4uLiBidXQgSSdtCi0JICogY29uZnVzZWQgYnkgYWxsIHRoaXMgbWFnaWNfcnNsIHN0dWZmLiAtZGpnICovCi0JYXBfY29udGVudF90eXBlX3RvbG93ZXIodG1wKTsKLQlyLT5jb250ZW50X3R5cGUgPSB0bXA7Ci0gICAgfQotICAgIGlmIChzdGF0ZSA9PSByc2xfZW5jb2RpbmcpIHsKLSAgICAgICAgY2hhciAqdG1wOwotCXRtcCA9IHJzbF9zdHJkdXAociwgZW5jb2RpbmdfZnJhZywKLQkJCQkJIGVuY29kaW5nX3BvcywgZW5jb2RpbmdfbGVuKTsKLQkvKiBYWFg6IHRoaXMgY291bGQgYmUgZG9uZSBhdCBjb25maWcgdGltZSBJJ20gc3VyZS4uLiBidXQgSSdtCi0JICogY29uZnVzZWQgYnkgYWxsIHRoaXMgbWFnaWNfcnNsIHN0dWZmLiAtZGpnICovCi0JYXBfc3RyX3RvbG93ZXIodG1wKTsKLQlyLT5jb250ZW50X2VuY29kaW5nID0gdG1wOwotICAgIH0KLQotICAgIC8qIGRldGVjdCBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvcnMgKi8KLSAgICBpZiAoIXItPmNvbnRlbnRfdHlwZSB8fAotCShzdGF0ZSA9PSByc2xfZW5jb2RpbmcgJiYgIXItPmNvbnRlbnRfZW5jb2RpbmcpKSB7Ci0JcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgIH0KLQotICAgIC8qIHN1Y2Nlc3MhICovCi0gICAgcmV0dXJuIE9LOwotfQotCi0vKgotICogbWFnaWNfcHJvY2VzcyAtIHByb2Nlc3MgaW5wdXQgZmlsZSByICAgICAgICBBcGFjaGUgQVBJIHJlcXVlc3QgcmVjb3JkCi0gKiAoZm9ybWVybHkgY2FsbGVkICJwcm9jZXNzIiBpbiBmaWxlIGNvbW1hbmQsIHByZWZpeCBhZGRlZCBmb3IgY2xhcml0eSkgT3BlbnMKLSAqIHRoZSBmaWxlIGFuZCByZWFkcyBhIGZpeGVkLXNpemUgYnVmZmVyIHRvIGJlZ2luIHByb2Nlc3NpbmcgdGhlIGNvbnRlbnRzLgotICovCi1zdGF0aWMgaW50IG1hZ2ljX3Byb2Nlc3MocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IGZkID0gMDsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZltIT1dNQU5ZICsgMV07CS8qIG9uZSBleHRyYSBmb3IgdGVybWluYXRpbmcgJ1wwJyAqLwotICAgIGludCBuYnl0ZXMgPSAwOwkJLyogbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBhIGRhdGFmaWxlICovCi0gICAgaW50IHJlc3VsdDsKLQotICAgIC8qCi0gICAgICogZmlyc3QgdHJ5IGp1ZGdpbmcgdGhlIGZpbGUgYmFzZWQgb24gaXRzIGZpbGVzeXN0ZW0gc3RhdHVzCi0gICAgICovCi0gICAgc3dpdGNoICgocmVzdWx0ID0gZnNtYWdpYyhyLCByLT5maWxlbmFtZSkpKSB7Ci0gICAgY2FzZSBET05FOgotCW1hZ2ljX3JzbF9wdXRjaGFyKHIsICdcbicpOwotCXJldHVybiBPSzsKLSAgICBjYXNlIE9LOgotCWJyZWFrOwotICAgIGRlZmF1bHQ6Ci0JLyogZmF0YWwgZXJyb3IsIGJhaWwgb3V0ICovCi0JcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBpZiAoKGZkID0gYXBfcG9wZW5mKHItPnBvb2wsIHItPmZpbGVuYW1lLCBPX1JET05MWSwgMCkpIDwgMCkgewotCS8qIFdlIGNhbid0IG9wZW4gaXQsIGJ1dCB3ZSB3ZXJlIGFibGUgdG8gc3RhdCBpdC4gKi8KLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgciwKLQkJICAgIE1PRE5BTUUgIjogY2FuJ3QgcmVhZCBgJXMnIiwgci0+ZmlsZW5hbWUpOwotCS8qIGxldCBzb21lIG90aGVyIGhhbmRsZXIgZGVjaWRlIHdoYXQgdGhlIHByb2JsZW0gaXMgKi8KLQlyZXR1cm4gREVDTElORUQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiB0cnkgbG9va2luZyBhdCB0aGUgZmlyc3QgSE9XTUFOWSBieXRlcwotICAgICAqLwotICAgIGlmICgobmJ5dGVzID0gcmVhZChmZCwgKGNoYXIgKikgYnVmLCBzaXplb2YoYnVmKSAtIDEpKSA9PSAtMSkgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotCQkgICAgTU9ETkFNRSAiOiByZWFkIGZhaWxlZDogJXMiLCByLT5maWxlbmFtZSk7Ci0JcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgIH0KLQotICAgIGlmIChuYnl0ZXMgPT0gMCkKLQltYWdpY19yc2xfcHV0cyhyLCBNSU1FX1RFWFRfVU5LTk9XTik7Ci0gICAgZWxzZSB7Ci0JYnVmW25ieXRlcysrXSA9ICdcMCc7CS8qIG51bGwtdGVybWluYXRlIGl0ICovCi0JdHJ5aXQociwgYnVmLCBuYnl0ZXMsIDEpOyAKLSAgICB9Ci0KLSAgICAodm9pZCkgYXBfcGNsb3NlZihyLT5wb29sLCBmZCk7Ci0gICAgKHZvaWQpIG1hZ2ljX3JzbF9wdXRjaGFyKHIsICdcbicpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0KLXN0YXRpYyB2b2lkIHRyeWl0KHJlcXVlc3RfcmVjICpyLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBuYiwgaW50IGNoZWNrem1hZ2ljKQotewotICAgIC8qCi0gICAgICogVHJ5IGNvbXByZXNzaW9uIHN0dWZmCi0gICAgICovCi0JaWYgKGNoZWNrem1hZ2ljID09IDEpIHsgIAotCQkJaWYgKHptYWdpYyhyLCBidWYsIG5iKSA9PSAxKQotCQkJcmV0dXJuOwotCX0KLQotICAgIC8qCi0gICAgICogdHJ5IHRlc3RzIGluIC9ldGMvbWFnaWMgKG9yIHN1cnJvZ2F0ZSBtYWdpYyBmaWxlKQotICAgICAqLwotICAgIGlmIChzb2Z0bWFnaWMociwgYnVmLCBuYikgPT0gMSkKLQlyZXR1cm47Ci0KLSAgICAvKgotICAgICAqIHRyeSBrbm93biBrZXl3b3JkcywgY2hlY2sgZm9yIGFzY2lpLW5lc3MgdG9vLgotICAgICAqLwotICAgIGlmIChhc2NtYWdpYyhyLCBidWYsIG5iKSA9PSAxKQotCXJldHVybjsKLQotICAgIC8qCi0gICAgICogYWJhbmRvbiBob3BlLCBhbGwgeWUgd2hvIHJlbWFpbiBoZXJlCi0gICAgICovCi0gICAgbWFnaWNfcnNsX3B1dHMociwgTUlNRV9CSU5BUllfVU5LTk9XTik7Ci19Ci0KLSNkZWZpbmUgICAgRUFUQUIge3doaWxlIChhcF9pc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAqbCkpICArK2w7fQotCi0vKgotICogYXBwcmVudGljZSAtIGxvYWQgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBtYWdpYyBmaWxlIHIKLSAqICBBUEkgcmVxdWVzdCByZWNvcmQKLSAqLwotc3RhdGljIGludCBhcHByZW50aWNlKHNlcnZlcl9yZWMgKnMsIHBvb2wgKnApCi17Ci0gICAgRklMRSAqZjsKLSAgICBjaGFyIGxpbmVbQlVGU0laICsgMV07Ci0gICAgaW50IGVycnMgPSAwOwotICAgIGludCBsaW5lbm87Ci0jaWYgTUlNRV9NQUdJQ19ERUJVRwotICAgIGludCBydWxlID0gMDsKLSAgICBzdHJ1Y3QgbWFnaWMgKm0sICpwcmV2bTsKLSNlbmRpZgotICAgIGNoYXIgKmZuYW1lOwotCi0gICAgbWFnaWNfc2VydmVyX2NvbmZpZ19yZWMgKmNvbmYgPSAobWFnaWNfc2VydmVyX2NvbmZpZ19yZWMgKikKLQkJICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsICZtaW1lX21hZ2ljX21vZHVsZSk7Ci0KLSAgICBmbmFtZSA9IGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHAsIGNvbmYtPm1hZ2ljZmlsZSk7Ci0gICAgZiA9IGFwX3Bmb3BlbihwLCBmbmFtZSwgInIiKTsKLSAgICBpZiAoZiA9PSBOVUxMKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgcywKLQkJICAgIE1PRE5BTUUgIjogY2FuJ3QgcmVhZCBtYWdpYyBmaWxlICVzIiwgZm5hbWUpOwotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBzZXQgdXAgdGhlIG1hZ2ljIGxpc3QgKGVtcHR5KSAqLwotICAgIGNvbmYtPm1hZ2ljID0gY29uZi0+bGFzdCA9IE5VTEw7Ci0KLSAgICAvKiBwYXJzZSBpdCAqLwotICAgIGZvciAobGluZW5vID0gMTsgZmdldHMobGluZSwgQlVGU0laLCBmKSAhPSBOVUxMOyBsaW5lbm8rKykgewotCWludCB3c19vZmZzZXQ7Ci0KLQkvKiBkZWxldGUgbmV3bGluZSAqLwotCWlmIChsaW5lWzBdKSB7Ci0JICAgIGxpbmVbc3RybGVuKGxpbmUpIC0gMV0gPSAnXDAnOwotCX0KLQotCS8qIHNraXAgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0Jd3Nfb2Zmc2V0ID0gMDsKLQl3aGlsZSAobGluZVt3c19vZmZzZXRdICYmIGFwX2lzc3BhY2UobGluZVt3c19vZmZzZXRdKSkgewotCSAgICB3c19vZmZzZXQrKzsKLQl9Ci0KLQkvKiBza2lwIGJsYW5rIGxpbmVzICovCi0JaWYgKGxpbmVbd3Nfb2Zmc2V0XSA9PSAwKSB7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotCS8qIGNvbW1lbnQsIGRvIG5vdCBwYXJzZSAqLwotCWlmIChsaW5lW3dzX29mZnNldF0gPT0gJyMnKQotCSAgICBjb250aW51ZTsKLQotI2lmIE1JTUVfTUFHSUNfREVCVUcKLQkvKiBpZiB3ZSBnZXQgaGVyZSwgd2UncmUgZ29pbmcgdG8gdXNlIGl0IHNvIGNvdW50IGl0ICovCi0JcnVsZSsrOwotI2VuZGlmCi0KLQkvKiBwYXJzZSBpdCAqLwotCWlmIChwYXJzZShzLCBwLCBsaW5lICsgd3Nfb2Zmc2V0LCBsaW5lbm8pICE9IDApCi0JICAgICsrZXJyczsKLSAgICB9Ci0KLSAgICAodm9pZCkgYXBfcGZjbG9zZShwLCBmKTsKLQotI2lmIE1JTUVfTUFHSUNfREVCVUcKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0RFQlVHLCBzLAotCQlNT0ROQU1FICI6IGFwcHJlbnRpY2UgY29uZj0leCBmaWxlPSVzIG09JXMgbS0+bmV4dD0lcyBsYXN0PSVzIiwKLQkJY29uZiwKLQkJY29uZi0+bWFnaWNmaWxlID8gY29uZi0+bWFnaWNmaWxlIDogIk5VTEwiLAotCQljb25mLT5tYWdpYyA/ICJzZXQiIDogIk5VTEwiLAotCQkoY29uZi0+bWFnaWMgJiYgY29uZi0+bWFnaWMtPm5leHQpID8gInNldCIgOiAiTlVMTCIsCi0JCWNvbmYtPmxhc3QgPyAic2V0IiA6ICJOVUxMIik7Ci0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19ERUJVRywgcywKLQkJTU9ETkFNRSAiOiBhcHByZW50aWNlIHJlYWQgJWQgbGluZXMsICVkIHJ1bGVzLCAlZCBlcnJvcnMiLAotCQlsaW5lbm8sIHJ1bGUsIGVycnMpOwotI2VuZGlmCi0KLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0gICAgcHJldm0gPSAwOwotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIHMsCi0JCU1PRE5BTUUgIjogYXBwcmVudGljZSB0ZXN0Iik7Ci0gICAgZm9yIChtID0gY29uZi0+bWFnaWM7IG07IG0gPSBtLT5uZXh0KSB7Ci0JaWYgKGFwX2lzcHJpbnQoKCgodW5zaWduZWQgbG9uZykgbSkgPj4gMjQpICYgMjU1KSAmJgotCSAgICBhcF9pc3ByaW50KCgoKHVuc2lnbmVkIGxvbmcpIG0pID4+IDE2KSAmIDI1NSkgJiYKLQkgICAgYXBfaXNwcmludCgoKCh1bnNpZ25lZCBsb25nKSBtKSA+PiA4KSAmIDI1NSkgJiYKLQkgICAgYXBfaXNwcmludCgoKHVuc2lnbmVkIGxvbmcpIG0pICYgMjU1KSkgewotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0RFQlVHLCBzLAotCQkJTU9ETkFNRSAiOiBhcHByZW50aWNlOiBQT0lOVEVSIENMT0JCRVJFRCEgIgotCQkJIm09XCIlYyVjJWMlY1wiIGxpbmU9JWQiLAotCQkJKCgodW5zaWduZWQgbG9uZykgbSkgPj4gMjQpICYgMjU1LAotCQkJKCgodW5zaWduZWQgbG9uZykgbSkgPj4gMTYpICYgMjU1LAotCQkJKCgodW5zaWduZWQgbG9uZykgbSkgPj4gOCkgJiAyNTUsCi0JCQkoKHVuc2lnbmVkIGxvbmcpIG0pICYgMjU1LAotCQkJcHJldm0gPyBwcmV2bS0+bGluZW5vIDogLTEpOwotCSAgICBicmVhazsKLQl9Ci0JcHJldm0gPSBtOwotICAgIH0KLSNlbmRpZgotCi0gICAgcmV0dXJuIChlcnJzID8gLTEgOiAwKTsKLX0KLQotLyoKLSAqIGV4dGVuZCB0aGUgc2lnbiBiaXQgaWYgdGhlIGNvbXBhcmlzb24gaXMgdG8gYmUgc2lnbmVkCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNpZ25leHRlbmQoc2VydmVyX3JlYyAqcywgc3RydWN0IG1hZ2ljICptLCB1bnNpZ25lZCBsb25nIHYpCi17Ci0gICAgaWYgKCEobS0+ZmxhZyAmIFVOU0lHTkVEKSkKLQlzd2l0Y2ggKG0tPnR5cGUpIHsKLQkgICAgLyoKLQkgICAgICogRG8gbm90IHJlbW92ZSB0aGUgY2FzdHMgYmVsb3cuICBUaGV5IGFyZSB2aXRhbC4gV2hlbiBsYXRlcgotCSAgICAgKiBjb21wYXJlZCB3aXRoIHRoZSBkYXRhLCB0aGUgc2lnbiBleHRlbnNpb24gbXVzdCBoYXZlIGhhcHBlbmVkLgotCSAgICAgKi8KLQljYXNlIEJZVEU6Ci0JICAgIHYgPSAoY2hhcikgdjsKLQkgICAgYnJlYWs7Ci0JY2FzZSBTSE9SVDoKLQljYXNlIEJFU0hPUlQ6Ci0JY2FzZSBMRVNIT1JUOgotCSAgICB2ID0gKHNob3J0KSB2OwotCSAgICBicmVhazsKLQljYXNlIERBVEU6Ci0JY2FzZSBCRURBVEU6Ci0JY2FzZSBMRURBVEU6Ci0JY2FzZSBMT05HOgotCWNhc2UgQkVMT05HOgotCWNhc2UgTEVMT05HOgotCSAgICB2ID0gKGxvbmcpIHY7Ci0JICAgIGJyZWFrOwotCWNhc2UgU1RSSU5HOgotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0VSUiwgcywKLQkJCU1PRE5BTUUgIjogY2FuJ3QgaGFwcGVuOiBtLT50eXBlPSVkIiwgbS0+dHlwZSk7Ci0JICAgIHJldHVybiAtMTsKLQl9Ci0gICAgcmV0dXJuIHY7Ci19Ci0KLS8qCi0gKiBwYXJzZSBvbmUgbGluZSBmcm9tIG1hZ2ljIGZpbGUsIHB1dCBpbnRvIG1hZ2ljW2luZGV4KytdIGlmIHZhbGlkCi0gKi8KLXN0YXRpYyBpbnQgcGFyc2Uoc2VydmVyX3JlYyAqc2VydiwgcG9vbCAqcCwgY2hhciAqbCwgaW50IGxpbmVubykKLXsKLSAgICBzdHJ1Y3QgbWFnaWMgKm07Ci0gICAgY2hhciAqdCwgKnM7Ci0gICAgbWFnaWNfc2VydmVyX2NvbmZpZ19yZWMgKmNvbmYgPSAobWFnaWNfc2VydmVyX2NvbmZpZ19yZWMgKikKLQkJICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKHNlcnYtPm1vZHVsZV9jb25maWcsICZtaW1lX21hZ2ljX21vZHVsZSk7Ci0KLSAgICAvKiBhbGxvY2F0ZSBtYWdpYyBzdHJ1Y3R1cmUgZW50cnkgKi8KLSAgICBtID0gKHN0cnVjdCBtYWdpYyAqKSBhcF9wY2FsbG9jKHAsIHNpemVvZihzdHJ1Y3QgbWFnaWMpKTsKLQotICAgIC8qIGFwcGVuZCB0byBsaW5rZWQgbGlzdCAqLwotICAgIG0tPm5leHQgPSBOVUxMOwotICAgIGlmICghY29uZi0+bWFnaWMgfHwgIWNvbmYtPmxhc3QpIHsKLQljb25mLT5tYWdpYyA9IGNvbmYtPmxhc3QgPSBtOwotICAgIH0KLSAgICBlbHNlIHsKLQljb25mLT5sYXN0LT5uZXh0ID0gbTsKLQljb25mLT5sYXN0ID0gbTsKLSAgICB9Ci0KLSAgICAvKiBzZXQgdmFsdWVzIGluIG1hZ2ljIHN0cnVjdHVyZSAqLwotICAgIG0tPmZsYWcgPSAwOwotICAgIG0tPmNvbnRfbGV2ZWwgPSAwOwotICAgIG0tPmxpbmVubyA9IGxpbmVubzsKLQotICAgIHdoaWxlICgqbCA9PSAnPicpIHsKLQkrK2w7CQkJLyogc3RlcCBvdmVyICovCi0JbS0+Y29udF9sZXZlbCsrOwotICAgIH0KLQotICAgIGlmIChtLT5jb250X2xldmVsICE9IDAgJiYgKmwgPT0gJygnKSB7Ci0JKytsOwkJCS8qIHN0ZXAgb3ZlciAqLwotCW0tPmZsYWcgfD0gSU5ESVI7Ci0gICAgfQotCi0gICAgLyogZ2V0IG9mZnNldCwgdGhlbiBza2lwIG92ZXIgaXQgKi8KLSAgICBtLT5vZmZzZXQgPSAoaW50KSBzdHJ0b2wobCwgJnQsIDApOwotICAgIGlmIChsID09IHQpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0VSUiwgc2VydiwKLQkJICAgIE1PRE5BTUUgIjogb2Zmc2V0ICVzIGludmFsaWQiLCBsKTsKLSAgICB9Ci0gICAgbCA9IHQ7Ci0KLSAgICBpZiAobS0+ZmxhZyAmIElORElSKSB7Ci0JbS0+aW4udHlwZSA9IExPTkc7Ci0JbS0+aW4ub2Zmc2V0ID0gMDsKLQkvKgotCSAqIHJlYWQgWy5sYnNdWystXW5ubm5uKQotCSAqLwotCWlmICgqbCA9PSAnLicpIHsKLQkgICAgc3dpdGNoICgqKytsKSB7Ci0JICAgIGNhc2UgJ2wnOgotCQltLT5pbi50eXBlID0gTE9ORzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgJ3MnOgotCQltLT5pbi50eXBlID0gU0hPUlQ7Ci0JCWJyZWFrOwotCSAgICBjYXNlICdiJzoKLQkJbS0+aW4udHlwZSA9IEJZVEU7Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0VSUiwgc2VydiwKLQkJCU1PRE5BTUUgIjogaW5kaXJlY3Qgb2Zmc2V0IHR5cGUgJWMgaW52YWxpZCIsICpsKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgbCsrOwotCX0KLQlzID0gbDsKLQlpZiAoKmwgPT0gJysnIHx8ICpsID09ICctJykKLQkgICAgbCsrOwotCWlmIChhcF9pc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSAqbCkpIHsKLQkgICAgbS0+aW4ub2Zmc2V0ID0gc3RydG9sKGwsICZ0LCAwKTsKLQkgICAgaWYgKCpzID09ICctJykKLQkJbS0+aW4ub2Zmc2V0ID0gLW0tPmluLm9mZnNldDsKLQl9Ci0JZWxzZQotCSAgICB0ID0gbDsKLQlpZiAoKnQrKyAhPSAnKScpIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19FUlIsIHNlcnYsCi0JCQlNT0ROQU1FICI6IG1pc3NpbmcgJyknIGluIGluZGlyZWN0IG9mZnNldCIpOwotCX0KLQlsID0gdDsKLSAgICB9Ci0KLQotICAgIHdoaWxlIChhcF9pc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSAqbCkpCi0JKytsOwotICAgIEVBVEFCOwotCi0jZGVmaW5lIE5CWVRFICAgICAgICAgICA0Ci0jZGVmaW5lIE5TSE9SVCAgICAgICAgICA1Ci0jZGVmaW5lIE5MT05HICAgICAgICAgICA0Ci0jZGVmaW5lIE5TVFJJTkcgICAgICAgICA2Ci0jZGVmaW5lIE5EQVRFICAgICAgICAgICA0Ci0jZGVmaW5lIE5CRVNIT1JUICAgICAgICA3Ci0jZGVmaW5lIE5CRUxPTkcgICAgICAgICA2Ci0jZGVmaW5lIE5CRURBVEUgICAgICAgICA2Ci0jZGVmaW5lIE5MRVNIT1JUICAgICAgICA3Ci0jZGVmaW5lIE5MRUxPTkcgICAgICAgICA2Ci0jZGVmaW5lIE5MRURBVEUgICAgICAgICA2Ci0KLSAgICBpZiAoKmwgPT0gJ3UnKSB7Ci0JKytsOwotCW0tPmZsYWcgfD0gVU5TSUdORUQ7Ci0gICAgfQotCi0gICAgLyogZ2V0IHR5cGUsIHNraXAgaXQgKi8KLSAgICBpZiAoc3RybmNtcChsLCAiYnl0ZSIsIE5CWVRFKSA9PSAwKSB7Ci0JbS0+dHlwZSA9IEJZVEU7Ci0JbCArPSBOQllURTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RybmNtcChsLCAic2hvcnQiLCBOU0hPUlQpID09IDApIHsKLQltLT50eXBlID0gU0hPUlQ7Ci0JbCArPSBOU0hPUlQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cm5jbXAobCwgImxvbmciLCBOTE9ORykgPT0gMCkgewotCW0tPnR5cGUgPSBMT05HOwotCWwgKz0gTkxPTkc7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cm5jbXAobCwgInN0cmluZyIsIE5TVFJJTkcpID09IDApIHsKLQltLT50eXBlID0gU1RSSU5HOwotCWwgKz0gTlNUUklORzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RybmNtcChsLCAiZGF0ZSIsIE5EQVRFKSA9PSAwKSB7Ci0JbS0+dHlwZSA9IERBVEU7Ci0JbCArPSBOREFURTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RybmNtcChsLCAiYmVzaG9ydCIsIE5CRVNIT1JUKSA9PSAwKSB7Ci0JbS0+dHlwZSA9IEJFU0hPUlQ7Ci0JbCArPSBOQkVTSE9SVDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RybmNtcChsLCAiYmVsb25nIiwgTkJFTE9ORykgPT0gMCkgewotCW0tPnR5cGUgPSBCRUxPTkc7Ci0JbCArPSBOQkVMT05HOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJuY21wKGwsICJiZWRhdGUiLCBOQkVEQVRFKSA9PSAwKSB7Ci0JbS0+dHlwZSA9IEJFREFURTsKLQlsICs9IE5CRURBVEU7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cm5jbXAobCwgImxlc2hvcnQiLCBOTEVTSE9SVCkgPT0gMCkgewotCW0tPnR5cGUgPSBMRVNIT1JUOwotCWwgKz0gTkxFU0hPUlQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cm5jbXAobCwgImxlbG9uZyIsIE5MRUxPTkcpID09IDApIHsKLQltLT50eXBlID0gTEVMT05HOwotCWwgKz0gTkxFTE9ORzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RybmNtcChsLCAibGVkYXRlIiwgTkxFREFURSkgPT0gMCkgewotCW0tPnR5cGUgPSBMRURBVEU7Ci0JbCArPSBOTEVEQVRFOwotICAgIH0KLSAgICBlbHNlIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0VSUiwgc2VydiwKLQkJICAgIE1PRE5BTUUgIjogdHlwZSAlcyBpbnZhbGlkIiwgbCk7Ci0JcmV0dXJuIC0xOwotICAgIH0KLSAgICAvKiBOZXctc3R5bGUgYW5kaW5nOiAiMCBieXRlJjB4ODAgPTB4ODAgZHluYW1pY2FsbHkgbGlua2VkIiAqLwotICAgIGlmICgqbCA9PSAnJicpIHsKLQkrK2w7Ci0JbS0+bWFzayA9IHNpZ25leHRlbmQoc2VydiwgbSwgc3RydG9sKGwsICZsLCAwKSk7Ci0gICAgfQotICAgIGVsc2UKLQltLT5tYXNrID0gfjBMOwotICAgIEVBVEFCOwotCi0gICAgc3dpdGNoICgqbCkgewotICAgIGNhc2UgJz4nOgotICAgIGNhc2UgJzwnOgotCS8qIE9sZC1zdHlsZSBhbmRpbmc6ICIwIGJ5dGUgJjB4ODAgZHluYW1pY2FsbHkgbGlua2VkIiAqLwotICAgIGNhc2UgJyYnOgotICAgIGNhc2UgJ14nOgotICAgIGNhc2UgJz0nOgotCW0tPnJlbG4gPSAqbDsKLQkrK2w7Ci0JYnJlYWs7Ci0gICAgY2FzZSAnISc6Ci0JaWYgKG0tPnR5cGUgIT0gU1RSSU5HKSB7Ci0JICAgIG0tPnJlbG4gPSAqbDsKLQkgICAgKytsOwotCSAgICBicmVhazsKLQl9Ci0JLyogRkFMTCBUSFJPVUdIICovCi0gICAgZGVmYXVsdDoKLQlpZiAoKmwgPT0gJ3gnICYmIGFwX2lzc3BhY2UoKHVuc2lnbmVkIGNoYXIpIGxbMV0pKSB7Ci0JICAgIG0tPnJlbG4gPSAqbDsKLQkgICAgKytsOwotCSAgICBnb3RvIEdldERlc2M7CS8qIEJpbGwgVGhlIENhdCAqLwotCX0KLQltLT5yZWxuID0gJz0nOwotCWJyZWFrOwotICAgIH0KLSAgICBFQVRBQjsKLQotICAgIGlmIChnZXR2YWx1ZShzZXJ2LCBtLCAmbCkpCi0JcmV0dXJuIC0xOwotICAgIC8qCi0gICAgICogbm93IGdldCBsYXN0IHBhcnQgLSB0aGUgZGVzY3JpcHRpb24KLSAgICAgKi8KLSAgR2V0RGVzYzoKLSAgICBFQVRBQjsKLSAgICBpZiAobFswXSA9PSAnXGInKSB7Ci0JKytsOwotCW0tPm5vc3BmbGFnID0gMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKGxbMF0gPT0gJ1xcJykgJiYgKGxbMV0gPT0gJ2InKSkgewotCSsrbDsKLQkrK2w7Ci0JbS0+bm9zcGZsYWcgPSAxOwotICAgIH0KLSAgICBlbHNlCi0JbS0+bm9zcGZsYWcgPSAwOwotICAgIHN0cm5jcHkobS0+ZGVzYywgbCwgc2l6ZW9mKG0tPmRlc2MpIC0gMSk7Ci0gICAgbS0+ZGVzY1tzaXplb2YobS0+ZGVzYykgLSAxXSA9ICdcMCc7Ci0KLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19ERUJVRywgc2VydiwKLQkJTU9ETkFNRSAiOiBwYXJzZSBsaW5lPSVkIG09JXggbmV4dD0leCBjb250PSVkIGRlc2M9JXMiLAotCQlsaW5lbm8sIG0sIG0tPm5leHQsIG0tPmNvbnRfbGV2ZWwsIG0tPmRlc2MpOwotI2VuZGlmIC8qIE1JTUVfTUFHSUNfREVCVUcgKi8KLQotICAgIHJldHVybiAwOwotfQotCi0vKgotICogUmVhZCBhIG51bWVyaWMgdmFsdWUgZnJvbSBhIHBvaW50ZXIsIGludG8gdGhlIHZhbHVlIHVuaW9uIG9mIGEgbWFnaWMKLSAqIHBvaW50ZXIsIGFjY29yZGluZyB0byB0aGUgbWFnaWMgdHlwZS4gIFVwZGF0ZSB0aGUgc3RyaW5nIHBvaW50ZXIgdG8gcG9pbnQKLSAqIGp1c3QgYWZ0ZXIgdGhlIG51bWJlciByZWFkLiAgUmV0dXJuIDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlLgotICovCi1zdGF0aWMgaW50IGdldHZhbHVlKHNlcnZlcl9yZWMgKnMsIHN0cnVjdCBtYWdpYyAqbSwgY2hhciAqKnApCi17Ci0gICAgaW50IHNsZW47Ci0KLSAgICBpZiAobS0+dHlwZSA9PSBTVFJJTkcpIHsKLQkqcCA9IGdldHN0cihzLCAqcCwgbS0+dmFsdWUucywgc2l6ZW9mKG0tPnZhbHVlLnMpLCAmc2xlbik7Ci0JbS0+dmFsbGVuID0gc2xlbjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobS0+cmVsbiAhPSAneCcpCi0JbS0+dmFsdWUubCA9IHNpZ25leHRlbmQocywgbSwgc3RydG9sKCpwLCBwLCAwKSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IGEgc3RyaW5nIGNvbnRhaW5pbmcgQyBjaGFyYWN0ZXIgZXNjYXBlcy4gIFN0b3AgYXQgYW4gdW5lc2NhcGVkCi0gKiBzcGFjZSBvciB0YWIuIENvcHkgdGhlIGNvbnZlcnRlZCB2ZXJzaW9uIHRvICJwIiwgcmV0dXJuaW5nIGl0cyBsZW5ndGggaW4KLSAqICpzbGVuLiBSZXR1cm4gdXBkYXRlZCBzY2FuIHBvaW50ZXIgYXMgZnVuY3Rpb24gcmVzdWx0LgotICovCi1zdGF0aWMgY2hhciAqZ2V0c3RyKHNlcnZlcl9yZWMgKnNlcnYsIHJlZ2lzdGVyIGNoYXIgKnMsIHJlZ2lzdGVyIGNoYXIgKnAsCi0JCSAgICBpbnQgcGxlbiwgaW50ICpzbGVuKQotewotICAgIGNoYXIgKm9yaWdzID0gcywgKm9yaWdwID0gcDsKLSAgICBjaGFyICpwbWF4ID0gcCArIHBsZW4gLSAxOwotICAgIHJlZ2lzdGVyIGludCBjOwotICAgIHJlZ2lzdGVyIGludCB2YWw7Ci0KLSAgICB3aGlsZSAoKGMgPSAqcysrKSAhPSAnXDAnKSB7Ci0JaWYgKGFwX2lzc3BhY2UoKHVuc2lnbmVkIGNoYXIpIGMpKQotCSAgICBicmVhazsKLQlpZiAocCA+PSBwbWF4KSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfRVJSLCBzZXJ2LAotCQkJTU9ETkFNRSAiOiBzdHJpbmcgdG9vIGxvbmc6ICVzIiwgb3JpZ3MpOwotCSAgICBicmVhazsKLQl9Ci0JaWYgKGMgPT0gJ1xcJykgewotCSAgICBzd2l0Y2ggKGMgPSAqcysrKSB7Ci0KLQkgICAgY2FzZSAnXDAnOgotCQlnb3RvIG91dDsKLQotCSAgICBkZWZhdWx0OgotCQkqcCsrID0gKGNoYXIpIGM7Ci0JCWJyZWFrOwotCi0JICAgIGNhc2UgJ24nOgotCQkqcCsrID0gJ1xuJzsKLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSAncic6Ci0JCSpwKysgPSAnXHInOwotCQlicmVhazsKLQotCSAgICBjYXNlICdiJzoKLQkJKnArKyA9ICdcYic7Ci0JCWJyZWFrOwotCi0JICAgIGNhc2UgJ3QnOgotCQkqcCsrID0gJ1x0JzsKLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSAnZic6Ci0JCSpwKysgPSAnXGYnOwotCQlicmVhazsKLQotCSAgICBjYXNlICd2JzoKLQkJKnArKyA9ICdcdic7Ci0JCWJyZWFrOwotCi0JCS8qIFwgYW5kIHVwIHRvIDMgb2N0YWwgZGlnaXRzICovCi0JICAgIGNhc2UgJzAnOgotCSAgICBjYXNlICcxJzoKLQkgICAgY2FzZSAnMic6Ci0JICAgIGNhc2UgJzMnOgotCSAgICBjYXNlICc0JzoKLQkgICAgY2FzZSAnNSc6Ci0JICAgIGNhc2UgJzYnOgotCSAgICBjYXNlICc3JzoKLQkJdmFsID0gYyAtICcwJzsKLQkJYyA9ICpzKys7CS8qIHRyeSBmb3IgMiAqLwotCQlpZiAoYyA+PSAnMCcgJiYgYyA8PSAnNycpIHsKLQkJICAgIHZhbCA9ICh2YWwgPDwgMykgfCAoYyAtICcwJyk7Ci0JCSAgICBjID0gKnMrKzsJLyogdHJ5IGZvciAzICovCi0JCSAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnNycpCi0JCQl2YWwgPSAodmFsIDw8IDMpIHwgKGMgLSAnMCcpOwotCQkgICAgZWxzZQotCQkJLS1zOwotCQl9Ci0JCWVsc2UKLQkJICAgIC0tczsKLQkJKnArKyA9IChjaGFyKSB2YWw7Ci0JCWJyZWFrOwotCi0JCS8qIFx4IGFuZCB1cCB0byAzIGhleCBkaWdpdHMgKi8KLQkgICAgY2FzZSAneCc6Ci0JCXZhbCA9ICd4JzsJLyogRGVmYXVsdCBpZiBubyBkaWdpdHMgKi8KLQkJYyA9IGhleHRvaW50KCpzKyspOwkvKiBHZXQgbmV4dCBjaGFyICovCi0JCWlmIChjID49IDApIHsKLQkJICAgIHZhbCA9IGM7Ci0JCSAgICBjID0gaGV4dG9pbnQoKnMrKyk7Ci0JCSAgICBpZiAoYyA+PSAwKSB7Ci0JCQl2YWwgPSAodmFsIDw8IDQpICsgYzsKLQkJCWMgPSBoZXh0b2ludCgqcysrKTsKLQkJCWlmIChjID49IDApIHsKLQkJCSAgICB2YWwgPSAodmFsIDw8IDQpICsgYzsKLQkJCX0KLQkJCWVsc2UKLQkJCSAgICAtLXM7Ci0JCSAgICB9Ci0JCSAgICBlbHNlCi0JCQktLXM7Ci0JCX0KLQkJZWxzZQotCQkgICAgLS1zOwotCQkqcCsrID0gKGNoYXIpIHZhbDsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0JZWxzZQotCSAgICAqcCsrID0gKGNoYXIpIGM7Ci0gICAgfQotICBvdXQ6Ci0gICAgKnAgPSAnXDAnOwotICAgICpzbGVuID0gcCAtIG9yaWdwOwotICAgIHJldHVybiBzOwotfQotCi0KLS8qIFNpbmdsZSBoZXggY2hhciB0byBpbnQ7IC0xIGlmIG5vdCBhIGhleCBjaGFyLiAqLwotc3RhdGljIGludCBoZXh0b2ludChpbnQgYykKLXsKLSAgICBpZiAoYXBfaXNkaWdpdCgodW5zaWduZWQgY2hhcikgYykpCi0JcmV0dXJuIGMgLSAnMCc7Ci0gICAgaWYgKChjID49ICdhJykgJiYgKGMgPD0gJ2YnKSkKLQlyZXR1cm4gYyArIDEwIC0gJ2EnOwotICAgIGlmICgoYyA+PSAnQScpICYmIChjIDw9ICdGJykpCi0JcmV0dXJuIGMgKyAxMCAtICdBJzsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLQotLyoKLSAqIHJldHVybiBET05FIHRvIGluZGljYXRlIGl0J3MgYmVlbiBoYW5kbGVkCi0gKiByZXR1cm4gT0sgdG8gaW5kaWNhdGUgaXQncyBhIHJlZ3VsYXIgZmlsZSBzdGlsbCBuZWVkaW5nIGhhbmRsaW5nCi0gKiBvdGhlciByZXR1cm5zIGluZGljYXRlIGEgZmFpbHVyZSBvZiBzb21lIHNvcnQKLSAqLwotc3RhdGljIGludCBmc21hZ2ljKHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICpmbikKLXsKLSAgICBzd2l0Y2ggKHItPmZpbmZvLnN0X21vZGUgJiBTX0lGTVQpIHsKLSAgICBjYXNlIFNfSUZESVI6Ci0JbWFnaWNfcnNsX3B1dHMociwgRElSX01BR0lDX1RZUEUpOwotCXJldHVybiBET05FOwotICAgIGNhc2UgU19JRkNIUjoKLQkvKgotCSAqICh2b2lkKSBtYWdpY19yc2xfcHJpbnRmKHIsImNoYXJhY3RlciBzcGVjaWFsICglZC8lZCkiLAotCSAqIG1ham9yKHNiLT5zdF9yZGV2KSwgbWlub3Ioc2ItPnN0X3JkZXYpKTsKLQkgKi8KLQkodm9pZCkgbWFnaWNfcnNsX3B1dHMociwgTUlNRV9CSU5BUllfVU5LTk9XTik7Ci0JcmV0dXJuIERPTkU7Ci0jaWZkZWYgU19JRkJMSwotICAgIGNhc2UgU19JRkJMSzoKLQkvKgotCSAqICh2b2lkKSBtYWdpY19yc2xfcHJpbnRmKHIsImJsb2NrIHNwZWNpYWwgKCVkLyVkKSIsCi0JICogbWFqb3Ioc2ItPnN0X3JkZXYpLCBtaW5vcihzYi0+c3RfcmRldikpOwotCSAqLwotCSh2b2lkKSBtYWdpY19yc2xfcHV0cyhyLCBNSU1FX0JJTkFSWV9VTktOT1dOKTsKLQlyZXR1cm4gRE9ORTsKLQkvKiBUT0RPIGFkZCBjb2RlIHRvIGhhbmRsZSBWNyBNVVggYW5kIEJsaXQgTVVYIGZpbGVzICovCi0jZW5kaWYKLSNpZmRlZiAgICBTX0lGSUZPCi0gICAgY2FzZSBTX0lGSUZPOgotCS8qCi0JICogbWFnaWNfcnNsX3B1dHMociwiZmlmbyAobmFtZWQgcGlwZSkiKTsKLQkgKi8KLQkodm9pZCkgbWFnaWNfcnNsX3B1dHMociwgTUlNRV9CSU5BUllfVU5LTk9XTik7Ci0JcmV0dXJuIERPTkU7Ci0jZW5kaWYKLSNpZmRlZiAgICBTX0lGTE5LCi0gICAgY2FzZSBTX0lGTE5LOgotCS8qIFdlIHVzZWQgc3RhdCgpLCB0aGUgb25seSBwb3NzaWJsZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB0aGUKLQkgKiBzeW1saW5rIGlzIGJyb2tlbi4KLQkgKi8KLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19FUlIsIHIsCi0JCSAgICBNT0ROQU1FICI6IGJyb2tlbiBzeW1saW5rICglcykiLCBmbik7Ci0JcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotI2VuZGlmCi0jaWZkZWYgICAgU19JRlNPQ0sKLSNpZm5kZWYgX19DT0hFUkVOVF9fCi0gICAgY2FzZSBTX0lGU09DSzoKLQltYWdpY19yc2xfcHV0cyhyLCBNSU1FX0JJTkFSWV9VTktOT1dOKTsKLQlyZXR1cm4gRE9ORTsKLSNlbmRpZgotI2VuZGlmCi0gICAgY2FzZSBTX0lGUkVHOgotCWJyZWFrOwotICAgIGRlZmF1bHQ6Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfRVJSLCByLAotCQkgICAgTU9ETkFNRSAiOiBpbnZhbGlkIG1vZGUgMCVvLiIsICh1bnNpZ25lZCBpbnQpci0+ZmluZm8uc3RfbW9kZSk7Ci0JcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgIH0KLQotICAgIC8qCi0gICAgICogcmVndWxhciBmaWxlLCBjaGVjayBuZXh0IHBvc3NpYmlsaXR5Ci0gICAgICovCi0gICAgaWYgKHItPmZpbmZvLnN0X3NpemUgPT0gMCkgewotCW1hZ2ljX3JzbF9wdXRzKHIsIE1JTUVfVEVYVF9VTktOT1dOKTsKLQlyZXR1cm4gRE9ORTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vKgotICogc29mdG1hZ2ljIC0gbG9va3VwIG9uZSBmaWxlIGluIGRhdGFiYXNlIChhbHJlYWR5IHJlYWQgZnJvbSAvZXRjL21hZ2ljIGJ5Ci0gKiBhcHByZW50aWNlLmMpLiBQYXNzZWQgdGhlIG5hbWUgYW5kIEZJTEUgKiBvZiBvbmUgZmlsZSB0byBiZSB0eXBlZC4KLSAqLwotCQkvKiBBUkdTVVNFRDEgKi8vKiBuYnl0ZXMgcGFzc2VkIGZvciByZWd1bGFyaXR5LCBtYXliZSBuZWVkIGxhdGVyICovCi1zdGF0aWMgaW50IHNvZnRtYWdpYyhyZXF1ZXN0X3JlYyAqciwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbmJ5dGVzKQotewotICAgIGlmIChtYXRjaChyLCBidWYsIG5ieXRlcykpCi0JcmV0dXJuIDE7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIEdvIHRocm91Z2ggdGhlIHdob2xlIGxpc3QsIHN0b3BwaW5nIGlmIHlvdSBmaW5kIGEgbWF0Y2guICBQcm9jZXNzIGFsbCB0aGUKLSAqIGNvbnRpbnVhdGlvbnMgb2YgdGhhdCBtYXRjaCBiZWZvcmUgcmV0dXJuaW5nLgotICoKLSAqIFdlIHN1cHBvcnQgbXVsdGktbGV2ZWwgY29udGludWF0aW9uczoKLSAqCi0gKiBBdCBhbnkgdGltZSB3aGVuIHByb2Nlc3NpbmcgYSBzdWNjZXNzZnVsIHRvcC1sZXZlbCBtYXRjaCwgdGhlcmUgaXMgYSBjdXJyZW50Ci0gKiBjb250aW51YXRpb24gbGV2ZWw7IGl0IHJlcHJlc2VudHMgdGhlIGxldmVsIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWxseQotICogbWF0Y2hlZCBjb250aW51YXRpb24uCi0gKgotICogQ29udGludWF0aW9ucyBhYm92ZSB0aGF0IGxldmVsIGFyZSBza2lwcGVkIGFzLCBpZiB3ZSBzZWUgb25lLCBpdCBtZWFucyB0aGF0Ci0gKiB0aGUgY29udGludWF0aW9uIHRoYXQgY29udHJvbHMgdGhlbSAtIGkuZSwgdGhlIGxvd2VyLWxldmVsIGNvbnRpbnVhdGlvbgotICogcHJlY2VkaW5nIHRoZW0gLSBmYWlsZWQgdG8gbWF0Y2guCi0gKgotICogQ29udGludWF0aW9ucyBiZWxvdyB0aGF0IGxldmVsIGFyZSBwcm9jZXNzZWQgYXMsIGlmIHdlIHNlZSBvbmUsIGl0IG1lYW5zCi0gKiB3ZSd2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nIG9yIHNraXBwaW5nIGhpZ2hlci1sZXZlbCBjb250aW51YXRpb25zIHVuZGVyIHRoZQotICogY29udHJvbCBvZiBhIHN1Y2Nlc3NmdWwgb3IgdW5zdWNjZXNzZnVsIGxvd2VyLWxldmVsIGNvbnRpbnVhdGlvbiwgYW5kIGFyZQotICogbm93IHNlZWluZyB0aGUgbmV4dCBsb3dlci1sZXZlbCBjb250aW51YXRpb24gYW5kIHNob3VsZCBwcm9jZXNzIGl0LiAgVGhlCi0gKiBjdXJyZW50IGNvbnRpbnVhdGlvbiBsZXZlbCByZXZlcnRzIHRvIHRoZSBsZXZlbCBvZiB0aGUgb25lIHdlJ3JlIHNlZWluZy4KLSAqCi0gKiBDb250aW51YXRpb25zIGF0IHRoZSBjdXJyZW50IGxldmVsIGFyZSBwcm9jZXNzZWQgYXMsIGlmIHdlIHNlZSBvbmUsIHRoZXJlJ3MKLSAqIG5vIGxvd2VyLWxldmVsIGNvbnRpbnVhdGlvbiB0aGF0IG1heSBoYXZlIGZhaWxlZC4KLSAqCi0gKiBJZiBhIGNvbnRpbnVhdGlvbiBtYXRjaGVzLCB3ZSBidW1wIHRoZSBjdXJyZW50IGNvbnRpbnVhdGlvbiBsZXZlbCBzbyB0aGF0Ci0gKiBoaWdoZXItbGV2ZWwgY29udGludWF0aW9ucyBhcmUgcHJvY2Vzc2VkLgotICovCi1zdGF0aWMgaW50IG1hdGNoKHJlcXVlc3RfcmVjICpyLCB1bnNpZ25lZCBjaGFyICpzLCBpbnQgbmJ5dGVzKQotewotI2lmIE1JTUVfTUFHSUNfREVCVUcKLSAgICBpbnQgcnVsZV9jb3VudGVyID0gMDsKLSNlbmRpZgotICAgIGludCBjb250X2xldmVsID0gMDsKLSAgICBpbnQgbmVlZF9zZXBhcmF0b3IgPSAwOwotICAgIHVuaW9uIFZBTFVFVFlQRSBwOwotICAgIG1hZ2ljX3NlcnZlcl9jb25maWdfcmVjICpjb25mID0gKG1hZ2ljX3NlcnZlcl9jb25maWdfcmVjICopCi0JCWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgJm1pbWVfbWFnaWNfbW9kdWxlKTsKLSAgICBzdHJ1Y3QgbWFnaWMgKm07Ci0KLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0gICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIHIsCi0JCU1PRE5BTUUgIjogbWF0Y2ggY29uZj0leCBmaWxlPSVzIG09JXMgbS0+bmV4dD0lcyBsYXN0PSVzIiwKLQkJY29uZiwKLQkJY29uZi0+bWFnaWNmaWxlID8gY29uZi0+bWFnaWNmaWxlIDogIk5VTEwiLAotCQljb25mLT5tYWdpYyA/ICJzZXQiIDogIk5VTEwiLAotCQkoY29uZi0+bWFnaWMgJiYgY29uZi0+bWFnaWMtPm5leHQpID8gInNldCIgOiAiTlVMTCIsCi0JCWNvbmYtPmxhc3QgPyAic2V0IiA6ICJOVUxMIik7Ci0jZW5kaWYKLQotI2lmIE1JTUVfTUFHSUNfREVCVUcKLSAgICBmb3IgKG0gPSBjb25mLT5tYWdpYzsgbTsgbSA9IG0tPm5leHQpIHsKLQlpZiAoYXBfaXNwcmludCgoKCh1bnNpZ25lZCBsb25nKSBtKSA+PiAyNCkgJiAyNTUpICYmCi0JICAgIGFwX2lzcHJpbnQoKCgodW5zaWduZWQgbG9uZykgbSkgPj4gMTYpICYgMjU1KSAmJgotCSAgICBhcF9pc3ByaW50KCgoKHVuc2lnbmVkIGxvbmcpIG0pID4+IDgpICYgMjU1KSAmJgotCSAgICBhcF9pc3ByaW50KCgodW5zaWduZWQgbG9uZykgbSkgJiAyNTUpKSB7Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0RFQlVHLCByLAotCQkJTU9ETkFNRSAiOiBtYXRjaDogUE9JTlRFUiBDTE9CQkVSRUQhICIKLQkJCSJtPVwiJWMlYyVjJWNcIiIsCi0JCQkoKCh1bnNpZ25lZCBsb25nKSBtKSA+PiAyNCkgJiAyNTUsCi0JCQkoKCh1bnNpZ25lZCBsb25nKSBtKSA+PiAxNikgJiAyNTUsCi0JCQkoKCh1bnNpZ25lZCBsb25nKSBtKSA+PiA4KSAmIDI1NSwKLQkJCSgodW5zaWduZWQgbG9uZykgbSkgJiAyNTUpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmCi0KLSAgICBmb3IgKG0gPSBjb25mLT5tYWdpYzsgbTsgbSA9IG0tPm5leHQpIHsKLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0JcnVsZV9jb3VudGVyKys7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIHIsCi0JCSAgICBNT0ROQU1FICI6IGxpbmU9JWQgZGVzYz0lcyIsIG0tPmxpbmVubywgbS0+ZGVzYyk7Ci0jZW5kaWYKLQotCS8qIGNoZWNrIGlmIG1haW4gZW50cnkgbWF0Y2hlcyAqLwotCWlmICghbWdldChyLCAmcCwgcywgbSwgbmJ5dGVzKSB8fAotCSAgICAhbWNoZWNrKHIsICZwLCBtKSkgewotCSAgICBzdHJ1Y3QgbWFnaWMgKm1fY29udDsKLQotCSAgICAvKgotCSAgICAgKiBtYWluIGVudHJ5IGRpZG4ndCBtYXRjaCwgZmx1c2ggaXRzIGNvbnRpbnVhdGlvbnMKLQkgICAgICovCi0JICAgIGlmICghbS0+bmV4dCB8fCAobS0+bmV4dC0+Y29udF9sZXZlbCA9PSAwKSkgewotCQljb250aW51ZTsKLQkgICAgfQotCi0JICAgIG1fY29udCA9IG0tPm5leHQ7Ci0JICAgIHdoaWxlIChtX2NvbnQgJiYgKG1fY29udC0+Y29udF9sZXZlbCAhPSAwKSkgewotI2lmIE1JTUVfTUFHSUNfREVCVUcKLQkJcnVsZV9jb3VudGVyKys7Ci0JCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0RFQlVHLCByLAotCQkJTU9ETkFNRSAiOiBsaW5lPSVkIG1jPSV4IG1jLT5uZXh0PSV4IGNvbnQ9JWQgZGVzYz0lcyIsCi0JCQkgICAgbV9jb250LT5saW5lbm8sIG1fY29udCwKLQkJCSAgICBtX2NvbnQtPm5leHQsIG1fY29udC0+Y29udF9sZXZlbCwKLQkJCSAgICBtX2NvbnQtPmRlc2MpOwotI2VuZGlmCi0JCS8qCi0JCSAqIHRoaXMgdHJpY2sgYWxsb3dzIHVzIHRvIGtlZXAgKm0gaW4gc3luYyB3aGVuIHRoZSBjb250aW51ZQotCQkgKiBhZHZhbmNlcyB0aGUgcG9pbnRlcgotCQkgKi8KLQkJbSA9IG1fY29udDsKLQkJbV9jb250ID0gbV9jb250LT5uZXh0OwotCSAgICB9Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotCS8qIGlmIHdlIGdldCBoZXJlLCB0aGUgbWFpbiBlbnRyeSBydWxlIHdhcyBhIG1hdGNoICovCi0JLyogdGhpcyB3aWxsIGJlIHRoZSBsYXN0IHJ1biB0aHJvdWdoIHRoZSBsb29wICovCi0jaWYgTUlNRV9NQUdJQ19ERUJVRwotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0RFQlVHLCByLAotCQkgICAgTU9ETkFNRSAiOiBydWxlIG1hdGNoZWQsIGxpbmU9JWQgdHlwZT0lZCAlcyIsCi0JCSAgICBtLT5saW5lbm8sIG0tPnR5cGUsCi0JCSAgICAobS0+dHlwZSA9PSBTVFJJTkcpID8gbS0+dmFsdWUucyA6ICIiKTsKLSNlbmRpZgotCi0JLyogcHJpbnQgdGhlIG1hdGNoICovCi0JbXByaW50KHIsICZwLCBtKTsKLQotCS8qCi0JICogSWYgd2UgcHJpbnRlZCBzb21ldGhpbmcsIHdlJ2xsIG5lZWQgdG8gcHJpbnQgYSBibGFuayBiZWZvcmUgd2UKLQkgKiBwcmludCBzb21ldGhpbmcgZWxzZS4KLQkgKi8KLQlpZiAobS0+ZGVzY1swXSkKLQkgICAgbmVlZF9zZXBhcmF0b3IgPSAxOwotCS8qIGFuZCBhbnkgY29udGludWF0aW9ucyB0aGF0IG1hdGNoICovCi0JY29udF9sZXZlbCsrOwotCS8qCi0JICogd2hpbGUgKG0gJiYgbS0+bmV4dCAmJiBtLT5uZXh0LT5jb250X2xldmVsICE9IDAgJiYgKCBtID0gbS0+bmV4dAotCSAqICkpCi0JICovCi0JbSA9IG0tPm5leHQ7Ci0Jd2hpbGUgKG0gJiYgKG0tPmNvbnRfbGV2ZWwgIT0gMCkpIHsKLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0RFQlVHLCByLAotCQkJTU9ETkFNRSAiOiBtYXRjaCBsaW5lPSVkIGNvbnQ9JWQgdHlwZT0lZCAlcyIsCi0JCQltLT5saW5lbm8sIG0tPmNvbnRfbGV2ZWwsIG0tPnR5cGUsCi0JCQkobS0+dHlwZSA9PSBTVFJJTkcpID8gbS0+dmFsdWUucyA6ICIiKTsKLSNlbmRpZgotCSAgICBpZiAoY29udF9sZXZlbCA+PSBtLT5jb250X2xldmVsKSB7Ci0JCWlmIChjb250X2xldmVsID4gbS0+Y29udF9sZXZlbCkgewotCQkgICAgLyoKLQkJICAgICAqIFdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGxldmVsICJjb250X2xldmVsIgotCQkgICAgICogY29udGludWF0aW9ucy4KLQkJICAgICAqLwotCQkgICAgY29udF9sZXZlbCA9IG0tPmNvbnRfbGV2ZWw7Ci0JCX0KLQkJaWYgKG1nZXQociwgJnAsIHMsIG0sIG5ieXRlcykgJiYKLQkJICAgIG1jaGVjayhyLCAmcCwgbSkpIHsKLQkJICAgIC8qCi0JCSAgICAgKiBUaGlzIGNvbnRpbnVhdGlvbiBtYXRjaGVkLiBQcmludCBpdHMgbWVzc2FnZSwgd2l0aCBhCi0JCSAgICAgKiBibGFuayBiZWZvcmUgaXQgaWYgdGhlIHByZXZpb3VzIGl0ZW0gcHJpbnRlZCBhbmQgdGhpcwotCQkgICAgICogaXRlbSBpc24ndCBlbXB0eS4KLQkJICAgICAqLwotCQkgICAgLyogc3BhY2UgaWYgcHJldmlvdXMgcHJpbnRlZCAqLwotCQkgICAgaWYgKG5lZWRfc2VwYXJhdG9yCi0JCQkmJiAobS0+bm9zcGZsYWcgPT0gMCkKLQkJCSYmIChtLT5kZXNjWzBdICE9ICdcMCcpCi0JCQkpIHsKLQkJCSh2b2lkKSBtYWdpY19yc2xfcHV0Y2hhcihyLCAnICcpOwotCQkJbmVlZF9zZXBhcmF0b3IgPSAwOwotCQkgICAgfQotCQkgICAgbXByaW50KHIsICZwLCBtKTsKLQkJICAgIGlmIChtLT5kZXNjWzBdKQotCQkJbmVlZF9zZXBhcmF0b3IgPSAxOwotCi0JCSAgICAvKgotCQkgICAgICogSWYgd2Ugc2VlIGFueSBjb250aW51YXRpb25zIGF0IGEgaGlnaGVyIGxldmVsLCBwcm9jZXNzCi0JCSAgICAgKiB0aGVtLgotCQkgICAgICovCi0JCSAgICBjb250X2xldmVsKys7Ci0JCX0KLQkgICAgfQotCi0JICAgIC8qIG1vdmUgdG8gbmV4dCBjb250aW51YXRpb24gcmVjb3JkICovCi0JICAgIG0gPSBtLT5uZXh0OwotCX0KLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIHIsCi0JCSAgICBNT0ROQU1FICI6IG1hdGNoZWQgYWZ0ZXIgJWQgcnVsZXMiLCBydWxlX2NvdW50ZXIpOwotI2VuZGlmCi0JcmV0dXJuIDE7CQkvKiBhbGwgdGhyb3VnaCAqLwotICAgIH0KLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0gICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIHIsCi0JCU1PRE5BTUUgIjogZmFpbGVkIGFmdGVyICVkIHJ1bGVzIiwgcnVsZV9jb3VudGVyKTsKLSNlbmRpZgotICAgIHJldHVybiAwOwkJCS8qIG5vIG1hdGNoIGF0IGFsbCAqLwotfQotCi1zdGF0aWMgdm9pZCBtcHJpbnQocmVxdWVzdF9yZWMgKnIsIHVuaW9uIFZBTFVFVFlQRSAqcCwgc3RydWN0IG1hZ2ljICptKQotewotICAgIGNoYXIgKnBwLCAqcnQ7Ci0gICAgdW5zaWduZWQgbG9uZyB2OwotCi0gICAgc3dpdGNoIChtLT50eXBlKSB7Ci0gICAgY2FzZSBCWVRFOgotCXYgPSBwLT5iOwotCWJyZWFrOwotCi0gICAgY2FzZSBTSE9SVDoKLSAgICBjYXNlIEJFU0hPUlQ6Ci0gICAgY2FzZSBMRVNIT1JUOgotCXYgPSBwLT5oOwotCWJyZWFrOwotCi0gICAgY2FzZSBMT05HOgotICAgIGNhc2UgQkVMT05HOgotICAgIGNhc2UgTEVMT05HOgotCXYgPSBwLT5sOwotCWJyZWFrOwotCi0gICAgY2FzZSBTVFJJTkc6Ci0JaWYgKG0tPnJlbG4gPT0gJz0nKSB7Ci0JICAgICh2b2lkKSBtYWdpY19yc2xfcHJpbnRmKHIsIG0tPmRlc2MsIG0tPnZhbHVlLnMpOwotCX0KLQllbHNlIHsKLQkgICAgKHZvaWQpIG1hZ2ljX3JzbF9wcmludGYociwgbS0+ZGVzYywgcC0+cyk7Ci0JfQotCXJldHVybjsKLQotICAgIGNhc2UgREFURToKLSAgICBjYXNlIEJFREFURToKLSAgICBjYXNlIExFREFURToKLQkvKiBYWFg6IG5vdCBtdWx0aXRocmVhZCBzYWZlICovCi0JcHAgPSBjdGltZSgodGltZV90ICopICYgcC0+bCk7Ci0JaWYgKChydCA9IHN0cmNocihwcCwgJ1xuJykpICE9IE5VTEwpCi0JICAgICpydCA9ICdcMCc7Ci0JKHZvaWQpIG1hZ2ljX3JzbF9wcmludGYociwgbS0+ZGVzYywgcHApOwotCXJldHVybjsKLSAgICBkZWZhdWx0OgotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0VSUiwgciwKLQkJICAgIE1PRE5BTUUgIjogaW52YWxpZCBtLT50eXBlICglZCkgaW4gbXByaW50KCkuIiwKLQkJICAgIG0tPnR5cGUpOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICB2ID0gc2lnbmV4dGVuZChyLT5zZXJ2ZXIsIG0sIHYpICYgbS0+bWFzazsKLSAgICAodm9pZCkgbWFnaWNfcnNsX3ByaW50ZihyLCBtLT5kZXNjLCAodW5zaWduZWQgbG9uZykgdik7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IHRoZSBieXRlIG9yZGVyIG9mIHRoZSBkYXRhIHdlIGFyZSBsb29raW5nIGF0Ci0gKi8KLXN0YXRpYyBpbnQgbWNvbnZlcnQocmVxdWVzdF9yZWMgKnIsIHVuaW9uIFZBTFVFVFlQRSAqcCwgc3RydWN0IG1hZ2ljICptKQotewotICAgIGNoYXIgKnJ0OwotCi0gICAgc3dpdGNoIChtLT50eXBlKSB7Ci0gICAgY2FzZSBCWVRFOgotICAgIGNhc2UgU0hPUlQ6Ci0gICAgY2FzZSBMT05HOgotICAgIGNhc2UgREFURToKLQlyZXR1cm4gMTsKLSAgICBjYXNlIFNUUklORzoKLQkvKiBOdWxsIHRlcm1pbmF0ZSBhbmQgZWF0IHRoZSByZXR1cm4gKi8KLQlwLT5zW3NpemVvZihwLT5zKSAtIDFdID0gJ1wwJzsKLQlpZiAoKHJ0ID0gc3RyY2hyKHAtPnMsICdcbicpKSAhPSBOVUxMKQotCSAgICAqcnQgPSAnXDAnOwotCXJldHVybiAxOwotICAgIGNhc2UgQkVTSE9SVDoKLQlwLT5oID0gKHNob3J0KSAoKHAtPmhzWzBdIDw8IDgpIHwgKHAtPmhzWzFdKSk7Ci0JcmV0dXJuIDE7Ci0gICAgY2FzZSBCRUxPTkc6Ci0gICAgY2FzZSBCRURBVEU6Ci0JcC0+bCA9IChsb25nKQotCSAgICAoKHAtPmhsWzBdIDw8IDI0KSB8IChwLT5obFsxXSA8PCAxNikgfCAocC0+aGxbMl0gPDwgOCkgfCAocC0+aGxbM10pKTsKLQlyZXR1cm4gMTsKLSAgICBjYXNlIExFU0hPUlQ6Ci0JcC0+aCA9IChzaG9ydCkgKChwLT5oc1sxXSA8PCA4KSB8IChwLT5oc1swXSkpOwotCXJldHVybiAxOwotICAgIGNhc2UgTEVMT05HOgotICAgIGNhc2UgTEVEQVRFOgotCXAtPmwgPSAobG9uZykKLQkgICAgKChwLT5obFszXSA8PCAyNCkgfCAocC0+aGxbMl0gPDwgMTYpIHwgKHAtPmhsWzFdIDw8IDgpIHwgKHAtPmhsWzBdKSk7Ci0JcmV0dXJuIDE7Ci0gICAgZGVmYXVsdDoKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19FUlIsIHIsCi0JCSAgICBNT0ROQU1FICI6IGludmFsaWQgdHlwZSAlZCBpbiBtY29udmVydCgpLiIsIG0tPnR5cGUpOwotCXJldHVybiAwOwotICAgIH0KLX0KLQotCi1zdGF0aWMgaW50IG1nZXQocmVxdWVzdF9yZWMgKnIsIHVuaW9uIFZBTFVFVFlQRSAqcCwgdW5zaWduZWQgY2hhciAqcywKLQkJc3RydWN0IG1hZ2ljICptLCBpbnQgbmJ5dGVzKQotewotICAgIGxvbmcgb2Zmc2V0ID0gbS0+b2Zmc2V0OwotCi0gICAgaWYgKG9mZnNldCArIHNpemVvZih1bmlvbiBWQUxVRVRZUEUpID4gbmJ5dGVzKQotCSAgICAgICAgICByZXR1cm4gMDsKLQotICAgIG1lbWNweShwLCBzICsgb2Zmc2V0LCBzaXplb2YodW5pb24gVkFMVUVUWVBFKSk7Ci0KLSAgICBpZiAoIW1jb252ZXJ0KHIsIHAsIG0pKQotCXJldHVybiAwOwotCi0gICAgaWYgKG0tPmZsYWcgJiBJTkRJUikgewotCi0Jc3dpdGNoIChtLT5pbi50eXBlKSB7Ci0JY2FzZSBCWVRFOgotCSAgICBvZmZzZXQgPSBwLT5iICsgbS0+aW4ub2Zmc2V0OwotCSAgICBicmVhazsKLQljYXNlIFNIT1JUOgotCSAgICBvZmZzZXQgPSBwLT5oICsgbS0+aW4ub2Zmc2V0OwotCSAgICBicmVhazsKLQljYXNlIExPTkc6Ci0JICAgIG9mZnNldCA9IHAtPmwgKyBtLT5pbi5vZmZzZXQ7Ci0JICAgIGJyZWFrOwotCX0KLQotCWlmIChvZmZzZXQgKyBzaXplb2YodW5pb24gVkFMVUVUWVBFKSA+IG5ieXRlcykKLQkgICAgICAgICAgICAgIHJldHVybiAwOwotCi0JbWVtY3B5KHAsIHMgKyBvZmZzZXQsIHNpemVvZih1bmlvbiBWQUxVRVRZUEUpKTsKLQotCWlmICghbWNvbnZlcnQociwgcCwgbSkpCi0JICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBtY2hlY2socmVxdWVzdF9yZWMgKnIsIHVuaW9uIFZBTFVFVFlQRSAqcCwgc3RydWN0IG1hZ2ljICptKQotewotICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbCA9IG0tPnZhbHVlLmw7Ci0gICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyB2OwotICAgIGludCBtYXRjaGVkOwotCi0gICAgaWYgKChtLT52YWx1ZS5zWzBdID09ICd4JykgJiYgKG0tPnZhbHVlLnNbMV0gPT0gJ1wwJykpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19FUlIsIHIsCi0JCSAgICBNT0ROQU1FICI6IEJPSU5LIik7Ci0JcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgc3dpdGNoIChtLT50eXBlKSB7Ci0gICAgY2FzZSBCWVRFOgotCXYgPSBwLT5iOwotCWJyZWFrOwotCi0gICAgY2FzZSBTSE9SVDoKLSAgICBjYXNlIEJFU0hPUlQ6Ci0gICAgY2FzZSBMRVNIT1JUOgotCXYgPSBwLT5oOwotCWJyZWFrOwotCi0gICAgY2FzZSBMT05HOgotICAgIGNhc2UgQkVMT05HOgotICAgIGNhc2UgTEVMT05HOgotICAgIGNhc2UgREFURToKLSAgICBjYXNlIEJFREFURToKLSAgICBjYXNlIExFREFURToKLQl2ID0gcC0+bDsKLQlicmVhazsKLQotICAgIGNhc2UgU1RSSU5HOgotCWwgPSAwOwotCS8qCi0JICogV2hhdCB3ZSB3YW50IGhlcmUgaXM6IHYgPSBzdHJuY21wKG0tPnZhbHVlLnMsIHAtPnMsIG0tPnZhbGxlbik7Ci0JICogYnV0IGlnbm9yaW5nIGFueSBudWxscy4gIGJjbXAgZG9lc24ndCBnaXZlIC0vKy8wIGFuZCBpc24ndAotCSAqIHVuaXZlcnNhbGx5IGF2YWlsYWJsZSBhbnl3YXkuCi0JICovCi0JdiA9IDA7Ci0JewotCSAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICphID0gKHVuc2lnbmVkIGNoYXIgKikgbS0+dmFsdWUuczsKLQkgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqYiA9ICh1bnNpZ25lZCBjaGFyICopIHAtPnM7Ci0JICAgIHJlZ2lzdGVyIGludCBsZW4gPSBtLT52YWxsZW47Ci0KLQkgICAgd2hpbGUgKC0tbGVuID49IDApCi0JCWlmICgodiA9ICpiKysgLSAqYSsrKSAhPSAwKQotCQkgICAgYnJlYWs7Ci0JfQotCWJyZWFrOwotICAgIGRlZmF1bHQ6Ci0JLyogIGJvZ29zaXR5LCBwcmV0ZW5kIHRoYXQgaXQganVzdCB3YXNuJ3QgYSBtYXRjaCAqLwotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0VSUiwgciwKLQkJICAgIE1PRE5BTUUgIjogaW52YWxpZCB0eXBlICVkIGluIG1jaGVjaygpLiIsIG0tPnR5cGUpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIHYgPSBzaWduZXh0ZW5kKHItPnNlcnZlciwgbSwgdikgJiBtLT5tYXNrOwotCi0gICAgc3dpdGNoIChtLT5yZWxuKSB7Ci0gICAgY2FzZSAneCc6Ci0jaWYgTUlNRV9NQUdJQ19ERUJVRwotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0RFQlVHLCByLAotCQkgICAgIiVsdSA9PSAqYW55KiA9IDEiLCB2KTsKLSNlbmRpZgotCW1hdGNoZWQgPSAxOwotCWJyZWFrOwotCi0gICAgY2FzZSAnISc6Ci0JbWF0Y2hlZCA9IHYgIT0gbDsKLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIHIsCi0JCSAgICAiJWx1ICE9ICVsdSA9ICVkIiwgdiwgbCwgbWF0Y2hlZCk7Ci0jZW5kaWYKLQlicmVhazsKLQotICAgIGNhc2UgJz0nOgotCW1hdGNoZWQgPSB2ID09IGw7Ci0jaWYgTUlNRV9NQUdJQ19ERUJVRwotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0RFQlVHLCByLAotCQkgICAgIiVsdSA9PSAlbHUgPSAlZCIsIHYsIGwsIG1hdGNoZWQpOwotI2VuZGlmCi0JYnJlYWs7Ci0KLSAgICBjYXNlICc+JzoKLQlpZiAobS0+ZmxhZyAmIFVOU0lHTkVEKSB7Ci0JICAgIG1hdGNoZWQgPSB2ID4gbDsKLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0RFQlVHLCByLAotCQkJIiVsdSA+ICVsdSA9ICVkIiwgdiwgbCwgbWF0Y2hlZCk7Ci0jZW5kaWYKLQl9Ci0JZWxzZSB7Ci0JICAgIG1hdGNoZWQgPSAobG9uZykgdiA+IChsb25nKSBsOwotI2lmIE1JTUVfTUFHSUNfREVCVUcKLQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIHIsCi0JCQkiJWxkID4gJWxkID0gJWQiLCB2LCBsLCBtYXRjaGVkKTsKLSNlbmRpZgotCX0KLQlicmVhazsKLQotICAgIGNhc2UgJzwnOgotCWlmIChtLT5mbGFnICYgVU5TSUdORUQpIHsKLQkgICAgbWF0Y2hlZCA9IHYgPCBsOwotI2lmIE1JTUVfTUFHSUNfREVCVUcKLQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIHIsCi0JCQkiJWx1IDwgJWx1ID0gJWQiLCB2LCBsLCBtYXRjaGVkKTsKLSNlbmRpZgotCX0KLQllbHNlIHsKLQkgICAgbWF0Y2hlZCA9IChsb25nKSB2IDwgKGxvbmcpIGw7Ci0jaWYgTUlNRV9NQUdJQ19ERUJVRwotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19ERUJVRywgciwKLQkJCSIlbGQgPCAlbGQgPSAlZCIsIHYsIGwsIG1hdGNoZWQpOwotI2VuZGlmCi0JfQotCWJyZWFrOwotCi0gICAgY2FzZSAnJic6Ci0JbWF0Y2hlZCA9ICh2ICYgbCkgPT0gbDsKLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIHIsCi0JCSAgICAiKCglbHggJiAlbHgpID09ICVseCkgPSAlZCIsIHYsIGwsIGwsIG1hdGNoZWQpOwotI2VuZGlmCi0JYnJlYWs7Ci0KLSAgICBjYXNlICdeJzoKLQltYXRjaGVkID0gKHYgJiBsKSAhPSBsOwotI2lmIE1JTUVfTUFHSUNfREVCVUcKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19ERUJVRywgciwKLQkJICAgICIoKCVseCAmICVseCkgIT0gJWx4KSA9ICVkIiwgdiwgbCwgbCwgbWF0Y2hlZCk7Ci0jZW5kaWYKLQlicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0JLyogYm9nb3NpdHksIHByZXRlbmQgaXQgZGlkbid0IG1hdGNoICovCi0JbWF0Y2hlZCA9IDA7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfRVJSLCByLAotCQkgICAgTU9ETkFNRSAiOiBtY2hlY2s6IGNhbid0IGhhcHBlbjogaW52YWxpZCByZWxhdGlvbiAlZC4iLAotCQkgICAgbS0+cmVsbik7Ci0JYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1hdGNoZWQ7Ci19Ci0KLS8qIGFuIG9wdGltaXphdGlvbiBvdmVyIHBsYWluIHN0cmNtcCgpICovCi0jZGVmaW5lICAgIFNUUkVRKGEsIGIpICAgICgqKGEpID09ICooYikgJiYgc3RyY21wKChhKSwgKGIpKSA9PSAwKQotCi1zdGF0aWMgaW50IGFzY21hZ2ljKHJlcXVlc3RfcmVjICpyLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBuYnl0ZXMpCi17Ci0gICAgaW50IGhhc19lc2NhcGVzID0gMDsKLSAgICB1bnNpZ25lZCBjaGFyICpzOwotICAgIGNoYXIgbmJ1ZltIT1dNQU5ZICsgMV07CS8qIG9uZSBleHRyYSBmb3IgdGVybWluYXRpbmcgJ1wwJyAqLwotICAgIGNoYXIgKnRva2VuOwotICAgIHJlZ2lzdGVyIHN0cnVjdCBuYW1lcyAqcDsKLSAgICBpbnQgc21hbGxfbmJ5dGVzOwotCi0gICAgLyogdGhlc2UgYXJlIGVhc3ksIGRvIHRoZW0gZmlyc3QgKi8KLQotICAgIC8qCi0gICAgICogZm9yIHRyb2ZmLCBsb29rIGZvciAuICsgbGV0dGVyICsgbGV0dGVyIG9yIC5cIjsgdGhpcyBtdXN0IGJlIGRvbmUgdG8KLSAgICAgKiBkaXNhbWJpZ3VhdGUgdGFyIGFyY2hpdmVzJyAuL2ZpbGUgYW5kIG90aGVyIHRyYXNoIGZyb20gcmVhbCB0cm9mZgotICAgICAqIGlucHV0LgotICAgICAqLwotICAgIGlmICgqYnVmID09ICcuJykgewotCXVuc2lnbmVkIGNoYXIgKnRwID0gYnVmICsgMTsKLQotCXdoaWxlIChhcF9pc3NwYWNlKCp0cCkpCi0JICAgICsrdHA7CQkvKiBza2lwIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotCWlmICgoYXBfaXNhbG51bSgqdHApIHx8ICp0cCA9PSAnXFwnKSAmJgotCSAgICAgKGFwX2lzYWxudW0oKih0cCArIDEpKSB8fCAqdHAgPT0gJyInKSkgewotCSAgICBtYWdpY19yc2xfcHV0cyhyLCAiYXBwbGljYXRpb24veC10cm9mZiIpOwotCSAgICByZXR1cm4gMTsKLQl9Ci0gICAgfQotICAgIGlmICgoKmJ1ZiA9PSAnYycgfHwgKmJ1ZiA9PSAnQycpICYmIGFwX2lzc3BhY2UoKihidWYgKyAxKSkpIHsKLQkvKiBGb3J0cmFuICovCi0JbWFnaWNfcnNsX3B1dHMociwgInRleHQvcGxhaW4iKTsKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiBsb29rIGZvciB0b2tlbnMgZnJvbSBuYW1lcy5oIC0gdGhpcyBpcyBleHBlbnNpdmUhLCBzbyB3ZSdsbCBsaW1pdAotICAgICAqIG91cnNlbHZlcyB0byBvbmx5IFNNQUxMX0hPV01BTlkgYnl0ZXMgKi8KLSAgICBzbWFsbF9uYnl0ZXMgPSAobmJ5dGVzID4gU01BTExfSE9XTUFOWSkgPyBTTUFMTF9IT1dNQU5ZIDogbmJ5dGVzOwotICAgIC8qIG1ha2UgYSBjb3B5IG9mIHRoZSBidWZmZXIgaGVyZSBiZWNhdXNlIHN0cnRvaygpIHdpbGwgZGVzdHJveSBpdCAqLwotICAgIHMgPSAodW5zaWduZWQgY2hhciAqKSBtZW1jcHkobmJ1ZiwgYnVmLCBzbWFsbF9uYnl0ZXMpOwotICAgIHNbc21hbGxfbmJ5dGVzXSA9ICdcMCc7Ci0gICAgaGFzX2VzY2FwZXMgPSAobWVtY2hyKHMsICdcMDMzJywgc21hbGxfbmJ5dGVzKSAhPSBOVUxMKTsKLSAgICAvKiBYWFg6IG5vdCBtdWx0aXRocmVhZCBzYWZlICovCi0gICAgd2hpbGUgKCh0b2tlbiA9IHN0cnRvaygoY2hhciAqKSBzLCAiIFx0XG5cclxmIikpICE9IE5VTEwpIHsKLQlzID0gTlVMTDsJCS8qIG1ha2Ugc3RydG9rKCkga2VlcCBvbiB0b2tpbicgKi8KLQlmb3IgKHAgPSBuYW1lczsgcCA8IG5hbWVzICsgTk5BTUVTOyBwKyspIHsKLQkgICAgaWYgKFNUUkVRKHAtPm5hbWUsIHRva2VuKSkgewotCQltYWdpY19yc2xfcHV0cyhyLCB0eXBlc1twLT50eXBlXSk7Ci0JCWlmIChoYXNfZXNjYXBlcykKLQkJICAgIG1hZ2ljX3JzbF9wdXRzKHIsICIgKHdpdGggZXNjYXBlIHNlcXVlbmNlcykiKTsKLQkJcmV0dXJuIDE7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgc3dpdGNoIChpc190YXIoYnVmLCBuYnl0ZXMpKSB7Ci0gICAgY2FzZSAxOgotCS8qIFY3IHRhciBhcmNoaXZlICovCi0JbWFnaWNfcnNsX3B1dHMociwgImFwcGxpY2F0aW9uL3gtdGFyIik7Ci0JcmV0dXJuIDE7Ci0gICAgY2FzZSAyOgotCS8qIFBPU0lYIHRhciBhcmNoaXZlICovCi0JbWFnaWNfcnNsX3B1dHMociwgImFwcGxpY2F0aW9uL3gtdGFyIik7Ci0JcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLyogYWxsIGVsc2UgZmFpbHMsIGJ1dCBpdCBpcyBhc2NpaS4uLiAqLwotICAgIGlmIChoYXNfZXNjYXBlcykgewotCS8qIHRleHQgd2l0aCBlc2NhcGUgc2VxdWVuY2VzICovCi0JLyogd2UgbGVhdmUgdGhpcyBvcGVuIGZvciBmdXJ0aGVyIGRpZmZlcmVudGlhdGlvbiBsYXRlciAqLwotCW1hZ2ljX3JzbF9wdXRzKHIsICJ0ZXh0L3BsYWluIik7Ci0gICAgfQotICAgIGVsc2UgewotCS8qIHBsYWluIHRleHQgKi8KLQltYWdpY19yc2xfcHV0cyhyLCAidGV4dC9wbGFpbiIpOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotCi0vKgotICogY29tcHJlc3Mgcm91dGluZXM6IHptYWdpYygpIC0gcmV0dXJucyAwIGlmIG5vdCByZWNvZ25pemVkLCB1bmNvbXByZXNzZXMKLSAqIGFuZCBwcmludHMgaW5mb3JtYXRpb24gaWYgcmVjb2duaXplZCB1bmNvbXByZXNzKHMsIG1ldGhvZCwgb2xkLCBuLCBuZXdjaCkKLSAqIC0gdW5jb21wcmVzcyBvbGQgaW50byBuZXcsIHVzaW5nIG1ldGhvZCwgcmV0dXJuIHNpemVvZiBuZXcKLSAqLwotCi1zdGF0aWMgc3RydWN0IHsKLSAgICBjaGFyICptYWdpYzsKLSAgICBpbnQgbWFnbGVuOwotICAgIGNoYXIgKmFyZ3ZbM107Ci0gICAgaW50IHNpbGVudDsKLSAgICBjaGFyICplbmNvZGluZzsJLyogTVVTVCBiZSBsb3dlcmNhc2UgKi8KLX0gY29tcHJbXSA9IHsKLQotICAgIC8qIHdlIHVzZSBnemlwIGhlcmUgcmF0aGVyIHRoYW4gdW5jb21wcmVzcyBiZWNhdXNlIHdlIGhhdmUgdG8gcGFzcwotICAgICAqIGl0IGEgZnVsbCBmaWxlbmFtZSAtLSBhbmQgdW5jb21wcmVzcyBvbmx5IGNvbnNpZGVycyBmaWxlbmFtZXMKLSAgICAgKiBlbmRpbmcgd2l0aCAuWgotICAgICAqLwotICAgIHsKLQkiXDAzN1wyMzUiLCAyLCB7Ci0JICAgICJnemlwIiwgIi1kY3EiLCBOVUxMCi0JfSwgMCwgIngtY29tcHJlc3MiCi0gICAgfSwKLSAgICB7Ci0JIlwwMzdcMjEzIiwgMiwgewotCSAgICAiZ3ppcCIsICItZGNxIiwgTlVMTAotCX0sIDEsICJ4LWd6aXAiCi0gICAgfSwKLSAgICAvKgotICAgICAqIFhYWCBwY2F0IGRvZXMgbm90IHdvcmssIGNhdXNlIEkgZG9uJ3Qga25vdyBob3cgdG8gbWFrZSBpdCByZWFkIHN0ZGluLAotICAgICAqIHNvIHdlIHVzZSBnemlwCi0gICAgICovCi0gICAgewotCSJcMDM3XDAzNiIsIDIsIHsKLQkgICAgImd6aXAiLCAiLWRjcSIsIE5VTEwKLQl9LCAwLCAieC1nemlwIgotICAgIH0sCi19OwotCi1zdGF0aWMgaW50IG5jb21wciA9IHNpemVvZihjb21wcikgLyBzaXplb2YoY29tcHJbMF0pOwotCi1zdGF0aWMgaW50IHptYWdpYyhyZXF1ZXN0X3JlYyAqciwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbmJ5dGVzKQotewotICAgIHVuc2lnbmVkIGNoYXIgKm5ld2J1ZjsKLSAgICBpbnQgbmV3c2l6ZTsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuY29tcHI7IGkrKykgewotCWlmIChuYnl0ZXMgPCBjb21wcltpXS5tYWdsZW4pCi0JICAgIGNvbnRpbnVlOwotCWlmIChtZW1jbXAoYnVmLCBjb21wcltpXS5tYWdpYywgY29tcHJbaV0ubWFnbGVuKSA9PSAwKQotCSAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoaSA9PSBuY29tcHIpCi0JcmV0dXJuIDA7Ci0KLSAgICBpZiAoKG5ld3NpemUgPSB1bmNvbXByZXNzKHIsIGksICZuZXdidWYsIG5ieXRlcykpID4gMCkgewotCXRyeWl0KHIsIG5ld2J1ZiwgbmV3c2l6ZSwgMCk7Ci0KLQkvKiBzZXQgZW5jb2RpbmcgdHlwZSBpbiB0aGUgcmVxdWVzdCByZWNvcmQgKi8KLQlyLT5jb250ZW50X2VuY29kaW5nID0gY29tcHJbaV0uZW5jb2Rpbmc7Ci0gICAgfQotICAgIHJldHVybiAxOwotfQotCi0KLXN0cnVjdCB1bmNvbXByZXNzX3Bhcm1zIHsKLSAgICByZXF1ZXN0X3JlYyAqcjsKLSAgICBpbnQgbWV0aG9kOwotfTsKLQotc3RhdGljIGludCB1bmNvbXByZXNzX2NoaWxkKHZvaWQgKmRhdGEsIGNoaWxkX2luZm8gKnBpbmZvKQotewotICAgIHN0cnVjdCB1bmNvbXByZXNzX3Bhcm1zICpwYXJtID0gZGF0YTsKLQljaGFyICpuZXdfYXJndls0XTsKLQotCW5ld19hcmd2WzBdID0gY29tcHJbcGFybS0+bWV0aG9kXS5hcmd2WzBdOwotCW5ld19hcmd2WzFdID0gY29tcHJbcGFybS0+bWV0aG9kXS5hcmd2WzFdOwotCW5ld19hcmd2WzJdID0gcGFybS0+ci0+ZmlsZW5hbWU7Ci0JbmV3X2FyZ3ZbM10gPSBOVUxMOwotCi0jaWYgZGVmaW5lZChXSU4zMikKLSAgICBpbnQgY2hpbGRfcGlkOwotI2VuZGlmCi0KLSAgICBpZiAoY29tcHJbcGFybS0+bWV0aG9kXS5zaWxlbnQpIHsKLQljbG9zZShTVERFUlJfRklMRU5PKTsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKFdJTjMyKQotICAgIGNoaWxkX3BpZCA9IHNwYXdudnAoY29tcHJbcGFybS0+bWV0aG9kXS5hcmd2WzBdLAotCQkJbmV3X2FyZ3YpOwotICAgIHJldHVybiAoY2hpbGRfcGlkKTsKLSNlbHNlCi0gICAgZXhlY3ZwKGNvbXByW3Bhcm0tPm1ldGhvZF0uYXJndlswXSwgbmV3X2FyZ3YpOwotICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBwYXJtLT5yLAotCQlNT0ROQU1FICI6IGNvdWxkIG5vdCBleGVjdXRlIGAlcycuIiwKLQkJY29tcHJbcGFybS0+bWV0aG9kXS5hcmd2WzBdKTsKLSAgICByZXR1cm4gLTE7Ci0jZW5kaWYKLX0KLQotCi1zdGF0aWMgaW50IHVuY29tcHJlc3MocmVxdWVzdF9yZWMgKnIsIGludCBtZXRob2QsIAotCQkgICAgICB1bnNpZ25lZCBjaGFyICoqbmV3Y2gsIGludCBuKQotewotICAgIHN0cnVjdCB1bmNvbXByZXNzX3Bhcm1zIHBhcm07Ci0gICAgQlVGRiAqYm91dDsKLSAgICBwb29sICpzdWJfcG9vbDsKLQotICAgIHBhcm0uciA9IHI7Ci0gICAgcGFybS5tZXRob2QgPSBtZXRob2Q7Ci0KLSAgICAvKiBXZSBtYWtlIGEgc3ViX3Bvb2wgc28gdGhhdCB3ZSBjYW4gY29sbGVjdCBvdXIgY2hpbGQgZWFybHksIG90aGVyd2lzZQotICAgICAqIHRoZXJlIGFyZSBjYXNlcyAoaS5lLiBnZW5lcmF0aW5nIGRpcmVjdG9yeSBpbmRpY2llcyB3aXRoIG1vZF9hdXRvaW5kZXgpCi0gICAgICogd2hlcmUgd2Ugd291bGQgZW5kIHVwIHdpdGggTE9UUyBvZiB6b21iaWVzLgotICAgICAqLwotICAgIHN1Yl9wb29sID0gYXBfbWFrZV9zdWJfcG9vbChyLT5wb29sKTsKLQotICAgIGlmICghYXBfYnNwYXduX2NoaWxkKHN1Yl9wb29sLCB1bmNvbXByZXNzX2NoaWxkLCAmcGFybSwga2lsbF9hbHdheXMsCi0JCQkgTlVMTCwgJmJvdXQsIE5VTEwpKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsCi0JCSAgICBNT0ROQU1FICI6IGNvdWxkbid0IHNwYXduIHVuY29tcHJlc3MgcHJvY2VzczogJXMiLCByLT51cmkpOwotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAqbmV3Y2ggPSAodW5zaWduZWQgY2hhciAqKSBhcF9wYWxsb2Moci0+cG9vbCwgbik7Ci0gICAgaWYgKChuID0gYXBfYnJlYWQoYm91dCwgKm5ld2NoLCBuKSkgPD0gMCkgewotCWFwX2Rlc3Ryb3lfcG9vbChzdWJfcG9vbCk7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsCi0JICAgIE1PRE5BTUUgIjogcmVhZCBmYWlsZWQgJXMiLCByLT5maWxlbmFtZSk7Ci0JcmV0dXJuIC0xOwotICAgIH0KLSAgICBhcF9kZXN0cm95X3Bvb2woc3ViX3Bvb2wpOwotICAgIHJldHVybiBuOwotfQotCi0vKgotICogaXNfdGFyKCkgLS0gZmlndXJlIG91dCB3aGV0aGVyIGZpbGUgaXMgYSB0YXIgYXJjaGl2ZS4KLSAqCi0gKiBTdG9sZW4gKGJ5IGF1dGhvciBvZiBmaWxlIHV0aWxpdHkpIGZyb20gdGhlIHB1YmxpYyBkb21haW4gdGFyIHByb2dyYW06IFB1YmxpYwotICogRG9tYWluIHZlcnNpb24gd3JpdHRlbiAyNiBBdWcgMTk4NSBKb2huIEdpbG1vcmUgKGlobnA0IWhvcHRvYWQhZ251KS4KLSAqCi0gKiBAKCMpbGlzdC5jIDEuMTggOS8yMy84NiBQdWJsaWMgRG9tYWluIC0gZ251ICRJZDogbW9kX21pbWVfbWFnaWMuYyx2IDEuNwotICogMTk5Ny8wNi8yNCAwMDo0MTowMiBpa2x1ZnQgRXhwIGlrbHVmdCAkCi0gKgotICogQ29tbWVudHMgY2hhbmdlZCBhbmQgc29tZSBjb2RlL2NvbW1lbnRzIHJlZm9ybWF0dGVkIGZvciBmaWxlIGNvbW1hbmQgYnkgSWFuCi0gKiBEYXJ3aW4uCi0gKi8KLQotI2RlZmluZSAgICBpc29kaWdpdChjKSAgICAoICgoYykgPj0gJzAnKSAmJiAoKGMpIDw9ICc3JykgKQotCi0vKgotICogUmV0dXJuIDAgaWYgdGhlIGNoZWNrc3VtIGlzIGJhZCAoaS5lLiwgcHJvYmFibHkgbm90IGEgdGFyIGFyY2hpdmUpLCAxIGZvcgotICogb2xkIFVOSVggdGFyIGZpbGUsIDIgZm9yIFVuaXggU3RkIChQT1NJWCkgdGFyIGZpbGUuCi0gKi8KLQotc3RhdGljIGludCBpc190YXIodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbmJ5dGVzKQotewotICAgIHJlZ2lzdGVyIHVuaW9uIHJlY29yZCAqaGVhZGVyID0gKHVuaW9uIHJlY29yZCAqKSBidWY7Ci0gICAgcmVnaXN0ZXIgaW50IGk7Ci0gICAgcmVnaXN0ZXIgbG9uZyBzdW0sIHJlY3N1bTsKLSAgICByZWdpc3RlciBjaGFyICpwOwotCi0gICAgaWYgKG5ieXRlcyA8IHNpemVvZih1bmlvbiByZWNvcmQpKQotCSAgICAgICByZXR1cm4gMDsKLQotICAgIHJlY3N1bSA9IGZyb21fb2N0KDgsIGhlYWRlci0+aGVhZGVyLmNoa3N1bSk7Ci0KLSAgICBzdW0gPSAwOwotICAgIHAgPSBoZWFkZXItPmNoYXJwdHI7Ci0gICAgZm9yIChpID0gc2l6ZW9mKHVuaW9uIHJlY29yZCk7IC0taSA+PSAwOykgewotCS8qCi0JICogV2UgY2FuJ3QgdXNlIHVuc2lnbmVkIGNoYXIgaGVyZSBiZWNhdXNlIG9mIG9sZCBjb21waWxlcnMsIGUuZy4gVjcuCi0JICovCi0Jc3VtICs9IDB4RkYgJiAqcCsrOwotICAgIH0KLQotICAgIC8qIEFkanVzdCBjaGVja3N1bSB0byBjb3VudCB0aGUgImNoa3N1bSIgZmllbGQgYXMgYmxhbmtzLiAqLwotICAgIGZvciAoaSA9IHNpemVvZihoZWFkZXItPmhlYWRlci5jaGtzdW0pOyAtLWkgPj0gMDspCi0Jc3VtIC09IDB4RkYgJiBoZWFkZXItPmhlYWRlci5jaGtzdW1baV07Ci0gICAgc3VtICs9ICcgJyAqIHNpemVvZiBoZWFkZXItPmhlYWRlci5jaGtzdW07Ci0KLSAgICBpZiAoc3VtICE9IHJlY3N1bSkKLQlyZXR1cm4gMDsJCS8qIE5vdCBhIHRhciBhcmNoaXZlICovCi0KLSAgICBpZiAoMCA9PSBzdHJjbXAoaGVhZGVyLT5oZWFkZXIubWFnaWMsIFRNQUdJQykpCi0JcmV0dXJuIDI7CQkvKiBVbml4IFN0YW5kYXJkIHRhciBhcmNoaXZlICovCi0KLSAgICByZXR1cm4gMTsJCQkvKiBPbGQgZmFzaGlvbmVkIHRhciBhcmNoaXZlICovCi19Ci0KLQotLyoKLSAqIFF1aWNrIGFuZCBkaXJ0eSBvY3RhbCBjb252ZXJzaW9uLgotICoKLSAqIFJlc3VsdCBpcyAtMSBpZiB0aGUgZmllbGQgaXMgaW52YWxpZCAoYWxsIGJsYW5rLCBvciBub25vY3RhbCkuCi0gKi8KLXN0YXRpYyBsb25nIGZyb21fb2N0KGludCBkaWdzLCBjaGFyICp3aGVyZSkKLXsKLSAgICByZWdpc3RlciBsb25nIHZhbHVlOwotCi0gICAgd2hpbGUgKGFwX2lzc3BhY2UoKndoZXJlKSkgewkvKiBTa2lwIHNwYWNlcyAqLwotCXdoZXJlKys7Ci0JaWYgKC0tZGlncyA8PSAwKQotCSAgICByZXR1cm4gLTE7CQkvKiBBbGwgYmxhbmsgZmllbGQgKi8KLSAgICB9Ci0gICAgdmFsdWUgPSAwOwotICAgIHdoaWxlIChkaWdzID4gMCAmJiBpc29kaWdpdCgqd2hlcmUpKSB7CS8qIFNjYW4gdGlsIG5vbm9jdGFsICovCi0JdmFsdWUgPSAodmFsdWUgPDwgMykgfCAoKndoZXJlKysgLSAnMCcpOwotCS0tZGlnczsKLSAgICB9Ci0KLSAgICBpZiAoZGlncyA+IDAgJiYgKndoZXJlICYmICFhcF9pc3NwYWNlKCp3aGVyZSkpCi0JcmV0dXJuIC0xOwkJLyogRW5kZWQgb24gbm9uLXNwYWNlL251bCAqLwotCi0gICAgcmV0dXJuIHZhbHVlOwotfQotCi0vKgotICogQ2hlY2sgZm9yIGZpbGUtcmV2aXNpb24gc3VmZml4Ci0gKgotICogVGhpcyBpcyBmb3IgYW4gb2JzY3VyZSBkb2N1bWVudCBjb250cm9sIHN5c3RlbSB1c2VkIG9uIGFuIGludHJhbmV0LgotICogVGhlIHdlYiByZXByZXNlbnRhdGlvbiBvZiBlYWNoIGZpbGUncyByZXZpc2lvbiBoYXMgYW4gQDEsIEAyLCBldGMKLSAqIGFwcGVuZGVkIHdpdGggdGhlIHJldmlzaW9uIG51bWJlci4gIFRoaXMgbmVlZHMgdG8gYmUgc3RyaXBwZWQgb2ZmIHRvCi0gKiBmaW5kIHRoZSBmaWxlIHN1ZmZpeCwgd2hpY2ggY2FuIGJlIHJlY29nbml6ZWQgYnkgc2VuZGluZyB0aGUgbmFtZSBiYWNrCi0gKiB0aHJvdWdoIGEgc3ViLXJlcXVlc3QuICBUaGUgYmFzZSBmaWxlIG5hbWUgKHdpdGhvdXQgdGhlIEBudW0gc3VmZml4KQotICogbXVzdCBleGlzdCBiZWNhdXNlIGl0cyB0eXBlIHdpbGwgYmUgdXNlZCBhcyB0aGUgcmVzdWx0LgotICovCi1zdGF0aWMgaW50IHJldmlzaW9uX3N1ZmZpeChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpbnQgc3VmZml4X3BvcywgcmVzdWx0OwotICAgIGNoYXIgKnN1Yl9maWxlbmFtZTsKLSAgICByZXF1ZXN0X3JlYyAqc3ViOwotCi0jaWYgTUlNRV9NQUdJQ19ERUJVRwotICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0RFQlVHLCByLAotCQlNT0ROQU1FICI6IHJldmlzaW9uX3N1ZmZpeCBjaGVja2luZyAlcyIsIHItPmZpbGVuYW1lKTsKLSNlbmRpZiAvKiBNSU1FX01BR0lDX0RFQlVHICovCi0KLSAgICAvKiBjaGVjayBmb3IgcmVjb2duaXplZCByZXZpc2lvbiBzdWZmaXggKi8KLSAgICBzdWZmaXhfcG9zID0gc3RybGVuKHItPmZpbGVuYW1lKSAtIDE7Ci0gICAgaWYgKCFhcF9pc2RpZ2l0KHItPmZpbGVuYW1lW3N1ZmZpeF9wb3NdKSkgewotCXJldHVybiAwOwotICAgIH0KLSAgICB3aGlsZSAoc3VmZml4X3BvcyA+PSAwICYmIGFwX2lzZGlnaXQoci0+ZmlsZW5hbWVbc3VmZml4X3Bvc10pKQotCXN1ZmZpeF9wb3MtLTsKLSAgICBpZiAoc3VmZml4X3BvcyA8IDAgfHwgci0+ZmlsZW5hbWVbc3VmZml4X3Bvc10gIT0gJ0AnKSB7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogcGVyZm9ybSBzdWItcmVxdWVzdCBmb3IgdGhlIGZpbGUgbmFtZSB3aXRob3V0IHRoZSBzdWZmaXggKi8KLSAgICByZXN1bHQgPSAwOwotICAgIHN1Yl9maWxlbmFtZSA9IGFwX3BzdHJuZHVwKHItPnBvb2wsIHItPmZpbGVuYW1lLCBzdWZmaXhfcG9zKTsKLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0gICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIHIsCi0JCU1PRE5BTUUgIjogc3VicmVxdWVzdCBsb29rdXAgZm9yICVzIiwgc3ViX2ZpbGVuYW1lKTsKLSNlbmRpZiAvKiBNSU1FX01BR0lDX0RFQlVHICovCi0gICAgc3ViID0gYXBfc3ViX3JlcV9sb29rdXBfZmlsZShzdWJfZmlsZW5hbWUsIHIpOwotCi0gICAgLyogZXh0cmFjdCBjb250ZW50IHR5cGUvZW5jb2RpbmcvbGFuZ3VhZ2UgZnJvbSBzdWItcmVxdWVzdCAqLwotICAgIGlmIChzdWItPmNvbnRlbnRfdHlwZSkgewotCXItPmNvbnRlbnRfdHlwZSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgc3ViLT5jb250ZW50X3R5cGUpOwotI2lmIE1JTUVfTUFHSUNfREVCVUcKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19ERUJVRywgciwKLQkJICAgIE1PRE5BTUUgIjogc3VicmVxdWVzdCAlcyBnb3QgJXMiLAotCQkgICAgc3ViX2ZpbGVuYW1lLCByLT5jb250ZW50X3R5cGUpOwotI2VuZGlmIC8qIE1JTUVfTUFHSUNfREVCVUcgKi8KLQlpZiAoc3ViLT5jb250ZW50X2VuY29kaW5nKQotCSAgICByLT5jb250ZW50X2VuY29kaW5nID0KLQkJYXBfcHN0cmR1cChyLT5wb29sLCBzdWItPmNvbnRlbnRfZW5jb2RpbmcpOwotCWlmIChzdWItPmNvbnRlbnRfbGFuZ3VhZ2UpCi0JICAgIHItPmNvbnRlbnRfbGFuZ3VhZ2UgPQotCQlhcF9wc3RyZHVwKHItPnBvb2wsIHN1Yi0+Y29udGVudF9sYW5ndWFnZSk7Ci0JcmVzdWx0ID0gMTsKLSAgICB9Ci0KLSAgICAvKiBjbGVhbiB1cCAqLwotICAgIGFwX2Rlc3Ryb3lfc3ViX3JlcShzdWIpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLSAqIGluaXRpYWxpemUgdGhlIG1vZHVsZQotICovCi0KLXN0YXRpYyB2b2lkIG1hZ2ljX2luaXQoc2VydmVyX3JlYyAqbWFpbl9zZXJ2ZXIsIHBvb2wgKnApCi17Ci0gICAgaW50IHJlc3VsdDsKLSAgICBtYWdpY19zZXJ2ZXJfY29uZmlnX3JlYyAqY29uZjsKLSAgICBtYWdpY19zZXJ2ZXJfY29uZmlnX3JlYyAqbWFpbl9jb25mOwotICAgIHNlcnZlcl9yZWMgKnM7Ci0jaWYgTUlNRV9NQUdJQ19ERUJVRwotICAgIHN0cnVjdCBtYWdpYyAqbSwgKnByZXZtOwotI2VuZGlmIC8qIE1JTUVfTUFHSUNfREVCVUcgKi8KLQotICAgIG1haW5fY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKG1haW5fc2VydmVyLT5tb2R1bGVfY29uZmlnLCAmbWltZV9tYWdpY19tb2R1bGUpOwotICAgIGZvciAocyA9IG1haW5fc2VydmVyOyBzOyBzID0gcy0+bmV4dCkgewotCWNvbmYgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAmbWltZV9tYWdpY19tb2R1bGUpOwotCWlmIChjb25mLT5tYWdpY2ZpbGUgPT0gTlVMTCAmJiBzICE9IG1haW5fc2VydmVyKSB7Ci0JICAgIC8qIGluaGVyaXRzIGZyb20gdGhlIHBhcmVudCAqLwotCSAgICAqY29uZiA9ICptYWluX2NvbmY7Ci0JfQotCWVsc2UgaWYgKGNvbmYtPm1hZ2ljZmlsZSkgewotCSAgICByZXN1bHQgPSBhcHByZW50aWNlKHMsIHApOwotCSAgICBpZiAocmVzdWx0ID09IC0xKQotCQlyZXR1cm47Ci0jaWYgTUlNRV9NQUdJQ19ERUJVRwotCSAgICBwcmV2bSA9IDA7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIHMsCi0JCQlNT0ROQU1FICI6IG1hZ2ljX2luaXQgMSB0ZXN0Iik7Ci0JICAgIGZvciAobSA9IGNvbmYtPm1hZ2ljOyBtOyBtID0gbS0+bmV4dCkgewotCQlpZiAoYXBfaXNwcmludCgoKCh1bnNpZ25lZCBsb25nKSBtKSA+PiAyNCkgJiAyNTUpICYmCi0JCSAgICBhcF9pc3ByaW50KCgoKHVuc2lnbmVkIGxvbmcpIG0pID4+IDE2KSAmIDI1NSkgJiYKLQkJICAgIGFwX2lzcHJpbnQoKCgodW5zaWduZWQgbG9uZykgbSkgPj4gOCkgJiAyNTUpICYmCi0JCSAgICBhcF9pc3ByaW50KCgodW5zaWduZWQgbG9uZykgbSkgJiAyNTUpKSB7Ci0JCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0RFQlVHLCBzLAotCQkJCU1PRE5BTUUgIjogbWFnaWNfaW5pdCAxOiBQT0lOVEVSIENMT0JCRVJFRCEgIgotCQkJCSJtPVwiJWMlYyVjJWNcIiBsaW5lPSVkIiwKLQkJCQkoKCh1bnNpZ25lZCBsb25nKSBtKSA+PiAyNCkgJiAyNTUsCi0JCQkJKCgodW5zaWduZWQgbG9uZykgbSkgPj4gMTYpICYgMjU1LAotCQkJCSgoKHVuc2lnbmVkIGxvbmcpIG0pID4+IDgpICYgMjU1LAotCQkJCSgodW5zaWduZWQgbG9uZykgbSkgJiAyNTUsCi0JCQkJcHJldm0gPyBwcmV2bS0+bGluZW5vIDogLTEpOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkJcHJldm0gPSBtOwotCSAgICB9Ci0jZW5kaWYKLQl9Ci0gICAgfQotfQotCi0vKgotICogRmluZCB0aGUgQ29udGVudC1UeXBlIGZyb20gYW55IHJlc291cmNlIHRoaXMgbW9kdWxlIGhhcyBhdmFpbGFibGUKLSAqLwotCi1zdGF0aWMgaW50IG1hZ2ljX2ZpbmRfY3QocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IHJlc3VsdDsKLSAgICBtYWdpY19zZXJ2ZXJfY29uZmlnX3JlYyAqY29uZjsKLQotICAgIC8qIHRoZSBmaWxlIGhhcyB0byBleGlzdCAqLwotICAgIGlmIChyLT5maW5mby5zdF9tb2RlID09IDAgfHwgIXItPmZpbGVuYW1lKSB7Ci0JcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIC8qIHdhcyBzb21lb25lIGVsc2UgYWxyZWFkeSBoZXJlPyAqLwotICAgIGlmIChyLT5jb250ZW50X3R5cGUpIHsKLQlyZXR1cm4gREVDTElORUQ7Ci0gICAgfQotCi0gICAgY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgJm1pbWVfbWFnaWNfbW9kdWxlKTsKLSAgICBpZiAoIWNvbmYgfHwgIWNvbmYtPm1hZ2ljKSB7Ci0JcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIC8qIGluaXRpYWxpemUgcGVyLXJlcXVlc3QgaW5mbyAqLwotICAgIGlmICghbWFnaWNfc2V0X2NvbmZpZyhyKSkgewotCXJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICB9Ci0KLSAgICAvKiB0cnkgZXhjbHVkaW5nIGZpbGUtcmV2aXNpb24gc3VmZml4ZXMgKi8KLSAgICBpZiAocmV2aXNpb25fc3VmZml4KHIpICE9IDEpIHsKLQkvKiBwcm9jZXNzIGl0IGJhc2VkIG9uIHRoZSBmaWxlIGNvbnRlbnRzICovCi0JaWYgKChyZXN1bHQgPSBtYWdpY19wcm9jZXNzKHIpKSAhPSBPSykgewotCSAgICByZXR1cm4gcmVzdWx0OwotCX0KLSAgICB9Ci0KLSAgICAvKiBpZiB3ZSBoYXZlIGFueSByZXN1bHRzLCBwdXQgdGhlbSBpbiB0aGUgcmVxdWVzdCBzdHJ1Y3R1cmUgKi8KLSAgICByZXR1cm4gbWFnaWNfcnNsX3RvX3JlcXVlc3Qocik7Ci19Ci0KLS8qCi0gKiBBcGFjaGUgQVBJIG1vZHVsZSBpbnRlcmZhY2UKLSAqLwotCi1tb2R1bGUgbWltZV9tYWdpY19tb2R1bGUgPQotewotICAgIFNUQU5EQVJEX01PRFVMRV9TVFVGRiwKLSAgICBtYWdpY19pbml0LAkJCS8qIGluaXRpYWxpemVyICovCi0gICAgTlVMTCwJCQkvKiBkaXIgY29uZmlnIGNyZWF0b3IgKi8KLSAgICBOVUxMLAkJCS8qIGRpciBtZXJnZXIgLS0tIGRlZmF1bHQgaXMgdG8gb3ZlcnJpZGUgKi8KLSAgICBjcmVhdGVfbWFnaWNfc2VydmVyX2NvbmZpZywJLyogc2VydmVyIGNvbmZpZyAqLwotICAgIG1lcmdlX21hZ2ljX3NlcnZlcl9jb25maWcsCS8qIG1lcmdlIHNlcnZlciBjb25maWcgKi8KLSAgICBtaW1lX21hZ2ljX2NtZHMsCQkvKiBjb21tYW5kIHRhYmxlICovCi0gICAgTlVMTCwJCQkvKiBoYW5kbGVycyAqLwotICAgIE5VTEwsCQkJLyogZmlsZW5hbWUgdHJhbnNsYXRpb24gKi8KLSAgICBOVUxMLAkJCS8qIGNoZWNrX3VzZXJfaWQgKi8KLSAgICBOVUxMLAkJCS8qIGNoZWNrIGF1dGggKi8KLSAgICBOVUxMLAkJCS8qIGNoZWNrIGFjY2VzcyAqLwotICAgIG1hZ2ljX2ZpbmRfY3QsCQkvKiB0eXBlX2NoZWNrZXIgKi8KLSAgICBOVUxMLAkJCS8qIGZpeHVwcyAqLwotICAgIE5VTEwsCQkJLyogbG9nZ2VyICovCi0gICAgTlVMTCwJCQkvKiBoZWFkZXIgcGFyc2VyICovCi0gICAgTlVMTCwJCQkvKiBjaGlsZF9pbml0ICovCi0gICAgTlVMTCwJCQkvKiBjaGlsZF9leGl0ICovCi0gICAgTlVMTAkJCS8qIHBvc3QgcmVhZC1yZXF1ZXN0ICovCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfbWltZV9tYWdpYy5kc3AgYi9tb2R1bGVzL21ldGFkYXRhL21vZF9taW1lX21hZ2ljLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgzMWFlNC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21ldGFkYXRhL21vZF9taW1lX21hZ2ljLmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9Im1vZF9taW1lX21hZ2ljIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDIKLQotQ0ZHPW1vZF9taW1lX21hZ2ljIC0gV2luMzIgUmVsZWFzZQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJtb2RfbWltZV9tYWdpYy5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIm1vZF9taW1lX21hZ2ljLm1hayIgQ0ZHPSJtb2RfbWltZV9tYWdpYyAtIFdpbjMyIFJlbGVhc2UiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAibW9kX21pbWVfbWFnaWMgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFICJtb2RfbWltZV9tYWdpYyAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwCi0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotTVRMPW1pZGwuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9taW1lX21hZ2ljIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvSSAiLi5cLi5caW5jbHVkZSIgL0kgIi4uXC4uXG9zXHdpbjMyIiAvSSAiLi5cLi5cc3JjbGliXGFwclxpbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci11dGlsL2luY2x1ZGUiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRmQiUmVsZWFzZVxtb2RfbWltZV9tYWdpYyIgL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgd3MyXzMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYXAgL21hY2hpbmU6STM4NiAvb3V0OiJSZWxlYXNlL21vZF9taW1lX21hZ2ljLnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF9taW1lX21hZ2ljCi0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIHdzMl8zMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9tYWNoaW5lOkkzODYgL291dDoiUmVsZWFzZS9tb2RfbWltZV9tYWdpYy5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfbWltZV9tYWdpYwotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibW9kX21pbWVfbWFnaWMgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aaSAvT2QgL0kgIi4uXC4uXGluY2x1ZGUiIC9JICIuLlwuLlxvc1x3aW4zMiIgL0kgIi4uXC4uXHNyY2xpYlxhcHJcaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHItdXRpbC9pbmNsdWRlIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0ZkIkRlYnVnXG1vZF9taW1lX21hZ2ljIiAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB3czJfMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2luY3JlbWVudGFsOm5vIC9tYXAgL2RlYnVnIC9tYWNoaW5lOkkzODYgL291dDoiRGVidWcvbW9kX21pbWVfbWFnaWMuc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX21pbWVfbWFnaWMKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgd3MyXzMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9pbmNyZW1lbnRhbDpubyAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6IkRlYnVnL21vZF9taW1lX21hZ2ljLnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF9taW1lX21hZ2ljCi0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJtb2RfbWltZV9tYWdpYyAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgIm1vZF9taW1lX21hZ2ljIC0gV2luMzIgRGVidWciCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZF9taW1lX21hZ2ljLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZF9taW1lX21hZ2ljLnJjCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9taW1lX21hZ2ljIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBDcmVhdGluZyBWZXJzaW9uIFJlc291cmNlCi1JbnB1dFBhdGg9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSIuXG1vZF9taW1lX21hZ2ljLnJjIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCWF3ayAtZiAuLi8uLi9idWlsZC93aW4zMi93aW4zMnZlci5hd2sgbW9kX21pbWVfbWFnaWMgICJtaW1lX21hZ2ljX21vZHVsZSBmb3IgQXBhY2hlIiAuLi8uLi9pbmNsdWRlL2FwX3JlbGVhc2UuaCAgPiAuXG1vZF9taW1lX21hZ2ljLnJjCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibW9kX21pbWVfbWFnaWMgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBDcmVhdGluZyBWZXJzaW9uIFJlc291cmNlCi1JbnB1dFBhdGg9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSIuXG1vZF9taW1lX21hZ2ljLnJjIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCWF3ayAtZiAuLi8uLi9idWlsZC93aW4zMi93aW4zMnZlci5hd2sgbW9kX21pbWVfbWFnaWMgICJtaW1lX21hZ2ljX21vZHVsZSBmb3IgQXBhY2hlIiAuLi8uLi9pbmNsdWRlL2FwX3JlbGVhc2UuaCAgPiAuXG1vZF9taW1lX21hZ2ljLnJjCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX21pbWVfbWFnaWMuZXhwIGIvbW9kdWxlcy9tZXRhZGF0YS9tb2RfbWltZV9tYWdpYy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMDY4YTQuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfbWltZV9tYWdpYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1taW1lX21hZ2ljX21vZHVsZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tZXRhZGF0YS9tb2Rfc2V0ZW52aWYuYyBiL21vZHVsZXMvbWV0YWRhdGEvbW9kX3NldGVudmlmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZWVmMGEuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tZXRhZGF0YS9tb2Rfc2V0ZW52aWYuYworKysgL2Rldi9udWxsCkBAIC0xLDQyMyArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVQnUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogbW9kX3NldGVudmlmLmMKLSAqIFNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYmFzZWQgb24gbWF0Y2hpbmcgcmVxdWVzdCBoZWFkZXJzIG9yCi0gKiBhdHRyaWJ1dGVzIGFnYWluc3QgcmVnZXggc3RyaW5ncwotICogCi0gKiBQYXVsIFN1dHRvbiA8cGF1bEB1a3dlYi5jb20+IDI3IE9jdCAxOTk2Ci0gKiBCYXNlZCBvbiBtb2RfYnJvd3NlciBieSBBbGV4ZWkgS29zdXQgPGFrb3N1dEBvcmdhbmljLmNvbT4KLSAqLwotCi0vKgotICogVXNlZCB0byBzZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJhc2VkIG9uIHRoZSBpbmNvbWluZyByZXF1ZXN0IGhlYWRlcnMsCi0gKiBvciBzb21lIHNlbGVjdGVkIG90aGVyIGF0dHJpYnV0ZXMgb2YgdGhlIHJlcXVlc3QgKGUuZy4sIHRoZSByZW1vdGUgaG9zdAotICogbmFtZSkuCi0gKgotICogVXNhZ2U6Ci0gKgotICogICBTZXRFbnZJZiBuYW1lIHJlZ2V4IHZhciAuLi4KLSAqCi0gKiB3aGVyZSBuYW1lIGlzIGVpdGhlciBhIEhUVFAgcmVxdWVzdCBoZWFkZXIgbmFtZSwgb3Igb25lIG9mIHRoZQotICogc3BlY2lhbCB2YWx1ZXMgKHNlZSBiZWxvdykuIFRoZSAndmFsdWUnIG9mIHRoZSBoZWFkZXIgKG9yIHRoZQotICogdmFsdWUgb2YgdGhlIHNwZWNpYWwgdmFsdWUgZnJvbSBiZWxvdykgYXJlIGNvbXBhcmVkIGFnYWluc3QgdGhlCi0gKiByZWdleCBhcmd1bWVudC4gSWYgdGhpcyBpcyBhIHNpbXBsZSBzdHJpbmcsIGEgc2ltcGxlIHN1Yi1zdHJpbmcKLSAqIG1hdGNoIGlzIHBlcmZvcm1lZC4gT3RoZXJ3aXNlLCBhIHJlcXVlc3QgZXhwcmVzc2lvbiBtYXRjaCBpcwotICogZG9uZS4gSWYgdGhlIHZhbHVlIG1hdGNoZXMgdGhlIHN0cmluZyBvciByZWd1bGFyIGV4cHJlc3Npb24sIHRoZQotICogZW52aXJvbm1lbnQgdmFyaWFibGVzIGxpc3RlZCBhcyB2YXIgLi4uIGFyZSBzZXQuIEVhY2ggdmFyIGNhbiAKLSAqIGJlIGluIG9uZSBvZiB0aHJlZSBmb3JtYXRzOiB2YXIsIHdoaWNoIHNldHMgdGhlIG5hbWVkIHZhcmlhYmxlCi0gKiAodGhlIHZhbHVlIHZhbHVlICIxIik7IHZhcj12YWx1ZSwgd2hpY2ggc2V0cyB0aGUgdmFyaWFibGUgdG8KLSAqIHRoZSBnaXZlbiB2YWx1ZTsgb3IgIXZhciwgd2hpY2ggdW5zZXRzIHRoZSB2YXJpYWJsZSBpcyBpdCBoYXMKLSAqIGJlZW4gcHJldmlvdXNseSBzZXQuCi0gKgotICogTm9ybWFsbHkgdGhlIHN0cmluZ3MgYXJlIGNvbXBhcmVkIHdpdGggcmVnYXJkIHRvIGNhc2UuIFRvIGlnbm9yZQotICogY2FzZSwgdXNlIHRoZSBkaXJlY3RpdmUgU2V0RW52SWZOb0Nhc2UgaW5zdGVhZC4KLSAqCi0gKiBTcGVjaWFsIHZhbHVlcyBmb3IgJ25hbWUnIGFyZToKLSAqCi0gKiAgIHJlbW90ZV9ob3N0ICAgICAgICBSZW1vdGUgaG9zdCBuYW1lIChpZiBhdmFpbGFibGUpCi0gKiAgIHJlbW90ZV9hZGRyICAgICAgICBSZW1vdGUgSVAgYWRkcmVzcwotICogICByZW1vdGVfdXNlciAgICAgICAgUmVtb3RlIGF1dGhlbnRpY2F0ZWQgdXNlciAoaWYgYW55KQotICogICByZXF1ZXN0X21ldGhvZCAgICAgUmVxdWVzdCBtZXRob2QgKEdFVCwgUE9TVCwgZXRjKQotICogICByZXF1ZXN0X3VyaSAgICAgICAgUmVxdWVzdGVkIFVSSQotICoKLSAqIEV4YW1wbGVzOgotICoKLSAqIFRvIHNldCB0aGUgZW52aXJvbWVudCB2YXJpYWJsZSBMT0NBTEhPU1QgaWYgdGhlIGNsaWVudCBpcyB0aGUgbG9jYWwKLSAqIG1hY2hpbmU6Ci0gKgotICogICAgU2V0RW52SWYgcmVtb3RlX2FkZHIgMTI3LjAuMC4xIExPQ0FMSE9TVAotICoKLSAqIFRvIHNldCBMT0NBTCBpZiB0aGUgY2xpZW50IGlzIHRoZSBsb2NhbCBob3N0LCBvciB3aXRoaW4gb3VyIGNvbXBhbnkncwotICogZG9tYWluICgxOTIuMTY4LjEwKToKLSAqCi0gKiAgICBTZXRFbnZJZiByZW1vdGVfYWRkciAxOTIuMTY4LjEwLiBMT0NBTAotICogICAgU2V0RW52SWYgcmVtb3RlX2FkZHIgMTI3LjAuMC4xICAgTE9DQUxIT1NUCi0gKgotICogVGhpcyBjb3VsZCBiZSB3cml0dGVuIGFzOgotICoKLSAqICAgIFNldEVudklmIHJlbW90ZV9hZGRyICgxMjcuMC4wLjF8MTkyLjE2OC4xMC4pIExPQ0FMCi0gKi8KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotCi1lbnVtIHNwZWNpYWwgewotICAgIFNQRUNJQUxfTk9ULAotICAgIFNQRUNJQUxfUkVNT1RFX0FERFIsCi0gICAgU1BFQ0lBTF9SRU1PVEVfSE9TVCwKLSAgICBTUEVDSUFMX1JFTU9URV9VU0VSLAotICAgIFNQRUNJQUxfUkVRVUVTVF9VUkksCi0gICAgU1BFQ0lBTF9SRVFVRVNUX01FVEhPRCwKLSAgICBTUEVDSUFMX1JFUVVFU1RfUFJPVE9DT0wKLX07Ci10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAgIC8qIGhlYWRlciBuYW1lICovCi0gICAgY2hhciAqcmVnZXg7ICAgICAgICAgICAgICAgIC8qIHJlZ2V4IHRvIG1hdGNoIGFnYWluc3QgKi8KLSAgICByZWdleF90ICpwcmVnOyAgICAgICAgICAgICAgLyogY29tcGlsZWQgcmVnZXggKi8KLSAgICB0YWJsZSAqZmVhdHVyZXM7ICAgICAgICAgICAgLyogZW52IHZhcnMgdG8gc2V0IChvciB1bnNldCkgKi8KLSAgICBFTlVNX0JJVEZJRUxEKCAgICAgICAgICAgICAgLyogaXMgaXQgYSAic3BlY2lhbCIgaGVhZGVyID8gKi8KLQllbnVtIHNwZWNpYWwsCi0Jc3BlY2lhbF90eXBlLDQpOwotICAgIHVuc2lnbmVkIGljYXNlIDogMTsJCS8qIGlnbm9yaW5nIGNhc2U/ICovCi19IHNlaV9lbnRyeTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGFycmF5X2hlYWRlciAqY29uZGl0aW9uYWxzOwotfSBzZWlfY2ZnX3JlYzsKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIHNldGVudmlmX21vZHVsZTsKLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9zZXRlbnZpZl9jb25maWcocG9vbCAqcCwgc2VydmVyX3JlYyAqZHVtbXkpCi17Ci0gICAgc2VpX2NmZ19yZWMgKm5ldyA9IChzZWlfY2ZnX3JlYyAqKSBhcF9wYWxsb2MocCwgc2l6ZW9mKHNlaV9jZmdfcmVjKSk7Ci0KLSAgICBuZXctPmNvbmRpdGlvbmFscyA9IGFwX21ha2VfYXJyYXkocCwgMjAsIHNpemVvZihzZWlfZW50cnkpKTsKLSAgICByZXR1cm4gKHZvaWQgKikgbmV3OwotfQotCi1zdGF0aWMgdm9pZCAqbWVyZ2Vfc2V0ZW52aWZfY29uZmlnKHBvb2wgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICpvdmVycmlkZXN2KQotewotICAgIHNlaV9jZmdfcmVjICphID0gYXBfcGNhbGxvYyhwLCBzaXplb2Yoc2VpX2NmZ19yZWMpKTsKLSAgICBzZWlfY2ZnX3JlYyAqYmFzZSA9IGJhc2V2LCAqb3ZlcnJpZGVzID0gb3ZlcnJpZGVzdjsKLQotICAgIGEtPmNvbmRpdGlvbmFscyA9IGFwX2FwcGVuZF9hcnJheXMocCwgYmFzZS0+Y29uZGl0aW9uYWxzLAotCQkJCSAgICAgICBvdmVycmlkZXMtPmNvbmRpdGlvbmFscyk7Ci0gICAgcmV0dXJuIGE7Ci19Ci0KLS8qIGFueSBub24tTlVMTCBtYWdpYyBjb25zdGFudCB3aWxsIGRvLi4uIHVzZWQgdG8gaW5kaWNhdGUgaWYgUkVHX0lDQVNFIHNob3VsZAotICogYmUgdXNlZAotICovCi0jZGVmaW5lIElDQVNFX01BR0lDCSgodm9pZCAqKSgmc2V0ZW52aWZfbW9kdWxlKSkKLQotc3RhdGljIGNvbnN0IGNoYXIgKmFkZF9zZXRlbnZpZl9jb3JlKGNtZF9wYXJtcyAqY21kLCB2b2lkICptY29uZmlnLAotCQkJCSAgICAgY2hhciAqZm5hbWUsIGNvbnN0IGNoYXIgKmFyZ3MpCi17Ci0gICAgY2hhciAqcmVnZXg7Ci0gICAgY29uc3QgY2hhciAqZmVhdHVyZTsKLSAgICBzZWlfY2ZnX3JlYyAqc2NvbmYgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhjbWQtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywKLQkJCQkJICAgICAgJnNldGVudmlmX21vZHVsZSk7Ci0gICAgc2VpX2VudHJ5ICpuZXcsICplbnRyaWVzID0gKHNlaV9lbnRyeSAqKSBzY29uZi0+Y29uZGl0aW9uYWxzLT5lbHRzOwotICAgIGNoYXIgKnZhcjsKLSAgICBpbnQgaTsKLSAgICBpbnQgYmVlbmhlcmUgPSAwOwotICAgIHVuc2lnbmVkIGljYXNlOwotCi0gICAgLyogZ2V0IHJlZ2V4ICovCi0gICAgcmVnZXggPSBhcF9nZXR3b3JkX2NvbmYoY21kLT5wb29sLCAmYXJncyk7Ci0gICAgaWYgKCEqcmVnZXgpIHsKLSAgICAgICAgcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCAiTWlzc2luZyByZWd1bGFyIGV4cHJlc3Npb24gZm9yICIsCi0JCQkgIGNtZC0+Y21kLT5uYW1lLCBOVUxMKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIElmIHdlJ3ZlIGFscmVhZHkgZ290IGEgc2VpX2VudHJ5IHdpdGggdGhlIHNhbWUgbmFtZSB3ZSB3YW50IHRvCi0gICAgICoganVzdCBjb3B5IHRoZSBuYW1lIHBvaW50ZXIuLi4gc28gdGhhdCBsYXRlciBvbiB3ZSBjYW4gY29tcGFyZQotICAgICAqIHR3byBoZWFkZXIgbmFtZXMganVzdCBieSBjb21wYXJpbmcgdGhlIHBvaW50ZXJzLgotICAgICAqLwotCi0gICAgZm9yIChpID0gMDsgaSA8IHNjb25mLT5jb25kaXRpb25hbHMtPm5lbHRzOyArK2kpIHsKLSAgICAgICAgbmV3ID0gJmVudHJpZXNbaV07Ci0JaWYgKCFzdHJjYXNlY21wKG5ldy0+bmFtZSwgZm5hbWUpKSB7Ci0JICAgIGZuYW1lID0gbmV3LT5uYW1lOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gICAgLyogaWYgdGhlIGxhc3QgZW50cnkgaGFzIGFuIGlkZW50aWFsIGhlYWRlcm5hbWUgYW5kIHJlZ2V4IHRoZW4KLSAgICAgKiBtZXJnZSB3aXRoIGl0Ci0gICAgICovCi0gICAgaSA9IHNjb25mLT5jb25kaXRpb25hbHMtPm5lbHRzIC0gMTsKLSAgICBpY2FzZSA9IGNtZC0+aW5mbyA9PSBJQ0FTRV9NQUdJQzsKLSAgICBpZiAoaSA8IDAKLQl8fCBlbnRyaWVzW2ldLm5hbWUgIT0gZm5hbWUKLQl8fCBlbnRyaWVzW2ldLmljYXNlICE9IGljYXNlCi0JfHwgc3RyY21wKGVudHJpZXNbaV0ucmVnZXgsIHJlZ2V4KSkgewotCi0JLyogbm8gbWF0Y2gsIGNyZWF0ZSBhIG5ldyBlbnRyeSAqLwotCi0JbmV3ID0gYXBfcHVzaF9hcnJheShzY29uZi0+Y29uZGl0aW9uYWxzKTsKLQluZXctPm5hbWUgPSBmbmFtZTsKLQluZXctPnJlZ2V4ID0gcmVnZXg7Ci0JbmV3LT5pY2FzZSA9IGljYXNlOwotCW5ldy0+cHJlZyA9IGFwX3ByZWdjb21wKGNtZC0+cG9vbCwgcmVnZXgsCi0JCQkJKFJFR19FWFRFTkRFRCB8IFJFR19OT1NVQgotCQkJCSB8IChpY2FzZSA/IFJFR19JQ0FTRSA6IDApKSk7Ci0JaWYgKG5ldy0+cHJlZyA9PSBOVUxMKSB7Ci0JICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgY21kLT5jbWQtPm5hbWUsCi0JCQkgICAgICAiIHJlZ2V4IGNvdWxkIG5vdCBiZSBjb21waWxlZC4iLCBOVUxMKTsKLQl9Ci0JbmV3LT5mZWF0dXJlcyA9IGFwX21ha2VfdGFibGUoY21kLT5wb29sLCAyKTsKLQotCWlmICghc3RyY2FzZWNtcChmbmFtZSwgInJlbW90ZV9hZGRyIikpIHsKLQkgICAgbmV3LT5zcGVjaWFsX3R5cGUgPSBTUEVDSUFMX1JFTU9URV9BRERSOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcChmbmFtZSwgInJlbW90ZV9ob3N0IikpIHsKLQkgICAgbmV3LT5zcGVjaWFsX3R5cGUgPSBTUEVDSUFMX1JFTU9URV9IT1NUOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcChmbmFtZSwgInJlbW90ZV91c2VyIikpIHsKLQkgICAgbmV3LT5zcGVjaWFsX3R5cGUgPSBTUEVDSUFMX1JFTU9URV9VU0VSOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcChmbmFtZSwgInJlcXVlc3RfdXJpIikpIHsKLQkgICAgbmV3LT5zcGVjaWFsX3R5cGUgPSBTUEVDSUFMX1JFUVVFU1RfVVJJOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcChmbmFtZSwgInJlcXVlc3RfbWV0aG9kIikpIHsKLQkgICAgbmV3LT5zcGVjaWFsX3R5cGUgPSBTUEVDSUFMX1JFUVVFU1RfTUVUSE9EOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcChmbmFtZSwgInJlcXVlc3RfcHJvdG9jb2wiKSkgewotCSAgICBuZXctPnNwZWNpYWxfdHlwZSA9IFNQRUNJQUxfUkVRVUVTVF9QUk9UT0NPTDsKLQl9Ci0JZWxzZSB7Ci0JICAgIG5ldy0+c3BlY2lhbF90eXBlID0gU1BFQ0lBTF9OT1Q7Ci0JfQotICAgIH0KLSAgICBlbHNlIHsKLQluZXcgPSAmZW50cmllc1tpXTsKLSAgICB9Ci0KLSAgICBmb3IgKCA7IDsgKSB7Ci0JZmVhdHVyZSA9IGFwX2dldHdvcmRfY29uZihjbWQtPnBvb2wsICZhcmdzKTsKLQlpZiAoISpmZWF0dXJlKSB7Ci0JICAgIGJyZWFrOwotCX0KLSAgICAgICAgYmVlbmhlcmUrKzsKLQotICAgICAgICB2YXIgPSBhcF9nZXR3b3JkKGNtZC0+cG9vbCwgJmZlYXR1cmUsICc9Jyk7Ci0gICAgICAgIGlmICgqZmVhdHVyZSkgewotICAgICAgICAgICAgYXBfdGFibGVfc2V0bihuZXctPmZlYXR1cmVzLCB2YXIsIGZlYXR1cmUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCp2YXIgPT0gJyEnKSB7Ci0gICAgICAgICAgICBhcF90YWJsZV9zZXRuKG5ldy0+ZmVhdHVyZXMsIHZhciArIDEsICIhIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhcF90YWJsZV9zZXRuKG5ldy0+ZmVhdHVyZXMsIHZhciwgIjEiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghYmVlbmhlcmUpIHsKLSAgICAgICAgcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCAiTWlzc2luZyBlbnZhcmlhYmxlIGV4cHJlc3Npb24gZm9yICIsCi0JCQkgIGNtZC0+Y21kLT5uYW1lLCBOVUxMKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmFkZF9zZXRlbnZpZihjbWRfcGFybXMgKmNtZCwgdm9pZCAqbWNvbmZpZywKLQkJCQljb25zdCBjaGFyICphcmdzKQotewotICAgIGNoYXIgKmZuYW1lOwotCi0gICAgLyogZ2V0IGhlYWRlciBuYW1lICovCi0gICAgZm5hbWUgPSBhcF9nZXR3b3JkX2NvbmYoY21kLT5wb29sLCAmYXJncyk7Ci0gICAgaWYgKCEqZm5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCAiTWlzc2luZyBoZWFkZXItZmllbGQgbmFtZSBmb3IgIiwKLQkJCSAgY21kLT5jbWQtPm5hbWUsIE5VTEwpOwotICAgIH0KLSAgICByZXR1cm4gYWRkX3NldGVudmlmX2NvcmUoY21kLCBtY29uZmlnLCBmbmFtZSwgYXJncyk7Ci19Ci0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgaGFuZGxlcyB0aGUgQnJvd3Nlck1hdGNoKiBkaXJlY3RpdmVzLiAgSXQgc2ltcGx5IHR1cm5zIGFyb3VuZAotICogYW5kIGZlZWRzIHRoZW0sIHdpdGggdGhlIGFwcHJvcHJpYXRlIGVtYmVsbGlzaG1lbnRzLCB0byB0aGUgZ2VuZXJhbC1wdXJwb3NlCi0gKiBjb21tYW5kIGhhbmRsZXIuCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICphZGRfYnJvd3NlcihjbWRfcGFybXMgKmNtZCwgdm9pZCAqbWNvbmZpZywgY29uc3QgY2hhciAqYXJncykKLXsKLSAgICByZXR1cm4gYWRkX3NldGVudmlmX2NvcmUoY21kLCBtY29uZmlnLCAiVXNlci1BZ2VudCIsIGFyZ3MpOwotfQotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgc2V0ZW52aWZfbW9kdWxlX2NtZHNbXSA9Ci17Ci0gICAgeyAiU2V0RW52SWYiLCBhZGRfc2V0ZW52aWYsIE5VTEwsCi0gICAgICBSU1JDX0NPTkYsIFJBV19BUkdTLCAiQSBoZWFkZXItbmFtZSwgcmVnZXggYW5kIGEgbGlzdCBvZiB2YXJpYWJsZXMuIiB9LAotICAgIHsgIlNldEVudklmTm9DYXNlIiwgYWRkX3NldGVudmlmLCBJQ0FTRV9NQUdJQywKLSAgICAgIFJTUkNfQ09ORiwgUkFXX0FSR1MsICJhIGhlYWRlci1uYW1lLCByZWdleCBhbmQgYSBsaXN0IG9mIHZhcmlhYmxlcy4iIH0sCi0gICAgeyAiQnJvd3Nlck1hdGNoIiwgYWRkX2Jyb3dzZXIsIE5VTEwsCi0gICAgICBSU1JDX0NPTkYsIFJBV19BUkdTLCAiQSBicm93c2VyIHJlZ2V4IGFuZCBhIGxpc3Qgb2YgdmFyaWFibGVzLiIgfSwKLSAgICB7ICJCcm93c2VyTWF0Y2hOb0Nhc2UiLCBhZGRfYnJvd3NlciwgSUNBU0VfTUFHSUMsCi0gICAgICBSU1JDX0NPTkYsIFJBV19BUkdTLCAiQSBicm93c2VyIHJlZ2V4IGFuZCBhIGxpc3Qgb2YgdmFyaWFibGVzLiIgfSwKLSAgICB7IE5VTEwgfSwKLX07Ci0KLXN0YXRpYyBpbnQgbWF0Y2hfaGVhZGVycyhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBzZXJ2ZXJfcmVjICpzID0gci0+c2VydmVyOwotICAgIHNlaV9jZmdfcmVjICpzY29uZjsKLSAgICBzZWlfZW50cnkgKmVudHJpZXM7Ci0gICAgdGFibGVfZW50cnkgKmVsdHM7Ci0gICAgY29uc3QgY2hhciAqdmFsOwotICAgIGludCBpLCBqOwotICAgIGNoYXIgKmxhc3RfbmFtZTsKLQotICAgIHNjb25mID0gKHNlaV9jZmdfcmVjICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsCi0JCQkJCQkgJnNldGVudmlmX21vZHVsZSk7Ci0gICAgZW50cmllcyA9IChzZWlfZW50cnkgKikgc2NvbmYtPmNvbmRpdGlvbmFscy0+ZWx0czsKLSAgICBsYXN0X25hbWUgPSBOVUxMOwotICAgIHZhbCA9IE5VTEw7Ci0gICAgZm9yIChpID0gMDsgaSA8IHNjb25mLT5jb25kaXRpb25hbHMtPm5lbHRzOyArK2kpIHsKLSAgICAgICAgc2VpX2VudHJ5ICpiID0gJmVudHJpZXNbaV07Ci0KLQkvKiBPcHRpbWl6ZSB0aGUgY2FzZSB3aGVyZSBhIGJ1bmNoIG9mIGRpcmVjdGl2ZXMgaW4gYSByb3cgdXNlIHRoZQotCSAqIHNhbWUgaGVhZGVyLiAgUmVtZW1iZXIgd2UgZG9uJ3QgbmVlZCB0byBzdHJjbXAgdGhlIHR3byBoZWFkZXIKLQkgKiBuYW1lcyBiZWNhdXNlIHdlIG1hZGUgc3VyZSB0aGUgcG9pbnRlcnMgd2VyZSBlcXVhbCBkdXJpbmcKLQkgKiBjb25maWd1cmF0aW9uLgotCSAqLwotCWlmIChiLT5uYW1lICE9IGxhc3RfbmFtZSkgewotCSAgICBsYXN0X25hbWUgPSBiLT5uYW1lOwotCSAgICBzd2l0Y2ggKGItPnNwZWNpYWxfdHlwZSkgewotCSAgICBjYXNlIFNQRUNJQUxfUkVNT1RFX0FERFI6Ci0JCXZhbCA9IHItPmNvbm5lY3Rpb24tPnJlbW90ZV9pcDsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgU1BFQ0lBTF9SRU1PVEVfSE9TVDoKLQkJdmFsID0gIGFwX2dldF9yZW1vdGVfaG9zdChyLT5jb25uZWN0aW9uLCByLT5wZXJfZGlyX2NvbmZpZywKLQkJCQkJICBSRU1PVEVfTkFNRSk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFNQRUNJQUxfUkVNT1RFX1VTRVI6Ci0JCXZhbCA9IHItPmNvbm5lY3Rpb24tPnVzZXI7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFNQRUNJQUxfUkVRVUVTVF9VUkk6Ci0JCXZhbCA9IHItPnVyaTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgU1BFQ0lBTF9SRVFVRVNUX01FVEhPRDoKLQkJdmFsID0gci0+bWV0aG9kOwotCQlicmVhazsKLQkgICAgY2FzZSBTUEVDSUFMX1JFUVVFU1RfUFJPVE9DT0w6Ci0JCXZhbCA9IHItPnByb3RvY29sOwotCQlicmVhazsKLQkgICAgY2FzZSBTUEVDSUFMX05PVDoKLQkJdmFsID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sIGItPm5hbWUpOwotCQlpZiAodmFsID09IE5VTEwpIHsKLQkJICAgIHZhbCA9IGFwX3RhYmxlX2dldChyLT5zdWJwcm9jZXNzX2VudiwgYi0+bmFtZSk7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIH0KLSAgICAgICAgfQotCi0JLyoKLQkgKiBBIE5VTEwgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIGhlYWRlciBmaWVsZCBvciBzcGVjaWFsIGVudGl0eQotCSAqIHdhc24ndCBwcmVzZW50IG9yIGlzIHVuZGVmaW5lZC4gIFJlcHJlc2VudCB0aGF0IGFzIGFuIGVtcHR5IHN0cmluZwotCSAqIHNvIHRoYXQgUkVzIGxpa2UgIl4kIiB3aWxsIHdvcmsgYW5kIGFsbG93IGVudmFyaWFibGUgc2V0dGluZwotCSAqIGJhc2VkIG9uIG1pc3Npbmcgb3IgZW1wdHkgZmllbGQuCi0JICovCi0gICAgICAgIGlmICh2YWwgPT0gTlVMTCkgewotICAgICAgICAgICAgdmFsID0gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWFwX3JlZ2V4ZWMoYi0+cHJlZywgdmFsLCAwLCBOVUxMLCAwKSkgewotCSAgICBhcnJheV9oZWFkZXIgKmFyciA9IGFwX3RhYmxlX2VsdHMoYi0+ZmVhdHVyZXMpOwotICAgICAgICAgICAgZWx0cyA9ICh0YWJsZV9lbnRyeSAqKSBhcnItPmVsdHM7Ci0KLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBhcnItPm5lbHRzOyArK2opIHsKLSAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChlbHRzW2pdLnZhbCwgIiEiKSkgewotICAgICAgICAgICAgICAgICAgICBhcF90YWJsZV91bnNldChyLT5zdWJwcm9jZXNzX2VudiwgZWx0c1tqXS5rZXkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXBfdGFibGVfc2V0bihyLT5zdWJwcm9jZXNzX2VudiwgZWx0c1tqXS5rZXksIGVsdHNbal0udmFsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gREVDTElORUQ7Ci19Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBzZXRlbnZpZl9tb2R1bGUgPQotewotICAgIFNUQU5EQVJEX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZXIgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogZGlyIGNvbmZpZyBjcmVhdGVyICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpciBtZXJnZXIgLS0tIGRlZmF1bHQgaXMgdG8gb3ZlcnJpZGUgKi8KLSAgICBjcmVhdGVfc2V0ZW52aWZfY29uZmlnLCAgICAgLyogc2VydmVyIGNvbmZpZyAqLwotICAgIG1lcmdlX3NldGVudmlmX2NvbmZpZywgICAgICAvKiBtZXJnZSBzZXJ2ZXIgY29uZmlncyAqLwotICAgIHNldGVudmlmX21vZHVsZV9jbWRzLCAgICAgICAvKiBjb21tYW5kIHRhYmxlICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGhhbmRsZXJzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGVuYW1lIHRyYW5zbGF0aW9uICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrX3VzZXJfaWQgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgYXV0aCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBhY2Nlc3MgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHlwZV9jaGVja2VyICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpeHVwcyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2dnZXIgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgaGVhZGVyIHBhcnNlICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoaWxkIChwcm9jZXNzKSBpbml0aWFsaXphdGlvbiAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGlsZCAocHJvY2VzcykgcnVuZG93biAqLwotICAgIG1hdGNoX2hlYWRlcnMgICAgICAgICAgICAgICAvKiBwb3N0X3JlYWRfcmVxdWVzdCAqLwotfTsKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX3NldGVudmlmLmRzcCBiL21vZHVsZXMvbWV0YWRhdGEvbW9kX3NldGVudmlmLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc3OWVjOC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21ldGFkYXRhL21vZF9zZXRlbnZpZi5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJtb2Rfc2V0ZW52aWYiIC0gUGFja2FnZSBPd25lcj08ND4KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDAKLSMgKiogRE8gTk9UIEVESVQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDEwMgotCi1DRkc9bW9kX3NldGVudmlmIC0gV2luMzIgUmVsZWFzZQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJtb2Rfc2V0ZW52aWYubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJtb2Rfc2V0ZW52aWYubWFrIiBDRkc9Im1vZF9zZXRlbnZpZiAtIFdpbjMyIFJlbGVhc2UiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAibW9kX3NldGVudmlmIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAibW9kX3NldGVudmlmIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1NVEw9bWlkbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAibW9kX3NldGVudmlmIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvSSAiLi4vLi4vaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHIvaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHItdXRpbC9pbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0ZkIlJlbGVhc2VcbW9kX3NldGVudmlmIiAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYXAgL21hY2hpbmU6STM4NiAvb3V0OiJSZWxlYXNlL21vZF9zZXRlbnZpZi5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2Rfc2V0ZW52aWYKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9tYWNoaW5lOkkzODYgL291dDoiUmVsZWFzZS9tb2Rfc2V0ZW52aWYuc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX3NldGVudmlmCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJtb2Rfc2V0ZW52aWYgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aaSAvT2QgL0kgIi4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9GZCJEZWJ1Z1xtb2Rfc2V0ZW52aWYiIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2luY3JlbWVudGFsOm5vIC9tYXAgL2RlYnVnIC9tYWNoaW5lOkkzODYgL291dDoiRGVidWcvbW9kX3NldGVudmlmLnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF9zZXRlbnZpZgotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9pbmNyZW1lbnRhbDpubyAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6IkRlYnVnL21vZF9zZXRlbnZpZi5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2Rfc2V0ZW52aWYKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIm1vZF9zZXRlbnZpZiAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgIm1vZF9zZXRlbnZpZiAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2Rfc2V0ZW52aWYuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kX3NldGVudmlmLnJjCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9zZXRlbnZpZiAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQ3JlYXRpbmcgVmVyc2lvbiBSZXNvdXJjZQotSW5wdXRQYXRoPS4uXC4uXGJ1aWxkXHdpbjMyXHdpbjMydmVyLmF3awotCi0iLlxtb2Rfc2V0ZW52aWYucmMiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JYXdrIC1mIC4uLy4uL2J1aWxkL3dpbjMyL3dpbjMydmVyLmF3ayBtb2Rfc2V0ZW52aWYgICJzZXRlbnZpZl9tb2R1bGUgZm9yIEFwYWNoZSIgLi4vLi4vaW5jbHVkZS9hcF9yZWxlYXNlLmggID4gLlxtb2Rfc2V0ZW52aWYucmMKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJtb2Rfc2V0ZW52aWYgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBDcmVhdGluZyBWZXJzaW9uIFJlc291cmNlCi1JbnB1dFBhdGg9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSIuXG1vZF9zZXRlbnZpZi5yYyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQlhd2sgLWYgLi4vLi4vYnVpbGQvd2luMzIvd2luMzJ2ZXIuYXdrIG1vZF9zZXRlbnZpZiAgInNldGVudmlmX21vZHVsZSBmb3IgQXBhY2hlIiAuLi8uLi9pbmNsdWRlL2FwX3JlbGVhc2UuaCAgPiAuXG1vZF9zZXRlbnZpZi5yYwotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9tb2R1bGVzL21ldGFkYXRhL21vZF9zZXRlbnZpZi5leHAgYi9tb2R1bGVzL21ldGFkYXRhL21vZF9zZXRlbnZpZi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMzgwMGUuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tZXRhZGF0YS9tb2Rfc2V0ZW52aWYuZXhwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc2V0ZW52aWZfbW9kdWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL21ldGFkYXRhL21vZF91bmlxdWVfaWQuYyBiL21vZHVsZXMvbWV0YWRhdGEvbW9kX3VuaXF1ZV9pZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzQ3NGVkLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX3VuaXF1ZV9pZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogbW9kX3VuaXF1ZV9pZC5jOiBnZW5lcmF0ZSBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBlYWNoIHJlcXVlc3QKLSAqCi0gKiBPcmlnaW5hbCBhdXRob3I6IERlYW4gR2F1ZGV0IDxkZ2F1ZGV0QGFyY3RpYy5vcmc+Ci0gKiBVVWVuY29kaW5nIG1vZGlmaWVkIGJ5OiBBbHZhcm8gTWFydGluZXogRWNoZXZhcnJpYSA8YWx2YXJvQGxhbmRlci5lcz4KLSAqLwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAibXVsdGl0aHJlYWQuaCIKLQotI2lmZGVmIE1VTFRJVEhSRUFECi0jZXJyb3Igc29ycnkgdGhpcyBtb2R1bGUgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXRocmVhZGVkIHNlcnZlcnMgeWV0Ci0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVuc2lnbmVkIGludCBzdGFtcDsKLSAgICB1bnNpZ25lZCBpbnQgaW5fYWRkcjsKLSAgICB1bnNpZ25lZCBpbnQgcGlkOwotICAgIHVuc2lnbmVkIHNob3J0IGNvdW50ZXI7Ci19IHVuaXF1ZV9pZF9yZWM7Ci0KLS8qIENvbW1lbnRzOgotICoKLSAqIFdlIHdhbnQgYW4gaWRlbnRpZmllciB3aGljaCBpcyB1bmlxdWUgYWNyb3NzIGFsbCBoaXRzLCBldmVyeXdoZXJlLgotICogImV2ZXJ5d2hlcmUiIGluY2x1ZGVzIG11bHRpcGxlIGh0dHBkIGluc3RhbmNlcyBvbiB0aGUgc2FtZSBtYWNoaW5lLCBvciBvbgotICogbXVsdGlwbGUgbWFjaGluZXMuICBFc3NlbnRpYWxseSAiZXZlcnl3aGVyZSIgc2hvdWxkIGluY2x1ZGUgYWxsIHBvc3NpYmxlCi0gKiBodHRwZHMgYWNyb3NzIGFsbCBzZXJ2ZXJzIGF0IGEgcGFydGljdWxhciAic2l0ZSIuICBXZSBtYWtlIHNvbWUgYXNzdW1wdGlvbnMKLSAqIHRoYXQgaWYgdGhlIHNpdGUgaGFzIGEgY2x1c3RlciBvZiBtYWNoaW5lcyB0aGVuIHRoZWlyIHRpbWUgaXMgcmVsYXRpdmVseQotICogc3luY2hyb25pemVkLiAgV2UgYWxzbyBhc3N1bWUgdGhhdCB0aGUgZmlyc3QgYWRkcmVzcyByZXR1cm5lZCBieSBhCi0gKiBnZXRob3N0YnluYW1lIChnZXRob3N0bmFtZSgpKSBpcyB1bmlxdWUgYWNyb3NzIGFsbCB0aGUgbWFjaGluZXMgYXQgdGhlCi0gKiAic2l0ZSIuCi0gKgotICogV2UgYWxzbyBmdXJ0aGVyIGFzc3VtZSB0aGF0IHBpZHMgZml0IGluIDMyLWJpdHMuICBJZiBzb21ldGhpbmcgdXNlcyBtb3JlCi0gKiB0aGFuIDMyLWJpdHMsIHRoZSBmaXggaXMgdHJpdmlhbCwgYnV0IGl0IHJlcXVpcmVzIHRoZSB1bnJvbGxlZCB1dWVuY29kaW5nCi0gKiBsb29wIHRvIGJlIGV4dGVuZGVkLiAgKiBBIHNpbWlsYXIgZml4IGlzIG5lZWRlZCB0byBzdXBwb3J0IG11bHRpdGhyZWFkZWQKLSAqIHNlcnZlcnMsIHVzaW5nIGEgcGlkL3RpZCBjb21iby4KLSAqCi0gKiBUb2dldGhlciwgdGhlIGluX2FkZHIgYW5kIHBpZCBhcmUgYXNzdW1lZCB0byBhYnNvbHV0ZWx5IHVuaXF1ZWx5IGlkZW50aWZ5Ci0gKiB0aGlzIG9uZSBjaGlsZCBmcm9tIGFsbCBvdGhlciBjdXJyZW50bHkgcnVubmluZyBjaGlsZHJlbiBvbiBhbGwgc2VydmVycwotICogKGluY2x1ZGluZyB0aGlzIHBoeXNpY2FsIHNlcnZlciBpZiBpdCBpcyBydW5uaW5nIG11bHRpcGxlIGh0dHBkcykgZnJvbSBlYWNoCi0gKiBvdGhlci4KLSAqCi0gKiBUaGUgc3RhbXAgYW5kIGNvdW50ZXIgYXJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYWxsIGhpdHMgZm9yIGEgcGFydGljdWxhcgotICogKGluX2FkZHIscGlkKSBwYWlyLiAgVGhlIHN0YW1wIGlzIHVwZGF0ZWQgdXNpbmcgci0+cmVxdWVzdF90aW1lLAotICogc2F2aW5nIGNwdSBjeWNsZXMuICBUaGUgY291bnRlciBpcyBuZXZlciByZXNldCwgYW5kIGlzIHVzZWQgdG8gcGVybWl0IHVwIHRvCi0gKiA2NGsgcmVxdWVzdHMgaW4gYSBzaW5nbGUgc2Vjb25kIGJ5IGEgc2luZ2xlIGNoaWxkLgotICoKLSAqIFRoZSAxMTItYml0cyBvZiB1bmlxdWVfaWRfcmVjIGFyZSBlbmNvZGVkIHVzaW5nIHRoZSBhbHBoYWJldAotICogW0EtWmEtejAtOUAtXSwgcmVzdWx0aW5nIGluIDE5IGJ5dGVzIG9mIHByaW50YWJsZSBjaGFyYWN0ZXJzLiAgVGhhdCBpcyB0aGVuCi0gKiBzdHVmZmVkIGludG8gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFVOSVFVRV9JRCBzbyB0aGF0IGl0IGlzIGF2YWlsYWJsZSB0bwotICogb3RoZXIgbW9kdWxlcy4gIFRoZSBhbHBoYWJldCBjaG9pY2UgZGlmZmVycyBmcm9tIG5vcm1hbCBiYXNlNjQgZW5jb2RpbmcKLSAqIFtBLVphLXowLTkrL10gYmVjYXVzZSArIGFuZCAvIGFyZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gVVJMcyBhbmQgd2Ugd2FudCB0bwotICogbWFrZSBpdCBlYXN5IHRvIHVzZSBVTklRVUVfSUQgaW4gVVJMcy4KLSAqCi0gKiBOb3RlIHRoYXQgVU5JUVVFX0lEIHNob3VsZCBiZSBjb25zaWRlcmVkIGFuIG9wYXF1ZSB0b2tlbiBieSBvdGhlcgotICogYXBwbGljYXRpb25zLiAgTm8gYXR0ZW1wdCBzaG91bGQgYmUgbWFkZSB0byBkaXNzZWN0IGl0cyBpbnRlcm5hbCBjb21wb25lbnRzLgotICogSXQgaXMgYW4gYWJzdHJhY3Rpb24gdGhhdCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUgYXMgdGhlIG5lZWRzIG9mIHRoaXMKLSAqIG1vZHVsZSBjaGFuZ2UuCi0gKgotICogSXQgaXMgaGlnaGx5IGRlc2lyYWJsZSB0aGF0IGlkZW50aWZpZXJzIGV4aXN0IGZvciAiZXRlcm5pdHkiLiAgQnV0IGZ1dHVyZQotICogbmVlZHMgKHN1Y2ggYXMgbXVjaCBmYXN0ZXIgd2Vic2VydmVycywgbW92aW5nIHRvIDY0LWJpdCBwaWRzLCBvciBtb3ZpbmcgdG8gYQotICogbXVsdGl0aHJlYWRlZCBzZXJ2ZXIpIG1heSBkaWN0YXRlIGEgbmVlZCB0byBjaGFuZ2UgdGhlIGNvbnRlbnRzIG9mCi0gKiB1bmlxdWVfaWRfcmVjLiAgU3VjaCBhIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgdGhlIGZpcnN0Ci0gKiBmaWVsZCBpcyBzdGlsbCBhIHRpbWVfdCBzdGFtcC4gIEJ5IGRvaW5nIHRoYXQsIGl0IGlzIHBvc3NpYmxlIGZvciBhIHNpdGUgdG8KLSAqIGhhdmUgYSAiZmxhZyBzZWNvbmQiIGluIHdoaWNoIHRoZXkgc3RvcCBhbGwgb2YgdGhlaXIgb2xkLWZvcm1hdCBzZXJ2ZXJzLAotICogd2FpdCBvbmUgZW50aXJlIHNlY29uZCwgYW5kIHRoZW4gc3RhcnQgYWxsIG9mIHRoZWlyIG5ldy1zZXJ2ZXJzLiAgVGhpcwotICogcHJvY2VkdXJlIHdpbGwgZW5zdXJlIHRoYXQgdGhlIG5ldyBzcGFjZSBvZiBpZGVudGlmaWVycyBpcyBjb21wbGV0ZWx5IHVuaXF1ZQotICogZnJvbSB0aGUgb2xkIHNwYWNlLiAgKFNpbmNlIHRoZSBmaXJzdCBmb3VyIHVuZW5jb2RlZCBieXRlcyBhbHdheXMgZGlmZmVyLikKLSAqLwotLyoKLSAqIFN1biBKdW4gIDcgMDU6NDM6NDkgQ0VTVCAxOTk4IC0tIEFsdmFybwotICogTW9yZSBjb21tZW50czoKLSAqIDEpIFRoZSBVVWVuY29kaW5nIHByb2RlY3VyZSBpcyBub3cgZG9uZSBpbiBhIGdlbmVyYWwgd2F5LCBhdm9pZGluZyB0aGUgcHJvYmxlbXMKLSAqIHdpdGggc2l6ZXMgYW5kIHBhZGRpbmdzIHRoYXQgY2FuIGFyaXNlIGRlcGVuZGluZyBvbiB0aGUgYXJjaGl0ZWN0dXJlLiBOb3cgdGhlCi0gKiBvZmZzZXRzIGFuZCBzaXplcyBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIHVuaXF1ZV9pZF9yZWMgc3RydWN0dXJlIGFyZSBjYWxjdWxhdGVkCi0gKiBpbiB1bmlxdWVfaWRfZ2xvYmFsX2luaXQ7IGFuZCB0aGVuIHVzZWQgdG8gZHVwbGljYXRlIHRoZSBzdHJ1Y3R1cmUgd2l0aG91dCB0aGUKLSAqIHBhZGRpbmdzIHRoYXQgbWlnaHQgZXhpc3QuIFRoZSBtdWx0aXRocmVhZGVkIHNlcnZlciBmaXggc2hvdWxkIGJlIG5vdyB2ZXJ5IGVhc3k6Ci0gKiBqdXN0IGFkZCBhIG5ldyAidGlkIiBmaWVsZCB0byB0aGUgdW5pcXVlX2lkX3JlYyBzdHJ1Y3R1cmUsIGFuZCBpbmNyZWFzZSBieSBvbmUKLSAqIFVOSVFVRV9JRF9SRUNfTUFYLgotICogMikgdW5pcXVlX2lkX3JlYy5zdGFtcCBoYXMgYmVlbiBjaGFuZ2VkIGZyb20gInRpbWVfdCIgdG8gInVuc2lnbmVkIGludCIsIGJlY2F1c2UKLSAqIGl0cyBzaXplIGlzIDY0Yml0cyBvbiBzb21lIHBsYXRmb3JtcyAobGludXgvYWxwaGEpLCBhbmQgdGhpcyBjYXVzZWQgcHJvYmxlbXMgd2l0aAotICogaHRvbmwvbnRvaGwuIFdlbGwsIHRoaXMgc2hvdWxkbid0IGJlIGEgcHJvYmxlbSB0aWxsIHllYXIgMjEwNi4KLSAqLwotCi1zdGF0aWMgdW5zaWduZWQgZ2xvYmFsX2luX2FkZHI7Ci0KLXN0YXRpYyBBUEFDSEVfVExTIHVuaXF1ZV9pZF9yZWMgY3VyX3VuaXF1ZV9pZDsKLQotLyoKLSAqIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc3RydWN0dXJlIHVuaXF1ZV9pZF9yZWMuCi0gKi8KLSNkZWZpbmUgVU5JUVVFX0lEX1JFQ19NQVggNAotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgdW5pcXVlX2lkX3JlY19vZmZzZXRbVU5JUVVFX0lEX1JFQ19NQVhdLAotICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZV9pZF9yZWNfc2l6ZVtVTklRVUVfSURfUkVDX01BWF0sCi0gICAgICAgICAgICAgICAgICAgICAgdW5pcXVlX2lkX3JlY190b3RhbF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZV9pZF9yZWNfc2l6ZV91dTsKLQotc3RhdGljIHZvaWQgdW5pcXVlX2lkX2dsb2JhbF9pbml0KHNlcnZlcl9yZWMgKnMsIHBvb2wgKnApCi17Ci0jaWZuZGVmIE1BWEhPU1ROQU1FTEVOCi0jZGVmaW5lIE1BWEhPU1ROQU1FTEVOIDI1NgotI2VuZGlmCi0gICAgY2hhciBzdHJbTUFYSE9TVE5BTUVMRU4gKyAxXTsKLSAgICBzdHJ1Y3QgaG9zdGVudCAqaGVudDsKLSNpZm5kZWYgTk9fR0VUVElNRU9GREFZCi0gICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0jZW5kaWYKLQotICAgIC8qCi0gICAgICogQ2FsY3VsYXRlIHRoZSBzaXplcyBhbmQgb2Zmc2V0cyBpbiBjdXJfdW5pcXVlX2lkLgotICAgICAqLwotICAgIHVuaXF1ZV9pZF9yZWNfb2Zmc2V0WzBdID0gWHRPZmZzZXRPZih1bmlxdWVfaWRfcmVjLCBzdGFtcCk7Ci0gICAgdW5pcXVlX2lkX3JlY19zaXplWzBdID0gc2l6ZW9mKGN1cl91bmlxdWVfaWQuc3RhbXApOwotICAgIHVuaXF1ZV9pZF9yZWNfb2Zmc2V0WzFdID0gWHRPZmZzZXRPZih1bmlxdWVfaWRfcmVjLCBpbl9hZGRyKTsKLSAgICB1bmlxdWVfaWRfcmVjX3NpemVbMV0gPSBzaXplb2YoY3VyX3VuaXF1ZV9pZC5pbl9hZGRyKTsKLSAgICB1bmlxdWVfaWRfcmVjX29mZnNldFsyXSA9IFh0T2Zmc2V0T2YodW5pcXVlX2lkX3JlYywgcGlkKTsKLSAgICB1bmlxdWVfaWRfcmVjX3NpemVbMl0gPSBzaXplb2YoY3VyX3VuaXF1ZV9pZC5waWQpOwotICAgIHVuaXF1ZV9pZF9yZWNfb2Zmc2V0WzNdID0gWHRPZmZzZXRPZih1bmlxdWVfaWRfcmVjLCBjb3VudGVyKTsKLSAgICB1bmlxdWVfaWRfcmVjX3NpemVbM10gPSBzaXplb2YoY3VyX3VuaXF1ZV9pZC5jb3VudGVyKTsKLSAgICB1bmlxdWVfaWRfcmVjX3RvdGFsX3NpemUgPSB1bmlxdWVfaWRfcmVjX3NpemVbMF0gKyB1bmlxdWVfaWRfcmVjX3NpemVbMV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZV9pZF9yZWNfc2l6ZVsyXSArIHVuaXF1ZV9pZF9yZWNfc2l6ZVszXTsKLQotICAgIC8qCi0gICAgICogQ2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgd2hlbiBlbmNvZGVkLgotICAgICAqLwotICAgIHVuaXF1ZV9pZF9yZWNfc2l6ZV91dSA9ICh1bmlxdWVfaWRfcmVjX3RvdGFsX3NpemUqOCs1KS82OwotCi0gICAgLyoKLSAgICAgKiBOb3cgZ2V0IHRoZSBnbG9iYWwgaW5fYWRkci4gIE5vdGUgdGhhdCBpdCBpcyBub3Qgc3VmZmljaWVudCB0byB1c2Ugb25lCi0gICAgICogb2YgdGhlIGFkZHJlc3NlcyBmcm9tIHRoZSBtYWluX3NlcnZlciwgc2luY2UgdGhvc2UgYXJlbid0IGFzIGxpa2VseSB0bwotICAgICAqIGJlIHVuaXF1ZSBhcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgbWFjaGluZQotICAgICAqLwotICAgIGlmIChnZXRob3N0bmFtZShzdHIsIHNpemVvZihzdHIpIC0gMSkgIT0gMCkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19BTEVSVCwgcywKLSAgICAgICAgICAiZ2V0aG9zdG5hbWU6IG1vZF91bmlxdWVfaWQgcmVxdWlyZXMgdGhlIGhvc3RuYW1lIG9mIHRoZSBzZXJ2ZXIiKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgc3RyW3NpemVvZihzdHIpIC0gMV0gPSAnXDAnOwotCi0gICAgaWYgKChoZW50ID0gZ2V0aG9zdGJ5bmFtZShzdHIpKSA9PSBOVUxMKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0FMRVJULCBzLAotICAgICAgICAgICAgICAgICAgICAibW9kX3VuaXF1ZV9pZDogdW5hYmxlIHRvIGdldGhvc3RieW5hbWUoXCIlc1wiKSIsIHN0cik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgZ2xvYmFsX2luX2FkZHIgPSAoKHN0cnVjdCBpbl9hZGRyICopIGhlbnQtPmhfYWRkcl9saXN0WzBdKS0+c19hZGRyOwotCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgcywKLSAgICAgICAgICAgICAgICAibW9kX3VuaXF1ZV9pZDogdXNpbmcgaXAgYWRkciAlcyIsCi0gICAgICAgICAgICAgICAgaW5ldF9udG9hKCooc3RydWN0IGluX2FkZHIgKikgaGVudC0+aF9hZGRyX2xpc3RbMF0pKTsKLQotICAgIC8qCi0gICAgICogSWYgdGhlIHNlcnZlciBpcyBwdW1tZWxsZWQgd2l0aCByZXN0YXJ0IHJlcXVlc3RzIHdlIGNvdWxkIHBvc3NpYmx5IGVuZAotICAgICAqIHVwIGluIGEgc2l0dWF0aW9uIHdoZXJlIHdlJ3JlIHN0YXJ0aW5nIGFnYWluIGR1cmluZyB0aGUgc2FtZSBzZWNvbmQKLSAgICAgKiB0aGF0IGhhcyBiZWVuIHVzZWQgaW4gcHJldmlvdXMgaWRlbnRpZmllcnMuICBBdm9pZCB0aGF0IHNpdHVhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBJbiB0cnV0aCwgZm9yIHRoaXMgdG8gYWN0dWFsbHkgaGFwcGVuIG5vdCBvbmx5IHdvdWxkIGl0IGhhdmUgdG8gcmVzdGFydAotICAgICAqIGluIHRoZSBzYW1lIHNlY29uZCwgYnV0IGl0IHdvdWxkIGhhdmUgdG8gc29tZWhvdyBnZXQgdGhlIHNhbWUgcGlkcyBhcwotICAgICAqIG9uZSBvZiB0aGUgb3RoZXIgc2VydmVycyB0aGF0IHdhcyBydW5uaW5nIGluIHRoYXQgc2Vjb25kLiBXaGljaCB3b3VsZAotICAgICAqIG1lYW4gYSA2NGsgd3JhcGFyb3VuZCBvbiBwaWRzIC4uLiBub3QgdmVyeSBsaWtlbHkgYXQgYWxsLgotICAgICAqIAotICAgICAqIEJ1dCBwcm90ZWN0aW5nIGFnYWluc3QgaXQgaXMgcmVsYXRpdmVseSBjaGVhcC4gIFdlIGp1c3Qgc2xlZXAgaW50byB0aGUKLSAgICAgKiBuZXh0IHNlY29uZC4KLSAgICAgKi8KLSNpZmRlZiBOT19HRVRUSU1FT0ZEQVkKLSAgICBzbGVlcCgxKTsKLSNlbHNlCi0gICAgaWYgKGdldHRpbWVvZmRheSgmdHYsIE5VTEwpID09IC0xKSB7Ci0gICAgICAgIHNsZWVwKDEpOwotICAgIH0KLSAgICBlbHNlIGlmICh0di50dl91c2VjKSB7Ci0gICAgICAgIHR2LnR2X3NlYyA9IDA7Ci0gICAgICAgIHR2LnR2X3VzZWMgPSAxMDAwMDAwIC0gdHYudHZfdXNlYzsKLSAgICAgICAgc2VsZWN0KDAsIE5VTEwsIE5VTEwsIE5VTEwsICZ0dik7Ci0gICAgfQotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIHVuaXF1ZV9pZF9jaGlsZF9pbml0KHNlcnZlcl9yZWMgKnMsIHBvb2wgKnApCi17Ci0gICAgcGlkX3QgcGlkOwotI2lmbmRlZiBOT19HRVRUSU1FT0ZEQVkKLSAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSNlbmRpZgotCi0gICAgLyoKLSAgICAgKiBOb3RlIHRoYXQgd2UgdXNlIHRoZSBwaWQgYmVjYXVzZSBpdCdzIHBvc3NpYmxlIHRoYXQgb24gdGhlIHNhbWUKLSAgICAgKiBwaHlzaWNhbCBtYWNoaW5lIHRoZXJlIGFyZSBtdWx0aXBsZSBzZXJ2ZXJzIChpLmUuIHVzaW5nIExpc3RlbikuIEJ1dAotICAgICAqIGl0J3MgZ3VhcmFudGVlZCB0aGF0IG5vbmUgb2YgdGhlbSB3aWxsIHNoYXJlIHRoZSBzYW1lIHBpZHMgYmV0d2VlbgotICAgICAqIGNoaWxkcmVuLgotICAgICAqIAotICAgICAqIFhYWDogZm9yIG11bHRpdGhyZWFkIHRoaXMgbmVlZHMgdG8gdXNlIGEgcGlkL3RpZCBjb21ibyBhbmQgcHJvYmFibHkKLSAgICAgKiBuZWVkcyB0byBiZSBleHBhbmRlZCB0byAzMiBiaXRzCi0gICAgICovCi0gICAgcGlkID0gZ2V0cGlkKCk7Ci0gICAgY3VyX3VuaXF1ZV9pZC5waWQgPSBwaWQ7Ci0KLSAgICAvKgotICAgICAqIFRlc3Qgb3VyIGFzc3VtcHRpb24gdGhhdCB0aGUgcGlkIGlzIDMyLWJpdHMuICBJdCdzIHBvc3NpYmxlIHRoYXQKLSAgICAgKiA2NC1iaXQgbWFjaGluZXMgd2lsbCBkZWNsYXJlIHBpZF90IHRvIGJlIDY0IGJpdHMgYnV0IG9ubHkgdXNlIDMyCi0gICAgICogb2YgdGhlbS4gIEl0IHdvdWxkIGhhdmUgYmVlbiByZWFsbHkgbmljZSB0byB0ZXN0IHRoaXMgZHVyaW5nCi0gICAgICogZ2xvYmFsX2luaXQgLi4uIGJ1dCBvaCB3ZWxsLgotICAgICAqLwotICAgIGlmIChjdXJfdW5pcXVlX2lkLnBpZCAhPSBwaWQpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfQ1JJVCwgcywKLSAgICAgICAgICAgICAgICAgICAgIm9oIG5vISBwaWRzIGFyZSBncmVhdGVyIHRoYW4gMzItYml0cyEgIEknbSBicm9rZW4hIik7Ci0gICAgfQotCi0gICAgY3VyX3VuaXF1ZV9pZC5pbl9hZGRyID0gZ2xvYmFsX2luX2FkZHI7Ci0KLSAgICAvKgotICAgICAqIElmIHdlIHVzZSAwIGFzIHRoZSBpbml0aWFsIGNvdW50ZXIgd2UgaGF2ZSBhIGxpdHRsZSBsZXNzIHByb3RlY3Rpb24KLSAgICAgKiBhZ2FpbnN0IHJlc3RhcnQgcHJvYmxlbXMsIGFuZCBhIGxpdHRsZSBsZXNzIHByb3RlY3Rpb24gYWdhaW5zdCBhIGNsb2NrCi0gICAgICogZ29pbmcgYmFja3dhcmRzIGluIHRpbWUuCi0gICAgICovCi0jaWZuZGVmIE5PX0dFVFRJTUVPRkRBWQotICAgIGlmIChnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKSA9PSAtMSkgewotICAgICAgICBjdXJfdW5pcXVlX2lkLmNvdW50ZXIgPSAwOwotICAgIH0KLSAgICBlbHNlIHsKLQkvKiBTb21lIHN5c3RlbXMgaGF2ZSB2ZXJ5IGxvdyB2YXJpYW5jZSBvbiB0aGUgbG93IGVuZCBvZiB0aGVpcgotCSAqIHN5c3RlbSBjb3VudGVyLCBkZWZlbmQgYWdhaW5zdCB0aGF0LgotCSAqLwotICAgICAgICBjdXJfdW5pcXVlX2lkLmNvdW50ZXIgPSB0di50dl91c2VjIC8gMTA7Ci0gICAgfQotI2Vsc2UKLSAgICBjdXJfdW5pcXVlX2lkLmNvdW50ZXIgPSAwOwotI2VuZGlmCi0KLSAgICAvKgotICAgICAqIFdlIG11c3QgYWx3YXlzIHVzZSBuZXR3b3JrIG9yZGVyaW5nIGZvciB0aGVzZSBieXRlcywgc28gdGhhdAotICAgICAqIGlkZW50aWZpZXJzIGFyZSBjb21wYXJhYmxlIGJldHdlZW4gbWFjaGluZXMgb2YgZGlmZmVyZW50IGJ5dGUKLSAgICAgKiBvcmRlcmluZ3MuICBOb3RlIGluX2FkZHIgaXMgYWxyZWFkeSBpbiBuZXR3b3JrIG9yZGVyLgotICAgICAqLwotICAgIGN1cl91bmlxdWVfaWQucGlkID0gaHRvbmwoY3VyX3VuaXF1ZV9pZC5waWQpOwotICAgIGN1cl91bmlxdWVfaWQuY291bnRlciA9IGh0b25zKGN1cl91bmlxdWVfaWQuY291bnRlcik7Ci19Ci0KLS8qIE5PVEU6IFRoaXMgaXMgKk5PVCogdGhlIHNhbWUgZW5jb2RpbmcgdXNlZCBieSBiYXNlNjRlbmNvZGUgLi4uIHRoZSBsYXN0IHR3bwotICogY2hhcmFjdGVycyBzaG91bGQgYmUgKyBhbmQgLy4gIEJ1dCB0aG9zZSB0d28gY2hhcmFjdGVycyBoYXZlIHZlcnkgc3BlY2lhbAotICogbWVhbmluZ3MgaW4gVVJMcywgYW5kIHdlIHdhbnQgdG8gbWFrZSBpdCBlYXN5IHRvIHVzZSBpZGVudGlmaWVycyBpbgotICogVVJMcy4gIFNvIHdlIHJlcGxhY2UgdGhlbSB3aXRoIEAgYW5kIC0uCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyIHV1ZW5jb2Rlcls2NF0gPSB7Ci0gICAgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywgJ0cnLCAnSCcsICdJJywgJ0onLCAnSycsICdMJywgJ00nLAotICAgICdOJywgJ08nLCAnUCcsICdRJywgJ1InLCAnUycsICdUJywgJ1UnLCAnVicsICdXJywgJ1gnLCAnWScsICdaJywKLSAgICAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicsICdrJywgJ2wnLCAnbScsCi0gICAgJ24nLCAnbycsICdwJywgJ3EnLCAncicsICdzJywgJ3QnLCAndScsICd2JywgJ3cnLCAneCcsICd5JywgJ3onLAotICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ0AnLCAnLScsCi19OwotCi1zdGF0aWMgaW50IGdlbl91bmlxdWVfaWQocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY2hhciAqc3RyOwotICAgIC8qCi0gICAgICogQnVmZmVyIHBhZGRlZCB3aXRoIHR3byBmaW5hbCBieXRlcywgdXNlZCB0byBjb3B5IHRoZSB1bmlxdWVfaWRfcmVkCi0gICAgICogc3RydWN0dXJlIHdpdGhvdXQgdGhlIGludGVybmFsIHBhZGRpbmdzIHRoYXQgaXQgY291bGQgaGF2ZS4KLSAgICAgKi8KLSAgICBzdHJ1Y3QgewotCXVuaXF1ZV9pZF9yZWMgZm9vOwotCXVuc2lnbmVkIGNoYXIgcGFkWzJdOwotICAgIH0gcGFkZGVkYnVmOwotICAgIHVuc2lnbmVkIGNoYXIgKngsKnk7Ci0gICAgdW5zaWduZWQgc2hvcnQgY291bnRlcjsKLSAgICBjb25zdCBjaGFyICplOwotICAgIGludCBpLGosazsKLQotICAgIC8qIGNvcHkgdGhlIHVuaXF1ZV9pZCBpZiB0aGlzIGlzIGFuIGludGVybmFsIHJlZGlyZWN0ICh3ZSdyZSBuZXZlcgotICAgICAqIGFjdHVhbGx5IGNhbGxlZCBmb3Igc3ViIHJlcXVlc3RzLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHRlc3QgZm9yCi0gICAgICogdGhlbSkgKi8KLSAgICBpZiAoci0+cHJldiAmJiAoZSA9IGFwX3RhYmxlX2dldChyLT5zdWJwcm9jZXNzX2VudiwgIlJFRElSRUNUX1VOSVFVRV9JRCIpKSkgewotCWFwX3RhYmxlX3NldG4oci0+c3VicHJvY2Vzc19lbnYsICJVTklRVUVfSUQiLCBlKTsKLQlyZXR1cm4gREVDTElORUQ7Ci0gICAgfQotCi0gICAgY3VyX3VuaXF1ZV9pZC5zdGFtcCA9IGh0b25sKCh1bnNpZ25lZCBpbnQpci0+cmVxdWVzdF90aW1lKTsKLQotICAgIC8qIHdlJ2xsIHVzZSBhIHRlbXBvcmFsIGJ1ZmZlciB0byBhdm9pZCB1dWVuY29kaW5nIHRoZSBwb3NzaWJsZSBpbnRlcm5hbAotICAgICAqIHBhZGRpbmdzIG9mIHRoZSBvcmlnaW5hbCBzdHJ1Y3R1cmUgKi8KLSAgICB4ID0gKHVuc2lnbmVkIGNoYXIgKikgJnBhZGRlZGJ1ZjsKLSAgICB5ID0gKHVuc2lnbmVkIGNoYXIgKikgJmN1cl91bmlxdWVfaWQ7Ci0gICAgayA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IFVOSVFVRV9JRF9SRUNfTUFYOyBpKyspIHsKLSAgICAgICAgeSA9ICgodW5zaWduZWQgY2hhciAqKSAmY3VyX3VuaXF1ZV9pZCkgKyB1bmlxdWVfaWRfcmVjX29mZnNldFtpXTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IHVuaXF1ZV9pZF9yZWNfc2l6ZVtpXTsgaisrLCBrKyspIHsKLSAgICAgICAgICAgIHhba10gPSB5W2pdOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qCi0gICAgICogV2UgcmVzZXQgdHdvIG1vcmUgYnl0ZXMganVzdCBpbiBjYXNlIHBhZGRpbmcgaXMgbmVlZGVkIGZvciB0aGUgdXVlbmNvZGluZy4KLSAgICAgKi8KLSAgICB4W2srK10gPSAnXDAnOwotICAgIHhbaysrXSA9ICdcMCc7Ci0gICAgCi0gICAgLyogYWxsb2Mgc3RyIGFuZCBkbyB0aGUgdXVlbmNvZGluZyAqLwotICAgIHN0ciA9IChjaGFyICopYXBfcGFsbG9jKHItPnBvb2wsIHVuaXF1ZV9pZF9yZWNfc2l6ZV91dSArIDEpOwotICAgIGsgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCB1bmlxdWVfaWRfcmVjX3RvdGFsX3NpemU7IGkgKz0gMykgewotICAgICAgICB5ID0geCArIGk7Ci0gICAgICAgIHN0cltrKytdID0gdXVlbmNvZGVyW3lbMF0gPj4gMl07Ci0gICAgICAgIHN0cltrKytdID0gdXVlbmNvZGVyWygoeVswXSAmIDB4MDMpIDw8IDQpIHwgKCh5WzFdICYgMHhmMCkgPj4gNCldOwotICAgICAgICBpZiAoayA9PSB1bmlxdWVfaWRfcmVjX3NpemVfdXUpIGJyZWFrOwotICAgICAgICBzdHJbaysrXSA9IHV1ZW5jb2RlclsoKHlbMV0gJiAweDBmKSA8PCAyKSB8ICgoeVsyXSAmIDB4YzApID4+IDYpXTsKLSAgICAgICAgaWYgKGsgPT0gdW5pcXVlX2lkX3JlY19zaXplX3V1KSBicmVhazsKLSAgICAgICAgc3RyW2srK10gPSB1dWVuY29kZXJbeVsyXSAmIDB4M2ZdOwotICAgIH0KLSAgICBzdHJbaysrXSA9ICdcMCc7Ci0KLSAgICAvKiBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlICovCi0gICAgYXBfdGFibGVfc2V0bihyLT5zdWJwcm9jZXNzX2VudiwgIlVOSVFVRV9JRCIsIHN0cik7Ci0KLSAgICAvKiBhbmQgaW5jcmVtZW50IHRoZSBpZGVudGlmaWVyIGZvciB0aGUgbmV4dCBjYWxsICovCi0gICAgY291bnRlciA9IG50b2hzKGN1cl91bmlxdWVfaWQuY291bnRlcikgKyAxOwotICAgIGN1cl91bmlxdWVfaWQuY291bnRlciA9IGh0b25zKGNvdW50ZXIpOwotCi0gICAgcmV0dXJuIERFQ0xJTkVEOwotfQotCi0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCB1bmlxdWVfaWRfbW9kdWxlID0gewotICAgIFNUQU5EQVJEX01PRFVMRV9TVFVGRiwKLSAgICB1bmlxdWVfaWRfZ2xvYmFsX2luaXQsICAgICAgLyogaW5pdGlhbGl6ZXIgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogZGlyIGNvbmZpZyBjcmVhdGVyICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpciBtZXJnZXIgLS0tIGRlZmF1bHQgaXMgdG8gb3ZlcnJpZGUgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogc2VydmVyIGNvbmZpZyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBtZXJnZSBzZXJ2ZXIgY29uZmlncyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21tYW5kIHRhYmxlICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGhhbmRsZXJzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGVuYW1lIHRyYW5zbGF0aW9uICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrX3VzZXJfaWQgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgYXV0aCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBhY2Nlc3MgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHlwZV9jaGVja2VyICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpeHVwcyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2dnZXIgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaGVhZGVyIHBhcnNlciAqLwotICAgIHVuaXF1ZV9pZF9jaGlsZF9pbml0LCAgICAgICAvKiBjaGlsZF9pbml0ICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoaWxkX2V4aXQgKi8KLSAgICBnZW5fdW5pcXVlX2lkICAgICAgICAgICAgICAgLyogcG9zdF9yZWFkX3JlcXVlc3QgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL21ldGFkYXRhL21vZF91bmlxdWVfaWQuZHNwIGIvbW9kdWxlcy9tZXRhZGF0YS9tb2RfdW5pcXVlX2lkLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0NWQyZi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21ldGFkYXRhL21vZF91bmlxdWVfaWQuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ibW9kX3VuaXF1ZV9pZCIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyCi0KLUNGRz1tb2RfdW5pcXVlX2lkIC0gV2luMzIgUmVsZWFzZQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJtb2RfdW5pcXVlX2lkLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAibW9kX3VuaXF1ZV9pZC5tYWsiIENGRz0ibW9kX3VuaXF1ZV9pZCAtIFdpbjMyIFJlbGVhc2UiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAibW9kX3VuaXF1ZV9pZCAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgIm1vZF91bmlxdWVfaWQgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLU1UTD1taWRsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJtb2RfdW5pcXVlX2lkIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvSSAiLi5cLi5caW5jbHVkZSIgL0kgIi4uXC4uXG9zXHdpbjMyIiAvSSAiLi5cLi5cc3JjbGliXGFwclxpbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci11dGlsL2luY2x1ZGUiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRmQiUmVsZWFzZVxtb2RfdW5pcXVlX2lkIiAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB3czJfMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvbWFjaGluZTpJMzg2IC9vdXQ6IlJlbGVhc2UvbW9kX3VuaXF1ZV9pZC5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfdW5pcXVlX2lkCi0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIHdzMl8zMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9tYWNoaW5lOkkzODYgL291dDoiUmVsZWFzZS9tb2RfdW5pcXVlX2lkLnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF91bmlxdWVfaWQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIm1vZF91bmlxdWVfaWQgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aaSAvT2QgL0kgIi4uXC4uXGluY2x1ZGUiIC9JICIuLlwuLlxvc1x3aW4zMiIgL0kgIi4uXC4uXHNyY2xpYlxhcHJcaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHItdXRpbC9pbmNsdWRlIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0ZkIkRlYnVnXG1vZF91bmlxdWVfaWQiIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHdzMl8zMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvaW5jcmVtZW50YWw6bm8gL21hcCAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJEZWJ1Zy9tb2RfdW5pcXVlX2lkLnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF91bmlxdWVfaWQKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgd3MyXzMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9pbmNyZW1lbnRhbDpubyAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6IkRlYnVnL21vZF91bmlxdWVfaWQuc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX3VuaXF1ZV9pZAotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAibW9kX3VuaXF1ZV9pZCAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgIm1vZF91bmlxdWVfaWQgLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kX3VuaXF1ZV9pZC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2RfdW5pcXVlX2lkLnJjCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIm1vZF91bmlxdWVfaWQgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIENyZWF0aW5nIFZlcnNpb24gUmVzb3VyY2UKLUlucHV0UGF0aD0uLlwuLlxidWlsZFx3aW4zMlx3aW4zMnZlci5hd2sKLQotIi5cbW9kX3VuaXF1ZV9pZC5yYyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQlhd2sgLWYgLi4vLi4vYnVpbGQvd2luMzIvd2luMzJ2ZXIuYXdrIG1vZF91bmlxdWVfaWQgICJ1bmlxdWVfaWRfbW9kdWxlIGZvciBBcGFjaGUiIC4uLy4uL2luY2x1ZGUvYXBfcmVsZWFzZS5oICA+IC5cbW9kX3VuaXF1ZV9pZC5yYwotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIm1vZF91bmlxdWVfaWQgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBDcmVhdGluZyBWZXJzaW9uIFJlc291cmNlCi1JbnB1dFBhdGg9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSIuXG1vZF91bmlxdWVfaWQucmMiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JYXdrIC1mIC4uLy4uL2J1aWxkL3dpbjMyL3dpbjMydmVyLmF3ayBtb2RfdW5pcXVlX2lkICAidW5pcXVlX2lkX21vZHVsZSBmb3IgQXBhY2hlIiAuLi8uLi9pbmNsdWRlL2FwX3JlbGVhc2UuaCAgPiAuXG1vZF91bmlxdWVfaWQucmMKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfdW5pcXVlX2lkLmV4cCBiL21vZHVsZXMvbWV0YWRhdGEvbW9kX3VuaXF1ZV9pZC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMDAwZjEuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfdW5pcXVlX2lkLmV4cAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXVuaXF1ZV9pZF9tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX3VzZXJ0cmFjay5jIGIvbW9kdWxlcy9tZXRhZGF0YS9tb2RfdXNlcnRyYWNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNTBlMTUuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfdXNlcnRyYWNrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qIFVzZXIgVHJhY2tpbmcgTW9kdWxlIChXYXMgbW9kX2Nvb2tpZXMuYykKLSAqCi0gKiBUaGlzIEFwYWNoZSBtb2R1bGUgaXMgZGVzaWduZWQgdG8gdHJhY2sgdXNlcnMgcGF0aHMgdGhyb3VnaCBhIHNpdGUuCi0gKiBJdCB1c2VzIHRoZSBjbGllbnQtc2lkZSBzdGF0ZSAoIkNvb2tpZSIpIHByb3RvY29sIGRldmVsb3BlZCBieSBOZXRzY2FwZS4KLSAqIEl0IGlzIGtub3duIHRvIHdvcmsgb24gTmV0c2NhcGUgYnJvd3NlcnMsIE1pY3Jvc29mdCBJbnRlcm5ldAotICogRXhwbG9yZXIgYW5kIG90aGVycyBjdXJyZW50bHkgYmVpbmcgZGV2ZWxvcGVkLgotICoKLSAqIEVhY2ggdGltZSBhIHBhZ2UgaXMgcmVxdWVzdGVkIHdlIGxvb2sgdG8gc2VlIGlmIHRoZSBicm93c2VyIGlzIHNlbmRpbmcKLSAqIHVzIGEgQ29va2llOiBoZWFkZXIgdGhhdCB3ZSBwcmV2aW91c2x5IGdlbmVyYXRlZC4KLSAqCi0gKiBJZiB3ZSBkb24ndCBmaW5kIG9uZSB0aGVuIHRoZSB1c2VyIGhhc24ndCBiZWVuIHRvIHRoaXMgc2l0ZSBzaW5jZQotICogc3RhcnRpbmcgdGhlaXIgYnJvd3NlciBvciB0aGVpciBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBjb29raWVzLiAgU28KLSAqIHdlIGdlbmVyYXRlIGEgdW5pcXVlIENvb2tpZSBmb3IgdGhlIHRyYW5zYWN0aW9uIGFuZCBzZW5kIGl0IGJhY2sgdG8KLSAqIHRoZSBicm93c2VyICh2aWEgYSAiU2V0LUNvb2tpZSIgaGVhZGVyKQotICogRnV0dXJlIHJlcXVlc3RzIGZyb20gdGhlIHNhbWUgYnJvd3NlciBzaG91bGQga2VlcCB0aGUgc2FtZSBDb29raWUgbGluZS4KLSAqCi0gKiBCeSBtYXRjaGluZyB1cCBhbGwgdGhlIHJlcXVlc3RzIHdpdGggdGhlIHNhbWUgY29va2llIHlvdSBjYW4KLSAqIHdvcmsgb3V0IGV4YWN0bHkgd2hhdCBwYXRoIGEgdXNlciB0b29rIHRocm91Z2ggeW91ciBzaXRlLiAgVG8gbG9nCi0gKiB0aGUgY29va2llIHVzZSB0aGUgIiAle0Nvb2tpZX1uICIgZGlyZWN0aXZlIGluIGEgY3VzdG9tIGFjY2VzcyBsb2c7Ci0gKgotICogRXhhbXBsZSAxIDogSWYgeW91IGN1cnJlbnRseSB1c2UgdGhlIHN0YW5kYXJkIExvZyBmaWxlIGZvcm1hdCAoQ0xGKQotICogYW5kIHVzZSB0aGUgY29tbWFuZCAiVHJhbnNmZXJMb2cgc29tZWZpbGVuYW1lIiwgYWRkIHRoZSBsaW5lCi0gKiAgICAgICBMb2dGb3JtYXQgIiVoICVsICV1ICV0IFwiJXJcIiAlcyAlYiAle0Nvb2tpZX1uIgotICogdG8geW91ciBjb25maWcgZmlsZS4KLSAqCi0gKiBFeGFtcGxlIDIgOiBJZiB5b3UgdXNlZCB0byB1c2UgdGhlIG9sZCAiQ29va2llTG9nIiBkaXJlY3RpdmUsIHlvdQotICogY2FuIGVtdWxhdGUgaXQgYnkgYWRkaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZCB0byB5b3VyIGNvbmZpZyBmaWxlCi0gKiAgICAgICBDdXN0b21Mb2cgZmlsZW5hbWUgIiV7Q29va2llfW4gXCIlclwiICV0IgotICoKLSAqIE5vdGVzOgotICogMS4gIFRoaXMgY29kZSBub3cgbG9ncyB0aGUgaW5pdGlhbCB0cmFuc2FjdGlvbiAodGhlIG9uZSB0aGF0IGNyZWF0ZWQKLSAqICAgICB0aGUgY29va2llIHRvIHN0YXJ0IHdpdGgpLgotICogMi4gIFRoaXMgbW9kdWxlIGhhcyBiZWVuIGRlc2lnbmVkIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBvdGhlciBDb29raWVzCi0gKiAgICAgeW91ciBzaXRlIG1heSBiZSB1c2luZzsganVzdCBhdm9pZCBzZW5kaW5nIG91dCBjb29raWVzIHdpdGgKLSAqICAgICB0aGUgbmFtZSAiQXBhY2hlPSIgb3IgdGhpbmdzIHdpbGwgZ2V0IGNvbmZ1c2VkLgotICogMy4gIElmIHlvdSB3YW50IHlvdSBjYW4gbW9kaWZ5IHRoZSBTZXQtQ29va2llIGxpbmUgc28gdGhhdCB0aGUgQ29va2llCi0gKiAgICAgbmV2ZXIgZXhwaXJlcy4gIFlvdSB3b3VsZCB0aGVuIGdldCB0aGUgc2FtZSBDb29raWUgZWFjaCB0aW1lIHRoZQotICogICAgIHVzZXIgcmV2aXNpdHMgeW91ciBzaXRlLgotICoKLSAqIE1hcmsgQ294LCBtYXJrQHVrd2ViLmNvbSwgNiBKdWx5IDk1Ci0gKgotICogVGhpcyBmaWxlIHJlcGxhY2VzIG1vZF9jb29raWVzLmMKLSAqLwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotI2lmICFkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChNUEUpCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbmRpZgotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgdXNlcnRyYWNrX21vZHVsZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCBhbHdheXM7Ci0gICAgdGltZV90IGV4cGlyZXM7Ci19IGNvb2tpZV9sb2dfc3RhdGU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgZW5hYmxlZDsKLSAgICBjaGFyICpjb29raWVfbmFtZTsKLX0gY29va2llX2Rpcl9yZWM7Ci0KLS8qIERlZmluZSB0aGlzIHRvIGFsbG93IHBvc3QtMjAwMCBjb29raWVzLiBDb29raWVzIHVzZSB0d28tZGlnaXQgZGF0ZXMsCi0gKiBzbyBpdCBtaWdodCBiZSBkaWNleS4gKE5ldHNjYXBlIGRvZXMgaXQgY29ycmVjdGx5LCBidXQgb3RoZXJzIG1heSBub3QpCi0gKi8KLSNkZWZpbmUgTUlMTEVOSUFMX0NPT0tJRVMKLQotLyogTWFrZSBDb29raWU6IE5vdyB3ZSBoYXZlIHRvIGdlbmVyYXRlIHNvbWV0aGluZyB0aGF0IGlzIGdvaW5nIHRvIGJlCi0gKiBwcmV0dHkgdW5pcXVlLiAgV2UgY2FuIGJhc2UgaXQgb24gdGhlIHBpZCwgdGltZSwgaG9zdGlwICovCi0KLSNkZWZpbmUgQ09PS0lFX05BTUUgIkFwYWNoZSIKLQotc3RhdGljIHZvaWQgbWFrZV9jb29raWUocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY29va2llX2xvZ19zdGF0ZSAqY2xzID0gYXBfZ2V0X21vZHVsZV9jb25maWcoci0+c2VydmVyLT5tb2R1bGVfY29uZmlnLAotCQkJCQkJICZ1c2VydHJhY2tfbW9kdWxlKTsKLSNpZiBkZWZpbmVkKE5PX0dFVFRJTUVPRkRBWSkgJiYgIWRlZmluZWQoTk9fVElNRVMpCi0gICAgY2xvY2tfdCBtcGVfdGltZXM7Ci0gICAgc3RydWN0IHRtcyBtcGVfdG1zOwotI2VsaWYgIWRlZmluZWQoV0lOMzIpCi0gICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gICAgc3RydWN0IHRpbWV6b25lIHR6ID0gezAsIDB9OwotI2VuZGlmCi0gICAgLyogMTAyNCA9PSBoYXJkY29kZWQgY29uc3RhbnQgKi8KLSAgICBjaGFyIGNvb2tpZWJ1ZlsxMDI0XTsKLSAgICBjaGFyICpuZXdfY29va2llOwotICAgIGNvbnN0IGNoYXIgKnJuYW1lID0gYXBfZ2V0X3JlbW90ZV9ob3N0KHItPmNvbm5lY3Rpb24sIHItPnBlcl9kaXJfY29uZmlnLAotCQkJCQkgICBSRU1PVEVfTkFNRSk7Ci0gICAgY29va2llX2Rpcl9yZWMgKmRjZmc7Ci0KLSAgICBkY2ZnID0gYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsICZ1c2VydHJhY2tfbW9kdWxlKTsKLQotI2lmIGRlZmluZWQoTk9fR0VUVElNRU9GREFZKSAmJiAhZGVmaW5lZChOT19USU1FUykKLS8qIFdlIGxhY2sgZ2V0dGltZW9mZGF5KCksIHNvIHdlIG11c3QgdXNlIHRpbWUoKSB0byBvYnRhaW4gdGhlIGVwb2NoCi0gICBzZWNvbmRzLCBhbmQgdGhlbiB0aW1lcygpIHRvIG9idGFpbiBDUFUgY2xvY2sgdGlja3MgKG1pbGxpc2Vjb25kcykuCi0gICBDb21iaW5lIHRoaXMgdG9nZXRoZXIgdG8gb2J0YWluIGEgaG9wZWZ1bGx5IHVuaXF1ZSBjb29raWUgSUQuICovCi0KLSAgICBtcGVfdGltZXMgPSB0aW1lcygmbXBlX3Rtcyk7Ci0KLSAgICBhcF9zbnByaW50Zihjb29raWVidWYsIHNpemVvZihjb29raWVidWYpLCAiJXMuJWQlbGQlbGQiLCBybmFtZSwKLQkJKGludCkgZ2V0cGlkKCksCi0gICAgICAgICAgICAgICAgKGxvbmcpIHItPnJlcXVlc3RfdGltZSwgKGxvbmcpIG1wZV90bXMudG1zX3V0aW1lKTsKLSNlbGlmIGRlZmluZWQoV0lOMzIpCi0gICAgLyoKLSAgICAgKiBXZSBsYWNrIGdldHRpbWVvZmRheSgpIGFuZCB3ZSBsYWNrIHRpbWVzKCkuIFNvIHdlJ2xsIHVzZSBhIGNvbWJpbmF0aW9uCi0gICAgICogb2YgdGltZSgpIGFuZCBHZXRUaWNrQ291bnQoKSwgd2hpY2ggcmV0dXJucyBtaWxsaXNlY29uZHMgc2luY2UgV2luZG93cwotICAgICAqIHdhcyBzdGFydGVkLiBJdCBzaG91bGQgYmUgcmVsYXRpdmVseSB1bmlxdWUuCi0gICAgICovCi0KLSAgICBhcF9zbnByaW50Zihjb29raWVidWYsIHNpemVvZihjb29raWVidWYpLCAiJXMuJWQlbGQlbGQiLCBybmFtZSwKLQkJKGludCkgZ2V0cGlkKCksCi0gICAgICAgICAgICAgICAgKGxvbmcpIHItPnJlcXVlc3RfdGltZSwgKGxvbmcpIEdldFRpY2tDb3VudCgpKTsKLQotI2Vsc2UKLSAgICBnZXR0aW1lb2ZkYXkoJnR2LCAmdHopOwotCi0gICAgYXBfc25wcmludGYoY29va2llYnVmLCBzaXplb2YoY29va2llYnVmKSwgIiVzLiVkJWxkJWQiLCBybmFtZSwKLQkJKGludCkgZ2V0cGlkKCksCi0gICAgICAgICAgICAgICAgKGxvbmcpIHR2LnR2X3NlYywgKGludCkgdHYudHZfdXNlYyAvIDEwMDApOwotI2VuZGlmCi0KLSAgICBpZiAoY2xzLT5leHBpcmVzKSB7Ci0gICAgICAgIHN0cnVjdCB0bSAqdG1zOwotICAgICAgICB0aW1lX3Qgd2hlbiA9IHItPnJlcXVlc3RfdGltZSArIGNscy0+ZXhwaXJlczsKLQotI2lmbmRlZiBNSUxMRU5JQUxfQ09PS0lFUwotICAgICAgICAvKgotICAgICAgICAgKiBPbmx5IHR3by1kaWdpdCBkYXRlIHN0cmluZywgc28gd2UgY2FuJ3QgdHJ1c3QgIjAwIiBvciBtb3JlLgotICAgICAgICAgKiBUaGVyZWZvcmUsIHdlIGtub2NrIGl0IGFsbCBiYWNrIHRvIGp1c3QgYmVmb3JlIG1pZG5pZ2h0IG9uCi0gICAgICAgICAqIDEvMS8yMDAwICh3aGljaCBpcyA5NDY2ODQ3OTkpCi0gICAgICAgICAqLwotCi0gICAgICAgIGlmICh3aGVuID4gOTQ2Njg0Nzk5KQotICAgICAgICAgICAgd2hlbiA9IDk0NjY4NDc5OTsKLSNlbmRpZgotICAgICAgICB0bXMgPSBnbXRpbWUoJndoZW4pOwotCi0gICAgICAgIC8qIENvb2tpZSB3aXRoIGRhdGU7IGFzIHN0cmZ0aW1lICclYSwgJWQtJWgtJXkgJUg6JU06JVMgR01UJyAqLwotICAgICAgICBuZXdfY29va2llID0gYXBfcHNwcmludGYoci0+cG9vbCwKLSAgICAgICAgICAgICAgICAiJXM9JXM7IHBhdGg9LzsgZXhwaXJlcz0lcywgJS4yZC0lcy0lLjJkICUuMmQ6JS4yZDolLjJkIEdNVCIsCi0gICAgICAgICAgICAgICAgICAgIGRjZmctPmNvb2tpZV9uYW1lLCBjb29raWVidWYsIGFwX2RheV9zbmFtZXNbdG1zLT50bV93ZGF5XSwKLSAgICAgICAgICAgICAgICAgICAgdG1zLT50bV9tZGF5LCBhcF9tb250aF9zbmFtZXNbdG1zLT50bV9tb25dLAotCQkgICAgdG1zLT50bV95ZWFyICUgMTAwLAotICAgICAgICAgICAgICAgICAgICB0bXMtPnRtX2hvdXIsIHRtcy0+dG1fbWluLCB0bXMtPnRtX3NlYyk7Ci0gICAgfQotICAgIGVsc2UgewotCW5ld19jb29raWUgPSBhcF9wc3ByaW50ZihyLT5wb29sLCAiJXM9JXM7IHBhdGg9LyIsCi0JCQkJIGRjZmctPmNvb2tpZV9uYW1lLCBjb29raWVidWYpOwotICAgIH0KLQotICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJTZXQtQ29va2llIiwgbmV3X2Nvb2tpZSk7Ci0gICAgYXBfdGFibGVfc2V0bihyLT5ub3RlcywgImNvb2tpZSIsIGFwX3BzdHJkdXAoci0+cG9vbCwgY29va2llYnVmKSk7ICAgLyogbG9nIGZpcnN0IHRpbWUgKi8KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQgc3BvdF9jb29raWUocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY29va2llX2Rpcl9yZWMgKmRjZmcgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywKLQkJCQkJCSZ1c2VydHJhY2tfbW9kdWxlKTsKLSAgICBjb25zdCBjaGFyICpjb29raWU7Ci0gICAgY2hhciAqdmFsdWU7Ci0KLSAgICBpZiAoIWRjZmctPmVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIGlmICgoY29va2llID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJDb29raWUiKSkpCi0gICAgICAgIGlmICgodmFsdWUgPSBzdHJzdHIoY29va2llLCBkY2ZnLT5jb29raWVfbmFtZSkpKSB7Ci0gICAgICAgICAgICBjaGFyICpjb29raWVidWYsICpjb29raWVlbmQ7Ci0KLSAgICAgICAgICAgIHZhbHVlICs9IHN0cmxlbihkY2ZnLT5jb29raWVfbmFtZSkgKyAxOyAgLyogU2tpcCBvdmVyIHRoZSAnPScgKi8KLSAgICAgICAgICAgIGNvb2tpZWJ1ZiA9IGFwX3BzdHJkdXAoci0+cG9vbCwgdmFsdWUpOwotICAgICAgICAgICAgY29va2llZW5kID0gc3RyY2hyKGNvb2tpZWJ1ZiwgJzsnKTsKLSAgICAgICAgICAgIGlmIChjb29raWVlbmQpCi0gICAgICAgICAgICAgICAgKmNvb2tpZWVuZCA9ICdcMCc7ICAgICAgLyogSWdub3JlIGFueXRoaW5nIGFmdGVyIGEgOyAqLwotCi0gICAgICAgICAgICAvKiBTZXQgdGhlIGNvb2tpZSBpbiBhIG5vdGUsIGZvciBsb2dnaW5nICovCi0gICAgICAgICAgICBhcF90YWJsZV9zZXRuKHItPm5vdGVzLCAiY29va2llIiwgY29va2llYnVmKTsKLQotICAgICAgICAgICAgcmV0dXJuIERFQ0xJTkVEOyAgICAvKiBUaGVyZSdzIGFscmVhZHkgYSBjb29raWUsIG5vIG5ldyBvbmUgKi8KLSAgICAgICAgfQotICAgIG1ha2VfY29va2llKHIpOwotICAgIHJldHVybiBPSzsgICAgICAgICAgICAgICAgICAvKiBXZSBzZXQgb3VyIGNvb2tpZSAqLwotfQotCi1zdGF0aWMgdm9pZCAqbWFrZV9jb29raWVfbG9nX3N0YXRlKHBvb2wgKnAsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgY29va2llX2xvZ19zdGF0ZSAqY2xzID0KLSAgICAoY29va2llX2xvZ19zdGF0ZSAqKSBhcF9wYWxsb2MocCwgc2l6ZW9mKGNvb2tpZV9sb2dfc3RhdGUpKTsKLQotICAgIGNscy0+ZXhwaXJlcyA9IDA7Ci0KLSAgICByZXR1cm4gKHZvaWQgKikgY2xzOwotfQotCi1zdGF0aWMgdm9pZCAqbWFrZV9jb29raWVfZGlyKHBvb2wgKnAsIGNoYXIgKmQpCi17Ci0gICAgY29va2llX2Rpcl9yZWMgKmRjZmc7Ci0KLSAgICBkY2ZnID0gKGNvb2tpZV9kaXJfcmVjICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKGNvb2tpZV9kaXJfcmVjKSk7Ci0gICAgZGNmZy0+Y29va2llX25hbWUgPSBDT09LSUVfTkFNRTsKLSAgICBkY2ZnLT5lbmFibGVkID0gMDsKLSAgICByZXR1cm4gZGNmZzsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9jb29raWVfZW5hYmxlKGNtZF9wYXJtcyAqY21kLCB2b2lkICptY29uZmlnLCBpbnQgYXJnKQotewotICAgIGNvb2tpZV9kaXJfcmVjICpkY2ZnID0gbWNvbmZpZzsKLQotICAgIGRjZmctPmVuYWJsZWQgPSBhcmc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfY29va2llX2V4cChjbWRfcGFybXMgKnBhcm1zLCB2b2lkICpkdW1teSwgY29uc3QgY2hhciAqYXJnKQotewotICAgIGNvb2tpZV9sb2dfc3RhdGUgKmNscyA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHBhcm1zLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXJ0cmFja19tb2R1bGUpOwotICAgIHRpbWVfdCBmYWN0b3IsIG1vZGlmaWVyID0gMDsKLSAgICB0aW1lX3QgbnVtID0gMDsKLSAgICBjaGFyICp3b3JkOwotCi0gICAgLyogVGhlIHNpbXBsZSBjYXNlIGZpcnN0IC0gYWxsIG51bWJlcnMgKHdlIGFzc3VtZSkgKi8KLSAgICBpZiAoYXBfaXNkaWdpdChhcmdbMF0pICYmIGFwX2lzZGlnaXQoYXJnW3N0cmxlbihhcmcpIC0gMV0pKSB7Ci0gICAgICAgIGNscy0+ZXhwaXJlcyA9IGF0b2woYXJnKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUaGUgaGFyZGVyIGNhc2UgLSBzdG9sZW4gZnJvbSBtb2RfZXhwaXJlcyAKLSAgICAgKgotICAgICAqIENvb2tpZUV4cGlyZXMgIltwbHVzXSB7PG51bT4gPHR5cGU+fSoiCi0gICAgICovCi0KLSAgICB3b3JkID0gYXBfZ2V0d29yZF9jb25mKHBhcm1zLT5wb29sLCAmYXJnKTsKLSAgICBpZiAoIXN0cm5jYXNlY21wKHdvcmQsICJwbHVzIiwgMSkpIHsKLSAgICAgICAgd29yZCA9IGFwX2dldHdvcmRfY29uZihwYXJtcy0+cG9vbCwgJmFyZyk7Ci0gICAgfTsKLQotICAgIC8qIHs8bnVtPiA8dHlwZT59KiAqLwotICAgIHdoaWxlICh3b3JkWzBdKSB7Ci0gICAgICAgIC8qIDxudW0+ICovCi0JaWYgKGFwX2lzZGlnaXQod29yZFswXSkpCi0gICAgICAgICAgICBudW0gPSBhdG9pKHdvcmQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gImJhZCBleHBpcmVzIGNvZGUsIG51bWVyaWMgdmFsdWUgZXhwZWN0ZWQuIjsKLQotICAgICAgICAvKiA8dHlwZT4gKi8KLSAgICAgICAgd29yZCA9IGFwX2dldHdvcmRfY29uZihwYXJtcy0+cG9vbCwgJmFyZyk7Ci0gICAgICAgIGlmICghd29yZFswXSkKLSAgICAgICAgICAgIHJldHVybiAiYmFkIGV4cGlyZXMgY29kZSwgbWlzc2luZyA8dHlwZT4iOwotCi0gICAgICAgIGZhY3RvciA9IDA7Ci0gICAgICAgIGlmICghc3RybmNhc2VjbXAod29yZCwgInllYXJzIiwgMSkpCi0gICAgICAgICAgICBmYWN0b3IgPSA2MCAqIDYwICogMjQgKiAzNjU7Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCh3b3JkLCAibW9udGhzIiwgMikpCi0gICAgICAgICAgICBmYWN0b3IgPSA2MCAqIDYwICogMjQgKiAzMDsKLSAgICAgICAgZWxzZSBpZiAoIXN0cm5jYXNlY21wKHdvcmQsICJ3ZWVrcyIsIDEpKQotICAgICAgICAgICAgZmFjdG9yID0gNjAgKiA2MCAqIDI0ICogNzsKLSAgICAgICAgZWxzZSBpZiAoIXN0cm5jYXNlY21wKHdvcmQsICJkYXlzIiwgMSkpCi0gICAgICAgICAgICBmYWN0b3IgPSA2MCAqIDYwICogMjQ7Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCh3b3JkLCAiaG91cnMiLCAxKSkKLSAgICAgICAgICAgIGZhY3RvciA9IDYwICogNjA7Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCh3b3JkLCAibWludXRlcyIsIDIpKQotICAgICAgICAgICAgZmFjdG9yID0gNjA7Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCh3b3JkLCAic2Vjb25kcyIsIDEpKQotICAgICAgICAgICAgZmFjdG9yID0gMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuICJiYWQgZXhwaXJlcyBjb2RlLCB1bnJlY29nbml6ZWQgdHlwZSI7Ci0KLSAgICAgICAgbW9kaWZpZXIgPSBtb2RpZmllciArIGZhY3RvciAqIG51bTsKLQotICAgICAgICAvKiBuZXh0IDxudW0+ICovCi0gICAgICAgIHdvcmQgPSBhcF9nZXR3b3JkX2NvbmYocGFybXMtPnBvb2wsICZhcmcpOwotICAgIH0KLQotICAgIGNscy0+ZXhwaXJlcyA9IG1vZGlmaWVyOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfY29va2llX25hbWUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKm1jb25maWcsIGNoYXIgKm5hbWUpCi17Ci0gICAgY29va2llX2Rpcl9yZWMgKmRjZmcgPSAoY29va2llX2Rpcl9yZWMgKikgbWNvbmZpZzsKLQotICAgIGRjZmctPmNvb2tpZV9uYW1lID0gYXBfcHN0cmR1cChjbWQtPnBvb2wsIG5hbWUpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgY29va2llX2xvZ19jbWRzW10gPSB7Ci0gICAgeyJDb29raWVFeHBpcmVzIiwgc2V0X2Nvb2tpZV9leHAsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICAgICJhbiBleHBpcnkgZGF0ZSBjb2RlIn0sCi0gICAgeyJDb29raWVUcmFja2luZyIsIHNldF9jb29raWVfZW5hYmxlLCBOVUxMLCBPUl9GSUxFSU5GTywgRkxBRywKLSAgICAgIndoZXRoZXIgb3Igbm90IHRvIGVuYWJsZSBjb29raWVzIn0sCi0gICAgeyJDb29raWVOYW1lIiwgc2V0X2Nvb2tpZV9uYW1lLCBOVUxMLCBPUl9GSUxFSU5GTywgVEFLRTEsCi0gICAgICJuYW1lIG9mIHRoZSB0cmFja2luZyBjb29raWUifSwKLSAgICB7TlVMTH0KLX07Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCB1c2VydHJhY2tfbW9kdWxlID0gewotICAgIFNUQU5EQVJEX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZXIgKi8KLSAgICBtYWtlX2Nvb2tpZV9kaXIsICAgICAgICAgICAgLyogZGlyIGNvbmZpZyBjcmVhdGVyICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpciBtZXJnZXIgLS0tIGRlZmF1bHQgaXMgdG8gb3ZlcnJpZGUgKi8KLSAgICBtYWtlX2Nvb2tpZV9sb2dfc3RhdGUsICAgICAgLyogc2VydmVyIGNvbmZpZyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBtZXJnZSBzZXJ2ZXIgY29uZmlncyAqLwotICAgIGNvb2tpZV9sb2dfY21kcywgICAgICAgICAgICAvKiBjb21tYW5kIHRhYmxlICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGhhbmRsZXJzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGVuYW1lIHRyYW5zbGF0aW9uICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrX3VzZXJfaWQgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgYXV0aCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBhY2Nlc3MgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHlwZV9jaGVja2VyICovCi0gICAgc3BvdF9jb29raWUsICAgICAgICAgICAgICAgIC8qIGZpeHVwcyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2dnZXIgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaGVhZGVyIHBhcnNlciAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGlsZF9pbml0ICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoaWxkX2V4aXQgKi8KLSAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdCByZWFkLXJlcXVlc3QgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL21ldGFkYXRhL21vZF91c2VydHJhY2suZHNwIGIvbW9kdWxlcy9tZXRhZGF0YS9tb2RfdXNlcnRyYWNrLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNhZWU1NS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21ldGFkYXRhL21vZF91c2VydHJhY2suZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iQXBhY2hlTW9kdWxlVXNlclRyYWNrIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDIKLQotQ0ZHPUFwYWNoZU1vZHVsZVVzZXJUcmFjayAtIFdpbjMyIFJlbGVhc2UKLSFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiQXBhY2hlTW9kdWxlVXNlclRyYWNrLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiQXBhY2hlTW9kdWxlVXNlclRyYWNrLm1hayJcCi0gQ0ZHPSJBcGFjaGVNb2R1bGVVc2VyVHJhY2sgLSBXaW4zMiBSZWxlYXNlIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgIkFwYWNoZU1vZHVsZVVzZXJUcmFjayAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvblwKLSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgIkFwYWNoZU1vZHVsZVVzZXJUcmFjayAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb25cCi0gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1NVEw9bWlkbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAiQXBhY2hlTW9kdWxlVXNlclRyYWNrIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIi5cUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIi5cUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICIuXEFwYWNoZU1vZHVsZVVzZXJUcmFja1IiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVNb2R1bGVVc2VyVHJhY2tSIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvTzIgL0kgIi4uXC4uXGluY2x1ZGUiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiU0hBUkVEX01PRFVMRSIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgLi5cLi5cQ29yZVJcQXBhY2hlQ29yZS5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hY2hpbmU6STM4NgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiQXBhY2hlTW9kdWxlVXNlclRyYWNrIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuXERlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiLlxEZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICIuXEFwYWNoZU1vZHVsZVVzZXJUcmFja0QiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVNb2R1bGVVc2VyVHJhY2tEIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTURkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0kgIi4uXC4uXGluY2x1ZGUiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiU0hBUkVEX01PRFVMRSIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIC4uXC4uXENvcmVEXEFwYWNoZUNvcmUubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2Ci0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJBcGFjaGVNb2R1bGVVc2VyVHJhY2sgLSBXaW4zMiBSZWxlYXNlIgotIyBOYW1lICJBcGFjaGVNb2R1bGVVc2VyVHJhY2sgLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2hwajtiYXQ7Zm9yO2Y5MCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXG1vZHVsZXNcc3RhbmRhcmRcbW9kX3VzZXJ0cmFjay5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sO2ZpO2ZkIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxyZWFkZGlyLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO2NudDtydGY7Z2lmO2pwZztqcGVnO2pwZSIKLSMgRW5kIEdyb3VwCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX3VzZXJ0cmFjay5leHAgYi9tb2R1bGVzL21ldGFkYXRhL21vZF91c2VydHJhY2suZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzRhNWY3Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX3VzZXJ0cmFjay5leHAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi11c2VydHJhY2tfbW9kdWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL3Byb3h5Ly5jdnNpZ25vcmUgYi9tb2R1bGVzL3Byb3h5Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZWI3YTkuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9wcm94eS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotRGVidWcKLVJlbGVhc2UKLUFwYWNoZU1vZHVsZVByb3h5LmRzdwotQXBhY2hlTW9kdWxlUHJveHkubWRwCi1BcGFjaGVNb2R1bGVQcm94eS5uY2IKLUFwYWNoZU1vZHVsZVByb3h5Lm9wdAotQXBhY2hlTW9kdWxlUHJveHkucGxnCi1NYWtlZmlsZQotKi5sbwotKi5zbwotKi5kbGwKLSouZGVmCmRpZmYgLS1naXQgYS9tb2R1bGVzL3Byb3h5Ly5pbmRlbnQucHJvIGIvbW9kdWxlcy9wcm94eS8uaW5kZW50LnBybwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBjMmQ4My4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL3Byb3h5Ly5pbmRlbnQucHJvCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLWk0IC1ucHNsIC1kaTAgLWJyIC1uY2UgLWQwIC1jbGkwIC1ucGNzIC1uZmMxCi0tVEJVRkYKLS1URklMRQotLVRUUkFOUwotLVRVSU5UNAotLVRfdHJhbnMKLS1UYWxsb3dfb3B0aW9uc190Ci0tVGFwYWNoZV9zZmlvCi0tVGFycmF5X2hlYWRlcgotLVRib29sX2ludAotLVRidWZfYXJlYQotLVRidWZmX3N0cnVjdAotLVRidWZmeQotLVRjbWRfaG93Ci0tVGNtZF9wYXJtcwotLVRjb21tYW5kX3JlYwotLVRjb21tYW5kX3N0cnVjdAotLVRjb25uX3JlYwotLVRjb3JlX2Rpcl9jb25maWcKLS1UY29yZV9zZXJ2ZXJfY29uZmlnCi0tVGRpcl9tYWtlcl9mdW5jCi0tVGV2ZW50Ci0tVGdsb2JhbHNfcwotLVRoYW5kbGVyX2Z1bmMKLS1UaGFuZGxlcl9yZWMKLS1Uam9ibGlzdF9zCi0tVGxpc3Rlbl9yZWMKLS1UbWVyZ2VyX2Z1bmMKLS1UbW9kZV90Ci0tVG1vZHVsZQotLVRtb2R1bGVfc3RydWN0Ci0tVG11dGV4Ci0tVG5fbG9uZwotLVRvdGhlcl9jaGlsZF9yZWMKLS1Ub3ZlcnJpZGVzX3QKLS1UcGFyZW50X3Njb3JlCi0tVHBpZF90Ci0tVHBpcGVkX2xvZwotLVRwb29sCi0tVHJlcXVlc3RfcmVjCi0tVHJlcXVpcmVfbGluZQotLVRybGltX3QKLS1Uc2NvcmVib2FyZAotLVRzZW1hcGhvcmUKLS1Uc2VydmVyX2FkZHJfcmVjCi0tVHNlcnZlcl9yZWMKLS1Uc2VydmVyX3JlY19jaGFpbgotLVRzaG9ydF9zY29yZQotLVR0YWJsZQotLVR0YWJsZV9lbnRyeQotLVR0aHJlYWQKLS1UdV93aWRlX2ludAotLVR2dGltZV90Ci0tVHdpZGVfaW50Ci0tVHByb3h5X3NlcnZlcl9jb25mCmRpZmYgLS1naXQgYS9tb2R1bGVzL3Byb3h5L0NIQU5HRVMgYi9tb2R1bGVzL3Byb3h5L0NIQU5HRVMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwM2Y2OGMuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9wcm94eS9DSEFOR0VTCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLQotbW9kX3Byb3h5IGNoYW5nZXMgZm9yIGh0dHBkIDIuMC4xOC1kZXYKLQotICAqKSBSZXZlcnNlIHByZXZpb3VzIHBhdGNoIHNpbmNlIHRoZSBjb3JlIHJldmVydGVkLgotICAgICBbQ2h1Y2sgTXVyY2tvIDxjaHVja0B0b3BzYWlsLm9yZz5dCi0KLSAgKikgUmVtb3ZlIGluZGlyZWN0aW9uIG9uIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZvciBpbnB1dCBmaWx0ZXJzLgotICAgICBbQ2h1Y2sgTXVyY2tvIDxjaHVja0B0b3BzYWlsLm9yZz5dCi0KLSAgKikgRml4ZWQgYSBwcm9ibGVtIHdpdGggZGlyZWN0b3J5IGxpc3RpbmcgY29ycnVwdGlvbiBpbiB0aGUKLSAgICAgUFJPWFlfRElSIGZpbHRlci4KLSAgICAgW0dyYWhhbSBMZWdnZXR0IDxtaW5mcmluQHNoYXJwLmZtPl0KLQotICAqKSBtb2RfcHJveHkgYW5kIHRoZSBwcm94eSBzdWJtb2R1bGVzIG5vdyBidWlsZCBwcm9wZXJseSBhcyBEU09zLgotICAgICBbR3JhaGFtIExlZ2dldHQgPG1pbmZyaW5Ac2hhcnAuZm0+XQotCi0gICopIFN0b3BwZWQgdGhlIEhUVFAgcHJveHkgZnJvbSB0cnlpbmcgdG8gcmVhZCBlbnRpdHkgYm9kaWVzIHdoZW4gdGhlcmUKLSAgICAgd2Fzbid0IG9uZSAocmVzcG9uc2Ugd2FzIDF4eCwgMjA0LCAyMDUgb3IgMzA0KS4KLSAgICAgW0dyYWhhbSBMZWdnZXR0IDxtaW5mcmluQHNoYXJwLmZtPl0KLQotICAqKSBNYWRlIHN1cmUgZGF0ZXMgd2VyZSBjYW5vbmljYWxpc2VkIGNvcnJlY3RseSB3aGVuIHBhc3NlZCB0byB0aGUgY2xpZW50Ci0gICAgIGJyb3dzZXIgdGhyb3VnaCB0aGUgSFRUUCBwcm94eS4KLSAgICAgW0dyYWhhbSBMZWdnZXR0IDxtaW5mcmluQHNoYXJwLmZtPl0KLQotICAqKSBTcGxpdCBlYWNoIGluZGl2aWR1YWwgcHJveHkgcHJvdG9jb2wgaW50byBzZXBhcmF0ZSBtb2R1bGVzLgotICAgICBbR3JhaGFtIExlZ2dldHQgPG1pbmZyaW5Ac2hhcnAuZm0+XQotCi0gICopIEFkZGVkIE1heC1Gb3J3YXJkcyBzdXBwb3J0IGZvciBhbGwgcmVxdWVzdCB0eXBlcyBzbyBhcyB0byBwcmV2ZW50Ci0gICAgIGxvb3BzLgotICAgICBbR3JhaGFtIExlZ2dldHQgPG1pbmZyaW5Ac2hhcnAuZm0+XQotCi0gICopIEZpeCB3YXJuaW5ncyBhYm91dCBieXRlIGNvdW50IHR5cGUgb24gRGFyd2luIChjb25uZWN0IGhhbmRsZXIpLgotICAgICBbQ2h1Y2sgTXVyY2tvIDxjaHVja0B0b3BzYWlsLm9yZz5dCi0KLSAgKikgSVBWNiBFUFNWIHN1cHBvcnQgZm9yIElQVjYgaW4gRlRQIHByb3h5LgotICAgICBbR3JhaGFtIExlZ2dldHQgPG1pbmZyaW5Ac2hhcnAuZm0+XQotCi0gICopIEZUUCBkaXJlY3RvcnkgZmlsdGVyIHdvcmtzIG5vdy4KLSAgICAgW0dyYWhhbSBMZWdnZXR0IDxtaW5mcmluQHNoYXJwLmZtPl0KLQotICAqKSBGaXhlZCBzb21lIHRocmVhZC1zYWZldHkgaXNzdWVzIHdpdGggdGhlIEhUVFAgcHJveHkgaW4gbW9kX3Byb3h5LgotICAgICBbR3JhaGFtIExlZ2dldHQgPG1pbmZyaW5Ac2hhcnAuZm0+XQotCi0gICopIFBBU1YgRlRQIHdvcmtzIG5vdy4KLSAgICAgW0dyYWhhbSBMZWdnZXR0IDxtaW5mcmluQHNoYXJwLmZtPl0KLQotICAqKSBSZXdvcmtlZCB0aGUgbGluZS1hdC1hLXRpbWUgcmVhZCBmcm9tIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gdG8KLSAgICAgd29ya2Fyb3VuZCBhIHN0cmF5IGVtcHR5IGJ1Y2tldCByZXR1cm5lZCBieSB0aGUgSFRUUF9JTiBmaWx0ZXIuCi0gICAgIFtHcmFoYW0gTGVnZ2V0dCA8bWluZnJpbkBzaGFycC5mbT5dCi0KLSAgKikgU3RvcHBlZCB0aGUgQ09SRSBmaWx0ZXIgZnJvbSBzZW5kaW5nIG9mZiBhbiBIVFRQIHJlc3BvbnNlIHdoZW4gYQotICAgICBDT05ORUNUIHR1bm5lbCB3YXMgY2xvc2VkLgotICAgICBbR3JhaGFtIExlZ2dldHQgPG1pbmZyaW5Ac2hhcnAuZm0+XQotCi0gICopIEZpeGVkIHRoZSBwb2xsKCkgbG9vcCBpbiBwcm94eV9jb25uZWN0LmMgLT4gaXQgd29ya3Mgbm93ISEhCi0gICAgIFtHcmFoYW0gTGVnZ2V0dCA8bWluZnJpbkBzaGFycC5mbT5dCi0KLSAgKikgQ29udmVydGVkIHNlbmRfZGlyKCkgdG8gYXBfcHJveHlfc2VuZF9kaXJfZmlsdGVyKCkgaW4gcHJveHlfZnRwLmMuCi0gICAgIFtHcmFoYW0gTGVnZ2V0dCA8bWluZnJpbkBzaGFycC5mbT5dCi0KLSAgKikgTWFqb3IgcmV3b3JrIG9mIGFwX3Byb3h5X2Z0cF9oYW5kbGVyKCkgdG8gdXNlIGZpbHRlcnMgKGJlZ29uZSBmb3VsCi0gICAgIEJVRkYhISEpLiBJdCBjb21waWxlcywgYnV0IGlzIHVudGVzdGVkLCBhbmQgdGhlIGJ1aWxkIGVudmlyb25tZW50IG5lZWRzCi0gICAgIHRvIGJlIGZpeGVkIHRvIGluY2x1ZGUgcHJveHlfZnRwLmMuCi0gICAgIFtHcmFoYW0gTGVnZ2V0dCA8bWluZnJpbkBzaGFycC5mbT5dCi0KLSAgKikgQ2xlYW51cCBvZiBkZWFkIGZ1bmN0aW9ucyB3aXRoaW4gcHJveHlfdXRpbC5jLgotICAgICBbR3JhaGFtIExlZ2dldHQgPG1pbmZyaW5Ac2hhcnAuZm0+XQotCi0gICopIFJld29ya2VkIHRoZSBzdG9yYWdlIG9mIHRoZSBjbGllbnQgc29ja2V0IGJldHdlZW4ga2VlcGFsaXZlIGNvbm5lY3Rpb25zCi0gICAgIHRvIGZpeCBzb21lIG5hc3R5IHByb2JsZW1zIHdpdGggdGhlIHNvY2tldCBsYXN0aW5nIGxvbmdlciB0aGFuIHRoZQotICAgICBtZW1vcnkgcG9vbCBpdCB3YXMgYWxsb2NhdGVkIGZyb20uCi0gICAgIFtHcmFoYW0gTGVnZ2V0dCA8bWluZnJpbkBzaGFycC5mbT5dCi0KLSAgKikgRml4ZWQgYnVnIHdoZXJlIGEgaG9zdG5hbWUgd2l0aG91dCBhICIuIiBpbiBpdCAoc3VjaCBhcyAibG9jYWxob3N0IikKLSAgICAgd291bGQgbm90IHRyaWdnZXIgYW4gSVAgYWRkcmVzcyBjaGVjayB3aXRoIFByb3h5QmxvY2suCi0gICAgIFtHcmFoYW0gTGVnZ2V0dCA8bWluZnJpbkBzaGFycC5mbT5dCi0KLSAgKikgRml4ZWQgUHJveHlCbG9jayBidWdzIHdpdGggYXBfcHJveHlfaHR0cF9oYW5kbGVyKCkgYW5kCi0gICAgIGFwX3Byb3h5X2Nvbm5lY3RfaGFuZGxlcigpLgotICAgICBbR3JhaGFtIExlZ2dldHQgPG1pbmZyaW5Ac2hhcnAuZm0+XQotCi0gICopIFVwZGF0ZWQgYXBfcHJveHlfY29ubmVjdF9oYW5kbGVyKCkgdG8gc3VwcG9ydCBBUFIsIHdoaWxlCi0gICAgIG1vdmluZyBzb21lIGNvbW1vbiBjb2RlIGJldHdlZW4gaHR0cF9oYW5kbGVyIGFuZCBjb25uZWN0X2hhbmRsZXIKLSAgICAgdG8gcHJveHlfdXRpbC5jLgotICAgICBbR3JhaGFtIExlZ2dldHQgPG1pbmZyaW5Ac2hhcnAuZm0+XQotCi0gICopIFVwZGF0ZWQgbW9kX3Byb3h5Lmh0bWwgZG9jcyB0byBpbmNsdWRlIHYyLjAgY29uZmlndXJhdGlvbi4KLSAgICAgW0dyYWhhbSBMZWdnZXR0IDxtaW5mcmluQHNoYXJwLmZtPl0KLQotICAqKSBGaXhlZCBwcm9ibGVtIHdoZXJlIHJlc3BvbnNlcyB3aXRob3V0IGVudGl0eSBib2RpZXMgd291bGQgY2F1c2UKLSAgICAgdGhlIGRpcmVjdGx5IGZvbGxvd2luZyBwcm94eSBrZWVwYWxpdmUgcmVxdWVzdCB0byBmYWlsLgotICAgICBbR3JhaGFtIExlZ2dldHQgPG1pbmZyaW5Ac2hhcnAuZm0+XQotCi0gICopIEFkZGVkIHN1cHBvcnQgZm9yIGRvd25zdHJlYW0ga2VlcGFsaXZlcyBpbiBtb2RfcHJveHkuCi0gICAgIFtHcmFoYW0gTGVnZ2V0dCA8bWluZnJpbkBzaGFycC5mbT5dCi0KLSAgKikgQ2hhbmdlZCBtb2RfcHJveHkgYXBfcHJveHlfaHR0cF9oYW5kbGVyKCkgdG8gc3VwcG9ydCBBUFIgcHJvcGVybHkuCi0gICAgIFtHcmFoYW0gTGVnZ2V0dCA8bWluZnJpbkBzaGFycC5mbT5dCi0KLSAgKikgRml4IHByb2JsZW0gd2hlcmUgaW5jb21pbmcgcmVzcG9uc2UgaGVhZGVycyB3ZXJlIG5vdCBiZWluZyByZXR1cm5lZAotICAgICB0byB0aGUgY2xpZW50IGluIG1vZF9wcm94eS4KLSAgICAgW0dyYWhhbSBMZWdnZXR0IDxtaW5mcmluQHNoYXJwLmZtPl0KLQotICAqKSBBZGRlZCBYLUZvcndhcmRlZC1Gb3IsIFgtRm9yd2FyZGVkLUhvc3QgYW5kIFgtRm9yd2FyZGVkLVNlcnZlciB0bwotICAgICByZXZlcnNlIHByb3hpZWQgcmVxdWVzdCBoZWFkZXJzIGluIG1vZF9wcm94eS4KLSAgICAgW0dyYWhhbSBMZWdnZXR0IDxtaW5mcmluQHNoYXJwLmZtPl0KLQotICAqKSByZXBsYWNlIElOQUREUl9OT05FIHdpdGggQVBSX0lOQUREUl9OT05FIFtJYW4gSG9sc21hbiA8SWFuSEBjbmV0LmNvbT5dCi0KLSAgKikgRml4IHByb2JsZW0gd2l0aCBwcm94eSBjb25maWd1cmF0aW9uIHdoZXJlIGdsb2JhbGx5IHNldAotICAgICBjb25maWd1cmF0aW9uIG9wdGlvbnMgd2VyZSBvdmVycmlkZGVuIGluc2lkZSB2aXJ0dWFsIGhvc3RzLgotICAgICBbR3JhaGFtIExlZ2dldHQgPG1pbmZyaW5Ac2hhcnAuZm0+XQotCi0gICopIEZpeCBQcm94eVJlY2VpdmVCdWZmZXJTaXplIHdoZXJlIGRlZmF1bHQgdmFsdWUgd2FzIGxlZnQKLSAgICAgdW5pbml0aWFsaXNlZC4KLSAgICAgW0dyYWhhbSBMZWdnZXR0IDxtaW5mcmluQHNoYXJwLmZtPl0KLQotICAqKSBTb21lIHNtYWxsIGNoYW5nZXM6Ci0gICAgIC0gRW5zdXJlZCBob3AtYnktaG9wIGhlYWRlcnMgd2VyZSBzdHJpcHBlZCBhcyBwZXIKLSAgICAgICBSRkMyNjE2IDEzLjUuMS4KLSAgICAgLSBVcGdyYWRlZCB2ZXJzaW9uIGNvZGUgdG8gSFRUUC8xLjEuCi0gICAgIC0gQWRkZWQgQ29ubmVjdGlvbjogY2xvc2UgdW50aWwgS2VlcGFsaXZlcyBjb21lLgotICAgICAtIFNvbWUgY29zbWV0aWMgZml4ZXMgYW5kIGNvbW1lbnRpbmcuCi0gICAgIFtHcmFoYW0gTGVnZ2V0dCA8bWluZnJpbkBzaGFycC5mbT5dCi0KLW1vZF9wcm94eSBjaGFuZ2VzIGZvciAyLjAuMTQgYWxwaGEKLQotICAqKSByZW1vdmVkIFByb3h5Tm9DYWNoZSBhbmQgUHJveHlDYWNoZUZvcmNlQ29tcGxldGlvbiBjb25maWcgZGlyZWN0aXZlcywKLSAgICAgc2luY2Ugd2Ugbm8gbG9uZ2VyIGRpcmVjdGx5IGNhY2hlIGZyb20gdGhpcyBtb2R1bGUgW0NodWNrIE11cmNrb10KLQotICAqKSByZW1vdmVkIGNhY2hlIFtDaHVjayBNdXJja29dCi0KLSAgKikgaW5pdGlhbCByZXJlYnVpbGQgZm9yIDIuMCBbQ2h1Y2sgTXVyY2tvXQotCmRpZmYgLS1naXQgYS9tb2R1bGVzL3Byb3h5L01ha2VmaWxlLmluIGIvbW9kdWxlcy9wcm94eS9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZhMGZjOS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL3Byb3h5L01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0KLUxUTElCUkFSWV9OQU1FICAgID0gbGliYXBhY2hlbW9kX3Byb3h5LmxhCi1MVExJQlJBUllfU09VUkNFUyA9IG1vZF9wcm94eS5sbyBwcm94eV9jb25uZWN0LmxvIHByb3h5X2Z0cC5sbyBwcm94eV9odHRwLmxvIHByb3h5X3V0aWwubG8KLQotaW5jbHVkZSAkKHRvcF9zcmNkaXIpL2J1aWxkL2x0bGliLm1rCmRpZmYgLS1naXQgYS9tb2R1bGVzL3Byb3h5L05XR05VbWFrZWZpbGUgYi9tb2R1bGVzL3Byb3h5L05XR05VbWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NmZhYjUuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9wcm94eS9OV0dOVW1ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLSMKLSMgRGVjbGFyZSB0aGUgc3ViLWRpcmVjdG9yaWVzIHRvIGJlIGJ1aWx0IGhlcmUKLSMKLQotU1VCRElSUyA9IFwKLQkkKEVPTElTVCkgCi0KLSMKLSMgR2V0IHRoZSAnaGVhZCcgb2YgdGhlIGJ1aWxkIGVudmlyb25tZW50LiAgVGhpcyBpbmNsdWRlcyBkZWZhdWx0IHRhcmdldHMgYW5kCi0jIHBhdGhzIHRvIHRvb2xzCi0jCi0KLWluY2x1ZGUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jCi0KLSMKLSMgYnVpbGQgdGhpcyBsZXZlbCdzIGZpbGVzCi0jCi0jIE1ha2Ugc3VyZSBhbGwgbmVlZGVkIG1hY3JvJ3MgYXJlIGRlZmluZWQKLSMKLQotCi0jCi0jIFRoZXNlIGRpcmVjdG9yaWVzIHdpbGwgYmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5jbHVkZSBsaXN0LCBmb2xsb3dlZCBieQotIyBJTkNESVJTCi0jCi1YSU5DRElSUwkrPSBcCi0JCQkkKEFQX1dPUkspL2luY2x1ZGUgXAotCQkJJChOV09TKSBcCi0JCQkkKEFQX1dPUkspL21vZHVsZXMvaHR0cCBcCi0JCQkkKEFQX1dPUkspL21vZHVsZXMvYXJjaC9uZXR3YXJlIFwKLQkJCSQoQVBfV09SSykvc3JjbGliL2Fwci9pbmNsdWRlIFwKLQkJCSQoQVBfV09SSykvc3JjbGliL2Fwci11dGlsL2luY2x1ZGUgXAotCQkJJChBUF9XT1JLKS9zcmNsaWIvYXByIFwKLQkJCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGZsYWdzIHdpbGwgY29tZSBhZnRlciBDRkxBR1MKLSMKLVhDRkxBR1MJCSs9IFwKLQkJCS1wcmVmaXggcHJlX253LmggXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZGVmaW5lcyB3aWxsIGNvbWUgYWZ0ZXIgREVGSU5FUwotIwotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgZmxhZ3Mgd2lsbCBiZSBhZGRlZCB0byB0aGUgbGluay5vcHQgZmlsZQotIwotWExGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgdmFsdWVzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGNvcnJlY3QgdmFyaWFibGVzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZgotIyBSRUxFQVNFCi0jCi1pZmVxICIkKFJFTEVBU0UpIiAiZGVidWciCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCSAgIAkkKEVPTElTVCkKLWVuZGlmCi0KLWlmZXEgIiQoUkVMRUFTRSkiICJub29wdCIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJICAgCSQoRU9MSVNUKQotZW5kaWYKLQotaWZlcSAiJChSRUxFQVNFKSIgInJlbGVhc2UiCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLWVuZGlmCi0KLSMKLSMgVGhlc2UgYXJlIHVzZWQgYnkgdGhlIGxpbmsgdGFyZ2V0IGlmIGFuIE5MTSBpcyBiZWluZyBnZW5lcmF0ZWQKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rICduYW1lJyBkaXJlY3RpdmUgdG8gbmFtZSB0aGUgbmxtLiAgSWYgbGVmdCBibGFuawotIyBUQVJHRVRfbmxtIChzZWUgYmVsb3cpIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9OQU1FCQk9IHByb3h5Ci0KLSMKLSMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBsaW5rICctZGVzYyAnIGRpcmVjdGl2ZS4gCi0jIElmIGxlZnQgYmxhbmssIE5MTV9OQU1FIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9ERVNDUklQVElPTgk9IFByb3h5IE1vZHVsZQotCi0jCi0jIFRoaXMgaXMgdXNlZCBieSB0aGUgJy10aHJlYWRuYW1lJyBkaXJlY3RpdmUuICBJZiBsZWZ0IGJsYW5rLAotIyBOTE1fTkFNRSBUaHJlYWQgd2lsbCBiZSB1c2VkLgotIwotTkxNX1RIUkVBRF9OQU1FCT0gUHJveHkgTW9kdWxlCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgVkVSU0lPTiB2YWx1ZSBpbiAKLSMgJChBUF9XT1JLKVxidWlsZFxOV0dOVWVudmlyb25tZW50LmluYwotIwotTkxNX1ZFUlNJT04JCT0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBvZiA2NEsKLSMKLU5MTV9TVEFDS19TSVpFCT0gODE5MgotCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZW50cnknIGRpcmVjdGl2ZQotIwotTkxNX0VOVFJZX1NZTQk9IF9MaWJDUHJlbHVkZQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWV4aXQnIGRpcmVjdGl2ZQotIwotTkxNX0VYSVRfU1lNCT0gX0xpYkNQb3N0bHVkZQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWNoZWNrJyBkaXJlY3RpdmUKLSMKLU5MTV9DSEVDS19TWU0JPQotCi0jCi0jIElmIHRoZXNlIGFyZSBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZmxhZ3MnIGRpcmVjdGl2ZQotIwotTkxNX0ZMQUdTCQk9ICBBVVRPVU5MT0FELCBQU0VVRE9QUkVFTVBUSU9OCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSBsaW5rZWQgaW4gd2l0aCB0aGUgWERDRGF0YSBvcHRpb24gaW4gdGhlIGRlZiAKLSMgZmlsZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG9mICQoTldPUykvYXBhY2hlLnhkYy4gIFhEQ0RhdGEgY2FuIGJlIGRpc2FibGVkCi0jIGJ5IHNldHRpbmcgQVBBQ0hFX1VOSVBST0MgaW4gdGhlIGVudmlyb25tZW50Ci0jCi1YRENEQVRBICAgICAgICAgPSAKLQotIwotIyBJZiB0aGVyZSBpcyBhbiBOTE0gdGFyZ2V0LCBwdXQgaXQgaGVyZQotIwotVEFSR0VUX25sbSA9IFwKLQkkKE9CSkRJUikvcHJveHkubmxtIFwKLQkkKEVPTElTVCkKLQotIwotIyBJZiB0aGVyZSBpcyBhbiBMSUIgdGFyZ2V0LCBwdXQgaXQgaGVyZQotIwotVEFSR0VUX2xpYiA9IFwKLQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBhcmUgdGhlIE9CSiBmaWxlcyBuZWVkZWQgdG8gY3JlYXRlIHRoZSBOTE0gdGFyZ2V0IGFib3ZlLgotIyBQYXRocyBtdXN0IGFsbCB1c2UgdGhlICcvJyBjaGFyYWN0ZXIKLSMKLUZJTEVTX25sbV9vYmpzID0gXAotCSQoT0JKRElSKS9tb2RfcHJveHkubyBcCi0JJChPQkpESVIpL3Byb3h5X2Nvbm5lY3QubyBcCi0JJChPQkpESVIpL3Byb3h5X2Z0cC5vIFwKLQkkKE9CSkRJUikvcHJveHlfaHR0cC5vIFwKLQkkKE9CSkRJUikvcHJveHlfdXRpbC5vIFwKLQkkKE9CSkRJUikvbGlicHJld3MubyBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBMSUIgZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTkxNIHRhcmdldCBhYm92ZS4KLSMgVGhlc2Ugd2lsbCBiZSBhZGRlZCBhcyBhIGxpYnJhcnkgY29tbWFuZCBpbiB0aGUgbGluay5vcHQgZmlsZS4KLSMKLUZJTEVTX25sbV9saWJzID0gXAotICAgCWxpYmNwcmUubyBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBtb2R1bGVzIHRoYXQgdGhlIGFib3ZlIE5MTSB0YXJnZXQgZGVwZW5kcyBvbiB0byBsb2FkLgotIyBUaGVzZSB3aWxsIGJlIGFkZGVkIGFzIGEgbW9kdWxlIGNvbW1hbmQgaW4gdGhlIGxpbmsub3B0IGZpbGUuCi0jCi1GSUxFU19ubG1fbW9kdWxlcyA9IFwKLQlhcHJsaWIgXAotCWxpYmMgXAotCSQoRU9MSVNUKQotCi0jCi0jIElmIHRoZSBubG0gaGFzIGEgbXNnIGZpbGUsIHB1dCBpdCdzIHBhdGggaGVyZQotIwotRklMRV9ubG1fbXNnID0KLSAKLSMKLSMgSWYgdGhlIG5sbSBoYXMgYSBobHAgZmlsZSBwdXQgaXQncyBwYXRoIGhlcmUKLSMKLUZJTEVfbmxtX2hscCA9Ci0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgJChOV09TKVxjb3B5cmlnaHQudHh0LgotIwotRklMRV9ubG1fY29weXJpZ2h0ID0KLQotIwotIyBBbnkgYWRkaXRpb25hbCBpbXBvcnRzIGdvIGhlcmUKLSMKLUZJTEVTX25sbV9YaW1wb3J0cyA9IFwKLQlAJChBUFIpL2FwcmxpYi5pbXAgXAotCUAkKE5XT1MpL2h0dHBkLmltcCBcCi0JQGxpYmMuaW1wIFwKLQlAd3MybmxtLmltcCBcCi0JJChFT0xJU1QpCi0gCi0jICAgCi0jIEFueSBzeW1ib2xzIGV4cG9ydGVkIHRvIGhlcmUKLSMKLUZJTEVTX25sbV9leHBvcnRzID0gXAotCXByb3h5X21vZHVsZSBcCi0JJChFT0xJU1QpCi0JCi0jICAgCi0jIFRoZXNlIGFyZSB0aGUgT0JKIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIExJQiB0YXJnZXQgYWJvdmUuCi0jIFBhdGhzIG11c3QgYWxsIHVzZSB0aGUgJy8nIGNoYXJhY3RlcgotIwotRklMRVNfbGliX29ianMgPSBcCi0JCSQoRU9MSVNUKQotCi0jCi0jIGltcGxlbWVudCB0YXJnZXRzIGFuZCBkZXBlbmRhbmNpZXMgKGxlYXZlIHRoaXMgc2VjdGlvbiBhbG9uZSkKLSMKLQotbGlicyA6OiAkKE9CSkRJUikgJChUQVJHRVRfbGliKQotCi1ubG1zIDo6IGxpYnMgJChUQVJHRVRfbmxtKQotCi0jCi0jIFVwZGF0ZWQgdGhpcyB0YXJnZXQgdG8gY3JlYXRlIG5lY2Vzc2FyeSBkaXJlY3RvcmllcyBhbmQgY29weSBmaWxlcyB0byB0aGUgCi0jIGNvcnJlY3QgcGxhY2UuICAoU2VlICQoQVBfV09SSylcYnVpbGRcTldHTlVoZWFkLmluYyBmb3IgZXhhbXBsZXMpCi0jCi1pbnN0YWxsIDo6IG5sbXMgRk9SQ0UKLQljb3B5ICQoT0JKRElSKVwqLm5sbSAkKElOU1RBTEwpXEFwYWNoZTJcbW9kdWxlc1wqLioKLQotIwotIyBBbnkgc3BlY2lhbGl6ZWQgcnVsZXMgaGVyZQotIwotCi0kKE9CSkRJUikvJS5vOiAuLi9hcmNoL25ldHdhcmUvJS5jICQoT0JKRElSKVxjYy5vcHQKLQlAZWNobyBjb21waWxpbmcgJDwKLQkkKENDKSAkPCAtbz0kKE9CSkRJUilcJChARikgQCQoT0JKRElSKVxjYy5vcHQKLQotIwotIyBJbmNsdWRlIHRoZSAndGFpbCcgbWFrZWZpbGUgdGhhdCBoYXMgdGFyZ2V0cyB0aGF0IGRlcGVuZCBvbiB2YXJpYWJsZXMgZGVmaW5lZAotIyBpbiB0aGlzIG1ha2VmaWxlCi0jCi0KLWluY2x1ZGUgJChBUF9XT1JLKVxidWlsZFxOV0dOVXRhaWwuaW5jCi0KLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9wcm94eS9jb25maWcubTQgYi9tb2R1bGVzL3Byb3h5L2NvbmZpZy5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZkNWVmZC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL3Byb3h5L2NvbmZpZy5tNAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLWRubCBtb2R1bGVzIGVuYWJsZWQgaW4gdGhpcyBkaXJlY3RvcnkgYnkgZGVmYXVsdAotCi1kbmwgQUNfREVGVU4obW9kdWxlbmFtZSwgbW9kdWxlc3RydWN0bmFtZSwgZGVmYXVsdG9ub3JvZmYsIGNvbmZpZ21hY3JvcykKLWRubCBYWFggLSBOZWVkIHRvIGFkZCBoZWxwIHRleHQgdG8gLS1lbmFibGUtbW9kdWxlIGZsYWdzCi1kbmwgWFhYIC0gTmVlZCB0byBhbGxvdyAtLWVuYWJsZS1tb2R1bGUgdG8gZmFpbCBpZiBvcHRpb25hbCBjb25maWcgZmFpbHMKLQotQUNfREVGVU4oQVBBQ0hFX0NIRUNLX1BST1hZX01PRFVMRSwgWwotICBBUEFDSEVfTU9EVUxFKCQxLCwsJDIsJDMsJDQpCi1dKQotCi1BUEFDSEVfTU9EUEFUSF9JTklUKHByb3h5KQotCi1BUEFDSEVfQ0hFQ0tfUFJPWFlfTU9EVUxFKHByb3h5LCAsIHllcykKLQotZG5sIEFQQUNIRV9DSEVDS19TVEFOREFSRF9NT0RVTEUoYXV0aF9kYiwgLCBubywgWwotZG5sICAgQUNfQ0hFQ0tfSEVBREVSUyhkYi5oKQotZG5sICAgQUNfQ0hFQ0tfTElCKGRiLG1haW4pCi1kbmwgXSkgCi0KLWRubCBBUEFDSEVfQ0hFQ0tfU1RBTkRBUkRfTU9EVUxFKHVzZXJ0cmFjaywgLCBubywgWwotZG5sICAgQUNfQ0hFQ0tfSEVBREVSUyhzeXMvdGltZXMuaCkKLWRubCAgIEFDX0NIRUNLX0ZVTkNTKHRpbWVzKQotZG5sIF0pCi0KLUFQQUNIRV9NT0RQQVRIX0ZJTklTSAotCi1pZiB0ZXN0ICIkc2hhcmVkb2JqcyIgPSAieWVzIjsgdGhlbgotICAgIExJQlM9IiRMSUJTIC1sZGwiCi0gICAgTFRGTEFHUz0iJExURkxBR1MgLWV4cG9ydC1keW5hbWljIgotZmkKLSAgICAKLUFQQUNIRV9TVUJTVChTVEFOREFSRF9MSUJTKQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9wcm94eS9saWJwcm94eS5leHAgYi9tb2R1bGVzL3Byb3h5L2xpYnByb3h5LmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIwZjIzNy4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL3Byb3h5L2xpYnByb3h5LmV4cAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXByb3h5X21vZHVsZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9wcm94eS9tb2RfcHJveHkuYyBiL21vZHVsZXMvcHJveHkvbW9kX3Byb3h5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMjJkMDguLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9wcm94eS9tb2RfcHJveHkuYworKysgL2Rldi9udWxsCkBAIC0xLDg5OCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLSNpbmNsdWRlICJtb2RfcHJveHkuaCIKLQotI2RlZmluZSBDT1JFX1BSSVZBVEUKLQotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiaHR0cF92aG9zdC5oIgotI2luY2x1ZGUgImh0dHBfcmVxdWVzdC5oIgotCi0vKiBTb21lIFdXVyBzY2hlbWVzIGFuZCB0aGVpciBkZWZhdWx0IHBvcnRzOyB0aGlzIGlzIGJhc2ljYWxseSAvZXRjL3NlcnZpY2VzICovCi0vKiBUaGlzIHdpbGwgYmVjb21lIGdsb2JhbCB3aGVuIHRoZSBwcm90b2NvbCBhYnN0cmFjdGlvbiBjb21lcyAqLwotc3RhdGljIHN0cnVjdCBwcm94eV9zZXJ2aWNlcyBkZWZwb3J0c1tdID0KLXsKLSAgICB7Imh0dHAiLCBERUZBVUxUX0hUVFBfUE9SVH0sCi0gICAgeyJmdHAiLCBERUZBVUxUX0ZUUF9QT1JUfSwKLSAgICB7Imh0dHBzIiwgREVGQVVMVF9IVFRQU19QT1JUfSwKLSAgICB7ImdvcGhlciIsIERFRkFVTFRfR09QSEVSX1BPUlR9LAotICAgIHsibm50cCIsIERFRkFVTFRfTk5UUF9QT1JUfSwKLSAgICB7IndhaXMiLCBERUZBVUxUX1dBSVNfUE9SVH0sCi0gICAgeyJzbmV3cyIsIERFRkFVTFRfU05FV1NfUE9SVH0sCi0gICAgeyJwcm9zcGVybyIsIERFRkFVTFRfUFJPU1BFUk9fUE9SVH0sCi0gICAge05VTEwsIC0xfQkJCS8qIHVua25vd24gcG9ydCAqLwotfTsKLQotLyoKLSAqIEEgV2ViIHByb3h5IG1vZHVsZS4gU3RhZ2VzOgotICoKLSAqICB0cmFuc2xhdGVfbmFtZTogc2V0IGZpbGVuYW1lIHRvIHByb3h5OjxVUkw+Ci0gKiAgdHlwZV9jaGVja2VyOiAgIHNldCB0eXBlIHRvIFBST1hZX01BR0lDX1RZUEUgaWYgZmlsZW5hbWUgYmVnaW5zIHByb3h5OgotICogIGZpeF91cHM6ICAgICAgICBjb252ZXJ0IHRoZSBVUkwgc3RvcmVkIGluIHRoZSBmaWxlbmFtZSB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgY2Fub25pY2FsIGZvcm0uCi0gKiAgaGFuZGxlcjogICAgICAgIGhhbmRsZSBwcm94eSByZXF1ZXN0cwotICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBUcmFuc2xhdGUgdGhlIFVSTCBpbnRvIGEgJ2ZpbGVuYW1lJyAqLwotCi1zdGF0aWMgaW50IGFsaWFzX21hdGNoKGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgY2hhciAqYWxpYXNfZmFrZW5hbWUpCi17Ci0gICAgY29uc3QgY2hhciAqZW5kX2Zha2VuYW1lID0gYWxpYXNfZmFrZW5hbWUgKyBzdHJsZW4oYWxpYXNfZmFrZW5hbWUpOwotICAgIGNvbnN0IGNoYXIgKmFsaWFzcCA9IGFsaWFzX2Zha2VuYW1lLCAqdXJpcCA9IHVyaTsKLQotICAgIHdoaWxlIChhbGlhc3AgPCBlbmRfZmFrZW5hbWUpIHsKLQlpZiAoKmFsaWFzcCA9PSAnLycpIHsKLQkgICAgLyogYW55IG51bWJlciBvZiAnLycgaW4gdGhlIGFsaWFzIG1hdGNoZXMgYW55IG51bWJlciBpbgotCSAgICAgKiB0aGUgc3VwcGxpZWQgVVJJLCBidXQgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUuLi4KLQkgICAgICovCi0JICAgIGlmICgqdXJpcCAhPSAnLycpCi0JCXJldHVybiAwOwotCi0JICAgIHdoaWxlICgqYWxpYXNwID09ICcvJykKLQkJKythbGlhc3A7Ci0JICAgIHdoaWxlICgqdXJpcCA9PSAnLycpCi0JCSsrdXJpcDsKLQl9Ci0JZWxzZSB7Ci0JICAgIC8qIE90aGVyIGNoYXJhY3RlcnMgYXJlIGNvbXBhcmVkIGxpdGVyYWxseSAqLwotCSAgICBpZiAoKnVyaXArKyAhPSAqYWxpYXNwKyspCi0JCXJldHVybiAwOwotCX0KLSAgICB9Ci0KLSAgICAvKiBDaGVjayBsYXN0IGFsaWFzIHBhdGggY29tcG9uZW50IG1hdGNoZWQgYWxsIHRoZSB3YXkgKi8KLQotICAgIGlmIChhbGlhc3BbLTFdICE9ICcvJyAmJiAqdXJpcCAhPSAnXDAnICYmICp1cmlwICE9ICcvJykKLQlyZXR1cm4gMDsKLQotICAgIC8qIFJldHVybiBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIFVSSSB3aGljaCBtYXRjaGVkIChtYXkgYmUKLSAgICAgKiBncmVhdGVyIHRoYW4gbGVuZ3RoIG9mIGFsaWFzLCBzaW5jZSB3ZSBtYXkgaGF2ZSBtYXRjaGVkCi0gICAgICogZG91YmxlZCBzbGFzaGVzKQotICAgICAqLwotCi0gICAgcmV0dXJuIHVyaXAgLSB1cmk7Ci19Ci0KLS8qIERldGVjdCBpZiBhbiBhYnNvbHV0ZVVSSSBzaG91bGQgYmUgcHJveGllZCBvciBub3QuICBOb3RlIHRoYXQgd2UKLSAqIGhhdmUgdG8gZG8gdGhpcyBkdXJpbmcgdGhpcyBwaGFzZSBiZWNhdXNlIGxhdGVyIHBoYXNlcyBhcmUKLSAqICJzaG9ydC1jaXJjdWl0aW5nIi4uLiBpLmUuIHRyYW5zbGF0ZV9uYW1lcyB3aWxsIGVuZCB3aGVuIHRoZSBmaXJzdAotICogbW9kdWxlIHJldHVybnMgT0suICBTbyBmb3IgZXhhbXBsZSwgaWYgdGhlIHJlcXVlc3QgaXMgc29tZXRoaW5nIGxpa2U6Ci0gKgotICogR0VUIGh0dHA6Ly9vdGhlcnZob3N0L2NnaS1iaW4vcHJpbnRlbnYgSFRUUC8xLjAKLSAqCi0gKiBtb2RfYWxpYXMgd2lsbCBub3RpY2UgdGhlIC9jZ2ktYmluIHBhcnQgYW5kIFNjcmlwdEFsaWFzIGl0IGFuZAotICogc2hvcnQtY2lyY3VpdCB0aGUgcHJveHkuLi4ganVzdCBiZWNhdXNlIG9mIHRoZSBvcmRlcmluZyBpbiB0aGUKLSAqIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAqLwotc3RhdGljIGludCBwcm94eV9kZXRlY3QocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgdm9pZCAqc2NvbmYgPSByLT5zZXJ2ZXItPm1vZHVsZV9jb25maWc7Ci0gICAgcHJveHlfc2VydmVyX2NvbmYgKmNvbmY7Ci0KLSAgICBjb25mID0gKHByb3h5X3NlcnZlcl9jb25mICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHNjb25mLCAmcHJveHlfbW9kdWxlKTsKLQotICAgIGlmIChjb25mLT5yZXEgJiYgci0+cGFyc2VkX3VyaS5zY2hlbWUpIHsKLQkvKiBidXQgaXQgbWlnaHQgYmUgc29tZXRoaW5nIHZob3N0ZWQgKi8KLSAgICAgICBpZiAoIShyLT5wYXJzZWRfdXJpLmhvc3RuYW1lCi0JICAgICYmICFzdHJjYXNlY21wKHItPnBhcnNlZF91cmkuc2NoZW1lLCBhcF9odHRwX21ldGhvZChyKSkKLQkgICAgJiYgYXBfbWF0Y2hlc19yZXF1ZXN0X3Zob3N0KHIsIHItPnBhcnNlZF91cmkuaG9zdG5hbWUsCi0gICAgICAgICAgICAgICByLT5wYXJzZWRfdXJpLnBvcnRfc3RyID8gci0+cGFyc2VkX3VyaS5wb3J0IDogYXBfZGVmYXVsdF9wb3J0KHIpKSkpIHsKLQkgICAgci0+cHJveHlyZXEgPSAxOwotCSAgICByLT51cmkgPSByLT51bnBhcnNlZF91cmk7Ci0JICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCAicHJveHk6Iiwgci0+dXJpLCBOVUxMKTsKLQkgICAgci0+aGFuZGxlciA9ICJwcm94eS1zZXJ2ZXIiOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIFdlIG5lZWQgc3BlY2lhbCB0cmVhdG1lbnQgZm9yIENPTk5FQ1QgcHJveHlpbmc6IGl0IGhhcyBubyBzY2hlbWUgcGFydCAqLwotICAgIGVsc2UgaWYgKGNvbmYtPnJlcSAmJiByLT5tZXRob2RfbnVtYmVyID09IE1fQ09OTkVDVAotCSAgICAgJiYgci0+cGFyc2VkX3VyaS5ob3N0bmFtZQotCSAgICAgJiYgci0+cGFyc2VkX3VyaS5wb3J0X3N0cikgewotCSAgICByLT5wcm94eXJlcSA9IDE7Ci0JICAgIHItPnVyaSA9IHItPnVucGFyc2VkX3VyaTsKLQkgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsICJwcm94eToiLCByLT51cmksIE5VTEwpOwotCSAgICByLT5oYW5kbGVyID0gInByb3h5LXNlcnZlciI7Ci0gICAgfQotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotc3RhdGljIGludCBwcm94eV90cmFucyhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICB2b2lkICpzY29uZiA9IHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZzsKLSAgICBwcm94eV9zZXJ2ZXJfY29uZiAqY29uZiA9Ci0gICAgKHByb3h5X3NlcnZlcl9jb25mICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHNjb25mLCAmcHJveHlfbW9kdWxlKTsKLSAgICBpbnQgaSwgbGVuOwotICAgIHN0cnVjdCBwcm94eV9hbGlhcyAqZW50ID0gKHN0cnVjdCBwcm94eV9hbGlhcyAqKSBjb25mLT5hbGlhc2VzLT5lbHRzOwotCi0gICAgaWYgKHItPnByb3h5cmVxKSB7Ci0JLyogc29tZW9uZSBoYXMgYWxyZWFkeSBzZXQgdXAgdGhlIHByb3h5LCBpdCB3YXMgcG9zc2libHkgb3Vyc2VsdmVzCi0JICogaW4gcHJveHlfZGV0ZWN0Ci0JICovCi0JcmV0dXJuIE9LOwotICAgIH0KLQotICAgIC8qIFhYWDogc2luY2Ugci0+dXJpIGhhcyBiZWVuIG1hbmlwdWxhdGVkIGFscmVhZHkgd2UncmUgbm90IHJlYWxseQotICAgICAqIGNvbXBsaWFudCB3aXRoIFJGQzE5NDUgYXQgdGhpcyBwb2ludC4gIEJ1dCB0aGlzIHByb2JhYmx5IGlzbid0Ci0gICAgICogYW4gaXNzdWUgYmVjYXVzZSB0aGlzIGlzIGEgaHlicmlkIHByb3h5L29yaWdpbiBzZXJ2ZXIuCi0gICAgICovCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgY29uZi0+YWxpYXNlcy0+bmVsdHM7IGkrKykgewotICAgICAgICBsZW4gPSBhbGlhc19tYXRjaChyLT51cmksIGVudFtpXS5mYWtlKTsKLQkgICAgCi0gICAgICAgaWYgKGxlbiA+IDApIHsKLSAgICAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsICJwcm94eToiLCBlbnRbaV0ucmVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnVyaSArIGxlbiwgTlVMTCk7Ci0gICAgICAgICAgIHItPmhhbmRsZXIgPSAicHJveHktc2VydmVyIjsKLSAgICAgICAgICAgci0+cHJveHlyZXEgPSAxOwotICAgICAgICAgICByZXR1cm4gT0s7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gREVDTElORUQ7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBGaXh1cCB0aGUgZmlsZW5hbWUgKi8KLQotLyoKLSAqIENhbm9uaWNhbGlzZSB0aGUgVVJMCi0gKi8KLXN0YXRpYyBpbnQgcHJveHlfZml4dXAocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY2hhciAqdXJsLCAqcDsKLQotICAgIGlmICghci0+cHJveHlyZXEgfHwgc3RybmNtcChyLT5maWxlbmFtZSwgInByb3h5OiIsIDYpICE9IDApCi0JcmV0dXJuIERFQ0xJTkVEOwotCi0gICAgdXJsID0gJnItPmZpbGVuYW1lWzZdOwotCi0vKiBjYW5vbmljYWxpc2UgZWFjaCBzcGVjaWZpYyBzY2hlbWUgKi8KLSAgICBpZiAoc3RybmNhc2VjbXAodXJsLCAiaHR0cDoiLCA1KSA9PSAwKQotCXJldHVybiBhcF9wcm94eV9odHRwX2Nhbm9uKHIsIHVybCArIDUsICJodHRwIiwgREVGQVVMVF9IVFRQX1BPUlQpOwotICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wKHVybCwgImZ0cDoiLCA0KSA9PSAwKQotCXJldHVybiBhcF9wcm94eV9mdHBfY2Fub24ociwgdXJsICsgNCk7Ci0KLSAgICBwID0gc3RyY2hyKHVybCwgJzonKTsKLSAgICBpZiAocCA9PSBOVUxMIHx8IHAgPT0gdXJsKQotCXJldHVybiBIVFRQX0JBRF9SRVFVRVNUOwotCi0gICAgcmV0dXJuIE9LOwkJLyogb3RoZXJ3aXNlOyB3ZSd2ZSBkb25lIHRoZSBiZXN0IHdlIGNhbiAqLwotfQotCi1zdGF0aWMgdm9pZCBwcm94eV9pbml0KHNlcnZlcl9yZWMgKnIsIHBvb2wgKnApCi17Ci0gICAgYXBfcHJveHlfZ2FyYmFnZV9pbml0KHIsIHApOwotfQotCi0KLQotLyogU2VuZCBhIHJlZGlyZWN0aW9uIGlmIHRoZSByZXF1ZXN0IGNvbnRhaW5zIGEgaG9zdG5hbWUgd2hpY2ggaXMgbm90ICovCi0vKiBmdWxseSBxdWFsaWZpZWQsIGkuZS4gZG9lc24ndCBoYXZlIGEgZG9tYWluIG5hbWUgYXBwZW5kZWQuIFNvbWUgcHJveHkgKi8KLS8qIHNlcnZlcnMgbGlrZSBOZXRzY2FwZSdzIGFsbG93IHRoaXMgYW5kIGFjY2VzcyBob3N0cyBmcm9tIHRoZSBsb2NhbCAqLwotLyogZG9tYWluIGluIHRoaXMgY2FzZS4gSSB0aGluayBpdCBpcyBiZXR0ZXIgdG8gcmVkaXJlY3QgdG8gYSBGUUROLCBzaW5jZSAqLwotLyogdGhlc2Ugd2lsbCBsYXRlciBiZSBmb3VuZCBpbiB0aGUgYm9va21hcmtzIGZpbGVzLiAqLwotLyogVGhlICJQcm94eURvbWFpbiIgZGlyZWN0aXZlIGRldGVybWluZXMgd2hhdCBkb21haW4gd2lsbCBiZSBhcHBlbmRlZCAqLwotc3RhdGljIGludCBwcm94eV9uZWVkc2RvbWFpbihyZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqdXJsLCBjb25zdCBjaGFyICpkb21haW4pCi17Ci0gICAgY2hhciAqbnVyaTsKLSAgICBjb25zdCBjaGFyICpyZWY7Ci0KLSAgICAvKiBXZSBvbmx5IHdhbnQgdG8gd29ycnkgYWJvdXQgR0VUcyAqLwotICAgIGlmICghci0+cHJveHlyZXEgfHwgci0+bWV0aG9kX251bWJlciAhPSBNX0dFVCB8fCAhci0+cGFyc2VkX3VyaS5ob3N0bmFtZSkKLQlyZXR1cm4gREVDTElORUQ7Ci0KLSAgICAvKiBJZiBob3N0IGRvZXMgY29udGFpbiBhIGRvdCBhbHJlYWR5LCBvciBpdCBpcyAibG9jYWxob3N0IiwgZGVjbGluZSAqLwotICAgIGlmIChzdHJjaHIoci0+cGFyc2VkX3VyaS5ob3N0bmFtZSwgJy4nKSAhPSBOVUxMCi0gICAgIHx8IHN0cmNhc2VjbXAoci0+cGFyc2VkX3VyaS5ob3N0bmFtZSwgImxvY2FsaG9zdCIpID09IDApCi0JcmV0dXJuIERFQ0xJTkVEOwkvKiBob3N0IG5hbWUgaGFzIGEgZG90IGFscmVhZHkgKi8KLQotICAgIHJlZiA9IGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiUmVmZXJlciIpOwotCi0gICAgLyogUmVhc3NlbWJsZSB0aGUgcmVxdWVzdCwgYnV0IGluc2VydCB0aGUgZG9tYWluIGFmdGVyIHRoZSBob3N0IG5hbWUgKi8KLSAgICAvKiBOb3RlIHRoYXQgdGhlIGRvbWFpbiBuYW1lIGFsd2F5cyBzdGFydHMgd2l0aCBhIGRvdCAqLwotICAgIHItPnBhcnNlZF91cmkuaG9zdG5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHItPnBhcnNlZF91cmkuaG9zdG5hbWUsCi0JCQkJICAgICBkb21haW4sIE5VTEwpOwotICAgIG51cmkgPSBhcF91bnBhcnNlX3VyaV9jb21wb25lbnRzKHItPnBvb2wsCi0JCQkJICAmci0+cGFyc2VkX3VyaSwKLQkJCQkgIFVOUF9SRVZFQUxQQVNTV09SRCk7Ci0KLSAgICBhcF90YWJsZV9zZXQoci0+aGVhZGVyc19vdXQsICJMb2NhdGlvbiIsIG51cmkpOwotICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfSU5GT3xBUExPR19OT0VSUk5PLCByLAotCQkiRG9tYWluIG1pc3Npbmc6ICVzIHNlbnQgdG8gJXMlcyVzIiwgci0+dXJpLAotCQlhcF91bnBhcnNlX3VyaV9jb21wb25lbnRzKHItPnBvb2wsICZyLT5wYXJzZWRfdXJpLAotCQkgICAgICBVTlBfT01JVFVTRVJJTkZPKSwKLQkJcmVmID8gIiBmcm9tICIgOiAiIiwgcmVmID8gcmVmIDogIiIpOwotCi0gICAgcmV0dXJuIEhUVFBfTU9WRURfUEVSTUFORU5UTFk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBJbnZva2UgaGFuZGxlciAqLwotCi1zdGF0aWMgaW50IHByb3h5X2hhbmRsZXIocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY2hhciAqdXJsLCAqc2NoZW1lLCAqcDsKLSAgICB2b2lkICpzY29uZiA9IHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZzsKLSAgICBwcm94eV9zZXJ2ZXJfY29uZiAqY29uZiA9Ci0gICAgKHByb3h5X3NlcnZlcl9jb25mICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHNjb25mLCAmcHJveHlfbW9kdWxlKTsKLSAgICBhcnJheV9oZWFkZXIgKnByb3hpZXMgPSBjb25mLT5wcm94aWVzOwotICAgIHN0cnVjdCBwcm94eV9yZW1vdGUgKmVudHMgPSAoc3RydWN0IHByb3h5X3JlbW90ZSAqKSBwcm94aWVzLT5lbHRzOwotICAgIGludCBpLCByYzsKLSAgICBjYWNoZV9yZXEgKmNyOwotICAgIGludCBkaXJlY3RfY29ubmVjdCA9IDA7Ci0gICAgY29uc3QgY2hhciAqbWF4ZndkX3N0cjsKLQotICAgIGlmICghci0+cHJveHlyZXEgfHwgc3RybmNtcChyLT5maWxlbmFtZSwgInByb3h5OiIsIDYpICE9IDApCi0JcmV0dXJuIERFQ0xJTkVEOwotCi0gICAgaWYgKHItPm1ldGhvZF9udW1iZXIgPT0gTV9UUkFDRSAmJgotCShtYXhmd2Rfc3RyID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJNYXgtRm9yd2FyZHMiKSkgIT0gTlVMTCkgewotCWludCBtYXhmd2QgPSBzdHJ0b2wobWF4ZndkX3N0ciwgTlVMTCwgMTApOwotCWlmIChtYXhmd2QgPCAxKSB7Ci0JICAgIGludCBhY2Nlc3Nfc3RhdHVzOwotCSAgICByLT5wcm94eXJlcSA9IDA7Ci0JICAgIGlmICgoYWNjZXNzX3N0YXR1cyA9IGFwX3NlbmRfaHR0cF90cmFjZShyKSkpCi0JCWFwX2RpZShhY2Nlc3Nfc3RhdHVzLCByKTsKLQkgICAgZWxzZQotCQlhcF9maW5hbGl6ZV9yZXF1ZXN0X3Byb3RvY29sKHIpOwotCSAgICByZXR1cm4gT0s7Ci0JfQotCWFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19pbiwgIk1heC1Gb3J3YXJkcyIsIAotCQkgICAgICBhcF9wc3ByaW50ZihyLT5wb29sLCAiJWQiLCAobWF4ZndkID4gMCkgPyBtYXhmd2QtMSA6IDApKTsKLSAgICB9Ci0KLSAgICBpZiAoKHJjID0gYXBfc2V0dXBfY2xpZW50X2Jsb2NrKHIsIFJFUVVFU1RfQ0hVTktFRF9FUlJPUikpKQotCXJldHVybiByYzsKLQotICAgIHVybCA9IHItPmZpbGVuYW1lICsgNjsKLSAgICBwID0gc3RyY2hyKHVybCwgJzonKTsKLSAgICBpZiAocCA9PSBOVUxMKQotCXJldHVybiBIVFRQX0JBRF9SRVFVRVNUOwotCi0gICAgcmMgPSBhcF9wcm94eV9jYWNoZV9jaGVjayhyLCB1cmwsICZjb25mLT5jYWNoZSwgJmNyKTsKLSAgICBpZiAocmMgIT0gREVDTElORUQpCi0JcmV0dXJuIHJjOwotCi0gICAgLyogSWYgdGhlIGhvc3QgZG9lc24ndCBoYXZlIGEgZG9tYWluIG5hbWUsIGFkZCBvbmUgYW5kIHJlZGlyZWN0LiAqLwotICAgIGlmIChjb25mLT5kb21haW4gIT0gTlVMTCkgewotCXJjID0gcHJveHlfbmVlZHNkb21haW4ociwgdXJsLCBjb25mLT5kb21haW4pOwotCWlmIChhcF9pc19IVFRQX1JFRElSRUNUKHJjKSkKLQkgICAgcmV0dXJuIEhUVFBfTU9WRURfUEVSTUFORU5UTFk7Ci0gICAgfQotCi0gICAgKnAgPSAnXDAnOwotICAgIHNjaGVtZSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgdXJsKTsKLSAgICAqcCA9ICc6JzsKLQotICAgIC8qIENoZWNrIFVSSSdzIGRlc3RpbmF0aW9uIGhvc3QgYWdhaW5zdCBOb1Byb3h5IGhvc3RzICovCi0gICAgLyogQnlwYXNzIFByb3h5UmVtb3RlIHNlcnZlciBsb29rdXAgaWYgY29uZmlndXJlZCBhcyBOb1Byb3h5ICovCi0gICAgLyogd2Ugb25seSBrbm93IGhvdyB0byBoYW5kbGUgY29tbXVuaWNhdGlvbiB0byBhIHByb3h5IHZpYSBodHRwICovCi0gICAgLyppZiAoc3RyY2FzZWNtcChzY2hlbWUsICJodHRwIikgPT0gMCkgKi8KLSAgICB7Ci0JaW50IGlpOwotCXN0cnVjdCBkaXJjb25uX2VudHJ5ICpsaXN0ID0gKHN0cnVjdCBkaXJjb25uX2VudHJ5ICopIGNvbmYtPmRpcmNvbm4tPmVsdHM7Ci0KLQlmb3IgKGRpcmVjdF9jb25uZWN0ID0gaWkgPSAwOyBpaSA8IGNvbmYtPmRpcmNvbm4tPm5lbHRzICYmICFkaXJlY3RfY29ubmVjdDsgaWkrKykgewotCSAgICBkaXJlY3RfY29ubmVjdCA9IGxpc3RbaWldLm1hdGNoZXIoJmxpc3RbaWldLCByKTsKLQl9Ci0jaWYgREVCVUdHSU5HCi0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19ERUJVR3xBUExPR19OT0VSUk5PLCByLAotCQkgICAgIChkaXJlY3RfY29ubmVjdCkgPyAiTm9Qcm94eSBmb3IgJXMiIDogIlVzZVByb3h5IGZvciAlcyIsCi0JCSAgICAgci0+dXJpKTsKLSNlbmRpZgotICAgIH0KLQotLyogZmlyc3RseSwgdHJ5IGEgcHJveHksIHVubGVzcyBhIE5vUHJveHkgZGlyZWN0aXZlIGlzIGFjdGl2ZSAqLwotCi0gICAgaWYgKCFkaXJlY3RfY29ubmVjdCkKLQlmb3IgKGkgPSAwOyBpIDwgcHJveGllcy0+bmVsdHM7IGkrKykgewotCSAgICBwID0gc3RyY2hyKGVudHNbaV0uc2NoZW1lLCAnOicpOwkvKiBpcyBpdCBhIHBhcnRpYWwgVVJMPyAqLwotCSAgICBpZiAoc3RyY21wKGVudHNbaV0uc2NoZW1lLCAiKiIpID09IDAgfHwKLQkJKHAgPT0gTlVMTCAmJiBzdHJjYXNlY21wKHNjaGVtZSwgZW50c1tpXS5zY2hlbWUpID09IDApIHx8Ci0JCShwICE9IE5VTEwgJiYKLQkgICAgICAgc3RybmNhc2VjbXAodXJsLCBlbnRzW2ldLnNjaGVtZSwgc3RybGVuKGVudHNbaV0uc2NoZW1lKSkgPT0gMCkpIHsKLQkJLyogQ09OTkVDVCBpcyBhIHNwZWNpYWwgbWV0aG9kIHRoYXQgYnlwYXNzZXMgdGhlIG5vcm1hbAotCQkgKiBwcm94eSBjb2RlLgotCQkgKi8KLQkJaWYgKHItPm1ldGhvZF9udW1iZXIgPT0gTV9DT05ORUNUKQotCQkgICAgcmMgPSBhcF9wcm94eV9jb25uZWN0X2hhbmRsZXIociwgY3IsIHVybCwgZW50c1tpXS5ob3N0bmFtZSwKLQkJCQkJICAgICAgIGVudHNbaV0ucG9ydCk7Ci0vKiB3ZSBvbmx5IGtub3cgaG93IHRvIGhhbmRsZSBjb21tdW5pY2F0aW9uIHRvIGEgcHJveHkgdmlhIGh0dHAgKi8KLQkJZWxzZSBpZiAoc3RyY2FzZWNtcChlbnRzW2ldLnByb3RvY29sLCAiaHR0cCIpID09IDApCi0JCSAgICByYyA9IGFwX3Byb3h5X2h0dHBfaGFuZGxlcihyLCBjciwgdXJsLCBlbnRzW2ldLmhvc3RuYW1lLAotCQkJCQkgICAgZW50c1tpXS5wb3J0KTsKLQkJZWxzZQotCQkgICAgcmMgPSBERUNMSU5FRDsKLQotCQkvKiBhbiBlcnJvciBvciBzdWNjZXNzICovCi0JCWlmIChyYyAhPSBERUNMSU5FRCAmJiByYyAhPSBIVFRQX0JBRF9HQVRFV0FZKQotCQkgICAgcmV0dXJuIHJjOwotCQkvKiB3ZSBmYWlsZWQgdG8gdGFsayB0byB0aGUgdXBzdHJlYW0gcHJveHkgKi8KLQkgICAgfQotCX0KLQotLyogb3RoZXJ3aXNlLCB0cnkgaXQgZGlyZWN0ICovCi0vKiBOLkIuIHdoYXQgaWYgd2UncmUgYmVoaW5kIGEgZmlyZXdhbGwsIHdoZXJlIHdlIG11c3QgdXNlIGEgcHJveHkgb3IKLSAqIGdpdmUgdXA/PwotICovCi0gICAgLyogaGFuZGxlIHRoZSBzY2hlbWUgKi8KLSAgICBpZiAoci0+bWV0aG9kX251bWJlciA9PSBNX0NPTk5FQ1QpCi0JcmV0dXJuIGFwX3Byb3h5X2Nvbm5lY3RfaGFuZGxlcihyLCBjciwgdXJsLCBOVUxMLCAwKTsKLSAgICBpZiAoc3RyY2FzZWNtcChzY2hlbWUsICJodHRwIikgPT0gMCkKLQlyZXR1cm4gYXBfcHJveHlfaHR0cF9oYW5kbGVyKHIsIGNyLCB1cmwsIE5VTEwsIDApOwotICAgIGlmIChzdHJjYXNlY21wKHNjaGVtZSwgImZ0cCIpID09IDApCi0JcmV0dXJuIGFwX3Byb3h5X2Z0cF9oYW5kbGVyKHIsIGNyLCB1cmwpOwotICAgIGVsc2UKLQlyZXR1cm4gSFRUUF9GT1JCSURERU47Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBTZXR1cCBjb25maWd1cmFibGUgZGF0YSAqLwotCi1zdGF0aWMgdm9pZCAqCi0gICAgIGNyZWF0ZV9wcm94eV9jb25maWcocG9vbCAqcCwgc2VydmVyX3JlYyAqcykKLXsKLSAgICBwcm94eV9zZXJ2ZXJfY29uZiAqcHMgPSBhcF9wY2FsbG9jKHAsIHNpemVvZihwcm94eV9zZXJ2ZXJfY29uZikpOwotCi0gICAgcHMtPnByb3hpZXMgPSBhcF9tYWtlX2FycmF5KHAsIDEwLCBzaXplb2Yoc3RydWN0IHByb3h5X3JlbW90ZSkpOwotICAgIHBzLT5hbGlhc2VzID0gYXBfbWFrZV9hcnJheShwLCAxMCwgc2l6ZW9mKHN0cnVjdCBwcm94eV9hbGlhcykpOwotICAgIHBzLT5yYWxpYXNlcyA9IGFwX21ha2VfYXJyYXkocCwgMTAsIHNpemVvZihzdHJ1Y3QgcHJveHlfYWxpYXMpKTsKLSAgICBwcy0+bm9wcm94aWVzID0gYXBfbWFrZV9hcnJheShwLCAxMCwgc2l6ZW9mKHN0cnVjdCBub3Byb3h5X2VudHJ5KSk7Ci0gICAgcHMtPmRpcmNvbm4gPSBhcF9tYWtlX2FycmF5KHAsIDEwLCBzaXplb2Yoc3RydWN0IGRpcmNvbm5fZW50cnkpKTsKLSAgICBwcy0+bm9jYWNoZXMgPSBhcF9tYWtlX2FycmF5KHAsIDEwLCBzaXplb2Yoc3RydWN0IG5vY2FjaGVfZW50cnkpKTsKLSAgICBwcy0+YWxsb3dlZF9jb25uZWN0X3BvcnRzID0gYXBfbWFrZV9hcnJheShwLCAxMCwgc2l6ZW9mKGludCkpOwotICAgIHBzLT5kb21haW4gPSBOVUxMOwotICAgIHBzLT52aWFvcHQgPSB2aWFfb2ZmOyAvKiBpbml0aWFsbHkgYmFja3dhcmQgY29tcGF0aWJsZSB3aXRoIDEuMy4xICovCi0gICAgcHMtPnJlcSA9IDA7Ci0KLSAgICBwcy0+Y2FjaGUucm9vdCA9IE5VTEw7Ci0gICAgcHMtPmNhY2hlLnNwYWNlID0gREVGQVVMVF9DQUNIRV9TUEFDRTsKLSAgICBwcy0+Y2FjaGUubWF4ZXhwaXJlID0gREVGQVVMVF9DQUNIRV9NQVhFWFBJUkU7Ci0gICAgcHMtPmNhY2hlLmRlZmF1bHRleHBpcmUgPSBERUZBVUxUX0NBQ0hFX0VYUElSRTsKLSAgICBwcy0+Y2FjaGUubG1mYWN0b3IgPSBERUZBVUxUX0NBQ0hFX0xNRkFDVE9SOwotICAgIHBzLT5jYWNoZS5nY2ludGVydmFsID0gLTE7Ci0gICAgLyogYXQgdGhlc2UgbGV2ZWxzLCB0aGUgY2FjaGUgY2FuIGhhdmUgMl4xOCBkaXJlY3RvcmllcyAoMjU2LDAwMCkgICovCi0gICAgcHMtPmNhY2hlLmRpcmxldmVscyA9IDM7Ci0gICAgcHMtPmNhY2hlLmRpcmxlbmd0aCA9IDE7Ci0gICAgcHMtPmNhY2hlLmNhY2hlX2NvbXBsZXRpb24gPSBERUZBVUxUX0NBQ0hFX0NPTVBMRVRJT047Ci0KLSAgICByZXR1cm4gcHM7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLSAgICAgYWRkX3Byb3h5KGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqZiwgY2hhciAqcikKLXsKLSAgICBzZXJ2ZXJfcmVjICpzID0gY21kLT5zZXJ2ZXI7Ci0gICAgcHJveHlfc2VydmVyX2NvbmYgKmNvbmYgPQotICAgIChwcm94eV9zZXJ2ZXJfY29uZiAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAmcHJveHlfbW9kdWxlKTsKLSAgICBzdHJ1Y3QgcHJveHlfcmVtb3RlICpuZXc7Ci0gICAgY2hhciAqcCwgKnE7Ci0gICAgaW50IHBvcnQ7Ci0KLSAgICBwID0gc3RyY2hyKHIsICc6Jyk7Ci0gICAgaWYgKHAgPT0gTlVMTCB8fCBwWzFdICE9ICcvJyB8fCBwWzJdICE9ICcvJyB8fCBwWzNdID09ICdcMCcpCi0JcmV0dXJuICJQcm94eVJlbW90ZTogQmFkIHN5bnRheCBmb3IgYSByZW1vdGUgcHJveHkgc2VydmVyIjsKLSAgICBxID0gc3RyY2hyKHAgKyAzLCAnOicpOwotICAgIGlmIChxICE9IE5VTEwpIHsKLQlpZiAoc3NjYW5mKHEgKyAxLCAiJXUiLCAmcG9ydCkgIT0gMSB8fCBwb3J0ID4gNjU1MzUpCi0JICAgIHJldHVybiAiUHJveHlSZW1vdGU6IEJhZCBzeW50YXggZm9yIGEgcmVtb3RlIHByb3h5IHNlcnZlciAoYmFkIHBvcnQgbnVtYmVyKSI7Ci0JKnEgPSAnXDAnOwotICAgIH0KLSAgICBlbHNlCi0JcG9ydCA9IC0xOwotICAgICpwID0gJ1wwJzsKLSAgICBpZiAoc3RyY2hyKGYsICc6JykgPT0gTlVMTCkKLQlhcF9zdHJfdG9sb3dlcihmKTsJCS8qIGxvd2VyY2FzZSBzY2hlbWUgKi8KLSAgICBhcF9zdHJfdG9sb3dlcihwICsgMyk7CQkvKiBsb3dlcmNhc2UgaG9zdG5hbWUgKi8KLQotICAgIGlmIChwb3J0ID09IC0xKSB7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgZGVmcG9ydHNbaV0uc2NoZW1lICE9IE5VTEw7IGkrKykKLQkgICAgaWYgKHN0cmNhc2VjbXAoZGVmcG9ydHNbaV0uc2NoZW1lLCByKSA9PSAwKQotCQlicmVhazsKLQlwb3J0ID0gZGVmcG9ydHNbaV0ucG9ydDsKLSAgICB9Ci0KLSAgICBuZXcgPSBhcF9wdXNoX2FycmF5KGNvbmYtPnByb3hpZXMpOwotICAgIG5ldy0+c2NoZW1lID0gZjsKLSAgICBuZXctPnByb3RvY29sID0gcjsKLSAgICBuZXctPmhvc3RuYW1lID0gcCArIDM7Ci0gICAgbmV3LT5wb3J0ID0gcG9ydDsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotICAgICBhZGRfcGFzcyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmYsIGNoYXIgKnIpCi17Ci0gICAgc2VydmVyX3JlYyAqcyA9IGNtZC0+c2VydmVyOwotICAgIHByb3h5X3NlcnZlcl9jb25mICpjb25mID0KLSAgICAocHJveHlfc2VydmVyX2NvbmYgKikgYXBfZ2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywgJnByb3h5X21vZHVsZSk7Ci0gICAgc3RydWN0IHByb3h5X2FsaWFzICpuZXc7Ci0KLSAgICBuZXcgPSBhcF9wdXNoX2FycmF5KGNvbmYtPmFsaWFzZXMpOwotICAgIG5ldy0+ZmFrZSA9IGY7Ci0gICAgbmV3LT5yZWFsID0gcjsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotICAgIGFkZF9wYXNzX3JldmVyc2UoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICpmLCBjaGFyICpyKQotewotICAgIHNlcnZlcl9yZWMgKnMgPSBjbWQtPnNlcnZlcjsKLSAgICBwcm94eV9zZXJ2ZXJfY29uZiAqY29uZjsKLSAgICBzdHJ1Y3QgcHJveHlfYWxpYXMgKm5ldzsKLQotICAgIGNvbmYgPSAocHJveHlfc2VydmVyX2NvbmYgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3h5X21vZHVsZSk7Ci0gICAgbmV3ID0gYXBfcHVzaF9hcnJheShjb25mLT5yYWxpYXNlcyk7Ci0gICAgbmV3LT5mYWtlID0gZjsKLSAgICBuZXctPnJlYWwgPSByOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi0gICAgIHNldF9wcm94eV9leGNsdWRlKGNtZF9wYXJtcyAqcGFybXMsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0gICAgc2VydmVyX3JlYyAqcyA9IHBhcm1zLT5zZXJ2ZXI7Ci0gICAgcHJveHlfc2VydmVyX2NvbmYgKmNvbmYgPQotICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsICZwcm94eV9tb2R1bGUpOwotICAgIHN0cnVjdCBub3Byb3h5X2VudHJ5ICpuZXc7Ci0gICAgc3RydWN0IG5vcHJveHlfZW50cnkgKmxpc3QgPSAoc3RydWN0IG5vcHJveHlfZW50cnkgKikgY29uZi0+bm9wcm94aWVzLT5lbHRzOwotICAgIHN0cnVjdCBob3N0ZW50IGhwOwotICAgIGludCBmb3VuZCA9IDA7Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBEb24ndCBkdXBsaWNhdGUgZW50cmllcyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBjb25mLT5ub3Byb3hpZXMtPm5lbHRzOyBpKyspIHsKLQlpZiAoc3RyY2FzZWNtcChhcmcsIGxpc3RbaV0ubmFtZSkgPT0gMCkgLyogaWdub3JlIGNhc2UgZm9yIGhvc3QgbmFtZXMgKi8KLQkgICAgZm91bmQgPSAxOwotICAgIH0KLQotICAgIGlmICghZm91bmQpIHsKLQluZXcgPSBhcF9wdXNoX2FycmF5KGNvbmYtPm5vcHJveGllcyk7Ci0JbmV3LT5uYW1lID0gYXJnOwotCS8qIERvbid0IGRvIG5hbWUgbG9va3VwcyBvbiB0aGluZ3MgdGhhdCBhcmVuJ3QgZG90dGVkICovCi0JaWYgKHN0cmNocihhcmcsICcuJykgIT0gTlVMTCAmJiBhcF9wcm94eV9ob3N0MmFkZHIobmV3LT5uYW1lLCAmaHApID09IE5VTEwpCi0JICAgIC8qQEBARklYTUU6IFRoaXMgY29waWVzIG9ubHkgdGhlIGZpcnN0IG9mIChwb3NzaWJseSBtYW55KSBJUCBhZGRycyAqLwotCSAgICBtZW1jcHkoJm5ldy0+YWRkciwgaHAuaF9hZGRyLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKLQllbHNlCi0JICAgIG5ldy0+YWRkci5zX2FkZHIgPSAwOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIFNldCB0aGUgcG9ydHMgQ09OTkVDVCBjYW4gdXNlCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICoKLSAgICBzZXRfYWxsb3dlZF9wb3J0cyhjbWRfcGFybXMgKnBhcm1zLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIHNlcnZlcl9yZWMgKnMgPSBwYXJtcy0+c2VydmVyOwotICAgIHByb3h5X3NlcnZlcl9jb25mICpjb25mID0KLSAgICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsICZwcm94eV9tb2R1bGUpOwotICAgIGludCAqTmV3OwotCi0gICAgaWYgKCFhcF9pc2RpZ2l0KGFyZ1swXSkpCi0JcmV0dXJuICJBbGxvd0NPTk5FQ1Q6IHBvcnQgbnVtYmVyIG11c3QgYmUgbnVtZXJpYyI7Ci0KLSAgICBOZXcgPSBhcF9wdXNoX2FycmF5KGNvbmYtPmFsbG93ZWRfY29ubmVjdF9wb3J0cyk7Ci0gICAgKk5ldyA9IGF0b2koYXJnKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2ltaWxhciB0byBzZXRfcHJveHlfZXhjbHVkZSgpLCBidXQgZGVmaW5pbmcgZGlyZWN0bHkgY29ubmVjdGVkIGhvc3RzLAotICogd2hpY2ggc2hvdWxkIG5ldmVyIGJlIGFjY2Vzc2VkIHZpYSB0aGUgY29uZmlndXJlZCBQcm94eVJlbW90ZSBzZXJ2ZXJzCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICoKLSAgICAgc2V0X3Byb3h5X2RpcmNvbm4oY21kX3Bhcm1zICpwYXJtcywgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBzZXJ2ZXJfcmVjICpzID0gcGFybXMtPnNlcnZlcjsKLSAgICBwcm94eV9zZXJ2ZXJfY29uZiAqY29uZiA9Ci0gICAgYXBfZ2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywgJnByb3h5X21vZHVsZSk7Ci0gICAgc3RydWN0IGRpcmNvbm5fZW50cnkgKk5ldzsKLSAgICBzdHJ1Y3QgZGlyY29ubl9lbnRyeSAqbGlzdCA9IChzdHJ1Y3QgZGlyY29ubl9lbnRyeSAqKSBjb25mLT5kaXJjb25uLT5lbHRzOwotICAgIGludCBmb3VuZCA9IDA7Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBEb24ndCBkdXBsaWNhdGUgZW50cmllcyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBjb25mLT5kaXJjb25uLT5uZWx0czsgaSsrKSB7Ci0JaWYgKHN0cmNhc2VjbXAoYXJnLCBsaXN0W2ldLm5hbWUpID09IDApCi0JICAgIGZvdW5kID0gMTsKLSAgICB9Ci0KLSAgICBpZiAoIWZvdW5kKSB7Ci0JTmV3ID0gYXBfcHVzaF9hcnJheShjb25mLT5kaXJjb25uKTsKLQlOZXctPm5hbWUgPSBhcmc7Ci0JTmV3LT5ob3N0ZW50cnkgPSBOVUxMOwotCi0JaWYgKGFwX3Byb3h5X2lzX2lwYWRkcihOZXcsIHBhcm1zLT5wb29sKSkgewotI2lmIERFQlVHR0lORwotCSAgICBmcHJpbnRmKHN0ZGVyciwgIlBhcnNlZCBhZGRyICVzXG4iLCBpbmV0X250b2EoTmV3LT5hZGRyKSk7Ci0JICAgIGZwcmludGYoc3RkZXJyLCAiUGFyc2VkIG1hc2sgJXNcbiIsIGluZXRfbnRvYShOZXctPm1hc2spKTsKLSNlbmRpZgotCX0KLQllbHNlIGlmIChhcF9wcm94eV9pc19kb21haW5uYW1lKE5ldywgcGFybXMtPnBvb2wpKSB7Ci0JICAgIGFwX3N0cl90b2xvd2VyKE5ldy0+bmFtZSk7Ci0jaWYgREVCVUdHSU5HCi0JICAgIGZwcmludGYoc3RkZXJyLCAiUGFyc2VkIGRvbWFpbiAlc1xuIiwgTmV3LT5uYW1lKTsKLSNlbmRpZgotCX0KLQllbHNlIGlmIChhcF9wcm94eV9pc19ob3N0bmFtZShOZXcsIHBhcm1zLT5wb29sKSkgewotCSAgICBhcF9zdHJfdG9sb3dlcihOZXctPm5hbWUpOwotI2lmIERFQlVHR0lORwotCSAgICBmcHJpbnRmKHN0ZGVyciwgIlBhcnNlZCBob3N0ICVzXG4iLCBOZXctPm5hbWUpOwotI2VuZGlmCi0JfQotCWVsc2UgewotCSAgICBhcF9wcm94eV9pc193b3JkKE5ldywgcGFybXMtPnBvb2wpOwotI2lmIERFQlVHR0lORwotCSAgICBmcHJpbnRmKHN0ZGVyciwgIlBhcnNlZCB3b3JkICVzXG4iLCBOZXctPm5hbWUpOwotI2VuZGlmCi0JfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotICAgICBzZXRfcHJveHlfZG9tYWluKGNtZF9wYXJtcyAqcGFybXMsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0gICAgcHJveHlfc2VydmVyX2NvbmYgKnBzZiA9Ci0gICAgYXBfZ2V0X21vZHVsZV9jb25maWcocGFybXMtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgJnByb3h5X21vZHVsZSk7Ci0KLSAgICBpZiAoYXJnWzBdICE9ICcuJykKLQlyZXR1cm4gIlByb3h5RG9tYWluOiBkb21haW4gbmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBkb3QuIjsKLQotICAgIHBzZi0+ZG9tYWluID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi0gICAgIHNldF9wcm94eV9yZXEoY21kX3Bhcm1zICpwYXJtcywgdm9pZCAqZHVtbXksIGludCBmbGFnKQotewotICAgIHByb3h5X3NlcnZlcl9jb25mICpwc2YgPQotICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKHBhcm1zLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsICZwcm94eV9tb2R1bGUpOwotCi0gICAgcHNmLT5yZXEgPSBmbGFnOwotICAgIHJldHVybiBOVUxMOwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLSAgICAgc2V0X2NhY2hlX3NpemUoY21kX3Bhcm1zICpwYXJtcywgY2hhciAqc3RydWN0X3B0ciwgY2hhciAqYXJnKQotewotICAgIHByb3h5X3NlcnZlcl9jb25mICpwc2YgPQotICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKHBhcm1zLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsICZwcm94eV9tb2R1bGUpOwotICAgIGludCB2YWw7Ci0KLSAgICBpZiAoc3NjYW5mKGFyZywgIiVkIiwgJnZhbCkgIT0gMSkKLQlyZXR1cm4gIkNhY2hlU2l6ZSB2YWx1ZSBtdXN0IGJlIGFuIGludGVnZXIgKGtCeXRlcykiOwotICAgIHBzZi0+Y2FjaGUuc3BhY2UgPSB2YWw7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLSAgICAgc2V0X2NhY2hlX3Jvb3QoY21kX3Bhcm1zICpwYXJtcywgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBwcm94eV9zZXJ2ZXJfY29uZiAqcHNmID0KLSAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhwYXJtcy0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCAmcHJveHlfbW9kdWxlKTsKLQotICAgIHBzZi0+Y2FjaGUucm9vdCA9IGFyZzsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi0gICAgIHNldF9jYWNoZV9mYWN0b3IoY21kX3Bhcm1zICpwYXJtcywgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBwcm94eV9zZXJ2ZXJfY29uZiAqcHNmID0KLSAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhwYXJtcy0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCAmcHJveHlfbW9kdWxlKTsKLSAgICBkb3VibGUgdmFsOwotCi0gICAgaWYgKHNzY2FuZihhcmcsICIlbGciLCAmdmFsKSAhPSAxKQotCXJldHVybiAiQ2FjaGVMYXN0TW9kaWZpZWRGYWN0b3IgdmFsdWUgbXVzdCBiZSBhIGZsb2F0IjsKLSAgICBwc2YtPmNhY2hlLmxtZmFjdG9yID0gdmFsOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLSAgICAgc2V0X2NhY2hlX21heGV4KGNtZF9wYXJtcyAqcGFybXMsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0gICAgcHJveHlfc2VydmVyX2NvbmYgKnBzZiA9Ci0gICAgYXBfZ2V0X21vZHVsZV9jb25maWcocGFybXMtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgJnByb3h5X21vZHVsZSk7Ci0gICAgZG91YmxlIHZhbDsKLQotICAgIGlmIChzc2NhbmYoYXJnLCAiJWxnIiwgJnZhbCkgIT0gMSkKLQlyZXR1cm4gIkNhY2hlTWF4RXhwaXJlIHZhbHVlIG11c3QgYmUgYSBmbG9hdCI7Ci0gICAgcHNmLT5jYWNoZS5tYXhleHBpcmUgPSAoaW50KSAodmFsICogKGRvdWJsZSkgU0VDX09ORV9IUik7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLSAgICAgc2V0X2NhY2hlX2RlZmV4KGNtZF9wYXJtcyAqcGFybXMsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0gICAgcHJveHlfc2VydmVyX2NvbmYgKnBzZiA9Ci0gICAgYXBfZ2V0X21vZHVsZV9jb25maWcocGFybXMtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgJnByb3h5X21vZHVsZSk7Ci0gICAgZG91YmxlIHZhbDsKLQotICAgIGlmIChzc2NhbmYoYXJnLCAiJWxnIiwgJnZhbCkgIT0gMSkKLQlyZXR1cm4gIkNhY2hlRGVmYXVsdEV4cGlyZSB2YWx1ZSBtdXN0IGJlIGEgZmxvYXQiOwotICAgIHBzZi0+Y2FjaGUuZGVmYXVsdGV4cGlyZSA9IChpbnQpICh2YWwgKiAoZG91YmxlKSBTRUNfT05FX0hSKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotICAgICBzZXRfY2FjaGVfZ2NpbnQoY21kX3Bhcm1zICpwYXJtcywgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBwcm94eV9zZXJ2ZXJfY29uZiAqcHNmID0KLSAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhwYXJtcy0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCAmcHJveHlfbW9kdWxlKTsKLSAgICBkb3VibGUgdmFsOwotCi0gICAgaWYgKHNzY2FuZihhcmcsICIlbGciLCAmdmFsKSAhPSAxKQotCXJldHVybiAiQ2FjaGVHY0ludGVydmFsIHZhbHVlIG11c3QgYmUgYSBmbG9hdCI7Ci0gICAgcHNmLT5jYWNoZS5nY2ludGVydmFsID0gKGludCkgKHZhbCAqIChkb3VibGUpIFNFQ19PTkVfSFIpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi0gICAgIHNldF9jYWNoZV9kaXJsZXZlbHMoY21kX3Bhcm1zICpwYXJtcywgY2hhciAqc3RydWN0X3B0ciwgY2hhciAqYXJnKQotewotICAgIHByb3h5X3NlcnZlcl9jb25mICpwc2YgPQotICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKHBhcm1zLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsICZwcm94eV9tb2R1bGUpOwotICAgIGludCB2YWw7Ci0KLSAgICB2YWwgPSBhdG9pKGFyZyk7Ci0gICAgaWYgKHZhbCA8IDEpCi0JcmV0dXJuICJDYWNoZURpckxldmVscyB2YWx1ZSBtdXN0IGJlIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIDAiOwotICAgIGlmICh2YWwgKiBwc2YtPmNhY2hlLmRpcmxlbmd0aCA+IENBQ0hFRklMRV9MRU4pCi0JcmV0dXJuICJDYWNoZURpckxldmVscypDYWNoZURpckxlbmd0aCB2YWx1ZSBtdXN0IG5vdCBiZSBoaWdoZXIgdGhhbiAyMCI7Ci0gICAgcHNmLT5jYWNoZS5kaXJsZXZlbHMgPSB2YWw7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLSAgICAgc2V0X2NhY2hlX2Rpcmxlbmd0aChjbWRfcGFybXMgKnBhcm1zLCBjaGFyICpzdHJ1Y3RfcHRyLCBjaGFyICphcmcpCi17Ci0gICAgcHJveHlfc2VydmVyX2NvbmYgKnBzZiA9Ci0gICAgYXBfZ2V0X21vZHVsZV9jb25maWcocGFybXMtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgJnByb3h5X21vZHVsZSk7Ci0gICAgaW50IHZhbDsKLQotICAgIHZhbCA9IGF0b2koYXJnKTsKLSAgICBpZiAodmFsIDwgMSkKLQlyZXR1cm4gIkNhY2hlRGlyTGVuZ3RoIHZhbHVlIG11c3QgYmUgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMCI7Ci0gICAgaWYgKHZhbCAqIHBzZi0+Y2FjaGUuZGlybGV2ZWxzID4gQ0FDSEVGSUxFX0xFTikKLQlyZXR1cm4gIkNhY2hlRGlyTGV2ZWxzKkNhY2hlRGlyTGVuZ3RoIHZhbHVlIG11c3Qgbm90IGJlIGhpZ2hlciB0aGFuIDIwIjsKLSAgICBwc2YtPmNhY2hlLmRpcmxlbmd0aCA9IHZhbDsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotICAgICBzZXRfY2FjaGVfZXhjbHVkZShjbWRfcGFybXMgKnBhcm1zLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIHNlcnZlcl9yZWMgKnMgPSBwYXJtcy0+c2VydmVyOwotICAgIHByb3h5X3NlcnZlcl9jb25mICpjb25mID0KLSAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAmcHJveHlfbW9kdWxlKTsKLSAgICBzdHJ1Y3Qgbm9jYWNoZV9lbnRyeSAqbmV3OwotICAgIHN0cnVjdCBub2NhY2hlX2VudHJ5ICpsaXN0ID0gKHN0cnVjdCBub2NhY2hlX2VudHJ5ICopIGNvbmYtPm5vY2FjaGVzLT5lbHRzOwotICAgIHN0cnVjdCBob3N0ZW50IGhwOwotICAgIGludCBmb3VuZCA9IDA7Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBEb24ndCBkdXBsaWNhdGUgZW50cmllcyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBjb25mLT5ub2NhY2hlcy0+bmVsdHM7IGkrKykgewotCWlmIChzdHJjYXNlY21wKGFyZywgbGlzdFtpXS5uYW1lKSA9PSAwKSAvKiBpZ25vcmUgY2FzZSBmb3IgaG9zdCBuYW1lcyAqLwotCSAgICBmb3VuZCA9IDE7Ci0gICAgfQotCi0gICAgaWYgKCFmb3VuZCkgewotCW5ldyA9IGFwX3B1c2hfYXJyYXkoY29uZi0+bm9jYWNoZXMpOwotCW5ldy0+bmFtZSA9IGFyZzsKLQkvKiBEb24ndCBkbyBuYW1lIGxvb2t1cHMgb24gdGhpbmdzIHRoYXQgYXJlbid0IGRvdHRlZCAqLwotCWlmIChzdHJjaHIoYXJnLCAnLicpICE9IE5VTEwgJiYgYXBfcHJveHlfaG9zdDJhZGRyKG5ldy0+bmFtZSwgJmhwKSA9PSBOVUxMKQotCSAgICAvKkBAQEZJWE1FOiBUaGlzIGNvcGllcyBvbmx5IHRoZSBmaXJzdCBvZiAocG9zc2libHkgbWFueSkgSVAgYWRkcnMgKi8KLQkgICAgbWVtY3B5KCZuZXctPmFkZHIsIGhwLmhfYWRkciwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7Ci0JZWxzZQotCSAgICBuZXctPmFkZHIuc19hZGRyID0gMDsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLSAgICAgc2V0X3JlY3ZfYnVmZmVyX3NpemUoY21kX3Bhcm1zICpwYXJtcywgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBwcm94eV9zZXJ2ZXJfY29uZiAqcHNmID0KLSAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhwYXJtcy0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCAmcHJveHlfbW9kdWxlKTsKLSAgICBpbnQgcyA9IGF0b2koYXJnKTsKLSAgICBpZiAocyA8IDUxMiAmJiBzICE9IDApIHsKLQlyZXR1cm4gIlByb3h5UmVjZWl2ZUJ1ZmZlclNpemUgbXVzdCBiZSA+PSA1MTIgYnl0ZXMsIG9yIDAgZm9yIHN5c3RlbSBkZWZhdWx0LiI7Ci0gICAgfQotCi0gICAgcHNmLT5yZWN2X2J1ZmZlcl9zaXplID0gczsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqCi0gICAgc2V0X2NhY2hlX2NvbXBsZXRpb24oY21kX3Bhcm1zICpwYXJtcywgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBwcm94eV9zZXJ2ZXJfY29uZiAqcHNmID0KLSAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhwYXJtcy0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCAmcHJveHlfbW9kdWxlKTsKLSAgICBpbnQgcyA9IGF0b2koYXJnKTsKLSAgICBpZiAocyA+IDEwMCB8fCBzIDwgMCkgewotCXJldHVybiAiQ2FjaGVGb3JjZUNvbXBsZXRpb24gbXVzdCBiZSA8PSAxMDAgcGVyY2VudCwgIgotICAgICAgICAgICAgICAgIm9yIDAgZm9yIHN5c3RlbSBkZWZhdWx0LiI7Ci0gICAgfQotCi0gICAgaWYgKHMgPiAwKQotICAgICAgcHNmLT5jYWNoZS5jYWNoZV9jb21wbGV0aW9uID0gKChmbG9hdClzIC8gMTAwKTsKLSAgICByZXR1cm4gTlVMTDsgICAgCi19Ci0KLXN0YXRpYyBjb25zdCBjaGFyKgotICAgIHNldF92aWFfb3B0KGNtZF9wYXJtcyAqcGFybXMsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0gICAgcHJveHlfc2VydmVyX2NvbmYgKnBzZiA9Ci0gICAgYXBfZ2V0X21vZHVsZV9jb25maWcocGFybXMtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgJnByb3h5X21vZHVsZSk7Ci0KLSAgICBpZiAoc3RyY2FzZWNtcChhcmcsICJPZmYiKSA9PSAwKQotICAgICAgICBwc2YtPnZpYW9wdCA9IHZpYV9vZmY7Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcChhcmcsICJPbiIpID09IDApCi0gICAgICAgIHBzZi0+dmlhb3B0ID0gdmlhX29uOwotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAoYXJnLCAiQmxvY2siKSA9PSAwKQotICAgICAgICBwc2YtPnZpYW9wdCA9IHZpYV9ibG9jazsKLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKGFyZywgIkZ1bGwiKSA9PSAwKQotICAgICAgICBwc2YtPnZpYW9wdCA9IHZpYV9mdWxsOwotICAgIGVsc2UgewotCXJldHVybiAiUHJveHlWaWEgbXVzdCBiZSBvbmUgb2Y6ICIKLSAgICAgICAgICAgICAgICJvZmYgfCBvbiB8IGZ1bGwgfCBibG9jayI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7ICAgIAotfQotCi1zdGF0aWMgY29uc3QgaGFuZGxlcl9yZWMgcHJveHlfaGFuZGxlcnNbXSA9Ci17Ci0gICAgeyJwcm94eS1zZXJ2ZXIiLCBwcm94eV9oYW5kbGVyfSwKLSAgICB7TlVMTH0KLX07Ci0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBwcm94eV9jbWRzW10gPQotewotICAgIHsiUHJveHlSZXF1ZXN0cyIsIHNldF9wcm94eV9yZXEsIE5VTEwsIFJTUkNfQ09ORiwgRkxBRywKLSAgICAgIm9uIGlmIHRoZSB0cnVlIHByb3h5IHJlcXVlc3RzIHNob3VsZCBiZSBhY2NlcHRlZCJ9LAotICAgIHsiUHJveHlSZW1vdGUiLCBhZGRfcHJveHksIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTIsCi0gICAgICJhIHNjaGVtZSwgcGFydGlhbCBVUkwgb3IgJyonIGFuZCBhIHByb3h5IHNlcnZlciJ9LAotICAgIHsiUHJveHlQYXNzIiwgYWRkX3Bhc3MsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTIsCi0gICAgICJhIHZpcnR1YWwgcGF0aCBhbmQgYSBVUkwifSwKLSAgICB7IlByb3h5UGFzc1JldmVyc2UiLCBhZGRfcGFzc19yZXZlcnNlLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UyLAotICAgICAiYSB2aXJ0dWFsIHBhdGggYW5kIGEgVVJMIGZvciByZXZlcnNlIHByb3h5IGJlaGF2aW91ciJ9LAotICAgIHsiUHJveHlCbG9jayIsIHNldF9wcm94eV9leGNsdWRlLCBOVUxMLCBSU1JDX0NPTkYsIElURVJBVEUsCi0gICAgICJBIGxpc3Qgb2YgbmFtZXMsIGhvc3RzIG9yIGRvbWFpbnMgdG8gd2hpY2ggdGhlIHByb3h5IHdpbGwgbm90IGNvbm5lY3QifSwKLSAgICB7IlByb3h5UmVjZWl2ZUJ1ZmZlclNpemUiLCBzZXRfcmVjdl9idWZmZXJfc2l6ZSwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAgIlJlY2VpdmUgYnVmZmVyIHNpemUgZm9yIG91dGdvaW5nIEhUVFAgYW5kIEZUUCBjb25uZWN0aW9ucyBpbiBieXRlcyJ9LAotICAgIHsiTm9Qcm94eSIsIHNldF9wcm94eV9kaXJjb25uLCBOVUxMLCBSU1JDX0NPTkYsIElURVJBVEUsCi0gICAgICJBIGxpc3Qgb2YgZG9tYWlucywgaG9zdHMsIG9yIHN1Ym5ldHMgdG8gd2hpY2ggdGhlIHByb3h5IHdpbGwgY29ubmVjdCBkaXJlY3RseSJ9LAotICAgIHsiUHJveHlEb21haW4iLCBzZXRfcHJveHlfZG9tYWluLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAgICAiVGhlIGRlZmF1bHQgaW50cmFuZXQgZG9tYWluIG5hbWUgKGluIGFic2VuY2Ugb2YgYSBkb21haW4gaW4gdGhlIFVSTCkifSwKLSAgICB7IkFsbG93Q09OTkVDVCIsIHNldF9hbGxvd2VkX3BvcnRzLCBOVUxMLCBSU1JDX0NPTkYsIElURVJBVEUsCi0gICAgICJBIGxpc3Qgb2YgcG9ydHMgd2hpY2ggQ09OTkVDVCBtYXkgY29ubmVjdCB0byJ9LAotICAgIHsiQ2FjaGVSb290Iiwgc2V0X2NhY2hlX3Jvb3QsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICAgICJUaGUgZGlyZWN0b3J5IHRvIHN0b3JlIGNhY2hlIGZpbGVzIn0sCi0gICAgeyJDYWNoZVNpemUiLCBzZXRfY2FjaGVfc2l6ZSwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAgIlRoZSBtYXhpbXVtIGRpc2sgc3BhY2UgdXNlZCBieSB0aGUgY2FjaGUgaW4gS2IifSwKLSAgICB7IkNhY2hlTWF4RXhwaXJlIiwgc2V0X2NhY2hlX21heGV4LCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAgICAiVGhlIG1heGltdW0gdGltZSBpbiBob3VycyB0byBjYWNoZSBhIGRvY3VtZW50In0sCi0gICAgeyJDYWNoZURlZmF1bHRFeHBpcmUiLCBzZXRfY2FjaGVfZGVmZXgsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICAgICJUaGUgZGVmYXVsdCB0aW1lIGluIGhvdXJzIHRvIGNhY2hlIGEgZG9jdW1lbnQifSwKLSAgICB7IkNhY2hlTGFzdE1vZGlmaWVkRmFjdG9yIiwgc2V0X2NhY2hlX2ZhY3RvciwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAgIlRoZSBmYWN0b3IgdXNlZCB0byBlc3RpbWF0ZSBFeHBpcmVzIGRhdGUgZnJvbSBMYXN0TW9kaWZpZWQgZGF0ZSJ9LAotICAgIHsiQ2FjaGVHY0ludGVydmFsIiwgc2V0X2NhY2hlX2djaW50LCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAgICAiVGhlIGludGVydmFsIGJldHdlZW4gZ2FyYmFnZSBjb2xsZWN0aW9ucywgaW4gaG91cnMifSwKLSAgICB7IkNhY2hlRGlyTGV2ZWxzIiwgc2V0X2NhY2hlX2RpcmxldmVscywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAgIlRoZSBudW1iZXIgb2YgbGV2ZWxzIG9mIHN1YmRpcmVjdG9yaWVzIGluIHRoZSBjYWNoZSJ9LAotICAgIHsiQ2FjaGVEaXJMZW5ndGgiLCBzZXRfY2FjaGVfZGlybGVuZ3RoLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAgICAiVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHN1YmRpcmVjdG9yeSBuYW1lcyJ9LAotICAgIHsiTm9DYWNoZSIsIHNldF9jYWNoZV9leGNsdWRlLCBOVUxMLCBSU1JDX0NPTkYsIElURVJBVEUsCi0gICAgICJBIGxpc3Qgb2YgbmFtZXMsIGhvc3RzIG9yIGRvbWFpbnMgZm9yIHdoaWNoIGNhY2hpbmcgaXMgKm5vdCogcHJvdmlkZWQifSwKLSAgICB7IkNhY2hlRm9yY2VDb21wbGV0aW9uIiwgc2V0X2NhY2hlX2NvbXBsZXRpb24sIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICAgICJGb3JjZSBhIGh0dHAgY2FjaGUgY29tcGxldGlvbiBhZnRlciB0aGlzIHBlcmNlbnRhZ2UgaXMgbG9hZGVkIn0sCi0gICAgeyJQcm94eVZpYSIsIHNldF92aWFfb3B0LCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAgICAiQ29uZmlndXJlIFZpYTogcHJveHkgaGVhZGVyIGhlYWRlciB0byBvbmUgb2Y6IG9uIHwgb2ZmIHwgYmxvY2sgfCBmdWxsIn0sCi0gICAge05VTEx9Ci19OwotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgcHJveHlfbW9kdWxlID0KLXsKLSAgICBTVEFOREFSRF9NT0RVTEVfU1RVRkYsCi0gICAgcHJveHlfaW5pdCwJCQkvKiBpbml0aWFsaXplciAqLwotICAgIE5VTEwsCQkJLyogY3JlYXRlIHBlci1kaXJlY3RvcnkgY29uZmlnIHN0cnVjdHVyZSAqLwotICAgIE5VTEwsCQkJLyogbWVyZ2UgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIGNyZWF0ZV9wcm94eV9jb25maWcsCS8qIGNyZWF0ZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLSAgICBOVUxMLAkJCS8qIG1lcmdlIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgICBwcm94eV9jbWRzLAkJCS8qIGNvbW1hbmQgdGFibGUgKi8KLSAgICBwcm94eV9oYW5kbGVycywJCS8qIGhhbmRsZXJzICovCi0gICAgcHJveHlfdHJhbnMsCQkvKiB0cmFuc2xhdGVfaGFuZGxlciAqLwotICAgIE5VTEwsCQkJLyogY2hlY2tfdXNlcl9pZCAqLwotICAgIE5VTEwsCQkJLyogY2hlY2sgYXV0aCAqLwotICAgIE5VTEwsCQkJLyogY2hlY2sgYWNjZXNzICovCi0gICAgTlVMTCwJCQkvKiB0eXBlX2NoZWNrZXIgKi8KLSAgICBwcm94eV9maXh1cCwJCS8qIHByZS1ydW4gZml4dXBzICovCi0gICAgTlVMTCwJCQkvKiBsb2dnZXIgKi8KLSAgICBOVUxMLAkJCS8qIGhlYWRlciBwYXJzZXIgKi8KLSAgICBOVUxMLAkJCS8qIGNoaWxkX2luaXQgKi8KLSAgICBOVUxMLAkJCS8qIGNoaWxkX2V4aXQgKi8KLSAgICBwcm94eV9kZXRlY3QJCS8qIHBvc3QgcmVhZC1yZXF1ZXN0ICovCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9wcm94eS9tb2RfcHJveHkuZHNwIGIvbW9kdWxlcy9wcm94eS9tb2RfcHJveHkuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWU1Y2YzLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvcHJveHkvbW9kX3Byb3h5LmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9IkFwYWNoZU1vZHVsZVByb3h5IiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDIKLQotQ0ZHPUFwYWNoZU1vZHVsZVByb3h5IC0gV2luMzIgUmVsZWFzZQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJBcGFjaGVNb2R1bGVQcm94eS5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIkFwYWNoZU1vZHVsZVByb3h5Lm1hayJcCi0gQ0ZHPSJBcGFjaGVNb2R1bGVQcm94eSAtIFdpbjMyIFJlbGVhc2UiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAiQXBhY2hlTW9kdWxlUHJveHkgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb25cCi0gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFICJBcGFjaGVNb2R1bGVQcm94eSAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb25cCi0gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1NVEw9bWlkbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAiQXBhY2hlTW9kdWxlUHJveHkgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxBcGFjaGVNbyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIi5cQXBhY2hlTW8iCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiLlxSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi5cUmVsZWFzZSIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvR1ggL08yIC9JICIuLlwuLlxpbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIlNIQVJFRF9NT0RVTEUiIC9EICJXSU4zMl9MRUFOX0FORF9NRUFOIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiAuLlwuLlxDb3JlUlxBcGFjaGVDb3JlLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgd3MyXzMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYWNoaW5lOkkzODYKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFwYWNoZU1vZHVsZVByb3h5IC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuXEFwYWNoZU0wIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVNMCIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICIuXERlYnVnIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi5cRGVidWciCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvSSAiLi5cLi5caW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJTSEFSRURfTU9EVUxFIiAvRCAiV0lOMzJfTEVBTl9BTkRfTUVBTiIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIC4uXC4uXENvcmVEXEFwYWNoZUNvcmUubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiB3czJfMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIkFwYWNoZU1vZHVsZVByb3h5IC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAiQXBhY2hlTW9kdWxlUHJveHkgLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2hwajtiYXQ7Zm9yO2Y5MCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kX3Byb3h5LmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHByb3h5X2NhY2hlLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHByb3h5X2Nvbm5lY3QuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5ccHJveHlfZnRwLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHByb3h5X2h0dHAuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5ccHJveHlfdXRpbC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sO2ZpO2ZkIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2RfcHJveHkuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47Y250O3J0ZjtnaWY7anBnO2pwZWc7anBlIgotIyBFbmQgR3JvdXAKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9wcm94eS9tb2RfcHJveHkuaCBiL21vZHVsZXMvcHJveHkvbW9kX3Byb3h5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYjM0MjguLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9wcm94eS9tb2RfcHJveHkuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLSNpZm5kZWYgTU9EX1BST1hZX0gKLSNkZWZpbmUgTU9EX1BST1hZX0ggCi0KLS8qCi0gKiBNYWluIGluY2x1ZGUgZmlsZSBmb3IgdGhlIEFwYWNoZSBwcm94eQotICovCi0KLS8qCi0KLSAgIE5vdGUgdGhhdCB0aGUgRXhwbGFpbigpIHN0dWZmIGlzIG5vdCB5ZXQgY29tcGxldGUuCi0gICBBbHNvIG5vdGUgbnVtZXJvdXMgRklYTUVzIGFuZCBDSEVDS01FcyB3aGljaCBzaG91bGQgYmUgZWxpbWluYXRlZC4KLQotICAgSWYgVEVTVElORyBpcyBzZXQsIHRoZW4gZ2FyYmFnZSBjb2xsZWN0aW9uIGRvZXNuJ3QgZGVsZXRlIC4uLiBwcm9iYWJseSBhIGdvb2QKLSAgIGlkZWEgd2hlbiBoYWNraW5nLgotCi0gICBUaGlzIGNvZGUgaXMgc3RpbGwgZXhwZXJpbWVudGFsIQotCi0gICBUaGluZ3MgdG8gZG86Ci0KLSAgIDEuIE1ha2UgaXQgZ2FyYmFnZSBjb2xsZWN0IGluIHRoZSBiYWNrZ3JvdW5kLCBub3Qgd2hpbGUgc29tZW9uZSBpcyB3YWl0aW5nIGZvcgotICAgYSByZXNwb25zZSEKLQotICAgMi4gQ2hlY2sgdGhlIGxvZ2ljIHRob3JvdWdobHkuCi0KLSAgIDMuIEVtcHR5IGRpcmVjdG9yaWVzIGFyZSBvbmx5IHJlbW92ZWQgdGhlIG5leHQgdGltZSByb3VuZCAoYnV0IHRoaXMgZG9lcyBhdm9pZAotICAgdHdvIHBhc3NlcykuIENvbnNpZGVyIGRvaW5nIHRoZW0gdGhlIGZpcnN0IHRpbWUgcm91bmQuCi0KLSAgIEJlbiBMYXVyaWUgPGJlbkBhbGdyb3VwLmNvLnVrPiAzMCBNYXIgOTYKLQotICAgTW9yZSB0aGluZ3MgdG8gZG86Ci0KLSAgIDAuIENvZGUgY2xlYW51cCAob25nb2luZykKLQotICAgMS4gYWRkIDIzMCByZXNwb25zZSBvdXRwdXQgZm9yIGZ0cCBub3cgdGhhdCBpdCB3b3JrcwotCi0gICAyLiBNYWtlIHRoZSBmdHAgcHJveHkgdHJhbnNwYXJlbnQsIGFsc28gc2FtZSB3aXRoIChmdXR1cmUpIGdvcGhlciAmIHdhaXMKLQotICAgMy4gVXNlIHByb3RvY29sIGhhbmRsZXIgc3RydWN0IGEgbGEgQXBhY2hlIG1vZHVsZSBoYW5kbGVycyAoRGlyayB2YW4gR3VsaWspCi0KLSAgIDQuIFVzZSBhIGNhY2hlIGV4cGlyeSBkYXRhYmFzZSBmb3IgbW9yZSBlZmZpY2llbnQgR0MgKEplcmVteSBXb2hsKQotCi0gICA1LiBCdWxsZXRwcm9vZiBHQyBhZ2FpbnN0IFNJR0FMUk0KLQotICAgQ2h1Y2sgTXVyY2tvIDxjaHVja0B0b3BzYWlsLm9yZz4gMTUgQXByaWwgMTk5NwotCi0gKi8KLQotI2RlZmluZSBURVNUSU5HCTAKLSN1bmRlZiBFWFBMQUlOCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9wcm90b2NvbC5oIgotCi0jaW5jbHVkZSAiZXhwbGFpbi5oIgotCi1leHRlcm4gbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIHByb3h5X21vZHVsZTsKLQotCi0vKiBmb3IgcHJveHlfY2Fub25lbmMoKSAqLwotZW51bSBlbmN0eXBlIHsKLSAgICBlbmNfcGF0aCwgZW5jX3NlYXJjaCwgZW5jX3VzZXIsIGVuY19mcGF0aCwgZW5jX3Bhcm0KLX07Ci0KLSNkZWZpbmUgSERSX0FQUCAoMCkJCS8qIGFwcGVuZCBoZWFkZXIsIGZvciBwcm94eV9hZGRfaGVhZGVyKCkgKi8KLSNkZWZpbmUgSERSX1JFUCAoMSkJCS8qIHJlcGxhY2UgaGVhZGVyLCBmb3IgcHJveHlfYWRkX2hlYWRlcigpICovCi0KLS8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBoYXNoICovCi0jZGVmaW5lIEhBU0hfTEVOICgyMioyKQotCi0vKiBtYXhpbXVtICAnQ2FjaGVEaXJMZXZlbHMqQ2FjaGVEaXJMZW5ndGgnIHZhbHVlICovCi0jZGVmaW5lIENBQ0hFRklMRV9MRU4gMjAJLyogbXVzdCBiZSBsZXNzIHRoYW4gSEFTSF9MRU4vMiAqLwotCi0jaWZkZWYgQ0hBUlNFVF9FQkNESUMKLSNkZWZpbmUgQ1JMRiAgICJcclxuIgotI2Vsc2UgLypDSEFSU0VUX0VCQ0RJQyovCi0jZGVmaW5lIENSTEYgICAiXDAxNVwwMTIiCi0jZW5kaWYgLypDSEFSU0VUX0VCQ0RJQyovCi0KLQotI2RlZmluZQlTRUNfT05FX0RBWQkJODY0MDAJLyogb25lIGRheSwgaW4gc2Vjb25kcyAqLwotI2RlZmluZQlTRUNfT05FX0hSCQkzNjAwCS8qIG9uZSBob3VyLCBpbiBzZWNvbmRzICovCi0KLSNkZWZpbmUJREVGQVVMVF9GVFBfREFUQV9QT1JUCTIwCi0jZGVmaW5lCURFRkFVTFRfRlRQX1BPUlQJMjEKLSNkZWZpbmUJREVGQVVMVF9HT1BIRVJfUE9SVAk3MAotI2RlZmluZQlERUZBVUxUX05OVFBfUE9SVAkxMTkKLSNkZWZpbmUJREVGQVVMVF9XQUlTX1BPUlQJMjEwCi0jZGVmaW5lCURFRkFVTFRfSFRUUFNfUE9SVAk0NDMKLSNkZWZpbmUJREVGQVVMVF9TTkVXU19QT1JUCTU2MwotI2RlZmluZQlERUZBVUxUX1BST1NQRVJPX1BPUlQJMTUyNQkvKiBXQVJOSU5HOiBjb25mbGljdCB3L09yYWNsZSAqLwotCi0vKiBTb21lIFdXVyBzY2hlbWVzIGFuZCB0aGVpciBkZWZhdWx0IHBvcnRzOyB0aGlzIGlzIGJhc2ljYWxseSAvZXRjL3NlcnZpY2VzICovCi1zdHJ1Y3QgcHJveHlfc2VydmljZXMgewotICAgIGNvbnN0IGNoYXIgKnNjaGVtZTsKLSAgICBpbnQgcG9ydDsKLX07Ci0KLS8qIHN0YXRpYyBpbmZvcm1hdGlvbiBhYm91dCBhIHJlbW90ZSBwcm94eSAqLwotc3RydWN0IHByb3h5X3JlbW90ZSB7Ci0gICAgY29uc3QgY2hhciAqc2NoZW1lOwkJLyogdGhlIHNjaGVtZXMgaGFuZGxlZCBieSB0aGlzIHByb3h5LCBvciAnKicgKi8KLSAgICBjb25zdCBjaGFyICpwcm90b2NvbDsJLyogdGhlIHNjaGVtZSB1c2VkIHRvIHRhbGsgdG8gdGhpcyBwcm94eSAqLwotICAgIGNvbnN0IGNoYXIgKmhvc3RuYW1lOwkvKiB0aGUgaG9zdG5hbWUgb2YgdGhpcyBwcm94eSAqLwotICAgIGludCBwb3J0OwkJCS8qIHRoZSBwb3J0IGZvciB0aGlzIHByb3h5ICovCi19OwotCi1zdHJ1Y3QgcHJveHlfYWxpYXMgewotICAgIGNoYXIgKnJlYWw7Ci0gICAgY2hhciAqZmFrZTsKLX07Ci0KLXN0cnVjdCBkaXJjb25uX2VudHJ5IHsKLSAgICBjaGFyICpuYW1lOwotICAgIHN0cnVjdCBpbl9hZGRyIGFkZHIsIG1hc2s7Ci0gICAgc3RydWN0IGhvc3RlbnQgKmhvc3RlbnRyeTsKLSAgICBpbnQgKCptYXRjaGVyKSAoc3RydWN0IGRpcmNvbm5fZW50cnkgKiBUaGlzLCByZXF1ZXN0X3JlYyAqcik7Ci19OwotCi1zdHJ1Y3Qgbm9wcm94eV9lbnRyeSB7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBzdHJ1Y3QgaW5fYWRkciBhZGRyOwotfTsKLQotc3RydWN0IG5vY2FjaGVfZW50cnkgewotICAgIGNoYXIgKm5hbWU7Ci0gICAgc3RydWN0IGluX2FkZHIgYWRkcjsKLX07Ci0KLSNkZWZpbmUgREVGQVVMVF9DQUNIRV9TUEFDRSA1Ci0jZGVmaW5lIERFRkFVTFRfQ0FDSEVfTUFYRVhQSVJFIFNFQ19PTkVfREFZCi0jZGVmaW5lIERFRkFVTFRfQ0FDSEVfRVhQSVJFICAgIFNFQ19PTkVfSFIKLSNkZWZpbmUgREVGQVVMVF9DQUNIRV9MTUZBQ1RPUiAoMC4xKQotI2RlZmluZSBERUZBVUxUX0NBQ0hFX0NPTVBMRVRJT04gKDAuOSkKLQotLyogc3RhdGljIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhbCBjYWNoZSAqLwotc3RydWN0IGNhY2hlX2NvbmYgewotICAgIGNvbnN0IGNoYXIgKnJvb3Q7CQkvKiB0aGUgbG9jYXRpb24gb2YgdGhlIGNhY2hlIGRpcmVjdG9yeSAqLwotICAgIG9mZl90IHNwYWNlOwkJCS8qIE1heGltdW0gY2FjaGUgc2l6ZSAoaW4gMTAyNCBieXRlcykgKi8KLSAgICB0aW1lX3QgbWF4ZXhwaXJlOwkJLyogTWF4aW11bSB0aW1lIHRvIGtlZXAgY2FjaGVkIGZpbGVzIGluIHNlY3MgKi8KLSAgICB0aW1lX3QgZGVmYXVsdGV4cGlyZTsJLyogZGVmYXVsdCB0aW1lIHRvIGtlZXAgY2FjaGVkIGZpbGUgaW4gc2VjcyAqLwotICAgIGRvdWJsZSBsbWZhY3RvcjsJCS8qIGZhY3RvciBmb3IgZXN0aW1hdGluZyBleHBpcmVzIGRhdGUgKi8KLSAgICB0aW1lX3QgZ2NpbnRlcnZhbDsJCS8qIGdhcmJhZ2UgY29sbGVjdGlvbiBpbnRlcnZhbCwgaW4gc2Vjb25kcyAqLwotICAgIGludCBkaXJsZXZlbHM7CQkvKiBOdW1iZXIgb2YgbGV2ZWxzIG9mIHN1YmRpcmVjdG9yaWVzICovCi0gICAgaW50IGRpcmxlbmd0aDsJCS8qIExlbmd0aCBvZiBzdWJkaXJlY3RvcnkgbmFtZXMgKi8KLSAgICBmbG9hdCBjYWNoZV9jb21wbGV0aW9uOwkvKiBGb3JjZSBjYWNoZSBjb21wbGV0aW9uIGFmdGVyIHRoaXMgcG9pbnQgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBzdHJ1Y3QgY2FjaGVfY29uZiBjYWNoZTsJLyogY2FjaGUgY29uZmlndXJhdGlvbiAqLwotICAgIGFycmF5X2hlYWRlciAqcHJveGllczsKLSAgICBhcnJheV9oZWFkZXIgKmFsaWFzZXM7Ci0gICAgYXJyYXlfaGVhZGVyICpyYWxpYXNlczsKLSAgICBhcnJheV9oZWFkZXIgKm5vcHJveGllczsKLSAgICBhcnJheV9oZWFkZXIgKmRpcmNvbm47Ci0gICAgYXJyYXlfaGVhZGVyICpub2NhY2hlczsKLSAgICBhcnJheV9oZWFkZXIgKmFsbG93ZWRfY29ubmVjdF9wb3J0czsKLSAgICBjaGFyICpkb21haW47CQkvKiBkb21haW4gbmFtZSB0byB1c2UgaW4gYWJzZW5jZSBvZiBhIGRvbWFpbiBuYW1lIGluIHRoZSByZXF1ZXN0ICovCi0gICAgaW50IHJlcTsJCQkvKiB0cnVlIGlmIHByb3h5IHJlcXVlc3RzIGFyZSBlbmFibGVkICovCi0gICAgZW51bSB7Ci0gICAgICB2aWFfb2ZmLAotICAgICAgdmlhX29uLAotICAgICAgdmlhX2Jsb2NrLAotICAgICAgdmlhX2Z1bGwKLSAgICB9IHZpYW9wdDsgICAgICAgICAgICAgICAgICAgLyogaG93IHRvIGRlYWwgd2l0aCBwcm94eSBWaWE6IGhlYWRlcnMgKi8KLSAgICBzaXplX3QgcmVjdl9idWZmZXJfc2l6ZTsKLX0gcHJveHlfc2VydmVyX2NvbmY7Ci0KLXN0cnVjdCBoZHJfZW50cnkgewotICAgIGNvbnN0IGNoYXIgKmZpZWxkOwotICAgIGNvbnN0IGNoYXIgKnZhbHVlOwotfTsKLQotLyogY2FjaGluZyBpbmZvcm1hdGlvbiBhYm91dCBhIHJlcXVlc3QgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICByZXF1ZXN0X3JlYyAqcmVxOwkJLyogdGhlIHJlcXVlc3QgKi8KLSAgICBjaGFyICp1cmw7CQkJLyogdGhlIFVSTCByZXF1ZXN0ZWQgKi8KLSAgICBjaGFyICpmaWxlbmFtZTsJCS8qIG5hbWUgb2YgdGhlIGNhY2hlIGZpbGUsIG9yIE5VTEwgaWYgbm8gY2FjaGUgKi8KLSAgICBjaGFyICp0ZW1wZmlsZTsJCS8qIG5hbWUgb2YgdGhlIHRlbXBvcmFyeSBmaWxlLCBvZiBOVUxMIGlmIG5vdCBjYWNoaW5nICovCi0gICAgdGltZV90IGltczsJCQkvKiBpZi1tb2RpZmllZC1zaW5jZSBkYXRlIG9mIHJlcXVlc3Q7IC0xIGlmIG5vIGhlYWRlciAqLwotICAgIEJVRkYgKmZwOwkJCS8qIHRoZSBjYWNoZSBmaWxlIGRlc2NyaXB0b3IgaWYgdGhlIGZpbGUgaXMgY2FjaGVkCi0JCQkJICAgYW5kIG1heSBiZSByZXR1cm5lZCwgb3IgTlVMTCBpZiB0aGUgZmlsZSBpcwotCQkJCSAgIG5vdCBjYWNoZWQgKG9yIG11c3QgYmUgcmVsb2FkZWQpICovCi0gICAgdGltZV90IGV4cGlyZTsJCS8qIGNhbGN1bGF0ZWQgZXhwaXJlIGRhdGUgb2YgY2FjaGVkIGVudGl0eSAqLwotICAgIHRpbWVfdCBsbW9kOwkJLyogbGFzdC1tb2RpZmllZCBkYXRlIG9mIGNhY2hlZCBlbnRpdHkgKi8KLSAgICB0aW1lX3QgZGF0ZTsJCS8qIHRoZSBkYXRlIHRoZSBjYWNoZWQgZmlsZSB3YXMgbGFzdCB0b3VjaGVkICovCi0gICAgaW50IHZlcnNpb247CQkvKiB1cGRhdGUgY291bnQgb2YgdGhlIGZpbGUgKi8KLSAgICBvZmZfdCBsZW47CQkJLyogY29udGVudCBsZW5ndGggKi8KLSAgICBjaGFyICpwcm90b2NvbDsJCS8qIFByb3RvY29sLCBhbmQgbWFqb3IvbWlub3IgbnVtYmVyLCBlLmcuIEhUVFAvMS4xICovCi0gICAgaW50IHN0YXR1czsJCQkvKiB0aGUgc3RhdHVzIG9mIHRoZSBjYWNoZWQgZmlsZSAqLwotICAgIHVuc2lnbmVkIGludCB3cml0dGVuOwkvKiB0b3RhbCAqY29udGVudCogYnl0ZXMgd3JpdHRlbiB0byBjYWNoZSAqLwotICAgIGZsb2F0IGNhY2hlX2NvbXBsZXRpb247CS8qIHNwZWNpZmljIHRvIHRoaXMgcmVxdWVzdCAqLwotICAgIGNoYXIgKnJlc3BfbGluZTsJCS8qIHRoZSB3aG9sZSBzdGF0dXMgbGlrZSAocHJvdG9jb2wsIGNvZGUgKyBtZXNzYWdlKSAqLwotICAgIHRhYmxlICpoZHJzOwkJLyogdGhlIEhUVFAgaGVhZGVycyBvZiB0aGUgZmlsZSAqLwotfSBjYWNoZV9yZXE7Ci0KLS8qIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBjYWxsZWQgYnkgYXBfdGFibGVfZG8oKSAqLwotc3RydWN0IHRibF9kb19hcmdzIHsKLSAgICByZXF1ZXN0X3JlYyAqcmVxOwotICAgIGNhY2hlX3JlcSAqY2FjaGU7Ci19OwotCi0vKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCi0KLS8qIHByb3h5X2NhY2hlLmMgKi8KLQotdm9pZCBhcF9wcm94eV9jYWNoZV90aWR5KGNhY2hlX3JlcSAqYyk7Ci1pbnQgYXBfcHJveHlfY2FjaGVfY2hlY2socmVxdWVzdF9yZWMgKnIsIGNoYXIgKnVybCwgc3RydWN0IGNhY2hlX2NvbmYgKmNvbmYsCi0JCSAgICAgIGNhY2hlX3JlcSAqKmNyKTsKLWludCBhcF9wcm94eV9jYWNoZV91cGRhdGUoY2FjaGVfcmVxICpjLCB0YWJsZSAqcmVzcF9oZHJzLAotCQkgICAgICAgY29uc3QgaW50IGlzX0hUVFAxLCBpbnQgbm9jYWNoZSk7Ci12b2lkIGFwX3Byb3h5X2dhcmJhZ2VfY29sbChyZXF1ZXN0X3JlYyAqcik7Ci0KLS8qIHByb3h5X2Nvbm5lY3QuYyAqLwotCi1pbnQgYXBfcHJveHlfY29ubmVjdF9oYW5kbGVyKHJlcXVlc3RfcmVjICpyLCBjYWNoZV9yZXEgKmMsIGNoYXIgKnVybCwKLQkJCSAgY29uc3QgY2hhciAqcHJveHlob3N0LCBpbnQgcHJveHlwb3J0KTsKLQotLyogcHJveHlfZnRwLmMgKi8KLQotaW50IGFwX3Byb3h5X2Z0cF9jYW5vbihyZXF1ZXN0X3JlYyAqciwgY2hhciAqdXJsKTsKLWludCBhcF9wcm94eV9mdHBfaGFuZGxlcihyZXF1ZXN0X3JlYyAqciwgY2FjaGVfcmVxICpjLCBjaGFyICp1cmwpOwotCi0vKiBwcm94eV9odHRwLmMgKi8KLQotaW50IGFwX3Byb3h5X2h0dHBfY2Fub24ocmVxdWVzdF9yZWMgKnIsIGNoYXIgKnVybCwgY29uc3QgY2hhciAqc2NoZW1lLAotCQkgICAgIGludCBkZWZfcG9ydCk7Ci1pbnQgYXBfcHJveHlfaHR0cF9oYW5kbGVyKHJlcXVlc3RfcmVjICpyLCBjYWNoZV9yZXEgKmMsIGNoYXIgKnVybCwKLQkJICAgICAgIGNvbnN0IGNoYXIgKnByb3h5aG9zdCwgaW50IHByb3h5cG9ydCk7Ci0KLS8qIHByb3h5X3V0aWwuYyAqLwotCi1pbnQgYXBfcHJveHlfaGV4MmMoY29uc3QgY2hhciAqeCk7Ci12b2lkIGFwX3Byb3h5X2MyaGV4KGludCBjaCwgY2hhciAqeCk7Ci1jaGFyICphcF9wcm94eV9jYW5vbmVuYyhwb29sICpwLCBjb25zdCBjaGFyICp4LCBpbnQgbGVuLCBlbnVtIGVuY3R5cGUgdCwKLQkJICAgICBpbnQgaXNlbmMpOwotY2hhciAqYXBfcHJveHlfY2Fub25fbmV0bG9jKHBvb2wgKnAsIGNoYXIgKipjb25zdCB1cmxwLCBjaGFyICoqdXNlcnAsCi0JCQkgY2hhciAqKnBhc3N3b3JkcCwgY2hhciAqKmhvc3RwLCBpbnQgKnBvcnQpOwotY29uc3QgY2hhciAqYXBfcHJveHlfZGF0ZV9jYW5vbihwb29sICpwLCBjb25zdCBjaGFyICp4KTsKLXRhYmxlICphcF9wcm94eV9yZWFkX2hlYWRlcnMocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmJ1ZmZlciwgaW50IHNpemUsIEJVRkYgKmYpOwotbG9uZyBpbnQgYXBfcHJveHlfc2VuZF9mYihCVUZGICpmLCByZXF1ZXN0X3JlYyAqciwgY2FjaGVfcmVxICpjKTsKLXZvaWQgYXBfcHJveHlfc2VuZF9oZWFkZXJzKHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICpyZXNwbGluZSwgdGFibGUgKmhkcnMpOwotaW50IGFwX3Byb3h5X2xpc3RzdHIoY29uc3QgY2hhciAqbGlzdCwgY29uc3QgY2hhciAqdmFsKTsKLXZvaWQgYXBfcHJveHlfaGFzaChjb25zdCBjaGFyICppdCwgY2hhciAqdmFsLCBpbnQgbmRlcHRoLCBpbnQgbmxlbmd0aCk7Ci1pbnQgYXBfcHJveHlfaGV4MnNlYyhjb25zdCBjaGFyICp4KTsKLXZvaWQgYXBfcHJveHlfc2VjMmhleChpbnQgdCwgY2hhciAqeSk7Ci1jYWNoZV9yZXEgKmFwX3Byb3h5X2NhY2hlX2Vycm9yKGNhY2hlX3JlcSAqcik7Ci1pbnQgYXBfcHJveHllcnJvcihyZXF1ZXN0X3JlYyAqciwgaW50IHN0YXR1c2NvZGUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpOwotY29uc3QgY2hhciAqYXBfcHJveHlfaG9zdDJhZGRyKGNvbnN0IGNoYXIgKmhvc3QsIHN0cnVjdCBob3N0ZW50ICpyZXFocCk7Ci1pbnQgYXBfcHJveHlfaXNfaXBhZGRyKHN0cnVjdCBkaXJjb25uX2VudHJ5ICpUaGlzLCBwb29sICpwKTsKLWludCBhcF9wcm94eV9pc19kb21haW5uYW1lKHN0cnVjdCBkaXJjb25uX2VudHJ5ICpUaGlzLCBwb29sICpwKTsKLWludCBhcF9wcm94eV9pc19ob3N0bmFtZShzdHJ1Y3QgZGlyY29ubl9lbnRyeSAqVGhpcywgcG9vbCAqcCk7Ci1pbnQgYXBfcHJveHlfaXNfd29yZChzdHJ1Y3QgZGlyY29ubl9lbnRyeSAqVGhpcywgcG9vbCAqcCk7Ci1pbnQgYXBfcHJveHlfZG9jb25uZWN0KGludCBzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIsIHJlcXVlc3RfcmVjICpyKTsKLWludCBhcF9wcm94eV9nYXJiYWdlX2luaXQoc2VydmVyX3JlYyAqLCBwb29sICopOwotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYXBfdGFibGVfZG8oKSBmb3IgYWxsIGhlYWRlciBsaW5lcyAqLwotaW50IGFwX3Byb3h5X3NlbmRfaGRyX2xpbmUodm9pZCAqcCwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSk7Ci11bnNpZ25lZCBhcF9wcm94eV9icHV0czIoY29uc3QgY2hhciAqZGF0YSwgQlVGRiAqY2xpZW50LCBjYWNoZV9yZXEgKmNhY2hlKTsKLQotI2VuZGlmIC8qTU9EX1BST1hZX0gqLwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9wcm94eS9tb2RfcHJveHlfY29ubmVjdC5kc3AgYi9tb2R1bGVzL3Byb3h5L21vZF9wcm94eV9jb25uZWN0LmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZiOWQ1Zi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL3Byb3h5L21vZF9wcm94eV9jb25uZWN0LmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9Im1vZF9wcm94eV9jb25uZWN0IiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDIKLQotQ0ZHPW1vZF9wcm94eV9jb25uZWN0IC0gV2luMzIgUmVsZWFzZQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJtb2RfcHJveHlfY29ubmVjdC5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIm1vZF9wcm94eV9jb25uZWN0Lm1hayIgQ0ZHPSJtb2RfcHJveHlfY29ubmVjdCAtIFdpbjMyIFJlbGVhc2UiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAibW9kX3Byb3h5X2Nvbm5lY3QgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFICJtb2RfcHJveHlfY29ubmVjdCAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwCi0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotTVRMPW1pZGwuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9wcm94eV9jb25uZWN0IC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvSSAiLi4vLi4vaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHIvaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHItdXRpbC9pbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0ZkIlJlbGVhc2VcbW9kX3Byb3h5X2Nvbm5lY3QiIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHdzMl8zMi5saWIgbXN3c29jay5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9tYWNoaW5lOkkzODYgL291dDoiUmVsZWFzZS9tb2RfcHJveHlfY29ubmVjdC5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfcHJveHlfY29ubmVjdAotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB3czJfMzIubGliIG1zd3NvY2subGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvbWFjaGluZTpJMzg2IC9vdXQ6IlJlbGVhc2UvbW9kX3Byb3h5X2Nvbm5lY3Quc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX3Byb3h5X2Nvbm5lY3QKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9wcm94eV9jb25uZWN0IC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HWCAvWmkgL09kIC9JICIuLi8uLi9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci11dGlsL2luY2x1ZGUiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRmQiRGVidWdcbW9kX3Byb3h5X2Nvbm5lY3QiIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHdzMl8zMi5saWIgbXN3c29jay5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvaW5jcmVtZW50YWw6bm8gL21hcCAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJEZWJ1Zy9tb2RfcHJveHlfY29ubmVjdC5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfcHJveHlfY29ubmVjdAotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB3czJfMzIubGliIG1zd3NvY2subGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2luY3JlbWVudGFsOm5vIC9tYXAgL2RlYnVnIC9tYWNoaW5lOkkzODYgL291dDoiRGVidWcvbW9kX3Byb3h5X2Nvbm5lY3Quc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX3Byb3h5X2Nvbm5lY3QKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIm1vZF9wcm94eV9jb25uZWN0IC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAibW9kX3Byb3h5X2Nvbm5lY3QgLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2hwajtiYXQ7Zm9yO2Y5MCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5ccHJveHlfY29ubmVjdC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICIuaCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kX3Byb3h5LmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9wcm94eV9jb25uZWN0IC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBDcmVhdGluZyBWZXJzaW9uIFJlc291cmNlCi1JbnB1dFBhdGg9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSIuXG1vZF9wcm94eV9jb25uZWN0LnJjIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCWF3ayAtZiAuLi8uLi9idWlsZC93aW4zMi93aW4zMnZlci5hd2sgbW9kX3Byb3h5X2Nvbm5lY3QgICJwcm94eV9jb25uZWN0X21vZHVsZSBmb3IgQXBhY2hlIiAuLi8uLi9pbmNsdWRlL2FwX3JlbGVhc2UuaCA+IC5cbW9kX3Byb3h5X2Nvbm5lY3QucmMKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJtb2RfcHJveHlfY29ubmVjdCAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIENyZWF0aW5nIFZlcnNpb24gUmVzb3VyY2UKLUlucHV0UGF0aD0uLlwuLlxidWlsZFx3aW4zMlx3aW4zMnZlci5hd2sKLQotIi5cbW9kX3Byb3h5X2Nvbm5lY3QucmMiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JYXdrIC1mIC4uLy4uL2J1aWxkL3dpbjMyL3dpbjMydmVyLmF3ayBtb2RfcHJveHlfY29ubmVjdCAgInByb3h5X2Nvbm5lY3RfbW9kdWxlIGZvciBBcGFjaGUiIC4uLy4uL2luY2x1ZGUvYXBfcmVsZWFzZS5oID4gLlxtb2RfcHJveHlfY29ubmVjdC5yYwotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9tb2R1bGVzL3Byb3h5L21vZF9wcm94eV9mdHAuZHNwIGIvbW9kdWxlcy9wcm94eS9tb2RfcHJveHlfZnRwLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEyMzJmYi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL3Byb3h5L21vZF9wcm94eV9mdHAuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ibW9kX3Byb3h5X2Z0cCIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyCi0KLUNGRz1tb2RfcHJveHlfZnRwIC0gV2luMzIgUmVsZWFzZQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJtb2RfcHJveHlfZnRwLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAibW9kX3Byb3h5X2Z0cC5tYWsiIENGRz0ibW9kX3Byb3h5X2Z0cCAtIFdpbjMyIFJlbGVhc2UiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAibW9kX3Byb3h5X2Z0cCAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgIm1vZF9wcm94eV9mdHAgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLU1UTD1taWRsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJtb2RfcHJveHlfZnRwIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvSSAiLi4vLi4vaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHIvaW5jbHVkZSIgL0kgIi4uLy4uL3NyY2xpYi9hcHItdXRpbC9pbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0ZkIlJlbGVhc2VcbW9kX3Byb3h5X2Z0cCIgL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgd3MyXzMyLmxpYiBtc3dzb2NrLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYXAgL21hY2hpbmU6STM4NiAvb3V0OiJSZWxlYXNlL21vZF9wcm94eV9mdHAuc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX3Byb3h5X2Z0cAotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB3czJfMzIubGliIG1zd3NvY2subGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hcCAvbWFjaGluZTpJMzg2IC9vdXQ6IlJlbGVhc2UvbW9kX3Byb3h5X2Z0cC5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfcHJveHlfZnRwCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJtb2RfcHJveHlfZnRwIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HWCAvWmkgL09kIC9JICIuLi8uLi9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci11dGlsL2luY2x1ZGUiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRmQiRGVidWdcbW9kX3Byb3h5X2Z0cCIgL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgd3MyXzMyLmxpYiBtc3dzb2NrLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9pbmNyZW1lbnRhbDpubyAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6IkRlYnVnL21vZF9wcm94eV9mdHAuc28iIC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX3Byb3h5X2Z0cAotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB3czJfMzIubGliIG1zd3NvY2subGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2luY3JlbWVudGFsOm5vIC9tYXAgL2RlYnVnIC9tYWNoaW5lOkkzODYgL291dDoiRGVidWcvbW9kX3Byb3h5X2Z0cC5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfcHJveHlfZnRwCi0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJtb2RfcHJveHlfZnRwIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAibW9kX3Byb3h5X2Z0cCAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aHBqO2JhdDtmb3I7ZjkwIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxwcm94eV9mdHAuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiLmgiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZF9wcm94eS5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXGJ1aWxkXHdpbjMyXHdpbjMydmVyLmF3awotCi0hSUYgICIkKENGRykiID09ICJtb2RfcHJveHlfZnRwIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBDcmVhdGluZyBWZXJzaW9uIFJlc291cmNlCi1JbnB1dFBhdGg9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSIuXG1vZF9wcm94eV9mdHAucmMiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JYXdrIC1mIC4uLy4uL2J1aWxkL3dpbjMyL3dpbjMydmVyLmF3ayBtb2RfcHJveHlfZnRwICAicHJveHlfZnRwX21vZHVsZSBmb3IgQXBhY2hlIiAuLi8uLi9pbmNsdWRlL2FwX3JlbGVhc2UuaCA+IC5cbW9kX3Byb3h5X2Z0cC5yYwotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9wcm94eV9mdHAgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBDcmVhdGluZyBWZXJzaW9uIFJlc291cmNlCi1JbnB1dFBhdGg9Li5cLi5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSIuXG1vZF9wcm94eV9mdHAucmMiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JYXdrIC1mIC4uLy4uL2J1aWxkL3dpbjMyL3dpbjMydmVyLmF3ayBtb2RfcHJveHlfZnRwICAicHJveHlfZnRwX21vZHVsZSBmb3IgQXBhY2hlIiAuLi8uLi9pbmNsdWRlL2FwX3JlbGVhc2UuaCA+IC5cbW9kX3Byb3h5X2Z0cC5yYwotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9tb2R1bGVzL3Byb3h5L21vZF9wcm94eV9odHRwLmRzcCBiL21vZHVsZXMvcHJveHkvbW9kX3Byb3h5X2h0dHAuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzY0YjU0Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvcHJveHkvbW9kX3Byb3h5X2h0dHAuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ibW9kX3Byb3h5X2h0dHAiIC0gUGFja2FnZSBPd25lcj08ND4KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDAKLSMgKiogRE8gTk9UIEVESVQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDEwMgotCi1DRkc9bW9kX3Byb3h5X2h0dHAgLSBXaW4zMiBSZWxlYXNlCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIm1vZF9wcm94eV9odHRwLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAibW9kX3Byb3h5X2h0dHAubWFrIiBDRkc9Im1vZF9wcm94eV9odHRwIC0gV2luMzIgUmVsZWFzZSIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJtb2RfcHJveHlfaHR0cCAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgIm1vZF9wcm94eV9odHRwIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1NVEw9bWlkbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAibW9kX3Byb3h5X2h0dHAgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9JICIuLi8uLi9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci9pbmNsdWRlIiAvSSAiLi4vLi4vc3JjbGliL2Fwci11dGlsL2luY2x1ZGUiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRmQiUmVsZWFzZVxtb2RfcHJveHlfaHR0cCIgL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgd3MyXzMyLmxpYiBtc3dzb2NrLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYXAgL21hY2hpbmU6STM4NiAvb3V0OiJSZWxlYXNlL21vZF9wcm94eV9odHRwLnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF9wcm94eV9odHRwCi0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIHdzMl8zMi5saWIgbXN3c29jay5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9tYWNoaW5lOkkzODYgL291dDoiUmVsZWFzZS9tb2RfcHJveHlfaHR0cC5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfcHJveHlfaHR0cAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibW9kX3Byb3h5X2h0dHAgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aaSAvT2QgL0kgIi4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByL2luY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9GZCJEZWJ1Z1xtb2RfcHJveHlfaHR0cCIgL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgd3MyXzMyLmxpYiBtc3dzb2NrLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9pbmNyZW1lbnRhbDpubyAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6IkRlYnVnL21vZF9wcm94eV9odHRwLnNvIiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF9wcm94eV9odHRwCi0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIHdzMl8zMi5saWIgbXN3c29jay5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvaW5jcmVtZW50YWw6bm8gL21hcCAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJEZWJ1Zy9tb2RfcHJveHlfaHR0cC5zbyIgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2RfcHJveHlfaHR0cAotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAibW9kX3Byb3h5X2h0dHAgLSBXaW4zMiBSZWxlYXNlIgotIyBOYW1lICJtb2RfcHJveHlfaHR0cCAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aHBqO2JhdDtmb3I7ZjkwIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxwcm94eV9odHRwLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgIi5oIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2RfcHJveHkuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxidWlsZFx3aW4zMlx3aW4zMnZlci5hd2sKLQotIUlGICAiJChDRkcpIiA9PSAibW9kX3Byb3h5X2h0dHAgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIENyZWF0aW5nIFZlcnNpb24gUmVzb3VyY2UKLUlucHV0UGF0aD0uLlwuLlxidWlsZFx3aW4zMlx3aW4zMnZlci5hd2sKLQotIi5cbW9kX3Byb3h5X2h0dHAucmMiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JYXdrIC1mIC4uLy4uL2J1aWxkL3dpbjMyL3dpbjMydmVyLmF3ayBtb2RfcHJveHlfaHR0cCAgInByb3h5X2h0dHBfbW9kdWxlIGZvciBBcGFjaGUiIC4uLy4uL2luY2x1ZGUvYXBfcmVsZWFzZS5oID4gLlxtb2RfcHJveHlfaHR0cC5yYwotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9wcm94eV9odHRwIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQ3JlYXRpbmcgVmVyc2lvbiBSZXNvdXJjZQotSW5wdXRQYXRoPS4uXC4uXGJ1aWxkXHdpbjMyXHdpbjMydmVyLmF3awotCi0iLlxtb2RfcHJveHlfaHR0cC5yYyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQlhd2sgLWYgLi4vLi4vYnVpbGQvd2luMzIvd2luMzJ2ZXIuYXdrIG1vZF9wcm94eV9odHRwICAicHJveHlfaHR0cF9tb2R1bGUgZm9yIEFwYWNoZSIgLi4vLi4vaW5jbHVkZS9hcF9yZWxlYXNlLmggPiAuXG1vZF9wcm94eV9odHRwLnJjCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL21vZHVsZXMvcHJveHkvcHJveHlfY29ubmVjdC5jIGIvbW9kdWxlcy9wcm94eS9wcm94eV9jb25uZWN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMjAzZjIuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9wcm94eS9wcm94eV9jb25uZWN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKiBDT05ORUNUIG1ldGhvZCBmb3IgQXBhY2hlIHByb3h5ICovCi0KLSNpbmNsdWRlICJtb2RfcHJveHkuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotCi0jaWZkZWYgSEFWRV9CU1RSSU5HX0gKLSNpbmNsdWRlIDxic3RyaW5nLmg+CQkvKiBmb3IgSVJJWCwgRkRfU0VUIGNhbGxzIGJ6ZXJvKCkgKi8KLSNlbmRpZgotCi1ERUZfRXhwbGFpbgotCi0vKiAgCi0gKiBUaGlzIGhhbmRsZXMgTmV0c2NhcGUgQ09OTkVDVCBtZXRob2Qgc2VjdXJlIHByb3h5IHJlcXVlc3RzLgotICogQSBjb25uZWN0aW9uIGlzIG9wZW5lZCB0byB0aGUgc3BlY2lmaWVkIGhvc3QgYW5kIGRhdGEgaXMKLSAqIHBhc3NlZCB0aHJvdWdoIGJldHdlZW4gdGhlIFdXVyBzaXRlIGFuZCB0aGUgYnJvd3Nlci4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIElOVEVSTkVULURSQUZUIGRvY3VtZW50Ci0gKiAiVHVubmVsaW5nIFNTTCBUaHJvdWdoIGEgV1dXIFByb3h5IiBjdXJyZW50bHkgYXQKLSAqIGh0dHA6Ly93d3cubWNvbS5jb20vbmV3c3JlZi9zdGQvdHVubmVsaW5nX3NzbC5odG1sLgotICoKLSAqIElmIHByb3h5aG9zdCBhbmQgcHJveHlwb3J0IGFyZSBzZXQsIHdlIHNlbmQgYSBDT05ORUNUIHRvIAotICogdGhlIHNwZWNpZmllZCBwcm94eS4uICAKLSAqCi0gKiBGSVhNRTogdGhpcyBpcyBiYWQsIGJlY2F1c2UgaXQgZG9lcyBpdHMgb3duIHNvY2tldCBJL08KLSAqICAgICAgICBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBJL08gaW4gYnVmZi5jLiAgSG93ZXZlciwKLSAqICAgICAgICB0aGUgSS9PIGluIGJ1ZmYuYyBibG9ja3Mgb24gcmVhZHMsIGFuZCBiZWNhdXNlCi0gKiAgICAgICAgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGtub3cgaG93IG11Y2ggZGF0YSB3aWxsCi0gKiAgICAgICAgYmUgc2VudCBlaXRoZXIgd2F5IChvciB3aGVuKSBpdCBjYW4ndCB1c2UgYmxvY2tpbmcKLSAqICAgICAgICBJL08uICBUaGlzIG1heSBiZSB2ZXJ5IGltcGxlbWVudGF0aW9uLXNwZWNpZmljCi0gKiAgICAgICAgKHRvIExpbnV4KS4gIEFueSBzdWdnZXN0aW9ucz8KLSAqIEZJWE1FOiB0aGlzIGRvZXNuJ3QgbG9nIHRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudCwgYnV0Ci0gKiAgICAgICAgdGhhdCBtYXkgYmUgb2theSwgc2luY2UgdGhlIGRhdGEgaXMgc3VwcG9zZWQgdG8KLSAqICAgICAgICBiZSB0cmFuc3BhcmVudC4gSW4gZmFjdCwgdGhpcyBkb2Vzbid0IGxvZyBhdCBhbGwKLSAqICAgICAgICB5ZXQuIDheKQotICogRklYTUU6IGRvZXNuJ3QgY2hlY2sgYW55IGhlYWRlcnMgaW5pdGFsbHkgc2VudCBmcm9tIHRoZQotICogICAgICAgIGNsaWVudC4KLSAqIEZJWE1FOiBzaG91bGQgYWxsb3cgYXV0aGVudGljYXRpb24sIGJ1dCBob3BlZnVsbHkgdGhlCi0gKiAgICAgICAgZ2VuZXJpYyBwcm94eSBhdXRoZW50aWNhdGlvbiBpcyBnb29kIGVub3VnaC4KLSAqIEZJWE1FOiBubyBjaGVjayBmb3Igci0+YXNzYmFja3dhcmRzLCB3aGF0ZXZlciB0aGF0IGlzLgotICovCi0KLXN0YXRpYyBpbnQKLWFsbG93ZWRfcG9ydChwcm94eV9zZXJ2ZXJfY29uZiAqY29uZiwgaW50IHBvcnQpCi17Ci0gICAgaW50IGk7Ci0gICAgaW50ICpsaXN0ID0gKGludCAqKSBjb25mLT5hbGxvd2VkX2Nvbm5lY3RfcG9ydHMtPmVsdHM7Ci0KLSAgICBmb3IoaSA9IDA7IGkgPCBjb25mLT5hbGxvd2VkX2Nvbm5lY3RfcG9ydHMtPm5lbHRzOyBpKyspIHsKLQlpZihwb3J0ID09IGxpc3RbaV0pCi0JICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotCi1pbnQgYXBfcHJveHlfY29ubmVjdF9oYW5kbGVyKHJlcXVlc3RfcmVjICpyLCBjYWNoZV9yZXEgKmMsIGNoYXIgKnVybCwKLQkJCSAgY29uc3QgY2hhciAqcHJveHlob3N0LCBpbnQgcHJveHlwb3J0KQotewotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzZXJ2ZXI7Ci0gICAgc3RydWN0IGluX2FkZHIgZGVzdGFkZHI7Ci0gICAgc3RydWN0IGhvc3RlbnQgc2VydmVyX2hwOwotICAgIGNvbnN0IGNoYXIgKmhvc3QsICplcnI7Ci0gICAgY2hhciAqcDsKLSAgICBpbnQgcG9ydCwgc29jazsKLSAgICBjaGFyIGJ1ZmZlcltIVUdFX1NUUklOR19MRU5dOwotICAgIGludCBuYnl0ZXMsIGksIGo7Ci0gICAgZmRfc2V0IGZkczsKLQotICAgIHZvaWQgKnNjb25mID0gci0+c2VydmVyLT5tb2R1bGVfY29uZmlnOwotICAgIHByb3h5X3NlcnZlcl9jb25mICpjb25mID0KLSAgICAocHJveHlfc2VydmVyX2NvbmYgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoc2NvbmYsICZwcm94eV9tb2R1bGUpOwotICAgIHN0cnVjdCBub3Byb3h5X2VudHJ5ICpucGVudCA9IChzdHJ1Y3Qgbm9wcm94eV9lbnRyeSAqKSBjb25mLT5ub3Byb3hpZXMtPmVsdHM7Ci0KLSAgICBtZW1zZXQoJnNlcnZlciwgJ1wwJywgc2l6ZW9mKHNlcnZlcikpOwotICAgIHNlcnZlci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQotICAgIC8qIEJyZWFrIHRoZSBVUkwgaW50byBob3N0OnBvcnQgcGFpcnMgKi8KLQotICAgIGhvc3QgPSB1cmw7Ci0gICAgcCA9IHN0cmNocih1cmwsICc6Jyk7Ci0gICAgaWYgKHAgPT0gTlVMTCkKLQlwb3J0ID0gREVGQVVMVF9IVFRQU19QT1JUOwotICAgIGVsc2UgewotCXBvcnQgPSBhdG9pKHAgKyAxKTsKLQkqcCA9ICdcMCc7Ci0gICAgfQotCi0vKiBjaGVjayBpZiBQcm94eUJsb2NrIGRpcmVjdGl2ZSBvbiB0aGlzIGhvc3QgKi8KLSAgICBkZXN0YWRkci5zX2FkZHIgPSBhcF9pbmV0X2FkZHIoaG9zdCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGNvbmYtPm5vcHJveGllcy0+bmVsdHM7IGkrKykgewotCWlmICgobnBlbnRbaV0ubmFtZSAhPSBOVUxMICYmIHN0cnN0cihob3N0LCBucGVudFtpXS5uYW1lKSAhPSBOVUxMKQotCSAgICB8fCBkZXN0YWRkci5zX2FkZHIgPT0gbnBlbnRbaV0uYWRkci5zX2FkZHIgfHwgbnBlbnRbaV0ubmFtZVswXSA9PSAnKicpCi0JICAgIHJldHVybiBhcF9wcm94eWVycm9yKHIsIEhUVFBfRk9SQklEREVOLAotCQkJCSAiQ29ubmVjdCB0byByZW1vdGUgbWFjaGluZSBibG9ja2VkIik7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgaWYgaXQgaXMgYW4gYWxsb3dlZCBwb3J0ICovCi0gICAgaWYgKGNvbmYtPmFsbG93ZWRfY29ubmVjdF9wb3J0cy0+bmVsdHMgPT0gMCkgewotCS8qIERlZmF1bHQgc2V0dGluZyBpZiBub3Qgb3ZlcnJpZGRlbiBieSBBbGxvd0NPTk5FQ1QgKi8KLQlzd2l0Y2ggKHBvcnQpIHsKLQkgICAgY2FzZSBERUZBVUxUX0hUVFBTX1BPUlQ6Ci0JICAgIGNhc2UgREVGQVVMVF9TTkVXU19QT1JUOgotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJcmV0dXJuIEhUVFBfRk9SQklEREVOOwotCX0KLSAgICB9IGVsc2UgaWYoIWFsbG93ZWRfcG9ydChjb25mLCBwb3J0KSkKLQlyZXR1cm4gSFRUUF9GT1JCSURERU47Ci0KLSAgICBpZiAocHJveHlob3N0KSB7Ci0JRXhwbGFpbjIoIkNPTk5FQ1QgdG8gcmVtb3RlIHByb3h5ICVzIG9uIHBvcnQgJWQiLCBwcm94eWhvc3QsIHByb3h5cG9ydCk7Ci0gICAgfQotICAgIGVsc2UgewotCUV4cGxhaW4yKCJDT05ORUNUIHRvICVzIG9uIHBvcnQgJWQiLCBob3N0LCBwb3J0KTsKLSAgICB9Ci0KLSAgICBzZXJ2ZXIuc2luX3BvcnQgPSAocHJveHlwb3J0ID8gaHRvbnMocHJveHlwb3J0KSA6IGh0b25zKHBvcnQpKTsKLSAgICBlcnIgPSBhcF9wcm94eV9ob3N0MmFkZHIocHJveHlob3N0ID8gcHJveHlob3N0IDogaG9zdCwgJnNlcnZlcl9ocCk7Ci0KLSAgICBpZiAoZXJyICE9IE5VTEwpCi0JcmV0dXJuIGFwX3Byb3h5ZXJyb3IociwKLQkJCSAgICAgcHJveHlob3N0ID8gSFRUUF9CQURfR0FURVdBWSA6IEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAotCQkJICAgICBlcnIpOwotCi0gICAgc29jayA9IGFwX3Bzb2NrZXQoci0+cG9vbCwgUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKLSAgICBpZiAoc29jayA9PSAtMSkgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotCQkgICAgInByb3h5OiBlcnJvciBjcmVhdGluZyBzb2NrZXQiKTsKLQlyZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgfQotCi0jaWZkZWYgQ0hFQ0tfRkRfU0VUU0laRQotICAgIGlmIChzb2NrID49IEZEX1NFVFNJWkUpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLCBOVUxMLAotCSAgICAicHJveHlfY29ubmVjdF9oYW5kbGVyOiBmaWxlZGVzY3JpcHRvciAoJXUpICIKLQkgICAgImxhcmdlciB0aGFuIEZEX1NFVFNJWkUgKCV1KSAiCi0JICAgICJmb3VuZCwgeW91IHByb2JhYmx5IG5lZWQgdG8gcmVidWlsZCBBcGFjaGUgd2l0aCBhICIKLQkgICAgImxhcmdlciBGRF9TRVRTSVpFIiwgc29jaywgRkRfU0VUU0laRSk7Ci0JYXBfcGNsb3Nlc29ja2V0KHItPnBvb2wsIHNvY2spOwotCXJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGogPSAwOwotICAgIHdoaWxlIChzZXJ2ZXJfaHAuaF9hZGRyX2xpc3Rbal0gIT0gTlVMTCkgewotCW1lbWNweSgmc2VydmVyLnNpbl9hZGRyLCBzZXJ2ZXJfaHAuaF9hZGRyX2xpc3Rbal0sCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOwotCWkgPSBhcF9wcm94eV9kb2Nvbm5lY3Qoc29jaywgJnNlcnZlciwgcik7Ci0JaWYgKGkgPT0gMCkKLQkgICAgYnJlYWs7Ci0JaisrOwotICAgIH0KLSAgICBpZiAoaSA9PSAtMSkgewotCWFwX3BjbG9zZXNvY2tldChyLT5wb29sLCBzb2NrKTsKLQlyZXR1cm4gYXBfcHJveHllcnJvcihyLCBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgYXBfcHN0cmNhdChyLT5wb29sLAotCQkJCQkiQ291bGQgbm90IGNvbm5lY3QgdG8gcmVtb3RlIG1hY2hpbmU6PGJyPiIsCi0JCQkJCXN0cmVycm9yKGVycm5vKSwgTlVMTCkpOwotICAgIH0KLQotICAgIC8qIElmIHdlIGFyZSBjb25uZWN0aW5nIHRocm91Z2ggYSByZW1vdGUgcHJveHksIHdlIG5lZWQgdG8gcGFzcwotICAgICAqIHRoZSBDT05ORUNUIHJlcXVlc3Qgb24gdG8gaXQuCi0gICAgICovCi0gICAgaWYgKHByb3h5cG9ydCkgewotCS8qIEZJWE1FOiBXZSBzaG91bGQgbm90IGJlIGNhbGxpbmcgd3JpdGUoKSBkaXJlY3RseSwgYnV0IHdlIGN1cnJlbnRseQotCSAqIGhhdmUgbm8gYWx0ZXJuYXRpdmUuICBFcnJvciBjaGVja2luZyBpZ25vcmVkLiAgQWxzbywgd2UgZm9yY2UKLQkgKiBhIEhUVFAvMS4wIHJlcXVlc3QgdG8ga2VlcCB0aGluZ3Mgc2ltcGxlLgotCSAqLwotCUV4cGxhaW4wKCJTZW5kaW5nIHRoZSBDT05ORUNUIHJlcXVlc3QgdG8gdGhlIHJlbW90ZSBwcm94eSIpOwotCWFwX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJDT05ORUNUICVzIEhUVFAvMS4wIiBDUkxGLAotCQkgICAgci0+dXJpKTsKLQl3cml0ZShzb2NrLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLQlhcF9zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAotCQkgICAgIlByb3h5LWFnZW50OiAlcyIgQ1JMRiBDUkxGLCBhcF9nZXRfc2VydmVyX3ZlcnNpb24oKSk7Ci0Jd3JpdGUoc29jaywgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgfQotICAgIGVsc2UgewotCUV4cGxhaW4wKCJSZXR1cm5pbmcgMjAwIE9LIFN0YXR1cyIpOwotCWFwX3J2cHV0cyhyLCAiSFRUUC8xLjAgMjAwIENvbm5lY3Rpb24gZXN0YWJsaXNoZWQiIENSTEYsIE5VTEwpOwotCWFwX3J2cHV0cyhyLCAiUHJveHktYWdlbnQ6ICIsIGFwX2dldF9zZXJ2ZXJfdmVyc2lvbigpLCBDUkxGIENSTEYsIE5VTEwpOwotCWFwX2JmbHVzaChyLT5jb25uZWN0aW9uLT5jbGllbnQpOwotICAgIH0KLQotICAgIHdoaWxlICgxKSB7CQkJLyogSW5maW5pdGUgbG9vcCB1bnRpbCBlcnJvciAob25lIHNpZGUgY2xvc2VzIHRoZSBjb25uZWN0aW9uKSAqLwotCUZEX1pFUk8oJmZkcyk7Ci0JRkRfU0VUKHNvY2ssICZmZHMpOwotCUZEX1NFVChyLT5jb25uZWN0aW9uLT5jbGllbnQtPmZkLCAmZmRzKTsKLQotCUV4cGxhaW4wKCJHb2luZyB0byBzbGVlcCAoc2VsZWN0KSIpOwotCWkgPSBhcF9zZWxlY3QoKHItPmNvbm5lY3Rpb24tPmNsaWVudC0+ZmQgPiBzb2NrID8KLQkJICAgICAgIHItPmNvbm5lY3Rpb24tPmNsaWVudC0+ZmQgKyAxIDoKLQkJICAgICAgIHNvY2sgKyAxKSwgJmZkcywgTlVMTCwgTlVMTCwgTlVMTCk7Ci0JRXhwbGFpbjEoIldva2UgZnJvbSBzZWxlY3QoKSwgaT0lZCIsIGkpOwotCi0JaWYgKGkpIHsKLQkgICAgaWYgKEZEX0lTU0VUKHNvY2ssICZmZHMpKSB7Ci0JCUV4cGxhaW4wKCJzb2NrIHdhcyBzZXQiKTsKLQkJaWYgKChuYnl0ZXMgPSByZWFkKHNvY2ssIGJ1ZmZlciwgSFVHRV9TVFJJTkdfTEVOKSkgIT0gMCkgewotCQkgICAgaWYgKG5ieXRlcyA9PSAtMSkKLQkJCWJyZWFrOwotCQkgICAgaWYgKHdyaXRlKHItPmNvbm5lY3Rpb24tPmNsaWVudC0+ZmQsIGJ1ZmZlciwgbmJ5dGVzKSA9PSBFT0YpCi0JCQlicmVhazsKLQkJICAgIEV4cGxhaW4xKCJXcm90ZSAlZCBieXRlcyB0byBjbGllbnQiLCBuYnl0ZXMpOwotCQl9Ci0JCWVsc2UKLQkJICAgIGJyZWFrOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKEZEX0lTU0VUKHItPmNvbm5lY3Rpb24tPmNsaWVudC0+ZmQsICZmZHMpKSB7Ci0JCUV4cGxhaW4wKCJjbGllbnQtPmZkIHdhcyBzZXQiKTsKLQkJaWYgKChuYnl0ZXMgPSByZWFkKHItPmNvbm5lY3Rpb24tPmNsaWVudC0+ZmQsIGJ1ZmZlciwKLQkJCQkgICBIVUdFX1NUUklOR19MRU4pKSAhPSAwKSB7Ci0JCSAgICBpZiAobmJ5dGVzID09IC0xKQotCQkJYnJlYWs7Ci0JCSAgICBpZiAod3JpdGUoc29jaywgYnVmZmVyLCBuYnl0ZXMpID09IEVPRikKLQkJCWJyZWFrOwotCQkgICAgRXhwbGFpbjEoIldyb3RlICVkIGJ5dGVzIHRvIHNlcnZlciIsIG5ieXRlcyk7Ci0JCX0KLQkJZWxzZQotCQkgICAgYnJlYWs7Ci0JICAgIH0KLQkgICAgZWxzZQotCQlicmVhazsJCS8qIE11c3QgYmUgZG9uZSB3YWl0aW5nICovCi0JfQotCWVsc2UKLQkgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgYXBfcGNsb3Nlc29ja2V0KHItPnBvb2wsIHNvY2spOwotCi0gICAgcmV0dXJuIE9LOwotfQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9wcm94eS9wcm94eV9mdHAuYyBiL21vZHVsZXMvcHJveHkvcHJveHlfZnRwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3Y2E5ZGEuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9wcm94eS9wcm94eV9mdHAuYworKysgL2Rldi9udWxsCkBAIC0xLDEyODQgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKiBGVFAgcm91dGluZXMgZm9yIEFwYWNoZSBwcm94eSAqLwotCi0jaW5jbHVkZSAibW9kX3Byb3h5LmgiCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLQotI2RlZmluZSBBVVRPREVURUNUX1BXRAotCi1ERUZfRXhwbGFpbgotCi0vKgotICogRGVjb2RlcyBhICclJyBlc2NhcGVkIHN0cmluZywgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzCi0gKi8KLXN0YXRpYyBpbnQgZGVjb2RlZW5jKGNoYXIgKngpCi17Ci0gICAgaW50IGksIGosIGNoOwotCi0gICAgaWYgKHhbMF0gPT0gJ1wwJykKLQlyZXR1cm4gMDsJCS8qIHNwZWNpYWwgY2FzZSBmb3Igbm8gY2hhcmFjdGVycyAqLwotICAgIGZvciAoaSA9IDAsIGogPSAwOyB4W2ldICE9ICdcMCc7IGkrKywgaisrKSB7Ci0vKiBkZWNvZGUgaXQgaWYgbm90IGFscmVhZHkgZG9uZSAqLwotCWNoID0geFtpXTsKLQlpZiAoY2ggPT0gJyUnICYmIGFwX2lzeGRpZ2l0KHhbaSArIDFdKSAmJiBhcF9pc3hkaWdpdCh4W2kgKyAyXSkpIHsKLQkgICAgY2ggPSBhcF9wcm94eV9oZXgyYygmeFtpICsgMV0pOwotCSAgICBpICs9IDI7Ci0JfQotCXhbal0gPSBjaDsKLSAgICB9Ci0gICAgeFtqXSA9ICdcMCc7Ci0gICAgcmV0dXJuIGo7Ci19Ci0KLS8qCi0gKiBjaGVja3MgYW4gZW5jb2RlZCBmdHAgc3RyaW5nIGZvciBiYWQgY2hhcmFjdGVycywgbmFtZWx5LCBDUiwgTEYgb3IKLSAqIG5vbi1hc2NpaSBjaGFyYWN0ZXIKLSAqLwotc3RhdGljIGludCBmdHBfY2hlY2tfc3RyaW5nKGNvbnN0IGNoYXIgKngpCi17Ci0gICAgaW50IGksIGNoOwotCi0gICAgZm9yIChpID0gMDsgeFtpXSAhPSAnXDAnOyBpKyspIHsKLQljaCA9IHhbaV07Ci0JaWYgKGNoID09ICclJyAmJiBhcF9pc3hkaWdpdCh4W2kgKyAxXSkgJiYgYXBfaXN4ZGlnaXQoeFtpICsgMl0pKSB7Ci0JICAgIGNoID0gYXBfcHJveHlfaGV4MmMoJnhbaSArIDFdKTsKLQkgICAgaSArPSAyOwotCX0KLSNpZm5kZWYgQ0hBUlNFVF9FQkNESUMKLQlpZiAoY2ggPT0gJ1wwMTUnIHx8IGNoID09ICdcMDEyJyB8fCAoY2ggJiAweDgwKSkKLSNlbHNlIC8qQ0hBUlNFVF9FQkNESUMqLwotCWlmIChjaCA9PSAnXHInIHx8IGNoID09ICdcbicgfHwgKG9zX3RvYXNjaWlbY2hdICYgMHg4MCkpCi0jZW5kaWYgLypDSEFSU0VUX0VCQ0RJQyovCi0JICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotLyoKLSAqIENhbm9uaWNhbGlzZSBmdHAgVVJMcy4KLSAqLwotaW50IGFwX3Byb3h5X2Z0cF9jYW5vbihyZXF1ZXN0X3JlYyAqciwgY2hhciAqdXJsKQotewotICAgIGNoYXIgKnVzZXIsICpwYXNzd29yZCwgKmhvc3QsICpwYXRoLCAqcGFybXMsICpzdHJwLCBzcG9ydFs3XTsKLSAgICBwb29sICpwID0gci0+cG9vbDsKLSAgICBjb25zdCBjaGFyICplcnI7Ci0gICAgaW50IHBvcnQ7Ci0KLSAgICBwb3J0ID0gREVGQVVMVF9GVFBfUE9SVDsKLSAgICBlcnIgPSBhcF9wcm94eV9jYW5vbl9uZXRsb2MocCwgJnVybCwgJnVzZXIsICZwYXNzd29yZCwgJmhvc3QsICZwb3J0KTsKLSAgICBpZiAoZXJyKQotCXJldHVybiBIVFRQX0JBRF9SRVFVRVNUOwotICAgIGlmICh1c2VyICE9IE5VTEwgJiYgIWZ0cF9jaGVja19zdHJpbmcodXNlcikpCi0JcmV0dXJuIEhUVFBfQkFEX1JFUVVFU1Q7Ci0gICAgaWYgKHBhc3N3b3JkICE9IE5VTEwgJiYgIWZ0cF9jaGVja19zdHJpbmcocGFzc3dvcmQpKQotCXJldHVybiBIVFRQX0JBRF9SRVFVRVNUOwotCi0vKiBub3cgcGFyc2UgcGF0aC9wYXJhbWV0ZXJzIGFyZ3MsIGFjY29yZGluZyB0byByZmMxNzM4ICovCi0vKiBOLkIuIGlmIHRoaXMgaXNuJ3QgYSB0cnVlIHByb3h5IHJlcXVlc3QsIHRoZW4gdGhlIFVSTCBwYXRoCi0gKiAoYnV0IG5vdCBxdWVyeSBhcmdzKSBoYXMgYWxyZWFkeSBiZWVuIGRlY29kZWQuCi0gKiBUaGlzIGdpdmVzIHJpc2UgdG8gdGhlIHByb2JsZW0gb2YgYSA7IGJlaW5nIGRlY29kZWQgaW50byB0aGUKLSAqIHBhdGguCi0gKi8KLSAgICBzdHJwID0gc3RyY2hyKHVybCwgJzsnKTsKLSAgICBpZiAoc3RycCAhPSBOVUxMKSB7Ci0JKihzdHJwKyspID0gJ1wwJzsKLQlwYXJtcyA9IGFwX3Byb3h5X2Nhbm9uZW5jKHAsIHN0cnAsIHN0cmxlbihzdHJwKSwgZW5jX3Bhcm0sIHItPnByb3h5cmVxKTsKLQlpZiAocGFybXMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIEhUVFBfQkFEX1JFUVVFU1Q7Ci0gICAgfQotICAgIGVsc2UKLQlwYXJtcyA9ICIiOwotCi0gICAgcGF0aCA9IGFwX3Byb3h5X2Nhbm9uZW5jKHAsIHVybCwgc3RybGVuKHVybCksIGVuY19wYXRoLCByLT5wcm94eXJlcSk7Ci0gICAgaWYgKHBhdGggPT0gTlVMTCkKLQlyZXR1cm4gSFRUUF9CQURfUkVRVUVTVDsKLSAgICBpZiAoIWZ0cF9jaGVja19zdHJpbmcocGF0aCkpCi0JcmV0dXJuIEhUVFBfQkFEX1JFUVVFU1Q7Ci0KLSAgICBpZiAoIXItPnByb3h5cmVxICYmIHItPmFyZ3MgIT0gTlVMTCkgewotCWlmIChzdHJwICE9IE5VTEwpIHsKLQkgICAgc3RycCA9IGFwX3Byb3h5X2Nhbm9uZW5jKHAsIHItPmFyZ3MsIHN0cmxlbihyLT5hcmdzKSwgZW5jX3Bhcm0sIDEpOwotCSAgICBpZiAoc3RycCA9PSBOVUxMKQotCQlyZXR1cm4gSFRUUF9CQURfUkVRVUVTVDsKLQkgICAgcGFybXMgPSBhcF9wc3RyY2F0KHAsIHBhcm1zLCAiPyIsIHN0cnAsIE5VTEwpOwotCX0KLQllbHNlIHsKLQkgICAgc3RycCA9IGFwX3Byb3h5X2Nhbm9uZW5jKHAsIHItPmFyZ3MsIHN0cmxlbihyLT5hcmdzKSwgZW5jX2ZwYXRoLCAxKTsKLQkgICAgaWYgKHN0cnAgPT0gTlVMTCkKLQkJcmV0dXJuIEhUVFBfQkFEX1JFUVVFU1Q7Ci0JICAgIHBhdGggPSBhcF9wc3RyY2F0KHAsIHBhdGgsICI/Iiwgc3RycCwgTlVMTCk7Ci0JfQotCXItPmFyZ3MgPSBOVUxMOwotICAgIH0KLQotLyogbm93LCByZWJ1aWxkIFVSTCAqLwotCi0gICAgaWYgKHBvcnQgIT0gREVGQVVMVF9GVFBfUE9SVCkKLQlhcF9zbnByaW50ZihzcG9ydCwgc2l6ZW9mKHNwb3J0KSwgIjolZCIsIHBvcnQpOwotICAgIGVsc2UKLQlzcG9ydFswXSA9ICdcMCc7Ci0KLSAgICByLT5maWxlbmFtZSA9IGFwX3BzdHJjYXQocCwgInByb3h5OmZ0cDovLyIsICh1c2VyICE9IE5VTEwpID8gdXNlciA6ICIiLAotCQkJICAgICAgIChwYXNzd29yZCAhPSBOVUxMKSA/ICI6IiA6ICIiLAotCQkJICAgICAgIChwYXNzd29yZCAhPSBOVUxMKSA/IHBhc3N3b3JkIDogIiIsCi0JCSAgICAgICAgICAodXNlciAhPSBOVUxMKSA/ICJAIiA6ICIiLCBob3N0LCBzcG9ydCwgIi8iLCBwYXRoLAotCQkJICAgICAgIChwYXJtc1swXSAhPSAnXDAnKSA/ICI7IiA6ICIiLCBwYXJtcywgTlVMTCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8qCi0gKiBSZXR1cm5zIHRoZSBmdHAgc3RhdHVzIGNvZGU7Ci0gKiAgb3IgLTEgb24gSS9PIGVycm9yLCAwIG9uIGRhdGEgZXJyb3IKLSAqLwotc3RhdGljIGludCBmdHBfZ2V0cmMoQlVGRiAqZikKLXsKLSAgICBpbnQgbGVuLCBzdGF0dXM7Ci0gICAgY2hhciBsaW5lYnVmZlsxMDBdLCBidWZmWzVdOwotCi0gICAgbGVuID0gYXBfYmdldHMobGluZWJ1ZmYsIHNpemVvZiBsaW5lYnVmZiwgZik7Ci0gICAgaWYgKGxlbiA9PSAtMSkKLQlyZXR1cm4gLTE7Ci0vKiBjaGVjayBmb3JtYXQgKi8KLSAgICBpZiAobGVuIDwgNSB8fCAhYXBfaXNkaWdpdChsaW5lYnVmZlswXSkgfHwgIWFwX2lzZGlnaXQobGluZWJ1ZmZbMV0pIHx8Ci0JIWFwX2lzZGlnaXQobGluZWJ1ZmZbMl0pIHx8IChsaW5lYnVmZlszXSAhPSAnICcgJiYgbGluZWJ1ZmZbM10gIT0gJy0nKSkKLQlzdGF0dXMgPSAwOwotICAgIGVsc2UKLQlzdGF0dXMgPSAxMDAgKiBsaW5lYnVmZlswXSArIDEwICogbGluZWJ1ZmZbMV0gKyBsaW5lYnVmZlsyXSAtIDExMSAqICcwJzsKLQotICAgIGlmIChsaW5lYnVmZltsZW4gLSAxXSAhPSAnXG4nKSB7Ci0JKHZvaWQpYXBfYnNraXBsZihmKTsKLSAgICB9Ci0KLS8qIHNraXAgY29udGludWF0aW9uIGxpbmVzICovCi0gICAgaWYgKGxpbmVidWZmWzNdID09ICctJykgewotCW1lbWNweShidWZmLCBsaW5lYnVmZiwgMyk7Ci0JYnVmZlszXSA9ICcgJzsKLQlkbyB7Ci0JICAgIGxlbiA9IGFwX2JnZXRzKGxpbmVidWZmLCBzaXplb2YgbGluZWJ1ZmYsIGYpOwotCSAgICBpZiAobGVuID09IC0xKQotCQlyZXR1cm4gLTE7Ci0JICAgIGlmIChsaW5lYnVmZltsZW4gLSAxXSAhPSAnXG4nKSB7Ci0JCSh2b2lkKWFwX2Jza2lwbGYoZik7Ci0JICAgIH0KLQl9IHdoaWxlIChtZW1jbXAobGluZWJ1ZmYsIGJ1ZmYsIDQpICE9IDApOwotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8qCi0gKiBMaWtlIGZ0cF9nZXRyYyBidXQgcmV0dXJucyBib3RoIHRoZSBmdHAgc3RhdHVzIGNvZGUgYW5kIAotICogcmVtZW1iZXJzIHRoZSByZXNwb25zZSBtZXNzYWdlIGluIHRoZSBzdXBwbGllZCBidWZmZXIKLSAqLwotc3RhdGljIGludCBmdHBfZ2V0cmNfbXNnKEJVRkYgKmYsIGNoYXIgKm1zZ2J1ZiwgaW50IG1zZ2xlbikKLXsKLSAgICBpbnQgbGVuLCBzdGF0dXM7Ci0gICAgY2hhciBsaW5lYnVmZlsxMDBdLCBidWZmWzVdOwotICAgIGNoYXIgKm1iID0gbXNnYnVmLAotCSAqbWUgPSAmbXNnYnVmW21zZ2xlbl07Ci0KLSAgICBsZW4gPSBhcF9iZ2V0cyhsaW5lYnVmZiwgc2l6ZW9mIGxpbmVidWZmLCBmKTsKLSAgICBpZiAobGVuID09IC0xKQotCXJldHVybiAtMTsKLSAgICBpZiAobGVuIDwgNSB8fCAhYXBfaXNkaWdpdChsaW5lYnVmZlswXSkgfHwgIWFwX2lzZGlnaXQobGluZWJ1ZmZbMV0pIHx8Ci0JIWFwX2lzZGlnaXQobGluZWJ1ZmZbMl0pIHx8IChsaW5lYnVmZlszXSAhPSAnICcgJiYgbGluZWJ1ZmZbM10gIT0gJy0nKSkKLQlzdGF0dXMgPSAwOwotICAgIGVsc2UKLQlzdGF0dXMgPSAxMDAgKiBsaW5lYnVmZlswXSArIDEwICogbGluZWJ1ZmZbMV0gKyBsaW5lYnVmZlsyXSAtIDExMSAqICcwJzsKLQotICAgIG1iID0gYXBfY3B5c3RybihtYiwgbGluZWJ1ZmYrNCwgbWUgLSBtYik7Ci0KLSAgICBpZiAobGluZWJ1ZmZbbGVuIC0gMV0gIT0gJ1xuJykKLQkodm9pZClhcF9ic2tpcGxmKGYpOwotCi0gICAgaWYgKGxpbmVidWZmWzNdID09ICctJykgewotCW1lbWNweShidWZmLCBsaW5lYnVmZiwgMyk7Ci0JYnVmZlszXSA9ICcgJzsKLQlkbyB7Ci0JICAgIGxlbiA9IGFwX2JnZXRzKGxpbmVidWZmLCBzaXplb2YgbGluZWJ1ZmYsIGYpOwotCSAgICBpZiAobGVuID09IC0xKQotCQlyZXR1cm4gLTE7Ci0JICAgIGlmIChsaW5lYnVmZltsZW4gLSAxXSAhPSAnXG4nKSB7Ci0JCSh2b2lkKWFwX2Jza2lwbGYoZik7Ci0JICAgIH0KLQkgICAgbWIgPSBhcF9jcHlzdHJuKG1iLCBsaW5lYnVmZis0LCBtZSAtIG1iKTsKLQl9IHdoaWxlIChtZW1jbXAobGluZWJ1ZmYsIGJ1ZmYsIDQpICE9IDApOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgbG9uZyBpbnQgc2VuZF9kaXIoQlVGRiAqZiwgcmVxdWVzdF9yZWMgKnIsIGNhY2hlX3JlcSAqYywgY2hhciAqY3dkKQotewotICAgIGNoYXIgYnVmW0lPQlVGU0laRV07Ci0gICAgY2hhciBidWYyW0lPQlVGU0laRV07Ci0gICAgY2hhciAqZmlsZW5hbWU7Ci0gICAgaW50IHNlYXJjaGlkeCA9IDA7Ci0gICAgY2hhciAqc2VhcmNocHRyID0gTlVMTDsKLSAgICBpbnQgZmlyc3RmaWxlID0gMTsKLSAgICB1bnNpZ25lZCBsb25nIHRvdGFsX2J5dGVzX3NlbnQgPSAwOwotICAgIHJlZ2lzdGVyIGludCBuLCBvLCB3OwotICAgIGNvbm5fcmVjICpjb24gPSByLT5jb25uZWN0aW9uOwotICAgIGNoYXIgKmRpciwgKnBhdGgsICpyZWxkaXIsICpzaXRlOwotCi0gICAgLyogU2F2ZSAic2NoZW1lOi8vc2l0ZSIgcHJlZml4IHdpdGhvdXQgcGFzc3dvcmQgKi8KLSAgICBzaXRlID0gYXBfdW5wYXJzZV91cmlfY29tcG9uZW50cyhyLT5wb29sLCAmci0+cGFyc2VkX3VyaSwgVU5QX09NSVRQQVNTV09SRHxVTlBfT01JVFBBVEhJTkZPKTsKLSAgICAvKiAuLi4gYW5kIHBhdGggd2l0aG91dCBxdWVyeSBhcmdzICovCi0gICAgcGF0aCA9IGFwX3VucGFyc2VfdXJpX2NvbXBvbmVudHMoci0+cG9vbCwgJnItPnBhcnNlZF91cmksIFVOUF9PTUlUU0lURVBBUlR8VU5QX09NSVRRVUVSWSk7Ci0gICAgKHZvaWQpZGVjb2RlZW5jKHBhdGgpOwotCi0gICAgLyogQ29weSBwYXRoLCBzdHJpcCAoYWxsIGV4Y2VwdCB0aGUgbGFzdCkgdHJhaWxpbmcgc2xhc2hlcyAqLwotICAgIHBhdGggPSBkaXIgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHBhdGgsICIvIiwgTlVMTCk7Ci0gICAgd2hpbGUgKChuID0gc3RybGVuKHBhdGgpKSA+IDEgJiYgcGF0aFtuLTFdID09ICcvJyAmJiBwYXRoW24tMl0gPT0gJy8nKQotCXBhdGhbbi0xXSA9ICdcMCc7Ci0KLSAgICAvKiBwcmludCAiZnRwOi8vaG9zdC8iICovCi0gICAgbiA9IGFwX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIERPQ1RZUEVfSFRNTF8zXzIKLQkJIjxIVE1MPjxIRUFEPjxUSVRMRT4lcyVzPC9USVRMRT5cbiIKLQkJIjxCQVNFIEhSRUY9XCIlcyVzXCI+PC9IRUFEPlxuIgotCQkiPEJPRFk+PEgyPkRpcmVjdG9yeSBvZiAiCi0JCSI8QSBIUkVGPVwiL1wiPiVzPC9BPi8iLAotCQlzaXRlLCBwYXRoLCBzaXRlLCBwYXRoLCBzaXRlKTsKLSAgICB0b3RhbF9ieXRlc19zZW50ICs9IGFwX3Byb3h5X2JwdXRzMihidWYsIGNvbi0+Y2xpZW50LCBjKTsKLQotICAgIHdoaWxlICgoZGlyID0gc3RyY2hyKGRpcisxLCAnLycpKSAhPSBOVUxMKQotICAgIHsKLQkqZGlyID0gJ1wwJzsKLQlpZiAoKHJlbGRpciA9IHN0cnJjaHIocGF0aCsxLCAnLycpKT09TlVMTCkKLQkgICAgcmVsZGlyID0gcGF0aCsxOwotCWVsc2UKLQkgICAgKytyZWxkaXI7Ci0JLyogcHJpbnQgInBhdGgvIiBjb21wb25lbnQgKi8KLQlhcF9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiPEEgSFJFRj1cIi8lcy9cIj4lczwvQT4vIiwgcGF0aCsxLCByZWxkaXIpOwotCXRvdGFsX2J5dGVzX3NlbnQgKz0gYXBfcHJveHlfYnB1dHMyKGJ1ZiwgY29uLT5jbGllbnQsIGMpOwotCSpkaXIgPSAnLyc7Ci0gICAgfQotICAgIC8qIElmIHRoZSBjYWxsZXIgaGFzIGRldGVybWluZWQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBhbmQgaXQgZGlmZmVycyAqLwotICAgIC8qIGZyb20gd2hhdCB0aGUgY2xpZW50IHJlcXVlc3RlZCwgdGhlbiBzaG93IHRoZSByZWFsIG5hbWUgKi8KLSAgICBpZiAoY3dkID09IE5VTEwgfHwgc3RybmNtcCAoY3dkLCBwYXRoLCBzdHJsZW4oY3dkKSkgPT0gMCkgewotCWFwX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICI8L0gyPlxuPEhSPjxQUkU+Iik7Ci0gICAgfSBlbHNlIHsKLQlhcF9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiPC9IMj5cbiglcylcbjxIUj48UFJFPiIsIGN3ZCk7Ci0gICAgfQotICAgIHRvdGFsX2J5dGVzX3NlbnQgKz0gYXBfcHJveHlfYnB1dHMyKGJ1ZiwgY29uLT5jbGllbnQsIGMpOwotCi0gICAgd2hpbGUgKCFjb24tPmFib3J0ZWQpIHsKLQluID0gYXBfYmdldHMoYnVmLCBzaXplb2YgYnVmLCBmKTsKLQlpZiAobiA9PSAtMSkgewkJLyogaW5wdXQgZXJyb3IgKi8KLQkgICAgaWYgKGMgIT0gTlVMTCkgewotCQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgYy0+cmVxLAotCQkgICAgInByb3h5OiBlcnJvciByZWFkaW5nIGZyb20gJXMiLCBjLT51cmwpOwotCQljID0gYXBfcHJveHlfY2FjaGVfZXJyb3IoYyk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JfQotCWlmIChuID09IDApCi0JICAgIGJyZWFrOwkJLyogRU9GICovCi0JaWYgKGJ1ZlswXSA9PSAnbCcgJiYgKGZpbGVuYW1lPXN0cnN0cihidWYsICIgLT4gIikpICE9IE5VTEwpIHsKLQkgICAgY2hhciAqbGlua19wdHIgPSBmaWxlbmFtZTsKLQotCSAgICBkbyB7Ci0JCWZpbGVuYW1lLS07Ci0JICAgIH0gd2hpbGUgKGZpbGVuYW1lWzBdICE9ICcgJyk7Ci0JICAgICooZmlsZW5hbWUrKykgPSAnXDAnOwotCSAgICAqKGxpbmtfcHRyKyspID0gJ1wwJzsKLQkgICAgaWYgKChuID0gc3RybGVuKGxpbmtfcHRyKSkgPiAxICYmIGxpbmtfcHRyW24gLSAxXSA9PSAnXG4nKQotCSAgICAgIGxpbmtfcHRyW24gLSAxXSA9ICdcMCc7Ci0JICAgIGFwX3NucHJpbnRmKGJ1ZjIsIHNpemVvZihidWYyKSwgIiVzIDxBIEhSRUY9XCIlc1wiPiVzICVzPC9BPlxuIiwgYnVmLCBmaWxlbmFtZSwgZmlsZW5hbWUsIGxpbmtfcHRyKTsKLQkgICAgYXBfY3B5c3RybihidWYsIGJ1ZjIsIHNpemVvZihidWYpKTsKLQkgICAgbiA9IHN0cmxlbihidWYpOwotCX0KLQllbHNlIGlmIChidWZbMF0gPT0gJ2QnIHx8IGJ1ZlswXSA9PSAnLScgfHwgYnVmWzBdID09ICdsJyB8fCBhcF9pc2RpZ2l0KGJ1ZlswXSkpIHsKLQkgICAgaWYgKGFwX2lzZGlnaXQoYnVmWzBdKSkgewkvKiBoYW5kbGUgRE9TIGRpciAqLwotCQlzZWFyY2hwdHIgPSBzdHJjaHIoYnVmLCAnPCcpOwotCQlpZiAoc2VhcmNocHRyICE9IE5VTEwpCi0JCSAgICAqc2VhcmNocHRyID0gJ1snOwotCQlzZWFyY2hwdHIgPSBzdHJjaHIoYnVmLCAnPicpOwotCQlpZiAoc2VhcmNocHRyICE9IE5VTEwpCi0JCSAgICAqc2VhcmNocHRyID0gJ10nOwotCSAgICB9Ci0KLQkgICAgZmlsZW5hbWUgPSBzdHJyY2hyKGJ1ZiwgJyAnKTsKLQkgICAgKihmaWxlbmFtZSsrKSA9IDA7Ci0JICAgIGZpbGVuYW1lW3N0cmxlbihmaWxlbmFtZSkgLSAxXSA9IDA7Ci0KLQkgICAgLyogaGFuZGxlIGZpbGVuYW1lcyB3aXRoIHNwYWNlcyBpbiAnZW0gKi8KLQkgICAgaWYgKCFzdHJjbXAoZmlsZW5hbWUsICIuIikgfHwgIXN0cmNtcChmaWxlbmFtZSwgIi4uIikgfHwgZmlyc3RmaWxlKSB7Ci0JCWZpcnN0ZmlsZSA9IDA7Ci0JCXNlYXJjaGlkeCA9IGZpbGVuYW1lIC0gYnVmOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHNlYXJjaGlkeCAhPSAwICYmIGJ1ZltzZWFyY2hpZHhdICE9IDApIHsKLQkJKigtLWZpbGVuYW1lKSA9ICcgJzsKLQkJYnVmW3NlYXJjaGlkeCAtIDFdID0gMDsKLQkJZmlsZW5hbWUgPSAmYnVmW3NlYXJjaGlkeF07Ci0JICAgIH0KLQotCSAgICAvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciAnLicgYW5kICcuLicgKi8KLQkgICAgaWYgKCFzdHJjbXAoZmlsZW5hbWUsICIuIikgfHwgIXN0cmNtcChmaWxlbmFtZSwgIi4uIikgfHwgYnVmWzBdID09ICdkJykgewotCQlhcF9zbnByaW50ZihidWYyLCBzaXplb2YoYnVmMiksICIlcyA8QSBIUkVGPVwiJXMvXCI+JXM8L0E+XG4iLAotCQkgICAgYnVmLCBmaWxlbmFtZSwgZmlsZW5hbWUpOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQlhcF9zbnByaW50ZihidWYyLCBzaXplb2YoYnVmMiksICIlcyA8QSBIUkVGPVwiJXNcIj4lczwvQT5cbiIsIGJ1ZiwgZmlsZW5hbWUsIGZpbGVuYW1lKTsKLQkgICAgfQotCSAgICBhcF9jcHlzdHJuKGJ1ZiwgYnVmMiwgc2l6ZW9mKGJ1ZikpOwotCSAgICBuID0gc3RybGVuKGJ1Zik7Ci0JfQotCi0JbyA9IDA7Ci0JdG90YWxfYnl0ZXNfc2VudCArPSBuOwotCi0JaWYgKGMgIT0gTlVMTCAmJiBjLT5mcCAmJiBhcF9id3JpdGUoYy0+ZnAsIGJ1ZiwgbikgIT0gbikgewotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgYy0+cmVxLAotCQkicHJveHk6IGVycm9yIHdyaXRpbmcgdG8gJXMiLCBjLT50ZW1wZmlsZSk7Ci0JICAgIGMgPSBhcF9wcm94eV9jYWNoZV9lcnJvcihjKTsKLQl9Ci0KLQl3aGlsZSAobiAmJiAhci0+Y29ubmVjdGlvbi0+YWJvcnRlZCkgewotCSAgICB3ID0gYXBfYndyaXRlKGNvbi0+Y2xpZW50LCAmYnVmW29dLCBuKTsKLQkgICAgaWYgKHcgPD0gMCkKLQkJYnJlYWs7Ci0JICAgIGFwX3Jlc2V0X3RpbWVvdXQocik7CS8qIHJlc2V0IHRpbWVvdXQgYWZ0ZXIgc3VjY2Vzc2Z1bGUgd3JpdGUgKi8KLQkgICAgbiAtPSB3OwotCSAgICBvICs9IHc7Ci0JfQotICAgIH0KLQotICAgIHRvdGFsX2J5dGVzX3NlbnQgKz0gYXBfcHJveHlfYnB1dHMyKCI8L1BSRT48SFI+XG4iLCBjb24tPmNsaWVudCwgYyk7Ci0gICAgdG90YWxfYnl0ZXNfc2VudCArPSBhcF9wcm94eV9icHV0czIoYXBfcHNpZ25hdHVyZSgiIiwgciksIGNvbi0+Y2xpZW50LCBjKTsKLSAgICB0b3RhbF9ieXRlc19zZW50ICs9IGFwX3Byb3h5X2JwdXRzMigiPC9CT0RZPjwvSFRNTD5cbiIsIGNvbi0+Y2xpZW50LCBjKTsKLQotICAgIGFwX2JmbHVzaChjb24tPmNsaWVudCk7Ci0KLSAgICByZXR1cm4gdG90YWxfYnl0ZXNfc2VudDsKLX0KLQotLyogQ29tbW9uIHJvdXRpbmUgZm9yIGZhaWxlZCBhdXRob3JpemF0aW9uIChpLmUuLCBtaXNzaW5nIG9yIHdyb25nIHBhc3N3b3JkKQotICogdG8gYW4gZnRwIHNlcnZpY2UuIFRoaXMgY2F1c2VzIG1vc3QgYnJvd3NlcnMgdG8gcmV0cnkgdGhlIHJlcXVlc3QKLSAqIHdpdGggdXNlcm5hbWUgYW5kIHBhc3N3b3JkICh3aGljaCB3YXMgcHJlc3VtYWJseSBxdWVyaWVkIGZyb20gdGhlIHVzZXIpCi0gKiBzdXBwbGllZCBpbiB0aGUgQXV0aG9yaXphdGlvbjogaGVhZGVyLgotICogTm90ZSB0aGF0IHdlICJpbnZlbnQiIGEgcmVhbG0gbmFtZSB3aGljaCBjb25zaXN0cyBvZiB0aGUKLSAqIGZ0cDovL3VzZXJAaG9zdCBwYXJ0IG9mIHRoZSByZXFlc3QgKHNhbnMgcGFzc3dvcmQgLWlmIHN1cHBsaWVkIGJ1dCBpbnZhbGlkLSkKLSAqLwotc3RhdGljIGludCBmdHBfdW5hdXRob3JpemVkIChyZXF1ZXN0X3JlYyAqciwgaW50IGxvZ19pdCkKLXsKLSAgICByLT5wcm94eXJlcSA9IDA7Ci0gICAgLyogTG9nIGZhaWxlZCByZXF1ZXN0cyBpZiB0aGV5IHN1cHBsaWVkIGEgcGFzc3dvcmQKLSAgICAgKiAobG9nIHVzZXJuYW1lL3Bhc3N3b3JkIGd1ZXNzaW5nIGF0dGVtcHRzKQotICAgICAqLwotICAgIGlmIChsb2dfaXQpCi0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19JTkZPfEFQTE9HX05PRVJSTk8sIHIsCi0JCSAgICAgICJwcm94eTogbWlzc2luZyBvciBmYWlsZWQgYXV0aCB0byAlcyIsCi0JCSAgICAgIGFwX3VucGFyc2VfdXJpX2NvbXBvbmVudHMoci0+cG9vbCwKLQkJICAgICAgJnItPnBhcnNlZF91cmksIFVOUF9PTUlUUEFUSElORk8pKTsKLQotICAgIGFwX3RhYmxlX3NldG4oci0+ZXJyX2hlYWRlcnNfb3V0LCAiV1dXLUF1dGhlbnRpY2F0ZSIsCi0gICAgICAgICAgICAgICAgICBhcF9wc3RyY2F0KHItPnBvb2wsICJCYXNpYyByZWFsbT1cIiIsCi0JCSAgYXBfdW5wYXJzZV91cmlfY29tcG9uZW50cyhyLT5wb29sLCAmci0+cGFyc2VkX3VyaSwKLQkJCQkJICAgIFVOUF9PTUlUUEFTU1dPUkR8VU5QX09NSVRQQVRISU5GTyksCi0JCSAgIlwiIiwgTlVMTCkpOwotCi0gICAgcmV0dXJuIEhUVFBfVU5BVVRIT1JJWkVEOwotfQotCi0vKgotICogSGFuZGxlcyBkaXJlY3QgYWNjZXNzIG9mIGZ0cDovLyBVUkxzCi0gKiBPcmlnaW5hbCAoTm9uLVBBU1YpIHZlcnNpb24gZnJvbQotICogVHJveSBNb3JyaXNvbiA8c3BpZmZuZXRAem9vbS5jb20+Ci0gKiBQQVNWIGFkZGVkIGJ5IENodWNrCi0gKi8KLWludCBhcF9wcm94eV9mdHBfaGFuZGxlcihyZXF1ZXN0X3JlYyAqciwgY2FjaGVfcmVxICpjLCBjaGFyICp1cmwpCi17Ci0gICAgY2hhciAqaG9zdCwgKnBhdGgsICpzdHJwLCAqcGFybXM7Ci0gICAgY2hhciAqY3dkID0gTlVMTDsKLSAgICBjaGFyICp1c2VyID0gTlVMTDsKLS8qICAgIGNoYXIgKmFjY291bnQgPSBOVUxMOyBob3cgdG8gc3VwcGx5IGFuIGFjY291bnQgaW4gYSBVUkw/ICovCi0gICAgY29uc3QgY2hhciAqcGFzc3dvcmQgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKmVycjsKLSAgICBpbnQgcG9ydCwgaSwgaiwgbGVuLCBzb2NrLCBkc29jaywgcmMsIG5vY2FjaGUgPSAwOwotICAgIGludCBjc2QgPSAwOwotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzZXJ2ZXI7Ci0gICAgc3RydWN0IGhvc3RlbnQgc2VydmVyX2hwOwotICAgIHN0cnVjdCBpbl9hZGRyIGRlc3RhZGRyOwotICAgIHRhYmxlICpyZXNwX2hkcnM7Ci0gICAgQlVGRiAqZjsKLSAgICBCVUZGICpkYXRhID0gTlVMTDsKLSAgICBwb29sICpwID0gci0+cG9vbDsKLSAgICBpbnQgb25lID0gMTsKLSAgICBjb25zdCBsb25nIGludCB6ZXJvID0gMEw7Ci0gICAgTkVUX1NJWkVfVCBjbGVuOwotICAgIHN0cnVjdCB0YmxfZG9fYXJncyB0ZG87Ci0KLSAgICB2b2lkICpzY29uZiA9IHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZzsKLSAgICBwcm94eV9zZXJ2ZXJfY29uZiAqY29uZiA9Ci0gICAgKHByb3h5X3NlcnZlcl9jb25mICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHNjb25mLCAmcHJveHlfbW9kdWxlKTsKLSAgICBzdHJ1Y3Qgbm9wcm94eV9lbnRyeSAqbnBlbnQgPSAoc3RydWN0IG5vcHJveHlfZW50cnkgKikgY29uZi0+bm9wcm94aWVzLT5lbHRzOwotICAgIHN0cnVjdCBub2NhY2hlX2VudHJ5ICpuY2VudCA9IChzdHJ1Y3Qgbm9jYWNoZV9lbnRyeSAqKSBjb25mLT5ub2NhY2hlcy0+ZWx0czsKLQotLyogc3R1ZmYgZm9yIFBBU1YgbW9kZSAqLwotICAgIHVuc2lnbmVkIGludCBwcmVzdWx0LCBoMCwgaDEsIGgyLCBoMywgcDAsIHAxOwotICAgIHVuc2lnbmVkIGludCBwYWRkcjsKLSAgICB1bnNpZ25lZCBzaG9ydCBwcG9ydDsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gZGF0YV9hZGRyOwotICAgIGludCBwYXN2bW9kZSA9IDA7Ci0gICAgY2hhciBwYXN2WzY0XTsKLSAgICBjaGFyICpwc3RyOwotCi0vKiBzdHVmZiBmb3IgcmVzcG9uc2VzICovCi0gICAgY2hhciByZXNwW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjaGFyICpzaXplID0gTlVMTDsKLQotLyogd2Ugb25seSBzdXBwb3J0IEdFVCBhbmQgSEVBRCAqLwotCi0gICAgaWYgKHItPm1ldGhvZF9udW1iZXIgIT0gTV9HRVQpCi0JcmV0dXJuIEhUVFBfTk9UX0lNUExFTUVOVEVEOwotCi0vKiBXZSBicmVhayB0aGUgVVJMIGludG8gaG9zdCwgcG9ydCwgcGF0aC1zZWFyY2ggKi8KLQotICAgIGhvc3QgPSByLT5wYXJzZWRfdXJpLmhvc3RuYW1lOwotICAgIHBvcnQgPSAoci0+cGFyc2VkX3VyaS5wb3J0ICE9IDApCi0JICAgID8gci0+cGFyc2VkX3VyaS5wb3J0Ci0JICAgIDogYXBfZGVmYXVsdF9wb3J0X2Zvcl9yZXF1ZXN0KHIpOwotICAgIHBhdGggPSBhcF9wc3RyZHVwKHAsIHItPnBhcnNlZF91cmkucGF0aCk7Ci0gICAgcGF0aCA9IChwYXRoICE9IE5VTEwgJiYgcGF0aFswXSAhPSAnXDAnKSA/ICZwYXRoWzFdIDogIiI7Ci0KLSAgICAvKiBUaGUgIkF1dGhvcml6YXRpb246IiBoZWFkZXIgbXVzdCBiZSBjaGVja2VkIGZpcnN0LgotICAgICAqIFdlIGFsbG93IHRoZSB1c2VyIHRvICJvdmVycmlkZSIgdGhlIFVSTC1jb2RlZCB1c2VyIFsgJiBwYXNzd29yZCBdCi0gICAgICogaW4gdGhlIEJyb3dzZXJzJyBVc2VyJlBhc3N3b3JkIERpYWxvZy4KLSAgICAgKiBOT1RFIHRoYXQgdGhpcyBpcyBvbmx5IG1hcmdpbmFsbHkgbW9yZSBzZWN1cmUgdGhhbiBoYXZpbmcgdGhlCi0gICAgICogcGFzc3dvcmQgdHJhdmVsIGluIHBsYWluIGFzIHBhcnQgb2YgdGhlIFVSTCwgYmVjYXVzZSBCYXNpYyBBdXRoCi0gICAgICogc2ltcGx5IHV1ZW5jb2RlcyB0aGUgcGxhaW4gdGV4dCBwYXNzd29yZC4gCi0gICAgICogQnV0IGNoYW5jZXMgYXJlIHN0aWxsIHNtYWxsZXIgdGhhdCB0aGUgVVJMIGlzIGxvZ2dlZCByZWd1bGFybHkuCi0gICAgICovCi0gICAgaWYgKChwYXNzd29yZCA9IGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiQXV0aG9yaXphdGlvbiIpKSAhPSBOVUxMCi0JJiYgc3RyY2FzZWNtcChhcF9nZXR3b3JkKHItPnBvb2wsICZwYXNzd29yZCwgJyAnKSwgIkJhc2ljIikgPT0gMAotCSYmIChwYXNzd29yZCA9IGFwX3BiYXNlNjRkZWNvZGUoci0+cG9vbCwgcGFzc3dvcmQpKVswXSAhPSAnOicpIHsKLQkvKiBOb3RlIHRoYXQgdGhpcyBhbGxvY2F0aW9uIGhhcyB0byBiZSBtYWRlIGZyb20gci0+Y29ubmVjdGlvbi0+cG9vbAotCSAqIGJlY2F1c2UgaXQgaGFzIHRoZSBsaWZldGltZSBvZiB0aGUgY29ubmVjdGlvbi4gIFRoZSBvdGhlciBhbGxvY2F0aW9ucwotCSAqIGFyZSB0ZW1wb3JhcnkgYW5kIGNhbiBiZSB0b3NzZWQgYXdheSBhbnkgdGltZS4KLQkgKi8KLQl1c2VyID0gYXBfZ2V0d29yZF9udWxscyAoci0+Y29ubmVjdGlvbi0+cG9vbCwgJnBhc3N3b3JkLCAnOicpOwotCXItPmNvbm5lY3Rpb24tPmFwX2F1dGhfdHlwZSA9ICJCYXNpYyI7Ci0Jci0+Y29ubmVjdGlvbi0+dXNlciA9IHItPnBhcnNlZF91cmkudXNlciA9IHVzZXI7Ci0Jbm9jYWNoZSA9IDE7CS8qIFRoaXMgcmVzb3VyY2Ugb25seSBhY2Nlc3NpYmxlIHdpdGggdXNlcm5hbWUvcGFzc3dvcmQgKi8KLSAgICB9Ci0gICAgZWxzZSBpZiAoKHVzZXIgPSByLT5wYXJzZWRfdXJpLnVzZXIpICE9IE5VTEwpIHsKLQl1c2VyID0gYXBfcHN0cmR1cChwLCB1c2VyKTsKLQlkZWNvZGVlbmModXNlcik7Ci0JaWYgKChwYXNzd29yZCA9IHItPnBhcnNlZF91cmkucGFzc3dvcmQpICE9IE5VTEwpIHsKLQkgICAgY2hhciAqdG1wID0gYXBfcHN0cmR1cChwLCBwYXNzd29yZCk7Ci0JICAgIGRlY29kZWVuYyh0bXApOwotCSAgICBwYXNzd29yZCA9IHRtcDsKLQl9Ci0Jbm9jYWNoZSA9IDE7CS8qIFRoaXMgcmVzb3VyY2Ugb25seSBhY2Nlc3NpYmxlIHdpdGggdXNlcm5hbWUvcGFzc3dvcmQgKi8KLSAgICB9Ci0gICAgZWxzZSB7Ci0JdXNlciA9ICJhbm9ueW1vdXMiOwotCXBhc3N3b3JkID0gImFwYWNoZV9wcm94eUAiOwotICAgIH0KLQotLyogY2hlY2sgaWYgUHJveHlCbG9jayBkaXJlY3RpdmUgb24gdGhpcyBob3N0ICovCi0gICAgZGVzdGFkZHIuc19hZGRyID0gYXBfaW5ldF9hZGRyKGhvc3QpOwotICAgIGZvciAoaSA9IDA7IGkgPCBjb25mLT5ub3Byb3hpZXMtPm5lbHRzOyBpKyspIHsKLQlpZiAoKG5wZW50W2ldLm5hbWUgIT0gTlVMTCAmJiBzdHJzdHIoaG9zdCwgbnBlbnRbaV0ubmFtZSkgIT0gTlVMTCkKLQkgICAgfHwgZGVzdGFkZHIuc19hZGRyID09IG5wZW50W2ldLmFkZHIuc19hZGRyIHx8IG5wZW50W2ldLm5hbWVbMF0gPT0gJyonKQotCSAgICByZXR1cm4gYXBfcHJveHllcnJvcihyLCBIVFRQX0ZPUkJJRERFTiwKLQkJCQkgIkNvbm5lY3QgdG8gcmVtb3RlIG1hY2hpbmUgYmxvY2tlZCIpOwotICAgIH0KLQotICAgIEV4cGxhaW4yKCJGVFA6IGNvbm5lY3QgdG8gJXM6JWQiLCBob3N0LCBwb3J0KTsKLQotICAgIHBhcm1zID0gc3RyY2hyKHBhdGgsICc7Jyk7Ci0gICAgaWYgKHBhcm1zICE9IE5VTEwpCi0JKihwYXJtcysrKSA9ICdcMCc7Ci0KLSAgICBtZW1zZXQoJnNlcnZlciwgMCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOwotICAgIHNlcnZlci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLSAgICBzZXJ2ZXIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKLSAgICBlcnIgPSBhcF9wcm94eV9ob3N0MmFkZHIoaG9zdCwgJnNlcnZlcl9ocCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKQotCXJldHVybiBhcF9wcm94eWVycm9yKHIsIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCBlcnIpOwotCi0gICAgc29jayA9IGFwX3Bzb2NrZXQocCwgUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKLSAgICBpZiAoc29jayA9PSAtMSkgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotCQkgICAgICJwcm94eTogZXJyb3IgY3JlYXRpbmcgc29ja2V0Iik7Ci0JcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgIH0KLQotICAgIGlmIChjb25mLT5yZWN2X2J1ZmZlcl9zaXplID4gMAotCSYmIHNldHNvY2tvcHQoc29jaywgU09MX1NPQ0tFVCwgU09fUkNWQlVGLAotCQkgICAgICAgKGNvbnN0IGNoYXIgKikgJmNvbmYtPnJlY3ZfYnVmZmVyX3NpemUsIHNpemVvZihpbnQpKQotCSAgICA9PSAtMSkgewotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgciwKLQkJCSAic2V0c29ja29wdChTT19SQ1ZCVUYpOiBGYWlsZWQgdG8gc2V0IFByb3h5UmVjZWl2ZUJ1ZmZlclNpemUsIHVzaW5nIGRlZmF1bHQiKTsKLSAgICB9Ci0KLSAgICBpZiAoc2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICh2b2lkICopICZvbmUsCi0JCSAgIHNpemVvZihvbmUpKSA9PSAtMSkgewotI2lmbmRlZiBfT1NEX1BPU0lYIC8qIEJTMjAwMCBoYXMgdGhpcyBvcHRpb24gImFsd2F5cyBvbiIgKi8KLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgciwKLQkJICAgICAicHJveHk6IGVycm9yIHNldHRpbmcgcmV1c2VhZGRyIG9wdGlvbjogc2V0c29ja29wdChTT19SRVVTRUFERFIpIik7Ci0JYXBfcGNsb3Nlc29ja2V0KHAsIHNvY2spOwotCXJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSNlbmRpZiAvKl9PU0RfUE9TSVgqLwotICAgIH0KLQotI2lmZGVmIFNJTklYX0RfUkVTT0xWRVJfQlVHCi0gICAgewotCXN0cnVjdCBpbl9hZGRyICppcF9hZGRyID0gKHN0cnVjdCBpbl9hZGRyICopICpzZXJ2ZXJfaHAuaF9hZGRyX2xpc3Q7Ci0KLQlmb3IgKDsgaXBfYWRkci0+c19hZGRyICE9IDA7ICsraXBfYWRkcikgewotCSAgICBtZW1jcHkoJnNlcnZlci5zaW5fYWRkciwgaXBfYWRkciwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7Ci0JICAgIGkgPSBhcF9wcm94eV9kb2Nvbm5lY3Qoc29jaywgJnNlcnZlciwgcik7Ci0JICAgIGlmIChpID09IDApCi0JCWJyZWFrOwotCX0KLSAgICB9Ci0jZWxzZQotICAgIGogPSAwOwotICAgIHdoaWxlIChzZXJ2ZXJfaHAuaF9hZGRyX2xpc3Rbal0gIT0gTlVMTCkgewotCW1lbWNweSgmc2VydmVyLnNpbl9hZGRyLCBzZXJ2ZXJfaHAuaF9hZGRyX2xpc3Rbal0sCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOwotCWkgPSBhcF9wcm94eV9kb2Nvbm5lY3Qoc29jaywgJnNlcnZlciwgcik7Ci0JaWYgKGkgPT0gMCkKLQkgICAgYnJlYWs7Ci0JaisrOwotICAgIH0KLSNlbmRpZgotICAgIGlmIChpID09IC0xKSB7Ci0JYXBfcGNsb3Nlc29ja2V0KHAsIHNvY2spOwotCXJldHVybiBhcF9wcm94eWVycm9yKHIsIEhUVFBfQkFEX0dBVEVXQVksIGFwX3BzdHJjYXQoci0+cG9vbCwKLQkJCQkiQ291bGQgbm90IGNvbm5lY3QgdG8gcmVtb3RlIG1hY2hpbmU6ICIsCi0JCQkJc3RyZXJyb3IoZXJybm8pLCBOVUxMKSk7Ci0gICAgfQotCi0gICAgZiA9IGFwX2JjcmVhdGUocCwgQl9SRFdSIHwgQl9TT0NLRVQpOwotICAgIGFwX2JwdXNoZmQoZiwgc29jaywgc29jayk7Ci0vKiBzaG91bGRuJ3Qgd2UgaW1wbGVtZW50IHRlbG5ldCBjb250cm9sIG9wdGlvbnMgaGVyZT8gKi8KLQotI2lmZGVmIENIQVJTRVRfRUJDRElDCi0gICAgYXBfYnNldGZsYWcoZiwgQl9BU0NJSTJFQkNESUN8Ql9FQkNESUMyQVNDSUksIDEpOwotI2VuZGlmIC8qQ0hBUlNFVF9FQkNESUMqLwotCi0vKiBwb3NzaWJsZSByZXN1bHRzOiAqLwotICAgIC8qIDEyMCBTZXJ2aWNlIHJlYWR5IGluIG5ubiBtaW51dGVzLiAqLwotICAgIC8qIDIyMCBTZXJ2aWNlIHJlYWR5IGZvciBuZXcgdXNlci4gKi8KLSAgICAvKiA0MjEgU2VydmljZSBub3QgYXZhaWxhYmxlLCBjbG9zaW5nIGNvbnRyb2wgY29ubmVjdGlvbi4gKi8KLSAgICBhcF9oYXJkX3RpbWVvdXQoInByb3h5IGZ0cCIsIHIpOwotICAgIGkgPSBmdHBfZ2V0cmNfbXNnKGYsIHJlc3AsIHNpemVvZiByZXNwKTsKLSAgICBFeHBsYWluMSgiRlRQOiByZXR1cm5lZCBzdGF0dXMgJWQiLCBpKTsKLSAgICBpZiAoaSA9PSAtMSkgewotCWFwX2tpbGxfdGltZW91dChyKTsKLQlyZXR1cm4gYXBfcHJveHllcnJvcihyLCBIVFRQX0JBRF9HQVRFV0FZLAotCQkJICAgICAiRXJyb3IgcmVhZGluZyBmcm9tIHJlbW90ZSBzZXJ2ZXIiKTsKLSAgICB9Ci0jaWYgMAotICAgIGlmIChpID09IDEyMCkgewotCWFwX2tpbGxfdGltZW91dChyKTsKLQkvKiBSRkMyMDY4IHN0YXRlczoKLQkgKiAxNC4zOCBSZXRyeS1BZnRlcgotCSAqIAotCSAqICBUaGUgUmV0cnktQWZ0ZXIgcmVzcG9uc2UtaGVhZGVyIGZpZWxkIGNhbiBiZSB1c2VkIHdpdGggYSA1MDMgKFNlcnZpY2UKLQkgKiAgVW5hdmFpbGFibGUpIHJlc3BvbnNlIHRvIGluZGljYXRlIGhvdyBsb25nIHRoZSBzZXJ2aWNlIGlzIGV4cGVjdGVkIHRvCi0JICogIGJlIHVuYXZhaWxhYmxlIHRvIHRoZSByZXF1ZXN0aW5nIGNsaWVudC4gVGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgY2FuCi0JICogIGJlIGVpdGhlciBhbiBIVFRQLWRhdGUgb3IgYW4gaW50ZWdlciBudW1iZXIgb2Ygc2Vjb25kcyAoaW4gZGVjaW1hbCkKLQkgKiAgYWZ0ZXIgdGhlIHRpbWUgb2YgdGhlIHJlc3BvbnNlLgotCSAqICAgICBSZXRyeS1BZnRlciAgPSAiUmV0cnktQWZ0ZXIiICI6IiAoIEhUVFAtZGF0ZSB8IGRlbHRhLXNlY29uZHMgKQotCSAqLwotCWFwX3NldF9oZWFkZXIoIlJldHJ5LUFmdGVyIiwgYXBfcHNwcmludGYocCwgIiV1IiwgNjAqd2FpdF9taW5zKTsKLQlyZXR1cm4gYXBfcHJveHllcnJvcihyLCBIVFRQX1NFUlZJQ0VfVU5BVkFJTEFCTEUsIHJlc3ApOwotICAgIH0KLSNlbmRpZgotICAgIGlmIChpICE9IDIyMCkgewotCWFwX2tpbGxfdGltZW91dChyKTsKLQlyZXR1cm4gYXBfcHJveHllcnJvcihyLCBIVFRQX0JBRF9HQVRFV0FZLCByZXNwKTsKLSAgICB9Ci0KLSAgICBFeHBsYWluMCgiRlRQOiBjb25uZWN0ZWQuIik7Ci0KLSAgICBhcF9idnB1dHMoZiwgIlVTRVIgIiwgdXNlciwgQ1JMRiwgTlVMTCk7Ci0gICAgYXBfYmZsdXNoKGYpOwkJCS8qIGNhcHR1cmUgYW55IGVycm9ycyAqLwotICAgIEV4cGxhaW4xKCJGVFA6IFVTRVIgJXMiLCB1c2VyKTsKLQotLyogcG9zc2libGUgcmVzdWx0czsgMjMwLCAzMzEsIDMzMiwgNDIxLCA1MDAsIDUwMSwgNTMwICovCi0vKiBzdGF0ZXM6IDEgLSBlcnJvciwgMiAtIHN1Y2Nlc3M7IDMgLSBzZW5kIHBhc3N3b3JkLCA0LDUgZmFpbCAqLwotICAgIC8qIDIzMCBVc2VyIGxvZ2dlZCBpbiwgcHJvY2VlZC4gKi8KLSAgICAvKiAzMzEgVXNlciBuYW1lIG9rYXksIG5lZWQgcGFzc3dvcmQuICovCi0gICAgLyogMzMyIE5lZWQgYWNjb3VudCBmb3IgbG9naW4uICovCi0gICAgLyogNDIxIFNlcnZpY2Ugbm90IGF2YWlsYWJsZSwgY2xvc2luZyBjb250cm9sIGNvbm5lY3Rpb24uICovCi0gICAgLyogNTAwIFN5bnRheCBlcnJvciwgY29tbWFuZCB1bnJlY29nbml6ZWQuICovCi0gICAgLyogICAgIChUaGlzIG1heSBpbmNsdWRlIGVycm9ycyBzdWNoIGFzIGNvbW1hbmQgbGluZSB0b28gbG9uZy4pICovCi0gICAgLyogNTAxIFN5bnRheCBlcnJvciBpbiBwYXJhbWV0ZXJzIG9yIGFyZ3VtZW50cy4gKi8KLSAgICAvKiA1MzAgTm90IGxvZ2dlZCBpbi4gKi8KLSAgICBpID0gZnRwX2dldHJjKGYpOwotICAgIEV4cGxhaW4xKCJGVFA6IHJldHVybmVkIHN0YXR1cyAlZCIsIGkpOwotICAgIGlmIChpID09IC0xKSB7Ci0JYXBfa2lsbF90aW1lb3V0KHIpOwotCXJldHVybiBhcF9wcm94eWVycm9yKHIsIEhUVFBfQkFEX0dBVEVXQVksCi0JCQkgICAgICJFcnJvciByZWFkaW5nIGZyb20gcmVtb3RlIHNlcnZlciIpOwotICAgIH0KLSAgICBpZiAoaSA9PSA1MzApIHsKLQlhcF9raWxsX3RpbWVvdXQocik7Ci0JcmV0dXJuIGZ0cF91bmF1dGhvcml6ZWQgKHIsIDEpOwkvKiBsb2cgaXQ6IHVzZXIgbmFtZSBndWVzc2luZyBhdHRlbXB0PyAqLwotICAgIH0KLSAgICBpZiAoaSAhPSAyMzAgJiYgaSAhPSAzMzEpIHsKLQlhcF9raWxsX3RpbWVvdXQocik7Ci0JcmV0dXJuIEhUVFBfQkFEX0dBVEVXQVk7Ci0gICAgfQotCi0gICAgaWYgKGkgPT0gMzMxKSB7CQkvKiBzZW5kIHBhc3N3b3JkICovCi0JaWYgKHBhc3N3b3JkID09IE5VTEwpIHsKLQkgICAgcmV0dXJuIGZ0cF91bmF1dGhvcml6ZWQgKHIsIDApOwotCX0KLQlhcF9idnB1dHMoZiwgIlBBU1MgIiwgcGFzc3dvcmQsIENSTEYsIE5VTEwpOwotCWFwX2JmbHVzaChmKTsKLQlFeHBsYWluMSgiRlRQOiBQQVNTICVzIiwgcGFzc3dvcmQpOwotLyogcG9zc2libGUgcmVzdWx0cyAyMDIsIDIzMCwgMzMyLCA0MjEsIDUwMCwgNTAxLCA1MDMsIDUzMCAqLwotICAgIC8qIDIzMCBVc2VyIGxvZ2dlZCBpbiwgcHJvY2VlZC4gKi8KLSAgICAvKiAzMzIgTmVlZCBhY2NvdW50IGZvciBsb2dpbi4gKi8KLSAgICAvKiA0MjEgU2VydmljZSBub3QgYXZhaWxhYmxlLCBjbG9zaW5nIGNvbnRyb2wgY29ubmVjdGlvbi4gKi8KLSAgICAvKiA1MDAgU3ludGF4IGVycm9yLCBjb21tYW5kIHVucmVjb2duaXplZC4gKi8KLSAgICAvKiA1MDEgU3ludGF4IGVycm9yIGluIHBhcmFtZXRlcnMgb3IgYXJndW1lbnRzLiAqLwotICAgIC8qIDUwMyBCYWQgc2VxdWVuY2Ugb2YgY29tbWFuZHMuICovCi0gICAgLyogNTMwIE5vdCBsb2dnZWQgaW4uICovCi0JaSA9IGZ0cF9nZXRyYyhmKTsKLQlFeHBsYWluMSgiRlRQOiByZXR1cm5lZCBzdGF0dXMgJWQiLCBpKTsKLQlpZiAoaSA9PSAtMSkgewotCSAgICBhcF9raWxsX3RpbWVvdXQocik7Ci0JICAgIHJldHVybiBhcF9wcm94eWVycm9yKHIsIEhUVFBfQkFEX0dBVEVXQVksCi0JCQkJICJFcnJvciByZWFkaW5nIGZyb20gcmVtb3RlIHNlcnZlciIpOwotCX0KLQlpZiAoaSA9PSAzMzIpIHsKLQkgICAgYXBfa2lsbF90aW1lb3V0KHIpOwotCSAgICByZXR1cm4gYXBfcHJveHllcnJvcihyLCBIVFRQX1VOQVVUSE9SSVpFRCwKLQkJCQkgIk5lZWQgYWNjb3VudCBmb3IgbG9naW4iKTsKLQl9Ci0JLyogQEBAIHF1ZXN0aW9uYWJsZSAtLSB3ZSBtaWdodCBhcyB3ZWxsIHJldHVybiBhIDQwMyBGb3JiaWRkZW4gaGVyZSAqLwotCWlmIChpID09IDUzMCkgewotCSAgICBhcF9raWxsX3RpbWVvdXQocik7Ci0JICAgIHJldHVybiBmdHBfdW5hdXRob3JpemVkIChyLCAxKTsgLyogbG9nIGl0OiBwYXNzd2QgZ3Vlc3NpbmcgYXR0ZW1wdD8gKi8KLQl9Ci0JaWYgKGkgIT0gMjMwICYmIGkgIT0gMjAyKSB7Ci0JICAgIGFwX2tpbGxfdGltZW91dChyKTsKLQkgICAgcmV0dXJuIEhUVFBfQkFEX0dBVEVXQVk7Ci0JfQotICAgIH0KLQotLyogc2V0IHRoZSBkaXJlY3RvcnkgKHdhbGsgZGlyZWN0b3J5IGNvbXBvbmVudCBieSBjb21wb25lbnQpOgotICogdGhpcyBpcyB3aGF0IHdlIG11c3QgZG8gaWYgd2UgZG9uJ3Qga25vdyB0aGUgT1MgdHlwZSBvZiB0aGUgcmVtb3RlCi0gKiBtYWNoaW5lCi0gKi8KLSAgICBmb3IgKDs7KSB7Ci0Jc3RycCA9IHN0cmNocihwYXRoLCAnLycpOwotCWlmIChzdHJwID09IE5VTEwpCi0JICAgIGJyZWFrOwotCSpzdHJwID0gJ1wwJzsKLQotCWxlbiA9IGRlY29kZWVuYyhwYXRoKTsKLQlhcF9idnB1dHMoZiwgIkNXRCAiLCBwYXRoLCBDUkxGLCBOVUxMKTsKLQlhcF9iZmx1c2goZik7Ci0JRXhwbGFpbjEoIkZUUDogQ1dEICVzIiwgcGF0aCk7Ci0JKnN0cnAgPSAnLyc7Ci0vKiByZXNwb25zZXM6IDI1MCwgNDIxLCA1MDAsIDUwMSwgNTAyLCA1MzAsIDU1MCAqLwotICAgIC8qIDI1MCBSZXF1ZXN0ZWQgZmlsZSBhY3Rpb24gb2theSwgY29tcGxldGVkLiAqLwotICAgIC8qIDQyMSBTZXJ2aWNlIG5vdCBhdmFpbGFibGUsIGNsb3NpbmcgY29udHJvbCBjb25uZWN0aW9uLiAqLwotICAgIC8qIDUwMCBTeW50YXggZXJyb3IsIGNvbW1hbmQgdW5yZWNvZ25pemVkLiAqLwotICAgIC8qIDUwMSBTeW50YXggZXJyb3IgaW4gcGFyYW1ldGVycyBvciBhcmd1bWVudHMuICovCi0gICAgLyogNTAyIENvbW1hbmQgbm90IGltcGxlbWVudGVkLiAqLwotICAgIC8qIDUzMCBOb3QgbG9nZ2VkIGluLiAqLwotICAgIC8qIDU1MCBSZXF1ZXN0ZWQgYWN0aW9uIG5vdCB0YWtlbi4gKi8KLQlpID0gZnRwX2dldHJjKGYpOwotCUV4cGxhaW4xKCJGVFA6IHJldHVybmVkIHN0YXR1cyAlZCIsIGkpOwotCWlmIChpID09IC0xKSB7Ci0JICAgIGFwX2tpbGxfdGltZW91dChyKTsKLQkgICAgcmV0dXJuIGFwX3Byb3h5ZXJyb3IociwgSFRUUF9CQURfR0FURVdBWSwKLQkJCQkgIkVycm9yIHJlYWRpbmcgZnJvbSByZW1vdGUgc2VydmVyIik7Ci0JfQotCWlmIChpID09IDU1MCkgewotCSAgICBhcF9raWxsX3RpbWVvdXQocik7Ci0JICAgIHJldHVybiBIVFRQX05PVF9GT1VORDsKLQl9Ci0JaWYgKGkgIT0gMjUwKSB7Ci0JICAgIGFwX2tpbGxfdGltZW91dChyKTsKLQkgICAgcmV0dXJuIEhUVFBfQkFEX0dBVEVXQVk7Ci0JfQotCi0JcGF0aCA9IHN0cnAgKyAxOwotICAgIH0KLQotICAgIGlmIChwYXJtcyAhPSBOVUxMICYmIHN0cm5jbXAocGFybXMsICJ0eXBlPSIsIDUpID09IDApIHsKLQlwYXJtcyArPSA1OwotCWlmICgocGFybXNbMF0gIT0gJ2QnICYmIHBhcm1zWzBdICE9ICdhJyAmJiBwYXJtc1swXSAhPSAnaScpIHx8Ci0JICAgIHBhcm1zWzFdICE9ICdcMCcpCi0JICAgIHBhcm1zID0gIiI7Ci0gICAgfQotICAgIGVsc2UKLQlwYXJtcyA9ICIiOwotCi0gICAgLyogY2hhbmdlZCB0byBtYWtlIGJpbmFyeSB0cmFuc2ZlcnMgdGhlIGRlZmF1bHQgKi8KLQotICAgIGlmIChwYXJtc1swXSAhPSAnYScpIHsKLQkvKiBzZXQgdHlwZSB0byBpbWFnZSAqLwotCS8qIFRNIC0gQWRkZWQgXDAxNVwwMTIgdG8gdGhlIGVuZCBvZiBUWVBFIEksIG90aGVyd2lzZSBpdCBoYW5ncyB0aGUKLQkgICBjb25uZWN0aW9uICovCi0JYXBfYnB1dHMoIlRZUEUgSSIgQ1JMRiwgZik7Ci0JYXBfYmZsdXNoKGYpOwotCUV4cGxhaW4wKCJGVFA6IFRZUEUgSSIpOwotLyogcmVzcG9uc2VzOiAyMDAsIDQyMSwgNTAwLCA1MDEsIDUwNCwgNTMwICovCi0gICAgLyogMjAwIENvbW1hbmQgb2theS4gKi8KLSAgICAvKiA0MjEgU2VydmljZSBub3QgYXZhaWxhYmxlLCBjbG9zaW5nIGNvbnRyb2wgY29ubmVjdGlvbi4gKi8KLSAgICAvKiA1MDAgU3ludGF4IGVycm9yLCBjb21tYW5kIHVucmVjb2duaXplZC4gKi8KLSAgICAvKiA1MDEgU3ludGF4IGVycm9yIGluIHBhcmFtZXRlcnMgb3IgYXJndW1lbnRzLiAqLwotICAgIC8qIDUwNCBDb21tYW5kIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhhdCBwYXJhbWV0ZXIuICovCi0gICAgLyogNTMwIE5vdCBsb2dnZWQgaW4uICovCi0JaSA9IGZ0cF9nZXRyYyhmKTsKLQlFeHBsYWluMSgiRlRQOiByZXR1cm5lZCBzdGF0dXMgJWQiLCBpKTsKLQlpZiAoaSA9PSAtMSkgewotCSAgICBhcF9raWxsX3RpbWVvdXQocik7Ci0JICAgIHJldHVybiBhcF9wcm94eWVycm9yKHIsIEhUVFBfQkFEX0dBVEVXQVksCi0JCQkJICJFcnJvciByZWFkaW5nIGZyb20gcmVtb3RlIHNlcnZlciIpOwotCX0KLQlpZiAoaSAhPSAyMDAgJiYgaSAhPSA1MDQpIHsKLQkgICAgYXBfa2lsbF90aW1lb3V0KHIpOwotCSAgICByZXR1cm4gSFRUUF9CQURfR0FURVdBWTsKLQl9Ci0vKiBBbGxvdyBub3QgaW1wbGVtZW50ZWQgKi8KLQlpZiAoaSA9PSA1MDQpCi0JICAgIHBhcm1zWzBdID0gJ1wwJzsKLSAgICB9Ci0KLS8qIHRyeSB0byBzZXQgdXAgUEFTViBkYXRhIGNvbm5lY3Rpb24gZmlyc3QgKi8KLSAgICBkc29jayA9IGFwX3Bzb2NrZXQocCwgUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKLSAgICBpZiAoZHNvY2sgPT0gLTEpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgciwKLQkJICAgICAicHJveHk6IGVycm9yIGNyZWF0aW5nIFBBU1Ygc29ja2V0Iik7Ci0JYXBfYmNsb3NlKGYpOwotCWFwX2tpbGxfdGltZW91dChyKTsKLQlyZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgfQotCi0gICAgaWYgKGNvbmYtPnJlY3ZfYnVmZmVyX3NpemUpIHsKLQlpZiAoc2V0c29ja29wdChkc29jaywgU09MX1NPQ0tFVCwgU09fUkNWQlVGLAotCSAgICAgICAoY29uc3QgY2hhciAqKSAmY29uZi0+cmVjdl9idWZmZXJfc2l6ZSwgc2l6ZW9mKGludCkpID09IC0xKSB7Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotCQkJICJzZXRzb2Nrb3B0KFNPX1JDVkJVRik6IEZhaWxlZCB0byBzZXQgUHJveHlSZWNlaXZlQnVmZmVyU2l6ZSwgdXNpbmcgZGVmYXVsdCIpOwotCX0KLSAgICB9Ci0KLSAgICBhcF9icHV0cygiUEFTViIgQ1JMRiwgZik7Ci0gICAgYXBfYmZsdXNoKGYpOwotICAgIEV4cGxhaW4wKCJGVFA6IFBBU1YgY29tbWFuZCBpc3N1ZWQiKTsKLS8qIHBvc3NpYmxlIHJlc3VsdHM6IDIyNywgNDIxLCA1MDAsIDUwMSwgNTAyLCA1MzAgKi8KLSAgICAvKiAyMjcgRW50ZXJpbmcgUGFzc2l2ZSBNb2RlIChoMSxoMixoMyxoNCxwMSxwMikuICovCi0gICAgLyogNDIxIFNlcnZpY2Ugbm90IGF2YWlsYWJsZSwgY2xvc2luZyBjb250cm9sIGNvbm5lY3Rpb24uICovCi0gICAgLyogNTAwIFN5bnRheCBlcnJvciwgY29tbWFuZCB1bnJlY29nbml6ZWQuICovCi0gICAgLyogNTAxIFN5bnRheCBlcnJvciBpbiBwYXJhbWV0ZXJzIG9yIGFyZ3VtZW50cy4gKi8KLSAgICAvKiA1MDIgQ29tbWFuZCBub3QgaW1wbGVtZW50ZWQuICovCi0gICAgLyogNTMwIE5vdCBsb2dnZWQgaW4uICovCi0gICAgaSA9IGFwX2JnZXRzKHBhc3YsIHNpemVvZihwYXN2KSwgZik7Ci0gICAgaWYgKGkgPT0gLTEpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUnxBUExPR19OT0VSUk5PLCByLAotCQkgICAgICJQQVNWOiBjb250cm9sIGNvbm5lY3Rpb24gaXMgdG9hc3QiKTsKLQlhcF9wY2xvc2Vzb2NrZXQocCwgZHNvY2spOwotCWFwX2JjbG9zZShmKTsKLQlhcF9raWxsX3RpbWVvdXQocik7Ci0JcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgIH0KLSAgICBlbHNlIHsKLQlwYXN2W2kgLSAxXSA9ICdcMCc7Ci0JcHN0ciA9IHN0cnRvayhwYXN2LCAiICIpOwkvKiBzZXBhcmF0ZSByZXN1bHQgY29kZSAqLwotCWlmIChwc3RyICE9IE5VTEwpIHsKLQkgICAgcHJlc3VsdCA9IGF0b2kocHN0cik7Ci0JICAgIGlmICgqKHBzdHIgKyBzdHJsZW4ocHN0cikgKyAxKSA9PSAnPScpCi0JICAgICAgICBwc3RyICs9IHN0cmxlbihwc3RyKSArIDI7Ci0JICAgIGVsc2UKLQkgICAgewotCSAgICAgICAgcHN0ciA9IHN0cnRvayhOVUxMLCAiKCIpOyAgLyogc2VwYXJhdGUgYWRkcmVzcyAmIHBvcnQgcGFyYW1zICovCi0JCWlmIChwc3RyICE9IE5VTEwpCi0JCSAgICBwc3RyID0gc3RydG9rKE5VTEwsICIpIik7Ci0JICAgIH0KLQl9Ci0JZWxzZQotCSAgICBwcmVzdWx0ID0gYXRvaShwYXN2KTsKLQotCUV4cGxhaW4xKCJGVFA6IHJldHVybmVkIHN0YXR1cyAlZCIsIHByZXN1bHQpOwotCi0JaWYgKHByZXN1bHQgPT0gMjI3ICYmIHBzdHIgIT0gTlVMTCAmJiAoc3NjYW5mKHBzdHIsCi0JCSAiJWQsJWQsJWQsJWQsJWQsJWQiLCAmaDMsICZoMiwgJmgxLCAmaDAsICZwMSwgJnAwKSA9PSA2KSkgewotCSAgICAvKiBwYXJkb24gdGhlIHBhcmVucywgYnV0IGl0IG1ha2VzIGdjYyBoYXBweSAqLwotCSAgICBwYWRkciA9ICgoKCgoaDMgPDwgOCkgKyBoMikgPDwgOCkgKyBoMSkgPDwgOCkgKyBoMDsKLQkgICAgcHBvcnQgPSAocDEgPDwgOCkgKyBwMDsKLQkgICAgRXhwbGFpbjUoIkZUUDogY29udGFjdGluZyBob3N0ICVkLiVkLiVkLiVkOiVkIiwKLQkJICAgICBoMywgaDIsIGgxLCBoMCwgcHBvcnQpOwotCSAgICBkYXRhX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0JICAgIGRhdGFfYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChwYWRkcik7Ci0JICAgIGRhdGFfYWRkci5zaW5fcG9ydCA9IGh0b25zKHBwb3J0KTsKLQkgICAgaSA9IGFwX3Byb3h5X2RvY29ubmVjdChkc29jaywgJmRhdGFfYWRkciwgcik7Ci0KLQkgICAgaWYgKGkgPT0gLTEpIHsKLQkJYXBfa2lsbF90aW1lb3V0KHIpOwotCQlyZXR1cm4gYXBfcHJveHllcnJvcihyLCBIVFRQX0JBRF9HQVRFV0FZLAotCQkJCSAgICAgYXBfcHN0cmNhdChyLT5wb29sLAotCQkJCQkJIkNvdWxkIG5vdCBjb25uZWN0IHRvIHJlbW90ZSBtYWNoaW5lOiAiLAotCQkJCQkJc3RyZXJyb3IoZXJybm8pLCBOVUxMKSk7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCXBhc3Ztb2RlID0gMTsKLQkgICAgfQotCX0KLQllbHNlCi0JICAgIGFwX3BjbG9zZXNvY2tldChwLCBkc29jayk7CS8qIGFuZCB0cnkgdGhlIHJlZ3VsYXIgd2F5ICovCi0gICAgfQotCi0gICAgaWYgKCFwYXN2bW9kZSkgewkJLyogc2V0IHVwIGRhdGEgY29ubmVjdGlvbiAqLwotCWNsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKLQlpZiAoZ2V0c29ja25hbWUoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2VydmVyLCAmY2xlbikgPCAwKSB7Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotCQkJICJwcm94eTogZXJyb3IgZ2V0dGluZyBzb2NrZXQgYWRkcmVzcyIpOwotCSAgICBhcF9iY2xvc2UoZik7Ci0JICAgIGFwX2tpbGxfdGltZW91dChyKTsKLQkgICAgcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotCX0KLQotCWRzb2NrID0gYXBfcHNvY2tldChwLCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOwotCWlmIChkc29jayA9PSAtMSkgewotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgciwKLQkJCSAicHJveHk6IGVycm9yIGNyZWF0aW5nIHNvY2tldCIpOwotCSAgICBhcF9iY2xvc2UoZik7Ci0JICAgIGFwX2tpbGxfdGltZW91dChyKTsKLQkgICAgcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotCX0KLQotCWlmIChzZXRzb2Nrb3B0KGRzb2NrLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICh2b2lkICopICZvbmUsCi0JCSAgICAgICBzaXplb2Yob25lKSkgPT0gLTEpIHsKLSNpZm5kZWYgX09TRF9QT1NJWCAvKiBCUzIwMDAgaGFzIHRoaXMgb3B0aW9uICJhbHdheXMgb24iICovCi0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotCQkJICJwcm94eTogZXJyb3Igc2V0dGluZyByZXVzZWFkZHIgb3B0aW9uIik7Ci0JICAgIGFwX3BjbG9zZXNvY2tldChwLCBkc29jayk7Ci0JICAgIGFwX2JjbG9zZShmKTsKLQkgICAgYXBfa2lsbF90aW1lb3V0KHIpOwotCSAgICByZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0jZW5kaWYgLypfT1NEX1BPU0lYKi8KLQl9Ci0KLQlpZiAoYmluZChkc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2VydmVyLAotCQkgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpID09IC0xKSB7Ci0JICAgIGNoYXIgYnVmZlsyMl07Ci0KLQkgICAgYXBfc25wcmludGYoYnVmZiwgc2l6ZW9mKGJ1ZmYpLCAiJXM6JWQiLCBpbmV0X250b2Eoc2VydmVyLnNpbl9hZGRyKSwgc2VydmVyLnNpbl9wb3J0KTsKLQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsCi0JCQkgInByb3h5OiBlcnJvciBiaW5kaW5nIHRvIGZ0cCBkYXRhIHNvY2tldCAlcyIsIGJ1ZmYpOwotCSAgICBhcF9iY2xvc2UoZik7Ci0JICAgIGFwX3BjbG9zZXNvY2tldChwLCBkc29jayk7Ci0JICAgIHJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLQl9Ci0JbGlzdGVuKGRzb2NrLCAyKTsJLyogb25seSBuZWVkIGEgc2hvcnQgcXVldWUgKi8KLSAgICB9Ci0KLS8qIHNldCByZXF1ZXN0OyAicGF0aCIgaG9sZHMgbGFzdCBwYXRoIGNvbXBvbmVudCAqLwotICAgIGxlbiA9IGRlY29kZWVuYyhwYXRoKTsKLQotICAgIC8qIFRNIC0gaWYgbGVuID09IDAgdGhlbiBpdCBtdXN0IGJlIGEgZGlyZWN0b3J5ICh5b3UgY2FuJ3QgUkVUUiBub3RoaW5nKSAqLwotCi0gICAgaWYgKGxlbiA9PSAwKSB7Ci0JcGFybXMgPSAiZCI7Ci0gICAgfQotICAgIGVsc2UgewotCWFwX2J2cHV0cyhmLCAiU0laRSAiLCBwYXRoLCBDUkxGLCBOVUxMKTsKLQlhcF9iZmx1c2goZik7Ci0JRXhwbGFpbjEoIkZUUDogU0laRSAlcyIsIHBhdGgpOwotCWkgPSBmdHBfZ2V0cmNfbXNnKGYsIHJlc3AsIHNpemVvZiByZXNwKTsKLQlFeHBsYWluMigiRlRQOiByZXR1cm5lZCBzdGF0dXMgJWQgd2l0aCByZXNwb25zZSAlcyIsIGksIHJlc3ApOwotCWlmIChpICE9IDUwMCkgewkJLyogU2l6ZSBjb21tYW5kIG5vdCByZWNvZ25pemVkICovCi0JICAgIGlmIChpID09IDU1MCkgewkvKiBOb3QgYSByZWd1bGFyIGZpbGUgKi8KLQkJRXhwbGFpbjAoIkZUUDogU0laRSBzaG93cyB0aGlzIGlzIGEgZGlyZWN0b3J5Iik7Ci0JCXBhcm1zID0gImQiOwotCQlhcF9idnB1dHMoZiwgIkNXRCAiLCBwYXRoLCBDUkxGLCBOVUxMKTsKLQkJYXBfYmZsdXNoKGYpOwotCQlFeHBsYWluMSgiRlRQOiBDV0QgJXMiLCBwYXRoKTsKLQkJaSA9IGZ0cF9nZXRyYyhmKTsKLQkJLyogcG9zc2libGUgcmVzdWx0czogMjUwLCA0MjEsIDUwMCwgNTAxLCA1MDIsIDUzMCwgNTUwICovCi0JCS8qIDI1MCBSZXF1ZXN0ZWQgZmlsZSBhY3Rpb24gb2theSwgY29tcGxldGVkLiAqLwotCQkvKiA0MjEgU2VydmljZSBub3QgYXZhaWxhYmxlLCBjbG9zaW5nIGNvbnRyb2wgY29ubmVjdGlvbi4gKi8KLQkJLyogNTAwIFN5bnRheCBlcnJvciwgY29tbWFuZCB1bnJlY29nbml6ZWQuICovCi0JCS8qIDUwMSBTeW50YXggZXJyb3IgaW4gcGFyYW1ldGVycyBvciBhcmd1bWVudHMuICovCi0JCS8qIDUwMiBDb21tYW5kIG5vdCBpbXBsZW1lbnRlZC4gKi8KLQkJLyogNTMwIE5vdCBsb2dnZWQgaW4uICovCi0JCS8qIDU1MCBSZXF1ZXN0ZWQgYWN0aW9uIG5vdCB0YWtlbi4gKi8KLQkJRXhwbGFpbjEoIkZUUDogcmV0dXJuZWQgc3RhdHVzICVkIiwgaSk7Ci0JCWlmIChpID09IC0xKSB7Ci0JCSAgICBhcF9raWxsX3RpbWVvdXQocik7Ci0JCSAgICByZXR1cm4gYXBfcHJveHllcnJvcihyLCBIVFRQX0JBRF9HQVRFV0FZLAotCQkJCQkgIkVycm9yIHJlYWRpbmcgZnJvbSByZW1vdGUgc2VydmVyIik7Ci0JCX0KLQkJaWYgKGkgPT0gNTUwKSB7Ci0JCSAgICBhcF9raWxsX3RpbWVvdXQocik7Ci0JCSAgICByZXR1cm4gSFRUUF9OT1RfRk9VTkQ7Ci0JCX0KLQkJaWYgKGkgIT0gMjUwKSB7Ci0JCSAgICBhcF9raWxsX3RpbWVvdXQocik7Ci0JCSAgICByZXR1cm4gSFRUUF9CQURfR0FURVdBWTsKLQkJfQotCQlwYXRoID0gIiI7Ci0JCWxlbiA9IDA7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoaSA9PSAyMTMpIHsgLyogU2l6ZSBjb21tYW5kIG9rICovCi0JCWZvciAoaiA9IDA7IGogPCBzaXplb2YgcmVzcCAmJiBhcF9pc2RpZ2l0KHJlc3Bbal0pOyBqKyspCi0JCQk7Ci0JCXJlc3Bbal0gPSAnXDAnOwotCQlpZiAocmVzcFswXSAhPSAnXDAnKQotCQkgICAgc2l6ZSA9IGFwX3BzdHJkdXAocCwgcmVzcCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0jaWZkZWYgQVVUT0RFVEVDVF9QV0QKLSAgICBhcF9idnB1dHMoZiwgIlBXRCIsIENSTEYsIE5VTEwpOwotICAgIGFwX2JmbHVzaChmKTsKLSAgICBFeHBsYWluMCgiRlRQOiBQV0QiKTsKLS8qIHJlc3BvbnNlczogMjU3LCA1MDAsIDUwMSwgNTAyLCA0MjEsIDU1MCAqLwotICAgIC8qIDI1NyAiPGRpcmVjdG9yeS1uYW1lPiIgPGNvbW1lbnRhcnk+ICovCi0gICAgLyogNDIxIFNlcnZpY2Ugbm90IGF2YWlsYWJsZSwgY2xvc2luZyBjb250cm9sIGNvbm5lY3Rpb24uICovCi0gICAgLyogNTAwIFN5bnRheCBlcnJvciwgY29tbWFuZCB1bnJlY29nbml6ZWQuICovCi0gICAgLyogNTAxIFN5bnRheCBlcnJvciBpbiBwYXJhbWV0ZXJzIG9yIGFyZ3VtZW50cy4gKi8KLSAgICAvKiA1MDIgQ29tbWFuZCBub3QgaW1wbGVtZW50ZWQuICovCi0gICAgLyogNTUwIFJlcXVlc3RlZCBhY3Rpb24gbm90IHRha2VuLiAqLwotICAgIGkgPSBmdHBfZ2V0cmNfbXNnKGYsIHJlc3AsIHNpemVvZiByZXNwKTsKLSAgICBFeHBsYWluMSgiRlRQOiBQV0QgcmV0dXJuZWQgc3RhdHVzICVkIiwgaSk7Ci0gICAgaWYgKGkgPT0gLTEgfHwgaSA9PSA0MjEpIHsKLQlhcF9raWxsX3RpbWVvdXQocik7Ci0JcmV0dXJuIGFwX3Byb3h5ZXJyb3IociwgSFRUUF9CQURfR0FURVdBWSwKLQkJCSAgICAgIkVycm9yIHJlYWRpbmcgZnJvbSByZW1vdGUgc2VydmVyIik7Ci0gICAgfQotICAgIGlmIChpID09IDU1MCkgewotCWFwX2tpbGxfdGltZW91dChyKTsKLQlyZXR1cm4gSFRUUF9OT1RfRk9VTkQ7Ci0gICAgfQotICAgIGlmIChpID09IDI1NykgewotCWNvbnN0IGNoYXIgKmRpcnAgPSByZXNwOwotCWN3ZCA9IGFwX2dldHdvcmRfY29uZihyLT5wb29sLCAmZGlycCk7Ci0gICAgfQotI2VuZGlmIC8qQVVUT0RFVEVDVF9QV0QqLwotCi0gICAgaWYgKHBhcm1zWzBdID09ICdkJykgewotCWlmIChsZW4gIT0gMCkKLQkgICAgYXBfYnZwdXRzKGYsICJMSVNUICIsIHBhdGgsIENSTEYsIE5VTEwpOwotCWVsc2UKLQkgICAgYXBfYnB1dHMoIkxJU1QgLWxhZyIgQ1JMRiwgZik7Ci0JRXhwbGFpbjEoIkZUUDogTElTVCAlcyIsIChsZW4gPT0gMCA/ICIiIDogcGF0aCkpOwotICAgIH0KLSAgICBlbHNlIHsKLQlhcF9idnB1dHMoZiwgIlJFVFIgIiwgcGF0aCwgQ1JMRiwgTlVMTCk7Ci0JRXhwbGFpbjEoIkZUUDogUkVUUiAlcyIsIHBhdGgpOwotICAgIH0KLSAgICBhcF9iZmx1c2goZik7Ci0vKiBSRVRSOiAxMTAsIDEyNSwgMTUwLCAyMjYsIDI1MCwgNDIxLCA0MjUsIDQyNiwgNDUwLCA0NTEsIDUwMCwgNTAxLCA1MzAsIDU1MAotICAgTkxTVDogMTI1LCAxNTAsIDIyNiwgMjUwLCA0MjEsIDQyNSwgNDI2LCA0NTAsIDQ1MSwgNTAwLCA1MDEsIDUwMiwgNTMwICovCi0gICAgLyogMTEwIFJlc3RhcnQgbWFya2VyIHJlcGx5LiAqLwotICAgIC8qIDEyNSBEYXRhIGNvbm5lY3Rpb24gYWxyZWFkeSBvcGVuOyB0cmFuc2ZlciBzdGFydGluZy4gKi8KLSAgICAvKiAxNTAgRmlsZSBzdGF0dXMgb2theTsgYWJvdXQgdG8gb3BlbiBkYXRhIGNvbm5lY3Rpb24uICovCi0gICAgLyogMjI2IENsb3NpbmcgZGF0YSBjb25uZWN0aW9uLiAqLwotICAgIC8qIDI1MCBSZXF1ZXN0ZWQgZmlsZSBhY3Rpb24gb2theSwgY29tcGxldGVkLiAqLwotICAgIC8qIDQyMSBTZXJ2aWNlIG5vdCBhdmFpbGFibGUsIGNsb3NpbmcgY29udHJvbCBjb25uZWN0aW9uLiAqLwotICAgIC8qIDQyNSBDYW4ndCBvcGVuIGRhdGEgY29ubmVjdGlvbi4gKi8KLSAgICAvKiA0MjYgQ29ubmVjdGlvbiBjbG9zZWQ7IHRyYW5zZmVyIGFib3J0ZWQuICovCi0gICAgLyogNDUwIFJlcXVlc3RlZCBmaWxlIGFjdGlvbiBub3QgdGFrZW4uICovCi0gICAgLyogNDUxIFJlcXVlc3RlZCBhY3Rpb24gYWJvcnRlZC4gTG9jYWwgZXJyb3IgaW4gcHJvY2Vzc2luZy4gKi8KLSAgICAvKiA1MDAgU3ludGF4IGVycm9yLCBjb21tYW5kIHVucmVjb2duaXplZC4gKi8KLSAgICAvKiA1MDEgU3ludGF4IGVycm9yIGluIHBhcmFtZXRlcnMgb3IgYXJndW1lbnRzLiAqLwotICAgIC8qIDUzMCBOb3QgbG9nZ2VkIGluLiAqLwotICAgIC8qIDU1MCBSZXF1ZXN0ZWQgYWN0aW9uIG5vdCB0YWtlbi4gKi8KLSAgICByYyA9IGZ0cF9nZXRyYyhmKTsKLSAgICBFeHBsYWluMSgiRlRQOiByZXR1cm5lZCBzdGF0dXMgJWQiLCByYyk7Ci0gICAgaWYgKHJjID09IC0xKSB7Ci0JYXBfa2lsbF90aW1lb3V0KHIpOwotCXJldHVybiBhcF9wcm94eWVycm9yKHIsIEhUVFBfQkFEX0dBVEVXQVksCi0JCQkgICAgICJFcnJvciByZWFkaW5nIGZyb20gcmVtb3RlIHNlcnZlciIpOwotICAgIH0KLSAgICBpZiAocmMgPT0gNTUwKSB7Ci0JRXhwbGFpbjAoIkZUUDogUkVUUiBmYWlsZWQsIHRyeWluZyBMSVNUIGluc3RlYWQiKTsKLQlwYXJtcyA9ICJkIjsKLQlhcF9idnB1dHMoZiwgIkNXRCAiLCBwYXRoLCBDUkxGLCBOVUxMKTsKLQlhcF9iZmx1c2goZik7Ci0JRXhwbGFpbjEoIkZUUDogQ1dEICVzIiwgcGF0aCk7Ci0JLyogcG9zc2libGUgcmVzdWx0czogMjUwLCA0MjEsIDUwMCwgNTAxLCA1MDIsIDUzMCwgNTUwICovCi0JLyogMjUwIFJlcXVlc3RlZCBmaWxlIGFjdGlvbiBva2F5LCBjb21wbGV0ZWQuICovCi0JLyogNDIxIFNlcnZpY2Ugbm90IGF2YWlsYWJsZSwgY2xvc2luZyBjb250cm9sIGNvbm5lY3Rpb24uICovCi0JLyogNTAwIFN5bnRheCBlcnJvciwgY29tbWFuZCB1bnJlY29nbml6ZWQuICovCi0JLyogNTAxIFN5bnRheCBlcnJvciBpbiBwYXJhbWV0ZXJzIG9yIGFyZ3VtZW50cy4gKi8KLQkvKiA1MDIgQ29tbWFuZCBub3QgaW1wbGVtZW50ZWQuICovCi0JLyogNTMwIE5vdCBsb2dnZWQgaW4uICovCi0JLyogNTUwIFJlcXVlc3RlZCBhY3Rpb24gbm90IHRha2VuLiAqLwotCXJjID0gZnRwX2dldHJjKGYpOwotCUV4cGxhaW4xKCJGVFA6IHJldHVybmVkIHN0YXR1cyAlZCIsIHJjKTsKLQlpZiAocmMgPT0gLTEpIHsKLQkgICAgYXBfa2lsbF90aW1lb3V0KHIpOwotCSAgICByZXR1cm4gYXBfcHJveHllcnJvcihyLCBIVFRQX0JBRF9HQVRFV0FZLAotCQkJCSAiRXJyb3IgcmVhZGluZyBmcm9tIHJlbW90ZSBzZXJ2ZXIiKTsKLQl9Ci0JaWYgKHJjID09IDU1MCkgewotCSAgICBhcF9raWxsX3RpbWVvdXQocik7Ci0JICAgIHJldHVybiBIVFRQX05PVF9GT1VORDsKLQl9Ci0JaWYgKHJjICE9IDI1MCkgewotCSAgICBhcF9raWxsX3RpbWVvdXQocik7Ci0JICAgIHJldHVybiBIVFRQX0JBRF9HQVRFV0FZOwotCX0KLQotI2lmZGVmIEFVVE9ERVRFQ1RfUFdECi0JYXBfYnZwdXRzKGYsICJQV0QiLCBDUkxGLCBOVUxMKTsKLQlhcF9iZmx1c2goZik7Ci0JRXhwbGFpbjAoIkZUUDogUFdEIik7Ci0vKiByZXNwb25zZXM6IDI1NywgNTAwLCA1MDEsIDUwMiwgNDIxLCA1NTAgKi8KLQkvKiAyNTcgIjxkaXJlY3RvcnktbmFtZT4iIDxjb21tZW50YXJ5PiAqLwotCS8qIDQyMSBTZXJ2aWNlIG5vdCBhdmFpbGFibGUsIGNsb3NpbmcgY29udHJvbCBjb25uZWN0aW9uLiAqLwotCS8qIDUwMCBTeW50YXggZXJyb3IsIGNvbW1hbmQgdW5yZWNvZ25pemVkLiAqLwotCS8qIDUwMSBTeW50YXggZXJyb3IgaW4gcGFyYW1ldGVycyBvciBhcmd1bWVudHMuICovCi0JLyogNTAyIENvbW1hbmQgbm90IGltcGxlbWVudGVkLiAqLwotCS8qIDU1MCBSZXF1ZXN0ZWQgYWN0aW9uIG5vdCB0YWtlbi4gKi8KLQlpID0gZnRwX2dldHJjX21zZyhmLCByZXNwLCBzaXplb2YgcmVzcCk7Ci0JRXhwbGFpbjEoIkZUUDogUFdEIHJldHVybmVkIHN0YXR1cyAlZCIsIGkpOwotCWlmIChpID09IC0xIHx8IGkgPT0gNDIxKSB7Ci0JICAgIGFwX2tpbGxfdGltZW91dChyKTsKLQkgICAgcmV0dXJuIGFwX3Byb3h5ZXJyb3IociwgSFRUUF9CQURfR0FURVdBWSwKLQkJCQkgIkVycm9yIHJlYWRpbmcgZnJvbSByZW1vdGUgc2VydmVyIik7Ci0JfQotCWlmIChpID09IDU1MCkgewotCSAgICBhcF9raWxsX3RpbWVvdXQocik7Ci0JICAgIHJldHVybiBIVFRQX05PVF9GT1VORDsKLQl9Ci0JaWYgKGkgPT0gMjU3KSB7Ci0JICAgIGNvbnN0IGNoYXIgKmRpcnAgPSByZXNwOwotCSAgICBjd2QgPSBhcF9nZXR3b3JkX2NvbmYoci0+cG9vbCwgJmRpcnApOwotCX0KLSNlbmRpZiAvKkFVVE9ERVRFQ1RfUFdEKi8KLQotCWFwX2JwdXRzKCJMSVNUIC1sYWciIENSTEYsIGYpOwotCWFwX2JmbHVzaChmKTsKLQlFeHBsYWluMCgiRlRQOiBMSVNUIC1sYWciKTsKLQlyYyA9IGZ0cF9nZXRyYyhmKTsKLQlFeHBsYWluMSgiRlRQOiByZXR1cm5lZCBzdGF0dXMgJWQiLCByYyk7Ci0JaWYgKHJjID09IC0xKQotCSAgICByZXR1cm4gYXBfcHJveHllcnJvcihyLCBIVFRQX0JBRF9HQVRFV0FZLAotCQkJCSAiRXJyb3IgcmVhZGluZyBmcm9tIHJlbW90ZSBzZXJ2ZXIiKTsKLSAgICB9Ci0gICAgYXBfa2lsbF90aW1lb3V0KHIpOwotICAgIGlmIChyYyAhPSAxMjUgJiYgcmMgIT0gMTUwICYmIHJjICE9IDIyNiAmJiByYyAhPSAyNTApCi0JcmV0dXJuIEhUVFBfQkFEX0dBVEVXQVk7Ci0KLSAgICByLT5zdGF0dXMgPSBIVFRQX09LOwotICAgIHItPnN0YXR1c19saW5lID0gIjIwMCBPSyI7Ci0KLSAgICByZXNwX2hkcnMgPSBhcF9tYWtlX3RhYmxlKHAsIDIpOwotICAgIGMtPmhkcnMgPSByZXNwX2hkcnM7Ci0KLSAgICBhcF90YWJsZV9zZXRuKHJlc3BfaGRycywgIkRhdGUiLCBhcF9nbV90aW1lc3RyXzgyMihyLT5wb29sLCByLT5yZXF1ZXN0X3RpbWUpKTsKLSAgICBhcF90YWJsZV9zZXRuKHJlc3BfaGRycywgIlNlcnZlciIsIGFwX2dldF9zZXJ2ZXJfdmVyc2lvbigpKTsKLQotICAgIGlmIChwYXJtc1swXSA9PSAnZCcpCi0JYXBfdGFibGVfc2V0bihyZXNwX2hkcnMsICJDb250ZW50LVR5cGUiLCAidGV4dC9odG1sIik7Ci0gICAgZWxzZSB7Ci0JaWYgKHItPmNvbnRlbnRfdHlwZSAhPSBOVUxMKSB7Ci0JICAgIGFwX3RhYmxlX3NldG4ocmVzcF9oZHJzLCAiQ29udGVudC1UeXBlIiwgci0+Y29udGVudF90eXBlKTsKLQkgICAgRXhwbGFpbjEoIkZUUDogQ29udGVudC1UeXBlIHNldCB0byAlcyIsIHItPmNvbnRlbnRfdHlwZSk7Ci0JfQotCWVsc2UgewotCSAgICBhcF90YWJsZV9zZXRuKHJlc3BfaGRycywgIkNvbnRlbnQtVHlwZSIsIGFwX2RlZmF1bHRfdHlwZShyKSk7Ci0JfQotCWlmIChwYXJtc1swXSAhPSAnYScgJiYgc2l6ZSAhPSBOVUxMKSB7Ci0JICAgIC8qIFdlICJ0cnVzdCIgdGhlIGZ0cCBzZXJ2ZXIgdG8gcmVhbGx5IHNlcnZlIChzaXplKSBieXRlcy4uLiAqLwotCSAgICBhcF90YWJsZV9zZXQocmVzcF9oZHJzLCAiQ29udGVudC1MZW5ndGgiLCBzaXplKTsKLQkgICAgRXhwbGFpbjEoIkZUUDogQ29udGVudC1MZW5ndGggc2V0IHRvICVzIiwgc2l6ZSk7Ci0JfQotICAgIH0KLSAgICBpZiAoci0+Y29udGVudF9lbmNvZGluZyAhPSBOVUxMICYmIHItPmNvbnRlbnRfZW5jb2RpbmdbMF0gIT0gJ1wwJykgewotCUV4cGxhaW4xKCJGVFA6IENvbnRlbnQtRW5jb2Rpbmcgc2V0IHRvICVzIiwgci0+Y29udGVudF9lbmNvZGluZyk7Ci0JYXBfdGFibGVfc2V0bihyZXNwX2hkcnMsICJDb250ZW50LUVuY29kaW5nIiwgci0+Y29udGVudF9lbmNvZGluZyk7Ci0gICAgfQotCi0vKiBjaGVjayBpZiBOb0NhY2hlIGRpcmVjdGl2ZSBvbiB0aGlzIGhvc3QgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgY29uZi0+bm9jYWNoZXMtPm5lbHRzOyBpKyspIHsKLQlpZiAoKG5jZW50W2ldLm5hbWUgIT0gTlVMTCAmJiBzdHJzdHIoaG9zdCwgbmNlbnRbaV0ubmFtZSkgIT0gTlVMTCkKLQkgICAgfHwgZGVzdGFkZHIuc19hZGRyID09IG5jZW50W2ldLmFkZHIuc19hZGRyIHx8IG5jZW50W2ldLm5hbWVbMF0gPT0gJyonKQotCSAgICBub2NhY2hlID0gMTsKLSAgICB9Ci0KLSAgICBpID0gYXBfcHJveHlfY2FjaGVfdXBkYXRlKGMsIHJlc3BfaGRycywgMCwgbm9jYWNoZSk7Ci0KLSAgICBpZiAoaSAhPSBERUNMSU5FRCkgewotCWFwX3BjbG9zZXNvY2tldChwLCBkc29jayk7Ci0JYXBfYmNsb3NlKGYpOwotCXJldHVybiBpOwotICAgIH0KLQotICAgIGlmICghcGFzdm1vZGUpIHsJCS8qIHdhaXQgZm9yIGNvbm5lY3Rpb24gKi8KLQlhcF9oYXJkX3RpbWVvdXQoInByb3h5IGZ0cCBkYXRhIGNvbm5lY3QiLCByKTsKLQljbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7Ci0JZG8KLQkgICAgY3NkID0gYWNjZXB0KGRzb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZzZXJ2ZXIsICZjbGVuKTsKLQl3aGlsZSAoY3NkID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKLQlpZiAoY3NkID09IC0xKSB7Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotCQkJICJwcm94eTogZmFpbGVkIHRvIGFjY2VwdCBkYXRhIGNvbm5lY3Rpb24iKTsKLQkgICAgYXBfcGNsb3Nlc29ja2V0KHAsIGRzb2NrKTsKLQkgICAgYXBfYmNsb3NlKGYpOwotCSAgICBhcF9raWxsX3RpbWVvdXQocik7Ci0JICAgIGlmIChjICE9IE5VTEwpCi0JCWMgPSBhcF9wcm94eV9jYWNoZV9lcnJvcihjKTsKLQkgICAgcmV0dXJuIEhUVFBfQkFEX0dBVEVXQVk7Ci0JfQotCWFwX25vdGVfY2xlYW51cHNfZm9yX3NvY2tldChwLCBjc2QpOwotCWRhdGEgPSBhcF9iY3JlYXRlKHAsIEJfUkRXUiB8IEJfU09DS0VUKTsKLQlhcF9icHVzaGZkKGRhdGEsIGNzZCwgLTEpOwotCWFwX2tpbGxfdGltZW91dChyKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JZGF0YSA9IGFwX2JjcmVhdGUocCwgQl9SRFdSIHwgQl9TT0NLRVQpOwotCWFwX2JwdXNoZmQoZGF0YSwgZHNvY2ssIGRzb2NrKTsKLSAgICB9Ci0KLSAgICBhcF9oYXJkX3RpbWVvdXQoInByb3h5IHJlY2VpdmUiLCByKTsKLS8qIHNlbmQgcmVzcG9uc2UgKi8KLS8qIHdyaXRlIHN0YXR1cyBsaW5lICovCi0gICAgaWYgKCFyLT5hc3NiYWNrd2FyZHMpCi0JYXBfcnZwdXRzKHIsICJIVFRQLzEuMCAiLCByLT5zdGF0dXNfbGluZSwgQ1JMRiwgTlVMTCk7Ci0gICAgaWYgKGMgIT0gTlVMTCAmJiBjLT5mcCAhPSBOVUxMCi0JJiYgYXBfYnZwdXRzKGMtPmZwLCAiSFRUUC8xLjAgIiwgci0+c3RhdHVzX2xpbmUsIENSTEYsIE5VTEwpID09IC0xKSB7Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBjLT5yZXEsCi0JCSJwcm94eTogZXJyb3Igd3JpdGluZyBDUkxGIHRvICVzIiwgYy0+dGVtcGZpbGUpOwotCSAgICBjID0gYXBfcHJveHlfY2FjaGVfZXJyb3IoYyk7Ci0gICAgfQotCi0vKiBzZW5kIGhlYWRlcnMgKi8KLSAgICB0ZG8ucmVxID0gcjsKLSAgICB0ZG8uY2FjaGUgPSBjOwotICAgIGFwX3RhYmxlX2RvKGFwX3Byb3h5X3NlbmRfaGRyX2xpbmUsICZ0ZG8sIHJlc3BfaGRycywgTlVMTCk7Ci0KLSAgICBpZiAoIXItPmFzc2JhY2t3YXJkcykKLQlhcF9ycHV0cyhDUkxGLCByKTsKLSAgICBpZiAoYyAhPSBOVUxMICYmIGMtPmZwICE9IE5VTEwgJiYgYXBfYnB1dHMoQ1JMRiwgYy0+ZnApID09IC0xKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGMtPnJlcSwKLQkgICAgInByb3h5OiBlcnJvciB3cml0aW5nIENSTEYgdG8gJXMiLCBjLT50ZW1wZmlsZSk7Ci0JYyA9IGFwX3Byb3h5X2NhY2hlX2Vycm9yKGMpOwotICAgIH0KLQotICAgIGFwX2JzZXRvcHQoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCT19CWVRFQ1QsICZ6ZXJvKTsKLSAgICByLT5zZW50X2JvZHljdCA9IDE7Ci0vKiBzZW5kIGJvZHkgKi8KLSAgICBpZiAoIXItPmhlYWRlcl9vbmx5KSB7Ci0JaWYgKHBhcm1zWzBdICE9ICdkJykgewotLyogd2UgbmVlZCB0byBzZXQgdGhpcyBmb3IgYXBfcHJveHlfc2VuZF9mYigpLi4uICovCi0JICAgIGlmIChjICE9IE5VTEwpCi0JCWMtPmNhY2hlX2NvbXBsZXRpb24gPSAwOwotCSAgICBhcF9wcm94eV9zZW5kX2ZiKGRhdGEsIHIsIGMpOwotCX0gZWxzZQotCSAgICBzZW5kX2RpcihkYXRhLCByLCBjLCBjd2QpOwotCi0JaWYgKHJjID09IDEyNSB8fCByYyA9PSAxNTApCi0JICAgIHJjID0gZnRwX2dldHJjKGYpOwotCi0JLyogWFhYOiB3ZSBjaGVja2VkIGZvciAxMjV8fDE1MHx8MjI2fHwyNTAgYWJvdmUuIFRoaXMgaXMgcmVkdW5kYW50LiAqLwotCWlmIChyYyAhPSAyMjYgJiYgcmMgIT0gMjUwKQotICAgICAgICAgICAgLyogWFhYOiB3ZSBubyBsb25nZXIgbG9nIGFuICJlcnJvciB3cml0aW5nIHRvIGMtPnRlbXBmaWxlIiAtIHNob3VsZCB3ZT8gKi8KLQkgICAgYyA9IGFwX3Byb3h5X2NhY2hlX2Vycm9yKGMpOwotICAgIH0KLSAgICBlbHNlIHsKLS8qIGFib3J0IHRoZSB0cmFuc2ZlciAqLwotCWFwX2JwdXRzKCJBQk9SIiBDUkxGLCBmKTsKLQlhcF9iZmx1c2goZik7Ci0JaWYgKCFwYXN2bW9kZSkKLQkgICAgYXBfYmNsb3NlKGRhdGEpOwotCUV4cGxhaW4wKCJGVFA6IEFCT1IiKTsKLS8qIHJlc3BvbnNlczogMjI1LCAyMjYsIDQyMSwgNTAwLCA1MDEsIDUwMiAqLwotICAgIC8qIDIyNSBEYXRhIGNvbm5lY3Rpb24gb3Blbjsgbm8gdHJhbnNmZXIgaW4gcHJvZ3Jlc3MuICovCi0gICAgLyogMjI2IENsb3NpbmcgZGF0YSBjb25uZWN0aW9uLiAqLwotICAgIC8qIDQyMSBTZXJ2aWNlIG5vdCBhdmFpbGFibGUsIGNsb3NpbmcgY29udHJvbCBjb25uZWN0aW9uLiAqLwotICAgIC8qIDUwMCBTeW50YXggZXJyb3IsIGNvbW1hbmQgdW5yZWNvZ25pemVkLiAqLwotICAgIC8qIDUwMSBTeW50YXggZXJyb3IgaW4gcGFyYW1ldGVycyBvciBhcmd1bWVudHMuICovCi0gICAgLyogNTAyIENvbW1hbmQgbm90IGltcGxlbWVudGVkLiAqLwotCWkgPSBmdHBfZ2V0cmMoZik7Ci0JRXhwbGFpbjEoIkZUUDogcmV0dXJuZWQgc3RhdHVzICVkIiwgaSk7Ci0gICAgfQotCi0gICAgYXBfa2lsbF90aW1lb3V0KHIpOwotICAgIGFwX3Byb3h5X2NhY2hlX3RpZHkoYyk7Ci0KLS8qIGZpbmlzaCAqLwotICAgIGFwX2JwdXRzKCJRVUlUIiBDUkxGLCBmKTsKLSAgICBhcF9iZmx1c2goZik7Ci0gICAgRXhwbGFpbjAoIkZUUDogUVVJVCIpOwotLyogcmVzcG9uc2VzOiAyMjEsIDUwMCAqLwotICAgIC8qIDIyMSBTZXJ2aWNlIGNsb3NpbmcgY29udHJvbCBjb25uZWN0aW9uLiAqLwotICAgIC8qIDUwMCBTeW50YXggZXJyb3IsIGNvbW1hbmQgdW5yZWNvZ25pemVkLiAqLwotICAgIGkgPSBmdHBfZ2V0cmMoZik7Ci0gICAgRXhwbGFpbjEoIkZUUDogUVVJVDogc3RhdHVzICVkIiwgaSk7Ci0KLSAgICBpZiAocGFzdm1vZGUpCi0JYXBfYmNsb3NlKGRhdGEpOwotICAgIGFwX2JjbG9zZShmKTsKLQotICAgIGFwX3JmbHVzaChyKTsJLyogZmx1c2ggYmVmb3JlIGdhcmJhZ2UgY29sbGVjdGlvbiAqLwotCi0gICAgYXBfcHJveHlfZ2FyYmFnZV9jb2xsKHIpOwotCi0gICAgcmV0dXJuIE9LOwotfQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9wcm94eS9wcm94eV9odHRwLmMgYi9tb2R1bGVzL3Byb3h5L3Byb3h5X2h0dHAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5MzgwNi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL3Byb3h5L3Byb3h5X2h0dHAuYworKysgL2Rldi9udWxsCkBAIC0xLDU0MyArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qIEhUVFAgcm91dGluZXMgZm9yIEFwYWNoZSBwcm94eSAqLwotCi0jaW5jbHVkZSAibW9kX3Byb3h5LmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX21haW4uaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJ1dGlsX2RhdGUuaCIKLQotLyoKLSAqIENhbm9uaWNhbGlzZSBodHRwLWxpa2UgVVJMcy4KLSAqICBzY2hlbWUgaXMgdGhlIHNjaGVtZSBmb3IgdGhlIFVSTAotICogIHVybCAgICBpcyB0aGUgVVJMIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0ICcvJwotICogIGRlZl9wb3J0IGlzIHRoZSBkZWZhdWx0IHBvcnQgZm9yIHRoaXMgc2NoZW1lLgotICovCi1pbnQgYXBfcHJveHlfaHR0cF9jYW5vbihyZXF1ZXN0X3JlYyAqciwgY2hhciAqdXJsLCBjb25zdCBjaGFyICpzY2hlbWUsIGludCBkZWZfcG9ydCkKLXsKLSAgICBjaGFyICpob3N0LCAqcGF0aCwgKnNlYXJjaCwgc3BvcnRbN107Ci0gICAgY29uc3QgY2hhciAqZXJyOwotICAgIGludCBwb3J0OwotCi0vKiBkbyBzeW50YXRpYyBjaGVjay4KLSAqIFdlIGJyZWFrIHRoZSBVUkwgaW50byBob3N0LCBwb3J0LCBwYXRoLCBzZWFyY2gKLSAqLwotICAgIHBvcnQgPSBkZWZfcG9ydDsKLSAgICBlcnIgPSBhcF9wcm94eV9jYW5vbl9uZXRsb2Moci0+cG9vbCwgJnVybCwgTlVMTCwgTlVMTCwgJmhvc3QsICZwb3J0KTsKLSAgICBpZiAoZXJyKQotCXJldHVybiBIVFRQX0JBRF9SRVFVRVNUOwotCi0vKiBub3cgcGFyc2UgcGF0aC9zZWFyY2ggYXJncywgYWNjb3JkaW5nIHRvIHJmYzE3MzggKi8KLS8qIE4uQi4gaWYgdGhpcyBpc24ndCBhIHRydWUgcHJveHkgcmVxdWVzdCwgdGhlbiB0aGUgVVJMIF9wYXRoXwotICogaGFzIGFscmVhZHkgYmVlbiBkZWNvZGVkLiAgVHJ1ZSBwcm94eSByZXF1ZXN0cyBoYXZlIHItPnVyaQotICogPT0gci0+dW5wYXJzZWRfdXJpLCBhbmQgbm8gb3RoZXJzIGhhdmUgdGhhdCBwcm9wZXJ0eS4KLSAqLwotICAgIGlmIChyLT51cmkgPT0gci0+dW5wYXJzZWRfdXJpKSB7Ci0Jc2VhcmNoID0gc3RyY2hyKHVybCwgJz8nKTsKLQlpZiAoc2VhcmNoICE9IE5VTEwpCi0JICAgICooc2VhcmNoKyspID0gJ1wwJzsKLSAgICB9Ci0gICAgZWxzZQotCXNlYXJjaCA9IHItPmFyZ3M7Ci0KLS8qIHByb2Nlc3MgcGF0aCAqLwotICAgIHBhdGggPSBhcF9wcm94eV9jYW5vbmVuYyhyLT5wb29sLCB1cmwsIHN0cmxlbih1cmwpLCBlbmNfcGF0aCwgci0+cHJveHlyZXEpOwotICAgIGlmIChwYXRoID09IE5VTEwpCi0JcmV0dXJuIEhUVFBfQkFEX1JFUVVFU1Q7Ci0KLSAgICBpZiAocG9ydCAhPSBkZWZfcG9ydCkKLQlhcF9zbnByaW50ZihzcG9ydCwgc2l6ZW9mKHNwb3J0KSwgIjolZCIsIHBvcnQpOwotICAgIGVsc2UKLQlzcG9ydFswXSA9ICdcMCc7Ci0KLSAgICByLT5maWxlbmFtZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgInByb3h5OiIsIHNjaGVtZSwgIjovLyIsIGhvc3QsIHNwb3J0LCAiLyIsCi0JCSAgIHBhdGgsIChzZWFyY2gpID8gIj8iIDogIiIsIChzZWFyY2gpID8gc2VhcmNoIDogIiIsIE5VTEwpOwotICAgIHJldHVybiBPSzsKLX0KLSAKLXN0YXRpYyBjb25zdCBjaGFyICpwcm94eV9sb2NhdGlvbl9yZXZlcnNlX21hcChyZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqdXJsKQotewotICAgIHZvaWQgKnNjb25mOwotICAgIHByb3h5X3NlcnZlcl9jb25mICpjb25mOwotICAgIHN0cnVjdCBwcm94eV9hbGlhcyAqZW50OwotICAgIGludCBpLCBsMSwgbDI7Ci0gICAgY2hhciAqdTsKLQotICAgIHNjb25mID0gci0+c2VydmVyLT5tb2R1bGVfY29uZmlnOwotICAgIGNvbmYgPSAocHJveHlfc2VydmVyX2NvbmYgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhzY29uZiwgJnByb3h5X21vZHVsZSk7Ci0gICAgbDEgPSBzdHJsZW4odXJsKTsKLSAgICBlbnQgPSAoc3RydWN0IHByb3h5X2FsaWFzICopY29uZi0+cmFsaWFzZXMtPmVsdHM7Ci0gICAgZm9yIChpID0gMDsgaSA8IGNvbmYtPnJhbGlhc2VzLT5uZWx0czsgaSsrKSB7Ci0gICAgICAgIGwyID0gc3RybGVuKGVudFtpXS5yZWFsKTsKLSAgICAgICAgaWYgKGwxID49IGwyICYmIHN0cm5jbXAoZW50W2ldLnJlYWwsIHVybCwgbDIpID09IDApIHsKLSAgICAgICAgICAgIHUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIGVudFtpXS5mYWtlLCAmdXJsW2wyXSwgTlVMTCk7Ci0gICAgICAgICAgICByZXR1cm4gYXBfY29uc3RydWN0X3VybChyLT5wb29sLCB1LCByKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdXJsOwotfQotCi0vKiBDbGVhciBhbGwgY29ubmVjdGlvbi1iYXNlZCBoZWFkZXJzIGZyb20gdGhlIGluY29taW5nIGhlYWRlcnMgdGFibGUgKi8KLXN0YXRpYyB2b2lkIGNsZWFyX2Nvbm5lY3Rpb24ocG9vbCAqcCwgdGFibGUgKmhlYWRlcnMpCi17Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICBjaGFyICpuZXh0ID0gYXBfcHN0cmR1cChwLCBhcF90YWJsZV9nZXQoaGVhZGVycywgIkNvbm5lY3Rpb24iKSk7Ci0KLSAgICBhcF90YWJsZV91bnNldChoZWFkZXJzLCAiUHJveHktQ29ubmVjdGlvbiIpOwotICAgIGlmICghbmV4dCkKLQlyZXR1cm47Ci0KLSAgICB3aGlsZSAoKm5leHQpIHsKLQluYW1lID0gbmV4dDsKLQl3aGlsZSAoKm5leHQgJiYgIWFwX2lzc3BhY2UoKm5leHQpICYmICgqbmV4dCAhPSAnLCcpKQotCSAgICArK25leHQ7Ci0Jd2hpbGUgKCpuZXh0ICYmIChhcF9pc3NwYWNlKCpuZXh0KSB8fCAoKm5leHQgPT0gJywnKSkpIHsKLQkgICAgKm5leHQgPSAnXDAnOwotCSAgICArK25leHQ7Ci0JfQotCWFwX3RhYmxlX3Vuc2V0KGhlYWRlcnMsIG5hbWUpOwotICAgIH0KLSAgICBhcF90YWJsZV91bnNldChoZWFkZXJzLCAiQ29ubmVjdGlvbiIpOwotfQotCi0vKgotICogVGhpcyBoYW5kbGVzIGh0dHA6Ly8gVVJMcywgYW5kIG90aGVyIFVSTHMgdXNpbmcgYSByZW1vdGUgcHJveHkgb3ZlciBodHRwCi0gKiBJZiBwcm94eWhvc3QgaXMgTlVMTCwgdGhlbiBjb250YWN0IHRoZSBzZXJ2ZXIgZGlyZWN0bHksIG90aGVyd2lzZQotICogZ28gdmlhIHRoZSBwcm94eS4KLSAqIE5vdGUgdGhhdCBpZiBhIHByb3h5IGlzIHVzZWQsIHRoZW4gVVJMcyBvdGhlciB0aGFuIGh0dHA6IGNhbiBiZSBhY2Nlc3NlZCwKLSAqIGFsc28sIGlmIHdlIGhhdmUgdHJvdWJsZSB3aGljaCBpcyBjbGVhcmx5IHNwZWNpZmljIHRvIHRoZSBwcm94eSwgdGhlbgotICogd2UgcmV0dXJuIERFQ0xJTkVEIHNvIHRoYXQgd2UgY2FuIHRyeSBhbm90aGVyIHByb3h5LiAoT3IgdGhlIGRpcmVjdAotICogcm91dGUuKQotICovCi1pbnQgYXBfcHJveHlfaHR0cF9oYW5kbGVyKHJlcXVlc3RfcmVjICpyLCBjYWNoZV9yZXEgKmMsIGNoYXIgKnVybCwKLQkJICAgICAgIGNvbnN0IGNoYXIgKnByb3h5aG9zdCwgaW50IHByb3h5cG9ydCkKLXsKLSAgICBjb25zdCBjaGFyICpzdHJwOwotICAgIGNoYXIgKnN0cnAyOwotICAgIGNvbnN0IGNoYXIgKmVyciwgKmRlc3Rob3N0OwotICAgIGludCBpLCBqLCBzb2NrLCBsZW4sIGJhY2thc3N3YXJkczsKLSAgICBhcnJheV9oZWFkZXIgKnJlcWhkcnNfYXJyOwotICAgIHRhYmxlICpyZXNwX2hkcnM7Ci0gICAgdGFibGVfZW50cnkgKnJlcWhkcnM7Ci0gICAgc3RydWN0IHNvY2thZGRyX2luIHNlcnZlcjsKLSAgICBzdHJ1Y3QgaW5fYWRkciBkZXN0YWRkcjsKLSAgICBzdHJ1Y3QgaG9zdGVudCBzZXJ2ZXJfaHA7Ci0gICAgQlVGRiAqZjsKLSAgICBjaGFyIGJ1ZmZlcltIVUdFX1NUUklOR19MRU5dOwotICAgIGNoYXIgcG9ydHN0clszMl07Ci0gICAgcG9vbCAqcCA9IHItPnBvb2w7Ci0gICAgY29uc3QgbG9uZyBpbnQgemVybyA9IDBMOwotICAgIGludCBkZXN0cG9ydCA9IDA7Ci0gICAgY2hhciAqZGVzdHBvcnRzdHIgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKnVybHB0ciA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciAqZGF0ZXN0cjsKLSAgICBzdHJ1Y3QgdGJsX2RvX2FyZ3MgdGRvOwotCi0gICAgdm9pZCAqc2NvbmYgPSByLT5zZXJ2ZXItPm1vZHVsZV9jb25maWc7Ci0gICAgcHJveHlfc2VydmVyX2NvbmYgKmNvbmYgPQotICAgIChwcm94eV9zZXJ2ZXJfY29uZiAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzY29uZiwgJnByb3h5X21vZHVsZSk7Ci0gICAgc3RydWN0IG5vcHJveHlfZW50cnkgKm5wZW50ID0gKHN0cnVjdCBub3Byb3h5X2VudHJ5ICopIGNvbmYtPm5vcHJveGllcy0+ZWx0czsKLSAgICBzdHJ1Y3Qgbm9jYWNoZV9lbnRyeSAqbmNlbnQgPSAoc3RydWN0IG5vY2FjaGVfZW50cnkgKikgY29uZi0+bm9jYWNoZXMtPmVsdHM7Ci0gICAgaW50IG5vY2FjaGUgPSAwOwotCi0gICAgbWVtc2V0KCZzZXJ2ZXIsICdcMCcsIHNpemVvZihzZXJ2ZXIpKTsKLSAgICBzZXJ2ZXIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0KLS8qIFdlIGJyZWFrIHRoZSBVUkwgaW50byBob3N0LCBwb3J0LCBwYXRoLXNlYXJjaCAqLwotCi0gICAgdXJscHRyID0gc3Ryc3RyKHVybCwgIjovLyIpOwotICAgIGlmICh1cmxwdHIgPT0gTlVMTCkKLQlyZXR1cm4gSFRUUF9CQURfUkVRVUVTVDsKLSAgICB1cmxwdHIgKz0gMzsKLSAgICBkZXN0cG9ydCA9IERFRkFVTFRfSFRUUF9QT1JUOwotICAgIHN0cnAgPSBzdHJjaHIodXJscHRyLCAnLycpOwotICAgIGlmIChzdHJwID09IE5VTEwpIHsKLQlkZXN0aG9zdCA9IGFwX3BzdHJkdXAocCwgdXJscHRyKTsKLQl1cmxwdHIgPSAiLyI7Ci0gICAgfQotICAgIGVsc2UgewotCWNoYXIgKnEgPSBhcF9wYWxsb2MocCwgc3RycCAtIHVybHB0ciArIDEpOwotCW1lbWNweShxLCB1cmxwdHIsIHN0cnAgLSB1cmxwdHIpOwotCXFbc3RycCAtIHVybHB0cl0gPSAnXDAnOwotCXVybHB0ciA9IHN0cnA7Ci0JZGVzdGhvc3QgPSBxOwotICAgIH0KLQotICAgIHN0cnAyID0gc3RyY2hyKGRlc3Rob3N0LCAnOicpOwotICAgIGlmIChzdHJwMiAhPSBOVUxMKSB7Ci0JKihzdHJwMisrKSA9ICdcMCc7Ci0JaWYgKGFwX2lzZGlnaXQoKnN0cnAyKSkgewotCSAgICBkZXN0cG9ydCA9IGF0b2koc3RycDIpOwotCSAgICBkZXN0cG9ydHN0ciA9IHN0cnAyOwotCX0KLSAgICB9Ci0KLS8qIGNoZWNrIGlmIFByb3h5QmxvY2sgZGlyZWN0aXZlIG9uIHRoaXMgaG9zdCAqLwotICAgIGRlc3RhZGRyLnNfYWRkciA9IGFwX2luZXRfYWRkcihkZXN0aG9zdCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGNvbmYtPm5vcHJveGllcy0+bmVsdHM7IGkrKykgewotCWlmICgobnBlbnRbaV0ubmFtZSAhPSBOVUxMICYmIHN0cnN0cihkZXN0aG9zdCwgbnBlbnRbaV0ubmFtZSkgIT0gTlVMTCkKLQkgICAgfHwgZGVzdGFkZHIuc19hZGRyID09IG5wZW50W2ldLmFkZHIuc19hZGRyIHx8IG5wZW50W2ldLm5hbWVbMF0gPT0gJyonKQotCSAgICByZXR1cm4gYXBfcHJveHllcnJvcihyLCBIVFRQX0ZPUkJJRERFTiwKLQkJCQkgIkNvbm5lY3QgdG8gcmVtb3RlIG1hY2hpbmUgYmxvY2tlZCIpOwotICAgIH0KLQotICAgIGlmIChwcm94eWhvc3QgIT0gTlVMTCkgewotCXNlcnZlci5zaW5fcG9ydCA9IGh0b25zKHByb3h5cG9ydCk7Ci0JZXJyID0gYXBfcHJveHlfaG9zdDJhZGRyKHByb3h5aG9zdCwgJnNlcnZlcl9ocCk7Ci0JaWYgKGVyciAhPSBOVUxMKQotCSAgICByZXR1cm4gREVDTElORUQ7CS8qIHRyeSBhbm90aGVyICovCi0gICAgfQotICAgIGVsc2UgewotCXNlcnZlci5zaW5fcG9ydCA9IGh0b25zKGRlc3Rwb3J0KTsKLQllcnIgPSBhcF9wcm94eV9ob3N0MmFkZHIoZGVzdGhvc3QsICZzZXJ2ZXJfaHApOwotCWlmIChlcnIgIT0gTlVMTCkKLQkgICAgcmV0dXJuIGFwX3Byb3h5ZXJyb3IociwgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IsIGVycik7Ci0gICAgfQotCi0gICAgc29jayA9IGFwX3Bzb2NrZXQocCwgUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKLSAgICBpZiAoc29jayA9PSAtMSkgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotCQkgICAgInByb3h5OiBlcnJvciBjcmVhdGluZyBzb2NrZXQiKTsKLQlyZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgfQotCi0gICAgaWYgKGNvbmYtPnJlY3ZfYnVmZmVyX3NpemUpIHsKLQlpZiAoc2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsCi0JCSAgICAgICAoY29uc3QgY2hhciAqKSAmY29uZi0+cmVjdl9idWZmZXJfc2l6ZSwgc2l6ZW9mKGludCkpCi0JICAgID09IC0xKSB7Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotCQkJICJzZXRzb2Nrb3B0KFNPX1JDVkJVRik6IEZhaWxlZCB0byBzZXQgUHJveHlSZWNlaXZlQnVmZmVyU2l6ZSwgdXNpbmcgZGVmYXVsdCIpOwotCX0KLSAgICB9Ci0KLSNpZmRlZiBTSU5JWF9EX1JFU09MVkVSX0JVRwotICAgIHsKLQlzdHJ1Y3QgaW5fYWRkciAqaXBfYWRkciA9IChzdHJ1Y3QgaW5fYWRkciAqKSAqc2VydmVyX2hwLmhfYWRkcl9saXN0OwotCi0JZm9yICg7IGlwX2FkZHItPnNfYWRkciAhPSAwOyArK2lwX2FkZHIpIHsKLQkgICAgbWVtY3B5KCZzZXJ2ZXIuc2luX2FkZHIsIGlwX2FkZHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOwotCSAgICBpID0gYXBfcHJveHlfZG9jb25uZWN0KHNvY2ssICZzZXJ2ZXIsIHIpOwotCSAgICBpZiAoaSA9PSAwKQotCQlicmVhazsKLQl9Ci0gICAgfQotI2Vsc2UKLSAgICBqID0gMDsKLSAgICB3aGlsZSAoc2VydmVyX2hwLmhfYWRkcl9saXN0W2pdICE9IE5VTEwpIHsKLQltZW1jcHkoJnNlcnZlci5zaW5fYWRkciwgc2VydmVyX2hwLmhfYWRkcl9saXN0W2pdLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKLQlpID0gYXBfcHJveHlfZG9jb25uZWN0KHNvY2ssICZzZXJ2ZXIsIHIpOwotCWlmIChpID09IDApCi0JICAgIGJyZWFrOwotCWorKzsKLSAgICB9Ci0jZW5kaWYKLSAgICBpZiAoaSA9PSAtMSkgewotCWlmIChwcm94eWhvc3QgIT0gTlVMTCkKLQkgICAgcmV0dXJuIERFQ0xJTkVEOwkvKiB0cnkgYWdhaW4gYW5vdGhlciB3YXkgKi8KLQllbHNlCi0JICAgIHJldHVybiBhcF9wcm94eWVycm9yKHIsIEhUVFBfQkFEX0dBVEVXQVksIGFwX3BzdHJjYXQoci0+cG9vbCwKLQkJCQkiQ291bGQgbm90IGNvbm5lY3QgdG8gcmVtb3RlIG1hY2hpbmU6ICIsCi0JCQkJc3RyZXJyb3IoZXJybm8pLCBOVUxMKSk7Ci0gICAgfQotCi0gICAgY2xlYXJfY29ubmVjdGlvbihyLT5wb29sLCByLT5oZWFkZXJzX2luKTsJLyogU3RyaXAgY29ubmVjdGlvbi1iYXNlZCBoZWFkZXJzICovCi0KLSAgICBmID0gYXBfYmNyZWF0ZShwLCBCX1JEV1IgfCBCX1NPQ0tFVCk7Ci0gICAgYXBfYnB1c2hmZChmLCBzb2NrLCBzb2NrKTsKLQotICAgIGFwX2hhcmRfdGltZW91dCgicHJveHkgc2VuZCIsIHIpOwotICAgIGFwX2J2cHV0cyhmLCByLT5tZXRob2QsICIgIiwgcHJveHlob3N0ID8gdXJsIDogdXJscHRyLCAiIEhUVFAvMS4wIiBDUkxGLAotCSAgIE5VTEwpOwotICAgIGlmIChkZXN0cG9ydHN0ciAhPSBOVUxMICYmIGRlc3Rwb3J0ICE9IERFRkFVTFRfSFRUUF9QT1JUKQotCWFwX2J2cHV0cyhmLCAiSG9zdDogIiwgZGVzdGhvc3QsICI6IiwgZGVzdHBvcnRzdHIsIENSTEYsIE5VTEwpOwotICAgIGVsc2UKLQlhcF9idnB1dHMoZiwgIkhvc3Q6ICIsIGRlc3Rob3N0LCBDUkxGLCBOVUxMKTsKLQotICAgIGlmIChjb25mLT52aWFvcHQgPT0gdmlhX2Jsb2NrKSB7Ci0JLyogQmxvY2sgYWxsIG91dGdvaW5nIFZpYTogaGVhZGVycyAqLwotCWFwX3RhYmxlX3Vuc2V0KHItPmhlYWRlcnNfaW4sICJWaWEiKTsKLSAgICB9IGVsc2UgaWYgKGNvbmYtPnZpYW9wdCAhPSB2aWFfb2ZmKSB7Ci0JLyogQ3JlYXRlIGEgIlZpYToiIHJlcXVlc3QgaGVhZGVyIGVudHJ5IGFuZCBtZXJnZSBpdCAqLwotCWkgPSBhcF9nZXRfc2VydmVyX3BvcnQocik7Ci0JaWYgKGFwX2lzX2RlZmF1bHRfcG9ydChpLHIpKSB7Ci0JICAgIHN0cmNweShwb3J0c3RyLCIiKTsKLQl9IGVsc2UgewotCSAgICBhcF9zbnByaW50Zihwb3J0c3RyLCBzaXplb2YgcG9ydHN0ciwgIjolZCIsIGkpOwotCX0KLQkvKiBHZW5lcmF0ZSBvdXRnb2luZyBWaWE6IGhlYWRlciB3aXRoL3dpdGhvdXQgc2VydmVyIGNvbW1lbnQ6ICovCi0JYXBfdGFibGVfbWVyZ2VuKHItPmhlYWRlcnNfaW4sICJWaWEiLAotCQkgICAgKGNvbmYtPnZpYW9wdCA9PSB2aWFfZnVsbCkKLQkJCT8gYXBfcHNwcmludGYocCwgIiVkLiVkICVzJXMgKCVzKSIsCi0JCQkJSFRUUF9WRVJTSU9OX01BSk9SKHItPnByb3RvX251bSksCi0JCQkJSFRUUF9WRVJTSU9OX01JTk9SKHItPnByb3RvX251bSksCi0JCQkJYXBfZ2V0X3NlcnZlcl9uYW1lKHIpLCBwb3J0c3RyLAotCQkJCVNFUlZFUl9CQVNFVkVSU0lPTikKLQkJCTogYXBfcHNwcmludGYocCwgIiVkLiVkICVzJXMiLAotCQkJCUhUVFBfVkVSU0lPTl9NQUpPUihyLT5wcm90b19udW0pLAotCQkJCUhUVFBfVkVSU0lPTl9NSU5PUihyLT5wcm90b19udW0pLAotCQkJCWFwX2dldF9zZXJ2ZXJfbmFtZShyKSwgcG9ydHN0cikKLQkJCSk7Ci0gICAgfQotCi0gICAgcmVxaGRyc19hcnIgPSBhcF90YWJsZV9lbHRzKHItPmhlYWRlcnNfaW4pOwotICAgIHJlcWhkcnMgPSAodGFibGVfZW50cnkgKikgcmVxaGRyc19hcnItPmVsdHM7Ci0gICAgZm9yIChpID0gMDsgaSA8IHJlcWhkcnNfYXJyLT5uZWx0czsgaSsrKSB7Ci0JaWYgKHJlcWhkcnNbaV0ua2V5ID09IE5VTEwgfHwgcmVxaGRyc1tpXS52YWwgPT0gTlVMTAotCS8qIENsZWFyIG91dCBoZWFkZXJzIG5vdCB0byBzZW5kICovCi0JICAgIHx8ICFzdHJjYXNlY21wKHJlcWhkcnNbaV0ua2V5LCAiSG9zdCIpCS8qIEFscmVhZHkgc2VudCAqLwotCSAgICAvKiBYWFg6IEBAQCBGSVhNRTogIlByb3h5LUF1dGhvcml6YXRpb24iIHNob3VsZCAqb25seSogYmUgCi0JICAgICAqIHN1cHByZXNzZWQgaWYgVEhJUyBzZXJ2ZXIgcmVxdWVzdGVkIHRoZSBhdXRoZW50aWNhdGlvbiwKLQkgICAgICogbm90IHdoZW4gYSBmcm9udGVuZCBwcm94eSByZXF1ZXN0ZWQgaXQhCi0JICAgICAqLwotCSAgICB8fCAhc3RyY2FzZWNtcChyZXFoZHJzW2ldLmtleSwgIlByb3h5LUF1dGhvcml6YXRpb24iKSkKLQkgICAgY29udGludWU7Ci0JYXBfYnZwdXRzKGYsIHJlcWhkcnNbaV0ua2V5LCAiOiAiLCByZXFoZHJzW2ldLnZhbCwgQ1JMRiwgTlVMTCk7Ci0gICAgfQotCi0gICAgYXBfYnB1dHMoQ1JMRiwgZik7Ci0vKiBzZW5kIHRoZSByZXF1ZXN0IGRhdGEsIGlmIGFueS4gKi8KLQotICAgIGlmIChhcF9zaG91bGRfY2xpZW50X2Jsb2NrKHIpKSB7Ci0Jd2hpbGUgKChpID0gYXBfZ2V0X2NsaWVudF9ibG9jayhyLCBidWZmZXIsIHNpemVvZiBidWZmZXIpKSA+IDApCi0JICAgIGFwX2J3cml0ZShmLCBidWZmZXIsIGkpOwotICAgIH0KLSAgICBhcF9iZmx1c2goZik7Ci0gICAgYXBfa2lsbF90aW1lb3V0KHIpOwotCi0gICAgYXBfaGFyZF90aW1lb3V0KCJwcm94eSByZWNlaXZlIiwgcik7Ci0KLSAgICBsZW4gPSBhcF9iZ2V0cyhidWZmZXIsIHNpemVvZiBidWZmZXIgLSAxLCBmKTsKLSAgICBpZiAobGVuID09IC0xKSB7Ci0JYXBfYmNsb3NlKGYpOwotCWFwX2tpbGxfdGltZW91dChyKTsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgciwKLQkJICAgICAiYXBfYmdldHMoKSAtIHByb3h5IHJlY2VpdmUgLSBFcnJvciByZWFkaW5nIGZyb20gcmVtb3RlIHNlcnZlciAlcyAobGVuZ3RoICVkKSIsCi0JCSAgICAgcHJveHlob3N0ID8gcHJveHlob3N0IDogZGVzdGhvc3QsIGxlbik7Ci0JcmV0dXJuIGFwX3Byb3h5ZXJyb3IociwgSFRUUF9CQURfR0FURVdBWSwKLQkJCSAgICAgIkVycm9yIHJlYWRpbmcgZnJvbSByZW1vdGUgc2VydmVyIik7Ci0gICAgfSBlbHNlIGlmIChsZW4gPT0gMCkgewotCWFwX2JjbG9zZShmKTsKLQlhcF9raWxsX3RpbWVvdXQocik7Ci0JcmV0dXJuIGFwX3Byb3h5ZXJyb3IociwgSFRUUF9CQURfR0FURVdBWSwKLQkJCSAgICAgIkRvY3VtZW50IGNvbnRhaW5zIG5vIGRhdGEiKTsKLSAgICB9Ci0KLS8qIElzIGl0IGFuIEhUVFAvMSByZXNwb25zZT8gIFRoaXMgaXMgYnVnZ3kgaWYgd2UgZXZlciBzZWUgYW4gSFRUUC8xLjEwICovCi0gICAgaWYgKGFwX2NoZWNrbWFzayhidWZmZXIsICJIVFRQLyMuIyAjIyMqIikpIHsKLQlpbnQgbWFqb3IsIG1pbm9yOwotCWlmICgyICE9IHNzY2FuZihidWZmZXIsICJIVFRQLyV1LiV1IiwgJm1ham9yLCAmbWlub3IpKSB7Ci0JICAgIG1ham9yID0gMTsKLQkgICAgbWlub3IgPSAwOwotCX0KLQotLyogSWYgbm90IGFuIEhUVFAvMSBtZXNzYWdlIG9yIGlmIHRoZSBzdGF0dXMgbGluZSB3YXMgPiA4MTkyIGJ5dGVzICovCi0JaWYgKGJ1ZmZlcls1XSAhPSAnMScgfHwgYnVmZmVyW2xlbiAtIDFdICE9ICdcbicpIHsKLQkgICAgYXBfYmNsb3NlKGYpOwotCSAgICBhcF9raWxsX3RpbWVvdXQocik7Ci0JICAgIHJldHVybiBIVFRQX0JBRF9HQVRFV0FZOwotCX0KLQliYWNrYXNzd2FyZHMgPSAwOwotCWJ1ZmZlclstLWxlbl0gPSAnXDAnOwotCi0JYnVmZmVyWzEyXSA9ICdcMCc7Ci0Jci0+c3RhdHVzID0gYXRvaSgmYnVmZmVyWzldKTsKLQlidWZmZXJbMTJdID0gJyAnOwotCXItPnN0YXR1c19saW5lID0gYXBfcHN0cmR1cChwLCAmYnVmZmVyWzldKTsKLQotLyogcmVhZCB0aGUgaGVhZGVycy4gKi8KLS8qIE4uQi4gZm9yIEhUVFAvMS4wIGNsaWVudHMsIHdlIGhhdmUgdG8gZm9sZCBsaW5lLXdyYXBwZWQgaGVhZGVycyAqLwotLyogQWxzbywgdGFrZSBjYXJlIHdpdGggaGVhZGVycyB3aXRoIG11bHRpcGxlIG9jY3VyZW5jZXMuICovCi0KLQlyZXNwX2hkcnMgPSBhcF9wcm94eV9yZWFkX2hlYWRlcnMociwgYnVmZmVyLCBIVUdFX1NUUklOR19MRU4sIGYpOwotCWlmIChyZXNwX2hkcnMgPT0gTlVMTCkgewotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklOR3xBUExPR19OT0VSUk5PLCByLT5zZXJ2ZXIsCi0JCSAicHJveHk6IEJhZCBIVFRQLyVkLiVkIGhlYWRlciByZXR1cm5lZCBieSAlcyAoJXMpIiwKLQkJIG1ham9yLCBtaW5vciwgci0+dXJpLCByLT5tZXRob2QpOwotCSAgICByZXNwX2hkcnMgPSBhcF9tYWtlX3RhYmxlKHAsIDIwKTsKLQkgICAgbm9jYWNoZSA9IDE7ICAgIC8qIGRvIG5vdCBjYWNoZSB0aGlzIGJyb2tlbiBmaWxlICovCi0JfQotCi0JaWYgKGNvbmYtPnZpYW9wdCAhPSB2aWFfb2ZmICYmIGNvbmYtPnZpYW9wdCAhPSB2aWFfYmxvY2spIHsKLQkgICAgLyogQ3JlYXRlIGEgIlZpYToiIHJlc3BvbnNlIGhlYWRlciBlbnRyeSBhbmQgbWVyZ2UgaXQgKi8KLQkgICAgaSA9IGFwX2dldF9zZXJ2ZXJfcG9ydChyKTsKLQkgICAgaWYgKGFwX2lzX2RlZmF1bHRfcG9ydChpLHIpKSB7Ci0JCXN0cmNweShwb3J0c3RyLCIiKTsKLQkgICAgfSBlbHNlIHsKLQkJYXBfc25wcmludGYocG9ydHN0ciwgc2l6ZW9mIHBvcnRzdHIsICI6JWQiLCBpKTsKLQkgICAgfQotCSAgICBhcF90YWJsZV9tZXJnZW4oKHRhYmxlICopcmVzcF9oZHJzLCAiVmlhIiwKLQkJCSAgICAoY29uZi0+dmlhb3B0ID09IHZpYV9mdWxsKQotCQkJICAgID8gYXBfcHNwcmludGYocCwgIiVkLiVkICVzJXMgKCVzKSIsCi0JCQkJbWFqb3IsIG1pbm9yLAotCQkJCWFwX2dldF9zZXJ2ZXJfbmFtZShyKSwgcG9ydHN0ciwKLQkJCQlTRVJWRVJfQkFTRVZFUlNJT04pCi0JCQkgICAgOiBhcF9wc3ByaW50ZihwLCAiJWQuJWQgJXMlcyIsCi0JCQkJbWFqb3IsIG1pbm9yLAotCQkJCWFwX2dldF9zZXJ2ZXJfbmFtZShyKSwgcG9ydHN0cikKLQkJCSAgICApOwotCX0KLQotCWNsZWFyX2Nvbm5lY3Rpb24ocCwgcmVzcF9oZHJzKTsJLyogU3RyaXAgQ29ubmVjdGlvbiBoZHJzICovCi0gICAgfQotICAgIGVsc2UgewotLyogYW4gaHR0cC8wLjkgcmVzcG9uc2UgKi8KLQliYWNrYXNzd2FyZHMgPSAxOwotCXItPnN0YXR1cyA9IDIwMDsKLQlyLT5zdGF0dXNfbGluZSA9ICIyMDAgT0siOwotCi0vKiBubyBoZWFkZXJzICovCi0JcmVzcF9oZHJzID0gYXBfbWFrZV90YWJsZShwLCAyMCk7Ci0gICAgfQotCi0gICAgYy0+aGRycyA9IHJlc3BfaGRyczsKLQotICAgIGFwX2tpbGxfdGltZW91dChyKTsKLQotLyoKLSAqIEhUVFAvMS4wIHJlcXVpcmVzIHVzIHRvIGFjY2VwdCAzIHR5cGVzIG9mIGRhdGVzLCBidXQgb25seSBnZW5lcmF0ZQotICogb25lIHR5cGUKLSAqLwotICAgIGlmICgoZGF0ZXN0ciA9IGFwX3RhYmxlX2dldChyZXNwX2hkcnMsICJEYXRlIikpICE9IE5VTEwpCi0JYXBfdGFibGVfc2V0KHJlc3BfaGRycywgIkRhdGUiLCBhcF9wcm94eV9kYXRlX2Nhbm9uKHAsIGRhdGVzdHIpKTsKLSAgICBpZiAoKGRhdGVzdHIgPSBhcF90YWJsZV9nZXQocmVzcF9oZHJzLCAiTGFzdC1Nb2RpZmllZCIpKSAhPSBOVUxMKQotCWFwX3RhYmxlX3NldChyZXNwX2hkcnMsICJMYXN0LU1vZGlmaWVkIiwgYXBfcHJveHlfZGF0ZV9jYW5vbihwLCBkYXRlc3RyKSk7Ci0gICAgaWYgKChkYXRlc3RyID0gYXBfdGFibGVfZ2V0KHJlc3BfaGRycywgIkV4cGlyZXMiKSkgIT0gTlVMTCkKLQlhcF90YWJsZV9zZXQocmVzcF9oZHJzLCAiRXhwaXJlcyIsIGFwX3Byb3h5X2RhdGVfY2Fub24ocCwgZGF0ZXN0cikpOwotCi0gICAgaWYgKChkYXRlc3RyID0gYXBfdGFibGVfZ2V0KHJlc3BfaGRycywgIkxvY2F0aW9uIikpICE9IE5VTEwpCi0JYXBfdGFibGVfc2V0KHJlc3BfaGRycywgIkxvY2F0aW9uIiwgcHJveHlfbG9jYXRpb25fcmV2ZXJzZV9tYXAociwgZGF0ZXN0cikpOwotICAgIGlmICgoZGF0ZXN0ciA9IGFwX3RhYmxlX2dldChyZXNwX2hkcnMsICJVUkkiKSkgIT0gTlVMTCkKLQlhcF90YWJsZV9zZXQocmVzcF9oZHJzLCAiVVJJIiwgcHJveHlfbG9jYXRpb25fcmV2ZXJzZV9tYXAociwgZGF0ZXN0cikpOwotCi0vKiBjaGVjayBpZiBOb0NhY2hlIGRpcmVjdGl2ZSBvbiB0aGlzIGhvc3QgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgY29uZi0+bm9jYWNoZXMtPm5lbHRzOyBpKyspIHsKLQlpZiAoKG5jZW50W2ldLm5hbWUgIT0gTlVMTCAmJiBzdHJzdHIoZGVzdGhvc3QsIG5jZW50W2ldLm5hbWUpICE9IE5VTEwpCi0JICAgIHx8IGRlc3RhZGRyLnNfYWRkciA9PSBuY2VudFtpXS5hZGRyLnNfYWRkciB8fCBuY2VudFtpXS5uYW1lWzBdID09ICcqJykKLQkgICAgbm9jYWNoZSA9IDE7Ci0gICAgfQotCi0gICAgaSA9IGFwX3Byb3h5X2NhY2hlX3VwZGF0ZShjLCByZXNwX2hkcnMsICFiYWNrYXNzd2FyZHMsIG5vY2FjaGUpOwotICAgIGlmIChpICE9IERFQ0xJTkVEKSB7Ci0JYXBfYmNsb3NlKGYpOwotCXJldHVybiBpOwotICAgIH0KLQotICAgIGFwX2hhcmRfdGltZW91dCgicHJveHkgcmVjZWl2ZSIsIHIpOwotCi0vKiB3cml0ZSBzdGF0dXMgbGluZSAqLwotICAgIGlmICghci0+YXNzYmFja3dhcmRzKQotCWFwX3J2cHV0cyhyLCAiSFRUUC8xLjAgIiwgci0+c3RhdHVzX2xpbmUsIENSTEYsIE5VTEwpOwotICAgIGlmIChjICE9IE5VTEwgJiYgYy0+ZnAgIT0gTlVMTCAmJgotCWFwX2J2cHV0cyhjLT5mcCwgIkhUVFAvMS4wICIsIHItPnN0YXR1c19saW5lLCBDUkxGLCBOVUxMKSA9PSAtMSkgewotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgYy0+cmVxLAotCQkicHJveHk6IGVycm9yIHdyaXRpbmcgc3RhdHVzIGxpbmUgdG8gJXMiLCBjLT50ZW1wZmlsZSk7Ci0JICAgIGMgPSBhcF9wcm94eV9jYWNoZV9lcnJvcihjKTsKLSAgICB9Ci0KLS8qIHNlbmQgaGVhZGVycyAqLwotICAgIHRkby5yZXEgPSByOwotICAgIHRkby5jYWNoZSA9IGM7Ci0gICAgYXBfdGFibGVfZG8oYXBfcHJveHlfc2VuZF9oZHJfbGluZSwgJnRkbywgcmVzcF9oZHJzLCBOVUxMKTsKLQotICAgIGlmICghci0+YXNzYmFja3dhcmRzKQotCWFwX3JwdXRzKENSTEYsIHIpOwotICAgIGlmIChjICE9IE5VTEwgJiYgYy0+ZnAgIT0gTlVMTCAmJiBhcF9icHV0cyhDUkxGLCBjLT5mcCkgPT0gLTEpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgYy0+cmVxLAotCSAgICAicHJveHk6IGVycm9yIHdyaXRpbmcgQ1JMRiB0byAlcyIsIGMtPnRlbXBmaWxlKTsKLQljID0gYXBfcHJveHlfY2FjaGVfZXJyb3IoYyk7Ci0gICAgfQotCi0gICAgYXBfYnNldG9wdChyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJPX0JZVEVDVCwgJnplcm8pOwotICAgIHItPnNlbnRfYm9keWN0ID0gMTsKLS8qIElzIGl0IGFuIEhUVFAvMC45IHJlc3Bvc2U/IElmIHNvLCBzZW5kIHRoZSBleHRyYSBkYXRhICovCi0gICAgaWYgKGJhY2thc3N3YXJkcykgewotCWFwX2J3cml0ZShyLT5jb25uZWN0aW9uLT5jbGllbnQsIGJ1ZmZlciwgbGVuKTsKLQlpZiAoYyAhPSBOVUxMICYmIGMtPmZwICE9IE5VTEwgJiYgYXBfYndyaXRlKGMtPmZwLCBidWZmZXIsIGxlbikgIT0gbGVuKSB7Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBjLT5yZXEsCi0JCSJwcm94eTogZXJyb3Igd3JpdGluZyBleHRyYSBkYXRhIHRvICVzIiwgYy0+dGVtcGZpbGUpOwotCSAgICBjID0gYXBfcHJveHlfY2FjaGVfZXJyb3IoYyk7Ci0JfQotICAgIH0KLSAgICBhcF9raWxsX3RpbWVvdXQocik7Ci0KLSNpZmRlZiBDSEFSU0VUX0VCQ0RJQwotICAgIC8qIFdoYXQgd2UgcmVhZC93cml0ZSBhZnRlciB0aGUgaGVhZGVyIHNob3VsZCBub3QgYmUgbW9kaWZpZWQKLSAgICAgKiAoaS5lLiwgdGhlIGNhY2hlIGNvcHkgaXMgQVNDSUksIG5vdCBFQkNESUMsIGV2ZW4gZm9yIHRleHQvaHRtbCkKLSAgICAgKi8KLSAgICBhcF9ic2V0ZmxhZyhmLCBCX0FTQ0lJMkVCQ0RJQ3xCX0VCQ0RJQzJBU0NJSSwgMCk7Ci0gICAgYXBfYnNldGZsYWcoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCX0FTQ0lJMkVCQ0RJQ3xCX0VCQ0RJQzJBU0NJSSwgMCk7Ci0jZW5kaWYKLQotLyogc2VuZCBib2R5ICovCi0vKiBpZiBoZWFkZXIgb25seSwgdGhlbiBjYWNoZSB3aWxsIGJlIE5VTEwgKi8KLS8qIEhUVFAvMS4wIHRlbGxzIHVzIHRvIHJlYWQgdG8gRU9GLCByYXRoZXIgdGhhbiBjb250ZW50LWxlbmd0aCBieXRlcyAqLwotICAgIGlmICghci0+aGVhZGVyX29ubHkpIHsKLS8qIHdlIG5lZWQgdG8gc2V0IHRoaXMgZm9yIGFwX3Byb3h5X3NlbmRfZmIoKS4uLiAqLwotCWMtPmNhY2hlX2NvbXBsZXRpb24gPSBjb25mLT5jYWNoZS5jYWNoZV9jb21wbGV0aW9uOwotCWFwX3Byb3h5X3NlbmRfZmIoZiwgciwgYyk7Ci0gICAgfQotCi0gICAgYXBfcHJveHlfY2FjaGVfdGlkeShjKTsKLQotICAgIGFwX2JjbG9zZShmKTsKLQotICAgIGFwX3Byb3h5X2dhcmJhZ2VfY29sbChyKTsKLSAgICByZXR1cm4gT0s7Ci19CmRpZmYgLS1naXQgYS9tb2R1bGVzL3Byb3h5L3Byb3h5X3V0aWwuYyBiL21vZHVsZXMvcHJveHkvcHJveHlfdXRpbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTI1OGYxLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvcHJveHkvcHJveHlfdXRpbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI4OCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qIFV0aWxpdHkgcm91dGluZXMgZm9yIEFwYWNoZSBwcm94eSAqLwotI2luY2x1ZGUgIm1vZF9wcm94eS5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotI2luY2x1ZGUgImFwX21kNS5oIgotI2luY2x1ZGUgIm11bHRpdGhyZWFkLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJ1dGlsX3VyaS5oIgotI2luY2x1ZGUgInV0aWxfZGF0ZS5oIgkvKiBnZXQgYXBfY2hlY2ttYXNrKCkgZGVjbC4gKi8KLQotc3RhdGljIGludCBwcm94eV9tYXRjaF9pcGFkZHIoc3RydWN0IGRpcmNvbm5fZW50cnkgKlRoaXMsIHJlcXVlc3RfcmVjICpyKTsKLXN0YXRpYyBpbnQgcHJveHlfbWF0Y2hfZG9tYWlubmFtZShzdHJ1Y3QgZGlyY29ubl9lbnRyeSAqVGhpcywgcmVxdWVzdF9yZWMgKnIpOwotc3RhdGljIGludCBwcm94eV9tYXRjaF9ob3N0bmFtZShzdHJ1Y3QgZGlyY29ubl9lbnRyeSAqVGhpcywgcmVxdWVzdF9yZWMgKnIpOwotc3RhdGljIGludCBwcm94eV9tYXRjaF93b3JkKHN0cnVjdCBkaXJjb25uX2VudHJ5ICpUaGlzLCByZXF1ZXN0X3JlYyAqcik7Ci0KLS8qIGFscmVhZHkgY2FsbGVkIGluIHRoZSBrbm93bGVkZ2UgdGhhdCB0aGUgY2hhcmFjdGVycyBhcmUgaGV4IGRpZ2l0cyAqLwotaW50IGFwX3Byb3h5X2hleDJjKGNvbnN0IGNoYXIgKngpCi17Ci0gICAgaW50IGksIGNoOwotCi0jaWZuZGVmIENIQVJTRVRfRUJDRElDCi0gICAgY2ggPSB4WzBdOwotICAgIGlmIChhcF9pc2RpZ2l0KGNoKSkKLQlpID0gY2ggLSAnMCc7Ci0gICAgZWxzZSBpZiAoYXBfaXN1cHBlcihjaCkpCi0JaSA9IGNoIC0gKCdBJyAtIDEwKTsKLSAgICBlbHNlCi0JaSA9IGNoIC0gKCdhJyAtIDEwKTsKLSAgICBpIDw8PSA0OwotCi0gICAgY2ggPSB4WzFdOwotICAgIGlmIChhcF9pc2RpZ2l0KGNoKSkKLQlpICs9IGNoIC0gJzAnOwotICAgIGVsc2UgaWYgKGFwX2lzdXBwZXIoY2gpKQotCWkgKz0gY2ggLSAoJ0EnIC0gMTApOwotICAgIGVsc2UKLQlpICs9IGNoIC0gKCdhJyAtIDEwKTsKLSAgICByZXR1cm4gaTsKLSNlbHNlIC8qQ0hBUlNFVF9FQkNESUMqLwotICAgIHJldHVybiAoMSA9PSBzc2NhbmYoeCwgIiUyeCIsICZpKSkgPyBvc190b2ViY2RpY1tpJjB4RkZdIDogMDsKLSNlbmRpZiAvKkNIQVJTRVRfRUJDRElDKi8KLX0KLQotdm9pZCBhcF9wcm94eV9jMmhleChpbnQgY2gsIGNoYXIgKngpCi17Ci0jaWZuZGVmIENIQVJTRVRfRUJDRElDCi0gICAgaW50IGk7Ci0KLSAgICB4WzBdID0gJyUnOwotICAgIGkgPSAoY2ggJiAweEYwKSA+PiA0OwotICAgIGlmIChpID49IDEwKQotCXhbMV0gPSAoJ0EnIC0gMTApICsgaTsKLSAgICBlbHNlCi0JeFsxXSA9ICcwJyArIGk7Ci0KLSAgICBpID0gY2ggJiAweDBGOwotICAgIGlmIChpID49IDEwKQotCXhbMl0gPSAoJ0EnIC0gMTApICsgaTsKLSAgICBlbHNlCi0JeFsyXSA9ICcwJyArIGk7Ci0jZWxzZSAvKkNIQVJTRVRfRUJDRElDKi8KLSAgICBzdGF0aWMgY29uc3QgY2hhciBudG9hW10gPSB7ICIwMTIzNDU2Nzg5QUJDREVGIiB9OwotICAgIGNoICY9IDB4RkY7Ci0gICAgeFswXSA9ICclJzsKLSAgICB4WzFdID0gbnRvYVsob3NfdG9hc2NpaVtjaF0+PjQpJjB4MEZdOwotICAgIHhbMl0gPSBudG9hW29zX3RvYXNjaWlbY2hdJjB4MEZdOwotICAgIHhbM10gPSAnXDAnOwotI2VuZGlmIC8qQ0hBUlNFVF9FQkNESUMqLwotfQotCi0vKgotICogY2Fub25pY2FsaXNlIGEgVVJMLWVuY29kZWQgc3RyaW5nCi0gKi8KLQotLyoKLSAqIENvbnZlcnQgYSBVUkwtZW5jb2RlZCBzdHJpbmcgdG8gY2Fub25pY2FsIGZvcm0uCi0gKiBJdCBkZWNvZGVzIGNoYXJhY3RlcnMgd2hpY2ggbmVlZCBub3QgYmUgZW5jb2RlZCwKLSAqIGFuZCBlbmNvZGVzIHRob3NlIHdoaWNoIG11c3QgYmUgZW5jb2RlZCwgYW5kIGRvZXMgbm90IHRvdWNoCi0gKiB0aG9zZSB3aGljaCBtdXN0IG5vdCBiZSB0b3VjaGVkLgotICovCi1jaGFyICoKLSAgICAgYXBfcHJveHlfY2Fub25lbmMocG9vbCAqcCwgY29uc3QgY2hhciAqeCwgaW50IGxlbiwgZW51bSBlbmN0eXBlIHQsIGludCBpc2VuYykKLXsKLSAgICBpbnQgaSwgaiwgY2g7Ci0gICAgY2hhciAqeTsKLSAgICBjb25zdCBjaGFyICphbGxvd2VkOwkvKiBjaGFyYWN0ZXJzIHdoaWNoIHNob3VsZCBub3QgYmUgZW5jb2RlZCAqLwotICAgIGNvbnN0IGNoYXIgKnJlc2VydmVkOwkvKiBjaGFyYWN0ZXJzIHdoaWNoIG11Y2ggbm90IGJlIGVuL2RlLWNvZGVkICovCi0KLS8qIE4uQi4gaW4gYWRkaXRpb24gdG8gOkAmPSwgdGhpcyBhbGxvd3MgJzsnIGluIGFuIGh0dHAgcGF0aAotICogYW5kICc/JyBpbiBhbiBmdHAgcGF0aCAtLSB0aGlzIG1heSBiZSByZXZpc2VkCi0gKiAKLSAqIEFsc28sIGl0IG1ha2VzIGEgJysnIGNoYXJhY3RlciBpbiBhIHNlYXJjaCBzdHJpbmcgcmVzZXJ2ZWQsIGFzCi0gKiBpdCBtYXkgYmUgZm9ybS1lbmNvZGVkLiAoQWx0aG91Z2ggUkZDIDE3MzggZG9lc24ndCBhbGxvdyB0aGlzIC0KLSAqIGl0IG9ubHkgcGVybWl0cyA7IC8gPyA6IEAgPSAmIGFzIHJlc2VydmVkIGNoYXJzLikKLSAqLwotICAgIGlmICh0ID09IGVuY19wYXRoKQotCWFsbG93ZWQgPSAiJC1fLishKicoKSw7OkAmPSI7Ci0gICAgZWxzZSBpZiAodCA9PSBlbmNfc2VhcmNoKQotCWFsbG93ZWQgPSAiJC1fLiEqJygpLDs6QCY9IjsKLSAgICBlbHNlIGlmICh0ID09IGVuY191c2VyKQotCWFsbG93ZWQgPSAiJC1fLishKicoKSw7QCY9IjsKLSAgICBlbHNlIGlmICh0ID09IGVuY19mcGF0aCkKLQlhbGxvd2VkID0gIiQtXy4rISonKCksPzpAJj0iOwotICAgIGVsc2UJCQkvKiBpZiAodCA9PSBlbmNfcGFybSkgKi8KLQlhbGxvd2VkID0gIiQtXy4rISonKCksPy86QCY9IjsKLQotICAgIGlmICh0ID09IGVuY19wYXRoKQotCXJlc2VydmVkID0gIi8iOwotICAgIGVsc2UgaWYgKHQgPT0gZW5jX3NlYXJjaCkKLQlyZXNlcnZlZCA9ICIrIjsKLSAgICBlbHNlCi0JcmVzZXJ2ZWQgPSAiIjsKLQotICAgIHkgPSBhcF9wYWxsb2MocCwgMyAqIGxlbiArIDEpOwotCi0gICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBsZW47IGkrKywgaisrKSB7Ci0vKiBhbHdheXMgaGFuZGxlICcvJyBmaXJzdCAqLwotCWNoID0geFtpXTsKLQlpZiAoc3RyY2hyKHJlc2VydmVkLCBjaCkpIHsKLQkgICAgeVtqXSA9IGNoOwotCSAgICBjb250aW51ZTsKLQl9Ci0vKiBkZWNvZGUgaXQgaWYgbm90IGFscmVhZHkgZG9uZSAqLwotCWlmIChpc2VuYyAmJiBjaCA9PSAnJScpIHsKLQkgICAgaWYgKCFhcF9pc3hkaWdpdCh4W2kgKyAxXSkgfHwgIWFwX2lzeGRpZ2l0KHhbaSArIDJdKSkKLQkJcmV0dXJuIE5VTEw7Ci0JICAgIGNoID0gYXBfcHJveHlfaGV4MmMoJnhbaSArIDFdKTsKLQkgICAgaSArPSAyOwotCSAgICBpZiAoY2ggIT0gMCAmJiBzdHJjaHIocmVzZXJ2ZWQsIGNoKSkgewkvKiBrZWVwIGl0IGVuY29kZWQgKi8KLQkJYXBfcHJveHlfYzJoZXgoY2gsICZ5W2pdKTsKLQkJaiArPSAyOwotCQljb250aW51ZTsKLQkgICAgfQotCX0KLS8qIHJlY29kZSBpdCwgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKCFhcF9pc2FsbnVtKGNoKSAmJiAhc3RyY2hyKGFsbG93ZWQsIGNoKSkgewotCSAgICBhcF9wcm94eV9jMmhleChjaCwgJnlbal0pOwotCSAgICBqICs9IDI7Ci0JfQotCWVsc2UKLQkgICAgeVtqXSA9IGNoOwotICAgIH0KLSAgICB5W2pdID0gJ1wwJzsKLSAgICByZXR1cm4geTsKLX0KLQotLyoKLSAqIFBhcnNlcyBuZXR3b3JrLWxvY2F0aW9uLgotICogICAgdXJscCAgICAgICAgICAgb24gaW5wdXQgdGhlIFVSTDsgb24gb3V0cHV0IHRoZSBwYXRoLCBhZnRlciB0aGUgbGVhZGluZyAvCi0gKiAgICB1c2VyICAgICAgICAgICBOVUxMIGlmIG5vIHVzZXIvcGFzc3dvcmQgcGVybWl0dGVkCi0gKiAgICBwYXNzd29yZCAgICAgICBob2xkZXIgZm9yIHBhc3N3b3JkCi0gKiAgICBob3N0ICAgICAgICAgICBob2xkZXIgZm9yIGhvc3QKLSAqICAgIHBvcnQgICAgICAgICAgIHBvcnQgbnVtYmVyOyBvbmx5IHNldCBpZiBvbmUgaXMgc3VwcGxpZWQuCi0gKgotICogUmV0dXJucyBhbiBlcnJvciBzdHJpbmcuCi0gKi8KLWNoYXIgKgotICAgICBhcF9wcm94eV9jYW5vbl9uZXRsb2MocG9vbCAqcCwgY2hhciAqKmNvbnN0IHVybHAsIGNoYXIgKip1c2VycCwKLQkJCWNoYXIgKipwYXNzd29yZHAsIGNoYXIgKipob3N0cCwgaW50ICpwb3J0KQotewotICAgIGludCBpOwotICAgIGNoYXIgKnN0cnAsICpob3N0LCAqdXJsID0gKnVybHA7Ci0gICAgY2hhciAqdXNlciA9IE5VTEwsICpwYXNzd29yZCA9IE5VTEw7Ci0KLSAgICBpZiAodXJsWzBdICE9ICcvJyB8fCB1cmxbMV0gIT0gJy8nKQotCXJldHVybiAiTWFsZm9ybWVkIFVSTCI7Ci0gICAgaG9zdCA9IHVybCArIDI7Ci0gICAgdXJsID0gc3RyY2hyKGhvc3QsICcvJyk7Ci0gICAgaWYgKHVybCA9PSBOVUxMKQotCXVybCA9ICIiOwotICAgIGVsc2UKLQkqKHVybCsrKSA9ICdcMCc7CS8qIHNraXAgc2VwZXJhdGluZyAnLycgKi8KLQotICAgIC8qIGZpbmQgX2xhc3RfICdAJyBzaW5jZSBpdCBtaWdodCBvY2N1ciBpbiB1c2VyL3Bhc3N3b3JkIHBhcnQgKi8KLSAgICBzdHJwID0gc3RycmNocihob3N0LCAnQCcpOwotCi0gICAgaWYgKHN0cnAgIT0gTlVMTCkgewotCSpzdHJwID0gJ1wwJzsKLQl1c2VyID0gaG9zdDsKLQlob3N0ID0gc3RycCArIDE7Ci0KLS8qIGZpbmQgcGFzc3dvcmQgKi8KLQlzdHJwID0gc3RyY2hyKHVzZXIsICc6Jyk7Ci0JaWYgKHN0cnAgIT0gTlVMTCkgewotCSAgICAqc3RycCA9ICdcMCc7Ci0JICAgIHBhc3N3b3JkID0gYXBfcHJveHlfY2Fub25lbmMocCwgc3RycCArIDEsIHN0cmxlbihzdHJwICsgMSksIGVuY191c2VyLCAxKTsKLQkgICAgaWYgKHBhc3N3b3JkID09IE5VTEwpCi0JCXJldHVybiAiQmFkICUtZXNjYXBlIGluIFVSTCAocGFzc3dvcmQpIjsKLQl9Ci0KLQl1c2VyID0gYXBfcHJveHlfY2Fub25lbmMocCwgdXNlciwgc3RybGVuKHVzZXIpLCBlbmNfdXNlciwgMSk7Ci0JaWYgKHVzZXIgPT0gTlVMTCkKLQkgICAgcmV0dXJuICJCYWQgJS1lc2NhcGUgaW4gVVJMICh1c2VybmFtZSkiOwotICAgIH0KLSAgICBpZiAodXNlcnAgIT0gTlVMTCkgewotCSp1c2VycCA9IHVzZXI7Ci0gICAgfQotICAgIGlmIChwYXNzd29yZHAgIT0gTlVMTCkgewotCSpwYXNzd29yZHAgPSBwYXNzd29yZDsKLSAgICB9Ci0KLSAgICBzdHJwID0gc3RycmNocihob3N0LCAnOicpOwotICAgIGlmIChzdHJwICE9IE5VTEwpIHsKLQkqKHN0cnArKykgPSAnXDAnOwotCi0JZm9yIChpID0gMDsgc3RycFtpXSAhPSAnXDAnOyBpKyspCi0JICAgIGlmICghYXBfaXNkaWdpdChzdHJwW2ldKSkKLQkJYnJlYWs7Ci0KLQkvKiBpZiAoaSA9PSAwKSB0aGUgbm8gcG9ydCB3YXMgZ2l2ZW47IGtlZXAgZGVmYXVsdCAqLwotCWlmIChzdHJwW2ldICE9ICdcMCcpIHsKLQkgICAgcmV0dXJuICJCYWQgcG9ydCBudW1iZXIgaW4gVVJMIjsKLQl9IGVsc2UgaWYgKGkgPiAwKSB7Ci0JICAgICpwb3J0ID0gYXRvaShzdHJwKTsKLQkgICAgaWYgKCpwb3J0ID4gNjU1MzUpCi0JCXJldHVybiAiUG9ydCBudW1iZXIgaW4gVVJMID4gNjU1MzUiOwotCX0KLSAgICB9Ci0gICAgYXBfc3RyX3RvbG93ZXIoaG9zdCk7CQkvKiBETlMgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgKi8KLSAgICBpZiAoKmhvc3QgPT0gJ1wwJykKLQlyZXR1cm4gIk1pc3NpbmcgaG9zdCBpbiBVUkwiOwotLyogY2hlY2sgaG9zdG5hbWUgc3ludGF4ICovCi0gICAgZm9yIChpID0gMDsgaG9zdFtpXSAhPSAnXDAnOyBpKyspCi0JaWYgKCFhcF9pc2RpZ2l0KGhvc3RbaV0pICYmIGhvc3RbaV0gIT0gJy4nKQotCSAgICBicmVhazsKLSAgICAvKiBtdXN0IGJlIGFuIElQIGFkZHJlc3MgKi8KLSNpZmRlZiBXSU4zMgotICAgIGlmIChob3N0W2ldID09ICdcMCcgJiYgKGluZXRfYWRkcihob3N0KSA9PSAtMSkpCi0jZWxzZQotICAgIGlmIChob3N0W2ldID09ICdcMCcgJiYgKGFwX2luZXRfYWRkcihob3N0KSA9PSAtMSB8fCBpbmV0X25ldHdvcmsoaG9zdCkgPT0gLTEpKQotI2VuZGlmCi0gICAgewotCXJldHVybiAiQmFkIElQIGFkZHJlc3MgaW4gVVJMIjsKLSAgICB9Ci0KLS8qICAgIGlmIChzdHJjaHIoaG9zdCwnLicpID09IE5VTEwgJiYgZG9tYWluICE9IE5VTEwpCi0gICBob3N0ID0gcHN0cmNhdChwLCBob3N0LCBkb21haW4sIE5VTEwpOwotICovCi0gICAgKnVybHAgPSB1cmw7Ci0gICAgKmhvc3RwID0gaG9zdDsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGx3ZGF5WzddID0KLXsiU3VuZGF5IiwgIk1vbmRheSIsICJUdWVzZGF5IiwgIldlZG5lc2RheSIsICJUaHVyc2RheSIsICJGcmlkYXkiLCAiU2F0dXJkYXkifTsKLQotLyoKLSAqIElmIHRoZSBkYXRlIGlzIGEgdmFsaWQgUkZDIDg1MCBkYXRlIG9yIGFzY3RpbWUoKSBkYXRlLCB0aGVuIGl0Ci0gKiBpcyBjb252ZXJ0ZWQgdG8gdGhlIFJGQyAxMTIzIGZvcm1hdCwgb3RoZXJ3aXNlIGl0IGlzIG5vdCBtb2RpZmllZC4KLSAqIFRoaXMgcm91dGluZSBpcyBub3QgdmVyeSBmYXN0IGF0IGRvaW5nIGNvbnZlcnNpb25zLCBhcyBpdCB1c2VzCi0gKiBzc2NhbmYgYW5kIHNwcmludGYuIEhvd2V2ZXIsIGlmIHRoZSBkYXRlIGlzIGFscmVhZHkgY29ycmVjdGx5Ci0gKiBmb3JtYXR0ZWQsIHRoZW4gaXQgZXhpdHMgdmVyeSBxdWlja2x5LgotICovCi1jb25zdCBjaGFyICoKLSAgICAgYXBfcHJveHlfZGF0ZV9jYW5vbihwb29sICpwLCBjb25zdCBjaGFyICp4KQotewotICAgIGludCB3aywgbWRheSwgeWVhciwgaG91ciwgbWluLCBzZWMsIG1vbjsKLSAgICBjaGFyICpxLCBtb250aFs0XSwgem9uZVs0XSwgd2Vla1s0XTsKLQotICAgIHEgPSBzdHJjaHIoeCwgJywnKTsKLSAgICAvKiBjaGVjayBmb3IgUkZDIDg1MCBkYXRlICovCi0gICAgaWYgKHEgIT0gTlVMTCAmJiBxIC0geCA+IDMgJiYgcVsxXSA9PSAnICcpIHsKLQkqcSA9ICdcMCc7Ci0JZm9yICh3ayA9IDA7IHdrIDwgNzsgd2srKykKLQkgICAgaWYgKHN0cmNtcCh4LCBsd2RheVt3a10pID09IDApCi0JCWJyZWFrOwotCSpxID0gJywnOwotCWlmICh3ayA9PSA3KQotCSAgICByZXR1cm4geDsJCS8qIG5vdCBhIHZhbGlkIGRhdGUgKi8KLQlpZiAocVs0XSAhPSAnLScgfHwgcVs4XSAhPSAnLScgfHwgcVsxMV0gIT0gJyAnIHx8IHFbMTRdICE9ICc6JyB8fAotCSAgICBxWzE3XSAhPSAnOicgfHwgc3RyY21wKCZxWzIwXSwgIiBHTVQiKSAhPSAwKQotCSAgICByZXR1cm4geDsKLQlpZiAoc3NjYW5mKHEgKyAyLCAiJXUtJTNzLSV1ICV1OiV1OiV1ICUzcyIsICZtZGF5LCBtb250aCwgJnllYXIsCi0JCSAgICZob3VyLCAmbWluLCAmc2VjLCB6b25lKSAhPSA3KQotCSAgICByZXR1cm4geDsKLQlpZiAoeWVhciA8IDcwKQotCSAgICB5ZWFyICs9IDIwMDA7Ci0JZWxzZQotCSAgICB5ZWFyICs9IDE5MDA7Ci0gICAgfQotICAgIGVsc2UgewotLyogY2hlY2sgZm9yIGFjc3RpbWUoKSBkYXRlICovCi0JaWYgKHhbM10gIT0gJyAnIHx8IHhbN10gIT0gJyAnIHx8IHhbMTBdICE9ICcgJyB8fCB4WzEzXSAhPSAnOicgfHwKLQkgICAgeFsxNl0gIT0gJzonIHx8IHhbMTldICE9ICcgJyB8fCB4WzI0XSAhPSAnXDAnKQotCSAgICByZXR1cm4geDsKLQlpZiAoc3NjYW5mKHgsICIlM3MgJTNzICV1ICV1OiV1OiV1ICV1Iiwgd2VlaywgbW9udGgsICZtZGF5LCAmaG91ciwKLQkJICAgJm1pbiwgJnNlYywgJnllYXIpICE9IDcpCi0JICAgIHJldHVybiB4OwotCWZvciAod2sgPSAwOyB3ayA8IDc7IHdrKyspCi0JICAgIGlmIChzdHJjbXAod2VlaywgYXBfZGF5X3NuYW1lc1t3a10pID09IDApCi0JCWJyZWFrOwotCWlmICh3ayA9PSA3KQotCSAgICByZXR1cm4geDsKLSAgICB9Ci0KLS8qIGNoZWNrIGRhdGUgKi8KLSAgICBmb3IgKG1vbiA9IDA7IG1vbiA8IDEyOyBtb24rKykKLQlpZiAoc3RyY21wKG1vbnRoLCBhcF9tb250aF9zbmFtZXNbbW9uXSkgPT0gMCkKLQkgICAgYnJlYWs7Ci0gICAgaWYgKG1vbiA9PSAxMikKLQlyZXR1cm4geDsKLQotICAgIHEgPSBhcF9wYWxsb2MocCwgMzApOwotICAgIGFwX3NucHJpbnRmKHEsIDMwLCAiJXMsICUuMmQgJXMgJWQgJS4yZDolLjJkOiUuMmQgR01UIiwgYXBfZGF5X3NuYW1lc1t3a10sIG1kYXksCi0JCWFwX21vbnRoX3NuYW1lc1ttb25dLCB5ZWFyLCBob3VyLCBtaW4sIHNlYyk7Ci0gICAgcmV0dXJuIHE7Ci19Ci0KLQotLyogTk9URTogVGhpcyByb3V0aW5lIGlzIHRha2VuIGZyb20gaHR0cF9wcm90b2NvbDo6Z2V0bGluZSgpCi0gKiBiZWNhdXNlIHRoZSBvbGQgY29kZSBmb3VuZCBpbiB0aGUgcHJveHkgbW9kdWxlIHdhcyB0b28KLSAqIGRpZmZpY3VsdCB0byB1bmRlcnN0YW5kIGFuZCBtYWludGFpbi4KLSAqLwotLyogR2V0IGEgbGluZSBvZiBwcm90b2NvbCBpbnB1dCwgaW5jbHVkaW5nIGFueSBjb250aW51YXRpb24gbGluZXMKLSAqIGNhdXNlZCBieSBNSU1FIGZvbGRpbmcgKG9yIGJyb2tlbiBjbGllbnRzKSBpZiBmb2xkICE9IDAsIGFuZCBwbGFjZSBpdAotICogaW4gdGhlIGJ1ZmZlciBzLCBvZiBzaXplIG4gYnl0ZXMsIHdpdGhvdXQgdGhlIGVuZGluZyBuZXdsaW5lLgotICoKLSAqIFJldHVybnMgLTEgb24gZXJyb3IsIG9yIHRoZSBsZW5ndGggb2Ygcy4KLSAqCi0gKiBOb3RlOiBCZWNhdXNlIGJnZXRzIHVzZXMgMSBjaGFyIGZvciBuZXdsaW5lIGFuZCAxIGNoYXIgZm9yIE5VTCwKLSAqICAgICAgIHRoZSBtb3N0IHdlIGNhbiBnZXQgaXMgKG4gLSAyKSBhY3R1YWwgY2hhcmFjdGVycyBpZiBpdAotICogICAgICAgd2FzIGVuZGVkIGJ5IGEgbmV3bGluZSwgb3IgKG4gLSAxKSBjaGFyYWN0ZXJzIGlmIHRoZSBsaW5lCi0gKiAgICAgICBsZW5ndGggZXhjZWVkZWQgKG4gLSAxKS4gIFNvLCBpZiB0aGUgcmVzdWx0ID09IChuIC0gMSksCi0gKiAgICAgICB0aGVuIHRoZSBhY3R1YWwgaW5wdXQgbGluZSBleGNlZWRlZCB0aGUgYnVmZmVyIGxlbmd0aCwKLSAqICAgICAgIGFuZCBpdCB3b3VsZCBiZSBhIGdvb2QgaWRlYSBmb3IgdGhlIGNhbGxlciB0byBwdWtlIDQwMCBvciA0MTQuCi0gKi8KLXN0YXRpYyBpbnQgcHJveHlfZ2V0bGluZShjaGFyICpzLCBpbnQgbiwgQlVGRiAqaW4sIGludCBmb2xkKQotewotICAgIGNoYXIgKnBvcywgbmV4dDsKLSAgICBpbnQgcmV0dmFsOwotICAgIGludCB0b3RhbCA9IDA7Ci0KLSAgICBwb3MgPSBzOwotCi0gICAgZG8gewotICAgICAgICByZXR2YWwgPSBhcF9iZ2V0cyhwb3MsIG4sIGluKTsgICAgIC8qIHJldHZhbCA9PSAtMSBpZiBlcnJvciwgMCBpZiBFT0YgKi8KLQotICAgICAgICBpZiAocmV0dmFsIDw9IDApCi0gICAgICAgICAgICByZXR1cm4gKChyZXR2YWwgPCAwKSAmJiAodG90YWwgPT0gMCkpID8gLTEgOiB0b3RhbDsKLQotICAgICAgICAvKiByZXR2YWwgaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQsIG5vdCBpbmNsdWRpbmcgTlVMICAgICAgKi8KLQotICAgICAgICBuIC09IHJldHZhbDsgICAgICAgICAgICAvKiBLZWVwIHRyYWNrIG9mIGhvdyBtdWNoIG9mIHMgaXMgZnVsbCAgICAgKi8KLSAgICAgICAgcG9zICs9IChyZXR2YWwgLSAxKTsgICAgLyogYW5kIHdoZXJlIHMgZW5kcyAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHRvdGFsICs9IHJldHZhbDsgICAgICAgIC8qIGFuZCBob3cgbG9uZyBzIGhhcyBiZWNvbWUgICAgICAgICAgICAgICAqLwotCi0gICAgICAgIGlmICgqcG9zID09ICdcbicpIHsgICAgIC8qIERpZCB3ZSBnZXQgYSBmdWxsIGxpbmUgb2YgaW5wdXQ/ICAgICAgICAqLwotICAgICAgICAgICAgKnBvcyA9ICdcMCc7Ci0gICAgICAgICAgICAtLXRvdGFsOwotICAgICAgICAgICAgKytuOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiB0b3RhbDsgICAgICAgLyogaWYgbm90LCBpbnB1dCBsaW5lIGV4Y2VlZGVkIGJ1ZmZlciBzaXplICovCi0KLSAgICAgICAgLyogQ29udGludWUgYXBwZW5kaW5nIGlmIGxpbmUgZm9sZGluZyBpcyBkZXNpcmVkIGFuZAotICAgICAgICAgKiB0aGUgbGFzdCBsaW5lIHdhcyBub3QgZW1wdHkgYW5kIHdlIGhhdmUgcm9vbSBpbiB0aGUgYnVmZmVyIGFuZAotICAgICAgICAgKiB0aGUgbmV4dCBsaW5lIGJlZ2lucyB3aXRoIGEgY29udGludWF0aW9uIGNoYXJhY3Rlci4KLSAgICAgICAgICovCi0gICAgfSB3aGlsZSAoZm9sZCAmJiAocmV0dmFsICE9IDEpICYmIChuID4gMSkKLSAgICAgICAgICAgICAgICAgICYmIChhcF9ibG9va2MoJm5leHQsIGluKSA9PSAxKQotICAgICAgICAgICAgICAgICAgJiYgKChuZXh0ID09ICcgJykgfHwgKG5leHQgPT0gJ1x0JykpKTsKLQotICAgIHJldHVybiB0b3RhbDsKLX0KLQotCi0vKgotICogUmVhZHMgaGVhZGVycyBmcm9tIGEgYnVmZmVyIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIGhlYWRlcnMuCi0gKiBSZXR1cm5zIE5VTEwgb24gZmlsZSBlcnJvcgotICogVGhpcyByb3V0aW5lIHRyaWVzIHRvIGRlYWwgd2l0aCB0b28gbG9uZyBsaW5lcyBhbmQgY29udGludWF0aW9uIGxpbmVzLgotICogQEBAOiBYWFg6IEZJWE1FOiBjdXJyZW50bHkgdGhlIGhlYWRlcnMgYXJlIHBhc3NlZCB0aHJ1IHVuLW1lcmdlZC4gCi0gKiBJcyB0aGF0IG9rYXksIG9yIHNob3VsZCB0aGV5IGJlIGNvbGxhcHNlZCB3aGVyZSBwb3NzaWJsZT8KLSAqLwotdGFibGUgKmFwX3Byb3h5X3JlYWRfaGVhZGVycyhyZXF1ZXN0X3JlYyAqciwgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSwgQlVGRiAqZikKLXsKLSAgICB0YWJsZSAqcmVzcF9oZHJzOwotICAgIGludCBsZW47Ci0gICAgY2hhciAqdmFsdWUsICplbmQ7Ci0gICAgY2hhciBmaWVsZFtNQVhfU1RSSU5HX0xFTl07Ci0KLSAgICByZXNwX2hkcnMgPSBhcF9tYWtlX3RhYmxlKHItPnBvb2wsIDIwKTsKLQotICAgIC8qCi0gICAgICogUmVhZCBoZWFkZXIgbGluZXMgdW50aWwgd2UgZ2V0IHRoZSBlbXB0eSBzZXBhcmF0b3IgbGluZSwgYSByZWFkIGVycm9yLAotICAgICAqIHRoZSBjb25uZWN0aW9uIGNsb3NlcyAoRU9GKSwgb3Igd2UgdGltZW91dC4KLSAgICAgKi8KLSAgICB3aGlsZSAoKGxlbiA9IHByb3h5X2dldGxpbmUoYnVmZmVyLCBzaXplLCBmLCAxKSkgPiAwKSB7Ci0JCi0JaWYgKCEodmFsdWUgPSBzdHJjaHIoYnVmZmVyLCAnOicpKSkgeyAgICAgLyogRmluZCB0aGUgY29sb24gc2VwYXJhdG9yICovCi0KLQkgICAgLyogQnVnZ3kgTVMgSUlTIHNlcnZlcnMgc29tZXRpbWVzIHJldHVybiBpbnZhbGlkIGhlYWRlcnMKLQkgICAgICogKGFuIGV4dHJhICJIVFRQLzEuMCAyMDAsIE9LIiBsaW5lIHNwcmlua2xlZCBpbiBiZXR3ZWVuCi0JICAgICAqIHRoZSB1c3VhbCBNSU1FIGhlYWRlcnMpLiBUcnkgdG8gZGVhbCB3aXRoIGl0IGluIGEgc2Vuc2libGUKLQkgICAgICogd2F5LCBidXQgbG9nIHRoZSBmYWN0LgotCSAgICAgKiBYWFg6IFRoZSBtYXNrIGNoZWNrIGlzIGJ1Z2d5IGlmIHdlIGV2ZXIgc2VlIGFuIEhUVFAvMS4xMCAqLwotCi0JICAgIGlmICghYXBfY2hlY2ttYXNrKGJ1ZmZlciwgIkhUVFAvIy4jICMjIyoiKSkgewotCQkvKiBOb3BlLCBpdCB3YXNuJ3QgZXZlbiBhbiBleHRyYSBIVFRQIGhlYWRlci4gR2l2ZSB1cC4gKi8KLQkJcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklOR3xBUExPR19OT0VSUk5PLCByLT5zZXJ2ZXIsCi0JCQkgInByb3h5OiBJZ25vcmluZyBkdXBsaWNhdGUgSFRUUCBoZWFkZXIgIgotCQkJICJyZXR1cm5lZCBieSAlcyAoJXMpIiwgci0+dXJpLCByLT5tZXRob2QpOwotCSAgICBjb250aW51ZTsKLQl9Ci0KLSAgICAgICAgKnZhbHVlID0gJ1wwJzsKLSAgICAgICAgKyt2YWx1ZTsKLQkvKiBYWFg6IFJGQzIwNjggZGVmaW5lcyBvbmx5IFNQIGFuZCBIVCBhcyB3aGl0ZXNwYWNlLCB0aGlzIHRlc3QgaXMKLQkgKiB3cm9uZy4uLiBhbmQgc28gYXJlIG1hbnkgb3RoZXJzIHByb2JhYmx5LgotCSAqLwotICAgICAgICB3aGlsZSAoYXBfaXNzcGFjZSgqdmFsdWUpKQotICAgICAgICAgICAgKyt2YWx1ZTsgICAgICAgICAgICAvKiBTa2lwIHRvIHN0YXJ0IG9mIHZhbHVlICAgKi8KLQotCS8qIHNob3VsZCBzdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlIGFzIHdlbGwgKi8KLQlmb3IgKGVuZCA9ICZ2YWx1ZVtzdHJsZW4odmFsdWUpLTFdOyBlbmQgPiB2YWx1ZSAmJiBhcF9pc3NwYWNlKCplbmQpOyAtLWVuZCkKLQkgICAgKmVuZCA9ICdcMCc7Ci0KLSAgICAgICAgYXBfdGFibGVfYWRkKHJlc3BfaGRycywgYnVmZmVyLCB2YWx1ZSk7Ci0KLQkvKiB0aGUgaGVhZGVyIHdhcyB0b28gbG9uZzsgYXQgdGhlIGxlYXN0IHdlIHNob3VsZCBza2lwIGV4dHJhIGRhdGEgKi8KLQlpZiAobGVuID49IHNpemUgLSAxKSB7IAotCSAgICB3aGlsZSAoKGxlbiA9IHByb3h5X2dldGxpbmUoZmllbGQsIE1BWF9TVFJJTkdfTEVOLCBmLCAxKSkKLQkJICAgID49IE1BWF9TVFJJTkdfTEVOIC0gMSkgewotCQkvKiBzb2FrIHVwIHRoZSBleHRyYSBkYXRhICovCi0JICAgIH0KLQkgICAgaWYgKGxlbiA9PSAwKSAvKiB0aW1lIHRvIGV4aXQgdGhlIGxhcmdlciBsb29wIGFzIHdlbGwgKi8KLQkJYnJlYWs7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gcmVzcF9oZHJzOwotfQotCi1sb25nIGludCBhcF9wcm94eV9zZW5kX2ZiKEJVRkYgKmYsIHJlcXVlc3RfcmVjICpyLCBjYWNoZV9yZXEgKmMpCi17Ci0gICAgaW50ICBvazsKLSAgICBjaGFyIGJ1ZltJT0JVRlNJWkVdOwotICAgIGxvbmcgdG90YWxfYnl0ZXNfcmN2ZDsKLSAgICByZWdpc3RlciBpbnQgbiwgbywgdzsKLSAgICBjb25uX3JlYyAqY29uID0gci0+Y29ubmVjdGlvbjsKLSAgICBpbnQgYWx0ZXJuYXRlX3RpbWVvdXRzID0gMTsJLyogMSBpZiB3ZSBhbHRlcm5hdGUgYmV0d2VlbiBzb2Z0ICYgaGFyZCB0aW1lb3V0cyAqLwotCi0gICAgdG90YWxfYnl0ZXNfcmN2ZCA9IDA7Ci0gICAgaWYgKGMgIT0gTlVMTCkKLSAgICAgICAgYy0+d3JpdHRlbiA9IDA7Ci0KLSNpZmRlZiBDSEFSU0VUX0VCQ0RJQwotICAgIC8qIFRoZSBjYWNoZSBjb3B5IGlzIEFTQ0lJLCBub3QgRUJDRElDLCBldmVuIGZvciB0ZXh0L2h0bWwpICovCi0gICAgYXBfYnNldGZsYWcoZiwgQl9BU0NJSTJFQkNESUN8Ql9FQkNESUMyQVNDSUksIDApOwotICAgIGlmIChjICE9IE5VTEwgJiYgYy0+ZnAgIT0gTlVMTCkKLQlhcF9ic2V0ZmxhZyhjLT5mcCwgQl9BU0NJSTJFQkNESUN8Ql9FQkNESUMyQVNDSUksIDApOwotICAgIGFwX2JzZXRmbGFnKGNvbi0+Y2xpZW50LCBCX0FTQ0lJMkVCQ0RJQ3xCX0VCQ0RJQzJBU0NJSSwgMCk7Ci0jZW5kaWYKLQotICAgIC8qIFNpbmNlIHdlIGFyZSByZWFkaW5nIGZyb20gb25lIGJ1ZmZlciBhbmQgd3JpdGluZyB0byBhbm90aGVyLAotICAgICAqIGl0IGlzIHVuc2FmZSB0byBkbyBhIHNvZnRfdGltZW91dCBoZXJlLCBhdCBsZWFzdCB1bnRpbCB0aGUgcHJveHkKLSAgICAgKiBoYXMgaXRzIG93biB0aW1lb3V0IGhhbmRsZXIgd2hpY2ggY2FuIHNldCBib3RoIGJ1ZmZlcnMgdG8gRU9VVC4KLSAgICAgKi8KLQotICAgIGFwX2tpbGxfdGltZW91dChyKTsKLQotI2lmZGVmIFdJTjMyCi0gICAgLyogd29ya3MgZmluZSB1bmRlciB3aW4zMiwgc28gbGVhdmUgaXQgKi8KLSAgICBhcF9oYXJkX3RpbWVvdXQoInByb3h5IHNlbmQgYm9keSIsIHIpOwotICAgIGFsdGVybmF0ZV90aW1lb3V0cyA9IDA7Ci0jZWxzZQotICAgIC8qIENIRUNLTUUhIFNpbmNlIGhhcmRfdGltZW91dCB3b24ndCB3b3JrIGluIHVuaXggb24gc2VuZHMgd2l0aCBwYXJ0aWFsCi0gICAgICogY2FjaGUgY29tcGxldGlvbiwgd2UgaGF2ZSB0byBhbHRlcm5hdGUgYmV0d2VlbiBoYXJkX3RpbWVvdXQKLSAgICAgKiBmb3IgcmVhZHMsIGFuZCBzb2Z0X3RpbWVvdXQgZm9yIHNlbmQuICBUaGlzIGlzIGJlY2F1c2Ugd2UgbmVlZAotICAgICAqIHRvIGdldCBhIHJldHVybiBmcm9tIGFwX2J3cml0ZSB0byBiZSBhYmxlIHRvIGNvbnRpbnVlIGNhY2hpbmcuCi0gICAgICogQlVULCBpZiB3ZSAqY2FuJ3QqIGNvbnRpbnVlIGFueXdheSwganVzdCB1c2UgaGFyZF90aW1lb3V0LgotICAgICAqIChBbHNvLCBpZiBubyBjYWNoZSBmaWxlIGlzIHdyaXR0ZW4sIHVzZSBoYXJkIHRpbWVvdXRzKQotICAgICAqLwotCi0gICAgaWYgKGMgPT0gTlVMTCB8fCBjLT5sZW4gPD0gMCB8fCBjLT5jYWNoZV9jb21wbGV0aW9uID09IDEuMCkgewotICAgICAgICBhcF9oYXJkX3RpbWVvdXQoInByb3h5IHNlbmQgYm9keSIsIHIpOwotICAgICAgICBhbHRlcm5hdGVfdGltZW91dHMgPSAwOwotICAgIH0KLSNlbmRpZgotCi0gICAgLyogTG9vcCBhbmQgYXBfYnJlYWQoKSB3aGlsZSB3ZSBjYW4gc3VjY2Vzc2Z1bGx5IHJlYWQgYW5kIHdyaXRlLAotICAgICAqIG9yIChhZnRlciB0aGUgY2xpZW50IGFib3J0ZWQpIHdoaWxlIHdlIGNhbiBzdWNjZXNzZnVsbHkKLSAgICAgKiByZWFkIGFuZCBmaW5pc2ggdGhlIGNvbmZpZ3VyZWQgY2FjaGVfY29tcGxldGlvbi4KLSAgICAgKi8KLSAgICBmb3IgKG9rID0gMTsgb2s7ICkgewotICAgICAgICBpZiAoYWx0ZXJuYXRlX3RpbWVvdXRzKQotICAgICAgICAgICAgYXBfaGFyZF90aW1lb3V0KCJwcm94eSByZWN2IGJvZHkgZnJvbSB1cHN0cmVhbSBzZXJ2ZXIiLCByKTsKLQotCS8qIFJlYWQgYmxvY2sgZnJvbSBzZXJ2ZXIgKi8KLQluID0gYXBfYnJlYWQoZiwgYnVmLCBJT0JVRlNJWkUpOwotCi0gICAgICAgIGlmIChhbHRlcm5hdGVfdGltZW91dHMpCi0gICAgICAgICAgICBhcF9raWxsX3RpbWVvdXQocik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFwX3Jlc2V0X3RpbWVvdXQocik7Ci0KLQlpZiAobiA9PSAtMSkgewkJLyogaW5wdXQgZXJyb3IgKi8KLQkgICAgaWYgKGMgIT0gTlVMTCkgewotCQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgYy0+cmVxLAotCQkgICAgInByb3h5OiBlcnJvciByZWFkaW5nIGZyb20gJXMiLCBjLT51cmwpOwotCQljID0gYXBfcHJveHlfY2FjaGVfZXJyb3IoYyk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JfQotCWlmIChuID09IDApCi0JICAgIGJyZWFrOwkJLyogRU9GICovCi0JbyA9IDA7Ci0JdG90YWxfYnl0ZXNfcmN2ZCArPSBuOwotCi0JLyogV3JpdGUgdG8gY2FjaGUgZmlyc3QuICovCi0JLypAQEAgWFhYIEZJWE1FOiBBc3N1bWluZyB0aGF0IHdyaXRpbmcgdGhlIGNhY2hlIGZpbGUgd29uJ3QgdGltZSBvdXQ/ISE/ICovCi0gICAgICAgIGlmIChjICE9IE5VTEwgJiYgYy0+ZnAgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKGFwX2J3cml0ZShjLT5mcCwgJmJ1ZlswXSwgbikgIT0gbikgewotICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBjLT5yZXEsCi0JCSAgICAicHJveHk6IGVycm9yIHdyaXRpbmcgdG8gJXMiLCBjLT50ZW1wZmlsZSk7Ci0JCWMgPSBhcF9wcm94eV9jYWNoZV9lcnJvcihjKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYy0+d3JpdHRlbiArPSBuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQkvKiBXcml0ZSB0aGUgYmxvY2sgdG8gdGhlIGNsaWVudCwgZGV0ZWN0IGFib3J0ZWQgdHJhbnNmZXJzICovCi0gICAgICAgIHdoaWxlICghY29uLT5hYm9ydGVkICYmIG4gPiAwKSB7Ci0gICAgICAgICAgICBpZiAoYWx0ZXJuYXRlX3RpbWVvdXRzKQotICAgICAgICAgICAgICAgIGFwX3NvZnRfdGltZW91dCgicHJveHkgc2VuZCBib2R5Iiwgcik7Ci0KLSAgICAgICAgICAgIHcgPSBhcF9id3JpdGUoY29uLT5jbGllbnQsICZidWZbb10sIG4pOwotCi0gICAgICAgICAgICBpZiAoYWx0ZXJuYXRlX3RpbWVvdXRzKQotICAgICAgICAgICAgICAgIGFwX2tpbGxfdGltZW91dChyKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBhcF9yZXNldF90aW1lb3V0KHIpOwotCi0gICAgICAgICAgICBpZiAodyA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGMgIT0gTlVMTCAmJiBjLT5mcCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHdoZW4gYSBzZW5kIGZhaWx1cmUgb2NjdXJzLCB3ZSBuZWVkIHRvIGRlY2lkZQotICAgICAgICAgICAgICAgICAgICAgKiB3aGV0aGVyIHRvIGNvbnRpbnVlIGxvYWRpbmcgYW5kIGNhY2hpbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgICAqIGRvY3VtZW50LCBvciB0byBhYm9ydCB0aGUgd2hvbGUgdGhpbmcKLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIG9rID0gKGMtPmxlbiA+IDApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGMtPmNhY2hlX2NvbXBsZXRpb24gPiAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIChjLT5sZW4gKiBjLT5jYWNoZV9jb21wbGV0aW9uIDwgdG90YWxfYnl0ZXNfcmN2ZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCEgb2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX3BjbG9zZWYoYy0+cmVxLT5wb29sLCBjLT5mcC0+ZmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYy0+ZnAgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgdW5saW5rKGMtPnRlbXBmaWxlKTsKLQkJCWMgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbi0+YWJvcnRlZCA9IDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuIC09IHc7Ci0gICAgICAgICAgICBvICs9IHc7Ci0gICAgICAgIH0gLyogd2hpbGUgY2xpZW50IGFsaXZlIGFuZCBtb3JlIGRhdGEgdG8gc2VuZCAqLwotICAgIH0gLyogbG9vcCBhbmQgYXBfYnJlYWQgd2hpbGUgIm9rIiAqLwotCi0gICAgaWYgKCFjb24tPmFib3J0ZWQpCi0JYXBfYmZsdXNoKGNvbi0+Y2xpZW50KTsKLQotICAgIGFwX2tpbGxfdGltZW91dChyKTsKLSAgICByZXR1cm4gdG90YWxfYnl0ZXNfcmN2ZDsKLX0KLQotLyoKLSAqIFNlbmRzIHJlc3BvbnNlIGxpbmUgYW5kIGhlYWRlcnMuICBVc2VzIHRoZSBjbGllbnQgZmQgYW5kIHRoZSAKLSAqIGhlYWRlcnNfb3V0IGFycmF5IGZyb20gdGhlIHBhc3NlZCByZXF1ZXN0X3JlYyB0byB0YWxrIHRvIHRoZSBjbGllbnQKLSAqIGFuZCB0byBwcm9wZXJseSBzZXQgdGhlIGhlYWRlcnMgaXQgc2VuZHMgZm9yIHRoaW5ncyBzdWNoIGFzIGxvZ2dpbmcuCi0gKiAKLSAqIEEgdGltZW91dCBzaG91bGQgYmUgc2V0IGJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZS4KLSAqLwotdm9pZCBhcF9wcm94eV9zZW5kX2hlYWRlcnMocmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKnJlc3BsaW5lLCB0YWJsZSAqdCkKLXsKLSAgICBpbnQgaTsKLSAgICBCVUZGICpmcCA9IHItPmNvbm5lY3Rpb24tPmNsaWVudDsKLSAgICB0YWJsZV9lbnRyeSAqZWx0cyA9ICh0YWJsZV9lbnRyeSAqKSBhcF90YWJsZV9lbHRzKHQpLT5lbHRzOwotCi0gICAgYXBfYnZwdXRzKGZwLCByZXNwbGluZSwgQ1JMRiwgTlVMTCk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgYXBfdGFibGVfZWx0cyh0KS0+bmVsdHM7ICsraSkgewotCWlmIChlbHRzW2ldLmtleSAhPSBOVUxMKSB7Ci0JICAgIGFwX2J2cHV0cyhmcCwgZWx0c1tpXS5rZXksICI6ICIsIGVsdHNbaV0udmFsLCBDUkxGLCBOVUxMKTsKLQkgICAgYXBfdGFibGVfYWRkbihyLT5oZWFkZXJzX291dCwgZWx0c1tpXS5rZXksIGVsdHNbaV0udmFsKTsKLQl9Ci0gICAgfQotCi0gICAgYXBfYnB1dHMoQ1JMRiwgZnApOwotfQotCi0KLS8qCi0gKiBsaXN0IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY2FzZS1pbnNlbnNpdGl2ZSB0b2tlbnMsIHdpdGgKLSAqIG9wdGlvbmFsIHdoaXRlc3BhY2UgYXJvdW5kIHRoZSB0b2tlbnMuCi0gKiBUaGUgcmV0dXJuIHJldHVybnMgMSBpZiB0aGUgdG9rZW4gdmFsIGlzIGZvdW5kIGluIHRoZSBsaXN0LCBvciAwCi0gKiBvdGhlcndpc2UuCi0gKi8KLWludCBhcF9wcm94eV9saXN0c3RyKGNvbnN0IGNoYXIgKmxpc3QsIGNvbnN0IGNoYXIgKnZhbCkKLXsKLSAgICBpbnQgbGVuLCBpOwotICAgIGNvbnN0IGNoYXIgKnA7Ci0KLSAgICBsZW4gPSBzdHJsZW4odmFsKTsKLQotICAgIHdoaWxlIChsaXN0ICE9IE5VTEwpIHsKLQlwID0gc3RyY2hyKGxpc3QsICcsJyk7Ci0JaWYgKHAgIT0gTlVMTCkgewotCSAgICBpID0gcCAtIGxpc3Q7Ci0JICAgIGRvCi0JCXArKzsKLQkgICAgd2hpbGUgKGFwX2lzc3BhY2UoKnApKTsKLQl9Ci0JZWxzZQotCSAgICBpID0gc3RybGVuKGxpc3QpOwotCi0Jd2hpbGUgKGkgPiAwICYmIGFwX2lzc3BhY2UobGlzdFtpIC0gMV0pKQotCSAgICBpLS07Ci0JaWYgKGkgPT0gbGVuICYmIHN0cm5jYXNlY21wKGxpc3QsIHZhbCwgbGVuKSA9PSAwKQotCSAgICByZXR1cm4gMTsKLQlsaXN0ID0gcDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDQVNFX0JMSU5EX0ZJTEVTWVNURU0KLQotLyoKLSAqIE9uIHNvbWUgcGxhdGZvcm1zLCB0aGUgZmlsZSBzeXN0ZW0gaXMgTk9UIGNhc2Ugc2Vuc2l0aXZlLiBTbywgYSA9PSBBCi0gKiBuZWVkIHRvIG1hcCB0byBzbWFsbGVyIHNldCBvZiBjaGFyYWN0ZXJzCi0gKi8KLXZvaWQgYXBfcHJveHlfaGFzaChjb25zdCBjaGFyICppdCwgY2hhciAqdmFsLCBpbnQgbmRlcHRoLCBpbnQgbmxlbmd0aCkKLXsKLSAgICBBUF9NRDVfQ1RYIGNvbnRleHQ7Ci0gICAgdW5zaWduZWQgY2hhciBkaWdlc3RbMTZdOwotICAgIGNoYXIgdG1wWzI2XTsKLSAgICBpbnQgaSwgaywgZDsKLSAgICB1bnNpZ25lZCBpbnQgeDsKLSAgICBzdGF0aWMgY29uc3QgY2hhciBlbmNfdGFibGVbMzJdID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1IjsKLQotICAgIGFwX01ENUluaXQoJmNvbnRleHQpOwotICAgIGFwX01ENVVwZGF0ZSgmY29udGV4dCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgaXQsIHN0cmxlbihpdCkpOwotICAgIGFwX01ENUZpbmFsKGRpZ2VzdCwgJmNvbnRleHQpOwotCi0vKiBlbmNvZGUgMTI4IGJpdHMgYXMgMjYgY2hhcmFjdGVycywgdXNpbmcgYSBtb2RpZmllZCB1dWVuY29kaW5nICovCi0vKiB0aGUgZW5jb2RpbmcgaXMgNSBieXRlcyAtPiA4IGNoYXJhY3RlcnMKLSAqIGkuZS4gMTI4IGJpdHMgaXMgMyB4IDUgYnl0ZXMgKyAxIGJ5dGUgLT4gMyAqIDggY2hhcmFjdGVycyArIDIgY2hhcmFjdGVycwotICovCi0gICAgZm9yIChpID0gMCwgayA9IDA7IGkgPCAxNTsgaSArPSA1KSB7Ci0JeCA9IChkaWdlc3RbaV0gPDwgMjQpIHwgKGRpZ2VzdFtpICsgMV0gPDwgMTYpIHwgKGRpZ2VzdFtpICsgMl0gPDwgOCkgfCBkaWdlc3RbaSArIDNdOwotCXRtcFtrKytdID0gZW5jX3RhYmxlW3ggPj4gMjddOwotCXRtcFtrKytdID0gZW5jX3RhYmxlWyh4ID4+IDIyKSAmIDB4MWZdOwotCXRtcFtrKytdID0gZW5jX3RhYmxlWyh4ID4+IDE3KSAmIDB4MWZdOwotCXRtcFtrKytdID0gZW5jX3RhYmxlWyh4ID4+IDEyKSAmIDB4MWZdOwotCXRtcFtrKytdID0gZW5jX3RhYmxlWyh4ID4+IDcpICYgMHgxZl07Ci0JdG1wW2srK10gPSBlbmNfdGFibGVbKHggPj4gMikgJiAweDFmXTsKLQl4ID0gKCh4ICYgMHgzKSA8PCA4KSB8IGRpZ2VzdFtpICsgNF07Ci0JdG1wW2srK10gPSBlbmNfdGFibGVbeCA+PiA1XTsKLQl0bXBbaysrXSA9IGVuY190YWJsZVt4ICYgMHgxZl07Ci0gICAgfQotLyogb25lIGJ5dGUgbGVmdCAqLwotICAgIHggPSBkaWdlc3RbMTVdOwotICAgIHRtcFtrKytdID0gZW5jX3RhYmxlW3ggPj4gM107CS8qIHVzZSB1cCA1IGJpdHMgKi8KLSAgICB0bXBbaysrXSA9IGVuY190YWJsZVt4ICYgMHg3XTsKLSAgICAvKiBub3cgc3BsaXQgaW50byBkaXJlY3RvcnkgbGV2ZWxzICovCi0KLSAgICBmb3IgKGkgPSBrID0gZCA9IDA7IGQgPCBuZGVwdGg7ICsrZCkgewotCW1lbWNweSgmdmFsW2ldLCAmdG1wW2tdLCBubGVuZ3RoKTsKLQlrICs9IG5sZW5ndGg7Ci0JdmFsW2kgKyBubGVuZ3RoXSA9ICcvJzsKLQlpICs9IG5sZW5ndGggKyAxOwotICAgIH0KLSAgICBtZW1jcHkoJnZhbFtpXSwgJnRtcFtrXSwgMjYgLSBrKTsKLSAgICB2YWxbaSArIDI2IC0ga10gPSAnXDAnOwotfQotCi0jZWxzZQotCi12b2lkIGFwX3Byb3h5X2hhc2goY29uc3QgY2hhciAqaXQsIGNoYXIgKnZhbCwgaW50IG5kZXB0aCwgaW50IG5sZW5ndGgpCi17Ci0gICAgQVBfTUQ1X0NUWCBjb250ZXh0OwotICAgIHVuc2lnbmVkIGNoYXIgZGlnZXN0WzE2XTsKLSAgICBjaGFyIHRtcFsyMl07Ci0gICAgaW50IGksIGssIGQ7Ci0gICAgdW5zaWduZWQgaW50IHg7Ci0jaWYgZGVmaW5lZChBSVgpICYmIGRlZmluZWQoX19wczJfXykKLSAgICAvKiBCZWxpZXZlIGl0IG9yIG5vdCwgQUlYIDEueCBkb2VzIG5vdCBhbGxvdyB5b3UgdG8gbmFtZSBhIGZpbGUgJ0AnLAotICAgICAqIHNvIGhhY2sgYXJvdW5kIGl0IGluIHRoZSBlbmNvZGluZy4gKi8KLSAgICBzdGF0aWMgY29uc3QgY2hhciBlbmNfdGFibGVbNjRdID0KLQkiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlfJSI7Ci0jZWxzZQotICAgIHN0YXRpYyBjb25zdCBjaGFyIGVuY190YWJsZVs2NF0gPQotCSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OV9AIjsKLSNlbmRpZgotCi0gICAgYXBfTUQ1SW5pdCgmY29udGV4dCk7Ci0gICAgYXBfTUQ1VXBkYXRlKCZjb250ZXh0LCAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBpdCwgc3RybGVuKGl0KSk7Ci0gICAgYXBfTUQ1RmluYWwoZGlnZXN0LCAmY29udGV4dCk7Ci0KLS8qIGVuY29kZSAxMjggYml0cyBhcyAyMiBjaGFyYWN0ZXJzLCB1c2luZyBhIG1vZGlmaWVkIHV1ZW5jb2RpbmcgKi8KLS8qIHRoZSBlbmNvZGluZyBpcyAzIGJ5dGVzIC0+IDQgY2hhcmFjdGVycwotICogaS5lLiAxMjggYml0cyBpcyA1IHggMyBieXRlcyArIDEgYnl0ZSAtPiA1ICogNCBjaGFyYWN0ZXJzICsgMiBjaGFyYWN0ZXJzCi0gKi8KLSAgICBmb3IgKGkgPSAwLCBrID0gMDsgaSA8IDE1OyBpICs9IDMpIHsKLQl4ID0gKGRpZ2VzdFtpXSA8PCAxNikgfCAoZGlnZXN0W2kgKyAxXSA8PCA4KSB8IGRpZ2VzdFtpICsgMl07Ci0JdG1wW2srK10gPSBlbmNfdGFibGVbeCA+PiAxOF07Ci0JdG1wW2srK10gPSBlbmNfdGFibGVbKHggPj4gMTIpICYgMHgzZl07Ci0JdG1wW2srK10gPSBlbmNfdGFibGVbKHggPj4gNikgJiAweDNmXTsKLQl0bXBbaysrXSA9IGVuY190YWJsZVt4ICYgMHgzZl07Ci0gICAgfQotLyogb25lIGJ5dGUgbGVmdCAqLwotICAgIHggPSBkaWdlc3RbMTVdOwotICAgIHRtcFtrKytdID0gZW5jX3RhYmxlW3ggPj4gMl07CS8qIHVzZSB1cCA2IGJpdHMgKi8KLSAgICB0bXBbaysrXSA9IGVuY190YWJsZVsoeCA8PCA0KSAmIDB4M2ZdOwotICAgIC8qIG5vdyBzcGxpdCBpbnRvIGRpcmVjdG9yeSBsZXZlbHMgKi8KLQotICAgIGZvciAoaSA9IGsgPSBkID0gMDsgZCA8IG5kZXB0aDsgKytkKSB7Ci0JbWVtY3B5KCZ2YWxbaV0sICZ0bXBba10sIG5sZW5ndGgpOwotCWsgKz0gbmxlbmd0aDsKLQl2YWxbaSArIG5sZW5ndGhdID0gJy8nOwotCWkgKz0gbmxlbmd0aCArIDE7Ci0gICAgfQotICAgIG1lbWNweSgmdmFsW2ldLCAmdG1wW2tdLCAyMiAtIGspOwotICAgIHZhbFtpICsgMjIgLSBrXSA9ICdcMCc7Ci19Ci0KLSNlbmRpZiAvKiBDQVNFX0JMSU5EX0ZJTEVTWVNURU0gKi8KLQotLyoKLSAqIENvbnZlcnRzIDggaGV4IGRpZ2l0cyB0byBhIHRpbWUgaW50ZWdlcgotICovCi1pbnQgYXBfcHJveHlfaGV4MnNlYyhjb25zdCBjaGFyICp4KQotewotICAgIGludCBpLCBjaDsKLSAgICB1bnNpZ25lZCBpbnQgajsKLQotICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgODsgaSsrKSB7Ci0JY2ggPSB4W2ldOwotCWogPDw9IDQ7Ci0JaWYgKGFwX2lzZGlnaXQoY2gpKQotCSAgICBqIHw9IGNoIC0gJzAnOwotCWVsc2UgaWYgKGFwX2lzdXBwZXIoY2gpKQotCSAgICBqIHw9IGNoIC0gKCdBJyAtIDEwKTsKLQllbHNlCi0JICAgIGogfD0gY2ggLSAoJ2EnIC0gMTApOwotICAgIH0KLSAgICBpZiAoaiA9PSAweGZmZmZmZmZmKQotCXJldHVybiAtMTsJCS8qIHNvIHRoYXQgaXQgd29ya3Mgd2l0aCA4LWJ5dGUgaW50cyAqLwotICAgIGVsc2UKLQlyZXR1cm4gajsKLX0KLQotLyoKLSAqIENvbnZlcnRzIGEgdGltZSBpbnRlZ2VyIHRvIDggaGV4IGRpZ2l0cwotICovCi12b2lkIGFwX3Byb3h5X3NlYzJoZXgoaW50IHQsIGNoYXIgKnkpCi17Ci0gICAgaW50IGksIGNoOwotICAgIHVuc2lnbmVkIGludCBqID0gdDsKLQotICAgIGZvciAoaSA9IDc7IGkgPj0gMDsgaS0tKSB7Ci0JY2ggPSBqICYgMHhGOwotCWogPj49IDQ7Ci0JaWYgKGNoID49IDEwKQotCSAgICB5W2ldID0gY2ggKyAoJ0EnIC0gMTApOwotCWVsc2UKLQkgICAgeVtpXSA9IGNoICsgJzAnOwotICAgIH0KLSAgICB5WzhdID0gJ1wwJzsKLX0KLQotCi1jYWNoZV9yZXEgKmFwX3Byb3h5X2NhY2hlX2Vycm9yKGNhY2hlX3JlcSAqYykKLXsKLSAgICBpZiAoYyAhPSBOVUxMKSB7Ci0JaWYgKGMtPmZwICE9IE5VTEwpIHsKLQkgICAgYXBfcGNsb3NlZihjLT5yZXEtPnBvb2wsIGMtPmZwLT5mZCk7Ci0JICAgIGMtPmZwID0gTlVMTDsKLQl9Ci0JaWYgKGMtPnRlbXBmaWxlKSB1bmxpbmsoYy0+dGVtcGZpbGUpOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotaW50IGFwX3Byb3h5ZXJyb3IocmVxdWVzdF9yZWMgKnIsIGludCBzdGF0dXNjb2RlLCBjb25zdCBjaGFyICptZXNzYWdlKQotewotICAgIGFwX3RhYmxlX3NldG4oci0+bm90ZXMsICJlcnJvci1ub3RlcyIsCi0JCSAgYXBfcHN0cmNhdChyLT5wb29sLCAKLQkJCSAgICAgIlRoZSBwcm94eSBzZXJ2ZXIgY291bGQgbm90IGhhbmRsZSB0aGUgcmVxdWVzdCAiCi0JCQkgICAgICI8RU0+PEEgSFJFRj1cIiIsIHItPnVyaSwgIlwiPiIsCi0JCQkgICAgIHItPm1ldGhvZCwgIiZuYnNwOyIsIHItPnVyaSwgIjwvQT48L0VNPi48UD5cbiIKLQkJCSAgICAgIlJlYXNvbjogPFNUUk9ORz4iLCBtZXNzYWdlLCAiPC9TVFJPTkc+IiwgTlVMTCkpOwotCi0gICAgLyogQWxsb3cgdGhlICJlcnJvci1ub3RlcyIgc3RyaW5nIHRvIGJlIHByaW50ZWQgYnkgYXBfc2VuZF9lcnJvcl9yZXNwb25zZSgpICovCi0gICAgYXBfdGFibGVfc2V0bihyLT5ub3RlcywgInZlcmJvc2UtZXJyb3ItdG8iLCBhcF9wc3RyZHVwKHItPnBvb2wsICIqIikpOwotCi0gICAgci0+c3RhdHVzX2xpbmUgPSBhcF9wc3ByaW50ZihyLT5wb29sLCAiJTMuM3UgUHJveHkgRXJyb3IiLCBzdGF0dXNjb2RlKTsKLSAgICByZXR1cm4gc3RhdHVzY29kZTsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSByZXR1cm5zIGl0cyBvd24gZXJyb3IgbWVzc2FnZQotICovCi1jb25zdCBjaGFyICoKLSAgICAgYXBfcHJveHlfaG9zdDJhZGRyKGNvbnN0IGNoYXIgKmhvc3QsIHN0cnVjdCBob3N0ZW50ICpyZXFocCkKLXsKLSAgICBpbnQgaTsKLSAgICBzdHJ1Y3QgaG9zdGVudCAqaHA7Ci0gICAgc3RhdGljIEFQQUNIRV9UTFMgc3RydWN0IGhvc3RlbnQgaHBidWY7Ci0gICAgc3RhdGljIEFQQUNIRV9UTFMgdV9sb25nIGlwYWRkcjsKLSAgICBzdGF0aWMgQVBBQ0hFX1RMUyBjaGFyICpjaGFycGJ1ZlsyXTsKLQotICAgIGZvciAoaSA9IDA7IGhvc3RbaV0gIT0gJ1wwJzsgaSsrKQotCWlmICghYXBfaXNkaWdpdChob3N0W2ldKSAmJiBob3N0W2ldICE9ICcuJykKLQkgICAgYnJlYWs7Ci0KLSAgICBpZiAoaG9zdFtpXSAhPSAnXDAnKSB7Ci0JaHAgPSBnZXRob3N0YnluYW1lKGhvc3QpOwotCWlmIChocCA9PSBOVUxMKQotCSAgICByZXR1cm4gIkhvc3Qgbm90IGZvdW5kIjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JaXBhZGRyID0gYXBfaW5ldF9hZGRyKGhvc3QpOwotCWhwID0gZ2V0aG9zdGJ5YWRkcigoY2hhciAqKSAmaXBhZGRyLCBzaXplb2YodV9sb25nKSwgQUZfSU5FVCk7Ci0JaWYgKGhwID09IE5VTEwpIHsKLQkgICAgbWVtc2V0KCZocGJ1ZiwgMCwgc2l6ZW9mKGhwYnVmKSk7Ci0JICAgIGhwYnVmLmhfbmFtZSA9IDA7Ci0JICAgIGhwYnVmLmhfYWRkcnR5cGUgPSBBRl9JTkVUOwotCSAgICBocGJ1Zi5oX2xlbmd0aCA9IHNpemVvZih1X2xvbmcpOwotCSAgICBocGJ1Zi5oX2FkZHJfbGlzdCA9IGNoYXJwYnVmOwotCSAgICBocGJ1Zi5oX2FkZHJfbGlzdFswXSA9IChjaGFyICopICZpcGFkZHI7Ci0JICAgIGhwYnVmLmhfYWRkcl9saXN0WzFdID0gMDsKLQkgICAgaHAgPSAmaHBidWY7Ci0JfQotICAgIH0KLSAgICAqcmVxaHAgPSAqaHA7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLSAgICAgcHJveHlfZ2V0X2hvc3Rfb2ZfcmVxdWVzdChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjaGFyICp1cmwsICp1c2VyID0gTlVMTCwgKnBhc3N3b3JkID0gTlVMTCwgKmVyciwgKmhvc3Q7Ci0gICAgaW50IHBvcnQgPSAtMTsKLQotICAgIGlmIChyLT5ob3N0bmFtZSAhPSBOVUxMKQotCXJldHVybiByLT5ob3N0bmFtZTsKLQotICAgIC8qIFNldCB1cmwgdG8gdGhlIGZpcnN0IGNoYXIgYWZ0ZXIgInNjaGVtZTovLyIgKi8KLSAgICBpZiAoKHVybCA9IHN0cmNocihyLT51cmksICc6JykpID09IE5VTEwKLQl8fCB1cmxbMV0gIT0gJy8nIHx8IHVybFsyXSAhPSAnLycpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICB1cmwgPSBhcF9wc3RyZHVwKHItPnBvb2wsICZ1cmxbMV0pOwkvKiBtYWtlIGl0IHBvaW50IHRvICIvLyIsIHdoaWNoIGlzIHdoYXQgcHJveHlfY2Fub25fbmV0bG9jIGV4cGVjdHMgKi8KLQotICAgIGVyciA9IGFwX3Byb3h5X2Nhbm9uX25ldGxvYyhyLT5wb29sLCAmdXJsLCAmdXNlciwgJnBhc3N3b3JkLCAmaG9zdCwgJnBvcnQpOwotCi0gICAgaWYgKGVyciAhPSBOVUxMKQotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSfEFQTE9HX05PRVJSTk8sIHIsCi0JCSAgICAgIiVzIiwgZXJyKTsKLQotICAgIHItPmhvc3RuYW1lID0gaG9zdDsKLQotICAgIHJldHVybiBob3N0OwkJLyogb3VnaHQgdG8gcmV0dXJuIHRoZSBwb3J0LCB0b28gKi8KLX0KLQotLyogUmV0dXJuIFRSVUUgaWYgYWRkciByZXByZXNlbnRzIGFuIElQIGFkZHJlc3MgKG9yIGFuIElQIG5ldHdvcmsgYWRkcmVzcykgKi8KLWludCBhcF9wcm94eV9pc19pcGFkZHIoc3RydWN0IGRpcmNvbm5fZW50cnkgKlRoaXMsIHBvb2wgKnApCi17Ci0gICAgY29uc3QgY2hhciAqYWRkciA9IFRoaXMtPm5hbWU7Ci0gICAgbG9uZyBpcF9hZGRyWzRdOwotICAgIGludCBpLCBxdWFkczsKLSAgICBsb25nIGJpdHM7Ci0KLSAgICAvKiBpZiB0aGUgYWRkcmVzcyBpcyBnaXZlbiB3aXRoIGFuIGV4cGxpY2l0IG5ldG1hc2ssIHVzZSB0aGF0ICovCi0gICAgLyogRHVlIHRvIGEgZGVmaWNpZW5jeSBpbiBhcF9pbmV0X2FkZHIoKSwgaXQgaXMgaW1wb3NzaWJsZSB0byBwYXJzZSAqLwotICAgIC8qICJwYXJ0aWFsIiBhZGRyZXNzZXMgKHdpdGggbGVzcyB0aGFuIDQgcXVhZHMpIGNvcnJlY3RseSwgaS5lLiAgKi8KLSAgICAvKiAxOTIuMTY4LjEyMyBpcyBwYXJzZWQgYXMgMTkyLjE2OC4wLjEyMywgd2hpY2ggaXMgbm90IHdoYXQgSSB3YW50LiAqLwotICAgIC8qIEkgdGhlcmVmb3JlIGhhdmUgdG8gcGFyc2UgdGhlIElQIGFkZHJlc3MgbWFudWFsbHk6ICovCi0gICAgLyppZiAocHJveHlfcmVhZG1hc2soVGhpcy0+bmFtZSwgJlRoaXMtPmFkZHIuc19hZGRyLCAmVGhpcy0+bWFzay5zX2FkZHIpID09IDApICovCi0gICAgLyogYWRkciBhbmQgbWFzayB3ZXJlIHNldCBieSBwcm94eV9yZWFkbWFzaygpICovCi0gICAgLypyZXR1cm4gMTsgKi8KLQotICAgIC8qIFBhcnNlIElQIGFkZHIgbWFudWFsbHksIG9wdGlvbmFsbHkgYWxsb3dpbmcgKi8KLSAgICAvKiBhYmJyZXZpYXRlZCBuZXQgYWRkcmVzc2VzIGxpa2UgMTkyLjE2OC4gKi8KLQotICAgIC8qIEl0ZXJhdGUgb3ZlciB1cCB0byA0IChkb3R0ZWQpIHF1YWRzLiAqLwotICAgIGZvciAocXVhZHMgPSAwOyBxdWFkcyA8IDQgJiYgKmFkZHIgIT0gJ1wwJzsgKytxdWFkcykgewotCWNoYXIgKnRtcDsKLQotCWlmICgqYWRkciA9PSAnLycgJiYgcXVhZHMgPiAwKQkvKiBuZXRtYXNrIHN0YXJ0cyBoZXJlLiAqLwotCSAgICBicmVhazsKLQotCWlmICghYXBfaXNkaWdpdCgqYWRkcikpCi0JICAgIHJldHVybiAwOwkJLyogbm8gZGlnaXQgYXQgc3RhcnQgb2YgcXVhZCAqLwotCi0JaXBfYWRkcltxdWFkc10gPSBzdHJ0b2woYWRkciwgJnRtcCwgMCk7Ci0KLQlpZiAodG1wID09IGFkZHIpCS8qIGV4cGVjdGVkIGEgZGlnaXQsIGZvdW5kIHNvbWV0aGluZyBlbHNlICovCi0JICAgIHJldHVybiAwOwotCi0JaWYgKGlwX2FkZHJbcXVhZHNdIDwgMCB8fCBpcF9hZGRyW3F1YWRzXSA+IDI1NSkgewotCSAgICAvKiBpbnZhbGlkIG9jdGV0ICovCi0JICAgIHJldHVybiAwOwotCX0KLQotCWFkZHIgPSB0bXA7Ci0KLQlpZiAoKmFkZHIgPT0gJy4nICYmIHF1YWRzICE9IDMpCi0JICAgICsrYWRkcjsJCS8qIGFmdGVyIHRoZSA0dGggcXVhZCwgYSBkb3Qgd291bGQgYmUgaWxsZWdhbCAqLwotICAgIH0KLQotICAgIGZvciAoVGhpcy0+YWRkci5zX2FkZHIgPSAwLCBpID0gMDsgaSA8IHF1YWRzOyArK2kpCi0JVGhpcy0+YWRkci5zX2FkZHIgfD0gaHRvbmwoaXBfYWRkcltpXSA8PCAoMjQgLSA4ICogaSkpOwotCi0gICAgaWYgKGFkZHJbMF0gPT0gJy8nICYmIGFwX2lzZGlnaXQoYWRkclsxXSkpIHsJLyogbmV0IG1hc2sgZm9sbG93czogKi8KLQljaGFyICp0bXA7Ci0KLQkrK2FkZHI7Ci0KLQliaXRzID0gc3RydG9sKGFkZHIsICZ0bXAsIDApOwotCi0JaWYgKHRtcCA9PSBhZGRyKQkvKiBleHBlY3RlZCBhIGRpZ2l0LCBmb3VuZCBzb21ldGhpbmcgZWxzZSAqLwotCSAgICByZXR1cm4gMDsKLQotCWFkZHIgPSB0bXA7Ci0KLQlpZiAoYml0cyA8IDAgfHwgYml0cyA+IDMyKQkvKiBuZXRtYXNrIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAzMiAqLwotCSAgICByZXR1cm4gMDsKLQotICAgIH0KLSAgICBlbHNlIHsKLQkvKiBEZXRlcm1pbmUgKGkuZS4sICJndWVzcyIpIG5ldG1hc2sgYnkgY291bnRpbmcgdGhlICovCi0JLyogbnVtYmVyIG9mIHRyYWlsaW5nIC4wJ3M7IHJlZHVjZSAjcXVhZHMgYXBwcm9wcmlhdGVseSAqLwotCS8qIChzbyB0aGF0IDE5Mi4xNjguMC4wIGlzIGVxdWl2YWxlbnQgdG8gMTkyLjE2OC4pICAgICAgICAqLwotCXdoaWxlIChxdWFkcyA+IDAgJiYgaXBfYWRkcltxdWFkcyAtIDFdID09IDApCi0JICAgIC0tcXVhZHM7Ci0KLQkvKiAiSVAgQWRkcmVzcyBzaG91bGQgYmUgZ2l2ZW4gaW4gZG90dGVkLXF1YWQgZm9ybSwgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIG5ldG1hc2sgKGUuZy4sIDE5Mi4xNjguMTExLjAvMjQpIjsgKi8KLQlpZiAocXVhZHMgPCAxKQotCSAgICByZXR1cm4gMDsKLQotCS8qIGV2ZXJ5IHplcm8tYnl0ZSBjb3VudHMgYXMgOCB6ZXJvLWJpdHMgKi8KLQliaXRzID0gOCAqIHF1YWRzOwotCi0JaWYgKGJpdHMgIT0gMzIpCQkvKiBubyB3YXJuaW5nIGZvciBmdWxseSBxdWFsaWZpZWQgSVAgYWRkcmVzcyAqLwotCSAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IE5ldE1hc2sgbm90IHN1cHBsaWVkIHdpdGggSVAtQWRkcjsgZ3Vlc3Npbmc6ICVzLyVsZFxuIiwKLQkJICAgIGluZXRfbnRvYShUaGlzLT5hZGRyKSwgYml0cyk7Ci0gICAgfQotCi0gICAgVGhpcy0+bWFzay5zX2FkZHIgPSBodG9ubChJTkFERFJfTk9ORSA8PCAoMzIgLSBiaXRzKSk7Ci0KLSAgICBpZiAoKmFkZHIgPT0gJ1wwJyAmJiAoVGhpcy0+YWRkci5zX2FkZHIgJiB+VGhpcy0+bWFzay5zX2FkZHIpICE9IDApIHsKLQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IE5ldE1hc2sgYW5kIElQLUFkZHIgZGlzYWdyZWUgaW4gJXMvJWxkXG4iLAotCQlpbmV0X250b2EoVGhpcy0+YWRkciksIGJpdHMpOwotCVRoaXMtPmFkZHIuc19hZGRyICY9IFRoaXMtPm1hc2suc19hZGRyOwotCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgU2V0IHRvICVzLyVsZFxuIiwKLQkJaW5ldF9udG9hKFRoaXMtPmFkZHIpLCBiaXRzKTsKLSAgICB9Ci0KLSAgICBpZiAoKmFkZHIgPT0gJ1wwJykgewotCVRoaXMtPm1hdGNoZXIgPSBwcm94eV9tYXRjaF9pcGFkZHI7Ci0JcmV0dXJuIDE7Ci0gICAgfQotICAgIGVsc2UKLQlyZXR1cm4gKCphZGRyID09ICdcMCcpOwkvKiBva2F5IGlmZiB3ZSd2ZSBwYXJzZWQgdGhlIHdob2xlIHN0cmluZyAqLwotfQotCi0vKiBSZXR1cm4gVFJVRSBpZiBhZGRyIHJlcHJlc2VudHMgYW4gSVAgYWRkcmVzcyAob3IgYW4gSVAgbmV0d29yayBhZGRyZXNzKSAqLwotc3RhdGljIGludCBwcm94eV9tYXRjaF9pcGFkZHIoc3RydWN0IGRpcmNvbm5fZW50cnkgKlRoaXMsIHJlcXVlc3RfcmVjICpyKQotewotICAgIGludCBpOwotICAgIGludCBpcF9hZGRyWzRdOwotICAgIHN0cnVjdCBpbl9hZGRyIGFkZHI7Ci0gICAgc3RydWN0IGluX2FkZHIgKmlwX2xpc3Q7Ci0gICAgY2hhciAqKmlwX2xpc3RwdHI7Ci0gICAgY29uc3QgY2hhciAqZm91bmQ7Ci0gICAgY29uc3QgY2hhciAqaG9zdCA9IHByb3h5X2dldF9ob3N0X29mX3JlcXVlc3Qocik7Ci0KLSAgICBpZiAoaG9zdCA9PSBOVUxMKSAgIC8qIG9vcHMhICovCi0gICAgICAgcmV0dXJuIDA7Ci0KLSAgICBtZW1zZXQoJmFkZHIsICdcMCcsIHNpemVvZiBhZGRyKTsKLSAgICBtZW1zZXQoaXBfYWRkciwgJ1wwJywgc2l6ZW9mIGlwX2FkZHIpOwotCi0gICAgaWYgKDQgPT0gc3NjYW5mKGhvc3QsICIlZC4lZC4lZC4lZCIsICZpcF9hZGRyWzBdLCAmaXBfYWRkclsxXSwgJmlwX2FkZHJbMl0sICZpcF9hZGRyWzNdKSkgewotCWZvciAoYWRkci5zX2FkZHIgPSAwLCBpID0gMDsgaSA8IDQ7ICsraSkKLQkgICAgYWRkci5zX2FkZHIgfD0gaHRvbmwoaXBfYWRkcltpXSA8PCAoMjQgLSA4ICogaSkpOwotCi0JaWYgKFRoaXMtPmFkZHIuc19hZGRyID09IChhZGRyLnNfYWRkciAmIFRoaXMtPm1hc2suc19hZGRyKSkgewotI2lmIERFQlVHR0lORwotCSAgICBmcHJpbnRmKHN0ZGVyciwgIjEpSVAtTWF0Y2g6ICVzWyVzXSA8LT4gIiwgaG9zdCwgaW5ldF9udG9hKGFkZHIpKTsKLQkgICAgZnByaW50ZihzdGRlcnIsICIlcy8iLCBpbmV0X250b2EoVGhpcy0+YWRkcikpOwotCSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBpbmV0X250b2EoVGhpcy0+bWFzaykpOwotI2VuZGlmCi0JICAgIHJldHVybiAxOwotCX0KLSNpZiBERUJVR0dJTkcKLQllbHNlIHsKLQkgICAgZnByaW50ZihzdGRlcnIsICIxKUlQLU5vTWF0Y2g6ICVzWyVzXSA8LT4gIiwgaG9zdCwgaW5ldF9udG9hKGFkZHIpKTsKLQkgICAgZnByaW50ZihzdGRlcnIsICIlcy8iLCBpbmV0X250b2EoVGhpcy0+YWRkcikpOwotCSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBpbmV0X250b2EoVGhpcy0+bWFzaykpOwotCX0KLSNlbmRpZgotICAgIH0KLSAgICBlbHNlIHsKLQlzdHJ1Y3QgaG9zdGVudCB0aGVfaG9zdDsKLQotCW1lbXNldCgmdGhlX2hvc3QsICdcMCcsIHNpemVvZiB0aGVfaG9zdCk7Ci0JZm91bmQgPSBhcF9wcm94eV9ob3N0MmFkZHIoaG9zdCwgJnRoZV9ob3N0KTsKLQotCWlmIChmb3VuZCAhPSBOVUxMKSB7Ci0jaWYgREVCVUdHSU5HCi0JICAgIGZwcmludGYoc3RkZXJyLCAiMilJUC1Ob01hdGNoOiBob3N0bmFtZT0lcyBtc2c9JXNcbiIsIGhvc3QsIGZvdW5kKTsKLSNlbmRpZgotCSAgICByZXR1cm4gMDsKLQl9Ci0KLQlpZiAodGhlX2hvc3QuaF9uYW1lICE9IE5VTEwpCi0JICAgIGZvdW5kID0gdGhlX2hvc3QuaF9uYW1lOwotCWVsc2UKLQkgICAgZm91bmQgPSBob3N0OwotCi0JLyogVHJ5IHRvIGRlYWwgd2l0aCBtdWx0aXBsZSBJUCBhZGRyJ3MgZm9yIGEgaG9zdCAqLwotCWZvciAoaXBfbGlzdHB0ciA9IHRoZV9ob3N0LmhfYWRkcl9saXN0OyAqaXBfbGlzdHB0cjsgKytpcF9saXN0cHRyKSB7Ci0JICAgIGlwX2xpc3QgPSAoc3RydWN0IGluX2FkZHIgKikgKmlwX2xpc3RwdHI7Ci0JICAgIGlmIChUaGlzLT5hZGRyLnNfYWRkciA9PSAoaXBfbGlzdC0+c19hZGRyICYgVGhpcy0+bWFzay5zX2FkZHIpKSB7Ci0jaWYgREVCVUdHSU5HCi0JCWZwcmludGYoc3RkZXJyLCAiMylJUC1NYXRjaDogJXNbJXNdIDwtPiAiLCBmb3VuZCwgaW5ldF9udG9hKCppcF9saXN0KSk7Ci0JCWZwcmludGYoc3RkZXJyLCAiJXMvIiwgaW5ldF9udG9hKFRoaXMtPmFkZHIpKTsKLQkJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgaW5ldF9udG9hKFRoaXMtPm1hc2spKTsKLSNlbmRpZgotCQlyZXR1cm4gMTsKLQkgICAgfQotI2lmIERFQlVHR0lORwotCSAgICBlbHNlIHsKLQkJZnByaW50ZihzdGRlcnIsICIzKUlQLU5vTWF0Y2g6ICVzWyVzXSA8LT4gIiwgZm91bmQsIGluZXRfbnRvYSgqaXBfbGlzdCkpOwotCQlmcHJpbnRmKHN0ZGVyciwgIiVzLyIsIGluZXRfbnRvYShUaGlzLT5hZGRyKSk7Ci0JCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGluZXRfbnRvYShUaGlzLT5tYXNrKSk7Ci0JICAgIH0KLSNlbmRpZgotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIFRSVUUgaWYgYWRkciByZXByZXNlbnRzIGEgZG9tYWluIG5hbWUgKi8KLWludCBhcF9wcm94eV9pc19kb21haW5uYW1lKHN0cnVjdCBkaXJjb25uX2VudHJ5ICpUaGlzLCBwb29sICpwKQotewotICAgIGNoYXIgKmFkZHIgPSBUaGlzLT5uYW1lOwotICAgIGludCBpOwotCi0gICAgLyogRG9tYWluIG5hbWUgbXVzdCBzdGFydCB3aXRoIGEgJy4nICovCi0gICAgaWYgKGFkZHJbMF0gIT0gJy4nKQotCXJldHVybiAwOwotCi0gICAgLyogcmZjMTAzNSBzYXlzIEROUyBuYW1lcyBtdXN0IGNvbnNpc3Qgb2YgIlstYS16QS1aMC05XSIgYW5kICcuJyAqLwotICAgIGZvciAoaSA9IDA7IGFwX2lzYWxudW0oYWRkcltpXSkgfHwgYWRkcltpXSA9PSAnLScgfHwgYWRkcltpXSA9PSAnLic7ICsraSkKLQljb250aW51ZTsKLQotI2lmIDAKLSAgICBpZiAoYWRkcltpXSA9PSAnOicpIHsKLQlmcHJpbnRmKHN0ZGVyciwgIkBAQEAgaGFuZGxlIG9wdGlvbmFsIHBvcnQgaW4gcHJveHlfaXNfZG9tYWlubmFtZSgpXG4iKTsKLQkvKiBAQEBAIGhhbmRsZSBvcHRpb25hbCBwb3J0ICovCi0gICAgfQotI2VuZGlmCi0KLSAgICBpZiAoYWRkcltpXSAhPSAnXDAnKQotCXJldHVybiAwOwotCi0gICAgLyogU3RyaXAgdHJhaWxpbmcgZG90cyAqLwotICAgIGZvciAoaSA9IHN0cmxlbihhZGRyKSAtIDE7IGkgPiAwICYmIGFkZHJbaV0gPT0gJy4nOyAtLWkpCi0JYWRkcltpXSA9ICdcMCc7Ci0KLSAgICBUaGlzLT5tYXRjaGVyID0gcHJveHlfbWF0Y2hfZG9tYWlubmFtZTsKLSAgICByZXR1cm4gMTsKLX0KLQotLyogUmV0dXJuIFRSVUUgaWYgaG9zdCAiaG9zdCIgaXMgaW4gZG9tYWluICJkb21haW4iICovCi1zdGF0aWMgaW50IHByb3h5X21hdGNoX2RvbWFpbm5hbWUoc3RydWN0IGRpcmNvbm5fZW50cnkgKlRoaXMsIHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvbnN0IGNoYXIgKmhvc3QgPSBwcm94eV9nZXRfaG9zdF9vZl9yZXF1ZXN0KHIpOwotICAgIGludCBkX2xlbiA9IHN0cmxlbihUaGlzLT5uYW1lKSwgaF9sZW47Ci0KLSAgICBpZiAoaG9zdCA9PSBOVUxMKQkJLyogc29tZSBlcnJvciB3YXMgbG9nZ2VkIGFscmVhZHkgKi8KLQlyZXR1cm4gMDsKLQotICAgIGhfbGVuID0gc3RybGVuKGhvc3QpOwotCi0gICAgLyogQEBAIGRvIHRoaXMgd2l0aGluIHRoZSBzZXR1cD8gKi8KLSAgICAvKiBJZ25vcmUgdHJhaWxpbmcgZG90cyBpbiBkb21haW4gY29tcGFyaXNvbjogKi8KLSAgICB3aGlsZSAoZF9sZW4gPiAwICYmIFRoaXMtPm5hbWVbZF9sZW4gLSAxXSA9PSAnLicpCi0JLS1kX2xlbjsKLSAgICB3aGlsZSAoaF9sZW4gPiAwICYmIGhvc3RbaF9sZW4gLSAxXSA9PSAnLicpCi0JLS1oX2xlbjsKLSAgICByZXR1cm4gaF9sZW4gPiBkX2xlbgotCSYmIHN0cm5jYXNlY21wKCZob3N0W2hfbGVuIC0gZF9sZW5dLCBUaGlzLT5uYW1lLCBkX2xlbikgPT0gMDsKLX0KLQotLyogUmV0dXJuIFRSVUUgaWYgYWRkciByZXByZXNlbnRzIGEgaG9zdCBuYW1lICovCi1pbnQgYXBfcHJveHlfaXNfaG9zdG5hbWUoc3RydWN0IGRpcmNvbm5fZW50cnkgKlRoaXMsIHBvb2wgKnApCi17Ci0gICAgc3RydWN0IGhvc3RlbnQgaG9zdDsKLSAgICBjaGFyICphZGRyID0gVGhpcy0+bmFtZTsKLSAgICBpbnQgaTsKLQotICAgIC8qIEhvc3QgbmFtZXMgbXVzdCBub3Qgc3RhcnQgd2l0aCBhICcuJyAqLwotICAgIGlmIChhZGRyWzBdID09ICcuJykKLQlyZXR1cm4gMDsKLQotICAgIC8qIHJmYzEwMzUgc2F5cyBETlMgbmFtZXMgbXVzdCBjb25zaXN0IG9mICJbLWEtekEtWjAtOV0iIGFuZCAnLicgKi8KLSAgICBmb3IgKGkgPSAwOyBhcF9pc2FsbnVtKGFkZHJbaV0pIHx8IGFkZHJbaV0gPT0gJy0nIHx8IGFkZHJbaV0gPT0gJy4nOyArK2kpOwotCi0jaWYgMAotICAgIGlmIChhZGRyW2ldID09ICc6JykgewotCWZwcmludGYoc3RkZXJyLCAiQEBAQCBoYW5kbGUgb3B0aW9uYWwgcG9ydCBpbiBwcm94eV9pc19ob3N0bmFtZSgpXG4iKTsKLQkvKiBAQEBAIGhhbmRsZSBvcHRpb25hbCBwb3J0ICovCi0gICAgfQotI2VuZGlmCi0KLSAgICBpZiAoYWRkcltpXSAhPSAnXDAnIHx8IGFwX3Byb3h5X2hvc3QyYWRkcihhZGRyLCAmaG9zdCkgIT0gTlVMTCkKLQlyZXR1cm4gMDsKLQotICAgIFRoaXMtPmhvc3RlbnRyeSA9IGFwX3BkdXBob3N0ZW50IChwLCAmaG9zdCk7Ci0KLSAgICAvKiBTdHJpcCB0cmFpbGluZyBkb3RzICovCi0gICAgZm9yIChpID0gc3RybGVuKGFkZHIpIC0gMTsgaSA+IDAgJiYgYWRkcltpXSA9PSAnLic7IC0taSkKLQlhZGRyW2ldID0gJ1wwJzsKLQotICAgIFRoaXMtPm1hdGNoZXIgPSBwcm94eV9tYXRjaF9ob3N0bmFtZTsKLSAgICByZXR1cm4gMTsKLX0KLQotLyogUmV0dXJuIFRSVUUgaWYgaG9zdCAiaG9zdCIgaXMgZXF1YWwgdG8gaG9zdDIgImhvc3QyIiAqLwotc3RhdGljIGludCBwcm94eV9tYXRjaF9ob3N0bmFtZShzdHJ1Y3QgZGlyY29ubl9lbnRyeSAqVGhpcywgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY2hhciAqaG9zdCA9IFRoaXMtPm5hbWU7Ci0gICAgY29uc3QgY2hhciAqaG9zdDIgPSBwcm94eV9nZXRfaG9zdF9vZl9yZXF1ZXN0KHIpOwotICAgIGludCBoMl9sZW47Ci0gICAgaW50IGgxX2xlbjsKLQotICAgIGlmIChob3N0ID09IE5VTEwgfHwgaG9zdDIgPT0gTlVMTCkKLSAgICAgICByZXR1cm4gMDsgLyogb29wcyEgKi8KLQotICAgIGgyX2xlbiA9IHN0cmxlbihob3N0Mik7Ci0gICAgaDFfbGVuID0gc3RybGVuKGhvc3QpOwotCi0jaWYgMAotICAgIHVuc2lnbmVkIGxvbmcgKmlwX2xpc3Q7Ci0KLSAgICAvKiBUcnkgdG8gZGVhbCB3aXRoIG11bHRpcGxlIElQIGFkZHIncyBmb3IgYSBob3N0ICovCi0gICAgZm9yIChpcF9saXN0ID0gKlRoaXMtPmhvc3RlbnRyeS0+aF9hZGRyX2xpc3Q7ICppcF9saXN0ICE9IDBVTDsgKytpcF9saXN0KQotCWlmICgqaXBfbGlzdCA9PSA/ID8gPyA/ID8gPyA/ID8gPyA/ID8gPyA/KQotCSAgICByZXR1cm4gMTsKLSNlbmRpZgotCi0gICAgLyogSWdub3JlIHRyYWlsaW5nIGRvdHMgaW4gaG9zdDIgY29tcGFyaXNvbjogKi8KLSAgICB3aGlsZSAoaDJfbGVuID4gMCAmJiBob3N0MltoMl9sZW4gLSAxXSA9PSAnLicpCi0JLS1oMl9sZW47Ci0gICAgd2hpbGUgKGgxX2xlbiA+IDAgJiYgaG9zdFtoMV9sZW4gLSAxXSA9PSAnLicpCi0JLS1oMV9sZW47Ci0gICAgcmV0dXJuIGgxX2xlbiA9PSBoMl9sZW4KLQkmJiBzdHJuY2FzZWNtcChob3N0LCBob3N0MiwgaDFfbGVuKSA9PSAwOwotfQotCi0vKiBSZXR1cm4gVFJVRSBpZiBhZGRyIGlzIHRvIGJlIG1hdGNoZWQgYXMgYSB3b3JkICovCi1pbnQgYXBfcHJveHlfaXNfd29yZChzdHJ1Y3QgZGlyY29ubl9lbnRyeSAqVGhpcywgcG9vbCAqcCkKLXsKLSAgICBUaGlzLT5tYXRjaGVyID0gcHJveHlfbWF0Y2hfd29yZDsKLSAgICByZXR1cm4gMTsKLX0KLQotLyogUmV0dXJuIFRSVUUgaWYgc3RyaW5nICJzdHIyIiBvY2N1cnMgbGl0ZXJhbGx5IGluICJzdHIxIiAqLwotc3RhdGljIGludCBwcm94eV9tYXRjaF93b3JkKHN0cnVjdCBkaXJjb25uX2VudHJ5ICpUaGlzLCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb25zdCBjaGFyICpob3N0ID0gcHJveHlfZ2V0X2hvc3Rfb2ZfcmVxdWVzdChyKTsKLSAgICByZXR1cm4gaG9zdCAhPSBOVUxMICYmIHN0cnN0cihob3N0LCBUaGlzLT5uYW1lKSAhPSBOVUxMOwotfQotCi1pbnQgYXBfcHJveHlfZG9jb25uZWN0KGludCBzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIsIHJlcXVlc3RfcmVjICpyKQotewotICAgIGludCBpOwotCi0gICAgYXBfaGFyZF90aW1lb3V0KCJwcm94eSBjb25uZWN0Iiwgcik7Ci0gICAgZG8gewotCWkgPSBjb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgYWRkciwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOwotI2lmZGVmIFdJTjMyCi0JaWYgKGkgPT0gU09DS0VUX0VSUk9SKQotCSAgICBlcnJubyA9IFdTQUdldExhc3RFcnJvcigpOwotI2VuZGlmIC8qIFdJTjMyICovCi0gICAgfSB3aGlsZSAoaSA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7Ci0gICAgaWYgKGkgPT0gLTEpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgciwKLQkJICAgICAicHJveHkgY29ubmVjdCB0byAlcyBwb3J0ICVkIGZhaWxlZCIsCi0JCSAgICAgaW5ldF9udG9hKGFkZHItPnNpbl9hZGRyKSwgbnRvaHMoYWRkci0+c2luX3BvcnQpKTsKLSAgICB9Ci0gICAgYXBfa2lsbF90aW1lb3V0KHIpOwotCi0gICAgcmV0dXJuIGk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGFwX3RhYmxlX2RvKCkgZm9yIGFsbCBoZWFkZXIgbGluZXMgKi8KLS8qIChmcm9tIHByb3h5X2h0dHAuYyBhbmQgcHJveHlfZnRwLmMpICovCi0vKiBJdCBpcyBwYXNzZWQgYSB0YWJsZV9kb19hcmdzIHN0cnVjdCBwb2ludGVyIGFuZCBhIE1JTUUgZmllbGQgYW5kIHZhbHVlIHBhaXIgKi8KLWludCBhcF9wcm94eV9zZW5kX2hkcl9saW5lKHZvaWQgKnAsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsdWUpCi17Ci0gICAgc3RydWN0IHRibF9kb19hcmdzICpwYXJtID0gKHN0cnVjdCB0YmxfZG9fYXJncyAqKXA7Ci0KLSAgICBpZiAoa2V5ID09IE5VTEwgfHwgdmFsdWUgPT0gTlVMTCB8fCB2YWx1ZVswXSA9PSAnXDAnKQotCXJldHVybiAxOwotICAgIGlmICghcGFybS0+cmVxLT5hc3NiYWNrd2FyZHMpCi0JYXBfcnZwdXRzKHBhcm0tPnJlcSwga2V5LCAiOiAiLCB2YWx1ZSwgQ1JMRiwgTlVMTCk7Ci0gICAgaWYgKHBhcm0tPmNhY2hlICE9IE5VTEwgJiYgcGFybS0+Y2FjaGUtPmZwICE9IE5VTEwgJiYKLQlhcF9idnB1dHMocGFybS0+Y2FjaGUtPmZwLCBrZXksICI6ICIsIHZhbHVlLCBDUkxGLCBOVUxMKSA9PSAtMSkgewotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgcGFybS0+Y2FjaGUtPnJlcSwKLQkJICAgICJwcm94eTogZXJyb3Igd3JpdGluZyBoZWFkZXIgdG8gJXMiLCBwYXJtLT5jYWNoZS0+dGVtcGZpbGUpOwotCSAgICBwYXJtLT5jYWNoZSA9IGFwX3Byb3h5X2NhY2hlX2Vycm9yKHBhcm0tPmNhY2hlKTsKLSAgICB9Ci0gICAgcmV0dXJuIDE7IC8qIHRlbGwgYXBfdGFibGVfZG8oKSB0byBjb250aW51ZSBjYWxsaW5nIHVzIGZvciBtb3JlIGhlYWRlcnMgKi8KLX0KLQotLyogc2VuZCBhIHRleHQgbGluZSB0byBvbmUgb3IgdHdvIEJVRkYnczsgcmV0dXJuIGxpbmUgbGVuZ3RoICovCi11bnNpZ25lZCBhcF9wcm94eV9icHV0czIoY29uc3QgY2hhciAqZGF0YSwgQlVGRiAqY2xpZW50LCBjYWNoZV9yZXEgKmNhY2hlKQotewotICAgIHVuc2lnbmVkIGxlbiA9IGFwX2JwdXRzKGRhdGEsIGNsaWVudCk7Ci0gICAgaWYgKGNhY2hlICE9IE5VTEwgJiYgY2FjaGUtPmZwICE9IE5VTEwpCi0JYXBfYnB1dHMoZGF0YSwgY2FjaGUtPmZwKTsKLSAgICByZXR1cm4gbGVuOwotfQotCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NzbC8uY3ZzaWdub3JlIGIvbW9kdWxlcy9zc2wvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhOWE5Zi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL3NzbC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1NYWtlZmlsZQotKi5sbwotKi5vCi0qLmEKLSoubGliCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NzbC9NYWtlZmlsZS5pbiBiL21vZHVsZXMvc3NsL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjA3ZDQ4Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvc3NsL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotIyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMjIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSMjCi0jIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0jIyByZXNlcnZlZC4KLSMjCi0jIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIyMgYXJlIG1ldDoKLSMjCi0jIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyMKLSMjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSMjICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMjICAgIGRpc3RyaWJ1dGlvbi4KLSMjCi0jIyAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSMjICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0jIyAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSMjICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotIyMgICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotIyMgICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSMjCi0jIyA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotIyMgICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0jIyAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSMjICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotIyMKLSMjIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotIyMgICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0jIyAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSMjCi0jIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0jIyBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIyMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSMjIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSMjIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSMjIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSMjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotIyMgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0jIyBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSMjIFNVQ0ggREFNQUdFLgotIyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotaW5jbHVkZSAkKHRvcF9zcmNkaXIpL2J1aWxkL3NwZWNpYWwubWsKLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zc2wvUkVBRE1FIGIvbW9kdWxlcy9zc2wvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTllMjI1Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvc3NsL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgXyAgICAgICAgICAgICBfIAotICBfIF9fIF9fXyAgIF9fXyAgIF9ffCB8ICAgIF9fXyBfX198IHwKLSB8ICdfIGAgXyBcIC8gXyBcIC8gX2AgfCAgIC8gX18vIF9ffCB8IAotIHwgfCB8IHwgfCB8IChfKSB8IChffCB8ICAgXF9fIFxfXyBcIHwgYGBtb2Rfc3NsIGNvbWJpbmVzIHRoZSBmbGV4aWJpbGl0eSBvZgotIHxffCB8X3wgfF98XF9fXy8gXF9fLF98X19ffF9fXy9fX18vX3wgICBBcGFjaGUgd2l0aCB0aGUgc2VjdXJpdHkgb2YgT3BlblNTTC4nJwotICAgICAgICAgICAgICAgICAgICAgIHxfX19fX3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gbW9kX3NzbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYFJhbGYgRW5nZWxzY2hhbGwgaGFzIHJlbGVhc2VkIGFuCi0gQXBhY2hlIEludGVyZmFjZSB0byBPcGVuU1NMICAgICAgICAgICAgIGV4Y2VsbGVudCBtb2R1bGUgdGhhdCBpbnRlZ3JhdGVzCi0gaHR0cDovL3d3dy5tb2Rzc2wub3JnLyAgICAgICAgICAgICAgICAgIEFwYWNoZSBhbmQgU1NMZWF5LicnICAgICAgICAgICAgICAgICAKLSBWZXJzaW9uIDIuOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gVGltIEouIEh1ZHNvbgotCi0gU1lOT1BTSVMKLQotIFRoaXMgQXBhY2hlIG1vZHVsZSBwcm92aWRlcyBzdHJvbmcgY3J5cHRvZ3JhcGh5IGZvciB0aGUgQXBhY2hlIDEuMyB3ZWJzZXJ2ZXIKLSB2aWEgdGhlIFNlY3VyZSBTb2NrZXRzIExheWVyIChTU0wgdjIvdjMpIGFuZCBUcmFuc3BvcnQgTGF5ZXIgU2VjdXJpdHkgKFRMUwotIHYxKSBwcm90b2NvbHMgYnkgdGhlIGhlbHAgb2YgdGhlIFNTTC9UTFMgaW1wbGVtZW50YXRpb24gbGlicmFyeSBPcGVuU1NMIHdoaWNoCi0gaXMgYmFzZWQgb24gU1NMZWF5IGZyb20gRXJpYyBBLiBZb3VuZyBhbmQgVGltIEouIEh1ZHNvbi4gVGhlIG1vZF9zc2wgcGFja2FnZQotIHdhcyBjcmVhdGVkIGluIEFwcmlsIDE5OTggYnkgUmFsZiBTLiBFbmdlbHNjaGFsbCBhbmQgd2FzIG9yaWdpbmFsbHkgZGVyaXZlZAotIGZyb20gc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEJlbiBMYXVyaWUgZm9yIHVzZSBpbiB0aGUgQXBhY2hlLVNTTCBIVFRQIHNlcnZlcgotIHByb2plY3QuIAotCi0gU09VUkNFUwotCi0gSGVyZSBpcyBhIHNob3J0IG92ZXJ2aWV3IG9mIHRoZSBzb3VyY2UgZmlsZXM6Ci0KLSAgIE1ha2VmaWxlLmxpYmRpciAuLi4uLi4uLi4gZHVtbXkgZm9yIEFwYWNoZSBjb25maWcgbWVjaGFuaXNtCi0gICBNYWtlZmlsZS50bXBsIC4uLi4uLi4uLi4uIE1ha2VmaWxlIHRlbXBsYXRlIGZvciBVbml4ICBwbGF0Zm9ybQotICAgTWFrZWZpbGUud2luMzIgLi4uLi4uLi4uLiBNYWtlZmlsZSB0ZW1wbGF0ZSBmb3IgV2luMzIgcGxhdGZvcm0KLSAgIGxpYnNzbC5tb2R1bGUgLi4uLi4uLi4uLi4gc3R1YiBjYWxsZWQgZnJvbSB0aGUgQXBhY2hlIGNvbmZpZyBtZWNoYW5pc20KLSAgIGxpYnNzbC52ZXJzaW9uIC4uLi4uLi4uLi4gZmlsZSBjb250YWluaW5nIHRoZSBtb2Rfc3NsIHZlcnNpb24gaW5mb3JtYXRpb24KLSAgIG1vZF9zc2wuYyAuLi4uLi4uLi4uLi4uLi4gbWFpbiBzb3VyY2UgZmlsZSBjb250YWluaW5nIEFQSSBzdHJ1Y3R1cmVzCi0gICBtb2Rfc3NsLmggLi4uLi4uLi4uLi4uLi4uIGNvbW1vbiBoZWFkZXIgZmlsZSBvZiBtb2Rfc3NsCi0gICBzc2xfZW5naW5lX2NvbXBhdC5jIC4uLi4uIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgc3VwcG9ydAotICAgc3NsX2VuZ2luZV9jb25maWcuYyAuLi4uLiBtb2R1bGUgY29uZmlndXJhdGlvbiBoYW5kbGluZwotICAgc3NsX2VuZ2luZV9kaC5jIC4uLi4uLi4uLiBEU0EvREggc3VwcG9ydAotICAgc3NsX2VuZ2luZV9kcy5jIC4uLi4uLi4uLiBkYXRhIHN0cnVjdHVyZXMKLSAgIHNzbF9lbmdpbmVfZXh0LmMgLi4uLi4uLi4gRXh0ZW5zaW9ucyB0byBvdGhlciBBcGFjaGUgcGFydHMKLSAgIHNzbF9lbmdpbmVfaW5pdC5jIC4uLi4uLi4gbW9kdWxlIGluaXRpYWxpemF0aW9uCi0gICBzc2xfZW5naW5lX2lvLmMgLi4uLi4uLi4uIEkvTyBzdXBwb3J0Ci0gICBzc2xfZW5naW5lX2tlcm5lbC5jIC4uLi4uIFNTTCBlbmdpbmUga2VybmVsCi0gICBzc2xfZW5naW5lX2xvZy5jIC4uLi4uLi4uIGxvZ2ZpbGUgc3VwcG9ydAotICAgc3NsX2VuZ2luZV9tdXRleC5jIC4uLi4uLiBtdXR1YWwgZXhjbHVzaW9uIHN1cHBvcnQKLSAgIHNzbF9lbmdpbmVfcHBocmFzZS5jIC4uLi4gcGFzcy1waHJhc2UgaGFuZGxpbmcKLSAgIHNzbF9lbmdpbmVfcmFuZC5jIC4uLi4uLi4gUFJORyBzdXBwb3J0Ci0gICBzc2xfZW5naW5lX3ZhcnMuYyAuLi4uLi4uIFZhcmlhYmxlIEV4cGFuc2lvbiBzdXBwb3J0Ci0gICBzc2xfZXhwci5jIC4uLi4uLi4uLi4uLi4uIGV4cHJlc3Npb24gaGFuZGxpbmcgbWFpbiBzb3VyY2UKLSAgIHNzbF9leHByLmggLi4uLi4uLi4uLi4uLi4gZXhwcmVzc2lvbiBoYW5kbGluZyBjb21tb24gaGVhZGVyCi0gICBzc2xfZXhwcl9zY2FuLmMgLi4uLi4uLi4uIGV4cHJlc3Npb24gc2Nhbm5lciBhdXRvbWF0b24gKHByZS1nZW5lcmF0ZWQpCi0gICBzc2xfZXhwcl9zY2FuLmwgLi4uLi4uLi4uIGV4cHJlc3Npb24gc2Nhbm5lciBzb3VyY2UKLSAgIHNzbF9leHByX3BhcnNlLmMgLi4uLi4uLi4gZXhwcmVzc2lvbiBwYXJzZXIgYXV0b21hdG9uICAocHJlLWdlbmVyYXRlZCkKLSAgIHNzbF9leHByX3BhcnNlLmggLi4uLi4uLi4gZXhwcmVzc2lvbiBwYXJzZXIgaGVhZGVyICAgICAocHJlLWdlbmVyYXRlZCkKLSAgIHNzbF9leHByX3BhcnNlLnkgLi4uLi4uLi4gZXhwcmVzc2lvbiBwYXJzZXIgc291cmNlCi0gICBzc2xfZXhwcl9ldmFsLmMgLi4uLi4uLi4uIGV4cHJlc3Npb24gbWFjaGluZSBldmFsdWF0aW9uCi0gICBzc2xfc2NhY2hlLmMgLi4uLi4uLi4uLi4uIHNlc3Npb24gY2FjaGUgYWJzdHJhY3Rpb24gbGF5ZXIKLSAgIHNzbF9zY2FjaGVfZGJtLmMgLi4uLi4uLi4gc2Vzc2lvbiBjYWNoZSB2aWEgREJNIGZpbGUKLSAgIHNzbF9zY2FjaGVfc2htY2IuYyAuLi4uLi4gc2Vzc2lvbiBjYWNoZSB2aWEgc2hhcmVkIG1lbW9yeSBjeWNsaWMgYnVmZmVyCi0gICBzc2xfc2NhY2hlX3NobWh0LmMgLi4uLi4uIHNlc3Npb24gY2FjaGUgdmlhIHNoYXJlZCBtZW1vcnkgaGFzaCB0YWJsZQotICAgc3NsX3V0aWwuYyAuLi4uLi4uLi4uLi4uLiB1dGlsaXR5IGZ1bmN0aW9ucwotICAgc3NsX3V0aWxfc3NsLmMgLi4uLi4uLi4uLiB0aGUgT3BlblNTTCBjb21wYW5pb24gc291cmNlCi0gICBzc2xfdXRpbF9zc2wuaCAuLi4uLi4uLi4uIHRoZSBPcGVuU1NMIGNvbXBhbmlvbiBoZWFkZXIKLSAgIHNzbF91dGlsX3NkYm0uYyAuLi4uLi4uLi4gdGhlIFNEQk0gbGlicmFyeSBzb3VyY2UKLSAgIHNzbF91dGlsX3NkYm0uaCAuLi4uLi4uLi4gdGhlIFNEQk0gbGlicmFyeSBoZWFkZXIKLSAgIHNzbF91dGlsX3RhYmxlLmMgLi4uLi4uLi4gdGhlIGhhc2ggdGFibGUgbGlicmFyeSBzb3VyY2UKLSAgIHNzbF91dGlsX3RhYmxlLmggLi4uLi4uLi4gdGhlIGhhc2ggdGFibGUgbGlicmFyeSBoZWFkZXIKLQotIFRoZSBzb3VyY2UgZmlsZXMgYXJlIHdyaXR0ZW4gaW4gY2xlYW4gQU5TSSBDIGFuZCBwYXNzIHRoZSBgYGdjYyAtTyAtZwotIC1nZ2RiMyAtV2FsbCAtV3NoYWRvdyAtV3BvaW50ZXItYXJpdGggLVdjYXN0LWFsaWduIC1XbWlzc2luZy1wcm90b3R5cGVzCi0gLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV25lc3RlZC1leHRlcm5zIC1XaW5saW5lJycgY29tcGlsZXIgdGVzdAotIChhc3N1bWluZyBgZ2NjJyBpcyBHQ0MgMi45NS4yIG9yIG5ld2VyKSB3aXRob3V0IGFueSBjb21wbGFpbnMuIFdoZW4KLSB5b3UgbWFrZSBjaGFuZ2VzIG9yIGFkZGl0aW9ucyBtYWtlIHN1cmUgdGhlIHNvdXJjZSBzdGlsbCBwYXNzZXMgdGhpcwotIGNvbXBpbGVyIHRlc3QuCi0KLSBGVU5DVElPTlMKLSAgCi0gSW5zaWRlIHRoZSBzb3VyY2UgY29kZSB5b3Ugd2lsbCBiZSBjb25mcm9udGVkIHdpdGggdGhlIGZvbGxvd2luZyB0eXBlcyBvZgotIGZ1bmN0aW9ucyB3aGljaCBjYW4gYmUgaWRlbnRpZmllZCBieSB0aGVpciBwcmVmaXhlczoKLQotICAgYXBfeHh4eCgpIC4uLi4uLi4uLi4uLi4uLiBBcGFjaGUgQVBJIGZ1bmN0aW9uCi0gICBzc2xfeHh4eCgpIC4uLi4uLi4uLi4uLi4uIG1vZF9zc2wgZnVuY3Rpb24KLSAgIFNTTF94eHh4KCkgLi4uLi4uLi4uLi4uLi4gT3BlblNTTCBmdW5jdGlvbiAoU1NMIGxpYnJhcnkpCi0gICBPcGVuU1NMX3h4eHgoKSAuLi4uLi4uLi4uIE9wZW5TU0wgZnVuY3Rpb24gKFNTTCBsaWJyYXJ5KQotICAgWDUwOV94eHh4KCkgLi4uLi4uLi4uLi4uLiBPcGVuU1NMIGZ1bmN0aW9uIChDcnlwdG8gbGlicmFyeSkKLSAgIFBFTV94eHh4KCkgLi4uLi4uLi4uLi4uLi4gT3BlblNTTCBmdW5jdGlvbiAoQ3J5cHRvIGxpYnJhcnkpCi0gICBFVlBfeHh4eCgpIC4uLi4uLi4uLi4uLi4uIE9wZW5TU0wgZnVuY3Rpb24gKENyeXB0byBsaWJyYXJ5KQotICAgUlNBX3h4eHgoKSAuLi4uLi4uLi4uLi4uLiBPcGVuU1NMIGZ1bmN0aW9uIChDcnlwdG8gbGlicmFyeSkKLQotIERBVEEgU1RSVUNUVVJFUwotCi0gSW5zaWRlIHRoZSBzb3VyY2UgY29kZSB5b3Ugd2lsbCBiZSBjb25mcm9udGVkIHdpdGggdGhlIGZvbGxvd2luZwotIGRhdGEgc3RydWN0dXJlczoKLQotICAgYXBfY3R4IC4uLi4uLi4uLi4uLi4uLi4uLiBBcGFjaGUgRUFQSSBDb250ZXh0Ci0gICBzZXJ2ZXJfcmVjIC4uLi4uLi4uLi4uLi4uIEFwYWNoZSAoVmlydHVhbCkgU2VydmVyCi0gICBjb25uX3JlYyAuLi4uLi4uLi4uLi4uLi4uIEFwYWNoZSBDb25uZWN0aW9uCi0gICBCVUZGIC4uLi4uLi4uLi4uLi4uLi4uLi4uIEFwYWNoZSBDb25uZWN0aW9uIEJ1ZmZlcgotICAgcmVxdWVzdF9yZWMgLi4uLi4uLi4uLi4uLiBBcGFjaGUgUmVxdWVzdAotICAgU1NMTW9kQ29uZmlnIC4uLi4uLi4uLi4uLiBtb2Rfc3NsIChHbG9iYWwpICBNb2R1bGUgQ29uZmlndXJhdGlvbgotICAgU1NMU3J2Q29uZmlnIC4uLi4uLi4uLi4uLiBtb2Rfc3NsIChWaXJ0dWFsKSBTZXJ2ZXIgQ29uZmlndXJhdGlvbgotICAgU1NMRGlyQ29uZmlnIC4uLi4uLi4uLi4uLiBtb2Rfc3NsIERpcmVjdG9yeSBDb25maWd1cmF0aW9uCi0gICBTU0xfQ1RYIC4uLi4uLi4uLi4uLi4uLi4uIE9wZW5TU0wgQ29udGV4dAotICAgU1NMX01FVEhPRCAuLi4uLi4uLi4uLi4uLiBPcGVuU1NMIFByb3RvY29sIE1ldGhvZAotICAgU1NMX0NJUEhFUiAuLi4uLi4uLi4uLi4uLiBPcGVuU1NMIENpcGhlcgotICAgU1NMX1NFU1NJT04gLi4uLi4uLi4uLi4uLiBPcGVuU1NMIFNlc3Npb24KLSAgIFNTTCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4gT3BlblNTTCBDb25uZWN0aW9uCi0gICBCSU8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uIE9wZW5TU0wgQ29ubmVjdGlvbiBCdWZmZXIKLQotIEZvciBhbiBvdmVydmlldyBob3cgdGhlc2UgYXJlIHJlbGF0ZWQgYW5kIGNoYWluZWQgdG9nZXRoZXIgaGF2ZSBhIGxvb2sgYXQgdGhlCi0gcGFnZSBpbiBSRUFETUUuZHNvdi57ZmlnLHBzfS4gSXQgY29udGFpbnMgb3ZlcnZpZXcgZGlhZ3JhbXMgZm9yIHRob3NlIGRhdGEKLSBzdHJ1Y3R1cmVzLiBJdCdzIGRlc2lnbmVkIGZvciBESU4gQTQgcGFwZXIgc2l6ZSwgYnV0IHlvdSBjYW4gZWFzaWx5IGdlbmVyYXRlCi0gYSBzbWFsbGVyIHZlcnNpb24gaW5zaWRlIFhGaWcgYnkgc3BlY2lmaW5nIGEgbWFnbmlmaWNhdGlvbiBvbiB0aGUgRXhwb3J0Ci0gcGFuZWwuCi0KLSBFWFBFUklNRU5UQUwgQ09ERQotCi0gRXhwZXJpbWVudGFsIGNvZGUgaXMgYWx3YXlzIGVuY2Fwc3VsYXRlZCBhcyBmb2xsb3dpbmc6Ci0KLSAgIHwgI2lmZGVmIFNTTF9FWFBFUklNRU5UQUxfeHh4eAotICAgfCAuLi4KLSAgIHwgI2VuZGlmCi0KLSBUaGlzIHdheSBpdCBpcyBvbmx5IGNvbXBpbGVkIGluIHdoZW4gdGhpcyBkZWZpbmUgaXMgZW5hYmxlZCB3aXRoCi0gdGhlIEFQQUNJIC0tZW5hYmxlLXJ1bGU9U1NMX0VYUEVSSU1FTlRBTCBvcHRpb24gYW5kIGFzIGxvbmcgYXMgdGhlCi0gQyBwcmUtcHJvY2Vzc29yIHZhcmlhYmxlIFNTTF9FWFBFUklNRU5UQUxfeHh4eF9JR05PUkUgaXMgX05PVF8KLSBkZWZpbmVkICh2aWEgQ0ZMQUdTKS4gT3IgaW4gb3RoZXIgd29yZHM6IFNTTF9FWFBFUklNRU5UQUwgZW5hYmxlcyBhbGwKLSBTU0xfRVhQRVJJTUVOVEFMX3h4eHggdmFyaWFibGVzLCBleGNlcHQgaWYgU1NMX0VYUEVSSU1FTlRBTF94eHh4X0lHTk9SRQotIGlzIGFscmVhZHkgZGVmaW5lZC4gQ3VycmVudGx5IHRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGV4cGVyaW1lbnRhbDoKLQotICAgbyBTU0xfRVhQRVJJTUVOVEFMX1BFUkRJUkNBCi0gICAgIFRoZSBhYmlsaXR5IHRvIHVzZSBTU0xDQUNlcnRpZmljYXRlRmlsZSBhbmQgU1NMQ0FDZXJ0aWZpY2F0ZVBhdGgKLSAgICAgaW4gYSBwZXItZGlyZWN0b3J5IGNvbnRleHQgKC5odGFjY2VzcykuIFRoaXMgaXMgcHJvdmlkZWQgYnkgc29tZSBuYXN0eQotICAgICByZWNvbmZpZ3VyYXRpb24gaGFja3MgdW50aWwgT3BlblNTTCBoYXMgYmV0dGVyIHN1cHBvcnQgZm9yIHRoaXMuIEl0Ci0gICAgIHNob3VsZCB3b3JrIG9uIG5vbi1tdWx0aXRocmVhZGVkIHBsYXRmb3JtcyAoYWxsIGJ1dCBXaW4zMikuCi0KLSAgIG8gU1NMX0VYUEVSSU1FTlRBTF9QUk9YWQotICAgICBUaGUgYWJpbGl0eSB0byB1c2UgdmFyaW91cyBhZGRpdGlvbmFsIFNTTFByb3h5WFhYIGRpcmVjdGl2ZXMgaW4KLSAgICAgb2RlciB0byBjb250cm9sIGV4dGVuZGVkIGNsaWVudCBmdW5jdGlvbmFsaXR5IGluIHRoZSBIVFRQUyBwcm94eQotICAgICBjb2RlLgotCi0gICBvIFNTTF9FWFBFUklNRU5UQUxfRU5HSU5FCi0gICAgIFRoZSBhYmlsaXR5IHRvIHN1cHBvcnQgdGhlIG5ldyBmb3J0aGNvbWluZyBPcGVuU1NMIEVOR0lORSBzdHVmZi4KLSAgICAgVW50aWwgdGhpcyBkZXZlbG9wbWVudCBicmFuY2ggb2YgT3BlblNTTCBpcyBtZXJnZWQgaW50byB0aGUgbWFpbgotICAgICBzdHJlYW0sIHlvdSBoYXZlIHRvIHVzZSBvcGVuc3NsLWVuZ2luZS0wLjkueC50YXIuZ3ogZm9yIHRoaXMuCi0gICAgIG1vZF9zc2wgYXV0b21hdGljYWxseSByZWNvZ25pemVzIHRoaXMgT3BlblNTTCB2YXJpYW50IGFuZCB0aGVuIGNhbgotICAgICBhY3RpdmF0ZSBleHRlcm5hbCBjcnlwdG8gZGV2aWNlcyB0aHJvdWdoIFNTTENyeXB0b0RldmljZSBkaXJlY3RpdmUuCi0KLSBWRU5ET1IgRVhURU5TSU9OUwotCi0gSW5zaWRlIHRoZSBtb2Rfc3NsIHNvdXJjZXMgeW91IGNhbiBlbmFibGUgdmFyaW91cyBFQVBJIHZlbmRvciBob29rcwotIChgYXA6Om1vZF9zc2w6OnZlbmRvcjo6eHh4eCcpIGJ5IHVzaW5nIHRoZSBBUEFDSSAtLWVuYWJsZS1ydWxlPVNTTF9WRU5ET1IKLSBvcHRpb24uICBUaGVzZSBob29rcyBjYW4gYmUgdXNlZCB0byBjaGFuZ2Ugb3IgZXh0ZW5kIG1vZF9zc2wgYnkgYSB2ZW5kb3IKLSB3aXRob3V0IHBhdGNoaW5nIHRoZSBzb3VyY2UgY29kZS4gR3JlcCBmb3IgYGFwOjptb2Rfc3NsOjp2ZW5kb3I6OicuCi0gQWRkaXRpb25hbGx5IHZlbmRvcnMgY2FuIGFkZCB0aGVpciBvd24gc291cmNlIGNvZGUgdG8gZmlsZXMgbmFtZWQKLSBzc2xfdmVuZG9yLmMsIHNzbF92ZW5kb3JfWFhYLmMsIGV0Yy4gIFRoZSBsaWJzc2wubW9kdWxlIHNjcmlwdCBhdXRvbWF0aWNhbGx5Ci0gcGlja3MgdGhlc2UgdXAgdW5kZXIgY29uZmlndXJhdGlvbiB0aW1lIGFuZCBtb2Rfc3NsIHVuZGVyIHJ1bi10aW1lIGNhbGxzIHRoZQotIGZ1bmN0aW9ucyBgdm9pZCBzc2xfdmVuZG9yX3JlZ2lzdGVyKHZvaWQpJyBhbmQgYHZvaWQKLSBzc2xfdmVuZG9yX3VucmVnaXN0ZXIodm9pZCknIGluc2lkZSB0aGVzZSBvYmplY3RzIHRvIGJvb3RzdHJhcCB0aGVtLgotCi0gQW4gc3NsX3ZlbmRvci5jIHNob3VsZCBhdCBsZWFzdCBjb250YWluIHRoZSBmb2xsb3dpbmcgY29udGVudHM6Ci0KLSAgIHwgICNpbmNsdWRlICJtb2Rfc3NsLmgiCi0gICB8ICB2b2lkIHNzbF92ZW5kb3JfcmVnaXN0ZXIodm9pZCkgeyByZXR1cm47IH0KLSAgIHwgIHZvaWQgc3NsX3ZlbmRvcl91bnJlZ2lzdGVyKHZvaWQpIHsgcmV0dXJuOyB9Ci0KZGlmZiAtLWdpdCBhL21vZHVsZXMvc3NsL1JFQURNRS5kc292LmZpZyBiL21vZHVsZXMvc3NsL1JFQURNRS5kc292LmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkMDNkYi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL3NzbC9SRUFETUUuZHNvdi5maWcKKysrIC9kZXYvbnVsbApAQCAtMSwzNDYgKzAsMCBAQAotI0ZJRyAzLjIKLUxhbmRzY2FwZQotQ2VudGVyCi1NZXRyaWMKLUxldHRlciAgCi0xMDAuMDAKLVNpbmdsZQotLTIKLTEyMDAgMgotMCAzMiAjNjE2NTYxCi0wIDMzICNiNmIyYjYKLTAgMzQgI2Y3ZjNmNwotMCAzNSAjY2ZjZmNmCi0wIDM2ICNmZmZmZmYKLTYgNjM0NSAyODM1IDcxNTUgMzE1MAotNiA2MzQ1IDI5NzAgNzExMCAzMTUwCi00IDAgMCAyMDAgMCAyMCA4IDAuMDAwMCA0IDEyMCA1ODUgNjM0NSAzMTA1ICJzc2xfbW9kdWxlIilcMDAxCi0tNgotNCAwIDAgMjAwIDAgMjAgOCAwLjAwMDAgNCAxMjAgNjYwIDYzNDUgMjk3MCBhcF9jdHhfZ2V0KC4uLixcMDAxCi0tNgotNiAxMDgwMCAyNjEwIDEyMjQwIDMwNjAKLTQgMCAwIDIwMCAwIDIwIDggMC4wMDAwIDQgMTIwIDExNzAgMTA4MDAgMjc0NSBhcF9nZXRfbW9kdWxlX2NvbmZpZyguLi5cMDAxCi00IDAgMCAyMDAgMCAyMCA4IDAuMDAwMCA0IDEyMCA3OTUgMTA4MDAgMjg4MCAtPnBlcl9kaXJfY29uZmlnLFwwMDEKLTQgMCAwIDIwMCAwIDIwIDggMC4wMDAwIDQgMTIwIDU4NSAxMDgwMCAzMDE1ICZzc2xfbW9kdWxlKVwwMDEKLS02Ci02IDc5MjAgNDc3MCA5MTM1IDQ5OTUKLTIgNCAwIDEgMzUgMzUgMjAwIDAgMjAgMC4wMDAgMCAwIDQgMCAwIDUKLQkgOTEzNSA0OTk1IDc5MjAgNDk5NSA3OTIwIDQ3NzAgOTEzNSA0NzcwIDkxMzUgNDk5NQotNCAwIDAgMTAwIDAgMTggMTIgMC4wMDAwIDQgMTgwIDEwNjUgODAxMCA0OTUwIHJlcXVlc3RfcmVjXDAwMQotLTYKLTIgMSAwIDEgMCAzNCAyMDAgMCAyMCAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNjk3NSAzMzMwIDc0MjUgMjUyMAotMiAxIDAgMSAwIDM0IDIwMCAwIDIwIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA3MjAwIDQyMzAgOTQ1MCAyNTIwCi0yIDEgMCAxIDAgMzQgMjAwIDAgMjAgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDc4NzUgNDkwNSA3MjAwIDUyMjAKLTIgMSAwIDEgMCAzNCAyMDAgMCAyMCAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNjc1MCA1MTMwIDY3NTAgNDU0NQotMiAxIDAgMSAwIDM0IDIwMCAwIDIwIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA2NzA1IDU0NDUgNzE1NSA2MTIwCi0yIDEgMCAxIDAgMzQgMjAwIDAgMjAgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDc4NzUgNDgxNSA3MjAwIDQ1OTAKLTIgMSAwIDEgMCAzNCAyMDAgMCAyMCAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgOTU4NSAyNTY1IDExNDc1IDQyMzAKLTIgMSAwIDEgMCAzNCAyMDAgMCAyMCAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMTAxNzAgNTEzMCAxMTgzNSA0NTQ1Ci0yIDEgMCAxIDAgMzQgMjAwIDAgMjAgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDc5MjAgNjA3NSA5ODU1IDU0MDAKLTIgMSAwIDEgMCAzNCAyMDAgMCAyMCAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgOTk5MCA1NDQ1IDEwOTM1IDU2MjUKLTIgMSAwIDEgMCAzNCAyMDAgMCAyMCAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMTAyMTUgNTMxMCAxMDkzNSA1MzEwCi0yIDEgMCAxIDAgMzQgMjAwIDAgMjAgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDExOTI1IDQ1OTAgMTE5MjUgNTA4NQotMiAxIDAgMSAwIDM0IDIwMCAwIDIwIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA5ODEwIDU0OTAgOTgxMCA2ODQwCi0yIDEgMCAxIDAgMzQgMjAwIDAgMjAgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDk5NDUgNTQ0NSAxMDkzNSA2MDMwCi0yIDEgMCAxIDAgMzQgMjAwIDAgMjAgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDg4NjUgNDcyNSAxMDgwMCAyNTY1Ci0yIDEgMCAzIDAgMzQgMjAwIDAgMjAgMC4wMDAgMCAwIC0xIDAgMCAyCi0JIDY3NSA2MDc1IDU4NTAgNjA3NQotMiAxIDIgMSAwIDM0IDIwMCAwIDIwIDEuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA2NzUgNjUyNSA2NzUgNjA3NQotMiAxIDIgMSAwIDM0IDIwMCAwIDIwIDEuMDAwIDAgMCAtMSAxIDAgMgotCTEgMCAxLjAwIDYwLjAwIDEyMC4wMAotCSA1ODUwIDYwNzUgNTg1MCA2NTI1Ci0yIDEgMCAzIDAgMzQgMjAwIDAgMjAgMC4wMDAgMCAwIC0xIDAgMCAyCi0JIDkwMCA1NjI1IDU2MjUgNTYyNQotMiAxIDAgMyAwIDM0IDIwMCAwIDIwIDAuMDAwIDAgMCAtMSAwIDAgMgotCSAxMTI1IDUxNzUgNTQwMCA1MTc1Ci0yIDEgMCAzIDAgMzQgMjAwIDAgMjAgMC4wMDAgMCAwIC0xIDAgMCAyCi0JIDEzNTAgNDcyNSA1MTc1IDQ3MjUKLTIgMSAwIDMgMCAzNCAyMDAgMCAyMCAwLjAwMCAwIDAgLTEgMCAwIDIKLQkgMTU3NSA0Mjc1IDQ5NTAgNDI3NQotMiAxIDAgMyAwIDM0IDIwMCAwIDIwIDAuMDAwIDAgMCAtMSAwIDAgMgotCSAxODAwIDM4MjUgNDcyNSAzODI1Ci0yIDEgMCAzIDAgMzQgMjAwIDAgMjAgMC4wMDAgMCAwIC0xIDAgMCAyCi0JIDIwMjUgMzM3NSA0NTAwIDMzNzUKLTIgMSAwIDMgMCAzNCAyMDAgMCAyMCAwLjAwMCAwIDAgLTEgMCAwIDIKLQkgMjI1MCAyOTI1IDQyNzUgMjkyNQotMiAxIDAgMyAwIDM0IDIwMCAwIDIwIDAuMDAwIDAgMCAtMSAwIDAgMgotCSAyNDc1IDI0NzUgNDA1MCAyNDc1Ci0yIDEgMCAzIDAgMzQgMjAwIDAgMjAgMC4wMDAgMCAwIC0xIDAgMCAyCi0JIDI3MDAgMjAyNSAzODI1IDIwMjUKLTIgMSAwIDMgMCAzNCAyMDAgMCAyMCAwLjAwMCAwIDAgLTEgMCAwIDIKLQkgMjkyNSAxNTc1IDM2MDAgMTU3NQotMiAxIDIgMSAwIDM0IDIwMCAwIDIwIDEuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA5MDAgNjA3NSA5MDAgNTYyNQotMiAxIDIgMSAwIDM0IDIwMCAwIDIwIDEuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAxMTI1IDY1MjUgMTEyNSA1MTc1Ci0yIDEgMiAxIDAgMzQgMjAwIDAgMjAgMS4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDEzNTAgNTE3NSAxMzUwIDQ3MjUKLTIgMSAyIDEgMCAzNCAyMDAgMCAyMCAxLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMTU3NSA0NzI1IDE1NzUgNDI3NQotMiAxIDIgMSAwIDM0IDIwMCAwIDIwIDEuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAxODAwIDY1MjUgMTgwMCAzODI1Ci0yIDEgMiAxIDAgMzQgMjAwIDAgMjAgMS4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDIwMjUgMzgyNSAyMDI1IDMzNzUKLTIgMSAyIDEgMCAzNCAyMDAgMCAyMCAxLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMjI1MCAzMzc1IDIyNTAgMjkyNQotMiAxIDIgMSAwIDM0IDIwMCAwIDIwIDEuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAyNDc1IDI5MjUgMjQ3NSAyNDc1Ci0yIDEgMiAxIDAgMzQgMjAwIDAgMjAgMS4wMDAgMCAwIC0xIDEgMCAyCi0JMSAwIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDU2MjUgNTYyNSA1NjI1IDYwNzUKLTIgMSAyIDEgMCAzNCAyMDAgMCAyMCAxLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDAgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNTQwMCA1MTc1IDU0MDAgNjUyNQotMiAxIDIgMSAwIDM0IDIwMCAwIDIwIDEuMDAwIDAgMCAtMSAxIDAgMgotCTEgMCAxLjAwIDYwLjAwIDEyMC4wMAotCSA1MTc1IDQ3MjUgNTE3NSA1MTc1Ci0yIDEgMiAxIDAgMzQgMjAwIDAgMjAgMS4wMDAgMCAwIC0xIDEgMCAyCi0JMSAwIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDQ5NTAgNDI3NSA0OTUwIDQ3MjUKLTIgMSAyIDEgMCAzNCAyMDAgMCAyMCAxLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDAgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNDcyNSAzODI1IDQ3MjUgNjUyNQotMiAxIDIgMSAwIDM0IDIwMCAwIDIwIDEuMDAwIDAgMCAtMSAxIDAgMgotCTEgMCAxLjAwIDYwLjAwIDEyMC4wMAotCSA0NTAwIDMzNzUgNDUwMCAzODI1Ci0yIDEgMiAxIDAgMzQgMjAwIDAgMjAgMS4wMDAgMCAwIC0xIDEgMCAyCi0JMSAwIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDQyNzUgMjkyNSA0Mjc1IDMzNzUKLTIgMSAyIDEgMCAzNCAyMDAgMCAyMCAxLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDAgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNDA1MCAyNDc1IDQwNTAgMjkyNQotMiAxIDIgMSAwIDM0IDIwMCAwIDIwIDEuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAyNzAwIDY1MjUgMjcwMCAyMDI1Ci0yIDEgMiAxIDAgMzQgMjAwIDAgMjAgMS4wMDAgMCAwIC0xIDEgMCAyCi0JMSAwIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDM4MjUgMjAyNSAzODI1IDY1MjUKLTIgMSAyIDEgMCAzNCAyMDAgMCAyMCAxLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDAgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMzYwMCAxNTc1IDM2MDAgMjAyNQotMiAxIDIgMSAwIDM0IDIwMCAwIDIwIDEuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAyOTI1IDIwMjUgMjkyNSAxNTc1Ci0yIDEgMCA0IDAgMCAyMDAgMCAyMCAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgNC4wMCA2MC4wMCAxMjAuMDAKLQkgNTQwIDY1MjUgNjMwMCA2NTI1Ci0yIDMgMCAxIDcgNyA4MDAgMCAyMCAwLjAwMCAwIDAgLTEgMCAwIDkKLQkgNjc1IDY1MjUgNTg1MCA2NTI1IDU4NTAgNjA3NSA1NjI1IDYwNzUgNTYyNSA1NjI1IDkwMCA1NjI1Ci0JIDkwMCA2MDc1IDY3NSA2MDc1IDY3NSA2NTI1Ci0yIDMgMCAxIDM0IDM0IDcwMCAwIDIwIDAuMDAwIDAgMCAtMSAwIDAgMTMKLQkgMTEyNSA2NTI1IDUzNTUgNjUyNSA1NDAwIDUxNzUgNTE3NSA1MTc1IDUxNzUgNDcyNSA0OTUwIDQ3MjUKLQkgNDk1MCA0Mjc1IDE1NzUgNDI3NSAxNTc1IDQ3MjUgMTM1MCA0NzI1IDEzNTAgNTE3NSAxMTI1IDUxNzUKLQkgMTEyNSA2NTI1Ci0yIDMgMCAxIDM1IDM1IDUwMCAwIDIwIDAuMDAwIDAgMCAtMSAwIDAgMTcKLQkgMTgwMCA2NTI1IDQ3MjUgNjUyNSA0NzI1IDM4MjUgNDUwMCAzODI1IDQ1MDAgMzM3NSA0Mjc1IDMzNzUKLQkgNDI3NSAyOTI1IDQwNTAgMjkyNSA0MDUwIDI0NzUgMjQ3NSAyNDc1IDI0NzUgMjkyNSAyMjUwIDI5MjUKLQkgMjI1MCAzMzc1IDIwMjUgMzM3NSAyMDI1IDM4MjUgMTgwMCAzODI1IDE4MDAgNjUyNQotMiAzIDAgMSAzMyAzMyA0MDAgMCAyMCAwLjAwMCAwIDAgLTEgMCAwIDkKLQkgMjcwMCA2NTI1IDM4MjUgNjUyNSAzODI1IDIwMjUgMzYwMCAyMDI1IDM2MDAgMTU3NSAyOTI1IDE1NzUKLQkgMjkyNSAyMDI1IDI3MDAgMjAyNSAyNzAwIDY1MjUKLTIgMSAwIDEgMCAzNCAyMDAgMCAyMCAwLjAwMCAwIDAgLTEgMSAxIDIKLQkyIDAgMS4wMCA2MC4wMCAxMjAuMDAKLQkyIDAgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMjcwMCA2NzUwIDM4MjUgNjc1MAotMiAxIDAgMSAwIDM0IDIwMCAwIDIwIDAuMDAwIDAgMCAtMSAxIDEgMgotCTIgMCAxLjAwIDYwLjAwIDEyMC4wMAotCTIgMCAxLjAwIDYwLjAwIDEyMC4wMAotCSAxMTI1IDcyMDAgNTQwMCA3MjAwCi0yIDEgMCAxIDAgMzQgMjAwIDAgMjAgMC4wMDAgMCAwIC0xIDEgMSAyCi0JMiAwIDEuMDAgNjAuMDAgMTIwLjAwCi0JMiAwIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDE4MDAgNjk3NSA0NzI1IDY5NzUKLTIgMSAwIDEgMCAzNCAyMDAgMCAyMCAwLjAwMCAwIDAgLTEgMSAxIDIKLQkyIDAgMS4wMCA2MC4wMCAxMjAuMDAKLQkyIDAgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNjc1IDc0MjUgNTg1MCA3NDI1Ci0yIDEgMiAxIDAgMzQgMjAwIDAgMjAgMy4wMDAgMCAxIC0xIDAgMCAyCi0JIDY3NSA2NTcwIDY3NSA3NjUwCi0yIDEgMiAxIDAgMzQgMjAwIDAgMjAgMy4wMDAgMCAxIC0xIDAgMCAyCi0JIDExMjUgNjU3MCAxMTI1IDc2NTAKLTIgMSAyIDEgMCAzNCAyMDAgMCAyMCAzLjAwMCAwIDEgLTEgMCAwIDIKLQkgMTgwMCA2NTcwIDE4MDAgNzY1MAotMiAxIDIgMSAwIDM0IDIwMCAwIDIwIDMuMDAwIDAgMSAtMSAwIDAgMgotCSAyNzAwIDY1NzAgMjcwMCA3NjUwCi0yIDEgMiAxIDAgMzQgMjAwIDAgMjAgMy4wMDAgMCAxIC0xIDAgMCAyCi0JIDM4MjUgNjU3MCAzODI1IDc2NTAKLTIgMSAyIDEgMCAzNCAyMDAgMCAyMCAzLjAwMCAwIDEgLTEgMCAwIDIKLQkgNDcyNSA2NTcwIDQ3MjUgNzY1MAotMiAxIDIgMSAwIDM0IDIwMCAwIDIwIDMuMDAwIDAgMSAtMSAwIDAgMgotCSA1NDAwIDY1NzAgNTQwMCA3NjUwCi0yIDEgMiAxIDAgMzQgMjAwIDAgMjAgMy4wMDAgMCAxIC0xIDAgMCAyCi0JIDU4NTAgNjU3MCA1ODUwIDc2NTAKLTIgNCAwIDIgMCA3IDEwMCAwIC0xIDAuMDAwIDAgMCAyMCAwIDAgNQotCSAxMjYwMCA4NTUwIDQ1MCA4NTUwIDQ1MCAyMjUgMTI2MDAgMjI1IDEyNjAwIDg1NTAKLTIgNCAwIDEgMCAzNCAyMDAgMCAyMCAwLjAwMCAwIDAgMjAgMCAwIDUKLQkgMTI2MDAgMTM1MCA0NTAgMTM1MCA0NTAgMjI1IDEyNjAwIDIyNSAxMjYwMCAxMzUwCi0yIDQgMCAxIDM1IDM1IDIwMCAwIDIwIDAuMDAwIDAgMCA0IDAgMCA1Ci0JIDEwMTcwIDI0NzUgODc3NSAyNDc1IDg3NzUgMjI1MCAxMDE3MCAyMjUwIDEwMTcwIDI0NzUKLTIgNCAwIDEgMzUgMzUgMjAwIDAgMjAgMC4wMDAgMCAwIDQgMCAwIDUKLQkgMTE5MjUgMjQ3NSAxMDU3NSAyNDc1IDEwNTc1IDIyNTAgMTE5MjUgMjI1MCAxMTkyNSAyNDc1Ci0yIDQgMCAxIDM1IDM1IDIwMCAwIDIwIDAuMDAwIDAgMCA0IDAgMCA1Ci0JIDEyMzc1IDQ1MDAgMTE0MzAgNDUwMCAxMTQzMCA0Mjc1IDEyMzc1IDQyNzUgMTIzNzUgNDUwMAotMiA0IDAgMSAzNSAzNSAyMDAgMCAyMCAwLjAwMCAwIDAgNCAwIDAgNQotCSAxMjM3NSA1NDAwIDEwOTgwIDU0MDAgMTA5ODAgNTE3NSAxMjM3NSA1MTc1IDEyMzc1IDU0MDAKLTIgNCAwIDEgMzUgMzUgMjAwIDAgMjAgMC4wMDAgMCAwIDQgMCAwIDUKLQkgMTAxNzAgNTQwMCA5Njc1IDU0MDAgOTY3NSA1MTc1IDEwMTcwIDUxNzUgMTAxNzAgNTQwMAotMiA0IDAgMSAzNSAzNSAyMDAgMCAyMCAwLjAwMCAwIDAgNCAwIDAgNQotCSA3ODc1IDYzMDAgNzIwMCA2MzAwIDcyMDAgNjA3NSA3ODc1IDYwNzUgNzg3NSA2MzAwCi0yIDQgMCAxIDM1IDM1IDIwMCAwIDIwIDAuMDAwIDAgMCA0IDAgMCA1Ci0JIDgxOTAgMjQ3NSA2NzUwIDI0NzUgNjc1MCAyMjUwIDgxOTAgMjI1MCA4MTkwIDI0NzUKLTIgNCAwIDEgMzUgMzUgMjAwIDAgMjAgMC4wMDAgMCAwIDQgMCAwIDUKLQkgNzYwNSAzNjAwIDYzMDAgMzYwMCA2MzAwIDMzNzUgNzYwNSAzMzc1IDc2MDUgMzYwMAotMiA0IDAgMSAzNSAzNSAyMDAgMCAyMCAwLjAwMCAwIDAgNCAwIDAgNQotCSA3MzM1IDQ1MDAgNjMwMCA0NTAwIDYzMDAgNDI3NSA3MzM1IDQyNzUgNzMzNSA0NTAwCi0yIDQgMCAxIDM1IDM1IDIwMCAwIDIwIDAuMDAwIDAgMCA0IDAgMCA1Ci0JIDcyMDAgNTQwMCA2MzAwIDU0MDAgNjMwMCA1MTc1IDcyMDAgNTE3NSA3MjAwIDU0MDAKLTIgMSAwIDYgNyA3IDYwMCAwIC0xIDAuMDAwIDAgMCAtMSAwIDAgMgotCSA5NDUwIDQ1MDAgNjA3NSAxOTM1Ci0yIDEgMCA2IDcgNyA2MDAgMCAtMSAwLjAwMCAwIDAgNCAwIDAgMgotCSA5NDUwIDQ1MDAgMTI0NjUgMjIwNQotMiAxIDAgNiA3IDcgNjAwIDAgLTEgMC4wMDAgMCAwIDQgMCAwIDIKLQkgOTQ1MCA0NTAwIDk0NTAgNzc4NQotMiAxIDAgMSAwIDM0IDIwMCAwIDIwIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA5NjMwIDUzMTAgNzI0NSA1MzEwCi0yIDEgMCAxIDAgMzQgMjAwIDAgMjAgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDExMzg1IDQzNjUgNzM4MCA0MzY1Ci0yIDQgMCAxIDM1IDM1IDIwMCAwIDIwIDAuMDAwIDAgMCA0IDAgMCA1Ci0JIDEyMjQwIDU4MDUgMTA5ODAgNTgwNSAxMDk4MCA1NTgwIDEyMjQwIDU1ODAgMTIyNDAgNTgwNQotMiA0IDAgMSAzNSAzNSAyMDAgMCAyMCAwLjAwMCAwIDAgNCAwIDAgNQotCSAxMjM3NSA2MjEwIDEwOTgwIDYyMTAgMTA5ODAgNTk4NSAxMjM3NSA1OTg1IDEyMzc1IDYyMTAKLTIgMSAwIDEgMCAzNCAyMDAgMCAyMCAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMTEyMDUgNjg4NSA5OTAwIDU0NDUKLTIgNCAwIDEgMzUgMzUgMjAwIDAgMjAgMC4wMDAgMCAwIDQgMCAwIDUKLQkgMTIyODUgNzE1NSAxMDUzMCA3MTU1IDEwNTMwIDY5MzAgMTIyODUgNjkzMCAxMjI4NSA3MTU1Ci0yIDQgMCAxIDM1IDM1IDIwMCAwIDIwIDAuMDAwIDAgMCA0IDAgMCA1Ci0JIDEwMTcwIDcxNTUgOTYzMCA3MTU1IDk2MzAgNjkzMCAxMDE3MCA2OTMwIDEwMTcwIDcxNTUKLTIgMSAwIDYgNyA3IDYwMCAwIC0xIDAuMDAwIDAgMCA0IDAgMCAyCi0JIDEyNTEwIDY0MzUgOTQ1MCA2NDM1Ci0yIDEgMCAxIDAgMzQgMzAwIDAgMjAgMC4wMDAgMCAwIDcgMSAwIDQKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMTIzNzUgNDQ1NSAxMjUxMCA0NjM1IDEyNTEwIDYyMTAgMTE5NzAgNjg4NQotMiAxIDIgMSAwIDM0IDIwMCAwIDIwIDEuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA5ODUwIDUxNDMgOTE3NSA0OTE4Ci0zIDEgMCAxIDM0IDM0IDgwMCAwIDIwIDAuMDAwIDAgMCAwIDQxCi0JIDczODAgMTcxMCA2MzkwIDIxMTUgNTUzNSAyMTE1IDYwNzUgMzAxNSA1NjcwIDM0NjUgNjE2NSAzOTE1Ci0JIDU3MTUgNDQxMCA2MDMwIDUwNDAgNjAzMCA1MzEwIDY0ODAgNTcxNSA2MzkwIDYyNTUgNjk3NSA2MzAwCi0JIDcwNjUgNjk3NSA3OTY1IDY3NTAgODEwMCA3NTYwIDg5NTUgNzI5MCA5MzYwIDc3NDAgOTcyMCA3NTYwCi0JIDEwNzU1IDgxNDUgMTIwNjAgODI4MCAxMjM3NSA3NjUwIDEyNDIwIDcyMDAgMTI1MTAgNzA2NSAxMjMzMCA2NjYwCi0JIDEyNTEwIDYzOTAgMTI0MjAgNTk0MCAxMjM3NSA1NDAwIDEyNTEwIDUyMjAgMTI1MTAgNDcyNSAxMjYwMCA0Mjc1Ci0JIDEyMzc1IDM2NDUgMTIxMDUgMzI0MCAxMjE1MCAyNzQ1IDEyMzc1IDI3MDAgMTIzMzAgMTk4MCAxMTc5MCAxNTc1Ci0JIDExMjUwIDE5MzUgMTAxMjUgMTQ4NSA4OTU1IDIwNzAgNzc4NSAxNjIwIDc2OTUgMTU3NQotCSAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMAotCSAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMAotCSAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMAotCSAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMAotCSAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMCAxLjAwMAotCSAxLjAwMAotNCAwIDAgMTAwIDAgMCAxMiAwLjAwMDAgNCAxODAgMTQ0MCAxMDU3NSA2NzUgUmFsZiBTLiBFbmdlbHNjaGFsbFwwMDEKLTQgMCAwIDEwMCAwIDE4IDIwIDAuMDAwMCA0IDI3MCAzODQwIDQyNzUgNjc1IEFwYWNoZSttb2Rfc3NsK09wZW5TU0xcMDAxCi00IDAgMCAxMDAgMCAwIDEwIDAuMDAwMCA0IDEzNSAxMzIwIDEwNTc1IDg1NSByc2VAZW5nZWxzY2hhbGwuY29tXDAwMQotNCAwIDAgMTAwIDAgMCAxMCAwLjAwMDAgNCAxMzUgMTQxMCAxMDU3NSAxMDM1IHd3dy5lbmdlbHNjaGFsbC5jb21cMDAxCi00IDAgMCAxMDAgMCAwIDEyIDAuMDAwMCA0IDEzNSA4NzAgOTAwIDY3NSBWZXJzaW9uIDEuM1wwMDEKLTQgMCAwIDEwMCAwIDAgMTIgMC4wMDAwIDQgMTgwIDEwMzUgOTAwIDg1NSAxMi1BcHItMTk5OVwwMDEKLTQgMCAwIDIwMCAwIDIwIDggMC4wMDAwIDQgNjAgMzkwIDYyMTAgNDY4MCAtPnNlcnZlclwwMDEKLTQgMCAwIDIwMCAwIDIwIDggMC4wMDAwIDQgMTIwIDg1NSA4MjgwIDYxMjAgYXBfY3R4X2dldCguLi4sInNzbCIpXDAwMQotNCAwIDAgMjAwIDAgMjAgOCAwLjAwMDAgNCAxMjAgMTE3MCA3NzQwIDI3MDAgYXBfZ2V0X21vZHVsZV9jb25maWcoLi4uXDAwMQotNCAwIDAgMjAwIDAgMjAgOCAwLjAwMDAgNCAxMjAgODEwIDc3NDAgMjgzNSAtPm1vZHVsZV9jb25maWcsXDAwMQotNCAwIDAgMjAwIDAgMjAgOCAwLjAwMDAgNCAxMjAgNTg1IDc3NDAgMjk3MCAmc3NsX21vZHVsZSlcMDAxCi00IDAgMCAxMDAgMCAxOCAyMCAwLjAwMDAgNCAyNzAgMTIwMCA5MDAwIDgxMDAgQ2hhaW5pbmdcMDAxCi00IDAgMCAxMDAgMCAxOCAyMCAwLjAwMDAgNCAyMTAgMTA5NSAyNzQ1IDgxMDAgTGlmZXRpbWVcMDAxCi00IDAgMCAxMDAgMCAxOCAxMiAwLjAwMDAgNCAxODAgMTIxNSA4MTAgNjI1NSBhcF9nbG9iYWxfY3R4XDAwMQotNCAwIDAgMTAwIDAgMTggMTIgMC4wMDAwIDQgMTgwIDEzMDUgOTkwIDU4MDUgU1NMTW9kQ29uZmlnXDAwMQotNCAwIDAgMTAwIDAgMTggMTIgMC4wMDAwIDQgMTgwIDg0MCA0MDUwIDQ0NTUgU1NMX0NUWFwwMDEKLTQgMCAwIDEwMCAwIDE4IDEyIDAuMDAwMCA0IDE1MCA5NzUgNDQ1NSA1MzU1IHNlcnZlcl9yZWNcMDAxCi00IDAgMCAxMDAgMCAxOCAxMiAwLjAwMDAgNCAxODAgMTI2MCAzODcwIDQ5MDUgU1NMU3J2Q29uZmlnXDAwMQotNCAwIDAgMTAwIDAgMTggMTIgMC4wMDAwIDQgMTM1IDQ4MCAxODQ1IDQwMDUgQlVGRlwwMDEKLTQgMCAwIDEwMCAwIDE4IDEyIDAuMDAwMCA0IDE1MCA4MTAgMjA3MCAzNTU1IGNvbm5fcmVjXDAwMQotNCAwIDAgMTAwIDAgMTggMTIgMC4wMDAwIDQgMTM1IDM0NSAyMjk1IDMxMDUgQklPXDAwMQotNCAwIDAgMTAwIDAgMTggMTIgMC4wMDAwIDQgMTM1IDM3NSAyNTY1IDI2NTUgU1NMXDAwMQotNCAwIDAgMTAwIDAgMTggMTIgMC4wMDAwIDQgMTgwIDExODUgMzY0NSAxNjIwIFNTTERpckNvbmZpZ1wwMDEKLTQgMCAwIDEwMCAwIDE4IDEyIDAuMDAwMCA0IDE4MCAxMDY1IDM5MTUgMjA3MCByZXF1ZXN0X3JlY1wwMDEKLTQgMCAwIDIwMCAwIDAgOCAwLjAwMDAgNCAxMjAgMTQ0MCA5MDAgNzU2MCBTdGFydHVwLCBSdW50aW1lLCBTaHV0ZG93blwwMDEKLTQgMCAwIDIwMCAwIDAgOCAwLjAwMDAgNCAxMDUgOTc1IDEzNTAgNzMzNSBDb25maWd1cmF0aW9uIFRpbWVcMDAxCi00IDAgMCAyMDAgMCAwIDggMC4wMDAwIDQgOTAgMTA1MCAyMDI1IDcxMTAgQ29ubmVjdGlvbiBEdXJhdGlvblwwMDEKLTQgMCAwIDIwMCAwIDAgOCAwLjAwMDAgNCAxMjAgODg1IDI4MzUgNjg4NSBSZXF1ZXN0IER1cmF0aW9uXDAwMQotNCAwIDAgMjAwIDAgMTggMjAgMC4wMDAwIDQgMTk1IDkwIDYzNDUgNjc5NSB0XDAwMQotNCAwIDAgMjAwIDAgMjAgOCAwLjAwMDAgNCA5MCAzNDUgNzExMCA1OTg1IC0+Y2xpZW50XDAwMQotNCAwIDAgMTAwIDAgMTggMTIgMC4wMDAwIDQgMTgwIDEzMDUgNjc5NSAyNDMwIFNTTE1vZENvbmZpZ1wwMDEKLTQgMCAwIDEwMCAwIDE4IDEyIDAuMDAwMCA0IDE4MCAxMjYwIDg4NjUgMjQzMCBTU0xTcnZDb25maWdcMDAxCi00IDAgMCAxMDAgMCAxOCAxMiAwLjAwMDAgNCAxODAgMTIxNSA2MzQ1IDM1NTUgYXBfZ2xvYmFsX2N0eFwwMDEKLTQgMCAwIDEwMCAwIDE4IDEyIDAuMDAwMCA0IDE1MCA5NzUgNjM0NSA0NDU1IHNlcnZlcl9yZWNcMDAxCi00IDAgMCAxMDAgMCAxOCAxMiAwLjAwMDAgNCAxNTAgODEwIDYzNDUgNTM1NSBjb25uX3JlY1wwMDEKLTQgMCAwIDEwMCAwIDE4IDEyIDAuMDAwMCA0IDEzNSAzNzUgOTcyMCA1MzU1IFNTTFwwMDEKLTQgMCAwIDEwMCAwIDE4IDEyIDAuMDAwMCA0IDE4MCAxMTg1IDEwNjY1IDI0MzAgU1NMRGlyQ29uZmlnXDAwMQotNCAwIDAgMTAwIDAgMTggMTIgMC4wMDAwIDQgMTM1IDQ4MCA3MjkwIDYyNTUgQlVGRlwwMDEKLTQgMCAwIDEwMCAwIDE4IDEyIDAuMDAwMCA0IDE4MCAxMzA1IDExMDI1IDUzNTUgU1NMX01FVEhPRFwwMDEKLTQgMCAwIDEwMCAwIDE4IDEyIDAuMDAwMCA0IDE4MCA4NDAgMTE0NzUgNDQ1NSBTU0xfQ1RYXDAwMQotNCAwIDAgMTAwIDAgMTggMjQgMC4wMDAwIDQgMjg1IDQzNjUgMzkxNSAxMDgwIERhdGEgU3RydWN0dXJlIE92ZXJ2aWV3XDAwMQotNCAwIDAgMjAwIDAgMjAgOCAwLjAwMDAgNCA5MCA2MTUgNzA2NSA1MDg1IC0+Y29ubmVjdGlvblwwMDEKLTQgMCAwIDIwMCAwIDIwIDggMC4wMDAwIDQgNjAgMzkwIDcwNjUgNDc3MCAtPnNlcnZlclwwMDEKLTQgMCAwIDIwMCAwIDIwIDggMC4wMDAwIDQgMTIwIDk2MCA4MDEwIDU0NDUgU1NMX2dldF9hcHBfZGF0YSgpXDAwMQotNCAwIDAgMjAwIDAgMjAgOCAwLjAwMDAgNCAxMjAgNTEwIDEwNTMwIDQwNTAgLT5wU1NMQ3R4XDAwMQotNCAwIDAgMjAwIDAgMjAgOCAwLjAwMDAgNCAxMjAgMTIxNSA3ODc1IDQyNzUgU1NMX0NUWF9nZXRfYXBwX2RhdGEoKVwwMDEKLTQgMCAwIDIwMCAwIDIwIDggMC4wMDAwIDQgMTIwIDExNTUgMTAzMDUgNTUzNSBTU0xfZ2V0X2N1cnJlbnRfY2lwaGVyKClcMDAxCi00IDAgMCAxMDAgMCAxOCAxMiAwLjAwMDAgNCAxODAgMTE3MCAxMTAyNSA1NzYwIFNTTF9DSVBIRVJcMDAxCi00IDAgMCAxMDAgMCAxOCAxMiAwLjAwMDAgNCAxODAgMTM1MCAxMDk4MCA2MTY1IFNTTF9TRVNTSU9OXDAwMQotNCAwIDAgMjAwIDAgMjAgOCAwLjAwMDAgNCAxMjAgODQwIDEwNDQwIDU5NDAgU1NMX2dldF9zZXNzaW9uKClcMDAxCi00IDAgMCAxMDAgMCAxOCAxMiAwLjAwMDAgNCAxODAgMTY2NSAxMDU3NSA3MTEwIFg1MDlfU1RPUkVfQ1RYXDAwMQotNCAwIDAgMTAwIDAgMTggMTIgMC4wMDAwIDQgMTM1IDM0NSA5NzIwIDcxMTAgQklPXDAwMQotNCAwIDAgMjAwIDAgMjAgOCAwLjAwMDAgNCAxMjAgODQwIDk1NDAgNzMzNSBTU0xfZ2V0X3tyLHd9YmlvKClcMDAxCi00IDAgMCAxMDAgMCAxOCAyMCAwLjAwMDAgNCAyNzAgMTE3MCA4NzMwIDM0NjUgbW9kX3NzbFwwMDEKLTQgMCAwIDEwMCAwIDE4IDIwIDAuMDAwMCA0IDI3MCAxMDUwIDgxNDUgNjc1MCBBcGFjaGVcMDAxCi00IDAgMCAyMDAgMCAyMCA4IDAuMDAwMCA0IDEyMCA5NDUgMTAxMjUgNDY4MCBTU0xfZ2V0X1NTTF9DVFgoKVwwMDEKLTQgMCAwIDIwMCAwIDIwIDggMC4wMDAwIDQgMTIwIDExNzAgMTAzNTAgNTE3NSBTU0xfZ2V0X1NTTF9NRVRIT0QoKVwwMDEKLTQgMCAwIDIwMCAwIDIwIDggMC4wMDAwIDQgOTAgNDY1IDExNzQ1IDQ3NzAgLT5tZXRob2RcMDAxCi00IDAgMCAyMDAgMCAyMCA4IDAuMDAwMCA0IDEyMCAxNjY1IDk5NDUgNjQ4MCBYNTA5X1NUT1JFX0NUWF9nZXRfYXBwX2RhdGEoKVwwMDEKLTQgMCAwIDIwMCAwIDIwIDggMC4wMDAwIDQgMTIwIDEyMTUgMTA5ODAgNjcwNSBTU0xfQ1RYX2dldF9jZXJ0X3N0b3JlKClcMDAxCi00IDAgMCAyMDAgMCAyMCA4IDAuMDAwMCA0IDEyMCAxMDIwIDgyODAgNTEzMCBTU0xfZ2V0X2FwcF9kYXRhMigpXDAwMQotNCAwIDAgMTAwIDAgMTggMjAgMC4wMDAwIDQgMjcwIDEyOTAgMTA3MTAgNzYwNSBPcGVuU1NMXDAwMQotNCAwIDAgMTAwIDAgMTggMTIgMC4wMDAwIDQgMTgwIDcyMCAxMDcxMCA3Nzg1IFtDcnlwdG9dXDAwMQotNCAwIDAgMTAwIDAgMTggMjAgMC4wMDAwIDQgMjcwIDEyOTAgMTA5MzUgMzY0NSBPcGVuU1NMXDAwMQotNCAwIDAgMTAwIDAgMTggMTIgMC4wMDAwIDQgMTgwIDQ5NSAxMDkzNSAzODI1IFtTU0xdXDAwMQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zc2wvUkVBRE1FLmRzb3YucHMgYi9tb2R1bGVzL3NzbC9SRUFETUUuZHNvdi5wcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVmMTlkYi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL3NzbC9SRUFETUUuZHNvdi5wcworKysgL2Rldi9udWxsCkBAIC0xLDExMzggKzAsMCBAQAotJSFQUy1BZG9iZS0yLjAKLSUlVGl0bGU6IFJFQURNRS5kc292LnBzCi0lJUNyZWF0b3I6IGZpZzJkZXYgVmVyc2lvbiAzLjIgUGF0Y2hsZXZlbCAxCi0lJUNyZWF0aW9uRGF0ZTogTW9uIEFwciAxMiAxNzowOToxMSAxOTk5Ci0lJUZvcjogcnNlQGVuMS5lbmdlbHNjaGFsbC5jb20gKFJhbGYgUy4gRW5nZWxzY2hhbGwpCi0lJU9yaWVudGF0aW9uOiBMYW5kc2NhcGUKLSUlQm91bmRpbmdCb3g6IDU5IDM3IDU1MyA3NTUKLSUlUGFnZXM6IDEKLSUlQmVnaW5TZXR1cAotJSVJbmNsdWRlRmVhdHVyZTogKlBhZ2VTaXplIExldHRlcgotJSVFbmRTZXR1cAotJSVNYWduaWZpY2F0aW9uOiAwLjkzNDAKLSUlRW5kQ29tbWVudHMKLS8kRjJwc0RpY3QgMjAwIGRpY3QgZGVmCi0kRjJwc0RpY3QgYmVnaW4KLSRGMnBzRGljdCAvbXRyeCBtYXRyaXggcHV0Ci0vY29sLTEgezAgc2V0Z3JheX0gYmluZCBkZWYKLS9jb2wwIHswLjAwMCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDEgezAuMDAwIDAuMDAwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMiB7MC4wMDAgMS4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wzIHswLjAwMCAxLjAwMCAxLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDQgezEuMDAwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sNSB7MS4wMDAgMC4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2w2IHsxLjAwMCAxLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDcgezEuMDAwIDEuMDAwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sOCB7MC4wMDAgMC4wMDAgMC41NjAgc3JnYn0gYmluZCBkZWYKLS9jb2w5IHswLjAwMCAwLjAwMCAwLjY5MCBzcmdifSBiaW5kIGRlZgotL2NvbDEwIHswLjAwMCAwLjAwMCAwLjgyMCBzcmdifSBiaW5kIGRlZgotL2NvbDExIHswLjUzMCAwLjgxMCAxLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDEyIHswLjAwMCAwLjU2MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDEzIHswLjAwMCAwLjY5MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDE0IHswLjAwMCAwLjgyMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDE1IHswLjAwMCAwLjU2MCAwLjU2MCBzcmdifSBiaW5kIGRlZgotL2NvbDE2IHswLjAwMCAwLjY5MCAwLjY5MCBzcmdifSBiaW5kIGRlZgotL2NvbDE3IHswLjAwMCAwLjgyMCAwLjgyMCBzcmdifSBiaW5kIGRlZgotL2NvbDE4IHswLjU2MCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDE5IHswLjY5MCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDIwIHswLjgyMCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDIxIHswLjU2MCAwLjAwMCAwLjU2MCBzcmdifSBiaW5kIGRlZgotL2NvbDIyIHswLjY5MCAwLjAwMCAwLjY5MCBzcmdifSBiaW5kIGRlZgotL2NvbDIzIHswLjgyMCAwLjAwMCAwLjgyMCBzcmdifSBiaW5kIGRlZgotL2NvbDI0IHswLjUwMCAwLjE5MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDI1IHswLjYzMCAwLjI1MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDI2IHswLjc1MCAwLjM4MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDI3IHsxLjAwMCAwLjUwMCAwLjUwMCBzcmdifSBiaW5kIGRlZgotL2NvbDI4IHsxLjAwMCAwLjYzMCAwLjYzMCBzcmdifSBiaW5kIGRlZgotL2NvbDI5IHsxLjAwMCAwLjc1MCAwLjc1MCBzcmdifSBiaW5kIGRlZgotL2NvbDMwIHsxLjAwMCAwLjg4MCAwLjg4MCBzcmdifSBiaW5kIGRlZgotL2NvbDMxIHsxLjAwMCAwLjg0MCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDMyIHswLjM4MCAwLjM5NiAwLjM4MCBzcmdifSBiaW5kIGRlZgotL2NvbDMzIHswLjcxNCAwLjY5OCAwLjcxNCBzcmdifSBiaW5kIGRlZgotL2NvbDM0IHswLjk2OSAwLjk1MyAwLjk2OSBzcmdifSBiaW5kIGRlZgotL2NvbDM1IHswLjgxMiAwLjgxMiAwLjgxMiBzcmdifSBiaW5kIGRlZgotL2NvbDM2IHsxLjAwMCAxLjAwMCAxLjAwMCBzcmdifSBiaW5kIGRlZgotCi1lbmQKLXNhdmUKLTQ4LjAgMTIuMCB0cmFuc2xhdGUKLSA5MCByb3RhdGUKLTEgLTEgc2NhbGUKLQotL2NwIHtjbG9zZXBhdGh9IGJpbmQgZGVmCi0vZWYge2VvZmlsbH0gYmluZCBkZWYKLS9nciB7Z3Jlc3RvcmV9IGJpbmQgZGVmCi0vZ3Mge2dzYXZlfSBiaW5kIGRlZgotL3NhIHtzYXZlfSBiaW5kIGRlZgotL3JzIHtyZXN0b3JlfSBiaW5kIGRlZgotL2wge2xpbmV0b30gYmluZCBkZWYKLS9tIHttb3ZldG99IGJpbmQgZGVmCi0vcm0ge3Jtb3ZldG99IGJpbmQgZGVmCi0vbiB7bmV3cGF0aH0gYmluZCBkZWYKLS9zIHtzdHJva2V9IGJpbmQgZGVmCi0vc2gge3Nob3d9IGJpbmQgZGVmCi0vc2xjIHtzZXRsaW5lY2FwfSBiaW5kIGRlZgotL3NsaiB7c2V0bGluZWpvaW59IGJpbmQgZGVmCi0vc2x3IHtzZXRsaW5ld2lkdGh9IGJpbmQgZGVmCi0vc3JnYiB7c2V0cmdiY29sb3J9IGJpbmQgZGVmCi0vcm90IHtyb3RhdGV9IGJpbmQgZGVmCi0vc2Mge3NjYWxlfSBiaW5kIGRlZgotL3NkIHtzZXRkYXNofSBiaW5kIGRlZgotL2ZmIHtmaW5kZm9udH0gYmluZCBkZWYKLS9zZiB7c2V0Zm9udH0gYmluZCBkZWYKLS9zY2Yge3NjYWxlZm9udH0gYmluZCBkZWYKLS9zdyB7c3RyaW5nd2lkdGh9IGJpbmQgZGVmCi0vdHIge3RyYW5zbGF0ZX0gYmluZCBkZWYKLS90bnQge2R1cCBkdXAgY3VycmVudHJnYmNvbG9yCi0gIDQgLTIgcm9sbCBkdXAgMSBleGNoIHN1YiAzIC0xIHJvbGwgbXVsIGFkZAotICA0IC0yIHJvbGwgZHVwIDEgZXhjaCBzdWIgMyAtMSByb2xsIG11bCBhZGQKLSAgNCAtMiByb2xsIGR1cCAxIGV4Y2ggc3ViIDMgLTEgcm9sbCBtdWwgYWRkIHNyZ2J9Ci0gIGJpbmQgZGVmCi0vc2hkIHtkdXAgZHVwIGN1cnJlbnRyZ2Jjb2xvciA0IC0yIHJvbGwgbXVsIDQgLTIgcm9sbCBtdWwKLSAgNCAtMiByb2xsIG11bCBzcmdifSBiaW5kIGRlZgotL3JlZW5jZGljdCAxMiBkaWN0IGRlZiAvUmVFbmNvZGUgeyByZWVuY2RpY3QgYmVnaW4KLS9uZXdjb2Rlc2FuZG5hbWVzIGV4Y2ggZGVmIC9uZXdmb250bmFtZSBleGNoIGRlZiAvYmFzZWZvbnRuYW1lIGV4Y2ggZGVmCi0vYmFzZWZvbnRkaWN0IGJhc2Vmb250bmFtZSBmaW5kZm9udCBkZWYgL25ld2ZvbnQgYmFzZWZvbnRkaWN0IG1heGxlbmd0aCBkaWN0IGRlZgotYmFzZWZvbnRkaWN0IHsgZXhjaCBkdXAgL0ZJRCBuZSB7IGR1cCAvRW5jb2RpbmcgZXEKLXsgZXhjaCBkdXAgbGVuZ3RoIGFycmF5IGNvcHkgbmV3Zm9udCAzIDEgcm9sbCBwdXQgfQoteyBleGNoIG5ld2ZvbnQgMyAxIHJvbGwgcHV0IH0gaWZlbHNlIH0geyBwb3AgcG9wIH0gaWZlbHNlIH0gZm9yYWxsCi1uZXdmb250IC9Gb250TmFtZSBuZXdmb250bmFtZSBwdXQgbmV3Y29kZXNhbmRuYW1lcyBhbG9hZCBwb3AKLTEyOCAxIDI1NSB7IG5ld2ZvbnQgL0VuY29kaW5nIGdldCBleGNoIC8ubm90ZGVmIHB1dCB9IGZvcgotbmV3Y29kZXNhbmRuYW1lcyBsZW5ndGggMiBpZGl2IHsgbmV3Zm9udCAvRW5jb2RpbmcgZ2V0IDMgMSByb2xsIHB1dCB9IHJlcGVhdAotbmV3Zm9udG5hbWUgbmV3Zm9udCBkZWZpbmVmb250IHBvcCBlbmQgfSBkZWYKLS9pc292ZWMgWwotOCMyMDAgL2dyYXZlIDgjMjAxIC9hY3V0ZSA4IzIwMiAvY2lyY3VtZmxleCA4IzIwMyAvdGlsZGUKLTgjMjA0IC9tYWNyb24gOCMyMDUgL2JyZXZlIDgjMjA2IC9kb3RhY2NlbnQgOCMyMDcgL2RpZXJlc2lzCi04IzIxMCAvcmluZyA4IzIxMSAvY2VkaWxsYSA4IzIxMiAvaHVuZ2FydW1sYXV0IDgjMjEzIC9vZ29uZWsgOCMyMTQgL2Nhcm9uCi04IzIyMCAvZG90bGVzc2kgOCMyMzAgL29lIDgjMjMxIC9PRQotOCMyNDAgL3NwYWNlIDgjMjQxIC9leGNsYW1kb3duIDgjMjQyIC9jZW50IDgjMjQzIC9zdGVybGluZwotOCMyNDQgL2N1cnJlbmN5IDgjMjQ1IC95ZW4gOCMyNDYgL2Jyb2tlbmJhciA4IzI0NyAvc2VjdGlvbiA4IzI1MCAvZGllcmVzaXMKLTgjMjUxIC9jb3B5cmlnaHQgOCMyNTIgL29yZGZlbWluaW5lIDgjMjUzIC9ndWlsbGVtb3RsZWZ0IDgjMjU0IC9sb2dpY2Fsbm90Ci04IzI1NSAvZW5kYXNoIDgjMjU2IC9yZWdpc3RlcmVkIDgjMjU3IC9tYWNyb24gOCMyNjAgL2RlZ3JlZSA4IzI2MSAvcGx1c21pbnVzCi04IzI2MiAvdHdvc3VwZXJpb3IgOCMyNjMgL3RocmVlc3VwZXJpb3IgOCMyNjQgL2FjdXRlIDgjMjY1IC9tdSA4IzI2NiAvcGFyYWdyYXBoCi04IzI2NyAvcGVyaW9kY2VudGVyZWQgOCMyNzAgL2NlZGlsbGEgOCMyNzEgL29uZXN1cGVyaW9yIDgjMjcyIC9vcmRtYXNjdWxpbmUKLTgjMjczIC9ndWlsbGVtb3RyaWdodCA4IzI3NCAvb25lcXVhcnRlciA4IzI3NSAvb25laGFsZgotOCMyNzYgL3RocmVlcXVhcnRlcnMgOCMyNzcgL3F1ZXN0aW9uZG93biA4IzMwMCAvQWdyYXZlIDgjMzAxIC9BYWN1dGUKLTgjMzAyIC9BY2lyY3VtZmxleCA4IzMwMyAvQXRpbGRlIDgjMzA0IC9BZGllcmVzaXMgOCMzMDUgL0FyaW5nCi04IzMwNiAvQUUgOCMzMDcgL0NjZWRpbGxhIDgjMzEwIC9FZ3JhdmUgOCMzMTEgL0VhY3V0ZQotOCMzMTIgL0VjaXJjdW1mbGV4IDgjMzEzIC9FZGllcmVzaXMgOCMzMTQgL0lncmF2ZSA4IzMxNSAvSWFjdXRlCi04IzMxNiAvSWNpcmN1bWZsZXggOCMzMTcgL0lkaWVyZXNpcyA4IzMyMCAvRXRoIDgjMzIxIC9OdGlsZGUgOCMzMjIgL09ncmF2ZQotOCMzMjMgL09hY3V0ZSA4IzMyNCAvT2NpcmN1bWZsZXggOCMzMjUgL090aWxkZSA4IzMyNiAvT2RpZXJlc2lzIDgjMzI3IC9tdWx0aXBseQotOCMzMzAgL09zbGFzaCA4IzMzMSAvVWdyYXZlIDgjMzMyIC9VYWN1dGUgOCMzMzMgL1VjaXJjdW1mbGV4Ci04IzMzNCAvVWRpZXJlc2lzIDgjMzM1IC9ZYWN1dGUgOCMzMzYgL1Rob3JuIDgjMzM3IC9nZXJtYW5kYmxzIDgjMzQwIC9hZ3JhdmUKLTgjMzQxIC9hYWN1dGUgOCMzNDIgL2FjaXJjdW1mbGV4IDgjMzQzIC9hdGlsZGUgOCMzNDQgL2FkaWVyZXNpcyA4IzM0NSAvYXJpbmcKLTgjMzQ2IC9hZSA4IzM0NyAvY2NlZGlsbGEgOCMzNTAgL2VncmF2ZSA4IzM1MSAvZWFjdXRlCi04IzM1MiAvZWNpcmN1bWZsZXggOCMzNTMgL2VkaWVyZXNpcyA4IzM1NCAvaWdyYXZlIDgjMzU1IC9pYWN1dGUKLTgjMzU2IC9pY2lyY3VtZmxleCA4IzM1NyAvaWRpZXJlc2lzIDgjMzYwIC9ldGggOCMzNjEgL250aWxkZSA4IzM2MiAvb2dyYXZlCi04IzM2MyAvb2FjdXRlIDgjMzY0IC9vY2lyY3VtZmxleCA4IzM2NSAvb3RpbGRlIDgjMzY2IC9vZGllcmVzaXMgOCMzNjcgL2RpdmlkZQotOCMzNzAgL29zbGFzaCA4IzM3MSAvdWdyYXZlIDgjMzcyIC91YWN1dGUgOCMzNzMgL3VjaXJjdW1mbGV4Ci04IzM3NCAvdWRpZXJlc2lzIDgjMzc1IC95YWN1dGUgOCMzNzYgL3Rob3JuIDgjMzc3IC95ZGllcmVzaXNdIGRlZgotL1RpbWVzLVJvbWFuIC9UaW1lcy1Sb21hbi1pc28gaXNvdmVjIFJlRW5jb2RlCi0vSGVsdmV0aWNhLUJvbGQgL0hlbHZldGljYS1Cb2xkLWlzbyBpc292ZWMgUmVFbmNvZGUKLS9IZWx2ZXRpY2EtTmFycm93IC9IZWx2ZXRpY2EtTmFycm93LWlzbyBpc292ZWMgUmVFbmNvZGUKLS8kRjJwc0JlZ2luIHskRjJwc0RpY3QgYmVnaW4gLyRGMnBzRW50ZXJlZFN0YXRlIHNhdmUgZGVmfSBkZWYKLS8kRjJwc0VuZCB7JEYycHNFbnRlcmVkU3RhdGUgcmVzdG9yZSBlbmR9IGRlZgotJSVFbmRQcm9sb2cKLQotJEYycHNCZWdpbgotMTAgc2V0bWl0ZXJsaW1pdAotbiAtMTAwMCA5NTcyIG0gLTEwMDAgLTEwMDAgbCAxMzYyMiAtMTAwMCBsIDEzNjIyIDk1NzIgbCBjcCBjbGlwCi0gMC4wNTg4MyAwLjA1ODgzIHNjCi0lJVBhZ2U6IDEgMQotJSBQb2x5bGluZQotNy41MDAgc2x3Ci1uIDY0MTMgMjA0OCBtIDYzODAgMjA1NCBsIDYzNDggMjA2MSBsIDYzMTUgMjA2NyBsIDYyODMgMjA3MyBsIDYyNTAgMjA3OSBsCi0gNjIxNyAyMDg0IGwgNjE4NSAyMDkwIGwgNjE1MiAyMDk1IGwgNjEyMCAyMTAxIGwgNjA4OCAyMTA3IGwKLSA2MDU3IDIxMTMgbCA2MDI3IDIxMjAgbCA1OTk4IDIxMjYgbCA1OTcwIDIxMzQgbCA1OTQzIDIxNDEgbAotIDU5MTggMjE0OSBsIDU4OTQgMjE1OCBsIDU4NzMgMjE2NyBsIDU4NTMgMjE3NyBsIDU4MzUgMjE4NyBsCi0gNTgxOSAyMTk4IGwgNTgwNSAyMjEwIGwgNTc5MyAyMjIyIGwgNTc4MiAyMjM1IGwgNTc3NCAyMjUwIGwKLSA1NzY4IDIyNjUgbCA1NzYzIDIyODEgbCA1NzYwIDIyOTkgbCA1NzU5IDIzMTggbCA1NzU5IDIzMzkgbAotIDU3NjEgMjM2MCBsIDU3NjQgMjM4MyBsIDU3NjggMjQwOCBsIDU3NzQgMjQzMyBsIDU3ODAgMjQ2MCBsCi0gNTc4OCAyNDg4IGwgNTc5NyAyNTE2IGwgNTgwNiAyNTQ2IGwgNTgxNSAyNTc1IGwgNTgyNSAyNjA2IGwKLSA1ODM2IDI2MzYgbCA1ODQ2IDI2NjYgbCA1ODU2IDI2OTYgbCA1ODY2IDI3MjYgbCA1ODc1IDI3NTUgbAotIDU4ODQgMjc4NCBsIDU4OTIgMjgxMiBsIDU4OTkgMjgzOSBsIDU5MDUgMjg2NiBsIDU5MTAgMjg5MSBsCi0gNTkxNSAyOTE2IGwgNTkxOCAyOTQwIGwgNTkxOSAyOTY4IGwgNTkyMCAyOTk1IGwgNTkxOSAzMDIyIGwKLSA1OTE2IDMwNDggbCA1OTEyIDMwNzUgbCA1OTA4IDMxMDEgbCA1OTAyIDMxMjcgbCA1ODk1IDMxNTMgbAotIDU4ODcgMzE3OSBsIDU4ODAgMzIwNSBsIDU4NzEgMzIzMCBsIDU4NjMgMzI1NCBsIDU4NTUgMzI3OCBsCi0gNTg0OCAzMzAyIGwgNTg0MSAzMzI0IGwgNTgzNCAzMzQ2IGwgNTgyOSAzMzY3IGwgNTgyNCAzMzg4IGwKLSA1ODIxIDM0MDggbCA1ODE5IDM0MjcgbCA1ODE5IDM0NDYgbCA1ODIwIDM0NjUgbCA1ODIzIDM0ODQgbAotIDU4MjcgMzUwMyBsIDU4MzMgMzUyMiBsIDU4NDAgMzU0MiBsIDU4NDggMzU2MiBsIDU4NTggMzU4MiBsCi0gNTg2OCAzNjAzIGwgNTg4MCAzNjI1IGwgNTg5MSAzNjQ3IGwgNTkwNCAzNjY5IGwgNTkxNiAzNjkxIGwKLSA1OTI5IDM3MTMgbCA1OTQxIDM3MzYgbCA1OTUzIDM3NTggbCA1OTY0IDM3NzkgbCA1OTc0IDM4MDEgbAotIDU5ODMgMzgyMiBsIDU5OTEgMzg0MyBsIDU5OTcgMzg2MyBsIDYwMDIgMzg4MyBsIDYwMDYgMzkwMyBsCi0gNjAwOCAzOTIzIGwgNjAwOCAzOTQyIGwgNjAwNiAzOTYyIGwgNjAwMyAzOTgzIGwgNTk5OCA0MDA0IGwKLSA1OTkyIDQwMjUgbCA1OTg1IDQwNDggbCA1OTc3IDQwNzAgbCA1OTY4IDQwOTQgbCA1OTU4IDQxMTggbAotIDU5NDcgNDE0MiBsIDU5MzYgNDE2NyBsIDU5MjUgNDE5MiBsIDU5MTMgNDIxNiBsIDU5MDIgNDI0MSBsCi0gNTg5MiA0MjY2IGwgNTg4MiA0MjkxIGwgNTg3MiA0MzE1IGwgNTg2NCA0MzM5IGwgNTg1NyA0MzYyIGwKLSA1ODUxIDQzODYgbCA1ODQ2IDQ0MDkgbCA1ODQzIDQ0MzMgbCA1ODQwIDQ0NTYgbCA1ODQwIDQ0ODAgbAotIDU4NDAgNDUwNSBsIDU4NDIgNDUzMCBsIDU4NDUgNDU1NiBsIDU4NDkgNDU4MiBsIDU4NTQgNDYwOSBsCi0gNTg2MCA0NjM2IGwgNTg2NyA0NjY0IGwgNTg3NSA0NjkyIGwgNTg4MyA0NzIwIGwgNTg5MiA0NzQ3IGwKLSA1OTAxIDQ3NzQgbCA1OTEwIDQ4MDEgbCA1OTIwIDQ4MjcgbCA1OTI5IDQ4NTIgbCA1OTM4IDQ4NzUgbAotIDU5NDcgNDg5OCBsIDU5NTUgNDkyMCBsIDU5NjMgNDk0MSBsIDU5NzEgNDk2MSBsIDU5NzggNDk4MCBsCi0gNTk4NSA1MDAyIGwgNTk5MiA1MDI0IGwgNTk5OSA1MDQ2IGwgNjAwNSA1MDY3IGwgNjAxMCA1MDg4IGwKLSA2MDE2IDUxMDkgbCA2MDIyIDUxMjkgbCA2MDI3IDUxNTAgbCA2MDMzIDUxNzAgbCA2MDM5IDUxOTAgbAotIDYwNDUgNTIwOSBsIDYwNTIgNTIyOCBsIDYwNTkgNTI0NiBsIDYwNjcgNTI2NCBsIDYwNzUgNTI4MSBsCi0gNjA4NCA1Mjk4IGwgNjA5NCA1MzE1IGwgNjEwNSA1MzMzIGwgNjExNSA1MzQ3IGwgNjEyNSA1MzYxIGwKLSA2MTM3IDUzNzYgbCA2MTQ5IDUzOTIgbCA2MTYyIDU0MDggbCA2MTc2IDU0MjUgbCA2MTkxIDU0NDMgbAotIDYyMDYgNTQ2MSBsIDYyMjEgNTQ4MCBsIDYyMzcgNTQ5OSBsIDYyNTMgNTUxOSBsIDYyNjkgNTUzOSBsCi0gNjI4NCA1NTU5IGwgNjI5OSA1NTc5IGwgNjMxMyA1NTk5IGwgNjMyNyA1NjE5IGwgNjM0MCA1NjM5IGwKLSA2MzUyIDU2NTkgbCA2MzYzIDU2NzkgbCA2MzczIDU2OTggbCA2MzgyIDU3MTggbCA2MzkwIDU3MzggbAotIDYzOTggNTc1OSBsIDY0MDQgNTc4MiBsIDY0MTAgNTgwNSBsIDY0MTUgNTgyOCBsIDY0MjAgNTg1MiBsCi0gNjQyNCA1ODc3IGwgNjQyOCA1OTAyIGwgNjQzMSA1OTI3IGwgNjQzNSA1OTUyIGwgNjQzOCA1OTc3IGwKLSA2NDQyIDYwMDEgbCA2NDQ2IDYwMjUgbCA2NDUwIDYwNDggbCA2NDU1IDYwNjkgbCA2NDYxIDYwOTAgbAotIDY0NjcgNjEwOSBsIDY0NzQgNjEyNyBsIDY0ODMgNjE0MyBsIDY0OTIgNjE1OSBsIDY1MDMgNjE3MyBsCi0gNjUxNSA2MTg1IGwgNjUyOCA2MTk3IGwgNjU0MyA2MjA5IGwgNjU2MCA2MjIwIGwgNjU3OCA2MjMwIGwKLSA2NTk4IDYyNDAgbCA2NjE5IDYyNTAgbCA2NjQxIDYyNjAgbCA2NjYzIDYyNzAgbCA2Njg3IDYyODEgbAotIDY3MTAgNjI5MSBsIDY3MzMgNjMwMiBsIDY3NTcgNjMxMiBsIDY3NzkgNjMyNCBsIDY4MDEgNjMzNSBsCi0gNjgyMSA2MzQ4IGwgNjg0MSA2MzYxIGwgNjg1OSA2Mzc0IGwgNjg3NiA2Mzg5IGwgNjg5MyA2NDA1IGwKLSA2OTA2IDY0MjEgbCA2OTE5IDY0MzcgbCA2OTMyIDY0NTUgbCA2OTQ0IDY0NzUgbCA2OTU1IDY0OTUgbAotIDY5NjcgNjUxNiBsIDY5NzkgNjUzOCBsIDY5OTEgNjU2MSBsIDcwMDMgNjU4NCBsIDcwMTUgNjYwOCBsCi0gNzAyNyA2NjMxIGwgNzA0MCA2NjU0IGwgNzA1MyA2Njc3IGwgNzA2NyA2Njk5IGwgNzA4MSA2NzIwIGwKLSA3MDk2IDY3MzkgbCA3MTExIDY3NTggbCA3MTI3IDY3NzQgbCA3MTQ0IDY3ODkgbCA3MTYxIDY4MDMgbAotIDcxODAgNjgxNSBsIDcyMDAgNjgyNSBsIDcyMjAgNjgzMyBsIDcyNDAgNjg0MCBsIDcyNjMgNjg0NSBsCi0gNzI4NiA2ODUwIGwgNzMxMSA2ODU0IGwgNzMzOCA2ODU3IGwgNzM2NSA2ODU5IGwgNzM5NCA2ODYxIGwKLSA3NDI0IDY4NjIgbCA3NDU0IDY4NjQgbCA3NDg1IDY4NjUgbCA3NTE2IDY4NjYgbCA3NTQ3IDY4NjcgbAotIDc1NzggNjg2OCBsIDc2MDkgNjg3MCBsIDc2MzkgNjg3MiBsIDc2NjggNjg3NSBsIDc2OTYgNjg3OSBsCi0gNzcyMyA2ODgzIGwgNzc0OCA2ODg5IGwgNzc3MyA2ODk1IGwgNzc5NSA2OTAzIGwgNzgxNyA2OTEyIGwKLSA3ODM4IDY5MjMgbCA3ODU3IDY5MzQgbCA3ODc1IDY5NDggbCA3ODkyIDY5NjMgbCA3OTA5IDY5ODAgbAotIDc5MjYgNjk5OCBsIDc5NDEgNzAxNyBsIDc5NTcgNzAzOCBsIDc5NzIgNzA2MCBsIDc5ODcgNzA4MyBsCi0gODAwMiA3MTA2IGwgODAxNyA3MTMwIGwgODAzMSA3MTU0IGwgODA0NiA3MTc4IGwgODA2MSA3MjAyIGwKLSA4MDc1IDcyMjUgbCA4MDkwIDcyNDcgbCA4MTA1IDcyNjkgbCA4MTIwIDcyODkgbCA4MTM1IDczMDggbAotIDgxNTEgNzMyNiBsIDgxNjcgNzM0MiBsIDgxODQgNzM1NiBsIDgyMDIgNzM2OSBsIDgyMjAgNzM4MCBsCi0gODIzOSA3MzkwIGwgODI2MCA3Mzk3IGwgODI4MiA3NDA0IGwgODMwNSA3NDA5IGwgODMzMCA3NDEzIGwKLSA4MzU2IDc0MTYgbCA4MzgzIDc0MTggbCA4NDEyIDc0MjAgbCA4NDQxIDc0MjAgbCA4NDcxIDc0MTkgbAotIDg1MDIgNzQxOCBsIDg1MzQgNzQxNyBsIDg1NjUgNzQxNSBsIDg1OTcgNzQxMyBsIDg2MjkgNzQxMSBsCi0gODY2MCA3NDA5IGwgODY5MCA3NDA3IGwgODcyMCA3NDA1IGwgODc0OSA3NDA0IGwgODc3NyA3NDA0IGwKLSA4ODA0IDc0MDQgbCA4ODMwIDc0MDUgbCA4ODU2IDc0MDcgbCA4ODgwIDc0MTAgbCA4OTA2IDc0MTQgbAotIDg5MzEgNzQyMCBsIDg5NTYgNzQyNyBsIDg5ODEgNzQzNSBsIDkwMDUgNzQ0NCBsIDkwMjkgNzQ1NSBsCi0gOTA1MyA3NDY2IGwgOTA3NyA3NDc4IGwgOTEwMCA3NDkxIGwgOTEyMyA3NTA0IGwgOTE0NiA3NTE3IGwKLSA5MTY4IDc1MzEgbCA5MTkwIDc1NDQgbCA5MjEwIDc1NTcgbCA5MjMwIDc1NzAgbCA5MjUwIDc1ODIgbAotIDkyNjggNzU5MyBsIDkyODYgNzYwNCBsIDkzMDQgNzYxMyBsIDkzMjAgNzYyMSBsIDkzMzYgNzYyOSBsCi0gOTM1MyA3NjM1IGwgOTM3MCA3NjQxIGwgOTM4OCA3NjQ1IGwgOTQwNiA3NjQ4IGwgOTQyNSA3NjUwIGwKLSA5NDQ0IDc2NTIgbCA5NDY0IDc2NTMgbCA5NDg1IDc2NTMgbCA5NTA4IDc2NTMgbCA5NTMxIDc2NTMgbAotIDk1NTUgNzY1MyBsIDk1NzkgNzY1MyBsIDk2MDUgNzY1NCBsIDk2MzEgNzY1NSBsIDk2NTggNzY1NiBsCi0gOTY4NSA3NjU5IGwgOTcxMyA3NjYyIGwgOTc0MiA3NjY2IGwgOTc3MSA3NjcyIGwgOTgwMSA3Njc5IGwKLSA5ODMzIDc2ODggbCA5ODUzIDc2OTQgbCA5ODc0IDc3MDAgbCA5ODk1IDc3MDggbCA5OTE4IDc3MTYgbAotIDk5NDEgNzcyNSBsIDk5NjYgNzczNCBsIDk5OTEgNzc0NSBsIDEwMDE3IDc3NTUgbCAxMDA0NSA3NzY3IGwKLSAxMDA3MyA3Nzc5IGwgMTAxMDIgNzc5MSBsIDEwMTMyIDc4MDQgbCAxMDE2MyA3ODE4IGwgMTAxOTQgNzgzMSBsCi0gMTAyMjcgNzg0NSBsIDEwMjU5IDc4NjAgbCAxMDI5MyA3ODc0IGwgMTAzMjYgNzg4OSBsIDEwMzYwIDc5MDMgbAotIDEwMzk0IDc5MTggbCAxMDQyOSA3OTMyIGwgMTA0NjMgNzk0NyBsIDEwNDk3IDc5NjEgbCAxMDUzMSA3OTc0IGwKLSAxMDU2NSA3OTg4IGwgMTA1OTkgODAwMSBsIDEwNjMzIDgwMTMgbCAxMDY2NyA4MDI1IGwgMTA3MDAgODAzNyBsCi0gMTA3MzMgODA0OSBsIDEwNzY3IDgwNTkgbCAxMDgwMCA4MDcwIGwgMTA4MzQgODA4MCBsIDEwODY4IDgwOTAgbAotIDEwOTAyIDgwOTkgbCAxMDkzNyA4MTA4IGwgMTA5NzMgODExNyBsIDExMDA5IDgxMjUgbCAxMTA0NSA4MTMzIGwKLSAxMTA4MyA4MTQxIGwgMTExMjAgODE0OCBsIDExMTU4IDgxNTUgbCAxMTE5NyA4MTYxIGwgMTEyMzYgODE2NyBsCi0gMTEyNzUgODE3MiBsIDExMzEzIDgxNzcgbCAxMTM1MiA4MTgxIGwgMTEzOTEgODE4NCBsIDExNDI5IDgxODcgbAotIDExNDY3IDgxOTAgbCAxMTUwNCA4MTkxIGwgMTE1NDAgODE5MiBsIDExNTc2IDgxOTIgbCAxMTYxMCA4MTkyIGwKLSAxMTY0NCA4MTkxIGwgMTE2NzYgODE4OSBsIDExNzA3IDgxODcgbCAxMTczOCA4MTg0IGwgMTE3NjcgODE4MCBsCi0gMTE3OTQgODE3NiBsIDExODIxIDgxNzEgbCAxMTg0NyA4MTY1IGwgMTE4NzEgODE1OSBsIDExODk1IDgxNTMgbAotIDExOTIzIDgxNDMgbCAxMTk1MCA4MTMzIGwgMTE5NzYgODEyMiBsIDEyMDAxIDgxMDkgbCAxMjAyNSA4MDk2IGwKLSAxMjA0OCA4MDgxIGwgMTIwNzEgODA2NSBsIDEyMDkyIDgwNDggbCAxMjExMyA4MDMxIGwgMTIxMzMgODAxMiBsCi0gMTIxNTMgNzk5MiBsIDEyMTcxIDc5NzIgbCAxMjE4OCA3OTUxIGwgMTIyMDUgNzkzMCBsIDEyMjIwIDc5MDkgbAotIDEyMjM1IDc4ODcgbCAxMjI0OCA3ODY1IGwgMTIyNjAgNzg0MyBsIDEyMjcyIDc4MjIgbCAxMjI4MiA3ODAwIGwKLSAxMjI5MiA3Nzc5IGwgMTIzMDEgNzc1OSBsIDEyMzA5IDc3MzkgbCAxMjMxNiA3NzE5IGwgMTIzMjMgNzY5OSBsCi0gMTIzMzAgNzY4MCBsIDEyMzM4IDc2NTUgbCAxMjM0NSA3NjMxIGwgMTIzNTIgNzYwNyBsIDEyMzU5IDc1ODIgbAotIDEyMzY1IDc1NTggbCAxMjM3MSA3NTMzIGwgMTIzNzcgNzUwOCBsIDEyMzgyIDc0ODQgbCAxMjM4OCA3NDYwIGwKLSAxMjM5MiA3NDM2IGwgMTIzOTcgNzQxNCBsIDEyNDAxIDczOTEgbCAxMjQwNSA3MzcwIGwgMTI0MDkgNzM1MCBsCi0gMTI0MTIgNzMzMSBsIDEyNDE1IDczMTMgbCAxMjQxOCA3Mjk3IGwgMTI0MjEgNzI4MSBsIDEyNDI0IDcyNjYgbAotIDEyNDI4IDcyNTMgbCAxMjQzMiA3MjM0IGwgMTI0MzcgNzIxNiBsIDEyNDQyIDcxOTkgbCAxMjQ0NiA3MTgzIGwKLSAxMjQ1MSA3MTY2IGwgMTI0NTYgNzE1MCBsIDEyNDYwIDcxMzQgbCAxMjQ2MyA3MTE3IGwgMTI0NjYgNzEwMSBsCi0gMTI0NjggNzA4NiBsIDEyNDY5IDcwNzAgbCAxMjQ2OSA3MDU0IGwgMTI0NjcgNzAzNyBsIDEyNDY1IDcwMjAgbAotIDEyNDYyIDcwMDYgbCAxMjQ1OSA2OTkxIGwgMTI0NTUgNjk3NSBsIDEyNDUwIDY5NTggbCAxMjQ0NSA2OTQwIGwKLSAxMjQ0MCA2OTIxIGwgMTI0MzQgNjkwMSBsIDEyNDI4IDY4ODAgbCAxMjQyMiA2ODU5IGwgMTI0MTYgNjgzOCBsCi0gMTI0MTEgNjgxNyBsIDEyNDA2IDY3OTYgbCAxMjQwMSA2Nzc2IGwgMTIzOTcgNjc1NiBsIDEyMzk0IDY3MzYgbAotIDEyMzkyIDY3MTggbCAxMjM5MCA2NzAwIGwgMTIzOTAgNjY4MyBsIDEyMzkwIDY2NjUgbCAxMjM5MiA2NjQ5IGwKLSAxMjM5NCA2NjMxIGwgMTIzOTcgNjYxNCBsIDEyNDAxIDY1OTcgbCAxMjQwNiA2NTc5IGwgMTI0MTEgNjU2MSBsCi0gMTI0MTYgNjU0MiBsIDEyNDIyIDY1MjQgbCAxMjQyOCA2NTA1IGwgMTI0MzQgNjQ4NyBsIDEyNDQwIDY0NjggbAotIDEyNDQ1IDY0NTAgbCAxMjQ1MCA2NDMyIGwgMTI0NTUgNjQxNCBsIDEyNDU5IDYzOTYgbCAxMjQ2MiA2Mzc4IGwKLSAxMjQ2NSA2MzYwIGwgMTI0NjcgNjM0MyBsIDEyNDY4IDYzMjYgbCAxMjQ2OSA2MzA4IGwgMTI0NjkgNjI4OSBsCi0gMTI0NjggNjI2OSBsIDEyNDY4IDYyNDkgbCAxMjQ2NiA2MjI3IGwgMTI0NjQgNjIwNSBsIDEyNDYyIDYxODIgbAotIDEyNDYwIDYxNTkgbCAxMjQ1NyA2MTM1IGwgMTI0NTQgNjExMSBsIDEyNDUxIDYwODcgbCAxMjQ0NyA2MDYzIGwKLSAxMjQ0NCA2MDQwIGwgMTI0NDEgNjAxNiBsIDEyNDM3IDU5OTMgbCAxMjQzNCA1OTcwIGwgMTI0MzEgNTk0OCBsCi0gMTI0MjggNTkyNSBsIDEyNDI0IDU5MDIgbCAxMjQyMSA1ODc5IGwgMTI0MTkgNTg1NSBsIDEyNDE2IDU4MzEgbAotIDEyNDEzIDU4MDYgbCAxMjQxMSA1NzgxIGwgMTI0MDggNTc1NSBsIDEyNDA2IDU3MjkgbCAxMjQwNCA1NzAyIGwKLSAxMjQwMyA1Njc2IGwgMTI0MDEgNTY1MSBsIDEyNDAwIDU2MjUgbCAxMjQwMCA1NjAxIGwgMTIzOTkgNTU3OCBsCi0gMTIzOTkgNTU1NSBsIDEyNDAwIDU1MzQgbCAxMjQwMSA1NTE0IGwgMTI0MDIgNTQ5NSBsIDEyNDAzIDU0NzcgbAotIDEyNDA1IDU0NjAgbCAxMjQwOCA1NDQwIGwgMTI0MTEgNTQyMSBsIDEyNDE2IDU0MDIgbCAxMjQyMCA1Mzg0IGwKLSAxMjQyNiA1MzY1IGwgMTI0MzEgNTM0NyBsIDEyNDM3IDUzMjkgbCAxMjQ0NCA1MzExIGwgMTI0NTAgNTI5MyBsCi0gMTI0NTYgNTI3NSBsIDEyNDYyIDUyNTggbCAxMjQ2OCA1MjQwIGwgMTI0NzQgNTIyMiBsIDEyNDc5IDUyMDUgbAotIDEyNDgzIDUxODYgbCAxMjQ4OCA1MTY4IGwgMTI0OTAgNTE1MiBsIDEyNDkzIDUxMzUgbCAxMjQ5NiA1MTE3IGwKLSAxMjQ5OCA1MDk5IGwgMTI1MDAgNTA3OSBsIDEyNTAyIDUwNTggbCAxMjUwNCA1MDM2IGwgMTI1MDYgNTAxNCBsCi0gMTI1MDcgNDk5MCBsIDEyNTA5IDQ5NjYgbCAxMjUxMCA0OTQyIGwgMTI1MTIgNDkxOCBsIDEyNTEzIDQ4OTMgbAotIDEyNTE1IDQ4NjkgbCAxMjUxNiA0ODQ1IGwgMTI1MTggNDgyMiBsIDEyNTIwIDQ3OTkgbCAxMjUyMSA0Nzc2IGwKLSAxMjUyMyA0NzU0IGwgMTI1MjUgNDczMyBsIDEyNTI3IDQ3MTMgbCAxMjUyOSA0NjkzIGwgMTI1MzEgNDY3MyBsCi0gMTI1MzQgNDY1MyBsIDEyNTM2IDQ2MzIgbCAxMjUzOSA0NjEwIGwgMTI1NDEgNDU4OCBsIDEyNTQzIDQ1NjYgbAotIDEyNTQ2IDQ1NDMgbCAxMjU0OCA0NTIwIGwgMTI1NTAgNDQ5NyBsIDEyNTUyIDQ0NzMgbCAxMjU1MyA0NDUwIGwKLSAxMjU1NCA0NDI2IGwgMTI1NTUgNDQwMyBsIDEyNTU1IDQzODAgbCAxMjU1NSA0MzU3IGwgMTI1NTUgNDMzNCBsCi0gMTI1NTQgNDMxMiBsIDEyNTUyIDQyOTAgbCAxMjU1MCA0MjY3IGwgMTI1NDggNDI0NSBsIDEyNTQ1IDQyMjQgbAotIDEyNTQxIDQyMDMgbCAxMjUzNyA0MTgxIGwgMTI1MzMgNDE1OSBsIDEyNTI4IDQxMzYgbCAxMjUyMyA0MTEyIGwKLSAxMjUxNyA0MDg4IGwgMTI1MTAgNDA2NCBsIDEyNTAzIDQwMzggbCAxMjQ5NiA0MDEzIGwgMTI0ODggMzk4NyBsCi0gMTI0NzkgMzk2MSBsIDEyNDcxIDM5MzUgbCAxMjQ2MiAzOTA5IGwgMTI0NTIgMzg4NCBsIDEyNDQzIDM4NTkgbAotIDEyNDM0IDM4MzUgbCAxMjQyNCAzODExIGwgMTI0MTUgMzc4OCBsIDEyNDA1IDM3NjYgbCAxMjM5NiAzNzQ0IGwKLSAxMjM4NiAzNzIzIGwgMTIzNzcgMzcwMiBsIDEyMzY4IDM2ODMgbCAxMjM1NyAzNjYxIGwgMTIzNDcgMzY0MCBsCi0gMTIzMzYgMzYxOSBsIDEyMzI1IDM1OTggbCAxMjMxNCAzNTc2IGwgMTIzMDMgMzU1NSBsIDEyMjkxIDM1MzMgbAotIDEyMjgwIDM1MTEgbCAxMjI2OSAzNDg5IGwgMTIyNTcgMzQ2NyBsIDEyMjQ2IDM0NDYgbCAxMjIzNSAzNDI0IGwKLSAxMjIyNSAzNDAyIGwgMTIyMTUgMzM4MSBsIDEyMjA2IDMzNjAgbCAxMjE5NyAzMzQwIGwgMTIxODkgMzMyMCBsCi0gMTIxODEgMzMwMSBsIDEyMTc0IDMyODEgbCAxMjE2OCAzMjYyIGwgMTIxNjIgMzI0NCBsIDEyMTU4IDMyMjUgbAotIDEyMTUzIDMyMDQgbCAxMjE0OSAzMTgzIGwgMTIxNDUgMzE2MiBsIDEyMTQyIDMxMzkgbCAxMjE0MCAzMTE3IGwKLSAxMjEzOCAzMDk0IGwgMTIxMzcgMzA3MSBsIDEyMTM3IDMwNDcgbCAxMjEzOCAzMDI0IGwgMTIxMzkgMzAwMSBsCi0gMTIxNDEgMjk3OCBsIDEyMTQzIDI5NTYgbCAxMjE0NiAyOTM1IGwgMTIxNTAgMjkxNSBsIDEyMTU0IDI4OTYgbAotIDEyMTU4IDI4NzkgbCAxMjE2MyAyODYyIGwgMTIxNjggMjg0NyBsIDEyMTc0IDI4MzMgbCAxMjE4MCAyODIwIGwKLSAxMjE4OCAyODA1IGwgMTIxOTcgMjc5MiBsIDEyMjA2IDI3NzkgbCAxMjIxNiAyNzY2IGwgMTIyMjcgMjc1NCBsCi0gMTIyMzggMjc0MiBsIDEyMjQ5IDI3MzAgbCAxMjI2MCAyNzE3IGwgMTIyNzIgMjcwNCBsIDEyMjgyIDI2OTEgbAotIDEyMjkyIDI2NzYgbCAxMjMwMiAyNjYxIGwgMTIzMTAgMjY0NSBsIDEyMzE4IDI2MjcgbCAxMjMyNCAyNjA4IGwKLSAxMjMzMCAyNTg4IGwgMTIzMzQgMjU3MSBsIDEyMzM2IDI1NTMgbCAxMjMzOSAyNTM0IGwgMTIzNDEgMjUxMyBsCi0gMTIzNDIgMjQ5MSBsIDEyMzQzIDI0NjcgbCAxMjM0MyAyNDQyIGwgMTIzNDIgMjQxNiBsIDEyMzQwIDIzODkgbAotIDEyMzM4IDIzNjAgbCAxMjMzNSAyMzMyIGwgMTIzMzEgMjMwMyBsIDEyMzI2IDIyNzMgbCAxMjMyMCAyMjQ0IGwKLSAxMjMxNCAyMjE1IGwgMTIzMDcgMjE4NyBsIDEyMjk5IDIxNTkgbCAxMjI5MCAyMTMyIGwgMTIyODAgMjEwNiBsCi0gMTIyNzAgMjA4MSBsIDEyMjU5IDIwNTYgbCAxMjI0OCAyMDMzIGwgMTIyMzYgMjAxMSBsIDEyMjI0IDE5OTAgbAotIDEyMjEwIDE5NzAgbCAxMjE5NiAxOTQ5IGwgMTIxODEgMTkyOSBsIDEyMTY0IDE5MTAgbCAxMjE0NyAxODkwIGwKLSAxMjEyOSAxODcxIGwgMTIxMTAgMTg1MyBsIDEyMDkwIDE4MzUgbCAxMjA3MCAxODE4IGwgMTIwNDkgMTgwMiBsCi0gMTIwMjcgMTc4NyBsIDEyMDA1IDE3NzMgbCAxMTk4MyAxNzYxIGwgMTE5NjEgMTc0OSBsIDExOTM5IDE3MzkgbAotIDExOTE3IDE3MzAgbCAxMTg5NSAxNzIyIGwgMTE4NzQgMTcxNiBsIDExODUyIDE3MTAgbCAxMTgzMSAxNzA3IGwKLSAxMTgxMSAxNzA0IGwgMTE3OTAgMTcwMyBsIDExNzY5IDE3MDIgbCAxMTc0OCAxNzAzIGwgMTE3MjcgMTcwNSBsCi0gMTE3MDYgMTcwOCBsIDExNjgzIDE3MTEgbCAxMTY2MCAxNzE2IGwgMTE2MzYgMTcyMSBsIDExNjEyIDE3MjcgbAotIDExNTg3IDE3MzMgbCAxMTU2MCAxNzQwIGwgMTE1MzQgMTc0NyBsIDExNTA2IDE3NTQgbCAxMTQ3OSAxNzYxIGwKLSAxMTQ1MCAxNzY4IGwgMTE0MjIgMTc3NCBsIDExMzkzIDE3ODAgbCAxMTM2NCAxNzg2IGwgMTEzMzQgMTc5MSBsCi0gMTEzMDUgMTc5NSBsIDExMjc1IDE3OTggbCAxMTI0NSAxODAwIGwgMTEyMTUgMTgwMSBsIDExMTg0IDE4MDEgbAotIDExMTUzIDE4MDAgbCAxMTEyOCAxNzk4IGwgMTExMDQgMTc5NiBsIDExMDc4IDE3OTMgbCAxMTA1MiAxNzkwIGwKLSAxMTAyNSAxNzg1IGwgMTA5OTcgMTc4MSBsIDEwOTY4IDE3NzYgbCAxMDkzOSAxNzcwIGwgMTA5MDggMTc2NCBsCi0gMTA4NzcgMTc1OCBsIDEwODQ0IDE3NTEgbCAxMDgxMSAxNzQ0IGwgMTA3NzggMTczNyBsIDEwNzQzIDE3MzAgbAotIDEwNzA4IDE3MjIgbCAxMDY3MyAxNzE1IGwgMTA2MzcgMTcwOCBsIDEwNjAxIDE3MDEgbCAxMDU2NSAxNjk1IGwKLSAxMDUzMCAxNjg4IGwgMTA0OTQgMTY4MiBsIDEwNDU4IDE2NzcgbCAxMDQyMiAxNjcyIGwgMTAzODcgMTY2OCBsCi0gMTAzNTIgMTY2NCBsIDEwMzE4IDE2NjEgbCAxMDI4NCAxNjU4IGwgMTAyNTAgMTY1NyBsIDEwMjE2IDE2NTYgbAotIDEwMTgzIDE2NTUgbCAxMDE1MCAxNjU2IGwgMTAxMTggMTY1OCBsIDEwMDg3IDE2NjAgbCAxMDA1NSAxNjYzIGwKLSAxMDAyNCAxNjY2IGwgOTk5MiAxNjcxIGwgOTk2MCAxNjc2IGwgOTkyNyAxNjgyIGwgOTg5NCAxNjg4IGwKLSA5ODYxIDE2OTUgbCA5ODI3IDE3MDMgbCA5NzkyIDE3MTEgbCA5NzU3IDE3MjAgbCA5NzIxIDE3MjkgbAotIDk2ODUgMTczOCBsIDk2NDkgMTc0OCBsIDk2MTMgMTc1NyBsIDk1NzYgMTc2NyBsIDk1MzkgMTc3OCBsCi0gOTUwMiAxNzg4IGwgOTQ2NSAxNzk4IGwgOTQyOSAxODA3IGwgOTM5MiAxODE3IGwgOTM1NiAxODI2IGwKLSA5MzIwIDE4MzUgbCA5Mjg1IDE4NDQgbCA5MjUwIDE4NTIgbCA5MjE2IDE4NjAgbCA5MTgyIDE4NjcgbAotIDkxNDggMTg3MyBsIDkxMTUgMTg3OSBsIDkwODIgMTg4NCBsIDkwNTAgMTg4OSBsIDkwMTggMTg5MiBsCi0gODk4NyAxODk1IGwgODk1NSAxODk4IGwgODkxOSAxODk5IGwgODg4MyAxOTAwIGwgODg0NyAxODk5IGwKLSA4ODExIDE4OTggbCA4Nzc0IDE4OTYgbCA4NzM3IDE4OTMgbCA4Njk5IDE4ODkgbCA4NjYxIDE4ODQgbAotIDg2MjMgMTg3OCBsIDg1ODUgMTg3MiBsIDg1NDYgMTg2NSBsIDg1MDggMTg1NyBsIDg0NzAgMTg0OSBsCi0gODQzMiAxODQwIGwgODM5NSAxODMwIGwgODM1OCAxODIxIGwgODMyMiAxODExIGwgODI4NyAxODAxIGwKLSA4MjU0IDE3OTAgbCA4MjIxIDE3ODAgbCA4MTg5IDE3NzAgbCA4MTU5IDE3NjAgbCA4MTMwIDE3NTAgbAotIDgxMDIgMTc0MCBsIDgwNzYgMTczMCBsIDgwNTEgMTcyMSBsIDgwMjggMTcxMiBsIDgwMDYgMTcwMyBsCi0gNzk4NSAxNjk1IGwgNzk2NSAxNjg4IGwgNzkzMSAxNjc0IGwgNzg5OSAxNjYyIGwgNzg3MSAxNjUwIGwKLSA3ODQ0IDE2NDAgbCA3ODIwIDE2MzEgbCA3Nzk4IDE2MjMgbCA3Nzc4IDE2MTcgbCA3NzYwIDE2MTEgbAotIDc3NDMgMTYwNyBsIDc3MjggMTYwMyBsIDc3MTUgMTYwMSBsIDc3MDIgMTYwMCBsIDc2OTEgMTYwMCBsCi0gNzY4MCAxNjAxIGwgNzY2OSAxNjAzIGwgNzY1OCAxNjA1IGwgNzY0OCAxNjA3IGwgNzYzOCAxNjEwIGwKLSA3NjI3IDE2MTMgbCA3NjE1IDE2MTcgbCA3NjAxIDE2MjEgbCA3NTg3IDE2MjYgbCA3NTcxIDE2MzIgbAotIDc1NTQgMTYzOCBsIDc1MzYgMTY0NSBsIDc1MTcgMTY1MyBsIDc0OTYgMTY2MSBsIDc0NzQgMTY3MCBsCi0gNzQ1MiAxNjc5IGwgNzQyOCAxNjg5IGwgNzQwMyAxNjk5IGwgNzM3OCAxNzA5IGwgNzM1MiAxNzIwIGwKLSA3MzI1IDE3MzEgbCA3Mjk3IDE3NDMgbCA3MjY4IDE3NTUgbCA3MjQ3IDE3NjMgbCA3MjI2IDE3NzIgbAotIDcyMDQgMTc4MSBsIDcxODIgMTc5MCBsIDcxNTggMTgwMCBsIDcxMzMgMTgxMCBsIDcxMDggMTgyMCBsCi0gNzA4MSAxODMxIGwgNzA1MyAxODQyIGwgNzAyNSAxODUzIGwgNjk5NiAxODY0IGwgNjk2NiAxODc1IGwKLSA2OTM1IDE4ODYgbCA2OTA0IDE4OTggbCA2ODczIDE5MDkgbCA2ODQxIDE5MjEgbCA2ODA5IDE5MzIgbAotIDY3NzYgMTk0MyBsIDY3NDQgMTk1NCBsIDY3MTIgMTk2NCBsIDY2ODAgMTk3NCBsIDY2NDkgMTk4NCBsCi0gNjYxOCAxOTk0IGwgNjU4NyAyMDAzIGwgNjU1NyAyMDExIGwgNjUyNyAyMDE5IGwgNjQ5OCAyMDI3IGwKLSA2NDY5IDIwMzQgbCA2NDQxIDIwNDEgbCBjcCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wzNCBzIGdyIAotJSBQb2x5bGluZQotbiA2NzUgNjUyNSBtIDU4NTAgNjUyNSBsIDU4NTAgNjA3NSBsIDU2MjUgNjA3NSBsIDU2MjUgNTYyNSBsIDkwMCA1NjI1IGwKLSA5MDAgNjA3NSBsIDY3NSA2MDc1IGwgY3AgZ3MgY29sNyAxLjAwIHNoZCBlZiBnciBncyBjb2w3IHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDExMjUgNjUyNSBtIDUzNTUgNjUyNSBsIDU0MDAgNTE3NSBsIDUxNzUgNTE3NSBsIDUxNzUgNDcyNSBsIDQ5NTAgNDcyNSBsCi0gNDk1MCA0Mjc1IGwgMTU3NSA0Mjc1IGwgMTU3NSA0NzI1IGwgMTM1MCA0NzI1IGwgMTM1MCA1MTc1IGwKLSAxMTI1IDUxNzUgbCBjcCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wzNCBzIGdyIAotJSBQb2x5bGluZQotNzUuMDAwIHNsdwotbiA5NDUwIDQ1MDAgbSAxMjQ2NSAyMjA1IGwgZ3MgY29sNyBzIGdyIAotJSBQb2x5bGluZQotbiA5NDUwIDQ1MDAgbSA5NDUwIDc3ODUgbCBncyBjb2w3IHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDk0NTAgNDUwMCBtIDYwNzUgMTkzNSBsIGdzIGNvbDcgcyBnciAKLSUgUG9seWxpbmUKLW4gMTI1MTAgNjQzNSBtIDk0NTAgNjQzNSBsIGdzIGNvbDcgcyBnciAKLSUgUG9seWxpbmUKLTcuNTAwIHNsdwotbiAxODAwIDY1MjUgbSA0NzI1IDY1MjUgbCA0NzI1IDM4MjUgbCA0NTAwIDM4MjUgbCA0NTAwIDMzNzUgbCA0Mjc1IDMzNzUgbAotIDQyNzUgMjkyNSBsIDQwNTAgMjkyNSBsIDQwNTAgMjQ3NSBsIDI0NzUgMjQ3NSBsIDI0NzUgMjkyNSBsCi0gMjI1MCAyOTI1IGwgMjI1MCAzMzc1IGwgMjAyNSAzMzc1IGwgMjAyNSAzODI1IGwgMTgwMCAzODI1IGwKLSBjcCBncyBjb2wzNSAxLjAwIHNoZCBlZiBnciBncyBjb2wzNSBzIGdyIAotJSBQb2x5bGluZQotbiAyNzAwIDY1MjUgbSAzODI1IDY1MjUgbCAzODI1IDIwMjUgbCAzNjAwIDIwMjUgbCAzNjAwIDE1NzUgbCAyOTI1IDE1NzUgbAotIDI5MjUgMjAyNSBsIDI3MDAgMjAyNSBsIGNwIGdzIGNvbDMzIDEuMDAgc2hkIGVmIGdyIGdzIGNvbDMzIHMgZ3IgCi0lIFBvbHlsaW5lCi1ncyAgY2xpcHBhdGgKLTEyMDY4IDY4MTAgbSAxMTk3MCA2ODg1IGwgMTIwMjIgNjc3MyBsIDExOTM3IDY4NzggbCAxMTk4NCA2OTE1IGwgY3AKLWNsaXAKLW4gMTIzNzUgNDQ1NSBtIDEyNTEwIDQ2MzUgbCAxMjUxMCA2MjEwIGwgMTE5NzAgNjg4NSBsIGdzIGNvbDM0IDEuMDAgc2hkIGVmIGdyIGdzIGNvbDAgcyBnciBncgotCi0lIGFycm93aGVhZAotbiAxMjA2OCA2ODEwIG0gMTE5NzAgNjg4NSBsIDEyMDIyIDY3NzMgbCAxMjA0NSA2NzkxIGwgMTIwNjggNjgxMCBsICBjcCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgIGNvbDAgcwotJSBQb2x5bGluZQotZ3MgIGNsaXBwYXRoCi03MTEzIDYwMDQgbSA3MTU1IDYxMjAgbCA3MDYzIDYwMzcgbCA3MTM4IDYxNDkgbCA3MTg4IDYxMTYgbCBjcAotY2xpcAotbiA2NzA1IDU0NDUgbSA3MTU1IDYxMjAgbCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wwIHMgZ3IgZ3IKLQotJSBhcnJvd2hlYWQKLW4gNzExMyA2MDA0IG0gNzE1NSA2MTIwIGwgNzA2MyA2MDM3IGwgNzA4OCA2MDIwIGwgNzExMyA2MDA0IGwgIGNwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciAgY29sMCBzCi0lIFBvbHlsaW5lCi1ncyAgY2xpcHBhdGgKLTczMDQgNDY1NiBtIDcyMDAgNDU5MCBsIDczMjMgNDU5OSBsIDcxOTUgNDU1NyBsIDcxNzYgNDYxNCBsIGNwCi1jbGlwCi1uIDc4NzUgNDgxNSBtIDcyMDAgNDU5MCBsIGdzIGNvbDM0IDEuMDAgc2hkIGVmIGdyIGdzIGNvbDAgcyBnciBncgotCi0lIGFycm93aGVhZAotbiA3MzA0IDQ2NTYgbSA3MjAwIDQ1OTAgbCA3MzIzIDQ1OTkgbCA3MzE0IDQ2MjggbCA3MzA0IDQ2NTYgbCAgY3AgZ3MgMC4wMCBzZXRncmF5IGVmIGdyICBjb2wwIHMKLSUgUG9seWxpbmUKLWdzICBjbGlwcGF0aAotMTE0MDUgNDEyOCBtIDExNDc1IDQyMzAgbCAxMTM2NSA0MTczIGwgMTE0NjYgNDI2MiBsIDExNTA2IDQyMTcgbCBjcAotY2xpcAotbiA5NTg1IDI1NjUgbSAxMTQ3NSA0MjMwIGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIGdyCi0KLSUgYXJyb3doZWFkCi1uIDExNDA1IDQxMjggbSAxMTQ3NSA0MjMwIGwgMTEzNjUgNDE3MyBsIDExMzg1IDQxNTEgbCAxMTQwNSA0MTI4IGwgIGNwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciAgY29sMCBzCi0lIFBvbHlsaW5lCi1ncyAgY2xpcHBhdGgKLTExNzEyIDQ1NTYgbSAxMTgzNSA0NTQ1IGwgMTE3MzIgNDYxMyBsIDExODU5IDQ1NjggbCAxMTgzOSA0NTEyIGwgY3AKLWNsaXAKLW4gMTAxNzAgNTEzMCBtIDExODM1IDQ1NDUgbCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wwIHMgZ3IgZ3IKLQotJSBhcnJvd2hlYWQKLW4gMTE3MTIgNDU1NiBtIDExODM1IDQ1NDUgbCAxMTczMiA0NjEzIGwgMTE3MjIgNDU4NSBsIDExNzEyIDQ1NTYgbCAgY3AgZ3MgMC4wMCBzZXRncmF5IGVmIGdyICBjb2wwIHMKLSUgUG9seWxpbmUKLWdzICBjbGlwcGF0aAotOTczMiA1NDExIG0gOTg1NSA1NDAwIGwgOTc1MiA1NDY4IGwgOTg3OSA1NDIzIGwgOTg1OSA1MzY3IGwgY3AKLWNsaXAKLW4gNzkyMCA2MDc1IG0gOTg1NSA1NDAwIGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIGdyCi0KLSUgYXJyb3doZWFkCi1uIDk3MzIgNTQxMSBtIDk4NTUgNTQwMCBsIDk3NTIgNTQ2OCBsIDk3NDIgNTQ0MCBsIDk3MzIgNTQxMSBsICBjcCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgIGNvbDAgcwotJSBQb2x5bGluZQotZ3MgIGNsaXBwYXRoCi0xMDgyMyA1NTczIG0gMTA5MzUgNTYyNSBsIDEwODEyIDU2MzIgbCAxMDk0NCA1NjU3IGwgMTA5NTUgNTU5OCBsIGNwCi1jbGlwCi1uIDk5OTAgNTQ0NSBtIDEwOTM1IDU2MjUgbCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wwIHMgZ3IgZ3IKLQotJSBhcnJvd2hlYWQKLW4gMTA4MjMgNTU3MyBtIDEwOTM1IDU2MjUgbCAxMDgxMiA1NjMyIGwgMTA4MTcgNTYwMyBsIDEwODIzIDU1NzMgbCAgY3AgZ3MgMC4wMCBzZXRncmF5IGVmIGdyICBjb2wwIHMKLSUgUG9seWxpbmUKLWdzICBjbGlwcGF0aAotMTA4MTUgNTI4MCBtIDEwOTM1IDUzMTAgbCAxMDgxNSA1MzQwIGwgMTA5NTAgNTM0MCBsIDEwOTUwIDUyODAgbCBjcAotY2xpcAotbiAxMDIxNSA1MzEwIG0gMTA5MzUgNTMxMCBsIGdzIGNvbDM0IDEuMDAgc2hkIGVmIGdyIGdzIGNvbDAgcyBnciBncgotCi0lIGFycm93aGVhZAotbiAxMDgxNSA1MjgwIG0gMTA5MzUgNTMxMCBsIDEwODE1IDUzNDAgbCAxMDgxNSA1MzEwIGwgMTA4MTUgNTI4MCBsICBjcCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgIGNvbDAgcwotJSBQb2x5bGluZQotZ3MgIGNsaXBwYXRoCi0xMTk1NSA0OTY1IG0gMTE5MjUgNTA4NSBsIDExODk1IDQ5NjUgbCAxMTg5NSA1MTAwIGwgMTE5NTUgNTEwMCBsIGNwCi1jbGlwCi1uIDExOTI1IDQ1OTAgbSAxMTkyNSA1MDg1IGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIGdyCi0KLSUgYXJyb3doZWFkCi1uIDExOTU1IDQ5NjUgbSAxMTkyNSA1MDg1IGwgMTE4OTUgNDk2NSBsIDExOTI1IDQ5NjUgbCAxMTk1NSA0OTY1IGwgIGNwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciAgY29sMCBzCi0lIFBvbHlsaW5lCi1ncyAgY2xpcHBhdGgKLTk4NDAgNjcyMCBtIDk4MTAgNjg0MCBsIDk3ODAgNjcyMCBsIDk3ODAgNjg1NSBsIDk4NDAgNjg1NSBsIGNwCi1jbGlwCi1uIDk4MTAgNTQ5MCBtIDk4MTAgNjg0MCBsIGdzIGNvbDM0IDEuMDAgc2hkIGVmIGdyIGdzIGNvbDAgcyBnciBncgotCi0lIGFycm93aGVhZAotbiA5ODQwIDY3MjAgbSA5ODEwIDY4NDAgbCA5NzgwIDY3MjAgbCA5ODEwIDY3MjAgbCA5ODQwIDY3MjAgbCAgY3AgZ3MgMC4wMCBzZXRncmF5IGVmIGdyICBjb2wwIHMKLSUgUG9seWxpbmUKLWdzICBjbGlwcGF0aAotMTA4NDcgNTk0MyBtIDEwOTM1IDYwMzAgbCAxMDgxNiA1OTk1IGwgMTA5MzMgNjA2MyBsIDEwOTYzIDYwMTIgbCBjcAotY2xpcAotbiA5OTQ1IDU0NDUgbSAxMDkzNSA2MDMwIGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIGdyCi0KLSUgYXJyb3doZWFkCi1uIDEwODQ3IDU5NDMgbSAxMDkzNSA2MDMwIGwgMTA4MTYgNTk5NSBsIDEwODMyIDU5NjkgbCAxMDg0NyA1OTQzIGwgIGNwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciAgY29sMCBzCi0lIFBvbHlsaW5lCi1ncyAgY2xpcHBhdGgKLTEwNjk4IDI2MzQgbSAxMDgwMCAyNTY1IGwgMTA3NDIgMjY3NCBsIDEwODMyIDI1NzQgbCAxMDc4OCAyNTM0IGwgY3AKLWNsaXAKLW4gODg2NSA0NzI1IG0gMTA4MDAgMjU2NSBsIGdzIGNvbDM0IDEuMDAgc2hkIGVmIGdyIGdzIGNvbDAgcyBnciBncgotCi0lIGFycm93aGVhZAotbiAxMDY5OCAyNjM0IG0gMTA4MDAgMjU2NSBsIDEwNzQyIDI2NzQgbCAxMDcyMCAyNjU0IGwgMTA2OTggMjYzNCBsICBjcCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgIGNvbDAgcwotJSBQb2x5bGluZQotMzAuMDAwIHNsdwotbiA2NzUgNjA3NSBtIDU4NTAgNjA3NSBsIGdzIGNvbDM0IDEuMDAgc2hkIGVmIGdyIGdzIGNvbDAgcyBnciAKLSUgUG9seWxpbmUKLTcuNTAwIHNsdwotIFsxNSAxNV0gMTUgc2QKLWdzICBjbGlwcGF0aAotNjQ1IDYxOTUgbSA2NzUgNjA3NSBsIDcwNSA2MTk1IGwgNzA1IDYwNjAgbCA2NDUgNjA2MCBsIGNwCi1jbGlwCi1uIDY3NSA2NTI1IG0gNjc1IDYwNzUgbCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wwIHMgZ3IgZ3IKLSBbXSAwIHNkCi0lIGFycm93aGVhZAotbiA2NDUgNjE5NSBtIDY3NSA2MDc1IGwgNzA1IDYxOTUgbCA2NzUgNjE5NSBsIDY0NSA2MTk1IGwgIGNwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciAgY29sMCBzCi0lIFBvbHlsaW5lCi0gWzE1IDE1XSAxNSBzZAotZ3MgIGNsaXBwYXRoCi01ODgwIDY0MDUgbSA1ODUwIDY1MjUgbCA1ODIwIDY0MDUgbCA1ODIwIDY1NDAgbCA1ODgwIDY1NDAgbCBjcAotY2xpcAotbiA1ODUwIDYwNzUgbSA1ODUwIDY1MjUgbCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wwIHMgZ3IgZ3IKLSBbXSAwIHNkCi0lIGFycm93aGVhZAotbiA1ODgwIDY0MDUgbSA1ODUwIDY1MjUgbCA1ODIwIDY0MDUgbCA1ODUwIDY0MDUgbCA1ODgwIDY0MDUgbCAgY3AgZ3MgY29sNyAxLjAwIHNoZCBlZiBnciAgY29sMCBzCi0lIFBvbHlsaW5lCi0zMC4wMDAgc2x3Ci1uIDkwMCA1NjI1IG0gNTYyNSA1NjI1IGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIAotJSBQb2x5bGluZQotbiAxMTI1IDUxNzUgbSA1NDAwIDUxNzUgbCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wwIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDEzNTAgNDcyNSBtIDUxNzUgNDcyNSBsIGdzIGNvbDM0IDEuMDAgc2hkIGVmIGdyIGdzIGNvbDAgcyBnciAKLSUgUG9seWxpbmUKLW4gMTU3NSA0Mjc1IG0gNDk1MCA0Mjc1IGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIAotJSBQb2x5bGluZQotbiAxODAwIDM4MjUgbSA0NzI1IDM4MjUgbCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wwIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDIwMjUgMzM3NSBtIDQ1MDAgMzM3NSBsIGdzIGNvbDM0IDEuMDAgc2hkIGVmIGdyIGdzIGNvbDAgcyBnciAKLSUgUG9seWxpbmUKLW4gMjI1MCAyOTI1IG0gNDI3NSAyOTI1IGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIAotJSBQb2x5bGluZQotbiAyNDc1IDI0NzUgbSA0MDUwIDI0NzUgbCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wwIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDI3MDAgMjAyNSBtIDM4MjUgMjAyNSBsIGdzIGNvbDM0IDEuMDAgc2hkIGVmIGdyIGdzIGNvbDAgcyBnciAKLSUgUG9seWxpbmUKLW4gMjkyNSAxNTc1IG0gMzYwMCAxNTc1IGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIAotJSBQb2x5bGluZQotNy41MDAgc2x3Ci0gWzE1IDE1XSAxNSBzZAotZ3MgIGNsaXBwYXRoCi04NzAgNTc0NSBtIDkwMCA1NjI1IGwgOTMwIDU3NDUgbCA5MzAgNTYxMCBsIDg3MCA1NjEwIGwgY3AKLWNsaXAKLW4gOTAwIDYwNzUgbSA5MDAgNTYyNSBsIGdzIGNvbDM0IDEuMDAgc2hkIGVmIGdyIGdzIGNvbDAgcyBnciBncgotIFtdIDAgc2QKLSUgYXJyb3doZWFkCi1uIDg3MCA1NzQ1IG0gOTAwIDU2MjUgbCA5MzAgNTc0NSBsIDkwMCA1NzQ1IGwgODcwIDU3NDUgbCAgY3AgZ3MgMC4wMCBzZXRncmF5IGVmIGdyICBjb2wwIHMKLSUgUG9seWxpbmUKLSBbMTUgMTVdIDE1IHNkCi1ncyAgY2xpcHBhdGgKLTEwOTUgNTI5NSBtIDExMjUgNTE3NSBsIDExNTUgNTI5NSBsIDExNTUgNTE2MCBsIDEwOTUgNTE2MCBsIGNwCi1jbGlwCi1uIDExMjUgNjUyNSBtIDExMjUgNTE3NSBsIGdzIGNvbDM0IDEuMDAgc2hkIGVmIGdyIGdzIGNvbDAgcyBnciBncgotIFtdIDAgc2QKLSUgYXJyb3doZWFkCi1uIDEwOTUgNTI5NSBtIDExMjUgNTE3NSBsIDExNTUgNTI5NSBsIDExMjUgNTI5NSBsIDEwOTUgNTI5NSBsICBjcCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgIGNvbDAgcwotJSBQb2x5bGluZQotIFsxNSAxNV0gMTUgc2QKLWdzICBjbGlwcGF0aAotMTMyMCA0ODQ1IG0gMTM1MCA0NzI1IGwgMTM4MCA0ODQ1IGwgMTM4MCA0NzEwIGwgMTMyMCA0NzEwIGwgY3AKLWNsaXAKLW4gMTM1MCA1MTc1IG0gMTM1MCA0NzI1IGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIGdyCi0gW10gMCBzZAotJSBhcnJvd2hlYWQKLW4gMTMyMCA0ODQ1IG0gMTM1MCA0NzI1IGwgMTM4MCA0ODQ1IGwgMTM1MCA0ODQ1IGwgMTMyMCA0ODQ1IGwgIGNwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciAgY29sMCBzCi0lIFBvbHlsaW5lCi0gWzE1IDE1XSAxNSBzZAotZ3MgIGNsaXBwYXRoCi0xNTQ1IDQzOTUgbSAxNTc1IDQyNzUgbCAxNjA1IDQzOTUgbCAxNjA1IDQyNjAgbCAxNTQ1IDQyNjAgbCBjcAotY2xpcAotbiAxNTc1IDQ3MjUgbSAxNTc1IDQyNzUgbCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wwIHMgZ3IgZ3IKLSBbXSAwIHNkCi0lIGFycm93aGVhZAotbiAxNTQ1IDQzOTUgbSAxNTc1IDQyNzUgbCAxNjA1IDQzOTUgbCAxNTc1IDQzOTUgbCAxNTQ1IDQzOTUgbCAgY3AgZ3MgMC4wMCBzZXRncmF5IGVmIGdyICBjb2wwIHMKLSUgUG9seWxpbmUKLSBbMTUgMTVdIDE1IHNkCi1ncyAgY2xpcHBhdGgKLTE3NzAgMzk0NSBtIDE4MDAgMzgyNSBsIDE4MzAgMzk0NSBsIDE4MzAgMzgxMCBsIDE3NzAgMzgxMCBsIGNwCi1jbGlwCi1uIDE4MDAgNjUyNSBtIDE4MDAgMzgyNSBsIGdzIGNvbDM0IDEuMDAgc2hkIGVmIGdyIGdzIGNvbDAgcyBnciBncgotIFtdIDAgc2QKLSUgYXJyb3doZWFkCi1uIDE3NzAgMzk0NSBtIDE4MDAgMzgyNSBsIDE4MzAgMzk0NSBsIDE4MDAgMzk0NSBsIDE3NzAgMzk0NSBsICBjcCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgIGNvbDAgcwotJSBQb2x5bGluZQotIFsxNSAxNV0gMTUgc2QKLWdzICBjbGlwcGF0aAotMTk5NSAzNDk1IG0gMjAyNSAzMzc1IGwgMjA1NSAzNDk1IGwgMjA1NSAzMzYwIGwgMTk5NSAzMzYwIGwgY3AKLWNsaXAKLW4gMjAyNSAzODI1IG0gMjAyNSAzMzc1IGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIGdyCi0gW10gMCBzZAotJSBhcnJvd2hlYWQKLW4gMTk5NSAzNDk1IG0gMjAyNSAzMzc1IGwgMjA1NSAzNDk1IGwgMjAyNSAzNDk1IGwgMTk5NSAzNDk1IGwgIGNwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciAgY29sMCBzCi0lIFBvbHlsaW5lCi0gWzE1IDE1XSAxNSBzZAotZ3MgIGNsaXBwYXRoCi0yMjIwIDMwNDUgbSAyMjUwIDI5MjUgbCAyMjgwIDMwNDUgbCAyMjgwIDI5MTAgbCAyMjIwIDI5MTAgbCBjcAotY2xpcAotbiAyMjUwIDMzNzUgbSAyMjUwIDI5MjUgbCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wwIHMgZ3IgZ3IKLSBbXSAwIHNkCi0lIGFycm93aGVhZAotbiAyMjIwIDMwNDUgbSAyMjUwIDI5MjUgbCAyMjgwIDMwNDUgbCAyMjUwIDMwNDUgbCAyMjIwIDMwNDUgbCAgY3AgZ3MgMC4wMCBzZXRncmF5IGVmIGdyICBjb2wwIHMKLSUgUG9seWxpbmUKLSBbMTUgMTVdIDE1IHNkCi1ncyAgY2xpcHBhdGgKLTI0NDUgMjU5NSBtIDI0NzUgMjQ3NSBsIDI1MDUgMjU5NSBsIDI1MDUgMjQ2MCBsIDI0NDUgMjQ2MCBsIGNwCi1jbGlwCi1uIDI0NzUgMjkyNSBtIDI0NzUgMjQ3NSBsIGdzIGNvbDM0IDEuMDAgc2hkIGVmIGdyIGdzIGNvbDAgcyBnciBncgotIFtdIDAgc2QKLSUgYXJyb3doZWFkCi1uIDI0NDUgMjU5NSBtIDI0NzUgMjQ3NSBsIDI1MDUgMjU5NSBsIDI0NzUgMjU5NSBsIDI0NDUgMjU5NSBsICBjcCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgIGNvbDAgcwotJSBQb2x5bGluZQotIFsxNSAxNV0gMTUgc2QKLWdzICBjbGlwcGF0aAotNTY1NSA1OTU1IG0gNTYyNSA2MDc1IGwgNTU5NSA1OTU1IGwgNTU5NSA2MDkwIGwgNTY1NSA2MDkwIGwgY3AKLWNsaXAKLW4gNTYyNSA1NjI1IG0gNTYyNSA2MDc1IGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIGdyCi0gW10gMCBzZAotJSBhcnJvd2hlYWQKLW4gNTY1NSA1OTU1IG0gNTYyNSA2MDc1IGwgNTU5NSA1OTU1IGwgNTYyNSA1OTU1IGwgNTY1NSA1OTU1IGwgIGNwIGdzIGNvbDcgMS4wMCBzaGQgZWYgZ3IgIGNvbDAgcwotJSBQb2x5bGluZQotIFsxNSAxNV0gMTUgc2QKLWdzICBjbGlwcGF0aAotNTQzMCA2NDA1IG0gNTQwMCA2NTI1IGwgNTM3MCA2NDA1IGwgNTM3MCA2NTQwIGwgNTQzMCA2NTQwIGwgY3AKLWNsaXAKLW4gNTQwMCA1MTc1IG0gNTQwMCA2NTI1IGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIGdyCi0gW10gMCBzZAotJSBhcnJvd2hlYWQKLW4gNTQzMCA2NDA1IG0gNTQwMCA2NTI1IGwgNTM3MCA2NDA1IGwgNTQwMCA2NDA1IGwgNTQzMCA2NDA1IGwgIGNwIGdzIGNvbDcgMS4wMCBzaGQgZWYgZ3IgIGNvbDAgcwotJSBQb2x5bGluZQotIFsxNSAxNV0gMTUgc2QKLWdzICBjbGlwcGF0aAotNTIwNSA1MDU1IG0gNTE3NSA1MTc1IGwgNTE0NSA1MDU1IGwgNTE0NSA1MTkwIGwgNTIwNSA1MTkwIGwgY3AKLWNsaXAKLW4gNTE3NSA0NzI1IG0gNTE3NSA1MTc1IGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIGdyCi0gW10gMCBzZAotJSBhcnJvd2hlYWQKLW4gNTIwNSA1MDU1IG0gNTE3NSA1MTc1IGwgNTE0NSA1MDU1IGwgNTE3NSA1MDU1IGwgNTIwNSA1MDU1IGwgIGNwIGdzIGNvbDcgMS4wMCBzaGQgZWYgZ3IgIGNvbDAgcwotJSBQb2x5bGluZQotIFsxNSAxNV0gMTUgc2QKLWdzICBjbGlwcGF0aAotNDk4MCA0NjA1IG0gNDk1MCA0NzI1IGwgNDkyMCA0NjA1IGwgNDkyMCA0NzQwIGwgNDk4MCA0NzQwIGwgY3AKLWNsaXAKLW4gNDk1MCA0Mjc1IG0gNDk1MCA0NzI1IGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIGdyCi0gW10gMCBzZAotJSBhcnJvd2hlYWQKLW4gNDk4MCA0NjA1IG0gNDk1MCA0NzI1IGwgNDkyMCA0NjA1IGwgNDk1MCA0NjA1IGwgNDk4MCA0NjA1IGwgIGNwIGdzIGNvbDcgMS4wMCBzaGQgZWYgZ3IgIGNvbDAgcwotJSBQb2x5bGluZQotIFsxNSAxNV0gMTUgc2QKLWdzICBjbGlwcGF0aAotNDc1NSA2NDA1IG0gNDcyNSA2NTI1IGwgNDY5NSA2NDA1IGwgNDY5NSA2NTQwIGwgNDc1NSA2NTQwIGwgY3AKLWNsaXAKLW4gNDcyNSAzODI1IG0gNDcyNSA2NTI1IGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIGdyCi0gW10gMCBzZAotJSBhcnJvd2hlYWQKLW4gNDc1NSA2NDA1IG0gNDcyNSA2NTI1IGwgNDY5NSA2NDA1IGwgNDcyNSA2NDA1IGwgNDc1NSA2NDA1IGwgIGNwIGdzIGNvbDcgMS4wMCBzaGQgZWYgZ3IgIGNvbDAgcwotJSBQb2x5bGluZQotIFsxNSAxNV0gMTUgc2QKLWdzICBjbGlwcGF0aAotNDUzMCAzNzA1IG0gNDUwMCAzODI1IGwgNDQ3MCAzNzA1IGwgNDQ3MCAzODQwIGwgNDUzMCAzODQwIGwgY3AKLWNsaXAKLW4gNDUwMCAzMzc1IG0gNDUwMCAzODI1IGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIGdyCi0gW10gMCBzZAotJSBhcnJvd2hlYWQKLW4gNDUzMCAzNzA1IG0gNDUwMCAzODI1IGwgNDQ3MCAzNzA1IGwgNDUwMCAzNzA1IGwgNDUzMCAzNzA1IGwgIGNwIGdzIGNvbDcgMS4wMCBzaGQgZWYgZ3IgIGNvbDAgcwotJSBQb2x5bGluZQotIFsxNSAxNV0gMTUgc2QKLWdzICBjbGlwcGF0aAotNDMwNSAzMjU1IG0gNDI3NSAzMzc1IGwgNDI0NSAzMjU1IGwgNDI0NSAzMzkwIGwgNDMwNSAzMzkwIGwgY3AKLWNsaXAKLW4gNDI3NSAyOTI1IG0gNDI3NSAzMzc1IGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIGdyCi0gW10gMCBzZAotJSBhcnJvd2hlYWQKLW4gNDMwNSAzMjU1IG0gNDI3NSAzMzc1IGwgNDI0NSAzMjU1IGwgNDI3NSAzMjU1IGwgNDMwNSAzMjU1IGwgIGNwIGdzIGNvbDcgMS4wMCBzaGQgZWYgZ3IgIGNvbDAgcwotJSBQb2x5bGluZQotIFsxNSAxNV0gMTUgc2QKLWdzICBjbGlwcGF0aAotNDA4MCAyODA1IG0gNDA1MCAyOTI1IGwgNDAyMCAyODA1IGwgNDAyMCAyOTQwIGwgNDA4MCAyOTQwIGwgY3AKLWNsaXAKLW4gNDA1MCAyNDc1IG0gNDA1MCAyOTI1IGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIGdyCi0gW10gMCBzZAotJSBhcnJvd2hlYWQKLW4gNDA4MCAyODA1IG0gNDA1MCAyOTI1IGwgNDAyMCAyODA1IGwgNDA1MCAyODA1IGwgNDA4MCAyODA1IGwgIGNwIGdzIGNvbDcgMS4wMCBzaGQgZWYgZ3IgIGNvbDAgcwotJSBQb2x5bGluZQotIFsxNSAxNV0gMTUgc2QKLWdzICBjbGlwcGF0aAotMjY3MCAyMTQ1IG0gMjcwMCAyMDI1IGwgMjczMCAyMTQ1IGwgMjczMCAyMDEwIGwgMjY3MCAyMDEwIGwgY3AKLWNsaXAKLW4gMjcwMCA2NTI1IG0gMjcwMCAyMDI1IGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIGdyCi0gW10gMCBzZAotJSBhcnJvd2hlYWQKLW4gMjY3MCAyMTQ1IG0gMjcwMCAyMDI1IGwgMjczMCAyMTQ1IGwgMjcwMCAyMTQ1IGwgMjY3MCAyMTQ1IGwgIGNwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciAgY29sMCBzCi0lIFBvbHlsaW5lCi0gWzE1IDE1XSAxNSBzZAotZ3MgIGNsaXBwYXRoCi0zODU1IDY0MDUgbSAzODI1IDY1MjUgbCAzNzk1IDY0MDUgbCAzNzk1IDY1NDAgbCAzODU1IDY1NDAgbCBjcAotY2xpcAotbiAzODI1IDIwMjUgbSAzODI1IDY1MjUgbCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wwIHMgZ3IgZ3IKLSBbXSAwIHNkCi0lIGFycm93aGVhZAotbiAzODU1IDY0MDUgbSAzODI1IDY1MjUgbCAzNzk1IDY0MDUgbCAzODI1IDY0MDUgbCAzODU1IDY0MDUgbCAgY3AgZ3MgY29sNyAxLjAwIHNoZCBlZiBnciAgY29sMCBzCi0lIFBvbHlsaW5lCi0gWzE1IDE1XSAxNSBzZAotZ3MgIGNsaXBwYXRoCi0zNjMwIDE5MDUgbSAzNjAwIDIwMjUgbCAzNTcwIDE5MDUgbCAzNTcwIDIwNDAgbCAzNjMwIDIwNDAgbCBjcAotY2xpcAotbiAzNjAwIDE1NzUgbSAzNjAwIDIwMjUgbCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wwIHMgZ3IgZ3IKLSBbXSAwIHNkCi0lIGFycm93aGVhZAotbiAzNjMwIDE5MDUgbSAzNjAwIDIwMjUgbCAzNTcwIDE5MDUgbCAzNjAwIDE5MDUgbCAzNjMwIDE5MDUgbCAgY3AgZ3MgY29sNyAxLjAwIHNoZCBlZiBnciAgY29sMCBzCi0lIFBvbHlsaW5lCi0gWzE1IDE1XSAxNSBzZAotZ3MgIGNsaXBwYXRoCi0yODk1IDE2OTUgbSAyOTI1IDE1NzUgbCAyOTU1IDE2OTUgbCAyOTU1IDE1NjAgbCAyODk1IDE1NjAgbCBjcAotY2xpcAotbiAyOTI1IDIwMjUgbSAyOTI1IDE1NzUgbCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wwIHMgZ3IgZ3IKLSBbXSAwIHNkCi0lIGFycm93aGVhZAotbiAyODk1IDE2OTUgbSAyOTI1IDE1NzUgbCAyOTU1IDE2OTUgbCAyOTI1IDE2OTUgbCAyODk1IDE2OTUgbCAgY3AgZ3MgMC4wMCBzZXRncmF5IGVmIGdyICBjb2wwIHMKLSUgUG9seWxpbmUKLTQ1LjAwMCBzbHcKLWdzICBjbGlwcGF0aAotNjA4NyA2NDk1IG0gNjIwNyA2NTI1IGwgNjA4NyA2NTU1IGwgNjM2MCA2NTU1IGwgNjM2MCA2NDk1IGwgY3AKLWNsaXAKLW4gNTQwIDY1MjUgbSA2MzAwIDY1MjUgbCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sMCBzIGdyIGdyCi0KLSUgYXJyb3doZWFkCi1uIDYwODcgNjQ5NSBtIDYyMDcgNjUyNSBsIDYwODcgNjU1NSBsIDYwODcgNjUyNSBsIDYwODcgNjQ5NSBsICBjcCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgIGNvbDAgcwotJSBQb2x5bGluZQotNy41MDAgc2x3Ci1ncyAgY2xpcHBhdGgKLTM2ODEgNjcyMCBtIDM4MjUgNjc1MCBsIDM2ODEgNjc4MCBsIDM4NDAgNjc4MCBsIDM4NDAgNjcyMCBsIGNwCi0yODQ0IDY3ODAgbSAyNzAwIDY3NTAgbCAyODQ0IDY3MjAgbCAyNjg1IDY3MjAgbCAyNjg1IDY3ODAgbCBjcAotY2xpcAotbiAyNzAwIDY3NTAgbSAzODI1IDY3NTAgbCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wwIHMgZ3IgZ3IKLQotJSBhcnJvd2hlYWQKLW4gMjg0NCA2NzgwIG0gMjcwMCA2NzUwIGwgMjg0NCA2NzIwIGwgMjgyMCA2NzUwIGwgMjg0NCA2NzgwIGwgIGNwIGdzIGNvbDcgMS4wMCBzaGQgZWYgZ3IgIGNvbDAgcwotJSBhcnJvd2hlYWQKLW4gMzY4MSA2NzIwIG0gMzgyNSA2NzUwIGwgMzY4MSA2NzgwIGwgMzcwNSA2NzUwIGwgMzY4MSA2NzIwIGwgIGNwIGdzIGNvbDcgMS4wMCBzaGQgZWYgZ3IgIGNvbDAgcwotJSBQb2x5bGluZQotZ3MgIGNsaXBwYXRoCi01MjU2IDcxNzAgbSA1NDAwIDcyMDAgbCA1MjU2IDcyMzAgbCA1NDE1IDcyMzAgbCA1NDE1IDcxNzAgbCBjcAotMTI2OSA3MjMwIG0gMTEyNSA3MjAwIGwgMTI2OSA3MTcwIGwgMTExMCA3MTcwIGwgMTExMCA3MjMwIGwgY3AKLWNsaXAKLW4gMTEyNSA3MjAwIG0gNTQwMCA3MjAwIGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIGdyCi0KLSUgYXJyb3doZWFkCi1uIDEyNjkgNzIzMCBtIDExMjUgNzIwMCBsIDEyNjkgNzE3MCBsIDEyNDUgNzIwMCBsIDEyNjkgNzIzMCBsICBjcCBncyBjb2w3IDEuMDAgc2hkIGVmIGdyICBjb2wwIHMKLSUgYXJyb3doZWFkCi1uIDUyNTYgNzE3MCBtIDU0MDAgNzIwMCBsIDUyNTYgNzIzMCBsIDUyODAgNzIwMCBsIDUyNTYgNzE3MCBsICBjcCBncyBjb2w3IDEuMDAgc2hkIGVmIGdyICBjb2wwIHMKLSUgUG9seWxpbmUKLWdzICBjbGlwcGF0aAotNDU4MSA2OTQ1IG0gNDcyNSA2OTc1IGwgNDU4MSA3MDA1IGwgNDc0MCA3MDA1IGwgNDc0MCA2OTQ1IGwgY3AKLTE5NDQgNzAwNSBtIDE4MDAgNjk3NSBsIDE5NDQgNjk0NSBsIDE3ODUgNjk0NSBsIDE3ODUgNzAwNSBsIGNwCi1jbGlwCi1uIDE4MDAgNjk3NSBtIDQ3MjUgNjk3NSBsIGdzIGNvbDM0IDEuMDAgc2hkIGVmIGdyIGdzIGNvbDAgcyBnciBncgotCi0lIGFycm93aGVhZAotbiAxOTQ0IDcwMDUgbSAxODAwIDY5NzUgbCAxOTQ0IDY5NDUgbCAxOTIwIDY5NzUgbCAxOTQ0IDcwMDUgbCAgY3AgZ3MgY29sNyAxLjAwIHNoZCBlZiBnciAgY29sMCBzCi0lIGFycm93aGVhZAotbiA0NTgxIDY5NDUgbSA0NzI1IDY5NzUgbCA0NTgxIDcwMDUgbCA0NjA1IDY5NzUgbCA0NTgxIDY5NDUgbCAgY3AgZ3MgY29sNyAxLjAwIHNoZCBlZiBnciAgY29sMCBzCi0lIFBvbHlsaW5lCi1ncyAgY2xpcHBhdGgKLTU3MDYgNzM5NSBtIDU4NTAgNzQyNSBsIDU3MDYgNzQ1NSBsIDU4NjUgNzQ1NSBsIDU4NjUgNzM5NSBsIGNwCi04MTkgNzQ1NSBtIDY3NSA3NDI1IGwgODE5IDczOTUgbCA2NjAgNzM5NSBsIDY2MCA3NDU1IGwgY3AKLWNsaXAKLW4gNjc1IDc0MjUgbSA1ODUwIDc0MjUgbCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wwIHMgZ3IgZ3IKLQotJSBhcnJvd2hlYWQKLW4gODE5IDc0NTUgbSA2NzUgNzQyNSBsIDgxOSA3Mzk1IGwgNzk1IDc0MjUgbCA4MTkgNzQ1NSBsICBjcCBncyBjb2w3IDEuMDAgc2hkIGVmIGdyICBjb2wwIHMKLSUgYXJyb3doZWFkCi1uIDU3MDYgNzM5NSBtIDU4NTAgNzQyNSBsIDU3MDYgNzQ1NSBsIDU3MzAgNzQyNSBsIDU3MDYgNzM5NSBsICBjcCBncyBjb2w3IDEuMDAgc2hkIGVmIGdyICBjb2wwIHMKLSUgUG9seWxpbmUKLTEgc2xjCi0gWzE1IDQ1XSA0NSBzZAotbiA2NzUgNjU3MCBtIDY3NSA3NjUwIGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyICBbXSAwIHNkCi0lIFBvbHlsaW5lCi0gWzE1IDQ1XSA0NSBzZAotbiAxMTI1IDY1NzAgbSAxMTI1IDc2NTAgbCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wwIHMgZ3IgIFtdIDAgc2QKLSUgUG9seWxpbmUKLSBbMTUgNDVdIDQ1IHNkCi1uIDE4MDAgNjU3MCBtIDE4MDAgNzY1MCBsIGdzIGNvbDM0IDEuMDAgc2hkIGVmIGdyIGdzIGNvbDAgcyBnciAgW10gMCBzZAotJSBQb2x5bGluZQotIFsxNSA0NV0gNDUgc2QKLW4gMjcwMCA2NTcwIG0gMjcwMCA3NjUwIGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyICBbXSAwIHNkCi0lIFBvbHlsaW5lCi0gWzE1IDQ1XSA0NSBzZAotbiAzODI1IDY1NzAgbSAzODI1IDc2NTAgbCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wwIHMgZ3IgIFtdIDAgc2QKLSUgUG9seWxpbmUKLSBbMTUgNDVdIDQ1IHNkCi1uIDQ3MjUgNjU3MCBtIDQ3MjUgNzY1MCBsIGdzIGNvbDM0IDEuMDAgc2hkIGVmIGdyIGdzIGNvbDAgcyBnciAgW10gMCBzZAotJSBQb2x5bGluZQotIFsxNSA0NV0gNDUgc2QKLW4gNTQwMCA2NTcwIG0gNTQwMCA3NjUwIGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyICBbXSAwIHNkCi0lIFBvbHlsaW5lCi0gWzE1IDQ1XSA0NSBzZAotbiA1ODUwIDY1NzAgbSA1ODUwIDc2NTAgbCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wwIHMgZ3IgIFtdIDAgc2QKLSUgUG9seWxpbmUKLTAgc2xjCi1uIDc1MCAyMjUgbSA0NTAgMjI1IDQ1MCAxMDUwIDMwMCBhcmN0byA0IHtwb3B9IHJlcGVhdAotICA0NTAgMTM1MCAxMjMwMCAxMzUwIDMwMCBhcmN0byA0IHtwb3B9IHJlcGVhdAotICAxMjYwMCAxMzUwIDEyNjAwIDUyNSAzMDAgYXJjdG8gNCB7cG9wfSByZXBlYXQKLSAgMTI2MDAgMjI1IDc1MCAyMjUgMzAwIGFyY3RvIDQge3BvcH0gcmVwZWF0Ci0gY3AgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIAotJSBQb2x5bGluZQotbiA4ODM1IDIyNTAgbSA4Nzc1IDIyNTAgODc3NSAyNDE1IDYwIGFyY3RvIDQge3BvcH0gcmVwZWF0Ci0gIDg3NzUgMjQ3NSAxMDExMCAyNDc1IDYwIGFyY3RvIDQge3BvcH0gcmVwZWF0Ci0gIDEwMTcwIDI0NzUgMTAxNzAgMjMxMCA2MCBhcmN0byA0IHtwb3B9IHJlcGVhdAotICAxMDE3MCAyMjUwIDg4MzUgMjI1MCA2MCBhcmN0byA0IHtwb3B9IHJlcGVhdAotIGNwIGdzIGNvbDM1IDEuMDAgc2hkIGVmIGdyIGdzIGNvbDM1IHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDEwNjM1IDIyNTAgbSAxMDU3NSAyMjUwIDEwNTc1IDI0MTUgNjAgYXJjdG8gNCB7cG9wfSByZXBlYXQKLSAgMTA1NzUgMjQ3NSAxMTg2NSAyNDc1IDYwIGFyY3RvIDQge3BvcH0gcmVwZWF0Ci0gIDExOTI1IDI0NzUgMTE5MjUgMjMxMCA2MCBhcmN0byA0IHtwb3B9IHJlcGVhdAotICAxMTkyNSAyMjUwIDEwNjM1IDIyNTAgNjAgYXJjdG8gNCB7cG9wfSByZXBlYXQKLSBjcCBncyBjb2wzNSAxLjAwIHNoZCBlZiBnciBncyBjb2wzNSBzIGdyIAotJSBQb2x5bGluZQotbiAxMTQ5MCA0Mjc1IG0gMTE0MzAgNDI3NSAxMTQzMCA0NDQwIDYwIGFyY3RvIDQge3BvcH0gcmVwZWF0Ci0gIDExNDMwIDQ1MDAgMTIzMTUgNDUwMCA2MCBhcmN0byA0IHtwb3B9IHJlcGVhdAotICAxMjM3NSA0NTAwIDEyMzc1IDQzMzUgNjAgYXJjdG8gNCB7cG9wfSByZXBlYXQKLSAgMTIzNzUgNDI3NSAxMTQ5MCA0Mjc1IDYwIGFyY3RvIDQge3BvcH0gcmVwZWF0Ci0gY3AgZ3MgY29sMzUgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMzUgcyBnciAKLSUgUG9seWxpbmUKLW4gMTEwNDAgNTE3NSBtIDEwOTgwIDUxNzUgMTA5ODAgNTM0MCA2MCBhcmN0byA0IHtwb3B9IHJlcGVhdAotICAxMDk4MCA1NDAwIDEyMzE1IDU0MDAgNjAgYXJjdG8gNCB7cG9wfSByZXBlYXQKLSAgMTIzNzUgNTQwMCAxMjM3NSA1MjM1IDYwIGFyY3RvIDQge3BvcH0gcmVwZWF0Ci0gIDEyMzc1IDUxNzUgMTEwNDAgNTE3NSA2MCBhcmN0byA0IHtwb3B9IHJlcGVhdAotIGNwIGdzIGNvbDM1IDEuMDAgc2hkIGVmIGdyIGdzIGNvbDM1IHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDk3MzUgNTE3NSBtIDk2NzUgNTE3NSA5Njc1IDUzNDAgNjAgYXJjdG8gNCB7cG9wfSByZXBlYXQKLSAgOTY3NSA1NDAwIDEwMTEwIDU0MDAgNjAgYXJjdG8gNCB7cG9wfSByZXBlYXQKLSAgMTAxNzAgNTQwMCAxMDE3MCA1MjM1IDYwIGFyY3RvIDQge3BvcH0gcmVwZWF0Ci0gIDEwMTcwIDUxNzUgOTczNSA1MTc1IDYwIGFyY3RvIDQge3BvcH0gcmVwZWF0Ci0gY3AgZ3MgY29sMzUgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMzUgcyBnciAKLSUgUG9seWxpbmUKLW4gNzI2MCA2MDc1IG0gNzIwMCA2MDc1IDcyMDAgNjI0MCA2MCBhcmN0byA0IHtwb3B9IHJlcGVhdAotICA3MjAwIDYzMDAgNzgxNSA2MzAwIDYwIGFyY3RvIDQge3BvcH0gcmVwZWF0Ci0gIDc4NzUgNjMwMCA3ODc1IDYxMzUgNjAgYXJjdG8gNCB7cG9wfSByZXBlYXQKLSAgNzg3NSA2MDc1IDcyNjAgNjA3NSA2MCBhcmN0byA0IHtwb3B9IHJlcGVhdAotIGNwIGdzIGNvbDM1IDEuMDAgc2hkIGVmIGdyIGdzIGNvbDM1IHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDY4MTAgMjI1MCBtIDY3NTAgMjI1MCA2NzUwIDI0MTUgNjAgYXJjdG8gNCB7cG9wfSByZXBlYXQKLSAgNjc1MCAyNDc1IDgxMzAgMjQ3NSA2MCBhcmN0byA0IHtwb3B9IHJlcGVhdAotICA4MTkwIDI0NzUgODE5MCAyMzEwIDYwIGFyY3RvIDQge3BvcH0gcmVwZWF0Ci0gIDgxOTAgMjI1MCA2ODEwIDIyNTAgNjAgYXJjdG8gNCB7cG9wfSByZXBlYXQKLSBjcCBncyBjb2wzNSAxLjAwIHNoZCBlZiBnciBncyBjb2wzNSBzIGdyIAotJSBQb2x5bGluZQotbiA2MzYwIDMzNzUgbSA2MzAwIDMzNzUgNjMwMCAzNTQwIDYwIGFyY3RvIDQge3BvcH0gcmVwZWF0Ci0gIDYzMDAgMzYwMCA3NTQ1IDM2MDAgNjAgYXJjdG8gNCB7cG9wfSByZXBlYXQKLSAgNzYwNSAzNjAwIDc2MDUgMzQzNSA2MCBhcmN0byA0IHtwb3B9IHJlcGVhdAotICA3NjA1IDMzNzUgNjM2MCAzMzc1IDYwIGFyY3RvIDQge3BvcH0gcmVwZWF0Ci0gY3AgZ3MgY29sMzUgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMzUgcyBnciAKLSUgUG9seWxpbmUKLW4gNjM2MCA0Mjc1IG0gNjMwMCA0Mjc1IDYzMDAgNDQ0MCA2MCBhcmN0byA0IHtwb3B9IHJlcGVhdAotICA2MzAwIDQ1MDAgNzI3NSA0NTAwIDYwIGFyY3RvIDQge3BvcH0gcmVwZWF0Ci0gIDczMzUgNDUwMCA3MzM1IDQzMzUgNjAgYXJjdG8gNCB7cG9wfSByZXBlYXQKLSAgNzMzNSA0Mjc1IDYzNjAgNDI3NSA2MCBhcmN0byA0IHtwb3B9IHJlcGVhdAotIGNwIGdzIGNvbDM1IDEuMDAgc2hkIGVmIGdyIGdzIGNvbDM1IHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDYzNjAgNTE3NSBtIDYzMDAgNTE3NSA2MzAwIDUzNDAgNjAgYXJjdG8gNCB7cG9wfSByZXBlYXQKLSAgNjMwMCA1NDAwIDcxNDAgNTQwMCA2MCBhcmN0byA0IHtwb3B9IHJlcGVhdAotICA3MjAwIDU0MDAgNzIwMCA1MjM1IDYwIGFyY3RvIDQge3BvcH0gcmVwZWF0Ci0gIDcyMDAgNTE3NSA2MzYwIDUxNzUgNjAgYXJjdG8gNCB7cG9wfSByZXBlYXQKLSBjcCBncyBjb2wzNSAxLjAwIHNoZCBlZiBnciBncyBjb2wzNSBzIGdyIAotJSBQb2x5bGluZQotZ3MgIGNsaXBwYXRoCi03MzY1IDUzNDAgbSA3MjQ1IDUzMTAgbCA3MzY1IDUyODAgbCA3MjMwIDUyODAgbCA3MjMwIDUzNDAgbCBjcAotY2xpcAotbiA5NjMwIDUzMTAgbSA3MjQ1IDUzMTAgbCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wwIHMgZ3IgZ3IKLQotJSBhcnJvd2hlYWQKLW4gNzM2NSA1MzQwIG0gNzI0NSA1MzEwIGwgNzM2NSA1MjgwIGwgNzM2NSA1MzEwIGwgNzM2NSA1MzQwIGwgIGNwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciAgY29sMCBzCi0lIFBvbHlsaW5lCi1ncyAgY2xpcHBhdGgKLTc1MDAgNDM5NSBtIDczODAgNDM2NSBsIDc1MDAgNDMzNSBsIDczNjUgNDMzNSBsIDczNjUgNDM5NSBsIGNwCi1jbGlwCi1uIDExMzg1IDQzNjUgbSA3MzgwIDQzNjUgbCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wwIHMgZ3IgZ3IKLQotJSBhcnJvd2hlYWQKLW4gNzUwMCA0Mzk1IG0gNzM4MCA0MzY1IGwgNzUwMCA0MzM1IGwgNzUwMCA0MzY1IGwgNzUwMCA0Mzk1IGwgIGNwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciAgY29sMCBzCi0lIFBvbHlsaW5lCi1uIDExMDQwIDU1ODAgbSAxMDk4MCA1NTgwIDEwOTgwIDU3NDUgNjAgYXJjdG8gNCB7cG9wfSByZXBlYXQKLSAgMTA5ODAgNTgwNSAxMjE4MCA1ODA1IDYwIGFyY3RvIDQge3BvcH0gcmVwZWF0Ci0gIDEyMjQwIDU4MDUgMTIyNDAgNTY0MCA2MCBhcmN0byA0IHtwb3B9IHJlcGVhdAotICAxMjI0MCA1NTgwIDExMDQwIDU1ODAgNjAgYXJjdG8gNCB7cG9wfSByZXBlYXQKLSBjcCBncyBjb2wzNSAxLjAwIHNoZCBlZiBnciBncyBjb2wzNSBzIGdyIAotJSBQb2x5bGluZQotbiAxMTA0MCA1OTg1IG0gMTA5ODAgNTk4NSAxMDk4MCA2MTUwIDYwIGFyY3RvIDQge3BvcH0gcmVwZWF0Ci0gIDEwOTgwIDYyMTAgMTIzMTUgNjIxMCA2MCBhcmN0byA0IHtwb3B9IHJlcGVhdAotICAxMjM3NSA2MjEwIDEyMzc1IDYwNDUgNjAgYXJjdG8gNCB7cG9wfSByZXBlYXQKLSAgMTIzNzUgNTk4NSAxMTA0MCA1OTg1IDYwIGFyY3RvIDQge3BvcH0gcmVwZWF0Ci0gY3AgZ3MgY29sMzUgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMzUgcyBnciAKLSUgUG9seWxpbmUKLWdzICBjbGlwcGF0aAotOTk1OCA1NTU0IG0gOTkwMCA1NDQ1IGwgMTAwMDMgNTUxNCBsIDk5MTIgNTQxNCBsIDk4NjggNTQ1NCBsIGNwCi1jbGlwCi1uIDExMjA1IDY4ODUgbSA5OTAwIDU0NDUgbCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wwIHMgZ3IgZ3IKLQotJSBhcnJvd2hlYWQKLW4gOTk1OCA1NTU0IG0gOTkwMCA1NDQ1IGwgMTAwMDMgNTUxNCBsIDk5ODEgNTUzNCBsIDk5NTggNTU1NCBsICBjcCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgIGNvbDAgcwotJSBQb2x5bGluZQotbiAxMDU5MCA2OTMwIG0gMTA1MzAgNjkzMCAxMDUzMCA3MDk1IDYwIGFyY3RvIDQge3BvcH0gcmVwZWF0Ci0gIDEwNTMwIDcxNTUgMTIyMjUgNzE1NSA2MCBhcmN0byA0IHtwb3B9IHJlcGVhdAotICAxMjI4NSA3MTU1IDEyMjg1IDY5OTAgNjAgYXJjdG8gNCB7cG9wfSByZXBlYXQKLSAgMTIyODUgNjkzMCAxMDU5MCA2OTMwIDYwIGFyY3RvIDQge3BvcH0gcmVwZWF0Ci0gY3AgZ3MgY29sMzUgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMzUgcyBnciAKLSUgUG9seWxpbmUKLW4gOTY5MCA2OTMwIG0gOTYzMCA2OTMwIDk2MzAgNzA5NSA2MCBhcmN0byA0IHtwb3B9IHJlcGVhdAotICA5NjMwIDcxNTUgMTAxMTAgNzE1NSA2MCBhcmN0byA0IHtwb3B9IHJlcGVhdAotICAxMDE3MCA3MTU1IDEwMTcwIDY5OTAgNjAgYXJjdG8gNCB7cG9wfSByZXBlYXQKLSAgMTAxNzAgNjkzMCA5NjkwIDY5MzAgNjAgYXJjdG8gNCB7cG9wfSByZXBlYXQKLSBjcCBncyBjb2wzNSAxLjAwIHNoZCBlZiBnciBncyBjb2wzNSBzIGdyIAotL1RpbWVzLVJvbWFuLWlzbyBmZiAxMjAuMDAgc2NmIHNmCi05MDAgNzU2MCBtCi1ncyAxIC0xIHNjIChTdGFydHVwLCBSdW50aW1lLCBTaHV0ZG93bikgY29sMCBzaCBncgotL0hlbHZldGljYS1OYXJyb3ctaXNvIGZmIDEyMC4wMCBzY2Ygc2YKLTYzNDUgMjk3MCBtCi1ncyAxIC0xIHNjIChhcF9jdHhfZ2V0XCguLi4sKSBjb2wwIHNoIGdyCi0vSGVsdmV0aWNhLU5hcnJvdy1pc28gZmYgMTIwLjAwIHNjZiBzZgotMTA4MDAgMjc0NSBtCi1ncyAxIC0xIHNjIChhcF9nZXRfbW9kdWxlX2NvbmZpZ1woLi4uKSBjb2wwIHNoIGdyCi0vSGVsdmV0aWNhLU5hcnJvdy1pc28gZmYgMTIwLjAwIHNjZiBzZgotMTA4MDAgMjg4MCBtCi1ncyAxIC0xIHNjICgtPnBlcl9kaXJfY29uZmlnLCkgY29sMCBzaCBncgotL0hlbHZldGljYS1OYXJyb3ctaXNvIGZmIDEyMC4wMCBzY2Ygc2YKLTEwODAwIDMwMTUgbQotZ3MgMSAtMSBzYyAoJnNzbF9tb2R1bGVcKSkgY29sMCBzaCBncgotJSBQb2x5bGluZQotbiA3OTgwIDQ3NzAgbSA3OTIwIDQ3NzAgNzkyMCA0OTM1IDYwIGFyY3RvIDQge3BvcH0gcmVwZWF0Ci0gIDc5MjAgNDk5NSA5MDc1IDQ5OTUgNjAgYXJjdG8gNCB7cG9wfSByZXBlYXQKLSAgOTEzNSA0OTk1IDkxMzUgNDgzMCA2MCBhcmN0byA0IHtwb3B9IHJlcGVhdAotICA5MTM1IDQ3NzAgNzk4MCA0NzcwIDYwIGFyY3RvIDQge3BvcH0gcmVwZWF0Ci0gY3AgZ3MgY29sMzUgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMzUgcyBnciAKLSUgUG9seWxpbmUKLWdzICBjbGlwcGF0aAotNzM0MCAyNjEwIG0gNzQyNSAyNTIwIGwgNzM5MyAyNjM5IGwgNzQ1OSAyNTIxIGwgNzQwNiAyNDkyIGwgY3AKLWNsaXAKLW4gNjk3NSAzMzMwIG0gNzQyNSAyNTIwIGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIGdyCi0KLSUgYXJyb3doZWFkCi1uIDczNDAgMjYxMCBtIDc0MjUgMjUyMCBsIDczOTMgMjYzOSBsIDczNjcgMjYyNSBsIDczNDAgMjYxMCBsICBjcCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgIGNvbDAgcwotJSBQb2x5bGluZQotZ3MgIGNsaXBwYXRoCi05MzM2IDI1NjkgbSA5NDUwIDI1MjAgbCA5MzczIDI2MTYgbCA5NDgwIDI1MzUgbCA5NDQ0IDI0ODcgbCBjcAotY2xpcAotbiA3MjAwIDQyMzAgbSA5NDUwIDI1MjAgbCBncyBjb2wzNCAxLjAwIHNoZCBlZiBnciBncyBjb2wwIHMgZ3IgZ3IKLQotJSBhcnJvd2hlYWQKLW4gOTMzNiAyNTY5IG0gOTQ1MCAyNTIwIGwgOTM3MyAyNjE2IGwgOTM1NCAyNTkzIGwgOTMzNiAyNTY5IGwgIGNwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciAgY29sMCBzCi0lIFBvbHlsaW5lCi1ncyAgY2xpcHBhdGgKLTczMjEgNTE5NiBtIDcyMDAgNTIyMCBsIDcyOTYgNTE0MiBsIDcxNzQgNTE5OSBsIDcxOTkgNTI1NCBsIGNwCi1jbGlwCi1uIDc4NzUgNDkwNSBtIDcyMDAgNTIyMCBsIGdzIGNvbDM0IDEuMDAgc2hkIGVmIGdyIGdzIGNvbDAgcyBnciBncgotCi0lIGFycm93aGVhZAotbiA3MzIxIDUxOTYgbSA3MjAwIDUyMjAgbCA3Mjk2IDUxNDIgbCA3MzA5IDUxNjkgbCA3MzIxIDUxOTYgbCAgY3AgZ3MgMC4wMCBzZXRncmF5IGVmIGdyICBjb2wwIHMKLSUgUG9seWxpbmUKLWdzICBjbGlwcGF0aAotNjcyMCA0NjY1IG0gNjc1MCA0NTQ1IGwgNjc4MCA0NjY1IGwgNjc4MCA0NTMwIGwgNjcyMCA0NTMwIGwgY3AKLWNsaXAKLW4gNjc1MCA1MTMwIG0gNjc1MCA0NTQ1IGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIGdyCi0KLSUgYXJyb3doZWFkCi1uIDY3MjAgNDY2NSBtIDY3NTAgNDU0NSBsIDY3ODAgNDY2NSBsIDY3NTAgNDY2NSBsIDY3MjAgNDY2NSBsICBjcCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgIGNvbDAgcwotJSBQb2x5bGluZQotIFsxNSAxNV0gMTUgc2QKLWdzICBjbGlwcGF0aAotOTI3OSA0OTg0IG0gOTE3NSA0OTE4IGwgOTI5OCA0OTI3IGwgOTE3MCA0ODg1IGwgOTE1MSA0OTQyIGwgY3AKLWNsaXAKLW4gOTg1MCA1MTQzIG0gOTE3NSA0OTE4IGwgZ3MgY29sMzQgMS4wMCBzaGQgZWYgZ3IgZ3MgY29sMCBzIGdyIGdyCi0gW10gMCBzZAotJSBhcnJvd2hlYWQKLW4gOTI3OSA0OTg0IG0gOTE3NSA0OTE4IGwgOTI5OCA0OTI3IGwgOTI4OSA0OTU2IGwgOTI3OSA0OTg0IGwgIGNwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciAgY29sMCBzCi0vSGVsdmV0aWNhLU5hcnJvdy1pc28gZmYgMTIwLjAwIHNjZiBzZgotNjIxMCA0NjgwIG0KLWdzIDEgLTEgc2MgKC0+c2VydmVyKSBjb2wwIHNoIGdyCi0vSGVsdmV0aWNhLU5hcnJvdy1pc28gZmYgMTIwLjAwIHNjZiBzZgotODI4MCA2MTIwIG0KLWdzIDEgLTEgc2MgKGFwX2N0eF9nZXRcKC4uLiwic3NsIlwpKSBjb2wwIHNoIGdyCi0vSGVsdmV0aWNhLU5hcnJvdy1pc28gZmYgMTIwLjAwIHNjZiBzZgotNzc0MCAyNzAwIG0KLWdzIDEgLTEgc2MgKGFwX2dldF9tb2R1bGVfY29uZmlnXCguLi4pIGNvbDAgc2ggZ3IKLS9IZWx2ZXRpY2EtTmFycm93LWlzbyBmZiAxMjAuMDAgc2NmIHNmCi03NzQwIDI4MzUgbQotZ3MgMSAtMSBzYyAoLT5tb2R1bGVfY29uZmlnLCkgY29sMCBzaCBncgotL0hlbHZldGljYS1OYXJyb3ctaXNvIGZmIDEyMC4wMCBzY2Ygc2YKLTc3NDAgMjk3MCBtCi1ncyAxIC0xIHNjICgmc3NsX21vZHVsZVwpKSBjb2wwIHNoIGdyCi0vSGVsdmV0aWNhLU5hcnJvdy1pc28gZmYgMTIwLjAwIHNjZiBzZgotNjM0NSAzMTA1IG0KLWdzIDEgLTEgc2MgKCJzc2xfbW9kdWxlIlwpKSBjb2wwIHNoIGdyCi0vVGltZXMtUm9tYW4taXNvIGZmIDEyMC4wMCBzY2Ygc2YKLTEzNTAgNzMzNSBtCi1ncyAxIC0xIHNjIChDb25maWd1cmF0aW9uIFRpbWUpIGNvbDAgc2ggZ3IKLS9UaW1lcy1Sb21hbi1pc28gZmYgMTIwLjAwIHNjZiBzZgotMjAyNSA3MTEwIG0KLWdzIDEgLTEgc2MgKENvbm5lY3Rpb24gRHVyYXRpb24pIGNvbDAgc2ggZ3IKLS9UaW1lcy1Sb21hbi1pc28gZmYgMTIwLjAwIHNjZiBzZgotMjgzNSA2ODg1IG0KLWdzIDEgLTEgc2MgKFJlcXVlc3QgRHVyYXRpb24pIGNvbDAgc2ggZ3IKLS9IZWx2ZXRpY2EtQm9sZC1pc28gZmYgMzAwLjAwIHNjZiBzZgotNjM0NSA2Nzk1IG0KLWdzIDEgLTEgc2MgKHQpIGNvbDAgc2ggZ3IKLS9IZWx2ZXRpY2EtTmFycm93LWlzbyBmZiAxMjAuMDAgc2NmIHNmCi03MTEwIDU5ODUgbQotZ3MgMSAtMSBzYyAoLT5jbGllbnQpIGNvbDAgc2ggZ3IKLS9IZWx2ZXRpY2EtTmFycm93LWlzbyBmZiAxMjAuMDAgc2NmIHNmCi03MDY1IDUwODUgbQotZ3MgMSAtMSBzYyAoLT5jb25uZWN0aW9uKSBjb2wwIHNoIGdyCi0vSGVsdmV0aWNhLU5hcnJvdy1pc28gZmYgMTIwLjAwIHNjZiBzZgotNzA2NSA0NzcwIG0KLWdzIDEgLTEgc2MgKC0+c2VydmVyKSBjb2wwIHNoIGdyCi0vSGVsdmV0aWNhLU5hcnJvdy1pc28gZmYgMTIwLjAwIHNjZiBzZgotODAxMCA1NDQ1IG0KLWdzIDEgLTEgc2MgKFNTTF9nZXRfYXBwX2RhdGFcKFwpKSBjb2wwIHNoIGdyCi0vSGVsdmV0aWNhLU5hcnJvdy1pc28gZmYgMTIwLjAwIHNjZiBzZgotMTA1MzAgNDA1MCBtCi1ncyAxIC0xIHNjICgtPnBTU0xDdHgpIGNvbDAgc2ggZ3IKLS9IZWx2ZXRpY2EtTmFycm93LWlzbyBmZiAxMjAuMDAgc2NmIHNmCi03ODc1IDQyNzUgbQotZ3MgMSAtMSBzYyAoU1NMX0NUWF9nZXRfYXBwX2RhdGFcKFwpKSBjb2wwIHNoIGdyCi0vSGVsdmV0aWNhLU5hcnJvdy1pc28gZmYgMTIwLjAwIHNjZiBzZgotMTAzMDUgNTUzNSBtCi1ncyAxIC0xIHNjIChTU0xfZ2V0X2N1cnJlbnRfY2lwaGVyXChcKSkgY29sMCBzaCBncgotL0hlbHZldGljYS1OYXJyb3ctaXNvIGZmIDEyMC4wMCBzY2Ygc2YKLTEwNDQwIDU5NDAgbQotZ3MgMSAtMSBzYyAoU1NMX2dldF9zZXNzaW9uXChcKSkgY29sMCBzaCBncgotL0hlbHZldGljYS1OYXJyb3ctaXNvIGZmIDEyMC4wMCBzY2Ygc2YKLTk1NDAgNzMzNSBtCi1ncyAxIC0xIHNjIChTU0xfZ2V0X3tyLHd9YmlvXChcKSkgY29sMCBzaCBncgotL0hlbHZldGljYS1OYXJyb3ctaXNvIGZmIDEyMC4wMCBzY2Ygc2YKLTEwMTI1IDQ2ODAgbQotZ3MgMSAtMSBzYyAoU1NMX2dldF9TU0xfQ1RYXChcKSkgY29sMCBzaCBncgotL0hlbHZldGljYS1OYXJyb3ctaXNvIGZmIDEyMC4wMCBzY2Ygc2YKLTEwMzUwIDUxNzUgbQotZ3MgMSAtMSBzYyAoU1NMX2dldF9TU0xfTUVUSE9EXChcKSkgY29sMCBzaCBncgotL0hlbHZldGljYS1OYXJyb3ctaXNvIGZmIDEyMC4wMCBzY2Ygc2YKLTExNzQ1IDQ3NzAgbQotZ3MgMSAtMSBzYyAoLT5tZXRob2QpIGNvbDAgc2ggZ3IKLS9IZWx2ZXRpY2EtTmFycm93LWlzbyBmZiAxMjAuMDAgc2NmIHNmCi05OTQ1IDY0ODAgbQotZ3MgMSAtMSBzYyAoWDUwOV9TVE9SRV9DVFhfZ2V0X2FwcF9kYXRhXChcKSkgY29sMCBzaCBncgotL0hlbHZldGljYS1OYXJyb3ctaXNvIGZmIDEyMC4wMCBzY2Ygc2YKLTEwOTgwIDY3MDUgbQotZ3MgMSAtMSBzYyAoU1NMX0NUWF9nZXRfY2VydF9zdG9yZVwoXCkpIGNvbDAgc2ggZ3IKLS9IZWx2ZXRpY2EtTmFycm93LWlzbyBmZiAxMjAuMDAgc2NmIHNmCi04MjgwIDUxMzAgbQotZ3MgMSAtMSBzYyAoU1NMX2dldF9hcHBfZGF0YTJcKFwpKSBjb2wwIHNoIGdyCi0vSGVsdmV0aWNhLUJvbGQtaXNvIGZmIDE4MC4wMCBzY2Ygc2YKLTM2NDUgMTYyMCBtCi1ncyAxIC0xIHNjIChTU0xEaXJDb25maWcpIGNvbDAgc2ggZ3IKLS9IZWx2ZXRpY2EtQm9sZC1pc28gZmYgMzAwLjAwIHNjZiBzZgotMTA5MzUgMzY0NSBtCi1ncyAxIC0xIHNjIChPcGVuU1NMKSBjb2wwIHNoIGdyCi0vSGVsdmV0aWNhLUJvbGQtaXNvIGZmIDE4MC4wMCBzY2Ygc2YKLTEwOTM1IDM4MjUgbQotZ3MgMSAtMSBzYyAoW1NTTF0pIGNvbDAgc2ggZ3IKLS9IZWx2ZXRpY2EtQm9sZC1pc28gZmYgMTgwLjAwIHNjZiBzZgotMTEwMjUgNTc2MCBtCi1ncyAxIC0xIHNjIChTU0xfQ0lQSEVSKSBjb2wwIHNoIGdyCi0vSGVsdmV0aWNhLUJvbGQtaXNvIGZmIDE4MC4wMCBzY2Ygc2YKLTEwOTgwIDYxNjUgbQotZ3MgMSAtMSBzYyAoU1NMX1NFU1NJT04pIGNvbDAgc2ggZ3IKLS9IZWx2ZXRpY2EtQm9sZC1pc28gZmYgMzAwLjAwIHNjZiBzZgotMTA3MTAgNzYwNSBtCi1ncyAxIC0xIHNjIChPcGVuU1NMKSBjb2wwIHNoIGdyCi0vSGVsdmV0aWNhLUJvbGQtaXNvIGZmIDE4MC4wMCBzY2Ygc2YKLTEwNTc1IDcxMTAgbQotZ3MgMSAtMSBzYyAoWDUwOV9TVE9SRV9DVFgpIGNvbDAgc2ggZ3IKLS9IZWx2ZXRpY2EtQm9sZC1pc28gZmYgMTgwLjAwIHNjZiBzZgotNjc5NSAyNDMwIG0KLWdzIDEgLTEgc2MgKFNTTE1vZENvbmZpZykgY29sMCBzaCBncgotL0hlbHZldGljYS1Cb2xkLWlzbyBmZiAxODAuMDAgc2NmIHNmCi04ODY1IDI0MzAgbQotZ3MgMSAtMSBzYyAoU1NMU3J2Q29uZmlnKSBjb2wwIHNoIGdyCi0vSGVsdmV0aWNhLUJvbGQtaXNvIGZmIDE4MC4wMCBzY2Ygc2YKLTYzNDUgMzU1NSBtCi1ncyAxIC0xIHNjIChhcF9nbG9iYWxfY3R4KSBjb2wwIHNoIGdyCi0vSGVsdmV0aWNhLUJvbGQtaXNvIGZmIDE4MC4wMCBzY2Ygc2YKLTYzNDUgNDQ1NSBtCi1ncyAxIC0xIHNjIChzZXJ2ZXJfcmVjKSBjb2wwIHNoIGdyCi0vSGVsdmV0aWNhLUJvbGQtaXNvIGZmIDE4MC4wMCBzY2Ygc2YKLTYzNDUgNTM1NSBtCi1ncyAxIC0xIHNjIChjb25uX3JlYykgY29sMCBzaCBncgotL0hlbHZldGljYS1Cb2xkLWlzbyBmZiAxODAuMDAgc2NmIHNmCi05NzIwIDUzNTUgbQotZ3MgMSAtMSBzYyAoU1NMKSBjb2wwIHNoIGdyCi0vSGVsdmV0aWNhLUJvbGQtaXNvIGZmIDE4MC4wMCBzY2Ygc2YKLTEwNjY1IDI0MzAgbQotZ3MgMSAtMSBzYyAoU1NMRGlyQ29uZmlnKSBjb2wwIHNoIGdyCi0vSGVsdmV0aWNhLUJvbGQtaXNvIGZmIDE4MC4wMCBzY2Ygc2YKLTcyOTAgNjI1NSBtCi1ncyAxIC0xIHNjIChCVUZGKSBjb2wwIHNoIGdyCi0vSGVsdmV0aWNhLUJvbGQtaXNvIGZmIDE4MC4wMCBzY2Ygc2YKLTExMDI1IDUzNTUgbQotZ3MgMSAtMSBzYyAoU1NMX01FVEhPRCkgY29sMCBzaCBncgotJSBQb2x5bGluZQotMTUuMDAwIHNsdwotbiA3NTAgMjI1IG0gNDUwIDIyNSA0NTAgODI1MCAzMDAgYXJjdG8gNCB7cG9wfSByZXBlYXQKLSAgNDUwIDg1NTAgMTIzMDAgODU1MCAzMDAgYXJjdG8gNCB7cG9wfSByZXBlYXQKLSAgMTI2MDAgODU1MCAxMjYwMCA1MjUgMzAwIGFyY3RvIDQge3BvcH0gcmVwZWF0Ci0gIDEyNjAwIDIyNSA3NTAgMjI1IDMwMCBhcmN0byA0IHtwb3B9IHJlcGVhdAotIGNwIGdzIGNvbDAgcyBnciAKLS9IZWx2ZXRpY2EtQm9sZC1pc28gZmYgMTgwLjAwIHNjZiBzZgotMTE0NzUgNDQ1NSBtCi1ncyAxIC0xIHNjIChTU0xfQ1RYKSBjb2wwIHNoIGdyCi0vSGVsdmV0aWNhLUJvbGQtaXNvIGZmIDE4MC4wMCBzY2Ygc2YKLTgwMTAgNDk1MCBtCi1ncyAxIC0xIHNjIChyZXF1ZXN0X3JlYykgY29sMCBzaCBncgotL1RpbWVzLVJvbWFuLWlzbyBmZiAxODAuMDAgc2NmIHNmCi0xMDU3NSA2NzUgbQotZ3MgMSAtMSBzYyAoUmFsZiBTLiBFbmdlbHNjaGFsbCkgY29sMCBzaCBncgotL0hlbHZldGljYS1Cb2xkLWlzbyBmZiAzMDAuMDAgc2NmIHNmCi00Mjc1IDY3NSBtCi1ncyAxIC0xIHNjIChBcGFjaGUrbW9kX3NzbCtPcGVuU1NMKSBjb2wwIHNoIGdyCi0vVGltZXMtUm9tYW4taXNvIGZmIDE1MC4wMCBzY2Ygc2YKLTEwNTc1IDg1NSBtCi1ncyAxIC0xIHNjIChyc2VAZW5nZWxzY2hhbGwuY29tKSBjb2wwIHNoIGdyCi0vVGltZXMtUm9tYW4taXNvIGZmIDE1MC4wMCBzY2Ygc2YKLTEwNTc1IDEwMzUgbQotZ3MgMSAtMSBzYyAod3d3LmVuZ2Vsc2NoYWxsLmNvbSkgY29sMCBzaCBncgotL1RpbWVzLVJvbWFuLWlzbyBmZiAxODAuMDAgc2NmIHNmCi05MDAgNjc1IG0KLWdzIDEgLTEgc2MgKFZlcnNpb24gMS4zKSBjb2wwIHNoIGdyCi0vVGltZXMtUm9tYW4taXNvIGZmIDE4MC4wMCBzY2Ygc2YKLTkwMCA4NTUgbQotZ3MgMSAtMSBzYyAoMTItQXByLTE5OTkpIGNvbDAgc2ggZ3IKLS9IZWx2ZXRpY2EtQm9sZC1pc28gZmYgMzYwLjAwIHNjZiBzZgotMzkxNSAxMDgwIG0KLWdzIDEgLTEgc2MgKERhdGEgU3RydWN0dXJlIE92ZXJ2aWV3KSBjb2wwIHNoIGdyCi0vSGVsdmV0aWNhLUJvbGQtaXNvIGZmIDE4MC4wMCBzY2Ygc2YKLTk3MjAgNzExMCBtCi1ncyAxIC0xIHNjIChCSU8pIGNvbDAgc2ggZ3IKLS9IZWx2ZXRpY2EtQm9sZC1pc28gZmYgMTgwLjAwIHNjZiBzZgotMTA3MTAgNzc4NSBtCi1ncyAxIC0xIHNjIChbQ3J5cHRvXSkgY29sMCBzaCBncgotL0hlbHZldGljYS1Cb2xkLWlzbyBmZiAzMDAuMDAgc2NmIHNmCi04NzMwIDM0NjUgbQotZ3MgMSAtMSBzYyAobW9kX3NzbCkgY29sMCBzaCBncgotL0hlbHZldGljYS1Cb2xkLWlzbyBmZiAzMDAuMDAgc2NmIHNmCi04MTQ1IDY3NTAgbQotZ3MgMSAtMSBzYyAoQXBhY2hlKSBjb2wwIHNoIGdyCi0vSGVsdmV0aWNhLUJvbGQtaXNvIGZmIDMwMC4wMCBzY2Ygc2YKLTkwMDAgODEwMCBtCi1ncyAxIC0xIHNjIChDaGFpbmluZykgY29sMCBzaCBncgotL0hlbHZldGljYS1Cb2xkLWlzbyBmZiAzMDAuMDAgc2NmIHNmCi0yNzQ1IDgxMDAgbQotZ3MgMSAtMSBzYyAoTGlmZXRpbWUpIGNvbDAgc2ggZ3IKLS9IZWx2ZXRpY2EtQm9sZC1pc28gZmYgMTgwLjAwIHNjZiBzZgotODEwIDYyNTUgbQotZ3MgMSAtMSBzYyAoYXBfZ2xvYmFsX2N0eCkgY29sMCBzaCBncgotL0hlbHZldGljYS1Cb2xkLWlzbyBmZiAxODAuMDAgc2NmIHNmCi05OTAgNTgwNSBtCi1ncyAxIC0xIHNjIChTU0xNb2RDb25maWcpIGNvbDAgc2ggZ3IKLS9IZWx2ZXRpY2EtQm9sZC1pc28gZmYgMTgwLjAwIHNjZiBzZgotNDA1MCA0NDU1IG0KLWdzIDEgLTEgc2MgKFNTTF9DVFgpIGNvbDAgc2ggZ3IKLS9IZWx2ZXRpY2EtQm9sZC1pc28gZmYgMTgwLjAwIHNjZiBzZgotNDQ1NSA1MzU1IG0KLWdzIDEgLTEgc2MgKHNlcnZlcl9yZWMpIGNvbDAgc2ggZ3IKLS9IZWx2ZXRpY2EtQm9sZC1pc28gZmYgMTgwLjAwIHNjZiBzZgotMzg3MCA0OTA1IG0KLWdzIDEgLTEgc2MgKFNTTFNydkNvbmZpZykgY29sMCBzaCBncgotL0hlbHZldGljYS1Cb2xkLWlzbyBmZiAxODAuMDAgc2NmIHNmCi0xODQ1IDQwMDUgbQotZ3MgMSAtMSBzYyAoQlVGRikgY29sMCBzaCBncgotL0hlbHZldGljYS1Cb2xkLWlzbyBmZiAxODAuMDAgc2NmIHNmCi0yMDcwIDM1NTUgbQotZ3MgMSAtMSBzYyAoY29ubl9yZWMpIGNvbDAgc2ggZ3IKLS9IZWx2ZXRpY2EtQm9sZC1pc28gZmYgMTgwLjAwIHNjZiBzZgotMjI5NSAzMTA1IG0KLWdzIDEgLTEgc2MgKEJJTykgY29sMCBzaCBncgotL0hlbHZldGljYS1Cb2xkLWlzbyBmZiAxODAuMDAgc2NmIHNmCi0yNTY1IDI2NTUgbQotZ3MgMSAtMSBzYyAoU1NMKSBjb2wwIHNoIGdyCi0vSGVsdmV0aWNhLUJvbGQtaXNvIGZmIDE4MC4wMCBzY2Ygc2YKLTM5MTUgMjA3MCBtCi1ncyAxIC0xIHNjIChyZXF1ZXN0X3JlYykgY29sMCBzaCBncgotJEYycHNFbmQKLXJzCi1zaG93cGFnZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zc2wvY29uZmlnLm00IGIvbW9kdWxlcy9zc2wvY29uZmlnLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWVlZmQ3Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvc3NsL2NvbmZpZy5tNAorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi1kbmwgIyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCAjIyBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi1kbmwgIyMgIAotZG5sICMjIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLWRubCAjIyByZXNlcnZlZC4KLWRubCAjIwotZG5sICMjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotZG5sICMjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotZG5sICMjIGFyZSBtZXQ6Ci1kbmwgIyMKLWRubCAjIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotZG5sICMjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLWRubCAjIwotZG5sICMjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci1kbmwgIyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi1kbmwgIyMgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotZG5sICMjICAgIGRpc3RyaWJ1dGlvbi4KLWRubCAjIwotZG5sICMjIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotZG5sICMjICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci1kbmwgIyMgICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi1kbmwgIyMgICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi1kbmwgIyMgICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotZG5sICMjICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi1kbmwgIyMKLWRubCAjIyA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotZG5sICMjICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotZG5sICMjICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotZG5sICMjICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotZG5sICMjCi1kbmwgIyMgNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi1kbmwgIyMgICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi1kbmwgIyMgICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi1kbmwgIyMKLWRubCAjIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi1kbmwgIyMgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLWRubCAjIyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotZG5sICMjIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLWRubCAjIyBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi1kbmwgIyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotZG5sICMjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLWRubCAjIyBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi1kbmwgIyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi1kbmwgIyMgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi1kbmwgIyMgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi1kbmwgIyMgU1VDSCBEQU1BR0UuCi1kbmwgIyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotZG5sICMgIHN0YXJ0IG9mIG1vZHVsZSBzcGVjaWZpYyBwYXJ0Ci1BUEFDSEVfTU9EUEFUSF9JTklUKHNzbCkKLQotZG5sICMgIGxpc3Qgb2YgbW9kdWxlIG9iamVjdCBmaWxlcwotc3NsX29ianM9Im1vZF9zc2wubG8iCi1zc2xfb2Jqcz0iJHNzbF9vYmpzIHNzbF9lbmdpbmVfY29uZmlnLmxvIgotCi1kbmwgIyAgaG9vayBtb2R1bGUgaW50byB0aGUgQXV0b2NvbmYgbWVjaGFuaXNtICgtLWVuYWJsZS1zc2wgb3B0aW9uKQotQVBBQ0hFX01PRFVMRShzc2wsIFtTU0wvVExTIHN1cHBvcnQgKG1vZF9zc2wpXSwgJHNzbF9vYmpzLCAsIG5vLCBbCi0KLSAgICBkbmwgIyAgaG9vayBpbnRvIEF1dG9jb25mIG1lY2hhbmlzbSAoLS13aXRoLXNzbFs9RElSXSBvcHRpb24pCi0gICAgQUNfTVNHX0NIRUNLSU5HKGZvciBTU0wvVExTIHRvb2xraXQgYmFzZSkKLSAgICBzc2x0a19iYXNlPSJTWVNURU0iCi0gICAgQUNfQVJHX1dJVEgoc3NsLCBbICAtLXdpdGgtc3NsWz1ESVJdICAgICAgICBTU0wvVExTIHRvb2xraXQgKE9wZW5TU0wpXSwgWwotICAgICAgICBpZiB0ZXN0ICIuJHdpdGh2YWwiICE9IC55ZXMgLWEgIi4kd2l0aHZhbCIgIT0gLjsgdGhlbgotICAgICAgICAgICAgc3NsdGtfYmFzZT0iJHdpdGh2YWwiCi0gICAgICAgICAgICBpZiB0ZXN0ICEgLWQgJHNzbHRrX2Jhc2U7IHRoZW4KLSAgICAgICAgICAgICAgICBBQ19NU0dfRVJST1IoW2ludmFsaWQgU1NML1RMUyB0b29sa2l0IGJhc2UgZGlyZWN0b3J5ICRzc2x0a19iYXNlXSkKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgXSkKLSAgICBBQ19NU0dfUkVTVUxUKCRzc2x0a19iYXNlKQotICAgIAotICAgIGRubCAjICAgZGV0ZXJtaW5lIFNTTC9UTFMgdG9vbGtpdCBmcm9udGVuZCAob3BlbnNzbCBiaW5hcnkpCi0gICAgQUNfTVNHX0NIRUNLSU5HKGZvciBTU0wvVExTIHRvb2xraXQgZnJvbnRlbmQpCi0gICAgc3NsdGtfZnJvbnRlbmQ9IiIKLSAgICBpZiB0ZXN0ICIuJHNzbHRrX2Jhc2UiID0gLlNZU1RFTTsgdGhlbgotICAgICAgICBmb3IgcCBpbiAuIGBlY2hvICRQQVRIIHwgc2VkIC1lICdzLzovIC9nJ2A7IGRvCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICIkcC9vcGVuc3NsIjsgdGhlbgotICAgICAgICAgICAgICAgIHNzbHRrX2Zyb250ZW5kPSIkcC9vcGVuc3NsIgotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBmaQotICAgICAgICBkb25lCi0gICAgICAgIGlmIHRlc3QgIi4kc3NsdGtfZnJvbnRlbmQiID0gLjsgdGhlbgotICAgICAgICAgICAgQUNfTVNHX0VSUk9SKFsnb3BlbnNzbCcgbm90IGZvdW5kIGluICRQQVRIXSkKLSAgICAgICAgZmkKLSAgICBlbHNlCi0gICAgICAgIGlmIHRlc3QgLWYgIiRzc2x0a19iYXNlL2Jpbi9vcGVuc3NsIjsgdGhlbgotICAgICAgICAgICAgc3NsdGtfZnJvbnRlbmQ9IiRzc2x0a19iYXNlL2Jpbi9vcGVuc3NsIgotICAgICAgICBlbHNlCi0gICAgICAgICAgICBBQ19NU0dfRVJST1IoWydvcGVuc3NsJyBub3QgZm91bmQgaW4gJHNzbHRrX2Jhc2UvYmluL10pCi0gICAgICAgIGZpCi0gICAgZmkKLSAgICBBQ19NU0dfUkVTVUxUKCRzc2x0a19mcm9udGVuZCkKLQotICAgIGRubCAjICAgZGV0ZXJtaW5lIFNTTC9UTFMgdG9vbGtpdCB2ZXJzaW9uCi0gICAgQUNfTVNHX0NIRUNLSU5HKGZvciBTU0wvVExTIHRvb2xraXQgdmVyc2lvbikKLSAgICBzc2x0a192ZXJzaW9uPSJgJHNzbHRrX2Zyb250ZW5kIHZlcnNpb25gIgotICAgIGNhc2UgIiRzc2x0a192ZXJzaW9uIiBpbgotICAgICAgICAqMC45LltbNjc4OV1dKiApIDs7Ci0gICAgICAgICogKSBBQ19NU0dfRVJST1IoW1NTTC9UTFMgdG9vbGtpdCB2ZXJzaW9uICRzc2x0a192ZXJzaW9uIG5vdCBzdXBwb3J0ZWRdKSA7OwotICAgIGVzYWMKLSAgICBBQ19NU0dfUkVTVUxUKCRzc2x0a192ZXJzaW9uKQotCi0gICAgZG5sICMgICBkZXRlcm1pbmUgU1NML1RMUyB0b29sa2l0IGluY2x1ZGUgZGlyZWN0b3J5Ci0gICAgQUNfTVNHX0NIRUNLSU5HKGZvciBTU0wvVExTIHRvb2xraXQgaW5jbHVkZXMpCi0gICAgc3NsdGtfaW5jZGlyPSIiCi0gICAgaWYgdGVzdCAiLiRzc2x0a19iYXNlIiA9IC5TWVNURU07IHRoZW4KLSAgICAgICAgZm9yIHAgaW4gLiAvdXNyL2luY2x1ZGUgL3Vzci9pbmNsdWRlL3NzbC8gL3Vzci9sb2NhbC9pbmNsdWRlIC91c3IvbG9jYWwvaW5jbHVkZS9zc2w7IGRvCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICIkcC9vcGVuc3NsL3NzbC5oIjsgdGhlbgotICAgICAgICAgICAgICAgIHNzbHRrX2luY2Rpcj0iJHAiCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGRvbmUKLSAgICAgICAgaWYgdGVzdCAiLiRzc2x0a19pbmNkaXIiID0gLjsgdGhlbgotICAgICAgICAgICAgQUNfTVNHX0VSUk9SKFtPcGVuU1NMIGhlYWRlcnMgbm90IGZvdW5kXSkKLSAgICAgICAgZmkKLSAgICBlbHNlCi0gICAgICAgIGlmIHRlc3QgLWYgIiRzc2x0a19iYXNlL2luY2x1ZGUvb3BlbnNzbC9zc2wuaCI7IHRoZW4KLSAgICAgICAgICAgIHNzbHRrX2luY2Rpcj0iJHNzbHRrX2Jhc2UvaW5jbHVkZSIKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgQUNfTVNHX0VSUk9SKFtPcGVuU1NMIGhlYWRlcnMgbm90IGZvdW5kIHVuZGVyICRzc2x0a19iYXNlXSkKLSAgICAgICAgZmkKLSAgICBmaQotICAgIEFDX01TR19SRVNVTFQoJHNzbHRrX2luY2RpcikKLQotICAgIGRubCAjICAgZGV0ZXJtaW5lIFNTTC9UTFMgdG9vbGtpdCBsaWJyYXJ5IGRpcmVjdG9yeQotICAgIEFDX01TR19DSEVDS0lORyhmb3IgU1NML1RMUyB0b29sa2l0IGxpYnJhcmllcykKLSAgICBzc2x0a19saWJkaXI9IiIKLSAgICBpZiB0ZXN0ICIuJHNzbHRrX2Jhc2UiID0gLlNZU1RFTTsgdGhlbgotICAgICAgICBmb3IgcCBpbiAuIC9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWI7IGRvCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICIkcC9saWJzc2wuYSIgLW8gLWYgIiRwL2xpYnNzbC5zbyI7IHRoZW4KLSAgICAgICAgICAgICAgICBzc2x0a19saWJkaXI9IiRwIgotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBmaQotICAgICAgICBkb25lCi0gICAgICAgIGlmIHRlc3QgIi4kc3NsdGtfbGliZGlyIiA9IC47IHRoZW4KLSAgICAgICAgICAgIEFDX01TR19FUlJPUihbT3BlblNTTCBsaWJyYXJpZXMgbm90IGZvdW5kXSkKLSAgICAgICAgZmkKLSAgICBlbHNlCi0gICAgICAgIGlmIHRlc3QgLWYgIiRzc2x0a19iYXNlL2xpYnNzbC5hIiAtbyAtZiAiJHNzbHRrX2Jhc2UvbGlic3NsLnNvIjsgdGhlbgotICAgICAgICAgICAgc3NsdGtfbGliZGlyPSIkc3NsdGtfYmFzZSIKLSAgICAgICAgZWxpZiB0ZXN0IC1mICIkc3NsdGtfYmFzZS9saWIvbGlic3NsLmEiIC1vIC1mICIkc3NsdGtfYmFzZS9saWIvbGlic3NsLnNvIjsgdGhlbgotICAgICAgICAgICAgc3NsdGtfbGliZGlyPSIkc3NsdGtfYmFzZS9saWIiCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEFDX01TR19FUlJPUihbT3BlblNTTCBsaWJyYXJpZXMgbm90IGZvdW5kIHVuZGVyICRzc2x0a19iYXNlXSkKLSAgICAgICAgZmkKLSAgICBmaQotICAgIEFDX01TR19SRVNVTFQoJHNzbHRrX2xpYmRpcikKLQotICAgIGRubCAjICBhbm5vdGF0ZSB0aGUgQXBhY2hlIGJ1aWxkIGVudmlyb25tZW50IHdpdGggZGV0ZXJtaW5lZCBpbmZvcm1hdGlvbgotICAgIGlmIHRlc3QgIi4kc3NsdGtfaW5jZGlyIiAhPSAiLi91c3IvaW5jbHVkZSI7IHRoZW4KLSAgICAgICAgSU5DTFVERVM9IiRJTkNMVURFUyAtSSRzc2x0a19pbmNkaXIiCi0gICAgZmkKLSAgICBpZiB0ZXN0ICIuJHNzbHRrX2xpYmRpciIgIT0gIi4vdXNyL2xpYiI7IHRoZW4KLSAgICAgICAgTElCUz0iJExJQlMgLUwkc3NsdGtfbGliZGlyIC1sc3NsIC1sY3J5cHRvIgotICAgIGZpCi1dKQotCi1kbmwgIyAgZW5kIG9mIG1vZHVsZSBzcGVjaWZpYyBwYXJ0Ci1BUEFDSEVfTU9EUEFUSF9GSU5JU0gKLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zc2wvbW9kX3NzbC5jIGIvbW9kdWxlcy9zc2wvbW9kX3NzbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDFiNWUxLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvc3NsL21vZF9zc2wuYworKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKiAgICAgICAgICAgICAgICAgICAgICBfICAgICAgICAgICAgIF8KLSoqICBfIF9fIF9fXyAgIF9fXyAgIF9ffCB8ICAgIF9fXyBfX198IHwgIG1vZF9zc2wKLSoqIHwgJ18gYCBfIFwgLyBfIFwgLyBfYCB8ICAgLyBfXy8gX198IHwgIEFwYWNoZSBJbnRlcmZhY2UgdG8gT3BlblNTTAotKiogfCB8IHwgfCB8IHwgKF8pIHwgKF98IHwgICBcX18gXF9fIFwgfCAgd3d3Lm1vZHNzbC5vcmcKLSoqIHxffCB8X3wgfF98XF9fXy8gXF9fLF98X19ffF9fXy9fX18vX3wgIGZ0cC5tb2Rzc2wub3JnCi0qKiAgICAgICAgICAgICAgICAgICAgICB8X19fX198Ci0qKiAgbW9kX3NzbC5jCi0qKiAgQXBhY2hlIEFQSSBpbnRlcmZhY2Ugc3RydWN0dXJlcwotKi8KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAxIFJhbGYgUy4gRW5nZWxzY2hhbGwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci0gKiAgICAgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGVuZ2Vsc2NoYWxsLmNvbT4gZm9yIHVzZSBpbiB0aGUKLSAqICAgICBtb2Rfc3NsIHByb2plY3QgKGh0dHA6Ly93d3cubW9kc3NsLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIm1vZF9zc2wiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICByc2VAZW5nZWxzY2hhbGwuY29tLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJtb2Rfc3NsIgotICogICAgbm9yIG1heSAibW9kX3NzbCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3IKLSAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBSYWxmIFMuIEVuZ2Vsc2NoYWxsLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLSAqICAgICBSYWxmIFMuIEVuZ2Vsc2NoYWxsIDxyc2VAZW5nZWxzY2hhbGwuY29tPiBmb3IgdXNlIGluIHRoZQotICogICAgIG1vZF9zc2wgcHJvamVjdCAoaHR0cDovL3d3dy5tb2Rzc2wub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgUkFMRiBTLiBFTkdFTFNDSEFMTCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgUkFMRiBTLiBFTkdFTFNDSEFMTCBPUgotICogSElTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGBgSSdsbCBiZSBzdXJwcmlzZWQgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcnMgdGhpbmsgdGhhdCB3aGF0IHlvdQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBkb2luZyBpcyBob25vdXJhYmxlLicnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBCZW4gTGF1cmllLCBBcGFjaGUtU1NMIGF1dGhvciAqLwotI2luY2x1ZGUgIm1vZF9zc2wuaCIKLQotLyogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogIEFwYWNoZSBBUEkgZ2x1ZSBzdHJ1Y3R1cmVzCi0qKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSovCi0KLS8qCi0gKiAgaWRlbnRpZnkgdGhlIG1vZHVsZSB0byBTQ0NTIGB3aGF0JyBhbmQgUkNTIGBpZGVudCcgY29tbWFuZHMKLSAqLwotc3RhdGljIGNoYXIgY29uc3Qgc2Njc2lkW10gPSAiQCgjKSBtb2Rfc3NsLyIgTU9EX1NTTF9WRVJTSU9OICIgPiI7Ci1zdGF0aWMgY2hhciBjb25zdCByY3NpZFtdICA9ICIkSWQ6IG1vZF9zc2wuYyx2IDEuMSAyMDAxLzA1LzA0IDIxOjU0OjQyIHJzZSBFeHAgJCI7Ci0KLS8qCi0gKiAgdGhlIHRhYmxlIG9mIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcyB3ZSBwcm92aWRlCi0gKi8KLXN0YXRpYyBjb21tYW5kX3JlYyBzc2xfY29uZmlnX2NtZHNbXSA9IHsKLSAgICAvKgotICAgICAqIEdsb2JhbCAobWFpbi1zZXJ2ZXIpIGNvbnRleHQgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzCi0gICAgICovCi0gICAgQVBfU1JWX0NNRChNdXRleCwgVEFLRTEsCi0gICAgICAgICAgICAgICAiU1NMIGxvY2sgZm9yIGhhbmRsaW5nIGludGVybmFsIG11dHVhbCBleGNsdXNpb25zICIKLSAgICAgICAgICAgICAgICIoYG5vbmUnLCBgZmlsZTovcGF0aC90by9maWxlJykiKQotICAgIEFQX1NSVl9DTUQoUGFzc1BocmFzZURpYWxvZywgVEFLRTEsCi0gICAgICAgICAgICAgICAiU1NMIGRpYWxvZyBtZWNoYW5pc20gZm9yIHRoZSBwYXNzIHBocmFzZSBxdWVyeSAiCi0gICAgICAgICAgICAgICAiKGBidWlsdGluJywgYGV4ZWM6L3BhdGgvdG8vcHJvZ3JhbScpIikKLSAgICBBUF9TUlZfQ01EKFNlc3Npb25DYWNoZSwgVEFLRTEsCi0gICAgICAgICAgICAgICAiU1NMIFNlc3Npb24gQ2FjaGUgc3RvcmFnZSAiCi0gICAgICAgICAgICAgICAiKGBub25lJywgYGRibTovcGF0aC90by9maWxlJykiKQotI2lmZGVmIFNTTF9FWFBFUklNRU5UQUxfRU5HSU5FCi0gICAgQVBfU1JWX0NNRChDcnlwdG9EZXZpY2UsIFRBS0UxLAotICAgICAgICAgICAgICAgIlNTTCBleHRlcm5hbCBDcnlwdG8gRGV2aWNlIHVzYWdlICIKLSAgICAgICAgICAgICAgICIoYGJ1aWx0aW4nLCBgLi4uJykiKQotI2VuZGlmCi0gICAgQVBfU1JWX0NNRChSYW5kb21TZWVkLCBUQUtFMjMsCi0gICAgICAgICAgICAgICAiU1NMIFBzZXVkbyBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciAoUFJORykgc2VlZGluZyBzb3VyY2UgIgotICAgICAgICAgICAgICAgIihgc3RhcnR1cHxjb25uZWN0IGJ1aWx0aW58ZmlsZTovcGF0aHxleGVjOi9wYXRoIFtieXRlc10nKSIpCi0KLSAgICAvKgotICAgICAqIFBlci1zZXJ2ZXIgY29udGV4dCBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMKLSAgICAgKi8KLSAgICBBUF9TUlZfQ01EKEVuZ2luZSwgRkxBRywKLSAgICAgICAgICAgICAgICJTU0wgc3dpdGNoIGZvciB0aGUgcHJvdG9jb2wgZW5naW5lICIKLSAgICAgICAgICAgICAgICIoYG9uJywgYG9mZicpIikKLSAgICBBUF9BTExfQ01EKENpcGhlclN1aXRlLCBUQUtFMSwKLSAgICAgICAgICAgICAgICJDb2xvbi1kZWxpbWl0ZWQgbGlzdCBvZiBwZXJtaXR0ZWQgU1NMIENpcGhlcnMgIgotICAgICAgICAgICAgICAgIihgWFhYOi4uLjpYWFgnIC0gc2VlIG1hbnVhbCkiKQotICAgIEFQX1NSVl9DTUQoQ2VydGlmaWNhdGVGaWxlLCBUQUtFMSwKLSAgICAgICAgICAgICAgICJTU0wgU2VydmVyIENlcnRpZmljYXRlIGZpbGUgIgotICAgICAgICAgICAgICAgIihgL3BhdGgvdG8vZmlsZScgLSBQRU0gb3IgREVSIGVuY29kZWQpIikKLSAgICBBUF9TUlZfQ01EKENlcnRpZmljYXRlS2V5RmlsZSwgVEFLRTEsCi0gICAgICAgICAgICAgICAiU1NMIFNlcnZlciBQcml2YXRlIEtleSBmaWxlICIKLSAgICAgICAgICAgICAgICIoYC9wYXRoL3RvL2ZpbGUnIC0gUEVNIG9yIERFUiBlbmNvZGVkKSIpCi0gICAgQVBfU1JWX0NNRChDZXJ0aWZpY2F0ZUNoYWluRmlsZSwgVEFLRTEsCi0gICAgICAgICAgICAgICAiU1NMIFNlcnZlciBDQSBDZXJ0aWZpY2F0ZSBDaGFpbiBmaWxlICIKLSAgICAgICAgICAgICAgICIoYC9wYXRoL3RvL2ZpbGUnIC0gUEVNIGVuY29kZWQpIikKLSNpZmRlZiBTU0xfRVhQRVJJTUVOVEFMX1BFUkRJUkNBCi0gICAgQVBfQUxMX0NNRChDQUNlcnRpZmljYXRlUGF0aCwgVEFLRTEsCi0gICAgICAgICAgICAgICAiU1NMIENBIENlcnRpZmljYXRlIHBhdGggIgotICAgICAgICAgICAgICAgIihgL3BhdGgvdG8vZGlyJyAtIGNvbnRhaW5zIFBFTSBlbmNvZGVkIGZpbGVzKSIpCi0gICAgQVBfQUxMX0NNRChDQUNlcnRpZmljYXRlRmlsZSwgVEFLRTEsCi0gICAgICAgICAgICAgICAiU1NMIENBIENlcnRpZmljYXRlIGZpbGUgIgotICAgICAgICAgICAgICAgIihgL3BhdGgvdG8vZmlsZScgLSBQRU0gZW5jb2RlZCkiKQotI2Vsc2UKLSAgICBBUF9TUlZfQ01EKENBQ2VydGlmaWNhdGVQYXRoLCBUQUtFMSwKLSAgICAgICAgICAgICAgICJTU0wgQ0EgQ2VydGlmaWNhdGUgcGF0aCAiCi0gICAgICAgICAgICAgICAiKGAvcGF0aC90by9kaXInIC0gY29udGFpbnMgUEVNIGVuY29kZWQgZmlsZXMpIikKLSAgICBBUF9TUlZfQ01EKENBQ2VydGlmaWNhdGVGaWxlLCBUQUtFMSwKLSAgICAgICAgICAgICAgICJTU0wgQ0EgQ2VydGlmaWNhdGUgZmlsZSAiCi0gICAgICAgICAgICAgICAiKGAvcGF0aC90by9maWxlJyAtIFBFTSBlbmNvZGVkKSIpCi0jZW5kaWYKLSAgICBBUF9TUlZfQ01EKENBUmV2b2NhdGlvblBhdGgsIFRBS0UxLAotICAgICAgICAgICAgICAgIlNTTCBDQSBDZXJ0aWZpY2F0ZSBSZXZvY2F0aW9uIExpc3QgKENSTCkgcGF0aCAiCi0gICAgICAgICAgICAgICAiKGAvcGF0aC90by9kaXInIC0gY29udGFpbnMgUEVNIGVuY29kZWQgZmlsZXMpIikKLSAgICBBUF9TUlZfQ01EKENBUmV2b2NhdGlvbkZpbGUsIFRBS0UxLAotICAgICAgICAgICAgICAgIlNTTCBDQSBDZXJ0aWZpY2F0ZSBSZXZvY2F0aW9uIExpc3QgKENSTCkgZmlsZSAiCi0gICAgICAgICAgICAgICAiKGAvcGF0aC90by9maWxlJyAtIFBFTSBlbmNvZGVkKSIpCi0gICAgQVBfQUxMX0NNRChWZXJpZnlDbGllbnQsIFRBS0UxLAotICAgICAgICAgICAgICAgIlNTTCBDbGllbnQgdmVyaWZ5IHR5cGUgIgotICAgICAgICAgICAgICAgIihgbm9uZScsIGBvcHRpb25hbCcsIGByZXF1aXJlJywgYG9wdGlvbmFsX25vX2NhJykiKQotICAgIEFQX0FMTF9DTUQoVmVyaWZ5RGVwdGgsIFRBS0UxLAotICAgICAgICAgICAgICAgIlNTTCBDbGllbnQgdmVyaWZ5IGRlcHRoICIKLSAgICAgICAgICAgICAgICIoYE4nIC0gbnVtYmVyIG9mIGludGVybWVkaWF0ZSBjZXJ0aWZpY2F0ZXMpIikKLSAgICBBUF9TUlZfQ01EKFNlc3Npb25DYWNoZVRpbWVvdXQsIFRBS0UxLAotICAgICAgICAgICAgICAgIlNTTCBTZXNzaW9uIENhY2hlIG9iamVjdCBsaWZldGltZSAiCi0gICAgICAgICAgICAgICAiKGBOJyAtIG51bWJlciBvZiBzZWNvbmRzKSIpCi0gICAgQVBfU1JWX0NNRChMb2csIFRBS0UxLAotICAgICAgICAgICAgICAgIlNTTCBsb2dmaWxlIGZvciBTU0wtcmVsYXRlZCBtZXNzYWdlcyAiCi0gICAgICAgICAgICAgICAiKGAvcGF0aC90by9maWxlJywgYHwvcGF0aC90by9wcm9ncmFtJykiKQotICAgIEFQX1NSVl9DTUQoTG9nTGV2ZWwsIFRBS0UxLAotICAgICAgICAgICAgICAgIlNTTCBsb2dmaWxlIHZlcmJvc2l0eSBsZXZlbCAiCi0gICAgICAgICAgICAgICAiKGBub25lJywgYGVycm9yJywgYHdhcm4nLCBgaW5mbycsIGBkZWJ1ZycpIikKLSAgICBBUF9TUlZfQ01EKFByb3RvY29sLCBSQVdfQVJHUywKLSAgICAgICAgICAgICAgICJFbmFibGUgb3IgZGlzYWJsZSB2YXJpb3VzIFNTTCBwcm90b2NvbHMiCi0gICAgICAgICAgICAgICAiKGBbKy1dW1NTTHYyfFNTTHYzfFRMU3YxXSAuLi4nIC0gc2VlIG1hbnVhbCkiKQotCi0jaWZkZWYgU1NMX0VYUEVSSU1FTlRBTF9QUk9YWQotICAgIC8qIAotICAgICAqIFByb3h5IGNvbmZpZ3VyYXRpb24gZm9yIHJlbW90ZSBTU0wgY29ubmVjdGlvbnMKLSAgICAgKi8KLSAgICBBUF9TUlZfQ01EKFByb3h5UHJvdG9jb2wsIFJBV19BUkdTLAotICAgICAgICAgICAgICAgIlNTTCBQcm94eTogZW5hYmxlIG9yIGRpc2FibGUgU1NMIHByb3RvY29sIGZsYXZvcnMgIgotICAgICAgICAgICAgICAgIihgWystXVtTU0x2MnxTU0x2M3xUTFN2MV0gLi4uJyAtIHNlZSBtYW51YWwpIikKLSAgICBBUF9TUlZfQ01EKFByb3h5Q2lwaGVyU3VpdGUsIFRBS0UxLAotICAgICAgICAgICAgICAgIlNTTCBQcm94eTogY29sb24tZGVsaW1pdGVkIGxpc3Qgb2YgcGVybWl0dGVkIFNTTCBjaXBoZXJzICIKLSAgICAgICAgICAgICAgICIoYFhYWDouLi46WFhYJyAtIHNlZSBtYW51YWwpIikKLSAgICBBUF9TUlZfQ01EKFByb3h5VmVyaWZ5LCBGTEFHLAotICAgICAgICAgICAgICAgIlNTTCBQcm94eTogd2hldGhlciB0byB2ZXJpZnkgdGhlIHJlbW90ZSBjZXJ0aWZpY2F0ZSAiCi0gICAgICAgICAgICAgICAiKGBvbicgb3IgYG9mZicpIikKLSAgICBBUF9TUlZfQ01EKFByb3h5VmVyaWZ5RGVwdGgsIFRBS0UxLAotICAgICAgICAgICAgICAgIlNTTCBQcm94eTogbWF4aW11bSBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gZGVwdGggIgotICAgICAgICAgICAgICAgIihgTicgLSBudW1iZXIgb2YgaW50ZXJtZWRpYXRlIGNlcnRpZmljYXRlcykiKQotICAgIEFQX1NSVl9DTUQoUHJveHlDQUNlcnRpZmljYXRlRmlsZSwgVEFLRTEsCi0gICAgICAgICAgICAgICAiU1NMIFByb3h5OiBmaWxlIGNvbnRhaW5pbmcgc2VydmVyIGNlcnRpZmljYXRlcyAiCi0gICAgICAgICAgICAgICAiKGAvcGF0aC90by9maWxlJyAtIFBFTSBlbmNvZGVkIGNlcnRpZmljYXRlcykiKQotICAgIEFQX1NSVl9DTUQoUHJveHlDQUNlcnRpZmljYXRlUGF0aCwgVEFLRTEsCi0gICAgICAgICAgICAgICAiU1NMIFByb3h5OiBkaXJlY3RvcnkgY29udGFpbmluZyBzZXJ2ZXIgY2VydGlmaWNhdGVzICIKLSAgICAgICAgICAgICAgICIoYC9wYXRoL3RvL2RpcicgLSBjb250YWlucyBQRU0gZW5jb2RlZCBjZXJ0aWZpY2F0ZXMpIikKLSAgICBBUF9TUlZfQ01EKFByb3h5TWFjaGluZUNlcnRpZmljYXRlRmlsZSwgVEFLRTEsCi0gICAgICAgICAgICAgICAiU1NMIFByb3h5OiBmaWxlIGNvbnRhaW5pbmcgY2xpZW50IGNlcnRpZmljYXRlcyAiCi0gICAgICAgICAgICAgICAiKGAvcGF0aC90by9maWxlJyAtIFBFTSBlbmNvZGVkIGNlcnRpZmljYXRlcykiKQotICAgIEFQX1NSVl9DTUQoUHJveHlNYWNoaW5lQ2VydGlmaWNhdGVQYXRoLCBUQUtFMSwKLSAgICAgICAgICAgICAgICJTU0wgUHJveHk6IGRpcmVjdG9yeSBjb250YWluaW5nIGNsaWVudCBjZXJ0aWZpY2F0ZXMgIgotICAgICAgICAgICAgICAgIihgL3BhdGgvdG8vZGlyJyAtIGNvbnRhaW5zIFBFTSBlbmNvZGVkIGNlcnRpZmljYXRlcykiKQotI2VuZGlmCi0KLSAgICAvKgotICAgICAqIFBlci1kaXJlY3RvcnkgY29udGV4dCBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMKLSAgICAgKi8KLSAgICBBUF9ESVJfQ01EKE9wdGlvbnMsIE9QVElPTlMsIFJBV19BUkdTLAotICAgICAgICAgICAgICAgIlNldCBvbmUgb2YgbW9yZSBvcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGUgU1NMIGVuZ2luZSIKLSAgICAgICAgICAgICAgICIoYFsrLV1vcHRpb25bPXZhbHVlXSAuLi4nIC0gc2VlIG1hbnVhbCkiKQotICAgIEFQX0RJUl9DTUQoUmVxdWlyZVNTTCwgQVVUSENGRywgTk9fQVJHUywKLSAgICAgICAgICAgICAgICJSZXF1aXJlIHRoZSBTU0wgcHJvdG9jb2wgZm9yIHRoZSBwZXItZGlyZWN0b3J5IGNvbnRleHQgIgotICAgICAgICAgICAgICAgIihubyBhcmd1bWVudHMpIikKLSAgICBBUF9ESVJfQ01EKFJlcXVpcmUsIEFVVEhDRkcsIFJBV19BUkdTLAotICAgICAgICAgICAgICAgIlJlcXVpcmUgYSBib29sZWFuIGV4cHJlc2lvbiB0byBldmFsdWF0ZSB0byB0cnVlIGZvciBncmFudGluZyBhY2Nlc3MiCi0gICAgICAgICAgICAgICAiKGFyYml0cmFyeSBjb21wbGV4IGJvb2xlYW4gZXhwcmVzc2lvbiAtIHNlZSBtYW51YWwpIikKLQotICAgIEFQX0VORF9DTUQKLX07Ci0KLXN0YXRpYyBjb25zdCBoYW5kbGVyX3JlYyBzc2xfY29uZmlnX2hhbmRsZXJbXSA9IHsKLSAgICB7ICJtb2Rfc3NsOmNvbnRlbnQtaGFuZGxlciIsIHNzbF9ob29rX0hhbmRsZXIgfSwKLSAgICB7IE5VTEwsIE5VTEwgfQotfTsKLQotLyoKLSAqICB0aGUgbWFpbiBBcGFjaGUgQVBJIGNvbmZpZyBzdHJ1Y3R1cmUKLSAqLwotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIHNzbF9tb2R1bGUgPSB7Ci0gICAgU1RBTkRBUkRfTU9EVUxFX1NUVUZGLAotCi0gICAgLyogU3RhbmRhcmQgQVBJIChhbHdheXMgcHJlc2VudCkgKi8KLQotICAgIHNzbF9pbml0X01vZHVsZSwgICAgICAgICAgLyogbW9kdWxlIGluaXRpYWxpemVyICAgICAgICAgICAgICAgICAgKi8KLSAgICBzc2xfY29uZmlnX3BlcmRpcl9jcmVhdGUsIC8qIGNyZWF0ZSBwZXItZGlyICAgIGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgc3NsX2NvbmZpZ19wZXJkaXJfbWVyZ2UsICAvKiBtZXJnZSAgcGVyLWRpciAgICBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIHNzbF9jb25maWdfc2VydmVyX2NyZWF0ZSwgLyogY3JlYXRlIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgICBzc2xfY29uZmlnX3NlcnZlcl9tZXJnZSwgIC8qIG1lcmdlICBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgc3NsX2NvbmZpZ19jbWRzLCAgICAgICAgICAvKiB0YWJsZSBvZiBjb25maWcgZmlsZSBjb21tYW5kcyAgICAgICAqLwotICAgIHNzbF9jb25maWdfaGFuZGxlciwgICAgICAgLyogWyM4XSBNSU1FLXR5cGVkLWRpc3BhdGNoZWQgaGFuZGxlcnMgKi8KLSAgICBzc2xfaG9va19UcmFuc2xhdGUsICAgICAgIC8qIFsjMV0gVVJJIHRvIGZpbGVuYW1lIHRyYW5zbGF0aW9uICAgICovCi0gICAgc3NsX2hvb2tfQXV0aCwgICAgICAgICAgICAvKiBbIzRdIHZhbGlkYXRlIHVzZXIgaWQgZnJvbSByZXF1ZXN0ICAqLwotICAgIHNzbF9ob29rX1VzZXJDaGVjaywgICAgICAgLyogWyM1XSBjaGVjayBpZiB0aGUgdXNlciBpcyBvayBfaGVyZV8gKi8KLSAgICBzc2xfaG9va19BY2Nlc3MsICAgICAgICAgIC8qIFsjM10gY2hlY2sgYWNjZXNzIGJ5IGhvc3QgYWRkcmVzcyAgICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBbIzZdIGRldGVybWluZSBNSU1FIHR5cGUgICAgICAgICAgICAqLwotICAgIHNzbF9ob29rX0ZpeHVwLCAgICAgICAgICAgLyogWyM3XSBwcmUtcnVuIGZpeHVwcyAgICAgICAgICAgICAgICAgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFsjOV0gbG9nIGEgdHJhbnNhY3Rpb24gICAgICAgICAgICAgICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBbIzJdIGhlYWRlciBwYXJzZXIgICAgICAgICAgICAgICAgICAqLwotICAgIHNzbF9pbml0X0NoaWxkLCAgICAgICAgICAgLyogY2hpbGRfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIGNoaWxkX2V4aXQgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgc3NsX2hvb2tfUmVhZFJlcSwgICAgICAgICAvKiBbIzBdIHBvc3QgcmVhZC1yZXF1ZXN0ICAgICAgICAgICAgICAqLwotCi0gICAgLyogRXh0ZW5kZWQgQVBJIChmb3JjZWQgdG8gYmUgZW5hYmxlZCB3aXRoIG1vZF9zc2wpICovCi0KLSAgICBzc2xfaG9va19BZGRNb2R1bGUsICAgICAgIC8qIGFmdGVyIG1vZHVsZXMgd2FzIGFkZGVkIHRvIGNvcmUgICAgICovCi0gICAgc3NsX2hvb2tfUmVtb3ZlTW9kdWxlLCAgICAvKiBiZWZvcmUgbW9kdWxlIGlzIHJlbW92ZWQgZnJvbSBjb3JlICAqLwotICAgIHNzbF9ob29rX1Jld3JpdGVDb21tYW5kLCAgLyogY29uZmlndXJhdGlvbiBjb21tYW5kIHJld3JpdGluZyAgICAgKi8KLSAgICBzc2xfaG9va19OZXdDb25uZWN0aW9uLCAgIC8qIHNvY2tldCBjb25uZWN0aW9uIG9wZW4gICAgICAgICAgICAgICovCi0gICAgc3NsX2hvb2tfQ2xvc2VDb25uZWN0aW9uICAvKiBzb2NrZXQgY29ubmVjdGlvbiBjbG9zZSAgICAgICAgICAgICAqLwotfTsKLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zc2wvbW9kX3NzbC5kc3AgYi9tb2R1bGVzL3NzbC9tb2Rfc3NsLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFmNDZkZi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL3NzbC9tb2Rfc3NsLmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9Im1vZF9zc2wiIC0gUGFja2FnZSBPd25lcj08ND4KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDAKLSMgKiogRE8gTk9UIEVESVQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDEwMgotCi1DRkc9bW9kX3NzbCAtIFdpbjMyIFJlbGVhc2UKLSFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAibW9kX3NzbC5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIm1vZF9zc2wubWFrIiBDRkc9Im1vZF9zc2wgLSBXaW4zMiBSZWxlYXNlIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgIm1vZF9zc2wgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFICJtb2Rfc3NsIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1NVEw9bWlkbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAibW9kX3NzbCAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0kgIi4uXC4uXGluY2x1ZGUiIC9JICIuLlwuLlxvc1x3aW4zMiIgL0kgIi4uXC4uXHNlcnZlclxtcG1cd2lubnQiIC9JICIuLlwuLlxzcmNsaWJcYXByXGluY2x1ZGUiIC9JICIuLi8uLi9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSIgL0kgIi4uXC4uXHNyY2xpYlxvcGVuc3NsXGluYzMyIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0ZkIlJlbGVhc2VcbW9kX3NzbCIgL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvaW5jcmVtZW50YWw6bm8gL21hcCAvb3V0OiJSZWxlYXNlL21vZF9zc2wuc28iIC9tYWNoaW5lOkkzODYgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2Rfc3NsCi0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIHNzbGVheTMyLmxpYiBsaWJlYXkzMi5saWIgL25vbG9nbyAvbGlicGF0aDoiLi5cLi5cc3JjbGliXG9wZW5zc2xcb3V0MzJkbGwiIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9pbmNyZW1lbnRhbDpubyAvbWFwIC9vdXQ6IlJlbGVhc2UvbW9kX3NzbC5zbyIgL21hY2hpbmU6STM4NiAvYmFzZTpALi5cLi5cb3Ncd2luMzJcQmFzZUFkZHIucmVmLG1vZF9zc2wKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIm1vZF9zc2wgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aSSAvT2QgL0kgIi4uXC4uXGluY2x1ZGUiIC9JICIuLlwuLlxvc1x3aW4zMiIgL0kgIi4uXC4uXHNlcnZlclxtcG1cd2lubnQiIC9JICIuLlwuLlxzcmNsaWJcYXByXGluY2x1ZGUiIC9JICIuLlwuLlxzcmNsaWJcYXByLXV0aWxcaW5jbHVkZSIgL0kgIi4uXC4uXHNyY2xpYlxvcGVuc3NsXGluYzMyIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0ZkIkRlYnVnXG1vZF9zc2wiIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2luY3JlbWVudGFsOm5vIC9tYXAgL2RlYnVnIC9vdXQ6IkRlYnVnL21vZF9zc2wuc28iIC9tYWNoaW5lOkkzODYgL2Jhc2U6QC4uXC4uXG9zXHdpbjMyXEJhc2VBZGRyLnJlZixtb2Rfc3NsCi0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIHNzbGVheTMyLmxpYiBsaWJlYXkzMi5saWIgL25vbG9nbyAvbGlicGF0aDoiLi5cLi5cc3JjbGliXG9wZW5zc2xcb3V0MzJkbGwiIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9pbmNyZW1lbnRhbDpubyAvbWFwIC9kZWJ1ZyAvb3V0OiJEZWJ1Zy9tb2Rfc3NsLnNvIiAvbWFjaGluZTpJMzg2IC9iYXNlOkAuLlwuLlxvc1x3aW4zMlxCYXNlQWRkci5yZWYsbW9kX3NzbAotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAibW9kX3NzbCAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgIm1vZF9zc2wgLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICIqLmMiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZF9zc2wuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cc3NsX2VuZ2luZV9jb25maWcuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cc3NsX2VuZ2luZV9kaC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxzc2xfZW5naW5lX2RzLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHNzbF9lbmdpbmVfZXh0LmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHNzbF9lbmdpbmVfaW5pdC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxzc2xfZW5naW5lX2lvLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHNzbF9lbmdpbmVfa2VybmVsLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHNzbF9lbmdpbmVfbG9nLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHNzbF9lbmdpbmVfbXV0ZXguYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cc3NsX2VuZ2luZV9wcGhyYXNlLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHNzbF9lbmdpbmVfcmFuZC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxzc2xfZW5naW5lX3ZhcnMuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cc3NsX2V4cHIuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cc3NsX2V4cHJfZXZhbC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxzc2xfZXhwcl9wYXJzZS5jCi0jIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDEKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHNzbF9leHByX3NjYW4uYwotIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxzc2xfc2NhY2hlLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHNzbF9zY2FjaGVfZGJtLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHNzbF9zY2FjaGVfc2htY2IuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cc3NsX3NjYWNoZV9zaG1odC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxzc2xfdXRpbC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxzc2xfdXRpbF9zc2wuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cc3NsX3V0aWxfdGFibGUuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiKi5oIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2Rfc3NsLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHNzbF9leHByLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHNzbF9leHByX3BhcnNlLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHNzbF91dGlsX3NzbC5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxzc2xfdXRpbF90YWJsZS5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zc2wvbW9kX3NzbC5oIGIvbW9kdWxlcy9zc2wvbW9kX3NzbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzMxZWY5Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvc3NsL21vZF9zc2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1NCArMCwwIEBACi0vKiAgICAgICAgICAgICAgICAgICAgICBfICAgICAgICAgICAgIF8KLSoqICBfIF9fIF9fXyAgIF9fXyAgIF9ffCB8ICAgIF9fXyBfX198IHwgIG1vZF9zc2wKLSoqIHwgJ18gYCBfIFwgLyBfIFwgLyBfYCB8ICAgLyBfXy8gX198IHwgIEFwYWNoZSBJbnRlcmZhY2UgdG8gT3BlblNTTAotKiogfCB8IHwgfCB8IHwgKF8pIHwgKF98IHwgICBcX18gXF9fIFwgfCAgd3d3Lm1vZHNzbC5vcmcKLSoqIHxffCB8X3wgfF98XF9fXy8gXF9fLF98X19ffF9fXy9fX18vX3wgIGZ0cC5tb2Rzc2wub3JnCi0qKiAgICAgICAgICAgICAgICAgICAgICB8X19fX198Ci0qKiAgbW9kX3NzbC5oCi0qKiAgR2xvYmFsIGhlYWRlcgotKi8KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAxIFJhbGYgUy4gRW5nZWxzY2hhbGwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci0gKiAgICAgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGVuZ2Vsc2NoYWxsLmNvbT4gZm9yIHVzZSBpbiB0aGUKLSAqICAgICBtb2Rfc3NsIHByb2plY3QgKGh0dHA6Ly93d3cubW9kc3NsLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIm1vZF9zc2wiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICByc2VAZW5nZWxzY2hhbGwuY29tLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJtb2Rfc3NsIgotICogICAgbm9yIG1heSAibW9kX3NzbCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3IKLSAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBSYWxmIFMuIEVuZ2Vsc2NoYWxsLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLSAqICAgICBSYWxmIFMuIEVuZ2Vsc2NoYWxsIDxyc2VAZW5nZWxzY2hhbGwuY29tPiBmb3IgdXNlIGluIHRoZQotICogICAgIG1vZF9zc2wgcHJvamVjdCAoaHR0cDovL3d3dy5tb2Rzc2wub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgUkFMRiBTLiBFTkdFTFNDSEFMTCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgUkFMRiBTLiBFTkdFTFNDSEFMTCBPUgotICogSElTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGBgVGhlIEFwYWNoZSBHcm91cDogYSBjb2xsZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGFsZW50ZWQgaW5kaXZpZHVhbHMgd2hvIGFyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeWluZyB0byBwZXJmZWN0IHRoZSBhcnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXZlciBmaW5pc2hpbmcgc29tZXRoaW5nLicnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBSb2IgSGFydGlsbCAgICAgICAgICovCi0jaWZuZGVmIE1PRF9TU0xfSAotI2RlZmluZSBNT0RfU1NMX0ggMQotCi0vKiAKLSAqIENoZWNrIHdoZXRoZXIgRXh0ZW5kZWQgQVBJIChFQVBJKSBpcyBlbmFibGVkCi0gKi8KLSNpZm5kZWYgRUFQSQotI2Vycm9yICJtb2Rfc3NsIHJlcXVpcmVzIEV4dGVuZGVkIEFQSSAoRUFQSSkiCi0jZW5kaWYKLQotLyogCi0gKiBPcHRpb25hbGx5IGVuYWJsZSB0aGUgZXhwZXJpbWVudGFsIHN0dWZmLCBidXQgYWxsb3cgdGhlIHVzZXIgdG8KLSAqIG92ZXJyaWRlIHRoZSBkZWNpc2lvbiB3aGljaCBleHBlcmltZW50YWwgcGFydHMgYXJlIGluY2x1ZGVkIGJ5IHVzaW5nCi0gKiBDRkxBR1M9Ii1EU1NMX0VYUEVSSU1FTlRBTF94eHh4X0lHTk9SRSIuCi0gKi8KLSNpZmRlZiBTU0xfRVhQRVJJTUVOVEFMCi0jaWZuZGVmIFNTTF9FWFBFUklNRU5UQUxfUEVSRElSQ0FfSUdOT1JFCi0jZGVmaW5lIFNTTF9FWFBFUklNRU5UQUxfUEVSRElSQ0EKLSNlbmRpZgotI2lmbmRlZiBTU0xfRVhQRVJJTUVOVEFMX1BST1hZX0lHTk9SRQotI2RlZmluZSBTU0xfRVhQRVJJTUVOVEFMX1BST1hZCi0jZW5kaWYKLSNpZmRlZiBTU0xfRU5HSU5FCi0jaWZuZGVmIFNTTF9FWFBFUklNRU5UQUxfRU5HSU5FX0lHTk9SRQotI2RlZmluZSBTU0xfRVhQRVJJTUVOVEFMX0VOR0lORQotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZiAvKiBTU0xfRVhQRVJJTUVOVEFMICovCi0KLS8qCi0gKiBQb3dlciB1cCBvdXIgYnJhaW4uLi4KLSAqLwotCi0vKiBPUyBoZWFkZXJzICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2lmbmRlZiBXSU4zMgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZW5kaWYKLSNpZmRlZiBXSU4zMgotI2luY2x1ZGUgPHdpbmNyeXB0Lmg+Ci0jaW5jbHVkZSA8d2luc29jazIuaD4KLSNlbmRpZgotCi0vKiBPcGVuU1NMIGhlYWRlcnMgKi8KLSNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgotI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgotI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KLSNpZmRlZiBTU0xfRVhQRVJJTUVOVEFMX0VOR0lORQotI2luY2x1ZGUgPG9wZW5zc2wvZW5naW5lLmg+Ci0jZW5kaWYKLQotLyogQXBhY2hlIGhlYWRlcnMgKi8KLSNkZWZpbmUgQ09SRV9QUklWQVRFCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfY29uZl9nbG9iYWxzLmgiCi0jaW5jbHVkZSAiaHR0cF9wcm90b2NvbC5oIgotI2luY2x1ZGUgImh0dHBfcmVxdWVzdC5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAic2NvcmVib2FyZC5oIgotI2luY2x1ZGUgInV0aWxfbWQ1LmgiCi0jaW5jbHVkZSAiZm5tYXRjaC5oIgotI3VuZGVmIENPUkVfUFJJVkFURQotCi0vKiBtb2Rfc3NsIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJzc2xfZXhwci5oIgotI2luY2x1ZGUgInNzbF91dGlsX3NzbC5oIgotI2luY2x1ZGUgInNzbF91dGlsX3RhYmxlLmgiCi0KLS8qCi0gKiBQcm92aWRlIHJlYXNvbmFibGUgZGVmYXVsdCBmb3Igc29tZSBkZWZpbmVzCi0gKi8KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgKDApCi0jZW5kaWYKLSNpZm5kZWYgVFJVRQotI2RlZmluZSBUUlVFICghRkFMU0UpCi0jZW5kaWYKLSNpZm5kZWYgUEZBTFNFCi0jZGVmaW5lIFBGQUxTRSAoKHZvaWQgKilGQUxTRSkKLSNlbmRpZgotI2lmbmRlZiBQVFJVRQotI2RlZmluZSBQVFJVRSAoKHZvaWQgKilUUlVFKQotI2VuZGlmCi0jaWZuZGVmIFVOU0VUCi0jZGVmaW5lIFVOU0VUICgtMSkKLSNlbmRpZgotI2lmbmRlZiBOVUwKLSNkZWZpbmUgTlVMICdcMCcKLSNlbmRpZgotI2lmbmRlZiBSQU5EX01BWAotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2RlZmluZSBSQU5EX01BWCBJTlRfTUFYCi0jZW5kaWYKLQotLyoKLSAqIFByb3ZpZGUgcmVhc29uYWJsZSBkZWZpbmVzIGZvciBzb21lIHR5cGVzCi0gKi8KLSNpZm5kZWYgQk9PTAotI2RlZmluZSBCT09MIHVuc2lnbmVkIGludAotI2VuZGlmCi0jaWZuZGVmIFVDSEFSCi0jZGVmaW5lIFVDSEFSIHVuc2lnbmVkIGNoYXIKLSNlbmRpZgotCi0vKgotICogUHJvdmlkZSB1c2VmdWwgc2hvcnRoYW5kcwotICovCi0jZGVmaW5lIHN0ckVRKHMxLHMyKSAgICAgKHN0cmNtcChzMSxzMikgICAgICAgID09IDApCi0jZGVmaW5lIHN0ck5FKHMxLHMyKSAgICAgKHN0cmNtcChzMSxzMikgICAgICAgICE9IDApCi0jZGVmaW5lIHN0ckVRbihzMSxzMixuKSAgKHN0cm5jbXAoczEsczIsbikgICAgID09IDApCi0jZGVmaW5lIHN0ck5FbihzMSxzMixuKSAgKHN0cm5jbXAoczEsczIsbikgICAgICE9IDApCi0KLSNkZWZpbmUgc3RyY0VRKHMxLHMyKSAgICAoc3RyY2FzZWNtcChzMSxzMikgICAgPT0gMCkKLSNkZWZpbmUgc3RyY05FKHMxLHMyKSAgICAoc3RyY2FzZWNtcChzMSxzMikgICAgIT0gMCkKLSNkZWZpbmUgc3RyY0VRbihzMSxzMixuKSAoc3RybmNhc2VjbXAoczEsczIsbikgPT0gMCkKLSNkZWZpbmUgc3RyY05FbihzMSxzMixuKSAoc3RybmNhc2VjbXAoczEsczIsbikgIT0gMCkKLQotI2RlZmluZSBzdHJJc0VtcHR5KHMpICAgIChzID09IE5VTEwgfHwgc1swXSA9PSBOVUwpCi0KLSNkZWZpbmUgY2ZnTWVyZ2UoZWwsdW5zZXQpICBuZXctPmVsID0gYWRkLT5lbCA9PSB1bnNldCA/IGJhc2UtPmVsIDogYWRkLT5lbAotI2RlZmluZSBjZmdNZXJnZUFycmF5KGVsKSAgIG5ldy0+ZWwgPSBhcF9hcHBlbmRfYXJyYXlzKHAsIGFkZC0+ZWwsIGJhc2UtPmVsKQotI2RlZmluZSBjZmdNZXJnZVRhYmxlKGVsKSAgIG5ldy0+ZWwgPSBhcF9vdmVybGF5X3RhYmxlcyhwLCBhZGQtPmVsLCBiYXNlLT5lbCkKLSNkZWZpbmUgY2ZnTWVyZ2VDdHgoZWwpICAgICBuZXctPmVsID0gYXBfY3R4X292ZXJsYXkocCwgYWRkLT5lbCwgYmFzZS0+ZWwpCi0jZGVmaW5lIGNmZ01lcmdlU3RyaW5nKGVsKSAgY2ZnTWVyZ2UoZWwsIE5VTEwpCi0jZGVmaW5lIGNmZ01lcmdlQm9vbChlbCkgICAgY2ZnTWVyZ2UoZWwsIFVOU0VUKQotI2RlZmluZSBjZmdNZXJnZUludChlbCkgICAgIGNmZ01lcmdlKGVsLCBVTlNFVCkKLQotI2RlZmluZSBteU1vZENvbmZpZygpICAgIChTU0xNb2RDb25maWdSZWMgKilhcF9jdHhfZ2V0KGFwX2dsb2JhbF9jdHgsICJzc2xfbW9kdWxlIikKLSNkZWZpbmUgbXlTcnZDb25maWcoc3J2KSAoU1NMU3J2Q29uZmlnUmVjICopYXBfZ2V0X21vZHVsZV9jb25maWcoc3J2LT5tb2R1bGVfY29uZmlnLCAgJnNzbF9tb2R1bGUpCi0jZGVmaW5lIG15RGlyQ29uZmlnKHJlcSkgKFNTTERpckNvbmZpZ1JlYyAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHJlcS0+cGVyX2Rpcl9jb25maWcsICZzc2xfbW9kdWxlKQotCi0jZGVmaW5lIG15Q3R4VmFyU2V0KG1jLG51bSx2YWwpICBtYy0+ckN0eC5wViMjbnVtID0gdmFsCi0jZGVmaW5lIG15Q3R4VmFyR2V0KG1jLG51bSx0eXBlKSAodHlwZSkobWMtPnJDdHgucFYjI251bSkKLQotI2RlZmluZSBBUF9BTExfQ01EKG5hbWUsIGFyZ3MsIGRlc2MpIFwKLSAgICAgICAgeyAiU1NMIiNuYW1lLCBzc2xfY21kX1NTTCMjbmFtZSwgTlVMTCwgUlNSQ19DT05GfE9SX0FVVEhDRkcsIGFyZ3MsIGRlc2MgfSwKLSNkZWZpbmUgQVBfU1JWX0NNRChuYW1lLCBhcmdzLCBkZXNjKSBcCi0gICAgICAgIHsgIlNTTCIjbmFtZSwgc3NsX2NtZF9TU0wjI25hbWUsIE5VTEwsIFJTUkNfQ09ORiwgYXJncywgZGVzYyB9LAotI2RlZmluZSBBUF9ESVJfQ01EKG5hbWUsIHR5cGUsIGFyZ3MsIGRlc2MpIFwKLSAgICAgICAgeyAiU1NMIiNuYW1lLCBzc2xfY21kX1NTTCMjbmFtZSwgTlVMTCwgT1JfIyN0eXBlLCBhcmdzLCBkZXNjIH0sCi0jZGVmaW5lIEFQX0VORF9DTUQgXAotICAgICAgICB7IE5VTEwgfQotCi0vKgotICogU1NMIExvZ2dpbmcKLSAqLwotI2RlZmluZSBTU0xfTE9HX05PTkUgICAgKDE8PDApCi0jZGVmaW5lIFNTTF9MT0dfRVJST1IgICAoMTw8MSkKLSNkZWZpbmUgU1NMX0xPR19XQVJOICAgICgxPDwyKQotI2RlZmluZSBTU0xfTE9HX0lORk8gICAgKDE8PDMpCi0jZGVmaW5lIFNTTF9MT0dfVFJBQ0UgICAoMTw8NCkKLSNkZWZpbmUgU1NMX0xPR19ERUJVRyAgICgxPDw1KQotI2RlZmluZSBTU0xfTE9HX01BU0sgICAgKFNTTF9MT0dfRVJST1J8U1NMX0xPR19XQVJOfFNTTF9MT0dfSU5GT3xTU0xfTE9HX1RSQUNFfFNTTF9MT0dfREVCVUcpCi0KLSNkZWZpbmUgU1NMX0FERF9OT05FICAgICAoMTw8OCkKLSNkZWZpbmUgU1NMX0FERF9FUlJOTyAgICAoMTw8OSkKLSNkZWZpbmUgU1NMX0FERF9TU0xFUlIgICAoMTw8MTApCi0jZGVmaW5lIFNTTF9OT19USU1FU1RBTVAgKDE8PDExKQotI2RlZmluZSBTU0xfTk9fTEVWRUxJRCAgICgxPDwxMikKLSNkZWZpbmUgU1NMX05PX05FV0xJTkUgICAoMTw8MTMpCi0KLS8qCi0gKiBEZWZhdWx0cyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24KLSAqLwotI2lmbmRlZiBTU0xfU0VTU0lPTl9DQUNIRV9USU1FT1VUCi0jZGVmaW5lIFNTTF9TRVNTSU9OX0NBQ0hFX1RJTUVPVVQgIDMwMAotI2VuZGlmCi0KLS8qCi0gKiBTdXBwb3J0IGZvciBmaWxlIGxvY2tpbmc6IFRyeSB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBzaG91bGQgdXNlIGZjbnRsKCkgb3IKLSAqIGZsb2NrKCkuICBXb3VsZCBiZSBiZXR0ZXIgYXBfY29uZmlnLmggY291bGQgcHJvdmlkZSB0aGlzLi4uIDotKAotICAqLwotI2lmIGRlZmluZWQoVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUKQotI2RlZmluZSBTU0xfVVNFX0ZDTlRMIDEKLSNpbmNsdWRlIDxmY250bC5oPgotI2VuZGlmCi0jaWYgZGVmaW5lZChVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQpCi0jZGVmaW5lIFNTTF9VU0VfRkxPQ0sgMQotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZChTU0xfVVNFX0ZDTlRMKSAmJiAhZGVmaW5lZChTU0xfVVNFX0ZMT0NLKQotI2RlZmluZSBTU0xfVVNFX0ZMT0NLIDEKLSNpZiAhZGVmaW5lZChNUEUpICYmICFkZWZpbmVkKFdJTjMyKQotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0jZW5kaWYKLSNpZm5kZWYgTE9DS19VTgotI3VuZGVmIFNTTF9VU0VfRkxPQ0sKLSNkZWZpbmUgU1NMX1VTRV9GQ05UTCAxCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgQUlYCi0jdW5kZWYgU1NMX1VTRV9GTE9DSwotI2RlZmluZSBTU0xfVVNFX0ZDTlRMIDEKLSNpbmNsdWRlIDxmY250bC5oPgotI2VuZGlmCi0KLS8qCi0gKiBTdXBwb3J0IGZvciBNdXRleAotICovCi0jaWZuZGVmIFdJTjMyCi0jZGVmaW5lIFNTTF9NVVRFWF9MT0NLX01PREUgKCBTX0lSVVNSfFNfSVdVU1IgKQotI2Vsc2UKLSNkZWZpbmUgU1NMX01VVEVYX0xPQ0tfTU9ERSAoX1NfSVJFQUR8X1NfSVdSSVRFICkKLSNlbmRpZgotI2lmIGRlZmluZWQoVVNFX1NZU1ZTRU1fU0VSSUFMSVpFRF9BQ0NFUFQpIHx8XAotICAgIChkZWZpbmVkKF9fRnJlZUJTRF9fKSAmJiBkZWZpbmVkKF9fRnJlZUJTRF92ZXJzaW9uKSAmJlwKLSAgICAgX19GcmVlQlNEX3ZlcnNpb24gPj0gMzAwMDAwKSB8fFwKLSAgICAoZGVmaW5lZChMSU5VWCkgJiYgZGVmaW5lZChfX0dMSUJDX18pICYmIGRlZmluZWQoX19HTElCQ19NSU5PUl9fKSAmJlwKLSAgICAgTElOVVggPj0gMiAmJiBfX0dMSUJDX18gPj0gMiAmJiBfX0dMSUJDX01JTk9SX18gPj0gMSkgfHxcCi0gICAgZGVmaW5lZChTT0xBUklTMikgfHwgZGVmaW5lZChfX2hwdXgpIHx8XAotICAgIChkZWZpbmVkIChfX2RpZ2l0YWxfXykgJiYgZGVmaW5lZCAoX191bml4X18pKQotI2RlZmluZSBTU0xfQ0FOX1VTRV9TRU0KLSNkZWZpbmUgU1NMX0hBVkVfSVBDU0VNCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL2lwYy5oPgotI2luY2x1ZGUgPHN5cy9zZW0uaD4KLS8qIAotICogU29tZSBwbGF0Zm9ybXMgaGF2ZSBhIGB1bmlvbiBzZW11bicgcHJlLWRlZmluZWQgYnV0IFNpbmdsZSBVbml4Ci0gKiBTcGVjaWZpY2F0aW9uIChTVVN2Mikgc2F5cyBpbiBzZW1jdGwoMik6IGBJZiByZXF1aXJlZCwgaXQgaXMgb2YKLSAqIHR5cGUgdW5pb24gc2VtdW4sIHdoaWNoIHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIG11c3QgZXhwbGljaXRseQotICogZGVjbGFyZScuIFNvIHdlIGRlZmluZSBpdCBhbHdheXMgb3Vyc2VsZiB0byBhdm9pZCBwcm9ibGVtcyAoYnV0IHVuZGVyCi0gKiBhIGRpZmZlcmVudCBuYW1lIHRvIGF2b2lkIGEgbmFtZXNwYWNlIGNsYXNoKS4KLSAqLwotdW5pb24gc3NsX2lwY19zZW11biB7Ci0gICAgbG9uZyB2YWw7Ci0gICAgc3RydWN0IHNlbWlkX2RzICpidWY7Ci0gICAgdW5zaWduZWQgc2hvcnQgaW50ICphcnJheTsKLX07Ci0jZW5kaWYKLSNpZmRlZiBXSU4zMgotI2RlZmluZSBTU0xfQ0FOX1VTRV9TRU0KLSNkZWZpbmUgU1NMX0hBVkVfVzMyU0VNCi0jaW5jbHVkZSAibXVsdGl0aHJlYWQuaCIKLSNpbmNsdWRlIDxwcm9jZXNzLmg+Ci0jZW5kaWYKLQotLyoKLSAqIFN1cHBvcnQgZm9yIE1NIGxpYnJhcnkKLSAqLwotI2lmbmRlZiBXSU4zMgotI2RlZmluZSBTU0xfTU1fRklMRV9NT0RFICggU19JUlVTUnxTX0lXVVNSICkKLSNlbHNlCi0jZGVmaW5lIFNTTF9NTV9GSUxFX01PREUgKCBfU19JUkVBRHxfU19JV1JJVEUgKQotI2VuZGlmCi0KLS8qCi0gKiBTdXBwb3J0IGZvciBEQk0gbGlicmFyeQotICovCi0jaWZuZGVmIFdJTjMyCi0jZGVmaW5lIFNTTF9EQk1fRklMRV9NT0RFICggU19JUlVTUnxTX0lXVVNSICkKLSNlbHNlCi0jZGVmaW5lIFNTTF9VU0VfU0RCTQotI2RlZmluZSBTU0xfREJNX0ZJTEVfTU9ERSAoIF9TX0lSRUFEfF9TX0lXUklURSApCi0jZW5kaWYKLQotI2lmZGVmIFNTTF9VU0VfU0RCTQotI2luY2x1ZGUgInNzbF91dGlsX3NkYm0uaCIKLSNkZWZpbmUgc3NsX2RibV9vcGVuICAgICBzZGJtX29wZW4KLSNkZWZpbmUgc3NsX2RibV9jbG9zZSAgICBzZGJtX2Nsb3NlCi0jZGVmaW5lIHNzbF9kYm1fc3RvcmUgICAgc2RibV9zdG9yZQotI2RlZmluZSBzc2xfZGJtX2ZldGNoICAgIHNkYm1fZmV0Y2gKLSNkZWZpbmUgc3NsX2RibV9kZWxldGUgICBzZGJtX2RlbGV0ZQotI2RlZmluZSBzc2xfZGJtX2ZpcnN0a2V5IHNkYm1fZmlyc3RrZXkKLSNkZWZpbmUgc3NsX2RibV9uZXh0a2V5ICBzZGJtX25leHRrZXkKLSNkZWZpbmUgU1NMX0RCTV9GSUxFX1NVRkZJWF9ESVIgIi5kaXIiCi0jZGVmaW5lIFNTTF9EQk1fRklMRV9TVUZGSVhfUEFHICIucGFnIgotI2Vsc2UgLyogIVNTTF9VU0VfU0RCTSAqLwotI2lmIGRlZmluZWQoX19HTElCQ19fKSAmJiBkZWZpbmVkKF9fR0xJQkNfTUlOT1JfXykgXAotICAgICYmIF9fR0xJQkNfXyA+PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+PSAxCi0jaW5jbHVkZSA8ZGIxL25kYm0uaD4KLSNlbHNlCi0jaW5jbHVkZSA8bmRibS5oPgotI2VuZGlmCi0jZGVmaW5lIHNzbF9kYm1fb3BlbiAgICAgZGJtX29wZW4KLSNkZWZpbmUgc3NsX2RibV9jbG9zZSAgICBkYm1fY2xvc2UKLSNkZWZpbmUgc3NsX2RibV9zdG9yZSAgICBkYm1fc3RvcmUKLSNkZWZpbmUgc3NsX2RibV9mZXRjaCAgICBkYm1fZmV0Y2gKLSNkZWZpbmUgc3NsX2RibV9kZWxldGUgICBkYm1fZGVsZXRlCi0jZGVmaW5lIHNzbF9kYm1fZmlyc3RrZXkgZGJtX2ZpcnN0a2V5Ci0jZGVmaW5lIHNzbF9kYm1fbmV4dGtleSAgZGJtX25leHRrZXkKLSNpZiAhZGVmaW5lZChTU0xfREJNX0ZJTEVfU1VGRklYX0RJUikgJiYgIWRlZmluZWQoU1NMX0RCTV9GSUxFX1NVRkZJWF9QQUcpCi0jaWYgZGVmaW5lZChEQk1fU1VGRklYKQotI2RlZmluZSBTU0xfREJNX0ZJTEVfU1VGRklYX0RJUiBEQk1fU1VGRklYCi0jZGVmaW5lIFNTTF9EQk1fRklMRV9TVUZGSVhfUEFHIERCTV9TVUZGSVgKLSNlbGlmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IChkZWZpbmVkKERCX0xPQ0spICYmIGRlZmluZWQoREJfU0hNRU0pKQotI2RlZmluZSBTU0xfREJNX0ZJTEVfU1VGRklYX0RJUiAiLmRiIgotI2RlZmluZSBTU0xfREJNX0ZJTEVfU1VGRklYX1BBRyAiLmRiIgotI2Vsc2UKLSNkZWZpbmUgU1NMX0RCTV9GSUxFX1NVRkZJWF9ESVIgIi5kaXIiCi0jZGVmaW5lIFNTTF9EQk1fRklMRV9TVUZGSVhfUEFHICIucGFnIgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZiAvKiAhU1NMX1VTRV9TREJNICovCi0KLS8qCi0gKiBDaGVjayBmb3IgT3BlblNTTCB2ZXJzaW9uIAotICovCi0jaWYgU1NMX0xJQlJBUllfVkVSU0lPTiA8IDB4MDA5MDMxMDAKLSNlcnJvciAibW9kX3NzbCByZXF1aXJlcyBPcGVuU1NMIDAuOS4zIG9yIGhpZ2hlciIKLSNlbmRpZgotCi0vKgotICogVGhlIG93biBkYXRhIHN0cnVjdHVyZXMKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHBvb2wgKnBQb29sOwotICAgIHBvb2wgKnBTdWJQb29sOwotICAgIGFycmF5X2hlYWRlciAqYURhdGE7Ci19IHNzbF9kc19hcnJheTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHBvb2wgKnBQb29sOwotICAgIHBvb2wgKnBTdWJQb29sOwotICAgIGFycmF5X2hlYWRlciAqYUtleTsKLSAgICBhcnJheV9oZWFkZXIgKmFEYXRhOwotfSBzc2xfZHNfdGFibGU7Ci0KLS8qCi0gKiBEZWZpbmUgdGhlIGNlcnRpZmljYXRlIGFsZ29yaXRobSB0eXBlcwotICovCi0KLXR5cGVkZWYgaW50IHNzbF9hbGdvX3Q7Ci0KLSNkZWZpbmUgU1NMX0FMR09fVU5LTk9XTiAoMCkKLSNkZWZpbmUgU1NMX0FMR09fUlNBICAgICAoMTw8MCkKLSNkZWZpbmUgU1NMX0FMR09fRFNBICAgICAoMTw8MSkKLSNkZWZpbmUgU1NMX0FMR09fQUxMICAgICAoU1NMX0FMR09fUlNBfFNTTF9BTEdPX0RTQSkKLQotI2RlZmluZSBTU0xfQUlEWF9SU0EgICAgICgwKQotI2RlZmluZSBTU0xfQUlEWF9EU0EgICAgICgxKQotI2RlZmluZSBTU0xfQUlEWF9NQVggICAgICgyKQotCi0vKgotICogRGVmaW5lIElEcyBmb3IgdGhlIHRlbXBvcmFyeSBSU0Ega2V5cyBhbmQgREggcGFyYW1zCi0gKi8KLQotI2RlZmluZSBTU0xfVEtQX0dFTiAgICAgICAgKDApCi0jZGVmaW5lIFNTTF9US1BfQUxMT0MgICAgICAoMSkKLSNkZWZpbmUgU1NMX1RLUF9GUkVFICAgICAgICgyKQotCi0jZGVmaW5lIFNTTF9US1BJRFhfUlNBNTEyICAoMCkKLSNkZWZpbmUgU1NMX1RLUElEWF9SU0ExMDI0ICgxKQotI2RlZmluZSBTU0xfVEtQSURYX0RINTEyICAgKDIpCi0jZGVmaW5lIFNTTF9US1BJRFhfREgxMDI0ICAoMykKLSNkZWZpbmUgU1NMX1RLUElEWF9NQVggICAgICg0KQotCi0vKgotICogRGVmaW5lIHRoZSBTU0wgb3B0aW9ucwotICovCi0jZGVmaW5lIFNTTF9PUFRfTk9ORSAgICAgICAgICAgKDApCi0jZGVmaW5lIFNTTF9PUFRfUkVMU0VUICAgICAgICAgKDE8PDApCi0jZGVmaW5lIFNTTF9PUFRfU1RERU5WVkFSUyAgICAgKDE8PDEpCi0jZGVmaW5lIFNTTF9PUFRfQ09NUEFURU5WVkFSUyAgKDE8PDIpCi0jZGVmaW5lIFNTTF9PUFRfRVhQT1JUQ0VSVERBVEEgKDE8PDMpCi0jZGVmaW5lIFNTTF9PUFRfRkFLRUJBU0lDQVVUSCAgKDE8PDQpCi0jZGVmaW5lIFNTTF9PUFRfU1RSSUNUUkVRVUlSRSAgKDE8PDUpCi0jZGVmaW5lIFNTTF9PUFRfT1BUUkVORUdPVElBVEUgKDE8PDYpCi0jZGVmaW5lIFNTTF9PUFRfQUxMICAgICAgICAgICAgKFNTTF9PUFRfU1RERU5WVkFSU3xTU0xfT1BUX0NPTVBBVEVOVlZBUnxTU0xfT1BUX0VYUE9SVENFUlREQVRBfFNTTF9PUFRfRkFLRUJBU0lDQVVUSHxTU0xfT1BUX1NUUklDVFJFUVVJUkV8U1NMX09QVF9PUFRSRU5FR09USUFURSkKLXR5cGVkZWYgaW50IHNzbF9vcHRfdDsKLQotLyoKLSAqIERlZmluZSB0aGUgU1NMIFByb3RvY29sIG9wdGlvbnMKLSAqLwotI2RlZmluZSBTU0xfUFJPVE9DT0xfTk9ORSAgKDApCi0jZGVmaW5lIFNTTF9QUk9UT0NPTF9TU0xWMiAoMTw8MCkKLSNkZWZpbmUgU1NMX1BST1RPQ09MX1NTTFYzICgxPDwxKQotI2RlZmluZSBTU0xfUFJPVE9DT0xfVExTVjEgKDE8PDIpCi0jZGVmaW5lIFNTTF9QUk9UT0NPTF9BTEwgICAoU1NMX1BST1RPQ09MX1NTTFYyfFNTTF9QUk9UT0NPTF9TU0xWM3xTU0xfUFJPVE9DT0xfVExTVjEpCi10eXBlZGVmIGludCBzc2xfcHJvdG9fdDsKLQotLyoKLSAqIERlZmluZSB0aGUgU1NMIHZlcmlmeSBsZXZlbHMKLSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBTU0xfQ1ZFUklGWV9VTlNFVCAgICAgICAgICAgPSBVTlNFVCwKLSAgICBTU0xfQ1ZFUklGWV9OT05FICAgICAgICAgICAgPSAwLAotICAgIFNTTF9DVkVSSUZZX09QVElPTkFMICAgICAgICA9IDEsCi0gICAgU1NMX0NWRVJJRllfUkVRVUlSRSAgICAgICAgID0gMiwKLSAgICBTU0xfQ1ZFUklGWV9PUFRJT05BTF9OT19DQSAgPSAzCi19IHNzbF92ZXJpZnlfdDsKLQotLyoKLSAqIERlZmluZSB0aGUgU1NMIHBhc3MgcGhyYXNlIGRpYWxvZyB0eXBlcwotICovCi10eXBlZGVmIGVudW0gewotICAgIFNTTF9QUFRZUEVfVU5TRVQgICA9IFVOU0VULAotICAgIFNTTF9QUFRZUEVfQlVJTFRJTiA9IDAsCi0gICAgU1NMX1BQVFlQRV9GSUxURVIgID0gMQotfSBzc2xfcHBocmFzZV90OwotCi0vKgotICogRGVmaW5lIHRoZSBQYXRoIENoZWNraW5nIG1vZGVzCi0gKi8KLSNkZWZpbmUgU1NMX1BDTV9FWElTVFMgICAgIDEKLSNkZWZpbmUgU1NMX1BDTV9JU1JFRyAgICAgIDIKLSNkZWZpbmUgU1NMX1BDTV9JU0RJUiAgICAgIDQKLSNkZWZpbmUgU1NMX1BDTV9JU05PTlpFUk8gIDgKLXR5cGVkZWYgdW5zaWduZWQgaW50IHNzbF9wYXRoY2hlY2tfdDsKLQotLyoKLSAqIERlZmluZSB0aGUgU1NMIHNlc3Npb24gY2FjaGUgbW9kZXMgYW5kIHN0cnVjdHVyZXMKLSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBTU0xfU0NNT0RFX1VOU0VUID0gVU5TRVQsCi0gICAgU1NMX1NDTU9ERV9OT05FICA9IDAsCi0gICAgU1NMX1NDTU9ERV9EQk0gICA9IDEsCi0gICAgU1NMX1NDTU9ERV9TSE1IVCA9IDIsCi0gICAgU1NMX1NDTU9ERV9TSE1DQiA9IDMKLX0gc3NsX3NjbW9kZV90OwotCi0vKgotICogRGVmaW5lIHRoZSBTU0wgbXV0ZXggbW9kZXMKLSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBTU0xfTVVURVhNT0RFX1VOU0VUICA9IFVOU0VULAotICAgIFNTTF9NVVRFWE1PREVfTk9ORSAgID0gMCwKLSAgICBTU0xfTVVURVhNT0RFX0ZJTEUgICA9IDEsCi0gICAgU1NMX01VVEVYTU9ERV9TRU0gICAgPSAyCi19IHNzbF9tdXRleG1vZGVfdDsKLQotLyoKLSAqIERlZmluZSB0aGUgU1NMIHJlcXVpcmVtZW50IHN0cnVjdHVyZQotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY2hhciAgICAgKmNwRXhwcjsKLSAgICBzc2xfZXhwciAqbXBFeHByOwotfSBzc2xfcmVxdWlyZV90OwotCi0vKgotICogRGVmaW5lIHRoZSBTU0wgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igc2VlZGluZyBzb3VyY2UKLSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBTU0xfUlNDVFhfU1RBUlRVUCA9IDEsCi0gICAgU1NMX1JTQ1RYX0NPTk5FQ1QgPSAyCi19IHNzbF9yc2N0eF90OwotdHlwZWRlZiBlbnVtIHsKLSAgICBTU0xfUlNTUkNfQlVJTFRJTiA9IDEsCi0gICAgU1NMX1JTU1JDX0ZJTEUgICAgPSAyLAotICAgIFNTTF9SU1NSQ19FWEVDICAgID0gMwotI2lmIFNTTF9MSUJSQVJZX1ZFUlNJT04gPj0gMHgwMDkwNTEwMAotICAgLFNTTF9SU1NSQ19FR0QgICAgID0gNAotI2VuZGlmCi19IHNzbF9yc3NyY190OwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHNzbF9yc2N0eF90ICBuQ3R4OwotICAgIHNzbF9yc3NyY190ICBuU3JjOwotICAgIGNoYXIgICAgICAgICpjcFBhdGg7Ci0gICAgaW50ICAgICAgICAgIG5CeXRlczsKLX0gc3NsX3JhbmRzZWVkX3Q7Ci0KLS8qCi0gKiBEZWZpbmUgdGhlIHN0cnVjdHVyZSBvZiBhbiBBU04uMSBhbnl0aGluZwotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgbG9uZyBpbnQgICAgICAgbkRhdGE7Ci0gICAgdW5zaWduZWQgY2hhciAqY3BEYXRhOwotfSBzc2xfYXNuMV90OwotCi0vKgotICogRGVmaW5lIHRoZSBtb2Rfc3NsIHBlci1tb2R1bGUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKLSAqIChpLmUuIHRoZSBnbG9iYWwgY29uZmlndXJhdGlvbiBmb3IgZWFjaCBodHRwZCBwcm9jZXNzKQotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBwb29sICAgICAgICAgICAqcFBvb2w7Ci0gICAgQk9PTCAgICAgICAgICAgIGJGaXhlZDsKLSAgICBpbnQgICAgICAgICAgICAgbkluaXRDb3VudDsKLSAgICBpbnQgICAgICAgICAgICAgblNlc3Npb25DYWNoZU1vZGU7Ci0gICAgY2hhciAgICAgICAgICAgKnN6U2Vzc2lvbkNhY2hlRGF0YUZpbGU7Ci0gICAgaW50ICAgICAgICAgICAgIG5TZXNzaW9uQ2FjaGVEYXRhU2l6ZTsKLSAgICBBUF9NTSAgICAgICAgICAqcFNlc3Npb25DYWNoZURhdGFNTTsKLSAgICB0YWJsZV90ICAgICAgICAqdFNlc3Npb25DYWNoZURhdGFUYWJsZTsKLSAgICBzc2xfbXV0ZXhtb2RlX3Qgbk11dGV4TW9kZTsKLSAgICBjaGFyICAgICAgICAgICAqc3pNdXRleEZpbGU7Ci0gICAgaW50ICAgICAgICAgICAgIG5NdXRleEZEOwotICAgIGludCAgICAgICAgICAgICBuTXV0ZXhTRU1JRDsKLSAgICBhcnJheV9oZWFkZXIgICAqYVJhbmRTZWVkOwotICAgIHNzbF9kc190YWJsZSAgICp0VG1wS2V5czsKLSAgICB2b2lkICAgICAgICAgICAqcFRtcEtleXNbU1NMX1RLUElEWF9NQVhdOwotICAgIHNzbF9kc190YWJsZSAgICp0UHVibGljQ2VydDsKLSAgICBzc2xfZHNfdGFibGUgICAqdFByaXZhdGVLZXk7Ci0jaWZkZWYgU1NMX0VYUEVSSU1FTlRBTF9FTkdJTkUKLSAgICBjaGFyICAgICAgICAgICAqc3pDcnlwdG9EZXZpY2U7Ci0jZW5kaWYKLSAgICBzdHJ1Y3QgewotICAgICAgICB2b2lkICpwVjEsICpwVjIsICpwVjMsICpwVjQsICpwVjUsICpwVjYsICpwVjcsICpwVjgsICpwVjksICpwVjEwOwotICAgIH0gckN0eDsKLSNpZmRlZiBTU0xfVkVORE9SCi0gICAgYXBfY3R4ICAgICAgICAgKmN0eDsKLSNlbmRpZgotfSBTU0xNb2RDb25maWdSZWM7Ci0KLS8qCi0gKiBEZWZpbmUgdGhlIG1vZF9zc2wgcGVyLXNlcnZlciBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQotICogKGkuZS4gdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBtYWluIHNlcnZlcgotICogIGFuZCBhbGwgPFZpcnR1YWxIb3N0PiBjb250ZXh0cykKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIEJPT0wgICAgICAgICBiRW5hYmxlZDsKLSAgICBjaGFyICAgICAgICAqc3pQdWJsaWNDZXJ0RmlsZVtTU0xfQUlEWF9NQVhdOwotICAgIGNoYXIgICAgICAgICpzelByaXZhdGVLZXlGaWxlW1NTTF9BSURYX01BWF07Ci0gICAgY2hhciAgICAgICAgKnN6Q2VydGlmaWNhdGVDaGFpbjsKLSAgICBjaGFyICAgICAgICAqc3pDQUNlcnRpZmljYXRlUGF0aDsKLSAgICBjaGFyICAgICAgICAqc3pDQUNlcnRpZmljYXRlRmlsZTsKLSAgICBjaGFyICAgICAgICAqc3pMb2dGaWxlOwotICAgIGNoYXIgICAgICAgICpzekNpcGhlclN1aXRlOwotICAgIEZJTEUgICAgICAgICpmaWxlTG9nRmlsZTsKLSAgICBpbnQgICAgICAgICAgbkxvZ0xldmVsOwotICAgIGludCAgICAgICAgICBuVmVyaWZ5RGVwdGg7Ci0gICAgc3NsX3ZlcmlmeV90IG5WZXJpZnlDbGllbnQ7Ci0gICAgWDUwOSAgICAgICAgKnBQdWJsaWNDZXJ0W1NTTF9BSURYX01BWF07Ci0gICAgRVZQX1BLRVkgICAgKnBQcml2YXRlS2V5W1NTTF9BSURYX01BWF07Ci0gICAgU1NMX0NUWCAgICAgKnBTU0xDdHg7Ci0gICAgaW50ICAgICAgICAgIG5TZXNzaW9uQ2FjaGVUaW1lb3V0OwotICAgIGludCAgICAgICAgICBuUGFzc1BocmFzZURpYWxvZ1R5cGU7Ci0gICAgY2hhciAgICAgICAgKnN6UGFzc1BocmFzZURpYWxvZ1BhdGg7Ci0gICAgc3NsX3Byb3RvX3QgIG5Qcm90b2NvbDsKLSAgICBjaGFyICAgICAgICAqc3pDQVJldm9jYXRpb25QYXRoOwotICAgIGNoYXIgICAgICAgICpzekNBUmV2b2NhdGlvbkZpbGU7Ci0gICAgWDUwOV9TVE9SRSAgKnBSZXZvY2F0aW9uU3RvcmU7Ci0jaWZkZWYgU1NMX0VYUEVSSU1FTlRBTF9QUk9YWQotICAgIC8qIENvbmZpZ3VyYXRpb24gZGV0YWlscyBmb3IgcHJveHkgb3BlcmF0aW9uICovCi0gICAgc3NsX3Byb3RvX3QgIG5Qcm94eVByb3RvY29sOwotICAgIGludCAgICAgICAgICBiUHJveHlWZXJpZnk7Ci0gICAgaW50ICAgICAgICAgIG5Qcm94eVZlcmlmeURlcHRoOwotICAgIGNoYXIgICAgICAgICpzelByb3h5Q0FDZXJ0aWZpY2F0ZVBhdGg7Ci0gICAgY2hhciAgICAgICAgKnN6UHJveHlDQUNlcnRpZmljYXRlRmlsZTsKLSAgICBjaGFyICAgICAgICAqc3pQcm94eUNsaWVudENlcnRpZmljYXRlRmlsZTsKLSAgICBjaGFyICAgICAgICAqc3pQcm94eUNsaWVudENlcnRpZmljYXRlUGF0aDsKLSAgICBjaGFyICAgICAgICAqc3pQcm94eUNpcGhlclN1aXRlOwotICAgIFNTTF9DVFggICAgICpwU1NMUHJveHlDdHg7Ci0gICAgU1RBQ0tfT0YoWDUwOV9JTkZPKSAqc2tQcm94eUNsaWVudENlcnRzOwotI2VuZGlmCi0jaWZkZWYgU1NMX1ZFTkRPUgotICAgIGFwX2N0eCAgICAgICpjdHg7Ci0jZW5kaWYKLX0gU1NMU3J2Q29uZmlnUmVjOwotCi0vKgotICogRGVmaW5lIHRoZSBtb2Rfc3NsIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKLSAqIChpLmUuIHRoZSBsb2NhbCBjb25maWd1cmF0aW9uIGZvciBhbGwgPERpcmVjdG9yeT4KLSAqICBhbmQgLmh0YWNjZXNzIGNvbnRleHRzKQotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgQk9PTCAgICAgICAgICBiU1NMUmVxdWlyZWQ7Ci0gICAgYXJyYXlfaGVhZGVyICphUmVxdWlyZW1lbnQ7Ci0gICAgc3NsX29wdF90ICAgICBuT3B0aW9uczsKLSAgICBzc2xfb3B0X3QgICAgIG5PcHRpb25zQWRkOwotICAgIHNzbF9vcHRfdCAgICAgbk9wdGlvbnNEZWw7Ci0gICAgY2hhciAgICAgICAgICpzekNpcGhlclN1aXRlOwotICAgIHNzbF92ZXJpZnlfdCAgblZlcmlmeUNsaWVudDsKLSAgICBpbnQgICAgICAgICAgIG5WZXJpZnlEZXB0aDsKLSNpZmRlZiBTU0xfRVhQRVJJTUVOVEFMX1BFUkRJUkNBCi0gICAgY2hhciAgICAgICAgICpzekNBQ2VydGlmaWNhdGVQYXRoOwotICAgIGNoYXIgICAgICAgICAqc3pDQUNlcnRpZmljYXRlRmlsZTsKLSNlbmRpZgotI2lmZGVmIFNTTF9WRU5ET1IKLSAgICBhcF9jdHggICAgICAgKmN0eDsKLSNlbmRpZgotfSBTU0xEaXJDb25maWdSZWM7Ci0KLS8qCi0gKiAgZnVuY3Rpb24gcHJvdG90eXBlcwotICovCi0KLS8qICBBUEkgZ2x1ZSBzdHJ1Y3R1cmVzICAqLwotZXh0ZXJuIG1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBzc2xfbW9kdWxlOwotCi0vKiAgY29uZmlndXJhdGlvbiBoYW5kbGluZyAgICovCi12b2lkICAgICAgICAgc3NsX2NvbmZpZ19nbG9iYWxfY3JlYXRlKHZvaWQpOwotdm9pZCAgICAgICAgIHNzbF9jb25maWdfZ2xvYmFsX2ZpeCh2b2lkKTsKLUJPT0wgICAgICAgICBzc2xfY29uZmlnX2dsb2JhbF9pc2ZpeGVkKHZvaWQpOwotdm9pZCAgICAgICAgKnNzbF9jb25maWdfc2VydmVyX2NyZWF0ZShwb29sICosIHNlcnZlcl9yZWMgKik7Ci12b2lkICAgICAgICAqc3NsX2NvbmZpZ19zZXJ2ZXJfbWVyZ2UocG9vbCAqLCB2b2lkICosIHZvaWQgKik7Ci12b2lkICAgICAgICAqc3NsX2NvbmZpZ19wZXJkaXJfY3JlYXRlKHBvb2wgKiwgY2hhciAqKTsKLXZvaWQgICAgICAgICpzc2xfY29uZmlnX3BlcmRpcl9tZXJnZShwb29sICosIHZvaWQgKiwgdm9pZCAqKTsKLWNvbnN0IGNoYXIgICpzc2xfY21kX1NTTE11dGV4KGNtZF9wYXJtcyAqLCBjaGFyICosIGNoYXIgKik7Ci1jb25zdCBjaGFyICAqc3NsX2NtZF9TU0xQYXNzUGhyYXNlRGlhbG9nKGNtZF9wYXJtcyAqLCBjaGFyICosIGNoYXIgKik7Ci1jb25zdCBjaGFyICAqc3NsX2NtZF9TU0xDcnlwdG9EZXZpY2UoY21kX3Bhcm1zICosIGNoYXIgKiwgY2hhciAqKTsKLWNvbnN0IGNoYXIgICpzc2xfY21kX1NTTFJhbmRvbVNlZWQoY21kX3Bhcm1zICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKik7Ci1jb25zdCBjaGFyICAqc3NsX2NtZF9TU0xFbmdpbmUoY21kX3Bhcm1zICosIGNoYXIgKiwgaW50KTsKLWNvbnN0IGNoYXIgICpzc2xfY21kX1NTTENpcGhlclN1aXRlKGNtZF9wYXJtcyAqLCBTU0xEaXJDb25maWdSZWMgKiwgY2hhciAqKTsKLWNvbnN0IGNoYXIgICpzc2xfY21kX1NTTENlcnRpZmljYXRlRmlsZShjbWRfcGFybXMgKiwgY2hhciAqLCBjaGFyICopOwotY29uc3QgY2hhciAgKnNzbF9jbWRfU1NMQ2VydGlmaWNhdGVLZXlGaWxlKGNtZF9wYXJtcyAqLCBjaGFyICosIGNoYXIgKik7Ci1jb25zdCBjaGFyICAqc3NsX2NtZF9TU0xDZXJ0aWZpY2F0ZUNoYWluRmlsZShjbWRfcGFybXMgKiwgY2hhciAqLCBjaGFyICopOwotY29uc3QgY2hhciAgKnNzbF9jbWRfU1NMQ0FDZXJ0aWZpY2F0ZVBhdGgoY21kX3Bhcm1zICosIFNTTERpckNvbmZpZ1JlYyAqLCBjaGFyICopOwotY29uc3QgY2hhciAgKnNzbF9jbWRfU1NMQ0FDZXJ0aWZpY2F0ZUZpbGUoY21kX3Bhcm1zICosIFNTTERpckNvbmZpZ1JlYyAqLCBjaGFyICopOwotY29uc3QgY2hhciAgKnNzbF9jbWRfU1NMQ0FSZXZvY2F0aW9uUGF0aChjbWRfcGFybXMgKiwgU1NMRGlyQ29uZmlnUmVjICosIGNoYXIgKik7Ci1jb25zdCBjaGFyICAqc3NsX2NtZF9TU0xDQVJldm9jYXRpb25GaWxlKGNtZF9wYXJtcyAqLCBTU0xEaXJDb25maWdSZWMgKiwgY2hhciAqKTsKLWNvbnN0IGNoYXIgICpzc2xfY21kX1NTTFZlcmlmeUNsaWVudChjbWRfcGFybXMgKiwgU1NMRGlyQ29uZmlnUmVjICosIGNoYXIgKik7Ci1jb25zdCBjaGFyICAqc3NsX2NtZF9TU0xWZXJpZnlEZXB0aChjbWRfcGFybXMgKiwgU1NMRGlyQ29uZmlnUmVjICosIGNoYXIgKik7Ci1jb25zdCBjaGFyICAqc3NsX2NtZF9TU0xTZXNzaW9uQ2FjaGUoY21kX3Bhcm1zICosIGNoYXIgKiwgY2hhciAqKTsKLWNvbnN0IGNoYXIgICpzc2xfY21kX1NTTFNlc3Npb25DYWNoZVRpbWVvdXQoY21kX3Bhcm1zICosIGNoYXIgKiwgY2hhciAqKTsKLWNvbnN0IGNoYXIgICpzc2xfY21kX1NTTExvZyhjbWRfcGFybXMgKiwgY2hhciAqLCBjaGFyICopOwotY29uc3QgY2hhciAgKnNzbF9jbWRfU1NMTG9nTGV2ZWwoY21kX3Bhcm1zICosIGNoYXIgKiwgY2hhciAqKTsKLWNvbnN0IGNoYXIgICpzc2xfY21kX1NTTFByb3RvY29sKGNtZF9wYXJtcyAqLCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci1jb25zdCBjaGFyICAqc3NsX2NtZF9TU0xPcHRpb25zKGNtZF9wYXJtcyAqLCBTU0xEaXJDb25maWdSZWMgKiwgY29uc3QgY2hhciAqKTsKLWNvbnN0IGNoYXIgICpzc2xfY21kX1NTTFJlcXVpcmVTU0woY21kX3Bhcm1zICosIFNTTERpckNvbmZpZ1JlYyAqLCBjaGFyICopOwotY29uc3QgY2hhciAgKnNzbF9jbWRfU1NMUmVxdWlyZShjbWRfcGFybXMgKiwgU1NMRGlyQ29uZmlnUmVjICosIGNoYXIgKik7Ci0jaWZkZWYgU1NMX0VYUEVSSU1FTlRBTF9QUk9YWQotY29uc3QgY2hhciAgKnNzbF9jbWRfU1NMUHJveHlQcm90b2NvbChjbWRfcGFybXMgKiwgY2hhciAqLCBjb25zdCBjaGFyICopOwotY29uc3QgY2hhciAgKnNzbF9jbWRfU1NMUHJveHlDaXBoZXJTdWl0ZShjbWRfcGFybXMgKiwgY2hhciAqLCBjaGFyICopOwotY29uc3QgY2hhciAgKnNzbF9jbWRfU1NMUHJveHlWZXJpZnkoY21kX3Bhcm1zICosIGNoYXIgKiwgaW50KTsKLWNvbnN0IGNoYXIgICpzc2xfY21kX1NTTFByb3h5VmVyaWZ5RGVwdGgoY21kX3Bhcm1zICosIGNoYXIgKiwgY2hhciAqKTsKLWNvbnN0IGNoYXIgICpzc2xfY21kX1NTTFByb3h5Q0FDZXJ0aWZpY2F0ZVBhdGgoY21kX3Bhcm1zICosIGNoYXIgKiwgY2hhciAqKTsKLWNvbnN0IGNoYXIgICpzc2xfY21kX1NTTFByb3h5Q0FDZXJ0aWZpY2F0ZUZpbGUoY21kX3Bhcm1zICosIGNoYXIgKiwgY2hhciAqKTsKLWNvbnN0IGNoYXIgICpzc2xfY21kX1NTTFByb3h5TWFjaGluZUNlcnRpZmljYXRlUGF0aChjbWRfcGFybXMgKiwgY2hhciAqLCBjaGFyICopOwotY29uc3QgY2hhciAgKnNzbF9jbWRfU1NMUHJveHlNYWNoaW5lQ2VydGlmaWNhdGVGaWxlKGNtZF9wYXJtcyAqLCBjaGFyICosIGNoYXIgKik7Ci0jZW5kaWYKLQotLyogIG1vZHVsZSBpbml0aWFsaXphdGlvbiAgKi8KLXZvaWQgICAgICAgICBzc2xfaW5pdF9Nb2R1bGUoc2VydmVyX3JlYyAqLCBwb29sICopOwotdm9pZCAgICAgICAgIHNzbF9pbml0X1NTTExpYnJhcnkodm9pZCk7Ci12b2lkICAgICAgICAgc3NsX2luaXRfRW5naW5lKHNlcnZlcl9yZWMgKiwgcG9vbCAqKTsKLXZvaWQgICAgICAgICBzc2xfaW5pdF9UbXBLZXlzSGFuZGxlKGludCwgc2VydmVyX3JlYyAqLCBwb29sICopOwotdm9pZCAgICAgICAgIHNzbF9pbml0X0NvbmZpZ3VyZVNlcnZlcihzZXJ2ZXJfcmVjICosIHBvb2wgKiwgU1NMU3J2Q29uZmlnUmVjICopOwotdm9pZCAgICAgICAgIHNzbF9pbml0X0NoZWNrU2VydmVycyhzZXJ2ZXJfcmVjICosIHBvb2wgKik7Ci1TVEFDS19PRihYNTA5X05BTUUpIAotICAgICAgICAgICAgKnNzbF9pbml0X0ZpbmRDQUxpc3Qoc2VydmVyX3JlYyAqLCBwb29sICosIGNoYXIgKiwgY2hhciAqKTsKLXZvaWQgICAgICAgICBzc2xfaW5pdF9DaGlsZChzZXJ2ZXJfcmVjICosIHBvb2wgKik7Ci12b2lkICAgICAgICAgc3NsX2luaXRfQ2hpbGRLaWxsKHZvaWQgKik7Ci12b2lkICAgICAgICAgc3NsX2luaXRfTW9kdWxlS2lsbCh2b2lkICopOwotCi0vKiAgQXBhY2hlIEFQSSBob29rcyAgKi8KLXZvaWQgICAgICAgICBzc2xfaG9va19BZGRNb2R1bGUobW9kdWxlICopOwotdm9pZCAgICAgICAgIHNzbF9ob29rX1JlbW92ZU1vZHVsZShtb2R1bGUgKik7Ci1jaGFyICAgICAgICAqc3NsX2hvb2tfUmV3cml0ZUNvbW1hbmQoY21kX3Bhcm1zICosIHZvaWQgKiwgY29uc3QgY2hhciAqKTsKLXZvaWQgICAgICAgICBzc2xfaG9va19OZXdDb25uZWN0aW9uKGNvbm5fcmVjICopOwotdm9pZCAgICAgICAgIHNzbF9ob29rX1RpbWVvdXRDb25uZWN0aW9uKGludCk7Ci12b2lkICAgICAgICAgc3NsX2hvb2tfQ2xvc2VDb25uZWN0aW9uKGNvbm5fcmVjICopOwotaW50ICAgICAgICAgIHNzbF9ob29rX1RyYW5zbGF0ZShyZXF1ZXN0X3JlYyAqKTsKLWludCAgICAgICAgICBzc2xfaG9va19BdXRoKHJlcXVlc3RfcmVjICopOwotaW50ICAgICAgICAgIHNzbF9ob29rX1VzZXJDaGVjayhyZXF1ZXN0X3JlYyAqKTsKLWludCAgICAgICAgICBzc2xfaG9va19BY2Nlc3MocmVxdWVzdF9yZWMgKik7Ci1pbnQgICAgICAgICAgc3NsX2hvb2tfRml4dXAocmVxdWVzdF9yZWMgKik7Ci1pbnQgICAgICAgICAgc3NsX2hvb2tfUmVhZFJlcShyZXF1ZXN0X3JlYyAqKTsKLWludCAgICAgICAgICBzc2xfaG9va19IYW5kbGVyKHJlcXVlc3RfcmVjICopOwotCi0vKiAgT3BlblNTTCBjYWxsYmFja3MgKi8KLVJTQSAgICAgICAgICpzc2xfY2FsbGJhY2tfVG1wUlNBKFNTTCAqLCBpbnQsIGludCk7Ci1ESCAgICAgICAgICAqc3NsX2NhbGxiYWNrX1RtcERIKFNTTCAqLCBpbnQsIGludCk7Ci1pbnQgICAgICAgICAgc3NsX2NhbGxiYWNrX1NTTFZlcmlmeShpbnQsIFg1MDlfU1RPUkVfQ1RYICopOwotaW50ICAgICAgICAgIHNzbF9jYWxsYmFja19TU0xWZXJpZnlfQ1JMKGludCwgWDUwOV9TVE9SRV9DVFggKiwgc2VydmVyX3JlYyAqKTsKLWludCAgICAgICAgICBzc2xfY2FsbGJhY2tfTmV3U2Vzc2lvbkNhY2hlRW50cnkoU1NMICosIFNTTF9TRVNTSU9OICopOwotU1NMX1NFU1NJT04gKnNzbF9jYWxsYmFja19HZXRTZXNzaW9uQ2FjaGVFbnRyeShTU0wgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQsIGludCAqKTsKLXZvaWQgICAgICAgICBzc2xfY2FsbGJhY2tfRGVsU2Vzc2lvbkNhY2hlRW50cnkoU1NMX0NUWCAqLCBTU0xfU0VTU0lPTiAqKTsKLXZvaWQgICAgICAgICBzc2xfY2FsbGJhY2tfTG9nVHJhY2luZ1N0YXRlKFNTTCAqLCBpbnQsIGludCk7Ci0KLS8qICBTZXNzaW9uIENhY2hlIFN1cHBvcnQgICovCi12b2lkICAgICAgICAgc3NsX3NjYWNoZV9pbml0KHNlcnZlcl9yZWMgKiwgcG9vbCAqKTsKLXZvaWQgICAgICAgICBzc2xfc2NhY2hlX2tpbGwoc2VydmVyX3JlYyAqKTsKLUJPT0wgICAgICAgICBzc2xfc2NhY2hlX3N0b3JlKHNlcnZlcl9yZWMgKiwgVUNIQVIgKiwgaW50LCB0aW1lX3QsIFNTTF9TRVNTSU9OICopOwotU1NMX1NFU1NJT04gKnNzbF9zY2FjaGVfcmV0cmlldmUoc2VydmVyX3JlYyAqLCBVQ0hBUiAqLCBpbnQpOwotdm9pZCAgICAgICAgIHNzbF9zY2FjaGVfcmVtb3ZlKHNlcnZlcl9yZWMgKiwgVUNIQVIgKiwgaW50KTsKLXZvaWQgICAgICAgICBzc2xfc2NhY2hlX2V4cGlyZShzZXJ2ZXJfcmVjICopOwotdm9pZCAgICAgICAgIHNzbF9zY2FjaGVfc3RhdHVzKHNlcnZlcl9yZWMgKiwgcG9vbCAqLCB2b2lkICgqKShjaGFyICosIHZvaWQgKiksIHZvaWQgKik7Ci1jaGFyICAgICAgICAqc3NsX3NjYWNoZV9pZDJzeihVQ0hBUiAqLCBpbnQpOwotdm9pZCAgICAgICAgIHNzbF9zY2FjaGVfZGJtX2luaXQoc2VydmVyX3JlYyAqLCBwb29sICopOwotdm9pZCAgICAgICAgIHNzbF9zY2FjaGVfZGJtX2tpbGwoc2VydmVyX3JlYyAqKTsKLUJPT0wgICAgICAgICBzc2xfc2NhY2hlX2RibV9zdG9yZShzZXJ2ZXJfcmVjICosIFVDSEFSICosIGludCwgdGltZV90LCBTU0xfU0VTU0lPTiAqKTsKLVNTTF9TRVNTSU9OICpzc2xfc2NhY2hlX2RibV9yZXRyaWV2ZShzZXJ2ZXJfcmVjICosIFVDSEFSICosIGludCk7Ci12b2lkICAgICAgICAgc3NsX3NjYWNoZV9kYm1fcmVtb3ZlKHNlcnZlcl9yZWMgKiwgVUNIQVIgKiwgaW50KTsKLXZvaWQgICAgICAgICBzc2xfc2NhY2hlX2RibV9leHBpcmUoc2VydmVyX3JlYyAqKTsKLXZvaWQgICAgICAgICBzc2xfc2NhY2hlX2RibV9zdGF0dXMoc2VydmVyX3JlYyAqLCBwb29sICosIHZvaWQgKCopKGNoYXIgKiwgdm9pZCAqKSwgdm9pZCAqKTsKLXZvaWQgICAgICAgICBzc2xfc2NhY2hlX3NobWh0X2luaXQoc2VydmVyX3JlYyAqLCBwb29sICopOwotdm9pZCAgICAgICAgIHNzbF9zY2FjaGVfc2htaHRfa2lsbChzZXJ2ZXJfcmVjICopOwotQk9PTCAgICAgICAgIHNzbF9zY2FjaGVfc2htaHRfc3RvcmUoc2VydmVyX3JlYyAqLCBVQ0hBUiAqLCBpbnQsIHRpbWVfdCwgU1NMX1NFU1NJT04gKik7Ci1TU0xfU0VTU0lPTiAqc3NsX3NjYWNoZV9zaG1odF9yZXRyaWV2ZShzZXJ2ZXJfcmVjICosIFVDSEFSICosIGludCk7Ci12b2lkICAgICAgICAgc3NsX3NjYWNoZV9zaG1odF9yZW1vdmUoc2VydmVyX3JlYyAqLCBVQ0hBUiAqLCBpbnQpOwotdm9pZCAgICAgICAgIHNzbF9zY2FjaGVfc2htaHRfZXhwaXJlKHNlcnZlcl9yZWMgKik7Ci12b2lkICAgICAgICAgc3NsX3NjYWNoZV9zaG1odF9zdGF0dXMoc2VydmVyX3JlYyAqLCBwb29sICosIHZvaWQgKCopKGNoYXIgKiwgdm9pZCAqKSwgdm9pZCAqKTsKLXZvaWQgICAgICAgICBzc2xfc2NhY2hlX3NobWNiX2luaXQoc2VydmVyX3JlYyAqLCBwb29sICopOwotdm9pZCAgICAgICAgIHNzbF9zY2FjaGVfc2htY2Jfa2lsbChzZXJ2ZXJfcmVjICopOwotQk9PTCAgICAgICAgIHNzbF9zY2FjaGVfc2htY2Jfc3RvcmUoc2VydmVyX3JlYyAqLCBVQ0hBUiAqLCBpbnQsIHRpbWVfdCwgU1NMX1NFU1NJT04gKik7Ci1TU0xfU0VTU0lPTiAqc3NsX3NjYWNoZV9zaG1jYl9yZXRyaWV2ZShzZXJ2ZXJfcmVjICosIFVDSEFSICosIGludCk7Ci12b2lkICAgICAgICAgc3NsX3NjYWNoZV9zaG1jYl9yZW1vdmUoc2VydmVyX3JlYyAqLCBVQ0hBUiAqLCBpbnQpOwotdm9pZCAgICAgICAgIHNzbF9zY2FjaGVfc2htY2JfZXhwaXJlKHNlcnZlcl9yZWMgKik7Ci12b2lkICAgICAgICAgc3NsX3NjYWNoZV9zaG1jYl9zdGF0dXMoc2VydmVyX3JlYyAqLCBwb29sICosIHZvaWQgKCopKGNoYXIgKiwgdm9pZCAqKSwgdm9pZCAqKTsKLQotLyogIFBhc3MgUGhyYXNlIFN1cHBvcnQgICovCi12b2lkICAgICAgICAgc3NsX3BwaHJhc2VfSGFuZGxlKHNlcnZlcl9yZWMgKiwgcG9vbCAqKTsKLWludCAgICAgICAgICBzc2xfcHBocmFzZV9IYW5kbGVfQ0IoY2hhciAqLCBpbnQsIGludCk7Ci0KLS8qICBEaWZmaWUtSGVsbG1hbiBQYXJhbWV0ZXIgU3VwcG9ydCAgKi8KLURIICAgICAgICAgICAqc3NsX2RoX0dldFRtcFBhcmFtKGludCk7Ci1ESCAgICAgICAgICAgKnNzbF9kaF9HZXRQYXJhbUZyb21GaWxlKGNoYXIgKik7Ci0KLS8qICBEYXRhIFN0cnVjdHVyZXMgKi8KLXNzbF9kc19hcnJheSAqc3NsX2RzX2FycmF5X21ha2UocG9vbCAqLCBpbnQpOwotQk9PTCAgICAgICAgICBzc2xfZHNfYXJyYXlfaXNlbXB0eShzc2xfZHNfYXJyYXkgKik7Ci12b2lkICAgICAgICAgKnNzbF9kc19hcnJheV9wdXNoKHNzbF9kc19hcnJheSAqKTsKLXZvaWQgICAgICAgICAqc3NsX2RzX2FycmF5X2dldChzc2xfZHNfYXJyYXkgKiwgaW50KTsKLXZvaWQgICAgICAgICAgc3NsX2RzX2FycmF5X3dpcGVvdXQoc3NsX2RzX2FycmF5ICopOwotdm9pZCAgICAgICAgICBzc2xfZHNfYXJyYXlfa2lsbChzc2xfZHNfYXJyYXkgKik7Ci1zc2xfZHNfdGFibGUgKnNzbF9kc190YWJsZV9tYWtlKHBvb2wgKiwgaW50KTsKLUJPT0wgICAgICAgICAgc3NsX2RzX3RhYmxlX2lzZW1wdHkoc3NsX2RzX3RhYmxlICopOwotdm9pZCAgICAgICAgICpzc2xfZHNfdGFibGVfcHVzaChzc2xfZHNfdGFibGUgKiwgY2hhciAqKTsKLXZvaWQgICAgICAgICAqc3NsX2RzX3RhYmxlX2dldChzc2xfZHNfdGFibGUgKiwgY2hhciAqKTsKLXZvaWQgICAgICAgICAgc3NsX2RzX3RhYmxlX3dpcGVvdXQoc3NsX2RzX3RhYmxlICopOwotdm9pZCAgICAgICAgICBzc2xfZHNfdGFibGVfa2lsbChzc2xfZHNfdGFibGUgKik7Ci0KLS8qICBNdXRleCBTdXBwb3J0ICAqLwotdm9pZCAgICAgICAgIHNzbF9tdXRleF9pbml0KHNlcnZlcl9yZWMgKiwgcG9vbCAqKTsKLXZvaWQgICAgICAgICBzc2xfbXV0ZXhfcmVpbml0KHNlcnZlcl9yZWMgKiwgcG9vbCAqKTsKLXZvaWQgICAgICAgICBzc2xfbXV0ZXhfb24oc2VydmVyX3JlYyAqKTsKLXZvaWQgICAgICAgICBzc2xfbXV0ZXhfb2ZmKHNlcnZlcl9yZWMgKik7Ci12b2lkICAgICAgICAgc3NsX211dGV4X2tpbGwoc2VydmVyX3JlYyAqcyk7Ci12b2lkICAgICAgICAgc3NsX211dGV4X2ZpbGVfY3JlYXRlKHNlcnZlcl9yZWMgKiwgcG9vbCAqKTsKLXZvaWQgICAgICAgICBzc2xfbXV0ZXhfZmlsZV9vcGVuKHNlcnZlcl9yZWMgKiwgcG9vbCAqKTsKLXZvaWQgICAgICAgICBzc2xfbXV0ZXhfZmlsZV9yZW1vdmUodm9pZCAqKTsKLUJPT0wgICAgICAgICBzc2xfbXV0ZXhfZmlsZV9hY3F1aXJlKHZvaWQpOwotQk9PTCAgICAgICAgIHNzbF9tdXRleF9maWxlX3JlbGVhc2Uodm9pZCk7Ci12b2lkICAgICAgICAgc3NsX211dGV4X3NlbV9jcmVhdGUoc2VydmVyX3JlYyAqLCBwb29sICopOwotdm9pZCAgICAgICAgIHNzbF9tdXRleF9zZW1fb3BlbihzZXJ2ZXJfcmVjICosIHBvb2wgKik7Ci12b2lkICAgICAgICAgc3NsX211dGV4X3NlbV9yZW1vdmUodm9pZCAqKTsKLUJPT0wgICAgICAgICBzc2xfbXV0ZXhfc2VtX2FjcXVpcmUodm9pZCk7Ci1CT09MICAgICAgICAgc3NsX211dGV4X3NlbV9yZWxlYXNlKHZvaWQpOwotCi0vKiAgTG9nZmlsZSBTdXBwb3J0ICAqLwotdm9pZCAgICAgICAgIHNzbF9sb2dfb3BlbihzZXJ2ZXJfcmVjICosIHNlcnZlcl9yZWMgKiwgcG9vbCAqKTsKLUJPT0wgICAgICAgICBzc2xfbG9nX2FwcGxpZXMoc2VydmVyX3JlYyAqLCBpbnQpOwotdm9pZCAgICAgICAgIHNzbF9sb2coc2VydmVyX3JlYyAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgLi4uKTsKLXZvaWQgICAgICAgICBzc2xfZGllKHZvaWQpOwotCi0vKiAgVmFyaWFibGVzICAqLwotdm9pZCAgICAgICAgIHNzbF92YXJfcmVnaXN0ZXIodm9pZCk7Ci12b2lkICAgICAgICAgc3NsX3Zhcl91bnJlZ2lzdGVyKHZvaWQpOwotY2hhciAgICAgICAgKnNzbF92YXJfbG9va3VwKHBvb2wgKiwgc2VydmVyX3JlYyAqLCBjb25uX3JlYyAqLCByZXF1ZXN0X3JlYyAqLCBjaGFyICopOwotCi0vKiAgSS9PICAqLwotdm9pZCAgICAgICAgIHNzbF9pb19yZWdpc3Rlcih2b2lkKTsKLXZvaWQgICAgICAgICBzc2xfaW9fdW5yZWdpc3Rlcih2b2lkKTsKLWxvbmcgICAgICAgICBzc2xfaW9fZGF0YV9jYihCSU8gKiwgaW50LCBjb25zdCBjaGFyICosIGludCwgbG9uZywgbG9uZyk7Ci0jaWZuZGVmIFNTTF9DT05TRVJWQVRJVkUKLXZvaWQgICAgICAgICBzc2xfaW9fc3VjayhyZXF1ZXN0X3JlYyAqLCBTU0wgKik7Ci0jZW5kaWYKLQotLyogIFBSTkcgICovCi1pbnQgICAgICAgICAgc3NsX3JhbmRfc2VlZChzZXJ2ZXJfcmVjICosIHBvb2wgKiwgc3NsX3JzY3R4X3QsIGNoYXIgKik7Ci0KLS8qICBFeHRlbnNpb25zICAqLwotdm9pZCAgICAgICAgIHNzbF9leHRfcmVnaXN0ZXIodm9pZCk7Ci12b2lkICAgICAgICAgc3NsX2V4dF91bnJlZ2lzdGVyKHZvaWQpOwotCi0vKiAgQ29tcGF0aWJpbGl0eSAgKi8KLSNpZmRlZiBTU0xfQ09NUEFUCi1jaGFyICAgICAgICAqc3NsX2NvbXBhdF9kaXJlY3RpdmUoc2VydmVyX3JlYyAqLCBwb29sICosIGNvbnN0IGNoYXIgKik7Ci12b2lkICAgICAgICAgc3NsX2NvbXBhdF92YXJpYWJsZXMocmVxdWVzdF9yZWMgKik7Ci0jZW5kaWYKLQotLyogIFV0aWxpdHkgRnVuY3Rpb25zICAqLwotY2hhciAgICAgICAgKnNzbF91dGlsX3NlcnZlcl9yb290X3JlbGF0aXZlKHBvb2wgKiwgY2hhciAqLCBjaGFyICopOwotY2hhciAgICAgICAgKnNzbF91dGlsX3Zob3N0aWQocG9vbCAqLCBzZXJ2ZXJfcmVjICopOwotdm9pZCAgICAgICAgIHNzbF91dGlsX3N0cnVwcGVyKGNoYXIgKik7Ci12b2lkICAgICAgICAgc3NsX3V0aWxfdXVlbmNvZGUoY2hhciAqLCBjb25zdCBjaGFyICosIEJPT0wpOwotdm9pZCAgICAgICAgIHNzbF91dGlsX3V1ZW5jb2RlX2JpbmFyeSh1bnNpZ25lZCBjaGFyICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgaW50LCBCT09MKTsKLUZJTEUgICAgICAgICpzc2xfdXRpbF9wcG9wZW4oc2VydmVyX3JlYyAqLCBwb29sICosIGNoYXIgKik7Ci1pbnQgICAgICAgICAgc3NsX3V0aWxfcHBvcGVuX2NoaWxkKHZvaWQgKiwgY2hpbGRfaW5mbyAqKTsKLXZvaWQgICAgICAgICBzc2xfdXRpbF9wcGNsb3NlKHNlcnZlcl9yZWMgKiwgcG9vbCAqLCBGSUxFICopOwotY2hhciAgICAgICAgKnNzbF91dGlsX3JlYWRmaWx0ZXIoc2VydmVyX3JlYyAqLCBwb29sICosIGNoYXIgKik7Ci1CT09MICAgICAgICAgc3NsX3V0aWxfcGF0aF9jaGVjayhzc2xfcGF0aGNoZWNrX3QsIGNoYXIgKik7Ci1zc2xfYWxnb190ICAgc3NsX3V0aWxfYWxnb3R5cGVvZihYNTA5ICosIEVWUF9QS0VZICopOyAKLWNoYXIgICAgICAgICpzc2xfdXRpbF9hbGdvdHlwZXN0cihzc2xfYWxnb190KTsKLWNoYXIgICAgICAgICpzc2xfdXRpbF9wdHh0c3ViKHBvb2wgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNoYXIgKik7Ci12b2lkICAgICAgICAgc3NsX3V0aWxfdGhyZWFkX3NldHVwKHZvaWQpOwotCi0vKiAgVmVuZG9yIGV4dGVuc2lvbiBzdXBwb3J0ICAqLwotI2lmIGRlZmluZWQoU1NMX1ZFTkRPUikgJiYgZGVmaW5lZChTU0xfVkVORE9SX09CSlMpCi12b2lkICAgICAgICAgc3NsX3ZlbmRvcl9yZWdpc3Rlcih2b2lkKTsKLXZvaWQgICAgICAgICBzc2xfdmVuZG9yX3VucmVnaXN0ZXIodm9pZCk7Ci0jZW5kaWYKLQotI2VuZGlmIC8qIE1PRF9TU0xfSCAqLwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zc2wvc3NsX2VuZ2luZV9jb25maWcuYyBiL21vZHVsZXMvc3NsL3NzbF9lbmdpbmVfY29uZmlnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NzM0MGIuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9zc2wvc3NsX2VuZ2luZV9jb25maWcuYworKysgL2Rldi9udWxsCkBAIC0xLDEwOTMgKzAsMCBAQAotLyogICAgICAgICAgICAgICAgICAgICAgXyAgICAgICAgICAgICBfCi0qKiAgXyBfXyBfX18gICBfX18gICBfX3wgfCAgICBfX18gX19ffCB8ICBtb2Rfc3NsCi0qKiB8ICdfIGAgXyBcIC8gXyBcIC8gX2AgfCAgIC8gX18vIF9ffCB8ICBBcGFjaGUgSW50ZXJmYWNlIHRvIE9wZW5TU0wKLSoqIHwgfCB8IHwgfCB8IChfKSB8IChffCB8ICAgXF9fIFxfXyBcIHwgIHd3dy5tb2Rzc2wub3JnCi0qKiB8X3wgfF98IHxffFxfX18vIFxfXyxffF9fX3xfX18vX19fL198ICBmdHAubW9kc3NsLm9yZwotKiogICAgICAgICAgICAgICAgICAgICAgfF9fX19ffAotKiogIHNzbF9lbmdpbmVfY29uZmlnLmMKLSoqICBBcGFjaGUgQ29uZmlndXJhdGlvbiBEaXJlY3RpdmVzCi0qLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgUmFsZiBTLiBFbmdlbHNjaGFsbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLSAqICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLSAqICAgICBSYWxmIFMuIEVuZ2Vsc2NoYWxsIDxyc2VAZW5nZWxzY2hhbGwuY29tPiBmb3IgdXNlIGluIHRoZQotICogICAgIG1vZF9zc2wgcHJvamVjdCAoaHR0cDovL3d3dy5tb2Rzc2wub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAibW9kX3NzbCIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIHJzZUBlbmdlbHNjaGFsbC5jb20uCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIm1vZF9zc2wiCi0gKiAgICBub3IgbWF5ICJtb2Rfc3NsIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvcgotICogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFJhbGYgUy4gRW5nZWxzY2hhbGwuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotICogICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+IGZvciB1c2UgaW4gdGhlCi0gKiAgICAgbW9kX3NzbCBwcm9qZWN0IChodHRwOi8vd3d3Lm1vZHNzbC5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBSQUxGIFMuIEVOR0VMU0NIQUxMIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBSQUxGIFMuIEVOR0VMU0NIQUxMIE9SCi0gKiBISVMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBgYERhbW5lZCBpZiB5b3UgZG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFtbmVkIGlmIHlvdSBkb24ndC4nJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBVbmtub3duICAgICAgICAqLwotI2luY2x1ZGUgIm1vZF9zc2wuaCIKLQotCi0vKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgU3VwcG9ydCBmb3IgR2xvYmFsIENvbmZpZ3VyYXRpb24KLSoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKi8KLQotdm9pZCBzc2xfaG9va19BZGRNb2R1bGUobW9kdWxlICptKQotewotICAgIGlmIChtID09ICZzc2xfbW9kdWxlKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEFubm91bmNlIHVzIGZvciB0aGUgY29uZmlndXJhdGlvbiBmaWxlcwotICAgICAgICAgKi8KLSAgICAgICAgYXBfYWRkX2NvbmZpZ19kZWZpbmUoIk1PRF9TU0wiKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBMaW5rIG91cnNlbGYgaW50byB0aGUgQXBhY2hlIGtlcm5lbAotICAgICAgICAgKi8KLSAgICAgICAgc3NsX3Zhcl9yZWdpc3RlcigpOwotICAgICAgICBzc2xfZXh0X3JlZ2lzdGVyKCk7Ci0gICAgICAgIHNzbF9pb19yZWdpc3RlcigpOwotI2lmIGRlZmluZWQoU1NMX1ZFTkRPUikgJiYgZGVmaW5lZChTU0xfVkVORE9SX09CSlMpCi0gICAgICAgIHNzbF92ZW5kb3JfcmVnaXN0ZXIoKTsKLSNlbmRpZgotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLXZvaWQgc3NsX2hvb2tfUmVtb3ZlTW9kdWxlKG1vZHVsZSAqbSkKLXsKLSAgICBpZiAobSA9PSAmc3NsX21vZHVsZSkgewotICAgICAgICAvKgotICAgICAgICAgKiBVbmxpbmsgb3Vyc2VsZiBmcm9tIHRoZSBBcGFjaGUga2VybmVsCi0gICAgICAgICAqLwotICAgICAgICBzc2xfdmFyX3VucmVnaXN0ZXIoKTsKLSAgICAgICAgc3NsX2V4dF91bnJlZ2lzdGVyKCk7Ci0gICAgICAgIHNzbF9pb191bnJlZ2lzdGVyKCk7Ci0jaWYgZGVmaW5lZChTU0xfVkVORE9SKSAmJiBkZWZpbmVkKFNTTF9WRU5ET1JfT0JKUykKLSAgICAgICAgc3NsX3ZlbmRvcl91bnJlZ2lzdGVyKCk7Ci0jZW5kaWYKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi12b2lkIHNzbF9jb25maWdfZ2xvYmFsX2NyZWF0ZSh2b2lkKQotewotICAgIHBvb2wgKnBQb29sOwotICAgIFNTTE1vZENvbmZpZ1JlYyAqbWM7Ci0KLSAgICBtYyA9IGFwX2N0eF9nZXQoYXBfZ2xvYmFsX2N0eCwgInNzbF9tb2R1bGUiKTsKLSAgICBpZiAobWMgPT0gTlVMTCkgewotICAgICAgICAvKgotICAgICAgICAgKiBhbGxvY2F0ZSBhbiBvd24gc3VicG9vbCB3aGljaCBzdXJ2aXZlcyBzZXJ2ZXIgcmVzdGFydHMKLSAgICAgICAgICovCi0gICAgICAgIHBQb29sID0gYXBfbWFrZV9zdWJfcG9vbChOVUxMKTsKLSAgICAgICAgbWMgPSAoU1NMTW9kQ29uZmlnUmVjICopYXBfcGFsbG9jKHBQb29sLCBzaXplb2YoU1NMTW9kQ29uZmlnUmVjKSk7Ci0gICAgICAgIG1jLT5wUG9vbCA9IHBQb29sOwotICAgICAgICBtYy0+YkZpeGVkID0gRkFMU0U7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogaW5pdGlhbGl6ZSBwZXItbW9kdWxlIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICovCi0gICAgICAgIG1jLT5uSW5pdENvdW50ICAgICAgICAgICAgID0gMDsKLSAgICAgICAgbWMtPm5TZXNzaW9uQ2FjaGVNb2RlICAgICAgPSBTU0xfU0NNT0RFX1VOU0VUOwotICAgICAgICBtYy0+c3pTZXNzaW9uQ2FjaGVEYXRhRmlsZSA9IE5VTEw7Ci0gICAgICAgIG1jLT5uU2Vzc2lvbkNhY2hlRGF0YVNpemUgID0gMDsKLSAgICAgICAgbWMtPnBTZXNzaW9uQ2FjaGVEYXRhTU0gICAgPSBOVUxMOwotICAgICAgICBtYy0+dFNlc3Npb25DYWNoZURhdGFUYWJsZSA9IE5VTEw7Ci0gICAgICAgIG1jLT5uTXV0ZXhNb2RlICAgICAgICAgICAgID0gU1NMX01VVEVYTU9ERV9VTlNFVDsKLSAgICAgICAgbWMtPnN6TXV0ZXhGaWxlICAgICAgICAgICAgPSBOVUxMOwotICAgICAgICBtYy0+bk11dGV4RkQgICAgICAgICAgICAgICA9IC0xOwotICAgICAgICBtYy0+bk11dGV4U0VNSUQgICAgICAgICAgICA9IC0xOwotICAgICAgICBtYy0+YVJhbmRTZWVkICAgICAgICAgICAgICA9IGFwX21ha2VfYXJyYXkocFBvb2wsIDQsIHNpemVvZihzc2xfcmFuZHNlZWRfdCkpOwotICAgICAgICBtYy0+dFByaXZhdGVLZXkgICAgICAgICAgICA9IHNzbF9kc190YWJsZV9tYWtlKHBQb29sLCBzaXplb2Yoc3NsX2FzbjFfdCkpOwotICAgICAgICBtYy0+dFB1YmxpY0NlcnQgICAgICAgICAgICA9IHNzbF9kc190YWJsZV9tYWtlKHBQb29sLCBzaXplb2Yoc3NsX2FzbjFfdCkpOwotICAgICAgICBtYy0+dFRtcEtleXMgICAgICAgICAgICAgICA9IHNzbF9kc190YWJsZV9tYWtlKHBQb29sLCBzaXplb2Yoc3NsX2FzbjFfdCkpOwotI2lmZGVmIFNTTF9FWFBFUklNRU5UQUxfRU5HSU5FCi0gICAgICAgIG1jLT5zekNyeXB0b0RldmljZSAgICAgICAgID0gTlVMTDsKLSNlbmRpZgotCi0gICAgICAgICh2b2lkKW1lbXNldChtYy0+cFRtcEtleXMsIDAsIFNTTF9US1BJRFhfTUFYKnNpemVvZih2b2lkICopKTsKLQotI2lmZGVmIFNTTF9WRU5ET1IKLSAgICAgICAgbWMtPmN0eCA9IGFwX2N0eF9uZXcocFBvb2wpOwotICAgICAgICBhcF9ob29rX3VzZSgiYXA6Om1vZF9zc2w6OnZlbmRvcjo6Y29uZmlnX2dsb2JhbF9jcmVhdGUiLAotICAgICAgICAgICAgICAgIEFQX0hPT0tfU0lHMih2b2lkLHB0ciksIEFQX0hPT0tfTU9ERV9BTEwsIG1jKTsKLSNlbmRpZgotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEFuZCBwdXNoIGl0IGludG8gQXBhY2hlJ3MgZ2xvYmFsIGNvbnRleHQKLSAgICAgICAgICovCi0gICAgICAgIGFwX2N0eF9zZXQoYXBfZ2xvYmFsX2N0eCwgInNzbF9tb2R1bGUiLCBtYyk7Ci0gICAgfQotICAgIHJldHVybjsKLX0KLQotdm9pZCBzc2xfY29uZmlnX2dsb2JhbF9maXgodm9pZCkKLXsKLSAgICBTU0xNb2RDb25maWdSZWMgKm1jID0gbXlNb2RDb25maWcoKTsKLSAgICBtYy0+YkZpeGVkID0gVFJVRTsKLSAgICByZXR1cm47Ci19Ci0KLUJPT0wgc3NsX2NvbmZpZ19nbG9iYWxfaXNmaXhlZCh2b2lkKQotewotICAgIFNTTE1vZENvbmZpZ1JlYyAqbWMgPSBteU1vZENvbmZpZygpOwotICAgIHJldHVybiAobWMtPmJGaXhlZCk7Ci19Ci0KLQotLyogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogIENvbmZpZ3VyYXRpb24gaGFuZGxpbmcKLSoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKi8KLQotLyoKLSAqICBDcmVhdGUgcGVyLXNlcnZlciBTU0wgY29uZmlndXJhdGlvbgotICovCi12b2lkICpzc2xfY29uZmlnX3NlcnZlcl9jcmVhdGUocG9vbCAqcCwgc2VydmVyX3JlYyAqcykKLXsKLSAgICBTU0xTcnZDb25maWdSZWMgKnNjOwotCi0gICAgc3NsX2NvbmZpZ19nbG9iYWxfY3JlYXRlKCk7Ci0KLSAgICBzYyA9IGFwX3BhbGxvYyhwLCBzaXplb2YoU1NMU3J2Q29uZmlnUmVjKSk7Ci0gICAgc2MtPmJFbmFibGVkICAgICAgICAgICAgICAgPSBVTlNFVDsKLSAgICBzYy0+c3pDQUNlcnRpZmljYXRlUGF0aCAgICA9IE5VTEw7Ci0gICAgc2MtPnN6Q0FDZXJ0aWZpY2F0ZUZpbGUgICAgPSBOVUxMOwotICAgIHNjLT5zekNlcnRpZmljYXRlQ2hhaW4gICAgID0gTlVMTDsKLSAgICBzYy0+c3pMb2dGaWxlICAgICAgICAgICAgICA9IE5VTEw7Ci0gICAgc2MtPnN6Q2lwaGVyU3VpdGUgICAgICAgICAgPSBOVUxMOwotICAgIHNjLT5uTG9nTGV2ZWwgICAgICAgICAgICAgID0gU1NMX0xPR19OT05FOwotICAgIHNjLT5uVmVyaWZ5RGVwdGggICAgICAgICAgID0gVU5TRVQ7Ci0gICAgc2MtPm5WZXJpZnlDbGllbnQgICAgICAgICAgPSBTU0xfQ1ZFUklGWV9VTlNFVDsKLSAgICBzYy0+blNlc3Npb25DYWNoZVRpbWVvdXQgICA9IFVOU0VUOwotICAgIHNjLT5uUGFzc1BocmFzZURpYWxvZ1R5cGUgID0gU1NMX1BQVFlQRV9VTlNFVDsKLSAgICBzYy0+c3pQYXNzUGhyYXNlRGlhbG9nUGF0aCA9IE5VTEw7Ci0gICAgc2MtPm5Qcm90b2NvbCAgICAgICAgICAgICAgPSBTU0xfUFJPVE9DT0xfQUxMOwotICAgIHNjLT5maWxlTG9nRmlsZSAgICAgICAgICAgID0gTlVMTDsKLSAgICBzYy0+cFNTTEN0eCAgICAgICAgICAgICAgICA9IE5VTEw7Ci0gICAgc2MtPnN6Q0FSZXZvY2F0aW9uUGF0aCAgICAgPSBOVUxMOwotICAgIHNjLT5zekNBUmV2b2NhdGlvbkZpbGUgICAgID0gTlVMTDsKLSAgICBzYy0+cFJldm9jYXRpb25TdG9yZSAgICAgICA9IE5VTEw7Ci0KLSNpZmRlZiBTU0xfRVhQRVJJTUVOVEFMX1BST1hZCi0gICAgc2MtPm5Qcm94eVZlcmlmeURlcHRoICAgICAgICAgICAgID0gVU5TRVQ7Ci0gICAgc2MtPnN6UHJveHlDQUNlcnRpZmljYXRlUGF0aCAgICAgID0gTlVMTDsKLSAgICBzYy0+c3pQcm94eUNBQ2VydGlmaWNhdGVGaWxlICAgICAgPSBOVUxMOwotICAgIHNjLT5zelByb3h5Q2xpZW50Q2VydGlmaWNhdGVGaWxlICA9IE5VTEw7Ci0gICAgc2MtPnN6UHJveHlDbGllbnRDZXJ0aWZpY2F0ZVBhdGggID0gTlVMTDsKLSAgICBzYy0+c3pQcm94eUNpcGhlclN1aXRlICAgICAgICAgICAgPSBOVUxMOwotICAgIHNjLT5uUHJveHlQcm90b2NvbCAgICAgICAgICAgICAgICA9IFNTTF9QUk9UT0NPTF9BTEwgJiB+U1NMX1BST1RPQ09MX1RMU1YxOwotICAgIHNjLT5iUHJveHlWZXJpZnkgICAgICAgICAgICAgICAgICA9IFVOU0VUOwotICAgIHNjLT5wU1NMUHJveHlDdHggICAgICAgICAgICAgICAgICA9IE5VTEw7Ci0jZW5kaWYKLQotICAgICh2b2lkKW1lbXNldChzYy0+c3pQdWJsaWNDZXJ0RmlsZSwgMCwgU1NMX0FJRFhfTUFYKnNpemVvZihjaGFyICopKTsKLSAgICAodm9pZCltZW1zZXQoc2MtPnN6UHJpdmF0ZUtleUZpbGUsIDAsIFNTTF9BSURYX01BWCpzaXplb2YoY2hhciAqKSk7Ci0gICAgKHZvaWQpbWVtc2V0KHNjLT5wUHVibGljQ2VydCwgMCwgU1NMX0FJRFhfTUFYKnNpemVvZihYNTA5ICopKTsKLSAgICAodm9pZCltZW1zZXQoc2MtPnBQcml2YXRlS2V5LCAwLCBTU0xfQUlEWF9NQVgqc2l6ZW9mKEVWUF9QS0VZICopKTsKLQotI2lmZGVmIFNTTF9WRU5ET1IKLSAgICBzYy0+Y3R4ID0gYXBfY3R4X25ldyhwKTsKLSAgICBhcF9ob29rX3VzZSgiYXA6Om1vZF9zc2w6OnZlbmRvcjo6Y29uZmlnX3NlcnZlcl9jcmVhdGUiLAotICAgICAgICAgICAgICAgIEFQX0hPT0tfU0lHNCh2b2lkLHB0cixwdHIscHRyKSwgQVBfSE9PS19NT0RFX0FMTCwKLSAgICAgICAgICAgICAgICBwLCBzLCBzYyk7Ci0jZW5kaWYKLQotICAgIHJldHVybiBzYzsKLX0KLQotLyoKLSAqICBNZXJnZSBwZXItc2VydmVyIFNTTCBjb25maWd1cmF0aW9ucwotICovCi12b2lkICpzc2xfY29uZmlnX3NlcnZlcl9tZXJnZShwb29sICpwLCB2b2lkICpiYXNldiwgdm9pZCAqYWRkdikKLXsKLSAgICBTU0xTcnZDb25maWdSZWMgKmJhc2UgPSAoU1NMU3J2Q29uZmlnUmVjICopYmFzZXY7Ci0gICAgU1NMU3J2Q29uZmlnUmVjICphZGQgID0gKFNTTFNydkNvbmZpZ1JlYyAqKWFkZHY7Ci0gICAgU1NMU3J2Q29uZmlnUmVjICpuZXcgID0gKFNTTFNydkNvbmZpZ1JlYyAqKWFwX3BhbGxvYyhwLCBzaXplb2YoU1NMU3J2Q29uZmlnUmVjKSk7Ci0gICAgaW50IGk7Ci0KLSAgICBjZmdNZXJnZUJvb2woYkVuYWJsZWQpOwotICAgIGNmZ01lcmdlU3RyaW5nKHN6Q0FDZXJ0aWZpY2F0ZVBhdGgpOwotICAgIGNmZ01lcmdlU3RyaW5nKHN6Q0FDZXJ0aWZpY2F0ZUZpbGUpOwotICAgIGNmZ01lcmdlU3RyaW5nKHN6Q2VydGlmaWNhdGVDaGFpbik7Ci0gICAgY2ZnTWVyZ2VTdHJpbmcoc3pMb2dGaWxlKTsKLSAgICBjZmdNZXJnZVN0cmluZyhzekNpcGhlclN1aXRlKTsKLSAgICBjZmdNZXJnZShuTG9nTGV2ZWwsIFNTTF9MT0dfTk9ORSk7Ci0gICAgY2ZnTWVyZ2VJbnQoblZlcmlmeURlcHRoKTsKLSAgICBjZmdNZXJnZShuVmVyaWZ5Q2xpZW50LCBTU0xfQ1ZFUklGWV9VTlNFVCk7Ci0gICAgY2ZnTWVyZ2VJbnQoblNlc3Npb25DYWNoZVRpbWVvdXQpOwotICAgIGNmZ01lcmdlKG5QYXNzUGhyYXNlRGlhbG9nVHlwZSwgU1NMX1BQVFlQRV9VTlNFVCk7Ci0gICAgY2ZnTWVyZ2VTdHJpbmcoc3pQYXNzUGhyYXNlRGlhbG9nUGF0aCk7Ci0gICAgY2ZnTWVyZ2UoblByb3RvY29sLCBTU0xfUFJPVE9DT0xfQUxMKTsKLSAgICBjZmdNZXJnZShmaWxlTG9nRmlsZSwgTlVMTCk7Ci0gICAgY2ZnTWVyZ2UocFNTTEN0eCwgTlVMTCk7Ci0gICAgY2ZnTWVyZ2Uoc3pDQVJldm9jYXRpb25QYXRoLCBOVUxMKTsKLSAgICBjZmdNZXJnZShzekNBUmV2b2NhdGlvbkZpbGUsIE5VTEwpOwotICAgIGNmZ01lcmdlKHBSZXZvY2F0aW9uU3RvcmUsIE5VTEwpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IFNTTF9BSURYX01BWDsgaSsrKSB7Ci0gICAgICAgIGNmZ01lcmdlU3RyaW5nKHN6UHVibGljQ2VydEZpbGVbaV0pOwotICAgICAgICBjZmdNZXJnZVN0cmluZyhzelByaXZhdGVLZXlGaWxlW2ldKTsKLSAgICAgICAgY2ZnTWVyZ2UocFB1YmxpY0NlcnRbaV0sIE5VTEwpOwotICAgICAgICBjZmdNZXJnZShwUHJpdmF0ZUtleVtpXSwgTlVMTCk7Ci0gICAgfQotCi0jaWZkZWYgU1NMX1ZFTkRPUgotICAgIGNmZ01lcmdlQ3R4KGN0eCk7Ci0gICAgYXBfaG9va191c2UoImFwOjptb2Rfc3NsOjp2ZW5kb3I6OmNvbmZpZ19zZXJ2ZXJfbWVyZ2UiLAotICAgICAgICAgICAgICAgIEFQX0hPT0tfU0lHNSh2b2lkLHB0cixwdHIscHRyLHB0ciksIEFQX0hPT0tfTU9ERV9BTEwsCi0gICAgICAgICAgICAgICAgcCwgYmFzZSwgYWRkLCBuZXcpOwotI2VuZGlmCi0KLSNpZmRlZiBTU0xfRVhQRVJJTUVOVEFMX1BST1hZCi0gICAgY2ZnTWVyZ2VJbnQoblByb3h5VmVyaWZ5RGVwdGgpOwotICAgIGNmZ01lcmdlU3RyaW5nKHN6UHJveHlDQUNlcnRpZmljYXRlUGF0aCk7Ci0gICAgY2ZnTWVyZ2VTdHJpbmcoc3pQcm94eUNBQ2VydGlmaWNhdGVGaWxlKTsKLSAgICBjZmdNZXJnZVN0cmluZyhzelByb3h5Q2xpZW50Q2VydGlmaWNhdGVGaWxlKTsKLSAgICBjZmdNZXJnZVN0cmluZyhzelByb3h5Q2xpZW50Q2VydGlmaWNhdGVQYXRoKTsKLSAgICBjZmdNZXJnZVN0cmluZyhzelByb3h5Q2lwaGVyU3VpdGUpOwotICAgIGNmZ01lcmdlKG5Qcm94eVByb3RvY29sLCAoU1NMX1BST1RPQ09MX0FMTCAmIH5TU0xfUFJPVE9DT0xfVExTVjEpKTsKLSAgICBjZmdNZXJnZUJvb2woYlByb3h5VmVyaWZ5KTsKLSAgICBjZmdNZXJnZShwU1NMUHJveHlDdHgsIE5VTEwpOwotI2VuZGlmCi0KLSAgICByZXR1cm4gbmV3OwotfQotCi0vKgotICogIENyZWF0ZSBwZXItZGlyZWN0b3J5IFNTTCBjb25maWd1cmF0aW9uCi0gKi8KLXZvaWQgKnNzbF9jb25maWdfcGVyZGlyX2NyZWF0ZShwb29sICpwLCBjaGFyICpkaXIpCi17Ci0gICAgU1NMRGlyQ29uZmlnUmVjICpkYyA9IGFwX3BhbGxvYyhwLCBzaXplb2YoU1NMRGlyQ29uZmlnUmVjKSk7Ci0KLSAgICBkYy0+YlNTTFJlcXVpcmVkICA9IEZBTFNFOwotICAgIGRjLT5hUmVxdWlyZW1lbnQgID0gYXBfbWFrZV9hcnJheShwLCA0LCBzaXplb2Yoc3NsX3JlcXVpcmVfdCkpOwotICAgIGRjLT5uT3B0aW9ucyAgICAgID0gU1NMX09QVF9OT05FfFNTTF9PUFRfUkVMU0VUOwotICAgIGRjLT5uT3B0aW9uc0FkZCAgID0gU1NMX09QVF9OT05FOwotICAgIGRjLT5uT3B0aW9uc0RlbCAgID0gU1NMX09QVF9OT05FOwotCi0gICAgZGMtPnN6Q2lwaGVyU3VpdGUgICAgICAgICAgPSBOVUxMOwotICAgIGRjLT5uVmVyaWZ5Q2xpZW50ICAgICAgICAgID0gU1NMX0NWRVJJRllfVU5TRVQ7Ci0gICAgZGMtPm5WZXJpZnlEZXB0aCAgICAgICAgICAgPSBVTlNFVDsKLSNpZmRlZiBTU0xfRVhQRVJJTUVOVEFMX1BFUkRJUkNBCi0gICAgZGMtPnN6Q0FDZXJ0aWZpY2F0ZVBhdGggICAgPSBOVUxMOwotICAgIGRjLT5zekNBQ2VydGlmaWNhdGVGaWxlICAgID0gTlVMTDsKLSNlbmRpZgotCi0jaWZkZWYgU1NMX1ZFTkRPUgotICAgIGRjLT5jdHggPSBhcF9jdHhfbmV3KHApOwotICAgIGFwX2hvb2tfdXNlKCJhcDo6bW9kX3NzbDo6dmVuZG9yOjpjb25maWdfcGVyZGlyX2NyZWF0ZSIsCi0gICAgICAgICAgICAgICAgQVBfSE9PS19TSUc0KHZvaWQscHRyLHB0cixwdHIpLCBBUF9IT09LX01PREVfQUxMLAotICAgICAgICAgICAgICAgIHAsIGRpciwgZGMpOwotI2VuZGlmCi0KLSAgICByZXR1cm4gZGM7Ci19Ci0KLS8qCi0gKiAgTWVyZ2UgcGVyLWRpcmVjdG9yeSBTU0wgY29uZmlndXJhdGlvbnMKLSAqLwotdm9pZCAqc3NsX2NvbmZpZ19wZXJkaXJfbWVyZ2UocG9vbCAqcCwgdm9pZCAqYmFzZXYsIHZvaWQgKmFkZHYpCi17Ci0gICAgU1NMRGlyQ29uZmlnUmVjICpiYXNlID0gKFNTTERpckNvbmZpZ1JlYyAqKWJhc2V2OwotICAgIFNTTERpckNvbmZpZ1JlYyAqYWRkICA9IChTU0xEaXJDb25maWdSZWMgKilhZGR2OwotICAgIFNTTERpckNvbmZpZ1JlYyAqbmV3ICA9IChTU0xEaXJDb25maWdSZWMgKilhcF9wYWxsb2MocCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFNTTERpckNvbmZpZ1JlYykpOwotCi0gICAgY2ZnTWVyZ2UoYlNTTFJlcXVpcmVkLCBGQUxTRSk7Ci0gICAgY2ZnTWVyZ2VBcnJheShhUmVxdWlyZW1lbnQpOwotCi0gICAgaWYgKGFkZC0+bk9wdGlvbnMgJiBTU0xfT1BUX1JFTFNFVCkgewotICAgICAgICBuZXctPm5PcHRpb25zQWRkID0gKGJhc2UtPm5PcHRpb25zQWRkICYgfihhZGQtPm5PcHRpb25zRGVsKSkgfCBhZGQtPm5PcHRpb25zQWRkOwotICAgICAgICBuZXctPm5PcHRpb25zRGVsID0gKGJhc2UtPm5PcHRpb25zRGVsICYgfihhZGQtPm5PcHRpb25zQWRkKSkgfCBhZGQtPm5PcHRpb25zRGVsOwotICAgICAgICBuZXctPm5PcHRpb25zICAgID0gKGJhc2UtPm5PcHRpb25zICAgICYgfihuZXctPm5PcHRpb25zRGVsKSkgfCBuZXctPm5PcHRpb25zQWRkOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgbmV3LT5uT3B0aW9ucyAgICA9IGFkZC0+bk9wdGlvbnM7Ci0gICAgICAgIG5ldy0+bk9wdGlvbnNBZGQgPSBhZGQtPm5PcHRpb25zQWRkOwotICAgICAgICBuZXctPm5PcHRpb25zRGVsID0gYWRkLT5uT3B0aW9uc0RlbDsKLSAgICB9Ci0KLSAgICBjZmdNZXJnZVN0cmluZyhzekNpcGhlclN1aXRlKTsKLSAgICBjZmdNZXJnZShuVmVyaWZ5Q2xpZW50LCBTU0xfQ1ZFUklGWV9VTlNFVCk7Ci0gICAgY2ZnTWVyZ2VJbnQoblZlcmlmeURlcHRoKTsKLSNpZmRlZiBTU0xfRVhQRVJJTUVOVEFMX1BFUkRJUkNBCi0gICAgY2ZnTWVyZ2VTdHJpbmcoc3pDQUNlcnRpZmljYXRlUGF0aCk7Ci0gICAgY2ZnTWVyZ2VTdHJpbmcoc3pDQUNlcnRpZmljYXRlRmlsZSk7Ci0jZW5kaWYKLQotI2lmZGVmIFNTTF9WRU5ET1IKLSAgICBjZmdNZXJnZUN0eChjdHgpOwotICAgIGFwX2hvb2tfdXNlKCJhcDo6bW9kX3NzbDo6dmVuZG9yOjpjb25maWdfcGVyZGlyX21lcmdlIiwKLSAgICAgICAgICAgICAgICBBUF9IT09LX1NJRzUodm9pZCxwdHIscHRyLHB0cixwdHIpLCBBUF9IT09LX01PREVfQUxMLAotICAgICAgICAgICAgICAgIHAsIGJhc2UsIGFkZCwgbmV3KTsKLSNlbmRpZgotCi0gICAgcmV0dXJuIG5ldzsKLX0KLQotLyoKLSAqIERpcmVjdGl2ZSBSZXdyaXRpbmcKLSAqLwotCi1jaGFyICpzc2xfaG9va19SZXdyaXRlQ29tbWFuZChjbWRfcGFybXMgKmNtZCwgdm9pZCAqY29uZmlnLCBjb25zdCBjaGFyICpjbWRfbGluZSkKLXsKLSNpZmRlZiBTU0xfQ09NUEFUCi0gICAgcmV0dXJuIHNzbF9jb21wYXRfZGlyZWN0aXZlKGNtZC0+c2VydmVyLCBjbWQtPnBvb2wsIGNtZF9saW5lKTsKLSNlbHNlCi0gICAgcmV0dXJuIE5VTEw7Ci0jZW5kaWYKLX0KLQotLyoKLSAqICBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyBmb3IgcGFydGljdWxhciBkaXJlY3RpdmVzCi0gKi8KLQotY29uc3QgY2hhciAqc3NsX2NtZF9TU0xNdXRleCgKLSAgICBjbWRfcGFybXMgKmNtZCwgY2hhciAqc3RydWN0X3B0ciwgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVycjsKLSAgICBTU0xNb2RDb25maWdSZWMgKm1jID0gbXlNb2RDb25maWcoKTsKLQotICAgIGlmICgoZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSkpICE9IE5VTEwpCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgaWYgKHNzbF9jb25maWdfZ2xvYmFsX2lzZml4ZWQoKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKHN0cmNFUShhcmcsICJub25lIikpIHsKLSAgICAgICAgbWMtPm5NdXRleE1vZGUgID0gU1NMX01VVEVYTU9ERV9OT05FOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJsZW4oYXJnKSA+IDUgJiYgc3RyY0VRbihhcmcsICJmaWxlOiIsIDUpKSB7Ci0jaWZuZGVmIFdJTjMyCi0gICAgICAgIG1jLT5uTXV0ZXhNb2RlICA9IFNTTF9NVVRFWE1PREVfRklMRTsKLSAgICAgICAgbWMtPnN6TXV0ZXhGaWxlID0gYXBfcHNwcmludGYobWMtPnBQb29sLCAiJXMuJWx1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX3V0aWxfc2VydmVyX3Jvb3RfcmVsYXRpdmUoY21kLT5wb29sLCAibXV0ZXgiLCBhcmcrNSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWdldHBpZCgpKTsKLSNlbHNlCi0gICAgICAgIHJldHVybiAiU1NMTXV0ZXg6IExvY2tmaWxlcyBub3QgYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0iOwotI2VuZGlmCi0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNFUShhcmcsICJzZW0iKSkgewotI2lmZGVmIFNTTF9DQU5fVVNFX1NFTQotICAgICAgICBtYy0+bk11dGV4TW9kZSAgPSBTU0xfTVVURVhNT0RFX1NFTTsKLSNlbHNlCi0gICAgICAgIHJldHVybiAiU1NMTXV0ZXg6IFNlbWFwaG9yZXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtIjsKLSNlbmRpZgotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAiU1NMTXV0ZXg6IEludmFsaWQgYXJndW1lbnQiOwotICAgIHJldHVybiBOVUxMOwotfQotCi1jb25zdCBjaGFyICpzc2xfY21kX1NTTFBhc3NQaHJhc2VEaWFsb2coCi0gICAgY21kX3Bhcm1zICpjbWQsIGNoYXIgKnN0cnVjdF9wdHIsIGNoYXIgKmFyZykKLXsKLSAgICBTU0xTcnZDb25maWdSZWMgKnNjID0gbXlTcnZDb25maWcoY21kLT5zZXJ2ZXIpOwotICAgIGNvbnN0IGNoYXIgKmVycjsKLQotICAgIGlmICgoZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSkpICE9IE5VTEwpCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgaWYgKHN0cmNFUShhcmcsICJidWlsdGluIikpIHsKLSAgICAgICAgc2MtPm5QYXNzUGhyYXNlRGlhbG9nVHlwZSAgPSBTU0xfUFBUWVBFX0JVSUxUSU47Ci0gICAgICAgIHNjLT5zelBhc3NQaHJhc2VEaWFsb2dQYXRoID0gTlVMTDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RybGVuKGFyZykgPiA1ICYmIHN0ckVRbihhcmcsICJleGVjOiIsIDUpKSB7Ci0gICAgICAgIHNjLT5uUGFzc1BocmFzZURpYWxvZ1R5cGUgID0gU1NMX1BQVFlQRV9GSUxURVI7Ci0gICAgICAgIHNjLT5zelBhc3NQaHJhc2VEaWFsb2dQYXRoID0gc3NsX3V0aWxfc2VydmVyX3Jvb3RfcmVsYXRpdmUoY21kLT5wb29sLCAiZGlhbG9nIiwgYXJnKzUpOwotICAgICAgICBpZiAoIXNzbF91dGlsX3BhdGhfY2hlY2soU1NMX1BDTV9FWElTVFMsIHNjLT5zelBhc3NQaHJhc2VEaWFsb2dQYXRoKSkKLSAgICAgICAgICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIlNTTFBhc3NQaHJhc2VEaWFsb2c6IGZpbGUgJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYy0+c3pQYXNzUGhyYXNlRGlhbG9nUGF0aCwgIicgbm90IGV4aXN0cyIsIE5VTEwpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAiU1NMUGFzc1BocmFzZURpYWxvZzogSW52YWxpZCBhcmd1bWVudCI7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNpZmRlZiBTU0xfRVhQRVJJTUVOVEFMX0VOR0lORQotY29uc3QgY2hhciAqc3NsX2NtZF9TU0xDcnlwdG9EZXZpY2UoCi0gICAgY21kX3Bhcm1zICpjbWQsIGNoYXIgKnN0cnVjdF9wdHIsIGNoYXIgKmFyZykKLXsKLSAgICBTU0xNb2RDb25maWdSZWMgKm1jID0gbXlNb2RDb25maWcoKTsKLSAgICBjb25zdCBjaGFyICplcnI7Ci0gICAgRU5HSU5FICplOwotI2lmIFNTTF9MSUJSQVJZX1ZFUlNJT04gPj0gMHgwMDkwNzAwMAotICAgIHN0YXRpYyBpbnQgbG9hZGVkX2VuZ2luZXMgPSBGQUxTRTsKLQotICAgIC8qIGVhcmx5IGxvYWRpbmcgdG8gbWFrZSBzdXJlIHRoZSBlbmdpbmVzIGFyZSBhbHJlYWR5IAotICAgICAgIGF2YWlsYWJsZSBmb3IgRU5HSU5FX2J5X2lkKCkgYWJvdmUuLi4gKi8KLSAgICBpZiAoIWxvYWRlZF9lbmdpbmVzKSB7Ci0gICAgICAgIEVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcygpOwotICAgICAgICBsb2FkZWRfZW5naW5lcyA9IFRSVUU7Ci0gICAgfQotI2VuZGlmCi0gICAgaWYgKChlcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKSkgIT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICBpZiAoc3RyY0VRKGFyZywgImJ1aWx0aW4iKSkgewotICAgICAgICBtYy0+c3pDcnlwdG9EZXZpY2UgPSBOVUxMOwotICAgIH0KLSAgICBlbHNlIGlmICgoZSA9IEVOR0lORV9ieV9pZChhcmcpKSAhPSBOVUxMKSB7Ci0gICAgICAgIG1jLT5zekNyeXB0b0RldmljZSA9IGFyZzsKLSAgICAgICAgRU5HSU5FX2ZyZWUoZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuICJTU0xDcnlwdG9EZXZpY2U6IEludmFsaWQgYXJndW1lbnQiOwotICAgIHJldHVybiBOVUxMOwotfQotI2VuZGlmCi0KLWNvbnN0IGNoYXIgKnNzbF9jbWRfU1NMUmFuZG9tU2VlZCgKLSAgICBjbWRfcGFybXMgKmNtZCwgY2hhciAqc3RydWN0X3B0ciwgY2hhciAqYXJnMSwgY2hhciAqYXJnMiwgY2hhciAqYXJnMykKLXsKLSAgICBTU0xNb2RDb25maWdSZWMgKm1jID0gbXlNb2RDb25maWcoKTsKLSAgICBjb25zdCBjaGFyICplcnI7Ci0gICAgc3NsX3JhbmRzZWVkX3QgKnBSUzsKLQotICAgIGlmICgoZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSkpICE9IE5VTEwpCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgaWYgKHNzbF9jb25maWdfZ2xvYmFsX2lzZml4ZWQoKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcFJTID0gYXBfcHVzaF9hcnJheShtYy0+YVJhbmRTZWVkKTsKLSAgICBpZiAoc3RyY0VRKGFyZzEsICJzdGFydHVwIikpCi0gICAgICAgIHBSUy0+bkN0eCA9IFNTTF9SU0NUWF9TVEFSVFVQOwotICAgIGVsc2UgaWYgKHN0cmNFUShhcmcxLCAiY29ubmVjdCIpKQotICAgICAgICBwUlMtPm5DdHggPSBTU0xfUlNDVFhfQ09OTkVDVDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIlNTTFJhbmRvbVNlZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgY29udGV4dDogYCIsIGFyZzEsICInIik7Ci0gICAgaWYgKHN0cmxlbihhcmcyKSA+IDUgJiYgc3RyRVFuKGFyZzIsICJmaWxlOiIsIDUpKSB7Ci0gICAgICAgIHBSUy0+blNyYyAgID0gU1NMX1JTU1JDX0ZJTEU7Ci0gICAgICAgIHBSUy0+Y3BQYXRoID0gYXBfcHN0cmR1cChtYy0+cFBvb2wsIHNzbF91dGlsX3NlcnZlcl9yb290X3JlbGF0aXZlKGNtZC0+cG9vbCwgInJhbmRvbSIsIGFyZzIrNSkpOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJsZW4oYXJnMikgPiA1ICYmIHN0ckVRbihhcmcyLCAiZXhlYzoiLCA1KSkgewotICAgICAgICBwUlMtPm5TcmMgICA9IFNTTF9SU1NSQ19FWEVDOwotICAgICAgICBwUlMtPmNwUGF0aCA9IGFwX3BzdHJkdXAobWMtPnBQb29sLCBzc2xfdXRpbF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShjbWQtPnBvb2wsICJyYW5kb20iLCBhcmcyKzUpKTsKLSAgICB9Ci0jaWYgU1NMX0xJQlJBUllfVkVSU0lPTiA+PSAweDAwOTA1MTAwCi0gICAgZWxzZSBpZiAoc3RybGVuKGFyZzIpID4gNCAmJiBzdHJFUW4oYXJnMiwgImVnZDoiLCA0KSkgewotICAgICAgICBwUlMtPm5TcmMgICA9IFNTTF9SU1NSQ19FR0Q7Ci0gICAgICAgIHBSUy0+Y3BQYXRoID0gYXBfcHN0cmR1cChtYy0+cFBvb2wsIHNzbF91dGlsX3NlcnZlcl9yb290X3JlbGF0aXZlKGNtZC0+cG9vbCwgInJhbmRvbSIsIGFyZzIrNCkpOwotICAgIH0KLSNlbmRpZgotICAgIGVsc2UgaWYgKHN0cmNFUShhcmcyLCAiYnVpbHRpbiIpKSB7Ci0gICAgICAgIHBSUy0+blNyYyAgID0gU1NMX1JTU1JDX0JVSUxUSU47Ci0gICAgICAgIHBSUy0+Y3BQYXRoID0gTlVMTDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHBSUy0+blNyYyAgID0gU1NMX1JTU1JDX0ZJTEU7Ci0gICAgICAgIHBSUy0+Y3BQYXRoID0gYXBfcHN0cmR1cChtYy0+cFBvb2wsIHNzbF91dGlsX3NlcnZlcl9yb290X3JlbGF0aXZlKGNtZC0+cG9vbCwgInJhbmRvbSIsIGFyZzIpKTsKLSAgICB9Ci0gICAgaWYgKHBSUy0+blNyYyAhPSBTU0xfUlNTUkNfQlVJTFRJTikKLSAgICAgICAgaWYgKCFzc2xfdXRpbF9wYXRoX2NoZWNrKFNTTF9QQ01fRVhJU1RTLCBwUlMtPmNwUGF0aCkpCi0gICAgICAgICAgICByZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsICJTU0xSYW5kb21TZWVkOiBzb3VyY2UgcGF0aCAnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSUy0+Y3BQYXRoLCAiJyBub3QgZXhpc3RzIiwgTlVMTCk7Ci0gICAgaWYgKGFyZzMgPT0gTlVMTCkKLSAgICAgICAgcFJTLT5uQnl0ZXMgPSAwOyAvKiByZWFkIHdob2xlIGZpbGUgKi8KLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKHBSUy0+blNyYyA9PSBTU0xfUlNTUkNfQlVJTFRJTikKLSAgICAgICAgICAgIHJldHVybiAiU1NMUmFuZG9tU2VlZDogYnl0ZSBzcGVjaWZpY2F0aW9uIG5vdCAiCi0gICAgICAgICAgICAgICAgICAgImFsbG93ZWQgZm9yIGJ1aWx0aW4gc2VlZCBzb3VyY2UiOwotICAgICAgICBwUlMtPm5CeXRlcyA9IGF0b2koYXJnMyk7Ci0gICAgICAgIGlmIChwUlMtPm5CeXRlcyA8IDApCi0gICAgICAgICAgICByZXR1cm4gIlNTTFJhbmRvbVNlZWQ6IGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIHNwZWNpZmllZCI7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1jb25zdCBjaGFyICpzc2xfY21kX1NTTEVuZ2luZSgKLSAgICBjbWRfcGFybXMgKmNtZCwgY2hhciAqc3RydWN0X3B0ciwgaW50IGZsYWcpCi17Ci0gICAgU1NMU3J2Q29uZmlnUmVjICpzYyA9IG15U3J2Q29uZmlnKGNtZC0+c2VydmVyKTsKLQotICAgIHNjLT5iRW5hYmxlZCA9IChmbGFnID8gVFJVRSA6IEZBTFNFKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotY29uc3QgY2hhciAqc3NsX2NtZF9TU0xDaXBoZXJTdWl0ZSgKLSAgICBjbWRfcGFybXMgKmNtZCwgU1NMRGlyQ29uZmlnUmVjICpkYywgY2hhciAqYXJnKQotewotICAgIFNTTFNydkNvbmZpZ1JlYyAqc2MgPSBteVNydkNvbmZpZyhjbWQtPnNlcnZlcik7Ci0KLSAgICBpZiAoY21kLT5wYXRoID09IE5VTEwgfHwgZGMgPT0gTlVMTCkKLSAgICAgICAgc2MtPnN6Q2lwaGVyU3VpdGUgPSBhcmc7Ci0gICAgZWxzZQotICAgICAgICBkYy0+c3pDaXBoZXJTdWl0ZSA9IGFyZzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotY29uc3QgY2hhciAqc3NsX2NtZF9TU0xDZXJ0aWZpY2F0ZUZpbGUoCi0gICAgY21kX3Bhcm1zICpjbWQsIGNoYXIgKnN0cnVjdF9wdHIsIGNoYXIgKmFyZykKLXsKLSAgICBTU0xTcnZDb25maWdSZWMgKnNjID0gbXlTcnZDb25maWcoY21kLT5zZXJ2ZXIpOwotICAgIGNoYXIgKmNwUGF0aDsKLSAgICBpbnQgaTsKLQotICAgIGNwUGF0aCA9IHNzbF91dGlsX3NlcnZlcl9yb290X3JlbGF0aXZlKGNtZC0+cG9vbCwgImNlcnRrZXkiLCBhcmcpOwotICAgIGlmICghc3NsX3V0aWxfcGF0aF9jaGVjayhTU0xfUENNX0VYSVNUU3xTU0xfUENNX0lTUkVHfFNTTF9QQ01fSVNOT05aRVJPLCBjcFBhdGgpKQotICAgICAgICByZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsICJTU0xDZXJ0aWZpY2F0ZUZpbGU6IGZpbGUgJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNwUGF0aCwgIicgbm90IGV4aXN0cyBvciBlbXB0eSIsIE5VTEwpOwotICAgIGZvciAoaSA9IDA7IGkgPCBTU0xfQUlEWF9NQVggJiYgc2MtPnN6UHVibGljQ2VydEZpbGVbaV0gIT0gTlVMTDsgaSsrKQotICAgICAgICA7Ci0gICAgaWYgKGkgPT0gU1NMX0FJRFhfTUFYKQotICAgICAgICByZXR1cm4gYXBfcHNwcmludGYoY21kLT5wb29sLCAiU1NMQ2VydGlmaWNhdGVGaWxlOiBvbmx5IHVwIHRvICVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImRpZmZlcmVudCBjZXJ0aWZpY2F0ZXMgcGVyIHZpcnR1YWwgaG9zdCBhbGxvd2VkIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9BSURYX01BWCk7Ci0gICAgc2MtPnN6UHVibGljQ2VydEZpbGVbaV0gPSBjcFBhdGg7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbnN0IGNoYXIgKnNzbF9jbWRfU1NMQ2VydGlmaWNhdGVLZXlGaWxlKAotICAgIGNtZF9wYXJtcyAqY21kLCBjaGFyICpzdHJ1Y3RfcHRyLCBjaGFyICphcmcpCi17Ci0gICAgU1NMU3J2Q29uZmlnUmVjICpzYyA9IG15U3J2Q29uZmlnKGNtZC0+c2VydmVyKTsKLSAgICBjaGFyICpjcFBhdGg7Ci0gICAgaW50IGk7Ci0KLSAgICBjcFBhdGggPSBzc2xfdXRpbF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShjbWQtPnBvb2wsICJjZXJ0a2V5IiwgYXJnKTsKLSAgICBpZiAoIXNzbF91dGlsX3BhdGhfY2hlY2soU1NMX1BDTV9FWElTVFN8U1NMX1BDTV9JU1JFR3xTU0xfUENNX0lTTk9OWkVSTywgY3BQYXRoKSkKLSAgICAgICAgcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCAiU1NMQ2VydGlmaWNhdGVLZXlGaWxlOiBmaWxlICciLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjcFBhdGgsICInIG5vdCBleGlzdHMgb3IgZW1wdHkiLCBOVUxMKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgU1NMX0FJRFhfTUFYICYmIHNjLT5zelByaXZhdGVLZXlGaWxlW2ldICE9IE5VTEw7IGkrKykKLSAgICAgICAgOwotICAgIGlmIChpID09IFNTTF9BSURYX01BWCkKLSAgICAgICAgcmV0dXJuIGFwX3BzcHJpbnRmKGNtZC0+cG9vbCwgIlNTTENlcnRpZmljYXRlS2V5RmlsZTogb25seSB1cCB0byAlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJkaWZmZXJlbnQgcHJpdmF0ZSBrZXlzIHBlciB2aXJ0dWFsIGhvc3QgYWxsb3dlZCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfQUlEWF9NQVgpOwotICAgIHNjLT5zelByaXZhdGVLZXlGaWxlW2ldID0gY3BQYXRoOwotICAgIHJldHVybiBOVUxMOwotfQotCi1jb25zdCBjaGFyICpzc2xfY21kX1NTTENlcnRpZmljYXRlQ2hhaW5GaWxlKAotICAgIGNtZF9wYXJtcyAqY21kLCBjaGFyICpzdHJ1Y3RfcHRyLCBjaGFyICphcmcpCi17Ci0gICAgU1NMU3J2Q29uZmlnUmVjICpzYyA9IG15U3J2Q29uZmlnKGNtZC0+c2VydmVyKTsKLSAgICBjaGFyICpjcFBhdGg7Ci0KLSAgICBjcFBhdGggPSBzc2xfdXRpbF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShjbWQtPnBvb2wsICJjZXJ0a2V5IiwgYXJnKTsKLSAgICBpZiAoIXNzbF91dGlsX3BhdGhfY2hlY2soU1NMX1BDTV9FWElTVFN8U1NMX1BDTV9JU1JFR3xTU0xfUENNX0lTTk9OWkVSTywgY3BQYXRoKSkKLSAgICAgICAgcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCAiU1NMQ2VydGlmaWNhdGVDaGFpbkZpbGU6IGZpbGUgJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNwUGF0aCwgIicgbm90IGV4aXN0cyBvciBlbXB0eSIsIE5VTEwpOwotICAgIHNjLT5zekNlcnRpZmljYXRlQ2hhaW4gPSBjcFBhdGg7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbnN0IGNoYXIgKnNzbF9jbWRfU1NMQ0FDZXJ0aWZpY2F0ZVBhdGgoCi0gICAgY21kX3Bhcm1zICpjbWQsIFNTTERpckNvbmZpZ1JlYyAqZGMsIGNoYXIgKmFyZykKLXsKLSAgICBTU0xTcnZDb25maWdSZWMgKnNjID0gbXlTcnZDb25maWcoY21kLT5zZXJ2ZXIpOwotICAgIGNoYXIgKmNwUGF0aDsKLQotICAgIGNwUGF0aCA9IHNzbF91dGlsX3NlcnZlcl9yb290X3JlbGF0aXZlKGNtZC0+cG9vbCwgImNlcnRrZXkiLCBhcmcpOwotICAgIGlmICghc3NsX3V0aWxfcGF0aF9jaGVjayhTU0xfUENNX0VYSVNUU3xTU0xfUENNX0lTRElSLCBjcFBhdGgpKQotICAgICAgICByZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsICJTU0xDQUNlcnRpZmljYXRlUGF0aDogZGlyZWN0b3J5ICciLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjcFBhdGgsICInIG5vdCBleGlzdHMiLCBOVUxMKTsKLSNpZmRlZiBTU0xfRVhQRVJJTUVOVEFMX1BFUkRJUkNBCi0gICAgaWYgKGNtZC0+cGF0aCA9PSBOVUxMIHx8IGRjID09IE5VTEwpCi0gICAgICAgIHNjLT5zekNBQ2VydGlmaWNhdGVQYXRoID0gY3BQYXRoOwotICAgIGVsc2UKLSAgICAgICAgZGMtPnN6Q0FDZXJ0aWZpY2F0ZVBhdGggPSBjcFBhdGg7Ci0jZWxzZQotICAgIHNjLT5zekNBQ2VydGlmaWNhdGVQYXRoID0gY3BQYXRoOwotI2VuZGlmCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbnN0IGNoYXIgKnNzbF9jbWRfU1NMQ0FDZXJ0aWZpY2F0ZUZpbGUoCi0gICAgY21kX3Bhcm1zICpjbWQsIFNTTERpckNvbmZpZ1JlYyAqZGMsIGNoYXIgKmFyZykKLXsKLSAgICBTU0xTcnZDb25maWdSZWMgKnNjID0gbXlTcnZDb25maWcoY21kLT5zZXJ2ZXIpOwotICAgIGNoYXIgKmNwUGF0aDsKLQotICAgIGNwUGF0aCA9IHNzbF91dGlsX3NlcnZlcl9yb290X3JlbGF0aXZlKGNtZC0+cG9vbCwgImNlcnRrZXkiLCBhcmcpOwotICAgIGlmICghc3NsX3V0aWxfcGF0aF9jaGVjayhTU0xfUENNX0VYSVNUU3xTU0xfUENNX0lTUkVHfFNTTF9QQ01fSVNOT05aRVJPLCBjcFBhdGgpKQotICAgICAgICByZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsICJTU0xDQUNlcnRpZmljYXRlRmlsZTogZmlsZSAnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY3BQYXRoLCAiJyBub3QgZXhpc3RzIG9yIGVtcHR5IiwgTlVMTCk7Ci0jaWZkZWYgU1NMX0VYUEVSSU1FTlRBTF9QRVJESVJDQQotICAgIGlmIChjbWQtPnBhdGggPT0gTlVMTCB8fCBkYyA9PSBOVUxMKQotICAgICAgICBzYy0+c3pDQUNlcnRpZmljYXRlRmlsZSA9IGNwUGF0aDsKLSAgICBlbHNlCi0gICAgICAgIGRjLT5zekNBQ2VydGlmaWNhdGVGaWxlID0gY3BQYXRoOwotI2Vsc2UKLSAgICBzYy0+c3pDQUNlcnRpZmljYXRlRmlsZSA9IGNwUGF0aDsKLSNlbmRpZgotICAgIHJldHVybiBOVUxMOwotfQotCi1jb25zdCBjaGFyICpzc2xfY21kX1NTTENBUmV2b2NhdGlvblBhdGgoCi0gICAgY21kX3Bhcm1zICpjbWQsIFNTTERpckNvbmZpZ1JlYyAqZGMsIGNoYXIgKmFyZykKLXsKLSAgICBTU0xTcnZDb25maWdSZWMgKnNjID0gbXlTcnZDb25maWcoY21kLT5zZXJ2ZXIpOwotICAgIGNoYXIgKmNwUGF0aDsKLQotICAgIGNwUGF0aCA9IHNzbF91dGlsX3NlcnZlcl9yb290X3JlbGF0aXZlKGNtZC0+cG9vbCwgImNlcnRrZXkiLCBhcmcpOwotICAgIGlmICghc3NsX3V0aWxfcGF0aF9jaGVjayhTU0xfUENNX0VYSVNUU3xTU0xfUENNX0lTRElSLCBjcFBhdGgpKQotICAgICAgICByZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsICJTU0xDQVJlY29jYXRpb25QYXRoOiBkaXJlY3RvcnkgJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNwUGF0aCwgIicgbm90IGV4aXN0cyIsIE5VTEwpOwotICAgIHNjLT5zekNBUmV2b2NhdGlvblBhdGggPSBjcFBhdGg7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbnN0IGNoYXIgKnNzbF9jbWRfU1NMQ0FSZXZvY2F0aW9uRmlsZSgKLSAgICBjbWRfcGFybXMgKmNtZCwgU1NMRGlyQ29uZmlnUmVjICpkYywgY2hhciAqYXJnKQotewotICAgIFNTTFNydkNvbmZpZ1JlYyAqc2MgPSBteVNydkNvbmZpZyhjbWQtPnNlcnZlcik7Ci0gICAgY2hhciAqY3BQYXRoOwotCi0gICAgY3BQYXRoID0gc3NsX3V0aWxfc2VydmVyX3Jvb3RfcmVsYXRpdmUoY21kLT5wb29sLCAiY2VydGtleSIsIGFyZyk7Ci0gICAgaWYgKCFzc2xfdXRpbF9wYXRoX2NoZWNrKFNTTF9QQ01fRVhJU1RTfFNTTF9QQ01fSVNSRUd8U1NMX1BDTV9JU05PTlpFUk8sIGNwUGF0aCkpCi0gICAgICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIlNTTENBUmV2b2NhdGlvbkZpbGU6IGZpbGUgJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNwUGF0aCwgIicgbm90IGV4aXN0cyBvciBlbXB0eSIsIE5VTEwpOwotICAgIHNjLT5zekNBUmV2b2NhdGlvbkZpbGUgPSBjcFBhdGg7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbnN0IGNoYXIgKnNzbF9jbWRfU1NMVmVyaWZ5Q2xpZW50KAotICAgIGNtZF9wYXJtcyAqY21kLCBTU0xEaXJDb25maWdSZWMgKmRjLCBjaGFyICpsZXZlbCkKLXsKLSAgICBTU0xTcnZDb25maWdSZWMgKnNjID0gbXlTcnZDb25maWcoY21kLT5zZXJ2ZXIpOwotICAgIHNzbF92ZXJpZnlfdCBpZDsKLQotICAgIGlmIChzdHJFUShsZXZlbCwgIjAiKSB8fCBzdHJjRVEobGV2ZWwsICJub25lIikpCi0gICAgICAgIGlkID0gU1NMX0NWRVJJRllfTk9ORTsKLSAgICBlbHNlIGlmIChzdHJFUShsZXZlbCwgIjEiKSB8fCBzdHJjRVEobGV2ZWwsICJvcHRpb25hbCIpKQotICAgICAgICBpZCA9IFNTTF9DVkVSSUZZX09QVElPTkFMOwotICAgIGVsc2UgaWYgKHN0ckVRKGxldmVsLCAiMiIpIHx8IHN0cmNFUShsZXZlbCwgInJlcXVpcmUiKSkKLSAgICAgICAgaWQgPSBTU0xfQ1ZFUklGWV9SRVFVSVJFOwotICAgIGVsc2UgaWYgKHN0ckVRKGxldmVsLCAiMyIpIHx8IHN0cmNFUShsZXZlbCwgIm9wdGlvbmFsX25vX2NhIikpCi0gICAgICAgIGlkID0gU1NMX0NWRVJJRllfT1BUSU9OQUxfTk9fQ0E7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gIlNTTFZlcmlmeUNsaWVudDogSW52YWxpZCBhcmd1bWVudCI7Ci0gICAgaWYgKGNtZC0+cGF0aCA9PSBOVUxMIHx8IGRjID09IE5VTEwpCi0gICAgICAgIHNjLT5uVmVyaWZ5Q2xpZW50ID0gaWQ7Ci0gICAgZWxzZQotICAgICAgICBkYy0+blZlcmlmeUNsaWVudCA9IGlkOwotICAgIHJldHVybiBOVUxMOwotfQotCi1jb25zdCBjaGFyICpzc2xfY21kX1NTTFZlcmlmeURlcHRoKAotICAgIGNtZF9wYXJtcyAqY21kLCBTU0xEaXJDb25maWdSZWMgKmRjLCBjaGFyICphcmcpCi17Ci0gICAgU1NMU3J2Q29uZmlnUmVjICpzYyA9IG15U3J2Q29uZmlnKGNtZC0+c2VydmVyKTsKLSAgICBpbnQgZDsKLQotICAgIGQgPSBhdG9pKGFyZyk7Ci0gICAgaWYgKGQgPCAwKQotICAgICAgICByZXR1cm4gIlNTTFZlcmlmeURlcHRoOiBJbnZhbGlkIGFyZ3VtZW50IjsKLSAgICBpZiAoY21kLT5wYXRoID09IE5VTEwgfHwgZGMgPT0gTlVMTCkKLSAgICAgICAgc2MtPm5WZXJpZnlEZXB0aCA9IGQ7Ci0gICAgZWxzZQotICAgICAgICBkYy0+blZlcmlmeURlcHRoID0gZDsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotY29uc3QgY2hhciAqc3NsX2NtZF9TU0xTZXNzaW9uQ2FjaGUoCi0gICAgY21kX3Bhcm1zICpjbWQsIGNoYXIgKnN0cnVjdF9wdHIsIGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnI7Ci0gICAgU1NMTW9kQ29uZmlnUmVjICptYyA9IG15TW9kQ29uZmlnKCk7Ci0gICAgY2hhciAqY3AsICpjcDI7Ci0gICAgaW50IG1heHNpemU7Ci0KLSAgICBpZiAoKGVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpKSAhPSBOVUxMKQotICAgICAgICByZXR1cm4gZXJyOwotICAgIGlmIChzc2xfY29uZmlnX2dsb2JhbF9pc2ZpeGVkKCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChzdHJjRVEoYXJnLCAibm9uZSIpKSB7Ci0gICAgICAgIG1jLT5uU2Vzc2lvbkNhY2hlTW9kZSAgICAgID0gU1NMX1NDTU9ERV9OT05FOwotICAgICAgICBtYy0+c3pTZXNzaW9uQ2FjaGVEYXRhRmlsZSA9IE5VTEw7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmxlbihhcmcpID4gNCAmJiBzdHJjRVFuKGFyZywgImRibToiLCA0KSkgewotICAgICAgICBtYy0+blNlc3Npb25DYWNoZU1vZGUgICAgICA9IFNTTF9TQ01PREVfREJNOwotICAgICAgICBtYy0+c3pTZXNzaW9uQ2FjaGVEYXRhRmlsZSA9IGFwX3BzdHJkdXAobWMtPnBQb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF91dGlsX3NlcnZlcl9yb290X3JlbGF0aXZlKGNtZC0+cG9vbCwgInNjYWNoZSIsIGFyZys0KSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAgIChzdHJsZW4oYXJnKSA+IDQgJiYgc3RyY0VRbihhcmcsICJzaG06IiwgICA0KSkgCi0gICAgICAgICAgICAgfHwgKHN0cmxlbihhcmcpID4gNiAmJiBzdHJjRVFuKGFyZywgInNobWh0OiIsIDYpKSkgewotICAgICAgICBpZiAoIWFwX21tX3VzZWFibGUoKSkKLSAgICAgICAgICAgIHJldHVybiAiU1NMU2Vzc2lvbkNhY2hlOiBzaGFyZWQgbWVtb3J5IGNhY2hlIG5vdCB1c2VhYmxlIG9uIHRoaXMgcGxhdGZvcm0iOwotICAgICAgICBtYy0+blNlc3Npb25DYWNoZU1vZGUgICAgICA9IFNTTF9TQ01PREVfU0hNSFQ7Ci0gICAgICAgIGNwID0gc3RyY2hyKGFyZywgJzonKTsKLSAgICAgICAgbWMtPnN6U2Vzc2lvbkNhY2hlRGF0YUZpbGUgPSBhcF9wc3RyZHVwKG1jLT5wUG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfdXRpbF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShjbWQtPnBvb2wsICJzY2FjaGUiLCBjcCsxKSk7Ci0gICAgICAgIG1jLT50U2Vzc2lvbkNhY2hlRGF0YVRhYmxlID0gTlVMTDsKLSAgICAgICAgbWMtPm5TZXNzaW9uQ2FjaGVEYXRhU2l6ZSAgPSAxMDI0KjUxMjsgLyogNTEyS0IgKi8KLSAgICAgICAgaWYgKChjcCA9IHN0cmNocihtYy0+c3pTZXNzaW9uQ2FjaGVEYXRhRmlsZSwgJygnKSkgIT0gTlVMTCkgewotICAgICAgICAgICAgKmNwKysgPSBOVUw7Ci0gICAgICAgICAgICBpZiAoKGNwMiA9IHN0cmNocihjcCwgJyknKSkgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNTTFNlc3Npb25DYWNoZTogSW52YWxpZCBhcmd1bWVudDogbm8gY2xvc2luZyBwYXJlbnRoZXNpcyI7Ci0gICAgICAgICAgICAqY3AyID0gTlVMOwotICAgICAgICAgICAgbWMtPm5TZXNzaW9uQ2FjaGVEYXRhU2l6ZSA9IGF0b2koY3ApOwotICAgICAgICAgICAgaWYgKG1jLT5uU2Vzc2lvbkNhY2hlRGF0YVNpemUgPD0gODE5MikKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNTTFNlc3Npb25DYWNoZTogSW52YWxpZCBhcmd1bWVudDogc2l6ZSBoYXMgdG8gYmUgPj0gODE5MiBieXRlcyI7Ci0gICAgICAgICAgICBtYXhzaXplID0gYXBfbW1fY29yZV9tYXhzZWdzaXplKCk7Ci0gICAgICAgICAgICBpZiAobWMtPm5TZXNzaW9uQ2FjaGVEYXRhU2l6ZSA+PSBtYXhzaXplKQotICAgICAgICAgICAgICAgIHJldHVybiBhcF9wc3ByaW50ZihjbWQtPnBvb2wsICJTU0xTZXNzaW9uQ2FjaGU6IEludmFsaWQgYXJndW1lbnQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpemUgaGFzIHRvIGJlIDwgJWQgYnl0ZXMgb24gdGhpcyBwbGF0Zm9ybSIsIG1heHNpemUpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmxlbihhcmcpID4gNiAmJiBzdHJjRVFuKGFyZywgInNobWNiOiIsIDYpKSB7Ci0gICAgICAgIGlmICghYXBfbW1fdXNlYWJsZSgpKQotICAgICAgICAgICAgcmV0dXJuICJTU0xTZXNzaW9uQ2FjaGU6IHNoYXJlZCBtZW1vcnkgY2FjaGUgbm90IHVzZWFibGUgb24gdGhpcyBwbGF0Zm9ybSI7Ci0gICAgICAgIG1jLT5uU2Vzc2lvbkNhY2hlTW9kZSAgICAgID0gU1NMX1NDTU9ERV9TSE1DQjsKLSAgICAgICAgbWMtPnN6U2Vzc2lvbkNhY2hlRGF0YUZpbGUgPSBhcF9wc3RyZHVwKG1jLT5wUG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShjbWQtPnBvb2wsIGFyZys2KSk7Ci0gICAgICAgIG1jLT50U2Vzc2lvbkNhY2hlRGF0YVRhYmxlID0gTlVMTDsKLSAgICAgICAgbWMtPm5TZXNzaW9uQ2FjaGVEYXRhU2l6ZSAgPSAxMDI0KjUxMjsgLyogNTEyS0IgKi8KLSAgICAgICAgaWYgKChjcCA9IHN0cmNocihtYy0+c3pTZXNzaW9uQ2FjaGVEYXRhRmlsZSwgJygnKSkgIT0gTlVMTCkgewotICAgICAgICAgICAgKmNwKysgPSBOVUw7Ci0gICAgICAgICAgICBpZiAoKGNwMiA9IHN0cmNocihjcCwgJyknKSkgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNTTFNlc3Npb25DYWNoZTogSW52YWxpZCBhcmd1bWVudDogbm8gY2xvc2luZyBwYXJlbnRoZXNpcyI7Ci0gICAgICAgICAgICAqY3AyID0gTlVMOwotICAgICAgICAgICAgbWMtPm5TZXNzaW9uQ2FjaGVEYXRhU2l6ZSA9IGF0b2koY3ApOwotICAgICAgICAgICAgaWYgKG1jLT5uU2Vzc2lvbkNhY2hlRGF0YVNpemUgPD0gODE5MikKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNTTFNlc3Npb25DYWNoZTogSW52YWxpZCBhcmd1bWVudDogc2l6ZSBoYXMgdG8gYmUgPj0gODE5MiBieXRlcyI7Ci0gICAgICAgICAgICBtYXhzaXplID0gYXBfbW1fY29yZV9tYXhzZWdzaXplKCk7Ci0gICAgICAgICAgICBpZiAobWMtPm5TZXNzaW9uQ2FjaGVEYXRhU2l6ZSA+PSBtYXhzaXplKQotICAgICAgICAgICAgICAgIHJldHVybiBhcF9wc3ByaW50ZihjbWQtPnBvb2wsICJTU0xTZXNzaW9uQ2FjaGU6IEludmFsaWQgYXJndW1lbnQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpemUgaGFzIHRvIGJlIDwgJWQgYnl0ZXMgb24gdGhpcyBwbGF0Zm9ybSIsIG1heHNpemUpOwotICAgICAgICB9Ci0gICAgfQotCWVsc2UKLSNpZmRlZiBTU0xfVkVORE9SCi0gICAgICAgIGlmICghYXBfaG9va191c2UoImFwOjptb2Rfc3NsOjp2ZW5kb3I6OmNtZF9zc2xzZXNzaW9uY2FjaGUiLAotICAgICAgICAgICAgIEFQX0hPT0tfU0lHNCh2b2lkLHB0cixwdHIscHRyKSwgQVBfSE9PS19NT0RFX0FMTCwKLSAgICAgICAgICAgICBjbWQsIGFyZywgbWMpKQotI2VuZGlmCi0gICAgICAgIHJldHVybiAiU1NMU2Vzc2lvbkNhY2hlOiBJbnZhbGlkIGFyZ3VtZW50IjsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotY29uc3QgY2hhciAqc3NsX2NtZF9TU0xTZXNzaW9uQ2FjaGVUaW1lb3V0KAotICAgIGNtZF9wYXJtcyAqY21kLCBjaGFyICpzdHJ1Y3RfcHRyLCBjaGFyICphcmcpCi17Ci0gICAgU1NMU3J2Q29uZmlnUmVjICpzYyA9IG15U3J2Q29uZmlnKGNtZC0+c2VydmVyKTsKLQotICAgIHNjLT5uU2Vzc2lvbkNhY2hlVGltZW91dCA9IGF0b2koYXJnKTsKLSAgICBpZiAoc2MtPm5TZXNzaW9uQ2FjaGVUaW1lb3V0IDwgMCkKLSAgICAgICAgcmV0dXJuICJTU0xTZXNzaW9uQ2FjaGVUaW1lb3V0OiBJbnZhbGlkIGFyZ3VtZW50IjsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotY29uc3QgY2hhciAqc3NsX2NtZF9TU0xMb2coCi0gICAgY21kX3Bhcm1zICpjbWQsIGNoYXIgKnN0cnVjdF9wdHIsIGNoYXIgKmFyZykKLXsKLSAgICBTU0xTcnZDb25maWdSZWMgKnNjID0gbXlTcnZDb25maWcoY21kLT5zZXJ2ZXIpOwotICAgIGNvbnN0IGNoYXIgKmVycjsKLQotICAgIGlmICgoZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCAgTk9UX0lOX0xJTUlUfE5PVF9JTl9ESVJFQ1RPUlkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfE5PVF9JTl9MT0NBVElPTnxOT1RfSU5fRklMRVMgKSkgIT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICBzYy0+c3pMb2dGaWxlID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1jb25zdCBjaGFyICpzc2xfY21kX1NTTExvZ0xldmVsKAotICAgIGNtZF9wYXJtcyAqY21kLCBjaGFyICpzdHJ1Y3RfcHRyLCBjaGFyICpsZXZlbCkKLXsKLSAgICBTU0xTcnZDb25maWdSZWMgKnNjID0gbXlTcnZDb25maWcoY21kLT5zZXJ2ZXIpOwotICAgIGNvbnN0IGNoYXIgKmVycjsKLQotICAgIGlmICgoZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCAgTk9UX0lOX0xJTUlUfE5PVF9JTl9ESVJFQ1RPUlkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfE5PVF9JTl9MT0NBVElPTnxOT1RfSU5fRklMRVMgKSkgIT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICBpZiAoc3RyY0VRKGxldmVsLCAibm9uZSIpKQotICAgICAgICBzYy0+bkxvZ0xldmVsID0gU1NMX0xPR19OT05FOwotICAgIGVsc2UgaWYgKHN0cmNFUShsZXZlbCwgImVycm9yIikpCi0gICAgICAgIHNjLT5uTG9nTGV2ZWwgPSBTU0xfTE9HX0VSUk9SOwotICAgIGVsc2UgaWYgKHN0cmNFUShsZXZlbCwgIndhcm4iKSkKLSAgICAgICAgc2MtPm5Mb2dMZXZlbCA9IFNTTF9MT0dfV0FSTjsKLSAgICBlbHNlIGlmIChzdHJjRVEobGV2ZWwsICJpbmZvIikpCi0gICAgICAgIHNjLT5uTG9nTGV2ZWwgPSBTU0xfTE9HX0lORk87Ci0gICAgZWxzZSBpZiAoc3RyY0VRKGxldmVsLCAidHJhY2UiKSkKLSAgICAgICAgc2MtPm5Mb2dMZXZlbCA9IFNTTF9MT0dfVFJBQ0U7Ci0gICAgZWxzZSBpZiAoc3RyY0VRKGxldmVsLCAiZGVidWciKSkKLSAgICAgICAgc2MtPm5Mb2dMZXZlbCA9IFNTTF9MT0dfREVCVUc7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gIlNTTExvZ0xldmVsOiBJbnZhbGlkIGFyZ3VtZW50IjsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotY29uc3QgY2hhciAqc3NsX2NtZF9TU0xPcHRpb25zKAotICAgIGNtZF9wYXJtcyAqY21kLCBTU0xEaXJDb25maWdSZWMgKmRjLCBjb25zdCBjaGFyICpjcExpbmUpCi17Ci0gICAgc3NsX29wdF90IG9wdDsKLSAgICBpbnQgZmlyc3Q7Ci0gICAgY2hhciBhY3Rpb247Ci0gICAgY2hhciAqdzsKLQotICAgIGZpcnN0ID0gVFJVRTsKLSAgICB3aGlsZSAoY3BMaW5lWzBdICE9IE5VTCkgewotICAgICAgICB3ID0gYXBfZ2V0d29yZF9jb25mKGNtZC0+cG9vbCwgJmNwTGluZSk7Ci0gICAgICAgIGFjdGlvbiA9IE5VTDsKLQotICAgICAgICBpZiAoKncgPT0gJysnIHx8ICp3ID09ICctJykgewotICAgICAgICAgICAgYWN0aW9uID0gKih3KyspOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICBkYy0+bk9wdGlvbnMgPSBTU0xfT1BUX05PTkU7Ci0gICAgICAgICAgICBmaXJzdCA9IEZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN0cmNFUSh3LCAiU3RkRW52VmFycyIpKQotICAgICAgICAgICAgb3B0ID0gU1NMX09QVF9TVERFTlZWQVJTOwotICAgICAgICBlbHNlIGlmIChzdHJjRVEodywgIkNvbXBhdEVudlZhcnMiKSkKLSAgICAgICAgICAgIG9wdCA9IFNTTF9PUFRfQ09NUEFURU5WVkFSUzsKLSAgICAgICAgZWxzZSBpZiAoc3RyY0VRKHcsICJFeHBvcnRDZXJ0RGF0YSIpKQotICAgICAgICAgICAgb3B0ID0gU1NMX09QVF9FWFBPUlRDRVJUREFUQTsKLSAgICAgICAgZWxzZSBpZiAoc3RyY0VRKHcsICJGYWtlQmFzaWNBdXRoIikpCi0gICAgICAgICAgICBvcHQgPSBTU0xfT1BUX0ZBS0VCQVNJQ0FVVEg7Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNFUSh3LCAiU3RyaWN0UmVxdWlyZSIpKQotICAgICAgICAgICAgb3B0ID0gU1NMX09QVF9TVFJJQ1RSRVFVSVJFOwotICAgICAgICBlbHNlIGlmIChzdHJjRVEodywgIk9wdFJlbmVnb3RpYXRlIikpCi0gICAgICAgICAgICBvcHQgPSBTU0xfT1BUX09QVFJFTkVHT1RJQVRFOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsICJTU0xPcHRpb25zOiBJbGxlZ2FsIG9wdGlvbiAnIiwgdywgIiciLCBOVUxMKTsKLQotICAgICAgICBpZiAoYWN0aW9uID09ICctJykgewotICAgICAgICAgICAgZGMtPm5PcHRpb25zQWRkICY9IH5vcHQ7Ci0gICAgICAgICAgICBkYy0+bk9wdGlvbnNEZWwgfD0gIG9wdDsKLSAgICAgICAgICAgIGRjLT5uT3B0aW9ucyAgICAmPSB+b3B0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGFjdGlvbiA9PSAnKycpIHsKLSAgICAgICAgICAgIGRjLT5uT3B0aW9uc0FkZCB8PSAgb3B0OwotICAgICAgICAgICAgZGMtPm5PcHRpb25zRGVsICY9IH5vcHQ7Ci0gICAgICAgICAgICBkYy0+bk9wdGlvbnMgICAgfD0gIG9wdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGRjLT5uT3B0aW9ucyAgICA9IG9wdDsKLSAgICAgICAgICAgIGRjLT5uT3B0aW9uc0FkZCA9IG9wdDsKLSAgICAgICAgICAgIGRjLT5uT3B0aW9uc0RlbCA9IFNTTF9PUFRfTk9ORTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotY29uc3QgY2hhciAqc3NsX2NtZF9TU0xSZXF1aXJlU1NMKAotICAgIGNtZF9wYXJtcyAqY21kLCBTU0xEaXJDb25maWdSZWMgKmRjLCBjaGFyICpjaXBoZXIpCi17Ci0gICAgZGMtPmJTU0xSZXF1aXJlZCA9IFRSVUU7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbnN0IGNoYXIgKnNzbF9jbWRfU1NMUmVxdWlyZSgKLSAgICBjbWRfcGFybXMgKmNtZCwgU1NMRGlyQ29uZmlnUmVjICpkYywgY2hhciAqY3BFeHByKQotewotICAgIHNzbF9leHByICptcEV4cHI7Ci0gICAgc3NsX3JlcXVpcmVfdCAqcFJlcVJlYzsKLQotICAgIGlmICgobXBFeHByID0gc3NsX2V4cHJfY29tcChjbWQtPnBvb2wsIGNwRXhwcikpID09IE5VTEwpCi0gICAgICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIlNTTFJlcXVpcmU6ICIsIHNzbF9leHByX2dldF9lcnJvcigpLCBOVUxMKTsKLSAgICBwUmVxUmVjID0gYXBfcHVzaF9hcnJheShkYy0+YVJlcXVpcmVtZW50KTsKLSAgICBwUmVxUmVjLT5jcEV4cHIgPSBhcF9wc3RyZHVwKGNtZC0+cG9vbCwgY3BFeHByKTsKLSAgICBwUmVxUmVjLT5tcEV4cHIgPSBtcEV4cHI7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbnN0IGNoYXIgKnNzbF9jbWRfU1NMUHJvdG9jb2woCi0gICAgY21kX3Bhcm1zICpjbWQsIGNoYXIgKnN0cnVjdF9wdHIsIGNvbnN0IGNoYXIgKm9wdCkKLXsKLSAgICBTU0xTcnZDb25maWdSZWMgKnNjOwotICAgIHNzbF9wcm90b190IG9wdGlvbnMsIHRoaXNvcHQ7Ci0gICAgY2hhciBhY3Rpb247Ci0gICAgY2hhciAqdzsKLQotICAgIHNjID0gbXlTcnZDb25maWcoY21kLT5zZXJ2ZXIpOwotICAgIG9wdGlvbnMgPSBTU0xfUFJPVE9DT0xfTk9ORTsKLSAgICB3aGlsZSAob3B0WzBdICE9IE5VTCkgewotICAgICAgICB3ID0gYXBfZ2V0d29yZF9jb25mKGNtZC0+cG9vbCwgJm9wdCk7Ci0KLSAgICAgICAgYWN0aW9uID0gTlVMOwotICAgICAgICBpZiAoKncgPT0gJysnIHx8ICp3ID09ICctJykKLSAgICAgICAgICAgIGFjdGlvbiA9ICoodysrKTsKLQotICAgICAgICBpZiAoc3RyY0VRKHcsICJTU0x2MiIpKQotICAgICAgICAgICAgdGhpc29wdCA9IFNTTF9QUk9UT0NPTF9TU0xWMjsKLSAgICAgICAgZWxzZSBpZiAoc3RyY0VRKHcsICJTU0x2MyIpKQotICAgICAgICAgICAgdGhpc29wdCA9IFNTTF9QUk9UT0NPTF9TU0xWMzsKLSAgICAgICAgZWxzZSBpZiAoc3RyY0VRKHcsICJUTFN2MSIpKQotICAgICAgICAgICAgdGhpc29wdCA9IFNTTF9QUk9UT0NPTF9UTFNWMTsKLSAgICAgICAgZWxzZSBpZiAoc3RyY0VRKHcsICJhbGwiKSkKLSAgICAgICAgICAgIHRoaXNvcHQgPSBTU0xfUFJPVE9DT0xfQUxMOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsICJTU0xQcm90b2NvbDogSWxsZWdhbCBwcm90b2NvbCAnIiwgdywgIiciLCBOVUxMKTsKLQotICAgICAgICBpZiAoYWN0aW9uID09ICctJykKLSAgICAgICAgICAgIG9wdGlvbnMgJj0gfnRoaXNvcHQ7Ci0gICAgICAgIGVsc2UgaWYgKGFjdGlvbiA9PSAnKycpCi0gICAgICAgICAgICBvcHRpb25zIHw9IHRoaXNvcHQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzb3B0OwotICAgIH0KLSAgICBzYy0+blByb3RvY29sID0gb3B0aW9uczsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotI2lmZGVmIFNTTF9FWFBFUklNRU5UQUxfUFJPWFkKLQotY29uc3QgY2hhciAqc3NsX2NtZF9TU0xQcm94eVByb3RvY29sKAotICAgIGNtZF9wYXJtcyAqY21kLCBjaGFyICpzdHJ1Y3RfcHRyLCBjb25zdCBjaGFyICpvcHQpCi17Ci0gICAgU1NMU3J2Q29uZmlnUmVjICpzYzsKLSAgICBzc2xfcHJvdG9fdCBvcHRpb25zLCB0aGlzb3B0OwotICAgIGNoYXIgYWN0aW9uOwotICAgIGNoYXIgKnc7Ci0KLSAgICBzYyA9IG15U3J2Q29uZmlnKGNtZC0+c2VydmVyKTsKLSAgICBvcHRpb25zID0gU1NMX1BST1RPQ09MX05PTkU7Ci0gICAgd2hpbGUgKG9wdFswXSAhPSBOVUwpIHsKLSAgICAgICAgdyA9IGFwX2dldHdvcmRfY29uZihjbWQtPnBvb2wsICZvcHQpOwotCi0gICAgICAgIGFjdGlvbiA9IE5VTDsKLSAgICAgICAgaWYgKCp3ID09ICcrJyB8fCAqdyA9PSAnLScpCi0gICAgICAgICAgICBhY3Rpb24gPSAqKHcrKyk7Ci0KLSAgICAgICAgaWYgKHN0cmNFUSh3LCAiU1NMdjIiKSkKLSAgICAgICAgICAgIHRoaXNvcHQgPSBTU0xfUFJPVE9DT0xfU1NMVjI7Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNFUSh3LCAiU1NMdjMiKSkKLSAgICAgICAgICAgIHRoaXNvcHQgPSBTU0xfUFJPVE9DT0xfU1NMVjM7Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNFUSh3LCAiVExTdjEiKSkKLSAgICAgICAgICAgIHRoaXNvcHQgPSBTU0xfUFJPVE9DT0xfVExTVjE7Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNFUSh3LCAiYWxsIikpCi0gICAgICAgICAgICB0aGlzb3B0ID0gU1NMX1BST1RPQ09MX0FMTDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCAiU1NMUHJveHlQcm90b2NvbDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklsbGVnYWwgcHJvdG9jb2wgJyIsIHcsICInIiwgTlVMTCk7Ci0gICAgICAgIGlmIChhY3Rpb24gPT0gJy0nKQotICAgICAgICAgICAgb3B0aW9ucyAmPSB+dGhpc29wdDsKLSAgICAgICAgZWxzZSBpZiAoYWN0aW9uID09ICcrJykKLSAgICAgICAgICAgIG9wdGlvbnMgfD0gdGhpc29wdDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXNvcHQ7Ci0gICAgfQotICAgIHNjLT5uUHJveHlQcm90b2NvbCA9IG9wdGlvbnM7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbnN0IGNoYXIgKnNzbF9jbWRfU1NMUHJveHlDaXBoZXJTdWl0ZSgKLSAgICBjbWRfcGFybXMgKmNtZCwgY2hhciAqc3RydWN0X3B0ciwgY2hhciAqYXJnKQotewotICAgIFNTTFNydkNvbmZpZ1JlYyAqc2MgPSBteVNydkNvbmZpZyhjbWQtPnNlcnZlcik7Ci0KLSAgICBzYy0+c3pQcm94eUNpcGhlclN1aXRlID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1jb25zdCBjaGFyICpzc2xfY21kX1NTTFByb3h5VmVyaWZ5KAotICAgIGNtZF9wYXJtcyAqY21kLCBjaGFyICpzdHJ1Y3RfcHRyLCBpbnQgZmxhZykKLXsKLSAgICBTU0xTcnZDb25maWdSZWMgKnNjID0gbXlTcnZDb25maWcoY21kLT5zZXJ2ZXIpOwotCi0gICAgc2MtPmJQcm94eVZlcmlmeSA9IChmbGFnID8gVFJVRSA6IEZBTFNFKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotY29uc3QgY2hhciAqc3NsX2NtZF9TU0xQcm94eVZlcmlmeURlcHRoKAotICAgIGNtZF9wYXJtcyAqY21kLCBjaGFyICpzdHJ1Y3RfcHRyLCBjaGFyICphcmcpCi17Ci0gICAgU1NMU3J2Q29uZmlnUmVjICpzYyA9IG15U3J2Q29uZmlnKGNtZC0+c2VydmVyKTsKLSAgICBpbnQgZDsKLQotICAgIGQgPSBhdG9pKGFyZyk7Ci0gICAgaWYgKGQgPCAwKQotICAgICAgICByZXR1cm4gIlNTTFByb3h5VmVyaWZ5RGVwdGg6IEludmFsaWQgYXJndW1lbnQiOwotICAgIHNjLT5uUHJveHlWZXJpZnlEZXB0aCA9IGQ7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbnN0IGNoYXIgKnNzbF9jbWRfU1NMUHJveHlDQUNlcnRpZmljYXRlRmlsZSgKLSAgICBjbWRfcGFybXMgKmNtZCwgY2hhciAqc3RydWN0X3B0ciwgY2hhciAqYXJnKQotewotICAgIFNTTFNydkNvbmZpZ1JlYyAqc2MgPSBteVNydkNvbmZpZyhjbWQtPnNlcnZlcik7Ci0gICAgY2hhciAqY3BQYXRoOwotCi0gICAgY3BQYXRoID0gc3NsX3V0aWxfc2VydmVyX3Jvb3RfcmVsYXRpdmUoY21kLT5wb29sLCAiY2VydGtleSIsIGFyZyk7Ci0gICAgaWYgKCFzc2xfdXRpbF9wYXRoX2NoZWNrKFNTTF9QQ01fRVhJU1RTfFNTTF9QQ01fSVNSRUd8U1NMX1BDTV9JU05PTlpFUk8sIGNwUGF0aCkpCi0gICAgICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIlNTTFByb3h5Q0FDZXJ0aWZpY2F0ZUZpbGU6IGZpbGUgJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNwUGF0aCwgIicgbm90IGV4aXN0cyBvciBlbXB0eSIsIE5VTEwpOwotICAgIHNjLT5zelByb3h5Q0FDZXJ0aWZpY2F0ZUZpbGUgPSBjcFBhdGg7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbnN0IGNoYXIgKnNzbF9jbWRfU1NMUHJveHlDQUNlcnRpZmljYXRlUGF0aCgKLSAgICBjbWRfcGFybXMgKmNtZCwgY2hhciAqc3RydWN0X3B0ciwgY2hhciAqYXJnKQotewotICAgIFNTTFNydkNvbmZpZ1JlYyAqc2MgPSBteVNydkNvbmZpZyhjbWQtPnNlcnZlcik7Ci0gICAgY2hhciAqY3BQYXRoOwotCi0gICAgY3BQYXRoID0gc3NsX3V0aWxfc2VydmVyX3Jvb3RfcmVsYXRpdmUoY21kLT5wb29sLCAiY2VydGtleSIsIGFyZyk7Ci0gICAgaWYgKCFzc2xfdXRpbF9wYXRoX2NoZWNrKFNTTF9QQ01fRVhJU1RTfFNTTF9QQ01fSVNESVIsIGNwUGF0aCkpCi0gICAgICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIlNTTFByb3h5Q0FDZXJ0aWZpY2F0ZVBhdGg6IGRpcmVjdG9yeSAnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY3BQYXRoLCAiJyBkb2VzIG5vdCBleGlzdHMiLCBOVUxMKTsKLSAgICBzYy0+c3pQcm94eUNBQ2VydGlmaWNhdGVQYXRoID0gY3BQYXRoOwotICAgIHJldHVybiBOVUxMOwotfQotCi1jb25zdCBjaGFyICpzc2xfY21kX1NTTFByb3h5TWFjaGluZUNlcnRpZmljYXRlRmlsZSgKLSAgICBjbWRfcGFybXMgKmNtZCwgY2hhciAqc3RydWN0X3B0ciwgY2hhciAqYXJnKQotewotICAgIFNTTFNydkNvbmZpZ1JlYyAqc2MgPSBteVNydkNvbmZpZyhjbWQtPnNlcnZlcik7Ci0gICAgY2hhciAqY3BQYXRoOwotCi0gICAgY3BQYXRoID0gc3NsX3V0aWxfc2VydmVyX3Jvb3RfcmVsYXRpdmUoY21kLT5wb29sLCAiY2VydGtleSIsIGFyZyk7Ci0gICAgaWYgKCFzc2xfdXRpbF9wYXRoX2NoZWNrKFNTTF9QQ01fRVhJU1RTfFNTTF9QQ01fSVNSRUd8U1NMX1BDTV9JU05PTlpFUk8sIGNwUGF0aCkpCi0gICAgICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIlNTTFByb3h5TWFjaGluZUNlcnRGaWxlOiBmaWxlICciLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjcFBhdGgsICInIG5vdCBleGlzdHMgb3IgZW1wdHkiLCBOVUxMKTsKLSAgICBzYy0+c3pQcm94eUNsaWVudENlcnRpZmljYXRlRmlsZSA9IGNwUGF0aDsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotY29uc3QgY2hhciAqc3NsX2NtZF9TU0xQcm94eU1hY2hpbmVDZXJ0aWZpY2F0ZVBhdGgoCi0gICAgY21kX3Bhcm1zICpjbWQsIGNoYXIgKnN0cnVjdF9wdHIsIGNoYXIgKmFyZykKLXsKLSAgICBTU0xTcnZDb25maWdSZWMgKnNjID0gbXlTcnZDb25maWcoY21kLT5zZXJ2ZXIpOwotICAgIGNoYXIgKmNwUGF0aDsKLQotICAgIGNwUGF0aCA9IHNzbF91dGlsX3NlcnZlcl9yb290X3JlbGF0aXZlKGNtZC0+cG9vbCwgImNlcnRrZXkiLCBhcmcpOwotICAgIGlmICghc3NsX3V0aWxfcGF0aF9jaGVjayhTU0xfUENNX0VYSVNUU3xTU0xfUENNX0lTRElSLCBjcFBhdGgpKQotICAgICAgICByZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsICJTU0xQcm94eU1hY2hpbmVDZXJ0UGF0aDogZGlyZWN0b3J5ICciLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjcFBhdGgsICInIGRvZXMgbm90IGV4aXN0cyIsIE5VTEwpOwotICAgIHNjLT5zelByb3h5Q2xpZW50Q2VydGlmaWNhdGVQYXRoID0gY3BQYXRoOwotICAgIHJldHVybiBOVUxMOwotfQotCi0jZW5kaWYgLyogU1NMX0VYUEVSSU1FTlRBTF9QUk9YWSAqLwotCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NzbC9zc2xfZW5naW5lX2RoLmMgYi9tb2R1bGVzL3NzbC9zc2xfZW5naW5lX2RoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZjQ5ZTYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9zc2wvc3NsX2VuZ2luZV9kaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLSNpZiAwCi09cG9kCi0jZW5kaWYKLS8qICAgICAgICAgICAgICAgICAgICAgIF8gICAgICAgICAgICAgXwotKiogIF8gX18gX19fICAgX19fICAgX198IHwgICAgX19fIF9fX3wgfCAgbW9kX3NzbAotKiogfCAnXyBgIF8gXCAvIF8gXCAvIF9gIHwgICAvIF9fLyBfX3wgfCAgQXBhY2hlIEludGVyZmFjZSB0byBPcGVuU1NMCi0qKiB8IHwgfCB8IHwgfCAoXykgfCAoX3wgfCAgIFxfXyBcX18gXCB8ICB3d3cubW9kc3NsLm9yZwotKiogfF98IHxffCB8X3xcX19fLyBcX18sX3xfX198X19fL19fXy9ffCAgZnRwLm1vZHNzbC5vcmcKLSoqICAgICAgICAgICAgICAgICAgICAgIHxfX19fX3wKLSoqIHNzbF9lbmdpbmVfZGguYyAKLSoqIERpZmZpZS1IZWxsbWFuIEJ1aWx0LWluIFRlbXBvcmFyeSBQYXJhbWV0ZXJzCi0qLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgUmFsZiBTLiBFbmdlbHNjaGFsbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLSAqICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLSAqICAgICBSYWxmIFMuIEVuZ2Vsc2NoYWxsIDxyc2VAZW5nZWxzY2hhbGwuY29tPiBmb3IgdXNlIGluIHRoZQotICogICAgIG1vZF9zc2wgcHJvamVjdCAoaHR0cDovL3d3dy5tb2Rzc2wub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAibW9kX3NzbCIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIHJzZUBlbmdlbHNjaGFsbC5jb20uCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIm1vZF9zc2wiCi0gKiAgICBub3IgbWF5ICJtb2Rfc3NsIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvcgotICogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFJhbGYgUy4gRW5nZWxzY2hhbGwuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotICogICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+IGZvciB1c2UgaW4gdGhlCi0gKiAgICAgbW9kX3NzbCBwcm9qZWN0IChodHRwOi8vd3d3Lm1vZHNzbC5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBSQUxGIFMuIEVOR0VMU0NIQUxMIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBSQUxGIFMuIEVOR0VMU0NIQUxMIE9SCi0gKiBISVMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLQotI2luY2x1ZGUgIm1vZF9zc2wuaCIKLQotLyogLS0tLUJFR0lOIEdFTkVSQVRFRCBTRUNUSU9OLS0tLS0tLS0gKi8KLQotLyoKLSoqIERpZmZpZS1IZWxsbWFuLVBhcmFtZXRlcnM6ICg1MTIgYml0KQotKiogICAgIHByaW1lOgotKiogICAgICAgICAwMDpkNDpiYzpkNToyNDowNjpmNjo5YjozNTo5OTo0Yjo4ODpkZTo1ZDpiODoKLSoqICAgICAgICAgOTY6ODI6Yzg6MTU6N2Y6NjI6ZDg6ZjM6MzY6MzM6ZWU6NTc6NzI6ZjE6MWY6Ci0qKiAgICAgICAgIDA1OmFiOjIyOmQ2OmI1OjE0OjViOjlmOjI0OjFlOjVhOmNjOjMxOmZmOjA5OgotKiogICAgICAgICAwYTo0YjpjNzoxMTo0ODo5Nzo2Zjo3Njo3OTo1MDo5NDplNzoxZTo3OTowMzoKLSoqICAgICAgICAgNTI6OWY6NWE6ODI6NGIKLSoqICAgICBnZW5lcmF0b3I6IDIgKDB4MikKLSoqIERpZmZpZS1IZWxsbWFuLVBhcmFtZXRlcnM6ICgxMDI0IGJpdCkKLSoqICAgICBwcmltZToKLSoqICAgICAgICAgMDA6ZTY6OTY6OWQ6M2Q6NDk6NWI6ZTM6MmM6N2M6ZjE6ODA6YzM6YmQ6ZDQ6Ci0qKiAgICAgICAgIDc5OjhlOjkxOmI3OjgxOjgyOjUxOmJiOjA1OjVlOjJhOjIwOjY0OjkwOjRhOgotKiogICAgICAgICA3OTphNzo3MDpmYToxNTphMjo1OTpjYjpkNToyMzphNjphNjplZjowOTpjNDoKLSoqICAgICAgICAgMzA6NDg6ZDU6YTI6MmY6OTc6MWY6M2M6MjA6MTI6OWI6NDg6MDA6MGU6NmU6Ci0qKiAgICAgICAgIGRkOjA2OjFjOmJjOjA1OjNlOjM3OjFkOjc5OjRlOjUzOjI3OmRmOjYxOjFlOgotKiogICAgICAgICBiYjpiZToxYjphYzo5Yjo1Yzo2MDo0NDpjZjowMjozZDo3NjplMDo1ZTplYToKLSoqICAgICAgICAgOWI6YWQ6OTk6MWI6MTM6YTY6M2M6OTc6NGU6OWU6ZjE6ODM6OWU6YjU6ZGI6Ci0qKiAgICAgICAgIDEyOjUxOjM2OmY3OjI2OjJlOjU2OmE4Ojg3OjE1OjM4OmRmOmQ4OjIzOmM2OgotKiogICAgICAgICA1MDo1MDo4NTplMjoxZjowZDpkNTpjODo2YgotKiogICAgIGdlbmVyYXRvcjogMiAoMHgyKQotKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgZGg1MTJfcFtdID0KLXsKLSAgICAweEQ0LCAweEJDLCAweEQ1LCAweDI0LCAweDA2LCAweEY2LCAweDlCLCAweDM1LCAweDk5LCAweDRCLCAweDg4LCAweERFLAotICAgIDB4NUQsIDB4QjgsIDB4OTYsIDB4ODIsIDB4QzgsIDB4MTUsIDB4N0YsIDB4NjIsIDB4RDgsIDB4RjMsIDB4MzYsIDB4MzMsCi0gICAgMHhFRSwgMHg1NywgMHg3MiwgMHhGMSwgMHgxRiwgMHgwNSwgMHhBQiwgMHgyMiwgMHhENiwgMHhCNSwgMHgxNCwgMHg1QiwKLSAgICAweDlGLCAweDI0LCAweDFFLCAweDVBLCAweENDLCAweDMxLCAweEZGLCAweDA5LCAweDBBLCAweDRCLCAweEM3LCAweDExLAotICAgIDB4NDgsIDB4OTcsIDB4NkYsIDB4NzYsIDB4NzksIDB4NTAsIDB4OTQsIDB4RTcsIDB4MUUsIDB4NzksIDB4MDMsIDB4NTIsCi0gICAgMHg5RiwgMHg1QSwgMHg4MiwgMHg0QiwKLX07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBkaDUxMl9nW10gPQotewotICAgIDB4MDIsCi19OwotCi1zdGF0aWMgREggKmdldF9kaDUxMigpCi17Ci0gICAgREggKmRoOwotCi0gICAgaWYgKChkaCA9IERIX25ldygpKSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gKE5VTEwpOwotICAgIGRoLT5wID0gQk5fYmluMmJuKGRoNTEyX3AsIHNpemVvZihkaDUxMl9wKSwgTlVMTCk7Ci0gICAgZGgtPmcgPSBCTl9iaW4yYm4oZGg1MTJfZywgc2l6ZW9mKGRoNTEyX2cpLCBOVUxMKTsKLSAgICBpZiAoKGRoLT5wID09IE5VTEwpIHx8IChkaC0+ZyA9PSBOVUxMKSkKLSAgICAgICAgcmV0dXJuIChOVUxMKTsKLSAgICByZXR1cm4gKGRoKTsKLX0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGRoMTAyNF9wW10gPQotewotICAgIDB4RTYsIDB4OTYsIDB4OUQsIDB4M0QsIDB4NDksIDB4NUIsIDB4RTMsIDB4MkMsIDB4N0MsIDB4RjEsIDB4ODAsIDB4QzMsCi0gICAgMHhCRCwgMHhENCwgMHg3OSwgMHg4RSwgMHg5MSwgMHhCNywgMHg4MSwgMHg4MiwgMHg1MSwgMHhCQiwgMHgwNSwgMHg1RSwKLSAgICAweDJBLCAweDIwLCAweDY0LCAweDkwLCAweDRBLCAweDc5LCAweEE3LCAweDcwLCAweEZBLCAweDE1LCAweEEyLCAweDU5LAotICAgIDB4Q0IsIDB4RDUsIDB4MjMsIDB4QTYsIDB4QTYsIDB4RUYsIDB4MDksIDB4QzQsIDB4MzAsIDB4NDgsIDB4RDUsIDB4QTIsCi0gICAgMHgyRiwgMHg5NywgMHgxRiwgMHgzQywgMHgyMCwgMHgxMiwgMHg5QiwgMHg0OCwgMHgwMCwgMHgwRSwgMHg2RSwgMHhERCwKLSAgICAweDA2LCAweDFDLCAweEJDLCAweDA1LCAweDNFLCAweDM3LCAweDFELCAweDc5LCAweDRFLCAweDUzLCAweDI3LCAweERGLAotICAgIDB4NjEsIDB4MUUsIDB4QkIsIDB4QkUsIDB4MUIsIDB4QUMsIDB4OUIsIDB4NUMsIDB4NjAsIDB4NDQsIDB4Q0YsIDB4MDIsCi0gICAgMHgzRCwgMHg3NiwgMHhFMCwgMHg1RSwgMHhFQSwgMHg5QiwgMHhBRCwgMHg5OSwgMHgxQiwgMHgxMywgMHhBNiwgMHgzQywKLSAgICAweDk3LCAweDRFLCAweDlFLCAweEYxLCAweDgzLCAweDlFLCAweEI1LCAweERCLCAweDEyLCAweDUxLCAweDM2LCAweEY3LAotICAgIDB4MjYsIDB4MkUsIDB4NTYsIDB4QTgsIDB4ODcsIDB4MTUsIDB4MzgsIDB4REYsIDB4RDgsIDB4MjMsIDB4QzYsIDB4NTAsCi0gICAgMHg1MCwgMHg4NSwgMHhFMiwgMHgxRiwgMHgwRCwgMHhENSwgMHhDOCwgMHg2QiwKLX07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBkaDEwMjRfZ1tdID0KLXsKLSAgICAweDAyLAotfTsKLQotc3RhdGljIERIICpnZXRfZGgxMDI0KCkKLXsKLSAgICBESCAqZGg7Ci0KLSAgICBpZiAoKGRoID0gREhfbmV3KCkpID09IE5VTEwpCi0gICAgICAgIHJldHVybiAoTlVMTCk7Ci0gICAgZGgtPnAgPSBCTl9iaW4yYm4oZGgxMDI0X3AsIHNpemVvZihkaDEwMjRfcCksIE5VTEwpOwotICAgIGRoLT5nID0gQk5fYmluMmJuKGRoMTAyNF9nLCBzaXplb2YoZGgxMDI0X2cpLCBOVUxMKTsKLSAgICBpZiAoKGRoLT5wID09IE5VTEwpIHx8IChkaC0+ZyA9PSBOVUxMKSkKLSAgICAgICAgcmV0dXJuIChOVUxMKTsKLSAgICByZXR1cm4gKGRoKTsKLX0KLS8qIC0tLS1FTkQgR0VORVJBVEVEIFNFQ1RJT04tLS0tLS0tLS0tICovCi0KLURIICpzc2xfZGhfR2V0VG1wUGFyYW0oaW50IG5LZXlMZW4pCi17Ci0gICAgREggKmRoOwotCi0gICAgaWYgKG5LZXlMZW4gPT0gNTEyKQotICAgICAgICBkaCA9IGdldF9kaDUxMigpOwotICAgIGVsc2UgaWYgKG5LZXlMZW4gPT0gMTAyNCkKLSAgICAgICAgZGggPSBnZXRfZGgxMDI0KCk7Ci0gICAgZWxzZQotICAgICAgICBkaCA9IGdldF9kaDEwMjQoKTsKLSAgICByZXR1cm4gZGg7Ci19Ci0KLURIICpzc2xfZGhfR2V0UGFyYW1Gcm9tRmlsZShjaGFyICpmaWxlKQotewotICAgIERIICpkaCA9IE5VTEw7Ci0gICAgQklPICpiaW87Ci0KLSAgICBpZiAoKGJpbyA9IEJJT19uZXdfZmlsZShmaWxlLCAiciIpKSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSNpZiBTU0xfTElCUkFSWV9WRVJTSU9OIDwgMHgwMDkwNDAwMAotICAgIGRoID0gUEVNX3JlYWRfYmlvX0RIcGFyYW1zKGJpbywgTlVMTCwgTlVMTCk7Ci0jZWxzZQotICAgIGRoID0gUEVNX3JlYWRfYmlvX0RIcGFyYW1zKGJpbywgTlVMTCwgTlVMTCwgTlVMTCk7Ci0jZW5kaWYKLSAgICBCSU9fZnJlZShiaW8pOwotICAgIHJldHVybiAoZGgpOwotfQotCi0vKgotPWN1dAotIyMKLSMjICBFbWJlZGRlZCBQZXJsIHNjcmlwdCBmb3IgZ2VuZXJhdGluZyB0aGUgdGVtcG9yYXJ5IERIIHBhcmFtZXRlcnMKLSMjCi0KLXJlcXVpcmUgNS4wMDM7Ci11c2Ugc3RyaWN0OwotCi0jICAgY29uZmlndXJhdGlvbgotbXkgJGZpbGUgID0gJDA7Ci1teSAkYmVnaW4gPSAnLS0tLUJFR0lOIEdFTkVSQVRFRCBTRUNUSU9OLS0tLS0tLS0nOwotbXkgJGVuZCAgID0gJy0tLS1FTkQgR0VORVJBVEVEIFNFQ1RJT04tLS0tLS0tLS0tJzsKLQotIyAgIHJlYWQgb3Vyc2VsZiBhbmQga2VlcCBhIGJhY2t1cAotb3BlbihGUCwgIjwkZmlsZSIpIHx8IGRpZTsKLW15ICRzb3VyY2UgPSAnJzsKLSRzb3VyY2UgLj0gJF8gd2hpbGUgKDxGUD4pOwotY2xvc2UoRlApOwotb3BlbihGUCwgIj4kZmlsZS5iYWsiKSB8fCBkaWU7Ci1wcmludCBGUCAkc291cmNlOwotY2xvc2UoRlApOwotCi0jICAgZ2VuZXJhdGUgdGhlIERIIHBhcmFtZXRlcnMKLXByaW50ICIxLiBHZW5lcmF0ZSA1MTIgYW5kIDEwMjQgYml0IERpZmZpZS1IZWxsbWFuIHBhcmFtZXRlcnMgKHAsIGcpXG4iOwotbXkgJHJhbmQgPSAnJzsKLWZvcmVhY2ggJGZpbGUgKHF3KC92YXIvbG9nL21lc3NhZ2VzIC92YXIvYWRtL21lc3NhZ2VzIAotICAgICAgICAgICAgICAgICAgL2tlcm5lbCAvdm11bml4IC92bWxpbnV6IC9ldGMvaG9zdHMgL2V0Yy9yZXNvbHYuY29uZikpIHsKLSAgICBpZiAoLWYgJGZpbGUpIHsKLSAgICAgICAgJHJhbmQgPSAkZmlsZSAgICAgaWYgKCRyYW5kIGVxICcnKTsKLSAgICAgICAgJHJhbmQgLj0gIjokZmlsZSIgaWYgKCRyYW5kIG5lICcnKTsKLSAgICB9Ci19Ci0kcmFuZCA9ICItcmFuZCAkcmFuZCIgaWYgKCRyYW5kIG5lICcnKTsKLXN5c3RlbSgib3BlbnNzbCBnZW5kaCAkcmFuZCAtb3V0IGRoNTEyLnBlbSA1MTIiKTsKLXN5c3RlbSgib3BlbnNzbCBnZW5kaCAkcmFuZCAtb3V0IGRoMTAyNC5wZW0gMTAyNCIpOwotCi0jICAgZ2VuZXJhdGUgREggcGFyYW0gaW5mbyAKLW15ICRkaGluZm8gPSAnJzsKLW9wZW4oRlAsICJvcGVuc3NsIGRoIC1ub291dCAtdGV4dCAtaW4gZGg1MTIucGVtIHwiKSB8fCBkaWU7Ci0kZGhpbmZvIC49ICRfIHdoaWxlICg8RlA+KTsKLWNsb3NlKEZQKTsKLW9wZW4oRlAsICJvcGVuc3NsIGRoIC1ub291dCAtdGV4dCAtaW4gZGgxMDI0LnBlbSB8IikgfHwgZGllOwotJGRoaW5mbyAuPSAkXyB3aGlsZSAoPEZQPik7Ci1jbG9zZShGUCk7Ci0kZGhpbmZvID1+IHN8XnwqKiB8bWc7Ci0kZGhpbmZvID0gIlxuXC9cKlxuJGRoaW5mb1wqXC9cblxuIjsKLQotIyAgIGdlbmVyYXRlIEMgc291cmNlIGZyb20gREggcGFyYW1zCi1teSAkZGhzb3VyY2UgPSAnJzsKLW9wZW4oRlAsICJvcGVuc3NsIGRoIC1ub291dCAtQyAtaW4gZGg1MTIucGVtIHwgaW5kZW50IHwgZXhwYW5kIC04IHwiKSB8fCBkaWU7Ci0kZGhzb3VyY2UgLj0gJF8gd2hpbGUgKDxGUD4pOwotY2xvc2UoRlApOwotb3BlbihGUCwgIm9wZW5zc2wgZGggLW5vb3V0IC1DIC1pbiBkaDEwMjQucGVtIHwgaW5kZW50IHwgZXhwYW5kIC04IHwiKSB8fCBkaWU7Ci0kZGhzb3VyY2UgLj0gJF8gd2hpbGUgKDxGUD4pOwotY2xvc2UoRlApOwotJGRoc291cmNlID1+IHN8KERIXHMrXCpnZXRfZGgpfHN0YXRpYyAkMXxzZzsKLQotIyAgIGdlbmVyYXRlIG91dHB1dAotbXkgJG8gPSAkZGhpbmZvIC4gJGRoc291cmNlOwotCi0jICAgaW5zZXJ0IHRoZSBnZW5lcmF0ZWQgY29kZSBhdCB0aGUgdGFyZ2V0IGxvY2F0aW9uCi0kc291cmNlID1+IHN8KFwvXCogJGJlZ2luLis/XG4pLipcbiguKj9cL1wqICRlbmQpfCQxJG8kMnxzOwotCi0jICAgYW5kIHVwZGF0ZSB0aGUgc291cmNlIG9uIGRpc2sKLXByaW50ICJVcGRhdGluZyBmaWxlIGAkZmlsZSdcbiI7Ci1vcGVuKEZQLCAiPiRmaWxlIikgfHwgZGllOwotcHJpbnQgRlAgJHNvdXJjZTsKLWNsb3NlKEZQKTsKLQotIyAgIGNsZWFudXAKLXVubGluaygiZGg1MTIucGVtIik7Ci11bmxpbmsoImRoMTAyNC5wZW0iKTsKLQotPXBvZAotKi8KZGlmZiAtLWdpdCBhL21vZHVsZXMvc3NsL3NzbF9lbmdpbmVfaW5pdC5jIGIvbW9kdWxlcy9zc2wvc3NsX2VuZ2luZV9pbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMjdjNGEuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9zc2wvc3NsX2VuZ2luZV9pbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkwICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgIF8gICAgICAgICAgICAgXwotKiogIF8gX18gX19fICAgX19fICAgX198IHwgICAgX19fIF9fX3wgfCAgbW9kX3NzbAotKiogfCAnXyBgIF8gXCAvIF8gXCAvIF9gIHwgICAvIF9fLyBfX3wgfCAgQXBhY2hlIEludGVyZmFjZSB0byBPcGVuU1NMCi0qKiB8IHwgfCB8IHwgfCAoXykgfCAoX3wgfCAgIFxfXyBcX18gXCB8ICB3d3cubW9kc3NsLm9yZwotKiogfF98IHxffCB8X3xcX19fLyBcX18sX3xfX198X19fL19fXy9ffCAgZnRwLm1vZHNzbC5vcmcKLSoqICAgICAgICAgICAgICAgICAgICAgIHxfX19fX3wKLSoqICBzc2xfZW5naW5lX2luaXQuYwotKiogIEluaXRpYWxpemF0aW9uIG9mIFNlcnZlcnMKLSovCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBSYWxmIFMuIEVuZ2Vsc2NoYWxsLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICogICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotICogICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+IGZvciB1c2UgaW4gdGhlCi0gKiAgICAgbW9kX3NzbCBwcm9qZWN0IChodHRwOi8vd3d3Lm1vZHNzbC5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJtb2Rfc3NsIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICogICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgcnNlQGVuZ2Vsc2NoYWxsLmNvbS4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAibW9kX3NzbCIKLSAqICAgIG5vciBtYXkgIm1vZF9zc2wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yCi0gKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgUmFsZiBTLiBFbmdlbHNjaGFsbC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci0gKiAgICAgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGVuZ2Vsc2NoYWxsLmNvbT4gZm9yIHVzZSBpbiB0aGUKLSAqICAgICBtb2Rfc3NsIHByb2plY3QgKGh0dHA6Ly93d3cubW9kc3NsLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFJBTEYgUy4gRU5HRUxTQ0hBTEwgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFJBTEYgUy4gRU5HRUxTQ0hBTEwgT1IKLSAqIEhJUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgQmVuIExhdXJpZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQmVuIExhdXJpZQotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlLVNTTCBIVFRQIHNlcnZlciBwcm9qZWN0LiIKLSAqCi0gKiA0LiBUaGUgbmFtZSAiQXBhY2hlLVNTTCBTZXJ2ZXIiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogNS4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBCZW4gTGF1cmllCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUtU1NMIEhUVFAgc2VydmVyIHByb2plY3QuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQkVOIExBVVJJRSBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQkVOIExBVVJJRSBPUgotICogSElTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGBgUmVjdXJzaXZlLCBhZGouOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZSBSZWN1cnNpdmUuJycKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBVbmtub3duICAgKi8KLSNpbmNsdWRlICJtb2Rfc3NsLmgiCi0KLQotLyogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogIE1vZHVsZSBJbml0aWFsaXphdGlvbgotKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qLwotCi0vKgotICogIFBlci1tb2R1bGUgaW5pdGlhbGl6YXRpb24KLSAqLwotdm9pZCBzc2xfaW5pdF9Nb2R1bGUoc2VydmVyX3JlYyAqcywgcG9vbCAqcCkKLXsKLSAgICBTU0xNb2RDb25maWdSZWMgKm1jID0gbXlNb2RDb25maWcoKTsKLSAgICBTU0xTcnZDb25maWdSZWMgKnNjOwotICAgIHNlcnZlcl9yZWMgKnMyOwotICAgIGNoYXIgKmNwOwotCi0gICAgbWMtPm5Jbml0Q291bnQrKzsKLQotICAgIC8qCi0gICAgICogTGV0IHVzIGNsZWFudXAgb24gcmVzdGFydHMgYW5kIGV4aXN0cwotICAgICAqLwotICAgIGFwX3JlZ2lzdGVyX2NsZWFudXAocCwgcywgc3NsX2luaXRfTW9kdWxlS2lsbCwgc3NsX2luaXRfQ2hpbGRLaWxsKTsKLQotICAgIC8qCi0gICAgICogQW55IGluaXQgcm91bmQgZml4ZXMgdGhlIGdsb2JhbCBjb25maWcKLSAgICAgKi8KLSAgICBzc2xfY29uZmlnX2dsb2JhbF9jcmVhdGUoKTsgLyoganVzdCB0byBhdm9pZCBwcm9ibGVtcyAqLwotICAgIHNzbF9jb25maWdfZ2xvYmFsX2ZpeCgpOwotCi0gICAgLyoKLSAgICAgKiAgdHJ5IHRvIGZpeCB0aGUgY29uZmlndXJhdGlvbiBhbmQgb3BlbiB0aGUgZGVkaWNhdGVkIFNTTAotICAgICAqICBsb2dmaWxlIGFzIGVhcmx5IGFzIHBvc3NpYmxlCi0gICAgICovCi0gICAgZm9yIChzMiA9IHM7IHMyICE9IE5VTEw7IHMyID0gczItPm5leHQpIHsKLSAgICAgICAgc2MgPSBteVNydkNvbmZpZyhzMik7Ci0KLSAgICAgICAgLyogRml4IHVwIHN0dWZmIHRoYXQgbWF5IG5vdCBoYXZlIGJlZW4gc2V0ICovCi0gICAgICAgIGlmIChzYy0+YkVuYWJsZWQgPT0gVU5TRVQpCi0gICAgICAgICAgICBzYy0+YkVuYWJsZWQgPSBGQUxTRTsKLSAgICAgICAgaWYgKHNjLT5uVmVyaWZ5Q2xpZW50ID09IFNTTF9DVkVSSUZZX1VOU0VUKQotICAgICAgICAgICAgc2MtPm5WZXJpZnlDbGllbnQgPSBTU0xfQ1ZFUklGWV9OT05FOwotICAgICAgICBpZiAoc2MtPm5WZXJpZnlEZXB0aCA9PSBVTlNFVCkKLSAgICAgICAgICAgIHNjLT5uVmVyaWZ5RGVwdGggPSAxOwotI2lmZGVmIFNTTF9FWFBFUklNRU5UQUxfUFJPWFkKLSAgICAgICAgaWYgKHNjLT5uUHJveHlWZXJpZnlEZXB0aCA9PSBVTlNFVCkKLSAgICAgICAgICAgIHNjLT5uUHJveHlWZXJpZnlEZXB0aCA9IDE7Ci0jZW5kaWYKLSAgICAgICAgaWYgKHNjLT5uU2Vzc2lvbkNhY2hlVGltZW91dCA9PSBVTlNFVCkKLSAgICAgICAgICAgIHNjLT5uU2Vzc2lvbkNhY2hlVGltZW91dCA9IFNTTF9TRVNTSU9OX0NBQ0hFX1RJTUVPVVQ7Ci0gICAgICAgIGlmIChzYy0+blBhc3NQaHJhc2VEaWFsb2dUeXBlID09IFNTTF9QUFRZUEVfVU5TRVQpCi0gICAgICAgICAgICBzYy0+blBhc3NQaHJhc2VEaWFsb2dUeXBlID0gU1NMX1BQVFlQRV9CVUlMVElOOwotCi0gICAgICAgIC8qIE9wZW4gdGhlIGRlZGljYXRlZCBTU0wgbG9nZmlsZSAqLwotICAgICAgICBzc2xfbG9nX29wZW4ocywgczIsIHApOwotICAgIH0KLQotICAgIC8qCi0gICAgICogSWRlbnRpZmljYXRpb24KLSAgICAgKi8KLSAgICBpZiAobWMtPm5Jbml0Q291bnQgPT0gMSkgewotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfSU5GTywgIlNlcnZlcjogJXMsIEludGVyZmFjZTogJXMsIExpYnJhcnk6ICVzIiwKLSAgICAgICAgICAgICAgICBTRVJWRVJfQkFTRVZFUlNJT04sCi0gICAgICAgICAgICAgICAgc3NsX3Zhcl9sb29rdXAocCwgTlVMTCwgTlVMTCwgTlVMTCwgIlNTTF9WRVJTSU9OX0lOVEVSRkFDRSIpLAotICAgICAgICAgICAgICAgIHNzbF92YXJfbG9va3VwKHAsIE5VTEwsIE5VTEwsIE5VTEwsICJTU0xfVkVSU0lPTl9MSUJSQVJZIikpOwotI2lmZGVmIFdJTjMyCi0gICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19XQVJOLCAiWW91IGFyZSB1c2luZyBtb2Rfc3NsIHVuZGVyIFdpbjMyLiAiIAotICAgICAgICAgICAgICAgICJUaGlzIGNvbWJpbmF0aW9uIGlzICpOT1QqIG9mZmljaWFsbHkgc3VwcG9ydGVkLiAiCi0gICAgICAgICAgICAgICAgIlVzZSBpdCBhdCB5b3VyIG93biByaXNrISIpOwotI2VuZGlmCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBJbml0aWFsaXphdGlvbiByb3VuZCBpbmZvcm1hdGlvbgotICAgICAqLwotICAgIGlmIChtYy0+bkluaXRDb3VudCA9PSAxKQotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfSU5GTywgIkluaXQ6IDFzdCBzdGFydHVwIHJvdW5kIChzdGlsbCBub3QgZGV0YWNoZWQpIik7Ci0gICAgZWxzZSBpZiAobWMtPm5Jbml0Q291bnQgPT0gMikKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0lORk8sICJJbml0OiAybmQgc3RhcnR1cCByb3VuZCAoYWxyZWFkeSBkZXRhY2hlZCkiKTsKLSAgICBlbHNlCi0gICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19JTkZPLCAiSW5pdDogJWQlcyByZXN0YXJ0IHJvdW5kIChhbHJlYWR5IGRldGFjaGVkKSIsCi0gICAgICAgICAgICAgICAgbWMtPm5Jbml0Q291bnQtMiwgKG1jLT5uSW5pdENvdW50LTIpID09IDEgPyAic3QiIDogIm5kIik7Ci0KLSNpZmRlZiBTU0xfVkVORE9SCi0gICAgYXBfaG9va191c2UoImFwOjptb2Rfc3NsOjp2ZW5kb3I6OmluaXRfbW9kdWxlIiwKLSAgICAgICAgICAgICAgICBBUF9IT09LX1NJRzModm9pZCxwdHIscHRyKSwgQVBfSE9PS19BTEwsIHMsIHApOwotI2VuZGlmCi0KLSAgICAvKgotICAgICAqICBUaGUgaW5pdGlhbGl6YXRpb24gcGhhc2UgaW5zaWRlIHRoZSBBcGFjaGUgQVBJIGlzIHRvdGFsbHkgYm9ndXMuCi0gICAgICogIFdlIGFjdHVhbGx5IGhhdmUgdGhyZWUgbm9uLXRyaXZpYWwgcHJvYmxlbXM6Ci0gICAgICoKLSAgICAgKiAgMS4gVW5kZXIgVW5peCB0aGUgQVBJIGRvZXMgYSAyLXJvdW5kIGluaXRpYWxpemF0aW9uIG9mIG1vZHVsZXMgd2hpbGUKLSAgICAgKiAgICAgdW5kZXIgV2luMzIgaXQgZG9lc24ndC4gVGhpcyBtZWFucyB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IGF0Ci0gICAgICogICAgIGxlYXN0IHRoZSBwYXNzIHBocmFzZSBkaWFsb2cgZG9lc24ndCBvY2N1ciB0d2ljZS4gIFdlIG92ZXJjb21lIHRoaXMKLSAgICAgKiAgICAgcHJvYmxlbSBieSB1c2luZyBhIGNvdW50ZXIgKG1jLT5uSW5pdENvdW50KSB3aGljaCBoYXMgdG8KLSAgICAgKiAgICAgc3Vydml2ZSB0aGUgaW5pdCByb3VuZHMuCi0gICAgICoKLSAgICAgKiAgMi4gQmV0d2VlbiB0aGUgZmlyc3QgYW5kIHRoZSBzZWNvbmQgcm91bmQgQXBhY2hlIGRldGFjaGVzIGZyb20KLSAgICAgKiAgICAgdGhlIHRlcm1pbmFsIHVuZGVyIFVuaXguIFRoaXMgbWVhbnMgdGhhdCBvdXIgcGFzcyBwaHJhc2UgZGlhbG9nCi0gICAgICogICAgIF9oYXNfIHRvIGJlIGRvbmUgaW4gdGhlIGZpcnN0IHJvdW5kIGFuZCBfY2Fubm90XyBiZSBkb25lIGluIHRoZQotICAgICAqICAgICBzZWNvbmQgcm91bmQuCi0gICAgICoKLSAgICAgKiAgMy4gV2hlbiBEeW5hbWljIFNoYXJlZCBPYmplY3QgKERTTykgbWVjaGFuaXNtIGlzIHVzZWQgdW5kZXIgVW5peCB0aGUKLSAgICAgKiAgICAgbW9kdWxlIHNlZ21lbnQgKGNvZGUgJiBkYXRhKSBnZXRzIHVubG9hZGVkIGFuZCByZS1sb2FkZWQgYmV0d2VlbgotICAgICAqICAgICB0aGUgZmlyc3QgYW5kIHRoZSBzZWNvbmQgcm91bmQuIFRoaXMgbWVhbnMgbm8gZ2xvYmFsIGRhdGEgc3Vydml2ZXMKLSAgICAgKiAgICAgYmV0d2VlbiBmaXJzdCBhbmQgdGhlIHNlY29uZCBpbml0IHJvdW5kLiBXZSBvdmVyY29tZSB0aGlzIGJ5IHVzaW5nCi0gICAgICogICAgIGFuIGVudHJ5ICgic3NsX21vZHVsZSIpIGluc2lkZSB0aGUgYXBfZ2xvYmFsX2N0eC4KLSAgICAgKgotICAgICAqICBUaGUgc2l0dWF0aW9uIGFzIGEgdGFibGU6Ci0gICAgICoKLSAgICAgKiAgVW5peC9zdGF0aWMgVW5peC9EU08gICAgICAgICAgV2luMzIgICAgIEFjdGlvbiBSZXF1aXJlZAotICAgICAqICAgICAgICAgICAgICAoLURTSEFSRURfTU9EVUxFKSAoLURXSU4zMikKLSAgICAgKiAgLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogIC0gICAgICAgICAgIGxvYWQgbW9kdWxlICAgICAgIC0gICAgICAgICAtCi0gICAgICogIGluaXQgICAgICAgIGluaXQgICAgICAgICAgICAgIGluaXQgICAgICBTU0wgbGlicmFyeSBpbml0LCBQYXNzIFBocmFzZSBEaWFsb2cKLSAgICAgKiAgZGV0YWNoICAgICAgZGV0YWNoICAgICAgICAgICAgLSAgICAgICAgIC0KLSAgICAgKiAgLSAgICAgICAgICAgcmVsb2FkIG1vZHVsZSAgICAgLSAgICAgICAgIC0KLSAgICAgKiAgaW5pdCAgICAgICAgaW5pdCAgICAgICAgICAgICAgLSAgICAgICAgIFNTTCBsaWJyYXJ5IGluaXQsIG1vZF9zc2wgaW5pdAotICAgICAqCi0gICAgICogIE9rLCBub3cgdHJ5IHRvIHNvbHZlIHRoaXMgdG90YWxseSB1Z2x5IHNpdHVhdGlvbi4uLgotICAgICAqLwotCi0jaWZkZWYgU0hBUkVEX01PRFVMRQotICAgIHNzbF9sb2cocywgU1NMX0xPR19JTkZPLCAiSW5pdDogJXNuaXRpYWxpemluZyAlcyBsaWJyYXJ5IiwKLSAgICAgICAgICAgIG1jLT5uSW5pdENvdW50ID09IDEgPyAiSSIgOiAiUmVpIiwgU1NMX0xJQlJBUllfTkFNRSk7Ci0gICAgc3NsX2luaXRfU1NMTGlicmFyeSgpOwotI2Vsc2UKLSAgICBpZiAobWMtPm5Jbml0Q291bnQgPD0gMikgewotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfSU5GTywgIkluaXQ6ICVzbml0aWFsaXppbmcgJXMgbGlicmFyeSIsCi0gICAgICAgICAgICAgICAgbWMtPm5Jbml0Q291bnQgPT0gMSA/ICJJIiA6ICJSZWkiLCBTU0xfTElCUkFSWV9OQU1FKTsKLSAgICAgICAgc3NsX2luaXRfU1NMTGlicmFyeSgpOwotICAgIH0KLSNlbmRpZgotICAgIGlmIChtYy0+bkluaXRDb3VudCA9PSAxKSB7Ci0gICAgICAgIHNzbF9wcGhyYXNlX0hhbmRsZShzLCBwKTsKLSAgICAgICAgc3NsX2luaXRfVG1wS2V5c0hhbmRsZShTU0xfVEtQX0dFTiwgcywgcCk7Ci0jaWZuZGVmIFdJTjMyCi0gICAgICAgIHJldHVybjsKLSNlbmRpZgotICAgIH0KLQotICAgIC8qCi0gICAgICogU1NMIGV4dGVybmFsIGNyeXB0byBkZXZpY2UgKCJlbmdpbmUiKSBzdXBwb3J0Ci0gICAgICovCi0jaWZkZWYgU1NMX0VYUEVSSU1FTlRBTF9FTkdJTkUKLSAgICBzc2xfaW5pdF9FbmdpbmUocywgcCk7Ci0jZW5kaWYKLQotICAgIC8qCi0gICAgICogV2FybiB0aGUgdXNlciB0aGF0IGhlIHNob3VsZCB1c2UgdGhlIHNlc3Npb24gY2FjaGUuCi0gICAgICogQnV0IHdlIGNhbiBvcGVyYXRlIHdpdGhvdXQgaXQsIG9mIGNvdXJzZS4KLSAgICAgKi8KLSAgICBpZiAobWMtPm5TZXNzaW9uQ2FjaGVNb2RlID09IFNTTF9TQ01PREVfVU5TRVQpIHsKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX1dBUk4sCi0gICAgICAgICAgICAgICAgIkluaXQ6IFNlc3Npb24gQ2FjaGUgaXMgbm90IGNvbmZpZ3VyZWQgW2hpbnQ6IFNTTFNlc3Npb25DYWNoZV0iKTsKLSAgICAgICAgbWMtPm5TZXNzaW9uQ2FjaGVNb2RlID0gU1NMX1NDTU9ERV9OT05FOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIGluaXRpYWxpemUgdGhlIG11dGV4IGhhbmRsaW5nIGFuZCBzZXNzaW9uIGNhY2hpbmcKLSAgICAgKi8KLSAgICBzc2xfbXV0ZXhfaW5pdChzLCBwKTsKLSAgICBzc2xfc2NhY2hlX2luaXQocywgcCk7Ci0KLSAgICAvKgotICAgICAqIFNlZWQgdGhlIFBzZXVkbyBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciAoUFJORykKLSAgICAgKi8KLSAgICBzc2xfcmFuZF9zZWVkKHMsIHAsIFNTTF9SU0NUWF9TVEFSVFVQLCAiSW5pdDogIik7Ci0KLSAgICAvKgotICAgICAqICBhbGxvY2F0ZSB0aGUgdGVtcG9yYXJ5IFJTQSBrZXlzIGFuZCBESCBwYXJhbXMKLSAgICAgKi8KLSAgICBzc2xfaW5pdF9UbXBLZXlzSGFuZGxlKFNTTF9US1BfQUxMT0MsIHMsIHApOwotCi0gICAgLyoKLSAgICAgKiAgaW5pdGlhbGl6ZSBzZXJ2ZXJzCi0gICAgICovCi0gICAgc3NsX2xvZyhzLCBTU0xfTE9HX0lORk8sICJJbml0OiBJbml0aWFsaXppbmcgKHZpcnR1YWwpIHNlcnZlcnMgZm9yIFNTTCIpOwotICAgIGZvciAoczIgPSBzOyBzMiAhPSBOVUxMOyBzMiA9IHMyLT5uZXh0KSB7Ci0gICAgICAgIHNjID0gbXlTcnZDb25maWcoczIpOwotICAgICAgICAvKgotICAgICAgICAgKiBFaXRoZXIgbm93IHNraXAgdGhpcyBzZXJ2ZXIgd2hlbiBTU0wgaXMgZGlzYWJsZWQgZm9yCi0gICAgICAgICAqIGl0IG9yIGdpdmUgb3V0IHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCB3ZSdyZQotICAgICAgICAgKiBjb25maWd1cmluZy4KLSAgICAgICAgICovCi0gICAgICAgIGlmICghc2MtPmJFbmFibGVkKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIHNzbF9sb2coczIsIFNTTF9MT0dfSU5GTywKLSAgICAgICAgICAgICAgICAiSW5pdDogQ29uZmlndXJpbmcgc2VydmVyICVzIGZvciBTU0wgcHJvdG9jb2wiLAotICAgICAgICAgICAgICAgIHNzbF91dGlsX3Zob3N0aWQocCwgczIpKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBSZWFkIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgYW5kIGtleQotICAgICAgICAgKi8KLSAgICAgICAgc3NsX2luaXRfQ29uZmlndXJlU2VydmVyKHMyLCBwLCBzYyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDb25maWd1cmF0aW9uIGNvbnNpc3RlbmN5IGNoZWNrcwotICAgICAqLwotICAgIHNzbF9pbml0X0NoZWNrU2VydmVycyhzLCBwKTsKLQotICAgIC8qCi0gICAgICogIEFubm91bmNlIG1vZF9zc2wgYW5kIFNTTCBsaWJyYXJ5IGluIEhUVFAgU2VydmVyIGZpZWxkCi0gICAgICogIGFzIGBgbW9kX3NzbC9YLlguWCBPcGVuU1NML1guWC5YJycKLSAgICAgKi8KLSAgICBpZiAoKGNwID0gc3NsX3Zhcl9sb29rdXAocCwgTlVMTCwgTlVMTCwgTlVMTCwgIlNTTF9WRVJTSU9OX1BST0RVQ1QiKSkgIT0gTlVMTCAmJiBjcFswXSAhPSBOVUwpCi0gICAgICAgIGFwX2FkZF92ZXJzaW9uX2NvbXBvbmVudChjcCk7Ci0gICAgYXBfYWRkX3ZlcnNpb25fY29tcG9uZW50KHNzbF92YXJfbG9va3VwKHAsIE5VTEwsIE5VTEwsIE5VTEwsICJTU0xfVkVSU0lPTl9JTlRFUkZBQ0UiKSk7Ci0gICAgYXBfYWRkX3ZlcnNpb25fY29tcG9uZW50KHNzbF92YXJfbG9va3VwKHAsIE5VTEwsIE5VTEwsIE5VTEwsICJTU0xfVkVSU0lPTl9MSUJSQVJZIikpOwotCi0gICAgcmV0dXJuOwotfQotCi0vKgotICogIEluaXRpYWxpemUgU1NMIGxpYnJhcnkgKGFsc28gYWxyZWFkeSBuZWVkZWQgZm9yIHRoZSBwYXNzIHBocmFzZSBkaWFsb2cpCi0gKi8KLXZvaWQgc3NsX2luaXRfU1NMTGlicmFyeSh2b2lkKQotewotI2lmZGVmIFdJTjMyCi0gICAgQ1JZUFRPX21hbGxvY19pbml0KCk7Ci0jZW5kaWYKLSAgICBTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKCk7Ci0gICAgU1NMX2xpYnJhcnlfaW5pdCgpOwotICAgIHNzbF91dGlsX3RocmVhZF9zZXR1cCgpOwotICAgIFg1MDlWM19hZGRfc3RhbmRhcmRfZXh0ZW5zaW9ucygpOwotICAgIHJldHVybjsKLX0KLQotLyoKLSAqIFN1cHBvcnQgZm9yIGV4dGVybmFsIGEgQ3J5cHRvIERldmljZSAoImVuZ2luZSIpLCB1c3VhbGx5Ci0gKiBhIGhhcmR3YXJlIGFjY2VsbGVyYXRvciBjYXJkIGZvciBjcnlwdG8gb3BlcmF0aW9ucy4KLSAqLwotI2lmZGVmIFNTTF9FWFBFUklNRU5UQUxfRU5HSU5FCi12b2lkIHNzbF9pbml0X0VuZ2luZShzZXJ2ZXJfcmVjICpzLCBwb29sICpwKQotewotICAgIFNTTE1vZENvbmZpZ1JlYyAqbWMgPSBteU1vZENvbmZpZygpOwotICAgIEVOR0lORSAqZTsKLQotICAgIGlmIChtYy0+c3pDcnlwdG9EZXZpY2UgIT0gTlVMTCkgewotICAgICAgICBpZiAoKGUgPSBFTkdJTkVfYnlfaWQobWMtPnN6Q3J5cHRvRGV2aWNlKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SLCAiSW5pdDogRmFpbGVkIHRvIGxvYWQgQ3J5cHRvIERldmljZSBBUEkgYCVzJyIsCi0gICAgICAgICAgICAgICAgICAgIG1jLT5zekNyeXB0b0RldmljZSk7Ci0gICAgICAgICAgICBzc2xfZGllKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0ckVRKG1jLT5zekNyeXB0b0RldmljZSwgImNoaWwiKSkgCi0gICAgICAgICAgICBFTkdJTkVfY3RybChlLCBFTkdJTkVfQ1RSTF9DSElMX1NFVF9GT1JLQ0hFQ0ssIDEsIDAsIDApOwotICAgICAgICBpZiAoIUVOR0lORV9zZXRfZGVmYXVsdChlLCBFTkdJTkVfTUVUSE9EX0FMTCkpIHsKLSAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19FUlJPUiwgIkluaXQ6IEZhaWxlZCB0byBlbmFibGUgQ3J5cHRvIERldmljZSBBUEkgYCVzJyIsCi0gICAgICAgICAgICAgICAgICAgIG1jLT5zekNyeXB0b0RldmljZSk7Ci0gICAgICAgICAgICBzc2xfZGllKCk7Ci0gICAgICAgIH0KLSAgICAgICAgRU5HSU5FX2ZyZWUoZSk7Ci0gICAgfQotICAgIHJldHVybjsKLX0KLSNlbmRpZgotCi0vKgotICogSGFuZGxlIHRoZSBUZW1wb3JhcnkgUlNBIEtleXMgYW5kIERIIFBhcmFtcwotICovCi12b2lkIHNzbF9pbml0X1RtcEtleXNIYW5kbGUoaW50IGFjdGlvbiwgc2VydmVyX3JlYyAqcywgcG9vbCAqcCkKLXsKLSAgICBTU0xNb2RDb25maWdSZWMgKm1jID0gbXlNb2RDb25maWcoKTsKLSAgICBzc2xfYXNuMV90ICphc24xOwotICAgIHVuc2lnbmVkIGNoYXIgKnVjcDsKLSAgICBSU0EgKnJzYTsKLSAgICBESCAqZGg7Ci0KLSAgICAvKiBHZW5lcmF0ZSBLZXlzIGFuZCBQYXJhbXMgKi8KLSAgICBpZiAoYWN0aW9uID09IFNTTF9US1BfR0VOKSB7Ci0KLSAgICAgICAgLyogc2VlZCBQUk5HICovCi0gICAgICAgIHNzbF9yYW5kX3NlZWQocywgcCwgU1NMX1JTQ1RYX1NUQVJUVVAsICJJbml0OiAiKTsKLQotICAgICAgICAvKiBnZW5lcmF0ZSA1MTIgYml0IFJTQSBrZXkgKi8KLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0lORk8sICJJbml0OiBHZW5lcmF0aW5nIHRlbXBvcmFyeSBSU0EgcHJpdmF0ZSBrZXlzICg1MTIvMTAyNCBiaXRzKSIpOwotICAgICAgICBpZiAoKHJzYSA9IFJTQV9nZW5lcmF0ZV9rZXkoNTEyLCBSU0FfRjQsIE5VTEwsIE5VTEwpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1J8U1NMX0FERF9TU0xFUlIsIAotICAgICAgICAgICAgICAgICAgICAiSW5pdDogRmFpbGVkIHRvIGdlbmVyYXRlIHRlbXBvcmFyeSA1MTIgYml0IFJTQSBwcml2YXRlIGtleSIpOwotICAgICAgICAgICAgc3NsX2RpZSgpOwotICAgICAgICB9Ci0gICAgICAgIGFzbjEgPSAoc3NsX2FzbjFfdCAqKXNzbF9kc190YWJsZV9wdXNoKG1jLT50VG1wS2V5cywgIlJTQTo1MTIiKTsKLSAgICAgICAgYXNuMS0+bkRhdGEgID0gaTJkX1JTQVByaXZhdGVLZXkocnNhLCBOVUxMKTsKLSAgICAgICAgYXNuMS0+Y3BEYXRhID0gYXBfcGFsbG9jKG1jLT5wUG9vbCwgYXNuMS0+bkRhdGEpOwotICAgICAgICB1Y3AgPSBhc24xLT5jcERhdGE7IGkyZF9SU0FQcml2YXRlS2V5KHJzYSwgJnVjcCk7IC8qIDJuZCBhcmcgaW5jcmVtZW50cyAqLwotICAgICAgICBSU0FfZnJlZShyc2EpOwotCi0gICAgICAgIC8qIGdlbmVyYXRlIDEwMjQgYml0IFJTQSBrZXkgKi8KLSAgICAgICAgaWYgKChyc2EgPSBSU0FfZ2VuZXJhdGVfa2V5KDEwMjQsIFJTQV9GNCwgTlVMTCwgTlVMTCkpID09IE5VTEwpIHsKLSAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19FUlJPUnxTU0xfQUREX1NTTEVSUiwgCi0gICAgICAgICAgICAgICAgICAgICJJbml0OiBGYWlsZWQgdG8gZ2VuZXJhdGUgdGVtcG9yYXJ5IDEwMjQgYml0IFJTQSBwcml2YXRlIGtleSIpOwotICAgICAgICAgICAgc3NsX2RpZSgpOwotICAgICAgICB9Ci0gICAgICAgIGFzbjEgPSAoc3NsX2FzbjFfdCAqKXNzbF9kc190YWJsZV9wdXNoKG1jLT50VG1wS2V5cywgIlJTQToxMDI0Iik7Ci0gICAgICAgIGFzbjEtPm5EYXRhICA9IGkyZF9SU0FQcml2YXRlS2V5KHJzYSwgTlVMTCk7Ci0gICAgICAgIGFzbjEtPmNwRGF0YSA9IGFwX3BhbGxvYyhtYy0+cFBvb2wsIGFzbjEtPm5EYXRhKTsKLSAgICAgICAgdWNwID0gYXNuMS0+Y3BEYXRhOyBpMmRfUlNBUHJpdmF0ZUtleShyc2EsICZ1Y3ApOyAvKiAybmQgYXJnIGluY3JlbWVudHMgKi8KLSAgICAgICAgUlNBX2ZyZWUocnNhKTsKLQotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfSU5GTywgIkluaXQ6IENvbmZpZ3VyaW5nIHRlbXBvcmFyeSBESCBwYXJhbWV0ZXJzICg1MTIvMTAyNCBiaXRzKSIpOwotCi0gICAgICAgIC8qIGltcG9ydCA1MTIgYml0IERIIHBhcmFtICovCi0gICAgICAgIGlmICgoZGggPSBzc2xfZGhfR2V0VG1wUGFyYW0oNTEyKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SLCAiSW5pdDogRmFpbGVkIHRvIGltcG9ydCB0ZW1wb3JhcnkgNTEyIGJpdCBESCBwYXJhbWV0ZXJzIik7Ci0gICAgICAgICAgICBzc2xfZGllKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNuMSA9IChzc2xfYXNuMV90ICopc3NsX2RzX3RhYmxlX3B1c2gobWMtPnRUbXBLZXlzLCAiREg6NTEyIik7Ci0gICAgICAgIGFzbjEtPm5EYXRhICA9IGkyZF9ESHBhcmFtcyhkaCwgTlVMTCk7Ci0gICAgICAgIGFzbjEtPmNwRGF0YSA9IGFwX3BhbGxvYyhtYy0+cFBvb2wsIGFzbjEtPm5EYXRhKTsKLSAgICAgICAgdWNwID0gYXNuMS0+Y3BEYXRhOyBpMmRfREhwYXJhbXMoZGgsICZ1Y3ApOyAvKiAybmQgYXJnIGluY3JlbWVudHMgKi8KLSAgICAgICAgLyogbm8gbmVlZCB0byBmcmVlIGRoLCBpdCdzIHN0YXRpYyAqLwotCi0gICAgICAgIC8qIGltcG9ydCAxMDI0IGJpdCBESCBwYXJhbSAqLwotICAgICAgICBpZiAoKGRoID0gc3NsX2RoX0dldFRtcFBhcmFtKDEwMjQpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1IsICJJbml0OiBGYWlsZWQgdG8gaW1wb3J0IHRlbXBvcmFyeSAxMDI0IGJpdCBESCBwYXJhbWV0ZXJzIik7Ci0gICAgICAgICAgICBzc2xfZGllKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNuMSA9IChzc2xfYXNuMV90ICopc3NsX2RzX3RhYmxlX3B1c2gobWMtPnRUbXBLZXlzLCAiREg6MTAyNCIpOwotICAgICAgICBhc24xLT5uRGF0YSAgPSBpMmRfREhwYXJhbXMoZGgsIE5VTEwpOwotICAgICAgICBhc24xLT5jcERhdGEgPSBhcF9wYWxsb2MobWMtPnBQb29sLCBhc24xLT5uRGF0YSk7Ci0gICAgICAgIHVjcCA9IGFzbjEtPmNwRGF0YTsgaTJkX0RIcGFyYW1zKGRoLCAmdWNwKTsgLyogMm5kIGFyZyBpbmNyZW1lbnRzICovCi0gICAgICAgIC8qIG5vIG5lZWQgdG8gZnJlZSBkaCwgaXQncyBzdGF0aWMgKi8KLSAgICB9Ci0KLSAgICAvKiBBbGxvY2F0ZSBLZXlzIGFuZCBQYXJhbXMgKi8KLSAgICBlbHNlIGlmIChhY3Rpb24gPT0gU1NMX1RLUF9BTExPQykgewotCi0gICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19JTkZPLCAiSW5pdDogQ29uZmlndXJpbmcgdGVtcG9yYXJ5IFJTQSBwcml2YXRlIGtleXMgKDUxMi8xMDI0IGJpdHMpIik7Ci0KLSAgICAgICAgLyogYWxsb2NhdGUgNTEyIGJpdCBSU0Ega2V5ICovCi0gICAgICAgIGlmICgoYXNuMSA9IChzc2xfYXNuMV90ICopc3NsX2RzX3RhYmxlX2dldChtYy0+dFRtcEtleXMsICJSU0E6NTEyIikpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHVjcCA9IGFzbjEtPmNwRGF0YTsKLSAgICAgICAgICAgIGlmICgobWMtPnBUbXBLZXlzW1NTTF9US1BJRFhfUlNBNTEyXSA9IAotI2lmIFNTTF9MSUJSQVJZX1ZFUlNJT04gPj0gMHgwMDkwNzAwMAotICAgICAgICAgICAgICAgICAodm9pZCAqKWQyaV9SU0FQcml2YXRlS2V5KE5VTEwsIChjb25zdCB1bnNpZ25lZCBjaGFyICoqKSZ1Y3AsIGFzbjEtPm5EYXRhKSkgPT0gTlVMTCkgewotI2Vsc2UKLSAgICAgICAgICAgICAgICAgKHZvaWQgKilkMmlfUlNBUHJpdmF0ZUtleShOVUxMLCAmdWNwLCBhc24xLT5uRGF0YSkpID09IE5VTEwpIHsKLSNlbmRpZgotICAgICAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19FUlJPUiwgIkluaXQ6IEZhaWxlZCB0byBsb2FkIHRlbXBvcmFyeSA1MTIgYml0IFJTQSBwcml2YXRlIGtleSIpOwotICAgICAgICAgICAgICAgIHNzbF9kaWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIGFsbG9jYXRlIDEwMjQgYml0IFJTQSBrZXkgKi8KLSAgICAgICAgaWYgKChhc24xID0gKHNzbF9hc24xX3QgKilzc2xfZHNfdGFibGVfZ2V0KG1jLT50VG1wS2V5cywgIlJTQToxMDI0IikpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHVjcCA9IGFzbjEtPmNwRGF0YTsKLSAgICAgICAgICAgIGlmICgobWMtPnBUbXBLZXlzW1NTTF9US1BJRFhfUlNBMTAyNF0gPSAKLSNpZiBTU0xfTElCUkFSWV9WRVJTSU9OID49IDB4MDA5MDcwMDAKLSAgICAgICAgICAgICAgICAgKHZvaWQgKilkMmlfUlNBUHJpdmF0ZUtleShOVUxMLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKikmdWNwLCBhc24xLT5uRGF0YSkpID09IE5VTEwpIHsKLSNlbHNlCi0gICAgICAgICAgICAgICAgICh2b2lkICopZDJpX1JTQVByaXZhdGVLZXkoTlVMTCwgJnVjcCwgYXNuMS0+bkRhdGEpKSA9PSBOVUxMKSB7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1IsICJJbml0OiBGYWlsZWQgdG8gbG9hZCB0ZW1wb3JhcnkgMTAyNCBiaXQgUlNBIHByaXZhdGUga2V5Iik7Ci0gICAgICAgICAgICAgICAgc3NsX2RpZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0lORk8sICJJbml0OiBDb25maWd1cmluZyB0ZW1wb3JhcnkgREggcGFyYW1ldGVycyAoNTEyLzEwMjQgYml0cykiKTsKLQotICAgICAgICAvKiBhbGxvY2F0ZSA1MTIgYml0IERIIHBhcmFtICovCi0gICAgICAgIGlmICgoYXNuMSA9IChzc2xfYXNuMV90ICopc3NsX2RzX3RhYmxlX2dldChtYy0+dFRtcEtleXMsICJESDo1MTIiKSkgIT0gTlVMTCkgewotICAgICAgICAgICAgdWNwID0gYXNuMS0+Y3BEYXRhOwotICAgICAgICAgICAgaWYgKChtYy0+cFRtcEtleXNbU1NMX1RLUElEWF9ESDUxMl0gPSAKLSNpZiBTU0xfTElCUkFSWV9WRVJTSU9OID49IDB4MDA5MDcwMDAKLSAgICAgICAgICAgICAgICAgKHZvaWQgKilkMmlfREhwYXJhbXMoTlVMTCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiopJnVjcCwgYXNuMS0+bkRhdGEpKSA9PSBOVUxMKSB7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAodm9pZCAqKWQyaV9ESHBhcmFtcyhOVUxMLCAmdWNwLCBhc24xLT5uRGF0YSkpID09IE5VTEwpIHsKLSNlbmRpZgotICAgICAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19FUlJPUiwgIkluaXQ6IEZhaWxlZCB0byBsb2FkIHRlbXBvcmFyeSA1MTIgYml0IERIIHBhcmFtZXRlcnMiKTsKLSAgICAgICAgICAgICAgICBzc2xfZGllKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBhbGxvY2F0ZSAxMDI0IGJpdCBESCBwYXJhbSAqLwotICAgICAgICBpZiAoKGFzbjEgPSAoc3NsX2FzbjFfdCAqKXNzbF9kc190YWJsZV9nZXQobWMtPnRUbXBLZXlzLCAiREg6MTAyNCIpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICB1Y3AgPSBhc24xLT5jcERhdGE7Ci0gICAgICAgICAgICBpZiAoKG1jLT5wVG1wS2V5c1tTU0xfVEtQSURYX0RIMTAyNF0gPSAKLSNpZiBTU0xfTElCUkFSWV9WRVJTSU9OID49IDB4MDA5MDcwMDAKLSAgICAgICAgICAgICAgICAgKHZvaWQgKilkMmlfREhwYXJhbXMoTlVMTCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiopJnVjcCwgYXNuMS0+bkRhdGEpKSA9PSBOVUxMKSB7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAodm9pZCAqKWQyaV9ESHBhcmFtcyhOVUxMLCAmdWNwLCBhc24xLT5uRGF0YSkpID09IE5VTEwpIHsKLSNlbmRpZgotICAgICAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19FUlJPUiwgIkluaXQ6IEZhaWxlZCB0byBsb2FkIHRlbXBvcmFyeSAxMDI0IGJpdCBESCBwYXJhbWV0ZXJzIik7Ci0gICAgICAgICAgICAgICAgc3NsX2RpZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogRnJlZSBLZXlzIGFuZCBQYXJhbXMgKi8KLSAgICBlbHNlIGlmIChhY3Rpb24gPT0gU1NMX1RLUF9GUkVFKSB7Ci0gICAgICAgIGlmIChtYy0+cFRtcEtleXNbU1NMX1RLUElEWF9SU0E1MTJdICE9IE5VTEwpIHsKLSAgICAgICAgICAgIFJTQV9mcmVlKChSU0EgKiltYy0+cFRtcEtleXNbU1NMX1RLUElEWF9SU0E1MTJdKTsKLSAgICAgICAgICAgIG1jLT5wVG1wS2V5c1tTU0xfVEtQSURYX1JTQTUxMl0gPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYy0+cFRtcEtleXNbU1NMX1RLUElEWF9SU0ExMDI0XSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBSU0FfZnJlZSgoUlNBICopbWMtPnBUbXBLZXlzW1NTTF9US1BJRFhfUlNBMTAyNF0pOwotICAgICAgICAgICAgbWMtPnBUbXBLZXlzW1NTTF9US1BJRFhfUlNBMTAyNF0gPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYy0+cFRtcEtleXNbU1NMX1RLUElEWF9ESDUxMl0gIT0gTlVMTCkgewotICAgICAgICAgICAgREhfZnJlZSgoREggKiltYy0+cFRtcEtleXNbU1NMX1RLUElEWF9ESDUxMl0pOwotICAgICAgICAgICAgbWMtPnBUbXBLZXlzW1NTTF9US1BJRFhfREg1MTJdID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAobWMtPnBUbXBLZXlzW1NTTF9US1BJRFhfREgxMDI0XSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBESF9mcmVlKChESCAqKW1jLT5wVG1wS2V5c1tTU0xfVEtQSURYX0RIMTAyNF0pOwotICAgICAgICAgICAgbWMtPnBUbXBLZXlzW1NTTF9US1BJRFhfREgxMDI0XSA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi0vKgotICogQ29uZmlndXJlIGEgcGFydGljdWxhciBzZXJ2ZXIKLSAqLwotdm9pZCBzc2xfaW5pdF9Db25maWd1cmVTZXJ2ZXIoc2VydmVyX3JlYyAqcywgcG9vbCAqcCwgU1NMU3J2Q29uZmlnUmVjICpzYykKLXsKLSAgICBTU0xNb2RDb25maWdSZWMgKm1jID0gbXlNb2RDb25maWcoKTsKLSAgICBpbnQgblZlcmlmeTsKLSAgICBjaGFyICpjcFZIb3N0SUQ7Ci0gICAgRVZQX1BLRVkgKnBLZXk7Ci0gICAgU1NMX0NUWCAqY3R4OwotICAgIFNUQUNLX09GKFg1MDlfTkFNRSkgKnNrQ0FMaXN0OwotICAgIHNzbF9hc24xX3QgKmFzbjE7Ci0gICAgdW5zaWduZWQgY2hhciAqdWNwOwotICAgIGNoYXIgKmNwOwotICAgIEJPT0wgb2s7Ci0gICAgQk9PTCBiU2tpcEZpcnN0OwotICAgIGludCBpc2NhLCBwYXRobGVuOwotICAgIGludCBpLCBuOwotCi0gICAgLyoKLSAgICAgKiBDcmVhdGUgdGhlIHNlcnZlciBob3N0OnBvcnQgc3RyaW5nIGJlY2F1c2Ugd2UgbmVlZCBpdCBhIGxvdAotICAgICAqLwotICAgIGNwVkhvc3RJRCA9IHNzbF91dGlsX3Zob3N0aWQocCwgcyk7Ci0KLSAgICAvKgotICAgICAqIE5vdyBjaGVjayBmb3IgaW1wb3J0YW50IHBhcmFtZXRlcnMgYW5kIHRoZQotICAgICAqIHBvc3NpYmlsaXR5IHRoYXQgdGhlIHVzZXIgZm9yZ290IHRvIHNldCB0aGVtLgotICAgICAqLwotICAgIGlmIChzYy0+c3pQdWJsaWNDZXJ0RmlsZVswXSA9PSBOVUxMKSB7Ci0gICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAiSW5pdDogKCVzKSBObyBTU0wgQ2VydGlmaWNhdGUgc2V0IFtoaW50OiBTU0xDZXJ0aWZpY2F0ZUZpbGVdIiwKLSAgICAgICAgICAgICAgICBjcFZIb3N0SUQpOwotICAgICAgICBzc2xfZGllKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgQ2hlY2sgZm9yIHByb2JsZW1hdGljIHJlLWluaXRpYWxpemF0aW9ucwotICAgICAqLwotICAgIGlmIChzYy0+cFB1YmxpY0NlcnRbU1NMX0FJRFhfUlNBXSAhPSBOVUxMIHx8Ci0gICAgICAgIHNjLT5wUHVibGljQ2VydFtTU0xfQUlEWF9EU0FdICE9IE5VTEwgICApIHsKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICJJbml0OiAoJXMpIElsbGVnYWwgYXR0ZW1wdCB0byByZS1pbml0aWFsaXNlIFNTTCBmb3Igc2VydmVyICIKLSAgICAgICAgICAgICAgICAiKHRoZW9yZXRpY2FsbHkgc2hvdWxkbid0IGhhcHBlbiEpIiwgY3BWSG9zdElEKTsKLSAgICAgICAgc3NsX2RpZSgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIENyZWF0ZSB0aGUgbmV3IHBlci1zZXJ2ZXIgU1NMIGNvbnRleHQKLSAgICAgKi8KLSAgICBpZiAoc2MtPm5Qcm90b2NvbCA9PSBTU0xfUFJPVE9DT0xfTk9ORSkgewotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgIkluaXQ6ICglcykgTm8gU1NMIHByb3RvY29scyBhdmFpbGFibGUgW2hpbnQ6IFNTTFByb3RvY29sXSIsCi0gICAgICAgICAgICAgICAgY3BWSG9zdElEKTsKLSAgICAgICAgc3NsX2RpZSgpOwotICAgIH0KLSAgICBjcCA9IGFwX3BzdHJjYXQocCwgKHNjLT5uUHJvdG9jb2wgJiBTU0xfUFJPVE9DT0xfU1NMVjIgPyAiU1NMdjIsICIgOiAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgIChzYy0+blByb3RvY29sICYgU1NMX1BST1RPQ09MX1NTTFYzID8gIlNTTHYzLCAiIDogIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAoc2MtPm5Qcm90b2NvbCAmIFNTTF9QUk9UT0NPTF9UTFNWMSA/ICJUTFN2MSwgIiA6ICIiKSwgTlVMTCk7Ci0gICAgY3Bbc3RybGVuKGNwKS0yXSA9IE5VTDsKLSAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsCi0gICAgICAgICAgICAiSW5pdDogKCVzKSBDcmVhdGluZyBuZXcgU1NMIGNvbnRleHQgKHByb3RvY29sczogJXMpIiwgY3BWSG9zdElELCBjcCk7Ci0gICAgaWYgKHNjLT5uUHJvdG9jb2wgPT0gU1NMX1BST1RPQ09MX1NTTFYyKQotICAgICAgICBjdHggPSBTU0xfQ1RYX25ldyhTU0x2Ml9zZXJ2ZXJfbWV0aG9kKCkpOyAgLyogb25seSBTU0x2MiBpcyBsZWZ0ICovCi0gICAgZWxzZQotICAgICAgICBjdHggPSBTU0xfQ1RYX25ldyhTU0x2MjNfc2VydmVyX21ldGhvZCgpKTsgLyogYmUgbW9yZSBmbGV4aWJsZSAqLwotICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoY3R4LCBTU0xfT1BfQUxMKTsKLSAgICBpZiAoIShzYy0+blByb3RvY29sICYgU1NMX1BST1RPQ09MX1NTTFYyKSkKLSAgICAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjdHgsIFNTTF9PUF9OT19TU0x2Mik7Ci0gICAgaWYgKCEoc2MtPm5Qcm90b2NvbCAmIFNTTF9QUk9UT0NPTF9TU0xWMykpCi0gICAgICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoY3R4LCBTU0xfT1BfTk9fU1NMdjMpOwotICAgIGlmICghKHNjLT5uUHJvdG9jb2wgJiBTU0xfUFJPVE9DT0xfVExTVjEpKQotICAgICAgICBTU0xfQ1RYX3NldF9vcHRpb25zKGN0eCwgU1NMX09QX05PX1RMU3YxKTsKLSAgICBTU0xfQ1RYX3NldF9hcHBfZGF0YShjdHgsIHMpOwotICAgIHNjLT5wU1NMQ3R4ID0gY3R4OwotCi0gICAgLyoKLSAgICAgKiBDb25maWd1cmUgYWRkaXRpb25hbCBjb250ZXh0IGluZ3JlZGllbnRzCi0gICAgICovCi0gICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjdHgsIFNTTF9PUF9TSU5HTEVfREhfVVNFKTsKLSAgICBpZiAobWMtPm5TZXNzaW9uQ2FjaGVNb2RlID09IFNTTF9TQ01PREVfTk9ORSkKLSAgICAgICAgU1NMX0NUWF9zZXRfc2Vzc2lvbl9jYWNoZV9tb2RlKGN0eCwgU1NMX1NFU1NfQ0FDSEVfT0ZGKTsKLSAgICBlbHNlCi0gICAgICAgIFNTTF9DVFhfc2V0X3Nlc3Npb25fY2FjaGVfbW9kZShjdHgsIFNTTF9TRVNTX0NBQ0hFX1NFUlZFUik7Ci0KLSAgICAvKgotICAgICAqICBDb25maWd1cmUgY2FsbGJhY2tzIGZvciBTU0wgY29udGV4dAotICAgICAqLwotICAgIG5WZXJpZnkgPSBTU0xfVkVSSUZZX05PTkU7Ci0gICAgaWYgKHNjLT5uVmVyaWZ5Q2xpZW50ID09IFNTTF9DVkVSSUZZX1JFUVVJUkUpCi0gICAgICAgIG5WZXJpZnkgfD0gU1NMX1ZFUklGWV9QRUVSfFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQ7Ci0gICAgaWYgKCAgIChzYy0+blZlcmlmeUNsaWVudCA9PSBTU0xfQ1ZFUklGWV9PUFRJT05BTCkKLSAgICAgICAgfHwgKHNjLT5uVmVyaWZ5Q2xpZW50ID09IFNTTF9DVkVSSUZZX09QVElPTkFMX05PX0NBKSApCi0gICAgICAgIG5WZXJpZnkgfD0gU1NMX1ZFUklGWV9QRUVSOwotICAgIFNTTF9DVFhfc2V0X3ZlcmlmeShjdHgsIG5WZXJpZnksICBzc2xfY2FsbGJhY2tfU1NMVmVyaWZ5KTsKLSAgICBTU0xfQ1RYX3Nlc3Nfc2V0X25ld19jYihjdHgsICAgICAgc3NsX2NhbGxiYWNrX05ld1Nlc3Npb25DYWNoZUVudHJ5KTsKLSAgICBTU0xfQ1RYX3Nlc3Nfc2V0X2dldF9jYihjdHgsICAgICAgc3NsX2NhbGxiYWNrX0dldFNlc3Npb25DYWNoZUVudHJ5KTsKLSAgICBTU0xfQ1RYX3Nlc3Nfc2V0X3JlbW92ZV9jYihjdHgsICAgc3NsX2NhbGxiYWNrX0RlbFNlc3Npb25DYWNoZUVudHJ5KTsKLSAgICBTU0xfQ1RYX3NldF90bXBfcnNhX2NhbGxiYWNrKGN0eCwgc3NsX2NhbGxiYWNrX1RtcFJTQSk7Ci0gICAgU1NMX0NUWF9zZXRfdG1wX2RoX2NhbGxiYWNrKGN0eCwgIHNzbF9jYWxsYmFja19UbXBESCk7Ci0gICAgU1NMX0NUWF9zZXRfaW5mb19jYWxsYmFjayhjdHgsICAgIHNzbF9jYWxsYmFja19Mb2dUcmFjaW5nU3RhdGUpOwotCi0gICAgLyoKLSAgICAgKiAgQ29uZmlndXJlIFNTTCBDaXBoZXIgU3VpdGUKLSAgICAgKi8KLSAgICBpZiAoc2MtPnN6Q2lwaGVyU3VpdGUgIT0gTlVMTCkgewotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsCi0gICAgICAgICAgICAgICAgIkluaXQ6ICglcykgQ29uZmlndXJpbmcgcGVybWl0dGVkIFNTTCBjaXBoZXJzIFslc10iLCAKLSAgICAgICAgICAgICAgICBjcFZIb3N0SUQsIHNjLT5zekNpcGhlclN1aXRlKTsKLSAgICAgICAgaWYgKCFTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdChjdHgsIHNjLT5zekNpcGhlclN1aXRlKSkgewotICAgICAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SfFNTTF9BRERfU1NMRVJSLAotICAgICAgICAgICAgICAgICAgICAiSW5pdDogKCVzKSBVbmFibGUgdG8gY29uZmlndXJlIHBlcm1pdHRlZCBTU0wgY2lwaGVycyIsCi0gICAgICAgICAgICAgICAgICAgIGNwVkhvc3RJRCk7Ci0gICAgICAgICAgICBzc2xfZGllKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENvbmZpZ3VyZSBDbGllbnQgQXV0aGVudGljYXRpb24gZGV0YWlscwotICAgICAqLwotICAgIGlmIChzYy0+c3pDQUNlcnRpZmljYXRlRmlsZSAhPSBOVUxMIHx8IHNjLT5zekNBQ2VydGlmaWNhdGVQYXRoICE9IE5VTEwpIHsKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLAotICAgICAgICAgICAgICAgICJJbml0OiAoJXMpIENvbmZpZ3VyaW5nIGNsaWVudCBhdXRoZW50aWNhdGlvbiIsIGNwVkhvc3RJRCk7Ci0gICAgICAgIGlmICghU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjLT5zekNBQ2VydGlmaWNhdGVGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjLT5zekNBQ2VydGlmaWNhdGVQYXRoKSkgewotICAgICAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SfFNTTF9BRERfU1NMRVJSLAotICAgICAgICAgICAgICAgICAgICAiSW5pdDogKCVzKSBVbmFibGUgdG8gY29uZmlndXJlIHZlcmlmeSBsb2NhdGlvbnMgIgotICAgICAgICAgICAgICAgICAgICAiZm9yIGNsaWVudCBhdXRoZW50aWNhdGlvbiIsIGNwVkhvc3RJRCk7Ci0gICAgICAgICAgICBzc2xfZGllKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChza0NBTGlzdCA9IHNzbF9pbml0X0ZpbmRDQUxpc3QocywgcCwgc2MtPnN6Q0FDZXJ0aWZpY2F0ZUZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjLT5zekNBQ2VydGlmaWNhdGVQYXRoKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAiSW5pdDogKCVzKSBVbmFibGUgdG8gZGV0ZXJtaW5lIGxpc3Qgb2YgYXZhaWxhYmxlICIKLSAgICAgICAgICAgICAgICAgICAgIkNBIGNlcnRpZmljYXRlcyBmb3IgY2xpZW50IGF1dGhlbnRpY2F0aW9uIiwgY3BWSG9zdElEKTsKLSAgICAgICAgICAgIHNzbF9kaWUoKTsKLSAgICAgICAgfQotICAgICAgICBTU0xfQ1RYX3NldF9jbGllbnRfQ0FfbGlzdChzYy0+cFNTTEN0eCwgc2tDQUxpc3QpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ29uZmlndXJlIENlcnRpZmljYXRlIFJldm9jYXRpb24gTGlzdCAoQ1JMKSBEZXRhaWxzCi0gICAgICovCi0gICAgaWYgKHNjLT5zekNBUmV2b2NhdGlvbkZpbGUgIT0gTlVMTCB8fCBzYy0+c3pDQVJldm9jYXRpb25QYXRoICE9IE5VTEwpIHsKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLAotICAgICAgICAgICAgICAgICJJbml0OiAoJXMpIENvbmZpZ3VyaW5nIGNlcnRpZmljYXRlIHJldm9jYXRpb24gZmFjaWxpdHkiLCBjcFZIb3N0SUQpOwotICAgICAgICBpZiAoKHNjLT5wUmV2b2NhdGlvblN0b3JlID0KLSAgICAgICAgICAgICAgICBTU0xfWDUwOV9TVE9SRV9jcmVhdGUoc2MtPnN6Q0FSZXZvY2F0aW9uRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2MtPnN6Q0FSZXZvY2F0aW9uUGF0aCkpID09IE5VTEwpIHsKLSAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19FUlJPUnxTU0xfQUREX1NTTEVSUiwKLSAgICAgICAgICAgICAgICAgICAgIkluaXQ6ICglcykgVW5hYmxlIHRvIGNvbmZpZ3VyZSBYLjUwOSBDUkwgc3RvcmFnZSAiCi0gICAgICAgICAgICAgICAgICAgICJmb3IgY2VydGlmaWNhdGUgcmV2b2NhdGlvbiIsIGNwVkhvc3RJRCk7Ci0gICAgICAgICAgICBzc2xfZGllKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEdpdmUgYSB3YXJuaW5nIHdoZW4gbm8gQ0FzIHdlcmUgY29uZmlndXJlZCBidXQgY2xpZW50IGF1dGhlbnRpY2F0aW9uCi0gICAgICogc2hvdWxkIHRha2UgcGxhY2UuIFRoaXMgY2Fubm90IHdvcmsuCi0gICAgICovCi0gICAgaWYgKHNjLT5uVmVyaWZ5Q2xpZW50ID09IFNTTF9DVkVSSUZZX1JFUVVJUkUpIHsKLSAgICAgICAgc2tDQUxpc3QgPSBTU0xfQ1RYX2dldF9jbGllbnRfQ0FfbGlzdChjdHgpOwotICAgICAgICBpZiAoc2tfWDUwOV9OQU1FX251bShza0NBTGlzdCkgPT0gMCkKLSAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19XQVJOLAotICAgICAgICAgICAgICAgICAgICAiSW5pdDogT3BzLCB5b3Ugd2FudCB0byByZXF1ZXN0IGNsaWVudCBhdXRoZW50aWNhdGlvbiwgIgotICAgICAgICAgICAgICAgICAgICAiYnV0IG5vIENBcyBhcmUga25vd24gZm9yIHZlcmlmaWNhdGlvbiE/ICIKLSAgICAgICAgICAgICAgICAgICAgIltIaW50OiBTU0xDQUNlcnRpZmljYXRlKl0iKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICBDb25maWd1cmUgc2VydmVyIGNlcnRpZmljYXRlKHMpCi0gICAgICovCi0gICAgb2sgPSBGQUxTRTsKLSAgICBjcCA9IGFwX3BzcHJpbnRmKHAsICIlczpSU0EiLCBjcFZIb3N0SUQpOwotICAgIGlmICgoYXNuMSA9IChzc2xfYXNuMV90ICopc3NsX2RzX3RhYmxlX2dldChtYy0+dFB1YmxpY0NlcnQsIGNwKSkgIT0gTlVMTCkgewotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsCi0gICAgICAgICAgICAgICAgIkluaXQ6ICglcykgQ29uZmlndXJpbmcgUlNBIHNlcnZlciBjZXJ0aWZpY2F0ZSIsIGNwVkhvc3RJRCk7Ci0gICAgICAgIHVjcCA9IGFzbjEtPmNwRGF0YTsKLSAgICAgICAgaWYgKChzYy0+cFB1YmxpY0NlcnRbU1NMX0FJRFhfUlNBXSA9IGQyaV9YNTA5KE5VTEwsICZ1Y3AsIGFzbjEtPm5EYXRhKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SfFNTTF9BRERfU1NMRVJSLAotICAgICAgICAgICAgICAgICAgICAiSW5pdDogKCVzKSBVbmFibGUgdG8gaW1wb3J0IFJTQSBzZXJ2ZXIgY2VydGlmaWNhdGUiLAotICAgICAgICAgICAgICAgICAgICBjcFZIb3N0SUQpOwotICAgICAgICAgICAgc3NsX2RpZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZShjdHgsIHNjLT5wUHVibGljQ2VydFtTU0xfQUlEWF9SU0FdKSA8PSAwKSB7Ci0gICAgICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1J8U1NMX0FERF9TU0xFUlIsCi0gICAgICAgICAgICAgICAgICAgICJJbml0OiAoJXMpIFVuYWJsZSB0byBjb25maWd1cmUgUlNBIHNlcnZlciBjZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgICAgIGNwVkhvc3RJRCk7Ci0gICAgICAgICAgICBzc2xfZGllKCk7Ci0gICAgICAgIH0KLSAgICAgICAgb2sgPSBUUlVFOwotICAgIH0KLSAgICBjcCA9IGFwX3BzcHJpbnRmKHAsICIlczpEU0EiLCBjcFZIb3N0SUQpOwotICAgIGlmICgoYXNuMSA9IChzc2xfYXNuMV90ICopc3NsX2RzX3RhYmxlX2dldChtYy0+dFB1YmxpY0NlcnQsIGNwKSkgIT0gTlVMTCkgewotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsCi0gICAgICAgICAgICAgICAgIkluaXQ6ICglcykgQ29uZmlndXJpbmcgRFNBIHNlcnZlciBjZXJ0aWZpY2F0ZSIsIGNwVkhvc3RJRCk7Ci0gICAgICAgIHVjcCA9IGFzbjEtPmNwRGF0YTsKLSAgICAgICAgaWYgKChzYy0+cFB1YmxpY0NlcnRbU1NMX0FJRFhfRFNBXSA9IGQyaV9YNTA5KE5VTEwsICZ1Y3AsIGFzbjEtPm5EYXRhKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SfFNTTF9BRERfU1NMRVJSLAotICAgICAgICAgICAgICAgICAgICAiSW5pdDogKCVzKSBVbmFibGUgdG8gaW1wb3J0IERTQSBzZXJ2ZXIgY2VydGlmaWNhdGUiLAotICAgICAgICAgICAgICAgICAgICBjcFZIb3N0SUQpOwotICAgICAgICAgICAgc3NsX2RpZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZShjdHgsIHNjLT5wUHVibGljQ2VydFtTU0xfQUlEWF9EU0FdKSA8PSAwKSB7Ci0gICAgICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1J8U1NMX0FERF9TU0xFUlIsCi0gICAgICAgICAgICAgICAgICAgICJJbml0OiAoJXMpIFVuYWJsZSB0byBjb25maWd1cmUgRFNBIHNlcnZlciBjZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgICAgIGNwVkhvc3RJRCk7Ci0gICAgICAgICAgICBzc2xfZGllKCk7Ci0gICAgICAgIH0KLSAgICAgICAgb2sgPSBUUlVFOwotICAgIH0KLSAgICBpZiAoIW9rKSB7Ci0gICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAiSW5pdDogKCVzKSBPcHMsIG5vIFJTQSBvciBEU0Egc2VydmVyIGNlcnRpZmljYXRlIGZvdW5kPyEiLCBjcFZIb3N0SUQpOwotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgIkluaXQ6ICglcykgWW91IGhhdmUgdG8gcGVyZm9ybSBhICpmdWxsKiBzZXJ2ZXIgcmVzdGFydCB3aGVuIHlvdSBhZGRlZCBvciByZW1vdmVkIGEgY2VydGlmaWNhdGUgYW5kL29yIGtleSBmaWxlIiwgY3BWSG9zdElEKTsKLSAgICAgICAgc3NsX2RpZSgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogU29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2VydGlmaWNhdGUocykKLSAgICAgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgU1NMX0FJRFhfTUFYOyBpKyspIHsKLSAgICAgICAgaWYgKHNjLT5wUHVibGljQ2VydFtpXSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoU1NMX1g1MDlfaXNTR0Moc2MtPnBQdWJsaWNDZXJ0W2ldKSkgewotICAgICAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgIkluaXQ6ICglcykgJXMgc2VydmVyIGNlcnRpZmljYXRlIGVuYWJsZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZlciBHYXRlZCBDcnlwdG9ncmFwaHkgKFNHQykiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNwVkhvc3RJRCwgKGkgPT0gU1NMX0FJRFhfUlNBID8gIlJTQSIgOiAiRFNBIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFNTTF9YNTA5X2dldEJDKHNjLT5wUHVibGljQ2VydFtpXSwgJmlzY2EsICZwYXRobGVuKSkgewotICAgICAgICAgICAgICAgIGlmIChpc2NhKQotICAgICAgICAgICAgICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfV0FSTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJJbml0OiAoJXMpICVzIHNlcnZlciBjZXJ0aWZpY2F0ZSBpcyBhIENBIGNlcnRpZmljYXRlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICIoQmFzaWNDb25zdHJhaW50czogQ0EgPT0gVFJVRSAhPykiLAotICAgICAgICAgICAgICAgICAgICAgICAgY3BWSG9zdElELCAoaSA9PSBTU0xfQUlEWF9SU0EgPyAiUlNBIiA6ICJEU0EiKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGhsZW4gPiAwKQotICAgICAgICAgICAgICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfV0FSTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJJbml0OiAoJXMpICVzIHNlcnZlciBjZXJ0aWZpY2F0ZSBpcyBub3QgYSBsZWFmIGNlcnRpZmljYXRlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICIoQmFzaWNDb25zdHJhaW50czogcGF0aGxlbiA9PSAlZCA+IDAgIT8pIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNwVkhvc3RJRCwgKGkgPT0gU1NMX0FJRFhfUlNBID8gIlJTQSIgOiAiRFNBIiksIHBhdGhsZW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFNTTF9YNTA5X2dldENOKHAsIHNjLT5wUHVibGljQ2VydFtpXSwgJmNwKSkgewotICAgICAgICAgICAgICAgIGlmIChhcF9pc19mbm1hdGNoKGNwKSAmJgotICAgICAgICAgICAgICAgICAgICAhYXBfZm5tYXRjaChjcCwgcy0+c2VydmVyX2hvc3RuYW1lLCBGTk1fUEVSSU9EfEZOTV9DQVNFX0JMSU5EKSkgewotICAgICAgICAgICAgICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfV0FSTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJJbml0OiAoJXMpICVzIHNlcnZlciBjZXJ0aWZpY2F0ZSB3aWxkY2FyZCBDb21tb25OYW1lIChDTikgYCVzJyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZG9lcyBOT1QgbWF0Y2ggc2VydmVyIG5hbWUhPyIsIGNwVkhvc3RJRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAoaSA9PSBTU0xfQUlEWF9SU0EgPyAiUlNBIiA6ICJEU0EiKSwgY3ApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJORShzLT5zZXJ2ZXJfaG9zdG5hbWUsIGNwKSkgewotICAgICAgICAgICAgICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfV0FSTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJJbml0OiAoJXMpICVzIHNlcnZlciBjZXJ0aWZpY2F0ZSBDb21tb25OYW1lIChDTikgYCVzJyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZG9lcyBOT1QgbWF0Y2ggc2VydmVyIG5hbWUhPyIsIGNwVkhvc3RJRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAoaSA9PSBTU0xfQUlEWF9SU0EgPyAiUlNBIiA6ICJEU0EiKSwgY3ApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogIENvbmZpZ3VyZSBzZXJ2ZXIgcHJpdmF0ZSBrZXkocykKLSAgICAgKi8KLSAgICBvayA9IEZBTFNFOwotICAgIGNwID0gYXBfcHNwcmludGYocCwgIiVzOlJTQSIsIGNwVkhvc3RJRCk7Ci0gICAgaWYgKChhc24xID0gKHNzbF9hc24xX3QgKilzc2xfZHNfdGFibGVfZ2V0KG1jLT50UHJpdmF0ZUtleSwgY3ApKSAhPSBOVUxMKSB7Ci0gICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwKLSAgICAgICAgICAgICAgICAiSW5pdDogKCVzKSBDb25maWd1cmluZyBSU0Egc2VydmVyIHByaXZhdGUga2V5IiwgY3BWSG9zdElEKTsKLSAgICAgICAgdWNwID0gYXNuMS0+Y3BEYXRhOwotICAgICAgICBpZiAoKHNjLT5wUHJpdmF0ZUtleVtTU0xfQUlEWF9SU0FdID0gCi0gICAgICAgICAgICAgZDJpX1ByaXZhdGVLZXkoRVZQX1BLRVlfUlNBLCBOVUxMLCAmdWNwLCBhc24xLT5uRGF0YSkpID09IE5VTEwpIHsKLSAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19FUlJPUnxTU0xfQUREX1NTTEVSUiwKLSAgICAgICAgICAgICAgICAgICAgIkluaXQ6ICglcykgVW5hYmxlIHRvIGltcG9ydCBSU0Egc2VydmVyIHByaXZhdGUga2V5IiwKLSAgICAgICAgICAgICAgICAgICAgY3BWSG9zdElEKTsKLSAgICAgICAgICAgIHNzbF9kaWUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoU1NMX0NUWF91c2VfUHJpdmF0ZUtleShjdHgsIHNjLT5wUHJpdmF0ZUtleVtTU0xfQUlEWF9SU0FdKSA8PSAwKSB7Ci0gICAgICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1J8U1NMX0FERF9TU0xFUlIsCi0gICAgICAgICAgICAgICAgICAgICJJbml0OiAoJXMpIFVuYWJsZSB0byBjb25maWd1cmUgUlNBIHNlcnZlciBwcml2YXRlIGtleSIsCi0gICAgICAgICAgICAgICAgICAgIGNwVkhvc3RJRCk7Ci0gICAgICAgICAgICBzc2xfZGllKCk7Ci0gICAgICAgIH0KLSAgICAgICAgb2sgPSBUUlVFOwotICAgIH0KLSAgICBjcCA9IGFwX3BzcHJpbnRmKHAsICIlczpEU0EiLCBjcFZIb3N0SUQpOwotICAgIGlmICgoYXNuMSA9IChzc2xfYXNuMV90ICopc3NsX2RzX3RhYmxlX2dldChtYy0+dFByaXZhdGVLZXksIGNwKSkgIT0gTlVMTCkgewotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsCi0gICAgICAgICAgICAgICAgIkluaXQ6ICglcykgQ29uZmlndXJpbmcgRFNBIHNlcnZlciBwcml2YXRlIGtleSIsIGNwVkhvc3RJRCk7Ci0gICAgICAgIHVjcCA9IGFzbjEtPmNwRGF0YTsKLSAgICAgICAgaWYgKChzYy0+cFByaXZhdGVLZXlbU1NMX0FJRFhfRFNBXSA9IAotICAgICAgICAgICAgIGQyaV9Qcml2YXRlS2V5KEVWUF9QS0VZX0RTQSwgTlVMTCwgJnVjcCwgYXNuMS0+bkRhdGEpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1J8U1NMX0FERF9TU0xFUlIsCi0gICAgICAgICAgICAgICAgICAgICJJbml0OiAoJXMpIFVuYWJsZSB0byBpbXBvcnQgRFNBIHNlcnZlciBwcml2YXRlIGtleSIsCi0gICAgICAgICAgICAgICAgICAgIGNwVkhvc3RJRCk7Ci0gICAgICAgICAgICBzc2xfZGllKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFNTTF9DVFhfdXNlX1ByaXZhdGVLZXkoY3R4LCBzYy0+cFByaXZhdGVLZXlbU1NMX0FJRFhfRFNBXSkgPD0gMCkgewotICAgICAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SfFNTTF9BRERfU1NMRVJSLAotICAgICAgICAgICAgICAgICAgICAiSW5pdDogKCVzKSBVbmFibGUgdG8gY29uZmlndXJlIERTQSBzZXJ2ZXIgcHJpdmF0ZSBrZXkiLAotICAgICAgICAgICAgICAgICAgICBjcFZIb3N0SUQpOwotICAgICAgICAgICAgc3NsX2RpZSgpOwotICAgICAgICB9Ci0gICAgICAgIG9rID0gVFJVRTsKLSAgICB9Ci0gICAgaWYgKCFvaykgewotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgIkluaXQ6ICglcykgT3BzLCBubyBSU0Egb3IgRFNBIHNlcnZlciBwcml2YXRlIGtleSBmb3VuZD8hIiwgY3BWSG9zdElEKTsKLSAgICAgICAgc3NsX2RpZSgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogT3B0aW9uYWxseSBjb3B5IERTQSBwYXJhbWV0ZXJzIGZvciBjZXJ0aWZpY2F0ZSBmcm9tIHByaXZhdGUga2V5Ci0gICAgICogKHNlZSBodHRwOi8vd3d3LnBzeS51cS5lZHUuYXUvfmZ0cC9DcnlwdG8vc3NsZWF5L1RPRE8uaHRtbCkKLSAgICAgKi8KLSAgICBpZiAoICAgc2MtPnBQdWJsaWNDZXJ0W1NTTF9BSURYX0RTQV0gIT0gTlVMTAotICAgICAgICAmJiBzYy0+cFByaXZhdGVLZXlbU1NMX0FJRFhfRFNBXSAhPSBOVUxMKSB7Ci0gICAgICAgIHBLZXkgPSBYNTA5X2dldF9wdWJrZXkoc2MtPnBQdWJsaWNDZXJ0W1NTTF9BSURYX0RTQV0pOwotICAgICAgICBpZiAoICAgcEtleSAhPSBOVUxMCi0gICAgICAgICAgICAmJiBFVlBfUEtFWV90eXBlKHBLZXktPnR5cGUpID09IEVWUF9QS0VZX0RTQSAKLSAgICAgICAgICAgICYmIEVWUF9QS0VZX21pc3NpbmdfcGFyYW1ldGVycyhwS2V5KSkKLSAgICAgICAgICAgIEVWUF9QS0VZX2NvcHlfcGFyYW1ldGVycyhwS2V5LCBzYy0+cFByaXZhdGVLZXlbU1NMX0FJRFhfRFNBXSk7Ci0gICAgfQotCi0gICAgLyogCi0gICAgICogT3B0aW9uYWxseSBjb25maWd1cmUgZXh0cmEgc2VydmVyIGNlcnRpZmljYXRlIGNoYWluIGNlcnRpZmljYXRlcy4KLSAgICAgKiBUaGlzIGlzIHVzdWFsbHkgZG9uZSBieSBPcGVuU1NMIGF1dG9tYXRpY2FsbHkgd2hlbiBvbmUgb2YgdGhlCi0gICAgICogc2VydmVyIGNlcnQgaXNzdWVycyBhcmUgZm91bmQgdW5kZXIgU1NMQ0FDZXJ0aWZpY2F0ZVBhdGggb3IgaW4KLSAgICAgKiBTU0xDQUNlcnRpZmljYXRlRmlsZS4gQnV0IGJlY2F1c2UgdGhlc2UgYXJlIGludGVuZGVkIGZvciBjbGllbnQKLSAgICAgKiBhdXRoZW50aWNhdGlvbiBpdCBjYW4gY29uZmxpY3QuIEZvciBpbnN0YW5jZSB3aGVuIHlvdSB1c2UgYQotICAgICAqIEdsb2JhbCBJRCBzZXJ2ZXIgY2VydGlmaWNhdGUgeW91J3ZlIHRvIHNlbmQgb3V0IHRoZSBpbnRlcm1lZGlhdGUKLSAgICAgKiBDQSBjZXJ0aWZpY2F0ZSwgdG9vLiBXaGVuIHlvdSB3b3VsZCBqdXN0IGNvbmZpZ3VyZSB0aGlzIHdpdGgKLSAgICAgKiBTU0xDQUNlcnRpZmljYXRlRmlsZSBhbmQgYWxzbyB1c2UgY2xpZW50IGF1dGhlbnRpY2F0aW9uIG1vZF9zc2wKLSAgICAgKiB3b3VsZCBhY2NlcHQgYWxsIGNsaWVudHMgYWxzbyBpc3N1ZWQgYnkgdGhpcyBDQS4gT2J2aW91c2x5IHRoaXMKLSAgICAgKiBpc24ndCB3aGF0IHdlIHdhbnQgaW4gdGhpcyBzaXR1YXRpb24uIFNvIHRoaXMgZmVhdHVyZSBoZXJlIGV4aXN0cwotICAgICAqIHRvIGFsbG93IG9uZSB0byBleHBsaWNpdHkgY29uZmlndXJlIENBIGNlcnRpZmljYXRlcyB3aGljaCBhcmUKLSAgICAgKiB1c2VkIG9ubHkgZm9yIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgY2hhaW4uCi0gICAgICovCi0gICAgaWYgKHNjLT5zekNlcnRpZmljYXRlQ2hhaW4gIT0gTlVMTCkgewotICAgICAgICBiU2tpcEZpcnN0ID0gRkFMU0U7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBTU0xfQUlEWF9NQVggJiYgc2MtPnN6UHVibGljQ2VydEZpbGVbaV0gIT0gTlVMTDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoc3RyRVEoc2MtPnN6UHVibGljQ2VydEZpbGVbaV0sIHNjLT5zekNlcnRpZmljYXRlQ2hhaW4pKSB7Ci0gICAgICAgICAgICAgICAgYlNraXBGaXJzdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChuID0gU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW4oY3R4LCBzYy0+c3pDZXJ0aWZpY2F0ZUNoYWluLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNraXBGaXJzdCwgTlVMTCkpIDwgMCkgewotICAgICAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAiSW5pdDogKCVzKSBGYWlsZWQgdG8gY29uZmlndXJlIENBIGNlcnRpZmljYXRlIGNoYWluISIsIGNwVkhvc3RJRCk7Ci0gICAgICAgICAgICBzc2xfZGllKCk7Ci0gICAgICAgIH0KLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLCAiSW5pdDogKCVzKSBDb25maWd1cmluZyAiCi0gICAgICAgICAgICAgICAgInNlcnZlciBjZXJ0aWZpY2F0ZSBjaGFpbiAoJWQgQ0EgY2VydGlmaWNhdGUlcykiLCBjcFZIb3N0SUQsCi0gICAgICAgICAgICAgICAgbiwgbiA9PSAxID8gIiIgOiAicyIpOwotICAgIH0KLQotI2lmZGVmIFNTTF9WRU5ET1IKLSAgICBhcF9ob29rX3VzZSgiYXA6Om1vZF9zc2w6OnZlbmRvcjo6Y29uZmlndXJlX3NlcnZlciIsCi0gICAgICAgICAgICAgICAgQVBfSE9PS19TSUc0KHZvaWQscHRyLHB0cixwdHIpLCBBUF9IT09LX0FMTCwgCi0gICAgICAgICAgICAgICAgcywgcCwgc2MpOwotI2VuZGlmCi0KLSAgICByZXR1cm47Ci19Ci0KLXZvaWQgc3NsX2luaXRfQ2hlY2tTZXJ2ZXJzKHNlcnZlcl9yZWMgKnNtLCBwb29sICpwKQotewotICAgIHNlcnZlcl9yZWMgKnM7Ci0gICAgc2VydmVyX3JlYyAqKnBzOwotICAgIFNTTFNydkNvbmZpZ1JlYyAqc2M7Ci0gICAgc3NsX2RzX3RhYmxlICp0OwotICAgIHBvb2wgKnNwOwotICAgIGNoYXIgKmtleTsKLSAgICBCT09MIGJDb25mbGljdDsKLQotICAgIC8qCi0gICAgICogR2l2ZSBvdXQgd2FybmluZ3Mgd2hlbiBhIHNlcnZlciBoYXMgSFRUUFMgY29uZmlndXJlZCAKLSAgICAgKiBmb3IgdGhlIEhUVFAgcG9ydCBvciB2aWNlIHZlcnNhCi0gICAgICovCi0gICAgZm9yIChzID0gc207IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpIHsKLSAgICAgICAgc2MgPSBteVNydkNvbmZpZyhzKTsKLSAgICAgICAgaWYgKHNjLT5iRW5hYmxlZCAmJiBzLT5wb3J0ID09IERFRkFVTFRfSFRUUF9QT1JUKQotICAgICAgICAgICAgc3NsX2xvZyhzbSwgU1NMX0xPR19XQVJOLAotICAgICAgICAgICAgICAgICAgICAiSW5pdDogKCVzKSBZb3UgY29uZmlndXJlZCBIVFRQUyglZCkgb24gdGhlIHN0YW5kYXJkIEhUVFAoJWQpIHBvcnQhIiwKLSAgICAgICAgICAgICAgICAgICAgc3NsX3V0aWxfdmhvc3RpZChwLCBzKSwgREVGQVVMVF9IVFRQU19QT1JULCBERUZBVUxUX0hUVFBfUE9SVCk7Ci0gICAgICAgIGlmICghc2MtPmJFbmFibGVkICYmIHMtPnBvcnQgPT0gREVGQVVMVF9IVFRQU19QT1JUKQotICAgICAgICAgICAgc3NsX2xvZyhzbSwgU1NMX0xPR19XQVJOLAotICAgICAgICAgICAgICAgICAgICAiSW5pdDogKCVzKSBZb3UgY29uZmlndXJlZCBIVFRQKCVkKSBvbiB0aGUgc3RhbmRhcmQgSFRUUFMoJWQpIHBvcnQhIiwKLSAgICAgICAgICAgICAgICAgICAgc3NsX3V0aWxfdmhvc3RpZChwLCBzKSwgREVGQVVMVF9IVFRQX1BPUlQsIERFRkFVTFRfSFRUUFNfUE9SVCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBHaXZlIG91dCB3YXJuaW5ncyB3aGVuIG1vcmUgdGhhbiBvbmUgU1NMLWF3YXJlIHZpcnR1YWwgc2VydmVyIHVzZXMgdGhlCi0gICAgICogc2FtZSBJUDpwb3J0LiBUaGlzIGRvZXNuJ3Qgd29yayBiZWNhdXNlIG1vZF9zc2wgdGhlbiB3aWxsIGFsd2F5cyB1c2UKLSAgICAgKiBqdXN0IHRoZSBjZXJ0aWZpY2F0ZS9rZXlzIG9mIG9uZSB2aXJ0dWFsIGhvc3QgKHdoaWNoIG9uZSBjYW5ub3QgYmUgc2FpZAotICAgICAqIGVhc2lseSAtIGJ1dCB0aGF0IGRvZXNuJ3QgbWF0dGVyIGhlcmUpLgotICAgICAqLwotICAgIHNwID0gYXBfbWFrZV9zdWJfcG9vbChwKTsKLSAgICB0ID0gc3NsX2RzX3RhYmxlX21ha2Uoc3AsIHNpemVvZihzZXJ2ZXJfcmVjICopKTsKLSAgICBiQ29uZmxpY3QgPSBGQUxTRTsKLSAgICBmb3IgKHMgPSBzbTsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkgewotICAgICAgICBzYyA9IG15U3J2Q29uZmlnKHMpOwotICAgICAgICBpZiAoIXNjLT5iRW5hYmxlZCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBrZXkgPSBhcF9wc3ByaW50ZihzcCwgIiVwQToldSIsICZzLT5hZGRycy0+aG9zdF9hZGRyLCBzLT5hZGRycy0+aG9zdF9wb3J0KTsKLSAgICAgICAgcHMgPSBzc2xfZHNfdGFibGVfZ2V0KHQsIGtleSk7Ci0gICAgICAgIGlmIChwcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBzc2xfbG9nKHNtLCBTU0xfTE9HX1dBUk4sCi0gICAgICAgICAgICAgICAgICAgICJJbml0OiBTU0wgc2VydmVyIElQL3BvcnQgY29uZmxpY3Q6ICVzICglczolZCkgdnMuICVzICglczolZCkiLAotICAgICAgICAgICAgICAgICAgICBzc2xfdXRpbF92aG9zdGlkKHAsIHMpLCAKLSAgICAgICAgICAgICAgICAgICAgKHMtPmRlZm5fbmFtZSAhPSBOVUxMID8gcy0+ZGVmbl9uYW1lIDogInVua25vd24iKSwKLSAgICAgICAgICAgICAgICAgICAgcy0+ZGVmbl9saW5lX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgc3NsX3V0aWxfdmhvc3RpZChwLCAqcHMpLAotICAgICAgICAgICAgICAgICAgICAoKCpwcyktPmRlZm5fbmFtZSAhPSBOVUxMID8gKCpwcyktPmRlZm5fbmFtZSA6ICJ1bmtub3duIiksIAotICAgICAgICAgICAgICAgICAgICAoKnBzKS0+ZGVmbl9saW5lX251bWJlcik7Ci0gICAgICAgICAgICBiQ29uZmxpY3QgPSBUUlVFOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgcHMgPSBzc2xfZHNfdGFibGVfcHVzaCh0LCBrZXkpOwotICAgICAgICAqcHMgPSBzOwotICAgIH0KLSAgICBzc2xfZHNfdGFibGVfa2lsbCh0KTsKLSAgICBhcF9kZXN0cm95X3Bvb2woc3ApOwotICAgIGlmIChiQ29uZmxpY3QpCi0gICAgICAgIHNzbF9sb2coc20sIFNTTF9MT0dfV0FSTiwKLSAgICAgICAgICAgICAgICAiSW5pdDogWW91IHNob3VsZCBub3QgdXNlIG5hbWUtYmFzZWQgdmlydHVhbCBob3N0cyBpbiBjb25qdW5jdGlvbiB3aXRoIFNTTCEhIik7Ci0KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQgc3NsX2luaXRfRmluZENBTGlzdF9YNTA5TmFtZUNtcChYNTA5X05BTUUgKiphLCBYNTA5X05BTUUgKipiKQotewotICAgIHJldHVybihYNTA5X05BTUVfY21wKCphLCAqYikpOwotfQotCi1TVEFDS19PRihYNTA5X05BTUUpICpzc2xfaW5pdF9GaW5kQ0FMaXN0KHNlcnZlcl9yZWMgKnMsIHBvb2wgKnBwLCBjaGFyICpjcENBZmlsZSwgY2hhciAqY3BDQXBhdGgpCi17Ci0gICAgU1RBQ0tfT0YoWDUwOV9OQU1FKSAqc2tDQUxpc3Q7Ci0gICAgU1RBQ0tfT0YoWDUwOV9OQU1FKSAqc2s7Ci0gICAgRElSICpkaXI7Ci0gICAgc3RydWN0IERJUl9UWVBFICpkaXJlbnRyeTsKLSAgICBjaGFyICpjcDsKLSAgICBwb29sICpwOwotICAgIGludCBuOwotCi0gICAgLyoKLSAgICAgKiBVc2UgYSBzdWJwb29sIHNvIHdlIGRvbid0IGJsb2F0IHVwIHRoZSBzZXJ2ZXIgcG9vbCB3aGljaAotICAgICAqIGlzIHJlbWFpbnMgaW4gbWVtb3J5IGZvciB0aGUgY29tcGxldGUgb3BlcmF0aW9uIHRpbWUgb2YKLSAgICAgKiB0aGUgc2VydmVyLgotICAgICAqLwotICAgIHAgPSBhcF9tYWtlX3N1Yl9wb29sKHBwKTsKLQotICAgIC8qCi0gICAgICogU3RhcnQgd2l0aCBhIGVtcHR5IHN0YWNrL2xpc3Qgd2hlcmUgbmV3Ci0gICAgICogZW50cmllcyBnZXQgYWRkZWQgaW4gc29ydGVkIG9yZGVyLgotICAgICAqLwotICAgIHNrQ0FMaXN0ID0gc2tfWDUwOV9OQU1FX25ldyhzc2xfaW5pdF9GaW5kQ0FMaXN0X1g1MDlOYW1lQ21wKTsKLQotICAgIC8qCi0gICAgICogUHJvY2VzcyBDQSBjZXJ0aWZpY2F0ZSBidW5kbGUgZmlsZQotICAgICAqLwotICAgIGlmIChjcENBZmlsZSAhPSBOVUxMKSB7Ci0gICAgICAgIHNrID0gU1NMX2xvYWRfY2xpZW50X0NBX2ZpbGUoY3BDQWZpbGUpOwotICAgICAgICBmb3IobiA9IDA7IHNrICE9IE5VTEwgJiYgbiA8IHNrX1g1MDlfTkFNRV9udW0oc2spOyBuKyspIHsKLSAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwKLSAgICAgICAgICAgICAgICAgICAgIkNBIGNlcnRpZmljYXRlOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIFg1MDlfTkFNRV9vbmVsaW5lKHNrX1g1MDlfTkFNRV92YWx1ZShzaywgbiksIE5VTEwsIDApKTsKLSAgICAgICAgICAgIGlmIChza19YNTA5X05BTUVfZmluZChza0NBTGlzdCwgc2tfWDUwOV9OQU1FX3ZhbHVlKHNrLCBuKSkgPCAwKQotICAgICAgICAgICAgICAgIHNrX1g1MDlfTkFNRV9wdXNoKHNrQ0FMaXN0LCBza19YNTA5X05BTUVfdmFsdWUoc2ssIG4pKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogUHJvY2VzcyBDQSBjZXJ0aWZpY2F0ZSBwYXRoIGZpbGVzCi0gICAgICovCi0gICAgaWYgKGNwQ0FwYXRoICE9IE5VTEwpIHsKLSAgICAgICAgZGlyID0gYXBfcG9wZW5kaXIocCwgY3BDQXBhdGgpOwotICAgICAgICB3aGlsZSAoKGRpcmVudHJ5ID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjcCA9IGFwX3BzdHJjYXQocCwgY3BDQXBhdGgsICIvIiwgZGlyZW50cnktPmRfbmFtZSwgTlVMTCk7Ci0gICAgICAgICAgICBzayA9IFNTTF9sb2FkX2NsaWVudF9DQV9maWxlKGNwKTsKLSAgICAgICAgICAgIGZvcihuID0gMDsgc2sgIT0gTlVMTCAmJiBuIDwgc2tfWDUwOV9OQU1FX251bShzayk7IG4rKykgewotICAgICAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJDQSBjZXJ0aWZpY2F0ZTogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV9OQU1FX29uZWxpbmUoc2tfWDUwOV9OQU1FX3ZhbHVlKHNrLCBuKSwgTlVMTCwgMCkpOwotICAgICAgICAgICAgICAgIGlmIChza19YNTA5X05BTUVfZmluZChza0NBTGlzdCwgc2tfWDUwOV9OQU1FX3ZhbHVlKHNrLCBuKSkgPCAwKQotICAgICAgICAgICAgICAgICAgICBza19YNTA5X05BTUVfcHVzaChza0NBTGlzdCwgc2tfWDUwOV9OQU1FX3ZhbHVlKHNrLCBuKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXBfcGNsb3NlZGlyKHAsIGRpcik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDbGVhbnVwCi0gICAgICovCi0gICAgc2tfWDUwOV9OQU1FX3NldF9jbXBfZnVuYyhza0NBTGlzdCwgTlVMTCk7Ci0gICAgYXBfZGVzdHJveV9wb29sKHApOwotCi0gICAgcmV0dXJuIHNrQ0FMaXN0OwotfQotCi12b2lkIHNzbF9pbml0X0NoaWxkKHNlcnZlcl9yZWMgKnMsIHBvb2wgKnApCi17Ci0gICAgIC8qIG9wZW4gdGhlIG11dGV4IGxvY2tmaWxlICovCi0gICAgIHNzbF9tdXRleF9yZWluaXQocywgcCk7Ci0gICAgIHJldHVybjsKLX0KLQotdm9pZCBzc2xfaW5pdF9DaGlsZEtpbGwodm9pZCAqZGF0YSkKLXsKLSAgICAvKiBjdXJyZW50bHkgbm90aGluZyB0byBkbyAqLwotICAgIHJldHVybjsKLX0KLQotdm9pZCBzc2xfaW5pdF9Nb2R1bGVLaWxsKHZvaWQgKmRhdGEpCi17Ci0gICAgU1NMU3J2Q29uZmlnUmVjICpzYzsKLSAgICBzZXJ2ZXJfcmVjICpzID0gKHNlcnZlcl9yZWMgKilkYXRhOwotCi0gICAgLyoKLSAgICAgKiBEcm9wIHRoZSBzZXNzaW9uIGNhY2hlIGFuZCBtdXRleAotICAgICAqLwotICAgIHNzbF9zY2FjaGVfa2lsbChzKTsKLSAgICBzc2xfbXV0ZXhfa2lsbChzKTsKLQotICAgIC8qIAotICAgICAqIERlc3Ryb3kgdGhlIHRlbXBvcmFyeSBrZXlzIGFuZCBwYXJhbXMKLSAgICAgKi8KLSAgICBzc2xfaW5pdF9UbXBLZXlzSGFuZGxlKFNTTF9US1BfRlJFRSwgcywgTlVMTCk7Ci0KLSAgICAvKgotICAgICAqIEZyZWUgdGhlIG5vbi1wb29sIGFsbG9jYXRlZCBzdHJ1Y3R1cmVzCi0gICAgICogaW4gdGhlIHBlci1zZXJ2ZXIgY29uZmlndXJhdGlvbnMKLSAgICAgKi8KLSAgICBmb3IgKDsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkgewotICAgICAgICBzYyA9IG15U3J2Q29uZmlnKHMpOwotICAgICAgICBpZiAoc2MtPnBQdWJsaWNDZXJ0W1NTTF9BSURYX1JTQV0gIT0gTlVMTCkgewotICAgICAgICAgICAgWDUwOV9mcmVlKHNjLT5wUHVibGljQ2VydFtTU0xfQUlEWF9SU0FdKTsKLSAgICAgICAgICAgIHNjLT5wUHVibGljQ2VydFtTU0xfQUlEWF9SU0FdID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2MtPnBQdWJsaWNDZXJ0W1NTTF9BSURYX0RTQV0gIT0gTlVMTCkgewotICAgICAgICAgICAgWDUwOV9mcmVlKHNjLT5wUHVibGljQ2VydFtTU0xfQUlEWF9EU0FdKTsKLSAgICAgICAgICAgIHNjLT5wUHVibGljQ2VydFtTU0xfQUlEWF9EU0FdID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2MtPnBQcml2YXRlS2V5W1NTTF9BSURYX1JTQV0gIT0gTlVMTCkgewotICAgICAgICAgICAgRVZQX1BLRVlfZnJlZShzYy0+cFByaXZhdGVLZXlbU1NMX0FJRFhfUlNBXSk7Ci0gICAgICAgICAgICBzYy0+cFByaXZhdGVLZXlbU1NMX0FJRFhfUlNBXSA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNjLT5wUHJpdmF0ZUtleVtTU0xfQUlEWF9EU0FdICE9IE5VTEwpIHsKLSAgICAgICAgICAgIEVWUF9QS0VZX2ZyZWUoc2MtPnBQcml2YXRlS2V5W1NTTF9BSURYX0RTQV0pOwotICAgICAgICAgICAgc2MtPnBQcml2YXRlS2V5W1NTTF9BSURYX0RTQV0gPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzYy0+cFNTTEN0eCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBTU0xfQ1RYX2ZyZWUoc2MtPnBTU0xDdHgpOwotICAgICAgICAgICAgc2MtPnBTU0xDdHggPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUcnkgdG8ga2lsbCB0aGUgaW50ZXJuYWxzIG9mIHRoZSBTU0wgbGlicmFyeS4KLSAgICAgKi8KLSNpZmRlZiBTSEFSRURfTU9EVUxFCi0gICAgRVJSX2ZyZWVfc3RyaW5ncygpOwotICAgIEVSUl9yZW1vdmVfc3RhdGUoMCk7Ci0gICAgRVZQX2NsZWFudXAoKTsKLSNlbmRpZgotCi0gICAgcmV0dXJuOwotfQotCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NzbC9zc2xfZW5naW5lX2lvLmMgYi9tb2R1bGVzL3NzbC9zc2xfZW5naW5lX2lvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYTE1NzQuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9zc2wvc3NsX2VuZ2luZV9pby5jCisrKyAvZGV2L251bGwKQEAgLTEsNzI4ICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgIF8gICAgICAgICAgICAgXwotKiogIF8gX18gX19fICAgX19fICAgX198IHwgICAgX19fIF9fX3wgfCAgbW9kX3NzbAotKiogfCAnXyBgIF8gXCAvIF8gXCAvIF9gIHwgICAvIF9fLyBfX3wgfCAgQXBhY2hlIEludGVyZmFjZSB0byBPcGVuU1NMCi0qKiB8IHwgfCB8IHwgfCAoXykgfCAoX3wgfCAgIFxfXyBcX18gXCB8ICB3d3cubW9kc3NsLm9yZwotKiogfF98IHxffCB8X3xcX19fLyBcX18sX3xfX198X19fL19fXy9ffCAgZnRwLm1vZHNzbC5vcmcKLSoqICAgICAgICAgICAgICAgICAgICAgIHxfX19fX3wKLSoqICBzc2xfZW5naW5lX2lvLmMKLSoqICBJL08gRnVuY3Rpb25zCi0qLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgUmFsZiBTLiBFbmdlbHNjaGFsbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLSAqICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLSAqICAgICBSYWxmIFMuIEVuZ2Vsc2NoYWxsIDxyc2VAZW5nZWxzY2hhbGwuY29tPiBmb3IgdXNlIGluIHRoZQotICogICAgIG1vZF9zc2wgcHJvamVjdCAoaHR0cDovL3d3dy5tb2Rzc2wub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAibW9kX3NzbCIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIHJzZUBlbmdlbHNjaGFsbC5jb20uCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIm1vZF9zc2wiCi0gKiAgICBub3IgbWF5ICJtb2Rfc3NsIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvcgotICogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFJhbGYgUy4gRW5nZWxzY2hhbGwuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotICogICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+IGZvciB1c2UgaW4gdGhlCi0gKiAgICAgbW9kX3NzbCBwcm9qZWN0IChodHRwOi8vd3d3Lm1vZHNzbC5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBSQUxGIFMuIEVOR0VMU0NIQUxMIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBSQUxGIFMuIEVOR0VMU0NIQUxMIE9SCi0gKiBISVMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYGBNWSBIQUNLOiBUaGlzIHVuaXZlcnNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEp1c3Qgb25lIGxpdHRsZSBwcm9ibGVtOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUga2VlcHMgZHVtcGluZy4nJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBVbmtub3duICAgICovCi0jaW5jbHVkZSAibW9kX3NzbC5oIgotCi0vKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgSS9PIFJlcXVlc3QgQm9keSBTdWNraW5nIGFuZCBSZS1JbmplY3Rpb24KLSoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKi8KLQotI2lmbmRlZiBTU0xfQ09OU0VSVkFUSVZFCi0KLS8qCi0gKiBCYWNrZ3JvdW5kOgotICoKLSAqIDEuIFdoZW4gdGhlIGNsaWVudCBzZW5kcyBhIEhUVFAvSFRUUFMgcmVxdWVzdCwgQXBhY2hlJ3MgY29yZSBjb2RlCi0gKiByZWFkcyBvbmx5IHRoZSByZXF1ZXN0IGxpbmUgKCJNRVRIT0QgL3BhdGggSFRUUC94LnkiKSBhbmQgdGhlCi0gKiBhdHRhY2hlZCBNSU1FIGhlYWRlcnMgKCJGb286IGJhciIpIHVwIHRvIHRoZSB0ZXJtaW5hdGluZyBsaW5lICgiQ1IKLSAqIExGIikuIEFuIGF0dGFjaGVkIHJlcXVlc3QgYm9keSAoZm9yIGluc3RhbmNlIHRoZSBkYXRhIG9mIGEgUE9TVAotICogbWV0aG9kKSBpcyBfTk9UXyByZWFkLiBJbnN0ZWFkIGl0IGlzIHJlYWQgYnkgbW9kX2NnaSdzIGNvbnRlbnQKLSAqIGhhbmRsZXIgYW5kIGRpcmVjdGx5IHBhc3NlZCB0byB0aGUgQ0dJIHNjcmlwdC4KLSAqCi0gKiAyLiBtb2Rfc3NsIHN1cHBvcnRzIHBlci1kaXJlY3RvcnkgcmUtY29uZmlndXJhdGlvbiBvZiBTU0wgcGFyYW1ldGVycy4KLSAqIFRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgcGVyZm9ybWluZyBhbiBTU0wgcmVuZWdvdGlhdGlvbiBvZiB0aGUKLSAqIHJlLWNvbmZpZ3VyZWQgcGFyYW1ldGVycyBhZnRlciB0aGUgcmVxdWVzdCBpcyByZWFkLCBidXQgYmVmb3JlIHRoZQotICogcmVzcG9uc2UgaXMgc2VudC4gSW4gbW9yZSBkZXRhaWw6IHRoZSByZW5lZ290aWF0aW9uIGhhcHBlbnMgYWZ0ZXIgdGhlCi0gKiByZXF1ZXN0IGxpbmUgYW5kIE1JTUUgaGVhZGVycyB3ZXJlIHJlYWQsIGJ1dCBfYmVmb3JlXyB0aGUgYXR0YWNoZWQKLSAqIHJlcXVlc3QgYm9keSBpcyByZWFkLiBUaGUgcmVhc29uIHNpbXBseSBpcyB0aGF0IGluIHRoZSBIVFRQIHByb3RvY29sCi0gKiB1c3VhbGx5IHRoZXJlIGlzIG5vIGFja25vd2xlZGdtZW50IHN0ZXAgYmV0d2VlbiB0aGUgaGVhZGVycyBhbmQgdGhlCi0gKiBib2R5ICh0aGVyZSBpcyB0aGUgMTAwLWNvbnRpbnVlIGZlYXR1cmUgYW5kIHRoZSBjaHVua2luZyBmYWNpbGl0eQotICogb25seSksIHNvIEFwYWNoZSBoYXMgbm8gQVBJIGhvb2sgZm9yIHRoaXMgc3RlcC4KLSAqCi0gKiAzLiB0aGUgcHJvYmxlbSBub3cgb2NjdXJzIHdoZW4gdGhlIGNsaWVudCBzZW5kcyBhIFBPU1QgcmVxdWVzdCBmb3IKLSAqIFVSTCAvZm9vIHZpYSBIVFRQUyB0aGUgc2VydmVyIGFuZCB0aGUgc2VydmVyIGhhcyBTU0wgcGFyYW1ldGVycwotICogcmUtY29uZmlndXJlZCBvbiBhIHBlci1VUkwgYmFzaXMgZm9yIC9mb28uIFRoZW4gbW9kX3NzbCBoYXMgdG8KLSAqIHBlcmZvcm0gYW4gU1NMIHJlbmVnb3RpYXRpb24gYWZ0ZXIgdGhlIHJlcXVlc3Qgd2FzIHJlYWQgYW5kIGJlZm9yZQotICogdGhlIHJlc3BvbnNlIGlzIHNlbnQuIEJ1dCB0aGUgcHJvYmxlbSBpcyB0aGUgcGVuZGluZyBQT1NUIGJvZHkgZGF0YQotICogaW4gdGhlIHJlY2VpdmUgYnVmZmVyIG9mIFNTTCAod2hpY2ggQXBhY2hlIHN0aWxsIGhhcyBub3QgcmVhZCAtIGl0J3MKLSAqIHBlbmRpbmcgdW50aWwgbW9kX2NnaSBzdWNrcyBpdCBpbikuIFdoZW4gbW9kX3NzbCBub3cgdHJpZXMgdG8gcGVyZm9ybQotICogdGhlIHJlbmVnb3RpYXRpb24gdGhlIHBlbmRpbmcgZGF0YSBsZWFkcyB0byBhbiBJL08gZXJyb3IuCi0gKgotICogU29sdXRpb24gSWRlYToKLSAqCi0gKiBUaGVyZSBhcmUgb25seSB0d28gc29sdXRpb25zOiBFaXRoZXIgdG8gc2ltcGx5IHN0YXRlIHRoYXQgUE9TVAotICogcmVxdWVzdHMgdG8gVVJMcyB3aXRoIFNTTCByZS1jb25maWd1cmF0aW9ucyBhcmUgbm90IGFsbG93ZWQsIG9yIHRvCi0gKiByZW5lZ290aWF0ZSByZWFsbHkgYWZ0ZXIgdGhlIF9jb21wbGV0ZV8gcmVxdWVzdCAoaS5lLiBpbmNsdWRpbmcKLSAqIHRoZSBQT1NUIGJvZHkpIHdhcyByZWFkLiBPYnZpb3VzbHkgdGhlIGxhdHRlciB3b3VsZCBiZSBwcmVmZXJyZWQsCi0gKiBidXQgaXQgY2Fubm90IGJlIGRvbmUgZWFzaWx5IGluc2lkZSBBcGFjaGUsIGJlY2F1c2UgYXMgYWxyZWFkeQotICogbWVudGlvbmVkLCB0aGVyZSBpcyBubyBBUEkgc3RlcCBiZXR3ZWVuIHRoZSBib2R5IHJlYWRpbmcgYW5kIHRoZSBib2R5Ci0gKiBwcm9jZXNzaW5nLiBBbmQgZXZlbiB3aGVuIHdlIG1vZF9zc2wgd291bGQgaG9vayBkaXJlY3RseSBpbnRvIHRoZQotICogbG9vcCBvZiBtb2RfY2dpLCB3ZSB3b3VsZG4ndCBzb2x2ZSB0aGUgcHJvYmxlbSBmb3Igb3RoZXIgaGFuZGxlcnMsIG9mCi0gKiBjb3Vyc2UuIFNvIHRoZSBvbmx5IGdlbmVyYWwgc29sdXRpb24gaXMgdG8gc3VjayBpbiB0aGUgcGVuZGluZyBkYXRhCi0gKiBvZiB0aGUgcmVxdWVzdCBib2R5IGZyb20gdGhlIE9wZW5TU0wgQklPIGludG8gdGhlIEFwYWNoZSBCVUZGLiBUaGVuCi0gKiB0aGUgcmVuZWdvdGlhdGlvbiBjYW4gYmUgZG9uZSBhbmQgYWZ0ZXIgdGhpcyBzdGVwIEFwYWNoZSBjYW4gcHJvY2VlZAotICogcHJvY2Vzc2luZyB0aGUgcmVxdWVzdCBhcyBiZWZvcmUuCi0gKgotICogU29sdXRpb24gSW1wbGVtZW50YXRpb246Ci0gKgotICogV2UgY2Fubm90IHNpbXBseSBzdWNrIGluIHRoZSBkYXRhIHZpYSBhbiBTU0xfcmVhZC1iYXNlZCBsb29wIGJlY2F1c2Ugb2YKLSAqIEhUVFAgY2h1bmtpbmcuIEluc3RlYWQgd2UgX2hhdmVfIHRvIHVzZSB0aGUgQXBhY2hlIEFQSSBmb3IgdGhpcyBzdGVwIHdoaWNoCi0gKiBpcyBhd2FyZSBvZiBIVFRQIGNodW5raW5nLiBTbyB0aGUgdHJpY2sgaXMgdG8gc3VjayBpbiB0aGUgcGVuZGluZyByZXF1ZXN0Ci0gKiBkYXRhIHZpYSB0aGUgQXBhY2hlIEFQSSAod2hpY2ggdXNlcyBBcGFjaGUncyBCVUZGIGNvZGUgYW5kIGluIHRoZQotICogYmFja2dyb3VuZCBtb2Rfc3NsJ3MgSS9PIGdsdWUgY29kZSkgYW5kIHJlLWluamVjdCBpdCBsYXRlciBpbnRvIHRoZSBBcGFjaGUKLSAqIEJVRkYgY29kZSBhZ2Fpbi4gVGhpcyB3YXkgdGhlIGRhdGEgZmxvd3MgdHdpY2UgdGhyb3VnaCB0aGUgQXBhY2hlIEJVRkYsIG9mCi0gKiBjb3Vyc2UuIEJ1dCB0aGlzIHdheSB0aGUgc29sdXRpb24gZG9lc24ndCBkZXBlbmQgb24gYW55IEFwYWNoZSBzcGVjaWZpY3MKLSAqIGFuZCBpcyBmdWxseSB0cmFuc3BhcmVudCB0byBBcGFjaGUgbW9kdWxlcy4KLSAqLwotCi1zdHJ1Y3Qgc3NsX2lvX3N1Y2tfc3QgewotICAgIEJPT0wgIGFjdGl2ZTsKLSAgICBjaGFyICpidWZwdHI7Ci0gICAgaW50ICAgYnVmbGVuOwotICAgIGNoYXIgKnBlbmRwdHI7Ci0gICAgaW50ICAgcGVuZGxlbjsKLX07Ci0KLS8qIHByZXBhcmUgcmVxdWVzdF9yZWMgc3RydWN0dXJlIGZvciBpbnB1dCBzdWNraW5nICovCi1zdGF0aWMgdm9pZCBzc2xfaW9fc3Vja19zdGFydChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBzdHJ1Y3Qgc3NsX2lvX3N1Y2tfc3QgKnNzOwotCi0gICAgc3MgPSBhcF9jdHhfZ2V0KHItPmN0eCwgInNzbDo6aW86OnN1Y2siKTsKLSAgICBpZiAoc3MgPT0gTlVMTCkgewotICAgICAgICBzcyA9IGFwX3BhbGxvYyhyLT5wb29sLCBzaXplb2Yoc3RydWN0IHNzbF9pb19zdWNrX3N0KSk7Ci0gICAgICAgIGFwX2N0eF9zZXQoci0+Y3R4LCAic3NsOjppbzo6c3VjayIsIHNzKTsKLSAgICAgICAgc3MtPmJ1ZmxlbiAgPSA4MTkyOwotICAgICAgICBzcy0+YnVmcHRyICA9IGFwX3BhbGxvYyhyLT5wb29sLCBzcy0+YnVmbGVuKTsKLSAgICB9Ci0gICAgc3MtPnBlbmRwdHIgPSBzcy0+YnVmcHRyOwotICAgIHNzLT5wZW5kbGVuID0gMDsKLSAgICBzcy0+YWN0aXZlID0gRkFMU0U7Ci0gICAgcmV0dXJuOwotfQotCi0vKiByZWNvcmQgYSBzdWNrZWQgaW5wdXQgY2h1bmsgKi8KLXN0YXRpYyB2b2lkIHNzbF9pb19zdWNrX3JlY29yZChyZXF1ZXN0X3JlYyAqciwgY2hhciAqYnVmLCBpbnQgbGVuKQotewotICAgIHN0cnVjdCBzc2xfaW9fc3Vja19zdCAqc3M7Ci0gICAgCi0gICAgaWYgKChzcyA9IGFwX2N0eF9nZXQoci0+Y3R4LCAic3NsOjppbzo6c3VjayIpKSA9PSBOVUxMKQotICAgICAgICByZXR1cm47Ci0gICAgaWYgKCgoc3MtPmJ1ZnB0ciArIHNzLT5idWZsZW4pIC0gKHNzLT5wZW5kcHRyICsgc3MtPnBlbmRsZW4pKSA8IGxlbikgewotICAgICAgICAvKiAiZXhwYW5kIiBidWZmZXI6IGFjdHVhbGx5IHdlIGNhbm5vdCByZWFsbHkgZXhwYW5kIHRoZSBidWZmZXIKLSAgICAgICAgICAgaGVyZSwgYmVjYXVzZSBBcGFjaGUncyBwb29sIHN5c3RlbSBkb2Vzbid0IHN1cHBvcnQgZXhwYW5kaW5nIGNodW5rcwotICAgICAgICAgICBvZiBtZW1vcnkuIEluc3RlYWQgd2UgaGF2ZSB0byBlaXRoZXIgcmV1c2UgcHJvY2Vzc2VkIGRhdGEgb3IKLSAgICAgICAgICAgYWxsb2NhdGUgYSBuZXcgY2h1bmsgb2YgbWVtb3J5IGluIGFkdmFuY2UgaWYgd2UgcmVhbGx5IG5lZWQgbW9yZQotICAgICAgICAgICBtZW1vcnkuICovCi0gICAgICAgIGludCBuZXdsZW47Ci0gICAgICAgIGNoYXIgKm5ld3B0cjsKLQotICAgICAgICBpZiAoKCAgKHNzLT5wZW5kcHRyIC0gc3MtPmJ1ZnB0cikgCi0gICAgICAgICAgICAgKyAoKHNzLT5idWZwdHIgKyBzcy0+YnVmbGVuKSAtIChzcy0+cGVuZHB0ciArIHNzLT5wZW5kbGVuKSkgKSA+PSBsZW4pIHsKLSAgICAgICAgICAgIC8qIG1ha2UgbWVtb3J5IGF2YWlsYWJsZSBieSByZXVzaW5nIGFscmVhZHkgcHJvY2Vzc2VkIGRhdGEgKi8KLSAgICAgICAgICAgIG1lbW1vdmUoc3MtPmJ1ZnB0ciwgc3MtPnBlbmRwdHIsIHNzLT5wZW5kbGVuKTsKLSAgICAgICAgICAgIHNzLT5wZW5kcHRyID0gc3MtPmJ1ZnB0cjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIHRvbyBiYWQsIHdlIGhhdmUgdG8gYWxsb2NhdGUgYSBuZXcgbGFyZ2VyIGJ1ZmZlciAqLwotICAgICAgICAgICAgbmV3bGVuID0gKHNzLT5idWZsZW4gKiAyKSArIGxlbjsKLSAgICAgICAgICAgIG5ld3B0ciA9IGFwX3BhbGxvYyhyLT5wb29sLCBuZXdsZW4pOwotICAgICAgICAgICAgc3MtPmJ1ZnB0ciAgPSBuZXdwdHI7Ci0gICAgICAgICAgICBzcy0+YnVmbGVuICA9IG5ld2xlbjsKLSAgICAgICAgICAgIG1lbWNweShzcy0+YnVmcHRyLCBzcy0+cGVuZHB0ciwgc3MtPnBlbmRsZW4pOwotICAgICAgICAgICAgc3MtPnBlbmRwdHIgPSBzcy0+YnVmcHRyOwotICAgICAgICB9Ci0gICAgfQotICAgIG1lbWNweShzcy0+cGVuZHB0citzcy0+cGVuZGxlbiwgYnVmLCBsZW4pOwotICAgIHNzLT5wZW5kbGVuICs9IGxlbjsKLSAgICByZXR1cm47Ci19Ci0KLS8qIGZpbmlzaCByZXF1ZXN0X3JlYyBhZnRlciBpbnB1dCBzdWNraW5nICovCi1zdGF0aWMgdm9pZCBzc2xfaW9fc3Vja19lbmQocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgc3RydWN0IHNzbF9pb19zdWNrX3N0ICpzczsKLSAgICAKLSAgICBpZiAoKHNzID0gYXBfY3R4X2dldChyLT5jdHgsICJzc2w6OmlvOjpzdWNrIikpID09IE5VTEwpCi0gICAgICAgIHJldHVybjsKLSAgICBzcy0+YWN0aXZlID0gVFJVRTsKLSAgICByLT5yZWFkX2JvZHkgICAgPSBSRVFVRVNUX05PX0JPRFk7Ci0gICAgci0+cmVhZF9sZW5ndGggID0gMDsKLSAgICByLT5yZWFkX2NodW5rZWQgPSAwOwotICAgIHItPnJlbWFpbmluZyAgICA9IDA7Ci0gICAgYXBfYnNldGZsYWcoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCX0NIVU5LLCAwKTsKLSAgICByZXR1cm47Ci19Ci0KLXZvaWQgc3NsX2lvX3N1Y2socmVxdWVzdF9yZWMgKnIsIFNTTCAqc3NsKQotewotICAgIGludCByYzsKLSAgICBpbnQgbGVuOwotICAgIGNoYXIgKmJ1ZjsKLSAgICBpbnQgYnVmbGVuOwotICAgIGNoYXIgYzsKLSAgICBpbnQgc3Vja2VkOwotCi0gICAgaWYgKChyYyA9IGFwX3NldHVwX2NsaWVudF9ibG9jayhyLCBSRVFVRVNUX0NIVU5LRURfREVDSFVOSykpID09IE9LKSB7Ci0gICAgICAgIGlmIChhcF9zaG91bGRfY2xpZW50X2Jsb2NrKHIpKSB7Ci0KLSAgICAgICAgICAgIC8qIHJlYWQgY2xpZW50IHJlcXVlc3QgYmxvY2sgdGhyb3VnaCBBcGFjaGUgQVBJICovCi0gICAgICAgICAgICBidWZsZW4gPSBIVUdFX1NUUklOR19MRU47Ci0gICAgICAgICAgICBidWYgPSBhcF9wYWxsb2Moci0+cG9vbCwgYnVmbGVuKTsKLSAgICAgICAgICAgIGFwX2hhcmRfdGltZW91dCgiU1NMIEkvTyByZXF1ZXN0IGJvZHkgcHJlLXN1Y2tpbmciLCByKTsKLSAgICAgICAgICAgIHN1Y2tlZCA9IDA7Ci0gICAgICAgICAgICBzc2xfaW9fc3Vja19zdGFydChyKTsKLSAgICAgICAgICAgIHdoaWxlICgobGVuID0gYXBfZ2V0X2NsaWVudF9ibG9jayhyLCBidWYsIGJ1ZmxlbikpID4gMCkgewotICAgICAgICAgICAgICAgIHNzbF9pb19zdWNrX3JlY29yZChyLCBidWYsIGxlbik7Ci0gICAgICAgICAgICAgICAgc3Vja2VkICs9IGxlbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNzbF9pb19zdWNrX2VuZChyKTsKLSAgICAgICAgICAgIGFwX2tpbGxfdGltZW91dChyKTsKLQotICAgICAgICAgICAgLyogc3VjayB0cmFpbGluZyBkYXRhICh1c3VhbGx5IENSIExGKSB3aGljaCAKLSAgICAgICAgICAgICAgIGlzIHN0aWxsIGluIHRoZSBBcGFjaGUgQlVGRiBsYXllciAqLwotICAgICAgICAgICAgd2hpbGUgKGFwX2JwZWVrYyhyLT5jb25uZWN0aW9uLT5jbGllbnQpICE9IEVPRikgewotICAgICAgICAgICAgICAgIGMgPSBhcF9iZ2V0YyhyLT5jb25uZWN0aW9uLT5jbGllbnQpOwotICAgICAgICAgICAgICAgIHNzbF9pb19zdWNrX3JlY29yZChyLCAmYywgMSk7Ci0gICAgICAgICAgICAgICAgc3Vja2VkKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNzbF9sb2coci0+c2VydmVyLCBTU0xfTE9HX1RSQUNFLCAKLSAgICAgICAgICAgICAgICAgICAgIkkvTzogc3Vja2VkICVkIGJ5dGVzIG9mIGlucHV0IGRhdGEgZnJvbSBTU0wvVExTIEkvTyBsYXllciAiCi0gICAgICAgICAgICAgICAgICAgICJmb3IgZGVsYXllZCBpbmplY3Rpb24gaW50byBBcGFjaGUgSS9PIGxheWVyIiwgc3Vja2VkKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm47Ci19Ci0gICAgCi0vKiB0aGUgU1NMX3JlYWQgcmVwbGFjZW1lbnQgcm91dGluZSB3aGljaCBrbm93cyBhYm91dCB0aGUgc3VjayBidWZmZXIgKi8KLXN0YXRpYyBpbnQgc3NsX2lvX3N1Y2tfcmVhZChTU0wgKnNzbCwgY2hhciAqYnVmLCBpbnQgbGVuKQotewotICAgIGFwX2N0eCAqYWN0eDsKLSAgICBzdHJ1Y3Qgc3NsX2lvX3N1Y2tfc3QgKnNzOwotICAgIHJlcXVlc3RfcmVjICpyID0gTlVMTDsKLSAgICBpbnQgcnY7Ci0KLSAgICBhY3R4ID0gKGFwX2N0eCAqKVNTTF9nZXRfYXBwX2RhdGEyKHNzbCk7Ci0gICAgaWYgKGFjdHggIT0gTlVMTCkKLSAgICAgICAgciA9IChyZXF1ZXN0X3JlYyAqKWFwX2N0eF9nZXQoYWN0eCwgInNzbDo6cmVxdWVzdF9yZWMiKTsKLQotICAgIHJ2ID0gLTE7Ci0gICAgaWYgKHIgIT0gTlVMTCkgewotICAgICAgICBzcyA9IGFwX2N0eF9nZXQoci0+Y3R4LCAic3NsOjppbzo6c3VjayIpOwotICAgICAgICBpZiAoc3MgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKHNzLT5hY3RpdmUgJiYgc3MtPnBlbmRsZW4gPiAwKSB7Ci0gICAgICAgICAgICAgICAgLyogb2ssIHRoZXJlIGlzIHByZS1zdWNrZWQgZGF0YSAqLwotICAgICAgICAgICAgICAgIGxlbiA9IChzcy0+cGVuZGxlbiA+IGxlbiA/IGxlbiA6IHNzLT5wZW5kbGVuKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoYnVmLCBzcy0+cGVuZHB0ciwgbGVuKTsKLSAgICAgICAgICAgICAgICBzcy0+cGVuZHB0ciArPSBsZW47Ci0gICAgICAgICAgICAgICAgc3MtPnBlbmRsZW4gLT0gbGVuOwotICAgICAgICAgICAgICAgIHNzbF9sb2coci0+c2VydmVyLCBTU0xfTE9HX1RSQUNFLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICJJL086IGluamVjdGluZyAlZCBieXRlcyBvZiBwcmUtc3Vja2VkIGRhdGEgIgotICAgICAgICAgICAgICAgICAgICAgICAgImludG8gQXBhY2hlIEkvTyBsYXllciIsIGxlbik7Ci0gICAgICAgICAgICAgICAgcnYgPSBsZW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHJ2ID09IC0xKQotICAgICAgICBydiA9IFNTTF9yZWFkKHNzbCwgYnVmLCBsZW4pOwotICAgIHJldHVybiBydjsKLX0KLQotLyogb3ZlcnJpZGUgU1NMX3JlYWQgaW4gdGhlIGZvbGxvd2luZyBjb2RlLi4uICovCi0jZGVmaW5lIFNTTF9yZWFkIHNzbF9pb19zdWNrX3JlYWQKLQotI2VuZGlmIC8qICFTU0xfQ09OU0VSVkFUSVZFICovCi0KLS8qICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICBJL08gSG9va3MKLSoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKi8KLQotI2lmbmRlZiBOT19XUklURVYKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvdWlvLmg+Ci0jZW5kaWYKLQotc3RhdGljIGludCBzc2xfaW9faG9va19yZWFkKEJVRkYgKmZiLCBjaGFyICpidWYsIGludCBsZW4pOwotc3RhdGljIGludCBzc2xfaW9faG9va193cml0ZShCVUZGICpmYiwgY2hhciAqYnVmLCBpbnQgbGVuKTsKLSNpZm5kZWYgTk9fV1JJVEVWCi1zdGF0aWMgaW50IHNzbF9pb19ob29rX3dyaXRldihCVUZGICpmYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGludCBpb3ZjbnQpOwotI2VuZGlmCi0jaWZkZWYgV0lOMzIKLXN0YXRpYyBpbnQgc3NsX2lvX2hvb2tfcmVjdndpdGh0aW1lb3V0KEJVRkYgKmZiLCBjaGFyICpidWYsIGludCBsZW4pOwotc3RhdGljIGludCBzc2xfaW9faG9va19zZW5kd2l0aHRpbWVvdXQoQlVGRiAqZmIsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbik7Ci0jZW5kaWYgLyogV0lOMzIgKi8KLQotdm9pZCBzc2xfaW9fcmVnaXN0ZXIodm9pZCkKLXsKLSAgICBhcF9ob29rX3JlZ2lzdGVyKCJhcDo6YnVmZjo6cmVhZCIsICAgc3NsX2lvX2hvb2tfcmVhZCwgIEFQX0hPT0tfTk9DVFgpOwotICAgIGFwX2hvb2tfcmVnaXN0ZXIoImFwOjpidWZmOjp3cml0ZSIsICBzc2xfaW9faG9va193cml0ZSwgQVBfSE9PS19OT0NUWCk7Ci0jaWZuZGVmIE5PX1dSSVRFVgotICAgIGFwX2hvb2tfcmVnaXN0ZXIoImFwOjpidWZmOjp3cml0ZXYiLCBzc2xfaW9faG9va193cml0ZXYsIEFQX0hPT0tfTk9DVFgpOwotI2VuZGlmCi0jaWZkZWYgV0lOMzIKLSAgICBhcF9ob29rX3JlZ2lzdGVyKCJhcDo6YnVmZjo6cmVjdndpdGh0aW1lb3V0IiwKLSAgICAgICAgICAgICAgICAgICAgIHNzbF9pb19ob29rX3JlY3Z3aXRodGltZW91dCwgQVBfSE9PS19OT0NUWCk7Ci0gICAgYXBfaG9va19yZWdpc3RlcigiYXA6OmJ1ZmY6OnNlbmR3aXRodGltZW91dCIsCi0gICAgICAgICAgICAgICAgICAgICBzc2xfaW9faG9va19zZW5kd2l0aHRpbWVvdXQsIEFQX0hPT0tfTk9DVFgpOwotI2VuZGlmCi0gICAgcmV0dXJuOwotfQotCi12b2lkIHNzbF9pb191bnJlZ2lzdGVyKHZvaWQpCi17Ci0gICAgYXBfaG9va191bnJlZ2lzdGVyKCJhcDo6YnVmZjo6cmVhZCIsICAgc3NsX2lvX2hvb2tfcmVhZCk7Ci0gICAgYXBfaG9va191bnJlZ2lzdGVyKCJhcDo6YnVmZjo6d3JpdGUiLCAgc3NsX2lvX2hvb2tfd3JpdGUpOwotI2lmbmRlZiBOT19XUklURVYKLSAgICBhcF9ob29rX3VucmVnaXN0ZXIoImFwOjpidWZmOjp3cml0ZXYiLCBzc2xfaW9faG9va193cml0ZXYpOwotI2VuZGlmCi0jaWZkZWYgV0lOMzIKLSAgICBhcF9ob29rX3VucmVnaXN0ZXIoImFwOjpidWZmOjpyZWN2d2l0aHRpbWVvdXQiLCBzc2xfaW9faG9va19yZWN2d2l0aHRpbWVvdXQpOwotICAgIGFwX2hvb2tfdW5yZWdpc3RlcigiYXA6OmJ1ZmY6OnNlbmR3aXRodGltZW91dCIsIHNzbF9pb19ob29rX3NlbmR3aXRodGltZW91dCk7Ci0jZW5kaWYKLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQgc3NsX2lvX2hvb2tfcmVhZChCVUZGICpmYiwgY2hhciAqYnVmLCBpbnQgbGVuKQotewotICAgIFNTTCAqc3NsOwotICAgIGNvbm5fcmVjICpjOwotICAgIGludCByYzsKLQotICAgIGlmICgoc3NsID0gYXBfY3R4X2dldChmYi0+Y3R4LCAic3NsIikpICE9IE5VTEwpIHsKLSAgICAgICAgcmMgPSBTU0xfcmVhZChzc2wsIGJ1ZiwgbGVuKTsKLSAgICAgICAgLyoKLSAgICAgICAgICogU2ltdWxhdGUgYW4gRUlOVFIgaW4gY2FzZSBPcGVuU1NMIHdhbnRzIHRvIHJlYWQgbW9yZS4KLSAgICAgICAgICogKFRoaXMgaXMgdXN1YWxseSB0aGUgY2FzZSB3aGVuIHRoZSBjbGllbnQgZm9yY2VzIGFuIFNTTAotICAgICAgICAgKiByZW5lZ290YXRpb24gd2hpY2ggaXMgaGFuZGxlZCBpbXBsaWNpdGx5IGJ5IE9wZW5TU0wuKQotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHJjIDwgMCAmJiBTU0xfZ2V0X2Vycm9yKHNzbCwgcmMpID09IFNTTF9FUlJPUl9XQU5UX1JFQUQpCi0gICAgICAgICAgICBlcnJubyA9IEVJTlRSOwotICAgICAgICAvKgotICAgICAgICAgKiBMb2cgU1NMIGVycm9ycwotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHJjIDwgMCAmJiBTU0xfZ2V0X2Vycm9yKHNzbCwgcmMpID09IFNTTF9FUlJPUl9TU0wpIHsKLSAgICAgICAgICAgIGMgPSAoY29ubl9yZWMgKilTU0xfZ2V0X2FwcF9kYXRhKHNzbCk7Ci0gICAgICAgICAgICBzc2xfbG9nKGMtPnNlcnZlciwgU1NMX0xPR19FUlJPUnxTU0xfQUREX1NTTEVSUiwKLSAgICAgICAgICAgICAgICAgICAgIlNTTCBlcnJvciBvbiByZWFkaW5nIGRhdGEiKTsKLSAgICAgICAgfQotICAgICAgICAvKgotICAgICAgICAgKiByZWFkKDIpIHJldHVybnMgb25seSB0aGUgZ2VuZXJpYyBlcnJvciBudW1iZXIgLTEKLSAgICAgICAgICovCi0gICAgICAgIGlmIChyYyA8IDApCi0gICAgICAgICAgICByYyA9IC0xOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJjID0gcmVhZChmYi0+ZmRfaW4sIGJ1ZiwgbGVuKTsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgc3NsX2lvX2hvb2tfd3JpdGUoQlVGRiAqZmIsIGNoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLSAgICBTU0wgKnNzbDsKLSAgICBjb25uX3JlYyAqYzsKLSAgICBpbnQgcmM7Ci0KLSAgICBpZiAoKHNzbCA9IGFwX2N0eF9nZXQoZmItPmN0eCwgInNzbCIpKSAhPSBOVUxMKSB7Ci0gICAgICAgIHJjID0gU1NMX3dyaXRlKHNzbCwgYnVmLCBsZW4pOwotICAgICAgICAvKgotICAgICAgICAgKiBTaW11bGF0ZSBhbiBFSU5UUiBpbiBjYXNlIE9wZW5TU0wgd2FudHMgdG8gd3JpdGUgbW9yZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChyYyA8IDAgJiYgU1NMX2dldF9lcnJvcihzc2wsIHJjKSA9PSBTU0xfRVJST1JfV0FOVF9XUklURSkKLSAgICAgICAgICAgIGVycm5vID0gRUlOVFI7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIExvZyBTU0wgZXJyb3JzCi0gICAgICAgICAqLwotICAgICAgICBpZiAocmMgPCAwICYmIFNTTF9nZXRfZXJyb3Ioc3NsLCByYykgPT0gU1NMX0VSUk9SX1NTTCkgewotICAgICAgICAgICAgYyA9IChjb25uX3JlYyAqKVNTTF9nZXRfYXBwX2RhdGEoc3NsKTsKLSAgICAgICAgICAgIHNzbF9sb2coYy0+c2VydmVyLCBTU0xfTE9HX0VSUk9SfFNTTF9BRERfU1NMRVJSLAotICAgICAgICAgICAgICAgICAgICAiU1NMIGVycm9yIG9uIHdyaXRpbmcgZGF0YSIpOwotICAgICAgICB9Ci0gICAgICAgIC8qCi0gICAgICAgICAqIHdyaXRlKDIpIHJldHVybnMgb25seSB0aGUgZ2VuZXJpYyBlcnJvciBudW1iZXIgLTEKLSAgICAgICAgICovCi0gICAgICAgIGlmIChyYyA8IDApCi0gICAgICAgICAgICByYyA9IC0xOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJjID0gd3JpdGUoZmItPmZkLCBidWYsIGxlbik7Ci0gICAgcmV0dXJuIHJjOwotfQotCi0jaWZuZGVmIE5PX1dSSVRFVgotLyogdGhlIHByb3RvdHlwZSBmb3Igb3VyIG93biBTU0xfd3JpdGV2KCkgKi8KLXN0YXRpYyBpbnQgU1NMX3dyaXRldihTU0wgKiwgY29uc3Qgc3RydWN0IGlvdmVjICosIGludCk7Ci0KLXN0YXRpYyBpbnQgc3NsX2lvX2hvb2tfd3JpdGV2KEJVRkYgKmZiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IGlvdmNudCkKLXsKLSAgICBTU0wgKnNzbDsKLSAgICBjb25uX3JlYyAqYzsKLSAgICBpbnQgcmM7Ci0KLSAgICBpZiAoKHNzbCA9IGFwX2N0eF9nZXQoZmItPmN0eCwgInNzbCIpKSAhPSBOVUxMKSB7Ci0gICAgICAgIHJjID0gU1NMX3dyaXRldihzc2wsIGlvdiwgaW92Y250KTsKLSAgICAgICAgLyoKLSAgICAgICAgICogU2ltdWxhdGUgYW4gRUlOVFIgaW4gY2FzZSBPcGVuU1NMIHdhbnRzIHRvIHdyaXRlIG1vcmUuCi0gICAgICAgICAqLwotICAgICAgICBpZiAocmMgPCAwICYmIFNTTF9nZXRfZXJyb3Ioc3NsLCByYykgPT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCi0gICAgICAgICAgICBlcnJubyA9IEVJTlRSOwotICAgICAgICAvKgotICAgICAgICAgKiBMb2cgU1NMIGVycm9ycwotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHJjIDwgMCAmJiBTU0xfZ2V0X2Vycm9yKHNzbCwgcmMpID09IFNTTF9FUlJPUl9TU0wpIHsKLSAgICAgICAgICAgIGMgPSAoY29ubl9yZWMgKilTU0xfZ2V0X2FwcF9kYXRhKHNzbCk7Ci0gICAgICAgICAgICBzc2xfbG9nKGMtPnNlcnZlciwgU1NMX0xPR19FUlJPUnxTU0xfQUREX1NTTEVSUiwKLSAgICAgICAgICAgICAgICAgICAgIlNTTCBlcnJvciBvbiB3cml0aW5nIGRhdGEiKTsKLSAgICAgICAgfQotICAgICAgICAvKgotICAgICAgICAgKiB3cml0ZXYoMikgcmV0dXJucyBvbmx5IHRoZSBnZW5lcmljIGVycm9yIG51bWJlciAtMQotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHJjIDwgMCkKLSAgICAgICAgICAgIHJjID0gLTE7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmMgPSB3cml0ZXYoZmItPmZkLCBpb3YsIGlvdmNudCk7Ci0gICAgcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZmRlZiBXSU4zMgotCi0vKiB0aGVzZSB0d28gZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBmcm9tIGJ1ZmYuYyB1bmRlciBXSU4zMiAqLwotQVBJX0VYUE9SVChpbnQpIHNlbmR3aXRodGltZW91dChpbnQgc29jaywgY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQgZmxhZ3MpOwotQVBJX0VYUE9SVChpbnQpIHJlY3Z3aXRodGltZW91dChpbnQgc29jaywgY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQgZmxhZ3MpOwotCi0vKiBhbmQgdGhlIHByb3RvdHlwZXMgZm9yIG91ciBTU0xfeHh4IHZhcmlhbnRzICovCi1zdGF0aWMgaW50IFNTTF9zZW5kd2l0aHRpbWVvdXQoQlVGRiAqZmIsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbik7Ci1zdGF0aWMgaW50IFNTTF9yZWN2d2l0aHRpbWVvdXQoQlVGRiAqZmIsIGNoYXIgKmJ1ZiwgaW50IGxlbik7Ci0KLXN0YXRpYyBpbnQgc3NsX2lvX2hvb2tfcmVjdndpdGh0aW1lb3V0KEJVRkYgKmZiLCBjaGFyICpidWYsIGludCBsZW4pCi17Ci0gICAgU1NMICpzc2w7Ci0gICAgaW50IHJjOwotCi0gICAgaWYgKChzc2wgPSBhcF9jdHhfZ2V0KGZiLT5jdHgsICJzc2wiKSkgIT0gTlVMTCkKLSAgICAgICAgcmMgPSBTU0xfcmVjdndpdGh0aW1lb3V0KGZiLCBidWYsIGxlbik7Ci0gICAgZWxzZQotICAgICAgICByYyA9IHJlY3Z3aXRodGltZW91dChmYi0+ZmQsIGJ1ZiwgbGVuLCAwKTsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgc3NsX2lvX2hvb2tfc2VuZHdpdGh0aW1lb3V0KEJVRkYgKmZiLCBjb25zdCBjaGFyICpidWYsIGludCBsZW4pCi17Ci0gICAgU1NMICpzc2w7Ci0gICAgaW50IHJjOwotCi0gICAgaWYgKChzc2wgPSBhcF9jdHhfZ2V0KGZiLT5jdHgsICJzc2wiKSkgIT0gTlVMTCkKLSAgICAgICAgcmMgPSBTU0xfc2VuZHdpdGh0aW1lb3V0KGZiLCBidWYsIGxlbik7Ci0gICAgZWxzZQotICAgICAgICByYyA9IHNlbmR3aXRodGltZW91dChmYi0+ZmQsIGJ1ZiwgbGVuLCAwKTsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLSNlbmRpZiAvKiBXSU4zMiAqLwotCi0vKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgU3BlY2lhbCBGdW5jdGlvbnMgZm9yIE9wZW5TU0wKLSoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKi8KLQotI2lmZGVmIFdJTjMyCi0KLXN0YXRpYyBpbnQgU1NMX3NlbmR3aXRodGltZW91dChCVUZGICpmYiwgY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuKQotewotICAgIGludCBpb3N0YXRlID0gMTsKLSAgICBmZF9zZXQgZmRzZXQ7Ci0gICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gICAgaW50IGVyciA9IFdTQUVXT1VMREJMT0NLOwotICAgIGludCBydjsKLSAgICBpbnQgcmV0cnk7Ci0gICAgaW50IHNvY2sgPSBmYi0+ZmQ7Ci0gICAgU1NMICpzc2w7Ci0KLSAgICBzc2wgPSBhcF9jdHhfZ2V0KGZiLT5jdHgsICJzc2wiKTsKLQotICAgIGlmICghKHR2LnR2X3NlYyA9IGFwX2NoZWNrX2FsYXJtKCkpKQotICAgICAgICByZXR1cm4gKFNTTF93cml0ZShzc2wsIChjaGFyKilidWYsIGxlbikpOwotCi0gICAgcnYgPSBpb2N0bHNvY2tldChzb2NrLCBGSU9OQklPLCAmaW9zdGF0ZSk7Ci0gICAgaW9zdGF0ZSA9IDA7Ci0gICAgaWYgKHJ2KSB7Ci0gICAgICAgIGVyciA9IFdTQUdldExhc3RFcnJvcigpOwotICAgICAgICBhcF9hc3NlcnQoMCk7Ci0gICAgfQotICAgIHJ2ID0gU1NMX3dyaXRlKHNzbCwgKGNoYXIqKWJ1ZiwgbGVuKTsKLSAgICBpZiAocnYgPD0gMCkgewotICAgICAgICBpZiAoQklPX3NvY2tfc2hvdWxkX3JldHJ5KHJ2KSkgewotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIHJldHJ5ID0gMDsKLSAgICAgICAgICAgICAgICBGRF9aRVJPKCZmZHNldCk7Ci0gICAgICAgICAgICAgICAgRkRfU0VUKCh1bnNpZ25lZCBpbnQpc29jaywgJmZkc2V0KTsKLSAgICAgICAgICAgICAgICB0di50dl91c2VjID0gMDsKLSAgICAgICAgICAgICAgICBydiA9IHNlbGVjdChGRF9TRVRTSVpFLCBOVUxMLCAmZmRzZXQsIE5VTEwsICZ0dik7Ci0gICAgICAgICAgICAgICAgaWYgKHJ2ID09IFNPQ0tFVF9FUlJPUikKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gV1NBR2V0TGFzdEVycm9yKCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocnYgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpb2N0bHNvY2tldChzb2NrLCBGSU9OQklPLCAmaW9zdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGFwX2NoZWNrX2FsYXJtKCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBXU0FTZXRMYXN0RXJyb3IoRUlOVFIpOyAvKiBTaW11bGF0ZSBhbiBhbGFybSgpICovCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFNPQ0tFVF9FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJ2ID0gU1NMX3dyaXRlKHNzbCwgKGNoYXIqKWJ1ZiwgbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEJJT19zb2NrX3Nob3VsZF9yZXRyeShydikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLEFQTE9HX0RFQlVHLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgY2xhaW1lZCB3ZSBjb3VsZCB3cml0ZSwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgaW4gZmFjdCB3ZSBjb3VsZG4ndC4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGEgYnVnIGluIFdpbmRvd3MuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXRyeSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbGVlcCgxMDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZShyZXRyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW9jdGxzb2NrZXQoc29jaywgRklPTkJJTywgJmlvc3RhdGUpOwotICAgIGlmIChydiA9PSBTT0NLRVRfRVJST1IpCi0gICAgICAgIFdTQVNldExhc3RFcnJvcihlcnIpOwotICAgIHJldHVybiAocnYpOwotfQotCi1zdGF0aWMgaW50IFNTTF9yZWN2d2l0aHRpbWVvdXQoQlVGRiAqZmIsIGNoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLSAgICBpbnQgaW9zdGF0ZSA9IDE7Ci0gICAgZmRfc2V0IGZkc2V0OwotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgIGludCBlcnIgPSBXU0FFV09VTERCTE9DSzsKLSAgICBpbnQgcnY7Ci0gICAgaW50IHNvY2sgPSBmYi0+ZmRfaW47Ci0gICAgU1NMICpzc2w7Ci0gICAgaW50IHJldHJ5OwotCi0gICAgc3NsID0gYXBfY3R4X2dldChmYi0+Y3R4LCAic3NsIik7Ci0KLSAgICBpZiAoISh0di50dl9zZWMgPSBhcF9jaGVja19hbGFybSgpKSkKLSAgICAgICAgcmV0dXJuIChTU0xfcmVhZChzc2wsIGJ1ZiwgbGVuKSk7Ci0KLSAgICBydiA9IGlvY3Rsc29ja2V0KHNvY2ssIEZJT05CSU8sICZpb3N0YXRlKTsKLSAgICBpb3N0YXRlID0gMDsKLSAgICBhcF9hc3NlcnQoIXJ2KTsKLSAgICBydiA9IFNTTF9yZWFkKHNzbCwgYnVmLCBsZW4pOwotICAgIGlmIChydiA8PSAwKSB7Ci0gICAgICAgIGlmIChCSU9fc29ja19zaG91bGRfcmV0cnkocnYpKSB7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgcmV0cnkgPSAwOwotICAgICAgICAgICAgICAgIEZEX1pFUk8oJmZkc2V0KTsKLSAgICAgICAgICAgICAgICBGRF9TRVQoKHVuc2lnbmVkIGludClzb2NrLCAmZmRzZXQpOwotICAgICAgICAgICAgICAgIHR2LnR2X3VzZWMgPSAwOwotICAgICAgICAgICAgICAgIHJ2ID0gc2VsZWN0KEZEX1NFVFNJWkUsICZmZHNldCwgTlVMTCwgTlVMTCwgJnR2KTsKLSAgICAgICAgICAgICAgICBpZiAocnYgPT0gU09DS0VUX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBXU0FHZXRMYXN0RXJyb3IoKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChydiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlvY3Rsc29ja2V0KHNvY2ssIEZJT05CSU8sICZpb3N0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgYXBfY2hlY2tfYWxhcm0oKTsKLSAgICAgICAgICAgICAgICAgICAgV1NBU2V0TGFzdEVycm9yKFdTQUVXT1VMREJMT0NLKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTT0NLRVRfRVJST1IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcnYgPSBTU0xfcmVhZChzc2wsIGJ1ZiwgbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJ2ID09IFNPQ0tFVF9FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJJT19zb2NrX3Nob3VsZF9yZXRyeShydikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfREVCVUcsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGNsYWltZWQgd2UgY291bGQgcmVhZCwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBpbiBmYWN0IHdlIGNvdWxkbid0LiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyBhIGJ1ZyBpbiBXaW5kb3dzLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyeSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIFNsZWVwKDEwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBXU0FHZXRMYXN0RXJyb3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gd2hpbGUocmV0cnkpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlvY3Rsc29ja2V0KHNvY2ssIEZJT05CSU8sICZpb3N0YXRlKTsKLSAgICBpZiAocnYgPT0gU09DS0VUX0VSUk9SKQotICAgICAgICBXU0FTZXRMYXN0RXJyb3IoZXJyKTsKLSAgICByZXR1cm4gKHJ2KTsKLX0KLQotI2VuZGlmIC8qV0lOMzIqLwotCi0vKgotICogVGhlcmUgaXMgbm8gU1NMX3dyaXRldigpIHByb3ZpZGVkIGJ5IE9wZW5TU0wuIFRoZSByZWFzb24gaXMgbWFpbmx5IGJlY2F1c2UKLSAqIE9wZW5TU0wgaGFzIHRvIGZyYWdtZW50IHRoZSBkYXRhIGl0c2VsZiBhZ2FpbiBmb3IgdGhlIFNTTCByZWNvcmQgbGF5ZXIsIHNvIGEKLSAqIHdyaXRldigpIGxpa2UgaW50ZXJmYWNlIG1ha2VzIG5vdCBtdWNoIHNlbnNlLiAgV2hhdCB3ZSBkbyBpcyB0byBlbXVsYXRlIGl0Ci0gKiB0byBhdCBsZWFzdCBiZWluZyBhYmxlIHRvIHVzZSB0aGUgd3JpdGUoKSBsaWtlIGludGVyZmFjZS4gQnV0IGtlZXAgaW4gbWluZAotICogdGhhdCB0aGUgbmV0d29yayBJL08gcGVyZm9ybWFuY2UgaXMgbm90IHdyaXRlKCkgbGlrZSwgb2YgY291cnNlLgotICovCi0jaWZuZGVmIE5PX1dSSVRFVgotc3RhdGljIGludCBTU0xfd3JpdGV2KFNTTCAqc3NsLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IGlvdmNudCkKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgbjsKLSAgICBpbnQgcmM7Ci0KLSAgICByYyA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IGlvdmNudDsgaSsrKSB7Ci0gICAgICAgIGlmICgobiA9IFNTTF93cml0ZShzc2wsIGlvdltpXS5pb3ZfYmFzZSwgaW92W2ldLmlvdl9sZW4pKSA9PSAtMSkgewotICAgICAgICAgICAgcmMgPSAtMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJjICs9IG47Ci0gICAgfQotICAgIHJldHVybiByYzsKLX0KLSNlbmRpZgotCi0vKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgSS9PIERhdGEgRGVidWdnaW5nCi0qKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSovCi0KLSNkZWZpbmUgRFVNUF9XSURUSCAxNgotCi1zdGF0aWMgdm9pZCBzc2xfaW9fZGF0YV9kdW1wKHNlcnZlcl9yZWMgKnNydnIsIGNvbnN0IGNoYXIgKnMsIGxvbmcgbGVuKQotewotICAgIGNoYXIgYnVmWzI1Nl07Ci0gICAgY2hhciB0bXBbNjRdOwotICAgIGludCBpLCBqLCByb3dzLCB0cnVuYzsKLSAgICB1bnNpZ25lZCBjaGFyIGNoOwotCi0gICAgdHJ1bmMgPSAwOwotICAgIGZvcig7IChsZW4gPiAwKSAmJiAoKHNbbGVuLTFdID09ICcgJykgfHwgKHNbbGVuLTFdID09ICdcMCcpKTsgbGVuLS0pCi0gICAgICAgIHRydW5jKys7Ci0gICAgcm93cyA9IChsZW4gLyBEVU1QX1dJRFRIKTsKLSAgICBpZiAoKHJvd3MgKiBEVU1QX1dJRFRIKSA8IGxlbikKLSAgICAgICAgcm93cysrOwotICAgIHNzbF9sb2coc3J2ciwgU1NMX0xPR19ERUJVR3xTU0xfTk9fVElNRVNUQU1QfFNTTF9OT19MRVZFTElELAotICAgICAgICAgICAgIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyIpOwotICAgIGZvcihpID0gMCA7IGk8IHJvd3M7IGkrKykgewotICAgICAgICBhcF9zbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAifCAlMDR4OiAiLCBpICogRFVNUF9XSURUSCk7Ci0gICAgICAgIGFwX2NweXN0cm4oYnVmLCB0bXAsIHNpemVvZihidWYpKTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IERVTVBfV0lEVEg7IGorKykgewotICAgICAgICAgICAgaWYgKCgoaSAqIERVTVBfV0lEVEgpICsgaikgPj0gbGVuKQotICAgICAgICAgICAgICAgIGFwX2NweXN0cm4oYnVmK3N0cmxlbihidWYpLCAiICAgIiwgc2l6ZW9mKGJ1Ziktc3RybGVuKGJ1ZikpOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2ggPSAoKHVuc2lnbmVkIGNoYXIpKigoY2hhciAqKShzKSArIGkgKiBEVU1QX1dJRFRIICsgaikpICYgMHhmZjsKLSAgICAgICAgICAgICAgICBhcF9zbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiJTAyeCVjIiwgY2ggLCBqPT03ID8gJy0nIDogJyAnKTsKLSAgICAgICAgICAgICAgICBhcF9jcHlzdHJuKGJ1ZitzdHJsZW4oYnVmKSwgdG1wLCBzaXplb2YoYnVmKS1zdHJsZW4oYnVmKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXBfY3B5c3RybihidWYrc3RybGVuKGJ1ZiksICIgIiwgc2l6ZW9mKGJ1Ziktc3RybGVuKGJ1ZikpOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgRFVNUF9XSURUSDsgaisrKSB7Ci0gICAgICAgICAgICBpZiAoKChpICogRFVNUF9XSURUSCkgKyBqKSA+PSBsZW4pCi0gICAgICAgICAgICAgICAgYXBfY3B5c3RybihidWYrc3RybGVuKGJ1ZiksICIgIiwgc2l6ZW9mKGJ1Ziktc3RybGVuKGJ1ZikpOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2ggPSAoKHVuc2lnbmVkIGNoYXIpKigoY2hhciAqKShzKSArIGkgKiBEVU1QX1dJRFRIICsgaikpICYgMHhmZjsKLSAgICAgICAgICAgICAgICBhcF9zbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiJWMiLCAoKGNoID49ICcgJykgJiYgKGNoIDw9ICd+JykpID8gY2ggOiAnLicpOwotICAgICAgICAgICAgICAgIGFwX2NweXN0cm4oYnVmK3N0cmxlbihidWYpLCB0bXAsIHNpemVvZihidWYpLXN0cmxlbihidWYpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhcF9jcHlzdHJuKGJ1ZitzdHJsZW4oYnVmKSwgIiB8Iiwgc2l6ZW9mKGJ1Ziktc3RybGVuKGJ1ZikpOwotICAgICAgICBzc2xfbG9nKHNydnIsIFNTTF9MT0dfREVCVUd8U1NMX05PX1RJTUVTVEFNUHxTU0xfTk9fTEVWRUxJRCwgIiVzIiwgYnVmKTsKLSAgICB9Ci0gICAgaWYgKHRydW5jID4gMCkKLSAgICAgICAgc3NsX2xvZyhzcnZyLCBTU0xfTE9HX0RFQlVHfFNTTF9OT19USU1FU1RBTVB8U1NMX05PX0xFVkVMSUQsCi0gICAgICAgICAgICAgICAgInwgJTA0eCAtIDxTUEFDRVMvTlVMUz4iLCBsZW4gKyB0cnVuYyk7Ci0gICAgc3NsX2xvZyhzcnZyLCBTU0xfTE9HX0RFQlVHfFNTTF9OT19USU1FU1RBTVB8U1NMX05PX0xFVkVMSUQsCi0gICAgICAgICAgICAiKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIik7Ci0gICAgcmV0dXJuOwotfQotCi1sb25nIHNzbF9pb19kYXRhX2NiKEJJTyAqYmlvLCBpbnQgY21kLCBjb25zdCBjaGFyICphcmdwLCBpbnQgYXJnaSwgbG9uZyBhcmdsLCBsb25nIHJjKQotewotICAgIFNTTCAqc3NsOwotICAgIGNvbm5fcmVjICpjOwotICAgIHNlcnZlcl9yZWMgKnM7Ci0KLSAgICBpZiAoKHNzbCA9IChTU0wgKilCSU9fZ2V0X2NhbGxiYWNrX2FyZyhiaW8pKSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gcmM7Ci0gICAgaWYgKChjID0gKGNvbm5fcmVjICopU1NMX2dldF9hcHBfZGF0YShzc2wpKSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gcmM7Ci0gICAgcyA9IGMtPnNlcnZlcjsKLQotICAgIGlmICggICBjbWQgPT0gKEJJT19DQl9XUklURXxCSU9fQ0JfUkVUVVJOKQotICAgICAgICB8fCBjbWQgPT0gKEJJT19DQl9SRUFEIHxCSU9fQ0JfUkVUVVJOKSApIHsKLSAgICAgICAgaWYgKHJjID49IDApIHsKLSAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19ERUJVRywKLSAgICAgICAgICAgICAgICAgICAgIiVzOiAlcyAlbGQvJWQgYnl0ZXMgJXMgQklPIyUwOFggW21lbTogJTA4bFhdICVzIiwKLSAgICAgICAgICAgICAgICAgICAgU1NMX0xJQlJBUllfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgKGNtZCA9PSAoQklPX0NCX1dSSVRFfEJJT19DQl9SRVRVUk4pID8gIndyaXRlIiA6ICJyZWFkIiksCi0gICAgICAgICAgICAgICAgICAgIHJjLCBhcmdpLCAoY21kID09IChCSU9fQ0JfV1JJVEV8QklPX0NCX1JFVFVSTikgPyAidG8iIDogImZyb20iKSwKLSAgICAgICAgICAgICAgICAgICAgYmlvLCBhcmdwLAotICAgICAgICAgICAgICAgICAgICAoYXJncCAhPSBOVUxMID8gIihCSU8gZHVtcCBmb2xsb3dzKSIgOiAiKE9wcywgbm8gbWVtb3J5IGJ1ZmZlcj8pIikpOwotICAgICAgICAgICAgaWYgKGFyZ3AgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICBzc2xfaW9fZGF0YV9kdW1wKHMsIGFyZ3AsIHJjKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19ERUJVRywKLSAgICAgICAgICAgICAgICAgICAgIiVzOiBJL08gZXJyb3IsICVkIGJ5dGVzIGV4cGVjdGVkIHRvICVzIG9uIEJJTyMlMDhYIFttZW06ICUwOGxYXSIsCi0gICAgICAgICAgICAgICAgICAgIFNTTF9MSUJSQVJZX05BTUUsIGFyZ2ksCi0gICAgICAgICAgICAgICAgICAgIChjbWQgPT0gKEJJT19DQl9XUklURXxCSU9fQ0JfUkVUVVJOKSA/ICJ3cml0ZSIgOiAicmVhZCIpLAotICAgICAgICAgICAgICAgICAgICBiaW8sIGFyZ3ApOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByYzsKLX0KLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zc2wvc3NsX2VuZ2luZV9rZXJuZWwuYyBiL21vZHVsZXMvc3NsL3NzbF9lbmdpbmVfa2VybmVsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMWIzZjAuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9zc2wvc3NsX2VuZ2luZV9rZXJuZWwuYworKysgL2Rldi9udWxsCkBAIC0xLDE5MDUgKzAsMCBAQAotLyogICAgICAgICAgICAgICAgICAgICAgXyAgICAgICAgICAgICBfCi0qKiAgXyBfXyBfX18gICBfX18gICBfX3wgfCAgICBfX18gX19ffCB8ICBtb2Rfc3NsCi0qKiB8ICdfIGAgXyBcIC8gXyBcIC8gX2AgfCAgIC8gX18vIF9ffCB8ICBBcGFjaGUgSW50ZXJmYWNlIHRvIE9wZW5TU0wKLSoqIHwgfCB8IHwgfCB8IChfKSB8IChffCB8ICAgXF9fIFxfXyBcIHwgIHd3dy5tb2Rzc2wub3JnCi0qKiB8X3wgfF98IHxffFxfX18vIFxfXyxffF9fX3xfX18vX19fL198ICBmdHAubW9kc3NsLm9yZwotKiogICAgICAgICAgICAgICAgICAgICAgfF9fX19ffAotKiogIHNzbF9lbmdpbmVfa2VybmVsLmMKLSoqICBUaGUgU1NMIGVuZ2luZSBrZXJuZWwKLSovCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBSYWxmIFMuIEVuZ2Vsc2NoYWxsLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICogICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotICogICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+IGZvciB1c2UgaW4gdGhlCi0gKiAgICAgbW9kX3NzbCBwcm9qZWN0IChodHRwOi8vd3d3Lm1vZHNzbC5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJtb2Rfc3NsIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICogICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgcnNlQGVuZ2Vsc2NoYWxsLmNvbS4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAibW9kX3NzbCIKLSAqICAgIG5vciBtYXkgIm1vZF9zc2wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yCi0gKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgUmFsZiBTLiBFbmdlbHNjaGFsbC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci0gKiAgICAgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGVuZ2Vsc2NoYWxsLmNvbT4gZm9yIHVzZSBpbiB0aGUKLSAqICAgICBtb2Rfc3NsIHByb2plY3QgKGh0dHA6Ly93d3cubW9kc3NsLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFJBTEYgUy4gRU5HRUxTQ0hBTEwgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFJBTEYgUy4gRU5HRUxTQ0hBTEwgT1IKLSAqIEhJUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgQmVuIExhdXJpZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQmVuIExhdXJpZQotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlLVNTTCBIVFRQIHNlcnZlciBwcm9qZWN0LiIKLSAqCi0gKiA0LiBUaGUgbmFtZSAiQXBhY2hlLVNTTCBTZXJ2ZXIiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogNS4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBCZW4gTGF1cmllCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUtU1NMIEhUVFAgc2VydmVyIHByb2plY3QuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQkVOIExBVVJJRSBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQkVOIExBVVJJRSBPUgotICogSElTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGBgSXQgdG9vayBtZSBmaWZ0ZWVuIHllYXJzIHRvIGRpc2NvdmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSBoYWQgbm8gdGFsZW50IGZvciBwcm9ncmFtbWluZywgYnV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSBjb3VsZG4ndCBnaXZlIGl0IHVwIGJlY2F1c2UgYnkgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgSSB3YXMgdG9vIGZhbW91cy4nJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBVbmtub3duICAgICAgICAgICAgICAgICovCi0jaW5jbHVkZSAibW9kX3NzbC5oIgotCi0KLS8qICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICBTU0wgRW5naW5lIEtlcm5lbAotKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qLwotCi0vKgotICogIENvbm5lY3QgSGFuZGxlcjoKLSAqICBDb25uZWN0IFNTTCB0byB0aGUgYWNjZXB0ZWQgc29ja2V0Ci0gKgotICogIFVzdWFsbHkgd2Ugd291bGQgbmVlZCBhbiBBcGFjaGUgQVBJIGhvb2sgd2hpY2ggaXMgdHJpZ2dlcmVkIHJpZ2h0IGFmdGVyCi0gKiAgdGhlIHNvY2tldCBpcyBhY2NlcHRlZCBmb3IgaGFuZGxpbmcgYSBuZXcgcmVxdWVzdC4gQnV0IEFwYWNoZSAxLjMgZG9lc24ndAotICogIHByb3ZpZGUgc3VjaCBhIGhvb2ssIHNvIHdlIGhhdmUgdG8gcGF0Y2ggaHR0cF9tYWluLmMgYW5kIGNhbGwgdGhpcwotICogIGZ1bmN0aW9uIGRpcmVjdGx5LgotICovCi12b2lkIHNzbF9ob29rX05ld0Nvbm5lY3Rpb24oY29ubl9yZWMgKmNvbm4pCi17Ci0gICAgc2VydmVyX3JlYyAqc3J2cjsKLSAgICBCVUZGICpmYjsKLSAgICBTU0xTcnZDb25maWdSZWMgKnNjOwotICAgIGFwX2N0eCAqYXBjdHg7Ci0gICAgU1NMICpzc2w7Ci0gICAgY2hhciAqY3A7Ci0gICAgY2hhciAqY3BWSG9zdElEOwotICAgIGNoYXIgKmNwVkhvc3RNRDU7Ci0gICAgWDUwOSAqeHM7Ci0gICAgaW50IHJjOwotCi0gICAgLyoKLSAgICAgKiBHZXQgY29udGV4dAotICAgICAqLwotICAgIHNydnIgPSBjb25uLT5zZXJ2ZXI7Ci0gICAgZmIgICA9IGNvbm4tPmNsaWVudDsKLSAgICBzYyAgID0gbXlTcnZDb25maWcoc3J2cik7Ci0KLSAgICAvKgotICAgICAqIENyZWF0ZSBTU0wgY29udGV4dAotICAgICAqLwotICAgIGFwX2N0eF9zZXQoZmItPmN0eCwgInNzbCIsIE5VTEwpOwotCi0gICAgLyoKLSAgICAgKiBJbW1lZGlhdGVseSBzdG9wIHByb2Nlc3NpbmcgaWYgU1NMCi0gICAgICogaXMgZGlzYWJsZWQgZm9yIHRoaXMgY29ubmVjdGlvbgotICAgICAqLwotICAgIGlmIChzYyA9PSBOVUxMIHx8ICFzYy0+YkVuYWJsZWQpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8qCi0gICAgICogUmVtZW1iZXIgdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gZm9yCi0gICAgICogbGF0ZXIgYWNjZXNzIGluc2lkZSBjYWxsYmFjayBmdW5jdGlvbnMKLSAgICAgKi8KLSAgICBjcFZIb3N0SUQgPSBzc2xfdXRpbF92aG9zdGlkKGNvbm4tPnBvb2wsIHNydnIpOwotICAgIHNzbF9sb2coc3J2ciwgU1NMX0xPR19JTkZPLCAiQ29ubmVjdGlvbiB0byBjaGlsZCAlZCBlc3RhYmxpc2hlZCAiCi0gICAgICAgICAgICAiKHNlcnZlciAlcywgY2xpZW50ICVzKSIsIGNvbm4tPmNoaWxkX251bSwgY3BWSG9zdElELCAKLSAgICAgICAgICAgIGNvbm4tPnJlbW90ZV9pcCAhPSBOVUxMID8gY29ubi0+cmVtb3RlX2lwIDogInVua25vd24iKTsKLQotICAgIC8qCi0gICAgICogU2VlZCB0aGUgUHNldWRvIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIChQUk5HKQotICAgICAqLwotICAgIHNzbF9yYW5kX3NlZWQoc3J2ciwgY29ubi0+cG9vbCwgU1NMX1JTQ1RYX0NPTk5FQ1QsICIiKTsKLQotICAgIC8qCi0gICAgICogQ3JlYXRlIGEgbmV3IFNTTCBjb25uZWN0aW9uIHdpdGggdGhlIGNvbmZpZ3VyZWQgc2VydmVyIFNTTCBjb250ZXh0IGFuZAotICAgICAqIGF0dGFjaCB0aGlzIHRvIHRoZSBzb2NrZXQuIEFkZGl0aW9uYWxseSB3ZSByZWdpc3RlciB0aGlzIGF0dGFjaG1lbnQKLSAgICAgKiBzbyB3ZSBjYW4gZGV0YWNoIGxhdGVyLgotICAgICAqLwotICAgIGlmICgoc3NsID0gU1NMX25ldyhzYy0+cFNTTEN0eCkpID09IE5VTEwpIHsKLSAgICAgICAgc3NsX2xvZyhjb25uLT5zZXJ2ZXIsIFNTTF9MT0dfRVJST1J8U1NMX0FERF9TU0xFUlIsCi0gICAgICAgICAgICAgICAgIlVuYWJsZSB0byBjcmVhdGUgYSBuZXcgU1NMIGNvbm5lY3Rpb24gZnJvbSB0aGUgU1NMIGNvbnRleHQiKTsKLSAgICAgICAgYXBfY3R4X3NldChmYi0+Y3R4LCAic3NsIiwgTlVMTCk7Ci0gICAgICAgIGFwX2JzZXRmbGFnKGZiLCBCX0VPRnxCX0VPVVQsIDEpOwotICAgICAgICBjb25uLT5hYm9ydGVkID0gMTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBTU0xfY2xlYXIoc3NsKTsKLSAgICBjcFZIb3N0TUQ1ID0gYXBfbWQ1KGNvbm4tPnBvb2wsICh1bnNpZ25lZCBjaGFyICopY3BWSG9zdElEKTsKLSAgICBpZiAoIVNTTF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0KHNzbCwgKHVuc2lnbmVkIGNoYXIgKiljcFZIb3N0TUQ1LCBzdHJsZW4oY3BWSG9zdE1ENSkpKSB7Ci0gICAgICAgIHNzbF9sb2coY29ubi0+c2VydmVyLCBTU0xfTE9HX0VSUk9SfFNTTF9BRERfU1NMRVJSLAotICAgICAgICAgICAgICAgICJVbmFibGUgdG8gc2V0IHNlc3Npb24gaWQgY29udGV4dCB0byBgJXMnIiwgY3BWSG9zdE1ENSk7Ci0gICAgICAgIGFwX2N0eF9zZXQoZmItPmN0eCwgInNzbCIsIE5VTEwpOwotICAgICAgICBhcF9ic2V0ZmxhZyhmYiwgQl9FT0Z8Ql9FT1VULCAxKTsKLSAgICAgICAgY29ubi0+YWJvcnRlZCA9IDE7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgU1NMX3NldF9hcHBfZGF0YShzc2wsIGNvbm4pOwotICAgIGFwY3R4ID0gYXBfY3R4X25ldyhjb25uLT5wb29sKTsKLSAgICBhcF9jdHhfc2V0KGFwY3R4LCAic3NsOjpyZXF1ZXN0X3JlYyIsIE5VTEwpOwotICAgIGFwX2N0eF9zZXQoYXBjdHgsICJzc2w6OnZlcmlmeTo6ZGVwdGgiLCBBUF9DVFhfTlVNMlBUUigwKSk7Ci0gICAgU1NMX3NldF9hcHBfZGF0YTIoc3NsLCBhcGN0eCk7Ci0gICAgU1NMX3NldF9mZChzc2wsIGZiLT5mZCk7Ci0gICAgYXBfY3R4X3NldChmYi0+Y3R4LCAic3NsIiwgc3NsKTsKLQotICAgIC8qCi0gICAgICogIENvbmZpZ3VyZSBjYWxsYmFja3MgZm9yIFNTTCBjb25uZWN0aW9uCi0gICAgICovCi0gICAgU1NMX3NldF90bXBfcnNhX2NhbGxiYWNrKHNzbCwgc3NsX2NhbGxiYWNrX1RtcFJTQSk7Ci0gICAgU1NMX3NldF90bXBfZGhfY2FsbGJhY2soc3NsLCAgc3NsX2NhbGxiYWNrX1RtcERIKTsKLSAgICBpZiAoc2MtPm5Mb2dMZXZlbCA+PSBTU0xfTE9HX0RFQlVHKSB7Ci0gICAgICAgIEJJT19zZXRfY2FsbGJhY2soU1NMX2dldF9yYmlvKHNzbCksIHNzbF9pb19kYXRhX2NiKTsKLSAgICAgICAgQklPX3NldF9jYWxsYmFja19hcmcoU1NMX2dldF9yYmlvKHNzbCksIHNzbCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBQcmVkZWZpbmUgc29tZSBjbGllbnQgdmVyaWZpY2F0aW9uIHJlc3VsdHMKLSAgICAgKi8KLSAgICBhcF9jdHhfc2V0KGZiLT5jdHgsICJzc2w6OmNsaWVudDo6ZG4iLCBOVUxMKTsKLSAgICBhcF9jdHhfc2V0KGZiLT5jdHgsICJzc2w6OnZlcmlmeTo6ZXJyb3IiLCBOVUxMKTsKLSAgICBhcF9jdHhfc2V0KGZiLT5jdHgsICJzc2w6OnZlcmlmeTo6aW5mbyIsIE5VTEwpOwotICAgIFNTTF9zZXRfdmVyaWZ5X3Jlc3VsdChzc2wsIFg1MDlfVl9PSyk7Ci0KLSAgICAvKgotICAgICAqIFdlIGhhdmUgdG8gbWFuYWdlIGEgSS9PIHRpbWVvdXQgb3Vyc2VsZiwgYmVjYXVzZSBBcGFjaGUKLSAgICAgKiBkb2VzIGl0IHRoZSBmaXJzdCB0aW1lIHdoZW4gcmVhZGluZyB0aGUgcmVxdWVzdCwgYnV0IHdlJ3JlCi0gICAgICogd29ya2luZyBzb21lIHRpbWUgYmVmb3JlIHRoaXMgaGFwcGVucy4KLSAgICAgKi8KLSAgICBhcF9jdHhfc2V0KGFwX2dsb2JhbF9jdHgsICJzc2w6OmhhbmRzaGFrZTo6dGltZW91dCIsICh2b2lkICopRkFMU0UpOwotICAgIGFwX3NldF9jYWxsYmFja19hbmRfYWxhcm0oc3NsX2hvb2tfVGltZW91dENvbm5lY3Rpb24sIHNydnItPnRpbWVvdXQpOwotCi0gICAgLyoKLSAgICAgKiBOb3cgZW50ZXIgdGhlIFNTTCBIYW5kc2hha2UgUGhhc2UKLSAgICAgKi8KLSAgICB3aGlsZSAoIVNTTF9pc19pbml0X2ZpbmlzaGVkKHNzbCkpIHsKLQotICAgICAgICBpZiAoKHJjID0gU1NMX2FjY2VwdChzc2wpKSA8PSAwKSB7Ci0KLSAgICAgICAgICAgIGlmIChTU0xfZ2V0X2Vycm9yKHNzbCwgcmMpID09IFNTTF9FUlJPUl9aRVJPX1JFVFVSTikgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogVGhlIGNhc2Ugd2hlcmUgdGhlIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCBiZWZvcmUgYW55IGRhdGEKLSAgICAgICAgICAgICAgICAgKiB3YXMgdHJhbnNmZXJyZWQuIFRoYXQncyBub3QgYSByZWFsIGVycm9yIGFuZCBjYW4gb2NjdXIKLSAgICAgICAgICAgICAgICAgKiBzcG9yYWRpY2FsbHkgd2l0aCBzb21lIGNsaWVudHMuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgc3NsX2xvZyhzcnZyLCBTU0xfTE9HX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAiU1NMIGhhbmRzaGFrZSBzdG9wcGVkOiBjb25uZWN0aW9uIHdhcyBjbG9zZWQiKTsKLSAgICAgICAgICAgICAgICBTU0xfc2V0X3NodXRkb3duKHNzbCwgU1NMX1JFQ0VJVkVEX1NIVVRET1dOKTsKLSAgICAgICAgICAgICAgICBTU0xfc21hcnRfc2h1dGRvd24oc3NsKTsKLSAgICAgICAgICAgICAgICBTU0xfZnJlZShzc2wpOwotICAgICAgICAgICAgICAgIGFwX2N0eF9zZXQoZmItPmN0eCwgInNzbCIsIE5VTEwpOwotICAgICAgICAgICAgICAgIGFwX2JzZXRmbGFnKGZiLCBCX0VPRnxCX0VPVVQsIDEpOwotICAgICAgICAgICAgICAgIGNvbm4tPmFib3J0ZWQgPSAxOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKEVSUl9HRVRfUkVBU09OKEVSUl9wZWVrX2Vycm9yKCkpID09IFNTTF9SX0hUVFBfUkVRVUVTVCkgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogVGhlIGNhc2Ugd2hlcmUgT3BlblNTTCBoYXMgcmVjb2duaXplZCBhIEhUVFAgcmVxdWVzdDoKLSAgICAgICAgICAgICAgICAgKiBUaGlzIG1lYW5zIHRoZSBjbGllbnQgc3BlYWtzIHBsYWluIEhUVFAgb24gb3VyIEhUVFBTCi0gICAgICAgICAgICAgICAgICogcG9ydC4gSG1tbW0uLi4gIEF0IGxlYXN0IGZvciB0aGlzIGVycm9yIHdlIGNhbiBiZSBtb3JlIGZyaWVuZGx5Ci0gICAgICAgICAgICAgICAgICogYW5kIHRyeSB0byBwcm92aWRlIGhpbSB3aXRoIGEgSFRNTCBlcnJvciBwYWdlLiBXZSBoYXZlIG9ubHkgb25lCi0gICAgICAgICAgICAgICAgICogcHJvYmxlbTogT3BlblNTTCBoYXMgYWxyZWFkeSByZWFkIHNvbWUgYnl0ZXMgZnJvbSB0aGUgSFRUUAotICAgICAgICAgICAgICAgICAqIHJlcXVlc3QuIFNvIHdlIGhhdmUgdG8gc2tpcCB0aGUgcmVxdWVzdCBsaW5lIG1hbnVhbGx5IGFuZAotICAgICAgICAgICAgICAgICAqIGluc3RlYWQgcHJvdmlkZSBhIGZha2VkIG9uZSBpbiBvcmRlciB0byBjb250aW51ZSB0aGUgaW50ZXJuYWwKLSAgICAgICAgICAgICAgICAgKiBBcGFjaGUgcHJvY2Vzc2luZy4KLSAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGNoYXIgY2FbMl07Ci0gICAgICAgICAgICAgICAgaW50IHJ2OwotCi0gICAgICAgICAgICAgICAgLyogbG9nIHRoZSBzaXR1YXRpb24gKi8KLSAgICAgICAgICAgICAgICBzc2xfbG9nKHNydnIsIFNTTF9MT0dfRVJST1J8U1NMX0FERF9TU0xFUlIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiU1NMIGhhbmRzaGFrZSBmYWlsZWQ6IEhUVFAgc3Bva2VuIG9uIEhUVFBTIHBvcnQ7ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0cnlpbmcgdG8gc2VuZCBIVE1MIGVycm9yIHBhZ2UiKTsKLQotICAgICAgICAgICAgICAgIC8qIGZpcnN0OiBza2lwIHRoZSByZW1haW5pbmcgYnl0ZXMgb2YgdGhlIHJlcXVlc3QgbGluZSAqLwotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAgICAgcnYgPSByZWFkKGZiLT5mZCwgY2EsIDEpOwotICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChydiA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAocnYgPiAwICYmIGNhWzBdICE9ICdcMDEyJyAvKkxGKi8pOwotCi0gICAgICAgICAgICAgICAgLyogc2Vjb25kOiBmYWtlIHRoZSByZXF1ZXN0IGxpbmUgKi8KLSAgICAgICAgICAgICAgICBmYi0+aW5iYXNlID0gYXBfcGFsbG9jKGZiLT5wb29sLCBmYi0+YnVmc2l6KTsKLSAgICAgICAgICAgICAgICBhcF9jcHlzdHJuKChjaGFyICopZmItPmluYmFzZSwgIkdFVCAvbW9kX3NzbDplcnJvcjpIVFRQLXJlcXVlc3QgSFRUUC8xLjBcclxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiLT5idWZzaXopOwotICAgICAgICAgICAgICAgIGZiLT5pbnB0ciA9IGZiLT5pbmJhc2U7Ci0gICAgICAgICAgICAgICAgZmItPmluY250ID0gc3RybGVuKChjaGFyICopZmItPmlucHRyKTsKLQotICAgICAgICAgICAgICAgIC8qIHRoaXJkOiBraWNrIGF3YXkgdGhlIFNTTCBzdHVmZiAqLwotICAgICAgICAgICAgICAgIFNTTF9zZXRfc2h1dGRvd24oc3NsLCBTU0xfU0VOVF9TSFVURE9XTnxTU0xfUkVDRUlWRURfU0hVVERPV04pOwotICAgICAgICAgICAgICAgIFNTTF9zbWFydF9zaHV0ZG93bihzc2wpOwotICAgICAgICAgICAgICAgIFNTTF9mcmVlKHNzbCk7Ci0gICAgICAgICAgICAgICAgYXBfY3R4X3NldChmYi0+Y3R4LCAic3NsIiwgTlVMTCk7Ci0KLSAgICAgICAgICAgICAgICAvKiBmaW5hbGx5OiBsZXQgQXBhY2hlIGdvIG9uIHdpdGggcHJvY2Vzc2luZyAqLwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGFwX2N0eF9nZXQoYXBfZ2xvYmFsX2N0eCwgInNzbDo6aGFuZHNoYWtlOjp0aW1lb3V0IikgPT0gKHZvaWQgKilUUlVFKSB7Ci0gICAgICAgICAgICAgICAgc3NsX2xvZyhzcnZyLCBTU0xfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgIlNTTCBoYW5kc2hha2UgdGltZWQgb3V0IChjbGllbnQgJXMsIHNlcnZlciAlcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgY29ubi0+cmVtb3RlX2lwICE9IE5VTEwgPyBjb25uLT5yZW1vdGVfaXAgOiAidW5rbm93biIsIGNwVkhvc3RJRCk7Ci0gICAgICAgICAgICAgICAgU1NMX3NldF9zaHV0ZG93bihzc2wsIFNTTF9SRUNFSVZFRF9TSFVURE9XTik7Ci0gICAgICAgICAgICAgICAgU1NMX3NtYXJ0X3NodXRkb3duKHNzbCk7Ci0gICAgICAgICAgICAgICAgU1NMX2ZyZWUoc3NsKTsKLSAgICAgICAgICAgICAgICBhcF9jdHhfc2V0KGZiLT5jdHgsICJzc2wiLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBhcF9ic2V0ZmxhZyhmYiwgQl9FT0Z8Ql9FT1VULCAxKTsKLSAgICAgICAgICAgICAgICBjb25uLT5hYm9ydGVkID0gMTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChTU0xfZ2V0X2Vycm9yKHNzbCwgcmMpID09IFNTTF9FUlJPUl9TWVNDQUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAoZXJybm8gPiAwKQotICAgICAgICAgICAgICAgICAgICBzc2xfbG9nKHNydnIsIFNTTF9MT0dfRVJST1J8U1NMX0FERF9TU0xFUlJ8U1NMX0FERF9FUlJOTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1NMIGhhbmRzaGFrZSBpbnRlcnJ1cHRlZCBieSBzeXN0ZW0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbSGludDogU3RvcCBidXR0b24gcHJlc3NlZCBpbiBicm93c2VyPyFdIik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzc2xfbG9nKHNydnIsIFNTTF9MT0dfSU5GT3xTU0xfQUREX1NTTEVSUnxTU0xfQUREX0VSUk5PLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTcHVyaW91cyBTU0wgaGFuZHNoYWtlIGludGVycnVwdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW0hpbnQ6IFVzdWFsbHkganVzdCBvbmUgb2YgdGhvc2UgT3BlblNTTCBjb25mdXNpb25zIT9dIik7Ci0gICAgICAgICAgICAgICAgU1NMX3NldF9zaHV0ZG93bihzc2wsIFNTTF9SRUNFSVZFRF9TSFVURE9XTik7Ci0gICAgICAgICAgICAgICAgU1NMX3NtYXJ0X3NodXRkb3duKHNzbCk7Ci0gICAgICAgICAgICAgICAgU1NMX2ZyZWUoc3NsKTsKLSAgICAgICAgICAgICAgICBhcF9jdHhfc2V0KGZiLT5jdHgsICJzc2wiLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBhcF9ic2V0ZmxhZyhmYiwgQl9FT0Z8Ql9FT1VULCAxKTsKLSAgICAgICAgICAgICAgICBjb25uLT5hYm9ydGVkID0gMTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIE9rLCBhbnl0aGluZyBlbHNlIGlzIGEgZmF0YWwgZXJyb3IKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBzc2xfbG9nKHNydnIsIFNTTF9MT0dfRVJST1J8U1NMX0FERF9TU0xFUlJ8U1NMX0FERF9FUlJOTywKLSAgICAgICAgICAgICAgICAgICAgICAgICJTU0wgaGFuZHNoYWtlIGZhaWxlZCAoc2VydmVyICVzLCBjbGllbnQgJXMpIiwgY3BWSG9zdElELCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4tPnJlbW90ZV9pcCAhPSBOVUxMID8gY29ubi0+cmVtb3RlX2lwIDogInVua25vd24iKTsKLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogdHJ5IHRvIGdyYWNlZnVsbHkgc2h1dGRvd24gdGhlIGNvbm5lY3Rpb246Ci0gICAgICAgICAgICAgICAgICogLSBzZW5kIGFuIG93biBzaHV0ZG93biBtZXNzYWdlIChiZSBncmFjZWZ1bGx5KQotICAgICAgICAgICAgICAgICAqIC0gZG9uJ3Qgd2FpdCBmb3IgcGVlcidzIHNodXRkb3duIG1lc3NhZ2UgKGRlYWRsb29wKQotICAgICAgICAgICAgICAgICAqIC0ga2ljayBhd2F5IHRoZSBTU0wgc3R1ZmYgaW1tZWRpYXRlbHkKLSAgICAgICAgICAgICAgICAgKiAtIGJsb2NrIHRoZSBzb2NrZXQsIHNvIEFwYWNoZSBjYW5ub3Qgb3BlcmF0ZSBhbnkgbW9yZQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFNTTF9zZXRfc2h1dGRvd24oc3NsLCBTU0xfUkVDRUlWRURfU0hVVERPV04pOwotICAgICAgICAgICAgICAgIFNTTF9zbWFydF9zaHV0ZG93bihzc2wpOwotICAgICAgICAgICAgICAgIFNTTF9mcmVlKHNzbCk7Ci0gICAgICAgICAgICAgICAgYXBfY3R4X3NldChmYi0+Y3R4LCAic3NsIiwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgYXBfYnNldGZsYWcoZmIsIEJfRU9GfEJfRU9VVCwgMSk7Ci0gICAgICAgICAgICAgICAgY29ubi0+YWJvcnRlZCA9IDE7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ2hlY2sgZm9yIGZhaWxlZCBjbGllbnQgYXV0aGVudGljYXRpb24KLSAgICAgICAgICovCi0gICAgICAgIGlmICggICBTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoc3NsKSAhPSBYNTA5X1ZfT0sKLSAgICAgICAgICAgIHx8IGFwX2N0eF9nZXQoZmItPmN0eCwgInNzbDo6dmVyaWZ5OjplcnJvciIpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGNwID0gKGNoYXIgKilhcF9jdHhfZ2V0KGZiLT5jdHgsICJzc2w6OnZlcmlmeTo6ZXJyb3IiKTsKLSAgICAgICAgICAgIHNzbF9sb2coc3J2ciwgU1NMX0xPR19FUlJPUnxTU0xfQUREX1NTTEVSUiwKLSAgICAgICAgICAgICAgICAgICAgIlNTTCBjbGllbnQgYXV0aGVudGljYXRpb24gZmFpbGVkOiAlcyIsIAotICAgICAgICAgICAgICAgICAgICBjcCAhPSBOVUxMID8gY3AgOiAidW5rbm93biByZWFzb24iKTsKLSAgICAgICAgICAgIFNTTF9zZXRfc2h1dGRvd24oc3NsLCBTU0xfUkVDRUlWRURfU0hVVERPV04pOwotICAgICAgICAgICAgU1NMX3NtYXJ0X3NodXRkb3duKHNzbCk7Ci0gICAgICAgICAgICBTU0xfZnJlZShzc2wpOwotICAgICAgICAgICAgYXBfY3R4X3NldChmYi0+Y3R4LCAic3NsIiwgTlVMTCk7Ci0gICAgICAgICAgICBhcF9ic2V0ZmxhZyhmYiwgQl9FT0Z8Ql9FT1VULCAxKTsKLSAgICAgICAgICAgIGNvbm4tPmFib3J0ZWQgPSAxOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogUmVtZW1iZXIgdGhlIHBlZXIgY2VydGlmaWNhdGUncyBETgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCh4cyA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShzc2wpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjcCA9IFg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X3N1YmplY3RfbmFtZSh4cyksIE5VTEwsIDApOwotICAgICAgICAgICAgYXBfY3R4X3NldChmYi0+Y3R4LCAic3NsOjpjbGllbnQ6OmRuIiwgYXBfcHN0cmR1cChjb25uLT5wb29sLCBjcCkpOwotICAgICAgICAgICAgZnJlZShjcCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBNYWtlIHJlYWxseSBzdXJlIHRoYXQgd2hlbiBhIHBlZXIgY2VydGlmaWNhdGUKLSAgICAgICAgICogaXMgcmVxdWlyZWQgd2UgcmVhbGx5IGdvdCBvbmUuLi4gKGJlIHBhcmFub2lkKQotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCAgIHNjLT5uVmVyaWZ5Q2xpZW50ID09IFNTTF9DVkVSSUZZX1JFUVVJUkUKLSAgICAgICAgICAgICYmIGFwX2N0eF9nZXQoZmItPmN0eCwgInNzbDo6Y2xpZW50OjpkbiIpID09IE5VTEwpIHsKLSAgICAgICAgICAgIHNzbF9sb2coc3J2ciwgU1NMX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgIk5vIGFjY2VwdGFibGUgcGVlciBjZXJ0aWZpY2F0ZSBhdmFpbGFibGUiKTsKLSAgICAgICAgICAgIFNTTF9zZXRfc2h1dGRvd24oc3NsLCBTU0xfUkVDRUlWRURfU0hVVERPV04pOwotICAgICAgICAgICAgU1NMX3NtYXJ0X3NodXRkb3duKHNzbCk7Ci0gICAgICAgICAgICBTU0xfZnJlZShzc2wpOwotICAgICAgICAgICAgYXBfY3R4X3NldChmYi0+Y3R4LCAic3NsIiwgTlVMTCk7Ci0gICAgICAgICAgICBhcF9ic2V0ZmxhZyhmYiwgQl9FT0Z8Ql9FT1VULCAxKTsKLSAgICAgICAgICAgIGNvbm4tPmFib3J0ZWQgPSAxOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZW1vdmUgdGhlIHRpbWVvdXQgaGFuZGxpbmcKLSAgICAgKi8KLSAgICBhcF9zZXRfY2FsbGJhY2tfYW5kX2FsYXJtKE5VTEwsIDApOwotICAgIGFwX2N0eF9zZXQoYXBfZ2xvYmFsX2N0eCwgInNzbDo6aGFuZHNoYWtlOjp0aW1lb3V0IiwgKHZvaWQgKilGQUxTRSk7Ci0KLSAgICAvKgotICAgICAqIEltcHJvdmUgSS9PIHRocm91Z2hwdXQgYnkgdXNpbmcKLSAgICAgKiBPcGVuU1NMJ3MgcmVhZC1haGVhZCBmdW5jdGlvbmFsaXR5Ci0gICAgICogKGRvbid0IHVzZWQgdW5kZXIgV2luMzIsIGJlY2F1c2UKLSAgICAgKiB0aGVyZSB3ZSB1c2Ugc2VsZWN0KCkpCi0gICAgICovCi0jaWZuZGVmIFdJTjMyCi0gICAgU1NMX3NldF9yZWFkX2FoZWFkKHNzbCwgVFJVRSk7Ci0jZW5kaWYKLQotI2lmZGVmIFNTTF9WRU5ET1IKLSAgICAvKiBBbGxvdyB2ZW5kb3JzIHRvIGRvIG1vcmUgdGhpbmdzIG9uIGNvbm5lY3Rpb24gdGltZS4uLiAqLwotICAgIGFwX2hvb2tfdXNlKCJhcDo6bW9kX3NzbDo6dmVuZG9yOjpuZXdfY29ubmVjdGlvbiIsCi0gICAgICAgICAgICAgICAgQVBfSE9PS19TSUcyKHZvaWQscHRyKSwgQVBfSE9PS19BTEwsIGNvbm4pOwotI2VuZGlmCi0KLSAgICByZXR1cm47Ci19Ci0KLS8qCi0gKiBTaWduYWwgaGFuZGxlciBmdW5jdGlvbiBmb3IgdGhlIFNTTCBoYW5kc2hha2UgcGhhc2UKLSAqLwotdm9pZCBzc2xfaG9va19UaW1lb3V0Q29ubmVjdGlvbihpbnQgc2lnKQotewotICAgIC8qIHdlIGp1c3Qgc2V0IGEgZmxhZyBmb3IgdGhlIGhhbmRzaGFrZSBwcm9jZXNzaW5nIGxvb3AgKi8KLSAgICBhcF9jdHhfc2V0KGFwX2dsb2JhbF9jdHgsICJzc2w6OmhhbmRzaGFrZTo6dGltZW91dCIsICh2b2lkICopVFJVRSk7Ci0gICAgcmV0dXJuOwotfQotCi0vKgotICogIENsb3NlIHRoZSBTU0wgcGFydCBvZiB0aGUgc29ja2V0IGNvbm5lY3Rpb24KLSAqICAoY2FsbGVkIGltbWVkaWF0ZWx5IF9iZWZvcmVfIHRoZSBzb2NrZXQgaXMgY2xvc2VkKQotICovCi12b2lkIHNzbF9ob29rX0Nsb3NlQ29ubmVjdGlvbihjb25uX3JlYyAqY29ubikKLXsKLSAgICBTU0wgKnNzbDsKLSAgICBjaGFyICpjcFR5cGU7Ci0KLSAgICBzc2wgPSBhcF9jdHhfZ2V0KGNvbm4tPmNsaWVudC0+Y3R4LCAic3NsIik7Ci0gICAgaWYgKHNzbCA9PSBOVUxMKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvKgotICAgICAqIEZpcnN0IG1ha2Ugc3VyZSB0aGF0IG5vIG1vcmUgZGF0YSBpcyBwZW5kaW5nIGluIEFwYWNoZSdzIEJVRkYsCi0gICAgICogYmVjYXVzZSB3aGVuIGl0J3MgKGltcGxpY2l0bHkpIGZsdXNoZWQgbGF0ZXIgYnkgdGhlIGFwX2JjbG9zZSgpCi0gICAgICogY2FsbHMgb2YgQXBhY2hlIGl0IHdvdWxkIGxlYWQgdG8gYW4gSS9PIGVycm9yIGluIHRoZSBicm93c2VyIGR1ZQotICAgICAqIHRvIHRoZSBmYWN0IHRoYXQgdGhlIFNTTCBsYXllciB3YXMgYWxyZWFkeSByZW1vdmVkIGJ5IHVzLgotICAgICAqLwotICAgIGFwX2JmbHVzaChjb25uLT5jbGllbnQpOwotCi0gICAgLyoKLSAgICAgKiBOb3cgY2xvc2UgdGhlIFNTTCBsYXllciBvZiB0aGUgY29ubmVjdGlvbi4gV2UndmUgdG8gdGFrZQotICAgICAqIHRoZSBUTFN2MSBzdGFuZGFyZCBpbnRvIGFjY291bnQgaGVyZToKLSAgICAgKgotICAgICAqIHwgNy4yLjEuIENsb3N1cmUgYWxlcnRzCi0gICAgICogfAotICAgICAqIHwgVGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlciBtdXN0IHNoYXJlIGtub3dsZWRnZSB0aGF0IHRoZSBjb25uZWN0aW9uIGlzCi0gICAgICogfCBlbmRpbmcgaW4gb3JkZXIgdG8gYXZvaWQgYSB0cnVuY2F0aW9uIGF0dGFjay4gRWl0aGVyIHBhcnR5IG1heQotICAgICAqIHwgaW5pdGlhdGUgdGhlIGV4Y2hhbmdlIG9mIGNsb3NpbmcgbWVzc2FnZXMuCi0gICAgICogfAotICAgICAqIHwgY2xvc2Vfbm90aWZ5Ci0gICAgICogfCAgICAgVGhpcyBtZXNzYWdlIG5vdGlmaWVzIHRoZSByZWNpcGllbnQgdGhhdCB0aGUgc2VuZGVyIHdpbGwgbm90IHNlbmQKLSAgICAgKiB8ICAgICBhbnkgbW9yZSBtZXNzYWdlcyBvbiB0aGlzIGNvbm5lY3Rpb24uIFRoZSBzZXNzaW9uIGJlY29tZXMKLSAgICAgKiB8ICAgICB1bnJlc3VtYWJsZSBpZiBhbnkgY29ubmVjdGlvbiBpcyB0ZXJtaW5hdGVkIHdpdGhvdXQgcHJvcGVyCi0gICAgICogfCAgICAgY2xvc2Vfbm90aWZ5IG1lc3NhZ2VzIHdpdGggbGV2ZWwgZXF1YWwgdG8gd2FybmluZy4KLSAgICAgKiB8Ci0gICAgICogfCBFaXRoZXIgcGFydHkgbWF5IGluaXRpYXRlIGEgY2xvc2UgYnkgc2VuZGluZyBhIGNsb3NlX25vdGlmeSBhbGVydC4KLSAgICAgKiB8IEFueSBkYXRhIHJlY2VpdmVkIGFmdGVyIGEgY2xvc3VyZSBhbGVydCBpcyBpZ25vcmVkLgotICAgICAqIHwKLSAgICAgKiB8IEVhY2ggcGFydHkgaXMgcmVxdWlyZWQgdG8gc2VuZCBhIGNsb3NlX25vdGlmeSBhbGVydCBiZWZvcmUgY2xvc2luZwotICAgICAqIHwgdGhlIHdyaXRlIHNpZGUgb2YgdGhlIGNvbm5lY3Rpb24uIEl0IGlzIHJlcXVpcmVkIHRoYXQgdGhlIG90aGVyIHBhcnR5Ci0gICAgICogfCByZXNwb25kIHdpdGggYSBjbG9zZV9ub3RpZnkgYWxlcnQgb2YgaXRzIG93biBhbmQgY2xvc2UgZG93biB0aGUKLSAgICAgKiB8IGNvbm5lY3Rpb24gaW1tZWRpYXRlbHksIGRpc2NhcmRpbmcgYW55IHBlbmRpbmcgd3JpdGVzLiBJdCBpcyBub3QKLSAgICAgKiB8IHJlcXVpcmVkIGZvciB0aGUgaW5pdGlhdG9yIG9mIHRoZSBjbG9zZSB0byB3YWl0IGZvciB0aGUgcmVzcG9uZGluZwotICAgICAqIHwgY2xvc2Vfbm90aWZ5IGFsZXJ0IGJlZm9yZSBjbG9zaW5nIHRoZSByZWFkIHNpZGUgb2YgdGhlIGNvbm5lY3Rpb24uCi0gICAgICoKLSAgICAgKiBUaGlzIG1lYW5zIHdlJ3ZlIHRvIHNlbmQgYSBjbG9zZSBub3RpZnkgbWVzc2FnZSwgYnV0IGhhdmVuJ3QgdG8gd2FpdAotICAgICAqIGZvciB0aGUgY2xvc2Ugbm90aWZ5IG9mIHRoZSBjbGllbnQuIEFjdHVhbGx5IHdlIGNhbm5vdCB3YWl0IGZvciB0aGUKLSAgICAgKiBjbG9zZSBub3RpZnkgb2YgdGhlIGNsaWVudCBiZWNhdXNlIHNvbWUgY2xpZW50cyAoaW5jbHVkaW5nIE5ldHNjYXBlCi0gICAgICogNC54KSBkb24ndCBzZW5kIG9uZSwgc28gd2Ugd291bGQgaGFuZy4KLSAgICAgKi8KLQotICAgIC8qCi0gICAgICogZXhjaGFuZ2UgY2xvc2Ugbm90aWZ5IG1lc3NhZ2VzLCBidXQgYWxsb3cgdGhlIHVzZXIKLSAgICAgKiB0byBmb3JjZSB0aGUgdHlwZSBvZiBoYW5kc2hha2UgdmlhIFNldEVudklmIGRpcmVjdGl2ZQotICAgICAqLwotICAgIGlmIChhcF9jdHhfZ2V0KGNvbm4tPmNsaWVudC0+Y3R4LCAic3NsOjpmbGFnOjp1bmNsZWFuLXNodXRkb3duIikgPT0gUFRSVUUpIHsKLSAgICAgICAgLyogcGVyZm9ybSBubyBjbG9zZSBub3RpZnkgaGFuZHNoYWtlIGF0IGFsbAotICAgICAgICAgICAodmlvbGF0ZXMgdGhlIFNTTC9UTFMgc3RhbmRhcmQhKSAqLwotICAgICAgICBTU0xfc2V0X3NodXRkb3duKHNzbCwgU1NMX1NFTlRfU0hVVERPV058U1NMX1JFQ0VJVkVEX1NIVVRET1dOKTsKLSAgICAgICAgY3BUeXBlID0gInVuY2xlYW4iOwotICAgIH0KLSAgICBlbHNlIGlmIChhcF9jdHhfZ2V0KGNvbm4tPmNsaWVudC0+Y3R4LCAic3NsOjpmbGFnOjphY2N1cmF0ZS1zaHV0ZG93biIpID09IFBUUlVFKSB7Ci0gICAgICAgIC8qIHNlbmQgY2xvc2Ugbm90aWZ5IGFuZCB3YWl0IGZvciBjbGllbnRzIGNsb3NlIG5vdGlmeQotICAgICAgICAgICAoc3RhbmRhcmQgY29tcGxpYW50LCBidXQgdXN1YWxseSBjYXVzZXMgY29ubmVjdGlvbiBoYW5ncykgKi8KLSAgICAgICAgU1NMX3NldF9zaHV0ZG93bihzc2wsIDApOwotICAgICAgICBjcFR5cGUgPSAiYWNjdXJhdGUiOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogc2VuZCBjbG9zZSBub3RpZnksIGJ1dCBkb24ndCB3YWl0IGZvciBjbGllbnRzIGNsb3NlIG5vdGlmeQotICAgICAgICAgICAoc3RhbmRhcmQgY29tcGxpYW50IGFuZCBzYWZlLCBzbyBpdCdzIHRoZSBERUZBVUxUISkgKi8KLSAgICAgICAgU1NMX3NldF9zaHV0ZG93bihzc2wsIFNTTF9SRUNFSVZFRF9TSFVURE9XTik7Ci0gICAgICAgIGNwVHlwZSA9ICJzdGFuZGFyZCI7Ci0gICAgfQotICAgIFNTTF9zbWFydF9zaHV0ZG93bihzc2wpOwotCi0gICAgLyogZGVhbGxvY2F0ZSB0aGUgU1NMIGNvbm5lY3Rpb24gKi8KLSAgICBTU0xfZnJlZShzc2wpOwotICAgIGFwX2N0eF9zZXQoY29ubi0+Y2xpZW50LT5jdHgsICJzc2wiLCBOVUxMKTsKLQotICAgIC8qIGFuZCBmaW5hbGx5IGxvZyB0aGUgZmFjdCB0aGF0IHdlJ3ZlIGNsb3NlZCB0aGUgY29ubmVjdGlvbiAqLwotICAgIHNzbF9sb2coY29ubi0+c2VydmVyLCBTU0xfTE9HX0lORk8sCi0gICAgICAgICAgICAiQ29ubmVjdGlvbiB0byBjaGlsZCAlZCBjbG9zZWQgd2l0aCAlcyBzaHV0ZG93biAoc2VydmVyICVzLCBjbGllbnQgJXMpIiwKLSAgICAgICAgICAgIGNvbm4tPmNoaWxkX251bSwgY3BUeXBlLCBzc2xfdXRpbF92aG9zdGlkKGNvbm4tPnBvb2wsIGNvbm4tPnNlcnZlciksCi0gICAgICAgICAgICBjb25uLT5yZW1vdGVfaXAgIT0gTlVMTCA/IGNvbm4tPnJlbW90ZV9pcCA6ICJ1bmtub3duIik7Ci0gICAgcmV0dXJuOwotfQotCi0vKgotICogIFBvc3QgUmVhZCBSZXF1ZXN0IEhhbmRsZXIKLSAqLwotaW50IHNzbF9ob29rX1JlYWRSZXEocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgU1NMICpzc2w7Ci0gICAgYXBfY3R4ICphcGN0eDsKLQotICAgIC8qCi0gICAgICogR2V0IHRoZSBTU0wgY29ubmVjdGlvbiBzdHJ1Y3R1cmUgYW5kIHBlcmZvcm0gdGhlCi0gICAgICogZGVsYXllZCBpbnRlcmxpbmtpbmcgZnJvbSBTU0wgYmFjayB0byByZXF1ZXN0X3JlYwotICAgICAqLwotICAgIHNzbCA9IGFwX2N0eF9nZXQoci0+Y29ubmVjdGlvbi0+Y2xpZW50LT5jdHgsICJzc2wiKTsKLSAgICBpZiAoc3NsICE9IE5VTEwpIHsKLSAgICAgICAgYXBjdHggPSBTU0xfZ2V0X2FwcF9kYXRhMihzc2wpOwotICAgICAgICBhcF9jdHhfc2V0KGFwY3R4LCAic3NsOjpyZXF1ZXN0X3JlYyIsIHIpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRm9yY2UgdGhlIG1vZF9zc2wgY29udGVudCBoYW5kbGVyIHdoZW4gVVJMIGluZGljYXRlcyB0aGlzCi0gICAgICovCi0gICAgaWYgKHN0ckVRbihyLT51cmksICIvbW9kX3NzbDoiLCA5KSkKLSAgICAgICAgci0+aGFuZGxlciA9ICJtb2Rfc3NsOmNvbnRlbnQtaGFuZGxlciI7Ci0gICAgaWYgKHNzbCAhPSBOVUxMKSB7Ci0gICAgICAgIGFwX2N0eF9zZXQoci0+Y3R4LCAiYXA6Omh0dHA6Om1ldGhvZCIsICAiaHR0cHMiKTsKLSAgICAgICAgYXBfY3R4X3NldChyLT5jdHgsICJhcDo6ZGVmYXVsdDo6cG9ydCIsICI0NDMiKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGFwX2N0eF9zZXQoci0+Y3R4LCAiYXA6Omh0dHA6Om1ldGhvZCIsICBOVUxMKTsKLSAgICAgICAgYXBfY3R4X3NldChyLT5jdHgsICJhcDo6ZGVmYXVsdDo6cG9ydCIsIE5VTEwpOwotICAgIH0KLSAgICByZXR1cm4gREVDTElORUQ7Ci19Ci0KLS8qCi0gKiAgVVJMIFRyYW5zbGF0aW9uIEhhbmRsZXIKLSAqLwotaW50IHNzbF9ob29rX1RyYW5zbGF0ZShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpZiAoYXBfY3R4X2dldChyLT5jb25uZWN0aW9uLT5jbGllbnQtPmN0eCwgInNzbCIpID09IE5VTEwpCi0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLQotICAgIC8qCi0gICAgICogTG9nIGluZm9ybWF0aW9uIGFib3V0IGluY29taW5nIEhUVFBTIHJlcXVlc3RzCi0gICAgICovCi0gICAgaWYgKGFwX2lzX2luaXRpYWxfcmVxKHIpKQotICAgICAgICBzc2xfbG9nKHItPnNlcnZlciwgU1NMX0xPR19JTkZPLAotICAgICAgICAgICAgICAgICIlcyBIVFRQUyByZXF1ZXN0IHJlY2VpdmVkIGZvciBjaGlsZCAlZCAoc2VydmVyICVzKSIsCi0gICAgICAgICAgICAgICAgci0+Y29ubmVjdGlvbi0+a2VlcGFsaXZlcyA8PSAwID8KLSAgICAgICAgICAgICAgICAgICAgIkluaXRpYWwgKE5vLjEpIiA6Ci0gICAgICAgICAgICAgICAgICAgIGFwX3BzcHJpbnRmKHItPnBvb2wsICJTdWJzZXF1ZW50IChOby4lZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5jb25uZWN0aW9uLT5rZWVwYWxpdmVzKzEpLAotICAgICAgICAgICAgICAgIHItPmNvbm5lY3Rpb24tPmNoaWxkX251bSwKLSAgICAgICAgICAgICAgICBzc2xfdXRpbF92aG9zdGlkKHItPnBvb2wsIHItPnNlcnZlcikpOwotCi0gICAgLyoKLSAgICAgKiBNb3ZlIFNldEVudklmIGluZm9ybWF0aW9uIGZyb20gcmVxdWVzdF9yZWMgdG8gY29ubl9yZWMvQlVGRgotICAgICAqIHRvIGFsbG93IHRoZSBjbG9zZSBjb25uZWN0aW9uIGhhbmRsZXIgdG8gdXNlIHRoZW0uCi0gICAgICovCi0gICAgaWYgKGFwX3RhYmxlX2dldChyLT5zdWJwcm9jZXNzX2VudiwgInNzbC11bmNsZWFuLXNodXRkb3duIikgIT0gTlVMTCkKLSAgICAgICAgYXBfY3R4X3NldChyLT5jb25uZWN0aW9uLT5jbGllbnQtPmN0eCwgInNzbDo6ZmxhZzo6dW5jbGVhbi1zaHV0ZG93biIsIFBUUlVFKTsKLSAgICBlbHNlCi0gICAgICAgIGFwX2N0eF9zZXQoci0+Y29ubmVjdGlvbi0+Y2xpZW50LT5jdHgsICJzc2w6OmZsYWc6OnVuY2xlYW4tc2h1dGRvd24iLCBQRkFMU0UpOwotICAgIGlmIChhcF90YWJsZV9nZXQoci0+c3VicHJvY2Vzc19lbnYsICJzc2wtYWNjdXJhdGUtc2h1dGRvd24iKSAhPSBOVUxMKQotICAgICAgICBhcF9jdHhfc2V0KHItPmNvbm5lY3Rpb24tPmNsaWVudC0+Y3R4LCAic3NsOjpmbGFnOjphY2N1cmF0ZS1zaHV0ZG93biIsIFBUUlVFKTsKLSAgICBlbHNlCi0gICAgICAgIGFwX2N0eF9zZXQoci0+Y29ubmVjdGlvbi0+Y2xpZW50LT5jdHgsICJzc2w6OmZsYWc6OmFjY3VyYXRlLXNodXRkb3duIiwgUEZBTFNFKTsKLQotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotLyoKLSAqICBDb250ZW50IEhhbmRsZXIKLSAqLwotaW50IHNzbF9ob29rX0hhbmRsZXIocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IHBvcnQ7Ci0gICAgY2hhciAqdGhpc3BvcnQ7Ci0gICAgY2hhciAqdGhpc3VybDsKLQotICAgIGlmIChzdHJORW4oci0+dXJpLCAiL21vZF9zc2w6IiwgOSkpCi0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLQotICAgIGlmIChzdHJFUShyLT51cmksICIvbW9kX3NzbDplcnJvcjpIVFRQLXJlcXVlc3QiKSkgewotICAgICAgICB0aGlzcG9ydCA9ICIiOwotICAgICAgICBwb3J0ID0gYXBfZ2V0X3NlcnZlcl9wb3J0KHIpOwotICAgICAgICBpZiAoIWFwX2lzX2RlZmF1bHRfcG9ydChwb3J0LCByKSkKLSAgICAgICAgICAgIHRoaXNwb3J0ID0gYXBfcHNwcmludGYoci0+cG9vbCwgIjoldSIsIHBvcnQpOwotICAgICAgICB0aGlzdXJsID0gYXBfcHNwcmludGYoci0+cG9vbCwgImh0dHBzOi8vJXMlcy8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfZ2V0X3NlcnZlcl9uYW1lKHIpLCB0aGlzcG9ydCk7Ci0KLSAgICAgICAgYXBfdGFibGVfc2V0bihyLT5ub3RlcywgImVycm9yLW5vdGVzIiwgYXBfcHNwcmludGYoci0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAiUmVhc29uOiBZb3UncmUgc3BlYWtpbmcgcGxhaW4gSFRUUCB0byBhbiBTU0wtZW5hYmxlZCBzZXJ2ZXIgcG9ydC48QlI+XG4iCi0gICAgICAgICAgICAgICAgICAgICAgIkluc3RlYWQgdXNlIHRoZSBIVFRQUyBzY2hlbWUgdG8gYWNjZXNzIHRoaXMgVVJMLCBwbGVhc2UuPEJSPlxuIgotICAgICAgICAgICAgICAgICAgICAgICI8QkxPQ0tRVU9URT5IaW50OiA8QSBIUkVGPVwiJXNcIj48Qj4lczwvQj48L0E+PC9CTE9DS1FVT1RFPiIsCi0gICAgICAgICAgICAgICAgICAgICAgdGhpc3VybCwgdGhpc3VybCkpOwotICAgIH0KLQotICAgIHJldHVybiBIVFRQX0JBRF9SRVFVRVNUOwotfQotCi0vKgotICogIEFjY2VzcyBIYW5kbGVyCi0gKi8KLWludCBzc2xfaG9va19BY2Nlc3MocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgU1NMRGlyQ29uZmlnUmVjICpkYzsKLSAgICBTU0xTcnZDb25maWdSZWMgKnNjOwotICAgIFNTTCAqc3NsOwotICAgIFNTTF9DVFggKmN0eCA9IE5VTEw7Ci0gICAgYXJyYXlfaGVhZGVyICphcFJlcXVpcmVtZW50OwotICAgIHNzbF9yZXF1aXJlX3QgKnBSZXF1aXJlbWVudHM7Ci0gICAgc3NsX3JlcXVpcmVfdCAqcFJlcXVpcmVtZW50OwotICAgIGNoYXIgKmNwOwotICAgIGludCBvazsKLSAgICBpbnQgaTsKLSAgICBCT09MIHJlbmVnb3RpYXRlOwotICAgIEJPT0wgcmVuZWdvdGlhdGVfcXVpY2s7Ci0jaWZkZWYgU1NMX0VYUEVSSU1FTlRBTF9QRVJESVJDQQotICAgIEJPT0wgcmVjb25maWd1cmVkX2xvY2F0aW9uczsKLSAgICBTVEFDS19PRihYNTA5X05BTUUpICpza0NBTGlzdDsKLSAgICBjaGFyICpjcENBUGF0aDsKLSAgICBjaGFyICpjcENBRmlsZTsKLSNlbmRpZgotICAgIFg1MDkgKmNlcnQ7Ci0gICAgU1RBQ0tfT0YoWDUwOSkgKmNlcnRzdGFjazsKLSAgICBYNTA5X1NUT1JFICpjZXJ0c3RvcmU7Ci0gICAgWDUwOV9TVE9SRV9DVFggY2VydHN0b3JlY3R4OwotICAgIGludCBkZXB0aDsKLSAgICBTVEFDS19PRihTU0xfQ0lQSEVSKSAqc2tDaXBoZXJPbGQ7Ci0gICAgU1RBQ0tfT0YoU1NMX0NJUEhFUikgKnNrQ2lwaGVyOwotICAgIFNTTF9DSVBIRVIgKnBDaXBoZXI7Ci0gICAgYXBfY3R4ICphcGN0eDsKLSAgICBpbnQgblZlcmlmeU9sZDsKLSAgICBpbnQgblZlcmlmeTsKLSAgICBpbnQgbjsKLSAgICB2b2lkICp2cDsKLSAgICBpbnQgcmM7Ci0KLSAgICBkYyAgPSBteURpckNvbmZpZyhyKTsKLSAgICBzYyAgPSBteVNydkNvbmZpZyhyLT5zZXJ2ZXIpOwotICAgIHNzbCA9IGFwX2N0eF9nZXQoci0+Y29ubmVjdGlvbi0+Y2xpZW50LT5jdHgsICJzc2wiKTsKLSAgICBpZiAoc3NsICE9IE5VTEwpCi0gICAgICAgIGN0eCA9IFNTTF9nZXRfU1NMX0NUWChzc2wpOwotCi0gICAgLyoKLSAgICAgKiBTdXBwb3J0IGZvciBTU0xSZXF1aXJlU1NMIGRpcmVjdGl2ZQotICAgICAqLwotICAgIGlmIChkYy0+YlNTTFJlcXVpcmVkICYmIHNzbCA9PSBOVUxMKSB7Ci0gICAgICAgIGFwX2xvZ19yZWFzb24oIlNTTCBjb25uZWN0aW9uIHJlcXVpcmVkIiwgci0+ZmlsZW5hbWUsIHIpOwotICAgICAgICAvKiByZW1lbWJlciBmb3JiaWRkZW4gYWNjZXNzIGZvciBzdHJpY3QgcmVxdWlyZSBvcHRpb24gKi8KLSAgICAgICAgYXBfdGFibGVfc2V0bihyLT5ub3RlcywgInNzbC1hY2Nlc3MtZm9yYmlkZGVuIiwgKHZvaWQgKikxKTsKLSAgICAgICAgcmV0dXJuIEZPUkJJRERFTjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENoZWNrIHRvIHNlZSBpZiBTU0wgcHJvdG9jb2wgaXMgb24KLSAgICAgKi8KLSAgICBpZiAoIXNjLT5iRW5hYmxlZCkKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIGlmIChzc2wgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotCi0gICAgLyoKLSAgICAgKiBTdXBwb3J0IGZvciBwZXItZGlyZWN0b3J5IHJlY29uZmlndXJlZCBTU0wgY29ubmVjdGlvbiBwYXJhbWV0ZXJzLgotICAgICAqCi0gICAgICogVGhpcyBpcyBpbXBsZW1lbnRlZCBieSBmb3JjaW5nIGFuIFNTTCByZW5lZ290aWF0aW9uIHdpdGggdGhlCi0gICAgICogcmVjb25maWd1cmVkIHBhcmFtZXRlciBzdWl0ZS4gQnV0IEFwYWNoZSdzIGludGVybmFsIEFQSSBwcm9jZXNzaW5nCi0gICAgICogbWFrZXMgb3VyIGxpZmUgdmVyeSBoYXJkIGhlcmUsIGJlY2F1c2Ugd2hlbiBpbnRlcm5hbCBzdWItcmVxdWVzdHMgb2NjdXIKLSAgICAgKiB3ZSBuZXZlcnRoZWxlc3Mgc2hvdWxkIGF2b2lkIG11bHRpcGxlIHVubmVjZXNzYXJ5IFNTTCBoYW5kc2hha2VzICh0aGV5Ci0gICAgICogcmVxdWlyZSBleHRyYSBuZXR3b3JrIEkvTyBhbmQgZXNwZWNpYWxseSB0aW1lIHRvIHBlcmZvcm0pLiAKLSAgICAgKiAKLSAgICAgKiBCdXQgdGhlIG9wdGltaXphdGlvbiBmb3IgZmlsdGVyaW5nIG91dCB0aGUgdW5uZWNlc3NhcnkgaGFuZHNoYWtlcyBpc24ndAotICAgICAqIG9idmlvdXMgYW5kIHRyaXZpYWwuICBFc3BlY2lhbGx5IGJlY2F1c2Ugd2hpbGUgQXBhY2hlIGlzIGluIGl0cwotICAgICAqIHN1Yi1yZXF1ZXN0IHByb2Nlc3NpbmcgdGhlIGNsaWVudCBjb3VsZCBmb3JjZSBhZGRpdGlvbmFsIGhhbmRzaGFrZXMsCi0gICAgICogdG9vLiBBbmQgdGhlc2UgdGFrZSBwbGFjZSBwZXJoYXBzIHdpdGhvdXQgb3VyIG5vdGljZS4gU28gdGhlIG9ubHkKLSAgICAgKiBwb3NzaWJpbGl0eSBpcyB0byBleHBsaWNpdGx5IF9hc2tfIE9wZW5TU0wgd2hldGhlciB0aGUgcmVuZWdvdGlhdGlvbgotICAgICAqIGhhcyB0byBiZSBwZXJmb3JtZWQgb3Igbm90LiBJdCBoYXMgdG8gcGVyZm9ybWVkIHdoZW4gc29tZSBwYXJhbWV0ZXJzCi0gICAgICogd2hpY2ggd2VyZSBwcmV2aW91c2x5IGtub3duIChieSB1cykgYXJlIG5vdCB0aG9zZSB3ZSd2ZSBub3cKLSAgICAgKiByZWNvbmZpZ3VyZWQgKGFzIGtub3duIGJ5IE9wZW5TU0wpIG9yIChpbiBvcHRpbWl6ZWQgd2F5KSBhdCBsZWFzdCB3aGVuCi0gICAgICogdGhlIHJlY29uZmlndXJlZCBwYXJhbWV0ZXIgc3VpdGUgaXMgc3Ryb25nZXIgKG1vcmUgcmVzdHJpY3Rpb25zKSB0aGFuCi0gICAgICogdGhlIGN1cnJlbnRseSBhY3RpdmUgb25lLgotICAgICAqLwotICAgIHJlbmVnb3RpYXRlICAgICAgICAgICAgPSBGQUxTRTsKLSAgICByZW5lZ290aWF0ZV9xdWljayAgICAgID0gRkFMU0U7Ci0jaWZkZWYgU1NMX0VYUEVSSU1FTlRBTF9QRVJESVJDQQotICAgIHJlY29uZmlndXJlZF9sb2NhdGlvbnMgPSBGQUxTRTsKLSNlbmRpZgotCi0gICAgLyoKLSAgICAgKiBPdmVycmlkZSBvZiBTU0xDaXBoZXJTdWl0ZQotICAgICAqCi0gICAgICogV2UgcHJvdmlkZSB0d28gb3B0aW9ucyBoZXJlOgotICAgICAqCi0gICAgICogbyBUaGUgcGFyYW5vaWQgYW5kIGRlZmF1bHQgYXBwcm9hY2ggd2hlcmUgd2UgZm9yY2UgYSByZW5lZ290aWF0aW9uIHdoZW4KLSAgICAgKiAgIHRoZSBjaXBoZXIgc3VpdGUgY2hhbmdlZCBpbiBfYW55XyB3YXkgKHdoaWNoIGlzIHN0cmFpZ2h0LWZvcndhcmQgYnV0Ci0gICAgICogICBvZnRlbiBmb3JjZXMgcmVuZWdvdGlhdGlvbnMgdG9vIG9mdGVuIGFuZCBpcyBwZXJoYXBzIG5vdCB3aGF0IHRoZQotICAgICAqICAgdXNlciBhY3R1YWxseSB3YW50ZWQpLgotICAgICAqCi0gICAgICogbyBUaGUgb3B0aW1pemVkIGFuZCBzdGlsbCBzZWN1cmUgd2F5IHdoZXJlIHdlIGZvcmNlIGEgcmVuZWdvdGlhdGlvbgotICAgICAqICAgb25seSBpZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBjaXBoZXIgaXMgbm8gbG9uZ2VyIGNvbnRhaW5lZCBpbiB0aGUKLSAgICAgKiAgIHJlY29uZmlndXJlZC9uZXcgY2lwaGVyIHN1aXRlLiBBbnkgb3RoZXIgY2hhbmdlcyBhcmUgbm90IGltcG9ydGFudAotICAgICAqICAgYmVjYXVzZSBpdCdzIHRoZSBzZXJ2ZXJzIGNob2ljZSB0byBzZWxlY3QgYSBjaXBoZXIgZnJvbSB0aGUgb25lcyB0aGUKLSAgICAgKiAgIGNsaWVudCBzdXBwb3J0cy4gU28gYXMgbG9uZyBhcyB0aGUgY3VycmVudCBjaXBoZXIgaXMgc3RpbGwgaW4gdGhlIG5ldwotICAgICAqICAgY2lwaGVyIHN1aXRlIHdlJ3JlIGhhcHB5LiBCZWNhdXNlIHdlIGNhbiBhc3N1bWUgd2Ugd291bGQgaGF2ZQotICAgICAqICAgc2VsZWN0ZWQgaXQgYWdhaW4gZXZlbiB3aGVuIG90aGVyIChiZXR0ZXIpIGNpcGhlcnMgZXhpc3RzIG5vdyBpbiB0aGUKLSAgICAgKiAgIG5ldyBjaXBoZXIgc3VpdGUuIFRoaXMgYXBwcm9hY2ggaXMgZmluZSBiZWNhdXNlIHRoZSB1c2VyIGV4cGxpY2l0bHkKLSAgICAgKiAgIGhhcyB0byBlbmFibGUgdGhpcyB2aWEgYGBTU0xPcHRpb25zICtPcHRSZW5lZ290aWF0ZScnLiBTbyB3ZSBkbyBubwotICAgICAqICAgaW1wbGljaXQgb3B0aW1pemF0aW9ucy4KLSAgICAgKi8KLSAgICBpZiAoZGMtPnN6Q2lwaGVyU3VpdGUgIT0gTlVMTCkgewotICAgICAgICAvKiByZW1lbWJlciBvbGQgc3RhdGUgKi8KLSAgICAgICAgcENpcGhlciA9IE5VTEw7Ci0gICAgICAgIHNrQ2lwaGVyT2xkID0gTlVMTDsKLSAgICAgICAgaWYgKGRjLT5uT3B0aW9ucyAmIFNTTF9PUFRfT1BUUkVORUdPVElBVEUpCi0gICAgICAgICAgICBwQ2lwaGVyID0gU1NMX2dldF9jdXJyZW50X2NpcGhlcihzc2wpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHNrQ2lwaGVyT2xkID0gU1NMX2dldF9jaXBoZXJzKHNzbCk7Ci0gICAgICAgICAgICBpZiAoc2tDaXBoZXJPbGQgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICBza0NpcGhlck9sZCA9IHNrX1NTTF9DSVBIRVJfZHVwKHNrQ2lwaGVyT2xkKTsKLSAgICAgICAgfQotICAgICAgICAvKiBjb25maWd1cmUgbmV3IHN0YXRlICovCi0gICAgICAgIGlmICghU1NMX3NldF9jaXBoZXJfbGlzdChzc2wsIGRjLT5zekNpcGhlclN1aXRlKSkgewotICAgICAgICAgICAgc3NsX2xvZyhyLT5zZXJ2ZXIsIFNTTF9MT0dfV0FSTnxTU0xfQUREX1NTTEVSUiwKLSAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByZWNvbmZpZ3VyZSAocGVyLWRpcmVjdG9yeSkgcGVybWl0dGVkIFNTTCBjaXBoZXJzIik7Ci0gICAgICAgICAgICBpZiAoc2tDaXBoZXJPbGQgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICBza19TU0xfQ0lQSEVSX2ZyZWUoc2tDaXBoZXJPbGQpOwotICAgICAgICAgICAgcmV0dXJuIEZPUkJJRERFTjsKLSAgICAgICAgfQotICAgICAgICAvKiBkZXRlcm1pbmUgd2hldGhlciBhIHJlbmVnb3RpYXRpb24gaGFzIHRvIGJlIGZvcmNlZCAqLwotICAgICAgICBza0NpcGhlciA9IFNTTF9nZXRfY2lwaGVycyhzc2wpOwotICAgICAgICBpZiAoZGMtPm5PcHRpb25zICYgU1NMX09QVF9PUFRSRU5FR09USUFURSkgewotICAgICAgICAgICAgLyogb3B0aW1pemVkIHdheSAqLwotICAgICAgICAgICAgaWYgKChwQ2lwaGVyID09IE5VTEwgJiYgc2tDaXBoZXIgIT0gTlVMTCkgfHwKLSAgICAgICAgICAgICAgICAocENpcGhlciAhPSBOVUxMICYmIHNrQ2lwaGVyID09IE5VTEwpICAgKQotICAgICAgICAgICAgICAgIHJlbmVnb3RpYXRlID0gVFJVRTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHBDaXBoZXIgIT0gTlVMTCAmJiBza0NpcGhlciAhPSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAmJiBza19TU0xfQ0lQSEVSX2ZpbmQoc2tDaXBoZXIsIHBDaXBoZXIpIDwgMCkgewotICAgICAgICAgICAgICAgIHJlbmVnb3RpYXRlID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIHBhcmFub2lkIHdheSAqLwotICAgICAgICAgICAgaWYgKChza0NpcGhlck9sZCA9PSBOVUxMICYmIHNrQ2lwaGVyICE9IE5VTEwpIHx8Ci0gICAgICAgICAgICAgICAgKHNrQ2lwaGVyT2xkICE9IE5VTEwgJiYgc2tDaXBoZXIgPT0gTlVMTCkgICApCi0gICAgICAgICAgICAgICAgcmVuZWdvdGlhdGUgPSBUUlVFOwotICAgICAgICAgICAgZWxzZSBpZiAoc2tDaXBoZXJPbGQgIT0gTlVMTCAmJiBza0NpcGhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChuID0gMDsgIXJlbmVnb3RpYXRlICYmIG4gPCBza19TU0xfQ0lQSEVSX251bShza0NpcGhlcik7IG4rKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2tfU1NMX0NJUEhFUl9maW5kKHNrQ2lwaGVyT2xkLCBza19TU0xfQ0lQSEVSX3ZhbHVlKHNrQ2lwaGVyLCBuKSkgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVuZWdvdGlhdGUgPSBUUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyAhcmVuZWdvdGlhdGUgJiYgbiA8IHNrX1NTTF9DSVBIRVJfbnVtKHNrQ2lwaGVyT2xkKTsgbisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChza19TU0xfQ0lQSEVSX2ZpbmQoc2tDaXBoZXIsIHNrX1NTTF9DSVBIRVJfdmFsdWUoc2tDaXBoZXJPbGQsIG4pKSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZW5lZ290aWF0ZSA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIGNsZWFudXAgKi8KLSAgICAgICAgaWYgKHNrQ2lwaGVyT2xkICE9IE5VTEwpCi0gICAgICAgICAgICBza19TU0xfQ0lQSEVSX2ZyZWUoc2tDaXBoZXJPbGQpOwotICAgICAgICAvKiB0cmFjaW5nICovCi0gICAgICAgIGlmIChyZW5lZ290aWF0ZSkKLSAgICAgICAgICAgIHNzbF9sb2coci0+c2VydmVyLCBTU0xfTE9HX1RSQUNFLAotICAgICAgICAgICAgICAgICAgICAiUmVjb25maWd1cmVkIGNpcGhlciBzdWl0ZSB3aWxsIGZvcmNlIHJlbmVnb3RpYXRpb24iKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIG92ZXJyaWRlIG9mIFNTTFZlcmlmeURlcHRoCi0gICAgICoKLSAgICAgKiBUaGUgZGVwdGggY2hlY2tzIGFyZSBoYW5kbGVkIGJ5IHVzIG1hbnVhbGx5IGluc2lkZSB0aGUgdmVyaWZ5IGNhbGxiYWNrCi0gICAgICogZnVuY3Rpb24gYW5kIG5vdCBieSBPcGVuU1NMIGludGVybmFsbHkgKGFuZCBvdXIgZnVuY3Rpb24gaXMgYXdhcmUgb2YKLSAgICAgKiBib3RoIHRoZSBwZXItc2VydmVyIGFuZCBwZXItZGlyZWN0b3J5IGNvbnRleHRzKS4gU28gd2UgY2Fubm90IGFzawotICAgICAqIE9wZW5TU0wgYWJvdXQgdGhlIGN1cnJlbnRseSB2ZXJpZnkgZGVwdGguIEluc3RlYWQgd2UgcmVtZW1iZXIgaXQgaW4gb3VyCi0gICAgICogYXBfY3R4IGF0dGFjaGVkIHRvIHRoZSBTU0wqIG9mIE9wZW5TU0wuICBXZSd2ZSB0byBmb3JjZSB0aGUKLSAgICAgKiByZW5lZ290aWF0aW9uIGlmIHRoZSByZWNvbmZpZ3VyZWQvbmV3IHZlcmlmeSBkZXB0aCBpcyBsZXNzIHRoYW4gdGhlCi0gICAgICogY3VycmVudGx5IGFjdGl2ZS9yZW1lbWJlcmVkIHZlcmlmeSBkZXB0aCAoYmVjYXVzZSB0aGlzIG1lYW5zIG1vcmUKLSAgICAgKiByZXN0cmljdGlvbiBvbiB0aGUgY2VydGlmaWNhdGUgY2hhaW4pLgotICAgICAqLwotICAgIGlmIChkYy0+blZlcmlmeURlcHRoICE9IFVOU0VUKSB7Ci0gICAgICAgIGFwY3R4ID0gU1NMX2dldF9hcHBfZGF0YTIoc3NsKTsKLSAgICAgICAgaWYgKCh2cCA9IGFwX2N0eF9nZXQoYXBjdHgsICJzc2w6OnZlcmlmeTo6ZGVwdGgiKSkgIT0gTlVMTCkKLSAgICAgICAgICAgIG4gPSAoaW50KUFQX0NUWF9QVFIyTlVNKHZwKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbiA9IHNjLT5uVmVyaWZ5RGVwdGg7Ci0gICAgICAgIGFwX2N0eF9zZXQoYXBjdHgsICJzc2w6OnZlcmlmeTo6ZGVwdGgiLAotICAgICAgICAgICAgICAgICAgIEFQX0NUWF9OVU0yUFRSKGRjLT5uVmVyaWZ5RGVwdGgpKTsKLSAgICAgICAgLyogZGV0ZXJtaW5lIHdoZXRoZXIgYSByZW5lZ290aWF0aW9uIGhhcyB0byBiZSBmb3JjZWQgKi8KLSAgICAgICAgaWYgKGRjLT5uVmVyaWZ5RGVwdGggPCBuKSB7Ci0gICAgICAgICAgICByZW5lZ290aWF0ZSA9IFRSVUU7Ci0gICAgICAgICAgICBzc2xfbG9nKHItPnNlcnZlciwgU1NMX0xPR19UUkFDRSwKLSAgICAgICAgICAgICAgICAgICAgIlJlZHVjZWQgY2xpZW50IHZlcmlmaWNhdGlvbiBkZXB0aCB3aWxsIGZvcmNlIHJlbmVnb3RpYXRpb24iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogb3ZlcnJpZGUgb2YgU1NMVmVyaWZ5Q2xpZW50Ci0gICAgICoKLSAgICAgKiBXZSBmb3JjZSBhIHJlbmVnb3RpYXRpb24gaWYgdGhlIHJlY29uZmlndXJlZC9uZXcgdmVyaWZ5IHR5cGUgaXMKLSAgICAgKiBzdHJvbmdlciB0aGFuIHRoZSBjdXJyZW50bHkgYWN0aXZlIHZlcmlmeSB0eXBlLiAKLSAgICAgKgotICAgICAqIFRoZSBvcmRlciBpczogbm9uZSA8PCBvcHRpb25hbF9ub19jYSA8PCBvcHRpb25hbCA8PCByZXF1aXJlCi0gICAgICoKLSAgICAgKiBBZGRpdGlvbmFsbHkgdGhlIGZvbGxvd2luZyBvcHRpbWl6YXRpb24gaXMgcG9zc2libGUgaGVyZTogV2hlbiB0aGUKLSAgICAgKiBjdXJyZW50bHkgYWN0aXZlIHZlcmlmeSB0eXBlIGlzICJub25lIiBidXQgYSBjbGllbnQgY2VydGlmaWNhdGUgaXMKLSAgICAgKiBhbHJlYWR5IGtub3duL3ByZXNlbnQsIGl0J3MgZW5vdWdoIHRvIG1hbnVhbGx5IGZvcmNlIGEgY2xpZW50Ci0gICAgICogdmVyaWZpY2F0aW9uIGJ1dCBhdCBsZWFzdCBza2lwIHRoZSBJL08taW50ZW5zaXZlIHJlbmVnb3RhdGlvbgotICAgICAqIGhhbmRzaGFrZS4KLSAgICAgKi8KLSAgICBpZiAoZGMtPm5WZXJpZnlDbGllbnQgIT0gU1NMX0NWRVJJRllfVU5TRVQpIHsKLSAgICAgICAgLyogcmVtZW1iZXIgb2xkIHN0YXRlICovCi0gICAgICAgIG5WZXJpZnlPbGQgPSBTU0xfZ2V0X3ZlcmlmeV9tb2RlKHNzbCk7Ci0gICAgICAgIC8qIGNvbmZpZ3VyZSBuZXcgc3RhdGUgKi8KLSAgICAgICAgblZlcmlmeSA9IFNTTF9WRVJJRllfTk9ORTsKLSAgICAgICAgaWYgKGRjLT5uVmVyaWZ5Q2xpZW50ID09IFNTTF9DVkVSSUZZX1JFUVVJUkUpCi0gICAgICAgICAgICBuVmVyaWZ5IHw9IFNTTF9WRVJJRllfUEVFUnxTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUOwotICAgICAgICBpZiAoICAgKGRjLT5uVmVyaWZ5Q2xpZW50ID09IFNTTF9DVkVSSUZZX09QVElPTkFMKQotICAgICAgICAgICAgfHwgKGRjLT5uVmVyaWZ5Q2xpZW50ID09IFNTTF9DVkVSSUZZX09QVElPTkFMX05PX0NBKSApCi0gICAgICAgICAgICBuVmVyaWZ5IHw9IFNTTF9WRVJJRllfUEVFUjsKLSAgICAgICAgU1NMX3NldF92ZXJpZnkoc3NsLCBuVmVyaWZ5LCBzc2xfY2FsbGJhY2tfU1NMVmVyaWZ5KTsKLSAgICAgICAgU1NMX3NldF92ZXJpZnlfcmVzdWx0KHNzbCwgWDUwOV9WX09LKTsKLSAgICAgICAgLyogZGV0ZXJtaW5lIHdoZXRoZXIgd2UndmUgdG8gZm9yY2UgYSByZW5lZ290aWF0aW9uICovCi0gICAgICAgIGlmIChuVmVyaWZ5ICE9IG5WZXJpZnlPbGQpIHsKLSAgICAgICAgICAgIGlmICggICAoICAgKG5WZXJpZnlPbGQgPT0gU1NMX1ZFUklGWV9OT05FKQotICAgICAgICAgICAgICAgICAgICAmJiAoblZlcmlmeSAgICAhPSBTU0xfVkVSSUZZX05PTkUpKQotICAgICAgICAgICAgICAgIHx8ICggICEoblZlcmlmeU9sZCAmICBTU0xfVkVSSUZZX1BFRVIpCi0gICAgICAgICAgICAgICAgICAgICYmIChuVmVyaWZ5ICAgICYgIFNTTF9WRVJJRllfUEVFUikpCi0gICAgICAgICAgICAgICAgfHwgKCAgIShuVmVyaWZ5T2xkICYgIChTU0xfVkVSSUZZX1BFRVJ8U1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkpCi0gICAgICAgICAgICAgICAgICAgICYmIChuVmVyaWZ5ICAgICYgIChTU0xfVkVSSUZZX1BFRVJ8U1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkpKSkgewotICAgICAgICAgICAgICAgIHJlbmVnb3RpYXRlID0gVFJVRTsKLSAgICAgICAgICAgICAgICAvKiBvcHRpbWl6YXRpb24gKi8KLSAgICAgICAgICAgICAgICBpZiAoICAgZGMtPm5PcHRpb25zICYgU1NMX09QVF9PUFRSRU5FR09USUFURQotICAgICAgICAgICAgICAgICAgICAmJiBuVmVyaWZ5T2xkID09IFNTTF9WRVJJRllfTk9ORQotICAgICAgICAgICAgICAgICAgICAmJiBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc3NsKSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICByZW5lZ290aWF0ZV9xdWljayA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgc3NsX2xvZyhyLT5zZXJ2ZXIsIFNTTF9MT0dfVFJBQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2hhbmdlZCBjbGllbnQgdmVyaWZpY2F0aW9uIHR5cGUgd2lsbCBmb3JjZSAlc3JlbmVnb3RpYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVuZWdvdGlhdGVfcXVpY2sgPyAicXVpY2sgIiA6ICIiKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqICBvdmVycmlkZSBTU0xDQUNlcnRpZmljYXRlRmlsZSAmIFNTTENBQ2VydGlmaWNhdGVQYXRoCi0gICAgICogIFRoaXMgaXMgdGFnZ2VkIGV4cGVyaW1lbnRhbCBiZWNhdXNlIGl0IGhhcyB0byB1c2UgYW4gdWdseSBrbHVkZ2U6IFdlCi0gICAgICogIGhhdmUgdG8gY2hhbmdlIHRoZSBsb2NhdGlvbnMgaW5zaWRlIHRoZSBTU0xfQ1RYKiAocGVyLXNlcnZlciBnbG9iYWwpCi0gICAgICogIGluc3RlYWQgaW5zaWRlIFNTTCogKHBlci1jb25uZWN0aW9uIGxvY2FsKSBhbmQgcmVjb25maWd1cmUgaXQgdG8gdGhlCi0gICAgICogIG9sZCB2YWx1ZXMgbGF0ZXIuIFRoYXQncyBwcm9ibGVtYXRpYyBhdCBsZWFzdCBmb3IgdGhlIHRocmVhZGVkIHByb2Nlc3MKLSAgICAgKiAgbW9kZWwgb2YgQXBhY2hlIHVuZGVyIFdpbjMyIG9yIHdoZW4gYW4gZXJyb3Igb2NjdXJzLiBCdXQgdW5sZXNzCi0gICAgICogIE9wZW5TU0wgcHJvdmlkZXMgYSBTU0xfbG9hZF92ZXJpZnlfbG9jYXRpb25zKCkgZnVuY3Rpb24gd2UndmUgbm8gb3RoZXIKLSAgICAgKiAgY2hhbmNlIHRvIHByb3ZpZGUgdGhpcyBmdW5jdGlvbmFsaXR5Li4uCi0gICAgICovCi0jaWZkZWYgU1NMX0VYUEVSSU1FTlRBTF9QRVJESVJDQQotICAgIGlmICggICAoICAgZGMtPnN6Q0FDZXJ0aWZpY2F0ZUZpbGUgIT0gTlVMTAotICAgICAgICAgICAgJiYgKCAgIHNjLT5zekNBQ2VydGlmaWNhdGVGaWxlID09IE5VTEwKLSAgICAgICAgICAgICAgICB8fCAoICAgc2MtPnN6Q0FDZXJ0aWZpY2F0ZUZpbGUgIT0gTlVMTAotICAgICAgICAgICAgICAgICAgICAmJiBzdHJORShkYy0+c3pDQUNlcnRpZmljYXRlRmlsZSwgc2MtPnN6Q0FDZXJ0aWZpY2F0ZUZpbGUpKSkpCi0gICAgICAgIHx8ICggICBkYy0+c3pDQUNlcnRpZmljYXRlUGF0aCAhPSBOVUxMCi0gICAgICAgICAgICAmJiAoICAgc2MtPnN6Q0FDZXJ0aWZpY2F0ZVBhdGggPT0gTlVMTAotICAgICAgICAgICAgICAgIHx8ICggICBzYy0+c3pDQUNlcnRpZmljYXRlUGF0aCAhPSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICYmIHN0ck5FKGRjLT5zekNBQ2VydGlmaWNhdGVQYXRoLCBzYy0+c3pDQUNlcnRpZmljYXRlUGF0aCkpKSkgKSB7Ci0gICAgICAgIGNwQ0FGaWxlID0gZGMtPnN6Q0FDZXJ0aWZpY2F0ZUZpbGUgIT0gTlVMTCA/Ci0gICAgICAgICAgICAgICAgICAgZGMtPnN6Q0FDZXJ0aWZpY2F0ZUZpbGUgOiBzYy0+c3pDQUNlcnRpZmljYXRlRmlsZTsKLSAgICAgICAgY3BDQVBhdGggPSBkYy0+c3pDQUNlcnRpZmljYXRlUGF0aCAhPSBOVUxMID8KLSAgICAgICAgICAgICAgICAgICBkYy0+c3pDQUNlcnRpZmljYXRlUGF0aCA6IHNjLT5zekNBQ2VydGlmaWNhdGVQYXRoOwotICAgICAgICAvKgotICAgICAgICAgICBGSVhNRTogVGhpcyBzaG91bGQgYmUuLi4KLSAgICAgICAgICAgaWYgKCFTU0xfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHNzbCwgY3BDQUZpbGUsIGNwQ0FQYXRoKSkgewotICAgICAgICAgICAuLi5idXQgT3BlblNTTCBzdGlsbCBkb2Vzbid0IHByb3ZpZGUgdGhpcyEKLSAgICAgICAgICovCi0gICAgICAgIGlmICghU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY3R4LCBjcENBRmlsZSwgY3BDQVBhdGgpKSB7Ci0gICAgICAgICAgICBzc2xfbG9nKHItPnNlcnZlciwgU1NMX0xPR19FUlJPUnxTU0xfQUREX1NTTEVSUiwKLSAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByZWNvbmZpZ3VyZSB2ZXJpZnkgbG9jYXRpb25zICIKLSAgICAgICAgICAgICAgICAgICAgImZvciBjbGllbnQgYXV0aGVudGljYXRpb24iKTsKLSAgICAgICAgICAgIHJldHVybiBGT1JCSURERU47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChza0NBTGlzdCA9IHNzbF9pbml0X0ZpbmRDQUxpc3Qoci0+c2VydmVyLCByLT5wb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcENBRmlsZSwgY3BDQVBhdGgpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBzc2xfbG9nKHItPnNlcnZlciwgU1NMX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBkZXRlcm1pbmUgbGlzdCBvZiBhdmFpbGFibGUgIgotICAgICAgICAgICAgICAgICAgICAiQ0EgY2VydGlmaWNhdGVzIGZvciBjbGllbnQgYXV0aGVudGljYXRpb24iKTsKLSAgICAgICAgICAgIHJldHVybiBGT1JCSURERU47Ci0gICAgICAgIH0KLSAgICAgICAgU1NMX3NldF9jbGllbnRfQ0FfbGlzdChzc2wsIHNrQ0FMaXN0KTsKLSAgICAgICAgcmVuZWdvdGlhdGUgPSBUUlVFOwotICAgICAgICByZWNvbmZpZ3VyZWRfbG9jYXRpb25zID0gVFJVRTsKLSAgICAgICAgc3NsX2xvZyhyLT5zZXJ2ZXIsIFNTTF9MT0dfVFJBQ0UsCi0gICAgICAgICAgICAgICAgIkNoYW5nZWQgY2xpZW50IHZlcmlmaWNhdGlvbiBsb2NhdGlvbnMgd2lsbCBmb3JjZSByZW5lZ290aWF0aW9uIik7Ci0gICAgfQotI2VuZGlmIC8qIFNTTF9FWFBFUklNRU5UQUxfUEVSRElSQ0EgKi8KLQotI2lmZGVmIFNTTF9DT05TRVJWQVRJVkUgCi0gICAgLyogCi0gICAgICogIFNTTCByZW5lZ290aWF0aW9ucyBpbiBjb25qdW5jdGlvbiB3aXRoIEhUVFAKLSAgICAgKiAgcmVxdWVzdHMgdXNpbmcgdGhlIFBPU1QgbWV0aG9kIGFyZSBub3Qgc3VwcG9ydGVkLgotICAgICAqLwotICAgIGlmIChyZW5lZ290aWF0ZSAmJiByLT5tZXRob2RfbnVtYmVyID09IE1fUE9TVCkgewotICAgICAgICBzc2xfbG9nKHItPnNlcnZlciwgU1NMX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAiU1NMIFJlLW5lZ290aWF0aW9uIGluIGNvbmp1bmN0aW9uIHdpdGggUE9TVCBtZXRob2Qgbm90IHN1cHBvcnRlZCEiKTsKLSAgICAgICAgc3NsX2xvZyhyLT5zZXJ2ZXIsIFNTTF9MT0dfSU5GTywKLSAgICAgICAgICAgICAgICAiWW91IGhhdmUgdG8gY29tcGlsZSB3aXRob3V0IC1EU1NMX0NPTlNFUlZBVElWRSB0byBlbmFibGVkIHN1cHBvcnQgZm9yIHRoaXMuIik7Ci0gICAgICAgIHJldHVybiBNRVRIT0RfTk9UX0FMTE9XRUQ7Ci0gICAgfQotI2VuZGlmIC8qIFNTTF9DT05TRVJWQVRJVkUgKi8KLQotICAgIC8qCi0gICAgICogbm93IGRvIHRoZSByZW5lZ290aWF0aW9uIGlmIGFueXRoaW5nIHdhcyBhY3R1YWxseSByZWNvbmZpZ3VyZWQKLSAgICAgKi8KLSAgICBpZiAocmVuZWdvdGlhdGUpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogTm93IHdlIGZvcmNlIHRoZSBTU0wgcmVuZWdvdGF0aW9uIGJ5IHNlbmRpbmcgdGhlIEhlbGxvIFJlcXVlc3QKLSAgICAgICAgICogbWVzc2FnZSB0byB0aGUgY2xpZW50LiBIZXJlIHdlIGhhdmUgdG8gZG8gYSB3b3JrYXJvdW5kOiBBY3R1YWxseQotICAgICAgICAgKiBPcGVuU1NMIHJldHVybnMgaW1tZWRpYXRlbHkgYWZ0ZXIgc2VuZGluZyB0aGUgSGVsbG8gUmVxdWVzdCAodGhlCi0gICAgICAgICAqIGludGVudCBBRkFJSyBpcyBiZWNhdXNlIHRoZSBTU0wvVExTIHByb3RvY29sIHNheXMgaXQncyBub3QgYSBtdXN0Ci0gICAgICAgICAqIHRoYXQgdGhlIGNsaWVudCByZXBsaWVzIHRvIGEgSGVsbG8gUmVxdWVzdCkuIEJ1dCBiZWNhdXNlIHdlIGluc2lzdAotICAgICAgICAgKiBvbiBhIHJlcGx5IChhbnl0aGluZyBlbHNlIGlzIGFuIGVycm9yIGZvciB1cykgd2UgaGF2ZSB0byBnbyB0byB0aGUKLSAgICAgICAgICogQUNDRVBUIHN0YXRlIG1hbnVhbGx5LiBVc2luZyBTU0xfc2V0X2FjY2VwdF9zdGF0ZSgpIGRvZXNuJ3Qgd29yawotICAgICAgICAgKiBoZXJlIGJlY2F1c2UgaXQgcmVzZXRzIHRvbyBtdWNoIG9mIHRoZSBjb25uZWN0aW9uLiAgU28gd2Ugc2V0IHRoZQotICAgICAgICAgKiBzdGF0ZSBleHBsaWNpdGx5IGFuZCBjb250aW51ZSB0aGUgaGFuZHNoYWtlIG1hbnVhbGx5LgotICAgICAgICAgKi8KLSAgICAgICAgc3NsX2xvZyhyLT5zZXJ2ZXIsIFNTTF9MT0dfSU5GTywgIlJlcXVlc3RpbmcgY29ubmVjdGlvbiByZS1uZWdvdGlhdGlvbiIpOwotICAgICAgICBpZiAocmVuZWdvdGlhdGVfcXVpY2spIHsKLSAgICAgICAgICAgIC8qIHBlcmZvcm0ganVzdCBhIG1hbnVhbCByZS12ZXJpZmljYXRpb24gb2YgdGhlIHBlZXIgKi8KLSAgICAgICAgICAgIHNzbF9sb2coci0+c2VydmVyLCBTU0xfTE9HX1RSQUNFLAotICAgICAgICAgICAgICAgICAgICAiUGVyZm9ybWluZyBxdWljayByZW5lZ290aWF0aW9uOiBqdXN0IHJlLXZlcmlmeWluZyB0aGUgcGVlciIpOwotICAgICAgICAgICAgY2VydHN0b3JlID0gU1NMX0NUWF9nZXRfY2VydF9zdG9yZShjdHgpOwotICAgICAgICAgICAgaWYgKGNlcnRzdG9yZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc3NsX2xvZyhyLT5zZXJ2ZXIsIFNTTF9MT0dfRVJST1IsICJDYW5ub3QgZmluZCBjZXJ0aWZpY2F0ZSBzdG9yYWdlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZPUkJJRERFTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNlcnRzdGFjayA9IFNTTF9nZXRfcGVlcl9jZXJ0X2NoYWluKHNzbCk7Ci0gICAgICAgICAgICBpZiAoY2VydHN0YWNrID09IE5VTEwgfHwgc2tfWDUwOV9udW0oY2VydHN0YWNrKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgc3NsX2xvZyhyLT5zZXJ2ZXIsIFNTTF9MT0dfRVJST1IsICJDYW5ub3QgZmluZCBwZWVyIGNlcnRpZmljYXRlIGNoYWluIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZPUkJJRERFTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNlcnQgPSBza19YNTA5X3ZhbHVlKGNlcnRzdGFjaywgMCk7Ci0gICAgICAgICAgICBYNTA5X1NUT1JFX0NUWF9pbml0KCZjZXJ0c3RvcmVjdHgsIGNlcnRzdG9yZSwgY2VydCwgY2VydHN0YWNrKTsKLSAgICAgICAgICAgIGRlcHRoID0gU1NMX2dldF92ZXJpZnlfZGVwdGgoc3NsKTsKLSAgICAgICAgICAgIGlmIChkZXB0aCA+PSAwKQotICAgICAgICAgICAgICAgIFg1MDlfU1RPUkVfQ1RYX3NldF9kZXB0aCgmY2VydHN0b3JlY3R4LCBkZXB0aCk7Ci0gICAgICAgICAgICBYNTA5X1NUT1JFX0NUWF9zZXRfZXhfZGF0YSgmY2VydHN0b3JlY3R4LAotICAgICAgICAgICAgICAgIFNTTF9nZXRfZXhfZGF0YV9YNTA5X1NUT1JFX0NUWF9pZHgoKSwgKGNoYXIgKilzc2wpOwotICAgICAgICAgICAgaWYgKCFYNTA5X3ZlcmlmeV9jZXJ0KCZjZXJ0c3RvcmVjdHgpKQotICAgICAgICAgICAgICAgIHNzbF9sb2coci0+c2VydmVyLCBTU0xfTE9HX0VSUk9SfFNTTF9BRERfU1NMRVJSLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICJSZS1uZWdvdGlhdGlvbiB2ZXJpZmljYXRpb24gc3RlcCBmYWlsZWQiKTsKLSAgICAgICAgICAgIFNTTF9zZXRfdmVyaWZ5X3Jlc3VsdChzc2wsIGNlcnRzdG9yZWN0eC5lcnJvcik7Ci0gICAgICAgICAgICBYNTA5X1NUT1JFX0NUWF9jbGVhbnVwKCZjZXJ0c3RvcmVjdHgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLyogZG8gYSBmdWxsIHJlbmVnb3RpYXRpb24gKi8KLSAgICAgICAgICAgIHNzbF9sb2coci0+c2VydmVyLCBTU0xfTE9HX1RSQUNFLAotICAgICAgICAgICAgICAgICAgICAiUGVyZm9ybWluZyBmdWxsIHJlbmVnb3RpYXRpb246IGNvbXBsZXRlIGhhbmRzaGFrZSBwcm90b2NvbCIpOwotICAgICAgICAgICAgaWYgKHItPm1haW4gIT0gTlVMTCkKLSAgICAgICAgICAgICAgICBTU0xfc2V0X3Nlc3Npb25faWRfY29udGV4dChzc2wsICh1bnNpZ25lZCBjaGFyICopJihyLT5tYWluKSwgc2l6ZW9mKHItPm1haW4pKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBTU0xfc2V0X3Nlc3Npb25faWRfY29udGV4dChzc2wsICh1bnNpZ25lZCBjaGFyICopJnIsIHNpemVvZihyKSk7Ci0jaWZuZGVmIFNTTF9DT05TRVJWQVRJVkUKLSAgICAgICAgICAgIHNzbF9pb19zdWNrKHIsIHNzbCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIFNTTF9yZW5lZ290aWF0ZShzc2wpOwotICAgICAgICAgICAgU1NMX2RvX2hhbmRzaGFrZShzc2wpOwotICAgICAgICAgICAgaWYgKFNTTF9nZXRfc3RhdGUoc3NsKSAhPSBTU0xfU1RfT0spIHsKLSAgICAgICAgICAgICAgICBzc2xfbG9nKHItPnNlcnZlciwgU1NMX0xPR19FUlJPUiwgIlJlLW5lZ290aWF0aW9uIHJlcXVlc3QgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZPUkJJRERFTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNzbF9sb2coci0+c2VydmVyLCBTU0xfTE9HX0lORk8sICJBd2FpdGluZyByZS1uZWdvdGlhdGlvbiBoYW5kc2hha2UiKTsKLSAgICAgICAgICAgIFNTTF9zZXRfc3RhdGUoc3NsLCBTU0xfU1RfQUNDRVBUKTsKLSAgICAgICAgICAgIFNTTF9kb19oYW5kc2hha2Uoc3NsKTsKLSAgICAgICAgICAgIGlmIChTU0xfZ2V0X3N0YXRlKHNzbCkgIT0gU1NMX1NUX09LKSB7Ci0gICAgICAgICAgICAgICAgc3NsX2xvZyhyLT5zZXJ2ZXIsIFNTTF9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiUmUtbmVnb3RpYXRpb24gaGFuZHNoYWtlIGZhaWxlZDogTm90IGFjY2VwdGVkIGJ5IGNsaWVudCE/Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZPUkJJRERFTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFJlbWVtYmVyIHRoZSBwZWVyIGNlcnRpZmljYXRlJ3MgRE4KLSAgICAgICAgICovCi0gICAgICAgIGlmICgoY2VydCA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShzc2wpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjcCA9IFg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X3N1YmplY3RfbmFtZShjZXJ0KSwgTlVMTCwgMCk7Ci0gICAgICAgICAgICBhcF9jdHhfc2V0KHItPmNvbm5lY3Rpb24tPmNsaWVudC0+Y3R4LCAic3NsOjpjbGllbnQ6OmRuIiwgCi0gICAgICAgICAgICAgICAgICAgICAgIGFwX3BzdHJkdXAoci0+Y29ubmVjdGlvbi0+cG9vbCwgY3ApKTsKLSAgICAgICAgICAgIGZyZWUoY3ApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogRmluYWxseSBjaGVjayBmb3IgYWNjZXB0YWJsZSByZW5lZ290aWF0aW9uIHJlc3VsdHMKLSAgICAgICAgICovCi0gICAgICAgIGlmIChkYy0+blZlcmlmeUNsaWVudCAhPSBTU0xfQ1ZFUklGWV9OT05FKSB7Ci0gICAgICAgICAgICBpZiAoICAgZGMtPm5WZXJpZnlDbGllbnQgPT0gU1NMX0NWRVJJRllfUkVRVUlSRQotICAgICAgICAgICAgICAgICYmIFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChzc2wpICE9IFg1MDlfVl9PSyAgKSB7Ci0gICAgICAgICAgICAgICAgc3NsX2xvZyhyLT5zZXJ2ZXIsIFNTTF9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiUmUtbmVnb3RpYXRpb24gaGFuZHNoYWtlIGZhaWxlZDogQ2xpZW50IHZlcmlmaWNhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRk9SQklEREVOOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCAgIGRjLT5uVmVyaWZ5Q2xpZW50ID09IFNTTF9DVkVSSUZZX1JFUVVJUkUKLSAgICAgICAgICAgICAgICAmJiBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc3NsKSA9PSBOVUxMICAgKSB7Ci0gICAgICAgICAgICAgICAgc3NsX2xvZyhyLT5zZXJ2ZXIsIFNTTF9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiUmUtbmVnb3RpYXRpb24gaGFuZHNoYWtlIGZhaWxlZDogQ2xpZW50IGNlcnRpZmljYXRlIG1pc3NpbmciKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRk9SQklEREVOOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBVbmRlciBvbGQgT3BlblNTTCB3ZSBoYWQgdG8gY2hhbmdlIHRoZSBYNTA5X1NUT1JFIGluc2lkZSB0aGUKLSAgICAgKiBTU0xfQ1RYIGluc3RlYWQgaW5zaWRlIHRoZSBTU0wgc3RydWN0dXJlLCBzbyB3ZSBoYXZlIHRvIHJlY29uZmlndXJlIGl0Ci0gICAgICogdG8gdGhlIG9sZCB2YWx1ZXMuIFRoaXMgc2hvdWxkIGJlIGNoYW5nZWQgd2l0aCBmb3J0aGNvbWluZyBPcGVuU1NMCi0gICAgICogdmVyc2lvbnMgd2hlbiBiZXR0ZXIgZnVuY3Rpb25hbGl0eSBpcyBhdmFpYWJsZS4KLSAgICAgKi8KLSNpZmRlZiBTU0xfRVhQRVJJTUVOVEFMX1BFUkRJUkNBCi0gICAgaWYgKHJlbmVnb3RpYXRlICYmIHJlY29uZmlndXJlZF9sb2NhdGlvbnMpIHsKLSAgICAgICAgaWYgKCFTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjdHgsCi0gICAgICAgICAgICAgICAgc2MtPnN6Q0FDZXJ0aWZpY2F0ZUZpbGUsIHNjLT5zekNBQ2VydGlmaWNhdGVQYXRoKSkgewotICAgICAgICAgICAgc3NsX2xvZyhyLT5zZXJ2ZXIsIFNTTF9MT0dfRVJST1J8U1NMX0FERF9TU0xFUlIsCi0gICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcmVjb25maWd1cmUgdmVyaWZ5IGxvY2F0aW9ucyAiCi0gICAgICAgICAgICAgICAgICAgICJ0byBwZXItc2VydmVyIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyIpOwotICAgICAgICAgICAgcmV0dXJuIEZPUkJJRERFTjsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZiAvKiBTU0xfRVhQRVJJTUVOVEFMX1BFUkRJUkNBICovCi0KLSAgICAvKgotICAgICAqIENoZWNrIFNTTFJlcXVpcmUgYm9vbGVhbiBleHByZXNzaW9ucwotICAgICAqLwotICAgIGFwUmVxdWlyZW1lbnQgPSBkYy0+YVJlcXVpcmVtZW50OwotICAgIHBSZXF1aXJlbWVudHMgPSAoc3NsX3JlcXVpcmVfdCAqKWFwUmVxdWlyZW1lbnQtPmVsdHM7Ci0gICAgZm9yIChpID0gMDsgaSA8IGFwUmVxdWlyZW1lbnQtPm5lbHRzOyBpKyspIHsKLSAgICAgICAgcFJlcXVpcmVtZW50ID0gJnBSZXF1aXJlbWVudHNbaV07Ci0gICAgICAgIG9rID0gc3NsX2V4cHJfZXhlYyhyLCBwUmVxdWlyZW1lbnQtPm1wRXhwcik7Ci0gICAgICAgIGlmIChvayA8IDApIHsKLSAgICAgICAgICAgIGNwID0gYXBfcHNwcmludGYoci0+cG9vbCwgIkZhaWxlZCB0byBleGVjdXRlIFNTTCByZXF1aXJlbWVudCBleHByZXNzaW9uOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF9leHByX2dldF9lcnJvcigpKTsKLSAgICAgICAgICAgIGFwX2xvZ19yZWFzb24oY3AsIHItPmZpbGVuYW1lLCByKTsKLSAgICAgICAgICAgIC8qIHJlbWVtYmVyIGZvcmJpZGRlbiBhY2Nlc3MgZm9yIHN0cmljdCByZXF1aXJlIG9wdGlvbiAqLwotICAgICAgICAgICAgYXBfdGFibGVfc2V0bihyLT5ub3RlcywgInNzbC1hY2Nlc3MtZm9yYmlkZGVuIiwgKHZvaWQgKikxKTsKLSAgICAgICAgICAgIHJldHVybiBGT1JCSURERU47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9rICE9IDEpIHsKLSAgICAgICAgICAgIHNzbF9sb2coci0+c2VydmVyLCBTU0xfTE9HX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICJBY2Nlc3MgdG8gJXMgZGVuaWVkIGZvciAlcyAocmVxdWlyZW1lbnQgZXhwcmVzc2lvbiBub3QgZnVsZmlsbGVkKSIsCi0gICAgICAgICAgICAgICAgICAgIHItPmZpbGVuYW1lLCByLT5jb25uZWN0aW9uLT5yZW1vdGVfaXApOwotICAgICAgICAgICAgc3NsX2xvZyhyLT5zZXJ2ZXIsIFNTTF9MT0dfSU5GTywKLSAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCBleHByZXNzaW9uOiAlcyIsIHBSZXF1aXJlbWVudC0+Y3BFeHByKTsKLSAgICAgICAgICAgIGFwX2xvZ19yZWFzb24oIlNTTCByZXF1aXJlbWVudCBleHByZXNzaW9uIG5vdCBmdWxmaWxsZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiKHNlZSBTU0wgbG9nZmlsZSBmb3IgbW9yZSBkZXRhaWxzKSIsIHItPmZpbGVuYW1lLCByKTsKLSAgICAgICAgICAgIC8qIHJlbWVtYmVyIGZvcmJpZGRlbiBhY2Nlc3MgZm9yIHN0cmljdCByZXF1aXJlIG9wdGlvbiAqLwotICAgICAgICAgICAgYXBfdGFibGVfc2V0bihyLT5ub3RlcywgInNzbC1hY2Nlc3MtZm9yYmlkZGVuIiwgKHZvaWQgKikxKTsKLSAgICAgICAgICAgIHJldHVybiBGT1JCSURERU47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEVsc2UgYWNjZXNzIGlzIGdyYW50ZWQgZnJvbSBvdXIgcG9pbnQgb2YgdmlldyAoZXhjZXB0IHZlbmRvcgotICAgICAqIGhhbmRsZXJzIG92ZXJyaWRlKS4gQnV0IHdlIGhhdmUgdG8gcmV0dXJuIERFQ0xJTkVEIGhlcmUgaW5zdGVhZAotICAgICAqIG9mIE9LLCBiZWNhdXNlIG1vZF9hdXRoIGFuZCBvdGhlciBtb2R1bGVzIHN0aWxsIG1pZ2h0IHdhbnQgdG8KLSAgICAgKiBkZW55IGFjY2Vzcy4KLSAgICAgKi8KLSAgICByYyA9IERFQ0xJTkVEOwotI2lmZGVmIFNTTF9WRU5ET1IKLSAgICBhcF9ob29rX3VzZSgiYXA6Om1vZF9zc2w6OnZlbmRvcjo6YWNjZXNzX2hhbmRsZXIiLAotICAgICAgICAgICAgICAgIEFQX0hPT0tfU0lHMihpbnQscHRyKSwgQVBfSE9PS19ERUNMSU5FKERFQ0xJTkVEKSwKLSAgICAgICAgICAgICAgICAmcmMsIHIpOwotI2VuZGlmCi0gICAgcmV0dXJuIHJjOwotfQotCi0vKgotICogIEF1dGggSGFuZGxlcjoKLSAqICBGYWtlIGEgQmFzaWMgYXV0aGVudGljYXRpb24gZnJvbSB0aGUgWDUwOSBjbGllbnQgY2VydGlmaWNhdGUuCi0gKgotICogIFRoaXMgbXVzdCBiZSBydW4gZmFpcmx5IGVhcmx5IG9uIHRvIHByZXZlbnQgYSByZWFsIGF1dGhlbnRpY2F0aW9uIGZyb20KLSAqICBvY2N1cmluZywgaW4gcGFydGljdWxhciBpdCBtdXN0IGJlIHJ1biBiZWZvcmUgYW55dGhpbmcgZWxzZSB0aGF0Ci0gKiAgYXV0aGVudGljYXRlcyBhIHVzZXIuICBUaGlzIG1lYW5zIHRoYXQgdGhlIE1vZHVsZSBzdGF0ZW1lbnQgZm9yIHRoaXMKLSAqICBtb2R1bGUgc2hvdWxkIGJlIExBU1QgaW4gdGhlIENvbmZpZ3VyYXRpb24gZmlsZS4KLSAqLwotaW50IHNzbF9ob29rX0F1dGgocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgU1NMU3J2Q29uZmlnUmVjICpzYyA9IG15U3J2Q29uZmlnKHItPnNlcnZlcik7Ci0gICAgU1NMRGlyQ29uZmlnUmVjICpkYyA9IG15RGlyQ29uZmlnKHIpOwotICAgIGNoYXIgYjFbTUFYX1NUUklOR19MRU5dLCBiMltNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciAqY2xpZW50ZG47Ci0gICAgY29uc3QgY2hhciAqY3BBTDsKLSAgICBjb25zdCBjaGFyICpjcFVOOwotICAgIGNvbnN0IGNoYXIgKmNwUFc7Ci0KLSAgICAvKgotICAgICAqIEFkZGl0aW9uYWxseSBmb3JiaWQgYWNjZXNzIChhZ2FpbikKLSAgICAgKiB3aGVuIHN0cmljdCByZXF1aXJlIG9wdGlvbiBpcyB1c2VkLgotICAgICAqLwotICAgIGlmICggICAoZGMtPm5PcHRpb25zICYgU1NMX09QVF9TVFJJQ1RSRVFVSVJFKQotICAgICAgICAmJiAoYXBfdGFibGVfZ2V0KHItPm5vdGVzLCAic3NsLWFjY2Vzcy1mb3JiaWRkZW4iKSAhPSBOVUxMKSkKLSAgICAgICAgcmV0dXJuIEZPUkJJRERFTjsKLQotICAgIC8qCi0gICAgICogTWFrZSBzdXJlIHRoZSB1c2VyIGlzIG5vdCBhYmxlIHRvIGZha2UgdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZQotICAgICAqIGJhc2VkIGF1dGhlbnRpY2F0aW9uIGJ5IGp1c3QgZW50ZXJpbmcgYW4gWC41MDkgU3ViamVjdCBETgotICAgICAqICgiL1hYPVlZWS9YWD1ZWVkvLi4iKSBhcyB0aGUgdXNlcm5hbWUgYW5kICJwYXNzd29yZCIgYXMgdGhlCi0gICAgICogcGFzc3dvcmQuCi0gICAgICovCi0gICAgaWYgKChjcEFMID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJBdXRob3JpemF0aW9uIikpICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHN0cmNFUShhcF9nZXR3b3JkKHItPnBvb2wsICZjcEFMLCAnICcpLCAiQmFzaWMiKSkgewotICAgICAgICAgICAgd2hpbGUgKCpjcEFMID09ICcgJyB8fCAqY3BBTCA9PSAnXHQnKQotICAgICAgICAgICAgICAgIGNwQUwrKzsKLSAgICAgICAgICAgIGNwQUwgPSBhcF9wYmFzZTY0ZGVjb2RlKHItPnBvb2wsIGNwQUwpOwotICAgICAgICAgICAgY3BVTiA9IGFwX2dldHdvcmRfbnVsbHMoci0+cG9vbCwgJmNwQUwsICc6Jyk7Ci0gICAgICAgICAgICBjcFBXID0gY3BBTDsKLSAgICAgICAgICAgIGlmIChjcFVOWzBdID09ICcvJyAmJiBzdHJFUShjcFBXLCAicGFzc3dvcmQiKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gRk9SQklEREVOOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBXZSBkZWNsaW5lIG9wZXJhdGlvbiBpbiB2YXJpb3VzIHNpdHVhdGlvbnMuLi4KLSAgICAgKi8KLSAgICBpZiAoIXNjLT5iRW5hYmxlZCkKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIGlmIChhcF9jdHhfZ2V0KHItPmNvbm5lY3Rpb24tPmNsaWVudC0+Y3R4LCAic3NsIikgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIGlmICghKGRjLT5uT3B0aW9ucyAmIFNTTF9PUFRfRkFLRUJBU0lDQVVUSCkpCi0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICBpZiAoci0+Y29ubmVjdGlvbi0+dXNlcikKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIGlmICgoY2xpZW50ZG4gPSAoY2hhciAqKWFwX2N0eF9nZXQoci0+Y29ubmVjdGlvbi0+Y2xpZW50LT5jdHgsICJzc2w6OmNsaWVudDo6ZG4iKSkgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotCi0gICAgLyoKLSAgICAgKiBGYWtlIGEgcGFzc3dvcmQgLSB3aGljaCBvbmUgd291bGQgYmUgaW1tYXRlcmlhbCwgYXMsIGl0IHNlZW1zLCBhbiBlbXB0eQotICAgICAqIHBhc3N3b3JkIGluIHRoZSB1c2VycyBmaWxlIHdvdWxkIG1hdGNoIEFMTCBpbmNvbWluZyBwYXNzd29yZHMsIGlmIG9ubHkKLSAgICAgKiB3ZSB3ZXJlIHVzaW5nIHRoZSBzdGFuZGFyZCBjcnlwdCBsaWJyYXJ5IHJvdXRpbmUuIFVuZm9ydHVuYXRlbHksIE9wZW5TU0wKLSAgICAgKiAiZml4ZXMiIGEgImJ1ZyIgaW4gY3J5cHQgYW5kIHRodXMgcHJldmVudHMgYmxhbmsgcGFzc3dvcmRzIGZyb20KLSAgICAgKiB3b3JraW5nLiAgKElNSE8gd2hhdCB0aGV5IHJlYWxseSBmaXggaXMgYSBidWcgaW4gdGhlIHVzZXJzIG9mIHRoZSBjb2RlCi0gICAgICogLSBmYWlsaW5nIHRvIHByb2dyYW0gY29ycmVjdGx5IGZvciBzaGFkb3cgcGFzc3dvcmRzKS4gIFdlIG5lZWQsCi0gICAgICogdGhlcmVmb3JlLCB0byBwcm92aWRlIGEgcGFzc3dvcmQuIFRoaXMgcGFzc3dvcmQgY2FuIGJlIG1hdGNoZWQgYnkKLSAgICAgKiBhZGRpbmcgdGhlIHN0cmluZyAieHhqMzFaTVRaemtWQSIgYXMgdGhlIHBhc3N3b3JkIGluIHRoZSB1c2VyIGZpbGUuCi0gICAgICogVGhpcyBpcyBqdXN0IHRoZSBjcnlwdGVkIHZhcmlhbnQgb2YgdGhlIHdvcmQgInBhc3N3b3JkIiA7LSkKLSAgICAgKi8KLSAgICBhcF9zbnByaW50ZihiMSwgc2l6ZW9mKGIxKSwgIiVzOnBhc3N3b3JkIiwgY2xpZW50ZG4pOwotICAgIHNzbF91dGlsX3V1ZW5jb2RlKGIyLCBiMSwgRkFMU0UpOwotICAgIGFwX3NucHJpbnRmKGIxLCBzaXplb2YoYjEpLCAiQmFzaWMgJXMiLCBiMik7Ci0gICAgYXBfdGFibGVfc2V0KHItPmhlYWRlcnNfaW4sICJBdXRob3JpemF0aW9uIiwgYjEpOwotICAgIHNzbF9sb2coci0+c2VydmVyLCBTU0xfTE9HX0lORk8sCi0gICAgICAgICAgICAiRmFraW5nIEhUVFAgQmFzaWMgQXV0aCBoZWFkZXI6IFwiQXV0aG9yaXphdGlvbjogJXNcIiIsIGIxKTsKLQotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotaW50IHNzbF9ob29rX1VzZXJDaGVjayhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBTU0xEaXJDb25maWdSZWMgKmRjID0gbXlEaXJDb25maWcocik7Ci0KLSAgICAvKgotICAgICAqIEFkZGl0aW9uYWxseSBmb3JiaWQgYWNjZXNzIChhZ2FpbikKLSAgICAgKiB3aGVuIHN0cmljdCByZXF1aXJlIG9wdGlvbiBpcyB1c2VkLgotICAgICAqLwotICAgIGlmICggICAoZGMtPm5PcHRpb25zICYgU1NMX09QVF9TVFJJQ1RSRVFVSVJFKQotICAgICAgICAmJiAoYXBfdGFibGVfZ2V0KHItPm5vdGVzLCAic3NsLWFjY2Vzcy1mb3JiaWRkZW4iKSAhPSBOVUxMKSkKLSAgICAgICAgcmV0dXJuIEZPUkJJRERFTjsKLQotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotLyoKLSAqICAgRml4dXAgSGFuZGxlcgotICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpzc2xfaG9va19GaXh1cF92YXJzW10gPSB7Ci0gICAgIlNTTF9WRVJTSU9OX0lOVEVSRkFDRSIsCi0gICAgIlNTTF9WRVJTSU9OX0xJQlJBUlkiLAotICAgICJTU0xfUFJPVE9DT0wiLAotICAgICJTU0xfQ0lQSEVSIiwKLSAgICAiU1NMX0NJUEhFUl9FWFBPUlQiLAotICAgICJTU0xfQ0lQSEVSX1VTRUtFWVNJWkUiLAotICAgICJTU0xfQ0lQSEVSX0FMR0tFWVNJWkUiLAotICAgICJTU0xfQ0xJRU5UX1ZFUklGWSIsCi0gICAgIlNTTF9DTElFTlRfTV9WRVJTSU9OIiwKLSAgICAiU1NMX0NMSUVOVF9NX1NFUklBTCIsCi0gICAgIlNTTF9DTElFTlRfVl9TVEFSVCIsCi0gICAgIlNTTF9DTElFTlRfVl9FTkQiLAotICAgICJTU0xfQ0xJRU5UX1NfRE4iLAotICAgICJTU0xfQ0xJRU5UX1NfRE5fQyIsCi0gICAgIlNTTF9DTElFTlRfU19ETl9TVCIsCi0gICAgIlNTTF9DTElFTlRfU19ETl9MIiwKLSAgICAiU1NMX0NMSUVOVF9TX0ROX08iLAotICAgICJTU0xfQ0xJRU5UX1NfRE5fT1UiLAotICAgICJTU0xfQ0xJRU5UX1NfRE5fQ04iLAotICAgICJTU0xfQ0xJRU5UX1NfRE5fVCIsCi0gICAgIlNTTF9DTElFTlRfU19ETl9JIiwKLSAgICAiU1NMX0NMSUVOVF9TX0ROX0ciLAotICAgICJTU0xfQ0xJRU5UX1NfRE5fUyIsCi0gICAgIlNTTF9DTElFTlRfU19ETl9EIiwKLSAgICAiU1NMX0NMSUVOVF9TX0ROX1VJRCIsCi0gICAgIlNTTF9DTElFTlRfU19ETl9FbWFpbCIsCi0gICAgIlNTTF9DTElFTlRfSV9ETiIsCi0gICAgIlNTTF9DTElFTlRfSV9ETl9DIiwKLSAgICAiU1NMX0NMSUVOVF9JX0ROX1NUIiwKLSAgICAiU1NMX0NMSUVOVF9JX0ROX0wiLAotICAgICJTU0xfQ0xJRU5UX0lfRE5fTyIsCi0gICAgIlNTTF9DTElFTlRfSV9ETl9PVSIsCi0gICAgIlNTTF9DTElFTlRfSV9ETl9DTiIsCi0gICAgIlNTTF9DTElFTlRfSV9ETl9UIiwKLSAgICAiU1NMX0NMSUVOVF9JX0ROX0kiLAotICAgICJTU0xfQ0xJRU5UX0lfRE5fRyIsCi0gICAgIlNTTF9DTElFTlRfSV9ETl9TIiwKLSAgICAiU1NMX0NMSUVOVF9JX0ROX0QiLAotICAgICJTU0xfQ0xJRU5UX0lfRE5fVUlEIiwKLSAgICAiU1NMX0NMSUVOVF9JX0ROX0VtYWlsIiwKLSAgICAiU1NMX0NMSUVOVF9BX0tFWSIsCi0gICAgIlNTTF9DTElFTlRfQV9TSUciLAotICAgICJTU0xfU0VSVkVSX01fVkVSU0lPTiIsCi0gICAgIlNTTF9TRVJWRVJfTV9TRVJJQUwiLAotICAgICJTU0xfU0VSVkVSX1ZfU1RBUlQiLAotICAgICJTU0xfU0VSVkVSX1ZfRU5EIiwKLSAgICAiU1NMX1NFUlZFUl9TX0ROIiwKLSAgICAiU1NMX1NFUlZFUl9TX0ROX0MiLAotICAgICJTU0xfU0VSVkVSX1NfRE5fU1QiLAotICAgICJTU0xfU0VSVkVSX1NfRE5fTCIsCi0gICAgIlNTTF9TRVJWRVJfU19ETl9PIiwKLSAgICAiU1NMX1NFUlZFUl9TX0ROX09VIiwKLSAgICAiU1NMX1NFUlZFUl9TX0ROX0NOIiwKLSAgICAiU1NMX1NFUlZFUl9TX0ROX1QiLAotICAgICJTU0xfU0VSVkVSX1NfRE5fSSIsCi0gICAgIlNTTF9TRVJWRVJfU19ETl9HIiwKLSAgICAiU1NMX1NFUlZFUl9TX0ROX1MiLAotICAgICJTU0xfU0VSVkVSX1NfRE5fRCIsCi0gICAgIlNTTF9TRVJWRVJfU19ETl9VSUQiLAotICAgICJTU0xfU0VSVkVSX1NfRE5fRW1haWwiLAotICAgICJTU0xfU0VSVkVSX0lfRE4iLAotICAgICJTU0xfU0VSVkVSX0lfRE5fQyIsCi0gICAgIlNTTF9TRVJWRVJfSV9ETl9TVCIsCi0gICAgIlNTTF9TRVJWRVJfSV9ETl9MIiwKLSAgICAiU1NMX1NFUlZFUl9JX0ROX08iLAotICAgICJTU0xfU0VSVkVSX0lfRE5fT1UiLAotICAgICJTU0xfU0VSVkVSX0lfRE5fQ04iLAotICAgICJTU0xfU0VSVkVSX0lfRE5fVCIsCi0gICAgIlNTTF9TRVJWRVJfSV9ETl9JIiwKLSAgICAiU1NMX1NFUlZFUl9JX0ROX0ciLAotICAgICJTU0xfU0VSVkVSX0lfRE5fUyIsCi0gICAgIlNTTF9TRVJWRVJfSV9ETl9EIiwKLSAgICAiU1NMX1NFUlZFUl9JX0ROX1VJRCIsCi0gICAgIlNTTF9TRVJWRVJfSV9ETl9FbWFpbCIsCi0gICAgIlNTTF9TRVJWRVJfQV9LRVkiLAotICAgICJTU0xfU0VSVkVSX0FfU0lHIiwKLSAgICAiU1NMX1NFU1NJT05fSUQiLAotICAgIE5VTEwKLX07Ci0KLWludCBzc2xfaG9va19GaXh1cChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBTU0xTcnZDb25maWdSZWMgKnNjID0gbXlTcnZDb25maWcoci0+c2VydmVyKTsKLSAgICBTU0xEaXJDb25maWdSZWMgKmRjID0gbXlEaXJDb25maWcocik7Ci0gICAgdGFibGUgKmUgPSByLT5zdWJwcm9jZXNzX2VudjsKLSAgICBjaGFyICp2YXI7Ci0gICAgY2hhciAqdmFsOwotICAgIFNUQUNLX09GKFg1MDkpICpzazsKLSAgICBTU0wgKnNzbDsKLSAgICBpbnQgaTsKLQotICAgIC8qCi0gICAgICogQ2hlY2sgdG8gc2VlIGlmIFNTTCBpcyBvbgotICAgICAqLwotICAgIGlmICghc2MtPmJFbmFibGVkKQotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgaWYgKChzc2wgPSBhcF9jdHhfZ2V0KHItPmNvbm5lY3Rpb24tPmNsaWVudC0+Y3R4LCAic3NsIikpID09IE5VTEwpCi0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLQotICAgIC8qCi0gICAgICogQW5ub3RhdGUgdGhlIFNTSS9DR0kgZW52aXJvbm1lbnQgd2l0aCBzdGFuZGFyZCBTU0wgaW5mb3JtYXRpb24KLSAgICAgKi8KLSAgICAvKiB0aGUgYWx3YXlzIHByZXNlbnQgSFRUUFMgKD1IVFRQIG92ZXIgU1NMKSBmbGFnISAqLwotICAgIGFwX3RhYmxlX3NldChlLCAiSFRUUFMiLCAib24iKTsgCi0gICAgLyogc3RhbmRhcmQgU1NMIGVudmlyb25tZW50IHZhcmlhYmxlcyAqLwotICAgIGlmIChkYy0+bk9wdGlvbnMgJiBTU0xfT1BUX1NUREVOVlZBUlMpIHsKLSAgICAgICAgZm9yIChpID0gMDsgc3NsX2hvb2tfRml4dXBfdmFyc1tpXSAhPSBOVUxMOyBpKyspIHsKLSAgICAgICAgICAgIHZhciA9IChjaGFyICopc3NsX2hvb2tfRml4dXBfdmFyc1tpXTsKLSAgICAgICAgICAgIHZhbCA9IHNzbF92YXJfbG9va3VwKHItPnBvb2wsIHItPnNlcnZlciwgci0+Y29ubmVjdGlvbiwgciwgdmFyKTsKLSAgICAgICAgICAgIGlmICghc3RySXNFbXB0eSh2YWwpKQotICAgICAgICAgICAgICAgIGFwX3RhYmxlX3NldChlLCB2YXIsIHZhbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE9uLWRlbWFuZCBibG9hdCB1cCB0aGUgU1NJL0NHSSBlbnZpcm9ubWVudCB3aXRoIGNlcnRpZmljYXRlIGRhdGEKLSAgICAgKi8KLSAgICBpZiAoZGMtPm5PcHRpb25zICYgU1NMX09QVF9FWFBPUlRDRVJUREFUQSkgewotICAgICAgICB2YWwgPSBzc2xfdmFyX2xvb2t1cChyLT5wb29sLCByLT5zZXJ2ZXIsIHItPmNvbm5lY3Rpb24sIHIsICJTU0xfU0VSVkVSX0NFUlQiKTsKLSAgICAgICAgYXBfdGFibGVfc2V0KGUsICJTU0xfU0VSVkVSX0NFUlQiLCB2YWwpOwotICAgICAgICB2YWwgPSBzc2xfdmFyX2xvb2t1cChyLT5wb29sLCByLT5zZXJ2ZXIsIHItPmNvbm5lY3Rpb24sIHIsICJTU0xfQ0xJRU5UX0NFUlQiKTsKLSAgICAgICAgYXBfdGFibGVfc2V0KGUsICJTU0xfQ0xJRU5UX0NFUlQiLCB2YWwpOwotICAgICAgICBpZiAoKHNrID0gU1NMX2dldF9wZWVyX2NlcnRfY2hhaW4oc3NsKSkgIT0gTlVMTCkgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfbnVtKHNrKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdmFyID0gYXBfcHNwcmludGYoci0+cG9vbCwgIlNTTF9DTElFTlRfQ0VSVF9DSEFJTl8lZCIsIGkpOwotICAgICAgICAgICAgICAgIHZhbCA9IHNzbF92YXJfbG9va3VwKHItPnBvb2wsIHItPnNlcnZlciwgci0+Y29ubmVjdGlvbiwgciwgdmFyKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICBhcF90YWJsZV9zZXQoZSwgdmFyLCB2YWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBPbi1kZW1hbmQgYmxvYXQgdXAgdGhlIFNTSS9DR0kgZW52aXJvbm1lbnQgd2l0aCBjb21wYXQgdmFyaWFibGVzCi0gICAgICovCi0jaWZkZWYgU1NMX0NPTVBBVAotICAgIGlmIChkYy0+bk9wdGlvbnMgJiBTU0xfT1BUX0NPTVBBVEVOVlZBUlMpCi0gICAgICAgIHNzbF9jb21wYXRfdmFyaWFibGVzKHIpOwotI2VuZGlmCi0KLSAgICByZXR1cm4gREVDTElORUQ7Ci19Ci0KLS8qICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICBPcGVuU1NMIENhbGxiYWNrIEZ1bmN0aW9ucwotKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qLwotCi0vKgotICogSGFuZGxlIG91dCB0ZW1wb3JhcnkgUlNBIHByaXZhdGUga2V5cyBvbiBkZW1hbmQKLSAqCi0gKiBUaGUgYmFja2dyb3VuZCBvZiB0aGlzIGFzIHRoZSBUTFN2MSBzdGFuZGFyZCBleHBsYWlucyBpdDoKLSAqCi0gKiB8IEQuMS4gVGVtcG9yYXJ5IFJTQSBrZXlzCi0gKiB8Ci0gKiB8ICAgIFVTIEV4cG9ydCByZXN0cmljdGlvbnMgbGltaXQgUlNBIGtleXMgdXNlZCBmb3IgZW5jcnlwdGlvbiB0byA1MTIKLSAqIHwgICAgYml0cywgYnV0IGRvIG5vdCBwbGFjZSBhbnkgbGltaXQgb24gbGVuZ3RocyBvZiBSU0Ega2V5cyB1c2VkIGZvcgotICogfCAgICBzaWduaW5nIG9wZXJhdGlvbnMuIENlcnRpZmljYXRlcyBvZnRlbiBuZWVkIHRvIGJlIGxhcmdlciB0aGFuIDUxMgotICogfCAgICBiaXRzLCBzaW5jZSA1MTItYml0IFJTQSBrZXlzIGFyZSBub3Qgc2VjdXJlIGVub3VnaCBmb3IgaGlnaC12YWx1ZQotICogfCAgICB0cmFuc2FjdGlvbnMgb3IgZm9yIGFwcGxpY2F0aW9ucyByZXF1aXJpbmcgbG9uZy10ZXJtIHNlY3VyaXR5LiBTb21lCi0gKiB8ICAgIGNlcnRpZmljYXRlcyBhcmUgYWxzbyBkZXNpZ25hdGVkIHNpZ25pbmctb25seSwgaW4gd2hpY2ggY2FzZSB0aGV5Ci0gKiB8ICAgIGNhbm5vdCBiZSB1c2VkIGZvciBrZXkgZXhjaGFuZ2UuCi0gKiB8Ci0gKiB8ICAgIFdoZW4gdGhlIHB1YmxpYyBrZXkgaW4gdGhlIGNlcnRpZmljYXRlIGNhbm5vdCBiZSB1c2VkIGZvciBlbmNyeXB0aW9uLAotICogfCAgICB0aGUgc2VydmVyIHNpZ25zIGEgdGVtcG9yYXJ5IFJTQSBrZXksIHdoaWNoIGlzIHRoZW4gZXhjaGFuZ2VkLiBJbgotICogfCAgICBleHBvcnRhYmxlIGFwcGxpY2F0aW9ucywgdGhlIHRlbXBvcmFyeSBSU0Ega2V5IHNob3VsZCBiZSB0aGUgbWF4aW11bQotICogfCAgICBhbGxvd2FibGUgbGVuZ3RoIChpLmUuLCA1MTIgYml0cykuIEJlY2F1c2UgNTEyLWJpdCBSU0Ega2V5cyBhcmUKLSAqIHwgICAgcmVsYXRpdmVseSBpbnNlY3VyZSwgdGhleSBzaG91bGQgYmUgY2hhbmdlZCBvZnRlbi4gRm9yIHR5cGljYWwKLSAqIHwgICAgZWxlY3Ryb25pYyBjb21tZXJjZSBhcHBsaWNhdGlvbnMsIGl0IGlzIHN1Z2dlc3RlZCB0aGF0IGtleXMgYmUKLSAqIHwgICAgY2hhbmdlZCBkYWlseSBvciBldmVyeSA1MDAgdHJhbnNhY3Rpb25zLCBhbmQgbW9yZSBvZnRlbiBpZiBwb3NzaWJsZS4KLSAqIHwgICAgTm90ZSB0aGF0IHdoaWxlIGl0IGlzIGFjY2VwdGFibGUgdG8gdXNlIHRoZSBzYW1lIHRlbXBvcmFyeSBrZXkgZm9yCi0gKiB8ICAgIG11bHRpcGxlIHRyYW5zYWN0aW9ucywgaXQgbXVzdCBiZSBzaWduZWQgZWFjaCB0aW1lIGl0IGlzIHVzZWQuCi0gKiB8Ci0gKiB8ICAgIFJTQSBrZXkgZ2VuZXJhdGlvbiBpcyBhIHRpbWUtY29uc3VtaW5nIHByb2Nlc3MuIEluIG1hbnkgY2FzZXMsIGEKLSAqIHwgICAgbG93LXByaW9yaXR5IHByb2Nlc3MgY2FuIGJlIGFzc2lnbmVkIHRoZSB0YXNrIG9mIGtleSBnZW5lcmF0aW9uLgotICogfCAgICBXaGVuZXZlciBhIG5ldyBrZXkgaXMgY29tcGxldGVkLCB0aGUgZXhpc3RpbmcgdGVtcG9yYXJ5IGtleSBjYW4gYmUKLSAqIHwgICAgcmVwbGFjZWQgd2l0aCB0aGUgbmV3IG9uZS4KLSAqCi0gKiBTbyB3ZSBnZW5lcmF0ZWQgNTEyIGFuZCAxMDI0IGJpdCB0ZW1wb3Jhcnkga2V5cyBvbiBzdGFydHVwCi0gKiB3aGljaCB3ZSBub3cganVzdCBoYW5kbGUgb3V0IG9uIGRlbWFuZC4uLi4KLSAqLwotUlNBICpzc2xfY2FsbGJhY2tfVG1wUlNBKFNTTCAqcFNTTCwgaW50IG5FeHBvcnQsIGludCBuS2V5TGVuKQotewotICAgIFNTTE1vZENvbmZpZ1JlYyAqbWMgPSBteU1vZENvbmZpZygpOwotICAgIFJTQSAqcnNhOwotCi0gICAgcnNhID0gTlVMTDsKLSAgICBpZiAobkV4cG9ydCkgewotICAgICAgICAvKiBJdCdzIGJlY2F1c2UgYW4gZXhwb3J0IGNpcGhlciBpcyB1c2VkICovCi0gICAgICAgIGlmIChuS2V5TGVuID09IDUxMikKLSAgICAgICAgICAgIHJzYSA9IChSU0EgKiltYy0+cFRtcEtleXNbU1NMX1RLUElEWF9SU0E1MTJdOwotICAgICAgICBlbHNlIGlmIChuS2V5TGVuID09IDEwMjQpCi0gICAgICAgICAgICByc2EgPSAoUlNBICopbWMtPnBUbXBLZXlzW1NTTF9US1BJRFhfUlNBMTAyNF07Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIC8qIGl0J3MgdG9vIGV4cGVuc2l2ZSB0byBnZW5lcmF0ZSBvbi10aGUtZmx5LCBzbyBrZWVwIDEwMjRiaXQgKi8KLSAgICAgICAgICAgIHJzYSA9IChSU0EgKiltYy0+cFRtcEtleXNbU1NMX1RLUElEWF9SU0ExMDI0XTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIEl0J3MgYmVjYXVzZSBhIHNpZ24tb25seSBjZXJ0aWZpY2F0ZSBzaXR1YXRpb24gZXhpc3RzICovCi0gICAgICAgIHJzYSA9IChSU0EgKiltYy0+cFRtcEtleXNbU1NMX1RLUElEWF9SU0ExMDI0XTsKLSAgICB9Ci0gICAgcmV0dXJuIHJzYTsKLX0KLQotLyogCi0gKiBIYW5kbGUgb3V0IHRoZSBhbHJlYWR5IGdlbmVyYXRlZCBESCBwYXJhbWV0ZXJzLi4uCi0gKi8KLURIICpzc2xfY2FsbGJhY2tfVG1wREgoU1NMICpwU1NMLCBpbnQgbkV4cG9ydCwgaW50IG5LZXlMZW4pCi17Ci0gICAgU1NMTW9kQ29uZmlnUmVjICptYyA9IG15TW9kQ29uZmlnKCk7Ci0gICAgREggKmRoOwotCi0gICAgZGggPSBOVUxMOwotICAgIGlmIChuRXhwb3J0KSB7Ci0gICAgICAgIC8qIEl0J3MgYmVjYXVzZSBhbiBleHBvcnQgY2lwaGVyIGlzIHVzZWQgKi8KLSAgICAgICAgaWYgKG5LZXlMZW4gPT0gNTEyKQotICAgICAgICAgICAgZGggPSAoREggKiltYy0+cFRtcEtleXNbU1NMX1RLUElEWF9ESDUxMl07Ci0gICAgICAgIGVsc2UgaWYgKG5LZXlMZW4gPT0gMTAyNCkKLSAgICAgICAgICAgIGRoID0gKERIICopbWMtPnBUbXBLZXlzW1NTTF9US1BJRFhfREgxMDI0XTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgLyogaXQncyB0b28gZXhwZW5zaXZlIHRvIGdlbmVyYXRlIG9uLXRoZS1mbHksIHNvIGtlZXAgMTAyNGJpdCAqLwotICAgICAgICAgICAgZGggPSAoREggKiltYy0+cFRtcEtleXNbU1NMX1RLUElEWF9ESDEwMjRdOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogSXQncyBiZWNhdXNlIGEgc2lnbi1vbmx5IGNlcnRpZmljYXRlIHNpdHVhdGlvbiBleGlzdHMgKi8KLSAgICAgICAgZGggPSAoREggKiltYy0+cFRtcEtleXNbU1NMX1RLUElEWF9ESDEwMjRdOwotICAgIH0KLSAgICByZXR1cm4gZGg7Ci19Ci0KLS8qCi0gKiBUaGlzIE9wZW5TU0wgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gT3BlblNTTAotICogZG9lcyBjbGllbnQgYXV0aGVudGljYXRpb24gYW5kIHZlcmlmaWVzIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbi4KLSAqLwotaW50IHNzbF9jYWxsYmFja19TU0xWZXJpZnkoaW50IG9rLCBYNTA5X1NUT1JFX0NUWCAqY3R4KQotewotICAgIFNTTCAqc3NsOwotICAgIGNvbm5fcmVjICpjb25uOwotICAgIHNlcnZlcl9yZWMgKnM7Ci0gICAgcmVxdWVzdF9yZWMgKnI7Ci0gICAgU1NMU3J2Q29uZmlnUmVjICpzYzsKLSAgICBTU0xEaXJDb25maWdSZWMgKmRjOwotICAgIGFwX2N0eCAqYWN0eDsKLSAgICBYNTA5ICp4czsKLSAgICBpbnQgZXJybnVtOwotICAgIGludCBlcnJkZXB0aDsKLSAgICBjaGFyICpjcDsKLSAgICBjaGFyICpjcDI7Ci0gICAgaW50IGRlcHRoOwotICAgIGludCB2ZXJpZnk7Ci0KLSAgICAvKgotICAgICAqIEdldCBBcGFjaGUgY29udGV4dCBiYWNrIHRocm91Z2ggT3BlblNTTCBjb250ZXh0Ci0gICAgICovCi0gICAgc3NsICA9IChTU0wgKilYNTA5X1NUT1JFX0NUWF9nZXRfYXBwX2RhdGEoY3R4KTsKLSAgICBjb25uID0gKGNvbm5fcmVjICopU1NMX2dldF9hcHBfZGF0YShzc2wpOwotICAgIGFjdHggPSAoYXBfY3R4ICopU1NMX2dldF9hcHBfZGF0YTIoc3NsKTsKLSAgICByICAgID0gKHJlcXVlc3RfcmVjICopYXBfY3R4X2dldChhY3R4LCAic3NsOjpyZXF1ZXN0X3JlYyIpOwotICAgIHMgICAgPSBjb25uLT5zZXJ2ZXI7Ci0gICAgc2MgICA9IG15U3J2Q29uZmlnKHMpOwotICAgIGRjICAgPSAociAhPSBOVUxMID8gbXlEaXJDb25maWcocikgOiBOVUxMKTsKLQotICAgIC8qCi0gICAgICogR2V0IHZlcmlmeSBpbmdyZWRpZW50cwotICAgICAqLwotICAgIHhzICAgICAgID0gWDUwOV9TVE9SRV9DVFhfZ2V0X2N1cnJlbnRfY2VydChjdHgpOwotICAgIGVycm51bSAgID0gWDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yKGN0eCk7Ci0gICAgZXJyZGVwdGggPSBYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3JfZGVwdGgoY3R4KTsKLQotICAgIC8qCi0gICAgICogTG9nIHZlcmlmaWNhdGlvbiBpbmZvcm1hdGlvbgotICAgICAqLwotICAgIGNwICA9IFg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X3N1YmplY3RfbmFtZSh4cyksIE5VTEwsIDApOwotICAgIGNwMiA9IFg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKHhzKSwgIE5VTEwsIDApOwotICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwKLSAgICAgICAgICAgICJDZXJ0aWZpY2F0ZSBWZXJpZmljYXRpb246IGRlcHRoOiAlZCwgc3ViamVjdDogJXMsIGlzc3VlcjogJXMiLAotICAgICAgICAgICAgZXJyZGVwdGgsIGNwICE9IE5VTEwgPyBjcCA6ICItdW5rbm93bi0iLAotICAgICAgICAgICAgY3AyICE9IE5VTEwgPyBjcDIgOiAiLXVua25vd24iKTsKLSAgICBpZiAoY3ApCi0gICAgICAgIGZyZWUoY3ApOwotICAgIGlmIChjcDIpCi0gICAgICAgIGZyZWUoY3AyKTsKLQotICAgIC8qCi0gICAgICogQ2hlY2sgZm9yIG9wdGlvbmFsbHkgYWNjZXB0YWJsZSBub24tdmVyaWZpYWJsZSBpc3N1ZXIgc2l0dWF0aW9uCi0gICAgICovCi0gICAgaWYgKGRjICE9IE5VTEwgJiYgZGMtPm5WZXJpZnlDbGllbnQgIT0gU1NMX0NWRVJJRllfVU5TRVQpCi0gICAgICAgIHZlcmlmeSA9IGRjLT5uVmVyaWZ5Q2xpZW50OwotICAgIGVsc2UKLSAgICAgICAgdmVyaWZ5ID0gc2MtPm5WZXJpZnlDbGllbnQ7Ci0gICAgaWYgKCAgICggICBlcnJudW0gPT0gWDUwOV9WX0VSUl9ERVBUSF9aRVJPX1NFTEZfU0lHTkVEX0NFUlQKLSAgICAgICAgICAgIHx8IGVycm51bSA9PSBYNTA5X1ZfRVJSX1NFTEZfU0lHTkVEX0NFUlRfSU5fQ0hBSU4KLSAgICAgICAgICAgIHx8IGVycm51bSA9PSBYNTA5X1ZfRVJSX1VOQUJMRV9UT19HRVRfSVNTVUVSX0NFUlRfTE9DQUxMWQotI2lmIFNTTF9MSUJSQVJZX1ZFUlNJT04gPj0gMHgwMDkwNTAwMAotICAgICAgICAgICAgfHwgZXJybnVtID09IFg1MDlfVl9FUlJfQ0VSVF9VTlRSVVNURUQKLSNlbmRpZgotICAgICAgICAgICAgfHwgZXJybnVtID09IFg1MDlfVl9FUlJfVU5BQkxFX1RPX1ZFUklGWV9MRUFGX1NJR05BVFVSRSAgKQotICAgICAgICAmJiB2ZXJpZnkgPT0gU1NMX0NWRVJJRllfT1BUSU9OQUxfTk9fQ0EgICAgICAgICAgICAgICAgICAgICAgICkgewotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsCi0gICAgICAgICAgICAgICAgIkNlcnRpZmljYXRlIFZlcmlmaWNhdGlvbjogVmVyaWZpYWJsZSBJc3N1ZXIgaXMgY29uZmlndXJlZCBhcyAiCi0gICAgICAgICAgICAgICAgIm9wdGlvbmFsLCB0aGVyZWZvcmUgd2UncmUgYWNjZXB0aW5nIHRoZSBjZXJ0aWZpY2F0ZSIpOwotICAgICAgICBhcF9jdHhfc2V0KGNvbm4tPmNsaWVudC0+Y3R4LCAic3NsOjp2ZXJpZnk6OmluZm8iLCAiR0VORVJPVVMiKTsKLSAgICAgICAgb2sgPSBUUlVFOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQWRkaXRpb25hbGx5IHBlcmZvcm0gQ1JMLWJhc2VkIHJldm9jYXRpb24gY2hlY2tzCi0gICAgICovCi0gICAgaWYgKG9rKSB7Ci0gICAgICAgIG9rID0gc3NsX2NhbGxiYWNrX1NTTFZlcmlmeV9DUkwob2ssIGN0eCwgcyk7Ci0gICAgICAgIGlmICghb2spCi0gICAgICAgICAgICBlcnJudW0gPSBYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3IoY3R4KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIElmIHdlIGFscmVhZHkga25vdyBpdCdzIG5vdCBvaywgbG9nIHRoZSByZWFsIHJlYXNvbgotICAgICAqLwotICAgIGlmICghb2spIHsKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SLCAiQ2VydGlmaWNhdGUgVmVyaWZpY2F0aW9uOiBFcnJvciAoJWQpOiAlcyIsCi0gICAgICAgICAgICAgICAgZXJybnVtLCBYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhlcnJudW0pKTsKLSAgICAgICAgYXBfY3R4X3NldChjb25uLT5jbGllbnQtPmN0eCwgInNzbDo6Y2xpZW50OjpkbiIsIE5VTEwpOwotICAgICAgICBhcF9jdHhfc2V0KGNvbm4tPmNsaWVudC0+Y3R4LCAic3NsOjp2ZXJpZnk6OmVycm9yIiwKLSAgICAgICAgICAgICAgICAgICAodm9pZCAqKVg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKGVycm51bSkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRmluYWxseSBjaGVjayB0aGUgZGVwdGggb2YgdGhlIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbgotICAgICAqLwotICAgIGlmIChkYyAhPSBOVUxMICYmIGRjLT5uVmVyaWZ5RGVwdGggIT0gVU5TRVQpCi0gICAgICAgIGRlcHRoID0gZGMtPm5WZXJpZnlEZXB0aDsKLSAgICBlbHNlCi0gICAgICAgIGRlcHRoID0gc2MtPm5WZXJpZnlEZXB0aDsKLSAgICBpZiAoZXJyZGVwdGggPiBkZXB0aCkgewotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgIkNlcnRpZmljYXRlIFZlcmlmaWNhdGlvbjogQ2VydGlmaWNhdGUgQ2hhaW4gdG9vIGxvbmcgIgotICAgICAgICAgICAgICAgICIoY2hhaW4gaGFzICVkIGNlcnRpZmljYXRlcywgYnV0IG1heGltdW0gYWxsb3dlZCBhcmUgb25seSAlZCkiLAotICAgICAgICAgICAgICAgIGVycmRlcHRoLCBkZXB0aCk7Ci0gICAgICAgIGFwX2N0eF9zZXQoY29ubi0+Y2xpZW50LT5jdHgsICJzc2w6OnZlcmlmeTo6ZXJyb3IiLAotICAgICAgICAgICAgICAgICAgICh2b2lkICopWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcoWDUwOV9WX0VSUl9DRVJUX0NIQUlOX1RPT19MT05HKSk7Ci0gICAgICAgIG9rID0gRkFMU0U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBBbmQgZmluYWxseSBzaWduYWwgT3BlblNTTCB0aGUgKHBlcmhhcHMgY2hhbmdlZCkgc3RhdGUKLSAgICAgKi8KLSAgICByZXR1cm4gKG9rKTsKLX0KLQotaW50IHNzbF9jYWxsYmFja19TU0xWZXJpZnlfQ1JMKAotICAgIGludCBvaywgWDUwOV9TVE9SRV9DVFggKmN0eCwgc2VydmVyX3JlYyAqcykKLXsKLSAgICBTU0xTcnZDb25maWdSZWMgKnNjOwotICAgIFg1MDlfT0JKRUNUIG9iajsKLSAgICBYNTA5X05BTUUgKnN1YmplY3Q7Ci0gICAgWDUwOV9OQU1FICppc3N1ZXI7Ci0gICAgWDUwOSAqeHM7Ci0gICAgWDUwOV9DUkwgKmNybDsKLSAgICBYNTA5X1JFVk9LRUQgKnJldm9rZWQ7Ci0gICAgbG9uZyBzZXJpYWw7Ci0gICAgQklPICpiaW87Ci0gICAgaW50IGksIG4sIHJjOwotICAgIGNoYXIgKmNwOwotICAgIGNoYXIgKmNwMjsKLQotICAgIC8qCi0gICAgICogVW5sZXNzIGEgcmV2b2NhdGlvbiBzdG9yZSBmb3IgQ1JMcyB3YXMgY3JlYXRlZCB3ZQotICAgICAqIGNhbm5vdCBkbyBhbnkgQ1JMLWJhc2VkIHZlcmlmaWNhdGlvbiwgb2YgY291cnNlLgotICAgICAqLwotICAgIHNjID0gbXlTcnZDb25maWcocyk7Ci0gICAgaWYgKHNjLT5wUmV2b2NhdGlvblN0b3JlID09IE5VTEwpCi0gICAgICAgIHJldHVybiBvazsKLQotICAgIC8qCi0gICAgICogRGV0ZXJtaW5lIGNlcnRpZmljYXRlIGluZ3JlZGllbnRzIGluIGFkdmFuY2UKLSAgICAgKi8KLSAgICB4cyAgICAgID0gWDUwOV9TVE9SRV9DVFhfZ2V0X2N1cnJlbnRfY2VydChjdHgpOwotICAgIHN1YmplY3QgPSBYNTA5X2dldF9zdWJqZWN0X25hbWUoeHMpOwotICAgIGlzc3VlciAgPSBYNTA5X2dldF9pc3N1ZXJfbmFtZSh4cyk7Ci0KLSAgICAvKgotICAgICAqIE9wZW5TU0wgcHJvdmlkZXMgdGhlIGdlbmVyYWwgbWVjaGFuaXNtIHRvIGRlYWwgd2l0aCBDUkxzIGJ1dCBkb2VzIG5vdAotICAgICAqIHVzZSB0aGVtIGF1dG9tYXRpY2FsbHkgd2hlbiB2ZXJpZnlpbmcgY2VydGlmaWNhdGVzLCBzbyB3ZSBkbyBpdAotICAgICAqIGV4cGxpY2l0bHkgaGVyZS4gV2Ugd2lsbCBjaGVjayB0aGUgQ1JMIGZvciB0aGUgY3VycmVudGx5IGNoZWNrZWQKLSAgICAgKiBjZXJ0aWZpY2F0ZSwgaWYgdGhlcmUgaXMgc3VjaCBhIENSTCBpbiB0aGUgc3RvcmUuCi0gICAgICoKLSAgICAgKiBXZSBjb21lIHRocm91Z2ggdGhpcyBwcm9jZWR1cmUgZm9yIGVhY2ggY2VydGlmaWNhdGUgaW4gdGhlIGNlcnRpZmljYXRlCi0gICAgICogY2hhaW4sIHN0YXJ0aW5nIHdpdGggdGhlIHJvb3QtQ0EncyBjZXJ0aWZpY2F0ZS4gQXQgZWFjaCBzdGVwIHdlJ3ZlIHRvCi0gICAgICogYm90aCB2ZXJpZnkgdGhlIHNpZ25hdHVyZSBvbiB0aGUgQ1JMICh0byBtYWtlIHN1cmUgaXQncyBhIHZhbGlkIENSTCkKLSAgICAgKiBhbmQgaXQncyByZXZvY2F0aW9uIGxpc3QgKHRvIG1ha2Ugc3VyZSB0aGUgY3VycmVudCBjZXJ0aWZpY2F0ZSBpc24ndAotICAgICAqIHJldm9rZWQpLiAgQnV0IGJlY2F1c2UgdG8gY2hlY2sgdGhlIHNpZ25hdHVyZSBvbiB0aGUgQ1JMIHdlIG5lZWQgdGhlCi0gICAgICogcHVibGljIGtleSBvZiB0aGUgaXNzdWluZyBDQSBjZXJ0aWZpY2F0ZSAod2hpY2ggd2FzIGFscmVhZHkgcHJvY2Vzc2VkCi0gICAgICogb25lIHJvdW5kIGJlZm9yZSksIHdlJ3ZlIGEgbGl0dGxlIHByb2JsZW0uIEJ1dCB3ZSBjYW4gYm90aCBzb2x2ZSBpdCBhbmQKLSAgICAgKiBhdCB0aGUgc2FtZSB0aW1lIG9wdGltaXplIHRoZSBwcm9jZXNzaW5nIGJ5IHVzaW5nIHRoZSBmb2xsb3dpbmcKLSAgICAgKiB2ZXJpZmljYXRpb24gc2NoZW1lIChpZGVhIGFuZCBjb2RlIHNuaXBwZXRzIGJvcnJvd2VkIGZyb20gdGhlIEdMT0JVUwotICAgICAqIHByb2plY3QpOgotICAgICAqCi0gICAgICogMS4gV2UnbGwgY2hlY2sgdGhlIHNpZ25hdHVyZSBvZiBhIENSTCBpbiBlYWNoIHN0ZXAgd2hlbiB3ZSBmaW5kIGEgQ1JMCi0gICAgICogICAgdGhyb3VnaCB0aGUgX3N1YmplY3RfIG5hbWUgb2YgdGhlIGN1cnJlbnQgY2VydGlmaWNhdGUuIFRoaXMgQ1JMCi0gICAgICogICAgaXRzZWxmIHdpbGwgYmUgbmVlZGVkIHRoZSBmaXJzdCB0aW1lIGluIHRoZSBuZXh0IHJvdW5kLCBvZiBjb3Vyc2UuCi0gICAgICogICAgQnV0IHdlIGRvIHRoZSBzaWduYXR1cmUgcHJvY2Vzc2luZyBvbmUgcm91bmQgYmVmb3JlIHRoaXMgd2hlcmUgdGhlCi0gICAgICogICAgcHVibGljIGtleSBvZiB0aGUgQ0EgaXMgYXZhaWxhYmxlLgotICAgICAqCi0gICAgICogMi4gV2UnbGwgY2hlY2sgdGhlIHJldm9jYXRpb24gbGlzdCBvZiBhIENSTCBpbiBlYWNoIHN0ZXAgd2hlbgotICAgICAqICAgIHdlIGZpbmQgYSBDUkwgdGhyb3VnaCB0aGUgX2lzc3Vlcl8gbmFtZSBvZiB0aGUgY3VycmVudCBjZXJ0aWZpY2F0ZS4KLSAgICAgKiAgICBUaGlzIENSTHMgc2lnbmF0dXJlIHdhcyB0aGVuIGFscmVhZHkgdmVyaWZpZWQgb25lIHJvdW5kIGJlZm9yZS4KLSAgICAgKgotICAgICAqIFRoaXMgdmVyaWZpY2F0aW9uIHNjaGVtZSBhbGxvd3MgYSBDQSB0byByZXZva2UgaXRzIG93biBjZXJ0aWZpY2F0ZSBhcwotICAgICAqIHdlbGwsIG9mIGNvdXJzZS4KLSAgICAgKi8KLQotICAgIC8qCi0gICAgICogVHJ5IHRvIHJldHJpZXZlIGEgQ1JMIGNvcnJlc3BvbmRpbmcgdG8gdGhlIF9zdWJqZWN0XyBvZgotICAgICAqIHRoZSBjdXJyZW50IGNlcnRpZmljYXRlIGluIG9yZGVyIHRvIHZlcmlmeSBpdCdzIGludGVncml0eS4KLSAgICAgKi8KLSAgICBtZW1zZXQoKGNoYXIgKikmb2JqLCAwLCBzaXplb2Yob2JqKSk7Ci0gICAgcmMgPSBTU0xfWDUwOV9TVE9SRV9sb29rdXAoc2MtPnBSZXZvY2F0aW9uU3RvcmUsIFg1MDlfTFVfQ1JMLCBzdWJqZWN0LCAmb2JqKTsKLSAgICBjcmwgPSBvYmouZGF0YS5jcmw7Ci0gICAgaWYgKHJjID4gMCAmJiBjcmwgIT0gTlVMTCkgewotICAgICAgICAvKgotICAgICAgICAgKiBMb2cgaW5mb3JtYXRpb24gYWJvdXQgQ1JMCi0gICAgICAgICAqIChBIGxpdHRsZSBiaXQgY29tcGxpY2F0ZWQgYmVjYXVzZSBvZiBBU04uMSBhbmQgQklPcy4uLikKLSAgICAgICAgICovCi0gICAgICAgIGlmIChzc2xfbG9nX2FwcGxpZXMocywgU1NMX0xPR19UUkFDRSkpIHsKLSAgICAgICAgICAgIGJpbyA9IEJJT19uZXcoQklPX3NfbWVtKCkpOwotICAgICAgICAgICAgQklPX3ByaW50ZihiaW8sICJsYXN0VXBkYXRlOiAiKTsKLSAgICAgICAgICAgIEFTTjFfVVRDVElNRV9wcmludChiaW8sIFg1MDlfQ1JMX2dldF9sYXN0VXBkYXRlKGNybCkpOwotICAgICAgICAgICAgQklPX3ByaW50ZihiaW8sICIsIG5leHRVcGRhdGU6ICIpOwotICAgICAgICAgICAgQVNOMV9VVENUSU1FX3ByaW50KGJpbywgWDUwOV9DUkxfZ2V0X25leHRVcGRhdGUoY3JsKSk7Ci0gICAgICAgICAgICBuID0gQklPX3BlbmRpbmcoYmlvKTsKLSAgICAgICAgICAgIGNwID0gbWFsbG9jKG4rMSk7Ci0gICAgICAgICAgICBuID0gQklPX3JlYWQoYmlvLCBjcCwgbik7Ci0gICAgICAgICAgICBjcFtuXSA9IE5VTDsKLSAgICAgICAgICAgIEJJT19mcmVlKGJpbyk7Ci0gICAgICAgICAgICBjcDIgPSBYNTA5X05BTUVfb25lbGluZShzdWJqZWN0LCBOVUxMLCAwKTsKLSAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwgIkNBIENSTDogSXNzdWVyOiAlcywgJXMiLCBjcDIsIGNwKTsKLSAgICAgICAgICAgIGZyZWUoY3AyKTsKLSAgICAgICAgICAgIGZyZWUoY3ApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVmVyaWZ5IHRoZSBzaWduYXR1cmUgb24gdGhpcyBDUkwKLSAgICAgICAgICovCi0gICAgICAgIGlmIChYNTA5X0NSTF92ZXJpZnkoY3JsLCBYNTA5X2dldF9wdWJrZXkoeHMpKSA8PSAwKSB7Ci0gICAgICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfV0FSTiwgIkludmFsaWQgc2lnbmF0dXJlIG9uIENSTCIpOwotICAgICAgICAgICAgWDUwOV9TVE9SRV9DVFhfc2V0X2Vycm9yKGN0eCwgWDUwOV9WX0VSUl9DUkxfU0lHTkFUVVJFX0ZBSUxVUkUpOwotICAgICAgICAgICAgWDUwOV9PQkpFQ1RfZnJlZV9jb250ZW50cygmb2JqKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENoZWNrIGRhdGUgb2YgQ1JMIHRvIG1ha2Ugc3VyZSBpdCdzIG5vdCBleHBpcmVkCi0gICAgICAgICAqLwotICAgICAgICBpID0gWDUwOV9jbXBfY3VycmVudF90aW1lKFg1MDlfQ1JMX2dldF9uZXh0VXBkYXRlKGNybCkpOwotICAgICAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfV0FSTiwgIkZvdW5kIENSTCBoYXMgaW52YWxpZCBuZXh0VXBkYXRlIGZpZWxkIik7Ci0gICAgICAgICAgICBYNTA5X1NUT1JFX0NUWF9zZXRfZXJyb3IoY3R4LCBYNTA5X1ZfRVJSX0VSUk9SX0lOX0NSTF9ORVhUX1VQREFURV9GSUVMRCk7Ci0gICAgICAgICAgICBYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKCZvYmopOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpIDwgMCkgewotICAgICAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX1dBUk4sCi0gICAgICAgICAgICAgICAgICAgICJGb3VuZCBDUkwgaXMgZXhwaXJlZCAtICIKLSAgICAgICAgICAgICAgICAgICAgInJldm9raW5nIGFsbCBjZXJ0aWZpY2F0ZXMgdW50aWwgeW91IGdldCB1cGRhdGVkIENSTCIpOwotICAgICAgICAgICAgWDUwOV9TVE9SRV9DVFhfc2V0X2Vycm9yKGN0eCwgWDUwOV9WX0VSUl9DUkxfSEFTX0VYUElSRUQpOwotICAgICAgICAgICAgWDUwOV9PQkpFQ1RfZnJlZV9jb250ZW50cygmb2JqKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKCZvYmopOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVHJ5IHRvIHJldHJpZXZlIGEgQ1JMIGNvcnJlc3BvbmRpbmcgdG8gdGhlIF9pc3N1ZXJfIG9mCi0gICAgICogdGhlIGN1cnJlbnQgY2VydGlmaWNhdGUgaW4gb3JkZXIgdG8gY2hlY2sgZm9yIHJldm9jYXRpb24uCi0gICAgICovCi0gICAgbWVtc2V0KChjaGFyICopJm9iaiwgMCwgc2l6ZW9mKG9iaikpOwotICAgIHJjID0gU1NMX1g1MDlfU1RPUkVfbG9va3VwKHNjLT5wUmV2b2NhdGlvblN0b3JlLCBYNTA5X0xVX0NSTCwgaXNzdWVyLCAmb2JqKTsKLSAgICBjcmwgPSBvYmouZGF0YS5jcmw7Ci0gICAgaWYgKHJjID4gMCAmJiBjcmwgIT0gTlVMTCkgewotICAgICAgICAvKgotICAgICAgICAgKiBDaGVjayBpZiB0aGUgY3VycmVudCBjZXJ0aWZpY2F0ZSBpcyByZXZva2VkIGJ5IHRoaXMgQ1JMCi0gICAgICAgICAqLwotI2lmIFNTTF9MSUJSQVJZX1ZFUlNJT04gPCAweDAwOTA0MDAwCi0gICAgICAgIG4gPSBza19udW0oWDUwOV9DUkxfZ2V0X1JFVk9LRUQoY3JsKSk7Ci0jZWxzZQotICAgICAgICBuID0gc2tfWDUwOV9SRVZPS0VEX251bShYNTA5X0NSTF9nZXRfUkVWT0tFRChjcmwpKTsKLSNlbmRpZgotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0jaWYgU1NMX0xJQlJBUllfVkVSU0lPTiA8IDB4MDA5MDQwMDAKLSAgICAgICAgICAgIHJldm9rZWQgPSAoWDUwOV9SRVZPS0VEICopc2tfdmFsdWUoWDUwOV9DUkxfZ2V0X1JFVk9LRUQoY3JsKSwgaSk7Ci0jZWxzZQotICAgICAgICAgICAgcmV2b2tlZCA9IHNrX1g1MDlfUkVWT0tFRF92YWx1ZShYNTA5X0NSTF9nZXRfUkVWT0tFRChjcmwpLCBpKTsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKEFTTjFfSU5URUdFUl9jbXAocmV2b2tlZC0+c2VyaWFsTnVtYmVyLCBYNTA5X2dldF9zZXJpYWxOdW1iZXIoeHMpKSA9PSAwKSB7Ci0KLSAgICAgICAgICAgICAgICBzZXJpYWwgPSBBU04xX0lOVEVHRVJfZ2V0KHJldm9rZWQtPnNlcmlhbE51bWJlcik7Ci0gICAgICAgICAgICAgICAgY3AgPSBYNTA5X05BTUVfb25lbGluZShpc3N1ZXIsIE5VTEwsIDApOwotICAgICAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgIkNlcnRpZmljYXRlIHdpdGggc2VyaWFsICVsZCAoMHglbFgpICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJyZXZva2VkIHBlciBDUkwgZnJvbSBpc3N1ZXIgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsLCBzZXJpYWwsIGNwKTsKLSAgICAgICAgICAgICAgICBmcmVlKGNwKTsKLQotICAgICAgICAgICAgICAgIFg1MDlfU1RPUkVfQ1RYX3NldF9lcnJvcihjdHgsIFg1MDlfVl9FUlJfQ0VSVF9SRVZPS0VEKTsKLSAgICAgICAgICAgICAgICBYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKCZvYmopOwotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKCZvYmopOwotICAgIH0KLSAgICByZXR1cm4gb2s7Ci19Ci0KLS8qCi0gKiAgVGhpcyBjYWxsYmFjayBmdW5jdGlvbiBpcyBleGVjdXRlZCBieSBPcGVuU1NMIHdoZW5ldmVyIGEgbmV3IFNTTF9TRVNTSU9OIGlzCi0gKiAgYWRkZWQgdG8gdGhlIGludGVybmFsIE9wZW5TU0wgc2Vzc2lvbiBjYWNoZS4gV2UgdXNlIHRoaXMgaG9vayB0byBzcHJlYWQgdGhlCi0gKiAgU1NMX1NFU1NJT04gYWxzbyB0byB0aGUgaW50ZXItcHJvY2VzcyBkaXNrLWNhY2hlIHRvIG1ha2Ugc2hhcmUgaXQgd2l0aCBvdXIKLSAqICBvdGhlciBBcGFjaGUgcHJlLWZvcmtlZCBzZXJ2ZXIgcHJvY2Vzc2VzLgotICovCi1pbnQgc3NsX2NhbGxiYWNrX05ld1Nlc3Npb25DYWNoZUVudHJ5KFNTTCAqc3NsLCBTU0xfU0VTU0lPTiAqcE5ldykKLXsKLSAgICBjb25uX3JlYyAqY29ubjsKLSAgICBzZXJ2ZXJfcmVjICpzOwotICAgIFNTTFNydkNvbmZpZ1JlYyAqc2M7Ci0gICAgbG9uZyB0OwotICAgIEJPT0wgcmM7Ci0KLSAgICAvKgotICAgICAqIEdldCBBcGFjaGUgY29udGV4dCBiYWNrIHRocm91Z2ggT3BlblNTTCBjb250ZXh0Ci0gICAgICovCi0gICAgY29ubiA9IChjb25uX3JlYyAqKVNTTF9nZXRfYXBwX2RhdGEoc3NsKTsKLSAgICBzICAgID0gY29ubi0+c2VydmVyOwotICAgIHNjICAgPSBteVNydkNvbmZpZyhzKTsKLQotICAgIC8qCi0gICAgICogU2V0IHRoZSB0aW1lb3V0IGFsc28gZm9yIHRoZSBpbnRlcm5hbCBPcGVuU1NMIGNhY2hlLCBiZWNhdXNlIHRoaXMgd2F5Ci0gICAgICogb3VyIGludGVyLXByb2Nlc3MgY2FjaGUgaXMgY29uc3VsdGVkIG9ubHkgd2hlbiBpdCdzIHJlYWxseSBuZWNlc3NhcnkuCi0gICAgICovCi0gICAgdCA9IHNjLT5uU2Vzc2lvbkNhY2hlVGltZW91dDsKLSAgICBTU0xfc2V0X3RpbWVvdXQocE5ldywgdCk7Ci0KLSAgICAvKgotICAgICAqIFN0b3JlIHRoZSBTU0xfU0VTU0lPTiBpbiB0aGUgaW50ZXItcHJvY2VzcyBjYWNoZSB3aXRoIHRoZQotICAgICAqIHNhbWUgZXhwaXJlIHRpbWUsIHNvIGl0IGV4cGlyZXMgYXV0b21hdGljYWxseSB0aGVyZSwgdG9vLgotICAgICAqLwotICAgIHQgPSAoU1NMX2dldF90aW1lKHBOZXcpICsgc2MtPm5TZXNzaW9uQ2FjaGVUaW1lb3V0KTsKLSAgICByYyA9IHNzbF9zY2FjaGVfc3RvcmUocywgcE5ldy0+c2Vzc2lvbl9pZCwgcE5ldy0+c2Vzc2lvbl9pZF9sZW5ndGgsIHQsIHBOZXcpOwotCi0gICAgLyoKLSAgICAgKiBMb2cgdGhpcyBjYWNoZSBvcGVyYXRpb24KLSAgICAgKi8KLSAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJJbnRlci1Qcm9jZXNzIFNlc3Npb24gQ2FjaGU6ICIKLSAgICAgICAgICAgICJyZXF1ZXN0PVNFVCBzdGF0dXM9JXMgaWQ9JXMgdGltZW91dD0lZHMgKHNlc3Npb24gY2FjaGluZykiLAotICAgICAgICAgICAgcmMgPT0gVFJVRSA/ICJPSyIgOiAiQkFEIiwKLSAgICAgICAgICAgIFNTTF9TRVNTSU9OX2lkMnN6KHBOZXctPnNlc3Npb25faWQsIHBOZXctPnNlc3Npb25faWRfbGVuZ3RoKSwKLSAgICAgICAgICAgIHQtdGltZShOVUxMKSk7Ci0KLSAgICAvKgotICAgICAqIHJldHVybiAwIHdoaWNoIG1lYW5zIHRvIE9wZW5TU0wgdGhhdCB0aGUgcE5ldyBpcyBzdGlsbAotICAgICAqIHZhbGlkIGFuZCB3YXMgbm90IGZyZWVkIGJ5IHVzIHdpdGggU1NMX1NFU1NJT05fZnJlZSgpLgotICAgICAqLwotICAgIHJldHVybiAwOwotfQotCi0vKgotICogIFRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYnkgT3BlblNTTCB3aGVuZXZlciBhCi0gKiAgU1NMX1NFU1NJT04gaXMgbG9va2VkIHVwIGluIHRoZSBpbnRlcm5hbCBPcGVuU1NMIGNhY2hlIGFuZCBpdAotICogIHdhcyBub3QgZm91bmQuIFdlIHVzZSB0aGlzIHRvIGxvb2t1cCB0aGUgU1NMX1NFU1NJT04gaW4gdGhlCi0gKiAgaW50ZXItcHJvY2VzcyBkaXNrLWNhY2hlIHdoZXJlIGl0IHdhcyBwZXJoYXBzIHN0b3JlZCBieSBvbmUKLSAqICBvZiBvdXIgb3RoZXIgQXBhY2hlIHByZS1mb3JrZWQgc2VydmVyIHByb2Nlc3Nlcy4KLSAqLwotU1NMX1NFU1NJT04gKnNzbF9jYWxsYmFja19HZXRTZXNzaW9uQ2FjaGVFbnRyeSgKLSAgICBTU0wgKnNzbCwgdW5zaWduZWQgY2hhciAqaWQsIGludCBpZGxlbiwgaW50ICpwQ29weSkKLXsKLSAgICBjb25uX3JlYyAqY29ubjsKLSAgICBzZXJ2ZXJfcmVjICpzOwotICAgIFNTTF9TRVNTSU9OICpwU2Vzc2lvbjsKLQotICAgIC8qCi0gICAgICogR2V0IEFwYWNoZSBjb250ZXh0IGJhY2sgdGhyb3VnaCBPcGVuU1NMIGNvbnRleHQKLSAgICAgKi8KLSAgICBjb25uID0gKGNvbm5fcmVjICopU1NMX2dldF9hcHBfZGF0YShzc2wpOwotICAgIHMgICAgPSBjb25uLT5zZXJ2ZXI7Ci0KLSAgICAvKgotICAgICAqIFRyeSB0byByZXRyaWV2ZSB0aGUgU1NMX1NFU1NJT04gZnJvbSB0aGUgaW50ZXItcHJvY2VzcyBjYWNoZQotICAgICAqLwotICAgIHBTZXNzaW9uID0gc3NsX3NjYWNoZV9yZXRyaWV2ZShzLCBpZCwgaWRsZW4pOwotCi0gICAgLyoKLSAgICAgKiBMb2cgdGhpcyBjYWNoZSBvcGVyYXRpb24KLSAgICAgKi8KLSAgICBpZiAocFNlc3Npb24gIT0gTlVMTCkKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLCAiSW50ZXItUHJvY2VzcyBTZXNzaW9uIENhY2hlOiAiCi0gICAgICAgICAgICAgICAgInJlcXVlc3Q9R0VUIHN0YXR1cz1GT1VORCBpZD0lcyAoc2Vzc2lvbiByZXVzZSkiLAotICAgICAgICAgICAgICAgIFNTTF9TRVNTSU9OX2lkMnN6KGlkLCBpZGxlbikpOwotICAgIGVsc2UKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLCAiSW50ZXItUHJvY2VzcyBTZXNzaW9uIENhY2hlOiAiCi0gICAgICAgICAgICAgICAgInJlcXVlc3Q9R0VUIHN0YXR1cz1NSVNTRUQgaWQ9JXMgKHNlc3Npb24gcmVuZXdhbCkiLAotICAgICAgICAgICAgICAgIFNTTF9TRVNTSU9OX2lkMnN6KGlkLCBpZGxlbikpOwotCi0gICAgLyoKLSAgICAgKiBSZXR1cm4gTlVMTCBvciB0aGUgcmV0cmlldmVkIFNTTF9TRVNTSU9OLiBCdXQgaW5kaWNhdGUgKGJ5Ci0gICAgICogc2V0dGluZyBwQ29weSB0byAwKSB0aGF0IHRoZSByZWZlcmVuY2UgY291bnQgb24gdGhlCi0gICAgICogU1NMX1NFU1NJT04gc2hvdWxkIG5vdCBiZSBpbmNyZW1lbnRlZCBieSB0aGUgU1NMIGxpYnJhcnksCi0gICAgICogYmVjYXVzZSB3ZSB3aWxsIG5vIGxvbmdlciBob2xkIGEgcmVmZXJlbmNlIHRvIGl0IG91cnNlbGYuCi0gICAgICovCi0gICAgKnBDb3B5ID0gMDsKLSAgICByZXR1cm4gcFNlc3Npb247Ci19Ci0KLS8qCi0gKiAgVGhpcyBjYWxsYmFjayBmdW5jdGlvbiBpcyBleGVjdXRlZCBieSBPcGVuU1NMIHdoZW5ldmVyIGEKLSAqICBTU0xfU0VTU0lPTiBpcyByZW1vdmVkIGZyb20gdGhlIHRoZSBpbnRlcm5hbCBPcGVuU1NMIGNhY2hlLgotICogIFdlIHVzZSB0aGlzIHRvIHJlbW92ZSB0aGUgU1NMX1NFU1NJT04gaW4gdGhlIGludGVyLXByb2Nlc3MKLSAqICBkaXNrLWNhY2hlLCB0b28uCi0gKi8KLXZvaWQgc3NsX2NhbGxiYWNrX0RlbFNlc3Npb25DYWNoZUVudHJ5KAotICAgIFNTTF9DVFggKmN0eCwgU1NMX1NFU1NJT04gKnBTZXNzaW9uKQotewotICAgIHNlcnZlcl9yZWMgKnM7Ci0KLSAgICAvKgotICAgICAqIEdldCBBcGFjaGUgY29udGV4dCBiYWNrIHRocm91Z2ggT3BlblNTTCBjb250ZXh0Ci0gICAgICovCi0gICAgcyA9IChzZXJ2ZXJfcmVjICopU1NMX0NUWF9nZXRfYXBwX2RhdGEoY3R4KTsKLSAgICBpZiAocyA9PSBOVUxMKSAvKiBvbiBzZXJ2ZXIgc2h1dGRvd24gQXBhY2hlIGlzIGFscmVhZHkgZ29uZSAqLwotICAgICAgICByZXR1cm47Ci0KLSAgICAvKgotICAgICAqIFJlbW92ZSB0aGUgU1NMX1NFU1NJT04gZnJvbSB0aGUgaW50ZXItcHJvY2VzcyBjYWNoZQotICAgICAqLwotICAgIHNzbF9zY2FjaGVfcmVtb3ZlKHMsIHBTZXNzaW9uLT5zZXNzaW9uX2lkLCBwU2Vzc2lvbi0+c2Vzc2lvbl9pZF9sZW5ndGgpOwotCi0gICAgLyoKLSAgICAgKiBMb2cgdGhpcyBjYWNoZSBvcGVyYXRpb24KLSAgICAgKi8KLSAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJJbnRlci1Qcm9jZXNzIFNlc3Npb24gQ2FjaGU6ICIKLSAgICAgICAgICAgICJyZXF1ZXN0PVJFTSBzdGF0dXM9T0sgaWQ9JXMgKHNlc3Npb24gZGVhZCkiLAotICAgICAgICAgICAgU1NMX1NFU1NJT05faWQyc3oocFNlc3Npb24tPnNlc3Npb25faWQsCi0gICAgICAgICAgICBwU2Vzc2lvbi0+c2Vzc2lvbl9pZF9sZW5ndGgpKTsKLQotICAgIHJldHVybjsKLX0KLQotLyoKLSAqIFRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgd2hpbGUgT3BlblNTTCBwcm9jZXNzZXMgdGhlCi0gKiBTU0wgaGFuZHNoYWtlIGFuZCBkb2VzIFNTTCByZWNvcmQgbGF5ZXIgc3R1ZmYuIFdlIHVzZSBpdCB0bwotICogdHJhY2UgT3BlblNTTCdzIHByb2Nlc3NpbmcgaW4gb3V0IFNTTCBsb2dmaWxlLgotICovCi12b2lkIHNzbF9jYWxsYmFja19Mb2dUcmFjaW5nU3RhdGUoU1NMICpzc2wsIGludCB3aGVyZSwgaW50IHJjKQotewotICAgIGNvbm5fcmVjICpjOwotICAgIHNlcnZlcl9yZWMgKnM7Ci0gICAgU1NMU3J2Q29uZmlnUmVjICpzYzsKLSAgICBjaGFyICpzdHI7Ci0KLSAgICAvKgotICAgICAqIGZpbmQgY29ycmVzcG9uZGluZyBzZXJ2ZXIKLSAgICAgKi8KLSAgICBpZiAoKGMgPSAoY29ubl9yZWMgKilTU0xfZ2V0X2FwcF9kYXRhKHNzbCkpID09IE5VTEwpCi0gICAgICAgIHJldHVybjsKLSAgICBzID0gYy0+c2VydmVyOwotICAgIGlmICgoc2MgPSBteVNydkNvbmZpZyhzKSkgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLyoKLSAgICAgKiBjcmVhdGUgdGhlIHZhcmlvdXMgdHJhY2UgbWVzc2FnZXMKLSAgICAgKi8KLSAgICBpZiAoc2MtPm5Mb2dMZXZlbCA+PSBTU0xfTE9HX1RSQUNFKSB7Ci0gICAgICAgIGlmICh3aGVyZSAmIFNTTF9DQl9IQU5EU0hBS0VfU1RBUlQpCi0gICAgICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICIlczogSGFuZHNoYWtlOiBzdGFydCIsIFNTTF9MSUJSQVJZX05BTUUpOwotICAgICAgICBlbHNlIGlmICh3aGVyZSAmIFNTTF9DQl9IQU5EU0hBS0VfRE9ORSkKLSAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwgIiVzOiBIYW5kc2hha2U6IGRvbmUiLCBTU0xfTElCUkFSWV9OQU1FKTsKLSAgICAgICAgZWxzZSBpZiAod2hlcmUgJiBTU0xfQ0JfTE9PUCkKLSAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwgIiVzOiBMb29wOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIFNTTF9MSUJSQVJZX05BTUUsIFNTTF9zdGF0ZV9zdHJpbmdfbG9uZyhzc2wpKTsKLSAgICAgICAgZWxzZSBpZiAod2hlcmUgJiBTU0xfQ0JfUkVBRCkKLSAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwgIiVzOiBSZWFkOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIFNTTF9MSUJSQVJZX05BTUUsIFNTTF9zdGF0ZV9zdHJpbmdfbG9uZyhzc2wpKTsKLSAgICAgICAgZWxzZSBpZiAod2hlcmUgJiBTU0xfQ0JfV1JJVEUpCi0gICAgICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICIlczogV3JpdGU6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgU1NMX0xJQlJBUllfTkFNRSwgU1NMX3N0YXRlX3N0cmluZ19sb25nKHNzbCkpOwotICAgICAgICBlbHNlIGlmICh3aGVyZSAmIFNTTF9DQl9BTEVSVCkgewotICAgICAgICAgICAgc3RyID0gKHdoZXJlICYgU1NMX0NCX1JFQUQpID8gInJlYWQiIDogIndyaXRlIjsKLSAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwgIiVzOiBBbGVydDogJXM6JXM6JXNcbiIsCi0gICAgICAgICAgICAgICAgICAgIFNTTF9MSUJSQVJZX05BTUUsIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgU1NMX2FsZXJ0X3R5cGVfc3RyaW5nX2xvbmcocmMpLAotICAgICAgICAgICAgICAgICAgICBTU0xfYWxlcnRfZGVzY19zdHJpbmdfbG9uZyhyYykpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHdoZXJlICYgU1NMX0NCX0VYSVQpIHsKLSAgICAgICAgICAgIGlmIChyYyA9PSAwKQotICAgICAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwgIiVzOiBFeGl0OiBmYWlsZWQgaW4gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgU1NMX0xJQlJBUllfTkFNRSwgU1NMX3N0YXRlX3N0cmluZ19sb25nKHNzbCkpOwotICAgICAgICAgICAgZWxzZSBpZiAocmMgPCAwKQotICAgICAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwgIiVzOiBFeGl0OiBlcnJvciBpbiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBTU0xfTElCUkFSWV9OQU1FLCBTU0xfc3RhdGVfc3RyaW5nX2xvbmcoc3NsKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEJlY2F1c2UgU1NMIHJlbmVnb3RhdGlvbnMgY2FuIGhhcHBlbiBhdCBhbnkgdGltZSAobm90IG9ubHkgYWZ0ZXIKLSAgICAgKiBTU0xfYWNjZXB0KCkpLCB0aGUgYmVzdCB3YXkgdG8gbG9nIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gZGV0YWlscyBpcwotICAgICAqIHJpZ2h0IGFmdGVyIGEgZmluaXNoZWQgaGFuZHNoYWtlLgotICAgICAqLwotICAgIGlmICh3aGVyZSAmIFNTTF9DQl9IQU5EU0hBS0VfRE9ORSkgewotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfSU5GTywKLSAgICAgICAgICAgICAgICAiQ29ubmVjdGlvbjogQ2xpZW50IElQOiAlcywgUHJvdG9jb2w6ICVzLCBDaXBoZXI6ICVzICglcy8lcyBiaXRzKSIsCi0gICAgICAgICAgICAgICAgc3NsX3Zhcl9sb29rdXAoTlVMTCwgcywgYywgTlVMTCwgIlJFTU9URV9BRERSIiksCi0gICAgICAgICAgICAgICAgc3NsX3Zhcl9sb29rdXAoTlVMTCwgcywgYywgTlVMTCwgIlNTTF9QUk9UT0NPTCIpLAotICAgICAgICAgICAgICAgIHNzbF92YXJfbG9va3VwKE5VTEwsIHMsIGMsIE5VTEwsICJTU0xfQ0lQSEVSIiksCi0gICAgICAgICAgICAgICAgc3NsX3Zhcl9sb29rdXAoTlVMTCwgcywgYywgTlVMTCwgIlNTTF9DSVBIRVJfVVNFS0VZU0laRSIpLAotICAgICAgICAgICAgICAgIHNzbF92YXJfbG9va3VwKE5VTEwsIHMsIGMsIE5VTEwsICJTU0xfQ0lQSEVSX0FMR0tFWVNJWkUiKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NzbC9zc2xfZW5naW5lX2xvZy5jIGIvbW9kdWxlcy9zc2wvc3NsX2VuZ2luZV9sb2cuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUxYzUzYS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL3NzbC9zc2xfZW5naW5lX2xvZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgIF8gICAgICAgICAgICAgXwotKiogIF8gX18gX19fICAgX19fICAgX198IHwgICAgX19fIF9fX3wgfCAgbW9kX3NzbAotKiogfCAnXyBgIF8gXCAvIF8gXCAvIF9gIHwgICAvIF9fLyBfX3wgfCAgQXBhY2hlIEludGVyZmFjZSB0byBPcGVuU1NMCi0qKiB8IHwgfCB8IHwgfCAoXykgfCAoX3wgfCAgIFxfXyBcX18gXCB8ICB3d3cubW9kc3NsLm9yZwotKiogfF98IHxffCB8X3xcX19fLyBcX18sX3xfX198X19fL19fXy9ffCAgZnRwLm1vZHNzbC5vcmcKLSoqICAgICAgICAgICAgICAgICAgICAgIHxfX19fX3wKLSoqICBzc2xfZW5naW5lX2xvZy5jCi0qKiAgTG9nZ2luZyBGYWNpbGl0eQotKi8KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAxIFJhbGYgUy4gRW5nZWxzY2hhbGwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci0gKiAgICAgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGVuZ2Vsc2NoYWxsLmNvbT4gZm9yIHVzZSBpbiB0aGUKLSAqICAgICBtb2Rfc3NsIHByb2plY3QgKGh0dHA6Ly93d3cubW9kc3NsLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIm1vZF9zc2wiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICByc2VAZW5nZWxzY2hhbGwuY29tLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJtb2Rfc3NsIgotICogICAgbm9yIG1heSAibW9kX3NzbCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3IKLSAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBSYWxmIFMuIEVuZ2Vsc2NoYWxsLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLSAqICAgICBSYWxmIFMuIEVuZ2Vsc2NoYWxsIDxyc2VAZW5nZWxzY2hhbGwuY29tPiBmb3IgdXNlIGluIHRoZQotICogICAgIG1vZF9zc2wgcHJvamVjdCAoaHR0cDovL3d3dy5tb2Rzc2wub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgUkFMRiBTLiBFTkdFTFNDSEFMTCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgUkFMRiBTLiBFTkdFTFNDSEFMTCBPUgotICogSElTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGBgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGNvbXB1dGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kdXN0cnkgam9iIGFuZCBvcGVuLXNvdXJjZSBzb2Z0d2FyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhY2tpbmcgaXMgYWJvdXQgMzAgaG91cnMgYSB3ZWVrLicnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIFJhbGYgUy4gRW5nZWxzY2hhbGwgICAgICovCi0jaW5jbHVkZSAibW9kX3NzbC5oIgotCi0KLS8qICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICBMb2dmaWxlIFN1cHBvcnQKLSoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKi8KLQotLyoKLSAqIE9wZW4gdGhlIFNTTCBsb2dmaWxlCi0gKi8KLXZvaWQgc3NsX2xvZ19vcGVuKHNlcnZlcl9yZWMgKnNfbWFpbiwgc2VydmVyX3JlYyAqcywgcG9vbCAqcCkKLXsKLSAgICBjaGFyICpzekxvZ0ZpbGU7Ci0gICAgU1NMU3J2Q29uZmlnUmVjICpzY19tYWluID0gbXlTcnZDb25maWcoc19tYWluKTsKLSAgICBTU0xTcnZDb25maWdSZWMgKnNjID0gbXlTcnZDb25maWcocyk7Ci0gICAgcGlwZWRfbG9nICpwbDsKLQotICAgIC8qIAotICAgICAqIFNob3J0LWNpcmN1aXQgZm9yIGluaGVyaXRlZCBsb2dmaWxlcyBpbiBvcmRlciB0byBzYXZlCi0gICAgICogZmlsZWRlc2NyaXB0b3JzIGluIG1hc3Mtdmhvc3Qgc2l0dWF0aW9uLiBCZSBjYXJlZnVsLCB0aGlzIHdvcmtzCi0gICAgICogZmluZSBiZWNhdXNlIHRoZSBjbG9zZSBoYXBwZW5zIGltcGxpY2l0bHkgYnkgdGhlIHBvb2wgZmFjaWxpdHkuCi0gICAgICovCi0gICAgaWYgKCAgIHMgIT0gc19tYWluIAotICAgICAgICAmJiBzY19tYWluLT5maWxlTG9nRmlsZSAhPSBOVUxMCi0gICAgICAgICYmICggICAoc2MtPnN6TG9nRmlsZSA9PSBOVUxMKQotICAgICAgICAgICAgfHwgKCAgIHNjLT5zekxvZ0ZpbGUgIT0gTlVMTCAKLSAgICAgICAgICAgICAgICAmJiBzY19tYWluLT5zekxvZ0ZpbGUgIT0gTlVMTCAKLSAgICAgICAgICAgICAgICAmJiBzdHJFUShzYy0+c3pMb2dGaWxlLCBzY19tYWluLT5zekxvZ0ZpbGUpKSkpIHsKLSAgICAgICAgc2MtPmZpbGVMb2dGaWxlID0gc2NfbWFpbi0+ZmlsZUxvZ0ZpbGU7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNjLT5zekxvZ0ZpbGUgIT0gTlVMTCkgewotICAgICAgICBpZiAoc3RyRVEoc2MtPnN6TG9nRmlsZSwgIi9kZXYvbnVsbCIpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBlbHNlIGlmIChzYy0+c3pMb2dGaWxlWzBdID09ICd8JykgewotICAgICAgICAgICAgc3pMb2dGaWxlID0gc3NsX3V0aWxfc2VydmVyX3Jvb3RfcmVsYXRpdmUocCwgImxvZyIsIHNjLT5zekxvZ0ZpbGUrMSk7Ci0gICAgICAgICAgICBpZiAoKHBsID0gYXBfb3Blbl9waXBlZF9sb2cocCwgc3pMb2dGaWxlKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19FUlJPUnxTU0xfQUREX0VSUk5PLAotICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBvcGVuIHJlbGlhYmxlIHBpcGUgdG8gU1NMIGxvZ2ZpbGUgZmlsdGVyICVzIiwgc3pMb2dGaWxlKTsKLSAgICAgICAgICAgICAgICBzc2xfZGllKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYy0+ZmlsZUxvZ0ZpbGUgPSBhcF9wZmRvcGVuKHAsIGFwX3BpcGVkX2xvZ193cml0ZV9mZChwbCksICJhIik7Ci0gICAgICAgICAgICBzZXRidWYoc2MtPmZpbGVMb2dGaWxlLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHN6TG9nRmlsZSA9IHNzbF91dGlsX3NlcnZlcl9yb290X3JlbGF0aXZlKHAsICJsb2ciLCBzYy0+c3pMb2dGaWxlKTsKLSAgICAgICAgICAgIGlmICgoc2MtPmZpbGVMb2dGaWxlID0gYXBfcGZvcGVuKHAsIHN6TG9nRmlsZSwgImEiKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19FUlJPUnxTU0xfQUREX0VSUk5PLAotICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBvcGVuIFNTTCBsb2dmaWxlICVzIiwgc3pMb2dGaWxlKTsKLSAgICAgICAgICAgICAgICBzc2xfZGllKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRidWYoc2MtPmZpbGVMb2dGaWxlLCBOVUxMKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgewotICAgIGludCAgIG5MZXZlbDsKLSAgICBjaGFyICpzekxldmVsOwotfSBzc2xfbG9nX2xldmVsMnN0cmluZ1tdID0gewotICAgIHsgU1NMX0xPR19FUlJPUiwgImVycm9yIiB9LAotICAgIHsgU1NMX0xPR19XQVJOLCAgIndhcm4iICB9LAotICAgIHsgU1NMX0xPR19JTkZPLCAgImluZm8iICB9LAotICAgIHsgU1NMX0xPR19UUkFDRSwgInRyYWNlIiB9LAotICAgIHsgU1NMX0xPR19ERUJVRywgImRlYnVnIiB9LAotICAgIHsgMCwgTlVMTCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IHsKLSAgICBjaGFyICpjcFBhdHRlcm47Ci0gICAgY2hhciAqY3BBbm5vdGF0aW9uOwotfSBzc2xfbG9nX2Fubm90YXRlW10gPSB7Ci0gICAgeyAiKmVudmVsb3BlKmJhZCpkZWNyeXB0KiIsICJ3cm9uZyBwYXNzIHBocmFzZSE/IiB9LAotICAgIHsgIipDTElFTlRfSEVMTE8qdW5rbm93bipwcm90b2NvbCoiLCAic3BlYWtpbmcgbm90IFNTTCB0byBIVFRQUyBwb3J0IT8iIH0sCi0gICAgeyAiKkNMSUVOVF9IRUxMTypodHRwKnJlcXVlc3QqIiwgInNwZWFraW5nIEhUVFAgdG8gSFRUUFMgcG9ydCE/IiB9LAotICAgIHsgIipTU0wzX1JFQURfQllURVM6c3NsdjMqYWxlcnQqYmFkKmNlcnRpZmljYXRlKiIsICJTdWJqZWN0IENOIGluIGNlcnRpZmljYXRlIG5vdCBzZXJ2ZXIgbmFtZSBvciBpZGVudGljYWwgdG8gQ0EhPyIgfSwKLSAgICB7ICIqc2VsZiBzaWduZWQgY2VydGlmaWNhdGUgaW4gY2VydGlmaWNhdGUgY2hhaW4qIiwgIkNsaWVudCBjZXJ0aWZpY2F0ZSBzaWduZWQgYnkgQ0Egbm90IGtub3duIHRvIHNlcnZlcj8iIH0sCi0gICAgeyAiKnBlZXIgZGlkIG5vdCByZXR1cm4gYSBjZXJ0aWZpY2F0ZSoiLCAiTm8gQ0FzIGtub3duIHRvIHNlcnZlciBmb3IgdmVyaWZpY2F0aW9uPyIgfSwKLSAgICB7ICIqbm8gc2hhcmVkIGNpcGhlcioiLCAiVG9vIHJlc3RyaWN0aXZlIFNTTENpcGhlclN1aXRlIG9yIHVzaW5nIERTQSBzZXJ2ZXIgY2VydGlmaWNhdGU/IiB9LAotICAgIHsgIipubyBzdGFydCBsaW5lKiIsICJCYWQgZmlsZSBjb250ZW50cyBvciBmb3JtYXQgLSBvciBldmVuIGp1c3QgYSBmb3Jnb3R0ZW4gU1NMQ2VydGlmaWNhdGVLZXlGaWxlPyIgfSwKLSAgICB7ICIqYmFkIHBhc3N3b3JkIHJlYWQqIiwgIllvdSBlbnRlcmVkIGFuIGluY29ycmVjdCBwYXNzIHBocmFzZSE/IiB9LAotICAgIHsgIipiYWQgbWFjIGRlY29kZSoiLCAiQnJvd3NlciBzdGlsbCByZW1lbWJlcmVkIGRldGFpbHMgb2YgYSByZS1jcmVhdGVkIHNlcnZlciBjZXJ0aWZpY2F0ZT8iIH0sCi0gICAgeyBOVUxMLCBOVUxMIH0KLX07Ci0KLXN0YXRpYyBjaGFyICpzc2xfbG9nX2Fubm90YXRpb24oY2hhciAqZXJyb3IpCi17Ci0gICAgY2hhciAqZXJyc3RyOwotICAgIGludCBpOwotCi0gICAgZXJyc3RyID0gTlVMTDsKLSAgICBmb3IgKGkgPSAwOyBzc2xfbG9nX2Fubm90YXRlW2ldLmNwUGF0dGVybiAhPSBOVUxMOyBpKyspIHsKLSAgICAgICAgaWYgKGFwX3N0cmNtcF9tYXRjaChlcnJvciwgc3NsX2xvZ19hbm5vdGF0ZVtpXS5jcFBhdHRlcm4pID09IDApIHsKLSAgICAgICAgICAgIGVycnN0ciA9IHNzbF9sb2dfYW5ub3RhdGVbaV0uY3BBbm5vdGF0aW9uOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVycnN0cjsKLX0KLQotQk9PTCBzc2xfbG9nX2FwcGxpZXMoc2VydmVyX3JlYyAqcywgaW50IGxldmVsKQotewotICAgIFNTTFNydkNvbmZpZ1JlYyAqc2M7Ci0KLSAgICBzYyA9IG15U3J2Q29uZmlnKHMpOwotICAgIGlmICggICBzYy0+ZmlsZUxvZ0ZpbGUgPT0gTlVMTAotICAgICAgICAmJiAhKGxldmVsICYgU1NMX0xPR19FUlJPUikpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBpZiAoICAgbGV2ZWwgPiBzYy0+bkxvZ0xldmVsCi0gICAgICAgICYmICEobGV2ZWwgJiBTU0xfTE9HX0VSUk9SKSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi12b2lkIHNzbF9sb2coc2VydmVyX3JlYyAqcywgaW50IGxldmVsLCBjb25zdCBjaGFyICptc2csIC4uLikKLXsKLSAgICBjaGFyIHRzdHJbODBdOwotICAgIGNoYXIgbHN0clsyMF07Ci0gICAgY2hhciB2c3RyWzEwMjRdOwotICAgIGNoYXIgc3RyWzEwMjRdOwotICAgIGNoYXIgbnN0clsyXTsKLSAgICBpbnQgdGltejsKLSAgICBzdHJ1Y3QgdG0gKnQ7Ci0gICAgdmFfbGlzdCBhcDsKLSAgICBpbnQgYWRkOwotICAgIGludCBpOwotICAgIGNoYXIgKmFzdHI7Ci0gICAgaW50IHNhZmVfZXJybm87Ci0gICAgdW5zaWduZWQgbG9uZyBlOwotICAgIFNTTFNydkNvbmZpZ1JlYyAqc2M7Ci0gICAgY2hhciAqY3BFOwotICAgIGNoYXIgKmNwQTsKLQotICAgIC8qICBpbml0aWFsaXphdGlvbiAgKi8KLSAgICB2YV9zdGFydChhcCwgbXNnKTsKLSAgICBzYWZlX2Vycm5vID0gZXJybm87Ci0gICAgc2MgPSBteVNydkNvbmZpZyhzKTsKLQotICAgIC8qICBzdHJpcCBvdXQgYWRkaXRpb25hbCBmbGFncyAgKi8KLSAgICBhZGQgICA9IChsZXZlbCAmIH5TU0xfTE9HX01BU0spOwotICAgIGxldmVsID0gKGxldmVsICYgU1NMX0xPR19NQVNLKTsKLQotICAgIC8qICByZWR1Y2UgZmxhZ3Mgd2hlbiBub3QgcmVhc29uYWJsZSBpbiBjb250ZXh0ICAqLwotICAgIGlmIChhZGQgJiBTU0xfQUREX0VSUk5PICYmIGVycm5vID09IDApCi0gICAgICAgIGFkZCAmPSB+U1NMX0FERF9FUlJOTzsKLSAgICBpZiAoYWRkICYgU1NMX0FERF9TU0xFUlIgJiYgRVJSX3BlZWtfZXJyb3IoKSA9PSAwKQotICAgICAgICBhZGQgJj0gflNTTF9BRERfU1NMRVJSOwotCi0gICAgLyogIHdlIGxvZyBvbmx5IGxldmVscyBiZWxvdywgZXhjZXB0IGZvciBlcnJvcnMgKi8KLSAgICBpZiAoICAgc2MtPmZpbGVMb2dGaWxlID09IE5VTEwKLSAgICAgICAgJiYgIShsZXZlbCAmIFNTTF9MT0dfRVJST1IpKQotICAgICAgICByZXR1cm47Ci0gICAgaWYgKCAgIGxldmVsID4gc2MtPm5Mb2dMZXZlbAotICAgICAgICAmJiAhKGxldmVsICYgU1NMX0xPR19FUlJPUikpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8qICBkZXRlcm1pbmUgdGhlIHRpbWUgZW50cnkgc3RyaW5nICAqLwotICAgIGlmIChhZGQgJiBTU0xfTk9fVElNRVNUQU1QKQotICAgICAgICB0c3RyWzBdID0gTlVMOwotICAgIGVsc2UgewotICAgICAgICB0ID0gYXBfZ2V0X2dtdG9mZigmdGlteik7Ci0gICAgICAgIHN0cmZ0aW1lKHRzdHIsIDgwLCAiWyVkLyViLyVZICVIOiVNOiVTIiwgdCk7Ci0gICAgICAgIGkgPSBzdHJsZW4odHN0cik7Ci0gICAgICAgIGFwX3NucHJpbnRmKHRzdHIraSwgODAtaSwgIiAlMDVkXSAiLCAodW5zaWduZWQgaW50KWdldHBpZCgpKTsKLSAgICB9Ci0KLSAgICAvKiAgZGV0ZXJtaW5lIHdoZXRoZXIgbmV3bGluZSBzaG91bGQgYmUgd3JpdHRlbiAqLwotICAgIGlmIChhZGQgJiBTU0xfTk9fTkVXTElORSkKLSAgICAgICAgbnN0clswXSA9IE5VTDsKLSAgICBlbHNlIHsKLSAgICAgICAgbnN0clswXSA9ICdcbic7Ci0gICAgICAgIG5zdHJbMV0gPSBOVUw7Ci0gICAgfQotCi0gICAgLyogIGRldGVybWluZSBsZXZlbCBuYW1lICAqLwotICAgIGxzdHJbMF0gPSBOVUw7Ci0gICAgaWYgKCEoYWRkICYgU1NMX05PX0xFVkVMSUQpKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IHNzbF9sb2dfbGV2ZWwyc3RyaW5nW2ldLm5MZXZlbCAhPSAwOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChzc2xfbG9nX2xldmVsMnN0cmluZ1tpXS5uTGV2ZWwgPT0gbGV2ZWwpIHsKLSAgICAgICAgICAgICAgICBhcF9zbnByaW50Zihsc3RyLCBzaXplb2YobHN0ciksICJbJXNdIiwgc3NsX2xvZ19sZXZlbDJzdHJpbmdbaV0uc3pMZXZlbCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gc3RybGVuKGxzdHIpOyBpIDw9IDc7IGkrKykKLSAgICAgICAgICAgIGxzdHJbaV0gPSAnICc7Ci0gICAgICAgIGxzdHJbaV0gPSBOVUw7Ci0gICAgfQotCi0gICAgLyogIGNyZWF0ZSBjdXN0b20gbWVzc2FnZSAgKi8KLSAgICBhcF92c25wcmludGYodnN0ciwgc2l6ZW9mKHZzdHIpLCBtc2csIGFwKTsKLQotICAgIC8qICB3cml0ZSBvdXQgU1NMb2cgbWVzc2FnZSAgKi8KLSAgICBpZiAoKGFkZCAmIFNTTF9BRERfRVJSTk8pICYmIChhZGQgJiBTU0xfQUREX1NTTEVSUikpCi0gICAgICAgIGFzdHIgPSAiIChTeXN0ZW0gYW5kICIgU1NMX0xJQlJBUllfTkFNRSAiIGxpYnJhcnkgZXJyb3JzIGZvbGxvdykiOwotICAgIGVsc2UgaWYgKGFkZCAmIFNTTF9BRERfRVJSTk8pCi0gICAgICAgIGFzdHIgPSAiIChTeXN0ZW0gZXJyb3IgZm9sbG93cykiOwotICAgIGVsc2UgaWYgKGFkZCAmIFNTTF9BRERfU1NMRVJSKQotICAgICAgICBhc3RyID0gIiAoIiBTU0xfTElCUkFSWV9OQU1FICIgbGlicmFyeSBlcnJvciBmb2xsb3dzKSI7Ci0gICAgZWxzZQotICAgICAgICBhc3RyID0gIiI7Ci0gICAgaWYgKGxldmVsIDw9IHNjLT5uTG9nTGV2ZWwgJiYgc2MtPmZpbGVMb2dGaWxlICE9IE5VTEwpIHsKLSAgICAgICAgYXBfc25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSwgIiVzJXMlcyVzJXMiLCB0c3RyLCBsc3RyLCB2c3RyLCBhc3RyLCBuc3RyKTsKLSAgICAgICAgZnByaW50ZihzYy0+ZmlsZUxvZ0ZpbGUsICIlcyIsIHN0cik7Ci0gICAgfQotICAgIGlmIChsZXZlbCAmIFNTTF9MT0dfRVJST1IpCi0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlJ8QVBMT0dfTk9FUlJOTywgcywKLSAgICAgICAgICAgICAgICAgICAgICJtb2Rfc3NsOiAlcyVzIiwgdnN0ciwgYXN0cik7Ci0KLSAgICAvKiAgd3JpdGUgb3V0IGFkZGl0aW9uYWwgYXR0YWNobWVudCBtZXNzYWdlcyAgKi8KLSAgICBpZiAoYWRkICYgU1NMX0FERF9FUlJOTykgewotICAgICAgICBpZiAobGV2ZWwgPD0gc2MtPm5Mb2dMZXZlbCAmJiBzYy0+ZmlsZUxvZ0ZpbGUgIT0gTlVMTCkgewotICAgICAgICAgICAgYXBfc25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSwgIiVzJXNTeXN0ZW06ICVzIChlcnJubzogJWQpJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgdHN0ciwgbHN0ciwgc3RyZXJyb3Ioc2FmZV9lcnJubyksIHNhZmVfZXJybm8sIG5zdHIpOwotICAgICAgICAgICAgZnByaW50ZihzYy0+ZmlsZUxvZ0ZpbGUsICIlcyIsIHN0cik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxldmVsICYgU1NMX0xPR19FUlJPUikKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlJ8QVBMT0dfTk9FUlJOTywgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAiU3lzdGVtOiAlcyAoZXJybm86ICVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3Ioc2FmZV9lcnJubyksIHNhZmVfZXJybm8pOwotICAgIH0KLSAgICBpZiAoYWRkICYgU1NMX0FERF9TU0xFUlIpIHsKLSAgICAgICAgd2hpbGUgKChlID0gRVJSX2dldF9lcnJvcigpKSkgewotICAgICAgICAgICAgY3BFID0gRVJSX2Vycm9yX3N0cmluZyhlLCBOVUxMKTsKLSAgICAgICAgICAgIGNwQSA9IHNzbF9sb2dfYW5ub3RhdGlvbihjcEUpOwotICAgICAgICAgICAgaWYgKGxldmVsIDw9IHNjLT5uTG9nTGV2ZWwgJiYgc2MtPmZpbGVMb2dGaWxlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBhcF9zbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCAiJXMlcyVzOiAlcyVzJXMlcyVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RyLCBsc3RyLCBTU0xfTElCUkFSWV9OQU1FLCBjcEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BBICE9IE5VTEwgPyAiIFtIaW50OiAiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BBICE9IE5VTEwgPyBjcEEgOiAiIiwgY3BBICE9IE5VTEwgPyAiXSIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc3RyKTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHNjLT5maWxlTG9nRmlsZSwgIiVzIiwgc3RyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsZXZlbCAmIFNTTF9MT0dfRVJST1IpCi0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUnxBUExPR19OT0VSUk5PLCBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVzJXMlcyVzIiwgU1NMX0xJQlJBUllfTkFNRSwgY3BFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcEEgIT0gTlVMTCA/ICIgW0hpbnQ6ICIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BBICE9IE5VTEwgPyBjcEEgOiAiIiwgY3BBICE9IE5VTEwgPyAiXSIgOiAiIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogbWFrZSBzdXJlIHRoZSBuZXh0IGxvZyBzdGFydHMgZnJvbSBhIGNsZWFuIGJhc2UgKi8KLSAgICAvKiBFUlJfY2xlYXJfZXJyb3IoKTsgKi8KLQotICAgIC8qICBjbGVhbnVwIGFuZCByZXR1cm4gICovCi0gICAgaWYgKHNjLT5maWxlTG9nRmlsZSAhPSBOVUxMKQotICAgICAgICBmZmx1c2goc2MtPmZpbGVMb2dGaWxlKTsKLSAgICBlcnJubyA9IHNhZmVfZXJybm87Ci0gICAgdmFfZW5kKGFwKTsKLSAgICByZXR1cm47Ci19Ci0KLXZvaWQgc3NsX2RpZSh2b2lkKQotewotICAgIC8qCi0gICAgICogVGhpcyBpcyB1c2VkIGZvciBmYXRhbCBlcnJvcnMgYW5kIGhlcmUKLSAgICAgKiBpdCBpcyBjb21tb24gbW9kdWxlIHByYWN0aWNlIHRvIHJlYWxseQotICAgICAqIGV4aXQgZnJvbSB0aGUgY29tcGxldGUgcHJvZ3JhbS4KLSAgICAgKi8KLSAgICBleGl0KDEpOwotfQotCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NzbC9zc2xfZW5naW5lX211dGV4LmMgYi9tb2R1bGVzL3NzbC9zc2xfZW5naW5lX211dGV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NmY5Y2UuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9zc2wvc3NsX2VuZ2luZV9tdXRleC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgIF8gICAgICAgICAgICAgXwotKiogIF8gX18gX19fICAgX19fICAgX198IHwgICAgX19fIF9fX3wgfCAgbW9kX3NzbAotKiogfCAnXyBgIF8gXCAvIF8gXCAvIF9gIHwgICAvIF9fLyBfX3wgfCAgQXBhY2hlIEludGVyZmFjZSB0byBPcGVuU1NMCi0qKiB8IHwgfCB8IHwgfCAoXykgfCAoX3wgfCAgIFxfXyBcX18gXCB8ICB3d3cubW9kc3NsLm9yZwotKiogfF98IHxffCB8X3xcX19fLyBcX18sX3xfX198X19fL19fXy9ffCAgZnRwLm1vZHNzbC5vcmcKLSoqICAgICAgICAgICAgICAgICAgICAgIHxfX19fX3wKLSoqICBzc2xfZW5naW5lX211dGV4LmMKLSoqICBTZW1hcGhvcmUgZm9yIE11dHVhbCBFeGNsdXNpb24KLSovCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBSYWxmIFMuIEVuZ2Vsc2NoYWxsLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICogICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotICogICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+IGZvciB1c2UgaW4gdGhlCi0gKiAgICAgbW9kX3NzbCBwcm9qZWN0IChodHRwOi8vd3d3Lm1vZHNzbC5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJtb2Rfc3NsIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICogICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgcnNlQGVuZ2Vsc2NoYWxsLmNvbS4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAibW9kX3NzbCIKLSAqICAgIG5vciBtYXkgIm1vZF9zc2wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yCi0gKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgUmFsZiBTLiBFbmdlbHNjaGFsbC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci0gKiAgICAgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGVuZ2Vsc2NoYWxsLmNvbT4gZm9yIHVzZSBpbiB0aGUKLSAqICAgICBtb2Rfc3NsIHByb2plY3QgKGh0dHA6Ly93d3cubW9kc3NsLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFJBTEYgUy4gRU5HRUxTQ0hBTEwgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFJBTEYgUy4gRU5HRUxTQ0hBTEwgT1IKLSAqIEhJUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBgYFJlYWwgcHJvZ3JhbW1lcnMgY29uZnVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENocmlzdG1hcyBhbmQgSGFsbG93ZWVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSBERUMgMjUgPSBPQ1QgMzEuJycKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIFVua25vd24gICAgICovCi0jaW5jbHVkZSAibW9kX3NzbC5oIgotCi0KLS8qICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICBNdXRleCBTdXBwb3J0IChDb21tb24pCi0qKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSovCi0KLXZvaWQgc3NsX211dGV4X2luaXQoc2VydmVyX3JlYyAqcywgcG9vbCAqcCkKLXsKLSAgICBTU0xNb2RDb25maWdSZWMgKm1jID0gbXlNb2RDb25maWcoKTsKLQotICAgIGlmIChtYy0+bk11dGV4TW9kZSA9PSBTU0xfTVVURVhNT0RFX0ZJTEUpCi0gICAgICAgIHNzbF9tdXRleF9maWxlX2NyZWF0ZShzLCBwKTsKLSAgICBlbHNlIGlmIChtYy0+bk11dGV4TW9kZSA9PSBTU0xfTVVURVhNT0RFX1NFTSkKLSAgICAgICAgc3NsX211dGV4X3NlbV9jcmVhdGUocywgcCk7Ci0gICAgcmV0dXJuOwotfQotCi12b2lkIHNzbF9tdXRleF9yZWluaXQoc2VydmVyX3JlYyAqcywgcG9vbCAqcCkKLXsKLSAgICBTU0xNb2RDb25maWdSZWMgKm1jID0gbXlNb2RDb25maWcoKTsKLQotICAgIGlmIChtYy0+bk11dGV4TW9kZSA9PSBTU0xfTVVURVhNT0RFX0ZJTEUpCi0gICAgICAgIHNzbF9tdXRleF9maWxlX29wZW4ocywgcCk7Ci0gICAgZWxzZSBpZiAobWMtPm5NdXRleE1vZGUgPT0gU1NMX01VVEVYTU9ERV9TRU0pCi0gICAgICAgIHNzbF9tdXRleF9zZW1fb3BlbihzLCBwKTsKLSAgICByZXR1cm47Ci19Ci0KLXZvaWQgc3NsX211dGV4X29uKHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgU1NMTW9kQ29uZmlnUmVjICptYyA9IG15TW9kQ29uZmlnKCk7Ci0gICAgQk9PTCBvayA9IFRSVUU7Ci0KLSAgICBpZiAobWMtPm5NdXRleE1vZGUgPT0gU1NMX01VVEVYTU9ERV9GSUxFKQotICAgICAgICBvayA9IHNzbF9tdXRleF9maWxlX2FjcXVpcmUoKTsKLSAgICBlbHNlIGlmIChtYy0+bk11dGV4TW9kZSA9PSBTU0xfTVVURVhNT0RFX1NFTSkKLSAgICAgICAgb2sgPSBzc2xfbXV0ZXhfc2VtX2FjcXVpcmUoKTsKLSAgICBpZiAoIW9rKQotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfV0FSTiwgIkZhaWxlZCB0byBhY3F1aXJlIGdsb2JhbCBtdXRleCBsb2NrIik7Ci0gICAgcmV0dXJuOwotfQotCi12b2lkIHNzbF9tdXRleF9vZmYoc2VydmVyX3JlYyAqcykKLXsKLSAgICBTU0xNb2RDb25maWdSZWMgKm1jID0gbXlNb2RDb25maWcoKTsKLSAgICBCT09MIG9rID0gVFJVRTsKLQotICAgIGlmIChtYy0+bk11dGV4TW9kZSA9PSBTU0xfTVVURVhNT0RFX0ZJTEUpCi0gICAgICAgIG9rID0gc3NsX211dGV4X2ZpbGVfcmVsZWFzZSgpOwotICAgIGVsc2UgaWYgKG1jLT5uTXV0ZXhNb2RlID09IFNTTF9NVVRFWE1PREVfU0VNKQotICAgICAgICBvayA9IHNzbF9tdXRleF9zZW1fcmVsZWFzZSgpOwotICAgIGlmICghb2spCi0gICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19XQVJOLCAiRmFpbGVkIHRvIHJlbGVhc2UgZ2xvYmFsIG11dGV4IGxvY2siKTsKLSAgICByZXR1cm47Ci19Ci0KLXZvaWQgc3NsX211dGV4X2tpbGwoc2VydmVyX3JlYyAqcykKLXsKLSAgICBTU0xNb2RDb25maWdSZWMgKm1jID0gbXlNb2RDb25maWcoKTsKLQotICAgIGlmIChtYy0+bk11dGV4TW9kZSA9PSBTU0xfTVVURVhNT0RFX0ZJTEUpCi0gICAgICAgIHNzbF9tdXRleF9maWxlX3JlbW92ZShzKTsKLSAgICBlbHNlIGlmIChtYy0+bk11dGV4TW9kZSA9PSBTU0xfTVVURVhNT0RFX1NFTSkKLSAgICAgICAgc3NsX211dGV4X3NlbV9yZW1vdmUocyk7Ci0gICAgcmV0dXJuOwotfQotCi0KLS8qICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICBNdXRleCBTdXBwb3J0IChMb2NrZmlsZSkKLSoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKi8KLQotdm9pZCBzc2xfbXV0ZXhfZmlsZV9jcmVhdGUoc2VydmVyX3JlYyAqcywgcG9vbCAqcCkKLXsKLSNpZm5kZWYgV0lOMzIKLSAgICBTU0xNb2RDb25maWdSZWMgKm1jID0gbXlNb2RDb25maWcoKTsKLQotICAgIC8qIGNyZWF0ZSB0aGUgbG9ja2ZpbGUgKi8KLSAgICB1bmxpbmsobWMtPnN6TXV0ZXhGaWxlKTsKLSAgICBpZiAoKG1jLT5uTXV0ZXhGRCA9IGFwX3BvcGVuZihwLCBtYy0+c3pNdXRleEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT19XUk9OTFl8T19DUkVBVCwgU1NMX01VVEVYX0xPQ0tfTU9ERSkpIDwgMCkgewotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1J8U1NMX0FERF9FUlJOTywKLSAgICAgICAgICAgICAgICAiUGFyZW50IHByb2Nlc3MgY291bGQgbm90IGNyZWF0ZSBTU0xNdXRleCBsb2NrZmlsZSAlcyIsCi0gICAgICAgICAgICAgICAgbWMtPnN6TXV0ZXhGaWxlKTsKLSAgICAgICAgc3NsX2RpZSgpOwotICAgIH0KLSAgICBhcF9wY2xvc2VmKHAsIG1jLT5uTXV0ZXhGRCk7Ci0KLSAgICAvKiBtYWtlIHN1cmUgdGhlIGNoaWxkcyBoYXZlIGFjY2VzcyB0byB0aGlzIGZpbGUgKi8KLSNpZm5kZWYgT1MyCi0gICAgaWYgKGdldGV1aWQoKSA9PSAwIC8qIGlzIHN1cGVydXNlciAqLykKLSAgICAgICAgY2hvd24obWMtPnN6TXV0ZXhGaWxlLCBhcF91c2VyX2lkLCAtMSAvKiBubyBnaWQgY2hhbmdlICovKTsKLSNlbmRpZgotCi0gICAgLyogb3BlbiB0aGUgbG9ja2ZpbGUgZm9yIHJlYWwgKi8KLSAgICBpZiAoKG1jLT5uTXV0ZXhGRCA9IGFwX3BvcGVuZihwLCBtYy0+c3pNdXRleEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT19XUk9OTFksIFNTTF9NVVRFWF9MT0NLX01PREUpKSA8IDApIHsKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SfFNTTF9BRERfRVJSTk8sCi0gICAgICAgICAgICAgICAgIlBhcmVudCBjb3VsZCBub3Qgb3BlbiBTU0xNdXRleCBsb2NrZmlsZSAlcyIsCi0gICAgICAgICAgICAgICAgbWMtPnN6TXV0ZXhGaWxlKTsKLSAgICAgICAgc3NsX2RpZSgpOwotICAgIH0KLSNlbmRpZgotICAgIHJldHVybjsKLX0KLQotdm9pZCBzc2xfbXV0ZXhfZmlsZV9vcGVuKHNlcnZlcl9yZWMgKnMsIHBvb2wgKnApCi17Ci0jaWZuZGVmIFdJTjMyCi0gICAgU1NMTW9kQ29uZmlnUmVjICptYyA9IG15TW9kQ29uZmlnKCk7Ci0KLSAgICAvKiBvcGVuIHRoZSBsb2NrZmlsZSAob25jZSBwZXIgY2hpbGQpIHRvIGdldCBhIHVuaXF1ZSBmZCAqLwotICAgIGlmICgobWMtPm5NdXRleEZEID0gYXBfcG9wZW5mKHAsIG1jLT5zek11dGV4RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPX1dST05MWSwgU1NMX01VVEVYX0xPQ0tfTU9ERSkpIDwgMCkgewotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1J8U1NMX0FERF9FUlJOTywKLSAgICAgICAgICAgICAgICAiQ2hpbGQgY291bGQgbm90IG9wZW4gU1NMTXV0ZXggbG9ja2ZpbGUgJXMiLAotICAgICAgICAgICAgICAgIG1jLT5zek11dGV4RmlsZSk7Ci0gICAgICAgIHNzbF9kaWUoKTsKLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm47Ci19Ci0KLXZvaWQgc3NsX211dGV4X2ZpbGVfcmVtb3ZlKHZvaWQgKmRhdGEpCi17Ci0jaWZuZGVmIFdJTjMyCi0gICAgU1NMTW9kQ29uZmlnUmVjICptYyA9IG15TW9kQ29uZmlnKCk7Ci0KLSAgICAvKiByZW1vdmUgdGhlIG11dGV4IGxvY2tmaWxlICovCi0gICAgdW5saW5rKG1jLT5zek11dGV4RmlsZSk7Ci0jZW5kaWYKLSAgICByZXR1cm47Ci19Ci0KLSNpZm5kZWYgV0lOMzIKLSNpZmRlZiBTU0xfVVNFX0ZDTlRMCi1zdGF0aWMgc3RydWN0IGZsb2NrICAgbG9ja19pdDsKLXN0YXRpYyBzdHJ1Y3QgZmxvY2sgdW5sb2NrX2l0OwotI2VuZGlmCi0jZW5kaWYKLQotQk9PTCBzc2xfbXV0ZXhfZmlsZV9hY3F1aXJlKHZvaWQpCi17Ci0gICAgaW50IHJjID0gLTE7Ci0jaWZuZGVmIFdJTjMyCi0gICAgU1NMTW9kQ29uZmlnUmVjICptYyA9IG15TW9kQ29uZmlnKCk7Ci0KLSNpZmRlZiBTU0xfVVNFX0ZDTlRMCi0gICAgbG9ja19pdC5sX3doZW5jZSA9IFNFRUtfU0VUOyAvKiBmcm9tIGN1cnJlbnQgcG9pbnQgKi8KLSAgICBsb2NrX2l0Lmxfc3RhcnQgID0gMDsgICAgICAgIC8qIC0iLSAqLwotICAgIGxvY2tfaXQubF9sZW4gICAgPSAwOyAgICAgICAgLyogdW50aWwgZW5kIG9mIGZpbGUgKi8KLSAgICBsb2NrX2l0LmxfdHlwZSAgID0gRl9XUkxDSzsgIC8qIHNldCBleGNsdXNpdmUvd3JpdGUgbG9jayAqLwotICAgIGxvY2tfaXQubF9waWQgICAgPSAwOyAgICAgICAgLyogcGlkIG5vdCBhY3R1YWxseSBpbnRlcmVzdGluZyAqLwotCi0gICAgd2hpbGUgKCAgICgocmMgPSBmY250bChtYy0+bk11dGV4RkQsIEZfU0VUTEtXLCAmbG9ja19pdCkpIDwgMCkKLSAgICAgICAgICAgJiYgKGVycm5vID09IEVJTlRSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgCi0gICAgICAgIDsKLSNlbmRpZgotI2lmZGVmIFNTTF9VU0VfRkxPQ0sKLSAgICB3aGlsZSAoICAgKChyYyA9IGZsb2NrKG1jLT5uTXV0ZXhGRCwgTE9DS19FWCkpIDwgMCkKLSAgICAgICAgICAgJiYgKGVycm5vID09IEVJTlRSKSAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgIDsKLSNlbmRpZgotI2VuZGlmCi0KLSAgICBpZiAocmMgPCAwKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gVFJVRTsKLX0KLQotQk9PTCBzc2xfbXV0ZXhfZmlsZV9yZWxlYXNlKHZvaWQpCi17Ci0gICAgaW50IHJjID0gLTE7Ci0jaWZuZGVmIFdJTjMyCi0gICAgU1NMTW9kQ29uZmlnUmVjICptYyA9IG15TW9kQ29uZmlnKCk7Ci0KLSNpZmRlZiBTU0xfVVNFX0ZDTlRMCi0gICAgdW5sb2NrX2l0Lmxfd2hlbmNlID0gU0VFS19TRVQ7IC8qIGZyb20gY3VycmVudCBwb2ludCAqLwotICAgIHVubG9ja19pdC5sX3N0YXJ0ICA9IDA7ICAgICAgICAvKiAtIi0gKi8KLSAgICB1bmxvY2tfaXQubF9sZW4gICAgPSAwOyAgICAgICAgLyogdW50aWwgZW5kIG9mIGZpbGUgKi8KLSAgICB1bmxvY2tfaXQubF90eXBlICAgPSBGX1VOTENLOyAgLyogdW5sb2NrICovCi0gICAgdW5sb2NrX2l0LmxfcGlkICAgID0gMDsgICAgICAgIC8qIHBpZCBub3QgYWN0dWFsbHkgaW50ZXJlc3RpbmcgKi8KLQotICAgIHdoaWxlICggICAocmMgPSBmY250bChtYy0+bk11dGV4RkQsIEZfU0VUTEtXLCAmdW5sb2NrX2l0KSkgPCAwCi0gICAgICAgICAgICYmIChlcnJubyA9PSBFSU5UUikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgIDsKLSNlbmRpZgotI2lmZGVmIFNTTF9VU0VfRkxPQ0sKLSAgICB3aGlsZSAoICAgKHJjID0gZmxvY2sobWMtPm5NdXRleEZELCBMT0NLX1VOKSkgPCAwCi0gICAgICAgICAgICYmIChlcnJubyA9PSBFSU5UUikgICAgICAgICAgICAgICAgICAgICAgICkgCi0gICAgICAgIDsKLSNlbmRpZgotI2VuZGlmCi0KLSAgICBpZiAocmMgPCAwKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gVFJVRTsKLX0KLQotLyogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogIE11dGV4IFN1cHBvcnQgKFByb2Nlc3MgU2VtYXBob3JlKQotKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qLwotCi12b2lkIHNzbF9tdXRleF9zZW1fY3JlYXRlKHNlcnZlcl9yZWMgKnMsIHBvb2wgKnApCi17Ci0jaWZkZWYgU1NMX0NBTl9VU0VfU0VNCi0gICAgaW50IHNlbWlkOwotICAgIFNTTE1vZENvbmZpZ1JlYyAqbWMgPSBteU1vZENvbmZpZygpOwotI2lmZGVmIFNTTF9IQVZFX0lQQ1NFTQotICAgIHVuaW9uIHNzbF9pcGNfc2VtdW4gc2VtY3RsYXJnOwotICAgIHN0cnVjdCBzZW1pZF9kcyBzZW1jdGxidWY7Ci0jZW5kaWYKLQotI2lmZGVmIFNTTF9IQVZFX0lQQ1NFTQotICAgIHNlbWlkID0gc2VtZ2V0KElQQ19QUklWQVRFLCAxLCBJUENfQ1JFQVR8SVBDX0VYQ0x8U19JUlVTUnxTX0lXVVNSKTsKLSAgICBpZiAoc2VtaWQgPT0gLTEgJiYgZXJybm8gPT0gRUVYSVNUKQotICAgICAgICBzZW1pZCA9IHNlbWdldChJUENfUFJJVkFURSwgMSwgSVBDX0VYQ0x8U19JUlVTUnxTX0lXVVNSKTsKLSAgICBpZiAoc2VtaWQgPT0gLTEpIHsKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SfFNTTF9BRERfRVJSTk8sCi0gICAgICAgICAgICAgICAgIlBhcmVudCBwcm9jZXNzIGNvdWxkIG5vdCBjcmVhdGUgcHJpdmF0ZSBTU0xNdXRleCBzZW1hcGhvcmUiKTsKLSAgICAgICAgc3NsX2RpZSgpOwotICAgIH0KLSAgICBzZW1jdGxhcmcudmFsID0gMDsKLSAgICBpZiAoc2VtY3RsKHNlbWlkLCAwLCBTRVRWQUwsIHNlbWN0bGFyZykgPCAwKSB7Ci0gICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19FUlJPUnxTU0xfQUREX0VSUk5PLAotICAgICAgICAgICAgICAgICJQYXJlbnQgcHJvY2VzcyBjb3VsZCBub3QgaW5pdGlhbGl6ZSBTU0xNdXRleCBzZW1hcGhvcmUgdmFsdWUiKTsKLSAgICAgICAgc3NsX2RpZSgpOwotICAgIH0KLSAgICBzZW1jdGxidWYuc2VtX3Blcm0udWlkICA9IGFwX3VzZXJfaWQ7Ci0gICAgc2VtY3RsYnVmLnNlbV9wZXJtLmdpZCAgPSBhcF9ncm91cF9pZDsKLSAgICBzZW1jdGxidWYuc2VtX3Blcm0ubW9kZSA9IDA2NjA7Ci0gICAgc2VtY3RsYXJnLmJ1ZiA9ICZzZW1jdGxidWY7Ci0gICAgaWYgKHNlbWN0bChzZW1pZCwgMCwgSVBDX1NFVCwgc2VtY3RsYXJnKSA8IDApIHsKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SfFNTTF9BRERfRVJSTk8sCi0gICAgICAgICAgICAgICAgIlBhcmVudCBwcm9jZXNzIGNvdWxkIG5vdCBzZXQgcGVybWlzc2lvbnMgZm9yIFNTTE11dGV4IHNlbWFwaG9yZSIpOwotICAgICAgICBzc2xfZGllKCk7Ci0gICAgfQotI2VuZGlmCi0jaWZkZWYgU1NMX0hBVkVfVzMyU0VNCi0gICAgc2VtaWQgPSAoaW50KWFwX2NyZWF0ZV9tdXRleCgibW9kX3NzbF9tdXRleCIpOwotI2VuZGlmCi0gICAgbWMtPm5NdXRleFNFTUlEID0gc2VtaWQ7Ci0jZW5kaWYKLSAgICByZXR1cm47Ci19Ci0KLXZvaWQgc3NsX211dGV4X3NlbV9vcGVuKHNlcnZlcl9yZWMgKnMsIHBvb2wgKnApCi17Ci0jaWZkZWYgU1NMX0NBTl9VU0VfU0VNCi0jaWZkZWYgU1NMX0hBVkVfVzMyU0VNCi0gICAgU1NMTW9kQ29uZmlnUmVjICptYyA9IG15TW9kQ29uZmlnKCk7Ci0KLSAgICBtYy0+bk11dGV4U0VNSUQgPSAoaW50KWFwX29wZW5fbXV0ZXgoIm1vZF9zc2xfbXV0ZXgiKTsKLSNlbmRpZgotI2VuZGlmCi0gICAgcmV0dXJuOwotfQotCi12b2lkIHNzbF9tdXRleF9zZW1fcmVtb3ZlKHZvaWQgKmRhdGEpCi17Ci0jaWZkZWYgU1NMX0NBTl9VU0VfU0VNCi0gICAgU1NMTW9kQ29uZmlnUmVjICptYyA9IG15TW9kQ29uZmlnKCk7Ci0KLSNpZmRlZiBTU0xfSEFWRV9JUENTRU0KLSAgICBzZW1jdGwobWMtPm5NdXRleFNFTUlELCAwLCBJUENfUk1JRCwgMCk7Ci0jZW5kaWYKLSNpZmRlZiBTU0xfSEFWRV9XMzJTRU0KLSAgICBhcF9kZXN0cm95X211dGV4KChtdXRleCAqKW1jLT5uTXV0ZXhTRU1JRCk7Ci0jZW5kaWYKLSNlbmRpZgotICAgIHJldHVybjsKLX0KLQotQk9PTCBzc2xfbXV0ZXhfc2VtX2FjcXVpcmUodm9pZCkKLXsKLSAgICBpbnQgcmMgPSAwOwotI2lmZGVmIFNTTF9DQU5fVVNFX1NFTQotICAgIFNTTE1vZENvbmZpZ1JlYyAqbWMgPSBteU1vZENvbmZpZygpOwotCi0jaWZkZWYgU1NMX0hBVkVfSVBDU0VNCi0gICAgc3RydWN0IHNlbWJ1ZiBzYltdID0gewotICAgICAgICB7IDAsIDAsIDAgfSwgICAgICAgLyogd2FpdCBmb3Igc2VtYXBob3JlICovCi0gICAgICAgIHsgMCwgMSwgU0VNX1VORE8gfSAvKiBpbmNyZW1lbnQgc2VtYXBob3JlICovCi0gICAgfTsKLQotICAgIHdoaWxlICggICAocmMgPSBzZW1vcChtYy0+bk11dGV4U0VNSUQsIHNiLCAyKSkgPCAwCi0gICAgICAgICAgICYmIChlcnJubyA9PSBFSU5UUikgICAgICAgICAgICAgICAgICAgICAgICApIAotICAgICAgICA7Ci0jZW5kaWYKLSNpZmRlZiBTU0xfSEFWRV9XMzJTRU0KLSAgICByYyA9IGFwX2FjcXVpcmVfbXV0ZXgoKG11dGV4ICopbWMtPm5NdXRleFNFTUlEKTsKLSNlbmRpZgotI2VuZGlmCi0gICAgaWYgKHJjICE9IDApCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBUUlVFOwotfQotCi1CT09MIHNzbF9tdXRleF9zZW1fcmVsZWFzZSh2b2lkKQotewotICAgIGludCByYyA9IDA7Ci0jaWZkZWYgU1NMX0NBTl9VU0VfU0VNCi0gICAgU1NMTW9kQ29uZmlnUmVjICptYyA9IG15TW9kQ29uZmlnKCk7Ci0KLSNpZmRlZiBTU0xfSEFWRV9JUENTRU0KLSAgICBzdHJ1Y3Qgc2VtYnVmIHNiW10gPSB7Ci0gICAgICAgIHsgMCwgLTEsIFNFTV9VTkRPIH0gLyogZGVjcmVtZW50cyBzZW1hcGhvcmUgKi8KLSAgICB9OwotCi0gICAgd2hpbGUgKCAgIChyYyA9IHNlbW9wKG1jLT5uTXV0ZXhTRU1JRCwgc2IsIDEpKSA8IDAgCi0gICAgICAgICAgICYmIChlcnJubyA9PSBFSU5UUikgICAgICAgICAgICAgICAgICAgICAgICApIAotICAgICAgICA7Ci0jZW5kaWYKLSNpZmRlZiBTU0xfSEFWRV9XMzJTRU0KLSAgICByYyA9IGFwX3JlbGVhc2VfbXV0ZXgoKG11dGV4ICopbWMtPm5NdXRleFNFTUlEKTsKLSNlbmRpZgotI2VuZGlmCi0gICAgaWYgKHJjICE9IDApCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBUUlVFOwotfQotCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NzbC9zc2xfZW5naW5lX3BwaHJhc2UuYyBiL21vZHVsZXMvc3NsL3NzbF9lbmdpbmVfcHBocmFzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2VmNGUzLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvc3NsL3NzbF9lbmdpbmVfcHBocmFzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQ1ICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgIF8gICAgICAgICAgICAgXwotKiogIF8gX18gX19fICAgX19fICAgX198IHwgICAgX19fIF9fX3wgfCAgbW9kX3NzbAotKiogfCAnXyBgIF8gXCAvIF8gXCAvIF9gIHwgICAvIF9fLyBfX3wgfCAgQXBhY2hlIEludGVyZmFjZSB0byBPcGVuU1NMCi0qKiB8IHwgfCB8IHwgfCAoXykgfCAoX3wgfCAgIFxfXyBcX18gXCB8ICB3d3cubW9kc3NsLm9yZwotKiogfF98IHxffCB8X3xcX19fLyBcX18sX3xfX198X19fL19fXy9ffCAgZnRwLm1vZHNzbC5vcmcKLSoqICAgICAgICAgICAgICAgICAgICAgIHxfX19fX3wKLSoqICBzc2xfZW5naW5lX3BwaHJhc2UuYwotKiogIFBhc3MgUGhyYXNlIERpYWxvZwotKi8KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAxIFJhbGYgUy4gRW5nZWxzY2hhbGwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci0gKiAgICAgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGVuZ2Vsc2NoYWxsLmNvbT4gZm9yIHVzZSBpbiB0aGUKLSAqICAgICBtb2Rfc3NsIHByb2plY3QgKGh0dHA6Ly93d3cubW9kc3NsLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIm1vZF9zc2wiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICByc2VAZW5nZWxzY2hhbGwuY29tLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJtb2Rfc3NsIgotICogICAgbm9yIG1heSAibW9kX3NzbCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3IKLSAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBSYWxmIFMuIEVuZ2Vsc2NoYWxsLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLSAqICAgICBSYWxmIFMuIEVuZ2Vsc2NoYWxsIDxyc2VAZW5nZWxzY2hhbGwuY29tPiBmb3IgdXNlIGluIHRoZQotICogICAgIG1vZF9zc2wgcHJvamVjdCAoaHR0cDovL3d3dy5tb2Rzc2wub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgUkFMRiBTLiBFTkdFTFNDSEFMTCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgUkFMRiBTLiBFTkdFTFNDSEFMTCBPUgotICogSElTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGBgVHJlYXQgeW91ciBwYXNzd29yZCBsaWtlIHlvdXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b290aGJydXNoLiBEb24ndCBsZXQgYW55Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgdXNlIGl0LCBhbmQgZ2V0IGEgbmV3IG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZXJ5IHNpeCBtb250aHMuJycKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBDbGlmZm9yZCBTdG9sbCAgICAgKi8KLSNpbmNsdWRlICJtb2Rfc3NsLmgiCi0KLQotLyogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogIFBhc3MgUGhyYXNlIGFuZCBQcml2YXRlIEtleSBIYW5kbGluZwotKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qLwotCi0jZGVmaW5lIFNUREVSUl9GSUxFTk9fU1RPUkUgNTAKLSNkZWZpbmUgQlVJTFRJTl9ESUFMT0dfQkFDS09GRiAyCi0jZGVmaW5lIEJVSUxUSU5fRElBTE9HX1JFVFJJRVMgNQotCi12b2lkIHNzbF9wcGhyYXNlX0hhbmRsZShzZXJ2ZXJfcmVjICpzLCBwb29sICpwKQotewotICAgIFNTTE1vZENvbmZpZ1JlYyAqbWMgPSBteU1vZENvbmZpZygpOwotICAgIFNTTFNydkNvbmZpZ1JlYyAqc2M7Ci0gICAgc2VydmVyX3JlYyAqcFNlcnY7Ci0gICAgY2hhciAqY3BWSG9zdElEOwotICAgIGNoYXIgc3pQYXRoW01BWF9TVFJJTkdfTEVOXTsKLSAgICBFVlBfUEtFWSAqcFByaXZhdGVLZXk7Ci0gICAgc3NsX2FzbjFfdCAqYXNuMTsKLSAgICB1bnNpZ25lZCBjaGFyICp1Y3A7Ci0gICAgWDUwOSAqcFg1MDlDZXJ0OwotICAgIEZJTEUgKmZwOwotICAgIEJPT0wgYlJlYWRhYmxlOwotICAgIHNzbF9kc19hcnJheSAqYVBhc3NQaHJhc2U7Ci0gICAgaW50IG5QYXNzUGhyYXNlOwotICAgIGludCBuUGFzc1BocmFzZUN1cjsKLSAgICBjaGFyICpjcFBhc3NQaHJhc2VDdXI7Ci0gICAgaW50IG5QYXNzUGhyYXNlUmV0cnk7Ci0gICAgaW50IG5QYXNzUGhyYXNlRGlhbG9nOwotICAgIGludCBuUGFzc1BocmFzZURpYWxvZ0N1cjsKLSAgICBCT09MIGJQYXNzUGhyYXNlRGlhbG9nT25jZTsKLSAgICBjaGFyICoqY3BwOwotICAgIGludCBpLCBqOwotICAgIHNzbF9hbGdvX3QgYWxnb0NlcnQsIGFsZ29LZXksIGF0OwotICAgIGNoYXIgKmFuOwotICAgIGNoYXIgKmNwOwotCi0gICAgLyoKLSAgICAgKiBTdGFydCB3aXRoIGEgZnJlc2ggcGFzcyBwaHJhc2UgYXJyYXkKLSAgICAgKi8KLSAgICBhUGFzc1BocmFzZSAgICAgICA9IHNzbF9kc19hcnJheV9tYWtlKHAsIHNpemVvZihjaGFyICopKTsKLSAgICBuUGFzc1BocmFzZSAgICAgICA9IDA7Ci0gICAgblBhc3NQaHJhc2VEaWFsb2cgPSAwOwotCi0gICAgLyoKLSAgICAgKiBXYWxrIHRocm91Z2ggYWxsIGNvbmZpZ3VyZWQgc2VydmVycwotICAgICAqLwotICAgIGZvciAocFNlcnYgPSBzOyBwU2VydiAhPSBOVUxMOyBwU2VydiA9IHBTZXJ2LT5uZXh0KSB7Ci0gICAgICAgIHNjID0gbXlTcnZDb25maWcocFNlcnYpOwotCi0gICAgICAgIGlmICghc2MtPmJFbmFibGVkKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgY3BWSG9zdElEID0gc3NsX3V0aWxfdmhvc3RpZChwLCBwU2Vydik7Ci0gICAgICAgIHNzbF9sb2cocFNlcnYsIFNTTF9MT0dfSU5GTywKLSAgICAgICAgICAgICAgICAiSW5pdDogTG9hZGluZyBjZXJ0aWZpY2F0ZSAmIHByaXZhdGUga2V5IG9mIFNTTC1hd2FyZSBzZXJ2ZXIgJXMiLAotICAgICAgICAgICAgICAgIGNwVkhvc3RJRCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogUmVhZCBpbiBzZXJ2ZXIgY2VydGlmaWNhdGUocyk6IFRoaXMgaXMgdGhlIGVhc3kgcGFydAotICAgICAgICAgKiBiZWNhdXNlIHRoaXMgZmlsZSBpc24ndCBlbmNyeXB0ZWQgaW4gYW55IHdheS4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChzYy0+c3pQdWJsaWNDZXJ0RmlsZVswXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBzc2xfbG9nKHBTZXJ2LCBTU0xfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAiSW5pdDogU2VydmVyICVzIHNob3VsZCBiZSBTU0wtYXdhcmUgYnV0IGhhcyBubyBjZXJ0aWZpY2F0ZSBjb25maWd1cmVkICIKLSAgICAgICAgICAgICAgICAgICAgIltIaW50OiBTU0xDZXJ0aWZpY2F0ZUZpbGVdIiwgY3BWSG9zdElEKTsKLSAgICAgICAgICAgIHNzbF9kaWUoKTsKLSAgICAgICAgfQotICAgICAgICBhbGdvQ2VydCA9IFNTTF9BTEdPX1VOS05PV047Ci0gICAgICAgIGFsZ29LZXkgID0gU1NMX0FMR09fVU5LTk9XTjsKLSAgICAgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBTU0xfQUlEWF9NQVggJiYgc2MtPnN6UHVibGljQ2VydEZpbGVbaV0gIT0gTlVMTDsgaSsrKSB7Ci0KLSAgICAgICAgICAgIGFwX2NweXN0cm4oc3pQYXRoLCBzYy0+c3pQdWJsaWNDZXJ0RmlsZVtpXSwgc2l6ZW9mKHN6UGF0aCkpOwotICAgICAgICAgICAgaWYgKChmcCA9IGFwX3Bmb3BlbihwLCBzelBhdGgsICJyIikpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1J8U1NMX0FERF9FUlJOTywKLSAgICAgICAgICAgICAgICAgICAgICAgICJJbml0OiBDYW4ndCBvcGVuIHNlcnZlciBjZXJ0aWZpY2F0ZSBmaWxlICVzIiwgc3pQYXRoKTsKLSAgICAgICAgICAgICAgICBzc2xfZGllKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKHBYNTA5Q2VydCA9IFNTTF9yZWFkX1g1MDkoZnAsIE5VTEwsIE5VTEwpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SfFNTTF9BRERfU1NMRVJSLAotICAgICAgICAgICAgICAgICAgICAgICAgIkluaXQ6IFVuYWJsZSB0byByZWFkIHNlcnZlciBjZXJ0aWZpY2F0ZSBmcm9tIGZpbGUgJXMiLCBzelBhdGgpOwotICAgICAgICAgICAgICAgIHNzbF9kaWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFwX3BmY2xvc2UocCwgZnApOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogY2hlY2sgYWxnb3JpdGhtIHR5cGUgb2YgY2VydGlmaWNhdGUgYW5kIG1ha2UKLSAgICAgICAgICAgICAqIHN1cmUgb25seSBvbmUgY2VydGlmaWNhdGUgcGVyIHR5cGUgaXMgdXNlZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYXQgPSBzc2xfdXRpbF9hbGdvdHlwZW9mKHBYNTA5Q2VydCwgTlVMTCk7Ci0gICAgICAgICAgICBhbiA9IHNzbF91dGlsX2FsZ290eXBlc3RyKGF0KTsKLSAgICAgICAgICAgIGlmIChhbGdvQ2VydCAmIGF0KSB7Ci0gICAgICAgICAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SfFNTTF9BRERfU1NMRVJSLAotICAgICAgICAgICAgICAgICAgICAgICAgIkluaXQ6IE11bHRpcGxlICVzIHNlcnZlciBjZXJ0aWZpY2F0ZXMgbm90IGFsbG93ZWQiLCBhbik7Ci0gICAgICAgICAgICAgICAgc3NsX2RpZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWxnb0NlcnQgfD0gYXQ7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBJbnNlcnQgdGhlIGNlcnRpZmljYXRlIGludG8gZ2xvYmFsIG1vZHVsZSBjb25maWd1cmF0aW9uIHRvIGxldCBpdAotICAgICAgICAgICAgICogc3Vydml2ZSB0aGUgcHJvY2Vzc2luZyBiZXR3ZWVuIHRoZSAxc3QgQXBhY2hlIEFQSSBpbml0IHJvdW5kICh3aGVyZQotICAgICAgICAgICAgICogd2Ugb3BlcmF0ZSBoZXJlKSBhbmQgdGhlIDJuZCBBcGFjaGUgaW5pdCByb3VuZCAod2hlcmUgdGhlCi0gICAgICAgICAgICAgKiBjZXJ0aWZpY2F0ZSBpcyBhY3R1YWxseSB1c2VkIHRvIGNvbmZpZ3VyZSBtb2Rfc3NsJ3MgcGVyLXNlcnZlcgotICAgICAgICAgICAgICogY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmVzKS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgY3AgPSBhcF9wc3ByaW50ZihtYy0+cFBvb2wsICIlczolcyIsIGNwVkhvc3RJRCwgYW4pOwotICAgICAgICAgICAgYXNuMSA9IChzc2xfYXNuMV90ICopc3NsX2RzX3RhYmxlX3B1c2gobWMtPnRQdWJsaWNDZXJ0LCBjcCk7Ci0gICAgICAgICAgICBhc24xLT5uRGF0YSAgPSBpMmRfWDUwOShwWDUwOUNlcnQsIE5VTEwpOwotICAgICAgICAgICAgYXNuMS0+Y3BEYXRhID0gYXBfcGFsbG9jKG1jLT5wUG9vbCwgYXNuMS0+bkRhdGEpOwotICAgICAgICAgICAgdWNwID0gYXNuMS0+Y3BEYXRhOyBpMmRfWDUwOShwWDUwOUNlcnQsICZ1Y3ApOyAvKiAybmQgYXJnIGluY3JlbWVudHMgKi8KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEZyZWUgdGhlIFg1MDkgc3RydWN0dXJlCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFg1MDlfZnJlZShwWDUwOUNlcnQpOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogUmVhZCBpbiB0aGUgcHJpdmF0ZSBrZXk6IFRoaXMgaXMgdGhlIG5vbi10cml2aWFsIHBhcnQsIGJlY2F1c2UgdGhlCi0gICAgICAgICAgICAgKiBrZXkgaXMgdHlwaWNhbGx5IGVuY3J5cHRlZCwgc28gYSBwYXNzIHBocmFzZSBkaWFsb2cgaGFzIHRvIGJlIHVzZWQKLSAgICAgICAgICAgICAqIHRvIHJlcXVlc3QgaXQgZnJvbSB0aGUgdXNlciAob3IgaXQgaGFzIHRvIGJlIGFsdGVybmF0aXZlbHkgZ2F0aGVyZWQKLSAgICAgICAgICAgICAqIGZyb20gYSBkaWFsb2cgcHJvZ3JhbSkuIFRoZSBpbXBvcnRhbnQgcG9pbnQgaGVyZSBpcyB0aGF0IElTUHMKLSAgICAgICAgICAgICAqIHVzdWFsbHkgaGF2ZSBodW5kcmV0cyBvZiB2aXJ0dWFsIHNlcnZlcnMgY29uZmlndXJlZCBhbmQgYSBsb3Qgb2YKLSAgICAgICAgICAgICAqIHRoZW0gdXNlIFNTTCwgc28gcmVhbGx5IHdlIGhhdmUgdG8gbWluaW1pemUgdGhlIHBhc3MgcGhyYXNlCi0gICAgICAgICAgICAgKiBkaWFsb2dzLgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIFRoZSBpZGVhIGlzIHRoaXM6IFdoZW4gTiB2aXJ0dWFsIGhvc3RzIGFyZSBjb25maWd1cmVkIGFuZCBhbGwgb2YKLSAgICAgICAgICAgICAqIHRoZW0gdXNlIGVuY3J5cHRlZCBwcml2YXRlIGtleXMgd2l0aCBkaWZmZXJlbnQgcGFzcyBwaHJhc2VzLCB3ZQotICAgICAgICAgICAgICogaGF2ZSBubyBjaGFuY2UgYW5kIGhhdmUgdG8gcG9wIHVwIE4gcGFzcyBwaHJhc2UgZGlhbG9ncy4gQnV0Ci0gICAgICAgICAgICAgKiB1c3VhbGx5IHRoZSBhZG1pbiBpcyBjbGV2ZXIgZW5vdWdoIGFuZCB1c2VzIHRoZSBzYW1lIHBhc3MgcGhyYXNlCi0gICAgICAgICAgICAgKiBmb3IgbW9yZSBwcml2YXRlIGtleSBmaWxlcyAodHlwaWNhbGx5IGhlIGV2ZW4gdXNlcyBvbmUgc2luZ2xlIHBhc3MKLSAgICAgICAgICAgICAqIHBocmFzZSBmb3IgYWxsKS4gV2hlbiB0aGlzIGlzIHRoZSBjYXNlIHdlIGNhbiBtaW5pbWl6ZSB0aGUgZGlhbG9ncwotICAgICAgICAgICAgICogYnkgdHJ5aW5nIHRvIHJlLXVzZSBhbHJlYWR5IGtub3duL2VudGVyZWQgcGFzcyBwaHJhc2VzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoc2MtPnN6UHJpdmF0ZUtleUZpbGVbal0gIT0gTlVMTCkKLSAgICAgICAgICAgICAgICBhcF9jcHlzdHJuKHN6UGF0aCwgc2MtPnN6UHJpdmF0ZUtleUZpbGVbaisrXSwgc2l6ZW9mKHN6UGF0aCkpOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVHJ5IHRvIHJlYWQgdGhlIHByaXZhdGUga2V5IGZpbGUgd2l0aCB0aGUgaGVscCBvZgotICAgICAgICAgICAgICogdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHNlcnZlcyB0aGUgcGFzcwotICAgICAgICAgICAgICogcGhyYXNlcyB0byBPcGVuU1NMCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG15Q3R4VmFyU2V0KG1jLCAgMSwgcFNlcnYpOwotICAgICAgICAgICAgbXlDdHhWYXJTZXQobWMsICAyLCBwKTsKLSAgICAgICAgICAgIG15Q3R4VmFyU2V0KG1jLCAgMywgYVBhc3NQaHJhc2UpOwotICAgICAgICAgICAgbXlDdHhWYXJTZXQobWMsICA0LCAmblBhc3NQaHJhc2VDdXIpOwotICAgICAgICAgICAgbXlDdHhWYXJTZXQobWMsICA1LCAmY3BQYXNzUGhyYXNlQ3VyKTsKLSAgICAgICAgICAgIG15Q3R4VmFyU2V0KG1jLCAgNiwgY3BWSG9zdElEKTsKLSAgICAgICAgICAgIG15Q3R4VmFyU2V0KG1jLCAgNywgYW4pOwotICAgICAgICAgICAgbXlDdHhWYXJTZXQobWMsICA4LCAmblBhc3NQaHJhc2VEaWFsb2cpOwotICAgICAgICAgICAgbXlDdHhWYXJTZXQobWMsICA5LCAmblBhc3NQaHJhc2VEaWFsb2dDdXIpOwotICAgICAgICAgICAgbXlDdHhWYXJTZXQobWMsIDEwLCAmYlBhc3NQaHJhc2VEaWFsb2dPbmNlKTsKLQotICAgICAgICAgICAgblBhc3NQaHJhc2VDdXIgICAgICAgID0gMDsKLSAgICAgICAgICAgIG5QYXNzUGhyYXNlUmV0cnkgICAgICA9IDA7Ci0gICAgICAgICAgICBuUGFzc1BocmFzZURpYWxvZ0N1ciAgPSAwOwotICAgICAgICAgICAgYlBhc3NQaHJhc2VEaWFsb2dPbmNlID0gVFJVRTsKLQotCQkJcFByaXZhdGVLZXkgPSBOVUxMOwotCi0gICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBUcnkgdG8gcmVhZCB0aGUgcHJpdmF0ZSBrZXkgZmlsZSB3aXRoIHRoZSBoZWxwIG9mCi0gICAgICAgICAgICAgICAgICogdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHNlcnZlcyB0aGUgcGFzcwotICAgICAgICAgICAgICAgICAqIHBocmFzZXMgdG8gT3BlblNTTAotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmICgoZnAgPSBhcF9wZm9wZW4ocCwgc3pQYXRoLCAiciIpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19FUlJPUnxTU0xfQUREX0VSUk5PLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbml0OiBDYW4ndCBvcGVuIHNlcnZlciBwcml2YXRlIGtleSBmaWxlICVzIiwgc3pQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgc3NsX2RpZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjcFBhc3NQaHJhc2VDdXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIGJSZWFkYWJsZSA9ICgocFByaXZhdGVLZXkgPSBTU0xfcmVhZF9Qcml2YXRlS2V5KGZwLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfcHBocmFzZV9IYW5kbGVfQ0IpKSAhPSBOVUxMID8gVFJVRSA6IEZBTFNFKTsKLSAgICAgICAgICAgICAgICBhcF9wZmNsb3NlKHAsIGZwKTsKLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogd2hlbiB0aGUgcHJpdmF0ZSBrZXkgZmlsZSBub3cgd2FzIHJlYWRhYmxlLAotICAgICAgICAgICAgICAgICAqIGl0J3MgZmluZSBhbmQgd2UgZ28gb3V0IG9mIHRoZSBsb29wCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKGJSZWFkYWJsZSkKLSAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogd2hlbiB3ZSBoYXZlIG1vcmUgcmVtZW1iZXJlZCBwYXNzIHBocmFzZXMKLSAgICAgICAgICAgICAgICAgKiB0cnkgdG8gcmV1c2UgdGhlc2UgZmlyc3QuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKG5QYXNzUGhyYXNlQ3VyIDwgblBhc3NQaHJhc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgblBhc3NQaHJhc2VDdXIrKzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBlbHNlIGl0J3Mgbm90IHJlYWRhYmxlIGFuZCB3ZSBoYXZlIG5vIG1vcmUKLSAgICAgICAgICAgICAgICAgKiByZW1lbWJlcmVkIHBhc3MgcGhyYXNlcy4gVGhlbiB0aGlzIGhhcyB0byBtZWFuCi0gICAgICAgICAgICAgICAgICogdGhhdCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gcG9wcGVkIHVwIHRoZSBkaWFsb2cKLSAgICAgICAgICAgICAgICAgKiBidXQgYSB3cm9uZyBwYXNzIHBocmFzZSB3YXMgZW50ZXJlZC4gIFdlIGdpdmUgdGhlCi0gICAgICAgICAgICAgICAgICogdXNlciAoYnV0IG5vdCB0aGUgZGlhbG9nIHByb2dyYW0pIGEgZmV3IG1vcmUKLSAgICAgICAgICAgICAgICAgKiBjaGFuY2VzLi4uCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKCAgIHNjLT5uUGFzc1BocmFzZURpYWxvZ1R5cGUgPT0gU1NMX1BQVFlQRV9CVUlMVElOCi0gICAgICAgICAgICAgICAgICAgICYmIGNwUGFzc1BocmFzZUN1ciAhPSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICYmIG5QYXNzUGhyYXNlUmV0cnkgPCBCVUlMVElOX0RJQUxPR19SRVRSSUVTICkgewotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIkFwYWNoZTptb2Rfc3NsOkVycm9yOiBQYXNzIHBocmFzZSBpbmNvcnJlY3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoJWQgbW9yZSByZXRyJXMgcGVybWl0dGVkKS5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJVSUxUSU5fRElBTE9HX1JFVFJJRVMtblBhc3NQaHJhc2VSZXRyeSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJVSUxUSU5fRElBTE9HX1JFVFJJRVMtblBhc3NQaHJhc2VSZXRyeSkgPT0gMSA/ICJ5IiA6ICJpZXMiKTsKLSAgICAgICAgICAgICAgICAgICAgblBhc3NQaHJhc2VSZXRyeSsrOwotICAgICAgICAgICAgICAgICAgICBpZiAoblBhc3NQaHJhc2VSZXRyeSA+IEJVSUxUSU5fRElBTE9HX0JBQ0tPRkYpCi0gICAgICAgICAgICAgICAgICAgICAgICBzbGVlcCgoblBhc3NQaHJhc2VSZXRyeS1CVUlMVElOX0RJQUxPR19CQUNLT0ZGKSo1KTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBPaywgYW55dGhpbmcgZWxzZSBub3cgbWVhbnMgYSBmYXRhbCBlcnJvci4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoY3BQYXNzUGhyYXNlQ3VyID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIHNzbF9sb2cocFNlcnYsIFNTTF9MT0dfRVJST1J8U1NMX0FERF9TU0xFUlIsICJJbml0OiBQcml2YXRlIGtleSBub3QgZm91bmQiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjLT5uUGFzc1BocmFzZURpYWxvZ1R5cGUgPT0gU1NMX1BQVFlQRV9CVUlMVElOKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIkFwYWNoZTptb2Rfc3NsOkVycm9yOiBQcml2YXRlIGtleSBub3QgZm91bmQuXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiKipTdG9wcGVkXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzc2xfbG9nKHBTZXJ2LCBTU0xfTE9HX0VSUk9SfFNTTF9BRERfU1NMRVJSLCAiSW5pdDogUGFzcyBwaHJhc2UgaW5jb3JyZWN0Iik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzYy0+blBhc3NQaHJhc2VEaWFsb2dUeXBlID09IFNTTF9QUFRZUEVfQlVJTFRJTikgewotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICJBcGFjaGU6bW9kX3NzbDpFcnJvcjogUGFzcyBwaHJhc2UgaW5jb3JyZWN0LlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIioqU3RvcHBlZFxuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3NsX2RpZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocFByaXZhdGVLZXkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19FUlJPUnxTU0xfQUREX1NTTEVSUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJJbml0OiBVbmFibGUgdG8gcmVhZCBzZXJ2ZXIgcHJpdmF0ZSBrZXkgZnJvbSBmaWxlICVzIiwgc3pQYXRoKTsKLSAgICAgICAgICAgICAgICBzc2xfZGllKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBjaGVjayBhbGdvcml0aG0gdHlwZSBvZiBwcml2YXRlIGtleSBhbmQgbWFrZQotICAgICAgICAgICAgICogc3VyZSBvbmx5IG9uZSBwcml2YXRlIGtleSBwZXIgdHlwZSBpcyB1c2VkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBhdCA9IHNzbF91dGlsX2FsZ290eXBlb2YoTlVMTCwgcFByaXZhdGVLZXkpOwotICAgICAgICAgICAgYW4gPSBzc2xfdXRpbF9hbGdvdHlwZXN0cihhdCk7Ci0gICAgICAgICAgICBpZiAoYWxnb0tleSAmIGF0KSB7Ci0gICAgICAgICAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SfFNTTF9BRERfU1NMRVJSLAotICAgICAgICAgICAgICAgICAgICAgICAgIkluaXQ6IE11bHRpcGxlICVzIHNlcnZlciBwcml2YXRlIGtleXMgbm90IGFsbG93ZWQiLCBhbik7Ci0gICAgICAgICAgICAgICAgc3NsX2RpZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWxnb0tleSB8PSBhdDsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIExvZyB0aGUgdHlwZSBvZiByZWFkaW5nCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChuUGFzc1BocmFzZURpYWxvZ0N1ciA9PSAwKQotICAgICAgICAgICAgICAgIHNzbF9sb2cocFNlcnYsIFNTTF9MT0dfVFJBQ0UsIAotICAgICAgICAgICAgICAgICAgICAgICAgIkluaXQ6ICglcykgdW5lbmNyeXB0ZWQgJXMgcHJpdmF0ZSBrZXkgLSBwYXNzIHBocmFzZSBub3QgcmVxdWlyZWQiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNwVkhvc3RJRCwgYW4pOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNwUGFzc1BocmFzZUN1ciAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBzc2xfbG9nKHBTZXJ2LCBTU0xfTE9HX1RSQUNFLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5pdDogKCVzKSBlbmNyeXB0ZWQgJXMgcHJpdmF0ZSBrZXkgLSBwYXNzIHBocmFzZSByZXF1ZXN0ZWQiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcFZIb3N0SUQsIGFuKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHNzbF9sb2cocFNlcnYsIFNTTF9MT0dfVFJBQ0UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbml0OiAoJXMpIGVuY3J5cHRlZCAlcyBwcml2YXRlIGtleSAtIHBhc3MgcGhyYXNlIHJldXNlZCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwVkhvc3RJRCwgYW4pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogT2ssIHdoZW4gd2UgaGF2ZSBvbmUgbW9yZSBwYXNzIHBocmFzZSBzdG9yZSBpdAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoY3BQYXNzUGhyYXNlQ3VyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBjcHAgPSAoY2hhciAqKilzc2xfZHNfYXJyYXlfcHVzaChhUGFzc1BocmFzZSk7Ci0gICAgICAgICAgICAgICAgKmNwcCA9IGNwUGFzc1BocmFzZUN1cjsKLSAgICAgICAgICAgICAgICBuUGFzc1BocmFzZSsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogSW5zZXJ0IHByaXZhdGUga2V5IGludG8gdGhlIGdsb2JhbCBtb2R1bGUgY29uZmlndXJhdGlvbgotICAgICAgICAgICAgICogKHdlIGNvbnZlcnQgaXQgdG8gYSBzdGFuZC1hbG9uZSBERVIgYnl0ZSBzZXF1ZW5jZQotICAgICAgICAgICAgICogYmVjYXVzZSB0aGUgU1NMIGxpYnJhcnkgdXNlcyBzdGF0aWMgdmFyaWFibGVzIGluc2lkZSBhCi0gICAgICAgICAgICAgKiBSU0Egc3RydWN0dXJlIHdoaWNoIGRvIG5vdCBzdXJ2aXZlIERTTyByZWxvYWRzISkKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgY3AgPSBhcF9wc3ByaW50ZihtYy0+cFBvb2wsICIlczolcyIsIGNwVkhvc3RJRCwgYW4pOwotICAgICAgICAgICAgYXNuMSA9IChzc2xfYXNuMV90ICopc3NsX2RzX3RhYmxlX3B1c2gobWMtPnRQcml2YXRlS2V5LCBjcCk7Ci0gICAgICAgICAgICBhc24xLT5uRGF0YSAgPSBpMmRfUHJpdmF0ZUtleShwUHJpdmF0ZUtleSwgTlVMTCk7Ci0gICAgICAgICAgICBhc24xLT5jcERhdGEgPSBhcF9wYWxsb2MobWMtPnBQb29sLCBhc24xLT5uRGF0YSk7Ci0gICAgICAgICAgICB1Y3AgPSBhc24xLT5jcERhdGE7IGkyZF9Qcml2YXRlS2V5KHBQcml2YXRlS2V5LCAmdWNwKTsgLyogMm5kIGFyZyBpbmNyZW1lbnRzICovCi0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBGcmVlIHRoZSBwcml2YXRlIGtleSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgRVZQX1BLRVlfZnJlZShwUHJpdmF0ZUtleSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIExldCB0aGUgdXNlciBrbm93IHdoZW4gd2UncmUgc3VjY2Vzc2Z1bC4KLSAgICAgKi8KLSAgICBpZiAoblBhc3NQaHJhc2VEaWFsb2cgPiAwKSB7Ci0gICAgICAgIHNjID0gbXlTcnZDb25maWcocyk7Ci0gICAgICAgIGlmIChzYy0+blBhc3NQaHJhc2VEaWFsb2dUeXBlID09IFNTTF9QUFRZUEVfQlVJTFRJTikgewotICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICJcbiIpOwotICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICJPazogUGFzcyBQaHJhc2UgRGlhbG9nIHN1Y2Nlc3NmdWwuXG4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogV2lwZSBvdXQgdGhlIHVzZWQgbWVtb3J5IGZyb20gdGhlCi0gICAgICogcGFzcyBwaHJhc2UgYXJyYXkgYW5kIHRoZW4gZGVhbGxvY2F0ZSBpdAotICAgICAqLwotICAgIGlmICghc3NsX2RzX2FycmF5X2lzZW1wdHkoYVBhc3NQaHJhc2UpKSB7Ci0gICAgICAgIHNzbF9kc19hcnJheV93aXBlb3V0KGFQYXNzUGhyYXNlKTsKLSAgICAgICAgc3NsX2RzX2FycmF5X2tpbGwoYVBhc3NQaHJhc2UpOwotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfSU5GTywgIkluaXQ6IFdpcGVkIG91dCB0aGUgcXVlcmllZCBwYXNzIHBocmFzZXMgZnJvbSBtZW1vcnkiKTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLWludCBzc2xfcHBocmFzZV9IYW5kbGVfQ0IoY2hhciAqYnVmLCBpbnQgYnVmc2l6ZSwgaW50IHZlcmlmeSkKLXsKLSAgICBTU0xNb2RDb25maWdSZWMgKm1jID0gbXlNb2RDb25maWcoKTsKLSAgICBzZXJ2ZXJfcmVjICpzOwotICAgIHBvb2wgKnA7Ci0gICAgc3NsX2RzX2FycmF5ICphUGFzc1BocmFzZTsKLSAgICBTU0xTcnZDb25maWdSZWMgKnNjOwotICAgIGludCAqcG5QYXNzUGhyYXNlQ3VyOwotICAgIGNoYXIgKipjcHBQYXNzUGhyYXNlQ3VyOwotICAgIGNoYXIgKmNwVkhvc3RJRDsKLSAgICBjaGFyICpjcEFsZ29UeXBlOwotICAgIGludCAqcG5QYXNzUGhyYXNlRGlhbG9nOwotICAgIGludCAqcG5QYXNzUGhyYXNlRGlhbG9nQ3VyOwotICAgIEJPT0wgKnBiUGFzc1BocmFzZURpYWxvZ09uY2U7Ci0gICAgaW50IHN0ZGVycl9zdG9yZTsKLSAgICBjaGFyICoqY3BwOwotICAgIGludCBsZW4gPSAtMTsKLQotICAgIC8qCi0gICAgICogUmVjb25uZWN0IHRvIHRoZSBjb250ZXh0IG9mIHNzbF9waHJhc2VfSGFuZGxlKCkKLSAgICAgKi8KLSAgICBzICAgICAgICAgICAgICAgICAgICAgID0gbXlDdHhWYXJHZXQobWMsICAxLCBzZXJ2ZXJfcmVjICopOwotICAgIHAgICAgICAgICAgICAgICAgICAgICAgPSBteUN0eFZhckdldChtYywgIDIsIHBvb2wgKik7Ci0gICAgYVBhc3NQaHJhc2UgICAgICAgICAgICA9IG15Q3R4VmFyR2V0KG1jLCAgMywgc3NsX2RzX2FycmF5ICopOwotICAgIHBuUGFzc1BocmFzZUN1ciAgICAgICAgPSBteUN0eFZhckdldChtYywgIDQsIGludCAqKTsKLSAgICBjcHBQYXNzUGhyYXNlQ3VyICAgICAgID0gbXlDdHhWYXJHZXQobWMsICA1LCBjaGFyICoqKTsKLSAgICBjcFZIb3N0SUQgICAgICAgICAgICAgID0gbXlDdHhWYXJHZXQobWMsICA2LCBjaGFyICopOwotICAgIGNwQWxnb1R5cGUgICAgICAgICAgICAgPSBteUN0eFZhckdldChtYywgIDcsIGNoYXIgKik7Ci0gICAgcG5QYXNzUGhyYXNlRGlhbG9nICAgICA9IG15Q3R4VmFyR2V0KG1jLCAgOCwgaW50ICopOwotICAgIHBuUGFzc1BocmFzZURpYWxvZ0N1ciAgPSBteUN0eFZhckdldChtYywgIDksIGludCAqKTsKLSAgICBwYlBhc3NQaHJhc2VEaWFsb2dPbmNlID0gbXlDdHhWYXJHZXQobWMsIDEwLCBCT09MICopOwotICAgIHNjICAgICAgICAgICAgICAgICAgICAgPSBteVNydkNvbmZpZyhzKTsKLQotICAgICgqcG5QYXNzUGhyYXNlRGlhbG9nKSsrOwotICAgICgqcG5QYXNzUGhyYXNlRGlhbG9nQ3VyKSsrOwotCi0gICAgLyoKLSAgICAgKiBXaGVuIHJlbWVtYmVyZWQgcGFzcyBwaHJhc2VzIGFyZSBhdmFpbGFibGUgdXNlIHRoZW0uLi4KLSAgICAgKi8KLSAgICBpZiAoKGNwcCA9IChjaGFyICoqKXNzbF9kc19hcnJheV9nZXQoYVBhc3NQaHJhc2UsICpwblBhc3NQaHJhc2VDdXIpKSAhPSBOVUxMKSB7Ci0gICAgICAgIGFwX2NweXN0cm4oYnVmLCAqY3BwLCBidWZzaXplKTsKLSAgICAgICAgbGVuID0gc3RybGVuKGJ1Zik7Ci0gICAgICAgIHJldHVybiBsZW47Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBCdWlsdGluIGRpYWxvZwotICAgICAqLwotICAgIGlmIChzYy0+blBhc3NQaHJhc2VEaWFsb2dUeXBlID09IFNTTF9QUFRZUEVfQlVJTFRJTikgewotICAgICAgICBjaGFyICpwcm9tcHQ7Ci0gICAgICAgIGludCBpOwotI2lmZGVmIFdJTjMyCi0gICAgICAgIEZJTEUgKmNvbjsKLSNlbmRpZgotCi0gICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19JTkZPLAotICAgICAgICAgICAgICAgICJJbml0OiBSZXF1ZXN0aW5nIHBhc3MgcGhyYXNlIHZpYSBidWlsdGluIHRlcm1pbmFsIGRpYWxvZyIpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFJlY29ubmVjdCBTVERFUlIgdG8gdGVybWluYWwgKGhlcmUgU1RET1VUKSBiZWNhdXNlCi0gICAgICAgICAqIGF0IG91ciBpbml0IHN0YWdlIEFwYWNoZSBhbHJlYWR5IGNvbm5lY3RlZCBTVERFUlIKLSAgICAgICAgICogdG8gdGhlIGdlbmVyYWwgZXJyb3IgbG9nZmlsZS4KLSAgICAgICAgICovCi0jaWZkZWYgV0lOMzIKLSAgICAgICAgc3RkZXJyX3N0b3JlID0gU1RERVJSX0ZJTEVOT19TVE9SRTsKLSNlbHNlCi0gICAgICAgIGlmICgoc3RkZXJyX3N0b3JlID0gb3BlbigiL2Rldi9udWxsIiwgT19XUk9OTFkpKSA9PSAtMSkKLSAgICAgICAgICAgIHN0ZGVycl9zdG9yZSA9IFNUREVSUl9GSUxFTk9fU1RPUkU7Ci0jZW5kaWYKLSAgICAgICAgZHVwMihTVERFUlJfRklMRU5PLCBzdGRlcnJfc3RvcmUpOwotI2lmZGVmIFdJTjMyCi0gICAgICAgIGlmICgoY29uID0gZm9wZW4oImNvbiIsICJ3IikpICE9IE5VTEwpCi0gICAgICAgICAgICBkdXAyKGZpbGVubyhjb24pLCBTVERFUlJfRklMRU5PKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZHVwMihTVERPVVRfRklMRU5PLCBTVERFUlJfRklMRU5PKTsKLSNlbHNlCi0gICAgICAgIGR1cDIoU1RET1VUX0ZJTEVOTywgU1RERVJSX0ZJTEVOTyk7Ci0jZW5kaWYKLQotICAgICAgICAvKgotICAgICAgICAgKiBUaGUgZmlyc3QgdGltZSBkaXNwbGF5IGEgaGVhZGVyIHRvIGluZm9ybSB0aGUgdXNlciBhYm91dCB3aGF0Ci0gICAgICAgICAqIHByb2dyYW0gaGUgYWN0dWFsbHkgc3BlYWtzIHRvLCB3aGljaCBtb2R1bGUgaXMgcmVzcG9uc2libGUgZm9yCi0gICAgICAgICAqIHRoaXMgdGVybWluYWwgZGlhbG9nIGFuZCB3aHkgdG8gdGhlIGhlbGwgaGUgaGFzIHRvIGVudGVyCi0gICAgICAgICAqIHNvbWV0aGluZy4uLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCpwblBhc3NQaHJhc2VEaWFsb2cgPT0gMSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyBtb2Rfc3NsLyVzIChQYXNzIFBocmFzZSBEaWFsb2cpXG4iLAotICAgICAgICAgICAgICAgICAgICBTRVJWRVJfQkFTRVZFUlNJT04sIE1PRF9TU0xfVkVSU0lPTik7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNvbWUgb2YgeW91ciBwcml2YXRlIGtleSBmaWxlcyBhcmUgZW5jcnlwdGVkIGZvciBzZWN1cml0eSByZWFzb25zLlxuIik7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkluIG9yZGVyIHRvIHJlYWQgdGhlbSB5b3UgaGF2ZSB0byBwcm92aWRlIHVzIHdpdGggdGhlIHBhc3MgcGhyYXNlcy5cbiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgqcGJQYXNzUGhyYXNlRGlhbG9nT25jZSkgewotICAgICAgICAgICAgKnBiUGFzc1BocmFzZURpYWxvZ09uY2UgPSBGQUxTRTsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiU2VydmVyICVzICglcylcbiIsIGNwVkhvc3RJRCwgY3BBbGdvVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBFbXVsYXRlIHRoZSBPcGVuU1NMIGludGVybmFsIHBhc3MgcGhyYXNlIGRpYWxvZwotICAgICAgICAgKiAoc2VlIGNyeXB0by9wZW0vcGVtX2xpYi5jOmRlZl9jYWxsYmFjaygpIGZvciBkZXRhaWxzKQotICAgICAgICAgKi8KLSAgICAgICAgcHJvbXB0ID0gIkVudGVyIHBhc3MgcGhyYXNlOiI7Ci0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgIGlmICgoaSA9IEVWUF9yZWFkX3B3X3N0cmluZyhidWYsIGJ1ZnNpemUsIHByb21wdCwgRkFMU0UpKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgUEVNZXJyKFBFTV9GX0RFRl9DQUxMQkFDSyxQRU1fUl9QUk9CTEVNU19HRVRUSU5HX1BBU1NXT1JEKTsKLSAgICAgICAgICAgICAgICBtZW1zZXQoYnVmLCAwLCAodW5zaWduZWQgaW50KWJ1ZnNpemUpOwotICAgICAgICAgICAgICAgIHJldHVybiAoLTEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGVuID0gc3RybGVuKGJ1Zik7Ci0gICAgICAgICAgICBpZiAobGVuIDwgMSkKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkFwYWNoZTptb2Rfc3NsOkVycm9yOiBQYXNzIHBocmFzZSBlbXB0eSAobmVlZHMgdG8gYmUgYXQgbGVhc3QgMSBjaGFyYWN0ZXIpLlxuIik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBSZXN0b3JlIFNUREVSUiB0byBBcGFjaGUgZXJyb3IgbG9nZmlsZQotICAgICAgICAgKi8KLSAgICAgICAgZHVwMihzdGRlcnJfc3RvcmUsIFNUREVSUl9GSUxFTk8pOwotICAgICAgICBjbG9zZShzdGRlcnJfc3RvcmUpOwotI2lmZGVmIFdJTjMyCi0gICAgICAgIGlmIChjb24gIT0gTlVMTCkKLSAgICAgICAgICAgIGZjbG9zZShjb24pOwotI2VuZGlmCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBGaWx0ZXIgcHJvZ3JhbQotICAgICAqLwotICAgIGVsc2UgaWYgKHNjLT5uUGFzc1BocmFzZURpYWxvZ1R5cGUgPT0gU1NMX1BQVFlQRV9GSUxURVIpIHsKLSAgICAgICAgY2hhciAqY21kOwotICAgICAgICBjaGFyICpyZXN1bHQ7Ci0KLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0lORk8sCi0gICAgICAgICAgICAgICAgIkluaXQ6IFJlcXVlc3RpbmcgcGFzcyBwaHJhc2UgZnJvbSBkaWFsb2cgZmlsdGVyIHByb2dyYW0gKCVzKSIsCi0gICAgICAgICAgICAgICAgc2MtPnN6UGFzc1BocmFzZURpYWxvZ1BhdGgpOwotCi0gICAgICAgIGlmIChzdHJjaHIoc2MtPnN6UGFzc1BocmFzZURpYWxvZ1BhdGgsICcgJykgIT0gTlVMTCkKLSAgICAgICAgICAgIGNtZCA9IGFwX3BzcHJpbnRmKHAsICJcIiVzXCIgJXMgJXMiLCBzYy0+c3pQYXNzUGhyYXNlRGlhbG9nUGF0aCwgY3BWSG9zdElELCBjcEFsZ29UeXBlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY21kID0gYXBfcHNwcmludGYocCwgIiVzICVzICVzIiwgc2MtPnN6UGFzc1BocmFzZURpYWxvZ1BhdGgsIGNwVkhvc3RJRCwgY3BBbGdvVHlwZSk7Ci0gICAgICAgIHJlc3VsdCA9IHNzbF91dGlsX3JlYWRmaWx0ZXIocywgcCwgY21kKTsKLSAgICAgICAgYXBfY3B5c3RybihidWYsIHJlc3VsdCwgYnVmc2l6ZSk7Ci0gICAgICAgIGxlbiA9IHN0cmxlbihidWYpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogT2ssIHdlIG5vdyBoYXZlIHRoZSBwYXNzIHBocmFzZSwgc28gZ2l2ZSBpdCBiYWNrCi0gICAgICovCi0gICAgKmNwcFBhc3NQaHJhc2VDdXIgPSBhcF9wc3RyZHVwKHAsIGJ1Zik7Ci0KLSAgICAvKgotICAgICAqIEFuZCByZXR1cm4gaXQncyBsZW5ndGggdG8gT3BlblNTTC4uLgotICAgICAqLwotICAgIHJldHVybiAobGVuKTsKLX0KLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zc2wvc3NsX2VuZ2luZV9yYW5kLmMgYi9tb2R1bGVzL3NzbC9zc2xfZW5naW5lX3JhbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiNDliNC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL3NzbC9zc2xfZW5naW5lX3JhbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKiAgICAgICAgICAgICAgICAgICAgICBfICAgICAgICAgICAgIF8KLSoqICBfIF9fIF9fXyAgIF9fXyAgIF9ffCB8ICAgIF9fXyBfX198IHwgIG1vZF9zc2wKLSoqIHwgJ18gYCBfIFwgLyBfIFwgLyBfYCB8ICAgLyBfXy8gX198IHwgIEFwYWNoZSBJbnRlcmZhY2UgdG8gT3BlblNTTAotKiogfCB8IHwgfCB8IHwgKF8pIHwgKF98IHwgICBcX18gXF9fIFwgfCAgd3d3Lm1vZHNzbC5vcmcKLSoqIHxffCB8X3wgfF98XF9fXy8gXF9fLF98X19ffF9fXy9fX18vX3wgIGZ0cC5tb2Rzc2wub3JnCi0qKiAgICAgICAgICAgICAgICAgICAgICB8X19fX198Ci0qKiAgc3NsX2VuZ2luZV9yYW5kLmMKLSoqICBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciBTZWVkaW5nCi0qLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgUmFsZiBTLiBFbmdlbHNjaGFsbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLSAqICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLSAqICAgICBSYWxmIFMuIEVuZ2Vsc2NoYWxsIDxyc2VAZW5nZWxzY2hhbGwuY29tPiBmb3IgdXNlIGluIHRoZQotICogICAgIG1vZF9zc2wgcHJvamVjdCAoaHR0cDovL3d3dy5tb2Rzc2wub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAibW9kX3NzbCIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIHJzZUBlbmdlbHNjaGFsbC5jb20uCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIm1vZF9zc2wiCi0gKiAgICBub3IgbWF5ICJtb2Rfc3NsIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvcgotICogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFJhbGYgUy4gRW5nZWxzY2hhbGwuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotICogICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+IGZvciB1c2UgaW4gdGhlCi0gKiAgICAgbW9kX3NzbCBwcm9qZWN0IChodHRwOi8vd3d3Lm1vZHNzbC5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBSQUxGIFMuIEVOR0VMU0NIQUxMIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBSQUxGIFMuIEVOR0VMU0NIQUxMIE9SCi0gKiBISVMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYGBUaGUgZ2VuZXJhdGlvbiBvZiByYW5kb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJzIGlzIHRvbyBpbXBvcnRhbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBsZWZ0IHRvIGNoYW5jZS4nJyAqLwotCi0jaW5jbHVkZSAibW9kX3NzbC5oIgotCi0KLS8qICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICBTdXBwb3J0IGZvciBiZXR0ZXIgc2VlZGluZyBvZiBTU0wgbGlicmFyeSdzIFJORwotKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qLwotCi1zdGF0aWMgaW50IHNzbF9yYW5kX2Nob29zZW51bShpbnQsIGludCk7Ci1zdGF0aWMgaW50IHNzbF9yYW5kX2ZlZWRmcChwb29sICosIEZJTEUgKiwgaW50KTsKLQotaW50IHNzbF9yYW5kX3NlZWQoc2VydmVyX3JlYyAqcywgcG9vbCAqcCwgc3NsX3JzY3R4X3QgbkN0eCwgY2hhciAqcHJlZml4KQotewotICAgIFNTTE1vZENvbmZpZ1JlYyAqbWM7Ci0gICAgYXJyYXlfaGVhZGVyICphcFJhbmRTZWVkOwotICAgIHNzbF9yYW5kc2VlZF90ICpwUmFuZFNlZWRzOwotICAgIHNzbF9yYW5kc2VlZF90ICpwUmFuZFNlZWQ7Ci0gICAgdW5zaWduZWQgY2hhciBzdGFja2RhdGFbMjU2XTsKLSAgICBpbnQgblJlcSwgbkRvbmU7Ci0gICAgRklMRSAqZnA7Ci0gICAgaW50IGksIG4sIGw7Ci0gICAgdGltZV90IHQ7Ci0gICAgcGlkX3QgcGlkOwotCi0gICAgbWMgPSBteU1vZENvbmZpZygpOwotICAgIG5SZXEgID0gMDsKLSAgICBuRG9uZSA9IDA7Ci0gICAgYXBSYW5kU2VlZCA9IG1jLT5hUmFuZFNlZWQ7Ci0gICAgcFJhbmRTZWVkcyA9IChzc2xfcmFuZHNlZWRfdCAqKWFwUmFuZFNlZWQtPmVsdHM7Ci0gICAgZm9yIChpID0gMDsgaSA8IGFwUmFuZFNlZWQtPm5lbHRzOyBpKyspIHsKLSAgICAgICAgcFJhbmRTZWVkID0gJnBSYW5kU2VlZHNbaV07Ci0gICAgICAgIGlmIChwUmFuZFNlZWQtPm5DdHggPT0gbkN0eCkgewotICAgICAgICAgICAgblJlcSArPSBwUmFuZFNlZWQtPm5CeXRlczsKLSAgICAgICAgICAgIGlmIChwUmFuZFNlZWQtPm5TcmMgPT0gU1NMX1JTU1JDX0ZJTEUpIHsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIHNlZWQgaW4gY29udGVudHMgb2YgYW4gZXh0ZXJuYWwgZmlsZQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmICgoZnAgPSBhcF9wZm9wZW4ocCwgcFJhbmRTZWVkLT5jcFBhdGgsICJyIikpID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIG5Eb25lICs9IHNzbF9yYW5kX2ZlZWRmcChwLCBmcCwgcFJhbmRTZWVkLT5uQnl0ZXMpOwotICAgICAgICAgICAgICAgIGFwX3BmY2xvc2UocCwgZnApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocFJhbmRTZWVkLT5uU3JjID09IFNTTF9SU1NSQ19FWEVDKSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBzZWVkIGluIGNvbnRlbnRzIGdlbmVyYXRlZCBieSBhbiBleHRlcm5hbCBwcm9ncmFtCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKChmcCA9IHNzbF91dGlsX3Bwb3BlbihzLCBwLCBhcF9wc3ByaW50ZihwLCAiJXMgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhbmRTZWVkLT5jcFBhdGgsIHBSYW5kU2VlZC0+bkJ5dGVzKSkpID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIG5Eb25lICs9IHNzbF9yYW5kX2ZlZWRmcChwLCBmcCwgcFJhbmRTZWVkLT5uQnl0ZXMpOwotICAgICAgICAgICAgICAgIHNzbF91dGlsX3BwY2xvc2UocywgcCwgZnApOwotICAgICAgICAgICAgfQotI2lmIFNTTF9MSUJSQVJZX1ZFUlNJT04gPj0gMHgwMDkwNTEwMAotICAgICAgICAgICAgZWxzZSBpZiAocFJhbmRTZWVkLT5uU3JjID09IFNTTF9SU1NSQ19FR0QpIHsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIHNlZWQgaW4gY29udGVudHMgcHJvdmlkZWQgYnkgdGhlIGV4dGVybmFsCi0gICAgICAgICAgICAgICAgICogRW50cm9weSBHYXRoZXJpbmcgRGFlbW9uIChFR0QpCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKChuID0gUkFORF9lZ2QocFJhbmRTZWVkLT5jcFBhdGgpKSA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgbkRvbmUgKz0gbjsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgZWxzZSBpZiAocFJhbmRTZWVkLT5uU3JjID09IFNTTF9SU1NSQ19CVUlMVElOKSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBzZWVkIGluIHRoZSBjdXJyZW50IHRpbWUgKHVzdWFsbHkganVzdCA0IGJ5dGVzKQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHQgPSB0aW1lKE5VTEwpOwotICAgICAgICAgICAgICAgIGwgPSBzaXplb2YodGltZV90KTsKLSAgICAgICAgICAgICAgICBSQU5EX3NlZWQoKHVuc2lnbmVkIGNoYXIgKikmdCwgbCk7Ci0gICAgICAgICAgICAgICAgbkRvbmUgKz0gbDsKLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogc2VlZCBpbiB0aGUgY3VycmVudCBwcm9jZXNzIGlkICh1c3VhbGx5IGp1c3QgNCBieXRlcykKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwaWQgPSBnZXRwaWQoKTsKLSAgICAgICAgICAgICAgICBsID0gc2l6ZW9mKHBpZF90KTsKLSAgICAgICAgICAgICAgICBSQU5EX3NlZWQoKHVuc2lnbmVkIGNoYXIgKikmcGlkLCBsKTsKLSAgICAgICAgICAgICAgICBuRG9uZSArPSBsOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogc2VlZCBpbiBzb21lIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHJ1bi10aW1lIHN0YWNrICgxMjggYnl0ZXMpCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgbiA9IHNzbF9yYW5kX2Nob29zZW51bSgwLCBzaXplb2Yoc3RhY2tkYXRhKS0xMjgtMSk7Ci0gICAgICAgICAgICAgICAgUkFORF9zZWVkKHN0YWNrZGF0YStuLCAxMjgpOwotICAgICAgICAgICAgICAgIG5Eb25lICs9IDEyODsKLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogc2VlZCBpbiBhbiAxS0IgZXh0cmFjdCBvZiB0aGUgY3VycmVudCBzY29yZWJvYXJkCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBuID0gc3NsX3JhbmRfY2hvb3NlbnVtKDAsIFNDT1JFQk9BUkRfU0laRS0xMDI0LTEpOwotICAgICAgICAgICAgICAgICAgICBSQU5EX3NlZWQoKHVuc2lnbmVkIGNoYXIgKilhcF9zY29yZWJvYXJkX2ltYWdlK24sIDEwMjQpOwotICAgICAgICAgICAgICAgICAgICBuRG9uZSArPSAxMDI0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBzc2xfbG9nKHMsIFNTTF9MT0dfSU5GTywgIiVzU2VlZGluZyBQUk5HIHdpdGggJWQgYnl0ZXMgb2YgZW50cm9weSIsIHByZWZpeCwgbkRvbmUpOwotCi0jaWYgU1NMX0xJQlJBUllfVkVSU0lPTiA+PSAweDAwOTA1MTAwCi0gICAgaWYgKFJBTkRfc3RhdHVzKCkgPT0gMCkKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX1dBUk4sICIlc1BSTkcgc3RpbGwgY29udGFpbnMgbm90IHN1ZmZpY2llbnQgZW50cm9weSEiLCBwcmVmaXgpOwotI2VuZGlmCi0gICAgcmV0dXJuIG5Eb25lOwotfQotCi0jZGVmaW5lIEJVRlNJWkUgODE5MgotCi1zdGF0aWMgaW50IHNzbF9yYW5kX2ZlZWRmcChwb29sICpwLCBGSUxFICpmcCwgaW50IG5SZXEpCi17Ci0gICAgaW50IG5Eb25lOwotICAgIHVuc2lnbmVkIGNoYXIgY2FCdWZbQlVGU0laRV07Ci0gICAgaW50IG5CdWY7Ci0gICAgaW50IG5SZWFkOwotICAgIGludCBuVG9kbzsKLQotICAgIG5Eb25lID0gMDsKLSAgICBuUmVhZCA9IEJVRlNJWkU7Ci0gICAgblRvZG8gPSBuUmVxOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmIChuUmVxID4gMCkKLSAgICAgICAgICAgIG5SZWFkID0gKG5Ub2RvIDwgQlVGU0laRSA/IG5Ub2RvIDogQlVGU0laRSk7Ci0gICAgICAgIGlmICgobkJ1ZiA9IChpbnQpZnJlYWQoY2FCdWYsIDEsIG5SZWFkLCBmcCkpIDw9IDApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgUkFORF9zZWVkKGNhQnVmLCBuQnVmKTsKLSAgICAgICAgbkRvbmUgKz0gbkJ1ZjsKLSAgICAgICAgaWYgKG5SZXEgPiAwKSB7Ci0gICAgICAgICAgICBuVG9kbyAtPSBuQnVmOwotICAgICAgICAgICAgaWYgKG5Ub2RvIDw9IDApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5Eb25lOwotfQotCi1zdGF0aWMgaW50IHNzbF9yYW5kX2Nob29zZW51bShpbnQgbCwgaW50IGgpCi17Ci0gICAgaW50IGk7Ci0gICAgY2hhciBidWZbNTBdOwotCi0gICAgc3JhbmQoKHVuc2lnbmVkIGludCl0aW1lKE5VTEwpKTsKLSAgICBhcF9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJS4wZiIsCi0gICAgICAgICAgICAgICAgKCgoZG91YmxlKShyYW5kKCklUkFORF9NQVgpL1JBTkRfTUFYKSooaC1sKSkpOwotICAgIGkgPSBhdG9pKGJ1ZikrMTsKLSAgICBpZiAoaSA8IGwpIGkgPSBsOwotICAgIGlmIChpID4gaCkgaSA9IGg7Ci0gICAgcmV0dXJuIGk7Ci19Ci0KZGlmZiAtLWdpdCBhL21vZHVsZXMvc3NsL3NzbF9lbmdpbmVfdmFycy5jIGIvbW9kdWxlcy9zc2wvc3NsX2VuZ2luZV92YXJzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNzU1YTUuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9zc2wvc3NsX2VuZ2luZV92YXJzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTUgKzAsMCBAQAotLyogICAgICAgICAgICAgICAgICAgICAgXyAgICAgICAgICAgICBfCi0qKiAgXyBfXyBfX18gICBfX18gICBfX3wgfCAgICBfX18gX19ffCB8ICBtb2Rfc3NsCi0qKiB8ICdfIGAgXyBcIC8gXyBcIC8gX2AgfCAgIC8gX18vIF9ffCB8ICBBcGFjaGUgSW50ZXJmYWNlIHRvIE9wZW5TU0wKLSoqIHwgfCB8IHwgfCB8IChfKSB8IChffCB8ICAgXF9fIFxfXyBcIHwgIHd3dy5tb2Rzc2wub3JnCi0qKiB8X3wgfF98IHxffFxfX18vIFxfXyxffF9fX3xfX18vX19fL198ICBmdHAubW9kc3NsLm9yZwotKiogICAgICAgICAgICAgICAgICAgICAgfF9fX19ffAotKiogIHNzbF9lbmdpbmVfdmFycy5jCi0qKiAgVmFyaWFibGUgTG9va3VwIEZhY2lsaXR5Ci0qLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgUmFsZiBTLiBFbmdlbHNjaGFsbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLSAqICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLSAqICAgICBSYWxmIFMuIEVuZ2Vsc2NoYWxsIDxyc2VAZW5nZWxzY2hhbGwuY29tPiBmb3IgdXNlIGluIHRoZQotICogICAgIG1vZF9zc2wgcHJvamVjdCAoaHR0cDovL3d3dy5tb2Rzc2wub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAibW9kX3NzbCIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIHJzZUBlbmdlbHNjaGFsbC5jb20uCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIm1vZF9zc2wiCi0gKiAgICBub3IgbWF5ICJtb2Rfc3NsIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvcgotICogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFJhbGYgUy4gRW5nZWxzY2hhbGwuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotICogICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+IGZvciB1c2UgaW4gdGhlCi0gKiAgICAgbW9kX3NzbCBwcm9qZWN0IChodHRwOi8vd3d3Lm1vZHNzbC5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBSQUxGIFMuIEVOR0VMU0NIQUxMIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBSQUxGIFMuIEVOR0VMU0NIQUxMIE9SCi0gKiBISVMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYGBUaG9zZSBvZiB5b3Ugd2hvIHRoaW5rIHRoZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm93IGV2ZXJ5dGhpbmcgYXJlIHZlcnkgYW5ub3lpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aG9zZSBvZiB1cyB3aG8gZG8uJycKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gVW5rbm93biAgICAgICAqLwotI2luY2x1ZGUgIm1vZF9zc2wuaCIKLQotCi0vKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgVmFyaWFibGUgTG9va3VwCi0qKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSovCi0KLXN0YXRpYyBjaGFyICpzc2xfdmFyX2xvb2t1cF9oZWFkZXIocG9vbCAqcCwgcmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKm5hbWUpOwotc3RhdGljIGNoYXIgKnNzbF92YXJfbG9va3VwX3NzbChwb29sICpwLCBjb25uX3JlYyAqYywgY2hhciAqdmFyKTsKLXN0YXRpYyBjaGFyICpzc2xfdmFyX2xvb2t1cF9zc2xfY2VydChwb29sICpwLCBYNTA5ICp4cywgY2hhciAqdmFyKTsKLXN0YXRpYyBjaGFyICpzc2xfdmFyX2xvb2t1cF9zc2xfY2VydF9kbihwb29sICpwLCBYNTA5X05BTUUgKnhzbmFtZSwgY2hhciAqdmFyKTsKLXN0YXRpYyBjaGFyICpzc2xfdmFyX2xvb2t1cF9zc2xfY2VydF92YWxpZChwb29sICpwLCBBU04xX1VUQ1RJTUUgKnRtKTsKLXN0YXRpYyBjaGFyICpzc2xfdmFyX2xvb2t1cF9zc2xfY2VydF9zZXJpYWwocG9vbCAqcCwgWDUwOSAqeHMpOwotc3RhdGljIGNoYXIgKnNzbF92YXJfbG9va3VwX3NzbF9jZXJ0X2NoYWluKHBvb2wgKnAsIFNUQUNLX09GKFg1MDkpICpzaywgY2hhciAqdmFyKTsKLXN0YXRpYyBjaGFyICpzc2xfdmFyX2xvb2t1cF9zc2xfY2VydF9QRU0ocG9vbCAqcCwgWDUwOSAqeHMpOwotc3RhdGljIGNoYXIgKnNzbF92YXJfbG9va3VwX3NzbF9jZXJ0X3ZlcmlmeShwb29sICpwLCBjb25uX3JlYyAqYyk7Ci1zdGF0aWMgY2hhciAqc3NsX3Zhcl9sb29rdXBfc3NsX2NpcGhlcihwb29sICpwLCBjb25uX3JlYyAqYywgY2hhciAqdmFyKTsKLXN0YXRpYyB2b2lkICBzc2xfdmFyX2xvb2t1cF9zc2xfY2lwaGVyX2JpdHMoU1NMICpzc2wsIGludCAqdXNla2V5c2l6ZSwgaW50ICphbGdrZXlzaXplKTsKLXN0YXRpYyBjaGFyICpzc2xfdmFyX2xvb2t1cF9zc2xfdmVyc2lvbihwb29sICpwLCBjaGFyICp2YXIpOwotCi12b2lkIHNzbF92YXJfcmVnaXN0ZXIodm9pZCkKLXsKLSAgICBhcF9ob29rX2NvbmZpZ3VyZSgiYXA6Om1vZF9zc2w6OnZhcl9sb29rdXAiLAotICAgICAgICAgICAgICAgICAgICAgIEFQX0hPT0tfU0lHNihwdHIscHRyLHB0cixwdHIscHRyLHB0ciksIEFQX0hPT0tfREVDTElORShOVUxMKSk7Ci0gICAgYXBfaG9va19yZWdpc3RlcigiYXA6Om1vZF9zc2w6OnZhcl9sb29rdXAiLAotICAgICAgICAgICAgICAgICAgICAgc3NsX3Zhcl9sb29rdXAsIEFQX0hPT0tfTk9DVFgpOwotICAgIHJldHVybjsKLX0KLQotdm9pZCBzc2xfdmFyX3VucmVnaXN0ZXIodm9pZCkKLXsKLSAgICBhcF9ob29rX3VucmVnaXN0ZXIoImFwOjptb2Rfc3NsOjp2YXJfbG9va3VwIiwgc3NsX3Zhcl9sb29rdXApOwotICAgIHJldHVybjsKLX0KLQotY2hhciAqc3NsX3Zhcl9sb29rdXAocG9vbCAqcCwgc2VydmVyX3JlYyAqcywgY29ubl9yZWMgKmMsIHJlcXVlc3RfcmVjICpyLCBjaGFyICp2YXIpCi17Ci0gICAgU1NMTW9kQ29uZmlnUmVjICptYyA9IG15TW9kQ29uZmlnKCk7Ci0gICAgY2hhciAqcmVzdWx0OwotICAgIEJPT0wgcmVzZHVwOwotICAgIHRpbWVfdCB0YzsKLSAgICBzdHJ1Y3QgdG0gKnRtOwotCi0gICAgcmVzdWx0ID0gTlVMTDsKLSAgICByZXNkdXAgPSBUUlVFOwotCi0gICAgLyoKLSAgICAgKiBXaGVuIG5vIHBvb2wgaXMgZ2l2ZW4gdHJ5IHRvIGZpbmQgb25lCi0gICAgICovCi0gICAgaWYgKHAgPT0gTlVMTCkgewotICAgICAgICBpZiAociAhPSBOVUxMKQotICAgICAgICAgICAgcCA9IHItPnBvb2w7Ci0gICAgICAgIGVsc2UgaWYgKGMgIT0gTlVMTCkKLSAgICAgICAgICAgIHAgPSBjLT5wb29sOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwID0gbWMtPnBQb29sOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUmVxdWVzdCBkZXBlbmRlbnQgc3R1ZmYKLSAgICAgKi8KLSAgICBpZiAociAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChzdHJjRVEodmFyLCAiSFRUUF9VU0VSX0FHRU5UIikpCi0gICAgICAgICAgICByZXN1bHQgPSBzc2xfdmFyX2xvb2t1cF9oZWFkZXIocCwgciwgIlVzZXItQWdlbnQiKTsKLSAgICAgICAgZWxzZSBpZiAoc3RyY0VRKHZhciwgIkhUVFBfUkVGRVJFUiIpKQotICAgICAgICAgICAgcmVzdWx0ID0gc3NsX3Zhcl9sb29rdXBfaGVhZGVyKHAsIHIsICJSZWZlcmVyIik7Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNFUSh2YXIsICJIVFRQX0NPT0tJRSIpKQotICAgICAgICAgICAgcmVzdWx0ID0gc3NsX3Zhcl9sb29rdXBfaGVhZGVyKHAsIHIsICJDb29raWUiKTsKLSAgICAgICAgZWxzZSBpZiAoc3RyY0VRKHZhciwgIkhUVFBfRk9SV0FSREVEIikpCi0gICAgICAgICAgICByZXN1bHQgPSBzc2xfdmFyX2xvb2t1cF9oZWFkZXIocCwgciwgIkZvcndhcmRlZCIpOwotICAgICAgICBlbHNlIGlmIChzdHJjRVEodmFyLCAiSFRUUF9IT1NUIikpCi0gICAgICAgICAgICByZXN1bHQgPSBzc2xfdmFyX2xvb2t1cF9oZWFkZXIocCwgciwgIkhvc3QiKTsKLSAgICAgICAgZWxzZSBpZiAoc3RyY0VRKHZhciwgIkhUVFBfUFJPWFlfQ09OTkVDVElPTiIpKQotICAgICAgICAgICAgcmVzdWx0ID0gc3NsX3Zhcl9sb29rdXBfaGVhZGVyKHAsIHIsICJQcm94eS1Db25uZWN0aW9uIik7Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNFUSh2YXIsICJIVFRQX0FDQ0VQVCIpKQotICAgICAgICAgICAgcmVzdWx0ID0gc3NsX3Zhcl9sb29rdXBfaGVhZGVyKHAsIHIsICJBY2NlcHQiKTsKLSAgICAgICAgZWxzZSBpZiAoc3RybGVuKHZhcikgPiA1ICYmIHN0cmNFUW4odmFyLCAiSFRUUDoiLCA1KSkKLSAgICAgICAgICAgIC8qIGFsbCBvdGhlciBoZWFkZXJzIGZyb20gd2hpY2ggd2UgYXJlIHN0aWxsIG5vdCBrbm93IGFib3V0ICovCi0gICAgICAgICAgICByZXN1bHQgPSBzc2xfdmFyX2xvb2t1cF9oZWFkZXIocCwgciwgdmFyKzUpOwotICAgICAgICBlbHNlIGlmIChzdHJjRVEodmFyLCAiVEhFX1JFUVVFU1QiKSkKLSAgICAgICAgICAgIHJlc3VsdCA9IHItPnRoZV9yZXF1ZXN0OwotICAgICAgICBlbHNlIGlmIChzdHJjRVEodmFyLCAiUkVRVUVTVF9NRVRIT0QiKSkKLSAgICAgICAgICAgIHJlc3VsdCA9IChjaGFyICopKHItPm1ldGhvZCk7Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNFUSh2YXIsICJSRVFVRVNUX1NDSEVNRSIpKQotICAgICAgICAgICAgcmVzdWx0ID0gYXBfaHR0cF9tZXRob2Qocik7Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNFUSh2YXIsICJSRVFVRVNUX1VSSSIpKQotICAgICAgICAgICAgcmVzdWx0ID0gci0+dXJpOwotICAgICAgICBlbHNlIGlmIChzdHJjRVEodmFyLCAiU0NSSVBUX0ZJTEVOQU1FIikgfHwKLSAgICAgICAgICAgICAgICAgc3RyY0VRKHZhciwgIlJFUVVFU1RfRklMRU5BTUUiKSkKLSAgICAgICAgICAgIHJlc3VsdCA9IHItPmZpbGVuYW1lOwotICAgICAgICBlbHNlIGlmIChzdHJjRVEodmFyLCAiUEFUSF9JTkZPIikpCi0gICAgICAgICAgICByZXN1bHQgPSByLT5wYXRoX2luZm87Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNFUSh2YXIsICJRVUVSWV9TVFJJTkciKSkKLSAgICAgICAgICAgIHJlc3VsdCA9IHItPmFyZ3M7Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNFUSh2YXIsICJSRU1PVEVfSE9TVCIpKQotICAgICAgICAgICAgcmVzdWx0ID0gKGNoYXIgKilhcF9nZXRfcmVtb3RlX2hvc3Qoci0+Y29ubmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnBlcl9kaXJfY29uZmlnLCBSRU1PVEVfTkFNRSk7Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNFUSh2YXIsICJSRU1PVEVfSURFTlQiKSkKLSAgICAgICAgICAgIHJlc3VsdCA9IChjaGFyICopYXBfZ2V0X3JlbW90ZV9sb2duYW1lKHIpOwotICAgICAgICBlbHNlIGlmIChzdHJjRVEodmFyLCAiSVNfU1VCUkVRIikpCi0gICAgICAgICAgICByZXN1bHQgPSAoci0+bWFpbiAhPSBOVUxMID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNFUSh2YXIsICJET0NVTUVOVF9ST09UIikpCi0gICAgICAgICAgICByZXN1bHQgPSAoY2hhciAqKWFwX2RvY3VtZW50X3Jvb3Qocik7Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNFUSh2YXIsICJTRVJWRVJfQURNSU4iKSkKLSAgICAgICAgICAgIHJlc3VsdCA9IHItPnNlcnZlci0+c2VydmVyX2FkbWluOwotICAgICAgICBlbHNlIGlmIChzdHJjRVEodmFyLCAiU0VSVkVSX05BTUUiKSkKLSAgICAgICAgICAgIHJlc3VsdCA9IChjaGFyICopYXBfZ2V0X3NlcnZlcl9uYW1lKHIpOwotICAgICAgICBlbHNlIGlmIChzdHJjRVEodmFyLCAiU0VSVkVSX1BPUlQiKSkKLSAgICAgICAgICAgIHJlc3VsdCA9IGFwX3BzcHJpbnRmKHAsICIldSIsIGFwX2dldF9zZXJ2ZXJfcG9ydChyKSk7Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNFUSh2YXIsICJTRVJWRVJfUFJPVE9DT0wiKSkKLSAgICAgICAgICAgIHJlc3VsdCA9IHItPnByb3RvY29sOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ29ubmVjdGlvbiBzdHVmZgotICAgICAqLwotICAgIGlmIChyZXN1bHQgPT0gTlVMTCAmJiBjICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHN0cmNFUSh2YXIsICJSRU1PVEVfQUREUiIpKQotICAgICAgICAgICAgcmVzdWx0ID0gYy0+cmVtb3RlX2lwOwotICAgICAgICBlbHNlIGlmIChzdHJjRVEodmFyLCAiUkVNT1RFX1VTRVIiKSkKLSAgICAgICAgICAgIHJlc3VsdCA9IGMtPnVzZXI7Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNFUSh2YXIsICJBVVRIX1RZUEUiKSkKLSAgICAgICAgICAgIHJlc3VsdCA9IGMtPmFwX2F1dGhfdHlwZTsKLSAgICAgICAgZWxzZSBpZiAoc3RybGVuKHZhcikgPiA0ICYmIHN0cmNFUW4odmFyLCAiU1NMXyIsIDQpKQotICAgICAgICAgICAgcmVzdWx0ID0gc3NsX3Zhcl9sb29rdXBfc3NsKHAsIGMsIHZhcis0KTsKLSAgICAgICAgZWxzZSBpZiAoc3RyY0VRKHZhciwgIkhUVFBTIikpIHsKLSAgICAgICAgICAgIGlmIChhcF9jdHhfZ2V0KGMtPmNsaWVudC0+Y3R4LCAic3NsIikgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAib24iOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJlc3VsdCA9ICJvZmYiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUb3RhbGx5IGluZGVwZW5kZW50IHN0dWZmCi0gICAgICovCi0gICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChzdHJsZW4odmFyKSA+IDEyICYmIHN0cmNFUW4odmFyLCAiU1NMX1ZFUlNJT05fIiwgMTIpKQotICAgICAgICAgICAgcmVzdWx0ID0gc3NsX3Zhcl9sb29rdXBfc3NsX3ZlcnNpb24ocCwgdmFyKzEyKTsKLSAgICAgICAgZWxzZSBpZiAoc3RyY0VRKHZhciwgIlNFUlZFUl9TT0ZUV0FSRSIpKQotICAgICAgICAgICAgcmVzdWx0ID0gKGNoYXIgKilhcF9nZXRfc2VydmVyX3ZlcnNpb24oKTsKLSAgICAgICAgZWxzZSBpZiAoc3RyY0VRKHZhciwgIkFQSV9WRVJTSU9OIikpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGFwX3BzcHJpbnRmKHAsICIlZCIsIE1PRFVMRV9NQUdJQ19OVU1CRVIpOwotICAgICAgICAgICAgcmVzZHVwID0gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RyY0VRKHZhciwgIlRJTUVfWUVBUiIpKSB7Ci0gICAgICAgICAgICB0YyA9IHRpbWUoTlVMTCk7Ci0gICAgICAgICAgICB0bSA9IGxvY2FsdGltZSgmdGMpOwotICAgICAgICAgICAgcmVzdWx0ID0gYXBfcHNwcmludGYocCwgIiUwMmQlMDJkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0bS0+dG1feWVhciAvIDEwMCkgKyAxOSwgdG0tPnRtX3llYXIgJSAxMDApOwotICAgICAgICAgICAgcmVzZHVwID0gRkFMU0U7Ci0gICAgICAgIH0KLSNkZWZpbmUgTUtUSU1FU1RSKGZvcm1hdCwgdG1maWVsZCkgXAotICAgICAgICAgICAgdGMgPSB0aW1lKE5VTEwpOyBcCi0gICAgICAgICAgICB0bSA9IGxvY2FsdGltZSgmdGMpOyBcCi0gICAgICAgICAgICByZXN1bHQgPSBhcF9wc3ByaW50ZihwLCBmb3JtYXQsIHRtLT50bWZpZWxkKTsgXAotICAgICAgICAgICAgcmVzZHVwID0gRkFMU0U7Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNFUSh2YXIsICJUSU1FX01PTiIpKSB7Ci0gICAgICAgICAgICBNS1RJTUVTVFIoIiUwMmQiLCB0bV9tb24rMSkKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJjRVEodmFyLCAiVElNRV9EQVkiKSkgewotICAgICAgICAgICAgTUtUSU1FU1RSKCIlMDJkIiwgdG1fbWRheSkKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJjRVEodmFyLCAiVElNRV9IT1VSIikpIHsKLSAgICAgICAgICAgIE1LVElNRVNUUigiJTAyZCIsIHRtX2hvdXIpCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RyY0VRKHZhciwgIlRJTUVfTUlOIikpIHsKLSAgICAgICAgICAgIE1LVElNRVNUUigiJTAyZCIsIHRtX21pbikKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJjRVEodmFyLCAiVElNRV9TRUMiKSkgewotICAgICAgICAgICAgTUtUSU1FU1RSKCIlMDJkIiwgdG1fc2VjKQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNFUSh2YXIsICJUSU1FX1dEQVkiKSkgewotICAgICAgICAgICAgTUtUSU1FU1RSKCIlZCIsIHRtX3dkYXkpCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RyY0VRKHZhciwgIlRJTUUiKSkgewotICAgICAgICAgICAgdGMgPSB0aW1lKE5VTEwpOwotICAgICAgICAgICAgdG0gPSBsb2NhbHRpbWUoJnRjKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGFwX3BzcHJpbnRmKHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAiJTAyZCUwMmQlMDJkJTAyZCUwMmQlMDJkJTAyZCIsICh0bS0+dG1feWVhciAvIDEwMCkgKyAxOSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh0bS0+dG1feWVhciAlIDEwMCksIHRtLT50bV9tb24rMSwgdG0tPnRtX21kYXksCi0gICAgICAgICAgICAgICAgICAgICAgICB0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7Ci0gICAgICAgICAgICByZXNkdXAgPSBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICAvKiBhbGwgb3RoZXIgZW52LXZhcmlhYmxlcyBmcm9tIHRoZSBwYXJlbnQgQXBhY2hlIHByb2Nlc3MgKi8KLSAgICAgICAgZWxzZSBpZiAoc3RybGVuKHZhcikgPiA0ICYmIHN0cmNFUW4odmFyLCAiRU5WOiIsIDQpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSAoY2hhciAqKWFwX3RhYmxlX2dldChyLT5ub3RlcywgdmFyKzQpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChjaGFyICopYXBfdGFibGVfZ2V0KHItPnN1YnByb2Nlc3NfZW52LCB2YXIrNCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0ZW52KHZhcis0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChyZXN1bHQgIT0gTlVMTCAmJiByZXNkdXApCi0gICAgICAgIHJlc3VsdCA9IGFwX3BzdHJkdXAocCwgcmVzdWx0KTsKLSAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgIHJlc3VsdCA9ICIiOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBjaGFyICpzc2xfdmFyX2xvb2t1cF9oZWFkZXIocG9vbCAqcCwgcmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgYXJyYXlfaGVhZGVyICpoZHJzX2FycjsKLSAgICB0YWJsZV9lbnRyeSAqaGRyczsKLSAgICBpbnQgaTsKLQotICAgIGhkcnNfYXJyID0gYXBfdGFibGVfZWx0cyhyLT5oZWFkZXJzX2luKTsKLSAgICBoZHJzID0gKHRhYmxlX2VudHJ5ICopaGRyc19hcnItPmVsdHM7Ci0gICAgZm9yIChpID0gMDsgaSA8IGhkcnNfYXJyLT5uZWx0czsgKytpKSB7Ci0gICAgICAgIGlmIChoZHJzW2ldLmtleSA9PSBOVUxMKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChzdHJjRVEoaGRyc1tpXS5rZXksIG5hbWUpKQotICAgICAgICAgICAgcmV0dXJuIGFwX3BzdHJkdXAocCwgaGRyc1tpXS52YWwpOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNoYXIgKnNzbF92YXJfbG9va3VwX3NzbChwb29sICpwLCBjb25uX3JlYyAqYywgY2hhciAqdmFyKQotewotICAgIGNoYXIgKnJlc3VsdDsKLSAgICBYNTA5ICp4czsKLSAgICBTVEFDS19PRihYNTA5KSAqc2s7Ci0gICAgU1NMICpzc2w7Ci0KLSAgICByZXN1bHQgPSBOVUxMOwotCi0gICAgc3NsID0gYXBfY3R4X2dldChjLT5jbGllbnQtPmN0eCwgInNzbCIpOwotICAgIGlmIChzdHJsZW4odmFyKSA+IDggJiYgc3RyY0VRbih2YXIsICJWRVJTSU9OXyIsIDgpKSB7Ci0gICAgICAgIHJlc3VsdCA9IHNzbF92YXJfbG9va3VwX3NzbF92ZXJzaW9uKHAsIHZhcis4KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3NsICE9IE5VTEwgJiYgc3RyY0VRKHZhciwgIlBST1RPQ09MIikpIHsKLSAgICAgICAgcmVzdWx0ID0gKGNoYXIgKilTU0xfZ2V0X3ZlcnNpb24oc3NsKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3NsICE9IE5VTEwgJiYgc3RyY0VRKHZhciwgIlNFU1NJT05fSUQiKSkgewotICAgICAgICBTU0xfU0VTU0lPTiAqcFNlc3Npb24gPSBTU0xfZ2V0X3Nlc3Npb24oc3NsKTsKLSAgICAgICAgcmVzdWx0ID0gYXBfcHN0cmR1cChwLCBTU0xfU0VTU0lPTl9pZDJzeihwU2Vzc2lvbi0+c2Vzc2lvbl9pZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNlc3Npb25faWRfbGVuZ3RoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNzbCAhPSBOVUxMICYmIHN0cmxlbih2YXIpID49IDYgJiYgc3RyY0VRbih2YXIsICJDSVBIRVIiLCA2KSkgewotICAgICAgICByZXN1bHQgPSBzc2xfdmFyX2xvb2t1cF9zc2xfY2lwaGVyKHAsIGMsIHZhcis2KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3NsICE9IE5VTEwgJiYgc3RybGVuKHZhcikgPiAxOCAmJiBzdHJjRVFuKHZhciwgIkNMSUVOVF9DRVJUX0NIQUlOXyIsIDE4KSkgewotICAgICAgICBzayA9IFNTTF9nZXRfcGVlcl9jZXJ0X2NoYWluKHNzbCk7Ci0gICAgICAgIHJlc3VsdCA9IHNzbF92YXJfbG9va3VwX3NzbF9jZXJ0X2NoYWluKHAsIHNrLCB2YXIrMTcpOwotICAgIH0KLSAgICBlbHNlIGlmIChzc2wgIT0gTlVMTCAmJiBzdHJjRVEodmFyLCAiQ0xJRU5UX1ZFUklGWSIpKSB7Ci0gICAgICAgIHJlc3VsdCA9IHNzbF92YXJfbG9va3VwX3NzbF9jZXJ0X3ZlcmlmeShwLCBjKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3NsICE9IE5VTEwgJiYgc3RybGVuKHZhcikgPiA3ICYmIHN0cmNFUW4odmFyLCAiQ0xJRU5UXyIsIDcpKSB7Ci0gICAgICAgIGlmICgoeHMgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc3NsKSkgIT0gTlVMTCkKLSAgICAgICAgICAgIHJlc3VsdCA9IHNzbF92YXJfbG9va3VwX3NzbF9jZXJ0KHAsIHhzLCB2YXIrNyk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNzbCAhPSBOVUxMICYmIHN0cmxlbih2YXIpID4gNyAmJiBzdHJjRVFuKHZhciwgIlNFUlZFUl8iLCA3KSkgewotICAgICAgICBpZiAoKHhzID0gU1NMX2dldF9jZXJ0aWZpY2F0ZShzc2wpKSAhPSBOVUxMKQotICAgICAgICAgICAgcmVzdWx0ID0gc3NsX3Zhcl9sb29rdXBfc3NsX2NlcnQocCwgeHMsIHZhcis3KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGNoYXIgKnNzbF92YXJfbG9va3VwX3NzbF9jZXJ0KHBvb2wgKnAsIFg1MDkgKnhzLCBjaGFyICp2YXIpCi17Ci0gICAgY2hhciAqcmVzdWx0OwotICAgIEJPT0wgcmVzZHVwOwotICAgIFg1MDlfTkFNRSAqeHNuYW1lOwotICAgIGludCBuaWQ7Ci0gICAgY2hhciAqY3A7Ci0KLSAgICByZXN1bHQgPSBOVUxMOwotICAgIHJlc2R1cCA9IFRSVUU7Ci0KLSAgICBpZiAoc3RyY0VRKHZhciwgIk1fVkVSU0lPTiIpKSB7Ci0gICAgICAgIHJlc3VsdCA9IGFwX3BzcHJpbnRmKHAsICIlbHUiLCBYNTA5X2dldF92ZXJzaW9uKHhzKSsxKTsKLSAgICAgICAgcmVzZHVwID0gRkFMU0U7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNFUSh2YXIsICJNX1NFUklBTCIpKSB7Ci0gICAgICAgIHJlc3VsdCA9IHNzbF92YXJfbG9va3VwX3NzbF9jZXJ0X3NlcmlhbChwLCB4cyk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNFUSh2YXIsICJWX1NUQVJUIikpIHsKLSAgICAgICAgcmVzdWx0ID0gc3NsX3Zhcl9sb29rdXBfc3NsX2NlcnRfdmFsaWQocCwgWDUwOV9nZXRfbm90QmVmb3JlKHhzKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNFUSh2YXIsICJWX0VORCIpKSB7Ci0gICAgICAgIHJlc3VsdCA9IHNzbF92YXJfbG9va3VwX3NzbF9jZXJ0X3ZhbGlkKHAsIFg1MDlfZ2V0X25vdEFmdGVyKHhzKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNFUSh2YXIsICJTX0ROIikpIHsKLSAgICAgICAgeHNuYW1lID0gWDUwOV9nZXRfc3ViamVjdF9uYW1lKHhzKTsKLSAgICAgICAgY3AgPSBYNTA5X05BTUVfb25lbGluZSh4c25hbWUsIE5VTEwsIDApOwotICAgICAgICByZXN1bHQgPSBhcF9wc3RyZHVwKHAsIGNwKTsKLSAgICAgICAgZnJlZShjcCk7Ci0gICAgICAgIHJlc2R1cCA9IEZBTFNFOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJsZW4odmFyKSA+IDUgJiYgc3RyY0VRbih2YXIsICJTX0ROXyIsIDUpKSB7Ci0gICAgICAgIHhzbmFtZSA9IFg1MDlfZ2V0X3N1YmplY3RfbmFtZSh4cyk7Ci0gICAgICAgIHJlc3VsdCA9IHNzbF92YXJfbG9va3VwX3NzbF9jZXJ0X2RuKHAsIHhzbmFtZSwgdmFyKzUpOwotICAgICAgICByZXNkdXAgPSBGQUxTRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY0VRKHZhciwgIklfRE4iKSkgewotICAgICAgICB4c25hbWUgPSBYNTA5X2dldF9pc3N1ZXJfbmFtZSh4cyk7Ci0gICAgICAgIGNwID0gWDUwOV9OQU1FX29uZWxpbmUoeHNuYW1lLCBOVUxMLCAwKTsKLSAgICAgICAgcmVzdWx0ID0gYXBfcHN0cmR1cChwLCBjcCk7Ci0gICAgICAgIGZyZWUoY3ApOwotICAgICAgICByZXNkdXAgPSBGQUxTRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RybGVuKHZhcikgPiA1ICYmIHN0cmNFUW4odmFyLCAiSV9ETl8iLCA1KSkgewotICAgICAgICB4c25hbWUgPSBYNTA5X2dldF9pc3N1ZXJfbmFtZSh4cyk7Ci0gICAgICAgIHJlc3VsdCA9IHNzbF92YXJfbG9va3VwX3NzbF9jZXJ0X2RuKHAsIHhzbmFtZSwgdmFyKzUpOwotICAgICAgICByZXNkdXAgPSBGQUxTRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY0VRKHZhciwgIkFfU0lHIikpIHsKLSAgICAgICAgbmlkID0gT0JKX29iajJuaWQoeHMtPmNlcnRfaW5mby0+c2lnbmF0dXJlLT5hbGdvcml0aG0pOwotICAgICAgICByZXN1bHQgPSBhcF9wc3RyZHVwKHAsIChuaWQgPT0gTklEX3VuZGVmKSA/ICJVTktOT1dOIiA6IE9CSl9uaWQybG4obmlkKSk7Ci0gICAgICAgIHJlc2R1cCA9IEZBTFNFOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjRVEodmFyLCAiQV9LRVkiKSkgewotICAgICAgICBuaWQgPSBPQkpfb2JqMm5pZCh4cy0+Y2VydF9pbmZvLT5rZXktPmFsZ29yLT5hbGdvcml0aG0pOwotICAgICAgICByZXN1bHQgPSBhcF9wc3RyZHVwKHAsIChuaWQgPT0gTklEX3VuZGVmKSA/ICJVTktOT1dOIiA6IE9CSl9uaWQybG4obmlkKSk7Ci0gICAgICAgIHJlc2R1cCA9IEZBTFNFOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjRVEodmFyLCAiQ0VSVCIpKSB7Ci0gICAgICAgIHJlc3VsdCA9IHNzbF92YXJfbG9va3VwX3NzbF9jZXJ0X1BFTShwLCB4cyk7Ci0gICAgfQotCi0gICAgaWYgKHJlc3VsdCAhPSBOVUxMICYmIHJlc2R1cCkKLSAgICAgICAgcmVzdWx0ID0gYXBfcHN0cmR1cChwLCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgewotICAgIGNoYXIgKm5hbWU7Ci0gICAgaW50ICAgbmlkOwotfSBzc2xfdmFyX2xvb2t1cF9zc2xfY2VydF9kbl9yZWNbXSA9IHsKLSAgICB7ICJDIiwgICAgIE5JRF9jb3VudHJ5TmFtZSAgICAgICAgICAgIH0sCi0gICAgeyAiU1QiLCAgICBOSURfc3RhdGVPclByb3ZpbmNlTmFtZSAgICB9LCAvKiBvZmZpY2lhbGx5ICAgIChSRkMyMTU2KSAqLwotICAgIHsgIlNQIiwgICAgTklEX3N0YXRlT3JQcm92aW5jZU5hbWUgICAgfSwgLyogY29tcGF0aWJpbGl0eSAoU1NMZWF5KSAgKi8KLSAgICB7ICJMIiwgICAgIE5JRF9sb2NhbGl0eU5hbWUgICAgICAgICAgIH0sCi0gICAgeyAiTyIsICAgICBOSURfb3JnYW5pemF0aW9uTmFtZSAgICAgICB9LAotICAgIHsgIk9VIiwgICAgTklEX29yZ2FuaXphdGlvbmFsVW5pdE5hbWUgfSwKLSAgICB7ICJDTiIsICAgIE5JRF9jb21tb25OYW1lICAgICAgICAgICAgIH0sCi0gICAgeyAiVCIsICAgICBOSURfdGl0bGUgICAgICAgICAgICAgICAgICB9LAotICAgIHsgIkkiLCAgICAgTklEX2luaXRpYWxzICAgICAgICAgICAgICAgfSwKLSAgICB7ICJHIiwgICAgIE5JRF9naXZlbk5hbWUgICAgICAgICAgICAgIH0sCi0gICAgeyAiUyIsICAgICBOSURfc3VybmFtZSAgICAgICAgICAgICAgICB9LAotICAgIHsgIkQiLCAgICAgTklEX2Rlc2NyaXB0aW9uICAgICAgICAgICAgfSwKLSAgICB7ICJVSUQiLCAgIE5JRF91bmlxdWVJZGVudGlmaWVyICAgICAgIH0sCi0gICAgeyAiRW1haWwiLCBOSURfcGtjczlfZW1haWxBZGRyZXNzICAgICB9LAotICAgIHsgTlVMTCwgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQotfTsKLQotc3RhdGljIGNoYXIgKnNzbF92YXJfbG9va3VwX3NzbF9jZXJ0X2RuKHBvb2wgKnAsIFg1MDlfTkFNRSAqeHNuYW1lLCBjaGFyICp2YXIpCi17Ci0gICAgY2hhciAqcmVzdWx0OwotICAgIFg1MDlfTkFNRV9FTlRSWSAqeHNuZTsKLSAgICBpbnQgaSwgaiwgbjsKLQotICAgIHJlc3VsdCA9IE5VTEw7Ci0KLSAgICBmb3IgKGkgPSAwOyBzc2xfdmFyX2xvb2t1cF9zc2xfY2VydF9kbl9yZWNbaV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKLSAgICAgICAgaWYgKHN0ckVRKHZhciwgc3NsX3Zhcl9sb29rdXBfc3NsX2NlcnRfZG5fcmVjW2ldLm5hbWUpKSB7Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2tfWDUwOV9OQU1FX0VOVFJZX251bSh4c25hbWUtPmVudHJpZXMpOyBqKyspIHsKLSAgICAgICAgICAgICAgICB4c25lID0gc2tfWDUwOV9OQU1FX0VOVFJZX3ZhbHVlKHhzbmFtZS0+ZW50cmllcywgaik7Ci0gICAgICAgICAgICAgICAgbiA9IE9CSl9vYmoybmlkKHhzbmUtPm9iamVjdCk7Ci0gICAgICAgICAgICAgICAgaWYgKG4gPT0gc3NsX3Zhcl9sb29rdXBfc3NsX2NlcnRfZG5fcmVjW2ldLm5pZCkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhcF9wYWxsb2MocCwgeHNuZS0+dmFsdWUtPmxlbmd0aCsxKTsKLSAgICAgICAgICAgICAgICAgICAgYXBfY3B5c3RybihyZXN1bHQsIChjaGFyICopeHNuZS0+dmFsdWUtPmRhdGEsIHhzbmUtPnZhbHVlLT5sZW5ndGgrMSk7Ci0jaWZkZWYgQ0hBUlNFVF9FQkNESUMKLSAgICAgICAgICAgICAgICAgICAgYXNjaWkyZWJjZGljKHJlc3VsdCwgcmVzdWx0LCB4c25lLT52YWx1ZS0+bGVuZ3RoKTsKLSNlbmRpZiAvKiBDSEFSU0VUX0VCQ0RJQyAqLwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbeHNuZS0+dmFsdWUtPmxlbmd0aF0gPSBOVUw7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBjaGFyICpzc2xfdmFyX2xvb2t1cF9zc2xfY2VydF92YWxpZChwb29sICpwLCBBU04xX1VUQ1RJTUUgKnRtKQotewotICAgIGNoYXIgKnJlc3VsdDsKLSAgICBCSU8qIGJpbzsKLSAgICBpbnQgbjsKLQotICAgIGlmICgoYmlvID0gQklPX25ldyhCSU9fc19tZW0oKSkpID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIEFTTjFfVVRDVElNRV9wcmludChiaW8sIHRtKTsKLSAgICBuID0gQklPX3BlbmRpbmcoYmlvKTsKLSAgICByZXN1bHQgPSBhcF9wY2FsbG9jKHAsIG4rMSk7Ci0gICAgbiA9IEJJT19yZWFkKGJpbywgcmVzdWx0LCBuKTsKLSAgICByZXN1bHRbbl0gPSBOVUw7Ci0gICAgQklPX2ZyZWUoYmlvKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgY2hhciAqc3NsX3Zhcl9sb29rdXBfc3NsX2NlcnRfc2VyaWFsKHBvb2wgKnAsIFg1MDkgKnhzKQotewotICAgIGNoYXIgKnJlc3VsdDsKLSAgICBCSU8gKmJpbzsKLSAgICBpbnQgbjsKLQotICAgIGlmICgoYmlvID0gQklPX25ldyhCSU9fc19tZW0oKSkpID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGkyYV9BU04xX0lOVEVHRVIoYmlvLCBYNTA5X2dldF9zZXJpYWxOdW1iZXIoeHMpKTsKLSAgICBuID0gQklPX3BlbmRpbmcoYmlvKTsKLSAgICByZXN1bHQgPSBhcF9wY2FsbG9jKHAsIG4rMSk7Ci0gICAgbiA9IEJJT19yZWFkKGJpbywgcmVzdWx0LCBuKTsKLSAgICByZXN1bHRbbl0gPSBOVUw7Ci0gICAgQklPX2ZyZWUoYmlvKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgY2hhciAqc3NsX3Zhcl9sb29rdXBfc3NsX2NlcnRfY2hhaW4ocG9vbCAqcCwgU1RBQ0tfT0YoWDUwOSkgKnNrLCBjaGFyICp2YXIpCi17Ci0gICAgY2hhciAqcmVzdWx0OwotICAgIFg1MDkgKnhzOwotICAgIGludCBuOwotCi0gICAgcmVzdWx0ID0gTlVMTDsKLQotICAgIGlmIChzdHJzcG4odmFyLCAiMDEyMzQ1Njc4OSIpID09IHN0cmxlbih2YXIpKSB7Ci0gICAgICAgIG4gPSBhdG9pKHZhcik7Ci0gICAgICAgIGlmIChuIDwgc2tfWDUwOV9udW0oc2spKSB7Ci0gICAgICAgICAgICB4cyA9IHNrX1g1MDlfdmFsdWUoc2ssIG4pOwotICAgICAgICAgICAgcmVzdWx0ID0gc3NsX3Zhcl9sb29rdXBfc3NsX2NlcnRfUEVNKHAsIHhzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBjaGFyICpzc2xfdmFyX2xvb2t1cF9zc2xfY2VydF9QRU0ocG9vbCAqcCwgWDUwOSAqeHMpCi17Ci0gICAgY2hhciAqcmVzdWx0OwotICAgIEJJTyAqYmlvOwotICAgIGludCBuOwotCi0gICAgaWYgKChiaW8gPSBCSU9fbmV3KEJJT19zX21lbSgpKSkgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgUEVNX3dyaXRlX2Jpb19YNTA5KGJpbywgeHMpOwotICAgIG4gPSBCSU9fcGVuZGluZyhiaW8pOwotICAgIHJlc3VsdCA9IGFwX3BjYWxsb2MocCwgbisxKTsKLSAgICBuID0gQklPX3JlYWQoYmlvLCByZXN1bHQsIG4pOwotICAgIHJlc3VsdFtuXSA9IE5VTDsKLSAgICBCSU9fZnJlZShiaW8pOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBjaGFyICpzc2xfdmFyX2xvb2t1cF9zc2xfY2VydF92ZXJpZnkocG9vbCAqcCwgY29ubl9yZWMgKmMpCi17Ci0gICAgY2hhciAqcmVzdWx0OwotICAgIGxvbmcgdnJjOwotICAgIGNoYXIgKnZlcnI7Ci0gICAgY2hhciAqdmluZm87Ci0gICAgU1NMICpzc2w7Ci0gICAgWDUwOSAqeHM7Ci0KLSAgICByZXN1bHQgPSBOVUxMOwotICAgIHNzbCAgID0gYXBfY3R4X2dldChjLT5jbGllbnQtPmN0eCwgInNzbCIpOwotICAgIHZlcnIgID0gYXBfY3R4X2dldChjLT5jbGllbnQtPmN0eCwgInNzbDo6dmVyaWZ5OjplcnJvciIpOwotICAgIHZpbmZvID0gYXBfY3R4X2dldChjLT5jbGllbnQtPmN0eCwgInNzbDo6dmVyaWZ5OjppbmZvIik7Ci0gICAgdnJjICAgPSBTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoc3NsKTsKLSAgICB4cyAgICA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShzc2wpOwotCi0gICAgaWYgKHZyYyA9PSBYNTA5X1ZfT0sgJiYgdmVyciA9PSBOVUxMICYmIHZpbmZvID09IE5VTEwgJiYgeHMgPT0gTlVMTCkKLSAgICAgICAgLyogbm8gY2xpZW50IHZlcmlmaWNhdGlvbiBkb25lIGF0IGFsbCAqLwotICAgICAgICByZXN1bHQgPSAiTk9ORSI7Ci0gICAgZWxzZSBpZiAodnJjID09IFg1MDlfVl9PSyAmJiB2ZXJyID09IE5VTEwgJiYgdmluZm8gPT0gTlVMTCAmJiB4cyAhPSBOVUxMKQotICAgICAgICAvKiBjbGllbnQgdmVyaWZpY2F0aW9uIGRvbmUgc3VjY2Vzc2Z1bCAqLwotICAgICAgICByZXN1bHQgPSAiU1VDQ0VTUyI7Ci0gICAgZWxzZSBpZiAodnJjID09IFg1MDlfVl9PSyAmJiB2aW5mbyAhPSBOVUxMICYmIHN0ckVRKHZpbmZvLCAiR0VORVJPVVMiKSkKLSAgICAgICAgLyogY2xpZW50IHZlcmlmaWNhdGlvbiBkb25lIGluIGdlbmVyb3VzIHdheSAqLwotICAgICAgICByZXN1bHQgPSAiR0VORVJPVVMiOwotICAgIGVsc2UKLSAgICAgICAgLyogY2xpZW50IHZlcmlmaWNhdGlvbiBmYWlsZWQgKi8KLSAgICAgICAgcmVzdWx0ID0gYXBfcHNwcmludGYocCwgIkZBSUxFRDolcyIsIHZlcnIpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBjaGFyICpzc2xfdmFyX2xvb2t1cF9zc2xfY2lwaGVyKHBvb2wgKnAsIGNvbm5fcmVjICpjLCBjaGFyICp2YXIpCi17Ci0gICAgY2hhciAqcmVzdWx0OwotICAgIEJPT0wgcmVzZHVwOwotICAgIGludCB1c2VrZXlzaXplLCBhbGdrZXlzaXplOwotICAgIFNTTCAqc3NsOwotCi0gICAgcmVzdWx0ID0gTlVMTDsKLSAgICByZXNkdXAgPSBUUlVFOwotCi0gICAgc3NsID0gYXBfY3R4X2dldChjLT5jbGllbnQtPmN0eCwgInNzbCIpOwotICAgIHNzbF92YXJfbG9va3VwX3NzbF9jaXBoZXJfYml0cyhzc2wsICZ1c2VrZXlzaXplLCAmYWxna2V5c2l6ZSk7Ci0KLSAgICBpZiAoc3RyRVEodmFyLCAiIikpCi0gICAgICAgIHJlc3VsdCA9IChzc2wgIT0gTlVMTCA/IChjaGFyICopU1NMX2dldF9jaXBoZXJfbmFtZShzc2wpIDogTlVMTCk7Ci0gICAgZWxzZSBpZiAoc3RyY0VRKHZhciwgIl9FWFBPUlQiKSkKLSAgICAgICAgcmVzdWx0ID0gKHVzZWtleXNpemUgPCA1NiA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgIGVsc2UgaWYgKHN0cmNFUSh2YXIsICJfVVNFS0VZU0laRSIpKSB7Ci0gICAgICAgIHJlc3VsdCA9IGFwX3BzcHJpbnRmKHAsICIlZCIsIHVzZWtleXNpemUpOwotICAgICAgICByZXNkdXAgPSBGQUxTRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY0VRKHZhciwgIl9BTEdLRVlTSVpFIikpIHsKLSAgICAgICAgcmVzdWx0ID0gYXBfcHNwcmludGYocCwgIiVkIiwgYWxna2V5c2l6ZSk7Ci0gICAgICAgIHJlc2R1cCA9IEZBTFNFOwotICAgIH0KLQotICAgIGlmIChyZXN1bHQgIT0gTlVMTCAmJiByZXNkdXApCi0gICAgICAgIHJlc3VsdCA9IGFwX3BzdHJkdXAocCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdm9pZCBzc2xfdmFyX2xvb2t1cF9zc2xfY2lwaGVyX2JpdHMoU1NMICpzc2wsIGludCAqdXNla2V5c2l6ZSwgaW50ICphbGdrZXlzaXplKQotewotICAgIFNTTF9DSVBIRVIgKmNpcGhlcjsKLQotICAgICp1c2VrZXlzaXplID0gMDsKLSAgICAqYWxna2V5c2l6ZSA9IDA7Ci0gICAgaWYgKHNzbCAhPSBOVUxMKQotICAgICAgICBpZiAoKGNpcGhlciA9IFNTTF9nZXRfY3VycmVudF9jaXBoZXIoc3NsKSkgIT0gTlVMTCkKLSAgICAgICAgICAgICp1c2VrZXlzaXplID0gU1NMX0NJUEhFUl9nZXRfYml0cyhjaXBoZXIsIGFsZ2tleXNpemUpOwotICAgIHJldHVybjsKLX0KLQotc3RhdGljIGNoYXIgKnNzbF92YXJfbG9va3VwX3NzbF92ZXJzaW9uKHBvb2wgKnAsIGNoYXIgKnZhcikKLXsKLSAgICBjaGFyICpyZXN1bHQ7Ci0gICAgY2hhciAqY3AsICpjcDI7Ci0KLSAgICByZXN1bHQgPSBOVUxMOwotCi0gICAgaWYgKHN0ckVRKHZhciwgIlBST0RVQ1QiKSkgewotI2lmIGRlZmluZWQoU1NMX1BST0RVQ1RfTkFNRSkgJiYgZGVmaW5lZChTU0xfUFJPRFVDVF9WRVJTSU9OKQotICAgICAgICByZXN1bHQgPSBhcF9wc3ByaW50ZihwLCAiJXMvJXMiLCBTU0xfUFJPRFVDVF9OQU1FLCBTU0xfUFJPRFVDVF9WRVJTSU9OKTsKLSNlbHNlCi0gICAgICAgIHJlc3VsdCA9IE5VTEw7Ci0jZW5kaWYKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyRVEodmFyLCAiSU5URVJGQUNFIikpIHsKLSAgICAgICAgcmVzdWx0ID0gYXBfcHNwcmludGYocCwgIm1vZF9zc2wvJXMiLCBNT0RfU1NMX1ZFUlNJT04pOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJFUSh2YXIsICJMSUJSQVJZIikpIHsKLSAgICAgICAgcmVzdWx0ID0gYXBfcHN0cmR1cChwLCBTU0xfTElCUkFSWV9URVhUKTsKLSAgICAgICAgaWYgKChjcCA9IHN0cmNocihyZXN1bHQsICcgJykpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpjcCA9ICcvJzsKLSAgICAgICAgICAgIGlmICgoY3AyID0gc3RyY2hyKGNwLCAnICcpKSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICpjcDIgPSBOVUw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zc2wvc3NsX2V4cHIuYyBiL21vZHVsZXMvc3NsL3NzbF9leHByLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YWI4NzMuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9zc2wvc3NsX2V4cHIuYworKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKiAgICAgICAgICAgICAgICAgICAgICBfICAgICAgICAgICAgIF8KLSoqICBfIF9fIF9fXyAgIF9fXyAgIF9ffCB8ICAgIF9fXyBfX198IHwgIG1vZF9zc2wKLSoqIHwgJ18gYCBfIFwgLyBfIFwgLyBfYCB8ICAgLyBfXy8gX198IHwgIEFwYWNoZSBJbnRlcmZhY2UgdG8gT3BlblNTTAotKiogfCB8IHwgfCB8IHwgKF8pIHwgKF98IHwgICBcX18gXF9fIFwgfCAgd3d3Lm1vZHNzbC5vcmcKLSoqIHxffCB8X3wgfF98XF9fXy8gXF9fLF98X19ffF9fXy9fX18vX3wgIGZ0cC5tb2Rzc2wub3JnCi0qKiAgICAgICAgICAgICAgICAgICAgICB8X19fX198Ci0qKiAgc3NsX2V4cHIuYwotKiogIEV4cHJlc3Npb24gSGFuZGxpbmcKLSovCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBSYWxmIFMuIEVuZ2Vsc2NoYWxsLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICogICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotICogICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+IGZvciB1c2UgaW4gdGhlCi0gKiAgICAgbW9kX3NzbCBwcm9qZWN0IChodHRwOi8vd3d3Lm1vZHNzbC5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJtb2Rfc3NsIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICogICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgcnNlQGVuZ2Vsc2NoYWxsLmNvbS4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAibW9kX3NzbCIKLSAqICAgIG5vciBtYXkgIm1vZF9zc2wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yCi0gKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgUmFsZiBTLiBFbmdlbHNjaGFsbC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci0gKiAgICAgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGVuZ2Vsc2NoYWxsLmNvbT4gZm9yIHVzZSBpbiB0aGUKLSAqICAgICBtb2Rfc3NsIHByb2plY3QgKGh0dHA6Ly93d3cubW9kc3NsLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFJBTEYgUy4gRU5HRUxTQ0hBTEwgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFJBTEYgUy4gRU5HRUxTQ0hBTEwgT1IKLSAqIEhJUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBgYEl0IGlzIGhhcmQgdG8gZmx5IHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZWFnbGVzIHdoZW4geW91IHdvcmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSB0dXJrZXlzLicnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBVbmtub3duICAqLwotI2luY2x1ZGUgIm1vZF9zc2wuaCIKLQotCi0vKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgRXhwcmVzc2lvbiBIYW5kbGluZwotKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qLwotCi1zc2xfZXhwcl9pbmZvX3R5cGUgc3NsX2V4cHJfaW5mbzsKLWNoYXIgICAgICAgICAgICAgICpzc2xfZXhwcl9lcnJvcjsKLQotc3NsX2V4cHIgKnNzbF9leHByX2NvbXAocG9vbCAqcCwgY2hhciAqZXhwcikKLXsKLSAgICBzc2xfZXhwcl9pbmZvLnBvb2wgICAgICAgPSBwOwotICAgIHNzbF9leHByX2luZm8uaW5wdXRidWYgICA9IGV4cHI7Ci0gICAgc3NsX2V4cHJfaW5mby5pbnB1dGxlbiAgID0gc3RybGVuKGV4cHIpOwotICAgIHNzbF9leHByX2luZm8uaW5wdXRwdHIgICA9IHNzbF9leHByX2luZm8uaW5wdXRidWY7Ci0gICAgc3NsX2V4cHJfaW5mby5leHByICAgICAgID0gRkFMU0U7Ci0KLSAgICBzc2xfZXhwcl9lcnJvciA9IE5VTEw7Ci0gICAgaWYgKHNzbF9leHByX3l5cGFyc2UoKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIHNzbF9leHByX2luZm8uZXhwcjsKLX0KLQotY2hhciAqc3NsX2V4cHJfZ2V0X2Vycm9yKHZvaWQpCi17Ci0gICAgaWYgKHNzbF9leHByX2Vycm9yID09IE5VTEwpCi0gICAgICAgIHJldHVybiAiIjsKLSAgICByZXR1cm4gc3NsX2V4cHJfZXJyb3I7Ci19Ci0KLXNzbF9leHByICpzc2xfZXhwcl9tYWtlKHNzbF9leHByX25vZGVfb3Agb3AsIHZvaWQgKmExLCB2b2lkICphMikKLXsKLSAgICBzc2xfZXhwciAqbm9kZTsKLQotICAgIG5vZGUgPSAoc3NsX2V4cHIgKilhcF9wYWxsb2Moc3NsX2V4cHJfaW5mby5wb29sLCBzaXplb2Yoc3NsX2V4cHIpKTsKLSAgICBub2RlLT5ub2RlX29wICAgPSBvcDsKLSAgICBub2RlLT5ub2RlX2FyZzEgPSAoY2hhciAqKWExOwotICAgIG5vZGUtPm5vZGVfYXJnMiA9IChjaGFyICopYTI7Ci0gICAgcmV0dXJuIG5vZGU7Ci19Ci0KLWludCBzc2xfZXhwcl9leGVjKHJlcXVlc3RfcmVjICpyLCBzc2xfZXhwciAqZXhwcikKLXsKLSAgICBCT09MIHJjOwotCi0gICAgcmMgPSBzc2xfZXhwcl9ldmFsKHIsIGV4cHIpOwotICAgIGlmIChzc2xfZXhwcl9lcnJvciAhPSBOVUxMKQotICAgICAgICByZXR1cm4gKC0xKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAocmMgPyAxIDogMCk7Ci19Ci0KZGlmZiAtLWdpdCBhL21vZHVsZXMvc3NsL3NzbF9leHByLmggYi9tb2R1bGVzL3NzbC9zc2xfZXhwci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTliYjAyLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvc3NsL3NzbF9leHByLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyogICAgICAgICAgICAgICAgICAgICAgXyAgICAgICAgICAgICBfCi0qKiAgXyBfXyBfX18gICBfX18gICBfX3wgfCAgICBfX18gX19ffCB8ICBtb2Rfc3NsCi0qKiB8ICdfIGAgXyBcIC8gXyBcIC8gX2AgfCAgIC8gX18vIF9ffCB8ICBBcGFjaGUgSW50ZXJmYWNlIHRvIE9wZW5TU0wKLSoqIHwgfCB8IHwgfCB8IChfKSB8IChffCB8ICAgXF9fIFxfXyBcIHwgIHd3dy5tb2Rzc2wub3JnCi0qKiB8X3wgfF98IHxffFxfX18vIFxfXyxffF9fX3xfX18vX19fL198ICBmdHAubW9kc3NsLm9yZwotKiogICAgICAgICAgICAgICAgICAgICAgfF9fX19ffAotKiogIHNzbF9leHByLmgKLSoqICBFeHByZXNzaW9uIEhhbmRsaW5nIChIZWFkZXIpCi0qLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgUmFsZiBTLiBFbmdlbHNjaGFsbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLSAqICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLSAqICAgICBSYWxmIFMuIEVuZ2Vsc2NoYWxsIDxyc2VAZW5nZWxzY2hhbGwuY29tPiBmb3IgdXNlIGluIHRoZQotICogICAgIG1vZF9zc2wgcHJvamVjdCAoaHR0cDovL3d3dy5tb2Rzc2wub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAibW9kX3NzbCIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIHJzZUBlbmdlbHNjaGFsbC5jb20uCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIm1vZF9zc2wiCi0gKiAgICBub3IgbWF5ICJtb2Rfc3NsIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvcgotICogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFJhbGYgUy4gRW5nZWxzY2hhbGwuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotICogICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+IGZvciB1c2UgaW4gdGhlCi0gKiAgICAgbW9kX3NzbCBwcm9qZWN0IChodHRwOi8vd3d3Lm1vZHNzbC5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBSQUxGIFMuIEVOR0VMU0NIQUxMIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBSQUxGIFMuIEVOR0VMU0NIQUxMIE9SCi0gKiBISVMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBgYE1heSBhbGwgeW91ciBQVVNIZXMgYmUgUE9QZWQuJycgKi8KLQotI2lmbmRlZiBTU0xfRVhQUl9ICi0jZGVmaW5lIFNTTF9FWFBSX0gKLQotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRSAwCi0jZW5kaWYKLQotI2lmbmRlZiBUUlVFCi0jZGVmaW5lIFRSVUUgIUZBTFNFCi0jZW5kaWYKLQotI2lmbmRlZiBZWV9OVUxMCi0jZGVmaW5lIFlZX05VTEwgMAotI2VuZGlmCi0KLSNpZm5kZWYgTUlOCi0jZGVmaW5lIE1JTihhLGIpICgoKGEpPChiKSk/KGEpOihiKSkKLSNlbmRpZgotCi0jaWZuZGVmIEJPT0wKLSNkZWZpbmUgQk9PTCB1bnNpZ25lZCBpbnQKLSNlbmRpZgotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAodm9pZCAqKTAKLSNlbmRpZgotCi0jaWZuZGVmIE5VTAotI2RlZmluZSBOVUwgJ1wwJwotI2VuZGlmCi0KLSNpZm5kZWYgWVlERUJVRwotI2RlZmluZSBZWURFQlVHIDAKLSNlbmRpZgotCi10eXBlZGVmIGVudW0gewotICAgIG9wX05PUCwgb3BfTGlzdEVsZW1lbnQsCi0gICAgb3BfVHJ1ZSwgb3BfRmFsc2UsIG9wX05vdCwgb3BfT3IsIG9wX0FuZCwgb3BfQ29tcCwKLSAgICBvcF9FUSwgb3BfTkUsIG9wX0xULCBvcF9MRSwgb3BfR1QsIG9wX0dFLCBvcF9JTiwgb3BfUkVHLCBvcF9OUkUsCi0gICAgb3BfRGlnaXQsIG9wX1N0cmluZywgb3BfUmVnZXgsIG9wX1Zhciwgb3BfRnVuYwotfSBzc2xfZXhwcl9ub2RlX29wOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgc3NsX2V4cHJfbm9kZV9vcCBub2RlX29wOwotICAgIHZvaWQgKm5vZGVfYXJnMTsKLSAgICB2b2lkICpub2RlX2FyZzI7Ci19IHNzbF9leHByX25vZGU7Ci0KLXR5cGVkZWYgc3NsX2V4cHJfbm9kZSBzc2xfZXhwcjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXBvb2wgICAgICpwb29sOwotICAgIGNoYXIgICAgICppbnB1dGJ1ZjsKLSAgICBpbnQgICAgICAgaW5wdXRsZW47Ci0gICAgY2hhciAgICAgKmlucHV0cHRyOwotICAgIHNzbF9leHByICpleHByOwotfSBzc2xfZXhwcl9pbmZvX3R5cGU7Ci0KLWV4dGVybiBzc2xfZXhwcl9pbmZvX3R5cGUgc3NsX2V4cHJfaW5mbzsKLWV4dGVybiBjaGFyICpzc2xfZXhwcl9lcnJvcjsKLQotI2RlZmluZSB5eWx2YWwgIHNzbF9leHByX3l5bHZhbAotI2RlZmluZSB5eWVycm9yIHNzbF9leHByX3l5ZXJyb3IKLSNkZWZpbmUgeXlpbnB1dCBzc2xfZXhwcl95eWlucHV0Ci0KLWV4dGVybiBpbnQgc3NsX2V4cHJfeXlwYXJzZSh2b2lkKTsKLWV4dGVybiBpbnQgc3NsX2V4cHJfeXllcnJvcihjaGFyICopOwotZXh0ZXJuIGludCBzc2xfZXhwcl95eWxleCh2b2lkKTsKLQotZXh0ZXJuIHNzbF9leHByICpzc2xfZXhwcl9jb21wKHBvb2wgKiwgY2hhciAqKTsKLWV4dGVybiBpbnQgICAgICAgc3NsX2V4cHJfZXhlYyhyZXF1ZXN0X3JlYyAqLCBzc2xfZXhwciAqKTsKLWV4dGVybiBjaGFyICAgICAqc3NsX2V4cHJfZ2V0X2Vycm9yKHZvaWQpOwotZXh0ZXJuIHNzbF9leHByICpzc2xfZXhwcl9tYWtlKHNzbF9leHByX25vZGVfb3AsIHZvaWQgKiwgdm9pZCAqKTsKLWV4dGVybiBCT09MICAgICAgc3NsX2V4cHJfZXZhbChyZXF1ZXN0X3JlYyAqLCBzc2xfZXhwciAqKTsKLQotI2VuZGlmIC8qIFNTTF9FWFBSX0ggKi8KZGlmZiAtLWdpdCBhL21vZHVsZXMvc3NsL3NzbF9leHByX2V2YWwuYyBiL21vZHVsZXMvc3NsL3NzbF9leHByX2V2YWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjNWVhNS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL3NzbC9zc2xfZXhwcl9ldmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyogICAgICAgICAgICAgICAgICAgICAgXyAgICAgICAgICAgICBfCi0qKiAgXyBfXyBfX18gICBfX18gICBfX3wgfCAgICBfX18gX19ffCB8ICBtb2Rfc3NsCi0qKiB8ICdfIGAgXyBcIC8gXyBcIC8gX2AgfCAgIC8gX18vIF9ffCB8ICBBcGFjaGUgSW50ZXJmYWNlIHRvIE9wZW5TU0wKLSoqIHwgfCB8IHwgfCB8IChfKSB8IChffCB8ICAgXF9fIFxfXyBcIHwgIHd3dy5tb2Rzc2wub3JnCi0qKiB8X3wgfF98IHxffFxfX18vIFxfXyxffF9fX3xfX18vX19fL198ICBmdHAubW9kc3NsLm9yZwotKiogICAgICAgICAgICAgICAgICAgICAgfF9fX19ffAotKiogIHNzbF9leHByX2V2YWwuYwotKiogIEV4cHJlc3Npb24gRXZhbHVhdGlvbgotKi8KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAxIFJhbGYgUy4gRW5nZWxzY2hhbGwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci0gKiAgICAgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGVuZ2Vsc2NoYWxsLmNvbT4gZm9yIHVzZSBpbiB0aGUKLSAqICAgICBtb2Rfc3NsIHByb2plY3QgKGh0dHA6Ly93d3cubW9kc3NsLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIm1vZF9zc2wiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICByc2VAZW5nZWxzY2hhbGwuY29tLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJtb2Rfc3NsIgotICogICAgbm9yIG1heSAibW9kX3NzbCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3IKLSAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBSYWxmIFMuIEVuZ2Vsc2NoYWxsLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLSAqICAgICBSYWxmIFMuIEVuZ2Vsc2NoYWxsIDxyc2VAZW5nZWxzY2hhbGwuY29tPiBmb3IgdXNlIGluIHRoZQotICogICAgIG1vZF9zc2wgcHJvamVjdCAoaHR0cDovL3d3dy5tb2Rzc2wub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgUkFMRiBTLiBFTkdFTFNDSEFMTCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgUkFMRiBTLiBFTkdFTFNDSEFMTCBPUgotICogSElTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGBgTWFrZSBsb3ZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBzb2Z0d2FyZSEnJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIFVua25vd24gKi8KLSNpbmNsdWRlICJtb2Rfc3NsLmgiCi0KLQotLyogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogIEV4cHJlc3Npb24gRXZhbHVhdGlvbgotKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qLwotCi1zdGF0aWMgQk9PTCAgc3NsX2V4cHJfZXZhbF9jb21wKHJlcXVlc3RfcmVjICosIHNzbF9leHByICopOwotc3RhdGljIGNoYXIgKnNzbF9leHByX2V2YWxfd29yZChyZXF1ZXN0X3JlYyAqLCBzc2xfZXhwciAqKTsKLXN0YXRpYyBjaGFyICpzc2xfZXhwcl9ldmFsX2Z1bmNfZmlsZShyZXF1ZXN0X3JlYyAqLCBjaGFyICopOwotc3RhdGljIGludCAgIHNzbF9leHByX2V2YWxfc3RyY21wbGV4KGNoYXIgKiwgY2hhciAqKTsKLQotQk9PTCBzc2xfZXhwcl9ldmFsKHJlcXVlc3RfcmVjICpyLCBzc2xfZXhwciAqbm9kZSkKLXsKLSAgICBzd2l0Y2ggKG5vZGUtPm5vZGVfb3ApIHsKLSAgICAgICAgY2FzZSBvcF9UcnVlOiB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIG9wX0ZhbHNlOiB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBvcF9Ob3Q6IHsKLSAgICAgICAgICAgIHNzbF9leHByICplID0gKHNzbF9leHByICopbm9kZS0+bm9kZV9hcmcxOwotICAgICAgICAgICAgcmV0dXJuICghc3NsX2V4cHJfZXZhbChyLCBlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBvcF9PcjogewotICAgICAgICAgICAgc3NsX2V4cHIgKmUxID0gKHNzbF9leHByICopbm9kZS0+bm9kZV9hcmcxOwotICAgICAgICAgICAgc3NsX2V4cHIgKmUyID0gKHNzbF9leHByICopbm9kZS0+bm9kZV9hcmcyOwotICAgICAgICAgICAgcmV0dXJuIChzc2xfZXhwcl9ldmFsKHIsIGUxKSB8fCBzc2xfZXhwcl9ldmFsKHIsIGUyKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBvcF9BbmQ6IHsKLSAgICAgICAgICAgIHNzbF9leHByICplMSA9IChzc2xfZXhwciAqKW5vZGUtPm5vZGVfYXJnMTsKLSAgICAgICAgICAgIHNzbF9leHByICplMiA9IChzc2xfZXhwciAqKW5vZGUtPm5vZGVfYXJnMjsKLSAgICAgICAgICAgIHJldHVybiAoc3NsX2V4cHJfZXZhbChyLCBlMSkgJiYgc3NsX2V4cHJfZXZhbChyLCBlMikpOwotICAgICAgICB9Ci0gICAgICAgIGNhc2Ugb3BfQ29tcDogewotICAgICAgICAgICAgc3NsX2V4cHIgKmUgPSAoc3NsX2V4cHIgKilub2RlLT5ub2RlX2FyZzE7Ci0gICAgICAgICAgICByZXR1cm4gc3NsX2V4cHJfZXZhbF9jb21wKHIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIHNzbF9leHByX2Vycm9yID0gIkludGVybmFsIGV2YWx1YXRpb24gZXJyb3I6IFVua25vd24gZXhwcmVzc2lvbiBub2RlIjsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIEJPT0wgc3NsX2V4cHJfZXZhbF9jb21wKHJlcXVlc3RfcmVjICpyLCBzc2xfZXhwciAqbm9kZSkKLXsKLSAgICBzd2l0Y2ggKG5vZGUtPm5vZGVfb3ApIHsKLSAgICAgICAgY2FzZSBvcF9FUTogewotICAgICAgICAgICAgc3NsX2V4cHIgKmUxID0gKHNzbF9leHByICopbm9kZS0+bm9kZV9hcmcxOwotICAgICAgICAgICAgc3NsX2V4cHIgKmUyID0gKHNzbF9leHByICopbm9kZS0+bm9kZV9hcmcyOwotICAgICAgICAgICAgcmV0dXJuIChzdHJjbXAoc3NsX2V4cHJfZXZhbF93b3JkKHIsIGUxKSwgc3NsX2V4cHJfZXZhbF93b3JkKHIsIGUyKSkgPT0gMCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBvcF9ORTogewotICAgICAgICAgICAgc3NsX2V4cHIgKmUxID0gKHNzbF9leHByICopbm9kZS0+bm9kZV9hcmcxOwotICAgICAgICAgICAgc3NsX2V4cHIgKmUyID0gKHNzbF9leHByICopbm9kZS0+bm9kZV9hcmcyOwotICAgICAgICAgICAgcmV0dXJuIChzdHJjbXAoc3NsX2V4cHJfZXZhbF93b3JkKHIsIGUxKSwgc3NsX2V4cHJfZXZhbF93b3JkKHIsIGUyKSkgIT0gMCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBvcF9MVDogewotICAgICAgICAgICAgc3NsX2V4cHIgKmUxID0gKHNzbF9leHByICopbm9kZS0+bm9kZV9hcmcxOwotICAgICAgICAgICAgc3NsX2V4cHIgKmUyID0gKHNzbF9leHByICopbm9kZS0+bm9kZV9hcmcyOwotICAgICAgICAgICAgcmV0dXJuIChzc2xfZXhwcl9ldmFsX3N0cmNtcGxleChzc2xfZXhwcl9ldmFsX3dvcmQociwgZTEpLCBzc2xfZXhwcl9ldmFsX3dvcmQociwgZTIpKSA8ICAwKTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIG9wX0xFOiB7Ci0gICAgICAgICAgICBzc2xfZXhwciAqZTEgPSAoc3NsX2V4cHIgKilub2RlLT5ub2RlX2FyZzE7Ci0gICAgICAgICAgICBzc2xfZXhwciAqZTIgPSAoc3NsX2V4cHIgKilub2RlLT5ub2RlX2FyZzI7Ci0gICAgICAgICAgICByZXR1cm4gKHNzbF9leHByX2V2YWxfc3RyY21wbGV4KHNzbF9leHByX2V2YWxfd29yZChyLCBlMSksIHNzbF9leHByX2V2YWxfd29yZChyLCBlMikpIDw9IDApOwotICAgICAgICB9Ci0gICAgICAgIGNhc2Ugb3BfR1Q6IHsKLSAgICAgICAgICAgIHNzbF9leHByICplMSA9IChzc2xfZXhwciAqKW5vZGUtPm5vZGVfYXJnMTsKLSAgICAgICAgICAgIHNzbF9leHByICplMiA9IChzc2xfZXhwciAqKW5vZGUtPm5vZGVfYXJnMjsKLSAgICAgICAgICAgIHJldHVybiAoc3NsX2V4cHJfZXZhbF9zdHJjbXBsZXgoc3NsX2V4cHJfZXZhbF93b3JkKHIsIGUxKSwgc3NsX2V4cHJfZXZhbF93b3JkKHIsIGUyKSkgPiAgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBvcF9HRTogewotICAgICAgICAgICAgc3NsX2V4cHIgKmUxID0gKHNzbF9leHByICopbm9kZS0+bm9kZV9hcmcxOwotICAgICAgICAgICAgc3NsX2V4cHIgKmUyID0gKHNzbF9leHByICopbm9kZS0+bm9kZV9hcmcyOwotICAgICAgICAgICAgcmV0dXJuIChzc2xfZXhwcl9ldmFsX3N0cmNtcGxleChzc2xfZXhwcl9ldmFsX3dvcmQociwgZTEpLCBzc2xfZXhwcl9ldmFsX3dvcmQociwgZTIpKSA+PSAwKTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIG9wX0lOOiB7Ci0gICAgICAgICAgICBzc2xfZXhwciAqZTEgPSAoc3NsX2V4cHIgKilub2RlLT5ub2RlX2FyZzE7Ci0gICAgICAgICAgICBzc2xfZXhwciAqZTIgPSAoc3NsX2V4cHIgKilub2RlLT5ub2RlX2FyZzI7Ci0gICAgICAgICAgICBzc2xfZXhwciAqZTM7Ci0gICAgICAgICAgICBjaGFyICp3MSA9IHNzbF9leHByX2V2YWxfd29yZChyLCBlMSk7Ci0gICAgICAgICAgICBCT09MIGZvdW5kID0gRkFMU0U7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgZTMgPSAoc3NsX2V4cHIgKillMi0+bm9kZV9hcmcxOwotICAgICAgICAgICAgICAgIGUyID0gKHNzbF9leHByICopZTItPm5vZGVfYXJnMjsKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHcxLCBzc2xfZXhwcl9ldmFsX3dvcmQociwgZTMpKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAoZTIgIT0gTlVMTCk7Ci0gICAgICAgICAgICByZXR1cm4gZm91bmQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBvcF9SRUc6IHsKLSAgICAgICAgICAgIHNzbF9leHByICplMTsKLSAgICAgICAgICAgIHNzbF9leHByICplMjsKLSAgICAgICAgICAgIGNoYXIgKndvcmQ7Ci0gICAgICAgICAgICByZWdleF90ICpyZWdleDsKLQotICAgICAgICAgICAgZTEgPSAoc3NsX2V4cHIgKilub2RlLT5ub2RlX2FyZzE7Ci0gICAgICAgICAgICBlMiA9IChzc2xfZXhwciAqKW5vZGUtPm5vZGVfYXJnMjsKLSAgICAgICAgICAgIHdvcmQgPSBzc2xfZXhwcl9ldmFsX3dvcmQociwgZTEpOwotICAgICAgICAgICAgcmVnZXggPSAocmVnZXhfdCAqKShlMi0+bm9kZV9hcmcxKTsKLSAgICAgICAgICAgIHJldHVybiAocmVnZXhlYyhyZWdleCwgd29yZCwgMCwgTlVMTCwgMCkgPT0gMCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBvcF9OUkU6IHsKLSAgICAgICAgICAgIHNzbF9leHByICplMTsKLSAgICAgICAgICAgIHNzbF9leHByICplMjsKLSAgICAgICAgICAgIGNoYXIgKndvcmQ7Ci0gICAgICAgICAgICByZWdleF90ICpyZWdleDsKLQotICAgICAgICAgICAgZTEgPSAoc3NsX2V4cHIgKilub2RlLT5ub2RlX2FyZzE7Ci0gICAgICAgICAgICBlMiA9IChzc2xfZXhwciAqKW5vZGUtPm5vZGVfYXJnMjsKLSAgICAgICAgICAgIHdvcmQgPSBzc2xfZXhwcl9ldmFsX3dvcmQociwgZTEpOwotICAgICAgICAgICAgcmVnZXggPSAocmVnZXhfdCAqKShlMi0+bm9kZV9hcmcxKTsKLSAgICAgICAgICAgIHJldHVybiAhKHJlZ2V4ZWMocmVnZXgsIHdvcmQsIDAsIE5VTEwsIDApID09IDApOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIHNzbF9leHByX2Vycm9yID0gIkludGVybmFsIGV2YWx1YXRpb24gZXJyb3I6IFVua25vd24gZXhwcmVzc2lvbiBub2RlIjsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKnNzbF9leHByX2V2YWxfd29yZChyZXF1ZXN0X3JlYyAqciwgc3NsX2V4cHIgKm5vZGUpCi17Ci0gICAgc3dpdGNoIChub2RlLT5ub2RlX29wKSB7Ci0gICAgICAgIGNhc2Ugb3BfRGlnaXQ6IHsKLSAgICAgICAgICAgIGNoYXIgKnN0cmluZyA9IChjaGFyICopbm9kZS0+bm9kZV9hcmcxOwotICAgICAgICAgICAgcmV0dXJuIHN0cmluZzsKLSAgICAgICAgfQotICAgICAgICBjYXNlIG9wX1N0cmluZzogewotICAgICAgICAgICAgY2hhciAqc3RyaW5nID0gKGNoYXIgKilub2RlLT5ub2RlX2FyZzE7Ci0gICAgICAgICAgICByZXR1cm4gc3RyaW5nOwotICAgICAgICB9Ci0gICAgICAgIGNhc2Ugb3BfVmFyOiB7Ci0gICAgICAgICAgICBjaGFyICp2YXIgPSAoY2hhciAqKW5vZGUtPm5vZGVfYXJnMTsKLSAgICAgICAgICAgIGNoYXIgKnZhbCA9IHNzbF92YXJfbG9va3VwKHItPnBvb2wsIHItPnNlcnZlciwgci0+Y29ubmVjdGlvbiwgciwgdmFyKTsKLSAgICAgICAgICAgIHJldHVybiAodmFsID09IE5VTEwgPyAiIiA6IHZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBvcF9GdW5jOiB7Ci0gICAgICAgICAgICBjaGFyICpuYW1lID0gKGNoYXIgKilub2RlLT5ub2RlX2FyZzE7Ci0gICAgICAgICAgICBzc2xfZXhwciAqYXJncyA9IChzc2xfZXhwciAqKW5vZGUtPm5vZGVfYXJnMjsKLSAgICAgICAgICAgIGlmIChzdHJFUShuYW1lLCAiZmlsZSIpKQotICAgICAgICAgICAgICAgIHJldHVybiBzc2xfZXhwcl9ldmFsX2Z1bmNfZmlsZShyLCAoY2hhciAqKShhcmdzLT5ub2RlX2FyZzEpKTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHNzbF9leHByX2Vycm9yID0gIkludGVybmFsIGV2YWx1YXRpb24gZXJyb3I6IFVua25vd24gZnVuY3Rpb24gbmFtZSI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIHNzbF9leHByX2Vycm9yID0gIkludGVybmFsIGV2YWx1YXRpb24gZXJyb3I6IFVua25vd24gZXhwcmVzc2lvbiBub2RlIjsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKnNzbF9leHByX2V2YWxfZnVuY19maWxlKHJlcXVlc3RfcmVjICpyLCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICBGSUxFICpmcDsKLSAgICBjaGFyICpidWY7Ci0gICAgaW50IGxlbjsKLQotICAgIGlmICgoZnAgPSBhcF9wZm9wZW4oci0+cG9vbCwgZmlsZW5hbWUsICJyIikpID09IE5VTEwpIHsKLSAgICAgICAgc3NsX2V4cHJfZXJyb3IgPSAiQ2Fubm90IG9wZW4gZmlsZSI7Ci0gICAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0gICAgZnNlZWsoZnAsIDAsIFNFRUtfRU5EKTsKLSAgICBsZW4gPSBmdGVsbChmcCk7Ci0gICAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgICAgIGJ1ZiA9IChjaGFyICopYXBfcGFsbG9jKHItPnBvb2wsIHNpemVvZihjaGFyKSAqIDEpOwotICAgICAgICAqYnVmID0gTlVMOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKChidWYgPSAoY2hhciAqKWFwX3BhbGxvYyhyLT5wb29sLCBzaXplb2YoY2hhcikgKiBsZW4rMSkpID09IE5VTEwpIHsKLSAgICAgICAgICAgIHNzbF9leHByX2Vycm9yID0gIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkiOwotICAgICAgICAgICAgYXBfcGZjbG9zZShyLT5wb29sLCBmcCk7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgZnNlZWsoZnAsIDAsIFNFRUtfU0VUKTsKLSAgICAgICAgaWYgKGZyZWFkKGJ1ZiwgbGVuLCAxLCBmcCkgPT0gMCkgewotICAgICAgICAgICAgc3NsX2V4cHJfZXJyb3IgPSAiQ2Fubm90IHJlYWQgZnJvbSBmaWxlIjsKLSAgICAgICAgICAgIGZjbG9zZShmcCk7Ci0gICAgICAgICAgICByZXR1cm4gKCIiKTsKLSAgICAgICAgfQotICAgICAgICBidWZbbGVuXSA9IE5VTDsKLSAgICB9Ci0gICAgYXBfcGZjbG9zZShyLT5wb29sLCBmcCk7Ci0gICAgcmV0dXJuIGJ1ZjsKLX0KLQotLyogYSB2YXJpYW50IG9mIHN0cmNtcCgzKSB3aGljaCB3b3JrcyBjb3JyZWN0bHkgYWxzbyBmb3IgbnVtYmVyIHN0cmluZ3MgKi8KLXN0YXRpYyBpbnQgc3NsX2V4cHJfZXZhbF9zdHJjbXBsZXgoY2hhciAqY3BOdW0xLCBjaGFyICpjcE51bTIpCi17Ci0gICAgaW50IGksIG4xLCBuMjsKLQotICAgIGlmIChjcE51bTEgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIGlmIChjcE51bTIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuICsxOwotICAgIG4xID0gc3RybGVuKGNwTnVtMSk7Ci0gICAgbjIgPSBzdHJsZW4oY3BOdW0yKTsKLSAgICBpZiAobjEgPiBuMikKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgaWYgKG4xIDwgbjIpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbjE7IGkrKykgewotICAgICAgICBpZiAoY3BOdW0xW2ldID4gY3BOdW0yW2ldKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIGlmIChjcE51bTFbaV0gPCBjcE51bTJbaV0pCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NzbC9zc2xfZXhwcl9wYXJzZS5jIGIvbW9kdWxlcy9zc2wvc3NsX2V4cHJfcGFyc2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUzNTU1My4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL3NzbC9zc2xfZXhwcl9wYXJzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjA1ICswLDAgQEAKLSNpZm5kZWYgbGludAotc3RhdGljIGNoYXIgY29uc3QgCi1zc2xfZXhwcl95eXJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy91c3IuYmluL3lhY2Mvc2tlbGV0b24uYyx2IDEuMjggMjAwMC8wMS8xNyAwMjowNDowNiBiZGUgRXhwICQiOwotI2VuZGlmCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZGVmaW5lIFlZQllBQ0MgMQotI2RlZmluZSBZWU1BSk9SIDEKLSNkZWZpbmUgWVlNSU5PUiA5Ci0jZGVmaW5lIFlZTEVYIHNzbF9leHByX3l5bGV4KCkKLSNkZWZpbmUgWVlFTVBUWSAtMQotI2RlZmluZSBzc2xfZXhwcl95eWNsZWFyaW4gKHNzbF9leHByX3l5Y2hhcj0oWVlFTVBUWSkpCi0jZGVmaW5lIHNzbF9leHByX3l5ZXJyb2sgKHNzbF9leHByX3l5ZXJyZmxhZz0wKQotI2RlZmluZSBZWVJFQ09WRVJJTkcoKSAoc3NsX2V4cHJfeXllcnJmbGFnIT0wKQotc3RhdGljIGludCBzc2xfZXhwcl95eWdyb3dzdGFjaygpOwotI2RlZmluZSBZWVBSRUZJWCAic3NsX2V4cHJfeXkiCi0jbGluZSA3MiAic3NsX2V4cHJfcGFyc2UueSIKLSNpbmNsdWRlICJtb2Rfc3NsLmgiCi0jbGluZSA3NSAic3NsX2V4cHJfcGFyc2UueSIKLXR5cGVkZWYgdW5pb24gewotICAgIGNoYXIgICAgICpjcFZhbDsKLSAgICBzc2xfZXhwciAqZXhWYWw7Ci19IFlZU1RZUEU7Ci0jbGluZSAyNCAieS50YWIuYyIKLSNkZWZpbmUgWVlFUlJDT0RFIDI1NgotI2RlZmluZSBUX1RSVUUgMjU3Ci0jZGVmaW5lIFRfRkFMU0UgMjU4Ci0jZGVmaW5lIFRfRElHSVQgMjU5Ci0jZGVmaW5lIFRfSUQgMjYwCi0jZGVmaW5lIFRfU1RSSU5HIDI2MQotI2RlZmluZSBUX1JFR0VYIDI2MgotI2RlZmluZSBUX1JFR0VYX0kgMjYzCi0jZGVmaW5lIFRfRlVOQ19GSUxFIDI2NAotI2RlZmluZSBUX09QX0VRIDI2NQotI2RlZmluZSBUX09QX05FIDI2NgotI2RlZmluZSBUX09QX0xUIDI2NwotI2RlZmluZSBUX09QX0xFIDI2OAotI2RlZmluZSBUX09QX0dUIDI2OQotI2RlZmluZSBUX09QX0dFIDI3MAotI2RlZmluZSBUX09QX1JFRyAyNzEKLSNkZWZpbmUgVF9PUF9OUkUgMjcyCi0jZGVmaW5lIFRfT1BfSU4gMjczCi0jZGVmaW5lIFRfT1BfT1IgMjc0Ci0jZGVmaW5lIFRfT1BfQU5EIDI3NQotI2RlZmluZSBUX09QX05PVCAyNzYKLWNvbnN0IHNob3J0IHNzbF9leHByX3l5bGhzW10gPSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLAotICAgIDAsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDIsICAgIDIsCi0gICAgMiwgICAgMiwgICAgMiwgICAgMiwgICAgMiwgICAgMiwgICAgMiwgICAgNSwgICAgNSwgICAgNiwKLSAgICA2LCAgICA2LCAgICA2LCAgICA0LCAgICA0LCAgICAzLAotfTsKLWNvbnN0IHNob3J0IHNzbF9leHByX3l5bGVuW10gPSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAotICAgIDEsICAgIDEsICAgIDEsICAgIDIsICAgIDMsICAgIDMsICAgIDEsICAgIDMsICAgIDMsICAgIDMsCi0gICAgMywgICAgMywgICAgMywgICAgMywgICAgNSwgICAgMywgICAgMywgICAgMSwgICAgMywgICAgMSwKLSAgICAxLCAgICA0LCAgICAxLCAgICAxLCAgICAxLCAgICA0LAotfTsKLWNvbnN0IHNob3J0IHNzbF9leHByX3l5ZGVmcmVkW10gPSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgIDIsICAgIDMsICAgMjAsICAgMjEsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCi0gICAgNywgICAyMywgICAgMCwgICAgMCwgICAgNCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICA4LAotICAgIDAsICAgIDAsICAgIDYsICAgIDksICAgMTAsICAgMTEsICAgMTIsICAgMTMsICAgMTQsICAgMjQsCi0gICAyNSwgICAxNiwgICAxNywgICAgMCwgICAyNiwgICAyMiwgICAgMCwgICAxOCwgICAxNSwgICAgMCwKLSAgIDE5LAotfTsKLWNvbnN0IHNob3J0IHNzbF9leHByX3l5ZGdvdG9bXSA9IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5LAotICAgMTAsICAgMTEsICAgMTIsICAgNDIsICAgNDcsICAgMTMsCi19OwotY29uc3Qgc2hvcnQgc3NsX2V4cHJfeXlzaW5kZXhbXSA9IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMzcsCi0gICAgMCwgICAgMCwgICAgMCwgICAgMCwgIC0zNSwgIC0zNywgIC0zNywgIC05OSwgICAgMCwgLTI0NywKLSAgICAwLCAgICAwLCAtMjUwLCAtMjI5LCAgICAwLCAgLTM5LCAtMjI3LCAgLTM3LCAgLTM3LCAgLTMzLAotICAtMzMsICAtMzMsICAtMzMsICAtMzMsICAtMzMsIC0yMzMsIC0yMzMsICAtODksICAgLTYsICAgIDAsCi0gIC04NywgLTIzOSwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAwLCAgICAwLCAgICAwLCAgLTMzLCAgICAwLCAgICAwLCAgLTM4LCAgICAwLCAgICAwLCAgLTMzLAotICAgIDAsCi19OwotY29uc3Qgc2hvcnQgc3NsX2V4cHJfeXlyaW5kZXhbXSA9IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAzOSwKLSAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAotICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCi0gICAgMCwgICAgMSwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAotICAgIDAsCi19OwotY29uc3Qgc2hvcnQgc3NsX2V4cHJfeXlnaW5kZXhbXSA9IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgNywgICAgMCwgICAgMCwgICAxMywgICAgMCwgIC0xMywKLX07Ci0jZGVmaW5lIFlZVEFCTEVTSVpFIDI3NQotY29uc3Qgc2hvcnQgc3NsX2V4cHJfeXl0YWJsZVtdID0geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCi0gICAgNSwgICAzMCwgICAgNywgICAgOCwgICAxNCwgICA1MCwgICAzNCwgICAzNSwgICAzNiwgICAzNywKLSAgIDM4LCAgIDM5LCAgIDE1LCAgIDE2LCAgIDIwLCAgIDIxLCAgIDIyLCAgIDIzLCAgIDI0LCAgIDI1LAotICAgMjYsICAgMjcsICAgMjgsICAgMTcsICAgMzIsICAgMzMsICAgMTgsICAgMTksICAgNDAsICAgNDEsCi0gICA0OCwgICAyOSwgICAzMSwgICA0NCwgICA0NSwgICAxOSwgICA1MSwgICA0NiwgICAgMSwgICA0MywKLSAgICAwLCAgICA1LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAotICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCi0gICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAotICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgNDksICAgIDAsICAgIDAsICAgIDAsCi0gICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAotICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCi0gICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAotICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCi0gICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAotICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCi0gICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAotICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCi0gICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMSwKLSAgICAyLCAgICAzLCAgICAwLCAgICA0LCAgICAwLCAgICAzLCAgICA1LCAgICA0LCAgICAwLCAgICAwLAotICAgIDUsICAgIDAsICAgIDAsICAgIDAsICAgMTgsICAgMTksICAgIDAsICAgIDAsICAgIDYsICAgIDAsCi0gICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAotICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCi0gICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgNSwKLX07Ci1jb25zdCBzaG9ydCBzc2xfZXhwcl95eWNoZWNrW10gPSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNywKLSAgICAwLCAgIDQxLCAgIDQwLCAgIDM3LCAgIDQwLCAgIDQ0LCAgIDIwLCAgIDIxLCAgIDIyLCAgIDIzLAotICAgMjQsICAgMjUsICAgIDYsICAgIDcsICAyNjUsICAyNjYsICAyNjcsICAyNjgsICAyNjksICAyNzAsCi0gIDI3MSwgIDI3MiwgIDI3MywgIDEyMywgICAxOCwgICAxOSwgIDI3NCwgIDI3NSwgIDI2MiwgIDI2MywKLSAgIDQ0LCAgMjYxLCAgMjYwLCAgMTIzLCAgIDQxLCAgMjc1LCAgIDUwLCAgMTI1LCAgICAwLCAgIDI3LAotICAgLTEsICAgNDEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsCi0gICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwKLSAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLAotICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsCi0gICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgIDEyNSwgICAtMSwgICAtMSwgICAtMSwKLSAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLAotICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsCi0gICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwKLSAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLAotICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsCi0gICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwKLSAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLAotICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsCi0gICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwKLSAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLAotICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsCi0gICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwKLSAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgMjU3LAotICAyNTgsICAyNTksICAgLTEsICAyNjEsICAgLTEsICAyNTksICAyNjQsICAyNjEsICAgLTEsICAgLTEsCi0gIDI2NCwgICAtMSwgICAtMSwgICAtMSwgIDI3NCwgIDI3NSwgICAtMSwgICAtMSwgIDI3NiwgICAtMSwKLSAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLAotICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsCi0gICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwKLSAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgMjc0LAotfTsKLSNkZWZpbmUgWVlGSU5BTCA5Ci0jaWZuZGVmIFlZREVCVUcKLSNkZWZpbmUgWVlERUJVRyAwCi0jZW5kaWYKLSNkZWZpbmUgWVlNQVhUT0tFTiAyNzYKLSNpZiBZWURFQlVHCi1jb25zdCBjaGFyICogY29uc3Qgc3NsX2V4cHJfeXluYW1lW10gPSB7Ci0iZW5kLW9mLWZpbGUiLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotMCwwLDAsIiclJyIsMCwwLCInKCciLCInKSciLDAsMCwiJywnIiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0wLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIid7JyIsMCwiJ30nIiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0wLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIlRfVFJVRSIsCi0iVF9GQUxTRSIsIlRfRElHSVQiLCJUX0lEIiwiVF9TVFJJTkciLCJUX1JFR0VYIiwiVF9SRUdFWF9JIiwiVF9GVU5DX0ZJTEUiLAotIlRfT1BfRVEiLCJUX09QX05FIiwiVF9PUF9MVCIsIlRfT1BfTEUiLCJUX09QX0dUIiwiVF9PUF9HRSIsIlRfT1BfUkVHIiwKLSJUX09QX05SRSIsIlRfT1BfSU4iLCJUX09QX09SIiwiVF9PUF9BTkQiLCJUX09QX05PVCIsCi19OwotY29uc3QgY2hhciAqIGNvbnN0IHNzbF9leHByX3l5cnVsZVtdID0gewotIiRhY2NlcHQgOiByb290IiwKLSJyb290IDogZXhwciIsCi0iZXhwciA6IFRfVFJVRSIsCi0iZXhwciA6IFRfRkFMU0UiLAotImV4cHIgOiBUX09QX05PVCBleHByIiwKLSJleHByIDogZXhwciBUX09QX09SIGV4cHIiLAotImV4cHIgOiBleHByIFRfT1BfQU5EIGV4cHIiLAotImV4cHIgOiBjb21wYXJpc29uIiwKLSJleHByIDogJygnIGV4cHIgJyknIiwKLSJjb21wYXJpc29uIDogd29yZCBUX09QX0VRIHdvcmQiLAotImNvbXBhcmlzb24gOiB3b3JkIFRfT1BfTkUgd29yZCIsCi0iY29tcGFyaXNvbiA6IHdvcmQgVF9PUF9MVCB3b3JkIiwKLSJjb21wYXJpc29uIDogd29yZCBUX09QX0xFIHdvcmQiLAotImNvbXBhcmlzb24gOiB3b3JkIFRfT1BfR1Qgd29yZCIsCi0iY29tcGFyaXNvbiA6IHdvcmQgVF9PUF9HRSB3b3JkIiwKLSJjb21wYXJpc29uIDogd29yZCBUX09QX0lOICd7JyB3b3JkcyAnfSciLAotImNvbXBhcmlzb24gOiB3b3JkIFRfT1BfUkVHIHJlZ2V4IiwKLSJjb21wYXJpc29uIDogd29yZCBUX09QX05SRSByZWdleCIsCi0id29yZHMgOiB3b3JkIiwKLSJ3b3JkcyA6IHdvcmRzICcsJyB3b3JkIiwKLSJ3b3JkIDogVF9ESUdJVCIsCi0id29yZCA6IFRfU1RSSU5HIiwKLSJ3b3JkIDogJyUnICd7JyBUX0lEICd9JyIsCi0id29yZCA6IGZ1bmNjYWxsIiwKLSJyZWdleCA6IFRfUkVHRVgiLAotInJlZ2V4IDogVF9SRUdFWF9JIiwKLSJmdW5jY2FsbCA6IFRfRlVOQ19GSUxFICcoJyBUX1NUUklORyAnKSciLAotfTsKLSNlbmRpZgotI2lmIFlZREVCVUcKLSNpbmNsdWRlIDxzdGRpby5oPgotI2VuZGlmCi0jaWZkZWYgWVlTVEFDS1NJWkUKLSN1bmRlZiBZWU1BWERFUFRICi0jZGVmaW5lIFlZTUFYREVQVEggWVlTVEFDS1NJWkUKLSNlbHNlCi0jaWZkZWYgWVlNQVhERVBUSAotI2RlZmluZSBZWVNUQUNLU0laRSBZWU1BWERFUFRICi0jZWxzZQotI2RlZmluZSBZWVNUQUNLU0laRSAxMDAwMAotI2RlZmluZSBZWU1BWERFUFRIIDEwMDAwCi0jZW5kaWYKLSNlbmRpZgotI2RlZmluZSBZWUlOSVRTVEFDS1NJWkUgMjAwCi1pbnQgc3NsX2V4cHJfeXlkZWJ1ZzsKLWludCBzc2xfZXhwcl95eW5lcnJzOwotaW50IHNzbF9leHByX3l5ZXJyZmxhZzsKLWludCBzc2xfZXhwcl95eWNoYXI7Ci1zaG9ydCAqc3NsX2V4cHJfeXlzc3A7Ci1ZWVNUWVBFICpzc2xfZXhwcl95eXZzcDsKLVlZU1RZUEUgc3NsX2V4cHJfeXl2YWw7Ci1ZWVNUWVBFIHNzbF9leHByX3l5bHZhbDsKLXNob3J0ICpzc2xfZXhwcl95eXNzOwotc2hvcnQgKnNzbF9leHByX3l5c3NsaW07Ci1ZWVNUWVBFICpzc2xfZXhwcl95eXZzOwotaW50IHNzbF9leHByX3l5c3RhY2tzaXplOwotI2xpbmUgMTgwICJzc2xfZXhwcl9wYXJzZS55IgotCi1pbnQgc3NsX2V4cHJfeXllcnJvcihjaGFyICpzKQotewotICAgIHNzbF9leHByX2Vycm9yID0gczsKLSAgICByZXR1cm4gMjsKLX0KLQotI2xpbmUgMjMwICJ5LnRhYi5jIgotLyogYWxsb2NhdGUgaW5pdGlhbCBzdGFjayBvciBkb3VibGUgc3RhY2sgc2l6ZSwgdXAgdG8gWVlNQVhERVBUSCAqLwotc3RhdGljIGludCBzc2xfZXhwcl95eWdyb3dzdGFjaygpCi17Ci0gICAgaW50IG5ld3NpemUsIGk7Ci0gICAgc2hvcnQgKm5ld3NzOwotICAgIFlZU1RZUEUgKm5ld3ZzOwotCi0gICAgaWYgKChuZXdzaXplID0gc3NsX2V4cHJfeXlzdGFja3NpemUpID09IDApCi0gICAgICAgIG5ld3NpemUgPSBZWUlOSVRTVEFDS1NJWkU7Ci0gICAgZWxzZSBpZiAobmV3c2l6ZSA+PSBZWU1BWERFUFRIKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgZWxzZSBpZiAoKG5ld3NpemUgKj0gMikgPiBZWU1BWERFUFRIKQotICAgICAgICBuZXdzaXplID0gWVlNQVhERVBUSDsKLSAgICBpID0gc3NsX2V4cHJfeXlzc3AgLSBzc2xfZXhwcl95eXNzOwotICAgIG5ld3NzID0gc3NsX2V4cHJfeXlzcyA/IChzaG9ydCAqKXJlYWxsb2Moc3NsX2V4cHJfeXlzcywgbmV3c2l6ZSAqIHNpemVvZiAqbmV3c3MpIDoKLSAgICAgIChzaG9ydCAqKW1hbGxvYyhuZXdzaXplICogc2l6ZW9mICpuZXdzcyk7Ci0gICAgaWYgKG5ld3NzID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBzc2xfZXhwcl95eXNzID0gbmV3c3M7Ci0gICAgc3NsX2V4cHJfeXlzc3AgPSBuZXdzcyArIGk7Ci0gICAgbmV3dnMgPSBzc2xfZXhwcl95eXZzID8gKFlZU1RZUEUgKilyZWFsbG9jKHNzbF9leHByX3l5dnMsIG5ld3NpemUgKiBzaXplb2YgKm5ld3ZzKSA6Ci0gICAgICAoWVlTVFlQRSAqKW1hbGxvYyhuZXdzaXplICogc2l6ZW9mICpuZXd2cyk7Ci0gICAgaWYgKG5ld3ZzID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBzc2xfZXhwcl95eXZzID0gbmV3dnM7Ci0gICAgc3NsX2V4cHJfeXl2c3AgPSBuZXd2cyArIGk7Ci0gICAgc3NsX2V4cHJfeXlzdGFja3NpemUgPSBuZXdzaXplOwotICAgIHNzbF9leHByX3l5c3NsaW0gPSBzc2xfZXhwcl95eXNzICsgbmV3c2l6ZSAtIDE7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgWVlBQk9SVCBnb3RvIHNzbF9leHByX3l5YWJvcnQKLSNkZWZpbmUgWVlSRUpFQ1QgZ290byBzc2xfZXhwcl95eWFib3J0Ci0jZGVmaW5lIFlZQUNDRVBUIGdvdG8gc3NsX2V4cHJfeXlhY2NlcHQKLSNkZWZpbmUgWVlFUlJPUiBnb3RvIHNzbF9leHByX3l5ZXJybGFiCi0KLSNpZm5kZWYgWVlQQVJTRV9QQVJBTQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IF9fU1REQ19fCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHIHZvaWQKLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMCi0jZWxzZQkvKiAhIEFOU0ktQy9DKysgKi8KLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9BUkcKLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMCi0jZW5kaWYJLyogQU5TSS1DL0MrKyAqLwotI2Vsc2UJLyogWVlQQVJTRV9QQVJBTSAqLwotI2lmbmRlZiBZWVBBUlNFX1BBUkFNX1RZUEUKLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9UWVBFIHZvaWQgKgotI2VuZGlmCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgX19TVERDX18KLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9BUkcgWVlQQVJTRV9QQVJBTV9UWVBFIFlZUEFSU0VfUEFSQU0KLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMCi0jZWxzZQkvKiAhIEFOU0ktQy9DKysgKi8KLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9BUkcgWVlQQVJTRV9QQVJBTQotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0RFQ0wgWVlQQVJTRV9QQVJBTV9UWVBFIFlZUEFSU0VfUEFSQU07Ci0jZW5kaWYJLyogQU5TSS1DL0MrKyAqLwotI2VuZGlmCS8qICEgWVlQQVJTRV9QQVJBTSAqLwotCi1pbnQKLXNzbF9leHByX3l5cGFyc2UgKFlZUEFSU0VfUEFSQU1fQVJHKQotICAgIFlZUEFSU0VfUEFSQU1fREVDTAotewotICAgIHJlZ2lzdGVyIGludCBzc2xfZXhwcl95eW0sIHNzbF9leHByX3l5biwgc3NsX2V4cHJfeXlzdGF0ZTsKLSNpZiBZWURFQlVHCi0gICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqc3NsX2V4cHJfeXlzOwotCi0gICAgaWYgKChzc2xfZXhwcl95eXMgPSBnZXRlbnYoIllZREVCVUciKSkpCi0gICAgewotICAgICAgICBzc2xfZXhwcl95eW4gPSAqc3NsX2V4cHJfeXlzOwotICAgICAgICBpZiAoc3NsX2V4cHJfeXluID49ICcwJyAmJiBzc2xfZXhwcl95eW4gPD0gJzknKQotICAgICAgICAgICAgc3NsX2V4cHJfeXlkZWJ1ZyA9IHNzbF9leHByX3l5biAtICcwJzsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHNzbF9leHByX3l5bmVycnMgPSAwOwotICAgIHNzbF9leHByX3l5ZXJyZmxhZyA9IDA7Ci0gICAgc3NsX2V4cHJfeXljaGFyID0gKC0xKTsKLQotICAgIGlmIChzc2xfZXhwcl95eXNzID09IE5VTEwgJiYgc3NsX2V4cHJfeXlncm93c3RhY2soKSkgZ290byBzc2xfZXhwcl95eW92ZXJmbG93OwotICAgIHNzbF9leHByX3l5c3NwID0gc3NsX2V4cHJfeXlzczsKLSAgICBzc2xfZXhwcl95eXZzcCA9IHNzbF9leHByX3l5dnM7Ci0gICAgKnNzbF9leHByX3l5c3NwID0gc3NsX2V4cHJfeXlzdGF0ZSA9IDA7Ci0KLXNzbF9leHByX3l5bG9vcDoKLSAgICBpZiAoKHNzbF9leHByX3l5biA9IHNzbF9leHByX3l5ZGVmcmVkW3NzbF9leHByX3l5c3RhdGVdKSkgZ290byBzc2xfZXhwcl95eXJlZHVjZTsKLSAgICBpZiAoc3NsX2V4cHJfeXljaGFyIDwgMCkKLSAgICB7Ci0gICAgICAgIGlmICgoc3NsX2V4cHJfeXljaGFyID0gc3NsX2V4cHJfeXlsZXgoKSkgPCAwKSBzc2xfZXhwcl95eWNoYXIgPSAwOwotI2lmIFlZREVCVUcKLSAgICAgICAgaWYgKHNzbF9leHByX3l5ZGVidWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzbF9leHByX3l5cyA9IDA7Ci0gICAgICAgICAgICBpZiAoc3NsX2V4cHJfeXljaGFyIDw9IFlZTUFYVE9LRU4pIHNzbF9leHByX3l5cyA9IHNzbF9leHByX3l5bmFtZVtzc2xfZXhwcl95eWNoYXJdOwotICAgICAgICAgICAgaWYgKCFzc2xfZXhwcl95eXMpIHNzbF9leHByX3l5cyA9ICJpbGxlZ2FsLXN5bWJvbCI7Ci0gICAgICAgICAgICBwcmludGYoIiVzZGVidWc6IHN0YXRlICVkLCByZWFkaW5nICVkICglcylcbiIsCi0gICAgICAgICAgICAgICAgICAgIFlZUFJFRklYLCBzc2xfZXhwcl95eXN0YXRlLCBzc2xfZXhwcl95eWNoYXIsIHNzbF9leHByX3l5cyk7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgIH0KLSAgICBpZiAoKHNzbF9leHByX3l5biA9IHNzbF9leHByX3l5c2luZGV4W3NzbF9leHByX3l5c3RhdGVdKSAmJiAoc3NsX2V4cHJfeXluICs9IHNzbF9leHByX3l5Y2hhcikgPj0gMCAmJgotICAgICAgICAgICAgc3NsX2V4cHJfeXluIDw9IFlZVEFCTEVTSVpFICYmIHNzbF9leHByX3l5Y2hlY2tbc3NsX2V4cHJfeXluXSA9PSBzc2xfZXhwcl95eWNoYXIpCi0gICAgewotI2lmIFlZREVCVUcKLSAgICAgICAgaWYgKHNzbF9leHByX3l5ZGVidWcpCi0gICAgICAgICAgICBwcmludGYoIiVzZGVidWc6IHN0YXRlICVkLCBzaGlmdGluZyB0byBzdGF0ZSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgWVlQUkVGSVgsIHNzbF9leHByX3l5c3RhdGUsIHNzbF9leHByX3l5dGFibGVbc3NsX2V4cHJfeXluXSk7Ci0jZW5kaWYKLSAgICAgICAgaWYgKHNzbF9leHByX3l5c3NwID49IHNzbF9leHByX3l5c3NsaW0gJiYgc3NsX2V4cHJfeXlncm93c3RhY2soKSkKLSAgICAgICAgewotICAgICAgICAgICAgZ290byBzc2xfZXhwcl95eW92ZXJmbG93OwotICAgICAgICB9Ci0gICAgICAgICorK3NzbF9leHByX3l5c3NwID0gc3NsX2V4cHJfeXlzdGF0ZSA9IHNzbF9leHByX3l5dGFibGVbc3NsX2V4cHJfeXluXTsKLSAgICAgICAgKisrc3NsX2V4cHJfeXl2c3AgPSBzc2xfZXhwcl95eWx2YWw7Ci0gICAgICAgIHNzbF9leHByX3l5Y2hhciA9ICgtMSk7Ci0gICAgICAgIGlmIChzc2xfZXhwcl95eWVycmZsYWcgPiAwKSAgLS1zc2xfZXhwcl95eWVycmZsYWc7Ci0gICAgICAgIGdvdG8gc3NsX2V4cHJfeXlsb29wOwotICAgIH0KLSAgICBpZiAoKHNzbF9leHByX3l5biA9IHNzbF9leHByX3l5cmluZGV4W3NzbF9leHByX3l5c3RhdGVdKSAmJiAoc3NsX2V4cHJfeXluICs9IHNzbF9leHByX3l5Y2hhcikgPj0gMCAmJgotICAgICAgICAgICAgc3NsX2V4cHJfeXluIDw9IFlZVEFCTEVTSVpFICYmIHNzbF9leHByX3l5Y2hlY2tbc3NsX2V4cHJfeXluXSA9PSBzc2xfZXhwcl95eWNoYXIpCi0gICAgewotICAgICAgICBzc2xfZXhwcl95eW4gPSBzc2xfZXhwcl95eXRhYmxlW3NzbF9leHByX3l5bl07Ci0gICAgICAgIGdvdG8gc3NsX2V4cHJfeXlyZWR1Y2U7Ci0gICAgfQotICAgIGlmIChzc2xfZXhwcl95eWVycmZsYWcpIGdvdG8gc3NsX2V4cHJfeXlpbnJlY292ZXJ5OwotI2lmIGRlZmluZWQobGludCkgfHwgZGVmaW5lZChfX0dOVUNfXykKLSAgICBnb3RvIHNzbF9leHByX3l5bmV3ZXJyb3I7Ci0jZW5kaWYKLXNzbF9leHByX3l5bmV3ZXJyb3I6Ci0gICAgc3NsX2V4cHJfeXllcnJvcigic3ludGF4IGVycm9yIik7Ci0jaWYgZGVmaW5lZChsaW50KSB8fCBkZWZpbmVkKF9fR05VQ19fKQotICAgIGdvdG8gc3NsX2V4cHJfeXllcnJsYWI7Ci0jZW5kaWYKLXNzbF9leHByX3l5ZXJybGFiOgotICAgICsrc3NsX2V4cHJfeXluZXJyczsKLXNzbF9leHByX3l5aW5yZWNvdmVyeToKLSAgICBpZiAoc3NsX2V4cHJfeXllcnJmbGFnIDwgMykKLSAgICB7Ci0gICAgICAgIHNzbF9leHByX3l5ZXJyZmxhZyA9IDM7Ci0gICAgICAgIGZvciAoOzspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoc3NsX2V4cHJfeXluID0gc3NsX2V4cHJfeXlzaW5kZXhbKnNzbF9leHByX3l5c3NwXSkgJiYgKHNzbF9leHByX3l5biArPSBZWUVSUkNPREUpID49IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgc3NsX2V4cHJfeXluIDw9IFlZVEFCTEVTSVpFICYmIHNzbF9leHByX3l5Y2hlY2tbc3NsX2V4cHJfeXluXSA9PSBZWUVSUkNPREUpCi0gICAgICAgICAgICB7Ci0jaWYgWVlERUJVRwotICAgICAgICAgICAgICAgIGlmIChzc2xfZXhwcl95eWRlYnVnKQotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzZGVidWc6IHN0YXRlICVkLCBlcnJvciByZWNvdmVyeSBzaGlmdGluZ1wKLSB0byBzdGF0ZSAlZFxuIiwgWVlQUkVGSVgsICpzc2xfZXhwcl95eXNzcCwgc3NsX2V4cHJfeXl0YWJsZVtzc2xfZXhwcl95eW5dKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIGlmIChzc2xfZXhwcl95eXNzcCA+PSBzc2xfZXhwcl95eXNzbGltICYmIHNzbF9leHByX3l5Z3Jvd3N0YWNrKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBnb3RvIHNzbF9leHByX3l5b3ZlcmZsb3c7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICorK3NzbF9leHByX3l5c3NwID0gc3NsX2V4cHJfeXlzdGF0ZSA9IHNzbF9leHByX3l5dGFibGVbc3NsX2V4cHJfeXluXTsKLSAgICAgICAgICAgICAgICAqKytzc2xfZXhwcl95eXZzcCA9IHNzbF9leHByX3l5bHZhbDsKLSAgICAgICAgICAgICAgICBnb3RvIHNzbF9leHByX3l5bG9vcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSNpZiBZWURFQlVHCi0gICAgICAgICAgICAgICAgaWYgKHNzbF9leHByX3l5ZGVidWcpCi0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXNkZWJ1ZzogZXJyb3IgcmVjb3ZlcnkgZGlzY2FyZGluZyBzdGF0ZSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBZWVBSRUZJWCwgKnNzbF9leHByX3l5c3NwKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIGlmIChzc2xfZXhwcl95eXNzcCA8PSBzc2xfZXhwcl95eXNzKSBnb3RvIHNzbF9leHByX3l5YWJvcnQ7Ci0gICAgICAgICAgICAgICAgLS1zc2xfZXhwcl95eXNzcDsKLSAgICAgICAgICAgICAgICAtLXNzbF9leHByX3l5dnNwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChzc2xfZXhwcl95eWNoYXIgPT0gMCkgZ290byBzc2xfZXhwcl95eWFib3J0OwotI2lmIFlZREVCVUcKLSAgICAgICAgaWYgKHNzbF9leHByX3l5ZGVidWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzbF9leHByX3l5cyA9IDA7Ci0gICAgICAgICAgICBpZiAoc3NsX2V4cHJfeXljaGFyIDw9IFlZTUFYVE9LRU4pIHNzbF9leHByX3l5cyA9IHNzbF9leHByX3l5bmFtZVtzc2xfZXhwcl95eWNoYXJdOwotICAgICAgICAgICAgaWYgKCFzc2xfZXhwcl95eXMpIHNzbF9leHByX3l5cyA9ICJpbGxlZ2FsLXN5bWJvbCI7Ci0gICAgICAgICAgICBwcmludGYoIiVzZGVidWc6IHN0YXRlICVkLCBlcnJvciByZWNvdmVyeSBkaXNjYXJkcyB0b2tlbiAlZCAoJXMpXG4iLAotICAgICAgICAgICAgICAgICAgICBZWVBSRUZJWCwgc3NsX2V4cHJfeXlzdGF0ZSwgc3NsX2V4cHJfeXljaGFyLCBzc2xfZXhwcl95eXMpOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgc3NsX2V4cHJfeXljaGFyID0gKC0xKTsKLSAgICAgICAgZ290byBzc2xfZXhwcl95eWxvb3A7Ci0gICAgfQotc3NsX2V4cHJfeXlyZWR1Y2U6Ci0jaWYgWVlERUJVRwotICAgIGlmIChzc2xfZXhwcl95eWRlYnVnKQotICAgICAgICBwcmludGYoIiVzZGVidWc6IHN0YXRlICVkLCByZWR1Y2luZyBieSBydWxlICVkICglcylcbiIsCi0gICAgICAgICAgICAgICAgWVlQUkVGSVgsIHNzbF9leHByX3l5c3RhdGUsIHNzbF9leHByX3l5biwgc3NsX2V4cHJfeXlydWxlW3NzbF9leHByX3l5bl0pOwotI2VuZGlmCi0gICAgc3NsX2V4cHJfeXltID0gc3NsX2V4cHJfeXlsZW5bc3NsX2V4cHJfeXluXTsKLSAgICBzc2xfZXhwcl95eXZhbCA9IHNzbF9leHByX3l5dnNwWzEtc3NsX2V4cHJfeXltXTsKLSAgICBzd2l0Y2ggKHNzbF9leHByX3l5bikKLSAgICB7Ci1jYXNlIDE6Ci0jbGluZSAxMTggInNzbF9leHByX3BhcnNlLnkiCi17IHNzbF9leHByX2luZm8uZXhwciA9IHNzbF9leHByX3l5dnNwWzBdLmV4VmFsOyB9Ci1icmVhazsKLWNhc2UgMjoKLSNsaW5lIDEyMSAic3NsX2V4cHJfcGFyc2UueSIKLXsgc3NsX2V4cHJfeXl2YWwuZXhWYWwgPSBzc2xfZXhwcl9tYWtlKG9wX1RydWUsICBOVUxMLCBOVUxMKTsgfQotYnJlYWs7Ci1jYXNlIDM6Ci0jbGluZSAxMjIgInNzbF9leHByX3BhcnNlLnkiCi17IHNzbF9leHByX3l5dmFsLmV4VmFsID0gc3NsX2V4cHJfbWFrZShvcF9GYWxzZSwgTlVMTCwgTlVMTCk7IH0KLWJyZWFrOwotY2FzZSA0OgotI2xpbmUgMTIzICJzc2xfZXhwcl9wYXJzZS55IgoteyBzc2xfZXhwcl95eXZhbC5leFZhbCA9IHNzbF9leHByX21ha2Uob3BfTm90LCAgIHNzbF9leHByX3l5dnNwWzBdLmV4VmFsLCAgIE5VTEwpOyB9Ci1icmVhazsKLWNhc2UgNToKLSNsaW5lIDEyNCAic3NsX2V4cHJfcGFyc2UueSIKLXsgc3NsX2V4cHJfeXl2YWwuZXhWYWwgPSBzc2xfZXhwcl9tYWtlKG9wX09yLCAgICBzc2xfZXhwcl95eXZzcFstMl0uZXhWYWwsICAgc3NsX2V4cHJfeXl2c3BbMF0uZXhWYWwpOyAgIH0KLWJyZWFrOwotY2FzZSA2OgotI2xpbmUgMTI1ICJzc2xfZXhwcl9wYXJzZS55IgoteyBzc2xfZXhwcl95eXZhbC5leFZhbCA9IHNzbF9leHByX21ha2Uob3BfQW5kLCAgIHNzbF9leHByX3l5dnNwWy0yXS5leFZhbCwgICBzc2xfZXhwcl95eXZzcFswXS5leFZhbCk7ICAgfQotYnJlYWs7Ci1jYXNlIDc6Ci0jbGluZSAxMjYgInNzbF9leHByX3BhcnNlLnkiCi17IHNzbF9leHByX3l5dmFsLmV4VmFsID0gc3NsX2V4cHJfbWFrZShvcF9Db21wLCAgc3NsX2V4cHJfeXl2c3BbMF0uZXhWYWwsICAgTlVMTCk7IH0KLWJyZWFrOwotY2FzZSA4OgotI2xpbmUgMTI3ICJzc2xfZXhwcl9wYXJzZS55IgoteyBzc2xfZXhwcl95eXZhbC5leFZhbCA9IHNzbF9leHByX3l5dnNwWy0xXS5leFZhbDsgfQotYnJlYWs7Ci1jYXNlIDk6Ci0jbGluZSAxMzAgInNzbF9leHByX3BhcnNlLnkiCi17IHNzbF9leHByX3l5dmFsLmV4VmFsID0gc3NsX2V4cHJfbWFrZShvcF9FUSwgIHNzbF9leHByX3l5dnNwWy0yXS5leFZhbCwgc3NsX2V4cHJfeXl2c3BbMF0uZXhWYWwpOyB9Ci1icmVhazsKLWNhc2UgMTA6Ci0jbGluZSAxMzEgInNzbF9leHByX3BhcnNlLnkiCi17IHNzbF9leHByX3l5dmFsLmV4VmFsID0gc3NsX2V4cHJfbWFrZShvcF9ORSwgIHNzbF9leHByX3l5dnNwWy0yXS5leFZhbCwgc3NsX2V4cHJfeXl2c3BbMF0uZXhWYWwpOyB9Ci1icmVhazsKLWNhc2UgMTE6Ci0jbGluZSAxMzIgInNzbF9leHByX3BhcnNlLnkiCi17IHNzbF9leHByX3l5dmFsLmV4VmFsID0gc3NsX2V4cHJfbWFrZShvcF9MVCwgIHNzbF9leHByX3l5dnNwWy0yXS5leFZhbCwgc3NsX2V4cHJfeXl2c3BbMF0uZXhWYWwpOyB9Ci1icmVhazsKLWNhc2UgMTI6Ci0jbGluZSAxMzMgInNzbF9leHByX3BhcnNlLnkiCi17IHNzbF9leHByX3l5dmFsLmV4VmFsID0gc3NsX2V4cHJfbWFrZShvcF9MRSwgIHNzbF9leHByX3l5dnNwWy0yXS5leFZhbCwgc3NsX2V4cHJfeXl2c3BbMF0uZXhWYWwpOyB9Ci1icmVhazsKLWNhc2UgMTM6Ci0jbGluZSAxMzQgInNzbF9leHByX3BhcnNlLnkiCi17IHNzbF9leHByX3l5dmFsLmV4VmFsID0gc3NsX2V4cHJfbWFrZShvcF9HVCwgIHNzbF9leHByX3l5dnNwWy0yXS5leFZhbCwgc3NsX2V4cHJfeXl2c3BbMF0uZXhWYWwpOyB9Ci1icmVhazsKLWNhc2UgMTQ6Ci0jbGluZSAxMzUgInNzbF9leHByX3BhcnNlLnkiCi17IHNzbF9leHByX3l5dmFsLmV4VmFsID0gc3NsX2V4cHJfbWFrZShvcF9HRSwgIHNzbF9leHByX3l5dnNwWy0yXS5leFZhbCwgc3NsX2V4cHJfeXl2c3BbMF0uZXhWYWwpOyB9Ci1icmVhazsKLWNhc2UgMTU6Ci0jbGluZSAxMzYgInNzbF9leHByX3BhcnNlLnkiCi17IHNzbF9leHByX3l5dmFsLmV4VmFsID0gc3NsX2V4cHJfbWFrZShvcF9JTiwgIHNzbF9leHByX3l5dnNwWy00XS5leFZhbCwgc3NsX2V4cHJfeXl2c3BbLTFdLmV4VmFsKTsgfQotYnJlYWs7Ci1jYXNlIDE2OgotI2xpbmUgMTM3ICJzc2xfZXhwcl9wYXJzZS55IgoteyBzc2xfZXhwcl95eXZhbC5leFZhbCA9IHNzbF9leHByX21ha2Uob3BfUkVHLCBzc2xfZXhwcl95eXZzcFstMl0uZXhWYWwsIHNzbF9leHByX3l5dnNwWzBdLmV4VmFsKTsgfQotYnJlYWs7Ci1jYXNlIDE3OgotI2xpbmUgMTM4ICJzc2xfZXhwcl9wYXJzZS55IgoteyBzc2xfZXhwcl95eXZhbC5leFZhbCA9IHNzbF9leHByX21ha2Uob3BfTlJFLCBzc2xfZXhwcl95eXZzcFstMl0uZXhWYWwsIHNzbF9leHByX3l5dnNwWzBdLmV4VmFsKTsgfQotYnJlYWs7Ci1jYXNlIDE4OgotI2xpbmUgMTQxICJzc2xfZXhwcl9wYXJzZS55IgoteyBzc2xfZXhwcl95eXZhbC5leFZhbCA9IHNzbF9leHByX21ha2Uob3BfTGlzdEVsZW1lbnQsIHNzbF9leHByX3l5dnNwWzBdLmV4VmFsLCBOVUxMKTsgfQotYnJlYWs7Ci1jYXNlIDE5OgotI2xpbmUgMTQyICJzc2xfZXhwcl9wYXJzZS55IgoteyBzc2xfZXhwcl95eXZhbC5leFZhbCA9IHNzbF9leHByX21ha2Uob3BfTGlzdEVsZW1lbnQsIHNzbF9leHByX3l5dnNwWzBdLmV4VmFsLCBzc2xfZXhwcl95eXZzcFstMl0uZXhWYWwpOyAgIH0KLWJyZWFrOwotY2FzZSAyMDoKLSNsaW5lIDE0NSAic3NsX2V4cHJfcGFyc2UueSIKLXsgc3NsX2V4cHJfeXl2YWwuZXhWYWwgPSBzc2xfZXhwcl9tYWtlKG9wX0RpZ2l0LCAgc3NsX2V4cHJfeXl2c3BbMF0uY3BWYWwsIE5VTEwpOyB9Ci1icmVhazsKLWNhc2UgMjE6Ci0jbGluZSAxNDYgInNzbF9leHByX3BhcnNlLnkiCi17IHNzbF9leHByX3l5dmFsLmV4VmFsID0gc3NsX2V4cHJfbWFrZShvcF9TdHJpbmcsIHNzbF9leHByX3l5dnNwWzBdLmNwVmFsLCBOVUxMKTsgfQotYnJlYWs7Ci1jYXNlIDIyOgotI2xpbmUgMTQ3ICJzc2xfZXhwcl9wYXJzZS55IgoteyBzc2xfZXhwcl95eXZhbC5leFZhbCA9IHNzbF9leHByX21ha2Uob3BfVmFyLCAgICBzc2xfZXhwcl95eXZzcFstMV0uY3BWYWwsIE5VTEwpOyB9Ci1icmVhazsKLWNhc2UgMjM6Ci0jbGluZSAxNDggInNzbF9leHByX3BhcnNlLnkiCi17IHNzbF9leHByX3l5dmFsLmV4VmFsID0gc3NsX2V4cHJfeXl2c3BbMF0uZXhWYWw7IH0KLWJyZWFrOwotY2FzZSAyNDoKLSNsaW5lIDE1MSAic3NsX2V4cHJfcGFyc2UueSIKLXsgCi0gICAgICAgICAgICAgICAgcmVnZXhfdCAqcmVnZXg7Ci0gICAgICAgICAgICAgICAgaWYgKChyZWdleCA9IGFwX3ByZWdjb21wKHNzbF9leHByX2luZm8ucG9vbCwgc3NsX2V4cHJfeXl2c3BbMF0uY3BWYWwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfRVhURU5ERUR8UkVHX05PU1VCKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBzc2xfZXhwcl9lcnJvciA9ICJGYWlsZWQgdG8gY29tcGlsZSByZWd1bGFyIGV4cHJlc3Npb24iOwotICAgICAgICAgICAgICAgICAgICBZWUVSUk9SOwotICAgICAgICAgICAgICAgICAgICByZWdleCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNzbF9leHByX3l5dmFsLmV4VmFsID0gc3NsX2V4cHJfbWFrZShvcF9SZWdleCwgcmVnZXgsIE5VTEwpOwotICAgICAgICAgICAgfQotYnJlYWs7Ci1jYXNlIDI1OgotI2xpbmUgMTYxICJzc2xfZXhwcl9wYXJzZS55IgotewotICAgICAgICAgICAgICAgIHJlZ2V4X3QgKnJlZ2V4OwotICAgICAgICAgICAgICAgIGlmICgocmVnZXggPSBhcF9wcmVnY29tcChzc2xfZXhwcl9pbmZvLnBvb2wsIHNzbF9leHByX3l5dnNwWzBdLmNwVmFsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX0VYVEVOREVEfFJFR19OT1NVQnxSRUdfSUNBU0UpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNzbF9leHByX2Vycm9yID0gIkZhaWxlZCB0byBjb21waWxlIHJlZ3VsYXIgZXhwcmVzc2lvbiI7Ci0gICAgICAgICAgICAgICAgICAgIFlZRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2V4ID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3NsX2V4cHJfeXl2YWwuZXhWYWwgPSBzc2xfZXhwcl9tYWtlKG9wX1JlZ2V4LCByZWdleCwgTlVMTCk7Ci0gICAgICAgICAgICB9Ci1icmVhazsKLWNhc2UgMjY6Ci0jbGluZSAxNzMgInNzbF9leHByX3BhcnNlLnkiCi17IAotICAgICAgICAgICAgICAgc3NsX2V4cHIgKmFyZ3MgPSBzc2xfZXhwcl9tYWtlKG9wX0xpc3RFbGVtZW50LCBzc2xfZXhwcl95eXZzcFstMV0uY3BWYWwsIE5VTEwpOwotICAgICAgICAgICAgICAgc3NsX2V4cHJfeXl2YWwuZXhWYWwgPSBzc2xfZXhwcl9tYWtlKG9wX0Z1bmMsICJmaWxlIiwgYXJncyk7Ci0gICAgICAgICAgICB9Ci1icmVhazsKLSNsaW5lIDU1MCAieS50YWIuYyIKLSAgICB9Ci0gICAgc3NsX2V4cHJfeXlzc3AgLT0gc3NsX2V4cHJfeXltOwotICAgIHNzbF9leHByX3l5c3RhdGUgPSAqc3NsX2V4cHJfeXlzc3A7Ci0gICAgc3NsX2V4cHJfeXl2c3AgLT0gc3NsX2V4cHJfeXltOwotICAgIHNzbF9leHByX3l5bSA9IHNzbF9leHByX3l5bGhzW3NzbF9leHByX3l5bl07Ci0gICAgaWYgKHNzbF9leHByX3l5c3RhdGUgPT0gMCAmJiBzc2xfZXhwcl95eW0gPT0gMCkKLSAgICB7Ci0jaWYgWVlERUJVRwotICAgICAgICBpZiAoc3NsX2V4cHJfeXlkZWJ1ZykKLSAgICAgICAgICAgIHByaW50ZigiJXNkZWJ1ZzogYWZ0ZXIgcmVkdWN0aW9uLCBzaGlmdGluZyBmcm9tIHN0YXRlIDAgdG9cCi0gc3RhdGUgJWRcbiIsIFlZUFJFRklYLCBZWUZJTkFMKTsKLSNlbmRpZgotICAgICAgICBzc2xfZXhwcl95eXN0YXRlID0gWVlGSU5BTDsKLSAgICAgICAgKisrc3NsX2V4cHJfeXlzc3AgPSBZWUZJTkFMOwotICAgICAgICAqKytzc2xfZXhwcl95eXZzcCA9IHNzbF9leHByX3l5dmFsOwotICAgICAgICBpZiAoc3NsX2V4cHJfeXljaGFyIDwgMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChzc2xfZXhwcl95eWNoYXIgPSBzc2xfZXhwcl95eWxleCgpKSA8IDApIHNzbF9leHByX3l5Y2hhciA9IDA7Ci0jaWYgWVlERUJVRwotICAgICAgICAgICAgaWYgKHNzbF9leHByX3l5ZGVidWcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3NsX2V4cHJfeXlzID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoc3NsX2V4cHJfeXljaGFyIDw9IFlZTUFYVE9LRU4pIHNzbF9leHByX3l5cyA9IHNzbF9leHByX3l5bmFtZVtzc2xfZXhwcl95eWNoYXJdOwotICAgICAgICAgICAgICAgIGlmICghc3NsX2V4cHJfeXlzKSBzc2xfZXhwcl95eXMgPSAiaWxsZWdhbC1zeW1ib2wiOwotICAgICAgICAgICAgICAgIHByaW50ZigiJXNkZWJ1Zzogc3RhdGUgJWQsIHJlYWRpbmcgJWQgKCVzKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFlZUFJFRklYLCBZWUZJTkFMLCBzc2xfZXhwcl95eWNoYXIsIHNzbF9leHByX3l5cyk7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgfQotICAgICAgICBpZiAoc3NsX2V4cHJfeXljaGFyID09IDApIGdvdG8gc3NsX2V4cHJfeXlhY2NlcHQ7Ci0gICAgICAgIGdvdG8gc3NsX2V4cHJfeXlsb29wOwotICAgIH0KLSAgICBpZiAoKHNzbF9leHByX3l5biA9IHNzbF9leHByX3l5Z2luZGV4W3NzbF9leHByX3l5bV0pICYmIChzc2xfZXhwcl95eW4gKz0gc3NsX2V4cHJfeXlzdGF0ZSkgPj0gMCAmJgotICAgICAgICAgICAgc3NsX2V4cHJfeXluIDw9IFlZVEFCTEVTSVpFICYmIHNzbF9leHByX3l5Y2hlY2tbc3NsX2V4cHJfeXluXSA9PSBzc2xfZXhwcl95eXN0YXRlKQotICAgICAgICBzc2xfZXhwcl95eXN0YXRlID0gc3NsX2V4cHJfeXl0YWJsZVtzc2xfZXhwcl95eW5dOwotICAgIGVsc2UKLSAgICAgICAgc3NsX2V4cHJfeXlzdGF0ZSA9IHNzbF9leHByX3l5ZGdvdG9bc3NsX2V4cHJfeXltXTsKLSNpZiBZWURFQlVHCi0gICAgaWYgKHNzbF9leHByX3l5ZGVidWcpCi0gICAgICAgIHByaW50ZigiJXNkZWJ1ZzogYWZ0ZXIgcmVkdWN0aW9uLCBzaGlmdGluZyBmcm9tIHN0YXRlICVkIFwKLXRvIHN0YXRlICVkXG4iLCBZWVBSRUZJWCwgKnNzbF9leHByX3l5c3NwLCBzc2xfZXhwcl95eXN0YXRlKTsKLSNlbmRpZgotICAgIGlmIChzc2xfZXhwcl95eXNzcCA+PSBzc2xfZXhwcl95eXNzbGltICYmIHNzbF9leHByX3l5Z3Jvd3N0YWNrKCkpCi0gICAgewotICAgICAgICBnb3RvIHNzbF9leHByX3l5b3ZlcmZsb3c7Ci0gICAgfQotICAgICorK3NzbF9leHByX3l5c3NwID0gc3NsX2V4cHJfeXlzdGF0ZTsKLSAgICAqKytzc2xfZXhwcl95eXZzcCA9IHNzbF9leHByX3l5dmFsOwotICAgIGdvdG8gc3NsX2V4cHJfeXlsb29wOwotc3NsX2V4cHJfeXlvdmVyZmxvdzoKLSAgICBzc2xfZXhwcl95eWVycm9yKCJ5YWNjIHN0YWNrIG92ZXJmbG93Iik7Ci1zc2xfZXhwcl95eWFib3J0OgotICAgIHJldHVybiAoMSk7Ci1zc2xfZXhwcl95eWFjY2VwdDoKLSAgICByZXR1cm4gKDApOwotfQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zc2wvc3NsX2V4cHJfcGFyc2UuaCBiL21vZHVsZXMvc3NsL3NzbF9leHByX3BhcnNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOGNhY2IuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9zc2wvc3NsX2V4cHJfcGFyc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSNpZm5kZWYgWVlFUlJDT0RFCi0jZGVmaW5lIFlZRVJSQ09ERSAyNTYKLSNlbmRpZgotCi0jZGVmaW5lIFRfVFJVRSAyNTcKLSNkZWZpbmUgVF9GQUxTRSAyNTgKLSNkZWZpbmUgVF9ESUdJVCAyNTkKLSNkZWZpbmUgVF9JRCAyNjAKLSNkZWZpbmUgVF9TVFJJTkcgMjYxCi0jZGVmaW5lIFRfUkVHRVggMjYyCi0jZGVmaW5lIFRfUkVHRVhfSSAyNjMKLSNkZWZpbmUgVF9GVU5DX0ZJTEUgMjY0Ci0jZGVmaW5lIFRfT1BfRVEgMjY1Ci0jZGVmaW5lIFRfT1BfTkUgMjY2Ci0jZGVmaW5lIFRfT1BfTFQgMjY3Ci0jZGVmaW5lIFRfT1BfTEUgMjY4Ci0jZGVmaW5lIFRfT1BfR1QgMjY5Ci0jZGVmaW5lIFRfT1BfR0UgMjcwCi0jZGVmaW5lIFRfT1BfUkVHIDI3MQotI2RlZmluZSBUX09QX05SRSAyNzIKLSNkZWZpbmUgVF9PUF9JTiAyNzMKLSNkZWZpbmUgVF9PUF9PUiAyNzQKLSNkZWZpbmUgVF9PUF9BTkQgMjc1Ci0jZGVmaW5lIFRfT1BfTk9UIDI3NgotdHlwZWRlZiB1bmlvbiB7Ci0gICAgY2hhciAgICAgKmNwVmFsOwotICAgIHNzbF9leHByICpleFZhbDsKLX0gWVlTVFlQRTsKLWV4dGVybiBZWVNUWVBFIHNzbF9leHByX3l5bHZhbDsKZGlmZiAtLWdpdCBhL21vZHVsZXMvc3NsL3NzbF9leHByX3BhcnNlLnkgYi9tb2R1bGVzL3NzbC9zc2xfZXhwcl9wYXJzZS55CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTNhZDZlLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvc3NsL3NzbF9leHByX3BhcnNlLnkKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyogICAgICAgICAgICAgICAgICAgICAgXyAgICAgICAgICAgICBfIAotKiogIF8gX18gX19fICAgX19fICAgX198IHwgICAgX19fIF9fX3wgfCAgCi0qKiB8ICdfIGAgXyBcIC8gXyBcIC8gX2AgfCAgIC8gX18vIF9ffCB8ICAKLSoqIHwgfCB8IHwgfCB8IChfKSB8IChffCB8ICAgXF9fIFxfXyBcIHwgbW9kX3NzbCAtIEFwYWNoZSBJbnRlcmZhY2UgdG8gT3BlblNTTAotKiogfF98IHxffCB8X3xcX19fLyBcX18sX3xfX198X19fL19fXy9ffCBodHRwOi8vd3d3Lm1vZHNzbC5vcmcvCi0qKiAgICAgICAgICAgICAgICAgICAgICB8X19fX198ICAgICAgICAgCi0qKiAgc3NsX2V4cHJfcGFyc2UueQotKiogIEV4cHJlc3Npb24gTFIoMSkgUGFyc2VyCi0qLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgUmFsZiBTLiBFbmdlbHNjaGFsbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotICogICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+IGZvciB1c2UgaW4gdGhlCi0gKiAgICAgbW9kX3NzbCBwcm9qZWN0IChodHRwOi8vd3d3Lm1vZHNzbC5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJtb2Rfc3NsIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICogICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgcnNlQGVuZ2Vsc2NoYWxsLmNvbS4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAibW9kX3NzbCIKLSAqICAgIG5vciBtYXkgIm1vZF9zc2wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yCi0gKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgUmFsZiBTLiBFbmdlbHNjaGFsbC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotICogICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+IGZvciB1c2UgaW4gdGhlCi0gKiAgICAgbW9kX3NzbCBwcm9qZWN0IChodHRwOi8vd3d3Lm1vZHNzbC5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBSQUxGIFMuIEVOR0VMU0NIQUxMIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBSQUxGIFMuIEVOR0VMU0NIQUxMIE9SCi0gKiBISVMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBgYFdoYXQgeW91IHNlZSBpcyBhbGwgeW91IGdldC4nJwotCQkJCQkJCSAgICAgICAgICAgICAgLS0gQnJpYW4gS2VybmlnaGFuICAgICAgKi8KLQotLyogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogIEV4cHJlc3Npb24gUGFyc2VyCi0qKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSovCi0KLSV7Ci0jaW5jbHVkZSAibW9kX3NzbC5oIgotJX0KLQotJXVuaW9uIHsKLSAgICBjaGFyICAgICAqY3BWYWw7Ci0gICAgc3NsX2V4cHIgKmV4VmFsOwotfQotCi0ldG9rZW4gIFRfVFJVRQotJXRva2VuICBUX0ZBTFNFCi0KLSV0b2tlbiAgPGNwVmFsPiBUX0RJR0lUCi0ldG9rZW4gIDxjcFZhbD4gVF9JRAotJXRva2VuICA8Y3BWYWw+IFRfU1RSSU5HCi0ldG9rZW4gIDxjcFZhbD4gVF9SRUdFWAotJXRva2VuICA8Y3BWYWw+IFRfUkVHRVhfSQotCi0ldG9rZW4gIFRfRlVOQ19GSUxFCi0KLSV0b2tlbiAgVF9PUF9FUQotJXRva2VuICBUX09QX05FCi0ldG9rZW4gIFRfT1BfTFQKLSV0b2tlbiAgVF9PUF9MRQotJXRva2VuICBUX09QX0dUCi0ldG9rZW4gIFRfT1BfR0UKLSV0b2tlbiAgVF9PUF9SRUcKLSV0b2tlbiAgVF9PUF9OUkUKLSV0b2tlbiAgVF9PUF9JTgotCi0ldG9rZW4gIFRfT1BfT1IKLSV0b2tlbiAgVF9PUF9BTkQKLSV0b2tlbiAgVF9PUF9OT1QKLQotJWxlZnQgICBUX09QX09SCi0lbGVmdCAgIFRfT1BfQU5ECi0lbGVmdCAgIFRfT1BfTk9UCi0KLSV0eXBlICAgPGV4VmFsPiAgIGV4cHIKLSV0eXBlICAgPGV4VmFsPiAgIGNvbXBhcmlzb24KLSV0eXBlICAgPGV4VmFsPiAgIGZ1bmNjYWxsCi0ldHlwZSAgIDxleFZhbD4gICByZWdleAotJXR5cGUgICA8ZXhWYWw+ICAgd29yZHMKLSV0eXBlICAgPGV4VmFsPiAgIHdvcmQKLQotJSUKLQotcm9vdCAgICAgIDogZXhwciAgICAgICAgICAgICAgICAgICAgICAgICB7IHNzbF9leHByX2luZm8uZXhwciA9ICQxOyB9Ci0gICAgICAgICAgOwotCi1leHByICAgICAgOiBUX1RSVUUgICAgICAgICAgICAgICAgICAgICAgIHsgJCQgPSBzc2xfZXhwcl9tYWtlKG9wX1RydWUsICBOVUxMLCBOVUxMKTsgfQotICAgICAgICAgIHwgVF9GQUxTRSAgICAgICAgICAgICAgICAgICAgICB7ICQkID0gc3NsX2V4cHJfbWFrZShvcF9GYWxzZSwgTlVMTCwgTlVMTCk7IH0KLSAgICAgICAgICB8IFRfT1BfTk9UIGV4cHIgICAgICAgICAgICAgICAgeyAkJCA9IHNzbF9leHByX21ha2Uob3BfTm90LCAgICQyLCAgIE5VTEwpOyB9Ci0gICAgICAgICAgfCBleHByIFRfT1BfT1IgZXhwciAgICAgICAgICAgIHsgJCQgPSBzc2xfZXhwcl9tYWtlKG9wX09yLCAgICAkMSwgICAkMyk7ICAgfQotICAgICAgICAgIHwgZXhwciBUX09QX0FORCBleHByICAgICAgICAgICB7ICQkID0gc3NsX2V4cHJfbWFrZShvcF9BbmQsICAgJDEsICAgJDMpOyAgIH0KLSAgICAgICAgICB8IGNvbXBhcmlzb24gICAgICAgICAgICAgICAgICAgeyAkJCA9IHNzbF9leHByX21ha2Uob3BfQ29tcCwgICQxLCAgIE5VTEwpOyB9Ci0gICAgICAgICAgfCAnKCcgZXhwciAnKScgICAgICAgICAgICAgICAgIHsgJCQgPSAkMjsgfQotICAgICAgICAgIDsKLQotY29tcGFyaXNvbjogd29yZCBUX09QX0VRIHdvcmQgICAgICAgICAgICB7ICQkID0gc3NsX2V4cHJfbWFrZShvcF9FUSwgICQxLCAkMyk7IH0KLSAgICAgICAgICB8IHdvcmQgVF9PUF9ORSB3b3JkICAgICAgICAgICAgeyAkJCA9IHNzbF9leHByX21ha2Uob3BfTkUsICAkMSwgJDMpOyB9Ci0gICAgICAgICAgfCB3b3JkIFRfT1BfTFQgd29yZCAgICAgICAgICAgIHsgJCQgPSBzc2xfZXhwcl9tYWtlKG9wX0xULCAgJDEsICQzKTsgfQotICAgICAgICAgIHwgd29yZCBUX09QX0xFIHdvcmQgICAgICAgICAgICB7ICQkID0gc3NsX2V4cHJfbWFrZShvcF9MRSwgICQxLCAkMyk7IH0KLSAgICAgICAgICB8IHdvcmQgVF9PUF9HVCB3b3JkICAgICAgICAgICAgeyAkJCA9IHNzbF9leHByX21ha2Uob3BfR1QsICAkMSwgJDMpOyB9Ci0gICAgICAgICAgfCB3b3JkIFRfT1BfR0Ugd29yZCAgICAgICAgICAgIHsgJCQgPSBzc2xfZXhwcl9tYWtlKG9wX0dFLCAgJDEsICQzKTsgfQotICAgICAgICAgIHwgd29yZCBUX09QX0lOICd7JyB3b3JkcyAnfScgICB7ICQkID0gc3NsX2V4cHJfbWFrZShvcF9JTiwgICQxLCAkNCk7IH0KLSAgICAgICAgICB8IHdvcmQgVF9PUF9SRUcgcmVnZXggICAgICAgICAgeyAkJCA9IHNzbF9leHByX21ha2Uob3BfUkVHLCAkMSwgJDMpOyB9Ci0gICAgICAgICAgfCB3b3JkIFRfT1BfTlJFIHJlZ2V4ICAgICAgICAgIHsgJCQgPSBzc2xfZXhwcl9tYWtlKG9wX05SRSwgJDEsICQzKTsgfQotICAgICAgICAgIDsKLQotd29yZHMgICAgIDogd29yZCAgICAgICAgICAgICAgICAgICAgICAgICB7ICQkID0gc3NsX2V4cHJfbWFrZShvcF9MaXN0RWxlbWVudCwgJDEsIE5VTEwpOyB9Ci0gICAgICAgICAgfCB3b3JkcyAnLCcgd29yZCAgICAgICAgICAgICAgIHsgJCQgPSBzc2xfZXhwcl9tYWtlKG9wX0xpc3RFbGVtZW50LCAkMywgJDEpOyAgIH0KLSAgICAgICAgICA7Ci0KLXdvcmQgICAgICA6IFRfRElHSVQgICAgICAgICAgICAgICAgICAgICAgeyAkJCA9IHNzbF9leHByX21ha2Uob3BfRGlnaXQsICAkMSwgTlVMTCk7IH0KLSAgICAgICAgICB8IFRfU1RSSU5HICAgICAgICAgICAgICAgICAgICAgeyAkJCA9IHNzbF9leHByX21ha2Uob3BfU3RyaW5nLCAkMSwgTlVMTCk7IH0KLSAgICAgICAgICB8ICclJyAneycgVF9JRCAnfScgICAgICAgICAgICAgeyAkJCA9IHNzbF9leHByX21ha2Uob3BfVmFyLCAgICAkMywgTlVMTCk7IH0KLSAgICAgICAgICB8IGZ1bmNjYWxsICAgICAgICAgICAgICAgICAgICAgeyAkJCA9ICQxOyB9Ci0gICAgICAgICAgOwotCi1yZWdleCAgICAgOiBUX1JFR0VYIHsgCi0gICAgICAgICAgICAgICAgcmVnZXhfdCAqcmVnZXg7Ci0gICAgICAgICAgICAgICAgaWYgKChyZWdleCA9IGFwX3ByZWdjb21wKHNzbF9leHByX2luZm8ucG9vbCwgJDEsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfRVhURU5ERUR8UkVHX05PU1VCKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBzc2xfZXhwcl9lcnJvciA9ICJGYWlsZWQgdG8gY29tcGlsZSByZWd1bGFyIGV4cHJlc3Npb24iOwotICAgICAgICAgICAgICAgICAgICBZWUVSUk9SOwotICAgICAgICAgICAgICAgICAgICByZWdleCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICQkID0gc3NsX2V4cHJfbWFrZShvcF9SZWdleCwgcmVnZXgsIE5VTEwpOwotICAgICAgICAgICAgfQotICAgICAgICAgIHwgVF9SRUdFWF9JIHsKLSAgICAgICAgICAgICAgICByZWdleF90ICpyZWdleDsKLSAgICAgICAgICAgICAgICBpZiAoKHJlZ2V4ID0gYXBfcHJlZ2NvbXAoc3NsX2V4cHJfaW5mby5wb29sLCAkMSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19FWFRFTkRFRHxSRUdfTk9TVUJ8UkVHX0lDQVNFKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBzc2xfZXhwcl9lcnJvciA9ICJGYWlsZWQgdG8gY29tcGlsZSByZWd1bGFyIGV4cHJlc3Npb24iOwotICAgICAgICAgICAgICAgICAgICBZWUVSUk9SOwotICAgICAgICAgICAgICAgICAgICByZWdleCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICQkID0gc3NsX2V4cHJfbWFrZShvcF9SZWdleCwgcmVnZXgsIE5VTEwpOwotICAgICAgICAgICAgfQotICAgICAgICAgIDsKLQotZnVuY2NhbGwgIDogVF9GVU5DX0ZJTEUgJygnIFRfU1RSSU5HICcpJyB7IAotICAgICAgICAgICAgICAgc3NsX2V4cHIgKmFyZ3MgPSBzc2xfZXhwcl9tYWtlKG9wX0xpc3RFbGVtZW50LCAkMywgTlVMTCk7Ci0gICAgICAgICAgICAgICAkJCA9IHNzbF9leHByX21ha2Uob3BfRnVuYywgImZpbGUiLCBhcmdzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICA7Ci0KLSUlCi0KLWludCB5eWVycm9yKGNoYXIgKnMpCi17Ci0gICAgc3NsX2V4cHJfZXJyb3IgPSBzOwotICAgIHJldHVybiAyOwotfQotCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NzbC9zc2xfZXhwcl9zY2FuLmMgYi9tb2R1bGVzL3NzbC9zc2xfZXhwcl9zY2FuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZTlmOWQuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9zc2wvc3NsX2V4cHJfc2Nhbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAwMiArMCwwIEBACi0jZGVmaW5lIHl5X2NyZWF0ZV9idWZmZXIgc3NsX2V4cHJfeXlfY3JlYXRlX2J1ZmZlcgotI2RlZmluZSB5eV9kZWxldGVfYnVmZmVyIHNzbF9leHByX3l5X2RlbGV0ZV9idWZmZXIKLSNkZWZpbmUgeXlfc2Nhbl9idWZmZXIgc3NsX2V4cHJfeXlfc2Nhbl9idWZmZXIKLSNkZWZpbmUgeXlfc2Nhbl9zdHJpbmcgc3NsX2V4cHJfeXlfc2Nhbl9zdHJpbmcKLSNkZWZpbmUgeXlfc2Nhbl9ieXRlcyBzc2xfZXhwcl95eV9zY2FuX2J5dGVzCi0jZGVmaW5lIHl5X2ZsZXhfZGVidWcgc3NsX2V4cHJfeXlfZmxleF9kZWJ1ZwotI2RlZmluZSB5eV9pbml0X2J1ZmZlciBzc2xfZXhwcl95eV9pbml0X2J1ZmZlcgotI2RlZmluZSB5eV9mbHVzaF9idWZmZXIgc3NsX2V4cHJfeXlfZmx1c2hfYnVmZmVyCi0jZGVmaW5lIHl5X2xvYWRfYnVmZmVyX3N0YXRlIHNzbF9leHByX3l5X2xvYWRfYnVmZmVyX3N0YXRlCi0jZGVmaW5lIHl5X3N3aXRjaF90b19idWZmZXIgc3NsX2V4cHJfeXlfc3dpdGNoX3RvX2J1ZmZlcgotI2RlZmluZSB5eWluIHNzbF9leHByX3l5aW4KLSNkZWZpbmUgeXlsZW5nIHNzbF9leHByX3l5bGVuZwotI2RlZmluZSB5eWxleCBzc2xfZXhwcl95eWxleAotI2RlZmluZSB5eW91dCBzc2xfZXhwcl95eW91dAotI2RlZmluZSB5eXJlc3RhcnQgc3NsX2V4cHJfeXlyZXN0YXJ0Ci0jZGVmaW5lIHl5dGV4dCBzc2xfZXhwcl95eXRleHQKLQotLyogQSBsZXhpY2FsIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IGZsZXggKi8KLQotLyogU2Nhbm5lciBza2VsZXRvbiB2ZXJzaW9uOgotICovCi0KLSNkZWZpbmUgRkxFWF9TQ0FOTkVSCi0jZGVmaW5lIFlZX0ZMRVhfTUFKT1JfVkVSU0lPTiAyCi0jZGVmaW5lIFlZX0ZMRVhfTUlOT1JfVkVSU0lPTiA1Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0KLS8qIGNmcm9udCAxLjIgZGVmaW5lcyAiY19wbHVzcGx1cyIgaW5zdGVhZCBvZiAiX19jcGx1c3BsdXMiICovCi0jaWZkZWYgY19wbHVzcGx1cwotI2lmbmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBfX2NwbHVzcGx1cwotI2VuZGlmCi0jZW5kaWYKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0vKiBVc2UgcHJvdG90eXBlcyBpbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuICovCi0jZGVmaW5lIFlZX1VTRV9QUk9UT1MKLQotLyogVGhlICJjb25zdCIgc3RvcmFnZS1jbGFzcy1tb2RpZmllciBpcyB2YWxpZC4gKi8KLSNkZWZpbmUgWVlfVVNFX0NPTlNUCi0KLSNlbHNlCS8qICEgX19jcGx1c3BsdXMgKi8KLQotI2lmIF9fU1REQ19fCi0KLSNkZWZpbmUgWVlfVVNFX1BST1RPUwotI2RlZmluZSBZWV9VU0VfQ09OU1QKLQotI2VuZGlmCS8qIF9fU1REQ19fICovCi0jZW5kaWYJLyogISBfX2NwbHVzcGx1cyAqLwotCi0jaWZkZWYgX19UVVJCT0NfXwotICNwcmFnbWEgd2FybiAtcmNoCi0gI3ByYWdtYSB3YXJuIC11c2UKLSNpbmNsdWRlIDxpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2RlZmluZSBZWV9VU0VfQ09OU1QKLSNkZWZpbmUgWVlfVVNFX1BST1RPUwotI2VuZGlmCi0KLSNpZmRlZiBZWV9VU0VfQ09OU1QKLSNkZWZpbmUgeXljb25zdCBjb25zdAotI2Vsc2UKLSNkZWZpbmUgeXljb25zdAotI2VuZGlmCi0KLQotI2lmZGVmIFlZX1VTRV9QUk9UT1MKLSNkZWZpbmUgWVlfUFJPVE8ocHJvdG8pIHByb3RvCi0jZWxzZQotI2RlZmluZSBZWV9QUk9UTyhwcm90bykgKCkKLSNlbmRpZgotCi0vKiBSZXR1cm5lZCB1cG9uIGVuZC1vZi1maWxlLiAqLwotI2RlZmluZSBZWV9OVUxMIDAKLQotLyogUHJvbW90ZXMgYSBwb3NzaWJseSBuZWdhdGl2ZSwgcG9zc2libHkgc2lnbmVkIGNoYXIgdG8gYW4gdW5zaWduZWQKLSAqIGludGVnZXIgZm9yIHVzZSBhcyBhbiBhcnJheSBpbmRleC4gIElmIHRoZSBzaWduZWQgY2hhciBpcyBuZWdhdGl2ZSwKLSAqIHdlIHdhbnQgdG8gaW5zdGVhZCB0cmVhdCBpdCBhcyBhbiA4LWJpdCB1bnNpZ25lZCBjaGFyLCBoZW5jZSB0aGUKLSAqIGRvdWJsZSBjYXN0LgotICovCi0jZGVmaW5lIFlZX1NDX1RPX1VJKGMpICgodW5zaWduZWQgaW50KSAodW5zaWduZWQgY2hhcikgYykKLQotLyogRW50ZXIgYSBzdGFydCBjb25kaXRpb24uICBUaGlzIG1hY3JvIHJlYWxseSBvdWdodCB0byB0YWtlIGEgcGFyYW1ldGVyLAotICogYnV0IHdlIGRvIGl0IHRoZSBkaXNndXN0aW5nIGNydWZ0eSB3YXkgZm9yY2VkIG9uIHVzIGJ5IHRoZSAoKS1sZXNzCi0gKiBkZWZpbml0aW9uIG9mIEJFR0lOLgotICovCi0jZGVmaW5lIEJFR0lOIHl5X3N0YXJ0ID0gMSArIDIgKgotCi0vKiBUcmFuc2xhdGUgdGhlIGN1cnJlbnQgc3RhcnQgc3RhdGUgaW50byBhIHZhbHVlIHRoYXQgY2FuIGJlIGxhdGVyIGhhbmRlZAotICogdG8gQkVHSU4gdG8gcmV0dXJuIHRvIHRoZSBzdGF0ZS4gIFRoZSBZWVNUQVRFIGFsaWFzIGlzIGZvciBsZXgKLSAqIGNvbXBhdGliaWxpdHkuCi0gKi8KLSNkZWZpbmUgWVlfU1RBUlQgKCh5eV9zdGFydCAtIDEpIC8gMikKLSNkZWZpbmUgWVlTVEFURSBZWV9TVEFSVAotCi0vKiBBY3Rpb24gbnVtYmVyIGZvciBFT0YgcnVsZSBvZiBhIGdpdmVuIHN0YXJ0IHN0YXRlLiAqLwotI2RlZmluZSBZWV9TVEFURV9FT0Yoc3RhdGUpIChZWV9FTkRfT0ZfQlVGRkVSICsgc3RhdGUgKyAxKQotCi0vKiBTcGVjaWFsIGFjdGlvbiBtZWFuaW5nICJzdGFydCBwcm9jZXNzaW5nIGEgbmV3IGZpbGUiLiAqLwotI2RlZmluZSBZWV9ORVdfRklMRSB5eXJlc3RhcnQoIHl5aW4gKQotCi0jZGVmaW5lIFlZX0VORF9PRl9CVUZGRVJfQ0hBUiAwCi0KLS8qIFNpemUgb2YgZGVmYXVsdCBpbnB1dCBidWZmZXIuICovCi0jZGVmaW5lIFlZX0JVRl9TSVpFIDE2Mzg0Ci0KLXR5cGVkZWYgc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSAqWVlfQlVGRkVSX1NUQVRFOwotCi1leHRlcm4gaW50IHl5bGVuZzsKLWV4dGVybiBGSUxFICp5eWluLCAqeXlvdXQ7Ci0KLSNkZWZpbmUgRU9CX0FDVF9DT05USU5VRV9TQ0FOIDAKLSNkZWZpbmUgRU9CX0FDVF9FTkRfT0ZfRklMRSAxCi0jZGVmaW5lIEVPQl9BQ1RfTEFTVF9NQVRDSCAyCi0KLS8qIFRoZSBmdW5reSBkby13aGlsZSBpbiB0aGUgZm9sbG93aW5nICNkZWZpbmUgaXMgdXNlZCB0byB0dXJuIHRoZSBkZWZpbml0aW9uCi0gKiBpbnQgYSBzaW5nbGUgQyBzdGF0ZW1lbnQgKHdoaWNoIG5lZWRzIGEgc2VtaS1jb2xvbiB0ZXJtaW5hdG9yKS4gIFRoaXMKLSAqIGF2b2lkcyBwcm9ibGVtcyB3aXRoIGNvZGUgbGlrZToKLSAqCi0gKiAJaWYgKCBjb25kaXRpb25faG9sZHMgKQotICoJCXl5bGVzcyggNSApOwotICoJZWxzZQotICoJCWRvX3NvbWV0aGluZ19lbHNlKCk7Ci0gKgotICogUHJpb3IgdG8gdXNpbmcgdGhlIGRvLXdoaWxlIHRoZSBjb21waWxlciB3b3VsZCBnZXQgdXBzZXQgYXQgdGhlCi0gKiAiZWxzZSIgYmVjYXVzZSBpdCBpbnRlcnByZXRlZCB0aGUgImlmIiBzdGF0ZW1lbnQgYXMgYmVpbmcgYWxsCi0gKiBkb25lIHdoZW4gaXQgcmVhY2hlZCB0aGUgJzsnIGFmdGVyIHRoZSB5eWxlc3MoKSBjYWxsLgotICovCi0KLS8qIFJldHVybiBhbGwgYnV0IHRoZSBmaXJzdCAnbicgbWF0Y2hlZCBjaGFyYWN0ZXJzIGJhY2sgdG8gdGhlIGlucHV0IHN0cmVhbS4gKi8KLQotI2RlZmluZSB5eWxlc3MobikgXAotCWRvIFwKLQkJeyBcCi0JCS8qIFVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHl5dGV4dC4gKi8gXAotCQkqeXlfY3AgPSB5eV9ob2xkX2NoYXI7IFwKLQkJWVlfUkVTVE9SRV9ZWV9NT1JFX09GRlNFVCBcCi0JCXl5X2NfYnVmX3AgPSB5eV9jcCA9IHl5X2JwICsgbiAtIFlZX01PUkVfQURKOyBcCi0JCVlZX0RPX0JFRk9SRV9BQ1RJT047IC8qIHNldCB1cCB5eXRleHQgYWdhaW4gKi8gXAotCQl9IFwKLQl3aGlsZSAoIDAgKQotCi0jZGVmaW5lIHVucHV0KGMpIHl5dW5wdXQoIGMsIHl5dGV4dF9wdHIgKQotCi0vKiBUaGUgZm9sbG93aW5nIGlzIGJlY2F1c2Ugd2UgY2Fubm90IHBvcnRhYmx5IGdldCBvdXIgaGFuZHMgb24gc2l6ZV90Ci0gKiAod2l0aG91dCBhdXRvY29uZidzIGhlbHAsIHdoaWNoIGlzbid0IGF2YWlsYWJsZSBiZWNhdXNlIHdlIHdhbnQKLSAqIGZsZXgtZ2VuZXJhdGVkIHNjYW5uZXJzIHRvIGNvbXBpbGUgb24gdGhlaXIgb3duKS4KLSAqLwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgeXlfc2l6ZV90OwotCi0KLXN0cnVjdCB5eV9idWZmZXJfc3RhdGUKLQl7Ci0JRklMRSAqeXlfaW5wdXRfZmlsZTsKLQotCWNoYXIgKnl5X2NoX2J1ZjsJCS8qIGlucHV0IGJ1ZmZlciAqLwotCWNoYXIgKnl5X2J1Zl9wb3M7CQkvKiBjdXJyZW50IHBvc2l0aW9uIGluIGlucHV0IGJ1ZmZlciAqLwotCi0JLyogU2l6ZSBvZiBpbnB1dCBidWZmZXIgaW4gYnl0ZXMsIG5vdCBpbmNsdWRpbmcgcm9vbSBmb3IgRU9CCi0JICogY2hhcmFjdGVycy4KLQkgKi8KLQl5eV9zaXplX3QgeXlfYnVmX3NpemU7Ci0KLQkvKiBOdW1iZXIgb2YgY2hhcmFjdGVycyByZWFkIGludG8geXlfY2hfYnVmLCBub3QgaW5jbHVkaW5nIEVPQgotCSAqIGNoYXJhY3RlcnMuCi0JICovCi0JaW50IHl5X25fY2hhcnM7Ci0KLQkvKiBXaGV0aGVyIHdlICJvd24iIHRoZSBidWZmZXIgLSBpLmUuLCB3ZSBrbm93IHdlIGNyZWF0ZWQgaXQsCi0JICogYW5kIGNhbiByZWFsbG9jKCkgaXQgdG8gZ3JvdyBpdCwgYW5kIHNob3VsZCBmcmVlKCkgaXQgdG8KLQkgKiBkZWxldGUgaXQuCi0JICovCi0JaW50IHl5X2lzX291cl9idWZmZXI7Ci0KLQkvKiBXaGV0aGVyIHRoaXMgaXMgYW4gImludGVyYWN0aXZlIiBpbnB1dCBzb3VyY2U7IGlmIHNvLCBhbmQKLQkgKiBpZiB3ZSdyZSB1c2luZyBzdGRpbyBmb3IgaW5wdXQsIHRoZW4gd2Ugd2FudCB0byB1c2UgZ2V0YygpCi0JICogaW5zdGVhZCBvZiBmcmVhZCgpLCB0byBtYWtlIHN1cmUgd2Ugc3RvcCBmZXRjaGluZyBpbnB1dCBhZnRlcgotCSAqIGVhY2ggbmV3bGluZS4KLQkgKi8KLQlpbnQgeXlfaXNfaW50ZXJhY3RpdmU7Ci0KLQkvKiBXaGV0aGVyIHdlJ3JlIGNvbnNpZGVyZWQgdG8gYmUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuCi0JICogSWYgc28sICdeJyBydWxlcyB3aWxsIGJlIGFjdGl2ZSBvbiB0aGUgbmV4dCBtYXRjaCwgb3RoZXJ3aXNlCi0JICogbm90LgotCSAqLwotCWludCB5eV9hdF9ib2w7Ci0KLQkvKiBXaGV0aGVyIHRvIHRyeSB0byBmaWxsIHRoZSBpbnB1dCBidWZmZXIgd2hlbiB3ZSByZWFjaCB0aGUKLQkgKiBlbmQgb2YgaXQuCi0JICovCi0JaW50IHl5X2ZpbGxfYnVmZmVyOwotCi0JaW50IHl5X2J1ZmZlcl9zdGF0dXM7Ci0jZGVmaW5lIFlZX0JVRkZFUl9ORVcgMAotI2RlZmluZSBZWV9CVUZGRVJfTk9STUFMIDEKLQkvKiBXaGVuIGFuIEVPRidzIGJlZW4gc2VlbiBidXQgdGhlcmUncyBzdGlsbCBzb21lIHRleHQgdG8gcHJvY2VzcwotCSAqIHRoZW4gd2UgbWFyayB0aGUgYnVmZmVyIGFzIFlZX0VPRl9QRU5ESU5HLCB0byBpbmRpY2F0ZSB0aGF0IHdlCi0JICogc2hvdWxkbid0IHRyeSByZWFkaW5nIGZyb20gdGhlIGlucHV0IHNvdXJjZSBhbnkgbW9yZS4gIFdlIG1pZ2h0Ci0JICogc3RpbGwgaGF2ZSBhIGJ1bmNoIG9mIHRva2VucyB0byBtYXRjaCwgdGhvdWdoLCBiZWNhdXNlIG9mCi0JICogcG9zc2libGUgYmFja2luZy11cC4KLQkgKgotCSAqIFdoZW4gd2UgYWN0dWFsbHkgc2VlIHRoZSBFT0YsIHdlIGNoYW5nZSB0aGUgc3RhdHVzIHRvICJuZXciCi0JICogKHZpYSB5eXJlc3RhcnQoKSksIHNvIHRoYXQgdGhlIHVzZXIgY2FuIGNvbnRpbnVlIHNjYW5uaW5nIGJ5Ci0JICoganVzdCBwb2ludGluZyB5eWluIGF0IGEgbmV3IGlucHV0IGZpbGUuCi0JICovCi0jZGVmaW5lIFlZX0JVRkZFUl9FT0ZfUEVORElORyAyCi0JfTsKLQotc3RhdGljIFlZX0JVRkZFUl9TVEFURSB5eV9jdXJyZW50X2J1ZmZlciA9IDA7Ci0KLS8qIFdlIHByb3ZpZGUgbWFjcm9zIGZvciBhY2Nlc3NpbmcgYnVmZmVyIHN0YXRlcyBpbiBjYXNlIGluIHRoZQotICogZnV0dXJlIHdlIHdhbnQgdG8gcHV0IHRoZSBidWZmZXIgc3RhdGVzIGluIGEgbW9yZSBnZW5lcmFsCi0gKiAic2Nhbm5lciBzdGF0ZSIuCi0gKi8KLSNkZWZpbmUgWVlfQ1VSUkVOVF9CVUZGRVIgeXlfY3VycmVudF9idWZmZXIKLQotCi0vKiB5eV9ob2xkX2NoYXIgaG9sZHMgdGhlIGNoYXJhY3RlciBsb3N0IHdoZW4geXl0ZXh0IGlzIGZvcm1lZC4gKi8KLXN0YXRpYyBjaGFyIHl5X2hvbGRfY2hhcjsKLQotc3RhdGljIGludCB5eV9uX2NoYXJzOwkJLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBpbnRvIHl5X2NoX2J1ZiAqLwotCi0KLWludCB5eWxlbmc7Ci0KLS8qIFBvaW50cyB0byBjdXJyZW50IGNoYXJhY3RlciBpbiBidWZmZXIuICovCi1zdGF0aWMgY2hhciAqeXlfY19idWZfcCA9IChjaGFyICopIDA7Ci1zdGF0aWMgaW50IHl5X2luaXQgPSAxOwkJLyogd2hldGhlciB3ZSBuZWVkIHRvIGluaXRpYWxpemUgKi8KLXN0YXRpYyBpbnQgeXlfc3RhcnQgPSAwOwkvKiBzdGFydCBzdGF0ZSBudW1iZXIgKi8KLQotLyogRmxhZyB3aGljaCBpcyB1c2VkIHRvIGFsbG93IHl5d3JhcCgpJ3MgdG8gZG8gYnVmZmVyIHN3aXRjaGVzCi0gKiBpbnN0ZWFkIG9mIHNldHRpbmcgdXAgYSBmcmVzaCB5eWluLiAgQSBiaXQgb2YgYSBoYWNrIC4uLgotICovCi1zdGF0aWMgaW50IHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZjsKLQotdm9pZCB5eXJlc3RhcnQgWVlfUFJPVE8oKCBGSUxFICppbnB1dF9maWxlICkpOwotCi12b2lkIHl5X3N3aXRjaF90b19idWZmZXIgWVlfUFJPVE8oKCBZWV9CVUZGRVJfU1RBVEUgbmV3X2J1ZmZlciApKTsKLXZvaWQgeXlfbG9hZF9idWZmZXJfc3RhdGUgWVlfUFJPVE8oKCB2b2lkICkpOwotWVlfQlVGRkVSX1NUQVRFIHl5X2NyZWF0ZV9idWZmZXIgWVlfUFJPVE8oKCBGSUxFICpmaWxlLCBpbnQgc2l6ZSApKTsKLXZvaWQgeXlfZGVsZXRlX2J1ZmZlciBZWV9QUk9UTygoIFlZX0JVRkZFUl9TVEFURSBiICkpOwotdm9pZCB5eV9pbml0X2J1ZmZlciBZWV9QUk9UTygoIFlZX0JVRkZFUl9TVEFURSBiLCBGSUxFICpmaWxlICkpOwotdm9pZCB5eV9mbHVzaF9idWZmZXIgWVlfUFJPVE8oKCBZWV9CVUZGRVJfU1RBVEUgYiApKTsKLSNkZWZpbmUgWVlfRkxVU0hfQlVGRkVSIHl5X2ZsdXNoX2J1ZmZlciggeXlfY3VycmVudF9idWZmZXIgKQotCi1ZWV9CVUZGRVJfU1RBVEUgeXlfc2Nhbl9idWZmZXIgWVlfUFJPVE8oKCBjaGFyICpiYXNlLCB5eV9zaXplX3Qgc2l6ZSApKTsKLVlZX0JVRkZFUl9TVEFURSB5eV9zY2FuX3N0cmluZyBZWV9QUk9UTygoIHl5Y29uc3QgY2hhciAqeXlfc3RyICkpOwotWVlfQlVGRkVSX1NUQVRFIHl5X3NjYW5fYnl0ZXMgWVlfUFJPVE8oKCB5eWNvbnN0IGNoYXIgKmJ5dGVzLCBpbnQgbGVuICkpOwotCi1zdGF0aWMgdm9pZCAqeXlfZmxleF9hbGxvYyBZWV9QUk9UTygoIHl5X3NpemVfdCApKTsKLXN0YXRpYyB2b2lkICp5eV9mbGV4X3JlYWxsb2MgWVlfUFJPVE8oKCB2b2lkICosIHl5X3NpemVfdCApKTsKLXN0YXRpYyB2b2lkIHl5X2ZsZXhfZnJlZSBZWV9QUk9UTygoIHZvaWQgKiApKTsKLQotI2RlZmluZSB5eV9uZXdfYnVmZmVyIHl5X2NyZWF0ZV9idWZmZXIKLQotI2RlZmluZSB5eV9zZXRfaW50ZXJhY3RpdmUoaXNfaW50ZXJhY3RpdmUpIFwKLQl7IFwKLQlpZiAoICEgeXlfY3VycmVudF9idWZmZXIgKSBcCi0JCXl5X2N1cnJlbnRfYnVmZmVyID0geXlfY3JlYXRlX2J1ZmZlciggeXlpbiwgWVlfQlVGX1NJWkUgKTsgXAotCXl5X2N1cnJlbnRfYnVmZmVyLT55eV9pc19pbnRlcmFjdGl2ZSA9IGlzX2ludGVyYWN0aXZlOyBcCi0JfQotCi0jZGVmaW5lIHl5X3NldF9ib2woYXRfYm9sKSBcCi0JeyBcCi0JaWYgKCAhIHl5X2N1cnJlbnRfYnVmZmVyICkgXAotCQl5eV9jdXJyZW50X2J1ZmZlciA9IHl5X2NyZWF0ZV9idWZmZXIoIHl5aW4sIFlZX0JVRl9TSVpFICk7IFwKLQl5eV9jdXJyZW50X2J1ZmZlci0+eXlfYXRfYm9sID0gYXRfYm9sOyBcCi0JfQotCi0jZGVmaW5lIFlZX0FUX0JPTCgpICh5eV9jdXJyZW50X2J1ZmZlci0+eXlfYXRfYm9sKQotCi0KLSNkZWZpbmUgeXl3cmFwKCkgMQotI2RlZmluZSBZWV9TS0lQX1lZV1JBUAotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFlZX0NIQVI7Ci1GSUxFICp5eWluID0gKEZJTEUgKikgMCwgKnl5b3V0ID0gKEZJTEUgKikgMDsKLXR5cGVkZWYgaW50IHl5X3N0YXRlX3R5cGU7Ci1leHRlcm4gY2hhciAqeXl0ZXh0OwotI2RlZmluZSB5eXRleHRfcHRyIHl5dGV4dAotCi1zdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV9nZXRfcHJldmlvdXNfc3RhdGUgWVlfUFJPVE8oKCB2b2lkICkpOwotc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfdHJ5X05VTF90cmFucyBZWV9QUk9UTygoIHl5X3N0YXRlX3R5cGUgY3VycmVudF9zdGF0ZSApKTsKLXN0YXRpYyBpbnQgeXlfZ2V0X25leHRfYnVmZmVyIFlZX1BST1RPKCggdm9pZCApKTsKLXN0YXRpYyB2b2lkIHl5X2ZhdGFsX2Vycm9yIFlZX1BST1RPKCggeXljb25zdCBjaGFyIG1zZ1tdICkpOwotCi0vKiBEb25lIGFmdGVyIHRoZSBjdXJyZW50IHBhdHRlcm4gaGFzIGJlZW4gbWF0Y2hlZCBhbmQgYmVmb3JlIHRoZQotICogY29ycmVzcG9uZGluZyBhY3Rpb24gLSBzZXRzIHVwIHl5dGV4dC4KLSAqLwotI2RlZmluZSBZWV9ET19CRUZPUkVfQUNUSU9OIFwKLQl5eXRleHRfcHRyID0geXlfYnA7IFwKLQl5eWxlbmcgPSAoaW50KSAoeXlfY3AgLSB5eV9icCk7IFwKLQl5eV9ob2xkX2NoYXIgPSAqeXlfY3A7IFwKLQkqeXlfY3AgPSAnXDAnOyBcCi0JeXlfY19idWZfcCA9IHl5X2NwOwotCi0jZGVmaW5lIFlZX05VTV9SVUxFUyA0NgotI2RlZmluZSBZWV9FTkRfT0ZfQlVGRkVSIDQ3Ci1zdGF0aWMgeXljb25zdCBzaG9ydCBpbnQgeXlfYWNjZXB0Wzg2XSA9Ci0gICAgeyAgIDAsCi0gICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgNDcsICAgNDUsCi0gICAgICAgIDEsICAgMzgsICAgIDIsICAgNDUsICAgNDMsICAgMjQsICAgNDUsICAgMjgsICAgNDQsICAgNDQsCi0gICAgICAgNDQsICAgNDQsICAgNDQsICAgNDQsICAgNDQsICAgNDQsICAgNDQsICAgNDQsICAgNDQsICAgNDUsCi0gICAgICAgMTMsICAgIDQsICAgIDMsICAgMTQsICAgMTYsICAgMTgsICAgMTcsICAgIDEsICAgMjIsICAgMzIsCi0gICAgICAgMzQsICAgNDMsICAgMjYsICAgMjAsICAgMzEsICAgMzAsICAgNDQsICAgNDQsICAgMTksICAgNDQsCi0gICAgICAgNDQsICAgMjksICAgMjcsICAgMzksICAgMjUsICAgMjMsICAgMTUsICAgMTUsICAgMjEsICAgNDQsCi0gICAgICAgMzUsICAgNDQsICAgMzYsICAgMTMsICAgMTIsICAgIDUsICAgIDYsICAgMTAsICAgMTEsICAgIDcsCi0gICAgICAgIDgsICAgIDksICAgMzMsICAgNDQsICAgNDQsICAgMzcsICAgNDQsICAgIDUsICAgIDYsICAgNDQsCi0gICAgICAgNDAsICAgNDEsICAgIDUsICAgNDIsICAgIDAKLSAgICB9IDsKLQotc3RhdGljIHl5Y29uc3QgaW50IHl5X2VjWzI1Nl0gPQotICAgIHsgICAwLAotICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAyLCAgICAzLAotICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAotICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAotICAgICAgICAxLCAgICAyLCAgICA0LCAgICA1LCAgICAxLCAgICAxLCAgICAxLCAgICA2LCAgICAxLCAgICAxLAotICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICA3LCAgICAxLCAgICAxLCAgICA4LCAgICA4LCAgICA4LAotICAgICAgICA4LCAgICA4LCAgICA4LCAgICA4LCAgICA4LCAgICA5LCAgICA5LCAgICA3LCAgICAxLCAgIDEwLAotICAgICAgIDExLCAgIDEyLCAgICAxLCAgICAxLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLAotICAgICAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLAotICAgICAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLAotICAgICAgICAxLCAgIDE0LCAgICAxLCAgICAxLCAgICA3LCAgICAxLCAgIDE1LCAgIDE2LCAgIDEzLCAgIDE3LAotCi0gICAgICAgMTgsICAgMTksICAgMjAsICAgMTMsICAgMjEsICAgMTMsICAgMTMsICAgMjIsICAgMjMsICAgMjQsCi0gICAgICAgMjUsICAgMTMsICAgMjYsICAgMjcsICAgMjgsICAgMjksICAgMzAsICAgMTMsICAgMTMsICAgMTMsCi0gICAgICAgMTMsICAgMTMsICAgIDEsICAgMzEsICAgIDEsICAgMzIsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0KLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMQotICAgIH0gOwotCi1zdGF0aWMgeXljb25zdCBpbnQgeXlfbWV0YVszM10gPQotICAgIHsgICAwLAotICAgICAgICAxLCAgICAxLCAgICAyLCAgICAxLCAgICAzLCAgICAxLCAgICA0LCAgICA0LCAgICA0LCAgICAxLAotICAgICAgICAxLCAgICAxLCAgICA0LCAgICAzLCAgICA0LCAgICA0LCAgICA0LCAgICA0LCAgICA0LCAgICA0LAotICAgICAgICA0LCAgICA0LCAgICA0LCAgICA0LCAgICA0LCAgICA0LCAgICA0LCAgICA0LCAgICA0LCAgICA0LAotICAgICAgICAxLCAgICAxCi0gICAgfSA7Ci0KLXN0YXRpYyB5eWNvbnN0IHNob3J0IGludCB5eV9iYXNlWzkzXSA9Ci0gICAgeyAgIDAsCi0gICAgICAgIDAsICAgIDAsICAgMzAsICAgMzEsICAgIDAsICAgIDAsICAgODIsICAgODEsICAxMDEsICAxNDIsCi0gICAgICAgMzUsICAgMjgsICAxNDIsICAgOTQsICAgMzIsICAgODgsICAgMzEsICAgODcsICAgIDAsICAgNjksCi0gICAgICAgNjYsICAgMjgsICAgMjgsICAgNjcsICAgMjksICAgNjMsICAgMzAsICAgNjMsICAgNjIsICAgNTcsCi0gICAgICAgIDAsICAxNDIsICAxNDIsICAgODgsICAxNDIsICAxNDIsICAxNDIsICAgNDgsICAxNDIsICAxNDIsCi0gICAgICAxNDIsICAgNDQsICAxNDIsICAxNDIsICAxNDIsICAxNDIsICAgIDAsICAgNzAsICAgIDAsICAgNjQsCi0gICAgICAgNjMsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAxNDIsICAgIDAsICAgIDAsICAgNTUsCi0gICAgICAgIDAsICAgNDYsICAxNDIsICAgIDAsICAxNDIsICAgNTMsICAgNjIsICAxNDIsICAxNDIsICAxNDIsCi0gICAgICAxNDIsICAxNDIsICAgIDAsICAgNDQsICAgNDgsICAgIDAsICAgNDEsICAgNzAsICAgNzIsICAgMzgsCi0gICAgICAgIDAsICAgIDAsICAgNzQsICAgIDAsICAxNDIsICAxMTcsICAxMjEsICAxMjUsICAgNTAsICAxMjksCi0gICAgICAxMzMsICAxMzcKLQotICAgIH0gOwotCi1zdGF0aWMgeXljb25zdCBzaG9ydCBpbnQgeXlfZGVmWzkzXSA9Ci0gICAgeyAgIDAsCi0gICAgICAgODUsICAgIDEsICAgODYsICAgODYsICAgODcsICAgODcsICAgODgsICAgODgsICAgODUsICAgODUsCi0gICAgICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsICAgODksICAgODksCi0gICAgICAgODksICAgODksICAgODksICAgODksICAgODksICAgOTAsICAgODksICAgODksICAgODksICAgODUsCi0gICAgICAgOTEsICAgODUsICAgODUsICAgOTIsICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsCi0gICAgICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsICAgODksICAgODksICAgODksICAgODksCi0gICAgICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODUsICAgODksICAgODksICAgODksCi0gICAgICAgODksICAgODksICAgODUsICAgOTEsICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsCi0gICAgICAgODUsICAgODUsICAgODksICAgODksICAgODksICAgODksICAgODksICAgODUsICAgODUsICAgODksCi0gICAgICAgODksICAgODksICAgODUsICAgODksICAgIDAsICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsCi0gICAgICAgODUsICAgODUKLQotICAgIH0gOwotCi1zdGF0aWMgeXljb25zdCBzaG9ydCBpbnQgeXlfbnh0WzE3NV0gPQotICAgIHsgICAwLAotICAgICAgIDEwLCAgIDExLCAgIDExLCAgIDEyLCAgIDEzLCAgIDE0LCAgIDEwLCAgIDE1LCAgIDE1LCAgIDE2LAotICAgICAgIDE3LCAgIDE4LCAgIDE5LCAgIDEwLCAgIDIwLCAgIDE5LCAgIDE5LCAgIDIxLCAgIDIyLCAgIDIzLAotICAgICAgIDI0LCAgIDI1LCAgIDI2LCAgIDI3LCAgIDI4LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDI5LCAgIDE5LAotICAgICAgIDMwLCAgIDEwLCAgIDMyLCAgIDMyLCAgIDMzLCAgIDMzLCAgIDM4LCAgIDM4LCAgIDM5LCAgIDQyLAotICAgICAgIDQyLCAgIDQ0LCAgIDUwLCAgIDM0LCAgIDM0LCAgIDUyLCAgIDU1LCAgIDU5LCAgIDUxLCAgIDM4LAotICAgICAgIDM4LCAgIDQyLCAgIDQyLCAgIDQ3LCAgIDYwLCAgIDg0LCAgIDUzLCAgIDU2LCAgIDgyLCAgIDQwLAotICAgICAgIDc4LCAgIDc5LCAgIDQ1LCAgIDU3LCAgIDU3LCAgIDgxLCAgIDU3LCAgIDU3LCAgIDU3LCAgIDc5LAotICAgICAgIDc5LCAgIDgwLCAgIDU3LCAgIDU3LCAgIDU3LCAgIDc3LCAgIDU3LCAgIDgzLCAgIDc5LCAgIDc5LAotICAgICAgIDc5LCAgIDc5LCAgIDc5LCAgIDc2LCAgIDc1LCAgIDc0LCAgIDczLCAgIDYzLCAgIDYyLCAgIDYxLAotICAgICAgIDU0LCAgIDQ5LCAgIDQ4LCAgIDU3LCAgIDU3LCAgIDY2LCAgIDY3LCAgIDQ2LCAgIDQzLCAgIDQxLAotCi0gICAgICAgODUsICAgMzcsICAgMzcsICAgNjgsICAgODUsICAgODUsICAgNjksICAgODUsICAgODUsICAgODUsCi0gICAgICAgODUsICAgNzAsICAgODUsICAgODUsICAgNzEsICAgODUsICAgNzIsICAgMzEsICAgMzEsICAgMzEsCi0gICAgICAgMzEsICAgMzUsICAgMzUsICAgMzUsICAgMzUsICAgMzYsICAgMzYsICAgMzYsICAgMzYsICAgNTgsCi0gICAgICAgODUsICAgNTgsICAgNTgsICAgNjQsICAgODUsICAgODUsICAgNjQsICAgNjUsICAgNjUsICAgNjUsCi0gICAgICAgNjUsICAgIDksICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsCi0gICAgICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsCi0gICAgICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsICAgODUsCi0gICAgICAgODUsICAgODUsICAgODUsICAgODUKLSAgICB9IDsKLQotc3RhdGljIHl5Y29uc3Qgc2hvcnQgaW50IHl5X2Noa1sxNzVdID0KLSAgICB7ICAgMCwKLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgMSwgICAgMywgICAgNCwgICAgMywgICAgNCwgICAxMSwgICAxMSwgICAxMiwgICAxNSwKLSAgICAgICAxNSwgICAxNywgICAyMiwgICAgMywgICAgNCwgICAyMywgICAyNSwgICAyNywgICAyMiwgICAzOCwKLSAgICAgICAzOCwgICA0MiwgICA0MiwgICA4OSwgICAyNywgICA4MCwgICAyMywgICAyNSwgICA3NywgICAxMiwKLSAgICAgICA2NiwgICA2NiwgICAxNywgICAyNiwgICAyNiwgICA3NSwgICAyNiwgICAyNiwgICAyNiwgICA2NywKLSAgICAgICA2NywgICA3NCwgICAyNiwgICAyNiwgICAyNiwgICA2MiwgICAyNiwgICA3OCwgICA3OCwgICA3OSwKLSAgICAgICA3OSwgICA4MywgICA4MywgICA2MCwgICA1MSwgICA1MCwgICA0OCwgICAzMCwgICAyOSwgICAyOCwKLSAgICAgICAyNCwgICAyMSwgICAyMCwgICAyNiwgICAyNiwgICAzNCwgICAzNCwgICAxOCwgICAxNiwgICAxNCwKLQotICAgICAgICA5LCAgICA4LCAgICA3LCAgIDM0LCAgICAwLCAgICAwLCAgIDM0LCAgICAwLCAgICAwLCAgICAwLAotICAgICAgICAwLCAgIDM0LCAgICAwLCAgICAwLCAgIDM0LCAgICAwLCAgIDM0LCAgIDg2LCAgIDg2LCAgIDg2LAotICAgICAgIDg2LCAgIDg3LCAgIDg3LCAgIDg3LCAgIDg3LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDg4LCAgIDkwLAotICAgICAgICAwLCAgIDkwLCAgIDkwLCAgIDkxLCAgICAwLCAgICAwLCAgIDkxLCAgIDkyLCAgIDkyLCAgIDkyLAotICAgICAgIDkyLCAgIDg1LCAgIDg1LCAgIDg1LCAgIDg1LCAgIDg1LCAgIDg1LCAgIDg1LCAgIDg1LCAgIDg1LAotICAgICAgIDg1LCAgIDg1LCAgIDg1LCAgIDg1LCAgIDg1LCAgIDg1LCAgIDg1LCAgIDg1LCAgIDg1LCAgIDg1LAotICAgICAgIDg1LCAgIDg1LCAgIDg1LCAgIDg1LCAgIDg1LCAgIDg1LCAgIDg1LCAgIDg1LCAgIDg1LCAgIDg1LAotICAgICAgIDg1LCAgIDg1LCAgIDg1LCAgIDg1Ci0gICAgfSA7Ci0KLXN0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X2xhc3RfYWNjZXB0aW5nX3N0YXRlOwotc3RhdGljIGNoYXIgKnl5X2xhc3RfYWNjZXB0aW5nX2Nwb3M7Ci0KLS8qIFRoZSBpbnRlbnQgYmVoaW5kIHRoaXMgZGVmaW5pdGlvbiBpcyB0aGF0IGl0J2xsIGNhdGNoCi0gKiBhbnkgdXNlcyBvZiBSRUpFQ1Qgd2hpY2ggZmxleCBtaXNzZWQuCi0gKi8KLSNkZWZpbmUgUkVKRUNUIHJlamVjdF91c2VkX2J1dF9ub3RfZGV0ZWN0ZWQKLSNkZWZpbmUgeXltb3JlKCkgeXltb3JlX3VzZWRfYnV0X25vdF9kZXRlY3RlZAotI2RlZmluZSBZWV9NT1JFX0FESiAwCi0jZGVmaW5lIFlZX1JFU1RPUkVfWVlfTU9SRV9PRkZTRVQKLWNoYXIgKnl5dGV4dDsKLSNsaW5lIDEgInNzbF9leHByX3NjYW4ubCIKLSNkZWZpbmUgSU5JVElBTCAwCi0vKiAgICAgICAgICAgICAgICAgICAgICBfICAgICAgICAgICAgIF8gCi0qKiAgXyBfXyBfX18gICBfX18gICBfX3wgfCAgICBfX18gX19ffCB8ICAKLSoqIHwgJ18gYCBfIFwgLyBfIFwgLyBfYCB8ICAgLyBfXy8gX198IHwgIAotKiogfCB8IHwgfCB8IHwgKF8pIHwgKF98IHwgICBcX18gXF9fIFwgfCBtb2Rfc3NsIC0gQXBhY2hlIEludGVyZmFjZSB0byBPcGVuU1NMCi0qKiB8X3wgfF98IHxffFxfX18vIFxfXyxffF9fX3xfX18vX19fL198IGh0dHA6Ly93d3cubW9kc3NsLm9yZy8KLSoqICAgICAgICAgICAgICAgICAgICAgIHxfX19fX3wgICAgICAgICAKLSoqICBzc2xfZXhwcl9zY2FuLmwKLSoqICBFeHByZXNzaW9uIFNjYW5uZXIKLSovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgUmFsZiBTLiBFbmdlbHNjaGFsbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotICogICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+IGZvciB1c2UgaW4gdGhlCi0gKiAgICAgbW9kX3NzbCBwcm9qZWN0IChodHRwOi8vd3d3Lm1vZHNzbC5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJtb2Rfc3NsIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICogICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgcnNlQGVuZ2Vsc2NoYWxsLmNvbS4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAibW9kX3NzbCIKLSAqICAgIG5vciBtYXkgIm1vZF9zc2wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yCi0gKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgUmFsZiBTLiBFbmdlbHNjaGFsbC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotICogICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+IGZvciB1c2UgaW4gdGhlCi0gKiAgICAgbW9kX3NzbCBwcm9qZWN0IChodHRwOi8vd3d3Lm1vZHNzbC5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBSQUxGIFMuIEVOR0VMU0NIQUxMIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBSQUxGIFMuIEVOR0VMU0NIQUxMIE9SCi0gKiBISVMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLS8qIGBgS2lsbGluZyBmb3IgcGVhY2UgaXMgCi1saWtlIGZ1Y2tpbmcgZm9yIHZpcmdpbml0eS4nJwotLS0gVW5rbm93biAgKi8KLS8qICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICBFeHByZXNzaW9uIFNjYW5uZXIKLSoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKi8KLSNsaW5lIDczICJzc2xfZXhwcl9zY2FuLmwiCi0jaW5jbHVkZSAibW9kX3NzbC5oIgotCi0jaW5jbHVkZSAic3NsX2V4cHJfcGFyc2UuaCIKLQotI2RlZmluZSBZWV9OT19VTlBVVCAxCi1pbnQgeXlpbnB1dChjaGFyICpidWYsIGludCBtYXhfc2l6ZSk7Ci0KLSN1bmRlZiAgWVlfSU5QVVQKLSNkZWZpbmUgWVlfSU5QVVQoYnVmLHJlc3VsdCxtYXhfc2l6ZSkgXAotICAgIChyZXN1bHQgPSB5eWlucHV0KGJ1ZiwgbWF4X3NpemUpKQotCi0jZGVmaW5lIE1BWF9TVFJfTEVOIDIwNDgKLS8qICVvcHRpb24gc3RhY2sgKi8KLSNkZWZpbmUgWVlfTkVWRVJfSU5URVJBQ1RJVkUgMQotI2RlZmluZSBzdHIgMQotCi0jZGVmaW5lIHJlZ2V4IDIKLSNkZWZpbmUgcmVnZXhfZmxhZ3MgMwotCi0jbGluZSA1MzcgImxleC5zc2xfZXhwcl95eS5jIgotCi0vKiBNYWNyb3MgYWZ0ZXIgdGhpcyBwb2ludCBjYW4gYWxsIGJlIG92ZXJyaWRkZW4gYnkgdXNlciBkZWZpbml0aW9ucyBpbgotICogc2VjdGlvbiAxLgotICovCi0KLSNpZm5kZWYgWVlfU0tJUF9ZWVdSQVAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiBpbnQgeXl3cmFwIFlZX1BST1RPKCggdm9pZCApKTsKLSNlbHNlCi1leHRlcm4gaW50IHl5d3JhcCBZWV9QUk9UTygoIHZvaWQgKSk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFlZX05PX1VOUFVUCi1zdGF0aWMgdm9pZCB5eXVucHV0IFlZX1BST1RPKCggaW50IGMsIGNoYXIgKmJ1Zl9wdHIgKSk7Ci0jZW5kaWYKLQotI2lmbmRlZiB5eXRleHRfcHRyCi1zdGF0aWMgdm9pZCB5eV9mbGV4X3N0cm5jcHkgWVlfUFJPVE8oKCBjaGFyICosIHl5Y29uc3QgY2hhciAqLCBpbnQgKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFlZX05FRURfU1RSTEVOCi1zdGF0aWMgaW50IHl5X2ZsZXhfc3RybGVuIFlZX1BST1RPKCggeXljb25zdCBjaGFyICogKSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBZWV9OT19JTlBVVAotI2lmZGVmIF9fY3BsdXNwbHVzCi1zdGF0aWMgaW50IHl5aW5wdXQgWVlfUFJPVE8oKCB2b2lkICkpOwotI2Vsc2UKLXN0YXRpYyBpbnQgaW5wdXQgWVlfUFJPVE8oKCB2b2lkICkpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIFlZX1NUQUNLX1VTRUQKLXN0YXRpYyBpbnQgeXlfc3RhcnRfc3RhY2tfcHRyID0gMDsKLXN0YXRpYyBpbnQgeXlfc3RhcnRfc3RhY2tfZGVwdGggPSAwOwotc3RhdGljIGludCAqeXlfc3RhcnRfc3RhY2sgPSAwOwotI2lmbmRlZiBZWV9OT19QVVNIX1NUQVRFCi1zdGF0aWMgdm9pZCB5eV9wdXNoX3N0YXRlIFlZX1BST1RPKCggaW50IG5ld19zdGF0ZSApKTsKLSNlbmRpZgotI2lmbmRlZiBZWV9OT19QT1BfU1RBVEUKLXN0YXRpYyB2b2lkIHl5X3BvcF9zdGF0ZSBZWV9QUk9UTygoIHZvaWQgKSk7Ci0jZW5kaWYKLSNpZm5kZWYgWVlfTk9fVE9QX1NUQVRFCi1zdGF0aWMgaW50IHl5X3RvcF9zdGF0ZSBZWV9QUk9UTygoIHZvaWQgKSk7Ci0jZW5kaWYKLQotI2Vsc2UKLSNkZWZpbmUgWVlfTk9fUFVTSF9TVEFURSAxCi0jZGVmaW5lIFlZX05PX1BPUF9TVEFURSAxCi0jZGVmaW5lIFlZX05PX1RPUF9TVEFURSAxCi0jZW5kaWYKLQotI2lmZGVmIFlZX01BTExPQ19ERUNMCi1ZWV9NQUxMT0NfREVDTAotI2Vsc2UKLSNpZiBfX1NURENfXwotI2lmbmRlZiBfX2NwbHVzcGx1cwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jZWxzZQotLyogSnVzdCB0cnkgdG8gZ2V0IGJ5IHdpdGhvdXQgZGVjbGFyaW5nIHRoZSByb3V0aW5lcy4gIFRoaXMgd2lsbCBmYWlsCi0gKiBtaXNlcmFibHkgb24gbm9uLUFOU0kgc3lzdGVtcyBmb3Igd2hpY2ggc2l6ZW9mKHNpemVfdCkgIT0gc2l6ZW9mKGludCkKLSAqIG9yIHNpemVvZih2b2lkKikgIT0gc2l6ZW9mKGludCkuCi0gKi8KLSNlbmRpZgotI2VuZGlmCi0KLS8qIEFtb3VudCBvZiBzdHVmZiB0byBzbHVycCB1cCB3aXRoIGVhY2ggcmVhZC4gKi8KLSNpZm5kZWYgWVlfUkVBRF9CVUZfU0laRQotI2RlZmluZSBZWV9SRUFEX0JVRl9TSVpFIDgxOTIKLSNlbmRpZgotCi0vKiBDb3B5IHdoYXRldmVyIHRoZSBsYXN0IHJ1bGUgbWF0Y2hlZCB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LiAqLwotCi0jaWZuZGVmIEVDSE8KLS8qIFRoaXMgdXNlZCB0byBiZSBhbiBmcHV0cygpLCBidXQgc2luY2UgdGhlIHN0cmluZyBtaWdodCBjb250YWluIE5VTCdzLAotICogd2Ugbm93IHVzZSBmd3JpdGUoKS4KLSAqLwotI2RlZmluZSBFQ0hPICh2b2lkKSBmd3JpdGUoIHl5dGV4dCwgeXlsZW5nLCAxLCB5eW91dCApCi0jZW5kaWYKLQotLyogR2V0cyBpbnB1dCBhbmQgc3R1ZmZzIGl0IGludG8gImJ1ZiIuICBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLCBvciBZWV9OVUxMLAotICogaXMgcmV0dXJuZWQgaW4gInJlc3VsdCIuCi0gKi8KLSNpZm5kZWYgWVlfSU5QVVQKLSNkZWZpbmUgWVlfSU5QVVQoYnVmLHJlc3VsdCxtYXhfc2l6ZSkgXAotCWlmICggeXlfY3VycmVudF9idWZmZXItPnl5X2lzX2ludGVyYWN0aXZlICkgXAotCQl7IFwKLQkJaW50IGMgPSAnKicsIG47IFwKLQkJZm9yICggbiA9IDA7IG4gPCBtYXhfc2l6ZSAmJiBcCi0JCQkgICAgIChjID0gZ2V0YyggeXlpbiApKSAhPSBFT0YgJiYgYyAhPSAnXG4nOyArK24gKSBcCi0JCQlidWZbbl0gPSAoY2hhcikgYzsgXAotCQlpZiAoIGMgPT0gJ1xuJyApIFwKLQkJCWJ1ZltuKytdID0gKGNoYXIpIGM7IFwKLQkJaWYgKCBjID09IEVPRiAmJiBmZXJyb3IoIHl5aW4gKSApIFwKLQkJCVlZX0ZBVEFMX0VSUk9SKCAiaW5wdXQgaW4gZmxleCBzY2FubmVyIGZhaWxlZCIgKTsgXAotCQlyZXN1bHQgPSBuOyBcCi0JCX0gXAotCWVsc2UgaWYgKCAoKHJlc3VsdCA9IGZyZWFkKCBidWYsIDEsIG1heF9zaXplLCB5eWluICkpID09IDApIFwKLQkJICAmJiBmZXJyb3IoIHl5aW4gKSApIFwKLQkJWVlfRkFUQUxfRVJST1IoICJpbnB1dCBpbiBmbGV4IHNjYW5uZXIgZmFpbGVkIiApOwotI2VuZGlmCi0KLS8qIE5vIHNlbWktY29sb24gYWZ0ZXIgcmV0dXJuOyBjb3JyZWN0IHVzYWdlIGlzIHRvIHdyaXRlICJ5eXRlcm1pbmF0ZSgpOyIgLQotICogd2UgZG9uJ3Qgd2FudCBhbiBleHRyYSAnOycgYWZ0ZXIgdGhlICJyZXR1cm4iIGJlY2F1c2UgdGhhdCB3aWxsIGNhdXNlCi0gKiBzb21lIGNvbXBpbGVycyB0byBjb21wbGFpbiBhYm91dCB1bnJlYWNoYWJsZSBzdGF0ZW1lbnRzLgotICovCi0jaWZuZGVmIHl5dGVybWluYXRlCi0jZGVmaW5lIHl5dGVybWluYXRlKCkgcmV0dXJuIFlZX05VTEwKLSNlbmRpZgotCi0vKiBOdW1iZXIgb2YgZW50cmllcyBieSB3aGljaCBzdGFydC1jb25kaXRpb24gc3RhY2sgZ3Jvd3MuICovCi0jaWZuZGVmIFlZX1NUQVJUX1NUQUNLX0lOQ1IKLSNkZWZpbmUgWVlfU1RBUlRfU1RBQ0tfSU5DUiAyNQotI2VuZGlmCi0KLS8qIFJlcG9ydCBhIGZhdGFsIGVycm9yLiAqLwotI2lmbmRlZiBZWV9GQVRBTF9FUlJPUgotI2RlZmluZSBZWV9GQVRBTF9FUlJPUihtc2cpIHl5X2ZhdGFsX2Vycm9yKCBtc2cgKQotI2VuZGlmCi0KLS8qIERlZmF1bHQgZGVjbGFyYXRpb24gb2YgZ2VuZXJhdGVkIHNjYW5uZXIgLSBhIGRlZmluZSBzbyB0aGUgdXNlciBjYW4KLSAqIGVhc2lseSBhZGQgcGFyYW1ldGVycy4KLSAqLwotI2lmbmRlZiBZWV9ERUNMCi0jZGVmaW5lIFlZX0RFQ0wgaW50IHl5bGV4IFlZX1BST1RPKCggdm9pZCApKQotI2VuZGlmCi0KLS8qIENvZGUgZXhlY3V0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJ1bGUsIGFmdGVyIHl5dGV4dCBhbmQgeXlsZW5nCi0gKiBoYXZlIGJlZW4gc2V0IHVwLgotICovCi0jaWZuZGVmIFlZX1VTRVJfQUNUSU9OCi0jZGVmaW5lIFlZX1VTRVJfQUNUSU9OCi0jZW5kaWYKLQotLyogQ29kZSBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIGVhY2ggcnVsZS4gKi8KLSNpZm5kZWYgWVlfQlJFQUsKLSNkZWZpbmUgWVlfQlJFQUsgYnJlYWs7Ci0jZW5kaWYKLQotI2RlZmluZSBZWV9SVUxFX1NFVFVQIFwKLQlZWV9VU0VSX0FDVElPTgotCi1ZWV9ERUNMCi0JewotCXJlZ2lzdGVyIHl5X3N0YXRlX3R5cGUgeXlfY3VycmVudF9zdGF0ZTsKLQlyZWdpc3RlciBjaGFyICp5eV9jcCwgKnl5X2JwOwotCXJlZ2lzdGVyIGludCB5eV9hY3Q7Ci0KLSNsaW5lIDk0ICJzc2xfZXhwcl9zY2FuLmwiCi0KLSAgCi0gIGNoYXIgIGNhU3RyW01BWF9TVFJfTEVOXTsKLSAgY2hhciAqY3BTdHIgPSBOVUxMOwotICBjaGFyICBjYVJlZ2V4W01BWF9TVFJfTEVOXTsKLSAgY2hhciAqY3BSZWdleCA9IE5VTEw7Ci0gIGNoYXIgIGNSZWdleERlbCA9IE5VTDsKLQotIC8qCi0gICogV2hpdGVzcGFjZXMKLSAgKi8KLSNsaW5lIDcwMCAibGV4LnNzbF9leHByX3l5LmMiCi0KLQlpZiAoIHl5X2luaXQgKQotCQl7Ci0JCXl5X2luaXQgPSAwOwotCi0jaWZkZWYgWVlfVVNFUl9JTklUCi0JCVlZX1VTRVJfSU5JVDsKLSNlbmRpZgotCi0JCWlmICggISB5eV9zdGFydCApCi0JCQl5eV9zdGFydCA9IDE7CS8qIGZpcnN0IHN0YXJ0IHN0YXRlICovCi0KLQkJaWYgKCAhIHl5aW4gKQotCQkJeXlpbiA9IHN0ZGluOwotCi0JCWlmICggISB5eW91dCApCi0JCQl5eW91dCA9IHN0ZG91dDsKLQotCQlpZiAoICEgeXlfY3VycmVudF9idWZmZXIgKQotCQkJeXlfY3VycmVudF9idWZmZXIgPQotCQkJCXl5X2NyZWF0ZV9idWZmZXIoIHl5aW4sIFlZX0JVRl9TSVpFICk7Ci0KLQkJeXlfbG9hZF9idWZmZXJfc3RhdGUoKTsKLQkJfQotCi0Jd2hpbGUgKCAxICkJCS8qIGxvb3BzIHVudGlsIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQgKi8KLQkJewotCQl5eV9jcCA9IHl5X2NfYnVmX3A7Ci0KLQkJLyogU3VwcG9ydCBvZiB5eXRleHQuICovCi0JCSp5eV9jcCA9IHl5X2hvbGRfY2hhcjsKLQotCQkvKiB5eV9icCBwb2ludHMgdG8gdGhlIHBvc2l0aW9uIGluIHl5X2NoX2J1ZiBvZiB0aGUgc3RhcnQgb2YKLQkJICogdGhlIGN1cnJlbnQgcnVuLgotCQkgKi8KLQkJeXlfYnAgPSB5eV9jcDsKLQotCQl5eV9jdXJyZW50X3N0YXRlID0geXlfc3RhcnQ7Ci15eV9tYXRjaDoKLQkJZG8KLQkJCXsKLQkJCXJlZ2lzdGVyIFlZX0NIQVIgeXlfYyA9IHl5X2VjW1lZX1NDX1RPX1VJKCp5eV9jcCldOwotCQkJaWYgKCB5eV9hY2NlcHRbeXlfY3VycmVudF9zdGF0ZV0gKQotCQkJCXsKLQkJCQl5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZSA9IHl5X2N1cnJlbnRfc3RhdGU7Ci0JCQkJeXlfbGFzdF9hY2NlcHRpbmdfY3BvcyA9IHl5X2NwOwotCQkJCX0KLQkJCXdoaWxlICggeXlfY2hrW3l5X2Jhc2VbeXlfY3VycmVudF9zdGF0ZV0gKyB5eV9jXSAhPSB5eV9jdXJyZW50X3N0YXRlICkKLQkJCQl7Ci0JCQkJeXlfY3VycmVudF9zdGF0ZSA9IChpbnQpIHl5X2RlZlt5eV9jdXJyZW50X3N0YXRlXTsKLQkJCQlpZiAoIHl5X2N1cnJlbnRfc3RhdGUgPj0gODYgKQotCQkJCQl5eV9jID0geXlfbWV0YVsodW5zaWduZWQgaW50KSB5eV9jXTsKLQkJCQl9Ci0JCQl5eV9jdXJyZW50X3N0YXRlID0geXlfbnh0W3l5X2Jhc2VbeXlfY3VycmVudF9zdGF0ZV0gKyAodW5zaWduZWQgaW50KSB5eV9jXTsKLQkJCSsreXlfY3A7Ci0JCQl9Ci0JCXdoaWxlICggeXlfY3VycmVudF9zdGF0ZSAhPSA4NSApOwotCQl5eV9jcCA9IHl5X2xhc3RfYWNjZXB0aW5nX2Nwb3M7Ci0JCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZTsKLQoteXlfZmluZF9hY3Rpb246Ci0JCXl5X2FjdCA9IHl5X2FjY2VwdFt5eV9jdXJyZW50X3N0YXRlXTsKLQotCQlZWV9ET19CRUZPUkVfQUNUSU9OOwotCi0KLWRvX2FjdGlvbjoJLyogVGhpcyBsYWJlbCBpcyB1c2VkIG9ubHkgdG8gYWNjZXNzIEVPRiBhY3Rpb25zLiAqLwotCi0KLQkJc3dpdGNoICggeXlfYWN0ICkKLQl7IC8qIGJlZ2lubmluZyBvZiBhY3Rpb24gc3dpdGNoICovCi0JCQljYXNlIDA6IC8qIG11c3QgYmFjayB1cCAqLwotCQkJLyogdW5kbyB0aGUgZWZmZWN0cyBvZiBZWV9ET19CRUZPUkVfQUNUSU9OICovCi0JCQkqeXlfY3AgPSB5eV9ob2xkX2NoYXI7Ci0JCQl5eV9jcCA9IHl5X2xhc3RfYWNjZXB0aW5nX2Nwb3M7Ci0JCQl5eV9jdXJyZW50X3N0YXRlID0geXlfbGFzdF9hY2NlcHRpbmdfc3RhdGU7Ci0JCQlnb3RvIHl5X2ZpbmRfYWN0aW9uOwotCi1jYXNlIDE6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSAxMDUgInNzbF9leHByX3NjYW4ubCIKLXsgCi0gICAgLyogTk9QICovCi19Ci0JWVlfQlJFQUsKLS8qCi0gICogQy1zdHlsZSBzdHJpbmdzICgiLi4uIikKLSAgKi8KLWNhc2UgMjoKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDExMiAic3NsX2V4cHJfc2Nhbi5sIgotewotICAgIGNwU3RyID0gY2FTdHI7Ci0gICAgQkVHSU4oc3RyKTsKLX0KLQlZWV9CUkVBSwotY2FzZSAzOgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMTE2ICJzc2xfZXhwcl9zY2FuLmwiCi17Ci0gICAgQkVHSU4oSU5JVElBTCk7Ci0gICAgKmNwU3RyID0gTlVMOwotICAgIHl5bHZhbC5jcFZhbCA9IGFwX3BzdHJkdXAoc3NsX2V4cHJfaW5mby5wb29sLCBjYVN0cik7Ci0gICAgcmV0dXJuIFRfU1RSSU5HOwotfQotCVlZX0JSRUFLCi1jYXNlIDQ6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSAxMjIgInNzbF9leHByX3NjYW4ubCIKLXsKLSAgICB5eWVycm9yKCJVbnRlcm1pbmF0ZWQgc3RyaW5nIik7Ci19Ci0JWVlfQlJFQUsKLWNhc2UgNToKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDEyNSAic3NsX2V4cHJfc2Nhbi5sIgotewotICAgIGludCByZXN1bHQ7Ci0KLSAgICAodm9pZClzc2NhbmYoeXl0ZXh0KzEsICIlbyIsICZyZXN1bHQpOwotICAgIGlmIChyZXN1bHQgPiAweGZmKQotICAgICAgICB5eWVycm9yKCJFc2NhcGUgc2VxdWVuY2Ugb3V0IG9mIGJvdW5kIik7Ci0gICAgZWxzZQotICAgICAgICAqY3BTdHIrKyA9IHJlc3VsdDsKLX0KLQlZWV9CUkVBSwotY2FzZSA2OgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMTM0ICJzc2xfZXhwcl9zY2FuLmwiCi17Ci0gICAgeXllcnJvcigiQmFkIGVzY2FwZSBzZXF1ZW5jZSIpOwotfQotCVlZX0JSRUFLCi1jYXNlIDc6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSAxMzcgInNzbF9leHByX3NjYW4ubCIKLXsgKmNwU3RyKysgPSAnXG4nOyB9Ci0JWVlfQlJFQUsKLWNhc2UgODoKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDEzOCAic3NsX2V4cHJfc2Nhbi5sIgoteyAqY3BTdHIrKyA9ICdccic7IH0KLQlZWV9CUkVBSwotY2FzZSA5OgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMTM5ICJzc2xfZXhwcl9zY2FuLmwiCi17ICpjcFN0cisrID0gJ1x0JzsgfQotCVlZX0JSRUFLCi1jYXNlIDEwOgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMTQwICJzc2xfZXhwcl9zY2FuLmwiCi17ICpjcFN0cisrID0gJ1xiJzsgfQotCVlZX0JSRUFLCi1jYXNlIDExOgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMTQxICJzc2xfZXhwcl9zY2FuLmwiCi17ICpjcFN0cisrID0gJ1xmJzsgfQotCVlZX0JSRUFLCi1jYXNlIDEyOgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMTQyICJzc2xfZXhwcl9zY2FuLmwiCi17Ci0gICAgKmNwU3RyKysgPSB5eXRleHRbMV07Ci19Ci0JWVlfQlJFQUsKLWNhc2UgMTM6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSAxNDUgInNzbF9leHByX3NjYW4ubCIKLXsKLSAgICBjaGFyICpjcCA9IHl5dGV4dDsKLSAgICB3aGlsZSAoKmNwICE9IE5VTCkKLSAgICAgICAgKmNwU3RyKysgPSAqY3ArKzsKLX0KLQlZWV9CUkVBSwotY2FzZSAxNDoKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDE1MCAic3NsX2V4cHJfc2Nhbi5sIgotewotICAgICpjcFN0cisrID0geXl0ZXh0WzFdOwotfQotCVlZX0JSRUFLCi0vKgotICAqIFJlZ3VsYXIgRXhwcmVzc2lvbgotICAqLwotY2FzZSAxNToKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDE1NyAic3NsX2V4cHJfc2Nhbi5sIgotewotICAgIGNSZWdleERlbCA9IHl5dGV4dFsxXTsKLSAgICBjcFJlZ2V4ID0gY2FSZWdleDsKLSAgICBCRUdJTihyZWdleCk7Ci19Ci0JWVlfQlJFQUsKLWNhc2UgMTY6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSAxNjIgInNzbF9leHByX3NjYW4ubCIKLXsKLSAgICBpZiAoeXl0ZXh0WzBdID09IGNSZWdleERlbCkgewotICAgICAgICAqY3BSZWdleCA9IE5VTDsKLSAgICAgICAgQkVHSU4ocmVnZXhfZmxhZ3MpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgKmNwUmVnZXgrKyA9IHl5dGV4dFswXTsKLSAgICB9Ci19Ci0JWVlfQlJFQUsKLWNhc2UgMTc6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSAxNzEgInNzbF9leHByX3NjYW4ubCIKLXsKLSAgICB5eWx2YWwuY3BWYWwgPSBhcF9wc3RyZHVwKHNzbF9leHByX2luZm8ucG9vbCwgY2FSZWdleCk7Ci0gICAgQkVHSU4oSU5JVElBTCk7Ci0gICAgcmV0dXJuIFRfUkVHRVhfSTsKLX0KLQlZWV9CUkVBSwotY2FzZSAxODoKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDE3NiAic3NsX2V4cHJfc2Nhbi5sIgotewotICAgIHl5bHZhbC5jcFZhbCA9IGFwX3BzdHJkdXAoc3NsX2V4cHJfaW5mby5wb29sLCBjYVJlZ2V4KTsKLSAgICB5eWxlc3MoMCk7Ci0gICAgQkVHSU4oSU5JVElBTCk7Ci0gICAgcmV0dXJuIFRfUkVHRVg7Ci19Ci0JWVlfQlJFQUsKLWNhc2UgWVlfU1RBVEVfRU9GKHJlZ2V4X2ZsYWdzKToKLSNsaW5lIDE4MiAic3NsX2V4cHJfc2Nhbi5sIgotewotICAgIHl5bHZhbC5jcFZhbCA9IGFwX3BzdHJkdXAoc3NsX2V4cHJfaW5mby5wb29sLCBjYVJlZ2V4KTsKLSAgICBCRUdJTihJTklUSUFMKTsKLSAgICByZXR1cm4gVF9SRUdFWDsKLX0KLQlZWV9CUkVBSwotLyoKLSAgKiBPcGVyYXRvcnMKLSAgKi8KLWNhc2UgMTk6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSAxOTEgInNzbF9leHByX3NjYW4ubCIKLXsgcmV0dXJuIFRfT1BfRVE7IH0KLQlZWV9CUkVBSwotY2FzZSAyMDoKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDE5MiAic3NsX2V4cHJfc2Nhbi5sIgoteyByZXR1cm4gVF9PUF9FUTsgfQotCVlZX0JSRUFLCi1jYXNlIDIxOgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMTkzICJzc2xfZXhwcl9zY2FuLmwiCi17IHJldHVybiBUX09QX05FOyB9Ci0JWVlfQlJFQUsKLWNhc2UgMjI6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSAxOTQgInNzbF9leHByX3NjYW4ubCIKLXsgcmV0dXJuIFRfT1BfTkU7IH0KLQlZWV9CUkVBSwotY2FzZSAyMzoKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDE5NSAic3NsX2V4cHJfc2Nhbi5sIgoteyByZXR1cm4gVF9PUF9MVDsgfQotCVlZX0JSRUFLCi1jYXNlIDI0OgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMTk2ICJzc2xfZXhwcl9zY2FuLmwiCi17IHJldHVybiBUX09QX0xUOyB9Ci0JWVlfQlJFQUsKLWNhc2UgMjU6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSAxOTcgInNzbF9leHByX3NjYW4ubCIKLXsgcmV0dXJuIFRfT1BfTEU7IH0KLQlZWV9CUkVBSwotY2FzZSAyNjoKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDE5OCAic3NsX2V4cHJfc2Nhbi5sIgoteyByZXR1cm4gVF9PUF9MRTsgfQotCVlZX0JSRUFLCi1jYXNlIDI3OgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMTk5ICJzc2xfZXhwcl9zY2FuLmwiCi17IHJldHVybiBUX09QX0dUOyB9Ci0JWVlfQlJFQUsKLWNhc2UgMjg6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSAyMDAgInNzbF9leHByX3NjYW4ubCIKLXsgcmV0dXJuIFRfT1BfR1Q7IH0KLQlZWV9CUkVBSwotY2FzZSAyOToKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDIwMSAic3NsX2V4cHJfc2Nhbi5sIgoteyByZXR1cm4gVF9PUF9HRTsgfQotCVlZX0JSRUFLCi1jYXNlIDMwOgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMjAyICJzc2xfZXhwcl9zY2FuLmwiCi17IHJldHVybiBUX09QX0dFOyB9Ci0JWVlfQlJFQUsKLWNhc2UgMzE6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSAyMDMgInNzbF9leHByX3NjYW4ubCIKLXsgcmV0dXJuIFRfT1BfUkVHOyB9Ci0JWVlfQlJFQUsKLWNhc2UgMzI6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSAyMDQgInNzbF9leHByX3NjYW4ubCIKLXsgcmV0dXJuIFRfT1BfTlJFOyB9Ci0JWVlfQlJFQUsKLWNhc2UgMzM6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSAyMDUgInNzbF9leHByX3NjYW4ubCIKLXsgcmV0dXJuIFRfT1BfQU5EOyB9Ci0JWVlfQlJFQUsKLWNhc2UgMzQ6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSAyMDYgInNzbF9leHByX3NjYW4ubCIKLXsgcmV0dXJuIFRfT1BfQU5EOyB9Ci0JWVlfQlJFQUsKLWNhc2UgMzU6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSAyMDcgInNzbF9leHByX3NjYW4ubCIKLXsgcmV0dXJuIFRfT1BfT1I7IH0KLQlZWV9CUkVBSwotY2FzZSAzNjoKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDIwOCAic3NsX2V4cHJfc2Nhbi5sIgoteyByZXR1cm4gVF9PUF9PUjsgfQotCVlZX0JSRUFLCi1jYXNlIDM3OgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMjA5ICJzc2xfZXhwcl9zY2FuLmwiCi17IHJldHVybiBUX09QX05PVDsgfQotCVlZX0JSRUFLCi1jYXNlIDM4OgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMjEwICJzc2xfZXhwcl9zY2FuLmwiCi17IHJldHVybiBUX09QX05PVDsgfQotCVlZX0JSRUFLCi1jYXNlIDM5OgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMjExICJzc2xfZXhwcl9zY2FuLmwiCi17IHJldHVybiBUX09QX0lOOyB9Ci0JWVlfQlJFQUsKLS8qCi0gICogRnVuY3Rpb25zCi0gICovCi1jYXNlIDQwOgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMjE2ICJzc2xfZXhwcl9zY2FuLmwiCi17IHJldHVybiBUX0ZVTkNfRklMRTsgfQotCVlZX0JSRUFLCi0vKgotICAqIFNwZWNpYWxzCi0gICovCi1jYXNlIDQxOgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMjIxICJzc2xfZXhwcl9zY2FuLmwiCi17IHJldHVybiBUX1RSVUU7IH0KLQlZWV9CUkVBSwotY2FzZSA0MjoKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDIyMiAic3NsX2V4cHJfc2Nhbi5sIgoteyByZXR1cm4gVF9GQUxTRTsgfQotCVlZX0JSRUFLCi0vKgotICAqIERpZ2l0cwotICAqLwotY2FzZSA0MzoKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDIyNyAic3NsX2V4cHJfc2Nhbi5sIgotewotICAgIHl5bHZhbC5jcFZhbCA9IGFwX3BzdHJkdXAoc3NsX2V4cHJfaW5mby5wb29sLCB5eXRleHQpOwotICAgIHJldHVybiBUX0RJR0lUOwotfQotCVlZX0JSRUFLCi0vKgotICAqIElkZW50aWZpZXJzCi0gICovCi1jYXNlIDQ0OgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMjM1ICJzc2xfZXhwcl9zY2FuLmwiCi17Ci0gICAgeXlsdmFsLmNwVmFsID0gYXBfcHN0cmR1cChzc2xfZXhwcl9pbmZvLnBvb2wsIHl5dGV4dCk7Ci0gICAgcmV0dXJuIFRfSUQ7Ci19Ci0JWVlfQlJFQUsKLS8qCi0gICogQW55dGhpbmcgZWxzZSBpcyByZXR1cm5lZCBhcyBpcy4uLgotICAqLwotY2FzZSA0NToKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDI0MyAic3NsX2V4cHJfc2Nhbi5sIgoteyAKLSAgICByZXR1cm4geXl0ZXh0WzBdOwotfQotCVlZX0JSRUFLCi1jYXNlIDQ2OgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMjQ3ICJzc2xfZXhwcl9zY2FuLmwiCi1ZWV9GQVRBTF9FUlJPUiggImZsZXggc2Nhbm5lciBqYW1tZWQiICk7Ci0JWVlfQlJFQUsKLSNsaW5lIDExMDAgImxleC5zc2xfZXhwcl95eS5jIgotY2FzZSBZWV9TVEFURV9FT0YoSU5JVElBTCk6Ci1jYXNlIFlZX1NUQVRFX0VPRihzdHIpOgotY2FzZSBZWV9TVEFURV9FT0YocmVnZXgpOgotCXl5dGVybWluYXRlKCk7Ci0KLQljYXNlIFlZX0VORF9PRl9CVUZGRVI6Ci0JCXsKLQkJLyogQW1vdW50IG9mIHRleHQgbWF0Y2hlZCBub3QgaW5jbHVkaW5nIHRoZSBFT0IgY2hhci4gKi8KLQkJaW50IHl5X2Ftb3VudF9vZl9tYXRjaGVkX3RleHQgPSAoaW50KSAoeXlfY3AgLSB5eXRleHRfcHRyKSAtIDE7Ci0KLQkJLyogVW5kbyB0aGUgZWZmZWN0cyBvZiBZWV9ET19CRUZPUkVfQUNUSU9OLiAqLwotCQkqeXlfY3AgPSB5eV9ob2xkX2NoYXI7Ci0JCVlZX1JFU1RPUkVfWVlfTU9SRV9PRkZTRVQKLQotCQlpZiAoIHl5X2N1cnJlbnRfYnVmZmVyLT55eV9idWZmZXJfc3RhdHVzID09IFlZX0JVRkZFUl9ORVcgKQotCQkJewotCQkJLyogV2UncmUgc2Nhbm5pbmcgYSBuZXcgZmlsZSBvciBpbnB1dCBzb3VyY2UuICBJdCdzCi0JCQkgKiBwb3NzaWJsZSB0aGF0IHRoaXMgaGFwcGVuZWQgYmVjYXVzZSB0aGUgdXNlcgotCQkJICoganVzdCBwb2ludGVkIHl5aW4gYXQgYSBuZXcgc291cmNlIGFuZCBjYWxsZWQKLQkJCSAqIHl5bGV4KCkuICBJZiBzbywgdGhlbiB3ZSBoYXZlIHRvIGFzc3VyZQotCQkJICogY29uc2lzdGVuY3kgYmV0d2VlbiB5eV9jdXJyZW50X2J1ZmZlciBhbmQgb3VyCi0JCQkgKiBnbG9iYWxzLiAgSGVyZSBpcyB0aGUgcmlnaHQgcGxhY2UgdG8gZG8gc28sIGJlY2F1c2UKLQkJCSAqIHRoaXMgaXMgdGhlIGZpcnN0IGFjdGlvbiAob3RoZXIgdGhhbiBwb3NzaWJseSBhCi0JCQkgKiBiYWNrLXVwKSB0aGF0IHdpbGwgbWF0Y2ggZm9yIHRoZSBuZXcgaW5wdXQgc291cmNlLgotCQkJICovCi0JCQl5eV9uX2NoYXJzID0geXlfY3VycmVudF9idWZmZXItPnl5X25fY2hhcnM7Ci0JCQl5eV9jdXJyZW50X2J1ZmZlci0+eXlfaW5wdXRfZmlsZSA9IHl5aW47Ci0JCQl5eV9jdXJyZW50X2J1ZmZlci0+eXlfYnVmZmVyX3N0YXR1cyA9IFlZX0JVRkZFUl9OT1JNQUw7Ci0JCQl9Ci0KLQkJLyogTm90ZSB0aGF0IGhlcmUgd2UgdGVzdCBmb3IgeXlfY19idWZfcCAiPD0iIHRvIHRoZSBwb3NpdGlvbgotCQkgKiBvZiB0aGUgZmlyc3QgRU9CIGluIHRoZSBidWZmZXIsIHNpbmNlIHl5X2NfYnVmX3Agd2lsbAotCQkgKiBhbHJlYWR5IGhhdmUgYmVlbiBpbmNyZW1lbnRlZCBwYXN0IHRoZSBOVUwgY2hhcmFjdGVyCi0JCSAqIChzaW5jZSBhbGwgc3RhdGVzIG1ha2UgdHJhbnNpdGlvbnMgb24gRU9CIHRvIHRoZQotCQkgKiBlbmQtb2YtYnVmZmVyIHN0YXRlKS4gIENvbnRyYXN0IHRoaXMgd2l0aCB0aGUgdGVzdAotCQkgKiBpbiBpbnB1dCgpLgotCQkgKi8KLQkJaWYgKCB5eV9jX2J1Zl9wIDw9ICZ5eV9jdXJyZW50X2J1ZmZlci0+eXlfY2hfYnVmW3l5X25fY2hhcnNdICkKLQkJCXsgLyogVGhpcyB3YXMgcmVhbGx5IGEgTlVMLiAqLwotCQkJeXlfc3RhdGVfdHlwZSB5eV9uZXh0X3N0YXRlOwotCi0JCQl5eV9jX2J1Zl9wID0geXl0ZXh0X3B0ciArIHl5X2Ftb3VudF9vZl9tYXRjaGVkX3RleHQ7Ci0KLQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9nZXRfcHJldmlvdXNfc3RhdGUoKTsKLQotCQkJLyogT2theSwgd2UncmUgbm93IHBvc2l0aW9uZWQgdG8gbWFrZSB0aGUgTlVMCi0JCQkgKiB0cmFuc2l0aW9uLiAgV2UgY291bGRuJ3QgaGF2ZQotCQkJICogeXlfZ2V0X3ByZXZpb3VzX3N0YXRlKCkgZ28gYWhlYWQgYW5kIGRvIGl0Ci0JCQkgKiBmb3IgdXMgYmVjYXVzZSBpdCBkb2Vzbid0IGtub3cgaG93IHRvIGRlYWwKLQkJCSAqIHdpdGggdGhlIHBvc3NpYmlsaXR5IG9mIGphbW1pbmcgKGFuZCB3ZSBkb24ndAotCQkJICogd2FudCB0byBidWlsZCBqYW1taW5nIGludG8gaXQgYmVjYXVzZSB0aGVuIGl0Ci0JCQkgKiB3aWxsIHJ1biBtb3JlIHNsb3dseSkuCi0JCQkgKi8KLQotCQkJeXlfbmV4dF9zdGF0ZSA9IHl5X3RyeV9OVUxfdHJhbnMoIHl5X2N1cnJlbnRfc3RhdGUgKTsKLQotCQkJeXlfYnAgPSB5eXRleHRfcHRyICsgWVlfTU9SRV9BREo7Ci0KLQkJCWlmICggeXlfbmV4dF9zdGF0ZSApCi0JCQkJewotCQkJCS8qIENvbnN1bWUgdGhlIE5VTC4gKi8KLQkJCQl5eV9jcCA9ICsreXlfY19idWZfcDsKLQkJCQl5eV9jdXJyZW50X3N0YXRlID0geXlfbmV4dF9zdGF0ZTsKLQkJCQlnb3RvIHl5X21hdGNoOwotCQkJCX0KLQotCQkJZWxzZQotCQkJCXsKLQkJCQl5eV9jcCA9IHl5X2xhc3RfYWNjZXB0aW5nX2Nwb3M7Ci0JCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X2xhc3RfYWNjZXB0aW5nX3N0YXRlOwotCQkJCWdvdG8geXlfZmluZF9hY3Rpb247Ci0JCQkJfQotCQkJfQotCi0JCWVsc2Ugc3dpdGNoICggeXlfZ2V0X25leHRfYnVmZmVyKCkgKQotCQkJewotCQkJY2FzZSBFT0JfQUNUX0VORF9PRl9GSUxFOgotCQkJCXsKLQkJCQl5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YgPSAwOwotCi0JCQkJaWYgKCB5eXdyYXAoKSApCi0JCQkJCXsKLQkJCQkJLyogTm90ZTogYmVjYXVzZSB3ZSd2ZSB0YWtlbiBjYXJlIGluCi0JCQkJCSAqIHl5X2dldF9uZXh0X2J1ZmZlcigpIHRvIGhhdmUgc2V0IHVwCi0JCQkJCSAqIHl5dGV4dCwgd2UgY2FuIG5vdyBzZXQgdXAKLQkJCQkJICogeXlfY19idWZfcCBzbyB0aGF0IGlmIHNvbWUgdG90YWwKLQkJCQkJICogaG9zZXIgKGxpa2UgZmxleCBpdHNlbGYpIHdhbnRzIHRvCi0JCQkJCSAqIGNhbGwgdGhlIHNjYW5uZXIgYWZ0ZXIgd2UgcmV0dXJuIHRoZQotCQkJCQkgKiBZWV9OVUxMLCBpdCdsbCBzdGlsbCB3b3JrIC0gYW5vdGhlcgotCQkJCQkgKiBZWV9OVUxMIHdpbGwgZ2V0IHJldHVybmVkLgotCQkJCQkgKi8KLQkJCQkJeXlfY19idWZfcCA9IHl5dGV4dF9wdHIgKyBZWV9NT1JFX0FESjsKLQotCQkJCQl5eV9hY3QgPSBZWV9TVEFURV9FT0YoWVlfU1RBUlQpOwotCQkJCQlnb3RvIGRvX2FjdGlvbjsKLQkJCQkJfQotCi0JCQkJZWxzZQotCQkJCQl7Ci0JCQkJCWlmICggISB5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YgKQotCQkJCQkJWVlfTkVXX0ZJTEU7Ci0JCQkJCX0KLQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCWNhc2UgRU9CX0FDVF9DT05USU5VRV9TQ0FOOgotCQkJCXl5X2NfYnVmX3AgPQotCQkJCQl5eXRleHRfcHRyICsgeXlfYW1vdW50X29mX21hdGNoZWRfdGV4dDsKLQotCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9nZXRfcHJldmlvdXNfc3RhdGUoKTsKLQotCQkJCXl5X2NwID0geXlfY19idWZfcDsKLQkJCQl5eV9icCA9IHl5dGV4dF9wdHIgKyBZWV9NT1JFX0FESjsKLQkJCQlnb3RvIHl5X21hdGNoOwotCi0JCQljYXNlIEVPQl9BQ1RfTEFTVF9NQVRDSDoKLQkJCQl5eV9jX2J1Zl9wID0KLQkJCQkmeXlfY3VycmVudF9idWZmZXItPnl5X2NoX2J1Zlt5eV9uX2NoYXJzXTsKLQotCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9nZXRfcHJldmlvdXNfc3RhdGUoKTsKLQotCQkJCXl5X2NwID0geXlfY19idWZfcDsKLQkJCQl5eV9icCA9IHl5dGV4dF9wdHIgKyBZWV9NT1JFX0FESjsKLQkJCQlnb3RvIHl5X2ZpbmRfYWN0aW9uOwotCQkJfQotCQlicmVhazsKLQkJfQotCi0JZGVmYXVsdDoKLQkJWVlfRkFUQUxfRVJST1IoCi0JCQkiZmF0YWwgZmxleCBzY2FubmVyIGludGVybmFsIGVycm9yLS1ubyBhY3Rpb24gZm91bmQiICk7Ci0JfSAvKiBlbmQgb2YgYWN0aW9uIHN3aXRjaCAqLwotCQl9IC8qIGVuZCBvZiBzY2FubmluZyBvbmUgdG9rZW4gKi8KLQl9IC8qIGVuZCBvZiB5eWxleCAqLwotCi0KLS8qIHl5X2dldF9uZXh0X2J1ZmZlciAtIHRyeSB0byByZWFkIGluIGEgbmV3IGJ1ZmZlcgotICoKLSAqIFJldHVybnMgYSBjb2RlIHJlcHJlc2VudGluZyBhbiBhY3Rpb246Ci0gKglFT0JfQUNUX0xBU1RfTUFUQ0ggLQotICoJRU9CX0FDVF9DT05USU5VRV9TQ0FOIC0gY29udGludWUgc2Nhbm5pbmcgZnJvbSBjdXJyZW50IHBvc2l0aW9uCi0gKglFT0JfQUNUX0VORF9PRl9GSUxFIC0gZW5kIG9mIGZpbGUKLSAqLwotCi1zdGF0aWMgaW50IHl5X2dldF9uZXh0X2J1ZmZlcigpCi0JewotCXJlZ2lzdGVyIGNoYXIgKmRlc3QgPSB5eV9jdXJyZW50X2J1ZmZlci0+eXlfY2hfYnVmOwotCXJlZ2lzdGVyIGNoYXIgKnNvdXJjZSA9IHl5dGV4dF9wdHI7Ci0JcmVnaXN0ZXIgaW50IG51bWJlcl90b19tb3ZlLCBpOwotCWludCByZXRfdmFsOwotCi0JaWYgKCB5eV9jX2J1Zl9wID4gJnl5X2N1cnJlbnRfYnVmZmVyLT55eV9jaF9idWZbeXlfbl9jaGFycyArIDFdICkKLQkJWVlfRkFUQUxfRVJST1IoCi0JCSJmYXRhbCBmbGV4IHNjYW5uZXIgaW50ZXJuYWwgZXJyb3ItLWVuZCBvZiBidWZmZXIgbWlzc2VkIiApOwotCi0JaWYgKCB5eV9jdXJyZW50X2J1ZmZlci0+eXlfZmlsbF9idWZmZXIgPT0gMCApCi0JCXsgLyogRG9uJ3QgdHJ5IHRvIGZpbGwgdGhlIGJ1ZmZlciwgc28gdGhpcyBpcyBhbiBFT0YuICovCi0JCWlmICggeXlfY19idWZfcCAtIHl5dGV4dF9wdHIgLSBZWV9NT1JFX0FESiA9PSAxICkKLQkJCXsKLQkJCS8qIFdlIG1hdGNoZWQgYSBzaW5nbGUgY2hhcmFjdGVyLCB0aGUgRU9CLCBzbwotCQkJICogdHJlYXQgdGhpcyBhcyBhIGZpbmFsIEVPRi4KLQkJCSAqLwotCQkJcmV0dXJuIEVPQl9BQ1RfRU5EX09GX0ZJTEU7Ci0JCQl9Ci0KLQkJZWxzZQotCQkJewotCQkJLyogV2UgbWF0Y2hlZCBzb21lIHRleHQgcHJpb3IgdG8gdGhlIEVPQiwgZmlyc3QKLQkJCSAqIHByb2Nlc3MgaXQuCi0JCQkgKi8KLQkJCXJldHVybiBFT0JfQUNUX0xBU1RfTUFUQ0g7Ci0JCQl9Ci0JCX0KLQotCS8qIFRyeSB0byByZWFkIG1vcmUgZGF0YS4gKi8KLQotCS8qIEZpcnN0IG1vdmUgbGFzdCBjaGFycyB0byBzdGFydCBvZiBidWZmZXIuICovCi0JbnVtYmVyX3RvX21vdmUgPSAoaW50KSAoeXlfY19idWZfcCAtIHl5dGV4dF9wdHIpIC0gMTsKLQotCWZvciAoIGkgPSAwOyBpIDwgbnVtYmVyX3RvX21vdmU7ICsraSApCi0JCSooZGVzdCsrKSA9ICooc291cmNlKyspOwotCi0JaWYgKCB5eV9jdXJyZW50X2J1ZmZlci0+eXlfYnVmZmVyX3N0YXR1cyA9PSBZWV9CVUZGRVJfRU9GX1BFTkRJTkcgKQotCQkvKiBkb24ndCBkbyB0aGUgcmVhZCwgaXQncyBub3QgZ3VhcmFudGVlZCB0byByZXR1cm4gYW4gRU9GLAotCQkgKiBqdXN0IGZvcmNlIGFuIEVPRgotCQkgKi8KLQkJeXlfY3VycmVudF9idWZmZXItPnl5X25fY2hhcnMgPSB5eV9uX2NoYXJzID0gMDsKLQotCWVsc2UKLQkJewotCQlpbnQgbnVtX3RvX3JlYWQgPQotCQkJeXlfY3VycmVudF9idWZmZXItPnl5X2J1Zl9zaXplIC0gbnVtYmVyX3RvX21vdmUgLSAxOwotCi0JCXdoaWxlICggbnVtX3RvX3JlYWQgPD0gMCApCi0JCQl7IC8qIE5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgYnVmZmVyIC0gZ3JvdyBpdC4gKi8KLSNpZmRlZiBZWV9VU0VTX1JFSkVDVAotCQkJWVlfRkFUQUxfRVJST1IoCi0iaW5wdXQgYnVmZmVyIG92ZXJmbG93LCBjYW4ndCBlbmxhcmdlIGJ1ZmZlciBiZWNhdXNlIHNjYW5uZXIgdXNlcyBSRUpFQ1QiICk7Ci0jZWxzZQotCi0JCQkvKiBqdXN0IGEgc2hvcnRlciBuYW1lIGZvciB0aGUgY3VycmVudCBidWZmZXIgKi8KLQkJCVlZX0JVRkZFUl9TVEFURSBiID0geXlfY3VycmVudF9idWZmZXI7Ci0KLQkJCWludCB5eV9jX2J1Zl9wX29mZnNldCA9Ci0JCQkJKGludCkgKHl5X2NfYnVmX3AgLSBiLT55eV9jaF9idWYpOwotCi0JCQlpZiAoIGItPnl5X2lzX291cl9idWZmZXIgKQotCQkJCXsKLQkJCQlpbnQgbmV3X3NpemUgPSBiLT55eV9idWZfc2l6ZSAqIDI7Ci0KLQkJCQlpZiAoIG5ld19zaXplIDw9IDAgKQotCQkJCQliLT55eV9idWZfc2l6ZSArPSBiLT55eV9idWZfc2l6ZSAvIDg7Ci0JCQkJZWxzZQotCQkJCQliLT55eV9idWZfc2l6ZSAqPSAyOwotCi0JCQkJYi0+eXlfY2hfYnVmID0gKGNoYXIgKikKLQkJCQkJLyogSW5jbHVkZSByb29tIGluIGZvciAyIEVPQiBjaGFycy4gKi8KLQkJCQkJeXlfZmxleF9yZWFsbG9jKCAodm9pZCAqKSBiLT55eV9jaF9idWYsCi0JCQkJCQkJIGItPnl5X2J1Zl9zaXplICsgMiApOwotCQkJCX0KLQkJCWVsc2UKLQkJCQkvKiBDYW4ndCBncm93IGl0LCB3ZSBkb24ndCBvd24gaXQuICovCi0JCQkJYi0+eXlfY2hfYnVmID0gMDsKLQotCQkJaWYgKCAhIGItPnl5X2NoX2J1ZiApCi0JCQkJWVlfRkFUQUxfRVJST1IoCi0JCQkJImZhdGFsIGVycm9yIC0gc2Nhbm5lciBpbnB1dCBidWZmZXIgb3ZlcmZsb3ciICk7Ci0KLQkJCXl5X2NfYnVmX3AgPSAmYi0+eXlfY2hfYnVmW3l5X2NfYnVmX3Bfb2Zmc2V0XTsKLQotCQkJbnVtX3RvX3JlYWQgPSB5eV9jdXJyZW50X2J1ZmZlci0+eXlfYnVmX3NpemUgLQotCQkJCQkJbnVtYmVyX3RvX21vdmUgLSAxOwotI2VuZGlmCi0JCQl9Ci0KLQkJaWYgKCBudW1fdG9fcmVhZCA+IFlZX1JFQURfQlVGX1NJWkUgKQotCQkJbnVtX3RvX3JlYWQgPSBZWV9SRUFEX0JVRl9TSVpFOwotCi0JCS8qIFJlYWQgaW4gbW9yZSBkYXRhLiAqLwotCQlZWV9JTlBVVCggKCZ5eV9jdXJyZW50X2J1ZmZlci0+eXlfY2hfYnVmW251bWJlcl90b19tb3ZlXSksCi0JCQl5eV9uX2NoYXJzLCBudW1fdG9fcmVhZCApOwotCi0JCXl5X2N1cnJlbnRfYnVmZmVyLT55eV9uX2NoYXJzID0geXlfbl9jaGFyczsKLQkJfQotCi0JaWYgKCB5eV9uX2NoYXJzID09IDAgKQotCQl7Ci0JCWlmICggbnVtYmVyX3RvX21vdmUgPT0gWVlfTU9SRV9BREogKQotCQkJewotCQkJcmV0X3ZhbCA9IEVPQl9BQ1RfRU5EX09GX0ZJTEU7Ci0JCQl5eXJlc3RhcnQoIHl5aW4gKTsKLQkJCX0KLQotCQllbHNlCi0JCQl7Ci0JCQlyZXRfdmFsID0gRU9CX0FDVF9MQVNUX01BVENIOwotCQkJeXlfY3VycmVudF9idWZmZXItPnl5X2J1ZmZlcl9zdGF0dXMgPQotCQkJCVlZX0JVRkZFUl9FT0ZfUEVORElORzsKLQkJCX0KLQkJfQotCi0JZWxzZQotCQlyZXRfdmFsID0gRU9CX0FDVF9DT05USU5VRV9TQ0FOOwotCi0JeXlfbl9jaGFycyArPSBudW1iZXJfdG9fbW92ZTsKLQl5eV9jdXJyZW50X2J1ZmZlci0+eXlfY2hfYnVmW3l5X25fY2hhcnNdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOwotCXl5X2N1cnJlbnRfYnVmZmVyLT55eV9jaF9idWZbeXlfbl9jaGFycyArIDFdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOwotCi0JeXl0ZXh0X3B0ciA9ICZ5eV9jdXJyZW50X2J1ZmZlci0+eXlfY2hfYnVmWzBdOwotCi0JcmV0dXJuIHJldF92YWw7Ci0JfQotCi0KLS8qIHl5X2dldF9wcmV2aW91c19zdGF0ZSAtIGdldCB0aGUgc3RhdGUganVzdCBiZWZvcmUgdGhlIEVPQiBjaGFyIHdhcyByZWFjaGVkICovCi0KLXN0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X2dldF9wcmV2aW91c19zdGF0ZSgpCi0JewotCXJlZ2lzdGVyIHl5X3N0YXRlX3R5cGUgeXlfY3VycmVudF9zdGF0ZTsKLQlyZWdpc3RlciBjaGFyICp5eV9jcDsKLQotCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9zdGFydDsKLQotCWZvciAoIHl5X2NwID0geXl0ZXh0X3B0ciArIFlZX01PUkVfQURKOyB5eV9jcCA8IHl5X2NfYnVmX3A7ICsreXlfY3AgKQotCQl7Ci0JCXJlZ2lzdGVyIFlZX0NIQVIgeXlfYyA9ICgqeXlfY3AgPyB5eV9lY1tZWV9TQ19UT19VSSgqeXlfY3ApXSA6IDEpOwotCQlpZiAoIHl5X2FjY2VwdFt5eV9jdXJyZW50X3N0YXRlXSApCi0JCQl7Ci0JCQl5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZSA9IHl5X2N1cnJlbnRfc3RhdGU7Ci0JCQl5eV9sYXN0X2FjY2VwdGluZ19jcG9zID0geXlfY3A7Ci0JCQl9Ci0JCXdoaWxlICggeXlfY2hrW3l5X2Jhc2VbeXlfY3VycmVudF9zdGF0ZV0gKyB5eV9jXSAhPSB5eV9jdXJyZW50X3N0YXRlICkKLQkJCXsKLQkJCXl5X2N1cnJlbnRfc3RhdGUgPSAoaW50KSB5eV9kZWZbeXlfY3VycmVudF9zdGF0ZV07Ci0JCQlpZiAoIHl5X2N1cnJlbnRfc3RhdGUgPj0gODYgKQotCQkJCXl5X2MgPSB5eV9tZXRhWyh1bnNpZ25lZCBpbnQpIHl5X2NdOwotCQkJfQotCQl5eV9jdXJyZW50X3N0YXRlID0geXlfbnh0W3l5X2Jhc2VbeXlfY3VycmVudF9zdGF0ZV0gKyAodW5zaWduZWQgaW50KSB5eV9jXTsKLQkJfQotCi0JcmV0dXJuIHl5X2N1cnJlbnRfc3RhdGU7Ci0JfQotCi0KLS8qIHl5X3RyeV9OVUxfdHJhbnMgLSB0cnkgdG8gbWFrZSBhIHRyYW5zaXRpb24gb24gdGhlIE5VTCBjaGFyYWN0ZXIKLSAqCi0gKiBzeW5vcHNpcwotICoJbmV4dF9zdGF0ZSA9IHl5X3RyeV9OVUxfdHJhbnMoIGN1cnJlbnRfc3RhdGUgKTsKLSAqLwotCi0jaWZkZWYgWVlfVVNFX1BST1RPUwotc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfdHJ5X05VTF90cmFucyggeXlfc3RhdGVfdHlwZSB5eV9jdXJyZW50X3N0YXRlICkKLSNlbHNlCi1zdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV90cnlfTlVMX3RyYW5zKCB5eV9jdXJyZW50X3N0YXRlICkKLXl5X3N0YXRlX3R5cGUgeXlfY3VycmVudF9zdGF0ZTsKLSNlbmRpZgotCXsKLQlyZWdpc3RlciBpbnQgeXlfaXNfamFtOwotCXJlZ2lzdGVyIGNoYXIgKnl5X2NwID0geXlfY19idWZfcDsKLQotCXJlZ2lzdGVyIFlZX0NIQVIgeXlfYyA9IDE7Ci0JaWYgKCB5eV9hY2NlcHRbeXlfY3VycmVudF9zdGF0ZV0gKQotCQl7Ci0JCXl5X2xhc3RfYWNjZXB0aW5nX3N0YXRlID0geXlfY3VycmVudF9zdGF0ZTsKLQkJeXlfbGFzdF9hY2NlcHRpbmdfY3BvcyA9IHl5X2NwOwotCQl9Ci0Jd2hpbGUgKCB5eV9jaGtbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArIHl5X2NdICE9IHl5X2N1cnJlbnRfc3RhdGUgKQotCQl7Ci0JCXl5X2N1cnJlbnRfc3RhdGUgPSAoaW50KSB5eV9kZWZbeXlfY3VycmVudF9zdGF0ZV07Ci0JCWlmICggeXlfY3VycmVudF9zdGF0ZSA+PSA4NiApCi0JCQl5eV9jID0geXlfbWV0YVsodW5zaWduZWQgaW50KSB5eV9jXTsKLQkJfQotCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArICh1bnNpZ25lZCBpbnQpIHl5X2NdOwotCXl5X2lzX2phbSA9ICh5eV9jdXJyZW50X3N0YXRlID09IDg1KTsKLQotCXJldHVybiB5eV9pc19qYW0gPyAwIDogeXlfY3VycmVudF9zdGF0ZTsKLQl9Ci0KLQotI2lmbmRlZiBZWV9OT19VTlBVVAotI2lmZGVmIFlZX1VTRV9QUk9UT1MKLXN0YXRpYyB2b2lkIHl5dW5wdXQoIGludCBjLCByZWdpc3RlciBjaGFyICp5eV9icCApCi0jZWxzZQotc3RhdGljIHZvaWQgeXl1bnB1dCggYywgeXlfYnAgKQotaW50IGM7Ci1yZWdpc3RlciBjaGFyICp5eV9icDsKLSNlbmRpZgotCXsKLQlyZWdpc3RlciBjaGFyICp5eV9jcCA9IHl5X2NfYnVmX3A7Ci0KLQkvKiB1bmRvIGVmZmVjdHMgb2Ygc2V0dGluZyB1cCB5eXRleHQgKi8KLQkqeXlfY3AgPSB5eV9ob2xkX2NoYXI7Ci0KLQlpZiAoIHl5X2NwIDwgeXlfY3VycmVudF9idWZmZXItPnl5X2NoX2J1ZiArIDIgKQotCQl7IC8qIG5lZWQgdG8gc2hpZnQgdGhpbmdzIHVwIHRvIG1ha2Ugcm9vbSAqLwotCQkvKiArMiBmb3IgRU9CIGNoYXJzLiAqLwotCQlyZWdpc3RlciBpbnQgbnVtYmVyX3RvX21vdmUgPSB5eV9uX2NoYXJzICsgMjsKLQkJcmVnaXN0ZXIgY2hhciAqZGVzdCA9ICZ5eV9jdXJyZW50X2J1ZmZlci0+eXlfY2hfYnVmWwotCQkJCQl5eV9jdXJyZW50X2J1ZmZlci0+eXlfYnVmX3NpemUgKyAyXTsKLQkJcmVnaXN0ZXIgY2hhciAqc291cmNlID0KLQkJCQkmeXlfY3VycmVudF9idWZmZXItPnl5X2NoX2J1ZltudW1iZXJfdG9fbW92ZV07Ci0KLQkJd2hpbGUgKCBzb3VyY2UgPiB5eV9jdXJyZW50X2J1ZmZlci0+eXlfY2hfYnVmICkKLQkJCSotLWRlc3QgPSAqLS1zb3VyY2U7Ci0KLQkJeXlfY3AgKz0gKGludCkgKGRlc3QgLSBzb3VyY2UpOwotCQl5eV9icCArPSAoaW50KSAoZGVzdCAtIHNvdXJjZSk7Ci0JCXl5X2N1cnJlbnRfYnVmZmVyLT55eV9uX2NoYXJzID0KLQkJCXl5X25fY2hhcnMgPSB5eV9jdXJyZW50X2J1ZmZlci0+eXlfYnVmX3NpemU7Ci0KLQkJaWYgKCB5eV9jcCA8IHl5X2N1cnJlbnRfYnVmZmVyLT55eV9jaF9idWYgKyAyICkKLQkJCVlZX0ZBVEFMX0VSUk9SKCAiZmxleCBzY2FubmVyIHB1c2gtYmFjayBvdmVyZmxvdyIgKTsKLQkJfQotCi0JKi0teXlfY3AgPSAoY2hhcikgYzsKLQotCi0JeXl0ZXh0X3B0ciA9IHl5X2JwOwotCXl5X2hvbGRfY2hhciA9ICp5eV9jcDsKLQl5eV9jX2J1Zl9wID0geXlfY3A7Ci0JfQotI2VuZGlmCS8qIGlmbmRlZiBZWV9OT19VTlBVVCAqLwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotc3RhdGljIGludCB5eWlucHV0KCkKLSNlbHNlCi1zdGF0aWMgaW50IGlucHV0KCkKLSNlbmRpZgotCXsKLQlpbnQgYzsKLQotCSp5eV9jX2J1Zl9wID0geXlfaG9sZF9jaGFyOwotCi0JaWYgKCAqeXlfY19idWZfcCA9PSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVIgKQotCQl7Ci0JCS8qIHl5X2NfYnVmX3Agbm93IHBvaW50cyB0byB0aGUgY2hhcmFjdGVyIHdlIHdhbnQgdG8gcmV0dXJuLgotCQkgKiBJZiB0aGlzIG9jY3VycyAqYmVmb3JlKiB0aGUgRU9CIGNoYXJhY3RlcnMsIHRoZW4gaXQncyBhCi0JCSAqIHZhbGlkIE5VTDsgaWYgbm90LCB0aGVuIHdlJ3ZlIGhpdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCi0JCSAqLwotCQlpZiAoIHl5X2NfYnVmX3AgPCAmeXlfY3VycmVudF9idWZmZXItPnl5X2NoX2J1Zlt5eV9uX2NoYXJzXSApCi0JCQkvKiBUaGlzIHdhcyByZWFsbHkgYSBOVUwuICovCi0JCQkqeXlfY19idWZfcCA9ICdcMCc7Ci0KLQkJZWxzZQotCQkJeyAvKiBuZWVkIG1vcmUgaW5wdXQgKi8KLQkJCWludCBvZmZzZXQgPSB5eV9jX2J1Zl9wIC0geXl0ZXh0X3B0cjsKLQkJCSsreXlfY19idWZfcDsKLQotCQkJc3dpdGNoICggeXlfZ2V0X25leHRfYnVmZmVyKCkgKQotCQkJCXsKLQkJCQljYXNlIEVPQl9BQ1RfTEFTVF9NQVRDSDoKLQkJCQkJLyogVGhpcyBoYXBwZW5zIGJlY2F1c2UgeXlfZ19uX2IoKQotCQkJCQkgKiBzZWVzIHRoYXQgd2UndmUgYWNjdW11bGF0ZWQgYQotCQkJCQkgKiB0b2tlbiBhbmQgZmxhZ3MgdGhhdCB3ZSBuZWVkIHRvCi0JCQkJCSAqIHRyeSBtYXRjaGluZyB0aGUgdG9rZW4gYmVmb3JlCi0JCQkJCSAqIHByb2NlZWRpbmcuICBCdXQgZm9yIGlucHV0KCksCi0JCQkJCSAqIHRoZXJlJ3Mgbm8gbWF0Y2hpbmcgdG8gY29uc2lkZXIuCi0JCQkJCSAqIFNvIGNvbnZlcnQgdGhlIEVPQl9BQ1RfTEFTVF9NQVRDSAotCQkJCQkgKiB0byBFT0JfQUNUX0VORF9PRl9GSUxFLgotCQkJCQkgKi8KLQotCQkJCQkvKiBSZXNldCBidWZmZXIgc3RhdHVzLiAqLwotCQkJCQl5eXJlc3RhcnQoIHl5aW4gKTsKLQotCQkJCQkvKiBmYWxsIHRocm91Z2ggKi8KLQotCQkJCWNhc2UgRU9CX0FDVF9FTkRfT0ZfRklMRToKLQkJCQkJewotCQkJCQlpZiAoIHl5d3JhcCgpICkKLQkJCQkJCXJldHVybiBFT0Y7Ci0KLQkJCQkJaWYgKCAhIHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZiApCi0JCQkJCQlZWV9ORVdfRklMRTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotCQkJCQlyZXR1cm4geXlpbnB1dCgpOwotI2Vsc2UKLQkJCQkJcmV0dXJuIGlucHV0KCk7Ci0jZW5kaWYKLQkJCQkJfQotCi0JCQkJY2FzZSBFT0JfQUNUX0NPTlRJTlVFX1NDQU46Ci0JCQkJCXl5X2NfYnVmX3AgPSB5eXRleHRfcHRyICsgb2Zmc2V0OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCWMgPSAqKHVuc2lnbmVkIGNoYXIgKikgeXlfY19idWZfcDsJLyogY2FzdCBmb3IgOC1iaXQgY2hhcidzICovCi0JKnl5X2NfYnVmX3AgPSAnXDAnOwkvKiBwcmVzZXJ2ZSB5eXRleHQgKi8KLQl5eV9ob2xkX2NoYXIgPSAqKyt5eV9jX2J1Zl9wOwotCi0KLQlyZXR1cm4gYzsKLQl9Ci0KLQotI2lmZGVmIFlZX1VTRV9QUk9UT1MKLXZvaWQgeXlyZXN0YXJ0KCBGSUxFICppbnB1dF9maWxlICkKLSNlbHNlCi12b2lkIHl5cmVzdGFydCggaW5wdXRfZmlsZSApCi1GSUxFICppbnB1dF9maWxlOwotI2VuZGlmCi0JewotCWlmICggISB5eV9jdXJyZW50X2J1ZmZlciApCi0JCXl5X2N1cnJlbnRfYnVmZmVyID0geXlfY3JlYXRlX2J1ZmZlciggeXlpbiwgWVlfQlVGX1NJWkUgKTsKLQotCXl5X2luaXRfYnVmZmVyKCB5eV9jdXJyZW50X2J1ZmZlciwgaW5wdXRfZmlsZSApOwotCXl5X2xvYWRfYnVmZmVyX3N0YXRlKCk7Ci0JfQotCi0KLSNpZmRlZiBZWV9VU0VfUFJPVE9TCi12b2lkIHl5X3N3aXRjaF90b19idWZmZXIoIFlZX0JVRkZFUl9TVEFURSBuZXdfYnVmZmVyICkKLSNlbHNlCi12b2lkIHl5X3N3aXRjaF90b19idWZmZXIoIG5ld19idWZmZXIgKQotWVlfQlVGRkVSX1NUQVRFIG5ld19idWZmZXI7Ci0jZW5kaWYKLQl7Ci0JaWYgKCB5eV9jdXJyZW50X2J1ZmZlciA9PSBuZXdfYnVmZmVyICkKLQkJcmV0dXJuOwotCi0JaWYgKCB5eV9jdXJyZW50X2J1ZmZlciApCi0JCXsKLQkJLyogRmx1c2ggb3V0IGluZm9ybWF0aW9uIGZvciBvbGQgYnVmZmVyLiAqLwotCQkqeXlfY19idWZfcCA9IHl5X2hvbGRfY2hhcjsKLQkJeXlfY3VycmVudF9idWZmZXItPnl5X2J1Zl9wb3MgPSB5eV9jX2J1Zl9wOwotCQl5eV9jdXJyZW50X2J1ZmZlci0+eXlfbl9jaGFycyA9IHl5X25fY2hhcnM7Ci0JCX0KLQotCXl5X2N1cnJlbnRfYnVmZmVyID0gbmV3X2J1ZmZlcjsKLQl5eV9sb2FkX2J1ZmZlcl9zdGF0ZSgpOwotCi0JLyogV2UgZG9uJ3QgYWN0dWFsbHkga25vdyB3aGV0aGVyIHdlIGRpZCB0aGlzIHN3aXRjaCBkdXJpbmcKLQkgKiBFT0YgKHl5d3JhcCgpKSBwcm9jZXNzaW5nLCBidXQgdGhlIG9ubHkgdGltZSB0aGlzIGZsYWcKLQkgKiBpcyBsb29rZWQgYXQgaXMgYWZ0ZXIgeXl3cmFwKCkgaXMgY2FsbGVkLCBzbyBpdCdzIHNhZmUKLQkgKiB0byBnbyBhaGVhZCBhbmQgYWx3YXlzIHNldCBpdC4KLQkgKi8KLQl5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YgPSAxOwotCX0KLQotCi0jaWZkZWYgWVlfVVNFX1BST1RPUwotdm9pZCB5eV9sb2FkX2J1ZmZlcl9zdGF0ZSggdm9pZCApCi0jZWxzZQotdm9pZCB5eV9sb2FkX2J1ZmZlcl9zdGF0ZSgpCi0jZW5kaWYKLQl7Ci0JeXlfbl9jaGFycyA9IHl5X2N1cnJlbnRfYnVmZmVyLT55eV9uX2NoYXJzOwotCXl5dGV4dF9wdHIgPSB5eV9jX2J1Zl9wID0geXlfY3VycmVudF9idWZmZXItPnl5X2J1Zl9wb3M7Ci0JeXlpbiA9IHl5X2N1cnJlbnRfYnVmZmVyLT55eV9pbnB1dF9maWxlOwotCXl5X2hvbGRfY2hhciA9ICp5eV9jX2J1Zl9wOwotCX0KLQotCi0jaWZkZWYgWVlfVVNFX1BST1RPUwotWVlfQlVGRkVSX1NUQVRFIHl5X2NyZWF0ZV9idWZmZXIoIEZJTEUgKmZpbGUsIGludCBzaXplICkKLSNlbHNlCi1ZWV9CVUZGRVJfU1RBVEUgeXlfY3JlYXRlX2J1ZmZlciggZmlsZSwgc2l6ZSApCi1GSUxFICpmaWxlOwotaW50IHNpemU7Ci0jZW5kaWYKLQl7Ci0JWVlfQlVGRkVSX1NUQVRFIGI7Ci0KLQliID0gKFlZX0JVRkZFUl9TVEFURSkgeXlfZmxleF9hbGxvYyggc2l6ZW9mKCBzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlICkgKTsKLQlpZiAoICEgYiApCi0JCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHl5X2NyZWF0ZV9idWZmZXIoKSIgKTsKLQotCWItPnl5X2J1Zl9zaXplID0gc2l6ZTsKLQotCS8qIHl5X2NoX2J1ZiBoYXMgdG8gYmUgMiBjaGFyYWN0ZXJzIGxvbmdlciB0aGFuIHRoZSBzaXplIGdpdmVuIGJlY2F1c2UKLQkgKiB3ZSBuZWVkIHRvIHB1dCBpbiAyIGVuZC1vZi1idWZmZXIgY2hhcmFjdGVycy4KLQkgKi8KLQliLT55eV9jaF9idWYgPSAoY2hhciAqKSB5eV9mbGV4X2FsbG9jKCBiLT55eV9idWZfc2l6ZSArIDIgKTsKLQlpZiAoICEgYi0+eXlfY2hfYnVmICkKLQkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXlfY3JlYXRlX2J1ZmZlcigpIiApOwotCi0JYi0+eXlfaXNfb3VyX2J1ZmZlciA9IDE7Ci0KLQl5eV9pbml0X2J1ZmZlciggYiwgZmlsZSApOwotCi0JcmV0dXJuIGI7Ci0JfQotCi0KLSNpZmRlZiBZWV9VU0VfUFJPVE9TCi12b2lkIHl5X2RlbGV0ZV9idWZmZXIoIFlZX0JVRkZFUl9TVEFURSBiICkKLSNlbHNlCi12b2lkIHl5X2RlbGV0ZV9idWZmZXIoIGIgKQotWVlfQlVGRkVSX1NUQVRFIGI7Ci0jZW5kaWYKLQl7Ci0JaWYgKCAhIGIgKQotCQlyZXR1cm47Ci0KLQlpZiAoIGIgPT0geXlfY3VycmVudF9idWZmZXIgKQotCQl5eV9jdXJyZW50X2J1ZmZlciA9IChZWV9CVUZGRVJfU1RBVEUpIDA7Ci0KLQlpZiAoIGItPnl5X2lzX291cl9idWZmZXIgKQotCQl5eV9mbGV4X2ZyZWUoICh2b2lkICopIGItPnl5X2NoX2J1ZiApOwotCi0JeXlfZmxleF9mcmVlKCAodm9pZCAqKSBiICk7Ci0JfQotCi0KLSNpZm5kZWYgWVlfQUxXQVlTX0lOVEVSQUNUSVZFCi0jaWZuZGVmIFlZX05FVkVSX0lOVEVSQUNUSVZFCi1leHRlcm4gaW50IGlzYXR0eSBZWV9QUk9UTygoIGludCApKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBZWV9VU0VfUFJPVE9TCi12b2lkIHl5X2luaXRfYnVmZmVyKCBZWV9CVUZGRVJfU1RBVEUgYiwgRklMRSAqZmlsZSApCi0jZWxzZQotdm9pZCB5eV9pbml0X2J1ZmZlciggYiwgZmlsZSApCi1ZWV9CVUZGRVJfU1RBVEUgYjsKLUZJTEUgKmZpbGU7Ci0jZW5kaWYKLQotCi0JewotCXl5X2ZsdXNoX2J1ZmZlciggYiApOwotCi0JYi0+eXlfaW5wdXRfZmlsZSA9IGZpbGU7Ci0JYi0+eXlfZmlsbF9idWZmZXIgPSAxOwotCi0jaWYgWVlfQUxXQVlTX0lOVEVSQUNUSVZFCi0JYi0+eXlfaXNfaW50ZXJhY3RpdmUgPSAxOwotI2Vsc2UKLSNpZiBZWV9ORVZFUl9JTlRFUkFDVElWRQotCWItPnl5X2lzX2ludGVyYWN0aXZlID0gMDsKLSNlbHNlCi0JYi0+eXlfaXNfaW50ZXJhY3RpdmUgPSBmaWxlID8gKGlzYXR0eSggZmlsZW5vKGZpbGUpICkgPiAwKSA6IDA7Ci0jZW5kaWYKLSNlbmRpZgotCX0KLQotCi0jaWZkZWYgWVlfVVNFX1BST1RPUwotdm9pZCB5eV9mbHVzaF9idWZmZXIoIFlZX0JVRkZFUl9TVEFURSBiICkKLSNlbHNlCi12b2lkIHl5X2ZsdXNoX2J1ZmZlciggYiApCi1ZWV9CVUZGRVJfU1RBVEUgYjsKLSNlbmRpZgotCi0JewotCWlmICggISBiICkKLQkJcmV0dXJuOwotCi0JYi0+eXlfbl9jaGFycyA9IDA7Ci0KLQkvKiBXZSBhbHdheXMgbmVlZCB0d28gZW5kLW9mLWJ1ZmZlciBjaGFyYWN0ZXJzLiAgVGhlIGZpcnN0IGNhdXNlcwotCSAqIGEgdHJhbnNpdGlvbiB0byB0aGUgZW5kLW9mLWJ1ZmZlciBzdGF0ZS4gIFRoZSBzZWNvbmQgY2F1c2VzCi0JICogYSBqYW0gaW4gdGhhdCBzdGF0ZS4KLQkgKi8KLQliLT55eV9jaF9idWZbMF0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7Ci0JYi0+eXlfY2hfYnVmWzFdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOwotCi0JYi0+eXlfYnVmX3BvcyA9ICZiLT55eV9jaF9idWZbMF07Ci0KLQliLT55eV9hdF9ib2wgPSAxOwotCWItPnl5X2J1ZmZlcl9zdGF0dXMgPSBZWV9CVUZGRVJfTkVXOwotCi0JaWYgKCBiID09IHl5X2N1cnJlbnRfYnVmZmVyICkKLQkJeXlfbG9hZF9idWZmZXJfc3RhdGUoKTsKLQl9Ci0KLQotI2lmbmRlZiBZWV9OT19TQ0FOX0JVRkZFUgotI2lmZGVmIFlZX1VTRV9QUk9UT1MKLVlZX0JVRkZFUl9TVEFURSB5eV9zY2FuX2J1ZmZlciggY2hhciAqYmFzZSwgeXlfc2l6ZV90IHNpemUgKQotI2Vsc2UKLVlZX0JVRkZFUl9TVEFURSB5eV9zY2FuX2J1ZmZlciggYmFzZSwgc2l6ZSApCi1jaGFyICpiYXNlOwoteXlfc2l6ZV90IHNpemU7Ci0jZW5kaWYKLQl7Ci0JWVlfQlVGRkVSX1NUQVRFIGI7Ci0KLQlpZiAoIHNpemUgPCAyIHx8Ci0JICAgICBiYXNlW3NpemUtMl0gIT0gWVlfRU5EX09GX0JVRkZFUl9DSEFSIHx8Ci0JICAgICBiYXNlW3NpemUtMV0gIT0gWVlfRU5EX09GX0JVRkZFUl9DSEFSICkKLQkJLyogVGhleSBmb3Jnb3QgdG8gbGVhdmUgcm9vbSBmb3IgdGhlIEVPQidzLiAqLwotCQlyZXR1cm4gMDsKLQotCWIgPSAoWVlfQlVGRkVSX1NUQVRFKSB5eV9mbGV4X2FsbG9jKCBzaXplb2YoIHN0cnVjdCB5eV9idWZmZXJfc3RhdGUgKSApOwotCWlmICggISBiICkKLQkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXlfc2Nhbl9idWZmZXIoKSIgKTsKLQotCWItPnl5X2J1Zl9zaXplID0gc2l6ZSAtIDI7CS8qICItIDIiIHRvIHRha2UgY2FyZSBvZiBFT0IncyAqLwotCWItPnl5X2J1Zl9wb3MgPSBiLT55eV9jaF9idWYgPSBiYXNlOwotCWItPnl5X2lzX291cl9idWZmZXIgPSAwOwotCWItPnl5X2lucHV0X2ZpbGUgPSAwOwotCWItPnl5X25fY2hhcnMgPSBiLT55eV9idWZfc2l6ZTsKLQliLT55eV9pc19pbnRlcmFjdGl2ZSA9IDA7Ci0JYi0+eXlfYXRfYm9sID0gMTsKLQliLT55eV9maWxsX2J1ZmZlciA9IDA7Ci0JYi0+eXlfYnVmZmVyX3N0YXR1cyA9IFlZX0JVRkZFUl9ORVc7Ci0KLQl5eV9zd2l0Y2hfdG9fYnVmZmVyKCBiICk7Ci0KLQlyZXR1cm4gYjsKLQl9Ci0jZW5kaWYKLQotCi0jaWZuZGVmIFlZX05PX1NDQU5fU1RSSU5HCi0jaWZkZWYgWVlfVVNFX1BST1RPUwotWVlfQlVGRkVSX1NUQVRFIHl5X3NjYW5fc3RyaW5nKCB5eWNvbnN0IGNoYXIgKnl5X3N0ciApCi0jZWxzZQotWVlfQlVGRkVSX1NUQVRFIHl5X3NjYW5fc3RyaW5nKCB5eV9zdHIgKQoteXljb25zdCBjaGFyICp5eV9zdHI7Ci0jZW5kaWYKLQl7Ci0JaW50IGxlbjsKLQlmb3IgKCBsZW4gPSAwOyB5eV9zdHJbbGVuXTsgKytsZW4gKQotCQk7Ci0KLQlyZXR1cm4geXlfc2Nhbl9ieXRlcyggeXlfc3RyLCBsZW4gKTsKLQl9Ci0jZW5kaWYKLQotCi0jaWZuZGVmIFlZX05PX1NDQU5fQllURVMKLSNpZmRlZiBZWV9VU0VfUFJPVE9TCi1ZWV9CVUZGRVJfU1RBVEUgeXlfc2Nhbl9ieXRlcyggeXljb25zdCBjaGFyICpieXRlcywgaW50IGxlbiApCi0jZWxzZQotWVlfQlVGRkVSX1NUQVRFIHl5X3NjYW5fYnl0ZXMoIGJ5dGVzLCBsZW4gKQoteXljb25zdCBjaGFyICpieXRlczsKLWludCBsZW47Ci0jZW5kaWYKLQl7Ci0JWVlfQlVGRkVSX1NUQVRFIGI7Ci0JY2hhciAqYnVmOwotCXl5X3NpemVfdCBuOwotCWludCBpOwotCi0JLyogR2V0IG1lbW9yeSBmb3IgZnVsbCBidWZmZXIsIGluY2x1ZGluZyBzcGFjZSBmb3IgdHJhaWxpbmcgRU9CJ3MuICovCi0JbiA9IGxlbiArIDI7Ci0JYnVmID0gKGNoYXIgKikgeXlfZmxleF9hbGxvYyggbiApOwotCWlmICggISBidWYgKQotCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eV9zY2FuX2J5dGVzKCkiICk7Ci0KLQlmb3IgKCBpID0gMDsgaSA8IGxlbjsgKytpICkKLQkJYnVmW2ldID0gYnl0ZXNbaV07Ci0KLQlidWZbbGVuXSA9IGJ1ZltsZW4rMV0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7Ci0KLQliID0geXlfc2Nhbl9idWZmZXIoIGJ1ZiwgbiApOwotCWlmICggISBiICkKLQkJWVlfRkFUQUxfRVJST1IoICJiYWQgYnVmZmVyIGluIHl5X3NjYW5fYnl0ZXMoKSIgKTsKLQotCS8qIEl0J3Mgb2theSB0byBncm93IGV0Yy4gdGhpcyBidWZmZXIsIGFuZCB3ZSBzaG91bGQgdGhyb3cgaXQKLQkgKiBhd2F5IHdoZW4gd2UncmUgZG9uZS4KLQkgKi8KLQliLT55eV9pc19vdXJfYnVmZmVyID0gMTsKLQotCXJldHVybiBiOwotCX0KLSNlbmRpZgotCi0KLSNpZm5kZWYgWVlfTk9fUFVTSF9TVEFURQotI2lmZGVmIFlZX1VTRV9QUk9UT1MKLXN0YXRpYyB2b2lkIHl5X3B1c2hfc3RhdGUoIGludCBuZXdfc3RhdGUgKQotI2Vsc2UKLXN0YXRpYyB2b2lkIHl5X3B1c2hfc3RhdGUoIG5ld19zdGF0ZSApCi1pbnQgbmV3X3N0YXRlOwotI2VuZGlmCi0JewotCWlmICggeXlfc3RhcnRfc3RhY2tfcHRyID49IHl5X3N0YXJ0X3N0YWNrX2RlcHRoICkKLQkJewotCQl5eV9zaXplX3QgbmV3X3NpemU7Ci0KLQkJeXlfc3RhcnRfc3RhY2tfZGVwdGggKz0gWVlfU1RBUlRfU1RBQ0tfSU5DUjsKLQkJbmV3X3NpemUgPSB5eV9zdGFydF9zdGFja19kZXB0aCAqIHNpemVvZiggaW50ICk7Ci0KLQkJaWYgKCAhIHl5X3N0YXJ0X3N0YWNrICkKLQkJCXl5X3N0YXJ0X3N0YWNrID0gKGludCAqKSB5eV9mbGV4X2FsbG9jKCBuZXdfc2l6ZSApOwotCi0JCWVsc2UKLQkJCXl5X3N0YXJ0X3N0YWNrID0gKGludCAqKSB5eV9mbGV4X3JlYWxsb2MoCi0JCQkJCSh2b2lkICopIHl5X3N0YXJ0X3N0YWNrLCBuZXdfc2l6ZSApOwotCi0JCWlmICggISB5eV9zdGFydF9zdGFjayApCi0JCQlZWV9GQVRBTF9FUlJPUigKLQkJCSJvdXQgb2YgbWVtb3J5IGV4cGFuZGluZyBzdGFydC1jb25kaXRpb24gc3RhY2siICk7Ci0JCX0KLQotCXl5X3N0YXJ0X3N0YWNrW3l5X3N0YXJ0X3N0YWNrX3B0cisrXSA9IFlZX1NUQVJUOwotCi0JQkVHSU4obmV3X3N0YXRlKTsKLQl9Ci0jZW5kaWYKLQotCi0jaWZuZGVmIFlZX05PX1BPUF9TVEFURQotc3RhdGljIHZvaWQgeXlfcG9wX3N0YXRlKCkKLQl7Ci0JaWYgKCAtLXl5X3N0YXJ0X3N0YWNrX3B0ciA8IDAgKQotCQlZWV9GQVRBTF9FUlJPUiggInN0YXJ0LWNvbmRpdGlvbiBzdGFjayB1bmRlcmZsb3ciICk7Ci0KLQlCRUdJTih5eV9zdGFydF9zdGFja1t5eV9zdGFydF9zdGFja19wdHJdKTsKLQl9Ci0jZW5kaWYKLQotCi0jaWZuZGVmIFlZX05PX1RPUF9TVEFURQotc3RhdGljIGludCB5eV90b3Bfc3RhdGUoKQotCXsKLQlyZXR1cm4geXlfc3RhcnRfc3RhY2tbeXlfc3RhcnRfc3RhY2tfcHRyIC0gMV07Ci0JfQotI2VuZGlmCi0KLSNpZm5kZWYgWVlfRVhJVF9GQUlMVVJFCi0jZGVmaW5lIFlZX0VYSVRfRkFJTFVSRSAyCi0jZW5kaWYKLQotI2lmZGVmIFlZX1VTRV9QUk9UT1MKLXN0YXRpYyB2b2lkIHl5X2ZhdGFsX2Vycm9yKCB5eWNvbnN0IGNoYXIgbXNnW10gKQotI2Vsc2UKLXN0YXRpYyB2b2lkIHl5X2ZhdGFsX2Vycm9yKCBtc2cgKQotY2hhciBtc2dbXTsKLSNlbmRpZgotCXsKLQkodm9pZCkgZnByaW50Ziggc3RkZXJyLCAiJXNcbiIsIG1zZyApOwotCWV4aXQoIFlZX0VYSVRfRkFJTFVSRSApOwotCX0KLQotCi0KLS8qIFJlZGVmaW5lIHl5bGVzcygpIHNvIGl0IHdvcmtzIGluIHNlY3Rpb24gMyBjb2RlLiAqLwotCi0jdW5kZWYgeXlsZXNzCi0jZGVmaW5lIHl5bGVzcyhuKSBcCi0JZG8gXAotCQl7IFwKLQkJLyogVW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgeXl0ZXh0LiAqLyBcCi0JCXl5dGV4dFt5eWxlbmddID0geXlfaG9sZF9jaGFyOyBcCi0JCXl5X2NfYnVmX3AgPSB5eXRleHQgKyBuOyBcCi0JCXl5X2hvbGRfY2hhciA9ICp5eV9jX2J1Zl9wOyBcCi0JCSp5eV9jX2J1Zl9wID0gJ1wwJzsgXAotCQl5eWxlbmcgPSBuOyBcCi0JCX0gXAotCXdoaWxlICggMCApCi0KLQotLyogSW50ZXJuYWwgdXRpbGl0eSByb3V0aW5lcy4gKi8KLQotI2lmbmRlZiB5eXRleHRfcHRyCi0jaWZkZWYgWVlfVVNFX1BST1RPUwotc3RhdGljIHZvaWQgeXlfZmxleF9zdHJuY3B5KCBjaGFyICpzMSwgeXljb25zdCBjaGFyICpzMiwgaW50IG4gKQotI2Vsc2UKLXN0YXRpYyB2b2lkIHl5X2ZsZXhfc3RybmNweSggczEsIHMyLCBuICkKLWNoYXIgKnMxOwoteXljb25zdCBjaGFyICpzMjsKLWludCBuOwotI2VuZGlmCi0JewotCXJlZ2lzdGVyIGludCBpOwotCWZvciAoIGkgPSAwOyBpIDwgbjsgKytpICkKLQkJczFbaV0gPSBzMltpXTsKLQl9Ci0jZW5kaWYKLQotI2lmZGVmIFlZX05FRURfU1RSTEVOCi0jaWZkZWYgWVlfVVNFX1BST1RPUwotc3RhdGljIGludCB5eV9mbGV4X3N0cmxlbiggeXljb25zdCBjaGFyICpzICkKLSNlbHNlCi1zdGF0aWMgaW50IHl5X2ZsZXhfc3RybGVuKCBzICkKLXl5Y29uc3QgY2hhciAqczsKLSNlbmRpZgotCXsKLQlyZWdpc3RlciBpbnQgbjsKLQlmb3IgKCBuID0gMDsgc1tuXTsgKytuICkKLQkJOwotCi0JcmV0dXJuIG47Ci0JfQotI2VuZGlmCi0KLQotI2lmZGVmIFlZX1VTRV9QUk9UT1MKLXN0YXRpYyB2b2lkICp5eV9mbGV4X2FsbG9jKCB5eV9zaXplX3Qgc2l6ZSApCi0jZWxzZQotc3RhdGljIHZvaWQgKnl5X2ZsZXhfYWxsb2MoIHNpemUgKQoteXlfc2l6ZV90IHNpemU7Ci0jZW5kaWYKLQl7Ci0JcmV0dXJuICh2b2lkICopIG1hbGxvYyggc2l6ZSApOwotCX0KLQotI2lmZGVmIFlZX1VTRV9QUk9UT1MKLXN0YXRpYyB2b2lkICp5eV9mbGV4X3JlYWxsb2MoIHZvaWQgKnB0ciwgeXlfc2l6ZV90IHNpemUgKQotI2Vsc2UKLXN0YXRpYyB2b2lkICp5eV9mbGV4X3JlYWxsb2MoIHB0ciwgc2l6ZSApCi12b2lkICpwdHI7Ci15eV9zaXplX3Qgc2l6ZTsKLSNlbmRpZgotCXsKLQkvKiBUaGUgY2FzdCB0byAoY2hhciAqKSBpbiB0aGUgZm9sbG93aW5nIGFjY29tbW9kYXRlcyBib3RoCi0JICogaW1wbGVtZW50YXRpb25zIHRoYXQgdXNlIGNoYXIqIGdlbmVyaWMgcG9pbnRlcnMsIGFuZCB0aG9zZQotCSAqIHRoYXQgdXNlIHZvaWQqIGdlbmVyaWMgcG9pbnRlcnMuICBJdCB3b3JrcyB3aXRoIHRoZSBsYXR0ZXIKLQkgKiBiZWNhdXNlIGJvdGggQU5TSSBDIGFuZCBDKysgYWxsb3cgY2FzdGxlc3MgYXNzaWdubWVudCBmcm9tCi0JICogYW55IHBvaW50ZXIgdHlwZSB0byB2b2lkKiwgYW5kIGRlYWwgd2l0aCBhcmd1bWVudCBjb252ZXJzaW9ucwotCSAqIGFzIHRob3VnaCBkb2luZyBhbiBhc3NpZ25tZW50LgotCSAqLwotCXJldHVybiAodm9pZCAqKSByZWFsbG9jKCAoY2hhciAqKSBwdHIsIHNpemUgKTsKLQl9Ci0KLSNpZmRlZiBZWV9VU0VfUFJPVE9TCi1zdGF0aWMgdm9pZCB5eV9mbGV4X2ZyZWUoIHZvaWQgKnB0ciApCi0jZWxzZQotc3RhdGljIHZvaWQgeXlfZmxleF9mcmVlKCBwdHIgKQotdm9pZCAqcHRyOwotI2VuZGlmCi0JewotCWZyZWUoIHB0ciApOwotCX0KLQotI2lmIFlZX01BSU4KLWludCBtYWluKCkKLQl7Ci0JeXlsZXgoKTsKLQlyZXR1cm4gMDsKLQl9Ci0jZW5kaWYKLSNsaW5lIDI0NyAic3NsX2V4cHJfc2Nhbi5sIgotCi0KLWludCB5eWlucHV0KGNoYXIgKmJ1ZiwgaW50IG1heF9zaXplKQotewotICAgIGludCBuOwotCi0gICAgaWYgKChuID0gTUlOKG1heF9zaXplLCBzc2xfZXhwcl9pbmZvLmlucHV0YnVmCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyBzc2xfZXhwcl9pbmZvLmlucHV0bGVuIAotICAgICAgICAgICAgICAgICAgICAgICAgIC0gc3NsX2V4cHJfaW5mby5pbnB1dHB0cikpIDw9IDApCi0gICAgICAgIHJldHVybiBZWV9OVUxMOwotICAgIG1lbWNweShidWYsIHNzbF9leHByX2luZm8uaW5wdXRwdHIsIG4pOwotICAgIHNzbF9leHByX2luZm8uaW5wdXRwdHIgKz0gbjsKLSAgICByZXR1cm4gbjsKLX0KLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zc2wvc3NsX2V4cHJfc2Nhbi5sIGIvbW9kdWxlcy9zc2wvc3NsX2V4cHJfc2Nhbi5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGRiN2NjLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvc3NsL3NzbF9leHByX3NjYW4ubAorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKiAgICAgICAgICAgICAgICAgICAgICBfICAgICAgICAgICAgIF8gCi0qKiAgXyBfXyBfX18gICBfX18gICBfX3wgfCAgICBfX18gX19ffCB8ICAKLSoqIHwgJ18gYCBfIFwgLyBfIFwgLyBfYCB8ICAgLyBfXy8gX198IHwgIAotKiogfCB8IHwgfCB8IHwgKF8pIHwgKF98IHwgICBcX18gXF9fIFwgfCBtb2Rfc3NsIC0gQXBhY2hlIEludGVyZmFjZSB0byBPcGVuU1NMCi0qKiB8X3wgfF98IHxffFxfX18vIFxfXyxffF9fX3xfX18vX19fL198IGh0dHA6Ly93d3cubW9kc3NsLm9yZy8KLSoqICAgICAgICAgICAgICAgICAgICAgIHxfX19fX3wgICAgICAgICAKLSoqICBzc2xfZXhwcl9zY2FuLmwKLSoqICBFeHByZXNzaW9uIFNjYW5uZXIKLSovCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBSYWxmIFMuIEVuZ2Vsc2NoYWxsLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLSAqICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi0gKiAgICAgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGVuZ2Vsc2NoYWxsLmNvbT4gZm9yIHVzZSBpbiB0aGUKLSAqICAgICBtb2Rfc3NsIHByb2plY3QgKGh0dHA6Ly93d3cubW9kc3NsLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIm1vZF9zc2wiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICByc2VAZW5nZWxzY2hhbGwuY29tLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJtb2Rfc3NsIgotICogICAgbm9yIG1heSAibW9kX3NzbCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3IKLSAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBSYWxmIFMuIEVuZ2Vsc2NoYWxsLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi0gKiAgICAgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGVuZ2Vsc2NoYWxsLmNvbT4gZm9yIHVzZSBpbiB0aGUKLSAqICAgICBtb2Rfc3NsIHByb2plY3QgKGh0dHA6Ly93d3cubW9kc3NsLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFJBTEYgUy4gRU5HRUxTQ0hBTEwgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFJBTEYgUy4gRU5HRUxTQ0hBTEwgT1IKLSAqIEhJUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGBgS2lsbGluZyBmb3IgcGVhY2UgaXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSBmdWNraW5nIGZvciB2aXJnaW5pdHkuJycKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIFVua25vd24gICovCi0KLS8qICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICBFeHByZXNzaW9uIFNjYW5uZXIKLSoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKi8KLQotJXsKLSNpbmNsdWRlICJtb2Rfc3NsLmgiCi0KLSNpbmNsdWRlICJzc2xfZXhwcl9wYXJzZS5oIgotCi0jZGVmaW5lIFlZX05PX1VOUFVUIDEKLWludCB5eWlucHV0KGNoYXIgKmJ1ZiwgaW50IG1heF9zaXplKTsKLQotI3VuZGVmICBZWV9JTlBVVAotI2RlZmluZSBZWV9JTlBVVChidWYscmVzdWx0LG1heF9zaXplKSBcCi0gICAgKHJlc3VsdCA9IHl5aW5wdXQoYnVmLCBtYXhfc2l6ZSkpCi0KLSNkZWZpbmUgTUFYX1NUUl9MRU4gMjA0OAotJX0KLQotJXBvaW50ZXIKLS8qICVvcHRpb24gc3RhY2sgKi8KLSVvcHRpb24gbmV2ZXItaW50ZXJhY3RpdmUKLSVvcHRpb24gbm95eXdyYXAKLSV4IHN0cgotJXggcmVnZXggcmVnZXhfZmxhZ3MKLQotJSUKLSAgCi0gIGNoYXIgIGNhU3RyW01BWF9TVFJfTEVOXTsKLSAgY2hhciAqY3BTdHIgPSBOVUxMOwotICBjaGFyICBjYVJlZ2V4W01BWF9TVFJfTEVOXTsKLSAgY2hhciAqY3BSZWdleCA9IE5VTEw7Ci0gIGNoYXIgIGNSZWdleERlbCA9IE5VTDsKLQotIC8qCi0gICogV2hpdGVzcGFjZXMKLSAgKi8KLVsgXHRcbl0rIHsgCi0gICAgLyogTk9QICovCi19Ci0KLSAvKgotICAqIEMtc3R5bGUgc3RyaW5ncyAoIi4uLiIpCi0gICovCi1cIiB7Ci0gICAgY3BTdHIgPSBjYVN0cjsKLSAgICBCRUdJTihzdHIpOwotfQotPHN0cj5cIiB7Ci0gICAgQkVHSU4oSU5JVElBTCk7Ci0gICAgKmNwU3RyID0gTlVMOwotICAgIHl5bHZhbC5jcFZhbCA9IGFwX3BzdHJkdXAoc3NsX2V4cHJfaW5mby5wb29sLCBjYVN0cik7Ci0gICAgcmV0dXJuIFRfU1RSSU5HOwotfQotPHN0cj5cbiB7Ci0gICAgeXllcnJvcigiVW50ZXJtaW5hdGVkIHN0cmluZyIpOwotfQotPHN0cj5cXFswLTddezEsM30gewotICAgIGludCByZXN1bHQ7Ci0KLSAgICAodm9pZClzc2NhbmYoeXl0ZXh0KzEsICIlbyIsICZyZXN1bHQpOwotICAgIGlmIChyZXN1bHQgPiAweGZmKQotICAgICAgICB5eWVycm9yKCJFc2NhcGUgc2VxdWVuY2Ugb3V0IG9mIGJvdW5kIik7Ci0gICAgZWxzZQotICAgICAgICAqY3BTdHIrKyA9IHJlc3VsdDsKLX0KLTxzdHI+XFxbMC05XSsgewotICAgIHl5ZXJyb3IoIkJhZCBlc2NhcGUgc2VxdWVuY2UiKTsKLX0KLTxzdHI+XFxuIHsgKmNwU3RyKysgPSAnXG4nOyB9Ci08c3RyPlxcciB7ICpjcFN0cisrID0gJ1xyJzsgfQotPHN0cj5cXHQgeyAqY3BTdHIrKyA9ICdcdCc7IH0KLTxzdHI+XFxiIHsgKmNwU3RyKysgPSAnXGInOyB9Ci08c3RyPlxcZiB7ICpjcFN0cisrID0gJ1xmJzsgfQotPHN0cj5cXCgufFxuKSB7Ci0gICAgKmNwU3RyKysgPSB5eXRleHRbMV07Ci19Ci08c3RyPlteXFxcblwiXSsgewotICAgIGNoYXIgKmNwID0geXl0ZXh0OwotICAgIHdoaWxlICgqY3AgIT0gTlVMKQotICAgICAgICAqY3BTdHIrKyA9ICpjcCsrOwotfQotPHN0cj4uIHsKLSAgICAqY3BTdHIrKyA9IHl5dGV4dFsxXTsKLX0KLQotIC8qCi0gICogUmVndWxhciBFeHByZXNzaW9uCi0gICovCi0ibSIuIHsKLSAgICBjUmVnZXhEZWwgPSB5eXRleHRbMV07Ci0gICAgY3BSZWdleCA9IGNhUmVnZXg7Ci0gICAgQkVHSU4ocmVnZXgpOwotfQotPHJlZ2V4Pi58XG4gewotICAgIGlmICh5eXRleHRbMF0gPT0gY1JlZ2V4RGVsKSB7Ci0gICAgICAgICpjcFJlZ2V4ID0gTlVMOwotICAgICAgICBCRUdJTihyZWdleF9mbGFncyk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAqY3BSZWdleCsrID0geXl0ZXh0WzBdOwotICAgIH0KLX0KLTxyZWdleF9mbGFncz5pIHsKLSAgICB5eWx2YWwuY3BWYWwgPSBhcF9wc3RyZHVwKHNzbF9leHByX2luZm8ucG9vbCwgY2FSZWdleCk7Ci0gICAgQkVHSU4oSU5JVElBTCk7Ci0gICAgcmV0dXJuIFRfUkVHRVhfSTsKLX0KLTxyZWdleF9mbGFncz4ufFxuIHsKLSAgICB5eWx2YWwuY3BWYWwgPSBhcF9wc3RyZHVwKHNzbF9leHByX2luZm8ucG9vbCwgY2FSZWdleCk7Ci0gICAgeXlsZXNzKDApOwotICAgIEJFR0lOKElOSVRJQUwpOwotICAgIHJldHVybiBUX1JFR0VYOwotfQotPHJlZ2V4X2ZsYWdzPjw8RU9GPj4gewotICAgIHl5bHZhbC5jcFZhbCA9IGFwX3BzdHJkdXAoc3NsX2V4cHJfaW5mby5wb29sLCBjYVJlZ2V4KTsKLSAgICBCRUdJTihJTklUSUFMKTsKLSAgICByZXR1cm4gVF9SRUdFWDsKLX0KLQotIC8qCi0gICogT3BlcmF0b3JzCi0gICovCi0iZXEiICB7IHJldHVybiBUX09QX0VROyB9Ci0iPT0iICB7IHJldHVybiBUX09QX0VROyB9Ci0ibmUiICB7IHJldHVybiBUX09QX05FOyB9Ci0iIT0iICB7IHJldHVybiBUX09QX05FOyB9Ci0ibHQiICB7IHJldHVybiBUX09QX0xUOyB9Ci0iPCIgICB7IHJldHVybiBUX09QX0xUOyB9Ci0ibGUiICB7IHJldHVybiBUX09QX0xFOyB9Ci0iPD0iICB7IHJldHVybiBUX09QX0xFOyB9Ci0iZ3QiICB7IHJldHVybiBUX09QX0dUOyB9Ci0iPiIgICB7IHJldHVybiBUX09QX0dUOyB9Ci0iZ2UiICB7IHJldHVybiBUX09QX0dFOyB9Ci0iPj0iICB7IHJldHVybiBUX09QX0dFOyB9Ci0iPX4iICB7IHJldHVybiBUX09QX1JFRzsgfQotIiF+IiAgeyByZXR1cm4gVF9PUF9OUkU7IH0KLSJhbmQiIHsgcmV0dXJuIFRfT1BfQU5EOyB9Ci0iJiYiICB7IHJldHVybiBUX09QX0FORDsgfQotIm9yIiAgeyByZXR1cm4gVF9PUF9PUjsgfQotInx8IiAgeyByZXR1cm4gVF9PUF9PUjsgfQotIm5vdCIgeyByZXR1cm4gVF9PUF9OT1Q7IH0KLSIhIiAgIHsgcmV0dXJuIFRfT1BfTk9UOyB9Ci0iaW4iICB7IHJldHVybiBUX09QX0lOOyB9Ci0KLSAvKgotICAqIEZ1bmN0aW9ucwotICAqLwotImZpbGUiIHsgcmV0dXJuIFRfRlVOQ19GSUxFOyB9Ci0KLSAvKgotICAqIFNwZWNpYWxzCi0gICovCi0idHJ1ZSIgIHsgcmV0dXJuIFRfVFJVRTsgfQotImZhbHNlIiB7IHJldHVybiBUX0ZBTFNFOyB9Ci0KLSAvKgotICAqIERpZ2l0cwotICAqLwotWzAtOV0rIHsKLSAgICB5eWx2YWwuY3BWYWwgPSBhcF9wc3RyZHVwKHNzbF9leHByX2luZm8ucG9vbCwgeXl0ZXh0KTsKLSAgICByZXR1cm4gVF9ESUdJVDsKLX0KLQotIC8qCi0gICogSWRlbnRpZmllcnMKLSAgKi8KLVthLXpBLVpdW2EtekEtWjAtOV86LV0qIHsKLSAgICB5eWx2YWwuY3BWYWwgPSBhcF9wc3RyZHVwKHNzbF9leHByX2luZm8ucG9vbCwgeXl0ZXh0KTsKLSAgICByZXR1cm4gVF9JRDsKLX0KLQotIC8qCi0gICogQW55dGhpbmcgZWxzZSBpcyByZXR1cm5lZCBhcyBpcy4uLgotICAqLwotLnxcbiB7IAotICAgIHJldHVybiB5eXRleHRbMF07Ci19Ci0KLSUlCi0KLWludCB5eWlucHV0KGNoYXIgKmJ1ZiwgaW50IG1heF9zaXplKQotewotICAgIGludCBuOwotCi0gICAgaWYgKChuID0gTUlOKG1heF9zaXplLCBzc2xfZXhwcl9pbmZvLmlucHV0YnVmCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyBzc2xfZXhwcl9pbmZvLmlucHV0bGVuIAotICAgICAgICAgICAgICAgICAgICAgICAgIC0gc3NsX2V4cHJfaW5mby5pbnB1dHB0cikpIDw9IDApCi0gICAgICAgIHJldHVybiBZWV9OVUxMOwotICAgIG1lbWNweShidWYsIHNzbF9leHByX2luZm8uaW5wdXRwdHIsIG4pOwotICAgIHNzbF9leHByX2luZm8uaW5wdXRwdHIgKz0gbjsKLSAgICByZXR1cm4gbjsKLX0KLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zc2wvc3NsX3NjYWNoZS5jIGIvbW9kdWxlcy9zc2wvc3NsX3NjYWNoZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzljNzg2Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvc3NsL3NzbF9zY2FjaGUuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKiAgICAgICAgICAgICAgICAgICAgICBfICAgICAgICAgICAgIF8KLSoqICBfIF9fIF9fXyAgIF9fXyAgIF9ffCB8ICAgIF9fXyBfX198IHwgIG1vZF9zc2wKLSoqIHwgJ18gYCBfIFwgLyBfIFwgLyBfYCB8ICAgLyBfXy8gX198IHwgIEFwYWNoZSBJbnRlcmZhY2UgdG8gT3BlblNTTAotKiogfCB8IHwgfCB8IHwgKF8pIHwgKF98IHwgICBcX18gXF9fIFwgfCAgd3d3Lm1vZHNzbC5vcmcKLSoqIHxffCB8X3wgfF98XF9fXy8gXF9fLF98X19ffF9fXy9fX18vX3wgIGZ0cC5tb2Rzc2wub3JnCi0qKiAgICAgICAgICAgICAgICAgICAgICB8X19fX198Ci0qKiAgc3NsX3NjYWNoZS5jCi0qKiAgU2Vzc2lvbiBDYWNoZSBBYnN0cmFjdGlvbgotKi8KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAxIFJhbGYgUy4gRW5nZWxzY2hhbGwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci0gKiAgICAgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGVuZ2Vsc2NoYWxsLmNvbT4gZm9yIHVzZSBpbiB0aGUKLSAqICAgICBtb2Rfc3NsIHByb2plY3QgKGh0dHA6Ly93d3cubW9kc3NsLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIm1vZF9zc2wiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICByc2VAZW5nZWxzY2hhbGwuY29tLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJtb2Rfc3NsIgotICogICAgbm9yIG1heSAibW9kX3NzbCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3IKLSAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBSYWxmIFMuIEVuZ2Vsc2NoYWxsLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLSAqICAgICBSYWxmIFMuIEVuZ2Vsc2NoYWxsIDxyc2VAZW5nZWxzY2hhbGwuY29tPiBmb3IgdXNlIGluIHRoZQotICogICAgIG1vZF9zc2wgcHJvamVjdCAoaHR0cDovL3d3dy5tb2Rzc2wub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgUkFMRiBTLiBFTkdFTFNDSEFMTCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgUkFMRiBTLiBFTkdFTFNDSEFMTCBPUgotICogSElTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGBgT3Blbi1Tb3VyY2UgU29mdHdhcmU6IGdlbmVyb3VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbW1lcnMgZnJvbSBhcm91bmQgdGhlIHdvcmxkIGFsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4gZm9yY2VzIHRvIGhlbHAgeW91IHNob290Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW91cnNlbGYgaW4gdGhlIGZvb3QgZm9yIGZyZWUuJycKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBVbmtub3duICAgICAgICAgKi8KLSNpbmNsdWRlICJtb2Rfc3NsLmgiCi0KLS8qICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICBTZXNzaW9uIENhY2hlOiBDb21tb24gQWJzdHJhY3Rpb24gTGF5ZXIKLSoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKi8KLQotdm9pZCBzc2xfc2NhY2hlX2luaXQoc2VydmVyX3JlYyAqcywgcG9vbCAqcCkKLXsKLSAgICBTU0xNb2RDb25maWdSZWMgKm1jID0gbXlNb2RDb25maWcoKTsKLQotICAgIGlmIChtYy0+blNlc3Npb25DYWNoZU1vZGUgPT0gU1NMX1NDTU9ERV9EQk0pCi0gICAgICAgIHNzbF9zY2FjaGVfZGJtX2luaXQocywgcCk7Ci0gICAgZWxzZSBpZiAobWMtPm5TZXNzaW9uQ2FjaGVNb2RlID09IFNTTF9TQ01PREVfU0hNSFQpCi0gICAgICAgIHNzbF9zY2FjaGVfc2htaHRfaW5pdChzLCBwKTsKLSAgICBlbHNlIGlmIChtYy0+blNlc3Npb25DYWNoZU1vZGUgPT0gU1NMX1NDTU9ERV9TSE1DQikKLSAgICAgICAgc3NsX3NjYWNoZV9zaG1jYl9pbml0KHMsIHApOwotI2lmZGVmIFNTTF9WRU5ET1IKLSAgICBlbHNlCi0gICAgICAgIGFwX2hvb2tfdXNlKCJhcDo6bW9kX3NzbDo6dmVuZG9yOjpzY2FjaGVfaW5pdCIsCi0gICAgICAgICAgICAgICAgICAgIEFQX0hPT0tfU0lHMyh2b2lkLHB0cixwdHIpLCBBUF9IT09LX0FMTCwgcywgcCk7Ci0jZW5kaWYKLSAgICByZXR1cm47Ci19Ci0KLXZvaWQgc3NsX3NjYWNoZV9raWxsKHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgU1NMTW9kQ29uZmlnUmVjICptYyA9IG15TW9kQ29uZmlnKCk7Ci0KLSAgICBpZiAobWMtPm5TZXNzaW9uQ2FjaGVNb2RlID09IFNTTF9TQ01PREVfREJNKQotICAgICAgICBzc2xfc2NhY2hlX2RibV9raWxsKHMpOwotICAgIGVsc2UgaWYgKG1jLT5uU2Vzc2lvbkNhY2hlTW9kZSA9PSBTU0xfU0NNT0RFX1NITUhUKQotICAgICAgICBzc2xfc2NhY2hlX3NobWh0X2tpbGwocyk7Ci0gICAgZWxzZSBpZiAobWMtPm5TZXNzaW9uQ2FjaGVNb2RlID09IFNTTF9TQ01PREVfU0hNQ0IpCi0gICAgICAgIHNzbF9zY2FjaGVfc2htY2Jfa2lsbChzKTsKLSNpZmRlZiBTU0xfVkVORE9SCi0gICAgZWxzZQotICAgICAgICBhcF9ob29rX3VzZSgiYXA6Om1vZF9zc2w6OnZlbmRvcjo6c2NhY2hlX2tpbGwiLAotICAgICAgICAgICAgICAgICAgICBBUF9IT09LX1NJRzIodm9pZCxwdHIpLCBBUF9IT09LX0FMTCwgcyk7Ci0jZW5kaWYKLSAgICByZXR1cm47Ci19Ci0KLUJPT0wgc3NsX3NjYWNoZV9zdG9yZShzZXJ2ZXJfcmVjICpzLCBVQ0hBUiAqaWQsIGludCBpZGxlbiwgdGltZV90IGV4cGlyeSwgU1NMX1NFU1NJT04gKnNlc3MpCi17Ci0gICAgU1NMTW9kQ29uZmlnUmVjICptYyA9IG15TW9kQ29uZmlnKCk7Ci0gICAgQk9PTCBydiA9IEZBTFNFOwotCi0gICAgaWYgKG1jLT5uU2Vzc2lvbkNhY2hlTW9kZSA9PSBTU0xfU0NNT0RFX0RCTSkKLSAgICAgICAgcnYgPSBzc2xfc2NhY2hlX2RibV9zdG9yZShzLCBpZCwgaWRsZW4sIGV4cGlyeSwgc2Vzcyk7Ci0gICAgZWxzZSBpZiAobWMtPm5TZXNzaW9uQ2FjaGVNb2RlID09IFNTTF9TQ01PREVfU0hNSFQpCi0gICAgICAgIHJ2ID0gc3NsX3NjYWNoZV9zaG1odF9zdG9yZShzLCBpZCwgaWRsZW4sIGV4cGlyeSwgc2Vzcyk7Ci0gICAgZWxzZSBpZiAobWMtPm5TZXNzaW9uQ2FjaGVNb2RlID09IFNTTF9TQ01PREVfU0hNQ0IpCi0gICAgICAgIHJ2ID0gc3NsX3NjYWNoZV9zaG1jYl9zdG9yZShzLCBpZCwgaWRsZW4sIGV4cGlyeSwgc2Vzcyk7Ci0jaWZkZWYgU1NMX1ZFTkRPUgotICAgIGVsc2UKLSAgICAgICAgYXBfaG9va191c2UoImFwOjptb2Rfc3NsOjp2ZW5kb3I6OnNjYWNoZV9zdG9yZSIsCi0gICAgICAgICAgICAgICAgICAgIEFQX0hPT0tfU0lHNihpbnQscHRyLHB0cixpbnQsaW50LHB0ciksIEFQX0hPT0tfQUxMLAotICAgICAgICAgICAgICAgICAgICAoaW50ICopJnJ2LCBzLCBpZCwgaWRsZW4sIChpbnQpZXhwaXJ5LCBzZXNzKTsKLSNlbmRpZgotICAgIHJldHVybiBydjsKLX0KLQotU1NMX1NFU1NJT04gKnNzbF9zY2FjaGVfcmV0cmlldmUoc2VydmVyX3JlYyAqcywgVUNIQVIgKmlkLCBpbnQgaWRsZW4pCi17Ci0gICAgU1NMTW9kQ29uZmlnUmVjICptYyA9IG15TW9kQ29uZmlnKCk7Ci0gICAgU1NMX1NFU1NJT04gKnNlc3MgPSBOVUxMOwotCi0gICAgaWYgKG1jLT5uU2Vzc2lvbkNhY2hlTW9kZSA9PSBTU0xfU0NNT0RFX0RCTSkKLSAgICAgICAgc2VzcyA9IHNzbF9zY2FjaGVfZGJtX3JldHJpZXZlKHMsIGlkLCBpZGxlbik7Ci0gICAgZWxzZSBpZiAobWMtPm5TZXNzaW9uQ2FjaGVNb2RlID09IFNTTF9TQ01PREVfU0hNSFQpCi0gICAgICAgIHNlc3MgPSBzc2xfc2NhY2hlX3NobWh0X3JldHJpZXZlKHMsIGlkLCBpZGxlbik7Ci0gICAgZWxzZSBpZiAobWMtPm5TZXNzaW9uQ2FjaGVNb2RlID09IFNTTF9TQ01PREVfU0hNQ0IpCi0gICAgICAgIHNlc3MgPSBzc2xfc2NhY2hlX3NobWNiX3JldHJpZXZlKHMsIGlkLCBpZGxlbik7Ci0jaWZkZWYgU1NMX1ZFTkRPUgotICAgIGVsc2UKLSAgICAgICAgYXBfaG9va191c2UoImFwOjptb2Rfc3NsOjp2ZW5kb3I6OnNjYWNoZV9yZXRyaWV2ZSIsCi0gICAgICAgICAgICAgICAgICAgIEFQX0hPT0tfU0lHNChwdHIscHRyLHB0cixpbnQpLCBBUF9IT09LX0FMTCwgCi0gICAgICAgICAgICAgICAgICAgICZzZXNzLCBzLCBpZCwgaWRsZW4pOwotI2VuZGlmCi0gICAgcmV0dXJuIHNlc3M7Ci19Ci0KLXZvaWQgc3NsX3NjYWNoZV9yZW1vdmUoc2VydmVyX3JlYyAqcywgVUNIQVIgKmlkLCBpbnQgaWRsZW4pCi17Ci0gICAgU1NMTW9kQ29uZmlnUmVjICptYyA9IG15TW9kQ29uZmlnKCk7Ci0KLSAgICBpZiAobWMtPm5TZXNzaW9uQ2FjaGVNb2RlID09IFNTTF9TQ01PREVfREJNKQotICAgICAgICBzc2xfc2NhY2hlX2RibV9yZW1vdmUocywgaWQsIGlkbGVuKTsKLSAgICBlbHNlIGlmIChtYy0+blNlc3Npb25DYWNoZU1vZGUgPT0gU1NMX1NDTU9ERV9TSE1IVCkKLSAgICAgICAgc3NsX3NjYWNoZV9zaG1odF9yZW1vdmUocywgaWQsIGlkbGVuKTsKLSAgICBlbHNlIGlmIChtYy0+blNlc3Npb25DYWNoZU1vZGUgPT0gU1NMX1NDTU9ERV9TSE1DQikKLSAgICAgICAgc3NsX3NjYWNoZV9zaG1jYl9yZW1vdmUocywgaWQsIGlkbGVuKTsKLSNpZmRlZiBTU0xfVkVORE9SCi0gICAgZWxzZQotICAgICAgICBhcF9ob29rX3VzZSgiYXA6Om1vZF9zc2w6OnZlbmRvcjo6c2NhY2hlX3JlbW92ZSIsCi0gICAgICAgICAgICAgICAgICAgIEFQX0hPT0tfU0lHNCh2b2lkLHB0cixwdHIsaW50KSwgQVBfSE9PS19BTEwsIHMsIGlkLCBpZGxlbik7Ci0jZW5kaWYKLSAgICByZXR1cm47Ci19Ci0KLXZvaWQgc3NsX3NjYWNoZV9zdGF0dXMoc2VydmVyX3JlYyAqcywgcG9vbCAqcCwgdm9pZCAoKmZ1bmMpKGNoYXIgKiwgdm9pZCAqKSwgdm9pZCAqYXJnKQotewotICAgIFNTTE1vZENvbmZpZ1JlYyAqbWMgPSBteU1vZENvbmZpZygpOwotCi0gICAgaWYgKG1jLT5uU2Vzc2lvbkNhY2hlTW9kZSA9PSBTU0xfU0NNT0RFX0RCTSkKLSAgICAgICAgc3NsX3NjYWNoZV9kYm1fc3RhdHVzKHMsIHAsIGZ1bmMsIGFyZyk7Ci0gICAgZWxzZSBpZiAobWMtPm5TZXNzaW9uQ2FjaGVNb2RlID09IFNTTF9TQ01PREVfU0hNSFQpCi0gICAgICAgIHNzbF9zY2FjaGVfc2htaHRfc3RhdHVzKHMsIHAsIGZ1bmMsIGFyZyk7Ci0gICAgZWxzZSBpZiAobWMtPm5TZXNzaW9uQ2FjaGVNb2RlID09IFNTTF9TQ01PREVfU0hNQ0IpCi0gICAgICAgIHNzbF9zY2FjaGVfc2htY2Jfc3RhdHVzKHMsIHAsIGZ1bmMsIGFyZyk7Ci0jaWZkZWYgU1NMX1ZFTkRPUgotICAgIGVsc2UKLSAgICAgICAgYXBfaG9va191c2UoImFwOjptb2Rfc3NsOjp2ZW5kb3I6OnNjYWNoZV9zdGF0dXMiLAotICAgICAgICAgICAgICAgICAgICBBUF9IT09LX1NJRzUodm9pZCxwdHIscHRyLHB0cixwdHIpLCBBUF9IT09LX0FMTCwgCi0gICAgICAgICAgICAgICAgICAgIHMsIHAsIGZ1bmMsIGFyZyk7Ci0jZW5kaWYKLSAgICByZXR1cm47Ci19Ci0KLXZvaWQgc3NsX3NjYWNoZV9leHBpcmUoc2VydmVyX3JlYyAqcykKLXsKLSAgICBTU0xNb2RDb25maWdSZWMgKm1jID0gbXlNb2RDb25maWcoKTsKLQotICAgIGlmIChtYy0+blNlc3Npb25DYWNoZU1vZGUgPT0gU1NMX1NDTU9ERV9EQk0pCi0gICAgICAgIHNzbF9zY2FjaGVfZGJtX2V4cGlyZShzKTsKLSAgICBlbHNlIGlmIChtYy0+blNlc3Npb25DYWNoZU1vZGUgPT0gU1NMX1NDTU9ERV9TSE1IVCkKLSAgICAgICAgc3NsX3NjYWNoZV9zaG1odF9leHBpcmUocyk7Ci0gICAgZWxzZSBpZiAobWMtPm5TZXNzaW9uQ2FjaGVNb2RlID09IFNTTF9TQ01PREVfU0hNQ0IpCi0gICAgICAgIHNzbF9zY2FjaGVfc2htY2JfZXhwaXJlKHMpOwotI2lmZGVmIFNTTF9WRU5ET1IKLSAgICBlbHNlCi0gICAgICAgIGFwX2hvb2tfdXNlKCJhcDo6bW9kX3NzbDo6dmVuZG9yOjpzY2FjaGVfZXhwaXJlIiwKLSAgICAgICAgICAgICAgICAgICAgQVBfSE9PS19TSUcyKHZvaWQscHRyKSwgQVBfSE9PS19BTEwsIHMpOwotI2VuZGlmCi0gICAgcmV0dXJuOwotfQotCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NzbC9zc2xfc2NhY2hlX2RibS5jIGIvbW9kdWxlcy9zc2wvc3NsX3NjYWNoZV9kYm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIzYzYxMi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL3NzbC9zc2xfc2NhY2hlX2RibS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgIF8gICAgICAgICAgICAgXwotKiogIF8gX18gX19fICAgX19fICAgX198IHwgICAgX19fIF9fX3wgfCAgbW9kX3NzbAotKiogfCAnXyBgIF8gXCAvIF8gXCAvIF9gIHwgICAvIF9fLyBfX3wgfCAgQXBhY2hlIEludGVyZmFjZSB0byBPcGVuU1NMCi0qKiB8IHwgfCB8IHwgfCAoXykgfCAoX3wgfCAgIFxfXyBcX18gXCB8ICB3d3cubW9kc3NsLm9yZwotKiogfF98IHxffCB8X3xcX19fLyBcX18sX3xfX198X19fL19fXy9ffCAgZnRwLm1vZHNzbC5vcmcKLSoqICAgICAgICAgICAgICAgICAgICAgIHxfX19fX3wKLSoqICBzc2xfc2NhY2hlX2RibS5jCi0qKiAgU2Vzc2lvbiBDYWNoZSB2aWEgREJNCi0qLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgUmFsZiBTLiBFbmdlbHNjaGFsbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLSAqICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLSAqICAgICBSYWxmIFMuIEVuZ2Vsc2NoYWxsIDxyc2VAZW5nZWxzY2hhbGwuY29tPiBmb3IgdXNlIGluIHRoZQotICogICAgIG1vZF9zc2wgcHJvamVjdCAoaHR0cDovL3d3dy5tb2Rzc2wub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAibW9kX3NzbCIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIHJzZUBlbmdlbHNjaGFsbC5jb20uCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIm1vZF9zc2wiCi0gKiAgICBub3IgbWF5ICJtb2Rfc3NsIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvcgotICogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFJhbGYgUy4gRW5nZWxzY2hhbGwuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotICogICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+IGZvciB1c2UgaW4gdGhlCi0gKiAgICAgbW9kX3NzbCBwcm9qZWN0IChodHRwOi8vd3d3Lm1vZHNzbC5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBSQUxGIFMuIEVOR0VMU0NIQUxMIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBSQUxGIFMuIEVOR0VMU0NIQUxMIE9SCi0gKiBISVMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLQotI2luY2x1ZGUgIm1vZF9zc2wuaCIKLQotdm9pZCBzc2xfc2NhY2hlX2RibV9pbml0KHNlcnZlcl9yZWMgKnMsIHBvb2wgKnApCi17Ci0gICAgU1NMTW9kQ29uZmlnUmVjICptYyA9IG15TW9kQ29uZmlnKCk7Ci0gICAgREJNICpkYm07Ci0KLSAgICAvKiBmb3IgdGhlIERCTSB3ZSBuZWVkIHRoZSBkYXRhIGZpbGUgKi8KLSAgICBpZiAobWMtPnN6U2Vzc2lvbkNhY2hlRGF0YUZpbGUgPT0gTlVMTCkgewotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1IsICJTU0xTZXNzaW9uQ2FjaGUgcmVxdWlyZWQiKTsKLSAgICAgICAgc3NsX2RpZSgpOwotICAgIH0KLQotICAgIC8qIG9wZW4gaXQgb25jZSB0byBjcmVhdGUgaXQgYW5kIHRvIG1ha2Ugc3VyZSBpdCBfY2FuXyBiZSBjcmVhdGVkICovCi0gICAgc3NsX211dGV4X29uKHMpOwotICAgIGlmICgoZGJtID0gc3NsX2RibV9vcGVuKG1jLT5zelNlc3Npb25DYWNoZURhdGFGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9fUkRXUnxPX0NSRUFULCBTU0xfREJNX0ZJTEVfTU9ERSkpID09IE5VTEwpIHsKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SfFNTTF9BRERfRVJSTk8sCi0gICAgICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgU1NMU2Vzc2lvbkNhY2hlIERCTSBmaWxlIGAlcyciLAotICAgICAgICAgICAgICAgIG1jLT5zelNlc3Npb25DYWNoZURhdGFGaWxlKTsKLSAgICAgICAgc3NsX211dGV4X29mZihzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzc2xfZGJtX2Nsb3NlKGRibSk7Ci0KLSNpZiAhZGVmaW5lZChPUzIpICYmICFkZWZpbmVkKFdJTjMyKQotICAgIC8qCi0gICAgICogV2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlIEFwYWNoZSBjaGlsZCBwcm9jZXNzZXMgaGF2ZSBhY2Nlc3MgdG8KLSAgICAgKiB0aGUgREJNIGZpbGUuIEJ1dCBiZWNhdXNlIHRoZXJlIGFyZSBicmFpbi1kZWFkIHBsYXRmb3JtcyB3aGVyZSB3ZQotICAgICAqIGNhbm5vdCBleGFjdGx5IGRldGVybWluZSB0aGUgc3VmZml4ZXMgd2UgdHJ5IGFsbCBwb3NzaWJpbGl0aWVzLgotICAgICAqLwotICAgIGlmIChnZXRldWlkKCkgPT0gMCAvKiBpcyBzdXBlcnVzZXIgKi8pIHsKLSAgICAgICAgY2hvd24obWMtPnN6U2Vzc2lvbkNhY2hlRGF0YUZpbGUsIGFwX3VzZXJfaWQsIC0xIC8qIG5vIGdpZCBjaGFuZ2UgKi8pOwotICAgICAgICBpZiAoY2hvd24oYXBfcHN0cmNhdChwLCBtYy0+c3pTZXNzaW9uQ2FjaGVEYXRhRmlsZSwgU1NMX0RCTV9GSUxFX1NVRkZJWF9ESVIsIE5VTEwpLAotICAgICAgICAgICAgICAgICAgYXBfdXNlcl9pZCwgLTEpID09IC0xKSB7Ci0gICAgICAgICAgICBpZiAoY2hvd24oYXBfcHN0cmNhdChwLCBtYy0+c3pTZXNzaW9uQ2FjaGVEYXRhRmlsZSwgIi5kYiIsIE5VTEwpLAotICAgICAgICAgICAgICAgICAgICAgIGFwX3VzZXJfaWQsIC0xKSA9PSAtMSkKLSAgICAgICAgICAgICAgICBjaG93bihhcF9wc3RyY2F0KHAsIG1jLT5zelNlc3Npb25DYWNoZURhdGFGaWxlLCAiLmRpciIsIE5VTEwpLAotICAgICAgICAgICAgICAgICAgICAgIGFwX3VzZXJfaWQsIC0xKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2hvd24oYXBfcHN0cmNhdChwLCBtYy0+c3pTZXNzaW9uQ2FjaGVEYXRhRmlsZSwgU1NMX0RCTV9GSUxFX1NVRkZJWF9QQUcsIE5VTEwpLAotICAgICAgICAgICAgICAgICAgYXBfdXNlcl9pZCwgLTEpID09IC0xKSB7Ci0gICAgICAgICAgICBpZiAoY2hvd24oYXBfcHN0cmNhdChwLCBtYy0+c3pTZXNzaW9uQ2FjaGVEYXRhRmlsZSwgIi5kYiIsIE5VTEwpLAotICAgICAgICAgICAgICAgICAgICAgIGFwX3VzZXJfaWQsIC0xKSA9PSAtMSkKLSAgICAgICAgICAgICAgICBjaG93bihhcF9wc3RyY2F0KHAsIG1jLT5zelNlc3Npb25DYWNoZURhdGFGaWxlLCAiLnBhZyIsIE5VTEwpLAotICAgICAgICAgICAgICAgICAgICAgIGFwX3VzZXJfaWQsIC0xKTsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgotICAgIHNzbF9tdXRleF9vZmYocyk7Ci0gICAgc3NsX3NjYWNoZV9kYm1fZXhwaXJlKHMpOwotICAgIHJldHVybjsKLX0KLQotdm9pZCBzc2xfc2NhY2hlX2RibV9raWxsKHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgU1NMTW9kQ29uZmlnUmVjICptYyA9IG15TW9kQ29uZmlnKCk7Ci0gICAgcG9vbCAqcDsKLQotICAgIGlmICgocCA9IGFwX21ha2Vfc3ViX3Bvb2woTlVMTCkpICE9IE5VTEwpIHsKLSAgICAgICAgLyogdGhlIGNvcnJlY3Qgd2F5ICovCi0gICAgICAgIHVubGluayhhcF9wc3RyY2F0KHAsIG1jLT5zelNlc3Npb25DYWNoZURhdGFGaWxlLCBTU0xfREJNX0ZJTEVfU1VGRklYX0RJUiwgTlVMTCkpOwotICAgICAgICB1bmxpbmsoYXBfcHN0cmNhdChwLCBtYy0+c3pTZXNzaW9uQ2FjaGVEYXRhRmlsZSwgU1NMX0RCTV9GSUxFX1NVRkZJWF9QQUcsIE5VTEwpKTsKLSAgICAgICAgLyogdGhlIGFkZGl0aW9uYWwgd2F5cyB0byBiZSBzdXJlICovCi0gICAgICAgIHVubGluayhhcF9wc3RyY2F0KHAsIG1jLT5zelNlc3Npb25DYWNoZURhdGFGaWxlLCAiLmRpciIsIE5VTEwpKTsKLSAgICAgICAgdW5saW5rKGFwX3BzdHJjYXQocCwgbWMtPnN6U2Vzc2lvbkNhY2hlRGF0YUZpbGUsICIucGFnIiwgTlVMTCkpOwotICAgICAgICB1bmxpbmsoYXBfcHN0cmNhdChwLCBtYy0+c3pTZXNzaW9uQ2FjaGVEYXRhRmlsZSwgIi5kYiIsIE5VTEwpKTsKLSAgICAgICAgdW5saW5rKG1jLT5zelNlc3Npb25DYWNoZURhdGFGaWxlKTsKLSAgICAgICAgYXBfZGVzdHJveV9wb29sKHApOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLUJPT0wgc3NsX3NjYWNoZV9kYm1fc3RvcmUoc2VydmVyX3JlYyAqcywgVUNIQVIgKmlkLCBpbnQgaWRsZW4sIHRpbWVfdCBleHBpcnksIFNTTF9TRVNTSU9OICpzZXNzKQotewotICAgIFNTTE1vZENvbmZpZ1JlYyAqbWMgPSBteU1vZENvbmZpZygpOwotICAgIERCTSAqZGJtOwotICAgIGRhdHVtIGRibWtleTsKLSAgICBkYXR1bSBkYm12YWw7Ci0gICAgVUNIQVIgdWNhRGF0YVtTU0xfU0VTU0lPTl9NQVhfREVSXTsKLSAgICBpbnQgbkRhdGE7Ci0gICAgVUNIQVIgKnVjcDsKLQotICAgIC8qIHN0cmVhbWxpbmUgc2Vzc2lvbiBkYXRhICovCi0gICAgdWNwID0gdWNhRGF0YTsKLSAgICBuRGF0YSA9IGkyZF9TU0xfU0VTU0lPTihzZXNzLCAmdWNwKTsKLQotICAgIC8qIGJlIGNhcmVmdWw6IGRvIG5vdCB0cnkgdG8gc3RvcmUgdG9vIG11Y2ggYnl0ZXMgaW4gYSBEQk0gZmlsZSEgKi8KLSNpZmRlZiBTU0xfVVNFX1NEQk0KLSAgICBpZiAoKGlkbGVuICsgbkRhdGEpID49IFBBSVJNQVgpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSNlbHNlCi0gICAgaWYgKChpZGxlbiArIG5EYXRhKSA+PSA5NTAgLyogYXQgbGVhc3QgbGVzcyB0aGFuIGFwcHJveC4gMUtCICovKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0jZW5kaWYKLQotICAgIC8qIGNyZWF0ZSBEQk0ga2V5ICovCi0gICAgZGJta2V5LmRwdHIgID0gKGNoYXIgKilpZDsKLSAgICBkYm1rZXkuZHNpemUgPSBpZGxlbjsKLQotICAgIC8qIGNyZWF0ZSBEQk0gdmFsdWUgKi8KLSAgICBkYm12YWwuZHNpemUgPSBzaXplb2YodGltZV90KSArIG5EYXRhOwotICAgIGRibXZhbC5kcHRyICA9IChjaGFyICopbWFsbG9jKGRibXZhbC5kc2l6ZSk7Ci0gICAgaWYgKGRibXZhbC5kcHRyID09IE5VTEwpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBtZW1jcHkoKGNoYXIgKilkYm12YWwuZHB0ciwgJmV4cGlyeSwgc2l6ZW9mKHRpbWVfdCkpOwotICAgIG1lbWNweSgoY2hhciAqKWRibXZhbC5kcHRyK3NpemVvZih0aW1lX3QpLCB1Y2FEYXRhLCBuRGF0YSk7Ci0KLSAgICAvKiBhbmQgc3RvcmUgaXQgdG8gdGhlIERCTSBmaWxlICovCi0gICAgc3NsX211dGV4X29uKHMpOwotICAgIGlmICgoZGJtID0gc3NsX2RibV9vcGVuKG1jLT5zelNlc3Npb25DYWNoZURhdGFGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9fUkRXUiwgU1NMX0RCTV9GSUxFX01PREUpKSA9PSBOVUxMKSB7Ci0gICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19FUlJPUnxTU0xfQUREX0VSUk5PLAotICAgICAgICAgICAgICAgICJDYW5ub3Qgb3BlbiBTU0xTZXNzaW9uQ2FjaGUgREJNIGZpbGUgYCVzJyBmb3Igd3JpdGluZyAoc3RvcmUpIiwKLSAgICAgICAgICAgICAgICBtYy0+c3pTZXNzaW9uQ2FjaGVEYXRhRmlsZSk7Ci0gICAgICAgIHNzbF9tdXRleF9vZmYocyk7Ci0gICAgICAgIGZyZWUoZGJtdmFsLmRwdHIpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChzc2xfZGJtX3N0b3JlKGRibSwgZGJta2V5LCBkYm12YWwsIERCTV9JTlNFUlQpIDwgMCkgewotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1J8U1NMX0FERF9FUlJOTywKLSAgICAgICAgICAgICAgICAiQ2Fubm90IHN0b3JlIFNTTCBzZXNzaW9uIHRvIERCTSBmaWxlIGAlcyciLAotICAgICAgICAgICAgICAgIG1jLT5zelNlc3Npb25DYWNoZURhdGFGaWxlKTsKLSAgICAgICAgc3NsX2RibV9jbG9zZShkYm0pOwotICAgICAgICBzc2xfbXV0ZXhfb2ZmKHMpOwotICAgICAgICBmcmVlKGRibXZhbC5kcHRyKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBzc2xfZGJtX2Nsb3NlKGRibSk7Ci0gICAgc3NsX211dGV4X29mZihzKTsKLQotICAgIC8qIGZyZWUgdGVtcG9yYXJ5IGJ1ZmZlcnMgKi8KLSAgICBmcmVlKGRibXZhbC5kcHRyKTsKLQotICAgIC8qIGFsbG93IHRoZSByZWd1bGFyIGV4cGlyaW5nIHRvIG9jY3VyICovCi0gICAgc3NsX3NjYWNoZV9kYm1fZXhwaXJlKHMpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLVNTTF9TRVNTSU9OICpzc2xfc2NhY2hlX2RibV9yZXRyaWV2ZShzZXJ2ZXJfcmVjICpzLCBVQ0hBUiAqaWQsIGludCBpZGxlbikKLXsKLSAgICBTU0xNb2RDb25maWdSZWMgKm1jID0gbXlNb2RDb25maWcoKTsKLSAgICBEQk0gKmRibTsKLSAgICBkYXR1bSBkYm1rZXk7Ci0gICAgZGF0dW0gZGJtdmFsOwotICAgIFNTTF9TRVNTSU9OICpzZXNzID0gTlVMTDsKLSAgICBVQ0hBUiAqdWNwRGF0YTsKLSAgICBpbnQgbkRhdGE7Ci0gICAgdGltZV90IGV4cGlyeTsKLSAgICB0aW1lX3Qgbm93OwotCi0gICAgLyogYWxsb3cgdGhlIHJlZ3VsYXIgZXhwaXJpbmcgdG8gb2NjdXIgKi8KLSAgICBzc2xfc2NhY2hlX2RibV9leHBpcmUocyk7Ci0KLSAgICAvKiBjcmVhdGUgREJNIGtleSBhbmQgdmFsdWVzICovCi0gICAgZGJta2V5LmRwdHIgID0gKGNoYXIgKilpZDsKLSAgICBkYm1rZXkuZHNpemUgPSBpZGxlbjsKLQotICAgIC8qIGFuZCBmZXRjaCBpdCBmcm9tIHRoZSBEQk0gZmlsZSAqLwotICAgIHNzbF9tdXRleF9vbihzKTsKLSAgICBpZiAoKGRibSA9IHNzbF9kYm1fb3BlbihtYy0+c3pTZXNzaW9uQ2FjaGVEYXRhRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPX1JET05MWSwgU1NMX0RCTV9GSUxFX01PREUpKSA9PSBOVUxMKSB7Ci0gICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19FUlJPUnxTU0xfQUREX0VSUk5PLAotICAgICAgICAgICAgICAgICJDYW5ub3Qgb3BlbiBTU0xTZXNzaW9uQ2FjaGUgREJNIGZpbGUgYCVzJyBmb3IgcmVhZGluZyAoZmV0Y2gpIiwKLSAgICAgICAgICAgICAgICBtYy0+c3pTZXNzaW9uQ2FjaGVEYXRhRmlsZSk7Ci0gICAgICAgIHNzbF9tdXRleF9vZmYocyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBkYm12YWwgPSBzc2xfZGJtX2ZldGNoKGRibSwgZGJta2V5KTsKLSAgICBzc2xfZGJtX2Nsb3NlKGRibSk7Ci0gICAgc3NsX211dGV4X29mZihzKTsKLQotICAgIC8qIGltbWVkaWF0ZWx5IHJldHVybiBpZiBub3QgZm91bmQgKi8KLSAgICBpZiAoZGJtdmFsLmRwdHIgPT0gTlVMTCB8fCBkYm12YWwuZHNpemUgPD0gc2l6ZW9mKHRpbWVfdCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgLyogcGFyc2UgcmVzdWx0aW5nIGRhdGEgKi8KLSAgICBuRGF0YSA9IGRibXZhbC5kc2l6ZS1zaXplb2YodGltZV90KTsKLSAgICB1Y3BEYXRhID0gKFVDSEFSICopbWFsbG9jKG5EYXRhKTsKLSAgICBpZiAodWNwRGF0YSA9PSBOVUxMKSAKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgbWVtY3B5KHVjcERhdGEsIChjaGFyICopZGJtdmFsLmRwdHIrc2l6ZW9mKHRpbWVfdCksIG5EYXRhKTsKLSAgICBtZW1jcHkoJmV4cGlyeSwgZGJtdmFsLmRwdHIsIHNpemVvZih0aW1lX3QpKTsKLQotICAgIC8qIG1ha2Ugc3VyZSB0aGUgc3R1ZmYgaXMgc3RpbGwgbm90IGV4cGlyZWQgKi8KLSAgICBub3cgPSB0aW1lKE5VTEwpOwotICAgIGlmIChleHBpcnkgPD0gbm93KSB7Ci0gICAgICAgIHNzbF9zY2FjaGVfZGJtX3JlbW92ZShzLCBpZCwgaWRsZW4pOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvKiB1bnN0cmVhbWVkIFNTTF9TRVNTSU9OICovCi0gICAgc2VzcyA9IGQyaV9TU0xfU0VTU0lPTihOVUxMLCAmdWNwRGF0YSwgbkRhdGEpOwotCi0gICAgcmV0dXJuIHNlc3M7Ci19Ci0KLXZvaWQgc3NsX3NjYWNoZV9kYm1fcmVtb3ZlKHNlcnZlcl9yZWMgKnMsIFVDSEFSICppZCwgaW50IGlkbGVuKQotewotICAgIFNTTE1vZENvbmZpZ1JlYyAqbWMgPSBteU1vZENvbmZpZygpOwotICAgIERCTSAqZGJtOwotICAgIGRhdHVtIGRibWtleTsKLQotICAgIC8qIGNyZWF0ZSBEQk0ga2V5IGFuZCB2YWx1ZXMgKi8KLSAgICBkYm1rZXkuZHB0ciAgPSAoY2hhciAqKWlkOwotICAgIGRibWtleS5kc2l6ZSA9IGlkbGVuOwotCi0gICAgLyogYW5kIGRlbGV0ZSBpdCBmcm9tIHRoZSBEQk0gZmlsZSAqLwotICAgIHNzbF9tdXRleF9vbihzKTsKLSAgICBpZiAoKGRibSA9IHNzbF9kYm1fb3BlbihtYy0+c3pTZXNzaW9uQ2FjaGVEYXRhRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPX1JEV1IsIFNTTF9EQk1fRklMRV9NT0RFKSkgPT0gTlVMTCkgewotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1J8U1NMX0FERF9FUlJOTywKLSAgICAgICAgICAgICAgICAiQ2Fubm90IG9wZW4gU1NMU2Vzc2lvbkNhY2hlIERCTSBmaWxlIGAlcycgZm9yIHdyaXRpbmcgKGRlbGV0ZSkiLAotICAgICAgICAgICAgICAgIG1jLT5zelNlc3Npb25DYWNoZURhdGFGaWxlKTsKLSAgICAgICAgc3NsX211dGV4X29mZihzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzc2xfZGJtX2RlbGV0ZShkYm0sIGRibWtleSk7Ci0gICAgc3NsX2RibV9jbG9zZShkYm0pOwotICAgIHNzbF9tdXRleF9vZmYocyk7Ci0KLSAgICByZXR1cm47Ci19Ci0KLXZvaWQgc3NsX3NjYWNoZV9kYm1fZXhwaXJlKHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgU1NMTW9kQ29uZmlnUmVjICptYyA9IG15TW9kQ29uZmlnKCk7Ci0gICAgU1NMU3J2Q29uZmlnUmVjICpzYyA9IG15U3J2Q29uZmlnKHMpOwotICAgIHN0YXRpYyB0aW1lX3QgdExhc3QgPSAwOwotICAgIERCTSAqZGJtOwotICAgIGRhdHVtIGRibWtleTsKLSAgICBkYXR1bSBkYm12YWw7Ci0gICAgcG9vbCAqcDsKLSAgICB0aW1lX3QgdEV4cGlyZXNBdDsKLSAgICBpbnQgbkVsZW1lbnRzID0gMDsKLSAgICBpbnQgbkRlbGV0ZWQgPSAwOwotICAgIGludCBiRGVsZXRlOwotICAgIGRhdHVtICprZXlsaXN0OwotICAgIGludCBrZXlpZHg7Ci0gICAgaW50IGk7Ci0gICAgdGltZV90IHROb3c7Ci0KLSAgICAvKgotICAgICAqIG1ha2Ugc3VyZSB0aGUgZXhwaXJhdGlvbiBmb3Igc3RpbGwgbm90LWFjY2Vzc2VkIHNlc3Npb24KLSAgICAgKiBjYWNoZSBlbnRyaWVzIGlzIGRvbmUgb25seSBmcm9tIHRpbWUgdG8gdGltZQotICAgICAqLwotICAgIHROb3cgPSB0aW1lKE5VTEwpOwotICAgIGlmICh0Tm93IDwgdExhc3Qrc2MtPm5TZXNzaW9uQ2FjaGVUaW1lb3V0KQotICAgICAgICByZXR1cm47Ci0gICAgdExhc3QgPSB0Tm93OwotCi0gICAgLyoKLSAgICAgKiBIZXJlIHdlIGhhdmUgdG8gYmUgdmVyeSBjYXJlZnVsbHk6IE5vdCBhbGwgREJNIGxpYnJhcmllcyBhcmUKLSAgICAgKiBzbWFydCBlbm91Z2ggdG8gYWxsb3cgb25lIHRvIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMgYW5kIGF0IHRoZQotICAgICAqIHNhbWUgdGltZSBkZWxldGUgZXhwaXJlZCBvbmVzLiBTb21lIG9mIHRoZW0gZ2V0IHRvdGFsbHkgY3JhenkKLSAgICAgKiB3aGlsZSBvdGhlcnMgaGF2ZSBubyBwcm9ibGVtcy4gU28gd2UgaGF2ZSB0byBkbyBpdCB0aGUgc2xvd2VyIGJ1dAotICAgICAqIG1vcmUgc2FmZSB3YXk6IHdlIGZpcnN0IGl0ZXJhdGUgb3ZlciBhbGwgZWxlbWVudHMgYW5kIHJlbWVtYmVyCi0gICAgICogdGhvc2Ugd2hpY2ggaGF2ZSB0byBiZSBleHBpcmVkLiBUaGVuIGluIGEgc2Vjb25kIHBhc3Mgd2UgZGVsZXRlCi0gICAgICogYWxsIHRob3NlIGV4cGlyZWQgZWxlbWVudHMuIEFkZGl0aW9uYWxseSB3ZSByZW9wZW4gdGhlIERCTSBmaWxlCi0gICAgICogdG8gYmUgcmVhbGx5IHNhZmUgaW4gc3RhdGUuCi0gICAgICovCi0KLSNkZWZpbmUgS0VZTUFYIDEwMjQKLQotICAgIHNzbF9tdXRleF9vbihzKTsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIC8qIGFsbG9jYXRlIHRoZSBrZXkgYXJyYXkgaW4gYSBtZW1vcnkgc3ViIHBvb2wgKi8KLSAgICAgICAgaWYgKChwID0gYXBfbWFrZV9zdWJfcG9vbChOVUxMKSkgPT0gTlVMTCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoKGtleWxpc3QgPSBhcF9wYWxsb2MocCwgc2l6ZW9mKGRibWtleSkqS0VZTUFYKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgYXBfZGVzdHJveV9wb29sKHApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBwYXNzIDE6IHNjYW4gREJNIGRhdGFiYXNlICovCi0gICAgICAgIGtleWlkeCA9IDA7Ci0gICAgICAgIGlmICgoZGJtID0gc3NsX2RibV9vcGVuKG1jLT5zelNlc3Npb25DYWNoZURhdGFGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPX1JEV1IsIFNTTF9EQk1fRklMRV9NT0RFKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SfFNTTF9BRERfRVJSTk8sCi0gICAgICAgICAgICAgICAgICAgICJDYW5ub3Qgb3BlbiBTU0xTZXNzaW9uQ2FjaGUgREJNIGZpbGUgYCVzJyBmb3Igc2Nhbm5pbmciLAotICAgICAgICAgICAgICAgICAgICBtYy0+c3pTZXNzaW9uQ2FjaGVEYXRhRmlsZSk7Ci0gICAgICAgICAgICBhcF9kZXN0cm95X3Bvb2wocCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkYm1rZXkgPSBzc2xfZGJtX2ZpcnN0a2V5KGRibSk7Ci0gICAgICAgIHdoaWxlIChkYm1rZXkuZHB0ciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBuRWxlbWVudHMrKzsKLSAgICAgICAgICAgIGJEZWxldGUgPSBGQUxTRTsKLSAgICAgICAgICAgIGRibXZhbCA9IHNzbF9kYm1fZmV0Y2goZGJtLCBkYm1rZXkpOwotICAgICAgICAgICAgaWYgKGRibXZhbC5kc2l6ZSA8PSBzaXplb2YodGltZV90KSB8fCBkYm12YWwuZHB0ciA9PSBOVUxMKQotICAgICAgICAgICAgICAgIGJEZWxldGUgPSBUUlVFOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCZ0RXhwaXJlc0F0LCBkYm12YWwuZHB0ciwgc2l6ZW9mKHRpbWVfdCkpOwotICAgICAgICAgICAgICAgIGlmICh0RXhwaXJlc0F0IDw9IHROb3cpCi0gICAgICAgICAgICAgICAgICAgIGJEZWxldGUgPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJEZWxldGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoKGtleWxpc3Rba2V5aWR4XS5kcHRyID0gYXBfcGFsbG9jKHAsIGRibWtleS5kc2l6ZSkpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGtleWxpc3Rba2V5aWR4XS5kcHRyLCBkYm1rZXkuZHB0ciwgZGJta2V5LmRzaXplKTsKLSAgICAgICAgICAgICAgICAgICAga2V5bGlzdFtrZXlpZHhdLmRzaXplID0gZGJta2V5LmRzaXplOwotICAgICAgICAgICAgICAgICAgICBrZXlpZHgrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGtleWlkeCA9PSBLRVlNQVgpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkYm1rZXkgPSBzc2xfZGJtX25leHRrZXkoZGJtKTsKLSAgICAgICAgfQotICAgICAgICBzc2xfZGJtX2Nsb3NlKGRibSk7Ci0KLSAgICAgICAgLyogcGFzcyAyOiBkZWxldGUgZXhwaXJlZCBlbGVtZW50cyAqLwotICAgICAgICBpZiAoKGRibSA9IHNzbF9kYm1fb3BlbihtYy0+c3pTZXNzaW9uQ2FjaGVEYXRhRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT19SRFdSLCBTU0xfREJNX0ZJTEVfTU9ERSkpID09IE5VTEwpIHsKLSAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19FUlJPUnxTU0xfQUREX0VSUk5PLAotICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlLW9wZW4gU1NMU2Vzc2lvbkNhY2hlIERCTSBmaWxlIGAlcycgZm9yIGV4cGlyaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgbWMtPnN6U2Vzc2lvbkNhY2hlRGF0YUZpbGUpOwotICAgICAgICAgICAgYXBfZGVzdHJveV9wb29sKHApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleWlkeDsgaSsrKSB7Ci0gICAgICAgICAgICBzc2xfZGJtX2RlbGV0ZShkYm0sIGtleWxpc3RbaV0pOwotICAgICAgICAgICAgbkRlbGV0ZWQrKzsKLSAgICAgICAgfQotICAgICAgICBzc2xfZGJtX2Nsb3NlKGRibSk7Ci0KLSAgICAgICAgLyogZGVzdHJveSB0ZW1wb3JhcnkgcG9vbCAqLwotICAgICAgICBhcF9kZXN0cm95X3Bvb2wocCk7Ci0KLSAgICAgICAgaWYgKGtleWlkeCA8IEtFWU1BWCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBzc2xfbXV0ZXhfb2ZmKHMpOwotCi0gICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLCAiSW50ZXItUHJvY2VzcyBTZXNzaW9uIENhY2hlIChEQk0pIEV4cGlyeTogIgotICAgICAgICAgICAgIm9sZDogJWQsIG5ldzogJWQsIHJlbW92ZWQ6ICVkIiwgbkVsZW1lbnRzLCBuRWxlbWVudHMtbkRlbGV0ZWQsIG5EZWxldGVkKTsKLSAgICByZXR1cm47Ci19Ci0KLXZvaWQgc3NsX3NjYWNoZV9kYm1fc3RhdHVzKHNlcnZlcl9yZWMgKnMsIHBvb2wgKnAsIHZvaWQgKCpmdW5jKShjaGFyICosIHZvaWQgKiksIHZvaWQgKmFyZykKLXsKLSAgICBTU0xNb2RDb25maWdSZWMgKm1jID0gbXlNb2RDb25maWcoKTsKLSAgICBEQk0gKmRibTsKLSAgICBkYXR1bSBkYm1rZXk7Ci0gICAgZGF0dW0gZGJtdmFsOwotICAgIGludCBuRWxlbTsKLSAgICBpbnQgblNpemU7Ci0gICAgaW50IG5BdmVyYWdlOwotCi0gICAgbkVsZW0gPSAwOwotICAgIG5TaXplID0gMDsKLSAgICBzc2xfbXV0ZXhfb24ocyk7Ci0gICAgaWYgKChkYm0gPSBzc2xfZGJtX29wZW4obWMtPnN6U2Vzc2lvbkNhY2hlRGF0YUZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT19SRE9OTFksIFNTTF9EQk1fRklMRV9NT0RFKSkgPT0gTlVMTCkgewotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1J8U1NMX0FERF9FUlJOTywKLSAgICAgICAgICAgICAgICAiQ2Fubm90IG9wZW4gU1NMU2Vzc2lvbkNhY2hlIERCTSBmaWxlIGAlcycgZm9yIHN0YXR1cyByZXRyaXZhbCIsCi0gICAgICAgICAgICAgICAgbWMtPnN6U2Vzc2lvbkNhY2hlRGF0YUZpbGUpOwotICAgICAgICBzc2xfbXV0ZXhfb2ZmKHMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGRibWtleSA9IHNzbF9kYm1fZmlyc3RrZXkoZGJtKTsKLSAgICBmb3IgKCA7IGRibWtleS5kcHRyICE9IE5VTEw7IGRibWtleSA9IHNzbF9kYm1fbmV4dGtleShkYm0pKSB7Ci0gICAgICAgIGRibXZhbCA9IHNzbF9kYm1fZmV0Y2goZGJtLCBkYm1rZXkpOwotICAgICAgICBpZiAoZGJtdmFsLmRwdHIgPT0gTlVMTCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBuRWxlbSArPSAxOwotICAgICAgICBuU2l6ZSArPSBkYm12YWwuZHNpemU7Ci0gICAgfQotICAgIHNzbF9kYm1fY2xvc2UoZGJtKTsKLSAgICBzc2xfbXV0ZXhfb2ZmKHMpOwotICAgIGlmIChuU2l6ZSA+IDAgJiYgbkVsZW0gPiAwKQotICAgICAgICBuQXZlcmFnZSA9IG5TaXplIC8gbkVsZW07Ci0gICAgZWxzZQotICAgICAgICBuQXZlcmFnZSA9IDA7Ci0gICAgZnVuYyhhcF9wc3ByaW50ZihwLCAiY2FjaGUgdHlwZTogPGI+REJNPC9iPiwgbWF4aW11bSBzaXplOiA8Yj51bmxpbWl0ZWQ8L2I+PGJyPiIpLCBhcmcpOwotICAgIGZ1bmMoYXBfcHNwcmludGYocCwgImN1cnJlbnQgc2Vzc2lvbnM6IDxiPiVkPC9iPiwgY3VycmVudCBzaXplOiA8Yj4lZDwvYj4gYnl0ZXM8YnI+IiwgbkVsZW0sIG5TaXplKSwgYXJnKTsKLSAgICBmdW5jKGFwX3BzcHJpbnRmKHAsICJhdmVyYWdlIHNlc3Npb24gc2l6ZTogPGI+JWQ8L2I+IGJ5dGVzPGJyPiIsIG5BdmVyYWdlKSwgYXJnKTsKLSAgICByZXR1cm47Ci19Ci0KZGlmZiAtLWdpdCBhL21vZHVsZXMvc3NsL3NzbF9zY2FjaGVfc2htY2IuYyBiL21vZHVsZXMvc3NsL3NzbF9zY2FjaGVfc2htY2IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU4OGYwYS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL3NzbC9zc2xfc2NhY2hlX3NobWNiLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQzICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgIF8gICAgICAgICAgICAgXwotKiogIF8gX18gX19fICAgX19fICAgX198IHwgICAgX19fIF9fX3wgfCAgbW9kX3NzbAotKiogfCAnXyBgIF8gXCAvIF8gXCAvIF9gIHwgICAvIF9fLyBfX3wgfCAgQXBhY2hlIEludGVyZmFjZSB0byBPcGVuU1NMCi0qKiB8IHwgfCB8IHwgfCAoXykgfCAoX3wgfCAgIFxfXyBcX18gXCB8ICB3d3cubW9kc3NsLm9yZwotKiogfF98IHxffCB8X3xcX19fLyBcX18sX3xfX198X19fL19fXy9ffCAgZnRwLm1vZHNzbC5vcmcKLSoqICAgICAgICAgICAgICAgICAgICAgIHxfX19fX3wKLSoqICBzc2xfc2NhY2hlX3NobWNiLmMKLSoqICBTZXNzaW9uIENhY2hlIHZpYSBTaGFyZWQgTWVtb3J5IChDeWNsaWMgQnVmZmVyIFZhcmlhbnQpCi0qLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgUmFsZiBTLiBFbmdlbHNjaGFsbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLSAqICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLSAqICAgICBSYWxmIFMuIEVuZ2Vsc2NoYWxsIDxyc2VAZW5nZWxzY2hhbGwuY29tPiBmb3IgdXNlIGluIHRoZQotICogICAgIG1vZF9zc2wgcHJvamVjdCAoaHR0cDovL3d3dy5tb2Rzc2wub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAibW9kX3NzbCIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIHJzZUBlbmdlbHNjaGFsbC5jb20uCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIm1vZF9zc2wiCi0gKiAgICBub3IgbWF5ICJtb2Rfc3NsIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvcgotICogICAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFJhbGYgUy4gRW5nZWxzY2hhbGwuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotICogICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+IGZvciB1c2UgaW4gdGhlCi0gKiAgICAgbW9kX3NzbCBwcm9qZWN0IChodHRwOi8vd3d3Lm1vZHNzbC5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBSQUxGIFMuIEVOR0VMU0NIQUxMIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBSQUxGIFMuIEVOR0VMU0NIQUxMIE9SCi0gKiBISVMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLQotI2luY2x1ZGUgIm1vZF9zc2wuaCIKLQotLyogCi0gKiBUaGlzIHNoYXJlZCBtZW1vcnkgYmFzZWQgU1NMIHNlc3Npb24gY2FjaGUgaW1wbGVtZW50YXRpb24gd2FzCi0gKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgR2VvZmYgVGhvcnBlIDxnZW9mZkBldS5jMi5uZXQ+IGZvciBDMk5ldCBFdXJvcGUKLSAqIGFuZCBhcyBhIGNvbnRyaWJ1dGlvbiB0byBSYWxmIEVuZ2Vsc2NoYWxsJ3MgbW9kX3NzbCBwcm9qZWN0LgotICovCi0KLS8qCi0gKiBUaGUgc2hhcmVkLW1lbW9yeSBzZWdtZW50IGhlYWRlciBjYW4gYmUgY2FzdCB0byBhbmQgZnJvbSB0aGUKLSAqIFNITUNCSGVhZGVyIHR5cGUsIGFsbCBvdGhlciBzdHJ1Y3R1cmVzIG5lZWQgdG8gYmUgaW5pdGlhbGlzZWQgYnkKLSAqIHV0aWxpdHkgZnVuY3Rpb25zLgotICoKLSAqIFRoZSAiaGVhZGVyIiBsb29rcyBsaWtlIHRoaXM7Ci0gKgotICogZGF0YSBhcHBseWluZyB0byB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmU6Ci0gKiAtIGRpdmlzaW9uX29mZnNldCAodW5zaWduZWQgaW50KToKLSAqICAgaG93IGZhciBpbnRvIHRoZSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQgdGhlIGZpcnN0IGRpdmlzaW9uIGlzLgotICogLSBkaXZpc2lvbl9zaXplICh1bnNpZ25lZCBpbnQpOgotICogICBob3cgbWFueSBieXRlcyBlYWNoIGRpdmlzaW9uIG9jY3VwaWVzLgotICogICAoTkI6IFRoaXMgaW5jbHVkZXMgdGhlIHF1ZXVlIGFuZCB0aGUgY2FjaGUpCi0gKiAtIGRpdmlzaW9uX21hc2sgKHVuc2lnbmVkIGNoYXIpOgotICogICB0aGUgIm1hc2siIGluIHRoZSBuZXh0IGxpbmUuIEFkZCBvbmUgdG8gdGhpcywKLSAqICAgYW5kIHRoYXQncyB0aGUgbnVtYmVyIG9mIGRpdmlzaW9ucy4KLSAqCi0gKiBkYXRhIGFwcGx5aW5nIHRvIHdpdGhpbiBlYWNoIGRpdmlzaW9uOgotICogLSBxdWV1ZV9zaXplICh1bnNpZ25lZCBpbnQpOgotICogICBob3cgYmlnIGVhY2ggInF1ZXVlIiBpcy4gTkI6IFRoZSBxdWV1ZSBpcyB0aGUgZmlyc3QgYmxvY2sgaW4gZWFjaAotICogICBkaXZpc2lvbiBhbmQgaXMgZm9sbG93ZWQgaW1tZWRpYXRlbHkgYnkgdGhlIGNhY2hlIGl0c2VsZiBzbyBzbwotICogICB0aGVyZSdzIG5vIGNhY2hlX29mZnNldCB2YWx1ZS4KLSAqCi0gKiBkYXRhIGFwcGx5aW5nIHRvIHdpdGhpbiBlYWNoIHF1ZXVlOgotICogLSBpbmRleF9udW0gKHVuc2lnbmVkIGNoYXIpOgotICogICBob3cgbWFueSBpbmRleGVzIGluIGVhY2ggY2FjaGUncyBxdWV1ZQotICogLSBpbmRleF9vZmZzZXQgKHVuc2lnbmVkIGNoYXIpOgotICogICBob3cgZmFyIGludG8gdGhlIHF1ZXVlIHRoZSBmaXJzdCBpbmRleCBpcy4KLSAqIC0gaW5kZXhfc2l6ZToKLSAqICAgaG93IGJpZyBlYWNoIGluZGV4IGlzLgotICoKLSAqIGRhdGEgYXBwbHlpbmcgdG8gd2l0aGluIGVhY2ggY2FjaGU6Ci0gKiAtIGNhY2hlX2RhdGFfb2Zmc2V0ICh1bnNpZ25lZCBpbnQpOgotICogICBob3cgZmFyIGludG8gdGhlIGNhY2hlIHRoZSBzZXNzaW9uLWRhdGEgYXJyYXkgaXMgc3RvcmVkLgotICogLSBjYWNoZV9kYXRhX3NpemUgKHVuc2lnbmVkIGludCk6Ci0gKiAgIGhvdyBiaWcgZWFjaCBjYWNoZSdzIGRhdGEgYmxvY2sgaXMuCi0gKgotICogc3RhdGlzdGljcyBkYXRhICh0aGlzIHdpbGwgZXZlbnR1YWxseSBiZSBwZXItZGl2aXNpb24gYnV0IHJpZ2h0IG5vdwotICogdGhlcmUncyBvbmx5IG9uZSBtdXRleCk6Ci0gKiAtIHN0b3JlcyAodW5zaWduZWQgbG9uZyk6Ci0gKiAgIGhvdyBtYW55IHN0b3JlcyBoYXZlIGJlZW4gcGVyZm9ybWVkIGluIHRoZSBjYWNoZS4KLSAqIC0gZXhwaXJpZXMgKHVuc2lnbmVkIGxvbmcpOgotICogICBob3cgbWFueSBzZXNzaW9uIGhhdmUgYmVlbiBleHBpcmVkIGZyb20gdGhlIGNhY2hlLgotICogLSBzY3JvbGxlZCAodW5zaWduZWQgbG9uZyk6Ci0gKiAgIGhvdyBtYW55IHNlc3Npb25zIGhhdmUgYmVlbiBzY3JvbGxlZCBvdXQgb2YgZnVsbCBjYWNoZSBkdXJpbmcgYQotICogICAic3RvcmUiIG9wZXJhdGlvbi4gVGhpcyBpcyBkaWZmZXJlbnQgdG8gdGhlICJyZW1vdmVzIiBzdGF0cyBhcwotICogICB0aGV5IGFyZSByZXF1ZXN0ZWQgYnkgbW9kX3NzbC9BcGFjaGUsIHRoZXNlIGFyZSBkb25lIGJlY2F1c2Ugb2YKLSAqICAgY2FjaGUgbG9naXN0aWNzLiAoTkI6IEFsc28sIHRoaXMgdmFsdWUgc2hvdWxkIGJlIGRlZHVjaWJsZSBmcm9tCi0gKiAgIHRoZSBvdGhlcnMgaWYgbXkgY29kZSBoYXMgbm8gYnVncywgYnV0IEkgY291bnQgaXQgYW55d2F5IC0gcGx1cwotICogICBpdCBoZWxwcyBkZWJ1Z2dpbmcgOi0pLgotICogLSByZXRyaWV2ZXNfaGl0ICh1bnNpZ25lZCBsb25nKToKLSAqICAgaG93IG1hbnkgc2Vzc2lvbi1yZXRyaWV2ZXMgaGF2ZSBzdWNjZWVkZWQuCi0gKiAtIHJldHJpZXZlc19taXNzICh1bnNpZ25lZCBsb25nKToKLSAqICAgaG93IG1hbnkgc2Vzc2lvbi1yZXRyaWV2ZXMgaGF2ZSBmYWlsZWQuCi0gKiAtIHJlbW92ZXNfaGl0ICh1bnNpZ25lZCBsb25nKToKLSAqIC0gcmVtb3Zlc19taXNzICh1bnNpZ25lZCBsb25nKToKLSAqIAotICogRm9sbG93aW5nIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBoZWFkZXIgaXMgYW4gYXJyYXkgb2YgImRpdmlzaW9ucyIuCi0gKiBFYWNoIGRpdmlzaW9uIGlzIHNpbXBseSBhICJxdWV1ZSIgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgaXRzCi0gKiBjb3JyZXNwb25kaW5nICJjYWNoZSIuIEVhY2ggZGl2aXNpb24gaGFuZGxlcyBzb21lIHByZS1kZWZpbmVkIGJhbmQKLSAqIG9mIHNlc3Npb25zIGJ5IHVzaW5nIHRoZSAiZGl2aXNpb25fbWFzayIgaW4gdGhlIGhlYWRlci4gRWcuIGlmCi0gKiBkaXZpc2lvbl9tYXNrPTB4MWYgdGhlbiB0aGVyZSBhcmUgMzIgZGl2aXNpb25zLCB0aGUgZmlyc3Qgb2Ygd2hpY2gKLSAqIHdpbGwgc3RvcmUgc2Vzc2lvbnMgd2hvc2UgbGVhc3Qtc2lnbmlmaWNhbnQgNSBiaXRzIGFyZSAwLCB0aGUgc2Vjb25kCi0gKiBzdG9yZXMgc2Vzc2lvbiB3aG9zZSBMUyA1IGJpdHMgZXF1YWwgMSwgZXRjLiBBIHF1ZXVlIGlzIGFuIGluZGV4aW5nCi0gKiBzdHJ1Y3R1cmUgcmVmZXJyaW5nIHRvIGl0cyBjb3JyZXNwb25kaW5nIGNhY2hlLgotICoKLSAqIEEgInF1ZXVlIiBsb29rcyBsaWtlIHRoaXM7Ci0gKgotICogLSBmaXJzdF9wb3MgKHVuc2lnbmVkIGludCk6Ci0gKiAgIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIGFycmF5IG9mIGluZGV4ZXMgd2hlcmUgdGhlIHZpcnR1YWwKLSAqICAgImxlZnQtaGFuZC1lZGdlIiBvZiB0aGUgY3ljbGljIGJ1ZmZlciBpcy4KLSAqIC0gcG9zX2NvdW50ICh1bnNpZ25lZCBpbnQpOgotICogICB0aGUgbnVtYmVyIG9mIGluZGV4ZXMgb2NjdXBpZWQgZnJvbSBmaXJzdF9wb3Mgb253YXJkcy4KLSAqCi0gKiAuLi5mb2xsb3dlZCBieSBhbiBhcnJheSBvZiBpbmRleGVzLCBlYWNoIG9mIHdoaWNoIGNhbiBiZQotICogbWVtY3B5J2QgdG8gYW5kIGZyb20gYW4gU0hNQ0JJbmRleCwgYW5kIGxvb2sgbGlrZSB0aGlzOwotICoKLSAqIC0gZXhwaXJlcyAodGltZV90KToKLSAqICAgdGhlIHRpbWUoKSB2YWx1ZSBhdCB3aGljaCB0aGlzIHNlc3Npb24gZXhwaXJlcy4KLSAqIC0gb2Zmc2V0ICh1bnNpZ25lZCBpbnQpOgotICogICB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgY2FjaGUgZGF0YSBibG9jayB3aGVyZSB0aGUgY29ycmVzcG9uZGluZwotICogICBzZXNzaW9uIGlzIHN0b3JlZC4KLSAqIC0gc19pZDIgKHVuc2lnbmVkIGNoYXIpOgotICogICB0aGUgc2Vjb25kIGJ5dGUgb2YgdGhlIHNlc3Npb25faWQsIHN0b3JlZCBhcyBhbiBvcHRpbWlzYXRpb24gdG8KLSAqICAgcmVkdWNlIHRoZSBudW1iZXIgb2YgZDJpX1NTTF9TRVNTSU9OIGNhbGxzIHRoYXQgYXJlIG1hZGUgd2hlbiBkb2luZwotICogICBhIGxvb2t1cC4KLSAqIC0gcmVtb3ZlZCAodW5zaWduZWQgY2hhcik6Ci0gKiAgIGEgYnl0ZSB1c2VkIHRvIGluZGljYXRlIHdoZXRoZXIgYSBzZXNzaW9uIGhhcyBiZWVuICJwYXNzaXZlbHkiCi0gKiAgIHJlbW92ZWQuIEllLiBpdCBpcyBzdGlsbCBpbiB0aGUgY2FjaGUgYnV0IGlzIHRvIGJlIGRpc3JlZ2FyZGVkIGJ5Ci0gKiAgIGFueSAicmV0cmlldmUiIG9wZXJhdGlvbi4KLSAqCi0gKiBBICJjYWNoZSIgbG9va3MgbGlrZSB0aGlzOwotICoKLSAqIC0gZmlyc3RfcG9zICh1bnNpZ25lZCBpbnQpOgotICogICB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBkYXRhIGJsb2NrIHdoZXJlIHRoZSB2aXJ0dWFsCi0gKiAgICJsZWZ0LWhhbmQtZWRnZSIgb2YgdGhlIGN5Y2xpYyBidWZmZXIgaXMuCi0gKiAtIHBvc19jb3VudCAodW5zaWduZWQgaW50KToKLSAqICAgdGhlIG51bWJlciBvZiBieXRlcyB1c2VkIGluIHRoZSBkYXRhIGJsb2NrIGZyb20gZmlyc3RfcG9zIG9ud2FyZHMuCi0gKgotICogLi4uZm9sbG93ZWQgYnkgdGhlIGRhdGEgYmxvY2sgaW4gd2hpY2ggYWN0dWFsIERFUi1lbmNvZGVkIFNTTAotICogc2Vzc2lvbnMgYXJlIHN0b3JlZC4KLSAqLwotCi0vKiAKLSAqIEhlYWRlciAtIGNhbiBiZSBtZW1jcHknZCB0byBhbmQgZnJvbSB0aGUgZnJvbnQgb2YgdGhlIHNoYXJlZAotICogbWVtb3J5IHNlZ21lbnQuIE5COiBUaGUgZmlyc3QgY29weSAoY29tbWVudGVkIG91dCkgaGFzIHRoZQotICogZWxlbWVudHMgaW4gYSBtZWFuaW5nZnVsIG9yZGVyLCBidXQgZHVlIHRvIGRhdGEtYWxpZ25tZW50Ci0gKiBicmFpbmRlYWRuZXNzLCB0aGUgc2Vjb25kICh1bmNvbW1lbnRlZCkgY29weSBoYXMgdGhlIHR5cGVzIGdyb3VwZWQKLSAqIHNvIGFzIHRvIGRlY3JlYXNlICJzdHJ1Y3QtYmxvYXQiLiBzaWdoLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0jaWYgMAotICAgIHVuc2lnbmVkIGNoYXIgZGl2aXNpb25fbWFzazsKLSAgICB1bnNpZ25lZCBpbnQgZGl2aXNpb25fb2Zmc2V0OwotICAgIHVuc2lnbmVkIGludCBkaXZpc2lvbl9zaXplOwotICAgIHVuc2lnbmVkIGludCBxdWV1ZV9zaXplOwotICAgIHVuc2lnbmVkIGNoYXIgaW5kZXhfbnVtOwotICAgIHVuc2lnbmVkIGNoYXIgaW5kZXhfb2Zmc2V0OwotICAgIHVuc2lnbmVkIGNoYXIgaW5kZXhfc2l6ZTsKLSAgICB1bnNpZ25lZCBpbnQgY2FjaGVfZGF0YV9vZmZzZXQ7Ci0gICAgdW5zaWduZWQgaW50IGNhY2hlX2RhdGFfc2l6ZTsKLSAgICB1bnNpZ25lZCBsb25nIG51bV9zdG9yZXM7Ci0gICAgdW5zaWduZWQgbG9uZyBudW1fZXhwaXJpZXM7Ci0gICAgdW5zaWduZWQgbG9uZyBudW1fc2Nyb2xsZWQ7Ci0gICAgdW5zaWduZWQgbG9uZyBudW1fcmV0cmlldmVzX2hpdDsKLSAgICB1bnNpZ25lZCBsb25nIG51bV9yZXRyaWV2ZXNfbWlzczsKLSAgICB1bnNpZ25lZCBsb25nIG51bV9yZW1vdmVzX2hpdDsKLSAgICB1bnNpZ25lZCBsb25nIG51bV9yZW1vdmVzX21pc3M7Ci0jZWxzZQotICAgIHVuc2lnbmVkIGxvbmcgbnVtX3N0b3JlczsKLSAgICB1bnNpZ25lZCBsb25nIG51bV9leHBpcmllczsKLSAgICB1bnNpZ25lZCBsb25nIG51bV9zY3JvbGxlZDsKLSAgICB1bnNpZ25lZCBsb25nIG51bV9yZXRyaWV2ZXNfaGl0OwotICAgIHVuc2lnbmVkIGxvbmcgbnVtX3JldHJpZXZlc19taXNzOwotICAgIHVuc2lnbmVkIGxvbmcgbnVtX3JlbW92ZXNfaGl0OwotICAgIHVuc2lnbmVkIGxvbmcgbnVtX3JlbW92ZXNfbWlzczsKLSAgICB1bnNpZ25lZCBpbnQgZGl2aXNpb25fb2Zmc2V0OwotICAgIHVuc2lnbmVkIGludCBkaXZpc2lvbl9zaXplOwotICAgIHVuc2lnbmVkIGludCBxdWV1ZV9zaXplOwotICAgIHVuc2lnbmVkIGludCBjYWNoZV9kYXRhX29mZnNldDsKLSAgICB1bnNpZ25lZCBpbnQgY2FjaGVfZGF0YV9zaXplOwotICAgIHVuc2lnbmVkIGNoYXIgZGl2aXNpb25fbWFzazsKLSAgICB1bnNpZ25lZCBjaGFyIGluZGV4X251bTsKLSAgICB1bnNpZ25lZCBjaGFyIGluZGV4X29mZnNldDsKLSAgICB1bnNpZ25lZCBjaGFyIGluZGV4X3NpemU7Ci0jZW5kaWYKLX0gU0hNQ0JIZWFkZXI7Ci0KLS8qIAotICogSW5kZXggLSBjYW4gYmUgbWVtY3B5J2QgdG8gYW5kIGZyb20gYW4gaW5kZXggaW5zaWRlIGVhY2gKLSAqIHF1ZXVlJ3MgaW5kZXggYXJyYXkuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB0aW1lX3QgZXhwaXJlczsKLSAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotICAgIHVuc2lnbmVkIGNoYXIgc19pZDI7Ci0gICAgdW5zaWduZWQgY2hhciByZW1vdmVkOwotfSBTSE1DQkluZGV4OwotCi0vKiAKLSAqIFF1ZXVlIC0gbXVzdCBiZSBwb3B1bGF0ZWQgYnkgYSBjYWxsIHRvIHNobWNiX2dldF9kaXZpc2lvbgotICogYW5kIHRoZSBzdHJ1Y3R1cmUncyBwb2ludGVycyBhcmUgdXNlZCBmb3IgdXBkYXRpbmcgKGllLgotICogdGhlIHN0cnVjdHVyZSBkb2Vzbid0IG5lZWQgYW55ICJzZXQiIHRvIHVwZGF0ZSB2YWx1ZXMpLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgU0hNQ0JIZWFkZXIgKmhlYWRlcjsKLSAgICB1bnNpZ25lZCBpbnQgKmZpcnN0X3BvczsKLSAgICB1bnNpZ25lZCBpbnQgKnBvc19jb3VudDsKLSAgICBTSE1DQkluZGV4ICppbmRleGVzOwotfSBTSE1DQlF1ZXVlOwotCi0vKiAKLSAqIENhY2hlIC0gc2FtZSBjb21tZW50IGFzIGZvciBRdWV1ZS4gJ1F1ZXVlJ3MgYXJlIGluIGEgMS0xCi0gKiBjb3JyZXNwb25kYW5jZSB3aXRoICdDYWNoZSdzIGFuZCBhcmUgdXN1YWxseSBjYXJyaWVkIHJvdW5kCi0gKiBpbiBhIHBhaXIsIHRoZXkgYXJlIG9ubHkgc2VwZXJhdGVkIGZvciBjbGFyaXR5LgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgU0hNQ0JIZWFkZXIgKmhlYWRlcjsKLSAgICB1bnNpZ25lZCBpbnQgKmZpcnN0X3BvczsKLSAgICB1bnNpZ25lZCBpbnQgKnBvc19jb3VudDsKLSAgICB1bnNpZ25lZCBjaGFyICpkYXRhOwotfSBTSE1DQkNhY2hlOwotCi0vKgotICogRm9yd2FyZCBmdW5jdGlvbiBwcm90b3R5cGVzLgotICovCi0KLS8qIEZ1bmN0aW9ucyBmb3Igd29ya2luZyBhcm91bmQgZGF0YS1hbGlnbm1lbnQtcGlja3kgc3lzdGVtcyAoc3BhcmNzLAotICAgSXJpeCwgZXRjKS4gVGhlc2UgdXNlICJtZW1jcHkiIGFzIGEgd2F5IG9mIGZveGluZyB0aGVzZSBzeXN0ZW1zIGludG8KLSAgIHRyZWF0aW5nIHRoZSBjb21wb3NpdGUgdHlwZXMgYXMgYnl0ZS1hcnJheXMgcmF0aGVyIHRoYW4gaGlnaGVyLWxldmVsCi0gICBwcmltaXRpdmVzIHRoYXQgaXQgcHJlZmVycyB0byBoYXZlIDQtKG9yIDgtKWJ5dGUgYWxpZ25lZC4gSSBkb24ndAotICAgZW52aXNhZ2UgdGhpcyBiZWluZyBhIHBlcmZvcm1hbmNlIGlzc3VlIGFzIGEgY291cGxlIG9mIDIgb3IgNCBieXRlCi0gICBtZW1jcHlzIGNhbiBoYXJkbHkgbWFrZSBhIGRlbnQgb24gdGhlIG1hc3NpdmUgbWVtbW92ZSBvcGVyYXRpb25zIHRoaXMKLSAgIGNhY2hlIHRlY2huaXF1ZSBhdm9pZHMsIG5vciB0aGUgb3ZlcmhlYWRzIG9mIEFTTiBlbi9kZWNvZGluZy4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2htY2JfZ2V0X3NhZmVfdWludCh1bnNpZ25lZCBpbnQgKik7Ci1zdGF0aWMgdm9pZCBzaG1jYl9zZXRfc2FmZV91aW50KHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBpbnQpOwotI2lmIDAgLyogVW51c2VkIHNvIGZhciAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgc2htY2JfZ2V0X3NhZmVfdWxvbmcodW5zaWduZWQgbG9uZyAqKTsKLXN0YXRpYyB2b2lkIHNobWNiX3NldF9zYWZlX3Vsb25nKHVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgbG9uZyk7Ci0jZW5kaWYKLXN0YXRpYyB0aW1lX3Qgc2htY2JfZ2V0X3NhZmVfdGltZSh0aW1lX3QgKik7Ci1zdGF0aWMgdm9pZCBzaG1jYl9zZXRfc2FmZV90aW1lKHRpbWVfdCAqLCB0aW1lX3QpOwotCi0vKiBVbmRlcmx5aW5nIGZ1bmN0aW9ucyBmb3Igc2Vzc2lvbi1jYWNoaW5nICovCi1zdGF0aWMgQk9PTCBzaG1jYl9pbml0X21lbW9yeShzZXJ2ZXJfcmVjICosIHZvaWQgKiwgdW5zaWduZWQgaW50KTsKLXN0YXRpYyBCT09MIHNobWNiX3N0b3JlX3Nlc3Npb24oc2VydmVyX3JlYyAqLCB2b2lkICosIFVDSEFSICosIGludCwgU1NMX1NFU1NJT04gKiwgdGltZV90KTsKLXN0YXRpYyBTU0xfU0VTU0lPTiAqc2htY2JfcmV0cmlldmVfc2Vzc2lvbihzZXJ2ZXJfcmVjICosIHZvaWQgKiwgVUNIQVIgKiwgaW50KTsKLXN0YXRpYyBCT09MIHNobWNiX3JlbW92ZV9zZXNzaW9uKHNlcnZlcl9yZWMgKiwgdm9pZCAqLCBVQ0hBUiAqLCBpbnQpOwotCi0vKiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBzdHJ1Y3R1cmVzICovCi1zdGF0aWMgdm9pZCBzaG1jYl9nZXRfaGVhZGVyKHZvaWQgKiwgU0hNQ0JIZWFkZXIgKiopOwotc3RhdGljIEJPT0wgc2htY2JfZ2V0X2RpdmlzaW9uKFNITUNCSGVhZGVyICosIFNITUNCUXVldWUgKiwgU0hNQ0JDYWNoZSAqLCB1bnNpZ25lZCBpbnQpOwotc3RhdGljIFNITUNCSW5kZXggKnNobWNiX2dldF9pbmRleChjb25zdCBTSE1DQlF1ZXVlICosIHVuc2lnbmVkIGludCk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHNobWNiX2V4cGlyZV9kaXZpc2lvbihzZXJ2ZXJfcmVjICosIFNITUNCUXVldWUgKiwgU0hNQ0JDYWNoZSAqKTsKLXN0YXRpYyBCT09MIHNobWNiX2luc2VydF9lbmNvZGVkX3Nlc3Npb24oc2VydmVyX3JlYyAqLCBTSE1DQlF1ZXVlICosIFNITUNCQ2FjaGUgKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGNoYXIgKiwgdGltZV90KTsKLXN0YXRpYyBTU0xfU0VTU0lPTiAqc2htY2JfbG9va3VwX3Nlc3Npb25faWQoc2VydmVyX3JlYyAqLCBTSE1DQlF1ZXVlICosIFNITUNCQ2FjaGUgKiwgVUNIQVIgKiwgaW50KTsKLXN0YXRpYyBCT09MIHNobWNiX3JlbW92ZV9zZXNzaW9uX2lkKHNlcnZlcl9yZWMgKiwgU0hNQ0JRdWV1ZSAqLCBTSE1DQkNhY2hlICosIFVDSEFSICosIGludCk7Ci0KLS8qCi0gKiBEYXRhLWFsaWdubWVudCBmdW5jdGlvbnMgKGEuay5hLiBhdm9pZGFuY2UgdGFjdGljcykKLSAqCi0gKiBOQjogT24gSFBVWCAoYW5kIHBvc3NpYmx5IG90aGVycykgdGhlcmUgaXMgYSAqdmVyeSogbWlzY2hpZXZvdXMgbGl0dGxlCi0gKiAib3B0aW1pc2F0aW9uIiBpbiB0aGUgY29tcGlsZXJzIHdoZXJlIGl0IHdpbGwgY29udmVydCB0aGUgZm9sbG93aW5nOwotICogICAgICBtZW1jcHkoZGVzdF9wdHIsICZzb3VyY2UsIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKLSAqICh3aGVyZSBkZXN0X3B0ciBpcyBvZiB0eXBlICh1bnNpZ25lZCBpbnQgKikgYW5kIHNvdXJjZSBpcyAodW5zaWduZWQgaW50KSkKLSAqIGludG87Ci0gKiAgICAgICpkZXN0X3B0ciA9IHNvdXJjZTsgKG9yICpkZXN0X3B0ciA9ICooJnNvdXJjZSksIG5vdCBzdXJlKS4KLSAqIEVpdGhlciB3YXksIGl0IGNvbXBsZXRlbHkgZGVzdHJveXMgdGhlIHdob2xlIHBvaW50IG9mIHRoZXNlIF9zYWZlXwotICogZnVuY3Rpb25zLCBiZWNhdXNlIHRoZSBhc3NpZ25tZW50IG9wZXJhdGlvbiB3aWxsIGZhbGwgdmljdGltIHRvIHRoZQotICogYXJjaGl0ZWN0dXJlJ3MgYnl0ZS1hbGlnbm1lbnQgZGljdGF0aW9ucywgd2hlcmVhcyB0aGUgbWVtY3B5IChhcyBhCi0gKiBieXRlLWJ5LWJ5dGUgY29weSkgc2hvdWxkIG5vdC4gc2lnaC4gU28sIGlmIHlvdSdyZSB3b25kZXJpbmcgYWJvdXQgdGhlCi0gKiBhcHBhcmVudGx5IHVubmVjZXNzYXJ5IGNvbnZlcnNpb25zIHRvICh1bnNpZ25lZCBjaGFyICopIGluIHRoZXNlCi0gKiBmdW5jdGlvbnMsIHlvdSBub3cgaGF2ZSBhbiBleHBsYW5hdGlvbi4gRG9uJ3QganVzdCByZXZlcnQgdGhlbSBiYWNrIGFuZAotICogc2F5ICJvb2ggbG9vaywgaXQgc3RpbGwgd29ya3MiIC0gaWYgeW91IHRyeSBpdCBvbiBIUFVYICh3ZWxsLCAzMi1iaXQKLSAqIEhQVVggMTEuMDAgYXQgbGVhc3QpIHlvdSBtYXkgZmluZCBpdCBmYWlscyB3aXRoIGEgU0lHQlVTLiA6LSgKLSAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50IHNobWNiX2dldF9zYWZlX3VpbnQodW5zaWduZWQgaW50ICpwdHIpCi17Ci0gICAgdW5zaWduZWQgY2hhciAqZnJvbTsKLSAgICB1bnNpZ25lZCBpbnQgcmV0OwotCi0gICAgZnJvbSA9ICh1bnNpZ25lZCBjaGFyICopcHRyOwotICAgIG1lbWNweSgmcmV0LCBmcm9tLCBzaXplb2YodW5zaWduZWQgaW50KSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgc2htY2Jfc2V0X3NhZmVfdWludCh1bnNpZ25lZCBpbnQgKnB0ciwgdW5zaWduZWQgaW50IHZhbCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyICp0bywgKmZyb207Ci0KLSAgICB0byA9ICh1bnNpZ25lZCBjaGFyICopcHRyOwotICAgIGZyb20gPSAodW5zaWduZWQgY2hhciAqKSgmdmFsKTsKLSAgICBtZW1jcHkodG8sIGZyb20sIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKLX0KLQotI2lmIDAgLyogVW51c2VkIHNvIGZhciAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgc2htY2JfZ2V0X3NhZmVfdWxvbmcodW5zaWduZWQgbG9uZyAqcHRyKQotewotICAgIHVuc2lnbmVkIGNoYXIgKmZyb207Ci0gICAgdW5zaWduZWQgbG9uZyByZXQ7Ci0KLSAgICBmcm9tID0gKHVuc2lnbmVkIGNoYXIgKilwdHI7Ci0gICAgbWVtY3B5KCZyZXQsIGZyb20sIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgc2htY2Jfc2V0X3NhZmVfdWxvbmcodW5zaWduZWQgbG9uZyAqcHRyLCB1bnNpZ25lZCBsb25nIHZhbCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyICp0bywgKmZyb207Ci0KLSAgICB0byA9ICh1bnNpZ25lZCBjaGFyICopcHRyOwotICAgIGZyb20gPSAodW5zaWduZWQgY2hhciAqKSgmdmFsKTsKLSAgICBtZW1jcHkodG8sIGZyb20sIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHRpbWVfdCBzaG1jYl9nZXRfc2FmZV90aW1lKHRpbWVfdCAqIHB0cikKLXsKLSAgICB1bnNpZ25lZCBjaGFyICpmcm9tOwotICAgIHRpbWVfdCByZXQ7Ci0KLSAgICBmcm9tID0gKHVuc2lnbmVkIGNoYXIgKilwdHI7Ci0gICAgbWVtY3B5KCZyZXQsIGZyb20sIHNpemVvZih0aW1lX3QpKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBzaG1jYl9zZXRfc2FmZV90aW1lKHRpbWVfdCAqIHB0ciwgdGltZV90IHZhbCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyICp0bywgKmZyb207Ci0KLSAgICB0byA9ICh1bnNpZ25lZCBjaGFyICopcHRyOwotICAgIGZyb20gPSAodW5zaWduZWQgY2hhciAqKSgmdmFsKTsKLSAgICBtZW1jcHkodG8sIGZyb20sIHNpemVvZih0aW1lX3QpKTsKLX0KLQotLyoKLSoqCi0qKiBIaWdoLUxldmVsICJoYW5kbGVycyIgYXMgcGVyIHNzbF9zY2FjaGUuYwotKioKLSovCi0KLXN0YXRpYyB2b2lkICpzaG1jYl9tYWxsb2Moc2l6ZV90IHNpemUpCi17Ci0gICAgU1NMTW9kQ29uZmlnUmVjICptYyA9IG15TW9kQ29uZmlnKCk7Ci0gICAgcmV0dXJuIGFwX21tX21hbGxvYyhtYy0+cFNlc3Npb25DYWNoZURhdGFNTSwgc2l6ZSk7Ci19Ci0KLXZvaWQgc3NsX3NjYWNoZV9zaG1jYl9pbml0KHNlcnZlcl9yZWMgKnMsIHBvb2wgKnApCi17Ci0gICAgU1NMTW9kQ29uZmlnUmVjICptYyA9IG15TW9kQ29uZmlnKCk7Ci0gICAgQVBfTU0gKm1tOwotICAgIHZvaWQgKnNobV9zZWdtZW50ID0gTlVMTDsKLSAgICBpbnQgYXZhaWwsIGF2YWlsX29yaWc7Ci0KLSAgICAvKgotICAgICAqIENyZWF0ZSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQKLSAgICAgKi8KLSAgICBpZiAobWMtPnN6U2Vzc2lvbkNhY2hlRGF0YUZpbGUgPT0gTlVMTCkgewotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1IsICJTU0xTZXNzaW9uQ2FjaGUgcmVxdWlyZWQiKTsKLSAgICAgICAgc3NsX2RpZSgpOwotICAgIH0KLSAgICBpZiAoKG1tID0gYXBfbW1fY3JlYXRlKG1jLT5uU2Vzc2lvbkNhY2hlRGF0YVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtYy0+c3pTZXNzaW9uQ2FjaGVEYXRhRmlsZSkpID09IE5VTEwpIHsKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICJDYW5ub3QgYWxsb2NhdGUgc2hhcmVkIG1lbW9yeTogJXMiLCBhcF9tbV9lcnJvcigpKTsKLSAgICAgICAgc3NsX2RpZSgpOwotICAgIH0KLSAgICBtYy0+cFNlc3Npb25DYWNoZURhdGFNTSA9IG1tOwotCi0gICAgLyoKLSAgICAgKiBNYWtlIHN1cmUgdGhlIGNoaWxkIHByb2Nlc3NlcyBoYXZlIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBmaWxlcwotICAgICAqLwotICAgIGFwX21tX3Blcm1pc3Npb24obW0sIFNTTF9NTV9GSUxFX01PREUsIGFwX3VzZXJfaWQsIC0xKTsKLQotICAgIC8qCi0gICAgICogQ3JlYXRlIGNhY2hlIGluc2lkZSB0aGUgc2hhcmVkIG1lbW9yeSBzZWdtZW50Ci0gICAgICovCi0gICAgYXZhaWwgPSBhdmFpbF9vcmlnID0gYXBfbW1fYXZhaWxhYmxlKG1tKTsKLSAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJTaGFyZWQtbWVtb3J5IHNlZ21lbnQgaGFzICV1IGF2YWlsYWJsZSIsCi0gICAgICAgICAgICBhdmFpbCk7Ci0KLSAgICAvKiAKLSAgICAgKiBGb3Igc29tZSByZWFzb24gdG8gZG8gd2l0aCBNTSdzIGludGVybmFsIG1hbmFnZW1lbnQsIEkgY2FuJ3QKLSAgICAgKiBhbGxvY2F0ZSB0aGUgZnVsbCBhbW91bnQuIEltcGxlbWVudCBhIHJlYXNvbmFibGUgZm9ybSBvZiB0cmlhbAotICAgICAqIGFuZCBlcnJvciBhbmQgb3V0cHV0IHRyYWNlIGluZm9ybWF0aW9uLgotICAgICAqLwotICAgIHdoaWxlICgoc2htX3NlZ21lbnQgPT0gTlVMTCkgJiYgKChhdmFpbF9vcmlnIC0gYXZhaWwpICogMTAwIDwgYXZhaWxfb3JpZykpIHsKLSAgICAgICAgc2htX3NlZ21lbnQgPSBzaG1jYl9tYWxsb2MoYXZhaWwpOwotICAgICAgICBpZiAoc2htX3NlZ21lbnQgPT0gTlVMTCkgewotICAgICAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLAotICAgICAgICAgICAgICAgICAgICAic2htY2JfbWFsbG9jIGF0dGVtcHQgZm9yICV1IGJ5dGVzIGZhaWxlZCIsIGF2YWlsKTsKLSAgICAgICAgICAgIGF2YWlsIC09IDI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHNobV9zZWdtZW50ID09IE5VTEwpIHsKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgJ3NobWNiJyBzZXNzaW9uIGNhY2hlXG4iKTsKLSAgICAgICAgc3NsX2RpZSgpOwotICAgIH0KLSAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJzaG1jYl9pbml0IGFsbG9jYXRlZCAldSBieXRlcyBvZiBzaGFyZWQgIgotICAgICAgICAgICAgIm1lbW9yeSIsIGF2YWlsKTsKLSAgICBpZiAoIXNobWNiX2luaXRfbWVtb3J5KHMsIHNobV9zZWdtZW50LCBhdmFpbCkpIHsKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICJGYWlsdXJlIGluaXRpYWxpc2luZyAnc2htY2InIHNoYXJlZCBtZW1vcnkiKTsKLSAgICAgICAgc3NsX2RpZSgpOwotICAgIH0KLSAgICBzc2xfbG9nKHMsIFNTTF9MT0dfSU5GTywgIlNoYXJlZCBtZW1vcnkgc2Vzc2lvbiBjYWNoZSBpbml0aWFsaXNlZCIpOwotCi0gICAgLyogCi0gICAgICogU3VjY2VzcyAuLi4gd2UgaGFjayB0aGUgbWVtb3J5IGJsb2NrIGludG8gcGxhY2UgYnkgY2hlYXRpbmcgZm9yCi0gICAgICogbm93IGFuZCBzdGVhbGluZyBhIG1lbWJlciB2YXJpYWJsZSB0aGUgb3JpZ2luYWwgc2hhcmVkIG1lbW9yeQotICAgICAqIGNhY2hlIHdhcyB1c2luZy4gOi0pCi0gICAgICovCi0gICAgbWMtPnRTZXNzaW9uQ2FjaGVEYXRhVGFibGUgPSAodGFibGVfdCAqKSBzaG1fc2VnbWVudDsKLSAgICByZXR1cm47Ci19Ci0KLXZvaWQgc3NsX3NjYWNoZV9zaG1jYl9raWxsKHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgU1NMTW9kQ29uZmlnUmVjICptYyA9IG15TW9kQ29uZmlnKCk7Ci0KLSAgICBpZiAobWMtPnBTZXNzaW9uQ2FjaGVEYXRhTU0gIT0gTlVMTCkgewotICAgICAgICBhcF9tbV9kZXN0cm95KG1jLT5wU2Vzc2lvbkNhY2hlRGF0YU1NKTsKLSAgICAgICAgbWMtPnBTZXNzaW9uQ2FjaGVEYXRhTU0gPSBOVUxMOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLUJPT0wgc3NsX3NjYWNoZV9zaG1jYl9zdG9yZShzZXJ2ZXJfcmVjICpzLCBVQ0hBUiAqIGlkLCBpbnQgaWRsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3QgdGltZW91dCwgU1NMX1NFU1NJT04gKiBwU2Vzc2lvbikKLXsKLSAgICBTU0xNb2RDb25maWdSZWMgKm1jID0gbXlNb2RDb25maWcoKTsKLSAgICB2b2lkICpzaG1fc2VnbWVudDsKLSAgICBCT09MIHRvX3JldHVybiA9IEZBTFNFOwotCi0gICAgLyogV2UndmUga2x1ZGdlZCBvdXIgcG9pbnRlciBpbnRvIHRoZSBvdGhlciBjYWNoZSdzIG1lbWJlciB2YXJpYWJsZS4gKi8KLSAgICBzaG1fc2VnbWVudCA9ICh2b2lkICopIG1jLT50U2Vzc2lvbkNhY2hlRGF0YVRhYmxlOwotICAgIHNzbF9tdXRleF9vbihzKTsKLSAgICBpZiAoIXNobWNiX3N0b3JlX3Nlc3Npb24ocywgc2htX3NlZ21lbnQsIGlkLCBpZGxlbiwgcFNlc3Npb24sIHRpbWVvdXQpKQotICAgICAgICAvKiBpbiB0aGlzIGNhY2hlIGVuZ2luZSwgInN0b3JlcyIgc2hvdWxkIG5ldmVyIGZhaWwuICovCi0gICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19FUlJPUiwgIidzaG1jYicgY29kZSB3YXMgdW5hYmxlIHRvIHN0b3JlIGEgIgotICAgICAgICAgICAgICAgICJzZXNzaW9uIGluIHRoZSBjYWNoZS4iKTsKLSAgICBlbHNlIHsKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLCAic2htY2Jfc3RvcmUgc3VjY2Vzc2Z1bCIpOwotICAgICAgICB0b19yZXR1cm4gPSBUUlVFOwotICAgIH0KLSAgICBzc2xfbXV0ZXhfb2ZmKHMpOwotICAgIHJldHVybiB0b19yZXR1cm47Ci19Ci0KLVNTTF9TRVNTSU9OICpzc2xfc2NhY2hlX3NobWNiX3JldHJpZXZlKHNlcnZlcl9yZWMgKnMsIFVDSEFSICogaWQsIGludCBpZGxlbikKLXsKLSAgICBTU0xNb2RDb25maWdSZWMgKm1jID0gbXlNb2RDb25maWcoKTsKLSAgICB2b2lkICpzaG1fc2VnbWVudDsKLSAgICBTU0xfU0VTU0lPTiAqcFNlc3Npb247Ci0KLSAgICAvKiBXZSd2ZSBrbHVkZ2VkIG91ciBwb2ludGVyIGludG8gdGhlIG90aGVyIGNhY2hlJ3MgbWVtYmVyIHZhcmlhYmxlLiAqLwotICAgIHNobV9zZWdtZW50ID0gKHZvaWQgKikgbWMtPnRTZXNzaW9uQ2FjaGVEYXRhVGFibGU7Ci0gICAgc3NsX211dGV4X29uKHMpOwotICAgIHBTZXNzaW9uID0gc2htY2JfcmV0cmlldmVfc2Vzc2lvbihzLCBzaG1fc2VnbWVudCwgaWQsIGlkbGVuKTsKLSAgICBzc2xfbXV0ZXhfb2ZmKHMpOwotICAgIGlmIChwU2Vzc2lvbikKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLCAic2htY2JfcmV0cmlldmUgaGFkIGEgaGl0Iik7Ci0gICAgZWxzZSB7Ci0gICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwgInNobWNiX3JldHJpZXZlIGhhZCBhIG1pc3MiKTsKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0lORk8sICJDbGllbnQgcmVxdWVzdGVkIGEgJ3Nlc3Npb24tcmVzdW1lJyBidXQgIgotICAgICAgICAgICAgICAgICJ3ZSBoYXZlIG5vIHN1Y2ggc2Vzc2lvbi4iKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBTZXNzaW9uOwotfQotCi12b2lkIHNzbF9zY2FjaGVfc2htY2JfcmVtb3ZlKHNlcnZlcl9yZWMgKnMsIFVDSEFSICogaWQsIGludCBpZGxlbikKLXsKLSAgICBTU0xNb2RDb25maWdSZWMgKm1jID0gbXlNb2RDb25maWcoKTsKLSAgICB2b2lkICpzaG1fc2VnbWVudDsKLQotICAgIC8qIFdlJ3ZlIGtsdWRnZWQgb3VyIHBvaW50ZXIgaW50byB0aGUgb3RoZXIgY2FjaGUncyBtZW1iZXIgdmFyaWFibGUuICovCi0gICAgc2htX3NlZ21lbnQgPSAodm9pZCAqKSBtYy0+dFNlc3Npb25DYWNoZURhdGFUYWJsZTsKLSAgICBzaG1jYl9yZW1vdmVfc2Vzc2lvbihzLCBzaG1fc2VnbWVudCwgaWQsIGlkbGVuKTsKLX0KLQotdm9pZCBzc2xfc2NhY2hlX3NobWNiX2V4cGlyZShzZXJ2ZXJfcmVjICpzKQotewotICAgIC8qIE5PUCAqLwotICAgIHJldHVybjsKLX0KLQotdm9pZCBzc2xfc2NhY2hlX3NobWNiX3N0YXR1cyhzZXJ2ZXJfcmVjICpzLCBwb29sICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpmdW5jKSAoY2hhciAqLCB2b2lkICopLCB2b2lkICphcmcpCi17Ci0gICAgU1NMTW9kQ29uZmlnUmVjICptYyA9IG15TW9kQ29uZmlnKCk7Ci0gICAgU0hNQ0JIZWFkZXIgKmhlYWRlcjsKLSAgICBTSE1DQlF1ZXVlIHF1ZXVlOwotICAgIFNITUNCQ2FjaGUgY2FjaGU7Ci0gICAgU0hNQ0JJbmRleCAqaWR4OwotICAgIHZvaWQgKnNobV9zZWdtZW50OwotICAgIHVuc2lnbmVkIGludCBsb29wLCB0b3RhbCwgY2FjaGVfdG90YWwsIG5vbl9lbXB0eV9kaXZpc2lvbnM7Ci0gICAgaW50IGluZGV4X3BjdCwgY2FjaGVfcGN0OwotICAgIGRvdWJsZSBleHBpcnlfdG90YWw7Ci0gICAgdGltZV90IGF2ZXJhZ2VfZXhwaXJ5LCBub3csIG1heF9leHBpcnksIG1pbl9leHBpcnksIGlkeGV4cGlyeTsKLQotICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwgImluc2lkZSBzc2xfc2NhY2hlX3NobWNiX3N0YXR1cyIpOwotCi0gICAgLyogV2UndmUga2x1ZGdlZCBvdXIgcG9pbnRlciBpbnRvIHRoZSBvdGhlciBjYWNoZSdzIG1lbWJlciB2YXJpYWJsZS4gKi8KLSAgICBzaG1fc2VnbWVudCA9ICh2b2lkICopIG1jLT50U2Vzc2lvbkNhY2hlRGF0YVRhYmxlOwotCi0gICAgLyogR2V0IHRoZSBoZWFkZXIgc3RydWN0dXJlLiAqLwotICAgIHNobWNiX2dldF9oZWFkZXIoc2htX3NlZ21lbnQsICZoZWFkZXIpOwotICAgIHRvdGFsID0gY2FjaGVfdG90YWwgPSBub25fZW1wdHlfZGl2aXNpb25zID0gMDsKLSAgICBhdmVyYWdlX2V4cGlyeSA9IG1heF9leHBpcnkgPSBtaW5fZXhwaXJ5ID0gMDsKLSAgICBleHBpcnlfdG90YWwgPSAwOwotCi0gICAgLyogSXQgbWF5IHNlZW0gc3RyYW5nZSB0byBncmFiICJub3ciIGF0IHRoaXMgcG9pbnQsIGJ1dCBpbiB0aGVvcnkKLSAgICAgKiB3ZSBzaG91bGQgbmV2ZXIgaGF2ZSBhIG5lZ2F0aXZlIHRocmVzaG9sZCBidXQgZ3JhYmJpbmcgIm5vdyIgYWZ0ZXIKLSAgICAgKiB0aGUgbG9vcCAod2hpY2ggcGVyZm9ybXMgZXhwaXJpZXMpIGNvdWxkIGFsbG93IHRoYXQgY2hhbmNlLiAqLwotICAgIG5vdyA9IHRpbWUoTlVMTCk7Ci0gICAgZm9yIChsb29wID0gMDsgbG9vcCA8PSBoZWFkZXItPmRpdmlzaW9uX21hc2s7IGxvb3ArKykgewotICAgICAgICBpZiAoc2htY2JfZ2V0X2RpdmlzaW9uKGhlYWRlciwgJnF1ZXVlLCAmY2FjaGUsIGxvb3ApKSB7Ci0gICAgICAgICAgICBzaG1jYl9leHBpcmVfZGl2aXNpb24ocywgJnF1ZXVlLCAmY2FjaGUpOwotICAgICAgICAgICAgdG90YWwgKz0gc2htY2JfZ2V0X3NhZmVfdWludChxdWV1ZS5wb3NfY291bnQpOwotICAgICAgICAgICAgY2FjaGVfdG90YWwgKz0gc2htY2JfZ2V0X3NhZmVfdWludChjYWNoZS5wb3NfY291bnQpOwotICAgICAgICAgICAgaWYgKHNobWNiX2dldF9zYWZlX3VpbnQocXVldWUucG9zX2NvdW50KSA+IDApIHsKLSAgICAgICAgICAgICAgICBpZHggPSBzaG1jYl9nZXRfaW5kZXgoJnF1ZXVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNobWNiX2dldF9zYWZlX3VpbnQocXVldWUuZmlyc3RfcG9zKSk7Ci0gICAgICAgICAgICAgICAgbm9uX2VtcHR5X2RpdmlzaW9ucysrOwotICAgICAgICAgICAgICAgIGlkeGV4cGlyeSA9IHNobWNiX2dldF9zYWZlX3RpbWUoJihpZHgtPmV4cGlyZXMpKTsKLSAgICAgICAgICAgICAgICBleHBpcnlfdG90YWwgKz0gKGRvdWJsZSkgaWR4ZXhwaXJ5OwotICAgICAgICAgICAgICAgIG1heF9leHBpcnkgPSAoaWR4ZXhwaXJ5ID4gbWF4X2V4cGlyeSA/IGlkeGV4cGlyeSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZXhwaXJ5KTsKLSAgICAgICAgICAgICAgICBpZiAobWluX2V4cGlyeSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBtaW5fZXhwaXJ5ID0gaWR4ZXhwaXJ5OwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgbWluX2V4cGlyeSA9IChpZHhleHBpcnkgPCBtaW5fZXhwaXJ5ID8gaWR4ZXhwaXJ5IDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fZXhwaXJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpbmRleF9wY3QgPSAoMTAwICogdG90YWwpIC8gKGhlYWRlci0+aW5kZXhfbnVtICogKGhlYWRlci0+ZGl2aXNpb25fbWFzayArIDEpKTsKLSAgICBjYWNoZV9wY3QgPSAoMTAwICogY2FjaGVfdG90YWwpIC8gKGhlYWRlci0+Y2FjaGVfZGF0YV9zaXplICogKGhlYWRlci0+ZGl2aXNpb25fbWFzayArIDEpKTsKLSAgICBmdW5jKGFwX3BzcHJpbnRmKHAsICJjYWNoZSB0eXBlOiA8Yj5TSE1DQjwvYj4sIHNoYXJlZCBtZW1vcnk6IDxiPiVkPC9iPiAiCi0gICAgICAgICAgICAgICAgICAgICAiYnl0ZXMsIGN1cnJlbnQgc2Vzc2lvbnM6IDxiPiVkPC9iPjxicj4iLAotICAgICAgICAgICAgICAgICAgICAgbWMtPm5TZXNzaW9uQ2FjaGVEYXRhU2l6ZSwgdG90YWwpLCBhcmcpOwotICAgIGZ1bmMoYXBfcHNwcmludGYocCwgInN1Yi1jYWNoZXM6IDxiPiVkPC9iPiwgaW5kZXhlcyBwZXIgc3ViLWNhY2hlOiAiCi0gICAgICAgICAgICAgICAgICAgICAiPGI+JWQ8L2I+PGJyPiIsIChpbnQpIGhlYWRlci0+ZGl2aXNpb25fbWFzayArIDEsCi0gICAgICAgICAgICAgICAgICAgICAoaW50KSBoZWFkZXItPmluZGV4X251bSksIGFyZyk7Ci0gICAgaWYgKG5vbl9lbXB0eV9kaXZpc2lvbnMgIT0gMCkgewotICAgICAgICBhdmVyYWdlX2V4cGlyeSA9ICh0aW1lX3QpKGV4cGlyeV90b3RhbCAvIChkb3VibGUpbm9uX2VtcHR5X2RpdmlzaW9ucyk7Ci0gICAgICAgIGZ1bmMoYXBfcHNwcmludGYocCwgInRpbWUgbGVmdCBvbiBvbGRlc3QgZW50cmllcycgU1NMIHNlc3Npb25zOiAiKSwgYXJnKTsKLSAgICAgICAgaWYgKG5vdyA8IGF2ZXJhZ2VfZXhwaXJ5KQotICAgICAgICAgICAgZnVuYyhhcF9wc3ByaW50ZihwLCAiYXZnOiA8Yj4lZDwvYj4gc2Vjb25kcywgKHJhbmdlOiAlZC4uLiVkKTxicj4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGF2ZXJhZ2VfZXhwaXJ5IC0gbm93KSwgKGludCkgKG1pbl9leHBpcnkgLSBub3cpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKG1heF9leHBpcnkgLSBub3cpKSwgYXJnKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZnVuYyhhcF9wc3ByaW50ZihwLCAiZXhwaXJ5IHRocmVzaG9sZDogPGI+Q2FsY3VsYXRpb24gRXJyb3IhPC9iPiIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiksIGFyZyk7Ci0KLSAgICB9Ci0gICAgZnVuYyhhcF9wc3ByaW50ZihwLCAiaW5kZXggdXNhZ2U6IDxiPiVkJSU8L2I+LCBjYWNoZSB1c2FnZTogPGI+JWQlJTwvYj4iCi0gICAgICAgICAgICAgICAgICAgICAiPGJyPiIsIGluZGV4X3BjdCwgY2FjaGVfcGN0KSwgYXJnKTsKLSAgICBmdW5jKGFwX3BzcHJpbnRmKHAsICJ0b3RhbCBzZXNzaW9ucyBzdG9yZWQgc2luY2Ugc3RhcnRpbmc6IDxiPiVsdTwvYj48YnI+IiwKLSAgICAgICAgICAgICAgICAgICAgIGhlYWRlci0+bnVtX3N0b3JlcyksIGFyZyk7Ci0gICAgZnVuYyhhcF9wc3ByaW50ZihwLCAidG90YWwgc2Vzc2lvbnMgZXhwaXJlZCBzaW5jZSBzdGFydGluZzogPGI+JWx1PC9iPjxicj4iLAotICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT5udW1fZXhwaXJpZXMpLCBhcmcpOwotICAgIGZ1bmMoYXBfcHNwcmludGYocCwgInRvdGFsIChwcmUtZXhwaXJ5KSBzZXNzaW9ucyBzY3JvbGxlZCBvdXQgb2YgdGhlICIKLSAgICAgICAgICAgICAgICAgICAgICJjYWNoZTogPGI+JWx1PC9iPjxicj4iLCBoZWFkZXItPm51bV9zY3JvbGxlZCksIGFyZyk7Ci0gICAgZnVuYyhhcF9wc3ByaW50ZihwLCAidG90YWwgcmV0cmlldmVzIHNpbmNlIHN0YXJ0aW5nOiA8Yj4lbHU8L2I+IGhpdCwgIgotICAgICAgICAgICAgICAgICAgICAgIjxiPiVsdTwvYj4gbWlzczxicj4iLCBoZWFkZXItPm51bV9yZXRyaWV2ZXNfaGl0LAotICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT5udW1fcmV0cmlldmVzX21pc3MpLCBhcmcpOwotICAgIGZ1bmMoYXBfcHNwcmludGYocCwgInRvdGFsIHJlbW92ZXMgc2luY2Ugc3RhcnRpbmc6IDxiPiVsdTwvYj4gaGl0LCAiCi0gICAgICAgICAgICAgICAgICAgICAiPGI+JWx1PC9iPiBtaXNzPGJyPiIsIGhlYWRlci0+bnVtX3JlbW92ZXNfaGl0LAotICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT5udW1fcmVtb3Zlc19taXNzKSwgYXJnKTsKLSAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJsZWF2aW5nIHNobWNiX3N0YXR1cyIpOwotICAgIHJldHVybjsKLX0KLQotLyoKLSoqCi0qKiBNZW1vcnkgbWFuaXB1bGF0aW9uIGFuZCBsb3ctbGV2ZWwgY2FjaGUgb3BlcmF0aW9ucyAKLSoqCi0qLwotCi1zdGF0aWMgQk9PTCBzaG1jYl9pbml0X21lbW9yeSgKLSAgICBzZXJ2ZXJfcmVjICpzLCB2b2lkICpzaG1fbWVtLAotICAgIHVuc2lnbmVkIGludCBzaG1fbWVtX3NpemUpCi17Ci0gICAgU0hNQ0JIZWFkZXIgKmhlYWRlcjsKLSAgICBTSE1DQlF1ZXVlIHF1ZXVlOwotICAgIFNITUNCQ2FjaGUgY2FjaGU7Ci0gICAgdW5zaWduZWQgaW50IHRlbXAsIGxvb3AsIGdyYW51bGFyaXR5OwotCi0gICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLCAiZW50ZXJlZCBzaG1jYl9pbml0X21lbW9yeSgpIik7Ci0KLSAgICAvKiBDYWxjdWxhdGUgc29tZSBzaXplcy4uLiAqLwotICAgIHRlbXAgPSBzaXplb2YoU0hNQ0JIZWFkZXIpOwotCi0gICAgLyogSWYgdGhlIHNlZ21lbnQgaXMgcmlkaWN1bG91c2x5IHRvbyBzbWFsbCwgYmFpbCBvdXQgKi8KLSAgICBpZiAoc2htX21lbV9zaXplIDwgKDIqdGVtcCkpIHsKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SLCAic2hhcmVkIG1lbW9yeSBzZWdtZW50IHRvbyBzbWFsbCIpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgLyogTWFrZSB0ZW1wIHRoZSBhbW91bnQgb2YgbWVtb3J5IHdpdGhvdXQgdGhlIGhlYWRlciAqLwotICAgIHRlbXAgPSBzaG1fbWVtX3NpemUgLSB0ZW1wOwotCi0gICAgLyogV29yayBvbiB0aGUgYmFzaXMgdGhhdCB5b3UgbmVlZCAxMCBieXRlcyBpbmRleCBmb3IgZWFjaCBzZXNzaW9uCi0gICAgICogKGFwcHJveCAxNTAgYnl0ZXMpLCB3aGljaCBpcyB0byBkaXZpZGUgdGVtcCBieSAxNjAgLSBhbmQgdGhlbgotICAgICAqIG1ha2Ugc3VyZSB3ZSBlcnIgb24gaGF2aW5nIHRvbyBpbmRleCBzcGFjZSB0byBidXJuIGV2ZW4gd2hlbgotICAgICAqIHRoZSBjYWNoZSBpcyBmdWxsLCB3aGljaCBpcyBhIGxvdCBsZXNzIHN0dXBpZCB0aGFuIGhhdmluZwotICAgICAqIGhhdmluZyBub3QgZW5vdWdoIGluZGV4IHNwYWNlIHRvIHV0aWxpc2UgdGhlIHdob2xlIGNhY2hlIS4gKi8KLSAgICB0ZW1wIC89IDEyMDsKLSAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJmb3IgJXUgYnl0ZXMsIHJlY29tbWVuZGluZyAldSBpbmRleGVzIiwKLSAgICAgICAgICAgIHNobV9tZW1fc2l6ZSwgdGVtcCk7Ci0KLSAgICAvKiBXZSBzaG91bGQgZGl2aWRlIHRoZXNlIGluZGV4ZXMgZXZlbmx5IGFtb25nc3QgdGhlIHF1ZXVlcy4gVHJ5Ci0gICAgICogdG8gZ2V0IGl0IHNvIHRoYXQgdGhlcmUgYXJlIHJvdWdobHkgaGFsZiB0aGUgbnVtYmVyIG9mIGRpdmlzaW9ucwotICAgICAqIGFzIHRoZXJlIGFyZSBpbmRleGVzIGluIGVhY2ggZGl2aXNpb24uICovCi0gICAgZ3JhbnVsYXJpdHkgPSAyNTY7Ci0gICAgd2hpbGUgKCh0ZW1wIC8gZ3JhbnVsYXJpdHkpIDwgKDIgKiBncmFudWxhcml0eSkpCi0gICAgICAgIGdyYW51bGFyaXR5IC89IDI7Ci0KLSAgICAvKiBTbyB3ZSBoYXZlICdncmFudWxhcml0eScgZGl2aXNpb25zLCBzZXQgJ3RlbXAnIGVxdWFsIHRvIHRoZQotICAgICAqIG51bWJlciBvZiBpbmRleGVzIGluIGVhY2ggZGl2aXNpb24uICovCi0gICAgdGVtcCAvPSBncmFudWxhcml0eTsKLQotICAgIC8qIFRvbyBzbWFsbD8gQmFpbCAuLi4gKi8KLSAgICBpZiAodGVtcCA8IDUpIHsKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SLCAic2hhcmVkIG1lbW9yeSBzZWdtZW50IHRvbyBzbWFsbCIpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgLyogT0ssIHdlJ3JlIHNvcnRlZCAtIGZyb20gaGVyZSBvbiBpbiwgdGhlIHJldHVybiBzaG91bGQgYmUgVFJVRSAqLwotICAgIGhlYWRlciA9IChTSE1DQkhlYWRlciAqKXNobV9tZW07Ci0gICAgaGVhZGVyLT5kaXZpc2lvbl9tYXNrID0gKHVuc2lnbmVkIGNoYXIpKGdyYW51bGFyaXR5IC0gMSk7Ci0gICAgaGVhZGVyLT5kaXZpc2lvbl9vZmZzZXQgPSBzaXplb2YoU0hNQ0JIZWFkZXIpOwotICAgIGhlYWRlci0+aW5kZXhfbnVtID0gdGVtcDsKLSAgICBoZWFkZXItPmluZGV4X29mZnNldCA9ICgyICogc2l6ZW9mKHVuc2lnbmVkIGludCkpOwotICAgIGhlYWRlci0+aW5kZXhfc2l6ZSA9IHNpemVvZihTSE1DQkluZGV4KTsKLSAgICBoZWFkZXItPnF1ZXVlX3NpemUgPSBoZWFkZXItPmluZGV4X29mZnNldCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGhlYWRlci0+aW5kZXhfbnVtICogaGVhZGVyLT5pbmRleF9zaXplKTsKLQotICAgIC8qIE5vdyBjYWxjdWxhdGUgdGhlIHNwYWNlIGZvciBlYWNoIGRpdmlzaW9uICovCi0gICAgdGVtcCA9IHNobV9tZW1fc2l6ZSAtIGhlYWRlci0+ZGl2aXNpb25fb2Zmc2V0OwotICAgIGhlYWRlci0+ZGl2aXNpb25fc2l6ZSA9IHRlbXAgLyBncmFudWxhcml0eTsKLQotICAgIC8qIENhbGN1bGF0ZSB0aGUgc3BhY2UgbGVmdCBpbiBlYWNoIGRpdmlzaW9uIGZvciB0aGUgY2FjaGUgKi8KLSAgICB0ZW1wIC09IGhlYWRlci0+cXVldWVfc2l6ZTsKLSAgICBoZWFkZXItPmNhY2hlX2RhdGFfb2Zmc2V0ID0gKDIgKiBzaXplb2YodW5zaWduZWQgaW50KSk7Ci0gICAgaGVhZGVyLT5jYWNoZV9kYXRhX3NpemUgPSBoZWFkZXItPmRpdmlzaW9uX3NpemUgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT5xdWV1ZV9zaXplIC0gaGVhZGVyLT5jYWNoZV9kYXRhX29mZnNldDsKLQotICAgIC8qIE91dHB1dCB0cmFjZSBpbmZvICovCi0gICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLCAic2htY2JfaW5pdF9tZW1vcnkgY2hvaWNlcyBmb2xsb3ciKTsKLSAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJkaXZpc2lvbl9tYXNrID0gMHglMDJYIiwgaGVhZGVyLT5kaXZpc2lvbl9tYXNrKTsKLSAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJkaXZpc2lvbl9vZmZzZXQgPSAldSIsIGhlYWRlci0+ZGl2aXNpb25fb2Zmc2V0KTsKLSAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJkaXZpc2lvbl9zaXplID0gJXUiLCBoZWFkZXItPmRpdmlzaW9uX3NpemUpOwotICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwgInF1ZXVlX3NpemUgPSAldSIsIGhlYWRlci0+cXVldWVfc2l6ZSk7Ci0gICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLCAiaW5kZXhfbnVtID0gJXUiLCBoZWFkZXItPmluZGV4X251bSk7Ci0gICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLCAiaW5kZXhfb2Zmc2V0ID0gJXUiLCBoZWFkZXItPmluZGV4X29mZnNldCk7Ci0gICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLCAiaW5kZXhfc2l6ZSA9ICV1IiwgaGVhZGVyLT5pbmRleF9zaXplKTsKLSAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJjYWNoZV9kYXRhX29mZnNldCA9ICV1IiwgaGVhZGVyLT5jYWNoZV9kYXRhX29mZnNldCk7Ci0gICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLCAiY2FjaGVfZGF0YV9zaXplID0gJXUiLCBoZWFkZXItPmNhY2hlX2RhdGFfc2l6ZSk7Ci0KLSAgICAvKiBUaGUgaGVhZGVyIGlzIGRvbmUsIG1ha2UgdGhlIGNhY2hlcyBlbXB0eSAqLwotICAgIGZvciAobG9vcCA9IDA7IGxvb3AgPCBncmFudWxhcml0eTsgbG9vcCsrKSB7Ci0gICAgICAgIGlmICghc2htY2JfZ2V0X2RpdmlzaW9uKGhlYWRlciwgJnF1ZXVlLCAmY2FjaGUsIGxvb3ApKQotICAgICAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SLCAic2htY2JfaW5pdF9tZW1vcnksICIgImludGVybmFsIGVycm9yIik7Ci0gICAgICAgIHNobWNiX3NldF9zYWZlX3VpbnQoY2FjaGUuZmlyc3RfcG9zLCAwKTsKLSAgICAgICAgc2htY2Jfc2V0X3NhZmVfdWludChjYWNoZS5wb3NfY291bnQsIDApOwotICAgICAgICBzaG1jYl9zZXRfc2FmZV91aW50KHF1ZXVlLmZpcnN0X3BvcywgMCk7Ci0gICAgICAgIHNobWNiX3NldF9zYWZlX3VpbnQocXVldWUucG9zX2NvdW50LCAwKTsKLSAgICB9Ci0KLSAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJsZWF2aW5nIHNobWNiX2luaXRfbWVtb3J5KCkiKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotc3RhdGljIEJPT0wgc2htY2Jfc3RvcmVfc2Vzc2lvbigKLSAgICBzZXJ2ZXJfcmVjICpzLCB2b2lkICpzaG1fc2VnbWVudCwgVUNIQVIgKiBpZCwKLSAgICBpbnQgaWRsZW4sIFNTTF9TRVNTSU9OICogcFNlc3Npb24sCi0gICAgdGltZV90IHRpbWVvdXQpCi17Ci0gICAgU0hNQ0JIZWFkZXIgKmhlYWRlcjsKLSAgICBTSE1DQlF1ZXVlIHF1ZXVlOwotICAgIFNITUNCQ2FjaGUgY2FjaGU7Ci0gICAgdW5zaWduZWQgY2hhciBtYXNrZWRfaW5kZXg7Ci0gICAgdW5zaWduZWQgY2hhciBlbmNvZGVkW1NTTF9TRVNTSU9OX01BWF9ERVJdOwotICAgIHVuc2lnbmVkIGNoYXIgKnB0cl9lbmNvZGVkOwotICAgIHVuc2lnbmVkIGludCBsZW5fZW5jb2RlZDsKLSAgICB0aW1lX3QgZXhwaXJ5X3RpbWU7Ci0KLSAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJpbnNpZGUgc2htY2Jfc3RvcmVfc2Vzc2lvbiIpOwotCi0gICAgLyogR2V0IHRoZSBoZWFkZXIgc3RydWN0dXJlLCB3aGljaCBkaXZpc2lvbiB0aGlzIHNlc3Npb24gd2lsbCBmYWxsIGludG8gZXRjLiAqLwotICAgIHNobWNiX2dldF9oZWFkZXIoc2htX3NlZ21lbnQsICZoZWFkZXIpOwotICAgIG1hc2tlZF9pbmRleCA9IHBTZXNzaW9uLT5zZXNzaW9uX2lkWzBdICYgaGVhZGVyLT5kaXZpc2lvbl9tYXNrOwotICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwgInNlc3Npb25faWRbMF09JXUsIG1hc2tlZCBpbmRleD0ldSIsCi0gICAgICAgICAgICBwU2Vzc2lvbi0+c2Vzc2lvbl9pZFswXSwgbWFza2VkX2luZGV4KTsKLSAgICBpZiAoIXNobWNiX2dldF9kaXZpc2lvbihoZWFkZXIsICZxdWV1ZSwgJmNhY2hlLCAodW5zaWduZWQgaW50KW1hc2tlZF9pbmRleCkpIHsKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SLCAic2htY2Jfc3RvcmVfc2Vzc2lvbiwgIiAiaW50ZXJuYWwgZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIC8qIFNlcmlhbGlzZSB0aGUgc2Vzc2lvbiwgd29yayBvdXQgaG93IG11Y2ggd2UncmUgZGVhbGluZwotICAgICAqIHdpdGguIE5COiBUaGlzIGNoZWNrIGNvdWxkIGJlIHJlbW92ZWQgaWYgd2UncmUgbm90IHBhcmFub2lkCi0gICAgICogb3Igd2UgZmluZCBzb21lIGFzc3VyYW5jZSB0aGF0IGl0IHdpbGwgbmV2ZXIgYmUgbmVjZXNzYXJ5LiAqLwotICAgIGxlbl9lbmNvZGVkID0gaTJkX1NTTF9TRVNTSU9OKHBTZXNzaW9uLCBOVUxMKTsKLSAgICBpZiAobGVuX2VuY29kZWQgPiBTU0xfU0VTU0lPTl9NQVhfREVSKSB7Ci0gICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19FUlJPUiwgInNlc3Npb24gaXMgdG9vIGJpZyAoJXUgYnl0ZXMpIiwKLSAgICAgICAgICAgICAgICBsZW5fZW5jb2RlZCk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcHRyX2VuY29kZWQgPSBlbmNvZGVkOwotICAgIGxlbl9lbmNvZGVkID0gaTJkX1NTTF9TRVNTSU9OKHBTZXNzaW9uLCAmcHRyX2VuY29kZWQpOwotICAgIGV4cGlyeV90aW1lID0gdGltZW91dDsKLSAgICBpZiAoIXNobWNiX2luc2VydF9lbmNvZGVkX3Nlc3Npb24ocywgJnF1ZXVlLCAmY2FjaGUsIGVuY29kZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuX2VuY29kZWQsIHBTZXNzaW9uLT5zZXNzaW9uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyeV90aW1lKSkgewotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1IsICJjYW4ndCBzdG9yZSBhIHNlc3Npb24hIik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLCAibGVhdmluZyBzaG1jYl9zdG9yZSBzdWNjZXNzZnVsbHkiKTsKLSAgICBoZWFkZXItPm51bV9zdG9yZXMrKzsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotc3RhdGljIFNTTF9TRVNTSU9OICpzaG1jYl9yZXRyaWV2ZV9zZXNzaW9uKAotICAgIHNlcnZlcl9yZWMgKnMsIHZvaWQgKnNobV9zZWdtZW50LAotICAgIFVDSEFSICogaWQsIGludCBpZGxlbikKLXsKLSAgICBTSE1DQkhlYWRlciAqaGVhZGVyOwotICAgIFNITUNCUXVldWUgcXVldWU7Ci0gICAgU0hNQ0JDYWNoZSBjYWNoZTsKLSAgICB1bnNpZ25lZCBjaGFyIG1hc2tlZF9pbmRleDsKLSAgICBTU0xfU0VTU0lPTiAqcFNlc3Npb247Ci0KLSAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJpbnNpZGUgc2htY2JfcmV0cmlldmVfc2Vzc2lvbiIpOwotICAgIGlmIChpZGxlbiA8IDIpIHsKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SLCAidW51c2FibHkgc2hvcnQgc2Vzc2lvbl9pZCBwcm92aWRlZCAiCi0gICAgICAgICAgICAgICAgIigldSBieXRlcykiLCBpZGxlbik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICAvKiBHZXQgdGhlIGhlYWRlciBzdHJ1Y3R1cmUsIHdoaWNoIGRpdmlzaW9uIHRoaXMgc2Vzc2lvbiBsb29rdXAKLSAgICAgKiB3aWxsIGNvbWUgZnJvbSBldGMuICovCi0gICAgc2htY2JfZ2V0X2hlYWRlcihzaG1fc2VnbWVudCwgJmhlYWRlcik7Ci0gICAgbWFza2VkX2luZGV4ID0gaWRbMF0gJiBoZWFkZXItPmRpdmlzaW9uX21hc2s7Ci0gICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLCAiaWRbMF09JXUsIG1hc2tlZCBpbmRleD0ldSIsIGlkWzBdLAotICAgICAgICAgICAgbWFza2VkX2luZGV4KTsKLSAgICBpZiAoIXNobWNiX2dldF9kaXZpc2lvbihoZWFkZXIsICZxdWV1ZSwgJmNhY2hlLCAodW5zaWduZWQgaW50KSBtYXNrZWRfaW5kZXgpKSB7Ci0gICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19FUlJPUiwgInNobWNiX3JldHJpZXZlX3Nlc3Npb24sICIgImludGVybmFsIGVycm9yIik7Ci0gICAgICAgIGhlYWRlci0+bnVtX3JldHJpZXZlc19taXNzKys7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICAvKiBHZXQgdGhlIHNlc3Npb24gY29ycmVzcG9uZGluZyB0byB0aGUgc2Vzc2lvbl9pZCBvciBOVUxMIGlmIGl0Ci0gICAgICogZG9lc24ndCBleGlzdCAob3IgaXMgZmxhZ2dlZCBhcyAicmVtb3ZlZCIpLiAqLwotICAgIHBTZXNzaW9uID0gc2htY2JfbG9va3VwX3Nlc3Npb25faWQocywgJnF1ZXVlLCAmY2FjaGUsIGlkLCBpZGxlbik7Ci0gICAgaWYgKHBTZXNzaW9uKQotICAgICAgICBoZWFkZXItPm51bV9yZXRyaWV2ZXNfaGl0Kys7Ci0gICAgZWxzZQotICAgICAgICBoZWFkZXItPm51bV9yZXRyaWV2ZXNfbWlzcysrOwotICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwgImxlYXZpbmcgc2htY2JfcmV0cmlldmVfc2Vzc2lvbiIpOwotICAgIHJldHVybiBwU2Vzc2lvbjsKLX0KLQotc3RhdGljIEJPT0wgc2htY2JfcmVtb3ZlX3Nlc3Npb24oCi0gICAgc2VydmVyX3JlYyAqcywgdm9pZCAqc2htX3NlZ21lbnQsCi0gICAgVUNIQVIgKiBpZCwgaW50IGlkbGVuKQotewotICAgIFNITUNCSGVhZGVyICpoZWFkZXI7Ci0gICAgU0hNQ0JRdWV1ZSBxdWV1ZTsKLSAgICBTSE1DQkNhY2hlIGNhY2hlOwotICAgIHVuc2lnbmVkIGNoYXIgbWFza2VkX2luZGV4OwotICAgIEJPT0wgcmVzOwotCi0gICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLCAiaW5zaWRlIHNobWNiX3JlbW92ZV9zZXNzaW9uIik7Ci0gICAgaWYgKGlkID09IE5VTEwpIHsKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SLCAicmVtb3ZlIGNhbGxlZCB3aXRoIE5VTEwgc2Vzc2lvbl9pZCEiKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIC8qIEdldCB0aGUgaGVhZGVyIHN0cnVjdHVyZSwgd2hpY2ggZGl2aXNpb24gdGhpcyBzZXNzaW9uIHJlbW92ZQotICAgICAqIHdpbGwgaGFwcGVuIGluIGV0Yy4gKi8KLSAgICBzaG1jYl9nZXRfaGVhZGVyKHNobV9zZWdtZW50LCAmaGVhZGVyKTsKLSAgICBtYXNrZWRfaW5kZXggPSBpZFswXSAmIGhlYWRlci0+ZGl2aXNpb25fbWFzazsKLSAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJpZFswXT0ldSwgbWFza2VkIGluZGV4PSV1IiwKLSAgICAgICAgICAgIGlkWzBdLCBtYXNrZWRfaW5kZXgpOwotICAgIGlmICghc2htY2JfZ2V0X2RpdmlzaW9uKGhlYWRlciwgJnF1ZXVlLCAmY2FjaGUsICh1bnNpZ25lZCBpbnQpbWFza2VkX2luZGV4KSkgewotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1IsICJzaG1jYl9yZW1vdmVfc2Vzc2lvbiwgaW50ZXJuYWwgZXJyb3IiKTsKLSAgICAgICAgaGVhZGVyLT5udW1fcmVtb3Zlc19taXNzKys7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmVzID0gc2htY2JfcmVtb3ZlX3Nlc3Npb25faWQocywgJnF1ZXVlLCAmY2FjaGUsIGlkLCBpZGxlbik7Ci0gICAgaWYgKHJlcykKLSAgICAgICAgaGVhZGVyLT5udW1fcmVtb3Zlc19oaXQrKzsKLSAgICBlbHNlCi0gICAgICAgIGhlYWRlci0+bnVtX3JlbW92ZXNfbWlzcysrOwotICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwgImxlYXZpbmcgc2htY2JfcmVtb3ZlX3Nlc3Npb24iKTsKLSAgICByZXR1cm4gcmVzOwotfQotCi0KLS8qIAotKioKLSoqIFdlaXJkbyBjeWNsaWMgYnVmZmVyIGZ1bmN0aW9ucwotKioKLSovCi0KLS8qIFRoaXMgZ2V0cyB1c2VkIGluIHRoZSBjeWNsaWMgImluZGV4IGFycmF5IiAoaW4gdGhlICdRdWV1ZSdzKSBhbmQKLSAqIGluIHRoZSBjeWNsaWMgJ0NhY2hlJ3MgdG9vIC4uLiB5b3UgcHJvdmlkZSB0aGUgIndpZHRoIiBvZiB0aGUKLSAqIGN5Y2xpYyBzdG9yZSwgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGFuZCBob3cgZmFyIHRvIG1vdmUgKHdpdGgKLSAqIHdyYXBwaW5nIGlmIG5lY2Vzc2FyeSkuIEJhc2ljYWxseSBpdCdzIGFkZGl0aW9uIG1vZHVsbyBidWZfc2l6ZS4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2htY2JfY3ljbGljX2luY3JlbWVudCgKLSAgICB1bnNpZ25lZCBpbnQgYnVmX3NpemUsCi0gICAgdW5zaWduZWQgaW50IHN0YXJ0X3BvcywKLSAgICB1bnNpZ25lZCBpbnQgdG9fYWRkKQotewotICAgIHN0YXJ0X3BvcyArPSB0b19hZGQ7Ci0gICAgd2hpbGUgKHN0YXJ0X3BvcyA+PSBidWZfc2l6ZSkKLSAgICAgICAgc3RhcnRfcG9zIC09IGJ1Zl9zaXplOwotICAgIHJldHVybiBzdGFydF9wb3M7Ci19Ci0KLS8qIEdpdmVuIHR3byBwb3NpdGlvbnMgaW4gYSBjeWNsaWMgYnVmZmVyLCBjYWxjdWxhdGUgdGhlICJkaXN0YW5jZSIuCi0gKiBUaGlzIGlzIHRvIGNvdmVyIHRoZSBjYXNlICgibm9uLXRyaXZpYWwiKSB3aGVyZSB0aGUgJ25leHQnIG9mZnNldAotICogaXMgdG8gdGhlIGxlZnQgb2YgdGhlICdzdGFydCcgb2Zmc2V0LiBOQjogVGhpcyBjYWxjdWxhdGVzIHRoZQotICogc3BhY2UgaW5jbHVzaXZlIG9mIG9uZSBlbmQtcG9pbnQgYnV0IG5vdCB0aGUgb3RoZXIuIFRoZXJlIGlzIGFuCi0gKiBhbWJpZ3VvdXMgY2FzZSAod2hpY2ggaXMgd2h5IHdlIHVzZSB0aGUgPHN0YXJ0X3BvcyxvZmZzZXQ+Ci0gKiBjb29yZGluYXRlIHN5c3RlbSByYXRoZXIgdGhhbiA8c3RhcnRfcG9zLGVuZF9wb3M+IG9uZSkgd2hlbiAnc3RhcnQnCi0gKiBpcyB0aGUgc2FtZSBhcyAnbmV4dCcuIEl0IGNvdWxkIGluZGljYXRlIHRoZSBidWZmZXIgaXMgZnVsbCBvciBpdAotICogY2FuIGluZGljYXRlIHRoZSBidWZmZXIgaXMgZW1wdHkgLi4uIEkgY2hvb3NlIHRoZSBsYXR0ZXIgYXMgaXQncwotICogZWFzaWVyIGFuZCB1c3VhbGx5IG5lY2Vzc2FyeSB0byBjaGVjayBpZiB0aGUgYnVmZmVyIGlzIGZ1bGwgYW55d2F5Ci0gKiBiZWZvcmUgZG9pbmcgaW5jcmVtZW50YWwgbG9naWMgKHdoaWNoIGlzIHRoaXMgdXNlZnVsIGZvciksIGJ1dCB3ZQotICogZGVmaW5pdGVseSBuZWVkIHRoZSBlbXB0eSBjYXNlIGhhbmRsZWQgLSBpbiBmYWN0IGl0J3Mgb3VyIHN0YXJ0aW5nCi0gKiBzdGF0ZSEhICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHNobWNiX2N5Y2xpY19zcGFjZSgKLSAgICB1bnNpZ25lZCBpbnQgYnVmX3NpemUsCi0gICAgdW5zaWduZWQgaW50IHN0YXJ0X29mZnNldCwKLSAgICB1bnNpZ25lZCBpbnQgbmV4dF9vZmZzZXQpCi17Ci0gICAgLyogSXMgaXQgdGhlIHRyaXZpYWwgY2FzZT8gKi8KLSAgICBpZiAoc3RhcnRfb2Zmc2V0IDw9IG5leHRfb2Zmc2V0KQotICAgICAgICByZXR1cm4gKG5leHRfb2Zmc2V0IC0gc3RhcnRfb2Zmc2V0KTsgICAgICAgICAgICAgIC8qIHllcyAqLwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuICgoYnVmX3NpemUgLSBzdGFydF9vZmZzZXQpICsgbmV4dF9vZmZzZXQpOyAvKiBubyAqLwotfQotCi0vKiBBICJub3JtYWwtdG8tY3ljbGljIiBtZW1jcHkgLi4uIHRoaXMgdGFrZXMgYSBsaW5lYXIgYmxvY2sgb2YKLSAqIG1lbW9yeSBhbmQgY29waWVzIGl0IG9udG8gYSBjeWNsaWMgYnVmZmVyLiBUaGUgcHVycG9zZSBhbmQKLSAqIGZ1bmN0aW9uIG9mIHRoaXMgaXMgcHJldHR5IG9idmlvdXMsIHlvdSBuZWVkIHRvIGNvdmVyIHRoZSBjYXNlCi0gKiB0aGF0IHRoZSBkZXN0aW5hdGlvbiAoY3ljbGljKSBidWZmZXIgaGFzIHRvIHdyYXAgcm91bmQuICovCi1zdGF0aWMgdm9pZCBzaG1jYl9jeWNsaWNfbnRvY19tZW1jcHkoCi0gICAgdW5zaWduZWQgaW50IGJ1Zl9zaXplLAotICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsCi0gICAgdW5zaWduZWQgaW50IGRlc3Rfb2Zmc2V0LAotICAgIHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgaW50IHNyY19sZW4pCi17Ci0gICAgLyogQ2FuIGl0IGJlIGNvcGllZCBhbGwgaW4gb25lIGdvPyAqLwotICAgIGlmIChkZXN0X29mZnNldCArIHNyY19sZW4gPCBidWZfc2l6ZSkKLSAgICAgICAgLyogeWVzICovCi0gICAgICAgIG1lbWNweShkYXRhICsgZGVzdF9vZmZzZXQsIHNyYywgc3JjX2xlbik7Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIG5vICovCi0gICAgICAgIG1lbWNweShkYXRhICsgZGVzdF9vZmZzZXQsIHNyYywgYnVmX3NpemUgLSBkZXN0X29mZnNldCk7Ci0gICAgICAgIG1lbWNweShkYXRhLCBzcmMgKyBidWZfc2l6ZSAtIGRlc3Rfb2Zmc2V0LAotICAgICAgICAgICAgICAgc3JjX2xlbiArIGRlc3Rfb2Zmc2V0IC0gYnVmX3NpemUpOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLS8qIEEgImN5Y2xpYy10by1ub3JtYWwiIG1lbWNweSAuLi4gZ2l2ZW4gdGhlIGxhc3QgZnVuY3Rpb24sIHRoaXMKLSAqIG9uZSdzIHB1cnBvc2UgaXMgY2xlYXIsIGl0IGNvcGllcyBvdXQgb2YgYSBjeWNsaWMgYnVmZmVyIGhhbmRsaW5nCi0gKiB3cmFwcGluZy4gKi8KLXN0YXRpYyB2b2lkIHNobWNiX2N5Y2xpY19jdG9uX21lbWNweSgKLSAgICB1bnNpZ25lZCBpbnQgYnVmX3NpemUsCi0gICAgdW5zaWduZWQgY2hhciAqZGVzdCwKLSAgICB1bnNpZ25lZCBjaGFyICpkYXRhLAotICAgIHVuc2lnbmVkIGludCBzcmNfb2Zmc2V0LAotICAgIHVuc2lnbmVkIGludCBzcmNfbGVuKQotewotICAgIC8qIENhbiBpdCBiZSBjb3BpZWQgYWxsIGluIG9uZSBnbz8gKi8KLSAgICBpZiAoc3JjX29mZnNldCArIHNyY19sZW4gPCBidWZfc2l6ZSkKLSAgICAgICAgLyogeWVzICovCi0gICAgICAgIG1lbWNweShkZXN0LCBkYXRhICsgc3JjX29mZnNldCwgc3JjX2xlbik7Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIG5vICovCi0gICAgICAgIG1lbWNweShkZXN0LCBkYXRhICsgc3JjX29mZnNldCwgYnVmX3NpemUgLSBzcmNfb2Zmc2V0KTsKLSAgICAgICAgbWVtY3B5KGRlc3QgKyBidWZfc2l6ZSAtIHNyY19vZmZzZXQsIGRhdGEsCi0gICAgICAgICAgICAgICBzcmNfbGVuICsgc3JjX29mZnNldCAtIGJ1Zl9zaXplKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi0vKiBIZXJlJ3MgdGhlIGNvb2wgaGFjayB0aGF0IG1ha2VzIGl0IGFsbCB3b3JrIC4uLiBieSBzaW1wbHkKLSAqIG1ha2luZyB0aGUgZmlyc3QgY29sbGVjdGlvbiBvZiBieXRlcyAqYmUqIG91ciBoZWFkZXIgc3RydWN0dXJlCi0gKiAoY2FzdGluZyBpdCBpbnRvIHRoZSBDIHN0cnVjdHVyZSksIHdlIGhhdmUgdGhlIHBlcmZlY3Qgd2F5IHRvCi0gKiBtYWludGFpbiBzdGF0ZSBpbiBhIHNoYXJlZC1tZW1vcnkgc2Vzc2lvbiBjYWNoZSBmcm9tIG9uZSBjYWxsCi0gKiAoYW5kIHByb2Nlc3MpIHRvIHRoZSBuZXh0LCB1c2UgdGhlIHNoYXJlZCBtZW1vcnkgaXRzZWxmISBUaGUKLSAqIG9yaWdpbmFsIG1vZF9zc2wgc2hhcmVkLW1lbW9yeSBzZXNzaW9uIGNhY2hlIHVzZXMgdmFyaWFibGVzCi0gKiBpbnNpZGUgdGhlIGNvbnRleHQsIGJ1dCB3ZSBzaW1wbHkgdXNlIHRoYXQgZm9yIHN0b3JpbmcgdGhlCi0gKiBwb2ludGVyIHRvIHRoZSBzaGFyZWQgbWVtb3J5IGl0c2VsZi4gQW5kIGRvbid0IGZvcmdldCwgYWZ0ZXIKLSAqIEFwYWNoZSdzIGluaXRpYWxpc2F0aW9uLCB0aGlzICJoZWFkZXIiIGlzIGNvbnN0YW50L3JlYWQtb25seQotICogc28gd2UgY2FuIHJlYWQgaXQgb3V0c2lkZSBhbnkgbG9ja2luZy4KLSAqIDxncmluPiAtIHNvbWV0aW1lcyBJIGp1c3QgKmxvdmUqIGNvZGluZyB5J2tub3c/ISAgKi8KLXN0YXRpYyB2b2lkIHNobWNiX2dldF9oZWFkZXIodm9pZCAqc2htX21lbSwgU0hNQ0JIZWFkZXIgKipoZWFkZXIpCi17Ci0gICAgKmhlYWRlciA9IChTSE1DQkhlYWRlciAqKXNobV9tZW07Ci0gICAgcmV0dXJuOwotfQotCi0vKiBUaGlzIGlzIHdoYXQgcG9wdWxhdGVzIG91ciAiaW50ZXJlc3RpbmciIHN0cnVjdHVyZXMuIEdpdmVuIGEKLSAqIHBvaW50ZXIgdG8gdGhlIGhlYWRlciwgYW5kIGFuIGluZGV4IGludG8gdGhlIGFwcHJvcHJpYXRlCi0gKiBkaXZpc2lvbiAodGhpcyBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIG1hc2tlZCB1c2luZyB0aGUKLSAqIGRpdmlzaW9uX21hc2sgYnkgdGhlIGNhbGxlciEpLCB3ZSBjYW4gcG9wdWxhdGUgdGhlIHByb3ZpZGVkCi0gKiBTSE1DQlF1ZXVlIGFuZCBTSE1DQkNhY2hlIHN0cnVjdHVyZXMgd2l0aCB2YWx1ZXMgYW5kCi0gKiBwb2ludGVycyB0byB0aGUgdW5kZXJseWluZyBzaGFyZWQgbWVtb3J5LiBVcG9uIHJldHVybmluZwotICogKGlmIG5vdCBGQUxTRSksIHRoZSBjYWxsZXIgY2FuIG1lZGRsZSB3aXRoIHRoZSBwb2ludGVyCi0gKiB2YWx1ZXMgYW5kIHRoZXkgd2lsbCBtYXAgaW50byB0aGUgc2hhcmVkLW1lbW9yeSBkaXJlY3RseSwKLSAqIGFzIHN1Y2ggdGhlcmUncyBubyBuZWVkIHRvICJmcmVlIiBvciAic2V0IiB0aGUgUXVldWUgb3IKLSAqIENhY2hlIHZhbHVlcywgdGhleSB3ZXJlIHRoZW1zZWx2ZXMgcmVmZXJlbmNlcyB0byB0aGUgKnJlYWwqCi0gKiBkYXRhLiAqLwotc3RhdGljIEJPT0wgc2htY2JfZ2V0X2RpdmlzaW9uKAotICAgIFNITUNCSGVhZGVyICpoZWFkZXIsIFNITUNCUXVldWUgKnF1ZXVlLAotICAgIFNITUNCQ2FjaGUgKmNhY2hlLCB1bnNpZ25lZCBpbnQgaWR4KQotewotICAgIHVuc2lnbmVkIGNoYXIgKnBRdWV1ZTsKLSAgICB1bnNpZ25lZCBjaGFyICpwQ2FjaGU7Ci0KLSAgICAvKiBib3VuZHMgY2hlY2sgKi8KLSAgICBpZiAoaWR4ID4gKHVuc2lnbmVkIGludCkgaGVhZGVyLT5kaXZpc2lvbl9tYXNrKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAvKiBMb2NhdGUgdGhlIGJsb2NrcyBvZiBtZW1vcnkgc3RvcmluZyB0aGUgY29ycmVzcG9uZGluZyBkYXRhICovCi0gICAgcFF1ZXVlID0gKCh1bnNpZ25lZCBjaGFyICopIGhlYWRlcikgKyBoZWFkZXItPmRpdmlzaW9uX29mZnNldCArCi0gICAgICAgIChpZHggKiBoZWFkZXItPmRpdmlzaW9uX3NpemUpOwotICAgIHBDYWNoZSA9IHBRdWV1ZSArIGhlYWRlci0+cXVldWVfc2l6ZTsKLQotICAgIC8qIFBvcHVsYXRlIHRoZSBzdHJ1Y3R1cmVzIHdpdGggYXBwcm9wcmlhdGUgcG9pbnRlcnMgKi8KLSAgICBxdWV1ZS0+Zmlyc3RfcG9zID0gKHVuc2lnbmVkIGludCAqKSBwUXVldWU7Ci0KLSAgICAvKiBPdXIgc3RydWN0dXJlcyBzdGF5IHBhY2tlZCwgbm8gbWF0dGVyIHdoYXQgdGhlIHN5c3RlbSdzCi0gICAgICogZGF0YS1hbGlnbm1lbnQgcmVnaW1lIGlzLiAqLwotICAgIHF1ZXVlLT5wb3NfY291bnQgPSAodW5zaWduZWQgaW50ICopIChwUXVldWUgKyBzaXplb2YodW5zaWduZWQgaW50KSk7Ci0gICAgcXVldWUtPmluZGV4ZXMgPSAoU0hNQ0JJbmRleCAqKSAocFF1ZXVlICsgKDIgKiBzaXplb2YodW5zaWduZWQgaW50KSkpOwotICAgIGNhY2hlLT5maXJzdF9wb3MgPSAodW5zaWduZWQgaW50ICopIHBDYWNoZTsKLSAgICBjYWNoZS0+cG9zX2NvdW50ID0gKHVuc2lnbmVkIGludCAqKSAocENhY2hlICsgc2l6ZW9mKHVuc2lnbmVkIGludCkpOwotICAgIGNhY2hlLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgKHBDYWNoZSArICgyICogc2l6ZW9mKHVuc2lnbmVkIGludCkpKTsKLSAgICBxdWV1ZS0+aGVhZGVyID0gY2FjaGUtPmhlYWRlciA9IGhlYWRlcjsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKiBUaGlzIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBwaWVjZSBvZiBzaGFyZWQgbWVtb3J5IGNvbnRhaW5pbmcKLSAqIGEgc3BlY2lmaWVkICdJbmRleCcuIFNITUNCSW5kZXgsIGxpa2UgU0hNQ0JIZWFkZXIsIGlzIGEgZml4ZWQKLSAqIHdpZHRoIG5vbi1yZWZlcmVuY2luZyBzdHJ1Y3R1cmUgb2YgcHJpbWl0aXZlIHR5cGVzIHRoYXQgY2FuIGJlCi0gKiBjYXN0IG9udG8gdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2sgb2Ygc2hhcmVkIG1lbW9yeS4gVGh1cywgYnkKLSAqIHJldHVybmluZyBhIGNhc3QgcG9pbnRlciB0byB0aGF0IHNlY3Rpb24gb2Ygc2hhcmVkIG1lbW9yeSwgdGhlCi0gKiBjYWxsZXIgY2FuIHJlYWQgYW5kIHdyaXRlIHZhbHVlcyB0byBhbmQgZnJvbSB0aGUgInN0cnVjdHVyZSIgYW5kCi0gKiB0aGV5IGFyZSBhY3R1YWxseSByZWFkaW5nIGFuZCB3cml0aW5nIHRoZSB1bmRlcmx5aW5nIHNoYXJlZAotICogbWVtb3J5LiAqLwotc3RhdGljIFNITUNCSW5kZXggKnNobWNiX2dldF9pbmRleCgKLSAgICBjb25zdCBTSE1DQlF1ZXVlICpxdWV1ZSwgdW5zaWduZWQgaW50IGlkeCkKLXsKLSAgICAvKiBib3VuZHMgY2hlY2sgKi8KLSAgICBpZiAoaWR4ID4gKHVuc2lnbmVkIGludCkgcXVldWUtPmhlYWRlci0+aW5kZXhfbnVtKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIC8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGluZGV4LiBOQjogSSBhbSBiZWluZyBob3JyaWJseSBwZW5kYW50aWMKLSAgICAgKiBoZXJlIHNvIGFzIHRvIGF2b2lkIGFueSBwb3RlbnRpYWwgZGF0YS1hbGlnbm1lbnQgYXNzdW1wdGlvbnMgYmVpbmcKLSAgICAgKiBwbGFjZWQgb24gdGhlIHBvaW50ZXIgYXJpdGhtZXRpYyBieSB0aGUgY29tcGlsZXIgKHNpZ2gpLiAqLwotICAgIHJldHVybiAoU0hNQ0JJbmRleCAqKSgoKHVuc2lnbmVkIGNoYXIgKikgcXVldWUtPmluZGV4ZXMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGlkeCAqIHNpemVvZihTSE1DQkluZGV4KSkpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9ucyByb2xscyBleHBpcmVkIGNhY2hlIChhbmQgaW5kZXgpIGVudHJpZXMgb2ZmIHRoZSBmcm9udAotICogb2YgdGhlIGN5Y2xpYyBidWZmZXJzIGluIGEgZGl2aXNpb24uIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIKLSAqIG9mIGV4cGlyZWQgc2Vzc2lvbnMuICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHNobWNiX2V4cGlyZV9kaXZpc2lvbigKLSAgICBzZXJ2ZXJfcmVjICpzLCBTSE1DQlF1ZXVlICpxdWV1ZSwgU0hNQ0JDYWNoZSAqY2FjaGUpCi17Ci0gICAgU0hNQ0JJbmRleCAqaWR4OwotICAgIHRpbWVfdCBub3c7Ci0gICAgdW5zaWduZWQgaW50IGxvb3AsIGluZGV4X251bSwgcG9zX2NvdW50LCBuZXdfcG9zOwotICAgIFNITUNCSGVhZGVyICpoZWFkZXI7Ci0KLSAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJlbnRlcmluZyBzaG1jYl9leHBpcmVfZGl2aXNpb24iKTsKLQotICAgIC8qIFdlIG11c3QgY2FsY3VsYXRlIG51bSBhbmQgc3BhY2Ugb3Vyc2VsdmVzIGJhc2VkIG9uIGV4cGlyeSB0aW1lcy4gKi8KLSAgICBub3cgPSB0aW1lKE5VTEwpOwotICAgIGxvb3AgPSAwOwotICAgIG5ld19wb3MgPSBzaG1jYl9nZXRfc2FmZV91aW50KHF1ZXVlLT5maXJzdF9wb3MpOwotCi0gICAgLyogQ2FjaGUgdXNlZnVsIHZhbHVlcyAqLwotICAgIGhlYWRlciA9IHF1ZXVlLT5oZWFkZXI7Ci0gICAgaW5kZXhfbnVtID0gaGVhZGVyLT5pbmRleF9udW07Ci0gICAgcG9zX2NvdW50ID0gc2htY2JfZ2V0X3NhZmVfdWludChxdWV1ZS0+cG9zX2NvdW50KTsKLSAgICB3aGlsZSAobG9vcCA8IHBvc19jb3VudCkgewotICAgICAgICBpZHggPSBzaG1jYl9nZXRfaW5kZXgocXVldWUsIG5ld19wb3MpOwotICAgICAgICBpZiAoc2htY2JfZ2V0X3NhZmVfdGltZSgmKGlkeC0+ZXhwaXJlcykpID4gbm93KQotICAgICAgICAgICAgLyogaXQgaGFzbid0IGV4cGlyZWQgeWV0LCB3ZSdyZSBkb25lIGl0ZXJhdGluZyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qIFRoaXMgb25lIHNob3VsZCBiZSBleHBpcmVkIHRvby4gU2hpZnQgdG8gdGhlIG5leHQgZW50cnkuICovCi0gICAgICAgIGxvb3ArKzsKLSAgICAgICAgbmV3X3BvcyA9IHNobWNiX2N5Y2xpY19pbmNyZW1lbnQoaW5kZXhfbnVtLCBuZXdfcG9zLCAxKTsKLSAgICB9Ci0KLSAgICAvKiBGaW5kIHRoZSBuZXdfb2Zmc2V0IGFuZCBtYWtlIHRoZSBleHBpcmllcyBoYXBwZW4uICovCi0gICAgaWYgKGxvb3AgPiAwKSB7Ci0gICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwgIndpbGwgYmUgZXhwaXJpbmcgJXUgc2Vzc2lvbnMiLCBsb29wKTsKLSAgICAgICAgLyogV2UgY2FsY3VsYXRlIHRoZSBuZXdfb2Zmc2V0IGJ5ICJwZWVraW5nIiAob3IgaW4gdGhlCi0gICAgICAgICAqIGNhc2UgaXQncyB0aGUgbGFzdCBlbnRyeSwgInNuZWFraW5nIiA7LSkuICovCi0gICAgICAgIGlmIChsb29wID09IHBvc19jb3VudCkgewotICAgICAgICAgICAgLyogV2UgYXJlIGV4cGlyaW5nIGV2ZXJ5dGhpbmchIFRoaXMgaXMgZWFzeSB0byBkby4uLiAqLwotICAgICAgICAgICAgc2htY2Jfc2V0X3NhZmVfdWludChxdWV1ZS0+cG9zX2NvdW50LCAwKTsKLSAgICAgICAgICAgIHNobWNiX3NldF9zYWZlX3VpbnQoY2FjaGUtPnBvc19jb3VudCwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKiBUaGUgUXVldWUgaXMgZWFzeSB0byBhZGp1c3QgKi8KLSAgICAgICAgICAgIHNobWNiX3NldF9zYWZlX3VpbnQocXVldWUtPnBvc19jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG1jYl9nZXRfc2FmZV91aW50KHF1ZXVlLT5wb3NfY291bnQpIC0gbG9vcCk7Ci0gICAgICAgICAgICBzaG1jYl9zZXRfc2FmZV91aW50KHF1ZXVlLT5maXJzdF9wb3MsIG5ld19wb3MpOwotICAgICAgICAgICAgLyogcGVlayB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgc2Vzc2lvbiAqLwotICAgICAgICAgICAgaWR4ID0gc2htY2JfZ2V0X2luZGV4KHF1ZXVlLCBuZXdfcG9zKTsKLSAgICAgICAgICAgIC8qIFdlIGNhbiB1c2Ugc2htY2JfY3ljbGljX3NwYWNlIGJlY2F1c2Ugd2UndmUgZ3VhcmFudGVlZCAKLSAgICAgICAgICAgICAqIHdlIGRvbid0IGZpdCB0aGUgYW1iaWd1b3VzIGZ1bGwvZW1wdHkgY2FzZS4gKi8KLSAgICAgICAgICAgIHNobWNiX3NldF9zYWZlX3VpbnQoY2FjaGUtPnBvc19jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG1jYl9nZXRfc2FmZV91aW50KGNhY2hlLT5wb3NfY291bnQpIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG1jYl9jeWNsaWNfc3BhY2UoaGVhZGVyLT5jYWNoZV9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNobWNiX2dldF9zYWZlX3VpbnQoY2FjaGUtPmZpcnN0X3BvcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNobWNiX2dldF9zYWZlX3VpbnQoJihpZHgtPm9mZnNldCkpKSk7Ci0gICAgICAgICAgICBzaG1jYl9zZXRfc2FmZV91aW50KGNhY2hlLT5maXJzdF9wb3MsIHNobWNiX2dldF9zYWZlX3VpbnQoJihpZHgtPm9mZnNldCkpKTsKLSAgICAgICAgfQotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJ3ZSBub3cgaGF2ZSAldSBzZXNzaW9ucyIsCi0gICAgICAgICAgICAgICAgc2htY2JfZ2V0X3NhZmVfdWludChxdWV1ZS0+cG9zX2NvdW50KSk7Ci0gICAgfQotICAgIGhlYWRlci0+bnVtX2V4cGlyaWVzICs9IGxvb3A7Ci0gICAgcmV0dXJuIGxvb3A7Ci19Ci0KLS8qIEluc2VydHMgYSBuZXcgZW5jb2RlZCBzZXNzaW9uIGludG8gYSBxdWV1ZS9jYWNoZSBwYWlyIC0gZXhwaXJpbmcKLSAqIChlYXJseSBvciBvdGhlcndpc2UpIGFueSBsZWFkaW5nIHNlc3Npb25zIGFzIG5lY2Vzc2FyeSB0byBlbnN1cmUKLSAqIHRoZXJlIGlzIHJvb20uIEFuIGVycm9yIHJldHVybiAoRkFMU0UpIHNob3VsZCBvbmx5IGhhcHBlbiBpbiB0aGUKLSAqIGV2ZW50IG9mIHN1cnJlYWwgdmFsdWVzIGJlaW5nIHBhc3NlZCBvbiwgb3IgcmlkaWN1bG91c2x5IHNtYWxsCi0gKiBjYWNoZSBzaXplcy4gTkI6IEZvciB0cmFjaW5nIHB1cnBvc2VzLCB0aGlzIGZ1bmN0aW9uIGlzIGFsc28gZ2l2ZW4KLSAqIHRoZSBzZXJ2ZXJfcmVjIHRvIGFsbG93ICJzc2xfbG9nKCkiLiAqLwotc3RhdGljIEJPT0wgc2htY2JfaW5zZXJ0X2VuY29kZWRfc2Vzc2lvbigKLSAgICBzZXJ2ZXJfcmVjICpzLCBTSE1DQlF1ZXVlICogcXVldWUsCi0gICAgU0hNQ0JDYWNoZSAqIGNhY2hlLAotICAgIHVuc2lnbmVkIGNoYXIgKmVuY29kZWQsCi0gICAgdW5zaWduZWQgaW50IGVuY29kZWRfbGVuLAotICAgIHVuc2lnbmVkIGNoYXIgKnNlc3Npb25faWQsCi0gICAgdGltZV90IGV4cGlyeV90aW1lKQotewotICAgIFNITUNCSGVhZGVyICpoZWFkZXI7Ci0gICAgU0hNQ0JJbmRleCAqaWR4ID0gTlVMTDsKLSAgICB1bnNpZ25lZCBpbnQgZ2FwLCBuZXdfcG9zLCBsb29wLCBuZXdfb2Zmc2V0OwotICAgIGludCBuZWVkOwotCi0gICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLCAiZW50ZXJpbmcgc2htY2JfaW5zZXJ0X2VuY29kZWRfc2Vzc2lvbiwgIgotICAgICAgICAgICAgIipxdWV1ZS0+cG9zX2NvdW50ID0gJXUiLCBzaG1jYl9nZXRfc2FmZV91aW50KHF1ZXVlLT5wb3NfY291bnQpKTsKLQotICAgIC8qIElmIHRoZXJlJ3MgZW50cmllcyB0byBleHBpcmUsIGRpdGNoIHRoZW0gZmlyc3QgdGhpbmcuICovCi0gICAgc2htY2JfZXhwaXJlX2RpdmlzaW9uKHMsIHF1ZXVlLCBjYWNoZSk7Ci0gICAgaGVhZGVyID0gY2FjaGUtPmhlYWRlcjsKLSAgICBnYXAgPSBoZWFkZXItPmNhY2hlX2RhdGFfc2l6ZSAtIHNobWNiX2dldF9zYWZlX3VpbnQoY2FjaGUtPnBvc19jb3VudCk7Ci0gICAgaWYgKGdhcCA8IGVuY29kZWRfbGVuKSB7Ci0gICAgICAgIG5ld19wb3MgPSBzaG1jYl9nZXRfc2FmZV91aW50KHF1ZXVlLT5maXJzdF9wb3MpOwotICAgICAgICBsb29wID0gMDsKLSAgICAgICAgbmVlZCA9IChpbnQpIGVuY29kZWRfbGVuIC0gKGludCkgZ2FwOwotICAgICAgICB3aGlsZSAoKG5lZWQgPiAwKSAmJiAobG9vcCArIDEgPCBzaG1jYl9nZXRfc2FmZV91aW50KHF1ZXVlLT5wb3NfY291bnQpKSkgewotICAgICAgICAgICAgbmV3X3BvcyA9IHNobWNiX2N5Y2xpY19pbmNyZW1lbnQoaGVhZGVyLT5pbmRleF9udW0sIG5ld19wb3MsIDEpOwotICAgICAgICAgICAgbG9vcCArPSAxOwotICAgICAgICAgICAgaWR4ID0gc2htY2JfZ2V0X2luZGV4KHF1ZXVlLCBuZXdfcG9zKTsKLSAgICAgICAgICAgIG5lZWQgPSAoaW50KSBlbmNvZGVkX2xlbiAtIChpbnQpIGdhcCAtCi0gICAgICAgICAgICAgICAgc2htY2JfY3ljbGljX3NwYWNlKGhlYWRlci0+Y2FjaGVfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG1jYl9nZXRfc2FmZV91aW50KGNhY2hlLT5maXJzdF9wb3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG1jYl9nZXRfc2FmZV91aW50KCYoaWR4LT5vZmZzZXQpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvb3AgPiAwKSB7Ci0gICAgICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJhYm91dCB0byBzY3JvbGwgJXUgc2Vzc2lvbnMgZnJvbSAldSIsCi0gICAgICAgICAgICAgICAgICAgIGxvb3AsIHNobWNiX2dldF9zYWZlX3VpbnQocXVldWUtPnBvc19jb3VudCkpOwotICAgICAgICAgICAgLyogV2UgYXJlIHJlbW92aW5nICJsb29wIiBpdGVtcyBmcm9tIHRoZSBjYWNoZS4gKi8KLSAgICAgICAgICAgIHNobWNiX3NldF9zYWZlX3VpbnQoY2FjaGUtPnBvc19jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2htY2JfZ2V0X3NhZmVfdWludChjYWNoZS0+cG9zX2NvdW50KSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNobWNiX2N5Y2xpY19zcGFjZShoZWFkZXItPmNhY2hlX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNobWNiX2dldF9zYWZlX3VpbnQoY2FjaGUtPmZpcnN0X3BvcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG1jYl9nZXRfc2FmZV91aW50KCYoaWR4LT5vZmZzZXQpKSkpOwotICAgICAgICAgICAgc2htY2Jfc2V0X3NhZmVfdWludChjYWNoZS0+Zmlyc3RfcG9zLCBzaG1jYl9nZXRfc2FmZV91aW50KCYoaWR4LT5vZmZzZXQpKSk7Ci0gICAgICAgICAgICBzaG1jYl9zZXRfc2FmZV91aW50KHF1ZXVlLT5wb3NfY291bnQsIHNobWNiX2dldF9zYWZlX3VpbnQocXVldWUtPnBvc19jb3VudCkgLSBsb29wKTsKLSAgICAgICAgICAgIHNobWNiX3NldF9zYWZlX3VpbnQocXVldWUtPmZpcnN0X3BvcywgbmV3X3Bvcyk7Ci0gICAgICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJub3cgb25seSBoYXZlICV1IHNlc3Npb25zIiwKLSAgICAgICAgICAgICAgICAgICAgc2htY2JfZ2V0X3NhZmVfdWludChxdWV1ZS0+cG9zX2NvdW50KSk7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgdGhlIHN0YXRzISEhICovCi0gICAgICAgICAgICBoZWFkZXItPm51bV9zY3JvbGxlZCArPSBsb29wOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogcHJvYmFibHkgdW5lY2Vzc2FyeSBjaGVja3MsIGJ1dCBJJ2xsIGxlYXZlIHRoZW0gdW50aWwgdGhpcyBjb2RlCi0gICAgICogaXMgdmVyaWZpZWQuICovCi0gICAgaWYgKHNobWNiX2dldF9zYWZlX3VpbnQoY2FjaGUtPnBvc19jb3VudCkgKyBlbmNvZGVkX2xlbiA+Ci0gICAgICAgIGhlYWRlci0+Y2FjaGVfZGF0YV9zaXplKSB7Ci0gICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19FUlJPUiwgInNobWNiX2luc2VydF9lbmNvZGVkX3Nlc3Npb24sICIKLSAgICAgICAgICAgICAgICAiaW50ZXJuYWwgZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoc2htY2JfZ2V0X3NhZmVfdWludChxdWV1ZS0+cG9zX2NvdW50KSA9PSBoZWFkZXItPmluZGV4X251bSkgewotICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1IsICJzaG1jYl9pbnNlcnRfZW5jb2RlZF9zZXNzaW9uLCAiCi0gICAgICAgICAgICAgICAgImludGVybmFsIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLCAid2UgaGF2ZSAldSBieXRlcyBhbmQgJXUgaW5kZXhlcyBmcmVlIC0gIgotICAgICAgICAgICAgImVub3VnaCIsIGhlYWRlci0+Y2FjaGVfZGF0YV9zaXplIC0KLSAgICAgICAgICAgIHNobWNiX2dldF9zYWZlX3VpbnQoY2FjaGUtPnBvc19jb3VudCksIGhlYWRlci0+aW5kZXhfbnVtIC0KLSAgICAgICAgICAgIHNobWNiX2dldF9zYWZlX3VpbnQocXVldWUtPnBvc19jb3VudCkpOwotCi0KLSAgICAvKiBIRVJFIFdFIEFTU1VNRSBUSEFUIFRIRSBORVcgU0VTU0lPTiBTSE9VTEQgR08gT04gVEhFIEVORCEgSSdNIE5PVAotICAgICAqIENIRUNLSU5HIFdIRVRIRVIgSVQgU0hPVUxEIEJFIEdFTlVJTkVMWSAiSU5TRVJURUQiIFNPTUVXSEVSRS4KLSAgICAgKgotICAgICAqIFdlIGVpdGhlciBmaXggdGhhdCwgb3IgZmluZCBvdXQgYXQgYSAiaGlnaGVyIiAocmVhZCAibW9kX3NzbCIpCi0gICAgICogbGV2ZWwgd2hldGhlciBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGRpc3RpbmN0IHNlc3Npb24gY2FjaGVzIGZvcgotICAgICAqIGFueSBhdHRlbXB0ZWQgdG9tZm9vbGVyeSB0byBkbyB3aXRoIGRpZmZlcmVudCBzZXNzaW9uIHRpbWVvdXRzLgotICAgICAqIEtub3dpbmcgaW4gYWR2YW5jZSB0aGF0IHdlIGNhbiBoYXZlIGEgY2FjaGUtd2lkZSBjb25zdGFudCB0aW1lb3V0Ci0gICAgICogd291bGQgbWFrZSB0aGlzIHN0dWZmICpNVUNIKiBtb3JlIGVmZmljaWVudC4gTWluZCB5b3UsIGl0J3MgdmVyeQotICAgICAqIGVmZmljaWVudCByaWdodCBub3cgYmVjYXVzZSBJJ20gaWdub3JpbmcgdGhpcyBwcm9ibGVtISEhCi0gICAgICovCi0KLSAgICAvKiBJbmNyZW1lbnQgdG8gdGhlIGZpcnN0IHVudXNlZCBieXRlICovCi0gICAgbmV3X29mZnNldCA9IHNobWNiX2N5Y2xpY19pbmNyZW1lbnQoaGVhZGVyLT5jYWNoZV9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2htY2JfZ2V0X3NhZmVfdWludChjYWNoZS0+Zmlyc3RfcG9zKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG1jYl9nZXRfc2FmZV91aW50KGNhY2hlLT5wb3NfY291bnQpKTsKLSAgICAvKiBDb3B5IHRoZSBERVItZW5jb2RlZCBzZXNzaW9uIGludG8gcGxhY2UgKi8KLSAgICBzaG1jYl9jeWNsaWNfbnRvY19tZW1jcHkoaGVhZGVyLT5jYWNoZV9kYXRhX3NpemUsIGNhY2hlLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19vZmZzZXQsIGVuY29kZWQsIGVuY29kZWRfbGVuKTsKLSAgICAvKiBHZXQgdGhlIG5ldyBpbmRleCB0aGF0IHRoaXMgc2Vzc2lvbiBpcyBzdG9yZWQgaW4uICovCi0gICAgbmV3X3BvcyA9IHNobWNiX2N5Y2xpY19pbmNyZW1lbnQoaGVhZGVyLT5pbmRleF9udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2htY2JfZ2V0X3NhZmVfdWludChxdWV1ZS0+Zmlyc3RfcG9zKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG1jYl9nZXRfc2FmZV91aW50KHF1ZXVlLT5wb3NfY291bnQpKTsKLSAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJzdG9yaW5nIGluIGluZGV4ICV1LCBhdCBvZmZzZXQgJXUiLCBuZXdfcG9zLAotICAgICAgICAgICAgbmV3X29mZnNldCk7Ci0gICAgaWR4ID0gc2htY2JfZ2V0X2luZGV4KHF1ZXVlLCBuZXdfcG9zKTsKLSAgICBpZiAoaWR4ID09IE5VTEwpIHsKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX0VSUk9SLCAic2htY2JfaW5zZXJ0X2VuY29kZWRfc2Vzc2lvbiwgIgotICAgICAgICAgICAgICAgICJpbnRlcm5hbCBlcnJvciIpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1lbXNldChpZHgsIDAsIHNpemVvZihTSE1DQkluZGV4KSk7Ci0gICAgc2htY2Jfc2V0X3NhZmVfdGltZSgmKGlkeC0+ZXhwaXJlcyksIGV4cGlyeV90aW1lKTsKLSAgICBzaG1jYl9zZXRfc2FmZV91aW50KCYoaWR4LT5vZmZzZXQpLCBuZXdfb2Zmc2V0KTsKLQotICAgIC8qIGlkeC0+cmVtb3ZlZCA9ICh1bnNpZ25lZCBjaGFyKTA7ICovIC8qIE5vdCBuZWVkZWQgZ2l2ZW4gdGhlIG1lbXNldCBhYm92ZS4gKi8KLSAgICBpZHgtPnNfaWQyID0gc2Vzc2lvbl9pZFsxXTsKLSAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJzZXNzaW9uX2lkWzBdPSV1LCBpZHgtPnNfaWQyPSV1IiwKLSAgICAgICAgICAgIHNlc3Npb25faWRbMF0sIHNlc3Npb25faWRbMV0pOwotCi0gICAgLyogQWxsIHRoYXQgcmVtYWlucyBpcyB0byBhZGp1c3QgdGhlIGNhY2hlJ3MgYW5kIHF1ZXVlJ3MgInBvc19jb3VudCJzLiAqLwotICAgIHNobWNiX3NldF9zYWZlX3VpbnQoY2FjaGUtPnBvc19jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgc2htY2JfZ2V0X3NhZmVfdWludChjYWNoZS0+cG9zX2NvdW50KSArIGVuY29kZWRfbGVuKTsKLSAgICBzaG1jYl9zZXRfc2FmZV91aW50KHF1ZXVlLT5wb3NfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgIHNobWNiX2dldF9zYWZlX3VpbnQocXVldWUtPnBvc19jb3VudCkgKyAxKTsKLQotICAgIC8qIEFuZCBqdXN0IGZvciBnb29kIGRlYnVnZ2luZyBtZWFzdXJlIC4uLiAqLwotICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwgImxlYXZpbmcgbm93IHdpdGggJXUgYnl0ZXMgaW4gdGhlIGNhY2hlIGFuZCAiCi0gICAgICAgICAgICAiJXUgaW5kZXhlcyIsIHNobWNiX2dldF9zYWZlX3VpbnQoY2FjaGUtPnBvc19jb3VudCksCi0gICAgICAgICAgICBzaG1jYl9nZXRfc2FmZV91aW50KHF1ZXVlLT5wb3NfY291bnQpKTsKLSAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJsZWF2aW5nIHNobWNiX2luc2VydF9lbmNvZGVkX3Nlc3Npb24iKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyogUGVyZm9ybXMgYSBsb29rdXAgaW50byBhIHF1ZXVlL2NhY2hlIHBhaXIgZm9yIGEKLSAqIHNlc3Npb25faWQuIElmIGZvdW5kLCB0aGUgc2Vzc2lvbiBpcyBkZXNlcmlhbGlzZWQKLSAqIGFuZCByZXR1cm5lZCwgb3RoZXJ3aXNlIE5VTEwuICovCi1zdGF0aWMgU1NMX1NFU1NJT04gKnNobWNiX2xvb2t1cF9zZXNzaW9uX2lkKAotICAgIHNlcnZlcl9yZWMgKnMsIFNITUNCUXVldWUgKnF1ZXVlLAotICAgIFNITUNCQ2FjaGUgKmNhY2hlLCBVQ0hBUiAqaWQsCi0gICAgaW50IGlkbGVuKQotewotICAgIHVuc2lnbmVkIGNoYXIgdGVtcGFzbltTU0xfU0VTU0lPTl9NQVhfREVSXTsKLSAgICBTSE1DQkluZGV4ICppZHg7Ci0gICAgU0hNQ0JIZWFkZXIgKmhlYWRlcjsKLSAgICBTU0xfU0VTU0lPTiAqcFNlc3Npb24gPSBOVUxMOwotICAgIHVuc2lnbmVkIGludCBjdXJyX3BvcywgbG9vcCwgY291bnQ7Ci0gICAgdW5zaWduZWQgY2hhciAqcHRyOwotICAgIHRpbWVfdCBub3c7Ci0KLSAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJlbnRlcmluZyBzaG1jYl9sb29rdXBfc2Vzc2lvbl9pZCIpOwotCi0gICAgLyogSWYgdGhlcmUgYXJlIGVudHJpZXMgdG8gZXhwaXJlLCBkaXRjaCB0aGVtIGZpcnN0IHRoaW5nLiAqLwotICAgIHNobWNiX2V4cGlyZV9kaXZpc2lvbihzLCBxdWV1ZSwgY2FjaGUpOwotICAgIG5vdyA9IHRpbWUoTlVMTCk7Ci0gICAgY3Vycl9wb3MgPSBzaG1jYl9nZXRfc2FmZV91aW50KHF1ZXVlLT5maXJzdF9wb3MpOwotICAgIGNvdW50ID0gc2htY2JfZ2V0X3NhZmVfdWludChxdWV1ZS0+cG9zX2NvdW50KTsKLSAgICBoZWFkZXIgPSBxdWV1ZS0+aGVhZGVyOwotICAgIGZvciAobG9vcCA9IDA7IGxvb3AgPCBjb3VudDsgbG9vcCsrKSB7Ci0gICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwgImxvb3A9JXUsIGNvdW50PSV1LCBjdXJyX3Bvcz0ldSIsCi0gICAgICAgICAgICAgICAgbG9vcCwgY291bnQsIGN1cnJfcG9zKTsKLSAgICAgICAgaWR4ID0gc2htY2JfZ2V0X2luZGV4KHF1ZXVlLCBjdXJyX3Bvcyk7Ci0gICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwgImlkeC0+c19pZDI9JXUsIGlkWzFdPSV1LCBvZmZzZXQ9JXUiLAotICAgICAgICAgICAgICAgIGlkeC0+c19pZDIsIGlkWzFdLCBzaG1jYl9nZXRfc2FmZV91aW50KCYoaWR4LT5vZmZzZXQpKSk7Ci0gICAgICAgIC8qIE9ubHkgbG9vayBpbnRvIHRoZSBzZXNzaW9uIGZ1cnRoZXIgaWY7Ci0gICAgICAgICAqIChhKSB0aGUgc2Vjb25kIGJ5dGUgb2YgdGhlIHNlc3Npb25faWQgbWF0Y2hlcywKLSAgICAgICAgICogKGIpIHRoZSAicmVtb3ZlZCIgZmxhZyBpc24ndCBzZXQsCi0gICAgICAgICAqIChjKSB0aGUgc2Vzc2lvbiBoYXNuJ3QgZXhwaXJlZCB5ZXQuCi0gICAgICAgICAqIFdlIGRvIChjKSBsaWtlIHRoaXMgc28gdGhhdCBpdCBzYXZlcyB1cyBoYXZpbmcgdG8KLSAgICAgICAgICogZG8gbmF0dXJhbCBleHBpcmllcyAuLi4gbmF0dXJhbGx5IGV4cGlyZWQgc2Vzc2lvbnMKLSAgICAgICAgICogc2Nyb2xsIG9mZiB0aGUgZnJvbnQgYW55d2F5IHdoZW4gdGhlIGNhY2hlIGlzIGZ1bGwgYW5kCi0gICAgICAgICAqICJyb3RhdGluZyIsIHRoZSBvbmx5IHJlYWwgaXNzdWUgdGhhdCByZW1haW5zIGlzIHRoZQotICAgICAgICAgKiByZW1vdmFsIG9yIGRpc2FibGluZyBvZiBmb3JjaWJseSBraWxsZWQgc2Vzc2lvbnMuICovCi0gICAgICAgIGlmICgoaWR4LT5zX2lkMiA9PSBpZFsxXSkgJiYgIWlkeC0+cmVtb3ZlZCAmJgotICAgICAgICAgICAgKHNobWNiX2dldF9zYWZlX3RpbWUoJihpZHgtPmV4cGlyZXMpKSA+IG5vdykpIHsKLSAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwgImF0IGluZGV4ICV1LCBmb3VuZCBwb3NzaWJsZSAiCi0gICAgICAgICAgICAgICAgICAgICJzZXNzaW9uIG1hdGNoIiwgY3Vycl9wb3MpOwotICAgICAgICAgICAgc2htY2JfY3ljbGljX2N0b25fbWVtY3B5KGhlYWRlci0+Y2FjaGVfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBhc24sIGNhY2hlLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNobWNiX2dldF9zYWZlX3VpbnQoJihpZHgtPm9mZnNldCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9TRVNTSU9OX01BWF9ERVIpOwotICAgICAgICAgICAgcHRyID0gdGVtcGFzbjsKLSAgICAgICAgICAgIHBTZXNzaW9uID0gZDJpX1NTTF9TRVNTSU9OKE5VTEwsICZwdHIsIFNTTF9TRVNTSU9OX01BWF9ERVIpOwotICAgICAgICAgICAgaWYgKHBTZXNzaW9uID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1IsICJzY2FjaDJfbG9va3VwXyIKLSAgICAgICAgICAgICAgICAgICAgICAgICJzZXNzaW9uX2lkLCBpbnRlcm5hbCBlcnJvciIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChwU2Vzc2lvbi0+c2Vzc2lvbl9pZF9sZW5ndGggPT0gaWRsZW4pICYmCi0gICAgICAgICAgICAgICAgKG1lbWNtcChwU2Vzc2lvbi0+c2Vzc2lvbl9pZCwgaWQsIGlkbGVuKSA9PSAwKSkgewotICAgICAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwgImEgbWF0Y2ghIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBTZXNzaW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLCAibm90IGEgbWF0Y2giKTsKLSAgICAgICAgICAgIFNTTF9TRVNTSU9OX2ZyZWUocFNlc3Npb24pOwotICAgICAgICAgICAgcFNlc3Npb24gPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGN1cnJfcG9zID0gc2htY2JfY3ljbGljX2luY3JlbWVudChoZWFkZXItPmluZGV4X251bSwgY3Vycl9wb3MsIDEpOwotICAgIH0KLSAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJubyBtYXRjaGluZyBzZXNzaW9ucyB3ZXJlIGZvdW5kIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBCT09MIHNobWNiX3JlbW92ZV9zZXNzaW9uX2lkKAotICAgIHNlcnZlcl9yZWMgKnMsIFNITUNCUXVldWUgKnF1ZXVlLAotICAgIFNITUNCQ2FjaGUgKmNhY2hlLCBVQ0hBUiAqaWQsIGludCBpZGxlbikKLXsKLSAgICB1bnNpZ25lZCBjaGFyIHRlbXBhc25bU1NMX1NFU1NJT05fTUFYX0RFUl07Ci0gICAgU1NMX1NFU1NJT04gKnBTZXNzaW9uID0gTlVMTDsKLSAgICBTSE1DQkluZGV4ICppZHg7Ci0gICAgU0hNQ0JIZWFkZXIgKmhlYWRlcjsKLSAgICB1bnNpZ25lZCBpbnQgY3Vycl9wb3MsIGxvb3AsIGNvdW50OwotICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLSAgICBCT09MIHRvX3JldHVybiA9IEZBTFNFOwotCi0gICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLCAiZW50ZXJpbmcgc2htY2JfcmVtb3ZlX3Nlc3Npb25faWQiKTsKLQotICAgIC8qIElmIHRoZXJlJ3MgZW50cmllcyB0byBleHBpcmUsIGRpdGNoIHRoZW0gZmlyc3QgdGhpbmcuICovCi0gICAgLyogc2htY2JfZXhwaXJlX2RpdmlzaW9uKHMsIHF1ZXVlLCBjYWNoZSk7ICovCi0KLSAgICAvKiBSZWdhcmRpbmcgdGhlIGFib3ZlIC4uLiBobW1tIC4uLiBJIGtub3cgbXkgZXhwaXJ5IGNvZGUgaXMgc2xpZ2h0bHkKLSAgICAgKiAiZmFzdGVyIiB0aGFuIGFsbCB0aGlzIHJlbW92ZSBzdHVmZiAuLi4gYnV0IGlmIHRoZSBoaWdoZXIgbGV2ZWwKLSAgICAgKiBjb2RlIGNhbGxzIGEgInJlbW92ZSIgb3BlcmF0aW9uIChhbmQgdGhpcyAqb25seSogc2VlbXMgdG8gaGFwcGVuCi0gICAgICogd2hlbiBpdCBoYXMgc3BvdHRlZCBhbiBleHBpcmVkIHNlc3Npb24gYmVmb3JlIHdlIGhhZCBhIGNoYW5jZSB0bykKLSAgICAgKiB0aGVuIGl0IHNob3VsZCBnZXQgY3JlZGl0IGZvciBhIHJlbW92ZSAoc3RhdHMtd2lzZSkuIEFsc28sIGluIHRoZQotICAgICAqIG9mZi1jaGFuY2UgdGhhdCB0aGUgc2VydmVyICpyZXF1ZXN0cyogYSByZW5lZ290aWF0ZSBhbmQgd2FudHMgdG8KLSAgICAgKiB3aXBlIHRoZSBzZXNzaW9uIGNsZWFuIHdlIHNob3VsZCBnaXZlIHRoYXQgcHJpb3JpdHkgb3ZlciBvdXIgb3duCi0gICAgICogcm91dGluZSBleHBpcnkgaGFuZGxpbmcuIFNvIEkndmUgbW92ZWQgdGhlIGV4cGlyeSBjaGVjayB0byAqYWZ0ZXIqCi0gICAgICogdGhpcyBnZW5lcmFsIHJlbW92ZSBzdHVmZi4gKi8KLSAgICBjdXJyX3BvcyA9IHNobWNiX2dldF9zYWZlX3VpbnQocXVldWUtPmZpcnN0X3Bvcyk7Ci0gICAgY291bnQgPSBzaG1jYl9nZXRfc2FmZV91aW50KHF1ZXVlLT5wb3NfY291bnQpOwotICAgIGhlYWRlciA9IGNhY2hlLT5oZWFkZXI7Ci0gICAgZm9yIChsb29wID0gMDsgbG9vcCA8IGNvdW50OyBsb29wKyspIHsKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLCAibG9vcD0ldSwgY291bnQ9JXUsIGN1cnJfcG9zPSV1IiwKLSAgICAgICAgICAgICAgICBsb29wLCBjb3VudCwgY3Vycl9wb3MpOwotICAgICAgICBpZHggPSBzaG1jYl9nZXRfaW5kZXgocXVldWUsIGN1cnJfcG9zKTsKLSAgICAgICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLCAiaWR4LT5zX2lkMj0ldSwgaWRbMV09JXUiLCBpZHgtPnNfaWQyLAotICAgICAgICAgICAgICAgIGlkWzFdKTsKLSAgICAgICAgLyogT25seSBsb29rIGludG8gdGhlIHNlc3Npb24gZnVydGhlciBpZiB0aGUgc2Vjb25kIGJ5dGUgb2YgdGhlCi0gICAgICAgICAqIHNlc3Npb25faWQgbWF0Y2hlcy4gKi8KLSAgICAgICAgaWYgKGlkeC0+c19pZDIgPT0gaWRbMV0pIHsKLSAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwgImF0IGluZGV4ICV1LCBmb3VuZCBwb3NzaWJsZSAiCi0gICAgICAgICAgICAgICAgICAgICJzZXNzaW9uIG1hdGNoIiwgY3Vycl9wb3MpOwotICAgICAgICAgICAgc2htY2JfY3ljbGljX2N0b25fbWVtY3B5KGhlYWRlci0+Y2FjaGVfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBhc24sIGNhY2hlLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNobWNiX2dldF9zYWZlX3VpbnQoJihpZHgtPm9mZnNldCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9TRVNTSU9OX01BWF9ERVIpOwotICAgICAgICAgICAgcHRyID0gdGVtcGFzbjsKLSAgICAgICAgICAgIHBTZXNzaW9uID0gZDJpX1NTTF9TRVNTSU9OKE5VTEwsICZwdHIsIFNTTF9TRVNTSU9OX01BWF9ERVIpOwotICAgICAgICAgICAgaWYgKHBTZXNzaW9uID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfRVJST1IsICJzaG1jYl9yZW1vdmVfc2Vzc2lvbl9pZCwgIgotICAgICAgICAgICAgICAgICAgICAgICAgImludGVybmFsIGVycm9yIik7Ci0gICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKHBTZXNzaW9uLT5zZXNzaW9uX2lkX2xlbmd0aCA9PSBpZGxlbikgCi0gICAgICAgICAgICAgICAgICYmIChtZW1jbXAoaWQsIHBTZXNzaW9uLT5zZXNzaW9uX2lkLCBpZGxlbikgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICBzc2xfbG9nKHMsIFNTTF9MT0dfVFJBQ0UsICJhIG1hdGNoISIpOwotICAgICAgICAgICAgICAgIC8qIFNjcnViIG91dCB0aGlzIHNlc3Npb24gInF1aWV0bHkiICovCi0gICAgICAgICAgICAgICAgaWR4LT5yZW1vdmVkID0gKHVuc2lnbmVkIGNoYXIpIDE7Ci0gICAgICAgICAgICAgICAgU1NMX1NFU1NJT05fZnJlZShwU2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgdG9fcmV0dXJuID0gVFJVRTsKLSAgICAgICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNzbF9sb2cocywgU1NMX0xPR19UUkFDRSwgIm5vdCBhIG1hdGNoIik7Ci0gICAgICAgICAgICBTU0xfU0VTU0lPTl9mcmVlKHBTZXNzaW9uKTsKLSAgICAgICAgICAgIHBTZXNzaW9uID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBjdXJyX3BvcyA9IHNobWNiX2N5Y2xpY19pbmNyZW1lbnQoaGVhZGVyLT5pbmRleF9udW0sIGN1cnJfcG9zLCAxKTsKLSAgICB9Ci0gICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLCAibm8gbWF0Y2hpbmcgc2Vzc2lvbnMgd2VyZSBmb3VuZCIpOwotCi0gICAgLyogSWYgdGhlcmUncyBlbnRyaWVzIHRvIGV4cGlyZSwgZGl0Y2ggdGhlbSBub3cuICovCi0gICAgc2htY2JfZXhwaXJlX2RpdmlzaW9uKHMsIHF1ZXVlLCBjYWNoZSk7Ci1lbmQ6Ci0gICAgc3NsX2xvZyhzLCBTU0xfTE9HX1RSQUNFLCAibGVhdmluZyBzaG1jYl9yZW1vdmVfc2Vzc2lvbl9pZCIpOwotICAgIHJldHVybiB0b19yZXR1cm47Ci19Ci0KZGlmZiAtLWdpdCBhL21vZHVsZXMvc3NsL3NzbF91dGlsLmMgYi9tb2R1bGVzL3NzbC9zc2xfdXRpbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjRhOTY3Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvc3NsL3NzbF91dGlsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzcgKzAsMCBAQAotLyogICAgICAgICAgICAgICAgICAgICAgXyAgICAgICAgICAgICBfCi0qKiAgXyBfXyBfX18gICBfX18gICBfX3wgfCAgICBfX18gX19ffCB8ICBtb2Rfc3NsCi0qKiB8ICdfIGAgXyBcIC8gXyBcIC8gX2AgfCAgIC8gX18vIF9ffCB8ICBBcGFjaGUgSW50ZXJmYWNlIHRvIE9wZW5TU0wKLSoqIHwgfCB8IHwgfCB8IChfKSB8IChffCB8ICAgXF9fIFxfXyBcIHwgIHd3dy5tb2Rzc2wub3JnCi0qKiB8X3wgfF98IHxffFxfX18vIFxfXyxffF9fX3xfX18vX19fL198ICBmdHAubW9kc3NsLm9yZwotKiogICAgICAgICAgICAgICAgICAgICAgfF9fX19ffAotKiogIHNzbF91dGlsLmMKLSoqICBVdGlsaXR5IEZ1bmN0aW9ucwotKi8KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAxIFJhbGYgUy4gRW5nZWxzY2hhbGwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci0gKiAgICAgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGVuZ2Vsc2NoYWxsLmNvbT4gZm9yIHVzZSBpbiB0aGUKLSAqICAgICBtb2Rfc3NsIHByb2plY3QgKGh0dHA6Ly93d3cubW9kc3NsLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIm1vZF9zc2wiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICByc2VAZW5nZWxzY2hhbGwuY29tLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJtb2Rfc3NsIgotICogICAgbm9yIG1heSAibW9kX3NzbCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3IKLSAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBSYWxmIFMuIEVuZ2Vsc2NoYWxsLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLSAqICAgICBSYWxmIFMuIEVuZ2Vsc2NoYWxsIDxyc2VAZW5nZWxzY2hhbGwuY29tPiBmb3IgdXNlIGluIHRoZQotICogICAgIG1vZF9zc2wgcHJvamVjdCAoaHR0cDovL3d3dy5tb2Rzc2wub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgUkFMRiBTLiBFTkdFTFNDSEFMTCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgUkFMRiBTLiBFTkdFTFNDSEFMTCBPUgotICogSElTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBCZW4gTGF1cmllLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBCZW4gTGF1cmllCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUtU1NMIEhUVFAgc2VydmVyIHByb2plY3QuIgotICoKLSAqIDQuIFRoZSBuYW1lICJBcGFjaGUtU1NMIFNlcnZlciIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiA1LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEJlbiBMYXVyaWUKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZS1TU0wgSFRUUCBzZXJ2ZXIgcHJvamVjdC4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBCRU4gTEFVUklFIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBCRU4gTEFVUklFIE9SCi0gKiBISVMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYGBFdmVyeSBkYXkgb2YgbXkgbGlmZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkgYW0gZm9yY2VkIHRvIGFkZCBhbm90aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSB0byB0aGUgbGlzdCBvZiBwZW9wbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aG8gcGlzcyBtZSBvZmYhJycKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gQ2FsdmluICAgICAgICAgICovCi0jaW5jbHVkZSAibW9kX3NzbC5oIgotCi0KLS8qICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICBVdGlsaXR5IEZ1bmN0aW9ucwotKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qLwotCi1jaGFyICpzc2xfdXRpbF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShwb29sICpwLCBjaGFyICp3aGF0LCBjaGFyICphcmcpCi17Ci0gICAgY2hhciAqcnYgPSBOVUxMOwotCi0jaWZkZWYgU1NMX1ZFTkRPUgotICAgIGFwX2hvb2tfdXNlKCJhcDo6bW9kX3NzbDo6dmVuZG9yOjpzc2xfc2VydmVyX3Jvb3RfcmVsYXRpdmUiLAotICAgICAgICAgICAgICAgIEFQX0hPT0tfU0lHNChwdHIscHRyLHB0cixwdHIpLCBBUF9IT09LX0FMTCwgJnJ2LCBwLCB3aGF0LCBhcmcpOwotICAgIGlmIChydiAhPSBOVUxMKQotICAgICAgICByZXR1cm4gcnY7Ci0jZW5kaWYKLSAgICBydiA9IGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHAsIGFyZyk7Ci0gICAgcmV0dXJuIHJ2OwotfQotCi1jaGFyICpzc2xfdXRpbF92aG9zdGlkKHBvb2wgKnAsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgY2hhciAqaWQ7Ci0gICAgU1NMU3J2Q29uZmlnUmVjICpzYzsKLSAgICBjaGFyICpob3N0OwotICAgIHVuc2lnbmVkIGludCBwb3J0OwotCi0gICAgaG9zdCA9IHMtPnNlcnZlcl9ob3N0bmFtZTsKLSAgICBpZiAocy0+cG9ydCAhPSAwKQotICAgICAgICBwb3J0ID0gcy0+cG9ydDsKLSAgICBlbHNlIHsKLSAgICAgICAgc2MgPSBteVNydkNvbmZpZyhzKTsKLSAgICAgICAgaWYgKHNjLT5iRW5hYmxlZCkKLSAgICAgICAgICAgIHBvcnQgPSBERUZBVUxUX0hUVFBTX1BPUlQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBvcnQgPSBERUZBVUxUX0hUVFBfUE9SVDsKLSAgICB9Ci0gICAgaWQgPSBhcF9wc3ByaW50ZihwLCAiJXM6JXUiLCBob3N0LCBwb3J0KTsKLSAgICByZXR1cm4gaWQ7Ci19Ci0KLXZvaWQgc3NsX3V0aWxfc3RydXBwZXIoY2hhciAqcykKLXsKLSAgICBmb3IgKDsgKnM7ICsrcykKLSAgICAgICAgKnMgPSB0b3VwcGVyKCpzKTsKLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyIHNzbF91dGlsX3V1ZW5jb2RlX3NpeDJwcls2NCsxXSA9Ci0gICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwotCi12b2lkIHNzbF91dGlsX3V1ZW5jb2RlKGNoYXIgKnN6VG8sIGNvbnN0IGNoYXIgKnN6RnJvbSwgQk9PTCBiUGFkKQotewotICAgIHNzbF91dGlsX3V1ZW5jb2RlX2JpbmFyeSgodW5zaWduZWQgY2hhciAqKXN6VG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyICopc3pGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oc3pGcm9tKSwgYlBhZCk7Ci19Ci0KLXZvaWQgc3NsX3V0aWxfdXVlbmNvZGVfYmluYXJ5KAotICAgIHVuc2lnbmVkIGNoYXIgKnN6VG8sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN6RnJvbSwgaW50IG5MZW5ndGgsIEJPT0wgYlBhZCkKLXsKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzOwotICAgIGludCBuUGFkID0gMDsKLQotICAgIGZvciAocyA9IHN6RnJvbTsgbkxlbmd0aCA+IDA7IHMgKz0gMykgewotICAgICAgICAqc3pUbysrID0gc3NsX3V0aWxfdXVlbmNvZGVfc2l4MnByW3NbMF0gPj4gMl07Ci0gICAgICAgICpzelRvKysgPSBzc2xfdXRpbF91dWVuY29kZV9zaXgycHJbKHNbMF0gPDwgNCB8IHNbMV0gPj4gNCkgJiAweDNmXTsKLSAgICAgICAgaWYgKC0tbkxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICBuUGFkID0gMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgICpzelRvKysgPSBzc2xfdXRpbF91dWVuY29kZV9zaXgycHJbKHNbMV0gPDwgMiB8IHNbMl0gPj4gNikgJiAweDNmXTsKLSAgICAgICAgaWYgKC0tbkxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICBuUGFkID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgICpzelRvKysgPSBzc2xfdXRpbF91dWVuY29kZV9zaXgycHJbc1syXSAmIDB4M2ZdOwotICAgICAgICAtLW5MZW5ndGg7Ci0gICAgfQotICAgIHdoaWxlKGJQYWQgJiYgblBhZC0tKQotICAgICAgICAqc3pUbysrID0gTlVMOwotICAgICpzelRvID0gTlVMOwotICAgIHJldHVybjsKLX0KLQotRklMRSAqc3NsX3V0aWxfcHBvcGVuKHNlcnZlcl9yZWMgKnMsIHBvb2wgKnAsIGNoYXIgKmNtZCkKLXsKLSAgICBGSUxFICpmcG91dDsKLSAgICBpbnQgcmM7Ci0KLSAgICBmcG91dCA9IE5VTEw7Ci0gICAgcmMgPSBhcF9zcGF3bl9jaGlsZChwLCBzc2xfdXRpbF9wcG9wZW5fY2hpbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNtZCwga2lsbF9hZnRlcl90aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJmZwb3V0LCBOVUxMKTsKLSAgICBpZiAocmMgPT0gMCB8fCBmcG91dCA9PSBOVUxMKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHMsCi0gICAgICAgICAgICAgICAgICAgICAic3NsX3V0aWxfcHBvcGVuOiBjb3VsZCBub3QgcnVuOiAlcyIsIGNtZCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gKGZwb3V0KTsKLX0KLQotaW50IHNzbF91dGlsX3Bwb3Blbl9jaGlsZCh2b2lkICpjbWQsIGNoaWxkX2luZm8gKnBpbmZvKQotewotICAgIGludCBjaGlsZF9waWQgPSAxOwotCi0gICAgLyoKLSAgICAgKiBQcmVwYXJlIGZvciBleGVjCi0gICAgICovCi0gICAgYXBfY2xlYW51cF9mb3JfZXhlYygpOwotI2lmZGVmIFNJR0hVUAotICAgIHNpZ25hbChTSUdIVVAsIFNJR19JR04pOwotI2VuZGlmCi0KLSAgICAvKgotICAgICAqIEV4ZWMoKSB0aGUgY2hpbGQgcHJvZ3JhbQotICAgICAqLwotI2lmIGRlZmluZWQoV0lOMzIpCi0gICAgLyogTVMgV2luZG93cyAqLwotICAgIHsKLSAgICAgICAgY2hhciBwQ29tbWFuZFtNQVhfU1RSSU5HX0xFTl07Ci0gICAgICAgIFNUQVJUVVBJTkZPIHNpOwotICAgICAgICBQUk9DRVNTX0lORk9STUFUSU9OIHBpOwotCi0gICAgICAgIGFwX3NucHJpbnRmKHBDb21tYW5kLCBzaXplb2YocENvbW1hbmQpLCAiJXMgL0MgJXMiLCBTSEVMTF9QQVRILCBjbWQpOwotCi0gICAgICAgIG1lbXNldCgmc2ksIDAsIHNpemVvZihzaSkpOwotICAgICAgICBtZW1zZXQoJnBpLCAwLCBzaXplb2YocGkpKTsKLQotICAgICAgICBzaS5jYiAgICAgICAgICA9IHNpemVvZihzaSk7Ci0gICAgICAgIHNpLmR3RmxhZ3MgICAgID0gU1RBUlRGX1VTRVNIT1dXSU5ET1cgfCBTVEFSVEZfVVNFU1RESEFORExFUzsKLSAgICAgICAgc2kud1Nob3dXaW5kb3cgPSBTV19ISURFOwotICAgICAgICBzaS5oU3RkSW5wdXQgICA9IHBpbmZvLT5oUGlwZUlucHV0UmVhZDsKLSAgICAgICAgc2kuaFN0ZE91dHB1dCAgPSBwaW5mby0+aFBpcGVPdXRwdXRXcml0ZTsKLSAgICAgICAgc2kuaFN0ZEVycm9yICAgPSBwaW5mby0+aFBpcGVFcnJvcldyaXRlOwotCi0gICAgICAgIGlmIChDcmVhdGVQcm9jZXNzKE5VTEwsIHBDb21tYW5kLCBOVUxMLCBOVUxMLCBUUlVFLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9uLCBOVUxMLCAmc2ksICZwaSkpIHsKLSAgICAgICAgICAgIENsb3NlSGFuZGxlKHBpLmhQcm9jZXNzKTsKLSAgICAgICAgICAgIENsb3NlSGFuZGxlKHBpLmhUaHJlYWQpOwotICAgICAgICAgICAgY2hpbGRfcGlkID0gcGkuZHdQcm9jZXNzSWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0jZWxpZiBkZWZpbmVkKE9TMikKLSAgICAvKiBJQk0gT1MvMiAqLwotICAgIHNwYXdubChQX05PV0FJVCwgU0hFTExfUEFUSCwgU0hFTExfUEFUSCwgIi9jIiwgKGNoYXIgKiljbWQsIE5VTEwpOwotI2Vsc2UKLSAgICAvKiBTdGFuZGFyZCBVbml4ICovCi0gICAgZXhlY2woU0hFTExfUEFUSCwgU0hFTExfUEFUSCwgIi1jIiwgKGNoYXIgKiljbWQsIE5VTEwpOwotI2VuZGlmCi0gICAgcmV0dXJuIChjaGlsZF9waWQpOwotfQotCi12b2lkIHNzbF91dGlsX3BwY2xvc2Uoc2VydmVyX3JlYyAqcywgcG9vbCAqcCwgRklMRSAqZnApCi17Ci0gICAgYXBfcGZjbG9zZShwLCBmcCk7Ci0gICAgcmV0dXJuOwotfQotCi0vKgotICogUnVuIGEgZmlsdGVyIHByb2dyYW0gYW5kIHJlYWQgdGhlIGZpcnN0IGxpbmUgb2YgaXRzIHN0ZG91dCBvdXRwdXQKLSAqLwotY2hhciAqc3NsX3V0aWxfcmVhZGZpbHRlcihzZXJ2ZXJfcmVjICpzLCBwb29sICpwLCBjaGFyICpjbWQpCi17Ci0gICAgc3RhdGljIGNoYXIgYnVmW01BWF9TVFJJTkdfTEVOXTsKLSAgICBGSUxFICpmcDsKLSAgICBjaGFyIGM7Ci0gICAgaW50IGs7Ci0KLSAgICBpZiAoKGZwID0gc3NsX3V0aWxfcHBvcGVuKHMsIHAsIGNtZCkpID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGZvciAoayA9IDA7ICAgIHJlYWQoZmlsZW5vKGZwKSwgJmMsIDEpID09IDEKLSAgICAgICAgICAgICAgICAmJiAoayA8IE1BWF9TVFJJTkdfTEVOLTEpICAgICAgIDsgKSB7Ci0gICAgICAgIGlmIChjID09ICdcbicgfHwgYyA9PSAnXHInKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGJ1ZltrKytdID0gYzsKLSAgICB9Ci0gICAgYnVmW2tdID0gTlVMOwotICAgIHNzbF91dGlsX3BwY2xvc2UocywgcCwgZnApOwotCi0gICAgcmV0dXJuIGJ1ZjsKLX0KLQotQk9PTCBzc2xfdXRpbF9wYXRoX2NoZWNrKHNzbF9wYXRoY2hlY2tfdCBwY20sIGNoYXIgKnBhdGgpCi17Ci0gICAgc3RydWN0IHN0YXQgc2I7Ci0KLSAgICBpZiAocGF0aCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKHBjbSAmIFNTTF9QQ01fRVhJU1RTICYmIHN0YXQocGF0aCwgJnNiKSAhPSAwKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKHBjbSAmIFNTTF9QQ01fSVNSRUcgJiYgIVNfSVNSRUcoc2Iuc3RfbW9kZSkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBpZiAocGNtICYgU1NMX1BDTV9JU0RJUiAmJiAhU19JU0RJUihzYi5zdF9tb2RlKSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIGlmIChwY20gJiBTU0xfUENNX0lTTk9OWkVSTyAmJiBzYi5zdF9tb2RlIDw9IDApCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotc3NsX2FsZ29fdCBzc2xfdXRpbF9hbGdvdHlwZW9mKFg1MDkgKnBDZXJ0LCBFVlBfUEtFWSAqcEtleSkgCi17Ci0gICAgc3NsX2FsZ29fdCB0OwotICAgICAgICAgICAgCi0gICAgdCA9IFNTTF9BTEdPX1VOS05PV047Ci0gICAgaWYgKHBDZXJ0ICE9IE5VTEwpCi0gICAgICAgIHBLZXkgPSBYNTA5X2dldF9wdWJrZXkocENlcnQpOwotICAgIGlmIChwS2V5ICE9IE5VTEwpIHsKLSAgICAgICAgc3dpdGNoIChFVlBfUEtFWV90eXBlKHBLZXktPnR5cGUpKSB7Ci0gICAgICAgICAgICBjYXNlIEVWUF9QS0VZX1JTQTogCi0gICAgICAgICAgICAgICAgdCA9IFNTTF9BTEdPX1JTQTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRVZQX1BLRVlfRFNBOiAKLSAgICAgICAgICAgICAgICB0ID0gU1NMX0FMR09fRFNBOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdDsKLX0KLQotY2hhciAqc3NsX3V0aWxfYWxnb3R5cGVzdHIoc3NsX2FsZ29fdCB0KSAKLXsKLSAgICBjaGFyICpjcDsKLQotICAgIGNwID0gIlVOS05PV04iOwotICAgIHN3aXRjaCAodCkgewotICAgICAgICBjYXNlIFNTTF9BTEdPX1JTQTogCi0gICAgICAgICAgICBjcCA9ICJSU0EiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1NMX0FMR09fRFNBOiAKLSAgICAgICAgICAgIGNwID0gIkRTQSI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gY3A7Ci19Ci0KLWNoYXIgKnNzbF91dGlsX3B0eHRzdWIoCi0gICAgcG9vbCAqcCwgY29uc3QgY2hhciAqY3BMaW5lLCBjb25zdCBjaGFyICpjcE1hdGNoLCBjaGFyICpjcFN1YnN0KQotewotI2RlZmluZSBNQVhfUFRYVFNVQiAxMDAKLSAgICBjaGFyICpjcHBNYXRjaFtNQVhfUFRYVFNVQl07Ci0gICAgY2hhciAqY3BSZXN1bHQ7Ci0gICAgaW50IG5SZXN1bHQ7Ci0gICAgaW50IG5MaW5lOwotICAgIGludCBuU3Vic3Q7Ci0gICAgaW50IG5NYXRjaDsKLSAgICBjaGFyICpjcEk7Ci0gICAgY2hhciAqY3BPOwotICAgIGNoYXIgKmNwOwotICAgIGludCBpOwotCi0gICAgLyoKLSAgICAgKiBQYXNzIDE6IGZpbmQgc3Vic3RpdHV0aW9uIGxvY2F0aW9ucyBhbmQgY2FsY3VsYXRlIHNpemVzCi0gICAgICovCi0gICAgbkxpbmUgID0gc3RybGVuKGNwTGluZSk7Ci0gICAgbk1hdGNoID0gc3RybGVuKGNwTWF0Y2gpOwotICAgIG5TdWJzdCA9IHN0cmxlbihjcFN1YnN0KTsKLSAgICBmb3IgKGNwSSA9IChjaGFyICopY3BMaW5lLCBpID0gMCwgblJlc3VsdCA9IDA7Ci0gICAgICAgICBjcEkgPCBjcExpbmUrbkxpbmUgJiYgaSA8IE1BWF9QVFhUU1VCOyAgICApIHsKLSAgICAgICAgaWYgKChjcCA9IHN0cnN0cihjcEksIGNwTWF0Y2gpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjcHBNYXRjaFtpKytdID0gY3A7Ci0gICAgICAgICAgICBuUmVzdWx0ICs9ICgoY3AtY3BJKStuU3Vic3QpOwotICAgICAgICAgICAgY3BJID0gKGNwK25NYXRjaCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBuUmVzdWx0ICs9IHN0cmxlbihjcEkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgY3BwTWF0Y2hbaV0gPSBOVUxMOwotICAgIGlmIChpID09IDApCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgLyoKLSAgICAgKiBQYXNzIDI6IGFsbG9jYXRlIG1lbW9yeSBhbmQgYXNzZW1ibGUgcmVzdWx0Ci0gICAgICovCi0gICAgY3BSZXN1bHQgPSBhcF9wY2FsbG9jKHAsIG5SZXN1bHQrMSk7Ci0gICAgZm9yIChjcEkgPSAoY2hhciAqKWNwTGluZSwgY3BPID0gY3BSZXN1bHQsIGkgPSAwOyBjcHBNYXRjaFtpXSAhPSBOVUxMOyBpKyspIHsKLSAgICAgICAgYXBfY3B5c3RybihjcE8sIGNwSSwgY3BwTWF0Y2hbaV0tY3BJKzEpOwotICAgICAgICBjcE8gKz0gKGNwcE1hdGNoW2ldLWNwSSk7Ci0gICAgICAgIGFwX2NweXN0cm4oY3BPLCBjcFN1YnN0LCBuU3Vic3QrMSk7Ci0gICAgICAgIGNwTyArPSBuU3Vic3Q7Ci0gICAgICAgIGNwSSA9IChjcHBNYXRjaFtpXStuTWF0Y2gpOwotICAgIH0KLSAgICBhcF9jcHlzdHJuKGNwTywgY3BJLCBjcFJlc3VsdCtuUmVzdWx0LWNwTysxKTsKLQotICAgIHJldHVybiBjcFJlc3VsdDsKLX0KLQotLyogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogIFNwZWNpYWwgRnVuY3Rpb25zIGZvciBXaW4zMi9PcGVuU1NMCi0qKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSovCi0KLSNpZmRlZiBXSU4zMgotc3RhdGljIEhBTkRMRSBsb2NrX2NzW0NSWVBUT19OVU1fTE9DS1NdOwotCi1zdGF0aWMgdm9pZCB3aW4zMl9sb2NraW5nX2NhbGxiYWNrKGludCBtb2RlLCBpbnQgdHlwZSwgY2hhciogZmlsZSwgaW50IGxpbmUpCi17Ci0gICAgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykKLSAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdChsb2NrX2NzW3R5cGVdLCBJTkZJTklURSk7Ci0gICAgZWxzZQotICAgICAgICBSZWxlYXNlTXV0ZXgobG9ja19jc1t0eXBlXSk7Ci0gICAgcmV0dXJuOwotfQotI2VuZGlmIC8qIFdJTjMyICovCi0KLXZvaWQgc3NsX3V0aWxfdGhyZWFkX3NldHVwKHZvaWQpCi17Ci0jaWZkZWYgV0lOMzIKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBDUllQVE9fTlVNX0xPQ0tTOyBpKyspCi0gICAgICAgIGxvY2tfY3NbaV0gPSBDcmVhdGVNdXRleChOVUxMLCBGQUxTRSwgTlVMTCk7Ci0gICAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKCh2b2lkKCopKGludCwgaW50LCBjb25zdCBjaGFyICosIGludCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbjMyX2xvY2tpbmdfY2FsbGJhY2spOwotI2VuZGlmIC8qIFdJTjMyICovCi0gICAgcmV0dXJuOwotfQotCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NzbC9zc2xfdXRpbF9zc2wuYyBiL21vZHVsZXMvc3NsL3NzbF91dGlsX3NzbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWY2YmQzLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvc3NsL3NzbF91dGlsX3NzbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQ0ICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgIF8gICAgICAgICAgICAgXwotKiogIF8gX18gX19fICAgX19fICAgX198IHwgICAgX19fIF9fX3wgfCAgbW9kX3NzbAotKiogfCAnXyBgIF8gXCAvIF8gXCAvIF9gIHwgICAvIF9fLyBfX3wgfCAgQXBhY2hlIEludGVyZmFjZSB0byBPcGVuU1NMCi0qKiB8IHwgfCB8IHwgfCAoXykgfCAoX3wgfCAgIFxfXyBcX18gXCB8ICB3d3cubW9kc3NsLm9yZwotKiogfF98IHxffCB8X3xcX19fLyBcX18sX3xfX198X19fL19fXy9ffCAgZnRwLm1vZHNzbC5vcmcKLSoqICAgICAgICAgICAgICAgICAgICAgIHxfX19fX3wKLSoqICBzc2xfdXRpbF9zc2wuYwotKiogIEFkZGl0aW9uYWwgVXRpbGl0eSBGdW5jdGlvbnMgZm9yIE9wZW5TU0wKLSovCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBSYWxmIFMuIEVuZ2Vsc2NoYWxsLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICogICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotICogICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+IGZvciB1c2UgaW4gdGhlCi0gKiAgICAgbW9kX3NzbCBwcm9qZWN0IChodHRwOi8vd3d3Lm1vZHNzbC5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJtb2Rfc3NsIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICogICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgcnNlQGVuZ2Vsc2NoYWxsLmNvbS4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAibW9kX3NzbCIKLSAqICAgIG5vciBtYXkgIm1vZF9zc2wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yCi0gKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgUmFsZiBTLiBFbmdlbHNjaGFsbC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci0gKiAgICAgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGVuZ2Vsc2NoYWxsLmNvbT4gZm9yIHVzZSBpbiB0aGUKLSAqICAgICBtb2Rfc3NsIHByb2plY3QgKGh0dHA6Ly93d3cubW9kc3NsLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFJBTEYgUy4gRU5HRUxTQ0hBTEwgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFJBTEYgUy4gRU5HRUxTQ0hBTEwgT1IKLSAqIEhJUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotCi0jaW5jbHVkZSAibW9kX3NzbC5oIgotCi0KLS8qICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICBBZGRpdGlvbmFsIEhpZ2gtTGV2ZWwgRnVuY3Rpb25zIGZvciBPcGVuU1NMCi0qKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSovCi0KLWludCBTU0xfZ2V0X2FwcF9kYXRhMl9pZHgodm9pZCkKLXsKLSAgIHN0YXRpYyBpbnQgYXBwX2RhdGEyX2lkeCA9IC0xOwotCi0gICBpZiAoYXBwX2RhdGEyX2lkeCA8IDApIHsKLSAgICAgIGFwcF9kYXRhMl9pZHggPSBTU0xfZ2V0X2V4X25ld19pbmRleCgwLAotICAgICAgICAgICAiU2Vjb25kIEFwcGxpY2F0aW9uIERhdGEgZm9yIFNTTCIsIE5VTEwsIE5VTEwsIE5VTEwpOwotICAgICAgYXBwX2RhdGEyX2lkeCA9IFNTTF9nZXRfZXhfbmV3X2luZGV4KDAsCi0gICAgICAgICAgICJTZWNvbmQgQXBwbGljYXRpb24gRGF0YSBmb3IgU1NMIiwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0gICB9Ci0gICByZXR1cm4oYXBwX2RhdGEyX2lkeCk7Ci19Ci0KLXZvaWQgKlNTTF9nZXRfYXBwX2RhdGEyKFNTTCAqc3NsKQotewotICAgIHJldHVybiAodm9pZCAqKVNTTF9nZXRfZXhfZGF0YShzc2wsIFNTTF9nZXRfYXBwX2RhdGEyX2lkeCgpKTsKLX0KLQotdm9pZCBTU0xfc2V0X2FwcF9kYXRhMihTU0wgKnNzbCwgdm9pZCAqYXJnKQotewotICAgIFNTTF9zZXRfZXhfZGF0YShzc2wsIFNTTF9nZXRfYXBwX2RhdGEyX2lkeCgpLCAoY2hhciAqKWFyZyk7Ci0gICAgcmV0dXJuOwotfQotCi0vKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgSGlnaC1MZXZlbCBDZXJ0aWZpY2F0ZSAvIFByaXZhdGUgS2V5IExvYWRpbmcKLSoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKi8KLQotWDUwOSAqU1NMX3JlYWRfWDUwOShGSUxFICpmcCwgWDUwOSAqKng1MDksIGludCAoKmNiKSgpKQotewotICAgIFg1MDkgKnJjOwotICAgIEJJTyAqYmlvUzsKLSAgICBCSU8gKmJpb0Y7Ci0KLSAgICAvKiAxLiB0cnkgUEVNICg9IERFUitCYXNlNjQraGVhZGVycykgKi8KLSNpZiBTU0xfTElCUkFSWV9WRVJTSU9OIDwgMHgwMDkwNDAwMAotICAgIHJjID0gUEVNX3JlYWRfWDUwOShmcCwgeDUwOSwgY2IpOwotI2Vsc2UKLSAgICByYyA9IFBFTV9yZWFkX1g1MDkoZnAsIHg1MDksIGNiLCBOVUxMKTsKLSNlbmRpZgotICAgIGlmIChyYyA9PSBOVUxMKSB7Ci0gICAgICAgIC8qIDIuIHRyeSBERVIrQmFzZTY0ICovCi0gICAgICAgIGZzZWVrKGZwLCAwTCwgU0VFS19TRVQpOwotICAgICAgICBpZiAoKGJpb1MgPSBCSU9fbmV3KEJJT19zX2ZkKCkpKSA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIEJJT19zZXRfZmQoYmlvUywgZmlsZW5vKGZwKSwgQklPX05PQ0xPU0UpOwotICAgICAgICBpZiAoKGJpb0YgPSBCSU9fbmV3KEJJT19mX2Jhc2U2NCgpKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgQklPX2ZyZWUoYmlvUyk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBiaW9TID0gQklPX3B1c2goYmlvRiwgYmlvUyk7Ci0gICAgICAgIHJjID0gZDJpX1g1MDlfYmlvKGJpb1MsIE5VTEwpOwotICAgICAgICBCSU9fZnJlZV9hbGwoYmlvUyk7Ci0gICAgICAgIGlmIChyYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAvKiAzLiB0cnkgcGxhaW4gREVSICovCi0gICAgICAgICAgICBmc2VlayhmcCwgMEwsIFNFRUtfU0VUKTsKLSAgICAgICAgICAgIGlmICgoYmlvUyA9IEJJT19uZXcoQklPX3NfZmQoKSkpID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICBCSU9fc2V0X2ZkKGJpb1MsIGZpbGVubyhmcCksIEJJT19OT0NMT1NFKTsKLSAgICAgICAgICAgIHJjID0gZDJpX1g1MDlfYmlvKGJpb1MsIE5VTEwpOwotICAgICAgICAgICAgQklPX2ZyZWUoYmlvUyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHJjICE9IE5VTEwgJiYgeDUwOSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICgqeDUwOSAhPSBOVUxMKQotICAgICAgICAgICAgWDUwOV9mcmVlKCp4NTA5KTsKLSAgICAgICAgKng1MDkgPSByYzsKLSAgICB9Ci0gICAgcmV0dXJuIHJjOwotfQotCi0jaWYgU1NMX0xJQlJBUllfVkVSU0lPTiA8PSAweDAwOTA0MTAwCi1zdGF0aWMgRVZQX1BLRVkgKmQyaV9Qcml2YXRlS2V5X2JpbyhCSU8gKmJpbywgRVZQX1BLRVkgKiprZXkpCi17Ci0gICAgIHJldHVybiAoKEVWUF9QS0VZICopQVNOMV9kMmlfYmlvKAotICAgICAgICAgICAgIChjaGFyICooKikoKSlFVlBfUEtFWV9uZXcsIAotICAgICAgICAgICAgIChjaGFyICooKikoKSlkMmlfUHJpdmF0ZUtleSwgCi0gICAgICAgICAgICAgKGJpbyksICh1bnNpZ25lZCBjaGFyICoqKShrZXkpKSk7Ci19Ci0jZW5kaWYKLQotRVZQX1BLRVkgKlNTTF9yZWFkX1ByaXZhdGVLZXkoRklMRSAqZnAsIEVWUF9QS0VZICoqa2V5LCBpbnQgKCpjYikoKSkKLXsKLSAgICBFVlBfUEtFWSAqcmM7Ci0gICAgQklPICpiaW9TOwotICAgIEJJTyAqYmlvRjsKLQotICAgIC8qIDEuIHRyeSBQRU0gKD0gREVSK0Jhc2U2NCtoZWFkZXJzKSAqLwotI2lmIFNTTF9MSUJSQVJZX1ZFUlNJT04gPCAweDAwOTA0MDAwCi0gICAgcmMgPSBQRU1fcmVhZF9Qcml2YXRlS2V5KGZwLCBrZXksIGNiKTsKLSNlbHNlCi0gICAgcmMgPSBQRU1fcmVhZF9Qcml2YXRlS2V5KGZwLCBrZXksIGNiLCBOVUxMKTsKLSNlbmRpZgotICAgIGlmIChyYyA9PSBOVUxMKSB7Ci0gICAgICAgIC8qIDIuIHRyeSBERVIrQmFzZTY0ICovCi0gICAgICAgIGZzZWVrKGZwLCAwTCwgU0VFS19TRVQpOwotICAgICAgICBpZiAoKGJpb1MgPSBCSU9fbmV3KEJJT19zX2ZkKCkpKSA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIEJJT19zZXRfZmQoYmlvUywgZmlsZW5vKGZwKSwgQklPX05PQ0xPU0UpOwotICAgICAgICBpZiAoKGJpb0YgPSBCSU9fbmV3KEJJT19mX2Jhc2U2NCgpKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgQklPX2ZyZWUoYmlvUyk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBiaW9TID0gQklPX3B1c2goYmlvRiwgYmlvUyk7Ci0gICAgICAgIHJjID0gZDJpX1ByaXZhdGVLZXlfYmlvKGJpb1MsIE5VTEwpOwotICAgICAgICBCSU9fZnJlZV9hbGwoYmlvUyk7Ci0gICAgICAgIGlmIChyYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAvKiAzLiB0cnkgcGxhaW4gREVSICovCi0gICAgICAgICAgICBmc2VlayhmcCwgMEwsIFNFRUtfU0VUKTsKLSAgICAgICAgICAgIGlmICgoYmlvUyA9IEJJT19uZXcoQklPX3NfZmQoKSkpID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICBCSU9fc2V0X2ZkKGJpb1MsIGZpbGVubyhmcCksIEJJT19OT0NMT1NFKTsKLSAgICAgICAgICAgIHJjID0gZDJpX1ByaXZhdGVLZXlfYmlvKGJpb1MsIE5VTEwpOwotICAgICAgICAgICAgQklPX2ZyZWUoYmlvUyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHJjICE9IE5VTEwgJiYga2V5ICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCprZXkgIT0gTlVMTCkKLSAgICAgICAgICAgIEVWUF9QS0VZX2ZyZWUoKmtleSk7Ci0gICAgICAgICprZXkgPSByYzsKLSAgICB9Ci0gICAgcmV0dXJuIHJjOwotfQotCi0vKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgU21hcnQgc2h1dGRvd24KLSoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKi8KLQotaW50IFNTTF9zbWFydF9zaHV0ZG93bihTU0wgKnNzbCkKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgcmM7Ci0KLSAgICAvKgotICAgICAqIFJlcGVhdCB0aGUgY2FsbHMsIGJlY2F1c2UgU1NMX3NodXRkb3duIGludGVybmFsbHkgZGlzcGF0Y2hlcyB0aHJvdWdoIGEKLSAgICAgKiBsaXR0bGUgc3RhdGUgbWFjaGluZS4gVXN1YWxseSBvbmx5IG9uZSBvciB0d28gaW50ZXJhdGlvbiBzaG91bGQgYmUKLSAgICAgKiBuZWVkZWQsIHNvIHdlIHJlc3RyaWN0IHRoZSB0b3RhbCBudW1iZXIgb2YgcmVzdHJpY3Rpb25zIGluIG9yZGVyIHRvCi0gICAgICogYXZvaWQgcHJvY2VzcyBoYW5ncyBpbiBjYXNlIHRoZSBjbGllbnQgcGxheWVkIGJhZCB3aXRoIHRoZSBzb2NrZXQKLSAgICAgKiBjb25uZWN0aW9uIGFuZCBPcGVuU1NMIGNhbm5vdCByZWNvZ25pemUgaXQuCi0gICAgICovCi0gICAgcmMgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCA0IC8qIG1heCAyeCBwZW5kaW5nICsgMnggZGF0YSA9IDQgKi87IGkrKykgewotICAgICAgICBpZiAoKHJjID0gU1NMX3NodXRkb3duKHNzbCkpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiByYzsKLX0KLQotLyogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogIENlcnRpZmljYXRlIFJldm9jYXRpb24gTGlzdCAoQ1JMKSBTdG9yYWdlCi0qKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSovCi0KLVg1MDlfU1RPUkUgKlNTTF9YNTA5X1NUT1JFX2NyZWF0ZShjaGFyICpjcEZpbGUsIGNoYXIgKmNwUGF0aCkKLXsKLSAgICBYNTA5X1NUT1JFICpwU3RvcmU7Ci0gICAgWDUwOV9MT09LVVAgKnBMb29rdXA7Ci0KLSAgICBpZiAoY3BGaWxlID09IE5VTEwgJiYgY3BQYXRoID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmICgocFN0b3JlID0gWDUwOV9TVE9SRV9uZXcoKSkgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKGNwRmlsZSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICgocExvb2t1cCA9IFg1MDlfU1RPUkVfYWRkX2xvb2t1cChwU3RvcmUsIFg1MDlfTE9PS1VQX2ZpbGUoKSkpID09IE5VTEwpIHsKLSAgICAgICAgICAgIFg1MDlfU1RPUkVfZnJlZShwU3RvcmUpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgWDUwOV9MT09LVVBfbG9hZF9maWxlKHBMb29rdXAsIGNwRmlsZSwgWDUwOV9GSUxFVFlQRV9QRU0pOwotICAgIH0KLSAgICBpZiAoY3BQYXRoICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKChwTG9va3VwID0gWDUwOV9TVE9SRV9hZGRfbG9va3VwKHBTdG9yZSwgWDUwOV9MT09LVVBfaGFzaF9kaXIoKSkpID09IE5VTEwpIHsKLSAgICAgICAgICAgIFg1MDlfU1RPUkVfZnJlZShwU3RvcmUpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgWDUwOV9MT09LVVBfYWRkX2RpcihwTG9va3VwLCBjcFBhdGgsIFg1MDlfRklMRVRZUEVfUEVNKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBTdG9yZTsKLX0KLQotaW50IFNTTF9YNTA5X1NUT1JFX2xvb2t1cChYNTA5X1NUT1JFICpwU3RvcmUsIGludCBuVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV9OQU1FICpwTmFtZSwgWDUwOV9PQkpFQ1QgKnBPYmopCi17Ci0gICAgWDUwOV9TVE9SRV9DVFggcFN0b3JlQ3R4OwotICAgIGludCByYzsKLQotICAgIFg1MDlfU1RPUkVfQ1RYX2luaXQoJnBTdG9yZUN0eCwgcFN0b3JlLCBOVUxMLCBOVUxMKTsKLSAgICByYyA9IFg1MDlfU1RPUkVfZ2V0X2J5X3N1YmplY3QoJnBTdG9yZUN0eCwgblR5cGUsIHBOYW1lLCBwT2JqKTsKLSAgICBYNTA5X1NUT1JFX0NUWF9jbGVhbnVwKCZwU3RvcmVDdHgpOwotICAgIHJldHVybiByYzsKLX0KLQotLyogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogIENpcGhlciBTdWl0ZSBTcGVjIFN0cmluZyBDcmVhdGlvbgotKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qLwotCi1jaGFyICpTU0xfbWFrZV9jaXBoZXJzdWl0ZShwb29sICpwLCBTU0wgKnNzbCkKLXsKLSAgICBTVEFDS19PRihTU0xfQ0lQSEVSKSAqc2s7Ci0gICAgU1NMX0NJUEhFUiAqYzsKLSAgICBpbnQgaTsKLSAgICBpbnQgbDsKLSAgICBjaGFyICpjcENpcGhlclN1aXRlOwotICAgIGNoYXIgKmNwOwotCi0gICAgaWYgKHNzbCA9PSBOVUxMKSAKLSAgICAgICAgcmV0dXJuICIiOwotICAgIGlmICgoc2sgPSBTU0xfZ2V0X2NpcGhlcnMoc3NsKSkgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuICIiOwotICAgIGwgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBza19TU0xfQ0lQSEVSX251bShzayk7IGkrKykgewotICAgICAgICBjID0gc2tfU1NMX0NJUEhFUl92YWx1ZShzaywgaSk7Ci0gICAgICAgIGwgKz0gc3RybGVuKGMtPm5hbWUpKzIrMTsKLSAgICB9Ci0gICAgaWYgKGwgPT0gMCkKLSAgICAgICAgcmV0dXJuICIiOwotICAgIGNwQ2lwaGVyU3VpdGUgPSAoY2hhciAqKWFwX3BhbGxvYyhwLCBsKzEpOwotICAgIGNwID0gY3BDaXBoZXJTdWl0ZTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2tfU1NMX0NJUEhFUl9udW0oc2spOyBpKyspIHsKLSAgICAgICAgYyA9IHNrX1NTTF9DSVBIRVJfdmFsdWUoc2ssIGkpOwotICAgICAgICBsID0gc3RybGVuKGMtPm5hbWUpOwotICAgICAgICBtZW1jcHkoY3AsIGMtPm5hbWUsIGwpOwotICAgICAgICBjcCArPSBsOwotICAgICAgICAqY3ArKyA9ICcvJzsKLSAgICAgICAgKmNwKysgPSAoYy0+dmFsaWQgPT0gMSA/ICcxJyA6ICcwJyk7Ci0gICAgICAgICpjcCsrID0gJzonOwotICAgIH0KLSAgICAqKGNwLTEpID0gTlVMOwotICAgIHJldHVybiBjcENpcGhlclN1aXRlOwotfQotCi0vKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgQ2VydGlmaWNhdGUgQ2hlY2tzCi0qKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSovCi0KLS8qIGNoZWNrIHdoZXRoZXIgY2VydCBjb250YWlucyBleHRlbmRlZCBrZXkgdXNhZ2Ugd2l0aCBhIFNHQyB0YWcgKi8KLUJPT0wgU1NMX1g1MDlfaXNTR0MoWDUwOSAqY2VydCkKLXsKLSAgICBYNTA5X0VYVEVOU0lPTiAqZXh0OwotICAgIGludCBleHRfbmlkOwotICAgIFNUQUNLICpzazsKLSAgICBCT09MIGlzX3NnYzsKLSAgICBpbnQgaWR4OwotICAgIGludCBpOwotICAgIAotICAgIGlzX3NnYyA9IEZBTFNFOwotICAgIGlkeCA9IFg1MDlfZ2V0X2V4dF9ieV9OSUQoY2VydCwgTklEX2V4dF9rZXlfdXNhZ2UsIC0xKTsKLSAgICBpZiAoaWR4ID49IDApIHsKLSAgICAgICAgZXh0ID0gWDUwOV9nZXRfZXh0KGNlcnQsIGlkeCk7Ci0gICAgICAgIGlmICgoc2sgPSAoU1RBQ0sgKilYNTA5VjNfRVhUX2QyaShleHQpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2tfbnVtKHNrKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZXh0X25pZCA9IE9CSl9vYmoybmlkKChBU04xX09CSkVDVCAqKXNrX3ZhbHVlKHNrLCBpKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGV4dF9uaWQgPT0gTklEX21zX3NnYyB8fCBleHRfbmlkID09IE5JRF9uc19zZ2MpIHsKLSAgICAgICAgICAgICAgICAgICAgaXNfc2djID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpc19zZ2M7Ci19Ci0KLS8qIHJldHJpZXZlIGJhc2ljIGNvbnN0cmFpbnRzIGluZ3JlZGllbnRzICovCi1CT09MIFNTTF9YNTA5X2dldEJDKFg1MDkgKmNlcnQsIGludCAqY2EsIGludCAqcGF0aGxlbikKLXsKLSAgICBYNTA5X0VYVEVOU0lPTiAqZXh0OwotICAgIEJBU0lDX0NPTlNUUkFJTlRTICpiYzsKLSAgICBpbnQgaWR4OwotICAgIEJJR05VTSAqYm4gPSBOVUxMOwotICAgIGNoYXIgKmNwOwotICAgIAotICAgIGlmICgoaWR4ID0gWDUwOV9nZXRfZXh0X2J5X05JRChjZXJ0LCBOSURfYmFzaWNfY29uc3RyYWludHMsIC0xKSkgPCAwKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgZXh0ID0gWDUwOV9nZXRfZXh0KGNlcnQsIGlkeCk7Ci0gICAgaWYgKGV4dCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKChiYyA9IChCQVNJQ19DT05TVFJBSU5UUyAqKVg1MDlWM19FWFRfZDJpKGV4dCkpID09IE5VTEwpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAqY2EgPSBiYy0+Y2E7Ci0gICAgKnBhdGhsZW4gPSAtMSAvKiB1bmxpbWl0ZWQgKi87Ci0gICAgaWYgKGJjLT5wYXRobGVuICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKChibiA9IEFTTjFfSU5URUdFUl90b19CTihiYy0+cGF0aGxlbiwgTlVMTCkpID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICgoY3AgPSBCTl9ibjJkZWMoYm4pKSA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAqcGF0aGxlbiA9IGF0b2koY3ApOwotICAgICAgICBmcmVlKGNwKTsKLSAgICAgICAgQk5fZnJlZShibik7Ci0gICAgfQotICAgIEJBU0lDX0NPTlNUUkFJTlRTX2ZyZWUoYmMpOwotICAgIHJldHVybiBUUlVFOwotfQotCi0vKiByZXRyaWV2ZSBzdWJqZWN0IENvbW1vbk5hbWUgb2YgY2VydGlmaWNhdGUgKi8KLUJPT0wgU1NMX1g1MDlfZ2V0Q04ocG9vbCAqcCwgWDUwOSAqeHMsIGNoYXIgKipjcHBDTikKLXsKLSAgICBYNTA5X05BTUUgKnhzbjsKLSAgICBYNTA5X05BTUVfRU5UUlkgKnhzbmU7Ci0gICAgaW50IGksIG5pZDsKLQotICAgIHhzbiA9IFg1MDlfZ2V0X3N1YmplY3RfbmFtZSh4cyk7Ci0gICAgZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfTkFNRV9FTlRSWV9udW0oeHNuLT5lbnRyaWVzKTsgaSsrKSB7Ci0gICAgICAgIHhzbmUgPSBza19YNTA5X05BTUVfRU5UUllfdmFsdWUoeHNuLT5lbnRyaWVzLCBpKTsKLSAgICAgICAgbmlkID0gT0JKX29iajJuaWQoeHNuZS0+b2JqZWN0KTsKLSAgICAgICAgaWYgKG5pZCA9PSBOSURfY29tbW9uTmFtZSkgewotICAgICAgICAgICAgKmNwcENOID0gYXBfcGFsbG9jKHAsIHhzbmUtPnZhbHVlLT5sZW5ndGgrMSk7Ci0gICAgICAgICAgICBhcF9jcHlzdHJuKCpjcHBDTiwgKGNoYXIgKil4c25lLT52YWx1ZS0+ZGF0YSwgeHNuZS0+dmFsdWUtPmxlbmd0aCsxKTsKLSAgICAgICAgICAgICgqY3BwQ04pW3hzbmUtPnZhbHVlLT5sZW5ndGhdID0gTlVMOwotI2lmZGVmIENIQVJTRVRfRUJDRElDCi0gICAgICAgICAgICBhc2NpaTJlYmNkaWMoKmNwcENOLCAqY3BwQ04sIHN0cmxlbigqY3BwQ04pKTsKLSNlbmRpZgotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotCi0vKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgTG93LUxldmVsIENBIENlcnRpZmljYXRlIExvYWRpbmcKLSoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKi8KLQotI2lmZGVmIFNTTF9FWFBFUklNRU5UQUxfUFJPWFkKLQotQk9PTCBTU0xfbG9hZF9DcnRBbmRLZXlJbmZvX2ZpbGUocG9vbCAqcCwgU1RBQ0tfT0YoWDUwOV9JTkZPKSAqc2ssIGNoYXIgKmZpbGVuYW1lKQotewotICAgIEJJTyAqaW47Ci0KLSAgICBpZiAoKGluID0gQklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKEJJT19yZWFkX2ZpbGVuYW1lKGluLCBmaWxlbmFtZSkgPD0gMCkgewotICAgICAgICBCSU9fZnJlZShpbik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRVJSX2NsZWFyX2Vycm9yKCk7Ci0jaWYgU1NMX0xJQlJBUllfVkVSU0lPTiA8IDB4MDA5MDQwMDAKLSAgICBQRU1fWDUwOV9JTkZPX3JlYWRfYmlvKGluLCBzaywgTlVMTCk7Ci0jZWxzZQotICAgIFBFTV9YNTA5X0lORk9fcmVhZF9iaW8oaW4sIHNrLCBOVUxMLCBOVUxMKTsKLSNlbmRpZgotICAgIEJJT19mcmVlKGluKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotQk9PTCBTU0xfbG9hZF9DcnRBbmRLZXlJbmZvX3BhdGgocG9vbCAqcCwgU1RBQ0tfT0YoWDUwOV9JTkZPKSAqc2ssIGNoYXIgKnBhdGhuYW1lKQotewotICAgIHN0cnVjdCBzdGF0IHN0OwotICAgIERJUiAqZGlyOwotICAgIHBvb2wgKnNwOwotICAgIHN0cnVjdCBkaXJlbnQgKm5leHRlbnQ7Ci0gICAgY2hhciAqZnVsbG5hbWU7Ci0gICAgQk9PTCBvazsKLQotICAgIHNwID0gYXBfbWFrZV9zdWJfcG9vbChwKTsKLSAgICBpZiAoKGRpciA9IGFwX3BvcGVuZGlyKHNwLCBwYXRobmFtZSkpID09IE5VTEwpIHsKLSAgICAgICAgYXBfZGVzdHJveV9wb29sKHNwKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBvayA9IEZBTFNFOwotICAgIHdoaWxlICgobmV4dGVudCA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgewotICAgICAgICBmdWxsbmFtZSA9IGFwX3BzdHJjYXQoc3AsIHBhdGhuYW1lLCAiLyIsIG5leHRlbnQtPmRfbmFtZSwgTlVMTCk7Ci0gICAgICAgIGlmIChzdGF0KGZ1bGxuYW1lLCAmc3QpICE9IDApCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKCFTX0lTUkVHKHN0LnN0X21vZGUpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChTU0xfbG9hZF9DcnRBbmRLZXlJbmZvX2ZpbGUoc3AsIHNrLCBmdWxsbmFtZSkpCi0gICAgICAgICAgICBvayA9IFRSVUU7Ci0gICAgfQotICAgIGFwX3BjbG9zZWRpcihwLCBkaXIpOwotICAgIGFwX2Rlc3Ryb3lfcG9vbChzcCk7Ci0gICAgcmV0dXJuIG9rOwotfSAgICAgICAgICAgICAgCi0KLSNlbmRpZiAvKiBTU0xfRVhQRVJJTUVOVEFMX1BST1hZICovCi0KLS8qICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICBFeHRyYSBTZXJ2ZXIgQ2VydGlmaWNhdGUgQ2hhaW4gU3VwcG9ydAotKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qLwotCi0vKiAKLSAqIFJlYWQgYSBmaWxlIHRoYXQgb3B0aW9uYWxseSBjb250YWlucyB0aGUgc2VydmVyIGNlcnRpZmljYXRlIGluIFBFTQotICogZm9ybWF0LCBwb3NzaWJseSBmb2xsb3dlZCBieSBhIHNlcXVlbmNlIG9mIENBIGNlcnRpZmljYXRlcyB0aGF0Ci0gKiBzaG91bGQgYmUgc2VudCB0byB0aGUgcGVlciBpbiB0aGUgU1NMIENlcnRpZmljYXRlIG1lc3NhZ2UuCi0gKi8KLWludCBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbigKLSAgICBTU0xfQ1RYICpjdHgsIGNoYXIgKmZpbGUsIGludCBza2lwZmlyc3QsIGludCAoKmNiKSgpKQotewotICAgIEJJTyAqYmlvOwotICAgIFg1MDkgKng1MDk7Ci0gICAgdW5zaWduZWQgbG9uZyBlcnI7Ci0gICAgaW50IG47Ci0KLSAgICBpZiAoKGJpbyA9IEJJT19uZXcoQklPX3NfZmlsZV9pbnRlcm5hbCgpKSkgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIGlmIChCSU9fcmVhZF9maWxlbmFtZShiaW8sIGZpbGUpIDw9IDApIHsKLSAgICAgICAgQklPX2ZyZWUoYmlvKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAvKiBvcHRpb25hbGx5IHNraXAgYSBsZWFkaW5nIHNlcnZlciBjZXJ0aWZpY2F0ZSAqLwotICAgIGlmIChza2lwZmlyc3QpIHsKLSNpZiBTU0xfTElCUkFSWV9WRVJTSU9OIDwgMHgwMDkwNDAwMAotICAgICAgICBpZiAoKHg1MDkgPSBQRU1fcmVhZF9iaW9fWDUwOShiaW8sIE5VTEwsIGNiKSkgPT0gTlVMTCkgewotI2Vsc2UKLSAgICAgICAgaWYgKCh4NTA5ID0gUEVNX3JlYWRfYmlvX1g1MDkoYmlvLCBOVUxMLCBjYiwgTlVMTCkpID09IE5VTEwpIHsKLSNlbmRpZgotICAgICAgICAgICAgQklPX2ZyZWUoYmlvKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBYNTA5X2ZyZWUoeDUwOSk7Ci0gICAgfQotICAgIC8qIGZyZWUgYSBwZXJoYXBzIGFscmVhZHkgY29uZmlndXJlZCBleHRyYSBjaGFpbiAqLwotICAgIGlmIChjdHgtPmV4dHJhX2NlcnRzICE9IE5VTEwpIHsKLSAgICAgICAgc2tfWDUwOV9wb3BfZnJlZShjdHgtPmV4dHJhX2NlcnRzLCBYNTA5X2ZyZWUpOwotICAgICAgICBjdHgtPmV4dHJhX2NlcnRzID0gTlVMTDsKLSAgICB9Ci0gICAgLyogY3JlYXRlIG5ldyBleHRyYSBjaGFpbiBieSBsb2FkaW5nIHRoZSBjZXJ0cyAqLwotICAgIG4gPSAwOwotI2lmIFNTTF9MSUJSQVJZX1ZFUlNJT04gPCAweDAwOTA0MDAwCi0gICAgd2hpbGUgKCh4NTA5ID0gUEVNX3JlYWRfYmlvX1g1MDkoYmlvLCBOVUxMLCBjYikpICE9IE5VTEwpIHsKLSNlbHNlCi0gICAgd2hpbGUgKCh4NTA5ID0gUEVNX3JlYWRfYmlvX1g1MDkoYmlvLCBOVUxMLCBjYiwgTlVMTCkpICE9IE5VTEwpIHsKLSNlbmRpZgotICAgICAgICBpZiAoIVNTTF9DVFhfYWRkX2V4dHJhX2NoYWluX2NlcnQoY3R4LCB4NTA5KSkgeyAKLSAgICAgICAgICAgIFg1MDlfZnJlZSh4NTA5KTsKLSAgICAgICAgICAgIEJJT19mcmVlKGJpbyk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgbisrOwotICAgIH0KLSAgICAvKiBNYWtlIHN1cmUgdGhhdCBvbmx5IHRoZSBlcnJvciBpcyBqdXN0IGFuIEVPRiAqLwotICAgIGlmICgoZXJyID0gRVJSX3BlZWtfZXJyb3IoKSkgPiAwKSB7Ci0gICAgICAgIGlmICghKCAgIEVSUl9HRVRfTElCKGVycikgPT0gRVJSX0xJQl9QRU0gCi0gICAgICAgICAgICAgICYmIEVSUl9HRVRfUkVBU09OKGVycikgPT0gUEVNX1JfTk9fU1RBUlRfTElORSkpIHsKLSAgICAgICAgICAgIEJJT19mcmVlKGJpbyk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKEVSUl9nZXRfZXJyb3IoKSA+IDApIDsKLSAgICB9Ci0gICAgQklPX2ZyZWUoYmlvKTsKLSAgICByZXR1cm4gbjsKLX0KLQotLyogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogIFNlc3Npb24gU3R1ZmYKLSoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKi8KLQotY2hhciAqU1NMX1NFU1NJT05faWQyc3oodW5zaWduZWQgY2hhciAqaWQsIGludCBpZGxlbikKLXsKLSAgICBzdGF0aWMgY2hhciBzdHJbKFNTTF9NQVhfU1NMX1NFU1NJT05fSURfTEVOR1RIKzEpKjJdOwotICAgIGNoYXIgKmNwOwotICAgIGludCBuOwotCi0gICAgY3AgPSBzdHI7Ci0gICAgZm9yIChuID0gMDsgbiA8IGlkbGVuICYmIG4gPCBTU0xfTUFYX1NTTF9TRVNTSU9OX0lEX0xFTkdUSDsgbisrKSB7Ci0gICAgICAgIGFwX3NucHJpbnRmKGNwLCBzaXplb2Yoc3RyKS0oY3Atc3RyKSwgIiUwMlgiLCBpZFtuXSk7Ci0gICAgICAgIGNwICs9IDI7Ci0gICAgfQotICAgICpjcCA9IE5VTDsKLSAgICByZXR1cm4gc3RyOwotfQotCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NzbC9zc2xfdXRpbF9zc2wuaCBiL21vZHVsZXMvc3NsL3NzbF91dGlsX3NzbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2FhYWFhLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvc3NsL3NzbF91dGlsX3NzbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgIF8gICAgICAgICAgICAgXwotKiogIF8gX18gX19fICAgX19fICAgX198IHwgICAgX19fIF9fX3wgfCAgbW9kX3NzbAotKiogfCAnXyBgIF8gXCAvIF8gXCAvIF9gIHwgICAvIF9fLyBfX3wgfCAgQXBhY2hlIEludGVyZmFjZSB0byBPcGVuU1NMCi0qKiB8IHwgfCB8IHwgfCAoXykgfCAoX3wgfCAgIFxfXyBcX18gXCB8ICB3d3cubW9kc3NsLm9yZwotKiogfF98IHxffCB8X3xcX19fLyBcX18sX3xfX198X19fL19fXy9ffCAgZnRwLm1vZHNzbC5vcmcKLSoqICAgICAgICAgICAgICAgICAgICAgIHxfX19fX3wKLSoqICBzc2xfdXRpbF9zc2wuaAotKiogIEFkZGl0aW9uYWwgVXRpbGl0eSBGdW5jdGlvbnMgZm9yIE9wZW5TU0wKLSovCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBSYWxmIFMuIEVuZ2Vsc2NoYWxsLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICogICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotICogICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+IGZvciB1c2UgaW4gdGhlCi0gKiAgICAgbW9kX3NzbCBwcm9qZWN0IChodHRwOi8vd3d3Lm1vZHNzbC5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJtb2Rfc3NsIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICogICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgcnNlQGVuZ2Vsc2NoYWxsLmNvbS4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAibW9kX3NzbCIKLSAqICAgIG5vciBtYXkgIm1vZF9zc2wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yCi0gKiAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgUmFsZiBTLiBFbmdlbHNjaGFsbC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci0gKiAgICAgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGVuZ2Vsc2NoYWxsLmNvbT4gZm9yIHVzZSBpbiB0aGUKLSAqICAgICBtb2Rfc3NsIHByb2plY3QgKGh0dHA6Ly93d3cubW9kc3NsLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFJBTEYgUy4gRU5HRUxTQ0hBTEwgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFJBTEYgUy4gRU5HRUxTQ0hBTEwgT1IKLSAqIEhJUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotCi0jaWZuZGVmIFNTTF9VVElMX1NTTF9ICi0jZGVmaW5lIFNTTF9VVElMX1NTTF9ICi0KLS8qCi0gKiBEZXRlcm1pbmUgU1NMIGxpYnJhcnkgdmVyc2lvbiBudW1iZXIKLSAqLwotI2lmZGVmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIKLSNkZWZpbmUgU1NMX0xJQlJBUllfVkVSU0lPTiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSCi0jZGVmaW5lIFNTTF9MSUJSQVJZX05BTUUgICAgIk9wZW5TU0wiCi0jZGVmaW5lIFNTTF9MSUJSQVJZX1RFWFQgICAgT1BFTlNTTF9WRVJTSU9OX1RFWFQKLSNlbHNlCi0jZGVmaW5lIFNTTF9MSUJSQVJZX1ZFUlNJT04gMHgwMDAwCi0jZGVmaW5lIFNTTF9MSUJSQVJZX05BTUUgICAgIk90aGVyU1NMIgotI2RlZmluZSBTU0xfTElCUkFSWV9URVhUICAgICJPdGhlclNTTCAwLjAuMCAwMCBYWFggMDAwMCIKLSNlbmRpZgotCi0vKgotICogU3VwcG9ydCBmb3IgcmV0cmlldmluZy9vdmVycmlkaW5nIHN0YXRlcwotICovCi0jaWZuZGVmIFNTTF9nZXRfc3RhdGUKLSNkZWZpbmUgU1NMX2dldF9zdGF0ZShzc2wpIFNTTF9zdGF0ZShzc2wpCi0jZW5kaWYKLSNkZWZpbmUgU1NMX3NldF9zdGF0ZShzc2wsdmFsKSAoc3NsKS0+c3RhdGUgPSB2YWwKLQotLyoKLSAqICBNYXhpbXVtIGxlbmd0aCBvZiBhIERFUiBlbmNvZGVkIHNlc3Npb24uCi0gKiAgRklYTUU6IFRoZXJlIGlzIG5vIGRlZmluZSBpbiBPcGVuU1NMLCBidXQgT3BlblNTTCB1c2VzIDEwMjQqMTAsCi0gKiAgICAgICAgIHNvIHRoaXMgdmFsdWUgc2hvdWxkIGJlIG9rLiBBbHRob3VnaCB3ZSBoYXZlIG5vIHdhcm0gZmVlbGluZy4KLSAqLwotI2RlZmluZSBTU0xfU0VTU0lPTl9NQVhfREVSIDEwMjQqMTAKLQotLyogIAotICogIEFkZGl0aW9uYWwgRnVuY3Rpb25zCi0gKi8KLWludCAgICAgICAgIFNTTF9nZXRfYXBwX2RhdGEyX2lkeCh2b2lkKTsKLXZvaWQgICAgICAgKlNTTF9nZXRfYXBwX2RhdGEyKFNTTCAqKTsKLXZvaWQgICAgICAgIFNTTF9zZXRfYXBwX2RhdGEyKFNTTCAqLCB2b2lkICopOwotWDUwOSAgICAgICAqU1NMX3JlYWRfWDUwOShGSUxFICosIFg1MDkgKiosIGludCAoKikoKSk7Ci1FVlBfUEtFWSAgICpTU0xfcmVhZF9Qcml2YXRlS2V5KEZJTEUgKiwgRVZQX1BLRVkgKiosIGludCAoKikoKSk7Ci1pbnQgICAgICAgICBTU0xfc21hcnRfc2h1dGRvd24oU1NMICpzc2wpOwotWDUwOV9TVE9SRSAqU1NMX1g1MDlfU1RPUkVfY3JlYXRlKGNoYXIgKiwgY2hhciAqKTsKLWludCAgICAgICAgIFNTTF9YNTA5X1NUT1JFX2xvb2t1cChYNTA5X1NUT1JFICosIGludCwgWDUwOV9OQU1FICosIFg1MDlfT0JKRUNUICopOwotY2hhciAgICAgICAqU1NMX21ha2VfY2lwaGVyc3VpdGUocG9vbCAqLCBTU0wgKik7Ci1CT09MICAgICAgICBTU0xfWDUwOV9pc1NHQyhYNTA5ICopOwotQk9PTCAgICAgICAgU1NMX1g1MDlfZ2V0QkMoWDUwOSAqLCBpbnQgKiwgaW50ICopOwotQk9PTCAgICAgICAgU1NMX1g1MDlfZ2V0Q04ocG9vbCAqLCBYNTA5ICosIGNoYXIgKiopOwotI2lmZGVmIFNTTF9FWFBFUklNRU5UQUxfUFJPWFkKLUJPT0wgICAgICAgIFNTTF9sb2FkX0NydEFuZEtleUluZm9fZmlsZShwb29sICosIFNUQUNLX09GKFg1MDlfSU5GTykgKiwgY2hhciAqKTsKLUJPT0wgICAgICAgIFNTTF9sb2FkX0NydEFuZEtleUluZm9fcGF0aChwb29sICosIFNUQUNLX09GKFg1MDlfSU5GTykgKiwgY2hhciAqKTsKLSNlbmRpZiAvKiBTU0xfRVhQRVJJTUVOVEFMX1BST1hZICovCi1pbnQgICAgICAgICBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbihTU0xfQ1RYICosIGNoYXIgKiwgaW50LCBpbnQgKCopKCkpOwotY2hhciAgICAgICAqU1NMX1NFU1NJT05faWQyc3oodW5zaWduZWQgY2hhciAqLCBpbnQpOwotCi0jZW5kaWYgLyogU1NMX1VUSUxfU1NMX0ggKi8KZGlmZiAtLWdpdCBhL21vZHVsZXMvdGVzdC8uY3ZzaWdub3JlIGIvbW9kdWxlcy90ZXN0Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNGM2ZTMuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy90ZXN0Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLU1ha2VmaWxlCi0qLmxvCi0qLnNvCmRpZmYgLS1naXQgYS9tb2R1bGVzL3Rlc3QvLmluZGVudC5wcm8gYi9tb2R1bGVzL3Rlc3QvLmluZGVudC5wcm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZmJlOWYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy90ZXN0Ly5pbmRlbnQucHJvCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLWk0IC1ucHNsIC1kaTAgLWJyIC1uY2UgLWQwIC1jbGkwIC1ucGNzIC1uZmMxCi0tVEJVRkYKLS1URklMRQotLVRUUkFOUwotLVRVSU5UNAotLVRfdHJhbnMKLS1UYWxsb3dfb3B0aW9uc190Ci0tVGFwYWNoZV9zZmlvCi0tVGFycmF5X2hlYWRlcgotLVRib29sX2ludAotLVRidWZfYXJlYQotLVRidWZmX3N0cnVjdAotLVRidWZmeQotLVRjbWRfaG93Ci0tVGNtZF9wYXJtcwotLVRjb21tYW5kX3JlYwotLVRjb21tYW5kX3N0cnVjdAotLVRjb25uX3JlYwotLVRjb3JlX2Rpcl9jb25maWcKLS1UY29yZV9zZXJ2ZXJfY29uZmlnCi0tVGRpcl9tYWtlcl9mdW5jCi0tVGV2ZW50Ci0tVGdsb2JhbHNfcwotLVRoYW5kbGVyX2Z1bmMKLS1UaGFuZGxlcl9yZWMKLS1Uam9ibGlzdF9zCi0tVGxpc3Rlbl9yZWMKLS1UbWVyZ2VyX2Z1bmMKLS1UbW9kZV90Ci0tVG1vZHVsZQotLVRtb2R1bGVfc3RydWN0Ci0tVG11dGV4Ci0tVG5fbG9uZwotLVRvdGhlcl9jaGlsZF9yZWMKLS1Ub3ZlcnJpZGVzX3QKLS1UcGFyZW50X3Njb3JlCi0tVHBpZF90Ci0tVHBpcGVkX2xvZwotLVRwb29sCi0tVHJlcXVlc3RfcmVjCi0tVHJlcXVpcmVfbGluZQotLVRybGltX3QKLS1Uc2NvcmVib2FyZAotLVRzZW1hcGhvcmUKLS1Uc2VydmVyX2FkZHJfcmVjCi0tVHNlcnZlcl9yZWMKLS1Uc2VydmVyX3JlY19jaGFpbgotLVRzaG9ydF9zY29yZQotLVR0YWJsZQotLVR0YWJsZV9lbnRyeQotLVR0aHJlYWQKLS1UdV93aWRlX2ludAotLVR2dGltZV90Ci0tVHdpZGVfaW50CmRpZmYgLS1naXQgYS9tb2R1bGVzL3Rlc3QvTWFrZWZpbGUuaW4gYi9tb2R1bGVzL3Rlc3QvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNWMxNDkuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy90ZXN0L01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIGEgbW9kdWxlcyBNYWtlZmlsZSBoYXMgbm8gZXhwbGljaXQgdGFyZ2V0cyAtLSB0aGV5IHdpbGwgYmUgZGVmaW5lZCBieQotIyB3aGF0ZXZlciBtb2R1bGVzIGFyZSBlbmFibGVkLiBqdXN0IGdyYWIgc3BlY2lhbC5tayB0byBkZWFsIHdpdGggdGhpcy4KLWluY2x1ZGUgJCh0b3Bfc3JjZGlyKS9idWlsZC9zcGVjaWFsLm1rCmRpZmYgLS1naXQgYS9tb2R1bGVzL3Rlc3QvUkVBRE1FIGIvbW9kdWxlcy90ZXN0L1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxNzYzYy4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL3Rlc3QvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1UaGlzIGRpcmVjdG9yeSBpcyBpbnRlbmRlZCB0byBob3VzZSBtb2R1bGVzIHdoaWNoIGFyZSB1c2VkIGZvciB0ZXN0aW5nCi1zZXJ2ZXIgZnVuY3Rpb25hbGl0eS4gIFRoZXkncmUgdW5zdXBwb3J0ZWQsIGFuZCBub3QgZ3VhcmFudGVlZCB0byByZW1haW4KLWNvbnNpc3RhbnQgYmV0d2VlbiByZWxlYXNlcy4gIFlvdSdyZSBvbiB5b3VyIG93biBjb21wbGV0ZWx5IHdpdGggdGhlc2UuCmRpZmYgLS1naXQgYS9tb2R1bGVzL3Rlc3QvY29uZmlnLm00IGIvbW9kdWxlcy90ZXN0L2NvbmZpZy5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFiYzBmYS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL3Rlc3QvY29uZmlnLm00CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0KLUFQQUNIRV9NT0RQQVRIX0lOSVQodGVzdCkKLQotQVBBQ0hFX01PRFVMRShvcHRpb25hbF9ob29rX2V4cG9ydCwgZXhhbXBsZSBvcHRpb25hbCBob29rIGV4cG9ydGVyLCAsICwgbm8pCi1BUEFDSEVfTU9EVUxFKG9wdGlvbmFsX2hvb2tfaW1wb3J0LCBleGFtcGxlIG9wdGlvbmFsIGhvb2sgaW1wb3J0ZXIsICwgLCBubykKLUFQQUNIRV9NT0RVTEUob3B0aW9uYWxfZm5faW1wb3J0LCBleGFtcGxlIG9wdGlvbmFsIGZ1bmN0aW9uIGltcG9ydGVyLCAsICwgbm8pCi1BUEFDSEVfTU9EVUxFKG9wdGlvbmFsX2ZuX2V4cG9ydCwgZXhhbXBsZSBvcHRpb25hbCBmdW5jdGlvbiBleHBvcnRlciwgLCAsIG5vKQotCi1BUEFDSEVfTU9EUEFUSF9GSU5JU0gKZGlmZiAtLWdpdCBhL21vZHVsZXMvdGVzdC9tb2RfYnVja2V0ZWVyLmMgYi9tb2R1bGVzL3Rlc3QvbW9kX2J1Y2tldGVlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzdjODZhLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvdGVzdC9tb2RfYnVja2V0ZWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBiYXNlZCB1cG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUKLSAqICh6bGliIGZ1bmN0aW9ucyBnel9vcGVuIGFuZCBnendyaXRlKQotICovCi0KLS8qCi0gKiBtb2RfYnVja2V0ZWVyLmM6IHNwbGl0IGJ1Y2tldHMgd2hlbmV2ZXIgd2UgZmluZCBhIGNvbnRyb2wtY2hhcgotICoKLSAqIFdyaXR0ZW4gYnkgSWFuIEhvbHNtYW4gKElhbkhAYXBhY2hlLm9yZykKLSAqCi0gKi8KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImFwcl9zdHJpbmdzLmgiCi0jaW5jbHVkZSAiYXByX2dlbmVyYWwuaCIKLSNpbmNsdWRlICJ1dGlsX2ZpbHRlci5oIgotI2luY2x1ZGUgImFwcl9idWNrZXRzLmgiCi0jaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCi0KLQotc3RhdGljIGNvbnN0IGNoYXIgYnVja2V0ZWVyRmlsdGVyTmFtZVtdID0gIkJVQ0tFVEVFUiI7Ci1tb2R1bGUgQVBfTU9EVUxFX0RFQ0xBUkVfREFUQSBidWNrZXRlZXJfbW9kdWxlOwotCi10eXBlZGVmIHN0cnVjdCBidWNrZXRlZXJfZmlsdGVyX2NvbmZpZ190Ci17Ci0gICAgY2hhciBidWNrZXRkZWxpbXRlcjsKLSAgICBjaGFyIGZsdXNoZGVsaW1pdGVyOwotCi19IGJ1Y2tldGVlcl9maWx0ZXJfY29uZmlnX3Q7Ci0KLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9idWNrZXRlZXJfc2VydmVyX2NvbmZpZyhhcHJfcG9vbF90ICpwLCBzZXJ2ZXJfcmVjICpzKQotewotICAgIGJ1Y2tldGVlcl9maWx0ZXJfY29uZmlnX3QgKmMgPSBhcHJfcGNhbGxvYyhwLCBzaXplb2YgKmMpOwotCi0gICAgYy0+YnVja2V0ZGVsaW10ZXIgPSAweDAyOyAvKiBeQiAqLwotICAgIGMtPmZsdXNoZGVsaW1pdGVyID0gMHgwNjsgLyogXkYgKi8KLQotICAgIHJldHVybiBjOwotfQotCi0KLXR5cGVkZWYgc3RydWN0IGJ1Y2tldGVlcl9jdHhfdAotewotICAgIGFwcl9idWNrZXRfYnJpZ2FkZSAqYmI7Ci19IGJ1Y2tldGVlcl9jdHhfdDsKLQotc3RhdGljIGFwcl9zdGF0dXNfdCBidWNrZXRlZXJfb3V0X2ZpbHRlcihhcF9maWx0ZXJfdCAqZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcl9idWNrZXRfYnJpZ2FkZSAqYmIpCi17Ci0gICAgYXByX2J1Y2tldCAqZTsKLSAgICByZXF1ZXN0X3JlYyAqciA9IGYtPnI7Ci0gICAgYnVja2V0ZWVyX2N0eF90ICpjdHggPSBmLT5jdHg7Ci0gICAKLSAgICBidWNrZXRlZXJfZmlsdGVyX2NvbmZpZ190ICpjID0gYXBfZ2V0X21vZHVsZV9jb25maWcoci0+c2VydmVyLT5tb2R1bGVfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWNrZXRlZXJfbW9kdWxlKTsKLQotICAgIC8qIElmIHdlIGRvbid0IGhhdmUgYSBjb250ZXh0LCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IGl0IGlzIG9rYXkgdG8gc2VuZAotICAgICAqIHRoZSBkZWZsYXRlZCBjb250ZW50LiAgSWYgd2UgaGF2ZSBhIGNvbnRleHQsIHRoYXQgbWVhbnMgd2UndmUgZG9uZQotICAgICAqIHRoaXMgYmVmb3JlIGFuZCB3ZSBsaWtlZCBpdC4KLSAgICAgKiBUaGlzIGNvdWxkIGJlIG5vdCBzbyBuaWNlIGlmIHdlIGFsd2F5cyBmYWlsLiAgQnV0LCBpZiB3ZSBzdWNjZWVkLAotICAgICAqIHdlJ3JlIGluIGJldHRlciBzaGFwZS4KLSAgICAgKi8KLSAgICBpZiAoIWN0eCkgeyAgCi0gICAgICAgIGlmIChzdHJuY21wKHItPmNvbnRlbnRfdHlwZSwgInRleHQvIiwgNSkpIHsKLSAgICAgICAgICAgIGFwX3JlbW92ZV9vdXRwdXRfZmlsdGVyKGYpOwotICAgICAgICAgICAgcmV0dXJuIGFwX3Bhc3NfYnJpZ2FkZShmLT5uZXh0LCBiYik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBXZSdyZSBjb29sIHdpdGggZmlsdGVyaW5nIHRoaXMuICovCi0gICAgICAgIGN0eCA9IGYtPmN0eCA9IGFwcl9wY2FsbG9jKGYtPnItPnBvb2wsIHNpemVvZigqY3R4KSk7Ci0gICAgICAgIGN0eC0+YmIgPSBhcHJfYnJpZ2FkZV9jcmVhdGUoZi0+ci0+cG9vbCk7IAotICAgIH0KLQotICAgIEFQUl9CUklHQURFX0ZPUkVBQ0goZSwgYmIpIHsKLSAgICAgICAgY29uc3QgY2hhciAqZGF0YTsKLSAgICAgICAgYXByX3NpemVfdCBsZW47Ci0KLSAgICAgICAgaW50IGRvbmUgPSAwOwotICAgICAgICBhcHJfc2l6ZV90IGk7Ci0gICAgICAgIGFwcl9zaXplX3QgbGFzdHBvczsKLQotICAgICAgICBpZiAoQVBSX0JVQ0tFVF9JU19FT1MoZSkpIHsKLQotICAgICAgICAgICAgQVBSX0JVQ0tFVF9SRU1PVkUoZSk7Ci0gICAgICAgICAgICBBUFJfQlJJR0FERV9JTlNFUlRfVEFJTChjdHgtPmJiLCBlKTsKLQotICAgICAgICAgICAgLyogT2theSwgd2UndmUgc2VlbiB0aGUgRU9TLgotICAgICAgICAgICAgICogVGltZSB0byBwYXNzIGl0IGFsb25nIGRvd24gdGhlIGNoYWluLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICByZXR1cm4gYXBfcGFzc19icmlnYWRlKGYtPm5leHQsIGN0eC0+YmIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKEFQUl9CVUNLRVRfSVNfRkxVU0goZSkpIHsgICAgIAotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIElnbm9yZSBmbHVzaCBidWNrZXRzIGZvciB0aGUgbW9tZW50Li4gCi0gICAgICAgICAgICAgKiB3ZSBkZWNpZGUgd2hhdCB0byBzdHJlYW0KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiByZWFkICovCi0gICAgICAgIGFwcl9idWNrZXRfcmVhZChlLCAmZGF0YSwgJmxlbiwgQVBSX0JMT0NLX1JFQUQpOwotICAgICAgICBpZiAobGVuPjApIHsKLSAgICAgICAgICAgIGxhc3Rwb3M9MDsKLSAgICAgICAgICAgIGZvciAoaT0wOyBpPGxlbjtpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoIGRhdGFbaV0gPT0gYy0+Zmx1c2hkZWxpbWl0ZXIgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcl9idWNrZXQgKnA7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggaS1sYXN0cG9zPjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBhcHJfYnVja2V0X3Bvb2xfY3JlYXRlKGFwcl9wbWVtZHVwKCBmLT5yLT5wb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFbbGFzdHBvc10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLWxhc3Rwb3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGktbGFzdHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5yLT5wb29sKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFQUl9CUklHQURFX0lOU0VSVF9UQUlMKGN0eC0+YmIscCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbGFzdHBvcz1pKzE7Ci0KLSAgICAgICAgICAgICAgICAgICAgcCA9IGFwcl9idWNrZXRfZmx1c2hfY3JlYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIEFQUl9CUklHQURFX0lOU0VSVF9UQUlMKGN0eC0+YmIscCk7Ci0KLSAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVtpXSA9PSBjLT5idWNrZXRkZWxpbXRlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgYXByX2J1Y2tldCAqcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaS1sYXN0cG9zPjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gYXByX2J1Y2tldF9wb29sX2NyZWF0ZShhcHJfcG1lbWR1cCggZi0+ci0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVtsYXN0cG9zXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLWxhc3Rwb3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGktbGFzdHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5yLT5wb29sKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQUl9CUklHQURFX0lOU0VSVF9UQUlMKGN0eC0+YmIscCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0cG9zPWkrMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFhYWDogcmVhbGx5IHNob3VsZCBhcHBlbmQgdGhpcyB0byB0aGUgbmV4dCAncmVhbCcgYnVja2V0ICovCi0gICAgICAgICAgICBpZiAoIGxhc3Rwb3MgPCBpICkgewotICAgICAgICAgICAgICAgIGFwcl9idWNrZXQgKnA7Ci0gICAgICAgICAgICAgICAgcCA9IGFwcl9idWNrZXRfcG9vbF9jcmVhdGUoYXByX3BtZW1kdXAoIGYtPnItPnBvb2wsJmRhdGFbbGFzdHBvc10saS1sYXN0cG9zKSxpLWxhc3Rwb3MsZi0+ci0+cG9vbCk7Ci0gICAgICAgICAgICAgICAgbGFzdHBvcz1pOwotICAgICAgICAgICAgICAgIEFQUl9CUklHQURFX0lOU0VSVF9UQUlMKGN0eC0+YmIscCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gICAgIAotICAgIH0KLQotICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHZvaWQgcmVnaXN0ZXJfaG9va3MoYXByX3Bvb2xfdCAqIHApCi17Ci0gICAgYXBfcmVnaXN0ZXJfb3V0cHV0X2ZpbHRlcihidWNrZXRlZXJGaWx0ZXJOYW1lLCBidWNrZXRlZXJfb3V0X2ZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQX0ZUWVBFX0NPTlRFTlQtMSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBidWNrZXRlZXJfZmlsdGVyX2NtZHNbXSA9IHsKLSAgICB7TlVMTH0KLX07Ci0KLW1vZHVsZSBBUF9NT0RVTEVfREVDTEFSRV9EQVRBIGJ1Y2tldGVlcl9tb2R1bGUgPSB7Ci0gICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIGNyZWF0ZV9idWNrZXRlZXJfc2VydmVyX2NvbmZpZywKLSAgICBOVUxMLAotICAgIGJ1Y2tldGVlcl9maWx0ZXJfY21kcywKLSAgICByZWdpc3Rlcl9ob29rcwotfTsKZGlmZiAtLWdpdCBhL21vZHVsZXMvdGVzdC9tb2Rfb3B0aW9uYWxfZm5fZXhwb3J0LmMgYi9tb2R1bGVzL3Rlc3QvbW9kX29wdGlvbmFsX2ZuX2V4cG9ydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjE0YTM2Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvdGVzdC9tb2Rfb3B0aW9uYWxfZm5fZXhwb3J0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAibW9kX29wdGlvbmFsX2ZuX2V4cG9ydC5oIgotCi0vKiBUaGUgYWxlcnQgd2lsbCBub3RlIGEgc3RyYW5nZSBtaXJyb3ItaW1hZ2Ugc3R5bGUgcmVzZW1ibGFuY2UgdG8KLSAqIG1vZF9nZW5lcmljX2hvb2tfaW1wb3J0LmMuIFllcywgSSBfZGlkXyBtZWFuIGltcG9ydC4gVGhpbmsgYWJvdXQgaXQuCi0gKi8KLQotc3RhdGljIGludCBUZXN0T3B0aW9uYWxGbihjb25zdCBjaGFyICpzelN0cikKLXsKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSyxBUExPR19FUlIsT0ssTlVMTCwKLQkJICJPcHRpb25hbCBmdW5jdGlvbiB0ZXN0IHNhaWQ6ICVzIixzelN0cik7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyB2b2lkIEV4cG9ydFJlZ2lzdGVySG9va3MoYXByX3Bvb2xfdCAqcCkKLXsKLSAgICBBUFJfUkVHSVNURVJfT1BUSU9OQUxfRk4oVGVzdE9wdGlvbmFsRm4pOwotfQotCi1tb2R1bGUgb3B0aW9uYWxfZm5fZXhwb3J0X21vZHVsZT0KLXsKLSAgICBTVEFOREFSRDIwX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgRXhwb3J0UmVnaXN0ZXJIb29rcwotfTsKZGlmZiAtLWdpdCBhL21vZHVsZXMvdGVzdC9tb2Rfb3B0aW9uYWxfZm5fZXhwb3J0LmggYi9tb2R1bGVzL3Rlc3QvbW9kX29wdGlvbmFsX2ZuX2V4cG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDBjY2FiLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvdGVzdC9tb2Rfb3B0aW9uYWxfZm5fZXhwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNpbmNsdWRlICJhcHJfb3B0aW9uYWwuaCIKLQotQVBSX0RFQ0xBUkVfT1BUSU9OQUxfRk4oaW50LFRlc3RPcHRpb25hbEZuLChjb25zdCBjaGFyICopKQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy90ZXN0L21vZF9vcHRpb25hbF9mbl9pbXBvcnQuYyBiL21vZHVsZXMvdGVzdC9tb2Rfb3B0aW9uYWxfZm5faW1wb3J0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZDMxM2UuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy90ZXN0L21vZF9vcHRpb25hbF9mbl9pbXBvcnQuYworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAibW9kX29wdGlvbmFsX2ZuX2V4cG9ydC5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLQotLyogVGhlIGFsZXJ0IHdpbGwgbm90ZSBhIHN0cmFuZ2UgbWlycm9yLWltYWdlIHN0eWxlIHJlc2VtYmxhbmNlIHRvCi0gKiBtb2RfZ2VuZXJpY19ob29rX2V4cG9ydC5jLiBZZXMsIEkgX2RpZF8gbWVhbiBleHBvcnQuIFRoaW5rIGFib3V0IGl0LgotICovCi0KLXN0YXRpYyBBUFJfT1BUSU9OQUxfRk5fVFlQRShUZXN0T3B0aW9uYWxGbikgKnBmbjsKLQotc3RhdGljIGludCBJbXBvcnRMb2dUcmFuc2FjdGlvbihyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpZihwZm4pCi0JcmV0dXJuIHBmbihyLT50aGVfcmVxdWVzdCk7Ci0gICAgcmV0dXJuIERFQ0xJTkVEOwotfQotCi12b2lkIEltcG9ydEZuUmV0cmlldmUodm9pZCkKLXsKLSAgICBwZm49QVBSX1JFVFJJRVZFX09QVElPTkFMX0ZOKFRlc3RPcHRpb25hbEZuKTsKLX0KLQotc3RhdGljIHZvaWQgSW1wb3J0UmVnaXN0ZXJIb29rcyhhcHJfcG9vbF90ICpwKQotewotICAgIGFwX2hvb2tfbG9nX3RyYW5zYWN0aW9uKEltcG9ydExvZ1RyYW5zYWN0aW9uLE5VTEwsTlVMTCxBUFJfSE9PS19NSURETEUpOwotICAgIGFwX2hvb2tfb3B0aW9uYWxfZm5fcmV0cmlldmUoSW1wb3J0Rm5SZXRyaWV2ZSxOVUxMLE5VTEwsQVBSX0hPT0tfTUlERExFKTsKLX0KLQotbW9kdWxlIG9wdGlvbmFsX2ZuX2ltcG9ydF9tb2R1bGUgPQotewotICAgIFNUQU5EQVJEMjBfTU9EVUxFX1NUVUZGLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBJbXBvcnRSZWdpc3Rlckhvb2tzCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy90ZXN0L21vZF9vcHRpb25hbF9ob29rX2V4cG9ydC5jIGIvbW9kdWxlcy90ZXN0L21vZF9vcHRpb25hbF9ob29rX2V4cG9ydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGVmOTdiLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvdGVzdC9tb2Rfb3B0aW9uYWxfaG9va19leHBvcnQuYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJtb2Rfb3B0aW9uYWxfaG9va19leHBvcnQuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0KLUFQUl9JTVBMRU1FTlRfT1BUSU9OQUxfSE9PS19SVU5fQUxMKGFwLEFQX01PRFVMRSxpbnQsZ2VuZXJpY19ob29rX3Rlc3QsCi0JCQkJICAgIChjb25zdCBjaGFyICpzelN0ciksCi0JCQkJICAgIChzelN0ciksT0ssREVDTElORUQpCi0KLXN0YXRpYyBpbnQgRXhwb3J0TG9nVHJhbnNhY3Rpb24ocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgcmV0dXJuIGFwX3J1bl9nZW5lcmljX2hvb2tfdGVzdChyLT50aGVfcmVxdWVzdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIEV4cG9ydFJlZ2lzdGVySG9va3MoYXByX3Bvb2xfdCAqcCkKLXsKLSAgICBhcF9ob29rX2xvZ190cmFuc2FjdGlvbihFeHBvcnRMb2dUcmFuc2FjdGlvbixOVUxMLE5VTEwsQVBSX0hPT0tfTUlERExFKTsKLX0KLQotbW9kdWxlIG9wdGlvbmFsX2hvb2tfZXhwb3J0X21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIEV4cG9ydFJlZ2lzdGVySG9va3MKLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL3Rlc3QvbW9kX29wdGlvbmFsX2hvb2tfZXhwb3J0LmggYi9tb2R1bGVzL3Rlc3QvbW9kX29wdGlvbmFsX2hvb2tfZXhwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OTQwNzguLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy90ZXN0L21vZF9vcHRpb25hbF9ob29rX2V4cG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi0jaWZuZGVmIE1PRF9HRU5FUklDX0hPT0tfRVhQT1JUX0gKLSNkZWZpbmUgTU9EX0dFTkVSSUNfSE9PS19FWFBPUlRfSAotCi0jaW5jbHVkZSAiYXByX29wdGlvbmFsX2hvb2tzLmgiCi0KLUFQUl9ERUNMQVJFX0VYVEVSTkFMX0hPT0soYXAsQVBfTU9EVUxFLGludCxnZW5lcmljX2hvb2tfdGVzdCwoY29uc3QgY2hhciAqKSkKLQotI2VuZGlmIC8qIGRlZiBNT0RfR0VORVJJQ19IT09LX0VYUE9SVF9IICovCmRpZmYgLS1naXQgYS9tb2R1bGVzL3Rlc3QvbW9kX29wdGlvbmFsX2hvb2tfaW1wb3J0LmMgYi9tb2R1bGVzL3Rlc3QvbW9kX29wdGlvbmFsX2hvb2tfaW1wb3J0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZjAxNTguLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy90ZXN0L21vZF9vcHRpb25hbF9ob29rX2ltcG9ydC5jCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAibW9kX29wdGlvbmFsX2hvb2tfZXhwb3J0LmgiCi0KLXN0YXRpYyBpbnQgSW1wb3J0R2VuZXJpY0hvb2tUZXN0SG9vayhjb25zdCBjaGFyICpzelN0cikKLXsKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSyxBUExPR19FUlIsT0ssTlVMTCwiR2VuZXJpYyBob29rIHRlc3Qgc2FpZDogJXMiLAotCQkgc3pTdHIpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0aWMgdm9pZCBJbXBvcnRSZWdpc3Rlckhvb2tzKGFwcl9wb29sX3QgKnApCi17Ci0gICAgQVBSX09QVElPTkFMX0hPT0soYXAsZ2VuZXJpY19ob29rX3Rlc3QsSW1wb3J0R2VuZXJpY0hvb2tUZXN0SG9vayxOVUxMLE5VTEwsCi0JCSAgICAgIEFQUl9IT09LX01JRERMRSk7Ci19Ci0KLW1vZHVsZSBvcHRpb25hbF9ob29rX2ltcG9ydF9tb2R1bGU9Ci17Ci0gICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIEltcG9ydFJlZ2lzdGVySG9va3MKLX07CmRpZmYgLS1naXQgYS9vcy8uY3ZzaWdub3JlIGIvb3MvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNjN2E3Yy4uMDAwMDAwMAotLS0gYS9vcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotTWFrZWZpbGUKZGlmZiAtLWdpdCBhL29zLy5pbmRlbnQucHJvIGIvb3MvLmluZGVudC5wcm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZmJlOWYuLjAwMDAwMDAKLS0tIGEvb3MvLmluZGVudC5wcm8KKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0taTQgLW5wc2wgLWRpMCAtYnIgLW5jZSAtZDAgLWNsaTAgLW5wY3MgLW5mYzEKLS1UQlVGRgotLVRGSUxFCi0tVFRSQU5TCi0tVFVJTlQ0Ci0tVF90cmFucwotLVRhbGxvd19vcHRpb25zX3QKLS1UYXBhY2hlX3NmaW8KLS1UYXJyYXlfaGVhZGVyCi0tVGJvb2xfaW50Ci0tVGJ1Zl9hcmVhCi0tVGJ1ZmZfc3RydWN0Ci0tVGJ1ZmZ5Ci0tVGNtZF9ob3cKLS1UY21kX3Bhcm1zCi0tVGNvbW1hbmRfcmVjCi0tVGNvbW1hbmRfc3RydWN0Ci0tVGNvbm5fcmVjCi0tVGNvcmVfZGlyX2NvbmZpZwotLVRjb3JlX3NlcnZlcl9jb25maWcKLS1UZGlyX21ha2VyX2Z1bmMKLS1UZXZlbnQKLS1UZ2xvYmFsc19zCi0tVGhhbmRsZXJfZnVuYwotLVRoYW5kbGVyX3JlYwotLVRqb2JsaXN0X3MKLS1UbGlzdGVuX3JlYwotLVRtZXJnZXJfZnVuYwotLVRtb2RlX3QKLS1UbW9kdWxlCi0tVG1vZHVsZV9zdHJ1Y3QKLS1UbXV0ZXgKLS1Ubl9sb25nCi0tVG90aGVyX2NoaWxkX3JlYwotLVRvdmVycmlkZXNfdAotLVRwYXJlbnRfc2NvcmUKLS1UcGlkX3QKLS1UcGlwZWRfbG9nCi0tVHBvb2wKLS1UcmVxdWVzdF9yZWMKLS1UcmVxdWlyZV9saW5lCi0tVHJsaW1fdAotLVRzY29yZWJvYXJkCi0tVHNlbWFwaG9yZQotLVRzZXJ2ZXJfYWRkcl9yZWMKLS1Uc2VydmVyX3JlYwotLVRzZXJ2ZXJfcmVjX2NoYWluCi0tVHNob3J0X3Njb3JlCi0tVHRhYmxlCi0tVHRhYmxlX2VudHJ5Ci0tVHRocmVhZAotLVR1X3dpZGVfaW50Ci0tVHZ0aW1lX3QKLS1Ud2lkZV9pbnQKZGlmZiAtLWdpdCBhL29zL01ha2VmaWxlLmluIGIvb3MvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNjJjOTUuLjAwMDAwMDAKLS0tIGEvb3MvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLQotREVQVEggICAgID0gLi4KLXRvcHNyY2RpciA9IEB0b3BzcmNkaXJACi1zcmNkaXIgICAgPSBAc3JjZGlyQAotVlBBVEggICAgID0gQHNyY2RpckAKLQotU1VCRElSUyA9ICQoT1MpCi0KLWluY2x1ZGUgJCh0b3BzcmNkaXIpL2J1aWxkL3J1bGVzLm1rCmRpZmYgLS1naXQgYS9vcy9iZW9zLy5jdnNpZ25vcmUgYi9vcy9iZW9zLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYzhiYTAuLjAwMDAwMDAKLS0tIGEvb3MvYmVvcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1NYWtlZmlsZQotLmRlcHMKLS5saWJzCi0qLmxvCi0qLmxhCmRpZmYgLS1naXQgYS9vcy9iZW9zL01ha2VmaWxlLmluIGIvb3MvYmVvcy9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE4NjIxNC4uMDAwMDAwMAotLS0gYS9vcy9iZW9zL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCi1ERVBUSCAgICAgPSAuLi8uLgotdG9wc3JjZGlyID0gQHRvcHNyY2RpckAKLXNyY2RpciAgICA9IEBzcmNkaXJACi1WUEFUSCAgICAgPSBAc3JjZGlyQAotCi1MVExJQlJBUllfTkFNRSAgICA9IGxpYm9zLmxhCi1MVExJQlJBUllfU09VUkNFUyA9IG9zLmMgb3MtaW5saW5lLmMgYmVvc2QuYyBpb2xfc29ja2V0LmMKLQotaW5jbHVkZSAkKHRvcHNyY2RpcikvYnVpbGQvbHRsaWIubWsKZGlmZiAtLWdpdCBhL29zL2Jlb3MvYmVvc2QuYyBiL29zL2Jlb3MvYmVvc2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYzNjRjNi4uMDAwMDAwMAotLS0gYS9vcy9iZW9zL2Jlb3NkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAidW5peGQuaCIKLQotdW5peGRfY29uZmlnX3JlYyB1bml4ZF9jb25maWc7Ci0KLXZvaWQgdW5peGRfZGV0YWNoKHZvaWQpCi17Ci0gICAgaW50IHg7Ci0gICAgcGlkX3QgcGdycDsKLQotICAgIGNoZGlyKCIvIik7Ci0KLSAgICBpZiAoKHggPSBmb3JrKCkpID4gMCkKLQlleGl0KDApOwotICAgIGVsc2UgaWYgKHggPT0gLTEpIHsKLQlwZXJyb3IoImZvcmsiKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiVzOiB1bmFibGUgdG8gZm9yayBuZXcgcHJvY2Vzc1xuIiwgYXBfc2VydmVyX2FyZ3YwKTsKLQlleGl0KDEpOwotICAgIH0KLSAgICBSQUlTRV9TSUdTVE9QKERFVEFDSCk7Ci0KLSNpZm5kZWYgTk9fU0VUU0lECi0gICAgaWYgKChwZ3JwID0gc2V0c2lkKCkpID09IC0xKSB7Ci0JcGVycm9yKCJzZXRzaWQiKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBzZXRzaWQgZmFpbGVkXG4iLCBhcF9zZXJ2ZXJfYXJndjApOwotCWV4aXQoMSk7Ci0gICAgfQotI2Vsc2UKLSAgICBpZiAoKHBncnAgPSBzZXRwZ3JwKGdldHBpZCgpLCAwKSkgPT0gLTEpIHsKLQlwZXJyb3IoInNldHBncnAiKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBzZXRwZ3JwIGZhaWxlZFxuIiwgYXBfc2VydmVyX2FyZ3YwKTsKLQlleGl0KDEpOwotICAgIH0KLSNlbmRpZgotCi0gICAgLyogY2xvc2Ugb3V0IHRoZSBzdGFuZGFyZCBmaWxlIGRlc2NyaXB0b3JzICovCi0gICAgaWYgKGZyZW9wZW4oIi9kZXYvbnVsbCIsICJyIiwgc3RkaW4pID09IE5VTEwpIHsKLQlmcHJpbnRmKHN0ZGVyciwgIiVzOiB1bmFibGUgdG8gcmVwbGFjZSBzdGRpbiB3aXRoIC9kZXYvbnVsbDogJXNcbiIsCi0JCWFwX3NlcnZlcl9hcmd2MCwgc3RyZXJyb3IoZXJybm8pKTsKLQkvKiBjb250aW51ZSBhbnlob3cgLS0gbm90ZSB3ZSBjYW4ndCBjbG9zZSBvdXQgZGVzY3JpcHRvciAwIGJlY2F1c2Ugd2UKLQkgKiBoYXZlIG5vdGhpbmcgdG8gcmVwbGFjZSBpdCB3aXRoLCBhbmQgaWYgd2UgZGlkbid0IGhhdmUgYSBkZXNjcmlwdG9yCi0JICogMCB0aGUgbmV4dCBmaWxlIHdvdWxkIGJlIGNyZWF0ZWQgd2l0aCB0aGF0IHZhbHVlIC4uLiBsZWFkaW5nIHRvCi0JICogaGF2b2MuCi0JICovCi0gICAgfQotICAgIGlmIChmcmVvcGVuKCIvZGV2L251bGwiLCAidyIsIHN0ZG91dCkgPT0gTlVMTCkgewotCWZwcmludGYoc3RkZXJyLCAiJXM6IHVuYWJsZSB0byByZXBsYWNlIHN0ZG91dCB3aXRoIC9kZXYvbnVsbDogJXNcbiIsCi0JCWFwX3NlcnZlcl9hcmd2MCwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICB9Ci0gICAgLyogc3RkZXJyIGlzIGEgdHJpY2t5IG9uZSwgd2UgcmVhbGx5IHdhbnQgaXQgdG8gYmUgdGhlIGVycm9yX2xvZywKLSAgICAgKiBidXQgd2UgaGF2ZW4ndCBvcGVuZWQgdGhhdCB5ZXQuICBTbyBsZWF2ZSBpdCBhbG9uZSBmb3Igbm93IGFuZCBpdCdsbAotICAgICAqIGJlIHJlb3BlbmVkIG1vbWVudHMgbGF0ZXIuCi0gICAgICovCi19Ci0KLS8qIFNldCBncm91cCBwcml2aWxlZ2VzLgotICoKLSAqIE5vdGUgdGhhdCB3ZSB1c2UgdGhlIHVzZXJuYW1lIGFzIHNldCBpbiB0aGUgY29uZmlnIGZpbGVzLCByYXRoZXIgdGhhbgotICogdGhlIGxvb2t1cCBvZiB0byB1aWQgLS0tIHRoZSBzYW1lIHVpZCBtYXkgaGF2ZSBtdWx0aXBsZSBwYXNzd2QgZW50cmllcywKLSAqIHdpdGggZGlmZmVyZW50IHNldHMgb2YgZ3JvdXBzIGZvciBlYWNoLgotICovCi0KLXN0YXRpYyBpbnQgc2V0X2dyb3VwX3ByaXZzKHZvaWQpCi17Ci0gICAgaWYgKCFnZXRldWlkKCkpIHsKLQljaGFyICpuYW1lOwotCi0JLyogR2V0IHVzZXJuYW1lIGlmIHBhc3NlZCBhcyBhIHVpZCAqLwotCi0JaWYgKHVuaXhkX2NvbmZpZy51c2VyX25hbWVbMF0gPT0gJyMnKSB7Ci0JICAgIHN0cnVjdCBwYXNzd2QgKmVudDsKLQkgICAgdWlkX3QgdWlkID0gYXRvaSgmdW5peGRfY29uZmlnLnVzZXJfbmFtZVsxXSk7Ci0KLQkgICAgaWYgKChlbnQgPSBnZXRwd3VpZCh1aWQpKSA9PSBOVUxMKSB7Ci0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgTlVMTCwKLQkJCSAiZ2V0cHd1aWQ6IGNvdWxkbid0IGRldGVybWluZSB1c2VyIG5hbWUgZnJvbSB1aWQgJXUsICIKLQkJCSAieW91IHByb2JhYmx5IG5lZWQgdG8gbW9kaWZ5IHRoZSBVc2VyIGRpcmVjdGl2ZSIsCi0JCQkgKHVuc2lnbmVkKXVpZCk7Ci0JCXJldHVybiAtMTsKLQkgICAgfQotCi0JICAgIG5hbWUgPSBlbnQtPnB3X25hbWU7Ci0JfQotCWVsc2UKLQkgICAgbmFtZSA9IHVuaXhkX2NvbmZpZy51c2VyX25hbWU7Ci0KLQlpZiAoc2V0Z2lkKHVuaXhkX2NvbmZpZy5ncm91cF9pZCkgPT0gLTEpIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0FMRVJULCBOVUxMLAotCQkJInNldGdpZDogdW5hYmxlIHRvIHNldCBncm91cCBpZCB0byBHcm91cCAldSIsCi0JCQkodW5zaWduZWQpdW5peGRfY29uZmlnLmdyb3VwX2lkKTsKLQkgICAgcmV0dXJuIC0xOwotCX0KLQotCS8qIFJlc2V0IGBncm91cHMnIGF0dHJpYnV0ZXMuICovCi0KLQlpZiAoaW5pdGdyb3VwcyhuYW1lLCB1bml4ZF9jb25maWcuZ3JvdXBfaWQpID09IC0xKSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgTlVMTCwKLQkJCSJpbml0Z3JvdXBzOiB1bmFibGUgdG8gc2V0IGdyb3VwcyBmb3IgVXNlciAlcyAiCi0JCQkiYW5kIEdyb3VwICV1IiwgbmFtZSwgKHVuc2lnbmVkKXVuaXhkX2NvbmZpZy5ncm91cF9pZCk7Ci0JICAgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0KLWludCB1bml4ZF9zZXR1cF9jaGlsZCh2b2lkKQotewotICAgIGlmIChzZXRfZ3JvdXBfcHJpdnMoKSkgewotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBPbmx5IHRyeSB0byBzd2l0Y2ggaWYgd2UncmUgcnVubmluZyBhcyByb290ICovCi0gICAgaWYgKCFnZXRldWlkKCkgJiYgKAotCXNldHVpZCh1bml4ZF9jb25maWcudXNlcl9pZCkgPT0gLTEpKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0FMRVJULCBOVUxMLAotCQkgICAgInNldHVpZDogdW5hYmxlIHRvIGNoYW5nZSB1aWQiKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0KLWNvbnN0IGNoYXIgKnVuaXhkX3NldF91c2VyKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHVuaXhkX2NvbmZpZy51c2VyX25hbWUgPSBhcmc7Ci0gICAgdW5peGRfY29uZmlnLnVzZXJfaWQgPSBhcF91bmFtZTJpZChhcmcpOwotI2lmICFkZWZpbmVkIChCSUdfU0VDVVJJVFlfSE9MRSkgJiYgIWRlZmluZWQgKE9TMikKLSAgICBpZiAodW5peGRfY29uZmlnLnVzZXJfaWQgPT0gMCkgewotCXJldHVybiAiRXJyb3I6XHRBcGFjaGUgaGFzIG5vdCBiZWVuIGRlc2lnbmVkIHRvIHNlcnZlIHBhZ2VzIHdoaWxlXG4iCi0JCSJcdHJ1bm5pbmcgYXMgcm9vdC4gIFRoZXJlIGFyZSBrbm93biByYWNlIGNvbmRpdGlvbnMgdGhhdFxuIgotCQkiXHR3aWxsIGFsbG93IGFueSBsb2NhbCB1c2VyIHRvIHJlYWQgYW55IGZpbGUgb24gdGhlIHN5c3RlbS5cbiIKLQkJIlx0SWYgeW91IHN0aWxsIGRlc2lyZSB0byBzZXJ2ZSBwYWdlcyBhcyByb290IHRoZW5cbiIKLQkJIlx0YWRkIC1EQklHX1NFQ1VSSVRZX0hPTEUgdG8gdGhlIEVYVFJBX0NGTEFHUyBsaW5lIGluIHlvdXJcbiIKLQkJIlx0c3JjL0NvbmZpZ3VyYXRpb24gZmlsZSBhbmQgcmVidWlsZCB0aGUgc2VydmVyLiAgSXQgaXNcbiIKLQkJIlx0c3Ryb25nbHkgc3VnZ2VzdGVkIHRoYXQgeW91IGluc3RlYWQgbW9kaWZ5IHRoZSBVc2VyXG4iCi0JCSJcdGRpcmVjdGl2ZSBpbiB5b3VyIGh0dHBkLmNvbmYgZmlsZSB0byBsaXN0IGEgbm9uLXJvb3RcbiIKLQkJIlx0dXNlci5cbiI7Ci0gICAgfQotI2VuZGlmCi0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotY29uc3QgY2hhciAqdW5peGRfc2V0X2dyb3VwKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHVuaXhkX2NvbmZpZy5ncm91cF9pZCA9IGFwX2duYW1lMmlkKGFyZyk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCB1bml4ZF9wcmVfY29uZmlnKHZvaWQpCi17Ci0gICAgdW5peGRfY29uZmlnLnVzZXJfbmFtZSA9IERFRkFVTFRfVVNFUjsKLSAgICB1bml4ZF9jb25maWcudXNlcl9pZCA9IGFwX3VuYW1lMmlkKERFRkFVTFRfVVNFUik7Ci0gICAgdW5peGRfY29uZmlnLmdyb3VwX2lkID0gYXBfZ25hbWUyaWQoREVGQVVMVF9HUk9VUCk7Ci19CmRpZmYgLS1naXQgYS9vcy9iZW9zL2Jlb3NkLmggYi9vcy9iZW9zL2Jlb3NkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3Y2IyZjkuLjAwMDAwMDAKLS0tIGEvb3MvYmVvcy9iZW9zZC5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaWZuZGVmIFVOSVhEX0gKLSNkZWZpbmUgVU5JWERfSAotCi0vKiBjb21tb24gc3R1ZmYgdGhhdCB1bml4IE1QTXMgd2lsbCB3YW50ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjaGFyICp1c2VyX25hbWU7Ci0gICAgdWlkX3QgdXNlcl9pZDsKLSAgICBnaWRfdCBncm91cF9pZDsKLX0gdW5peGRfY29uZmlnX3JlYzsKLWV4dGVybiB1bml4ZF9jb25maWdfcmVjIHVuaXhkX2NvbmZpZzsKLQotdm9pZCB1bml4ZF9kZXRhY2godm9pZCk7Ci1pbnQgdW5peGRfc2V0dXBfY2hpbGQodm9pZCk7Ci12b2lkIHVuaXhkX3ByZV9jb25maWcodm9pZCk7Ci1jb25zdCBjaGFyICp1bml4ZF9zZXRfdXNlcihjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZyk7Ci1jb25zdCBjaGFyICp1bml4ZF9zZXRfZ3JvdXAoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpOwotCi0jZGVmaW5lIFVOSVhfREFFTU9OX0NPTU1BTkRTCVwKLXsgIlVzZXIiLCB1bml4ZF9zZXRfdXNlciwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwgXAotICAiRWZmZWN0aXZlIHVzZXIgaWQgZm9yIHRoaXMgc2VydmVyIn0sIFwKLXsgIkdyb3VwIiwgdW5peGRfc2V0X2dyb3VwLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLCBcCi0gICJFZmZlY3RpdmUgZ3JvdXAgaWQgZm9yIHRoaXMgc2VydmVyIn0sIFwKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9vcy9iZW9zL2NvbmZpZy5tNCBiL29zL2Jlb3MvY29uZmlnLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjNhYzA2Li4wMDAwMDAwCi0tLSBhL29zL2Jlb3MvY29uZmlnLm00CisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1pZiB0ZXN0ICIkT1MiID0gImJlb3MiIDsgdGhlbgotICAgIENGTEFHUz0iJENGTEFHUyAtREJFT1MiCi1maQpkaWZmIC0tZ2l0IGEvb3MvYmVvcy9vcy5jIGIvb3MvYmVvcy9vcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjI4MWMyLi4wMDAwMDAwCi0tLSBhL29zL2Jlb3Mvb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgd2lsbCBpbmNsdWRlIE9TIHNwZWNpZmljIGZ1bmN0aW9ucyB3aGljaCBhcmUgbm90IGlubGluZWFibGUuCi0gKiBBbnkgaW5saW5lYWJsZSBmdW5jdGlvbnMgc2hvdWxkIGJlIGRlZmluZWQgaW4gb3MtaW5saW5lLmMgaW5zdGVhZC4KLSAqLwotCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAib3MuaCIKLQotaW50IGFwX29zX2lzX3BhdGhfYWJzb2x1dGUoY29uc3QgY2hhciAqZmlsZSkKLXsKLSAgcmV0dXJuIGZpbGVbMF0gPT0gJy8nOwotfQotCi1pbnQgYXBfc3Bhd252cChjb25zdCBjaGFyICpmaWxlLCBjaGFyICpjb25zdCBhcmd2W10pCi17Ci0gICAgaW50IHBpZDsKLQotICAgIGlmICgocGlkID0gZm9yaygpKSA9PSAtMSkgewotICAgICAgICByZXR1cm4gcGlkOwotICAgIH0gZWxzZSBpZiAocGlkID09IDApIHsKLSAgICAgICAgaWYgKGV4ZWN2cChmaWxlLCBhcmd2KSA9PSAtMSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIC0xOyAgLyogSWYgd2UgZ2V0LCB3ZSBoYXZlIGEgcmVhbCBlcnJvciwgYnV0IHRoaXMga2VlcHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzIGZyb20gZ2V0dGluZyBhIHdhcm5pbmcgZHVyaW5nIGNvbXBpbGUgdGltZS4gKi8KLSAgICB9IGVsc2UgCi0gICAgICAgIHJldHVybiBwaWQ7Ci19Ci0KLQotLyogc29tZSBsaW5rZXJzIGNvbXBsYWluIHVubGVzcyB0aGVyZSdzIGF0IGxlYXN0IG9uZSBmdW5jdGlvbiBpbiBlYWNoCi0gKiAubyBmaWxlLi4uIGFuZCBleHRyYSBwcm90b3R5cGUgaXMgZm9yIGdjYyAtV21pc3NpbmctcHJvdG90eXBlcwotICovCi1leHRlcm4gdm9pZCBhcF9pc19ub3RfaGVyZSh2b2lkKTsKLXZvaWQgYXBfaXNfbm90X2hlcmUodm9pZCkge30KLQotLyoKLSAqICBBYnN0cmFjdGlvbiBsYXllciBmb3IgbG9hZGluZwotICogIEFwYWNoZSBtb2R1bGVzIHVuZGVyIHJ1bi10aW1lIHZpYSAKLSAqICBkeW5hbWljIHNoYXJlZCBvYmplY3QgKERTTykgbWVjaGFuaXNtCi0gKi8KLQotdm9pZCBhcF9vc19kc29faW5pdCh2b2lkKQotewotICAgIC8qIE5vdGhpbmcgcmVxdWlyZWQgdG8gYmUgZG9uZSEgKi8gCi19Ci0KLXZvaWQqIGFwX29zX2Rzb19sb2FkKGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gICAgcmV0dXJuICh2b2lkKikgbG9hZF9hZGRfb24ocGF0aCk7Ci19Ci0KLXZvaWQgYXBfb3NfZHNvX3VubG9hZCh2b2lkKiBoYW5kbGUpCi17Ci0gICAgdW5sb2FkX2FkZF9vbigoaW1hZ2VfaWQpaGFuZGxlKTsKLX0KLQotdm9pZCAqYXBfb3NfZHNvX3N5bSh2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKnN5bW5hbWUpCi17Ci0gICAgdm9pZCAqIHJldHZhbCA9IDA7Ci0jaWYgZGVmaW5lZChETFNZTV9ORUVEU19VTkRFUlNDT1JFKQotICAgIGNoYXIgKnN5bWJvbCA9IChjaGFyKiltYWxsb2Moc2l6ZW9mKGNoYXIpKihzdHJsZW4oc3ltbmFtZSkrMikpOwotICAgIHNwcmludGYoc3ltYm9sLCAiXyVzIiwgc3ltbmFtZSk7Ci0gICAgZ2V0X2ltYWdlX3N5bWJvbCgoaW1hZ2VfaWQpaGFuZGxlLCBzeW1ib2wsIEJfU1lNQk9MX1RZUEVfQU5ZLCAodm9pZCAqKikmcmV0dmFsKTsKLSAgICBmcmVlKHN5bWJvbCk7Ci0gICAgcmV0dXJuIHJldHZhbDsKLSNlbmRpZgotICAgIGdldF9pbWFnZV9zeW1ib2woKGltYWdlX2lkKWhhbmRsZSwgc3ltbmFtZSwgQl9TWU1CT0xfVFlQRV9BTlksICh2b2lkICoqKSZyZXR2YWwpOwotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLWNvbnN0IGNoYXIgKmFwX29zX2Rzb19lcnJvcih2b2lkKQotewotICAgIHJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvb3MvYmVvcy9vcy5oIGIvb3MvYmVvcy9vcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGFmNDE2Li4wMDAwMDAwCi0tLSBhL29zL2Jlb3Mvb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLSNpZm5kZWYgQVBBQ0hFX09TX0gKLSNkZWZpbmUgQVBBQ0hFX09TX0gKLQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgPGtlcm5lbC9pbWFnZS5oPgotCi0jaWZuZGVmIFBMQVRGT1JNCi0jZGVmaW5lIFBMQVRGT1JNICJCZU9TIgotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIGZpbGUgaW4gaW5jbHVkZWQgaW4gYWxsIEFwYWNoZSBzb3VyY2UgY29kZS4gSXQgY29udGFpbnMgZGVmaW5pdGlvbnMKLSAqIG9mIGZhY2lsaXRpZXMgYXZhaWxhYmxlIG9uIF90aGlzXyBvcGVyYXRpbmcgc3lzdGVtIChIQVZFXyogbWFjcm9zKSwKLSAqIGFuZCBwcm90b3R5cGVzIG9mIE9TIHNwZWNpZmljIGZ1bmN0aW9ucyBkZWZpbmVkIGluIG9zLmMgb3Igb3MtaW5saW5lLmMKLSAqLwotCi1leHRlcm4gaW50IGFwX29zX2lzX3BhdGhfYWJzb2x1dGUoY29uc3QgY2hhciAqZmlsZSk7Ci1leHRlcm4gaW50IGFwX3NwYXdudnAoY29uc3QgY2hhciAqZmlsZSwgY2hhciAqY29uc3QgYXJndltdKTsKLSNkZWZpbmUgYXBfb3NfaXNfZmlsZW5hbWVfdmFsaWQoZikgICAgICAgICAgKDEpCi0jZGVmaW5lIGFwX29zX2tpbGwocGlkLCBzaWcpICAgICAgICAgICAgICAgIGtpbGwocGlkLCBzaWcpCi0KLS8qCi0gKiAgQWJzdHJhY3Rpb24gbGF5ZXIgZm9yIGxvYWRpbmcKLSAqICBBcGFjaGUgbW9kdWxlcyB1bmRlciBydW4tdGltZSB2aWEgCi0gKiAgZHluYW1pYyBzaGFyZWQgb2JqZWN0IChEU08pIG1lY2hhbmlzbQotICovCi0KLXZvaWQgKmRsb3Blbihjb25zdCBjaGFyICosIGludCk7Ci1pbnQgZGxjbG9zZSh2b2lkICopOwotdm9pZCAqZGxzeW0odm9pZCAqLCBjb25zdCBjaGFyICopOwotY29uc3QgY2hhciAqZGxlcnJvcih2b2lkKTsKLQotI2RlZmluZSBSVExEX05PVyAxCi0jZGVmaW5lIFJUTERfR0xPQkFMIDAKLQotI2RlZmluZSAgICAgYXBfb3NfZHNvX2hhbmRsZV90ICBpbWFnZV9pZCAqCi12b2lkICAgICAgICBhcF9vc19kc29faW5pdCh2b2lkKTsKLXZvaWQgKiAgICAgIGFwX29zX2Rzb19sb2FkKGNvbnN0IGNoYXIgKik7Ci12b2lkICAgICAgICBhcF9vc19kc29fdW5sb2FkKHZvaWQgKik7Ci12b2lkICogICAgICBhcF9vc19kc29fc3ltKHZvaWQgKiwgY29uc3QgY2hhciAqKTsKLWNvbnN0IGNoYXIgKmFwX29zX2Rzb19lcnJvcih2b2lkKTsKLQotI2VuZGlmCS8qICFBUEFDSEVfT1NfSCAqLwpkaWZmIC0tZ2l0IGEvb3MvYnMyMDAwLy5jdnNpZ25vcmUgYi9vcy9iczIwMDAvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNjN2E3Yy4uMDAwMDAwMAotLS0gYS9vcy9iczIwMDAvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1ha2VmaWxlCmRpZmYgLS1naXQgYS9vcy9iczIwMDAvZWJjZGljLmMgYi9vcy9iczIwMDAvZWJjZGljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMDNmYzYuLjAwMDAwMDAKLS0tIGEvb3MvYnMyMDAwL2ViY2RpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotCi0jaWZkZWYgQ0hBUlNFVF9FQkNESUMKLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlICJlYmNkaWMuaCIKLS8qCi0JICAgSW5pdGlhbCBQb3J0IGZvciAgQXBhY2hlLTEuMyBieSA8TWFydGluLktyYWVtZXJATWNoLlNOSS5EZT4KLQotIkJTMjAwMCBPU0QiIGlzIGEgUE9TSVggb24gYSBtYWluIGZyYW1lLiBJdCBpcyBtYWRlIGJ5IFNpZW1lbnMgQUcsIEdlcm1hbnkuCi1XaXRoaW4gdGhlIFBPU0lYIHN1YnN5c3RlbSwgdGhlIHNhbWUgY2hhcmFjdGVyIHNldCB3YXMgY2hvc2VuIGFzIGluCi0ibmF0aXZlIEJTMjAwMCIsIG5hbWVseSBFQkNESUMuCi0KLUVCQ0RJQyBUYWJsZS4gKFllcywgaW4gRUJDRElDLCB0aGUgbGV0dGVycyAnYScuLid6JyBhcmUgbm90IGNvbnRpZ3VvdXMhKQotVGhpcyB0YWJsZSBpcyBiaWplY3RpdmUsIGkuZS4gdGhlcmUgYXJlIG5vIGFtYmlnb3VzIG9yIGR1cGxpY2F0ZSBjaGFyYWN0ZXJzCi0wMCAgICAwMCAwMSAwMiAwMyA4NSAwOSA4NiA3ZiAgODcgOGQgOGUgMGIgMGMgMGQgMGUgMGYgICouLi4uLi4uLi4uLi4uLi4uKgotMTAgICAgMTAgMTEgMTIgMTMgOGYgMGEgMDggOTcgIDE4IDE5IDljIDlkIDFjIDFkIDFlIDFmICAqLi4uLi4uLi4uLi4uLi4uLioKLTIwICAgIDgwIDgxIDgyIDgzIDg0IDkyIDE3IDFiICA4OCA4OSA4YSA4YiA4YyAwNSAwNiAwNyAgKi4uLi4uLi4uLi4uLi4uLi4qCi0zMCAgICA5MCA5MSAxNiA5MyA5NCA5NSA5NiAwNCAgOTggOTkgOWEgOWIgMTQgMTUgOWUgMWEgICouLi4uLi4uLi4uLi4uLi4uKgotNDAgICAgMjAgYTAgZTIgZTQgZTAgZTEgZTMgZTUgIGU3IGYxIDYwIDJlIDNjIDI4IDJiIDdjICAqIC4uLi4uLi4uLmAuPCgrfCoKLTUwICAgIDI2IGU5IGVhIGViIGU4IGVkIGVlIGVmICBlYyBkZiAyMSAyNCAyYSAyOSAzYiA5ZiAgKiYuLi4uLi4uLi4hJCopOy4qCi02MCAgICAyZCAyZiBjMiBjNCBjMCBjMSBjMyBjNSAgYzcgZDEgNWUgMmMgMjUgNWYgM2UgM2YgICotLy4uLi4uLi4uXiwlXz4/KgotNzAgICAgZjggYzkgY2EgY2IgYzggY2QgY2UgY2YgIGNjIGE4IDNhIDIzIDQwIDI3IDNkIDIyICAqLi4uLi4uLi4uLjojQCc9IioKLTgwICAgIGQ4IDYxIDYyIDYzIDY0IDY1IDY2IDY3ICA2OCA2OSBhYiBiYiBmMCBmZCBmZSBiMSAgKi5hYmNkZWZnaGkuLi4uLi4qCi05MCAgICBiMCA2YSA2YiA2YyA2ZCA2ZSA2ZiA3MCAgNzEgNzIgYWEgYmEgZTYgYjggYzYgYTQgICouamtsbW5vcHFyLi4uLi4uKgotYTAgICAgYjUgYWYgNzMgNzQgNzUgNzYgNzcgNzggIDc5IDdhIGExIGJmIGQwIGRkIGRlIGFlICAqLi5zdHV2d3h5ei4uLi4uLioKLWIwICAgIGEyIGEzIGE1IGI3IGE5IGE3IGI2IGJjICBiZCBiZSBhYyA1YiA1YyA1ZCBiNCBkNyAgKi4uLi4uLi4uLi4uW1xdLi4qCi1jMCAgICBmOSA0MSA0MiA0MyA0NCA0NSA0NiA0NyAgNDggNDkgYWQgZjQgZjYgZjIgZjMgZjUgICouQUJDREVGR0hJLi4uLi4uKgotZDAgICAgYTYgNGEgNGIgNGMgNGQgNGUgNGYgNTAgIDUxIDUyIGI5IGZiIGZjIGRiIGZhIGZmICAqLkpLTE1OT1BRUi4uLi4uLioKLWUwICAgIGQ5IGY3IDUzIDU0IDU1IDU2IDU3IDU4ICA1OSA1YSBiMiBkNCBkNiBkMiBkMyBkNSAgKi4uU1RVVldYWVouLi4uLi4qCi1mMCAgICAzMCAzMSAzMiAzMyAzNCAzNSAzNiAzNyAgMzggMzkgYjMgN2IgZGMgN2QgZGEgN2UgICowMTIzNDU2Nzg5LnsufS5+KgotKi8KLQotLyogVGhlIGJpamVjdGl2ZSBlYmNkaWMtdG8tYXNjaWkgdGFibGU6ICovCi1jb25zdCB1bnNpZ25lZCBjaGFyIG9zX3RvYXNjaWlfc3RyaWN0bHlbMjU2XSA9IHsKLS8qMDAqLyAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDg1LCAweDA5LCAweDg2LCAweDdmLAotICAgICAgIDB4ODcsIDB4OGQsIDB4OGUsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qLi4uLi4uLi4uLi4uLi4uLiovCi0vKjEwKi8gMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHg4ZiwgMHgwYSwgMHgwOCwgMHg5NywKLSAgICAgICAweDE4LCAweDE5LCAweDljLCAweDlkLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKi4uLi4uLi4uLi4uLi4uLi4qLwotLyoyMCovIDB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4OTIsIDB4MTcsIDB4MWIsCi0gICAgICAgMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHgwNSwgMHgwNiwgMHgwNywgLyouLi4uLi4uLi4uLi4uLi4uKi8KLS8qMzAqLyAweDkwLCAweDkxLCAweDE2LCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDA0LAotICAgICAgIDB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4MTQsIDB4MTUsIDB4OWUsIDB4MWEsIC8qLi4uLi4uLi4uLi4uLi4uLiovCi0vKjQwKi8gMHgyMCwgMHhhMCwgMHhlMiwgMHhlNCwgMHhlMCwgMHhlMSwgMHhlMywgMHhlNSwKLSAgICAgICAweGU3LCAweGYxLCAweDYwLCAweDJlLCAweDNjLCAweDI4LCAweDJiLCAweDdjLCAvKiAuLi4uLi4uLi5gLjwoK3wqLwotLyo1MCovIDB4MjYsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZTgsIDB4ZWQsIDB4ZWUsIDB4ZWYsCi0gICAgICAgMHhlYywgMHhkZiwgMHgyMSwgMHgyNCwgMHgyYSwgMHgyOSwgMHgzYiwgMHg5ZiwgLyomLi4uLi4uLi4uISQqKTsuKi8KLS8qNjAqLyAweDJkLCAweDJmLCAweGMyLCAweGM0LCAweGMwLCAweGMxLCAweGMzLCAweGM1LAotICAgICAgIDB4YzcsIDB4ZDEsIDB4NWUsIDB4MmMsIDB4MjUsIDB4NWYsIDB4M2UsIDB4M2YsIC8qLS8uLi4uLi4uLl4sJV8+PyovCi0vKjcwKi8gMHhmOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjOCwgMHhjZCwgMHhjZSwgMHhjZiwKLSAgICAgICAweGNjLCAweGE4LCAweDNhLCAweDIzLCAweDQwLCAweDI3LCAweDNkLCAweDIyLCAvKi4uLi4uLi4uLi46I0AnPSIqLwotLyo4MCovIDB4ZDgsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsCi0gICAgICAgMHg2OCwgMHg2OSwgMHhhYiwgMHhiYiwgMHhmMCwgMHhmZCwgMHhmZSwgMHhiMSwgLyouYWJjZGVmZ2hpLi4uLi4uKi8KLS8qOTAqLyAweGIwLCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAweDcwLAotICAgICAgIDB4NzEsIDB4NzIsIDB4YWEsIDB4YmEsIDB4ZTYsIDB4YjgsIDB4YzYsIDB4YTQsIC8qLmprbG1ub3Bxci4uLi4uLiovCi0vKmEwKi8gMHhiNSwgMHhhZiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwKLSAgICAgICAweDc5LCAweDdhLCAweGExLCAweGJmLCAweGQwLCAweGRkLCAweGRlLCAweGFlLCAvKi4uc3R1dnd4eXouLi4uLi4qLwotLypiMCovIDB4YTIsIDB4YTMsIDB4YTUsIDB4YjcsIDB4YTksIDB4YTcsIDB4YjYsIDB4YmMsCi0gICAgICAgMHhiZCwgMHhiZSwgMHhhYywgMHg1YiwgMHg1YywgMHg1ZCwgMHhiNCwgMHhkNywgLyouLi4uLi4uLi4uLltcXS4uKi8KLS8qYzAqLyAweGY5LCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LAotICAgICAgIDB4NDgsIDB4NDksIDB4YWQsIDB4ZjQsIDB4ZjYsIDB4ZjIsIDB4ZjMsIDB4ZjUsIC8qLkFCQ0RFRkdISS4uLi4uLiovCi0vKmQwKi8gMHhhNiwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgMHg1MCwKLSAgICAgICAweDUxLCAweDUyLCAweGI5LCAweGZiLCAweGZjLCAweGRiLCAweGZhLCAweGZmLCAvKi5KS0xNTk9QUVIuLi4uLi4qLwotLyplMCovIDB4ZDksIDB4ZjcsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsCi0gICAgICAgMHg1OSwgMHg1YSwgMHhiMiwgMHhkNCwgMHhkNiwgMHhkMiwgMHhkMywgMHhkNSwgLyouLlNUVVZXWFlaLi4uLi4uKi8KLS8qZjAqLyAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LAotICAgICAgIDB4MzgsIDB4MzksIDB4YjMsIDB4N2IsIDB4ZGMsIDB4N2QsIDB4ZGEsIDB4N2UgIC8qMDEyMzQ1Njc4OS57Ln0ufiovCi19OwotCi0vKiBUaGlzIHRhYmxlIGlzIChhbG1vc3QpIGlkZW50aWNhbCB0byB0aGUgcHJldmlvdXMgb25lLiBUaGUgb25seSBkaWZmZXJlbmNlCi0gKiBpcyB0aGUgZmFjdCB0aGF0IGl0IG1hcHMgZXZlcnkgRUJDRElDICpleGNlcHQgMHgwQSogdG8gaXRzIEFTQ0lJCi0gKiBlcXVpdmFsZW50LiBUaGUgcmVhc29uIGZvciB0aGlzIHRhYmxlIGlzIHNpbXBsZTogVGhyb3VnaG91dCB0aGUKLSAqIHNlcnZlciwgcHJvdG9jb2wgc3RyaW5ncyBhcmUgdXNlZCBpbiB0aGUgZm9ybQotICogICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW5cMDE1XDAxMiIuIE5vdyBhbGwgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZwotICogYXJlIHN0b3JlZCBhcyBFQkNESUMsIG9ubHkgdGhlIHNlbWFudGljcyBvZiBcMDEyIGlzIGNvbXBsZXRlbHkKLSAqIGRpZmZlcmVudCBmcm9tIExGIChsb29rIGl0IHVwIGluIHRoZSB0YWJsZSBhYm92ZSkuIFwwMTUgaGFwcGVucyB0byBiZQotICogbWFwcGVkIHRvIFwwMTUgYW55d2F5LCBzbyB0aGVyZSdzIG5vIHNwZWNpYWwgY2FzZSBmb3IgaXQuCi0gKiAKLSAqIEluIFRISVMgdGFibGUsIEVCQ0RJQy1cMDEyIGlzIG1hcHBlZCB0byBBU0NJSS1cMDEyLgotICogVGhpcyB0YWJsZSBpcyB0aGVyZWZvcmUgdXNlZCB3aGVyZXZlciBhbiBFQkNESUMgdG8gQVNDSUkgY29udmVyc2lvbiBpcwotICogbmVlZGVkIGluIHRoZSBzZXJ2ZXIuCi0gKi8KLS8qIGViY2RpYy10by1hc2NpaSB3aXRoIFwwMTIgbWFwcGVkIHRvIEFTQ0lJLVxuICovCi1jb25zdCB1bnNpZ25lZCBjaGFyIG9zX3RvYXNjaWlbMjU2XSA9IHsKLS8qMDAqLyAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDg1LCAweDA5LCAweDg2LCAweDdmLAotICAgICAgIDB4ODcsIDB4OGQsIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qLi4uLi4uLi4uLi4uLi4uLiovCi0vKjEwKi8gMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHg4ZiwgMHgwYSwgMHgwOCwgMHg5NywKLSAgICAgICAweDE4LCAweDE5LCAweDljLCAweDlkLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKi4uLi4uLi4uLi4uLi4uLi4qLwotLyoyMCovIDB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4OTIsIDB4MTcsIDB4MWIsCi0gICAgICAgMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHgwNSwgMHgwNiwgMHgwNywgLyouLi4uLi4uLi4uLi4uLi4uKi8KLS8qMzAqLyAweDkwLCAweDkxLCAweDE2LCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDA0LAotICAgICAgIDB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4MTQsIDB4MTUsIDB4OWUsIDB4MWEsIC8qLi4uLi4uLi4uLi4uLi4uLiovCi0vKjQwKi8gMHgyMCwgMHhhMCwgMHhlMiwgMHhlNCwgMHhlMCwgMHhlMSwgMHhlMywgMHhlNSwKLSAgICAgICAweGU3LCAweGYxLCAweDYwLCAweDJlLCAweDNjLCAweDI4LCAweDJiLCAweDdjLCAvKiAuLi4uLi4uLi5gLjwoK3wqLwotLyo1MCovIDB4MjYsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZTgsIDB4ZWQsIDB4ZWUsIDB4ZWYsCi0gICAgICAgMHhlYywgMHhkZiwgMHgyMSwgMHgyNCwgMHgyYSwgMHgyOSwgMHgzYiwgMHg5ZiwgLyomLi4uLi4uLi4uISQqKTsuKi8KLS8qNjAqLyAweDJkLCAweDJmLCAweGMyLCAweGM0LCAweGMwLCAweGMxLCAweGMzLCAweGM1LAotICAgICAgIDB4YzcsIDB4ZDEsIDB4NWUsIDB4MmMsIDB4MjUsIDB4NWYsIDB4M2UsIDB4M2YsIC8qLS8uLi4uLi4uLl4sJV8+PyovCi0vKjcwKi8gMHhmOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjOCwgMHhjZCwgMHhjZSwgMHhjZiwKLSAgICAgICAweGNjLCAweGE4LCAweDNhLCAweDIzLCAweDQwLCAweDI3LCAweDNkLCAweDIyLCAvKi4uLi4uLi4uLi46I0AnPSIqLwotLyo4MCovIDB4ZDgsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsCi0gICAgICAgMHg2OCwgMHg2OSwgMHhhYiwgMHhiYiwgMHhmMCwgMHhmZCwgMHhmZSwgMHhiMSwgLyouYWJjZGVmZ2hpLi4uLi4uKi8KLS8qOTAqLyAweGIwLCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAweDcwLAotICAgICAgIDB4NzEsIDB4NzIsIDB4YWEsIDB4YmEsIDB4ZTYsIDB4YjgsIDB4YzYsIDB4YTQsIC8qLmprbG1ub3Bxci4uLi4uLiovCi0vKmEwKi8gMHhiNSwgMHhhZiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwKLSAgICAgICAweDc5LCAweDdhLCAweGExLCAweGJmLCAweGQwLCAweGRkLCAweGRlLCAweGFlLCAvKi4uc3R1dnd4eXouLi4uLi4qLwotLypiMCovIDB4YTIsIDB4YTMsIDB4YTUsIDB4YjcsIDB4YTksIDB4YTcsIDB4YjYsIDB4YmMsCi0gICAgICAgMHhiZCwgMHhiZSwgMHhhYywgMHg1YiwgMHg1YywgMHg1ZCwgMHhiNCwgMHhkNywgLyouLi4uLi4uLi4uLltcXS4uKi8KLS8qYzAqLyAweGY5LCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LAotICAgICAgIDB4NDgsIDB4NDksIDB4YWQsIDB4ZjQsIDB4ZjYsIDB4ZjIsIDB4ZjMsIDB4ZjUsIC8qLkFCQ0RFRkdISS4uLi4uLiovCi0vKmQwKi8gMHhhNiwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgMHg1MCwKLSAgICAgICAweDUxLCAweDUyLCAweGI5LCAweGZiLCAweGZjLCAweGRiLCAweGZhLCAweGZmLCAvKi5KS0xNTk9QUVIuLi4uLi4qLwotLyplMCovIDB4ZDksIDB4ZjcsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsCi0gICAgICAgMHg1OSwgMHg1YSwgMHhiMiwgMHhkNCwgMHhkNiwgMHhkMiwgMHhkMywgMHhkNSwgLyouLlNUVVZXWFlaLi4uLi4uKi8KLS8qZjAqLyAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LAotICAgICAgIDB4MzgsIDB4MzksIDB4YjMsIDB4N2IsIDB4ZGMsIDB4N2QsIDB4ZGEsIDB4N2UgIC8qMDEyMzQ1Njc4OS57Ln0ufiovCi19OwotCi0vKiBUaGUgYXNjaWktdG8tZWJjZGljIHRhYmxlOgotMDAgICAgMDAgMDEgMDIgMDMgMzcgMmQgMmUgMmYgIDE2IDA1IDE1IDBiIDBjIDBkIDBlIDBmICAqLi4uLi4uLi4uLi4uLi4uLioKLTEwICAgIDEwIDExIDEyIDEzIDNjIDNkIDMyIDI2ICAxOCAxOSAzZiAyNyAxYyAxZCAxZSAxZiAgKi4uLi4uLi4uLi4uLi4uLi4qCi0yMCAgICA0MCA1YSA3ZiA3YiA1YiA2YyA1MCA3ZCAgNGQgNWQgNWMgNGUgNmIgNjAgNGIgNjEgICogISIjJCUmJygpKissLS4vCi0zMCAgICBmMCBmMSBmMiBmMyBmNCBmNSBmNiBmNyAgZjggZjkgN2EgNWUgNGMgN2UgNmUgNmYgICowMTIzNDU2Nzg5Ojs8PT4/KgotNDAgICAgN2MgYzEgYzIgYzMgYzQgYzUgYzYgYzcgIGM4IGM5IGQxIGQyIGQzIGQ0IGQ1IGQ2ICAqQEFCQ0RFRkdISUpLTE1OTyoKLTUwICAgIGQ3IGQ4IGQ5IGUyIGUzIGU0IGU1IGU2ICBlNyBlOCBlOSBiYiBiYyBiZCA2YSA2ZCAgKlBRUlNUVVZXWFlaW1xdXl8qCi02MCAgICA0YSA4MSA4MiA4MyA4NCA4NSA4NiA4NyAgODggODkgOTEgOTIgOTMgOTQgOTUgOTYgICpgYWJjZGVmZ2hpamtsbW5vKgotNzAgICAgOTcgOTggOTkgYTIgYTMgYTQgYTUgYTYgIGE3IGE4IGE5IGZiIDRmIGZkIGZmIDA3ICAqcHFyc3R1dnd4eXp7fH1+LioKLTgwICAgIDIwIDIxIDIyIDIzIDI0IDA0IDA2IDA4ICAyOCAyOSAyYSAyYiAyYyAwOSAwYSAxNCAgKi4uLi4uLi4uLi4uLi4uLi4qCi05MCAgICAzMCAzMSAyNSAzMyAzNCAzNSAzNiAxNyAgMzggMzkgM2EgM2IgMWEgMWIgM2UgNWYgICouLi4uLi4uLi4uLi4uLi4uKgotYTAgICAgNDEgYWEgYjAgYjEgOWYgYjIgZDAgYjUgIDc5IGI0IDlhIDhhIGJhIGNhIGFmIGExICAqLi4uLi4uLi4uLi4uLi4uLioKLWIwICAgIDkwIDhmIGVhIGZhIGJlIGEwIGI2IGIzICA5ZCBkYSA5YiA4YiBiNyBiOCBiOSBhYiAgKi4uLi4uLi4uLi4uLi4uLi4qCi1jMCAgICA2NCA2NSA2MiA2NiA2MyA2NyA5ZSA2OCAgNzQgNzEgNzIgNzMgNzggNzUgNzYgNzcgICouLi4uLi4uLi4uLi4uLi4uKgotZDAgICAgYWMgNjkgZWQgZWUgZWIgZWYgZWMgYmYgIDgwIGUwIGZlIGRkIGZjIGFkIGFlIDU5ICAqLi4uLi4uLi4uLi4uLi4uLioKLWUwICAgIDQ0IDQ1IDQyIDQ2IDQzIDQ3IDljIDQ4ICA1NCA1MSA1MiA1MyA1OCA1NSA1NiA1NyAgKi4uLi4uLi4uLi4uLi4uLi4qCi1mMCAgICA4YyA0OSBjZCBjZSBjYiBjZiBjYyBlMSAgNzAgYzAgZGUgZGIgZGMgOGQgOGUgZGYgICouLi4uLi4uLi4uLi4uLi4uKgotKi8KLWNvbnN0IHVuc2lnbmVkIGNoYXIgb3NfdG9lYmNkaWNbMjU2XSA9IHsKLS8qMDAqLyAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgzNywgMHgyZCwgMHgyZSwgMHgyZiwKLQkweDE2LCAweDA1LCAweDE1LCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAgLyouLi4uLi4uLi4uLi4uLi4uKi8KLS8qMTAqLyAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgzYywgMHgzZCwgMHgzMiwgMHgyNiwKLQkweDE4LCAweDE5LCAweDNmLCAweDI3LCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAgLyouLi4uLi4uLi4uLi4uLi4uKi8KLS8qMjAqLyAgMHg0MCwgMHg1YSwgMHg3ZiwgMHg3YiwgMHg1YiwgMHg2YywgMHg1MCwgMHg3ZCwKLQkweDRkLCAweDVkLCAweDVjLCAweDRlLCAweDZiLCAweDYwLCAweDRiLCAweDYxLCAgLyogISIjJCUmJygpKissLS4vICovCi0vKjMwKi8gIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsCi0JMHhmOCwgMHhmOSwgMHg3YSwgMHg1ZSwgMHg0YywgMHg3ZSwgMHg2ZSwgMHg2ZiwgIC8qMDEyMzQ1Njc4OTo7PD0+PyovCi0vKjQwKi8gIDB4N2MsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsCi0JMHhjOCwgMHhjOSwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgIC8qQEFCQ0RFRkdISUpLTE1OTyovCi0vKjUwKi8gIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsCi0JMHhlNywgMHhlOCwgMHhlOSwgMHhiYiwgMHhiYywgMHhiZCwgMHg2YSwgMHg2ZCwgIC8qUFFSU1RVVldYWVpbXF1eXyovCi0vKjYwKi8gIDB4NGEsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsCi0JMHg4OCwgMHg4OSwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgIC8qYGFiY2RlZmdoaWprbG1ubyovCi0vKjcwKi8gIDB4OTcsIDB4OTgsIDB4OTksIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsCi0JMHhhNywgMHhhOCwgMHhhOSwgMHhmYiwgMHg0ZiwgMHhmZCwgMHhmZiwgMHgwNywgIC8qcHFyc3R1dnd4eXp7fH1+LiovCi0vKjgwKi8gIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MDQsIDB4MDYsIDB4MDgsCi0JMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgwOSwgMHgwYSwgMHgxNCwgIC8qLi4uLi4uLi4uLi4uLi4uLiovCi0vKjkwKi8gIDB4MzAsIDB4MzEsIDB4MjUsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MTcsCi0JMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgxYSwgMHgxYiwgMHgzZSwgMHg1ZiwgIC8qLi4uLi4uLi4uLi4uLi4uLiovCi0vKmEwKi8gIDB4NDEsIDB4YWEsIDB4YjAsIDB4YjEsIDB4OWYsIDB4YjIsIDB4ZDAsIDB4YjUsCi0JMHg3OSwgMHhiNCwgMHg5YSwgMHg4YSwgMHhiYSwgMHhjYSwgMHhhZiwgMHhhMSwgIC8qLi4uLi4uLi4uLi4uLi4uLiovCi0vKmIwKi8gIDB4OTAsIDB4OGYsIDB4ZWEsIDB4ZmEsIDB4YmUsIDB4YTAsIDB4YjYsIDB4YjMsCi0JMHg5ZCwgMHhkYSwgMHg5YiwgMHg4YiwgMHhiNywgMHhiOCwgMHhiOSwgMHhhYiwgIC8qLi4uLi4uLi4uLi4uLi4uLiovCi0vKmMwKi8gIDB4NjQsIDB4NjUsIDB4NjIsIDB4NjYsIDB4NjMsIDB4NjcsIDB4OWUsIDB4NjgsCi0JMHg3NCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3OCwgMHg3NSwgMHg3NiwgMHg3NywgIC8qLi4uLi4uLi4uLi4uLi4uLiovCi0vKmQwKi8gIDB4YWMsIDB4NjksIDB4ZWQsIDB4ZWUsIDB4ZWIsIDB4ZWYsIDB4ZWMsIDB4YmYsCi0JMHg4MCwgMHhlMCwgMHhmZSwgMHhkZCwgMHhmYywgMHhhZCwgMHhhZSwgMHg1OSwgIC8qLi4uLi4uLi4uLi4uLi4uLiovCi0vKmUwKi8gIDB4NDQsIDB4NDUsIDB4NDIsIDB4NDYsIDB4NDMsIDB4NDcsIDB4OWMsIDB4NDgsCi0JMHg1NCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1OCwgMHg1NSwgMHg1NiwgMHg1NywgIC8qLi4uLi4uLi4uLi4uLi4uLiovCi0vKmYwKi8gIDB4OGMsIDB4NDksIDB4Y2QsIDB4Y2UsIDB4Y2IsIDB4Y2YsIDB4Y2MsIDB4ZTEsCi0JMHg3MCwgMHhjMCwgMHhkZSwgMHhkYiwgMHhkYywgMHg4ZCwgMHg4ZSwgMHhkZiAgIC8qLi4uLi4uLi4uLi4uLi4uLiovCi19OwotCi0vKiBUcmFuc2xhdGUgYSBtZW1vcnkgYmxvY2sgZnJvbSBFQkNESUMgKGhvc3QgY2hhcnNldCkgdG8gQVNDSUkgKG5ldCBjaGFyc2V0KQotICogZGVzdCBhbmQgc3JjZSBtYXkgYmUgaWRlbnRpY2FsLCBvciBzZXBhcmF0ZSBtZW1vcnkgYmxvY2tzLCBidXQKLSAqIHNob3VsZCBub3Qgb3ZlcmxhcC4KLSAqLwotdm9pZAotZWJjZGljMmFzY2lpKHVuc2lnbmVkIGNoYXIgKmRlc3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY2UsIHNpemVfdCBjb3VudCkKLXsKLQl3aGlsZSAoY291bnQtLSAhPSAwKSB7Ci0JCSpkZXN0KysgPSBvc190b2FzY2lpWypzcmNlKytdOwotCX0KLX0KLXZvaWQKLWViY2RpYzJhc2NpaV9zdHJpY3RseSh1bnNpZ25lZCBjaGFyICpkZXN0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNlLCBzaXplX3QgY291bnQpCi17Ci0Jd2hpbGUgKGNvdW50LS0gIT0gMCkgewotCQkqZGVzdCsrID0gb3NfdG9hc2NpaV9zdHJpY3RseVsqc3JjZSsrXTsKLQl9Ci19Ci12b2lkCi1hc2NpaTJlYmNkaWModW5zaWduZWQgY2hhciAqZGVzdCwgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjZSwgc2l6ZV90IGNvdW50KQotewotCXdoaWxlIChjb3VudC0tICE9IDApIHsKLQkJKmRlc3QrKyA9IG9zX3RvZWJjZGljWypzcmNlKytdOwotCX0KLX0KLSNlbmRpZiAvKkNIQVJTRVRfRUJDRElDKi8KZGlmZiAtLWdpdCBhL29zL2JzMjAwMC9lYmNkaWMuaCBiL29zL2JzMjAwMC9lYmNkaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY3Zjk3OC4uMDAwMDAwMAotLS0gYS9vcy9iczIwMDAvZWJjZGljLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgb3NfdG9hc2NpaVsyNTZdOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgb3NfdG9lYmNkaWNbMjU2XTsKLXZvaWQgZWJjZGljMmFzY2lpKHVuc2lnbmVkIGNoYXIgKmRlc3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY2UsIHNpemVfdCBjb3VudCk7Ci12b2lkIGViY2RpYzJhc2NpaV9zdHJpY3RseSh1bnNpZ25lZCBjaGFyICpkZXN0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNlLCBzaXplX3QgY291bnQpOwotdm9pZCBhc2NpaTJlYmNkaWModW5zaWduZWQgY2hhciAqZGVzdCwgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjZSwgc2l6ZV90IGNvdW50KTsKLQpkaWZmIC0tZ2l0IGEvb3MvYnMyMDAwL29zLmMgYi9vcy9iczIwMDAvb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzODEwYS4uMDAwMDAwMAotLS0gYS9vcy9iczIwMDAvb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBUaGlzIGZpbGUgd2lsbCBpbmNsdWRlIE9TIHNwZWNpZmljIGZ1bmN0aW9ucyB3aGljaCBhcmUgbm90IGlubGluZWFibGUuCi0gKiBBbnkgaW5saW5lYWJsZSBmdW5jdGlvbnMgc2hvdWxkIGJlIGRlZmluZWQgaW4gb3MtaW5saW5lLmMgaW5zdGVhZC4KLSAqLwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJvcy5oIgotCi0vKiBDaGVjayB0aGUgQ29udGVudC1UeXBlIHRvIGRlY2lkZSBpZiBjb252ZXJzaW9uIGlzIG5lZWRlZCAqLwotaW50IGFwX2NoZWNrY29udihzdHJ1Y3QgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IGNvbnZlcnRfdG9fYXNjaWk7Ci0gICAgY29uc3QgY2hhciAqdHlwZTsKLQotICAgIC8qIFRvIG1ha2Ugc2VydmluZyBvZiAicmF3IEFTQ0lJIHRleHQiIGZpbGVzIGVhc3kgKHRoZXkgc2VydmUgZmFzdGVyIAotICAgICAqIHNpbmNlIHRoZXkgZG9uJ3QgaGF2ZSB0byBiZSBjb252ZXJ0ZWQgZnJvbSBFQkNESUMpLCBhIG5ldwotICAgICAqICJtYWdpYyIgdHlwZSBwcmVmaXggd2FzIGludmVudGVkOiB0ZXh0L3gtYXNjaWkte3BsYWluLGh0bWwsLi4ufQotICAgICAqIElmIHdlIGRldGVjdCBvbmUgb2YgdGhlc2UgY29udGVudCB0eXBlcyBoZXJlLCB3ZSBzaW1wbHkgY29ycmVjdAotICAgICAqIHRoZSB0eXBlIHRvIHRoZSByZWFsIHRleHQve3BsYWluLGh0bWwsLi4ufSB0eXBlLiBPdGhlcndpc2UsIHdlCi0gICAgICogc2V0IGEgZmxhZyB0aGF0IHRyYW5zbGF0aW9uIGlzIHJlcXVpcmVkIGxhdGVyIG9uLgotICAgICAqLwotCi0gICAgdHlwZSA9IChyLT5jb250ZW50X3R5cGUgPT0gTlVMTCkgPyBhcF9kZWZhdWx0X3R5cGUocikgOiByLT5jb250ZW50X3R5cGU7Ci0KLSAgICAvKiBJZiBubyBjb250ZW50IHR5cGUgaXMgc2V0IHRoZW4gdHJlYXQgaXQgYXMgKGViY2RpYykgdGV4dC9wbGFpbiAqLwotICAgIGNvbnZlcnRfdG9fYXNjaWkgPSAodHlwZSA9PSBOVUxMKTsKLQotICAgIC8qIENvbnZlcnNpb24gaXMgYXBwbGllZCB0byB0ZXh0LyBmaWxlcyBvbmx5LCBpZiBldmVyLiAqLwotICAgIGlmICh0eXBlICYmIChzdHJuY2FzZWNtcCh0eXBlLCAidGV4dC8iLCA1KSA9PSAwIHx8Ci0JCSBzdHJuY2FzZWNtcCh0eXBlLCAibWVzc2FnZS8iLCA4KSA9PSAwKSkgewotCWlmIChzdHJuY2FzZWNtcCh0eXBlLCBBU0NJSVRFWFRfTUFHSUNfVFlQRV9QUkVGSVgsCi0JCQlzaXplb2YoQVNDSUlURVhUX01BR0lDX1RZUEVfUFJFRklYKS0xKSA9PSAwKQotCSAgICByLT5jb250ZW50X3R5cGUgPSBhcF9wc3RyY2F0KHItPnBvb2wsICJ0ZXh0LyIsCi0JCQkJCSB0eXBlK3NpemVvZihBU0NJSVRFWFRfTUFHSUNfVFlQRV9QUkVGSVgpLTEsCi0JCQkJCSBOVUxMKTsKLSAgICAgICAgZWxzZQotCSAgICAvKiB0cmFuc2xhdGUgRUJDRElDIHRvIEFTQ0lJICovCi0JICAgIGNvbnZlcnRfdG9fYXNjaWkgPSAxOwotICAgIH0KLSAgICAvKiBFbmFibGUgY29udmVyc2lvbiBpZiBpdCdzIGEgdGV4dCBkb2N1bWVudCAqLwotICAgIGFwX2JzZXRmbGFnKHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQl9FQkNESUMyQVNDSUksIGNvbnZlcnRfdG9fYXNjaWkpOwotCi0gICAgcmV0dXJuIGNvbnZlcnRfdG9fYXNjaWk7Ci19Ci0KZGlmZiAtLWdpdCBhL29zL2JzMjAwMC9vcy5oIGIvb3MvYnMyMDAwL29zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZGUwODEuLjAwMDAwMDAKLS0tIGEvb3MvYnMyMDAwL29zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jaWZuZGVmIEFQQUNIRV9PU19ICi0jZGVmaW5lIEFQQUNIRV9PU19ICi0KLSNkZWZpbmUgUExBVEZPUk0gIkJTMjAwMCIKLQotLyoKLSAqIFRoaXMgZmlsZSBpbiBpbmNsdWRlZCBpbiBhbGwgQXBhY2hlIHNvdXJjZSBjb2RlLiBJdCBjb250YWlucyBkZWZpbml0aW9ucwotICogb2YgZmFjaWxpdGllcyBhdmFpbGFibGUgb24gX3RoaXNfIG9wZXJhdGluZyBzeXN0ZW0gKEhBVkVfKiBtYWNyb3MpLAotICogYW5kIHByb3RvdHlwZXMgb2YgT1Mgc3BlY2lmaWMgZnVuY3Rpb25zIGRlZmluZWQgaW4gb3MuYyBvciBvcy1pbmxpbmUuYwotICovCi0KLSNpZiAhZGVmaW5lZChJTkxJTkUpICYmIGRlZmluZWQoVVNFX0dOVV9JTkxJTkUpCi0vKiBDb21waWxlciBzdXBwb3J0cyBpbmxpbmUsIHNvIGluY2x1ZGUgdGhlIGlubGluZWFibGUgZnVuY3Rpb25zIGFzCi0gKiBwYXJ0IG9mIHRoZSBoZWFkZXIKLSAqLwotI2RlZmluZSBJTkxJTkUgZXh0ZXJuIGFwX2lubGluZQotCi1JTkxJTkUgaW50IGFwX29zX2lzX3BhdGhfYWJzb2x1dGUoY29uc3QgY2hhciAqZmlsZSk7Ci0KLSNpbmNsdWRlICJvcy1pbmxpbmUuYyIKLSNlbmRpZgotCi0jaWZuZGVmIElOTElORQotLyogQ29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBpbmxpbmUsIHNvIHByb3RvdHlwZSB0aGUgaW5saW5lYWJsZSBmdW5jdGlvbnMKLSAqIGFzIG5vcm1hbAotICovCi1leHRlcm4gaW50IGFwX29zX2lzX3BhdGhfYWJzb2x1dGUoY29uc3QgY2hhciAqZmlsZSk7Ci0jZW5kaWYKLQotLyogT3RoZXIgYXBfb3NfIHJvdXRpbmVzIG5vdCB1c2VkIGJ5IHRoaXMgcGxhdGZvcm0gKi8KLQotI2RlZmluZSBhcF9vc19pc19maWxlbmFtZV92YWxpZChmKSAgICAgICAgICAoMSkKLSNkZWZpbmUgYXBfb3Nfa2lsbChwaWQsIHNpZykgICAgICAgICAgICAgICAga2lsbChwaWQsIHNpZykKLQotI2lmICFkZWZpbmVkKF9QT1NJWF9TT1VSQ0UpICYmICFkZWZpbmVkKF9YT1BFTl9TT1VSQ0UpCi10eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAKLSAgICBjaGFyICAgICp1c2VybmFtZTsgICAgIAotICAgIGNoYXIgICAgKmFjY291bnQ7ICAgICAgCi0gICAgY2hhciAgICAqcHJvY2Vzc29yX25hbWU7Ci19ICBfcmluaV9zdHJ1Y3Q7ICAgICAgICAgICAKLQotZXh0ZXJuIGludCBfcmluaShfcmluaV9zdHJ1Y3QgKik7Ci0jZW5kaWYgLyogIWRlZmluZWQoX1BPU0lYX1NPVVJDRSkgJiYgIWRlZmluZWQoX1hPUEVOX1NPVVJDRSkgKi8KLQotLyogU29ycnkgaWYgdGhpcyBpcyB1Z2x5LCBidXQgdGhlIGluY2x1ZGUgb3JkZXIgZG9lc24ndCBhbGxvdyBtZQotICogdG8gdXNlIHJlcXVlc3RfcmVjIGhlcmUuLi4gKi8KLXN0cnVjdCByZXF1ZXN0X3JlYzsKLWV4dGVybiBpbnQgYXBfY2hlY2tjb252KHN0cnVjdCByZXF1ZXN0X3JlYyAqcik7Ci1leHRlcm4gcGlkX3Qgb3NfZm9yayhjb25zdCBjaGFyICp1c2VyKTsKLQotI2VuZGlmIC8qISBBUEFDSEVfT1NfSCovCmRpZmYgLS1naXQgYS9vcy9jb25maWcubTQgYi9vcy9jb25maWcubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MGY5YjAuLjAwMDAwMDAKLS0tIGEvb3MvY29uZmlnLm00CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1BQ19NU0dfQ0hFQ0tJTkcod2hpY2ggT1MgdGhpcyBpcykKLQotZG5sICMjIFhYWCAtIEknbSBub3Qgc3VyZSwgYnV0IHRoaXMgbWlnaHQgbm90IGhhbmRsZSB0aGUgbm9uLVVuaXggY2FzZSB5ZXQKLU9TPXVuaXgKLU9TX0RJUj1vcy8kT1MKLQotQUNfTVNHX1JFU1VMVChbJE9TXSkKLUFQQUNIRV9PVVRQVVQob3MvJE9TL01ha2VmaWxlKQpkaWZmIC0tZ2l0IGEvb3MvbmV0d2FyZS9BcGFjaGUuZGVmIGIvb3MvbmV0d2FyZS9BcGFjaGUuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjA1MWViLi4wMDAwMDAwCi0tLSBhL29zL25ldHdhcmUvQXBhY2hlLmRlZgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01PRFVMRSAgQVBSTElCLk5MTQotTU9EVUxFICBMSUJDLk5MTQotTU9EVUxFICBXUzJfMzIuTkxNCi1GTEFHX09OIDMKZGlmZiAtLWdpdCBhL29zL25ldHdhcmUvYXBhY2hlLnhkYyBiL29zL25ldHdhcmUvYXBhY2hlLnhkYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJhN2Y2Yi4uMDAwMDAwMAotLS0gYS9vcy9uZXR3YXJlL2FwYWNoZS54ZGMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcy9uZXR3YXJlL21vZHVsZXMuYyBiL29zL25ldHdhcmUvbW9kdWxlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODY4NTIxLi4wMDAwMDAwCi0tLSBhL29zL25ldHdhcmUvbW9kdWxlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyogbW9kdWxlcy5jIC0tLSBtYWpvciBtb2R1bGVzIGNvbXBpbGVkIGludG8gQXBhY2hlIGZvciBOZXRXYXJlLgotICogT25seSBpbnNlcnQgYW4gZW50cnkgZm9yIGEgbW9kdWxlIGlmIGl0IG11c3QgYmUgY29tcGlsZWQgaW50bwotICogdGhlIGNvcmUgc2VydmVyCi0gKi8KLQotI2RlZmluZSBDT1JFX1BSSVZBVEUKLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0KLWV4dGVybiBtb2R1bGUgY29yZV9tb2R1bGU7Ci1leHRlcm4gbW9kdWxlIG1wbV9uZXR3YXJlX21vZHVsZTsKLWV4dGVybiBtb2R1bGUgaHR0cF9tb2R1bGU7Ci1leHRlcm4gbW9kdWxlIHNvX21vZHVsZTsKLWV4dGVybiBtb2R1bGUgbWltZV9tb2R1bGU7Ci1leHRlcm4gbW9kdWxlIGFjY2Vzc19tb2R1bGU7Ci1leHRlcm4gbW9kdWxlIGF1dGhfbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSBuZWdvdGlhdGlvbl9tb2R1bGU7Ci1leHRlcm4gbW9kdWxlIGluY2x1ZGVfbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSBhdXRvaW5kZXhfbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSBkaXJfbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSBjZ2lfbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSB1c2VyZGlyX21vZHVsZTsKLWV4dGVybiBtb2R1bGUgYWxpYXNfbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSBlbnZfbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSBsb2dfY29uZmlnX21vZHVsZTsKLWV4dGVybiBtb2R1bGUgYXNpc19tb2R1bGU7Ci1leHRlcm4gbW9kdWxlIGltYXBfbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSBhY3Rpb25zX21vZHVsZTsKLWV4dGVybiBtb2R1bGUgc2V0ZW52aWZfbW9kdWxlOwotCi1tb2R1bGUgKmFwX3ByZWxpbmtlZF9tb2R1bGVzW10gPSB7Ci0gICZjb3JlX21vZHVsZSwKLSAgJm1wbV9uZXR3YXJlX21vZHVsZSwKLSAgJmh0dHBfbW9kdWxlLAotICAmc29fbW9kdWxlLAotICAmbWltZV9tb2R1bGUsCi0gICZhY2Nlc3NfbW9kdWxlLAotICAmYXV0aF9tb2R1bGUsCi0gICZuZWdvdGlhdGlvbl9tb2R1bGUsCi0gICZpbmNsdWRlX21vZHVsZSwKLSAgJmF1dG9pbmRleF9tb2R1bGUsCi0gICZkaXJfbW9kdWxlLAotICAmY2dpX21vZHVsZSwKLSAgJnVzZXJkaXJfbW9kdWxlLAotICAmYWxpYXNfbW9kdWxlLAotICAmZW52X21vZHVsZSwKLSAgJmxvZ19jb25maWdfbW9kdWxlLAotICAmYXNpc19tb2R1bGUsCi0gICZpbWFwX21vZHVsZSwKLSAgJmFjdGlvbnNfbW9kdWxlLAotICAmc2V0ZW52aWZfbW9kdWxlLAotICBOVUxMCi19OwotCi1tb2R1bGUgKmFwX3ByZWxvYWRlZF9tb2R1bGVzW10gPSB7Ci0gICZjb3JlX21vZHVsZSwKLSAgJm1wbV9uZXR3YXJlX21vZHVsZSwKLSAgJmh0dHBfbW9kdWxlLAotICAmc29fbW9kdWxlLAotICAmbWltZV9tb2R1bGUsCi0gICZhY2Nlc3NfbW9kdWxlLAotICAmYXV0aF9tb2R1bGUsCi0gICZuZWdvdGlhdGlvbl9tb2R1bGUsCi0gICZpbmNsdWRlX21vZHVsZSwKLSAgJmF1dG9pbmRleF9tb2R1bGUsCi0gICZkaXJfbW9kdWxlLAotICAmY2dpX21vZHVsZSwKLSAgJnVzZXJkaXJfbW9kdWxlLAotICAmYWxpYXNfbW9kdWxlLAotICAmZW52X21vZHVsZSwKLSAgJmxvZ19jb25maWdfbW9kdWxlLAotICAmYXNpc19tb2R1bGUsCi0gICZpbWFwX21vZHVsZSwKLSAgJmFjdGlvbnNfbW9kdWxlLAotICAmc2V0ZW52aWZfbW9kdWxlLAotICBOVUxMCi19OwpkaWZmIC0tZ2l0IGEvb3MvbmV0d2FyZS9vcy5oIGIvb3MvbmV0d2FyZS9vcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjllMWZlLi4wMDAwMDAwCi0tLSBhL29zL25ldHdhcmUvb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCi0gKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAotICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqLwotCi0jaWZuZGVmIEFQQUNIRV9PU19ICi0jZGVmaW5lIEFQQUNIRV9PU19ICi0KLSNpZm5kZWYgUExBVEZPUk0KLSNkZWZpbmUgUExBVEZPUk0gIk5FVFdBUkUiCi0jZW5kaWYKLQotI2RlZmluZSBDQVNFX0JMSU5EX0ZJTEVTWVNURU0KLSNkZWZpbmUgTk9fV1JJVEVWCi0KLSNkZWZpbmUgQVBBQ0hFX01QTV9ESVIgICJzZXJ2ZXIvbXBtL25ldHdhcmUiIC8qIGdlbmVyYXRlZCBvbiB1bml4ICovCi0KLSNkZWZpbmUgZ2V0cGlkIE5YVGhyZWFkR2V0SWQKLS8vI2RlZmluZSBleGl0KHMpIF9leGl0KHMpCi0KLSNlbmRpZiAgIC8qICEgQVBBQ0hFX09TX0ggKi8KZGlmZiAtLWdpdCBhL29zL25ldHdhcmUvcHJlX253LmggYi9vcy9uZXR3YXJlL3ByZV9udy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTNkOTljLi4wMDAwMDAwCi0tLSBhL29zL25ldHdhcmUvcHJlX253LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jaWZuZGVmIF9fcHJlX253X18KLSNkZWZpbmUgX19wcmVfbndfXwotCi0jcHJhZ21hIHByZWNvbXBpbGVfdGFyZ2V0ICJwcmVjb21wLm1jaCIKLSNkZWZpbmUgTkVUV0FSRQotCi0KLSNkZWZpbmUgTl9QTEFUX05MTQotCi0vKiBoaW50IGZvciBNU0wgQysrIHRoYXQgd2UncmUgb24gTmV0V2FyZSBwbGF0Zm9ybSAqLwotI2RlZmluZSBfX05FVFdBUkVfXwotCi0vKiB0aGUgRkFSIGtleXdvcmQgaGFzIG5vIG1lYW5pbmcgaW4gYSAzMi1iaXQgZW52aXJvbm1lbnQgCi0gICBidXQgaXMgdXNlZCBpbiB0aGUgU0RLIGhlYWRlcnMgc28gd2UgdGFrZSBpdCBvdXQgKi8KLSNkZWZpbmUgRkFSCi0jZGVmaW5lIGZhcgotCi0vKiBuby1vcCBmb3IgQ29kZXdhcnJpb3IgQyBjb21waWxlcjsgYSBmdW5jdGlvbnMgYXJlIGNkZWNsIAotICAgYnkgZGVmYXVsdCAqLwotI2RlZmluZSBjZGVjbAotCi0vKiBpZiB3ZSBoYXZlIHdjaGFyX3QgZW5hYmxlZCBpbiBDKyssIHByZWRlZmluZSB0aGlzIHR5cGUgdG8gYXZvaWQKLSAgIGEgY29uZmxpY3QgaW4gTm92ZWxsJ3MgaGVhZGVyIGZpbGVzICovCi0jaWYgKF9fb3B0aW9uKGNwbHVzcGx1cykgJiYgX19vcHRpb24od2NoYXJfdHlwZSkpCi0jZGVmaW5lIF9XQ0hBUl9UCi0jZW5kaWYKLQotLyogQzlYIGRlZmludGlvbiB1c2VkIGJ5IE1TTCBDKysgbGlicmFyeSAqLwotI2RlZmluZSBERUNJTUFMX0RJRyAxNwotCi0vKiBkZWZpbmUgbG9uZyBsb25nIHR5cGVkZWZzIGZvciBXYXRjb20gY29tcGF0aWJsaXR5ICovCi10eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0X3Q7Ci0KLS8qIHNvbWUgY29kZSBtYXkgd2FudCB0byB1c2UgdGhlIE1TIGNvbnZlbnRpb24gZm9yIGxvbmcgbG9uZyAqLwotI2lmbmRlZiBfX2ludDY0Ci0jZGVmaW5lIF9faW50NjQgbG9uZyBsb25nCi0jZW5kaWYKLQotI2VuZGlmCi0KLQotCmRpZmYgLS1naXQgYS9vcy9uZXR3YXJlL3V0aWxfbncuYyBiL29zL25ldHdhcmUvdXRpbF9udy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzIxOTgxLi4wMDAwMDAwCi0tLSBhL29zL25ldHdhcmUvdXRpbF9udy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBiYXNlZCB1cG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUKLSAqIG9yaWdpbmFsbHkgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsCi0gKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICovCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiYXByX3N0cmluZ3MuaCIKLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotCi1BUF9ERUNMQVJFKGFwcl9zdGF0dXNfdCkgYXBfb3NfY3JlYXRlX3ByaXZpbGVnZWRfcHJvY2VzcygKLSAgICBjb25zdCByZXF1ZXN0X3JlYyAqciwKLSAgICBhcHJfcHJvY190ICpuZXdwcm9jLCBjb25zdCBjaGFyICpwcm9nbmFtZSwKLSAgICBjb25zdCBjaGFyICogY29uc3QgKmFyZ3MsCi0gICAgY29uc3QgY2hhciAqIGNvbnN0ICplbnYsCi0gICAgYXByX3Byb2NhdHRyX3QgKmF0dHIsIGFwcl9wb29sX3QgKnApCi17Ci0gICAgcmV0dXJuIEFQUl9FTk9USU1QTDsKLX0KZGlmZiAtLWdpdCBhL29zL29zMi8uY3ZzaWdub3JlIGIvb3Mvb3MyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYzdhN2MuLjAwMDAwMDAKLS0tIGEvb3Mvb3MyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYWtlZmlsZQpkaWZmIC0tZ2l0IGEvb3Mvb3MyL01ha2VmaWxlLmluIGIvb3Mvb3MyL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDNhYzNmLi4wMDAwMDAwCi0tLSBhL29zL29zMi9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQotREVQVEggICAgID0gLi4vLi4KLXRvcHNyY2RpciA9IEB0b3BzcmNkaXJACi1zcmNkaXIgICAgPSBAc3JjZGlyQAotVlBBVEggICAgID0gQHNyY2RpckAKLQotTFRMSUJSQVJZX05BTUUgICAgPSBsaWJvcy5sYQotTFRMSUJSQVJZX1NPVVJDRVMgPSBvcy5jIG9zLWlubGluZS5jIHV0aWxfb3MyLmMgaW9sX3NvY2tldC5jCi0KLWluY2x1ZGUgJCh0b3BzcmNkaXIpL2J1aWxkL2x0bGliLm1rCmRpZmYgLS1naXQgYS9vcy9vczIvY29uZmlnLm00IGIvb3Mvb3MyL2NvbmZpZy5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZiYWIwMi4uMDAwMDAwMAotLS0gYS9vcy9vczIvY29uZmlnLm00CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1pZiB0ZXN0ICIkT1MiID0gIm9zMiIgOyB0aGVuCi0gIENGTEFHUz0iJENGTEFHUyAtRE9TMiAtTzIiCi0gIExERkxBR1M9IiRMREZMQUdTIC1aZXhlIgotZmkKZGlmZiAtLWdpdCBhL29zL29zMi9jb3JlLm1rIGIvb3Mvb3MyL2NvcmUubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYzQzNTYuLjAwMDAwMDAKLS0tIGEvb3Mvb3MyL2NvcmUubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgU29tZSBydWxlcyBmb3IgbWFraW5nIGEgc2hhcmVkIGNvcmUgZGxsIG9uIE9TLzIKLQotb3MyY29yZTogaHR0cGQuZGxsICQoQ09SRV9JTVBMSUIpCi0JJChMSUJUT09MKSAtLW1vZGU9bGluayBnY2MgJChFWFRSQV9MREZMQUdTKSAtbyBodHRwZCAkKENPUkVfSU1QTElCKQotCi1odHRwZC5kbGw6ICQoUFJPR1JBTV9ERVBFTkRFTkNJRVMpICQoQ09SRV9JTVBMSUIpCi0JJChMSU5LKSAtWmRsbCAkKEVYVFJBX0xERkxBR1MpIC1zIC1vICRAIHNlcnZlci9leHBvcnRzLmxvIG1vZHVsZXMubG8gJChQUk9HUkFNX0RFUEVOREVOQ0lFUykgJChFWFRSQV9MSUJTKSBzZXJ2ZXIvQXBhY2hlQ29yZU9TMi5kZWYKZGlmZiAtLWdpdCBhL29zL29zMi9jb3JlX2hlYWRlci5kZWYgYi9vcy9vczIvY29yZV9oZWFkZXIuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWUwMmZiLi4wMDAwMDAwCi0tLSBhL29zL29zMi9jb3JlX2hlYWRlci5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1MSUJSQVJZIGh0dHBkIElOSVRJTlNUQU5DRQotREVTQ1JJUFRJT04gIkFwYWNoZSBTZXJ2ZXIgQ29yZSIKLUVYUE9SVFMKLSAgIm1haW4iCi0gICJhcF9teV9nZW5lcmF0aW9uIgotICAiYXBfcmVzdGFydF90aW1lIgotICAiYXBfZXh0ZW5kZWRfc3RhdHVzIgotICAiYXBfc2NvcmVib2FyZF9pbWFnZSIKLSAgImFwX2NvbmZ0cmVlIgotICAiYXBfc2VydmVyX3Jvb3QiCi0gICJhcF90b3BfbW9kdWxlIgpkaWZmIC0tZ2l0IGEvb3Mvb3MyL29zLmggYi9vcy9vczIvb3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcxN2YxZi4uMDAwMDAwMAotLS0gYS9vcy9vczIvb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLSNpZm5kZWYgQVBBQ0hFX09TX0gKLSNkZWZpbmUgQVBBQ0hFX09TX0gKLQotI2RlZmluZSBQTEFURk9STSAiT1MvMiIKLSNkZWZpbmUgSEFWRV9DQU5PTklDQUxfRklMRU5BTUUKLSNkZWZpbmUgSEFWRV9EUklWRV9MRVRURVJTCi0KLS8qCi0gKiBUaGlzIGZpbGUgaW4gaW5jbHVkZWQgaW4gYWxsIEFwYWNoZSBzb3VyY2UgY29kZS4gSXQgY29udGFpbnMgZGVmaW5pdGlvbnMKLSAqIG9mIGZhY2lsaXRpZXMgYXZhaWxhYmxlIG9uIF90aGlzXyBvcGVyYXRpbmcgc3lzdGVtIChIQVZFXyogbWFjcm9zKSwKLSAqIGFuZCBwcm90b3R5cGVzIG9mIE9TIHNwZWNpZmljIGZ1bmN0aW9ucyBkZWZpbmVkIGluIG9zLmMgb3Igb3MtaW5saW5lLmMKLSAqLwotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoSU5MSU5FKQotLyogQ29tcGlsZXIgc3VwcG9ydHMgaW5saW5lLCBzbyBpbmNsdWRlIHRoZSBpbmxpbmVhYmxlIGZ1bmN0aW9ucyBhcwotICogcGFydCBvZiB0aGUgaGVhZGVyCi0gKi8KLSNkZWZpbmUgSU5MSU5FIGV4dGVybiBfX2lubGluZV9fCi0KLUlOTElORSBpbnQgYXBfb3NfaXNfcGF0aF9hYnNvbHV0ZShjb25zdCBjaGFyICpmaWxlKTsKLQotI2luY2x1ZGUgIm9zLWlubGluZS5jIgotI2VuZGlmCi0KLSNpZm5kZWYgSU5MSU5FCi0vKiBDb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IGlubGluZSwgc28gcHJvdG90eXBlIHRoZSBpbmxpbmVhYmxlIGZ1bmN0aW9ucwotICogYXMgbm9ybWFsCi0gKi8KLWV4dGVybiBpbnQgYXBfb3NfaXNfcGF0aF9hYnNvbHV0ZShjb25zdCBjaGFyICpmaWxlKTsKLSNlbmRpZgotCi0vKiBGSVhNRTogdGhlIGZvbGxvd2luZyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgb24gdGhpcyBwbGF0Zm9ybSAqLwotI2RlZmluZSBhcF9vc19pc19maWxlbmFtZV92YWxpZChmKSAgICAgICAgICgxKQotCi0vKiBVc2UgYSBzcGVjaWFsaXplZCBraWxsKCkgZnVuY3Rpb24gKi8KLWludCBhcF9vc19raWxsKGludCBwaWQsIGludCBzaWcpOwotCi0vKiBNYXBzIGFuIE9TIGVycm9yIGNvZGUgdG8gYW4gZXJyb3IgbWVzc2FnZSAqLwotY2hhciAqYXBfb3NfZXJyb3JfbWVzc2FnZShpbnQgZXJyKTsKLQotLyogT1MvMiBkb2Vzbid0IGhhdmUgc3ltbGlua3Mgc28gU19JU0xOSyBpcyBhbHdheXMgZmFsc2UgKi8KLSNkZWZpbmUgU19JU0xOSyhtKSAwCi0KLS8qIER5bmFtaWMgbG9hZGluZyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgICAgIGFwX29zX2Rzb19oYW5kbGVfdCAgdW5zaWduZWQgbG9uZwotdm9pZCAgICAgICAgYXBfb3NfZHNvX2luaXQodm9pZCk7Ci1hcF9vc19kc29faGFuZGxlX3QgYXBfb3NfZHNvX2xvYWQoY29uc3QgY2hhciAqKTsKLXZvaWQgICAgICAgIGFwX29zX2Rzb191bmxvYWQoYXBfb3NfZHNvX2hhbmRsZV90KTsKLXZvaWQgKiAgICAgIGFwX29zX2Rzb19zeW0oYXBfb3NfZHNvX2hhbmRsZV90LCBjb25zdCBjaGFyICopOwotY29uc3QgY2hhciAqYXBfb3NfZHNvX2Vycm9yKHZvaWQpOwotCi0jZW5kaWYgICAvKiAhIEFQQUNIRV9PU19IICovCmRpZmYgLS1naXQgYS9vcy9vczIvdXRpbF9vczIuYyBiL29zL29zMi91dGlsX29zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjBlYTYxLi4wMDAwMDAwCi0tLSBhL29zL29zMi91dGlsX29zMi5jCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotI2RlZmluZSBJTkNMX0RPUwotI2RlZmluZSBJTkNMX0RPU0VSUk9SUwotI2luY2x1ZGUgPG9zMi5oPgotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLQotCi1BUElfRVhQT1JUKGNoYXIgKilhcF9vc19jYW5vbmljYWxfZmlsZW5hbWUocG9vbCAqcFBvb2wsIGNvbnN0IGNoYXIgKnN6RmlsZSkKLXsKLSAgICBjaGFyIGJ1ZltIVUdFX1NUUklOR19MRU5dOwotICAgIGNoYXIgYnVmMltIVUdFX1NUUklOR19MRU5dOwotICAgIGludCByYywgbGVuOyAKLSAgICBjaGFyICpwb3M7Ci0gICAgCi0vKiBSZW1vdmUgdHJhaWxpbmcgc2xhc2ggdW5sZXNzIGl0J3MgYSByb290IGRpcmVjdG9yeSAqLwotICAgIHN0cmNweShidWYsIHN6RmlsZSk7Ci0gICAgbGVuID0gc3RybGVuKGJ1Zik7Ci0gICAgCi0gICAgaWYgKGxlbiA+IDMgJiYgYnVmW2xlbi0xXSA9PSAnLycpCi0gICAgICAgIGJ1ZlstLWxlbl0gPSAwOwotICAgICAgCi0gICAgcmMgPSBEb3NRdWVyeVBhdGhJbmZvKGJ1ZiwgRklMX1FVRVJZRlVMTE5BTUUsIGJ1ZjIsIEhVR0VfU1RSSU5HX0xFTik7Ci0KLSAgICBpZiAocmMpIHsKLSAgICAgICAgaWYgKCByYyAhPSBFUlJPUl9JTlZBTElEX05BTUUgKSB7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSfEFQTE9HX05PRVJSTk8sIE5VTEwsICJPUy8yIGVycm9yICVkIGZvciBmaWxlICVzIiwgcmMsIHN6RmlsZSk7Ci0gICAgICAgICAgICByZXR1cm4gYXBfcHN0cmR1cChwUG9vbCwgIiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGFwX3BzdHJkdXAocFBvb2wsIHN6RmlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdHJsd3IoYnVmMik7Ci0gICAgCi0vKiBTd2l0Y2ggYmFja3NsYXNoZXMgdG8gZm9yd2FyZCAqLwotICAgIGZvciAocG9zPWJ1ZjI7ICpwb3M7IHBvcysrKQotICAgICAgICBpZiAoKnBvcyA9PSAnXFwnKQotICAgICAgICAgICAgKnBvcyA9ICcvJzsKLSAgICAKLSAgICByZXR1cm4gYXBfcHN0cmR1cChwUG9vbCwgYnVmMik7Ci19Ci0KLQotCi1pbnQgYXBfb3Nfa2lsbChwaWRfdCBwaWQsIGludCBzaWcpCi17Ci0vKiBTSUdURVJNJ3MgZG9uJ3Qgd29yayB0b28gd2VsbCBpbiBPUy8yIChvbmx5IGFmZmVjdHMgb3RoZXIgRU1YIHByb2dyYW1zKS4KLSAgIENHSXMgbWF5IG5vdCBiZSwgZXNwLiBSRVhYIHNjcmlwdHMsIHNvIHVzZSBhIG5hdGl2ZSBjYWxsIGluc3RlYWQgKi8KLSAgIAotICAgIGludCByYzsKLSAgICAKLSAgICBpZiAoIHNpZyA9PSBTSUdURVJNICkgewotICAgICAgICByYyA9IERvc1NlbmRTaWduYWxFeGNlcHRpb24oIHBpZCwgWENQVF9TSUdOQUxfQlJFQUsgKTsKLSAgICAgICAgCi0gICAgICAgIGlmICggcmMgKSB7Ci0gICAgICAgICAgICBlcnJubyA9IEVTUkNIOwotICAgICAgICAgICAgcmMgPSAtMTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJjID0ga2lsbChwaWQsIHNpZyk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByYzsKLX0KLQotCi0KLWNoYXIgKmFwX29zX2Vycm9yX21lc3NhZ2UoaW50IGVycikKLXsKLSAgc3RhdGljIGNoYXIgcmVzdWx0WzIwMF07Ci0gIGNoYXIgbWVzc2FnZVtIVUdFX1NUUklOR19MRU5dOwotICBVTE9ORyBsZW47Ci0gIGNoYXIgKnBvczsKLSAgaW50IGM7Ci0gIAotICBpZiAoRG9zR2V0TWVzc2FnZShOVUxMLCAwLCBtZXNzYWdlLCBIVUdFX1NUUklOR19MRU4sIGVyciwgIk9TTzAwMS5NU0ciLCAmbGVuKSA9PSAwKSB7Ci0gICAgICBsZW4tLTsKLSAgICAgIG1lc3NhZ2VbbGVuXSA9IDA7Ci0gICAgICBwb3MgPSByZXN1bHQ7Ci0gIAotICAgICAgaWYgKGxlbiA+PSBzaXplb2YocmVzdWx0KSkKLSAgICAgICAgbGVuID0gc2l6ZW9mKHJlc3VsdC0xKTsKLQotICAgICAgZm9yIChjPTA7IGM8bGVuOyBjKyspIHsKLSAgICAgICAgICB3aGlsZSAoaXNzcGFjZShtZXNzYWdlW2NdKSAmJiBpc3NwYWNlKG1lc3NhZ2VbYysxXSkpIC8qIHNraXAgbXVsdGlwbGUgd2hpdGVzcGFjZSAqLwotICAgICAgICAgICAgICBjKys7Ci0gICAgICAgICAgKihwb3MrKykgPSBpc3NwYWNlKG1lc3NhZ2VbY10pID8gJyAnIDogbWVzc2FnZVtjXTsKLSAgICAgIH0KLSAgCi0gICAgICAqcG9zID0gMDsKLSAgfSBlbHNlIHsKLSAgICAgIHNwcmludGYocmVzdWx0LCAiT1MvMiBlcnJvciAlZCIsIGVycik7Ci0gIH0KLSAgCi0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS9vcy90cGYvLmN2c2lnbm9yZSBiL29zL3RwZi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDVmZTA2Li4wMDAwMDAwCi0tLSBhL29zL3RwZi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1NYWtlZmlsZQotLmRlcHMKZGlmZiAtLWdpdCBhL29zL3RwZi9UUEZFeHBvcnQgYi9vcy90cGYvVFBGRXhwb3J0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDllYmYyLi4wMDAwMDAwCi0tLSBhL29zL3RwZi9UUEZFeHBvcnQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMhL2Jpbi9zaAotZWNobyAiIFNldHRpbmcgVFBGL2M4OSBlbnZpcm9ubWVudCB2YXJpYWJsZXMiCi1leHBvcnQgX0M4OV9DQ01PREU9MQotIyByZXBsYWNlIHRoZSBmb2xsb3dpbmcgd2l0aCB0aGUgbG9jYXRpb24gb2YgeW91ciBUUEYgaW5jbHVkZSBmaWxlcwotZXhwb3J0IF9DODlfSU5DRElSUz0iL3UvdHBmNDEvY3VycmVudG1haW50L2luY2x1ZGUgL3UvdHBmNDEvY3VycmVudG1haW50L2luY2x1ZGUvb2NvIiAKLWV4cG9ydCBUUEY9WUVTCi1lY2hvICJEb25lIgpkaWZmIC0tZ2l0IGEvb3MvdHBmL2ViY2RpYy5jIGIvb3MvdHBmL2ViY2RpYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTAyOWY0Li4wMDAwMDAwCi0tLSBhL29zL3RwZi9lYmNkaWMuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotCi0jaWZkZWYgQ0hBUlNFVF9FQkNESUMKLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlICJlYmNkaWMuaCIKLS8qCi1UaGlzIGNvZGUgZG9lcyBiYXNpYyBjaGFyYWN0ZXIgbWFwcGluZyBmb3IgSUJNJ3MgVFBGIG9wZXJhdGluZyBzeXN0ZW0uCi1JdCBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgPE1hcnRpbi5LcmFlbWVyQE1jaC5TTkkuRGU+J3MgY29kZSBmb3IKLXRoZSBCUzIwMDAgKGFwYWNoZS9zcmMvb3MvYnMyMDAwL2ViY2RpYy5jKS4KLSovCi0KLS8qCi1CaWplY3RpdmUgRUJDRElDIChjaGFyYWN0ZXIgc2V0IElCTS0xMDQ3KSB0byBVUy1BU0NJSSB0YWJsZToKLVRoaXMgdGFibGUgaXMgYmlqZWN0aXZlIC0gdGhlcmUgYXJlIG5vIGFtYmlnb3VzIG9yIGR1cGxpY2F0ZSBjaGFyYWN0ZXJzLgotKi8KLWNvbnN0IHVuc2lnbmVkIGNoYXIgb3NfdG9hc2NpaV9zdHJpY3RseVsyNTZdID0gewotICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4ODUsIDB4MDksIDB4ODYsIDB4N2YsIC8qIDAwLTBmOiAgICAgICAgICAgKi8KLSAgICAweDg3LCAweDhkLCAweDhlLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAuLi4uLi4uLi4uLi4uLi4uICovCi0gICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHg4ZiwgMHgwYSwgMHgwOCwgMHg5NywgLyogMTAtMWY6ICAgICAgICAgICAqLwotICAgIDB4MTgsIDB4MTksIDB4OWMsIDB4OWQsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIC4uLi4uLi4uLi4uLi4uLi4gKi8KLSAgICAweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDkyLCAweDE3LCAweDFiLCAvKiAyMC0yZjogICAgICAgICAgICovCi0gICAgMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHgwNSwgMHgwNiwgMHgwNywgLyogLi4uLi4uLi4uLi4uLi4uLiAqLwotICAgIDB4OTAsIDB4OTEsIDB4MTYsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4MDQsIC8qIDMwLTNmOiAgICAgICAgICAgKi8KLSAgICAweDk4LCAweDk5LCAweDlhLCAweDliLCAweDE0LCAweDE1LCAweDllLCAweDFhLCAvKiAuLi4uLi4uLi4uLi4uLi4uICovCi0gICAgMHgyMCwgMHhhMCwgMHhlMiwgMHhlNCwgMHhlMCwgMHhlMSwgMHhlMywgMHhlNSwgLyogNDAtNGY6ICAgICAgICAgICAqLwotICAgIDB4ZTcsIDB4ZjEsIDB4YTIsIDB4MmUsIDB4M2MsIDB4MjgsIDB4MmIsIDB4N2MsIC8qICAuLi4uLi4uLi4uLjwoK3wgKi8KLSAgICAweDI2LCAweGU5LCAweGVhLCAweGViLCAweGU4LCAweGVkLCAweGVlLCAweGVmLCAvKiA1MC01ZjogICAgICAgICAgICovCi0gICAgMHhlYywgMHhkZiwgMHgyMSwgMHgyNCwgMHgyYSwgMHgyOSwgMHgzYiwgMHg1ZSwgLyogJi4uLi4uLi4uLiEkKik7XiAqLwotICAgIDB4MmQsIDB4MmYsIDB4YzIsIDB4YzQsIDB4YzAsIDB4YzEsIDB4YzMsIDB4YzUsIC8qIDYwLTZmOiAgICAgICAgICAgKi8KLSAgICAweGM3LCAweGQxLCAweGE2LCAweDJjLCAweDI1LCAweDVmLCAweDNlLCAweDNmLCAvKiAtLy4uLi4uLi4uLiwlXz4/ICovCi0gICAgMHhmOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjOCwgMHhjZCwgMHhjZSwgMHhjZiwgLyogNzAtN2Y6ICAgICAgICAgICAqLwotICAgIDB4Y2MsIDB4NjAsIDB4M2EsIDB4MjMsIDB4NDAsIDB4MjcsIDB4M2QsIDB4MjIsIC8qIC4uLi4uLi4uLmA6I0AnPSIgKi8KLSAgICAweGQ4LCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiA4MC04ZjogICAgICAgICAgICovCi0gICAgMHg2OCwgMHg2OSwgMHhhYiwgMHhiYiwgMHhmMCwgMHhmZCwgMHhmZSwgMHhiMSwgLyogLmFiY2RlZmdoaS4uLi4uLiAqLwotICAgIDB4YjAsIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIDB4NzAsIC8qIDkwLTlmOiAgICAgICAgICAgKi8KLSAgICAweDcxLCAweDcyLCAweGFhLCAweGJhLCAweGU2LCAweGI4LCAweGM2LCAweGE0LCAvKiAuamtsbW5vcHFyLi4uLi4uICovCi0gICAgMHhiNSwgMHg3ZSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgLyogYTAtYWY6ICAgICAgICAgICAqLwotICAgIDB4NzksIDB4N2EsIDB4YTEsIDB4YmYsIDB4ZDAsIDB4NWIsIDB4ZGUsIDB4YWUsIC8qIC5+c3R1dnd4eXouLi5bLi4gKi8KLSAgICAweGFjLCAweGEzLCAweGE1LCAweGI3LCAweGE5LCAweGE3LCAweGI2LCAweGJjLCAvKiBiMC1iZjogICAgICAgICAgICovCi0gICAgMHhiZCwgMHhiZSwgMHhkZCwgMHhhOCwgMHhhZiwgMHg1ZCwgMHhiNCwgMHhkNywgLyogLi4uLi4uLi4uLi4uLl0uLiAqLwotICAgIDB4N2IsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIGMwLWNmOiAgICAgICAgICAgKi8KLSAgICAweDQ4LCAweDQ5LCAweGFkLCAweGY0LCAweGY2LCAweGYyLCAweGYzLCAweGY1LCAvKiB7QUJDREVGR0hJLi4uLi4uICovCi0gICAgMHg3ZCwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgMHg1MCwgLyogZDAtZGY6ICAgICAgICAgICAqLwotICAgIDB4NTEsIDB4NTIsIDB4YjksIDB4ZmIsIDB4ZmMsIDB4ZjksIDB4ZmEsIDB4ZmYsIC8qIH1KS0xNTk9QUVIuLi4uLi4gKi8KLSAgICAweDVjLCAweGY3LCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAvKiBlMC1lZjogICAgICAgICAgICovCi0gICAgMHg1OSwgMHg1YSwgMHhiMiwgMHhkNCwgMHhkNiwgMHhkMiwgMHhkMywgMHhkNSwgLyogXC5TVFVWV1hZWi4uLi4uLiAqLwotICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIGYwLWZmOiAgICAgICAgICAgKi8KLSAgICAweDM4LCAweDM5LCAweGIzLCAweGRiLCAweGRjLCAweGQ5LCAweGRhLCAweDlmICAvKiAwMTIzNDU2Nzg5Li4uLi4uICovCi19OwotCi0vKgotU2VydmVyIEVCQ0RJQyAoY2hhcmFjdGVyIHNldCBJQk0tMTA0NykgdG8gVVMtQVNDSUkgdGFibGU6Ci1UaGlzIHRhYmxlIGlzIGEgY29weSBvZiB0aGUgb3NfdG9hc2NpaV9zdHJpY3RseSBiaWplY3RpdmUgdGFibGUgYWJvdmUuCi1UaGUgb25seSBjaGFuZ2UgaXMgdGhhdCBoZXggMGEgKFwwMTIgb2N0YWwpIGlzIG1hcHBlZCB0byBoZXggMGEKLShBU0NJSSdzIGxpbmUgZmVlZCkgaW5zdGVhZCBvZiBoZXggOGUuICBUaGlzIGlzIGRvbmUgYmVjYXVzZSB0aHJvdWdob3V0Ci1BcGFjaGUsIHByb3RvY29sIHN0cmluZyBkZWZpbml0aW9ucyBoYXJkY29kZSB0aGUgbGluZWZlZWQgYXMgXDAxMiAob2N0YWwpOgotIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpblwwMTVcMDEyIi4gIFdpdGhvdXQgdGhpcyBrbHVkZ2UgYWxsIHByb3RvY29sCi1zdHJpbmcgZGVmaW5pdGlvbnMgd291bGQgbmVlZCB0byBiZSBjaGFuZ2VkIGZyb20gLi4uXDAxMiB0byAuLi5cMDI1LgotKi8KLWNvbnN0IHVuc2lnbmVkIGNoYXIgb3NfdG9hc2NpaVsyNTZdID0gewotICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4ODUsIDB4MDksIDB4ODYsIDB4N2YsIC8qIDAwLTBmOiAgICAgICAgICAgKi8KLSAgICAweDg3LCAweDhkLCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAuLi4uLi4uLi4uLi4uLi4uICovCi0gICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHg4ZiwgMHgwYSwgMHgwOCwgMHg5NywgLyogMTAtMWY6ICAgICAgICAgICAqLwotICAgIDB4MTgsIDB4MTksIDB4OWMsIDB4OWQsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIC4uLi4uLi4uLi4uLi4uLi4gKi8KLSAgICAweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDkyLCAweDE3LCAweDFiLCAvKiAyMC0yZjogICAgICAgICAgICovCi0gICAgMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHgwNSwgMHgwNiwgMHgwNywgLyogLi4uLi4uLi4uLi4uLi4uLiAqLwotICAgIDB4OTAsIDB4OTEsIDB4MTYsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4MDQsIC8qIDMwLTNmOiAgICAgICAgICAgKi8KLSAgICAweDk4LCAweDk5LCAweDlhLCAweDliLCAweDE0LCAweDE1LCAweDllLCAweDFhLCAvKiAuLi4uLi4uLi4uLi4uLi4uICovCi0gICAgMHgyMCwgMHhhMCwgMHhlMiwgMHhlNCwgMHhlMCwgMHhlMSwgMHhlMywgMHhlNSwgLyogNDAtNGY6ICAgICAgICAgICAqLwotICAgIDB4ZTcsIDB4ZjEsIDB4YTIsIDB4MmUsIDB4M2MsIDB4MjgsIDB4MmIsIDB4N2MsIC8qICAuLi4uLi4uLi4uLjwoK3wgKi8KLSAgICAweDI2LCAweGU5LCAweGVhLCAweGViLCAweGU4LCAweGVkLCAweGVlLCAweGVmLCAvKiA1MC01ZjogICAgICAgICAgICovCi0gICAgMHhlYywgMHhkZiwgMHgyMSwgMHgyNCwgMHgyYSwgMHgyOSwgMHgzYiwgMHg1ZSwgLyogJi4uLi4uLi4uLiEkKik7XiAqLwotICAgIDB4MmQsIDB4MmYsIDB4YzIsIDB4YzQsIDB4YzAsIDB4YzEsIDB4YzMsIDB4YzUsIC8qIDYwLTZmOiAgICAgICAgICAgKi8KLSAgICAweGM3LCAweGQxLCAweGE2LCAweDJjLCAweDI1LCAweDVmLCAweDNlLCAweDNmLCAvKiAtLy4uLi4uLi4uLiwlXz4/ICovCi0gICAgMHhmOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjOCwgMHhjZCwgMHhjZSwgMHhjZiwgLyogNzAtN2Y6ICAgICAgICAgICAqLwotICAgIDB4Y2MsIDB4NjAsIDB4M2EsIDB4MjMsIDB4NDAsIDB4MjcsIDB4M2QsIDB4MjIsIC8qIC4uLi4uLi4uLmA6I0AnPSIgKi8KLSAgICAweGQ4LCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiA4MC04ZjogICAgICAgICAgICovCi0gICAgMHg2OCwgMHg2OSwgMHhhYiwgMHhiYiwgMHhmMCwgMHhmZCwgMHhmZSwgMHhiMSwgLyogLmFiY2RlZmdoaS4uLi4uLiAqLwotICAgIDB4YjAsIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIDB4NzAsIC8qIDkwLTlmOiAgICAgICAgICAgKi8KLSAgICAweDcxLCAweDcyLCAweGFhLCAweGJhLCAweGU2LCAweGI4LCAweGM2LCAweGE0LCAvKiAuamtsbW5vcHFyLi4uLi4uICovCi0gICAgMHhiNSwgMHg3ZSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgLyogYTAtYWY6ICAgICAgICAgICAqLwotICAgIDB4NzksIDB4N2EsIDB4YTEsIDB4YmYsIDB4ZDAsIDB4NWIsIDB4ZGUsIDB4YWUsIC8qIC5+c3R1dnd4eXouLi5bLi4gKi8KLSAgICAweGFjLCAweGEzLCAweGE1LCAweGI3LCAweGE5LCAweGE3LCAweGI2LCAweGJjLCAvKiBiMC1iZjogICAgICAgICAgICovCi0gICAgMHhiZCwgMHhiZSwgMHhkZCwgMHhhOCwgMHhhZiwgMHg1ZCwgMHhiNCwgMHhkNywgLyogLi4uLi4uLi4uLi4uLl0uLiAqLwotICAgIDB4N2IsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIGMwLWNmOiAgICAgICAgICAgKi8KLSAgICAweDQ4LCAweDQ5LCAweGFkLCAweGY0LCAweGY2LCAweGYyLCAweGYzLCAweGY1LCAvKiB7QUJDREVGR0hJLi4uLi4uICovCi0gICAgMHg3ZCwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgMHg1MCwgLyogZDAtZGY6ICAgICAgICAgICAqLwotICAgIDB4NTEsIDB4NTIsIDB4YjksIDB4ZmIsIDB4ZmMsIDB4ZjksIDB4ZmEsIDB4ZmYsIC8qIH1KS0xNTk9QUVIuLi4uLi4gKi8KLSAgICAweDVjLCAweGY3LCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAvKiBlMC1lZjogICAgICAgICAgICovCi0gICAgMHg1OSwgMHg1YSwgMHhiMiwgMHhkNCwgMHhkNiwgMHhkMiwgMHhkMywgMHhkNSwgLyogXC5TVFVWV1hZWi4uLi4uLiAqLwotICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIGYwLWZmOiAgICAgICAgICAgKi8KLSAgICAweDM4LCAweDM5LCAweGIzLCAweGRiLCAweGRjLCAweGQ5LCAweGRhLCAweDlmICAvKiAwMTIzNDU2Nzg5Li4uLi4uICovCi19OwotCi0vKgotVGhlIFVTLUFTQ0lJIHRvIEVCQ0RJQyAoY2hhcmFjdGVyIHNldCBJQk0tMTA0NykgdGFibGU6Ci1UaGlzIHRhYmxlIGlzIGJpamVjdGl2ZSAobm8gYW1iaWd1b3VzIG9yIGR1cGxpY2F0ZSBjaGFyYWN0ZXJzKQotKi8KLWNvbnN0IHVuc2lnbmVkIGNoYXIgb3NfdG9lYmNkaWNbMjU2XSA9IHsKLSAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDM3LCAweDJkLCAweDJlLCAweDJmLCAvKiAwMC0wZjogICAgICAgICAgICovCi0gICAgMHgxNiwgMHgwNSwgMHgxNSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogLi4uLi4uLi4uLi4uLi4uLiAqLwotICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4M2MsIDB4M2QsIDB4MzIsIDB4MjYsIC8qIDEwLTFmOiAgICAgICAgICAgKi8KLSAgICAweDE4LCAweDE5LCAweDNmLCAweDI3LCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAuLi4uLi4uLi4uLi4uLi4uICovCi0gICAgMHg0MCwgMHg1YSwgMHg3ZiwgMHg3YiwgMHg1YiwgMHg2YywgMHg1MCwgMHg3ZCwgLyogMjAtMmY6ICAgICAgICAgICAqLwotICAgIDB4NGQsIDB4NWQsIDB4NWMsIDB4NGUsIDB4NmIsIDB4NjAsIDB4NGIsIDB4NjEsIC8qICAhIiMkJSYnKCkqKywtLi8gKi8KLSAgICAweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAzMC0zZjogICAgICAgICAgICovCi0gICAgMHhmOCwgMHhmOSwgMHg3YSwgMHg1ZSwgMHg0YywgMHg3ZSwgMHg2ZSwgMHg2ZiwgLyogMDEyMzQ1Njc4OTo7PD0+PyAqLwotICAgIDB4N2MsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDQwLTRmOiAgICAgICAgICAgKi8KLSAgICAweGM4LCAweGM5LCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAvKiBAQUJDREVGR0hJSktMTU5PICovCi0gICAgMHhkNywgMHhkOCwgMHhkOSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgLyogNTAtNWY6ICAgICAgICAgICAqLwotICAgIDB4ZTcsIDB4ZTgsIDB4ZTksIDB4YWQsIDB4ZTAsIDB4YmQsIDB4NWYsIDB4NmQsIC8qIFBRUlNUVVZXWFlaW1xdXl8gKi8KLSAgICAweDc5LCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiA2MC02ZjogICAgICAgICAgICovCi0gICAgMHg4OCwgMHg4OSwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgLyogYGFiY2RlZmdoaWprbG1ubyAqLwotICAgIDB4OTcsIDB4OTgsIDB4OTksIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIC8qIDcwLTdmOiAgICAgICAgICAgKi8KLSAgICAweGE3LCAweGE4LCAweGE5LCAweGMwLCAweDRmLCAweGQwLCAweGExLCAweDA3LCAvKiBwcXJzdHV2d3h5ent8fX4uICovCi0gICAgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgwNCwgMHgwNiwgMHgwOCwgLyogODAtOGY6ICAgICAgICAgICAqLwotICAgIDB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MDksIDB4MGEsIDB4MTQsIC8qIC4uLi4uLi4uLi4uLi4uLi4gKi8KLSAgICAweDMwLCAweDMxLCAweDI1LCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDE3LCAvKiA5MC05ZjogICAgICAgICAgICovCi0gICAgMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgxYSwgMHgxYiwgMHgzZSwgMHhmZiwgLyogLi4uLi4uLi4uLi4uLi4uLiAqLwotICAgIDB4NDEsIDB4YWEsIDB4NGEsIDB4YjEsIDB4OWYsIDB4YjIsIDB4NmEsIDB4YjUsIC8qIGEwLWFmOiAgICAgICAgICAgKi8KLSAgICAweGJiLCAweGI0LCAweDlhLCAweDhhLCAweGIwLCAweGNhLCAweGFmLCAweGJjLCAvKiAuLi4uLi4uLi4uLi4uLi4uICovCi0gICAgMHg5MCwgMHg4ZiwgMHhlYSwgMHhmYSwgMHhiZSwgMHhhMCwgMHhiNiwgMHhiMywgLyogYjAtYmY6ICAgICAgICAgICAqLwotICAgIDB4OWQsIDB4ZGEsIDB4OWIsIDB4OGIsIDB4YjcsIDB4YjgsIDB4YjksIDB4YWIsIC8qIC4uLi4uLi4uLi4uLi4uLi4gKi8KLSAgICAweDY0LCAweDY1LCAweDYyLCAweDY2LCAweDYzLCAweDY3LCAweDllLCAweDY4LCAvKiBjMC1jZjogICAgICAgICAgICovCi0gICAgMHg3NCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3OCwgMHg3NSwgMHg3NiwgMHg3NywgLyogLi4uLi4uLi4uLi4uLi4uLiAqLwotICAgIDB4YWMsIDB4NjksIDB4ZWQsIDB4ZWUsIDB4ZWIsIDB4ZWYsIDB4ZWMsIDB4YmYsIC8qIGQwLWRmOiAgICAgICAgICAgKi8KLSAgICAweDgwLCAweGZkLCAweGZlLCAweGZiLCAweGZjLCAweGJhLCAweGFlLCAweDU5LCAvKiAuLi4uLi4uLi4uLi4uLi4uICovCi0gICAgMHg0NCwgMHg0NSwgMHg0MiwgMHg0NiwgMHg0MywgMHg0NywgMHg5YywgMHg0OCwgLyogZTAtZWY6ICAgICAgICAgICAqLwotICAgIDB4NTQsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTgsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIC4uLi4uLi4uLi4uLi4uLi4gKi8KLSAgICAweDhjLCAweDQ5LCAweGNkLCAweGNlLCAweGNiLCAweGNmLCAweGNjLCAweGUxLCAvKiBmMC1mZjogICAgICAgICAgICovCi0gICAgMHg3MCwgMHhkZCwgMHhkZSwgMHhkYiwgMHhkYywgMHg4ZCwgMHg4ZSwgMHhkZiAgLyogLi4uLi4uLi4uLi4uLi4uLiAqLwotfTsKLQotLyogVHJhbnNsYXRlIGEgbWVtb3J5IGJsb2NrIGZyb20gRUJDRElDIChob3N0IGNoYXJzZXQpIHRvIEFTQ0lJIChuZXQgY2hhcnNldCkKLSAqIGRlc3QgYW5kIHNyY2UgbWF5IGJlIGlkZW50aWNhbCwgb3Igc2VwYXJhdGUgbWVtb3J5IGJsb2NrcywgYnV0Ci0gKiBzaG91bGQgbm90IG92ZXJsYXAuCi0gKi8KLXZvaWQKLWViY2RpYzJhc2NpaSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmNlLCBzaXplX3QgY291bnQpCi17Ci0gICAgdW5zaWduZWQgY2hhciAqdWRlc3QgPSBkZXN0OwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnVzcmNlID0gc3JjZTsKLSAgICB3aGlsZSAoY291bnQtLSAhPSAwKSB7Ci0gICAgICAgICp1ZGVzdCsrID0gb3NfdG9hc2NpaVsqdXNyY2UrK107Ci0gICAgfQotfQotdm9pZAotZWJjZGljMmFzY2lpX3N0cmljdGx5KHVuc2lnbmVkIGNoYXIgKmRlc3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY2UsIHNpemVfdCBjb3VudCkKLXsKLSAgICB3aGlsZSAoY291bnQtLSAhPSAwKSB7Ci0gICAgICAgICpkZXN0KysgPSBvc190b2FzY2lpX3N0cmljdGx5WypzcmNlKytdOwotICAgIH0KLX0KLXZvaWQKLWFzY2lpMmViY2RpYyh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmNlLCBzaXplX3QgY291bnQpCi17Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKnVkZXN0ID0gZGVzdDsKLSAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqdXNyY2UgPSBzcmNlOwotCi0gICAgICAgIHdoaWxlIChjb3VudC0tICE9IDApIHsKLSAgICAgICAgICAgICAgICAqdWRlc3QrKyA9IG9zX3RvZWJjZGljWyp1c3JjZSsrXTsKLSAgICB9Ci19Ci0jZW5kaWYgLypDSEFSU0VUX0VCQ0RJQyovCi0gCmRpZmYgLS1naXQgYS9vcy90cGYvZWJjZGljLmggYi9vcy90cGYvZWJjZGljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YzQxMjAuLjAwMDAwMDAKLS0tIGEvb3MvdHBmL2ViY2RpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIG9zX3RvYXNjaWlbMjU2XTsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIG9zX3RvZWJjZGljWzI1Nl07Ci12b2lkIGViY2RpYzJhc2NpaSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmNlLCBzaXplX3QgY291bnQpOwotdm9pZCBlYmNkaWMyYXNjaWlfc3RyaWN0bHkodW5zaWduZWQgY2hhciAqZGVzdCwgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjZSwgc2l6ZV90IGNvdW50KTsKLXZvaWQgYXNjaWkyZWJjZGljKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyY2UsIHNpemVfdCBjb3VudCk7Ci0KZGlmZiAtLWdpdCBhL29zL3RwZi9vcy5jIGIvb3MvdHBmL29zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NjgyMzIuLjAwMDAwMDAKLS0tIGEvb3MvdHBmL29zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTQgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBUaGlzIGZpbGUgd2lsbCBpbmNsdWRlIE9TIHNwZWNpZmljIGZ1bmN0aW9ucyB3aGljaCBhcmUgbm90IGlubGluZWFibGUuCi0gKiBBbnkgaW5saW5lYWJsZSBmdW5jdGlvbnMgc2hvdWxkIGJlIGRlZmluZWQgaW4gb3MtaW5saW5lLmMgaW5zdGVhZC4KLSAqLwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJvcy5oIgotI2luY2x1ZGUgInNjb3JlYm9hcmQuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfY29uZl9nbG9iYWxzLmgiCi0KLXN0YXRpYyBGSUxFICpzb2NrX2ZwOwotCi0vKiBDaGVjayB0aGUgQ29udGVudC1UeXBlIHRvIGRlY2lkZSBpZiBjb252ZXJzaW9uIGlzIG5lZWRlZCAqLwotaW50IGFwX2NoZWNrY29udihzdHJ1Y3QgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IGNvbnZlcnRfdG9fYXNjaWk7Ci0gICAgY29uc3QgY2hhciAqdHlwZTsKLQotICAgIC8qIFRvIG1ha2Ugc2VydmluZyBvZiAicmF3IEFTQ0lJIHRleHQiIGZpbGVzIGVhc3kgKHRoZXkgc2VydmUgZmFzdGVyIAotICAgICAqIHNpbmNlIHRoZXkgZG9uJ3QgaGF2ZSB0byBiZSBjb252ZXJ0ZWQgZnJvbSBFQkNESUMpLCBhIG5ldwotICAgICAqICJtYWdpYyIgdHlwZSBwcmVmaXggd2FzIGludmVudGVkOiB0ZXh0L3gtYXNjaWkte3BsYWluLGh0bWwsLi4ufQotICAgICAqIElmIHdlIGRldGVjdCBvbmUgb2YgdGhlc2UgY29udGVudCB0eXBlcyBoZXJlLCB3ZSBzaW1wbHkgY29ycmVjdAotICAgICAqIHRoZSB0eXBlIHRvIHRoZSByZWFsIHRleHQve3BsYWluLGh0bWwsLi4ufSB0eXBlLiBPdGhlcndpc2UsIHdlCi0gICAgICogc2V0IGEgZmxhZyB0aGF0IHRyYW5zbGF0aW9uIGlzIHJlcXVpcmVkIGxhdGVyIG9uLgotICAgICAqLwotCi0gICAgdHlwZSA9IChyLT5jb250ZW50X3R5cGUgPT0gTlVMTCkgPyBhcF9kZWZhdWx0X3R5cGUocikgOiByLT5jb250ZW50X3R5cGU7Ci0KLSAgICAvKiBJZiBubyBjb250ZW50IHR5cGUgaXMgc2V0IHRoZW4gdHJlYXQgaXQgYXMgKGViY2RpYykgdGV4dC9wbGFpbiAqLwotICAgIGNvbnZlcnRfdG9fYXNjaWkgPSAodHlwZSA9PSBOVUxMKTsKLQotICAgIC8qIENvbnZlcnNpb24gaXMgYXBwbGllZCB0byB0ZXh0LyBmaWxlcyBvbmx5LCBpZiBldmVyLiAqLwotICAgIGlmICh0eXBlICYmIChzdHJuY2FzZWNtcCh0eXBlLCAidGV4dC8iLCA1KSA9PSAwIHx8Ci0JCSBzdHJuY2FzZWNtcCh0eXBlLCAibWVzc2FnZS8iLCA4KSA9PSAwKSkgewotCWlmIChzdHJuY2FzZWNtcCh0eXBlLCBBU0NJSVRFWFRfTUFHSUNfVFlQRV9QUkVGSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQVNDSUlURVhUX01BR0lDX1RZUEVfUFJFRklYKS0xKSA9PSAwKXsKLQkgICAgci0+Y29udGVudF90eXBlID0gYXBfcHN0cmNhdChyLT5wb29sLCAidGV4dC8iLAotICAgICAgICAgICAgICAgICAgIHR5cGUrc2l6ZW9mKEFTQ0lJVEVYVF9NQUdJQ19UWVBFX1BSRUZJWCktMSwgTlVMTCk7Ci0gICAgICAgICAgICBpZiAoci0+bWV0aG9kX251bWJlciA9PSBNX1BVVCkKLSAgICAgICAgICAgICAgICAgICBhcF9ic2V0ZmxhZyhyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJfQVNDSUkyRUJDRElDLCAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICBlbHNlCi0JICAgIC8qIHRyYW5zbGF0ZSBFQkNESUMgdG8gQVNDSUkgKi8KLQkgICAgY29udmVydF90b19hc2NpaSA9IDE7Ci0gICAgfQotICAgIGVsc2V7Ci0gICAgICAgICAgIGlmIChyLT5tZXRob2RfbnVtYmVyID09IE1fUFVUKQotICAgICAgICAgICAgICAgYXBfYnNldGZsYWcoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCX0FTQ0lJMkVCQ0RJQywgMCk7Ci0gICAgICAgICAgICAgICAvKiBkb24ndCB0cmFuc2xhdGUgbm9uLXRleHQgZmlsZXMgdG8gRUJDRElDICovCi0gICAgfQotICAgIC8qIEVuYWJsZSBjb252ZXJzaW9uIGlmIGl0J3MgYSB0ZXh0IGRvY3VtZW50ICovCi0gICAgYXBfYnNldGZsYWcoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCX0VCQ0RJQzJBU0NJSSwgY29udmVydF90b19hc2NpaSk7Ci0KLSAgICByZXR1cm4gY29udmVydF90b19hc2NpaTsKLX0KLQotaW50IHRwZl9zZWxlY3QoaW50IG1heGZkcywgZmRfc2V0ICpyZWFkcywgZmRfc2V0ICp3cml0ZXMsIGZkX3NldCAqZXhjZXB0cywgc3RydWN0IHRpbWV2YWwgKnR2KQotewotLyogV2UncmUgZ29pbmcgdG8gZm9yY2Ugb3VyIHdheSB0aHJvdWdoIHNlbGVjdC4gIFdlJ3JlIG9ubHkgaW50ZXJlc3RlZCByZWFkcyBhbmQgVFBGIGFsbG93cwotICAgMmJpbGxpb24rIHNvY2tldCBkZXNjcmlwdG9ycyBmb3Igd2UgZG9uJ3Qgd2FudCBhbiBmZF9zZXQgdGhhdCBiaWcuICBKdXN0IGFzc3VtZSB0aGF0IG1heGZkcy0xCi0gICBjb250YWlucyB0aGUgc29ja2V0IGRlc2NyaXB0b3Igd2UncmUgaW50ZXJlc3RlZCBpbi4gIElmIGl0J3MgMCwgbGVhdmUgaXQgYWxvbmUuICovCi0KLSAgICBpbnQgc29ja2V0c1sxXTsKLSAgICBpbnQgbm9fcmVhZHMgPSAwOwotICAgIGludCBub193cml0ZXMgPSAwOwotICAgIGludCBub19leGNlcHRzID0gMDsKLSAgICBpbnQgdGltZW91dCA9IDA7Ci0gICAgaW50IHJ2OwotICAgIAotICAgIGlmKG1heGZkcykgewotICAgICAgICBpZih0dikKLSAgICAgICAgICAgIHRpbWVvdXQgPSB0di0+dHZfc2VjICogMTAwMCArIHR2LT50dl91c2VjOwotICAgICAgICBzb2NrZXRzWzBdID0gbWF4ZmRzLTE7Ci0gICAgICAgIG5vX3JlYWRzKys7Ci0gICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHNvY2tldHNbMF0gPSAwOwotICAgICAgICAKLSAgICBhcF9jaGVja19zaWduYWxzKCk7Ci0gICAgcnYgPSBzZWxlY3Qoc29ja2V0cywgbm9fcmVhZHMsIG5vX3dyaXRlcywgbm9fZXhjZXB0cywgdGltZW91dCk7Ci0gICAgYXBfY2hlY2tfc2lnbmFscygpOwotICAgIAotICAgIHJldHVybiBydjsKLQotfQotCi1pbnQgdHBmX2FjY2VwdChpbnQgc29ja2ZkLCBzdHJ1Y3Qgc29ja2FkZHIgKnBlZXIsIGludCAqcGFkZHJsZW4pCi17Ci0gICAgaW50IHNvY2tzWzFdOwotICAgIGludCBydjsKLQotICAgIGFwX2NoZWNrX3NpZ25hbHMoKTsKLSAgICBzb2Nrc1swXSA9IHNvY2tmZDsKLSAgICBydiA9IHNlbGVjdChzb2NrcywgMSwgMCwgMCwgMTAwMCk7Ci0gICAgZXJybm8gPSBzb2NrX2Vycm5vKCk7Ci0gICAgaWYocnY+MCkgewotICAgICAgICBhcF9jaGVja19zaWduYWxzKCk7Ci0gICAgICAgIHJ2ID0gYWNjZXB0KHNvY2tmZCwgcGVlciwgcGFkZHJsZW4pOwotICAgICAgICBlcnJubyA9IHNvY2tfZXJybm8oKTsKLSAgICB9ICAgIAotICAgIHJldHVybiBydjsKLX0KLSAgIAotLyogdGhlIGdldHBhc3MgZnVuY3Rpb24gaXMgbm90IHVzYWJsZSBvbiBUUEYgKi8KLWNoYXIgKmdldHBhc3MoY29uc3QgY2hhciogcHJvbXB0KQotewotICAgIGVycm5vID0gRUlPOwotICAgIHJldHVybigoY2hhciAqKU5VTEwpOwotfQotCi0jaWZuZGVmIF9fUElQRV8KLWludCBwaXBlKGludCBmaWxkZXNbMl0pCi17Ci0gICAgZXJybm8gPSBFTk9TWVM7Ci0gICAgcmV0dXJuKC0xKTsKLX0KLSNlbmRpZgotICAKLS8qIGZvcmsgYW5kIGV4ZWMgZnVuY3Rpb25zIGFyZSBub3QgZGVmaW5lZCBvbgotICAgVFBGIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdHBmX2ZvcmsoKSAqLwotIAotcGlkX3QgZm9yayh2b2lkKQotewotICAgIGVycm5vID0gRU5PU1lTOwotICAgIHJldHVybigtMSk7Ci19Ci0KLWludCBleGVjbChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICphcmcwLCAuLi4pCi17Ci0gICAgZXJybm8gPSBFTk9TWVM7Ci0gICAgcmV0dXJuKC0xKTsKLX0KLQotaW50IGV4ZWNsZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICphcmcwLCAuLi4pCi17Ci0gICAgZXJybm8gPSBFTk9TWVM7Ci0gICAgcmV0dXJuKC0xKTsKLX0KLQotaW50IGV4ZWN2ZShjb25zdCBjaGFyICpwYXRoLCBjaGFyICpjb25zdCBhcmd2W10sIGNoYXIgKmNvbnN0IGVudnBbXSkKLXsKLSAgICBlcnJubyA9IEVOT1NZUzsKLSAgICByZXR1cm4oLTEpOwotfQotCi1pbnQgZXhlY3ZwKGNvbnN0IGNoYXIgKmZpbGUsIGNoYXIgKmNvbnN0IGFyZ3ZbXSkKLXsKLSAgICBlcnJubyA9IEVOT1NZUzsKLSAgICByZXR1cm4oLTEpOwotfQotCi0KLQotaW50IGFwX3RwZl9zcGF3bl9jaGlsZChwb29sICpwLCBpbnQgKCpmdW5jKSAodm9pZCAqLCBjaGlsZF9pbmZvICopLAotICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBlbnVtIGtpbGxfY29uZGl0aW9ucyBraWxsX2hvdywKLSAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwaXBlX2luLCBpbnQgKnBpcGVfb3V0LCBpbnQgKnBpcGVfZXJyLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X2Zkc1tdLCBpbnQgaW5fZmRzW10sIGludCBlcnJfZmRzW10pCi0KLXsKLQotICAgaW50ICAgICAgICAgICAgICAgICAgICAgIGksIHRlbXBfb3V0LCB0ZW1wX2luLCB0ZW1wX2Vyciwgc2F2ZV9lcnJubywgcGlkLCByZXN1bHQ9MDsKLSAgIGludCAgICAgICAgICAgICAgICAgICAgICBmZF9mbGFnc19vdXQsIGZkX2ZsYWdzX2luLCBmZF9mbGFnc19lcnI7Ci0gICBzdHJ1Y3QgdHBmX2ZvcmtfaW5wdXQgICAgZm9ya19pbnB1dDsKLSAgIFRQRl9GT1JLX0NISUxEICAgICAgICAgICAqY2xkID0gKFRQRl9GT1JLX0NISUxEICopIGRhdGE7Ci0gICBhcnJheV9oZWFkZXIgICAgICAgICAgICAgKmVudl9hcnIgPSBhcF90YWJsZV9lbHRzICgoYXJyYXlfaGVhZGVyICopIGNsZC0+c3VicHJvY2Vzc19lbnYpOwotICAgdGFibGVfZW50cnkgICAgICAgICAgICAgICplbHRzID0gKHRhYmxlX2VudHJ5ICopIGVudl9hcnItPmVsdHM7Ci0KLQotCi0gICBpZiAoZnVuYykgewotICAgICAgaWYgKHJlc3VsdD1mdW5jKGRhdGEsIE5VTEwpKSB7Ci0gICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAvKiBlcnJvciBmcm9tIGNoaWxkIGZ1bmN0aW9uICovCi0gICAgICB9Ci0gICB9Ci0KLSAgIGlmIChwaXBlX291dCkgewotICAgICAgZmRfZmxhZ3Nfb3V0ID0gZmNudGwob3V0X2Zkc1swXSwgRl9HRVRGRCk7Ci0gICAgICBmY250bChvdXRfZmRzWzBdLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKLSAgICAgIHRlbXBfb3V0ID0gZHVwKFNURE9VVF9GSUxFTk8pOwotICAgICAgZmNudGwodGVtcF9vdXQsIEZfU0VURkQsIEZEX0NMT0VYRUMpOwotICAgICAgZHVwMihvdXRfZmRzWzFdLCBTVERPVVRfRklMRU5PKTsKLSAgIH0KLQotCi0gICBpZiAocGlwZV9pbikgewotICAgICAgZmRfZmxhZ3NfaW4gPSBmY250bChpbl9mZHNbMV0sIEZfR0VURkQpOwotICAgICAgZmNudGwoaW5fZmRzWzFdLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKLSAgICAgIHRlbXBfaW4gPSBkdXAoU1RESU5fRklMRU5PKTsKLSAgICAgIGZjbnRsKHRlbXBfaW4sIEZfU0VURkQsIEZEX0NMT0VYRUMpOwotICAgICAgZHVwMihpbl9mZHNbMF0sIFNURElOX0ZJTEVOTyk7Ci0gICB9Ci0KLSAgIGlmIChwaXBlX2VycikgewotICAgICAgZmRfZmxhZ3NfZXJyID0gZmNudGwoZXJyX2Zkc1swXSwgRl9HRVRGRCk7Ci0gICAgICBmY250bChlcnJfZmRzWzBdLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKLSAgICAgIHRlbXBfZXJyID0gZHVwKFNUREVSUl9GSUxFTk8pOwotICAgICAgZmNudGwodGVtcF9lcnIsIEZfU0VURkQsIEZEX0NMT0VYRUMpOwotICAgICAgZHVwMihlcnJfZmRzWzFdLCBTVERFUlJfRklMRU5PKTsKLSAgIH0KLQotICAgaWYgKGNsZC0+c3VicHJvY2Vzc19lbnYpIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBlbnZfYXJyLT5uZWx0czsgKytpKSB7Ci0gICAgICAgICAgIGlmICghZWx0c1tpXS5rZXkpCi0gICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgc2V0ZW52IChlbHRzW2ldLmtleSwgZWx0c1tpXS52YWwsIDEpOwotICAgICAgIH0KLSAgIH0KLQotICAgZm9ya19pbnB1dC5wcm9ncmFtID0gKGNvbnN0IGNoYXIqKSBjbGQtPmZpbGVuYW1lOwotICAgZm9ya19pbnB1dC5wcm9nX3R5cGUgPSBjbGQtPnByb2dfdHlwZTsKLSAgIGZvcmtfaW5wdXQuaXN0cmVhbSA9IFRQRl9GT1JLX0lTX0JBTEFOQ0U7Ci0gICBmb3JrX2lucHV0LmVid19kYXRhX2xlbmd0aCA9IDA7Ci0gICBmb3JrX2lucHV0LmVid19kYXRhID0gTlVMTDsKLSAgIGZvcmtfaW5wdXQucGFybV9kYXRhID0gTlVMTDsKLQotCi0gICBpZiAoKHBpZCA9IHRwZl9mb3JrKCZmb3JrX2lucHV0KSkgPCAwKSB7Ci0gICAgICAgc2F2ZV9lcnJubyA9IGVycm5vOwotICAgICAgIGlmIChwaXBlX291dCkgewotICAgICAgICAgICBjbG9zZShvdXRfZmRzWzBdKTsKLSAgICAgICB9Ci0gICAgICAgaWYgKHBpcGVfaW4pIHsKLSAgICAgICAgICAgY2xvc2UoaW5fZmRzWzFdKTsKLSAgICAgICB9Ci0gICAgICAgaWYgKHBpcGVfZXJyKSB7Ci0gICAgICAgICAgIGNsb3NlKGVycl9mZHNbMF0pOwotICAgICAgIH0KLSAgICAgICBlcnJubyA9IHNhdmVfZXJybm87Ci0gICAgICAgcGlkID0gMDsKLSAgIH0KLQotICAgaWYgKGNsZC0+c3VicHJvY2Vzc19lbnYpIHsKLSAgICAgICBmb3IgKGkgPSAwOyBpIDwgZW52X2Fyci0+bmVsdHM7ICsraSkgewotICAgICAgICAgICAgaWYgKCFlbHRzW2ldLmtleSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIHVuc2V0ZW52IChlbHRzW2ldLmtleSk7Ci0gICAgICAgfQotICAgfQotCi0gICBpZiAocGlwZV9vdXQpIHsKLSAgICAgICBjbG9zZShvdXRfZmRzWzFdKTsKLSAgICAgICBkdXAyKHRlbXBfb3V0LCBTVERPVVRfRklMRU5PKTsKLSAgICAgICBjbG9zZSh0ZW1wX291dCk7Ci0gICAgICAgZmNudGwob3V0X2Zkc1swXSwgRl9TRVRGRCwgZmRfZmxhZ3Nfb3V0KTsKLSAgIH0KLQotICAgaWYgKHBpcGVfaW4pIHsKLSAgICAgICBjbG9zZShpbl9mZHNbMF0pOwotICAgICAgIGR1cDIodGVtcF9pbiwgU1RESU5fRklMRU5PKTsKLSAgICAgICBjbG9zZSh0ZW1wX2luKTsKLSAgICAgICBmY250bChpbl9mZHNbMV0sIEZfU0VURkQsIGZkX2ZsYWdzX2luKTsKLSAgIH0KLQotCi0gICBpZiAocGlwZV9lcnIpIHsKLSAgICAgICBjbG9zZShlcnJfZmRzWzFdKTsKLSAgICAgICBkdXAyKHRlbXBfZXJyLCBTVERFUlJfRklMRU5PKTsKLSAgICAgICBjbG9zZSh0ZW1wX2Vycik7Ci0gICAgICAgZmNudGwoZXJyX2Zkc1swXSwgRl9TRVRGRCwgZmRfZmxhZ3NfZXJyKTsKLSAgIH0KLQotCi0gICBpZiAocGlkKSB7Ci0KLSAgICAgICBhcF9ub3RlX3N1YnByb2Nlc3MocCwgcGlkLCBraWxsX2hvdyk7Ci0KLSAgICAgICBpZiAocGlwZV9vdXQpIHsKLSAgICAgICAgICAqcGlwZV9vdXQgPSBvdXRfZmRzWzBdOwotICAgICAgIH0KLSAgICAgICBpZiAocGlwZV9pbikgewotICAgICAgICAgICpwaXBlX2luID0gaW5fZmRzWzFdOwotICAgICAgIH0KLSAgICAgICBpZiAocGlwZV9lcnIpIHsKLSAgICAgICAgICAqcGlwZV9lcnIgPSBlcnJfZmRzWzBdOwotICAgICAgIH0KLSAgIH0KLQotICAgcmV0dXJuIHBpZDsKLQotfQotCi1waWRfdCBvc19mb3JrKHNlcnZlcl9yZWMgKnMsIGludCBzbG90KQotewotICAgIHN0cnVjdCB0cGZfZm9ya19pbnB1dCBmb3JrX2lucHV0OwotICAgIEFQQUNIRV9UUEZfSU5QVVQgaW5wdXRfcGFybXM7Ci0gICAgaW50IGNvdW50OwotICAgIGxpc3Rlbl9yZWMgKmxyOwotCi0gICAgZmZsdXNoKHN0ZGluKTsKLSAgICBpZiAoZHVwMihmaWxlbm8oc29ja19mcCksIFNURElOX0ZJTEVOTykgPT0gLTEpCi0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19DUklULCBzLAotICAgICAgICAidW5hYmxlIHRvIHJlcGxhY2Ugc3RkaW4gd2l0aCBzb2NrIGRldmljZSBkcml2ZXIiKTsKLSAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICBpZiAoZHVwMihmaWxlbm8oc29ja19mcCksIFNURE9VVF9GSUxFTk8pID09IC0xKQotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQ1JJVCwgcywKLSAgICAgICAgInVuYWJsZSB0byByZXBsYWNlIHN0ZG91dCB3aXRoIHNvY2sgZGV2aWNlIGRyaXZlciIpOwotICAgIGlucHV0X3Bhcm1zLmdlbmVyYXRpb24gPSBhcF9teV9nZW5lcmF0aW9uOwotI2lmZGVmIFNDT1JFQk9BUkRfRklMRQotICAgIGlucHV0X3Bhcm1zLnNjb3JlYm9hcmRfZmQgPSBzY29yZWJvYXJkX2ZkOwotI2Vsc2UgLyogbXVzdCBiZSBVU0VfVFBGX1NDT1JFQk9BUkQgb3IgVVNFX1NITUdFVF9TQ09SRUJPQVJEICovCi0gICAgaW5wdXRfcGFybXMuc2NvcmVib2FyZF9oZWFwID0gYXBfc2NvcmVib2FyZF9pbWFnZTsKLSNlbmRpZgotCi0gICAgbHIgPSBhcF9saXN0ZW5lcnM7Ci0gICAgY291bnQgPSAwOwotICAgIGRvIHsKLSAgICAgICAgaW5wdXRfcGFybXMubGlzdGVuZXJzW2NvdW50XSA9IGxyLT5mZDsKLSAgICAgICAgbHIgPSBsci0+bmV4dDsKLSAgICAgICAgY291bnQrKzsKLSAgICB9IHdoaWxlKGxyICE9IGFwX2xpc3RlbmVycyk7Ci0KLSAgICBpbnB1dF9wYXJtcy5zbG90ID0gc2xvdDsKLSAgICBpbnB1dF9wYXJtcy5yZXN0YXJ0X3RpbWUgPSBhcF9yZXN0YXJ0X3RpbWU7Ci0gICAgZm9ya19pbnB1dC5lYndfZGF0YSA9ICZpbnB1dF9wYXJtczsKLSAgICBmb3JrX2lucHV0LnByb2dyYW0gPSBhcF9zZXJ2ZXJfYXJndjA7Ci0gICAgZm9ya19pbnB1dC5wcm9nX3R5cGUgPSBUUEZfRk9SS19OQU1FOwotICAgIGZvcmtfaW5wdXQuaXN0cmVhbSA9IFRQRl9GT1JLX0lTX0JBTEFOQ0U7Ci0gICAgZm9ya19pbnB1dC5lYndfZGF0YV9sZW5ndGggPSBzaXplb2YoaW5wdXRfcGFybXMpOwotICAgIGZvcmtfaW5wdXQucGFybV9kYXRhID0gIi14IjsKLSAgICByZXR1cm4gdHBmX2ZvcmsoJmZvcmtfaW5wdXQpOwotfQotCi1pbnQgb3NfY2hlY2tfc2VydmVyKGNoYXIgKnNlcnZlcikgewotICAgICNpZm5kZWYgVVNFX1RQRl9EQUVNT04KLSAgICBpbnQgcnY7Ci0gICAgaW50ICpjdXJyZW50X2FjbjsKLSAgICBpZigocnYgPSBpbmV0ZF9nZXRTZXJ2ZXJTdGF0dXMoc2VydmVyKSkgPT0gSU5FVERfU0VSVkVSX1NUQVRVU19JTkFDVElWRSkKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGN1cnJlbnRfYWNuID0gKGludCAqKWNpbmZjX2Zhc3QoQ0lORkNfQ01NQUNOVU0pOwotICAgICAgICBpZihlY2JwMigpLT5jZTJhY24gIT0gKmN1cnJlbnRfYWNuKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgICNlbmRpZgotICAgIHJldHVybiAwOwotfQotCi12b2lkIG9zX25vdGVfYWRkaXRpb25hbF9jbGVhbnVwcyhwb29sICpwLCBpbnQgc2QpIHsKLSAgICBjaGFyIHNvY2tmaWxlbmFtZVs1MF07Ci0gICAgLyogd3JpdGUgdGhlIHNvY2tldCB0byBmaWxlIHNvIHRoYXQgVFBGIHNvY2tldCBkZXZpY2UgZHJpdmVyIHdpbGwgY2xvc2Ugc29ja2V0IGluIGNhc2UKLSAgICAgICB3ZSBoYXBwZW4gdG8gYWJlbmQuICovCi0gICAgc3ByaW50Zihzb2NrZmlsZW5hbWUsICIvZGV2L3RwZi5zb2NrZXQuZmlsZS8lLjhYIiwgc2QpOwotICAgIHNvY2tfZnAgPSBmb3Blbihzb2NrZmlsZW5hbWUsICJyKyIpOwotICAgIGFwX25vdGVfY2xlYW51cHNfZm9yX2ZpbGUocCwgc29ja19mcCk7ICAvKiBhcnJhbmdlIHRvIGNsb3NlIG9uIGV4ZWMgb3IgcmVzdGFydCAqLwotICAgIGZjbnRsKHNkLEZfU0VURkQsRkRfQ0xPRVhFQyk7Ci19Ci0KLXZvaWQgb3NfdHBmX2NoaWxkKEFQQUNIRV9UUEZfSU5QVVQgKmlucHV0X3Bhcm1zKSB7Ci0gICAgdHBmX2NoaWxkID0gMTsKLSAgICBhcF9teV9nZW5lcmF0aW9uID0gaW5wdXRfcGFybXMtPmdlbmVyYXRpb247Ci0gICAgYXBfcmVzdGFydF90aW1lID0gaW5wdXRfcGFybXMtPnJlc3RhcnRfdGltZTsKLX0KLQotCmRpZmYgLS1naXQgYS9vcy90cGYvb3MuaCBiL29zL3RwZi9vcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjY1MzIyLi4wMDAwMDAwCi0tLSBhL29zL3RwZi9vcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLSNpZm5kZWYgQVBBQ0hFX09TX0gKLSNkZWZpbmUgQVBBQ0hFX09TX0gKLQotI2RlZmluZSBQTEFURk9STSAiVFBGIgotCi0jaWZkZWYgZXJybm8KLSN1bmRlZiBlcnJubwotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIGZpbGUgaW4gaW5jbHVkZWQgaW4gYWxsIEFwYWNoZSBzb3VyY2UgY29kZS4gSXQgY29udGFpbnMgZGVmaW5pdGlvbnMKLSAqIG9mIGZhY2lsaXRpZXMgYXZhaWxhYmxlIG9uIF90aGlzXyBvcGVyYXRpbmcgc3lzdGVtIChIQVZFXyogbWFjcm9zKSwKLSAqIGFuZCBwcm90b3R5cGVzIG9mIE9TIHNwZWNpZmljIGZ1bmN0aW9ucyBkZWZpbmVkIGluIG9zLmMgb3Igb3MtaW5saW5lLmMKLSAqLwotCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0KLSNpZiAhZGVmaW5lZChJTkxJTkUpICYmIGRlZmluZWQoVVNFX0dOVV9JTkxJTkUpCi0vKiBDb21waWxlciBzdXBwb3J0cyBpbmxpbmUsIHNvIGluY2x1ZGUgdGhlIGlubGluZWFibGUgZnVuY3Rpb25zIGFzCi0gKiBwYXJ0IG9mIHRoZSBoZWFkZXIKLSAqLwotI2RlZmluZSBJTkxJTkUgZXh0ZXJuIGFwX2lubGluZQotI2luY2x1ZGUgIm9zLWlubGluZS5jIgotI2VuZGlmCi0KLSNpZm5kZWYgSU5MSU5FCi0vKiBDb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IGlubGluZSwgc28gcHJvdG90eXBlIHRoZSBpbmxpbmVhYmxlIGZ1bmN0aW9ucwotICogYXMgbm9ybWFsCi0gKi8KLWV4dGVybiBpbnQgYXBfb3NfaXNfcGF0aF9hYnNvbHV0ZShjb25zdCBjaGFyICpmKTsKLSNlbmRpZgotCi0vKiBPdGhlciBhcF9vc18gcm91dGluZXMgbm90IHVzZWQgYnkgdGhpcyBwbGF0Zm9ybSAqLwotCi0jZGVmaW5lIGFwX29zX2lzX2ZpbGVuYW1lX3ZhbGlkKGYpICAgICAgICAgICgxKQotI2RlZmluZSBhcF9vc19raWxsKHBpZCwgc2lnKSAgICAgICAgICAgICAgICBraWxsKHBpZCwgc2lnKQotCi0vKiBTb3JyeSBpZiB0aGlzIGlzIHVnbHksIGJ1dCB0aGUgaW5jbHVkZSBvcmRlciBkb2Vzbid0IGFsbG93IG1lCi0gKiB0byB1c2UgcmVxdWVzdF9yZWMgaGVyZS4uLiAqLwotc3RydWN0IHJlcXVlc3RfcmVjOwotZXh0ZXJuIGludCBhcF9jaGVja2NvbnYoc3RydWN0IHJlcXVlc3RfcmVjICpyKTsKLSAKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jaWZuZGVmIF9fc3RyaW5nc19oCi0KLSNkZWZpbmUgRkRfU0VUU0laRSAgICAyMDQ4IAotIAotdHlwZWRlZiBsb25nIGZkX21hc2s7Ci0KLSNkZWZpbmUgTkJCWSAgICA4ICAgIC8qIG51bWJlciBvZiBiaXRzIGluIGEgYnl0ZSAqLwotI2RlZmluZSBORkRCSVRTIChzaXplb2YoZmRfbWFzaykgKiBOQkJZKQotI2RlZmluZSAgaG93bWFueSh4LCB5KSAgKCgoeCkrKCh5KS0xKSkvKHkpKQotCi10eXBlZGVmIHN0cnVjdCBmZF9zZXQgeyAKLSAgICAgICAgZmRfbWFzayBmZHNfYml0cyBbaG93bWFueShGRF9TRVRTSVpFLCBORkRCSVRTKV07Ci19IGZkX3NldDsgCi0KLSNkZWZpbmUgRkRfQ0xSKG4sIHApKChwKS0+ZmRzX2JpdHNbKG4pL05GREJJVFNdICY9IH4oMSA8PCAoKG4pICUgTkZEQklUUykpKQotI2RlZmluZSBGRF9JU1NFVChuLCBwKSgocCktPmZkc19iaXRzWyhuKS9ORkRCSVRTXSAmICgxIDw8KChuKSAlIE5GREJJVFMpKSkKLSNkZWZpbmUgIEZEX1pFUk8ocCkgICBtZW1zZXQoKGNoYXIgKikocCksIDAsIHNpemVvZigqKHApKSkKLSNlbmRpZgotICAgIAotI2lmZGVmIEZEX1NFVAotI3VuZGVmIEZEX1NFVAotI2RlZmluZSBGRF9TRVQobiwgcCkgKDApCi0jZW5kaWYKLQotI2RlZmluZSAgUkVTT1VSQ0VfS0VZICgodm9pZCopIDB4QzFDMkMxQzMpCi0KLS8qIFRQRiBkb2Vzbid0IGhhdmUsIG9yIG5lZWQsIHR6c2V0IChpdCBpcyB1c2VkIGluIG1vZF9leHBpcmVzLmMpICovCi0jZGVmaW5lIHR6c2V0KCkKLQotI2luY2x1ZGUgPGkkbmV0ZC5oPgotc3RydWN0IGFwYWNoZV9pbnB1dCB7Ci0gICAgSU5FVERfU0VSVkVSX0lOUFVUICBpbmV0ZF9zZXJ2ZXI7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAqc2NvcmVib2FyZF9oZWFwOyAgIC8qIHNjb3JlYm9hcmQgc3lzdGVtIGhlYXAgYWRkcmVzcyAqLwotICAgIGludCAgICAgICAgICAgICAgICAgc2NvcmVib2FyZF9mZDsgICAgICAvKiBzY29yZWJvYXJkIGZpbGUgZGVzY3JpcHRvciAqLwotICAgIGludCAgICAgICAgICAgICAgICAgc2xvdDsgICAgICAgICAgICAgICAvKiBjaGlsZCBudW1iZXIgKi8KLSAgICBpbnQgICAgICAgICAgICAgICAgIGdlbmVyYXRpb247ICAgICAgICAgLyogc2VydmVyIGdlbmVyYXRpb24gbnVtYmVyICovCi0gICAgaW50ICAgICAgICAgICAgICAgICBsaXN0ZW5lcnNbMTBdOwotICAgIHRpbWVfdCAgICAgICAgICAgICAgcmVzdGFydF90aW1lOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgYXBhY2hlX2lucHV0IEFQQUNIRV9UUEZfSU5QVVQ7Ci0KLXR5cGVkZWYgc3RydWN0IHRwZl9mb3JrX2NoaWxkIHsKLSAgICAgY2hhciAgKmZpbGVuYW1lOwotICAgICBlbnVtIHsgRk9SS19OQU1FID0gMSwgRk9SS19GSUxFID0gMiB9IHByb2dfdHlwZTsKLSAgICAgdm9pZCAgKnN1YnByb2Nlc3NfZW52OwotfVRQRl9GT1JLX0NISUxEOwotCi1pbnQgdHBmX2FjY2VwdChpbnQgc29ja2ZkLCBzdHJ1Y3Qgc29ja2FkZHIgKnBlZXIsIGludCAqcGFkZHJsZW4pOwotZXh0ZXJuIGludCB0cGZfY2hpbGQ7Ci0KLXN0cnVjdCBzZXJ2ZXJfcmVjOwotcGlkX3Qgb3NfZm9yayhzdHJ1Y3Qgc2VydmVyX3JlYyAqcywgaW50IHNsb3QpOwotaW50IG9zX2NoZWNrX3NlcnZlcihjaGFyICpzZXJ2ZXIpOwotY2hhciAqZ2V0cGFzcyhjb25zdCBjaGFyICpwcm9tcHQpOwotZXh0ZXJuIGNoYXIgKmFwX3NlcnZlcl9hcmd2MDsKLWV4dGVybiBpbnQgc2NvcmVib2FyZF9mZDsKLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpZm5kZWYgU0lHUElQRQotI2RlZmluZSBTSUdQSVBFIDE0Ci0jZW5kaWYKLSNpZmRlZiBOU0lHCi0jdW5kZWYgTlNJRwotI2VuZGlmCi0jZW5kaWYgLyohIEFQQUNIRV9PU19IKi8KZGlmZiAtLWdpdCBhL29zL3RwZi9zYW1wbGVzL2xpbmtkbGwuamNsIGIvb3MvdHBmL3NhbXBsZXMvbGlua2RsbC5qY2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiY2QxN2MuLjAwMDAwMDAKLS0tIGEvb3MvdHBmL3NhbXBsZXMvbGlua2RsbC5qY2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLy9BUEFDSCBKT0IgTVNHTEVWRUw9KDEsMSksQ0xBU1M9QSxNU0dDTEFTUz1BDQotLypST1VURSBQUklOVCBYWFhYWFguWFhYWFhYDQotLypST1VURSBQVU5DSCBYWFhYWFguWFhYWFhYDQotLypOT1RJRlkgWFhYWFhYLlhYWFhYWA0KLS8vQ0NMRSBKQ0xMSUIgT1JERVI9KFNZUzEuQ0JDLlNDQkNQUkMsU1lTMS5DRUUuU0NFRVBST0MpDQotLy9QUkVMSU5LIEVYRUMgRURDUEwsQ09ORC5MS0VEPSgwLE5FKSwNCi0vLyBQUEFSTT0nT01WUyxETExOQU1FKHBwcHApJywNCi0vLyBMUkVHU0laPScyMDQ4SycsDQotLy8gTFBBUk09J0FNT0RFPTMxLFJNT0RFPUFOWSxMSVNULFhSRUYnDQotLy9QTEtFRC5TWVNMSUIgREQgRElTUD1TSFIsRFNOPUZTRTAwMDAuREVWUC5TVFVCLk9CDQotLy8gICAgICAgICAgICAgREQgRElTUD1TSFIsRFNOPUZTRTAwMDAuREVWUC5DTElCLk9CDQotLy8gICAgICAgICAgICAgREQgRElTUD1TSFIsRFNOPUFDUC5DTElCLlJMU0U0Ni5XRUINCi0vLyAgICAgICAgICAgICBERCBESVNQPVNIUixEU049QUNQLlNUVUIuUkxTRTQ2LldFQg0KLS8vICAgICAgICAgICAgIEREIERJU1A9U0hSLERTTj1BQ1AuQ0xJQi5STFNFNDANCi0vLyAgICAgICAgICAgICBERCBESVNQPVNIUixEU049QUNQLlNUVUIuUkxTRTQwDQotLy9QTEtFRC5TWVNERUZTRCBERCBEU049QVBBMDAwMC5ERVZQLklNUE9SVFMuRFNEKHBwcHB2diksRElTUD1TSFINCi0vL1BMS0VELkRTRCBERCBEU049QVBBMDAwMC5ERVZQLklNUE9SVFMuRFNELERJU1A9U0hSDQotLy9QTEtFRC5PQkpMSUIgREQgRElTUD1TSFIsRFNOPUZTRTAwMDAuREVWUC5URVNULk9CDQotLy8gICAgICAgICAgICAgREQgRElTUD1TSFIsRFNOPUFDUC5PQkouUkxTRTQ2LldFQg0KLS8vICAgICAgICAgICAgIEREIERJU1A9U0hSLERTTj1BQ1AuT0JKLklOVEc5OC5OQlMNCi0vLyAgICAgICAgICAgICBERCBESVNQPVNIUixEU049QUNQLk1BSU4uU1lTVC5PQkJTUw0KLS8vICAgICAgICAgICAgIEREIERJU1A9U0hSLERTTj1BQ1AuREYuTUFJTi5TWVNULk9CQlNTDQotLy8gICAgICAgICAgICAgREQgRElTUD1TSFIsRFNOPUFDUC5PQkouUkxTRTQwLkJTUw0KLS8vUExLRUQuT0JKMSAgIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9hcC9hcF9jcHlzdHJuLm8nDQotLy9QTEtFRC5PQkoyICAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL2FwL2FwX2V4ZWN2ZS5vJw0KLS8vUExLRUQuT0JKMyAgIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9hcC9hcF9zaWduYWwubycNCi0vL1BMS0VELk9CSjQgICBERCBQQVRIPScvdXNyL2xvY2FsL2FwYWNoZS9zcmMvYXAvYXBfc2xhY2subycNCi0vL1BMS0VELk9CSjUgICBERCBQQVRIPScvdXNyL2xvY2FsL2FwYWNoZS9zcmMvYXAvYXBfc25wcmludGYubycNCi0vL1BMS0VELk9CSjYgICBERCBQQVRIPScvdXNyL2xvY2FsL2FwYWNoZS9zcmMvYXAvYXBfc3RyaW5ncy5vJw0KLS8vUExLRUQuT0JKNyAgIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9vcy90cGYvZWJjZGljLm8nDQotLy9QTEtFRC5PQko4ICAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL29zL3RwZi9vcy5vJw0KLS8vUExLRUQuT0JKOSAgIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9vcy90cGYvb3MtaW5saW5lLm8nDQotLy9QTEtFRC5PQkoxMCAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL3JlZ2V4L3JlZ2NvbXAubycNCi0vL1BMS0VELk9CSjExICBERCBQQVRIPScvdXNyL2xvY2FsL2FwYWNoZS9zcmMvcmVnZXgvcmVnZXJyb3IubycNCi0vL1BMS0VELk9CSjEyICBERCBQQVRIPScvdXNyL2xvY2FsL2FwYWNoZS9zcmMvcmVnZXgvcmVnZXhlYy5vJw0KLS8vUExLRUQuT0JKMTMgIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9yZWdleC9yZWdmcmVlLm8nDQotLy9QTEtFRC5PQkoxNCAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21haW4vYWxsb2MubycNCi0vL1BMS0VELk9CSjE1ICBERCBQQVRIPScvdXNyL2xvY2FsL2FwYWNoZS9zcmMvbWFpbi9idWZmLm8nDQotLy9QTEtFRC5PQkoxNiAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21haW4vZm5tYXRjaC5vJw0KLS8vUExLRUQuT0JKMTcgIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9tYWluL2h0dHBfY29uZmlnLm8nDQotLy9QTEtFRC5PQkoxOCAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21haW4vaHR0cF9jb3JlLm8nDQotLy9QTEtFRC5PQkoxOSAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21haW4vaHR0cF9sb2cubycNCi0vL1BMS0VELk9CSjIwICBERCBQQVRIPScvdXNyL2xvY2FsL2FwYWNoZS9zcmMvbWFpbi9odHRwX21haW4ubycNCi0vL1BMS0VELk9CSjIxICBERCBQQVRIPScvdXNyL2xvY2FsL2FwYWNoZS9zcmMvbWFpbi9odHRwX3Byb3RvY29sLm8nDQotLy9QTEtFRC5PQkoyMiAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21haW4vaHR0cF9yZXF1ZXN0Lm8nDQotLy9QTEtFRC5PQkoyMyAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21haW4vaHR0cF92aG9zdC5vJw0KLS8vUExLRUQuT0JKMjQgIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9tYWluL21kNWMubycNCi0vL1BMS0VELk9CSjI1ICBERCBQQVRIPScvdXNyL2xvY2FsL2FwYWNoZS9zcmMvbWFpbi9yZmMxNDEzLm8nDQotLy9QTEtFRC5PQkoyNiAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21haW4vdXRpbC5vJw0KLS8vUExLRUQuT0JKMjcgIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9tYWluL3V0aWxfZGF0ZS5vJw0KLS8vUExLRUQuT0JKMjggIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9tYWluL3V0aWxfbWQ1Lm8nDQotLy9QTEtFRC5PQkoyOSAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21haW4vdXRpbF9zY3JpcHQubycNCi0vL1BMS0VELk9CSjMwICBERCBQQVRIPScvdXNyL2xvY2FsL2FwYWNoZS9zcmMvbWFpbi91dGlsX3VyaS5vJw0KLS8vUExLRUQuT0JKMzEgIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9tb2R1bGVzLm8nDQotLy9QTEtFRC5PQkozMiAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL2J1aWxkbWFyay5vJw0KLS8vUExLRUQuT0JKMzMgIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9tb2R1bGVzL3N0YW5kYXJkL21vZF9hdXRvXA0KLS8vICAgICAgICAgICAgIGluZGV4Lm8nDQotLy9QTEtFRC5PQkozNCAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21vZHVsZXMvc3RhbmRhcmQvbW9kX2Rpci5cDQotLy8gICAgICAgICAgICAgbycNCi0vL1BMS0VELk9CSjM1ICBERCBQQVRIPScvdXNyL2xvY2FsL2FwYWNoZS9zcmMvbW9kdWxlcy9zdGFuZGFyZC9tb2RfbWltZVwNCi0vLyAgICAgICAgICAgICAubycNCi0vL1BMS0VELk9CSjM2ICBERCBQQVRIPScvdXNyL2xvY2FsL2FwYWNoZS9zcmMvbW9kdWxlcy9zdGFuZGFyZC9tb2Rfc2V0ZVwNCi0vLyAgICAgICAgICAgICBudmlmLm8nDQotLy9QTEtFRC5PQkozNyAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21vZHVsZXMvc3RhbmRhcmQvbW9kX2FsaWFcDQotLy8gICAgICAgICAgICAgcy5vJw0KLS8vUExLRUQuT0JKMzggIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9tb2R1bGVzL3N0YW5kYXJkL21vZF9hY2NlXA0KLS8vICAgICAgICAgICAgIHNzLm8nDQotLy9QTEtFRC5PQkozOSAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21vZHVsZXMvc3RhbmRhcmQvbW9kX3VzZXJcDQotLy8gICAgICAgICAgICAgZGlyLm8nDQotLy9QTEtFRC5PQko0MCAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21vZHVsZXMvc3RhbmRhcmQvbW9kX3NwZWxcDQotLy8gICAgICAgICAgICAgaW5nLm8nDQotLy9QTEtFRC5PQko0MSAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21vZHVsZXMvc3RhbmRhcmQvbW9kX25lZ29cDQotLy8gICAgICAgICAgICAgdGlhdGlvbi5vJw0KLS8vUExLRUQuU1lTSU4gREQgKg0KLSBPUkRFUiBAQERMTUhEUg0KLSBJTkNMVURFIE9CSkxJQihDU1RSVEQ0MCkNCi0gSU5DTFVERSBPQkoxDQotIElOQ0xVREUgT0JKMg0KLSBJTkNMVURFIE9CSjMNCi0gSU5DTFVERSBPQko0DQotIElOQ0xVREUgT0JKNQ0KLSBJTkNMVURFIE9CSjYNCi0gSU5DTFVERSBPQko3DQotIElOQ0xVREUgT0JKOA0KLSBJTkNMVURFIE9CSjkNCi0gSU5DTFVERSBPQkoxMA0KLSBJTkNMVURFIE9CSjExDQotIElOQ0xVREUgT0JKMTINCi0gSU5DTFVERSBPQkoxMw0KLSBJTkNMVURFIE9CSjE0DQotIElOQ0xVREUgT0JKMTUNCi0gSU5DTFVERSBPQkoxNg0KLSBJTkNMVURFIE9CSjE3DQotIElOQ0xVREUgT0JKMTgNCi0gSU5DTFVERSBPQkoxOQ0KLSBJTkNMVURFIE9CSjIwDQotIElOQ0xVREUgT0JKMjENCi0gSU5DTFVERSBPQkoyMg0KLSBJTkNMVURFIE9CSjIzDQotIElOQ0xVREUgT0JKMjQNCi0gSU5DTFVERSBPQkoyNQ0KLSBJTkNMVURFIE9CSjI2DQotIElOQ0xVREUgT0JKMjcNCi0gSU5DTFVERSBPQkoyOA0KLSBJTkNMVURFIE9CSjI5DQotIElOQ0xVREUgT0JKMzANCi0gSU5DTFVERSBPQkozMQ0KLSBJTkNMVURFIE9CSjMyDQotIElOQ0xVREUgT0JKMzMNCi0gSU5DTFVERSBPQkozNA0KLSBJTkNMVURFIE9CSjM1DQotIElOQ0xVREUgT0JKMzYNCi0gSU5DTFVERSBPQkozNw0KLSBJTkNMVURFIE9CSjM4DQotIElOQ0xVREUgT0JKMzkNCi0gSU5DTFVERSBPQko0MA0KLSBJTkNMVURFIE9CSjQxDQotLyoNCi0vLyoqKiBXQVJOSU5HICoqKiBORVZFUiBjaGFuZ2UgLkxLIHRvIC5PQiBpbiBTWVNMTU9EISEhDQotLy9MS0VELlNZU0xNT0QgREQgRElTUD1PTEQsRFNOPXh4eHh4eC54eHh4KHBwcHB2dikNCi0vLw0KZGlmZiAtLWdpdCBhL29zL3RwZi9zYW1wbGVzL2xvYWRzZXQuamNsIGIvb3MvdHBmL3NhbXBsZXMvbG9hZHNldC5qY2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMTM0ZDQuLjAwMDAwMDAKLS0tIGEvb3MvdHBmL3NhbXBsZXMvbG9hZHNldC5qY2wKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vL09MRFJXRUIgSk9CIE1TR0xFVkVMPTEsQ0xBU1M9QSxNU0dDTEFTUz1TDQotLy9KT0JDQVQgREQgRFNOPUlDRkNBVC5FU0FXSzIsRElTUD1TSFINCi0vKlJPVVRFIFBSSU5UIHh4eHh4eC54eHh4eHh4DQotLypST1VURSBQVU5DSCB4eHh4eHgueHh4eHh4eA0KLS8vVExEUiAgIEVYRUMgIFBHTT1UUEZMRFJDQSxSRUdJT049OE0sDQotLy8gICAgICAgICAgICAgUEFSTT0nT0xEUixTWVM9QUNQLENMTVNJWkU9ODAwMDAwMCcNCi0vL1NURVBMSUIgIEREICBEU049QUNQLkxJTksuUkxTRTQ2LldFQixESVNQPVNIUg0KLS8vICAgICAgICAgREQgIERTTj1BQ1AuTElOSy5STFNFNDAuQlNTLERJU1A9U0hSDQotLy8gICAgICAgICBERCAgRFNOPVZJUzAwMDAuREVWUC5URVNULkxLLERJU1A9U0hSDQotLy8gICAgICAgICBERCAgRFNOPVNZUzEuQ0VFLlNDRUVSVU4sRElTUD1TSFINCi0vL1NBTFRCICAgIEREICBEU049QUNQLlNBTFRCTC5STFNFNDYuV0VCLERJU1A9U0hSDQotLy8gICAgICAgICBERCAgRFNOPUFDUC5TQUxUQkwuSU5URzQ2LldFQixESVNQPVNIUg0KLS8vT0JKTElCICAgREQgIERTTj1GU0UwMDAwLkRFVlAuVEVTVC5PQixESVNQPVNIUg0KLS8vICAgICAgICAgREQgIERTTj1BUEEwMDAwLkRFVlAuVEVTVC5PQixESVNQPVNIUg0KLS8vICAgICAgICAgREQgIERTTj1BQ1AuRFJWRS5URVNULk9CLERJU1A9U0hSDQotLy8gICAgICAgICBERCAgRFNOPUFDUC5PQkouUkxTRTQ2LldFQixESVNQPVNIUg0KLS8vICAgICAgICAgREQgIERTTj1BQ1AuT0JKLklOVEczNi5EUlYsRElTUD1TSFINCi0vLyAgICAgICAgIEREICBEU049QUNQLk9CSi5JTlRHNDYuV0VCLERJU1A9U0hSDQotLy8gICAgICAgICBERCAgRFNOPUFDUC5PQkouSU5URzQwLkJTUyxESVNQPVNIUg0KLS8vTE9BRE1PRCAgREQgIERTTj1GU0UwMDAwLkRFVlAuVEVTVC5MSyxESVNQPVNIUg0KLS8vICAgICAgICAgREQgIERTTj1BUEEwMDAwLkRFVlAuVEVTVC5MSyxESVNQPVNIUg0KLS8vICAgICAgICAgREQgIERTTj1DV0VJU1MuTElOSyxESVNQPVNIUg0KLS8vICAgICAgICAgREQgIERTTj1BQ1AuRFJWRS5URVNULkxLLERJU1A9U0hSDQotLy8gICAgICAgICBERCAgRFNOPUFDUC5MSU5LLlJMU0U0Ni5XRUIsRElTUD1TSFINCi0vLyAgICAgICAgIEREICBEU049QUNQLkxJTksuSU5URzk4Lk5CUyxESVNQPVNIUg0KLS8vICAgICAgICAgREQgIERTTj1BQ1AuTElOSy5JTlRHNDYuV0VCLERJU1A9U0hSDQotLy8gICAgICAgICBERCAgRFNOPUFDUC5MSU5LLklOVEczNi5EUlYsRElTUD1TSFINCi0vLyAgICAgICAgIEREICBEU049QUNQLkxJTksuSU5URzQwLkJTUyxESVNQPVNIUg0KLS8vTE9BRFNVTSAgREQgIERTTj0mJkxPQURTVU0sRElTUD0oTkVXLFBBU1MpLFVOSVQ9U1lTREEsDQotLy8gICAgICAgICAgICAgTFJFQ0w9MTMzLFNQQUNFPShUUkssKDEwLDEwKSksUkVDRk09RkJBDQotLy9DUFJURU1QICBERCAgVU5JVD1TWVNEQSwNCi0vLyAgICAgICAgICAgICBEU049JiZDUFJURU1QLFNQQUNFPShUUkssKDEwMCwyMCkpLA0KLS8vICAgICAgICAgICAgIERDQj0oUkVDRk09RkIsQkxLU0laRT00MDk1LExSRUNMPTQwOTUpLA0KLS8vICAgICAgICAgICAgIERJU1A9KE5FVyxERUxFVEUpDQotLy9QUk9HVEVNUCBERCAgVU5JVD1TWVNEQSwNCi0vLyAgICAgICAgICAgICBEU049JiZQUlRFTVAsU1BBQ0U9KFRSSywoMTAwLDIwKSksDQotLy8gICAgICAgICAgICAgRENCPShSRUNGTT1GQixCTEtTSVpFPTQwOTUsTFJFQ0w9NDA5NSksDQotLy8gICAgICAgICAgICAgRElTUD0oTkVXLERFTEVURSkNCi0vL09VVFBVVCAgIEREICBEU049JiZWUkRST1VULERJU1A9KE5FVyxQQVNTKSxVTklUPVNZU0RBLA0KLS8vICAgICAgICAgICAgIERDQj0oUkVDRk09RixCTEtTSVpFPTQwOTUsTFJFQ0w9NDA5NSkNCi0vL1NZU1VEVU1QIEREICBEVU1NWQ0KLS8vU1lTQUJFTkQgREQgIERVTU1ZDQotLy9TWVNPVVQgICBERCAgU1lTT1VUPUENCi0vL1NZU1BSSU5UIEREICBTWVNPVVQ9QQ0KLS8vUFJJTlRFUiAgREQgIFNZU09VVD1BDQotLy9DRUVEVU1QICBERCAgU1lTT1VUPUENCi0vL1NZU0lOICAgIEREICAqDQotU1lTSUQ9QlNTDQotUEFUVkVSUz1OT05FDQotU0FMVkVSUz00MA0KLUxPQURFUiAgIExPQURTRVQgIGxsbGxsbGwNCi1MT0FERVIgICBDQUxMICBQUk9HIHBwcHB2dg0KLS8qDQotLy9UUkFOU01JVCBFWEVDIFBHTT1JS0pFRlQwMSwNCi0vLyAgUEFSTT0nVFJBTlNNSVQgeHh4eHh4Lnh4eHh4eCBERE5BTUUoU1lTVFNJTikgTk9MT0cgTk9OT1RJRlkgU0VRJw0KLS8vU1lTVFNJTiAgREQgIFVOSVQ9U1lTREEsDQotLy8gICAgICAgICAgICAgRFNOPSYmVlJEUk9VVCxESVNQPShPTEQsREVMRVRFKQ0KLS8vU1lTVFNQUlQgREQgIERVTU1ZDQpkaWZmIC0tZ2l0IGEvb3MvdW5peC8uY3ZzaWdub3JlIGIvb3MvdW5peC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2M3YTdjLi4wMDAwMDAwCi0tLSBhL29zL3VuaXgvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1ha2VmaWxlCmRpZmYgLS1naXQgYS9vcy91bml4L01ha2VmaWxlLmluIGIvb3MvdW5peC9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJiMmRmYy4uMDAwMDAwMAotLS0gYS9vcy91bml4L01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCi1ERVBUSCAgICAgPSAuLi8uLgotdG9wc3JjZGlyID0gQHRvcHNyY2RpckAKLXNyY2RpciAgICA9IEBzcmNkaXJACi1WUEFUSCAgICAgPSBAc3JjZGlyQAotCi1MVExJQlJBUllfTkFNRSAgICA9IGxpYm9zLmxhCi1MVExJQlJBUllfU09VUkNFUyA9IG9zLmMgb3MtaW5saW5lLmMgdW5peGQuYyBpb2xfc29ja2V0LmMKLQotaW5jbHVkZSAkKHRvcHNyY2RpcikvYnVpbGQvbHRsaWIubWsKZGlmZiAtLWdpdCBhL29zL3VuaXgvY29uZmlnLm00IGIvb3MvdW5peC9jb25maWcubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NDY5MTMuLjAwMDAwMDAKLS0tIGEvb3MvdW5peC9jb25maWcubTQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLUFDX0NIRUNLX0ZVTkNTKCBcCi1zZXRzaWQgXAota2lsbHBnIFwKLSkKLQotZG5sIFhYWCAtIFRoaXMgZG9lc24ndCBkZWFsIHdpdGggX3N5c19zaWdsaXN0LiBQcm9iYWJseSBoYXZlIHRvIHJvbGwgb3VyIG93bgotQUNfREVDTF9TWVNfU0lHTElTVApkaWZmIC0tZ2l0IGEvb3MvdW5peC9vcy5oIGIvb3MvdW5peC9vcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njg5ZGZhLi4wMDAwMDAwCi0tLSBhL29zL3VuaXgvb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLSNpZm5kZWYgQVBBQ0hFX09TX0gKLSNkZWZpbmUgQVBBQ0hFX09TX0gKLQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotCi0jaWZuZGVmIFBMQVRGT1JNCi0jZGVmaW5lIFBMQVRGT1JNICJVbml4IgotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIGZpbGUgaW4gaW5jbHVkZWQgaW4gYWxsIEFwYWNoZSBzb3VyY2UgY29kZS4gSXQgY29udGFpbnMgZGVmaW5pdGlvbnMKLSAqIG9mIGZhY2lsaXRpZXMgYXZhaWxhYmxlIG9uIF90aGlzXyBvcGVyYXRpbmcgc3lzdGVtIChIQVZFXyogbWFjcm9zKSwKLSAqIGFuZCBwcm90b3R5cGVzIG9mIE9TIHNwZWNpZmljIGZ1bmN0aW9ucyBkZWZpbmVkIGluIG9zLmMgb3Igb3MtaW5saW5lLmMKLSAqLwotCi0jaWYgIWRlZmluZWQoSU5MSU5FKSAmJiBkZWZpbmVkKFVTRV9HTlVfSU5MSU5FKQotLyogQ29tcGlsZXIgc3VwcG9ydHMgaW5saW5lLCBzbyBpbmNsdWRlIHRoZSBpbmxpbmVhYmxlIGZ1bmN0aW9ucyBhcwotICogcGFydCBvZiB0aGUgaGVhZGVyCi0gKi8KLSNkZWZpbmUgSU5MSU5FIGV4dGVybiBhcF9pbmxpbmUKLQotSU5MSU5FIGludCBhcF9vc19pc19wYXRoX2Fic29sdXRlKGNvbnN0IGNoYXIgKmZpbGUpOwotCi0jaW5jbHVkZSAib3MtaW5saW5lLmMiCi0KLSNlbHNlCi0KLS8qIENvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgaW5saW5lLCBzbyBwcm90b3R5cGUgdGhlIGlubGluZWFibGUgZnVuY3Rpb25zCi0gKiBhcyBub3JtYWwKLSAqLwotZXh0ZXJuIGludCBhcF9vc19pc19wYXRoX2Fic29sdXRlKGNvbnN0IGNoYXIgKmZpbGUpOwotI2VuZGlmCi0KLS8qIE90aGVyIGFwX29zXyByb3V0aW5lcyBub3QgdXNlZCBieSB0aGlzIHBsYXRmb3JtICovCi0KLSNkZWZpbmUgYXBfb3NfaXNfZmlsZW5hbWVfdmFsaWQoZikgICAgICAgICAgKDEpCi0jZGVmaW5lIGFwX29zX2tpbGwocGlkLCBzaWcpICAgICAgICAgICAgICAgIGtpbGwocGlkLCBzaWcpCi0KLS8qCi0gKiAgQWJzdHJhY3Rpb24gbGF5ZXIgZm9yIGxvYWRpbmcKLSAqICBBcGFjaGUgbW9kdWxlcyB1bmRlciBydW4tdGltZSB2aWEgCi0gKiAgZHluYW1pYyBzaGFyZWQgb2JqZWN0IChEU08pIG1lY2hhbmlzbQotICovCi0KLSNpZmRlZiBIQVZFX0RMX0gKLSNpbmNsdWRlIDxkbC5oPgotI2VuZGlmCi0KLS8qCi0gKiBEbyBub3QgdXNlIG5hdGl2ZSBBSVggRFNPIHN1cHBvcnQKLSAqLwotI2lmZGVmIEFJWAotI3VuZGVmIEhBVkVfRExGQ05fSAotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0RMRkNOX0gKLSNpbmNsdWRlIDxkbGZjbi5oPgotI2Vsc2UKLXZvaWQgKmRsb3Blbihjb25zdCBjaGFyICosIGludCk7Ci1pbnQgZGxjbG9zZSh2b2lkICopOwotdm9pZCAqZGxzeW0odm9pZCAqLCBjb25zdCBjaGFyICopOwotY29uc3QgY2hhciAqZGxlcnJvcih2b2lkKTsKLSNlbmRpZgotCi0vKiBwcm9iYWJseSBvbiBhbiBvbGRlciBzeXN0ZW0gdGhhdCBkb2Vzbid0IHN1cHBvcnQgUlRMRF9OT1cgb3IgUlRMRF9MQVpZLgotICogVGhlIGJlbG93IGRlZmluZSBpcyBhIGxpZSBzaW5jZSB3ZSBhcmUgcmVhbGx5IGRvaW5nIFJUTERfTEFaWSBzaW5jZSB0aGUKLSAqIHN5c3RlbSBkb2Vzbid0IHN1cHBvcnQgUlRMRF9OT1cuCi0gKi8KLSNpZm5kZWYgUlRMRF9OT1cKLSNkZWZpbmUgUlRMRF9OT1cgMQotI2VuZGlmCi0KLSNpZm5kZWYgUlRMRF9HTE9CQUwKLSNkZWZpbmUgUlRMRF9HTE9CQUwgMAotI2VuZGlmCi0KLSNpZiAoZGVmaW5lZChfX0ZyZWVCU0RfXykgfHxcCi0gICAgIGRlZmluZWQoX19PcGVuQlNEX18pIHx8XAotICAgICBkZWZpbmVkKF9fTmV0QlNEX18pICAgICApICYmICFkZWZpbmVkKF9fRUxGX18pCi0jZGVmaW5lIERMU1lNX05FRURTX1VOREVSU0NPUkUKLSNlbmRpZgotCi0jZGVmaW5lICAgICBhcF9vc19kc29faGFuZGxlX3QgIHZvaWQgKgotdm9pZCAgICAgICAgYXBfb3NfZHNvX2luaXQodm9pZCk7Ci12b2lkICogICAgICBhcF9vc19kc29fbG9hZChjb25zdCBjaGFyICopOwotdm9pZCAgICAgICAgYXBfb3NfZHNvX3VubG9hZCh2b2lkICopOwotdm9pZCAqICAgICAgYXBfb3NfZHNvX3N5bSh2b2lkICosIGNvbnN0IGNoYXIgKik7Ci1jb25zdCBjaGFyICphcF9vc19kc29fZXJyb3Iodm9pZCk7Ci0KLSNlbmRpZgkvKiAhQVBBQ0hFX09TX0ggKi8KZGlmZiAtLWdpdCBhL29zL3VuaXgvdW5peGQuYyBiL29zL3VuaXgvdW5peGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFmNTRlYy4uMDAwMDAwMAotLS0gYS9vcy91bml4L3VuaXhkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAidW5peGQuaCIKLQotdW5peGRfY29uZmlnX3JlYyB1bml4ZF9jb25maWc7Ci0KLXZvaWQgdW5peGRfZGV0YWNoKHZvaWQpCi17Ci0gICAgaW50IHg7Ci0gICAgcGlkX3QgcGdycDsKLQotICAgIGNoZGlyKCIvIik7Ci0jaWYgIWRlZmluZWQoTVBFKSAmJiAhZGVmaW5lZChPUzIpICYmICFkZWZpbmVkKFRQRikKLS8qIERvbid0IGRldGFjaCBmb3IgTVBFIGJlY2F1c2UgY2hpbGQgcHJvY2Vzc2VzIGNhbid0IHN1cnZpdmUgdGhlIGRlYXRoIG9mCi0gICB0aGUgcGFyZW50LiAqLwotICAgIGlmICgoeCA9IGZvcmsoKSkgPiAwKQotCWV4aXQoMCk7Ci0gICAgZWxzZSBpZiAoeCA9PSAtMSkgewotCXBlcnJvcigiZm9yayIpOwotCWZwcmludGYoc3RkZXJyLCAiJXM6IHVuYWJsZSB0byBmb3JrIG5ldyBwcm9jZXNzXG4iLCBhcF9zZXJ2ZXJfYXJndjApOwotCWV4aXQoMSk7Ci0gICAgfQotICAgIFJBSVNFX1NJR1NUT1AoREVUQUNIKTsKLSNlbmRpZgotI2lmbmRlZiBOT19TRVRTSUQKLSAgICBpZiAoKHBncnAgPSBzZXRzaWQoKSkgPT0gLTEpIHsKLQlwZXJyb3IoInNldHNpZCIpOwotCWZwcmludGYoc3RkZXJyLCAiJXM6IHNldHNpZCBmYWlsZWRcbiIsIGFwX3NlcnZlcl9hcmd2MCk7Ci0JZXhpdCgxKTsKLSAgICB9Ci0jZWxpZiBkZWZpbmVkKE5FWFQpIHx8IGRlZmluZWQoTkVXU09TKQotICAgIGlmIChzZXRwZ3JwKDAsIGdldHBpZCgpKSA9PSAtMSB8fCAocGdycCA9IGdldHBncnAoMCkpID09IC0xKSB7Ci0JcGVycm9yKCJzZXRwZ3JwIik7Ci0JZnByaW50ZihzdGRlcnIsICIlczogc2V0cGdycCBvciBnZXRwZ3JwIGZhaWxlZFxuIiwgYXBfc2VydmVyX2FyZ3YwKTsKLQlleGl0KDEpOwotICAgIH0KLSNlbGlmIGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFRQRikKLSAgICAvKiBPUy8yIGFuZCBUUEYgZG9uJ3Qgc3VwcG9ydCBwcm9jZXNzIGdyb3VwIElEcyAqLwotICAgIHBncnAgPSBnZXRwaWQoKTsKLSNlbGlmIGRlZmluZWQoTVBFKQotICAgIC8qIE1QRSB1c2VzIG5lZ2F0aXZlIHBpZCBmb3IgcHJvY2VzcyBncm91cCAqLwotICAgIHBncnAgPSAtZ2V0cGlkKCk7Ci0jZWxzZQotICAgIGlmICgocGdycCA9IHNldHBncnAoZ2V0cGlkKCksIDApKSA9PSAtMSkgewotCXBlcnJvcigic2V0cGdycCIpOwotCWZwcmludGYoc3RkZXJyLCAiJXM6IHNldHBncnAgZmFpbGVkXG4iLCBhcF9zZXJ2ZXJfYXJndjApOwotCWV4aXQoMSk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvKiBjbG9zZSBvdXQgdGhlIHN0YW5kYXJkIGZpbGUgZGVzY3JpcHRvcnMgKi8KLSAgICBpZiAoZnJlb3BlbigiL2Rldi9udWxsIiwgInIiLCBzdGRpbikgPT0gTlVMTCkgewotCWZwcmludGYoc3RkZXJyLCAiJXM6IHVuYWJsZSB0byByZXBsYWNlIHN0ZGluIHdpdGggL2Rldi9udWxsOiAlc1xuIiwKLQkJYXBfc2VydmVyX2FyZ3YwLCBzdHJlcnJvcihlcnJubykpOwotCS8qIGNvbnRpbnVlIGFueWhvdyAtLSBub3RlIHdlIGNhbid0IGNsb3NlIG91dCBkZXNjcmlwdG9yIDAgYmVjYXVzZSB3ZQotCSAqIGhhdmUgbm90aGluZyB0byByZXBsYWNlIGl0IHdpdGgsIGFuZCBpZiB3ZSBkaWRuJ3QgaGF2ZSBhIGRlc2NyaXB0b3IKLQkgKiAwIHRoZSBuZXh0IGZpbGUgd291bGQgYmUgY3JlYXRlZCB3aXRoIHRoYXQgdmFsdWUgLi4uIGxlYWRpbmcgdG8KLQkgKiBoYXZvYy4KLQkgKi8KLSAgICB9Ci0gICAgaWYgKGZyZW9wZW4oIi9kZXYvbnVsbCIsICJ3Iiwgc3Rkb3V0KSA9PSBOVUxMKSB7Ci0JZnByaW50ZihzdGRlcnIsICIlczogdW5hYmxlIHRvIHJlcGxhY2Ugc3Rkb3V0IHdpdGggL2Rldi9udWxsOiAlc1xuIiwKLQkJYXBfc2VydmVyX2FyZ3YwLCBzdHJlcnJvcihlcnJubykpOwotICAgIH0KLSAgICAvKiBzdGRlcnIgaXMgYSB0cmlja3kgb25lLCB3ZSByZWFsbHkgd2FudCBpdCB0byBiZSB0aGUgZXJyb3JfbG9nLAotICAgICAqIGJ1dCB3ZSBoYXZlbid0IG9wZW5lZCB0aGF0IHlldC4gIFNvIGxlYXZlIGl0IGFsb25lIGZvciBub3cgYW5kIGl0J2xsCi0gICAgICogYmUgcmVvcGVuZWQgbW9tZW50cyBsYXRlci4KLSAgICAgKi8KLX0KLQotLyogU2V0IGdyb3VwIHByaXZpbGVnZXMuCi0gKgotICogTm90ZSB0aGF0IHdlIHVzZSB0aGUgdXNlcm5hbWUgYXMgc2V0IGluIHRoZSBjb25maWcgZmlsZXMsIHJhdGhlciB0aGFuCi0gKiB0aGUgbG9va3VwIG9mIHRvIHVpZCAtLS0gdGhlIHNhbWUgdWlkIG1heSBoYXZlIG11bHRpcGxlIHBhc3N3ZCBlbnRyaWVzLAotICogd2l0aCBkaWZmZXJlbnQgc2V0cyBvZiBncm91cHMgZm9yIGVhY2guCi0gKi8KLQotc3RhdGljIGludCBzZXRfZ3JvdXBfcHJpdnModm9pZCkKLXsKLSAgICBpZiAoIWdldGV1aWQoKSkgewotCWNoYXIgKm5hbWU7Ci0KLQkvKiBHZXQgdXNlcm5hbWUgaWYgcGFzc2VkIGFzIGEgdWlkICovCi0KLQlpZiAodW5peGRfY29uZmlnLnVzZXJfbmFtZVswXSA9PSAnIycpIHsKLQkgICAgc3RydWN0IHBhc3N3ZCAqZW50OwotCSAgICB1aWRfdCB1aWQgPSBhdG9pKCZ1bml4ZF9jb25maWcudXNlcl9uYW1lWzFdKTsKLQotCSAgICBpZiAoKGVudCA9IGdldHB3dWlkKHVpZCkpID09IE5VTEwpIHsKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0FMRVJULCBOVUxMLAotCQkJICJnZXRwd3VpZDogY291bGRuJ3QgZGV0ZXJtaW5lIHVzZXIgbmFtZSBmcm9tIHVpZCAldSwgIgotCQkJICJ5b3UgcHJvYmFibHkgbmVlZCB0byBtb2RpZnkgdGhlIFVzZXIgZGlyZWN0aXZlIiwKLQkJCSAodW5zaWduZWQpdWlkKTsKLQkJcmV0dXJuIC0xOwotCSAgICB9Ci0KLQkgICAgbmFtZSA9IGVudC0+cHdfbmFtZTsKLQl9Ci0JZWxzZQotCSAgICBuYW1lID0gdW5peGRfY29uZmlnLnVzZXJfbmFtZTsKLQotI2lmICFkZWZpbmVkKE9TMikgJiYgIWRlZmluZWQoVFBGKQotCS8qIE9TLzIgYW5kIFRQRiBkb24ndCBzdXBwb3J0IGdyb3Vwcy4gKi8KLQotCS8qCi0JICogU2V0IHRoZSBHSUQgYmVmb3JlIGluaXRncm91cHMoKSwgc2luY2Ugb24gc29tZSBwbGF0Zm9ybXMKLQkgKiBzZXRnaWQoKSBpcyBrbm93biB0byB6YXAgdGhlIGdyb3VwIGxpc3QuCi0JICovCi0JaWYgKHNldGdpZCh1bml4ZF9jb25maWcuZ3JvdXBfaWQpID09IC0xKSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgTlVMTCwKLQkJCSJzZXRnaWQ6IHVuYWJsZSB0byBzZXQgZ3JvdXAgaWQgdG8gR3JvdXAgJXUiLAotCQkJKHVuc2lnbmVkKXVuaXhkX2NvbmZpZy5ncm91cF9pZCk7Ci0JICAgIHJldHVybiAtMTsKLQl9Ci0KLQkvKiBSZXNldCBgZ3JvdXBzJyBhdHRyaWJ1dGVzLiAqLwotCi0JaWYgKGluaXRncm91cHMobmFtZSwgdW5peGRfY29uZmlnLmdyb3VwX2lkKSA9PSAtMSkgewotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlQsIE5VTEwsCi0JCQkiaW5pdGdyb3VwczogdW5hYmxlIHRvIHNldCBncm91cHMgZm9yIFVzZXIgJXMgIgotCQkJImFuZCBHcm91cCAldSIsIG5hbWUsICh1bnNpZ25lZCl1bml4ZF9jb25maWcuZ3JvdXBfaWQpOwotCSAgICByZXR1cm4gLTE7Ci0JfQotI2VuZGlmIC8qICFkZWZpbmVkKE9TMikgJiYgIWRlZmluZWQoVFBGKSAqLwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotCi1pbnQgdW5peGRfc2V0dXBfY2hpbGQodm9pZCkKLXsKLSAgICBpZiAoc2V0X2dyb3VwX3ByaXZzKCkpIHsKLQlyZXR1cm4gLTE7Ci0gICAgfQotI2lmZGVmIE1QRQotICAgIC8qIE9ubHkgdHJ5IHRvIHN3aXRjaCBpZiB3ZSdyZSBydW5uaW5nIGFzIE1BTkFHRVIuU1lTICovCi0gICAgaWYgKGdldGV1aWQoKSA9PSAxICYmIHVuaXhkX2NvbmZpZy51c2VyX2lkID4gMSkgewotCUdFVFBSSVZNT0RFKCk7Ci0JaWYgKHNldHVpZCh1bml4ZF9jb25maWcudXNlcl9pZCkgPT0gLTEpIHsKLQkgICAgR0VUVVNFUk1PREUoKTsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0FMRVJULCBOVUxMLAotCQkJInNldHVpZDogdW5hYmxlIHRvIGNoYW5nZSB1aWQiKTsKLQkgICAgZXhpdCgxKTsKLQl9Ci0JR0VUVVNFUk1PREUoKTsKLSAgICB9Ci0jZWxzZQotICAgIC8qIE9ubHkgdHJ5IHRvIHN3aXRjaCBpZiB3ZSdyZSBydW5uaW5nIGFzIHJvb3QgKi8KLSAgICBpZiAoIWdldGV1aWQoKSAmJiAoCi0jaWZkZWYgX09TRF9QT1NJWAotCW9zX2luaXRfam9iX2Vudmlyb25tZW50KHNlcnZlcl9jb25mLCB1bml4ZF9jb25maWcudXNlcl9uYW1lLCBvbmVfcHJvY2VzcykgIT0gMCB8fCAKLSNlbmRpZgotCXNldHVpZCh1bml4ZF9jb25maWcudXNlcl9pZCkgPT0gLTEpKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0FMRVJULCBOVUxMLAotCQkgICAgInNldHVpZDogdW5hYmxlIHRvIGNoYW5nZSB1aWQiKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotI2VuZGlmCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotY29uc3QgY2hhciAqdW5peGRfc2V0X3VzZXIoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgdW5peGRfY29uZmlnLnVzZXJfbmFtZSA9IGFyZzsKLSAgICB1bml4ZF9jb25maWcudXNlcl9pZCA9IGFwX3VuYW1lMmlkKGFyZyk7Ci0jaWYgIWRlZmluZWQgKEJJR19TRUNVUklUWV9IT0xFKSAmJiAhZGVmaW5lZCAoT1MyKQotICAgIGlmICh1bml4ZF9jb25maWcudXNlcl9pZCA9PSAwKSB7Ci0JcmV0dXJuICJFcnJvcjpcdEFwYWNoZSBoYXMgbm90IGJlZW4gZGVzaWduZWQgdG8gc2VydmUgcGFnZXMgd2hpbGVcbiIKLQkJIlx0cnVubmluZyBhcyByb290LiAgVGhlcmUgYXJlIGtub3duIHJhY2UgY29uZGl0aW9ucyB0aGF0XG4iCi0JCSJcdHdpbGwgYWxsb3cgYW55IGxvY2FsIHVzZXIgdG8gcmVhZCBhbnkgZmlsZSBvbiB0aGUgc3lzdGVtLlxuIgotCQkiXHRJZiB5b3Ugc3RpbGwgZGVzaXJlIHRvIHNlcnZlIHBhZ2VzIGFzIHJvb3QgdGhlblxuIgotCQkiXHRhZGQgLURCSUdfU0VDVVJJVFlfSE9MRSB0byB0aGUgRVhUUkFfQ0ZMQUdTIGxpbmUgaW4geW91clxuIgotCQkiXHRzcmMvQ29uZmlndXJhdGlvbiBmaWxlIGFuZCByZWJ1aWxkIHRoZSBzZXJ2ZXIuICBJdCBpc1xuIgotCQkiXHRzdHJvbmdseSBzdWdnZXN0ZWQgdGhhdCB5b3UgaW5zdGVhZCBtb2RpZnkgdGhlIFVzZXJcbiIKLQkJIlx0ZGlyZWN0aXZlIGluIHlvdXIgaHR0cGQuY29uZiBmaWxlIHRvIGxpc3QgYSBub24tcm9vdFxuIgotCQkiXHR1c2VyLlxuIjsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1jb25zdCBjaGFyICp1bml4ZF9zZXRfZ3JvdXAoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgdW5peGRfY29uZmlnLmdyb3VwX2lkID0gYXBfZ25hbWUyaWQoYXJnKTsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIHVuaXhkX3ByZV9jb25maWcodm9pZCkKLXsKLSAgICB1bml4ZF9jb25maWcudXNlcl9uYW1lID0gREVGQVVMVF9VU0VSOwotICAgIHVuaXhkX2NvbmZpZy51c2VyX2lkID0gYXBfdW5hbWUyaWQoREVGQVVMVF9VU0VSKTsKLSAgICB1bml4ZF9jb25maWcuZ3JvdXBfaWQgPSBhcF9nbmFtZTJpZChERUZBVUxUX0dST1VQKTsKLX0KZGlmZiAtLWdpdCBhL29zL3VuaXgvdW5peGQuaCBiL29zL3VuaXgvdW5peGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdjYjJmOS4uMDAwMDAwMAotLS0gYS9vcy91bml4L3VuaXhkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLSNpZm5kZWYgVU5JWERfSAotI2RlZmluZSBVTklYRF9ICi0KLS8qIGNvbW1vbiBzdHVmZiB0aGF0IHVuaXggTVBNcyB3aWxsIHdhbnQgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNoYXIgKnVzZXJfbmFtZTsKLSAgICB1aWRfdCB1c2VyX2lkOwotICAgIGdpZF90IGdyb3VwX2lkOwotfSB1bml4ZF9jb25maWdfcmVjOwotZXh0ZXJuIHVuaXhkX2NvbmZpZ19yZWMgdW5peGRfY29uZmlnOwotCi12b2lkIHVuaXhkX2RldGFjaCh2b2lkKTsKLWludCB1bml4ZF9zZXR1cF9jaGlsZCh2b2lkKTsKLXZvaWQgdW5peGRfcHJlX2NvbmZpZyh2b2lkKTsKLWNvbnN0IGNoYXIgKnVuaXhkX3NldF91c2VyKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKTsKLWNvbnN0IGNoYXIgKnVuaXhkX3NldF9ncm91cChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZyk7Ci0KLSNkZWZpbmUgVU5JWF9EQUVNT05fQ09NTUFORFMJXAoteyAiVXNlciIsIHVuaXhkX3NldF91c2VyLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLCBcCi0gICJFZmZlY3RpdmUgdXNlciBpZCBmb3IgdGhpcyBzZXJ2ZXIifSwgXAoteyAiR3JvdXAiLCB1bml4ZF9zZXRfZ3JvdXAsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsIFwKLSAgIkVmZmVjdGl2ZSBncm91cCBpZCBmb3IgdGhpcyBzZXJ2ZXIifSwgXAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29zL3dpbjMyL0Jhc2VBZGRyLnJlZiBiL29zL3dpbjMyL0Jhc2VBZGRyLnJlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y1YTdmNi4uMDAwMDAwMAotLS0gYS9vcy93aW4zMi9CYXNlQWRkci5yZWYKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0tLSBCZWdpbiBOZXcgQmFzZUFkZHIucmVmIC0tCi07IG9zL3dpbjMyL0Jhc2VBZGRyLnJlZiBjb250YWlucyB0aGUgY2VudHJhbCByZXBvc2l0b3J5Ci07ICAgICAgICAgICAgICAgICAgICAgICBvZiBhbGwgbW9kdWxlIGJhc2UgYWRkcmVzc2VzCi07ICAgICAgICAgICAgICAgICAgICAgICB0byBhdm9pZCByZWxvY2F0aW9uCi0KLTsgV0FSTklORzogVXBkYXRlIHRoaXMgZmlsZSBieSByZXZpZXdpbmcgdGhlIGltYWdlIHNpemUKLTsgICAgICAgICAgb2YgdGhlIGRlYnVnLWdlbmVyYXRlZCBkbGwgZmlsZXM7IHJlbGVhc2UgaW1hZ2VzCi07ICAgICAgICAgIHNob3VsZCBmaXQgaW4gdGhlIGxhcmdlciBkZWJ1Zy1zaXplZCBzcGFjZS4KLQotOyBtb2R1bGUgbmFtZSAgICAgIGJhc2UtYWRkcmVzcyAgICAgIG1heC1zaXplCi0KLWFwcmxpYiAgICAgICAgICAgICAgIDB4NkZGQTAwMDAgICAgMHgwMDA2MDAwMAotQXBhY2hlQ29yZSAgICAgICAgICAgMHg2RkYwMDAwMCAgICAweDAwMEEwMDAwCi1tb2RfYXV0aF9hbm9uICAgICAgICAweDZGRUYwMDAwICAgIDB4MDAwMTAwMDAKLW1vZF9jZXJuX21ldGEgICAgICAgIDB4NkZFRTAwMDAgICAgMHgwMDAxMDAwMAotbW9kX2RpZ2VzdCAgICAgICAgICAgMHg2RkVEMDAwMCAgICAweDAwMDEwMDAwCi1tb2RfZXhwaXJlcyAgICAgICAgICAweDZGRUMwMDAwICAgIDB4MDAwMTAwMDAKLW1vZF9oZWFkZXJzICAgICAgICAgIDB4NkZFQjAwMDAgICAgMHgwMDAxMDAwMAotbW9kX2luZm8gICAgICAgICAgICAgMHg2RkVBMDAwMCAgICAweDAwMDEwMDAwCi1tb2RfcmV3cml0ZSAgICAgICAgICAweDZGRTgwMDAwICAgIDB4MDAwMjAwMDAKLW1vZF9zcGVsaW5nICAgICAgICAgIDB4NkZFNzAwMDAgICAgMHgwMDAxMDAwMAotbW9kX3N0YXR1cyAgICAgICAgICAgMHg2RkU2MDAwMCAgICAweDAwMDEwMDAwCi1tb2RfdXNlcnRyYWNrICAgICAgICAweDZGRTUwMDAwICAgIDB4MDAwMTAwMDAKLW1vZF9wcm94eSAgICAgICAgICAgIDB4NkZFMzAwMDAgICAgMHgwMDAyMDAwMApkaWZmIC0tZ2l0IGEvb3Mvd2luMzIvbW9kdWxlcy5jIGIvb3Mvd2luMzIvbW9kdWxlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTVkM2Q4Li4wMDAwMDAwCi0tLSBhL29zL3dpbjMyL21vZHVsZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qIG1vZHVsZXMuYyAtLS0gbWFqb3IgbW9kdWxlcyBjb21waWxlZCBpbnRvIEFwYWNoZSBmb3IgV2luMzIuCi0gKiBPbmx5IGluc2VydCBhbiBlbnRyeSBmb3IgYSBtb2R1bGUgaWYgaXQgbXVzdCBiZSBjb21waWxlZCBpbnRvCi0gKiB0aGUgY29yZSBzZXJ2ZXIKLSAqLwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotCi1leHRlcm4gbW9kdWxlIGNvcmVfbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSBzb19tb2R1bGU7Ci1leHRlcm4gbW9kdWxlIG1pbWVfbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSBhY2Nlc3NfbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSBhdXRoX21vZHVsZTsKLWV4dGVybiBtb2R1bGUgbmVnb3RpYXRpb25fbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSBpbmNsdWRlc19tb2R1bGU7Ci1leHRlcm4gbW9kdWxlIGF1dG9pbmRleF9tb2R1bGU7Ci1leHRlcm4gbW9kdWxlIGRpcl9tb2R1bGU7Ci1leHRlcm4gbW9kdWxlIGNnaV9tb2R1bGU7Ci1leHRlcm4gbW9kdWxlIHVzZXJkaXJfbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSBhbGlhc19tb2R1bGU7Ci1leHRlcm4gbW9kdWxlIGVudl9tb2R1bGU7Ci1leHRlcm4gbW9kdWxlIGNvbmZpZ19sb2dfbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSBhc2lzX21vZHVsZTsKLWV4dGVybiBtb2R1bGUgaW1hcF9tb2R1bGU7Ci1leHRlcm4gbW9kdWxlIGFjdGlvbl9tb2R1bGU7Ci1leHRlcm4gbW9kdWxlIHNldGVudmlmX21vZHVsZTsKLWV4dGVybiBtb2R1bGUgaXNhcGlfbW9kdWxlOwotCi1tb2R1bGUgKmFwX3ByZWxpbmtlZF9tb2R1bGVzW10gPSB7Ci0gICZjb3JlX21vZHVsZSwKLSAgJnNvX21vZHVsZSwKLSAgJm1pbWVfbW9kdWxlLAotICAmYWNjZXNzX21vZHVsZSwKLSAgJmF1dGhfbW9kdWxlLAotICAmbmVnb3RpYXRpb25fbW9kdWxlLAotICAmaW5jbHVkZXNfbW9kdWxlLAotICAmYXV0b2luZGV4X21vZHVsZSwKLSAgJmRpcl9tb2R1bGUsCi0gICZjZ2lfbW9kdWxlLAotICAmdXNlcmRpcl9tb2R1bGUsCi0gICZhbGlhc19tb2R1bGUsCi0gICZlbnZfbW9kdWxlLAotICAmY29uZmlnX2xvZ19tb2R1bGUsCi0gICZhc2lzX21vZHVsZSwKLSAgJmltYXBfbW9kdWxlLAotICAmYWN0aW9uX21vZHVsZSwKLSAgJnNldGVudmlmX21vZHVsZSwKLSAgJmlzYXBpX21vZHVsZSwKLSAgTlVMTAotfTsKLW1vZHVsZSAqYXBfcHJlbG9hZGVkX21vZHVsZXNbXSA9IHsKLSAgJmNvcmVfbW9kdWxlLAotICAmc29fbW9kdWxlLAotICAmbWltZV9tb2R1bGUsCi0gICZhY2Nlc3NfbW9kdWxlLAotICAmYXV0aF9tb2R1bGUsCi0gICZuZWdvdGlhdGlvbl9tb2R1bGUsCi0gICZpbmNsdWRlc19tb2R1bGUsCi0gICZhdXRvaW5kZXhfbW9kdWxlLAotICAmZGlyX21vZHVsZSwKLSAgJmNnaV9tb2R1bGUsCi0gICZ1c2VyZGlyX21vZHVsZSwKLSAgJmFsaWFzX21vZHVsZSwKLSAgJmVudl9tb2R1bGUsCi0gICZjb25maWdfbG9nX21vZHVsZSwKLSAgJmFzaXNfbW9kdWxlLAotICAmaW1hcF9tb2R1bGUsCi0gICZhY3Rpb25fbW9kdWxlLAotICAmc2V0ZW52aWZfbW9kdWxlLAotICAmaXNhcGlfbW9kdWxlLAotICBOVUxMCi19OwpkaWZmIC0tZ2l0IGEvb3Mvd2luMzIvb3MuaCBiL29zL3dpbjMyL29zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZmZkN2UuLjAwMDAwMDAKLS0tIGEvb3Mvd2luMzIvb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0jaWZuZGVmIEFQQUNIRV9PU19ICi0jZGVmaW5lIEFQQUNIRV9PU19ICi0KLSNkZWZpbmUgUExBVEZPUk0gIldpbjMyIgotCi0vKgotICogVGhpcyBmaWxlIGluIGluY2x1ZGVkIGluIGFsbCBBcGFjaGUgc291cmNlIGNvZGUuIEl0IGNvbnRhaW5zIGRlZmluaXRpb25zCi0gKiBvZiBmYWNpbGl0aWVzIGF2YWlsYWJsZSBvbiBfdGhpc18gb3BlcmF0aW5nIHN5c3RlbSAoSEFWRV8qIG1hY3JvcyksCi0gKiBhbmQgcHJvdG90eXBlcyBvZiBPUyBzcGVjaWZpYyBmdW5jdGlvbnMgZGVmaW5lZCBpbiBvcy5jCi0gKi8KLQotLyogdGVtcG9yYXJpbHkgcmVwbGFjZSBjcnlwdCAqLwotLyogY2hhciAqY3J5cHQoY29uc3QgY2hhciAqcHcsIGNvbnN0IGNoYXIgKnNhbHQpOyAqLwotI2RlZmluZSBjcnlwdChidWYsc2FsdCkJICAgIChidWYpCi0KLS8qIEFsdGhvdWdoIERJUl9UWVBFIGlzIGRpcmVudCAoc2VlIG50L3JlYWRkaXIuaCkgd2UgbmVlZCBkaXJlY3QuaCBmb3IKLSAgIGNoZGlyKCkgKi8KLSNpbmNsdWRlIDxkaXJlY3QuaD4KLQotI2RlZmluZSBTVEFUVVMKLS8qI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIE5vdyBkZWZpbmVkIGluIHByb2plY3QgZmlsZXMgKi8KLSNpZm5kZWYgU1RSSUNUCi0gI2RlZmluZSBTVFJJQ1QKLSNlbmRpZgotI2RlZmluZSBDQVNFX0JMSU5EX0ZJTEVTWVNURU0KLSNkZWZpbmUgTk9fV1JJVEVWCi0jZGVmaW5lIE5PX1NFVFNJRAotI2RlZmluZSBOT19VU0VfU0lHQUNUSU9OCi0jZGVmaW5lIE5PX1RJTUVTCi0jZGVmaW5lIE5PX0dFVFRJTUVPRkRBWQotLy8jZGVmaW5lIE5FRURfUFJPQ0VTU19IICAgIGFsdGhvdWdoIHdlIGRvLCB0aGlzIGlzIHNwZWNpYWxseSBoYW5kbGVkIGluIGFwX2NvbmZpZy5oCi0jZGVmaW5lIFVTRV9MT05HSk1QCi0jZGVmaW5lIEhBVkVfTU1BUAotI2RlZmluZSBVU0VfTU1BUF9TQ09SRUJPQVJECi0jZGVmaW5lIE1VTFRJVEhSRUFECi0jZGVmaW5lIEhBVkVfQ0FOT05JQ0FMX0ZJTEVOQU1FCi0jZGVmaW5lIEhBVkVfRFJJVkVfTEVUVEVSUwotdHlwZWRlZiBpbnQgdWlkX3Q7Ci10eXBlZGVmIGludCBnaWRfdDsKLXR5cGVkZWYgaW50IHBpZF90OwotdHlwZWRlZiBpbnQgbW9kZV90OwotdHlwZWRlZiBjaGFyICogY2FkZHJfdDsKLQotLyoKLURlZmluZSBleHBvcnQgdHlwZXMuIEFQSV9FWFBPUlRfTk9OU1REIGlzIGEgbmFzdHkgaGFjayB0byBhdm9pZCBoYXZpbmcgdG8gZGVjbGFyZQotZXZlcnkgY29uZmlndXJhdGlvbiBmdW5jdGlvbiBhcyBfX3N0ZGNhbGwuCi0qLwotCi0jaWZkZWYgU0hBUkVEX01PRFVMRQotIyBkZWZpbmUgQVBJX1ZBUl9FWFBPUlQJCV9fZGVjbHNwZWMoZGxsaW1wb3J0KQotIyBkZWZpbmUgQVBJX0VYUE9SVCh0eXBlKSAgICBfX2RlY2xzcGVjKGRsbGltcG9ydCkgdHlwZSBfX3N0ZGNhbGwKLSMgZGVmaW5lIEFQSV9FWFBPUlRfTk9OU1REKHR5cGUpICAgIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSB0eXBlCi0jZWxzZQotIyBkZWZpbmUgQVBJX1ZBUl9FWFBPUlQJCV9fZGVjbHNwZWMoZGxsZXhwb3J0KQotIyBkZWZpbmUgQVBJX0VYUE9SVCh0eXBlKSAgICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdHlwZSBfX3N0ZGNhbGwKLSMgZGVmaW5lIEFQSV9FWFBPUlRfTk9OU1REKHR5cGUpICAgIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB0eXBlCi0jZW5kaWYKLSNkZWZpbmUgTU9EVUxFX1ZBUl9FWFBPUlQgICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLQotI2RlZmluZSBzdHJjYXNlY21wKHMxLCBzMikgc3RyaWNtcChzMSwgczIpCi0jZGVmaW5lIHN0cm5jYXNlY21wKHMxLCBzMiwgbikgc3RybmljbXAoczEsIHMyLCBuKQotI2RlZmluZSBsc3RhdCh4LCB5KSBzdGF0KHgsIHkpCi0jZGVmaW5lIFNfSVNMTksobSkgKDApCi0jZGVmaW5lIFNfSVNSRUcobSkgKChtICYgX1NfSUZSRUcpID09IF9TX0lGUkVHKQotI2lmbmRlZiBTX0lTRElSCi0jZGVmaW5lIFNfSVNESVIobSkgKCgobSkgJiBTX0lGRElSKSA9PSBTX0lGRElSKQotI2VuZGlmCi0jaWZuZGVmIFNfSVNSRUcKLSNkZWZpbmUgU19JU1JFRyhtKSAgICAgICgoKG0pJihTX0lGUkVHKSkgPT0gKFNfSUZSRUcpKQotI2VuZGlmCi0jZGVmaW5lIFNURElOX0ZJTEVOTyAgMAotI2RlZmluZSBTVERPVVRfRklMRU5PIDEKLSNkZWZpbmUgU1RERVJSX0ZJTEVOTyAyCi0jZGVmaW5lIEpNUF9CVUYgam1wX2J1ZgotI2RlZmluZSBzbGVlcCh0KSBTbGVlcCh0KjEwMDApCi0jZGVmaW5lIE9fQ1JFQVQgX09fQ1JFQVQKLSNkZWZpbmUgT19SRFdSIF9PX1JEV1IKLSNkZWZpbmUgU0lHUElQRSAxNwotLyogU2VlbXMgV2luZG93cyBpcyBub3QgYSBzdWJnZW5pdXMgKi8KLSNkZWZpbmUgTk9fU0xBQ0sKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2RlZmluZSBOT19PVEhFUl9DSElMRAotI2RlZmluZSBOT19SRUxJQUJMRV9QSVBFRF9MT0dTCi0KLV9faW5saW5lIGludCBhcF9vc19pc19wYXRoX2Fic29sdXRlKGNvbnN0IGNoYXIgKmZpbGUpCi17Ci0gIC8qIEZvciBub3csIGp1c3QgZG8gdGhlIHNhbWUgY2hlY2sgdGhhdCBodHRwX3JlcXVlc3QuYyBhbmQgbW9kX2FsaWFzLmMKLSAgICogZG8uIAotICAgKi8KLSAgcmV0dXJuIGZpbGVbMF0gPT0gJy8nIHx8IGZpbGVbMV0gPT0gJzonOwotfQotCi0jZGVmaW5lIHN0YXQoZixwcykgIG9zX3N0YXQoZixwcykKLUFQSV9FWFBPUlQoaW50KSBvc19zdGF0KGNvbnN0IGNoYXIgKnN6UGF0aCxzdHJ1Y3Qgc3RhdCAqcFN0YXQpOwotCi1BUElfRVhQT1JUKGludCkgb3Nfc3RyZnRpbWUoY2hhciAqcywgc2l6ZV90IG1heCwgY29uc3QgY2hhciAqZm9ybWF0LCBjb25zdCBzdHJ1Y3QgdG0gKnRtKTsKLQotI2RlZmluZSBfc3Bhd252KG1vZGUsY21kbmFtZSxhcmd2KQkgICAgb3Nfc3Bhd252KG1vZGUsY21kbmFtZSxhcmd2KQotI2RlZmluZSBzcGF3bnYobW9kZSxjbWRuYW1lLGFyZ3YpCSAgICBvc19zcGF3bnYobW9kZSxjbWRuYW1lLGFyZ3YpCi1BUElfRVhQT1JUKGludCkgb3Nfc3Bhd252KGludCBtb2RlLGNvbnN0IGNoYXIgKmNtZG5hbWUsY29uc3QgY2hhciAqY29uc3QgKmFyZ3YpOwotI2RlZmluZSBfc3Bhd252ZShtb2RlLGNtZG5hbWUsYXJndixlbnZwKSAgICBvc19zcGF3bnZlKG1vZGUsY21kbmFtZSxhcmd2LGVudnApCi0jZGVmaW5lIHNwYXdudmUobW9kZSxjbWRuYW1lLGFyZ3YsZW52cCkJICAgIG9zX3NwYXdudmUobW9kZSxjbWRuYW1lLGFyZ3YsZW52cCkKLUFQSV9FWFBPUlQoaW50KSBvc19zcGF3bnZlKGludCBtb2RlLGNvbnN0IGNoYXIgKmNtZG5hbWUsY29uc3QgY2hhciAqY29uc3QgKmFyZ3YsY29uc3QgY2hhciAqY29uc3QgKmVudnApOwotI2RlZmluZSBfc3Bhd25sZQkJCSAgICBvc19zcGF3bmxlCi0jZGVmaW5lIHNwYXdubGUJCQkJICAgIG9zX3NwYXdubGUKLUFQSV9FWFBPUlQoaW50KSBvc19zcGF3bmxlKGludCBtb2RlLGNvbnN0IGNoYXIgKmNtZG5hbWUsLi4uKTsKLQotLyogT1MtZGVwZW5kZW50IGZpbGVuYW1lIHJvdXRpbmVzIGluIHV0aWxfd2luMzIuYyAqLwotCi1BUElfRVhQT1JUKGludCkgYXBfb3NfaXNfZmlsZW5hbWVfdmFsaWQoY29uc3QgY2hhciAqZmlsZSk7Ci0KLS8qIEFic3RyYWN0aW9ucyBmb3IgZGVhbGluZyB3aXRoIHNoYXJlZCBvYmplY3QgZmlsZXMgKERMTHMgb24gV2luMzIpLgotICogVGhlc2UgYXJlIHVzZWQgYnkgbW9kX3NvLmMKLSAqLwotI2RlZmluZSBhcF9vc19kc29faGFuZGxlX3QgIEhJTlNUQU5DRQotI2RlZmluZSBhcF9vc19kc29faW5pdCgpCi0jZGVmaW5lIGFwX29zX2Rzb19sb2FkKGwpICAgTG9hZExpYnJhcnlFeChsLCBOVUxMLCBMT0FEX1dJVEhfQUxURVJFRF9TRUFSQ0hfUEFUSCkKLSNkZWZpbmUgYXBfb3NfZHNvX3VubG9hZChsKSBGcmVlTGlicmFyeShsKQotI2RlZmluZSBhcF9vc19kc29fc3ltKGgscykgIEdldFByb2NBZGRyZXNzKGgscykKLSNkZWZpbmUgYXBfb3NfZHNvX2Vycm9yKCkgICAiIgkvKiBmb3Igbm93ICovCi0KLS8qIE90aGVyIGFwX29zXyByb3V0aW5lcyBub3QgdXNlZCBieSB0aGlzIHBsYXRmb3JtICovCi0jZGVmaW5lIGFwX29zX2tpbGwocGlkLCBzaWcpICAgICAgICAgICAgICAgIGtpbGwocGlkLCBzaWcpCi0KLSNlbmRpZiAgIC8qICEgQVBBQ0hFX09TX0ggKi8KZGlmZiAtLWdpdCBhL29zL3dpbjMyL3V0aWxfd2luMzIuYyBiL29zL3dpbjMyL3V0aWxfd2luMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ4ZTBmOS4uMDAwMDAwMAotLS0gYS9vcy93aW4zMi91dGlsX3dpbjMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NzcgKzAsMCBAQAotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLQotLyogUmV0dXJucyBUUlVFIGlmIHRoZSBpbnB1dCBzdHJpbmcgaXMgYSBzdHJpbmcKLSAqIG9mIG9uZSBvciBtb3JlICcuJyBjaGFyYWN0ZXJzLgotICovCi1zdGF0aWMgQk9PTCBPbmx5RG90cyhjaGFyICpwU3RyaW5nKQotewotICAgIGNoYXIgKmM7Ci0KLSAgICBpZiAoKnBTdHJpbmcgPT0gJ1wwJykKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgZm9yIChjID0gcFN0cmluZzsqYztjKyspCi0gICAgICAgIGlmICgqYyAhPSAnLicpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyogQWNjZXB0cyBhcyBpbnB1dCBhIHBhdGhuYW1lLCBhbmQgdHJpZXMgdG8gbWF0Y2ggaXQgdG8gYW4gCi0gKiBleGlzdGluZyBwYXRoIGFuZCByZXR1cm4gdGhlIHBhdGhuYW1lIGluIHRoZSBjYXNlIHRoYXQKLSAqIGlzIHByZXNlbnQgb24gdGhlIGV4aXN0aW5nIHBhdGguICBUaGlzIHJvdXRpbmUgYWxzbwotICogY29udmVydHMgYWxpYXMgbmFtZXMgdG8gbG9uZyBuYW1lcy4KLSAqLwotQVBJX0VYUE9SVChjaGFyICopIGFwX29zX3N5c3RlbWNhc2VfZmlsZW5hbWUocG9vbCAqcFBvb2wsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3pGaWxlKQotewotICAgIGNoYXIgYnVmW0hVR0VfU1RSSU5HX0xFTl07Ci0gICAgY2hhciAqcElucHV0TmFtZTsKLSAgICBjaGFyICpwLCAqcTsKLSAgICBCT09MIGJEb25lID0gRkFMU0U7Ci0gICAgQk9PTCBiRmlsZUV4aXN0cyA9IFRSVUU7Ci0gICAgSEFORExFIGhGaW5kOwotICAgIFdJTjMyX0ZJTkRfREFUQSB3ZmQ7Ci0KLSAgICBpZiAoIXN6RmlsZSB8fCBzdHJsZW4oc3pGaWxlKSA9PSAwIHx8IHN0cmxlbihzekZpbGUpID49IHNpemVvZihidWYpKQotICAgICAgICByZXR1cm4gYXBfcHN0cmR1cChwUG9vbCwgIiIpOwotCi0gICAgYnVmWzBdID0gJ1wwJzsKLSAgICBwSW5wdXROYW1lID0gYXBfcHN0cmR1cChwUG9vbCwgc3pGaWxlKTsKLQotICAgIC8qIEZpcnN0IGNvbnZlcnQgYWxsIHNsYXNoZXMgdG8gXCBzbyBXaW4zMiBjYWxscyB3b3JrIE9LICovCi0gICAgZm9yIChwID0gcElucHV0TmFtZTsgKnA7IHArKykgewotICAgICAgICBpZiAoKnAgPT0gJy8nKQotICAgICAgICAgICAgKnAgPSAnXFwnOwotICAgIH0KLSAgICAKLSAgICBwID0gcElucHV0TmFtZTsKLSAgICAvKiBJZiB0aGVyZSBpcyBkcml2ZSBpbmZvcm1hdGlvbiwgY29weSBpdCBvdmVyLiAqLyAKLSAgICBpZiAocElucHV0TmFtZVsxXSA9PSAnOicpIHsKLSAgICAgICAgYnVmWzBdID0gdG9sb3dlcigqcCsrKTsKLSAgICAgICAgYnVmWzFdID0gKnArKzsKLSAgICAgICAgYnVmWzJdID0gJ1wwJzsKLQotICAgICAgICAvKiBJZiBhbGwgd2UgaGF2ZSBpcyBhIGRyaXZlIGxldHRlciwgdGhlbiB3ZSBhcmUgZG9uZSAqLwotICAgICAgICBpZiAoc3RybGVuKHBJbnB1dE5hbWUpID09IDIpCi0gICAgICAgICAgICBiRG9uZSA9IFRSVUU7Ci0gICAgfQotICAgIAotICAgIHEgPSBwOwotICAgIGlmICgqcCA9PSAnXFwnKSB7Ci0gICAgICAgIHArKzsKLSAgICAgICAgaWYgKCpwID09ICdcXCcpICAvKiBQb3NzaWJsZSBVTkMgbmFtZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBwKys7Ci0gICAgICAgICAgICAvKiBHZXQgcGFzdCB0aGUgbWFjaGluZSBuYW1lLiAgRmluZEZpcnN0RmlsZSAqLwotICAgICAgICAgICAgLyogd2lsbCBub3QgZmluZCBhIG1hY2hpbmUgbmFtZSBvbmx5ICovCi0gICAgICAgICAgICBwID0gc3RyY2hyKHAsICdcXCcpOyAKLSAgICAgICAgICAgIGlmIChwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHArKzsKLSAgICAgICAgICAgICAgICAvKiBHZXQgcGFzdCB0aGUgc2hhcmUgbmFtZS4gIEZpbmRGaXJzdEZpbGUgKi8KLSAgICAgICAgICAgICAgICAvKiB3aWxsIG5vdCBmaW5kIGEgXFxtYWNoaW5lXHNoYXJlIG5hbWUgb25seSAqLwotICAgICAgICAgICAgICAgIHAgPSBzdHJjaHIocCwgJ1xcJyk7IAotICAgICAgICAgICAgICAgIGlmIChwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cm5jYXQoYnVmLHEscC1xKTsKLSAgICAgICAgICAgICAgICAgICAgcSA9IHA7Ci0gICAgICAgICAgICAgICAgICAgIHArKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghcCkKLSAgICAgICAgICAgICAgICBwID0gcTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHAgPSBzdHJjaHIocCwgJ1xcJyk7Ci0KLSAgICB3aGlsZSAoIWJEb25lKSB7Ci0gICAgICAgIGlmIChwKQotICAgICAgICAgICAgKnAgPSAnXDAnOwotCi0gICAgICAgIGlmIChzdHJjaHIocSwgJyonKSB8fCBzdHJjaHIocSwgJz8nKSkKLSAgICAgICAgICAgIGJGaWxlRXhpc3RzID0gRkFMU0U7Ci0KLSAgICAgICAgLyogSWYgdGhlIHBhdGggZXhpc3RzIHNvIGZhciwgY2FsbCBGaW5kRmlyc3RGaWxlCi0gICAgICAgICAqIGFnYWluLiAgSG93ZXZlciwgaWYgdGhpcyBwb3J0aW9uIG9mIHRoZSBwYXRoIGNvbnRhaW5zCi0gICAgICAgICAqIG9ubHkgJy4nIGNoYXJhdGVycywgc2tpcCB0aGUgY2FsbCB0byBGaW5kRmlyc3RGaWxlCi0gICAgICAgICAqIHNpbmNlIGl0IHdpbGwgY29udmVydCAnLicgYW5kICcuLicgdG8gYWN0dWFsIG5hbWVzLgotICAgICAgICAgKiBOb3RlOiBpbiB0aGUgY2FsbCB0byBPbmx5RG90cywgd2UgbWF5IGhhdmUgdG8gc2tpcAotICAgICAgICAgKiAgICAgICBhIGxlYWRpbmcgc2xhc2guCi0gICAgICAgICAqLwotICAgICAgICBpZiAoYkZpbGVFeGlzdHMgJiYgIU9ubHlEb3RzKCgqcSA9PSAnLicgPyBxIDogcSsxKSkpIHsgICAgICAgICAgICAKLSAgICAgICAgICAgIGhGaW5kID0gRmluZEZpcnN0RmlsZShwSW5wdXROYW1lLCAmd2ZkKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGhGaW5kID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgYkZpbGVFeGlzdHMgPSBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIEZpbmRDbG9zZShoRmluZCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKnEgPT0gJ1xcJykKLSAgICAgICAgICAgICAgICAgICAgc3RyY2F0KGJ1ZiwiXFwiKTsKLSAgICAgICAgICAgICAgICBzdHJjYXQoYnVmLCB3ZmQuY0ZpbGVOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCFiRmlsZUV4aXN0cyB8fCBPbmx5RG90cygoKnEgPT0gJy4nID8gcSA6IHErMSkpKSB7Ci0gICAgICAgICAgICBzdHJjYXQoYnVmLCBxKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHApIHsKLSAgICAgICAgICAgIHEgPSBwOwotICAgICAgICAgICAgKnArKyA9ICdcXCc7Ci0gICAgICAgICAgICBwID0gc3RyY2hyKHAsICdcXCcpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYkRvbmUgPSBUUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qIEZpcnN0IGNvbnZlcnQgYWxsIHNsYXNoZXMgdG8gLyBzbyBzZXJ2ZXIgY29kZSBoYW5kbGVzIGl0IG9rICovCi0gICAgZm9yIChwID0gYnVmOyAqcDsgcCsrKSB7Ci0gICAgICAgIGlmICgqcCA9PSAnXFwnKQotICAgICAgICAgICAgKnAgPSAnLyc7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFwX3BzdHJkdXAocFBvb2wsIGJ1Zik7Ci19Ci0KLQotLyogIFBlcmZvcm0gY2Fub25pY2FsaXphdGlvbiB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCB0aGUKLSAqICBpbnB1dCBjYXNlIGlzIHByZXNlcnZlZC4KLSAqLwotQVBJX0VYUE9SVChjaGFyICopIGFwX29zX2Nhc2VfY2Fub25pY2FsX2ZpbGVuYW1lKHBvb2wgKnBQb29sLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzekZpbGUpCi17Ci0gICAgY2hhciAqcE5ld1N0cjsKLSAgICBjaGFyICpzOwotICAgIGNoYXIgKnA7IAotICAgIGNoYXIgKnE7Ci0KLSAgICBpZiAoc3pGaWxlID09IE5VTEwgfHwgc3RybGVuKHN6RmlsZSkgPT0gMCkKLSAgICAgICAgcmV0dXJuIGFwX3BzdHJkdXAocFBvb2wsICIiKTsKLQotICAgIHBOZXdTdHIgPSBhcF9wc3RyZHVwKHBQb29sLCBzekZpbGUpOwotCi0gICAgLyogIENoYW5nZSBhbGwgJ1wnIGNoYXJhY3RlcnMgdG8gJy8nIGNoYXJhY3RlcnMuCi0gICAgICogIFdoaWxlIGRvaW5nIHRoaXMsIHJlbW92ZSBhbnkgdHJhaWxpbmcgJy4nLgotICAgICAqICBBbHNvLCBibG93IGF3YXkgYW55IGRpcmVjdG9yaWVzIHdpdGggMyBvcgotICAgICAqICBtb3JlICcuJwotICAgICAqLwotICAgIGZvciAocCA9IHBOZXdTdHIscyA9IHBOZXdTdHI7ICpzOyBzKysscCsrKSB7Ci0gICAgICAgIGlmICgqcyA9PSAnXFwnIHx8ICpzID09ICcvJykgewotCi0gICAgICAgICAgICBxID0gcDsKLSAgICAgICAgICAgIHdoaWxlIChwID4gcE5ld1N0ciAmJiAqKHAtMSkgPT0gJy4nKQotICAgICAgICAgICAgICAgIHAtLTsKLQotICAgICAgICAgICAgaWYgKHAgPT0gcE5ld1N0ciAmJiBxLXAgPD0gMiAmJiAqcCA9PSAnLicpCi0gICAgICAgICAgICAgICAgcCA9IHE7Ci0gICAgICAgICAgICBlbHNlIGlmIChwID4gcE5ld1N0ciAmJiBwIDwgcSAmJiAqKHAtMSkgPT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHEtcCA+IDIpCi0gICAgICAgICAgICAgICAgICAgIHAtLTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHAgPSBxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAqcCA9ICcvJzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICpwID0gKnM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKnAgPSAnXDAnOwotCi0gICAgLyogIEJsb3cgYXdheSBhbnkgZmluYWwgdHJhaWxpbmcgJy4nIHNpbmNlIG9uIFdpbjMyCi0gICAgICogIGZvby5iYXQgPT0gZm9vLmJhdC4gPT0gZm9vLmJhdC4uLiBldGMuCi0gICAgICogIEFsc28gYmxvdyBhd2F5IGFueSB0cmFpbGluZyBzcGFjZXMgc2luY2UKLSAgICAgKiAgImZpbGVuYW1lIiA9PSAiZmlsZW5hbWUgIgotICAgICAqLwotICAgIHEgPSBwOwotICAgIHdoaWxlIChwID4gcE5ld1N0ciAmJiAoKihwLTEpID09ICcuJyB8fCAqKHAtMSkgPT0gJyAnKSkKLSAgICAgICAgcC0tOwotICAgIGlmICgocCA+IHBOZXdTdHIpIHx8Ci0gICAgICAgIChwID09IHBOZXdTdHIgJiYgcS1wID4gMikpCi0gICAgICAgICpwID0gJ1wwJzsKLSAgICAgICAgCi0KLSAgICAvKiAgT25lIG1vcmUgc2VjdXJpdHkgaXNzdWUgdG8gZGVhbCB3aXRoLiAgV2luMzIgYWxsb3dzCi0gICAgICogIHlvdSB0byBjcmVhdGUgbG9uZyBmaWxlbmFtZXMuICBIb3dldmVyLCBhbGlhcyBmaWxlbmFtZXMKLSAgICAgKiAgYXJlIGFsd2F5cyBjcmVhdGVkIHNvIHRoYXQgdGhlIGZpbGVuYW1lIHdpbGwKLSAgICAgKiAgY29uZm9ybSB0byA4LjMgcnVsZXMuICBBY2NvcmRpbmcgdG8gdGhlIE1pY3Jvc29mdAotICAgICAqICBEZXZlbG9wZXIncyBuZXR3b3JrIENEICgxLzk4KSAKLSAgICAgKiAgIkF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGFsaWFzZXMgYXJlIGNvbXBvc2VkIG9mIHRoZSAKLSAgICAgKiAgIGZpcnN0IHNpeCBjaGFyYWN0ZXJzIG9mIHRoZSBmaWxlbmFtZSBwbHVzIH5uIAotICAgICAqICAgKHdoZXJlIG4gaXMgYSBudW1iZXIpIGFuZCB0aGUgZmlyc3QgdGhyZWUgY2hhcmFjdGVycyAKLSAgICAgKiAgIGFmdGVyIHRoZSBsYXN0IHBlcmlvZC4iCi0gICAgICogIEhlcmUsIHdlIGF0dGVtcHQgdG8gZGV0ZWN0IGFuZCBkZWNvZGUgdGhlc2UgbmFtZXMuCi0gICAgICovCi0gICAgcCA9IHN0cmNocihwTmV3U3RyLCAnficpOwotICAgIGlmIChwICE9IE5VTEwpIHsKLSAgICAgICAgY2hhciAqcENvbnZlcnRlZE5hbWUsICpwUXN0ciwgKnBQc3RyOwotICAgICAgICBjaGFyIGJ1ZltIVUdFX1NUUklOR19MRU5dOwotICAgICAgICAvKiBXZSBwb3RlbnRpYWxseSBoYXZlIGEgc2hvcnQgbmFtZS4gIENhbGwgCi0gICAgICAgICAqIGFwX29zX3N5c3RlbWNhc2VfZmlsZW5hbWUgdG8gZXhhbWluZSB0aGUgZmlsZXN5c3RlbQotICAgICAgICAgKiBhbmQgcG9zc2libHkgZXh0cmFjdCB0aGUgbG9uZyBuYW1lLgotICAgICAgICAgKi8KLSAgICAgICAgcENvbnZlcnRlZE5hbWUgPSBhcF9vc19zeXN0ZW1jYXNlX2ZpbGVuYW1lKHBQb29sLCBwTmV3U3RyKTsKLQotICAgICAgICAvKiBTaW5jZSB3ZSB3YW50IHRvIHByZXNlcnZlIHRoZSBpbmNvbWluZyBjYXNlIGFzIG11Y2gKLSAgICAgICAgICogYXMgd2UgY2FuLCBjb21wYXJlIGZvciBkaWZmZXJlbmNlcyBpbiB0aGUgc3RyaW5nIGFuZAotICAgICAgICAgKiBvbmx5IHN1YnN0aXR1dGUgaW4gdGhlIHBhdGggbmFtZXMgdGhhdCBjaGFuZ2VkLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHN0cmljbXAocE5ld1N0ciwgcENvbnZlcnRlZE5hbWUpKSB7Ci0gICAgICAgICAgICBidWZbMF0gPSAnXDAnOwotCi0gICAgICAgICAgICBxID0gcFFzdHIgPSBwQ29udmVydGVkTmFtZTsKLSAgICAgICAgICAgIHAgPSBwUHN0ciA9IHBOZXdTdHI7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgcSA9IHN0cmNocihxLCcvJyk7Ci0gICAgICAgICAgICAgICAgcCA9IHN0cmNocihwLCcvJyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICpxID0gJ1wwJzsKLSAgICAgICAgICAgICAgICAgICAgKnAgPSAnXDAnOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChzdHJpY21wKHBRc3RyLCBwUHN0cikpIAotICAgICAgICAgICAgICAgICAgICBzdHJjYXQoYnVmLCBwUXN0cik7ICAgLyogQ29udmVydGVkIG5hbWUgKi8KLSAgICAgICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgICAgICAgICBzdHJjYXQoYnVmLCBwUHN0cik7ICAgLyogT3JpZ2luYWwgbmFtZSAgKi8KLQotCi0gICAgICAgICAgICAgICAgaWYgKHAgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBwUXN0ciA9IHE7Ci0gICAgICAgICAgICAgICAgICAgIHBQc3RyID0gcDsKLSAgICAgICAgICAgICAgICAgICAgKnErKyA9ICcvJzsKLSAgICAgICAgICAgICAgICAgICAgKnArKyA9ICcvJzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gd2hpbGUgKHAgIT0gTlVMTCk7IAotCi0gICAgICAgICAgICBwTmV3U3RyID0gYXBfcHN0cmR1cChwUG9vbCwgYnVmKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcmV0dXJuIHBOZXdTdHI7Ci19Ci0KLS8qICBQZXJmb3JtIGNvbXBsZXRlIGNhbm9uaWNhbGl6YXRpb24uCi0gKi8KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9vc19jYW5vbmljYWxfZmlsZW5hbWUocG9vbCAqcFBvb2wsIGNvbnN0IGNoYXIgKnN6RmlsZSkKLXsKLSAgICBjaGFyICpwTmV3TmFtZTsKLSAgICBwTmV3TmFtZSA9IGFwX29zX2Nhc2VfY2Fub25pY2FsX2ZpbGVuYW1lKHBQb29sLCBzekZpbGUpOwotICAgIHN0cmx3cihwTmV3TmFtZSk7Ci0gICAgcmV0dXJuIHBOZXdOYW1lOwotfQotCi0vKiBXaW45NSBkb2Vzbid0IGxpa2UgdHJhaWxpbmcgL3MuIE5UIGFuZCBVbml4IGRvbid0IG1pbmQuIFRoaXMgd29ya3MgCi0gKiBhcm91bmQgdGhlIHByb2JsZW0uCi0gKiBFcnJyLi4uIGV4Y2VwdCBpZiBpdCBpcyBVTkMgYW5kIHdlIGFyZSByZWZlcnJpbmcgdG8gdGhlIHJvb3Qgb2YgCi0gKiB0aGUgVU5DLCB3ZSBNVVNUIGhhdmUgYSB0cmFpbGluZyBcIGFuZCB3ZSBjYW4ndCB1c2UgL3MuIEplZXouIAotICogTm90IHN1cmUgaWYgdGhpcyByZWZlcnMgdG8gYWxsIFVOQ3Mgb3IganVzdCByb290cywKLSAqIGJ1dCBJJ20gZ29pbmcgdG8gZml4IGl0IGZvciBhbGwgY2FzZXMgZm9yIG5vdy4gKEJlbikKLSAqLwotCi0jdW5kZWYgc3RhdAotQVBJX0VYUE9SVChpbnQpIG9zX3N0YXQoY29uc3QgY2hhciAqc3pQYXRoLCBzdHJ1Y3Qgc3RhdCAqcFN0YXQpCi17Ci0gICAgaW50IG47Ci0gICAgCi0gICAgaWYgKHN0cmxlbihzelBhdGgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGlmIChzelBhdGhbMF0gPT0gJy8nICYmIHN6UGF0aFsxXSA9PSAnLycpIHsKLQljaGFyIGJ1ZltfTUFYX1BBVEhdOwotCWNoYXIgKnM7Ci0JaW50IG5TbGFzaGVzID0gMDsKLQotCWFwX2Fzc2VydChzdHJsZW4oc3pQYXRoKSA8IF9NQVhfUEFUSCk7Ci0Jc3RyY3B5KGJ1Ziwgc3pQYXRoKTsKLQlmb3IgKHMgPSBidWY7ICpzOyArK3MpIHsKLQkgICAgaWYgKCpzID09ICcvJykgewotCQkqcyA9ICdcXCc7Ci0JCSsrblNsYXNoZXM7Ci0JICAgIH0KLQl9Ci0JLyogdGhlbiB3ZSBuZWVkIHRvIGFkZCBvbmUgbW9yZSB0byBnZXQgXFxtYWNoaW5lXHNoYXJlXCAqLwotCWlmIChuU2xhc2hlcyA9PSAzKSB7Ci0JICAgICpzKysgPSAnXFwnOwotCX0KLQkqcyA9ICdcMCc7Ci0JcmV0dXJuIHN0YXQoYnVmLCBwU3RhdCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBCZWxvdyByZW1vdmVzIHRoZSB0cmFpbGluZyAvLCBob3dldmVyLCBkbyBub3QgcmVtb3ZlCi0gICAgICogaXQgaW4gdGhlIGNhc2Ugb2YgJ3g6Lycgb3Igc3RhdCB3aWxsIGZhaWwKLSAgICAgKi8KLSAgICBuID0gc3RybGVuKHN6UGF0aCk7Ci0gICAgaWYgKChzelBhdGhbbiAtIDFdID09ICdcXCcgfHwgc3pQYXRoW24gLSAxXSA9PSAnLycpICYmCi0gICAgICAgICEobiA9PSAzICYmIHN6UGF0aFsxXSA9PSAnOicpKSB7Ci0gICAgICAgIGNoYXIgYnVmW19NQVhfUEFUSF07Ci0gICAgICAgIAotICAgICAgICBhcF9hc3NlcnQobiA8IF9NQVhfUEFUSCk7Ci0gICAgICAgIHN0cmNweShidWYsIHN6UGF0aCk7Ci0gICAgICAgIGJ1ZltuIC0gMV0gPSAnXDAnOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN0YXQoYnVmLCBwU3RhdCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0KHN6UGF0aCwgcFN0YXQpOwotfQotCi0vKiBGaXggdHdvIHJlYWxseSBjcmFwIHByb2JsZW1zIHdpdGggV2luMzIgc3Bhd25bbHZdZSo6Ci0gKgotICogIDEuIFdpbjMyIGRvZXNuJ3QgZGVhbCB3aXRoIHNwYWNlcyBpbiBhcmd2LgotICogIDIuIFdpbjk1IGRvZXNuJ3QgbGlrZSAvIGluIGNtZG5hbWUuCi0gKi8KLQotI3VuZGVmIF9zcGF3bnYKLUFQSV9FWFBPUlQoaW50KSBvc19zcGF3bnYoaW50IG1vZGUsIGNvbnN0IGNoYXIgKmNtZG5hbWUsCi0JCQkgIGNvbnN0IGNoYXIgKmNvbnN0ICphcmd2KQotewotICAgIGludCBuOwotICAgIGNoYXIgKiphc3pBcmdzOwotICAgIGNvbnN0IGNoYXIgKnN6QXJnOwotICAgIGNoYXIgKnN6Q21kOwotICAgIGNoYXIgKnM7Ci0gICAgCi0gICAgc3pDbWQgPSBfYWxsb2NhKHN0cmxlbihjbWRuYW1lKSsxKTsKLSAgICBzdHJjcHkoc3pDbWQsIGNtZG5hbWUpOwotICAgIGZvciAocyA9IHN6Q21kOyAqczsgKytzKSB7Ci0gICAgICAgIGlmICgqcyA9PSAnLycpIHsKLSAgICAgICAgICAgICpzID0gJ1xcJzsKLQl9Ci0gICAgfQotCi0gICAgZm9yIChuID0gMDsgYXJndltuXTsgKytuKQotICAgICAgICA7Ci0KLSAgICBhc3pBcmdzID0gX2FsbG9jYSgobiArIDEpICogc2l6ZW9mKGNvbnN0IGNoYXIgKikpOwotCi0gICAgZm9yIChuID0gMDsgc3pBcmcgPSBhcmd2W25dOyArK24pIHsKLSAgICAgICAgaWYgKHN0cmNocihzekFyZywgJyAnKSkgewotICAgICAgICAgICAgaW50IGwgPSBzdHJsZW4oc3pBcmcpOwotCi0gICAgICAgICAgICBhc3pBcmdzW25dID0gX2FsbG9jYShsICsgMiArIDEpOwotICAgICAgICAgICAgYXN6QXJnc1tuXVswXSA9ICciJzsKLSAgICAgICAgICAgIHN0cmNweSgmYXN6QXJnc1tuXVsxXSwgc3pBcmcpOwotICAgICAgICAgICAgYXN6QXJnc1tuXVtsICsgMV0gPSAnIic7Ci0gICAgICAgICAgICBhc3pBcmdzW25dW2wgKyAyXSA9ICdcMCc7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhc3pBcmdzW25dID0gKGNoYXIgKilzekFyZzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGFzekFyZ3Nbbl0gPSBOVUxMOwotCi0gICAgcmV0dXJuIF9zcGF3bnYobW9kZSwgc3pDbWQsIGFzekFyZ3MpOwotfQotCi0jdW5kZWYgX3NwYXdudmUKLUFQSV9FWFBPUlQoaW50KSBvc19zcGF3bnZlKGludCBtb2RlLCBjb25zdCBjaGFyICpjbWRuYW1lLAotCQkJICAgY29uc3QgY2hhciAqY29uc3QgKmFyZ3YsIGNvbnN0IGNoYXIgKmNvbnN0ICplbnZwKQotewotICAgIGludCBuOwotICAgIGNoYXIgKiphc3pBcmdzOwotICAgIGNvbnN0IGNoYXIgKnN6QXJnOwotICAgIGNoYXIgKnN6Q21kOwotICAgIGNoYXIgKnM7Ci0gICAgCi0gICAgc3pDbWQgPSBfYWxsb2NhKHN0cmxlbihjbWRuYW1lKSsxKTsKLSAgICBzdHJjcHkoc3pDbWQsIGNtZG5hbWUpOwotICAgIGZvciAocyA9IHN6Q21kOyAqczsgKytzKSB7Ci0gICAgICAgIGlmICgqcyA9PSAnLycpIHsKLSAgICAgICAgICAgICpzID0gJ1xcJzsKLQl9Ci0gICAgfQotICAgIAotICAgIGZvciAobiA9IDA7IGFyZ3Zbbl07ICsrbikKLSAgICAgICAgOwotCi0gICAgYXN6QXJncyA9IF9hbGxvY2EoKG4gKyAxKSpzaXplb2YoY29uc3QgY2hhciAqKSk7Ci0KLSAgICBmb3IgKG4gPSAwOyBzekFyZyA9IGFyZ3Zbbl07ICsrbil7Ci0gICAgICAgIGlmIChzdHJjaHIoc3pBcmcsICcgJykpIHsKLSAgICAgICAgICAgIGludCBsID0gc3RybGVuKHN6QXJnKTsKLQotICAgICAgICAgICAgYXN6QXJnc1tuXSA9IF9hbGxvY2EobCArIDIgKyAxKTsKLSAgICAgICAgICAgIGFzekFyZ3Nbbl1bMF0gPSAnIic7Ci0gICAgICAgICAgICBzdHJjcHkoJmFzekFyZ3Nbbl1bMV0sIHN6QXJnKTsKLSAgICAgICAgICAgIGFzekFyZ3Nbbl1bbCArIDFdID0gJyInOwotICAgICAgICAgICAgYXN6QXJnc1tuXVtsICsgMl0gPSAnXDAnOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXN6QXJnc1tuXSA9IChjaGFyICopc3pBcmc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBhc3pBcmdzW25dID0gTlVMTDsKLQotICAgIHJldHVybiBfc3Bhd252ZShtb2RlLCBzekNtZCwgYXN6QXJncywgZW52cCk7Ci19Ci0KLUFQSV9FWFBPUlQoaW50KSBvc19zcGF3bmxlKGludCBtb2RlLCBjb25zdCBjaGFyICpjbWRuYW1lLCAuLi4pCi17Ci0gICAgaW50IG47Ci0gICAgdmFfbGlzdCB2bGlzdDsKLSAgICBjaGFyICoqYXN6QXJnczsKLSAgICBjb25zdCBjaGFyICpzekFyZzsKLSAgICBjb25zdCBjaGFyICpjb25zdCAqYXN6RW52OwotICAgIGNoYXIgKnN6Q21kOwotICAgIGNoYXIgKnM7Ci0gICAgCi0gICAgc3pDbWQgPSBfYWxsb2NhKHN0cmxlbihjbWRuYW1lKSsxKTsKLSAgICBzdHJjcHkoc3pDbWQsIGNtZG5hbWUpOwotICAgIGZvciAocyA9IHN6Q21kOyAqczsgKytzKSB7Ci0gICAgICAgIGlmICgqcyA9PSAnLycpIHsKLSAgICAgICAgICAgICpzID0gJ1xcJzsKLQl9Ci0gICAgfQotCi0gICAgdmFfc3RhcnQodmxpc3QsIGNtZG5hbWUpOwotICAgIGZvciAobiA9IDA7IHZhX2FyZyh2bGlzdCwgY29uc3QgY2hhciAqKTsgKytuKQotICAgICAgICA7Ci0gICAgdmFfZW5kKHZsaXN0KTsKLQotICAgIGFzekFyZ3MgPSBfYWxsb2NhKChuICsgMSkgKiBzaXplb2YoY29uc3QgY2hhciAqKSk7Ci0KLSAgICB2YV9zdGFydCh2bGlzdCwgY21kbmFtZSk7Ci0gICAgZm9yIChuID0gMDsgc3pBcmcgPSB2YV9hcmcodmxpc3QsIGNvbnN0IGNoYXIgKik7ICsrbikgewotICAgICAgICBpZiAoc3RyY2hyKHN6QXJnLCAnICcpKSB7Ci0gICAgICAgICAgICBpbnQgbCA9IHN0cmxlbihzekFyZyk7Ci0KLSAgICAgICAgICAgIGFzekFyZ3Nbbl0gPSBfYWxsb2NhKGwgKyAyICsgMSk7Ci0gICAgICAgICAgICBhc3pBcmdzW25dWzBdID0gJyInOwotICAgICAgICAgICAgc3RyY3B5KCZhc3pBcmdzW25dWzFdLCBzekFyZyk7Ci0gICAgICAgICAgICBhc3pBcmdzW25dW2wgKyAxXSA9ICciJzsKLSAgICAgICAgICAgIGFzekFyZ3Nbbl1bbCArIDJdID0gJ1wwJzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGFzekFyZ3Nbbl0gPSAoY2hhciAqKXN6QXJnOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXN6QXJnc1tuXSA9IE5VTEw7Ci0KLSAgICBhc3pFbnYgPSB2YV9hcmcodmxpc3QsIGNvbnN0IGNoYXIgKmNvbnN0ICopOwotICAgIHZhX2VuZCh2bGlzdCk7Ci0gICAgCi0gICAgcmV0dXJuIF9zcGF3bnZlKG1vZGUsIHN6Q21kLCBhc3pBcmdzLCBhc3pFbnYpOwotfQotCi0jdW5kZWYgc3RyZnRpbWUKLQotLyogUGFydGlhbCByZXBsYWNlbWVudCBmb3Igc3RyZnRpbWUuIFRoaXMgYWRkcyBjZXJ0YWluIGV4cGFuZG9zIHRvIHRoZQotICogV2luZG93cyB2ZXJzaW9uCi0gKi8KLQotQVBJX0VYUE9SVChpbnQpIG9zX3N0cmZ0aW1lKGNoYXIgKnMsIHNpemVfdCBtYXgsIGNvbnN0IGNoYXIgKmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdG0gKnRtKSB7Ci0gICAvKiBJZiB0aGUgbmV3IGZvcm1hdCBzdHJpbmcgaXMgYmlnZ2VyIHRoYW4gbWF4LCB0aGUgcmVzdWx0IHN0cmluZyBwcm9iYWJseQotICAgICogd29uJ3QgZml0IGFueXdheS4gV2hlbiAlLWV4cGFuZG9zIGFyZSBhZGRlZCwgbWFkZSBzdXJlIHRoZSBwYWRkaW5nIGJlbG93Ci0gICAgKiBpcyBlbm91Z2guCi0gICAgKi8KLSAgICBjaGFyICpuZXdfZm9ybWF0ID0gKGNoYXIgKikgX2FsbG9jYShtYXggKyAxMSk7Ci0gICAgc2l6ZV90IGksIGosIGZvcm1hdF9sZW5ndGggPSBzdHJsZW4oZm9ybWF0KTsKLSAgICBpbnQgcmV0dXJuX3ZhbHVlOwotICAgIGludCBsZW5ndGhfd3JpdHRlbjsKLQotICAgIGZvciAoaSA9IDAsIGogPSAwOyAoaSA8IGZvcm1hdF9sZW5ndGggJiYgaiA8IG1heCk7KSB7Ci0gICAgICAgIGlmIChmb3JtYXRbaV0gIT0gJyUnKSB7Ci0gICAgICAgICAgICBuZXdfZm9ybWF0W2orK10gPSBmb3JtYXRbaSsrXTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoZm9ybWF0W2krMV0pIHsKLSAgICAgICAgICAgIGNhc2UgJ0QnOgotICAgICAgICAgICAgICAgIC8qIElzIHRoaXMgbG9jYWxlIGRlcGVuZGVudD8gU2hvdWxkbid0IGJlLi4uCi0gICAgICAgICAgICAgICAgICAgQWxzbyBub3RlIHRoZSB5ZWFyIDIwMDAgZXhwb3N1cmUgaGVyZSAqLwotICAgICAgICAgICAgICAgIG1lbWNweShuZXdfZm9ybWF0ICsgaiwgIiVtLyVkLyV5IiwgOCk7Ci0gICAgICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgICAgIGogKz0gODsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3InOgotICAgICAgICAgICAgICAgIG1lbWNweShuZXdfZm9ybWF0ICsgaiwgIiVJOiVNOiVTICVwIiwgMTEpOwotICAgICAgICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgICAgICAgICBqICs9IDExOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnVCc6Ci0gICAgICAgICAgICAgICAgbWVtY3B5KG5ld19mb3JtYXQgKyBqLCAiJUg6JU06JVMiLCA4KTsKLSAgICAgICAgICAgICAgICBpICs9IDI7Ci0gICAgICAgICAgICAgICAgaiArPSA4OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnZSc6Ci0gICAgICAgICAgICAgICAgbGVuZ3RoX3dyaXR0ZW4gPSBhcF9zbnByaW50ZihuZXdfZm9ybWF0ICsgaiwgbWF4IC0gaiwgIiUyZCIsCi0gICAgICAgICAgICAgICAgICAgIHRtLT50bV9tZGF5KTsKLSAgICAgICAgICAgICAgICBqID0gKGxlbmd0aF93cml0dGVuID09IC0xKSA/IG1heCA6IChqICsgbGVuZ3RoX3dyaXR0ZW4pOwotICAgICAgICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLyogV2Uga25vdyB3ZSBjYW4gYWR2YW5jZSB0d28gY2hhcmFjdGVycyBmb3J3YXJkIGhlcmUuICovCi0gICAgICAgICAgICAgICAgbmV3X2Zvcm1hdFtqKytdID0gZm9ybWF0W2krK107Ci0gICAgICAgICAgICAgICAgbmV3X2Zvcm1hdFtqKytdID0gZm9ybWF0W2krK107Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGogPj0gbWF4KSB7Ci0gICAgICAgICpzID0gJ1wwJzsgIC8qIERlZmVuc2l2ZSBwcm9ncmFtbWluZywgb2theSBzaW5jZSBvdXRwdXQgaXMgdW5kZWZpbmVkICovCi0gICAgICAgIHJldHVybl92YWx1ZSA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbmV3X2Zvcm1hdFtqXSA9ICdcMCc7Ci0gICAgICAgIHJldHVybl92YWx1ZSA9IHN0cmZ0aW1lKHMsIG1heCwgbmV3X2Zvcm1hdCwgdG0pOwotICAgIH0KLSAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotfQotCi0vKgotICogYXBfb3NfaXNfZmlsZW5hbWVfdmFsaWQgaXMgZ2l2ZW4gYSBmaWxlbmFtZSwgYW5kIHJldHVybnMgMCBpZiB0aGUgZmlsZW5hbWUKLSAqIGlzIG5vdCB2YWxpZCBmb3IgdXNlIG9uIHRoaXMgc3lzdGVtLiBPbiBXaW5kb3dzLCB0aGlzIG1lYW5zIGl0IGZhaWxzIGFueQotICogb2YgdGhlIHRlc3RzIGJlbG93LiBPdGhlcndpc2UgcmV0dXJucyAxLgotICoKLSAqIFRlc3QgZm9yIGZpbGVuYW1lIHZhbGlkaXR5IG9uIFdpbjMyLiBUaGlzIGlzIG9mIHRlc3RzIGNvbWUgaW4gcGFydCBmcm9tCi0gKiB0aGUgTVNETiBhcnRpY2xlIGF0ICJUZWNobmljYWwgQXJ0aWNsZXMsIFdpbmRvd3MgUGxhdGZvcm0sIEJhc2UgU2VydmljZXMsCi0gKiBHdWlkZWxpbmVzLCBNYWtpbmcgUm9vbSBmb3IgTG9uZyBGaWxlbmFtZXMiIGFsdGhvdWdoIHRoZSBpbmZvcm1hdGlvbgotICogaW4gTVNETiBhYm91dCBmaWxlbmFtZSB0ZXN0aW5nIGlzIGluY29tcGxldGUgb3IgY29uZmxpY3RpbmcuIFRoZXJlIGlzIGEKLSAqIHNpbWlsYXIgc2V0IG9mIHRlc3RzIGluICJUZWNobmljYWwgQXJ0aWNsZXMsIFdpbmRvd3MgUGxhdGZvcm0sIEJhc2UgU2VydmljZXMsCi0gKiBHdWlkZWxpbmVzLCBNb3ZpbmcgVW5peCBBcHBsaWNhdGlvbnMgdG8gV2luZG93cyBOVCIuCi0gKgotICogVGhlIHRlc3RzIGFyZToKLSAqCi0gKiAxKSB0b3RhbCBwYXRoIGxlbmd0aCBncmVhdGVyIHRoYW4gTUFYX1BBVEgKLSAqCi0gKiAyKSBhbnl0aGluZyB1c2luZyB0aGUgb2N0ZXRzIDAtMzEgb3IgY2hhcmFjdGVycyAiIDwgPiB8IDoKLSAqICAgICh0aGVzZSBhcmUgcmVzZXJ2ZWQgZm9yIFdpbmRvd3MgdXNlIGluIGZpbGVuYW1lcy4gSW4gYWRkaXRpb24KLSAqICAgICBlYWNoIGZpbGUgc3lzdGVtIGhhcyBpdHMgb3duIGFkZGl0aW9uYWwgY2hhcmFjdGVycyB0aGF0IGFyZQotICogICAgIGludmFsaWQuIFNlZSBLQiBhcnRpY2xlIFExMDAxMDggZm9yIG1vcmUgZGV0YWlscykuCi0gKgotICogMykgYW55dGhpbmcgZW5kaW5nIGluICIuIiAobm8gbWF0dGVyIGhvdyBtYW55KQotICogICAgKGZpbGVuYW1lIGRvYywgZG9jLiBhbmQgZG9jLi4uIGFsbCByZWZlciB0byB0aGUgc2FtZSBmaWxlKQotICoKLSAqIDQpIGFueSBzZWdtZW50IGluIHdoaWNoIHRoZSBiYXNlbmFtZSAoYmVmb3JlIGZpcnN0IHBlcmlvZCkgbWF0Y2hlcwotICogICAgb25lIG9mIHRoZSBET1MgZGV2aWNlIG5hbWVzCi0gKiAgICAodGhlIGxpc3QgY29tZXMgZnJvbSBLQiBhcnRpY2xlIFExMDAxMDggYWx0aG91Z2ggc29tZSBwZW9wbGUKLSAqICAgICByZXBvcnRzIHRoYXQgYWRkaXRpb25hbCBuYW1lcyBzdWNoIGFzICJDT001IiBhcmUgYWxzbyBzcGVjaWFsCi0gKiAgICAgZGV2aWNlcykuCi0gKgotICogSWYgdGhlIHBhdGggZmFpbHMgQU5ZIG9mIHRoZXNlIHRlc3RzLCB0aGUgcmVzdWx0IG11c3QgYmUgdG8gZGVueSBhY2Nlc3MuCi0gKi8KLQotQVBJX0VYUE9SVChpbnQpIGFwX29zX2lzX2ZpbGVuYW1lX3ZhbGlkKGNvbnN0IGNoYXIgKmZpbGUpCi17Ci0gICAgY29uc3QgY2hhciAqc2Vnc3RhcnQ7Ci0gICAgdW5zaWduZWQgaW50IHNlZ2xlbmd0aDsKLSAgICBjb25zdCBjaGFyICpwb3M7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpbnZhbGlkX2NoYXJhY3RlcnMgPSAiP1wiPD4qfDoiOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaW52YWxpZF9maWxlbmFtZXNbXSA9IHsgCi0JIkNPTiIsICJBVVgiLCAiQ09NMSIsICJDT00yIiwgIkNPTTMiLCAKLQkiQ09NNCIsICJMUFQxIiwgIkxQVDIiLCAiTFBUMyIsICJQUk4iLCAiTlVMIiwgTlVMTCAKLSAgICB9OwotCi0gICAgLyogVGVzdCAxICovCi0gICAgaWYgKHN0cmxlbihmaWxlKSA+IE1BWF9QQVRIKSB7Ci0JLyogUGF0aCB0b28gbG9uZyBmb3IgV2luZG93cy4gTm90ZSB0aGF0IHRoaXMgdGVzdCBpcyBub3QgdmFsaWQKLQkgKiBpZiB0aGUgcGF0aCBzdGFydHMgd2l0aCAvLz8vIG9yIFxcP1wuICovCi0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcG9zID0gZmlsZTsKLQotICAgIC8qIFNraXAgYW55IGxlYWRpbmcgbm9uLXBhdGggY29tcG9uZW50cy4gVGhpcyBjYW4gYmUgZWl0aGVyIGEKLSAgICAgKiBkcml2ZSBsZXR0ZXIgc3VjaCBhcyBDOiwgb3IgYSBVTkMgcGF0aCBzdWNoIGFzIFxcU0VSVkVSXFNIQVJFXC4KLSAgICAgKiBXZSBjb250aW51ZSBhbmQgY2hlY2sgdGhlIHJlc3Qgb2YgdGhlIHBhdGggYmFzZWQgb24gdGhlIHJ1bGVzIGFib3ZlLgotICAgICAqIFRoaXMgbWVhbnMgd2UgY291bGQgZWxpbWluYXRlIHZhbGlkIGZpbGVuYW1lcyBmcm9tIHNlcnZlcnMgd2hpY2gKLSAgICAgKiBhcmUgbm90IHJ1bm5pbmcgTlQgKHN1Y2ggYXMgU2FtYmEpLgotICAgICAqLwotCi0gICAgaWYgKHBvc1swXSAmJiBwb3NbMV0gPT0gJzonKSB7Ci0JLyogU2tpcCBsZWFkaW5nIGRyaXZlIGxldHRlciAqLwotCXBvcyArPSAyOwotICAgIH0KLSAgICBlbHNlIHsKLQlpZiAoKHBvc1swXSA9PSAnXFwnIHx8IHBvc1swXSA9PSAnLycpICYmCi0JICAgIChwb3NbMV0gPT0gJ1xcJyB8fCBwb3NbMV0gPT0gJy8nKSkgewotCSAgICAvKiBJcyBhIFVOQywgc28gc2tpcCB0aGUgc2VydmVyIG5hbWUgYW5kIHNoYXJlIG5hbWUgKi8KLQkgICAgcG9zICs9IDI7Ci0JICAgIHdoaWxlICgqcG9zICYmICpwb3MgIT0gJy8nICYmICpwb3MgIT0gJ1xcJykKLQkJcG9zKys7Ci0JICAgIGlmICghKnBvcykgewotCQkvKiBObyBzaGFyZSBuYW1lICovCi0JCXJldHVybiAwOwotCSAgICB9Ci0JICAgIHBvcysrOwkvKiBNb3ZlIHRvIHN0YXJ0IG9mIHNoYXJlIG5hbWUgKi8KLQkgICAgd2hpbGUgKCpwb3MgJiYgKnBvcyAhPSAnLycgJiYgKnBvcyAhPSAnXFwnKQotCQlwb3MrKzsKLQkgICAgaWYgKCEqcG9zKSB7Ci0JCS8qIE5vIHBhdGggaW5mb3JtYXRpb24gKi8KLQkJcmV0dXJuIDA7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgd2hpbGUgKCpwb3MpIHsKLQl1bnNpZ25lZCBpbnQgaWR4OwotCXVuc2lnbmVkIGludCBiYXNlbGVuZ3RoOwotCi0Jd2hpbGUgKCpwb3MgPT0gJy8nIHx8ICpwb3MgPT0gJ1xcJykgewotICAgIAkgICAgcG9zKys7Ci0JfQotCWlmICgqcG9zID09ICdcMCcpIHsKLQkgICAgYnJlYWs7Ci0JfQotCXNlZ3N0YXJ0ID0gcG9zOwkvKiBzdGFydCBvZiBzZWdtZW50ICovCi0Jd2hpbGUgKCpwb3MgJiYgKnBvcyAhPSAnLycgJiYgKnBvcyAhPSAnXFwnKSB7Ci0JICAgIHBvcysrOwotCX0KLQlzZWdsZW5ndGggPSBwb3MgLSBzZWdzdGFydDsKLQkvKiAKLQkgKiBOb3cgd2UgaGF2ZSBhIHNlZ21lbnQgb2YgdGhlIHBhdGgsIHN0YXJ0aW5nIGF0IHBvc2l0aW9uICJzZWdzdGFydCIKLQkgKiBhbmQgbGVuZ3RoICJzZWdsZW5ndGgiCi0JICovCi0KLQkvKiBUZXN0IDIgKi8KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IHNlZ2xlbmd0aDsgaWR4KyspIHsKLQkgICAgaWYgKChzZWdzdGFydFtpZHhdID4gMCAmJiBzZWdzdGFydFtpZHhdIDwgMzIpIHx8Ci0JCXN0cmNocihpbnZhbGlkX2NoYXJhY3RlcnMsIHNlZ3N0YXJ0W2lkeF0pKSB7Ci0JCXJldHVybiAwOwotCSAgICB9Ci0JfQotCi0JLyogVGVzdCAzICovCi0JaWYgKHNlZ3N0YXJ0W3NlZ2xlbmd0aC0xXSA9PSAnLicpIHsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCi0JLyogVGVzdCA0ICovCi0JZm9yIChiYXNlbGVuZ3RoID0gMDsgYmFzZWxlbmd0aCA8IHNlZ2xlbmd0aDsgYmFzZWxlbmd0aCsrKSB7Ci0JICAgIGlmIChzZWdzdGFydFtiYXNlbGVuZ3RoXSA9PSAnLicpIHsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLQkvKiBiYXNlbGVuZ3RoIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgYmFzZSBwYXRoIG9mCi0JICogdGhlIHNlZ21lbnQgKHdoaWNoIGNvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSB3aG9sZSBzZWdtZW50IGxlbmd0aCwKLQkgKiBpZiBpdCBkb2VzIG5vdCBpbmNsdWRlIGFueSBkb3QgY2hhcmFjdGVycykuICovCi0JaWYgKGJhc2VsZW5ndGggPT0gMyB8fCBiYXNlbGVuZ3RoID09IDQpIHsKLQkgICAgZm9yIChpZHggPSAwOyBpbnZhbGlkX2ZpbGVuYW1lc1tpZHhdOyBpZHgrKykgewotCQlpZiAoc3RybGVuKGludmFsaWRfZmlsZW5hbWVzW2lkeF0pID09IGJhc2VsZW5ndGggJiYKLQkJICAgICFzdHJuaWNtcChpbnZhbGlkX2ZpbGVuYW1lc1tpZHhdLCBzZWdzdGFydCwgYmFzZWxlbmd0aCkpIHsKLQkJICAgIHJldHVybiAwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9zZXJ2ZXIvLmN2c2lnbm9yZSBiL3NlcnZlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODE5M2NiLi4wMDAwMDAwCi0tLSBhL3NlcnZlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotTWFrZWZpbGUKLXVyaV9kZWxpbXMuaAotZ2VuX3VyaV9kZWxpbXMKLXRlc3RfY2hhci5oCi1nZW5fdGVzdF9jaGFyCi1nZW5fdXJpX2RlbGltc19SCi1nZW5fdGVzdF9jaGFyX1IKLWdlbl91cmlfZGVsaW1zX0QKLWdlbl91cmlfZGVsaW1zLmlsawotZ2VuX3VyaV9kZWxpbXMucGRiCi1nZW5fdGVzdF9jaGFyX0QKLWdlbl90ZXN0X2NoYXIuaWxrCi1nZW5fdGVzdF9jaGFyLnBkYgpkaWZmIC0tZ2l0IGEvc2VydmVyLy5pbmRlbnQucHJvIGIvc2VydmVyLy5pbmRlbnQucHJvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWZiZTlmLi4wMDAwMDAwCi0tLSBhL3NlcnZlci8uaW5kZW50LnBybworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS1pNCAtbnBzbCAtZGkwIC1iciAtbmNlIC1kMCAtY2xpMCAtbnBjcyAtbmZjMQotLVRCVUZGCi0tVEZJTEUKLS1UVFJBTlMKLS1UVUlOVDQKLS1UX3RyYW5zCi0tVGFsbG93X29wdGlvbnNfdAotLVRhcGFjaGVfc2ZpbwotLVRhcnJheV9oZWFkZXIKLS1UYm9vbF9pbnQKLS1UYnVmX2FyZWEKLS1UYnVmZl9zdHJ1Y3QKLS1UYnVmZnkKLS1UY21kX2hvdwotLVRjbWRfcGFybXMKLS1UY29tbWFuZF9yZWMKLS1UY29tbWFuZF9zdHJ1Y3QKLS1UY29ubl9yZWMKLS1UY29yZV9kaXJfY29uZmlnCi0tVGNvcmVfc2VydmVyX2NvbmZpZwotLVRkaXJfbWFrZXJfZnVuYwotLVRldmVudAotLVRnbG9iYWxzX3MKLS1UaGFuZGxlcl9mdW5jCi0tVGhhbmRsZXJfcmVjCi0tVGpvYmxpc3RfcwotLVRsaXN0ZW5fcmVjCi0tVG1lcmdlcl9mdW5jCi0tVG1vZGVfdAotLVRtb2R1bGUKLS1UbW9kdWxlX3N0cnVjdAotLVRtdXRleAotLVRuX2xvbmcKLS1Ub3RoZXJfY2hpbGRfcmVjCi0tVG92ZXJyaWRlc190Ci0tVHBhcmVudF9zY29yZQotLVRwaWRfdAotLVRwaXBlZF9sb2cKLS1UcG9vbAotLVRyZXF1ZXN0X3JlYwotLVRyZXF1aXJlX2xpbmUKLS1UcmxpbV90Ci0tVHNjb3JlYm9hcmQKLS1Uc2VtYXBob3JlCi0tVHNlcnZlcl9hZGRyX3JlYwotLVRzZXJ2ZXJfcmVjCi0tVHNlcnZlcl9yZWNfY2hhaW4KLS1Uc2hvcnRfc2NvcmUKLS1UdGFibGUKLS1UdGFibGVfZW50cnkKLS1UdGhyZWFkCi0tVHVfd2lkZV9pbnQKLS1UdnRpbWVfdAotLVR3aWRlX2ludApkaWZmIC0tZ2l0IGEvc2VydmVyL01ha2VmaWxlLmluIGIvc2VydmVyL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmZhY2YyLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLQotREVQVEggICAgID0gLi4KLXRvcHNyY2RpciA9IEB0b3BzcmNkaXJACi1zcmNkaXIgICAgPSBAc3JjZGlyQAotVlBBVEggICAgID0gQHNyY2RpckAKLQotTFRMSUJSQVJZX05BTUUgICAgPSBsaWJtYWluLmxhCi1MVExJQlJBUllfU09VUkNFUyA9IFwKLSAgICB1cmlfZGVsaW1zLmggdGVzdF9jaGFyLmggXAotCWJ1ZmYuYyBodHRwX2NvbmZpZy5jIGh0dHBfY29yZS5jIGh0dHBfbG9nLmMgaHR0cF9tYWluLmMgXAotCWh0dHBfcHJvdG9jb2wuYyBodHRwX3JlcXVlc3QuYyBodHRwX3Zob3N0LmMgdXRpbC5jIHV0aWxfZGF0ZS5jIFwKLQl1dGlsX3NjcmlwdC5jIHV0aWxfdXJpLmMgdXRpbF9tZDUuYyBcCi0JcmZjMTQxMy5jIGh0dHBfY29ubmVjdGlvbi5jIGlvbF9maWxlLmMgbGlzdGVuLmMKLQotaW5jbHVkZSAkKHRvcHNyY2RpcikvYnVpbGQvbHRsaWIubWsKLQotZ2VuX3VyaV9kZWxpbXNfT0JKRUNUUyA9IGdlbl91cmlfZGVsaW1zLmxvCi1nZW5fdXJpX2RlbGltczogJChnZW5fdXJpX2RlbGltc19PQkpFQ1RTKQotCSQoTElOSykgJChnZW5fdXJpX2RlbGltc19PQkpFQ1RTKQotCi1nZW5fdGVzdF9jaGFyX09CSkVDVFMgPSBnZW5fdGVzdF9jaGFyLmxvCi1nZW5fdGVzdF9jaGFyOiAkKGdlbl90ZXN0X2NoYXJfT0JKRUNUUykKLQkkKExJTkspICQoZ2VuX3Rlc3RfY2hhcl9PQkpFQ1RTKQotCi11cmlfZGVsaW1zLmg6IGdlbl91cmlfZGVsaW1zCi0JLi9nZW5fdXJpX2RlbGltcyA+IHVyaV9kZWxpbXMuaAotCi10ZXN0X2NoYXIuaDogZ2VuX3Rlc3RfY2hhcgotCS4vZ2VuX3Rlc3RfY2hhciA+IHRlc3RfY2hhci5oCi0KLXV0aWxfdXJpLmM6IHVyaV9kZWxpbXMuaAotdXRpbC5jOiB0ZXN0X2NoYXIuaApkaWZmIC0tZ2l0IGEvc2VydmVyL05XR05VbWFrZWZpbGUgYi9zZXJ2ZXIvTldHTlVtYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RhYmM4ZS4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvTldHTlVtYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0jCi0jIERlY2xhcmUgdGhlIHN1Yi1kaXJlY3RvcmllcyB0byBiZSBidWlsdCBoZXJlCi0jCi0KLVNVQkRJUlMgPSBcCi0JCSQoRU9MSVNUKSAKLQotIwotIyBHZXQgdGhlICdoZWFkJyBvZiB0aGUgYnVpbGQgZW52aXJvbm1lbnQuICBUaGlzIGluY2x1ZGVzIGRlZmF1bHQgdGFyZ2V0cyBhbmQKLSMgcGF0aHMgdG8gdG9vbHMKLSMKLQotaW5jbHVkZSAkKEFQX1dPUkspXGJ1aWxkXE5XR05VaGVhZC5pbmMKLQotIwotIyBidWlsZCB0aGlzIGxldmVsJ3MgZmlsZXMKLQotIwotIyBUaGVzZSBkaXJlY3RvcmllcyB3aWxsIGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGluY2x1ZGUgbGlzdCwgZm9sbG93ZWQgYnkKLSMgSU5DRElSUwotIwotWElOQ0RJUlMJKz0gXAotCQkJJChOV09TKSBcCi0JCQkkKEFQUikvaW5jbHVkZSBcCi0JCQkkKEFQX1dPUkspL2luY2x1ZGUgXAotCQkJJChBUFJVVElMKS9pbmNsdWRlIFwKLQkJCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGZsYWdzIHdpbGwgY29tZSBhZnRlciBDRkxBR1MKLSMKLVhDRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGRlZmluZXMgd2lsbCBjb21lIGFmdGVyIERFRklORVMKLSMKLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGZsYWdzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpbmsub3B0IGZpbGUKLSMKLVhMRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIHZhbHVlcyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBjb3JyZWN0IHZhcmlhYmxlcyBiYXNlZCBvbiB0aGUgdmFsdWUgb2YKLSMgUkVMRUFTRQotIwotaWZlcSAiJChSRUxFQVNFKSIgImRlYnVnIgotWElOQ0RJUlMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhDRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YREVGSU5FUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWExGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi1lbmRpZgotCi1pZmVxICIkKFJFTEVBU0UpIiAibm9vcHQiCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWENGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhERUZJTkVTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YTEZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLWVuZGlmCi0KLWlmZXEgIiQoUkVMRUFTRSkiICJyZWxlYXNlIgotWElOQ0RJUlMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhDRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YREVGSU5FUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWExGTEFHUwkJKz0gXAotCQkJJChFT0xJU1QpCi1lbmRpZgotCi0jCi0jIFRoZXNlIGFyZSB1c2VkIGJ5IHRoZSBsaW5rIHRhcmdldCBpZiBhbiBOTE0gaXMgYmVpbmcgZ2VuZXJhdGVkCi0jIFRoaXMgaXMgdXNlZCBieSB0aGUgbGluayAnbmFtZScgZGlyZWN0aXZlIHRvIG5hbWUgdGhlIG5sbS4gIElmIGxlZnQgYmxhbmsKLSMgVEFSR0VUX25sbSAoc2VlIGJlbG93KSB3aWxsIGJlIHVzZWQuCi0jCi1OTE1fTkFNRQkJPSBnZW5jaGFycwotCi0jCi0jIFRoaXMgaXMgdXNlZCBieSB0aGUgbGluayAnLWRlc2MgJyBkaXJlY3RpdmUuIAotIyBJZiBsZWZ0IGJsYW5rLCBOTE1fTkFNRSB3aWxsIGJlIHVzZWQuCi0jCi1OTE1fREVTQ1JJUFRJT04JPSBHZW5lcmF0ZSBUZXN0IENoYXJhY3RlcnMKLQotIwotIyBUaGlzIGlzIHVzZWQgYnkgdGhlICctdGhyZWFkbmFtZScgZGlyZWN0aXZlLiAgSWYgbGVmdCBibGFuaywKLSMgTkxNX05BTUUgVGhyZWFkIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9USFJFQURfTkFNRQk9IGdlbmNoYXJzCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgVkVSU0lPTiB2YWx1ZSBpbiAKLSMgJChBUF9XT1JLKVxOV0dOVU5ldFdhcmUucnVsCi0jCi1OTE1fVkVSU0lPTgkJPSAxLDAsMAotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG9mIDY0SwotIwotTkxNX1NUQUNLX1NJWkUJPSA4MTkyCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZW50cnknIGRpcmVjdGl2ZQotIwotTkxNX0VOVFJZX1NZTQk9X0xpYkNQcmVsdWRlIAotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWV4aXQnIGRpcmVjdGl2ZQotIwotTkxNX0VYSVRfU1lNCT1fTGliQ1Bvc3RsdWRlIAotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWNoZWNrJyBkaXJlY3RpdmUKLSMKLU5MTV9DSEVDS19TWU0JPQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWZsYWdzJyBkaXJlY3RpdmUKLSMKLU5MTV9GTEFHUwkJPSBQU0VVRE9QUkVFTVBUSU9OCi0gCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgbGlua2VkIGluIHdpdGggdGhlIFhEQ0RhdGEgb3B0aW9uIGluIHRoZSBkZWYgCi0jIGZpbGUgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBvZiAkKE5XT1MpL2FwYWNoZS54ZGMuICBYRENEYXRhIGNhbiBiZSBkaXNhYmxlZAotIyBieSBzZXR0aW5nIEFQQUNIRV9VTklQUk9DIGluIHRoZSBlbnZpcm9ubWVudAotIwotWERDREFUQSAgICAgICAgID0gCi0KLSMKLSMgRGVjbGFyZSBhbGwgdGFyZ2V0IGZpbGVzICh5b3UgbXVzdCBhZGQgeW91ciBmaWxlcyBoZXJlKQotIwotCi0jCi0jIElmIHRoZXJlIGlzIGFuIE5MTSB0YXJnZXQsIHB1dCBpdCBoZXJlCi0jCi1UQVJHRVRfbmxtID0gXAotJChPQkpESVIpL2dlbmNoYXJzLm5sbSBcCi0JJChFT0xJU1QpCi0KLSMKLSMgSWYgdGhlcmUgaXMgYW4gTElCIHRhcmdldCwgcHV0IGl0IGhlcmUKLSMKLVRBUkdFVF9saWIgPSBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBPQkogZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTkxNIHRhcmdldCBhYm92ZS4KLSMgUGF0aHMgbXVzdCBhbGwgdXNlIHRoZSAnLycgY2hhcmFjdGVyCi0jCi1GSUxFU19ubG1fb2JqcyA9IFwKLQkkKE9CSkRJUikvZ2VuX3Rlc3RfY2hhci5vIFwKLQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBhcmUgdGhlIExJQiBmaWxlcyBuZWVkZWQgdG8gY3JlYXRlIHRoZSBOTE0gdGFyZ2V0IGFib3ZlLgotIyBUaGVzZSB3aWxsIGJlIGFkZGVkIGFzIGEgbGlicmFyeSBjb21tYW5kIGluIHRoZSBsaW5rLm9wdCBmaWxlLgotIwotRklMRVNfbmxtX2xpYnMgPSBcCi0JbGliY3ByZS5vIFwKLQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBhcmUgdGhlIG1vZHVsZXMgdGhhdCB0aGUgYWJvdmUgTkxNIHRhcmdldCBkZXBlbmRzIG9uIHRvIGxvYWQuCi0jIFRoZXNlIHdpbGwgYmUgYWRkZWQgYXMgYSBtb2R1bGUgY29tbWFuZCBpbiB0aGUgbGluay5vcHQgZmlsZS4KLSMKLUZJTEVTX25sbV9tb2R1bGVzID0gXAotCUxpYmMgXAotCSQoRU9MSVNUKQotCi0jCi0jIElmIHRoZSBubG0gaGFzIGEgbXNnIGZpbGUsIHB1dCBpdCdzIHBhdGggaGVyZQotIwotRklMRV9ubG1fbXNnID0KLSAKLSMKLSMgSWYgdGhlIG5sbSBoYXMgYSBobHAgZmlsZSBwdXQgaXQncyBwYXRoIGhlcmUKLSMKLUZJTEVfbmxtX2hscCA9Ci0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgJChOV09TKVxjb3B5cmlnaHQudHh0LgotIwotRklMRV9ubG1fY29weXJpZ2h0ID0KLQotIwotIyBBbnkgYWRkaXRpb25hbCBpbXBvcnRzIGdvIGhlcmUKLSMKLUZJTEVTX25sbV9YaW1wb3J0cyA9IFwKLQlAbGliYy5pbXAgXAotCSQoRU9MSVNUKQotIAotIyAgIAotIyBBbnkgc3ltYm9scyBleHBvcnRlZCB0byBoZXJlCi0jCi1GSUxFU19ubG1fZXhwb3J0cyA9IFwKLQkkKEVPTElTVCkKLQkKLSMgICAKLSMgVGhlc2UgYXJlIHRoZSBPQkogZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTElCIHRhcmdldCBhYm92ZS4KLSMgUGF0aHMgbXVzdCBhbGwgdXNlIHRoZSAnLycgY2hhcmFjdGVyCi0jCi1GSUxFU19saWJfb2JqcyA9IFwKLQkkKEVPTElTVCkKLQotIwotIyBpbXBsZW1lbnQgdGFyZ2V0cyBhbmQgZGVwZW5kYW5jaWVzIChsZWF2ZSB0aGlzIHNlY3Rpb24gYWxvbmUpCi0jCi0KLWxpYnMgOjogJChPQkpESVIpICQoVEFSR0VUX2xpYikKLQotbmxtcyA6OiBsaWJzICQoVEFSR0VUX25sbSkKLQotIwotIyBVcGRhdGVkIHRoaXMgdGFyZ2V0IHRvIGNyZWF0ZSBuZWNlc3NhcnkgZGlyZWN0b3JpZXMgYW5kIGNvcHkgZmlsZXMgdG8gdGhlIAotIyBjb3JyZWN0IHBsYWNlLgotIwotaW5zdGFsbCA6OiBubG1zIEZPUkNFCi0KLSMKLSMgQW55IHNwZWNpYWxpemVkIHJ1bGVzIGhlcmUKLSMKLQotIwotIyBJbmNsdWRlIHRoZSAndGFpbCcgbWFrZWZpbGUgdGhhdCBoYXMgdGFyZ2V0cyB0aGF0IGRlcGVuZCBvbiB2YXJpYWJsZXMgZGVmaW5lZAotIyBpbiB0aGlzIG1ha2VmaWxlCi0jCi0KLWluY2x1ZGUgJChBUF9XT1JLKVxidWlsZFxOV0dOVXRhaWwuaW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvc2VydmVyL2J1aWxkbWFyay5jIGIvc2VydmVyL2J1aWxkbWFyay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzViOTczLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9idWlsZG1hcmsuYworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBkLmgiCi0KLSNpZiBkZWZpbmVkKF9fREFURV9fKSAmJiBkZWZpbmVkKF9fVElNRV9fKQotc3RhdGljIGNvbnN0IGNoYXIgc2VydmVyX2J1aWx0W10gPSBfX0RBVEVfXyAiICIgX19USU1FX187Ci0jZWxzZQotc3RhdGljIGNvbnN0IGNoYXIgc2VydmVyX2J1aWx0W10gPSAidW5rbm93biI7Ci0jZW5kaWYKLQotQVBJX0VYUE9SVChjb25zdCBjaGFyICopIGFwX2dldF9zZXJ2ZXJfYnVpbHQoKQotewotICAgIHJldHVybiBzZXJ2ZXJfYnVpbHQ7Ci19CmRpZmYgLS1naXQgYS9zZXJ2ZXIvY29uZmlnLmMgYi9zZXJ2ZXIvY29uZmlnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ODBmOTguLjAwMDAwMDAKLS0tIGEvc2VydmVyL2NvbmZpZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY0MSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBodHRwX2NvbmZpZy5jOiBvbmNlIHdhcyBhdXhpbGxhcnkgZnVuY3Rpb25zIGZvciByZWFkaW5nIGh0dHBkJ3MgY29uZmlnCi0gKiBmaWxlIGFuZCBjb252ZXJ0aW5nIGZpbGVuYW1lcyBpbnRvIGEgbmFtZXNwYWNlCi0gKgotICogUm9iIE1jQ29vbCAKLSAqIAotICogV2FsbC10by13YWxsIHJld3JpdGUgZm9yIEFwYWNoZS4uLiBjb21tYW5kcyB3aGljaCBhcmUgcGFydCBvZiB0aGUKLSAqIHNlcnZlciBjb3JlIGNhbiBub3cgYmUgZm91bmQgbmV4dCBkb29yIGluICJodHRwX2NvcmUuYyIuICBOb3cgY29udGFpbnMKLSAqIGdlbmVyYWwgY29tbWFuZCBsb29wLCBhbmQgZnVuY3Rpb25zIHdoaWNoIGRvIGJvb2trZWVwaW5nIGZvciB0aGUgbmV3Ci0gKiBBcGFjaGUgY29uZmlnIHN0dWZmIChtb2R1bGVzIGFuZCBjb25maWd1cmF0aW9uIHZlY3RvcnMpLgotICoKLSAqIHJzdAotICoKLSAqLwotCi0jZGVmaW5lIENPUkVfUFJJVkFURQotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCQkvKiBmb3IgZXJyb3JzIGluIHBhcnNlX2h0YWNjZXNzICovCi0jaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCS8qIGZvciBkZWZhdWx0X2hhbmRsZXIgKHNlZSBpbnZva2VfaGFuZGxlcikgKi8KLSNpbmNsdWRlICJodHRwX2NvbmZfZ2xvYmFscy5oIgkvKiBTaWdoLi4uICovCi0jaW5jbHVkZSAiaHR0cF92aG9zdC5oIgotI2luY2x1ZGUgImV4cGxhaW4uaCIKLQotREVGX0V4cGxhaW4KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBXZSBiZWdpbiB3aXRoIHRoZSBmdW5jdGlvbnMgd2hpY2ggZGVhbCB3aXRoIHRoZSBsaW5rZWQgbGlzdAotICogb2YgbW9kdWxlcyB3aGljaCBjb250cm9sIGp1c3QgYWJvdXQgYWxsIG9mIHRoZSBzZXJ2ZXIgb3BlcmF0aW9uLgotICovCi0KLS8qIHRvdGFsX21vZHVsZXMgaXMgdGhlIG51bWJlciBvZiBtb2R1bGVzIHRoYXQgaGF2ZSBiZWVuIGxpbmtlZAotICogaW50byB0aGUgc2VydmVyLgotICovCi1zdGF0aWMgaW50IHRvdGFsX21vZHVsZXMgPSAwOwotLyogZHluYW1pY19tb2R1bGVzIGlzIHRoZSBudW1iZXIgb2YgbW9kdWxlcyB0aGF0IGhhdmUgYmVlbiBhZGRlZAotICogYWZ0ZXIgdGhlIHByZS1sb2FkZWQgb25lcyBoYXZlIGJlZW4gc2V0IHVwLiBJdCBzaG91bGRuJ3QgYmUgbGFyZ2VyCi0gKiB0aGFuIERZTkFNSUNfTU9EVUxFX0xJTUlULgotICovCi1zdGF0aWMgaW50IGR5bmFtaWNfbW9kdWxlcyA9IDA7Ci1BUElfVkFSX0VYUE9SVCBtb2R1bGUgKnRvcF9tb2R1bGUgPSBOVUxMOwotQVBJX1ZBUl9FWFBPUlQgbW9kdWxlICoqYXBfbG9hZGVkX21vZHVsZXM9TlVMTDsKLQotdHlwZWRlZiBpbnQgKCpoYW5kbGVyX2Z1bmMpIChyZXF1ZXN0X3JlYyAqKTsKLXR5cGVkZWYgdm9pZCAqKCpkaXJfbWFrZXJfZnVuYykgKHBvb2wgKiwgY2hhciAqKTsKLXR5cGVkZWYgdm9pZCAqKCptZXJnZXJfZnVuYykgKHBvb2wgKiwgdm9pZCAqLCB2b2lkICopOwotCi0vKiBEZWFsaW5nIHdpdGggY29uZmlnIHZlY3RvcnMuICBUaGVzZSBhcmUgYXNzb2NpYXRlZCB3aXRoIHBlci1kaXJlY3RvcnksCi0gKiBwZXItc2VydmVyLCBhbmQgcGVyLXJlcXVlc3QgY29uZmlndXJhdGlvbiwgYW5kIGhhdmUgYSB2b2lkKiBwb2ludGVyIGZvcgotICogZWFjaCBtb2R1bGVzLiAgVGhlIG5hdHVyZSBvZiB0aGUgc3RydWN0dXJlIHBvaW50ZWQgdG8gaXMgcHJpdmF0ZSB0byB0aGUKLSAqIG1vZHVsZSBpbiBxdWVzdGlvbi4uLiB0aGUgY29yZSBkb2Vzbid0IChhbmQgY2FuJ3QpIGtub3cuICBIb3dldmVyLCB0aGVyZQotICogYXJlIGRlZmluZWQgaW50ZXJmYWNlcyB3aGljaCBhbGxvdyBpdCB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIGl0cyBwcml2YXRlCi0gKiBwZXItZGlyZWN0b3J5IGFuZCBwZXItc2VydmVyIHN0cnVjdHVyZXMsIGFuZCB0byBtZXJnZSB0aGUgcGVyLWRpcmVjdG9yeQotICogc3RydWN0dXJlcyBvZiBhIGRpcmVjdG9yeSBhbmQgaXRzIHN1YmRpcmVjdG9yeSAocHJvZHVjaW5nIGEgbmV3IG9uZSBpbgotICogd2hpY2ggdGhlIGRlZmF1bHRzIGFwcGx5aW5nIHRvIHRoZSBiYXNlIGRpcmVjdG9yeSBoYXZlIGJlZW4gcHJvcGVybHkKLSAqIG92ZXJyaWRkZW4pLgotICovCi0KLSNpZm5kZWYgYXBfZ2V0X21vZHVsZV9jb25maWcKLUFQSV9FWFBPUlQodm9pZCAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyh2b2lkICpjb25mX3ZlY3RvciwgbW9kdWxlICptKQotewotICAgIHZvaWQgKipjb25mdiA9ICh2b2lkICoqKSBjb25mX3ZlY3RvcjsKLSAgICByZXR1cm4gY29uZnZbbS0+bW9kdWxlX2luZGV4XTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIGFwX3NldF9tb2R1bGVfY29uZmlnCi1BUElfRVhQT1JUKHZvaWQpIGFwX3NldF9tb2R1bGVfY29uZmlnKHZvaWQgKmNvbmZfdmVjdG9yLCBtb2R1bGUgKm0sIHZvaWQgKnZhbCkKLXsKLSAgICB2b2lkICoqY29uZnYgPSAodm9pZCAqKikgY29uZl92ZWN0b3I7Ci0gICAgY29uZnZbbS0+bW9kdWxlX2luZGV4XSA9IHZhbDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCAqY3JlYXRlX2VtcHR5X2NvbmZpZyhwb29sICpwKQotewotICAgIHZvaWQgKipjb25mX3ZlY3RvciA9ICh2b2lkICoqKSBhcF9wY2FsbG9jKHAsIHNpemVvZih2b2lkICopICoKLQkJCQkgICAgKHRvdGFsX21vZHVsZXMgKyBEWU5BTUlDX01PRFVMRV9MSU1JVCkpOwotICAgIHJldHVybiAodm9pZCAqKSBjb25mX3ZlY3RvcjsKLX0KLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9kZWZhdWx0X3Blcl9kaXJfY29uZmlnKHBvb2wgKnApCi17Ci0gICAgdm9pZCAqKmNvbmZfdmVjdG9yID0gKHZvaWQgKiopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKHZvaWQgKikgKiAodG90YWxfbW9kdWxlcyArIERZTkFNSUNfTU9EVUxFX0xJTUlUKSk7Ci0gICAgbW9kdWxlICptb2RwOwotCi0gICAgZm9yIChtb2RwID0gdG9wX21vZHVsZTsgbW9kcDsgbW9kcCA9IG1vZHAtPm5leHQpIHsKLQlkaXJfbWFrZXJfZnVuYyBkZiA9IG1vZHAtPmNyZWF0ZV9kaXJfY29uZmlnOwotCi0JaWYgKGRmKQotCSAgICBjb25mX3ZlY3Rvclttb2RwLT5tb2R1bGVfaW5kZXhdID0gKCpkZikgKHAsIE5VTEwpOwotICAgIH0KLQotICAgIHJldHVybiAodm9pZCAqKSBjb25mX3ZlY3RvcjsKLX0KLQotdm9pZCAqCi0gICAgIGFwX21lcmdlX3Blcl9kaXJfY29uZmlncyhwb29sICpwLCB2b2lkICpiYXNlLCB2b2lkICpuZXcpCi17Ci0gICAgdm9pZCAqKmNvbmZfdmVjdG9yID0gKHZvaWQgKiopIGFwX3BhbGxvYyhwLCBzaXplb2Yodm9pZCAqKSAqIHRvdGFsX21vZHVsZXMpOwotICAgIHZvaWQgKipiYXNlX3ZlY3RvciA9ICh2b2lkICoqKSBiYXNlOwotICAgIHZvaWQgKipuZXdfdmVjdG9yID0gKHZvaWQgKiopIG5ldzsKLSAgICBtb2R1bGUgKm1vZHA7Ci0KLSAgICBmb3IgKG1vZHAgPSB0b3BfbW9kdWxlOyBtb2RwOyBtb2RwID0gbW9kcC0+bmV4dCkgewotCW1lcmdlcl9mdW5jIGRmID0gbW9kcC0+bWVyZ2VfZGlyX2NvbmZpZzsKLQlpbnQgaSA9IG1vZHAtPm1vZHVsZV9pbmRleDsKLQotCWlmIChkZiAmJiBuZXdfdmVjdG9yW2ldKQotCSAgICBjb25mX3ZlY3RvcltpXSA9ICgqZGYpIChwLCBiYXNlX3ZlY3RvcltpXSwgbmV3X3ZlY3RvcltpXSk7Ci0JZWxzZQotCSAgICBjb25mX3ZlY3RvcltpXSA9IG5ld192ZWN0b3JbaV0gPyBuZXdfdmVjdG9yW2ldIDogYmFzZV92ZWN0b3JbaV07Ci0gICAgfQotCi0gICAgcmV0dXJuICh2b2lkICopIGNvbmZfdmVjdG9yOwotfQotCi1zdGF0aWMgdm9pZCAqY3JlYXRlX3NlcnZlcl9jb25maWcocG9vbCAqcCwgc2VydmVyX3JlYyAqcykKLXsKLSAgICB2b2lkICoqY29uZl92ZWN0b3IgPSAodm9pZCAqKikgYXBfcGNhbGxvYyhwLCBzaXplb2Yodm9pZCAqKSAqICh0b3RhbF9tb2R1bGVzICsgRFlOQU1JQ19NT0RVTEVfTElNSVQpKTsKLSAgICBtb2R1bGUgKm1vZHA7Ci0KLSAgICBmb3IgKG1vZHAgPSB0b3BfbW9kdWxlOyBtb2RwOyBtb2RwID0gbW9kcC0+bmV4dCkgewotCWlmIChtb2RwLT5jcmVhdGVfc2VydmVyX2NvbmZpZykKLQkgICAgY29uZl92ZWN0b3JbbW9kcC0+bW9kdWxlX2luZGV4XSA9ICgqbW9kcC0+Y3JlYXRlX3NlcnZlcl9jb25maWcpIChwLCBzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKHZvaWQgKikgY29uZl92ZWN0b3I7Ci19Ci0KLXN0YXRpYyB2b2lkIG1lcmdlX3NlcnZlcl9jb25maWdzKHBvb2wgKnAsIHZvaWQgKmJhc2UsIHZvaWQgKnZpcnQpCi17Ci0gICAgLyogQ2FuIHJldXNlIHRoZSAndmlydCcgdmVjdG9yIGZvciB0aGUgc3BpbmUgb2YgaXQsIHNpbmNlIHdlIGRvbid0Ci0gICAgICogaGF2ZSB0byBkZWFsIHdpdGggdGhlIG1vcmFsIGVxdWl2YWxlbnQgb2YgLmh0YWNjZXNzIGZpbGVzIGhlcmUuLi4KLSAgICAgKi8KLQotICAgIHZvaWQgKipiYXNlX3ZlY3RvciA9ICh2b2lkICoqKSBiYXNlOwotICAgIHZvaWQgKip2aXJ0X3ZlY3RvciA9ICh2b2lkICoqKSB2aXJ0OwotICAgIG1vZHVsZSAqbW9kcDsKLQotICAgIGZvciAobW9kcCA9IHRvcF9tb2R1bGU7IG1vZHA7IG1vZHAgPSBtb2RwLT5uZXh0KSB7Ci0JbWVyZ2VyX2Z1bmMgZGYgPSBtb2RwLT5tZXJnZV9zZXJ2ZXJfY29uZmlnOwotCWludCBpID0gbW9kcC0+bW9kdWxlX2luZGV4OwotCi0JaWYgKCF2aXJ0X3ZlY3RvcltpXSkKLQkgICAgdmlydF92ZWN0b3JbaV0gPSBiYXNlX3ZlY3RvcltpXTsKLQllbHNlIGlmIChkZikKLQkgICAgdmlydF92ZWN0b3JbaV0gPSAoKmRmKSAocCwgYmFzZV92ZWN0b3JbaV0sIHZpcnRfdmVjdG9yW2ldKTsKLSAgICB9Ci19Ci0KLXZvaWQgKmFwX2NyZWF0ZV9yZXF1ZXN0X2NvbmZpZyhwb29sICpwKQotewotICAgIHJldHVybiBjcmVhdGVfZW1wdHlfY29uZmlnKHApOwotfQotCi1DT1JFX0VYUE9SVCh2b2lkICopIGFwX2NyZWF0ZV9wZXJfZGlyX2NvbmZpZyhwb29sICpwKQotewotICAgIHJldHVybiBjcmVhdGVfZW1wdHlfY29uZmlnKHApOwotfQotCi0jaWZkZWYgRVhQTEFJTgotCi1zdHJ1Y3QgewotICAgIGludCBvZmZzZXQ7Ci0gICAgY2hhciAqbWV0aG9kOwotfSBhTWV0aG9kc1tdID0KLQotewotI2RlZmluZSBtKG1ldGgpCXsgWHRPZmZzZXRPZihtb2R1bGUsbWV0aCksI21ldGggfQotICAgIG0odHJhbnNsYXRlX2hhbmRsZXIpLAotICAgIG0oYXBfY2hlY2tfdXNlcl9pZCksCi0gICAgbShhdXRoX2NoZWNrZXIpLAotICAgIG0odHlwZV9jaGVja2VyKSwKLSAgICBtKGZpeGVyX3VwcGVyKSwKLSAgICBtKGxvZ2dlciksCi0gICAgeyAtMSwgIj8iIH0sCi0jdW5kZWYgbQotfTsKLQotY2hhciAqU2hvd01ldGhvZChtb2R1bGUgKm1vZHAsIGludCBvZmZzZXQpCi17Ci0gICAgaW50IG47Ci0gICAgc3RhdGljIGNoYXIgYnVmWzIwMF07Ci0KLSAgICBmb3IgKG4gPSAwOyBhTWV0aG9kc1tuXS5vZmZzZXQgPj0gMDsgKytuKQotCWlmIChhTWV0aG9kc1tuXS5vZmZzZXQgPT0gb2Zmc2V0KQotCSAgICBicmVhazsKLSAgICBhcF9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXM6JXMiLCBtb2RwLT5uYW1lLCBhTWV0aG9kc1tuXS5tZXRob2QpOwotICAgIHJldHVybiBidWY7Ci19Ci0jZWxzZQotI2RlZmluZSBTaG93TWV0aG9kKG1vZHAsb2Zmc2V0KQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRGlzcGF0Y2ggdGhyb3VnaCB0aGUgbW9kdWxlcyB0byBmaW5kIGhhbmRsZXJzIGZvciB2YXJpb3VzIHBoYXNlcwotICogb2YgcmVxdWVzdCBoYW5kbGluZy4gIFRoZXNlIGFyZSBpbnZva2VkIGJ5IGh0dHBfcmVxdWVzdC5jIHRvIGFjdHVhbGx5Ci0gKiBkbyB0aGUgZGlydHkgd29yayBvZiBzbG9nZ2luZyB0aHJvdWdoIHRoZSBtb2R1bGUgc3RydWN0dXJlcy4KLSAqLwotCi0vKgotICogT3B0aW1pemVkIHJ1bl9tZXRob2Qgcm91dGluZXMuICBUaGUgb2JzZXJ2YXRpb24gaGVyZSBpcyB0aGF0IG1hbnkgbW9kdWxlcwotICogaGF2ZSBOVUxMIGZvciBtb3N0IG9mIHRoZSBtZXRob2RzLiAgU28gd2UgYnVpbGQgb3B0aW1pemVkIGxpc3RzIG9mCi0gKiBldmVyeXRoaW5nLiAgSWYgeW91IHRoaW5rIGFib3V0IGl0LCB0aGlzIGlzIHJlYWxseSBqdXN0IGxpa2UgYSBzcGFyc2UgYXJyYXkKLSAqIGltcGxlbWVudGF0aW9uIHRvIGF2b2lkIHNjYW5uaW5nIHRoZSB6ZXJvIGVudHJpZXMuCi0gKi8KLXN0YXRpYyBjb25zdCBpbnQgbWV0aG9kX29mZnNldHNbXSA9Ci17Ci0gICAgWHRPZmZzZXRPZihtb2R1bGUsIHRyYW5zbGF0ZV9oYW5kbGVyKSwKLSAgICBYdE9mZnNldE9mKG1vZHVsZSwgYXBfY2hlY2tfdXNlcl9pZCksCi0gICAgWHRPZmZzZXRPZihtb2R1bGUsIGF1dGhfY2hlY2tlciksCi0gICAgWHRPZmZzZXRPZihtb2R1bGUsIGFjY2Vzc19jaGVja2VyKSwKLSAgICBYdE9mZnNldE9mKG1vZHVsZSwgdHlwZV9jaGVja2VyKSwKLSAgICBYdE9mZnNldE9mKG1vZHVsZSwgZml4ZXJfdXBwZXIpLAotICAgIFh0T2Zmc2V0T2YobW9kdWxlLCBsb2dnZXIpLAotICAgIFh0T2Zmc2V0T2YobW9kdWxlLCBoZWFkZXJfcGFyc2VyKSwKLSAgICBYdE9mZnNldE9mKG1vZHVsZSwgcG9zdF9yZWFkX3JlcXVlc3QpCi19OwotI2RlZmluZSBOTUVUSE9EUwkoc2l6ZW9mIChtZXRob2Rfb2Zmc2V0cykvc2l6ZW9mIChtZXRob2Rfb2Zmc2V0c1swXSkpCi0KLXN0YXRpYyBzdHJ1Y3QgewotICAgIGludCB0cmFuc2xhdGVfaGFuZGxlcjsKLSAgICBpbnQgYXBfY2hlY2tfdXNlcl9pZDsKLSAgICBpbnQgYXV0aF9jaGVja2VyOwotICAgIGludCBhY2Nlc3NfY2hlY2tlcjsKLSAgICBpbnQgdHlwZV9jaGVja2VyOwotICAgIGludCBmaXhlcl91cHBlcjsKLSAgICBpbnQgbG9nZ2VyOwotICAgIGludCBoZWFkZXJfcGFyc2VyOwotICAgIGludCBwb3N0X3JlYWRfcmVxdWVzdDsKLX0gb2Zmc2V0c19pbnRvX21ldGhvZF9wdHJzOwotCi0vKgotICogVGhpcyBpcyBqdXN0IG9uZSBiaWcgYXJyYXkgb2YgbWV0aG9kX3B0cnMuICBJdCdzIGNvbnN0cnVjdGVkIHN1Y2ggdGhhdCwKLSAqIGZvciBleGFtcGxlLCBtZXRob2RfcHRyc1sgb2Zmc2V0c19pbnRvX21ldGhvZF9wdHJzLmxvZ2dlciBdIGlzIHRoZSBmaXJzdAotICogbG9nZ2VyIGZ1bmN0aW9uLiAgWW91IGdvIG9uZS1ieS1vbmUgZnJvbSB0aGVyZSB1bnRpbCB5b3UgaGl0IGEgTlVMTC4KLSAqIFRoaXMgc3RydWN0dXJlIHdhcyBkZXNpZ25lZCB0byBob3BlZnVsbHkgbWF4aW1pemUgY2FjaGUtY29vbG5lc3MuCi0gKi8KLXN0YXRpYyBoYW5kbGVyX2Z1bmMgKm1ldGhvZF9wdHJzOwotCi0vKiByb3V0aW5lIHRvIHJlY29uc3RydWN0IGFsbCB0aGVzZSBzaG9ydGN1dHMuLi4gY2FsbGVkIGFmdGVyIGV2ZXJ5Ci0gKiBhZGRfbW9kdWxlLgotICogWFhYOiB0aGlzIGJyZWFrcyBpZiBtb2R1bGVzIGRpbmsgd2l0aCB0aGVpciBtZXRob2RzIHBvaW50ZXJzCi0gKi8KLXN0YXRpYyB2b2lkIGJ1aWxkX21ldGhvZF9zaG9ydGN1dHModm9pZCkKLXsKLSAgICBtb2R1bGUgKm1vZHA7Ci0gICAgaW50IGhvd19tYW55X3B0cnM7Ci0gICAgaW50IGk7Ci0gICAgaW50IG5leHRfcHRyOwotICAgIGhhbmRsZXJfZnVuYyBmcDsKLQotICAgIGlmIChtZXRob2RfcHRycykgewotCS8qIGZyZWUgdXAgYW55IHByZXZpb3VzIHNldCBvZiBtZXRob2RfcHRycyAqLwotCWZyZWUobWV0aG9kX3B0cnMpOwotICAgIH0KLQotICAgIC8qIGZpcnN0IHdlIGNvdW50IGhvdyBtYW55IGZ1bmN0aW9ucyB3ZSBoYXZlICovCi0gICAgaG93X21hbnlfcHRycyA9IDA7Ci0gICAgZm9yIChtb2RwID0gdG9wX21vZHVsZTsgbW9kcDsgbW9kcCA9IG1vZHAtPm5leHQpIHsKLQlmb3IgKGkgPSAwOyBpIDwgTk1FVEhPRFM7ICsraSkgewotCSAgICBpZiAoKihoYW5kbGVyX2Z1bmMgKikgKG1ldGhvZF9vZmZzZXRzW2ldICsgKGNoYXIgKikgbW9kcCkpIHsKLQkJKytob3dfbWFueV9wdHJzOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICBtZXRob2RfcHRycyA9IG1hbGxvYygoaG93X21hbnlfcHRycyArIE5NRVRIT0RTKSAqIHNpemVvZihoYW5kbGVyX2Z1bmMpKTsKLSAgICBpZiAobWV0aG9kX3B0cnMgPT0gTlVMTCkgewotCWZwcmludGYoc3RkZXJyLCAiT3VjaCEgIE91dCBvZiBtZW1vcnkgaW4gYnVpbGRfbWV0aG9kX3Nob3J0Y3V0cygpIVxuIik7Ci0gICAgfQotICAgIG5leHRfcHRyID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTk1FVEhPRFM7ICsraSkgewotCS8qIFhYWDogVGhpcyBpcyBhbiBpdHN5IGJpdCBwcmVzdW1wdHVvdXMgYWJvdXQgdGhlIGFsaWdubWVudAotCSAqIGNvbnN0cmFpbnRzIG9uIG9mZnNldHNfaW50b19tZXRob2RfcHRycy4gIEkgY2FuJ3QgcmVtZW1iZXIgaWYKLQkgKiBBTlNJIHNheXMgdGhpcyBoYXMgdG8gYmUgdHJ1ZS4uLiAtZGpnICovCi0JKChpbnQgKikgJm9mZnNldHNfaW50b19tZXRob2RfcHRycylbaV0gPSBuZXh0X3B0cjsKLQlmb3IgKG1vZHAgPSB0b3BfbW9kdWxlOyBtb2RwOyBtb2RwID0gbW9kcC0+bmV4dCkgewotCSAgICBmcCA9ICooaGFuZGxlcl9mdW5jICopIChtZXRob2Rfb2Zmc2V0c1tpXSArIChjaGFyICopIG1vZHApOwotCSAgICBpZiAoZnApIHsKLQkJbWV0aG9kX3B0cnNbbmV4dF9wdHIrK10gPSBmcDsKLQkgICAgfQotCX0KLQltZXRob2RfcHRyc1tuZXh0X3B0cisrXSA9IE5VTEw7Ci0gICAgfQotfQotCi0KLXN0YXRpYyBpbnQgcnVuX21ldGhvZChyZXF1ZXN0X3JlYyAqciwgaW50IG9mZnNldCwgaW50IHJ1bl9hbGwpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSBvZmZzZXQ7IG1ldGhvZF9wdHJzW2ldOyArK2kpIHsKLQloYW5kbGVyX2Z1bmMgbW9kX2hhbmRsZXIgPSBtZXRob2RfcHRyc1tpXTsKLQotCWlmIChtb2RfaGFuZGxlcikgewotCSAgICBpbnQgcmVzdWx0OwotCi0JICAgIHJlc3VsdCA9ICgqbW9kX2hhbmRsZXIpIChyKTsKLQotCSAgICBpZiAocmVzdWx0ICE9IERFQ0xJTkVEICYmICghcnVuX2FsbCB8fCByZXN1bHQgIT0gT0spKQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gcnVuX2FsbCA/IE9LIDogREVDTElORUQ7Ci19Ci0KLWludCBhcF90cmFuc2xhdGVfbmFtZShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICByZXR1cm4gcnVuX21ldGhvZChyLCBvZmZzZXRzX2ludG9fbWV0aG9kX3B0cnMudHJhbnNsYXRlX2hhbmRsZXIsIDApOwotfQotCi1pbnQgYXBfY2hlY2tfYWNjZXNzKHJlcXVlc3RfcmVjICpyKQotewotICAgIHJldHVybiBydW5fbWV0aG9kKHIsIG9mZnNldHNfaW50b19tZXRob2RfcHRycy5hY2Nlc3NfY2hlY2tlciwgMSk7Ci19Ci0KLWludCBhcF9maW5kX3R5cGVzKHJlcXVlc3RfcmVjICpyKQotewotICAgIHJldHVybiBydW5fbWV0aG9kKHIsIG9mZnNldHNfaW50b19tZXRob2RfcHRycy50eXBlX2NoZWNrZXIsIDApOwotfQotCi1pbnQgYXBfcnVuX2ZpeHVwcyhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICByZXR1cm4gcnVuX21ldGhvZChyLCBvZmZzZXRzX2ludG9fbWV0aG9kX3B0cnMuZml4ZXJfdXBwZXIsIDEpOwotfQotCi1pbnQgYXBfbG9nX3RyYW5zYWN0aW9uKHJlcXVlc3RfcmVjICpyKQotewotICAgIHJldHVybiBydW5fbWV0aG9kKHIsIG9mZnNldHNfaW50b19tZXRob2RfcHRycy5sb2dnZXIsIDEpOwotfQotCi1pbnQgYXBfaGVhZGVyX3BhcnNlKHJlcXVlc3RfcmVjICpyKQotewotICAgIHJldHVybiBydW5fbWV0aG9kKHIsIG9mZnNldHNfaW50b19tZXRob2RfcHRycy5oZWFkZXJfcGFyc2VyLCAxKTsKLX0KLQotaW50IGFwX3J1bl9wb3N0X3JlYWRfcmVxdWVzdChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICByZXR1cm4gcnVuX21ldGhvZChyLCBvZmZzZXRzX2ludG9fbWV0aG9kX3B0cnMucG9zdF9yZWFkX3JlcXVlc3QsIDEpOwotfQotCi0vKiBBdXRoIHN0dWZmIC0tLSBhbnl0aGluZyB0aGF0IGRlZmluZXMgb25lIG9mIHRoZXNlIHdpbGwgcHJlc3VtYWJseQotICogd2FudCB0byBkZWZpbmUgc29tZXRoaW5nIGZvciB0aGUgb3RoZXIuICBOb3RlIHRoYXQgY2hlY2tfYXV0aCBpcwotICogc2VwYXJhdGUgZnJvbSBjaGVja19hY2Nlc3MgdG8gbWFrZSBjYXRjaGluZyBzb21lIGNvbmZpZyBlcnJvcnMgZWFzaWVyLgotICovCi0KLWludCBhcF9jaGVja191c2VyX2lkKHJlcXVlc3RfcmVjICpyKQotewotICAgIHJldHVybiBydW5fbWV0aG9kKHIsIG9mZnNldHNfaW50b19tZXRob2RfcHRycy5hcF9jaGVja191c2VyX2lkLCAwKTsKLX0KLQotaW50IGFwX2NoZWNrX2F1dGgocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgcmV0dXJuIHJ1bl9tZXRob2Qociwgb2Zmc2V0c19pbnRvX21ldGhvZF9wdHJzLmF1dGhfY2hlY2tlciwgMCk7Ci19Ci0KLS8qCi0gKiBGb3Igc3BlZWQvZWZmaWNpZW5jeSB3ZSBnZW5lcmF0ZSBhIGNvbXBhY3QgbGlzdCBvZiBhbGwgdGhlIGhhbmRsZXJzCi0gKiBhbmQgd2lsZGNhcmQgaGFuZGxlcnMuICBUaGlzIG1lYW5zIHdlIHdvbid0IGhhdmUgdG8gc2NhbiB0aGUgZW50aXJlCi0gKiBtb2R1bGUgbGlzdCBsb29raW5nIGZvciBoYW5kbGVycy4uLiB3aGVyZSB3ZSdsbCBmaW5kIGEgd2hvbGUgd2hhY2sKLSAqIG9mIE5VTExzLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaGFuZGxlcl9yZWMgaHI7Ci0gICAgc2l6ZV90IGxlbjsKLX0gZmFzdF9oYW5kbGVyX3JlYzsKLQotc3RhdGljIGZhc3RfaGFuZGxlcl9yZWMgKmhhbmRsZXJzOwotc3RhdGljIGZhc3RfaGFuZGxlcl9yZWMgKndpbGRoYW5kbGVyczsKLQotc3RhdGljIHZvaWQgaW5pdF9oYW5kbGVycyhwb29sICpwKQotewotICAgIG1vZHVsZSAqbW9kcDsKLSAgICBpbnQgbmhhbmRsZXJzID0gMDsKLSAgICBpbnQgbndpbGRoYW5kbGVycyA9IDA7Ci0gICAgY29uc3QgaGFuZGxlcl9yZWMgKmhhbmRwOwotICAgIGZhc3RfaGFuZGxlcl9yZWMgKnBoLCAqcHc7Ci0gICAgY2hhciAqc3RhcnA7Ci0KLSAgICBmb3IgKG1vZHAgPSB0b3BfbW9kdWxlOyBtb2RwOyBtb2RwID0gbW9kcC0+bmV4dCkgewotCWlmICghbW9kcC0+aGFuZGxlcnMpCi0JICAgIGNvbnRpbnVlOwotCWZvciAoaGFuZHAgPSBtb2RwLT5oYW5kbGVyczsgaGFuZHAtPmNvbnRlbnRfdHlwZTsgKytoYW5kcCkgewotCSAgICBpZiAoc3RyY2hyKGhhbmRwLT5jb250ZW50X3R5cGUsICcqJykpIHsKLSAgICAgICAgICAgICAgICBud2lsZGhhbmRsZXJzICsrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuaGFuZGxlcnMgKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcGggPSBoYW5kbGVycyA9IGFwX3BhbGxvYyhwLCBzaXplb2YoKnBoKSoobmhhbmRsZXJzICsgMSkpOwotICAgIHB3ID0gd2lsZGhhbmRsZXJzID0gYXBfcGFsbG9jKHAsIHNpemVvZigqcHcpKihud2lsZGhhbmRsZXJzICsgMSkpOwotICAgIGZvciAobW9kcCA9IHRvcF9tb2R1bGU7IG1vZHA7IG1vZHAgPSBtb2RwLT5uZXh0KSB7Ci0JaWYgKCFtb2RwLT5oYW5kbGVycykKLQkgICAgY29udGludWU7Ci0JZm9yIChoYW5kcCA9IG1vZHAtPmhhbmRsZXJzOyBoYW5kcC0+Y29udGVudF90eXBlOyArK2hhbmRwKSB7Ci0JICAgIGlmICgoc3RhcnAgPSBzdHJjaHIoaGFuZHAtPmNvbnRlbnRfdHlwZSwgJyonKSkpIHsKLSAgICAgICAgICAgICAgICBwdy0+aHIuY29udGVudF90eXBlID0gaGFuZHAtPmNvbnRlbnRfdHlwZTsKLSAgICAgICAgICAgICAgICBwdy0+aHIuaGFuZGxlciA9IGhhbmRwLT5oYW5kbGVyOwotCQlwdy0+bGVuID0gc3RhcnAgLSBoYW5kcC0+Y29udGVudF90eXBlOwotICAgICAgICAgICAgICAgIHB3ICsrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwaC0+aHIuY29udGVudF90eXBlID0gaGFuZHAtPmNvbnRlbnRfdHlwZTsKLSAgICAgICAgICAgICAgICBwaC0+aHIuaGFuZGxlciA9IGhhbmRwLT5oYW5kbGVyOwotCQlwaC0+bGVuID0gc3RybGVuKGhhbmRwLT5jb250ZW50X3R5cGUpOwotICAgICAgICAgICAgICAgIHBoICsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHB3LT5oci5jb250ZW50X3R5cGUgPSBOVUxMOwotICAgIHB3LT5oci5oYW5kbGVyID0gTlVMTDsKLSAgICBwaC0+aHIuY29udGVudF90eXBlID0gTlVMTDsKLSAgICBwaC0+aHIuaGFuZGxlciA9IE5VTEw7Ci19Ci0KLWludCBhcF9pbnZva2VfaGFuZGxlcihyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBmYXN0X2hhbmRsZXJfcmVjICpoYW5kcDsKLSAgICBjb25zdCBjaGFyICpoYW5kbGVyOwotICAgIGNoYXIgKnA7Ci0gICAgc2l6ZV90IGhhbmRsZXJfbGVuOwotICAgIGludCByZXN1bHQgPSBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLQotICAgIGlmIChyLT5oYW5kbGVyKSB7Ci0JaGFuZGxlciA9IHItPmhhbmRsZXI7Ci0JaGFuZGxlcl9sZW4gPSBzdHJsZW4oaGFuZGxlcik7Ci0gICAgfQotICAgIGVsc2UgewotCWhhbmRsZXIgPSByLT5jb250ZW50X3R5cGUgPyByLT5jb250ZW50X3R5cGUgOiBhcF9kZWZhdWx0X3R5cGUocik7Ci0JaWYgKChwID0gc3RyY2hyKGhhbmRsZXIsICc7JykpICE9IE5VTEwpIHsgLyogTUlNRSB0eXBlIGFyZ3VtZW50cyAqLwotCSAgICB3aGlsZSAocCA+IGhhbmRsZXIgJiYgcFstMV0gPT0gJyAnKQotCQktLXA7CQkvKiBzdHJpcCB0cmFpbGluZyBzcGFjZXMgKi8KLQkgICAgaGFuZGxlcl9sZW4gPSBwIC0gaGFuZGxlcjsKLQl9Ci0JZWxzZSB7Ci0JICAgIGhhbmRsZXJfbGVuID0gc3RybGVuKGhhbmRsZXIpOwotCX0KLSAgICB9Ci0KLSAgICAvKiBQYXNzIG9uZSAtLS0gZGlyZWN0IG1hdGNoZXMgKi8KLQotICAgIGZvciAoaGFuZHAgPSBoYW5kbGVyczsgaGFuZHAtPmhyLmNvbnRlbnRfdHlwZTsgKytoYW5kcCkgewotCWlmIChoYW5kbGVyX2xlbiA9PSBoYW5kcC0+bGVuCi0JICAgICYmICFzdHJuY21wKGhhbmRsZXIsIGhhbmRwLT5oci5jb250ZW50X3R5cGUsIGhhbmRsZXJfbGVuKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gKCpoYW5kcC0+aHIuaGFuZGxlcikgKHIpOwotCi0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IERFQ0xJTkVEKQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0ID09IEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SICYmIHItPmhhbmRsZXIpIHsKLSAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX1dBUk5JTkcsIHIsCi0gICAgICAgICAgICAiaGFuZGxlciBcIiVzXCIgbm90IGZvdW5kIGZvcjogJXMiLCByLT5oYW5kbGVyLCByLT5maWxlbmFtZSk7Ci0gICAgfQotCi0gICAgLyogUGFzcyB0d28gLS0tIHdpbGRjYXJkIG1hdGNoZXMgKi8KLQotICAgIGZvciAoaGFuZHAgPSB3aWxkaGFuZGxlcnM7IGhhbmRwLT5oci5jb250ZW50X3R5cGU7ICsraGFuZHApIHsKLQlpZiAoaGFuZGxlcl9sZW4gPj0gaGFuZHAtPmxlbgotCSAgICAmJiAhc3RybmNtcChoYW5kbGVyLCBoYW5kcC0+aHIuY29udGVudF90eXBlLCBoYW5kcC0+bGVuKSkgewotICAgICAgICAgICAgIHJlc3VsdCA9ICgqaGFuZHAtPmhyLmhhbmRsZXIpIChyKTsKLQotICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gREVDTElORUQpCi0gICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotfQotCi0vKiBPbmUtdGltZSBzZXR1cCBmb3IgcHJlY29tcGlsZWQgbW9kdWxlcyAtLS0gTk9UIHRvIGJlIGRvbmUgb24gcmVzdGFydCAqLwotCi1BUElfRVhQT1JUKHZvaWQpIGFwX2FkZF9tb2R1bGUobW9kdWxlICptKQotewotICAgIC8qIFRoaXMgY291bGQgYmUgY2FsbGVkIGZyb20gYW4gQWRkTW9kdWxlIGh0dHBkLmNvbmYgY29tbWFuZCwKLSAgICAgKiBhZnRlciB0aGUgZmlsZSBoYXMgYmVlbiBsaW5rZWQgYW5kIHRoZSBtb2R1bGUgc3RydWN0dXJlIHdpdGhpbiBpdAotICAgICAqIHRlYXNlZCBvdXQuLi4KLSAgICAgKi8KLQotICAgIGlmIChtLT52ZXJzaW9uICE9IE1PRFVMRV9NQUdJQ19OVU1CRVJfTUFKT1IpIHsKLQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBtb2R1bGUgXCIlc1wiIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhpcyAiCi0JCSJ2ZXJzaW9uIG9mIEFwYWNoZS5cbiIsIGFwX3NlcnZlcl9hcmd2MCwgbS0+bmFtZSk7Ci0JZnByaW50ZihzdGRlcnIsICJQbGVhc2UgY29udGFjdCB0aGUgdmVuZG9yIGZvciB0aGUgY29ycmVjdCB2ZXJzaW9uLlxuIik7Ci0JZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBpZiAobS0+bmV4dCA9PSBOVUxMKSB7Ci0JbS0+bmV4dCA9IHRvcF9tb2R1bGU7Ci0JdG9wX21vZHVsZSA9IG07Ci0gICAgfQotICAgIGlmIChtLT5tb2R1bGVfaW5kZXggPT0gLTEpIHsKLQltLT5tb2R1bGVfaW5kZXggPSB0b3RhbF9tb2R1bGVzKys7Ci0JZHluYW1pY19tb2R1bGVzKys7Ci0KLQlpZiAoZHluYW1pY19tb2R1bGVzID4gRFlOQU1JQ19NT0RVTEVfTElNSVQpIHsKLQkgICAgZnByaW50ZihzdGRlcnIsICIlczogbW9kdWxlIFwiJXNcIiBjb3VsZCBub3QgYmUgbG9hZGVkLCBiZWNhdXNlIgotCQkgICAgIiB0aGUgZHluYW1pY1xuIiwgYXBfc2VydmVyX2FyZ3YwLCBtLT5uYW1lKTsKLQkgICAgZnByaW50ZihzdGRlcnIsICJtb2R1bGUgbGltaXQgd2FzIHJlYWNoZWQuIFBsZWFzZSBpbmNyZWFzZSAiCi0JCSAgICAiRFlOQU1JQ19NT0RVTEVfTElNSVQgYW5kIHJlY29tcGlsZS5cbiIpOwotCSAgICBleGl0KDEpOwotCX0KLSAgICB9Ci0KLSAgICAvKiBTb21lIEMgY29tcGlsZXJzIHB1dCBhIGNvbXBsZXRlIHBhdGggaW50byBfX0ZJTEVfXywgYnV0IHdlIHdhbnQKLSAgICAgKiBvbmx5IHRoZSBmaWxlbmFtZSAoZS5nLiBtb2RfaW5jbHVkZXMuYykuIFNvIGNoZWNrIGZvciBwYXRoCi0gICAgICogY29tcG9uZW50cyAoVW5peCBhbmQgRE9TKSwgYW5kIHJlbW92ZSB0aGVtLgotICAgICAqLwotCi0gICAgaWYgKHN0cnJjaHIobS0+bmFtZSwgJy8nKSkKLQltLT5uYW1lID0gMSArIHN0cnJjaHIobS0+bmFtZSwgJy8nKTsKLSAgICBpZiAoc3RycmNocihtLT5uYW1lLCAnXFwnKSkKLQltLT5uYW1lID0gMSArIHN0cnJjaHIobS0+bmFtZSwgJ1xcJyk7Ci0KLSNpZmRlZiBfT1NEX1BPU0lYIC8qIF9fRklMRV9fPSIqUE9TSVgoL2hvbWUvbWFydGluL2FwYWNoZS9zcmMvbW9kdWxlcy9zdGFuZGFyZC9tb2RfaW5mby5jKSIgKi8KLSAgICAvKiBXZSBjYW5ub3QgZml4IHRoZSBzdHJpbmcgaW4tcGxhY2UsIGJlY2F1c2UgaXQncyBjb25zdCAqLwotICAgIGlmIChtLT5uYW1lW3N0cmxlbihtLT5uYW1lKS0xXT09JyknKSB7Ci0JY2hhciAqdG1wID0gc3RyZHVwKG0tPm5hbWUpOwkvKiBGSVhNRTptZW1vcnkgbGVhaywgYWxiZWl0IGEgc21hbGwgb25lICovCi0JdG1wW3N0cmxlbih0bXApLTFdID0gJ1wwJzsKLQltLT5uYW1lID0gdG1wOwotICAgIH0KLSNlbmRpZiAvKl9PU0RfUE9TSVgqLwotfQotCi0vKiAKLSAqIHJlbW92ZV9tb2R1bGUgdW5kb2VzIHdoYXQgYWRkX21vZHVsZSBkaWQuIFRoZXJlIGFyZSBzb21lIGNhdmVhdHM6Ci0gKiB3aGVuIHRoZSBtb2R1bGUgaXMgcmVtb3ZlZCwgaXRzIHNsb3QgaXMgbG9zdCBzbyBhbGwgdGhlIGN1cnJlbnQKLSAqIHBlci1kaXIgYW5kIHBlci1zZXJ2ZXIgY29uZmlndXJhdGlvbnMgYXJlIGludmFsaWQuIFNvIHdlIHNob3VsZAotICogb25seSBldmVyIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHlvdSBhcmUgaW52YWxpZGF0aW5nIGFsbW9zdAotICogYWxsIG91ciBjdXJyZW50IGRhdGEuIEkuZS4gd2hlbiBkb2luZyBhIHJlc3RhcnQuCi0gKi8KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9yZW1vdmVfbW9kdWxlKG1vZHVsZSAqbSkKLXsKLSAgICBtb2R1bGUgKm1vZHA7Ci0KLSAgICBtb2RwID0gdG9wX21vZHVsZTsKLSAgICBpZiAobW9kcCA9PSBtKSB7Ci0JLyogV2UgYXJlIHRoZSB0b3AgbW9kdWxlLCBzcGVjaWFsIGNhc2UgKi8KLQl0b3BfbW9kdWxlID0gbW9kcC0+bmV4dDsKLQltLT5uZXh0ID0gTlVMTDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JLyogTm90IHRoZSB0b3AgbW9kdWxlLCBmaW5kIHVzZS4gV2hlbiBmb3VuZCBtb2RwIHdpbGwKLQkgKiBwb2ludCB0byB0aGUgbW9kdWxlIF9iZWZvcmVfIHVzIGluIHRoZSBsaXN0Ci0JICovCi0KLQl3aGlsZSAobW9kcCAmJiBtb2RwLT5uZXh0ICE9IG0pIHsKLQkgICAgbW9kcCA9IG1vZHAtPm5leHQ7Ci0JfQotCWlmICghbW9kcCkgewotCSAgICAvKiBVaC1vaCwgdGhpcyBtb2R1bGUgZG9lc24ndCBleGlzdCAqLwotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSfEFQTE9HX05PRVJSTk8sIE5VTEwsCi0JCSJDYW5ub3QgcmVtb3ZlIG1vZHVsZSAlczogbm90IGZvdW5kIGluIG1vZHVsZSBsaXN0IiwKLQkJbS0+bmFtZSk7Ci0JICAgIHJldHVybjsKLQl9Ci0JLyogRWxpbWluYXRlIHVzIGZyb20gdGhlIG1vZHVsZSBsaXN0ICovCi0JbW9kcC0+bmV4dCA9IG1vZHAtPm5leHQtPm5leHQ7Ci0gICAgfQotCi0gICAgbS0+bW9kdWxlX2luZGV4ID0gLTE7CS8qIHNpbXVsYXRlIGJlaW5nIHVubG9hZGVkLCBzaG91bGQKLQkJCQkgKiBiZSB1bm5lY2Vzc2FyeSAqLwotICAgIGR5bmFtaWNfbW9kdWxlcy0tOwotICAgIHRvdGFsX21vZHVsZXMtLTsKLX0KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9hZGRfbG9hZGVkX21vZHVsZShtb2R1bGUgKm1vZCkKLXsKLSAgICBtb2R1bGUgKiptOwotCi0gICAgLyogCi0gICAgICogIEFkZCBtb2R1bGUgcG9pbnRlciB0byB0b3Agb2YgY2hhaW5lZCBtb2R1bGUgbGlzdCAKLSAgICAgKi8KLSAgICBhcF9hZGRfbW9kdWxlKG1vZCk7Ci0KLSAgICAvKiAKLSAgICAgKiAgQW5kIG1vZHVsZSBwb2ludGVyIHRvIGxpc3Qgb2YgbG9hZGVkIG1vZHVsZXMgCi0gICAgICoKLSAgICAgKiAgTm90ZXM6IDEuIGFwX2FkZF9tb2R1bGUoKSB3b3VsZCBhbHJlYWR5IGNvbXBsYWluIGlmIG5vIG1vcmUgc3BhY2UKLSAgICAgKiAgICAgICAgICAgIGV4aXN0cyBmb3IgYWRkaW5nIGEgZHluYW1pY2FsbHkgbG9hZGVkIG1vZHVsZQotICAgICAqICAgICAgICAgMi4gYXBfYWRkX21vZHVsZSgpIGFjY2VwdHMgZG91YmxlLWluY2x1c2lvbiwgc28gd2UgaGF2ZQotICAgICAqICAgICAgICAgICAgdG8gYWNjZXB0IHRoaXMsIHRvby4KLSAgICAgKi8KLSAgICBmb3IgKG0gPSBhcF9sb2FkZWRfbW9kdWxlczsgKm0gIT0gTlVMTDsgbSsrKQotICAgICAgICA7Ci0gICAgKm0rKyA9IG1vZDsKLSAgICAqbSA9IE5VTEw7Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfcmVtb3ZlX2xvYWRlZF9tb2R1bGUobW9kdWxlICptb2QpCi17Ci0gICAgbW9kdWxlICoqbTsKLSAgICBtb2R1bGUgKiptMjsKLSAgICBpbnQgZG9uZTsKLQotICAgIC8qIAotICAgICAqICBSZW1vdmUgbW9kdWxlIHBvaW50ZXIgZnJvbSBjaGFpbmVkIG1vZHVsZSBsaXN0IAotICAgICAqLwotICAgIGFwX3JlbW92ZV9tb2R1bGUobW9kKTsKLQotICAgIC8qIAotICAgICAqICBSZW1vdmUgbW9kdWxlIHBvaW50ZXIgZnJvbSBsaXN0IG9mIGxvYWRlZCBtb2R1bGVzCi0gICAgICoKLSAgICAgKiAgTm90ZTogMS4gV2UgY2Fubm90IGRldGVybWluZSBpZiB0aGUgbW9kdWxlIHdhcyBzdWNjZXNzZnVsbHkKLSAgICAgKiAgICAgICAgICAgcmVtb3ZlZCBieSBhcF9yZW1vdmVfbW9kdWxlKCkuCi0gICAgICogICAgICAgIDIuIFdlIGhhdmUgbm90IHRvIGNvbXBsYWluIGV4cGxpY2l0eSB3aGVuIHRoZSBtb2R1bGUKLSAgICAgKiAgICAgICAgICAgaXMgbm90IGZvdW5kIGJlY2F1c2UgYXBfcmVtb3ZlX21vZHVsZSgpIGRpZCBpdAotICAgICAqICAgICAgICAgICBmb3IgdXMgYWxyZWFkeS4KLSAgICAgKi8KLSAgICBmb3IgKG0gPSBtMiA9IGFwX2xvYWRlZF9tb2R1bGVzLCBkb25lID0gMDsgKm0yICE9IE5VTEw7IG0yKyspIHsKLSAgICAgICAgaWYgKCptMiA9PSBtb2QgJiYgZG9uZSA9PSAwKQotICAgICAgICAgICAgZG9uZSA9IDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICptKysgPSAqbTI7Ci0gICAgfQotICAgICptID0gTlVMTDsKLX0KLQotdm9pZCBhcF9zZXR1cF9wcmVsaW5rZWRfbW9kdWxlcygpCi17Ci0gICAgbW9kdWxlICoqbTsKLSAgICBtb2R1bGUgKiptMjsKLQotICAgIC8qCi0gICAgICogIEluaXRpYWxpc2UgdG90YWxfbW9kdWxlcyB2YXJpYWJsZSBhbmQgbW9kdWxlIGluZGljZXMKLSAgICAgKi8KLSAgICB0b3RhbF9tb2R1bGVzID0gMDsKLSAgICBmb3IgKG0gPSBhcF9wcmVsb2FkZWRfbW9kdWxlczsgKm0gIT0gTlVMTDsgbSsrKQotICAgICAgICAoKm0pLT5tb2R1bGVfaW5kZXggPSB0b3RhbF9tb2R1bGVzKys7Ci0KLSAgICAvKiAKLSAgICAgKiAgSW5pdGlhbGlzZSBsaXN0IG9mIGxvYWRlZCBtb2R1bGVzCi0gICAgICovCi0gICAgYXBfbG9hZGVkX21vZHVsZXMgPSAobW9kdWxlICoqKW1hbGxvYygKLSAgICAgICAgc2l6ZW9mKG1vZHVsZSAqKSoodG90YWxfbW9kdWxlcytEWU5BTUlDX01PRFVMRV9MSU1JVCsxKSk7Ci0gICAgaWYgKGFwX2xvYWRlZF9tb2R1bGVzID09IE5VTEwpIHsKLQlmcHJpbnRmKHN0ZGVyciwgIk91Y2ghICBPdXQgb2YgbWVtb3J5IGluIGFwX3NldHVwX3ByZWxpbmtlZF9tb2R1bGVzKCkhXG4iKTsKLSAgICB9Ci0gICAgZm9yIChtID0gYXBfcHJlbG9hZGVkX21vZHVsZXMsIG0yID0gYXBfbG9hZGVkX21vZHVsZXM7ICptICE9IE5VTEw7ICkKLSAgICAgICAgKm0yKysgPSAqbSsrOwotICAgICptMiA9IE5VTEw7Ci0KLSAgICAvKgotICAgICAqICAgSW5pdGlhbGl6ZSBjaGFpbiBvZiBsaW5rZWQgKD1hY3RpdmF0ZSkgbW9kdWxlcwotICAgICAqLwotICAgIGZvciAobSA9IGFwX3ByZWxpbmtlZF9tb2R1bGVzOyAqbSAhPSBOVUxMOyBtKyspCi0gICAgICAgIGFwX2FkZF9tb2R1bGUoKm0pOwotfQotCi1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfZmluZF9tb2R1bGVfbmFtZShtb2R1bGUgKm0pCi17Ci0gICAgcmV0dXJuIG0tPm5hbWU7Ci19Ci0KLUFQSV9FWFBPUlQobW9kdWxlICopIGFwX2ZpbmRfbGlua2VkX21vZHVsZShjb25zdCBjaGFyICpuYW1lKQotewotICAgIG1vZHVsZSAqbW9kcDsKLQotICAgIGZvciAobW9kcCA9IHRvcF9tb2R1bGU7IG1vZHA7IG1vZHAgPSBtb2RwLT5uZXh0KSB7Ci0JaWYgKHN0cmNtcChtb2RwLT5uYW1lLCBuYW1lKSA9PSAwKQotCSAgICByZXR1cm4gbW9kcDsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEFkZCBhIG5hbWVkIG1vZHVsZS4gIFJldHVybnMgMSBpZiBtb2R1bGUgZm91bmQsIDAgb3RoZXJ3aXNlLiAgKi8KLUFQSV9FWFBPUlQoaW50KSBhcF9hZGRfbmFtZWRfbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgbW9kdWxlICptb2RwOwotICAgIGludCBpID0gMDsKLQotICAgIGZvciAobW9kcCA9IGFwX2xvYWRlZF9tb2R1bGVzW2ldOyBtb2RwOyBtb2RwID0gYXBfbG9hZGVkX21vZHVsZXNbKytpXSkgewotCWlmIChzdHJjbXAobW9kcC0+bmFtZSwgbmFtZSkgPT0gMCkgewotCSAgICAvKiBPbmx5IGFkZCBtb2R1bGVzIHRoYXQgYXJlIG5vdCBhbHJlYWR5IGVuYWJsZWQuICAqLwotCSAgICBpZiAobW9kcC0+bmV4dCA9PSBOVUxMKSB7Ci0JCWFwX2FkZF9tb2R1bGUobW9kcCk7Ci0JICAgIH0KLQkgICAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0vKiBDbGVhciB0aGUgaW50ZXJuYWwgbGlzdCBvZiBtb2R1bGVzLCBpbiBwcmVwYXJhdGlvbiBmb3Igc3RhcnRpbmcgb3Zlci4gKi8KLUFQSV9FWFBPUlQodm9pZCkgYXBfY2xlYXJfbW9kdWxlX2xpc3QoKQotewotICAgIG1vZHVsZSAqKm0gPSAmdG9wX21vZHVsZTsKLSAgICBtb2R1bGUgKipuZXh0X207Ci0KLSAgICB3aGlsZSAoKm0pIHsKLQluZXh0X20gPSAmKCgqbSktPm5leHQpOwotCSptID0gTlVMTDsKLQltID0gbmV4dF9tOwotICAgIH0KLQotICAgIC8qIFRoaXMgaXMgcmVxdWlyZWQ7IHNvIHdlIGFkZCBpdCBhbHdheXMuICAqLwotICAgIGFwX2FkZF9uYW1lZF9tb2R1bGUoImh0dHBfY29yZS5jIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFJlc291cmNlLCBhY2Nlc3MsIGFuZCAuaHRhY2Nlc3MgY29uZmlnIGZpbGVzIG5vdyBwYXJzZWQgYnkgYSBjb21tb24KLSAqIGNvbW1hbmQgbG9vcC4KLSAqCi0gKiBMZXQncyBiZWdpbiB3aXRoIHRoZSBiYXNpY3M7IHBhcnNpbmcgdGhlIGxpbmUgYW5kCi0gKiBpbnZva2luZyB0aGUgZnVuY3Rpb24uLi4KLSAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqaW52b2tlX2NtZChjb25zdCBjb21tYW5kX3JlYyAqY21kLCBjbWRfcGFybXMgKnBhcm1zLAotCQkJICAgIHZvaWQgKm1jb25maWcsIGNvbnN0IGNoYXIgKmFyZ3MpCi17Ci0gICAgY2hhciAqdywgKncyLCAqdzM7Ci0gICAgY29uc3QgY2hhciAqZXJybXNnOwotCi0gICAgaWYgKChwYXJtcy0+b3ZlcnJpZGUgJiBjbWQtPnJlcV9vdmVycmlkZSkgPT0gMCkKLQlyZXR1cm4gYXBfcHN0cmNhdChwYXJtcy0+cG9vbCwgY21kLT5uYW1lLCAiIG5vdCBhbGxvd2VkIGhlcmUiLCBOVUxMKTsKLQotICAgIHBhcm1zLT5pbmZvID0gY21kLT5jbWRfZGF0YTsKLSAgICBwYXJtcy0+Y21kID0gY21kOwotCi0gICAgc3dpdGNoIChjbWQtPmFyZ3NfaG93KSB7Ci0gICAgY2FzZSBSQVdfQVJHUzoKLQlyZXR1cm4gKChjb25zdCBjaGFyICooKikoY21kX3Bhcm1zICosIHZvaWQgKiwgY29uc3QgY2hhciAqKSkKLQkJKGNtZC0+ZnVuYykpIChwYXJtcywgbWNvbmZpZywgYXJncyk7Ci0KLSAgICBjYXNlIE5PX0FSR1M6Ci0JaWYgKCphcmdzICE9IDApCi0JICAgIHJldHVybiBhcF9wc3RyY2F0KHBhcm1zLT5wb29sLCBjbWQtPm5hbWUsICIgdGFrZXMgbm8gYXJndW1lbnRzIiwKLQkJCSAgIE5VTEwpOwotCi0JcmV0dXJuICgoY29uc3QgY2hhciAqKCopKGNtZF9wYXJtcyAqLCB2b2lkICopKQotCQkoY21kLT5mdW5jKSkgKHBhcm1zLCBtY29uZmlnKTsKLQotICAgIGNhc2UgVEFLRTE6Ci0JdyA9IGFwX2dldHdvcmRfY29uZihwYXJtcy0+cG9vbCwgJmFyZ3MpOwotCi0JaWYgKCp3ID09ICdcMCcgfHwgKmFyZ3MgIT0gMCkKLQkgICAgcmV0dXJuIGFwX3BzdHJjYXQocGFybXMtPnBvb2wsIGNtZC0+bmFtZSwgIiB0YWtlcyBvbmUgYXJndW1lbnQiLAotCQkJICAgIGNtZC0+ZXJybXNnID8gIiwgIiA6IE5VTEwsIGNtZC0+ZXJybXNnLCBOVUxMKTsKLQotCXJldHVybiAoKGNvbnN0IGNoYXIgKigqKShjbWRfcGFybXMgKiwgdm9pZCAqLCBjb25zdCBjaGFyICopKQotCQkoY21kLT5mdW5jKSkgKHBhcm1zLCBtY29uZmlnLCB3KTsKLQotICAgIGNhc2UgVEFLRTI6Ci0KLQl3ID0gYXBfZ2V0d29yZF9jb25mKHBhcm1zLT5wb29sLCAmYXJncyk7Ci0JdzIgPSBhcF9nZXR3b3JkX2NvbmYocGFybXMtPnBvb2wsICZhcmdzKTsKLQotCWlmICgqdyA9PSAnXDAnIHx8ICp3MiA9PSAnXDAnIHx8ICphcmdzICE9IDApCi0JICAgIHJldHVybiBhcF9wc3RyY2F0KHBhcm1zLT5wb29sLCBjbWQtPm5hbWUsICIgdGFrZXMgdHdvIGFyZ3VtZW50cyIsCi0JCQkgICAgY21kLT5lcnJtc2cgPyAiLCAiIDogTlVMTCwgY21kLT5lcnJtc2csIE5VTEwpOwotCi0JcmV0dXJuICgoY29uc3QgY2hhciAqKCopKGNtZF9wYXJtcyAqLCB2b2lkICosIGNvbnN0IGNoYXIgKiwKLQkJCWNvbnN0IGNoYXIgKikpIChjbWQtPmZ1bmMpKSAocGFybXMsIG1jb25maWcsIHcsIHcyKTsKLQotICAgIGNhc2UgVEFLRTEyOgotCi0JdyA9IGFwX2dldHdvcmRfY29uZihwYXJtcy0+cG9vbCwgJmFyZ3MpOwotCXcyID0gYXBfZ2V0d29yZF9jb25mKHBhcm1zLT5wb29sLCAmYXJncyk7Ci0KLQlpZiAoKncgPT0gJ1wwJyB8fCAqYXJncyAhPSAwKQotCSAgICByZXR1cm4gYXBfcHN0cmNhdChwYXJtcy0+cG9vbCwgY21kLT5uYW1lLCAiIHRha2VzIDEtMiBhcmd1bWVudHMiLAotCQkJICAgIGNtZC0+ZXJybXNnID8gIiwgIiA6IE5VTEwsIGNtZC0+ZXJybXNnLCBOVUxMKTsKLQotCXJldHVybiAoKGNvbnN0IGNoYXIgKigqKShjbWRfcGFybXMgKiwgdm9pZCAqLCBjb25zdCBjaGFyICosCi0JCQkgICAgY29uc3QgY2hhciAqKSkgKGNtZC0+ZnVuYykpIChwYXJtcywgbWNvbmZpZywgdywKLQkJCQkJCQkgICAgKncyID8gdzIgOiBOVUxMKTsKLQotICAgIGNhc2UgVEFLRTM6Ci0KLQl3ID0gYXBfZ2V0d29yZF9jb25mKHBhcm1zLT5wb29sLCAmYXJncyk7Ci0JdzIgPSBhcF9nZXR3b3JkX2NvbmYocGFybXMtPnBvb2wsICZhcmdzKTsKLQl3MyA9IGFwX2dldHdvcmRfY29uZihwYXJtcy0+cG9vbCwgJmFyZ3MpOwotCi0JaWYgKCp3ID09ICdcMCcgfHwgKncyID09ICdcMCcgfHwgKnczID09ICdcMCcgfHwgKmFyZ3MgIT0gMCkKLQkgICAgcmV0dXJuIGFwX3BzdHJjYXQocGFybXMtPnBvb2wsIGNtZC0+bmFtZSwgIiB0YWtlcyB0aHJlZSBhcmd1bWVudHMiLAotCQkJICAgIGNtZC0+ZXJybXNnID8gIiwgIiA6IE5VTEwsIGNtZC0+ZXJybXNnLCBOVUxMKTsKLQotCXJldHVybiAoKGNvbnN0IGNoYXIgKigqKShjbWRfcGFybXMgKiwgdm9pZCAqLCBjb25zdCBjaGFyICosCi0JCQkgICAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKSAoY21kLT5mdW5jKSkgKHBhcm1zLAotCQkJCQkJCW1jb25maWcsIHcsIHcyLCB3Myk7Ci0KLSAgICBjYXNlIFRBS0UyMzoKLQotCXcgPSBhcF9nZXR3b3JkX2NvbmYocGFybXMtPnBvb2wsICZhcmdzKTsKLQl3MiA9IGFwX2dldHdvcmRfY29uZihwYXJtcy0+cG9vbCwgJmFyZ3MpOwotCXczID0gKmFyZ3MgPyBhcF9nZXR3b3JkX2NvbmYocGFybXMtPnBvb2wsICZhcmdzKSA6IE5VTEw7Ci0KLQlpZiAoKncgPT0gJ1wwJyB8fCAqdzIgPT0gJ1wwJyB8fCAqYXJncyAhPSAwKQotCSAgICByZXR1cm4gYXBfcHN0cmNhdChwYXJtcy0+cG9vbCwgY21kLT5uYW1lLAotCQkJICAgICIgdGFrZXMgdHdvIG9yIHRocmVlIGFyZ3VtZW50cyIsCi0JCQkgICAgY21kLT5lcnJtc2cgPyAiLCAiIDogTlVMTCwgY21kLT5lcnJtc2csIE5VTEwpOwotCi0JcmV0dXJuICgoY29uc3QgY2hhciAqKCopKGNtZF9wYXJtcyAqLCB2b2lkICosIGNvbnN0IGNoYXIgKiwKLQkJCSAgICBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpIChjbWQtPmZ1bmMpKSAocGFybXMsCi0JCQkJCQkJbWNvbmZpZywgdywgdzIsIHczKTsKLQotICAgIGNhc2UgVEFLRTEyMzoKLQotCXcgPSBhcF9nZXR3b3JkX2NvbmYocGFybXMtPnBvb2wsICZhcmdzKTsKLQl3MiA9ICphcmdzID8gYXBfZ2V0d29yZF9jb25mKHBhcm1zLT5wb29sLCAmYXJncykgOiBOVUxMOwotCXczID0gKmFyZ3MgPyBhcF9nZXR3b3JkX2NvbmYocGFybXMtPnBvb2wsICZhcmdzKSA6IE5VTEw7Ci0KLQlpZiAoKncgPT0gJ1wwJyB8fCAqYXJncyAhPSAwKQotCSAgICByZXR1cm4gYXBfcHN0cmNhdChwYXJtcy0+cG9vbCwgY21kLT5uYW1lLAotCQkJICAgICIgdGFrZXMgb25lLCB0d28gb3IgdGhyZWUgYXJndW1lbnRzIiwKLQkJCSAgICBjbWQtPmVycm1zZyA/ICIsICIgOiBOVUxMLCBjbWQtPmVycm1zZywgTlVMTCk7Ci0KLQlyZXR1cm4gKChjb25zdCBjaGFyICooKikoY21kX3Bhcm1zICosIHZvaWQgKiwgY29uc3QgY2hhciAqLAotCQkJICAgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSkgKGNtZC0+ZnVuYykpIChwYXJtcywKLQkJCQkJCQltY29uZmlnLCB3LCB3MiwgdzMpOwotCi0gICAgY2FzZSBUQUtFMTM6Ci0KLQl3ID0gYXBfZ2V0d29yZF9jb25mKHBhcm1zLT5wb29sLCAmYXJncyk7Ci0JdzIgPSAqYXJncyA/IGFwX2dldHdvcmRfY29uZihwYXJtcy0+cG9vbCwgJmFyZ3MpIDogTlVMTDsKLQl3MyA9ICphcmdzID8gYXBfZ2V0d29yZF9jb25mKHBhcm1zLT5wb29sLCAmYXJncykgOiBOVUxMOwotCi0JaWYgKCp3ID09ICdcMCcgfHwgKCp3MiAmJiAhdzMpIHx8ICphcmdzICE9IDApCi0JICAgIHJldHVybiBhcF9wc3RyY2F0KHBhcm1zLT5wb29sLCBjbWQtPm5hbWUsCi0JCQkgICAgIiB0YWtlcyBvbmUgb3IgdGhyZWUgYXJndW1lbnRzIiwKLQkJCSAgICBjbWQtPmVycm1zZyA/ICIsICIgOiBOVUxMLCBjbWQtPmVycm1zZywgTlVMTCk7Ci0KLQlyZXR1cm4gKChjb25zdCBjaGFyICooKikoY21kX3Bhcm1zICosIHZvaWQgKiwgY29uc3QgY2hhciAqLAotCQkJICAgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSkgKGNtZC0+ZnVuYykpIChwYXJtcywKLQkJCQkJCQltY29uZmlnLCB3LCB3MiwgdzMpOwotCi0gICAgY2FzZSBJVEVSQVRFOgotCi0Jd2hpbGUgKCoodyA9IGFwX2dldHdvcmRfY29uZihwYXJtcy0+cG9vbCwgJmFyZ3MpKSAhPSAnXDAnKQotCWlmICAgKChlcnJtc2cgPSAoKGNvbnN0IGNoYXIgKigqKShjbWRfcGFybXMgKiwgdm9pZCAqLAotCQkJY29uc3QgY2hhciAqKSkgKGNtZC0+ZnVuYykpIChwYXJtcywgbWNvbmZpZywgdykpKQotCQkgICAgcmV0dXJuIGVycm1zZzsKLQotCXJldHVybiBOVUxMOwotCi0gICAgY2FzZSBJVEVSQVRFMjoKLQotCXcgPSBhcF9nZXR3b3JkX2NvbmYocGFybXMtPnBvb2wsICZhcmdzKTsKLQotCWlmICgqdyA9PSAnXDAnIHx8ICphcmdzID09IDApCi0JICAgIHJldHVybiBhcF9wc3RyY2F0KHBhcm1zLT5wb29sLCBjbWQtPm5hbWUsCi0JCQkgICAgIiByZXF1aXJlcyBhdCBsZWFzdCB0d28gYXJndW1lbnRzIiwKLQkJCSAgICBjbWQtPmVycm1zZyA/ICIsICIgOiBOVUxMLCBjbWQtPmVycm1zZywgTlVMTCk7Ci0KLQotCXdoaWxlICgqKHcyID0gYXBfZ2V0d29yZF9jb25mKHBhcm1zLT5wb29sLCAmYXJncykpICE9ICdcMCcpCi0JICAgIGlmICAgKChlcnJtc2cgPSAoKGNvbnN0IGNoYXIgKigqKShjbWRfcGFybXMgKiwgdm9pZCAqLAotCQkJICAgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSkgKGNtZC0+ZnVuYykpIChwYXJtcywKLQkJCQkJCQkgICAgbWNvbmZpZywgdywgdzIpKSkKLQkJCXJldHVybiBlcnJtc2c7Ci0KLQlyZXR1cm4gTlVMTDsKLQotICAgIGNhc2UgRkxBRzoKLQotCXcgPSBhcF9nZXR3b3JkX2NvbmYocGFybXMtPnBvb2wsICZhcmdzKTsKLQotCWlmICgqdyA9PSAnXDAnIHx8IChzdHJjYXNlY21wKHcsICJvbiIpICYmIHN0cmNhc2VjbXAodywgIm9mZiIpKSkKLQkgICAgcmV0dXJuIGFwX3BzdHJjYXQocGFybXMtPnBvb2wsIGNtZC0+bmFtZSwgIiBtdXN0IGJlIE9uIG9yIE9mZiIsCi0JCQkgICAgTlVMTCk7Ci0KLQlyZXR1cm4gKChjb25zdCBjaGFyICooKikoY21kX3Bhcm1zICosIHZvaWQgKiwgaW50KSkKLQkJKGNtZC0+ZnVuYykpIChwYXJtcywgbWNvbmZpZywgc3RyY2FzZWNtcCh3LCAib2ZmIikgIT0gMCk7Ci0KLSAgICBkZWZhdWx0OgotCi0JcmV0dXJuIGFwX3BzdHJjYXQocGFybXMtPnBvb2wsIGNtZC0+bmFtZSwKLQkJICAgICIgaXMgaW1wcm9wZXJseSBjb25maWd1cmVkIGludGVybmFsbHkgKHNlcnZlciBidWcpIiwKLQkJCU5VTEwpOwotICAgIH0KLX0KLQotQ09SRV9FWFBPUlQoY29uc3QgY29tbWFuZF9yZWMgKikgYXBfZmluZF9jb21tYW5kKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNvbW1hbmRfcmVjICpjbWRzKQotewotICAgIHdoaWxlIChjbWRzLT5uYW1lKQotCWlmICghc3RyY2FzZWNtcChuYW1lLCBjbWRzLT5uYW1lKSkKLQkgICAgcmV0dXJuIGNtZHM7Ci0JZWxzZQotCSAgICArK2NtZHM7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotQ09SRV9FWFBPUlQoY29uc3QgY29tbWFuZF9yZWMgKikgYXBfZmluZF9jb21tYW5kX2luX21vZHVsZXMoY29uc3QgY2hhciAqY21kX25hbWUsIG1vZHVsZSAqKm1vZCkKLXsKLSAgICBjb25zdCBjb21tYW5kX3JlYyAqY21kcDsKLSAgICBtb2R1bGUgKm1vZHA7Ci0KLSAgICBmb3IgKG1vZHAgPSAqbW9kOyBtb2RwOyBtb2RwID0gbW9kcC0+bmV4dCkKLQlpZiAobW9kcC0+Y21kcyAmJiAoY21kcCA9IGFwX2ZpbmRfY29tbWFuZChjbWRfbmFtZSwgbW9kcC0+Y21kcykpKSB7Ci0JICAgICptb2QgPSBtb2RwOwotCSAgICByZXR1cm4gY21kcDsKLQl9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotQ09SRV9FWFBPUlQodm9pZCAqKSBhcF9zZXRfY29uZmlnX3ZlY3RvcnMoY21kX3Bhcm1zICpwYXJtcywgdm9pZCAqY29uZmlnLCBtb2R1bGUgKm1vZCkKLXsKLSAgICB2b2lkICptY29uZmlnID0gYXBfZ2V0X21vZHVsZV9jb25maWcoY29uZmlnLCBtb2QpOwotICAgIHZvaWQgKnNjb25maWcgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhwYXJtcy0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCBtb2QpOwotCi0gICAgaWYgKCFtY29uZmlnICYmIG1vZC0+Y3JlYXRlX2Rpcl9jb25maWcpIHsKLQltY29uZmlnID0gKCptb2QtPmNyZWF0ZV9kaXJfY29uZmlnKSAocGFybXMtPnBvb2wsIHBhcm1zLT5wYXRoKTsKLQlhcF9zZXRfbW9kdWxlX2NvbmZpZyhjb25maWcsIG1vZCwgbWNvbmZpZyk7Ci0gICAgfQotCi0gICAgaWYgKCFzY29uZmlnICYmIG1vZC0+Y3JlYXRlX3NlcnZlcl9jb25maWcpIHsKLQlzY29uZmlnID0gKCptb2QtPmNyZWF0ZV9zZXJ2ZXJfY29uZmlnKSAocGFybXMtPnBvb2wsIHBhcm1zLT5zZXJ2ZXIpOwotCWFwX3NldF9tb2R1bGVfY29uZmlnKHBhcm1zLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsIG1vZCwgc2NvbmZpZyk7Ci0gICAgfQotICAgIHJldHVybiBtY29uZmlnOwotfQotCi1DT1JFX0VYUE9SVChjb25zdCBjaGFyICopIGFwX2hhbmRsZV9jb21tYW5kKGNtZF9wYXJtcyAqcGFybXMsIHZvaWQgKmNvbmZpZywgY29uc3QgY2hhciAqbCkKLXsKLSAgICB2b2lkICpvbGRjb25maWc7Ci0gICAgY29uc3QgY2hhciAqYXJncywgKmNtZF9uYW1lLCAqcmV0dmFsOwotICAgIGNvbnN0IGNvbW1hbmRfcmVjICpjbWQ7Ci0gICAgbW9kdWxlICptb2QgPSB0b3BfbW9kdWxlOwotCi0gICAgaWYgKChsWzBdID09ICcjJykgfHwgKCFsWzBdKSkKLQlyZXR1cm4gTlVMTDsKLQotICAgIGFyZ3MgPSBsOwotICAgIGNtZF9uYW1lID0gYXBfZ2V0d29yZF9jb25mKHBhcm1zLT50ZW1wX3Bvb2wsICZhcmdzKTsKLSAgICBpZiAoKmNtZF9uYW1lID09ICdcMCcpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICBvbGRjb25maWcgPSBwYXJtcy0+Y29udGV4dDsKLSAgICBwYXJtcy0+Y29udGV4dCA9IGNvbmZpZzsKLSAgICBkbyB7Ci0JaWYgKCEoY21kID0gYXBfZmluZF9jb21tYW5kX2luX21vZHVsZXMoY21kX25hbWUsICZtb2QpKSkgewotICAgICAgICAgICAgZXJybm8gPSBFSU5WQUw7Ci0gICAgICAgICAgICByZXR1cm4gYXBfcHN0cmNhdChwYXJtcy0+cG9vbCwgIkludmFsaWQgY29tbWFuZCAnIiwgY21kX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiJywgcGVyaGFwcyBtaXMtc3BlbGxlZCBvciBkZWZpbmVkIGJ5IGEgbW9kdWxlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgaW5jbHVkZWQgaW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIiwgTlVMTCk7Ci0JfQotCWVsc2UgewotCSAgICB2b2lkICptY29uZmlnID0gYXBfc2V0X2NvbmZpZ192ZWN0b3JzKHBhcm1zLGNvbmZpZywgbW9kKTsKLQotCSAgICByZXR2YWwgPSBpbnZva2VfY21kKGNtZCwgcGFybXMsIG1jb25maWcsIGFyZ3MpOwotCSAgICBtb2QgPSBtb2QtPm5leHQ7CS8qIE5leHQgdGltZSBhcm91bmQsIHNraXAgdGhpcyBvbmUgKi8KLQl9Ci0gICAgfSB3aGlsZSAocmV0dmFsICYmICFzdHJjbXAocmV0dmFsLCBERUNMSU5FX0NNRCkpOwotICAgIHBhcm1zLT5jb250ZXh0ID0gb2xkY29uZmlnOwotCi0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotQVBJX0VYUE9SVChjb25zdCBjaGFyICopIGFwX3NybV9jb21tYW5kX2xvb3AoY21kX3Bhcm1zICpwYXJtcywgdm9pZCAqY29uZmlnKQotewotICAgIGNoYXIgbFtNQVhfU1RSSU5HX0xFTl07Ci0KLSAgICB3aGlsZSAoIShhcF9jZmdfZ2V0bGluZShsLCBNQVhfU1RSSU5HX0xFTiwgcGFybXMtPmNvbmZpZ19maWxlKSkpIHsKLQljb25zdCBjaGFyICplcnJtc2cgPSBhcF9oYW5kbGVfY29tbWFuZChwYXJtcywgY29uZmlnLCBsKTsKLSAgICAgICAgaWYgKGVycm1zZykgewotCSAgICByZXR1cm4gZXJybXNnOwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIEdlbmVyaWMgY29tbWFuZCBmdW5jdGlvbnMuLi4KLSAqLwotCi1BUElfRVhQT1JUX05PTlNURChjb25zdCBjaGFyICopIGFwX3NldF9zdHJpbmdfc2xvdChjbWRfcGFybXMgKmNtZCwKLQkJCQkJCWNoYXIgKnN0cnVjdF9wdHIsIGNoYXIgKmFyZykKLXsKLSAgICAvKiBUaGlzIG9uZSdzIHByZXR0eSBnZW5lcmljLi4uICovCi0KLSAgICBpbnQgb2Zmc2V0ID0gKGludCkgKGxvbmcpIGNtZC0+aW5mbzsKLSAgICAqKGNoYXIgKiopIChzdHJ1Y3RfcHRyICsgb2Zmc2V0KSA9IGFyZzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotQVBJX0VYUE9SVF9OT05TVEQoY29uc3QgY2hhciAqKSBhcF9zZXRfc3RyaW5nX3Nsb3RfbG93ZXIoY21kX3Bhcm1zICpjbWQsCi0JCQkJCQljaGFyICpzdHJ1Y3RfcHRyLCBjaGFyICphcmcpCi17Ci0gICAgLyogVGhpcyBvbmUncyBwcmV0dHkgZ2VuZXJpYy4uLiAqLwotCi0gICAgaW50IG9mZnNldCA9IChpbnQpIChsb25nKSBjbWQtPmluZm87Ci0gICAgYXBfc3RyX3RvbG93ZXIoYXJnKTsKLSAgICAqKGNoYXIgKiopIChzdHJ1Y3RfcHRyICsgb2Zmc2V0KSA9IGFyZzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotQVBJX0VYUE9SVF9OT05TVEQoY29uc3QgY2hhciAqKSBhcF9zZXRfZmxhZ19zbG90KGNtZF9wYXJtcyAqY21kLAotCQkJCQkgICAgICBjaGFyICpzdHJ1Y3RfcHRyLCBpbnQgYXJnKQotewotICAgIC8qIFRoaXMgb25lJ3MgcHJldHR5IGdlbmVyaWMgdG9vLi4uICovCi0KLSAgICBpbnQgb2Zmc2V0ID0gKGludCkgKGxvbmcpIGNtZC0+aW5mbzsKLSAgICAqKGludCAqKSAoc3RydWN0X3B0ciArIG9mZnNldCkgPSBhcmcgPyAxIDogMDsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotQVBJX0VYUE9SVF9OT05TVEQoY29uc3QgY2hhciAqKSBhcF9zZXRfZmlsZV9zbG90KGNtZF9wYXJtcyAqY21kLCBjaGFyICpzdHJ1Y3RfcHRyLCBjaGFyICphcmcpCi17Ci0gICAgLyogUHJlcGVuZCBzZXJ2ZXJfcm9vdCB0byByZWxhdGl2ZSBhcmcuCi0gICAgICAgVGhpcyBhbGxvd3MgLmh0YWNjZXNzIHRvIGJlIGluZGVwZW5kZW50IG9mIHNlcnZlcl9yb290LAotICAgICAgIHNvIHRoZSBzZXJ2ZXIgY2FuIGJlIG1vdmVkIG9yIG1pcnJvcmVkIHdpdGggbGVzcyBwYWluLiAgKi8KLSAgICBjaGFyICpwOwotICAgIGludCBvZmZzZXQgPSAoaW50KSAobG9uZykgY21kLT5pbmZvOwotICAgIGlmIChhcF9vc19pc19wYXRoX2Fic29sdXRlKGFyZykpCi0JcCA9IGFyZzsKLSAgICBlbHNlCi0JcCA9IGFwX21ha2VfZnVsbF9wYXRoKGNtZC0+cG9vbCwgYXBfc2VydmVyX3Jvb3QsIGFyZyk7Ci0gICAgKihjaGFyICoqKSAoc3RydWN0X3B0ciArIG9mZnNldCkgPSBwOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBSZWFkaW5nIHdob2xlIGNvbmZpZyBmaWxlcy4uLgotICovCi0KLXN0YXRpYyBjbWRfcGFybXMgZGVmYXVsdF9wYXJtcyA9Ci17TlVMTCwgMCwgLTEsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEx9OwotCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocG9vbCAqcCwgY2hhciAqZmlsZSkKLXsKLSAgICBpZihhcF9vc19pc19wYXRoX2Fic29sdXRlKGZpbGUpKQotCXJldHVybiBmaWxlOwotICAgIHJldHVybiBhcF9tYWtlX2Z1bGxfcGF0aChwLCBhcF9zZXJ2ZXJfcm9vdCwgZmlsZSk7Ci19Ci0KLQotLyogVGhpcyBzdHJ1Y3R1cmUgYW5kIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBuZWVkZWQgZm9yIHRoZQotICogdGFibGUtYmFzZWQgY29uZmlnIGZpbGUgcmVhZGluZy4gVGhleSBhcmUgcGFzc2VkIHRvIHRoZQotICogY2ZnX29wZW5fY3VzdG9tKCkgcm91dGluZS4KLSAqLwotCi0vKiBTdHJ1Y3R1cmUgdG8gYmUgcGFzc2VkIHRvIGNmZ19vcGVuX2N1c3RvbSgpOiBpdCBjb250YWlucyBhbgotICogaW5kZXggd2hpY2ggaXMgaW5jcmVtZW50ZWQgZnJvbSAwIHRvIG5lbHRzIG9uIGVhY2ggY2FsbCB0bwotICogY2ZnX2dldGxpbmUoKSAod2hpY2ggaW4gdHVybiBjYWxscyBhcnJfZWx0c19nZXRzdHIoKSkKLSAqIGFuZCBhbiBhcnJheV9oZWFkZXIgcG9pbnRlciBmb3IgdGhlIHN0cmluZyBhcnJheS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGFycmF5X2hlYWRlciAqYXJyYXk7Ci0gICAgaW50IGN1cnJfaWR4OwotfSBhcnJfZWx0c19wYXJhbV90OwotCi0KLS8qIGFycl9lbHRzX2dldHN0cigpIHJldHVybnMgdGhlIG5leHQgbGluZSBmcm9tIHRoZSBzdHJpbmcgYXJyYXkuICovCi1zdGF0aWMgdm9pZCAqYXJyX2VsdHNfZ2V0c3RyKHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1ZnNpeiwgdm9pZCAqcGFyYW0pCi17Ci0gICAgYXJyX2VsdHNfcGFyYW1fdCAqYXJyX3BhcmFtID0gKGFycl9lbHRzX3BhcmFtX3QgKikgcGFyYW07Ci0KLSAgICAvKiBFbmQgb2YgYXJyYXkgcmVhY2hlZD8gKi8KLSAgICBpZiAoKythcnJfcGFyYW0tPmN1cnJfaWR4ID4gYXJyX3BhcmFtLT5hcnJheS0+bmVsdHMpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgLyogcmV0dXJuIHRoZSBsaW5lICovCi0gICAgYXBfY3B5c3RybihidWYsICgoY2hhciAqKikgYXJyX3BhcmFtLT5hcnJheS0+ZWx0cylbYXJyX3BhcmFtLT5jdXJyX2lkeCAtIDFdLCBidWZzaXopOwotCi0gICAgcmV0dXJuIGJ1ZjsKLX0KLQotCi0vKiBhcnJfZWx0c19jbG9zZSgpOiBkdW1teSBjbG9zZSByb3V0aW5lIChtYWtlcyBzdXJlIG5vIG1vcmUgbGluZXMgY2FuIGJlIHJlYWQpICovCi1zdGF0aWMgaW50IGFycl9lbHRzX2Nsb3NlKHZvaWQgKnBhcmFtKQotewotICAgIGFycl9lbHRzX3BhcmFtX3QgKmFycl9wYXJhbSA9IChhcnJfZWx0c19wYXJhbV90ICopIHBhcmFtOwotICAgIGFycl9wYXJhbS0+Y3Vycl9pZHggPSBhcnJfcGFyYW0tPmFycmF5LT5uZWx0czsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcHJvY2Vzc19jb21tYW5kX2NvbmZpZyhzZXJ2ZXJfcmVjICpzLCBhcnJheV9oZWFkZXIgKmFyciwgcG9vbCAqcCwKLQkJCQkgICAgcG9vbCAqcHRlbXApCi17Ci0gICAgY29uc3QgY2hhciAqZXJybXNnOwotICAgIGNtZF9wYXJtcyBwYXJtczsKLSAgICBhcnJfZWx0c19wYXJhbV90IGFycl9wYXJtczsKLQotICAgIGFycl9wYXJtcy5jdXJyX2lkeCA9IDA7Ci0gICAgYXJyX3Bhcm1zLmFycmF5ID0gYXJyOwotCi0gICAgcGFybXMgPSBkZWZhdWx0X3Bhcm1zOwotICAgIHBhcm1zLnBvb2wgPSBwOwotICAgIHBhcm1zLnRlbXBfcG9vbCA9IHB0ZW1wOwotICAgIHBhcm1zLnNlcnZlciA9IHM7Ci0gICAgcGFybXMub3ZlcnJpZGUgPSAoUlNSQ19DT05GIHwgT1JfQUxMKSAmIH4oT1JfQVVUSENGRyB8IE9SX0xJTUlUKTsKLSAgICBwYXJtcy5jb25maWdfZmlsZSA9IGFwX3BjZmdfb3Blbl9jdXN0b20ocCwgIi1jLy1DIGRpcmVjdGl2ZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJyX3Bhcm1zLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJfZWx0c19nZXRzdHIsIGFycl9lbHRzX2Nsb3NlKTsKLQotICAgIGVycm1zZyA9IGFwX3NybV9jb21tYW5kX2xvb3AoJnBhcm1zLCBzLT5sb29rdXBfZGVmYXVsdHMpOwotCi0gICAgaWYgKGVycm1zZykgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlN5bnRheCBlcnJvciBpbiAtQy8tYyBkaXJlY3RpdmU6XG4lc1xuIiwgZXJybXNnKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBhcF9jZmdfY2xvc2VmaWxlKHBhcm1zLmNvbmZpZ19maWxlKTsKLX0KLQotdm9pZCBhcF9wcm9jZXNzX3Jlc291cmNlX2NvbmZpZyhzZXJ2ZXJfcmVjICpzLCBjaGFyICpmbmFtZSwgcG9vbCAqcCwgcG9vbCAqcHRlbXApCi17Ci0gICAgY29uc3QgY2hhciAqZXJybXNnOwotICAgIGNtZF9wYXJtcyBwYXJtczsKLSAgICBzdHJ1Y3Qgc3RhdCBmaW5mbzsKLQotICAgIGZuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocCwgZm5hbWUpOwotCi0gICAgaWYgKCEoc3RyY21wKGZuYW1lLCBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShwLCBSRVNPVVJDRV9DT05GSUdfRklMRSkpKSB8fAotCSEoc3RyY21wKGZuYW1lLCBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShwLCBBQ0NFU1NfQ09ORklHX0ZJTEUpKSkpIHsKLQlpZiAoc3RhdChmbmFtZSwgJmZpbmZvKSA9PSAtMSkKLQkgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIGRvbid0IHJlcXVpcmUgY29uZi9odHRwZC5jb25mIGlmIHdlIGhhdmUgYSAtQyBvciAtYyBzd2l0Y2ggKi8KLSAgICBpZigoYXBfc2VydmVyX3ByZV9yZWFkX2NvbmZpZy0+bmVsdHMgfHwgYXBfc2VydmVyX3Bvc3RfcmVhZF9jb25maWctPm5lbHRzKSAmJgotICAgICAgICEoc3RyY21wKGZuYW1lLCBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShwLCBTRVJWRVJfQ09ORklHX0ZJTEUpKSkpIHsKLQlpZiAoc3RhdChmbmFtZSwgJmZpbmZvKSA9PSAtMSkKLQkgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIEdDQydzIGluaXRpYWxpemF0aW9uIGV4dGVuc2lvbnMgYXJlIHNvb29vIG5pY2UgaGVyZS4uLiAqLwotCi0gICAgcGFybXMgPSBkZWZhdWx0X3Bhcm1zOwotICAgIHBhcm1zLnBvb2wgPSBwOwotICAgIHBhcm1zLnRlbXBfcG9vbCA9IHB0ZW1wOwotICAgIHBhcm1zLnNlcnZlciA9IHM7Ci0gICAgcGFybXMub3ZlcnJpZGUgPSAoUlNSQ19DT05GIHwgT1JfQUxMKSAmIH4oT1JfQVVUSENGRyB8IE9SX0xJTUlUKTsKLQotICAgIGlmICghKHBhcm1zLmNvbmZpZ19maWxlID0gYXBfcGNmZ19vcGVuZmlsZShwLGZuYW1lKSkpIHsKLQlwZXJyb3IoImZvcGVuIik7Ci0JZnByaW50ZihzdGRlcnIsICIlczogY291bGQgbm90IG9wZW4gZG9jdW1lbnQgY29uZmlnIGZpbGUgJXNcbiIsCi0JCWFwX3NlcnZlcl9hcmd2MCwgZm5hbWUpOwotCWV4aXQoMSk7Ci0gICAgfQotCi0gICAgZXJybXNnID0gYXBfc3JtX2NvbW1hbmRfbG9vcCgmcGFybXMsIHMtPmxvb2t1cF9kZWZhdWx0cyk7Ci0KLSAgICBpZiAoZXJybXNnKSB7Ci0JZnByaW50ZihzdGRlcnIsICJTeW50YXggZXJyb3Igb24gbGluZSAlZCBvZiAlczpcbiIsCi0JCXBhcm1zLmNvbmZpZ19maWxlLT5saW5lX251bWJlciwgcGFybXMuY29uZmlnX2ZpbGUtPm5hbWUpOwotCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGVycm1zZyk7Ci0JZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBhcF9jZmdfY2xvc2VmaWxlKHBhcm1zLmNvbmZpZ19maWxlKTsKLX0KLQotCi1pbnQgYXBfcGFyc2VfaHRhY2Nlc3Modm9pZCAqKnJlc3VsdCwgcmVxdWVzdF9yZWMgKnIsIGludCBvdmVycmlkZSwKLQkJICAgY29uc3QgY2hhciAqZCwgY29uc3QgY2hhciAqYWNjZXNzX25hbWUpCi17Ci0gICAgY29uZmlnZmlsZV90ICpmID0gTlVMTDsKLSAgICBjbWRfcGFybXMgcGFybXM7Ci0gICAgY29uc3QgY2hhciAqZXJybXNnOwotICAgIGNoYXIgKmZpbGVuYW1lID0gTlVMTDsKLSAgICBjb25zdCBzdHJ1Y3QgaHRhY2Nlc3NfcmVzdWx0ICpjYWNoZTsKLSAgICBzdHJ1Y3QgaHRhY2Nlc3NfcmVzdWx0ICpuZXc7Ci0gICAgdm9pZCAqZGMgPSBOVUxMOwotCi0vKiBmaXJzdGx5LCBzZWFyY2ggY2FjaGUgKi8KLSAgICBmb3IgKGNhY2hlID0gci0+aHRhY2Nlc3M7IGNhY2hlICE9IE5VTEw7IGNhY2hlID0gY2FjaGUtPm5leHQpCi0JaWYgKGNhY2hlLT5vdmVycmlkZSA9PSBvdmVycmlkZSAmJiBzdHJjbXAoY2FjaGUtPmRpciwgZCkgPT0gMCkgewotCSAgICBpZiAoY2FjaGUtPmh0YWNjZXNzICE9IE5VTEwpCi0JCSpyZXN1bHQgPSBjYWNoZS0+aHRhY2Nlc3M7Ci0JICAgIHJldHVybiBPSzsKLQl9Ci0KLSAgICBwYXJtcyA9IGRlZmF1bHRfcGFybXM7Ci0gICAgcGFybXMub3ZlcnJpZGUgPSBvdmVycmlkZTsKLSAgICBwYXJtcy5wb29sID0gci0+cG9vbDsKLSAgICBwYXJtcy50ZW1wX3Bvb2wgPSByLT5wb29sOwotICAgIHBhcm1zLnNlcnZlciA9IHItPnNlcnZlcjsKLSAgICBwYXJtcy5wYXRoID0gYXBfcHN0cmR1cChyLT5wb29sLCBkKTsKLQotICAgIC8qIGxvb3AgdGhyb3VnaCB0aGUgYWNjZXNzIG5hbWVzIGFuZCBmaW5kIHRoZSBmaXJzdCBvbmUgKi8KLQotICAgIHdoaWxlIChhY2Nlc3NfbmFtZVswXSkgewotICAgICAgICBmaWxlbmFtZSA9IGFwX21ha2VfZnVsbF9wYXRoKHItPnBvb2wsIGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfZ2V0d29yZF9jb25mKHItPnBvb2wsICZhY2Nlc3NfbmFtZSkpOwotCi0gICAgICAgIGlmICgoZiA9IGFwX3BjZmdfb3BlbmZpbGUoci0+cG9vbCwgZmlsZW5hbWUpKSAhPSBOVUxMKSB7Ci0KLSAgICAgICAgICAgIGRjID0gYXBfY3JlYXRlX3Blcl9kaXJfY29uZmlnKHItPnBvb2wpOwotCi0gICAgICAgICAgICBwYXJtcy5jb25maWdfZmlsZSA9IGY7Ci0KLSAgICAgICAgICAgIGVycm1zZyA9IGFwX3NybV9jb21tYW5kX2xvb3AoJnBhcm1zLCBkYyk7Ci0KLSAgICAgICAgICAgIGFwX2NmZ19jbG9zZWZpbGUoZik7Ci0KLSAgICAgICAgICAgIGlmIChlcnJtc2cpIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0FMRVJUfEFQTE9HX05PRVJSTk8sIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVzIiwgZmlsZW5hbWUsIGVycm1zZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKnJlc3VsdCA9IGRjOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZXJybm8gIT0gRU5PRU5UICYmIGVycm5vICE9IEVOT1RESVIpIHsKLSAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQ1JJVCwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIHBjZmdfb3BlbmZpbGU6IHVuYWJsZSB0byBjaGVjayBodGFjY2VzcyBmaWxlLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJlbnN1cmUgaXQgaXMgcmVhZGFibGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSk7Ci0gICAgICAgICAgICBhcF90YWJsZV9zZXRuKHItPm5vdGVzLCAiZXJyb3Itbm90ZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmVyIHVuYWJsZSB0byByZWFkIGh0YWNjZXNzIGZpbGUsIGRlbnlpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiYWNjZXNzIHRvIGJlIHNhZmUiKTsKLSAgICAgICAgICAgIHJldHVybiBIVFRQX0ZPUkJJRERFTjsKLSAgICAgICAgfQotICAgIH0KLQotLyogY2FjaGUgaXQgKi8KLSAgICBuZXcgPSBhcF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKHN0cnVjdCBodGFjY2Vzc19yZXN1bHQpKTsKLSAgICBuZXctPmRpciA9IHBhcm1zLnBhdGg7Ci0gICAgbmV3LT5vdmVycmlkZSA9IG92ZXJyaWRlOwotICAgIG5ldy0+aHRhY2Nlc3MgPSBkYzsKLS8qIGFkZCB0byBoZWFkIG9mIGxpc3QgKi8KLSAgICBuZXctPm5leHQgPSByLT5odGFjY2VzczsKLSAgICByLT5odGFjY2VzcyA9IG5ldzsKLQotICAgIHJldHVybiBPSzsKLX0KLQotCi1DT1JFX0VYUE9SVChjb25zdCBjaGFyICopIGFwX2luaXRfdmlydHVhbF9ob3N0KHBvb2wgKnAsIGNvbnN0IGNoYXIgKmhvc3RuYW1lLAotCQkJICAgICAgc2VydmVyX3JlYyAqbWFpbl9zZXJ2ZXIsIHNlcnZlcl9yZWMgKipwcykKLXsKLSAgICBzZXJ2ZXJfcmVjICpzID0gKHNlcnZlcl9yZWMgKikgYXBfcGNhbGxvYyhwLCBzaXplb2Yoc2VydmVyX3JlYykpOwotCi0jaWZkZWYgUkxJTUlUX05PRklMRQotICAgIHN0cnVjdCBybGltaXQgbGltaXRzOwotCi0gICAgZ2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUsICZsaW1pdHMpOwotICAgIGlmIChsaW1pdHMucmxpbV9jdXIgPCBsaW1pdHMucmxpbV9tYXgpIHsKLQlsaW1pdHMucmxpbV9jdXIgKz0gMjsKLQlpZiAoc2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUsICZsaW1pdHMpIDwgMCkgewotCSAgICBwZXJyb3IoInNldHJsaW1pdChSTElNSVRfTk9GSUxFKSIpOwotCSAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBleGNlZWQgaGFyZCBsaW1pdCBmb3Igb3BlbiBmaWxlcyIpOwotCX0KLSAgICB9Ci0jZW5kaWYKLQotICAgIHMtPnNlcnZlcl9hZG1pbiA9IE5VTEw7Ci0gICAgcy0+c2VydmVyX2hvc3RuYW1lID0gTlVMTDsKLSAgICBzLT5lcnJvcl9mbmFtZSA9IE5VTEw7Ci0gICAgcy0+c3JtX2NvbmZuYW1lID0gTlVMTDsKLSAgICBzLT5hY2Nlc3NfY29uZm5hbWUgPSBOVUxMOwotICAgIHMtPnRpbWVvdXQgPSAwOwotICAgIHMtPmtlZXBfYWxpdmVfdGltZW91dCA9IDA7Ci0gICAgcy0+a2VlcF9hbGl2ZSA9IC0xOwotICAgIHMtPmtlZXBfYWxpdmVfbWF4ID0gLTE7Ci0gICAgcy0+ZXJyb3JfbG9nID0gbWFpbl9zZXJ2ZXItPmVycm9yX2xvZzsKLSAgICBzLT5sb2dsZXZlbCA9IG1haW5fc2VydmVyLT5sb2dsZXZlbDsKLSAgICAvKiB1c2VmdWwgZGVmYXVsdCwgb3RoZXJ3aXNlIHdlIGdldCBhIHBvcnQgb2YgMCBvbiByZWRpcmVjdHMgKi8KLSAgICBzLT5wb3J0ID0gbWFpbl9zZXJ2ZXItPnBvcnQ7Ci0gICAgcy0+bmV4dCA9IE5VTEw7Ci0KLSAgICBzLT5pc192aXJ0dWFsID0gMTsKLSAgICBzLT5uYW1lcyA9IGFwX21ha2VfYXJyYXkocCwgNCwgc2l6ZW9mKGNoYXIgKiopKTsKLSAgICBzLT53aWxkX25hbWVzID0gYXBfbWFrZV9hcnJheShwLCA0LCBzaXplb2YoY2hhciAqKikpOwotCi0gICAgcy0+bW9kdWxlX2NvbmZpZyA9IGNyZWF0ZV9lbXB0eV9jb25maWcocCk7Ci0gICAgcy0+bG9va3VwX2RlZmF1bHRzID0gYXBfY3JlYXRlX3Blcl9kaXJfY29uZmlnKHApOwotCi0gICAgcy0+c2VydmVyX3VpZCA9IGFwX3VzZXJfaWQ7Ci0gICAgcy0+c2VydmVyX2dpZCA9IGFwX2dyb3VwX2lkOwotCi0gICAgcy0+bGltaXRfcmVxX2xpbmUgPSBtYWluX3NlcnZlci0+bGltaXRfcmVxX2xpbmU7Ci0gICAgcy0+bGltaXRfcmVxX2ZpZWxkc2l6ZSA9IG1haW5fc2VydmVyLT5saW1pdF9yZXFfZmllbGRzaXplOwotICAgIHMtPmxpbWl0X3JlcV9maWVsZHMgPSBtYWluX3NlcnZlci0+bGltaXRfcmVxX2ZpZWxkczsKLQotICAgICpwcyA9IHM7Ci0KLSAgICByZXR1cm4gYXBfcGFyc2Vfdmhvc3RfYWRkcnMocCwgaG9zdG5hbWUsIHMpOwotfQotCi0KLXN0YXRpYyB2b2lkIGZpeHVwX3ZpcnR1YWxfaG9zdHMocG9vbCAqcCwgc2VydmVyX3JlYyAqbWFpbl9zZXJ2ZXIpCi17Ci0gICAgc2VydmVyX3JlYyAqdmlydDsKLQotICAgIGZvciAodmlydCA9IG1haW5fc2VydmVyLT5uZXh0OyB2aXJ0OyB2aXJ0ID0gdmlydC0+bmV4dCkgewotCW1lcmdlX3NlcnZlcl9jb25maWdzKHAsIG1haW5fc2VydmVyLT5tb2R1bGVfY29uZmlnLAotCQkJICAgICB2aXJ0LT5tb2R1bGVfY29uZmlnKTsKLQotCXZpcnQtPmxvb2t1cF9kZWZhdWx0cyA9Ci0JICAgIGFwX21lcmdlX3Blcl9kaXJfY29uZmlncyhwLCBtYWluX3NlcnZlci0+bG9va3VwX2RlZmF1bHRzLAotCQkJCSAgdmlydC0+bG9va3VwX2RlZmF1bHRzKTsKLQotCWlmICh2aXJ0LT5zZXJ2ZXJfYWRtaW4gPT0gTlVMTCkKLQkgICAgdmlydC0+c2VydmVyX2FkbWluID0gbWFpbl9zZXJ2ZXItPnNlcnZlcl9hZG1pbjsKLQotCWlmICh2aXJ0LT5zcm1fY29uZm5hbWUgPT0gTlVMTCkKLQkgICAgdmlydC0+c3JtX2NvbmZuYW1lID0gbWFpbl9zZXJ2ZXItPnNybV9jb25mbmFtZTsKLQotCWlmICh2aXJ0LT5hY2Nlc3NfY29uZm5hbWUgPT0gTlVMTCkKLQkgICAgdmlydC0+YWNjZXNzX2NvbmZuYW1lID0gbWFpbl9zZXJ2ZXItPmFjY2Vzc19jb25mbmFtZTsKLQotCWlmICh2aXJ0LT50aW1lb3V0ID09IDApCi0JICAgIHZpcnQtPnRpbWVvdXQgPSBtYWluX3NlcnZlci0+dGltZW91dDsKLQotCWlmICh2aXJ0LT5rZWVwX2FsaXZlX3RpbWVvdXQgPT0gMCkKLQkgICAgdmlydC0+a2VlcF9hbGl2ZV90aW1lb3V0ID0gbWFpbl9zZXJ2ZXItPmtlZXBfYWxpdmVfdGltZW91dDsKLQotCWlmICh2aXJ0LT5rZWVwX2FsaXZlID09IC0xKQotCSAgICB2aXJ0LT5rZWVwX2FsaXZlID0gbWFpbl9zZXJ2ZXItPmtlZXBfYWxpdmU7Ci0KLQlpZiAodmlydC0+a2VlcF9hbGl2ZV9tYXggPT0gLTEpCi0JICAgIHZpcnQtPmtlZXBfYWxpdmVfbWF4ID0gbWFpbl9zZXJ2ZXItPmtlZXBfYWxpdmVfbWF4OwotCi0JaWYgKHZpcnQtPnNlbmRfYnVmZmVyX3NpemUgPT0gMCkKLQkgICAgdmlydC0+c2VuZF9idWZmZXJfc2l6ZSA9IG1haW5fc2VydmVyLT5zZW5kX2J1ZmZlcl9zaXplOwotCi0JLyogWFhYOiB0aGlzIGlzIHJlYWxseSBzb21ldGhpbmcgdGhhdCBzaG91bGQgYmUgZGVhbHQgd2l0aCBieSBhCi0JICogcG9zdC1jb25maWcgYXBpIHBoYXNlICovCi0JYXBfY29yZV9yZW9yZGVyX2RpcmVjdG9yaWVzKHAsIHZpcnQpOwotICAgIH0KLSAgICBhcF9jb3JlX3Jlb3JkZXJfZGlyZWN0b3JpZXMocCwgbWFpbl9zZXJ2ZXIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBHZXR0aW5nICpldmVyeXRoaW5nKiBjb25maWd1cmVkLi4uIAotICovCi0KLXN0YXRpYyB2b2lkIGluaXRfY29uZmlnX2dsb2JhbHMocG9vbCAqcCkKLXsKLSAgICAvKiBTZXJ2ZXJSb290LCBzZXJ2ZXJfY29uZm5hbWUgc2V0IGluIGh0dHBkLmMgKi8KLQotICAgIGFwX3N0YW5kYWxvbmUgPSAxOwotICAgIGFwX3VzZXJfbmFtZSA9IERFRkFVTFRfVVNFUjsKLSAgICBhcF91c2VyX2lkID0gYXBfdW5hbWUyaWQoREVGQVVMVF9VU0VSKTsKLSAgICBhcF9ncm91cF9pZCA9IGFwX2duYW1lMmlkKERFRkFVTFRfR1JPVVApOwotICAgIGFwX2RhZW1vbnNfdG9fc3RhcnQgPSBERUZBVUxUX1NUQVJUX0RBRU1PTjsKLSAgICBhcF9kYWVtb25zX21pbl9mcmVlID0gREVGQVVMVF9NSU5fRlJFRV9EQUVNT047Ci0gICAgYXBfZGFlbW9uc19tYXhfZnJlZSA9IERFRkFVTFRfTUFYX0ZSRUVfREFFTU9OOwotICAgIGFwX2RhZW1vbnNfbGltaXQgPSBIQVJEX1NFUlZFUl9MSU1JVDsKLSAgICBhcF9waWRfZm5hbWUgPSBERUZBVUxUX1BJRExPRzsKLSAgICBhcF9zY29yZWJvYXJkX2ZuYW1lID0gREVGQVVMVF9TQ09SRUJPQVJEOwotICAgIGFwX2xvY2tfZm5hbWUgPSBERUZBVUxUX0xPQ0tGSUxFOwotICAgIGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQgPSBERUZBVUxUX01BWF9SRVFVRVNUU19QRVJfQ0hJTEQ7Ci0gICAgYXBfYmluZF9hZGRyZXNzLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOwotICAgIGFwX2xpc3RlbmVycyA9IE5VTEw7Ci0gICAgYXBfbGlzdGVuYmFja2xvZyA9IERFRkFVTFRfTElTVEVOQkFDS0xPRzsKLSAgICBhcF9leHRlbmRlZF9zdGF0dXMgPSAwOwotCi0gICAgLyogR2xvYmFsIHZpcnR1YWwgaG9zdCBoYXNoIGJ1Y2tldCBwb2ludGVycy4gIEluaXQgdG8gbnVsbC4gKi8KLSAgICBhcF9pbml0X3Zob3N0X2NvbmZpZyhwKTsKLQotICAgIGFwX2NweXN0cm4oYXBfY29yZWR1bXBfZGlyLCBhcF9zZXJ2ZXJfcm9vdCwgc2l6ZW9mKGFwX2NvcmVkdW1wX2RpcikpOwotfQotCi1zdGF0aWMgc2VydmVyX3JlYyAqaW5pdF9zZXJ2ZXJfY29uZmlnKHBvb2wgKnApCi17Ci0gICAgc2VydmVyX3JlYyAqcyA9IChzZXJ2ZXJfcmVjICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKHNlcnZlcl9yZWMpKTsKLQotICAgIHMtPnBvcnQgPSAwOwotICAgIHMtPnNlcnZlcl9hZG1pbiA9IERFRkFVTFRfQURNSU47Ci0gICAgcy0+c2VydmVyX2hvc3RuYW1lID0gTlVMTDsKLSAgICBzLT5lcnJvcl9mbmFtZSA9IERFRkFVTFRfRVJST1JMT0c7Ci0gICAgcy0+ZXJyb3JfbG9nID0gc3RkZXJyOwotICAgIHMtPmxvZ2xldmVsID0gREVGQVVMVF9MT0dMRVZFTDsKLSAgICBzLT5zcm1fY29uZm5hbWUgPSBSRVNPVVJDRV9DT05GSUdfRklMRTsKLSAgICBzLT5hY2Nlc3NfY29uZm5hbWUgPSBBQ0NFU1NfQ09ORklHX0ZJTEU7Ci0gICAgcy0+bGltaXRfcmVxX2xpbmUgPSBERUZBVUxUX0xJTUlUX1JFUVVFU1RfTElORTsKLSAgICBzLT5saW1pdF9yZXFfZmllbGRzaXplID0gREVGQVVMVF9MSU1JVF9SRVFVRVNUX0ZJRUxEU0laRTsKLSAgICBzLT5saW1pdF9yZXFfZmllbGRzID0gREVGQVVMVF9MSU1JVF9SRVFVRVNUX0ZJRUxEUzsKLSAgICBzLT50aW1lb3V0ID0gREVGQVVMVF9USU1FT1VUOwotICAgIHMtPmtlZXBfYWxpdmVfdGltZW91dCA9IERFRkFVTFRfS0VFUEFMSVZFX1RJTUVPVVQ7Ci0gICAgcy0+a2VlcF9hbGl2ZV9tYXggPSBERUZBVUxUX0tFRVBBTElWRTsKLSAgICBzLT5rZWVwX2FsaXZlID0gMTsKLSAgICBzLT5uZXh0ID0gTlVMTDsKLSAgICBzLT5hZGRycyA9IGFwX3BjYWxsb2MocCwgc2l6ZW9mKHNlcnZlcl9hZGRyX3JlYykpOwotICAgIC8qIE5PVCB2aXJ0dWFsIGhvc3Q7IGRvbid0IG1hdGNoIGFueSByZWFsIG5ldHdvcmsgaW50ZXJmYWNlICovCi0gICAgcy0+YWRkcnMtPmhvc3RfYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKLSAgICBzLT5hZGRycy0+aG9zdF9wb3J0ID0gMDsJLyogbWF0Y2hlcyBhbnkgcG9ydCAqLwotICAgIHMtPmFkZHJzLT52aXJ0aG9zdCA9ICIiOwkvKiBtdXN0IGJlIG5vbi1OVUxMICovCi0gICAgcy0+bmFtZXMgPSBzLT53aWxkX25hbWVzID0gTlVMTDsKLQotICAgIHMtPm1vZHVsZV9jb25maWcgPSBjcmVhdGVfc2VydmVyX2NvbmZpZyhwLCBzKTsKLSAgICBzLT5sb29rdXBfZGVmYXVsdHMgPSBjcmVhdGVfZGVmYXVsdF9wZXJfZGlyX2NvbmZpZyhwKTsKLQotICAgIHJldHVybiBzOwotfQotCi0KLXN0YXRpYyB2b2lkIGRlZmF1bHRfbGlzdGVuZXJzKHBvb2wgKnAsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgbGlzdGVuX3JlYyAqbmV3OwotCi0gICAgaWYgKGFwX2xpc3RlbmVycyAhPSBOVUxMKSB7Ci0JcmV0dXJuOwotICAgIH0KLSAgICAvKiBhbGxvY2F0ZSBhIGRlZmF1bHQgbGlzdGVuZXIgKi8KLSAgICBuZXcgPSBhcF9wY2FsbG9jKHAsIHNpemVvZihsaXN0ZW5fcmVjKSk7Ci0gICAgbmV3LT5sb2NhbF9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotICAgIG5ldy0+bG9jYWxfYWRkci5zaW5fYWRkciA9IGFwX2JpbmRfYWRkcmVzczsKLSAgICBuZXctPmxvY2FsX2FkZHIuc2luX3BvcnQgPSBodG9ucyhzLT5wb3J0ID8gcy0+cG9ydCA6IERFRkFVTFRfSFRUUF9QT1JUKTsKLSAgICBuZXctPmZkID0gLTE7Ci0gICAgbmV3LT51c2VkID0gMDsKLSAgICBuZXctPm5leHQgPSBOVUxMOwotICAgIGFwX2xpc3RlbmVycyA9IG5ldzsKLX0KLQotCi1zZXJ2ZXJfcmVjICphcF9yZWFkX2NvbmZpZyhwb29sICpwLCBwb29sICpwdGVtcCwgY2hhciAqY29uZm5hbWUpCi17Ci0gICAgc2VydmVyX3JlYyAqcyA9IGluaXRfc2VydmVyX2NvbmZpZyhwKTsKLQotICAgIGluaXRfY29uZmlnX2dsb2JhbHMocCk7Ci0KLSAgICAvKiBBbGwgc2VydmVyLXdpZGUgY29uZmlnIGZpbGVzIG5vdyBoYXZlIHRoZSBTQU1FIHN5bnRheC4uLiAqLwotCi0gICAgcHJvY2Vzc19jb21tYW5kX2NvbmZpZyhzLCBhcF9zZXJ2ZXJfcHJlX3JlYWRfY29uZmlnLCBwLCBwdGVtcCk7Ci0KLSAgICBhcF9wcm9jZXNzX3Jlc291cmNlX2NvbmZpZyhzLCBjb25mbmFtZSwgcCwgcHRlbXApOwotICAgIGFwX3Byb2Nlc3NfcmVzb3VyY2VfY29uZmlnKHMsIHMtPnNybV9jb25mbmFtZSwgcCwgcHRlbXApOwotICAgIGFwX3Byb2Nlc3NfcmVzb3VyY2VfY29uZmlnKHMsIHMtPmFjY2Vzc19jb25mbmFtZSwgcCwgcHRlbXApOwotCi0gICAgcHJvY2Vzc19jb21tYW5kX2NvbmZpZyhzLCBhcF9zZXJ2ZXJfcG9zdF9yZWFkX2NvbmZpZywgcCwgcHRlbXApOwotCi0gICAgZml4dXBfdmlydHVhbF9ob3N0cyhwLCBzKTsKLSAgICBkZWZhdWx0X2xpc3RlbmVycyhwLCBzKTsKLSAgICBhcF9maW5pX3Zob3N0X2NvbmZpZyhwLCBzKTsKLQotICAgIHJldHVybiBzOwotfQotCi12b2lkIGFwX3NpbmdsZV9tb2R1bGVfY29uZmlndXJlKHBvb2wgKnAsIHNlcnZlcl9yZWMgKnMsIG1vZHVsZSAqbSkKLXsKLSAgICBpZiAobS0+Y3JlYXRlX3NlcnZlcl9jb25maWcpCi0gICAgICAgIGFwX3NldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsIG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqbS0+Y3JlYXRlX3NlcnZlcl9jb25maWcpKHAsIHMpKTsKLSAgICBpZiAobS0+Y3JlYXRlX2Rpcl9jb25maWcpCi0gICAgICAgIGFwX3NldF9tb2R1bGVfY29uZmlnKHMtPmxvb2t1cF9kZWZhdWx0cywgbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCptLT5jcmVhdGVfZGlyX2NvbmZpZykocCwgTlVMTCkpOwotfQotCi12b2lkIGFwX2luaXRfbW9kdWxlcyhwb29sICpwLCBzZXJ2ZXJfcmVjICpzKQotewotICAgIG1vZHVsZSAqbTsKLQotICAgIGZvciAobSA9IHRvcF9tb2R1bGU7IG07IG0gPSBtLT5uZXh0KQotCWlmIChtLT5pbml0KQotCSAgICAoKm0tPmluaXQpIChzLCBwKTsKLSAgICBidWlsZF9tZXRob2Rfc2hvcnRjdXRzKCk7Ci0gICAgaW5pdF9oYW5kbGVycyhwKTsKLX0KLQotdm9pZCBhcF9jaGlsZF9pbml0X21vZHVsZXMocG9vbCAqcCwgc2VydmVyX3JlYyAqcykKLXsKLSAgICBtb2R1bGUgKm07Ci0KLSAgICBmb3IgKG0gPSB0b3BfbW9kdWxlOyBtOyBtID0gbS0+bmV4dCkKLQlpZiAobS0+Y2hpbGRfaW5pdCkKLQkgICAgKCptLT5jaGlsZF9pbml0KSAocywgcCk7Ci19Ci0KLXZvaWQgYXBfY2hpbGRfZXhpdF9tb2R1bGVzKHBvb2wgKnAsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgbW9kdWxlICptOwotCi0jaWZkZWYgU0lHSFVQCi0gICAgc2lnbmFsKFNJR0hVUCwgU0lHX0lHTik7Ci0jZW5kaWYKLSNpZmRlZiBTSUdVU1IxCi0gICAgc2lnbmFsKFNJR1VTUjEsIFNJR19JR04pOwotI2VuZGlmCi0KLSAgICBmb3IgKG0gPSB0b3BfbW9kdWxlOyBtOyBtID0gbS0+bmV4dCkKLQlpZiAobS0+Y2hpbGRfZXhpdCkKLQkgICAgKCptLT5jaGlsZF9leGl0KSAocywgcCk7Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMgYXJlIHJlc3RyaWN0ZWQgaW4gdGVybXMgb2Ygd2hlcmUgdGhleSBtYXkKLSAqIGFwcGVhciBpbiB0aGUgbWFpbiBjb25maWd1cmF0aW9uIGZpbGVzIGFuZC9vciAuaHRhY2Nlc3MgZmlsZXMgYWNjb3JkaW5nCi0gKiB0byB0aGUgYml0bWFzayByZXFfb3ZlcnJpZGUgaW4gdGhlIGNvbW1hbmRfcmVjIHN0cnVjdHVyZS4KLSAqIElmIGFueSBvZiB0aGUgb3ZlcnJpZGVzIHNldCBpbiByZXFfb3ZlcnJpZGUgYXJlIGFsc28gYWxsb3dlZCBpbiB0aGUKLSAqIGNvbnRleHQgaW4gd2hpY2ggdGhlIGNvbW1hbmQgaXMgcmVhZCwgdGhlbiB0aGUgY29tbWFuZCBpcyBhbGxvd2VkLgotICogVGhlIGNvbnRleHQgaXMgZGV0ZXJtaW5lZCBhcyBmb2xsb3dzOgotICoKLSAqICAgIGluc2lkZSAqLmNvbmYgLS0+IG92ZXJyaWRlID0gKFJTUkNfQ09ORnxPUl9BTEwpJn4oT1JfQVVUSENGR3xPUl9MSU1JVCk7Ci0gKiAgICB3aXRoaW4gPERpcmVjdG9yeT4gb3IgPExvY2F0aW9uPiAtLT4gb3ZlcnJpZGUgPSBPUl9BTEx8QUNDRVNTX0NPTkY7Ci0gKiAgICB3aXRoaW4gLmh0YWNjZXNzIC0tPiBvdmVycmlkZSA9IEFsbG93T3ZlcnJpZGUgZm9yIGN1cnJlbnQgZGlyZWN0b3J5OwotICoKLSAqIHRoZSByZXN1bHQgaXMsIHdlbGwsIGEgcmF0aGVyIGNvbmZ1c2luZyBzZXQgb2YgcG9zc2liaWxpdGllcyBmb3Igd2hlbgotICogYSBwYXJ0aWN1bGFyIGRpcmVjdGl2ZSBpcyBhbGxvd2VkIHRvIGJlIHVzZWQuICBUaGlzIHByb2NlZHVyZSBwcmludHMKLSAqIGluIEVuZ2xpc2ggd2hlcmUgdGhlIGdpdmVuIChwYykgZGlyZWN0aXZlIGNhbiBiZSB1c2VkLgotICovCi1zdGF0aWMgdm9pZCBzaG93X292ZXJyaWRlcyhjb25zdCBjb21tYW5kX3JlYyAqcGMsIG1vZHVsZSAqcG0pCi17Ci0gICAgaW50IG4gPSAwOwotCi0gICAgcHJpbnRmKCJcdEFsbG93ZWQgaW4gKi5jb25mICIpOwotICAgIGlmICgocGMtPnJlcV9vdmVycmlkZSAmIChPUl9PUFRJT05TIHwgT1JfRklMRUlORk8gfCBPUl9JTkRFWEVTKSkgfHwKLQkoKHBjLT5yZXFfb3ZlcnJpZGUgJiBSU1JDX0NPTkYpICYmCi0JICgocGMtPnJlcV9vdmVycmlkZSAmIChBQ0NFU1NfQ09ORiB8IE9SX0FVVEhDRkcgfCBPUl9MSU1JVCkpKSkpCi0JcHJpbnRmKCJhbnl3aGVyZSIpOwotICAgIGVsc2UgaWYgKHBjLT5yZXFfb3ZlcnJpZGUgJiBSU1JDX0NPTkYpCi0JcHJpbnRmKCJvbmx5IG91dHNpZGUgPERpcmVjdG9yeT4sIDxGaWxlcz4gb3IgPExvY2F0aW9uPiIpOwotICAgIGVsc2UKLQlwcmludGYoIm9ubHkgaW5zaWRlIDxEaXJlY3Rvcnk+LCA8RmlsZXM+IG9yIDxMb2NhdGlvbj4iKTsKLQotICAgIC8qIFdhcm4gaWYgdGhlIGRpcmVjdGl2ZSBpcyBhbGxvd2VkIGluc2lkZSA8RGlyZWN0b3J5PiBvciAuaHRhY2Nlc3MKLSAgICAgKiBidXQgbW9kdWxlIGRvZXNuJ3Qgc3VwcG9ydCBwZXItZGlyIGNvbmZpZ3VyYXRpb24gKi8KLQotICAgIGlmICgocGMtPnJlcV9vdmVycmlkZSAmIChPUl9BTEwgfCBBQ0NFU1NfQ09ORikpICYmICFwbS0+Y3JlYXRlX2Rpcl9jb25maWcpCi0JcHJpbnRmKCIgW25vIHBlci1kaXIgY29uZmlnXSIpOwotCi0gICAgaWYgKHBjLT5yZXFfb3ZlcnJpZGUgJiBPUl9BTEwpIHsKLQlwcmludGYoIiBhbmQgaW4gLmh0YWNjZXNzXG5cdHdoZW4gQWxsb3dPdmVycmlkZSIpOwotCi0JaWYgKChwYy0+cmVxX292ZXJyaWRlICYgT1JfQUxMKSA9PSBPUl9BTEwpCi0JICAgIHByaW50ZigiIGlzbid0IE5vbmUiKTsKLQllbHNlIHsKLQkgICAgcHJpbnRmKCIgaW5jbHVkZXMgIik7Ci0KLQkgICAgaWYgKHBjLT5yZXFfb3ZlcnJpZGUgJiBPUl9BVVRIQ0ZHKSB7Ci0JCWlmIChuKyspCi0JCSAgICBwcmludGYoIiBvciAiKTsKLQkJcHJpbnRmKCJBdXRoQ29uZmlnIik7Ci0JICAgIH0KLQkgICAgaWYgKHBjLT5yZXFfb3ZlcnJpZGUgJiBPUl9MSU1JVCkgewotCQlpZiAobisrKQotCQkgICAgcHJpbnRmKCIgb3IgIik7Ci0JCXByaW50ZigiTGltaXQiKTsKLQkgICAgfQotCSAgICBpZiAocGMtPnJlcV9vdmVycmlkZSAmIE9SX09QVElPTlMpIHsKLQkJaWYgKG4rKykKLQkJICAgIHByaW50ZigiIG9yICIpOwotCQlwcmludGYoIk9wdGlvbnMiKTsKLQkgICAgfQotCSAgICBpZiAocGMtPnJlcV9vdmVycmlkZSAmIE9SX0ZJTEVJTkZPKSB7Ci0JCWlmIChuKyspCi0JCSAgICBwcmludGYoIiBvciAiKTsKLQkJcHJpbnRmKCJGaWxlSW5mbyIpOwotCSAgICB9Ci0JICAgIGlmIChwYy0+cmVxX292ZXJyaWRlICYgT1JfSU5ERVhFUykgewotCQlpZiAobisrKQotCQkgICAgcHJpbnRmKCIgb3IgIik7Ci0JCXByaW50ZigiSW5kZXhlcyIpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICBwcmludGYoIlxuIik7Ci19Ci0KLS8qIFNob3cgdGhlIHByZWxvYWRlZCBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMsIHRoZSBoZWxwIHN0cmluZyBleHBsYWluaW5nCi0gKiB0aGUgZGlyZWN0aXZlIGFyZ3VtZW50cywgaW4gd2hhdCBtb2R1bGUgdGhleSBhcmUgaGFuZGxlZCwgYW5kIGluCi0gKiB3aGF0IHBhcnRzIG9mIHRoZSBjb25maWd1cmF0aW9uIHRoZXkgYXJlIGFsbG93ZWQuICBVc2VkIGZvciBodHRwZCAtaC4KLSAqLwotdm9pZCBhcF9zaG93X2RpcmVjdGl2ZXMoKQotewotICAgIGNvbnN0IGNvbW1hbmRfcmVjICpwYzsKLSAgICBpbnQgbjsKLQotICAgIGZvciAobiA9IDA7IGFwX2xvYWRlZF9tb2R1bGVzW25dOyArK24pCi0JZm9yIChwYyA9IGFwX2xvYWRlZF9tb2R1bGVzW25dLT5jbWRzOyBwYyAmJiBwYy0+bmFtZTsgKytwYykgewotCSAgICBwcmludGYoIiVzICglcylcbiIsIHBjLT5uYW1lLCBhcF9sb2FkZWRfbW9kdWxlc1tuXS0+bmFtZSk7Ci0JICAgIGlmIChwYy0+ZXJybXNnKQotCQlwcmludGYoIlx0JXNcbiIsIHBjLT5lcnJtc2cpOwotCSAgICBzaG93X292ZXJyaWRlcyhwYywgYXBfbG9hZGVkX21vZHVsZXNbbl0pOwotCX0KLX0KLQotLyogU2hvdyB0aGUgcHJlbG9hZGVkIG1vZHVsZSBuYW1lcy4gIFVzZWQgZm9yIGh0dHBkIC1sLiAqLwotdm9pZCBhcF9zaG93X21vZHVsZXMoKQotewotICAgIGludCBuOwotCi0gICAgcHJpbnRmKCJDb21waWxlZC1pbiBtb2R1bGVzOlxuIik7Ci0gICAgZm9yIChuID0gMDsgYXBfbG9hZGVkX21vZHVsZXNbbl07ICsrbikKLQlwcmludGYoIiAgJXNcbiIsIGFwX2xvYWRlZF9tb2R1bGVzW25dLT5uYW1lKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZlci9jb25maWcubTQgYi9zZXJ2ZXIvY29uZmlnLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzcyMDNkLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9jb25maWcubTQKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1kbmwgIyMgQ2hlY2sgZm9yIGxpYnJhcmllcwotCi1BQ19DSEVDS19MSUIobnNsLCBnZXRob3N0bmFtZSwgWwotIEFDX0FERF9MSUJSQVJZKG5zbCkgXSwgW10pCi0KLUFDX0NIRUNLX0xJQihzb2NrZXQsIHNvY2tldCwgWwotIEFDX0FERF9MSUJSQVJZKHNvY2tldCkgXSwgW10pCi0KLUFDX0NIRUNLX0xJQihuc2wsIGdldGhvc3RieWFkZHIsIFsKLSBBQ19BRERfTElCUkFSWShuc2wpIF0sIFtdKQotCi1BQ19DSEVDS19MSUIoY3J5cHQsIGNyeXB0LCBbCi0gQUNfQUREX0xJQlJBUlkoY3J5cHQpIAotIEFDX0RFRklORShIQVZFX0NSWVBUKV0sIFtdKQotCi1BQ19DSEVDS19MSUIoYywgY3J5cHQsIFsKLSBBQ19ERUZJTkUoSEFWRV9DUllQVCldLCBbXSkKLQotZG5sICMjIENoZWNrIGZvciBoZWFkZXIgZmlsZXMKLQotQUNfSEVBREVSX1NUREMKLUFDX0NIRUNLX0hFQURFUlMoCi1ic3RyaW5nLmggXAotY3J5cHQuaCBcCi11bmlzdGQuaCBcCi1zeXMvcmVzb3VyY2UuaCBcCi1zeXMvc2VsZWN0LmggXAotc3lzL3Byb2Nlc3Nvci5oIFwKLSkKLQotZG5sICMjIENoZWNrIGZvciB0eXBlZGVmcywgc3RydWN0dXJlcywgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcy4KLQotQUNfQ0FDSEVfQ0hFQ0soW2ZvciB0bV9nbXRvZmYgaW4gc3RydWN0IHRtXSwgYWNfY3Zfc3RydWN0X3RtX2dtdG9mZiwKLVtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPCRhY19jdl9zdHJ1Y3RfdG0+XSwgW3N0cnVjdCB0bSB0bTsgdG0udG1fZ210b2ZmO10sCi0gIGFjX2N2X3N0cnVjdF90bV9nbXRvZmY9eWVzLCBhY19jdl9zdHJ1Y3RfdG1fZ210b2ZmPW5vKV0pCi0KLWlmIHRlc3QgIiRhY19jdl9zdHJ1Y3RfdG1fZ210b2ZmIiA9ICJ5ZXMiOyB0aGVuCi0gICAgQUNfREVGSU5FKEhBVkVfR01UT0ZGKQotZmkKLQotZG5sICMjIENoZWNrIGZvciBsaWJyYXJ5IGZ1bmN0aW9ucwotCi1BQ19DSEVDS19GVU5DUygKLWRpZmZ0aW1lIFwKLXN5c2xvZyBcCi0pCi1BQ19GVU5DX01NQVAKLQotZG5sIFhYWCAtIGlzIGF1dG9jb25mJ3MgZGV0ZWN0aW9uIHJvdXRpbmUgZ29vZCBlbm91Z2g/Ci1pZiB0ZXN0ICIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgPSAieWVzIjsgdGhlbgotICAgIEFDX0RFRklORShVU0VfTU1BUF9GSUxFUykKLWZpCmRpZmYgLS1naXQgYS9zZXJ2ZXIvY29ubmVjdGlvbi5jIGIvc2VydmVyL2Nvbm5lY3Rpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZlZThkNC4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvY29ubmVjdGlvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIAotICogYXJlIG1ldDogCi0gKiAKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAgCi0gKiAKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIAotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSAKLSAqICAgIGRpc3RyaWJ1dGlvbi4gCi0gKiAKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyAKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAgCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIiAKLSAqIAotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0byAKLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCAKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLiAKLSAqIAotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIgCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuIAotICogCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nIAotICogICAgYWNrbm93bGVkZ21lbnQ6IAotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cCAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iIAotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkgCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIAotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IgCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgCi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gKiAKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55IAotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkIAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIAotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLiAKLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4gCi0gKiAKLSAqLyAKLSAKLSNkZWZpbmUgQ09SRV9QUklWQVRFCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2Nvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiYXBfbXBtLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX3Zob3N0LmgiCi0KLSNpbmNsdWRlIDxwb2xsLmg+Ci0KLS8qCi0gKiBNb3JlIG1hY2hpbmUtZGVwZW5kZW50IG5ldHdvcmtpbmcgZ29vby4uLiBvbiBzb21lIHN5c3RlbXMsCi0gKiB5b3UndmUgZ290IHRvIGJlICpyZWFsbHkqIHN1cmUgdGhhdCBhbGwgdGhlIHBhY2tldHMgYXJlIGFja25vd2xlZGdlZAotICogYmVmb3JlIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb24sIHNpbmNlIHRoZSBjbGllbnQgd2lsbCBub3QgYmUgYWJsZQotICogdG8gc2VlIHRoZSBsYXN0IHJlc3BvbnNlIGlmIHRoZWlyIFRDUCBidWZmZXIgaXMgZmx1c2hlZCBieSBhIFJTVAotICogcGFja2V0IGZyb20gdXMsIHdoaWNoIGlzIHdoYXQgdGhlIHNlcnZlcidzIFRDUCBzdGFjayB3aWxsIHNlbmQKLSAqIGlmIGl0IHJlY2VpdmVzIGFueSByZXF1ZXN0IGRhdGEgYWZ0ZXIgY2xvc2luZyB0aGUgY29ubmVjdGlvbi4KLSAqCi0gKiBJbiBhbiBpZGVhbCB3b3JsZCwgdGhpcyBmdW5jdGlvbiB3b3VsZCBiZSBhY2NvbXBsaXNoZWQgYnkgc2ltcGx5Ci0gKiBzZXR0aW5nIHRoZSBzb2NrZXQgb3B0aW9uIFNPX0xJTkdFUiBhbmQgaGFuZGxpbmcgaXQgd2l0aGluIHRoZQotICogc2VydmVyJ3MgVENQIHN0YWNrIHdoaWxlIHRoZSBwcm9jZXNzIGNvbnRpbnVlcyBvbiB0byB0aGUgbmV4dCByZXF1ZXN0LgotICogVW5mb3J0dW5hdGVseSwgaXQgc2VlbXMgdGhhdCBtb3N0IChpZiBub3QgYWxsKSBvcGVyYXRpbmcgc3lzdGVtcwotICogYmxvY2sgdGhlIHNlcnZlciBwcm9jZXNzIG9uIGNsb3NlKCkgd2hlbiBTT19MSU5HRVIgaXMgdXNlZC4KLSAqIEZvciB0aG9zZSB0aGF0IGRvbid0LCBzZWUgVVNFX1NPX0xJTkdFUiBiZWxvdy4gIEZvciB0aGUgcmVzdCwKLSAqIHdlIGhhdmUgY3JlYXRlZCBhIGhvbWUtYnJldyBsaW5nZXJpbmdfY2xvc2UuCi0gKgotICogTWFueSBvcGVyYXRpbmcgc3lzdGVtcyB0ZW5kIHRvIGJsb2NrLCBwdWtlLCBvciBvdGhlcndpc2UgbWlzaGFuZGxlCi0gKiBjYWxscyB0byBzaHV0ZG93biBvbmx5IGhhbGYgb2YgdGhlIGNvbm5lY3Rpb24uICBZb3Ugc2hvdWxkIGRlZmluZQotICogTk9fTElOR0NMT1NFIGluIGFwX2NvbmZpZy5oIGlmIHN1Y2ggaXMgdGhlIGNhc2UgZm9yIHlvdXIgc3lzdGVtLgotICovCi0jaWZuZGVmIE1BWF9TRUNTX1RPX0xJTkdFUgotI2RlZmluZSBNQVhfU0VDU19UT19MSU5HRVIgMzAKLSNlbmRpZgotCi0jaWZkZWYgVVNFX1NPX0xJTkdFUgotI2RlZmluZSBOT19MSU5HQ0xPU0UJCS8qIFRoZSB0d28gbGluZ2VyaW5nIG9wdGlvbnMgYXJlIGV4Y2x1c2l2ZSAqLwotCi1zdGF0aWMgdm9pZCBzb2NrX2VuYWJsZV9saW5nZXIoaW50IHMpIC8vIFpaWlpaIGFic3RyYWN0IHRoZSBzb2NrZXQsIHMKLXsKLSAgICBzdHJ1Y3QgbGluZ2VyIGxpOyAgICAgICAgICAgICAgICAgLy8gWlpaWlogU29ja2V0T3B0aW9ucy4uLgotCi0gICAgbGkubF9vbm9mZiA9IDE7Ci0gICAgbGkubF9saW5nZXIgPSBNQVhfU0VDU19UT19MSU5HRVI7Ci0KLSAgICBpZiAoc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19MSU5HRVIsIC8vIFpaWlpaIGFic3RyYWN0LCByZXR1cm4gU1VDQ0VTUyBvciBub3QKLQkJICAgKGNoYXIgKikgJmxpLCBzaXplb2Yoc3RydWN0IGxpbmdlcikpIDwgMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBzZXJ2ZXJfY29uZiwKLQkgICAgICAgICAgICAic2V0c29ja29wdDogKFNPX0xJTkdFUikiKTsKLQkvKiBub3QgYSBmYXRhbCBlcnJvciAqLwotICAgIH0KLX0KLQotI2Vsc2UKLSNkZWZpbmUgc29ja19lbmFibGVfbGluZ2VyKHMpCS8qIE5PT1AgKi8KLSNlbmRpZiAvKiBVU0VfU09fTElOR0VSICovCi0KLSNpZm5kZWYgTk9fTElOR0NMT1NFCi0KLS8qIFNpbmNlIG1hbnkgY2xpZW50cyB3aWxsIGFib3J0IGEgY29ubmVjdGlvbiBpbnN0ZWFkIG9mIGNsb3NpbmcgaXQsCi0gKiBhdHRlbXB0aW5nIHRvIGxvZyBhbiBlcnJvciBtZXNzYWdlIGZyb20gdGhpcyByb3V0aW5lIHdpbGwgb25seQotICogY29uZnVzZSB0aGUgd2VibWFzdGVyLiAgVGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGFueSBwb3J0YWJsZSB3YXkgdG8KLSAqIGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBkcm9wcGVkIGNvbm5lY3Rpb24gYW5kIHNvbWV0aGluZyB0aGF0IG1pZ2h0IGJlCi0gKiB3b3J0aCBsb2dnaW5nLgotICovCi0vKlpaWiB0aGlzIHJvdXRpbmUgbmVlZHMgdG8gYmUgYWRhcHRlZCBmb3IgdXNlIHdpdGggcG9sbCgpKi8KLXN0YXRpYyB2b2lkIGxpbmdlcmluZ19jbG9zZShyZXF1ZXN0X3JlYyAqcikgICAgIAotewotICAvKlpaWiByZW1vdmUgdGhlIGhhcmR3aXJlZCA1MTIuIFRoaXMgaXMgYW4gSU8gQnVmZmVyIFNpemUgKi8KLSAgICBjaGFyIGR1bW15YnVmWzUxMl07ICAgIAotICAgIHN0cnVjdCBwb2xsZmQgcGQ7Ci0gICAgaW50IGxzZDsKLSAgICBpbnQgbWF4X3dhaXQ7Ci0KLSAgICAvKiBQcmV2ZW50IGEgc2xvdy1kcmlwIGNsaWVudCBmcm9tIGhvbGRpbmcgdXMgaGVyZSBpbmRlZmluaXRlbHkgKi8KLQotICAgIG1heF93YWl0ID0gMzA7Ci0gICAgYXBfYnNldG9wdChyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJPX1RJTUVPVVQsICZtYXhfd2FpdCk7Ci0KLSAgICAvKiBTZW5kIGFueSBsZWZ0b3ZlciBkYXRhIHRvIHRoZSBjbGllbnQsIGJ1dCBuZXZlciB0cnkgdG8gYWdhaW4gKi8KLQotICAgIGlmIChhcF9iZmx1c2goci0+Y29ubmVjdGlvbi0+Y2xpZW50KSA9PSAtMSkgewotCWFwX2JjbG9zZShyLT5jb25uZWN0aW9uLT5jbGllbnQpOwotCXJldHVybjsKLSAgICB9Ci0gICAgYXBfYnNldGZsYWcoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCX0VPVVQsIDEpOwotCi0gICAgLyogQ2xvc2Ugb3VyIGhhbGYgb2YgdGhlIGNvbm5lY3Rpb24gLS0tIHNlbmQgdGhlIGNsaWVudCBhIEZJTiAqLwotCi0gICAgbHNkID0gci0+Y29ubmVjdGlvbi0+Y2xpZW50LT5mZDsKLQotICAgIGlmICgoc2h1dGRvd24obHNkLCAxKSAhPSAwKSAgLyogWlpaIGFic3RyYWN0IHNodXRkb3duICovCi0gICAgICAgIHx8IGFwX2lzX2Fib3J0ZWQoci0+Y29ubmVjdGlvbikpIHsKLQlhcF9iY2xvc2Uoci0+Y29ubmVjdGlvbi0+Y2xpZW50KTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgLyogU2V0IHVwIHRvIHdhaXQgZm9yIHJlYWRhYmxlIGRhdGEgb24gc29ja2V0Li4uICovCi0gICAgcGQuZmQgPSBsc2Q7Ci0gICAgcGQuZXZlbnRzID0gUE9MTElOOwotCi0gICAgLyogV2FpdCBmb3IgcmVhZGFibGUgZGF0YSBvciBlcnJvciBjb25kaXRpb24gb24gc29ja2V0OwotICAgICAqIHNsdXJwIHVwIGFueSBkYXRhIHRoYXQgYXJyaXZlcy4uLiAgV2UgZXhpdCB3aGVuIHdlIGdvIGZvciBhbgotICAgICAqIGludGVydmFsIG9mIHR2IGxlbmd0aCB3aXRob3V0IGdldHRpbmcgYW55IG1vcmUgZGF0YSwgZ2V0IGFuIGVycm9yCi0gICAgICogZnJvbSBwb2xsKCksIGdldCBhbiBlcnJvciBvciBFT0Ygb24gYSByZWFkLCBvciB0aGUgdGltZXIgZXhwaXJlcy4KLSAgICAgKi8KLSAgICAvKiBXZSB1c2UgYSAyIHNlY29uZCB0aW1lb3V0IGJlY2F1c2UgY3VycmVudCAoRmViIDk3KSBicm93c2VycwotICAgICAqIGZhaWwgdG8gY2xvc2UgYSBjb25uZWN0aW9uIGFmdGVyIHRoZSBzZXJ2ZXIgY2xvc2VzIGl0LiAgVGh1cywKLSAgICAgKiB0byBhdm9pZCBrZWVwaW5nIHRoZSBjaGlsZCBidXN5LCB3ZSBhcmUgb25seSBsaW5nZXJpbmcgbG9uZyBlbm91Z2gKLSAgICAgKiBmb3IgYSBjbGllbnQgdGhhdCBpcyBhY3RpdmVseSBzZW5kaW5nIGRhdGEgb24gYSBjb25uZWN0aW9uLgotICAgICAqIFRoaXMgc2hvdWxkIGJlIHN1ZmZpY2llbnQgdW5sZXNzIHRoZSBjb25uZWN0aW9uIGlzIG1hc3NpdmVseQotICAgICAqIGxvc2luZyBwYWNrZXRzLCBpbiB3aGljaCBjYXNlIHdlIG1pZ2h0IGhhdmUgbWlzc2VkIHRoZSBSU1QgYW55d2F5LgotICAgICAqIFRoZXNlIHBhcmFtZXRlcnMgYXJlIHJlc2V0IG9uIGVhY2ggcGFzcywgc2luY2UgdGhleSBtaWdodCBiZQotICAgICAqIGNoYW5nZWQgYnkgcG9sbC4KLSAgICAgKi8KLSAgICBkbyB7Ci0gICAgICAgIHBkLnJldmVudHMgPSAwOwotICAgIH0gd2hpbGUgKChwb2xsKCZwZCwgMSwgMikgPT0gMSkgICAKLSAgICAgICAgICAgICAmJiByZWFkKGxzZCwgZHVtbXlidWYsIHNpemVvZihkdW1teWJ1ZikpKTsKLSAgICAgIC8qICYmICh0aW1lKCkgPSBlcG9jaCkgPCBtYXhfd2FpdCk7ICovICAgIC8qIFpaWlogdGltZSBmdW5jdGlvbiBpcyBub3QgZ29vZC4uLiAqLwotCi0gICAgLyogU2hvdWxkIG5vdyBoYXZlIHNlZW4gZmluYWwgYWNrLiAgU2FmZSB0byBmaW5hbGx5IGtpbGwgc29ja2V0ICovCi0gICAgYXBfYmNsb3NlKHItPmNvbm5lY3Rpb24tPmNsaWVudCk7Ci19Ci0jZW5kaWYgLyogbmRlZiBOT19MSU5HQ0xPU0UgKi8KLQotCi1DT1JFX0VYUE9SVCh2b2lkKSBhcF9wcm9jZXNzX2Nvbm5lY3Rpb24oY29ubl9yZWMgKmMpCi17Ci0gICAgcmVxdWVzdF9yZWMgKnI7Ci0KLSAgICBhcF91cGRhdGVfdmhvc3RfZ2l2ZW5faXAoYyk7Ci0KLSAgICAvKgotICAgICAqIFJlYWQgYW5kIHByb2Nlc3MgZWFjaCByZXF1ZXN0IGZvdW5kIG9uIG91ciBjb25uZWN0aW9uCi0gICAgICogdW50aWwgbm8gcmVxdWVzdHMgYXJlIGxlZnQgb3Igd2UgZGVjaWRlIHRvIGNsb3NlLgotICAgICAqLwotCi0gICAgd2hpbGUgKChyID0gYXBfcmVhZF9yZXF1ZXN0KGMpKSAhPSBOVUxMKSB7Ci0KLQkvKiBwcm9jZXNzIHRoZSByZXF1ZXN0IGlmIGl0IHdhcyByZWFkIHdpdGhvdXQgZXJyb3IgKi8KLQotCWlmIChyLT5zdGF0dXMgPT0gSFRUUF9PSykKLQkgICAgYXBfcHJvY2Vzc19yZXF1ZXN0KHIpOwotCi0JaWYgKCFjLT5rZWVwYWxpdmUgfHwgYy0+YWJvcnRlZCkKLQkgICAgYnJlYWs7Ci0KLQlhcF9kZXN0cm95X3Bvb2woci0+cG9vbCk7Ci0KLQlpZiAoYXBfbXBtX2dyYWNlZnVsX3N0b3AoKSkgewotCSAgICAvKiBYWFg6IGhleSB3YWl0LCB0aGlzIHNob3VsZCBkbyBhIGxpbmdlcmluZ19jbG9zZSEgKi8KLQkgICAgYXBfYmNsb3NlKGMtPmNsaWVudCk7Ci0JICAgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDbG9zZSB0aGUgY29ubmVjdGlvbiwgYmVpbmcgY2FyZWZ1bCB0byBzZW5kIG91dCB3aGF0ZXZlciBpcyBzdGlsbAotICAgICAqIGluIG91ciBidWZmZXJzLiAgSWYgcG9zc2libGUsIHRyeSB0byBhdm9pZCBhIGhhcmQgY2xvc2UgdW50aWwgdGhlCi0gICAgICogY2xpZW50IGhhcyBBQ0tlZCBvdXIgRklOIGFuZC9vciBoYXMgc3RvcHBlZCBzZW5kaW5nIHVzIGRhdGEuCi0gICAgICovCi0KLSNpZmRlZiBOT19MSU5HQ0xPU0UKLSAgICBhcF9iY2xvc2UoYy0+Y2xpZW50KTsJLyoganVzdCBjbG9zZSBpdCAqLwotI2Vsc2UKLSAgICBpZiAociAmJiByLT5jb25uZWN0aW9uCi0JJiYgIXItPmNvbm5lY3Rpb24tPmFib3J0ZWQKLQkmJiByLT5jb25uZWN0aW9uLT5jbGllbnQKLQkmJiAoci0+Y29ubmVjdGlvbi0+Y2xpZW50LT5mZCA+PSAwKSkgewotCi0JbGluZ2VyaW5nX2Nsb3NlKHIpOwotICAgIH0KLSAgICBlbHNlIHsKLQlhcF9ic2V0ZmxhZyhjLT5jbGllbnQsIEJfRU9VVCwgMSk7Ci0JYXBfYmNsb3NlKGMtPmNsaWVudCk7Ci0gICAgfQotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9zZXJ2ZXIvY29yZS5jIGIvc2VydmVyL2NvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcwYzRkMS4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzI2NyArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotI2luY2x1ZGUgImFwci5oIgotI2luY2x1ZGUgImFwcl9zdHJpbmdzLmgiCi0jaW5jbHVkZSAiYXByX2xpYi5oIgotI2luY2x1ZGUgImFwcl9mbm1hdGNoLmgiCi0jaW5jbHVkZSAiYXByX3RocmVhZF9wcm9jLmgiICAgIC8qIGZvciBSTElNSVQgc3R1ZmYgKi8KLQotI2RlZmluZSBBUFJfV0FOVF9JT1ZFQwotI2RlZmluZSBBUFJfV0FOVF9TVFJGVU5DCi0jZGVmaW5lIEFQUl9XQU5UX01FTUZVTkMKLSNpbmNsdWRlICJhcHJfd2FudC5oIgotCi0jZGVmaW5lIENPUkVfUFJJVkFURQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCS8qIEZvciBpbmRleF9vZl9yZXNwb25zZSgpLiAgR3J1bXAuICovCi0jaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCi0jaW5jbHVkZSAiaHR0cF92aG9zdC5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgkJLyogRm9yIHRoZSBkZWZhdWx0X2hhbmRsZXIgYmVsb3cuLi4gKi8KLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgInJmYzE0MTMuaCIKLSNpbmNsdWRlICJ1dGlsX21kNS5oIgotI2luY2x1ZGUgImh0dHBfY29ubmVjdGlvbi5oIgotI2luY2x1ZGUgImFwcl9idWNrZXRzLmgiCi0jaW5jbHVkZSAidXRpbF9maWx0ZXIuaCIKLSNpbmNsdWRlICJ1dGlsX2ViY2RpYy5oIgotI2luY2x1ZGUgIm1wbS5oIgotCi0jaW5jbHVkZSAibW9kX2NvcmUuaCIKLQotCi0vKiBMaW1pdFhNTFJlcXVlc3RCb2R5IGhhbmRsaW5nICovCi0jZGVmaW5lIEFQX0xJTUlUX1VOU0VUICAgICAgICAgICAgICAgICAgKChsb25nKSAtMSkKLSNkZWZpbmUgQVBfREVGQVVMVF9MSU1JVF9YTUxfQk9EWSAgICAgICAoKHNpemVfdCkxMDAwMDAwKQotCi0jZGVmaW5lIEFQX01JTl9TRU5ERklMRV9CWVRFUyAgICAgICAgICAgKDI1NikKLQotLyogU2VydmVyIGNvcmUgbW9kdWxlLi4uIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHJlYWxseSBiYXNpYwotICogc2VydmVyIG9wZXJhdGlvbnMsIGluY2x1ZGluZyBvcHRpb25zIGFuZCBjb21tYW5kcyB3aGljaCBjb250cm9sIHRoZQotICogb3BlcmF0aW9uIG9mIG90aGVyIG1vZHVsZXMuICBDb25zaWRlciB0aGlzIHRoZSBidXJlYXVjcmFjeSBtb2R1bGUuCi0gKgotICogVGhlIGNvcmUgbW9kdWxlIGFsc28gZGVmaW5lcyBoYW5kbGVycywgZXRjLiwgZG8gaGFuZGxlIGp1c3QgZW5vdWdoCi0gKiB0byBhbGxvdyBhIHNlcnZlciB3aXRoIHRoZSBjb3JlIG1vZHVsZSBPTkxZIHRvIGFjdHVhbGx5IHNlcnZlIGRvY3VtZW50cwotICogKHRob3VnaCBpdCBzbGFwcyBEZWZhdWx0VHlwZSBvbiBhbGwgb2YgJ2VtKTsgdGhpcyB3YXMgdXNlZnVsIGluIHRlc3RpbmcsCi0gKiBidXQgbWF5IG5vdCBiZSB3b3J0aCBwcmVzZXJ2aW5nLgotICoKLSAqIFRoaXMgZmlsZSBjb3VsZCBhbG1vc3QgYmUgbW9kX2NvcmUuYywgZXhjZXB0IGZvciB0aGUgc3R1ZmYgd2hpY2ggYWZmZWN0cwotICogdGhlIGh0dHBfY29uZl9nbG9iYWxzLgotICovCi0KLXN0YXRpYyB2b2lkICpjcmVhdGVfY29yZV9kaXJfY29uZmlnKGFwcl9wb29sX3QgKmEsIGNoYXIgKmRpcikKLXsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvbmY7Ci0KLSAgICBjb25mID0gKGNvcmVfZGlyX2NvbmZpZyAqKWFwcl9wY2FsbG9jKGEsIHNpemVvZihjb3JlX2Rpcl9jb25maWcpKTsKLSAgICBpZiAoIWRpciB8fCBkaXJbc3RybGVuKGRpcikgLSAxXSA9PSAnLycpIHsKLSAgICAgICAgY29uZi0+ZCA9IGRpcjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RybmNtcChkaXIsICJwcm94eToiLCA2KSA9PSAwKSB7Ci0gICAgICAgIGNvbmYtPmQgPSBhcHJfcHN0cmR1cChhLCBkaXIpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgY29uZi0+ZCA9IGFwcl9wc3RyY2F0KGEsIGRpciwgIi8iLCBOVUxMKTsKLSAgICB9Ci0gICAgY29uZi0+ZF9pc19mbm1hdGNoID0gY29uZi0+ZCA/IChhcHJfaXNfZm5tYXRjaChjb25mLT5kKSAhPSAwKSA6IDA7Ci0gICAgY29uZi0+ZF9jb21wb25lbnRzID0gY29uZi0+ZCA/IGFwX2NvdW50X2RpcnMoY29uZi0+ZCkgOiAwOwotCi0gICAgY29uZi0+b3B0cyA9IGRpciA/IE9QVF9VTlNFVCA6IE9QVF9VTlNFVHxPUFRfQUxMOwotICAgIGNvbmYtPm9wdHNfYWRkID0gY29uZi0+b3B0c19yZW1vdmUgPSBPUFRfTk9ORTsKLSAgICBjb25mLT5vdmVycmlkZSA9IGRpciA/IE9SX1VOU0VUIDogT1JfVU5TRVR8T1JfQUxMOwotCi0gICAgY29uZi0+Y29udGVudF9tZDUgPSAyOwotCi0gICAgY29uZi0+dXNlX2Nhbm9uaWNhbF9uYW1lID0gVVNFX0NBTk9OSUNBTF9OQU1FX1VOU0VUOwotCi0gICAgY29uZi0+aG9zdG5hbWVfbG9va3VwcyA9IEhPU1ROQU1FX0xPT0tVUF9VTlNFVDsKLSAgICBjb25mLT5kb19yZmMxNDEzID0gREVGQVVMVF9SRkMxNDEzIHwgMjsgLyogc2V0IGJpdCAxIHRvIGluZGljYXRlIGRlZmF1bHQgKi8KLSAgICBjb25mLT5zYXRpc2Z5ID0gU0FUSVNGWV9OT1NQRUM7Ci0KLSNpZmRlZiBSTElNSVRfQ1BVCi0gICAgY29uZi0+bGltaXRfY3B1ID0gTlVMTDsKLSNlbmRpZgotI2lmIGRlZmluZWQoUkxJTUlUX0RBVEEpIHx8IGRlZmluZWQoUkxJTUlUX1ZNRU0pIHx8IGRlZmluZWQoUkxJTUlUX0FTKQotICAgIGNvbmYtPmxpbWl0X21lbSA9IE5VTEw7Ci0jZW5kaWYKLSNpZmRlZiBSTElNSVRfTlBST0MKLSAgICBjb25mLT5saW1pdF9ucHJvYyA9IE5VTEw7Ci0jZW5kaWYKLQotICAgIGNvbmYtPmxpbWl0X3JlcV9ib2R5ID0gMDsKLSAgICBjb25mLT5saW1pdF94bWxfYm9keSA9IEFQX0xJTUlUX1VOU0VUOwotICAgIGNvbmYtPnNlYyA9IGFwcl9hcnJheV9tYWtlKGEsIDIsIHNpemVvZihhcF9jb25mX3ZlY3Rvcl90ICopKTsKLSNpZmRlZiBXSU4zMgotICAgIGNvbmYtPnNjcmlwdF9pbnRlcnByZXRlcl9zb3VyY2UgPSBJTlRFUlBSRVRFUl9TT1VSQ0VfVU5TRVQ7Ci0jZW5kaWYKLQotICAgIGNvbmYtPnNlcnZlcl9zaWduYXR1cmUgPSBzcnZfc2lnX3Vuc2V0OwotCi0gICAgY29uZi0+YWRkX2RlZmF1bHRfY2hhcnNldCA9IEFERF9ERUZBVUxUX0NIQVJTRVRfVU5TRVQ7Ci0gICAgY29uZi0+YWRkX2RlZmF1bHRfY2hhcnNldF9uYW1lID0gREVGQVVMVF9BRERfREVGQVVMVF9DSEFSU0VUX05BTUU7Ci0KLSAgICBjb25mLT5vdXRwdXRfZmlsdGVycyA9IGFwcl9hcnJheV9tYWtlKGEsIDIsIHNpemVvZih2b2lkICopKTsKLSAgICBjb25mLT5pbnB1dF9maWx0ZXJzID0gYXByX2FycmF5X21ha2UoYSwgMiwgc2l6ZW9mKHZvaWQgKikpOwotICAgIHJldHVybiAodm9pZCAqKWNvbmY7Ci19Ci0KLXN0YXRpYyB2b2lkICptZXJnZV9jb3JlX2Rpcl9jb25maWdzKGFwcl9wb29sX3QgKmEsIHZvaWQgKmJhc2V2LCB2b2lkICpuZXd2KQotewotICAgIGNvcmVfZGlyX2NvbmZpZyAqYmFzZSA9IChjb3JlX2Rpcl9jb25maWcgKiliYXNldjsKLSAgICBjb3JlX2Rpcl9jb25maWcgKm5ldyA9IChjb3JlX2Rpcl9jb25maWcgKiluZXd2OwotICAgIGNvcmVfZGlyX2NvbmZpZyAqY29uZjsKLSAgICBpbnQgaTsKLSAgCi0gICAgY29uZiA9IChjb3JlX2Rpcl9jb25maWcgKilhcHJfcGFsbG9jKGEsIHNpemVvZihjb3JlX2Rpcl9jb25maWcpKTsKLSAgICBtZW1jcHkoKGNoYXIgKiljb25mLCAoY29uc3QgY2hhciAqKWJhc2UsIHNpemVvZihjb3JlX2Rpcl9jb25maWcpKTsKLSAgICBpZiAoYmFzZS0+cmVzcG9uc2VfY29kZV9zdHJpbmdzKSB7Ci0JY29uZi0+cmVzcG9uc2VfY29kZV9zdHJpbmdzID0KLQkgICAgYXByX3BhbGxvYyhhLCBzaXplb2YoKmNvbmYtPnJlc3BvbnNlX2NvZGVfc3RyaW5ncykKLQkJICAgICAgKiBSRVNQT05TRV9DT0RFUyk7Ci0JbWVtY3B5KGNvbmYtPnJlc3BvbnNlX2NvZGVfc3RyaW5ncywgYmFzZS0+cmVzcG9uc2VfY29kZV9zdHJpbmdzLAotCSAgICAgICBzaXplb2YoKmNvbmYtPnJlc3BvbnNlX2NvZGVfc3RyaW5ncykgKiBSRVNQT05TRV9DT0RFUyk7Ci0gICAgfQotICAgIAotICAgIGNvbmYtPmQgPSBuZXctPmQ7Ci0gICAgY29uZi0+ZF9pc19mbm1hdGNoID0gbmV3LT5kX2lzX2ZubWF0Y2g7Ci0gICAgY29uZi0+ZF9jb21wb25lbnRzID0gbmV3LT5kX2NvbXBvbmVudHM7Ci0gICAgY29uZi0+ciA9IG5ldy0+cjsKLSAgICAKLSAgICBpZiAobmV3LT5vcHRzICYgT1BUX1VOU0VUKSB7Ci0JLyogdGhlcmUgd2FzIG5vIGV4cGxpY2l0IHNldHRpbmcgb2YgbmV3LT5vcHRzLCBzbyB3ZSBtZXJnZQotCSAqIHByZXNlcnZlIHRoZSBpbnZhcmlhbnQgKG9wdHNfYWRkICYgb3B0c19yZW1vdmUpID09IDAKLQkgKi8KLQljb25mLT5vcHRzX2FkZCA9IChjb25mLT5vcHRzX2FkZCAmIH5uZXctPm9wdHNfcmVtb3ZlKSB8IG5ldy0+b3B0c19hZGQ7Ci0JY29uZi0+b3B0c19yZW1vdmUgPSAoY29uZi0+b3B0c19yZW1vdmUgJiB+bmV3LT5vcHRzX2FkZCkKLQkgICAgICAgICAgICAgICAgICAgIHwgbmV3LT5vcHRzX3JlbW92ZTsKLQljb25mLT5vcHRzID0gKGNvbmYtPm9wdHMgJiB+Y29uZi0+b3B0c19yZW1vdmUpIHwgY29uZi0+b3B0c19hZGQ7Ci0gICAgICAgIGlmICgoYmFzZS0+b3B0cyAmIE9QVF9JTkNOT0VYRUMpICYmIChuZXctPm9wdHMgJiBPUFRfSU5DTFVERVMpKSB7Ci0gICAgICAgICAgICBjb25mLT5vcHRzID0gKGNvbmYtPm9wdHMgJiB+T1BUX0lOQ05PRVhFQykgfCBPUFRfSU5DTFVERVM7Ci0JfQotICAgIH0KLSAgICBlbHNlIHsKLQkvKiBvdGhlcndpc2Ugd2UganVzdCBjb3B5LCBiZWNhdXNlIGFuIGV4cGxpY2l0IG9wdHMgc2V0dGluZwotCSAqIG92ZXJyaWRlcyBhbGwgZWFybGllciArLy0gbW9kaWZpZXJzCi0JICovCi0JY29uZi0+b3B0cyA9IG5ldy0+b3B0czsKLQljb25mLT5vcHRzX2FkZCA9IG5ldy0+b3B0c19hZGQ7Ci0JY29uZi0+b3B0c19yZW1vdmUgPSBuZXctPm9wdHNfcmVtb3ZlOwotICAgIH0KLQotICAgIGlmICghKG5ldy0+b3ZlcnJpZGUgJiBPUl9VTlNFVCkpIHsKLSAgICAgICAgY29uZi0+b3ZlcnJpZGUgPSBuZXctPm92ZXJyaWRlOwotICAgIH0KLSAgICBpZiAobmV3LT5hcF9kZWZhdWx0X3R5cGUpIHsKLSAgICAgICAgY29uZi0+YXBfZGVmYXVsdF90eXBlID0gbmV3LT5hcF9kZWZhdWx0X3R5cGU7Ci0gICAgfQotICAgIAotICAgIGlmIChuZXctPmFwX2F1dGhfdHlwZSkgewotICAgICAgICBjb25mLT5hcF9hdXRoX3R5cGUgPSBuZXctPmFwX2F1dGhfdHlwZTsKLSAgICB9Ci0gICAgaWYgKG5ldy0+YXBfYXV0aF9uYW1lKSB7Ci0gICAgICAgIGNvbmYtPmFwX2F1dGhfbmFtZSA9IG5ldy0+YXBfYXV0aF9uYW1lOwotICAgIH0KLSAgICBpZiAobmV3LT5hcF9yZXF1aXJlcykgewotICAgICAgICBjb25mLT5hcF9yZXF1aXJlcyA9IG5ldy0+YXBfcmVxdWlyZXM7Ci0gICAgfQotCi0gICAgaWYgKG5ldy0+cmVzcG9uc2VfY29kZV9zdHJpbmdzKSB7Ci0JaWYgKGNvbmYtPnJlc3BvbnNlX2NvZGVfc3RyaW5ncyA9PSBOVUxMKSB7Ci0JICAgIGNvbmYtPnJlc3BvbnNlX2NvZGVfc3RyaW5ncyA9IGFwcl9wYWxsb2MoYSwKLQkJc2l6ZW9mKCpjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3MpICogUkVTUE9OU0VfQ09ERVMpOwotCSAgICBtZW1jcHkoY29uZi0+cmVzcG9uc2VfY29kZV9zdHJpbmdzLCBuZXctPnJlc3BvbnNlX2NvZGVfc3RyaW5ncywKLQkJICAgc2l6ZW9mKCpjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3MpICogUkVTUE9OU0VfQ09ERVMpOwotCX0KLQllbHNlIHsKLQkgICAgZm9yIChpID0gMDsgaSA8IFJFU1BPTlNFX0NPREVTOyArK2kpIHsKLQkgICAgICAgIGlmIChuZXctPnJlc3BvbnNlX2NvZGVfc3RyaW5nc1tpXSAhPSBOVUxMKSB7Ci0JCSAgICBjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3NbaV0KLQkJICAgICAgICA9IG5ldy0+cmVzcG9uc2VfY29kZV9zdHJpbmdzW2ldOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIGlmIChuZXctPmhvc3RuYW1lX2xvb2t1cHMgIT0gSE9TVE5BTUVfTE9PS1VQX1VOU0VUKSB7Ci0JY29uZi0+aG9zdG5hbWVfbG9va3VwcyA9IG5ldy0+aG9zdG5hbWVfbG9va3VwczsKLSAgICB9Ci0gICAgaWYgKChuZXctPmRvX3JmYzE0MTMgJiAyKSA9PSAwKSB7Ci0gICAgICAgIGNvbmYtPmRvX3JmYzE0MTMgPSBuZXctPmRvX3JmYzE0MTM7Ci0gICAgfQotICAgIGlmICgobmV3LT5jb250ZW50X21kNSAmIDIpID09IDApIHsKLSAgICAgICAgY29uZi0+Y29udGVudF9tZDUgPSBuZXctPmNvbnRlbnRfbWQ1OwotICAgIH0KLSAgICBpZiAobmV3LT51c2VfY2Fub25pY2FsX25hbWUgIT0gVVNFX0NBTk9OSUNBTF9OQU1FX1VOU0VUKSB7Ci0JY29uZi0+dXNlX2Nhbm9uaWNhbF9uYW1lID0gbmV3LT51c2VfY2Fub25pY2FsX25hbWU7Ci0gICAgfQotCi0jaWZkZWYgUkxJTUlUX0NQVQotICAgIGlmIChuZXctPmxpbWl0X2NwdSkgewotICAgICAgICBjb25mLT5saW1pdF9jcHUgPSBuZXctPmxpbWl0X2NwdTsKLSAgICB9Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFJMSU1JVF9EQVRBKSB8fCBkZWZpbmVkKFJMSU1JVF9WTUVNKSB8fCBkZWZpbmVkKFJMSU1JVF9BUykKLSAgICBpZiAobmV3LT5saW1pdF9tZW0pIHsKLSAgICAgICAgY29uZi0+bGltaXRfbWVtID0gbmV3LT5saW1pdF9tZW07Ci0gICAgfQotI2VuZGlmCi0jaWZkZWYgUkxJTUlUX05QUk9DCi0gICAgaWYgKG5ldy0+bGltaXRfbnByb2MpIHsKLSAgICAgICAgY29uZi0+bGltaXRfbnByb2MgPSBuZXctPmxpbWl0X25wcm9jOwotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKG5ldy0+bGltaXRfcmVxX2JvZHkpIHsKLSAgICAgICAgY29uZi0+bGltaXRfcmVxX2JvZHkgPSBuZXctPmxpbWl0X3JlcV9ib2R5OwotICAgIH0KLQotICAgIGlmIChuZXctPmxpbWl0X3htbF9ib2R5ICE9IEFQX0xJTUlUX1VOU0VUKQotICAgICAgICBjb25mLT5saW1pdF94bWxfYm9keSA9IG5ldy0+bGltaXRfeG1sX2JvZHk7Ci0gICAgZWxzZQotICAgICAgICBjb25mLT5saW1pdF94bWxfYm9keSA9IGJhc2UtPmxpbWl0X3htbF9ib2R5OwotCi0gICAgY29uZi0+c2VjID0gYXByX2FycmF5X2FwcGVuZChhLCBiYXNlLT5zZWMsIG5ldy0+c2VjKTsKLQotICAgIGlmIChuZXctPnNhdGlzZnkgIT0gU0FUSVNGWV9OT1NQRUMpIHsKLSAgICAgICAgY29uZi0+c2F0aXNmeSA9IG5ldy0+c2F0aXNmeTsKLSAgICB9Ci0KLSNpZmRlZiBXSU4zMgotICAgIGlmIChuZXctPnNjcmlwdF9pbnRlcnByZXRlcl9zb3VyY2UgIT0gSU5URVJQUkVURVJfU09VUkNFX1VOU0VUKSB7Ci0gICAgICAgIGNvbmYtPnNjcmlwdF9pbnRlcnByZXRlcl9zb3VyY2UgPSBuZXctPnNjcmlwdF9pbnRlcnByZXRlcl9zb3VyY2U7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpZiAobmV3LT5zZXJ2ZXJfc2lnbmF0dXJlICE9IHNydl9zaWdfdW5zZXQpIHsKLQljb25mLT5zZXJ2ZXJfc2lnbmF0dXJlID0gbmV3LT5zZXJ2ZXJfc2lnbmF0dXJlOwotICAgIH0KLQotICAgIGlmIChuZXctPmFkZF9kZWZhdWx0X2NoYXJzZXQgIT0gQUREX0RFRkFVTFRfQ0hBUlNFVF9VTlNFVCkgewotCWNvbmYtPmFkZF9kZWZhdWx0X2NoYXJzZXQgPSBuZXctPmFkZF9kZWZhdWx0X2NoYXJzZXQ7Ci0JaWYgKG5ldy0+YWRkX2RlZmF1bHRfY2hhcnNldF9uYW1lKSB7Ci0JICAgIGNvbmYtPmFkZF9kZWZhdWx0X2NoYXJzZXRfbmFtZSA9IG5ldy0+YWRkX2RlZmF1bHRfY2hhcnNldF9uYW1lOwotCX0KLSAgICB9Ci0gICAgY29uZi0+b3V0cHV0X2ZpbHRlcnMgPSBhcHJfYXJyYXlfYXBwZW5kKGEsIGJhc2UtPm91dHB1dF9maWx0ZXJzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldy0+b3V0cHV0X2ZpbHRlcnMpOwotICAgIGNvbmYtPmlucHV0X2ZpbHRlcnMgPSBhcHJfYXJyYXlfYXBwZW5kKGEsIGJhc2UtPmlucHV0X2ZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldy0+aW5wdXRfZmlsdGVycyk7Ci0KLSAgICByZXR1cm4gKHZvaWQqKWNvbmY7Ci19Ci0KLXN0YXRpYyB2b2lkICpjcmVhdGVfY29yZV9zZXJ2ZXJfY29uZmlnKGFwcl9wb29sX3QgKmEsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgY29yZV9zZXJ2ZXJfY29uZmlnICpjb25mOwotICAgIGludCBpc192aXJ0dWFsID0gcy0+aXNfdmlydHVhbDsKLSAgCi0gICAgY29uZiA9IChjb3JlX3NlcnZlcl9jb25maWcgKilhcHJfcGNhbGxvYyhhLCBzaXplb2YoY29yZV9zZXJ2ZXJfY29uZmlnKSk7Ci0jaWZkZWYgR1BST0YKLSAgICBjb25mLT5ncHJvZl9kaXIgPSBOVUxMOwotI2VuZGlmCi0gICAgY29uZi0+YWNjZXNzX25hbWUgPSBpc192aXJ0dWFsID8gTlVMTCA6IERFRkFVTFRfQUNDRVNTX0ZOQU1FOwotICAgIGNvbmYtPmFwX2RvY3VtZW50X3Jvb3QgPSBpc192aXJ0dWFsID8gTlVMTCA6IERPQ1VNRU5UX0xPQ0FUSU9OOwotICAgIGNvbmYtPnNlYyA9IGFwcl9hcnJheV9tYWtlKGEsIDQwLCBzaXplb2YoYXBfY29uZl92ZWN0b3JfdCAqKSk7Ci0gICAgY29uZi0+c2VjX3VybCA9IGFwcl9hcnJheV9tYWtlKGEsIDQwLCBzaXplb2YoYXBfY29uZl92ZWN0b3JfdCAqKSk7Ci0gICAgCi0gICAgcmV0dXJuICh2b2lkICopY29uZjsKLX0KLQotc3RhdGljIHZvaWQgKm1lcmdlX2NvcmVfc2VydmVyX2NvbmZpZ3MoYXByX3Bvb2xfdCAqcCwgdm9pZCAqYmFzZXYsIHZvaWQgKnZpcnR2KQotewotICAgIGNvcmVfc2VydmVyX2NvbmZpZyAqYmFzZSA9IChjb3JlX3NlcnZlcl9jb25maWcgKiliYXNldjsKLSAgICBjb3JlX3NlcnZlcl9jb25maWcgKnZpcnQgPSAoY29yZV9zZXJ2ZXJfY29uZmlnICopdmlydHY7Ci0gICAgY29yZV9zZXJ2ZXJfY29uZmlnICpjb25mOwotCi0gICAgY29uZiA9IChjb3JlX3NlcnZlcl9jb25maWcgKilhcHJfcGNhbGxvYyhwLCBzaXplb2YoY29yZV9zZXJ2ZXJfY29uZmlnKSk7Ci0gICAgKmNvbmYgPSAqdmlydDsKLSAgICBpZiAoIWNvbmYtPmFjY2Vzc19uYW1lKSB7Ci0gICAgICAgIGNvbmYtPmFjY2Vzc19uYW1lID0gYmFzZS0+YWNjZXNzX25hbWU7Ci0gICAgfQotICAgIGlmICghY29uZi0+YXBfZG9jdW1lbnRfcm9vdCkgewotICAgICAgICBjb25mLT5hcF9kb2N1bWVudF9yb290ID0gYmFzZS0+YXBfZG9jdW1lbnRfcm9vdDsKLSAgICB9Ci0gICAgY29uZi0+c2VjID0gYXByX2FycmF5X2FwcGVuZChwLCBiYXNlLT5zZWMsIHZpcnQtPnNlYyk7Ci0gICAgY29uZi0+c2VjX3VybCA9IGFwcl9hcnJheV9hcHBlbmQocCwgYmFzZS0+c2VjX3VybCwgdmlydC0+c2VjX3VybCk7Ci0KLSAgICByZXR1cm4gY29uZjsKLX0KLQotLyogQWRkIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiBlbnRyeSAoZm9yIDxkaXJlY3Rvcnk+IHNlY3Rpb24pOwotICogdGhlc2UgYXJlIHBhcnQgb2YgdGhlIGNvcmUgc2VydmVyIGNvbmZpZy4KLSAqLwotCi1BUF9DT1JFX0RFQ0xBUkUodm9pZCkgYXBfYWRkX3Blcl9kaXJfY29uZihzZXJ2ZXJfcmVjICpzLCB2b2lkICpkaXJfY29uZmlnKQotewotICAgIGNvcmVfc2VydmVyX2NvbmZpZyAqc2NvbmYgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLAotCQkJCQkJICAgICAmY29yZV9tb2R1bGUpOwotICAgIHZvaWQgKipuZXdfc3BhY2UgPSAodm9pZCAqKilhcHJfYXJyYXlfcHVzaChzY29uZi0+c2VjKTsKLSAgICAKLSAgICAqbmV3X3NwYWNlID0gZGlyX2NvbmZpZzsKLX0KLQotQVBfQ09SRV9ERUNMQVJFKHZvaWQpIGFwX2FkZF9wZXJfdXJsX2NvbmYoc2VydmVyX3JlYyAqcywgdm9pZCAqdXJsX2NvbmZpZykKLXsKLSAgICBjb3JlX3NlcnZlcl9jb25maWcgKnNjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywKLQkJCQkJCSAgICAgJmNvcmVfbW9kdWxlKTsKLSAgICB2b2lkICoqbmV3X3NwYWNlID0gKHZvaWQgKiopYXByX2FycmF5X3B1c2goc2NvbmYtPnNlY191cmwpOwotICAgIAotICAgICpuZXdfc3BhY2UgPSB1cmxfY29uZmlnOwotfQotCi1BUF9DT1JFX0RFQ0xBUkUodm9pZCkgYXBfYWRkX2ZpbGVfY29uZihjb3JlX2Rpcl9jb25maWcgKmNvbmYsIHZvaWQgKnVybF9jb25maWcpCi17Ci0gICAgdm9pZCAqKm5ld19zcGFjZSA9ICh2b2lkICoqKWFwcl9hcnJheV9wdXNoKGNvbmYtPnNlYyk7Ci0gICAgCi0gICAgKm5ld19zcGFjZSA9IHVybF9jb25maWc7Ci19Ci0KLS8qIGNvcmVfcmVvcmRlcl9kaXJlY3RvcmllcyByZW9yZGVycyB0aGUgZGlyZWN0b3J5IHNlY3Rpb25zIHN1Y2ggdGhhdCB0aGUKLSAqIDEtY29tcG9uZW50IHNlY3Rpb25zIGNvbWUgZmlyc3QsIHRoZW4gdGhlIDItY29tcG9uZW50LCBhbmQgc28gb24sIGZpbmFsbHkKLSAqIGZvbGxvd2VkIGJ5IHRoZSAic3BlY2lhbCIgc2VjdGlvbnMuICBBIHNlY3Rpb24gaXMgInNwZWNpYWwiIGlmIGl0J3MgYSByZWdleCwKLSAqIG9yIGlmIGl0IGRvZXNuJ3Qgc3RhcnQgd2l0aCAvIC0tIGNvbnNpZGVyIHByb3h5OiBtYXRjaGluZy4gIEFsbCBtb3ZlbWVudHMKLSAqIGFyZSBpbi1vcmRlciB0byBwcmVzZXJ2ZSB0aGUgb3JkZXJpbmcgb2YgdGhlIHNlY3Rpb25zIGZyb20gdGhlIGNvbmZpZyBmaWxlcy4KLSAqIFNlZSBkaXJlY3Rvcnlfd2FsaygpLgotICovCi0KLSNpZiBkZWZpbmVkKEhBVkVfRFJJVkVfTEVUVEVSUykKLSNkZWZpbmUgSVNfU1BFQ0lBTChlbnRyeV9jb3JlKQlcCi0gICAgKChlbnRyeV9jb3JlKS0+ciAhPSBOVUxMIFwKLQl8fCAoKGVudHJ5X2NvcmUpLT5kWzBdICE9ICcvJyAmJiAoZW50cnlfY29yZSktPmRbMV0gIT0gJzonKSkKLSNlbGlmIGRlZmluZWQoTkVUV0FSRSkKLS8qIFhYWDogRmFpcmx5IGNlcnRhaW4gdGhpcyBpcyBjb3JyZWN0Li4uICcvJyBtdXN0IHByZWZpeCB0aGUgcGF0aAotICogICAgICBvciBlbHNlIGluIHRoZSBjYXNlIHh5ejovIG9yIGFiYy94eXo6LywgJy8nIG11c3QgZm9sbG93IHRoZSAnOicuCi0gKiAgICAgIElmIHRoZXJlIGlzIG5vIGxlYWRpbmcgJy8nIG9yIGVtYmVkZGVkICc6LycsIHRoZW4gd2UgYXJlIHNwZWNpYWwuCi0gKi8KLSNkZWZpbmUgSVNfU1BFQ0lBTChlbnRyeV9jb3JlKQlcCi0gICAgKChlbnRyeV9jb3JlKS0+ciAhPSBOVUxMIFwKLQl8fCAoKGVudHJ5X2NvcmUpLT5kWzBdICE9ICcvJyBcCi0gICAgICAgICAgICAmJiBzdHJjaHIoKGVudHJ5X2NvcmUpLT5kLCAnOicpIFwKLSAgICAgICAgICAgICYmICooc3RyY2hyKChlbnRyeV9jb3JlKS0+ZCwgJzonKSArIDEpICE9ICcvJykpCi0jZWxzZQotI2RlZmluZSBJU19TUEVDSUFMKGVudHJ5X2NvcmUpCVwKLSAgICAoKGVudHJ5X2NvcmUpLT5yICE9IE5VTEwgfHwgKGVudHJ5X2NvcmUpLT5kWzBdICE9ICcvJykKLSNlbmRpZgotCi0vKiBXZSBuZWVkIHRvIGRvIGEgc3RhYmxlIHNvcnQsIHFzb3J0IGlzbid0IHN0YWJsZS4gIFNvIHRvIG1ha2UgaXQgc3RhYmxlCi0gKiB3ZSdsbCBiZSBtYWludGFpbmluZyB0aGUgb3JpZ2luYWwgaW5kZXggaW50byB0aGUgbGlzdCwgYW5kIHVzaW5nIGl0Ci0gKiBhcyB0aGUgbWlub3Iga2V5IGR1cmluZyBzb3J0aW5nLiAgVGhlIG1ham9yIGtleSBpcyB0aGUgbnVtYmVyIG9mCi0gKiBjb21wb25lbnRzICh3aGVyZSBhICJzcGVjaWFsIiBzZWN0aW9uIGhhcyBpbmZpbml0ZSBjb21wb25lbnRzKS4KLSAqLwotc3RydWN0IHJlb3JkZXJfc29ydF9yZWMgewotICAgIGFwX2NvbmZfdmVjdG9yX3QgKmVsdDsKLSAgICBpbnQgb3JpZ19pbmRleDsKLX07Ci0KLXN0YXRpYyBpbnQgcmVvcmRlcl9zb3J0ZXIoY29uc3Qgdm9pZCAqdmEsIGNvbnN0IHZvaWQgKnZiKQotewotICAgIGNvbnN0IHN0cnVjdCByZW9yZGVyX3NvcnRfcmVjICphID0gdmE7Ci0gICAgY29uc3Qgc3RydWN0IHJlb3JkZXJfc29ydF9yZWMgKmIgPSB2YjsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvcmVfYTsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvcmVfYjsKLQotICAgIGNvcmVfYSA9IGFwX2dldF9tb2R1bGVfY29uZmlnKGEtPmVsdCwgJmNvcmVfbW9kdWxlKTsKLSAgICBjb3JlX2IgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhiLT5lbHQsICZjb3JlX21vZHVsZSk7Ci0gICAgaWYgKElTX1NQRUNJQUwoY29yZV9hKSkgewotCWlmICghSVNfU1BFQ0lBTChjb3JlX2IpKSB7Ci0JICAgIHJldHVybiAxOwotCX0KLSAgICB9Ci0gICAgZWxzZSBpZiAoSVNfU1BFQ0lBTChjb3JlX2IpKSB7Ci0JcmV0dXJuIC0xOwotICAgIH0KLSAgICBlbHNlIHsKLQkvKiB3ZSBrbm93IHRoZXkncmUgYm90aCBub3Qgc3BlY2lhbCAqLwotCWlmIChjb3JlX2EtPmRfY29tcG9uZW50cyA8IGNvcmVfYi0+ZF9jb21wb25lbnRzKSB7Ci0JICAgIHJldHVybiAtMTsKLQl9Ci0JZWxzZSBpZiAoY29yZV9hLT5kX2NvbXBvbmVudHMgPiBjb3JlX2ItPmRfY29tcG9uZW50cykgewotCSAgICByZXR1cm4gMTsKLQl9Ci0gICAgfQotICAgIC8qIEVpdGhlciB0aGV5J3JlIGJvdGggc3BlY2lhbCwgb3IgdGhleSdyZSBib3RoIG5vdCBzcGVjaWFsIGFuZCBoYXZlIHRoZQotICAgICAqIHNhbWUgbnVtYmVyIG9mIGNvbXBvbmVudHMuICBJbiBhbnkgZXZlbnQsIHdlIG5vdyBoYXZlIHRvIGNvbXBhcmUKLSAgICAgKiB0aGUgbWlub3Iga2V5LiAqLwotICAgIHJldHVybiBhLT5vcmlnX2luZGV4IC0gYi0+b3JpZ19pbmRleDsKLX0KLQotdm9pZCBhcF9jb3JlX3Jlb3JkZXJfZGlyZWN0b3JpZXMoYXByX3Bvb2xfdCAqcCwgc2VydmVyX3JlYyAqcykKLXsKLSAgICBjb3JlX3NlcnZlcl9jb25maWcgKnNjb25mOwotICAgIGFwcl9hcnJheV9oZWFkZXJfdCAqc2VjOwotICAgIHN0cnVjdCByZW9yZGVyX3NvcnRfcmVjICpzb3J0YmluOwotICAgIGludCBuZWx0czsKLSAgICBhcF9jb25mX3ZlY3Rvcl90ICoqZWx0czsKLSAgICBpbnQgaTsKLSAgICBhcHJfcG9vbF90ICp0bXA7Ci0KLSAgICBzY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsICZjb3JlX21vZHVsZSk7Ci0gICAgc2VjID0gc2NvbmYtPnNlYzsKLSAgICBuZWx0cyA9IHNlYy0+bmVsdHM7Ci0gICAgZWx0cyA9IChhcF9jb25mX3ZlY3Rvcl90ICoqKXNlYy0+ZWx0czsKLQotICAgIC8qIHdlIGhhdmUgdG8gYWxsb2NhdGUgdG1wIHNwYWNlIHRvIGRvIGEgc3RhYmxlIHNvcnQgKi8KLSAgICBhcHJfcG9vbF9jcmVhdGUoJnRtcCwgcCk7Ci0gICAgc29ydGJpbiA9IGFwcl9wYWxsb2ModG1wLCBzZWMtPm5lbHRzICogc2l6ZW9mKCpzb3J0YmluKSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5lbHRzOyArK2kpIHsKLQlzb3J0YmluW2ldLm9yaWdfaW5kZXggPSBpOwotCXNvcnRiaW5baV0uZWx0ID0gZWx0c1tpXTsKLSAgICB9Ci0KLSAgICBxc29ydChzb3J0YmluLCBuZWx0cywgc2l6ZW9mKCpzb3J0YmluKSwgcmVvcmRlcl9zb3J0ZXIpOwotCi0gICAgLyogYW5kIG5vdyBjb3B5IGJhY2sgdG8gdGhlIG9yaWdpbmFsIGFycmF5ICovCi0gICAgZm9yIChpID0gMDsgaSA8IG5lbHRzOyArK2kpIHsKLSAgICAgIGVsdHNbaV0gPSBzb3J0YmluW2ldLmVsdDsKLSAgICB9Ci0KLSAgICBhcHJfcG9vbF9kZXN0cm95KHRtcCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoZXJlIGFyZSBzb21lIGVsZW1lbnRzIG9mIHRoZSBjb3JlIGNvbmZpZyBzdHJ1Y3R1cmVzIGluIHdoaWNoCi0gKiBvdGhlciBtb2R1bGVzIGhhdmUgYSBsZWdpdGltYXRlIGludGVyZXN0ICh0aGlzIGlzIHVnbHksIGJ1dCBuZWNlc3NhcnkKLSAqIHRvIHByZXNlcnZlIE5DU0EgYmFjay1jb21wYXRpYmlsaXR5KS4gIFNvLCB3ZSBoYXZlIGEgYnVuY2ggb2YgYWNjZXNzb3JzCi0gKiBoZXJlLi4uCi0gKi8KLQotQVBfREVDTEFSRShpbnQpIGFwX2FsbG93X29wdGlvbnMocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY29yZV9kaXJfY29uZmlnICpjb25mID0gCi0gICAgICAoY29yZV9kaXJfY29uZmlnICopYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsICZjb3JlX21vZHVsZSk7IAotCi0gICAgcmV0dXJuIGNvbmYtPm9wdHM7IAotfSAKLQotQVBfREVDTEFSRShpbnQpIGFwX2FsbG93X292ZXJyaWRlcyhyZXF1ZXN0X3JlYyAqcikgCi17IAotICAgIGNvcmVfZGlyX2NvbmZpZyAqY29uZjsKLSAgICBjb25mID0gKGNvcmVfZGlyX2NvbmZpZyAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLAotCQkJCQkJICAgJmNvcmVfbW9kdWxlKTsgCi0KLSAgICByZXR1cm4gY29uZi0+b3ZlcnJpZGU7IAotfSAKLQotQVBfREVDTEFSRShjb25zdCBjaGFyICopIGFwX2F1dGhfdHlwZShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvbmY7Ci0KLSAgICBjb25mID0gKGNvcmVfZGlyX2NvbmZpZyAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLAotCQkJCQkJICAgJmNvcmVfbW9kdWxlKTsgCi0gICAgcmV0dXJuIGNvbmYtPmFwX2F1dGhfdHlwZTsKLX0KLQotQVBfREVDTEFSRShjb25zdCBjaGFyICopIGFwX2F1dGhfbmFtZShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvbmY7Ci0KLSAgICBjb25mID0gKGNvcmVfZGlyX2NvbmZpZyAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLAotCQkJCQkJICAgJmNvcmVfbW9kdWxlKTsgCi0gICAgcmV0dXJuIGNvbmYtPmFwX2F1dGhfbmFtZTsKLX0KLQotQVBfREVDTEFSRShjb25zdCBjaGFyICopIGFwX2RlZmF1bHRfdHlwZShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvbmY7Ci0KLSAgICBjb25mID0gKGNvcmVfZGlyX2NvbmZpZyAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLAotCQkJCQkJICAgJmNvcmVfbW9kdWxlKTsgCi0gICAgcmV0dXJuIGNvbmYtPmFwX2RlZmF1bHRfdHlwZSAKLSAgICAgICAgICAgICAgID8gY29uZi0+YXBfZGVmYXVsdF90eXBlIAotICAgICAgICAgICAgICAgOiBERUZBVUxUX0NPTlRFTlRfVFlQRTsKLX0KLQotQVBfREVDTEFSRShjb25zdCBjaGFyICopIGFwX2RvY3VtZW50X3Jvb3QocmVxdWVzdF9yZWMgKnIpIC8qIERvbid0IHVzZSB0aGlzISAqLwotewotICAgIGNvcmVfc2VydmVyX2NvbmZpZyAqY29uZjsKLQotICAgIGNvbmYgPSAoY29yZV9zZXJ2ZXJfY29uZmlnICopYXBfZ2V0X21vZHVsZV9jb25maWcoci0+c2VydmVyLT5tb2R1bGVfY29uZmlnLAotCQkJCQkJICAgICAgJmNvcmVfbW9kdWxlKTsgCi0gICAgcmV0dXJuIGNvbmYtPmFwX2RvY3VtZW50X3Jvb3Q7Ci19Ci0KLUFQX0RFQ0xBUkUoY29uc3QgYXByX2FycmF5X2hlYWRlcl90ICopIGFwX3JlcXVpcmVzKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvcmVfZGlyX2NvbmZpZyAqY29uZjsKLQotICAgIGNvbmYgPSAoY29yZV9kaXJfY29uZmlnICopYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCQkgICAmY29yZV9tb2R1bGUpOyAKLSAgICByZXR1cm4gY29uZi0+YXBfcmVxdWlyZXM7Ci19Ci0KLUFQX0RFQ0xBUkUoaW50KSBhcF9zYXRpc2ZpZXMocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY29yZV9kaXJfY29uZmlnICpjb25mOwotCi0gICAgY29uZiA9IChjb3JlX2Rpcl9jb25maWcgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywKLQkJCQkJCSAgICZjb3JlX21vZHVsZSk7Ci0KLSAgICByZXR1cm4gY29uZi0+c2F0aXNmeTsKLX0KLQotLyogU2hvdWxkIHByb2JhYmx5IGp1c3QgZ2V0IHJpZCBvZiB0aGlzLi4uIHRoZSBvbmx5IGNvZGUgdGhhdCBjYXJlcyBpcwotICogcGFydCBvZiB0aGUgY29yZSBhbnl3YXkgKGFuZCBpbiBmYWN0LCBpdCBpc24ndCBwdWJsaWNpc2VkIHRvIG90aGVyCi0gKiBtb2R1bGVzKS4KLSAqLwotCi1jaGFyICphcF9yZXNwb25zZV9jb2RlX3N0cmluZyhyZXF1ZXN0X3JlYyAqciwgaW50IGVycm9yX2luZGV4KQotewotICAgIGNvcmVfZGlyX2NvbmZpZyAqY29uZjsKLQotICAgIGNvbmYgPSAoY29yZV9kaXJfY29uZmlnICopYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCQkgICAmY29yZV9tb2R1bGUpOyAKLQotICAgIGlmIChjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3MgPT0gTlVMTCkgewotCXJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gY29uZi0+cmVzcG9uc2VfY29kZV9zdHJpbmdzW2Vycm9yX2luZGV4XTsKLX0KLQotCi0vKiBDb2RlIGZyb20gSGFyYWxkIEhhbmNoZS1PbHNlbiA8aGFuY2hlQGltZi51bml0Lm5vPiAqLwotc3RhdGljIEFQUl9JTkxJTkUgdm9pZCBkb19kb3VibGVfcmV2ZXJzZSAoY29ubl9yZWMgKmNvbm4pCi17Ci0gICAgYXByX3NvY2thZGRyX3QgKnNhOwotICAgIGFwcl9zdGF0dXNfdCBydjsKLQotICAgIGlmIChjb25uLT5kb3VibGVfcmV2ZXJzZSkgewotCS8qIGFscmVhZHkgZG9uZSAqLwotCXJldHVybjsKLSAgICB9Ci0gICAgaWYgKGNvbm4tPnJlbW90ZV9ob3N0ID09IE5VTEwgfHwgY29ubi0+cmVtb3RlX2hvc3RbMF0gPT0gJ1wwJykgewotCS8qIHNpbmdsZSByZXZlcnNlIGZhaWxlZCwgc28gZG9uJ3QgYm90aGVyICovCi0JY29ubi0+ZG91YmxlX3JldmVyc2UgPSAtMTsKLQlyZXR1cm47Ci0gICAgfQotICAgIHJ2ID0gYXByX3NvY2thZGRyX2luZm9fZ2V0KCZzYSwgY29ubi0+cmVtb3RlX2hvc3QsIEFQUl9VTlNQRUMsIDAsIDAsIGNvbm4tPnBvb2wpOwotICAgIGlmIChydiA9PSBBUFJfU1VDQ0VTUykgewotICAgICAgICB3aGlsZSAoc2EpIHsKLSAgICAgICAgICAgIGlmIChzYS0+aXBhZGRyX2xlbiA9PSBjb25uLT5yZW1vdGVfYWRkci0+aXBhZGRyX2xlbiAmJgotICAgICAgICAgICAgICAgICFtZW1jbXAoc2EtPmlwYWRkcl9wdHIsIGNvbm4tPnJlbW90ZV9hZGRyLT5pcGFkZHJfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgc2EtPmlwYWRkcl9sZW4pKSB7Ci0gICAgICAgICAgICAgICAgY29ubi0+ZG91YmxlX3JldmVyc2UgPSAxOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNhID0gc2EtPm5leHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgY29ubi0+ZG91YmxlX3JldmVyc2UgPSAtMTsKLX0KLQotQVBfREVDTEFSRShjb25zdCBjaGFyICopIGFwX2dldF9yZW1vdGVfaG9zdChjb25uX3JlYyAqY29ubiwgdm9pZCAqZGlyX2NvbmZpZywKLQkJCQkJICAgIGludCB0eXBlKQotewotICAgIGludCBob3N0bmFtZV9sb29rdXBzOwotCi0gICAgLyogSWYgd2UgaGF2ZW4ndCBjaGVja2VkIHRoZSBob3N0IG5hbWUsIGFuZCB3ZSB3YW50IHRvICovCi0gICAgaWYgKGRpcl9jb25maWcpIHsKLQlob3N0bmFtZV9sb29rdXBzID0KLQkgICAgKChjb3JlX2Rpcl9jb25maWcgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhkaXJfY29uZmlnLCAmY29yZV9tb2R1bGUpKQotCQktPmhvc3RuYW1lX2xvb2t1cHM7Ci0JaWYgKGhvc3RuYW1lX2xvb2t1cHMgPT0gSE9TVE5BTUVfTE9PS1VQX1VOU0VUKSB7Ci0JICAgIGhvc3RuYW1lX2xvb2t1cHMgPSBIT1NUTkFNRV9MT09LVVBfT0ZGOwotCX0KLSAgICB9Ci0gICAgZWxzZSB7Ci0JLyogdGhlIGRlZmF1bHQgKi8KLQlob3N0bmFtZV9sb29rdXBzID0gSE9TVE5BTUVfTE9PS1VQX09GRjsKLSAgICB9Ci0KLSAgICBpZiAodHlwZSAhPSBSRU1PVEVfTk9MT09LVVAKLQkmJiBjb25uLT5yZW1vdGVfaG9zdCA9PSBOVUxMCi0JJiYgKHR5cGUgPT0gUkVNT1RFX0RPVUJMRV9SRVYKLQkgICAgfHwgaG9zdG5hbWVfbG9va3VwcyAhPSBIT1NUTkFNRV9MT09LVVBfT0ZGKSkgewotICAgICAgICBhcHJfc29ja2FkZHJfdCAqcmVtb3RlX2FkZHI7Ci0KLSAgICAgICAgYXByX3NvY2tldF9hZGRyX2dldCgmcmVtb3RlX2FkZHIsIEFQUl9SRU1PVEUsIGNvbm4tPmNsaWVudF9zb2NrZXQpOwotCWlmIChhcHJfZ2V0bmFtZWluZm8oJmNvbm4tPnJlbW90ZV9ob3N0LCByZW1vdGVfYWRkciwgMCkgPT0gQVBSX1NVQ0NFU1MpIHsKLQkgICAgYXBfc3RyX3RvbG93ZXIoY29ubi0+cmVtb3RlX2hvc3QpOwotCSAgIAotCSAgICBpZiAoaG9zdG5hbWVfbG9va3VwcyA9PSBIT1NUTkFNRV9MT09LVVBfRE9VQkxFKSB7Ci0JCWRvX2RvdWJsZV9yZXZlcnNlKGNvbm4pOwotCQlpZiAoY29ubi0+ZG91YmxlX3JldmVyc2UgIT0gMSkgewotCQkgICAgY29ubi0+cmVtb3RlX2hvc3QgPSBOVUxMOwotCQl9Ci0JICAgIH0KLQl9Ci0JLyogaWYgZmFpbGVkLCBzZXQgaXQgdG8gdGhlIE5VTEwgc3RyaW5nIHRvIGluZGljYXRlIGVycm9yICovCi0JaWYgKGNvbm4tPnJlbW90ZV9ob3N0ID09IE5VTEwpIHsKLQkgICAgY29ubi0+cmVtb3RlX2hvc3QgPSAiIjsKLQl9Ci0gICAgfQotICAgIGlmICh0eXBlID09IFJFTU9URV9ET1VCTEVfUkVWKSB7Ci0JZG9fZG91YmxlX3JldmVyc2UoY29ubik7Ci0JaWYgKGNvbm4tPmRvdWJsZV9yZXZlcnNlID09IC0xKSB7Ci0JICAgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLS8qCi0gKiBSZXR1cm4gdGhlIGRlc2lyZWQgaW5mb3JtYXRpb247IGVpdGhlciB0aGUgcmVtb3RlIEROUyBuYW1lLCBpZiBmb3VuZCwKLSAqIG9yIGVpdGhlciBOVUxMIChpZiB0aGUgaG9zdG5hbWUgd2FzIHJlcXVlc3RlZCkgb3IgdGhlIElQIGFkZHJlc3MKLSAqIChpZiBhbnkgaWRlbnRpZmllciB3YXMgcmVxdWVzdGVkKS4KLSAqLwotICAgIGlmIChjb25uLT5yZW1vdGVfaG9zdCAhPSBOVUxMICYmIGNvbm4tPnJlbW90ZV9ob3N0WzBdICE9ICdcMCcpIHsKLQlyZXR1cm4gY29ubi0+cmVtb3RlX2hvc3Q7Ci0gICAgfQotICAgIGVsc2UgewotCWlmICh0eXBlID09IFJFTU9URV9IT1NUIHx8IHR5cGUgPT0gUkVNT1RFX0RPVUJMRV9SRVYpIHsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgewotCSAgICByZXR1cm4gY29ubi0+cmVtb3RlX2lwOwotCX0KLSAgICB9Ci19Ci0KLUFQX0RFQ0xBUkUoY29uc3QgY2hhciAqKSBhcF9nZXRfcmVtb3RlX2xvZ25hbWUocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY29yZV9kaXJfY29uZmlnICpkaXJfY29uZjsKLQotICAgIGlmIChyLT5jb25uZWN0aW9uLT5yZW1vdGVfbG9nbmFtZSAhPSBOVUxMKSB7Ci0JcmV0dXJuIHItPmNvbm5lY3Rpb24tPnJlbW90ZV9sb2duYW1lOwotICAgIH0KLQotLyogSWYgd2UgaGF2ZW4ndCBjaGVja2VkIHRoZSBpZGVudGl0eSwgYW5kIHdlIHdhbnQgdG8gKi8KLSAgICBkaXJfY29uZiA9IChjb3JlX2Rpcl9jb25maWcgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywKLQkJCQkJCSAgICAgICAmY29yZV9tb2R1bGUpOwotCi0gICAgaWYgKGRpcl9jb25mLT5kb19yZmMxNDEzICYgMSkgewotCXJldHVybiBhcF9yZmMxNDEzKHItPmNvbm5lY3Rpb24sIHItPnNlcnZlcik7Ci0gICAgfQotICAgIGVsc2UgewotCXJldHVybiBOVUxMOwotICAgIH0KLX0KLQotLyogVGhlcmUgYXJlIHR3byBvcHRpb25zIHJlZ2FyZGluZyB3aGF0IHRoZSAibmFtZSIgb2YgYSBzZXJ2ZXIgaXMuICBUaGUKLSAqICJjYW5vbmljYWwiIG5hbWUgYXMgZGVmaW5lZCBieSBTZXJ2ZXJOYW1lIGFuZCBQb3J0LCBvciB0aGUgImNsaWVudCdzCi0gKiBuYW1lIiBhcyBzdXBwbGllZCBieSBhIHBvc3NpYmxlIEhvc3Q6IGhlYWRlciBvciBmdWxsIFVSSS4gIFdlIG5ldmVyCi0gKiB0cnVzdCB0aGUgcG9ydCBwYXNzZWQgaW4gdGhlIGNsaWVudCdzIGhlYWRlcnMsIHdlIGFsd2F5cyB1c2UgdGhlCi0gKiBwb3J0IG9mIHRoZSBhY3R1YWwgc29ja2V0LgotICoKLSAqIFRoZSBETlMgb3B0aW9uIHRvIFVzZUNhbm9uaWNhbE5hbWUgY2F1c2VzIHRoaXMgcm91dGluZSB0byBkbyBhCi0gKiByZXZlcnNlIGxvb2t1cCBvbiB0aGUgbG9jYWwgSVAgYWRkcmVzcyBvZiB0aGUgY29ubmVjdGlvbiBhbmQgdXNlCi0gKiB0aGF0IGZvciB0aGUgU2VydmVyTmFtZS4gVGhpcyBtYWtlcyBpdHMgdmFsdWUgbW9yZSByZWxpYWJsZSB3aGlsZQotICogYXQgdGhlIHNhbWUgdGltZSBhbGxvd2luZyBEZW1vbidzIG1hZ2ljIHZpcnR1YWwgaG9zdGluZyB0byB3b3JrLgotICogVGhlIGFzc3VtcHRpb24gaXMgdGhhdCBETlMgbG9va3VwcyBhcmUgc3VmZmljaWVudGx5IHF1aWNrLi4uCi0gKiAtLSBmYW5mIDE5OTgtMTAtMDMKLSAqLwotQVBfREVDTEFSRShjb25zdCBjaGFyICopIGFwX2dldF9zZXJ2ZXJfbmFtZShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb25uX3JlYyAqY29ubiA9IHItPmNvbm5lY3Rpb247Ci0gICAgY29yZV9kaXJfY29uZmlnICpkOwotCi0gICAgZCA9IChjb3JlX2Rpcl9jb25maWcgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywKLQkJCQkJCSZjb3JlX21vZHVsZSk7Ci0KLSAgICBpZiAoZC0+dXNlX2Nhbm9uaWNhbF9uYW1lID09IFVTRV9DQU5PTklDQUxfTkFNRV9PRkYpIHsKLSAgICAgICAgcmV0dXJuIHItPmhvc3RuYW1lID8gci0+aG9zdG5hbWUgOiByLT5zZXJ2ZXItPnNlcnZlcl9ob3N0bmFtZTsKLSAgICB9Ci0gICAgaWYgKGQtPnVzZV9jYW5vbmljYWxfbmFtZSA9PSBVU0VfQ0FOT05JQ0FMX05BTUVfRE5TKSB7Ci0gICAgICAgIGlmIChjb25uLT5sb2NhbF9ob3N0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGFwcl9zb2NrYWRkcl90ICpsb2NhbF9hZGRyOwotCi0gICAgICAgICAgICBhcHJfc29ja2V0X2FkZHJfZ2V0KCZsb2NhbF9hZGRyLCBBUFJfTE9DQUwsIGNvbm4tPmNsaWVudF9zb2NrZXQpOwotICAgICAgICAgICAgaWYgKGFwcl9nZXRuYW1laW5mbygmY29ubi0+bG9jYWxfaG9zdCwgbG9jYWxfYWRkciwgMCkgIT0gQVBSX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgY29ubi0+bG9jYWxfaG9zdCA9IGFwcl9wc3RyZHVwKGNvbm4tPnBvb2wsIHItPnNlcnZlci0+c2VydmVyX2hvc3RuYW1lKTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGFwX3N0cl90b2xvd2VyKGNvbm4tPmxvY2FsX2hvc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0JcmV0dXJuIGNvbm4tPmxvY2FsX2hvc3Q7Ci0gICAgfQotICAgIC8qIGRlZmF1bHQgKi8KLSAgICByZXR1cm4gci0+c2VydmVyLT5zZXJ2ZXJfaG9zdG5hbWU7Ci19Ci0KLUFQX0RFQ0xBUkUoYXByX3BvcnRfdCkgYXBfZ2V0X3NlcnZlcl9wb3J0KGNvbnN0IHJlcXVlc3RfcmVjICpyKQotewotICAgIGFwcl9wb3J0X3QgcG9ydDsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmQgPQotICAgICAgKGNvcmVfZGlyX2NvbmZpZyAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLCAmY29yZV9tb2R1bGUpOwotICAgIAotICAgIHBvcnQgPSByLT5zZXJ2ZXItPnBvcnQgPyByLT5zZXJ2ZXItPnBvcnQgOiBhcF9kZWZhdWx0X3BvcnQocik7Ci0KLSAgICBpZiAoZC0+dXNlX2Nhbm9uaWNhbF9uYW1lID09IFVTRV9DQU5PTklDQUxfTkFNRV9PRkYKLQl8fCBkLT51c2VfY2Fub25pY2FsX25hbWUgPT0gVVNFX0NBTk9OSUNBTF9OQU1FX0ROUykgewotICAgICAgICBpZiAoci0+aG9zdG5hbWUpIHsKLSAgICAgICAgICAgIGFwcl9zb2NrYWRkcl90ICpsb2NhbHNhOwotCi0gICAgICAgICAgICBhcHJfc29ja2V0X2FkZHJfZ2V0KCZsb2NhbHNhLCBBUFJfTE9DQUwsIHItPmNvbm5lY3Rpb24tPmNsaWVudF9zb2NrZXQpOwotICAgICAgICAgICAgYXByX3NvY2thZGRyX3BvcnRfZ2V0KCZwb3J0LCBsb2NhbHNhKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBkZWZhdWx0ICovCi0gICAgcmV0dXJuIHBvcnQ7Ci19Ci0KLUFQX0RFQ0xBUkUoY2hhciAqKSBhcF9jb25zdHJ1Y3RfdXJsKGFwcl9wb29sX3QgKnAsIGNvbnN0IGNoYXIgKnVyaSwKLQkJCQkgICAgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgdW5zaWduZWQgcG9ydCA9IGFwX2dldF9zZXJ2ZXJfcG9ydChyKTsKLSAgICBjb25zdCBjaGFyICpob3N0ID0gYXBfZ2V0X3NlcnZlcl9uYW1lKHIpOwotCi0gICAgaWYgKGFwX2lzX2RlZmF1bHRfcG9ydChwb3J0LCByKSkgewotCXJldHVybiBhcHJfcHN0cmNhdChwLCBhcF9odHRwX21ldGhvZChyKSwgIjovLyIsIGhvc3QsIHVyaSwgTlVMTCk7Ci0gICAgfQotICAgIHJldHVybiBhcHJfcHNwcmludGYocCwgIiVzOi8vJXM6JXUlcyIsIGFwX2h0dHBfbWV0aG9kKHIpLCBob3N0LCBwb3J0LCB1cmkpOwotfQotCi1BUF9ERUNMQVJFKHVuc2lnbmVkIGxvbmcpIGFwX2dldF9saW1pdF9yZXFfYm9keShjb25zdCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmQgPQotICAgICAgKGNvcmVfZGlyX2NvbmZpZyAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLCAmY29yZV9tb2R1bGUpOwotICAgIAotICAgIHJldHVybiBkLT5saW1pdF9yZXFfYm9keTsKLX0KLQotI2lmZGVmIFdJTjMyCi1zdGF0aWMgYXByX3N0YXR1c190IGdldF93aW4zMl9yZWdpc3RyeV9kZWZhdWx0X3ZhbHVlKGFwcl9wb29sX3QgKnAsIEhLRVkgaGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogcmVsYXRpdmVwYXRoLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKnZhbHVlKQotewotICAgIEhLRVkgaGtleU9wZW47Ci0gICAgRFdPUkQgdHlwZTsKLSAgICBEV09SRCBzaXplID0gMDsKLSAgICBEV09SRCByZXN1bHQgPSBSZWdPcGVuS2V5RXgoaGtleSwgcmVsYXRpdmVwYXRoLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1FVRVJZX1ZBTFVFLCAmaGtleU9wZW4pOwotICAgIAotICAgIGlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykgCi0gICAgICAgIHJldHVybiBBUFJfRlJPTV9PU19FUlJPUihyZXN1bHQpOwotCi0gICAgLyogUmVhZCB0byBOVUxMIGJ1ZmZlciB0byBkZXRlcm1pbmUgdmFsdWUgc2l6ZSAqLwotICAgIHJlc3VsdCA9IFJlZ1F1ZXJ5VmFsdWVFeChoa2V5T3BlbiwgIiIsIDAsICZ0eXBlLCBOVUxMLCAmc2l6ZSk7Ci0gICAgCi0gICBpZiAocmVzdWx0ID09IEVSUk9SX1NVQ0NFU1MpIHsKLSAgICAgICAgaWYgKChzaXplIDwgMikgfHwgKHR5cGUgIT0gUkVHX1NaICYmIHR5cGUgIT0gUkVHX0VYUEFORF9TWikpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgKnZhbHVlID0gYXByX3BhbGxvYyhwLCBzaXplKTsKLSAgICAgICAgICAgIC8qIFJlYWQgdmFsdWUgYmFzZWQgb24gc2l6ZSBxdWVyeSBhYm92ZSAqLwotICAgICAgICAgICAgcmVzdWx0ID0gUmVnUXVlcnlWYWx1ZUV4KGhrZXlPcGVuLCAiIiwgMCwgJnR5cGUsICp2YWx1ZSwgJnNpemUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogVE9ETzogVGhpcyBtaWdodCBsb29rIGZpbmUsIGJ1dCB3ZSBuZWVkIHRvIHByb3ZpZGUgc29tZSB3YXJuaW5nCi0gICAgICogc29tZXdoZXJlIHRoYXQgc29tZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbWF5IC1ub3QtIGJlIHRyYW5zbGF0ZWQsCi0gICAgICogc2VlaW5nIGFzIHdlIG1heSBoYXZlIGNob3BwZWQgdGhlIGVudmlyb25tZW50IHRhYmxlIGRvd24gc29tZXdoYXQuCi0gICAgICovCi0gICAgaWYgKChyZXN1bHQgPT0gRVJST1JfU1VDQ0VTUykgJiYgKHR5cGUgPT0gUkVHX0VYUEFORF9TWikpIAotICAgIHsKLSAgICAgICAgY2hhciAqdG1wID0gKnZhbHVlOwotICAgICAgICBzaXplID0gRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzKHRtcCwgKnZhbHVlLCAwKTsKLSAgICAgICAgaWYgKHNpemUpIHsKLSAgICAgICAgICAgICp2YWx1ZSA9IGFwcl9wYWxsb2MocCwgc2l6ZSk7Ci0gICAgICAgICAgICBzaXplID0gRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzKHRtcCwgKnZhbHVlLCBzaXplKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFJlZ0Nsb3NlS2V5KGhrZXlPcGVuKTsKLSAgICByZXR1cm4gQVBSX0ZST01fT1NfRVJST1IocmVzdWx0KTsKLX0KLQotc3RhdGljIGNoYXIqIGdldF9pbnRlcnByZXRlcl9mcm9tX3dpbjMyX3JlZ2lzdHJ5KGFwcl9wb29sX3QgKnAsIGNvbnN0IGNoYXIqIGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiogYXJndW1lbnRzLCBpbnQgc3RyaWN0KQotewotICAgIGNoYXIgZXhlY2NnaV9wYXRoW10gPSAiU0hFTExcXEVYRUNDR0lcXENPTU1BTkQiOwotICAgIGNoYXIgZXhlY29wZW5fcGF0aFtdID0gIlNIRUxMXFxPUEVOXFxDT01NQU5EIjsKLSAgICBjaGFyIHR5cGVOYW1lW01BWF9QQVRIXTsKLSAgICBpbnQgY21kT2ZOYW1lID0gRkFMU0U7Ci0gICAgSEtFWSBoa2V5TmFtZTsKLSAgICBIS0VZIGhrZXlUeXBlOwotICAgIERXT1JEIHR5cGU7Ci0gICAgaW50IHNpemU7Ci0gICAgaW50IHJlc3VsdDsKLSAgICBjaGFyICpidWZmZXI7Ci0gICAgY2hhciAqczsKLSAgICAKLSAgICBpZiAoIWV4dCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgLyogCi0gICAgICogRnV0dXJlIG9wdGltaXphdGlvbjoKLSAgICAgKiBXaGVuIHRoZSByZWdpc3RyeSBpcyBzdWNjZXNzZnVsbHkgc2VhcmNoZWQsIHN0b3JlIHRoZSBzdHJpbmdzIGZvcgotICAgICAqIGludGVycHJldGVyIGFuZCBhcmd1bWVudHMgaW4gYW4gZXh0IGhhc2ggdG8gc3BlZWQgdXAgc3Vic2VxdWVudCBsb29rLXVwcwotICAgICAqLwotCi0gICAgLyogT3BlbiB0aGUga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NyaXB0IGZpbGV0eXBlIGV4dGVuc2lvbiAqLwotICAgIHJlc3VsdCA9IFJlZ09wZW5LZXlFeChIS0VZX0NMQVNTRVNfUk9PVCwgZXh0LCAwLCBLRVlfUVVFUllfVkFMVUUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAmaGtleVR5cGUpOwotCi0gICAgaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKSAKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBSZXRyaWV2ZSB0aGUgbmFtZSBvZiB0aGUgc2NyaXB0IGZpbGV0eXBlIGV4dGVuc2lvbiAqLwotICAgIHNpemUgPSBzaXplb2YodHlwZU5hbWUpOwotICAgIHJlc3VsdCA9IFJlZ1F1ZXJ5VmFsdWVFeChoa2V5VHlwZSwgIiIsIE5VTEwsICZ0eXBlLCB0eXBlTmFtZSwgJnNpemUpOwotICAgIAotICAgIGlmIChyZXN1bHQgPT0gRVJST1JfU1VDQ0VTUyAmJiB0eXBlID09IFJFR19TWiAmJiB0eXBlTmFtZVswXSkgewotICAgICAgICAvKiBPcGVuIHRoZSBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBzY3JpcHQgZmlsZXR5cGUgZXh0ZW5zaW9uICovCi0gICAgICAgIHJlc3VsdCA9IFJlZ09wZW5LZXlFeChIS0VZX0NMQVNTRVNfUk9PVCwgdHlwZU5hbWUsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1FVRVJZX1ZBTFVFLCAmaGtleU5hbWUpOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gRVJST1JfU1VDQ0VTUykKLSAgICAgICAgICAgIGNtZE9mTmFtZSA9IFRSVUU7Ci0gICAgfQotCi0gICAgLyogT3BlbiB0aGUga2V5IGZvciB0aGUgc2NyaXB0IGNvbW1hbmQgcGF0aCBieToKLSAgICAgKiAKLSAgICAgKiAgIDEpIHRoZSAnbmFtZWQnIGZpbGV0eXBlIGtleSBmb3IgRXhlY0NHSS9Db21tYW5kCi0gICAgICogICAyKSB0aGUgZXh0ZW5zaW9uJ3MgdHlwZSBrZXkgZm9yIEV4ZWNDR0kvQ29tbWFuZAotICAgICAqCi0gICAgICogYW5kIGlmIHRoZSBzdHJpY3QgYXJnIGlzIGZhbHNlLCB0aGVuIGNvbnRpbnVlIHRyeWluZzoKLSAgICAgKgotICAgICAqICAgMykgdGhlICduYW1lZCcgZmlsZXR5cGUga2V5IGZvciBPcGVuL0NvbW1hbmQKLSAgICAgKiAgIDQpIHRoZSBleHRlbnNpb24ncyB0eXBlIGtleSBmb3IgT3Blbi9Db21tYW5kCi0gICAgICovCi0KLSAgICBpZiAoY21kT2ZOYW1lKSB7Ci0gICAgICAgIHJlc3VsdCA9IGdldF93aW4zMl9yZWdpc3RyeV9kZWZhdWx0X3ZhbHVlKHAsIGhrZXlOYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY2NnaV9wYXRoLCAmYnVmZmVyKTsKLSAgICB9Ci0KLSAgICBpZiAoIWNtZE9mTmFtZSB8fCAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpKSB7Ci0gICAgICAgIHJlc3VsdCA9IGdldF93aW4zMl9yZWdpc3RyeV9kZWZhdWx0X3ZhbHVlKHAsIGhrZXlUeXBlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY2NnaV9wYXRoLCAmYnVmZmVyKTsKLSAgICB9Ci0KLSAgICBpZiAoIXN0cmljdCAmJiBjbWRPZk5hbWUgJiYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKSkgewotICAgICAgICByZXN1bHQgPSBnZXRfd2luMzJfcmVnaXN0cnlfZGVmYXVsdF92YWx1ZShwLCBoa2V5TmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNvcGVuX3BhdGgsICZidWZmZXIpOwotICAgIH0KLQotICAgIGlmICghc3RyaWN0ICYmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykpIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0X3dpbjMyX3JlZ2lzdHJ5X2RlZmF1bHRfdmFsdWUocCwgaGtleVR5cGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjb3Blbl9wYXRoLCAmYnVmZmVyKTsKLSAgICB9Ci0KLSAgICBpZiAoY21kT2ZOYW1lKQotICAgICAgICBSZWdDbG9zZUtleShoa2V5TmFtZSk7Ci0KLSAgICBSZWdDbG9zZUtleShoa2V5VHlwZSk7Ci0KLSAgICBpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgLyoKLSAgICAgKiBUaGUgY2Fub25pY2FsIHdheSBzaGVsbCBjb21tYW5kIGVudHJpZXMgYXJlIGVudGVyZWQgaW4gdGhlIFdpbjMyIAotICAgICAqIHJlZ2lzdHJ5IGlzIGFzIGZvbGxvd3M6Ci0gICAgICogICBzaGVsbCBbb3B0aW9uc10gIiUxIiBbYXJnc10KLSAgICAgKiB3aGVyZQotICAgICAqICAgc2hlbGwgLSBmdWxsIHBhdGggbmFtZSB0byBpbnRlcnByZXRlciBvciBzaGVsbCB0byBydW4uCi0gICAgICogICAgICAgICAgIEUuZy4sIGM6XHVzclxsb2NhbFxudHJlc2tpdFxwZXJsXGJpblxwZXJsLmV4ZQotICAgICAqICAgb3B0aW9ucyAtIG9wdGlvbmFsIHN3aXRjaGVzCi0gICAgICogICAgICAgICAgICAgIEUuZy4sIFxDCi0gICAgICogICAiJTEiIC0gUGxhY2UgaG9sZGVyIGZvciBmaWxlIHRvIHJ1biB0aGUgc2hlbGwgYWdhaW5zdC4gCi0gICAgICogICAgICAgICAgVHlwaWNhbGx5IHF1b3RlZC4KLSAgICAgKiAgIG9wdGlvbnMgLSBhZGRpdGlvbmFsIGFyZ3VtZW50cwotICAgICAqICAgICAgICAgICAgICBFLmcuLCAvc2lsZW50Ci0gICAgICoKLSAgICAgKiBJZiB3ZSBmaW5kIGEgJTEgb3IgYSBxdW90ZWQgJTEsIGxvcCBvZmYgdGhlIHJlbWFpbmRlciB0byBhcmd1bWVudHMuIAotICAgICAqLwotICAgIGlmIChidWZmZXIgJiYgKmJ1ZmZlcikgewotICAgICAgICBpZiAoKHMgPSBzdHJzdHIoYnVmZmVyLCAiXCIlMSIpKSkKLSAgICAgICAgewotICAgICAgICAgICAgKnMgPSAnXDAnOwotICAgICAgICAgICAgKmFyZ3VtZW50cyA9IHMgKyA0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKChzID0gc3Ryc3RyKGJ1ZmZlciwgIiUxIikpKSAKLSAgICAgICAgewotICAgICAgICAgICAgKnMgPSAnXDAnOwotICAgICAgICAgICAgKmFyZ3VtZW50cyA9IGJ1ZmZlciArIDI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgKmFyZ3VtZW50cyA9IHN0cmNocihidWZmZXIsICdcMCcpOwotICAgICAgICB3aGlsZSAoKiphcmd1bWVudHMgJiYgaXNzcGFjZSgqKmFyZ3VtZW50cykpCi0gICAgICAgICAgICArKyphcmd1bWVudHM7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotQVBfREVDTEFSRSAoZmlsZV90eXBlX2UpIGFwX2dldF93aW4zMl9pbnRlcnByZXRlcihjb25zdCAgcmVxdWVzdF9yZWMgKnIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiogaW50ZXJwcmV0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqKiBhcmd1bWVudHMpCi17Ci0gICAgSEFORExFIGhGaWxlOwotICAgIERXT1JEIG5CeXRlc1JlYWQ7Ci0gICAgQk9PTEVBTiBiUmVzdWx0OwotICAgIGNoYXIgYnVmZmVyWzEwMjRdOwotICAgIGNvcmVfZGlyX2NvbmZpZyAqZDsKLSAgICBpbnQgaTsKLSAgICBmaWxlX3R5cGVfZSBmaWxlVHlwZSA9IGVGaWxlVHlwZVVOS05PV047Ci0gICAgY2hhciAqZXh0ID0gTlVMTDsKLSAgICBjaGFyICpleGVuYW1lID0gTlVMTDsKLQotICAgIGQgPSAoY29yZV9kaXJfY29uZmlnICopYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcmVfbW9kdWxlKTsKLQotICAgIC8qIEZpbmQgdGhlIGZpbGUgZXh0ZW5zaW9uICovCi0gICAgZXhlbmFtZSA9IHN0cnJjaHIoci0+ZmlsZW5hbWUsICcvJyk7Ci0gICAgaWYgKCFleGVuYW1lKSB7Ci0gICAgICAgIGV4ZW5hbWUgPSBzdHJyY2hyKHItPmZpbGVuYW1lLCAnXFwnKTsKLSAgICB9Ci0gICAgaWYgKCFleGVuYW1lKSB7Ci0gICAgICAgIGV4ZW5hbWUgPSByLT5maWxlbmFtZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGV4ZW5hbWUrKzsKLSAgICB9Ci0gICAgZXh0ID0gc3RycmNocihleGVuYW1lLCAnLicpOwotCi0gICAgaWYgKGV4dCAmJiAoIXN0cmNhc2VjbXAoZXh0LCIuYmF0IikgfHwgIXN0cmNhc2VjbXAoZXh0LCIuY21kIikpKSAKLSAgICB7Ci0gICAgICAgIGNoYXIgKmNvbXNwZWMgPSBnZXRlbnYoIkNPTVNQRUMiKTsKLSAgICAgICAgaWYgKGNvbXNwZWMpIHsKLSAgICAgICAgICAgICppbnRlcnByZXRlciA9IGFwcl9wc3RyY2F0KHItPnBvb2wsICJcIiIsIGNvbXNwZWMsICJcIiAvYyAiLCBOVUxMKTsKLSAgICAgICAgICAgIHJldHVybiBlRmlsZVR5cGVTQ1JJUFQ7Ci0gICAgICAgIH0KLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgMCwgci0+c2VydmVyLAotICAgICAgICAgIkZhaWxlZCB0byBzdGFydCBhICclcycgZmlsZSBhcyBhIHNjcmlwdC4iIEFQUl9FT0xfU1RSCi0gICAgICAgICAiXHRDT01TUEVDIHZhcmlhYmxlIGlzIG1pc3NpbmcgZnJvbSB0aGUgZW52aXJvbm1lbnQuIiwgZXh0KTsKLSAgICAgICAgcmV0dXJuIGVGaWxlVHlwZVVOS05PV047Ci0gICAgfQotCi0gICAgLyogSWYgdGhlIGZpbGUgaGFzIGFuIGV4dGVuc2lvbiBhbmQgaXQgaXMgbm90IC5jb20gYW5kIG5vdCAuZXhlIGFuZAotICAgICAqIHdlJ3ZlIGJlZW4gaW5zdHJ1Y3RlZCB0byBzZWFyY2ggdGhlIHJlZ2lzdHJ5LCB0aGVuIGRvIGl0IQotICAgICAqLwotICAgIGlmIChleHQgJiYgc3RyY2FzZWNtcChleHQsIi5leGUiKSAmJiBzdHJjYXNlY21wKGV4dCwiLmNvbSIpICYmCi0gICAgICAgIChkLT5zY3JpcHRfaW50ZXJwcmV0ZXJfc291cmNlID09IElOVEVSUFJFVEVSX1NPVVJDRV9SRUdJU1RSWSB8fAotICAgICAgICAgZC0+c2NyaXB0X2ludGVycHJldGVyX3NvdXJjZSA9PSBJTlRFUlBSRVRFUl9TT1VSQ0VfUkVHSVNUUllfU1RSSUNUKSkgewotICAgICAgICAgLyogQ2hlY2sgdGhlIHJlZ2lzdHJ5ICovCi0gICAgICAgIGludCBzdHJpY3QgPSAoZC0+c2NyaXB0X2ludGVycHJldGVyX3NvdXJjZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBJTlRFUlBSRVRFUl9TT1VSQ0VfUkVHSVNUUllfU1RSSUNUKTsKLSAgICAgICAgKmludGVycHJldGVyID0gZ2V0X2ludGVycHJldGVyX2Zyb21fd2luMzJfcmVnaXN0cnkoci0+cG9vbCwgZXh0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzLCBzdHJpY3QpOwotICAgICAgICBpZiAoKmludGVycHJldGVyKQotICAgICAgICAgICAgcmV0dXJuIGVGaWxlVHlwZVNDUklQVDsKLSAgICAgICAgZWxzZSBpZiAoZC0+c2NyaXB0X2ludGVycHJldGVyX3NvdXJjZSA9PSBJTlRFUlBSRVRFUl9TT1VSQ0VfUkVHSVNUUllfU1RSSUNUKSB7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19JTkZPLCAwLCByLT5zZXJ2ZXIsCi0gICAgICAgICAgICAgIlNjcmlwdEludGVycHJldGVyU291cmNlIGNvbmZpZyBkaXJlY3RpdmUgc2V0IHRvIFwicmVnaXN0cnktc3RyaWN0XCIuIiBBUFJfRU9MX1NUUgotICAgICAgICAgICAgICJcdEludGVycHJldGVyIG5vdCBmb3VuZCBmb3IgZmlsZXMgb2YgdHlwZSAnJXMnLiIsIGV4dCk7Ci0gICAgICAgICAgICAgcmV0dXJuIGVGaWxlVHlwZVVOS05PV047Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19JTkZPLCAwLCByLT5zZXJ2ZXIsCi0gICAgICAgICAgICAgIlNjcmlwdEludGVycHJldGVyU291cmNlIGNvbmZpZyBkaXJlY3RpdmUgc2V0IHRvIFwicmVnaXN0cnlcIi4iIEFQUl9FT0xfU1RSCi0gICAgICAgICAgICAgIlx0SW50ZXJwcmV0ZXIgbm90IGZvdW5kIGZvciBmaWxlcyBvZiB0eXBlICclcycsICIKLSAgICAgICAgICAgICAidHJ5aW5nIFwic2NyaXB0XCIgbWV0aG9kLi4uIiwgZXh0KTsKLSAgICAgICAgfQotICAgIH0gICAgICAgIAotCi0gICAgLyogTmVlZCB0byBwZWVrIGludG8gdGhlIGZpbGUgZmlndXJlIG91dCB3aGF0IGl0IHJlYWxseSBpcy4uLiAqLwotICAgIC8qIFRoaXMgaXMgd3JvbmcgZm9yIFVuaWNvZGUgRlMgLi4uIHNob3VsZCBtb3ZlIHRvIEFQUiAqLwotICAgIGhGaWxlID0gQ3JlYXRlRmlsZShyLT5maWxlbmFtZSwgR0VORVJJQ19SRUFELCBGSUxFX1NIQVJFX1JFQUQsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgIE9QRU5fRVhJU1RJTkcsIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgTlVMTCk7Ci0gICAgaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0gICAgICAgIHJldHVybiBlRmlsZVR5cGVVTktOT1dOOwotICAgIH0KLSAgICBiUmVzdWx0ID0gUmVhZEZpbGUoaEZpbGUsICh2b2lkKikgJmJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgLSAxLCAKLSAgICAgICAgICAgICAgICAgICAgICAgJm5CeXRlc1JlYWQsIE5VTEwpOwotICAgIGlmICghYlJlc3VsdCB8fCAobkJ5dGVzUmVhZCA9PSAwKSkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgR2V0TGFzdEVycm9yKCksIHIsCi0gICAgICAgICAgICAgICAgICAgICAgIlJlYWRGaWxlKCVzKSBmYWlsZWQiLCByLT5maWxlbmFtZSk7Ci0gICAgICAgIENsb3NlSGFuZGxlKGhGaWxlKTsKLSAgICAgICAgcmV0dXJuIGVGaWxlVHlwZVVOS05PV047Ci0gICAgfQotICAgIENsb3NlSGFuZGxlKGhGaWxlKTsKLSAgICBidWZmZXJbbkJ5dGVzUmVhZF0gPSAnXDAnOwotCi0gICAgLyogU2NyaXB0IG9yIGV4ZWN1dGFibGUsIHRoYXQgaXMgdGhlIHF1ZXN0aW9uLi4uICovCi0gICAgaWYgKChidWZmZXJbMF0gPT0gJyMnKSAmJiAoYnVmZmVyWzFdID09ICchJykpIHsKLSAgICAgICAgLyogQXNzdW1pbmcgZmlsZSBpcyBhIHNjcmlwdCBzaW5jZSBpdCBzdGFydHMgd2l0aCBhIHNoZWJhbmcgKi8KLSAgICAgICAgZmlsZVR5cGUgPSBlRmlsZVR5cGVTQ1JJUFQ7Ci0gICAgICAgIGZvciAoaSA9IDI7IGkgPCBzaXplb2YoYnVmZmVyKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoKGJ1ZmZlcltpXSA9PSAnXHInKQotICAgICAgICAgICAgICAgIHx8IChidWZmZXJbaV0gPT0gJ1xuJykpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBidWZmZXJbaV0gPSAnXDAnOwotICAgICAgICBmb3IgKGkgPSAyOyBidWZmZXJbaV0gPT0gJyAnIDsgKytpKQotICAgICAgICAgICAgOwotICAgICAgICAqaW50ZXJwcmV0ZXIgPSBhcHJfcHN0cmR1cChyLT5wb29sLCBidWZmZXIgKyBpICk7IAotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogTm90IGEgc2NyaXB0LCBpcyBpdCBhbiBleGVjdXRhYmxlPyAqLwotICAgICAgICBJTUFHRV9ET1NfSEVBREVSICpoZHIgPSAoSU1BR0VfRE9TX0hFQURFUiopYnVmZmVyOyAgICAKLSAgICAgICAgaWYgKChuQnl0ZXNSZWFkID49IHNpemVvZihJTUFHRV9ET1NfSEVBREVSKSkgJiYgKGhkci0+ZV9tYWdpYyA9PSBJTUFHRV9ET1NfU0lHTkFUVVJFKSkgewotICAgICAgICAgICAgaWYgKGhkci0+ZV9sZmFybGMgPCAweDQwKQotICAgICAgICAgICAgICAgIGZpbGVUeXBlID0gZUZpbGVUeXBlRVhFMTY7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZmlsZVR5cGUgPSBlRmlsZVR5cGVFWEUzMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmaWxlVHlwZSA9IGVGaWxlVHlwZVVOS05PV047Ci0gICAgfQotCi0gICAgcmV0dXJuIGZpbGVUeXBlOwotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvbW1hbmRzLi4uIHRoaXMgbW9kdWxlIGhhbmRsZXMgYWxtb3N0IGFsbCBvZiB0aGUgTkNTQSBodHRwZC5jb25mCi0gKiBjb21tYW5kcywgYnV0IG1vc3Qgb2YgdGhlIG9sZCBzcm0uY29uZiBpcyBpbiB0aGUgdGhlIG1vZHVsZXMuCi0gKi8KLQotCi0vKiByZXR1cm5zIGEgcGFyZW50IGlmIGl0IG1hdGNoZXMgdGhlIGdpdmVuIGRpcmVjdGl2ZSAqLwotc3RhdGljIGNvbnN0IGFwX2RpcmVjdGl2ZV90ICogZmluZF9wYXJlbnQoY29uc3QgYXBfZGlyZWN0aXZlX3QgKmRpcnAsCi0JCQkJCSAgY29uc3QgY2hhciAqd2hhdCkKLXsKLSAgICB3aGlsZSAoZGlycC0+cGFyZW50ICE9IE5VTEwpIHsKLQlkaXJwID0gZGlycC0+cGFyZW50OwotCS8qICMjIyBpdCB3b3VsZCBiZSBuaWNlIHRvIGhhdmUgYXRvbS1pemVkIGRpcmVjdGl2ZXMgKi8KLQlpZiAoc3RyY2FzZWNtcChkaXJwLT5kaXJlY3RpdmUsIHdoYXQpID09IDApCi0JICAgIHJldHVybiBkaXJwOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotQVBfREVDTEFSRShjb25zdCBjaGFyICopIGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZF9wYXJtcyAqY21kLAotCQkJCQkgICAgICB1bnNpZ25lZCBmb3JiaWRkZW4pCi17Ci0gICAgY29uc3QgY2hhciAqZ3QgPSAoY21kLT5jbWQtPm5hbWVbMF0gPT0gJzwnCi0JCSAgICAgICYmIGNtZC0+Y21kLT5uYW1lW3N0cmxlbihjbWQtPmNtZC0+bmFtZSktMV0gIT0gJz4nKQotICAgICAgICAgICAgICAgICAgICAgICAgID8gIj4iIDogIiI7Ci0gICAgY29uc3QgYXBfZGlyZWN0aXZlX3QgKmZvdW5kOwotCi0gICAgaWYgKChmb3JiaWRkZW4gJiBOT1RfSU5fVklSVFVBTEhPU1QpICYmIGNtZC0+c2VydmVyLT5pc192aXJ0dWFsKSB7Ci0JcmV0dXJuIGFwcl9wc3RyY2F0KGNtZC0+cG9vbCwgY21kLT5jbWQtPm5hbWUsIGd0LAotCQkJICAiIGNhbm5vdCBvY2N1ciB3aXRoaW4gPFZpcnR1YWxIb3N0PiBzZWN0aW9uIiwgTlVMTCk7Ci0gICAgfQotCi0gICAgaWYgKChmb3JiaWRkZW4gJiBOT1RfSU5fTElNSVQpICYmIGNtZC0+bGltaXRlZCAhPSAtMSkgewotCXJldHVybiBhcHJfcHN0cmNhdChjbWQtPnBvb2wsIGNtZC0+Y21kLT5uYW1lLCBndCwKLQkJCSAgIiBjYW5ub3Qgb2NjdXIgd2l0aGluIDxMaW1pdD4gc2VjdGlvbiIsIE5VTEwpOwotICAgIH0KLQotICAgIGlmICgoZm9yYmlkZGVuICYgTk9UX0lOX0RJUl9MT0NfRklMRSkgPT0gTk9UX0lOX0RJUl9MT0NfRklMRQotCSYmIGNtZC0+cGF0aCAhPSBOVUxMKSB7Ci0JcmV0dXJuIGFwcl9wc3RyY2F0KGNtZC0+cG9vbCwgY21kLT5jbWQtPm5hbWUsIGd0LAotCQkJICAiIGNhbm5vdCBvY2N1ciB3aXRoaW4gPERpcmVjdG9yeS9Mb2NhdGlvbi9GaWxlcz4gIgotCQkJICAic2VjdGlvbiIsIE5VTEwpOwotICAgIH0KLSAgICAKLSAgICBpZiAoKChmb3JiaWRkZW4gJiBOT1RfSU5fRElSRUNUT1JZKQotCSAmJiAoKGZvdW5kID0gZmluZF9wYXJlbnQoY21kLT5kaXJlY3RpdmUsICI8RGlyZWN0b3J5IikpCi0JICAgICB8fCAoZm91bmQgPSBmaW5kX3BhcmVudChjbWQtPmRpcmVjdGl2ZSwgIjxEaXJlY3RvcnlNYXRjaCIpKSkpCi0JfHwgKChmb3JiaWRkZW4gJiBOT1RfSU5fTE9DQVRJT04pCi0JICAgICYmICgoZm91bmQgPSBmaW5kX3BhcmVudChjbWQtPmRpcmVjdGl2ZSwgIjxMb2NhdGlvbiIpKQotCQl8fCAoZm91bmQgPSBmaW5kX3BhcmVudChjbWQtPmRpcmVjdGl2ZSwgIjxMb2NhdGlvbk1hdGNoIikpKSkKLQl8fCAoKGZvcmJpZGRlbiAmIE5PVF9JTl9GSUxFUykKLQkgICAgJiYgKChmb3VuZCA9IGZpbmRfcGFyZW50KGNtZC0+ZGlyZWN0aXZlLCAiPEZpbGVzIikpCi0JCXx8IChmb3VuZCA9IGZpbmRfcGFyZW50KGNtZC0+ZGlyZWN0aXZlLCAiPEZpbGVzTWF0Y2giKSkpKSkgewotCXJldHVybiBhcHJfcHN0cmNhdChjbWQtPnBvb2wsIGNtZC0+Y21kLT5uYW1lLCBndCwKLQkJCSAgIiBjYW5ub3Qgb2NjdXIgd2l0aGluICIsIGZvdW5kLT5kaXJlY3RpdmUsCi0JCQkgICI+IHNlY3Rpb24iLCBOVUxMKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9hY2Nlc3NfbmFtZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksCi0JCQkJICAgY29uc3QgY2hhciAqYXJnKQotewotICAgIHZvaWQgKnNjb25mID0gY21kLT5zZXJ2ZXItPm1vZHVsZV9jb25maWc7Ci0gICAgY29yZV9zZXJ2ZXJfY29uZmlnICpjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcoc2NvbmYsICZjb3JlX21vZHVsZSk7Ci0KLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsCi0JCQkJCSAgIE5PVF9JTl9ESVJfTE9DX0ZJTEV8Tk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBjb25mLT5hY2Nlc3NfbmFtZSA9IGFwcl9wc3RyZHVwKGNtZC0+cG9vbCwgYXJnKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotI2lmZGVmIEdQUk9GCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2dwcm9mX2RpcihjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICB2b2lkICpzY29uZiA9IGNtZC0+c2VydmVyLT5tb2R1bGVfY29uZmlnOwotICAgIGNvcmVfc2VydmVyX2NvbmZpZyAqY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHNjb25mLCAmY29yZV9tb2R1bGUpOwotCi0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLAotCQkJCQkgICBOT1RfSU5fRElSX0xPQ19GSUxFfE5PVF9JTl9MSU1JVCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgY29uZi0+Z3Byb2ZfZGlyID0gYXByX3BzdHJkdXAoY21kLT5wb29sLCBhcmcpOwotICAgIHJldHVybiBOVUxMOwotfQotI2VuZGlmIC8qR1BST0YqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2FkZF9kZWZhdWx0X2NoYXJzZXQoY21kX3Bhcm1zICpjbWQsIAotCQkJCQkgICB2b2lkICpkXywgY29uc3QgY2hhciAqYXJnKQotewotICAgIGNvcmVfZGlyX2NvbmZpZyAqZD1kXzsKLQotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgTk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgaWYgKCFzdHJjYXNlY21wKGFyZywgIk9mZiIpKSB7Ci0gICAgICAgZC0+YWRkX2RlZmF1bHRfY2hhcnNldCA9IEFERF9ERUZBVUxUX0NIQVJTRVRfT0ZGOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY2FzZWNtcChhcmcsICJPbiIpKSB7Ci0gICAgICAgZC0+YWRkX2RlZmF1bHRfY2hhcnNldCA9IEFERF9ERUZBVUxUX0NIQVJTRVRfT047Ci0gICAgICAgZC0+YWRkX2RlZmF1bHRfY2hhcnNldF9uYW1lID0gREVGQVVMVF9BRERfREVGQVVMVF9DSEFSU0VUX05BTUU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgIGQtPmFkZF9kZWZhdWx0X2NoYXJzZXQgPSBBRERfREVGQVVMVF9DSEFSU0VUX09OOwotICAgICAgIGQtPmFkZF9kZWZhdWx0X2NoYXJzZXRfbmFtZSA9IGFyZzsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfZG9jdW1lbnRfcm9vdChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksCi0JCQkJICAgICBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgdm9pZCAqc2NvbmYgPSBjbWQtPnNlcnZlci0+bW9kdWxlX2NvbmZpZzsKLSAgICBjb3JlX3NlcnZlcl9jb25maWcgKmNvbmYgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzY29uZiwgJmNvcmVfbW9kdWxlKTsKLSAgCi0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLAotCQkJCQkgICBOT1RfSU5fRElSX0xPQ19GSUxFfE5PVF9JTl9MSU1JVCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgYXJnID0gYXBfb3NfY2Fub25pY2FsX2ZpbGVuYW1lKGNtZC0+cG9vbCwgYXJnKTsKLSAgICBpZiAoLyogVE9ETzogYXBfY29uZmlndGVzdG9ubHkgJiYgYXBfZG9jcm9vdGNoZWNrICYmICovICFhcF9pc19kaXJlY3RvcnkoY21kLT5wb29sLCBhcmcpKSB7Ci0JaWYgKGNtZC0+c2VydmVyLT5pc192aXJ0dWFsKSB7Ci0JICAgIGFwX2xvZ19wZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIGNtZC0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiV2FybmluZzogRG9jdW1lbnRSb290IFslc10gZG9lcyBub3QgZXhpc3QiLAotCQkgICAgICAgICBhcmcpOwotCX0KLQllbHNlIHsKLQkgICAgcmV0dXJuICJEb2N1bWVudFJvb3QgbXVzdCBiZSBhIGRpcmVjdG9yeSI7Ci0JfQotICAgIH0KLSAgICAKLSAgICBjb25mLT5hcF9kb2N1bWVudF9yb290ID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1BUF9ERUNMQVJFKHZvaWQpIGFwX2N1c3RvbV9yZXNwb25zZShyZXF1ZXN0X3JlYyAqciwgaW50IHN0YXR1cywgY2hhciAqc3RyaW5nKQotewotICAgIGNvcmVfZGlyX2NvbmZpZyAqY29uZiA9IAotCWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLCAmY29yZV9tb2R1bGUpOwotICAgIGludCBpZHg7Ci0KLSAgICBpZihjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3MgPT0gTlVMTCkgewotICAgICAgICBjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3MgPSAKLQkgICAgYXByX3BjYWxsb2Moci0+cG9vbCwKLQkJICAgIHNpemVvZigqY29uZi0+cmVzcG9uc2VfY29kZV9zdHJpbmdzKSAqIAotCQkgICAgUkVTUE9OU0VfQ09ERVMpOwotICAgIH0KLQotICAgIGlkeCA9IGFwX2luZGV4X29mX3Jlc3BvbnNlKHN0YXR1cyk7Ci0KLSAgICBjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3NbaWR4XSA9IAotICAgICAgICgoYXBfaXNfdXJsKHN0cmluZykgfHwgKCpzdHJpbmcgPT0gJy8nKSkgJiYgKCpzdHJpbmcgIT0gJyInKSkgPyAKLSAgICAgICBhcHJfcHN0cmR1cChyLT5wb29sLCBzdHJpbmcpIDogYXByX3BzdHJjYXQoci0+cG9vbCwgIlwiIiwgc3RyaW5nLCBOVUxMKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9lcnJvcl9kb2N1bWVudChjbWRfcGFybXMgKmNtZCwgdm9pZCAqY29uZl8sCi0JCQkJICAgICAgY29uc3QgY2hhciAqZXJybm9fc3RyLCBjb25zdCBjaGFyICptc2cpCi17Ci0gICAgY29yZV9kaXJfY29uZmlnICpjb25mPWNvbmZfOwotICAgIGludCBlcnJvcl9udW1iZXIsIGluZGV4X251bWJlciwgaWR4NTAwOwotICAgIGVudW0geyBNU0csIExPQ0FMX1BBVEgsIFJFTU9URV9QQVRIIH0gd2hhdCA9IE1TRzsKLSAgICAgICAgICAgICAgICAKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIE5PVF9JTl9MSU1JVCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogMXN0IHBhcmFtZXRlciBzaG91bGQgYmUgYSAzIGRpZ2l0IG51bWJlciwgd2hpY2ggd2UgcmVjb2duaXplOwotICAgICAqIGNvbnZlcnQgaXQgaW50byBhbiBhcnJheSBpbmRleAotICAgICAqLwotICAgIGVycm9yX251bWJlciA9IGF0b2koZXJybm9fc3RyKTsKLSAgICBpZHg1MDAgPSBhcF9pbmRleF9vZl9yZXNwb25zZShIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0KLSAgICBpZiAoZXJyb3JfbnVtYmVyID09IEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKSB7Ci0gICAgICAgIGluZGV4X251bWJlciA9IGlkeDUwMDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKGluZGV4X251bWJlciA9IGFwX2luZGV4X29mX3Jlc3BvbnNlKGVycm9yX251bWJlcikpID09IGlkeDUwMCkgewotICAgICAgICByZXR1cm4gYXByX3BzdHJjYXQoY21kLT5wb29sLCAiVW5zdXBwb3J0ZWQgSFRUUCByZXNwb25zZSBjb2RlICIsCi0JCQkgIGVycm5vX3N0ciwgTlVMTCk7Ci0gICAgfQotCi0gICAgLyogSGV1cmlzdGljIHRvIGRldGVybWluZSBzZWNvbmQgYXJndW1lbnQuICovCi0gICAgaWYgKGFwX3N0cmNocl9jKG1zZywnICcpKSAKLQl3aGF0ID0gTVNHOwotICAgIGVsc2UgaWYgKG1zZ1swXSA9PSAnLycpCi0Jd2hhdCA9IExPQ0FMX1BBVEg7Ci0gICAgZWxzZSBpZiAoYXBfaXNfdXJsKG1zZykpCi0Jd2hhdCA9IFJFTU9URV9QQVRIOwotICAgIGVsc2UKLSAgICAgICAgd2hhdCA9IE1TRzsKLSAgIAotICAgIC8qIFRoZSBlbnRyeSBzaG91bGQgYmUgaWdub3JlZCBpZiBpdCBpcyBhIGZ1bGwgVVJMIGZvciBhIDQwMSBlcnJvciAqLwotCi0gICAgaWYgKGVycm9yX251bWJlciA9PSA0MDEgJiYgd2hhdCA9PSBSRU1PVEVfUEFUSCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwgMCwgY21kLT5zZXJ2ZXIsCi0JCSAgICAgImNhbm5vdCB1c2UgYSBmdWxsIFVSTCBpbiBhIDQwMSBFcnJvckRvY3VtZW50ICIKLQkJICAgICAiZGlyZWN0aXZlIC0tLSBpZ25vcmluZyEiKTsKLSAgICB9Ci0gICAgZWxzZSB7IC8qIFN0b3JlIGl0Li4uICovCi0gICAgCWlmIChjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3MgPT0gTlVMTCkgewotCSAgICBjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3MgPQotCQlhcHJfcGNhbGxvYyhjbWQtPnBvb2wsCi0JCQkgICBzaXplb2YoKmNvbmYtPnJlc3BvbnNlX2NvZGVfc3RyaW5ncykgKiBSRVNQT05TRV9DT0RFUyk7Ci0gICAgICAgIH0KLQkvKiBoYWNrLiBQcmVmaXggYSAiIGlmIGl0IGlzIGEgbXNnOyBhcyB0aGF0IGlzIHdoYXQKLQkgKiBodHRwX3Byb3RvY29sLmMgcmVsaWVzIG9uIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KLQkgKiBhIG1zZyBhbmQgYSAobG9jYWwpIHBhdGguCi0JICovCi0gICAgICAgIGNvbmYtPnJlc3BvbnNlX2NvZGVfc3RyaW5nc1tpbmRleF9udW1iZXJdID0gKHdoYXQgPT0gTVNHKSA/Ci0JCWFwcl9wc3RyY2F0KGNtZC0+cG9vbCwgIlwiIixtc2csTlVMTCkgOgotCQlhcHJfcHN0cmR1cChjbWQtPnBvb2wsIG1zZyk7Ci0gICAgfSAgIAotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfb3ZlcnJpZGUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmRfLCBjb25zdCBjaGFyICpsKQotewotICAgIGNvcmVfZGlyX2NvbmZpZyAqZD1kXzsKLSAgICBjaGFyICp3OwotICAKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIE5PVF9JTl9MSU1JVCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZC0+b3ZlcnJpZGUgPSBPUl9OT05FOwotICAgIHdoaWxlIChsWzBdKSB7Ci0gICAgICAgIHcgPSBhcF9nZXR3b3JkX2NvbmYoY21kLT5wb29sLCAmbCk7Ci0JaWYgKCFzdHJjYXNlY21wKHcsICJMaW1pdCIpKSB7Ci0JICAgIGQtPm92ZXJyaWRlIHw9IE9SX0xJTUlUOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiT3B0aW9ucyIpKSB7Ci0JICAgIGQtPm92ZXJyaWRlIHw9IE9SX09QVElPTlM7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJGaWxlSW5mbyIpKSB7Ci0gICAgICAgICAgICBkLT5vdmVycmlkZSB8PSBPUl9GSUxFSU5GTzsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIkF1dGhDb25maWciKSkgewotCSAgICBkLT5vdmVycmlkZSB8PSBPUl9BVVRIQ0ZHOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiSW5kZXhlcyIpKSB7Ci0gICAgICAgICAgICBkLT5vdmVycmlkZSB8PSBPUl9JTkRFWEVTOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiTm9uZSIpKSB7Ci0JICAgIGQtPm92ZXJyaWRlID0gT1JfTk9ORTsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIkFsbCIpKSB7Ci0JICAgIGQtPm92ZXJyaWRlID0gT1JfQUxMOwotCX0KLQllbHNlIHsKLQkgICAgcmV0dXJuIGFwcl9wc3RyY2F0KGNtZC0+cG9vbCwgIklsbGVnYWwgb3ZlcnJpZGUgb3B0aW9uICIsIHcsIE5VTEwpOwotCX0KLQlkLT5vdmVycmlkZSAmPSB+T1JfVU5TRVQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfb3B0aW9ucyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZF8sIGNvbnN0IGNoYXIgKmwpCi17Ci0gICAgY29yZV9kaXJfY29uZmlnICpkPWRfOwotICAgIGFsbG93X29wdGlvbnNfdCBvcHQ7Ci0gICAgaW50IGZpcnN0ID0gMTsKLSAgICBjaGFyIGFjdGlvbjsKLQotICAgIHdoaWxlIChsWzBdKSB7Ci0gICAgICAgIGNoYXIgKncgPSBhcF9nZXR3b3JkX2NvbmYoY21kLT5wb29sLCAmbCk7Ci0JYWN0aW9uID0gJ1wwJzsKLQotCWlmICgqdyA9PSAnKycgfHwgKncgPT0gJy0nKSB7Ci0JICAgIGFjdGlvbiA9ICoodysrKTsKLQl9Ci0JZWxzZSBpZiAoZmlyc3QpIHsKLSAgCSAgICBkLT5vcHRzID0gT1BUX05PTkU7Ci0gICAgICAgICAgICBmaXJzdCA9IDA7Ci0gICAgICAgIH0KLQkgICAgCi0JaWYgKCFzdHJjYXNlY21wKHcsICJJbmRleGVzIikpIHsKLQkgICAgb3B0ID0gT1BUX0lOREVYRVM7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJJbmNsdWRlcyIpKSB7Ci0JICAgIG9wdCA9IE9QVF9JTkNMVURFUzsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIkluY2x1ZGVzTk9FWEVDIikpIHsKLQkgICAgb3B0ID0gKE9QVF9JTkNMVURFUyB8IE9QVF9JTkNOT0VYRUMpOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiRm9sbG93U3ltTGlua3MiKSkgewotCSAgICBvcHQgPSBPUFRfU1lNX0xJTktTOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiU3ltTGlua3NJZk93bmVyTWF0Y2giKSkgewotCSAgICBvcHQgPSBPUFRfU1lNX09XTkVSOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiZXhlY0NHSSIpKSB7Ci0JICAgIG9wdCA9IE9QVF9FWEVDQ0dJOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiTXVsdGlWaWV3cyIpKSB7Ci0JICAgIG9wdCA9IE9QVF9NVUxUSTsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIlJ1blNjcmlwdHMiKSkgeyAvKiBBSSBiYWNrY29tcGF0LiBZdWNrICovCi0JICAgIG9wdCA9IE9QVF9NVUxUSXxPUFRfRVhFQ0NHSTsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIk5vbmUiKSkgewotCSAgICBvcHQgPSBPUFRfTk9ORTsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIkFsbCIpKSB7Ci0JICAgIG9wdCA9IE9QVF9BTEw7Ci0JfQotCWVsc2UgewotCSAgICByZXR1cm4gYXByX3BzdHJjYXQoY21kLT5wb29sLCAiSWxsZWdhbCBvcHRpb24gIiwgdywgTlVMTCk7Ci0JfQotCi0JLyogd2UgZW5zdXJlIHRoZSBpbnZhcmlhbnQgKGQtPm9wdHNfYWRkICYgZC0+b3B0c19yZW1vdmUpID09IDAgKi8KLQlpZiAoYWN0aW9uID09ICctJykgewotCSAgICBkLT5vcHRzX3JlbW92ZSB8PSBvcHQ7Ci0JICAgIGQtPm9wdHNfYWRkICY9IH5vcHQ7Ci0JICAgIGQtPm9wdHMgJj0gfm9wdDsKLQl9Ci0JZWxzZSBpZiAoYWN0aW9uID09ICcrJykgewotCSAgICBkLT5vcHRzX2FkZCB8PSBvcHQ7Ci0JICAgIGQtPm9wdHNfcmVtb3ZlICY9IH5vcHQ7Ci0JICAgIGQtPm9wdHMgfD0gb3B0OwotCX0KLQllbHNlIHsKLQkgICAgZC0+b3B0cyB8PSBvcHQ7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2F0aXNmeShjbWRfcGFybXMgKmNtZCwgdm9pZCAqY18sIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmM9Y187Ci0KLSAgICBpZiAoIXN0cmNhc2VjbXAoYXJnLCAiYWxsIikpIHsKLSAgICAgICAgYy0+c2F0aXNmeSA9IFNBVElTRllfQUxMOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY2FzZWNtcChhcmcsICJhbnkiKSkgewotICAgICAgICBjLT5zYXRpc2Z5ID0gU0FUSVNGWV9BTlk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXR1cm4gIlNhdGlzZnkgZWl0aGVyICdhbnknIG9yICdhbGwnLiI7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqcmVxdWlyZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqY18sIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICByZXF1aXJlX2xpbmUgKnI7Ci0gICAgY29yZV9kaXJfY29uZmlnICpjPWNfOwotCi0gICAgaWYgKCFjLT5hcF9yZXF1aXJlcykgewotICAgICAgICBjLT5hcF9yZXF1aXJlcyA9IGFwcl9hcnJheV9tYWtlKGNtZC0+cG9vbCwgMiwgc2l6ZW9mKHJlcXVpcmVfbGluZSkpOwotICAgIH0KLSAgICByID0gKHJlcXVpcmVfbGluZSAqKWFwcl9hcnJheV9wdXNoKGMtPmFwX3JlcXVpcmVzKTsKLSAgICByLT5yZXF1aXJlbWVudCA9IGFwcl9wc3RyZHVwKGNtZC0+cG9vbCwgYXJnKTsKLSAgICByLT5tZXRob2RfbWFzayA9IGNtZC0+bGltaXRlZDsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotQVBfQ09SRV9ERUNMQVJFX05PTlNURChjb25zdCBjaGFyICopIGFwX2xpbWl0X3NlY3Rpb24oY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LAotCQkJCQkJICBjb25zdCBjaGFyICphcmcpIHsKLSAgICBjb25zdCBjaGFyICpsaW1pdGVkX21ldGhvZHMgPSBhcF9nZXR3b3JkKGNtZC0+cG9vbCwgJmFyZywgJz4nKTsKLSAgICB2b2lkICp0b2cgPSBjbWQtPmNtZC0+Y21kX2RhdGE7Ci0gICAgaW50IGxpbWl0ZWQgPSAwOwotICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKLSAgCi0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBOT1RfSU5fTElNSVQpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHdoaWxlIChsaW1pdGVkX21ldGhvZHNbMF0pIHsKLSAgICAgICAgY2hhciAqbWV0aG9kID0gYXBfZ2V0d29yZF9jb25mKGNtZC0+cG9vbCwgJmxpbWl0ZWRfbWV0aG9kcyk7Ci0gICAgICAgIGludCAgbWV0aG51bSA9IGFwX21ldGhvZF9udW1iZXJfb2YobWV0aG9kKTsKLQotICAgICAgICBpZiAobWV0aG51bSA9PSBNX1RSQUNFICYmICF0b2cpIHsKLSAgICAgICAgICAgIHJldHVybiAiVFJBQ0UgY2Fubm90IGJlIGNvbnRyb2xsZWQgYnkgPExpbWl0PiI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG51bSA9PSBNX0lOVkFMSUQpIHsKLQkgICAgY2hhciAqKnhtZXRob2Q7Ci0JICAgIHJlZ2lzdGVyIGludCBpLCBqLCBrOwotCi0JICAgIC8qCi0JICAgICAqIERlYWwgd2l0aCA8TGltaXQ+IGJ5IGFkZGluZyB0aGUgbWV0aG9kIHRvIHRoZSBsaXN0LgotCSAgICAgKi8KLQkgICAgaWYgKCF0b2cpIHsKLQkJaWYgKGNtZC0+bGltaXRlZF94bWV0aG9kcyA9PSBOVUxMKSB7Ci0JCSAgICBjbWQtPmxpbWl0ZWRfeG1ldGhvZHMgPSBhcHJfYXJyYXlfbWFrZShjbWQtPnBvb2wsIDIsCi0JCQkJCQkJICAgc2l6ZW9mKGNoYXIgKikpOwotCQl9Ci0JCXhtZXRob2QgPSAoY2hhciAqKikgYXByX2FycmF5X3B1c2goY21kLT5saW1pdGVkX3htZXRob2RzKTsKLQkJKnhtZXRob2QgPSBhcHJfcHN0cmR1cChjbWQtPnBvb2wsIG1ldGhvZCk7Ci0JICAgIH0KLQkgICAgLyoKLQkgICAgICogPExpbWl0RXhjZXB0Piwgc28gcmVtb3ZlIGFueS9hbGwgb2NjdXJyZW5jZXMgb2YgdGhlIG1ldGhvZAotCSAgICAgKiBpbiB0aGUgZXh0ZW5zaW9uIGFycmF5LgotCSAgICAgKi8KLQkgICAgZWxzZSBpZiAoKGNtZC0+bGltaXRlZF94bWV0aG9kcyAhPSBOVUxMKQotCQkgICAgICYmIChjbWQtPmxpbWl0ZWRfeG1ldGhvZHMtPm5lbHRzICE9IDApKSB7Ci0JCXhtZXRob2QgPSAoY2hhciAqKikgY21kLT5saW1pdGVkX3htZXRob2RzLT5lbHRzOwotCQlmb3IgKGkgPSAwOyBpIDwgY21kLT5saW1pdGVkX3htZXRob2RzLT5uZWx0czsgKSB7Ci0JCSAgICBpZiAoc3RyY21wKHhtZXRob2RbaV0sIG1ldGhvZCkgPT0gMCkgewotCQkJZm9yIChqID0gaSwgayA9IGkgKyAxOwotCQkJICAgICBrIDwgY21kLT5saW1pdGVkX3htZXRob2RzLT5uZWx0czsKLQkJCSAgICAgKytqLCArK2spIHsKLQkJCSAgICB4bWV0aG9kW2pdID0geG1ldGhvZFtrXTsKLQkJCX0KLQkJCWNtZC0+bGltaXRlZF94bWV0aG9kcy0+bmVsdHMtLTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0gICAgICAgIH0KLQlsaW1pdGVkIHw9ICgxIDw8IG1ldGhudW0pOwotICAgIH0KLQotICAgIC8qIEtpbGxpbmcgdHdvIGZlYXR1cmVzIHdpdGggb25lIGZ1bmN0aW9uLAotICAgICAqIGlmICh0b2cgPT0gTlVMTCkgPExpbWl0PiwgZWxzZSA8TGltaXRFeGNlcHQ+Ci0gICAgICovCi0gICAgY21kLT5saW1pdGVkID0gdG9nID8gfmxpbWl0ZWQgOiBsaW1pdGVkOwotCi0gICAgZXJybXNnID0gYXBfd2Fsa19jb25maWcoY21kLT5kaXJlY3RpdmUtPmZpcnN0X2NoaWxkLCBjbWQsIGNtZC0+Y29udGV4dCk7Ci0KLSAgICBjbWQtPmxpbWl0ZWQgPSAtMTsKLQotICAgIHJldHVybiBlcnJtc2c7Ci19Ci0KLS8qIFdlIHVzZSB0aGlzIGluIDxEaXJlY3RvcnlNYXRjaD4gYW5kIDxGaWxlc01hdGNoPiwgdG8gZW5zdXJlIHRoYXQgCi0gKiBwZW9wbGUgZG9uJ3QgZ2V0IGJpdHRlbiBieSB3cm9uZy1jYXNlZCByZWdleCBtYXRjaGVzCi0gKi8KLQotI2lmZGVmIFdJTjMyCi0jZGVmaW5lIFVTRV9JQ0FTRSBSRUdfSUNBU0UKLSNlbHNlCi0jZGVmaW5lIFVTRV9JQ0FTRSAwCi0jZW5kaWYKLQotLyoKLSAqIFJlcG9ydCBhIG1pc3NpbmctJz4nIHN5bnRheCBlcnJvci4KLSAqLwotc3RhdGljIGNoYXIgKnVuY2xvc2VkX2RpcmVjdGl2ZShjbWRfcGFybXMgKmNtZCkKLXsKLSAgICByZXR1cm4gYXByX3BzdHJjYXQoY21kLT5wb29sLCBjbWQtPmNtZC0+bmFtZSwKLQkJICAgICAgIj4gZGlyZWN0aXZlIG1pc3NpbmcgY2xvc2luZyAnPiciLCBOVUxMKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmRpcnNlY3Rpb24oY21kX3Bhcm1zICpjbWQsIHZvaWQgKm1jb25maWcsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0gICAgY29uc3QgY2hhciAqZW5kcCA9IGFwX3N0cnJjaHJfYyhhcmcsICc+Jyk7Ci0gICAgaW50IG9sZF9vdmVycmlkZXMgPSBjbWQtPm92ZXJyaWRlOwotICAgIGNoYXIgKm9sZF9wYXRoID0gY21kLT5wYXRoOwotICAgIGNvcmVfZGlyX2NvbmZpZyAqY29uZjsKLSAgICBhcF9jb25mX3ZlY3Rvcl90ICpuZXdfZGlyX2NvbmYgPSBhcF9jcmVhdGVfcGVyX2Rpcl9jb25maWcoY21kLT5wb29sKTsKLSAgICByZWdleF90ICpyID0gTlVMTDsKLSAgICBjb25zdCBjb21tYW5kX3JlYyAqdGhpc2NtZCA9IGNtZC0+Y21kOwotCi0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLAotCQkJCQkgICBOT1RfSU5fRElSX0xPQ19GSUxFfE5PVF9JTl9MSU1JVCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKGVuZHAgPT0gTlVMTCkgewotCXJldHVybiB1bmNsb3NlZF9kaXJlY3RpdmUoY21kKTsKLSAgICB9Ci0KLSAgICBhcmc9YXByX3BzdHJuZHVwKGNtZC0+cG9vbCwgYXJnLCBlbmRwLWFyZyk7Ci0KLSAgICBjbWQtPnBhdGggPSBhcF9nZXR3b3JkX2NvbmYoY21kLT5wb29sLCAmYXJnKTsKLSAgICBjbWQtPm92ZXJyaWRlID0gT1JfQUxMfEFDQ0VTU19DT05GOwotCi0gICAgaWYgKHRoaXNjbWQtPmNtZF9kYXRhKSB7IC8qIDxEaXJlY3RvcnlNYXRjaD4gKi8KLQlyID0gYXBfcHJlZ2NvbXAoY21kLT5wb29sLCBjbWQtPnBhdGgsIFJFR19FWFRFTkRFRHxVU0VfSUNBU0UpOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGNtZC0+cGF0aCwgIn4iKSkgewotCWNtZC0+cGF0aCA9IGFwX2dldHdvcmRfY29uZihjbWQtPnBvb2wsICZhcmcpOwotCXIgPSBhcF9wcmVnY29tcChjbWQtPnBvb2wsIGNtZC0+cGF0aCwgUkVHX0VYVEVOREVEfFVTRV9JQ0FTRSk7Ci0gICAgfQotI2lmIGRlZmluZWQoSEFWRV9EUklWRV9MRVRURVJTKSB8fCBkZWZpbmVkKE5FVFdBUkUpCi0gICAgZWxzZSBpZiAoc3RyY21wKGNtZC0+cGF0aCwgIi8iKSA9PSAwKSB7Ci0gICAgICAgIC8qIFRyZWF0ICdkZWZhdWx0JyBwYXRoIC8gYXMgYW4gaW5hbGllbmFibGUgcm9vdCAqLwotICAgICAgICBjbWQtPnBhdGggPSBhcHJfcHN0cmR1cChjbWQtPnBvb2wsIGNtZC0+cGF0aCk7Ci0gICAgfQotI2VuZGlmCi0jaWYgZGVmaW5lZChIQVZFX1VOQ19QQVRIUykKLSAgICBlbHNlIGlmIChzdHJjbXAoY21kLT5wYXRoLCAiLy8iKSA9PSAwKSB7Ci0gICAgICAgIC8qIFRyZWF0IFVOQyBwYXRoIC8vIGFzIGFuIGluYWxpZW5hYmxlIHJvb3QgKi8KLSAgICAgICAgY21kLT5wYXRoID0gYXByX3BzdHJkdXAoY21kLT5wb29sLCBjbWQtPnBhdGgpOwotICAgIH0KLSNlbmRpZgotICAgIGVsc2UgewotCS8qIEVuc3VyZSB0aGF0IHRoZSBwYXRobmFtZSBpcyBjYW5vbmljYWwgKi8KLQljbWQtPnBhdGggPSBhcF9vc19jYW5vbmljYWxfZmlsZW5hbWUoY21kLT5wb29sLCBjbWQtPnBhdGgpOwotICAgIH0KLQotICAgIC8qIGluaXRpYWxpemUgb3VyIGNvbmZpZyBhbmQgZmV0Y2ggaXQgKi8KLSAgICBjb25mID0gYXBfc2V0X2NvbmZpZ192ZWN0b3JzKGNtZC0+c2VydmVyLCBuZXdfZGlyX2NvbmYsIGNtZC0+cGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3JlX21vZHVsZSwgY21kLT5wb29sKTsKLQotICAgIGVycm1zZyA9IGFwX3dhbGtfY29uZmlnKGNtZC0+ZGlyZWN0aXZlLT5maXJzdF9jaGlsZCwgY21kLCBuZXdfZGlyX2NvbmYpOwotICAgIGlmIChlcnJtc2cgIT0gTlVMTCkKLQlyZXR1cm4gZXJybXNnOwotCi0gICAgY29uZi0+ciA9IHI7Ci0KLSAgICBhcF9hZGRfcGVyX2Rpcl9jb25mKGNtZC0+c2VydmVyLCBuZXdfZGlyX2NvbmYpOwotCi0gICAgaWYgKCphcmcgIT0gJ1wwJykgewotCXJldHVybiBhcHJfcHN0cmNhdChjbWQtPnBvb2wsICJNdWx0aXBsZSAiLCB0aGlzY21kLT5uYW1lLAotCQkJICAiPiBhcmd1bWVudHMgbm90ICh5ZXQpIHN1cHBvcnRlZC4iLCBOVUxMKTsKLSAgICB9Ci0KLSAgICBjbWQtPnBhdGggPSBvbGRfcGF0aDsKLSAgICBjbWQtPm92ZXJyaWRlID0gb2xkX292ZXJyaWRlczsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqdXJsc2VjdGlvbihjbWRfcGFybXMgKmNtZCwgdm9pZCAqbWNvbmZpZywgY29uc3QgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKLSAgICBjb25zdCBjaGFyICplbmRwID0gYXBfc3RycmNocl9jKGFyZywgJz4nKTsKLSAgICBpbnQgb2xkX292ZXJyaWRlcyA9IGNtZC0+b3ZlcnJpZGU7Ci0gICAgY2hhciAqb2xkX3BhdGggPSBjbWQtPnBhdGg7Ci0gICAgY29yZV9kaXJfY29uZmlnICpjb25mOwotICAgIHJlZ2V4X3QgKnIgPSBOVUxMOwotICAgIGNvbnN0IGNvbW1hbmRfcmVjICp0aGlzY21kID0gY21kLT5jbWQ7Ci0gICAgYXBfY29uZl92ZWN0b3JfdCAqbmV3X3VybF9jb25mID0gYXBfY3JlYXRlX3Blcl9kaXJfY29uZmlnKGNtZC0+cG9vbCk7Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLAotCQkJCQkgICBOT1RfSU5fRElSX0xPQ19GSUxFfE5PVF9JTl9MSU1JVCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKGVuZHAgPT0gTlVMTCkgewotCXJldHVybiB1bmNsb3NlZF9kaXJlY3RpdmUoY21kKTsKLSAgICB9Ci0KLSAgICBhcmc9YXByX3BzdHJuZHVwKGNtZC0+cG9vbCwgYXJnLCBlbmRwLWFyZyk7Ci0KLSAgICBjbWQtPnBhdGggPSBhcF9nZXR3b3JkX2NvbmYoY21kLT5wb29sLCAmYXJnKTsKLSAgICBjbWQtPm92ZXJyaWRlID0gT1JfQUxMfEFDQ0VTU19DT05GOwotCi0gICAgaWYgKHRoaXNjbWQtPmNtZF9kYXRhKSB7IC8qIDxMb2NhdGlvbk1hdGNoPiAqLwotCXIgPSBhcF9wcmVnY29tcChjbWQtPnBvb2wsIGNtZC0+cGF0aCwgUkVHX0VYVEVOREVEKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChjbWQtPnBhdGgsICJ+IikpIHsKLQljbWQtPnBhdGggPSBhcF9nZXR3b3JkX2NvbmYoY21kLT5wb29sLCAmYXJnKTsKLQlyID0gYXBfcHJlZ2NvbXAoY21kLT5wb29sLCBjbWQtPnBhdGgsIFJFR19FWFRFTkRFRCk7Ci0gICAgfQotCi0gICAgLyogaW5pdGlhbGl6ZSBvdXIgY29uZmlnIGFuZCBmZXRjaCBpdCAqLwotICAgIGNvbmYgPSBhcF9zZXRfY29uZmlnX3ZlY3RvcnMoY21kLT5zZXJ2ZXIsIG5ld191cmxfY29uZiwgY21kLT5wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcmVfbW9kdWxlLCBjbWQtPnBvb2wpOwotCi0gICAgZXJybXNnID0gYXBfd2Fsa19jb25maWcoY21kLT5kaXJlY3RpdmUtPmZpcnN0X2NoaWxkLCBjbWQsIG5ld191cmxfY29uZik7Ci0gICAgaWYgKGVycm1zZyAhPSBOVUxMKQotCXJldHVybiBlcnJtc2c7Ci0KLSAgICBjb25mLT5kID0gYXByX3BzdHJkdXAoY21kLT5wb29sLCBjbWQtPnBhdGgpOwkvKiBObyBtYW5nbGluZywgcGxlYXNlICovCi0gICAgY29uZi0+ZF9pc19mbm1hdGNoID0gYXByX2lzX2ZubWF0Y2goY29uZi0+ZCkgIT0gMDsKLSAgICBjb25mLT5yID0gcjsKLQotICAgIGFwX2FkZF9wZXJfdXJsX2NvbmYoY21kLT5zZXJ2ZXIsIG5ld191cmxfY29uZik7Ci0gICAgCi0gICAgaWYgKCphcmcgIT0gJ1wwJykgewotCXJldHVybiBhcHJfcHN0cmNhdChjbWQtPnBvb2wsICJNdWx0aXBsZSAiLCB0aGlzY21kLT5uYW1lLAotCQkJICAiPiBhcmd1bWVudHMgbm90ICh5ZXQpIHN1cHBvcnRlZC4iLCBOVUxMKTsKLSAgICB9Ci0KLSAgICBjbWQtPnBhdGggPSBvbGRfcGF0aDsKLSAgICBjbWQtPm92ZXJyaWRlID0gb2xkX292ZXJyaWRlczsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqZmlsZXNlY3Rpb24oY21kX3Bhcm1zICpjbWQsIHZvaWQgKm1jb25maWcsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0gICAgY29uc3QgY2hhciAqZW5kcCA9IGFwX3N0cnJjaHJfYyhhcmcsICc+Jyk7Ci0gICAgaW50IG9sZF9vdmVycmlkZXMgPSBjbWQtPm92ZXJyaWRlOwotICAgIGNoYXIgKm9sZF9wYXRoID0gY21kLT5wYXRoOwotICAgIGNvcmVfZGlyX2NvbmZpZyAqY29uZjsKLSAgICByZWdleF90ICpyID0gTlVMTDsKLSAgICBjb25zdCBjb21tYW5kX3JlYyAqdGhpc2NtZCA9IGNtZC0+Y21kOwotICAgIGNvcmVfZGlyX2NvbmZpZyAqYz1tY29uZmlnOwotICAgIGFwX2NvbmZfdmVjdG9yX3QgKm5ld19maWxlX2NvbmYgPSBhcF9jcmVhdGVfcGVyX2Rpcl9jb25maWcoY21kLT5wb29sKTsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIE5PVF9JTl9MSU1JVHxOT1RfSU5fTE9DQVRJT04pOwotCi0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKGVuZHAgPT0gTlVMTCkgewotCXJldHVybiB1bmNsb3NlZF9kaXJlY3RpdmUoY21kKTsKLSAgICB9Ci0KLSAgICBhcmc9YXByX3BzdHJuZHVwKGNtZC0+cG9vbCwgYXJnLCBlbmRwLWFyZyk7Ci0KLSAgICBjbWQtPnBhdGggPSBhcF9nZXR3b3JkX2NvbmYoY21kLT5wb29sLCAmYXJnKTsKLSAgICAvKiBPbmx5IGlmIG5vdCBhbiAuaHRhY2Nlc3MgZmlsZSAqLwotICAgIGlmICghb2xkX3BhdGgpIHsKLQljbWQtPm92ZXJyaWRlID0gT1JfQUxMfEFDQ0VTU19DT05GOwotICAgIH0KLQotICAgIGlmICh0aGlzY21kLT5jbWRfZGF0YSkgeyAvKiA8RmlsZXNNYXRjaD4gKi8KLSAgICAgICAgciA9IGFwX3ByZWdjb21wKGNtZC0+cG9vbCwgY21kLT5wYXRoLCBSRUdfRVhURU5ERUR8VVNFX0lDQVNFKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChjbWQtPnBhdGgsICJ+IikpIHsKLQljbWQtPnBhdGggPSBhcF9nZXR3b3JkX2NvbmYoY21kLT5wb29sLCAmYXJnKTsKLQlyID0gYXBfcHJlZ2NvbXAoY21kLT5wb29sLCBjbWQtPnBhdGgsIFJFR19FWFRFTkRFRHxVU0VfSUNBU0UpOwotICAgIH0KLSAgICBlbHNlIHsKLQkvKiBFbnN1cmUgdGhhdCB0aGUgcGF0aG5hbWUgaXMgY2Fub25pY2FsICovCi0JY21kLT5wYXRoID0gYXBfb3NfY2Fub25pY2FsX2ZpbGVuYW1lKGNtZC0+cG9vbCwgY21kLT5wYXRoKTsKLSAgICB9Ci0KLSAgICAvKiBpbml0aWFsaXplIG91ciBjb25maWcgYW5kIGZldGNoIGl0ICovCi0gICAgY29uZiA9IGFwX3NldF9jb25maWdfdmVjdG9ycyhjbWQtPnNlcnZlciwgbmV3X2ZpbGVfY29uZiwgY21kLT5wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcmVfbW9kdWxlLCBjbWQtPnBvb2wpOwotCi0gICAgZXJybXNnID0gYXBfd2Fsa19jb25maWcoY21kLT5kaXJlY3RpdmUtPmZpcnN0X2NoaWxkLCBjbWQsIG5ld19maWxlX2NvbmYpOwotICAgIGlmIChlcnJtc2cgIT0gTlVMTCkKLQlyZXR1cm4gZXJybXNnOwotCi0gICAgY29uZi0+ZCA9IGNtZC0+cGF0aDsKLSAgICBjb25mLT5kX2lzX2ZubWF0Y2ggPSBhcHJfaXNfZm5tYXRjaChjb25mLT5kKSAhPSAwOwotICAgIGNvbmYtPnIgPSByOwotCi0gICAgYXBfYWRkX2ZpbGVfY29uZihjLCBuZXdfZmlsZV9jb25mKTsKLQotICAgIGlmICgqYXJnICE9ICdcMCcpIHsKLQlyZXR1cm4gYXByX3BzdHJjYXQoY21kLT5wb29sLCAiTXVsdGlwbGUgIiwgdGhpc2NtZC0+bmFtZSwKLQkJCSAgIj4gYXJndW1lbnRzIG5vdCAoeWV0KSBzdXBwb3J0ZWQuIiwgTlVMTCk7Ci0gICAgfQotCi0gICAgY21kLT5wYXRoID0gb2xkX3BhdGg7Ci0gICAgY21kLT5vdmVycmlkZSA9IG9sZF9vdmVycmlkZXM7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnN0YXJ0X2lmbW9kKGNtZF9wYXJtcyAqY21kLCB2b2lkICptY29uZmlnLCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZW5kcCA9IGFwX3N0cnJjaHJfYyhhcmcsICc+Jyk7Ci0gICAgaW50IG5vdCA9IChhcmdbMF0gPT0gJyEnKTsKLSAgICBtb2R1bGUgKmZvdW5kOwotCi0gICAgaWYgKGVuZHAgPT0gTlVMTCkgewotCXJldHVybiB1bmNsb3NlZF9kaXJlY3RpdmUoY21kKTsKLSAgICB9Ci0KLSAgICBhcmc9YXByX3BzdHJuZHVwKGNtZC0+cG9vbCwgYXJnLCBlbmRwLWFyZyk7Ci0KLSAgICBpZiAobm90KSB7Ci0gICAgICAgIGFyZysrOwotICAgIH0KLQotICAgIGZvdW5kID0gYXBfZmluZF9saW5rZWRfbW9kdWxlKGFyZyk7Ci0KLSAgICBpZiAoKCFub3QgJiYgZm91bmQpIHx8IChub3QgJiYgIWZvdW5kKSkgewotICAgICAgICBhcF9kaXJlY3RpdmVfdCAqcGFyZW50ID0gTlVMTDsKLSAgICAgICAgYXBfZGlyZWN0aXZlX3QgKmN1cnJlbnQgPSBOVUxMOwotICAgICAgICBjb25zdCBjaGFyICpyZXR2YWw7Ci0KLSAgICAgICAgcmV0dmFsID0gYXBfYnVpbGRfY29udF9jb25maWcoY21kLT5wb29sLCBjbWQtPnRlbXBfcG9vbCwgY21kLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1cnJlbnQsICZwYXJlbnQsICI8SWZNb2R1bGUiKTsKLSAgICAgICAgKihhcF9kaXJlY3RpdmVfdCAqKiltY29uZmlnID0gY3VycmVudDsKLSAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICB9Ci0gICAgZWxzZSB7IAotICAgICAgICAqKGFwX2RpcmVjdGl2ZV90ICoqKW1jb25maWcgPSBOVUxMOwotICAgICAgICByZXR1cm4gYXBfc29ha19lbmRfY29udGFpbmVyKGNtZCwgIjxJZk1vZHVsZSIpOwotICAgIH0KLX0KLQotQVBfREVDTEFSRShpbnQpIGFwX2V4aXN0c19jb25maWdfZGVmaW5lKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgY2hhciAqKmRlZmluZXM7Ci0gICAgaW50IGk7Ci0KLSAgICBkZWZpbmVzID0gKGNoYXIgKiopYXBfc2VydmVyX2NvbmZpZ19kZWZpbmVzLT5lbHRzOwotICAgIGZvciAoaSA9IDA7IGkgPCBhcF9zZXJ2ZXJfY29uZmlnX2RlZmluZXMtPm5lbHRzOyBpKyspIHsKLSAgICAgICAgaWYgKHN0cmNtcChkZWZpbmVzW2ldLCBuYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLQl9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc3RhcnRfaWZkZWZpbmUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZW5kcDsKLSAgICBpbnQgZGVmaW5lZDsKLSAgICBpbnQgbm90ID0gMDsKLQotICAgIGVuZHAgPSBhcF9zdHJyY2hyX2MoYXJnLCAnPicpOwotICAgIGlmIChlbmRwID09IE5VTEwpIHsKLQlyZXR1cm4gdW5jbG9zZWRfZGlyZWN0aXZlKGNtZCk7Ci0gICAgfQotCi0gICAgYXJnPWFwcl9wc3RybmR1cChjbWQtPnBvb2wsIGFyZywgZW5kcC1hcmcpOwotCi0gICAgaWYgKGFyZ1swXSA9PSAnIScpIHsKLSAgICAgICAgbm90ID0gMTsKLQlhcmcrKzsKLSAgICB9Ci0KLSAgICBkZWZpbmVkID0gYXBfZXhpc3RzX2NvbmZpZ19kZWZpbmUoYXJnKTsKLSAgICBpZiAoKCFub3QgJiYgZGVmaW5lZCkgfHwgKG5vdCAmJiAhZGVmaW5lZCkpIHsKLSAgICAgICAgYXBfZGlyZWN0aXZlX3QgKnBhcmVudCA9IE5VTEw7Ci0gICAgICAgIGFwX2RpcmVjdGl2ZV90ICpjdXJyZW50ID0gTlVMTDsKLSAgICAgICAgY29uc3QgY2hhciAqcmV0dmFsOwotCi0gICAgICAgIHJldHZhbCA9IGFwX2J1aWxkX2NvbnRfY29uZmlnKGNtZC0+cG9vbCwgY21kLT50ZW1wX3Bvb2wsIGNtZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdXJyZW50LCAmcGFyZW50LCAiPElmRGVmaW5lIik7Ci0gICAgICAgICooYXBfZGlyZWN0aXZlX3QgKiopZHVtbXkgPSBjdXJyZW50OwotICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgIH0KLSAgICBlbHNlIHsgCi0gICAgICAgICooYXBfZGlyZWN0aXZlX3QgKiopZHVtbXkgPSBOVUxMOwotICAgICAgICByZXR1cm4gYXBfc29ha19lbmRfY29udGFpbmVyKGNtZCwgIjxJZkRlZmluZSIpOwotICAgIH0KLX0KLQotLyogaHR0cGQuY29uZiBjb21tYW5kcy4uLiBiZWdpbm5pbmcgd2l0aCB0aGUgPFZpcnR1YWxIb3N0PiBidXNpbmVzcyAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqdmlydHVhbGhvc3Rfc2VjdGlvbihjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBzZXJ2ZXJfcmVjICptYWluX3NlcnZlciA9IGNtZC0+c2VydmVyLCAqczsKLSAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0gICAgY29uc3QgY2hhciAqZW5kcCA9IGFwX3N0cnJjaHJfYyhhcmcsICc+Jyk7Ci0gICAgYXByX3Bvb2xfdCAqcCA9IGNtZC0+cG9vbDsKLQotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChlbmRwID09IE5VTEwpIHsKLQlyZXR1cm4gdW5jbG9zZWRfZGlyZWN0aXZlKGNtZCk7Ci0gICAgfQotCi0gICAgYXJnPWFwcl9wc3RybmR1cChjbWQtPnBvb2wsIGFyZywgZW5kcC1hcmcpOwotICAgIAotICAgIC8qIEZJWE1FOiBUaGVyZSdzIGFub3RoZXIgZmVhdHVyZSB3YWl0aW5nIHRvIGhhcHBlbiBoZXJlIC0tIHNpbmNlIHlvdQotCWNhbiBub3cgcHV0IG11bHRpcGxlIGFkZHJlc3Nlcy9uYW1lcyBvbiBhIHNpbmdsZSA8VmlydHVhbEhvc3Q+Ci0JeW91IG1pZ2h0IHdhbnQgdG8gdXNlIGl0IHRvIGdyb3VwIGNvbW1vbiBkZWZpbml0aW9ucyBhbmQgdGhlbgotCWRlZmluZSBvdGhlciAic3ViaG9zdHMiIHdpdGggdGhlaXIgaW5kaXZpZHVhbCBkaWZmZXJlbmNlcy4gIEJ1dAotCXBlcnNvbmFsbHkgSSdkIHJhdGhlciBqdXN0IGRvIGl0IHdpdGggYSBtYWNybyBwcmVwcm9jZXNzb3IuIC1kamcgKi8KLSAgICBpZiAobWFpbl9zZXJ2ZXItPmlzX3ZpcnR1YWwpIHsKLQlyZXR1cm4gIjxWaXJ0dWFsSG9zdD4gZG9lc24ndCBuZXN0ISI7Ci0gICAgfQotICAgIAotICAgIGVycm1zZyA9IGFwX2luaXRfdmlydHVhbF9ob3N0KHAsIGFyZywgbWFpbl9zZXJ2ZXIsICZzKTsKLSAgICBpZiAoZXJybXNnKSB7Ci0JcmV0dXJuIGVycm1zZzsKLSAgICB9Ci0KLSAgICBzLT5uZXh0ID0gbWFpbl9zZXJ2ZXItPm5leHQ7Ci0gICAgbWFpbl9zZXJ2ZXItPm5leHQgPSBzOwotCi0gICAgcy0+ZGVmbl9uYW1lID0gY21kLT5kaXJlY3RpdmUtPmZpbGVuYW1lOwotICAgIHMtPmRlZm5fbGluZV9udW1iZXIgPSBjbWQtPmRpcmVjdGl2ZS0+bGluZV9udW07Ci0KLSAgICBjbWQtPnNlcnZlciA9IHM7Ci0KLSAgICBlcnJtc2cgPSBhcF93YWxrX2NvbmZpZyhjbWQtPmRpcmVjdGl2ZS0+Zmlyc3RfY2hpbGQsIGNtZCwKLQkJCSAgICBzLT5sb29rdXBfZGVmYXVsdHMpOwotCi0gICAgY21kLT5zZXJ2ZXIgPSBtYWluX3NlcnZlcjsKLQotICAgIHJldHVybiBlcnJtc2c7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfc2VydmVyX2FsaWFzKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwKLQkJCQkgICAgY29uc3QgY2hhciAqYXJnKQotewotICAgIGlmICghY21kLT5zZXJ2ZXItPm5hbWVzKSB7Ci0JcmV0dXJuICJTZXJ2ZXJBbGlhcyBvbmx5IHVzZWQgaW4gPFZpcnR1YWxIb3N0PiI7Ci0gICAgfQotICAgIHdoaWxlICgqYXJnKSB7Ci0JY2hhciAqKml0ZW0sICpuYW1lID0gYXBfZ2V0d29yZF9jb25mKGNtZC0+cG9vbCwgJmFyZyk7Ci0JaWYgKGFwX2lzX21hdGNoZXhwKG5hbWUpKSB7Ci0JICAgIGl0ZW0gPSAoY2hhciAqKilhcHJfYXJyYXlfcHVzaChjbWQtPnNlcnZlci0+d2lsZF9uYW1lcyk7Ci0JfQotCWVsc2UgewotCSAgICBpdGVtID0gKGNoYXIgKiopYXByX2FycmF5X3B1c2goY21kLT5zZXJ2ZXItPm5hbWVzKTsKLQl9Ci0JKml0ZW0gPSBuYW1lOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmFkZF9maWx0ZXIoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgY29yZV9kaXJfY29uZmlnICpjb25mID0gZHVtbXk7Ci0gICAgY2hhciAqKm5ld2ZpbHRlcjsKLSAgICAKLSAgICBuZXdmaWx0ZXIgPSAoY2hhciAqKilhcHJfYXJyYXlfcHVzaChjb25mLT5vdXRwdXRfZmlsdGVycyk7Ci0gICAgKm5ld2ZpbHRlciA9IGFwcl9wc3RyZHVwKGNtZC0+cG9vbCwgYXJnKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmFkZF9pbnB1dF9maWx0ZXIoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgY29yZV9kaXJfY29uZmlnICpjb25mID0gZHVtbXk7Ci0gICAgY2hhciAqKm5ld2ZpbHRlcjsKLSAgICAKLSAgICBuZXdmaWx0ZXIgPSAoY2hhciAqKilhcHJfYXJyYXlfcHVzaChjb25mLT5pbnB1dF9maWx0ZXJzKTsKLSAgICAqbmV3ZmlsdGVyID0gYXByX3BzdHJkdXAoY21kLT5wb29sLCBhcmcpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3NlcnZlcl9zdHJpbmdfc2xvdChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksCi0JCQkJCSAgY29uc3QgY2hhciAqYXJnKQotewotICAgIC8qIFRoaXMgb25lJ3MgcHJldHR5IGdlbmVyaWMuLi4gKi8KLSAgCi0gICAgaW50IG9mZnNldCA9IChpbnQpKGxvbmcpY21kLT5pbmZvOwotICAgIGNoYXIgKnN0cnVjdF9wdHIgPSAoY2hhciAqKWNtZC0+c2VydmVyOwotICAgIAotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgCi0JCQkJCSAgIE5PVF9JTl9ESVJfTE9DX0ZJTEV8Tk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAqKGNvbnN0IGNoYXIgKiopKHN0cnVjdF9wdHIgKyBvZmZzZXQpID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2VydmVyX3BvcnQoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBOT1RfSU5fRElSX0xPQ19GSUxFfE5PVF9JTl9MSU1JVCk7Ci0gICAgaW50IHBvcnQ7Ci0KLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLQlyZXR1cm4gZXJyOwotICAgIH0KLSAgICBwb3J0ID0gYXRvaShhcmcpOwotICAgIGlmIChwb3J0IDw9IDAgfHwgcG9ydCA+PSA2NTUzNikgeyAvKiA2NTUzNiA9PSAxPDwxNiAqLwotCXJldHVybiBhcHJfcHN0cmNhdChjbWQtPnRlbXBfcG9vbCwgIlRoZSBwb3J0IG51bWJlciBcIiIsIGFyZywgCi0JCQkgICJcIiBpcyBvdXRzaWRlIHRoZSBhcHByb3ByaWF0ZSByYW5nZSAiCi0JCQkgICIoaS5lLiwgMS4uNjU1MzUpLiIsIE5VTEwpOwotICAgIH0KLSAgICBjbWQtPnNlcnZlci0+cG9ydCA9IHBvcnQ7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfc2lnbmF0dXJlX2ZsYWcoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmRfLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmQ9ZF87Ci0KLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIE5PVF9JTl9MSU1JVCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKHN0cmNhc2VjbXAoYXJnLCAiT24iKSA9PSAwKSB7Ci0JZC0+c2VydmVyX3NpZ25hdHVyZSA9IHNydl9zaWdfb247Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAoYXJnLCAiT2ZmIikgPT0gMCkgewotICAgICAgICBkLT5zZXJ2ZXJfc2lnbmF0dXJlID0gc3J2X3NpZ19vZmY7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAoYXJnLCAiRU1haWwiKSA9PSAwKSB7Ci0JZC0+c2VydmVyX3NpZ25hdHVyZSA9IHNydl9zaWdfd2l0aG1haWw7Ci0gICAgfQotICAgIGVsc2UgewotCXJldHVybiAiU2VydmVyU2lnbmF0dXJlOiB1c2Ugb25lIG9mOiBvZmYgfCBvbiB8IGVtYWlsIjsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfc2VydmVyX3Jvb3QoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LAotCQkJCSAgIGNvbnN0IGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0KLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBhcmcgPSBhcF9vc19jYW5vbmljYWxfZmlsZW5hbWUoY21kLT5wb29sLCBhcmcpOwotCi0gICAgaWYgKCFhcF9pc19kaXJlY3RvcnkoY21kLT5wb29sLCBhcmcpKSB7Ci0gICAgICAgIHJldHVybiAiU2VydmVyUm9vdCBtdXN0IGJlIGEgdmFsaWQgZGlyZWN0b3J5IjsKLSAgICB9Ci0gICAgYXBfc2VydmVyX3Jvb3QgPSBhcmc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfdGltZW91dChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIE5PVF9JTl9ESVJfTE9DX0ZJTEV8Tk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBjbWQtPnNlcnZlci0+dGltZW91dCA9IGF0b2koYXJnKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9pZGNoZWNrKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkXywgaW50IGFyZykgCi17Ci0gICAgY29yZV9kaXJfY29uZmlnICpkPWRfOwotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgTk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBkLT5kb19yZmMxNDEzID0gYXJnICE9IDA7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfaG9zdG5hbWVfbG9va3VwcyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZF8sCi0JCQkJCWNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmQ9ZF87Ci0KLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIE5PVF9JTl9MSU1JVCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKCFzdHJjYXNlY21wKGFyZywgIm9uIikpIHsKLQlkLT5ob3N0bmFtZV9sb29rdXBzID0gSE9TVE5BTUVfTE9PS1VQX09OOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY2FzZWNtcChhcmcsICJvZmYiKSkgewotCWQtPmhvc3RuYW1lX2xvb2t1cHMgPSBIT1NUTkFNRV9MT09LVVBfT0ZGOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY2FzZWNtcChhcmcsICJkb3VibGUiKSkgewotCWQtPmhvc3RuYW1lX2xvb2t1cHMgPSBIT1NUTkFNRV9MT09LVVBfRE9VQkxFOwotICAgIH0KLSAgICBlbHNlIHsKLQlyZXR1cm4gInBhcmFtZXRlciBtdXN0IGJlICdvbicsICdvZmYnLCBvciAnZG91YmxlJyI7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3NlcnZlcnBhdGgoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LAotCQkJCSAgY29uc3QgY2hhciAqYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIE5PVF9JTl9ESVJfTE9DX0ZJTEV8Tk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBjbWQtPnNlcnZlci0+cGF0aCA9IGFyZzsKLSAgICBjbWQtPnNlcnZlci0+cGF0aGxlbiA9IHN0cmxlbihhcmcpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2NvbnRlbnRfbWQ1KGNtZF9wYXJtcyAqY21kLCB2b2lkICpkXywgaW50IGFyZykKLXsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmQ9ZF87Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBOT1RfSU5fTElNSVQpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGQtPmNvbnRlbnRfbWQ1ID0gYXJnICE9IDA7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfdXNlX2Nhbm9uaWNhbF9uYW1lKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkXywKLQkJCQkJICBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgY29yZV9kaXJfY29uZmlnICpkPWRfOwotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgTk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLQlyZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChzdHJjYXNlY21wKGFyZywgIm9uIikgPT0gMCkgewotICAgICAgICBkLT51c2VfY2Fub25pY2FsX25hbWUgPSBVU0VfQ0FOT05JQ0FMX05BTUVfT047Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAoYXJnLCAib2ZmIikgPT0gMCkgewotICAgICAgICBkLT51c2VfY2Fub25pY2FsX25hbWUgPSBVU0VfQ0FOT05JQ0FMX05BTUVfT0ZGOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKGFyZywgImRucyIpID09IDApIHsKLSAgICAgICAgZC0+dXNlX2Nhbm9uaWNhbF9uYW1lID0gVVNFX0NBTk9OSUNBTF9OQU1FX0ROUzsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJldHVybiAicGFyYW1ldGVyIG11c3QgYmUgJ29uJywgJ29mZicsIG9yICdkbnMnIjsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmluY2x1ZGVfY29uZmlnIChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksCi0JCQkJICAgY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBhcF9kaXJlY3RpdmVfdCAqY29uZnRyZWUgPSBOVUxMOwotCi0gICAgYXBfcHJvY2Vzc19yZXNvdXJjZV9jb25maWcoY21kLT5zZXJ2ZXIsCi0JYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUoY21kLT5wb29sLCBuYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICZjb25mdHJlZSwgY21kLT5wb29sLCBjbWQtPnRlbXBfcG9vbCk7Ci0gICAgKihhcF9kaXJlY3RpdmVfdCAqKilkdW1teSA9IGNvbmZ0cmVlOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2xvZ2xldmVsKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY29uc3QgY2hhciAqYXJnKSAKLXsKLSAgICBjaGFyICpzdHI7Ci0gICAgCi0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLAotCQkJCQkgICBOT1RfSU5fRElSX0xPQ19GSUxFfE5PVF9JTl9MSU1JVCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKChzdHIgPSBhcF9nZXR3b3JkX2NvbmYoY21kLT5wb29sLCAmYXJnKSkpIHsKLSAgICAgICAgaWYgKCFzdHJjYXNlY21wKHN0ciwgImVtZXJnIikpIHsKLQkgICAgY21kLT5zZXJ2ZXItPmxvZ2xldmVsID0gQVBMT0dfRU1FUkc7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHN0ciwgImFsZXJ0IikpIHsKLQkgICAgY21kLT5zZXJ2ZXItPmxvZ2xldmVsID0gQVBMT0dfQUxFUlQ7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHN0ciwgImNyaXQiKSkgewotCSAgICBjbWQtPnNlcnZlci0+bG9nbGV2ZWwgPSBBUExPR19DUklUOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcChzdHIsICJlcnJvciIpKSB7Ci0JICAgIGNtZC0+c2VydmVyLT5sb2dsZXZlbCA9IEFQTE9HX0VSUjsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAoc3RyLCAid2FybiIpKSB7Ci0JICAgIGNtZC0+c2VydmVyLT5sb2dsZXZlbCA9IEFQTE9HX1dBUk5JTkc7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHN0ciwgIm5vdGljZSIpKSB7Ci0JICAgIGNtZC0+c2VydmVyLT5sb2dsZXZlbCA9IEFQTE9HX05PVElDRTsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAoc3RyLCAiaW5mbyIpKSB7Ci0JICAgIGNtZC0+c2VydmVyLT5sb2dsZXZlbCA9IEFQTE9HX0lORk87Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHN0ciwgImRlYnVnIikpIHsKLQkgICAgY21kLT5zZXJ2ZXItPmxvZ2xldmVsID0gQVBMT0dfREVCVUc7Ci0JfQotCWVsc2UgewotICAgICAgICAgICAgcmV0dXJuICJMb2dMZXZlbCByZXF1aXJlcyBsZXZlbCBrZXl3b3JkOiBvbmUgb2YgIgotCSAgICAgICAgICAgImVtZXJnL2FsZXJ0L2NyaXQvZXJyb3Ivd2Fybi9ub3RpY2UvaW5mby9kZWJ1ZyI7Ci0JfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcmV0dXJuICJMb2dMZXZlbCByZXF1aXJlcyBsZXZlbCBrZXl3b3JkIjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotQVBfREVDTEFSRShjb25zdCBjaGFyICopIGFwX3BzaWduYXR1cmUoY29uc3QgY2hhciAqcHJlZml4LCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjaGFyIHNwb3J0WzIwXTsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvbmY7Ci0KLSAgICBjb25mID0gKGNvcmVfZGlyX2NvbmZpZyAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLAotCQkJCQkJICAgJmNvcmVfbW9kdWxlKTsKLSAgICBpZiAoKGNvbmYtPnNlcnZlcl9zaWduYXR1cmUgPT0gc3J2X3NpZ19vZmYpCi0JICAgIHx8IChjb25mLT5zZXJ2ZXJfc2lnbmF0dXJlID09IHNydl9zaWdfdW5zZXQpKSB7Ci0JcmV0dXJuICIiOwotICAgIH0KLQotICAgIGFwcl9zbnByaW50ZihzcG9ydCwgc2l6ZW9mIHNwb3J0LCAiJXUiLCAodW5zaWduZWQpIGFwX2dldF9zZXJ2ZXJfcG9ydChyKSk7Ci0KLSAgICBpZiAoY29uZi0+c2VydmVyX3NpZ25hdHVyZSA9PSBzcnZfc2lnX3dpdGhtYWlsKSB7Ci0JcmV0dXJuIGFwcl9wc3RyY2F0KHItPnBvb2wsIHByZWZpeCwgIjxBRERSRVNTPiIgQVBfU0VSVkVSX0JBU0VWRVJTSU9OCi0JCQkgICIgU2VydmVyIGF0IDxBIEhSRUY9XCJtYWlsdG86IiwKLQkJCSAgci0+c2VydmVyLT5zZXJ2ZXJfYWRtaW4sICJcIj4iLAotCQkJICBhcF9nZXRfc2VydmVyX25hbWUociksICI8L0E+IFBvcnQgIiwgc3BvcnQsCi0JCQkgICI8L0FERFJFU1M+XG4iLCBOVUxMKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFwcl9wc3RyY2F0KHItPnBvb2wsIHByZWZpeCwgIjxBRERSRVNTPiIgQVBfU0VSVkVSX0JBU0VWRVJTSU9OCi0JCSAgICAgICIgU2VydmVyIGF0ICIsIGFwX2dldF9zZXJ2ZXJfbmFtZShyKSwgIiBQb3J0ICIsIHNwb3J0LAotCQkgICAgICAiPC9BRERSRVNTPlxuIiwgTlVMTCk7Ci19Ci0KLS8qCi0gKiBMb2FkIGFuIGF1dGhvcmlzYXRpb24gcmVhbG0gaW50byBvdXIgbG9jYXRpb24gY29uZmlndXJhdGlvbiwgYXBwbHlpbmcgdGhlCi0gKiB1c3VhbCBydWxlcyB0aGF0IGFwcGx5IHRvIHJlYWxtcy4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9hdXRobmFtZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqbWNvbmZpZywKLQkJCQljb25zdCBjaGFyICp3b3JkMSkKLXsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmFjb25maWcgPSAoY29yZV9kaXJfY29uZmlnICopbWNvbmZpZzsKLQotICAgIGFjb25maWctPmFwX2F1dGhfbmFtZSA9IGFwX2VzY2FwZV9xdW90ZXMoY21kLT5wb29sLCB3b3JkMSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNpZmRlZiBfT1NEX1BPU0lYIC8qIEJTMjAwMCBMb2dvbiBQYXNzd2QgZmlsZSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9iczIwMDBfYWNjb3VudChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKm5hbWUpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIG9zX3NldF9hY2NvdW50KGNtZC0+cG9vbCwgbmFtZSk7Ci19Ci0jZW5kaWYgLypfT1NEX1BPU0lYKi8KLQotLyoKLSAqIEhhbmRsZSBhIHJlcXVlc3QgdG8gaW5jbHVkZSB0aGUgc2VydmVyJ3MgT1MgcGxhdGZvcm0gaW4gdGhlIFNlcnZlcgotICogcmVzcG9uc2UgaGVhZGVyIGZpZWxkICh0aGUgU2VydmVyVG9rZW5zIGRpcmVjdGl2ZSkuICBVbmZvcnR1bmF0ZWx5Ci0gKiB0aGlzIHJlcXVpcmVzIGEgbmV3IGdsb2JhbCBpbiBvcmRlciB0byBjb21tdW5pY2F0ZSB0aGUgc2V0dGluZyBiYWNrIHRvCi0gKiBodHRwX21haW4gc28gaXQgY2FuIGluc2VydCB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHJpZ2h0IHBsYWNlIGluIHRoZQotICogc3RyaW5nLgotICovCi0KLXN0YXRpYyBjaGFyICpzZXJ2ZXJfdmVyc2lvbiA9IE5VTEw7Ci1zdGF0aWMgaW50IHZlcnNpb25fbG9ja2VkID0gMDsgCi0KLWVudW0gc2VydmVyX3Rva2VuX3R5cGUgewotICAgIFNydlRrX01JTiwgICAgICAgICAgLyogZWc6IEFwYWNoZS8xLjMuMCAqLwotICAgIFNydlRrX09TLCAgICAgICAgICAgLyogZWc6IEFwYWNoZS8xLjMuMCAoVU5JWCkgKi8KLSAgICBTcnZUa19GVUxMLCAgICAgICAgIC8qIGVnOiBBcGFjaGUvMS4zLjAgKFVOSVgpIFBIUC8zLjAgRm9vQmFyLzEuMmIgKi8KLSAgICBTcnZUa19QUk9EVUNUX09OTFkgIC8qIGVnOiBBcGFjaGUgKi8KLX07Ci1zdGF0aWMgZW51bSBzZXJ2ZXJfdG9rZW5fdHlwZSBhcF9zZXJ2ZXJfdG9rZW5zID0gU3J2VGtfRlVMTDsKLQotc3RhdGljIGFwcl9zdGF0dXNfdCByZXNldF92ZXJzaW9uKHZvaWQgKmR1bW15KQotewotICAgIHZlcnNpb25fbG9ja2VkID0gMDsKLSAgICBhcF9zZXJ2ZXJfdG9rZW5zID0gU3J2VGtfRlVMTDsKLSAgICBzZXJ2ZXJfdmVyc2lvbiA9IE5VTEw7Ci0gICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotfQotCi1BUF9ERUNMQVJFKGNvbnN0IGNoYXIgKikgYXBfZ2V0X3NlcnZlcl92ZXJzaW9uKHZvaWQpCi17Ci0gICAgcmV0dXJuIChzZXJ2ZXJfdmVyc2lvbiA/IHNlcnZlcl92ZXJzaW9uIDogQVBfU0VSVkVSX0JBU0VWRVJTSU9OKTsKLX0KLQotQVBfREVDTEFSRSh2b2lkKSBhcF9hZGRfdmVyc2lvbl9jb21wb25lbnQoYXByX3Bvb2xfdCAqcGNvbmYsIGNvbnN0IGNoYXIgKmNvbXBvbmVudCkKLXsKLSAgICBpZiAoISB2ZXJzaW9uX2xvY2tlZCkgewotICAgICAgICAvKgotICAgICAgICAgKiBJZiB0aGUgdmVyc2lvbiBzdHJpbmcgaXMgbnVsbCwgcmVnaXN0ZXIgb3VyIGNsZWFudXAgdG8gcmVzZXQgdGhlCi0gICAgICAgICAqIHBvaW50ZXIgb24gcG9vbCBkZXN0cnVjdGlvbi4gV2UgYWxzbyBrbm93IHRoYXQsIGlmIE5VTEwsCi0gICAgICAgICAqIHdlIGFyZSBhZGRpbmcgdGhlIG9yaWdpbmFsIFNFUlZFUl9CQVNFVkVSU0lPTiBzdHJpbmcuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoc2VydmVyX3ZlcnNpb24gPT0gTlVMTCkgewotICAgICAgICAgICAgYXByX3Bvb2xfY2xlYW51cF9yZWdpc3RlcihwY29uZiwgTlVMTCwgcmVzZXRfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXByX3Bvb2xfY2xlYW51cF9udWxsKTsKLSAgICAgICAgICAgIHNlcnZlcl92ZXJzaW9uID0gYXByX3BzdHJkdXAocGNvbmYsIGNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVGFjayB0aGUgZ2l2ZW4gY29tcG9uZW50IGlkZW50aWZpZXIgdG8gdGhlIGVuZCBvZgotICAgICAgICAgICAgICogdGhlIGV4aXN0aW5nIHN0cmluZy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgc2VydmVyX3ZlcnNpb24gPSBhcHJfcHN0cmNhdChwY29uZiwgc2VydmVyX3ZlcnNpb24sICIgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsIE5VTEwpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKgotICogVGhpcyByb3V0aW5lIGFkZHMgdGhlIHJlYWwgc2VydmVyIGJhc2UgaWRlbnRpdHkgdG8gdGhlIHZlcnNpb24gc3RyaW5nLAotICogYW5kIHRoZW4gbG9ja3Mgb3V0IGNoYW5nZXMgdW50aWwgdGhlIG5leHQgcmVjb25maWcuCi0gKi8KLXN0YXRpYyB2b2lkIGFwX3NldF92ZXJzaW9uKGFwcl9wb29sX3QgKnBjb25mKQotewotICAgIGlmIChhcF9zZXJ2ZXJfdG9rZW5zID09IFNydlRrX1BST0RVQ1RfT05MWSkgewotICAgICAgICBhcF9hZGRfdmVyc2lvbl9jb21wb25lbnQocGNvbmYsIEFQX1NFUlZFUl9CQVNFUFJPRFVDVCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGFwX3NlcnZlcl90b2tlbnMgPT0gU3J2VGtfTUlOKSB7Ci0gICAgICAgIGFwX2FkZF92ZXJzaW9uX2NvbXBvbmVudChwY29uZiwgQVBfU0VSVkVSX0JBU0VWRVJTSU9OKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGFwX2FkZF92ZXJzaW9uX2NvbXBvbmVudChwY29uZiwgQVBfU0VSVkVSX0JBU0VWRVJTSU9OICIgKCIgUExBVEZPUk0gIikiKTsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBMb2NrIHRoZSBzZXJ2ZXJfdmVyc2lvbiBzdHJpbmcgaWYgd2UncmUgbm90IGRpc3BsYXlpbmcKLSAgICAgKiB0aGUgZnVsbCBzZXQgb2YgdG9rZW5zCi0gICAgICovCi0gICAgaWYgKGFwX3NlcnZlcl90b2tlbnMgIT0gU3J2VGtfRlVMTCkgewotICAgICAgICB2ZXJzaW9uX2xvY2tlZCsrOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9zZXJ2X3Rva2VucyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksCi0JCQkJICAgY29uc3QgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmICghc3RyY2FzZWNtcChhcmcsICJPUyIpKSB7Ci0gICAgICAgIGFwX3NlcnZlcl90b2tlbnMgPSBTcnZUa19PUzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJnLCAiTWluIikgfHwgIXN0cmNhc2VjbXAoYXJnLCAiTWluaW1hbCIpKSB7Ci0gICAgICAgIGFwX3NlcnZlcl90b2tlbnMgPSBTcnZUa19NSU47Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZywgIlByb2QiKSB8fCAhc3RyY2FzZWNtcChhcmcsICJQcm9kdWN0T25seSIpKSB7Ci0gICAgICAgIGFwX3NlcnZlcl90b2tlbnMgPSBTcnZUa19QUk9EVUNUX09OTFk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBhcF9zZXJ2ZXJfdG9rZW5zID0gU3J2VGtfRlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbGltaXRfcmVxX2xpbmUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9UX0lOX0RJUl9MT0NfRklMRXxOT1RfSU5fTElNSVQpOwotICAgIGludCBsaW07Ci0KLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgbGltID0gYXRvaShhcmcpOwotICAgIGlmIChsaW0gPCAwKSB7Ci0gICAgICAgIHJldHVybiBhcHJfcHN0cmNhdChjbWQtPnRlbXBfcG9vbCwgIkxpbWl0UmVxdWVzdExpbmUgXCIiLCBhcmcsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIiwgTlVMTCk7Ci0gICAgfQotICAgIGlmIChsaW0gPiBERUZBVUxUX0xJTUlUX1JFUVVFU1RfTElORSkgewotICAgICAgICByZXR1cm4gYXByX3BzcHJpbnRmKGNtZC0+dGVtcF9wb29sLCAiTGltaXRSZXF1ZXN0TGluZSBcIiVzXCIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11c3Qgbm90IGV4Y2VlZCB0aGUgcHJlY29tcGlsZWQgbWF4aW11bSBvZiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIERFRkFVTFRfTElNSVRfUkVRVUVTVF9MSU5FKTsKLSAgICB9Ci0gICAgY21kLT5zZXJ2ZXItPmxpbWl0X3JlcV9saW5lID0gbGltOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2xpbWl0X3JlcV9maWVsZHNpemUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9UX0lOX0RJUl9MT0NfRklMRXxOT1RfSU5fTElNSVQpOwotICAgIGludCBsaW07Ci0KLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgbGltID0gYXRvaShhcmcpOwotICAgIGlmIChsaW0gPCAwKSB7Ci0gICAgICAgIHJldHVybiBhcHJfcHN0cmNhdChjbWQtPnRlbXBfcG9vbCwgIkxpbWl0UmVxdWVzdEZpZWxkc2l6ZSBcIiIsIGFyZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJcIiBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgKDAgPSBubyBsaW1pdCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICB9Ci0gICAgaWYgKGxpbSA+IERFRkFVTFRfTElNSVRfUkVRVUVTVF9GSUVMRFNJWkUpIHsKLSAgICAgICAgcmV0dXJuIGFwcl9wc3ByaW50ZihjbWQtPnRlbXBfcG9vbCwgIkxpbWl0UmVxdWVzdEZpZWxkc2l6ZSBcIiVzXCIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBub3QgZXhjZWVkIHRoZSBwcmVjb21waWxlZCBtYXhpbXVtIG9mICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZywgREVGQVVMVF9MSU1JVF9SRVFVRVNUX0ZJRUxEU0laRSk7Ci0gICAgfQotICAgIGNtZC0+c2VydmVyLT5saW1pdF9yZXFfZmllbGRzaXplID0gbGltOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2xpbWl0X3JlcV9maWVsZHMoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LAotCQkJCQljb25zdCBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PVF9JTl9ESVJfTE9DX0ZJTEV8Tk9UX0lOX0xJTUlUKTsKLSAgICBpbnQgbGltOwotCi0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGxpbSA9IGF0b2koYXJnKTsKLSAgICBpZiAobGltIDwgMCkgewotICAgICAgICByZXR1cm4gYXByX3BzdHJjYXQoY21kLT50ZW1wX3Bvb2wsICJMaW1pdFJlcXVlc3RGaWVsZHMgXCIiLCBhcmcsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyICgwID0gbm8gbGltaXQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgfQotICAgIGNtZC0+c2VydmVyLT5saW1pdF9yZXFfZmllbGRzID0gbGltOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2xpbWl0X3JlcV9ib2R5KGNtZF9wYXJtcyAqY21kLCB2b2lkICpjb25mXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXJnKSAKLXsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvbmY9Y29uZl87Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBOT1RfSU5fTElNSVQpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIFdURjogSWYgc3RydG91bCBpcyBub3QgcG9ydGFibGUsIHRoZW4gd3JpdGUgYSByZXBsYWNlbWVudC4KLSAgICAgKiAgICAgIEluc3RlYWQgd2UgaGF2ZSBhbiBpZGlvdGljIGRlZmluZSBpbiBodHRwZC5oIHRoYXQgcHJldmVudHMKLSAgICAgKiAgICAgIGl0IGZyb20gYmVpbmcgdXNlZCBldmVuIHdoZW4gaXQgaXMgYXZhaWxhYmxlLiBTaGVlc2guCi0gICAgICovCi0gICAgY29uZi0+bGltaXRfcmVxX2JvZHkgPSAodW5zaWduZWQgbG9uZylzdHJ0b2woYXJnLCAoY2hhciAqKilOVUxMLCAxMCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbGltaXRfeG1sX3JlcV9ib2R5KGNtZF9wYXJtcyAqY21kLCB2b2lkICpjb25mXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFyZykgCi17Ci0gICAgY29yZV9kaXJfY29uZmlnICpjb25mID0gY29uZl87Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBOT1RfSU5fTElNSVQpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGNvbmYtPmxpbWl0X3htbF9ib2R5ID0gYXRvbChhcmcpOwotICAgIGlmIChjb25mLT5saW1pdF94bWxfYm9keSA8IDApCi0gICAgICAgIHJldHVybiAiTGltaXRYTUxSZXF1ZXN0Qm9keSByZXF1aXJlcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLiI7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotQVBfREVDTEFSRShzaXplX3QpIGFwX2dldF9saW1pdF94bWxfYm9keShjb25zdCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvbmY7Ci0KLSAgICBjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsICZjb3JlX21vZHVsZSk7Ci0gICAgaWYgKGNvbmYtPmxpbWl0X3htbF9ib2R5ID09IEFQX0xJTUlUX1VOU0VUKQotICAgICAgICByZXR1cm4gQVBfREVGQVVMVF9MSU1JVF9YTUxfQk9EWTsKLSAgICByZXR1cm4gKHNpemVfdCljb25mLT5saW1pdF94bWxfYm9keTsKLX0KLQotI2lmZGVmIFdJTjMyCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2ludGVycHJldGVyX3NvdXJjZShjbWRfcGFybXMgKmNtZCwgY29yZV9kaXJfY29uZmlnICpkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYXJnKQotewotICAgIGlmICghc3RyY2FzZWNtcChhcmcsICJyZWdpc3RyeSIpKSB7Ci0gICAgICAgIGQtPnNjcmlwdF9pbnRlcnByZXRlcl9zb3VyY2UgPSBJTlRFUlBSRVRFUl9TT1VSQ0VfUkVHSVNUUlk7Ci0gICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChhcmcsICJyZWdpc3RyeS1zdHJpY3QiKSkgewotICAgICAgICBkLT5zY3JpcHRfaW50ZXJwcmV0ZXJfc291cmNlID0gSU5URVJQUkVURVJfU09VUkNFX1JFR0lTVFJZX1NUUklDVDsKLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZywgInNjcmlwdCIpKSB7Ci0gICAgICAgIGQtPnNjcmlwdF9pbnRlcnByZXRlcl9zb3VyY2UgPSBJTlRFUlBSRVRFUl9TT1VSQ0VfU0hFQkFORzsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gYXByX3BzdHJjYXQoY21kLT50ZW1wX3Bvb2wsICJTY3JpcHRJbnRlcnByZXRlclNvdXJjZSBcIiIsIGFyZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJcIiBtdXN0IGJlIFwicmVnaXN0cnlcIiwgXCJyZWdpc3RyeS1zdHJpY3RcIiBvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJcInNjcmlwdFwiIiwgTlVMTCk7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoUkxJTUlUX0NQVSkgfHwgIShkZWZpbmVkIChSTElNSVRfREFUQSkgfHwgZGVmaW5lZCAoUkxJTUlUX1ZNRU0pIHx8IGRlZmluZWQoUkxJTUlUX0FTKSkgfHwgIWRlZmluZWQgKFJMSU1JVF9OUFJPQykKLXN0YXRpYyBjb25zdCBjaGFyICpub19zZXRfbGltaXQoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmNvbmZfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphcmcsIGNvbnN0IGNoYXIgKmFyZzIpCi17Ci0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCBjbWQtPnNlcnZlciwKLSAgICAgICAgICAgICAgICAiJXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIiwgY21kLT5jbWQtPm5hbWUpOwotICAgIHJldHVybiBOVUxMOwotfQotI2VuZGlmCi0KLSNpZmRlZiBSTElNSVRfQ1BVCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2xpbWl0X2NwdShjbWRfcGFybXMgKmNtZCwgdm9pZCAqY29uZl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphcmcsIGNvbnN0IGNoYXIgKmFyZzIpCi17Ci0gICAgY29yZV9kaXJfY29uZmlnICpjb25mPWNvbmZfOwotCi0gICAgdW5peGRfc2V0X3JsaW1pdChjbWQsICZjb25mLT5saW1pdF9jcHUsIGFyZywgYXJnMiwgUkxJTUlUX0NQVSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKFJMSU1JVF9EQVRBKSB8fCBkZWZpbmVkIChSTElNSVRfVk1FTSkgfHwgZGVmaW5lZChSTElNSVRfQVMpCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2xpbWl0X21lbShjbWRfcGFybXMgKmNtZCwgdm9pZCAqY29uZl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphcmcsIGNvbnN0IGNoYXIgKiBhcmcyKQotewotICAgIGNvcmVfZGlyX2NvbmZpZyAqY29uZj1jb25mXzsKLQotI2lmIGRlZmluZWQoUkxJTUlUX0FTKQotICAgIHVuaXhkX3NldF9ybGltaXQoY21kLCAmY29uZi0+bGltaXRfbWVtLCBhcmcsIGFyZzIgLFJMSU1JVF9BUyk7Ci0jZWxpZiBkZWZpbmVkKFJMSU1JVF9EQVRBKQotICAgIHVuaXhkX3NldF9ybGltaXQoY21kLCAmY29uZi0+bGltaXRfbWVtLCBhcmcsIGFyZzIsIFJMSU1JVF9EQVRBKTsKLSNlbGlmIGRlZmluZWQoUkxJTUlUX1ZNRU0pCi0gICAgdW5peGRfc2V0X3JsaW1pdChjbWQsICZjb25mLT5saW1pdF9tZW0sIGFyZywgYXJnMiwgUkxJTUlUX1ZNRU0pOwotI2VuZGlmCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFJMSU1JVF9OUFJPQwotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9saW1pdF9ucHJvYyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqY29uZl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFyZywgY29uc3QgY2hhciAqIGFyZzIpCi17Ci0gICAgY29yZV9kaXJfY29uZmlnICpjb25mPWNvbmZfOwotCi0gICAgdW5peGRfc2V0X3JsaW1pdChjbWQsICZjb25mLT5saW1pdF9ucHJvYywgYXJnLCBhcmcyLCBSTElNSVRfTlBST0MpOwotICAgIHJldHVybiBOVUxMOwotfQotI2VuZGlmCi0KLXN0YXRpYyBhcHJfc3RhdHVzX3Qgd3JpdGV2X2l0X2FsbChhcHJfc29ja2V0X3QgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlvdmVjICp2ZWMsIGludCBudmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcl9zaXplX3QgbGVuLCBhcHJfc2l6ZV90ICpuYnl0ZXMpCi17Ci0gICAgYXByX3NpemVfdCBieXRlc193cml0dGVuID0gMDsKLSAgICBhcHJfc3RhdHVzX3QgcnY7Ci0gICAgYXByX3NpemVfdCBuID0gbGVuOwotICAgIGFwcl9zaXplX3QgaSA9IDA7Ci0KLSAgICAqbmJ5dGVzID0gMDsKLQotICAgIC8qIFhYWCBoYW5kbGUgY2hlY2tpbmcgZm9yIG5vbi1ibG9ja2luZyBzb2NrZXQgKi8KLSAgICB3aGlsZSAoYnl0ZXNfd3JpdHRlbiAhPSBsZW4pIHsKLSAgICAgICAgcnYgPSBhcHJfc2VuZHYocywgdmVjICsgaSwgbnZlYyAtIGksICZuKTsKLSAgICAgICAgYnl0ZXNfd3JpdHRlbiArPSBuOwotICAgICAgICBpZiAocnYgIT0gQVBSX1NVQ0NFU1MpCi0gICAgICAgICAgICByZXR1cm4gcnY7Ci0gICAgICAgICpuYnl0ZXMgKz0gbjsKLQotICAgICAgICAvKiBJZiB0aGUgd3JpdGUgZGlkIG5vdCBjb21wbGV0ZSwgYWRqdXN0IHRoZSBpb3ZlY3MgYW5kIGlzc3VlCi0gICAgICAgICAqIGFwcl9zZW5kdiBhZ2FpbgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCBsZW4pIHsKLSAgICAgICAgICAgIC8qIFNraXAgb3ZlciB0aGUgdmVjdG9ycyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gKi8KLSAgICAgICAgICAgIGFwcl9zaXplX3QgY250ID0gdmVjW2ldLmlvdl9sZW47Ci0gICAgICAgICAgICB3aGlsZSAobiA+PSBjbnQgJiYgaSArIDEgPCBudmVjKSB7Ci0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIGNudCArPSB2ZWNbaV0uaW92X2xlbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuIDwgY250KSB7Ci0gICAgICAgICAgICAgICAgLyogSGFuZGxlIHBhcnRpYWwgd3JpdGUgb2YgdmVjIGkgKi8KLSAgICAgICAgICAgICAgICB2ZWNbaV0uaW92X2Jhc2UgPSAoY2hhciAqKSB2ZWNbaV0uaW92X2Jhc2UgKyAKLSAgICAgICAgICAgICAgICAgICAgKHZlY1tpXS5pb3ZfbGVuIC0gKGNudCAtIG4pKTsKLSAgICAgICAgICAgICAgICB2ZWNbaV0uaW92X2xlbiA9IGNudCAtbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBuID0gbGVuIC0gYnl0ZXNfd3JpdHRlbjsKLSAgICB9Ci0KLSAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci19Ci0KLS8qIHNlbmRmaWxlX2l0X2FsbCgpCi0gKiAgc2VuZCB0aGUgZW50aXJlIGZpbGUgdXNpbmcgc2VuZGZpbGUoKQotICogIGhhbmRsZSBwYXJ0aWFsIHdyaXRlcwotICogIHJldHVybiBvbmx5IHdoZW4gYWxsIGJ5dGVzIGhhdmUgYmVlbiBzZW50IG9yIGFuIGVycm9yIGlzIGVuY291bnRlcmVkLgotICovCi0KLSNpZiBBUFJfSEFTX1NFTkRGSUxFCi1zdGF0aWMgYXByX3N0YXR1c190IHNlbmRmaWxlX2l0X2FsbChjb25uX3JlYyAgICpjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcl9maWxlX3QgKmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXByX2hkdHJfdCAqaGR0ciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHJfb2ZmX3QgICBmaWxlX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcl9zaXplX3QgIGZpbGVfYnl0ZXNfbGVmdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHJfc2l6ZV90ICB0b3RhbF9ieXRlc19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXByX2ludDMyX3QgZmxhZ3MpCi17Ci0gICAgYXByX3N0YXR1c190IHJ2OwotI2lmZGVmIEFQX0RFQlVHCi0gICAgYXByX2ludDMyX3QgdGltZW91dCA9IDA7Ci0jZW5kaWYKLQotICAgIEFQX0RFQlVHX0FTU0VSVCgoYXByX2dldHNvY2tldG9wdChjLT5jbGllbnRfc29ja2V0LCBBUFJfU09fVElNRU9VVCwgCi0gICAgICAgICAgICAgICAgICAgICAgICZ0aW1lb3V0KSA9PSBBUFJfU1VDQ0VTUykgJiYgCi0gICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID4gMCk7ICAvKiBzb2NrZXQgbXVzdCBiZSBpbiB0aW1lb3V0IG1vZGUgKi8gCi0gICAgZG8gewotICAgICAgICBhcHJfc2l6ZV90IHRtcGxlbiA9IGZpbGVfYnl0ZXNfbGVmdDsKLSAgICAgICAgCi0gICAgICAgIHJ2ID0gYXByX3NlbmRmaWxlKGMtPmNsaWVudF9zb2NrZXQsIGZkLCBoZHRyLCAmZmlsZV9vZmZzZXQsICZ0bXBsZW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0gICAgICAgIHRvdGFsX2J5dGVzX2xlZnQgLT0gdG1wbGVuOwotICAgICAgICBpZiAoIXRvdGFsX2J5dGVzX2xlZnQgfHwgcnYgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHJldHVybiBydjsgICAgICAgIC8qIG5vcm1hbCBjYXNlICYgZXJyb3IgZXhpdCAqLyAKLSAgICAgICAgfQotCi0gICAgICAgIEFQX0RFQlVHX0FTU0VSVCh0b3RhbF9ieXRlc19sZWZ0ID4gMCAmJiB0bXBsZW4gPiAwKTsKLSAgICAgICAgCi0gICAgICAgIC8qIHBhcnRpYWwgd3JpdGUsIG9vb2ggbm9vb28uLi4gCi0gICAgICAgICAqIFNraXAgb3ZlciBhbnkgaGVhZGVyIGRhdGEgd2hpY2ggd2FzIHdyaXR0ZW4KLSAgICAgICAgICovCi0gICAgICAgIHdoaWxlICh0bXBsZW4gJiYgaGR0ci0+bnVtaGVhZGVycykgewotICAgICAgICAgICAgaWYgKHRtcGxlbiA+PSBoZHRyLT5oZWFkZXJzWzBdLmlvdl9sZW4pIHsKLSAgICAgICAgICAgICAgICB0bXBsZW4gLT0gaGR0ci0+aGVhZGVyc1swXS5pb3ZfbGVuOwotICAgICAgICAgICAgICAgIC0taGR0ci0+bnVtaGVhZGVyczsKLSAgICAgICAgICAgICAgICArK2hkdHItPmhlYWRlcnM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBjaGFyICppb3ZfYmFzZSA9IChjaGFyICopaGR0ci0+aGVhZGVyc1swXS5pb3ZfYmFzZTsKLQotICAgICAgICAgICAgICAgIGhkdHItPmhlYWRlcnNbMF0uaW92X2xlbiAtPSB0bXBsZW47Ci0gICAgICAgICAgICAgICAgaW92X2Jhc2UgKz0gdG1wbGVuOwotICAgICAgICAgICAgICAgIGhkdHItPmhlYWRlcnNbMF0uaW92X2Jhc2UgPSBpb3ZfYmFzZTsKLSAgICAgICAgICAgICAgICB0bXBsZW4gPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogU2tpcCBvdmVyIGFueSBmaWxlIGRhdGEgd2hpY2ggd2FzIHdyaXR0ZW4gKi8KLQotICAgICAgICBpZiAodG1wbGVuIDw9IGZpbGVfYnl0ZXNfbGVmdCkgewotICAgICAgICAgICAgZmlsZV9vZmZzZXQgKz0gdG1wbGVuOwotICAgICAgICAgICAgZmlsZV9ieXRlc19sZWZ0IC09IHRtcGxlbjsKLSAgICAgICAgICAgIGNvbnRpbnVlOyAKLSAgICAgICAgfQotICAgICAgICB0bXBsZW4gLT0gZmlsZV9ieXRlc19sZWZ0OwotICAgICAgICBmaWxlX2J5dGVzX2xlZnQgPSAwOwotICAgICAgICBmaWxlX29mZnNldCA9IDA7Ci0gICAgICAgIAotICAgICAgICAvKiBTa2lwIG92ZXIgYW55IHRyYWlsZXIgZGF0YSB3aGljaCB3YXMgd3JpdHRlbiAqLwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKHRtcGxlbiAmJiBoZHRyLT5udW10cmFpbGVycykgewotICAgICAgICAgICAgaWYgKHRtcGxlbiA+PSBoZHRyLT50cmFpbGVyc1swXS5pb3ZfbGVuKSB7Ci0gICAgICAgICAgICAgICAgdG1wbGVuIC09IGhkdHItPnRyYWlsZXJzWzBdLmlvdl9sZW47Ci0gICAgICAgICAgICAgICAgLS1oZHRyLT5udW10cmFpbGVyczsKLSAgICAgICAgICAgICAgICArK2hkdHItPnRyYWlsZXJzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2hhciAqaW92X2Jhc2UgPSAoY2hhciAqKWhkdHItPnRyYWlsZXJzWzBdLmlvdl9iYXNlOwotCi0gICAgICAgICAgICAgICAgaGR0ci0+dHJhaWxlcnNbMF0uaW92X2xlbiAtPSB0bXBsZW47Ci0gICAgICAgICAgICAgICAgaW92X2Jhc2UgKz0gdG1wbGVuOwotICAgICAgICAgICAgICAgIGhkdHItPnRyYWlsZXJzWzBdLmlvdl9iYXNlID0gaW92X2Jhc2U7Ci0gICAgICAgICAgICAgICAgdG1wbGVuID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gd2hpbGUgKDEpOwotfQotI2VuZGlmCi0gICAgICAgIAotLyoKLSAqIHNlbmRfdGhlX2ZpbGUoKQotICogU2VuZHMgdGhlIGNvbnRlbnRzIG9mIGZpbGUgZmQgYWxvbmcgd2l0aCBoZWFkZXIvdHJhaWxlciBieXRlcywgaWYgYW55LAotICogdG8gdGhlIG5ldHdvcmsuIHNlbmRfdGhlX2ZpbGUgd2lsbCByZXR1cm4gb25seSB3aGVuIGFsbCB0aGUgYnl0ZXMgaGF2ZSBiZWVuCi0gKiBzZW50IChpLmUuLCBpdCBoYW5kbGVzIHBhcnRpYWwgd3JpdGVzKSBvciBvbiBhIG5ldHdvcmsgZXJyb3IgY29uZGl0aW9uLgotICovCi1zdGF0aWMgYXByX3N0YXR1c190IHNlbmRfdGhlX2ZpbGUoY29ubl9yZWMgKmMsIGFwcl9maWxlX3QgKmZkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHJfaGR0cl90ICpoZHRyLCBhcHJfb2ZmX3Qgb2Zmc2V0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHJfc2l6ZV90IGxlbmd0aCwgYXByX3NpemVfdCAqbmJ5dGVzKSAKLXsKLSAgICBhcHJfc3RhdHVzX3QgcnYgPSBBUFJfU1VDQ0VTUzsKLSAgICBhcHJfaW50MzJfdCB0b2dvOyAgICAgICAgIC8qIFJlbWFpbmluZyBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGZpbGUgdG8gc2VuZCAqLwotICAgIGFwcl9zaXplX3Qgc2VuZGxlbiA9IDA7Ci0gICAgYXByX3NpemVfdCBieXRlc19zZW50OwotICAgIGFwcl9pbnQzMl90IGk7Ci0gICAgYXByX29mZl90IG87ICAgICAgICAgICAgICAvKiBUcmFjayB0aGUgZmlsZSBvZmZzZXQgZm9yIHBhcnRpYWwgd3JpdGVzICovCi0gICAgY2hhciBidWZmZXJbODE5Ml07Ci0KLSAgICAqbmJ5dGVzID0gMDsKLQotICAgIC8qIFNlbmQgdGhlIGhlYWRlcnMgCi0gICAgICogd3JpdGV2X2l0X2FsbCBoYW5kbGVzIHBhcnRpYWwgd3JpdGVzLgotICAgICAqIFhYWDogb3B0aW1pemF0aW9uLi4uIGlmIGhlYWRlcnMgYXJlIGxlc3MgdGhhbiBNSU5fV1JJVEVfU0laRSwgY29weSAKLSAgICAgKiB0aGVtIGludG8gYnVmZmVyCi0gICAgICovCi0gICAgaWYgKCBoZHRyICYmIGhkdHItPm51bWhlYWRlcnMgPiAwICkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGR0ci0+bnVtaGVhZGVyczsgaSsrKSB7Ci0gICAgICAgICAgICBzZW5kbGVuICs9IGhkdHItPmhlYWRlcnNbaV0uaW92X2xlbjsKLSAgICAgICAgfQotICAgICAgICBydiA9IHdyaXRldl9pdF9hbGwoYy0+Y2xpZW50X3NvY2tldCwgaGR0ci0+aGVhZGVycywgaGR0ci0+bnVtaGVhZGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRsZW4sICZieXRlc19zZW50KTsKLSAgICAgICAgaWYgKHJ2ID09IEFQUl9TVUNDRVNTKQotICAgICAgICAgICAgKm5ieXRlcyArPSBieXRlc19zZW50OyAgICAgLyogdHJhY2sgdG90YWwgYnl0ZXMgc2VudCAqLwotICAgIH0KLQotICAgIC8qIFNlZWsgdGhlIGZpbGUgdG8gJ29mZnNldCcgKi8KLSAgICBpZiAob2Zmc2V0ICE9IDAgJiYgcnYgPT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgcnYgPSBhcHJfZmlsZV9zZWVrKGZkLCBBUFJfU0VULCAmb2Zmc2V0KTsKLSAgICB9Ci0KLSAgICAvKiBTZW5kIHRoZSBmaWxlLCBtYWtpbmcgc3VyZSB0byBoYW5kbGUgcGFydGlhbCB3cml0ZXMgKi8KLSAgICB0b2dvID0gbGVuZ3RoOwotICAgIHdoaWxlIChydiA9PSBBUFJfU1VDQ0VTUyAmJiB0b2dvKSB7Ci0gICAgICAgIHNlbmRsZW4gPSB0b2dvID4gc2l6ZW9mKGJ1ZmZlcikgPyBzaXplb2YoYnVmZmVyKSA6IHRvZ287Ci0gICAgICAgIG8gPSAwOwotICAgICAgICBydiA9IGFwcl9maWxlX3JlYWQoZmQsIGJ1ZmZlciwgJnNlbmRsZW4pOwotICAgICAgICB3aGlsZSAocnYgPT0gQVBSX1NVQ0NFU1MgJiYgc2VuZGxlbikgewotICAgICAgICAgICAgYnl0ZXNfc2VudCA9IHNlbmRsZW47Ci0gICAgICAgICAgICBydiA9IGFwcl9zZW5kKGMtPmNsaWVudF9zb2NrZXQsICZidWZmZXJbb10sICZieXRlc19zZW50KTsKLSAgICAgICAgICAgIGlmIChydiA9PSBBUFJfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgIHNlbmRsZW4gLT0gYnl0ZXNfc2VudDsgLyogc2VuZGxlbiAhPSBieXRlc19zZW50ID09PiBwYXJ0aWFsIHdyaXRlICovCi0gICAgICAgICAgICAgICAgbyArPSBieXRlc19zZW50OyAgICAgICAvKiBvIGlzIHdoZXJlIHdlIGFyZSBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgKm5ieXRlcyArPSBieXRlc19zZW50OwotICAgICAgICAgICAgICAgIHRvZ28gLT0gYnl0ZXNfc2VudDsgICAgLyogdHJhY2sgaG93IG11Y2ggb2YgdGhlIGZpbGUgd2UndmUgc2VudCAqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogU2VuZCB0aGUgdHJhaWxlcnMgCi0gICAgICogWFhYOiBvcHRpbWl6YXRpb24uLi4gaWYgaXQgd2lsbCBmaXQsIHNlbmQgdGhpcyBvbiB0aGUgbGFzdCBzZW5kIGluIHRoZSAKLSAgICAgKiBsb29wIGFib3ZlCi0gICAgICovCi0gICAgc2VuZGxlbiA9IDA7Ci0gICAgaWYgKCBydiA9PSBBUFJfU1VDQ0VTUyAmJiBoZHRyICYmIGhkdHItPm51bXRyYWlsZXJzID4gMCApIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGhkdHItPm51bXRyYWlsZXJzOyBpKyspIHsKLSAgICAgICAgICAgIHNlbmRsZW4gKz0gaGR0ci0+dHJhaWxlcnNbaV0uaW92X2xlbjsKLSAgICAgICAgfQotICAgICAgICBydiA9IHdyaXRldl9pdF9hbGwoYy0+Y2xpZW50X3NvY2tldCwgaGR0ci0+dHJhaWxlcnMsIGhkdHItPm51bXRyYWlsZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGxlbiwgJmJ5dGVzX3NlbnQpOwotICAgICAgICBpZiAocnYgPT0gQVBSX1NVQ0NFU1MpCi0gICAgICAgICAgICAqbmJ5dGVzICs9IGJ5dGVzX3NlbnQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJ2OwotfQotCi0vKiBOb3RlIC0tLSBFcnJvckRvY3VtZW50IHdpbGwgbm93IHdvcmsgZnJvbSAuaHRhY2Nlc3MgZmlsZXMuICAKLSAqIFRoZSBBbGxvd092ZXJyaWRlIG9mIEZpbGVpbmZvIGFsbG93cyB3ZWJtYXN0ZXJzIHRvIHR1cm4gaXQgb2ZmCi0gKi8KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIGNvcmVfY21kc1tdID0gewotCi0vKiBPbGQgYWNjZXNzIGNvbmZpZyBmaWxlIGNvbW1hbmRzICovCi0KLUFQX0lOSVRfUkFXX0FSR1MoIjxEaXJlY3RvcnkiLCBkaXJzZWN0aW9uLCBOVUxMLCBSU1JDX0NPTkYsIAotICAiQ29udGFpbmVyIGZvciBkaXJlY3RpdmVzIGFmZmVjdGluZyByZXNvdXJjZXMgbG9jYXRlZCBpbiB0aGUgc3BlY2lmaWVkICIKLSAgImRpcmVjdG9yaWVzIiksCi1BUF9JTklUX1JBV19BUkdTKCI8TG9jYXRpb24iLCB1cmxzZWN0aW9uLCBOVUxMLCBSU1JDX0NPTkYsCi0gICJDb250YWluZXIgZm9yIGRpcmVjdGl2ZXMgYWZmZWN0aW5nIHJlc291cmNlcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSAiCi0gICJzcGVjaWZpZWQgVVJMIHBhdGhzIiksCi1BUF9JTklUX1JBV19BUkdTKCI8VmlydHVhbEhvc3QiLCB2aXJ0dWFsaG9zdF9zZWN0aW9uLCBOVUxMLCBSU1JDX0NPTkYsCi0gICJDb250YWluZXIgdG8gbWFwIGRpcmVjdGl2ZXMgdG8gYSBwYXJ0aWN1bGFyIHZpcnR1YWwgaG9zdCwgdGFrZXMgb25lIG9yICIKLSAgIm1vcmUgaG9zdCBhZGRyZXNzZXMiKSwKLUFQX0lOSVRfUkFXX0FSR1MoIjxGaWxlcyIsIGZpbGVzZWN0aW9uLCBOVUxMLCBPUl9BTEwsCi0gICJDb250YWluZXIgZm9yIGRpcmVjdGl2ZXMgYWZmZWN0aW5nIGZpbGVzIG1hdGNoaW5nIHNwZWNpZmllZCBwYXR0ZXJucyIpLAotQVBfSU5JVF9SQVdfQVJHUygiPExpbWl0IiwgYXBfbGltaXRfc2VjdGlvbiwgTlVMTCwgT1JfQUxMLAotICAiQ29udGFpbmVyIGZvciBhdXRoZW50aWNhdGlvbiBkaXJlY3RpdmVzIHdoZW4gYWNjZXNzZWQgdXNpbmcgc3BlY2lmaWVkIEhUVFAgIgotICAibWV0aG9kcyIpLAotQVBfSU5JVF9SQVdfQVJHUygiPExpbWl0RXhjZXB0IiwgYXBfbGltaXRfc2VjdGlvbiwgKHZvaWQqKTEsIE9SX0FMTCwKLSAgIkNvbnRhaW5lciBmb3IgYXV0aGVudGljYXRpb24gZGlyZWN0aXZlcyB0byBiZSBhcHBsaWVkIHdoZW4gYW55IEhUVFAgIgotICAibWV0aG9kIG90aGVyIHRoYW4gdGhvc2Ugc3BlY2lmaWVkIGlzIHVzZWQgdG8gYWNjZXNzIHRoZSByZXNvdXJjZSIpLAotQVBfSU5JVF9UQUtFMSgiPElmTW9kdWxlIiwgc3RhcnRfaWZtb2QsIE5VTEwsIEVYRUNfT05fUkVBRCB8IE9SX0FMTCwKLSAgIkNvbnRhaW5lciBmb3IgZGlyZWN0aXZlcyBiYXNlZCBvbiBleGlzdGFuY2Ugb2Ygc3BlY2lmaWVkIG1vZHVsZXMiKSwKLUFQX0lOSVRfVEFLRTEoIjxJZkRlZmluZSIsIHN0YXJ0X2lmZGVmaW5lLCBOVUxMLCBFWEVDX09OX1JFQUQgfCBPUl9BTEwsCi0gICJDb250YWluZXIgZm9yIGRpcmVjdGl2ZXMgYmFzZWQgb24gZXhpc3RhbmNlIG9mIGNvbW1hbmQgbGluZSBkZWZpbmVzIiksCi1BUF9JTklUX1JBV19BUkdTKCI8RGlyZWN0b3J5TWF0Y2giLCBkaXJzZWN0aW9uLCAodm9pZCopMSwgUlNSQ19DT05GLAotICAiQ29udGFpbmVyIGZvciBkaXJlY3RpdmVzIGFmZmVjdGluZyByZXNvdXJjZXMgbG9jYXRlZCBpbiB0aGUgIgotICAic3BlY2lmaWVkIGRpcmVjdG9yaWVzIiksCi1BUF9JTklUX1JBV19BUkdTKCI8TG9jYXRpb25NYXRjaCIsIHVybHNlY3Rpb24sICh2b2lkKikxLCBSU1JDX0NPTkYsCi0gICJDb250YWluZXIgZm9yIGRpcmVjdGl2ZXMgYWZmZWN0aW5nIHJlc291cmNlcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSAiCi0gICJzcGVjaWZpZWQgVVJMIHBhdGhzIiksCi1BUF9JTklUX1JBV19BUkdTKCI8RmlsZXNNYXRjaCIsIGZpbGVzZWN0aW9uLCAodm9pZCopMSwgT1JfQUxMLAotICAiQ29udGFpbmVyIGZvciBkaXJlY3RpdmVzIGFmZmVjdGluZyBmaWxlcyBtYXRjaGluZyBzcGVjaWZpZWQgcGF0dGVybnMiKSwKLUFQX0lOSVRfVEFLRTEoIkF1dGhUeXBlIiwgYXBfc2V0X3N0cmluZ19zbG90LAotICAodm9pZCopWHRPZmZzZXRPZihjb3JlX2Rpcl9jb25maWcsIGFwX2F1dGhfdHlwZSksIE9SX0FVVEhDRkcsIAotICAiQW4gSFRUUCBhdXRob3JpemF0aW9uIHR5cGUgKGUuZy4sIFwiQmFzaWNcIikiKSwKLUFQX0lOSVRfVEFLRTEoIkF1dGhOYW1lIiwgc2V0X2F1dGhuYW1lLCBOVUxMLCBPUl9BVVRIQ0ZHLAotICAiVGhlIGF1dGhlbnRpY2F0aW9uIHJlYWxtIChlLmcuIFwiTWVtYmVycyBPbmx5XCIpIiksCi1BUF9JTklUX1JBV19BUkdTKCJSZXF1aXJlIiwgcmVxdWlyZSwgTlVMTCwgT1JfQVVUSENGRywKLSAgIlNlbGVjdHMgd2hpY2ggYXV0aGVudGljYXRlZCB1c2VycyBvciBncm91cHMgbWF5IGFjY2VzcyBhIHByb3RlY3RlZCBzcGFjZSIpLAotQVBfSU5JVF9UQUtFMSgiU2F0aXNmeSIsIHNhdGlzZnksIE5VTEwsIE9SX0FVVEhDRkcsCi0gICJhY2Nlc3MgcG9saWN5IGlmIGJvdGggYWxsb3cgYW5kIHJlcXVpcmUgdXNlZCAoJ2FsbCcgb3IgJ2FueScpIiksCi0jaWZkZWYgR1BST0YKLUFQX0lOSVRfVEFLRTEoIkdwcm9mRGlyIiwgc2V0X2dwcm9mX2RpciwgTlVMTCwgUlNSQ19DT05GLAotICAiRGlyZWN0b3J5IHRvIHBsb3AgZ21vbi5vdXQgZmlsZXMiKSwKLSNlbmRpZgotQVBfSU5JVF9UQUtFMSgiQWRkRGVmYXVsdENoYXJzZXQiLCBzZXRfYWRkX2RlZmF1bHRfY2hhcnNldCwgTlVMTCwgT1JfRklMRUlORk8sIAotICAiVGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgY2hhcnNldCB0byBhZGQgdG8gYW55IENvbnRlbnQtVHlwZSB3aXRob3V0IG9uZSBvciAnT2ZmJyB0byBkaXNhYmxlIiksCi0KLS8qIE9sZCByZXNvdXJjZSBjb25maWcgZmlsZSBjb21tYW5kcyAqLwotICAKLUFQX0lOSVRfUkFXX0FSR1MoIkFjY2Vzc0ZpbGVOYW1lIiwgc2V0X2FjY2Vzc19uYW1lLCBOVUxMLCBSU1JDX0NPTkYsCi0gICJOYW1lKHMpIG9mIHBlci1kaXJlY3RvcnkgY29uZmlnIGZpbGVzIChkZWZhdWx0OiAuaHRhY2Nlc3MpIiksCi1BUF9JTklUX1RBS0UxKCJEb2N1bWVudFJvb3QiLCBzZXRfZG9jdW1lbnRfcm9vdCwgTlVMTCwgUlNSQ19DT05GLAotICAiUm9vdCBkaXJlY3Rvcnkgb2YgdGhlIGRvY3VtZW50IHRyZWUiKSwKLUFQX0lOSVRfVEFLRTIoIkVycm9yRG9jdW1lbnQiLCBzZXRfZXJyb3JfZG9jdW1lbnQsIE5VTEwsIE9SX0ZJTEVJTkZPLAotICAiQ2hhbmdlIHJlc3BvbnNlcyBmb3IgSFRUUCBlcnJvcnMiKSwKLUFQX0lOSVRfUkFXX0FSR1MoIkFsbG93T3ZlcnJpZGUiLCBzZXRfb3ZlcnJpZGUsIE5VTEwsIEFDQ0VTU19DT05GLAotICAiQ29udHJvbHMgd2hhdCBncm91cHMgb2YgZGlyZWN0aXZlcyBjYW4gYmUgY29uZmlndXJlZCBieSBwZXItZGlyZWN0b3J5ICIKLSAgImNvbmZpZyBmaWxlcyIpLAotQVBfSU5JVF9SQVdfQVJHUygiT3B0aW9ucyIsIHNldF9vcHRpb25zLCBOVUxMLCBPUl9PUFRJT05TLAotICAiU2V0IGEgbnVtYmVyIG9mIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gZGlyZWN0b3J5IiksCi1BUF9JTklUX1RBS0UxKCJEZWZhdWx0VHlwZSIsIGFwX3NldF9zdHJpbmdfc2xvdCwKLSAgKHZvaWQqKVh0T2Zmc2V0T2YgKGNvcmVfZGlyX2NvbmZpZywgYXBfZGVmYXVsdF90eXBlKSwKLSAgT1JfRklMRUlORk8sICJ0aGUgZGVmYXVsdCBNSU1FIHR5cGUgZm9yIHVudHlwYWJsZSBmaWxlcyIpLAotCi0vKiBPbGQgc2VydmVyIGNvbmZpZyBmaWxlIGNvbW1hbmRzICovCi0KLUFQX0lOSVRfVEFLRTEoIlBvcnQiLCBzZXJ2ZXJfcG9ydCwgTlVMTCwgUlNSQ19DT05GLCAiQSBUQ1AgcG9ydCBudW1iZXIiKSwKLUFQX0lOSVRfVEFLRTEoIkhvc3RuYW1lTG9va3VwcyIsIHNldF9ob3N0bmFtZV9sb29rdXBzLCBOVUxMLAotICBBQ0NFU1NfQ09ORnxSU1JDX0NPTkYsCi0gICJcIm9uXCIgdG8gZW5hYmxlLCBcIm9mZlwiIHRvIGRpc2FibGUgcmV2ZXJzZSBETlMgbG9va3Vwcywgb3IgXCJkb3VibGVcIiB0byAiCi0gICJlbmFibGUgZG91YmxlLXJldmVyc2UgRE5TIGxvb2t1cHMiKSwKLUFQX0lOSVRfVEFLRTEoIlNlcnZlckFkbWluIiwgc2V0X3NlcnZlcl9zdHJpbmdfc2xvdCwKLSAgKHZvaWQgKilYdE9mZnNldE9mIChzZXJ2ZXJfcmVjLCBzZXJ2ZXJfYWRtaW4pLCBSU1JDX0NPTkYsCi0gICJUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgc2VydmVyIGFkbWluaXN0cmF0b3IiKSwKLUFQX0lOSVRfVEFLRTEoIlNlcnZlck5hbWUiLCBzZXRfc2VydmVyX3N0cmluZ19zbG90LAotICAodm9pZCAqKVh0T2Zmc2V0T2YgKHNlcnZlcl9yZWMsIHNlcnZlcl9ob3N0bmFtZSksIFJTUkNfQ09ORiwKLSAgIlRoZSBob3N0bmFtZSBvZiB0aGUgc2VydmVyIiksCi1BUF9JTklUX1RBS0UxKCJTZXJ2ZXJTaWduYXR1cmUiLCBzZXRfc2lnbmF0dXJlX2ZsYWcsIE5VTEwsIE9SX0FMTCwKLSAgIkVuLS9kaXNhYmxlIHNlcnZlciBzaWduYXR1cmUgKG9ufG9mZnxlbWFpbCkiKSwKLUFQX0lOSVRfVEFLRTEoIlNlcnZlclJvb3QiLCBzZXRfc2VydmVyX3Jvb3QsIE5VTEwsIFJTUkNfQ09ORiwKLSAgIkNvbW1vbiBkaXJlY3Rvcnkgb2Ygc2VydmVyLXJlbGF0ZWQgZmlsZXMgKGxvZ3MsIGNvbmZzLCBldGMuKSIpLAotQVBfSU5JVF9UQUtFMSgiRXJyb3JMb2ciLCBzZXRfc2VydmVyX3N0cmluZ19zbG90LAotICAodm9pZCAqKVh0T2Zmc2V0T2YgKHNlcnZlcl9yZWMsIGVycm9yX2ZuYW1lKSwgUlNSQ19DT05GLAotICAiVGhlIGZpbGVuYW1lIG9mIHRoZSBlcnJvciBsb2ciKSwKLUFQX0lOSVRfUkFXX0FSR1MoIlNlcnZlckFsaWFzIiwgc2V0X3NlcnZlcl9hbGlhcywgTlVMTCwgUlNSQ19DT05GLAotICAiQSBuYW1lIG9yIG5hbWVzIGFsdGVybmF0ZWx5IHVzZWQgdG8gYWNjZXNzIHRoZSBzZXJ2ZXIiKSwKLUFQX0lOSVRfVEFLRTEoIlNlcnZlclBhdGgiLCBzZXRfc2VydmVycGF0aCwgTlVMTCwgUlNSQ19DT05GLAotICAiVGhlIHBhdGhuYW1lIHRoZSBzZXJ2ZXIgY2FuIGJlIHJlYWNoZWQgYXQiKSwKLUFQX0lOSVRfVEFLRTEoIlRpbWVvdXQiLCBzZXRfdGltZW91dCwgTlVMTCwgUlNSQ19DT05GLAotICAiVGltZW91dCBkdXJhdGlvbiAoc2VjKSIpLAotQVBfSU5JVF9GTEFHKCJJZGVudGl0eUNoZWNrIiwgc2V0X2lkY2hlY2ssIE5VTEwsIFJTUkNfQ09ORnxBQ0NFU1NfQ09ORiwKLSAgIkVuYWJsZSBpZGVudGQgKFJGQyAxNDEzKSB1c2VyIGxvb2t1cHMgLSBTTE9XIiksCi1BUF9JTklUX0ZMQUcoIkNvbnRlbnREaWdlc3QiLCBzZXRfY29udGVudF9tZDUsIE5VTEwsIE9SX09QVElPTlMsCi0gICJ3aGV0aGVyIG9yIG5vdCB0byBzZW5kIGEgQ29udGVudC1NRDUgaGVhZGVyIHdpdGggZWFjaCByZXF1ZXN0IiksCi1BUF9JTklUX1RBS0UxKCJVc2VDYW5vbmljYWxOYW1lIiwgc2V0X3VzZV9jYW5vbmljYWxfbmFtZSwgTlVMTCwKLSAgUlNSQ19DT05GfEFDQ0VTU19DT05GLAotICAiSG93IHRvIHdvcmsgb3V0IHRoZSBTZXJ2ZXJOYW1lIDogUG9ydCB3aGVuIGNvbnN0cnVjdGluZyBVUkxzIiksCi0vKiBUT0RPOiBSbGltaXRGb28gc2hvdWxkIGFsbCBiZSBwYXJ0IG9mIG1vZF9jZ2ksIG5vdCBpbiB0aGUgY29yZSAqLwotLyogVE9ETzogTGlzdGVuQmFja2xvZyBpbiBNUE0gKi8KLUFQX0lOSVRfVEFLRTEoIkluY2x1ZGUiLCBpbmNsdWRlX2NvbmZpZywgTlVMTCwKLSAgKFJTUkNfQ09ORiB8IEFDQ0VTU19DT05GIHwgRVhFQ19PTl9SRUFEKSwKLSAgIk5hbWUgb2YgdGhlIGNvbmZpZyBmaWxlIHRvIGJlIGluY2x1ZGVkIiksCi1BUF9JTklUX1RBS0UxKCJMb2dMZXZlbCIsIHNldF9sb2dsZXZlbCwgTlVMTCwgUlNSQ19DT05GLAotICAiTGV2ZWwgb2YgdmVyYm9zaXR5IGluIGVycm9yIGxvZ2dpbmciKSwKLUFQX0lOSVRfVEFLRTEoIk5hbWVWaXJ0dWFsSG9zdCIsIGFwX3NldF9uYW1lX3ZpcnR1YWxfaG9zdCwgTlVMTCwgUlNSQ19DT05GLAotICAiQSBudW1lcmljIElQIGFkZHJlc3M6cG9ydCwgb3IgdGhlIG5hbWUgb2YgYSBob3N0IiksCi0jaWZkZWYgX09TRF9QT1NJWAotQVBfSU5JVF9UQUtFMSgiQlMyMDAwQWNjb3VudCIsIHNldF9iczIwMDBfYWNjb3VudCwgTlVMTCwgUlNSQ19DT05GLAotICAiTmFtZSBvZiBzZXJ2ZXIgVXNlcidzIGJzMjAwMCBsb2dvbiBhY2NvdW50IG5hbWUiKSwKLSNlbmRpZgotI2lmZGVmIFdJTjMyCi1BUF9JTklUX1RBS0UxKCJTY3JpcHRJbnRlcnByZXRlclNvdXJjZSIsIHNldF9pbnRlcnByZXRlcl9zb3VyY2UsIE5VTEwsCi0gIE9SX0ZJTEVJTkZPLAotICAiV2hlcmUgdG8gZmluZCBpbnRlcnByZXRlciB0byBydW4gV2luMzIgc2NyaXB0cyAoUmVnaXN0cnkgb3Igc2NyaXB0IHNoZWJhbmcgbGluZSkiKSwKLSNlbmRpZgotQVBfSU5JVF9UQUtFMSgiU2VydmVyVG9rZW5zIiwgc2V0X3NlcnZfdG9rZW5zLCBOVUxMLCBSU1JDX0NPTkYsCi0gICJEZXRlcm1pbmUgdG9rZW5zIGRpc3BsYXllZCBpbiB0aGUgU2VydmVyOiBoZWFkZXIgLSBNaW4oaW1hbCksIE9TIG9yIEZ1bGwiKSwKLUFQX0lOSVRfVEFLRTEoIkxpbWl0UmVxdWVzdExpbmUiLCBzZXRfbGltaXRfcmVxX2xpbmUsIE5VTEwsIFJTUkNfQ09ORiwKLSAgIkxpbWl0IG9uIG1heGltdW0gc2l6ZSBvZiBhbiBIVFRQIHJlcXVlc3QgbGluZSIpLAotQVBfSU5JVF9UQUtFMSgiTGltaXRSZXF1ZXN0RmllbGRzaXplIiwgc2V0X2xpbWl0X3JlcV9maWVsZHNpemUsIE5VTEwsCi0gIFJTUkNfQ09ORiwKLSAgIkxpbWl0IG9uIG1heGltdW0gc2l6ZSBvZiBhbiBIVFRQIHJlcXVlc3QgaGVhZGVyIGZpZWxkIiksCi1BUF9JTklUX1RBS0UxKCJMaW1pdFJlcXVlc3RGaWVsZHMiLCBzZXRfbGltaXRfcmVxX2ZpZWxkcywgTlVMTCwgUlNSQ19DT05GLAotICAiTGltaXQgKDAgPSB1bmxpbWl0ZWQpIG9uIG1heCBudW1iZXIgb2YgaGVhZGVyIGZpZWxkcyBpbiBhIHJlcXVlc3QgbWVzc2FnZSIpLAotQVBfSU5JVF9UQUtFMSgiTGltaXRSZXF1ZXN0Qm9keSIsIHNldF9saW1pdF9yZXFfYm9keSwKLSAgKHZvaWQqKVh0T2Zmc2V0T2YoY29yZV9kaXJfY29uZmlnLCBsaW1pdF9yZXFfYm9keSksIE9SX0FMTCwKLSAgIkxpbWl0IChpbiBieXRlcykgb24gbWF4aW11bSBzaXplIG9mIHJlcXVlc3QgbWVzc2FnZSBib2R5IiksCi1BUF9JTklUX1RBS0UxKCJMaW1pdFhNTFJlcXVlc3RCb2R5Iiwgc2V0X2xpbWl0X3htbF9yZXFfYm9keSwgTlVMTCwgT1JfQUxMLAotICAgICAgICAgICAgICAiTGltaXQgKGluIGJ5dGVzKSBvbiBtYXhpbXVtIHNpemUgb2YgYW4gWE1MLWJhc2VkIHJlcXVlc3QgIgotICAgICAgICAgICAgICAiYm9keSIpLAotCi0vKiBTeXN0ZW0gUmVzb3VyY2UgQ29udHJvbHMgKi8KLSNpZmRlZiBSTElNSVRfQ1BVCi1BUF9JTklUX1RBS0UxMigiUkxpbWl0Q1BVIiwgc2V0X2xpbWl0X2NwdSwKLSAgKHZvaWQqKVh0T2Zmc2V0T2YoY29yZV9kaXJfY29uZmlnLCBsaW1pdF9jcHUpLAotICBPUl9BTEwsICJTb2Z0L2hhcmQgbGltaXRzIGZvciBtYXggQ1BVIHVzYWdlIGluIHNlY29uZHMiKSwKLSNlbHNlCi1BUF9JTklUX1RBS0UxMigiUkxpbWl0Q1BVIiwgbm9fc2V0X2xpbWl0LCBOVUxMLAotICBPUl9BTEwsICJTb2Z0L2hhcmQgbGltaXRzIGZvciBtYXggQ1BVIHVzYWdlIGluIHNlY29uZHMiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFJMSU1JVF9EQVRBKSB8fCBkZWZpbmVkIChSTElNSVRfVk1FTSkgfHwgZGVmaW5lZCAoUkxJTUlUX0FTKQotQVBfSU5JVF9UQUtFMTIoIlJMaW1pdE1FTSIsIHNldF9saW1pdF9tZW0sCi0gICh2b2lkKilYdE9mZnNldE9mKGNvcmVfZGlyX2NvbmZpZywgbGltaXRfbWVtKSwKLSAgT1JfQUxMLCAiU29mdC9oYXJkIGxpbWl0cyBmb3IgbWF4IG1lbW9yeSB1c2FnZSBwZXIgcHJvY2VzcyIpLAotI2Vsc2UKLUFQX0lOSVRfVEFLRTEyKCJSTGltaXRNRU0iLCBub19zZXRfbGltaXQsIE5VTEwsCi0gIE9SX0FMTCwgIlNvZnQvaGFyZCBsaW1pdHMgZm9yIG1heCBtZW1vcnkgdXNhZ2UgcGVyIHByb2Nlc3MiKSwKLSNlbmRpZgotI2lmZGVmIFJMSU1JVF9OUFJPQwotQVBfSU5JVF9UQUtFMTIoIlJMaW1pdE5QUk9DIiwgc2V0X2xpbWl0X25wcm9jLAotICAodm9pZCopWHRPZmZzZXRPZihjb3JlX2Rpcl9jb25maWcsIGxpbWl0X25wcm9jKSwKLSAgT1JfQUxMLCAic29mdC9oYXJkIGxpbWl0cyBmb3IgbWF4IG51bWJlciBvZiBwcm9jZXNzZXMgcGVyIHVpZCIpLAotI2Vsc2UKLUFQX0lOSVRfVEFLRTEyKCJSTGltaXROUFJPQyIsIG5vX3NldF9saW1pdCwgTlVMTCwKLSAgIE9SX0FMTCwgInNvZnQvaGFyZCBsaW1pdHMgZm9yIG1heCBudW1iZXIgb2YgcHJvY2Vzc2VzIHBlciB1aWQiKSwKLSNlbmRpZgotLyogWFhYIFRoZXNlIHNob3VsZCBiZSBhbGxvd2FibGUgaW4gLmh0YWNjZXNzIGZpbGVzLCBidXQgY3VycmVudGx5IGl0IHdvbid0Ci0gKiBwbGF5IHdlbGwgd2l0aCB0aGUgT3B0aW9ucyBzdHVmZi4gIFVudGlsIHRoYXQgaXMgZml4ZWQsIEkgd291bGQgcHJlZmVyCi0gKiB0byBsZWF2ZSBpdCBqdXN0IGluIHRoZSBjb25mIGZpbGUuICBPdGhlciBzaG91bGQgZmVlbCBmcmVlIHRvIGRpc2FncmVlCi0gKiB3aXRoIG1lLiAgUmJiLgotICovCi1BUF9JTklUX0lURVJBVEUoIlNldE91dHB1dEZpbHRlciIsIGFkZF9maWx0ZXIsIE5VTEwsIEFDQ0VTU19DT05GLAotICAgImZpbHRlcnMgdG8gYmUgcnVuIiksCi1BUF9JTklUX0lURVJBVEUoIlNldElucHV0RmlsdGVyIiwgYWRkX2lucHV0X2ZpbHRlciwgTlVMTCwgQUNDRVNTX0NPTkYsCi0gICAiZmlsdGVycyB0byBiZSBydW4gb24gdGhlIHJlcXVlc3QgYm9keSIpLAoteyBOVUxMIH0KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcmUgaGFuZGxlcnMgZm9yIHZhcmlvdXMgcGhhc2VzIG9mIHNlcnZlciBvcGVyYXRpb24uLi4KLSAqLwotCi1BUF9ERUNMQVJFX05PTlNURChpbnQpIGFwX2NvcmVfdHJhbnNsYXRlKHJlcXVlc3RfcmVjICpyKQotewotICAgIHZvaWQgKnNjb25mID0gci0+c2VydmVyLT5tb2R1bGVfY29uZmlnOwotICAgIGNvcmVfc2VydmVyX2NvbmZpZyAqY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHNjb25mLCAmY29yZV9tb2R1bGUpOwotICAKLSAgICBpZiAoci0+cHJveHlyZXEpIHsKLSAgICAgICAgcmV0dXJuIEhUVFBfRk9SQklEREVOOwotICAgIH0KLSAgICBpZiAoKHItPnVyaVswXSAhPSAnLycpICYmIHN0cmNtcChyLT51cmksICIqIikpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotCQkgICAgICJJbnZhbGlkIFVSSSBpbiByZXF1ZXN0ICVzIiwgci0+dGhlX3JlcXVlc3QpOwotCXJldHVybiBIVFRQX0JBRF9SRVFVRVNUOwotICAgIH0KLSAgICAKLSAgICBpZiAoci0+c2VydmVyLT5wYXRoIAotCSYmICFzdHJuY21wKHItPnVyaSwgci0+c2VydmVyLT5wYXRoLCByLT5zZXJ2ZXItPnBhdGhsZW4pCi0JJiYgKHItPnNlcnZlci0+cGF0aFtyLT5zZXJ2ZXItPnBhdGhsZW4gLSAxXSA9PSAnLycKLQkgICAgfHwgci0+dXJpW3ItPnNlcnZlci0+cGF0aGxlbl0gPT0gJy8nCi0JICAgIHx8IHItPnVyaVtyLT5zZXJ2ZXItPnBhdGhsZW5dID09ICdcMCcpKSB7Ci0gICAgICAgIHItPmZpbGVuYW1lID0gYXByX3BzdHJjYXQoci0+cG9vbCwgY29uZi0+YXBfZG9jdW1lbnRfcm9vdCwKLQkJCQkgKHItPnVyaSArIHItPnNlcnZlci0+cGF0aGxlbiksIE5VTEwpOwotICAgIH0KLSAgICBlbHNlIHsKLQkvKgotICAgICAgICAgKiBNYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3QgbWVzcyB1cCB0aGUgdHJhbnNsYXRpb24gYnkgYWRkaW5nIHR3bwotICAgICAgICAgKiAvJ3MgaW4gYSByb3cuICBUaGlzIGhhcHBlbnMgdW5kZXIgd2luZG93cyB3aGVuIHRoZSBkb2N1bWVudAotICAgICAgICAgKiByb290IGVuZHMgd2l0aCBhIC8KLSAgICAgICAgICovCi0gICAgICAgIGlmICgoY29uZi0+YXBfZG9jdW1lbnRfcm9vdFtzdHJsZW4oY29uZi0+YXBfZG9jdW1lbnRfcm9vdCktMV0gPT0gJy8nKQotCSAgICAmJiAoKihyLT51cmkpID09ICcvJykpIHsKLQkgICAgci0+ZmlsZW5hbWUgPSBhcHJfcHN0cmNhdChyLT5wb29sLCBjb25mLT5hcF9kb2N1bWVudF9yb290LCByLT51cmkrMSwKLQkJCQkgICAgIE5VTEwpOwotCX0KLQllbHNlIHsKLQkgICAgci0+ZmlsZW5hbWUgPSBhcHJfcHN0cmNhdChyLT5wb29sLCBjb25mLT5hcF9kb2N1bWVudF9yb290LCByLT51cmksCi0JCQkJICAgICBOVUxMKTsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0aWMgaW50IGRvX25vdGhpbmcocmVxdWVzdF9yZWMgKnIpIHsgcmV0dXJuIE9LOyB9Ci0KLXN0YXRpYyBpbnQgZGVmYXVsdF9oYW5kbGVyKHJlcXVlc3RfcmVjICpyKQotewotICAgIGFwcl9idWNrZXRfYnJpZ2FkZSAqYmI7Ci0gICAgYXByX2J1Y2tldCAqZTsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmQ7Ci0gICAgaW50IGVycnN0YXR1czsKLSAgICBhcHJfZmlsZV90ICpmZCA9IE5VTEw7Ci0gICAgYXByX3N0YXR1c190IHN0YXR1czsKLSAgICAvKiBYWFggaWYvd2hlbiBzb21lYm9keSB3cml0ZXMgYSBjb250ZW50LW1kNSBmaWx0ZXIgd2UgZWl0aGVyIG5lZWQgdG8KLSAgICAgKiAgICAgcmVtb3ZlIHRoaXMgc3VwcG9ydCBvciBjb29yZGluYXRlIHdoZW4gdG8gdXNlIHRoZSBmaWx0ZXIgdnMuCi0gICAgICogICAgIHdoZW4gdG8gdXNlIHRoaXMgY29kZQotICAgICAqICAgICBUaGUgY3VycmVudCBjaG9pY2Ugb2Ygd2hlbiB0byBjb21wdXRlIHRoZSBtZDUgaGVyZSBtYXRjaGVzIHRoZSAxLjMKLSAgICAgKiAgICAgc3VwcG9ydCBmYWlybHkgY2xvc2VseSAodW5saWtlIDEuMywgd2UgZG9uJ3QgaGFuZGxlIGNvbXB1dGluZyBtZDUKLSAgICAgKiAgICAgd2hlbiB0aGUgY2hhcnNldCBpcyB0cmFuc2xhdGVkKS4KLSAgICAgKi8KLSAgICBpbnQgYmxkX2NvbnRlbnRfbWQ1OwotCi0gICAgLyoKLSAgICAgKiBUaGUgb2xkIHdheSBvZiBkb2luZyBoYW5kbGVycyBtZWFudCB0aGF0IHRoaXMgaGFuZGxlciB3b3VsZAotICAgICAqIG1hdGNoIGxpdGVyYWxseSBhbnl0aGluZyAtIHRoaXMgd2F5IHdpbGwgcmVxdWlyZSBoYW5kbGVyIHRvCi0gICAgICogaGF2ZSBhIC8gaW4gdGhlIG1pZGRsZSwgd2hpY2ggcHJvYmFibHkgY2FwdHVyZXMgdGhlIG9yaWdpbmFsCi0gICAgICogaW50ZW50LCBidXQgbWF5IGNhdXNlIHByb2JsZW1zIGF0IGZpcnN0IC0gQmVuIDd0aCBKYW4gMDEKLSAgICAgKi8KLSAgICBpZihzdHJjbXAoci0+aGFuZGxlciwiZGVmYXVsdC1oYW5kbGVyIikKLSAgICAgICAmJiBhcF9zdHJjbXBfbWF0Y2goci0+aGFuZGxlciwiKi8qIikpCi0JcmV0dXJuIERFQ0xJTkVEOwotCi0gICAgZCA9IChjb3JlX2Rpcl9jb25maWcgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywKLQkJCQkJCSZjb3JlX21vZHVsZSk7Ci0gICAgYmxkX2NvbnRlbnRfbWQ1ID0gKGQtPmNvbnRlbnRfbWQ1ICYgMSkKLSAgICAgICYmIHItPm91dHB1dF9maWx0ZXJzLT5mcmVjLT5mdHlwZSAhPSBBUF9GVFlQRV9DT05URU5UOwotCi0gICAgYXBfYWxsb3dfbWV0aG9kcyhyLCBNRVJHRV9BTExPVywgIkdFVCIsICJPUFRJT05TIiwgIlBPU1QiLCBOVUxMKTsKLQotICAgIGlmICgoZXJyc3RhdHVzID0gYXBfZGlzY2FyZF9yZXF1ZXN0X2JvZHkocikpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnJzdGF0dXM7Ci0gICAgfQotICAgIAotICAgIGlmIChyLT5tZXRob2RfbnVtYmVyID09IE1fSU5WQUxJRCkgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0JCSAgICAiSW52YWxpZCBtZXRob2QgaW4gcmVxdWVzdCAlcyIsIHItPnRoZV9yZXF1ZXN0KTsKLQlyZXR1cm4gSFRUUF9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgfQotICAgIGlmIChyLT5tZXRob2RfbnVtYmVyID09IE1fT1BUSU9OUykgewotICAgICAgICByZXR1cm4gYXBfc2VuZF9odHRwX29wdGlvbnMocik7Ci0gICAgfQotICAgIGlmIChyLT5tZXRob2RfbnVtYmVyID09IE1fUFVUKSB7Ci0gICAgICAgIHJldHVybiBIVFRQX01FVEhPRF9OT1RfQUxMT1dFRDsKLSAgICB9Ci0gICAgaWYgKHItPmZpbmZvLmZpbGV0eXBlID09IDAgfHwgKHItPnBhdGhfaW5mbyAmJiAqci0+cGF0aF9pbmZvKSkgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSfEFQTE9HX05PRVJSTk8sIDAsIHIsCi0JCSAgICAgICJGaWxlIGRvZXMgbm90IGV4aXN0OiAlcyIsci0+cGF0aF9pbmZvID8KLQkJICAgICAgYXByX3BzdHJjYXQoci0+cG9vbCwgci0+ZmlsZW5hbWUsIHItPnBhdGhfaW5mbywgTlVMTCkKLQkJICAgICAgOiByLT5maWxlbmFtZSk7Ci0JcmV0dXJuIEhUVFBfTk9UX0ZPVU5EOwotICAgIH0KLSAgICAKLSAgICBpZiAoci0+bWV0aG9kX251bWJlciAhPSBNX0dFVCAmJiByLT5tZXRob2RfbnVtYmVyICE9IE1fUE9TVCkgewotICAgICAgICByZXR1cm4gSFRUUF9NRVRIT0RfTk9UX0FMTE9XRUQ7Ci0gICAgfQotCQotICAgIGlmICgoc3RhdHVzID0gYXByX2ZpbGVfb3BlbigmZmQsIHItPmZpbGVuYW1lLCBBUFJfUkVBRCB8IEFQUl9CSU5BUlksIDAsIHItPmNvbm5lY3Rpb24tPnBvb2wpKSAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgc3RhdHVzLCByLAotCQkgICAgICJmaWxlIHBlcm1pc3Npb25zIGRlbnkgc2VydmVyIGFjY2VzczogJXMiLCByLT5maWxlbmFtZSk7Ci0gICAgICAgIHJldHVybiBIVFRQX0ZPUkJJRERFTjsKLSAgICB9Ci0gICAgYXBfdXBkYXRlX210aW1lKHIsIHItPmZpbmZvLm10aW1lKTsKLSAgICBhcF9zZXRfbGFzdF9tb2RpZmllZChyKTsKLSAgICBhcF9zZXRfZXRhZyhyKTsKLSAgICBhcHJfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkFjY2VwdC1SYW5nZXMiLCAiYnl0ZXMiKTsKLSAgICBhcF9zZXRfY29udGVudF9sZW5ndGgociwgci0+ZmluZm8uc2l6ZSk7IAotICAgIGlmICgoZXJyc3RhdHVzID0gYXBfbWVldHNfY29uZGl0aW9ucyhyKSkgIT0gT0spIHsKLSAgICAgICAgYXByX2ZpbGVfY2xvc2UoZmQpOwotICAgICAgICByZXR1cm4gZXJyc3RhdHVzOwotICAgIH0KLQotICAgIGlmIChibGRfY29udGVudF9tZDUpIHsKLSAgICAgICAgYXByX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJDb250ZW50LU1ENSIsCi0gICAgICAgICAgICAgICAgICAgICAgIGFwX21kNWRpZ2VzdChyLT5wb29sLCBmZCkpOwotICAgIH0KLQotICAgIGJiID0gYXByX2JyaWdhZGVfY3JlYXRlKHItPnBvb2wpOwotICAgIGUgPSBhcHJfYnVja2V0X2ZpbGVfY3JlYXRlKGZkLCAwLCByLT5maW5mby5zaXplKTsKLQotICAgIEFQUl9CUklHQURFX0lOU0VSVF9IRUFEKGJiLCBlKTsKLSAgICBlID0gYXByX2J1Y2tldF9lb3NfY3JlYXRlKCk7Ci0gICAgQVBSX0JSSUdBREVfSU5TRVJUX1RBSUwoYmIsIGUpOwotCi0gICAgcmV0dXJuIGFwX3Bhc3NfYnJpZ2FkZShyLT5vdXRwdXRfZmlsdGVycywgYmIpOwotfQotCi1zdGF0aWMgaW50IGNvcmVfaW5wdXRfZmlsdGVyKGFwX2ZpbHRlcl90ICpmLCBhcHJfYnVja2V0X2JyaWdhZGUgKmIsIGFwX2lucHV0X21vZGVfdCBtb2RlKQotewotICAgIGFwcl9idWNrZXQgKmU7Ci0gICAgCi0gICAgaWYgKCFmLT5jdHgpIHsgICAgLyogSWYgd2UgaGF2ZW4ndCBwYXNzZWQgdXAgdGhlIHNvY2tldCB5ZXQuLi4gKi8KLSAgICAgICAgZi0+Y3R4ID0gKHZvaWQgKikxOwotICAgICAgICBlID0gYXByX2J1Y2tldF9zb2NrZXRfY3JlYXRlKGYtPmMtPmNsaWVudF9zb2NrZXQpOwotICAgICAgICBBUFJfQlJJR0FERV9JTlNFUlRfVEFJTChiLCBlKTsKLSAgICAgICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotICAgIH0KLSAgICBlbHNlIHsgICAgICAgICAgICAKLSAgICAgICAgLyogRWl0aGVyIHNvbWUgY29kZSBsb3N0IHRyYWNrIG9mIHRoZSBzb2NrZXQKLSAgICAgICAgICogYnVja2V0IG9yIHdlIGFscmVhZHkgZm91bmQgb3V0IHRoYXQgdGhlCi0gICAgICAgICAqIGNsaWVudCBjbG9zZWQuCi0gICAgICAgICAqLwotICAgICAgICByZXR1cm4gQVBSX0VPRjsKLSAgICB9Ci19Ci0KLS8qIERlZmF1bHQgZmlsdGVyLiAgVGhpcyBmaWx0ZXIgc2hvdWxkIGFsbW9zdCBhbHdheXMgYmUgdXNlZC4gIEl0cyBvbmx5IGpvYgotICogaXMgdG8gc2VuZCB0aGUgaGVhZGVycyBpZiB0aGV5IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIHNlbnQsIGFuZCB0aGVuIHNlbmQKLSAqIHRoZSBhY3R1YWwgZGF0YS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgQ09SRV9PVVRQVVRfRklMVEVSX0NUWCB7Ci0gICAgYXByX2J1Y2tldF9icmlnYWRlICpiOwotfSBjb3JlX291dHB1dF9maWx0ZXJfY3R4X3Q7Ci0KLSNkZWZpbmUgTUFYX0lPVkVDX1RPX1dSSVRFIDE2Ci0KLXN0YXRpYyBhcHJfc3RhdHVzX3QgY29yZV9vdXRwdXRfZmlsdGVyKGFwX2ZpbHRlcl90ICpmLCBhcHJfYnVja2V0X2JyaWdhZGUgKmIpCi17Ci0gICAgYXByX3N0YXR1c190IHJ2OwotICAgIGNvbm5fcmVjICpjID0gZi0+YzsKLSAgICBjb3JlX291dHB1dF9maWx0ZXJfY3R4X3QgKmN0eCA9IGYtPmN0eDsKLQotICAgIGlmIChjdHggPT0gTlVMTCkgewotICAgICAgICBmLT5jdHggPSBjdHggPSBhcHJfcGNhbGxvYyhjLT5wb29sLCBzaXplb2YoY29yZV9vdXRwdXRfZmlsdGVyX2N0eF90KSk7Ci0gICAgfQotCi0gICAgLyogSWYgd2UgaGF2ZSBhIHNhdmVkIGJyaWdhZGUsIGNvbmNhdGVuYXRlIHRoZSBuZXcgYnJpZ2FkZSB0byBpdCAqLwotICAgIGlmIChjdHgtPmIpIHsKLSAgICAgICAgQVBSX0JSSUdBREVfQ09OQ0FUKGN0eC0+YiwgYik7Ci0gICAgICAgIGIgPSBjdHgtPmI7Ci0gICAgICAgIGN0eC0+YiA9IE5VTEw7Ci0gICAgfQotCi0gICAgLyogUGVyZm9ybSBtdWx0aXBsZSBwYXNzZXMgb3ZlciB0aGUgYnJpZ2FkZSwgc2VuZGluZyBiYXRjaGVzIG9mIG91dHB1dAotICAgICAgIHRvIHRoZSBjb25uZWN0aW9uLiAqLwotICAgIHdoaWxlIChiKSB7Ci0gICAgICAgIGFwcl9zaXplX3QgbmJ5dGVzID0gMDsKLSAgICAgICAgYXByX2J1Y2tldCAqZTsKLQotICAgICAgICAvKiB0YWlsIG9mIGJyaWdhZGUgaWYgd2UgbmVlZCBhbm90aGVyIHBhc3MgKi8KLSAgICAgICAgYXByX2J1Y2tldF9icmlnYWRlICptb3JlID0gTlVMTDsKLQotICAgICAgICAvKiBvbmUgZ3JvdXAgb2YgaW92ZWNzIHBlciBwYXNzIG92ZXIgdGhlIGJyaWdhZGUgKi8KLSAgICAgICAgYXByX3NpemVfdCBudmVjID0gMDsKLSAgICAgICAgYXByX3NpemVfdCBudmVjX3RyYWlsZXJzID0gMDsKLSAgICAgICAgc3RydWN0IGlvdmVjIHZlY1tNQVhfSU9WRUNfVE9fV1JJVEVdOwotICAgICAgICBzdHJ1Y3QgaW92ZWMgdmVjX3RyYWlsZXJzW01BWF9JT1ZFQ19UT19XUklURV07Ci0KLSAgICAgICAgLyogb25lIGZpbGUgcGVyIHBhc3Mgb3ZlciB0aGUgYnJpZ2FkZSAqLwotICAgICAgICBhcHJfZmlsZV90ICpmZCA9IE5VTEw7Ci0gICAgICAgIGFwcl9zaXplX3QgZmxlbiA9IDA7Ci0gICAgICAgIGFwcl9vZmZfdCBmb2Zmc2V0ID0gMDsKLQotICAgICAgICAvKiBJdGVyYXRlIG92ZXIgdGhlIGJyaWdhZGU6IGNvbGxlY3QgaW92ZWNzIGFuZC9vciBhIGZpbGUgKi8KLSAgICAgICAgQVBSX0JSSUdBREVfRk9SRUFDSChlLCBiKSB7Ci0gICAgICAgICAgICBpZiAoQVBSX0JVQ0tFVF9JU19FT1MoZSkgfHwgQVBSX0JVQ0tFVF9JU19GTFVTSChlKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogSXQgZG9lc24ndCBtYWtlIGFueSBzZW5zZSB0byB1c2Ugc2VuZGZpbGUgZm9yIGEgZmlsZSBidWNrZXQKLSAgICAgICAgICAgICAqIHRoYXQgcmVwcmVzZW50cyAxMCBieXRlcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgZWxzZSBpZiAoQVBSX0JVQ0tFVF9JU19GSUxFKGUpCi0gICAgICAgICAgICAgICAgICAgICAmJiAoZS0+bGVuZ3RoID49IEFQX01JTl9TRU5ERklMRV9CWVRFUykpIHsKLSAgICAgICAgICAgICAgICBhcHJfYnVja2V0X2ZpbGUgKmEgPSBlLT5kYXRhOwotICAgIAotICAgICAgICAgICAgICAgIC8qIFdlIGNhbid0IGhhbmRsZSBtb3JlIHRoYW4gb25lIGZpbGUgYnVja2V0IGF0IGEgdGltZQotICAgICAgICAgICAgICAgICAqIHNvIHdlIHNwbGl0IGhlcmUgYW5kIHNlbmQgdGhlIGZpbGUgd2UgaGF2ZSBhbHJlYWR5Ci0gICAgICAgICAgICAgICAgICogZm91bmQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKGZkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vcmUgPSBhcHJfYnJpZ2FkZV9zcGxpdChiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgIGZkID0gYS0+ZmQ7Ci0gICAgICAgICAgICAgICAgZmxlbiA9IGUtPmxlbmd0aDsKLSAgICAgICAgICAgICAgICBmb2Zmc2V0ID0gZS0+c3RhcnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdHI7Ci0gICAgICAgICAgICAgICAgYXByX3NpemVfdCBuOwotCi0gICAgICAgICAgICAgICAgcnYgPSBhcHJfYnVja2V0X3JlYWQoZSwgJnN0ciwgJm4sIEFQUl9CTE9DS19SRUFEKTsKLSAgICAgICAgICAgICAgICBpZiAobikgewotICAgICAgICAgICAgICAgICAgICBuYnl0ZXMgKz0gbjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmVjW252ZWNdLmlvdl9iYXNlID0gKGNoYXIqKSBzdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ZWNbbnZlY10uaW92X2xlbiA9IG47Ci0gICAgICAgICAgICAgICAgICAgICAgICBudmVjKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgYnVja2V0IGlzIGEgdHJhaWxlciB0byBhIGZpbGUgYnVja2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB2ZWNfdHJhaWxlcnNbbnZlY190cmFpbGVyc10uaW92X2Jhc2UgPSAoY2hhciopIHN0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZlY190cmFpbGVyc1tudmVjX3RyYWlsZXJzXS5pb3ZfbGVuID0gbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIG52ZWNfdHJhaWxlcnMrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIGlmICgobnZlYyA9PSBNQVhfSU9WRUNfVE9fV1JJVEUpIHx8IAotICAgICAgICAgICAgICAgIChudmVjX3RyYWlsZXJzID09IE1BWF9JT1ZFQ19UT19XUklURSkpIHsKLSAgICAgICAgICAgICAgICAvKiBTcGxpdCB0aGUgYnJpZ2FkZSBhbmQgYnJlYWsgKi8KLSAgICAgICAgICAgICAgICBpZiAoQVBSX0JVQ0tFVF9ORVhUKGUpICE9IEFQUl9CUklHQURFX1NFTlRJTkVMKGIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vcmUgPSBhcHJfYnJpZ2FkZV9zcGxpdChiLCBBUFJfQlVDS0VUX05FWFQoZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIAotICAgICAgICAvKiBDb21wbGV0ZWQgaXRlcmF0aW5nIG92ZXIgdGhlIGJyaWdhZGVzLCBub3cgZGV0ZXJtaW5lIGlmIHdlIHdhbnQgCi0gICAgICAgICAqIHRvIGJ1ZmZlciB0aGUgYnJpZ2FkZSBvciBzZW5kIHRoZSBicmlnYWRlIG91dCBvbiB0aGUgbmV0d29yay4KLSAgICAgICAgICoKLSAgICAgICAgICogU2F2ZSBpZjoKLSAgICAgICAgICoKLSAgICAgICAgICogICAxKSB3ZSBkaWRuJ3Qgc2VlIGEgZmlsZSwgd2UgZG9uJ3QgaGF2ZSBtb3JlIHBhc3NlcyBvdmVyIHRoZQotICAgICAgICAgKiAgICAgIGJyaWdhZGUgdG8gcGVyZm9ybSwgd2UgaGF2ZW4ndCBhY2N1bXVsYXRlZCBlbm91Z2ggYnl0ZXMgdG8KLSAgICAgICAgICogICAgICBzZW5kLCBBTkQgd2UgZGlkbid0IHN0b3AgYXQgYSBGTFVTSCBidWNrZXQuCi0gICAgICAgICAqICAgICAgKElPVywgd2Ugd2lsbCBzYXZlIGF3YXkgcGxhaW4gb2xkIGJ5dGVzKQotICAgICAgICAgKiBvcgotICAgICAgICAgKiAgIDIpIHdlIGhpdCB0aGUgRU9TIGFuZCBoYXZlIGEga2VlcC1hbGl2ZSBjb25uZWN0aW9uCi0gICAgICAgICAqICAgICAgKElPVywgdGhpcyByZXNwb25zZSBpcyBhIGJpdCBtb3JlIGNvbXBsZXgsIGJ1dCB3ZSBzYXZlIGl0Ci0gICAgICAgICAqICAgICAgIHdpdGggdGhlIGhvcGUgb2YgY29uY2F0ZW5hdGluZyB3aXRoIGFub3RoZXIgcmVzcG9uc2UpCi0gICAgICAgICAqLwotICAgICAgICBpZiAoKCFmZCAmJiAhbW9yZSAmJiAKLSAgICAgICAgICAgICAobmJ5dGVzIDwgQVBfTUlOX0JZVEVTX1RPX1dSSVRFKSAmJiAhQVBSX0JVQ0tFVF9JU19GTFVTSChlKSkKLSAgICAgICAgICAgIHx8IChBUFJfQlVDS0VUX0lTX0VPUyhlKSAmJiBjLT5rZWVwYWxpdmUpKSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBORVZFUiBzYXZlIGFuIEVPUyBpbiBoZXJlLiAgSWYgd2UgYXJlIHNhdmluZyBhIGJyaWdhZGUgd2l0aCAKLSAgICAgICAgICAgICAqIGFuIEVPUyBidWNrZXQsIHRoZW4gd2UgYXJlIGRvaW5nIGtlZXBhbGl2ZSBjb25uZWN0aW9ucywgYW5kIAotICAgICAgICAgICAgICogd2Ugd2FudCB0byBwcm9jZXNzIHRvIHNlY29uZCByZXF1ZXN0IGZ1bGx5LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoQVBSX0JVQ0tFVF9JU19FT1MoZSkpIHsKLSAgICAgICAgICAgICAgICBhcHJfYnVja2V0X2RlbGV0ZShlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFwX3NhdmVfYnJpZ2FkZShmLCAmY3R4LT5iLCAmYik7Ci0gICAgICAgICAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmQpIHsKLSAgICAgICAgICAgIGFwcl9oZHRyX3QgaGR0cjsKLSNpZiBBUFJfSEFTX1NFTkRGSUxFCi0gICAgICAgICAgICBhcHJfaW50MzJfdCBmbGFncyA9IDA7Ci0jZW5kaWYKLSAgICAKLSAgICAgICAgICAgIG1lbXNldCgmaGR0ciwgJ1wwJywgc2l6ZW9mKGhkdHIpKTsKLSAgICAgICAgICAgIGlmIChudmVjKSB7Ci0gICAgICAgICAgICAgICAgaGR0ci5udW1oZWFkZXJzID0gbnZlYzsKLSAgICAgICAgICAgICAgICBoZHRyLmhlYWRlcnMgPSB2ZWM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobnZlY190cmFpbGVycykgewotICAgICAgICAgICAgICAgIGhkdHIubnVtdHJhaWxlcnMgPSBudmVjX3RyYWlsZXJzOwotICAgICAgICAgICAgICAgIGhkdHIudHJhaWxlcnMgPSB2ZWNfdHJhaWxlcnM7Ci0gICAgICAgICAgICB9Ci0jaWYgQVBSX0hBU19TRU5ERklMRQotICAgICAgICAgICAgaWYgKCFjLT5rZWVwYWxpdmUpIHsKLSAgICAgICAgICAgICAgICAvKiBQcmVwYXJlIHRoZSBzb2NrZXQgdG8gYmUgcmV1c2VkICovCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gQVBSX1NFTkRGSUxFX0RJU0NPTk5FQ1RfU09DS0VUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcnYgPSBzZW5kZmlsZV9pdF9hbGwoYywgICAgICAgIC8qIHRoZSBjb25uZWN0aW9uICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLCAgICAgICAvKiB0aGUgZmlsZSB0byBzZW5kICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGR0ciwgICAgLyogaGVhZGVyIGFuZCB0cmFpbGVyIGlvdmVjcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9mZnNldCwgIC8qIG9mZnNldCBpbiB0aGUgZmlsZSB0byBiZWdpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRpbmcgZnJvbSAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsZW4sICAgICAvKiBsZW5ndGggb2YgZmlsZSAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYnl0ZXMgKyBmbGVuLCAvKiB0b3RhbCBsZW5ndGggaW5jbHVkaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7ICAgLyogYXByX3NlbmRmaWxlIGZsYWdzICAgICAgICAqLwotICAgIAotICAgICAgICAgICAgLyogSWYgYXByX3NlbmRmaWxlKCkgcmV0dXJucyBBUFJfRU5PVElNUEwsIGNhbGwgc2VuZF90aGVfZmlsZSgpCi0gICAgICAgICAgICAgKiB0byBsb29wIG9uIGFwcl9maWxlX3JlYWQvYXByX3NlbmQgdG8gc2VuZCB0aGUgZmlsZS4gT3VyIFdpbmRvd3MgCi0gICAgICAgICAgICAgKiBiaW5hcnkgZGlzdHJpYnV0aW9ucyAod2hpY2ggd29yayBvbiBXaW5kb3dzIDl4L05UKSBhcmUgCi0gICAgICAgICAgICAgKiBjb21waWxlZCBvbiBXaW5kb3dzIE5ULiBUcmFuc21pdEZpbGUgaXMgbm90IGF2YWlsYWJsZSBvbiAKLSAgICAgICAgICAgICAqIFdpbmRvd3MgOTUvOTggYW5kIHdlIGRpc2NvdmVyIHRoaXMgYXQgcnVudGltZSB3aGVuIAotICAgICAgICAgICAgICogYXByX3NlbmRmaWxlKCkgcmV0dXJucyBBUFJfRU5PVElNUEwuIEhhdmluZyBhcHJfc2VuZGZpbGUoKSAKLSAgICAgICAgICAgICAqIHJldHVybiBBUFJfRU5PVElNUEwgc2VlbXMgdGhlIGNsZWFuZXN0IHdheSB0byBoYW5kbGUgdGhpcyAKLSAgICAgICAgICAgICAqIGNhc2UuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChydiA9PSBBUFJfRU5PVElNUEwpCi0jZW5kaWYKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcHJfc2l6ZV90IHVudXNlZF9ieXRlc19zZW50OwotCi0gICAgICAgICAgICAgICAgcnYgPSBzZW5kX3RoZV9maWxlKGMsIGZkLCAmaGR0ciwgZm9mZnNldCwgZmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVudXNlZF9ieXRlc19zZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZkID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGFwcl9zaXplX3QgdW51c2VkX2J5dGVzX3NlbnQ7Ci0KLSAgICAgICAgICAgIHJ2ID0gd3JpdGV2X2l0X2FsbChjLT5jbGllbnRfc29ja2V0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMsIG52ZWMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ieXRlcywgJnVudXNlZF9ieXRlc19zZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGFwcl9icmlnYWRlX2Rlc3Ryb3koYik7Ci0gICAgICAgIGlmIChydiAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICAgICAgLyogWFhYOiBsb2cgdGhlIGVycm9yICovCi0gICAgICAgICAgICBpZiAobW9yZSkKLSAgICAgICAgICAgICAgICBhcHJfYnJpZ2FkZV9kZXN0cm95KG1vcmUpOwotICAgICAgICAgICAgcmV0dXJuIHJ2OwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIGIgPSBtb3JlOwotICAgICAgICBtb3JlID0gTlVMTDsKLSAgICB9ICAvKiBlbmQgd2hpbGUgKCkgKi8KLQotICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHZvaWQgY29yZV9wb3N0X2NvbmZpZyhhcHJfcG9vbF90ICpwY29uZiwgYXByX3Bvb2xfdCAqcGxvZywgYXByX3Bvb2xfdCAqcHRlbXAsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgYXBfc2V0X3ZlcnNpb24ocGNvbmYpOwotfQotCi1zdGF0aWMgdm9pZCBjb3JlX29wZW5fbG9ncyhhcHJfcG9vbF90ICpwY29uZiwgYXByX3Bvb2xfdCAqcGxvZywgYXByX3Bvb2xfdCAqcHRlbXAsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgYXBfb3Blbl9sb2dzKHMsIHBjb25mKTsKLX0KLQotc3RhdGljIHZvaWQgY29yZV9pbnNlcnRfZmlsdGVyKHJlcXVlc3RfcmVjICpyKQotewotICAgIGludCBpOwotICAgIGNvcmVfZGlyX2NvbmZpZyAqY29uZiA9IChjb3JlX2Rpcl9jb25maWcgKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywKLQkJCQkJCSAgICZjb3JlX21vZHVsZSk7IAotICAgIGNoYXIgKippdGVtcyA9IChjaGFyICoqKWNvbmYtPm91dHB1dF9maWx0ZXJzLT5lbHRzOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGNvbmYtPm91dHB1dF9maWx0ZXJzLT5uZWx0czsgaSsrKSB7Ci0gICAgICAgIGNoYXIgKmZvb2JhciA9IGl0ZW1zW2ldOwotICAgICAgICBhcF9hZGRfb3V0cHV0X2ZpbHRlcihmb29iYXIsIE5VTEwsIHIsIHItPmNvbm5lY3Rpb24pOwotICAgIH0KLQotICAgIGl0ZW1zID0gKGNoYXIgKiopY29uZi0+aW5wdXRfZmlsdGVycy0+ZWx0czsKLSAgICBmb3IgKGkgPSAwOyBpIDwgY29uZi0+aW5wdXRfZmlsdGVycy0+bmVsdHM7IGkrKykgewotICAgICAgICBjaGFyICpmb29iYXIgPSBpdGVtc1tpXTsKLSAgICAgICAgYXBfYWRkX2lucHV0X2ZpbHRlcihmb29iYXIsIE5VTEwsIHIsIHItPmNvbm5lY3Rpb24pOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgcmVnaXN0ZXJfaG9va3MoYXByX3Bvb2xfdCAqcCkKLXsKLSAgICBhcF9ob29rX3Bvc3RfY29uZmlnKGNvcmVfcG9zdF9jb25maWcsTlVMTCxOVUxMLEFQUl9IT09LX1JFQUxMWV9GSVJTVCk7Ci0gICAgYXBfaG9va190cmFuc2xhdGVfbmFtZShhcF9jb3JlX3RyYW5zbGF0ZSxOVUxMLE5VTEwsQVBSX0hPT0tfUkVBTExZX0xBU1QpOwotICAgIGFwX2hvb2tfb3Blbl9sb2dzKGNvcmVfb3Blbl9sb2dzLE5VTEwsTlVMTCxBUFJfSE9PS19NSURETEUpOwotICAgIGFwX2hvb2tfaGFuZGxlcihkZWZhdWx0X2hhbmRsZXIsTlVMTCxOVUxMLEFQUl9IT09LX1JFQUxMWV9MQVNUKTsKLSAgICAvKiBGSVhNRTogSSBzdXNwZWN0IHdlIGNhbiBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHRoZXNlIC0gQmVuICovCi0gICAgYXBfaG9va190eXBlX2NoZWNrZXIoZG9fbm90aGluZyxOVUxMLE5VTEwsQVBSX0hPT0tfUkVBTExZX0xBU1QpOwotICAgIGFwX2hvb2tfYWNjZXNzX2NoZWNrZXIoZG9fbm90aGluZyxOVUxMLE5VTEwsQVBSX0hPT0tfUkVBTExZX0xBU1QpOwotCi0gICAgLyogcmVnaXN0ZXIgdGhlIGNvcmUncyBpbnNlcnRfZmlsdGVyIGhvb2sgYW5kIHJlZ2lzdGVyIGNvcmUtcHJvdmlkZWQKLSAgICAgKiBmaWx0ZXJzCi0gICAgICovCi0gICAgYXBfaG9va19pbnNlcnRfZmlsdGVyKGNvcmVfaW5zZXJ0X2ZpbHRlciwgTlVMTCwgTlVMTCwgQVBSX0hPT0tfTUlERExFKTsKLQotICAgIGFwX3JlZ2lzdGVyX2lucHV0X2ZpbHRlcigiQ09SRV9JTiIsIGNvcmVfaW5wdXRfZmlsdGVyLCBBUF9GVFlQRV9ORVRXT1JLKTsKLSAgICBhcF9yZWdpc3Rlcl9vdXRwdXRfZmlsdGVyKCJDT05URU5UX0xFTkdUSCIsIGFwX2NvbnRlbnRfbGVuZ3RoX2ZpbHRlciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUF9GVFlQRV9IVFRQX0hFQURFUik7Ci0gICAgYXBfcmVnaXN0ZXJfb3V0cHV0X2ZpbHRlcigiQllURVJBTkdFIiwgYXBfYnl0ZXJhbmdlX2ZpbHRlciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUF9GVFlQRV9IVFRQX0hFQURFUik7Ci0gICAgYXBfcmVnaXN0ZXJfb3V0cHV0X2ZpbHRlcigiQ09SRSIsIGNvcmVfb3V0cHV0X2ZpbHRlciwgQVBfRlRZUEVfTkVUV09SSyk7Ci0gICAgYXBfcmVnaXN0ZXJfb3V0cHV0X2ZpbHRlcigiU1VCUkVRX0NPUkUiLCBhcF9zdWJfcmVxX291dHB1dF9maWx0ZXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBfRlRZUEVfQ09OVEVOVCk7Ci0gICAgYXBfcmVnaXN0ZXJfb3V0cHV0X2ZpbHRlcigiT0xEX1dSSVRFIiwgYXBfb2xkX3dyaXRlX2ZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQX0ZUWVBFX0NPTlRFTlQgLSAxKTsKLX0KLQotQVBfREVDTEFSRV9EQVRBIG1vZHVsZSBjb3JlX21vZHVsZSA9IHsKLSAgICBTVEFOREFSRDIwX01PRFVMRV9TVFVGRiwKLSAgICBjcmVhdGVfY29yZV9kaXJfY29uZmlnLAkvKiBjcmVhdGUgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlICovCi0gICAgbWVyZ2VfY29yZV9kaXJfY29uZmlncywJLyogbWVyZ2UgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIGNyZWF0ZV9jb3JlX3NlcnZlcl9jb25maWcsCS8qIGNyZWF0ZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLSAgICBtZXJnZV9jb3JlX3NlcnZlcl9jb25maWdzLAkvKiBtZXJnZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgY29yZV9jbWRzLAkJCS8qIGNvbW1hbmQgYXByX3RhYmxlX3QgKi8KLSAgICByZWdpc3Rlcl9ob29rcwkJLyogcmVnaXN0ZXIgaG9va3MgKi8KLX07CmRpZmYgLS1naXQgYS9zZXJ2ZXIvZXJyb3JfYnVja2V0LmMgYi9zZXJ2ZXIvZXJyb3JfYnVja2V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MTExOTguLjAwMDAwMDAKLS0tIGEvc2VydmVyL2Vycm9yX2J1Y2tldC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKi8KLQotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJhcHJfYnVja2V0cy5oIgotI2luY2x1ZGUgImFwcl9zdHJpbmdzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaWYgQVBSX0hBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0KLXN0YXRpYyBhcHJfc3RhdHVzX3QgZXJyb3JfcmVhZChhcHJfYnVja2V0ICpiLCBjb25zdCBjaGFyICoqc3RyLCAKLQkJCSAgICAgICBhcHJfc2l6ZV90ICpsZW4sIGFwcl9yZWFkX3R5cGVfZSBibG9jaykKLXsKLSAgICAqc3RyID0gTlVMTDsKLSAgICAqbGVuID0gMDsKLSAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci19Ci0KLUFQX0RFQ0xBUkUoYXByX2J1Y2tldCAqKSBhcF9idWNrZXRfZXJyb3JfbWFrZShhcHJfYnVja2V0ICpiLCBpbnQgZXJyb3IsIAotCQljb25zdCBjaGFyICpidWYsIGFwcl9wb29sX3QgKnApCi17Ci0gICAgYXBfYnVja2V0X2Vycm9yICpoOwotCi0gICAgaCA9IG1hbGxvYyhzaXplb2YoKmgpKTsKLSAgICBpZiAoaCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBoLT5zdGF0dXMgPSBlcnJvcjsKLSAgICBpZiAoYnVmKSB7Ci0gICAgICAgIGgtPnN0YXJ0ID0gYXByX3BzdHJkdXAocCwgYnVmKTsKLSAgICB9Ci0KLSAgICBiLT5sZW5ndGggPSAwOwotICAgIGItPnR5cGUgPSAmYXBfYnVja2V0X3R5cGVfZXJyb3I7Ci0gICAgYi0+ZGF0YSA9IGg7Ci0gICAgcmV0dXJuIGI7Ci19Ci0KLUFQX0RFQ0xBUkUoYXByX2J1Y2tldCAqKSBhcF9idWNrZXRfZXJyb3JfY3JlYXRlKGludCBlcnJvciwgCi0JCWNvbnN0IGNoYXIgKmJ1ZiwgYXByX3Bvb2xfdCAqcCkKLXsKLSAgICBhcHJfYnVja2V0X2RvX2NyZWF0ZShhcF9idWNrZXRfZXJyb3JfbWFrZShiLCBlcnJvciwgYnVmLCBwKSk7Ci19Ci0KLUFQX0RFQ0xBUkVfREFUQSBjb25zdCBhcHJfYnVja2V0X3R5cGVfdCBhcF9idWNrZXRfdHlwZV9lcnJvciA9IHsKLSAgICAiRVJST1IiLCA1LAotICAgIGZyZWUsCi0gICAgZXJyb3JfcmVhZCwKLSAgICBhcHJfYnVja2V0X3NldGFzaWRlX25vdGltcGwsCi0gICAgYXByX2J1Y2tldF9zcGxpdF9ub3RpbXBsLAotICAgIGFwcl9idWNrZXRfY29weV9ub3RpbXBsCi19OwpkaWZmIC0tZ2l0IGEvc2VydmVyL2dlbl90ZXN0X2NoYXIuYyBiL3NlcnZlci9nZW5fdGVzdF9jaGFyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMzNhNzMuLjAwMDAwMDAKLS0tIGEvc2VydmVyL2dlbl90ZXN0X2NoYXIuYworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qIHdlIG5lZWQgc29tZSBvZiB0aGUgcG9ydGFiaWxpdHkgZGVmaW5pdGlvbnMuLi4gZm9yIHN0cmNociAqLwotI2luY2x1ZGUgImh0dHBkLmgiCi0KLS8qIEEgYnVuY2ggb2YgZnVuY3Rpb25zIGluIHV0aWwuYyBzY2FuIHN0cmluZ3MgbG9va2luZyBmb3IgY2VydGFpbiBjaGFyYWN0ZXJzLgotICogVG8gbWFrZSB0aGF0IG1vcmUgZWZmaWNpZW50IHdlIGVuY29kZSBhIGxvb2t1cCB0YWJsZS4KLSAqLwotI2RlZmluZSBUX0VTQ0FQRV9TSEVMTF9DTUQJKDB4MDEpCi0jZGVmaW5lIFRfRVNDQVBFX1BBVEhfU0VHTUVOVAkoMHgwMikKLSNkZWZpbmUgVF9PU19FU0NBUEVfUEFUSAkoMHgwNCkKLSNkZWZpbmUgVF9IVFRQX1RPS0VOX1NUT1AJKDB4MDgpCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gICAgdW5zaWduZWQgYzsKLSAgICB1bnNpZ25lZCBjaGFyIGZsYWdzOwotCi0gICAgcHJpbnRmKAotIi8qIHRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBnZW5fdGVzdF9jaGFyLCBkbyBub3QgZWRpdCAqL1xuIgotIiNkZWZpbmUgVF9FU0NBUEVfU0hFTExfQ01ECSgldSlcbiIKLSIjZGVmaW5lIFRfRVNDQVBFX1BBVEhfU0VHTUVOVAkoJXUpXG4iCi0iI2RlZmluZSBUX09TX0VTQ0FQRV9QQVRICSgldSlcbiIKLSIjZGVmaW5lIFRfSFRUUF9UT0tFTl9TVE9QCSgldSlcbiIKLSJcbiIKLSJzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0ZXN0X2NoYXJfdGFibGVbMjU2XSA9IHtcbiIKLSIgICAgMCwiLAotCVRfRVNDQVBFX1NIRUxMX0NNRCwKLQlUX0VTQ0FQRV9QQVRIX1NFR01FTlQsCi0JVF9PU19FU0NBUEVfUEFUSCwKLQlUX0hUVFBfVE9LRU5fU1RPUCk7Ci0KLSAgICAvKiB3ZSBleHBsaWNpdGx5IGRlYWx0IHdpdGggTlVMIGFib3ZlCi0gICAgICogaW4gY2FzZSBzb21lIHN0cmNocigpIGRvIGJvZ29zaXR5IHdpdGggaXQgKi8KLQotICAgIGZvciAoYyA9IDE7IGMgPCAyNTY7ICsrYykgewotCWZsYWdzID0gMDsKLQlpZiAoYyAlIDIwID09IDApCi0JICAgIHByaW50ZigiXG4gICAgIik7Ci0KLQkvKiBlc2NhcGVfc2hlbGxfY21kICovCi0JaWYgKHN0cmNocigiJjtgJ1wifCo/fjw+XigpW117fSRcXFxuIiwgYykpIHsKLQkgICAgZmxhZ3MgfD0gVF9FU0NBUEVfU0hFTExfQ01EOwotCX0KLQotCWlmICghYXBfaXNhbG51bShjKSAmJiAhc3RyY2hyKCIkLV8uKyEqJygpLDpAJj1+IiwgYykpIHsKLQkgICAgZmxhZ3MgfD0gVF9FU0NBUEVfUEFUSF9TRUdNRU5UOwotCX0KLQotCWlmICghYXBfaXNhbG51bShjKSAmJiAhc3RyY2hyKCIkLV8uKyEqJygpLDpAJj0vfiIsIGMpKSB7Ci0JICAgIGZsYWdzIHw9IFRfT1NfRVNDQVBFX1BBVEg7Ci0JfQotCi0JLyogdGhlc2UgYXJlIHRoZSAidHNwZWNpYWxzIiBmcm9tIFJGQzIwNjggKi8KLQlpZiAoYXBfaXNjbnRybChjKSB8fCBzdHJjaHIoIiBcdCgpPD5ALDs6XFwvW10/PXt9IiwgYykpIHsKLQkgICAgZmxhZ3MgfD0gVF9IVFRQX1RPS0VOX1NUT1A7Ci0JfQotCXByaW50ZigiJXUlYyIsIGZsYWdzLCAoYyA8IDI1NSkgPyAnLCcgOiAnICcpOwotCi0gICAgfQotICAgIHByaW50ZigiXG59O1xuIik7Ci0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZlci9nZW5fdGVzdF9jaGFyLmRzcCBiL3NlcnZlci9nZW5fdGVzdF9jaGFyLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2MzBjZS4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvZ2VuX3Rlc3RfY2hhci5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJnZW5fdGVzdF9jaGFyIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMwotCi1DRkc9Z2VuX3Rlc3RfY2hhciAtIFdpbjMyIERlYnVnCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgImdlbl90ZXN0X2NoYXIubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJnZW5fdGVzdF9jaGFyLm1hayIgQ0ZHPSJnZW5fdGVzdF9jaGFyIC0gV2luMzIgRGVidWciCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAiZ2VuX3Rlc3RfY2hhciAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvblwKLSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAiZ2VuX3Rlc3RfY2hhciAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb25cCi0gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAiZ2VuX3Rlc3RfY2hhciAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJnZW5fdGVzdCIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImdlbl90ZXN0IgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIiIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJnZW5fdGVzdF9jaGFyX1IiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0kgIi4uXGluY2x1ZGUiIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0jIEJlZ2luIFNwZWNpYWwgQnVpbGQgVG9vbAotU09VUkNFPSQoSW5wdXRQYXRoKQotUG9zdEJ1aWxkX0Rlc2M9Q3JlYXRlIHRlc3RfY2hhci5oCi1Qb3N0QnVpbGRfQ21kcz0uXGdlbl90ZXN0X2NoYXIgPiB0ZXN0X2NoYXIuaAotIyBFbmQgU3BlY2lhbCBCdWlsZCBUb29sCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJnZW5fdGVzdF9jaGFyIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJnZW5fdGVzMCIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImdlbl90ZXMwIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIiIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJnZW5fdGVzdF9jaGFyX0QiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWmkgL09kIC9JICIuLlxpbmNsdWRlIiAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAotIyBCZWdpbiBTcGVjaWFsIEJ1aWxkIFRvb2wKLVNPVVJDRT0kKElucHV0UGF0aCkKLVBvc3RCdWlsZF9EZXNjPUNyZWF0ZSB0ZXN0X2NoYXIuaAotUG9zdEJ1aWxkX0NtZHM9LlxnZW5fdGVzdF9jaGFyID4gdGVzdF9jaGFyLmgKLSMgRW5kIFNwZWNpYWwgQnVpbGQgVG9vbAotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAiZ2VuX3Rlc3RfY2hhciAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgImdlbl90ZXN0X2NoYXIgLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGdlbl90ZXN0X2NoYXIuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL3NlcnZlci9saXN0ZW4uYyBiL3NlcnZlci9saXN0ZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY3YzEyMS4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbGlzdGVuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImFwX2xpc3Rlbi5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0KLWFwX2xpc3Rlbl9yZWMgKmFwX2xpc3RlbmVyczsKLXN0YXRpYyBhcF9saXN0ZW5fcmVjICpvbGRfbGlzdGVuZXJzOwotc3RhdGljIGludCBhcF9saXN0ZW5iYWNrbG9nOwotc3RhdGljIGludCBzZW5kX2J1ZmZlcl9zaXplOwotCi0vKiBUT0RPOiBtYWtlX3NvY2sgaXMganVzdCBiZWdnaW5nIGFuZCBzY3JlYW1pbmcgZm9yIEFQUiBhYnN0cmFjdGlvbiAqLwotc3RhdGljIGludCBtYWtlX3NvY2soY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzZXJ2ZXIpCi17Ci0gICAgaW50IHM7Ci0gICAgaW50IG9uZSA9IDE7Ci0gICAgY2hhciBhZGRyWzUxMl07Ci0KLSAgICBpZiAoc2VydmVyLT5zaW5fYWRkci5zX2FkZHIgIT0gaHRvbmwoSU5BRERSX0FOWSkpCi0JYXBfc25wcmludGYoYWRkciwgc2l6ZW9mKGFkZHIpLCAiYWRkcmVzcyAlcyBwb3J0ICVkIiwKLQkJaW5ldF9udG9hKHNlcnZlci0+c2luX2FkZHIpLCBudG9ocyhzZXJ2ZXItPnNpbl9wb3J0KSk7Ci0gICAgZWxzZQotCWFwX3NucHJpbnRmKGFkZHIsIHNpemVvZihhZGRyKSwgInBvcnQgJWQiLCBudG9ocyhzZXJ2ZXItPnNpbl9wb3J0KSk7Ci0KLSAgICBpZiAoKHMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKSkgPT0gLTEpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQ1JJVCwgTlVMTCwKLQkJICAgICJtYWtlX3NvY2s6IGZhaWxlZCB0byBnZXQgYSBzb2NrZXQgZm9yICVzIiwgYWRkcik7Ci0JcmV0dXJuIC0xOwotICAgIH0KLQotI2lmZGVmIFNPX1JFVVNFQUREUgotICAgIGlmIChzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgKGNoYXIgKikgJm9uZSwgc2l6ZW9mKGludCkpIDwgMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19DUklULCBOVUxMLAotCQkgICAgIm1ha2Vfc29jazogZm9yICVzLCBzZXRzb2Nrb3B0OiAoU09fUkVVU0VBRERSKSIsIGFkZHIpOwotCWNsb3NlKHMpOwotCXJldHVybiAtMTsKLSAgICB9Ci0jZW5kaWYKLSAgICBvbmUgPSAxOwotI2lmZGVmIFNPX0tFRVBBTElWRQotICAgIGlmIChzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgKGNoYXIgKikgJm9uZSwgc2l6ZW9mKGludCkpIDwgMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19DUklULCBOVUxMLAotCQkgICAgIm1ha2Vfc29jazogZm9yICVzLCBzZXRzb2Nrb3B0OiAoU09fS0VFUEFMSVZFKSIsIGFkZHIpOwotCWNsb3NlKHMpOwotCXJldHVybiAtMTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8qCi0gICAgICogVG8gc2VuZCBkYXRhIG92ZXIgaGlnaCBiYW5kd2lkdGgtZGVsYXkgY29ubmVjdGlvbnMgYXQgZnVsbAotICAgICAqIHNwZWVkIHdlIG11c3QgZm9yY2UgdGhlIFRDUCB3aW5kb3cgdG8gb3BlbiB3aWRlIGVub3VnaCB0byBrZWVwIHRoZQotICAgICAqIHBpcGUgZnVsbC4gIFRoZSBkZWZhdWx0IHdpbmRvdyBzaXplIG9uIG1hbnkgc3lzdGVtcwotICAgICAqIGlzIG9ubHkgNGtCLiAgQ3Jvc3MtY291bnRyeSBXQU4gY29ubmVjdGlvbnMgb2YgMTAwbXMKLSAgICAgKiBhdCAxTWIvcyBhcmUgbm90IGltcG9zc2libGUgZm9yIHdlbGwgY29ubmVjdGVkIHNpdGVzLgotICAgICAqIElmIHdlIGFzc3VtZSAxMDBtcyBjcm9zcy1jb3VudHJ5IGxhdGVuY3ksCi0gICAgICogYSA0a0IgYnVmZmVyIGxpbWl0cyB0aHJvdWdocHV0IHRvIDQwa0Ivcy4KLSAgICAgKgotICAgICAqIFRvIGF2b2lkIHRoaXMgcHJvYmxlbSBJJ3ZlIGFkZGVkIHRoZSBTZW5kQnVmZmVyU2l6ZSBkaXJlY3RpdmUKLSAgICAgKiB0byBhbGxvdyB0aGUgd2ViIG1hc3RlciB0byBjb25maWd1cmUgc2VuZCBidWZmZXIgc2l6ZS4KLSAgICAgKgotICAgICAqIFRoZSB0cmFkZS1vZmYgb2YgbGFyZ2VyIGJ1ZmZlcnMgaXMgdGhhdCBtb3JlIGtlcm5lbCBtZW1vcnkKLSAgICAgKiBpcyBjb25zdW1lZC4gIFlNTVYsIGtub3cgeW91ciBjdXN0b21lcnMgYW5kIHlvdXIgbmV0d29yayEKLSAgICAgKgotICAgICAqIC1Kb2huIEhlaWRlbWFubiA8am9obmhAaXNpLmVkdT4gMjUtT2N0LTk2Ci0gICAgICoKLSAgICAgKiBJZiBubyBzaXplIGlzIHNwZWNpZmllZCwgdXNlIHRoZSBrZXJuZWwgZGVmYXVsdC4KLSAgICAgKi8KLSNpZm5kZWYgU09fU05EQlVGCi0gICAgaWYgKHNlbmRfYnVmZmVyX3NpemUpIHsKLQlpZiAoc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19TTkRCVUYsCi0JCShjaGFyICopICZzZW5kX2J1ZmZlcl9zaXplLCBzaXplb2YoaW50KSkgPCAwKSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBOVUxMLAotCQkJIm1ha2Vfc29jazogZmFpbGVkIHRvIHNldCBTZW5kQnVmZmVyU2l6ZSBmb3IgJXMsICIKLQkJCSJ1c2luZyBkZWZhdWx0IiwgYWRkcik7Ci0JICAgIC8qIG5vdCBhIGZhdGFsIGVycm9yICovCi0JfQotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKGJpbmQocywgKHN0cnVjdCBzb2NrYWRkciAqKSBzZXJ2ZXIsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKSA9PSAtMSkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19DUklULCBOVUxMLAotCSAgICAibWFrZV9zb2NrOiBjb3VsZCBub3QgYmluZCB0byAlcyIsIGFkZHIpOwotCWNsb3NlKHMpOwotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZiAobGlzdGVuKHMsIGFwX2xpc3RlbmJhY2tsb2cpID09IC0xKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgTlVMTCwKLQkgICAgIm1ha2Vfc29jazogdW5hYmxlIHRvIGxpc3RlbiBmb3IgY29ubmVjdGlvbnMgb24gJXMiLCBhZGRyKTsKLQljbG9zZShzKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcmV0dXJuIHM7Ci19Ci0KLQotc3RhdGljIHZvaWQgY2xvc2VfbGlzdGVuZXJzX29uX2V4ZWModm9pZCAqdikKLXsKLSAgICBhcF9saXN0ZW5fcmVjICpscjsKLQotICAgIGZvciAobHIgPSBhcF9saXN0ZW5lcnM7IGxyOyBsciA9IGxyLT5uZXh0KSB7Ci0JY2xvc2UobHItPmZkKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQgYWxsb2NfbGlzdGVuZXIoc3RydWN0IHNvY2thZGRyX2luICpsb2NhbF9hZGRyKQotewotICAgIGFwX2xpc3Rlbl9yZWMgKip3YWxrOwotICAgIGFwX2xpc3Rlbl9yZWMgKm5ldzsKLQotICAgIC8qIHNlZSBpZiB3ZSd2ZSBnb3QgYW4gb2xkIGxpc3RlbmVyIGZvciB0aGlzIGFkZHJlc3M6cG9ydCAqLwotICAgIGZvciAod2FsayA9ICZvbGRfbGlzdGVuZXJzOyAqd2Fsazsgd2FsayA9ICYoKndhbGspLT5uZXh0KSB7Ci0JaWYgKCFtZW1jbXAoJigqd2FsayktPmxvY2FsX2FkZHIsIGxvY2FsX2FkZHIsIHNpemVvZihsb2NhbF9hZGRyKSkpIHsKLQkgICAgLyogcmUtdXNlIGV4aXN0aW5nIHJlY29yZCAqLwotCSAgICBuZXcgPSAqd2FsazsKLQkgICAgKndhbGsgPSBuZXctPm5leHQ7Ci0JICAgIG5ldy0+bmV4dCA9IGFwX2xpc3RlbmVyczsKLQkgICAgYXBfbGlzdGVuZXJzID0gbmV3OwotCSAgICByZXR1cm47Ci0JfQotICAgIH0KLQotICAgIC8qIHRoaXMgaGFzIHRvIHN1cnZpdmUgcmVzdGFydHMgKi8KLSAgICBuZXcgPSBtYWxsb2Moc2l6ZW9mKGFwX2xpc3Rlbl9yZWMpKTsKLSAgICBuZXctPmxvY2FsX2FkZHIgPSAqbG9jYWxfYWRkcjsKLSAgICBuZXctPmZkID0gLTE7Ci0gICAgbmV3LT5uZXh0ID0gYXBfbGlzdGVuZXJzOwotICAgIGFwX2xpc3RlbmVycyA9IG5ldzsKLX0KLQotCi1pbnQgYXBfbGlzdGVuX29wZW4ocG9vbCAqcGNvbmYsIHVuc2lnbmVkIHBvcnQpCi17Ci0gICAgYXBfbGlzdGVuX3JlYyAqbHI7Ci0gICAgYXBfbGlzdGVuX3JlYyAqbmV4dDsKLSAgICBpbnQgbnVtX29wZW47Ci0gICAgc3RydWN0IHNvY2thZGRyX2luIGxvY2FsX2FkZHI7Ci0KLSAgICAvKiBhbGxvY2F0ZSBhIGRlZmF1bHQgbGlzdGVuZXIgaWYgbmVjZXNzYXJ5ICovCi0gICAgaWYgKGFwX2xpc3RlbmVycyA9PSBOVUxMKSB7Ci0JbG9jYWxfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQlsb2NhbF9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOyAvKiBYWFggKi8KLQlsb2NhbF9hZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCA/IHBvcnQgOiBERUZBVUxUX0hUVFBfUE9SVCk7Ci0JYWxsb2NfbGlzdGVuZXIoJmxvY2FsX2FkZHIpOwotICAgIH0KLQotICAgIG51bV9vcGVuID0gMDsKLSAgICBmb3IgKGxyID0gYXBfbGlzdGVuZXJzOyBscjsgbHIgPSBsci0+bmV4dCkgewotCWlmIChsci0+ZmQgPCAwKSB7Ci0JICAgIGxyLT5mZCA9IG1ha2Vfc29jaygmbHItPmxvY2FsX2FkZHIpOwotCX0KLQlpZiAobHItPmZkID49IDApIHsKLQkgICAgKytudW1fb3BlbjsKLQl9Ci0gICAgfQotCi0gICAgLyogY2xvc2UgdGhlIG9sZCBsaXN0ZW5lcnMgKi8KLSAgICBmb3IgKGxyID0gb2xkX2xpc3RlbmVyczsgbHI7IGxyID0gbmV4dCkgewotCWNsb3NlKGxyLT5mZCk7Ci0JbmV4dCA9IGxyLT5uZXh0OwotCWZyZWUobHIpOwotICAgIH0KLSAgICBvbGRfbGlzdGVuZXJzID0gTlVMTDsKLQotICAgIGFwX3JlZ2lzdGVyX2NsZWFudXAocGNvbmYsIE5VTEwsIGFwX251bGxfY2xlYW51cCwgY2xvc2VfbGlzdGVuZXJzX29uX2V4ZWMpOwotCi0gICAgcmV0dXJuIG51bV9vcGVuID8gMCA6IC0xOwotfQotCi0KLXZvaWQgYXBfbGlzdGVuX3ByZV9jb25maWcodm9pZCkKLXsKLSAgICBvbGRfbGlzdGVuZXJzID0gYXBfbGlzdGVuZXJzOwotICAgIGFwX2xpc3RlbmVycyA9IE5VTEw7Ci0gICAgYXBfbGlzdGVuYmFja2xvZyA9IERFRkFVTFRfTElTVEVOQkFDS0xPRzsKLX0KLQotCi1jb25zdCBjaGFyICphcF9zZXRfbGlzdGVuZXIoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICppcHMpCi17Ci0gICAgY2hhciAqcG9ydHM7Ci0gICAgdW5zaWduZWQgc2hvcnQgcG9ydDsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbG9jYWxfYWRkcjsKLQotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBvcnRzID0gc3RyY2hyKGlwcywgJzonKTsKLSAgICBpZiAocG9ydHMgIT0gTlVMTCkgewotCWlmIChwb3J0cyA9PSBpcHMpIHsKLQkgICAgcmV0dXJuICJNaXNzaW5nIElQIGFkZHJlc3MiOwotCX0KLQllbHNlIGlmIChwb3J0c1sxXSA9PSAnXDAnKSB7Ci0JICAgIHJldHVybiAiQWRkcmVzcyBtdXN0IGVuZCBpbiA6PHBvcnQtbnVtYmVyPiI7Ci0JfQotCSoocG9ydHMrKykgPSAnXDAnOwotICAgIH0KLSAgICBlbHNlIHsKLQlwb3J0cyA9IGlwczsKLSAgICB9Ci0KLSAgICBsb2NhbF9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotICAgIGlmIChwb3J0cyA9PSBpcHMpIHsgLyogbm8gYWRkcmVzcyAqLwotCWxvY2FsX2FkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7Ci0gICAgfQotICAgIGVsc2UgewotCWxvY2FsX2FkZHIuc2luX2FkZHIuc19hZGRyID0gYXBfZ2V0X3ZpcnRob3N0X2FkZHIoaXBzLCBOVUxMKTsKLSAgICB9Ci0gICAgcG9ydCA9IGF0b2kocG9ydHMpOwotICAgIGlmICghcG9ydCkgewotCXJldHVybiAiUG9ydCBtdXN0IGJlIG51bWVyaWMiOwotICAgIH0KLSAgICBsb2NhbF9hZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0KLSAgICBhbGxvY19saXN0ZW5lcigmbG9jYWxfYWRkcik7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotY29uc3QgY2hhciAqYXBfc2V0X2xpc3RlbmJhY2tsb2coY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGludCBiOwotCi0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgYiA9IGF0b2koYXJnKTsKLSAgICBpZiAoYiA8IDEpIHsKLSAgICAgICAgcmV0dXJuICJMaXN0ZW5CYWNrbG9nIG11c3QgYmUgPiAwIjsKLSAgICB9Ci0gICAgYXBfbGlzdGVuYmFja2xvZyA9IGI7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbnN0IGNoYXIgKmFwX3NldF9zZW5kX2J1ZmZlcl9zaXplKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGludCBzID0gYXRvaShhcmcpOwotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChzIDwgNTEyICYmIHMgIT0gMCkgewotICAgICAgICByZXR1cm4gIlNlbmRCdWZmZXJTaXplIG11c3QgYmUgPj0gNTEyIGJ5dGVzLCBvciAwIGZvciBzeXN0ZW0gZGVmYXVsdC4iOwotICAgIH0KLSAgICBzZW5kX2J1ZmZlcl9zaXplID0gczsKLSAgICByZXR1cm4gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZlci9sb2cuYyBiL3NlcnZlci9sb2cuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ExZTBlYS4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbG9nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NzcgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogaHR0cF9sb2cuYzogRGVhbGluZyB3aXRoIHRoZSBsb2dzIGFuZCBlcnJvcnMKLSAqIAotICogUm9iIE1jQ29vbAotICogCi0gKi8KLQotCi0jZGVmaW5lIENPUkVfUFJJVkFURQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25mX2dsb2JhbHMuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotdHlwZWRlZiBzdHJ1Y3QgewotCWNoYXIJKnRfbmFtZTsKLQlpbnQJdF92YWw7Ci19IFRSQU5TOwotCi0jaWZkZWYgSEFWRV9TWVNMT0cKLQotc3RhdGljIGNvbnN0IFRSQU5TIGZhY2lsaXRpZXNbXSA9IHsKLSAgICB7ImF1dGgiLAlMT0dfQVVUSH0sCi0jaWZkZWYgTE9HX0FVVEhQUklWCi0gICAgeyJhdXRocHJpdiIsTE9HX0FVVEhQUklWfSwKLSNlbmRpZgotI2lmZGVmIExPR19DUk9OCi0gICAgeyJjcm9uIiwgCUxPR19DUk9OfSwKLSNlbmRpZgotI2lmZGVmIExPR19EQUVNT04KLSAgICB7ImRhZW1vbiIsCUxPR19EQUVNT059LAotI2VuZGlmCi0jaWZkZWYgTE9HX0ZUUAotICAgIHsiZnRwIiwJTE9HX0ZUUH0sCi0jZW5kaWYKLSNpZmRlZiBMT0dfS0VSTgotICAgIHsia2VybiIsCUxPR19LRVJOfSwKLSNlbmRpZgotI2lmZGVmIExPR19MUFIKLSAgICB7ImxwciIsCUxPR19MUFJ9LAotI2VuZGlmCi0jaWZkZWYgTE9HX01BSUwKLSAgICB7Im1haWwiLAlMT0dfTUFJTH0sCi0jZW5kaWYKLSNpZmRlZiBMT0dfTkVXUwotICAgIHsibmV3cyIsCUxPR19ORVdTfSwKLSNlbmRpZgotI2lmZGVmIExPR19TWVNMT0cKLSAgICB7InN5c2xvZyIsCUxPR19TWVNMT0d9LAotI2VuZGlmCi0jaWZkZWYgTE9HX1VTRVIKLSAgICB7InVzZXIiLAlMT0dfVVNFUn0sCi0jZW5kaWYKLSNpZmRlZiBMT0dfVVVDUAotICAgIHsidXVjcCIsCUxPR19VVUNQfSwKLSNlbmRpZgotI2lmZGVmIExPR19MT0NBTDAKLSAgICB7ImxvY2FsMCIsCUxPR19MT0NBTDB9LAotI2VuZGlmCi0jaWZkZWYgTE9HX0xPQ0FMMQotICAgIHsibG9jYWwxIiwJTE9HX0xPQ0FMMX0sCi0jZW5kaWYKLSNpZmRlZiBMT0dfTE9DQUwyCi0gICAgeyJsb2NhbDIiLAlMT0dfTE9DQUwyfSwKLSNlbmRpZgotI2lmZGVmIExPR19MT0NBTDMKLSAgICB7ImxvY2FsMyIsCUxPR19MT0NBTDN9LAotI2VuZGlmCi0jaWZkZWYgTE9HX0xPQ0FMNAotICAgIHsibG9jYWw0IiwJTE9HX0xPQ0FMNH0sCi0jZW5kaWYKLSNpZmRlZiBMT0dfTE9DQUw1Ci0gICAgeyJsb2NhbDUiLAlMT0dfTE9DQUw1fSwKLSNlbmRpZgotI2lmZGVmIExPR19MT0NBTDYKLSAgICB7ImxvY2FsNiIsCUxPR19MT0NBTDZ9LAotI2VuZGlmCi0jaWZkZWYgTE9HX0xPQ0FMNwotICAgIHsibG9jYWw3IiwJTE9HX0xPQ0FMN30sCi0jZW5kaWYKLSAgICB7TlVMTCwJCS0xfSwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0IFRSQU5TIHByaW9yaXRpZXNbXSA9IHsKLSAgICB7ImVtZXJnIiwJQVBMT0dfRU1FUkd9LAotICAgIHsiYWxlcnQiLAlBUExPR19BTEVSVH0sCi0gICAgeyJjcml0IiwJQVBMT0dfQ1JJVH0sCi0gICAgeyJlcnJvciIsCUFQTE9HX0VSUn0sCi0gICAgeyJ3YXJuIiwJQVBMT0dfV0FSTklOR30sCi0gICAgeyJub3RpY2UiLAlBUExPR19OT1RJQ0V9LAotICAgIHsiaW5mbyIsCUFQTE9HX0lORk99LAotICAgIHsiZGVidWciLAlBUExPR19ERUJVR30sCi0gICAge05VTEwsCS0xfSwKLX07Ci0KLXN0YXRpYyBpbnQgZXJyb3JfbG9nX2NoaWxkKHZvaWQgKmNtZCwgY2hpbGRfaW5mbyAqcGluZm8pCi17Ci0gICAgLyogQ2hpbGQgcHJvY2VzcyBjb2RlIGZvciAnRXJyb3JMb2cgInwuLi4iJzsKLSAgICAgKiBtYXkgd2FudCBhIGNvbW1vbiBmcmFtZXdvcmsgZm9yIHRoaXMsIHNpbmNlIEkgZXhwZWN0IGl0IHdpbGwKLSAgICAgKiBiZSBjb21tb24gZm9yIG90aGVyIGZvby1sb2dnZXJzIHRvIHdhbnQgdGhpcyBzb3J0IG9mIHRoaW5nLi4uCi0gICAgICovCi0gICAgaW50IGNoaWxkX3BpZCA9IDA7Ci0KLSAgICBhcF9jbGVhbnVwX2Zvcl9leGVjKCk7Ci0jaWZkZWYgU0lHSFVQCi0gICAgLyogTm8gY29uY2VwdCBvZiBhIGNoaWxkIHByb2Nlc3Mgb24gV2luMzIgKi8KLSAgICBzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKLSNlbmRpZiAvKiBuZGVmIFNJR0hVUCAqLwotI2lmIGRlZmluZWQoV0lOMzIpCi0gICAgY2hpbGRfcGlkID0gc3Bhd25sKF9QX05PV0FJVCwgU0hFTExfUEFUSCwgU0hFTExfUEFUSCwgIi9jIiwgKGNoYXIgKiljbWQsIE5VTEwpOwotICAgIHJldHVybihjaGlsZF9waWQpOwotI2VsaWYgZGVmaW5lZChPUzIpCi0gICAgLyogRm9yIE9TLzIgd2UgbmVlZCB0byB1c2UgYSAnLycgYW5kIHNwYXduIHRoZSBjaGlsZCByYXRoZXIgdGhhbiBleGVjIGFzCi0gICAgICogd2UgaGF2ZW4ndCBmb3JrZWQgKi8KLSAgICBjaGlsZF9waWQgPSBzcGF3bmwoUF9OT1dBSVQsIFNIRUxMX1BBVEgsIFNIRUxMX1BBVEgsICIvYyIsIChjaGFyICopY21kLCBOVUxMKTsKLSAgICByZXR1cm4oY2hpbGRfcGlkKTsKLSNlbHNlICAgIAotICAgIGV4ZWNsKFNIRUxMX1BBVEgsIFNIRUxMX1BBVEgsICItYyIsIChjaGFyICopY21kLCBOVUxMKTsKLSNlbmRpZiAgICAKLSAgICBleGl0KDEpOwotICAgIC8qIE5PVCBSRUFDSEVEICovCi0gICAgcmV0dXJuKGNoaWxkX3BpZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG9wZW5fZXJyb3JfbG9nKHNlcnZlcl9yZWMgKnMsIHBvb2wgKnApCi17Ci0gICAgY2hhciAqZm5hbWU7Ci0KLSAgICBpZiAoKnMtPmVycm9yX2ZuYW1lID09ICd8JykgewotCUZJTEUgKmR1bW15OwotI2lmZGVmIFRQRgotICAgICAgICBUUEZfRk9SS19DSElMRCBjbGQ7Ci0gICAgICAgIGNsZC5maWxlbmFtZSA9IHMtPmVycm9yX2ZuYW1lKzE7Ci0gICAgICAgIGNsZC5zdWJwcm9jZXNzX2VudiA9IE5VTEw7Ci0gICAgICAgIGNsZC5wcm9nX3R5cGUgPSBGT1JLX05BTUU7Ci0gICAgICAgIGlmICghYXBfc3Bhd25fY2hpbGQocCwgTlVMTCwgJmNsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBraWxsX2FmdGVyX3RpbWVvdXQsICZkdW1teSwgTlVMTCwgTlVMTCkpIHsKLSNlbHNlCi0JaWYgKCFhcF9zcGF3bl9jaGlsZChwLCBlcnJvcl9sb2dfY2hpbGQsICh2b2lkICopKHMtPmVycm9yX2ZuYW1lKzEpLAotCQkJICAgIGtpbGxfYWZ0ZXJfdGltZW91dCwgJmR1bW15LCBOVUxMLCBOVUxMKSkgewotI2VuZGlmIC8qIFRQRiAqLwotCSAgICBwZXJyb3IoImFwX3NwYXduX2NoaWxkIik7Ci0JICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgZm9yayBjaGlsZCBmb3IgRXJyb3JMb2cgcHJvY2Vzc1xuIik7Ci0JICAgIGV4aXQoMSk7Ci0JfQotCi0Jcy0+ZXJyb3JfbG9nID0gZHVtbXk7Ci0gICAgfQotCi0jaWZkZWYgSEFWRV9TWVNMT0cKLSAgICBlbHNlIGlmICghc3RybmNhc2VjbXAocy0+ZXJyb3JfZm5hbWUsICJzeXNsb2ciLCA2KSkgewotCWlmICgoZm5hbWUgPSBzdHJjaHIocy0+ZXJyb3JfZm5hbWUsICc6JykpKSB7Ci0JICAgIGNvbnN0IFRSQU5TICpmYWM7Ci0KLQkgICAgZm5hbWUrKzsKLQkgICAgZm9yIChmYWMgPSBmYWNpbGl0aWVzOyBmYWMtPnRfbmFtZTsgZmFjKyspIHsKLQkJaWYgKCFzdHJjYXNlY21wKGZuYW1lLCBmYWMtPnRfbmFtZSkpIHsKLQkJICAgIG9wZW5sb2coYXBfc2VydmVyX2FyZ3YwLCBMT0dfTkRFTEFZfExPR19DT05TfExPR19QSUQsCi0JCQkgICAgZmFjLT50X3ZhbCk7Ci0JCSAgICBzLT5lcnJvcl9sb2cgPSBOVUxMOwotCQkgICAgcmV0dXJuOwotCQl9Ci0JICAgIH0KLQl9Ci0JZWxzZQotCSAgICBvcGVubG9nKGFwX3NlcnZlcl9hcmd2MCwgTE9HX05ERUxBWXxMT0dfQ09OU3xMT0dfUElELCBMT0dfTE9DQUw3KTsKLQotCXMtPmVycm9yX2xvZyA9IE5VTEw7Ci0gICAgfQotI2VuZGlmCi0gICAgZWxzZSB7Ci0JZm5hbWUgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShwLCBzLT5lcnJvcl9mbmFtZSk7Ci0gICAgICAgIGlmICghKHMtPmVycm9yX2xvZyA9IGFwX3Bmb3BlbihwLCBmbmFtZSwgImEiKSkpIHsKLSAgICAgICAgICAgIHBlcnJvcigiZm9wZW4iKTsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNvdWxkIG5vdCBvcGVuIGVycm9yIGxvZyBmaWxlICVzLlxuIiwKLQkJICAgIGFwX3NlcnZlcl9hcmd2MCwgZm5hbWUpOwotICAgICAgICAgICAgZXhpdCgxKTsKLQl9Ci0gICAgfQotfQotCi12b2lkIGFwX29wZW5fbG9ncyhzZXJ2ZXJfcmVjICpzX21haW4sIHBvb2wgKnApCi17Ci0gICAgc2VydmVyX3JlYyAqdmlydCwgKnE7Ci0gICAgaW50IHJlcGxhY2Vfc3RkZXJyOwotCi0gICAgb3Blbl9lcnJvcl9sb2coc19tYWluLCBwKTsKLQotICAgIHJlcGxhY2Vfc3RkZXJyID0gMTsKLSAgICBpZiAoc19tYWluLT5lcnJvcl9sb2cpIHsKLQkvKiByZXBsYWNlIHN0ZGVyciB3aXRoIHRoaXMgbmV3IGxvZyAqLwotCWZmbHVzaChzdGRlcnIpOwotCWlmIChkdXAyKGZpbGVubyhzX21haW4tPmVycm9yX2xvZyksIFNUREVSUl9GSUxFTk8pID09IC0xKSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19DUklULCBzX21haW4sCi0JCSJ1bmFibGUgdG8gcmVwbGFjZSBzdGRlcnIgd2l0aCBlcnJvcl9sb2ciKTsKLQl9IGVsc2UgewotCSAgICByZXBsYWNlX3N0ZGVyciA9IDA7Ci0JfQotICAgIH0KLSAgICAvKiBub3RlIHRoYXQgc3RkZXJyIG1heSBzdGlsbCBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggc29tZXRoaW5nCi0gICAgICogYmVjYXVzZSBpdCBwb2ludHMgdG8gdGhlIG9sZCBlcnJvciBsb2csIG9yIGJhY2sgdG8gdGhlIHR0eQotICAgICAqIG9mIHRoZSBzdWJtaXR0ZXIuCi0gICAgICovCi0gICAgaWYgKHJlcGxhY2Vfc3RkZXJyICYmIGZyZW9wZW4oIi9kZXYvbnVsbCIsICJ3Iiwgc3RkZXJyKSA9PSBOVUxMKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0NSSVQsIHNfbWFpbiwKLQkgICAgInVuYWJsZSB0byByZXBsYWNlIHN0ZGVyciB3aXRoIC9kZXYvbnVsbCIpOwotICAgIH0KLQotICAgIGZvciAodmlydCA9IHNfbWFpbi0+bmV4dDsgdmlydDsgdmlydCA9IHZpcnQtPm5leHQpIHsKLQlpZiAodmlydC0+ZXJyb3JfZm5hbWUpCi0JewotCSAgICBmb3IgKHE9c19tYWluOyBxICE9IHZpcnQ7IHEgPSBxLT5uZXh0KQotCQlpZiAocS0+ZXJyb3JfZm5hbWUgIT0gTlVMTCAmJgotCQkgICAgc3RyY21wKHEtPmVycm9yX2ZuYW1lLCB2aXJ0LT5lcnJvcl9mbmFtZSkgPT0gMCkKLQkJICAgIGJyZWFrOwotCSAgICBpZiAocSA9PSB2aXJ0KQotCQlvcGVuX2Vycm9yX2xvZyh2aXJ0LCBwKTsKLQkgICAgZWxzZSAKLQkJdmlydC0+ZXJyb3JfbG9nID0gcS0+ZXJyb3JfbG9nOwotCX0KLQllbHNlCi0JICAgIHZpcnQtPmVycm9yX2xvZyA9IHNfbWFpbi0+ZXJyb3JfbG9nOwotICAgIH0KLX0KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9lcnJvcl9sb2cyc3RkZXJyKHNlcnZlcl9yZWMgKnMpIHsKLSAgICBpZiAoICAgcy0+ZXJyb3JfbG9nICE9IE5VTEwKLSAgICAgICAgJiYgZmlsZW5vKHMtPmVycm9yX2xvZykgIT0gU1RERVJSX0ZJTEVOTykKLSAgICAgICAgZHVwMihmaWxlbm8ocy0+ZXJyb3JfbG9nKSwgU1RERVJSX0ZJTEVOTyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxvZ19lcnJvcl9jb3JlKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBpbnQgbGV2ZWwsCi0JCQkgICBjb25zdCBzZXJ2ZXJfcmVjICpzLCBjb25zdCByZXF1ZXN0X3JlYyAqciwKLQkJCSAgIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQotewotICAgIGNoYXIgZXJyc3RyW01BWF9TVFJJTkdfTEVOXTsKLSAgICBzaXplX3QgbGVuOwotICAgIGludCBzYXZlX2Vycm5vID0gZXJybm87Ci0gICAgRklMRSAqbG9nZjsKLQotICAgIGlmIChzID09IE5VTEwpIHsKLQkvKgotCSAqIElmIHdlIGFyZSBkb2luZyBzdGRlcnIgbG9nZ2luZyAoc3RhcnR1cCksIGRvbid0IGxvZyBtZXNzYWdlcyB0aGF0IGFyZQotCSAqIGFib3ZlIHRoZSBkZWZhdWx0IHNlcnZlciBsb2cgbGV2ZWwgdW5sZXNzIGl0IGlzIGEgc3RhcnR1cC9zaHV0ZG93bgotCSAqIG5vdGljZQotCSAqLwotCWlmICgoKGxldmVsICYgQVBMT0dfTEVWRUxNQVNLKSAhPSBBUExPR19OT1RJQ0UpICYmCi0JICAgICgobGV2ZWwgJiBBUExPR19MRVZFTE1BU0spID4gREVGQVVMVF9MT0dMRVZFTCkpCi0JICAgIHJldHVybjsKLQlsb2dmID0gc3RkZXJyOwotICAgIH0KLSAgICBlbHNlIGlmIChzLT5lcnJvcl9sb2cpIHsKLQkvKgotCSAqIElmIHdlIGFyZSBkb2luZyBub3JtYWwgbG9nZ2luZywgZG9uJ3QgbG9nIG1lc3NhZ2VzIHRoYXQgYXJlCi0JICogYWJvdmUgdGhlIHNlcnZlciBsb2cgbGV2ZWwgdW5sZXNzIGl0IGlzIGEgc3RhcnR1cC9zaHV0ZG93biBub3RpY2UKLQkgKi8KLQlpZiAoKChsZXZlbCAmIEFQTE9HX0xFVkVMTUFTSykgIT0gQVBMT0dfTk9USUNFKSAmJgotCSAgICAoKGxldmVsICYgQVBMT0dfTEVWRUxNQVNLKSA+IHMtPmxvZ2xldmVsKSkKLQkgICAgcmV0dXJuOwotCWxvZ2YgPSBzLT5lcnJvcl9sb2c7Ci0gICAgfQotI2lmZGVmIFRQRgotICAgIGVsc2UgaWYgKHRwZl9jaGlsZCkgewotICAgIC8qCi0gICAgICogSWYgd2UgYXJlIGRvaW5nIG5vcm1hbCBsb2dnaW5nLCBkb24ndCBsb2cgbWVzc2FnZXMgdGhhdCBhcmUKLSAgICAgKiBhYm92ZSB0aGUgc2VydmVyIGxvZyBsZXZlbCB1bmxlc3MgaXQgaXMgYSBzdGFydHVwL3NodXRkb3duIG5vdGljZQotICAgICAqLwotICAgIGlmICgoKGxldmVsICYgQVBMT0dfTEVWRUxNQVNLKSAhPSBBUExPR19OT1RJQ0UpICYmCi0gICAgICAgICgobGV2ZWwgJiBBUExPR19MRVZFTE1BU0spID4gcy0+bG9nbGV2ZWwpKQotICAgICAgICByZXR1cm47Ci0gICAgbG9nZiA9IHN0ZGVycjsKLSAgICB9Ci0jZW5kaWYgLyogVFBGICovCi0gICAgZWxzZSB7Ci0JLyoKLQkgKiBJZiB3ZSBhcmUgZG9pbmcgc3lzbG9nIGxvZ2dpbmcsIGRvbid0IGxvZyBtZXNzYWdlcyB0aGF0IGFyZQotCSAqIGFib3ZlIHRoZSBzZXJ2ZXIgbG9nIGxldmVsIChpbmNsdWRpbmcgYSBzdGFydHVwL3NodXRkb3duIG5vdGljZSkKLQkgKi8KLQlpZiAoKGxldmVsICYgQVBMT0dfTEVWRUxNQVNLKSA+IHMtPmxvZ2xldmVsKQotCSAgICByZXR1cm47Ci0JbG9nZiA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKGxvZ2YpIHsKLQlsZW4gPSBhcF9zbnByaW50ZihlcnJzdHIsIHNpemVvZihlcnJzdHIpLCAiWyVzXSAiLCBhcF9nZXRfdGltZSgpKTsKLSAgICB9IGVsc2UgewotCWxlbiA9IDA7Ci0gICAgfQotCi0gICAgbGVuICs9IGFwX3NucHJpbnRmKGVycnN0ciArIGxlbiwgc2l6ZW9mKGVycnN0cikgLSBsZW4sCi0JICAgICJbJXNdICIsIHByaW9yaXRpZXNbbGV2ZWwgJiBBUExPR19MRVZFTE1BU0tdLnRfbmFtZSk7Ci0KLSNpZm5kZWYgVFBGCi0gICAgaWYgKGZpbGUgJiYgKGxldmVsICYgQVBMT0dfTEVWRUxNQVNLKSA9PSBBUExPR19ERUJVRykgewotI2lmZGVmIF9PU0RfUE9TSVgKLQljaGFyIHRtcFsyNTZdOwotCWNoYXIgKmUgPSBzdHJyY2hyKGZpbGUsICcvJyk7Ci0KLQkvKiBJbiBPU0QvUE9TSVgsIHRoZSBjb21waWxlciByZXR1cm5zIGZvciBfX0ZJTEVfXwotCSAqIGEgc3RyaW5nIGxpa2U6IF9fRklMRV9fPSIqUE9TSVgoL3Vzci9pbmNsdWRlL3N0ZGlvLmgpIgotCSAqIChpdCBldmVuIHJldHVybnMgYW4gYWJzb2x1dGUgcGF0aCBmb3Igc291cmNlcyBpbgotCSAqIHRoZSBjdXJyZW50IGRpcmVjdG9yeSkuIEhlcmUgd2UgdHJ5IHRvIHN0cmlwIHRoaXMKLQkgKiBkb3duIHRvIHRoZSBiYXNlbmFtZS4KLQkgKi8KLQlpZiAoZSAhPSBOVUxMICYmIGVbMV0gIT0gJ1wwJykgewotCSAgICBhcF9zbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiJXMiLCAmZVsxXSk7Ci0JICAgIGUgPSAmdG1wW3N0cmxlbih0bXApLTFdOwotCSAgICBpZiAoKmUgPT0gJyknKQotCQkqZSA9ICdcMCc7Ci0JICAgIGZpbGUgPSB0bXA7Ci0JfQotI2VuZGlmIC8qX09TRF9QT1NJWCovCi0JbGVuICs9IGFwX3NucHJpbnRmKGVycnN0ciArIGxlbiwgc2l6ZW9mKGVycnN0cikgLSBsZW4sCi0JCSIlcyglZCk6ICIsIGZpbGUsIGxpbmUpOwotICAgIH0KLSNlbmRpZiAvKiBUUEYgKi8KLSAgICBpZiAocikgewotCS8qIFhYWDogVE9ETzogYWRkIGEgbWV0aG9kIG9mIHNlbGVjdGluZyB3aGV0aGVyIGxvZ2dlZCBjbGllbnQKLQkgKiBhZGRyZXNzZXMgYXJlIGluIGRvdHRlZCBxdWFkIG9yIHJlc29sdmVkIGZvcm0uLi4gZG90dGVkCi0JICogcXVhZCBpcyB0aGUgbW9zdCBzZWN1cmUsIHdoaWNoIGlzIHdoeSBJJ20gaW1wbGVtZW50aW5nIGl0Ci0JICogZmlyc3QuIC1kamcKLQkgKi8KLQlsZW4gKz0gYXBfc25wcmludGYoZXJyc3RyICsgbGVuLCBzaXplb2YoZXJyc3RyKSAtIGxlbiwKLQkJIltjbGllbnQgJXNdICIsIHItPmNvbm5lY3Rpb24tPnJlbW90ZV9pcCk7Ci0gICAgfQotICAgIGlmICghKGxldmVsICYgQVBMT0dfTk9FUlJOTykKLQkmJiAoc2F2ZV9lcnJubyAhPSAwKQotI2lmZGVmIFdJTjMyCi0JJiYgIShsZXZlbCAmIEFQTE9HX1dJTjMyRVJST1IpCi0jZW5kaWYKLQkpIHsKLQlsZW4gKz0gYXBfc25wcmludGYoZXJyc3RyICsgbGVuLCBzaXplb2YoZXJyc3RyKSAtIGxlbiwKLQkJIiglZCklczogIiwgc2F2ZV9lcnJubywgc3RyZXJyb3Ioc2F2ZV9lcnJubykpOwotICAgIH0KLSNpZmRlZiBXSU4zMgotICAgIGlmIChsZXZlbCAmIEFQTE9HX1dJTjMyRVJST1IpIHsKLQlpbnQgbkNoYXJzOwotCWludCBuRXJyb3JDb2RlOwotCi0JbkVycm9yQ29kZSA9IEdldExhc3RFcnJvcigpOwotCWxlbiArPSBhcF9zbnByaW50ZihlcnJzdHIgKyBsZW4sIHNpemVvZihlcnJzdHIpIC0gbGVuLAotCSAgICAiKCVkKSIsIG5FcnJvckNvZGUpOwotCi0JbkNoYXJzID0gRm9ybWF0TWVzc2FnZSggCi0JICAgIEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLAotCSAgICBOVUxMLAotCSAgICBuRXJyb3JDb2RlLAotCSAgICBNQUtFTEFOR0lEKExBTkdfTkVVVFJBTCwgU1VCTEFOR19ERUZBVUxUKSwgLy8gRGVmYXVsdCBsYW5ndWFnZQotCSAgICAoTFBUU1RSKSBlcnJzdHIgKyBsZW4sCi0JICAgIHNpemVvZihlcnJzdHIpIC0gbGVuLAotCSAgICBOVUxMIAotCSk7Ci0JbGVuICs9IG5DaGFyczsKLQlpZiAobkNoYXJzID09IDApIHsKLQkgICAgLyogVW0sIGVycm9yIG9jY3VycmVkLCBidXQgd2UgY2FuJ3QgcmVjdXJzZSB0byBsb2cgaXQgYWdhaW4KLQkgICAgICogKGFuZCBpdCB3b3VsZCBwcm9iYWJseSBvbmx5IGZhaWwgYW55d2F5KSwgc28gbGV0cyBqdXN0Ci0JICAgICAqIGxvZyB0aGUgbnVtZXJpYyB2YWx1ZS4KLQkgICAgICovCi0JICAgIG5FcnJvckNvZGUgPSBHZXRMYXN0RXJyb3IoKTsKLQkgICAgbGVuICs9IGFwX3NucHJpbnRmKGVycnN0ciArIGxlbiwgc2l6ZW9mKGVycnN0cikgLSBsZW4sCi0JCQkgICAgICAgIihGb3JtYXRNZXNzYWdlIGZhaWxlZCB3aXRoIGNvZGUgJWQpOiAiLAotCQkJICAgICAgIG5FcnJvckNvZGUpOwotCX0KLQllbHNlIHsKLQkgICAgLyogRm9ybWF0TWVzc2FnZSBwdXQgdGhlIG1lc3NhZ2UgaW4gdGhlIGJ1ZmZlciwgYnV0IGl0IG1heQotCSAgICAgKiBoYXZlIGFwcGVuZGVkIGEgbmV3bGluZSAoXHJcbikuIFNvIHJlbW92ZSBpdCBhbmQgdXNlCi0JICAgICAqICI6ICIgaW5zdGVhZCBsaWtlIHRoZSBVbml4IGVycm9ycy4gVGhlIGVycm9yIG1heSBhbHNvCi0JICAgICAqIGVuZCB3aXRoIGEgLiBiZWZvcmUgdGhlIHJldHVybiAtIGlmIHNvLCB0cmFzaCBpdC4KLQkgICAgICovCi0JICAgIGlmIChsZW4gPiAxICYmIGVycnN0cltsZW4tMl0gPT0gJ1xyJyAmJiBlcnJzdHJbbGVuLTFdID09ICdcbicpIHsKLQkJaWYgKGxlbiA+IDIgJiYgZXJyc3RyW2xlbi0zXSA9PSAnLicpCi0JCSAgICBsZW4tLTsKLQkJZXJyc3RyW2xlbi0yXSA9ICc6JzsKLQkJZXJyc3RyW2xlbi0xXSA9ICcgJzsKLQkgICAgfQotCX0KLSAgICB9Ci0jZW5kaWYKLQotICAgIGxlbiArPSBhcF92c25wcmludGYoZXJyc3RyICsgbGVuLCBzaXplb2YoZXJyc3RyKSAtIGxlbiwgZm10LCBhcmdzKTsKLQotICAgIC8qIE5VTEwgaWYgd2UgYXJlIGxvZ2dpbmcgdG8gc3lzbG9nICovCi0gICAgaWYgKGxvZ2YpIHsKLQlmcHV0cyhlcnJzdHIsIGxvZ2YpOwotCWZwdXRjKCdcbicsIGxvZ2YpOwotCWZmbHVzaChsb2dmKTsKLSAgICB9Ci0jaWZkZWYgSEFWRV9TWVNMT0cKLSAgICBlbHNlIHsKLQlzeXNsb2cobGV2ZWwgJiBBUExPR19MRVZFTE1BU0ssICIlcyIsIGVycnN0cik7Ci0gICAgfQotI2VuZGlmCi19Ci0gICAgCi1BUElfRVhQT1JUKHZvaWQpIGFwX2xvZ19lcnJvcihjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IGxldmVsLAotCQkJICAgICAgY29uc3Qgc2VydmVyX3JlYyAqcywgY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgdmFfbGlzdCBhcmdzOwotCi0gICAgdmFfc3RhcnQoYXJncywgZm10KTsKLSAgICBsb2dfZXJyb3JfY29yZShmaWxlLCBsaW5lLCBsZXZlbCwgcywgTlVMTCwgZm10LCBhcmdzKTsKLSAgICB2YV9lbmQoYXJncyk7Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfbG9nX3JlcnJvcihjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IGxldmVsLAotCQkJICAgICAgIGNvbnN0IHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgICB2YV9saXN0IGFyZ3M7Ci0KLSAgICB2YV9zdGFydChhcmdzLCBmbXQpOwotICAgIGxvZ19lcnJvcl9jb3JlKGZpbGUsIGxpbmUsIGxldmVsLCByLT5zZXJ2ZXIsIHIsIGZtdCwgYXJncyk7Ci0gICAgLyoKLSAgICAgKiBJRiB0aGUgZXJyb3IgbGV2ZWwgaXMgJ3dhcm5pbmcnIG9yIG1vcmUgc2V2ZXJlLAotICAgICAqIEFORCB0aGVyZSBpc24ndCBhbHJlYWR5IGVycm9yIHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdCwKLSAgICAgKiBUSEVOIG1ha2UgdGhlIG1lc3NhZ2UgdGV4dCBhdmFpbGFibGUgdG8gRXJyb3JEb2N1bWVudCBhbmQKLSAgICAgKiBvdGhlciBlcnJvciBwcm9jZXNzb3JzLiAgVGhpcyBjYW4gYmUgZGlzYWJsZWQgYnkgc3R1ZmZpbmcKLSAgICAgKiBzb21ldGhpbmcsIGV2ZW4gYW4gZW1wdHkgc3RyaW5nLCBpbnRvIHRoZSAiZXJyb3Itbm90ZXMiIGNlbGwKLSAgICAgKiBiZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUuCi0gICAgICovCi0gICAgdmFfZW5kKGFyZ3MpOwotICAgIHZhX3N0YXJ0KGFyZ3MsZm10KTsgCi0gICAgaWYgKCgobGV2ZWwgJiBBUExPR19MRVZFTE1BU0spIDw9IEFQTE9HX1dBUk5JTkcpCi0JJiYgKGFwX3RhYmxlX2dldChyLT5ub3RlcywgImVycm9yLW5vdGVzIikgPT0gTlVMTCkpIHsKLQlhcF90YWJsZV9zZXRuKHItPm5vdGVzLCAiZXJyb3Itbm90ZXMiLAotCQkgICAgICBhcF9wdnNwcmludGYoci0+cG9vbCwgZm10LCBhcmdzKSk7Ci0gICAgfQotICAgIHZhX2VuZChhcmdzKTsKLX0KLQotdm9pZCBhcF9sb2dfcGlkKHBvb2wgKnAsIGNoYXIgKmZuYW1lKQotewotICAgIEZJTEUgKnBpZF9maWxlOwotICAgIHN0cnVjdCBzdGF0IGZpbmZvOwotICAgIHN0YXRpYyBwaWRfdCBzYXZlZF9waWQgPSAtMTsKLSAgICBwaWRfdCBteXBpZDsKLQotICAgIGlmICghZm5hbWUpIAotCXJldHVybjsKLQotICAgIGZuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocCwgZm5hbWUpOwotICAgIG15cGlkID0gZ2V0cGlkKCk7Ci0gICAgaWYgKG15cGlkICE9IHNhdmVkX3BpZCAmJiBzdGF0KGZuYW1lLCAmZmluZm8pID09IDApIHsKLSAgICAgIC8qIFVTUjEgYW5kIEhVUCBjYWxsIHRoaXMgb24gZWFjaCByZXN0YXJ0LgotICAgICAgICogT25seSB3YXJuIG9uIGZpcnN0IHRpbWUgdGhyb3VnaCBmb3IgdGhpcyBwaWQuCi0gICAgICAgKgotICAgICAgICogWFhYOiBDb3VsZCBqdXN0IHdyaXRlIGZpcnN0IHRpbWUgdGhyb3VnaCB0b28sIGFsdGhvdWdoCi0gICAgICAgKiAgICAgIHRoYXQgbWF5IHNjcmV3IHVwIHNjcmlwdHMgd3JpdHRlbiB0byBkbyBzb21ldGhpbmcKLSAgICAgICAqICAgICAgYmFzZWQgb24gdGhlIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIHBpZCBmaWxlLgotICAgICAgICovCi0gICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLCBOVUxMLAotCQkgICBhcF9wc3ByaW50ZihwLAotCQkJICAgICAgICJwaWQgZmlsZSAlcyBvdmVyd3JpdHRlbiAtLSBVbmNsZWFuIHNodXRkb3duIG9mIHByZXZpb3VzIEFwYWNoZSBydW4/IiwKLQkJCSAgICAgICBmbmFtZSkKLQkJICAgKTsKLSAgICB9Ci0KLSAgICBpZighKHBpZF9maWxlID0gZm9wZW4oZm5hbWUsICJ3IikpKSB7Ci0JcGVycm9yKCJmb3BlbiIpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjb3VsZCBub3QgbG9nIHBpZCB0byBmaWxlICVzXG4iLAotCQlhcF9zZXJ2ZXJfYXJndjAsIGZuYW1lKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgZnByaW50ZihwaWRfZmlsZSwgIiVsZFxuIiwgKGxvbmcpbXlwaWQpOwotICAgIGZjbG9zZShwaWRfZmlsZSk7Ci0gICAgc2F2ZWRfcGlkID0gbXlwaWQ7Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfbG9nX2Vycm9yX29sZChjb25zdCBjaGFyICplcnIsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgcywgIiVzIiwgZXJyKTsKLX0KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9sb2dfdW5peGVycihjb25zdCBjaGFyICpyb3V0aW5lLCBjb25zdCBjaGFyICpmaWxlLAotCQkJICAgICAgY29uc3QgY2hhciAqbXNnLCBzZXJ2ZXJfcmVjICpzKQotewotICAgIGFwX2xvZ19lcnJvcihmaWxlLCAwLCBBUExPR19FUlIsIHMsICIlcyIsIG1zZyk7Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfbG9nX3ByaW50Zihjb25zdCBzZXJ2ZXJfcmVjICpzLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgICB2YV9saXN0IGFyZ3M7Ci0gICAgCi0gICAgdmFfc3RhcnQoYXJncywgZm10KTsKLSAgICBsb2dfZXJyb3JfY29yZShBUExPR19NQVJLLCBBUExPR19FUlIsIHMsIE5VTEwsIGZtdCwgYXJncyk7Ci0gICAgdmFfZW5kKGFyZ3MpOwotfQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX2xvZ19yZWFzb24oY29uc3QgY2hhciAqcmVhc29uLCBjb25zdCBjaGFyICpmaWxlLCByZXF1ZXN0X3JlYyAqcikgCi17Ci0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgci0+c2VydmVyLAotCQkiYWNjZXNzIHRvICVzIGZhaWxlZCBmb3IgJXMsIHJlYXNvbjogJXMiLAotCQlmaWxlLAotCQlhcF9nZXRfcmVtb3RlX2hvc3Qoci0+Y29ubmVjdGlvbiwgci0+cGVyX2Rpcl9jb25maWcsIFJFTU9URV9OQU1FKSwKLQkJcmVhc29uKTsKLX0KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9sb2dfYXNzZXJ0KGNvbnN0IGNoYXIgKnN6RXhwLCBjb25zdCBjaGFyICpzekZpbGUsIGludCBuTGluZSkKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlslc10gZmlsZSAlcywgbGluZSAlZCwgYXNzZXJ0aW9uIFwiJXNcIiBmYWlsZWRcbiIsCi0JICAgIGFwX2dldF90aW1lKCksIHN6RmlsZSwgbkxpbmUsIHN6RXhwKTsKLSNpZm5kZWYgV0lOMzIKLSAgICAvKiB1bml4IGFzc2VydCBkb2VzIGFuIGFib3J0IGxlYWRpbmcgdG8gYSBjb3JlIGR1bXAgKi8KLSAgICBhYm9ydCgpOwotI2Vsc2UKLSAgICBleGl0KDEpOwotI2VuZGlmCi19Ci0KLS8qIHBpcGVkIGxvZyBzdXBwb3J0ICovCi0KLSNpZm5kZWYgTk9fUkVMSUFCTEVfUElQRURfTE9HUwotLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwotc3RhdGljIHZvaWQgcGlwZWRfbG9nX21haW50ZW5hbmNlKGludCByZWFzb24sIHZvaWQgKmRhdGEsIGFwX3dhaXRfdCBzdGF0dXMpOwotCi1zdGF0aWMgaW50IHBpcGVkX2xvZ19zcGF3bihwaXBlZF9sb2cgKnBsKQotewotICAgIGludCBwaWQ7Ci0KLSAgICBhcF9ibG9ja19hbGFybXMoKTsKLSAgICBwaWQgPSBmb3JrKCk7Ci0gICAgaWYgKHBpZCA9PSAwKSB7Ci0JLyogWFhYOiB0aGlzIG5lZWRzIHBvcnRpbmcgdG8gT1MyIGFuZCBXSU4zMiAqLwotCS8qIFhYWDogbmVlZCB0byBjaGVjayB3aGF0IG9wZW4gZmRzIHRoZSBsb2dnZXIgaXMgYWN0dWFsbHkgcGFzc2VkLAotCSAqIFhYWDogYW5kIENHSXMgZm9yIHRoYXQgbWF0dGVyIC4uLiBjbGVhbnVwX2Zvcl9leGVjICpzaG91bGQqCi0JICogWFhYOiBjbG9zZSBhbGwgdGhlIHJlbGV2YW50IHN0dWZmLCBidXQgaGV5LCBpdCBjb3VsZCBiZSBicm9rZW4uICovCi0JUkFJU0VfU0lHU1RPUChQSVBFRF9MT0dfU1BBV04pOwotCS8qIHdlJ3JlIG5vdyBpbiB0aGUgY2hpbGQgKi8KLQljbG9zZShTVERJTl9GSUxFTk8pOwotCWR1cDIocGwtPmZkc1swXSwgU1RESU5fRklMRU5PKTsKLQotCWFwX2NsZWFudXBfZm9yX2V4ZWMoKTsKLQlzaWduYWwoU0lHQ0hMRCwgU0lHX0RGTCk7CS8qIGZvciBIUFVYICovCi0Jc2lnbmFsKFNJR0hVUCwgU0lHX0lHTik7Ci0JZXhlY2woU0hFTExfUEFUSCwgU0hFTExfUEFUSCwgIi1jIiwgcGwtPnByb2dyYW0sIE5VTEwpOwotCWZwcmludGYoc3RkZXJyLAotCSAgICAicGlwZWRfbG9nX3NwYXduOiB1bmFibGUgdG8gZXhlYyAlcyAtYyAnJXMnOiAlc1xuIiwKLQkgICAgU0hFTExfUEFUSCwgcGwtPnByb2dyYW0sIHN0cmVycm9yIChlcnJubykpOwotCWV4aXQoMSk7Ci0gICAgfQotICAgIGlmIChwaWQgPT0gLTEpIHsKLQlmcHJpbnRmKHN0ZGVyciwKLQkgICAgInBpcGVkX2xvZ19zcGF3bjogdW5hYmxlIHRvIGZvcmsoKTogJXNcbiIsIHN0cmVycm9yIChlcnJubykpOwotCWFwX3VuYmxvY2tfYWxhcm1zKCk7Ci0JcmV0dXJuIC0xOwotICAgIH0KLSAgICBhcF91bmJsb2NrX2FsYXJtcygpOwotICAgIHBsLT5waWQgPSBwaWQ7Ci0gICAgYXBfcmVnaXN0ZXJfb3RoZXJfY2hpbGQocGlkLCBwaXBlZF9sb2dfbWFpbnRlbmFuY2UsIHBsLCBwbC0+ZmRzWzFdKTsKLSAgICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdm9pZCBwaXBlZF9sb2dfbWFpbnRlbmFuY2UoaW50IHJlYXNvbiwgdm9pZCAqZGF0YSwgYXBfd2FpdF90IHN0YXR1cykKLXsKLSAgICBwaXBlZF9sb2cgKnBsID0gZGF0YTsKLQotICAgIHN3aXRjaCAocmVhc29uKSB7Ci0gICAgY2FzZSBPQ19SRUFTT05fREVBVEg6Ci0gICAgY2FzZSBPQ19SRUFTT05fTE9TVDoKLQlwbC0+cGlkID0gLTE7Ci0JYXBfdW5yZWdpc3Rlcl9vdGhlcl9jaGlsZChwbCk7Ci0JaWYgKHBsLT5wcm9ncmFtID09IE5VTEwpIHsKLQkgICAgLyogZHVyaW5nIGEgcmVzdGFydCAqLwotCSAgICBicmVhazsKLQl9Ci0JaWYgKHBpcGVkX2xvZ19zcGF3bihwbCkgPT0gLTEpIHsKLQkgICAgLyogd2hhdCBjYW4gd2UgZG8/ICBUaGlzIGNvdWxkIGJlIHRoZSBlcnJvciBsb2cgd2UncmUgaGF2aW5nCi0JICAgICAqIHByb2JsZW1zIG9wZW5pbmcgdXAuLi4gKi8KLQkgICAgZnByaW50ZihzdGRlcnIsCi0JCSJwaXBlZF9sb2dfbWFpbnRlbmFuY2U6IHVuYWJsZSB0byByZXNwYXduICclcyc6ICVzXG4iLAotCQlwbC0+cHJvZ3JhbSwgc3RyZXJyb3IoZXJybm8pKTsKLQl9Ci0JYnJlYWs7Ci0gICAgCi0gICAgY2FzZSBPQ19SRUFTT05fVU5XUklUQUJMRToKLQlpZiAocGwtPnBpZCAhPSAtMSkgewotCSAgICBraWxsKHBsLT5waWQsIFNJR1RFUk0pOwotCX0KLQlicmVhazsKLSAgICAKLSAgICBjYXNlIE9DX1JFQVNPTl9SRVNUQVJUOgotCXBsLT5wcm9ncmFtID0gTlVMTDsKLQlpZiAocGwtPnBpZCAhPSAtMSkgewotCSAgICBraWxsKHBsLT5waWQsIFNJR1RFUk0pOwotCX0KLQlicmVhazsKLQotICAgIGNhc2UgT0NfUkVBU09OX1VOUkVHSVNURVI6Ci0JYnJlYWs7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkIHBpcGVkX2xvZ19jbGVhbnVwKHZvaWQgKmRhdGEpCi17Ci0gICAgcGlwZWRfbG9nICpwbCA9IGRhdGE7Ci0KLSAgICBpZiAocGwtPnBpZCAhPSAtMSkgewotCWtpbGwocGwtPnBpZCwgU0lHVEVSTSk7Ci0gICAgfQotICAgIGFwX3VucmVnaXN0ZXJfb3RoZXJfY2hpbGQocGwpOwotICAgIGNsb3NlKHBsLT5mZHNbMF0pOwotICAgIGNsb3NlKHBsLT5mZHNbMV0pOwotfQotCi0KLXN0YXRpYyB2b2lkIHBpcGVkX2xvZ19jbGVhbnVwX2Zvcl9leGVjKHZvaWQgKmRhdGEpCi17Ci0gICAgcGlwZWRfbG9nICpwbCA9IGRhdGE7Ci0KLSAgICBjbG9zZShwbC0+ZmRzWzBdKTsKLSAgICBjbG9zZShwbC0+ZmRzWzFdKTsKLX0KLQotCi1BUElfRVhQT1JUKHBpcGVkX2xvZyAqKSBhcF9vcGVuX3BpcGVkX2xvZyhwb29sICpwLCBjb25zdCBjaGFyICpwcm9ncmFtKQotewotICAgIHBpcGVkX2xvZyAqcGw7Ci0KLSAgICBwbCA9IGFwX3BhbGxvYyhwLCBzaXplb2YgKCpwbCkpOwotICAgIHBsLT5wID0gcDsKLSAgICBwbC0+cHJvZ3JhbSA9IGFwX3BzdHJkdXAocCwgcHJvZ3JhbSk7Ci0gICAgcGwtPnBpZCA9IC0xOwotICAgIGFwX2Jsb2NrX2FsYXJtcyAoKTsKLSAgICBpZiAocGlwZShwbC0+ZmRzKSA9PSAtMSkgewotCWludCBzYXZlX2Vycm5vID0gZXJybm87Ci0JYXBfdW5ibG9ja19hbGFybXMoKTsKLQllcnJubyA9IHNhdmVfZXJybm87Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGFwX3JlZ2lzdGVyX2NsZWFudXAocCwgcGwsIHBpcGVkX2xvZ19jbGVhbnVwLCBwaXBlZF9sb2dfY2xlYW51cF9mb3JfZXhlYyk7Ci0gICAgaWYgKHBpcGVkX2xvZ19zcGF3bihwbCkgPT0gLTEpIHsKLQlpbnQgc2F2ZV9lcnJubyA9IGVycm5vOwotCWFwX2tpbGxfY2xlYW51cChwLCBwbCwgcGlwZWRfbG9nX2NsZWFudXApOwotCWNsb3NlKHBsLT5mZHNbMF0pOwotCWNsb3NlKHBsLT5mZHNbMV0pOwotCWFwX3VuYmxvY2tfYWxhcm1zKCk7Ci0JZXJybm8gPSBzYXZlX2Vycm5vOwotCXJldHVybiBOVUxMOwotICAgIH0KLSAgICBhcF91bmJsb2NrX2FsYXJtcygpOwotICAgIHJldHVybiBwbDsKLX0KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9jbG9zZV9waXBlZF9sb2cocGlwZWRfbG9nICpwbCkKLXsKLSAgICBhcF9ibG9ja19hbGFybXMoKTsKLSAgICBwaXBlZF9sb2dfY2xlYW51cChwbCk7Ci0gICAgYXBfa2lsbF9jbGVhbnVwKHBsLT5wLCBwbCwgcGlwZWRfbG9nX2NsZWFudXApOwotICAgIGFwX3VuYmxvY2tfYWxhcm1zKCk7Ci19Ci0KLSNlbHNlCi1zdGF0aWMgaW50IHBpcGVkX2xvZ19jaGlsZCh2b2lkICpjbWQsIGNoaWxkX2luZm8gKnBpbmZvKQotewotICAgIC8qIENoaWxkIHByb2Nlc3MgY29kZSBmb3IgJ1RyYW5zZmVyTG9nICJ8Li4uIic7Ci0gICAgICogbWF5IHdhbnQgYSBjb21tb24gZnJhbWV3b3JrIGZvciB0aGlzLCBzaW5jZSBJIGV4cGVjdCBpdCB3aWxsCi0gICAgICogYmUgY29tbW9uIGZvciBvdGhlciBmb28tbG9nZ2VycyB0byB3YW50IHRoaXMgc29ydCBvZiB0aGluZy4uLgotICAgICAqLwotICAgIGludCBjaGlsZF9waWQgPSAxOwotCi0gICAgYXBfY2xlYW51cF9mb3JfZXhlYygpOwotI2lmZGVmIFNJR0hVUAotICAgIHNpZ25hbChTSUdIVVAsIFNJR19JR04pOwotI2VuZGlmCi0jaWYgZGVmaW5lZChXSU4zMikKLSAgICBjaGlsZF9waWQgPSBzcGF3bmwoX1BfTk9XQUlULCBTSEVMTF9QQVRILCBTSEVMTF9QQVRILCAiL2MiLCAoY2hhciAqKWNtZCwgTlVMTCk7Ci0gICAgcmV0dXJuKGNoaWxkX3BpZCk7Ci0jZWxpZiBkZWZpbmVkKE9TMikKLSAgICAvKiBGb3IgT1MvMiB3ZSBuZWVkIHRvIHVzZSBhICcvJyBhbmQgc3Bhd24gdGhlIGNoaWxkIHJhdGhlciB0aGFuIGV4ZWMgYXMKLSAgICAgKiB3ZSBoYXZlbid0IGZvcmtlZCAqLwotICAgIGNoaWxkX3BpZCA9IHNwYXdubChQX05PV0FJVCwgU0hFTExfUEFUSCwgU0hFTExfUEFUSCwgIi9jIiwgKGNoYXIgKiljbWQsIE5VTEwpOwotICAgIHJldHVybihjaGlsZF9waWQpOwotI2Vsc2UKLSAgICBleGVjbCAoU0hFTExfUEFUSCwgU0hFTExfUEFUSCwgIi1jIiwgKGNoYXIgKiljbWQsIE5VTEwpOwotI2VuZGlmCi0gICAgcGVycm9yKCJleGVjIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICJFeGVjIG9mIHNoZWxsIGZvciBsb2dnaW5nIGZhaWxlZCEhIVxuIik7Ci0gICAgcmV0dXJuKGNoaWxkX3BpZCk7Ci19Ci0KLQotQVBJX0VYUE9SVChwaXBlZF9sb2cgKikgYXBfb3Blbl9waXBlZF9sb2cocG9vbCAqcCwgY29uc3QgY2hhciAqcHJvZ3JhbSkKLXsKLSAgICBwaXBlZF9sb2cgKnBsOwotICAgIEZJTEUgKmR1bW15OwotI2lmZGVmIFRQRgotICAgIFRQRl9GT1JLX0NISUxEIGNsZDsKLSAgICBjbGQuZmlsZW5hbWUgPSAoY2hhciAqKXByb2dyYW07Ci0gICAgY2xkLnN1YnByb2Nlc3NfZW52ID0gTlVMTDsKLSAgICBjbGQucHJvZ190eXBlID0gRk9SS19OQU1FOwotCi0gICAgaWYgKCFhcF9zcGF3bl9jaGlsZCAocCwgTlVMTCwgJmNsZCwKLSAgICAgIGtpbGxfYWZ0ZXJfdGltZW91dCwgJmR1bW15LCBOVUxMLCBOVUxMKSl7Ci0jZWxzZQotICAgIGlmICghYXBfc3Bhd25fY2hpbGQocCwgcGlwZWRfbG9nX2NoaWxkLCAodm9pZCAqKXByb2dyYW0sCi0JCQlraWxsX2FmdGVyX3RpbWVvdXQsICZkdW1teSwgTlVMTCwgTlVMTCkpIHsKLSNlbmRpZiAvKiBUUEYgKi8KLQlwZXJyb3IoImFwX3NwYXduX2NoaWxkIik7Ci0JZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBmb3JrIGNoaWxkIGZvciBwaXBlZCBsb2cgcHJvY2Vzc1xuIik7Ci0JZXhpdCAoMSk7Ci0gICAgfQotICAgIHBsID0gYXBfcGFsbG9jKHAsIHNpemVvZiAoKnBsKSk7Ci0gICAgcGwtPnAgPSBwOwotICAgIHBsLT53cml0ZV9mID0gZHVtbXk7Ci0KLSAgICByZXR1cm4gcGw7Ci19Ci0KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9jbG9zZV9waXBlZF9sb2cocGlwZWRfbG9nICpwbCkKLXsKLSAgICBhcF9wZmNsb3NlKHBsLT5wLCBwbC0+d3JpdGVfZik7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZlci9tYWluLmMgYi9zZXJ2ZXIvbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmQzNzJiLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NjY5ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIGh0dHBkLmM6IHNpbXBsZSBodHRwIGRhZW1vbiBmb3IgYW5zd2VyaW5nIFdXVyBmaWxlIHJlcXVlc3RzCi0gKgotICogCi0gKiAwMy0yMS05MyAgUm9iIE1jQ29vbCB3cm90ZSBvcmlnaW5hbCBjb2RlICh1cCB0byBOQ1NBIEhUVFBkIDEuMykKLSAqIAotICogMDMtMDYtOTUgIGJsb25nCi0gKiAgY2hhbmdlZCBzZXJ2ZXIgbnVtYmVyIGZvciBjaGlsZC1hbG9uZSBwcm9jZXNzZXMgdG8gMCBhbmQgY2hhbmdlZCBuYW1lCi0gKiAgIG9mIHByb2Nlc3NlcwotICoKLSAqIDAzLTEwLTk1ICBibG9uZwotICogICAgICBBZGRlZCBudW1lcm91cyBzcGVlZCBoYWNrcyBwcm9wb3NlZCBieSBSb2JlcnQgUy4gVGhhdSAocnN0QGFpLm1pdC5lZHUpIAotICogICAgICBpbmNsdWRpbmcgc2V0IGdyb3VwIGJlZm9yZSBmb3JrLCBhbmQgY2FsbCBnZXR0aW1lIGJlZm9yZSB0byBmb3JrCi0gKiAgICAgIHRvIHNldCB1cCBsaWJyYXJpZXMuCi0gKgotICogMDQtMTQtOTUgIHJzdCAvIHJoCi0gKiAgICAgIEJyYW5kb24ncyBjb2RlIHNuYXJmZWQgZnJvbSBOQ1NBIDEuNCwgYnV0IHRpbmtlcmVkIHRvIHdvcmsgd2l0aCB0aGUKLSAqICAgICAgQXBhY2hlIHNlcnZlciwgYW5kIGFsc28gdG8gaGF2ZSBjaGlsZCBwcm9jZXNzZXMgZG8gYWNjZXB0KCkgZGlyZWN0bHkuCi0gKgotICogQXByaWwtSnVseSAnOTUgcnN0Ci0gKiAgICAgIEV4dGVuc2l2ZSByZXdvcmsgZm9yIEFwYWNoZS4KLSAqLwotCi0jaWZuZGVmIFNIQVJFRF9DT1JFX0JPT1RTVFJBUAotI2lmbmRlZiBTSEFSRURfQ09SRV9USUVTVEFUSUMKLQotI2lmZGVmIFNIQVJFRF9DT1JFCi0jZGVmaW5lIFJFQUxNQUlOIGFwX21haW4KLWludCBhcF9tYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pOwotI2Vsc2UKLSNkZWZpbmUgUkVBTE1BSU4gbWFpbgotI2VuZGlmCi0KLSNkZWZpbmUgQ09SRV9QUklWQVRFCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIJLyogZm9yIHJlYWRfY29uZmlnICovCi0jaW5jbHVkZSAiaHR0cF9wcm90b2NvbC5oIgkvKiBmb3IgcmVhZF9yZXF1ZXN0ICovCi0jaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCS8qIGZvciBwcm9jZXNzX3JlcXVlc3QgKi8KLSNpbmNsdWRlICJodHRwX2NvbmZfZ2xvYmFscy5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgkJLyogZm9yIGdldF9yZW1vdGVfaG9zdCAqLwotI2luY2x1ZGUgImh0dHBfdmhvc3QuaCIKLSNpbmNsdWRlICJ1dGlsX3NjcmlwdC5oIgkvKiB0byBmb3JjZSB1dGlsX3NjcmlwdC5jIGxpbmtpbmcgKi8KLSNpbmNsdWRlICJ1dGlsX3VyaS5oIgotI2luY2x1ZGUgInNjb3JlYm9hcmQuaCIKLSNpbmNsdWRlICJtdWx0aXRocmVhZC5oIgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaWZkZWYgVVNFX1NITUdFVF9TQ09SRUJPQVJECi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL2lwYy5oPgotI2luY2x1ZGUgPHN5cy9zaG0uaD4KLSNlbmRpZgotI2lmZGVmIFNlY3VyZVdhcmUKLSNpbmNsdWRlIDxzeXMvc2VjdXJpdHkuaD4KLSNpbmNsdWRlIDxzeXMvYXVkaXQuaD4KLSNpbmNsdWRlIDxwcm90Lmg+Ci0jZW5kaWYKLSNpZmRlZiBXSU4zMgotI2luY2x1ZGUgIi4uL29zL3dpbjMyL2dldG9wdC5oIgotI2VsaWYgIWRlZmluZWQoQkVPUykgJiYgIWRlZmluZWQoVFBGKQotI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQlNUUklOR19ICi0jaW5jbHVkZSA8YnN0cmluZy5oPgkJLyogZm9yIElSSVgsIEZEX1NFVCBjYWxscyBiemVybygpICovCi0jZW5kaWYKLQotI2lmZGVmIE1VTFRJVEhSRUFECi0vKiBzcGVjaWFsIGRlYnVnIHN0dWZmIC0tIFBDUyAqLwotCi0vKiBTZXQgdGhpcyBub24temVybyBpZiB5b3UgYXJlIHByZXBhcmVkIHRvIHB1dCB1cCB3aXRoIG1vcmUgdGhhbiBvbmUgbG9nIGVudHJ5IHBlciBzZWNvbmQgKi8KLSNkZWZpbmUgU0VWRVJFTFlfVkVSQk9TRQkgICAgMAotCi0gIC8qIEFQRDEoKSB0byBBUEQ1KCkgYXJlIG1hY3JvcyB0byBoZWxwIHVzIGRlYnVnLiBUaGV5IGNhbiBlaXRoZXIKLSAgICogbG9nIHRvIHRoZSBzY3JlZW4gb3IgdGhlIGVycm9yX2xvZyBmaWxlLiBJbiByZWxlYXNlIGJ1aWxkcywgdGhlc2UKLSAgICogbWFjcm9zIGRvIG5vdGhpbmcuIEluIGRlYnVnIGJ1aWxkcywgdGhleSBzZW5kIG1lc3NhZ2VzIGF0IHByaW9yaXR5Ci0gICAqICJkZWJ1ZyIgdG8gdGhlIGVycm9yIGxvZyBmaWxlLCBvciBpZiBERUJVR19UT19DT05TT0xFIGlzIGRlZmluZWQsCi0gICAqIHRvIHRoZSBjb25zb2xlLgotICAgKi8KLQotIyBpZmRlZiBfREVCVUcKLSMgIGlmbmRlZiBERUJVR19UT19DT05TT0xFCi0jICAgZGVmaW5lIEFQRDEoYSkgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfREVCVUd8QVBMT0dfTk9FUlJOTyxzZXJ2ZXJfY29uZixhKQotIyAgIGRlZmluZSBBUEQyKGEsYikgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfREVCVUd8QVBMT0dfTk9FUlJOTyxzZXJ2ZXJfY29uZixhLGIpCi0jICAgZGVmaW5lIEFQRDMoYSxiLGMpIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLEFQTE9HX0RFQlVHfEFQTE9HX05PRVJSTk8sc2VydmVyX2NvbmYsYSxiLGMpCi0jICAgZGVmaW5lIEFQRDQoYSxiLGMsZCkgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfREVCVUd8QVBMT0dfTk9FUlJOTyxzZXJ2ZXJfY29uZixhLGIsYyxkKQotIyAgIGRlZmluZSBBUEQ1KGEsYixjLGQsZSkgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfREVCVUd8QVBMT0dfTk9FUlJOTyxzZXJ2ZXJfY29uZixhLGIsYyxkLGUpCi0jICBlbHNlCi0jICAgZGVmaW5lIEFQRDEoYSkgcHJpbnRmKCIlc1xuIixhKQotIyAgIGRlZmluZSBBUEQyKGEsYikgZG8geyBwcmludGYoYSxiKTtwdXRjaGFyKCdcbicpOyB9IHdoaWxlKDApOwotIyAgIGRlZmluZSBBUEQzKGEsYixjKSBkbyB7IHByaW50ZihhLGIsYyk7cHV0Y2hhcignXG4nKTsgfSB3aGlsZSgwKTsKLSMgICBkZWZpbmUgQVBENChhLGIsYyxkKSBkbyB7IHByaW50ZihhLGIsYyxkKTtwdXRjaGFyKCdcbicpOyB9IHdoaWxlKDApOwotIyAgIGRlZmluZSBBUEQ1KGEsYixjLGQsZSkgZG8geyBwcmludGYoYSxiLGMsZCxlKTtwdXRjaGFyKCdcbicpOyB9IHdoaWxlKDApOwotIyAgZW5kaWYKLSMgZWxzZSAvKiAhX0RFQlVHICovCi0jICBkZWZpbmUgQVBEMShhKSAKLSMgIGRlZmluZSBBUEQyKGEsYikgCi0jICBkZWZpbmUgQVBEMyhhLGIsYykgCi0jICBkZWZpbmUgQVBENChhLGIsYyxkKSAKLSMgIGRlZmluZSBBUEQ1KGEsYixjLGQsZSkgCi0jIGVuZGlmIC8qIF9ERUJVRyAqLwotI2VuZGlmIC8qIE1VTFRJVEhSRUFEICovCi0KLS8qIFRoaXMgbmV4dCBmdW5jdGlvbiBpcyBuZXZlciB1c2VkLiBJdCBpcyBoZXJlIHRvIGVuc3VyZSB0aGF0IGlmIHdlCi0gKiBtYWtlIGFsbCB0aGUgbW9kdWxlcyBpbnRvIHNoYXJlZCBsaWJyYXJpZXMgdGhhdCBjb3JlIGh0dHBkIHN0aWxsCi0gKiBpbmNsdWRlcyB0aGUgZnVsbCBBcGFjaGUgQVBJLiBXaXRob3V0IHRoaXMgZnVuY3Rpb24gdGhlIG9iamVjdHMgaW4KLSAqIG1haW4vdXRpbF9zY3JpcHQuYyB3b3VsZCBub3QgYmUgbGlua2VkIGludG8gYSBtaW5pbWFsIGh0dHBkLgotICogQW5kIHRoZSBleHRyYSBwcm90b3R5cGUgaXMgdG8gbWFrZSBnY2MgLVdtaXNzaW5nLXByb3RvdHlwZXMgcXVpZXQuCi0gKi8KLWV4dGVybiB2b2lkIGFwX2ZvcmNlX2xpYnJhcnlfbG9hZGluZyh2b2lkKTsKLXZvaWQgYXBfZm9yY2VfbGlicmFyeV9sb2FkaW5nKHZvaWQpIHsKLSAgICBhcF9hZGRfY2dpX3ZhcnMoTlVMTCk7Ci19Ci0KLSNpbmNsdWRlICJleHBsYWluLmgiCi0KLSNpZiAhZGVmaW5lZChtYXgpCi0jZGVmaW5lIG1heChhLGIpICAgICAgICAoYSA+IGIgPyBhIDogYikKLSNlbmRpZgotCi0jaWZkZWYgV0lOMzIKLSNpbmNsdWRlICIuLi9vcy93aW4zMi9zZXJ2aWNlLmgiCi0jaW5jbHVkZSAiLi4vb3Mvd2luMzIvcmVnaXN0cnkuaCIKLSNkZWZpbmUgREVGQVVMVFNFUlZJQ0VOQU1FICJBcGFjaGUiCi0jZGVmaW5lIFBBVEhTRVBBUkFUT1IgJ1xcJwotI2Vsc2UKLSNkZWZpbmUgUEFUSFNFUEFSQVRPUiAnLycKLSNlbmRpZgotCi0KLSNpZmRlZiBNSU5UCi1sb25nIF9zdGtzaXplID0gMzI3Njg7Ci0jZW5kaWYKLQotI2lmZGVmIFVTRV9PUzJfU0NPUkVCT0FSRAotICAgIC8qIEFkZCBNTUFQIHN0eWxlIGZ1bmN0aW9uYWxpdHkgdG8gT1MvMiAqLwotI2RlZmluZSBJTkNMX0RPU01FTU1HUgotI2RlZmluZSBJTkNMX0RPU0VYQ0VQVElPTlMKLSNkZWZpbmUgSU5DTF9ET1NTRU1BUEhPUkVTCi0jaW5jbHVkZSA8b3MyLmg+Ci0jaW5jbHVkZSA8dW1hbGxvYy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci1jYWRkcl90IGNyZWF0ZV9zaGFyZWRfaGVhcChjb25zdCBjaGFyICosIHNpemVfdCk7Ci1jYWRkcl90IGdldF9zaGFyZWRfaGVhcChjb25zdCBjaGFyICopOwotI2VuZGlmCi0KLURFRl9FeHBsYWluCi0KLS8qIERlZmluaW5nIEdQUk9GIHdoZW4gY29tcGlsaW5nIHVzZXMgdGhlIG1vbmNvbnRyb2woKSBmdW5jdGlvbiB0bwotICogZGlzYWJsZSBncHJvZiBwcm9maWxpbmcgaW4gdGhlIHBhcmVudCwgYW5kIGVuYWJsZSBpdCBvbmx5IGZvcgotICogcmVxdWVzdCBwcm9jZXNzaW5nIGluIGNoaWxkcmVuIChvciBpbiBvbmVfcHJvY2VzcyBtb2RlKS4gIEl0J3MKLSAqIGFic29sdXRlbHkgcmVxdWlyZWQgdG8gZ2V0IHVzZWZ1bCBncHJvZiByZXN1bHRzIHVuZGVyIGxpbnV4Ci0gKiBiZWNhdXNlIHRoZSBwcm9maWxlIGl0aW1lcnMgYW5kIHN1Y2ggYXJlIGRpc2FibGVkIGFjcm9zcyBhCi0gKiBmb3JrKCkuICBJdCdzIHByb2JhYmx5IHVzZWZ1bCBlbHNld2hlcmUgYXMgd2VsbC4KLSAqLwotI2lmZGVmIEdQUk9GCi1leHRlcm4gdm9pZCBtb25jb250cm9sKGludCk7Ci0jZGVmaW5lIE1PTkNPTlRST0woeCkgbW9uY29udHJvbCh4KQotI2Vsc2UKLSNkZWZpbmUgTU9OQ09OVFJPTCh4KQotI2VuZGlmCi0KLSNpZm5kZWYgTVVMVElUSFJFQUQKLS8qIHRoaXMganVzdCBuZWVkIHRvIGJlIGFueXRoaW5nIG5vbi1OVUxMICovCi12b2lkICphcF9kdW1teV9tdXRleCA9ICZhcF9kdW1teV9tdXRleDsKLSNlbmRpZgotCi0vKgotICogQWN0dWFsIGRlZmluaXRpb25zIG9mIGNvbmZpZyBnbG9iYWxzLi4uIGhlcmUgYmVjYXVzZSB0aGlzIGlzCi0gKiBmb3IgdGhlIG1vc3QgcGFydCB0aGUgb25seSBjb2RlIHRoYXQgYWN0cyBvbiAnZW0uICAoSG1tbS4uLiBtb2RfbWFpbi5jPykKLSAqLwotCi1pbnQgYXBfc3RhbmRhbG9uZT0wOwotaW50IGFwX2NvbmZpZ3Rlc3Rvbmx5PTA7Ci1pbnQgYXBfZG9jcm9vdGNoZWNrPTE7Ci11aWRfdCBhcF91c2VyX2lkPTA7Ci1jaGFyICphcF91c2VyX25hbWU9TlVMTDsKLWdpZF90IGFwX2dyb3VwX2lkPTA7Ci0jaWZkZWYgTVVMVElQTEVfR1JPVVBTCi1naWRfdCBncm91cF9pZF9saXN0W05HUk9VUFNfTUFYXTsKLSNlbmRpZgotaW50IGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQ9MDsKLWludCBhcF90aHJlYWRzX3Blcl9jaGlsZD0wOwotaW50IGFwX2V4Y2Vzc19yZXF1ZXN0c19wZXJfY2hpbGQ9MDsKLWNoYXIgKmFwX3BpZF9mbmFtZT1OVUxMOwotY2hhciAqYXBfc2NvcmVib2FyZF9mbmFtZT1OVUxMOwotY2hhciAqYXBfbG9ja19mbmFtZTsKLWNoYXIgKmFwX3NlcnZlcl9hcmd2MD1OVUxMOwotc3RydWN0IGluX2FkZHIgYXBfYmluZF9hZGRyZXNzOwotaW50IGFwX2RhZW1vbnNfdG9fc3RhcnQ9MDsKLWludCBhcF9kYWVtb25zX21pbl9mcmVlPTA7Ci1pbnQgYXBfZGFlbW9uc19tYXhfZnJlZT0wOwotaW50IGFwX2RhZW1vbnNfbGltaXQ9MDsKLXRpbWVfdCBhcF9yZXN0YXJ0X3RpbWU9MDsKLWludCBhcF9zdWV4ZWNfZW5hYmxlZCA9IDA7Ci1pbnQgYXBfbGlzdGVuYmFja2xvZzsKLWludCBhcF9kdW1wX3NldHRpbmdzID0gMDsKLUFQSV9WQVJfRVhQT1JUIGludCBhcF9leHRlbmRlZF9zdGF0dXMgPSAwOwotCi0vKgotICogVGhlIG1heCBjaGlsZCBzbG90IGV2ZXIgYXNzaWduZWQsIHByZXNlcnZlZCBhY3Jvc3MgcmVzdGFydHMuICBOZWNlc3NhcnkKLSAqIHRvIGRlYWwgd2l0aCBNYXhDbGllbnRzIGNoYW5nZXMgYWNyb3NzIFNJR1VTUjEgcmVzdGFydHMuICBXZSB1c2UgdGhpcwotICogdmFsdWUgdG8gb3B0aW1pemUgcm91dGluZXMgdGhhdCBoYXZlIHRvIHNjYW4gdGhlIGVudGlyZSBzY29yZWJvYXJkLgotICovCi1zdGF0aWMgaW50IG1heF9kYWVtb25zX2xpbWl0ID0gLTE7Ci0KLS8qCi0gKiBEdXJpbmcgY29uZmlnIHRpbWUsIGxpc3RlbmVycyBpcyB0cmVhdGVkIGFzIGEgTlVMTC10ZXJtaW5hdGVkIGxpc3QuCi0gKiBjaGlsZF9tYWluIHByZXZpb3VzbHkgd291bGQgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdCBlYWNoIHRpbWUKLSAqIHRocm91Z2ggdGhlIGxvb3AsIHNvIGEgc29ja2V0IGVhcmx5IG9uIGluIHRoZSBsaXN0IGNvdWxkIGVhc2lseSBzdGFydmUgb3V0Ci0gKiBzb2NrZXRzIGxhdGVyIG9uIGluIHRoZSBsaXN0LiAgVGhlIHNvbHV0aW9uIGlzIHRvIHN0YXJ0IGF0IHRoZSBsaXN0ZW5lcgotICogYWZ0ZXIgdGhlIGxhc3Qgb25lIHByb2Nlc3NlZC4gIEJ1dCB0byBkbyB0aGF0IGZhc3QvZWFzaWx5IGluIGNoaWxkX21haW4gaXQncwotICogd2F5IG1vcmUgY29udmVuaWVudCBmb3IgbGlzdGVuZXJzIHRvIGJlIGEgcmluZyB0aGF0IGxvb3BzIGJhY2sgb24gaXRzZWxmLgotICogVGhlIHJvdXRpbmUgc2V0dXBfbGlzdGVuZXJzKCkgaXMgY2FsbGVkIGFmdGVyIGNvbmZpZyB0aW1lIHRvIGJvdGggb3BlbiB1cAotICogdGhlIHNvY2tldHMgYW5kIHRvIHR1cm4gdGhlIE5VTEwtdGVybWluYXRlZCBsaXN0IGludG8gYSByaW5nIHRoYXQgbG9vcHMgYmFjawotICogb24gaXRzZWxmLgotICoKLSAqIGhlYWRfbGlzdGVuZXIgaXMgdXNlZCBieSBlYWNoIGNoaWxkIHRvIGtlZXAgdHJhY2sgb2Ygd2hhdCB0aGV5IGNvbnNpZGVyCi0gKiB0byBiZSB0aGUgInN0YXJ0IiBvZiB0aGUgcmluZy4gIEl0IGlzIGFsc28gc2V0IGJ5IG1ha2VfY2hpbGQgdG8gZW5zdXJlCi0gKiB0aGF0IG5ldyBjaGlsZHJlbiBhbHNvIGRvbid0IHN0YXJ2ZSBhbnkgc29ja2V0cy4KLSAqCi0gKiBOb3RlIHRoYXQgbGlzdGVuZXJzICE9IE5VTEwgaXMgZW5zdXJlZCBieSByZWFkX2NvbmZpZygpLgotICovCi1saXN0ZW5fcmVjICphcF9saXN0ZW5lcnM7Ci1zdGF0aWMgbGlzdGVuX3JlYyAqaGVhZF9saXN0ZW5lcjsKLQotQVBJX1ZBUl9FWFBPUlQgY2hhciBhcF9zZXJ2ZXJfcm9vdFtNQVhfU1RSSU5HX0xFTl09IiI7Ci1jaGFyIGFwX3NlcnZlcl9jb25mbmFtZVtNQVhfU1RSSU5HX0xFTl09IiI7Ci1jaGFyIGFwX2NvcmVkdW1wX2RpcltNQVhfU1RSSU5HX0xFTl07Ci0KLWFycmF5X2hlYWRlciAqYXBfc2VydmVyX3ByZV9yZWFkX2NvbmZpZzsKLWFycmF5X2hlYWRlciAqYXBfc2VydmVyX3Bvc3RfcmVhZF9jb25maWc7Ci1hcnJheV9oZWFkZXIgKmFwX3NlcnZlcl9jb25maWdfZGVmaW5lczsKLQotLyogKk5vbiotc2hhcmVkIGh0dHBfbWFpbiBnbG9iYWxzLi4uICovCi0KLXN0YXRpYyBzZXJ2ZXJfcmVjICpzZXJ2ZXJfY29uZjsKLXN0YXRpYyBKTVBfQlVGIEFQQUNIRV9UTFMgam1wYnVmZmVyOwotc3RhdGljIGludCBzZDsKLXN0YXRpYyBmZF9zZXQgbGlzdGVuZmRzOwotc3RhdGljIGludCBsaXN0ZW5tYXhmZDsKLXN0YXRpYyBwaWRfdCBwZ3JwOwotCi0vKiBvbmVfcHJvY2VzcyAtLS0gZGVidWdnaW5nIG1vZGUgdmFyaWFibGU7IGNhbiBiZSBzZXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lCi0gKiB3aXRoIHRoZSAtWCBmbGFnLiAgSWYgc2V0LCB0aGlzIGdldHMgeW91IHRoZSBjaGlsZF9tYWluIGxvb3AgcnVubmluZwotICogaW4gdGhlIHByb2Nlc3Mgd2hpY2ggb3JpZ2luYWxseSBzdGFydGVkIHVwIChubyBkZXRhY2gsIG5vIG1ha2VfY2hpbGQpLAotICogd2hpY2ggaXMgYSBwcmV0dHkgbmljZSBkZWJ1Z2dpbmcgZW52aXJvbm1lbnQuICAoWW91J2xsIGdldCBhIFNJR0hVUAotICogZWFybHkgaW4gc3RhbmRhbG9uZV9tYWluOyBqdXN0IGNvbnRpbnVlIHRocm91Z2guICBUaGlzIGlzIHRoZSBzZXJ2ZXIKLSAqIHRyeWluZyB0byBraWxsIG9mZiBhbnkgY2hpbGQgcHJvY2Vzc2VzIHdoaWNoIGl0IG1pZ2h0IGhhdmUgbHlpbmcKLSAqIGFyb3VuZCAtLS0gQXBhY2hlIGRvZXNuJ3Qga2VlcCB0cmFjayBvZiB0aGVpciBwaWRzLCBpdCBqdXN0IHNlbmRzCi0gKiBTSUdIVVAgdG8gdGhlIHByb2Nlc3MgZ3JvdXAsIGlnbm9yaW5nIGl0IGluIHRoZSByb290IHByb2Nlc3MuCi0gKiBDb250aW51ZSB0aHJvdWdoIGFuZCB5b3UnbGwgYmUgZmluZS4pLgotICovCi0KLXN0YXRpYyBpbnQgb25lX3Byb2Nlc3MgPSAwOwotCi0vKiBzZXQgaWYgdGltZW91dHMgYXJlIHRvIGJlIGhhbmRsZWQgYnkgdGhlIGNoaWxkcmVuIGFuZCBub3QgYnkgdGhlIHBhcmVudC4KLSAqIGkuZS4gY2hpbGRfdGltZW91dHMgPSAhc3RhbmRhbG9uZSB8fCBvbmVfcHJvY2Vzcy4KLSAqLwotc3RhdGljIGludCBjaGlsZF90aW1lb3V0czsKLQotI2lmZGVmIERFQlVHX1NJR1NUT1AKLWludCByYWlzZV9zaWdzdG9wX2ZsYWdzOwotI2VuZGlmCi0KLSNpZm5kZWYgTk9fT1RIRVJfQ0hJTEQKLS8qIHVzZWQgdG8gbWFpbnRhaW4gbGlzdCBvZiBjaGlsZHJlbiB3aGljaCBhcmVuJ3QgcGFydCBvZiB0aGUgc2NvcmVib2FyZCAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3RoZXJfY2hpbGRfcmVjIG90aGVyX2NoaWxkX3JlYzsKLXN0cnVjdCBvdGhlcl9jaGlsZF9yZWMgewotICAgIG90aGVyX2NoaWxkX3JlYyAqbmV4dDsKLSAgICBpbnQgcGlkOwotICAgIHZvaWQgKCptYWludGVuYW5jZSkgKGludCwgdm9pZCAqLCBhcF93YWl0X3QpOwotICAgIHZvaWQgKmRhdGE7Ci0gICAgaW50IHdyaXRlX2ZkOwotfTsKLXN0YXRpYyBvdGhlcl9jaGlsZF9yZWMgKm90aGVyX2NoaWxkcmVuOwotI2VuZGlmCi0KLXN0YXRpYyBwb29sICpwZ2xvYmFsOwkJLyogR2xvYmFsIHBvb2wgKi8KLXN0YXRpYyBwb29sICpwY29uZjsJCS8qIFBvb2wgZm9yIGNvbmZpZyBzdHVmZiAqLwotc3RhdGljIHBvb2wgKnBsb2c7CQkvKiBQb29sIGZvciBlcnJvci1sb2dnaW5nIGZpbGVzICovCi1zdGF0aWMgcG9vbCAqcHRyYW5zOwkJLyogUG9vbCBmb3IgcGVyLXRyYW5zYWN0aW9uIHN0dWZmICovCi1zdGF0aWMgcG9vbCAqcGNoaWxkOwkJLyogUG9vbCBmb3IgaHR0cGQgY2hpbGQgc3R1ZmYgKi8KLXN0YXRpYyBwb29sICpwY29tbWFuZHM7CS8qIFBvb2wgZm9yIC1DIGFuZCAtYyBzd2l0Y2hlcyAqLwotCi1zdGF0aWMgaW50IEFQQUNIRV9UTFMgbXlfcGlkOwkvKiBpdCBzZWVtcyBzaWxseSB0byBjYWxsIGdldHBpZCBhbGwgdGhlIHRpbWUgKi8KLSNpZm5kZWYgTVVMVElUSFJFQUQKLXN0YXRpYyBpbnQgbXlfY2hpbGRfbnVtOwotI2VuZGlmCi0KLSNpZmRlZiBUUEYKLWludCB0cGZfY2hpbGQgPSAwOwotY2hhciB0cGZfc2VydmVyX25hbWVbSU5FVERfU0VSVk5BTUVfTEVOR1RIKzFdOwotI2VuZGlmIC8qIFRQRiAqLwotCi1zY29yZWJvYXJkICphcF9zY29yZWJvYXJkX2ltYWdlID0gTlVMTDsKLQotLyoKLSAqIFBpZWNlcyBmb3IgbWFuYWdpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBTZXJ2ZXIgcmVzcG9uc2UgaGVhZGVyCi0gKiBmaWVsZC4KLSAqLwotc3RhdGljIGNoYXIgKnNlcnZlcl92ZXJzaW9uID0gTlVMTDsKLXN0YXRpYyBpbnQgdmVyc2lvbl9sb2NrZWQgPSAwOwotCi0vKiBHbG9iYWwsIGFsYXMsIHNvIGh0dHBfY29yZSBjYW4gdGFsayB0byB1cyAqLwotZW51bSBzZXJ2ZXJfdG9rZW5fdHlwZSBhcF9zZXJ2ZXJfdG9rZW5zID0gU3J2VGtfRlVMTDsKLQotLyoKLSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiB0aGUgcGNvbmYgcG9vbCBpcyB2YWN1dW1lZC4gIEl0IHJlc2V0cyB0aGUKLSAqIHNlcnZlciB2ZXJzaW9uIHN0cmluZyB0byBhIGtub3duIHZhbHVlIGFuZCBbcmVdZW5hYmxlcyBtb2RpZmljYXRpb25zCi0gKiAod2hpY2ggYXJlIGRpc2FibGVkIGJ5IGNvbmZpZ3VyYXRpb24gY29tcGxldGlvbikuIAotICovCi1zdGF0aWMgdm9pZCByZXNldF92ZXJzaW9uKHZvaWQgKmR1bW15KQotewotICAgIHZlcnNpb25fbG9ja2VkID0gMDsKLSAgICBhcF9zZXJ2ZXJfdG9rZW5zID0gU3J2VGtfRlVMTDsKLSAgICBzZXJ2ZXJfdmVyc2lvbiA9IE5VTEw7Ci19Ci0KLUFQSV9FWFBPUlQoY29uc3QgY2hhciAqKSBhcF9nZXRfc2VydmVyX3ZlcnNpb24odm9pZCkKLXsKLSAgICByZXR1cm4gKHNlcnZlcl92ZXJzaW9uID8gc2VydmVyX3ZlcnNpb24gOiBTRVJWRVJfQkFTRVZFUlNJT04pOwotfQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX2FkZF92ZXJzaW9uX2NvbXBvbmVudChjb25zdCBjaGFyICpjb21wb25lbnQpCi17Ci0gICAgaWYgKCEgdmVyc2lvbl9sb2NrZWQpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogSWYgdGhlIHZlcnNpb24gc3RyaW5nIGlzIG51bGwsIHJlZ2lzdGVyIG91ciBjbGVhbnVwIHRvIHJlc2V0IHRoZQotICAgICAgICAgKiBwb2ludGVyIG9uIHBvb2wgZGVzdHJ1Y3Rpb24uIFdlIGFsc28ga25vdyB0aGF0LCBpZiBOVUxMLAotCSAqIHdlIGFyZSBhZGRpbmcgdGhlIG9yaWdpbmFsIFNFUlZFUl9CQVNFVkVSU0lPTiBzdHJpbmcuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoc2VydmVyX3ZlcnNpb24gPT0gTlVMTCkgewotCSAgICBhcF9yZWdpc3Rlcl9jbGVhbnVwKHBjb25mLCBOVUxMLCAodm9pZCAoKikodm9pZCAqKSlyZXNldF92ZXJzaW9uLCAKLQkJCQlhcF9udWxsX2NsZWFudXApOwotCSAgICBzZXJ2ZXJfdmVyc2lvbiA9IGFwX3BzdHJkdXAocGNvbmYsIGNvbXBvbmVudCk7Ci0JfQotCWVsc2UgewotCSAgICAvKgotCSAgICAgKiBUYWNrIHRoZSBnaXZlbiBjb21wb25lbnQgaWRlbnRpZmllciB0byB0aGUgZW5kIG9mCi0JICAgICAqIHRoZSBleGlzdGluZyBzdHJpbmcuCi0JICAgICAqLwotCSAgICBzZXJ2ZXJfdmVyc2lvbiA9IGFwX3BzdHJjYXQocGNvbmYsIHNlcnZlcl92ZXJzaW9uLCAiICIsCi0JCQkJCWNvbXBvbmVudCwgTlVMTCk7Ci0JfQotICAgIH0KLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBhZGRzIHRoZSByZWFsIHNlcnZlciBiYXNlIGlkZW50aXR5IHRvIHRoZSB2ZXJzaW9uIHN0cmluZywKLSAqIGFuZCB0aGVuIGxvY2tzIG91dCBjaGFuZ2VzIHVudGlsIHRoZSBuZXh0IHJlY29uZmlnLgotICovCi1zdGF0aWMgdm9pZCBhcF9zZXRfdmVyc2lvbih2b2lkKQotewotICAgIGlmIChhcF9zZXJ2ZXJfdG9rZW5zID09IFNydlRrX01JTikgewotCWFwX2FkZF92ZXJzaW9uX2NvbXBvbmVudChTRVJWRVJfQkFTRVZFUlNJT04pOwotICAgIH0KLSAgICBlbHNlIHsKLQlhcF9hZGRfdmVyc2lvbl9jb21wb25lbnQoU0VSVkVSX0JBU0VWRVJTSU9OICIgKCIgUExBVEZPUk0gIikiKTsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBMb2NrIHRoZSBzZXJ2ZXJfdmVyc2lvbiBzdHJpbmcgaWYgd2UncmUgbm90IGRpc3BsYXlpbmcKLSAgICAgKiB0aGUgZnVsbCBzZXQgb2YgdG9rZW5zCi0gICAgICovCi0gICAgaWYgKGFwX3NlcnZlcl90b2tlbnMgIT0gU3J2VGtfRlVMTCkgewotCXZlcnNpb25fbG9ja2VkKys7Ci0gICAgfQotfQotCi1zdGF0aWMgQVBBQ0hFX1RMUyBpbnQgdm9sYXRpbGUgZXhpdF9hZnRlcl91bmJsb2NrID0gMDsKLQotI2lmZGVmIEdQUk9GCi0vKiAKLSAqIGNoYW5nZSBkaXJlY3RvcnkgZm9yIGdwcm9mIHRvIHBsb3AgdGhlIGdtb24ub3V0IGZpbGUKLSAqIGNvbmZpZ3VyZSBpbiBodHRwZC5jb25mOgotICogR3Byb2ZEaXIgbG9ncy8gICAtPiAkU2VydmVyUm9vdC9sb2dzL2dtb24ub3V0Ci0gKiBHcHJvZkRpciBsb2dzLyUgIC0+ICRTZXJ2ZXJSb290L2xvZ3MvZ3Byb2YuJHBpZC9nbW9uLm91dAotICovCi1zdGF0aWMgdm9pZCBjaGRpcl9mb3JfZ3Byb2Yodm9pZCkKLXsKLSAgICBjb3JlX3NlcnZlcl9jb25maWcgKnNjb25mID0gCi0JYXBfZ2V0X21vZHVsZV9jb25maWcoc2VydmVyX2NvbmYtPm1vZHVsZV9jb25maWcsICZjb3JlX21vZHVsZSk7ICAgIAotICAgIGNoYXIgKmRpciA9IHNjb25mLT5ncHJvZl9kaXI7Ci0KLSAgICBpZihkaXIpIHsKLQljaGFyIGJ1Zls1MTJdOwotCWludCBsZW4gPSBzdHJsZW4oc2NvbmYtPmdwcm9mX2RpcikgLSAxOwotCWlmKCooZGlyICsgbGVuKSA9PSAnJScpIHsKLQkgICAgZGlyW2xlbl0gPSAnXDAnOwotCSAgICBhcF9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXNncHJvZi4lZCIsIGRpciwgKGludClnZXRwaWQoKSk7Ci0JfSAKLQlkaXIgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShwY29uZiwgYnVmWzBdID8gYnVmIDogZGlyKTsKLQlpZihta2RpcihkaXIsIDA3NTUpIDwgMCAmJiBlcnJubyAhPSBFRVhJU1QpIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgc2VydmVyX2NvbmYsCi0JCQkgImdwcm9mOiBlcnJvciBjcmVhdGluZyBkaXJlY3RvcnkgJXMiLCBkaXIpOwotCX0KLSAgICB9Ci0gICAgZWxzZSB7Ci0JZGlyID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocGNvbmYsICJsb2dzIik7Ci0gICAgfQotCi0gICAgY2hkaXIoZGlyKTsKLX0KLSNlbHNlCi0jZGVmaW5lIGNoZGlyX2Zvcl9ncHJvZigpCi0jZW5kaWYKLQotLyogYSBjbGVhbiBleGl0IGZyb20gYSBjaGlsZCB3aXRoIHByb3BlciBjbGVhbnVwICovCi1zdGF0aWMgdm9pZCBjbGVhbl9jaGlsZF9leGl0KGludCBjb2RlKSBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKTsKLXN0YXRpYyB2b2lkIGNsZWFuX2NoaWxkX2V4aXQoaW50IGNvZGUpCi17Ci0gICAgaWYgKHBjaGlsZCkgewotCWFwX2NoaWxkX2V4aXRfbW9kdWxlcyhwY2hpbGQsIHNlcnZlcl9jb25mKTsKLQlhcF9kZXN0cm95X3Bvb2wocGNoaWxkKTsKLSAgICB9Ci0gICAgY2hkaXJfZm9yX2dwcm9mKCk7Ci0gICAgZXhpdChjb2RlKTsKLX0KLQotI2lmIGRlZmluZWQoVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUKSB8fCBkZWZpbmVkKFVTRV9GTE9DS19TRVJJQUxJWkVEX0FDQ0VQVCkKLXN0YXRpYyB2b2lkIGV4cGFuZF9sb2NrX2ZuYW1lKHBvb2wgKnApCi17Ci0gICAgLyogWFhYWCBwb3NzaWJseSBib2d1cyBjYXN0ICovCi0gICAgYXBfbG9ja19mbmFtZSA9IGFwX3BzcHJpbnRmKHAsICIlcy4lbHUiLAotCWFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHAsIGFwX2xvY2tfZm5hbWUpLCAodW5zaWduZWQgbG9uZylnZXRwaWQoKSk7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKFVTRV9VU0xPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQpCi0KLSNpbmNsdWRlIDx1bG9ja3MuaD4KLQotc3RhdGljIHVsb2NrX3QgdXNsb2NrID0gTlVMTDsKLQotI2RlZmluZSBhY2NlcHRfbXV0ZXhfY2hpbGRfaW5pdCh4KQotCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfaW5pdChwb29sICpwKQotewotICAgIHB0cmRpZmZfdCBvbGQ7Ci0gICAgdXNwdHJfdCAqdXM7Ci0KLQotICAgIC8qIGRlZmF1bHQgaXMgOCwgYWxsb2NhdGUgZW5vdWdoIGZvciBhbGwgdGhlIGNoaWxkcmVuIHBsdXMgdGhlIHBhcmVudCAqLwotICAgIGlmICgob2xkID0gdXNjb25maWcoQ09ORl9JTklUVVNFUlMsIEhBUkRfU0VSVkVSX0xJTUlUICsgMSkpID09IC0xKSB7Ci0JcGVycm9yKCJ1c2NvbmZpZyhDT05GX0lOSVRVU0VSUykiKTsKLQlleGl0KC0xKTsKLSAgICB9Ci0KLSAgICBpZiAoKG9sZCA9IHVzY29uZmlnKENPTkZfTE9DS1RZUEUsIFVTX05PREVCVUcpKSA9PSAtMSkgewotCXBlcnJvcigidXNjb25maWcoQ09ORl9MT0NLVFlQRSkiKTsKLQlleGl0KC0xKTsKLSAgICB9Ci0gICAgaWYgKChvbGQgPSB1c2NvbmZpZyhDT05GX0FSRU5BVFlQRSwgVVNfU0hBUkVET05MWSkpID09IC0xKSB7Ci0JcGVycm9yKCJ1c2NvbmZpZyhDT05GX0FSRU5BVFlQRSkiKTsKLQlleGl0KC0xKTsKLSAgICB9Ci0gICAgaWYgKCh1cyA9IHVzaW5pdCgiL2Rldi96ZXJvIikpID09IE5VTEwpIHsKLQlwZXJyb3IoInVzaW5pdCIpOwotCWV4aXQoLTEpOwotICAgIH0KLQotICAgIGlmICgodXNsb2NrID0gdXNuZXdsb2NrKHVzKSkgPT0gTlVMTCkgewotCXBlcnJvcigidXNuZXdsb2NrIik7Ci0JZXhpdCgtMSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfb24odm9pZCkKLXsKLSAgICBzd2l0Y2ggKHVzc2V0bG9jayh1c2xvY2spKSB7Ci0gICAgY2FzZSAxOgotCS8qIGdvdCBsb2NrICovCi0JYnJlYWs7Ci0gICAgY2FzZSAwOgotCWZwcmludGYoc3RkZXJyLCAiZGlkbid0IGdldCBsb2NrXG4iKTsKLQljbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICBjYXNlIC0xOgotCXBlcnJvcigidXNzZXRsb2NrIik7Ci0JY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfb2ZmKHZvaWQpCi17Ci0gICAgaWYgKHVzdW5zZXRsb2NrKHVzbG9jaykgPT0gLTEpIHsKLQlwZXJyb3IoInVzdW5zZXRsb2NrIik7Ci0JY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotfQotCi0jZWxpZiBkZWZpbmVkIChVU0VfUFRIUkVBRF9TRVJJQUxJWkVEX0FDQ0VQVCkKLQotLyogVGhpcyBjb2RlIHByb2JhYmx5IG9ubHkgd29ya3Mgb24gU29sYXJpcyAuLi4gYnV0IGl0IHdvcmtzIHJlYWxseSBmYXN0Ci0gKiBvbiBTb2xhcmlzLiAgTm90ZSB0aGF0IHB0aHJlYWQgbXV0ZXhlcyBhcmUgKk5PVCogcmVsZWFzZWQgd2hlbiBhIHRhc2sKLSAqIGRpZXMgLi4uIHRoZSB0YXNrIGhhcyB0byBmcmVlIGl0IGl0c2VsZi4gIFNvIHdlIGJsb2NrIHNpZ25hbHMgYW5kCi0gKiB0cnkgdG8gYmUgbmljZSBhYm91dCByZWxlYXNpbmcgdGhlIG11dGV4LgotICovCi0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLXN0YXRpYyBwdGhyZWFkX211dGV4X3QgKmFjY2VwdF9tdXRleCA9ICh2b2lkICopKGNhZGRyX3QpIC0xOwotc3RhdGljIGludCBoYXZlX2FjY2VwdF9tdXRleDsKLXN0YXRpYyBzaWdzZXRfdCBhY2NlcHRfYmxvY2tfbWFzazsKLXN0YXRpYyBzaWdzZXRfdCBhY2NlcHRfcHJldmlvdXNfbWFzazsKLQotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X2NoaWxkX2NsZWFudXAodm9pZCAqZm9vKQotewotICAgIGlmIChhY2NlcHRfbXV0ZXggIT0gKHZvaWQgKikoY2FkZHJfdCktMQotCSYmIGhhdmVfYWNjZXB0X211dGV4KSB7Ci0JcHRocmVhZF9tdXRleF91bmxvY2soYWNjZXB0X211dGV4KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9jaGlsZF9pbml0KHBvb2wgKnApCi17Ci0gICAgYXBfcmVnaXN0ZXJfY2xlYW51cChwLCBOVUxMLCBhY2NlcHRfbXV0ZXhfY2hpbGRfY2xlYW51cCwgYXBfbnVsbF9jbGVhbnVwKTsKLX0KLQotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X2NsZWFudXAodm9pZCAqZm9vKQotewotICAgIGlmIChhY2NlcHRfbXV0ZXggIT0gKHZvaWQgKikoY2FkZHJfdCktMQotCSYmIG11bm1hcCgoY2FkZHJfdCkgYWNjZXB0X211dGV4LCBzaXplb2YoKmFjY2VwdF9tdXRleCkpKSB7Ci0JcGVycm9yKCJtdW5tYXAiKTsKLSAgICB9Ci0gICAgYWNjZXB0X211dGV4ID0gKHZvaWQgKikoY2FkZHJfdCktMTsKLX0KLQotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X2luaXQocG9vbCAqcCkKLXsKLSAgICBwdGhyZWFkX211dGV4YXR0cl90IG1hdHRyOwotICAgIGludCBmZDsKLQotICAgIGZkID0gb3BlbigiL2Rldi96ZXJvIiwgT19SRFdSKTsKLSAgICBpZiAoZmQgPT0gLTEpIHsKLQlwZXJyb3IoIm9wZW4oL2Rldi96ZXJvKSIpOwotCWV4aXQoQVBFWElUX0lOSVQpOwotICAgIH0KLSAgICBhY2NlcHRfbXV0ZXggPSAocHRocmVhZF9tdXRleF90ICopIG1tYXAoKGNhZGRyX3QpIDAsIHNpemVvZigqYWNjZXB0X211dGV4KSwKLQkJCQkgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmQsIDApOwotICAgIGlmIChhY2NlcHRfbXV0ZXggPT0gKHZvaWQgKikgKGNhZGRyX3QpIC0gMSkgewotCXBlcnJvcigibW1hcCIpOwotCWV4aXQoQVBFWElUX0lOSVQpOwotICAgIH0KLSAgICBjbG9zZShmZCk7Ci0gICAgaWYgKChlcnJubyA9IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJm1hdHRyKSkpIHsKLQlwZXJyb3IoInB0aHJlYWRfbXV0ZXhhdHRyX2luaXQiKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0gICAgaWYgKChlcnJubyA9IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHBzaGFyZWQoJm1hdHRyLAotCQkJCQkJUFRIUkVBRF9QUk9DRVNTX1NIQVJFRCkpKSB7Ci0JcGVycm9yKCJwdGhyZWFkX211dGV4YXR0cl9zZXRwc2hhcmVkIik7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIGlmICgoZXJybm8gPSBwdGhyZWFkX211dGV4X2luaXQoYWNjZXB0X211dGV4LCAmbWF0dHIpKSkgewotCXBlcnJvcigicHRocmVhZF9tdXRleF9pbml0Iik7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIHNpZ2ZpbGxzZXQoJmFjY2VwdF9ibG9ja19tYXNrKTsKLSAgICBzaWdkZWxzZXQoJmFjY2VwdF9ibG9ja19tYXNrLCBTSUdIVVApOwotICAgIHNpZ2RlbHNldCgmYWNjZXB0X2Jsb2NrX21hc2ssIFNJR1RFUk0pOwotICAgIHNpZ2RlbHNldCgmYWNjZXB0X2Jsb2NrX21hc2ssIFNJR1VTUjEpOwotICAgIGFwX3JlZ2lzdGVyX2NsZWFudXAocCwgTlVMTCwgYWNjZXB0X211dGV4X2NsZWFudXAsIGFwX251bGxfY2xlYW51cCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9vbih2b2lkKQotewotICAgIGludCBlcnI7Ci0KLSAgICBpZiAoc2lncHJvY21hc2soU0lHX0JMT0NLLCAmYWNjZXB0X2Jsb2NrX21hc2ssICZhY2NlcHRfcHJldmlvdXNfbWFzaykpIHsKLQlwZXJyb3IoInNpZ3Byb2NtYXNrKFNJR19CTE9DSykiKTsKLQljbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci0gICAgaWYgKChlcnIgPSBwdGhyZWFkX211dGV4X2xvY2soYWNjZXB0X211dGV4KSkpIHsKLQllcnJubyA9IGVycjsKLQlwZXJyb3IoInB0aHJlYWRfbXV0ZXhfbG9jayIpOwotCWNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotICAgIH0KLSAgICBoYXZlX2FjY2VwdF9tdXRleCA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9vZmYodm9pZCkKLXsKLSAgICBpbnQgZXJyOwotCi0gICAgaWYgKChlcnIgPSBwdGhyZWFkX211dGV4X3VubG9jayhhY2NlcHRfbXV0ZXgpKSkgewotCWVycm5vID0gZXJyOwotCXBlcnJvcigicHRocmVhZF9tdXRleF91bmxvY2siKTsKLQljbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci0gICAgLyogVGhlcmUgaXMgYSBzbGlnaHQgcmFjZSBjb25kaXRpb24gcmlnaHQgaGVyZS4uLiBpZiB3ZSB3ZXJlIHRvIGRpZSByaWdodAotICAgICAqIG5vdywgd2UnZCBkbyBhbm90aGVyIHB0aHJlYWRfbXV0ZXhfdW5sb2NrLiAgTm93LCBkb2luZyB0aGF0IHdvdWxkIGxldAotICAgICAqIGFub3RoZXIgcHJvY2VzcyBpbnRvIHRoZSBtdXRleC4gIHB0aHJlYWQgbXV0ZXhlcyBhcmUgZGVzaWduZWQgdG8gYmUKLSAgICAgKiBmYXN0LCBhcyBzdWNoIHRoZXkgZG9uJ3QgaGF2ZSBwcm90ZWN0aW9uIGZvciB0aGluZ3MgbGlrZSB0ZXN0aW5nIGlmIHRoZQotICAgICAqIHRocmVhZCBvd25pbmcgYSBtdXRleCBpcyBhY3R1YWxseSB1bmxvY2tpbmcgaXQgKG9yIGV2ZW4gYW55IHdheSBvZgotICAgICAqIHRlc3Rpbmcgd2hvIG93bnMgdGhlIG11dGV4KS4KLSAgICAgKgotICAgICAqIElmIHdlIHdlcmUgdG8gdW5zZXQgaGF2ZV9hY2NlcHRfbXV0ZXggcHJpb3IgdG8gcmVsZWFzaW5nIHRoZSBtdXRleAotICAgICAqIHRoZW4gdGhlIHJhY2UgY291bGQgcmVzdWx0IGluIHRoZSBzZXJ2ZXIgdW5hYmxlIHRvIHNlcnZlIGhpdHMuICBEb2luZwotICAgICAqIGl0IHRoaXMgd2F5IG1lYW5zIHRoYXQgdGhlIHNlcnZlciBjYW4gY29udGludWUsIGJ1dCBhbiBhZGRpdGlvbmFsCi0gICAgICogY2hpbGQgbWlnaHQgYmUgaW4gdGhlIGNyaXRpY2FsIHNlY3Rpb24gLi4uIGF0IGxlYXN0IGl0J3Mgc3RpbGwgc2VydmluZwotICAgICAqIGhpdHMuCi0gICAgICovCi0gICAgaGF2ZV9hY2NlcHRfbXV0ZXggPSAwOwotICAgIGlmIChzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmFjY2VwdF9wcmV2aW91c19tYXNrLCBOVUxMKSkgewotCXBlcnJvcigic2lncHJvY21hc2soU0lHX1NFVE1BU0spIik7Ci0JY2xlYW5fY2hpbGRfZXhpdCgxKTsKLSAgICB9Ci19Ci0KLSNlbGlmIGRlZmluZWQgKFVTRV9TWVNWU0VNX1NFUklBTElaRURfQUNDRVBUKQotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL2lwYy5oPgotI2luY2x1ZGUgPHN5cy9zZW0uaD4KLQotI2lmZGVmIE5FRURfVU5JT05fU0VNVU4KLS8qIGl0IG1ha2VzIG5vIHNlbnNlLCBidXQgdGhpcyBpc24ndCBkZWZpbmVkIG9uIHNvbGFyaXMgKi8KLXVuaW9uIHNlbXVuIHsKLSAgICBsb25nIHZhbDsKLSAgICBzdHJ1Y3Qgc2VtaWRfZHMgKmJ1ZjsKLSAgICB1c2hvcnQgKmFycmF5OwotfTsKLQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgc2VtX2lkID0gLTE7Ci1zdGF0aWMgc3RydWN0IHNlbWJ1ZiBvcF9vbjsKLXN0YXRpYyBzdHJ1Y3Qgc2VtYnVmIG9wX29mZjsKLQotLyogV2UgZ2V0IGEgcmFuZG9tIHNlbWFwaG9yZSAuLi4gdGhlIGxhbWUgc3lzdiBzZW1hcGhvcmUgaW50ZXJmYWNlCi0gKiBtZWFucyB3ZSBoYXZlIHRvIGJlIHN1cmUgdG8gY2xlYW4gdGhpcyB1cCBvciBlbHNlIHdlJ2xsIGxlYWsKLSAqIHNlbWFwaG9yZXMuCi0gKi8KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9jbGVhbnVwKHZvaWQgKmZvbykKLXsKLSAgICB1bmlvbiBzZW11biBpY2s7Ci0KLSAgICBpZiAoc2VtX2lkIDwgMCkKLQlyZXR1cm47Ci0gICAgLyogdGhpcyBpcyBpZ25vcmVkIGFueWhvdyAqLwotICAgIGljay52YWwgPSAwOwotICAgIHNlbWN0bChzZW1faWQsIDAsIElQQ19STUlELCBpY2spOwotfQotCi0jZGVmaW5lIGFjY2VwdF9tdXRleF9jaGlsZF9pbml0KHgpCi0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9pbml0KHBvb2wgKnApCi17Ci0gICAgdW5pb24gc2VtdW4gaWNrOwotICAgIHN0cnVjdCBzZW1pZF9kcyBidWY7Ci0KLSAgICAvKiBhY3F1aXJlIHRoZSBzZW1hcGhvcmUgKi8KLSAgICBzZW1faWQgPSBzZW1nZXQoSVBDX1BSSVZBVEUsIDEsIElQQ19DUkVBVCB8IDA2MDApOwotICAgIGlmIChzZW1faWQgPCAwKSB7Ci0JcGVycm9yKCJzZW1nZXQiKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0gICAgaWNrLnZhbCA9IDE7Ci0gICAgaWYgKHNlbWN0bChzZW1faWQsIDAsIFNFVFZBTCwgaWNrKSA8IDApIHsKLQlwZXJyb3IoInNlbWN0bChTRVRWQUwpIik7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIGlmICghZ2V0dWlkKCkpIHsKLQkvKiByZXN0cmljdCBpdCB0byB1c2Ugb25seSBieSB0aGUgYXBwcm9wcmlhdGUgdXNlcl9pZCAuLi4gbm90IHRoYXQgdGhpcwotCSAqIHN0b3BzIENHSXMgZnJvbSBhY3F1aXJpbmcgaXQgYW5kIGRpbmtpbmcgYXJvdW5kIHdpdGggaXQuCi0JICovCi0JYnVmLnNlbV9wZXJtLnVpZCA9IGFwX3VzZXJfaWQ7Ci0JYnVmLnNlbV9wZXJtLmdpZCA9IGFwX2dyb3VwX2lkOwotCWJ1Zi5zZW1fcGVybS5tb2RlID0gMDYwMDsKLQlpY2suYnVmID0gJmJ1ZjsKLQlpZiAoc2VtY3RsKHNlbV9pZCwgMCwgSVBDX1NFVCwgaWNrKSA8IDApIHsKLQkgICAgcGVycm9yKCJzZW1jdGwoSVBDX1NFVCkiKTsKLQkgICAgZXhpdChBUEVYSVRfSU5JVCk7Ci0JfQotICAgIH0KLSAgICBhcF9yZWdpc3Rlcl9jbGVhbnVwKHAsIE5VTEwsIGFjY2VwdF9tdXRleF9jbGVhbnVwLCBhcF9udWxsX2NsZWFudXApOwotCi0gICAgLyogcHJlLWluaXRpYWxpemUgdGhlc2UgKi8KLSAgICBvcF9vbi5zZW1fbnVtID0gMDsKLSAgICBvcF9vbi5zZW1fb3AgPSAtMTsKLSAgICBvcF9vbi5zZW1fZmxnID0gU0VNX1VORE87Ci0gICAgb3Bfb2ZmLnNlbV9udW0gPSAwOwotICAgIG9wX29mZi5zZW1fb3AgPSAxOwotICAgIG9wX29mZi5zZW1fZmxnID0gU0VNX1VORE87Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9vbih2b2lkKQotewotICAgIHdoaWxlIChzZW1vcChzZW1faWQsICZvcF9vbiwgMSkgPCAwKSB7Ci0JaWYgKGVycm5vICE9IEVJTlRSKSB7Ci0JICAgIHBlcnJvcigiYWNjZXB0X211dGV4X29uIik7Ci0JICAgIGNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9vZmYodm9pZCkKLXsKLSAgICB3aGlsZSAoc2Vtb3Aoc2VtX2lkLCAmb3Bfb2ZmLCAxKSA8IDApIHsKLQlpZiAoZXJybm8gIT0gRUlOVFIpIHsKLQkgICAgcGVycm9yKCJhY2NlcHRfbXV0ZXhfb2ZmIik7Ci0JICAgIGNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotCX0KLSAgICB9Ci19Ci0KLSNlbGlmIGRlZmluZWQoVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUKQotc3RhdGljIHN0cnVjdCBmbG9jayBsb2NrX2l0Owotc3RhdGljIHN0cnVjdCBmbG9jayB1bmxvY2tfaXQ7Ci0KLXN0YXRpYyBpbnQgbG9ja19mZCA9IC0xOwotCi0jZGVmaW5lIGFjY2VwdF9tdXRleF9jaGlsZF9pbml0KHgpCi0KLS8qCi0gKiBJbml0aWFsaXplIG11dGV4IGxvY2suCi0gKiBNdXN0IGJlIHNhZmUgdG8gY2FsbCB0aGlzIG9uIGEgcmVzdGFydC4KLSAqLwotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X2luaXQocG9vbCAqcCkKLXsKLQotICAgIGxvY2tfaXQubF93aGVuY2UgPSBTRUVLX1NFVDsJLyogZnJvbSBjdXJyZW50IHBvaW50ICovCi0gICAgbG9ja19pdC5sX3N0YXJ0ID0gMDsJCS8qIC0iLSAqLwotICAgIGxvY2tfaXQubF9sZW4gPSAwOwkJCS8qIHVudGlsIGVuZCBvZiBmaWxlICovCi0gICAgbG9ja19pdC5sX3R5cGUgPSBGX1dSTENLOwkJLyogc2V0IGV4Y2x1c2l2ZS93cml0ZSBsb2NrICovCi0gICAgbG9ja19pdC5sX3BpZCA9IDA7CQkJLyogcGlkIG5vdCBhY3R1YWxseSBpbnRlcmVzdGluZyAqLwotICAgIHVubG9ja19pdC5sX3doZW5jZSA9IFNFRUtfU0VUOwkvKiBmcm9tIGN1cnJlbnQgcG9pbnQgKi8KLSAgICB1bmxvY2tfaXQubF9zdGFydCA9IDA7CQkvKiAtIi0gKi8KLSAgICB1bmxvY2tfaXQubF9sZW4gPSAwOwkJLyogdW50aWwgZW5kIG9mIGZpbGUgKi8KLSAgICB1bmxvY2tfaXQubF90eXBlID0gRl9VTkxDSzsJCS8qIHNldCBleGNsdXNpdmUvd3JpdGUgbG9jayAqLwotICAgIHVubG9ja19pdC5sX3BpZCA9IDA7CQkvKiBwaWQgbm90IGFjdHVhbGx5IGludGVyZXN0aW5nICovCi0KLSAgICBleHBhbmRfbG9ja19mbmFtZShwKTsKLSAgICBsb2NrX2ZkID0gYXBfcG9wZW5mKHAsIGFwX2xvY2tfZm5hbWUsIE9fQ1JFQVQgfCBPX1dST05MWSB8IE9fRVhDTCwgMDY0NCk7Ci0gICAgaWYgKGxvY2tfZmQgPT0gLTEpIHsKLQlwZXJyb3IoIm9wZW4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBvcGVuIGxvY2sgZmlsZTogJXNcbiIsIGFwX2xvY2tfZm5hbWUpOwotCWV4aXQoQVBFWElUX0lOSVQpOwotICAgIH0KLSAgICB1bmxpbmsoYXBfbG9ja19mbmFtZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9vbih2b2lkKQotewotICAgIGludCByZXQ7Ci0KLSAgICB3aGlsZSAoKHJldCA9IGZjbnRsKGxvY2tfZmQsIEZfU0VUTEtXLCAmbG9ja19pdCkpIDwgMCAmJiBlcnJubyA9PSBFSU5UUikgewotCS8qIG5vcCAqLwotICAgIH0KLQotICAgIGlmIChyZXQgPCAwKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLCBzZXJ2ZXJfY29uZiwKLQkJICAgICJmY250bDogRl9TRVRMS1c6IEVycm9yIGdldHRpbmcgYWNjZXB0IGxvY2ssIGV4aXRpbmchICAiCi0JCSAgICAiUGVyaGFwcyB5b3UgbmVlZCB0byB1c2UgdGhlIExvY2tGaWxlIGRpcmVjdGl2ZSB0byBwbGFjZSAiCi0JCSAgICAieW91ciBsb2NrIGZpbGUgb24gYSBsb2NhbCBkaXNrISIpOwotCWNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X29mZih2b2lkKQotewotICAgIGludCByZXQ7Ci0KLSAgICB3aGlsZSAoKHJldCA9IGZjbnRsKGxvY2tfZmQsIEZfU0VUTEtXLCAmdW5sb2NrX2l0KSkgPCAwICYmIGVycm5vID09IEVJTlRSKSB7Ci0JLyogbm9wICovCi0gICAgfQotICAgIGlmIChyZXQgPCAwKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLCBzZXJ2ZXJfY29uZiwKLQkJICAgICJmY250bDogRl9TRVRMS1c6IEVycm9yIGZyZWVpbmcgYWNjZXB0IGxvY2ssIGV4aXRpbmchICAiCi0JCSAgICAiUGVyaGFwcyB5b3UgbmVlZCB0byB1c2UgdGhlIExvY2tGaWxlIGRpcmVjdGl2ZSB0byBwbGFjZSAiCi0JCSAgICAieW91ciBsb2NrIGZpbGUgb24gYSBsb2NhbCBkaXNrISIpOwotCWNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotICAgIH0KLX0KLQotI2VsaWYgZGVmaW5lZChVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQpCi0KLXN0YXRpYyBpbnQgbG9ja19mZCA9IC0xOwotCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfY2xlYW51cCh2b2lkICpmb28pCi17Ci0gICAgdW5saW5rKGFwX2xvY2tfZm5hbWUpOwotfQotCi0vKgotICogSW5pdGlhbGl6ZSBtdXRleCBsb2NrLgotICogRG9uZSBieSBlYWNoIGNoaWxkIGF0IGl0J3MgYmlydGgKLSAqLwotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X2NoaWxkX2luaXQocG9vbCAqcCkKLXsKLQotICAgIGxvY2tfZmQgPSBhcF9wb3BlbmYocCwgYXBfbG9ja19mbmFtZSwgT19XUk9OTFksIDA2MDApOwotICAgIGlmIChsb2NrX2ZkID09IC0xKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLCBzZXJ2ZXJfY29uZiwKLQkJICAgICJDaGlsZCBjYW5ub3Qgb3BlbiBsb2NrIGZpbGU6ICVzIiwgYXBfbG9ja19mbmFtZSk7Ci0JY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERJTklUKTsKLSAgICB9Ci19Ci0KLS8qCi0gKiBJbml0aWFsaXplIG11dGV4IGxvY2suCi0gKiBNdXN0IGJlIHNhZmUgdG8gY2FsbCB0aGlzIG9uIGEgcmVzdGFydC4KLSAqLwotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X2luaXQocG9vbCAqcCkKLXsKLSAgICBleHBhbmRfbG9ja19mbmFtZShwKTsKLSAgICB1bmxpbmsoYXBfbG9ja19mbmFtZSk7Ci0gICAgbG9ja19mZCA9IGFwX3BvcGVuZihwLCBhcF9sb2NrX2ZuYW1lLCBPX0NSRUFUIHwgT19XUk9OTFkgfCBPX0VYQ0wsIDA2MDApOwotICAgIGlmIChsb2NrX2ZkID09IC0xKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLCBzZXJ2ZXJfY29uZiwKLQkJICAgICJQYXJlbnQgY2Fubm90IG9wZW4gbG9jayBmaWxlOiAlcyIsIGFwX2xvY2tfZm5hbWUpOwotCWV4aXQoQVBFWElUX0lOSVQpOwotICAgIH0KLSAgICBhcF9yZWdpc3Rlcl9jbGVhbnVwKHAsIE5VTEwsIGFjY2VwdF9tdXRleF9jbGVhbnVwLCBhcF9udWxsX2NsZWFudXApOwotfQotCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfb24odm9pZCkKLXsKLSAgICBpbnQgcmV0OwotCi0gICAgd2hpbGUgKChyZXQgPSBmbG9jayhsb2NrX2ZkLCBMT0NLX0VYKSkgPCAwICYmIGVycm5vID09IEVJTlRSKQotCWNvbnRpbnVlOwotCi0gICAgaWYgKHJldCA8IDApIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkcsIHNlcnZlcl9jb25mLAotCQkgICAgImZsb2NrOiBMT0NLX0VYOiBFcnJvciBnZXR0aW5nIGFjY2VwdCBsb2NrLiBFeGl0aW5nISIpOwotCWNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X29mZih2b2lkKQotewotICAgIGlmIChmbG9jayhsb2NrX2ZkLCBMT0NLX1VOKSA8IDApIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkcsIHNlcnZlcl9jb25mLAotCQkgICAgImZsb2NrOiBMT0NLX1VOOiBFcnJvciBmcmVlaW5nIGFjY2VwdCBsb2NrLiBFeGl0aW5nISIpOwotCWNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotICAgIH0KLX0KLQotI2VsaWYgZGVmaW5lZChVU0VfT1MyU0VNX1NFUklBTElaRURfQUNDRVBUKQotCi1zdGF0aWMgSE1UWCBsb2NrX3NlbSA9IC0xOwotCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfY2xlYW51cCh2b2lkICpmb28pCi17Ci0gICAgRG9zUmVsZWFzZU11dGV4U2VtKGxvY2tfc2VtKTsKLSAgICBEb3NDbG9zZU11dGV4U2VtKGxvY2tfc2VtKTsKLX0KLQotLyoKLSAqIEluaXRpYWxpemUgbXV0ZXggbG9jay4KLSAqIERvbmUgYnkgZWFjaCBjaGlsZCBhdCBpdCdzIGJpcnRoCi0gKi8KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9jaGlsZF9pbml0KHBvb2wgKnApCi17Ci0gICAgaW50IHJjID0gRG9zT3Blbk11dGV4U2VtKE5VTEwsICZsb2NrX3NlbSk7Ci0KLSAgICBpZiAocmMgIT0gMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VNRVJHLCBzZXJ2ZXJfY29uZiwKLQkJICAgICJDaGlsZCBjYW5ub3Qgb3BlbiBsb2NrIHNlbWFwaG9yZSwgcmM9JWQiLCByYyk7Ci0JY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERJTklUKTsKLSAgICB9IGVsc2UgewotICAgICAgICBhcF9yZWdpc3Rlcl9jbGVhbnVwKHAsIE5VTEwsIGFjY2VwdF9tdXRleF9jbGVhbnVwLCBhcF9udWxsX2NsZWFudXApOwotICAgIH0KLX0KLQotLyoKLSAqIEluaXRpYWxpemUgbXV0ZXggbG9jay4KLSAqIE11c3QgYmUgc2FmZSB0byBjYWxsIHRoaXMgb24gYSByZXN0YXJ0LgotICovCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfaW5pdChwb29sICpwKQotewotICAgIGludCByYyA9IERvc0NyZWF0ZU11dGV4U2VtKE5VTEwsICZsb2NrX3NlbSwgRENfU0VNX1NIQVJFRCwgRkFMU0UpOwotCi0gICAgaWYgKHJjICE9IDApIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FTUVSRywgc2VydmVyX2NvbmYsCi0JCSAgICAiUGFyZW50IGNhbm5vdCBjcmVhdGUgbG9jayBzZW1hcGhvcmUsIHJjPSVkIiwgcmMpOwotCWV4aXQoQVBFWElUX0lOSVQpOwotICAgIH0KLQotICAgIGFwX3JlZ2lzdGVyX2NsZWFudXAocCwgTlVMTCwgYWNjZXB0X211dGV4X2NsZWFudXAsIGFwX251bGxfY2xlYW51cCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9vbih2b2lkKQotewotICAgIGludCByYyA9IERvc1JlcXVlc3RNdXRleFNlbShsb2NrX3NlbSwgU0VNX0lOREVGSU5JVEVfV0FJVCk7Ci0KLSAgICBpZiAocmMgIT0gMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VNRVJHLCBzZXJ2ZXJfY29uZiwKLQkJICAgICJPUzJTRU06IEVycm9yICVkIGdldHRpbmcgYWNjZXB0IGxvY2suIEV4aXRpbmchIiwgcmMpOwotCWNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X29mZih2b2lkKQotewotICAgIGludCByYyA9IERvc1JlbGVhc2VNdXRleFNlbShsb2NrX3NlbSk7Ci0gICAgCi0gICAgaWYgKHJjICE9IDApIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FTUVSRywgc2VydmVyX2NvbmYsCi0JCSAgICAiT1MyU0VNOiBFcnJvciAlZCBmcmVlaW5nIGFjY2VwdCBsb2NrLiBFeGl0aW5nISIsIHJjKTsKLQljbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci19Ci0KLSNlbGlmIGRlZmluZWQoVVNFX1RQRl9DT1JFX1NFUklBTElaRURfQUNDRVBUKQotCi1zdGF0aWMgaW50IHRwZl9jb3JlX2hlbGQ7Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9jbGVhbnVwKHZvaWQgKmZvbykKLXsKLSAgICBpZih0cGZfY29yZV9oZWxkKQotICAgICAgICBjb3J1YyhSRVNPVVJDRV9LRVkpOwotfQotCi0jZGVmaW5lIGFjY2VwdF9tdXRleF9pbml0KHgpCi0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9jaGlsZF9pbml0KHBvb2wgKnApCi17Ci0gICAgYXBfcmVnaXN0ZXJfY2xlYW51cChwLCBOVUxMLCBhY2NlcHRfbXV0ZXhfY2xlYW51cCwgYXBfbnVsbF9jbGVhbnVwKTsKLSAgICB0cGZfY29yZV9oZWxkID0gMDsKLX0KLQotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X29uKHZvaWQpCi17Ci0gICAgY29yaGMoUkVTT1VSQ0VfS0VZKTsKLSAgICB0cGZfY29yZV9oZWxkID0gMTsKLSAgICBhcF9jaGVja19zaWduYWxzKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9vZmYodm9pZCkKLXsKLSAgICBjb3J1YyhSRVNPVVJDRV9LRVkpOwotICAgIHRwZl9jb3JlX2hlbGQgPSAwOwotICAgIGFwX2NoZWNrX3NpZ25hbHMoKTsKLX0KLQotI2Vsc2UKLS8qIERlZmF1bHQgLS0tIG5vIHNlcmlhbGl6YXRpb24uICBPdGhlciBtZXRob2RzICpjb3VsZCogZ28gaGVyZSwKLSAqIGFzICNlbGlmcy4uLgotICovCi0jaWYgIWRlZmluZWQoTVVMVElUSFJFQUQpCi0vKiBNdWx0aXRocmVhZGVkIHN5c3RlbXMgZG9uJ3QgY29tcGxldGUgYmV0d2VlbiBwcm9jZXNzZXMgZm9yCi0gKiB0aGUgc29ja2V0cy4gKi8KLSNkZWZpbmUgTk9fU0VSSUFMSVpFRF9BQ0NFUFQKLSNkZWZpbmUgYWNjZXB0X211dGV4X2NoaWxkX2luaXQoeCkKLSNkZWZpbmUgYWNjZXB0X211dGV4X2luaXQoeCkKLSNkZWZpbmUgYWNjZXB0X211dGV4X29uKCkKLSNkZWZpbmUgYWNjZXB0X211dGV4X29mZigpCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBPbiBzb21lIGFyY2hpdGVjdHVyZXMgaXQncyBzYWZlIHRvIGRvIHVuc2VyaWFsaXplZCBhY2NlcHQoKXMgaW4gdGhlIHNpbmdsZQotICogTGlzdGVuIGNhc2UuICBCdXQgaXQncyBuZXZlciBzYWZlIHRvIGRvIGl0IGluIHRoZSBjYXNlIHdoZXJlIHRoZXJlJ3MKLSAqIG11bHRpcGxlIExpc3RlbiBzdGF0ZW1lbnRzLiAgRGVmaW5lIFNJTkdMRV9MSVNURU5fVU5TRVJJQUxJWkVEX0FDQ0VQVAotICogd2hlbiBpdCdzIHNhZmUgaW4gdGhlIHNpbmdsZSBMaXN0ZW4gY2FzZS4KLSAqLwotI2lmZGVmIFNJTkdMRV9MSVNURU5fVU5TRVJJQUxJWkVEX0FDQ0VQVAotI2RlZmluZSBTQUZFX0FDQ0VQVChzdG10KSBkbyB7aWYoYXBfbGlzdGVuZXJzLT5uZXh0ICE9IGFwX2xpc3RlbmVycykge3N0bXQ7fX0gd2hpbGUoMCkKLSNlbHNlCi0jZGVmaW5lIFNBRkVfQUNDRVBUKHN0bXQpIGRvIHtzdG10O30gd2hpbGUoMCkKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCB1c2FnZShjaGFyICpiaW4pCi17Ci0gICAgY2hhciBwYWRbTUFYX1NUUklOR19MRU5dOwotICAgIHVuc2lnbmVkIGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgc3RybGVuKGJpbik7IGkrKykKLQlwYWRbaV0gPSAnICc7Ci0gICAgcGFkW2ldID0gJ1wwJzsKLSNpZmRlZiBTSEFSRURfQ09SRQotICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstUiBkaXJlY3RvcnldIFstRCBuYW1lXSBbLWQgZGlyZWN0b3J5XSBbLWYgZmlsZV1cbiIsIGJpbik7Ci0jZWxzZQotICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstRCBuYW1lXSBbLWQgZGlyZWN0b3J5XSBbLWYgZmlsZV1cbiIsIGJpbik7Ci0jZW5kaWYKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAlcyBbLUMgXCJkaXJlY3RpdmVcIl0gWy1jIFwiZGlyZWN0aXZlXCJdXG4iLCBwYWQpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICVzIFstdl0gWy1WXSBbLWhdIFstbF0gWy1MXSBbLVNdIFstdF0gWy1UXVxuIiwgcGFkKTsKLSNpZmRlZiBXSU4zMgotICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICVzIFstbiBzZXJ2aWNlXSBbLWsgc2lnbmFsXSBbLWldIFstdV1cbiIsIHBhZCk7Ci0jZW5kaWYKLSAgICBmcHJpbnRmKHN0ZGVyciwgIk9wdGlvbnM6XG4iKTsKLSNpZmRlZiBTSEFSRURfQ09SRQotICAgIGZwcmludGYoc3RkZXJyLCAiICAtUiBkaXJlY3RvcnkgICAgIDogc3BlY2lmeSBhbiBhbHRlcm5hdGUgbG9jYXRpb24gZm9yIHNoYXJlZCBvYmplY3QgZmlsZXNcbiIpOwotI2VuZGlmCi0gICAgZnByaW50ZihzdGRlcnIsICIgIC1EIG5hbWUgICAgICAgICAgOiBkZWZpbmUgYSBuYW1lIGZvciB1c2UgaW4gPElmRGVmaW5lIG5hbWU+IGRpcmVjdGl2ZXNcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAtZCBkaXJlY3RvcnkgICAgIDogc3BlY2lmeSBhbiBhbHRlcm5hdGUgaW5pdGlhbCBTZXJ2ZXJSb290XG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgLWYgZmlsZSAgICAgICAgICA6IHNwZWNpZnkgYW4gYWx0ZXJuYXRlIFNlcnZlckNvbmZpZ0ZpbGVcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAtQyBcImRpcmVjdGl2ZVwiICAgOiBwcm9jZXNzIGRpcmVjdGl2ZSBiZWZvcmUgcmVhZGluZyBjb25maWcgZmlsZXNcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAtYyBcImRpcmVjdGl2ZVwiICAgOiBwcm9jZXNzIGRpcmVjdGl2ZSBhZnRlciAgcmVhZGluZyBjb25maWcgZmlsZXNcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAtdiAgICAgICAgICAgICAgIDogc2hvdyB2ZXJzaW9uIG51bWJlclxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgIC1WICAgICAgICAgICAgICAgOiBzaG93IGNvbXBpbGUgc2V0dGluZ3NcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAtaCAgICAgICAgICAgICAgIDogbGlzdCBhdmFpbGFibGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgKHRoaXMgcGFnZSlcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAtbCAgICAgICAgICAgICAgIDogbGlzdCBjb21waWxlZC1pbiBtb2R1bGVzXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgLUwgICAgICAgICAgICAgICA6IGxpc3QgYXZhaWxhYmxlIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlc1xuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgIC1TICAgICAgICAgICAgICAgOiBzaG93IHBhcnNlZCBzZXR0aW5ncyAoY3VycmVudGx5IG9ubHkgdmhvc3Qgc2V0dGluZ3MpXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgLXQgICAgICAgICAgICAgICA6IHJ1biBzeW50YXggY2hlY2sgZm9yIGNvbmZpZyBmaWxlcyAod2l0aCBkb2Nyb290IGNoZWNrKVxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgIC1UICAgICAgICAgICAgICAgOiBydW4gc3ludGF4IGNoZWNrIGZvciBjb25maWcgZmlsZXMgKHdpdGhvdXQgZG9jcm9vdCBjaGVjaylcbiIpOwotI2lmZGVmIFdJTjMyCi0gICAgZnByaW50ZihzdGRlcnIsICIgIC1uIG5hbWUgICAgICAgICAgOiBzZXQgc2VydmljZSBuYW1lIGFuZCB1c2UgaXRzIFNlcnZlckNvbmZpZ0ZpbGVcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAtayBzaHV0ZG93biAgICAgIDogdGVsbCBydW5uaW5nIEFwYWNoZSB0byBzaHV0ZG93blxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgIC1rIHJlc3RhcnQgICAgICAgOiB0ZWxsIHJ1bm5pbmcgQXBhY2hlIHRvIGRvIGEgZ3JhY2VmdWwgcmVzdGFydFxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgIC1rIHN0YXJ0ICAgICAgICAgOiB0ZWxsIEFwYWNoZSB0byBzdGFydFxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgIC1pICAgICAgICAgICAgICAgOiBpbnN0YWxsIGFuIEFwYWNoZSBzZXJ2aWNlXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgLXUgICAgICAgICAgICAgICA6IHVuaW5zdGFsbCBhbiBBcGFjaGUgc2VydmljZVxuIik7Ci0jZW5kaWYKLSAgICBleGl0KDEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUaW1lb3V0IGhhbmRsaW5nLiAgRElTVElOQ1RMWSBub3QgdGhyZWFkLXNhZmUsIGJ1dCBhbGwgdGhpcyBzdHVmZgotICogaGFzIHRvIGNoYW5nZSBmb3IgdGhyZWFkcyBhbnl3YXkuICBOb3RlIHRoYXQgdGhpcyBjb2RlIGFsbG93cyBvbmx5Ci0gKiBvbmUgdGltZW91dCBpbiBwcm9ncmVzcyBhdCBhIHRpbWUuLi4KLSAqLwotCi1zdGF0aWMgQVBBQ0hFX1RMUyBjb25uX3JlYyAqdm9sYXRpbGUgY3VycmVudF9jb25uOwotc3RhdGljIEFQQUNIRV9UTFMgcmVxdWVzdF9yZWMgKnZvbGF0aWxlIHRpbWVvdXRfcmVxOwotc3RhdGljIEFQQUNIRV9UTFMgY29uc3QgY2hhciAqdm9sYXRpbGUgdGltZW91dF9uYW1lID0gTlVMTDsKLXN0YXRpYyBBUEFDSEVfVExTIGludCB2b2xhdGlsZSBhbGFybXNfYmxvY2tlZCA9IDA7Ci1zdGF0aWMgQVBBQ0hFX1RMUyBpbnQgdm9sYXRpbGUgYWxhcm1fcGVuZGluZyA9IDA7Ci0KLXN0YXRpYyB2b2lkIHRpbWVvdXQoaW50IHNpZykKLXsKLSAgICB2b2lkICpkaXJjb25mOwotCi0gICAgaWYgKGFsYXJtc19ibG9ja2VkKSB7Ci0JYWxhcm1fcGVuZGluZyA9IDE7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBpZiAoZXhpdF9hZnRlcl91bmJsb2NrKSB7Ci0JY2xlYW5fY2hpbGRfZXhpdCgwKTsKLSAgICB9Ci0KLSAgICBpZiAoIWN1cnJlbnRfY29ubikgewotCWFwX2xvbmdqbXAoam1wYnVmZmVyLCAxKTsKLSAgICB9Ci0KLSAgICBpZiAodGltZW91dF9yZXEgIT0gTlVMTCkKLQlkaXJjb25mID0gdGltZW91dF9yZXEtPnBlcl9kaXJfY29uZmlnOwotICAgIGVsc2UKLQlkaXJjb25mID0gY3VycmVudF9jb25uLT5zZXJ2ZXItPmxvb2t1cF9kZWZhdWx0czsKLSAgICBpZiAoIWN1cnJlbnRfY29ubi0+a2VwdGFsaXZlKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywKLQkJICAgICBjdXJyZW50X2Nvbm4tPnNlcnZlciwgIltjbGllbnQgJXNdICVzIHRpbWVkIG91dCIsCi0JCSAgICAgY3VycmVudF9jb25uLT5yZW1vdGVfaXAsCi0JCSAgICAgdGltZW91dF9uYW1lID8gdGltZW91dF9uYW1lIDogInJlcXVlc3QiKTsKLSAgICB9Ci0KLSAgICBpZiAodGltZW91dF9yZXEpIHsKLQkvKiBTb21lb25lIGhhcyBhc2tlZCBmb3IgdGhpcyB0cmFuc2FjdGlvbiB0byBqdXN0IGJlIGFib3J0ZWQKLQkgKiBpZiBpdCB0aW1lcyBvdXQuLi4KLQkgKi8KLQotCXJlcXVlc3RfcmVjICpsb2dfcmVxID0gdGltZW91dF9yZXE7Ci0JcmVxdWVzdF9yZWMgKnNhdmVfcmVxID0gdGltZW91dF9yZXE7Ci0KLQkvKiBhdm9pZCBsb29waW5nLi4uIGlmIGFwX2xvZ190cmFuc2FjdGlvbiBzdGFydGVkIGFub3RoZXIKLQkgKiB0aW1lciAoc2F5IHZpYSByZmMxNDEzLmMpIHdlIGNvdWxkIGxvb3AuLi4KLQkgKi8KLQl0aW1lb3V0X3JlcSA9IE5VTEw7Ci0KLQl3aGlsZSAobG9nX3JlcS0+bWFpbiB8fCBsb2dfcmVxLT5wcmV2KSB7Ci0JICAgIC8qIEdldCBiYWNrIHRvIG9yaWdpbmFsIHJlcXVlc3QuLi4gKi8KLQkgICAgaWYgKGxvZ19yZXEtPm1haW4pCi0JCWxvZ19yZXEgPSBsb2dfcmVxLT5tYWluOwotCSAgICBlbHNlCi0JCWxvZ19yZXEgPSBsb2dfcmVxLT5wcmV2OwotCX0KLQotCWlmICghY3VycmVudF9jb25uLT5rZXB0YWxpdmUpIHsKLQkgICAgLyogaW4gc29tZSBjYXNlcyB3ZSBjb21lIGhlcmUgYmVmb3JlIHNldHRpbmcgdGhlIHRpbWUgKi8KLQkgICAgaWYgKGxvZ19yZXEtPnJlcXVlc3RfdGltZSA9PSAwKSB7Ci0JICAgICAgbG9nX3JlcS0+cmVxdWVzdF90aW1lID0gdGltZSgwKTsKLQkgICAgfQotCSAgICBhcF9sb2dfdHJhbnNhY3Rpb24obG9nX3JlcSk7Ci0JfQotCi0JYXBfYnNldGZsYWcoc2F2ZV9yZXEtPmNvbm5lY3Rpb24tPmNsaWVudCwgQl9FT1VULCAxKTsKLQlhcF9iY2xvc2Uoc2F2ZV9yZXEtPmNvbm5lY3Rpb24tPmNsaWVudCk7Ci0KLQlpZiAoIWFwX3N0YW5kYWxvbmUpCi0JICAgIGV4aXQoMCk7Ci0KLQlhcF9sb25nam1wKGptcGJ1ZmZlciwgMSk7Ci0gICAgfQotICAgIGVsc2UgewkJCS8qIGFib3J0IHRoZSBjb25uZWN0aW9uICovCi0JYXBfYnNldGZsYWcoY3VycmVudF9jb25uLT5jbGllbnQsIEJfRU9VVCwgMSk7Ci0JYXBfYmNsb3NlKGN1cnJlbnRfY29ubi0+Y2xpZW50KTsKLQljdXJyZW50X2Nvbm4tPmFib3J0ZWQgPSAxOwotICAgIH0KLX0KLQotI2lmbmRlZiBUUEYKLS8qCi0gKiBUaGVzZSB0d28gY2FsbGVkIGZyb20gYWxsb2MuYyB0byBwcm90ZWN0IGl0cyBjcml0aWNhbCBzZWN0aW9ucy4uLgotICogTm90ZSB0aGF0IHRoZXkgY2FuIG5lc3QgKGFzIHdoZW4gZGVzdHJveWluZyB0aGUgc3ViX3Bvb2xzIG9mIGEgcG9vbAotICogd2hpY2ggaXMgaXRzZWxmIGJlaW5nIGNsZWFyZWQpOyB3ZSBoYXZlIHRvIHN1cHBvcnQgdGhhdCBoZXJlLgotICovCi0KLUFQSV9FWFBPUlQodm9pZCkgYXBfYmxvY2tfYWxhcm1zKHZvaWQpCi17Ci0gICAgKythbGFybXNfYmxvY2tlZDsKLX0KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF91bmJsb2NrX2FsYXJtcyh2b2lkKQotewotICAgIC0tYWxhcm1zX2Jsb2NrZWQ7Ci0gICAgaWYgKGFsYXJtc19ibG9ja2VkID09IDApIHsKLQlpZiAoZXhpdF9hZnRlcl91bmJsb2NrKSB7Ci0JICAgIC8qIFdlIGhhdmUgYSBjb3VwbGUgcmFjZSBjb25kaXRpb25zIHRvIGRlYWwgd2l0aCBoZXJlLCB3ZSBjYW4ndAotCSAgICAgKiBhbGxvdyBhIHRpbWVvdXQgdGhhdCBjb21lcyBpbiB0aGlzIHNtYWxsIGludGVydmFsIHRvIGFsbG93Ci0JICAgICAqIHRoZSBjaGlsZCB0byBqdW1wIGJhY2sgdG8gdGhlIG1haW4gbG9vcC4gIEluc3RlYWQgd2UgYmxvY2sKLQkgICAgICogYWxhcm1zIGFnYWluLCBhbmQgdGhlbiBub3RlIHRoYXQgZXhpdF9hZnRlcl91bmJsb2NrIGlzCi0JICAgICAqIGJlaW5nIGRlYWx0IHdpdGguICBXZSBjaG9vc2UgdGhpcyB3YXkgdG8gc29sdmUgdGhpcyBzbyB0aGF0Ci0JICAgICAqIHRoZSBjb21tb24gcGF0aCB0aHJvdWdoIHVuYmxvY2tfYWxhcm1zKCkgaXMgcmVhbGx5IHNob3J0LgotCSAgICAgKi8KLQkgICAgKythbGFybXNfYmxvY2tlZDsKLQkgICAgZXhpdF9hZnRlcl91bmJsb2NrID0gMDsKLQkgICAgY2xlYW5fY2hpbGRfZXhpdCgwKTsKLQl9Ci0JaWYgKGFsYXJtX3BlbmRpbmcpIHsKLQkgICAgYWxhcm1fcGVuZGluZyA9IDA7Ci0JICAgIHRpbWVvdXQoMCk7Ci0JfQotICAgIH0KLX0KLSNlbmRpZiAvKiBUUEYgKi8KLQotc3RhdGljIEFQQUNIRV9UTFMgdm9pZCAoKnZvbGF0aWxlIGFsYXJtX2ZuKSAoaW50KSA9IE5VTEw7Ci0jaWZkZWYgV0lOMzIKLXN0YXRpYyBBUEFDSEVfVExTIHVuc2lnbmVkIGludCBhbGFybV9leHBpcnlfdGltZSA9IDA7Ci0jZW5kaWYgLyogV0lOMzIgKi8KLQotI2lmbmRlZiBXSU4zMgotc3RhdGljIHZvaWQgYWxybV9oYW5kbGVyKGludCBzaWcpCi17Ci0gICAgaWYgKGFsYXJtX2ZuKSB7Ci0JKCphbGFybV9mbikgKHNpZyk7Ci0gICAgfQotfQotI2VuZGlmCi0KLXVuc2lnbmVkIGludCBhcF9zZXRfY2FsbGJhY2tfYW5kX2FsYXJtKHZvaWQgKCpmbikgKGludCksIGludCB4KQotewotICAgIHVuc2lnbmVkIGludCBvbGQ7Ci0KLSNpZmRlZiBXSU4zMgotICAgIG9sZCA9IGFsYXJtX2V4cGlyeV90aW1lOwotICAgIGlmIChvbGQpCi0Jb2xkIC09IHRpbWUoMCk7Ci0gICAgaWYgKHggPT0gMCkgewotCWFsYXJtX2ZuID0gTlVMTDsKLQlhbGFybV9leHBpcnlfdGltZSA9IDA7Ci0gICAgfQotICAgIGVsc2UgewotCWFsYXJtX2ZuID0gZm47Ci0JYWxhcm1fZXhwaXJ5X3RpbWUgPSB0aW1lKE5VTEwpICsgeDsKLSAgICB9Ci0jZWxzZQotICAgIGlmIChhbGFybV9mbiAmJiB4ICYmIGZuICE9IGFsYXJtX2ZuKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfREVCVUcsIE5VTEwsCi0JICAgICJhcF9zZXRfY2FsbGJhY2tfYW5kX2FsYXJtOiBwb3NzaWJsZSBuZXN0ZWQgdGltZXIhIik7Ci0gICAgfQotICAgIGFsYXJtX2ZuID0gZm47Ci0jaWZuZGVmIE9QVElNSVpFX1RJTUVPVVRTCi0gICAgb2xkID0gYWxhcm0oeCk7Ci0jZWxzZQotICAgIGlmIChjaGlsZF90aW1lb3V0cykgewotCW9sZCA9IGFsYXJtKHgpOwotICAgIH0KLSAgICBlbHNlIHsKLQkvKiBKdXN0IG5vdGUgdGhlIHRpbWVvdXQgaW4gb3VyIHNjb3JlYm9hcmQsIG5vIG5lZWQgdG8gY2FsbCB0aGUgc3lzdGVtLgotCSAqIFdlIGFsc28gbm90ZSB0aGF0IHRoZSB2aXJ0dWFsIHRpbWUgaGFzIGdvbmUgZm9yd2FyZC4KLQkgKi8KLQlhcF9jaGVja19zaWduYWxzKCk7Ci0Jb2xkID0gYXBfc2NvcmVib2FyZF9pbWFnZS0+c2VydmVyc1tteV9jaGlsZF9udW1dLnRpbWVvdXRfbGVuOwotCWFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbbXlfY2hpbGRfbnVtXS50aW1lb3V0X2xlbiA9IHg7Ci0JKythcF9zY29yZWJvYXJkX2ltYWdlLT5zZXJ2ZXJzW215X2NoaWxkX251bV0uY3VyX3Z0aW1lOwotICAgIH0KLSNlbmRpZgotI2VuZGlmCi0gICAgcmV0dXJuIChvbGQpOwotfQotCi0KLSNpZmRlZiBXSU4zMgotQVBJX0VYUE9SVChpbnQpIGFwX2NoZWNrX2FsYXJtKHZvaWQpCi17Ci0gICAgaWYgKGFsYXJtX2V4cGlyeV90aW1lKSB7Ci0JdW5zaWduZWQgaW50IHQ7Ci0KLQl0ID0gdGltZShOVUxMKTsKLQlpZiAodCA+PSBhbGFybV9leHBpcnlfdGltZSkgewotCSAgICBhbGFybV9leHBpcnlfdGltZSA9IDA7Ci0JICAgICgqYWxhcm1fZm4pICgwKTsKLQkgICAgcmV0dXJuICgtMSk7Ci0JfQotCWVsc2UgewotCSAgICByZXR1cm4gKGFsYXJtX2V4cGlyeV90aW1lIC0gdCk7Ci0JfQotICAgIH0KLSAgICBlbHNlCi0JcmV0dXJuICgwKTsKLX0KLSNlbmRpZiAvKiBXSU4zMiAqLwotCi0KLQotLyogcmVzZXRfdGltZW91dCAocmVxdWVzdF9yZWMgKikgcmVzZXRzIHRoZSB0aW1lb3V0IGluIGVmZmVjdCwKLSAqIGFzIGxvbmcgYXMgaXQgaGFzbid0IGV4cGlyZWQgYWxyZWFkeS4KLSAqLwotCi1BUElfRVhQT1JUKHZvaWQpIGFwX3Jlc2V0X3RpbWVvdXQocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAodGltZW91dF9uYW1lKSB7CQkvKiB0aW1lb3V0IGhhcyBiZWVuIHNldCAqLwotCWkgPSBhcF9zZXRfY2FsbGJhY2tfYW5kX2FsYXJtKGFsYXJtX2ZuLCByLT5zZXJ2ZXItPnRpbWVvdXQpOwotCWlmIChpID09IDApCQkvKiB0aW1lb3V0IGFscmVhZHkgZXhwaXJlZCwgc28gc2V0IGl0IGJhY2sgdG8gMCAqLwotCSAgICBhcF9zZXRfY2FsbGJhY2tfYW5kX2FsYXJtKGFsYXJtX2ZuLCAwKTsKLSAgICB9Ci19Ci0KLQotCi0KLXZvaWQgYXBfa2VlcGFsaXZlX3RpbWVvdXQoY2hhciAqbmFtZSwgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgdW5zaWduZWQgaW50IHRvOwotCi0gICAgdGltZW91dF9yZXEgPSByOwotICAgIHRpbWVvdXRfbmFtZSA9IG5hbWU7Ci0KLSAgICBpZiAoci0+Y29ubmVjdGlvbi0+a2VwdGFsaXZlKQotCXRvID0gci0+c2VydmVyLT5rZWVwX2FsaXZlX3RpbWVvdXQ7Ci0gICAgZWxzZQotCXRvID0gci0+c2VydmVyLT50aW1lb3V0OwotICAgIGFwX3NldF9jYWxsYmFja19hbmRfYWxhcm0odGltZW91dCwgdG8pOwotCi19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfaGFyZF90aW1lb3V0KGNoYXIgKm5hbWUsIHJlcXVlc3RfcmVjICpyKQotewotICAgIHRpbWVvdXRfcmVxID0gcjsKLSAgICB0aW1lb3V0X25hbWUgPSBuYW1lOwotCi0gICAgYXBfc2V0X2NhbGxiYWNrX2FuZF9hbGFybSh0aW1lb3V0LCByLT5zZXJ2ZXItPnRpbWVvdXQpOwotCi19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfc29mdF90aW1lb3V0KGNoYXIgKm5hbWUsIHJlcXVlc3RfcmVjICpyKQotewotICAgIHRpbWVvdXRfbmFtZSA9IG5hbWU7Ci0KLSAgICBhcF9zZXRfY2FsbGJhY2tfYW5kX2FsYXJtKHRpbWVvdXQsIHItPnNlcnZlci0+dGltZW91dCk7Ci0KLX0KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9raWxsX3RpbWVvdXQocmVxdWVzdF9yZWMgKmR1bW15KQotewotICAgIGFwX2NoZWNrX3NpZ25hbHMoKTsKLSAgICBhcF9zZXRfY2FsbGJhY2tfYW5kX2FsYXJtKE5VTEwsIDApOwotICAgIHRpbWVvdXRfcmVxID0gTlVMTDsKLSAgICB0aW1lb3V0X25hbWUgPSBOVUxMOwotfQotCi0KLS8qCi0gKiBNb3JlIG1hY2hpbmUtZGVwZW5kZW50IG5ldHdvcmtpbmcgZ29vby4uLiBvbiBzb21lIHN5c3RlbXMsCi0gKiB5b3UndmUgZ290IHRvIGJlICpyZWFsbHkqIHN1cmUgdGhhdCBhbGwgdGhlIHBhY2tldHMgYXJlIGFja25vd2xlZGdlZAotICogYmVmb3JlIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb24sIHNpbmNlIHRoZSBjbGllbnQgd2lsbCBub3QgYmUgYWJsZQotICogdG8gc2VlIHRoZSBsYXN0IHJlc3BvbnNlIGlmIHRoZWlyIFRDUCBidWZmZXIgaXMgZmx1c2hlZCBieSBhIFJTVAotICogcGFja2V0IGZyb20gdXMsIHdoaWNoIGlzIHdoYXQgdGhlIHNlcnZlcidzIFRDUCBzdGFjayB3aWxsIHNlbmQKLSAqIGlmIGl0IHJlY2VpdmVzIGFueSByZXF1ZXN0IGRhdGEgYWZ0ZXIgY2xvc2luZyB0aGUgY29ubmVjdGlvbi4KLSAqCi0gKiBJbiBhbiBpZGVhbCB3b3JsZCwgdGhpcyBmdW5jdGlvbiB3b3VsZCBiZSBhY2NvbXBsaXNoZWQgYnkgc2ltcGx5Ci0gKiBzZXR0aW5nIHRoZSBzb2NrZXQgb3B0aW9uIFNPX0xJTkdFUiBhbmQgaGFuZGxpbmcgaXQgd2l0aGluIHRoZQotICogc2VydmVyJ3MgVENQIHN0YWNrIHdoaWxlIHRoZSBwcm9jZXNzIGNvbnRpbnVlcyBvbiB0byB0aGUgbmV4dCByZXF1ZXN0LgotICogVW5mb3J0dW5hdGVseSwgaXQgc2VlbXMgdGhhdCBtb3N0IChpZiBub3QgYWxsKSBvcGVyYXRpbmcgc3lzdGVtcwotICogYmxvY2sgdGhlIHNlcnZlciBwcm9jZXNzIG9uIGNsb3NlKCkgd2hlbiBTT19MSU5HRVIgaXMgdXNlZC4KLSAqIEZvciB0aG9zZSB0aGF0IGRvbid0LCBzZWUgVVNFX1NPX0xJTkdFUiBiZWxvdy4gIEZvciB0aGUgcmVzdCwKLSAqIHdlIGhhdmUgY3JlYXRlZCBhIGhvbWUtYnJldyBsaW5nZXJpbmdfY2xvc2UuCi0gKgotICogTWFueSBvcGVyYXRpbmcgc3lzdGVtcyB0ZW5kIHRvIGJsb2NrLCBwdWtlLCBvciBvdGhlcndpc2UgbWlzaGFuZGxlCi0gKiBjYWxscyB0byBzaHV0ZG93biBvbmx5IGhhbGYgb2YgdGhlIGNvbm5lY3Rpb24uICBZb3Ugc2hvdWxkIGRlZmluZQotICogTk9fTElOR0NMT1NFIGluIGFwX2NvbmZpZy5oIGlmIHN1Y2ggaXMgdGhlIGNhc2UgZm9yIHlvdXIgc3lzdGVtLgotICovCi0jaWZuZGVmIE1BWF9TRUNTX1RPX0xJTkdFUgotI2RlZmluZSBNQVhfU0VDU19UT19MSU5HRVIgMzAKLSNlbmRpZgotCi0jaWZkZWYgVVNFX1NPX0xJTkdFUgotI2RlZmluZSBOT19MSU5HQ0xPU0UJCS8qIFRoZSB0d28gbGluZ2VyaW5nIG9wdGlvbnMgYXJlIGV4Y2x1c2l2ZSAqLwotCi1zdGF0aWMgdm9pZCBzb2NrX2VuYWJsZV9saW5nZXIoaW50IHMpCi17Ci0gICAgc3RydWN0IGxpbmdlciBsaTsKLQotICAgIGxpLmxfb25vZmYgPSAxOwotICAgIGxpLmxfbGluZ2VyID0gTUFYX1NFQ1NfVE9fTElOR0VSOwotCi0gICAgaWYgKHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fTElOR0VSLAotCQkgICAoY2hhciAqKSAmbGksIHNpemVvZihzdHJ1Y3QgbGluZ2VyKSkgPCAwKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIHNlcnZlcl9jb25mLAotCSAgICAgICAgICAgICJzZXRzb2Nrb3B0OiAoU09fTElOR0VSKSIpOwotCS8qIG5vdCBhIGZhdGFsIGVycm9yICovCi0gICAgfQotfQotCi0jZWxzZQotI2RlZmluZSBzb2NrX2VuYWJsZV9saW5nZXIocykJLyogTk9PUCAqLwotI2VuZGlmIC8qIFVTRV9TT19MSU5HRVIgKi8KLQotI2lmbmRlZiBOT19MSU5HQ0xPU0UKLQotLyogU3BlY2lhbCB2ZXJzaW9uIG9mIHRpbWVvdXQgZm9yIGxpbmdlcmluZ19jbG9zZSAqLwotCi1zdGF0aWMgdm9pZCBsaW5nZXJvdXQoaW50IHNpZykKLXsKLSAgICBpZiAoYWxhcm1zX2Jsb2NrZWQpIHsKLQlhbGFybV9wZW5kaW5nID0gMTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFjdXJyZW50X2Nvbm4pIHsKLQlhcF9sb25nam1wKGptcGJ1ZmZlciwgMSk7Ci0gICAgfQotICAgIGFwX2JzZXRmbGFnKGN1cnJlbnRfY29ubi0+Y2xpZW50LCBCX0VPVVQsIDEpOwotICAgIGN1cnJlbnRfY29ubi0+YWJvcnRlZCA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGxpbmdlcl90aW1lb3V0KHZvaWQpCi17Ci0gICAgdGltZW91dF9uYW1lID0gImxpbmdlcmluZyBjbG9zZSI7Ci0KLSAgICBhcF9zZXRfY2FsbGJhY2tfYW5kX2FsYXJtKGxpbmdlcm91dCwgTUFYX1NFQ1NfVE9fTElOR0VSKTsKLX0KLQotLyogU2luY2UgbWFueSBjbGllbnRzIHdpbGwgYWJvcnQgYSBjb25uZWN0aW9uIGluc3RlYWQgb2YgY2xvc2luZyBpdCwKLSAqIGF0dGVtcHRpbmcgdG8gbG9nIGFuIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGlzIHJvdXRpbmUgd2lsbCBvbmx5Ci0gKiBjb25mdXNlIHRoZSB3ZWJtYXN0ZXIuICBUaGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYW55IHBvcnRhYmxlIHdheSB0bwotICogZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIGRyb3BwZWQgY29ubmVjdGlvbiBhbmQgc29tZXRoaW5nIHRoYXQgbWlnaHQgYmUKLSAqIHdvcnRoIGxvZ2dpbmcuCi0gKi8KLXN0YXRpYyB2b2lkIGxpbmdlcmluZ19jbG9zZShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjaGFyIGR1bW15YnVmWzUxMl07Ci0gICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gICAgZmRfc2V0IGxmZHM7Ci0gICAgaW50IHNlbGVjdF9ydjsKLSAgICBpbnQgbHNkOwotCi0gICAgLyogUHJldmVudCBhIHNsb3ctZHJpcCBjbGllbnQgZnJvbSBob2xkaW5nIHVzIGhlcmUgaW5kZWZpbml0ZWx5ICovCi0KLSAgICBsaW5nZXJfdGltZW91dCgpOwotCi0gICAgLyogU2VuZCBhbnkgbGVmdG92ZXIgZGF0YSB0byB0aGUgY2xpZW50LCBidXQgbmV2ZXIgdHJ5IHRvIGFnYWluICovCi0KLSAgICBpZiAoYXBfYmZsdXNoKHItPmNvbm5lY3Rpb24tPmNsaWVudCkgPT0gLTEpIHsKLQlhcF9raWxsX3RpbWVvdXQocik7Ci0JYXBfYmNsb3NlKHItPmNvbm5lY3Rpb24tPmNsaWVudCk7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBhcF9ic2V0ZmxhZyhyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJfRU9VVCwgMSk7Ci0KLSAgICAvKiBDbG9zZSBvdXIgaGFsZiBvZiB0aGUgY29ubmVjdGlvbiAtLS0gc2VuZCB0aGUgY2xpZW50IGEgRklOICovCi0KLSAgICBsc2QgPSByLT5jb25uZWN0aW9uLT5jbGllbnQtPmZkOwotCi0gICAgaWYgKChzaHV0ZG93bihsc2QsIDEpICE9IDApIHx8IHItPmNvbm5lY3Rpb24tPmFib3J0ZWQpIHsKLQlhcF9raWxsX3RpbWVvdXQocik7Ci0JYXBfYmNsb3NlKHItPmNvbm5lY3Rpb24tPmNsaWVudCk7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIC8qIFNldCB1cCB0byB3YWl0IGZvciByZWFkYWJsZSBkYXRhIG9uIHNvY2tldC4uLiAqLwotCi0gICAgRkRfWkVSTygmbGZkcyk7Ci0KLSAgICAvKiBXYWl0IGZvciByZWFkYWJsZSBkYXRhIG9yIGVycm9yIGNvbmRpdGlvbiBvbiBzb2NrZXQ7Ci0gICAgICogc2x1cnAgdXAgYW55IGRhdGEgdGhhdCBhcnJpdmVzLi4uICBXZSBleGl0IHdoZW4gd2UgZ28gZm9yIGFuCi0gICAgICogaW50ZXJ2YWwgb2YgdHYgbGVuZ3RoIHdpdGhvdXQgZ2V0dGluZyBhbnkgbW9yZSBkYXRhLCBnZXQgYW4gZXJyb3IKLSAgICAgKiBmcm9tIHNlbGVjdCgpLCBnZXQgYW4gZXJyb3Igb3IgRU9GIG9uIGEgcmVhZCwgb3IgdGhlIHRpbWVyIGV4cGlyZXMuCi0gICAgICovCi0KLSAgICBkbyB7Ci0JLyogV2UgdXNlIGEgMiBzZWNvbmQgdGltZW91dCBiZWNhdXNlIGN1cnJlbnQgKEZlYiA5NykgYnJvd3NlcnMKLQkgKiBmYWlsIHRvIGNsb3NlIGEgY29ubmVjdGlvbiBhZnRlciB0aGUgc2VydmVyIGNsb3NlcyBpdC4gIFRodXMsCi0JICogdG8gYXZvaWQga2VlcGluZyB0aGUgY2hpbGQgYnVzeSwgd2UgYXJlIG9ubHkgbGluZ2VyaW5nIGxvbmcgZW5vdWdoCi0JICogZm9yIGEgY2xpZW50IHRoYXQgaXMgYWN0aXZlbHkgc2VuZGluZyBkYXRhIG9uIGEgY29ubmVjdGlvbi4KLQkgKiBUaGlzIHNob3VsZCBiZSBzdWZmaWNpZW50IHVubGVzcyB0aGUgY29ubmVjdGlvbiBpcyBtYXNzaXZlbHkKLQkgKiBsb3NpbmcgcGFja2V0cywgaW4gd2hpY2ggY2FzZSB3ZSBtaWdodCBoYXZlIG1pc3NlZCB0aGUgUlNUIGFueXdheS4KLQkgKiBUaGVzZSBwYXJhbWV0ZXJzIGFyZSByZXNldCBvbiBlYWNoIHBhc3MsIHNpbmNlIHRoZXkgbWlnaHQgYmUKLQkgKiBjaGFuZ2VkIGJ5IHNlbGVjdC4KLQkgKi8KLQlGRF9TRVQobHNkLCAmbGZkcyk7Ci0JdHYudHZfc2VjID0gMjsKLQl0di50dl91c2VjID0gMDsKLQotCXNlbGVjdF9ydiA9IGFwX3NlbGVjdChsc2QgKyAxLCAmbGZkcywgTlVMTCwgTlVMTCwgJnR2KTsKLQotICAgIH0gd2hpbGUgKChzZWxlY3RfcnYgPiAwKSAmJgotICAgICAgICAgICAgIChyZWFkKGxzZCwgZHVtbXlidWYsIHNpemVvZiBkdW1teWJ1ZikgPiAwKSk7Ci0KLSAgICAvKiBTaG91bGQgbm93IGhhdmUgc2VlbiBmaW5hbCBhY2suICBTYWZlIHRvIGZpbmFsbHkga2lsbCBzb2NrZXQgKi8KLQotICAgIGFwX2JjbG9zZShyLT5jb25uZWN0aW9uLT5jbGllbnQpOwotCi0gICAgYXBfa2lsbF90aW1lb3V0KHIpOwotfQotI2VuZGlmIC8qIG5kZWYgTk9fTElOR0NMT1NFICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZGVhbGluZyB3aXRoIG90aGVyIGNoaWxkcmVuCi0gKi8KLQotI2lmbmRlZiBOT19PVEhFUl9DSElMRAotQVBJX0VYUE9SVCh2b2lkKSBhcF9yZWdpc3Rlcl9vdGhlcl9jaGlsZChpbnQgcGlkLAotCQkgICAgICAgdm9pZCAoKm1haW50ZW5hbmNlKSAoaW50IHJlYXNvbiwgdm9pZCAqLCBhcF93YWl0X3Qgc3RhdHVzKSwKLQkJCSAgdm9pZCAqZGF0YSwgaW50IHdyaXRlX2ZkKQotewotICAgIG90aGVyX2NoaWxkX3JlYyAqb2NyOwotCi0gICAgb2NyID0gYXBfcGFsbG9jKHBjb25mLCBzaXplb2YoKm9jcikpOwotICAgIG9jci0+cGlkID0gcGlkOwotICAgIG9jci0+bWFpbnRlbmFuY2UgPSBtYWludGVuYW5jZTsKLSAgICBvY3ItPmRhdGEgPSBkYXRhOwotICAgIG9jci0+d3JpdGVfZmQgPSB3cml0ZV9mZDsKLSAgICBvY3ItPm5leHQgPSBvdGhlcl9jaGlsZHJlbjsKLSAgICBvdGhlcl9jaGlsZHJlbiA9IG9jcjsKLX0KLQotLyogbm90ZSB0aGF0IHNpbmNlIHRoaXMgY2FuIGJlIGNhbGxlZCBieSBhIG1haW50ZW5hbmNlIGZ1bmN0aW9uIHdoaWxlIHdlJ3JlCi0gKiBzY2FubmluZyB0aGUgb3RoZXJfY2hpbGRyZW4gbGlzdCwgYWxsIHNjYW5uZXJzIHNob3VsZCBwcm90ZWN0IHRoZW1zZWxmCi0gKiBieSBsb2FkaW5nIG9jci0+bmV4dCBiZWZvcmUgY2FsbGluZyBhbnkgbWFpbnRlbmFuY2UgZnVuY3Rpb24uCi0gKi8KLUFQSV9FWFBPUlQodm9pZCkgYXBfdW5yZWdpc3Rlcl9vdGhlcl9jaGlsZCh2b2lkICpkYXRhKQotewotICAgIG90aGVyX2NoaWxkX3JlYyAqKnBvY3IsICpub2NyOwotCi0gICAgZm9yIChwb2NyID0gJm90aGVyX2NoaWxkcmVuOyAqcG9jcjsgcG9jciA9ICYoKnBvY3IpLT5uZXh0KSB7Ci0JaWYgKCgqcG9jciktPmRhdGEgPT0gZGF0YSkgewotCSAgICBub2NyID0gKCpwb2NyKS0+bmV4dDsKLQkgICAgKCooKnBvY3IpLT5tYWludGVuYW5jZSkgKE9DX1JFQVNPTl9VTlJFR0lTVEVSLCAoKnBvY3IpLT5kYXRhLCAtMSk7Ci0JICAgICpwb2NyID0gbm9jcjsKLQkgICAgLyogWFhYOiB1bSwgd2VsbCB3ZSd2ZSBqdXN0IHdhc3RlZCBzb21lIHNwYWNlIGluIHBjb25mID8gKi8KLQkgICAgcmV0dXJuOwotCX0KLSAgICB9Ci19Ci0KLS8qIHRlc3QgdG8gZW5zdXJlIHRoYXQgdGhlIHdyaXRlX2ZkcyBhcmUgYWxsIHN0aWxsIHdyaXRhYmxlLCBvdGhlcndpc2UKLSAqIGludm9rZSB0aGUgbWFpbnRlbmFuY2UgZnVuY3Rpb25zIGFzIGFwcHJvcHJpYXRlICovCi1zdGF0aWMgdm9pZCBwcm9iZV93cml0YWJsZV9mZHModm9pZCkKLXsKLSAgICBmZF9zZXQgd3JpdGFibGVfZmRzOwotICAgIGludCBmZF9tYXg7Ci0gICAgb3RoZXJfY2hpbGRfcmVjICpvY3IsICpub2NyOwotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgIGludCByYzsKLQotICAgIGlmIChvdGhlcl9jaGlsZHJlbiA9PSBOVUxMKQotCXJldHVybjsKLQotICAgIGZkX21heCA9IDA7Ci0gICAgRkRfWkVSTygmd3JpdGFibGVfZmRzKTsKLSAgICBkbyB7Ci0JZm9yIChvY3IgPSBvdGhlcl9jaGlsZHJlbjsgb2NyOyBvY3IgPSBvY3ItPm5leHQpIHsKLQkgICAgaWYgKG9jci0+d3JpdGVfZmQgPT0gLTEpCi0JCWNvbnRpbnVlOwotCSAgICBGRF9TRVQob2NyLT53cml0ZV9mZCwgJndyaXRhYmxlX2Zkcyk7Ci0JICAgIGlmIChvY3ItPndyaXRlX2ZkID4gZmRfbWF4KSB7Ci0JCWZkX21heCA9IG9jci0+d3JpdGVfZmQ7Ci0JICAgIH0KLQl9Ci0JaWYgKGZkX21heCA9PSAwKQotCSAgICByZXR1cm47Ci0KLQl0di50dl9zZWMgPSAwOwotCXR2LnR2X3VzZWMgPSAwOwotCXJjID0gYXBfc2VsZWN0KGZkX21heCArIDEsIE5VTEwsICZ3cml0YWJsZV9mZHMsIE5VTEwsICZ0dik7Ci0gICAgfSB3aGlsZSAocmMgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgaWYgKHJjID09IC0xKSB7Ci0JLyogWFhYOiB1aGggdGhpcyBjb3VsZCBiZSByZWFsbHkgYmFkLCB3ZSBjb3VsZCBoYXZlIGEgYmFkIGZpbGUKLQkgKiBkZXNjcmlwdG9yIGR1ZSB0byBhIGJ1ZyBpbiBvbmUgb2YgdGhlIG1haW50ZW5hbmNlIHJvdXRpbmVzICovCi0JYXBfbG9nX3VuaXhlcnIoInByb2JlX3dyaXRhYmxlX2ZkcyIsICJzZWxlY3QiLAotCQkgICAgImNvdWxkIG5vdCBwcm9iZSB3cml0YWJsZSBmZHMiLCBzZXJ2ZXJfY29uZik7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBpZiAocmMgPT0gMCkKLQlyZXR1cm47Ci0KLSAgICBmb3IgKG9jciA9IG90aGVyX2NoaWxkcmVuOyBvY3I7IG9jciA9IG5vY3IpIHsKLQlub2NyID0gb2NyLT5uZXh0OwotCWlmIChvY3ItPndyaXRlX2ZkID09IC0xKQotCSAgICBjb250aW51ZTsKLQlpZiAoRkRfSVNTRVQob2NyLT53cml0ZV9mZCwgJndyaXRhYmxlX2ZkcykpCi0JICAgIGNvbnRpbnVlOwotCSgqb2NyLT5tYWludGVuYW5jZSkgKE9DX1JFQVNPTl9VTldSSVRBQkxFLCBvY3ItPmRhdGEsIC0xKTsKLSAgICB9Ci19Ci0KLS8qIHBvc3NpYmx5IHJlYXAgYW4gb3RoZXJfY2hpbGQsIHJldHVybiAwIGlmIHllcywgLTEgaWYgbm90ICovCi1zdGF0aWMgaW50IHJlYXBfb3RoZXJfY2hpbGQoaW50IHBpZCwgYXBfd2FpdF90IHN0YXR1cykKLXsKLSAgICBvdGhlcl9jaGlsZF9yZWMgKm9jciwgKm5vY3I7Ci0KLSAgICBmb3IgKG9jciA9IG90aGVyX2NoaWxkcmVuOyBvY3I7IG9jciA9IG5vY3IpIHsKLQlub2NyID0gb2NyLT5uZXh0OwotCWlmIChvY3ItPnBpZCAhPSBwaWQpCi0JICAgIGNvbnRpbnVlOwotCW9jci0+cGlkID0gLTE7Ci0JKCpvY3ItPm1haW50ZW5hbmNlKSAoT0NfUkVBU09OX0RFQVRILCBvY3ItPmRhdGEsIHN0YXR1cyk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBEZWFsaW5nIHdpdGggdGhlIHNjb3JlYm9hcmQuLi4gYSBsb3Qgb2YgdGhlc2UgdmFyaWFibGVzIGFyZSBnbG9iYWwKLSAqIG9ubHkgdG8gYXZvaWQgZ2V0dGluZyBjbG9iYmVyZWQgYnkgdGhlIGxvbmdqbXAoKSB0aGF0IGhhcHBlbnMgd2hlbgotICogYSBoYXJkIHRpbWVvdXQgZXhwaXJlcy4uLgotICoKLSAqIFdlIGJlZ2luIHdpdGggcm91dGluZXMgd2hpY2ggZGVhbCB3aXRoIHRoZSBmaWxlIGl0c2VsZi4uLiAKLSAqLwotCi0jaWZkZWYgTVVMVElUSFJFQUQKLS8qCi0gKiBJbiB0aGUgbXVsdGl0aHJlYWRlZCBtb2RlLCBoYXZlIG11bHRpcGxlIHRocmVhZHMgLSBub3QgbXVsdGlwbGUKLSAqIHByb2Nlc3NlcyB0aGF0IG5lZWQgdG8gdGFsayB0byBlYWNoIG90aGVyLiBKdXN0IHVzZSBhIHNpbXBsZQotICogbWFsbG9jLiBCdXQgbGV0IHRoZSByb3V0aW5lcyB0aGF0IGZvbGxvdywgdGhpbmsgdGhhdCB5b3UgaGF2ZQotICogc2hhcmVkIG1lbW9yeSAoc28gdGhleSB1c2UgbWVtY3B5IGV0Yy4pCi0gKi8KLQotc3RhdGljIHZvaWQgcmVpbml0X3Njb3JlYm9hcmQocG9vbCAqcCkKLXsKLSAgICBhcF9hc3NlcnQoIWFwX3Njb3JlYm9hcmRfaW1hZ2UpOwotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UgPSAoc2NvcmVib2FyZCAqKSBtYWxsb2MoU0NPUkVCT0FSRF9TSVpFKTsKLSAgICBpZiAoYXBfc2NvcmVib2FyZF9pbWFnZSA9PSBOVUxMKSB7Ci0JZnByaW50ZihzdGRlcnIsICJPdWNoISAgT3V0IG9mIG1lbW9yeSByZWluaXRpbmcgc2NvcmVib2FyZCFcbiIpOwotICAgIH0KLSAgICBtZW1zZXQoYXBfc2NvcmVib2FyZF9pbWFnZSwgMCwgU0NPUkVCT0FSRF9TSVpFKTsKLX0KLQotdm9pZCBjbGVhbnVwX3Njb3JlYm9hcmQodm9pZCkKLXsKLSAgICBhcF9hc3NlcnQoYXBfc2NvcmVib2FyZF9pbWFnZSk7Ci0gICAgZnJlZShhcF9zY29yZWJvYXJkX2ltYWdlKTsKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlID0gTlVMTDsKLX0KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9zeW5jX3Njb3JlYm9hcmRfaW1hZ2Uodm9pZCkKLXsKLX0KLQotCi0jZWxzZSAvKiBNVUxUSVRIUkVBRCAqLwotI2lmIGRlZmluZWQoVVNFX09TMl9TQ09SRUJPQVJEKQotCi0vKiBUaGUgbmV4dCB0d28gcm91dGluZXMgYXJlIHVzZWQgdG8gYWNjZXNzIHNoYXJlZCBtZW1vcnkgdW5kZXIgT1MvMi4gICovCi0vKiBUaGlzIHJlcXVpcmVzIEVNWCB2MDljIHRvIGJlIGluc3RhbGxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1jYWRkcl90IGNyZWF0ZV9zaGFyZWRfaGVhcChjb25zdCBjaGFyICpuYW1lLCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBVTE9ORyByYzsKLSAgICB2b2lkICptZW07Ci0gICAgSGVhcF90IGg7Ci0KLSAgICByYyA9IERvc0FsbG9jU2hhcmVkTWVtKCZtZW0sIG5hbWUsIHNpemUsCi0JCQkgICBQQUdfQ09NTUlUIHwgUEFHX1JFQUQgfCBQQUdfV1JJVEUpOwotICAgIGlmIChyYyAhPSAwKQotCXJldHVybiBOVUxMOwotICAgIGggPSBfdWNyZWF0ZShtZW0sIHNpemUsICFfQkxPQ0tfQ0xFQU4sIF9IRUFQX1JFR1VMQVIgfCBfSEVBUF9TSEFSRUQsCi0JCSBOVUxMLCBOVUxMKTsKLSAgICBpZiAoaCA9PSBOVUxMKQotCURvc0ZyZWVNZW0obWVtKTsKLSAgICByZXR1cm4gKGNhZGRyX3QpIGg7Ci19Ci0KLWNhZGRyX3QgZ2V0X3NoYXJlZF9oZWFwKGNvbnN0IGNoYXIgKk5hbWUpCi17Ci0KLSAgICBQVk9JRCBCYXNlQWRkcmVzczsJCS8qIFBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZgotCQkJCSAgIHRoZSBzaGFyZWQgbWVtb3J5IG9iamVjdCAqLwotICAgIFVMT05HIEF0dHJpYnV0ZUZsYWdzOwkvKiBGbGFncyBkZXNjcmliaW5nIGNoYXJhY3RlcmlzdGljcwotCQkJCSAgIG9mIHRoZSBzaGFyZWQgbWVtb3J5IG9iamVjdCAqLwotICAgIEFQSVJFVCByYzsJCQkvKiBSZXR1cm4gY29kZSAqLwotCi0gICAgLyogUmVxdWVzdCByZWFkIGFuZCB3cml0ZSBhY2Nlc3MgdG8gKi8KLSAgICAvKiAgIHRoZSBzaGFyZWQgbWVtb3J5IG9iamVjdCAgICAgICAqLwotICAgIEF0dHJpYnV0ZUZsYWdzID0gUEFHX1dSSVRFIHwgUEFHX1JFQUQ7Ci0KLSAgICByYyA9IERvc0dldE5hbWVkU2hhcmVkTWVtKCZCYXNlQWRkcmVzcywgTmFtZSwgQXR0cmlidXRlRmxhZ3MpOwotCi0gICAgaWYgKHJjICE9IDApIHsKLQlwcmludGYoIkRvc0dldE5hbWVkU2hhcmVkTWVtIGVycm9yOiByZXR1cm4gY29kZSA9ICVsZCIsIHJjKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gQmFzZUFkZHJlc3M7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldHVwX3NoYXJlZF9tZW0ocG9vbCAqcCkKLXsKLSAgICBjYWRkcl90IG07Ci0KLSAgICBpbnQgcmM7Ci0KLSAgICBtID0gKGNhZGRyX3QpIGNyZWF0ZV9zaGFyZWRfaGVhcCgiXFxTSEFSRU1FTVxcU0NPUkVCT0FSRCIsIFNDT1JFQk9BUkRfU0laRSk7Ci0gICAgaWYgKG0gPT0gMCkgewotCWZwcmludGYoc3RkZXJyLCAiJXM6IENvdWxkIG5vdCBjcmVhdGUgT1MvMiBTaGFyZWQgbWVtb3J5IHBvb2wuXG4iLAotCQlhcF9zZXJ2ZXJfYXJndjApOwotCWV4aXQoQVBFWElUX0lOSVQpOwotICAgIH0KLQotICAgIHJjID0gX3VvcGVuKChIZWFwX3QpIG0pOwotICAgIGlmIChyYyAhPSAwKSB7Ci0JZnByaW50ZihzdGRlcnIsCi0JCSIlczogQ291bGQgbm90IHVvcGVuKCkgbmV3bHkgY3JlYXRlZCBPUy8yIFNoYXJlZCBtZW1vcnkgcG9vbC5cbiIsCi0JCWFwX3NlcnZlcl9hcmd2MCk7Ci0gICAgfQotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UgPSAoc2NvcmVib2FyZCAqKSBtOwotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbC5ydW5uaW5nX2dlbmVyYXRpb24gPSAwOwotfQotCi1zdGF0aWMgdm9pZCByZW9wZW5fc2NvcmVib2FyZChwb29sICpwKQotewotICAgIGNhZGRyX3QgbTsKLSAgICBpbnQgcmM7Ci0KLSAgICBtID0gKGNhZGRyX3QpIGdldF9zaGFyZWRfaGVhcCgiXFxTSEFSRU1FTVxcU0NPUkVCT0FSRCIpOwotICAgIGlmIChtID09IDApIHsKLQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBDb3VsZCBub3QgZmluZCBleGlzdGluZyBPUy8yIFNoYXJlZCBtZW1vcnkgcG9vbC5cbiIsCi0JCWFwX3NlcnZlcl9hcmd2MCk7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotCi0gICAgcmMgPSBfdW9wZW4oKEhlYXBfdCkgbSk7Ci0gICAgYXBfc2NvcmVib2FyZF9pbWFnZSA9IChzY29yZWJvYXJkICopIG07Ci19Ci0KLSNlbGlmIGRlZmluZWQoVVNFX1BPU0lYX1NDT1JFQk9BUkQpCi0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLS8qIAotICogUE9TSVggMTAwMy40IHN0eWxlCi0gKgotICogTm90ZSAxOiAKLSAqIEFzIG9mIHZlcnNpb24gNC4yM0EsIHNoYXJlZCBtZW1vcnkgaW4gUU5YIG11c3QgcmVzaWRlIHVuZGVyIC9kZXYvc2htZW0sCi0gKiB3aGVyZSBubyBzdWJkaXJlY3RvcmllcyBhbGxvd2VkLgotICoKLSAqIFBPU0lYIHNobV9vcGVuKCkgYW5kIHNobV91bmxpbmsoKSB3aWxsIHRha2UgY2FyZSBhYm91dCB0aGlzIGlzc3VlLAotICogYnV0IHRvIGF2b2lkIGNvbmZ1c2lvbiwgSSBzdWdnZXN0IHRvIHJlZGVmaW5lIHNjb3JlYm9hcmQgZmlsZSBuYW1lCi0gKiBpbiBodHRwZC5jb25mIHRvIGN1dCAibG9ncy8iIGZyb20gaXQuIFdpdGggZGVmYXVsdCBzZXR1cCBhY3R1YWwgbmFtZQotICogd2lsbCBiZSAiL2Rldi9zaG1lbS9sb2dzLmFwYWNoZV9zdGF0dXMiLiAKLSAqIAotICogSWYgc29tZXRoaW5nIHdlbnQgd3JvbmcgYW5kIEFwYWNoZSBkaWQgbm90IHVubGlua2VkIHRoaXMgb2JqZWN0IHVwb24KLSAqIGV4aXQsIHlvdSBjYW4gcmVtb3ZlIGl0IG1hbnVhbGx5LCB1c2luZyAicm0gLWYiIGNvbW1hbmQuCi0gKiAKLSAqIE5vdGUgMjoKLSAqIDxzeXMvbW1hbi5oPiBpbiBRTlggZGVmaW5lcyBNQVBfQU5PTiwgYnV0IGN1cnJlbnQgaW1wbGVtZW50YXRpb24gCi0gKiBkb2VzIE5PVCBzdXBwb3J0IEJTRCBzdHlsZSBhbm9ueW1vdXMgbWFwcGluZy4gU28sIHRoZSBvcmRlciBvZiAKLSAqIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGlzIGltcG9ydGFudDogCi0gKiB0aGlzICNpZmRlZiBzZWN0aW9uIG11c3QgYmUgQUJPVkUgdGhlIG5leHQgb25lIChCU0Qgc3R5bGUpLgotICoKLSAqIEkgdGVzdGVkIHRoaXMgc3R1ZmYgYW5kIGl0IHdvcmtzIGZpbmUgZm9yIG1lLCBidXQgaWYgaXQgcHJvdmlkZXMgCi0gKiB0cm91YmxlIGZvciB5b3UsIGp1c3QgY29tbWVudCBvdXQgVVNFX01NQVBfU0NPUkVCT0FSRCBpbiBRTlggc2VjdGlvbgotICogb2YgYXBfY29uZmlnLmgKLSAqCi0gKiBKdW5lIDUsIDE5OTcsIAotICogSWdvciBOLiBLb3ZhbGVua28gLS0gaW5mb2hAbWFpbC53cGx1cy5uZXQKLSAqLwotCi1zdGF0aWMgdm9pZCBjbGVhbnVwX3NoYXJlZF9tZW0odm9pZCAqZCkKLXsKLSAgICBzaG1fdW5saW5rKGFwX3Njb3JlYm9hcmRfZm5hbWUpOwotfQotCi1zdGF0aWMgdm9pZCBzZXR1cF9zaGFyZWRfbWVtKHBvb2wgKnApCi17Ci0gICAgY2hhciBidWZbNTEyXTsKLSAgICBjYWRkcl90IG07Ci0gICAgaW50IGZkOwotCi0gICAgZmQgPSBzaG1fb3BlbihhcF9zY29yZWJvYXJkX2ZuYW1lLCBPX1JEV1IgfCBPX0NSRUFULCBTX0lSVVNSIHwgU19JV1VTUik7Ci0gICAgaWYgKGZkID09IC0xKSB7Ci0JYXBfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzOiBjb3VsZCBub3Qgb3BlbihjcmVhdGUpIHNjb3JlYm9hcmQiLAotCQkgICAgYXBfc2VydmVyX2FyZ3YwKTsKLQlwZXJyb3IoYnVmKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0gICAgaWYgKGx0cnVuYyhmZCwgKG9mZl90KSBTQ09SRUJPQVJEX1NJWkUsIFNFRUtfU0VUKSA9PSAtMSkgewotCWFwX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlczogY291bGQgbm90IGx0cnVuYyBzY29yZWJvYXJkIiwKLQkJICAgIGFwX3NlcnZlcl9hcmd2MCk7Ci0JcGVycm9yKGJ1Zik7Ci0Jc2htX3VubGluayhhcF9zY29yZWJvYXJkX2ZuYW1lKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0gICAgaWYgKChtID0gKGNhZGRyX3QpIG1tYXAoKGNhZGRyX3QpIDAsCi0JCQkgICAgKHNpemVfdCkgU0NPUkVCT0FSRF9TSVpFLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCQkJICAgIE1BUF9TSEFSRUQsIGZkLCAob2ZmX3QpIDApKSA9PSAoY2FkZHJfdCkgLSAxKSB7Ci0JYXBfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzOiBjYW5ub3QgbW1hcCBzY29yZWJvYXJkIiwKLQkJICAgIGFwX3NlcnZlcl9hcmd2MCk7Ci0JcGVycm9yKGJ1Zik7Ci0Jc2htX3VubGluayhhcF9zY29yZWJvYXJkX2ZuYW1lKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0gICAgY2xvc2UoZmQpOwotICAgIGFwX3JlZ2lzdGVyX2NsZWFudXAocCwgTlVMTCwgY2xlYW51cF9zaGFyZWRfbWVtLCBhcF9udWxsX2NsZWFudXApOwotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UgPSAoc2NvcmVib2FyZCAqKSBtOwotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbC5ydW5uaW5nX2dlbmVyYXRpb24gPSAwOwotfQotCi1zdGF0aWMgdm9pZCByZW9wZW5fc2NvcmVib2FyZChwb29sICpwKQotewotfQotCi0jZWxpZiBkZWZpbmVkKFVTRV9NTUFQX1NDT1JFQk9BUkQpCi0KLXN0YXRpYyB2b2lkIHNldHVwX3NoYXJlZF9tZW0ocG9vbCAqcCkKLXsKLSAgICBjYWRkcl90IG07Ci0KLSNpZiBkZWZpbmVkKE1BUF9BTk9OKQotLyogQlNEIHN0eWxlICovCi0jaWZkZWYgQ09OVkVYT1MxMQotICAgIC8qCi0gICAgICogOS1BdWctOTcgLSBKZWZmIFZlbnRlcnMgKHZlbnRlcnNAY29udmV4LmhwLmNvbSkKLSAgICAgKiBDb252ZXhPUyBtYXBzIGFkZHJlc3Mgc3BhY2UgYXMgZm9sbG93czoKLSAgICAgKiAgIDB4MDAwMDAwMDAgLSAweDdmZmZmZmZmIDogS2VybmVsCi0gICAgICogICAweDgwMDAwMDAwIC0gMHhmZmZmZmZmZiA6IFVzZXIKLSAgICAgKiBTdGFydCBtbWFwcGVkIGFyZWEgMUdCIGFib3ZlIHN0YXJ0IG9mIHRleHQuCi0gICAgICoKLSAgICAgKiBBbHNvLCB0aGUgbGVuZ3RoIHJlcXVpcmVzIGEgcG9pbnRlciBhcyB0aGUgYWN0dWFsIGxlbmd0aCBpcwotICAgICAqIHJldHVybmVkIChyb3VuZGVkIHVwIHRvIGEgcGFnZSBib3VuZGFyeSkuCi0gICAgICovCi0gICAgewotCXVuc2lnbmVkIGxlbiA9IFNDT1JFQk9BUkRfU0laRTsKLQotCW0gPSBtbWFwKChjYWRkcl90KSAweEMwMDAwMDAwLCAmbGVuLAotCQkgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX0FOT04gfCBNQVBfU0hBUkVELCBOT0ZELCAwKTsKLSAgICB9Ci0jZWxpZiBkZWZpbmVkKE1BUF9UTVBGSUxFKQotICAgIHsKLQljaGFyIG1maWxlW10gPSAiL3RtcC9hcGFjaGVfc2htZW1fWFhYWCI7Ci0JaW50IGZkID0gbWtzdGVtcChtZmlsZSk7Ci0JaWYgKGZkID09IC0xKSB7Ci0JICAgIHBlcnJvcigib3BlbiIpOwotCSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBDb3VsZCBub3Qgb3BlbiAlc1xuIiwgYXBfc2VydmVyX2FyZ3YwLCBtZmlsZSk7Ci0JICAgIGV4aXQoQVBFWElUX0lOSVQpOwotCX0KLQltID0gbW1hcCgoY2FkZHJfdCkgMCwgU0NPUkVCT0FSRF9TSVpFLAotCQlQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBmZCwgMCk7Ci0JaWYgKG0gPT0gKGNhZGRyX3QpIC0gMSkgewotCSAgICBwZXJyb3IoIm1tYXAiKTsKLQkgICAgZnByaW50ZihzdGRlcnIsICIlczogQ291bGQgbm90IG1tYXAgJXNcbiIsIGFwX3NlcnZlcl9hcmd2MCwgbWZpbGUpOwotCSAgICBleGl0KEFQRVhJVF9JTklUKTsKLQl9Ci0JY2xvc2UoZmQpOwotCXVubGluayhtZmlsZSk7Ci0gICAgfQotI2Vsc2UKLSAgICBtID0gbW1hcCgoY2FkZHJfdCkgMCwgU0NPUkVCT0FSRF9TSVpFLAotCSAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX0FOT04gfCBNQVBfU0hBUkVELCAtMSwgMCk7Ci0jZW5kaWYKLSAgICBpZiAobSA9PSAoY2FkZHJfdCkgLSAxKSB7Ci0JcGVycm9yKCJtbWFwIik7Ci0JZnByaW50ZihzdGRlcnIsICIlczogQ291bGQgbm90IG1tYXAgbWVtb3J5XG4iLCBhcF9zZXJ2ZXJfYXJndjApOwotCWV4aXQoQVBFWElUX0lOSVQpOwotICAgIH0KLSNlbHNlCi0vKiBTdW4gc3R5bGUgKi8KLSAgICBpbnQgZmQ7Ci0KLSAgICBmZCA9IG9wZW4oIi9kZXYvemVybyIsIE9fUkRXUik7Ci0gICAgaWYgKGZkID09IC0xKSB7Ci0JcGVycm9yKCJvcGVuIik7Ci0JZnByaW50ZihzdGRlcnIsICIlczogQ291bGQgbm90IG9wZW4gL2Rldi96ZXJvXG4iLCBhcF9zZXJ2ZXJfYXJndjApOwotCWV4aXQoQVBFWElUX0lOSVQpOwotICAgIH0KLSAgICBtID0gbW1hcCgoY2FkZHJfdCkgMCwgU0NPUkVCT0FSRF9TSVpFLAotCSAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmQsIDApOwotICAgIGlmIChtID09IChjYWRkcl90KSAtIDEpIHsKLQlwZXJyb3IoIm1tYXAiKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBDb3VsZCBub3QgbW1hcCAvZGV2L3plcm9cbiIsIGFwX3NlcnZlcl9hcmd2MCk7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIGNsb3NlKGZkKTsKLSNlbmRpZgotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UgPSAoc2NvcmVib2FyZCAqKSBtOwotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbC5ydW5uaW5nX2dlbmVyYXRpb24gPSAwOwotfQotCi1zdGF0aWMgdm9pZCByZW9wZW5fc2NvcmVib2FyZChwb29sICpwKQotewotfQotCi0jZWxpZiBkZWZpbmVkKFVTRV9TSE1HRVRfU0NPUkVCT0FSRCkKLXN0YXRpYyBrZXlfdCBzaG1rZXkgPSBJUENfUFJJVkFURTsKLXN0YXRpYyBpbnQgc2htaWQgPSAtMTsKLQotc3RhdGljIHZvaWQgc2V0dXBfc2hhcmVkX21lbShwb29sICpwKQotewotICAgIHN0cnVjdCBzaG1pZF9kcyBzaG1idWY7Ci0jaWZkZWYgTU9WRUJSRUFLCi0gICAgY2hhciAqb2JyazsKLSNlbmRpZgotCi0gICAgaWYgKChzaG1pZCA9IHNobWdldChzaG1rZXksIFNDT1JFQk9BUkRfU0laRSwgSVBDX0NSRUFUIHwgU0hNX1IgfCBTSE1fVykpID09IC0xKSB7Ci0jaWZkZWYgTElOVVgKLQlpZiAoZXJybm8gPT0gRU5PU1lTKSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VNRVJHLCBzZXJ2ZXJfY29uZiwKLQkJCSAiWW91ciBrZXJuZWwgd2FzIGJ1aWx0IHdpdGhvdXQgQ09ORklHX1NZU1ZJUENcbiIKLQkJCSAiJXM6IFBsZWFzZSBjb25zdWx0IHRoZSBBcGFjaGUgRkFRIGZvciBkZXRhaWxzIiwKLQkJCSBhcF9zZXJ2ZXJfYXJndjApOwotCX0KLSNlbmRpZgotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FTUVSRywgc2VydmVyX2NvbmYsCi0JCSAgICAiY291bGQgbm90IGNhbGwgc2htZ2V0Iik7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgc2VydmVyX2NvbmYsCi0JCSJjcmVhdGVkIHNoYXJlZCBtZW1vcnkgc2VnbWVudCAjJWQiLCBzaG1pZCk7Ci0KLSNpZmRlZiBNT1ZFQlJFQUsKLSAgICAvKgotICAgICAqIFNvbWUgU3lzViBzeXN0ZW1zIHBsYWNlIHRoZSBzaGFyZWQgc2VnbWVudCBXQVkgdG9vIGNsb3NlCi0gICAgICogdG8gdGhlIGR5bmFtaWMgbWVtb3J5IGJyZWFrIHBvaW50IChzYnJrKDApKS4gVGhpcyBzZXZlcmVseQotICAgICAqIGxpbWl0cyB0aGUgdXNlIG9mIG1hbGxvYy9zYnJrIGluIHRoZSBwcm9ncmFtIHNpbmNlIHNicmsgd2lsbAotICAgICAqIHJlZnVzZSB0byBtb3ZlIHBhc3QgdGhhdCBwb2ludC4KLSAgICAgKgotICAgICAqIFRvIGdldCBhcm91bmQgdGhpcywgd2UgbW92ZSB0aGUgYnJlYWsgcG9pbnQgIndheSB1cCB0aGVyZSIsCi0gICAgICogYXR0YWNoIHRoZSBzZWdtZW50IGFuZCB0aGVuIG1vdmUgYnJlYWsgYmFjayBkb3duLiBVZ2x5Ci0gICAgICovCi0gICAgaWYgKChvYnJrID0gc2JyayhNT1ZFQlJFQUspKSA9PSAoY2hhciAqKSAtMSkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHNlcnZlcl9jb25mLAotCSAgICAic2JyaygpIGNvdWxkIG5vdCBtb3ZlIGJyZWFrIik7Ci0gICAgfQotI2VuZGlmCi0KLSNkZWZpbmUgQkFEU0hNQVQJKChzY29yZWJvYXJkICopKC0xKSkKLSAgICBpZiAoKGFwX3Njb3JlYm9hcmRfaW1hZ2UgPSAoc2NvcmVib2FyZCAqKSBzaG1hdChzaG1pZCwgMCwgMCkpID09IEJBRFNITUFUKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLCBzZXJ2ZXJfY29uZiwgInNobWF0IGVycm9yIik7Ci0JLyoKLQkgKiBXZSBleGl0IGJlbG93LCBhZnRlciB3ZSB0cnkgdG8gcmVtb3ZlIHRoZSBzZWdtZW50Ci0JICovCi0gICAgfQotICAgIGVsc2UgewkJCS8qIG9ubHkgd29ycnkgYWJvdXQgcGVybWlzc2lvbnMgaWYgd2UgYXR0YWNoZWQgdGhlIHNlZ21lbnQgKi8KLQlpZiAoc2htY3RsKHNobWlkLCBJUENfU1RBVCwgJnNobWJ1ZikgIT0gMCkgewotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzZXJ2ZXJfY29uZiwKLQkJInNobWN0bCgpIGNvdWxkIG5vdCBzdGF0IHNlZ21lbnQgIyVkIiwgc2htaWQpOwotCX0KLQllbHNlIHsKLQkgICAgc2htYnVmLnNobV9wZXJtLnVpZCA9IGFwX3VzZXJfaWQ7Ci0JICAgIHNobWJ1Zi5zaG1fcGVybS5naWQgPSBhcF9ncm91cF9pZDsKLQkgICAgaWYgKHNobWN0bChzaG1pZCwgSVBDX1NFVCwgJnNobWJ1ZikgIT0gMCkgewotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzZXJ2ZXJfY29uZiwKLQkJICAgICJzaG1jdGwoKSBjb3VsZCBub3Qgc2V0IHNlZ21lbnQgIyVkIiwgc2htaWQpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICAvKgotICAgICAqIFdlIG11c3QgYXZvaWQgbGVhdmluZyBzZWdtZW50cyBpbiB0aGUga2VybmVsJ3MKLSAgICAgKiAoc21hbGwpIHRhYmxlcy4KLSAgICAgKi8KLSAgICBpZiAoc2htY3RsKHNobWlkLCBJUENfUk1JRCwgTlVMTCkgIT0gMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBzZXJ2ZXJfY29uZiwKLQkJInNobWN0bDogSVBDX1JNSUQ6IGNvdWxkIG5vdCByZW1vdmUgc2hhcmVkIG1lbW9yeSBzZWdtZW50ICMlZCIsCi0JCXNobWlkKTsKLSAgICB9Ci0gICAgaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UgPT0gQkFEU0hNQVQpCS8qIG5vdyBiYWlsb3V0ICovCi0JZXhpdChBUEVYSVRfSU5JVCk7Ci0KLSNpZmRlZiBNT1ZFQlJFQUsKLSAgICBpZiAob2JyayA9PSAoY2hhciAqKSAtMSkKLQlyZXR1cm47CQkJLyogbm90aGluZyBlbHNlIHRvIGRvICovCi0gICAgaWYgKHNicmsoLShNT1ZFQlJFQUspKSA9PSAoY2hhciAqKSAtMSkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHNlcnZlcl9jb25mLAotCSAgICAic2JyaygpIGNvdWxkIG5vdCBtb3ZlIGJyZWFrIGJhY2siKTsKLSAgICB9Ci0jZW5kaWYKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwucnVubmluZ19nZW5lcmF0aW9uID0gMDsKLX0KLQotc3RhdGljIHZvaWQgcmVvcGVuX3Njb3JlYm9hcmQocG9vbCAqcCkKLXsKLX0KLQotI2VsaWYgZGVmaW5lZChVU0VfVFBGX1NDT1JFQk9BUkQpCi0KLXN0YXRpYyB2b2lkIGNsZWFudXBfc2NvcmVib2FyZF9oZWFwKCkKLXsKLSAgICBpbnQgcnY7Ci0gICAgcnYgPSByc3lzYyhhcF9zY29yZWJvYXJkX2ltYWdlLCBTQ09SRUJPQVJEX0ZSQU1FUywgU0NPUkVCT0FSRF9OQU1FKTsKLSAgICBpZihydiA9PSBSU1lTQ19FUlJPUikgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICJyc3lzYygpIGNvdWxkIG5vdCByZWxlYXNlIHNjb3JlYm9hcmQgc3lzdGVtIGhlYXAiKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHNldHVwX3NoYXJlZF9tZW0ocG9vbCAqcCkKLXsKLSAgICBjaW5mYyhDSU5GQ19XUklURSwgQ0lORkNfQ01NQ1RLMik7Ci0gICAgYXBfc2NvcmVib2FyZF9pbWFnZSA9IChzY29yZWJvYXJkICopIGdzeXNjKFNDT1JFQk9BUkRfRlJBTUVTLCBTQ09SRUJPQVJEX05BTUUpOwotCi0gICAgaWYgKCFhcF9zY29yZWJvYXJkX2ltYWdlKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiaHR0cGQ6IENvdWxkIG5vdCBjcmVhdGUgc2NvcmVib2FyZCBzeXN0ZW0gaGVhcCBzdG9yYWdlLlxuIik7Ci0gICAgICAgIGV4aXQoQVBFWElUX0lOSVQpOwotICAgIH0KLQotICAgIGFwX3JlZ2lzdGVyX2NsZWFudXAocCwgTlVMTCwgY2xlYW51cF9zY29yZWJvYXJkX2hlYXAsIGFwX251bGxfY2xlYW51cCk7Ci0gICAgYXBfc2NvcmVib2FyZF9pbWFnZS0+Z2xvYmFsLnJ1bm5pbmdfZ2VuZXJhdGlvbiA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlb3Blbl9zY29yZWJvYXJkKHBvb2wgKnApCi17Ci0gICAgY2luZmMoQ0lORkNfV1JJVEUsIENJTkZDX0NNTUNUSzIpOwotfQotCi0jZWxzZQotI2RlZmluZSBTQ09SRUJPQVJEX0ZJTEUKLXN0YXRpYyBzY29yZWJvYXJkIF9zY29yZWJvYXJkX2ltYWdlOwotc3RhdGljIGludCBzY29yZWJvYXJkX2ZkID0gLTE7Ci0KLS8qIFhYWDogdGhpbmdzIGFyZSBzZXJpb3VzbHkgc2NyZXdlZCBpZiB3ZSBldmVyIGhhdmUgdG8gZG8gYSBwYXJ0aWFsCi0gKiByZWFkIG9yIHdyaXRlIC4uLiB3ZSBjb3VsZCBnZXQgYSBjb3JydXB0ZWQgc2NvcmVib2FyZAotICovCi1zdGF0aWMgaW50IGZvcmNlX3dyaXRlKGludCBmZCwgdm9pZCAqYnVmZmVyLCBpbnQgYnVmc3opCi17Ci0gICAgaW50IHJ2LCBvcmlnX3N6ID0gYnVmc3o7Ci0KLSAgICBkbyB7Ci0JcnYgPSB3cml0ZShmZCwgYnVmZmVyLCBidWZzeik7Ci0JaWYgKHJ2ID4gMCkgewotCSAgICBidWZmZXIgPSAoY2hhciAqKSBidWZmZXIgKyBydjsKLQkgICAgYnVmc3ogLT0gcnY7Ci0JfQotICAgIH0gd2hpbGUgKChydiA+IDAgJiYgYnVmc3ogPiAwKSB8fCAocnYgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpKTsKLQotICAgIHJldHVybiBydiA8IDAgPyBydiA6IG9yaWdfc3ogLSBidWZzejsKLX0KLQotc3RhdGljIGludCBmb3JjZV9yZWFkKGludCBmZCwgdm9pZCAqYnVmZmVyLCBpbnQgYnVmc3opCi17Ci0gICAgaW50IHJ2LCBvcmlnX3N6ID0gYnVmc3o7Ci0KLSAgICBkbyB7Ci0JcnYgPSByZWFkKGZkLCBidWZmZXIsIGJ1ZnN6KTsKLQlpZiAocnYgPiAwKSB7Ci0JICAgIGJ1ZmZlciA9IChjaGFyICopIGJ1ZmZlciArIHJ2OwotCSAgICBidWZzeiAtPSBydjsKLQl9Ci0gICAgfSB3aGlsZSAoKHJ2ID4gMCAmJiBidWZzeiA+IDApIHx8IChydiA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikpOwotCi0gICAgcmV0dXJuIHJ2IDwgMCA/IHJ2IDogb3JpZ19zeiAtIGJ1ZnN6OwotfQotCi1zdGF0aWMgdm9pZCBjbGVhbnVwX3Njb3JlYm9hcmRfZmlsZSh2b2lkICpmb28pCi17Ci0gICAgdW5saW5rKGFwX3Njb3JlYm9hcmRfZm5hbWUpOwotfQotCi12b2lkIHJlb3Blbl9zY29yZWJvYXJkKHBvb2wgKnApCi17Ci0gICAgaWYgKHNjb3JlYm9hcmRfZmQgIT0gLTEpCi0JYXBfcGNsb3NlZihwLCBzY29yZWJvYXJkX2ZkKTsKLQotI2lmZGVmIFRQRgotICAgIGFwX3Njb3JlYm9hcmRfZm5hbWUgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShwLCBhcF9zY29yZWJvYXJkX2ZuYW1lKTsKLSNlbmRpZiAvKiBUUEYgKi8KLSAgICBzY29yZWJvYXJkX2ZkID0gYXBfcG9wZW5mKHAsIGFwX3Njb3JlYm9hcmRfZm5hbWUsIE9fQ1JFQVQgfCBPX0JJTkFSWSB8IE9fUkRXUiwgMDY2Nik7Ci0gICAgaWYgKHNjb3JlYm9hcmRfZmQgPT0gLTEpIHsKLQlwZXJyb3IoYXBfc2NvcmVib2FyZF9mbmFtZSk7Ci0JZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiBzY29yZWJvYXJkIGZpbGU6XG4iKTsKLQljbGVhbl9jaGlsZF9leGl0KDEpOwotICAgIH0KLX0KLSNlbmRpZgotCi0vKiBDYWxsZWQgYnkgcGFyZW50IHByb2Nlc3MgKi8KLXN0YXRpYyB2b2lkIHJlaW5pdF9zY29yZWJvYXJkKHBvb2wgKnApCi17Ci0gICAgaW50IHJ1bm5pbmdfZ2VuID0gMDsKLSAgICBpZiAoYXBfc2NvcmVib2FyZF9pbWFnZSkKLQlydW5uaW5nX2dlbiA9IGFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbC5ydW5uaW5nX2dlbmVyYXRpb247Ci0KLSNpZm5kZWYgU0NPUkVCT0FSRF9GSUxFCi0gICAgaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UgPT0gTlVMTCkgewotCXNldHVwX3NoYXJlZF9tZW0ocCk7Ci0gICAgfQotICAgIG1lbXNldChhcF9zY29yZWJvYXJkX2ltYWdlLCAwLCBTQ09SRUJPQVJEX1NJWkUpOwotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbC5ydW5uaW5nX2dlbmVyYXRpb24gPSBydW5uaW5nX2dlbjsKLSNlbHNlCi0gICAgYXBfc2NvcmVib2FyZF9pbWFnZSA9ICZfc2NvcmVib2FyZF9pbWFnZTsKLSAgICBhcF9zY29yZWJvYXJkX2ZuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocCwgYXBfc2NvcmVib2FyZF9mbmFtZSk7Ci0KLSAgICBzY29yZWJvYXJkX2ZkID0gYXBfcG9wZW5mKHAsIGFwX3Njb3JlYm9hcmRfZm5hbWUsIE9fQ1JFQVQgfCBPX0JJTkFSWSB8IE9fUkRXUiwgMDY0NCk7Ci0gICAgaWYgKHNjb3JlYm9hcmRfZmQgPT0gLTEpIHsKLQlwZXJyb3IoYXBfc2NvcmVib2FyZF9mbmFtZSk7Ci0JZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiBzY29yZWJvYXJkIGZpbGU6XG4iKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0gICAgYXBfcmVnaXN0ZXJfY2xlYW51cChwLCBOVUxMLCBjbGVhbnVwX3Njb3JlYm9hcmRfZmlsZSwgYXBfbnVsbF9jbGVhbnVwKTsKLQotICAgIG1lbXNldCgoY2hhciAqKSBhcF9zY29yZWJvYXJkX2ltYWdlLCAwLCBzaXplb2YoKmFwX3Njb3JlYm9hcmRfaW1hZ2UpKTsKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwucnVubmluZ19nZW5lcmF0aW9uID0gcnVubmluZ19nZW47Ci0gICAgZm9yY2Vfd3JpdGUoc2NvcmVib2FyZF9mZCwgYXBfc2NvcmVib2FyZF9pbWFnZSwgc2l6ZW9mKCphcF9zY29yZWJvYXJkX2ltYWdlKSk7Ci0jZW5kaWYKLX0KLQotLyogUm91dGluZXMgY2FsbGVkIHRvIGRlYWwgd2l0aCB0aGUgc2NvcmVib2FyZCBpbWFnZQotICogLS0tIG5vdGUgdGhhdCB3ZSBkbyAqbm90KiBuZWVkIHdyaXRlIGxvY2tzLCBzaW5jZSB1cGRhdGVfY2hpbGRfc3RhdHVzCi0gKiBvbmx5IHVwZGF0ZXMgYSAqc2luZ2xlKiByZWNvcmQgaW4gcGxhY2UsIGFuZCBvbmx5IG9uZSBwcm9jZXNzIHdyaXRlcyB0bwotICogYSBnaXZlbiBzY29yZWJvYXJkIHNsb3QgYXQgYSB0aW1lIChlaXRoZXIgdGhlIGNoaWxkIHByb2Nlc3Mgb3duaW5nIHRoYXQKLSAqIHNsb3QsIG9yIHRoZSBwYXJlbnQsIG5vdGluZyB0aGF0IHRoZSBjaGlsZCBoYXMgZGllZCkuCi0gKgotICogQXMgYSBmaW5hbCBub3RlIC0tLSBzZXR0aW5nIHRoZSBzY29yZSBlbnRyeSB0byBnZXRwaWQoKSBpcyBhbHdheXMgc2FmZSwKLSAqIHNpbmNlIHdoZW4gdGhlIHBhcmVudCBpcyB3cml0aW5nIGFuIGVudHJ5LCBpdCdzIG9ubHkgbm90aW5nIFNFUlZFUl9ERUFECi0gKiBhbnl3YXkuCi0gKi8KLQotYXBfaW5saW5lIHZvaWQgYXBfc3luY19zY29yZWJvYXJkX2ltYWdlKHZvaWQpCi17Ci0jaWZkZWYgU0NPUkVCT0FSRF9GSUxFCi0gICAgbHNlZWsoc2NvcmVib2FyZF9mZCwgMEwsIDApOwotICAgIGZvcmNlX3JlYWQoc2NvcmVib2FyZF9mZCwgYXBfc2NvcmVib2FyZF9pbWFnZSwgc2l6ZW9mKCphcF9zY29yZWJvYXJkX2ltYWdlKSk7Ci0jZW5kaWYKLX0KLQotI2VuZGlmIC8qIE1VTFRJVEhSRUFEICovCi0KLUFQSV9FWFBPUlQoaW50KSBhcF9leGlzdHNfc2NvcmVib2FyZF9pbWFnZSh2b2lkKQotewotICAgIHJldHVybiAoYXBfc2NvcmVib2FyZF9pbWFnZSA/IDEgOiAwKTsKLX0KLQotc3RhdGljIGFwX2lubGluZSB2b2lkIHB1dF9zY29yZWJvYXJkX2luZm8oaW50IGNoaWxkX251bSwKLQkJCQkgICAgICAgc2hvcnRfc2NvcmUgKm5ld19zY29yZV9yZWMpCi17Ci0jaWZkZWYgU0NPUkVCT0FSRF9GSUxFCi0gICAgbHNlZWsoc2NvcmVib2FyZF9mZCwgKGxvbmcpIGNoaWxkX251bSAqIHNpemVvZihzaG9ydF9zY29yZSksIDApOwotICAgIGZvcmNlX3dyaXRlKHNjb3JlYm9hcmRfZmQsIG5ld19zY29yZV9yZWMsIHNpemVvZihzaG9ydF9zY29yZSkpOwotI2VuZGlmCi19Ci0KLS8qIGEgY2xlYW4gZXhpdCBmcm9tIHRoZSBwYXJlbnQgd2l0aCBwcm9wZXIgY2xlYW51cCAqLwotc3RhdGljIHZvaWQgY2xlYW5fcGFyZW50X2V4aXQoaW50IGNvZGUpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7Ci1zdGF0aWMgdm9pZCBjbGVhbl9wYXJlbnRfZXhpdChpbnQgY29kZSkKLXsKLSAgICAvKiBDbGVhciB0aGUgcG9vbCAtIGluY2x1ZGluZyBhbnkgcmVnaXN0ZXJlZCBjbGVhbnVwcyAqLwotICAgIGFwX2Rlc3Ryb3lfcG9vbChwZ2xvYmFsKTsKLSAgICBleGl0KGNvZGUpOwotfQotCi1pbnQgYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhpbnQgY2hpbGRfbnVtLCBpbnQgc3RhdHVzLCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpbnQgb2xkX3N0YXR1czsKLSAgICBzaG9ydF9zY29yZSAqc3M7Ci0KLSAgICBpZiAoY2hpbGRfbnVtIDwgMCkKLQlyZXR1cm4gLTE7Ci0KLSAgICBhcF9jaGVja19zaWduYWxzKCk7Ci0KLSAgICBhcF9zeW5jX3Njb3JlYm9hcmRfaW1hZ2UoKTsKLSAgICBzcyA9ICZhcF9zY29yZWJvYXJkX2ltYWdlLT5zZXJ2ZXJzW2NoaWxkX251bV07Ci0gICAgb2xkX3N0YXR1cyA9IHNzLT5zdGF0dXM7Ci0gICAgc3MtPnN0YXR1cyA9IHN0YXR1czsKLSNpZmRlZiBPUFRJTUlaRV9USU1FT1VUUwotICAgICsrc3MtPmN1cl92dGltZTsKLSNlbmRpZgotCi0gICAgaWYgKGFwX2V4dGVuZGVkX3N0YXR1cykgewotI2lmbmRlZiBPUFRJTUlaRV9USU1FT1VUUwotCXNzLT5sYXN0X3VzZWQgPSB0aW1lKE5VTEwpOwotI2VuZGlmCi0JaWYgKHN0YXR1cyA9PSBTRVJWRVJfUkVBRFkgfHwgc3RhdHVzID09IFNFUlZFUl9ERUFEKSB7Ci0JICAgIC8qCi0JICAgICAqIFJlc2V0IGluZGl2aWR1YWwgY291bnRlcnMKLQkgICAgICovCi0JICAgIGlmIChzdGF0dXMgPT0gU0VSVkVSX0RFQUQpIHsKLQkJc3MtPm15X2FjY2Vzc19jb3VudCA9IDBMOwotCQlzcy0+bXlfYnl0ZXNfc2VydmVkID0gMEw7Ci0JICAgIH0KLQkgICAgc3MtPmNvbm5fY291bnQgPSAodW5zaWduZWQgc2hvcnQpIDA7Ci0JICAgIHNzLT5jb25uX2J5dGVzID0gKHVuc2lnbmVkIGxvbmcpIDA7Ci0JfQotCWlmIChyKSB7Ci0JICAgIGNvbm5fcmVjICpjID0gci0+Y29ubmVjdGlvbjsKLQkgICAgYXBfY3B5c3Rybihzcy0+Y2xpZW50LCBhcF9nZXRfcmVtb3RlX2hvc3QoYywgci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJICBSRU1PVEVfTk9MT09LVVApLCBzaXplb2Yoc3MtPmNsaWVudCkpOwotCSAgICBpZiAoci0+dGhlX3JlcXVlc3QgPT0gTlVMTCkgewotCQkgICAgYXBfY3B5c3Rybihzcy0+cmVxdWVzdCwgIk5VTEwiLCBzaXplb2Yoc3MtPnJlcXVlc3QpKTsKLQkgICAgfSBlbHNlIGlmIChyLT5wYXJzZWRfdXJpLnBhc3N3b3JkID09IE5VTEwpIHsKLQkJICAgIGFwX2NweXN0cm4oc3MtPnJlcXVlc3QsIHItPnRoZV9yZXF1ZXN0LCBzaXplb2Yoc3MtPnJlcXVlc3QpKTsKLQkgICAgfSBlbHNlIHsKLQkJLyogRG9uJ3QgcmV2ZWFsIHRoZSBwYXNzd29yZCBpbiB0aGUgc2VydmVyLXN0YXR1cyB2aWV3ICovCi0JCSAgICBhcF9jcHlzdHJuKHNzLT5yZXF1ZXN0LCBhcF9wc3RyY2F0KHItPnBvb2wsIHItPm1ldGhvZCwgIiAiLAotCQkJCQkgICAgICAgYXBfdW5wYXJzZV91cmlfY29tcG9uZW50cyhyLT5wb29sLCAmci0+cGFyc2VkX3VyaSwgVU5QX09NSVRQQVNTV09SRCksCi0JCQkJCSAgICAgICByLT5hc3NiYWNrd2FyZHMgPyBOVUxMIDogIiAiLCByLT5wcm90b2NvbCwgTlVMTCksCi0JCQkJICAgICAgIHNpemVvZihzcy0+cmVxdWVzdCkpOwotCSAgICB9Ci0JICAgIHNzLT52aG9zdHJlYyA9ICByLT5zZXJ2ZXI7Ci0JfQotICAgIH0KLSAgICBpZiAoc3RhdHVzID09IFNFUlZFUl9TVEFSVElORyAmJiByID09IE5VTEwpIHsKLQkvKiBjbGVhbiB1cCB0aGUgc2xvdCdzIHZob3N0cmVjIHBvaW50ZXIgKG1heWJlIHJlLXVzZWQpCi0JICogYW5kIG1hcmsgdGhlIHNsb3QgYXMgYmVsb25naW5nIHRvIGEgbmV3IGdlbmVyYXRpb24uCi0JICovCi0Jc3MtPnZob3N0cmVjID0gTlVMTDsKLQlhcF9zY29yZWJvYXJkX2ltYWdlLT5wYXJlbnRbY2hpbGRfbnVtXS5nZW5lcmF0aW9uID0gYXBfbXlfZ2VuZXJhdGlvbjsKLSNpZmRlZiBTQ09SRUJPQVJEX0ZJTEUKLQlsc2VlayhzY29yZWJvYXJkX2ZkLCBYdE9mZnNldE9mKHNjb3JlYm9hcmQsIHBhcmVudFtjaGlsZF9udW1dKSwgMCk7Ci0JZm9yY2Vfd3JpdGUoc2NvcmVib2FyZF9mZCwgJmFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtjaGlsZF9udW1dLAotCSAgICBzaXplb2YocGFyZW50X3Njb3JlKSk7Ci0jZW5kaWYKLSAgICB9Ci0gICAgcHV0X3Njb3JlYm9hcmRfaW5mbyhjaGlsZF9udW0sIHNzKTsKLQotICAgIHJldHVybiBvbGRfc3RhdHVzOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfc2NvcmVib2FyZF9nbG9iYWwodm9pZCkKLXsKLSNpZmRlZiBTQ09SRUJPQVJEX0ZJTEUKLSAgICBsc2VlayhzY29yZWJvYXJkX2ZkLAotCSAgKGNoYXIgKikgJmFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbCAtKGNoYXIgKikgYXBfc2NvcmVib2FyZF9pbWFnZSwgMCk7Ci0gICAgZm9yY2Vfd3JpdGUoc2NvcmVib2FyZF9mZCwgJmFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbCwKLQkJc2l6ZW9mIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbCk7Ci0jZW5kaWYKLX0KLQotdm9pZCBhcF90aW1lX3Byb2Nlc3NfcmVxdWVzdChpbnQgY2hpbGRfbnVtLCBpbnQgc3RhdHVzKQotewotICAgIHNob3J0X3Njb3JlICpzczsKLSNpZiBkZWZpbmVkKE5PX0dFVFRJTUVPRkRBWSkgJiYgIWRlZmluZWQoTk9fVElNRVMpCi0gICAgc3RydWN0IHRtcyB0bXNfYmxrOwotI2VuZGlmCi0KLSAgICBpZiAoY2hpbGRfbnVtIDwgMCkKLQlyZXR1cm47Ci0KLSAgICBhcF9zeW5jX3Njb3JlYm9hcmRfaW1hZ2UoKTsKLSAgICBzcyA9ICZhcF9zY29yZWJvYXJkX2ltYWdlLT5zZXJ2ZXJzW2NoaWxkX251bV07Ci0KLSAgICBpZiAoc3RhdHVzID09IFNUQVJUX1BSRVFVRVNUKSB7Ci0jaWYgZGVmaW5lZChOT19HRVRUSU1FT0ZEQVkpCi0jaWZuZGVmIE5PX1RJTUVTCi0JaWYgKChzcy0+c3RhcnRfdGltZSA9IHRpbWVzKCZ0bXNfYmxrKSkgPT0gLTEpCi0jZW5kaWYgLyogTk9fVElNRVMgKi8KLQkgICAgc3MtPnN0YXJ0X3RpbWUgPSAoY2xvY2tfdCkgMDsKLSNlbHNlCi0JaWYgKGdldHRpbWVvZmRheSgmc3MtPnN0YXJ0X3RpbWUsIChzdHJ1Y3QgdGltZXpvbmUgKikgMCkgPCAwKQotCSAgICBzcy0+c3RhcnRfdGltZS50dl9zZWMgPQotCQlzcy0+c3RhcnRfdGltZS50dl91c2VjID0gMEw7Ci0jZW5kaWYKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RhdHVzID09IFNUT1BfUFJFUVVFU1QpIHsKLSNpZiBkZWZpbmVkKE5PX0dFVFRJTUVPRkRBWSkKLSNpZm5kZWYgTk9fVElNRVMKLQlpZiAoKHNzLT5zdG9wX3RpbWUgPSB0aW1lcygmdG1zX2JsaykpID09IC0xKQotI2VuZGlmCi0JICAgIHNzLT5zdG9wX3RpbWUgPSBzcy0+c3RhcnRfdGltZSA9IChjbG9ja190KSAwOwotI2Vsc2UKLQlpZiAoZ2V0dGltZW9mZGF5KCZzcy0+c3RvcF90aW1lLCAoc3RydWN0IHRpbWV6b25lICopIDApIDwgMCkKLQkgICAgc3MtPnN0b3BfdGltZS50dl9zZWMgPQotCQlzcy0+c3RvcF90aW1lLnR2X3VzZWMgPQotCQlzcy0+c3RhcnRfdGltZS50dl9zZWMgPQotCQlzcy0+c3RhcnRfdGltZS50dl91c2VjID0gMEw7Ci0jZW5kaWYKLQotICAgIH0KLQotICAgIHB1dF9zY29yZWJvYXJkX2luZm8oY2hpbGRfbnVtLCBzcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGluY3JlbWVudF9jb3VudHMoaW50IGNoaWxkX251bSwgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgbG9uZyBpbnQgYnMgPSAwOwotICAgIHNob3J0X3Njb3JlICpzczsKLQotICAgIGFwX3N5bmNfc2NvcmVib2FyZF9pbWFnZSgpOwotICAgIHNzID0gJmFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbY2hpbGRfbnVtXTsKLQotICAgIGlmIChyLT5zZW50X2JvZHljdCkKLQlhcF9iZ2V0b3B0KHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQk9fQllURUNULCAmYnMpOwotCi0jaWZuZGVmIE5PX1RJTUVTCi0gICAgdGltZXMoJnNzLT50aW1lcyk7Ci0jZW5kaWYKLSAgICBzcy0+YWNjZXNzX2NvdW50Kys7Ci0gICAgc3MtPm15X2FjY2Vzc19jb3VudCsrOwotICAgIHNzLT5jb25uX2NvdW50Kys7Ci0gICAgc3MtPmJ5dGVzX3NlcnZlZCArPSAodW5zaWduZWQgbG9uZykgYnM7Ci0gICAgc3MtPm15X2J5dGVzX3NlcnZlZCArPSAodW5zaWduZWQgbG9uZykgYnM7Ci0gICAgc3MtPmNvbm5fYnl0ZXMgKz0gKHVuc2lnbmVkIGxvbmcpIGJzOwotCi0gICAgcHV0X3Njb3JlYm9hcmRfaW5mbyhjaGlsZF9udW0sIHNzKTsKLX0KLQotc3RhdGljIGludCBmaW5kX2NoaWxkX2J5X3BpZChpbnQgcGlkKQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG1heF9kYWVtb25zX2xpbWl0OyArK2kpCi0JaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtpXS5waWQgPT0gcGlkKQotCSAgICByZXR1cm4gaTsKLQotICAgIHJldHVybiAtMTsKLX0KLQotc3RhdGljIHZvaWQgcmVjbGFpbV9jaGlsZF9wcm9jZXNzZXMoaW50IHRlcm1pbmF0ZSkKLXsKLSNpZm5kZWYgTVVMVElUSFJFQUQKLSAgICBpbnQgaSwgc3RhdHVzOwotICAgIGxvbmcgaW50IHdhaXR0aW1lID0gMTAyNCAqIDE2OwkvKiBpbiB1c2VjcyAqLwotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgIGludCB3YWl0cmV0LCB0cmllczsKLSAgICBpbnQgbm90X2RlYWRfeWV0OwotI2lmbmRlZiBOT19PVEhFUl9DSElMRAotICAgIG90aGVyX2NoaWxkX3JlYyAqb2NyLCAqbm9jcjsKLSNlbmRpZgotCi0gICAgYXBfc3luY19zY29yZWJvYXJkX2ltYWdlKCk7Ci0KLSAgICBmb3IgKHRyaWVzID0gdGVybWluYXRlID8gNCA6IDE7IHRyaWVzIDw9IDk7ICsrdHJpZXMpIHsKLQkvKiBkb24ndCB3YW50IHRvIGhvbGQgdXAgcHJvZ3Jlc3MgYW55IG1vcmUgdGhhbiAKLQkgKiBuZWNlc3NhcnksIGJ1dCB3ZSBuZWVkIHRvIGFsbG93IGNoaWxkcmVuIGEgZmV3IG1vbWVudHMgdG8gZXhpdC4KLQkgKiBTZXQgZGVsYXkgd2l0aCBhbiBleHBvbmVudGlhbCBiYWNrb2ZmLgotCSAqLwotCXR2LnR2X3NlYyA9IHdhaXR0aW1lIC8gMTAwMDAwMDsKLQl0di50dl91c2VjID0gd2FpdHRpbWUgJSAxMDAwMDAwOwotCXdhaXR0aW1lID0gd2FpdHRpbWUgKiA0OwotCWFwX3NlbGVjdCgwLCBOVUxMLCBOVUxMLCBOVUxMLCAmdHYpOwotCi0JLyogbm93IHNlZSB3aG8gaXMgZG9uZSAqLwotCW5vdF9kZWFkX3lldCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IG1heF9kYWVtb25zX2xpbWl0OyArK2kpIHsKLQkgICAgaW50IHBpZCA9IGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtpXS5waWQ7Ci0KLQkgICAgaWYgKHBpZCA9PSBteV9waWQgfHwgcGlkID09IDApCi0JCWNvbnRpbnVlOwotCi0JICAgIHdhaXRyZXQgPSB3YWl0cGlkKHBpZCwgJnN0YXR1cywgV05PSEFORyk7Ci0JICAgIGlmICh3YWl0cmV0ID09IHBpZCB8fCB3YWl0cmV0ID09IC0xKSB7Ci0JCWFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtpXS5waWQgPSAwOwotCQljb250aW51ZTsKLQkgICAgfQotCSAgICArK25vdF9kZWFkX3lldDsKLQkgICAgc3dpdGNoICh0cmllcykgewotCSAgICBjYXNlIDE6ICAgICAvKiAgMTZtcyAqLwotCSAgICBjYXNlIDI6ICAgICAvKiAgODJtcyAqLwotCQlicmVhazsKLQkgICAgY2FzZSAzOiAgICAgLyogMzQ0bXMgKi8KLQkJLyogcGVyaGFwcyBpdCBtaXNzZWQgdGhlIFNJR0hVUCwgbGV0cyB0cnkgYWdhaW4gKi8KLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfV0FSTklORywKLQkJCSAgICBzZXJ2ZXJfY29uZiwKLQkJICAgICJjaGlsZCBwcm9jZXNzICVkIGRpZCBub3QgZXhpdCwgc2VuZGluZyBhbm90aGVyIFNJR0hVUCIsCi0JCQkgICAgcGlkKTsKLQkJa2lsbChwaWQsIFNJR0hVUCk7Ci0JCXdhaXR0aW1lID0gMTAyNCAqIDE2OwotCQlicmVhazsKLQkgICAgY2FzZSA0OiAgICAgLyogIDE2bXMgKi8KLQkgICAgY2FzZSA1OiAgICAgLyogIDgybXMgKi8KLQkgICAgY2FzZSA2OiAgICAgLyogMzQ0bXMgKi8KLQkJYnJlYWs7Ci0JICAgIGNhc2UgNzogICAgIC8qIDEuNHNlYyAqLwotCQkvKiBvaywgbm93IGl0J3MgYmVpbmcgYW5ub3lpbmcgKi8KLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfV0FSTklORywKLQkJCSAgICBzZXJ2ZXJfY29uZiwKLQkJICAgImNoaWxkIHByb2Nlc3MgJWQgc3RpbGwgZGlkIG5vdCBleGl0LCBzZW5kaW5nIGEgU0lHVEVSTSIsCi0JCQkgICAgcGlkKTsKLQkJa2lsbChwaWQsIFNJR1RFUk0pOwotCQlicmVhazsKLQkgICAgY2FzZSA4OiAgICAgLyogIDYgc2VjICovCi0JCS8qIGRpZSBjaGlsZCBzY3VtICovCi0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgc2VydmVyX2NvbmYsCi0JCSAgICJjaGlsZCBwcm9jZXNzICVkIHN0aWxsIGRpZCBub3QgZXhpdCwgc2VuZGluZyBhIFNJR0tJTEwiLAotCQkJICAgIHBpZCk7Ci0JCWtpbGwocGlkLCBTSUdLSUxMKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgOTogICAgIC8qIDE0IHNlYyAqLwotCQkvKiBnYXZlIGl0IG91ciBiZXN0IHNob3QsIGJ1dCBhbGFzLi4uICBJZiB0aGlzIHJlYWxseSAKLQkJICogaXMgYSBjaGlsZCB3ZSBhcmUgdHJ5aW5nIHRvIGtpbGwgYW5kIGl0IHJlYWxseSBoYXNuJ3QKLQkJICogZXhpdGVkLCB3ZSB3aWxsIGxpa2VseSBmYWlsIHRvIGJpbmQgdG8gdGhlIHBvcnQKLQkJICogYWZ0ZXIgdGhlIHJlc3RhcnQuCi0JCSAqLwotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHNlcnZlcl9jb25mLAotCQkJICAgICJjb3VsZCBub3QgbWFrZSBjaGlsZCBwcm9jZXNzICVkIGV4aXQsICIKLQkJCSAgICAiYXR0ZW1wdGluZyB0byBjb250aW51ZSBhbnl3YXkiLCBwaWQpOwotCQlicmVhazsKLQkgICAgfQotCX0KLSNpZm5kZWYgTk9fT1RIRVJfQ0hJTEQKLQlmb3IgKG9jciA9IG90aGVyX2NoaWxkcmVuOyBvY3I7IG9jciA9IG5vY3IpIHsKLQkgICAgbm9jciA9IG9jci0+bmV4dDsKLQkgICAgaWYgKG9jci0+cGlkID09IC0xKQotCQljb250aW51ZTsKLQotCSAgICB3YWl0cmV0ID0gd2FpdHBpZChvY3ItPnBpZCwgJnN0YXR1cywgV05PSEFORyk7Ci0JICAgIGlmICh3YWl0cmV0ID09IG9jci0+cGlkKSB7Ci0JCW9jci0+cGlkID0gLTE7Ci0JCSgqb2NyLT5tYWludGVuYW5jZSkgKE9DX1JFQVNPTl9ERUFUSCwgb2NyLT5kYXRhLCBzdGF0dXMpOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHdhaXRyZXQgPT0gMCkgewotCQkoKm9jci0+bWFpbnRlbmFuY2UpIChPQ19SRUFTT05fUkVTVEFSVCwgb2NyLT5kYXRhLCAtMSk7Ci0JCSsrbm90X2RlYWRfeWV0OwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHdhaXRyZXQgPT0gLTEpIHsKLQkJLyogdWggd2hhdCB0aGUgaGVjaz8gdGhleSBkaWRuJ3QgY2FsbCB1bnJlZ2lzdGVyPyAqLwotCQlvY3ItPnBpZCA9IC0xOwotCQkoKm9jci0+bWFpbnRlbmFuY2UpIChPQ19SRUFTT05fTE9TVCwgb2NyLT5kYXRhLCAtMSk7Ci0JICAgIH0KLQl9Ci0jZW5kaWYKLQlpZiAoIW5vdF9kZWFkX3lldCkgewotCSAgICAvKiBub3RoaW5nIGxlZnQgdG8gd2FpdCBmb3IgKi8KLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZiAvKiBuZGVmIE1VTFRJVEhSRUFEICovCi19Ci0KLQotI2lmIGRlZmluZWQoTkVFRF9XQUlUUElEKQotLyoKLSAgIFN5c3RlbXMgd2l0aG91dCBhIHJlYWwgd2FpdHBpZCBzb21ldGltZXMgbG9zZSBhIGNoaWxkJ3MgZXhpdCB3aGlsZSB3YWl0aW5nCi0gICBmb3IgYW5vdGhlci4gIFNlYXJjaCB0aHJvdWdoIHRoZSBzY29yZWJvYXJkIGZvciBtaXNzaW5nIGNoaWxkcmVuLgotICovCi1pbnQgcmVhcF9jaGlsZHJlbihhcF93YWl0X3QgKnN0YXR1cykKLXsKLSAgICBpbnQgbiwgcGlkOwotCi0gICAgZm9yIChuID0gMDsgbiA8IG1heF9kYWVtb25zX2xpbWl0OyArK24pIHsKLSAgICAgICAgYXBfc3luY19zY29yZWJvYXJkX2ltYWdlKCk7Ci0JaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbbl0uc3RhdHVzICE9IFNFUlZFUl9ERUFEICYmCi0JCWtpbGwoKHBpZCA9IGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtuXS5waWQpLCAwKSA9PSAtMSkgewotCSAgICBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKG4sIFNFUlZFUl9ERUFELCBOVUxMKTsKLQkgICAgLyoganVzdCBtYXJrIGl0IGFzIGhhdmluZyBhIHN1Y2Nlc3NmdWwgZXhpdCBzdGF0dXMgKi8KLQkgICAgYnplcm8oKGNoYXIgKikgc3RhdHVzLCBzaXplb2YoYXBfd2FpdF90KSk7Ci0JICAgIHJldHVybihwaWQpOwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotLyogRmluYWxseSwgdGhpcyByb3V0aW5lIGlzIHVzZWQgYnkgdGhlIGNhcmV0YWtlciBwcm9jZXNzIHRvIHdhaXQgZm9yCi0gKiBhIHdoaWxlLi4uCi0gKi8KLQotLyogbnVtYmVyIG9mIGNhbGxzIHRvIHdhaXRfb3JfdGltZW91dCBiZXR3ZWVuIHdyaXRhYmxlIHByb2JlcyAqLwotI2lmbmRlZiBJTlRFUlZBTF9PRl9XUklUQUJMRV9QUk9CRVMKLSNkZWZpbmUgSU5URVJWQUxfT0ZfV1JJVEFCTEVfUFJPQkVTIDEwCi0jZW5kaWYKLXN0YXRpYyBpbnQgd2FpdF9vcl90aW1lb3V0X2NvdW50ZXI7Ci0KLXN0YXRpYyBpbnQgd2FpdF9vcl90aW1lb3V0KGFwX3dhaXRfdCAqc3RhdHVzKQotewotI2lmZGVmIFdJTjMyCi0jZGVmaW5lIE1BWFdBSVRPQkogTUFYSU1VTV9XQUlUX09CSkVDVFMKLSAgICBIQU5ETEUgaFtNQVhXQUlUT0JKXTsKLSAgICBpbnQgZVtNQVhXQUlUT0JKXTsKLSAgICBpbnQgcm91bmQsIHBpLCBoaSwgcnYsIGVycjsKLSAgICBmb3IgKHJvdW5kID0gMDsgcm91bmQgPD0gKEhBUkRfU0VSVkVSX0xJTUlUIC0gMSkgLyBNQVhXQUlUT0JKICsgMTsgcm91bmQrKykgewotCWhpID0gMDsKLQlmb3IgKHBpID0gcm91bmQgKiBNQVhXQUlUT0JKOwotCSAgICAgKHBpIDwgKHJvdW5kICsgMSkgKiBNQVhXQUlUT0JKKSAmJiAocGkgPCBIQVJEX1NFUlZFUl9MSU1JVCk7Ci0JICAgICBwaSsrKSB7Ci0JICAgIGlmIChhcF9zY29yZWJvYXJkX2ltYWdlLT5zZXJ2ZXJzW3BpXS5zdGF0dXMgIT0gU0VSVkVSX0RFQUQpIHsKLQkJZVtoaV0gPSBwaTsKLQkJaFtoaSsrXSA9IChIQU5ETEUpIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtwaV0ucGlkOwotCSAgICB9Ci0KLQl9Ci0JaWYgKGhpID4gMCkgewotCSAgICBydiA9IFdhaXRGb3JNdWx0aXBsZU9iamVjdHMoaGksIGgsIEZBTFNFLCAxMDAwMCk7Ci0JICAgIGlmIChydiA9PSAtMSkKLQkJZXJyID0gR2V0TGFzdEVycm9yKCk7Ci0JICAgIGlmICgoV0FJVF9PQkpFQ1RfMCA8PSAodW5zaWduZWQgaW50KSBydikgJiYgKCh1bnNpZ25lZCBpbnQpIHJ2IDwgKFdBSVRfT0JKRUNUXzAgKyBoaSkpKQotCQlyZXR1cm4gKGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtlW3J2IC0gV0FJVF9PQkpFQ1RfMF1dLnBpZCk7Ci0JICAgIGVsc2UgaWYgKChXQUlUX0FCQU5ET05FRF8wIDw9ICh1bnNpZ25lZCBpbnQpIHJ2KSAmJiAoKHVuc2lnbmVkIGludCkgcnYgPCAoV0FJVF9BQkFORE9ORURfMCArIGhpKSkpCi0JCXJldHVybiAoYXBfc2NvcmVib2FyZF9pbWFnZS0+cGFyZW50W2VbcnYgLSBXQUlUX0FCQU5ET05FRF8wXV0ucGlkKTsKLQotCX0KLSAgICB9Ci0gICAgcmV0dXJuICgtMSk7Ci0KLSNlbHNlIC8qIFdJTjMyICovCi0gICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gICAgaW50IHJldDsKLQotICAgICsrd2FpdF9vcl90aW1lb3V0X2NvdW50ZXI7Ci0gICAgaWYgKHdhaXRfb3JfdGltZW91dF9jb3VudGVyID09IElOVEVSVkFMX09GX1dSSVRBQkxFX1BST0JFUykgewotCXdhaXRfb3JfdGltZW91dF9jb3VudGVyID0gMDsKLSNpZm5kZWYgTk9fT1RIRVJfQ0hJTEQKLQlwcm9iZV93cml0YWJsZV9mZHMoKTsKLSNlbmRpZgotICAgIH0KLSAgICByZXQgPSB3YWl0cGlkKC0xLCBzdGF0dXMsIFdOT0hBTkcpOwotICAgIGlmIChyZXQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpIHsKLQlyZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChyZXQgPiAwKSB7Ci0JcmV0dXJuIHJldDsKLSAgICB9Ci0jaWZkZWYgTkVFRF9XQUlUUElECi0gICAgaWYgKChyZXQgPSByZWFwX2NoaWxkcmVuKHN0YXR1cykpID4gMCkgewotCXJldHVybiByZXQ7Ci0gICAgfQotI2VuZGlmCi0gICAgdHYudHZfc2VjID0gU0NPUkVCT0FSRF9NQUlOVEVOQU5DRV9JTlRFUlZBTCAvIDEwMDAwMDA7Ci0gICAgdHYudHZfdXNlYyA9IFNDT1JFQk9BUkRfTUFJTlRFTkFOQ0VfSU5URVJWQUwgJSAxMDAwMDAwOwotICAgIGFwX3NlbGVjdCgwLCBOVUxMLCBOVUxMLCBOVUxMLCAmdHYpOwotICAgIHJldHVybiAtMTsKLSNlbmRpZiAvKiBXSU4zMiAqLwotfQotCi0KLSNpZiBkZWZpbmVkKE5TSUcpCi0jZGVmaW5lIE51bVNJRyBOU0lHCi0jZWxpZiBkZWZpbmVkKF9OU0lHKQotI2RlZmluZSBOdW1TSUcgX05TSUcKLSNlbGlmIGRlZmluZWQoX19OU0lHKQotI2RlZmluZSBOdW1TSUcgX19OU0lHCi0jZWxzZQotI2RlZmluZSBOdW1TSUcgMzIgICAvKiBmb3IgMTk5OCdzIHVuaXhlcywgdGhpcyBpcyBzdGlsbCBhIGdvb2QgYXNzdW1wdGlvbiAqLwotI2VuZGlmCi0KLSNpZmRlZiBTWVNfU0lHTElTVCAvKiBwbGF0Zm9ybSBoYXMgc3lzX3NpZ2xpc3RbXSAqLwotI2RlZmluZSBJTklUX1NJR0xJU1QoKSAgLypub3RoaW5nKi8KLSNlbHNlIC8qIHBsYXRmb3JtIGhhcyBubyBzeXNfc2lnbGlzdFtdLCBkZWZpbmUgb3VyIG93biAqLwotI2RlZmluZSBTWVNfU0lHTElTVCBhcF9zeXNfc2lnbGlzdAotI2RlZmluZSBJTklUX1NJR0xJU1QoKSBzaWdsaXN0X2luaXQoKTsKLQotY29uc3QgY2hhciAqYXBfc3lzX3NpZ2xpc3RbTnVtU0lHXTsKLQotc3RhdGljIHZvaWQgc2lnbGlzdF9pbml0KHZvaWQpCi17Ci0gICAgaW50IHNpZzsKLQotICAgIGFwX3N5c19zaWdsaXN0WzBdID0gIlNpZ25hbCAwIjsKLSNpZmRlZiBTSUdIVVAKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdIVVBdID0gIkhhbmd1cCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdJTlQKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdJTlRdID0gIkludGVycnVwdCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdRVUlUCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHUVVJVF0gPSAiUXVpdCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdJTEwKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdJTExdID0gIklsbGVnYWwgaW5zdHJ1Y3Rpb24iOwotI2VuZGlmCi0jaWZkZWYgU0lHVFJBUAotICAgIGFwX3N5c19zaWdsaXN0W1NJR1RSQVBdID0gIlRyYWNlL0JQVCB0cmFwIjsKLSNlbmRpZgotI2lmZGVmIFNJR0lPVAotICAgIGFwX3N5c19zaWdsaXN0W1NJR0lPVF0gPSAiSU9UIGluc3RydWN0aW9uIjsKLSNlbmRpZgotI2lmZGVmIFNJR0FCUlQKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdBQlJUXSA9ICJBYm9ydCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdFTVQKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdFTVRdID0gIkVtdWxhdG9yIHRyYXAiOwotI2VuZGlmCi0jaWZkZWYgU0lHRlBFCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHRlBFXSA9ICJBcml0aG1ldGljIGV4Y2VwdGlvbiI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdLSUxMCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHS0lMTF0gPSAiS2lsbGVkIjsKLSNlbmRpZgotI2lmZGVmIFNJR0JVUwotICAgIGFwX3N5c19zaWdsaXN0W1NJR0JVU10gPSAiQnVzIGVycm9yIjsKLSNlbmRpZgotI2lmZGVmIFNJR1NFR1YKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdTRUdWXSA9ICJTZWdtZW50YXRpb24gZmF1bHQiOwotI2VuZGlmCi0jaWZkZWYgU0lHU1lTCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHU1lTXSA9ICJCYWQgc3lzdGVtIGNhbGwiOwotI2VuZGlmCi0jaWZkZWYgU0lHUElQRQotICAgIGFwX3N5c19zaWdsaXN0W1NJR1BJUEVdID0gIkJyb2tlbiBwaXBlIjsKLSNlbmRpZgotI2lmZGVmIFNJR0FMUk0KLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdBTFJNXSA9ICJBbGFybSBjbG9jayI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdURVJNCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHVEVSTV0gPSAiVGVybWluYXRlZCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdVU1IxCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHVVNSMV0gPSAiVXNlciBkZWZpbmVkIHNpZ25hbCAxIjsKLSNlbmRpZgotI2lmZGVmIFNJR1VTUjIKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdVU1IyXSA9ICJVc2VyIGRlZmluZWQgc2lnbmFsIDIiOwotI2VuZGlmCi0jaWZkZWYgU0lHQ0xECi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHQ0xEXSA9ICJDaGlsZCBzdGF0dXMgY2hhbmdlIjsKLSNlbmRpZgotI2lmZGVmIFNJR0NITEQKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdDSExEXSA9ICJDaGlsZCBzdGF0dXMgY2hhbmdlIjsKLSNlbmRpZgotI2lmZGVmIFNJR1BXUgotICAgIGFwX3N5c19zaWdsaXN0W1NJR1BXUl0gPSAiUG93ZXItZmFpbCByZXN0YXJ0IjsKLSNlbmRpZgotI2lmZGVmIFNJR1dJTkNICi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHV0lOQ0hdID0gIldpbmRvdyBjaGFuZ2VkIjsKLSNlbmRpZgotI2lmZGVmIFNJR1VSRwotICAgIGFwX3N5c19zaWdsaXN0W1NJR1VSR10gPSAidXJnZW50IHNvY2tldCBjb25kaXRpb24iOwotI2VuZGlmCi0jaWZkZWYgU0lHUE9MTAotICAgIGFwX3N5c19zaWdsaXN0W1NJR1BPTExdID0gIlBvbGxhYmxlIGV2ZW50IG9jY3VycmVkIjsKLSNlbmRpZgotI2lmZGVmIFNJR0lPCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHSU9dID0gInNvY2tldCBJL08gcG9zc2libGUiOwotI2VuZGlmCi0jaWZkZWYgU0lHU1RPUAotICAgIGFwX3N5c19zaWdsaXN0W1NJR1NUT1BdID0gIlN0b3BwZWQgKHNpZ25hbCkiOwotI2VuZGlmCi0jaWZkZWYgU0lHVFNUUAotICAgIGFwX3N5c19zaWdsaXN0W1NJR1RTVFBdID0gIlN0b3BwZWQiOwotI2VuZGlmCi0jaWZkZWYgU0lHQ09OVAotICAgIGFwX3N5c19zaWdsaXN0W1NJR0NPTlRdID0gIkNvbnRpbnVlZCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdUVElOCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHVFRJTl0gPSAiU3RvcHBlZCAodHR5IGlucHV0KSI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdUVE9VCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHVFRPVV0gPSAiU3RvcHBlZCAodHR5IG91dHB1dCkiOwotI2VuZGlmCi0jaWZkZWYgU0lHVlRBTFJNCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHVlRBTFJNXSA9ICJ2aXJ0dWFsIHRpbWVyIGV4cGlyZWQiOwotI2VuZGlmCi0jaWZkZWYgU0lHUFJPRgotICAgIGFwX3N5c19zaWdsaXN0W1NJR1BST0ZdID0gInByb2ZpbGluZyB0aW1lciBleHBpcmVkIjsKLSNlbmRpZgotI2lmZGVmIFNJR1hDUFUKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdYQ1BVXSA9ICJleGNlZWRlZCBjcHUgbGltaXQiOwotI2VuZGlmCi0jaWZkZWYgU0lHWEZTWgotICAgIGFwX3N5c19zaWdsaXN0W1NJR1hGU1pdID0gImV4Y2VlZGVkIGZpbGUgc2l6ZSBsaW1pdCI7Ci0jZW5kaWYKLSAgICBmb3IgKHNpZz0wOyBzaWcgPCBzaXplb2YoYXBfc3lzX3NpZ2xpc3QpL3NpemVvZihhcF9zeXNfc2lnbGlzdFswXSk7ICsrc2lnKQotICAgICAgICBpZiAoYXBfc3lzX3NpZ2xpc3Rbc2lnXSA9PSBOVUxMKQotICAgICAgICAgICAgYXBfc3lzX3NpZ2xpc3Rbc2lnXSA9ICIiOwotfQotI2VuZGlmIC8qIHBsYXRmb3JtIGhhcyBzeXNfc2lnbGlzdFtdICovCi0KLQotLyogaGFuZGxlIGFsbCB2YXJpZXRpZXMgb2YgY29yZSBkdW1waW5nIHNpZ25hbHMgKi8KLXN0YXRpYyB2b2lkIHNpZ19jb3JlZHVtcChpbnQgc2lnKQotewotICAgIGNoZGlyKGFwX2NvcmVkdW1wX2Rpcik7Ci0gICAgc2lnbmFsKHNpZywgU0lHX0RGTCk7Ci0jaWZuZGVmIFdJTjMyCi0gICAga2lsbChnZXRwaWQoKSwgc2lnKTsKLSNlbHNlCi0gICAgcmFpc2Uoc2lnKTsKLSNlbmRpZgotICAgIC8qIEF0IHRoaXMgcG9pbnQgd2UndmUgZ290IHNpZyBibG9ja2VkLCBiZWNhdXNlIHdlJ3JlIHN0aWxsIGluc2lkZQotICAgICAqIHRoZSBzaWduYWwgaGFuZGxlci4gIFdoZW4gd2UgbGVhdmUgdGhlIHNpZ25hbCBoYW5kbGVyIGl0IHdpbGwKLSAgICAgKiBiZSB1bmJsb2NrZWQsIGFuZCB3ZSdsbCB0YWtlIHRoZSBzaWduYWwuLi4gYW5kIGNvcmVkdW1wIG9yIHdoYXRldmVyCi0gICAgICogaXMgYXBwcm9wcmlhdGUgZm9yIHRoaXMgcGFydGljdWxhciBVbml4LiAgSW4gYWRkaXRpb24gdGhlIHBhcmVudAotICAgICAqIHdpbGwgc2VlIHRoZSByZWFsIHNpZ25hbCB3ZSByZWNlaXZlZCAtLSB3aGVyZWFzIGlmIHdlIGNhbGxlZAotICAgICAqIGFib3J0KCkgaGVyZSwgdGhlIHBhcmVudCB3b3VsZCBvbmx5IHNlZSBTSUdBQlJULgotICAgICAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbm5lY3Rpb24gc3RydWN0dXJlcyBhbmQgYWNjb3VudGluZy4uLgotICovCi0KLXN0YXRpYyB2b2lkIGp1c3RfZGllKGludCBzaWcpCi17CQkJCS8qIFNJR0hVUCB0byBjaGlsZCBwcm9jZXNzPz8/ICovCi0gICAgLyogaWYgYWxhcm1zIGFyZSBibG9ja2VkIHdlIGhhdmUgdG8gd2FpdCB0byBkaWUgb3RoZXJ3aXNlIHdlIG1pZ2h0Ci0gICAgICogZW5kIHVwIHdpdGggY29ycnVwdGlvbiBpbiBhbGxvYy5jJ3MgaW50ZXJuYWwgc3RydWN0dXJlcyAqLwotICAgIGlmIChhbGFybXNfYmxvY2tlZCkgewotCWV4aXRfYWZ0ZXJfdW5ibG9jayA9IDE7Ci0gICAgfQotICAgIGVsc2UgewotCWNsZWFuX2NoaWxkX2V4aXQoMCk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IHZvbGF0aWxlIHVzcjFfanVzdF9kaWUgPSAxOwotc3RhdGljIGludCB2b2xhdGlsZSBkZWZlcnJlZF9kaWU7Ci0KLXN0YXRpYyB2b2lkIHVzcjFfaGFuZGxlcihpbnQgc2lnKQotewotICAgIGlmICh1c3IxX2p1c3RfZGllKSB7Ci0JanVzdF9kaWUoc2lnKTsKLSAgICB9Ci0gICAgZGVmZXJyZWRfZGllID0gMTsKLX0KLQotLyogdm9sYXRpbGUganVzdCBpbiBjYXNlICovCi1zdGF0aWMgaW50IHZvbGF0aWxlIHNodXRkb3duX3BlbmRpbmc7Ci1zdGF0aWMgaW50IHZvbGF0aWxlIHJlc3RhcnRfcGVuZGluZzsKLXN0YXRpYyBpbnQgdm9sYXRpbGUgaXNfZ3JhY2VmdWw7Ci1hcF9nZW5lcmF0aW9uX3Qgdm9sYXRpbGUgYXBfbXlfZ2VuZXJhdGlvbj0wOwotCi0jaWZkZWYgV0lOMzIKLS8qCi0gKiBTaWduYWxsaW5nIEFwYWNoZSBvbiBOVC4KLSAqCi0gKiBVbmRlciBVbml4LCBBcGFjaGUgY2FuIGJlIHRvbGQgdG8gc2h1dGRvd24gb3IgcmVzdGFydCBieSBzZW5kaW5nIHZhcmlvdXMKLSAqIHNpZ25hbHMgKEhVUCwgVVNSLCBURVJNKS4gT24gTlQgd2UgZG9uJ3QgaGF2ZSBlYXN5IGFjY2VzcyB0byBzaWduYWxzLCBzbwotICogd2UgdXNlICJldmVudHMiIGluc3RlYWQuIFRoZSBwYXJlbnQgYXBhY2hlIHByb2Nlc3MgZ29lcyBpbnRvIGEgbG9vcAotICogd2hlcmUgaXQgd2FpdHMgZm9yZXZlciBmb3IgYSBzZXQgb2YgZXZlbnRzLiBUd28gb2YgdGhvc2UgZXZlbnRzIGFyZQotICogY2FsbGVkCi0gKgotICogICAgYXBQSURfc2h1dGRvd24KLSAqICAgIGFwUElEX3Jlc3RhcnQKLSAqCi0gKiAod2hlcmUgUElEIGlzIHRoZSBQSUQgb2YgdGhlIGFwYWNoZSBwYXJlbnQgcHJvY2VzcykuIFdoZW4gb25lIG9mIHRoZXNlCi0gKiBpcyBzaWduYWxsZWQsIHRoZSBBcGFjaGUgcGFyZW50IHBlcmZvcm1zIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24uIFRoZSBldmVudHMKLSAqIGNhbiBiZWNvbWUgc2lnbmFsbGVkIHRocm91Z2ggaW50ZXJuYWwgQXBhY2hlIG1ldGhvZHMgKGUuZy4gaWYgdGhlIGNoaWxkCi0gKiBmaW5kcyBhIGZhdGFsIGVycm9yIGFuZCBuZWVkcyB0byBraWxsIGl0cyBwYXJlbnQpLCB2aWEgdGhlIHNlcnZpY2UKLSAqIGNvbnRyb2wgbWFuYWdlciAodGhlIGNvbnRyb2wgdGhyZWFkIHdpbGwgc2lnbmFsIHRoZSBzaHV0ZG93biBldmVudCB3aGVuCi0gKiByZXF1ZXN0ZWQgdG8gc3RvcCB0aGUgQXBhY2hlIHNlcnZpY2UpLCBmcm9tIHRoZSAtayBBcGFjaGUgY29tbWFuZCBsaW5lLAotICogb3IgZnJvbSBhbnkgZXh0ZXJuYWwgcHJvZ3JhbSB3aGljaCBmaW5kcyB0aGUgQXBhY2hlIFBJRCBmcm9tIHRoZQotICogaHR0cGQucGlkIGZpbGUuCi0gKgotICogVGhlIHNpZ25hbF9wYXJlbnQoKSBmdW5jdGlvbiwgYmVsb3csIGlzIHVzZWQgdG8gc2lnbmFsIG9uZSBvZiB0aGVzZSBldmVudHMuCi0gKiBJdCBjYW4gYmUgY2FsbGVkIGJ5IGFueSBjaGlsZCBvciBwYXJlbnQgcHJvY2Vzcywgc2luY2UgaXQgZG9lcyBub3QKLSAqIHJlbHkgb24gZ2xvYmFsIHZhcmlhYmxlcy4KLSAqCi0gKiBPbiBlbnRyeSwgdHlwZSBnaXZlcyB0aGUgZXZlbnQgdG8gc2lnbmFsLiAwIG1lYW5zIHNodXRkb3duLCAxIG1lYW5zIAotICogZ3JhY2VmdWwgcmVzdGFydC4KLSAqLwotCi1zdGF0aWMgdm9pZCBzaWduYWxfcGFyZW50KGludCB0eXBlKQotewotICAgIEhBTkRMRSBlOwotICAgIGNoYXIgKnNpZ25hbF9uYW1lOwotICAgIGV4dGVybiBjaGFyIHNpZ25hbF9zaHV0ZG93bl9uYW1lW107Ci0gICAgZXh0ZXJuIGNoYXIgc2lnbmFsX3Jlc3RhcnRfbmFtZVtdOwotCi0gICAgLyogYWZ0ZXIgdXBkYXRpbmcgdGhlIHNodXRkb3duX3BlbmRpbmcgb3IgcmVzdGFydCBmbGFncywgd2UgbmVlZAotICAgICAqIHRvIHdha2UgdXAgdGhlIHBhcmVudCBwcm9jZXNzIHNvIGl0IGNhbiBzZWUgdGhlIGNoYW5nZXMuIFRoZQotICAgICAqIHBhcmVudCB3aWxsIG5vcm1hbGx5IGJlIHdhaXRpbmcgZm9yIGVpdGhlciBhIGNoaWxkIHByb2Nlc3MKLSAgICAgKiB0byBkaWUsIG9yIGZvciBhIHNpZ25hbCBvbiB0aGUgInNwYWNoZS1zaWduYWwiIGV2ZW50LiBTbyBzZXQgdGhlCi0gICAgICogImFwYWNoZS1zaWduYWwiIGV2ZW50IGhlcmUuCi0gICAgICovCi0KLSAgICBpZiAob25lX3Byb2Nlc3MpIHsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgc3dpdGNoKHR5cGUpIHsKLSAgICBjYXNlIDA6IHNpZ25hbF9uYW1lID0gc2lnbmFsX3NodXRkb3duX25hbWU7IGJyZWFrOwotICAgIGNhc2UgMTogc2lnbmFsX25hbWUgPSBzaWduYWxfcmVzdGFydF9uYW1lOyBicmVhazsKLSAgICBkZWZhdWx0OiByZXR1cm47Ci0gICAgfQotCi0gICAgQVBEMigic2lnbmFsX3BhcmVudCBzaWduYWxsaW5nIGV2ZW50IFwiJXNcIiIsIHNpZ25hbF9uYW1lKTsKLQotICAgIGUgPSBPcGVuRXZlbnQoRVZFTlRfQUxMX0FDQ0VTUywgRkFMU0UsIHNpZ25hbF9uYW1lKTsKLSAgICBpZiAoIWUpIHsKLQkvKiBVbSwgcHJvYmxlbSwgY2FuJ3Qgc2lnbmFsIHRoZSBwYXJlbnQsIHdoaWNoIG1lYW5zIHdlIGNhbid0Ci0JICogc2lnbmFsIG91cnNlbHZlcyB0byBkaWUuIElnbm9yZSBmb3Igbm93Li4uCi0JICovCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHfEFQTE9HX1dJTjMyRVJST1IsIHNlcnZlcl9jb25mLAotCSAgICAiT3BlbkV2ZW50IG9uICVzIGV2ZW50Iiwgc2lnbmFsX25hbWUpOwotCXJldHVybjsKLSAgICB9Ci0gICAgaWYgKFNldEV2ZW50KGUpID09IDApIHsKLQkvKiBTYW1lIHByb2JsZW0gYXMgYWJvdmUgKi8KLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkd8QVBMT0dfV0lOMzJFUlJPUiwgc2VydmVyX2NvbmYsCi0JICAgICJTZXRFdmVudCBvbiAlcyBldmVudCIsIHNpZ25hbF9uYW1lKTsKLQlDbG9zZUhhbmRsZShlKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIENsb3NlSGFuZGxlKGUpOwotfQotI2VuZGlmCi0KLS8qCi0gKiBhcF9zdGFydF9zaHV0ZG93bigpIGFuZCBhcF9zdGFydF9yZXN0YXJ0KCksIGJlbG93LCBhcmUgYSBmaXJzdCBzdGFiIGF0Ci0gKiBmdW5jdGlvbnMgdG8gaW5pdGlhdGUgc2h1dGRvd24gb3IgcmVzdGFydCB3aXRob3V0IHJlbHlpbmcgb24gc2lnbmFscy4gCi0gKiBQcmV2aW91c2x5IHRoaXMgd2FzIGluaXRpYXRlZCBpbiBzaWdfdGVybSgpIGFuZCByZXN0YXJ0KCkgc2lnbmFsIGhhbmRsZXJzLCAKLSAqIGJ1dCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gc3RhcnQgYSBzaHV0ZG93bi9yZXN0YXJ0IGZyb20gb3RoZXIgc291cmNlcyAtLQotICogZS5nLiBvbiBXaW4zMiwgZnJvbSB0aGUgc2VydmljZSBtYW5hZ2VyLiBOb3cgdGhlIHNlcnZpY2UgbWFuYWdlciBjYW4KLSAqIGNhbGwgYXBfc3RhcnRfc2h1dGRvd24oKSBvciBhcF9zdGFydF9yZXN0YXJ0KCkgYXMgYXBwcm9waWF0ZS4gIE5vdGUgdGhhdAotICogdGhlc2UgZnVuY3Rpb25zIGNhbiBhbHNvIGJlIGNhbGxlZCBieSB0aGUgY2hpbGQgcHJvY2Vzc2VzLCBzaW5jZSBnbG9iYWwKLSAqIHZhcmlhYmxlcyBhcmUgbm8gbG9uZ2VyIHVzZWQgdG8gcGFzcyBvbiB0aGUgcmVxdWlyZWQgYWN0aW9uIHRvIHRoZSBwYXJlbnQuCi0gKi8KLQotdm9pZCBhcF9zdGFydF9zaHV0ZG93bih2b2lkKQotewotI2lmbmRlZiBXSU4zMgotICAgIGlmIChzaHV0ZG93bl9wZW5kaW5nID09IDEpIHsKLQkvKiBVbSwgaXMgdGhpcyBfcHJvYmFibHlfIG5vdCBhbiBlcnJvciwgaWYgdGhlIHVzZXIgaGFzCi0JICogdHJpZWQgdG8gZG8gYSBzaHV0ZG93biB0d2ljZSBxdWlja2x5LCBzbyB3ZSB3b24ndAotCSAqIHdvcnJ5IGFib3V0IHJlcG9ydGluZyBpdC4KLQkgKi8KLQlyZXR1cm47Ci0gICAgfQotICAgIHNodXRkb3duX3BlbmRpbmcgPSAxOwotI2Vsc2UKLSAgICBzaWduYWxfcGFyZW50KDApOwkgICAgLyogZ2V0IHRoZSBwYXJlbnQgcHJvY2VzcyB0byB3YWtlIHVwICovCi0jZW5kaWYKLX0KLQotLyogZG8gYSBncmFjZWZ1bCByZXN0YXJ0IGlmIGdyYWNlZnVsID09IDEgKi8KLXZvaWQgYXBfc3RhcnRfcmVzdGFydChpbnQgZ3JhY2VmdWwpCi17Ci0jaWZuZGVmIFdJTjMyCi0gICAgaWYgKHJlc3RhcnRfcGVuZGluZyA9PSAxKSB7Ci0JLyogUHJvYmFibHkgbm90IGFuIGVycm9yIC0gZG9uJ3QgYm90aGVyIHJlcG9ydGluZyBpdCAqLwotCXJldHVybjsKLSAgICB9Ci0gICAgcmVzdGFydF9wZW5kaW5nID0gMTsKLSAgICBpc19ncmFjZWZ1bCA9IGdyYWNlZnVsOwotI2Vsc2UKLSAgICBzaWduYWxfcGFyZW50KDEpOwkgICAgLyogZ2V0IHRoZSBwYXJlbnQgcHJvY2VzcyB0byB3YWtlIHVwICovCi0jZW5kaWYgLyogV0lOMzIgKi8KLX0KLQotc3RhdGljIHZvaWQgc2lnX3Rlcm0oaW50IHNpZykKLXsKLSAgICBhcF9zdGFydF9zaHV0ZG93bigpOwotfQotCi1zdGF0aWMgdm9pZCByZXN0YXJ0KGludCBzaWcpCi17Ci0jaWZuZGVmIFdJTjMyCi0gICAgYXBfc3RhcnRfcmVzdGFydChzaWcgPT0gU0lHVVNSMSk7Ci0jZWxzZQotICAgIGFwX3N0YXJ0X3Jlc3RhcnQoMSk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgc2V0X3NpZ25hbHModm9pZCkKLXsKLSNpZm5kZWYgTk9fVVNFX1NJR0FDVElPTgotICAgIHN0cnVjdCBzaWdhY3Rpb24gc2E7Ci0KLSAgICBzaWdlbXB0eXNldCgmc2Euc2FfbWFzayk7Ci0gICAgc2Euc2FfZmxhZ3MgPSAwOwotCi0gICAgaWYgKCFvbmVfcHJvY2VzcykgewotCXNhLnNhX2hhbmRsZXIgPSBzaWdfY29yZWR1bXA7Ci0jaWYgZGVmaW5lZChTQV9PTkVTSE9UKQotCXNhLnNhX2ZsYWdzID0gU0FfT05FU0hPVDsKLSNlbGlmIGRlZmluZWQoU0FfUkVTRVRIQU5EKQotCXNhLnNhX2ZsYWdzID0gU0FfUkVTRVRIQU5EOwotI2VuZGlmCi0JaWYgKHNpZ2FjdGlvbihTSUdTRUdWLCAmc2EsIE5VTEwpIDwgMCkKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR1NFR1YpIik7Ci0jaWZkZWYgU0lHQlVTCi0JaWYgKHNpZ2FjdGlvbihTSUdCVVMsICZzYSwgTlVMTCkgPCAwKQotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHQlVTKSIpOwotI2VuZGlmCi0jaWZkZWYgU0lHQUJPUlQKLQlpZiAoc2lnYWN0aW9uKFNJR0FCT1JULCAmc2EsIE5VTEwpIDwgMCkKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR0FCT1JUKSIpOwotI2VuZGlmCi0jaWZkZWYgU0lHQUJSVAotCWlmIChzaWdhY3Rpb24oU0lHQUJSVCwgJnNhLCBOVUxMKSA8IDApCi0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdBQlJUKSIpOwotI2VuZGlmCi0jaWZkZWYgU0lHSUxMCi0JaWYgKHNpZ2FjdGlvbihTSUdJTEwsICZzYSwgTlVMTCkgPCAwKQotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHSUxMKSIpOwotI2VuZGlmCi0Jc2Euc2FfZmxhZ3MgPSAwOwotICAgIH0KLSAgICBzYS5zYV9oYW5kbGVyID0gc2lnX3Rlcm07Ci0gICAgaWYgKHNpZ2FjdGlvbihTSUdURVJNLCAmc2EsIE5VTEwpIDwgMCkKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHVEVSTSkiKTsKLSNpZmRlZiBTSUdJTlQKLSAgICBpZiAoc2lnYWN0aW9uKFNJR0lOVCwgJnNhLCBOVUxMKSA8IDApCi0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdJTlQpIik7Ci0jZW5kaWYKLSNpZmRlZiBTSUdYQ1BVCi0gICAgc2Euc2FfaGFuZGxlciA9IFNJR19ERkw7Ci0gICAgaWYgKHNpZ2FjdGlvbihTSUdYQ1BVLCAmc2EsIE5VTEwpIDwgMCkKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHWENQVSkiKTsKLSNlbmRpZgotI2lmZGVmIFNJR1hGU1oKLSAgICBzYS5zYV9oYW5kbGVyID0gU0lHX0RGTDsKLSAgICBpZiAoc2lnYWN0aW9uKFNJR1hGU1osICZzYSwgTlVMTCkgPCAwKQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdYRlNaKSIpOwotI2VuZGlmCi0jaWZkZWYgU0lHUElQRQotICAgIHNhLnNhX2hhbmRsZXIgPSBTSUdfSUdOOwotICAgIGlmIChzaWdhY3Rpb24oU0lHUElQRSwgJnNhLCBOVUxMKSA8IDApCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR1BJUEUpIik7Ci0jZW5kaWYKLQotICAgIC8qIHdlIHdhbnQgdG8gaWdub3JlIEhVUHMgYW5kIFVTUjEgd2hpbGUgd2UncmUgYnVzeSBwcm9jZXNzaW5nIG9uZSAqLwotICAgIHNpZ2FkZHNldCgmc2Euc2FfbWFzaywgU0lHSFVQKTsKLSAgICBzaWdhZGRzZXQoJnNhLnNhX21hc2ssIFNJR1VTUjEpOwotICAgIHNhLnNhX2hhbmRsZXIgPSByZXN0YXJ0OwotICAgIGlmIChzaWdhY3Rpb24oU0lHSFVQLCAmc2EsIE5VTEwpIDwgMCkKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHSFVQKSIpOwotICAgIGlmIChzaWdhY3Rpb24oU0lHVVNSMSwgJnNhLCBOVUxMKSA8IDApCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR1VTUjEpIik7Ci0jZWxzZQotICAgIGlmICghb25lX3Byb2Nlc3MpIHsKLQlzaWduYWwoU0lHU0VHViwgc2lnX2NvcmVkdW1wKTsKLSNpZmRlZiBTSUdCVVMKLQlzaWduYWwoU0lHQlVTLCBzaWdfY29yZWR1bXApOwotI2VuZGlmIC8qIFNJR0JVUyAqLwotI2lmZGVmIFNJR0FCT1JUCi0Jc2lnbmFsKFNJR0FCT1JULCBzaWdfY29yZWR1bXApOwotI2VuZGlmIC8qIFNJR0FCT1JUICovCi0jaWZkZWYgU0lHQUJSVAotCXNpZ25hbChTSUdBQlJULCBzaWdfY29yZWR1bXApOwotI2VuZGlmIC8qIFNJR0FCUlQgKi8KLSNpZmRlZiBTSUdJTEwKLQlzaWduYWwoU0lHSUxMLCBzaWdfY29yZWR1bXApOwotI2VuZGlmIC8qIFNJR0lMTCAqLwotI2lmZGVmIFNJR1hDUFUKLQlzaWduYWwoU0lHWENQVSwgU0lHX0RGTCk7Ci0jZW5kaWYgLyogU0lHWENQVSAqLwotI2lmZGVmIFNJR1hGU1oKLQlzaWduYWwoU0lHWEZTWiwgU0lHX0RGTCk7Ci0jZW5kaWYgLyogU0lHWEZTWiAqLwotICAgIH0KLQotICAgIHNpZ25hbChTSUdURVJNLCBzaWdfdGVybSk7Ci0jaWZkZWYgU0lHSFVQCi0gICAgc2lnbmFsKFNJR0hVUCwgcmVzdGFydCk7Ci0jZW5kaWYgLyogU0lHSFVQICovCi0jaWZkZWYgU0lHVVNSMQotICAgIHNpZ25hbChTSUdVU1IxLCByZXN0YXJ0KTsKLSNlbmRpZiAvKiBTSUdVU1IxICovCi0jaWZkZWYgU0lHUElQRQotICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKLSNlbmRpZiAvKiBTSUdQSVBFICovCi0KLSNlbmRpZgotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSGVyZSBmb2xsb3dzIGEgbG9uZyBidW5jaCBvZiBnZW5lcmljIHNlcnZlciBib29ra2VlcGluZyBzdHVmZi4uLgotICovCi0KLXN0YXRpYyB2b2lkIGRldGFjaCh2b2lkKQotewotI2lmICFkZWZpbmVkKFdJTjMyKQotICAgIGludCB4OwotCi0gICAgY2hkaXIoIi8iKTsKLSNpZiAhZGVmaW5lZChNUEUpICYmICFkZWZpbmVkKE9TMikgJiYgIWRlZmluZWQoVFBGKQotLyogRG9uJ3QgZGV0YWNoIGZvciBNUEUgYmVjYXVzZSBjaGlsZCBwcm9jZXNzZXMgY2FuJ3Qgc3Vydml2ZSB0aGUgZGVhdGggb2YKLSAgIHRoZSBwYXJlbnQuICovCi0gICAgaWYgKCh4ID0gZm9yaygpKSA+IDApCi0JZXhpdCgwKTsKLSAgICBlbHNlIGlmICh4ID09IC0xKSB7Ci0JcGVycm9yKCJmb3JrIik7Ci0JZnByaW50ZihzdGRlcnIsICIlczogdW5hYmxlIHRvIGZvcmsgbmV3IHByb2Nlc3NcbiIsIGFwX3NlcnZlcl9hcmd2MCk7Ci0JZXhpdCgxKTsKLSAgICB9Ci0gICAgUkFJU0VfU0lHU1RPUChERVRBQ0gpOwotI2VuZGlmCi0jaWZuZGVmIE5PX1NFVFNJRAotICAgIGlmICgocGdycCA9IHNldHNpZCgpKSA9PSAtMSkgewotCXBlcnJvcigic2V0c2lkIik7Ci0JZnByaW50ZihzdGRlcnIsICIlczogc2V0c2lkIGZhaWxlZFxuIiwgYXBfc2VydmVyX2FyZ3YwKTsKLQlleGl0KDEpOwotICAgIH0KLSNlbGlmIGRlZmluZWQoTkVYVCkgfHwgZGVmaW5lZChORVdTT1MpCi0gICAgaWYgKHNldHBncnAoMCwgZ2V0cGlkKCkpID09IC0xIHx8IChwZ3JwID0gZ2V0cGdycCgwKSkgPT0gLTEpIHsKLQlwZXJyb3IoInNldHBncnAiKTsKLQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBzZXRwZ3JwIG9yIGdldHBncnAgZmFpbGVkXG4iLCBhcF9zZXJ2ZXJfYXJndjApOwotCWV4aXQoMSk7Ci0gICAgfQotI2VsaWYgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoVFBGKQotICAgIC8qIE9TLzIgYW5kIFRQRiBkb24ndCBzdXBwb3J0IHByb2Nlc3MgZ3JvdXAgSURzICovCi0gICAgcGdycCA9IGdldHBpZCgpOwotI2VsaWYgZGVmaW5lZChNUEUpCi0gICAgLyogTVBFIHVzZXMgbmVnYXRpdmUgcGlkIGZvciBwcm9jZXNzIGdyb3VwICovCi0gICAgcGdycCA9IC1nZXRwaWQoKTsKLSNlbHNlCi0gICAgaWYgKChwZ3JwID0gc2V0cGdycChnZXRwaWQoKSwgMCkpID09IC0xKSB7Ci0JcGVycm9yKCJzZXRwZ3JwIik7Ci0JZnByaW50ZihzdGRlcnIsICIlczogc2V0cGdycCBmYWlsZWRcbiIsIGFwX3NlcnZlcl9hcmd2MCk7Ci0JZXhpdCgxKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8qIGNsb3NlIG91dCB0aGUgc3RhbmRhcmQgZmlsZSBkZXNjcmlwdG9ycyAqLwotICAgIGlmIChmcmVvcGVuKCIvZGV2L251bGwiLCAiciIsIHN0ZGluKSA9PSBOVUxMKSB7Ci0JZnByaW50ZihzdGRlcnIsICIlczogdW5hYmxlIHRvIHJlcGxhY2Ugc3RkaW4gd2l0aCAvZGV2L251bGw6ICVzXG4iLAotCQlhcF9zZXJ2ZXJfYXJndjAsIHN0cmVycm9yKGVycm5vKSk7Ci0JLyogY29udGludWUgYW55aG93IC0tIG5vdGUgd2UgY2FuJ3QgY2xvc2Ugb3V0IGRlc2NyaXB0b3IgMCBiZWNhdXNlIHdlCi0JICogaGF2ZSBub3RoaW5nIHRvIHJlcGxhY2UgaXQgd2l0aCwgYW5kIGlmIHdlIGRpZG4ndCBoYXZlIGEgZGVzY3JpcHRvcgotCSAqIDAgdGhlIG5leHQgZmlsZSB3b3VsZCBiZSBjcmVhdGVkIHdpdGggdGhhdCB2YWx1ZSAuLi4gbGVhZGluZyB0bwotCSAqIGhhdm9jLgotCSAqLwotICAgIH0KLSAgICBpZiAoZnJlb3BlbigiL2Rldi9udWxsIiwgInciLCBzdGRvdXQpID09IE5VTEwpIHsKLQlmcHJpbnRmKHN0ZGVyciwgIiVzOiB1bmFibGUgdG8gcmVwbGFjZSBzdGRvdXQgd2l0aCAvZGV2L251bGw6ICVzXG4iLAotCQlhcF9zZXJ2ZXJfYXJndjAsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgfQotICAgIC8qIHN0ZGVyciBpcyBhIHRyaWNreSBvbmUsIHdlIHJlYWxseSB3YW50IGl0IHRvIGJlIHRoZSBlcnJvcl9sb2csCi0gICAgICogYnV0IHdlIGhhdmVuJ3Qgb3BlbmVkIHRoYXQgeWV0LiAgU28gbGVhdmUgaXQgYWxvbmUgZm9yIG5vdyBhbmQgaXQnbGwKLSAgICAgKiBiZSByZW9wZW5lZCBtb21lbnRzIGxhdGVyLgotICAgICAqLwotI2VuZGlmIC8qIG5kZWYgV0lOMzIgKi8KLX0KLQotLyogU2V0IGdyb3VwIHByaXZpbGVnZXMuCi0gKgotICogTm90ZSB0aGF0IHdlIHVzZSB0aGUgdXNlcm5hbWUgYXMgc2V0IGluIHRoZSBjb25maWcgZmlsZXMsIHJhdGhlciB0aGFuCi0gKiB0aGUgbG9va3VwIG9mIHRvIHVpZCAtLS0gdGhlIHNhbWUgdWlkIG1heSBoYXZlIG11bHRpcGxlIHBhc3N3ZCBlbnRyaWVzLAotICogd2l0aCBkaWZmZXJlbnQgc2V0cyBvZiBncm91cHMgZm9yIGVhY2guCi0gKi8KLQotc3RhdGljIHZvaWQgc2V0X2dyb3VwX3ByaXZzKHZvaWQpCi17Ci0jaWZuZGVmIFdJTjMyCi0gICAgaWYgKCFnZXRldWlkKCkpIHsKLQljaGFyICpuYW1lOwotCi0JLyogR2V0IHVzZXJuYW1lIGlmIHBhc3NlZCBhcyBhIHVpZCAqLwotCi0JaWYgKGFwX3VzZXJfbmFtZVswXSA9PSAnIycpIHsKLQkgICAgc3RydWN0IHBhc3N3ZCAqZW50OwotCSAgICB1aWRfdCB1aWQgPSBhdG9pKCZhcF91c2VyX25hbWVbMV0pOwotCi0JICAgIGlmICgoZW50ID0gZ2V0cHd1aWQodWlkKSkgPT0gTlVMTCkgewotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlQsIHNlcnZlcl9jb25mLAotCQkJICJnZXRwd3VpZDogY291bGRuJ3QgZGV0ZXJtaW5lIHVzZXIgbmFtZSBmcm9tIHVpZCAldSwgIgotCQkJICJ5b3UgcHJvYmFibHkgbmVlZCB0byBtb2RpZnkgdGhlIFVzZXIgZGlyZWN0aXZlIiwKLQkJCSAodW5zaWduZWQpdWlkKTsKLQkJY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0JICAgIH0KLQotCSAgICBuYW1lID0gZW50LT5wd19uYW1lOwotCX0KLQllbHNlCi0JICAgIG5hbWUgPSBhcF91c2VyX25hbWU7Ci0KLSNpZiAhZGVmaW5lZChPUzIpICYmICFkZWZpbmVkKFRQRikKLQkvKiBPUy8yIGFuZCBUUEYgZG9uJ3Qgc3VwcG9ydCBncm91cHMuICovCi0KLQkvKgotCSAqIFNldCB0aGUgR0lEIGJlZm9yZSBpbml0Z3JvdXBzKCksIHNpbmNlIG9uIHNvbWUgcGxhdGZvcm1zCi0JICogc2V0Z2lkKCkgaXMga25vd24gdG8gemFwIHRoZSBncm91cCBsaXN0LgotCSAqLwotCWlmIChzZXRnaWQoYXBfZ3JvdXBfaWQpID09IC0xKSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgc2VydmVyX2NvbmYsCi0JCQkic2V0Z2lkOiB1bmFibGUgdG8gc2V0IGdyb3VwIGlkIHRvIEdyb3VwICV1IiwKLQkJCSh1bnNpZ25lZClhcF9ncm91cF9pZCk7Ci0JICAgIGNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotCX0KLQotCS8qIFJlc2V0IGBncm91cHMnIGF0dHJpYnV0ZXMuICovCi0KLQlpZiAoaW5pdGdyb3VwcyhuYW1lLCBhcF9ncm91cF9pZCkgPT0gLTEpIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0FMRVJULCBzZXJ2ZXJfY29uZiwKLQkJCSJpbml0Z3JvdXBzOiB1bmFibGUgdG8gc2V0IGdyb3VwcyBmb3IgVXNlciAlcyAiCi0JCQkiYW5kIEdyb3VwICV1IiwgbmFtZSwgKHVuc2lnbmVkKWFwX2dyb3VwX2lkKTsKLQkgICAgY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0JfQotI2lmZGVmIE1VTFRJUExFX0dST1VQUwotCWlmIChnZXRncm91cHMoTkdST1VQU19NQVgsIGdyb3VwX2lkX2xpc3QpID09IC0xKSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgc2VydmVyX2NvbmYsCi0JCQkiZ2V0Z3JvdXBzOiB1bmFibGUgdG8gZ2V0IGdyb3VwIGxpc3QiKTsKLQkgICAgY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0JfQotI2VuZGlmIC8qIE1VTFRJUExFX0dST1VQUyAqLwotI2VuZGlmIC8qICFkZWZpbmVkKE9TMikgJiYgIWRlZmluZWQoVFBGKSAqLwotICAgIH0KLSNlbmRpZiAvKiBuZGVmIFdJTjMyICovCi19Ci0KLS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIHRoZSAnc3VleGVjJyBzZXR1aWQgd3JhcHBlciBpbnN0YWxsZWQgKi8KLXN0YXRpYyBpbnQgaW5pdF9zdWV4ZWModm9pZCkKLXsKLSNpZm5kZWYgV0lOMzIKLSAgICBzdHJ1Y3Qgc3RhdCB3cmFwcGVyOwotCi0gICAgaWYgKChzdGF0KFNVRVhFQ19CSU4sICZ3cmFwcGVyKSkgIT0gMCkKLQlyZXR1cm4gKGFwX3N1ZXhlY19lbmFibGVkKTsKLQotICAgIGlmICgod3JhcHBlci5zdF9tb2RlICYgU19JU1VJRCkgJiYgd3JhcHBlci5zdF91aWQgPT0gMCkgewotCWFwX3N1ZXhlY19lbmFibGVkID0gMTsKLSAgICB9Ci0jZW5kaWYgLyogbmRlZiBXSU4zMiAqLwotICAgIHJldHVybiAoYXBfc3VleGVjX2VuYWJsZWQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbm5lY3Rpb24gc3RydWN0dXJlcyBhbmQgYWNjb3VudGluZy4uLgotICovCi0KLQotc3RhdGljIGNvbm5fcmVjICpuZXdfY29ubmVjdGlvbihwb29sICpwLCBzZXJ2ZXJfcmVjICpzZXJ2ZXIsIEJVRkYgKmlub3V0LAotCQkJICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnJlbWFkZHIsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqc2FkZHIsCi0JCQkgICAgIGludCBjaGlsZF9udW0pCi17Ci0gICAgY29ubl9yZWMgKmNvbm4gPSAoY29ubl9yZWMgKikgYXBfcGNhbGxvYyhwLCBzaXplb2YoY29ubl9yZWMpKTsKLQotICAgIC8qIEdvdCBhIGNvbm5lY3Rpb24gc3RydWN0dXJlLCBzbyBpbml0aWFsaXplIHdoYXQgZmllbGRzIHdlIGNhbgotICAgICAqICh0aGUgcmVzdCBhcmUgemVyb2VkIG91dCBieSBwY2FsbG9jKS4KLSAgICAgKi8KLQotICAgIGNvbm4tPmNoaWxkX251bSA9IGNoaWxkX251bTsKLQotICAgIGNvbm4tPnBvb2wgPSBwOwotICAgIGNvbm4tPmxvY2FsX2FkZHIgPSAqc2FkZHI7Ci0gICAgY29ubi0+bG9jYWxfaXAgPSBhcF9wc3RyZHVwKGNvbm4tPnBvb2wsCi0JCQkJaW5ldF9udG9hKGNvbm4tPmxvY2FsX2FkZHIuc2luX2FkZHIpKTsKLSAgICBjb25uLT5zZXJ2ZXIgPSBzZXJ2ZXI7IC8qIGp1c3QgYSBndWVzcyBmb3Igbm93ICovCi0gICAgYXBfdXBkYXRlX3Zob3N0X2dpdmVuX2lwKGNvbm4pOwotICAgIGNvbm4tPmJhc2Vfc2VydmVyID0gY29ubi0+c2VydmVyOwotICAgIGNvbm4tPmNsaWVudCA9IGlub3V0OwotCi0gICAgY29ubi0+cmVtb3RlX2FkZHIgPSAqcmVtYWRkcjsKLSAgICBjb25uLT5yZW1vdGVfaXAgPSBhcF9wc3RyZHVwKGNvbm4tPnBvb2wsCi0JCQkgICAgICBpbmV0X250b2EoY29ubi0+cmVtb3RlX2FkZHIuc2luX2FkZHIpKTsKLQotICAgIHJldHVybiBjb25uOwotfQotCi0jaWYgZGVmaW5lZChUQ1BfTk9ERUxBWSkgJiYgIWRlZmluZWQoTVBFKSAmJiAhZGVmaW5lZChUUEYpCi1zdGF0aWMgdm9pZCBzb2NrX2Rpc2FibGVfbmFnbGUoaW50IHMpCi17Ci0gICAgLyogVGhlIE5hZ2xlIGFsZ29yaXRobSBzYXlzIHRoYXQgd2Ugc2hvdWxkIGRlbGF5IHNlbmRpbmcgcGFydGlhbAotICAgICAqIHBhY2tldHMgaW4gaG9wZXMgb2YgZ2V0dGluZyBtb3JlIGRhdGEuICBXZSBkb24ndCB3YW50IHRvIGRvCi0gICAgICogdGhpczsgd2UgYXJlIG5vdCB0ZWxuZXQuICBUaGVyZSBhcmUgYmFkIGludGVyYWN0aW9ucyBiZXR3ZWVuCi0gICAgICogcGVyc2lzdGVudCBjb25uZWN0aW9ucyBhbmQgTmFnbGUncyBhbGdvcml0aG0gdGhhdCBoYXZlIHZlcnkgc2V2ZXJlCi0gICAgICogcGVyZm9ybWFuY2UgcGVuYWx0aWVzLiAgKEZhaWxpbmcgdG8gZGlzYWJsZSBOYWdsZSBpcyBub3QgbXVjaCBvZiBhCi0gICAgICogcHJvYmxlbSB3aXRoIHNpbXBsZSBIVFRQLikKLSAgICAgKgotICAgICAqIEluIHNwaXRlIG9mIHRoZXNlIHByb2JsZW1zLCBmYWlsdXJlIGhlcmUgaXMgbm90IGEgc2hvb3Rpbmcgb2ZmZW5zZS4KLSAgICAgKi8KLSAgICBpbnQganVzdF9zYXlfbm8gPSAxOwotCi0gICAgaWYgKHNldHNvY2tvcHQocywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAoY2hhciAqKSAmanVzdF9zYXlfbm8sCi0JCSAgIHNpemVvZihpbnQpKSA8IDApIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgc2VydmVyX2NvbmYsCi0JCSAgICAic2V0c29ja29wdDogKFRDUF9OT0RFTEFZKSIpOwotICAgIH0KLX0KLQotI2Vsc2UKLSNkZWZpbmUgc29ja19kaXNhYmxlX25hZ2xlKHMpCS8qIE5PT1AgKi8KLSNlbmRpZgotCi0KLXN0YXRpYyBpbnQgbWFrZV9zb2NrKHBvb2wgKnAsIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqc2VydmVyKQotewotICAgIGludCBzOwotICAgIGludCBvbmUgPSAxOwotICAgIGNoYXIgYWRkcls1MTJdOwotCi0gICAgaWYgKHNlcnZlci0+c2luX2FkZHIuc19hZGRyICE9IGh0b25sKElOQUREUl9BTlkpKQotCWFwX3NucHJpbnRmKGFkZHIsIHNpemVvZihhZGRyKSwgImFkZHJlc3MgJXMgcG9ydCAlZCIsCi0JCWluZXRfbnRvYShzZXJ2ZXItPnNpbl9hZGRyKSwgbnRvaHMoc2VydmVyLT5zaW5fcG9ydCkpOwotICAgIGVsc2UKLQlhcF9zbnByaW50ZihhZGRyLCBzaXplb2YoYWRkciksICJwb3J0ICVkIiwgbnRvaHMoc2VydmVyLT5zaW5fcG9ydCkpOwotCi0gICAgLyogbm90ZSB0aGF0IGJlY2F1c2Ugd2UncmUgYWJvdXQgdG8gc2xhY2sgd2UgZG9uJ3QgdXNlIHBzb2NrZXQgKi8KLSAgICBhcF9ibG9ja19hbGFybXMoKTsKLSAgICBpZiAoKHMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKSkgPT0gLTEpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQ1JJVCwgc2VydmVyX2NvbmYsCi0JCSAgICAibWFrZV9zb2NrOiBmYWlsZWQgdG8gZ2V0IGEgc29ja2V0IGZvciAlcyIsIGFkZHIpOwotCWFwX3VuYmxvY2tfYWxhcm1zKCk7Ci0JZXhpdCgxKTsKLSAgICB9Ci0KLSAgICAvKiBTb2xhcmlzIChwcm9iYWJseSB2ZXJzaW9ucyAyLjQsIDIuNSwgYW5kIDIuNS4xIHdpdGggdmFyaW91cyBsZXZlbHMKLSAgICAgKiBvZiB0Y3AgcGF0Y2hlcykgaGFzIHNvbWUgcmVhbGx5IHdlaXJkIGJ1Z3Mgd2hlcmUgaWYgeW91IGR1cCB0aGUKLSAgICAgKiBzb2NrZXQgbm93IGl0IGJyZWFrcyB0aGluZ3MgYWNyb3NzIFNJR0hVUCByZXN0YXJ0cy4gIEl0J2xsIGVpdGhlcgotICAgICAqIGJlIHVuYWJsZSB0byBiaW5kLCBvciBpdCB3b24ndCByZXNwb25kLgotICAgICAqLwotI2lmIGRlZmluZWQgKFNPTEFSSVMyKSAmJiBTT0xBUklTMiA8IDI2MAotI2RlZmluZSBXT1JLQVJPVU5EX1NPTEFSSVNfQlVHCi0jZW5kaWYKLQotICAgIC8qIFBSIzEyODIgVW5peHdhcmUgMS54IGFwcGVhcnMgdG8gaGF2ZSB0aGUgc2FtZSBwcm9ibGVtIGFzIHNvbGFyaXMgKi8KLSNpZiBkZWZpbmVkIChVVykgJiYgVVcgPCAyMDAKLSNkZWZpbmUgV09SS0FST1VORF9TT0xBUklTX0JVRwotI2VuZGlmCi0KLSAgICAvKiBQUiMxOTczIE5DUiBTVlI0IHN5c3RlbXMgYXBwZWFyIHRvIGhhdmUgdGhlIHNhbWUgcHJvYmxlbSAqLwotI2lmIGRlZmluZWQgKE1QUkFTKQotI2RlZmluZSBXT1JLQVJPVU5EX1NPTEFSSVNfQlVHCi0jZW5kaWYKLQotI2lmbmRlZiBXT1JLQVJPVU5EX1NPTEFSSVNfQlVHCi0jaWZuZGVmIEJFT1MgLyogdGhpcyB3b24ndCB3b3JrIGZvciBCZU9TIHNvY2tldHMhISAqLwotICAgIHMgPSBhcF9zbGFjayhzLCBBUF9TTEFDS19ISUdIKTsKLSNlbmRpZgotCi0gICAgYXBfbm90ZV9jbGVhbnVwc19mb3Jfc29ja2V0KHAsIHMpOwkvKiBhcnJhbmdlIHRvIGNsb3NlIG9uIGV4ZWMgb3IgcmVzdGFydCAqLwotI2lmZGVmIFRQRgotICAgIG9zX25vdGVfYWRkaXRpb25hbF9jbGVhbnVwcyhwLCBzKTsKLSNlbmRpZiAvKiBUUEYgKi8KLSNlbmRpZgotCi0jaWZuZGVmIE1QRQotLyogTVBFIGRvZXMgbm90IHN1cHBvcnQgU09fUkVVU0VBRERSIGFuZCBTT19LRUVQQUxJVkUgKi8KLSNpZm5kZWYgX09TRF9QT1NJWAotICAgIGlmIChzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgKGNoYXIgKikgJm9uZSwgc2l6ZW9mKGludCkpIDwgMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19DUklULCBzZXJ2ZXJfY29uZiwKLQkJICAgICJtYWtlX3NvY2s6IGZvciAlcywgc2V0c29ja29wdDogKFNPX1JFVVNFQUREUikiLCBhZGRyKTsKLSNpZmRlZiBCRU9TCi0gICAgY2xvc2Vzb2NrZXQocyk7Ci0jZWxzZQotCWNsb3NlKHMpOwotI2VuZGlmCi0JYXBfdW5ibG9ja19hbGFybXMoKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotI2VuZGlmIC8qX09TRF9QT1NJWCovCi0gICAgb25lID0gMTsKLSNpZmRlZiBTT19LRUVQQUxJVkUKLSAgICBpZiAoc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsIChjaGFyICopICZvbmUsIHNpemVvZihpbnQpKSA8IDApIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQ1JJVCwgc2VydmVyX2NvbmYsCi0JCSAgICAibWFrZV9zb2NrOiBmb3IgJXMsIHNldHNvY2tvcHQ6IChTT19LRUVQQUxJVkUpIiwgYWRkcik7Ci0jaWZkZWYgQkVPUwotICAgIGNsb3Nlc29ja2V0KHMpOwotI2Vsc2UKLQljbG9zZShzKTsKLSNlbmRpZgotCi0JYXBfdW5ibG9ja19hbGFybXMoKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotI2VuZGlmCi0jZW5kaWYKLQotICAgIHNvY2tfZGlzYWJsZV9uYWdsZShzKTsKLSAgICBzb2NrX2VuYWJsZV9saW5nZXIocyk7Ci0KLSAgICAvKgotICAgICAqIFRvIHNlbmQgZGF0YSBvdmVyIGhpZ2ggYmFuZHdpZHRoLWRlbGF5IGNvbm5lY3Rpb25zIGF0IGZ1bGwKLSAgICAgKiBzcGVlZCB3ZSBtdXN0IGZvcmNlIHRoZSBUQ1Agd2luZG93IHRvIG9wZW4gd2lkZSBlbm91Z2ggdG8ga2VlcCB0aGUKLSAgICAgKiBwaXBlIGZ1bGwuICBUaGUgZGVmYXVsdCB3aW5kb3cgc2l6ZSBvbiBtYW55IHN5c3RlbXMKLSAgICAgKiBpcyBvbmx5IDRrQi4gIENyb3NzLWNvdW50cnkgV0FOIGNvbm5lY3Rpb25zIG9mIDEwMG1zCi0gICAgICogYXQgMU1iL3MgYXJlIG5vdCBpbXBvc3NpYmxlIGZvciB3ZWxsIGNvbm5lY3RlZCBzaXRlcy4KLSAgICAgKiBJZiB3ZSBhc3N1bWUgMTAwbXMgY3Jvc3MtY291bnRyeSBsYXRlbmN5LAotICAgICAqIGEgNGtCIGJ1ZmZlciBsaW1pdHMgdGhyb3VnaHB1dCB0byA0MGtCL3MuCi0gICAgICoKLSAgICAgKiBUbyBhdm9pZCB0aGlzIHByb2JsZW0gSSd2ZSBhZGRlZCB0aGUgU2VuZEJ1ZmZlclNpemUgZGlyZWN0aXZlCi0gICAgICogdG8gYWxsb3cgdGhlIHdlYiBtYXN0ZXIgdG8gY29uZmlndXJlIHNlbmQgYnVmZmVyIHNpemUuCi0gICAgICoKLSAgICAgKiBUaGUgdHJhZGUtb2ZmIG9mIGxhcmdlciBidWZmZXJzIGlzIHRoYXQgbW9yZSBrZXJuZWwgbWVtb3J5Ci0gICAgICogaXMgY29uc3VtZWQuICBZTU1WLCBrbm93IHlvdXIgY3VzdG9tZXJzIGFuZCB5b3VyIG5ldHdvcmshCi0gICAgICoKLSAgICAgKiAtSm9obiBIZWlkZW1hbm4gPGpvaG5oQGlzaS5lZHU+IDI1LU9jdC05NgotICAgICAqCi0gICAgICogSWYgbm8gc2l6ZSBpcyBzcGVjaWZpZWQsIHVzZSB0aGUga2VybmVsIGRlZmF1bHQuCi0gICAgICovCi0jaWZuZGVmIEJFT1MJCQkvKiBCZU9TIGRvZXMgbm90IHN1cHBvcnQgU09fU05EQlVGICovCi0gICAgaWYgKHNlcnZlcl9jb25mLT5zZW5kX2J1ZmZlcl9zaXplKSB7Ci0JaWYgKHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fU05EQlVGLAotCQkoY2hhciAqKSAmc2VydmVyX2NvbmYtPnNlbmRfYnVmZmVyX3NpemUsIHNpemVvZihpbnQpKSA8IDApIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIHNlcnZlcl9jb25mLAotCQkJIm1ha2Vfc29jazogZmFpbGVkIHRvIHNldCBTZW5kQnVmZmVyU2l6ZSBmb3IgJXMsICIKLQkJCSJ1c2luZyBkZWZhdWx0IiwgYWRkcik7Ci0JICAgIC8qIG5vdCBhIGZhdGFsIGVycm9yICovCi0JfQotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgTVBFCi0vKiBNUEUgcmVxdWlyZXMgQ0FQPVBNIGFuZCBHRVRQUklWTU9ERSB0byBiaW5kIHRvIHBvcnRzIGxlc3MgdGhhbiAxMDI0ICovCi0gICAgaWYgKG50b2hzKHNlcnZlci0+c2luX3BvcnQpIDwgMTAyNCkKLQlHRVRQUklWTU9ERSgpOwotI2VuZGlmCi0KLSAgICBpZiAoYmluZChzLCAoc3RydWN0IHNvY2thZGRyICopIHNlcnZlciwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpID09IC0xKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0NSSVQsIHNlcnZlcl9jb25mLAotCSAgICAibWFrZV9zb2NrOiBjb3VsZCBub3QgYmluZCB0byAlcyIsIGFkZHIpOwotI2lmZGVmIE1QRQotCWlmIChudG9ocyhzZXJ2ZXItPnNpbl9wb3J0KSA8IDEwMjQpCi0JICAgIEdFVFVTRVJNT0RFKCk7Ci0jZW5kaWYKLQotI2lmZGVmIEJFT1MKLSAgICBjbG9zZXNvY2tldChzKTsKLSNlbHNlCi0JY2xvc2Uocyk7Ci0jZW5kaWYKLQlhcF91bmJsb2NrX2FsYXJtcygpOwotCWV4aXQoMSk7Ci0gICAgfQotI2lmZGVmIE1QRQotICAgIGlmIChudG9ocyhzZXJ2ZXItPnNpbl9wb3J0KSA8IDEwMjQpCi0JR0VUVVNFUk1PREUoKTsKLSNlbmRpZgotCi0gICAgaWYgKGxpc3RlbihzLCBhcF9saXN0ZW5iYWNrbG9nKSA9PSAtMSkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHNlcnZlcl9jb25mLAotCSAgICAibWFrZV9zb2NrOiB1bmFibGUgdG8gbGlzdGVuIGZvciBjb25uZWN0aW9ucyBvbiAlcyIsIGFkZHIpOwotI2lmZGVmIEJFT1MKLSAgICBjbG9zZXNvY2tldChzKTsKLSNlbHNlCi0JY2xvc2Uocyk7Ci0jZW5kaWYKLQlhcF91bmJsb2NrX2FsYXJtcygpOwotCWV4aXQoMSk7Ci0gICAgfQotCi0jaWZkZWYgV09SS0FST1VORF9TT0xBUklTX0JVRwotICAgIHMgPSBhcF9zbGFjayhzLCBBUF9TTEFDS19ISUdIKTsKLQotICAgIGFwX25vdGVfY2xlYW51cHNfZm9yX3NvY2tldChwLCBzKTsJLyogYXJyYW5nZSB0byBjbG9zZSBvbiBleGVjIG9yIHJlc3RhcnQgKi8KLSNlbmRpZgotICAgIGFwX3VuYmxvY2tfYWxhcm1zKCk7Ci0KLSNpZmRlZiBDSEVDS19GRF9TRVRTSVpFCi0gICAgLyogcHJvdGVjdCB2YXJpb3VzIGZkX3NldHMgKi8KLSAgICBpZiAocyA+PSBGRF9TRVRTSVpFKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfV0FSTklORywgTlVMTCwKLQkgICAgIm1ha2Vfc29jazogcHJvYmxlbSBsaXN0ZW5pbmcgb24gJXMsIGZpbGVkZXNjcmlwdG9yICgldSkgIgotCSAgICAibGFyZ2VyIHRoYW4gRkRfU0VUU0laRSAoJXUpICIKLQkgICAgImZvdW5kLCB5b3UgcHJvYmFibHkgbmVlZCB0byByZWJ1aWxkIEFwYWNoZSB3aXRoIGEgIgotCSAgICAibGFyZ2VyIEZEX1NFVFNJWkUiLCBhZGRyLCBzLCBGRF9TRVRTSVpFKTsKLSNpZmRlZiBCRU9TCi0gICAgY2xvc2Vzb2NrZXQocyk7Ci0jZWxzZQotCWNsb3NlKHMpOwotI2VuZGlmCi0JcmV0dXJuIC0xOwotICAgIH0KLSNlbmRpZgotCi0gICAgcmV0dXJuIHM7Ci19Ci0KLQotLyoKLSAqIER1cmluZyBhIHJlc3RhcnQgd2Uga2VlcCB0cmFjayBvZiB0aGUgb2xkIGxpc3RlbmVycyBoZXJlLCBzbyB0aGF0IHdlCi0gKiBjYW4gcmUtdXNlIHRoZSBzb2NrZXRzLiAgV2UgaGF2ZSB0byBkbyB0aGlzIGJlY2F1c2Ugd2Ugd29uJ3QgYmUgYWJsZQotICogdG8gcmUtb3BlbiB0aGUgc29ja2V0cyAoIkFkZHJlc3MgYWxyZWFkeSBpbiB1c2UiKS4KLSAqCi0gKiBVbmxpa2UgdGhlIGxpc3RlbmVycyByaW5nLCBvbGRfbGlzdGVuZXJzIGlzIGEgTlVMTCB0ZXJtaW5hdGVkIGxpc3QuCi0gKgotICogY29weV9saXN0ZW5lcnMoKSBtYWtlcyB0aGUgY29weSwgZmluZF9saXN0ZW5lcigpIGZpbmRzIGFuIG9sZCBsaXN0ZW5lcgotICogYW5kIGNsb3NlX3VudXNlZF9saXN0ZW5lcigpIGNsZWFucyB1cCB3aGF0ZXZlciB3YXNuJ3QgdXNlZC4KLSAqLwotc3RhdGljIGxpc3Rlbl9yZWMgKm9sZF9saXN0ZW5lcnM7Ci0KLS8qIHVuZm9ydHVuYXRlbHkgY29weV9saXN0ZW5lcnMgbWF5IGJlIGNhbGxlZCBiZWZvcmUgbGlzdGVuZXJzIGlzIGEgcmluZyAqLwotc3RhdGljIHZvaWQgY29weV9saXN0ZW5lcnMocG9vbCAqcCkKLXsKLSAgICBsaXN0ZW5fcmVjICpscjsKLQotICAgIGFwX2Fzc2VydChvbGRfbGlzdGVuZXJzID09IE5VTEwpOwotICAgIGlmIChhcF9saXN0ZW5lcnMgPT0gTlVMTCkgewotCXJldHVybjsKLSAgICB9Ci0gICAgbHIgPSBhcF9saXN0ZW5lcnM7Ci0gICAgZG8gewotCWxpc3Rlbl9yZWMgKm5yID0gbWFsbG9jKHNpemVvZiAqbnIpOwotCWlmIChuciA9PSBOVUxMKSB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCAiT3VjaCEgIG1hbGxvYyBmYWlsZWQgaW4gY29weV9saXN0ZW5lcnMoKVxuIik7Ci0JICAgIGV4aXQoMSk7Ci0JfQotCSpuciA9ICpscjsKLQlhcF9raWxsX2NsZWFudXBzX2Zvcl9zb2NrZXQocCwgbnItPmZkKTsKLQluci0+bmV4dCA9IG9sZF9saXN0ZW5lcnM7Ci0JYXBfYXNzZXJ0KCFuci0+dXNlZCk7Ci0Jb2xkX2xpc3RlbmVycyA9IG5yOwotCWxyID0gbHItPm5leHQ7Ci0gICAgfSB3aGlsZSAobHIgJiYgbHIgIT0gYXBfbGlzdGVuZXJzKTsKLX0KLQotCi1zdGF0aWMgaW50IGZpbmRfbGlzdGVuZXIobGlzdGVuX3JlYyAqbHIpCi17Ci0gICAgbGlzdGVuX3JlYyAqb3I7Ci0KLSAgICBmb3IgKG9yID0gb2xkX2xpc3RlbmVyczsgb3I7IG9yID0gb3ItPm5leHQpIHsKLQlpZiAoIW1lbWNtcCgmb3ItPmxvY2FsX2FkZHIsICZsci0+bG9jYWxfYWRkciwgc2l6ZW9mKG9yLT5sb2NhbF9hZGRyKSkpIHsKLQkgICAgb3ItPnVzZWQgPSAxOwotCSAgICByZXR1cm4gb3ItPmZkOwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotCi0KLXN0YXRpYyB2b2lkIGNsb3NlX3VudXNlZF9saXN0ZW5lcnModm9pZCkKLXsKLSAgICBsaXN0ZW5fcmVjICpvciwgKm5leHQ7Ci0KLSAgICBmb3IgKG9yID0gb2xkX2xpc3RlbmVyczsgb3I7IG9yID0gbmV4dCkgewotCW5leHQgPSBvci0+bmV4dDsKLQlpZiAoIW9yLT51c2VkKQotCSAgICBjbG9zZXNvY2tldChvci0+ZmQpOwotCWZyZWUob3IpOwotICAgIH0KLSAgICBvbGRfbGlzdGVuZXJzID0gTlVMTDsKLX0KLQotCi0vKiBvcGVuIHNvY2tldHMsIGFuZCB0dXJuIHRoZSBsaXN0ZW5lcnMgbGlzdCBpbnRvIGEgc2luZ2x5IGxpbmtlZCByaW5nICovCi1zdGF0aWMgdm9pZCBzZXR1cF9saXN0ZW5lcnMocG9vbCAqcCkKLXsKLSAgICBsaXN0ZW5fcmVjICpscjsKLSAgICBpbnQgZmQ7Ci0KLSAgICBsaXN0ZW5tYXhmZCA9IC0xOwotICAgIEZEX1pFUk8oJmxpc3RlbmZkcyk7Ci0gICAgbHIgPSBhcF9saXN0ZW5lcnM7Ci0gICAgZm9yICg7OykgewotCWZkID0gZmluZF9saXN0ZW5lcihscik7Ci0JaWYgKGZkIDwgMCkgewotCSAgICBmZCA9IG1ha2Vfc29jayhwLCAmbHItPmxvY2FsX2FkZHIpOwotCX0KLQllbHNlIHsKLQkgICAgYXBfbm90ZV9jbGVhbnVwc19mb3Jfc29ja2V0KHAsIGZkKTsKLQl9Ci0JaWYgKGZkID49IDApIHsKLQkgICAgRkRfU0VUKGZkLCAmbGlzdGVuZmRzKTsKLQkgICAgaWYgKGZkID4gbGlzdGVubWF4ZmQpCi0JCWxpc3Rlbm1heGZkID0gZmQ7Ci0JfQotCWxyLT5mZCA9IGZkOwotCWlmIChsci0+bmV4dCA9PSBOVUxMKQotCSAgICBicmVhazsKLQlsciA9IGxyLT5uZXh0OwotICAgIH0KLSAgICAvKiB0dXJuIHRoZSBsaXN0IGludG8gYSByaW5nICovCi0gICAgbHItPm5leHQgPSBhcF9saXN0ZW5lcnM7Ci0gICAgaGVhZF9saXN0ZW5lciA9IGFwX2xpc3RlbmVyczsKLSAgICBjbG9zZV91bnVzZWRfbGlzdGVuZXJzKCk7Ci0KLSNpZmRlZiBOT19TRVJJQUxJWkVEX0FDQ0VQVAotICAgIC8qIHdhcm4gdGhlbSBhYm91dCB0aGUgc3RhcnZhdGlvbiBwcm9ibGVtIGlmIHRoZXkncmUgdXNpbmcgbXVsdGlwbGUKLSAgICAgKiBzb2NrZXRzCi0gICAgICovCi0gICAgaWYgKGFwX2xpc3RlbmVycy0+bmV4dCAhPSBhcF9saXN0ZW5lcnMpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19DUklULCBOVUxMLAotCQkgICAgIllvdSBjYW5ub3QgdXNlIG11bHRpcGxlIExpc3RlbnMgc2FmZWx5IG9uIHlvdXIgc3lzdGVtLCAiCi0JCSAgICAicHJvY2VlZGluZyBhbnl3YXkuICBTZWUgc3JjL1BPUlRJTkcsIHNlYXJjaCBmb3IgIgotCQkgICAgIlNFUklBTElaRURfQUNDRVBULiIpOwotICAgIH0KLSNlbmRpZgotfQotCi0KLS8qCi0gKiBGaW5kIGEgbGlzdGVuZXIgd2hpY2ggaXMgcmVhZHkgZm9yIGFjY2VwdCgpLiAgVGhpcyBhZHZhbmNlcyB0aGUKLSAqIGhlYWRfbGlzdGVuZXIgZ2xvYmFsLgotICovCi1zdGF0aWMgYXBfaW5saW5lIGxpc3Rlbl9yZWMgKmZpbmRfcmVhZHlfbGlzdGVuZXIoZmRfc2V0ICogbWFpbl9mZHMpCi17Ci0gICAgbGlzdGVuX3JlYyAqbHI7Ci0KLSAgICBsciA9IGhlYWRfbGlzdGVuZXI7Ci0gICAgZG8gewotCWlmIChGRF9JU1NFVChsci0+ZmQsIG1haW5fZmRzKSkgewotCSAgICBoZWFkX2xpc3RlbmVyID0gbHItPm5leHQ7Ci0JICAgIHJldHVybiAobHIpOwotCX0KLQlsciA9IGxyLT5uZXh0OwotICAgIH0gd2hpbGUgKGxyICE9IGhlYWRfbGlzdGVuZXIpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0KLSNpZmRlZiBXSU4zMgotc3RhdGljIGludCBzX2lJbml0Q291bnQgPSAwOwotCi1zdGF0aWMgaW50IEFNQ1NvY2tldEluaXRpYWxpemUodm9pZCkKLXsKLSAgICBpbnQgaVZlcnNpb25SZXF1ZXN0ZWQ7Ci0gICAgV1NBREFUQSB3c2FEYXRhOwotICAgIGludCBlcnI7Ci0KLSAgICBpZiAoc19pSW5pdENvdW50ID4gMCkgewotCXNfaUluaXRDb3VudCsrOwotCXJldHVybiAoMCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNfaUluaXRDb3VudCA8IDApCi0JcmV0dXJuIChzX2lJbml0Q291bnQpOwotCi0gICAgLyogc19pSW5pdENvdW50ID09IDAuIERvIHRoZSBpbml0YWlsaXphdGlvbiAqLwotICAgIGlWZXJzaW9uUmVxdWVzdGVkID0gTUFLRVdPUkQoMSwgMSk7Ci0gICAgZXJyID0gV1NBU3RhcnR1cCgoV09SRCkgaVZlcnNpb25SZXF1ZXN0ZWQsICZ3c2FEYXRhKTsKLSAgICBpZiAoZXJyKSB7Ci0Jc19pSW5pdENvdW50ID0gLTE7Ci0JcmV0dXJuIChzX2lJbml0Q291bnQpOwotICAgIH0KLSAgICBpZiAoTE9CWVRFKHdzYURhdGEud1ZlcnNpb24pICE9IDEgfHwKLQlISUJZVEUod3NhRGF0YS53VmVyc2lvbikgIT0gMSkgewotCXNfaUluaXRDb3VudCA9IC0yOwotCVdTQUNsZWFudXAoKTsKLQlyZXR1cm4gKHNfaUluaXRDb3VudCk7Ci0gICAgfQotCi0gICAgc19pSW5pdENvdW50Kys7Ci0gICAgcmV0dXJuIChzX2lJbml0Q291bnQpOwotCi19Ci0KLQotc3RhdGljIHZvaWQgQU1DU29ja2V0Q2xlYW51cCh2b2lkKQotewotICAgIGlmICgtLXNfaUluaXRDb3VudCA9PSAwKQotCVdTQUNsZWFudXAoKTsKLSAgICByZXR1cm47Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgc2hvd19jb21waWxlX3NldHRpbmdzKHZvaWQpCi17Ci0gICAgcHJpbnRmKCJTZXJ2ZXIgdmVyc2lvbjogJXNcbiIsIGFwX2dldF9zZXJ2ZXJfdmVyc2lvbigpKTsKLSAgICBwcmludGYoIlNlcnZlciBidWlsdDogICAlc1xuIiwgYXBfZ2V0X3NlcnZlcl9idWlsdCgpKTsKLSAgICBwcmludGYoIlNlcnZlcidzIE1vZHVsZSBNYWdpYyBOdW1iZXI6ICV1OiV1XG4iLAotCSAgIE1PRFVMRV9NQUdJQ19OVU1CRVJfTUFKT1IsIE1PRFVMRV9NQUdJQ19OVU1CRVJfTUlOT1IpOwotICAgIHByaW50ZigiU2VydmVyIGNvbXBpbGVkIHdpdGguLi4uXG4iKTsKLSNpZmRlZiBCSUdfU0VDVVJJVFlfSE9MRQotICAgIHByaW50ZigiIC1EIEJJR19TRUNVUklUWV9IT0xFXG4iKTsKLSNlbmRpZgotI2lmZGVmIFNFQ1VSSVRZX0hPTEVfUEFTU19BVVRIT1JJWkFUSU9OCi0gICAgcHJpbnRmKCIgLUQgU0VDVVJJVFlfSE9MRV9QQVNTX0FVVEhPUklaQVRJT05cbiIpOwotI2VuZGlmCi0jaWZkZWYgSEFWRV9NTUFQCi0gICAgcHJpbnRmKCIgLUQgSEFWRV9NTUFQXG4iKTsKLSNlbmRpZgotI2lmZGVmIEhBVkVfU0hNR0VUCi0gICAgcHJpbnRmKCIgLUQgSEFWRV9TSE1HRVRcbiIpOwotI2VuZGlmCi0jaWZkZWYgVVNFX01NQVBfU0NPUkVCT0FSRAotICAgIHByaW50ZigiIC1EIFVTRV9NTUFQX1NDT1JFQk9BUkRcbiIpOwotI2VuZGlmCi0jaWZkZWYgVVNFX1NITUdFVF9TQ09SRUJPQVJECi0gICAgcHJpbnRmKCIgLUQgVVNFX1NITUdFVF9TQ09SRUJPQVJEXG4iKTsKLSNlbmRpZgotI2lmZGVmIFVTRV9PUzJfU0NPUkVCT0FSRAotICAgIHByaW50ZigiIC1EIFVTRV9PUzJfU0NPUkVCT0FSRFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBVU0VfUE9TSVhfU0NPUkVCT0FSRAotICAgIHByaW50ZigiIC1EIFVTRV9QT1NJWF9TQ09SRUJPQVJEXG4iKTsKLSNlbmRpZgotI2lmZGVmIFVTRV9NTUFQX0ZJTEVTCi0gICAgcHJpbnRmKCIgLUQgVVNFX01NQVBfRklMRVNcbiIpOwotI2lmZGVmIE1NQVBfU0VHTUVOVF9TSVpFCi0JcHJpbnRmKCIgLUQgTU1BUF9TRUdNRU5UX1NJWkU9JWxkXG4iLChsb25nKU1NQVBfU0VHTUVOVF9TSVpFKTsKLSNlbmRpZgotI2VuZGlmIC8qVVNFX01NQVBfRklMRVMqLwotI2lmZGVmIE5PX1dSSVRFVgotICAgIHByaW50ZigiIC1EIE5PX1dSSVRFVlxuIik7Ci0jZW5kaWYKLSNpZmRlZiBOT19MSU5HQ0xPU0UKLSAgICBwcmludGYoIiAtRCBOT19MSU5HQ0xPU0VcbiIpOwotI2VuZGlmCi0jaWZkZWYgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUCi0gICAgcHJpbnRmKCIgLUQgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUXG4iKTsKLSNlbmRpZgotI2lmZGVmIFVTRV9GTE9DS19TRVJJQUxJWkVEX0FDQ0VQVAotICAgIHByaW50ZigiIC1EIFVTRV9GTE9DS19TRVJJQUxJWkVEX0FDQ0VQVFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBVU0VfVVNMT0NLX1NFUklBTElaRURfQUNDRVBUCi0gICAgcHJpbnRmKCIgLUQgVVNFX1VTTE9DS19TRVJJQUxJWkVEX0FDQ0VQVFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBVU0VfU1lTVlNFTV9TRVJJQUxJWkVEX0FDQ0VQVAotICAgIHByaW50ZigiIC1EIFVTRV9TWVNWU0VNX1NFUklBTElaRURfQUNDRVBUXG4iKTsKLSNlbmRpZgotI2lmZGVmIFVTRV9QVEhSRUFEX1NFUklBTElaRURfQUNDRVBUCi0gICAgcHJpbnRmKCIgLUQgVVNFX1BUSFJFQURfU0VSSUFMSVpFRF9BQ0NFUFRcbiIpOwotI2VuZGlmCi0jaWZkZWYgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBUCi0gICAgcHJpbnRmKCIgLUQgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBUXG4iKTsKLSNlbmRpZgotI2lmZGVmIE5PX09USEVSX0NISUxECi0gICAgcHJpbnRmKCIgLUQgTk9fT1RIRVJfQ0hJTERcbiIpOwotI2VuZGlmCi0jaWZkZWYgTk9fUkVMSUFCTEVfUElQRURfTE9HUwotICAgIHByaW50ZigiIC1EIE5PX1JFTElBQkxFX1BJUEVEX0xPR1NcbiIpOwotI2VuZGlmCi0jaWZkZWYgQlVGRkVSRURfTE9HUwotICAgIHByaW50ZigiIC1EIEJVRkZFUkVEX0xPR1NcbiIpOwotI2lmZGVmIFBJUEVfQlVGCi0JcHJpbnRmKCIgLUQgUElQRV9CVUY9JWxkXG4iLChsb25nKVBJUEVfQlVGKTsKLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgTVVMVElUSFJFQUQKLSAgICBwcmludGYoIiAtRCBNVUxUSVRIUkVBRFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBDSEFSU0VUX0VCQ0RJQwotICAgIHByaW50ZigiIC1EIENIQVJTRVRfRUJDRElDXG4iKTsKLSNlbmRpZgotI2lmZGVmIE5FRURfSEFTSEJBTkdfRU1VTAotICAgIHByaW50ZigiIC1EIE5FRURfSEFTSEJBTkdfRU1VTFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBTSEFSRURfQ09SRQotICAgIHByaW50ZigiIC1EIFNIQVJFRF9DT1JFXG4iKTsKLSNlbmRpZgotCi0vKiBUaGlzIGxpc3QgZGlzcGxheXMgdGhlIGNvbXBpbGVkLWluIGRlZmF1bHQgcGF0aHM6ICovCi0jaWZkZWYgSFRUUERfUk9PVAotICAgIHByaW50ZigiIC1EIEhUVFBEX1JPT1Q9XCIiIEhUVFBEX1JPT1QgIlwiXG4iKTsKLSNlbmRpZgotI2lmZGVmIFNVRVhFQ19CSU4KLSAgICBwcmludGYoIiAtRCBTVUVYRUNfQklOPVwiIiBTVUVYRUNfQklOICJcIlxuIik7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFNIQVJFRF9DT1JFKSAmJiBkZWZpbmVkKFNIQVJFRF9DT1JFX0RJUikKLSAgICBwcmludGYoIiAtRCBTSEFSRURfQ09SRV9ESVI9XCIiIFNIQVJFRF9DT1JFX0RJUiAiXCJcbiIpOwotI2VuZGlmCi0jaWZkZWYgREVGQVVMVF9QSURMT0cKLSAgICBwcmludGYoIiAtRCBERUZBVUxUX1BJRExPRz1cIiIgREVGQVVMVF9QSURMT0cgIlwiXG4iKTsKLSNlbmRpZgotI2lmZGVmIERFRkFVTFRfU0NPUkVCT0FSRAotICAgIHByaW50ZigiIC1EIERFRkFVTFRfU0NPUkVCT0FSRD1cIiIgREVGQVVMVF9TQ09SRUJPQVJEICJcIlxuIik7Ci0jZW5kaWYKLSNpZmRlZiBERUZBVUxUX0xPQ0tGSUxFCi0gICAgcHJpbnRmKCIgLUQgREVGQVVMVF9MT0NLRklMRT1cIiIgREVGQVVMVF9MT0NLRklMRSAiXCJcbiIpOwotI2VuZGlmCi0jaWZkZWYgREVGQVVMVF9YRkVSTE9HCi0gICAgcHJpbnRmKCIgLUQgREVGQVVMVF9YRkVSTE9HPVwiIiBERUZBVUxUX1hGRVJMT0cgIlwiXG4iKTsKLSNlbmRpZgotI2lmZGVmIERFRkFVTFRfRVJST1JMT0cKLSAgICBwcmludGYoIiAtRCBERUZBVUxUX0VSUk9STE9HPVwiIiBERUZBVUxUX0VSUk9STE9HICJcIlxuIik7Ci0jZW5kaWYKLSNpZmRlZiBUWVBFU19DT05GSUdfRklMRQotICAgIHByaW50ZigiIC1EIFRZUEVTX0NPTkZJR19GSUxFPVwiIiBUWVBFU19DT05GSUdfRklMRSAiXCJcbiIpOwotI2VuZGlmCi0jaWZkZWYgU0VSVkVSX0NPTkZJR19GSUxFCi0gICAgcHJpbnRmKCIgLUQgU0VSVkVSX0NPTkZJR19GSUxFPVwiIiBTRVJWRVJfQ09ORklHX0ZJTEUgIlwiXG4iKTsKLSNlbmRpZgotI2lmZGVmIEFDQ0VTU19DT05GSUdfRklMRQotICAgIHByaW50ZigiIC1EIEFDQ0VTU19DT05GSUdfRklMRT1cIiIgQUNDRVNTX0NPTkZJR19GSUxFICJcIlxuIik7Ci0jZW5kaWYKLSNpZmRlZiBSRVNPVVJDRV9DT05GSUdfRklMRQotICAgIHByaW50ZigiIC1EIFJFU09VUkNFX0NPTkZJR19GSUxFPVwiIiBSRVNPVVJDRV9DT05GSUdfRklMRSAiXCJcbiIpOwotI2VuZGlmCi19Ci0KLQotLyogU29tZSBpbml0IGNvZGUgdGhhdCdzIGNvbW1vbiBiZXR3ZWVuIHdpbjMyIGFuZCB1bml4Li4uIHdlbGwgYWN0dWFsbHkKLSAqIHNvbWUgb2YgaXQgaXMgI2lmZGVmJ2QgYnV0IHdhcyBkdXBsaWNhdGVkIGJlZm9yZSBhbnlob3cuICBUaGlzIHN0dWZmCi0gKiBpcyBzdGlsbCBhIG1lc3MuCi0gKi8KLXN0YXRpYyB2b2lkIGNvbW1vbl9pbml0KHZvaWQpCi17Ci0gICAgSU5JVF9TSUdMSVNUKCkKLSNpZmRlZiBBVVgzCi0gICAgKHZvaWQpIHNldDQyc2lnKCk7Ci0jZW5kaWYKLQotI2lmZGVmIFdJTjMyCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgc3R1cGlkIHNvY2tldHMgKi8KLSAgICBBTUNTb2NrZXRJbml0aWFsaXplKCk7Ci0jZW5kaWYgLyogV0lOMzIgKi8KLQotICAgIHBnbG9iYWwgPSBhcF9pbml0X2FsbG9jKCk7Ci0gICAgcGNvbmYgPSBhcF9tYWtlX3N1Yl9wb29sKHBnbG9iYWwpOwotICAgIHBsb2cgPSBhcF9tYWtlX3N1Yl9wb29sKHBnbG9iYWwpOwotICAgIHB0cmFucyA9IGFwX21ha2Vfc3ViX3Bvb2wocGNvbmYpOwotCi0gICAgYXBfdXRpbF9pbml0KCk7Ci0gICAgYXBfdXRpbF91cmlfaW5pdCgpOwotCi0gICAgcGNvbW1hbmRzID0gYXBfbWFrZV9zdWJfcG9vbChOVUxMKTsKLSAgICBhcF9zZXJ2ZXJfcHJlX3JlYWRfY29uZmlnICA9IGFwX21ha2VfYXJyYXkocGNvbW1hbmRzLCAxLCBzaXplb2YoY2hhciAqKSk7Ci0gICAgYXBfc2VydmVyX3Bvc3RfcmVhZF9jb25maWcgPSBhcF9tYWtlX2FycmF5KHBjb21tYW5kcywgMSwgc2l6ZW9mKGNoYXIgKikpOwotICAgIGFwX3NlcnZlcl9jb25maWdfZGVmaW5lcyAgID0gYXBfbWFrZV9hcnJheShwY29tbWFuZHMsIDEsIHNpemVvZihjaGFyICopKTsKLX0KLQotI2lmbmRlZiBNVUxUSVRIUkVBRAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDaGlsZCBwcm9jZXNzIG1haW4gbG9vcC4KLSAqIFRoZSBmb2xsb3dpbmcgdmFycyBhcmUgc3RhdGljIHRvIGF2b2lkIGdldHRpbmcgY2xvYmJlcmVkIGJ5IGxvbmdqbXAoKTsKLSAqIHRoZXkgYXJlIHJlYWxseSBwcml2YXRlIHRvIGNoaWxkX21haW4uCi0gKi8KLQotc3RhdGljIGludCBzcnY7Ci1zdGF0aWMgaW50IGNzZDsKLXN0YXRpYyBpbnQgZHVwcGVkX2NzZDsKLXN0YXRpYyBpbnQgcmVxdWVzdHNfdGhpc19jaGlsZDsKLXN0YXRpYyBmZF9zZXQgbWFpbl9mZHM7Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfY2hpbGRfdGVybWluYXRlKHJlcXVlc3RfcmVjICpyKQotewotICAgIHItPmNvbm5lY3Rpb24tPmtlZXBhbGl2ZSA9IDA7Ci0gICAgcmVxdWVzdHNfdGhpc19jaGlsZCA9IGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQgPSAxOwotfQotCi1zdGF0aWMgdm9pZCBjaGlsZF9tYWluKGludCBjaGlsZF9udW1fYXJnKQotewotICAgIE5FVF9TSVpFX1QgY2xlbjsKLSAgICBzdHJ1Y3Qgc29ja2FkZHIgc2Ffc2VydmVyOwotICAgIHN0cnVjdCBzb2NrYWRkciBzYV9jbGllbnQ7Ci0gICAgbGlzdGVuX3JlYyAqbHI7Ci0KLSAgICAvKiBBbGwgb2YgaW5pdGlhbGl6YXRpb24gaXMgYSBjcml0aWNhbCBzZWN0aW9uLCB3ZSBkb24ndCBjYXJlIGlmIHdlJ3JlCi0gICAgICogdG9sZCB0byBIVVAgb3IgVVNSMSBiZWZvcmUgd2UncmUgZG9uZSBpbml0aWFsaXppbmcuICBGb3IgZXhhbXBsZSwKLSAgICAgKiB3ZSBjb3VsZCBiZSBoYWxmIHdheSB0aHJvdWdoIGNoaWxkX2luaXRfbW9kdWxlcygpIHdoZW4gYSByZXN0YXJ0Ci0gICAgICogc2lnbmFsIGFycml2ZXMsIGFuZCB3ZSdkIGhhdmUgbm8gcmVhbCB3YXkgdG8gcmVjb3ZlciBncmFjZWZ1bGx5Ci0gICAgICogYW5kIGV4aXQgcHJvcGVybHkuCi0gICAgICoKLSAgICAgKiBJIHN1cHBvc2UgYSBtb2R1bGUgY291bGQgdGFrZSBmb3JldmVyIHRvIGluaXRpYWxpemUsIGJ1dCB0aGF0IHdvdWxkCi0gICAgICogYmUgZWl0aGVyIGEgYnJva2VuIG1vZHVsZSwgb3IgYSBicm9rZW4gY29uZmlndXJhdGlvbiAoaS5lLiBuZXR3b3JrCi0gICAgICogcHJvYmxlbXMsIGZpbGUgbG9ja2luZyBwcm9ibGVtcywgd2hhdGV2ZXIpLiAtZGpnCi0gICAgICovCi0gICAgYXBfYmxvY2tfYWxhcm1zKCk7Ci0KLSAgICBteV9waWQgPSBnZXRwaWQoKTsKLSAgICBjc2QgPSAtMTsKLSAgICBkdXBwZWRfY3NkID0gLTE7Ci0gICAgbXlfY2hpbGRfbnVtID0gY2hpbGRfbnVtX2FyZzsKLSAgICByZXF1ZXN0c190aGlzX2NoaWxkID0gMDsKLQotICAgIC8qIEdldCBhIHN1YiBwb29sIGZvciBnbG9iYWwgYWxsb2NhdGlvbnMgaW4gdGhpcyBjaGlsZCwgc28gdGhhdAotICAgICAqIHdlIGNhbiBoYXZlIGNsZWFudXBzIG9jY3VyIHdoZW4gdGhlIGNoaWxkIGV4aXRzLgotICAgICAqLwotICAgIHBjaGlsZCA9IGFwX21ha2Vfc3ViX3Bvb2wocGNvbmYpOwotCi0gICAgLyogbmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgd2Ugc3dpdGNoIFVJRHMgc28gd2UgaGF2ZSBwZXJtaXNzaW9ucyAqLwotICAgIHJlb3Blbl9zY29yZWJvYXJkKHBjaGlsZCk7Ci0gICAgU0FGRV9BQ0NFUFQoYWNjZXB0X211dGV4X2NoaWxkX2luaXQocGNoaWxkKSk7Ci0KLSAgICBzZXRfZ3JvdXBfcHJpdnMoKTsKLSNpZmRlZiBNUEUKLSAgICAvKiBPbmx5IHRyeSB0byBzd2l0Y2ggaWYgd2UncmUgcnVubmluZyBhcyBNQU5BR0VSLlNZUyAqLwotICAgIGlmIChnZXRldWlkKCkgPT0gMSAmJiBhcF91c2VyX2lkID4gMSkgewotCUdFVFBSSVZNT0RFKCk7Ci0JaWYgKHNldHVpZChhcF91c2VyX2lkKSA9PSAtMSkgewotCSAgICBHRVRVU0VSTU9ERSgpOwotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlQsIHNlcnZlcl9jb25mLAotCQkJInNldHVpZDogdW5hYmxlIHRvIGNoYW5nZSB0byB1aWQ6ICVkIiwgYXBfdXNlcl9pZCk7Ci0JICAgIGV4aXQoMSk7Ci0JfQotCUdFVFVTRVJNT0RFKCk7Ci0gICAgfQotI2Vsc2UKLSAgICAvKiBPbmx5IHRyeSB0byBzd2l0Y2ggaWYgd2UncmUgcnVubmluZyBhcyByb290ICovCi0gICAgaWYgKCFnZXRldWlkKCkgJiYgKAotI2lmZGVmIF9PU0RfUE9TSVgKLQlvc19pbml0X2pvYl9lbnZpcm9ubWVudChzZXJ2ZXJfY29uZiwgYXBfdXNlcl9uYW1lLCBvbmVfcHJvY2VzcykgIT0gMCB8fCAKLSNlbmRpZgotCXNldHVpZChhcF91c2VyX2lkKSA9PSAtMSkpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlQsIHNlcnZlcl9jb25mLAotCQkgICAgInNldHVpZDogdW5hYmxlIHRvIGNoYW5nZSB0byB1aWQ6ICVsZCIsIChsb25nKSBhcF91c2VyX2lkKTsKLQljbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGFwX2NoaWxkX2luaXRfbW9kdWxlcyhwY2hpbGQsIHNlcnZlcl9jb25mKTsKLQotICAgIC8qIGRvbmUgd2l0aCB0aGUgaW5pdGlhbGl6YXRpb24gY3JpdGljYWwgc2VjdGlvbiAqLwotICAgIGFwX3VuYmxvY2tfYWxhcm1zKCk7Ci0KLSAgICAodm9pZCkgYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhteV9jaGlsZF9udW0sIFNFUlZFUl9SRUFEWSwgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotCi0gICAgLyoKLSAgICAgKiBTZXR1cCB0aGUganVtcCBidWZmZXJzIHNvIHRoYXQgd2UgY2FuIHJldHVybiBoZXJlIGFmdGVyIGEgdGltZW91dCAKLSAgICAgKi8KLSAgICBhcF9zZXRqbXAoam1wYnVmZmVyKTsKLSNpZm5kZWYgT1MyCi0jaWZkZWYgU0lHVVJHCi0gICAgc2lnbmFsKFNJR1VSRywgdGltZW91dCk7Ci0jZW5kaWYKLSNlbmRpZgotICAgIHNpZ25hbChTSUdBTFJNLCBhbHJtX2hhbmRsZXIpOwotI2lmZGVmIFRQRgotICAgIHNpZ25hbChTSUdIVVAsIGp1c3RfZGllKTsKLSAgICBzaWduYWwoU0lHVEVSTSwganVzdF9kaWUpOwotICAgIHNpZ25hbChTSUdVU1IxLCBqdXN0X2RpZSk7Ci0jZW5kaWYgLyogVFBGICovCi0KLSNpZmRlZiBPUzIKLS8qIFN0b3AgQ3RybC1DL0N0cmwtQnJlYWsgc2lnbmFscyBnb2luZyB0byBjaGlsZCBwcm9jZXNzZXMgKi8KLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgdWxUaW1lczsKLSAgICAgICAgRG9zU2V0U2lnbmFsRXhjZXB0aW9uRm9jdXMoMCwgJnVsVGltZXMpOwotICAgIH0KLSNlbmRpZgotCi0gICAgd2hpbGUgKDEpIHsKLQlCVUZGICpjb25uX2lvOwotCXJlcXVlc3RfcmVjICpyOwotCi0JLyogUHJlcGFyZSB0byByZWNlaXZlIGEgU0lHVVNSMSBkdWUgdG8gZ3JhY2VmdWwgcmVzdGFydCBzbyB0aGF0Ci0JICogd2UgY2FuIGV4aXQgY2xlYW5seS4gIFNpbmNlIHdlJ3JlIGJldHdlZW4gY29ubmVjdGlvbnMgcmlnaHQKLQkgKiBub3cgaXQncyB0aGUgcmlnaHQgdGltZSB0byBleGl0LCBidXQgd2UgbWlnaHQgYmUgYmxvY2tlZCBpbiBhCi0JICogc3lzdGVtIGNhbGwgd2hlbiB0aGUgZ3JhY2VmdWwgcmVzdGFydCByZXF1ZXN0IGlzIG1hZGUuICovCi0JdXNyMV9qdXN0X2RpZSA9IDE7Ci0Jc2lnbmFsKFNJR1VTUjEsIHVzcjFfaGFuZGxlcik7Ci0KLQkvKgotCSAqIChSZSlpbml0aWFsaXplIHRoaXMgY2hpbGQgdG8gYSBwcmUtY29ubmVjdGlvbiBzdGF0ZS4KLQkgKi8KLQotCWFwX2tpbGxfdGltZW91dCgwKTsJLyogQ2FuY2VsIGFueSBvdXRzdGFuZGluZyBhbGFybXMuICovCi0JY3VycmVudF9jb25uID0gTlVMTDsKLQotCWFwX2NsZWFyX3Bvb2wocHRyYW5zKTsKLQotCWFwX3N5bmNfc2NvcmVib2FyZF9pbWFnZSgpOwotCWlmIChhcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwucnVubmluZ19nZW5lcmF0aW9uICE9IGFwX215X2dlbmVyYXRpb24pIHsKLQkgICAgY2xlYW5fY2hpbGRfZXhpdCgwKTsKLQl9Ci0KLSNpZm5kZWYgV0lOMzIKLQlpZiAoKGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQgPiAwCi0JICAgICAmJiByZXF1ZXN0c190aGlzX2NoaWxkKysgPj0gYXBfbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCkpIHsKLQkgICAgY2xlYW5fY2hpbGRfZXhpdCgwKTsKLQl9Ci0jZWxzZQotCSsrcmVxdWVzdHNfdGhpc19jaGlsZDsKLSNlbmRpZgotCi0JKHZvaWQpIGFwX3VwZGF0ZV9jaGlsZF9zdGF0dXMobXlfY2hpbGRfbnVtLCBTRVJWRVJfUkVBRFksIChyZXF1ZXN0X3JlYyAqKSBOVUxMKTsKLQotCS8qCi0JICogV2FpdCBmb3IgYW4gYWNjZXB0YWJsZSBjb25uZWN0aW9uIHRvIGFycml2ZS4KLQkgKi8KLQotCS8qIExvY2sgYXJvdW5kICJhY2NlcHQiLCBpZiBuZWNlc3NhcnkgKi8KLQlTQUZFX0FDQ0VQVChhY2NlcHRfbXV0ZXhfb24oKSk7Ci0KLQlmb3IgKDs7KSB7Ci0JICAgIGlmIChhcF9saXN0ZW5lcnMtPm5leHQgIT0gYXBfbGlzdGVuZXJzKSB7Ci0JCS8qIG1vcmUgdGhhbiBvbmUgc29ja2V0ICovCi0JCW1lbWNweSgmbWFpbl9mZHMsICZsaXN0ZW5mZHMsIHNpemVvZihmZF9zZXQpKTsKLQkJc3J2ID0gYXBfc2VsZWN0KGxpc3Rlbm1heGZkICsgMSwgJm1haW5fZmRzLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQotCQlpZiAoc3J2IDwgMCAmJiBlcnJubyAhPSBFSU5UUikgewotCQkgICAgLyogU2luZ2xlIFVuaXggZG9jdW1lbnRzIHNlbGVjdCBhcyByZXR1cm5pbmcgZXJybm9zCi0JCSAgICAgKiBFQkFERiwgRUlOVFIsIGFuZCBFSU5WQUwuLi4gYW5kIGluIG5vbmUgb2YgdGhvc2UKLQkJICAgICAqIGNhc2VzIGRvZXMgaXQgbWFrZSBzZW5zZSB0byBjb250aW51ZS4gIEluIGZhY3QKLQkJICAgICAqIG9uIExpbnV4IDIuMC54IHdlIHNlZW0gdG8gZW5kIHVwIHdpdGggRUZBVUxUCi0JCSAgICAgKiBvY2Nhc2lvbmFsbHksIGFuZCB3ZSdkIGxvb3AgZm9yZXZlciBkdWUgdG8gaXQuCi0JCSAgICAgKi8KLQkJICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHNlcnZlcl9jb25mLCAic2VsZWN0OiAobGlzdGVuKSIpOwotCQkgICAgY2xlYW5fY2hpbGRfZXhpdCgxKTsKLQkJfQotCi0JCWlmIChzcnYgPD0gMCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCWxyID0gZmluZF9yZWFkeV9saXN0ZW5lcigmbWFpbl9mZHMpOwotCQlpZiAobHIgPT0gTlVMTCkKLQkJICAgIGNvbnRpbnVlOwotCQlzZCA9IGxyLT5mZDsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJLyogb25seSBvbmUgc29ja2V0LCBqdXN0IHByZXRlbmQgd2UgZGlkIHRoZSBvdGhlciBzdHVmZiAqLwotCQlzZCA9IGFwX2xpc3RlbmVycy0+ZmQ7Ci0JICAgIH0KLQotCSAgICAvKiBpZiB3ZSBhY2NlcHQoKSBzb21ldGhpbmcgd2UgZG9uJ3Qgd2FudCB0byBkaWUsIHNvIHdlIGhhdmUgdG8KLQkgICAgICogZGVmZXIgdGhlIGV4aXQKLQkgICAgICovCi0JICAgIGRlZmVycmVkX2RpZSA9IDA7Ci0JICAgIHVzcjFfanVzdF9kaWUgPSAwOwotCSAgICBmb3IgKDs7KSB7Ci0JCWNsZW4gPSBzaXplb2Yoc2FfY2xpZW50KTsKLQkJY3NkID0gYXBfYWNjZXB0KHNkLCAmc2FfY2xpZW50LCAmY2xlbik7Ci0JCWlmIChjc2QgPj0gMCB8fCBlcnJubyAhPSBFSU5UUikKLQkJICAgIGJyZWFrOwotCQlpZiAoZGVmZXJyZWRfZGllKSB7Ci0JCSAgICAvKiB3ZSBkaWRuJ3QgZ2V0IGEgc29ja2V0LCBhbmQgd2Ugd2VyZSB0b2xkIHRvIGRpZSAqLwotCQkgICAgY2xlYW5fY2hpbGRfZXhpdCgwKTsKLQkJfQotCSAgICB9Ci0KLQkgICAgaWYgKGNzZCA+PSAwKQotCQlicmVhazsJCS8qIFdlIGhhdmUgYSBzb2NrZXQgcmVhZHkgZm9yIHJlYWRpbmcgKi8KLQkgICAgZWxzZSB7Ci0KLQkJLyogT3VyIG9sZCBiZWhhdmlvdXIgaGVyZSB3YXMgdG8gY29udGludWUgYWZ0ZXIgYWNjZXB0KCkKLQkJICogZXJyb3JzLiAgQnV0IHRoaXMgbGVhZHMgdXMgaW50byBsb3RzIG9mIHRyb3VibGVzCi0JCSAqIGJlY2F1c2UgbW9zdCBvZiB0aGUgZXJyb3JzIGFyZSBxdWl0ZSBmYXRhbC4gIEZvcgotCQkgKiBleGFtcGxlLCBFTUZJTEUgY2FuIGJlIGNhdXNlZCBieSBzbG93IGRlc2NyaXB0b3IKLQkJICogbGVha3MgKHNheSBpbiBhIDNyZCBwYXJ0eSBtb2R1bGUsIG9yIGxpYmMpLiAgSXQncwotCQkgKiBmb29saXNoIGZvciB1cyB0byBjb250aW51ZSBhZnRlciBhbiBFTUZJTEUuICBXZSBhbHNvCi0JCSAqIHNlZW0gdG8gdGlja2xlIGtlcm5lbCBidWdzIG9uIHNvbWUgcGxhdGZvcm1zIHdoaWNoCi0JCSAqIGxlYWQgdG8gbmV2ZXItZW5kaW5nIGxvb3BzIGhlcmUuICBTbyBpdCBzZWVtcyBiZXN0Ci0JCSAqIHRvIGp1c3QgZXhpdCBpbiBtb3N0IGNhc2VzLgotCQkgKi8KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGVycm5vKSB7Ci0jaWZkZWYgRVBST1RPCi0JCSAgICAvKiBFUFJPVE8gb24gY2VydGFpbiBvbGRlciBrZXJuZWxzIHJlYWxseSBtZWFucwotCQkgICAgICogRUNPTk5BQk9SVEVELCBzbyB3ZSBuZWVkIHRvIGlnbm9yZSBpdCBmb3IgdGhlbS4KLQkJICAgICAqIFNlZSBkaXNjdXNzaW9uIGluIG5ldy1odHRwZCBhcmNoaXZlcyBuaC45NzAxCi0JCSAgICAgKiBzZWFyY2ggZm9yIEVQUk9UTy4KLQkJICAgICAqCi0JCSAgICAgKiBBbHNvIHNlZSBuaC45NjAzLCBzZWFyY2ggZm9yIEVQUk9UTzoKLQkJICAgICAqIFRoZXJlIGlzIHBvdGVudGlhbGx5IGEgYnVnIGluIFNvbGFyaXMgMi54IHg8NiwKLQkJICAgICAqIGFuZCBvdGhlciBib3hlcyB0aGF0IGltcGxlbWVudCB0Y3Agc29ja2V0cyBpbgotCQkgICAgICogdXNlcmxhbmQgKGkuZS4gb24gdG9wIG9mIFNUUkVBTVMpLiAgT24gdGhlc2UKLQkJICAgICAqIHN5c3RlbXMsIEVQUk9UTyBjYW4gYWN0dWFsbHkgcmVzdWx0IGluIGEgZmF0YWwKLQkJICAgICAqIGxvb3AuICBTZWUgUFIjOTgxIGZvciBleGFtcGxlLiAgSXQncyBoYXJkIHRvCi0JCSAgICAgKiBoYW5kbGUgYm90aCB1c2VzIG9mIEVQUk9UTy4KLQkJICAgICAqLwotICAgICAgICAgICAgICAgIGNhc2UgRVBST1RPOgotI2VuZGlmCi0jaWZkZWYgRUNPTk5BQk9SVEVECi0gICAgICAgICAgICAgICAgY2FzZSBFQ09OTkFCT1JURUQ6Ci0jZW5kaWYKLQkJICAgIC8qIExpbnV4IGdlbmVyYXRlcyB0aGUgcmVzdCBvZiB0aGVzZSwgb3RoZXIgdGNwCi0JCSAgICAgKiBzdGFja3MgKGkuZS4gYnNkKSB0ZW5kIHRvIGhpZGUgdGhlbSBiZWhpbmQKLQkJICAgICAqIGdldHNvY2tvcHQoKSBpbnRlcmZhY2VzLiAgVGhleSBvY2N1ciB3aGVuCi0JCSAgICAgKiB0aGUgbmV0IGdvZXMgc291ciBvciB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzCi0JCSAgICAgKiBhZnRlciB0aGUgdGhyZWUtd2F5IGhhbmRzaGFrZSBoYXMgYmVlbiBkb25lCi0JCSAgICAgKiBpbiB0aGUga2VybmVsIGJ1dCBiZWZvcmUgdXNlcmxhbmQgaGFzIHBpY2tlZAotCQkgICAgICogdXAgdGhlIHNvY2tldC4KLQkJICAgICAqLwotI2lmZGVmIEVDT05OUkVTRVQKLSAgICAgICAgICAgICAgICBjYXNlIEVDT05OUkVTRVQ6Ci0jZW5kaWYKLSNpZmRlZiBFVElNRURPVVQKLSAgICAgICAgICAgICAgICBjYXNlIEVUSU1FRE9VVDoKLSNlbmRpZgotI2lmZGVmIEVIT1NUVU5SRUFDSAotCQljYXNlIEVIT1NUVU5SRUFDSDoKLSNlbmRpZgotI2lmZGVmIEVORVRVTlJFQUNICi0JCWNhc2UgRU5FVFVOUkVBQ0g6Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgRU5FVERPV04KLQkJY2FzZSBFTkVURE9XTjoKLQkJICAgICAvKgotCQkgICAgICAqIFdoZW4gdGhlIG5ldHdvcmsgbGF5ZXIgaGFzIGJlZW4gc2h1dCBkb3duLCB0aGVyZQotCQkgICAgICAqIGlzIG5vdCBtdWNoIHVzZSBpbiBzaW1wbHkgZXhpdGluZzogdGhlIHBhcmVudAotCQkgICAgICAqIHdvdWxkIHNpbXBseSByZS1jcmVhdGUgdXMgKGFuZCB3ZSdkIGZhaWwgYWdhaW4pLgotCQkgICAgICAqIFVzZSB0aGUgQ0hJTERGQVRBTCBjb2RlIHRvIHRlYXIgdGhlIHNlcnZlciBkb3duLgotCQkgICAgICAqIEBAQCBNYXJ0aW4ncyBpZGVhIGZvciBwb3NzaWJsZSBpbXByb3ZlbWVudDoKLQkJICAgICAgKiBBIGRpZmZlcmVudCBhcHByb2FjaCB3b3VsZCBiZSB0byBkZWZpbmUKLQkJICAgICAgKiBhIG5ldyBBUEVYSVRfTkVURE9XTiBleGl0IGNvZGUsIHRoZSByZWNlcHRpb24KLQkJICAgICAgKiBvZiB3aGljaCB3b3VsZCBtYWtlIHRoZSBwYXJlbnQgc2h1dGRvd24gYWxsCi0JCSAgICAgICogY2hpbGRyZW4sIHRoZW4gaWRsZS1sb29wIHVudGlsIGl0IGRldGVjdGVkIHRoYXQKLQkJICAgICAgKiB0aGUgbmV0d29yayBpcyB1cCBhZ2FpbiwgYW5kIHJlc3RhcnQgdGhlIGNoaWxkcmVuLgotCQkgICAgICAqIEJlbiBIeWRlIG5vdGVkIHRoYXQgdGVtcG9yYXJ5IEVORVRET1dOIHNpdHVhdGlvbnMKLQkJICAgICAgKiBvY2N1ciBpbiBtb2JpbGUgSVAuCi0JCSAgICAgICovCi0JCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkcsIHNlcnZlcl9jb25mLAotCQkJImFjY2VwdDogZ2l2aW5nIHVwLiIpOwotCQkgICAgY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0jZW5kaWYgLypFTkVURE9XTiovCi0KLSNpZmRlZiBUUEYKLQkJY2FzZSBFSU5BQ1Q6Ci0JCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkcsIHNlcnZlcl9jb25mLAotCQkJIm9mZmxvYWQgZGV2aWNlIGluYWN0aXZlIik7Ci0JCSAgICBjbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLQkJICAgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCBzZXJ2ZXJfY29uZiwKLQkJCSJzZWxlY3QvYWNjZXB0IGVycm9yICgldSkiLCBlcnJubyk7Ci0JCSAgICBjbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSNlbHNlCi0JCWRlZmF1bHQ6Ci0JCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzZXJ2ZXJfY29uZiwKLQkJCQkiYWNjZXB0OiAoY2xpZW50IHNvY2tldCkiKTsKLQkJICAgIGNsZWFuX2NoaWxkX2V4aXQoMSk7Ci0jZW5kaWYKLQkJfQotCSAgICB9Ci0KLQkgICAgLyogZ28gYXJvdW5kIGFnYWluLCBzYWZlIHRvIGRpZSAqLwotCSAgICB1c3IxX2p1c3RfZGllID0gMTsKLQkgICAgaWYgKGRlZmVycmVkX2RpZSkgewotCQkvKiBvayBtYXliZSBub3QsIHNlZSB5YSBsYXRlciAqLwotCQljbGVhbl9jaGlsZF9leGl0KDApOwotCSAgICB9Ci0JICAgIC8qIG9yIG1heWJlIHdlIG1pc3NlZCBhIHNpZ25hbCwgeW91IG5ldmVyIGtub3cgb24gc3lzdGVtcwotCSAgICAgKiB3aXRob3V0IHJlbGlhYmxlIHNpZ25hbHMKLQkgICAgICovCi0JICAgIGFwX3N5bmNfc2NvcmVib2FyZF9pbWFnZSgpOwotCSAgICBpZiAoYXBfc2NvcmVib2FyZF9pbWFnZS0+Z2xvYmFsLnJ1bm5pbmdfZ2VuZXJhdGlvbiAhPSBhcF9teV9nZW5lcmF0aW9uKSB7Ci0JCWNsZWFuX2NoaWxkX2V4aXQoMCk7Ci0JICAgIH0KLQl9Ci0KLQlTQUZFX0FDQ0VQVChhY2NlcHRfbXV0ZXhfb2ZmKCkpOwkvKiB1bmxvY2sgYWZ0ZXIgImFjY2VwdCIgKi8KLQotI2lmZGVmIFRQRgotCWlmIChjc2QgPT0gMCkgICAgICAgICAgICAgICAgICAgICAgIC8qIDAgaXMgaW52YWxpZCBzb2NrZXQgZm9yIFRQRiAqLwotCSAgICBjb250aW51ZTsKLSNlbmRpZgotCi0JLyogV2UndmUgZ290IGEgc29ja2V0LCBsZXQncyBhdCBsZWFzdCBwcm9jZXNzIG9uZSByZXF1ZXN0IG9mZiB0aGUKLQkgKiBzb2NrZXQgYmVmb3JlIHdlIGFjY2VwdCBhIGdyYWNlZnVsIHJlc3RhcnQgcmVxdWVzdC4KLQkgKi8KLQlzaWduYWwoU0lHVVNSMSwgU0lHX0lHTik7Ci0KLQlhcF9ub3RlX2NsZWFudXBzX2Zvcl9mZChwdHJhbnMsIGNzZCk7Ci0KLQkvKiBwcm90ZWN0IHZhcmlvdXMgZmRfc2V0cyAqLwotI2lmZGVmIENIRUNLX0ZEX1NFVFNJWkUKLQlpZiAoY3NkID49IEZEX1NFVFNJWkUpIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfV0FSTklORywgTlVMTCwKLQkJIltjc2RdIGZpbGVkZXNjcmlwdG9yICgldSkgbGFyZ2VyIHRoYW4gRkRfU0VUU0laRSAoJXUpICIKLQkJImZvdW5kLCB5b3UgcHJvYmFibHkgbmVlZCB0byByZWJ1aWxkIEFwYWNoZSB3aXRoIGEgIgotCQkibGFyZ2VyIEZEX1NFVFNJWkUiLCBjc2QsIEZEX1NFVFNJWkUpOwotCSAgICBjb250aW51ZTsKLQl9Ci0jZW5kaWYKLQotCS8qCi0JICogV2Ugbm93IGhhdmUgYSBjb25uZWN0aW9uLCBzbyBzZXQgaXQgdXAgd2l0aCB0aGUgYXBwcm9wcmlhdGUKLQkgKiBzb2NrZXQgb3B0aW9ucywgZmlsZSBkZXNjcmlwdG9ycywgYW5kIHJlYWQvd3JpdGUgYnVmZmVycy4KLQkgKi8KLQotCWNsZW4gPSBzaXplb2Yoc2Ffc2VydmVyKTsKLQlpZiAoZ2V0c29ja25hbWUoY3NkLCAmc2Ffc2VydmVyLCAmY2xlbikgPCAwKSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHNlcnZlcl9jb25mLCAiZ2V0c29ja25hbWUiKTsKLQkgICAgY29udGludWU7Ci0JfQotCi0Jc29ja19kaXNhYmxlX25hZ2xlKGNzZCk7Ci0KLQkodm9pZCkgYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhteV9jaGlsZF9udW0sIFNFUlZFUl9CVVNZX1JFQUQsCi0JCQkJICAgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotCi0JY29ubl9pbyA9IGFwX2JjcmVhdGUocHRyYW5zLCBCX1JEV1IgfCBCX1NPQ0tFVCk7Ci0KLSNpZmRlZiBCX1NGSU8KLQkodm9pZCkgc2ZkaXNjKGNvbm5faW8tPnNmX2luLCBTRl9QT1BESVNDKTsKLQlzZmRpc2MoY29ubl9pby0+c2ZfaW4sIGJzZmlvX25ldyhjb25uX2lvLT5wb29sLCBjb25uX2lvKSk7Ci0Jc2ZzZXRidWYoY29ubl9pby0+c2ZfaW4sIE5VTEwsIDApOwotCi0JKHZvaWQpIHNmZGlzYyhjb25uX2lvLT5zZl9vdXQsIFNGX1BPUERJU0MpOwotCXNmZGlzYyhjb25uX2lvLT5zZl9vdXQsIGJzZmlvX25ldyhjb25uX2lvLT5wb29sLCBjb25uX2lvKSk7Ci0Jc2ZzZXRidWYoY29ubl9pby0+c2Zfb3V0LCBOVUxMLCAwKTsKLSNlbmRpZgotCi0JZHVwcGVkX2NzZCA9IGNzZDsKLSNpZiBkZWZpbmVkKE5FRURfRFVQUEVEX0NTRCkKLQlpZiAoKGR1cHBlZF9jc2QgPSBkdXAoY3NkKSkgPCAwKSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHNlcnZlcl9jb25mLAotCQkJImR1cDogY291bGRuJ3QgZHVwbGljYXRlIGNzZCIpOwotCSAgICBkdXBwZWRfY3NkID0gY3NkOwkvKiBPaCB3ZWxsLi4uICovCi0JfQotCWFwX25vdGVfY2xlYW51cHNfZm9yX2ZkKHB0cmFucywgZHVwcGVkX2NzZCk7Ci0KLQkvKiBwcm90ZWN0IHZhcmlvdXMgZmRfc2V0cyAqLwotI2lmZGVmIENIRUNLX0ZEX1NFVFNJWkUKLQlpZiAoZHVwcGVkX2NzZCA+PSBGRF9TRVRTSVpFKSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX1dBUk5JTkcsIE5VTEwsCi0JCSJbZHVwcGVkX2NzZF0gZmlsZWRlc2NyaXB0b3IgKCV1KSBsYXJnZXIgdGhhbiBGRF9TRVRTSVpFICgldSkgIgotCQkiZm91bmQsIHlvdSBwcm9iYWJseSBuZWVkIHRvIHJlYnVpbGQgQXBhY2hlIHdpdGggYSAiCi0JCSJsYXJnZXIgRkRfU0VUU0laRSIsIGR1cHBlZF9jc2QsIEZEX1NFVFNJWkUpOwotCSAgICBjb250aW51ZTsKLQl9Ci0jZW5kaWYKLSNlbmRpZgotCWFwX2JwdXNoZmQoY29ubl9pbywgY3NkLCBkdXBwZWRfY3NkKTsKLQotCWN1cnJlbnRfY29ubiA9IG5ld19jb25uZWN0aW9uKHB0cmFucywgc2VydmVyX2NvbmYsIGNvbm5faW8sCi0JCQkJICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJnNhX2NsaWVudCwKLQkJCQkgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmc2Ffc2VydmVyLAotCQkJCSAgICAgICAgICBteV9jaGlsZF9udW0pOwotCi0JLyoKLQkgKiBSZWFkIGFuZCBwcm9jZXNzIGVhY2ggcmVxdWVzdCBmb3VuZCBvbiBvdXIgY29ubmVjdGlvbgotCSAqIHVudGlsIG5vIHJlcXVlc3RzIGFyZSBsZWZ0IG9yIHdlIGRlY2lkZSB0byBjbG9zZS4KLQkgKi8KLQotCXdoaWxlICgociA9IGFwX3JlYWRfcmVxdWVzdChjdXJyZW50X2Nvbm4pKSAhPSBOVUxMKSB7Ci0KLQkgICAgLyogcmVhZF9yZXF1ZXN0X2xpbmUgaGFzIGFscmVhZHkgZG9uZSBhCi0JICAgICAqIHNpZ25hbCAoU0lHVVNSMSwgU0lHX0lHTik7Ci0JICAgICAqLwotCi0JICAgICh2b2lkKSBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKG15X2NoaWxkX251bSwgU0VSVkVSX0JVU1lfV1JJVEUsIHIpOwotCi0JICAgIC8qIHByb2Nlc3MgdGhlIHJlcXVlc3QgaWYgaXQgd2FzIHJlYWQgd2l0aG91dCBlcnJvciAqLwotCi0JICAgIGlmIChyLT5zdGF0dXMgPT0gSFRUUF9PSykKLQkJYXBfcHJvY2Vzc19yZXF1ZXN0KHIpOwotCi0JICAgIGlmKGFwX2V4dGVuZGVkX3N0YXR1cykKLQkJaW5jcmVtZW50X2NvdW50cyhteV9jaGlsZF9udW0sIHIpOwotCi0JICAgIGlmICghY3VycmVudF9jb25uLT5rZWVwYWxpdmUgfHwgY3VycmVudF9jb25uLT5hYm9ydGVkKQotCQlicmVhazsKLQotCSAgICBhcF9kZXN0cm95X3Bvb2woci0+cG9vbCk7Ci0JICAgICh2b2lkKSBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKG15X2NoaWxkX251bSwgU0VSVkVSX0JVU1lfS0VFUEFMSVZFLAotCQkJCSAgICAgICAocmVxdWVzdF9yZWMgKikgTlVMTCk7Ci0KLQkgICAgYXBfc3luY19zY29yZWJvYXJkX2ltYWdlKCk7Ci0JICAgIGlmIChhcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwucnVubmluZ19nZW5lcmF0aW9uICE9IGFwX215X2dlbmVyYXRpb24pIHsKLQkJYXBfYmNsb3NlKGNvbm5faW8pOwotCQljbGVhbl9jaGlsZF9leGl0KDApOwotCSAgICB9Ci0KLQkgICAgLyogSW4gY2FzZSB3ZSBnZXQgYSBncmFjZWZ1bCByZXN0YXJ0IHdoaWxlIHdlJ3JlIGJsb2NrZWQKLQkgICAgICogd2FpdGluZyBmb3IgdGhlIHJlcXVlc3QuCi0JICAgICAqCi0JICAgICAqIFhYWDogVGhpcyBpc24ndCBwZXJmZWN0LCB3ZSBtaWdodCBhY3R1YWxseSByZWFkIHRoZQotCSAgICAgKiByZXF1ZXN0IGFuZCB0aGVuIGp1c3QgZGllIHdpdGhvdXQgc2F5aW5nIGFueXRoaW5nIHRvCi0JICAgICAqIHRoZSBjbGllbnQuICBUaGlzIGNhbiBiZSBmaXhlZCBieSB1c2luZyBkZWZlcnJlZF9kaWUKLQkgICAgICogYnV0IHlvdSBoYXZlIHRvIHRlYWNoIGJ1ZmYuYyBhYm91dCBpdCBzbyB0aGF0IGl0IGNhbiBoYW5kbGUKLQkgICAgICogdGhlIEVJTlRSIHByb3Blcmx5LgotCSAgICAgKgotCSAgICAgKiBJbiBwcmFjdGljZSB0aG91Z2ggYnJvd3NlcnMgKGhhdmUgdG8pIGV4cGVjdCBrZWVwYWxpdmUKLQkgICAgICogY29ubmVjdGlvbnMgdG8gY2xvc2UgYmVmb3JlIHJlY2VpdmluZyBhIHJlc3BvbnNlIGJlY2F1c2UKLQkgICAgICogb2YgbmV0d29yayBsYXRlbmNpZXMgYW5kIHNlcnZlciB0aW1lb3V0cy4KLQkgICAgICovCi0JICAgIHVzcjFfanVzdF9kaWUgPSAxOwotCSAgICBzaWduYWwoU0lHVVNSMSwgdXNyMV9oYW5kbGVyKTsKLQl9Ci0KLQkvKgotCSAqIENsb3NlIHRoZSBjb25uZWN0aW9uLCBiZWluZyBjYXJlZnVsIHRvIHNlbmQgb3V0IHdoYXRldmVyIGlzIHN0aWxsCi0JICogaW4gb3VyIGJ1ZmZlcnMuICBJZiBwb3NzaWJsZSwgdHJ5IHRvIGF2b2lkIGEgaGFyZCBjbG9zZSB1bnRpbCB0aGUKLQkgKiBjbGllbnQgaGFzIEFDS2VkIG91ciBGSU4gYW5kL29yIGhhcyBzdG9wcGVkIHNlbmRpbmcgdXMgZGF0YS4KLQkgKi8KLQotI2lmZGVmIE5PX0xJTkdDTE9TRQotCWFwX2JjbG9zZShjb25uX2lvKTsJLyoganVzdCBjbG9zZSBpdCAqLwotI2Vsc2UKLQlpZiAociAmJiByLT5jb25uZWN0aW9uCi0JICAgICYmICFyLT5jb25uZWN0aW9uLT5hYm9ydGVkCi0JICAgICYmIHItPmNvbm5lY3Rpb24tPmNsaWVudAotCSAgICAmJiAoci0+Y29ubmVjdGlvbi0+Y2xpZW50LT5mZCA+PSAwKSkgewotCi0JICAgIGxpbmdlcmluZ19jbG9zZShyKTsKLQl9Ci0JZWxzZSB7Ci0JICAgIGFwX2JzZXRmbGFnKGNvbm5faW8sIEJfRU9VVCwgMSk7Ci0JICAgIGFwX2JjbG9zZShjb25uX2lvKTsKLQl9Ci0jZW5kaWYKLSAgICB9Ci19Ci0KLSNpZmRlZiBUUEYKLXN0YXRpYyB2b2lkIHJlc2V0X3RwZl9saXN0ZW5lcnMoQVBBQ0hFX1RQRl9JTlBVVCAqaW5wdXRfcGFybXMpCi17Ci0gICAgaW50IGNvdW50OwotICAgIGxpc3Rlbl9yZWMgKmxyOwotCi0gICAgY291bnQgPSAwOwotICAgIGxpc3Rlbm1heGZkID0gLTE7Ci0gICAgRkRfWkVSTygmbGlzdGVuZmRzKTsKLSAgICBsciA9IGFwX2xpc3RlbmVyczsKLQotICAgIGZvcig7OykgewotICAgICAgICBsci0+ZmQgPSBpbnB1dF9wYXJtcy0+bGlzdGVuZXJzW2NvdW50XTsKLSAgICAgICAgaWYobHItPmZkID49IDApIHsKLSAgICAgICAgICAgIEZEX1NFVChsci0+ZmQsICZsaXN0ZW5mZHMpOwotICAgICAgICAgICAgaWYobHItPmZkID4gbGlzdGVubWF4ZmQpCi0gICAgICAgICAgICAgICAgbGlzdGVubWF4ZmQgPSBsci0+ZmQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYobHItPm5leHQgPT0gTlVMTCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBsciA9IGxyLT5uZXh0OwotICAgICAgICBjb3VudCsrOwotICAgIH0KLSAgICBsci0+bmV4dCA9IGFwX2xpc3RlbmVyczsKLSAgICBoZWFkX2xpc3RlbmVyID0gYXBfbGlzdGVuZXJzOwotICAgIGNsb3NlX3VudXNlZF9saXN0ZW5lcnMoKTsKLX0KLQotI2VuZGlmIC8qIFRQRiAqLwotCi1zdGF0aWMgaW50IG1ha2VfY2hpbGQoc2VydmVyX3JlYyAqcywgaW50IHNsb3QsIHRpbWVfdCBub3cpCi17Ci0gICAgaW50IHBpZDsKLQotICAgIGlmIChzbG90ICsgMSA+IG1heF9kYWVtb25zX2xpbWl0KSB7Ci0JbWF4X2RhZW1vbnNfbGltaXQgPSBzbG90ICsgMTsKLSAgICB9Ci0KLSAgICBpZiAob25lX3Byb2Nlc3MpIHsKLQlzaWduYWwoU0lHSFVQLCBqdXN0X2RpZSk7Ci0Jc2lnbmFsKFNJR0lOVCwganVzdF9kaWUpOwotI2lmZGVmIFNJR1FVSVQKLQlzaWduYWwoU0lHUVVJVCwgU0lHX0RGTCk7Ci0jZW5kaWYKLQlzaWduYWwoU0lHVEVSTSwganVzdF9kaWUpOwotCWNoaWxkX21haW4oc2xvdCk7Ci0gICAgfQotCi0gICAgLyogYXZvaWQgc3RhcnZhdGlvbiAqLwotICAgIGhlYWRfbGlzdGVuZXIgPSBoZWFkX2xpc3RlbmVyLT5uZXh0OwotCi0gICAgRXhwbGFpbjEoIlN0YXJ0aW5nIG5ldyBjaGlsZCBpbiBzbG90ICVkIiwgc2xvdCk7Ci0gICAgKHZvaWQpIGFwX3VwZGF0ZV9jaGlsZF9zdGF0dXMoc2xvdCwgU0VSVkVSX1NUQVJUSU5HLCAocmVxdWVzdF9yZWMgKikgTlVMTCk7Ci0KLQotI2lmZGVmIF9PU0RfUE9TSVgKLSAgICAvKiBCUzIwMDAgcmVxdWlyZXMgYSAic3BlY2lhbCIgdmVyc2lvbiBvZiBmb3JrKCkgYmVmb3JlIGEgc2V0dWlkKCkgY2FsbCAqLwotICAgIGlmICgocGlkID0gb3NfZm9yayhhcF91c2VyX25hbWUpKSA9PSAtMSkgewotI2VsaWYgZGVmaW5lZChUUEYpCi0gICAgaWYgKChwaWQgPSBvc19mb3JrKHMsIHNsb3QpKSA9PSAtMSkgewotI2Vsc2UKLSAgICBpZiAoKHBpZCA9IGZvcmsoKSkgPT0gLTEpIHsKLSNlbmRpZgotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHMsICJmb3JrOiBVbmFibGUgdG8gZm9yayBuZXcgcHJvY2VzcyIpOwotCi0JLyogZm9yayBkaWRuJ3Qgc3VjY2VlZC4gRml4IHRoZSBzY29yZWJvYXJkIG9yIGVsc2UKLQkgKiBpdCB3aWxsIHNheSBTRVJWRVJfU1RBUlRJTkcgZm9yZXZlciBhbmQgZXZlcgotCSAqLwotCSh2b2lkKSBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKHNsb3QsIFNFUlZFUl9ERUFELCAocmVxdWVzdF9yZWMgKikgTlVMTCk7Ci0KLQkvKiBJbiBjYXNlIHN5c3RlbSByZXNvdXJjZXMgYXJlIG1heHhlZCBvdXQsIHdlIGRvbid0IHdhbnQKLQkgICBBcGFjaGUgcnVubmluZyBhd2F5IHdpdGggdGhlIENQVSB0cnlpbmcgdG8gZm9yayBvdmVyIGFuZAotCSAgIG92ZXIgYW5kIG92ZXIgYWdhaW4uICovCi0Jc2xlZXAoMTApOwotCi0JcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGlmICghcGlkKSB7Ci0jaWZkZWYgQUlYX0JJTkRfUFJPQ0VTU09SCi0vKiBieSBkZWZhdWx0IEFJWCBiaW5kcyB0byBhIHNpbmdsZSBwcm9jZXNzb3IKLSAqIHRoaXMgYml0IHVuYmluZHMgY2hpbGRyZW4gd2hpY2ggd2lsbCB0aGVuIGJpbmQgdG8gYW5vdGhlciBjcHUKLSAqLwotI2luY2x1ZGUgPHN5cy9wcm9jZXNzb3IuaD4KLQlpbnQgc3RhdHVzID0gYmluZHByb2Nlc3NvcihCSU5EUFJPQ0VTUywgKGludClnZXRwaWQoKSwgCi0JCQkJICAgUFJPQ0VTU09SX0NMQVNTX0FOWSk7Ci0JaWYgKHN0YXR1cyAhPSBPSykgewotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLCBzZXJ2ZXJfY29uZiwKLQkJCSJwcm9jZXNzb3IgdW5iaW5kIGZhaWxlZCAlZCIsIHN0YXR1cyk7Ci0JfQotI2VuZGlmCi0JUkFJU0VfU0lHU1RPUChNQUtFX0NISUxEKTsKLQlNT05DT05UUk9MKDEpOwotCS8qIERpc2FibGUgdGhlIHJlc3RhcnQgc2lnbmFsIGhhbmRsZXJzIGFuZCBlbmFibGUgdGhlIGp1c3RfZGllIHN0dWZmLgotCSAqIE5vdGUgdGhhdCBzaW5jZSByZXN0YXJ0KCkganVzdCBub3RlcyB0aGF0IGEgcmVzdGFydCBoYXMgYmVlbgotCSAqIHJlcXVlc3RlZCB0aGVyZSdzIG5vIHJhY2UgY29uZGl0aW9uIGhlcmUuCi0JICovCi0Jc2lnbmFsKFNJR0hVUCwganVzdF9kaWUpOwotCXNpZ25hbChTSUdVU1IxLCBqdXN0X2RpZSk7Ci0Jc2lnbmFsKFNJR1RFUk0sIGp1c3RfZGllKTsKLQljaGlsZF9tYWluKHNsb3QpOwotICAgIH0KLQotI2lmZGVmIE9QVElNSVpFX1RJTUVPVVRTCi0gICAgYXBfc2NvcmVib2FyZF9pbWFnZS0+cGFyZW50W3Nsb3RdLmxhc3RfcnRpbWUgPSBub3c7Ci0jZW5kaWYKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlLT5wYXJlbnRbc2xvdF0ucGlkID0gcGlkOwotI2lmZGVmIFNDT1JFQk9BUkRfRklMRQotICAgIGxzZWVrKHNjb3JlYm9hcmRfZmQsIFh0T2Zmc2V0T2Yoc2NvcmVib2FyZCwgcGFyZW50W3Nsb3RdKSwgMCk7Ci0gICAgZm9yY2Vfd3JpdGUoc2NvcmVib2FyZF9mZCwgJmFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtzbG90XSwKLQkJc2l6ZW9mKHBhcmVudF9zY29yZSkpOwotI2VuZGlmCi0KLSAgICByZXR1cm4gMDsKLX0KLQotCi0vKiBzdGFydCB1cCBhIGJ1bmNoIG9mIGNoaWxkcmVuICovCi1zdGF0aWMgdm9pZCBzdGFydHVwX2NoaWxkcmVuKGludCBudW1iZXJfdG9fc3RhcnQpCi17Ci0gICAgaW50IGk7Ci0gICAgdGltZV90IG5vdyA9IHRpbWUoMCk7Ci0KLSAgICBmb3IgKGkgPSAwOyBudW1iZXJfdG9fc3RhcnQgJiYgaSA8IGFwX2RhZW1vbnNfbGltaXQ7ICsraSkgewotCWlmIChhcF9zY29yZWJvYXJkX2ltYWdlLT5zZXJ2ZXJzW2ldLnN0YXR1cyAhPSBTRVJWRVJfREVBRCkgewotCSAgICBjb250aW51ZTsKLQl9Ci0JaWYgKG1ha2VfY2hpbGQoc2VydmVyX2NvbmYsIGksIG5vdykgPCAwKSB7Ci0JICAgIGJyZWFrOwotCX0KLQktLW51bWJlcl90b19zdGFydDsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIGlkbGVfc3Bhd25fcmF0ZSBpcyB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHRoYXQgd2lsbCBiZSBzcGF3bmVkIG9uIHRoZQotICogbmV4dCBtYWludGVuYW5jZSBjeWNsZSBpZiB0aGVyZSBhcmVuJ3QgZW5vdWdoIGlkbGUgc2VydmVycy4gIEl0IGlzCi0gKiBkb3VibGVkIHVwIHRvIE1BWF9TUEFXTl9SQVRFLCBhbmQgcmVzZXQgb25seSB3aGVuIGEgY3ljbGUgZ29lcyBieQotICogd2l0aG91dCB0aGUgbmVlZCB0byBzcGF3bi4KLSAqLwotc3RhdGljIGludCBpZGxlX3NwYXduX3JhdGUgPSAxOwotI2lmbmRlZiBNQVhfU1BBV05fUkFURQotI2RlZmluZSBNQVhfU1BBV05fUkFURQkoMzIpCi0jZW5kaWYKLXN0YXRpYyBpbnQgaG9sZF9vZmZfb25fZXhwb25lbnRpYWxfc3Bhd25pbmc7Ci0KLXN0YXRpYyB2b2lkIHBlcmZvcm1faWRsZV9zZXJ2ZXJfbWFpbnRlbmFuY2Uodm9pZCkKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgdG9fa2lsbDsKLSAgICBpbnQgaWRsZV9jb3VudDsKLSAgICBzaG9ydF9zY29yZSAqc3M7Ci0gICAgdGltZV90IG5vdyA9IHRpbWUoMCk7Ci0gICAgaW50IGZyZWVfbGVuZ3RoOwotICAgIGludCBmcmVlX3Nsb3RzW01BWF9TUEFXTl9SQVRFXTsKLSAgICBpbnQgbGFzdF9ub25fZGVhZDsKLSAgICBpbnQgdG90YWxfbm9uX2RlYWQ7Ci0KLSAgICAvKiBpbml0aWFsaXplIHRoZSBmcmVlX2xpc3QgKi8KLSAgICBmcmVlX2xlbmd0aCA9IDA7Ci0KLSAgICB0b19raWxsID0gLTE7Ci0gICAgaWRsZV9jb3VudCA9IDA7Ci0gICAgbGFzdF9ub25fZGVhZCA9IC0xOwotICAgIHRvdGFsX25vbl9kZWFkID0gMDsKLQotICAgIGFwX3N5bmNfc2NvcmVib2FyZF9pbWFnZSgpOwotICAgIGZvciAoaSA9IDA7IGkgPCBhcF9kYWVtb25zX2xpbWl0OyArK2kpIHsKLQlpbnQgc3RhdHVzOwotCi0JaWYgKGkgPj0gbWF4X2RhZW1vbnNfbGltaXQgJiYgZnJlZV9sZW5ndGggPT0gaWRsZV9zcGF3bl9yYXRlKQotCSAgICBicmVhazsKLQlzcyA9ICZhcF9zY29yZWJvYXJkX2ltYWdlLT5zZXJ2ZXJzW2ldOwotCXN0YXR1cyA9IHNzLT5zdGF0dXM7Ci0JaWYgKHN0YXR1cyA9PSBTRVJWRVJfREVBRCkgewotCSAgICAvKiB0cnkgdG8ga2VlcCBjaGlsZHJlbiBudW1iZXJzIGFzIGxvdyBhcyBwb3NzaWJsZSAqLwotCSAgICBpZiAoZnJlZV9sZW5ndGggPCBpZGxlX3NwYXduX3JhdGUpIHsKLQkJZnJlZV9zbG90c1tmcmVlX2xlbmd0aF0gPSBpOwotCQkrK2ZyZWVfbGVuZ3RoOwotCSAgICB9Ci0JfQotCWVsc2UgewotCSAgICAvKiBXZSBjb25zaWRlciBhIHN0YXJ0aW5nIHNlcnZlciBhcyBpZGxlIGJlY2F1c2Ugd2Ugc3RhcnRlZCBpdAotCSAgICAgKiBhdCBsZWFzdCBhIGN5Y2xlIGFnbywgYW5kIGlmIGl0IHN0aWxsIGhhc24ndCBmaW5pc2hlZCBzdGFydGluZwotCSAgICAgKiB0aGVuIHdlJ3JlIGp1c3QgZ29pbmcgdG8gc3dhbXAgdGhpbmdzIHdvcnNlIGJ5IGZvcmtpbmcgbW9yZS4KLQkgICAgICogU28gd2UgaG9wZWZ1bGx5IHdvbid0IG5lZWQgdG8gZm9yayBtb3JlIGlmIHdlIGNvdW50IGl0LgotCSAgICAgKiBUaGlzIGRlcGVuZHMgb24gdGhlIG9yZGVyaW5nIG9mIFNFUlZFUl9SRUFEWSBhbmQgU0VSVkVSX1NUQVJUSU5HLgotCSAgICAgKi8KLQkgICAgaWYgKHN0YXR1cyA8PSBTRVJWRVJfUkVBRFkpIHsKLQkJKysgaWRsZV9jb3VudDsKLQkJLyogYWx3YXlzIGtpbGwgdGhlIGhpZ2hlc3QgbnVtYmVyZWQgY2hpbGQgaWYgd2UgaGF2ZSB0by4uLgotCQkgKiBubyByZWFsbHkgd2VsbCB0aG91Z2h0IG91dCByZWFzb24gLi4uIG90aGVyIHRoYW4gb2JzZXJ2aW5nCi0JCSAqIHRoZSBzZXJ2ZXIgYmVoYXZpb3VyIHVuZGVyIGxpbnV4IHdoZXJlIGxvd2VyIG51bWJlcmVkIGNoaWxkcmVuCi0JCSAqIHRlbmQgdG8gc2VydmljZSBtb3JlIGhpdHMgKGFuZCBoZW5jZSBhcmUgbW9yZSBsaWtlbHkgdG8gaGF2ZQotCQkgKiB0aGVpciBkYXRhIGluIGNwdSBjYWNoZXMpLgotCQkgKi8KLQkJdG9fa2lsbCA9IGk7Ci0JICAgIH0KLQotCSAgICArK3RvdGFsX25vbl9kZWFkOwotCSAgICBsYXN0X25vbl9kZWFkID0gaTsKLSNpZmRlZiBPUFRJTUlaRV9USU1FT1VUUwotCSAgICBpZiAoc3MtPnRpbWVvdXRfbGVuKSB7Ci0JCS8qIGlmIGl0J3MgYSBsaXZlIHNlcnZlciwgd2l0aCBhIGxpdmUgdGltZW91dCB0aGVuCi0JCSAqIHN0YXJ0IGNoZWNraW5nIGl0cyB0aW1lb3V0ICovCi0JCXBhcmVudF9zY29yZSAqcHMgPSAmYXBfc2NvcmVib2FyZF9pbWFnZS0+cGFyZW50W2ldOwotCQlpZiAoc3MtPmN1cl92dGltZSAhPSBwcy0+bGFzdF92dGltZSkgewotCQkgICAgLyogaXQgaGFzIG1hZGUgcHJvZ3Jlc3MsIHNvIHVwZGF0ZSBpdHMgbGFzdF9ydGltZSwKLQkJICAgICAqIGxhc3RfdnRpbWUgKi8KLQkJICAgIHBzLT5sYXN0X3J0aW1lID0gbm93OwotCQkgICAgcHMtPmxhc3RfdnRpbWUgPSBzcy0+Y3VyX3Z0aW1lOwotCQl9Ci0JCWVsc2UgaWYgKHBzLT5sYXN0X3J0aW1lICsgc3MtPnRpbWVvdXRfbGVuIDwgbm93KSB7Ci0JCSAgICAvKiBubyBwcm9ncmVzcywgYW5kIHRoZSB0aW1lb3V0IGxlbmd0aCBoYXMgYmVlbiBleGNlZWRlZCAqLwotCQkgICAgc3MtPnRpbWVvdXRfbGVuID0gMDsKLQkJICAgIGtpbGwocHMtPnBpZCwgU0lHQUxSTSk7Ci0JCX0KLQkgICAgfQotI2VuZGlmCi0JfQotICAgIH0KLSAgICBtYXhfZGFlbW9uc19saW1pdCA9IGxhc3Rfbm9uX2RlYWQgKyAxOwotICAgIGlmIChpZGxlX2NvdW50ID4gYXBfZGFlbW9uc19tYXhfZnJlZSkgewotCS8qIGtpbGwgb2ZmIG9uZSBjaGlsZC4uLiB3ZSB1c2UgU0lHVVNSMSBiZWNhdXNlIHRoYXQnbGwgY2F1c2UgaXQgdG8KLQkgKiBzaHV0IGRvd24gZ3JhY2VmdWxseSwgaW4gY2FzZSBpdCBoYXBwZW5lZCB0byBwaWNrIHVwIGEgcmVxdWVzdAotCSAqIHdoaWxlIHdlIHdlcmUgY291bnRpbmcKLQkgKi8KLQlraWxsKGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFt0b19raWxsXS5waWQsIFNJR1VTUjEpOwotCWlkbGVfc3Bhd25fcmF0ZSA9IDE7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlkbGVfY291bnQgPCBhcF9kYWVtb25zX21pbl9mcmVlKSB7Ci0JLyogdGVybWluYXRlIHRoZSBmcmVlIGxpc3QgKi8KLQlpZiAoZnJlZV9sZW5ndGggPT0gMCkgewotCSAgICAvKiBvbmx5IHJlcG9ydCB0aGlzIGNvbmRpdGlvbiBvbmNlICovCi0JICAgIHN0YXRpYyBpbnQgcmVwb3J0ZWQgPSAwOwotCi0JICAgIGlmICghcmVwb3J0ZWQpIHsKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCBzZXJ2ZXJfY29uZiwKLQkJCSAgICAic2VydmVyIHJlYWNoZWQgTWF4Q2xpZW50cyBzZXR0aW5nLCBjb25zaWRlciIKLQkJCSAgICAiIHJhaXNpbmcgdGhlIE1heENsaWVudHMgc2V0dGluZyIpOwotCQlyZXBvcnRlZCA9IDE7Ci0JICAgIH0KLQkgICAgaWRsZV9zcGF3bl9yYXRlID0gMTsKLQl9Ci0JZWxzZSB7Ci0JICAgIGlmIChpZGxlX3NwYXduX3JhdGUgPj0gOCkgewotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19JTkZPLCBzZXJ2ZXJfY29uZiwKLQkJICAgICJzZXJ2ZXIgc2VlbXMgYnVzeSwgKHlvdSBtYXkgbmVlZCAiCi0JCSAgICAidG8gaW5jcmVhc2UgU3RhcnRTZXJ2ZXJzLCBvciBNaW4vTWF4U3BhcmVTZXJ2ZXJzKSwgIgotCQkgICAgInNwYXduaW5nICVkIGNoaWxkcmVuLCB0aGVyZSBhcmUgJWQgaWRsZSwgYW5kICIKLQkJICAgICIlZCB0b3RhbCBjaGlsZHJlbiIsIGlkbGVfc3Bhd25fcmF0ZSwKLQkJICAgIGlkbGVfY291bnQsIHRvdGFsX25vbl9kZWFkKTsKLQkgICAgfQotCSAgICBmb3IgKGkgPSAwOyBpIDwgZnJlZV9sZW5ndGg7ICsraSkgewotI2lmZGVmIFRQRgotICAgICAgICBpZihtYWtlX2NoaWxkKHNlcnZlcl9jb25mLCBmcmVlX3Nsb3RzW2ldLCBub3cpID09IC0xKSB7Ci0gICAgICAgICAgICBpZihmcmVlX2xlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgc2h1dGRvd25fcGVuZGluZyA9IDE7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAiTm8gYWN0aXZlIGNoaWxkIHByb2Nlc3Nlczogc2h1dHRpbmcgZG93biIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZWxzZQotCQltYWtlX2NoaWxkKHNlcnZlcl9jb25mLCBmcmVlX3Nsb3RzW2ldLCBub3cpOwotI2VuZGlmIC8qIFRQRiAqLwotCSAgICB9Ci0JICAgIC8qIHRoZSBuZXh0IHRpbWUgYXJvdW5kIHdlIHdhbnQgdG8gc3Bhd24gdHdpY2UgYXMgbWFueSBpZiB0aGlzCi0JICAgICAqIHdhc24ndCBnb29kIGVub3VnaCwgYnV0IG5vdCBpZiB3ZSd2ZSBqdXN0IGRvbmUgYSBncmFjZWZ1bAotCSAgICAgKi8KLQkgICAgaWYgKGhvbGRfb2ZmX29uX2V4cG9uZW50aWFsX3NwYXduaW5nKSB7Ci0JCS0taG9sZF9vZmZfb25fZXhwb25lbnRpYWxfc3Bhd25pbmc7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoaWRsZV9zcGF3bl9yYXRlIDwgTUFYX1NQQVdOX1JBVEUpIHsKLQkJaWRsZV9zcGF3bl9yYXRlICo9IDI7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIGVsc2UgewotCWlkbGVfc3Bhd25fcmF0ZSA9IDE7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkIHByb2Nlc3NfY2hpbGRfc3RhdHVzKGludCBwaWQsIGFwX3dhaXRfdCBzdGF0dXMpCi17Ci0gICAgLyogQ2hpbGQgZGllZC4uLiBpZiBpdCBkaWVkIGR1ZSB0byBhIGZhdGFsIGVycm9yLAotCSogd2Ugc2hvdWxkIHNpbXBseSBiYWlsIG91dC4KLQkqLwotICAgIGlmICgoV0lGRVhJVEVEKHN0YXR1cykpICYmCi0JV0VYSVRTVEFUVVMoc3RhdHVzKSA9PSBBUEVYSVRfQ0hJTERGQVRBTCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVHxBUExPR19OT0VSUk5PLCBzZXJ2ZXJfY29uZiwKLQkJCSJDaGlsZCAlZCByZXR1cm5lZCBhIEZhdGFsIGVycm9yLi4uIFxuIgotCQkJIkFwYWNoZSBpcyBleGl0aW5nISIsCi0JCQlwaWQpOwotCWV4aXQoQVBFWElUX0NISUxERkFUQUwpOwotICAgIH0KLSAgICBpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkgewotCXN3aXRjaCAoV1RFUk1TSUcoc3RhdHVzKSkgewotCWNhc2UgU0lHVEVSTToKLQljYXNlIFNJR0hVUDoKLQljYXNlIFNJR1VTUjE6Ci0JY2FzZSBTSUdLSUxMOgotCSAgICBicmVhazsKLQlkZWZhdWx0OgotI2lmZGVmIFNZU19TSUdMSVNUCi0jaWZkZWYgV0NPUkVEVU1QCi0JICAgIGlmIChXQ09SRURVTVAoc3RhdHVzKSkgewotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19OT1RJQ0UsCi0JCQkgICAgIHNlcnZlcl9jb25mLAotCQkJICAgICAiY2hpbGQgcGlkICVkIGV4aXQgc2lnbmFsICVzICglZCksICIKLQkJCSAgICAgInBvc3NpYmxlIGNvcmVkdW1wIGluICVzIiwKLQkJCSAgICAgcGlkLCAoV1RFUk1TSUcoc3RhdHVzKSA+PSBOdW1TSUcpID8gIiIgOiAKLQkJCSAgICAgU1lTX1NJR0xJU1RbV1RFUk1TSUcoc3RhdHVzKV0sIFdURVJNU0lHKHN0YXR1cyksCi0JCQkgICAgIGFwX2NvcmVkdW1wX2Rpcik7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0jZW5kaWYKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLAotCQkJICAgICBzZXJ2ZXJfY29uZiwKLQkJCSAgICAgImNoaWxkIHBpZCAlZCBleGl0IHNpZ25hbCAlcyAoJWQpIiwgcGlkLAotCQkJICAgICBTWVNfU0lHTElTVFtXVEVSTVNJRyhzdGF0dXMpXSwgV1RFUk1TSUcoc3RhdHVzKSk7Ci0jaWZkZWYgV0NPUkVEVU1QCi0JICAgIH0KLSNlbmRpZgotI2Vsc2UKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLAotCQkJIHNlcnZlcl9jb25mLAotCQkJICJjaGlsZCBwaWQgJWQgZXhpdCBzaWduYWwgJWQiLAotCQkJIHBpZCwgV1RFUk1TSUcoc3RhdHVzKSk7Ci0jZW5kaWYKLQl9Ci0gICAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRXhlY3V0aXZlIHJvdXRpbmVzLgotICovCi0KLSNpZm5kZWYgU1RBTkRBTE9ORV9NQUlOCi0jZGVmaW5lIFNUQU5EQUxPTkVfTUFJTiBzdGFuZGFsb25lX21haW4KLQotc3RhdGljIHZvaWQgc3RhbmRhbG9uZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBpbnQgcmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0OwotCi0jaWZkZWYgT1MyCi0gICAgcHJpbnRmKCIlcyBcbiIsIGFwX2dldF9zZXJ2ZXJfdmVyc2lvbigpKTsKLSNlbmRpZgotCi0gICAgYXBfc3RhbmRhbG9uZSA9IDE7Ci0KLSAgICBpc19ncmFjZWZ1bCA9IDA7Ci0KLSAgICBpZiAoIW9uZV9wcm9jZXNzKSB7Ci0JZGV0YWNoKCk7Ci0gICAgfQotICAgIGVsc2UgewotCU1PTkNPTlRST0woMSk7Ci0gICAgfQotCi0gICAgbXlfcGlkID0gZ2V0cGlkKCk7Ci0KLSAgICBkbyB7Ci0JY29weV9saXN0ZW5lcnMocGNvbmYpOwotCWlmICghaXNfZ3JhY2VmdWwpIHsKLQkgICAgYXBfcmVzdGFydF90aW1lID0gdGltZShOVUxMKTsKLQl9Ci0jaWZkZWYgU0NPUkVCT0FSRF9GSUxFCi0JZWxzZSBpZiAoc2NvcmVib2FyZF9mZCAhPSAtMSkgewotCSAgICBhcF9raWxsX2NsZWFudXAocGNvbmYsIE5VTEwsIGNsZWFudXBfc2NvcmVib2FyZF9maWxlKTsKLQkgICAgYXBfa2lsbF9jbGVhbnVwc19mb3JfZmQocGNvbmYsIHNjb3JlYm9hcmRfZmQpOwotCX0KLSNlbmRpZgotCWFwX2NsZWFyX3Bvb2wocGNvbmYpOwotCXB0cmFucyA9IGFwX21ha2Vfc3ViX3Bvb2wocGNvbmYpOwotCi0Jc2VydmVyX2NvbmYgPSBhcF9yZWFkX2NvbmZpZyhwY29uZiwgcHRyYW5zLCBhcF9zZXJ2ZXJfY29uZm5hbWUpOwotCXNldHVwX2xpc3RlbmVycyhwY29uZik7Ci0JYXBfY2xlYXJfcG9vbChwbG9nKTsKLQlhcF9vcGVuX2xvZ3Moc2VydmVyX2NvbmYsIHBsb2cpOwotCWFwX2xvZ19waWQocGNvbmYsIGFwX3BpZF9mbmFtZSk7Ci0JYXBfc2V0X3ZlcnNpb24oKTsJLyogY3JlYXRlIG91ciBzZXJ2ZXJfdmVyc2lvbiBzdHJpbmcgKi8KLQlhcF9pbml0X21vZHVsZXMocGNvbmYsIHNlcnZlcl9jb25mKTsKLQl2ZXJzaW9uX2xvY2tlZCsrOwkvKiBubyBtb3JlIGNoYW5nZXMgdG8gc2VydmVyX3ZlcnNpb24gKi8KLQlTQUZFX0FDQ0VQVChhY2NlcHRfbXV0ZXhfaW5pdChwY29uZikpOwotCWlmICghaXNfZ3JhY2VmdWwpIHsKLQkgICAgcmVpbml0X3Njb3JlYm9hcmQocGNvbmYpOwotCX0KLSNpZmRlZiBTQ09SRUJPQVJEX0ZJTEUKLQllbHNlIHsKLQkgICAgYXBfc2NvcmVib2FyZF9mbmFtZSA9IGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHBjb25mLCBhcF9zY29yZWJvYXJkX2ZuYW1lKTsKLQkgICAgYXBfbm90ZV9jbGVhbnVwc19mb3JfZmQocGNvbmYsIHNjb3JlYm9hcmRfZmQpOwotCX0KLSNlbmRpZgotCi0Jc2V0X3NpZ25hbHMoKTsKLQotCWlmIChhcF9kYWVtb25zX21heF9mcmVlIDwgYXBfZGFlbW9uc19taW5fZnJlZSArIDEpCS8qIERvbid0IHRocmFzaC4uLiAqLwotCSAgICBhcF9kYWVtb25zX21heF9mcmVlID0gYXBfZGFlbW9uc19taW5fZnJlZSArIDE7Ci0KLQkvKiBJZiB3ZSdyZSBkb2luZyBhIGdyYWNlZnVsX3Jlc3RhcnQgdGhlbiB3ZSdyZSBnb2luZyB0byBzZWUgYSBsb3QKLQkgKiBvZiBjaGlsZHJlbiBleGl0aW5nIGltbWVkaWF0ZWx5IHdoZW4gd2UgZ2V0IGludG8gdGhlIG1haW4gbG9vcAotCSAqIGJlbG93IChiZWNhdXNlIHdlIGp1c3Qgc2VudCB0aGVtIFNJR1VTUjEpLiAgVGhpcyBoYXBwZW5zIHByZXR0eQotCSAqIHJhcGlkbHkuLi4gYW5kIGZvciBlYWNoIG9uZSB0aGF0IGV4aXRzIHdlJ2xsIHN0YXJ0IGEgbmV3IG9uZSB1bnRpbAotCSAqIHdlIHJlYWNoIGF0IGxlYXN0IGRhZW1vbnNfbWluX2ZyZWUuICBCdXQgd2UgbWF5IGJlIHBlcm1pdHRlZCB0bwotCSAqIHN0YXJ0IG1vcmUgdGhhbiB0aGF0LCBzbyB3ZSdsbCBqdXN0IGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgd2UncmUKLQkgKiBzdXBwb3NlZCB0byBzdGFydCB1cCB3aXRob3V0IHRoZSAxIHNlY29uZCBwZW5hbHR5IGJldHdlZW4gZWFjaCBmb3JrLgotCSAqLwotCXJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydCA9IGFwX2RhZW1vbnNfdG9fc3RhcnQ7Ci0JaWYgKHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydCA+IGFwX2RhZW1vbnNfbGltaXQpIHsKLQkgICAgcmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0ID0gYXBfZGFlbW9uc19saW1pdDsKLQl9Ci0JaWYgKCFpc19ncmFjZWZ1bCkgewotCSAgICBzdGFydHVwX2NoaWxkcmVuKHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydCk7Ci0JICAgIHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydCA9IDA7Ci0JfQotCWVsc2UgewotCSAgICAvKiBnaXZlIHRoZSBzeXN0ZW0gc29tZSB0aW1lIHRvIHJlY292ZXIgYmVmb3JlIGtpY2tpbmcgaW50bwotCSAgICAgKiBleHBvbmVudGlhbCBtb2RlICovCi0JICAgIGhvbGRfb2ZmX29uX2V4cG9uZW50aWFsX3NwYXduaW5nID0gMTA7Ci0JfQotCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCBzZXJ2ZXJfY29uZiwKLQkJICAgICIlcyBjb25maWd1cmVkIC0tIHJlc3VtaW5nIG5vcm1hbCBvcGVyYXRpb25zIiwKLQkJICAgIGFwX2dldF9zZXJ2ZXJfdmVyc2lvbigpKTsKLQlpZiAoYXBfc3VleGVjX2VuYWJsZWQpIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCBzZXJ2ZXJfY29uZiwKLQkJICAgICAgICAgInN1RVhFQyBtZWNoYW5pc20gZW5hYmxlZCAod3JhcHBlcjogJXMpIiwgU1VFWEVDX0JJTik7Ci0JfQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0lORk8sIHNlcnZlcl9jb25mLAotCQkgICAgIlNlcnZlciBidWlsdDogJXMiLCBhcF9nZXRfc2VydmVyX2J1aWx0KCkpOwotCXJlc3RhcnRfcGVuZGluZyA9IHNodXRkb3duX3BlbmRpbmcgPSAwOwotCi0Jd2hpbGUgKCFyZXN0YXJ0X3BlbmRpbmcgJiYgIXNodXRkb3duX3BlbmRpbmcpIHsKLQkgICAgaW50IGNoaWxkX3Nsb3Q7Ci0JICAgIGFwX3dhaXRfdCBzdGF0dXM7Ci0JICAgIGludCBwaWQgPSB3YWl0X29yX3RpbWVvdXQoJnN0YXR1cyk7Ci0KLQkgICAgLyogWFhYOiBpZiBpdCB0YWtlcyBsb25nZXIgdGhhbiAxIHNlY29uZCBmb3IgYWxsIG91ciBjaGlsZHJlbgotCSAgICAgKiB0byBzdGFydCB1cCBhbmQgZ2V0IGludG8gSURMRSBzdGF0ZSB0aGVuIHdlIG1heSBzcGF3biBhbgotCSAgICAgKiBleHRyYSBjaGlsZAotCSAgICAgKi8KLQkgICAgaWYgKHBpZCA+PSAwKSB7Ci0JCXByb2Nlc3NfY2hpbGRfc3RhdHVzKHBpZCwgc3RhdHVzKTsKLQkJLyogbm9uLWZhdGFsIGRlYXRoLi4uIG5vdGUgdGhhdCBpdCdzIGdvbmUgaW4gdGhlIHNjb3JlYm9hcmQuICovCi0JCWFwX3N5bmNfc2NvcmVib2FyZF9pbWFnZSgpOwotCQljaGlsZF9zbG90ID0gZmluZF9jaGlsZF9ieV9waWQocGlkKTsKLQkJRXhwbGFpbjIoIlJlYXBpbmcgY2hpbGQgJWQgc2xvdCAlZCIsIHBpZCwgY2hpbGRfc2xvdCk7Ci0JCWlmIChjaGlsZF9zbG90ID49IDApIHsKLQkJICAgICh2b2lkKSBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKGNoaWxkX3Nsb3QsIFNFUlZFUl9ERUFELAotCQkJCQkgICAgICAgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotCQkgICAgaWYgKHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydAotCQkJJiYgY2hpbGRfc2xvdCA8IGFwX2RhZW1vbnNfbGltaXQpIHsKLQkJCS8qIHdlJ3JlIHN0aWxsIGRvaW5nIGEgMS1mb3ItMSByZXBsYWNlbWVudCBvZiBkZWFkCi0JCQkgKiBjaGlsZHJlbiB3aXRoIG5ldyBjaGlsZHJlbgotCQkJICovCi0JCQltYWtlX2NoaWxkKHNlcnZlcl9jb25mLCBjaGlsZF9zbG90LCB0aW1lKDApKTsKLQkJCS0tcmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0OwotCQkgICAgfQotI2lmbmRlZiBOT19PVEhFUl9DSElMRAotCQl9Ci0JCWVsc2UgaWYgKHJlYXBfb3RoZXJfY2hpbGQocGlkLCBzdGF0dXMpID09IDApIHsKLQkJICAgIC8qIGhhbmRsZWQgKi8KLSNlbmRpZgotCQl9Ci0JCWVsc2UgaWYgKGlzX2dyYWNlZnVsKSB7Ci0JCSAgICAvKiBHcmVhdCwgd2UndmUgcHJvYmFibHkganVzdCBsb3N0IGEgc2xvdCBpbiB0aGUKLQkJICAgICAqIHNjb3JlYm9hcmQuICBTb21laG93IHdlIGRvbid0IGtub3cgYWJvdXQgdGhpcwotCQkgICAgICogY2hpbGQuCi0JCSAgICAgKi8KLQkJICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX1dBUk5JTkcsIHNlcnZlcl9jb25mLAotCQkJCSJsb25nIGxvc3QgY2hpbGQgY2FtZSBob21lISAocGlkICVkKSIsIHBpZCk7Ci0JCX0KLQkJLyogRG9uJ3QgcGVyZm9ybSBpZGxlIG1haW50ZW5hbmNlIHdoZW4gYSBjaGlsZCBkaWVzLAotCQkgKiBvbmx5IGRvIGl0IHdoZW4gdGhlcmUncyBhIHRpbWVvdXQuICBSZW1lbWJlciBvbmx5IGEKLQkJICogZmluaXRlIG51bWJlciBvZiBjaGlsZHJlbiBjYW4gZGllLCBhbmQgaXQncyBwcmV0dHkKLQkJICogcGF0aG9sb2dpY2FsIGZvciBhIGxvdCB0byBkaWUgc3VkZGVubHkuCi0JCSAqLwotCQljb250aW51ZTsKLQkgICAgfQotCSAgICBlbHNlIGlmIChyZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQpIHsKLQkJLyogd2UgaGl0IGEgMSBzZWNvbmQgdGltZW91dCBpbiB3aGljaCBub25lIG9mIHRoZSBwcmV2aW91cwotCQkgKiBnZW5lcmF0aW9uIG9mIGNoaWxkcmVuIG5lZWRlZCB0byBiZSByZWFwZWQuLi4gc28gYXNzdW1lCi0JCSAqIHRoZXkncmUgYWxsIGRvbmUsIGFuZCBwaWNrIHVwIHRoZSBzbGFjayBpZiBhbnkgaXMgbGVmdC4KLQkJICovCi0JCXN0YXJ0dXBfY2hpbGRyZW4ocmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0KTsKLQkJcmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0ID0gMDsKLQkJLyogSW4gYW55IGV2ZW50IHdlIHJlYWxseSBzaG91bGRuJ3QgZG8gdGhlIGNvZGUgYmVsb3cgYmVjYXVzZQotCQkgKiBmZXcgb2YgdGhlIHNlcnZlcnMgd2UganVzdCBzdGFydGVkIGFyZSBpbiB0aGUgSURMRSBzdGF0ZQotCQkgKiB5ZXQsIHNvIHdlJ2QgbWlzdGFrZW5seSBjcmVhdGUgYW4gZXh0cmEgc2VydmVyLgotCQkgKi8KLQkJY29udGludWU7Ci0JICAgIH0KLQotCSAgICBwZXJmb3JtX2lkbGVfc2VydmVyX21haW50ZW5hbmNlKCk7Ci0jaWZkZWYgVFBGCi0gICAgICAgIHNodXRkb3duX3BlbmRpbmcgPSBvc19jaGVja19zZXJ2ZXIodHBmX3NlcnZlcl9uYW1lKTsKLSAgICAgICAgYXBfY2hlY2tfc2lnbmFscygpOwotICAgICAgICBzbGVlcCgxKTsKLSNlbmRpZiAvKlRQRiAqLwotCX0KLQotCWlmIChzaHV0ZG93bl9wZW5kaW5nKSB7Ci0JICAgIC8qIFRpbWUgdG8gZ3JhY2VmdWxseSBzaHV0IGRvd246Ci0JICAgICAqIEtpbGwgY2hpbGQgcHJvY2Vzc2VzLCB0ZWxsIHRoZW0gdG8gY2FsbCBjaGlsZF9leGl0LCBldGMuLi4KLQkgICAgICovCi0JICAgIGlmIChhcF9raWxscGcocGdycCwgU0lHVEVSTSkgPCAwKSB7Ci0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBzZXJ2ZXJfY29uZiwgImtpbGxwZyBTSUdURVJNIik7Ci0JICAgIH0KLQkgICAgcmVjbGFpbV9jaGlsZF9wcm9jZXNzZXMoMSk7CQkvKiBTdGFydCB3aXRoIFNJR1RFUk0gKi8KLQotCSAgICAvKiBjbGVhbnVwIHBpZCBmaWxlIG9uIG5vcm1hbCBzaHV0ZG93biAqLwotCSAgICB7Ci0JCWNvbnN0IGNoYXIgKnBpZGZpbGUgPSBOVUxMOwotCQlwaWRmaWxlID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUgKHBjb25mLCBhcF9waWRfZm5hbWUpOwotCQlpZiAoIHBpZGZpbGUgIT0gTlVMTCAmJiB1bmxpbmsocGlkZmlsZSkgPT0gMCkKLQkJICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0lORk8sCi0JCQkJIHNlcnZlcl9jb25mLAotCQkJCSAicmVtb3ZlZCBQSUQgZmlsZSAlcyAocGlkPSVsZCkiLAotCQkJCSBwaWRmaWxlLCAobG9uZylnZXRwaWQoKSk7Ci0JICAgIH0KLQotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19OT1RJQ0UsIHNlcnZlcl9jb25mLAotCQkJImNhdWdodCBTSUdURVJNLCBzaHV0dGluZyBkb3duIik7Ci0JICAgIGNsZWFuX3BhcmVudF9leGl0KDApOwotCX0KLQotCS8qIHdlJ3ZlIGJlZW4gdG9sZCB0byByZXN0YXJ0ICovCi0Jc2lnbmFsKFNJR0hVUCwgU0lHX0lHTik7Ci0Jc2lnbmFsKFNJR1VTUjEsIFNJR19JR04pOwotCi0JaWYgKG9uZV9wcm9jZXNzKSB7Ci0JICAgIC8qIG5vdCB3b3J0aCB0aGlua2luZyBhYm91dCAqLwotCSAgICBjbGVhbl9wYXJlbnRfZXhpdCgwKTsKLQl9Ci0KLQkvKiBhZHZhbmNlIHRvIHRoZSBuZXh0IGdlbmVyYXRpb24gKi8KLQkvKiBYWFg6IHdlIHJlYWxseSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIG5ldyBnZW5lcmF0aW9uIG51bWJlciBpc24ndCBpbgotCSAqIHVzZSBieSBhbnkgb2YgdGhlIGNoaWxkcmVuLgotCSAqLwotCSsrYXBfbXlfZ2VuZXJhdGlvbjsKLQlhcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwucnVubmluZ19nZW5lcmF0aW9uID0gYXBfbXlfZ2VuZXJhdGlvbjsKLQl1cGRhdGVfc2NvcmVib2FyZF9nbG9iYWwoKTsKLQotCWlmIChpc19ncmFjZWZ1bCkgewotI2lmbmRlZiBTQ09SRUJPQVJEX0ZJTEUKLQkgICAgaW50IGk7Ci0jZW5kaWYKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCBzZXJ2ZXJfY29uZiwKLQkJCSJTSUdVU1IxIHJlY2VpdmVkLiAgRG9pbmcgZ3JhY2VmdWwgcmVzdGFydCIpOwotCi0JICAgIC8qIGtpbGwgb2ZmIHRoZSBpZGxlIG9uZXMgKi8KLQkgICAgaWYgKGFwX2tpbGxwZyhwZ3JwLCBTSUdVU1IxKSA8IDApIHsKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIHNlcnZlcl9jb25mLCAia2lsbHBnIFNJR1VTUjEiKTsKLQkgICAgfQotI2lmbmRlZiBTQ09SRUJPQVJEX0ZJTEUKLQkgICAgLyogVGhpcyBpcyBtb3N0bHkgZm9yIGRlYnVnZ2luZy4uLiBzbyB0aGF0IHdlIGtub3cgd2hhdCBpcyBzdGlsbAotCSAgICAgKiBncmFjZWZ1bGx5IGRlYWxpbmcgd2l0aCBleGlzdGluZyByZXF1ZXN0LiAgQnV0IHdlIGNhbid0IHJlYWxseQotCSAgICAgKiBkbyBpdCBpZiB3ZSdyZSBpbiBhIFNDT1JFQk9BUkRfRklMRSBiZWNhdXNlIGl0J2xsIGNhdXNlCi0JICAgICAqIGNvcnJ1cHRpb24gdG9vIGVhc2lseS4KLQkgICAgICovCi0JICAgIGFwX3N5bmNfc2NvcmVib2FyZF9pbWFnZSgpOwotCSAgICBmb3IgKGkgPSAwOyBpIDwgYXBfZGFlbW9uc19saW1pdDsgKytpKSB7Ci0JCWlmIChhcF9zY29yZWJvYXJkX2ltYWdlLT5zZXJ2ZXJzW2ldLnN0YXR1cyAhPSBTRVJWRVJfREVBRCkgewotCQkgICAgYXBfc2NvcmVib2FyZF9pbWFnZS0+c2VydmVyc1tpXS5zdGF0dXMgPSBTRVJWRVJfR1JBQ0VGVUw7Ci0JCX0KLQkgICAgfQotI2VuZGlmCi0JfQotCWVsc2UgewotCSAgICAvKiBLaWxsICdlbSBvZmYgKi8KLQkgICAgaWYgKGFwX2tpbGxwZyhwZ3JwLCBTSUdIVVApIDwgMCkgewotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgc2VydmVyX2NvbmYsICJraWxscGcgU0lHSFVQIik7Ci0JICAgIH0KLQkgICAgcmVjbGFpbV9jaGlsZF9wcm9jZXNzZXMoMCk7CQkvKiBOb3Qgd2hlbiBqdXN0IHN0YXJ0aW5nIHVwICovCi0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwgc2VydmVyX2NvbmYsCi0JCQkiU0lHSFVQIHJlY2VpdmVkLiAgQXR0ZW1wdGluZyB0byByZXN0YXJ0Iik7Ci0JfQotICAgIH0gd2hpbGUgKHJlc3RhcnRfcGVuZGluZyk7Ci0KLSAgICAvKmFkZF9jb21tb25fdmFycyhOVUxMKTsqLwotfQkJCQkvKiBzdGFuZGFsb25lX21haW4gKi8KLSNlbHNlCi0vKiBwcm90b3R5cGUgKi8KLXZvaWQgU1RBTkRBTE9ORV9NQUlOKGludCBhcmdjLCBjaGFyICoqYXJndik7Ci0jZW5kaWYgLyogU1RBTkRBTE9ORV9NQUlOICovCi0KLWV4dGVybiBjaGFyICpvcHRhcmc7Ci1leHRlcm4gaW50IG9wdGluZDsKLQotaW50IFJFQUxNQUlOKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gICAgaW50IGM7Ci0gICAgaW50IHNvY2tfaW47Ci0gICAgaW50IHNvY2tfb3V0OwotICAgIGNoYXIgKnM7Ci0gICAgCi0jaWZkZWYgU2VjdXJlV2FyZQotICAgIGlmIChzZXRfYXV0aF9wYXJhbWV0ZXJzKGFyZ2MsIGFyZ3YpIDwgMCkKLQlwZXJyb3IoInNldF9hdXRoX3BhcmFtZXRlcnMiKTsKLSAgICBpZiAoZ2V0bHVpZCgpIDwgMCkKLQlpZiAoc2V0bHVpZChnZXR1aWQoKSkgPCAwKQotCSAgICBwZXJyb3IoInNldGx1aWQiKTsKLSAgICBpZiAoc2V0cmV1aWQoMCwgMCkgPCAwKQotCXBlcnJvcigic2V0cmV1aWQiKTsKLSNlbmRpZgotCi0jaWZkZWYgU09DS1MKLSAgICBTT0NLU2luaXQoYXJndlswXSk7Ci0jZW5kaWYKLQotI2lmZGVmIFRQRgotICAgIEFQQUNIRV9UUEZfSU5QVVQgaW5wdXRfcGFybXM7Ci0gICAgZWNicHRyKCktPmVicm91dCA9IFBSSU1FQ1JBUzsKLSAgICBpbnB1dF9wYXJtcyA9ICogKEFQQUNIRV9UUEZfSU5QVVQgKikoJihlY2JwdHIoKS0+ZWJ3MDAwKSk7Ci0jZW5kaWYKLQotICAgIE1PTkNPTlRST0woMCk7Ci0KLSAgICBjb21tb25faW5pdCgpOwotICAgIAotICAgIGlmICgocyA9IHN0cnJjaHIoYXJndlswXSwgUEFUSFNFUEFSQVRPUikpICE9IE5VTEwpIHsKLQlhcF9zZXJ2ZXJfYXJndjAgPSArK3M7Ci0gICAgfQotICAgIGVsc2UgewotCWFwX3NlcnZlcl9hcmd2MCA9IGFyZ3ZbMF07Ci0gICAgfQotICAgIAotICAgIGFwX2NweXN0cm4oYXBfc2VydmVyX3Jvb3QsIEhUVFBEX1JPT1QsIHNpemVvZihhcF9zZXJ2ZXJfcm9vdCkpOwotICAgIGFwX2NweXN0cm4oYXBfc2VydmVyX2NvbmZuYW1lLCBTRVJWRVJfQ09ORklHX0ZJTEUsIHNpemVvZihhcF9zZXJ2ZXJfY29uZm5hbWUpKTsKLQotICAgIGFwX3NldHVwX3ByZWxpbmtlZF9tb2R1bGVzKCk7Ci0KLSAgICB3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwKLQkJCQkgICAgIkQ6QzpjOnhYZDpmOnZWbExSOlN0VGgiCi0jaWZkZWYgREVCVUdfU0lHU1RPUAotCQkJCSAgICAiWjoiCi0jZW5kaWYKLQkJCSkpICE9IC0xKSB7Ci0JY2hhciAqKm5ldzsKLQlzd2l0Y2ggKGMpIHsKLQljYXNlICdjJzoKLQkgICAgbmV3ID0gKGNoYXIgKiopYXBfcHVzaF9hcnJheShhcF9zZXJ2ZXJfcG9zdF9yZWFkX2NvbmZpZyk7Ci0JICAgICpuZXcgPSBhcF9wc3RyZHVwKHBjb21tYW5kcywgb3B0YXJnKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnQyc6Ci0JICAgIG5ldyA9IChjaGFyICoqKWFwX3B1c2hfYXJyYXkoYXBfc2VydmVyX3ByZV9yZWFkX2NvbmZpZyk7Ci0JICAgICpuZXcgPSBhcF9wc3RyZHVwKHBjb21tYW5kcywgb3B0YXJnKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnRCc6Ci0JICAgIG5ldyA9IChjaGFyICoqKWFwX3B1c2hfYXJyYXkoYXBfc2VydmVyX2NvbmZpZ19kZWZpbmVzKTsKLQkgICAgKm5ldyA9IGFwX3BzdHJkdXAocGNvbW1hbmRzLCBvcHRhcmcpOwotCSAgICBicmVhazsKLQljYXNlICdkJzoKLQkgICAgYXBfY3B5c3RybihhcF9zZXJ2ZXJfcm9vdCwgb3B0YXJnLCBzaXplb2YoYXBfc2VydmVyX3Jvb3QpKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnZic6Ci0JICAgIGFwX2NweXN0cm4oYXBfc2VydmVyX2NvbmZuYW1lLCBvcHRhcmcsIHNpemVvZihhcF9zZXJ2ZXJfY29uZm5hbWUpKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAndic6Ci0JICAgIGFwX3NldF92ZXJzaW9uKCk7Ci0JICAgIHByaW50ZigiU2VydmVyIHZlcnNpb246ICVzXG4iLCBhcF9nZXRfc2VydmVyX3ZlcnNpb24oKSk7Ci0JICAgIHByaW50ZigiU2VydmVyIGJ1aWx0OiAgICVzXG4iLCBhcF9nZXRfc2VydmVyX2J1aWx0KCkpOwotCSAgICBleGl0KDApOwotCWNhc2UgJ1YnOgotCSAgICBhcF9zZXRfdmVyc2lvbigpOwotCSAgICBzaG93X2NvbXBpbGVfc2V0dGluZ3MoKTsKLQkgICAgZXhpdCgwKTsKLQljYXNlICdsJzoKLQkgICAgYXBfc2hvd19tb2R1bGVzKCk7Ci0JICAgIGV4aXQoMCk7Ci0JY2FzZSAnTCc6Ci0JICAgIGFwX3Nob3dfZGlyZWN0aXZlcygpOwotCSAgICBleGl0KDApOwotCWNhc2UgJ1gnOgotCSAgICArK29uZV9wcm9jZXNzOwkvKiBXZWlyZCBkZWJ1Z2dpbmcgbW9kZS4gKi8KLQkgICAgYnJlYWs7Ci0jaWZkZWYgVFBGCi0JY2FzZSAneCc6Ci0JICAgIG9zX3RwZl9jaGlsZCgmaW5wdXRfcGFybXMpOwotCSAgICBzZXRfc2lnbmFscygpOwotCSAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIERFQlVHX1NJR1NUT1AKLQljYXNlICdaJzoKLQkgICAgcmFpc2Vfc2lnc3RvcF9mbGFncyA9IGF0b2kob3B0YXJnKTsKLQkgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBTSEFSRURfQ09SRQotCWNhc2UgJ1InOgotCSAgICAvKiBqdXN0IGlnbm9yZSB0aGlzIG9wdGlvbiBoZXJlLCBiZWNhdXNlIGl0IGhhcyBvbmx5Ci0JICAgICAqIGVmZmVjdCB3aGVuIFNIQVJFRF9DT1JFIGlzIHVzZWQgYW5kIHRoZW4gaXQgd2FzCi0JICAgICAqIGFscmVhZHkgaGFuZGxlZCBpbiB0aGUgU2hhcmVkIENvcmUgQm9vdHN0cmFwCi0JICAgICAqIHByb2dyYW0uCi0JICAgICAqLwotCSAgICBicmVhazsKLSNlbmRpZgotCWNhc2UgJ1MnOgotCSAgICBhcF9kdW1wX3NldHRpbmdzID0gMTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAndCc6Ci0JICAgIGFwX2NvbmZpZ3Rlc3Rvbmx5ID0gMTsKLQkgICAgYXBfZG9jcm9vdGNoZWNrID0gMTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnVCc6Ci0JICAgIGFwX2NvbmZpZ3Rlc3Rvbmx5ID0gMTsKLQkgICAgYXBfZG9jcm9vdGNoZWNrID0gMDsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnaCc6Ci0JICAgIHVzYWdlKGFyZ3ZbMF0pOwotCWNhc2UgJz8nOgotCSAgICB1c2FnZShhcmd2WzBdKTsKLQl9Ci0gICAgfQotCi0gICAgYXBfc3VleGVjX2VuYWJsZWQgPSBpbml0X3N1ZXhlYygpOwotICAgIHNlcnZlcl9jb25mID0gYXBfcmVhZF9jb25maWcocGNvbmYsIHB0cmFucywgYXBfc2VydmVyX2NvbmZuYW1lKTsKLQotICAgIGlmIChhcF9jb25maWd0ZXN0b25seSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlN5bnRheCBPS1xuIik7Ci0gICAgICAgIGV4aXQoMCk7Ci0gICAgfQotICAgIGlmIChhcF9kdW1wX3NldHRpbmdzKSB7Ci0gICAgICAgIGV4aXQoMCk7Ci0gICAgfQotCi0gICAgY2hpbGRfdGltZW91dHMgPSAhYXBfc3RhbmRhbG9uZSB8fCBvbmVfcHJvY2VzczsKLQotI2lmbmRlZiBUUEYKLSAgICBpZiAoYXBfc3RhbmRhbG9uZSkgewotCWFwX29wZW5fbG9ncyhzZXJ2ZXJfY29uZiwgcGxvZyk7Ci0JYXBfc2V0X3ZlcnNpb24oKTsKLQlhcF9pbml0X21vZHVsZXMocGNvbmYsIHNlcnZlcl9jb25mKTsKLQl2ZXJzaW9uX2xvY2tlZCsrOwotCVNUQU5EQUxPTkVfTUFJTihhcmdjLCBhcmd2KTsKLSAgICB9Ci0jZWxzZQotICAgIGlmIChhcF9zdGFuZGFsb25lKSB7Ci0gICAgICAgIGlmKCF0cGZfY2hpbGQpIHsKLSAgICAgICAgICAgIG1lbWNweSh0cGZfc2VydmVyX25hbWUsIGlucHV0X3Bhcm1zLmluZXRkX3NlcnZlci5zZXJ2bmFtZSwgSU5FVERfU0VSVk5BTUVfTEVOR1RIKTsKLSAgICAgICAgICAgIHRwZl9zZXJ2ZXJfbmFtZVtJTkVURF9TRVJWTkFNRV9MRU5HVEgrMV0gPSAnXDAnOwotICAgICAgICAgICAgYXBfb3Blbl9sb2dzKHNlcnZlcl9jb25mLCBwY29uZik7Ci0gICAgICAgIH0KLSAgICAgICAgYXBfc2V0X3ZlcnNpb24oKTsKLSAgICAgICAgYXBfaW5pdF9tb2R1bGVzKHBjb25mLCBzZXJ2ZXJfY29uZik7Ci0gICAgICAgIHZlcnNpb25fbG9ja2VkKys7Ci0gICAgICAgIGlmKHRwZl9jaGlsZCkgewotICAgICAgICAgICAgY29weV9saXN0ZW5lcnMocGNvbmYpOwotICAgICAgICAgICAgcmVzZXRfdHBmX2xpc3RlbmVycygmaW5wdXRfcGFybXMpOwotICAgICAgICAgICAgc2VydmVyX2NvbmYtPmVycm9yX2xvZyA9IE5VTEw7Ci0jaWZkZWYgU0NPUkVCT0FSRF9GSUxFCi0gICAgICAgICAgICBzY29yZWJvYXJkX2ZkID0gaW5wdXRfcGFybXMuc2NvcmVib2FyZF9mZDsKLSAgICAgICAgICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UgPSAmX3Njb3JlYm9hcmRfaW1hZ2U7Ci0jZWxzZSAvKiBtdXN0IGJlIFVTRV9UUEZfU0NPUkVCT0FSRCBvciBVU0VfU0hNR0VUX1NDT1JFQk9BUkQgKi8KLSAgICAgICAgICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UgPSAoc2NvcmVib2FyZCAqKWlucHV0X3Bhcm1zLnNjb3JlYm9hcmRfaGVhcDsKLSNlbmRpZgotICAgICAgICAgICAgY2hpbGRfbWFpbihpbnB1dF9wYXJtcy5zbG90KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBTVEFOREFMT05FX01BSU4oYXJnYywgYXJndik7Ci0gICAgfQotI2VuZGlmCi0gICAgZWxzZSB7Ci0JY29ubl9yZWMgKmNvbm47Ci0JcmVxdWVzdF9yZWMgKnI7Ci0Jc3RydWN0IHNvY2thZGRyIHNhX3NlcnZlciwgc2FfY2xpZW50OwotCUJVRkYgKmNpbzsKLQlORVRfU0laRV9UIGw7Ci0KLQlhcF9zZXRfdmVyc2lvbigpOwotCS8qIFllcyB0aGlzIGlzIGNhbGxlZCB0d2ljZS4gKi8KLQlhcF9pbml0X21vZHVsZXMocGNvbmYsIHNlcnZlcl9jb25mKTsKLQl2ZXJzaW9uX2xvY2tlZCsrOwotCWFwX29wZW5fbG9ncyhzZXJ2ZXJfY29uZiwgcGxvZyk7Ci0JYXBfaW5pdF9tb2R1bGVzKHBjb25mLCBzZXJ2ZXJfY29uZik7Ci0Jc2V0X2dyb3VwX3ByaXZzKCk7Ci0KLSNpZmRlZiBNUEUKLQkvKiBPbmx5IHRyeSB0byBzd2l0Y2ggaWYgd2UncmUgcnVubmluZyBhcyBNQU5BR0VSLlNZUyAqLwotCWlmIChnZXRldWlkKCkgPT0gMSAmJiBhcF91c2VyX2lkID4gMSkgewotCSAgICBHRVRQUklWTU9ERSgpOwotCSAgICBpZiAoc2V0dWlkKGFwX3VzZXJfaWQpID09IC0xKSB7Ci0JCUdFVFVTRVJNT0RFKCk7Ci0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgc2VydmVyX2NvbmYsCi0JCQkgICAgInNldHVpZDogdW5hYmxlIHRvIGNoYW5nZSB0byB1aWQ6ICVkIiwgYXBfdXNlcl9pZCk7Ci0JCWV4aXQoMSk7Ci0JICAgIH0KLQkgICAgR0VUVVNFUk1PREUoKTsKLQl9Ci0jZWxzZQotCS8qIE9ubHkgdHJ5IHRvIHN3aXRjaCBpZiB3ZSdyZSBydW5uaW5nIGFzIHJvb3QgKi8KLQlpZiAoIWdldGV1aWQoKSAmJiBzZXR1aWQoYXBfdXNlcl9pZCkgPT0gLTEpIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0FMRVJULCBzZXJ2ZXJfY29uZiwKLQkJCSJzZXR1aWQ6IHVuYWJsZSB0byBjaGFuZ2UgdG8gdWlkOiAlbGQiLAotCQkJKGxvbmcpIGFwX3VzZXJfaWQpOwotCSAgICBleGl0KDEpOwotCX0KLSNlbmRpZgotCWlmIChhcF9zZXRqbXAoam1wYnVmZmVyKSkgewotCSAgICBleGl0KDApOwotCX0KLQotI2lmZGVmIFRQRgotLyogVFBGIG9ubHkgcGFzc2VzIHRoZSBpbmNvbWluZyBzb2NrZXQgbnVtYmVyIGZyb20gdGhlIGludGVybmV0IGRhZW1vbgotICAgaW4gZWJ3MDAwICovCi0gICAgc29ja19pbiA9ICogKGludCopKCYoZWNicHRyKCktPmVidzAwMCkpOwotICAgIHNvY2tfb3V0ID0gKiAoaW50KikoJihlY2JwdHIoKS0+ZWJ3MDAwKSk7Ci0vKiBUUEYgYWxzbyBuZWVkcyBhIHNpZ25hbCBzZXQgZm9yIGFsYXJtIGluIGluZXRkIG1vZGUgKi8KLSAgICBzaWduYWwoU0lHQUxSTSwgYWxybV9oYW5kbGVyKTsKLSNlbGlmIGRlZmluZWQoTVBFKQotLyogSFAgTVBFIDUuNSBpbmV0ZCBvbmx5IHBhc3NlcyB0aGUgaW5jb21pbmcgc29ja2V0IGFzIHN0ZGluIChmZCAwKSwgd2hlcmVhcwotICAgSFBVWCBpbmV0ZCBwYXNzZXMgdGhlIGluY29taW5nIHNvY2tldCBhcyBzdGRpbiAoZmQgMCkgYW5kIHN0ZG91dCAoZmQgMSkuCi0gICBHbyBmaWd1cmUuICBTUiA1MDAzMzU1MDE2IGhhcyBiZWVuIHN1Ym1pdHRlZCB0byByZXF1ZXN0IHRoYXQgdGhlIGV4aXN0aW5nCi0gICBmdW5jdGlvbmFsaXR5IGJlIGRvY3VtZW50ZWQsIGFuZCB0aGVuIHRvIGVuaGFuY2UgdGhlIGZ1bmN0aW9uYWxpdHkgdG8gYmUKLSAgIGxpa2UgSFBVWC4gKi8KLSAgICBzb2NrX2luID0gZmlsZW5vKHN0ZGluKTsKLSAgICBzb2NrX291dCA9IGZpbGVubyhzdGRpbik7Ci0jZWxzZQotICAgIHNvY2tfaW4gPSBmaWxlbm8oc3RkaW4pOwotICAgIHNvY2tfb3V0ID0gZmlsZW5vKHN0ZG91dCk7Ci0jZW5kaWYKLQotCWwgPSBzaXplb2Yoc2FfY2xpZW50KTsKLQlpZiAoKGdldHBlZXJuYW1lKHNvY2tfaW4sICZzYV9jbGllbnQsICZsKSkgPCAwKSB7Ci0vKiBnZXQgcGVlcm5hbWUgd2lsbCBmYWlsIGlmIHRoZSBpbnB1dCBpc24ndCBhIHNvY2tldCAqLwotCSAgICBwZXJyb3IoImdldHBlZXJuYW1lIik7Ci0JICAgIG1lbXNldCgmc2FfY2xpZW50LCAnXDAnLCBzaXplb2Yoc2FfY2xpZW50KSk7Ci0JfQotCi0JbCA9IHNpemVvZihzYV9zZXJ2ZXIpOwotCWlmIChnZXRzb2NrbmFtZShzb2NrX2luLCAmc2Ffc2VydmVyLCAmbCkgPCAwKSB7Ci0JICAgIHBlcnJvcigiZ2V0c29ja25hbWUiKTsKLQkgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBnZXR0aW5nIGxvY2FsIGFkZHJlc3NcbiIpOwotCSAgICBleGl0KDEpOwotCX0KLQlzZXJ2ZXJfY29uZi0+cG9ydCA9IG50b2hzKCgoc3RydWN0IHNvY2thZGRyX2luICopICZzYV9zZXJ2ZXIpLT5zaW5fcG9ydCk7Ci0JY2lvID0gYXBfYmNyZWF0ZShwdHJhbnMsIEJfUkRXUiB8IEJfU09DS0VUKTsKLSAgICAgICAgY2lvLT5mZCA9IHNvY2tfb3V0OwotICAgICAgICBjaW8tPmZkX2luID0gc29ja19pbjsKLQljb25uID0gbmV3X2Nvbm5lY3Rpb24ocHRyYW5zLCBzZXJ2ZXJfY29uZiwgY2lvLAotCQkJICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJnNhX2NsaWVudCwKLQkJCSAgICAgICAgICAoc3RydWN0IHNvY2thZGRyX2luICopICZzYV9zZXJ2ZXIsIC0xKTsKLQotCXdoaWxlICgociA9IGFwX3JlYWRfcmVxdWVzdChjb25uKSkgIT0gTlVMTCkgewotCi0JICAgIGlmIChyLT5zdGF0dXMgPT0gSFRUUF9PSykKLQkJYXBfcHJvY2Vzc19yZXF1ZXN0KHIpOwotCi0JICAgIGlmICghY29ubi0+a2VlcGFsaXZlIHx8IGNvbm4tPmFib3J0ZWQpCi0JCWJyZWFrOwotCi0JICAgIGFwX2Rlc3Ryb3lfcG9vbChyLT5wb29sKTsKLQl9Ci0KLQlhcF9iY2xvc2UoY2lvKTsKLSAgICB9Ci0gICAgZXhpdCgwKTsKLX0KLQotI2Vsc2UgLyogbmRlZiBNVUxUSVRIUkVBRCAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNdWx0aXRocmVhZGVkIGltcGxlbWVudGF0aW9uCi0gKgotICogVGhpcyBjb2RlIGlzIGZhaXJseSBzcGVjaWZpYyB0byBXaW4zMi4KLSAqCi0gKiBUaGUgbW9kZWwgdXNlZCB0byBoYW5kbGUgcmVxdWVzdHMgaXMgYSBzZXQgb2YgdGhyZWFkcy4gT25lICJtYWluIgotICogdGhyZWFkIGxpc3RlbnMgZm9yIG5ldyByZXF1ZXN0cy4gV2hlbiBzb21ldGhpbmcgYmVjb21lcwotICogYXZhaWxhYmxlLCBpdCBkb2VzIGEgc2VsZWN0IGFuZCBwbGFjZXMgdGhlIG5ld2x5IGF2YWlsYWJsZSBzb2NrZXQKLSAqIG9udG8gYSBsaXN0IG9mICJqb2JzIiAoYWRkX2pvYigpKS4gVGhlbiBhbnkgb25lIG9mIGEgZml4ZWQgbnVtYmVyCi0gKiBvZiAid29ya2VyIiB0aHJlYWRzIHRha2VzIHRoZSB0b3Agam9iIG9mZiB0aGUgam9iIGxpc3Qgd2l0aAotICogcmVtb3ZlX2pvYigpIGFuZCBoYW5kbGVzIHRoYXQgY29ubmVjdGlvbiB0byBjb21wbGV0aW9uLiBBZnRlcgotICogdGhlIGNvbm5lY3Rpb24gaGFzIGZpbmlzaGVkIHRoZSB0aHJlYWQgaXMgZnJlZSB0byB0YWtlIGFub3RoZXIKLSAqIGpvYiBmcm9tIHRoZSBqb2IgbGlzdC4KLSAqCi0gKiBJbiB0aGUgY29kZSwgdGhlICJtYWluIiB0aHJlYWQgaXMgcnVubmluZyB3aXRoaW4gdGhlIHdvcmtlcl9tYWluKCkKLSAqIGZ1bmN0aW9uLiBUaGUgZmlyc3QgdGhpbmcgdGhpcyBmdW5jdGlvbiBkb2VzIGlzIGNyZWF0ZSB0aGUKLSAqIHdvcmtlciB0aHJlYWRzLCB3aGljaCBvcGVyYXRlIGluIHRoZSBjaGlsZF9zdWJfbWFpbigpIGZ1bmN0aW9uLiBUaGUKLSAqIG1haW4gdGhyZWFkIHRoZW4gZ29lcyBpbnRvIGEgbG9vcCB3aXRoaW4gd29ya2VyX21haW4oKSB3aGVyZSB0aGV5Ci0gKiBkbyBhIHNlbGVjdCgpIG9uIHRoZSBsaXN0ZW5pbmcgc29ja2V0cy4gVGhlIHNlbGVjdCB0aW1lcyBvdXQgb25jZQotICogcGVyIHNlY29uZCBzbyB0aGF0IHRoZSB0aHJlYWQgY2FuIGNoZWNrIGZvciBhbiAiZXhpdCIgc2lnbmFsCi0gKiBmcm9tIHRoZSBwYXJlbnQgcHJvY2VzcyAoc2VlIGJlbG93KS4gSWYgdGhpcyBzaWduYWwgaXMgc2V0LCB0aGUgCi0gKiB0aHJlYWQgY2FuIGV4aXQsIGJ1dCBvbmx5IGFmdGVyIGl0IGhhcyBhY2NlcHRlZCBhbGwgaW5jb21pbmcKLSAqIGNvbm5lY3Rpb25zIGFscmVhZHkgaW4gdGhlIGxpc3RlbiBxdWV1ZSAoc2luY2UgV2luMzIgYXBwZWFycwotICogdG8gdGhyb3VnaCBhd2F5IGxpc3RlbmVkIGJ1dCB1bmFjY2VwdGVkIGNvbm5lY3Rpb25zIHdoZW4gYSAKLSAqIHByb2Nlc3MgZGllcykuCi0gKgotICogQmVjYXVzZSB0aGUgbWFpbiBhbmQgd29ya2VyIHRocmVhZHMgZXhpc3Qgd2l0aGluIGEgc2luZ2xlIHByb2Nlc3MKLSAqIHRoZXkgYXJlIHZ1bG5lcmFibGUgdG8gY3Jhc2hlcyBvciBtZW1vcnkgbGVha3MgKGNyYXNoZXMgY2FuIGFsc28KLSAqIGJlIGNhdXNlZCB3aXRoaW4gbW9kdWxlcywgb2YgY291cnNlKS4gVGhlcmUgYWxzbyBuZWVkcyB0byBiZSBhIAotICogbWVjaGFuaXNtIHRvIHBlcmZvcm0gcmVzdGFydHMgYW5kIHNodXRkb3ducy4gVGhpcyBpcyBkb25lIGJ5Ci0gKiBjcmVhdGluZyB0aGUgbWFpbiAmIHdvcmtlciB0aHJlYWRzIHdpdGhpbiBhIHN1YnByb2Nlc3MuIEEKLSAqIG1haW4gcHJvY2VzcyAodGhlICJwYXJlbnQgcHJvY2VzcyIpIGNyZWF0ZXMgb25lIChvciBtb3JlKSAKLSAqIHByb2Nlc3NlcyB0byBkbyB0aGUgd29yaywgdGhlbiB0aGUgcGFyZW50IHNpdHMgYXJvdW5kIHdhaXRpbmcKLSAqIGZvciB0aGUgd29ya2luZyBwcm9jZXNzIHRvIGRpZSwgaW4gd2hpY2ggY2FzZSBpdCBzdGFydHMgYSBuZXcKLSAqIG9uZS4gVGhlIHBhcmVudCBwcm9jZXNzIGFsc28gaGFuZGxlcyByZXN0YXJ0cyAoYnkgY3JlYXRpbmcKLSAqIGEgbmV3IHdvcmtpbmcgcHJvY2VzcyB0aGVuIHNpZ25hbGxpbmcgdGhlIHByZXZpb3VzIHdvcmtpbmcgcHJvY2VzcyAKLSAqIGV4aXQgKSBhbmQgc2h1dGRvd25zIChieSBzaWduYWxsaW5nIHRoZSB3b3JraW5nIHByb2Nlc3MgdG8gZXhpdCkuCi0gKiBUaGUgcGFyZW50IHByb2Nlc3Mgb3BlcmF0ZXMgd2l0aGluIHRoZSBtYXN0ZXJfbWFpbigpIGZ1bmN0aW9uLiBUaGlzCi0gKiBwcm9jZXNzIGFsc28gaGFuZGxlcyByZXF1ZXN0cyBmcm9tIHRoZSBzZXJ2aWNlIG1hbmFnZXIgKE5UIG9ubHkpLgotICoKLSAqIFNpZ25hbGxpbmcgYmV0d2VlbiB0aGUgcGFyZW50IGFuZCB3b3JraW5nIHByb2Nlc3MgdXNlcyBhIFdpbjMyCi0gKiBldmVudC4gRWFjaCBjaGlsZCBoYXMgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIGV2ZW50LCB3aGljaCBpcwotICogcGFzc2VkIHRvIGl0IHdpdGggdGhlIC1aIGFyZ3VtZW50IHdoZW4gdGhlIGNoaWxkIGlzIHNwYXduZWQuIFRoZQotICogcGFyZW50IHNldHMgKHNpZ25hbHMpIHRoaXMgZXZlbnQgdG8gdGVsbCB0aGUgY2hpbGQgdG8gZGllLgotICogQXQgcHJlc2VudCBhbGwgY2hpbGRyZW4gZG8gYSBncmFjZWZ1bCBkaWUgLSB0aGV5IGZpbmlzaCBhbGwKLSAqIGN1cnJlbnQgam9icyBfYW5kXyBlbXB0eSB0aGUgbGlzdGVuIHF1ZXVlIGJlZm9yZSB0aGV5IGV4aXQuCi0gKiBBIG5vbi1ncmFjZWZ1bCBkaWUgd291bGQgbmVlZCBhIHNlY29uZCBldmVudC4gVGhlIC1aIGFyZ3VtZW50IGluCi0gKiB0aGUgY2hpbGQgaXMgYWxzbyB1c2VkIHRvIGNyZWF0ZSB0aGUgc2h1dGRvd24gYW5kIHJlc3RhcnQgZXZlbnRzLAotICogc2luY2UgdGhlIHByZWZpeCAoYXBQSUQpIGNvbnRhaW5zIHRoZSBwYXJlbnQgcHJvY2VzcyBQSUQuCi0gKgotICogVGhlIGNvZGUgYmVsb3cgc3RhcnRzIHdpdGggZnVuY3Rpb25zIGF0IHRoZSBsb3dlc3QgbGV2ZWwgLQotICogd29ya2VyIHRocmVhZHMsIGFuZCB3b3JrcyB1cCB0byB0aGUgdG9wIGxldmVsIC0gdGhlIG1haW4oKQotICogZnVuY3Rpb24gb2YgdGhlIHBhcmVudCBwcm9jZXNzLgotICoKLSAqIFRoZSBzY29yZWJvYXJkIChpbiBwcm9jZXNzIG1lbW9yeSkgY29udGFpbnMgZGV0YWlscyBvZiB0aGUgd29ya2VyCi0gKiB0aHJlYWRzICh3aXRoaW4gdGhlIGFjdGl2ZSB3b3JraW5nIHByb2Nlc3MpLiBUaGVyZSBpcyBubyBzaGFyZWQKLSAqICJzY29yZWJvYXJkIiBiZXR3ZWVuIHByb2Nlc3Nlcywgc2luY2Ugb25seSBvbmUgaXMgZXZlciBhY3RpdmUKLSAqIGF0IG9uY2UgKG9yIGF0IG1vc3QsIHR3bywgd2hlbiBvbmUgaGFzIGJlZW4gdG9sZCB0byBzaHV0ZG93biBidXQKLSAqIGlzIHByb2Nlc3NlcyBvdXRzdGFuZGluZyByZXF1ZXN0cywgYW5kIGEgbmV3IG9uZSBoYXMgYmVlbiBzdGFydGVkKS4KLSAqIFRoaXMgaXMgY29udHJvbGxlZCBieSBhICJzdGFydF9tdXRleCIgd2hpY2ggZW5zdXJlcyBvbmx5IG9uZSB3b3JraW5nCi0gKiBwcm9jZXNzIGlzIGFjdGl2ZSBhdCBvbmNlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBjb2RlIHByb3RlY3RlZCBieSAjaWZkZWYgVU5HUkFDRUZVTF9SRVNUQVJUUy8jZW5kaWYgc2VjdGlvbnMKLSAqIGNvdWxkIGltcGxlbWVudCBhIHNvcnQtb2YgdW5ncmFjZWZ1bCByZXN0YXJ0IGZvciBXaW4zMi4gaW5zdGVhZCBvZgotICogZ3JhY2VmdWwgcmVzdGFydHMuIAotICoKLSAqIEhvd2V2ZXIgaXQgZG9lcyBub3Qgd29yayB0b28gd2VsbCBiZWNhdXNlIGl0IGRvZXMgbm90IGludGVyY2VwdCBhCi0gKiBjb25uZWN0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MgKGluIGNoaWxkX3N1Yl9tYWluKCkpLiBXZSdkIGhhdmUgdG8KLSAqIGdldCB0aGF0IHRvIHBvbGwgb24gdGhlIGV4aXQgZXZlbnQuIAotICovCi0KLS8qCi0gKiBEZWZpbml0aW9uIG9mIGpvYnMsIHNoYXJlZCBieSBtYWluIGFuZCB3b3JrZXIgdGhyZWFkcy4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCBqb2JsaXN0X3MgewotICAgIHN0cnVjdCBqb2JsaXN0X3MgKm5leHQ7Ci0gICAgaW50IHNvY2s7Ci19IGpvYmxpc3Q7Ci0KLS8qCi0gKiBHbG9iYWxzIGNvbW1vbiB0byBtYWluIGFuZCB3b3JrZXIgdGhyZWFkcy4gVGhpcyBzdHJ1Y3R1cmUgaXMgbm90Ci0gKiB1c2VkIGJ5IHRoZSBwYXJlbnQgcHJvY2Vzcy4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCBnbG9iYWxzX3MgewotI2lmZGVmIFVOR1JBQ0VGVUxfUkVTVEFSVAotICAgIEhBTkRMRSB0aHJlYWRfZXhpdF9ldmVudDsKLSNlbHNlCi0gICAgaW50IGV4aXRfbm93OwotI2VuZGlmCi0gICAgc2VtYXBob3JlICpqb2JzZW1hcGhvcmU7Ci0gICAgam9ibGlzdCAqam9iaGVhZDsKLSAgICBqb2JsaXN0ICpqb2J0YWlsOwotICAgIG11dGV4ICpqb2JtdXRleDsKLSAgICBpbnQgam9iY291bnQ7Ci19IGdsb2JhbHM7Ci0KLWdsb2JhbHMgYWxsb3dlZF9nbG9iYWxzID0KLXswLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwfTsKLQotLyoKLSAqIGFkZF9qb2IoKS9yZW1vdmVfam9iKCkgLSBhZGQgb3IgcmVtb3ZlIGFuIGFjY2VwdGVkIHNvY2tldCBmcm9tIHRoZQotICogbGlzdCBvZiBzb2NrZXRzIGNvbm5lY3RlZCB0byBjbGllbnRzLiBhbGxvd2VkX2dsb2JhbHMuam9ibXV0ZXggcHJvdGVjdHMKLSAqIGFnYWluc3QgbXVsdGlwbGUgY29uY3VycmVudCBhY2Nlc3MgdG8gdGhlIGxpbmtlZCBsaXN0IG9mIGpvYnMuCi0gKi8KLQotdm9pZCBhZGRfam9iKGludCBzb2NrKQotewotICAgIGpvYmxpc3QgKm5ld19qb2I7Ci0KLSAgICBhcF9hc3NlcnQoYWxsb3dlZF9nbG9iYWxzLmpvYm11dGV4KTsKLSAgICAvKiBUT0RPOiBJZiB0b28gbWFueSBqb2JzIGluIHF1ZXVlLCBzbGVlcCwgY2hlY2sgZm9yIHByb2JsZW1zICovCi0gICAgYXBfYWNxdWlyZV9tdXRleChhbGxvd2VkX2dsb2JhbHMuam9ibXV0ZXgpOwotICAgIG5ld19qb2IgPSAoam9ibGlzdCAqKSBtYWxsb2Moc2l6ZW9mKGpvYmxpc3QpKTsKLSAgICBpZiAobmV3X2pvYiA9PSBOVUxMKSB7Ci0JZnByaW50ZihzdGRlcnIsICJPdWNoISAgT3V0IG9mIG1lbW9yeSBpbiBhZGRfam9iKCkhXG4iKTsKLSAgICB9Ci0gICAgbmV3X2pvYi0+bmV4dCA9IE5VTEw7Ci0gICAgbmV3X2pvYi0+c29jayA9IHNvY2s7Ci0gICAgaWYgKGFsbG93ZWRfZ2xvYmFscy5qb2J0YWlsICE9IE5VTEwpCi0JYWxsb3dlZF9nbG9iYWxzLmpvYnRhaWwtPm5leHQgPSBuZXdfam9iOwotICAgIGFsbG93ZWRfZ2xvYmFscy5qb2J0YWlsID0gbmV3X2pvYjsKLSAgICBpZiAoIWFsbG93ZWRfZ2xvYmFscy5qb2JoZWFkKQotCWFsbG93ZWRfZ2xvYmFscy5qb2JoZWFkID0gbmV3X2pvYjsKLSAgICBhbGxvd2VkX2dsb2JhbHMuam9iY291bnQrKzsKLSAgICByZWxlYXNlX3NlbWFwaG9yZShhbGxvd2VkX2dsb2JhbHMuam9ic2VtYXBob3JlKTsKLSAgICBhcF9yZWxlYXNlX211dGV4KGFsbG93ZWRfZ2xvYmFscy5qb2JtdXRleCk7Ci19Ci0KLWludCByZW1vdmVfam9iKHZvaWQpCi17Ci0gICAgam9ibGlzdCAqam9iOwotICAgIGludCBzb2NrOwotCi0jaWZkZWYgVU5HUkFDRUZVTF9SRVNUQVJUCi0gICAgSEFORExFIGhPYmplY3RzWzJdOwotICAgIGludCBydjsKLQotICAgIGhPYmplY3RzWzBdID0gYWxsb3dlZF9nbG9iYWxzLmpvYnNlbWFwaG9yZTsKLSAgICBoT2JqZWN0c1sxXSA9IGFsbG93ZWRfZ2xvYmFscy50aHJlYWRfZXhpdF9ldmVudDsKLQotICAgIHJ2ID0gV2FpdEZvck11bHRpcGxlT2JqZWN0cygyLCBoT2JqZWN0cywgRkFMU0UsIElORklOSVRFKTsKLSAgICBhcF9hc3NlcnQocnYgIT0gV0FJVF9GQUlMRUQpOwotICAgIGlmIChydiA9PSBXQUlUX09CSkVDVF8wICsgMSkgewotCS8qIHRocmVhZF9leGl0X25vdyAqLwotCUFQRDEoInRocmVhZCBnb3QgZXhpdCBub3cgZXZlbnQiKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotICAgIC8qIG11c3QgYmUgc2VtYXBob3JlICovCi0jZWxzZQotICAgIGFjcXVpcmVfc2VtYXBob3JlKGFsbG93ZWRfZ2xvYmFscy5qb2JzZW1hcGhvcmUpOwotI2VuZGlmCi0gICAgYXBfYXNzZXJ0KGFsbG93ZWRfZ2xvYmFscy5qb2JtdXRleCk7Ci0KLSNpZmRlZiBVTkdSQUNFRlVMX1JFU1RBUlQKLSAgICBpZiAoIWFsbG93ZWRfZ2xvYmFscy5qb2JoZWFkKSB7Ci0jZWxzZQotICAgIGFwX2FjcXVpcmVfbXV0ZXgoYWxsb3dlZF9nbG9iYWxzLmpvYm11dGV4KTsKLSAgICBpZiAoYWxsb3dlZF9nbG9iYWxzLmV4aXRfbm93ICYmICFhbGxvd2VkX2dsb2JhbHMuam9iaGVhZCkgewotI2VuZGlmCi0JYXBfcmVsZWFzZV9tdXRleChhbGxvd2VkX2dsb2JhbHMuam9ibXV0ZXgpOwotCXJldHVybiAoLTEpOwotICAgIH0KLSAgICBqb2IgPSBhbGxvd2VkX2dsb2JhbHMuam9iaGVhZDsKLSAgICBhcF9hc3NlcnQoam9iKTsKLSAgICBhbGxvd2VkX2dsb2JhbHMuam9iaGVhZCA9IGpvYi0+bmV4dDsKLSAgICBpZiAoYWxsb3dlZF9nbG9iYWxzLmpvYmhlYWQgPT0gTlVMTCkKLQlhbGxvd2VkX2dsb2JhbHMuam9idGFpbCA9IE5VTEw7Ci0gICAgYXBfcmVsZWFzZV9tdXRleChhbGxvd2VkX2dsb2JhbHMuam9ibXV0ZXgpOwotICAgIHNvY2sgPSBqb2ItPnNvY2s7Ci0gICAgZnJlZShqb2IpOwotICAgIHJldHVybiAoc29jayk7Ci19Ci0KLS8qCi0gKiBjaGlsZF9zdWJfbWFpbigpIC0gdGhpcyBpcyB0aGUgbWFpbiBsb29wIGZvciB0aGUgd29ya2VyIHRocmVhZHMKLSAqCi0gKiBFYWNoIHRocmVhZCBydW5zIHdpdGhpbiB0aGlzIGZ1bmN0aW9uLiBUaGV5IHdhaXQgd2l0aGluIHJlbW92ZV9qb2IoKQotICogZm9yIGEgam9iIHRvIGJlY29tZSBhdmFpbGFibGUsIHRoZW4gaGFuZGxlIGFsbCB0aGUgcmVxdWVzdHMgb24gdGhhdAotICogY29ubmVjdGlvbiB1bnRpbCBpdCBpcyBjbG9zZWQsIHRoZW4gcmV0dXJuIHRvIHJlbW92ZV9qb2IoKS4KLSAqCi0gKiBUaGUgd29ya2VyIHRocmVhZCB3aWxsIGV4aXQgd2hlbiBpdCByZW1vdmVzIGEgam9iIHdoaWNoIGNvbnRhaW5zCi0gKiBzb2NrZXQgbnVtYmVyIC0xLiBUaGlzIHByb3ZpZGVzIGEgZ3JhY2VmdWwgdGhyZWFkIGV4aXQsIHNpbmNlCi0gKiBpdCB3aWxsIG5ldmVyIGV4aXQgZHVyaW5nIGEgY29ubmVjdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaW4gdGhpcyBmdW5jdGlvbiBpcyBiYXNpY2FsbHkgZXF1aXZhbGVudCB0byB0aGUgY2hpbGRfbWFpbigpCi0gKiBmcm9tIHRoZSBtdWx0aS1wcm9jZXNzIChVbml4KSBlbnZpcm9ubWVudCwgZXhjZXB0IHRoYXQgd2UKLSAqCi0gKiAgLSBkbyBub3QgY2FsbCBjaGlsZF9pbml0X21vZHVsZXMgKGNoaWxkIGluaXQgQVBJIHBoYXNlKQotICogIC0gYmxvY2sgaW4gcmVtb3ZlX2pvYiwgYW5kIHdoZW4gdW5ibG9ja2VkIHdlIGhhdmUgYW4gYWxyZWFkeQotICogICAgYWNjZXB0ZWQgc29ja2V0LCBpbnN0ZWFkIG9mIGJsb2NraW5nIG9uIGEgbXV0ZXggb3Igc2VsZWN0KCkuCi0gKi8KLQotc3RhdGljIHZvaWQgY2hpbGRfc3ViX21haW4oaW50IGNoaWxkX251bSkKLXsKLSAgICBORVRfU0laRV9UIGNsZW47Ci0gICAgc3RydWN0IHNvY2thZGRyIHNhX3NlcnZlcjsKLSAgICBzdHJ1Y3Qgc29ja2FkZHIgc2FfY2xpZW50OwotICAgIHBvb2wgKnB0cmFuczsKLSAgICBpbnQgcmVxdWVzdHNfdGhpc19jaGlsZCA9IDA7Ci0gICAgaW50IGNzZCA9IC0xOwotICAgIGludCBkdXBwZWRfY3NkID0gLTE7Ci0gICAgaW50IHNydiA9IDA7Ci0KLSAgICBwdHJhbnMgPSBhcF9tYWtlX3N1Yl9wb29sKHBjb25mKTsKLQotICAgICh2b2lkKSBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKGNoaWxkX251bSwgU0VSVkVSX1JFQURZLCAocmVxdWVzdF9yZWMgKikgTlVMTCk7Ci0KLSAgICAvKgotICAgICAqIFNldHVwIHRoZSBqdW1wIGJ1ZmZlcnMgc28gdGhhdCB3ZSBjYW4gcmV0dXJuIGhlcmUgYWZ0ZXIgYSB0aW1lb3V0LgotICAgICAqLwotI2lmIGRlZmluZWQoVVNFX0xPTkdKTVApCi0gICAgc2V0am1wKGptcGJ1ZmZlcik7Ci0jZWxzZQotICAgIHNpZ3NldGptcChqbXBidWZmZXIsIDEpOwotI2VuZGlmCi0jaWZkZWYgU0lHVVJHCi0gICAgc2lnbmFsKFNJR1VSRywgdGltZW91dCk7Ci0jZW5kaWYKLQotICAgIHdoaWxlICgxKSB7Ci0JQlVGRiAqY29ubl9pbzsKLQlyZXF1ZXN0X3JlYyAqcjsKLQotCS8qCi0JICogKFJlKWluaXRpYWxpemUgdGhpcyBjaGlsZCB0byBhIHByZS1jb25uZWN0aW9uIHN0YXRlLgotCSAqLwotCi0JYXBfc2V0X2NhbGxiYWNrX2FuZF9hbGFybShOVUxMLCAwKTsgLyogQ2FuY2VsIGFueSBvdXRzdGFuZGluZyBhbGFybXMgKi8KLQl0aW1lb3V0X3JlcSA9IE5VTEw7ICAgICAgICAgICAgICAgICAvKiBObyByZXF1ZXN0IGluIHByb2dyZXNzICovCi0JY3VycmVudF9jb25uID0gTlVMTDsKLQotCWFwX2NsZWFyX3Bvb2wocHRyYW5zKTsKLQotCSh2b2lkKSBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKGNoaWxkX251bSwgU0VSVkVSX1JFQURZLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXF1ZXN0X3JlYyAqKSBOVUxMKTsKLQotCS8qIEdldCBqb2IgZnJvbSB0aGUgam9iIGxpc3QuIFRoaXMgd2lsbCBibG9jayB1bnRpbCBhIGpvYiBpcyByZWFkeS4KLQkgKiBJZiAtMSBpcyByZXR1cm5lZCB0aGVuIHRoZSBtYWluIHRocmVhZCB3YW50cyB1cyB0byBleGl0LgotCSAqLwotCWNzZCA9IHJlbW92ZV9qb2IoKTsKLQlpZiAoY3NkID09IC0xKQotCSAgICBicmVhazsJCS8qIHRpbWUgdG8gZXhpdCAqLwotCXJlcXVlc3RzX3RoaXNfY2hpbGQrKzsKLQotCWFwX25vdGVfY2xlYW51cHNfZm9yX3NvY2tldChwdHJhbnMsIGNzZCk7Ci0KLQkvKgotCSAqIFdlIG5vdyBoYXZlIGEgY29ubmVjdGlvbiwgc28gc2V0IGl0IHVwIHdpdGggdGhlIGFwcHJvcHJpYXRlCi0JICogc29ja2V0IG9wdGlvbnMsIGZpbGUgZGVzY3JpcHRvcnMsIGFuZCByZWFkL3dyaXRlIGJ1ZmZlcnMuCi0JICovCi0KLQljbGVuID0gc2l6ZW9mKHNhX3NlcnZlcik7Ci0JaWYgKGdldHNvY2tuYW1lKGNzZCwgJnNhX3NlcnZlciwgJmNsZW4pIDwgMCkgewotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgc2VydmVyX2NvbmYsICJnZXRzb2NrbmFtZSIpOwotCSAgICBjb250aW51ZTsKLQl9Ci0JY2xlbiA9IHNpemVvZihzYV9jbGllbnQpOwotCWlmICgoZ2V0cGVlcm5hbWUoY3NkLCAmc2FfY2xpZW50LCAmY2xlbikpIDwgMCkgewotCSAgICAvKiBnZXQgcGVlcm5hbWUgd2lsbCBmYWlsIGlmIHRoZSBpbnB1dCBpc24ndCBhIHNvY2tldCAqLwotCSAgICBwZXJyb3IoImdldHBlZXJuYW1lIik7Ci0JICAgIG1lbXNldCgmc2FfY2xpZW50LCAnXDAnLCBzaXplb2Yoc2FfY2xpZW50KSk7Ci0JfQotCi0Jc29ja19kaXNhYmxlX25hZ2xlKGNzZCk7Ci0KLQkodm9pZCkgYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhjaGlsZF9udW0sIFNFUlZFUl9CVVNZX1JFQUQsCi0JCQkJICAgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotCi0JY29ubl9pbyA9IGFwX2JjcmVhdGUocHRyYW5zLCBCX1JEV1IgfCBCX1NPQ0tFVCk7Ci0JZHVwcGVkX2NzZCA9IGNzZDsKLSNpZiBkZWZpbmVkKE5FRURfRFVQUEVEX0NTRCkKLQlpZiAoKGR1cHBlZF9jc2QgPSBkdXAoY3NkKSkgPCAwKSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHNlcnZlcl9jb25mLAotCQkJImR1cDogY291bGRuJ3QgZHVwbGljYXRlIGNzZCIpOwotCSAgICBkdXBwZWRfY3NkID0gY3NkOwkvKiBPaCB3ZWxsLi4uICovCi0JfQotCWFwX25vdGVfY2xlYW51cHNfZm9yX3NvY2tldChwdHJhbnMsIGR1cHBlZF9jc2QpOwotI2VuZGlmCi0JYXBfYnB1c2hmZChjb25uX2lvLCBjc2QsIGR1cHBlZF9jc2QpOwotCi0JY3VycmVudF9jb25uID0gbmV3X2Nvbm5lY3Rpb24ocHRyYW5zLCBzZXJ2ZXJfY29uZiwgY29ubl9pbywKLQkJCQkgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmc2FfY2xpZW50LAotCQkJCSAgICAgICAgICAoc3RydWN0IHNvY2thZGRyX2luICopICZzYV9zZXJ2ZXIsCi0JCQkJICAgICAgICAgIGNoaWxkX251bSk7Ci0KLQkvKgotCSAqIFJlYWQgYW5kIHByb2Nlc3MgZWFjaCByZXF1ZXN0IGZvdW5kIG9uIG91ciBjb25uZWN0aW9uCi0JICogdW50aWwgbm8gcmVxdWVzdHMgYXJlIGxlZnQgb3Igd2UgZGVjaWRlIHRvIGNsb3NlLgotCSAqLwotCi0Jd2hpbGUgKChyID0gYXBfcmVhZF9yZXF1ZXN0KGN1cnJlbnRfY29ubikpICE9IE5VTEwpIHsKLQkgICAgKHZvaWQpIGFwX3VwZGF0ZV9jaGlsZF9zdGF0dXMoY2hpbGRfbnVtLCBTRVJWRVJfQlVTWV9XUklURSwgcik7Ci0KLQkgICAgaWYgKHItPnN0YXR1cyA9PSBIVFRQX09LKQotCQlhcF9wcm9jZXNzX3JlcXVlc3Qocik7Ci0KLQkgICAgaWYgKGFwX2V4dGVuZGVkX3N0YXR1cykKLQkJaW5jcmVtZW50X2NvdW50cyhjaGlsZF9udW0sIHIpOwotCi0JICAgIGlmICghY3VycmVudF9jb25uLT5rZWVwYWxpdmUgfHwgY3VycmVudF9jb25uLT5hYm9ydGVkKQotCQlicmVhazsKLQotCSAgICBhcF9kZXN0cm95X3Bvb2woci0+cG9vbCk7Ci0JICAgICh2b2lkKSBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKGNoaWxkX251bSwgU0VSVkVSX0JVU1lfS0VFUEFMSVZFLAotCQkJCSAgICAgICAocmVxdWVzdF9yZWMgKikgTlVMTCk7Ci0KLQkgICAgYXBfc3luY19zY29yZWJvYXJkX2ltYWdlKCk7Ci0JfQotCi0JLyoKLQkgKiBDbG9zZSB0aGUgY29ubmVjdGlvbiwgYmVpbmcgY2FyZWZ1bCB0byBzZW5kIG91dCB3aGF0ZXZlciBpcyBzdGlsbAotCSAqIGluIG91ciBidWZmZXJzLiAgSWYgcG9zc2libGUsIHRyeSB0byBhdm9pZCBhIGhhcmQgY2xvc2UgdW50aWwgdGhlCi0JICogY2xpZW50IGhhcyBBQ0tlZCBvdXIgRklOIGFuZC9vciBoYXMgc3RvcHBlZCBzZW5kaW5nIHVzIGRhdGEuCi0JICovCi0JYXBfa2lsbF9jbGVhbnVwc19mb3Jfc29ja2V0KHB0cmFucywgY3NkKTsKLQotI2lmZGVmIE5PX0xJTkdDTE9TRQotCWFwX2JjbG9zZShjb25uX2lvKTsJLyoganVzdCBjbG9zZSBpdCAqLwotI2Vsc2UKLQlpZiAociAmJiByLT5jb25uZWN0aW9uCi0JICAgICYmICFyLT5jb25uZWN0aW9uLT5hYm9ydGVkCi0JICAgICYmIHItPmNvbm5lY3Rpb24tPmNsaWVudAotCSAgICAmJiAoci0+Y29ubmVjdGlvbi0+Y2xpZW50LT5mZCA+PSAwKSkgewotCi0JICAgIGxpbmdlcmluZ19jbG9zZShyKTsKLQl9Ci0JZWxzZSB7Ci0JICAgIGFwX2JzZXRmbGFnKGNvbm5faW8sIEJfRU9VVCwgMSk7Ci0JICAgIGFwX2JjbG9zZShjb25uX2lvKTsKLQl9Ci0jZW5kaWYKLSAgICB9Ci0gICAgYXBfZGVzdHJveV9wb29sKHB0cmFucyk7Ci0gICAgKHZvaWQpIGFwX3VwZGF0ZV9jaGlsZF9zdGF0dXMoY2hpbGRfbnVtLCBTRVJWRVJfREVBRCwgTlVMTCk7Ci19Ci0KLQotdm9pZCBjaGlsZF9tYWluKGludCBjaGlsZF9udW1fYXJnKQotewotICAgIC8qCi0gICAgICogT25seSByZWFzb24gZm9yIHRoaXMgZnVuY3Rpb24sIGlzIHRvIHBhc3MgaW4KLSAgICAgKiBhcmd1bWVudHMgdG8gY2hpbGRfc3ViX21haW4oKSBvbiBpdHMgc3RhY2sgc28KLSAgICAgKiB0aGF0IGxvbmdqdW1wIGRvZXNuJ3QgdHJ5IHRvIGNvcnJ1cHQgaXRzIGxvY2FsCi0gICAgICogdmFyaWFibGVzIGFuZCBJIGRvbid0IG5lZWQgdG8gbWFrZSB0aG9zZQotICAgICAqIGRhbW4gdmFyaWFibGVzIHN0YXRpYy9nbG9iYWwKLSAgICAgKi8KLSAgICBjaGlsZF9zdWJfbWFpbihjaGlsZF9udW1fYXJnKTsKLX0KLQotCi0KLXZvaWQgY2xlYW51cF90aHJlYWQodGhyZWFkICoqaGFuZGxlcywgaW50ICp0aHJlYWRfY250LCBpbnQgdGhyZWFkX3RvX2NsZWFuKQotewotICAgIGludCBpOwotCi0gICAgZnJlZV90aHJlYWQoaGFuZGxlc1t0aHJlYWRfdG9fY2xlYW5dKTsKLSAgICBmb3IgKGkgPSB0aHJlYWRfdG9fY2xlYW47IGkgPCAoKCp0aHJlYWRfY250KSAtIDEpOyBpKyspCi0JaGFuZGxlc1tpXSA9IGhhbmRsZXNbaSArIDFdOwotICAgICgqdGhyZWFkX2NudCktLTsKLX0KLSNpZmRlZiBXSU4zMgotLyoKLSAqIFRoZSBXaW4zMiBjYWxsIFdhaXRGb3JNdWx0aXBsZU9iamVjdHMgd2lsbCBvbmx5IGFsbG93IHlvdSB0byB3YWl0IGZvciAKLSAqIGEgbWF4aW11bSBvZiBNQVhJTVVNX1dBSVRfT0JKRUNUUyAoY3VycmVudCA2NCkuICBTaW5jZSB0aGUgdGhyZWFkaW5nIAotICogbW9kZWwgaW4gdGhlIG11bHRpdGhyZWFkZWQgdmVyc2lvbiBvZiBhcGFjaGUgd2FudHMgdG8gdXNlIHRoaXMgY2FsbCwgCi0gKiB3ZSBhcmUgcmVzdHJpY3RlZCB0byBhIG1heGltdW0gb2YgNjQgdGhyZWFkcy4gIFRoaXMgaXMgYSBzaW1wbGlzdGljIAotICogcm91dGluZSB0aGF0IHdpbGwgaW5jcmVhc2UgdGhpcyBzaXplLgotICovCi1zdGF0aWMgRFdPUkQgd2FpdF9mb3JfbWFueV9vYmplY3RzKERXT1JEIG5Db3VudCwgQ09OU1QgSEFORExFICpscEhhbmRsZXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3U2Vjb25kcykKLXsKLSAgICB0aW1lX3QgdFN0b3BUaW1lOwotICAgIERXT1JEIGR3UmV0ID0gV0FJVF9USU1FT1VUOwotICAgIERXT1JEIGR3SW5kZXg9MDsKLSAgICBCT09MIGJGaXJzdCA9IFRSVUU7Ci0gIAotICAgIHRTdG9wVGltZSA9IHRpbWUoTlVMTCkgKyBkd1NlY29uZHM7Ci0gIAotICAgIGRvIHsKLSAgICAgICAgaWYgKCFiRmlyc3QpCi0gICAgICAgICAgICBTbGVlcCgxMDAwKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYkZpcnN0ID0gRkFMU0U7Ci0gICAgICAgICAgCi0gICAgICAgIGZvciAoZHdJbmRleCA9IDA7IGR3SW5kZXggKiBNQVhJTVVNX1dBSVRfT0JKRUNUUyA8IG5Db3VudDsgZHdJbmRleCsrKSB7Ci0gICAgICAgICAgICBkd1JldCA9IFdhaXRGb3JNdWx0aXBsZU9iamVjdHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW4oTUFYSU1VTV9XQUlUX09CSkVDVFMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Db3VudCAtIChkd0luZGV4ICogTUFYSU1VTV9XQUlUX09CSkVDVFMpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxwSGFuZGxlcyArIChkd0luZGV4ICogTUFYSU1VTV9XQUlUX09CSkVDVFMpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGR3UmV0ICE9IFdBSVRfVElNRU9VVCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gd2hpbGUoKHRpbWUoTlVMTCkgPCB0U3RvcFRpbWUpICYmIChkd1JldCA9PSBXQUlUX1RJTUVPVVQpKTsKLSAgICAKLSAgICByZXR1cm4gZHdSZXQ7Ci19Ci0jZW5kaWYKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRXhlY3V0aXZlIHJvdXRpbmVzLgotICovCi0KLWV4dGVybiB2b2lkIG1haW5fY29udHJvbF9zZXJ2ZXIodm9pZCAqKTsgLyogaW4gaGVsbG9wLmMgKi8KLQotZXZlbnQgKmV4aXRfZXZlbnQ7Ci1tdXRleCAqc3RhcnRfbXV0ZXg7Ci0KLSNkZWZpbmUgTUFYX1NJR05BTF9OQU1FIDMwICAvKiBMb25nIGVub3VnaCBmb3IgYXBQSURfc2h1dGRvd24sIHdoZXJlIFBJRCBpcyBhbiBpbnQgKi8KLWNoYXIgc2lnbmFsX25hbWVfcHJlZml4W01BWF9TSUdOQUxfTkFNRV07Ci1jaGFyIHNpZ25hbF9yZXN0YXJ0X25hbWVbTUFYX1NJR05BTF9OQU1FXTsgCi1jaGFyIHNpZ25hbF9zaHV0ZG93bl9uYW1lW01BWF9TSUdOQUxfTkFNRV07Ci0KLSNkZWZpbmUgTUFYX1NFTEVDVF9FUlJPUlMgMTAwCi0KLS8qCi0gKiBJbml0aWFsaXNlIHRoZSBzaWduYWwgbmFtZXMsIGluIHRoZSBnbG9iYWwgdmFyaWFibGVzIHNpZ25hbF9uYW1lX3ByZWZpeCwgCi0gKiBzaWduYWxfcmVzdGFydF9uYW1lIGFuZCBzaWduYWxfc2h1dGRvd25fbmFtZS4KLSAqLwotCi12b2lkIHNldHVwX3NpZ25hbF9uYW1lcyhjaGFyICpwcmVmaXgpCi17Ci0gICAgYXBfc25wcmludGYoc2lnbmFsX25hbWVfcHJlZml4LCBzaXplb2Yoc2lnbmFsX25hbWVfcHJlZml4KSwgcHJlZml4KTsgICAgCi0gICAgYXBfc25wcmludGYoc2lnbmFsX3NodXRkb3duX25hbWUsIHNpemVvZihzaWduYWxfc2h1dGRvd25fbmFtZSksIAotCSIlc19zaHV0ZG93biIsIHNpZ25hbF9uYW1lX3ByZWZpeCk7ICAgIAotICAgIGFwX3NucHJpbnRmKHNpZ25hbF9yZXN0YXJ0X25hbWUsIHNpemVvZihzaWduYWxfcmVzdGFydF9uYW1lKSwgCi0JIiVzX3Jlc3RhcnQiLCBzaWduYWxfbmFtZV9wcmVmaXgpOyAgICAKLQotICAgIEFQRDIoInNpZ25hbCBwcmVmaXggJXMiLCBzaWduYWxfbmFtZV9wcmVmaXgpOwotfQotCi1zdGF0aWMgdm9pZCBzZXR1cF9pbmhlcml0ZWRfbGlzdGVuZXJzKHBvb2wgKnApCi17Ci0gICAgSEFORExFIHBpcGU7Ci0gICAgbGlzdGVuX3JlYyAqbHI7Ci0gICAgaW50IGZkOwotICAgIFdTQVBST1RPQ09MX0lORk8gV1NBUHJvdG9jb2xJbmZvOwotICAgIERXT1JEIEJ5dGVzUmVhZDsKLQotICAgIC8qIE9wZW4gdGhlIHBpcGUgdG8gdGhlIHBhcmVudCBwcm9jZXNzIHRvIHJlY2VpdmUgdGhlIGluaGVyaXRlZCBzb2NrZXQKLSAgICAgKiBkYXRhLiBUaGUgc29ja2V0cyBoYXZlIGJlZW4gc2V0IHRvIGxpc3RlbmluZyBpbiB0aGUgcGFyZW50IHByb2Nlc3MuCi0gICAgICovCi0gICAgcGlwZSA9IEdldFN0ZEhhbmRsZShTVERfSU5QVVRfSEFORExFKTsKLQotICAgIC8qIFNldHVwIHRoZSBsaXN0ZW5lcnMgKi8KLSAgICBsaXN0ZW5tYXhmZCA9IC0xOwotICAgIEZEX1pFUk8oJmxpc3RlbmZkcyk7Ci0gICAgbHIgPSBhcF9saXN0ZW5lcnM7Ci0KLSAgICBGRF9aRVJPKCZsaXN0ZW5mZHMpOwotCi0gICAgZm9yICg7OykgewotCWZkID0gZmluZF9saXN0ZW5lcihscik7Ci0JaWYgKGZkIDwgMCkgewotICAgICAgICAgICAgaWYgKCFSZWFkRmlsZShwaXBlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJldTQVByb3RvY29sSW5mbywgc2l6ZW9mKFdTQVBST1RPQ09MX0lORk8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmQnl0ZXNSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBPVkVSTEFQUEVEKSBOVUxMKSl7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dJTjMyRVJST1J8QVBMT0dfQ1JJVCwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXR1cF9pbmhlcml0ZWRfbGlzdGVuZXJzOiBVbmFibGUgdG8gcmVhZCBzb2NrZXQgZGF0YSBmcm9tIHBhcmVudCIpOwotICAgICAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmZCA9IFdTQVNvY2tldChGUk9NX1BST1RPQ09MX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NX1BST1RPQ09MX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NX1BST1RPQ09MX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmV1NBUHJvdG9jb2xJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICAgICAgaWYgKGZkID09IElOVkFMSURfU09DS0VUKSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dJTjMyRVJST1J8QVBMT0dfQ1JJVCwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXR1cF9pbmhlcml0ZWRfbGlzdGVuZXJzOiBXU0FTb2NrZXQgZmFpbGVkIHRvIGdldCBpbmhlcml0IHRoZSBzb2NrZXQuIik7Ci0gICAgICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFQRDIoInNldHVwX2luaGVyaXRlZF9saXN0ZW5lcnM6IFdTQVNvY2tldCgpIHJldHVybmVkIHNvY2tldCAlZCIsIGZkKTsKLQl9Ci0JZWxzZSB7Ci0JICAgIGFwX25vdGVfY2xlYW51cHNfZm9yX3NvY2tldChwLCBmZCk7Ci0JfQotCWlmIChmZCA+PSAwKSB7Ci0JICAgIEZEX1NFVChmZCwgJmxpc3RlbmZkcyk7Ci0JICAgIGlmIChmZCA+IGxpc3Rlbm1heGZkKQotCQlsaXN0ZW5tYXhmZCA9IGZkOwotCX0KLQlsci0+ZmQgPSBmZDsKLQlpZiAobHItPm5leHQgPT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0JbHIgPSBsci0+bmV4dDsKLSAgICB9Ci0gICAgLyogdHVybiB0aGUgbGlzdCBpbnRvIGEgcmluZyAqLwotICAgIGxyLT5uZXh0ID0gYXBfbGlzdGVuZXJzOwotICAgIGhlYWRfbGlzdGVuZXIgPSBhcF9saXN0ZW5lcnM7Ci0gICAgY2xvc2VfdW51c2VkX2xpc3RlbmVycygpOwotICAgIENsb3NlSGFuZGxlKHBpcGUpOwotICAgIHJldHVybjsKLX0KLQotLyoKLSAqIHdvcmtlcl9tYWluKCkgaXMgbWFpbiBsb29wIGZvciB0aGUgY2hpbGQgcHJvY2Vzcy4gVGhlIGxvb3AgaW4KLSAqIHRoaXMgZnVuY3Rpb24gYmVjb21lcyB0aGUgY29udHJvbGxpbmcgdGhyZWFkIGZvciB0aGUgYWN0dWFsbHkgd29ya2luZwotICogdGhyZWFkcyAod2hpY2ggcnVuIGluIGEgbG9vcCBpbiBjaGlsZF9zdWJfbWFpbigpKS4KLSAqLwotCi12b2lkIHdvcmtlcl9tYWluKHZvaWQpCi17Ci0gICAgaW50IG50aHJlYWRzOwotICAgIGZkX3NldCBtYWluX2ZkczsKLSAgICBpbnQgc3J2OwotICAgIGludCBjbGVuOwotICAgIGludCBjc2Q7Ci0gICAgc3RydWN0IHNvY2thZGRyX2luIHNhX2NsaWVudDsKLSAgICBpbnQgdG90YWxfam9icyA9IDA7Ci0gICAgdGhyZWFkICoqY2hpbGRfaGFuZGxlczsKLSAgICBpbnQgcnY7Ci0gICAgdGltZV90IGVuZF90aW1lOwotICAgIGludCBpOwotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgIGludCB3YWl0X3RpbWUgPSAxOwotICAgIGludCBtYXhfam9ic19wZXJfZXhlOwotICAgIGludCBtYXhfam9ic19hZnRlcl9leGl0X3JlcXVlc3Q7Ci0gICAgSEFORExFIGhPYmplY3RzWzJdOwotICAgIGludCBjb3VudF9zZWxlY3RfZXJyb3JzID0gMDsKLSAgICBwb29sICpwY2hpbGQ7Ci0KLSAgICBwY2hpbGQgPSBhcF9tYWtlX3N1Yl9wb29sKHBjb25mKTsKLQotICAgIGFwX3N0YW5kYWxvbmUgPSAxOwotICAgIHNkID0gLTE7Ci0gICAgbnRocmVhZHMgPSBhcF90aHJlYWRzX3Blcl9jaGlsZDsKLSAgICBtYXhfam9ic19hZnRlcl9leGl0X3JlcXVlc3QgPSBhcF9leGNlc3NfcmVxdWVzdHNfcGVyX2NoaWxkOwotICAgIG1heF9qb2JzX3Blcl9leGUgPSBhcF9tYXhfcmVxdWVzdHNfcGVyX2NoaWxkOwotICAgIGlmIChudGhyZWFkcyA8PSAwKQotCW50aHJlYWRzID0gNDA7Ci0gICAgaWYgKG1heF9qb2JzX3Blcl9leGUgPD0gMCkKLQltYXhfam9ic19wZXJfZXhlID0gMDsKLSAgICBpZiAobWF4X2pvYnNfYWZ0ZXJfZXhpdF9yZXF1ZXN0IDw9IDApCi0JbWF4X2pvYnNfYWZ0ZXJfZXhpdF9yZXF1ZXN0ID0gbWF4X2pvYnNfcGVyX2V4ZSAvIDEwOwotCi0gICAgaWYgKCFvbmVfcHJvY2VzcykKLQlkZXRhY2goKTsKLQotICAgIG15X3BpZCA9IGdldHBpZCgpOwotCi0gICAgKythcF9teV9nZW5lcmF0aW9uOwotCi0gICAgY29weV9saXN0ZW5lcnMocGNvbmYpOwotICAgIGFwX3Jlc3RhcnRfdGltZSA9IHRpbWUoTlVMTCk7Ci0KLSAgICByZWluaXRfc2NvcmVib2FyZChwY29uZik7Ci0KLSAgICAvKgotICAgICAqIFdhaXQgdW50aWwgd2UgaGF2ZSBwZXJtaXNzaW9uIHRvIHN0YXJ0IGFjY2VwdGluZyBjb25uZWN0aW9ucy4KLSAgICAgKiBzdGFydF9tdXRleCBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IG9ubHkgb25lIGNoaWxkIGV2ZXIKLSAgICAgKiBnb2VzIGludG8gdGhlIGxpc3Rlbi9hY2NlcHQgbG9vcCBhdCBvbmNlLiBBbHNvIHdhaXQgb24gZXhpdF9ldmVudCwKLSAgICAgKiBpbiBjYXNlIHdlICh0aGlzIGNoaWxkKSBpcyB0b2xkIHRvIGRpZSBiZWZvcmUgd2UgZ2V0IGEgY2hhbmNlIHRvCi0gICAgICogc2VydmUgYW55IHJlcXVlc3RzLgotICAgICAqLwotICAgIGhPYmplY3RzWzBdID0gKEhBTkRMRSlzdGFydF9tdXRleDsKLSAgICBoT2JqZWN0c1sxXSA9IChIQU5ETEUpZXhpdF9ldmVudDsKLSAgICBydiA9IFdhaXRGb3JNdWx0aXBsZU9iamVjdHMoMiwgaE9iamVjdHMsIEZBTFNFLCBJTkZJTklURSk7Ci0gICAgaWYgKHJ2ID09IFdBSVRfRkFJTEVEKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfRVJSfEFQTE9HX1dJTjMyRVJST1IsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgIldhaXRpbmcgZm9yIHN0YXJ0X211dGV4IG9yIGV4aXRfZXZlbnQgLS0gcHJvY2VzcyB3aWxsIGV4aXQiKTsKLQotCWFwX2Rlc3Ryb3lfcG9vbChwY2hpbGQpOwotCWNsZWFudXBfc2NvcmVib2FyZCgpOwotCWV4aXQoMCk7Ci0gICAgfQotICAgIGlmIChydiA9PSBXQUlUX09CSkVDVF8wICsgMSkgewotCS8qIGV4aXQgZXZlbnQgc2lnbmFsbGVkIC0gZXhpdCBub3cgKi8KLQlhcF9kZXN0cm95X3Bvb2wocGNoaWxkKTsKLQljbGVhbnVwX3Njb3JlYm9hcmQoKTsKLQlleGl0KDApOwotICAgIH0KLSAgICAvKiBzdGFydF9tdXRleCBvYnRhaW5lZCwgY29udGludWUgaW50byB0aGUgc2VsZWN0KCkgbG9vcCAqLwotICAgIGlmIChvbmVfcHJvY2VzcykgewotICAgICAgICBzZXR1cF9saXN0ZW5lcnMocGNvbmYpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIEdldCBsaXN0ZW5lcnMgZnJvbSB0aGUgcGFyZW50IHByb2Nlc3MgKi8KLSAgICAgICAgc2V0dXBfaW5oZXJpdGVkX2xpc3RlbmVycyhwY29uZik7Ci0gICAgfQotCi0gICAgaWYgKGxpc3Rlbm1heGZkID09IC0xKSB7Ci0JLyogSGVscCwgbm8gc29ja2V0cyB3ZXJlIG1hZGUsIGJldHRlciBsb2cgc29tZXRoaW5nIGFuZCBleGl0ICovCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0NSSVR8QVBMT0dfTk9FUlJOTywgTlVMTCwKLQkJICAgICJObyBzb2NrZXRzIHdlcmUgY3JlYXRlZCBmb3IgbGlzdGVuaW5nIik7Ci0KLQlzaWduYWxfcGFyZW50KDApOwkvKiB0ZWxsIHBhcmVudCB0byBkaWUgKi8KLQotCWFwX2Rlc3Ryb3lfcG9vbChwY2hpbGQpOwotCWNsZWFudXBfc2NvcmVib2FyZCgpOwotCWV4aXQoMCk7Ci0gICAgfQotICAgIHNldF9zaWduYWxzKCk7Ci0KLSAgICAvKgotICAgICAqIC0gSW5pdGlhbGl6ZSBhbGxvd2VkX2dsb2JhbHMKLSAgICAgKiAtIENyZWF0ZSB0aGUgdGhyZWFkIHRhYmxlCi0gICAgICogLSBTcGF3biBvZmYgdGhyZWFkcwotICAgICAqIC0gQ3JlYXRlIGxpc3RlbiBzb2NrZXQgc2V0IChkb25lIGFib3ZlKQotICAgICAqIC0gbG9vcCB7Ci0gICAgICogICAgICAgd2FpdCBmb3IgcmVxdWVzdAotICAgICAqICAgICAgIGNyZWF0ZSBuZXcgam9iCi0gICAgICogICB9IHdoaWxlICghdGltZSB0byBleGl0KQotICAgICAqIC0gQ2xvc2UgYWxsIGxpc3RlbmVycwotICAgICAqIC0gV2FpdCBmb3IgYWxsIHRocmVhZHMgdG8gY29tcGxldGUKLSAgICAgKiAtIEV4aXQKLSAgICAgKi8KLQotICAgIGFwX2NoaWxkX2luaXRfbW9kdWxlcyhwY29uZiwgc2VydmVyX2NvbmYpOwotCi0gICAgYWxsb3dlZF9nbG9iYWxzLmpvYnNlbWFwaG9yZSA9IGNyZWF0ZV9zZW1hcGhvcmUoMCk7Ci0gICAgYWxsb3dlZF9nbG9iYWxzLmpvYm11dGV4ID0gYXBfY3JlYXRlX211dGV4KE5VTEwpOwotCi0gICAgLyogc3Bhd24gb2ZmIHRoZSB0aHJlYWRzICovCi0gICAgY2hpbGRfaGFuZGxlcyA9ICh0aHJlYWQgKikgYWxsb2NhKG50aHJlYWRzICogc2l6ZW9mKGludCkpOwotICAgIGZvciAoaSA9IDA7IGkgPCBudGhyZWFkczsgaSsrKSB7Ci0JY2hpbGRfaGFuZGxlc1tpXSA9IGNyZWF0ZV90aHJlYWQoKHZvaWQgKCopKHZvaWQgKikpIGNoaWxkX21haW4sICh2b2lkICopIGkpOwotICAgIH0KLSAgICBpZiAobnRocmVhZHMgPiBtYXhfZGFlbW9uc19saW1pdCkgewotCW1heF9kYWVtb25zX2xpbWl0ID0gbnRocmVhZHM7Ci0gICAgfQotCi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKG1heF9qb2JzX3Blcl9leGUgJiYgKHRvdGFsX2pvYnMgPiBtYXhfam9ic19wZXJfZXhlKSkgewotICAgICAgICAgICAgLyogTWF4UmVxdWVzdHNQZXJDaGlsZCBoaXQuLi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYnJlYWs7Ci0JfQotICAgICAgICAvKiBBbHdheXMgY2hlY2sgZm9yIHRoZSBleGl0IGV2ZW50IGJlaW5nIHNpZ25hbGVkLgotICAgICAgICAgKi8KLSAgICAgICAgcnYgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KGV4aXRfZXZlbnQsIDApOwotICAgICAgICBhcF9hc3NlcnQoKHJ2ID09IFdBSVRfVElNRU9VVCkgfHwgKHJ2ID09IFdBSVRfT0JKRUNUXzApKTsKLSAgICAgICAgaWYgKHJ2ID09IFdBSVRfT0JKRUNUXzApIHsKLSAgICAgICAgICAgIEFQRDEoImNoaWxkOiBleGl0IGV2ZW50IHNpZ25hbGxlZCwgZXhpdGluZyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotCXR2LnR2X3NlYyA9IHdhaXRfdGltZTsKLQl0di50dl91c2VjID0gMDsKLQotCW1lbWNweSgmbWFpbl9mZHMsICZsaXN0ZW5mZHMsIHNpemVvZihmZF9zZXQpKTsKLQlzcnYgPSBhcF9zZWxlY3QobGlzdGVubWF4ZmQgKyAxLCAmbWFpbl9mZHMsIE5VTEwsIE5VTEwsICZ0dik7Ci0jaWZkZWYgV0lOMzIKLQlpZiAoc3J2ID09IFNPQ0tFVF9FUlJPUikgewotCSAgICAvKiBNYXAgdGhlIFdpbjMyIGVycm9yIGludG8gYSBzdGFuZGFyZCBVbml4IGVycm9yIGNvbmRpdGlvbiAqLwotCSAgICBlcnJubyA9IFdTQUdldExhc3RFcnJvcigpOwotCSAgICBzcnYgPSAtMTsKLQl9Ci0jZW5kaWYgLyogV0lOMzIgKi8KLQotCWlmIChzcnYgPCAwKSB7Ci0JICAgIC8qIEVycm9yIG9jY3VycmVkIC0gaWYgRUlOVFIsIGxvb3AgYXJvdW5kIHdpdGggcHJvYmxlbSAqLwotCSAgICBpZiAoZXJybm8gIT0gRUlOVFIpIHsKLQkJLyogQSAicmVhbCIgZXJyb3Igb2NjdXJyZWQsIGxvZyBpdCBhbmQgaW5jcmVtZW50IHRoZSBjb3VudCBvZgotCQkgKiBzZWxlY3QgZXJyb3JzLiBUaGlzIGNvdW50IGlzIHVzZWQgdG8gZW5zdXJlIHdlIGRvbid0IGdvIGludG8KLQkJICogYSBidXN5IGxvb3Agb2YgY29udGludW91cyBlcnJvcnMuCi0JCSAqLwotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzZXJ2ZXJfY29uZiwgInNlbGVjdDogKGxpc3RlbikiKTsKLQkJY291bnRfc2VsZWN0X2Vycm9ycysrOwotCQlpZiAoY291bnRfc2VsZWN0X2Vycm9ycyA+IE1BWF9TRUxFQ1RfRVJST1JTKSB7Ci0JCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSfEFQTE9HX05PRVJSTk8sIHNlcnZlcl9jb25mLAotCQkJIlRvbyBtYW55IGVycm9ycyBpbiBzZWxlY3QgbG9vcC4gQ2hpbGQgcHJvY2VzcyBleGl0aW5nLiIpOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgICBjb250aW51ZTsKLQl9Ci0JY291bnRfc2VsZWN0X2Vycm9ycyA9IDA7ICAgIC8qIHJlc2V0IGNvdW50IG9mIGVycm9ycyAqLwotCWlmIChzcnYgPT0gMCkgewotICAgICAgICAgICAgY29udGludWU7Ci0JfQotCi0JewotCSAgICBsaXN0ZW5fcmVjICpscjsKLQotCSAgICBsciA9IGZpbmRfcmVhZHlfbGlzdGVuZXIoJm1haW5fZmRzKTsKLQkgICAgaWYgKGxyICE9IE5VTEwpIHsKLQkJc2QgPSBsci0+ZmQ7Ci0JICAgIH0KLQl9Ci0JZG8gewotCSAgICBjbGVuID0gc2l6ZW9mKHNhX2NsaWVudCk7Ci0JICAgIGNzZCA9IGFjY2VwdChzZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2FfY2xpZW50LCAmY2xlbik7Ci0jaWZkZWYgV0lOMzIKLQkgICAgaWYgKGNzZCA9PSBJTlZBTElEX1NPQ0tFVCkgewotCQljc2QgPSAtMTsKLQkJZXJybm8gPSBXU0FHZXRMYXN0RXJyb3IoKTsKLQkgICAgfQotI2VuZGlmIC8qIFdJTjMyICovCi0JfSB3aGlsZSAoY3NkIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLQlpZiAoY3NkIDwgMCkgewotI2lmIGRlZmluZWQoRVBST1RPKSAmJiBkZWZpbmVkKEVDT05OQUJPUlRFRCkKLQkgICAgaWYgKChlcnJubyAhPSBFUFJPVE8pICYmIChlcnJubyAhPSBFQ09OTkFCT1JURUQpKQotI2VsaWYgZGVmaW5lZChFUFJPVE8pCi0JICAgIGlmIChlcnJubyAhPSBFUFJPVE8pCi0jZWxpZiBkZWZpbmVkKEVDT05OQUJPUlRFRCkKLQkgICAgaWYgKGVycm5vICE9IEVDT05OQUJPUlRFRCkKLSNlbmRpZgotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzZXJ2ZXJfY29uZiwKLQkJCSAgICAiYWNjZXB0OiAoY2xpZW50IHNvY2tldCkiKTsKLQl9Ci0JZWxzZSB7Ci0JICAgIGFkZF9qb2IoY3NkKTsKLQkgICAgdG90YWxfam9icysrOwotCX0KLSAgICB9Ci0gICAgICAKLSAgICBBUEQyKCJwcm9jZXNzIFBJRCAlZCBleGl0aW5nIiwgbXlfcGlkKTsKLQotICAgIC8qIEdldCByZWFkeSB0byBzaHV0ZG93biBhbmQgZXhpdCAqLwotICAgIGFsbG93ZWRfZ2xvYmFscy5leGl0X25vdyA9IDE7Ci0gICAgYXBfcmVsZWFzZV9tdXRleChzdGFydF9tdXRleCk7Ci0KLSNpZmRlZiBVTkdSQUNFRlVMX1JFU1RBUlQKLSAgICBTZXRFdmVudChhbGxvd2VkX2dsb2JhbHMudGhyZWFkX2V4aXRfZXZlbnQpOwotI2Vsc2UKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgewotCWFkZF9qb2IoLTEpOwotICAgIH0KLSNlbmRpZgotCi0gICAgQVBEMigicHJvY2VzcyBQSUQgJWQgd2FpdGluZyBmb3Igd29ya2VyIHRocmVhZHMgdG8gZXhpdCIsIG15X3BpZCk7Ci0gICAgLyogV2FpdCBmb3IgYWxsIHlvdXIgY2hpbGRyZW4gKi8KLSAgICBlbmRfdGltZSA9IHRpbWUoTlVMTCkgKyAxODA7Ci0gICAgd2hpbGUgKG50aHJlYWRzKSB7Ci0gICAgICAgIHJ2ID0gd2FpdF9mb3JfbWFueV9vYmplY3RzKG50aHJlYWRzLCBjaGlsZF9oYW5kbGVzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX3RpbWUgLSB0aW1lKE5VTEwpKTsKLQlpZiAocnYgIT0gV0FJVF9USU1FT1VUKSB7Ci0JICAgIHJ2ID0gcnYgLSBXQUlUX09CSkVDVF8wOwotCSAgICBhcF9hc3NlcnQoKHJ2ID49IDApICYmIChydiA8IG50aHJlYWRzKSk7Ci0JICAgIGNsZWFudXBfdGhyZWFkKGNoaWxkX2hhbmRsZXMsICZudGhyZWFkcywgcnYpOwotCSAgICBjb250aW51ZTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotCi0gICAgQVBEMigicHJvY2VzcyBQSUQgJWQga2lsbGluZyByZW1haW5pbmcgd29ya2VyIHRocmVhZHMiLCBteV9waWQpOwotICAgIGZvciAoaSA9IDA7IGkgPCBudGhyZWFkczsgaSsrKSB7Ci0Ja2lsbF90aHJlYWQoY2hpbGRfaGFuZGxlc1tpXSk7Ci0JZnJlZV90aHJlYWQoY2hpbGRfaGFuZGxlc1tpXSk7Ci0gICAgfQotI2lmZGVmIFVOR1JBQ0VGVUxfUkVTVEFSVAotICAgIGFwX2Fzc2VydChDbG9zZUhhbmRsZShhbGxvd2VkX2dsb2JhbHMudGhyZWFkX2V4aXRfZXZlbnQpKTsKLSNlbmRpZgotICAgIGRlc3Ryb3lfc2VtYXBob3JlKGFsbG93ZWRfZ2xvYmFscy5qb2JzZW1hcGhvcmUpOwotICAgIGFwX2Rlc3Ryb3lfbXV0ZXgoYWxsb3dlZF9nbG9iYWxzLmpvYm11dGV4KTsKLQotICAgIGFwX2NoaWxkX2V4aXRfbW9kdWxlcyhwY29uZiwgc2VydmVyX2NvbmYpOwotICAgIGFwX2Rlc3Ryb3lfcG9vbChwY2hpbGQpOwotCi0gICAgY2xlYW51cF9zY29yZWJvYXJkKCk7Ci0KLSAgICBBUEQyKCJwcm9jZXNzIFBJRCAlZCBleGl0ZWQiLCBteV9waWQpOwotICAgIGNsZWFuX3BhcmVudF9leGl0KDApOwotfQkJCQkvKiBzdGFuZGFsb25lX21haW4gKi8KLQotLyoKLSAqIFNwYXduIGEgY2hpbGQgQXBhY2hlIHByb2Nlc3MuIFRoZSBjaGlsZCBwcm9jZXNzIGhhcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmcm9tCi0gKiBhcmdjIGFuZCBhcmd2W10sIHBsdXMgYSAtWiBhcmd1bWVudCBnaXZpbmcgdGhlIG5hbWUgb2YgYW4gZXZlbnQuIFRoZSBjaGlsZCBzaG91bGQKLSAqIG9wZW4gYW5kIHBvbGwgb3Igd2FpdCBvbiB0aGlzIGV2ZW50LiBXaGVuIGl0IGlzIHNpZ25hbGxlZCwgdGhlIGNoaWxkIHNob3VsZCBkaWUuCi0gKiBwcmVmaXggaXMgYSBwcmVmaXggc3RyaW5nIGZvciB0aGUgZXZlbnQgbmFtZS4KLSAqIAotICogVGhlIGNoaWxkX251bSBhcmd1bWVudCBvbiBlbnRyeSBjb250YWlucyBhIHNlcmlhbCBudW1iZXIgZm9yIHRoaXMgY2hpbGQgKHVzZWQgdG8gY3JlYXRlCi0gKiBhIHVuaXF1ZSBldmVudCBuYW1lKS4gT24gZXhpdCwgdGhpcyBudW1iZXIgd2lsbCBoYXZlIGJlZW4gaW5jcmVtZW50ZWQgYnkgb25lLCByZWFkeQotICogZm9yIHRoZSBuZXh0IGNhbGwuIAotICoKLSAqIE9uIGV4aXQsIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJlICpldiB3aWxsIGNvbnRhaW4gdGhlIGV2ZW50IGNyZWF0ZWQKLSAqIHRvIHNpZ25hbCB0aGUgbmV3IGNoaWxkIHByb2Nlc3MuCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgaGFuZGxlIHRvIHRoZSBjaGlsZCBwcm9jZXNzIGlmIHN1Y2Nlc3NmdWwsIGVsc2UgLTEuIElmIC0xIGlzCi0gKiByZXR1cm5lZCB0aGUgZXJyb3Igd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBsb2dnZWQgYnkgYXBfbG9nX2Vycm9yKCkuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIG1hc3Rlcl9tYWluIC0gdGhpcyBpcyB0aGUgcGFyZW50IChtYWluKSBwcm9jZXNzLiBXZSBjcmVhdGUgYQotICogY2hpbGQgcHJvY2VzcyB0byBkbyB0aGUgd29yaywgdGhlbiBzaXQgYXJvdW5kIHdhaXRpbmcgZm9yIGVpdGhlcgotICogdGhlIGNoaWxkIHRvIGV4aXQsIG9yIGEgcmVzdGFydCBvciBleGl0IHNpZ25hbC4gSWYgdGhlIGNoaWxkIGRpZXMsCi0gKiB3ZSBqdXN0IHJlc3Bhd24gYSBuZXcgb25lLiBJZiB3ZSBoYXZlIGEgc2h1dGRvd24gb3IgZ3JhY2VmdWwgcmVzdGFydCwKLSAqIHRlbGwgdGhlIGNoaWxkIHRvIGRpZSB3aGVuIGl0IGlzIHJlYWR5LiBJZiBpdCBpcyBhIG5vbi1ncmFjZWZ1bAotICogcmVzdGFydCwgZm9yY2UgdGhlIGNoaWxkIHRvIGRpZSBpbW1lZGlhdGVseS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE1BWF9QUk9DRVNTRVMgNTAgLyogbXVzdCBiZSA8IE1BWF9XQUlUX09CSkVDVFMtMSAqLwotCi1zdGF0aWMgdm9pZCBjbGVhbnVwX3Byb2Nlc3MoSEFORExFICpoYW5kbGVzLCBIQU5ETEUgKmV2ZW50cywgaW50IHBvc2l0aW9uLCBpbnQgKnByb2Nlc3NlcykKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgaGFuZGxlID0gMDsKLQotICAgIENsb3NlSGFuZGxlKGhhbmRsZXNbcG9zaXRpb25dKTsKLSAgICBDbG9zZUhhbmRsZShldmVudHNbcG9zaXRpb25dKTsKLQotICAgIGhhbmRsZSA9IChpbnQpaGFuZGxlc1twb3NpdGlvbl07Ci0KLSAgICBmb3IgKGkgPSBwb3NpdGlvbjsgaSA8ICgqcHJvY2Vzc2VzKS0xOyBpKyspIHsKLQloYW5kbGVzW2ldID0gaGFuZGxlc1tpICsgMV07Ci0JZXZlbnRzW2ldID0gZXZlbnRzW2kgKyAxXTsKLSAgICB9Ci0gICAgKCpwcm9jZXNzZXMpLS07Ci0KLSAgICBBUEQ0KCJjbGVhbnVwX3Byb2Nlc3NlczogcmVtb3ZlZCBjaGlsZCBpbiBzbG90ICVkIGhhbmRsZSAlZCwgbWF4PSVkIiwgcG9zaXRpb24sIGhhbmRsZSwgKnByb2Nlc3Nlcyk7Ci19Ci0KLXN0YXRpYyBpbnQgY3JlYXRlX3Byb2Nlc3MocG9vbCAqcCwgSEFORExFICpoYW5kbGVzLCBIQU5ETEUgKmV2ZW50cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcHJvY2Vzc2VzLCBpbnQgKmNoaWxkX251bSwgY2hhciAqa2lsbF9ldmVudF9uYW1lLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0KLSAgICBpbnQgcnYsIGk7Ci0gICAgSEFORExFIGtpbGxfZXZlbnQ7Ci0gICAgY2hhciBidWZbMTAyNF07Ci0gICAgY2hhciBleGl0X2V2ZW50X25hbWVbNDBdOyAvKiBhcFBJRF9DIyAqLwotICAgIGNoYXIgKnBDb21tYW5kOwotCi0gICAgU1RBUlRVUElORk8gc2k7ICAgICAgICAgICAvKiBGaWxsZWQgaW4gcHJpb3IgdG8gY2FsbCB0byBDcmVhdGVQcm9jZXNzICovCi0gICAgUFJPQ0VTU19JTkZPUk1BVElPTiBwaTsgICAvKiBmaWxsZWQgaW4gb24gY2FsbCB0byBDcmVhdGVQcm9jZXMgKi8KLSAgICBMUFdTQVBST1RPQ09MX0lORk8gIGxwV1NBUHJvdG9jb2xJbmZvOwotICAgIGxpc3Rlbl9yZWMgKmxyOwotICAgIERXT1JEIEJ5dGVzV3JpdHRlbjsKLSAgICBIQU5ETEUgaFBpcGVSZWFkID0gTlVMTDsKLSAgICBIQU5ETEUgaFBpcGVXcml0ZSA9IE5VTEw7Ci0gICAgU0VDVVJJVFlfQVRUUklCVVRFUyBzYSA9IHswfTsgIAotCi0gICAgc2Eubkxlbmd0aCA9IHNpemVvZihzYSk7Ci0gICAgc2EuYkluaGVyaXRIYW5kbGUgPSBUUlVFOwotICAgIHNhLmxwU2VjdXJpdHlEZXNjcmlwdG9yID0gTlVMTDsKLQotICAgIC8qIEJ1aWxkIHRoZSBjb21tYW5kIGxpbmUuIFNob3VsZCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0gICAgICogQzovYXBhY2hlL2Jpbi9hcGFjaGUuZXhlIC1aIGV4aXRfZXZlbnQgLWYgYXBfc2VydmVyX2NvbmZuYW1lIAotICAgICAqIEZpcnN0LCBnZXQgdGhlIHBhdGggdG8gdGhlIGV4ZWN1dGFibGUuLi4KLSAgICAgKi8KLSAgICBydiA9IEdldE1vZHVsZUZpbGVOYW1lKE5VTEwsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgIGlmIChydiA9PSBzaXplb2YoYnVmKSkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0lOMzJFUlJPUiB8IEFQTE9HX0NSSVQsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgIlBhcmVudDogUGF0aCB0byBBcGFjaGUgcHJvY2VzcyB0b28gbG9uZyIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChydiA9PSAwKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XSU4zMkVSUk9SIHwgQVBMT0dfQ1JJVCwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAiUGFyZW50OiBHZXRNb2R1bGVGaWxlTmFtZSgpIHJldHVybmVkIE5VTEwgZm9yIGN1cnJlbnQgcHJvY2Vzcy4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAKLSAgICAvKiBDcmVhdGUgdGhlIGV4aXQgZXZlbnQgKGFwUElEX0MjKS4gUGFyZW50IHNpZ25hbHMgdGhpcyBldmVudCB0byB0ZWxsIHRoZQotICAgICAqIGNoaWxkIHRvIGV4aXQgCi0gICAgICovCi0gICAgYXBfc25wcmludGYoZXhpdF9ldmVudF9uYW1lLCBzaXplb2YoZXhpdF9ldmVudF9uYW1lKSwgIiVzX0MlZCIsIGtpbGxfZXZlbnRfbmFtZSwgKysoKmNoaWxkX251bSkpOwotICAgIGtpbGxfZXZlbnQgPSBDcmVhdGVFdmVudChOVUxMLCBUUlVFLCBGQUxTRSwgZXhpdF9ldmVudF9uYW1lKTsKLSAgICBpZiAoIWtpbGxfZXZlbnQpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dJTjMyRVJST1IgfCBBUExPR19DUklULCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJQYXJlbnQ6IENvdWxkIG5vdCBjcmVhdGUgZXhpdCBldmVudCBmb3IgY2hpbGQgcHJvY2VzcyIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIAotICAgIHBDb21tYW5kID0gYXBfcHNwcmludGYocCwgIlwiJXNcIiAtWiAlcyAtZiBcIiVzXCIiLCBidWYsIGV4aXRfZXZlbnRfbmFtZSwgYXBfc2VydmVyX2NvbmZuYW1lKTsgIAotCi0gICAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgewotICAgICAgICBwQ29tbWFuZCA9IGFwX3BzdHJjYXQocCwgcENvbW1hbmQsICIgIiwgYXJndltpXSwgTlVMTCk7Ci0gICAgfQotCi0gICAgLyogQ3JlYXRlIGEgcGlwZSB0byBzZW5kIHNvY2tldCBpbmZvIHRvIHRoZSBjaGlsZCAqLwotICAgIGlmICghQ3JlYXRlUGlwZSgmaFBpcGVSZWFkLCAmaFBpcGVXcml0ZSwgJnNhLCAwKSkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0lOMzJFUlJPUiB8IEFQTE9HX0NSSVQsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgIlBhcmVudDogVW5hYmxlIHRvIGNyZWF0ZSBwaXBlIHRvIGNoaWxkIHByb2Nlc3MuXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIEdpdmUgdGhlIHJlYWQgaW4gb2YgdGVoIHBpcGUgKGhQaXBlUmVhZCkgdG8gdGhlIGNoaWxkIGFzIHN0ZGluLiBUaGUgCi0gICAgICogcGFyZW50IHdpbGwgd3JpdGUgdGhlIHNvY2tldCBkYXRhIHRvIHRoZSBjaGlsZCBvbiB0aGlzIHBpcGUuCi0gICAgICovCi0gICAgbWVtc2V0KCZzaSwgMCwgc2l6ZW9mKHNpKSk7Ci0gICAgbWVtc2V0KCZwaSwgMCwgc2l6ZW9mKHBpKSk7Ci0gICAgc2kuY2IgPSBzaXplb2Yoc2kpOwotICAgIHNpLmR3RmxhZ3MgICAgID0gU1RBUlRGX1VTRVNIT1dXSU5ET1cgfCBTVEFSVEZfVVNFU1RESEFORExFUzsKLSAgICBzaS53U2hvd1dpbmRvdyA9IFNXX0hJREU7Ci0gICAgc2kuaFN0ZElucHV0ICAgPSBoUGlwZVJlYWQ7Ci0KLSAgICBpZiAoIUNyZWF0ZVByb2Nlc3MoTlVMTCwgcENvbW1hbmQsIE5VTEwsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCAgICAgIC8qIEluaGVyaXQgaGFuZGxlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgIC8qIENyZWF0aW9uIGZsYWdzICovCi0gICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICZzaSwgJnBpKSkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0lOMzJFUlJPUiB8IEFQTE9HX0NSSVQsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgIlBhcmVudDogTm90IGFibGUgdG8gY3JlYXRlIHRoZSBjaGlsZCBwcm9jZXNzLiIpOwotICAgICAgICAvKgotICAgICAgICAgKiBXZSBtdXN0IGNsb3NlIHRoZSBoYW5kbGVzIHRvIHRoZSBuZXcgcHJvY2VzcyBhbmQgaXRzIG1haW4gdGhyZWFkCi0gICAgICAgICAqIHRvIHByZXZlbnQgaGFuZGxlIGFuZCBtZW1vcnkgbGVha3MuCi0gICAgICAgICAqLyAKLSAgICAgICAgQ2xvc2VIYW5kbGUocGkuaFByb2Nlc3MpOwotICAgICAgICBDbG9zZUhhbmRsZShwaS5oVGhyZWFkKTsKLQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0lORk8sIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgIlBhcmVudDogQ3JlYXRlZCBjaGlsZCBwcm9jZXNzICVkIiwgcGkuZHdQcm9jZXNzSWQpOwotCi0gICAgICAgIC8qIEFzc3VtZSB0aGUgY2hpbGQgcHJvY2VzcyBsaXZlcy4gVXBkYXRlIHRoZSBwcm9jZXNzIGFuZCBldmVudCB0YWJsZXMgKi8KLSAgICAgICAgaGFuZGxlc1sqcHJvY2Vzc2VzXSA9IHBpLmhQcm9jZXNzOwotICAgICAgICBldmVudHNbKnByb2Nlc3Nlc10gPSBraWxsX2V2ZW50OwotICAgICAgICAoKnByb2Nlc3NlcykrKzsKLQotICAgICAgICAvKiBXZSBuZXZlciBzdG9yZSB0aGUgdGhyZWFkJ3MgaGFuZGxlLCBzbyBjbG9zZSBpdCBub3cuICovCi0gICAgICAgIENsb3NlSGFuZGxlKHBpLmhUaHJlYWQpOwotCi0gICAgICAgIC8qIFJ1biB0aGUgY2hhaW4gb2Ygb3BlbiBzb2NrZXRzLiBGb3IgZWFjaCBzb2NrZXQsIGR1cGxpY2F0ZSBpdCAKLSAgICAgICAgICogZm9yIHRoZSB0YXJnZXQgcHJvY2VzcyB0aGVuIHNlbmQgdGhlIFdTQVBST1RPQ09MX0lORk8gCi0gICAgICAgICAqIChyZXR1cm5lZCBieSBkdXAgc29ja2V0KSB0byB0aGUgY2hpbGQgKi8KLSAgICAgICAgbHIgPSBhcF9saXN0ZW5lcnM7Ci0gICAgICAgIHdoaWxlIChsciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBscFdTQVByb3RvY29sSW5mbyA9IGFwX3BjYWxsb2MocCwgc2l6ZW9mKFdTQVBST1RPQ09MX0lORk8pKTsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfSU5GTywgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIlBhcmVudDogRHVwbGljYXRpbmcgc29ja2V0ICVkIGFuZCBzZW5kaW5nIGl0IHRvIGNoaWxkIHByb2Nlc3MgJWQiLCBsci0+ZmQsIHBpLmR3UHJvY2Vzc0lkKTsKLSAgICAgICAgICAgIGlmIChXU0FEdXBsaWNhdGVTb2NrZXQobHItPmZkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGkuZHdQcm9jZXNzSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwV1NBUHJvdG9jb2xJbmZvKSA9PSBTT0NLRVRfRVJST1IpIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0lOMzJFUlJPUiB8IEFQTE9HX0NSSVQsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGFyZW50OiBXU0FEdXBsaWNhdGVTb2NrZXQgZmFpbGVkIGZvciBzb2NrZXQgJWQuIiwgbHItPmZkICk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIVdyaXRlRmlsZShoUGlwZVdyaXRlLCBscFdTQVByb3RvY29sSW5mbywgKERXT1JEKSBzaXplb2YoV1NBUFJPVE9DT0xfSU5GTyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmQnl0ZXNXcml0dGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQT1ZFUkxBUFBFRCkgTlVMTCkpIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0lOMzJFUlJPUiB8IEFQTE9HX0NSSVQsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGFyZW50OiBVbmFibGUgdG8gd3JpdGUgZHVwbGljYXRlZCBzb2NrZXQgJWQgdG8gdGhlIGNoaWxkLiIsIGxyLT5mZCApOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbHIgPSBsci0+bmV4dDsKLSAgICAgICAgICAgIGlmIChsciA9PSBhcF9saXN0ZW5lcnMpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ2xvc2VIYW5kbGUoaFBpcGVSZWFkKTsKLSAgICBDbG9zZUhhbmRsZShoUGlwZVdyaXRlKTsgICAgICAgIAotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRvIHNoYXJlIHRoZSBzZW1hcGhvcmVzIHdpdGggb3RoZXIgcHJvY2Vzc2VzLCB3ZSBuZWVkIGEgTlVMTCBBQ0wKLSAqIENvZGUgZnJvbSBNUyBLQiBRMTA2Mzg3Ci0gKi8KLQotc3RhdGljIFBTRUNVUklUWV9BVFRSSUJVVEVTIEdldE51bGxBQ0woKQotewotICAgIFBTRUNVUklUWV9ERVNDUklQVE9SIHBTRDsKLSAgICBQU0VDVVJJVFlfQVRUUklCVVRFUyBzYTsKLQotICAgIHNhICA9IChQU0VDVVJJVFlfQVRUUklCVVRFUykgTG9jYWxBbGxvYyhMUFRSLCBzaXplb2YoU0VDVVJJVFlfQVRUUklCVVRFUykpOwotICAgIHBTRCA9IChQU0VDVVJJVFlfREVTQ1JJUFRPUikgTG9jYWxBbGxvYyhMUFRSLAotCQkJCQkgICAgU0VDVVJJVFlfREVTQ1JJUFRPUl9NSU5fTEVOR1RIKTsKLSAgICBpZiAocFNEID09IE5VTEwgfHwgc2EgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBXZSBjYW4gc2FmZWx5IHVzZSBHZXRMYXN0RXJyb3IoKSBoZXJlIHdpdGhvdXQgcHJlc2V0dGluZyBpdDsKLSAgICAgKiB7SW5pdGlhbGl6ZSxTZXR9U2VjdXJpdHlEZXNjcmlwdG9yKCkgaGF2ZSBiZWVuIHZlcmlmaWVkIGFzIGNsZWFyaW5nIGl0Ci0gICAgICogb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLgotICAgICAqLwotICAgIGlmICghSW5pdGlhbGl6ZVNlY3VyaXR5RGVzY3JpcHRvcihwU0QsIFNFQ1VSSVRZX0RFU0NSSVBUT1JfUkVWSVNJT04pCi0JfHwgR2V0TGFzdEVycm9yKCkpIHsKLSAgICAgICAgTG9jYWxGcmVlKCBwU0QgKTsKLSAgICAgICAgTG9jYWxGcmVlKCBzYSApOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKCFTZXRTZWN1cml0eURlc2NyaXB0b3JEYWNsKHBTRCwgVFJVRSwgKFBBQ0wpIE5VTEwsIEZBTFNFKQotCXx8IEdldExhc3RFcnJvcigpKSB7Ci0gICAgICAgIExvY2FsRnJlZSggcFNEICk7Ci0gICAgICAgIExvY2FsRnJlZSggc2EgKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHNhLT5uTGVuZ3RoID0gc2l6ZW9mKHNhKTsKLSAgICBzYS0+bHBTZWN1cml0eURlc2NyaXB0b3IgPSBwU0Q7Ci0gICAgc2EtPmJJbmhlcml0SGFuZGxlID0gVFJVRTsKLSAgICByZXR1cm4gc2E7Ci19Ci0KLQotc3RhdGljIHZvaWQgQ2xlYW5OdWxsQUNMKCB2b2lkICpzYSApIHsKLSAgICBpZiggc2EgKSB7Ci0gICAgICAgIExvY2FsRnJlZSggKChQU0VDVVJJVFlfQVRUUklCVVRFUylzYSktPmxwU2VjdXJpdHlEZXNjcmlwdG9yKTsKLSAgICAgICAgTG9jYWxGcmVlKCBzYSApOwotICAgIH0KLX0KLQotaW50IG1hc3Rlcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICAvKiByZXR1cm5zIE5VTEwgaWYgaW52YWxpZCAoV2luOTU/KSAqLwotICAgIFBTRUNVUklUWV9BVFRSSUJVVEVTIHNhID0gR2V0TnVsbEFDTCgpOwotICAgIGludCBuY2hpbGQgPSBhcF9kYWVtb25zX3RvX3N0YXJ0OwotICAgIGludCBjaGlsZF9udW0gPSAwOwotICAgIGludCBydiwgY2xkOwotICAgIGNoYXIgc2lnbmFsX3ByZWZpeF9zdHJpbmdbMTAwXTsKLSAgICBpbnQgaTsKLSAgICB0aW1lX3QgdG1zdGFydDsKLSAgICBIQU5ETEUgc2lnbmFsX3NodXRkb3duX2V2ZW50OwkvKiB1c2VkIHRvIHNpZ25hbCBzaHV0ZG93biB0byBwYXJlbnQgKi8KLSAgICBIQU5ETEUgc2lnbmFsX3Jlc3RhcnRfZXZlbnQ7CS8qIHVzZWQgdG8gc2lnbmFsIGEgcmVzdGFydCB0byBwYXJlbnQgKi8KLSAgICBIQU5ETEUgcHJvY2Vzc19oYW5kbGVzW01BWF9QUk9DRVNTRVNdOwotICAgIEhBTkRMRSBwcm9jZXNzX2tpbGxfZXZlbnRzW01BWF9QUk9DRVNTRVNdOwotICAgIGludCBjdXJyZW50X2xpdmVfcHJvY2Vzc2VzID0gMDsgLyogbnVtYmVyIG9mIGNoaWxkIHByb2Nlc3Mgd2Uga25vdyBhYm91dCAqLwotICAgIGludCBwcm9jZXNzZXNfdG9fY3JlYXRlID0gMDsgICAgLyogbnVtYmVyIG9mIGNoaWxkIHByb2Nlc3NlcyB0byBjcmVhdGUgKi8KLSAgICBwb29sICpwcGFyZW50ID0gTlVMTDsgIC8qIHBvb2wgZm9yIHRoZSBwYXJlbnQgcHJvY2Vzcy4gQ2xlYW5lZCBvbiBlYWNoIHJlc3RhcnQgKi8KLQotICAgIG5jaGlsZCA9IDE7CSAgICAvKiBvbmx5IGFsbG93ZWQgb25lIGNoaWxkIHByb2Nlc3MgZm9yIGN1cnJlbnQgZ2VuZXJhdGlvbiAqLwotICAgIHByb2Nlc3Nlc190b19jcmVhdGUgPSBuY2hpbGQ7Ci0KLSAgICBpc19ncmFjZWZ1bCA9IDA7Ci0KLSAgICBhcF9zbnByaW50ZihzaWduYWxfcHJlZml4X3N0cmluZywgc2l6ZW9mKHNpZ25hbF9wcmVmaXhfc3RyaW5nKSwKLQkgICAgICAgICJhcCVkIiwgZ2V0cGlkKCkpOwotICAgIHNldHVwX3NpZ25hbF9uYW1lcyhzaWduYWxfcHJlZml4X3N0cmluZyk7Ci0KLSAgICAvKiBDcmVhdGUgc2h1dGRvd24gZXZlbnQsIGFwUElEX3NodXRkb3duLCB3aGVyZSBQSUQgaXMgdGhlIHBhcmVudCAKLSAgICAgKiBBcGFjaGUgcHJvY2VzcyBJRC4gU2h1dGRvd24gaXMgc2lnbmFsZWQgYnkgJ2FwYWNoZSAtayBzaHV0ZG93bicuCi0gICAgICovCi0gICAgc2lnbmFsX3NodXRkb3duX2V2ZW50ID0gQ3JlYXRlRXZlbnQoc2EsIFRSVUUsIEZBTFNFLCBzaWduYWxfc2h1dGRvd25fbmFtZSk7Ci0gICAgaWYgKCFzaWduYWxfc2h1dGRvd25fZXZlbnQpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkd8QVBMT0dfV0lOMzJFUlJPUiwgc2VydmVyX2NvbmYsCi0JCSAgICAibWFzdGVyX21haW46IENhbm5vdCBjcmVhdGUgc2h1dGRvd24gZXZlbnQgJXMiLCBzaWduYWxfc2h1dGRvd25fbmFtZSk7Ci0gICAgICAgIENsZWFuTnVsbEFDTCgodm9pZCAqKXNhKTsKLQlleGl0KDEpOwotICAgIH0KLQotICAgIC8qIENyZWF0ZSByZXN0YXJ0IGV2ZW50LCBhcFBJRF9yZXN0YXJ0LCB3aGVyZSBQSUQgaXMgdGhlIHBhcmVudCAKLSAgICAgKiBBcGFjaGUgcHJvY2VzcyBJRC4gUmVzdGFydCBpcyBzaWduYWxlZCBieSAnYXBhY2hlIC1rIHJlc3RhcnQnLgotICAgICAqLwotICAgIHNpZ25hbF9yZXN0YXJ0X2V2ZW50ID0gQ3JlYXRlRXZlbnQoc2EsIFRSVUUsIEZBTFNFLCBzaWduYWxfcmVzdGFydF9uYW1lKTsKLSAgICBpZiAoIXNpZ25hbF9yZXN0YXJ0X2V2ZW50KSB7Ci0JQ2xvc2VIYW5kbGUoc2lnbmFsX3NodXRkb3duX2V2ZW50KTsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkd8QVBMT0dfV0lOMzJFUlJPUiwgc2VydmVyX2NvbmYsCi0JCSAgICAibWFzdGVyX21haW46IENhbm5vdCBjcmVhdGUgcmVzdGFydCBldmVudCAlcyIsIHNpZ25hbF9yZXN0YXJ0X25hbWUpOwotICAgICAgICBDbGVhbk51bGxBQ0woKHZvaWQgKilzYSk7Ci0JZXhpdCgxKTsKLSAgICB9Ci0gICAgQ2xlYW5OdWxsQUNMKCh2b2lkICopc2EpOwotCi0gICAgLyogQ3JlYXRlIHRoZSBzdGFydCBtdXRleCwgYXBQSUQsIHdoZXJlIFBJRCBpcyB0aGUgcGFyZW50IEFwYWNoZSBwcm9jZXNzIElELgotICAgICAqIFRocyBzdGFydCBtdXRleCBpcyB1c2VkIGR1cmluZyBhIHJlc3RhcnQgdG8gcHJldmVudCBtb3JlIHRoYW4gb25lIAotICAgICAqIGNoaWxkIHByb2Nlc3MgZnJvbSBlbnRlcmluZyB0aGUgYWNjZXB0IGxvb3AgYXQgb25jZS4KLSAgICAgKi8KLSAgICBzdGFydF9tdXRleCA9IGFwX2NyZWF0ZV9tdXRleChzaWduYWxfcHJlZml4X3N0cmluZyk7Ci0gICAgcmVzdGFydF9wZW5kaW5nID0gc2h1dGRvd25fcGVuZGluZyA9IDA7Ci0KLSAgICBkbyB7IC8qIHJlc3RhcnQtcGVuZGluZyAqLwotCWlmICghaXNfZ3JhY2VmdWwpIHsKLQkgICAgYXBfcmVzdGFydF90aW1lID0gdGltZShOVUxMKTsKLQl9Ci0gICAgICAgIGNvcHlfbGlzdGVuZXJzKHBjb25mKTsKLQlhcF9jbGVhcl9wb29sKHBjb25mKTsKLQlwcGFyZW50ID0gYXBfbWFrZV9zdWJfcG9vbChwY29uZik7Ci0KLQlzZXJ2ZXJfY29uZiA9IGFwX3JlYWRfY29uZmlnKHBjb25mLCBwcGFyZW50LCBhcF9zZXJ2ZXJfY29uZm5hbWUpOwotICAgICAgICBzZXR1cF9saXN0ZW5lcnMocGNvbmYpOwotCWFwX2NsZWFyX3Bvb2wocGxvZyk7Ci0JYXBfb3Blbl9sb2dzKHNlcnZlcl9jb25mLCBwbG9nKTsKLQlhcF9zZXRfdmVyc2lvbigpOwotCWFwX2luaXRfbW9kdWxlcyhwY29uZiwgc2VydmVyX2NvbmYpOwotCXZlcnNpb25fbG9ja2VkKys7Ci0gICAgICAgIHNlcnZpY2Vfc2V0X3N0YXR1cyhTRVJWSUNFX1NUQVJUX1BFTkRJTkcpOwotICAgICAgICAvKiBDcmVhdGUgY2hpbGQgcHJvY2Vzc2VzICovCi0gICAgICAgIHdoaWxlIChwcm9jZXNzZXNfdG9fY3JlYXRlLS0pIHsKLSAgICAgICAgICAgIGlmIChjcmVhdGVfcHJvY2VzcyhwY29uZiwgcHJvY2Vzc19oYW5kbGVzLCBwcm9jZXNzX2tpbGxfZXZlbnRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VycmVudF9saXZlX3Byb2Nlc3NlcywgJmNoaWxkX251bSwgc2lnbmFsX3ByZWZpeF9zdHJpbmcsIGFyZ2MsIGFyZ3YpIDwgMCkgewotICAgICAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFzdGVyX21haW46IGNyZWF0ZSBjaGlsZCBwcm9jZXNzIGZhaWxlZC4gRXhpdGluZy4iKTsKLSAgICAgICAgICAgICAgICBnb3RvIGRpZV9ub3c7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2VydmljZV9zZXRfc3RhdHVzKFNFUlZJQ0VfUlVOTklORyk7Ci0JcmVzdGFydF9wZW5kaW5nID0gc2h1dGRvd25fcGVuZGluZyA9IDA7Ci0KLSAgICAgICAgLyogV2FpdCBmb3IgZWl0aGVyIHRoZSBzaHV0ZG93biBvciByZXN0YXJ0IGV2ZW50cyB0byBiZSBzaWduYWxlZCAqLwotICAgICAgICBwcm9jZXNzX2hhbmRsZXNbY3VycmVudF9saXZlX3Byb2Nlc3Nlc10gPSBzaWduYWxfc2h1dGRvd25fZXZlbnQ7Ci0gICAgICAgIHByb2Nlc3NfaGFuZGxlc1tjdXJyZW50X2xpdmVfcHJvY2Vzc2VzKzFdID0gc2lnbmFsX3Jlc3RhcnRfZXZlbnQ7Ci0gICAgICAgIHJ2ID0gV2FpdEZvck11bHRpcGxlT2JqZWN0cyhjdXJyZW50X2xpdmVfcHJvY2Vzc2VzKzIsIChIQU5ETEUgKilwcm9jZXNzX2hhbmRsZXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIElORklOSVRFKTsKLSAgICAgICAgaWYgKHJ2ID09IFdBSVRfRkFJTEVEKSB7Ci0gICAgICAgICAgICAvKiBTb21ldGhpbmcgc2VyaW91cyBpcyB3cm9uZyAqLwotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfQ1JJVHxBUExPR19XSU4zMkVSUk9SLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAibWFzdGVyX21haW46IDogV2FpdEZvck11bHRpcGVPYmplY3RzIG9uIHByb2Nlc3MgaGFuZGxlcyBhbmQgYXBhY2hlLXNpZ25hbCAtLSBkb2luZyBzaHV0ZG93biIpOwotICAgICAgICAgICAgc2h1dGRvd25fcGVuZGluZyA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAocnYgPT0gV0FJVF9USU1FT1VUKSB7Ci0gICAgICAgICAgICAvKiBIZXksIHRoaXMgY2Fubm90IGhhcHBlbiAqLwotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIm1hc3Rlcl9tYWluOiBXYWl0Rm9yTXVsdGlwZU9iamVjdHMgd2l0aCBJTkZJTklURSB3YWl0IGV4aXRlZCB3aXRoIFdBSVRfVElNRU9VVCIpOwotICAgICAgICAgICAgc2h1dGRvd25fcGVuZGluZyA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBjbGQgPSBydiAtIFdBSVRfT0JKRUNUXzA7Ci0gICAgICAgIEFQRDQoIm1haW4gcHJvY2Vzczogd2FpdCBmaW5pc2hlZCwgY2xkPSVkIGhhbmRsZSAlZCAobWF4PSVkKSIsIGNsZCwgcHJvY2Vzc19oYW5kbGVzW2NsZF0sIGN1cnJlbnRfbGl2ZV9wcm9jZXNzZXMpOwotICAgICAgICBpZiAoY2xkID09IGN1cnJlbnRfbGl2ZV9wcm9jZXNzZXMpIHsKLSAgICAgICAgICAgIC8qIGFwUElEX3NodXRkb3duIGV2ZW50IHNpZ25hbGxlZCwgd2Ugc2hvdWxkIGV4aXQgbm93ICovCi0gICAgICAgICAgICBzaHV0ZG93bl9wZW5kaW5nID0gMTsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0lORk8sIHNlcnZlcl9jb25mLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAibWFzdGVyX21haW46IFNodXRkb3duIGV2ZW50IHNpZ25hbGVkLiBTaHV0dGluZyB0aGUgc2VydmVyIGRvd24uIik7Ci0gICAgICAgICAgICBpZiAoUmVzZXRFdmVudChzaWduYWxfc2h1dGRvd25fZXZlbnQpID09IDApIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSfEFQTE9HX1dJTjMyRVJST1IsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVzZXRFdmVudChzaWduYWxfc2h1dGRvd25fZXZlbnQpIik7Ci0gICAgICAgICAgICB9Ci0JICAgIC8qIFNpZ25hbCBlYWNoIGNoaWxkIHByb2Nlc3NlcyB0byBkaWUgKi8KLQkgICAgZm9yIChpID0gMDsgaSA8IGN1cnJlbnRfbGl2ZV9wcm9jZXNzZXM7IGkrKykgewotCQlBUEQzKCJtYXN0ZXJfbWFpbjogc2lnbmFsbGluZyBjaGlsZCAlZCwgaGFuZGxlICVkIHRvIGRpZSIsIGksIHByb2Nlc3NfaGFuZGxlc1tpXSk7Ci0JCWlmIChTZXRFdmVudChwcm9jZXNzX2tpbGxfZXZlbnRzW2ldKSA9PSAwKQotCQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfRVJSfEFQTE9HX1dJTjMyRVJST1IsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hc3Rlcl9tYWluOiBTZXRFdmVudCBmb3IgY2hpbGQgcHJvY2VzcyBpbiBzbG90ICMlZCBmYWlsZWQiLCBpKTsKLQkgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2xkID09IGN1cnJlbnRfbGl2ZV9wcm9jZXNzZXMrMSkgewotICAgICAgICAgICAgLyogYXBQSURfcmVzdGFydCBldmVudCBzaWduYWxsZWQsIHJlc3RhcnQgdGhlIGNoaWxkIHByb2Nlc3MgKi8KLSAgICAgICAgICAgIGludCBjaGlsZHJlbl90b19raWxsID0gY3VycmVudF9saXZlX3Byb2Nlc3NlczsKLSAgICAgICAgICAgIHJlc3RhcnRfcGVuZGluZyA9IDE7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19JTkZPLCBzZXJ2ZXJfY29uZiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIm1hc3Rlcl9tYWluOiBSZXN0YXJ0IGV2ZW50IHNpZ25hbGVkLiBEb2luZyBhIGdyYWNlZnVsIHJlc3RhcnQuIik7Ci0gICAgICAgICAgICBpZiAoUmVzZXRFdmVudChzaWduYWxfcmVzdGFydF9ldmVudCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlJ8QVBMT0dfV0lOMzJFUlJPUiwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXN0ZXJfbWFpbjogUmVzZXRFdmVudChzaWduYWxfcmVzdGFydF9ldmVudCkgZmFpbGVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogU2lnbmFsIGVhY2ggY2hpbGQgcHJvY2VzcyB0byBkaWUgKi8KLQkgICAgZm9yIChpID0gMDsgaSA8IGNoaWxkcmVuX3RvX2tpbGw7IGkrKykgewotCQlBUEQzKCJtYXN0ZXJfbWFpbjogc2lnbmFsbGluZyBjaGlsZCAjJWQgaGFuZGxlICVkIHRvIGRpZSIsIGksIHByb2Nlc3NfaGFuZGxlc1tpXSk7Ci0JCWlmIChTZXRFdmVudChwcm9jZXNzX2tpbGxfZXZlbnRzW2ldKSA9PSAwKQotCQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUnxBUExPR19XSU4zMkVSUk9SLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXN0ZXJfbWFpbjogU2V0RXZlbnQgZm9yIGNoaWxkIHByb2Nlc3MgaW4gc2xvdCAjJWQgZmFpbGVkIiwgaSk7Ci0gICAgICAgICAgICAgICAgLyogUmVtb3ZlIHRoZSBwcm9jZXNzIChhbmQgZXZlbnQpIGZyb20gdGhlIHByb2Nlc3MgdGFibGUgKi8KLSAgICAgICAgICAgICAgICBjbGVhbnVwX3Byb2Nlc3MocHJvY2Vzc19oYW5kbGVzLCBwcm9jZXNzX2tpbGxfZXZlbnRzLCBpLCAmY3VycmVudF9saXZlX3Byb2Nlc3Nlcyk7Ci0JICAgIH0KLQkgICAgcHJvY2Vzc2VzX3RvX2NyZWF0ZSA9IG5jaGlsZDsKLSAgICAgICAgICAgICsrYXBfbXlfZ2VuZXJhdGlvbjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogQSBjaGlsZCBwcm9jZXNzIG11c3QgaGF2ZSBleGl0ZWQgYmVjYXVzZSBvZiBNYXhSZXF1ZXN0UGVyQ2hpbGQgYmVpbmcgaGl0Ci0gICAgICAgICAgICAgKiBvciBhIGZhdGFsIGVycm9yIGNvbmRpdGlvbiAoc2VnIGZhdWx0LCBldGMuKS4gUmVtb3ZlIHRoZSBkZWFkIHByb2Nlc3MgCi0gICAgICAgICAgICAgKiBmcm9tIHRoZSBwcm9jZXNzX2hhbmRsZXMgYW5kIHByb2Nlc3Nfa2lsbF9ldmVudHMgdGFibGUgYW5kIGNyZWF0ZSBhIG5ldwotICAgICAgICAgICAgICogY2hpbGQgcHJvY2Vzcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgc2VydmVyX2NvbmYsIAotICAgICAgICAgICAgICAgICAgICAgICAgICJtYXN0ZXJfbWFpbjogQ2hpbGQgcHJvY2Vzc2VkIGV4aXRlZCAoZHVlIHRvIE1heFJlcXVlc3RzUGVyQ2hpbGQ/KS4gUmVzdGFydGluZyB0aGUgY2hpbGQgcHJvY2Vzcy4iKTsKLQkgICAgYXBfYXNzZXJ0KGNsZCA8IGN1cnJlbnRfbGl2ZV9wcm9jZXNzZXMpOwotCSAgICBjbGVhbnVwX3Byb2Nlc3MocHJvY2Vzc19oYW5kbGVzLCBwcm9jZXNzX2tpbGxfZXZlbnRzLCBjbGQsICZjdXJyZW50X2xpdmVfcHJvY2Vzc2VzKTsKLQkgICAgQVBEMigibWFpbl9wcm9jZXNzOiBjaGlsZCBpbiBzbG90ICVkIGRpZWQiLCBydik7Ci0gICAgICAgICAgICBwcm9jZXNzZXNfdG9fY3JlYXRlID0gMTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCX0KLQotICAgIH0gd2hpbGUgKDEpOwotCi0gICAgLyogSWYgd2UgZHJvcHBlZCBvdXQgb2YgdGhlIGxvb3Agd2UgZGVmaW5pdGx5IHdhbnQgdG8gZGllIGNvbXBsZXRlbHkuIFdlIG5lZWQgdG8KLSAgICAgKiBtYWtlIHN1cmUgd2Ugd2FpdCBmb3IgYWxsIHRoZSBjaGlsZCBwcm9jZXNzIHRvIGV4aXQgZmlyc3QuCi0gICAgICovCi0KLSAgICBBUEQyKCIqKiogbWFpbiBwcm9jZXNzIHNodXRkb3duLCBwcm9jZXNzZXM9JWQgKioqIiwgY3VycmVudF9saXZlX3Byb2Nlc3Nlcyk7Ci0KLWRpZV9ub3c6Ci0KLSAgICB0bXN0YXJ0ID0gdGltZShOVUxMKTsKLSAgICB3aGlsZSAoY3VycmVudF9saXZlX3Byb2Nlc3NlcyAmJiAoKHRtc3RhcnQrNjApID4gdGltZShOVUxMKSkpIHsKLQlzZXJ2aWNlX3NldF9zdGF0dXMoU0VSVklDRV9TVE9QX1BFTkRJTkcpOwotCXJ2ID0gV2FpdEZvck11bHRpcGxlT2JqZWN0cyhjdXJyZW50X2xpdmVfcHJvY2Vzc2VzLCAoSEFORExFICopcHJvY2Vzc19oYW5kbGVzLCBGQUxTRSwgMjAwMCk7Ci0JaWYgKHJ2ID09IFdBSVRfVElNRU9VVCkKLQkgICAgY29udGludWU7Ci0JYXBfYXNzZXJ0KHJ2ICE9IFdBSVRfRkFJTEVEKTsKLQljbGQgPSBydiAtIFdBSVRfT0JKRUNUXzA7Ci0JYXBfYXNzZXJ0KHJ2IDwgY3VycmVudF9saXZlX3Byb2Nlc3Nlcyk7Ci0JQVBENCgibWFpbl9wcm9jZXNzOiBjaGlsZCBpbiAjJWQgaGFuZGxlICVkIGRpZWQsIGxlZnQ9JWQiLCAKLQkgICAgcnYsIHByb2Nlc3NfaGFuZGxlc1tydl0sIGN1cnJlbnRfbGl2ZV9wcm9jZXNzZXMpOwotCWNsZWFudXBfcHJvY2Vzcyhwcm9jZXNzX2hhbmRsZXMsIHByb2Nlc3Nfa2lsbF9ldmVudHMsIGNsZCwgJmN1cnJlbnRfbGl2ZV9wcm9jZXNzZXMpOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgY3VycmVudF9saXZlX3Byb2Nlc3NlczsgaSsrKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfRVJSfEFQTE9HX05PRVJSTk8sIHNlcnZlcl9jb25mLAotIAkgICAgImZvcmNpbmcgdGVybWluYXRpb24gb2YgY2hpbGQgIyVkIChoYW5kbGUgJWQpIiwgaSwgcHJvY2Vzc19oYW5kbGVzW2ldKTsKLQlUZXJtaW5hdGVQcm9jZXNzKChIQU5ETEUpIHByb2Nlc3NfaGFuZGxlc1tpXSwgMSk7Ci0gICAgfQotCi0gICAgQ2xvc2VIYW5kbGUoc2lnbmFsX3Jlc3RhcnRfZXZlbnQpOwotICAgIENsb3NlSGFuZGxlKHNpZ25hbF9zaHV0ZG93bl9ldmVudCk7Ci0KLSAgICAvKiBjbGVhbnVwIHBpZCBmaWxlIG9uIG5vcm1hbCBzaHV0ZG93biAqLwotICAgIHsKLQljb25zdCBjaGFyICpwaWRmaWxlID0gTlVMTDsKLQlwaWRmaWxlID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUgKHBwYXJlbnQsIGFwX3BpZF9mbmFtZSk7Ci0JaWYgKCBwaWRmaWxlICE9IE5VTEwgJiYgdW5saW5rKHBpZGZpbGUpID09IDApCi0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0lORk8sCi0JCQkgc2VydmVyX2NvbmYsCi0JCQkgInJlbW92ZWQgUElEIGZpbGUgJXMgKHBpZD0lbGQpIiwKLQkJCSBwaWRmaWxlLCAobG9uZylnZXRwaWQoKSk7Ci0gICAgfQotCi0gICAgaWYgKHBwYXJlbnQpIHsKLQlhcF9kZXN0cm95X3Bvb2wocHBhcmVudCk7Ci0gICAgfQotCi0gICAgYXBfZGVzdHJveV9tdXRleChzdGFydF9tdXRleCk7Ci0KLSAgICBzZXJ2aWNlX3NldF9zdGF0dXMoU0VSVklDRV9TVE9QUEVEKTsKLSAgICByZXR1cm4gKDApOwotfQotCi0vKgotICogU2VuZCBzaWduYWwgdG8gYSBydW5uaW5nIEFwYWNoZS4gT24gZW50cnkgc2lnbmFsIHNob3VsZCBjb250YWluCi0gKiBlaXRoZXIgInNodXRkb3duIiBvciAicmVzdGFydCIKLSAqLwotCi1pbnQgc2VuZF9zaWduYWwocG9vbCAqcCwgY2hhciAqc2lnbmFsKQotewotICAgIGNoYXIgcHJlZml4WzIwXTsKLSAgICBGSUxFICpmcDsKLSAgICBpbnQgbnJlYWQ7Ci0gICAgY2hhciAqZm5hbWU7Ci0gICAgaW50IGVuZDsKLQotICAgIGZuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUgKHAsIGFwX3BpZF9mbmFtZSk7Ci0KLSAgICBmcCA9IGZvcGVuKGZuYW1lLCAiciIpOwotICAgIGlmICghZnApIHsKLQlwcmludGYoIkNhbm5vdCByZWFkIGFwYWNoZSBQSUQgZmlsZSAlc1xuIiwgZm5hbWUpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHByZWZpeFswXSA9ICdhJzsKLSAgICBwcmVmaXhbMV0gPSAncCc7Ci0KLSAgICBucmVhZCA9IGZyZWFkKHByZWZpeCsyLCAxLCBzaXplb2YocHJlZml4KS0zLCBmcCk7Ci0gICAgaWYgKG5yZWFkID09IDApIHsKLQlmY2xvc2UoZnApOwotCXByaW50ZigiUElEIGZpbGUgJXMgd2FzIGVtcHR5XG4iLCBmbmFtZSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgZmNsb3NlKGZwKTsKLQotICAgIC8qIFRlcm1pbmF0ZSB0aGUgcHJlZml4IHN0cmluZyAqLwotICAgIGVuZCA9IDIgKyBucmVhZCAtIDE7Ci0gICAgd2hpbGUgKGVuZCA+IDAgJiYgKHByZWZpeFtlbmRdID09ICdccicgfHwgcHJlZml4W2VuZF0gPT0gJ1xuJykpCi0JZW5kLS07Ci0gICAgcHJlZml4W2VuZCArIDFdID0gJ1wwJzsKLQotICAgIHNldHVwX3NpZ25hbF9uYW1lcyhwcmVmaXgpOwotCi0gICAgaWYgKCFzdHJjYXNlY21wKHNpZ25hbCwgInNodXRkb3duIikpCi0JYXBfc3RhcnRfc2h1dGRvd24oKTsKLSAgICBlbHNlIGlmICghc3RyY2FzZWNtcChzaWduYWwsICJyZXN0YXJ0IikpCi0JYXBfc3RhcnRfcmVzdGFydCgxKTsKLSAgICBlbHNlIHsKLQlwcmludGYoIlVua25vd24gc2lnbmFsIG5hbWUgXCIlc1wiLiBVc2UgZWl0aGVyIHNodXRkb3duIG9yIHJlc3RhcnQuXG4iLAotCSAgICBzaWduYWwpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotCi12b2lkIHBvc3RfcGFyc2VfaW5pdCgpCi17Ci0gICAgYXBfc2V0X3ZlcnNpb24oKTsKLSAgICBhcF9pbml0X21vZHVsZXMocGNvbmYsIHNlcnZlcl9jb25mKTsKLSAgICBhcF9zdWV4ZWNfZW5hYmxlZCA9IGluaXRfc3VleGVjKCk7Ci0gICAgdmVyc2lvbl9sb2NrZWQrKzsKLSAgICBhcF9vcGVuX2xvZ3Moc2VydmVyX2NvbmYsIHBsb2cpOwotICAgIHNldF9ncm91cF9wcml2cygpOwotfQotCi1pbnQgc2VydmljZV9pbml0KCkKLXsKLSAgICBjb21tb25faW5pdCgpOwotIAotICAgIGFwX2NweXN0cm4oYXBfc2VydmVyX3Jvb3QsIEhUVFBEX1JPT1QsIHNpemVvZihhcF9zZXJ2ZXJfcm9vdCkpOwotICAgIGlmIChhcF9yZWdpc3RyeV9nZXRfc2VydmljZV9jb25mKHBjb25mLCBhcF9zZXJ2ZXJfY29uZm5hbWUsIHNpemVvZihhcF9zZXJ2ZXJfY29uZm5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX3NlcnZlcl9hcmd2MCkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIGFwX3NldHVwX3ByZWxpbmtlZF9tb2R1bGVzKCk7Ci0gICAgc2VydmVyX2NvbmYgPSBhcF9yZWFkX2NvbmZpZyhwY29uZiwgcHRyYW5zLCBhcF9zZXJ2ZXJfY29uZm5hbWUpOwotICAgIGFwX2xvZ19waWQocGNvbmYsIGFwX3BpZF9mbmFtZSk7Ci0gICAgcG9zdF9wYXJzZV9pbml0KCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLSNpZmRlZiBXSU4zMgotX19kZWNsc3BlYyhkbGxleHBvcnQpCi0gICAgIGludCBhcGFjaGVfbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotI2Vsc2UKLWludCBSRUFMTUFJTihpbnQgYXJnYywgY2hhciAqYXJndltdKSAKLSNlbmRpZgotewotICAgIGludCBjOwotICAgIGludCBjaGlsZCA9IDA7Ci0gICAgY2hhciAqY3A7Ci0gICAgY2hhciAqczsKLSAgICBjaGFyICpzZXJ2aWNlX25hbWUgPSBOVUxMOwotICAgIGludCBpbnN0YWxsID0gMDsKLSAgICBpbnQgY29uZl9zcGVjaWZpZWQgPSAwOwotICAgIGNoYXIgKnNpZ25hbF90b19zZW5kID0gTlVMTDsKLSAgICBjaGFyIGN3ZFtNQVhfU1RSSU5HX0xFTl07Ci0KLSAgICAvKiBTZXJ2aWNlIGFwcGxpY2F0aW9uCi0gICAgICogQ29uZmlndXJhdGlvbiBmaWxlIGluIHJlZ2lzdHJ5IGF0OgotICAgICAqIEhLTE1cU3lzdGVtXEN1cnJlbnRDb250cm9sU2V0XFNlcnZpY2VzXFtTdmMgbmFtZV1cUGFyYW1ldGVyc1xDb25mUGF0aAotICAgICAqLwotICAgIGlmIChpc1Byb2Nlc3NTZXJ2aWNlKCkpIHsKLSAgICAgICAgc2VydmljZV9tYWluKG1hc3Rlcl9tYWluLCBhcmdjLCBhcmd2KTsKLSAgICAgICAgY2xlYW5fcGFyZW50X2V4aXQoMCk7Ci0gICAgfQotCi0gICAgLyogQ29uc29sZSBhcHBsaWNhdGlvbiBvciBhIGNoaWxkIHByb2Nlc3MuICovCi0KLSAgICBpZiAoKHMgPSBzdHJyY2hyKGFyZ3ZbMF0sIFBBVEhTRVBBUkFUT1IpKSAhPSBOVUxMKSB7Ci0gICAgICAgIGFwX3NlcnZlcl9hcmd2MCA9ICsrczsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGFwX3NlcnZlcl9hcmd2MCA9IGFyZ3ZbMF07Ci0gICAgfQotCi0gICAgY29tbW9uX2luaXQoKTsKLSAgICBhcF9zZXR1cF9wcmVsaW5rZWRfbW9kdWxlcygpOwotCi0gICAgaWYoIUdldEN1cnJlbnREaXJlY3Rvcnkoc2l6ZW9mKGN3ZCksY3dkKSkgewotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLEFQTE9HX1dJTjMyRVJST1IsIE5VTEwsCi0gICAgICAgIkdldEN1cnJlbnREaXJlY3RvcnkoKSBmYWlsdXJlIik7Ci0gICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGFwX2NweXN0cm4oY3dkLCBhcF9vc19jYW5vbmljYWxfZmlsZW5hbWUocGNvbW1hbmRzLCBjd2QpLCBzaXplb2YoY3dkKSk7Ci0gICAgYXBfY3B5c3RybihhcF9zZXJ2ZXJfcm9vdCwgY3dkLCBzaXplb2YoYXBfc2VydmVyX3Jvb3QpKTsKLQotICAgIHdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiRDpDOmM6WGQ6Zjp2VmxMWjppdXNTdFRoazpuOiIpKSAhPSAtMSkgewotICAgICAgICBjaGFyICoqbmV3OwotCXN3aXRjaCAoYykgewotCWNhc2UgJ2MnOgotCSAgICBuZXcgPSAoY2hhciAqKilhcF9wdXNoX2FycmF5KGFwX3NlcnZlcl9wb3N0X3JlYWRfY29uZmlnKTsKLQkgICAgKm5ldyA9IGFwX3BzdHJkdXAocGNvbW1hbmRzLCBvcHRhcmcpOwotCSAgICBicmVhazsKLQljYXNlICdDJzoKLQkgICAgbmV3ID0gKGNoYXIgKiopYXBfcHVzaF9hcnJheShhcF9zZXJ2ZXJfcHJlX3JlYWRfY29uZmlnKTsKLQkgICAgKm5ldyA9IGFwX3BzdHJkdXAocGNvbW1hbmRzLCBvcHRhcmcpOwotCSAgICBicmVhazsKLQljYXNlICdEJzoKLQkgICAgbmV3ID0gKGNoYXIgKiopYXBfcHVzaF9hcnJheShhcF9zZXJ2ZXJfY29uZmlnX2RlZmluZXMpOwotCSAgICAqbmV3ID0gYXBfcHN0cmR1cChwY29tbWFuZHMsIG9wdGFyZyk7Ci0JICAgIGJyZWFrOwotI2lmZGVmIFdJTjMyCi0JY2FzZSAnWic6Ci0JICAgIGV4aXRfZXZlbnQgPSBvcGVuX2V2ZW50KG9wdGFyZyk7Ci0JICAgIEFQRDIoImNoaWxkOiBvcGVuZWQgcHJvY2VzcyBldmVudCAlcyIsIG9wdGFyZyk7Ci0JICAgIGNwID0gc3RyY2hyKG9wdGFyZywgJ18nKTsKLQkgICAgYXBfYXNzZXJ0KGNwKTsKLQkgICAgKmNwID0gMDsKLQkgICAgc2V0dXBfc2lnbmFsX25hbWVzKG9wdGFyZyk7Ci0JICAgIHN0YXJ0X211dGV4ID0gYXBfb3Blbl9tdXRleChzaWduYWxfbmFtZV9wcmVmaXgpOwotCSAgICBhcF9hc3NlcnQoc3RhcnRfbXV0ZXgpOwotCSAgICBjaGlsZCA9IDE7Ci0JICAgIGJyZWFrOwotICAgICAgICBjYXNlICduJzoKLSAgICAgICAgICAgIHNlcnZpY2VfbmFtZSA9IGFwX3BzdHJkdXAocGNvbW1hbmRzLCBvcHRhcmcpOwotICAgICAgICAgICAgaWYgKGlzVmFsaWRTZXJ2aWNlKG9wdGFyZykpIHsKLSAgICAgICAgICAgICAgICBhcF9yZWdpc3RyeV9nZXRfc2VydmljZV9jb25mKHBjb25mLCBhcF9zZXJ2ZXJfY29uZm5hbWUsIHNpemVvZihhcF9zZXJ2ZXJfY29uZm5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0YXJnKTsKLSAgICAgICAgICAgICAgICBjb25mX3NwZWNpZmllZCA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQljYXNlICdpJzoKLQkgICAgaW5zdGFsbCA9IDE7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ3UnOgotCSAgICBpbnN0YWxsID0gLTE7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ1MnOgotCSAgICBhcF9kdW1wX3NldHRpbmdzID0gMTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnayc6Ci0JICAgIHNpZ25hbF90b19zZW5kID0gb3B0YXJnOwotCSAgICBicmVhazsKLSNlbmRpZiAvKiBXSU4zMiAqLwotCWNhc2UgJ2QnOgotICAgICAgICAgICAgb3B0YXJnID0gYXBfb3NfY2Fub25pY2FsX2ZpbGVuYW1lKHBjb21tYW5kcywgb3B0YXJnKTsKLSAgICAgICAgICAgIGlmICghYXBfb3NfaXNfcGF0aF9hYnNvbHV0ZShvcHRhcmcpKSB7Ci0JICAgICAgICBvcHRhcmcgPSBhcF9wc3RyY2F0KHBjb21tYW5kcywgY3dkLCBvcHRhcmcsIE5VTEwpOwotICAgICAgICAgICAgICAgIGFwX2dldHBhcmVudHMob3B0YXJnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvcHRhcmdbc3RybGVuKG9wdGFyZyktMV0gIT0gJy8nKQotICAgICAgICAgICAgICAgIG9wdGFyZyA9IGFwX3BzdHJjYXQocGNvbW1hbmRzLCBvcHRhcmcsICIvIiwgTlVMTCk7Ci0gICAgICAgICAgICBhcF9jcHlzdHJuKGFwX3NlcnZlcl9yb290LAotICAgICAgICAgICAgICAgICAgICAgICBvcHRhcmcsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcF9zZXJ2ZXJfcm9vdCkpOwotCSAgICBicmVhazsKLQljYXNlICdmJzoKLSAgICAgICAgICAgIGFwX2NweXN0cm4oYXBfc2VydmVyX2NvbmZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBhcF9vc19jYW5vbmljYWxfZmlsZW5hbWUocGNvbW1hbmRzLCBvcHRhcmcpLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXBfc2VydmVyX2NvbmZuYW1lKSk7Ci0gICAgICAgICAgICBjb25mX3NwZWNpZmllZCA9IDE7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ3YnOgotCSAgICBhcF9zZXRfdmVyc2lvbigpOwotCSAgICBwcmludGYoIlNlcnZlciB2ZXJzaW9uOiAlc1xuIiwgYXBfZ2V0X3NlcnZlcl92ZXJzaW9uKCkpOwotCSAgICBwcmludGYoIlNlcnZlciBidWlsdDogICAlc1xuIiwgYXBfZ2V0X3NlcnZlcl9idWlsdCgpKTsKLQkgICAgZXhpdCgwKTsKLQljYXNlICdWJzoKLQkgICAgYXBfc2V0X3ZlcnNpb24oKTsKLQkgICAgc2hvd19jb21waWxlX3NldHRpbmdzKCk7Ci0JICAgIGV4aXQoMCk7Ci0JY2FzZSAnbCc6Ci0JICAgIGFwX3Nob3dfbW9kdWxlcygpOwotCSAgICBleGl0KDApOwotCWNhc2UgJ0wnOgotCSAgICBhcF9zaG93X2RpcmVjdGl2ZXMoKTsKLQkgICAgZXhpdCgwKTsKLQljYXNlICdYJzoKLQkgICAgKytvbmVfcHJvY2VzczsJLyogV2VpcmQgZGVidWdnaW5nIG1vZGUuICovCi0JICAgIGJyZWFrOwotCWNhc2UgJ3QnOgotCSAgICBhcF9jb25maWd0ZXN0b25seSA9IDE7Ci0JICAgIGFwX2RvY3Jvb3RjaGVjayA9IDE7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ1QnOgotCSAgICBhcF9jb25maWd0ZXN0b25seSA9IDE7Ci0JICAgIGFwX2RvY3Jvb3RjaGVjayA9IDA7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgICB1c2FnZShhcF9zZXJ2ZXJfYXJndjApOwotCWNhc2UgJz8nOgotCSAgICB1c2FnZShhcF9zZXJ2ZXJfYXJndjApOwotICAgICAgICB9ICAgLyogc3dpdGNoICovCi0gICAgfSAgICAgICAvKiB3aGlsZSAgKi8KLQotICAgIC8qIFNlcnZlckNvbmZGaWxlIGlzIGZvdW5kIGluIHRoaXMgb3JkZXI6Ci0gICAgICogKDEpIC1mIG9yIC1uCi0gICAgICogKDIpIFstZF0vU0VSVkVSX0NPTkZJR19GSUxFCi0gICAgICogKDMpIC4vU0VSVkVSX0NPTkZJR19GSUxFCi0gICAgICogKDQpIFtSZWdpc3RyeTogSEtMTVxTb2Z0d2FyZVxbcHJvZHVjdF1cU2VydmVyUm9vdF0vU0VSVkVSX0NPTkZJR19GSUxFCi0gICAgICogKDUpIC9IVFRQRF9ST09UL1NFUlZFUl9DT05GSUdfRklMRQotICAgICAqLwotCi0gICAgaWYgKCFjb25mX3NwZWNpZmllZCkgewotICAgICAgICBhcF9jcHlzdHJuKGFwX3NlcnZlcl9jb25mbmFtZSwgU0VSVkVSX0NPTkZJR19GSUxFLCBzaXplb2YoYXBfc2VydmVyX2NvbmZuYW1lKSk7Ci0gICAgICAgIGlmIChhY2Nlc3MoYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocGNvbW1hbmRzLCBhcF9zZXJ2ZXJfY29uZm5hbWUpLCAwKSkgewotICAgICAgICAgICAgYXBfcmVnaXN0cnlfZ2V0X3NlcnZlcl9yb290KHBjb25mLCBhcF9zZXJ2ZXJfcm9vdCwgc2l6ZW9mKGFwX3NlcnZlcl9yb290KSk7Ci0gICAgICAgICAgICBpZiAoISphcF9zZXJ2ZXJfcm9vdCkKLSAgICAgICAgICAgICAgICBhcF9jcHlzdHJuKGFwX3NlcnZlcl9yb290LCBIVFRQRF9ST09ULCBzaXplb2YoYXBfc2VydmVyX3Jvb3QpKTsKLSAgICAgICAgICAgIGFwX2NweXN0cm4oYXBfc2VydmVyX3Jvb3QsIGFwX29zX2Nhbm9uaWNhbF9maWxlbmFtZShwY29tbWFuZHMsIGFwX3NlcnZlcl9yb290KSwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwX3NlcnZlcl9yb290KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWFwX29zX2lzX3BhdGhfYWJzb2x1dGUoYXBfc2VydmVyX2NvbmZuYW1lKSkgewotICAgICAgICBjaGFyICpmdWxsX2NvbmZfcGF0aDsKLQotICAgICAgICBmdWxsX2NvbmZfcGF0aCA9IGFwX3BzdHJjYXQocGNvbW1hbmRzLCBhcF9zZXJ2ZXJfcm9vdCwgIi8iLCBhcF9zZXJ2ZXJfY29uZm5hbWUsIE5VTEwpOwotICAgICAgICBmdWxsX2NvbmZfcGF0aCA9IGFwX29zX2Nhbm9uaWNhbF9maWxlbmFtZShwY29tbWFuZHMsIGZ1bGxfY29uZl9wYXRoKTsKLSAgICAgICAgYXBfY3B5c3RybihhcF9zZXJ2ZXJfY29uZm5hbWUsIGZ1bGxfY29uZl9wYXRoLCBzaXplb2YoYXBfc2VydmVyX2NvbmZuYW1lKSk7Ci0gICAgfQotICAgIGFwX2dldHBhcmVudHMoYXBfc2VydmVyX2NvbmZuYW1lKTsKLSAgICBhcF9ubzJzbGFzaChhcF9zZXJ2ZXJfY29uZm5hbWUpOwotCi0jaWZkZWYgV0lOMzIKLSAgICBpZiAoaW5zdGFsbCkgewotICAgICAgICBpZiAoIXNlcnZpY2VfbmFtZSkKLSAgICAgICAgICAgIHNlcnZpY2VfbmFtZSA9IGFwX3BzdHJkdXAocGNvbmYsIERFRkFVTFRTRVJWSUNFTkFNRSk7Ci0gICAgICAgIGlmIChpbnN0YWxsID4gMCkgCi0gICAgICAgICAgICBJbnN0YWxsU2VydmljZShzZXJ2aWNlX25hbWUsIGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHBjb21tYW5kcywgYXBfc2VydmVyX2NvbmZuYW1lKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIFJlbW92ZVNlcnZpY2Uoc2VydmljZV9uYW1lKTsKLSAgICAgICAgY2xlYW5fcGFyZW50X2V4aXQoMCk7Ci0gICAgfQotICAgIAotICAgIGlmIChzZXJ2aWNlX25hbWUgJiYgc2lnbmFsX3RvX3NlbmQpIHsKLSAgICAgICAgc2VuZF9zaWduYWxfdG9fc2VydmljZShzZXJ2aWNlX25hbWUsIHNpZ25hbF90b19zZW5kKTsKLSAgICAgICAgY2xlYW5fcGFyZW50X2V4aXQoMCk7Ci0gICAgfQotCi0gICAgaWYgKHNlcnZpY2VfbmFtZSAmJiAhY29uZl9zcGVjaWZpZWQpIHsKLSAgICAgICAgcHJpbnRmKCJVbmtub3duIHNlcnZpY2U6ICVzXG4iLCBzZXJ2aWNlX25hbWUpOwotICAgICAgICBjbGVhbl9wYXJlbnRfZXhpdCgwKTsKLSAgICB9Ci0jZW5kaWYKLSAgICBzZXJ2ZXJfY29uZiA9IGFwX3JlYWRfY29uZmlnKHBjb25mLCBwdHJhbnMsIGFwX3NlcnZlcl9jb25mbmFtZSk7Ci0KLSAgICBpZiAoYXBfY29uZmlndGVzdG9ubHkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogU3ludGF4IE9LXG4iLCBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShwY29tbWFuZHMsIGFwX3NlcnZlcl9jb25mbmFtZSkpOwotICAgICAgICBjbGVhbl9wYXJlbnRfZXhpdCgwKTsKLSAgICB9Ci0KLSAgICBpZiAoYXBfZHVtcF9zZXR0aW5ncykgewotICAgICAgICBjbGVhbl9wYXJlbnRfZXhpdCgwKTsKLSAgICB9Ci0KLSAgICAvKiBUcmVhdCAtayBzdGFydCBjb25mcGF0aCBhcyBqdXN0IC1mIGNvbmZwYXRoICovCi0gICAgaWYgKHNpZ25hbF90b19zZW5kICYmIHN0cmNhc2VjbXAoc2lnbmFsX3RvX3NlbmQsICJzdGFydCIpKSB7Ci0gICAgICAgIHNlbmRfc2lnbmFsKHBjb25mLCBzaWduYWxfdG9fc2VuZCk7Ci0gICAgICAgIGNsZWFuX3BhcmVudF9leGl0KDApOwotICAgIH0KLQotICAgIGlmICghY2hpbGQgJiYgIWFwX2R1bXBfc2V0dGluZ3MpIHsgCi0gICAgICAgIGFwX2xvZ19waWQocGNvbmYsIGFwX3BpZF9mbmFtZSk7Ci0gICAgfQotCi0gICAgcG9zdF9wYXJzZV9pbml0KCk7Ci0KLSNpZmRlZiBPUzIKLSAgICBwcmludGYoIiVzIHJ1bm5pbmcuLi5cbiIsIGFwX2dldF9zZXJ2ZXJfdmVyc2lvbigpKTsKLSNlbmRpZgotI2lmZGVmIFdJTjMyCi0gICAgaWYgKCFjaGlsZCkgewotCXByaW50ZigiJXMgcnVubmluZy4uLlxuIiwgYXBfZ2V0X3NlcnZlcl92ZXJzaW9uKCkpOwotICAgIH0KLSNlbmRpZgotICAgIGlmIChvbmVfcHJvY2VzcyAmJiAhZXhpdF9ldmVudCkKLQlleGl0X2V2ZW50ID0gY3JlYXRlX2V2ZW50KDAsIDAsIE5VTEwpOwotICAgIGlmIChvbmVfcHJvY2VzcyAmJiAhc3RhcnRfbXV0ZXgpCi0Jc3RhcnRfbXV0ZXggPSBhcF9jcmVhdGVfbXV0ZXgoTlVMTCk7Ci0gICAgLyoKLSAgICAgKiBJbiB0aGUgZnV0dXJlLCB0aGUgbWFpbiB3aWxsIHNwYXduIG9mZiBhIGNvdXBsZQotICAgICAqIG9mIGNoaWxkcmVuIGFuZCBtb25pdG9yIHRoZW0uIEFzIHNvb24gYXMgYSBjaGlsZAotICAgICAqIGV4aXRzLCBpdCBzcGF3bnMgb2ZmIGEgbmV3IG9uZQotICAgICAqLwotICAgIGlmIChjaGlsZCB8fCBvbmVfcHJvY2VzcykgewotCWlmICghZXhpdF9ldmVudCB8fCAhc3RhcnRfbXV0ZXgpCi0JICAgIGV4aXQoLTEpOwotCXdvcmtlcl9tYWluKCk7Ci0JYXBfZGVzdHJveV9tdXRleChzdGFydF9tdXRleCk7Ci0JZGVzdHJveV9ldmVudChleGl0X2V2ZW50KTsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICAgICAgbWFzdGVyX21haW4oYXJnYywgYXJndik7Ci0KLSAgICBjbGVhbl9wYXJlbnRfZXhpdCgwKTsKLSAgICByZXR1cm4gMDsJLyogcHVyZWx5IHRvIGF2b2lkIGEgd2FybmluZyAqLwotfQotCi0jZW5kaWYgLyogbmRlZiBNVUxUSVRIUkVBRCAqLwotCi0jZWxzZSAgLyogbmRlZiBTSEFSRURfQ09SRV9USUVTVEFUSUMgKi8KLQotLyoKLSoqICBTdGFuZGFsb25lIFRpZSBQcm9ncmFtIGZvciBTaGFyZWQgQ29yZSBzdXBwb3J0Ci0qKgotKiogIEl0J3MgcHVycG9zZSBpcyB0byB0aWUgdGhlIHN0YXRpYyBsaWJyYXJpZXMgYW5kIAotKiogIHRoZSBzaGFyZWQgY29yZSBsaWJyYXJ5IHVuZGVyIGxpbmstdGltZSBhbmQgIAotKiogIHBhc3NpbmcgZXhlY3V0aW9uIGNvbnRyb2wgdG8gdGhlIHJlYWwgbWFpbiBmdW5jdGlvbgotKiogIGluIHRoZSBzaGFyZWQgY29yZSBsaWJyYXJ5IHVuZGVyIHJ1bi10aW1lLgotKi8KLQotZXh0ZXJuIGludCBhcF9tYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pOwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSAKLXsKLSAgICByZXR1cm4gYXBfbWFpbihhcmdjLCBhcmd2KTsKLX0KLQotI2VuZGlmIC8qIG5kZWYgU0hBUkVEX0NPUkVfVElFU1RBVElDICovCi0jZWxzZSAgLyogbmRlZiBTSEFSRURfQ09SRV9CT09UU1RSQVAgKi8KLQotI2lmZGVmIE9TMgotLyogU2hhcmVkIGNvcmUgbG9hZGVyIGZvciBPUy8yICovCi0KLWludCBhcF9tYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pOyAvKiBMb2FkIHRpbWUgbGlua2VkIGZyb20gbGliaHR0cGQuZGxsICovCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gICAgcmV0dXJuIGFwX21haW4oYXJnYywgYXJndik7Ci19Ci0KLSNlbHNlCi0KLS8qCi0qKiAgU3RhbmRhbG9uZSBCb290c3RyYXAgUHJvZ3JhbSBmb3IgU2hhcmVkIENvcmUgc3VwcG9ydAotKioKLSoqICBJdCdzIHB1cnBvc2UgaXMgdG8gaW5pdGlhbGlzZSB0aGUgTERfTElCUkFSWV9QQVRICi0qKiAgZW52aXJvbm1lbnQgdmFyaWFibGUgdGhlcmV3aXRoIHRoZSBVbml4IGxvYWRlciBpcyBhYmxlCi0qKiAgdG8gc3RhcnQgdGhlIFN0YW5kYWxvbmUgVGllIFByb2dyYW0gKHNlZSBhYm92ZSkKLSoqICBhbmQgdGhlbiByZXBsYWNpbmcgaXRzZWxmIHdpdGggdGhpcyBwcm9ncmFtIGJ5Ci0qKiAgaW1tZWRpYXRlbHkgcGFzc2luZyBleGVjdXRpb24gdG8gaXQuCi0qLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBkLmgiCi0KLSNpZiBkZWZpbmVkKEhQVVgpIHx8IGRlZmluZWQoSFBVWDEwKSB8fCBkZWZpbmVkKEhQVVgxMSkKLSNkZWZpbmUgVkFSTkFNRSAiU0hMSUJfUEFUSCIKLSNlbHNlCi0jZGVmaW5lIFZBUk5BTUUgIkxEX0xJQlJBUllfUEFUSCIKLSNlbmRpZgotCi0jaWZuZGVmIFNIQVJFRF9DT1JFX0RJUiAKLSNkZWZpbmUgU0hBUkVEX0NPUkVfRElSIEhUVFBEX1JPT1QgIi9saWJleGVjIgotI2VuZGlmCi0KLSNpZm5kZWYgU0hBUkVEX0NPUkVfRVhFQ1VUQUJMRV9QUk9HUkFNCi0jZGVmaW5lIFNIQVJFRF9DT1JFX0VYRUNVVEFCTEVfUFJPR1JBTSAibGliIiBUQVJHRVQgIi5lcCIKLSNlbmRpZgotCi1leHRlcm4gY2hhciAqb3B0YXJnOwotZXh0ZXJuIGludCAgIG9wdGluZDsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgY2hhciAqZW52cFtdKSAKLXsKLSAgICBjaGFyIHByb2dbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgbGxwX2J1ZltNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciAqKmxscF9zbG90OwotICAgIGNoYXIgKmxscF9leGlzdGluZzsKLSAgICBjaGFyICpsbHBfZGlyOwotICAgIGNoYXIgKiplbnZwbmV3OwotICAgIGludCBjLCBpLCBsOwotCi0gICAgLyogCi0gICAgICogcGFyc2UgYXJndW1lbnQgbGluZSwgCi0gICAgICogYnV0IG9ubHkgaGFuZGxlIHRoZSAtTCBvcHRpb24gCi0gICAgICovCi0gICAgbGxwX2RpciA9IFNIQVJFRF9DT1JFX0RJUjsKLSAgICB3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgIkQ6QzpjOlhkOmY6dlZsTFI6U1o6dFRoIikpICE9IC0xKSB7Ci0Jc3dpdGNoIChjKSB7Ci0JY2FzZSAnRCc6Ci0JY2FzZSAnQyc6Ci0JY2FzZSAnYyc6Ci0JY2FzZSAnWCc6Ci0JY2FzZSAnZCc6Ci0JY2FzZSAnZic6Ci0JY2FzZSAndic6Ci0JY2FzZSAnVic6Ci0JY2FzZSAnbCc6Ci0JY2FzZSAnTCc6Ci0JY2FzZSAnUyc6Ci0JY2FzZSAnWic6Ci0JY2FzZSAndCc6Ci0JY2FzZSAnVCc6Ci0JY2FzZSAnaCc6Ci0JY2FzZSAnPyc6Ci0JICAgIGJyZWFrOwotCWNhc2UgJ1InOgotCSAgICBsbHBfZGlyID0gc3RyZHVwKG9wdGFyZyk7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgICAvKiAKLSAgICAgKiBjcmVhdGUgcGF0aCB0byBTSEFSRURfQ09SRV9FWEVDVVRBQkxFX1BST0dSQU0KLSAgICAgKi8KLSAgICBhcF9zbnByaW50Zihwcm9nLCBzaXplb2YocHJvZyksICIlcy8lcyIsIGxscF9kaXIsIFNIQVJFRF9DT1JFX0VYRUNVVEFCTEVfUFJPR1JBTSk7Ci0KLSAgICAvKiAKLSAgICAgKiBhZGp1c3QgcHJvY2VzcyBlbnZpcm9ubWVudCB0aGVyZXdpdGggdGhlIFVuaXggbG9hZGVyIAotICAgICAqIGlzIGFibGUgdG8gc3RhcnQgdGhlIFNIQVJFRF9DT1JFX0VYRUNVVEFCTEVfUFJPR1JBTS4KLSAgICAgKi8KLSAgICBsbHBfc2xvdCA9IE5VTEw7Ci0gICAgbGxwX2V4aXN0aW5nID0gTlVMTDsKLSAgICBsID0gc3RybGVuKFZBUk5BTUUpOwotICAgIGZvciAoaSA9IDA7IGVudnBbaV0gIT0gTlVMTDsgaSsrKSB7Ci0JaWYgKHN0cm5jbXAoZW52cFtpXSwgVkFSTkFNRSAiPSIsIGwrMSkgPT0gMCkgewotCSAgICBsbHBfc2xvdCA9ICZlbnZwW2ldOwotCSAgICBsbHBfZXhpc3RpbmcgPSBzdHJjaHIoZW52cFtpXSwgJz0nKSArIDE7Ci0JfQotICAgIH0KLSAgICBpZiAobGxwX3Nsb3QgPT0gTlVMTCkgewotCWVudnBuZXcgPSAoY2hhciAqKiltYWxsb2Moc2l6ZW9mKGNoYXIgKikqKGkgKyAyKSk7Ci0JaWYgKGVudnBuZXcgPT0gTlVMTCkgewotCSAgICBmcHJpbnRmKHN0ZGVyciwgIk91Y2ghICBPdXQgb2YgbWVtb3J5IGdlbmVyYXRpbmcgZW52cG5ldyFcbiIpOwotCX0KLQltZW1jcHkoZW52cG5ldywgZW52cCwgc2l6ZW9mKGNoYXIgKikqaSk7Ci0JZW52cCA9IGVudnBuZXc7Ci0JbGxwX3Nsb3QgPSAmZW52cFtpKytdOwotCWVudnBbaV0gPSBOVUxMOwotICAgIH0KLSAgICBpZiAobGxwX2V4aXN0aW5nICE9IE5VTEwpCi0JIGFwX3NucHJpbnRmKGxscF9idWYsIHNpemVvZihsbHBfYnVmKSwgIiVzPSVzOiVzIiwgVkFSTkFNRSwgbGxwX2RpciwgbGxwX2V4aXN0aW5nKTsKLSAgICBlbHNlCi0JIGFwX3NucHJpbnRmKGxscF9idWYsIHNpemVvZihsbHBfYnVmKSwgIiVzPSVzIiwgVkFSTkFNRSwgbGxwX2Rpcik7Ci0gICAgKmxscF9zbG90ID0gc3RyZHVwKGxscF9idWYpOwotCi0gICAgLyogCi0gICAgICogZmluYWxseSByZXBsYWNlIG91ciBwcm9jZXNzIHdpdGggCi0gICAgICogdGhlIFNIQVJFRF9DT1JFX0VYRUNVVEFCTEVfUFJPR1JBTQotICAgICAqLwotICAgIGlmIChleGVjdmUocHJvZywgYXJndiwgZW52cCkgPT0gLTEpIHsKLQlmcHJpbnRmKHN0ZGVyciwgCi0JCSIlczogVW5hYmxlIHRvIGV4ZWMgU2hhcmVkIENvcmUgRXhlY3V0YWJsZSBQcm9ncmFtIGAlcydcbiIsCi0JCWFyZ3ZbMF0sIHByb2cpOwotCXJldHVybiAxOwotICAgIH0KLSAgICBlbHNlCi0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBkZWYgT1MyICovCi0jZW5kaWYgLyogbmRlZiBTSEFSRURfQ09SRV9CT09UU1RSQVAgKi8KLQotI2lmbmRlZiBTSEFSRURfQ09SRV9CT09UU1RSQVAKLS8qCi0gKiBGb3JjZSBhcF92YWxpZGF0ZV9wYXNzd29yZCgpIGludG8gdGhlIGltYWdlIHNvIHRoYXQgbW9kdWxlcyBsaWtlCi0gKiBtb2RfYXV0aCBjYW4gdXNlIGl0IGV2ZW4gaWYgdGhleSdyZSBkeW5hbWljYWxseSBsb2FkZWQuCi0gKi8KLXZvaWQgc3Vja19pbl9hcF92YWxpZGF0ZV9wYXNzd29yZCh2b2lkKTsKLXZvaWQgc3Vja19pbl9hcF92YWxpZGF0ZV9wYXNzd29yZCh2b2lkKQotewotICAgIGFwX3ZhbGlkYXRlX3Bhc3N3b3JkKCJhIiwgImIiKTsKLX0KLSNlbmRpZgotCi0vKiBmb3JjZSBFeHBhdCB0byBiZSBsaW5rZWQgaW50byB0aGUgc2VydmVyIGV4ZWN1dGFibGUgKi8KLSNpZiBkZWZpbmVkKFVTRV9FWFBBVCkgJiYgIWRlZmluZWQoU0hBUkVEX0NPUkVfQk9PVFNUUkFQKQotI2luY2x1ZGUgInhtbHBhcnNlLmgiCi1jb25zdCBYTUxfTENoYXIgKnN1Y2tfaW5fZXhwYXQodm9pZCk7Ci1jb25zdCBYTUxfTENoYXIgKnN1Y2tfaW5fZXhwYXQodm9pZCkKLXsKLSAgICByZXR1cm4gWE1MX0Vycm9yU3RyaW5nKFhNTF9FUlJPUl9OT05FKTsKLX0KLSNlbmRpZiAvKiBVU0VfRVhQQVQgKi8KLQpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS8uY3ZzaWdub3JlIGIvc2VydmVyL21wbS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2M3YTdjLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1ha2VmaWxlCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL01QTS5OQU1JTkcgYi9zZXJ2ZXIvbXBtL01QTS5OQU1JTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZTQwZjAuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9NUE0uTkFNSU5HCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotRm9yIHJpZ2h0IG5vdywgdGhlIG5hbWluZyBvZiB0aGUgTVBNIG1ldGhvZHMgZm9sbG93cwotdGhlIGZvbGxvd2luZyBleGFtcGxlIGZvciB0aGUgJ3ByZWZvcmsnIG1ldGhvZC4KLQotICAxLiBUaGUgZGlyZWN0b3J5IG5hbWUgdW5kZXIgbW9kdWxlcy9tcG0gaXMgdGhlIGFjdHVhbAotICAgICBuYW1lLgotCi0gICAgICAgZWc6IG1vZHVsZXMvbXBtL3ByZWZvcmsKLQotICAyLiBUaGUgaW50ZXJuYWwgbW9kdWxlIG5hbWUgbXVzdCBiZSB0aGF0IG5hbWUsIHByZXBlbmRlZCB3aXRoCi0gICAgIG1wbV8gYW5kIHN1ZmZpeGVkIHdpdGggX21vZHVsZQotCi0gICAgICAgZWc6IG1wbV9wcmVmb3JrX21vZHVsZQotCi0gIDMuIFRoZSBNYWtlZmlsZS50bXBsIG11c3QgY3JlYXRlIGxpYjxuYW1lPi5hCi0KLSAgICAgICBlZzogbGlicHJlZm9yay5hCi0KLU51bWJlcnMgMSBhbmQgMyBmb2xsb3cgdGhlIG5vcm1hbCBydWxlcyAoZm9yIGV4YW1wbGUsIG1vZHVsZXMvc3RhbmRhcmQKLWNyZWF0ZXMgbGlic3RhbmRhcmQuYSwgZXRjLi4uKS4KLQotVGhlIE1QTV9NRVRIT0QgUnVsZSB3aWxsIHVzZSB0aGUgYWN0dWFsIG5hbWUgKGVnOiBwcmVmb3JrKSB0bwotcGljayB0aGUgY29ycmVjdCBtZXRob2QgbW9kdWxlIHRvIGJ1aWxkLgpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9NYWtlZmlsZS5pbiBiL3NlcnZlci9tcG0vTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNjc4ZTguLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotCi1ERVBUSCAgICAgPSAuLi8uLgotdG9wc3JjZGlyID0gQHRvcHNyY2RpckAKLXNyY2RpciAgICA9IEBzcmNkaXJACi1WUEFUSCAgICAgPSBAc3JjZGlyQAotCi1TVUJESVJTID0gJChNUE1fTkFNRSkKLQotaW5jbHVkZSAkKHRvcHNyY2RpcikvYnVpbGQvcnVsZXMubWsKZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vYmVvcy8uY3ZzaWdub3JlIGIvc2VydmVyL21wbS9iZW9zLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZGYyNTcuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9iZW9zLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLS5kZXBzCi0ubGlicwotKi5sbwotKi5sYQotTWFrZWZpbGUKZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vYmVvcy9NYWtlZmlsZS5pbiBiL3NlcnZlci9tcG0vYmVvcy9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE3NTA3NS4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL2Jlb3MvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQotTFRMSUJSQVJZX05BTUUgICAgPSBsaWJiZW9zLmxhCi1MVExJQlJBUllfU09VUkNFUyA9IGJlb3MuYyBzY29yZWJvYXJkLmMKLQotaW5jbHVkZSAkKHRvcF9zcmNkaXIpL2J1aWxkL2x0bGliLm1rCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL2Jlb3MvYmVvcy5jIGIvc2VydmVyL21wbS9iZW9zL2Jlb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcwNTc2Yi4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL2Jlb3MvYmVvcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEzNCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBiYXNlZCB1cG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUKLSAqIG9yaWdpbmFsbHkgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsCi0gKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICovCi0KLS8qIFRoZSBuZXcgQmVPUyBNUE0hCi0gKgotICogVGhpcyBvbmUgYmFzaWNhbGx5IGlzIGEgc2luZ2xlIHByb2Nlc3MgbXVsdGkgdGhyZWFkZWQgbW9kZWwsIGJ1dCAKLSAqIEkgY291bGRuJ3QgYmUgYm90aGVyZWQgYWRkaW5nIHRoZSBzcG10XyB0byB0aGUgZnJvbnQgb2YgdGhlIG5hbWUhCi0gKiBBbnl3YXksIHRoaXMgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgc28gaXQgaXNuJ3QgeWV0IHRoZSBkZWZhdWx0Ci0gKiBjaG9pY2UuCi0gKi8KLSAKLSNkZWZpbmUgQ09SRV9QUklWQVRFIAotIAotI2luY2x1ZGUgImFwcl9wb3J0YWJsZS5oIgotI2luY2x1ZGUgImh0dHBkLmgiIAotI2luY2x1ZGUgImh0dHBfbWFpbi5oIiAKLSNpbmNsdWRlICJodHRwX2xvZy5oIiAKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgkvKiBmb3IgcmVhZF9jb25maWcgKi8gCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCQkvKiBmb3IgZ2V0X3JlbW90ZV9ob3N0ICovIAotI2luY2x1ZGUgImh0dHBfY29ubmVjdGlvbi5oIgotI2luY2x1ZGUgImFwX21wbS5oIgotI2luY2x1ZGUgImJlb3NkLmgiCi0jaW5jbHVkZSAiaW9sX3NvY2tldC5oIgotI2luY2x1ZGUgImFwX2xpc3Rlbi5oIgotI2luY2x1ZGUgInNjb3JlYm9hcmQuaCIgCi0vLyNpbmNsdWRlICJwb2xsLmgiCi0jaW5jbHVkZSAibXBtX2NvbW1vbi5oIgotI2luY2x1ZGUgIm1wbS5oIgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLQotLyoKLSAqIEFjdHVhbCBkZWZpbml0aW9ucyBvZiBjb25maWcgZ2xvYmFscwotICovCi0KLWludCBhcF90aHJlYWRzX3Blcl9jaGlsZD0wOyAgICAgICAgIC8qIFdvcmtlciB0aHJlYWRzIHBlciBjaGlsZCAqLwotaW50IGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQ9MDsKLXN0YXRpYyBjaGFyICphcF9waWRfZm5hbWU9TlVMTDsKLXN0YXRpYyBjaGFyICphcF9zY29yZWJvYXJkX2ZuYW1lPU5VTEw7Ci1zdGF0aWMgaW50IGFwX3RocmVhZHNfdG9fc3RhcnQ9MDsKLXN0YXRpYyBpbnQgbWluX3NwYXJlX3RocmVhZHM9MDsKLXN0YXRpYyBpbnQgbWF4X3NwYXJlX3RocmVhZHM9MDsKLXN0YXRpYyBpbnQgYXBfdGhyZWFkX2xpbWl0PTA7Ci1zdGF0aWMgdGltZV90IGFwX3Jlc3RhcnRfdGltZT0wOwotQVBJX1ZBUl9FWFBPUlQgaW50IGFwX2V4dGVuZGVkX3N0YXR1cyA9IDA7Ci1zdGF0aWMgaW50IG51bV9saXN0ZW5pbmdfc29ja2V0cyA9IDA7IC8qIHNldCBieSBvcGVuX2xpc3RlbmVycyBpbiBhcF9tcG1fcnVuICovCi1zdGF0aWMgYXBfc29ja2V0X3QgKiogbGlzdGVuaW5nX3NvY2tldHM7Ci1hcF9sb2NrX3QgKmFjY2VwdF9tdXRleCA9IE5VTEw7Ci0KLXN0YXRpYyBhcF9wb29sX3QgKnBjb25mOwkJLyogUG9vbCBmb3IgY29uZmlnIHN0dWZmICovCi1zdGF0aWMgYXBfcG9vbF90ICpwY2hpbGQ7CQkvKiBQb29sIGZvciBodHRwZCBjaGlsZCBzdHVmZiAqLwotCi1zdGF0aWMgaW50IHNlcnZlcl9waWQ7IAotCi0vKiBLZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgY3VycmVudGx5IGFjdGl2ZSAqLwotc3RhdGljIGludCB3b3JrZXJfdGhyZWFkX2NvdW50OwotYXBfbG9ja190ICp3b3JrZXJfdGhyZWFkX2NvdW50X211dGV4OwotCi0vKiBUaGUgc3RydWN0dXJlIHVzZWQgdG8gcGFzcyB1bmlxdWUgaW5pdGlhbGl6YXRpb24gaW5mbyB0byBlYWNoIHRocmVhZCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCBzbG90OwotICAgIGFwX3Bvb2xfdCAqdHBvb2w7Ci19IHByb2NfaW5mbzsKLQotc3RydWN0IGFwX2N0YWJsZSBhcF9jaGlsZF90YWJsZVtIQVJEX1NFUlZFUl9MSU1JVF07Ci0KLS8qCi0gKiBUaGUgbWF4IGNoaWxkIHNsb3QgZXZlciBhc3NpZ25lZCwgcHJlc2VydmVkIGFjcm9zcyByZXN0YXJ0cy4gIE5lY2Vzc2FyeQotICogdG8gZGVhbCB3aXRoIE1heENsaWVudHMgY2hhbmdlcyBhY3Jvc3MgU0lHV0lOQ0ggcmVzdGFydHMuICBXZSB1c2UgdGhpcwotICogdmFsdWUgdG8gb3B0aW1pemUgcm91dGluZXMgdGhhdCBoYXZlIHRvIHNjYW4gdGhlIGVudGlyZSBzY29yZWJvYXJkLgotICovCi1pbnQgYXBfbWF4X2NoaWxkX2Fzc2lnbmVkID0gLTE7Ci1pbnQgYXBfbWF4X3RocmVhZHNfbGltaXQgPSAtMTsKLXN0YXRpYyBjaGFyIGFwX2NvcmVkdW1wX2RpcltNQVhfU1RSSU5HX0xFTl07Ci0KLS8qIHNoYXJlZCBodHRwX21haW4gZ2xvYmFscy4uLiAqLwotCi1zZXJ2ZXJfcmVjICphcF9zZXJ2ZXJfY29uZjsKLQotLyogb25lX3Byb2Nlc3MgKi8KLS8qIFRPRE8gLSBnZXQgdGhpcyB3b3JraW5nIGFnYWluLi4uICovCi1zdGF0aWMgaW50IG9uZV9wcm9jZXNzID0gMDsKLQotI2lmZGVmIERFQlVHX1NJR1NUT1AKLWludCByYWlzZV9zaWdzdG9wX2ZsYWdzOwotI2VuZGlmCi0KLUFQSV9FWFBPUlQoY29uc3Qgc2VydmVyX3JlYyAqKSBhcF9nZXRfc2VydmVyX2NvbmYodm9pZCkKLXsKLSAgICByZXR1cm4gKGFwX3NlcnZlcl9jb25mKTsKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX2dldF9tYXhfZGFlbW9ucyh2b2lkKQotewotICAgIHJldHVybiBhcF9tYXhfY2hpbGRfYXNzaWduZWQ7Ci19Ci0KLS8qIGEgY2xlYW4gZXhpdCBmcm9tIGEgY2hpbGQgd2l0aCBwcm9wZXIgY2xlYW51cCAKLSAgIHN0YXRpYyB2b2lkIGNsZWFuX2NoaWxkX2V4aXQoaW50IGNvZGUpIF9fYXR0cmlidXRlX18gKChub3JldHVybikpOyAqLwotdm9pZCBjbGVhbl9jaGlsZF9leGl0KGludCBjb2RlKQotewotICAgIGlmIChwY2hpbGQpCi0gICAgICAgIGFwX2Rlc3Ryb3lfcG9vbChwY2hpbGQpOwotICAgIGV4aXQoY29kZSk7Ci19Ci0KLS8qIGhhbmRsZSBhbGwgdmFyaWV0aWVzIG9mIGNvcmUgZHVtcGluZyBzaWduYWxzICovCi1zdGF0aWMgdm9pZCBzaWdfY29yZWR1bXAoaW50IHNpZykKLXsKLSAgICBjaGRpcihhcF9jb3JlZHVtcF9kaXIpOwotICAgIHNpZ25hbChzaWcsIFNJR19ERkwpOwotICAgIGtpbGwoc2VydmVyX3BpZCwgc2lnKTsKLSAgICAvKiBBdCB0aGlzIHBvaW50IHdlJ3ZlIGdvdCBzaWcgYmxvY2tlZCwgYmVjYXVzZSB3ZSdyZSBzdGlsbCBpbnNpZGUKLSAgICAgKiB0aGUgc2lnbmFsIGhhbmRsZXIuICBXaGVuIHdlIGxlYXZlIHRoZSBzaWduYWwgaGFuZGxlciBpdCB3aWxsCi0gICAgICogYmUgdW5ibG9ja2VkLCBhbmQgd2UnbGwgdGFrZSB0aGUgc2lnbmFsLi4uIGFuZCBjb3JlZHVtcCBvciB3aGF0ZXZlcgotICAgICAqIGlzIGFwcHJvcHJpYXRlIGZvciB0aGlzIHBhcnRpY3VsYXIgVW5peC4gIEluIGFkZGl0aW9uIHRoZSBwYXJlbnQKLSAgICAgKiB3aWxsIHNlZSB0aGUgcmVhbCBzaWduYWwgd2UgcmVjZWl2ZWQgLS0gd2hlcmVhcyBpZiB3ZSBjYWxsZWQKLSAgICAgKiBhYm9ydCgpIGhlcmUsIHRoZSBwYXJlbnQgd291bGQgb25seSBzZWUgU0lHQUJSVC4KLSAgICAgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb25uZWN0aW9uIHN0cnVjdHVyZXMgYW5kIGFjY291bnRpbmcuLi4KLSAqLwotCi0vKiB2b2xhdGlsZSBqdXN0IGluIGNhc2UgKi8KLXN0YXRpYyBpbnQgdm9sYXRpbGUgc2h1dGRvd25fcGVuZGluZzsKLXN0YXRpYyBpbnQgdm9sYXRpbGUgcmVzdGFydF9wZW5kaW5nOwotc3RhdGljIGludCB2b2xhdGlsZSBpc19ncmFjZWZ1bDsKLQotLyoKLSAqIGFwX3N0YXJ0X3NodXRkb3duKCkgYW5kIGFwX3N0YXJ0X3Jlc3RhcnQoKSwgYmVsb3csIGFyZSBhIGZpcnN0IHN0YWIgYXQKLSAqIGZ1bmN0aW9ucyB0byBpbml0aWF0ZSBzaHV0ZG93biBvciByZXN0YXJ0IHdpdGhvdXQgcmVseWluZyBvbiBzaWduYWxzLiAKLSAqIFByZXZpb3VzbHkgdGhpcyB3YXMgaW5pdGlhdGVkIGluIHNpZ190ZXJtKCkgYW5kIHJlc3RhcnQoKSBzaWduYWwgaGFuZGxlcnMsIAotICogYnV0IHdlIHdhbnQgdG8gYmUgYWJsZSB0byBzdGFydCBhIHNodXRkb3duL3Jlc3RhcnQgZnJvbSBvdGhlciBzb3VyY2VzIC0tCi0gKiBlLmcuIG9uIFdpbjMyLCBmcm9tIHRoZSBzZXJ2aWNlIG1hbmFnZXIuIE5vdyB0aGUgc2VydmljZSBtYW5hZ2VyIGNhbgotICogY2FsbCBhcF9zdGFydF9zaHV0ZG93bigpIG9yIGFwX3N0YXJ0X3Jlc3RhcnQoKSBhcyBhcHByb3BpYXRlLiAgTm90ZSB0aGF0Ci0gKiB0aGVzZSBmdW5jdGlvbnMgY2FuIGFsc28gYmUgY2FsbGVkIGJ5IHRoZSBjaGlsZCBwcm9jZXNzZXMsIHNpbmNlIGdsb2JhbAotICogdmFyaWFibGVzIGFyZSBubyBsb25nZXIgdXNlZCB0byBwYXNzIG9uIHRoZSByZXF1aXJlZCBhY3Rpb24gdG8gdGhlIHBhcmVudC4KLSAqCi0gKiBUaGVzZSBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgcGFyZW50IHByb2Nlc3MgaXRzZWxmLCBzaW5jZSB0aGUKLSAqIHBhcmVudCBwcm9jZXNzIHdpbGwgdXNlIHRoZSBzaHV0ZG93bl9wZW5kaW5nIGFuZCByZXN0YXJ0X3BlbmRpbmcgdmFyaWFibGVzCi0gKiB0byBkZXRlcm1pbmUgd2hldGhlciB0byBzaHV0ZG93biBvciByZXN0YXJ0LiBUaGUgY2hpbGQgcHJvY2VzcyBzaG91bGQKLSAqIGNhbGwgc2lnbmFsX3BhcmVudCgpIGRpcmVjdGx5IHRvIHRlbGwgdGhlIHBhcmVudCB0byBkaWUgLS0gdGhpcyB3aWxsCi0gKiBjYXVzZSBuZWl0aGVyIG9mIHRob3NlIHZhcmlhYmxlIHRvIGJlIHNldCwgd2hpY2ggdGhlIHBhcmVudCB3aWxsCi0gKiBhc3N1bWUgbWVhbnMgc29tZXRoaW5nIHNlcmlvdXMgaXMgd3JvbmcgKHdoaWNoIGl0IHdpbGwgYmUsIGZvciB0aGUKLSAqIGNoaWxkIHRvIGZvcmNlIGFuIGV4aXQpIGFuZCBzbyBkbyBhbiBleGl0IGFueXdheS4KLSAqLwotCi12b2lkIGFwX3N0YXJ0X3NodXRkb3duKHZvaWQpCi17Ci0gICAgaWYgKHNodXRkb3duX3BlbmRpbmcgPT0gMSkgewotCS8qIFVtLCBpcyB0aGlzIF9wcm9iYWJseV8gbm90IGFuIGVycm9yLCBpZiB0aGUgdXNlciBoYXMKLQkgKiB0cmllZCB0byBkbyBhIHNodXRkb3duIHR3aWNlIHF1aWNrbHksIHNvIHdlIHdvbid0Ci0JICogd29ycnkgYWJvdXQgcmVwb3J0aW5nIGl0LgotCSAqLwotCXJldHVybjsKLSAgICB9Ci0gICAgc2h1dGRvd25fcGVuZGluZyA9IDE7Ci19Ci0KLS8qIGRvIGEgZ3JhY2VmdWwgcmVzdGFydCBpZiBncmFjZWZ1bCA9PSAxICovCi12b2lkIGFwX3N0YXJ0X3Jlc3RhcnQoaW50IGdyYWNlZnVsKQotewotCi0gICAgaWYgKHJlc3RhcnRfcGVuZGluZyA9PSAxKSB7Ci0gICAgICAgIC8qIFByb2JhYmx5IG5vdCBhbiBlcnJvciAtIGRvbid0IGJvdGhlciByZXBvcnRpbmcgaXQgKi8KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZXN0YXJ0X3BlbmRpbmcgPSAxOwotICAgIGlzX2dyYWNlZnVsID0gZ3JhY2VmdWw7Ci19Ci0KLXN0YXRpYyB2b2lkIHNpZ190ZXJtKGludCBzaWcpCi17Ci0gICAgYXBfc3RhcnRfc2h1dGRvd24oKTsKLX0KLQotc3RhdGljIHZvaWQgcmVzdGFydChpbnQgc2lnKQotewotICAgIGFwX3N0YXJ0X3Jlc3RhcnQoc2lnID09IFNJR1dJTkNIKTsKLX0KLQotc3RhdGljIHZvaWQgdGVsbF93b3JrZXJzX3RvX2V4aXQoKQotewotICAgIGludCBpLCBjb2RlID0gOTk7Ci0gICAgCi0gICAgZm9yIChpPTA7aTxhcF9tYXhfY2hpbGRfYXNzaWduZWQ7aSsrKSB7Ci0gICAgICAgIGlmIChhcF9jaGlsZF90YWJsZVtpXS5zdGF0dXMgIT0gU0VSVkVSX0RFQUQpCi0gICAgICAgICAgICBzZW5kX2RhdGEoYXBfY2hpbGRfdGFibGVbaV0ucGlkLCBjb2RlLCBOVUxMLCAwKTsKLSAgICAgICAgCi0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBwdXNoX3dvcmtlcnNfb2ZmX2NsaWZmKGludCBzaWcpCi17Ci0gICAgaW50IGk7Ci0gICAgCi0gICAgZm9yIChpPTA7aTxhcF9tYXhfY2hpbGRfYXNzaWduZWQ7aSsrKQotICAgICAgICBraWxsKGFwX2NoaWxkX3RhYmxlW2ldLnBpZCwgc2lnKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0X3NpZ25hbHModm9pZCkKLXsKLSAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhOwotCi0gICAgc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOwotICAgIHNhLnNhX2ZsYWdzID0gMDsKLQotICAgIGlmICghb25lX3Byb2Nlc3MpIHsKLQlzYS5zYV9oYW5kbGVyID0gc2lnX2NvcmVkdW1wOwotCi0JaWYgKHNpZ2FjdGlvbihTSUdTRUdWLCAmc2EsIE5VTEwpIDwgMCkKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBhcF9zZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdTRUdWKSIpOwotCWlmIChzaWdhY3Rpb24oU0lHQlVTLCAmc2EsIE5VTEwpIDwgMCkKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBhcF9zZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdCVVMpIik7Ci0JaWYgKHNpZ2FjdGlvbihTSUdBQlJULCAmc2EsIE5VTEwpIDwgMCkKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBhcF9zZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdBQlJUKSIpOwotCWlmIChzaWdhY3Rpb24oU0lHSUxMLCAmc2EsIE5VTEwpIDwgMCkKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBhcF9zZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdJTEwpIik7Ci0Jc2Euc2FfZmxhZ3MgPSAwOwotICAgIH0KLSAgICBzYS5zYV9oYW5kbGVyID0gc2lnX3Rlcm07Ci0gICAgaWYgKHNpZ2FjdGlvbihTSUdURVJNLCAmc2EsIE5VTEwpIDwgMCkKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBhcF9zZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdURVJNKSIpOwotICAgIGlmIChzaWdhY3Rpb24oU0lHSU5ULCAmc2EsIE5VTEwpIDwgMCkKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBhcF9zZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdJTlQpIik7Ci0gICAgCi0gICAgc2Euc2FfaGFuZGxlciA9IFNJR19JR047Ci0gICAgaWYgKHNpZ2FjdGlvbihTSUdQSVBFLCAmc2EsIE5VTEwpIDwgMCkKLSAgICAJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBhcF9zZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdQSVBFKSIpOwotCi0gICAgLyogd2Ugd2FudCB0byBpZ25vcmUgSFVQcyBhbmQgV0lOQ0ggd2hpbGUgd2UncmUgYnVzeSBwcm9jZXNzaW5nIG9uZSAqLwotICAgIHNpZ2FkZHNldCgmc2Euc2FfbWFzaywgU0lHSFVQKTsKLSAgICBzaWdhZGRzZXQoJnNhLnNhX21hc2ssIFNJR1dJTkNIKTsKLSAgICBzYS5zYV9oYW5kbGVyID0gcmVzdGFydDsKLSAgICBpZiAoc2lnYWN0aW9uKFNJR0hVUCwgJnNhLCBOVUxMKSA8IDApCi0gICAgCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgYXBfc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHSFVQKSIpOwotICAgIGlmIChzaWdhY3Rpb24oU0lHV0lOQ0gsICZzYSwgTlVMTCkgPCAwKQotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIGFwX3NlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR1dJTkNIKSIpOwotfQotCi1zdGF0aWMgdm9pZCBwcm9jZXNzX2NoaWxkX3N0YXR1cyhpbnQgcGlkLCBhcF93YWl0X3Qgc3RhdHVzKQotewotICAgIC8qIENoaWxkIGRpZWQuLi4gaWYgaXQgZGllZCBkdWUgdG8gYSBmYXRhbCBlcnJvciwKLQkqIHdlIHNob3VsZCBzaW1wbHkgYmFpbCBvdXQuCi0JKi8KLSAgICBpZiAoKFdJRkVYSVRFRChzdGF0dXMpKSAmJgotCVdFWElUU1RBVFVTKHN0YXR1cykgPT0gQVBFWElUX0NISUxERkFUQUwpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlR8QVBMT0dfTk9FUlJOTywgZXJybm8sIGFwX3NlcnZlcl9jb25mLAotCQkJIkNoaWxkICVkIHJldHVybmVkIGEgRmF0YWwgZXJyb3IuLi4gXG4iCi0JCQkiQXBhY2hlIGlzIGV4aXRpbmchIiwKLQkJCXBpZCk7Ci0JZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotICAgIGlmIChXSUZTSUdOQUxFRChzdGF0dXMpKSB7Ci0Jc3dpdGNoIChXVEVSTVNJRyhzdGF0dXMpKSB7Ci0JY2FzZSBTSUdURVJNOgotCWNhc2UgU0lHSFVQOgotCWNhc2UgU0lHVVNSMToKLQljYXNlIFNJR0tJTEw6Ci0JICAgIGJyZWFrOwotCWRlZmF1bHQ6Ci0jaWZkZWYgU1lTX1NJR0xJU1QKLSNpZmRlZiBXQ09SRURVTVAKLQkgICAgaWYgKFdDT1JFRFVNUChzdGF0dXMpKSB7Ci0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwKLQkJCSAgICAgZXJybm8sIGFwX3NlcnZlcl9jb25mLAotCQkJICAgICAiY2hpbGQgcGlkICVkIGV4aXQgc2lnbmFsICVzICglZCksICIKLQkJCSAgICAgInBvc3NpYmxlIGNvcmVkdW1wIGluICVzIiwKLQkJCSAgICAgcGlkLCAoV1RFUk1TSUcoc3RhdHVzKSA+PSBOdW1TSUcpID8gIiIgOiAKLQkJCSAgICAgU1lTX1NJR0xJU1RbV1RFUk1TSUcoc3RhdHVzKV0sIFdURVJNU0lHKHN0YXR1cyksCi0JCQkgICAgIGFwX2NvcmVkdW1wX2Rpcik7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0jZW5kaWYKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLAotCQkJICAgICBlcnJubywgYXBfc2VydmVyX2NvbmYsCi0JCQkgICAgICJjaGlsZCBwaWQgJWQgZXhpdCBzaWduYWwgJXMgKCVkKSIsIHBpZCwKLQkJCSAgICAgU1lTX1NJR0xJU1RbV1RFUk1TSUcoc3RhdHVzKV0sIFdURVJNU0lHKHN0YXR1cykpOwotI2lmZGVmIFdDT1JFRFVNUAotCSAgICB9Ci0jZW5kaWYKLSNlbHNlCi0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwKLQkJCSBlcnJubywgYXBfc2VydmVyX2NvbmYsCi0JCQkgImNoaWxkIHBpZCAlZCBleGl0IHNpZ25hbCAlZCIsCi0JCQkgcGlkLCBXVEVSTVNJRyhzdGF0dXMpKTsKLSNlbmRpZgotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgc2V0dXBfbGlzdGVuZXJzKHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgYXBfbGlzdGVuX3JlYyAqbHI7Ci0gICAgaW50IG51bV9saXN0ZW5lcnMgPSAwOwotICAgIGlmIChhcF9saXN0ZW5fb3BlbihzLT5wcm9jZXNzLCBzLT5wb3J0KSkgewotICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBmb3IgKGxyID0gYXBfbGlzdGVuZXJzOyBscjsgbHIgPSBsci0+bmV4dCkgewotICAgICAgICBudW1fbGlzdGVuZXJzKys7Ci0gICAgfQotICAgIHJldHVybiBudW1fbGlzdGVuZXJzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEhlcmUgZm9sbG93cyBhIGxvbmcgYnVuY2ggb2YgZ2VuZXJpYyBzZXJ2ZXIgYm9va2tlZXBpbmcgc3R1ZmYuLi4KLSAqLwotCi0vLyNkZWZpbmUgc29ja19kaXNhYmxlX25hZ2xlKHMpCS8qIE5PT1AgKi8KLQotaW50IGFwX2dyYWNlZnVsX3N0b3Bfc2lnbmFsbGVkKHZvaWQpCi17Ci0gICAgLyogWFhYIC0gRG9lcyB0aGlzIHJlYWxseSB3b3JrPyAtIE1hbm9qICovCi0gICAgcmV0dXJuIGlzX2dyYWNlZnVsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENoaWxkIHByb2Nlc3MgbWFpbiBsb29wLgotICovCi0KLXN0YXRpYyB2b2lkIHByb2Nlc3Nfc29ja2V0KGFwX3Bvb2xfdCAqcCwgYXBfc29ja2V0X3QgKnNvY2ssIGludCBteV9jaGlsZF9udW0pCi17Ci0gICAgQlVGRiAqY29ubl9pbzsKLSAgICBjb25uX3JlYyAqY3VycmVudF9jb25uOwotICAgIGFwX2lvbCAqaW9sOwotICAgIGxvbmcgY29ubl9pZCA9IG15X2NoaWxkX251bTsKLSAgICBpbnQgY3NkOwotCi0gICAgaW9sID0gYmVvc19hdHRhY2hfc29ja2V0KHNvY2spOwotICAgIGlmIChpb2wgPT0gTlVMTCkgewotICAgICAgICBpZiAoZXJybm8gPT0gRUJBREYpIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX1dBUk5JTkcsIGVycm5vLCBOVUxMLAotICAgICAgICAgICAgICAgICJmaWxlZGVzY3JpcHRvciAoJXUpIGxhcmdlciB0aGFuIEZEX1NFVFNJWkUgKCV1KSAiCi0gICAgICAgICAgICAgICAgImZvdW5kLCB5b3UgcHJvYmFibHkgbmVlZCB0byByZWJ1aWxkIEFwYWNoZSB3aXRoIGEgIgotICAgICAgICAgICAgICAgICJsYXJnZXIgRkRfU0VUU0laRSIsIGNzZCwgRkRfU0VUU0laRSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIE5VTEwsCi0gICAgICAgICAgICAgICAgImVycm9yIGF0dGFjaGluZyB0byBzb2NrZXQiKTsKLSAgICAgICAgfQotICAgICAgICBhcF9jbG9zZV9zb2NrZXQoc29jayk7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIGNvbm5faW8gPSBhcF9iY3JlYXRlKHAsIEJfUkRXUik7Ci0gICAgYXBfYnB1c2hfaW9sKGNvbm5faW8sIGlvbCk7Ci0KLSAgICBjdXJyZW50X2Nvbm4gPSBhcF9uZXdfYXByX2Nvbm5lY3Rpb24ocCwgYXBfc2VydmVyX2NvbmYsIGNvbm5faW8sIHNvY2ssIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uX2lkKTsKLQotICAgIGFwX3Byb2Nlc3NfY29ubmVjdGlvbihjdXJyZW50X2Nvbm4pOwotICAgIGFwX2xpbmdlcmluZ19jbG9zZShjdXJyZW50X2Nvbm4pOwotfQotCi1zdGF0aWMgaW50MzIgd29ya2VyX3RocmVhZCh2b2lkICogZHVtbXkpCi17Ci0gICAgcHJvY19pbmZvICogdGkgPSBkdW1teTsKLSAgICBpbnQgY2hpbGRfc2xvdCA9IHRpLT5zbG90OwotICAgIGFwX3Bvb2xfdCAqdHBvb2wgPSB0aS0+dHBvb2w7Ci0gICAgYXBfc29ja2V0X3QgKmNzZCA9IE5VTEw7Ci0gICAgYXBfcG9vbF90ICpwdHJhbnM7CQkvKiBQb29sIGZvciBwZXItdHJhbnNhY3Rpb24gc3R1ZmYgKi8KLSAgICBhcF9zb2NrZXRfdCAqc2QgPSBOVUxMOwotICAgIGludCBzcnYgLCBuOwotICAgIGludCBjdXJyX3BvbGxmZCwgbGFzdF9wb2xsZmQgPSAwOwotICAgIHNpZ3NldF90IHNpZ19tYXNrOwotICAgIGludCByZXF1ZXN0c190aGlzX2NoaWxkID0gYXBfbWF4X3JlcXVlc3RzX3Blcl9jaGlsZDsKLSAgICBhcF9wb2xsZmRfdCAqcG9sbHNldDsKLSAgICAvKiBlYWNoIHdvcmtlciB0aHJlYWQgaXMgaW4gY29udHJvbCBvZiBpdCdzIG93biBkZXN0aW55Li4uKi8KLSAgICBpbnQgdGhpc193b3JrZXJfc2hvdWxkX2V4aXQgPSAwOyAKLSAgICB0aHJlYWRfaWQgbWUgPSBmaW5kX3RocmVhZChOVUxMKTsKLSAgICAKLSAgICBmcmVlKHRpKTsKLQotICAgIC8qIGJsb2NrIHRoZSBzaWduYWxzIGZvciB0aGlzIHRocmVhZCAqLwotICAgIHNpZ2ZpbGxzZXQoJnNpZ19tYXNrKTsKLSAgICBzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzaWdfbWFzaywgTlVMTCk7Ci0KLSAgICBhcF9jcmVhdGVfcG9vbCgmcHRyYW5zLCB0cG9vbCk7Ci0KLSAgICBhcF9sb2NrKHdvcmtlcl90aHJlYWRfY291bnRfbXV0ZXgpOwotICAgIHdvcmtlcl90aHJlYWRfY291bnQrKzsKLSAgICBhcF91bmxvY2sod29ya2VyX3RocmVhZF9jb3VudF9tdXRleCk7Ci0KLSAgICAvKiBub3cgc2V0dXAgb3VyIG93biBwb2xsc2V0Li4udGhpcyB3aWxsIHVzZSBBUFIgd29vaG9vISAqLwotICAgIGFwX3NldHVwX3BvbGwoJnBvbGxzZXQsIG51bV9saXN0ZW5pbmdfc29ja2V0cywgdHBvb2wpOwotICAgIGZvcihuPTAgOyBuIDwgbnVtX2xpc3RlbmluZ19zb2NrZXRzIDsgKytuKQotCSAgICBhcF9hZGRfcG9sbF9zb2NrZXQocG9sbHNldCwgbGlzdGVuaW5nX3NvY2tldHNbbl0sIEFQUl9QT0xMSU4pOwotCi0gICAgd2hpbGUgKCF0aGlzX3dvcmtlcl9zaG91bGRfZXhpdCkgewotICAgICAgICB0aGlzX3dvcmtlcl9zaG91bGRfZXhpdCB8PSAoYXBfbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCAhPSAwKSAmJiAocmVxdWVzdHNfdGhpc19jaGlsZCA8PSAwKTsKLSAgICAgICAgCi0gICAgICAgIGlmICh0aGlzX3dvcmtlcl9zaG91bGRfZXhpdCkgYnJlYWs7Ci0KLSAgICAgICAgYXBfbG9jayhhY2NlcHRfbXV0ZXgpOwotICAgICAgICB3aGlsZSAoIXRoaXNfd29ya2VyX3Nob3VsZF9leGl0KSB7Ci0gICAgICAgICAgICBhcF9pbnQxNl90IGV2ZW50OwotICAgICAgICAgICAgYXBfc3RhdHVzX3QgcmV0ID0gYXBfcG9sbChwb2xsc2V0LCAmc3J2LCAtMSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChoYXNfZGF0YShtZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJlYWRfaWQgc2VuZGVyOwotICAgICAgICAgICAgICAgIHJlY2VpdmVfZGF0YSgmc2VuZGVyLCBOVUxMLCAwKTsKLSAgICAgICAgICAgICAgICB0aGlzX3dvcmtlcl9zaG91bGRfZXhpdCA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmV0ICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIHBvbGwoKSB3aWxsIG9ubHkgcmV0dXJuIGVycm9ycyBpbiBjYXRhc3Ryb3BoaWMKLSAgICAgICAgICAgICAgICAgKiBjaXJjdW1zdGFuY2VzLiBMZXQncyB0cnkgZXhpdGluZyBncmFjZWZ1bGx5LCBmb3Igbm93LiAqLwotICAgICAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsZXJybm8sICAoY29uc3Qgc2VydmVyX3JlYyAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9nZXRfc2VydmVyX2NvbmYoKSwgInBvbGw6IChsaXN0ZW4pIik7Ci0gICAgICAgICAgICAgICAgdGhpc193b3JrZXJfc2hvdWxkX2V4aXQgPSAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodGhpc193b3JrZXJfc2hvdWxkX2V4aXQpIGJyZWFrOwotCi0gICAgICAgICAgICBpZiAobnVtX2xpc3RlbmluZ19zb2NrZXRzID09IDEpIHsKLSAgICAgICAgICAgICAgICBzZCA9IGFwX2xpc3RlbmVycy0+c2Q7Ci0gICAgICAgICAgICAgICAgZ290byBnb3RfZmQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBmaW5kIGEgbGlzdGVuZXIgKi8KLSAgICAgICAgICAgICAgICBjdXJyX3BvbGxmZCA9IGxhc3RfcG9sbGZkOwotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgY3Vycl9wb2xsZmQrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJfcG9sbGZkID4gbnVtX2xpc3RlbmluZ19zb2NrZXRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyX3BvbGxmZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSByZXZlbnQuLi4gKi8KLSAgICAgICAgICAgICAgICAgICAgYXBfZ2V0X3JldmVudHMoJmV2ZW50LCBsaXN0ZW5pbmdfc29ja2V0c1tjdXJyX3BvbGxmZF0sIHBvbGxzZXQpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLyogWFhYOiBTaG91bGQgd2UgY2hlY2sgZm9yIFBPTExFUlI/ICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChldmVudCAmIEFQUl9QT0xMSU4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfcG9sbGZkID0gY3Vycl9wb2xsZmQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZCA9IGxpc3RlbmluZ19zb2NrZXRzW2N1cnJfcG9sbGZkXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZ290X2ZkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoY3Vycl9wb2xsZmQgIT0gbGFzdF9wb2xsZmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgZ290X2ZkOgotICAgICAgICBpZiAoIXRoaXNfd29ya2VyX3Nob3VsZF9leGl0KSB7Ci0gICAgICAgICAgICBhcF9hY2NlcHQoJmNzZCwgc2QsIHB0cmFucyk7Ci0gICAgICAgICAgICBhcF91bmxvY2soYWNjZXB0X211dGV4KTsKLSAgICAgICAgICAgIHByb2Nlc3Nfc29ja2V0KHB0cmFucywgY3NkLCBjaGlsZF9zbG90KTsKLSAgICAgICAgICAgIHJlcXVlc3RzX3RoaXNfY2hpbGQtLTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGFwX3VubG9jayhhY2NlcHRfbXV0ZXgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYXBfY2xlYXJfcG9vbChwdHJhbnMpOwotICAgIH0KLQotICAgIGFwX2Rlc3Ryb3lfcG9vbCh0cG9vbCk7Ci0gICAgYXBfbG9jayh3b3JrZXJfdGhyZWFkX2NvdW50X211dGV4KTsKLSAgICB3b3JrZXJfdGhyZWFkX2NvdW50LS07Ci0gICAgaWYgKHdvcmtlcl90aHJlYWRfY291bnQgPT0gMCkgewotICAgICAgICAvKiBBbGwgdGhlIHRocmVhZHMgaGF2ZSBleGl0ZWQsIG5vdyBmaW5pc2ggdGhlIHNodXRkb3duIHByb2Nlc3MKLSAgICAgICAgICogYnkgc2lnbmFsbGluZyB0aGUgc2lnd2FpdCB0aHJlYWQgKi8KLSAgICAgICAga2lsbChzZXJ2ZXJfcGlkLCBTSUdURVJNKTsKLSAgICB9Ci0gICAgYXBfdW5sb2NrKHdvcmtlcl90aHJlYWRfY291bnRfbXV0ZXgpOwotCi0gICAgcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIGludCBtYWtlX3dvcmtlcihzZXJ2ZXJfcmVjICpzLCBpbnQgc2xvdCwgdGltZV90IG5vdykKLXsKLSAgICB0aHJlYWRfaWQgdGlkOwotICAgIHByb2NfaW5mbyAqbXlfaW5mbyA9IChwcm9jX2luZm8gKiltYWxsb2Moc2l6ZW9mKHByb2NfaW5mbykpOwotCi0gICAgaWYgKG15X2luZm8gPT0gTlVMTCkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlQsIGVycm5vLCBhcF9zZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICJtYWxsb2M6IG91dCBvZiBtZW1vcnkiKTsKLSAgICAgICAgY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotICAgIAotICAgIG15X2luZm8tPnNsb3QgPSBzbG90OwotICAgIGFwX2NyZWF0ZV9wb29sKCZteV9pbmZvLT50cG9vbCwgcGNoaWxkKTsKLSAgICAKLSAgICBpZiAoc2xvdCArIDEgPiBhcF9tYXhfY2hpbGRfYXNzaWduZWQpCi0JICAgIGFwX21heF9jaGlsZF9hc3NpZ25lZCA9IHNsb3QgKyAxOwotCi0gICAgLyogVE9ETzogZmlndXJlIG91dCB0aGUgb25lX3Byb2Nlc3Mgc3R1ZmYuLi4gKi8KLS8qCi0gICAgaWYgKG9uZV9wcm9jZXNzKSB7Ci0gICAgCXNldF9zaWduYWxzKCk7Ci0gICAgICAgIGFwX2NoaWxkX3RhYmxlW3Nsb3RdLnBpZCA9IGdldHBpZCgpOwotICAgICAgICBhcF9jaGlsZF90YWJsZVtzbG90XS5zdGF0dXMgPSBTRVJWRVJfQUxJVkU7Ci0gICAgfQotVGhpcyBpcyBkZWxpYmVyYXRlIHRvIHJlbWluZCBtZSB0byBkbyBzb21ldGhpbmcgYWJvdXQgaXQhCi0qLwotCi0gICAgdGlkID0gc3Bhd25fdGhyZWFkKHdvcmtlcl90aHJlYWQsICJhcGFjaGVfd29ya2VyIiwgQl9OT1JNQUxfUFJJT1JJVFksCi0gICAgICAgIG15X2luZm8pOwotICAgIGlmICh0aWQgPCBCX05PX0VSUk9SKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGVycm5vLCBzLCAKLSAgICAgICAgICAgICJzcGF3bl90aHJlYWQ6IFVuYWJsZSB0byBzdGFydCBhIG5ldyB0aHJlYWQiKTsKLQkgICAgLyogSW4gY2FzZSBzeXN0ZW0gcmVzb3VyY2VzIGFyZSBtYXh4ZWQgb3V0LCB3ZSBkb24ndCB3YW50Ci0JICAgICAqIEFwYWNoZSBydW5uaW5nIGF3YXkgd2l0aCB0aGUgQ1BVIHRyeWluZyB0byBmb3JrIG92ZXIgYW5kCi0JICAgICAqIG92ZXIgYW5kIG92ZXIgYWdhaW4uICovCi0gICAgCXNsZWVwKDEwKTsKLQotICAgIAlyZXR1cm4gLTE7Ci0gICAgfQotICAgIHJlc3VtZV90aHJlYWQodGlkKTsKLSAgICAKLSAgICBhcF9jaGlsZF90YWJsZVtzbG90XS5waWQgPSBnZXRwaWQoKTsKLSAgICBhcF9jaGlsZF90YWJsZVtzbG90XS5zdGF0dXMgPSBTRVJWRVJfQUxJVkU7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIHN0YXJ0IHVwIGEgYnVuY2ggb2YgY2hpbGRyZW4gKi8KLXN0YXRpYyB2b2lkIHN0YXJ0dXBfdGhyZWFkcyhpbnQgbnVtYmVyX3RvX3N0YXJ0KQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgbnVtYmVyX3RvX3N0YXJ0ICYmIGkgPCBhcF90aHJlYWRfbGltaXQ7ICsraSkgewotCWlmIChhcF9jaGlsZF90YWJsZVtpXS5zdGF0dXMgICE9IFNFUlZFUl9ERUFEKSB7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQlpZiAobWFrZV93b3JrZXIoYXBfc2VydmVyX2NvbmYsIGksIDApIDwgMCkgewotCSAgICBicmVhazsKLQl9Ci0JLS1udW1iZXJfdG9fc3RhcnQ7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBzcGF3bl9yYXRlIGlzIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCB3aWxsIGJlIHNwYXduZWQgb24gdGhlCi0gKiBuZXh0IG1haW50ZW5hbmNlIGN5Y2xlIGlmIHRoZXJlIGFyZW4ndCBlbm91Z2ggaWRsZSBzZXJ2ZXJzLiAgSXQgaXMKLSAqIGRvdWJsZWQgdXAgdG8gTUFYX1NQQVdOX1JBVEUsIGFuZCByZXNldCBvbmx5IHdoZW4gYSBjeWNsZSBnb2VzIGJ5Ci0gKiB3aXRob3V0IHRoZSBuZWVkIHRvIHNwYXduLgotICovCi1zdGF0aWMgaW50IHNwYXduX3JhdGUgPSAxOwotI2lmbmRlZiBNQVhfU1BBV05fUkFURQotI2RlZmluZSBNQVhfU1BBV05fUkFURQkoMzIpCi0jZW5kaWYKLXN0YXRpYyBpbnQgaG9sZF9vZmZfb25fZXhwb25lbnRpYWxfc3Bhd25pbmc7Ci0KLXN0YXRpYyB2b2lkIHBlcmZvcm1faWRsZV9zZXJ2ZXJfbWFpbnRlbmFuY2Uodm9pZCkKLXsKLSAgICBpbnQgaTsKLSAgICB0aW1lX3Qgbm93ID0gMDsKLSAgICBpbnQgZnJlZV9sZW5ndGg7Ci0gICAgaW50IGZyZWVfc2xvdHNbTUFYX1NQQVdOX1JBVEVdOwotICAgIGludCBsYXN0X25vbl9kZWFkOwotCi0gICAgLyogaW5pdGlhbGl6ZSB0aGUgZnJlZV9saXN0ICovCi0gICAgZnJlZV9sZW5ndGggPSAwOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGFwX3RocmVhZF9saW1pdDsgKytpKSB7Ci0gICAgICAgIGlmIChhcF9jaGlsZF90YWJsZVtpXS5zdGF0dXMgPT0gU0VSVkVSX0RFQUQpIHsKLSAgICAgICAgICAgIGlmIChmcmVlX2xlbmd0aCA8IHNwYXduX3JhdGUpIHsKLSAgICAgICAgICAgICAgICBmcmVlX3Nsb3RzW2ZyZWVfbGVuZ3RoXSA9IGk7Ci0gICAgICAgICAgICAgICAgKytmcmVlX2xlbmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGxhc3Rfbm9uX2RlYWQgPSBpOwotICAgICAgICB9Ci0KLSAgICAJaWYgKGkgPj0gYXBfbWF4X2NoaWxkX2Fzc2lnbmVkICYmIGZyZWVfbGVuZ3RoID49IHNwYXduX3JhdGUpIHsKLQkgICAgICAgICBicmVhazsKLQkgICAgfQotICAgIH0KLSAgICBhcF9tYXhfY2hpbGRfYXNzaWduZWQgPSBsYXN0X25vbl9kZWFkICsgMTsKLQotICAgIGlmIChmcmVlX2xlbmd0aCA+IDApIHsKLSAgICAJZm9yIChpID0gMDsgaSA8IGZyZWVfbGVuZ3RoOyArK2kpIHsKLQkgICAgICAgIG1ha2Vfd29ya2VyKGFwX3NlcnZlcl9jb25mLCBmcmVlX3Nsb3RzW2ldLCBub3cpOwotCSAgICB9Ci0JICAgIC8qIHRoZSBuZXh0IHRpbWUgYXJvdW5kIHdlIHdhbnQgdG8gc3Bhd24gdHdpY2UgYXMgbWFueSBpZiB0aGlzCi0JICAgICAqIHdhc24ndCBnb29kIGVub3VnaCwgYnV0IG5vdCBpZiB3ZSd2ZSBqdXN0IGRvbmUgYSBncmFjZWZ1bAotCSAgICAgKi8KLQkgICAgaWYgKGhvbGRfb2ZmX29uX2V4cG9uZW50aWFsX3NwYXduaW5nKSB7Ci0JICAgICAgICAtLWhvbGRfb2ZmX29uX2V4cG9uZW50aWFsX3NwYXduaW5nOwotCSAgICB9IGVsc2UgaWYgKHNwYXduX3JhdGUgPCBNQVhfU1BBV05fUkFURSkgewotCSAgICAgICAgc3Bhd25fcmF0ZSAqPSAyOwotCSAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3Bhd25fcmF0ZSA9IDE7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBzZXJ2ZXJfbWFpbl9sb29wKGludCByZW1haW5pbmdfdGhyZWFkc190b19zdGFydCkKLXsKLSAgICBpbnQgY2hpbGRfc2xvdDsKLSAgICBhcF93YWl0X3Qgc3RhdHVzOwotICAgIGFwX3Byb2NfdCBwaWQ7Ci0gICAgaW50IGk7Ci0KLSAgICB3aGlsZSAoIXJlc3RhcnRfcGVuZGluZyAmJiAhc2h1dGRvd25fcGVuZGluZykgewotICAgICAgICBhcF93YWl0X29yX3RpbWVvdXQoJnN0YXR1cywgJnBpZCwgcGNvbmYpOwotICAgICAgICAgCi0gICAgICAgIGlmIChwaWQucGlkID49IDApIHsKLSAgICAgICAgICAgIHByb2Nlc3NfY2hpbGRfc3RhdHVzKHBpZC5waWQsIHN0YXR1cyk7Ci0gICAgICAgICAgICAvKiBub24tZmF0YWwgZGVhdGguLi4gbm90ZSB0aGF0IGl0J3MgZ29uZSBpbiB0aGUgc2NvcmVib2FyZC4gKi8KLSAgICAgICAgICAgIGNoaWxkX3Nsb3QgPSAtMTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcF9tYXhfY2hpbGRfYXNzaWduZWQ7ICsraSkgewotICAgICAgICAJaWYgKGFwX2NoaWxkX3RhYmxlW2ldLnBpZCA9PSBwaWQucGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBqOwotCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkX3Nsb3QgPSBpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgSEFSRF9USFJFQURfTElNSVQ7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBfYmVvc19mb3JjZV9yZXNldF9jb25uZWN0aW9uX3N0YXR1cyhpICogSEFSRF9USFJFQURfTElNSVQgKyBqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2hpbGRfc2xvdCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgYXBfY2hpbGRfdGFibGVbY2hpbGRfc2xvdF0uc3RhdHVzID0gU0VSVkVSX0RFQUQ7Ci0gICAgICAgICAgICAgICAgCi0JCWlmIChyZW1haW5pbmdfdGhyZWFkc190b19zdGFydAotCQkgICAgJiYgY2hpbGRfc2xvdCA8IGFwX3RocmVhZF9saW1pdCkgewotCQkgICAgLyogd2UncmUgc3RpbGwgZG9pbmcgYSAxLWZvci0xIHJlcGxhY2VtZW50IG9mIGRlYWQKLSAgICAgICAgICAgICAgICAgICAgICogY2hpbGRyZW4gd2l0aCBuZXcgY2hpbGRyZW4KLSAgICAgICAgICAgICAgICAgICAgICovCi0JCSAgICBtYWtlX3dvcmtlcihhcF9zZXJ2ZXJfY29uZiwgY2hpbGRfc2xvdCwgdGltZShOVUxMKSk7Ci0JCSAgICAtLXJlbWFpbmluZ190aHJlYWRzX3RvX3N0YXJ0OwotCQl9Ci0jaWZkZWYgQVBSX0hBU19PVEhFUl9DSElMRAotCSAgICB9Ci0JICAgIGVsc2UgaWYgKGFwX3JlYXBfb3RoZXJfY2hpbGQoJnBpZCwgc3RhdHVzKSA9PSAwKSB7Ci0JCS8qIGhhbmRsZWQgKi8KLSNlbmRpZgotCSAgICB9Ci0JICAgIGVsc2UgaWYgKGlzX2dyYWNlZnVsKSB7Ci0gICAgICAgICAgICAvKiBHcmVhdCwgd2UndmUgcHJvYmFibHkganVzdCBsb3N0IGEgc2xvdCBpbiB0aGUKLQkJICAgICAqIHNjb3JlYm9hcmQuICBTb21laG93IHdlIGRvbid0IGtub3cgYWJvdXQgdGhpcwotCQkgICAgICogY2hpbGQuCi0JCSAgICAgKi8KLQkJICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX1dBUk5JTkcsIGVycm5vLCBhcF9zZXJ2ZXJfY29uZiwKLQkJCSAgICAibG9uZyBsb3N0IGNoaWxkIGNhbWUgaG9tZSEgKHBpZCAlbGQpIiwgcGlkLnBpZCk7Ci0JICAgIH0KLQkgICAgCi0JICAgIC8qIERvbid0IHBlcmZvcm0gaWRsZSBtYWludGVuYW5jZSB3aGVuIGEgY2hpbGQgZGllcywKLSAgICAgICAgICogb25seSBkbyBpdCB3aGVuIHRoZXJlJ3MgYSB0aW1lb3V0LiAgUmVtZW1iZXIgb25seSBhCi0gICAgICAgICAqIGZpbml0ZSBudW1iZXIgb2YgY2hpbGRyZW4gY2FuIGRpZSwgYW5kIGl0J3MgcHJldHR5Ci0gICAgICAgICAqIHBhdGhvbG9naWNhbCBmb3IgYSBsb3QgdG8gZGllIHN1ZGRlbmx5LgotICAgICAgICAgKi8KLQkgICAgY29udGludWU7Ci0JfQotCWVsc2UgaWYgKHJlbWFpbmluZ190aHJlYWRzX3RvX3N0YXJ0KSB7Ci0JICAgIC8qIHdlIGhpdCBhIDEgc2Vjb25kIHRpbWVvdXQgaW4gd2hpY2ggbm9uZSBvZiB0aGUgcHJldmlvdXMKLQkgICAgICogZ2VuZXJhdGlvbiBvZiBjaGlsZHJlbiBuZWVkZWQgdG8gYmUgcmVhcGVkLi4uIHNvIGFzc3VtZQotCSAgICAgKiB0aGV5J3JlIGFsbCBkb25lLCBhbmQgcGljayB1cCB0aGUgc2xhY2sgaWYgYW55IGlzIGxlZnQuCi0JICAgICAqLwotCSAgICBzdGFydHVwX3RocmVhZHMocmVtYWluaW5nX3RocmVhZHNfdG9fc3RhcnQpOwotCSAgICByZW1haW5pbmdfdGhyZWFkc190b19zdGFydCA9IDA7Ci0JICAgIC8qIEluIGFueSBldmVudCB3ZSByZWFsbHkgc2hvdWxkbid0IGRvIHRoZSBjb2RlIGJlbG93IGJlY2F1c2UKLQkgICAgICogZmV3IG9mIHRoZSBzZXJ2ZXJzIHdlIGp1c3Qgc3RhcnRlZCBhcmUgaW4gdGhlIElETEUgc3RhdGUKLQkgICAgICogeWV0LCBzbyB3ZSdkIG1pc3Rha2VubHkgY3JlYXRlIGFuIGV4dHJhIHNlcnZlci4KLQkgICAgICovCi0JICAgIGNvbnRpbnVlOwotCX0KLQotCXBlcmZvcm1faWRsZV9zZXJ2ZXJfbWFpbnRlbmFuY2UoKTsKLSAgICB9Ci19Ci0KLWludCBhcF9tcG1fcnVuKGFwX3Bvb2xfdCAqX3Bjb25mLCBhcF9wb29sX3QgKnBsb2csIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgaW50IHJlbWFpbmluZ190aHJlYWRzX3RvX3N0YXJ0LCBpOwotICAgIGFwX3N0YXR1c190IHJ2OwotICAgIGFwX2xpc3Rlbl9yZWMgKmxyOyAgICAKLSAgICBwY29uZiA9IF9wY29uZjsKLSAgICBhcF9zZXJ2ZXJfY29uZiA9IHM7Ci0KLSAgICBpZiAoKG51bV9saXN0ZW5pbmdfc29ja2V0cyA9IHNldHVwX2xpc3RlbmVycyhhcF9zZXJ2ZXJfY29uZikpIDwgMSkgewotICAgICAgICAvKiBYWFg6IGhleSwgd2hhdCdzIHRoZSByaWdodCB3YXkgZm9yIHRoZSBtcG0gdG8gaW5kaWNhdGUgYSBmYXRhbCBlcnJvcj8gKi8KLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfQUxFUlQsIGVycm5vLCBzLAotICAgICAgICAgICAgIm5vIGxpc3RlbmluZyBzb2NrZXRzIGF2YWlsYWJsZSwgc2h1dHRpbmcgZG93biIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBhcF9sb2dfcGlkKHBjb25mLCBhcF9waWRfZm5hbWUpOwotICAgIAotICAgIC8qCi0gICAgICogQ3JlYXRlIG91ciBsb2Nrcy4uLiAKLSAgICAgKi8KLSAgICAKLSAgICAvKiBhY2NlcHRfbXV0ZXgKLSAgICAgKiB1c2VkIHRvIGxvY2sgYXJvdW5kIHNlbGVjdCBzbyB3ZSBvbmx5IGhhdmUgb25lIHRocmVhZAotICAgICAqIGluIHNlbGVjdCBhdCBhIHRpbWUKLSAgICAgKi8KLSAgICBpZiAoKHJ2ID0gYXBfY3JlYXRlX2xvY2soJmFjY2VwdF9tdXRleCwgQVBSX01VVEVYLCBBUFJfQ1JPU1NfUFJPQ0VTUywKLSAgICAgICAgTlVMTCwgcGNvbmYpKSAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICAvKiB0c2NoIHRzY2gsIGNhbid0IGhhdmUgbW9yZSB0aGFuIG9uZSB0aHJlYWQgaW4gdGhlIGFjY2VwdCBsb29wCi0gICAgICAgICAgIGF0IGEgdGltZSBzbyB3ZSBuZWVkIHRvIGZhbGwgb24gb3VyIHN3b3JkLi4uICovCi0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FTUVSRywgcnYsIHMsCi0gICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgY3JlYXRlIGFjY2VwdCBsb2NrIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICAvKiB3b3JrZXJfdGhyZWFkX2NvdW50X211dGV4Ci0gICAgICogbG9ja3MgdGhlIHdvcmtlcl90aHJlYWRfY291bnQgc28gd2UgaGF2ZSBhbmEgY2N1cmF0ZSBjb3VudC4uLgotICAgICAqLwotICAgIGlmICgocnYgPSBhcF9jcmVhdGVfbG9jaygmd29ya2VyX3RocmVhZF9jb3VudF9tdXRleCwgQVBSX01VVEVYLCBBUFJfQ1JPU1NfUFJPQ0VTUywKLSAgICAgICAgTlVMTCwgcGNvbmYpKSAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkcsIHJ2LCBzLAotICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGNyZWF0ZSB3b3JrZXIgdGhyZWFkIGNvdW50IGxvY2siKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTdGFydHVwL3NodXRkb3duLi4uIAotICAgICAqLwotICAgIAotICAgIGlmICghaXNfZ3JhY2VmdWwpCi0gICAgICAgIHJlaW5pdF9zY29yZWJvYXJkKHBjb25mKTsKLQotICAgIHNldF9zaWduYWxzKCk7Ci0gICAgLyogU2FuaXR5IGNlaGNrcyB0byBhdm9pZCB0aHJhc2hpbmcuLi4gKi8KLSAgICBpZiAobWF4X3NwYXJlX3RocmVhZHMgPCBtaW5fc3BhcmVfdGhyZWFkcyApCi0gICAgICAgIG1heF9zcGFyZV90aHJlYWRzID0gbWluX3NwYXJlX3RocmVhZHM7Ci0KLSAgICAvKiBJZiB3ZSdyZSBkb2luZyBhIGdyYWNlZnVsX3Jlc3RhcnQgdGhlbiB3ZSdyZSBnb2luZyB0byBzZWUgYSBsb3QKLSAgICAgKiBvZiB0aHJlYWRzIGV4aXRpbmcgaW1tZWRpYXRlbHkgd2hlbiB3ZSBnZXQgaW50byB0aGUgbWFpbiBsb29wCi0gICAgICogYmVsb3cgKGJlY2F1c2Ugd2UganVzdCBzZW50IHRoZW0gU0lHV0lOQ0gpLiAgVGhpcyBoYXBwZW5zIHByZXR0eQotICAgICAqIHJhcGlkbHkuLi4gYW5kIGZvciBlYWNoIG9uZSB0aGF0IGV4aXRzIHdlJ2xsIHN0YXJ0IGEgbmV3IG9uZSB1bnRpbAotICAgICAqIHdlIHJlYWNoIGF0IGxlYXN0IHRocmVhZHNfbWluX2ZyZWUuICBCdXQgd2UgbWF5IGJlIHBlcm1pdHRlZCB0bwotICAgICAqIHN0YXJ0IG1vcmUgdGhhbiB0aGF0LCBzbyB3ZSdsbCBqdXN0IGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgd2UncmUKLSAgICAgKiBzdXBwb3NlZCB0byBzdGFydCB1cCB3aXRob3V0IHRoZSAxIHNlY29uZCBwZW5hbHR5IGJldHdlZW4gZWFjaCBmb3JrLgotICAgICAqLwotICAgIHJlbWFpbmluZ190aHJlYWRzX3RvX3N0YXJ0ID0gYXBfdGhyZWFkc190b19zdGFydDsKLSAgICAvKiBzYW5pdHkgY2hlY2sgb24gdGhlIG51bWJlciB0byBzdGFydC4uLiAqLwotICAgIGlmIChyZW1haW5pbmdfdGhyZWFkc190b19zdGFydCA+IGFwX3RocmVhZF9saW1pdCkgewotCSAgICByZW1haW5pbmdfdGhyZWFkc190b19zdGFydCA9IGFwX3RocmVhZF9saW1pdDsKLSAgICB9Ci0KLSAgICAvKiBzZXR1cCB0aGUgY2hpbGQgcG9vbCB0byB1c2UgZm9yIHRoZSB3b3JrZXJzLiAgRWFjaCB3b3JrZXIgY3JlYXRlcwotICAgICAqIGEgc2VwZXJhdGUgcG9vbCBvZiBpdCdzIG93biB0byB1c2UuCi0gICAgICovCi0gICAgYXBfY3JlYXRlX3Bvb2woJnBjaGlsZCwgcGNvbmYpOwotICAgIGFwX2NoaWxkX2luaXRfaG9vayhwY2hpbGQsIGFwX3NlcnZlcl9jb25mKTsKLQotICAgIC8qIE5vdyB0aGF0IHdlIGhhdmUgdGhlIGNoaWxkIHBvb2wgKHBjaGlsZCkgd2UgY2FuIGFsbG9jYXRlCi0gICAgICogdGhlIGxpc3RlbmZkcyBhbmQgY3JlYXQgdGhlIHBvbGxzZXQuLi4KLSAgICAgKi8KLSAgICBsaXN0ZW5pbmdfc29ja2V0cyA9IGFwX3BhbGxvYyhwY2hpbGQsCi0gICAgICAgc2l6ZW9mKCpsaXN0ZW5pbmdfc29ja2V0cykgKiAobnVtX2xpc3RlbmluZ19zb2NrZXRzKSk7Ci0gICAgZm9yIChsciA9IGFwX2xpc3RlbmVycywgaSA9IDA7IGkgPCBudW1fbGlzdGVuaW5nX3NvY2tldHM7IGxyID0gbHItPm5leHQsICsraSkKLQkgICAgbGlzdGVuaW5nX3NvY2tldHNbaV09bHItPnNkOwotCi0gICAgLyogd2UgYXNzdW1lIGFsbCBnb2VzIE9LLi4uaG1tIG1pZ2h0IHdhbnQgdG8gY2hlY2sgdGhhdCEgKi8KLSAgICBpZiAoIWlzX2dyYWNlZnVsKSB7Ci0JICAgIHN0YXJ0dXBfdGhyZWFkcyhyZW1haW5pbmdfdGhyZWFkc190b19zdGFydCk7Ci0JICAgIHJlbWFpbmluZ190aHJlYWRzX3RvX3N0YXJ0ID0gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JICAgIC8qIGdpdmUgdGhlIHN5c3RlbSBzb21lIHRpbWUgdG8gcmVjb3ZlciBiZWZvcmUga2lja2luZyBpbnRvCi0JICAgICAqIGV4cG9uZW50aWFsIG1vZGUgKi8KLSAgICAgICAgaG9sZF9vZmZfb25fZXhwb25lbnRpYWxfc3Bhd25pbmcgPSAxMDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHJlY29yZCB0aGF0IHdlJ3ZlIGVudGVyZWQgdGhlIHdvcmxkICEKLSAgICAgKi8KLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19OT1RJQ0UsIGVycm5vLCBhcF9zZXJ2ZXJfY29uZiwKLQkJIiVzIGNvbmZpZ3VyZWQgLS0gcmVzdW1pbmcgbm9ybWFsIG9wZXJhdGlvbnMiLAotCQlhcF9nZXRfc2VydmVyX3ZlcnNpb24oKSk7Ci0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgZXJybm8sIGFwX3NlcnZlcl9jb25mLAotCQkiU2VydmVyIGJ1aWx0OiAlcyIsIGFwX2dldF9zZXJ2ZXJfYnVpbHQoKSk7Ci0gICAgcmVzdGFydF9wZW5kaW5nID0gc2h1dGRvd25fcGVuZGluZyA9IDA7Ci0KLSAgICAvKgotICAgICAqIG1haW5fbG9vcCB1bnRpbCBpdCdzIGFsbCBvdmVyCi0gICAgICovCi0gICAgc2VydmVyX21haW5fbG9vcChyZW1haW5pbmdfdGhyZWFkc190b19zdGFydCk7Ci0KLSAgICAvKgotICAgICAqIElmIHdlIGdldCBoZXJlIHdlJ3JlIHNodXR0aW5nIGRvd24uLi4KLSAgICAgKi8KLSAgICBpZiAoc2h1dGRvd25fcGVuZGluZykgewotICAgICAgICAvKiBUaW1lIHRvIGdyYWNlZnVsbHkgc2h1dCBkb3duOgotICAgICAgICAgKiBLaWxsIGNoaWxkIHByb2Nlc3NlcywgdGVsbCB0aGVtIHRvIGNhbGwgY2hpbGRfZXhpdCwgZXRjLi4uCi0gICAgICAgICAqLwotICAgICAgICBpZiAoYmVvc2Rfa2lsbHBnKGdldHBncnAoKSwgU0lHVEVSTSkgPCAwKQotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBhcF9zZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAia2lsbHBnIFNJR1RFUk0iKTsKLQotICAgICAgICAvKiBjbGVhbnVwIHBpZCBmaWxlIG9uIG5vcm1hbCBzaHV0ZG93biAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpwaWRmaWxlID0gTlVMTDsKLSAgICAgICAgICAgIHBpZGZpbGUgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZSAocGNvbmYsIGFwX3BpZF9mbmFtZSk7Ci0gICAgICAgICAgICBpZiAoIHBpZGZpbGUgIT0gTlVMTCAmJiB1bmxpbmsocGlkZmlsZSkgPT0gMCkKLSAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19JTkZPLAotICAgICAgICAgICAgCQkgZXJybm8sIGFwX3NlcnZlcl9jb25mLAotICAgICAgICAgICAgCQkgInJlbW92ZWQgUElEIGZpbGUgJXMgKHBpZD0lbGQpIiwKLSAgICAgICAgICAgIAkJIHBpZGZpbGUsIChsb25nKWdldHBpZCgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyogdXNlIGFwX3JlY2xhaW1fY2hpbGRfcHJvY2Vzc2VzIHN0YXJ0aW5nIHdpdGggU0lHVEVSTSAqLwotICAgICAgICBhcF9yZWNsYWltX2NoaWxkX3Byb2Nlc3NlcygxKTsKLQotICAgICAgICAvKiByZWNvcmQgdGhlIHNodXRkb3duIGluIHRoZSBsb2cgKi8KLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCBlcnJubywgYXBfc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAiY2F1Z2h0IFNJR1RFUk0sIHNodXR0aW5nIGRvd24iKTsKLSAgICAKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiB3ZSd2ZSBiZWVuIHRvbGQgdG8gcmVzdGFydCAqLwotICAgIHNpZ25hbChTSUdIVVAsIFNJR19JR04pOwotCi0gICAgaWYgKG9uZV9wcm9jZXNzKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIGlmIChpc19ncmFjZWZ1bCkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19OT1RJQ0UsIGVycm5vLCBhcF9zZXJ2ZXJfY29uZiwKLQkJICAgICJTSUdXSU5DSCByZWNlaXZlZC4gIERvaW5nIGdyYWNlZnVsIHJlc3RhcnQiKTsKLSAgICAgICAgdGVsbF93b3JrZXJzX3RvX2V4aXQoKTsKLSAgICAgICAgLyogVE9ETyAtIG5lZWQgdG8gdGVzdCBzb21lIGlkZWFzIGhlcmUuLi4gKi8KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIEtpbGwgJ2VtIGFsbC4gIFNpbmNlIHRoZSBjaGlsZCBhY3RzIHRoZSBzYW1lIG9uIHRoZSBwYXJlbnRzIFNJR1RFUk0gCi0gICAgICAgICAqIGFuZCBhIFNJR0hVUCwgd2UgbWF5IGFzIHdlbGwgdXNlIHRoZSBzYW1lIHNpZ25hbCwgYmVjYXVzZSBzb21lIHVzZXIKLSAgICAgICAgICogcHRocmVhZHMgYXJlIHN0ZWFsaW5nIHNpZ25hbHMgZnJvbSB1cyBsZWZ0IGFuZCByaWdodC4KLSAgICAgICAgICovCi0gICAgICAgIHB1c2hfd29ya2Vyc19vZmZfY2xpZmYoU0lHVEVSTSk7Ci0JICAgIAotICAgICAgICBhcF9yZWNsYWltX2NoaWxkX3Byb2Nlc3NlcygxKTsJCS8qIFN0YXJ0IHdpdGggU0lHVEVSTSAqLwotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19OT1RJQ0UsIGVycm5vLCBhcF9zZXJ2ZXJfY29uZiwKLQkJICAgICJTSUdIVVAgcmVjZWl2ZWQuICBBdHRlbXB0aW5nIHRvIHJlc3RhcnQiKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKCFpc19ncmFjZWZ1bCkgewotICAgICAgICBhcF9yZXN0YXJ0X3RpbWUgPSB0aW1lKE5VTEwpOyAKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYmVvc19wcmVfY29uZmlnKGFwX3Bvb2xfdCAqcGNvbmYsIGFwX3Bvb2xfdCAqcGxvZywgYXBfcG9vbF90ICpwdGVtcCkKLXsKLSAgICBzdGF0aWMgaW50IHJlc3RhcnRfbnVtID0gMDsKLQotICAgIG9uZV9wcm9jZXNzID0gISFnZXRlbnYoIk9ORV9QUk9DRVNTIik7Ci0KLSAgICAvKiBzaWdoLCB3YW50IHRoaXMgb25seSB0aGUgc2Vjb25kIHRpbWUgYXJvdW5kICovCi0gICAgaWYgKHJlc3RhcnRfbnVtKysgPT0gMSkgewotICAgICAgICBpc19ncmFjZWZ1bCA9IDA7Ci0gICAgICAgIGlmICghb25lX3Byb2Nlc3MpCi0JICAgICAgICBiZW9zZF9kZXRhY2goKTsKLSAgICAgICAgc2VydmVyX3BpZCA9IGdldHBpZCgpOwotICAgIH0KLQotICAgIGJlb3NkX3ByZV9jb25maWcoKTsKLSAgICBhcF9saXN0ZW5fcHJlX2NvbmZpZygpOwotICAgIGFwX3RocmVhZHNfdG9fc3RhcnQgPSBERUZBVUxUX1NUQVJUX1RIUkVBRFM7Ci0gICAgbWluX3NwYXJlX3RocmVhZHMgPSBERUZBVUxUX01JTl9GUkVFX0RBRU1PTiAqIERFRkFVTFRfVEhSRUFEU19QRVJfQ0hJTEQ7Ci0gICAgbWF4X3NwYXJlX3RocmVhZHMgPSBERUZBVUxUX01BWF9GUkVFX0RBRU1PTiAqIERFRkFVTFRfVEhSRUFEU19QRVJfQ0hJTEQ7Ci0gICAgYXBfdGhyZWFkX2xpbWl0ID0gSEFSRF9TRVJWRVJfTElNSVQ7Ci0gICAgYXBfdGhyZWFkc19wZXJfY2hpbGQgPSBERUZBVUxUX1RIUkVBRFNfUEVSX0NISUxEOwotICAgIGFwX3BpZF9mbmFtZSA9IERFRkFVTFRfUElETE9HOwotICAgIGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQgPSBERUZBVUxUX01BWF9SRVFVRVNUU19QRVJfQ0hJTEQ7Ci0gICAgYXBfYmVvc19zZXRfbWFpbnRhaW5fY29ubmVjdGlvbl9zdGF0dXMoMSk7Ci0KLSAgICBhcF9jcHlzdHJuKGFwX2NvcmVkdW1wX2RpciwgYXBfc2VydmVyX3Jvb3QsIHNpemVvZihhcF9jb3JlZHVtcF9kaXIpKTsKLX0KLQotc3RhdGljIHZvaWQgYmVvc19ob29rcyh2b2lkKQotewotICAgIElOSVRfU0lHTElTVCgpCi0gICAgb25lX3Byb2Nlc3MgPSAwOwotICAgIAotICAgIGFwX2hvb2tfcHJlX2NvbmZpZyhiZW9zX3ByZV9jb25maWcsIE5VTEwsIE5VTEwsIEFQX0hPT0tfTUlERExFKTsgCi19Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9waWRmaWxlKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoY21kLT5zZXJ2ZXItPmlzX3ZpcnR1YWwpIHsKLQlyZXR1cm4gIlBpZEZpbGUgZGlyZWN0aXZlIG5vdCBhbGxvd2VkIGluIDxWaXJ0dWFsSG9zdD4iOwotICAgIH0KLSAgICBhcF9waWRfZm5hbWUgPSBhcmc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfc2NvcmVib2FyZChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgYXBfc2NvcmVib2FyZF9mbmFtZSA9IGFyZzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9kYWVtb25zX3RvX3N0YXJ0KGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBhcF90aHJlYWRzX3RvX3N0YXJ0ID0gYXRvaShhcmcpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X21pbl9zcGFyZV90aHJlYWRzKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1pbl9zcGFyZV90aHJlYWRzID0gYXRvaShhcmcpOwotICAgIGlmIChtaW5fc3BhcmVfdGhyZWFkcyA8PSAwKSB7Ci0gICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgIldBUk5JTkc6IGRldGVjdGVkIE1pblNwYXJlVGhyZWFkcyBzZXQgdG8gbm9uLXBvc2l0aXZlLiIpOwotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgIlJlc2V0dGluZyB0byAxIHRvIGF2b2lkIGFsbW9zdCBjZXJ0YWluIEFwYWNoZSBmYWlsdXJlLiIpOwotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICJQbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbi4iKTsKLSAgICAgICBtaW5fc3BhcmVfdGhyZWFkcyA9IDE7Ci0gICAgfQotICAgICAgIAotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X21heF9zcGFyZV90aHJlYWRzKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1heF9zcGFyZV90aHJlYWRzID0gYXRvaShhcmcpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3NlcnZlcl9saW1pdCAoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX3RocmVhZF9saW1pdCA9IGF0b2koYXJnKTsKLSAgICBpZiAoYXBfdGhyZWFkX2xpbWl0ID4gSEFSRF9TRVJWRVJfTElNSVQpIHsKLSAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAiV0FSTklORzogTWF4Q2xpZW50cyBvZiAlZCBleGNlZWRzIGNvbXBpbGUgdGltZSBsaW1pdCAiCi0gICAgICAgICAgICAgICAgICAgICJvZiAlZCBzZXJ2ZXJzLCIsIGFwX3RocmVhZF9saW1pdCwgSEFSRF9TRVJWRVJfTElNSVQpOwotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICIgbG93ZXJpbmcgTWF4Q2xpZW50cyB0byAlZC4gIFRvIGluY3JlYXNlLCBwbGVhc2UgIgotICAgICAgICAgICAgICAgICAgICAic2VlIHRoZSIsIEhBUkRfU0VSVkVSX0xJTUlUKTsKLSAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAiIEhBUkRfU0VSVkVSX0xJTUlUIGRlZmluZSBpbiBzcmMvaW5jbHVkZS9odHRwZC5oLiIpOwotICAgICAgIGFwX3RocmVhZF9saW1pdCA9IEhBUkRfU0VSVkVSX0xJTUlUOwotICAgIH0gCi0gICAgZWxzZSBpZiAoYXBfdGhyZWFkX2xpbWl0IDwgMSkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIldBUk5JTkc6IFJlcXVpcmUgTWF4Q2xpZW50cyA+IDAsIHNldHRpbmcgdG8gMSIpOwotICAgICAgICBhcF90aHJlYWRfbGltaXQgPSAxOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF90aHJlYWRzX3Blcl9jaGlsZCAoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX3RocmVhZHNfcGVyX2NoaWxkID0gYXRvaShhcmcpOwotICAgIGlmIChhcF90aHJlYWRzX3Blcl9jaGlsZCA+IEhBUkRfVEhSRUFEX0xJTUlUKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiV0FSTklORzogVGhyZWFkc1BlckNoaWxkIG9mICVkIGV4Y2VlZHMgY29tcGlsZSB0aW1lIgotICAgICAgICAgICAgICAgICAgICAgImxpbWl0IG9mICVkIHRocmVhZHMsXG4iLCBhcF90aHJlYWRzX3Blcl9jaGlsZCwKLSAgICAgICAgICAgICAgICAgICAgIEhBUkRfVEhSRUFEX0xJTUlUKTsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICIgbG93ZXJpbmcgVGhyZWFkc1BlckNoaWxkIHRvICVkLiBUbyBpbmNyZWFzZSwgcGxlYXNlIgotICAgICAgICAgICAgICAgICAgICAgInNlZSB0aGUiLCBIQVJEX1RIUkVBRF9MSU1JVCk7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiIEhBUkRfVEhSRUFEX0xJTUlUIGRlZmluZSBpbiBzcmMvaW5jbHVkZS9odHRwZC5oLiIpOwotICAgIH0KLSAgICBlbHNlIGlmIChhcF90aHJlYWRzX3Blcl9jaGlsZCA8IDEpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIldBUk5JTkc6IFJlcXVpcmUgVGhyZWFkc1BlckNoaWxkID4gMCwgc2V0dGluZyB0byAxIik7Ci0JYXBfdGhyZWFkc19wZXJfY2hpbGQgPSAxOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9tYXhfcmVxdWVzdHMoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQgPSBhdG9pKGFyZyk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9tYWludGFpbl9jb25uZWN0aW9uX3N0YXR1cyhjbWRfcGFybXMgKmNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZV9kaXJfY29uZmlnICpkLCBpbnQgYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBhcF9iZW9zX3NldF9tYWludGFpbl9jb25uZWN0aW9uX3N0YXR1cyhhcmcgIT0gMCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfY29yZWR1bXBkaXIgKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBhcF9maW5mb190IGZpbmZvOwotICAgIGNvbnN0IGNoYXIgKmZuYW1lOwotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGZuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUoY21kLT5wb29sLCBhcmcpOwotICAgIGlmICgoYXBfc3RhdCgmZmluZm8sIGZuYW1lLCBjbWQtPnBvb2wpICE9IEFQUl9TVUNDRVNTKSB8fCAKLSAgICAgICAgKGZpbmZvLmZpbGV0eXBlICE9IEFQUl9ESVIpKSB7Ci0JcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCAiQ29yZUR1bXBEaXJlY3RvcnkgIiwgZm5hbWUsIAotCQkJICAiIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhIGRpcmVjdG9yeSIsIE5VTEwpOwotICAgIH0KLSAgICBhcF9jcHlzdHJuKGFwX2NvcmVkdW1wX2RpciwgZm5hbWUsIHNpemVvZihhcF9jb3JlZHVtcF9kaXIpKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIGJlb3NfY21kc1tdID0gewotVU5JWF9EQUVNT05fQ09NTUFORFMKLUxJU1RFTl9DT01NQU5EUwoteyAiUGlkRmlsZSIsIHNldF9waWRmaWxlLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAgICJBIGZpbGUgZm9yIGxvZ2dpbmcgdGhlIHNlcnZlciBwcm9jZXNzIElEIn0sCi17ICJTY29yZUJvYXJkRmlsZSIsIHNldF9zY29yZWJvYXJkLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAgICJBIGZpbGUgZm9yIEFwYWNoZSB0byBtYWludGFpbiBydW50aW1lIHByb2Nlc3MgbWFuYWdlbWVudCBpbmZvcm1hdGlvbiJ9LAoteyAiU3RhcnRTZXJ2ZXJzIiwgc2V0X2RhZW1vbnNfdG9fc3RhcnQsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJOdW1iZXIgb2YgY2hpbGQgcHJvY2Vzc2VzIGxhdW5jaGVkIGF0IHNlcnZlciBzdGFydHVwIiB9LAoteyAiTWluU3BhcmVUaHJlYWRzIiwgc2V0X21pbl9zcGFyZV90aHJlYWRzLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiTWluaW11bSBudW1iZXIgb2YgaWRsZSBjaGlsZHJlbiwgdG8gaGFuZGxlIHJlcXVlc3Qgc3Bpa2VzIiB9LAoteyAiTWF4U3BhcmVUaHJlYWRzIiwgc2V0X21heF9zcGFyZV90aHJlYWRzLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiTWF4aW11bSBudW1iZXIgb2YgaWRsZSBjaGlsZHJlbiIgfSwKLXsgIk1heENsaWVudHMiLCBzZXRfc2VydmVyX2xpbWl0LCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiTWF4aW11bSBudW1iZXIgb2YgY2hpbGRyZW4gYWxpdmUgYXQgdGhlIHNhbWUgdGltZSIgfSwKLXsgIlRocmVhZHNQZXJDaGlsZCIsIHNldF90aHJlYWRzX3Blcl9jaGlsZCwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIk51bWJlciBvZiB0aHJlYWRzIGVhY2ggY2hpbGQgY3JlYXRlcyIgfSwKLXsgIk1heFJlcXVlc3RzUGVyQ2hpbGQiLCBzZXRfbWF4X3JlcXVlc3RzLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiTWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdHMgYSBwYXJ0aWN1bGFyIGNoaWxkIHNlcnZlcyBiZWZvcmUgZHlpbmcuIiB9LAoteyAiQ29ubmVjdGlvblN0YXR1cyIsIHNldF9tYWludGFpbl9jb25uZWN0aW9uX3N0YXR1cywgTlVMTCwgUlNSQ19DT05GLCBGTEFHLAotICAiV2hldGhlciBvciBub3QgdG8gbWFpbnRhaW4gc3RhdHVzIGluZm9ybWF0aW9uIG9uIGN1cnJlbnQgY29ubmVjdGlvbnMifSwKLXsgIkNvcmVEdW1wRGlyZWN0b3J5Iiwgc2V0X2NvcmVkdW1wZGlyLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiVGhlIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RvcnkgQXBhY2hlIGNoYW5nZXMgdG8gYmVmb3JlIGR1bXBpbmcgY29yZSIgfSwKLXsgTlVMTCB9Ci19OwotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgbXBtX2Jlb3NfbW9kdWxlID0gewotICAgIE1QTTIwX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaG9vayB0byBydW4gYmVmb3JlIGFwYWNoZSBwYXJzZXMgYXJncyAqLwotICAgIE5VTEwsCQkJLyogY3JlYXRlIHBlci1kaXJlY3RvcnkgY29uZmlnIHN0cnVjdHVyZSAqLwotICAgIE5VTEwsCQkJLyogbWVyZ2UgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIE5VTEwsCQkJLyogY3JlYXRlIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZSAqLwotICAgIE5VTEwsCQkJLyogbWVyZ2UgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIGJlb3NfY21kcywJCS8qIGNvbW1hbmQgYXBfdGFibGVfdCAqLwotICAgIE5VTEwsCQkJLyogaGFuZGxlcnMgKi8KLSAgICBiZW9zX2hvb2tzCQkvKiByZWdpc3Rlcl9ob29rcyAqLwotfTsKLQpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9iZW9zL2Jlb3MuaCBiL3NlcnZlci9tcG0vYmVvcy9iZW9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3Y2ZmZGUuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9iZW9zL2Jlb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotI2lmbmRlZiBBUEFDSEVfTVBNX0JFT1NfSAotI2RlZmluZSBBUEFDSEVfTVBNX0JFT1NfSAotCi1leHRlcm4gaW50IGFwX3RocmVhZHNfcGVyX2NoaWxkOwotZXh0ZXJuIGludCBhcF9tYXhfcmVxdWVzdHNfcGVyX2NoaWxkOwotZXh0ZXJuIGludCBhcF9waXBlX29mX2RlYXRoWzJdOwotZXh0ZXJuIGludCBhcF9leHRlbmRlZF9zdGF0dXM7Ci1leHRlcm4gdm9pZCBjbGVhbl9jaGlsZF9leGl0KGludCk7Ci1leHRlcm4gaW50IG1heF9kYWVtb25zX2xpbWl0OwotCi0jZW5kaWYgLyogQVBBQ0hFX01QTV9CRU9TX0ggKi8KZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vYmVvcy9jb25maWc1Lm00IGIvc2VydmVyL21wbS9iZW9zL2NvbmZpZzUubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMjAxNDAuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9iZW9zL2NvbmZpZzUubTQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWRubCAjIyBYWFggLSBOZWVkIGEgbW9yZSB0aG9yb3VnaCBjaGVjayBvZiB0aGUgcHJvcGVyIGZsYWdzIHRvIHVzZQotCi1pZiB0ZXN0ICIkTVBNX05BTUUiID0gImJlb3MiIDsgdGhlbgotICAgIGFwYWNoZV9hcHJfZmxhZ3M9Ii0tZW5hYmxlLXRocmVhZHMiCi0KLSAgICBBUEFDSEVfRkFTVF9PVVRQVVQoc2VydmVyL21wbS8kTVBNX05BTUUvTWFrZWZpbGUpCi1maQpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9iZW9zL21wbS5oIGIvc2VydmVyL21wbS9iZW9zL21wbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjRlMjM3Li4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vYmVvcy9tcG0uaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotI2lmbmRlZiBBUEFDSEVfTVBNX0JFT1NfSAotI2RlZmluZSBBUEFDSEVfTVBNX0JFT1NfSAotCi0jZGVmaW5lIEJFT1NfTVBNCi1leHRlcm4gaW50IGFwX21heF9jaGlsZF9hc3NpZ25lZDsKLSNpbmNsdWRlICJzY29yZWJvYXJkLmgiCi0KLSNkZWZpbmUgU0VSVkVSX0RFQUQgMAotI2RlZmluZSBTRVJWRVJfRFlJTkcgMQotI2RlZmluZSBTRVJWRVJfQUxJVkUgMgotCi10eXBlZGVmIHN0cnVjdCBhcF9jdGFibGV7Ci0gICAgcGlkX3QgcGlkOwotICAgIHVuc2lnbmVkIGNoYXIgc3RhdHVzOwotfSBhcF9jdGFibGU7Ci0KLWV4dGVybiBhcF9jdGFibGUgYXBfY2hpbGRfdGFibGVbSEFSRF9TRVJWRVJfTElNSVRdOwotZXh0ZXJuIHNlcnZlcl9yZWMgKmFwX3NlcnZlcl9jb25mOwotCi0KLSNlbmRpZiAvKiBBUEFDSEVfTVBNX0JFT1NfSCAqLwpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9iZW9zL21wbV9kZWZhdWx0LmggYi9zZXJ2ZXIvbXBtL2Jlb3MvbXBtX2RlZmF1bHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlMDU1ZC4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL2Jlb3MvbXBtX2RlZmF1bHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBiYXNlZCB1cG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUKLSAqIG9yaWdpbmFsbHkgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsCi0gKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICovCi0KLSNpZm5kZWYgQVBBQ0hFX01QTV9ERUZBVUxUX0gKLSNkZWZpbmUgQVBBQ0hFX01QTV9ERUZBVUxUX0gKLQotLyogTnVtYmVyIG9mIHNlcnZlcnMgdG8gc3Bhd24gb2ZmIGJ5IGRlZmF1bHQgLS0tIGFsc28sIGlmIGZld2VyIHRoYW4KLSAqIHRoaXMgZnJlZSB3aGVuIHRoZSBjYXJldGFrZXIgY2hlY2tzLCBpdCB3aWxsIHNwYXduIG1vcmUuCi0gKi8KLSNpZm5kZWYgREVGQVVMVF9TVEFSVF9EQUVNT04KLSNkZWZpbmUgREVGQVVMVF9TVEFSVF9EQUVNT04gNQotI2VuZGlmCi0jZGVmaW5lIERFRkFVTFRfU1RBUlRfVEhSRUFEUyAyMAotCi0vKiBNYXhpbXVtIG51bWJlciBvZiAqZnJlZSogc2VydmVyIHByb2Nlc3NlcyAtLS0gbW9yZSB0aGFuIHRoaXMsIGFuZAotICogdGhleSB3aWxsIGRpZSBvZmYuCi0gKi8KLQotI2lmbmRlZiBERUZBVUxUX01BWF9GUkVFX0RBRU1PTgotI2RlZmluZSBERUZBVUxUX01BWF9GUkVFX0RBRU1PTiAxMAotI2VuZGlmCi0KLS8qIE1pbmltdW0gLS0tIGZld2VyIHRoYW4gdGhpcywgYW5kIG1vcmUgd2lsbCBiZSBjcmVhdGVkICovCi0KLSNpZm5kZWYgREVGQVVMVF9NSU5fRlJFRV9EQUVNT04KLSNkZWZpbmUgREVGQVVMVF9NSU5fRlJFRV9EQUVNT04gNQotI2VuZGlmCi0KLS8qIExpbWl0IG9uIHRoZSB0b3RhbCAtLS0gY2xpZW50cyB3aWxsIGJlIGxvY2tlZCBvdXQgaWYgbW9yZSBzZXJ2ZXJzIHRoYW4KLSAqIHRoaXMgYXJlIG5lZWRlZC4gIEl0IGlzIGludGVuZGVkIHNvbGVseSB0byBrZWVwIHRoZSBzZXJ2ZXIgZnJvbSBjcmFzaGluZwotICogd2hlbiB0aGluZ3MgZ2V0IG91dCBvZiBoYW5kLgotICoKLSAqIFdlIGtlZXAgYSBoYXJkIG1heGltdW0gbnVtYmVyIG9mIHNlcnZlcnMsIGZvciB0d28gcmVhc29ucyAtLS0gZmlyc3Qgb2ZmLAotICogaW4gY2FzZSBzb21ldGhpbmcgZ29lcyBzZXJpb3VzbHkgd3JvbmcsIHdlIHdhbnQgdG8gc3RvcCB0aGUgZm9yayBib21iCi0gKiBzaG9ydCBvZiBhY3R1YWxseSBjcmFzaGluZyB0aGUgbWFjaGluZSB3ZSdyZSBydW5uaW5nIG9uIGJ5IGZpbGxpbmcgc29tZQotICoga2VybmVsIHRhYmxlLiAgU2Vjb25kbHksIGl0IGtlZXBzIHRoZSBzaXplIG9mIHRoZSBzY29yZWJvYXJkIGZpbGUgc21hbGwKLSAqIGVub3VnaCB0aGF0IHdlIGNhbiByZWFkIHRoZSB3aG9sZSB0aGluZyB3aXRob3V0IHdvcnJ5aW5nIHRvbyBtdWNoIGFib3V0Ci0gKiB0aGUgb3ZlcmhlYWQuCi0gKi8KLSAKLSNpZmRlZiBOT19USFJFQURTCi0jZGVmaW5lIEhBUkRfU0VSVkVSX0xJTUlUIDI1NgotI2VuZGlmCi0jaWZuZGVmIEhBUkRfU0VSVkVSX0xJTUlUCi0jZGVmaW5lIEhBUkRfU0VSVkVSX0xJTUlUIDY0IAotI2VuZGlmCi0KLS8qIExpbWl0IG9uIHRoZSB0aHJlYWRzIHBlciBwcm9jZXNzLiAgQ2xpZW50cyB3aWxsIGJlIGxvY2tlZCBvdXQgaWYgbW9yZSB0aGFuCi0gKiB0aGlzICAqIEhBUkRfU0VSVkVSX0xJTUlUIGFyZSBuZWVkZWQuCi0gKgotICogV2Uga2VlcCB0aGlzIGZvciBvbmUgcmVhc29uIGl0IGtlZXBzIHRoZSBzaXplIG9mIHRoZSBzY29yZWJvYXJkIGZpbGUgc21hbGwKLSAqIGVub3VnaCB0aGF0IHdlIGNhbiByZWFkIHRoZSB3aG9sZSB0aGluZyB3aXRob3V0IHdvcnJ5aW5nIHRvbyBtdWNoIGFib3V0Ci0gKiB0aGUgb3ZlcmhlYWQuCi0gKi8KLSNpZmRlZiBOT19USFJFQURTCi0jZGVmaW5lIEhBUkRfVEhSRUFEX0xJTUlUIDEKLSNlbmRpZgotI2lmbmRlZiBIQVJEX1RIUkVBRF9MSU1JVAotI2RlZmluZSBIQVJEX1RIUkVBRF9MSU1JVCA2NCAKLSNlbmRpZgotCi0jaWZkZWYgTk9fVEhSRUFEUwotI2RlZmluZSBERUZBVUxUX1RIUkVBRFNfUEVSX0NISUxEIDEKLSNlbmRpZgotI2lmbmRlZiBERUZBVUxUX1RIUkVBRFNfUEVSX0NISUxECi0jZGVmaW5lIERFRkFVTFRfVEhSRUFEU19QRVJfQ0hJTEQgMTAKLSNlbmRpZgotCi0vKiBXaGVyZSB0aGUgbWFpbi9wYXJlbnQgcHJvY2VzcydzIHBpZCBpcyBsb2dnZWQgKi8KLSNpZm5kZWYgREVGQVVMVF9QSURMT0cKLSNkZWZpbmUgREVGQVVMVF9QSURMT0cgImxvZ3MvaHR0cGQucGlkIgotI2VuZGlmCi0KLS8qCi0gKiBJbnRlcnZhbCwgaW4gbWljcm9zZWNvbmRzLCBiZXR3ZWVuIHNjb3JlYm9hcmQgbWFpbnRlbmFuY2UuCi0gKi8KLSNpZm5kZWYgU0NPUkVCT0FSRF9NQUlOVEVOQU5DRV9JTlRFUlZBTAotI2RlZmluZSBTQ09SRUJPQVJEX01BSU5URU5BTkNFX0lOVEVSVkFMIDEwMDAwMDAKLSNlbmRpZgotCi0vKiBOdW1iZXIgb2YgcmVxdWVzdHMgdG8gdHJ5IHRvIGhhbmRsZSBpbiBhIHNpbmdsZSBwcm9jZXNzLiAgSWYgPD0gMCwKLSAqIHRoZSBjaGlsZHJlbiBkb24ndCBkaWUgb2ZmLgotICovCi0jaWZuZGVmIERFRkFVTFRfTUFYX1JFUVVFU1RTX1BFUl9DSElMRAotI2RlZmluZSBERUZBVUxUX01BWF9SRVFVRVNUU19QRVJfQ0hJTEQgMTAwMDAKLSNlbmRpZgotCi0jZW5kaWYgLyogQVBfTVBNX0RFRkFVTFRfSCAqLwpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9jb25maWcubTQgYi9zZXJ2ZXIvbXBtL2NvbmZpZy5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MzMGZkMC4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL2NvbmZpZy5tNAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLUFDX01TR19DSEVDS0lORyh3aGljaCBNUE0gdG8gdXNlKQotQUNfQVJHX1dJVEgobXBtLAotWyAgLS13aXRoLW1wbT1NUE0gICAgICAgICAgQ2hvb3NlIHRoZSBwcm9jZXNzIG1vZGVsLCBldGMuIGZvciBBcGFjaGUgdG8gdXNlLl0sCi1bCi0gIGlmIHRlc3QgIiR3aXRodmFsIiAhPSAibm8iIDsgdGhlbgotICAgIGFwYWNoZV9jdl9tcG09JHdpdGh2YWwKLSAgICBBQ19NU0dfUkVTVUxUKCRhcGFjaGVfY3ZfbXBtKQotICBlbHNlCi0gICAgQUNfTVNHX0VSUk9SKEFuIE1QTSBtdXN0IGJlIHNwZWNpZmllZCkKLSAgZmkKLV0sWwotICBBQ19NU0dfRVJST1IoQW4gTVBNIG11c3QgYmUgc3BlY2lmaWVkKQotXSkKLQotQVBBQ0hFX09VVFBVVChtb2R1bGVzL21wbS9NYWtlZmlsZSkKLU1QTV9OQU1FPSRhcGFjaGVfY3ZfbXBtCi1NUE1fRElSPW1vZHVsZXMvbXBtLyRNUE1fTkFNRQotTVBNX0xJQj0kTVBNX0RJUi9saWIke01QTV9OQU1FfS5sYQotCi1BQ19TVUJTVChNUE1fTkFNRSkKLQotZG5sIEFsbCB0aGUgdW5peCBNUE1zIHVzZSBzaGFyZWQgbWVtb3J5OyBzYXZlIGEgbGl0dGxlIGR1cGxpY2F0aW9uCi1BQ19ERUZVTihBUEFDSEVfTVBNX0NIRUNLX1NITUVNLCBbCi0gICAgQUNfQ0hFQ0tfRlVOQ1Moc2htZ2V0KQotICAgIEFDX0ZVTkNfTU1BUAotICAgIAotICAgIEFDX01TR19DSEVDS0lORyh3aGljaCBzaGFyZWQgbWVtb3J5IG1lY2hhbmlzbSB0byB1c2UpCi0gICAgaWYgdGVzdCAiJGFjX2N2X2Z1bmNfc2htZ2V0IiA9ICJ5ZXMiIDsgdGhlbgotICAgICAgICBBQ19ERUZJTkUoVVNFX1NITUdFVF9TQ09SRUJPQVJEKQotICAgICAgICBBQ19NU0dfUkVTVUxUKHNobWdldCkKLSAgICBlbGlmIHRlc3QgIiRhY19jdl9mdW5jX21tYXAiID0gInllcyIgOyB0aGVuCi0gICAgICAgIEFDX0RFRklORShVU0VfTU1BUF9TQ09SRUJPQVJEKQotICAgICAgICBBQ19NU0dfUkVTVUxUKG1tYXApCi0gICAgZWxzZQotICAgICAgICBBQ19NU0dfRVJST1IoTm8ga25vd24gc2hhcmVkIG1lbW9yeSBzeXN0ZW0pCi0gICAgZmkKLV0pCi0KLWRubCBDaGVjayBmb3IgcHRocmVhZHMgYW5kIGF0dGVtcHQgdG8gc3VwcG9ydCBpdAotQUNfREVGVU4oQVBBQ0hFX01QTV9QVEhSRUFELCBbCi0KLWRubCBYWFggLSBXZSBzaG91bGQgYmUgY2hlY2tpbmcgZm9yIHRoZSBwcm9wZXIgZmxhZ3MgdG8gdXNlIG9uIGEgcGFydGljdWxhciAKLWRubCBwbGF0Zm9ybS4gVGhpcyB3aWxsIGNvdmVyIGEgY291cGxlIG9mIHRoZW0sIGFueXdheQotICAgIENGTEFHUz0iLXB0aHJlYWQgJENGTEFHUyIKLSAgICBDWFhGTEFHUz0iLXB0aHJlYWQgJENYWEZMQUdTIgotCi0gICAgQUNfQ0hFQ0tfSEVBREVSKHB0aHJlYWQuaCwgWyBdLFsKLSAgICAgICAgQUNfTVNHX0VSUk9SKFRoaXMgTVBNIHJlcXVpcmVzIHB0aHJlYWRzLiBUcnkgLS13aXRoLW1wbT1wcmVmb3JrLikKLSAgICBdKQotICAgIEFDX0NIRUNLX0ZVTkMocHRocmVhZF9jcmVhdGUsIFsgXSxbCi0gICAgICAgIEFDX01TR19FUlJPUihDYW4ndCBjb21waWxlIHB0aHJlYWQgY29kZS4pCi0gICAgXSkKLQotICAgIGRubCBVc2VyIHRocmVhZHMgbGlicmFyaWVzIG5lZWQgcHRocmVhZC5oIGluY2x1ZGVkIGV2ZXJ5d2hlcmUKLSAgICBBQ19ERUZJTkUoUFRIUkVBRF9FVkVSWVdIRVJFKQotXSkKZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vZXhwZXJpbWVudGFsL3BlcmNoaWxkLy5jdnNpZ25vcmUgYi9zZXJ2ZXIvbXBtL2V4cGVyaW1lbnRhbC9wZXJjaGlsZC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGRmMjU3Li4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vZXhwZXJpbWVudGFsL3BlcmNoaWxkLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLS5kZXBzCi0ubGlicwotKi5sbwotKi5sYQotTWFrZWZpbGUKZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vZXhwZXJpbWVudGFsL3BlcmNoaWxkL01ha2VmaWxlLmluIGIvc2VydmVyL21wbS9leHBlcmltZW50YWwvcGVyY2hpbGQvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkODNkNzIuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9leHBlcmltZW50YWwvcGVyY2hpbGQvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQotTFRMSUJSQVJZX05BTUUgICAgPSBsaWJwZXJjaGlsZC5sYQotTFRMSUJSQVJZX1NPVVJDRVMgPSBwZXJjaGlsZC5jIHNjb3JlYm9hcmQuYwotCi1pbmNsdWRlICQodG9wX3NyY2RpcikvYnVpbGQvbHRsaWIubWsKZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vZXhwZXJpbWVudGFsL3BlcmNoaWxkL2NvbmZpZzUubTQgYi9zZXJ2ZXIvbXBtL2V4cGVyaW1lbnRhbC9wZXJjaGlsZC9jb25maWc1Lm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDE3OWJhLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vZXhwZXJpbWVudGFsL3BlcmNoaWxkL2NvbmZpZzUubTQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWRubCAjIyBYWFggLSBOZWVkIGEgbW9yZSB0aG9yb3VnaCBjaGVjayBvZiB0aGUgcHJvcGVyIGZsYWdzIHRvIHVzZQotCi1pZiB0ZXN0ICIkTVBNX05BTUUiID0gInBlcmNoaWxkIiA7IHRoZW4KLQotICAgIEFQQUNIRV9GQVNUX09VVFBVVChzZXJ2ZXIvbXBtLyRNUE1fTkFNRS9NYWtlZmlsZSkKLWZpCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL2V4cGVyaW1lbnRhbC9wZXJjaGlsZC9tcG0uaCBiL3NlcnZlci9tcG0vZXhwZXJpbWVudGFsL3BlcmNoaWxkL21wbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWYwMDMyLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vZXhwZXJpbWVudGFsL3BlcmNoaWxkL21wbS5oCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCi0gKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAotICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqLwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJtcG1fZGVmYXVsdC5oIgotI2luY2x1ZGUgInVuaXhkLmgiCi0KLSNpZm5kZWYgQVBBQ0hFX01QTV9QRVJDSElMRF9ICi0jZGVmaW5lIEFQQUNIRV9NUE1fUEVSQ0hJTERfSAotCi0jZGVmaW5lIFBFUkNISUxEX01QTQotCi0vKiBUYWJsZSBvZiBjaGlsZCBzdGF0dXMgKi8KLSNkZWZpbmUgU0VSVkVSX0RFQUQgMAotI2RlZmluZSBTRVJWRVJfRFlJTkcgMQotI2RlZmluZSBTRVJWRVJfQUxJVkUgMgotCi10eXBlZGVmIHN0cnVjdCBhcF9jdGFibGV7Ci0gICAgcGlkX3QgcGlkOwotICAgIHVuc2lnbmVkIGNoYXIgc3RhdHVzOwotfSBhcF9jdGFibGU7Ci0KLWV4dGVybiBpbnQgYXBfbWF4X2RhZW1vbnNfbGltaXQ7Ci1leHRlcm4gYXBfY3RhYmxlIGFwX2NoaWxkX3RhYmxlW0hBUkRfU0VSVkVSX0xJTUlUXTsKLWV4dGVybiBzZXJ2ZXJfcmVjICphcF9zZXJ2ZXJfY29uZjsKLWV4dGVybiBjaGFyIGFwX2NvcmVkdW1wX2RpcltNQVhfU1RSSU5HX0xFTl07Ci0KLSNlbmRpZiAvKiBBUEFDSEVfTVBNX1BFUkNISUxEX0ggKi8KZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vZXhwZXJpbWVudGFsL3BlcmNoaWxkL21wbV9kZWZhdWx0LmggYi9zZXJ2ZXIvbXBtL2V4cGVyaW1lbnRhbC9wZXJjaGlsZC9tcG1fZGVmYXVsdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmQzMjNiLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vZXhwZXJpbWVudGFsL3BlcmNoaWxkL21wbV9kZWZhdWx0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCi0gKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAotICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqLwotCi0jaWZuZGVmIEFQQUNIRV9NUE1fREVGQVVMVF9ICi0jZGVmaW5lIEFQQUNIRV9NUE1fREVGQVVMVF9ICi0KLS8qIE51bWJlciBvZiB0aHJlYWRzIHRvIHNwYXduIG9mZiBieSBkZWZhdWx0IC0tLSBhbHNvLCBpZiBmZXdlciB0aGFuCi0gKiB0aGlzIGZyZWUgd2hlbiB0aGUgY2FyZXRha2VyIGNoZWNrcywgaXQgd2lsbCBzcGF3biBtb3JlLgotICovCi0jaWZuZGVmIERFRkFVTFRfU1RBUlRfVEhSRUFECi0jZGVmaW5lIERFRkFVTFRfU1RBUlRfVEhSRUFEIDUKLSNlbmRpZgotCi0vKiBNYXhpbXVtIG51bWJlciBvZiAqZnJlZSogc2VydmVyIHRocmVhZHMgLS0tIG1vcmUgdGhhbiB0aGlzLCBhbmQKLSAqIHRoZXkgd2lsbCBkaWUgb2ZmLgotICovCi0KLSNpZm5kZWYgREVGQVVMVF9NQVhfU1BBUkVfVEhSRUFECi0jZGVmaW5lIERFRkFVTFRfTUFYX1NQQVJFX1RIUkVBRCAxMAotI2VuZGlmCi0KLS8qIE1pbmltdW0gLS0tIGZld2VyIHRoYW4gdGhpcywgYW5kIG1vcmUgd2lsbCBiZSBjcmVhdGVkICovCi0KLSNpZm5kZWYgREVGQVVMVF9NSU5fU1BBUkVfVEhSRUFECi0jZGVmaW5lIERFRkFVTFRfTUlOX1NQQVJFX1RIUkVBRCA1Ci0jZW5kaWYKLQotLyogTGltaXQgb24gdGhlIHRocmVhZHMgcGVyIHByb2Nlc3MuICBDbGllbnRzIHdpbGwgYmUgbG9ja2VkIG91dCBpZiBtb3JlIHRoYW4KLSAqIHRoaXMgICogSEFSRF9TRVJWRVJfTElNSVQgYXJlIG5lZWRlZC4KLSAqCi0gKiBXZSBrZWVwIHRoaXMgZm9yIG9uZSByZWFzb24gaXQga2VlcHMgdGhlIHNpemUgb2YgdGhlIHNjb3JlYm9hcmQgZmlsZSBzbWFsbAotICogZW5vdWdoIHRoYXQgd2UgY2FuIHJlYWQgdGhlIHdob2xlIHRoaW5nIHdpdGhvdXQgd29ycnlpbmcgdG9vIG11Y2ggYWJvdXQKLSAqIHRoZSBvdmVyaGVhZC4KLSAqLwotI2lmbmRlZiBIQVJEX1RIUkVBRF9MSU1JVAotI2RlZmluZSBIQVJEX1RIUkVBRF9MSU1JVCA2NCAKLSNlbmRpZgotCi0vKiBOdW1iZXIgb2Ygc2VydmVycyB0byBzcGF3biBvZmYgYnkgZGVmYXVsdAotICovCi0jaWZuZGVmIERFRkFVTFRfTlVNX0RBRU1PTgotI2RlZmluZSBERUZBVUxUX05VTV9EQUVNT04gMgotI2VuZGlmCi0KLS8qIExpbWl0IG9uIHRoZSB0b3RhbCAtLS0gY2xpZW50cyB3aWxsIGJlIGxvY2tlZCBvdXQgaWYgbW9yZSBzZXJ2ZXJzIHRoYW4KLSAqIHRoaXMgYXJlIG5lZWRlZC4gIEl0IGlzIGludGVuZGVkIHNvbGVseSB0byBrZWVwIHRoZSBzZXJ2ZXIgZnJvbSBjcmFzaGluZwotICogd2hlbiB0aGluZ3MgZ2V0IG91dCBvZiBoYW5kLgotICoKLSAqIFdlIGtlZXAgYSBoYXJkIG1heGltdW0gbnVtYmVyIG9mIHNlcnZlcnMsIGZvciB0d28gcmVhc29ucyAtLS0gZmlyc3Qgb2ZmLAotICogaW4gY2FzZSBzb21ldGhpbmcgZ29lcyBzZXJpb3VzbHkgd3JvbmcsIHdlIHdhbnQgdG8gc3RvcCB0aGUgZm9yayBib21iCi0gKiBzaG9ydCBvZiBhY3R1YWxseSBjcmFzaGluZyB0aGUgbWFjaGluZSB3ZSdyZSBydW5uaW5nIG9uIGJ5IGZpbGxpbmcgc29tZQotICoga2VybmVsIHRhYmxlLiAgU2Vjb25kbHksIGl0IGtlZXBzIHRoZSBzaXplIG9mIHRoZSBzY29yZWJvYXJkIGZpbGUgc21hbGwKLSAqIGVub3VnaCB0aGF0IHdlIGNhbiByZWFkIHRoZSB3aG9sZSB0aGluZyB3aXRob3V0IHdvcnJ5aW5nIHRvbyBtdWNoIGFib3V0Ci0gKiB0aGUgb3ZlcmhlYWQuCi0gKi8KLSNpZm5kZWYgSEFSRF9TRVJWRVJfTElNSVQKLSNkZWZpbmUgSEFSRF9TRVJWRVJfTElNSVQgOCAKLSNlbmRpZgotCi0vKiBGaWxlIHVzZWQgZm9yIGFjY2VwdCBsb2NraW5nLCB3aGVuIHdlIHVzZSBhIGZpbGUgKi8KLSNpZm5kZWYgREVGQVVMVF9MT0NLRklMRQotI2RlZmluZSBERUZBVUxUX0xPQ0tGSUxFICJsb2dzL2FjY2VwdC5sb2NrIgotI2VuZGlmCi0KLS8qIFNjb3JlYm9hcmQgZmlsZSwgaWYgdGhlcmUgaXMgb25lICovCi0jaWZuZGVmIERFRkFVTFRfU0NPUkVCT0FSRAotI2RlZmluZSBERUZBVUxUX1NDT1JFQk9BUkQgImxvZ3MvYXBhY2hlX3J1bnRpbWVfc3RhdHVzIgotI2VuZGlmCi0KLS8qIFdoZXJlIHRoZSBtYWluL3BhcmVudCBwcm9jZXNzJ3MgcGlkIGlzIGxvZ2dlZCAqLwotI2lmbmRlZiBERUZBVUxUX1BJRExPRwotI2RlZmluZSBERUZBVUxUX1BJRExPRyAibG9ncy9odHRwZC5waWQiCi0jZW5kaWYKLQotLyoKLSAqIEludGVydmFsLCBpbiBtaWNyb3NlY29uZHMsIGJldHdlZW4gc2NvcmVib2FyZCBtYWludGVuYW5jZS4KLSAqLwotI2lmbmRlZiBTQ09SRUJPQVJEX01BSU5URU5BTkNFX0lOVEVSVkFMCi0jZGVmaW5lIFNDT1JFQk9BUkRfTUFJTlRFTkFOQ0VfSU5URVJWQUwgMTAwMDAwMAotI2VuZGlmCi0KLS8qIE51bWJlciBvZiByZXF1ZXN0cyB0byB0cnkgdG8gaGFuZGxlIGluIGEgc2luZ2xlIHByb2Nlc3MuICBJZiA8PSAwLAotICogdGhlIGNoaWxkcmVuIGRvbid0IGRpZSBvZmYuCi0gKi8KLSNpZm5kZWYgREVGQVVMVF9NQVhfUkVRVUVTVFNfUEVSX0NISUxECi0jZGVmaW5lIERFRkFVTFRfTUFYX1JFUVVFU1RTX1BFUl9DSElMRCAxMDAwMAotI2VuZGlmCi0KLSNlbmRpZiAvKiBBUF9NUE1fREVGQVVMVF9IICovCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL2V4cGVyaW1lbnRhbC9wZXJjaGlsZC9wZXJjaGlsZC5jIGIvc2VydmVyL21wbS9leHBlcmltZW50YWwvcGVyY2hpbGQvcGVyY2hpbGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E5NzQ4Ny4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL2V4cGVyaW1lbnRhbC9wZXJjaGlsZC9wZXJjaGlsZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQzMCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBiYXNlZCB1cG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUKLSAqIG9yaWdpbmFsbHkgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsCi0gKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICovCi0KLSNkZWZpbmUgQ09SRV9QUklWQVRFIAotIAotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImFwcl9zdHJpbmdzLmgiCi0jaW5jbHVkZSAiYXByX3BvcnRhYmxlLmgiCi0jaW5jbHVkZSAiYXByX2ZpbGVfaW8uaCIKLSNpbmNsdWRlICJodHRwZC5oIiAKLSNpbmNsdWRlICJodHRwX21haW4uaCIgCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIgCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIJLyogZm9yIHJlYWRfY29uZmlnICovIAotI2luY2x1ZGUgImh0dHBfY29yZS5oIgkJLyogZm9yIGdldF9yZW1vdGVfaG9zdCAqLyAKLSNpbmNsdWRlICJodHRwX2Nvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJhcF9tcG0uaCIKLSNpbmNsdWRlICJ1bml4ZC5oIgotI2luY2x1ZGUgIm1wbV9jb21tb24uaCIKLSNpbmNsdWRlICJpb2xfc29ja2V0LmgiCi0jaW5jbHVkZSAiYXBfbGlzdGVuLmgiCi0jaW5jbHVkZSAibXBtX2RlZmF1bHQuaCIKLSNpbmNsdWRlICJtcG0uaCIKLSNpbmNsdWRlICJzY29yZWJvYXJkLmgiCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxwb2xsLmg+Ci0jaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX05FVElORVRfVENQX0gKLSNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0vKgotICogQWN0dWFsIGRlZmluaXRpb25zIG9mIGNvbmZpZyBnbG9iYWxzCi0gKi8KLQotc3RhdGljIGludCB0aHJlYWRzX3RvX3N0YXJ0ID0gMDsgICAgICAgICAvKiBXb3JrZXIgdGhyZWFkcyBwZXIgY2hpbGQgKi8KLXN0YXRpYyBpbnQgbWluX3NwYXJlX3RocmVhZHMgPSAwOwotc3RhdGljIGludCBtYXhfc3BhcmVfdGhyZWFkcyA9IDA7Ci1zdGF0aWMgaW50IG1heF90aHJlYWRzID0gMDsKLXN0YXRpYyBpbnQgbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCA9IDA7Ci1zdGF0aWMgY29uc3QgY2hhciAqYXBfcGlkX2ZuYW1lPU5VTEw7Ci1BUElfVkFSX0VYUE9SVCBjb25zdCBjaGFyICphcF9zY29yZWJvYXJkX2ZuYW1lPU5VTEw7Ci1zdGF0aWMgaW50IG51bV9kYWVtb25zPTA7Ci1zdGF0aWMgaW50IHdvcmtlcnNfbWF5X2V4aXQgPSAwOwotc3RhdGljIGludCByZXF1ZXN0c190aGlzX2NoaWxkOwotc3RhdGljIGludCBudW1fbGlzdGVuZmRzID0gMDsKLXN0YXRpYyBhcF9zb2NrZXRfdCAqKmxpc3RlbmZkczsKLQotc3RydWN0IGFwX2N0YWJsZSBhcF9jaGlsZF90YWJsZVtIQVJEX1NFUlZFUl9MSU1JVF07Ci0KLS8qCi0gKiBUaGUgbWF4IGNoaWxkIHNsb3QgZXZlciBhc3NpZ25lZCwgcHJlc2VydmVkIGFjcm9zcyByZXN0YXJ0cy4gIE5lY2Vzc2FyeQotICogdG8gZGVhbCB3aXRoIE51bVNlcnZlcnMgY2hhbmdlcyBhY3Jvc3MgU0lHV0lOQ0ggcmVzdGFydHMuICBXZSB1c2UgdGhpcwotICogdmFsdWUgdG8gb3B0aW1pemUgcm91dGluZXMgdGhhdCBoYXZlIHRvIHNjYW4gdGhlIGVudGlyZSBjaGlsZCB0YWJsZS4KLSAqCi0gKiBYWFggLSBJdCBtaWdodCBub3QgYmUgd29ydGgga2VlcGluZyB0aGlzIGNvZGUgaW4uIFRoZXJlIGFyZW4ndCB2ZXJ5Ci0gKiBtYW55IGNoaWxkIHByb2Nlc3NlcyBpbiB0aGlzIE1QTS4KLSAqLwotaW50IGFwX21heF9kYWVtb25zX2xpbWl0ID0gLTE7Ci0KLWNoYXIgYXBfY29yZWR1bXBfZGlyW01BWF9TVFJJTkdfTEVOXTsKLQotc3RhdGljIGFwX2ZpbGVfdCAqcGlwZV9vZl9kZWF0aF9pbiA9IE5VTEw7Ci1zdGF0aWMgYXBfZmlsZV90ICpwaXBlX29mX2RlYXRoX291dCA9IE5VTEw7Ci1zdGF0aWMgcHRocmVhZF9tdXRleF90IHBpcGVfb2ZfZGVhdGhfbXV0ZXg7Ci0KLS8qICpOb24qLXNoYXJlZCBodHRwX21haW4gZ2xvYmFscy4uLiAqLwotCi1zZXJ2ZXJfcmVjICphcF9zZXJ2ZXJfY29uZjsKLQotLyogb25lX3Byb2Nlc3MgLS0tIGRlYnVnZ2luZyBtb2RlIHZhcmlhYmxlOyBjYW4gYmUgc2V0IGZyb20gdGhlIGNvbW1hbmQgbGluZQotICogd2l0aCB0aGUgLVggZmxhZy4gIElmIHNldCwgdGhpcyBnZXRzIHlvdSB0aGUgY2hpbGRfbWFpbiBsb29wIHJ1bm5pbmcKLSAqIGluIHRoZSBwcm9jZXNzIHdoaWNoIG9yaWdpbmFsbHkgc3RhcnRlZCB1cCAobm8gZGV0YWNoLCBubyBtYWtlX2NoaWxkKSwKLSAqIHdoaWNoIGlzIGEgcHJldHR5IG5pY2UgZGVidWdnaW5nIGVudmlyb25tZW50LiAgKFlvdSdsbCBnZXQgYSBTSUdIVVAKLSAqIGVhcmx5IGluIHN0YW5kYWxvbmVfbWFpbjsganVzdCBjb250aW51ZSB0aHJvdWdoLiAgVGhpcyBpcyB0aGUgc2VydmVyCi0gKiB0cnlpbmcgdG8ga2lsbCBvZmYgYW55IGNoaWxkIHByb2Nlc3NlcyB3aGljaCBpdCBtaWdodCBoYXZlIGx5aW5nCi0gKiBhcm91bmQgLS0tIEFwYWNoZSBkb2Vzbid0IGtlZXAgdHJhY2sgb2YgdGhlaXIgcGlkcywgaXQganVzdCBzZW5kcwotICogU0lHSFVQIHRvIHRoZSBwcm9jZXNzIGdyb3VwLCBpZ25vcmluZyBpdCBpbiB0aGUgcm9vdCBwcm9jZXNzLgotICogQ29udGludWUgdGhyb3VnaCBhbmQgeW91J2xsIGJlIGZpbmUuKS4KLSAqLwotCi1zdGF0aWMgaW50IG9uZV9wcm9jZXNzID0gMDsKLQotI2lmZGVmIERFQlVHX1NJR1NUT1AKLWludCByYWlzZV9zaWdzdG9wX2ZsYWdzOwotI2VuZGlmCi0KLXN0YXRpYyBhcF9wb29sX3QgKnBjb25mOwkJLyogUG9vbCBmb3IgY29uZmlnIHN0dWZmICovCi1zdGF0aWMgYXBfcG9vbF90ICpwY2hpbGQ7CQkvKiBQb29sIGZvciBodHRwZCBjaGlsZCBzdHVmZiAqLwotc3RhdGljIGFwX3Bvb2xfdCAqdGhyZWFkX3Bvb2xfcGFyZW50OyAvKiBQYXJlbnQgb2YgcGVyLXRocmVhZCBwb29scyAqLwotc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCB0aHJlYWRfcG9vbF9wYXJlbnRfbXV0ZXg7Ci0KLXN0YXRpYyBpbnQgY2hpbGRfbnVtOwotc3RhdGljIHVuc2lnbmVkIGludCBteV9waWQ7IC8qIExpbnV4IGdldHBpZCgpIGRvZXNuJ3Qgd29yayBleGNlcHQgaW4gCi0gICAgICAgICAgICAgICAgICAgICAgbWFpbiB0aHJlYWQuIFVzZSB0aGlzIGluc3RlYWQgKi8KLS8qIEtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyBjdXJyZW50bHkgYWN0aXZlICovCi1zdGF0aWMgaW50IHdvcmtlcl90aHJlYWRfY291bnQ7Ci1zdGF0aWMgcHRocmVhZF9tdXRleF90IHdvcmtlcl90aHJlYWRfY291bnRfbXV0ZXg7Ci1zdGF0aWMgaW50IHdvcmtlcl90aHJlYWRfZnJlZV9pZHNbSEFSRF9USFJFQURfTElNSVRdOwotc3RhdGljIHB0aHJlYWRfYXR0cl90IHdvcmtlcl90aHJlYWRfYXR0cjsKLQotLyogS2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIGlkbGUgd29ya2VyIHRocmVhZHMgKi8KLXN0YXRpYyBpbnQgaWRsZV90aHJlYWRfY291bnQ7Ci1zdGF0aWMgcHRocmVhZF9tdXRleF90IGlkbGVfdGhyZWFkX2NvdW50X211dGV4OwotCi0vKiBMb2NrcyBmb3IgYWNjZXB0IHNlcmlhbGl6YXRpb24gKi8KLSNpZmRlZiBOT19TRVJJQUxJWkVEX0FDQ0VQVAotI2RlZmluZSBTQUZFX0FDQ0VQVChzdG10KSBBUFJfU1VDQ0VTUwotI2Vsc2UKLSNkZWZpbmUgU0FGRV9BQ0NFUFQoc3RtdCkgKHN0bXQpCi1zdGF0aWMgYXBfbG9ja190ICpwcm9jZXNzX2FjY2VwdF9tdXRleDsKLSNlbmRpZiAvKiBOT19TRVJJQUxJWkVEX0FDQ0VQVCAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmxvY2tfZm5hbWU7Ci1zdGF0aWMgcHRocmVhZF9tdXRleF90IHRocmVhZF9hY2NlcHRfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwotCi1BUElfRVhQT1JUKGludCkgYXBfZ2V0X21heF9kYWVtb25zKHZvaWQpCi17Ci0gICAgcmV0dXJuIGFwX21heF9kYWVtb25zX2xpbWl0OwotfQotCi0vKiBhIGNsZWFuIGV4aXQgZnJvbSBhIGNoaWxkIHdpdGggcHJvcGVyIGNsZWFudXAgKi8KLXN0YXRpYyB2b2lkIGNsZWFuX2NoaWxkX2V4aXQoaW50IGNvZGUpCi17Ci0gICAgaWYgKHBjaGlsZCkgewotCWFwX2Rlc3Ryb3lfcG9vbChwY2hpbGQpOwotICAgIH0KLSAgICBleGl0KGNvZGUpOwotfQotCi0vKiBoYW5kbGUgYWxsIHZhcmlldGllcyBvZiBjb3JlIGR1bXBpbmcgc2lnbmFscyAqLwotc3RhdGljIHZvaWQgc2lnX2NvcmVkdW1wKGludCBzaWcpCi17Ci0gICAgY2hkaXIoYXBfY29yZWR1bXBfZGlyKTsKLSAgICBhcF9zaWduYWwoc2lnLCBTSUdfREZMKTsKLSAgICBraWxsKGdldHBpZCgpLCBzaWcpOwotICAgIC8qIEF0IHRoaXMgcG9pbnQgd2UndmUgZ290IHNpZyBibG9ja2VkLCBiZWNhdXNlIHdlJ3JlIHN0aWxsIGluc2lkZQotICAgICAqIHRoZSBzaWduYWwgaGFuZGxlci4gIFdoZW4gd2UgbGVhdmUgdGhlIHNpZ25hbCBoYW5kbGVyIGl0IHdpbGwKLSAgICAgKiBiZSB1bmJsb2NrZWQsIGFuZCB3ZSdsbCB0YWtlIHRoZSBzaWduYWwuLi4gYW5kIGNvcmVkdW1wIG9yIHdoYXRldmVyCi0gICAgICogaXMgYXBwcm9wcmlhdGUgZm9yIHRoaXMgcGFydGljdWxhciBVbml4LiAgSW4gYWRkaXRpb24gdGhlIHBhcmVudAotICAgICAqIHdpbGwgc2VlIHRoZSByZWFsIHNpZ25hbCB3ZSByZWNlaXZlZCAtLSB3aGVyZWFzIGlmIHdlIGNhbGxlZAotICAgICAqIGFib3J0KCkgaGVyZSwgdGhlIHBhcmVudCB3b3VsZCBvbmx5IHNlZSBTSUdBQlJULgotICAgICAqLwotfQotCi1zdGF0aWMgdm9pZCBqdXN0X2RpZShpbnQgc2lnKQotewotICAgIGNsZWFuX2NoaWxkX2V4aXQoMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29ubmVjdGlvbiBzdHJ1Y3R1cmVzIGFuZCBhY2NvdW50aW5nLi4uCi0gKi8KLQotLyogdm9sYXRpbGUganVzdCBpbiBjYXNlICovCi1zdGF0aWMgaW50IHZvbGF0aWxlIHNodXRkb3duX3BlbmRpbmc7Ci1zdGF0aWMgaW50IHZvbGF0aWxlIHJlc3RhcnRfcGVuZGluZzsKLXN0YXRpYyBpbnQgdm9sYXRpbGUgaXNfZ3JhY2VmdWw7Ci0KLS8qCi0gKiBhcF9zdGFydF9zaHV0ZG93bigpIGFuZCBhcF9zdGFydF9yZXN0YXJ0KCksIGJlbG93LCBhcmUgYSBmaXJzdCBzdGFiIGF0Ci0gKiBmdW5jdGlvbnMgdG8gaW5pdGlhdGUgc2h1dGRvd24gb3IgcmVzdGFydCB3aXRob3V0IHJlbHlpbmcgb24gc2lnbmFscy4gCi0gKiBQcmV2aW91c2x5IHRoaXMgd2FzIGluaXRpYXRlZCBpbiBzaWdfdGVybSgpIGFuZCByZXN0YXJ0KCkgc2lnbmFsIGhhbmRsZXJzLCAKLSAqIGJ1dCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gc3RhcnQgYSBzaHV0ZG93bi9yZXN0YXJ0IGZyb20gb3RoZXIgc291cmNlcyAtLQotICogZS5nLiBvbiBXaW4zMiwgZnJvbSB0aGUgc2VydmljZSBtYW5hZ2VyLiBOb3cgdGhlIHNlcnZpY2UgbWFuYWdlciBjYW4KLSAqIGNhbGwgYXBfc3RhcnRfc2h1dGRvd24oKSBvciBhcF9zdGFydF9yZXN0YXJ0KCkgYXMgYXBwcm9waWF0ZS4gIE5vdGUgdGhhdAotICogdGhlc2UgZnVuY3Rpb25zIGNhbiBhbHNvIGJlIGNhbGxlZCBieSB0aGUgY2hpbGQgcHJvY2Vzc2VzLCBzaW5jZSBnbG9iYWwKLSAqIHZhcmlhYmxlcyBhcmUgbm8gbG9uZ2VyIHVzZWQgdG8gcGFzcyBvbiB0aGUgcmVxdWlyZWQgYWN0aW9uIHRvIHRoZSBwYXJlbnQuCi0gKgotICogVGhlc2Ugc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIHBhcmVudCBwcm9jZXNzIGl0c2VsZiwgc2luY2UgdGhlCi0gKiBwYXJlbnQgcHJvY2VzcyB3aWxsIHVzZSB0aGUgc2h1dGRvd25fcGVuZGluZyBhbmQgcmVzdGFydF9wZW5kaW5nIHZhcmlhYmxlcwotICogdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gc2h1dGRvd24gb3IgcmVzdGFydC4gVGhlIGNoaWxkIHByb2Nlc3Mgc2hvdWxkCi0gKiBjYWxsIHNpZ25hbF9wYXJlbnQoKSBkaXJlY3RseSB0byB0ZWxsIHRoZSBwYXJlbnQgdG8gZGllIC0tIHRoaXMgd2lsbAotICogY2F1c2UgbmVpdGhlciBvZiB0aG9zZSB2YXJpYWJsZSB0byBiZSBzZXQsIHdoaWNoIHRoZSBwYXJlbnQgd2lsbAotICogYXNzdW1lIG1lYW5zIHNvbWV0aGluZyBzZXJpb3VzIGlzIHdyb25nICh3aGljaCBpdCB3aWxsIGJlLCBmb3IgdGhlCi0gKiBjaGlsZCB0byBmb3JjZSBhbiBleGl0KSBhbmQgc28gZG8gYW4gZXhpdCBhbnl3YXkuCi0gKi8KLQotdm9pZCBhcF9zdGFydF9zaHV0ZG93bih2b2lkKQotewotICAgIGlmIChzaHV0ZG93bl9wZW5kaW5nID09IDEpIHsKLQkvKiBVbSwgaXMgdGhpcyBfcHJvYmFibHlfIG5vdCBhbiBlcnJvciwgaWYgdGhlIHVzZXIgaGFzCi0JICogdHJpZWQgdG8gZG8gYSBzaHV0ZG93biB0d2ljZSBxdWlja2x5LCBzbyB3ZSB3b24ndAotCSAqIHdvcnJ5IGFib3V0IHJlcG9ydGluZyBpdC4KLQkgKi8KLQlyZXR1cm47Ci0gICAgfQotICAgIHNodXRkb3duX3BlbmRpbmcgPSAxOwotfQotCi0vKiBkbyBhIGdyYWNlZnVsIHJlc3RhcnQgaWYgZ3JhY2VmdWwgPT0gMSAqLwotdm9pZCBhcF9zdGFydF9yZXN0YXJ0KGludCBncmFjZWZ1bCkKLXsKLQotICAgIGlmIChyZXN0YXJ0X3BlbmRpbmcgPT0gMSkgewotCS8qIFByb2JhYmx5IG5vdCBhbiBlcnJvciAtIGRvbid0IGJvdGhlciByZXBvcnRpbmcgaXQgKi8KLQlyZXR1cm47Ci0gICAgfQotICAgIHJlc3RhcnRfcGVuZGluZyA9IDE7Ci0gICAgaXNfZ3JhY2VmdWwgPSBncmFjZWZ1bDsKLX0KLQotc3RhdGljIHZvaWQgc2lnX3Rlcm0oaW50IHNpZykKLXsKLSAgICBhcF9zdGFydF9zaHV0ZG93bigpOwotfQotCi1zdGF0aWMgdm9pZCByZXN0YXJ0KGludCBzaWcpCi17Ci0jaWZuZGVmIFdJTjMyCi0gICAgYXBfc3RhcnRfcmVzdGFydChzaWcgPT0gU0lHV0lOQ0gpOwotI2Vsc2UKLSAgICBhcF9zdGFydF9yZXN0YXJ0KDEpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIHNldF9zaWduYWxzKHZvaWQpCi17Ci0jaWZuZGVmIE5PX1VTRV9TSUdBQ1RJT04KLSAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhOwotCi0gICAgc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOwotICAgIHNhLnNhX2ZsYWdzID0gMDsKLQotICAgIGlmICghb25lX3Byb2Nlc3MpIHsKLQlzYS5zYV9oYW5kbGVyID0gc2lnX2NvcmVkdW1wOwotI2lmIGRlZmluZWQoU0FfT05FU0hPVCkKLQlzYS5zYV9mbGFncyA9IFNBX09ORVNIT1Q7Ci0jZWxpZiBkZWZpbmVkKFNBX1JFU0VUSEFORCkKLQlzYS5zYV9mbGFncyA9IFNBX1JFU0VUSEFORDsKLSNlbmRpZgotCWlmIChzaWdhY3Rpb24oU0lHU0VHViwgJnNhLCBOVUxMKSA8IDApCi0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgYXBfc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHU0VHVikiKTsKLSNpZmRlZiBTSUdCVVMKLQlpZiAoc2lnYWN0aW9uKFNJR0JVUywgJnNhLCBOVUxMKSA8IDApCi0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgYXBfc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHQlVTKSIpOwotI2VuZGlmCi0jaWZkZWYgU0lHQUJPUlQKLQlpZiAoc2lnYWN0aW9uKFNJR0FCT1JULCAmc2EsIE5VTEwpIDwgMCkKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBhcF9zZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdBQk9SVCkiKTsKLSNlbmRpZgotI2lmZGVmIFNJR0FCUlQKLQlpZiAoc2lnYWN0aW9uKFNJR0FCUlQsICZzYSwgTlVMTCkgPCAwKQotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIGFwX3NlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR0FCUlQpIik7Ci0jZW5kaWYKLSNpZmRlZiBTSUdJTEwKLQlpZiAoc2lnYWN0aW9uKFNJR0lMTCwgJnNhLCBOVUxMKSA8IDApCi0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgYXBfc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHSUxMKSIpOwotI2VuZGlmCi0Jc2Euc2FfZmxhZ3MgPSAwOwotICAgIH0KLSAgICBzYS5zYV9oYW5kbGVyID0gc2lnX3Rlcm07Ci0gICAgaWYgKHNpZ2FjdGlvbihTSUdURVJNLCAmc2EsIE5VTEwpIDwgMCkKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIGFwX3NlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR1RFUk0pIik7Ci0jaWZkZWYgU0lHSU5UCi0gICAgaWYgKHNpZ2FjdGlvbihTSUdJTlQsICZzYSwgTlVMTCkgPCAwKQotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIGFwX3NlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR0lOVCkiKTsKLSNlbmRpZgotI2lmZGVmIFNJR1hDUFUKLSAgICBzYS5zYV9oYW5kbGVyID0gU0lHX0RGTDsKLSAgICBpZiAoc2lnYWN0aW9uKFNJR1hDUFUsICZzYSwgTlVMTCkgPCAwKQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgYXBfc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHWENQVSkiKTsKLSNlbmRpZgotI2lmZGVmIFNJR1hGU1oKLSAgICBzYS5zYV9oYW5kbGVyID0gU0lHX0RGTDsKLSAgICBpZiAoc2lnYWN0aW9uKFNJR1hGU1osICZzYSwgTlVMTCkgPCAwKQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgYXBfc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHWEZTWikiKTsKLSNlbmRpZgotI2lmZGVmIFNJR1BJUEUKLSAgICBzYS5zYV9oYW5kbGVyID0gU0lHX0lHTjsKLSAgICBpZiAoc2lnYWN0aW9uKFNJR1BJUEUsICZzYSwgTlVMTCkgPCAwKQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgYXBfc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHUElQRSkiKTsKLSNlbmRpZgotCi0gICAgLyogd2Ugd2FudCB0byBpZ25vcmUgSFVQcyBhbmQgV0lOQ0ggd2hpbGUgd2UncmUgYnVzeSBwcm9jZXNzaW5nIG9uZSAqLwotICAgIHNpZ2FkZHNldCgmc2Euc2FfbWFzaywgU0lHSFVQKTsKLSAgICBzaWdhZGRzZXQoJnNhLnNhX21hc2ssIFNJR1dJTkNIKTsKLSAgICBzYS5zYV9oYW5kbGVyID0gcmVzdGFydDsKLSAgICBpZiAoc2lnYWN0aW9uKFNJR0hVUCwgJnNhLCBOVUxMKSA8IDApCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBhcF9zZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdIVVApIik7Ci0gICAgaWYgKHNpZ2FjdGlvbihTSUdXSU5DSCwgJnNhLCBOVUxMKSA8IDApCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBhcF9zZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdXSU5DSCkiKTsKLSNlbHNlCi0gICAgaWYgKCFvbmVfcHJvY2VzcykgewotCWFwX3NpZ25hbChTSUdTRUdWLCBzaWdfY29yZWR1bXApOwotI2lmZGVmIFNJR0JVUwotCWFwX3NpZ25hbChTSUdCVVMsIHNpZ19jb3JlZHVtcCk7Ci0jZW5kaWYgLyogU0lHQlVTICovCi0jaWZkZWYgU0lHQUJPUlQKLQlhcF9zaWduYWwoU0lHQUJPUlQsIHNpZ19jb3JlZHVtcCk7Ci0jZW5kaWYgLyogU0lHQUJPUlQgKi8KLSNpZmRlZiBTSUdBQlJUCi0JYXBfc2lnbmFsKFNJR0FCUlQsIHNpZ19jb3JlZHVtcCk7Ci0jZW5kaWYgLyogU0lHQUJSVCAqLwotI2lmZGVmIFNJR0lMTAotCWFwX3NpZ25hbChTSUdJTEwsIHNpZ19jb3JlZHVtcCk7Ci0jZW5kaWYgLyogU0lHSUxMICovCi0jaWZkZWYgU0lHWENQVQotCWFwX3NpZ25hbChTSUdYQ1BVLCBTSUdfREZMKTsKLSNlbmRpZiAvKiBTSUdYQ1BVICovCi0jaWZkZWYgU0lHWEZTWgotCWFwX3NpZ25hbChTSUdYRlNaLCBTSUdfREZMKTsKLSNlbmRpZiAvKiBTSUdYRlNaICovCi0gICAgfQotCi0gICAgYXBfc2lnbmFsKFNJR1RFUk0sIHNpZ190ZXJtKTsKLSNpZmRlZiBTSUdIVVAKLSAgICBhcF9zaWduYWwoU0lHSFVQLCByZXN0YXJ0KTsKLSNlbmRpZiAvKiBTSUdIVVAgKi8KLSNpZmRlZiBTSUdXSU5DSAotICAgIGFwX3NpZ25hbChTSUdXSU5DSCwgcmVzdGFydCk7Ci0jZW5kaWYgLyogU0lHV0lOQ0ggKi8KLSNpZmRlZiBTSUdQSVBFCi0gICAgYXBfc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwotI2VuZGlmIC8qIFNJR1BJUEUgKi8KLQotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSGVyZSBmb2xsb3dzIGEgbG9uZyBidW5jaCBvZiBnZW5lcmljIHNlcnZlciBib29ra2VlcGluZyBzdHVmZi4uLgotICovCi0KLWludCBhcF9ncmFjZWZ1bF9zdG9wX3NpZ25hbGxlZCh2b2lkKQotewotICAgIC8qIFhYWCAtIERvZXMgdGhpcyByZWFsbHkgd29yaz8gLSBNYW5vaiAqLwotICAgIHJldHVybiBpc19ncmFjZWZ1bDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDaGlsZCBwcm9jZXNzIG1haW4gbG9vcC4KLSAqLwotCi1zdGF0aWMgdm9pZCBwcm9jZXNzX3NvY2tldChhcF9wb29sX3QgKnAsIGFwX3NvY2tldF90ICpzb2NrLCBsb25nIGNvbm5faWQpCi17Ci0gICAgQlVGRiAqY29ubl9pbzsKLSAgICBjb25uX3JlYyAqY3VycmVudF9jb25uOwotICAgIGFwX2lvbCAqaW9sOwotICAgIGludCBjc2Q7Ci0gICAgYXBfc3RhdHVzX3QgcnY7Ci0KLSAgICBpZiAoKHJ2ID0gYXBfZ2V0X29zX3NvY2soJmNzZCwgc29jaykpICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHJ2LCBOVUxMLCAiYXBfZ2V0X29zX3NvY2siKTsKLSAgICB9Ci0KLSAgICBpZiAoY3NkID49IEZEX1NFVFNJWkUpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfV0FSTklORywgMCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICJuZXcgZmlsZSBkZXNjcmlwdG9yICVkIGlzIHRvbyBsYXJnZTsgeW91IHByb2JhYmx5IG5lZWQgIgotICAgICAgICAgICAgICAgICAgICAgInRvIHJlYnVpbGQgQXBhY2hlIHdpdGggYSBsYXJnZXIgRkRfU0VUU0laRSAiCi0gICAgICAgICAgICAgICAgICAgICAiKGN1cnJlbnRseSAlZCkiLCAKLSAgICAgICAgICAgICAgICAgICAgIGNzZCwgRkRfU0VUU0laRSk7Ci0gICAgICAgIGFwX2Nsb3NlX3NvY2tldChzb2NrKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGFwX3NvY2tfZGlzYWJsZV9uYWdsZShjc2QpOwotICAgIGlvbCA9IGFwX2lvbF9hdHRhY2hfc29ja2V0KHAsIHNvY2spOwotICAgIGNvbm5faW8gPSBhcF9iY3JlYXRlKHAsIEJfUkRXUik7Ci0gICAgYXBfYnB1c2hfaW9sKGNvbm5faW8sIGlvbCk7Ci0KLSAgICBjdXJyZW50X2Nvbm4gPSBhcF9uZXdfYXByX2Nvbm5lY3Rpb24ocCwgYXBfc2VydmVyX2NvbmYsIGNvbm5faW8sIHNvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5faWQpOwotCi0gICAgYXBfcHJvY2Vzc19jb25uZWN0aW9uKGN1cnJlbnRfY29ubik7Ci0gICAgYXBfbGluZ2VyaW5nX2Nsb3NlKGN1cnJlbnRfY29ubik7Ci19Ci0KLXN0YXRpYyB2b2lkICp3b3JrZXJfdGhyZWFkKHZvaWQgKik7Ci0KLS8qIFN0YXJ0cyBhIHRocmVhZCBhcyBsb25nIGFzIHdlJ3JlIGJlbG93IG1heF90aHJlYWRzICovCi1zdGF0aWMgaW50IHN0YXJ0X3RocmVhZCh2b2lkKQotewotICAgIHB0aHJlYWRfdCB0aHJlYWQ7Ci0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJndvcmtlcl90aHJlYWRfY291bnRfbXV0ZXgpOwotICAgIGlmICh3b3JrZXJfdGhyZWFkX2NvdW50IDwgbWF4X3RocmVhZHMpIHsKLSAgICAgICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWQsICZ3b3JrZXJfdGhyZWFkX2F0dHIsIHdvcmtlcl90aHJlYWQsCi0JICAmd29ya2VyX3RocmVhZF9mcmVlX2lkc1t3b3JrZXJfdGhyZWFkX2NvdW50XSkpIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgZXJybm8sIGFwX3NlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICJwdGhyZWFkX2NyZWF0ZTogdW5hYmxlIHRvIGNyZWF0ZSB3b3JrZXIgdGhyZWFkIik7Ci0gICAgICAgICAgICAvKiBJbiBjYXNlIHN5c3RlbSByZXNvdXJjZXMgYXJlIG1heHhlZCBvdXQsIHdlIGRvbid0IHdhbnQKLSAgICAgICAgICAgICAgIEFwYWNoZSBydW5uaW5nIGF3YXkgd2l0aCB0aGUgQ1BVIHRyeWluZyB0byBmb3JrIG92ZXIgYW5kCi0gICAgICAgICAgICAgICBvdmVyIGFuZCBvdmVyIGFnYWluIGlmIHdlIGV4aXQuICovCi0gICAgICAgICAgICBzbGVlcCgxMCk7Ci0gICAgICAgICAgICB3b3JrZXJzX21heV9leGl0ID0gMTsKLSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ3b3JrZXJfdGhyZWFkX2NvdW50X211dGV4KTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0JZWxzZSB7Ci0JICAgIHdvcmtlcl90aHJlYWRfY291bnQrKzsKLQl9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBzdGF0aWMgaW50IHJlcG9ydGVkID0gMDsKLSAgICAgICAgCi0gICAgICAgIGlmICghcmVwb3J0ZWQpIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgYXBfc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciByZWFjaGVkIE1heFRocmVhZHNQZXJDaGlsZCBzZXR0aW5nLCBjb25zaWRlciByYWlzaW5nIHRoZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiIE1heFRocmVhZHNQZXJDaGlsZCBvciBOdW1TZXJ2ZXJzIHNldHRpbmdzIik7Ci0gICAgICAgICAgICByZXBvcnRlZCA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJndvcmtlcl90aHJlYWRfY291bnRfbXV0ZXgpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJndvcmtlcl90aHJlYWRfY291bnRfbXV0ZXgpOwotICAgIHJldHVybiAxOwotCi19Ci0vKiBTZXRzIHdvcmtlcnNfbWF5X2V4aXQgaWYgd2UgcmVjZWl2ZWQgYSBjaGFyYWN0ZXIgb24gdGhlIHBpcGVfb2ZfZGVhdGggKi8KLXN0YXRpYyB2b2lkIGNoZWNrX3BpcGVfb2ZfZGVhdGgodm9pZCkKLXsKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJnBpcGVfb2ZfZGVhdGhfbXV0ZXgpOwotICAgIGlmICghd29ya2Vyc19tYXlfZXhpdCkgewotICAgICAgICBpbnQgcmV0OwotICAgICAgICBjaGFyIHBpcGVfcmVhZF9jaGFyOwotICAgICAgICBhcF9zc2l6ZV90IG4gPSAxOwotCi0gICAgICAgIHJldCA9IGFwX3JlY3YobGlzdGVuZmRzWzBdLCAmcGlwZV9yZWFkX2NoYXIsICZuKTsKLSAgICAgICAgaWYgKGFwX2Nhbm9uaWNhbF9lcnJvcihyZXQpID09IEFQUl9FQUdBSU4pIHsKLSAgICAgICAgICAgIC8qIEl0IGxvc3QgdGhlIGxvdHRlcnkuIEl0IG11c3QgY29udGludWUgdG8gc3VmZmVyCi0gICAgICAgICAgICAgKiB0aHJvdWdoIGEgbGlmZSBvZiBzZXJ2aXR1ZGUuICovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKiBJdCB3b24gdGhlIGxvdHRlcnkgKG9yIHNvbWV0aGluZyBlbHNlIGlzIHZlcnkKLSAgICAgICAgICAgICAqIHdyb25nKS4gRW1icmFjZSBkZWF0aCB3aXRoIG9wZW4gYXJtcy4gKi8KLSAgICAgICAgICAgIHdvcmtlcnNfbWF5X2V4aXQgPSAxOwotICAgICAgICB9Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwaXBlX29mX2RlYXRoX211dGV4KTsKLX0KLQotLyogaWRsZV90aHJlYWRfY291bnQgc2hvdWxkIGJlIGluY3JlbWVudGVkIGJlZm9yZSBzdGFydGluZyBhIHdvcmtlcl90aHJlYWQgKi8KLQotc3RhdGljIHZvaWQgKndvcmtlcl90aHJlYWQodm9pZCAqYXJnKQotewotICAgIGFwX3NvY2tldF90ICpjc2QgPSBOVUxMOwotICAgIGFwX3Bvb2xfdCAqdHBvb2w7CQkvKiBQb29sIGZvciB0aGlzIHRocmVhZCAgICAgICAgICAgKi8KLSAgICBhcF9wb29sX3QgKnB0cmFuczsJCS8qIFBvb2wgZm9yIHBlci10cmFuc2FjdGlvbiBzdHVmZiAqLwotICAgIGFwX3NvY2tldF90ICpzZCA9IE5VTEw7Ci0gICAgaW50IHNydjsKLSAgICBpbnQgY3Vycl9wb2xsZmQsIGxhc3RfcG9sbGZkID0gMDsKLSAgICBpbnQgdGhyZWFkX2p1c3Rfc3RhcnRlZCA9IDE7Ci0gICAgaW50IHRocmVhZF9udW0gPSAqKChpbnQgKikgYXJnKTsKLSAgICBsb25nIGNvbm5faWQgPSBjaGlsZF9udW0gKiBIQVJEX1RIUkVBRF9MSU1JVCArIHRocmVhZF9udW07Ci0gICAgYXBfcG9sbGZkX3QgKnBvbGxzZXQ7Ci0gICAgaW50IG47Ci0gICAgYXBfc3RhdHVzX3QgcnY7Ci0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJnRocmVhZF9wb29sX3BhcmVudF9tdXRleCk7Ci0gICAgYXBfY3JlYXRlX3Bvb2woJnRwb29sLCB0aHJlYWRfcG9vbF9wYXJlbnQpOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0aHJlYWRfcG9vbF9wYXJlbnRfbXV0ZXgpOwotICAgIGFwX2NyZWF0ZV9wb29sKCZwdHJhbnMsIHRwb29sKTsKLQotICAgIGFwX3NldHVwX3BvbGwoJnBvbGxzZXQsIG51bV9saXN0ZW5mZHMrMSwgdHBvb2wpOwotICAgIGZvcihuPTAgOyBuIDw9IG51bV9saXN0ZW5mZHMgOyArK24pCi0gICAgICAgIGFwX2FkZF9wb2xsX3NvY2tldChwb2xsc2V0LCBsaXN0ZW5mZHNbbl0sIEFQUl9QT0xMSU4pOwotCi0gICAgd2hpbGUgKCF3b3JrZXJzX21heV9leGl0KSB7Ci0gICAgICAgIHdvcmtlcnNfbWF5X2V4aXQgfD0gKG1heF9yZXF1ZXN0c19wZXJfY2hpbGQgIT0gMCkgJiYgKHJlcXVlc3RzX3RoaXNfY2hpbGQgPD0gMCk7Ci0gICAgICAgIGlmICh3b3JrZXJzX21heV9leGl0KSBicmVhazsKLSAgICAgICAgaWYgKCF0aHJlYWRfanVzdF9zdGFydGVkKSB7Ci0gICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmlkbGVfdGhyZWFkX2NvdW50X211dGV4KTsKLSAgICAgICAgICAgIGlmIChpZGxlX3RocmVhZF9jb3VudCA8IG1heF9zcGFyZV90aHJlYWRzKSB7Ci0gICAgICAgICAgICAgICAgaWRsZV90aHJlYWRfY291bnQrKzsKLSAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmaWRsZV90aHJlYWRfY291bnRfbXV0ZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmlkbGVfdGhyZWFkX2NvdW50X211dGV4KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRocmVhZF9qdXN0X3N0YXJ0ZWQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmdGhyZWFkX2FjY2VwdF9tdXRleCk7Ci0gICAgICAgIGlmICh3b3JrZXJzX21heV9leGl0KSB7Ci0gICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmdGhyZWFkX2FjY2VwdF9tdXRleCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoKHJ2ID0gU0FGRV9BQ0NFUFQoYXBfbG9jayhwcm9jZXNzX2FjY2VwdF9tdXRleCkpKQotICAgICAgICAgICAgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FTUVSRywgcnYsIGFwX3NlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICJhcF9sb2NrIGZhaWxlZC4gQXR0ZW1wdGluZyB0byBzaHV0ZG93biAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3MgZ3JhY2VmdWxseS4iKTsKLSAgICAgICAgICAgIHdvcmtlcnNfbWF5X2V4aXQgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKCF3b3JrZXJzX21heV9leGl0KSB7Ci0gICAgICAgICAgICBhcF9pbnQxNl90IGV2ZW50OwotICAgICAgICAgICAgc3J2ID0gYXBfcG9sbChwb2xsc2V0LCAmbiwgLTEpOwotCi0gICAgICAgICAgICBpZiAoc3J2ICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFwX2Nhbm9uaWNhbF9lcnJvcihzcnYpID09IEFQUl9FSU5UUikgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBhcF9wb2xsKCkgd2lsbCBvbmx5IHJldHVybiBlcnJvcnMgaW4gY2F0YXN0cm9waGljCi0gICAgICAgICAgICAgICAgICogY2lyY3Vtc3RhbmNlcy4gTGV0J3MgdHJ5IGV4aXRpbmcgZ3JhY2VmdWxseSwgZm9yIG5vdy4gKi8KLSAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzcnYsIChjb25zdCBzZXJ2ZXJfcmVjICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX3NlcnZlcl9jb25mLCAiYXBfcG9sbDogKGxpc3RlbikiKTsKLSAgICAgICAgICAgICAgICB3b3JrZXJzX21heV9leGl0ID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh3b3JrZXJzX21heV9leGl0KSBicmVhazsKLQotICAgICAgICAgICAgYXBfZ2V0X3JldmVudHMoJmV2ZW50LCBsaXN0ZW5mZHNbMF0sIHBvbGxzZXQpOwotICAgICAgICAgICAgaWYgKGV2ZW50ICYgQVBSX1BPTExJTikgewotICAgICAgICAgICAgICAgIC8qIEEgcHJvY2VzcyBnb3QgYSBzaWduYWwgb24gdGhlIHNodXRkb3duIHBpcGUuIENoZWNrIGlmIHdlJ3JlCi0gICAgICAgICAgICAgICAgICogdGhlIGx1Y2t5IHByb2Nlc3MgdG8gZGllLiAqLwotICAgICAgICAgICAgICAgIGNoZWNrX3BpcGVfb2ZfZGVhdGgoKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG51bV9saXN0ZW5mZHMgPT0gMSkgewotICAgICAgICAgICAgICAgIHNkID0gYXBfbGlzdGVuZXJzLT5zZDsKLSAgICAgICAgICAgICAgICBnb3RvIGdvdF9mZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8qIGZpbmQgYSBsaXN0ZW5lciAqLwotICAgICAgICAgICAgICAgIGN1cnJfcG9sbGZkID0gbGFzdF9wb2xsZmQ7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBjdXJyX3BvbGxmZCsrOwotICAgICAgICAgICAgICAgICAgICBpZiAoY3Vycl9wb2xsZmQgPiBudW1fbGlzdGVuZmRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyX3BvbGxmZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogWFhYOiBTaG91bGQgd2UgY2hlY2sgZm9yIFBPTExFUlI/ICovCi0gICAgICAgICAgICAgICAgICAgIGFwX2dldF9yZXZlbnRzKCZldmVudCwgbGlzdGVuZmRzW2N1cnJfcG9sbGZkXSwgcG9sbHNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChldmVudCAmIEFQUl9QT0xMSU4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfcG9sbGZkID0gY3Vycl9wb2xsZmQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZCA9IGxpc3RlbmZkc1tjdXJyX3BvbGxmZF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGdvdF9mZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gd2hpbGUgKGN1cnJfcG9sbGZkICE9IGxhc3RfcG9sbGZkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIGdvdF9mZDoKLSAgICAgICAgaWYgKCF3b3JrZXJzX21heV9leGl0KSB7Ci0gICAgICAgICAgICBpZiAoKHJ2ID0gYXBfYWNjZXB0KCZjc2QsIHNkLCBwdHJhbnMpKSAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHJ2LCBhcF9zZXJ2ZXJfY29uZiwgImFwX2FjY2VwdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChydiA9IFNBRkVfQUNDRVBUKGFwX3VubG9jayhwcm9jZXNzX2FjY2VwdF9tdXRleCkpKQotICAgICAgICAgICAgICAgICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLCBydiwgYXBfc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcF91bmxvY2sgZmFpbGVkLiBBdHRlbXB0aW5nIHRvIHNodXRkb3duICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3MgZ3JhY2VmdWxseS4iKTsKLSAgICAgICAgICAgICAgICB3b3JrZXJzX21heV9leGl0ID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0aHJlYWRfYWNjZXB0X211dGV4KTsKLQkgICAgcHRocmVhZF9tdXRleF9sb2NrKCZpZGxlX3RocmVhZF9jb3VudF9tdXRleCk7Ci0gICAgICAgICAgICBpZiAoaWRsZV90aHJlYWRfY291bnQgPiBtaW5fc3BhcmVfdGhyZWFkcykgewotICAgICAgICAgICAgICAgIGlkbGVfdGhyZWFkX2NvdW50LS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0X3RocmVhZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlkbGVfdGhyZWFkX2NvdW50LS07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmlkbGVfdGhyZWFkX2NvdW50X211dGV4KTsKLSAgICAgICAgICAgIHByb2Nlc3Nfc29ja2V0KHB0cmFucywgY3NkLCBjb25uX2lkKTsKLSAgICAgICAgICAgIHJlcXVlc3RzX3RoaXNfY2hpbGQtLTsKLQl9IGVsc2UgewotICAgICAgICAgICAgaWYgKChydiA9IFNBRkVfQUNDRVBUKGFwX3VubG9jayhwcm9jZXNzX2FjY2VwdF9tdXRleCkpKQotICAgICAgICAgICAgICAgICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLCBydiwgYXBfc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcF91bmxvY2sgZmFpbGVkLiBBdHRlbXB0aW5nIHRvIHNodXRkb3duICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3MgZ3JhY2VmdWxseS4iKTsKLSAgICAgICAgICAgICAgICB3b3JrZXJzX21heV9leGl0ID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0aHJlYWRfYWNjZXB0X211dGV4KTsKLQkgICAgcHRocmVhZF9tdXRleF9sb2NrKCZpZGxlX3RocmVhZF9jb3VudF9tdXRleCk7Ci0gICAgICAgICAgICBpZGxlX3RocmVhZF9jb3VudC0tOwotICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmlkbGVfdGhyZWFkX2NvdW50X211dGV4KTsKLQkgICAgYnJlYWs7Ci0JfQotICAgICAgICBhcF9jbGVhcl9wb29sKHB0cmFucyk7Ci0gICAgfQotCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZ0aHJlYWRfcG9vbF9wYXJlbnRfbXV0ZXgpOwotICAgIGFwX2Rlc3Ryb3lfcG9vbCh0cG9vbCk7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJnRocmVhZF9wb29sX3BhcmVudF9tdXRleCk7Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZ3b3JrZXJfdGhyZWFkX2NvdW50X211dGV4KTsKLSAgICB3b3JrZXJfdGhyZWFkX2NvdW50LS07Ci0gICAgd29ya2VyX3RocmVhZF9mcmVlX2lkc1t3b3JrZXJfdGhyZWFkX2NvdW50XSA9IHRocmVhZF9udW07Ci0gICAgaWYgKHdvcmtlcl90aHJlYWRfY291bnQgPT0gMCkgewotICAgICAgICAvKiBBbGwgdGhlIHRocmVhZHMgaGF2ZSBleGl0ZWQsIG5vdyBmaW5pc2ggdGhlIHNodXRkb3duIHByb2Nlc3MKLSAgICAgICAgICogYnkgc2lnbmFsbGluZyB0aGUgc2lnd2FpdCB0aHJlYWQgKi8KLSAgICAgICAga2lsbChteV9waWQsIFNJR1RFUk0pOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmd29ya2VyX3RocmVhZF9jb3VudF9tdXRleCk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgY2hpbGRfbWFpbihpbnQgY2hpbGRfbnVtX2FyZykKLXsKLSAgICBzaWdzZXRfdCBzaWdfbWFzazsKLSAgICBpbnQgc2lnbmFsX3JlY2VpdmVkOwotICAgIGludCBpOwotICAgIGFwX2xpc3Rlbl9yZWMgKmxyOwotICAgIGFwX3N0YXR1c190IHJ2OwotCi0gICAgbXlfcGlkID0gZ2V0cGlkKCk7Ci0gICAgY2hpbGRfbnVtID0gY2hpbGRfbnVtX2FyZzsKLSAgICBhcF9jcmVhdGVfcG9vbCgmcGNoaWxkLCBwY29uZik7Ci0KLSAgICAvKnN0dWZmIHRvIGRvIGJlZm9yZSB3ZSBzd2l0Y2ggaWQncywgc28gd2UgaGF2ZSBwZXJtaXNzaW9ucy4qLwotCi0gICAgcnYgPSBTQUZFX0FDQ0VQVChhcF9jaGlsZF9pbml0X2xvY2soJnByb2Nlc3NfYWNjZXB0X211dGV4LCBsb2NrX2ZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaGlsZCkpOwotICAgIGlmIChydiAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkcsIHJ2LCBhcF9zZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBpbml0aWFsaXplIGNyb3NzLXByb2Nlc3MgbG9jayBpbiBjaGlsZCIpOwotICAgICAgICBjbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci0KLSAgICBpZiAodW5peGRfc2V0dXBfY2hpbGQoKSkgewotCWNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotICAgIH0KLQotICAgIGFwX2NoaWxkX2luaXRfaG9vayhwY2hpbGQsIGFwX3NlcnZlcl9jb25mKTsKLQotICAgIC8qZG9uZSB3aXRoIGluaXQgY3JpdGljYWwgc2VjdGlvbiAqLwotCi0gICAgLyogQWxsIHRocmVhZHMgc2hvdWxkIG1hc2sgc2lnbmFscyBvdXQsIGFjY29yaW5nIHRvIHNpZ3dhaXQoMikgbWFuIHBhZ2UgKi8KLSAgICBzaWdmaWxsc2V0KCZzaWdfbWFzayk7Ci0KLSNpZmRlZiBTSUdQUk9DTUFTS19TRVRTX1RIUkVBRF9NQVNLCi0gICAgaWYgKHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmc2lnX21hc2ssIE5VTEwpICE9IDApIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0FMRVJULCBlcnJubywgYXBfc2VydmVyX2NvbmYsICJzaWdwcm9jbWFzayIpOwotICAgIH0KLSNlbHNlCi0gICAgaWYgKHB0aHJlYWRfc2lnbWFzayhTSUdfU0VUTUFTSywgJnNpZ19tYXNrLCBOVUxMKSAhPSAwKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgZXJybm8sIGFwX3NlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgInB0aHJlYWRfc2lnbWFzayIpOwotICAgIH0KLSNlbmRpZgotCi0gICAgcmVxdWVzdHNfdGhpc19jaGlsZCA9IG1heF9yZXF1ZXN0c19wZXJfY2hpbGQ7Ci0gICAgCi0gICAgLyogU2V0IHVwIHRoZSBwb2xsZmQgYXJyYXkgKi8KLSAgICBsaXN0ZW5mZHMgPSBhcF9wY2FsbG9jKHBjaGlsZCwgc2l6ZW9mKCpsaXN0ZW5mZHMpICogKG51bV9saXN0ZW5mZHMgKyAxKSk7Ci0jaWYgQVBSX0ZJTEVTX0FTX1NPQ0tFVFMKLSAgICBhcF9zb2NrZXRfZnJvbV9maWxlKCZsaXN0ZW5mZHNbMF0sIHBpcGVfb2ZfZGVhdGhfaW4pOwotI2VuZGlmCi0gICAgZm9yIChsciA9IGFwX2xpc3RlbmVycywgaSA9IDE7IGkgPD0gbnVtX2xpc3RlbmZkczsgbHIgPSBsci0+bmV4dCwgKytpKQotICAgICAgICBsaXN0ZW5mZHNbaV09bHItPnNkOwotCi0gICAgLyogU2V0dXAgd29ya2VyIHRocmVhZHMgKi8KLQotICAgIGlmICh0aHJlYWRzX3RvX3N0YXJ0ID4gbWF4X3RocmVhZHMpIHsKLSAgICAgICAgdGhyZWFkc190b19zdGFydCA9IG1heF90aHJlYWRzOwotICAgIH0KLSAgICBpZGxlX3RocmVhZF9jb3VudCA9IHRocmVhZHNfdG9fc3RhcnQ7Ci0gICAgd29ya2VyX3RocmVhZF9jb3VudCA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IG1heF90aHJlYWRzOyBpKyspIHsKLSAgICAgICAgd29ya2VyX3RocmVhZF9mcmVlX2lkc1tpXSA9IGk7Ci0gICAgfQotICAgIGFwX2NyZWF0ZV9wb29sKCZ0aHJlYWRfcG9vbF9wYXJlbnQsIHBjaGlsZCk7Ci0gICAgcHRocmVhZF9tdXRleF9pbml0KCZ0aHJlYWRfcG9vbF9wYXJlbnRfbXV0ZXgsIE5VTEwpOwotICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmaWRsZV90aHJlYWRfY291bnRfbXV0ZXgsIE5VTEwpOwotICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmd29ya2VyX3RocmVhZF9jb3VudF9tdXRleCwgTlVMTCk7Ci0gICAgcHRocmVhZF9tdXRleF9pbml0KCZwaXBlX29mX2RlYXRoX211dGV4LCBOVUxMKTsKLSAgICBwdGhyZWFkX2F0dHJfaW5pdCgmd29ya2VyX3RocmVhZF9hdHRyKTsKLSNpZmRlZiBQVEhSRUFEX0FUVFJfU0VUREVUQUNIU1RBVEVfQVJHMl9BRERSCi0gICAgewotICAgICAgICBpbnQgb24gPSAxOwotCi0gICAgICAgIHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmd29ya2VyX3RocmVhZF9hdHRyLCAmb24pOwotICAgIH0KLSNlbHNlCi0gICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZ3b3JrZXJfdGhyZWFkX2F0dHIsIFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEKTsKLSNlbmRpZgotCi0gICAgLyogV2UgYXJlIGNyZWF0aW5nIHdvcmtlciB0aHJlYWRzIHJpZ2h0IG5vdyAqLwotICAgIGZvciAoaT0wOyBpIDwgdGhyZWFkc190b19zdGFydDsgaSsrKSB7Ci0gICAgICAgIC8qIHN0YXJ0X3RocmVhZCBzaG91bGRuJ3QgZmFpbCBoZXJlICovCi0gICAgICAgIGlmICghc3RhcnRfdGhyZWFkKCkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogVGhpcyB0aHJlYWQgd2lsbCBiZSB0aGUgb25lIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyBzaWduYWxzICovCi0gICAgc2lnZW1wdHlzZXQoJnNpZ19tYXNrKTsKLSAgICBzaWdhZGRzZXQoJnNpZ19tYXNrLCBTSUdURVJNKTsKLSAgICBzaWdhZGRzZXQoJnNpZ19tYXNrLCBTSUdJTlQpOwotICAgIGFwX3NpZ3dhaXQoJnNpZ19tYXNrLCAmc2lnbmFsX3JlY2VpdmVkKTsKLSAgICBzd2l0Y2ggKHNpZ25hbF9yZWNlaXZlZCkgewotICAgICAgICBjYXNlIFNJR1RFUk06Ci0gICAgICAgIGNhc2UgU0lHSU5UOgotICAgICAgICAgICAganVzdF9kaWUoc2lnbmFsX3JlY2VpdmVkKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0FMRVJULCBlcnJubywgYXBfc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAicmVjZWl2ZWQgaW1wb3NzaWJsZSBzaWduYWw6ICVkIiwgc2lnbmFsX3JlY2VpdmVkKTsKLSAgICAgICAgICAgIGp1c3RfZGllKFNJR1RFUk0pOwotICAgIH0KLX0KLQotc3RhdGljIGludCBtYWtlX2NoaWxkKHNlcnZlcl9yZWMgKnMsIGludCBzbG90LCB0aW1lX3Qgbm93KQotewotICAgIGludCBwaWQ7Ci0KLSAgICBpZiAoc2xvdCArIDEgPiBhcF9tYXhfZGFlbW9uc19saW1pdCkgewotICAgICAgICBhcF9tYXhfZGFlbW9uc19saW1pdCA9IHNsb3QgKyAxOwotICAgIH0KLQotICAgIGlmIChvbmVfcHJvY2VzcykgewotCXNldF9zaWduYWxzKCk7Ci0gICAgICAgIGFwX2NoaWxkX3RhYmxlW3Nsb3RdLnBpZCA9IGdldHBpZCgpOwotICAgICAgICBhcF9jaGlsZF90YWJsZVtzbG90XS5zdGF0dXMgPSBTRVJWRVJfQUxJVkU7Ci0JY2hpbGRfbWFpbihzbG90KTsKLSAgICB9Ci0KLSAgICBpZiAoKHBpZCA9IGZvcmsoKSkgPT0gLTEpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIHMsCi0gICAgICAgICAgICAgICAgICAgICAiZm9yazogVW5hYmxlIHRvIGZvcmsgbmV3IHByb2Nlc3MiKTsKLQkvKiBJbiBjYXNlIHN5c3RlbSByZXNvdXJjZXMgYXJlIG1heHhlZCBvdXQsIHdlIGRvbid0IHdhbnQKLQkgICBBcGFjaGUgcnVubmluZyBhd2F5IHdpdGggdGhlIENQVSB0cnlpbmcgdG8gZm9yayBvdmVyIGFuZAotCSAgIG92ZXIgYW5kIG92ZXIgYWdhaW4uICovCi0Jc2xlZXAoMTApOwotCi0JcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGlmICghcGlkKSB7Ci0jaWZkZWYgQUlYX0JJTkRfUFJPQ0VTU09SCi0gICAgICAvKiBCeSBkZWZhdWx0LCBBSVggYmluZHMgdG8gYSBzaW5nbGUgcHJvY2Vzc29yLiAgVGhpcyBiaXQgdW5iaW5kcwotCSBjaGlsZHJlbiB3aGljaCB3aWxsIHRoZW4gYmluZCB0byBhbm90aGVyIENQVS4KLSAgICAgICovCi0jaW5jbHVkZSA8c3lzL3Byb2Nlc3Nvci5oPgotICAgICAgICBpbnQgc3RhdHVzID0gYmluZHByb2Nlc3NvcihCSU5EUFJPQ0VTUywgKGludClnZXRwaWQoKSwKLQkJCSAgICAgICBQUk9DRVNTT1JfQ0xBU1NfQU5ZKTsKLQlpZiAoc3RhdHVzICE9IE9LKQotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLCBlcnJubywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXBfc2VydmVyX2NvbmYsICJwcm9jZXNzb3IgdW5iaW5kIGZhaWxlZCAlZCIsIHN0YXR1cyk7Ci0jZW5kaWYKLQotICAgICAgICBSQUlTRV9TSUdTVE9QKE1BS0VfQ0hJTEQpOwotCi0JLyogWFhYIC0gRm9yIGFuIHVudGhyZWFkZWQgc2VydmVyLCBhIHNpZ25hbCBoYW5kbGVyIHdpbGwgYmUgbmVjZXNzYXJ5Ci0gICAgICAgIGFwX3NpZ25hbChTSUdURVJNLCBqdXN0X2RpZSk7Ci0JKi8KLSAgICAgICAgY2hpbGRfbWFpbihzbG90KTsKLQotCXJldHVybiAwOwotICAgIH0KLSAgICAvKiBlbHNlICovCi0gICAgYXBfY2hpbGRfdGFibGVbc2xvdF0ucGlkID0gcGlkOwotICAgIGFwX2NoaWxkX3RhYmxlW3Nsb3RdLnN0YXR1cyA9IFNFUlZFUl9BTElWRTsKLQotICAgIHJldHVybiAwOwotfQotCi0vKiBzdGFydCB1cCBhIGJ1bmNoIG9mIGNoaWxkcmVuICovCi1zdGF0aWMgaW50IHN0YXJ0dXBfY2hpbGRyZW4oaW50IG51bWJlcl90b19zdGFydCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IG51bWJlcl90b19zdGFydCAmJiBpIDwgbnVtX2RhZW1vbnM7ICsraSkgewotCWlmIChhcF9jaGlsZF90YWJsZVtpXS5zdGF0dXMgIT0gU0VSVkVSX0RFQUQpIHsKLQkgICAgY29udGludWU7Ci0JfQotCWlmIChtYWtlX2NoaWxkKGFwX3NlcnZlcl9jb25mLCBpLCAwKSA8IDApIHsKLQkgICAgYnJlYWs7Ci0JfQotCS0tbnVtYmVyX3RvX3N0YXJ0OwotICAgIH0KLSAgICByZXR1cm4gbnVtYmVyX3RvX3N0YXJ0OwotfQotCi0KLS8qCi0gKiBzcGF3bl9yYXRlIGlzIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCB3aWxsIGJlIHNwYXduZWQgb24gdGhlCi0gKiBuZXh0IG1haW50ZW5hbmNlIGN5Y2xlIGlmIHRoZXJlIGFyZW4ndCBlbm91Z2ggc2VydmVycy4gIEl0IGlzCi0gKiBkb3VibGVkIHVwIHRvIE1BWF9TUEFXTl9SQVRFLCBhbmQgcmVzZXQgb25seSB3aGVuIGEgY3ljbGUgZ29lcyBieQotICogd2l0aG91dCB0aGUgbmVlZCB0byBzcGF3bi4KLSAqLwotc3RhdGljIGludCBzcGF3bl9yYXRlID0gMTsKLSNpZm5kZWYgTUFYX1NQQVdOX1JBVEUKLSNkZWZpbmUgTUFYX1NQQVdOX1JBVEUJKDMyKQotI2VuZGlmCi1zdGF0aWMgaW50IGhvbGRfb2ZmX29uX2V4cG9uZW50aWFsX3NwYXduaW5nOwotCi1zdGF0aWMgdm9pZCBwZXJmb3JtX2NoaWxkX21haW50ZW5hbmNlKHZvaWQpCi17Ci0gICAgaW50IGk7Ci0gICAgdGltZV90IG5vdyA9IDA7Ci0gICAgaW50IGZyZWVfbGVuZ3RoOwotICAgIGludCBmcmVlX3Nsb3RzW01BWF9TUEFXTl9SQVRFXTsKLSAgICBpbnQgbGFzdF9ub25fZGVhZCA9IC0xOwotCi0gICAgLyogaW5pdGlhbGl6ZSB0aGUgZnJlZV9saXN0ICovCi0gICAgZnJlZV9sZW5ndGggPSAwOwotICAgIAotICAgIGZvciAoaSA9IDA7IGkgPCBudW1fZGFlbW9uczsgKytpKSB7Ci0gICAgICAgIGlmIChhcF9jaGlsZF90YWJsZVtpXS5zdGF0dXMgPT0gU0VSVkVSX0RFQUQpIHsKLSAgICAgICAgICAgIGlmIChmcmVlX2xlbmd0aCA8IHNwYXduX3JhdGUpIHsKLSAgICAgICAgICAgICAgICBmcmVlX3Nsb3RzW2ZyZWVfbGVuZ3RoXSA9IGk7Ci0gICAgICAgICAgICAgICAgKytmcmVlX2xlbmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGxhc3Rfbm9uX2RlYWQgPSBpOwotICAgICAgICB9Ci0KLQlpZiAoaSA+PSBhcF9tYXhfZGFlbW9uc19saW1pdCAmJiBmcmVlX2xlbmd0aCA+PSBzcGF3bl9yYXRlKSB7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0gICAgYXBfbWF4X2RhZW1vbnNfbGltaXQgPSBsYXN0X25vbl9kZWFkICsgMTsKLQotICAgIGlmIChmcmVlX2xlbmd0aCA+IDApIHsKLQlmb3IgKGkgPSAwOyBpIDwgZnJlZV9sZW5ndGg7ICsraSkgewotCSAgICBtYWtlX2NoaWxkKGFwX3NlcnZlcl9jb25mLCBmcmVlX3Nsb3RzW2ldLCBub3cpOwotCX0KLQkvKiB0aGUgbmV4dCB0aW1lIGFyb3VuZCB3ZSB3YW50IHRvIHNwYXduIHR3aWNlIGFzIG1hbnkgaWYgdGhpcwotCSAqIHdhc24ndCBnb29kIGVub3VnaCwgYnV0IG5vdCBpZiB3ZSd2ZSBqdXN0IGRvbmUgYSBncmFjZWZ1bAotCSAqLwotCWlmIChob2xkX29mZl9vbl9leHBvbmVudGlhbF9zcGF3bmluZykgewotCSAgICAtLWhvbGRfb2ZmX29uX2V4cG9uZW50aWFsX3NwYXduaW5nOwotCX0KLQllbHNlIGlmIChzcGF3bl9yYXRlIDwgTUFYX1NQQVdOX1JBVEUpIHsKLQkgICAgc3Bhd25fcmF0ZSAqPSAyOwotCX0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHNwYXduX3JhdGUgPSAxOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgc2VydmVyX21haW5fbG9vcChpbnQgcmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0KQotewotICAgIGludCBjaGlsZF9zbG90OwotICAgIGFwX3dhaXRfdCBzdGF0dXM7Ci0gICAgYXBfcHJvY190IHBpZDsKLSAgICBpbnQgaTsKLQotICAgIHdoaWxlICghcmVzdGFydF9wZW5kaW5nICYmICFzaHV0ZG93bl9wZW5kaW5nKSB7Ci0gICAgICAgIGFwX3dhaXRfb3JfdGltZW91dCgmc3RhdHVzLCAmcGlkLCBwY29uZik7Ci0gICAgICAgIAotICAgICAgICBpZiAocGlkLnBpZCAhPSAtMSkgewotICAgICAgICAgICAgYXBfcHJvY2Vzc19jaGlsZF9zdGF0dXMoJnBpZCwgc3RhdHVzKTsKLSAgICAgICAgICAgIC8qIG5vbi1mYXRhbCBkZWF0aC4uLiBub3RlIHRoYXQgaXQncyBnb25lIGluIHRoZSBjaGlsZCB0YWJsZSBhbmQKLSAgICAgICAgICAgICAqIGNsZWFuIG91dCB0aGUgc3RhdHVzIHRhYmxlLiAqLwotICAgICAgICAgICAgY2hpbGRfc2xvdCA9IC0xOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFwX21heF9kYWVtb25zX2xpbWl0OyArK2kpIHsKLSAgICAgICAgCWlmIChhcF9jaGlsZF90YWJsZVtpXS5waWQgPT0gcGlkLnBpZCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgajsKLQotICAgICAgICAgICAgICAgICAgICBjaGlsZF9zbG90ID0gaTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IEhBUkRfVEhSRUFEX0xJTUlUOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX3BlcmNoaWxkX2ZvcmNlX3Jlc2V0X2Nvbm5lY3Rpb25fc3RhdHVzKGkgKiBIQVJEX1RIUkVBRF9MSU1JVCArIGopOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjaGlsZF9zbG90ID49IDApIHsKLSAgICAgICAgICAgICAgICBhcF9jaGlsZF90YWJsZVtjaGlsZF9zbG90XS5zdGF0dXMgPSBTRVJWRVJfREVBRDsKLSAgICAgICAgICAgICAgICAKLQkJaWYgKHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydAotCQkgICAgJiYgY2hpbGRfc2xvdCA8IG51bV9kYWVtb25zKSB7Ci0JCSAgICAvKiB3ZSdyZSBzdGlsbCBkb2luZyBhIDEtZm9yLTEgcmVwbGFjZW1lbnQgb2YgZGVhZAotICAgICAgICAgICAgICAgICAgICAgKiBjaGlsZHJlbiB3aXRoIG5ldyBjaGlsZHJlbgotICAgICAgICAgICAgICAgICAgICAgKi8KLQkJICAgIG1ha2VfY2hpbGQoYXBfc2VydmVyX2NvbmYsIGNoaWxkX3Nsb3QsIHRpbWUoTlVMTCkpOwotCQkgICAgLS1yZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQ7Ci0JCX0KLSNpZiBBUFJfSEFTX09USEVSX0NISUxECi0JICAgIH0KLQkgICAgZWxzZSBpZiAoYXBfcmVhcF9vdGhlcl9jaGlsZCgmcGlkLCBzdGF0dXMpID09IDApIHsKLQkJLyogaGFuZGxlZCAqLwotI2VuZGlmCi0JICAgIH0KLQkgICAgZWxzZSBpZiAoaXNfZ3JhY2VmdWwpIHsKLQkJLyogR3JlYXQsIHdlJ3ZlIHByb2JhYmx5IGp1c3QgbG9zdCBhIHNsb3QgaW4gdGhlCi0JCSAqIGNoaWxkIHRhYmxlLiAgU29tZWhvdyB3ZSBkb24ndCBrbm93IGFib3V0IHRoaXMKLQkJICogY2hpbGQuCi0JCSAqLwotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfc2VydmVyX2NvbmYsCi0JCQkgICAgImxvbmcgbG9zdCBjaGlsZCBjYW1lIGhvbWUhIChwaWQgJWxkKSIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZylwaWQucGlkKTsKLQkgICAgfQotCSAgICAvKiBEb24ndCBwZXJmb3JtIGlkbGUgbWFpbnRlbmFuY2Ugd2hlbiBhIGNoaWxkIGRpZXMsCi0gICAgICAgICAgICAgKiBvbmx5IGRvIGl0IHdoZW4gdGhlcmUncyBhIHRpbWVvdXQuICBSZW1lbWJlciBvbmx5IGEKLSAgICAgICAgICAgICAqIGZpbml0ZSBudW1iZXIgb2YgY2hpbGRyZW4gY2FuIGRpZSwgYW5kIGl0J3MgcHJldHR5Ci0gICAgICAgICAgICAgKiBwYXRob2xvZ2ljYWwgZm9yIGEgbG90IHRvIGRpZSBzdWRkZW5seS4KLSAgICAgICAgICAgICAqLwotCSAgICBjb250aW51ZTsKLQl9Ci0JZWxzZSBpZiAocmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0KSB7Ci0JICAgIC8qIHdlIGhpdCBhIDEgc2Vjb25kIHRpbWVvdXQgaW4gd2hpY2ggbm9uZSBvZiB0aGUgcHJldmlvdXMKLQkgICAgICogZ2VuZXJhdGlvbiBvZiBjaGlsZHJlbiBuZWVkZWQgdG8gYmUgcmVhcGVkLi4uIHNvIGFzc3VtZQotCSAgICAgKiB0aGV5J3JlIGFsbCBkb25lLCBhbmQgcGljayB1cCB0aGUgc2xhY2sgaWYgYW55IGlzIGxlZnQuCi0JICAgICAqLwotCSAgICByZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQgPSBcCi0JICAgIAlzdGFydHVwX2NoaWxkcmVuKHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydCk7Ci0JICAgIC8qIEluIGFueSBldmVudCB3ZSByZWFsbHkgc2hvdWxkbid0IGRvIHRoZSBjb2RlIGJlbG93IGJlY2F1c2UKLQkgICAgICogZmV3IG9mIHRoZSBzZXJ2ZXJzIHdlIGp1c3Qgc3RhcnRlZCBhcmUgaW4gdGhlIElETEUgc3RhdGUKLQkgICAgICogeWV0LCBzbyB3ZSdkIG1pc3Rha2VubHkgY3JlYXRlIGFuIGV4dHJhIHNlcnZlci4KLQkgICAgICovCi0JICAgIGNvbnRpbnVlOwotCX0KLQotCXBlcmZvcm1fY2hpbGRfbWFpbnRlbmFuY2UoKTsKLSAgICB9Ci19Ci0KLWludCBhcF9tcG1fcnVuKGFwX3Bvb2xfdCAqX3Bjb25mLCBhcF9wb29sX3QgKnBsb2csIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgaW50IHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydDsKLSAgICBpbnQgaTsKLSAgICBhcF9zdGF0dXNfdCBydjsKLSAgICBhcF9zc2l6ZV90IG9uZSA9IDE7Ci0KLSAgICBwY29uZiA9IF9wY29uZjsKLSAgICBhcF9zZXJ2ZXJfY29uZiA9IHM7Ci0gICAgaWYgKChydiA9IGFwX2NyZWF0ZV9waXBlKCZwaXBlX29mX2RlYXRoX2luLCAmcGlwZV9vZl9kZWF0aF9vdXQsIHBjb25mKSkgCi0gICAgICAgICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHJ2LAotICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHNlcnZlcl9yZWMqKSBhcF9zZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJhcF9jcmVhdGVfcGlwZSAocGlwZV9vZl9kZWF0aCkiKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgaWYgKChydiA9IGFwX3NldF9waXBlX3RpbWVvdXQocGlwZV9vZl9kZWF0aF9pbiwgMCkpICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHJ2LAotICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHNlcnZlcl9yZWMqKSBhcF9zZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJhcF9zZXRfcGlwZV90aW1lb3V0IChwaXBlX29mX2RlYXRoKSIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICBhcF9zZXJ2ZXJfY29uZiA9IHM7Ci0gICAgaWYgKChudW1fbGlzdGVuZmRzID0gYXBfc2V0dXBfbGlzdGVuZXJzKGFwX3NlcnZlcl9jb25mKSkgPCAxKSB7Ci0gICAgICAgIC8qIFhYWDogaGV5LCB3aGF0J3MgdGhlIHJpZ2h0IHdheSBmb3IgdGhlIG1wbSB0byBpbmRpY2F0ZSBhIGZhdGFsIGVycm9yPyAqLwotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19BTEVSVCwgMCwgcywKLSAgICAgICAgICAgICJubyBsaXN0ZW5pbmcgc29ja2V0cyBhdmFpbGFibGUsIHNodXR0aW5nIGRvd24iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGFwX2xvZ19waWQocGNvbmYsIGFwX3BpZF9mbmFtZSk7Ci0KLSAgICAvKiBJbml0aWFsaXplIGNyb3NzLXByb2Nlc3MgYWNjZXB0IGxvY2sgKi8KLSAgICBsb2NrX2ZuYW1lID0gYXBfcHNwcmludGYoX3Bjb25mLCAiJXMuJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShfcGNvbmYsIGxvY2tfZm5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteV9waWQpOwotICAgIHJ2ID0gU0FGRV9BQ0NFUFQoYXBfY3JlYXRlX2xvY2soJnByb2Nlc3NfYWNjZXB0X211dGV4LCBBUFJfTVVURVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUFJfQ1JPU1NfUFJPQ0VTUywgbG9ja19mbmFtZSwgX3Bjb25mKSk7Ci0gICAgaWYgKHJ2ICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FTUVSRywgcnYsIHMsCi0gICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgY3JlYXRlIGNyb3NzLXByb2Nlc3MgbG9jayIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBpZiAoIWlzX2dyYWNlZnVsKSB7Ci0gICAgICAgIHJlaW5pdF9zY29yZWJvYXJkKHBjb25mKTsKLSAgICB9Ci0gICAgLyogSW5pdGlhbGl6ZSB0aGUgY2hpbGQgdGFibGUgKi8KLSAgICBpZiAoIWlzX2dyYWNlZnVsKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBIQVJEX1NFUlZFUl9MSU1JVDsgaSsrKSB7Ci0gICAgICAgICAgICBhcF9jaGlsZF90YWJsZVtpXS5zdGF0dXMgPSBTRVJWRVJfREVBRDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNldF9zaWduYWxzKCk7Ci0KLSAgICAvKiBJZiB3ZSdyZSBkb2luZyBhIGdyYWNlZnVsX3Jlc3RhcnQgdGhlbiB3ZSdyZSBnb2luZyB0byBzZWUgYSBsb3QKLSAgICAgKiBvZiBjaGlsZHJlbiBleGl0aW5nIGltbWVkaWF0ZWx5IHdoZW4gd2UgZ2V0IGludG8gdGhlIG1haW4gbG9vcAotICAgICAqIGJlbG93IChiZWNhdXNlIHdlIGp1c3Qgc2VudCB0aGVtIFNJR1dJTkNIKS4gIFRoaXMgaGFwcGVucyBwcmV0dHkKLSAgICAgKiByYXBpZGx5Li4uIGFuZCBmb3IgZWFjaCBvbmUgdGhhdCBleGl0cyB3ZSdsbCBzdGFydCBhIG5ldyBvbmUgdW50aWwKLSAgICAgKiB3ZSByZWFjaCBhdCBsZWFzdCBkYWVtb25zX21pbl9mcmVlLiAgQnV0IHdlIG1heSBiZSBwZXJtaXR0ZWQgdG8KLSAgICAgKiBzdGFydCBtb3JlIHRoYW4gdGhhdCwgc28gd2UnbGwganVzdCBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IHdlJ3JlCi0gICAgICogc3VwcG9zZWQgdG8gc3RhcnQgdXAgd2l0aG91dCB0aGUgMSBzZWNvbmQgcGVuYWx0eSBiZXR3ZWVuIGVhY2ggZm9yay4KLSAgICAgKi8KLSAgICByZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQgPSBudW1fZGFlbW9uczsKLSAgICBpZiAoIWlzX2dyYWNlZnVsKSB7Ci0JcmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0ID0gXAotCSAgICBzdGFydHVwX2NoaWxkcmVuKHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydCk7Ci0gICAgfQotICAgIGVsc2UgewotCS8qIGdpdmUgdGhlIHN5c3RlbSBzb21lIHRpbWUgdG8gcmVjb3ZlciBiZWZvcmUga2lja2luZyBpbnRvCi0JICAgICogZXhwb25lbnRpYWwgbW9kZSAqLwotCWhvbGRfb2ZmX29uX2V4cG9uZW50aWFsX3NwYXduaW5nID0gMTA7Ci0gICAgfQotCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCAwLCBhcF9zZXJ2ZXJfY29uZiwKLQkJIiVzIGNvbmZpZ3VyZWQgLS0gcmVzdW1pbmcgbm9ybWFsIG9wZXJhdGlvbnMiLAotCQlhcF9nZXRfc2VydmVyX3ZlcnNpb24oKSk7Ci0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgMCwgYXBfc2VydmVyX2NvbmYsCi0JCSJTZXJ2ZXIgYnVpbHQ6ICVzIiwgYXBfZ2V0X3NlcnZlcl9idWlsdCgpKTsKLSAgICByZXN0YXJ0X3BlbmRpbmcgPSBzaHV0ZG93bl9wZW5kaW5nID0gMDsKLQotICAgIHNlcnZlcl9tYWluX2xvb3AocmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0KTsKLQotICAgIGlmIChzaHV0ZG93bl9wZW5kaW5nKSB7Ci0gICAgICAgIC8qIFRpbWUgdG8gZ3JhY2VmdWxseSBzaHV0IGRvd246Ci0gICAgICAgICAqIEtpbGwgY2hpbGQgcHJvY2Vzc2VzLCB0ZWxsIHRoZW0gdG8gY2FsbCBjaGlsZF9leGl0LCBldGMuLi4KLSAgICAgICAgICovCi0gICAgICAgIGlmICh1bml4ZF9raWxscGcoZ2V0cGdycCgpLCBTSUdURVJNKSA8IDApIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgYXBfc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgImtpbGxwZyBTSUdURVJNIik7Ci0gICAgICAgIH0KLSAgICAgICAgYXBfcmVjbGFpbV9jaGlsZF9wcm9jZXNzZXMoMSk7CQkvKiBTdGFydCB3aXRoIFNJR1RFUk0gKi8KLSAgICAKLSAgICAgICAgLyogY2xlYW51cCBwaWQgZmlsZSBvbiBub3JtYWwgc2h1dGRvd24gKi8KLSAgICAgICAgewotICAgICAgICAgICAgY29uc3QgY2hhciAqcGlkZmlsZSA9IE5VTEw7Ci0gICAgICAgICAgICBwaWRmaWxlID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUgKHBjb25mLCBhcF9waWRfZm5hbWUpOwotICAgICAgICAgICAgaWYgKCBwaWRmaWxlICE9IE5VTEwgJiYgdW5saW5rKHBpZGZpbGUpID09IDApCi0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgMCwKLSAgICAgICAgICAgIAkJIGFwX3NlcnZlcl9jb25mLAotICAgICAgICAgICAgCQkgInJlbW92ZWQgUElEIGZpbGUgJXMgKHBpZD0lbGQpIiwKLSAgICAgICAgICAgIAkJIHBpZGZpbGUsIChsb25nKWdldHBpZCgpKTsKLSAgICAgICAgfQotICAgIAotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19OT1RJQ0UsIDAsCi0gICAgICAgICAgICAgICAgICAgICBhcF9zZXJ2ZXJfY29uZiwgImNhdWdodCBTSUdURVJNLCBzaHV0dGluZyBkb3duIik7Ci0gICAgCi0JcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLyogd2UndmUgYmVlbiB0b2xkIHRvIHJlc3RhcnQgKi8KLSAgICBhcF9zaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKLQotICAgIGlmIChvbmVfcHJvY2VzcykgewotCS8qIG5vdCB3b3J0aCB0aGlua2luZyBhYm91dCAqLwotCXJldHVybiAxOwotICAgIH0KLQotICAgIGlmIChpc19ncmFjZWZ1bCkgewotICAgICAgICBjaGFyIGNoYXJfb2ZfZGVhdGggPSAnISc7Ci0KLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19OT1RJQ0UsIDAsIGFwX3NlcnZlcl9jb25mLAotCQkgICAgIlNJR1dJTkNIIHJlY2VpdmVkLiAgRG9pbmcgZ3JhY2VmdWwgcmVzdGFydCIpOwotCi0JLyogVGhpcyBpcyBtb3N0bHkgZm9yIGRlYnVnZ2luZy4uLiBzbyB0aGF0IHdlIGtub3cgd2hhdCBpcyBzdGlsbAotICAgICAgICAgKiBncmFjZWZ1bGx5IGRlYWxpbmcgd2l0aCBleGlzdGluZyByZXF1ZXN0LgotICAgICAgICAgKi8KLQkKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2RhZW1vbnM7ICsraSkgewotCSAgICBpZiAoYXBfY2hpbGRfdGFibGVbaV0uc3RhdHVzICE9IFNFUlZFUl9ERUFEKSB7Ci0JICAgICAgICBhcF9jaGlsZF90YWJsZVtpXS5zdGF0dXMgPSBTRVJWRVJfRFlJTkc7Ci0JICAgIH0gCi0JfQotCS8qIGdpdmUgdGhlIGNoaWxkcmVuIHRoZSBzaWduYWwgdG8gZGllICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fZGFlbW9uczspIHsKLSAgICAgICAgICAgIGlmICgocnYgPSBhcF93cml0ZShwaXBlX29mX2RlYXRoX291dCwgJmNoYXJfb2ZfZGVhdGgsICZvbmUpKSAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgIGlmIChhcF9jYW5vbmljYWxfZXJyb3IocnYpID09IEFQUl9FSU5UUikgY29udGludWU7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIHJ2LCBhcF9zZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHBpcGVfb2ZfZGVhdGgiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIC8qIEtpbGwgJ2VtIGFsbC4gIFNpbmNlIHRoZSBjaGlsZCBhY3RzIHRoZSBzYW1lIG9uIHRoZSBwYXJlbnRzIFNJR1RFUk0gCi0gICAgICAgKiBhbmQgYSBTSUdIVVAsIHdlIG1heSBhcyB3ZWxsIHVzZSB0aGUgc2FtZSBzaWduYWwsIGJlY2F1c2Ugc29tZSB1c2VyCi0gICAgICAgKiBwdGhyZWFkcyBhcmUgc3RlYWxpbmcgc2lnbmFscyBmcm9tIHVzIGxlZnQgYW5kIHJpZ2h0LgotICAgICAgICovCi0JaWYgKHVuaXhkX2tpbGxwZyhnZXRwZ3JwKCksIFNJR1RFUk0pIDwgMCkgewotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIGFwX3NlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICJraWxscGcgU0lHVEVSTSIpOwotCX0KLSAgICAgICAgYXBfcmVjbGFpbV9jaGlsZF9wcm9jZXNzZXMoMSk7CQkvKiBTdGFydCB3aXRoIFNJR1RFUk0gKi8KLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19OT1RJQ0UsIDAsCi0gICAgICAgICAgICAgICAgICAgICBhcF9zZXJ2ZXJfY29uZiwgIlNJR0hVUCByZWNlaXZlZC4gIEF0dGVtcHRpbmcgdG8gcmVzdGFydCIpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcGVyY2hpbGRfcHJlX2NvbmZpZyhhcF9wb29sX3QgKnAsIGFwX3Bvb2xfdCAqcGxvZywgYXBfcG9vbF90ICpwdGVtcCkKLXsKLSAgICBzdGF0aWMgaW50IHJlc3RhcnRfbnVtID0gMDsKLQotICAgIG9uZV9wcm9jZXNzID0gISFnZXRlbnYoIk9ORV9QUk9DRVNTIik7Ci0KLSAgICAvKiBzaWdoLCB3YW50IHRoaXMgb25seSB0aGUgc2Vjb25kIHRpbWUgYXJvdW5kICovCi0gICAgaWYgKHJlc3RhcnRfbnVtKysgPT0gMSkgewotCWlzX2dyYWNlZnVsID0gMDsKLQotCWlmICghb25lX3Byb2Nlc3MpIHsKLQkgICAgYXBfZGV0YWNoKCk7Ci0JfQotCi0JbXlfcGlkID0gZ2V0cGlkKCk7Ci0gICAgfQotCi0gICAgdW5peGRfcHJlX2NvbmZpZygpOwotICAgIGFwX2xpc3Rlbl9wcmVfY29uZmlnKCk7Ci0gICAgbnVtX2RhZW1vbnMgPSBERUZBVUxUX05VTV9EQUVNT047Ci0gICAgdGhyZWFkc190b19zdGFydCA9IERFRkFVTFRfU1RBUlRfVEhSRUFEOwotICAgIG1pbl9zcGFyZV90aHJlYWRzID0gREVGQVVMVF9NSU5fU1BBUkVfVEhSRUFEOwotICAgIG1heF9zcGFyZV90aHJlYWRzID0gREVGQVVMVF9NQVhfU1BBUkVfVEhSRUFEOwotICAgIG1heF90aHJlYWRzID0gSEFSRF9USFJFQURfTElNSVQ7Ci0gICAgYXBfcGlkX2ZuYW1lID0gREVGQVVMVF9QSURMT0c7Ci0gICAgYXBfc2NvcmVib2FyZF9mbmFtZSA9IERFRkFVTFRfU0NPUkVCT0FSRDsKLSAgICBsb2NrX2ZuYW1lID0gREVGQVVMVF9MT0NLRklMRTsKLSAgICBtYXhfcmVxdWVzdHNfcGVyX2NoaWxkID0gREVGQVVMVF9NQVhfUkVRVUVTVFNfUEVSX0NISUxEOwotICAgIGFwX3BlcmNoaWxkX3NldF9tYWludGFpbl9jb25uZWN0aW9uX3N0YXR1cygxKTsKLQotICAgIGFwX2NweXN0cm4oYXBfY29yZWR1bXBfZGlyLCBhcF9zZXJ2ZXJfcm9vdCwgc2l6ZW9mKGFwX2NvcmVkdW1wX2RpcikpOwotfQotCi1zdGF0aWMgdm9pZCBwZXJjaGlsZF9ob29rcyh2b2lkKQotewotICAgIElOSVRfU0lHTElTVCgpCi0gICAgb25lX3Byb2Nlc3MgPSAwOwotCi0gICAgYXBfaG9va19wcmVfY29uZmlnKHBlcmNoaWxkX3ByZV9jb25maWcsIE5VTEwsIE5VTEwsIEFQX0hPT0tfTUlERExFKTsgCi19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfcGlkZmlsZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNvbnN0IGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKGNtZC0+c2VydmVyLT5pc192aXJ0dWFsKSB7Ci0JcmV0dXJuICJQaWRGaWxlIGRpcmVjdGl2ZSBub3QgYWxsb3dlZCBpbiA8VmlydHVhbEhvc3Q+IjsKLSAgICB9Ci0gICAgYXBfcGlkX2ZuYW1lID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3Njb3JlYm9hcmQoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgYXBfc2NvcmVib2FyZF9mbmFtZSA9IGFyZzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9sb2NrZmlsZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNvbnN0IGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbG9ja19mbmFtZSA9IGFyZzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbnVtX2RhZW1vbnMgKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY29uc3QgY2hhciAqYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBudW1fZGFlbW9ucyA9IGF0b2koYXJnKTsKLSAgICBpZiAobnVtX2RhZW1vbnMgPiBIQVJEX1NFUlZFUl9MSU1JVCkgewotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICJXQVJOSU5HOiBOdW1TZXJ2ZXJzIG9mICVkIGV4Y2VlZHMgY29tcGlsZSB0aW1lIGxpbWl0ICIKLSAgICAgICAgICAgICAgICAgICAgIm9mICVkIHNlcnZlcnMsIiwgbnVtX2RhZW1vbnMsIEhBUkRfU0VSVkVSX0xJTUlUKTsKLSAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAiIGxvd2VyaW5nIE51bVNlcnZlcnMgdG8gJWQuICBUbyBpbmNyZWFzZSwgcGxlYXNlICIKLSAgICAgICAgICAgICAgICAgICAgInNlZSB0aGUiLCBIQVJEX1NFUlZFUl9MSU1JVCk7Ci0gICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgIiBIQVJEX1NFUlZFUl9MSU1JVCBkZWZpbmUgaW4gJXMuIiwKLSAgICAgICAgICAgICAgICAgICAgQVBfTVBNX0hBUkRfTElNSVRTX0ZJTEUpOwotICAgICAgIG51bV9kYWVtb25zID0gSEFSRF9TRVJWRVJfTElNSVQ7Ci0gICAgfSAKLSAgICBlbHNlIGlmIChudW1fZGFlbW9ucyA8IDEpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIldBUk5JTkc6IFJlcXVpcmUgTnVtU2VydmVycyA+IDAsIHNldHRpbmcgdG8gMSIpOwotCW51bV9kYWVtb25zID0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfdGhyZWFkc190b19zdGFydCAoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjb25zdCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHRocmVhZHNfdG9fc3RhcnQgPSBhdG9pKGFyZyk7Ci0gICAgaWYgKHRocmVhZHNfdG9fc3RhcnQgPiBIQVJEX1RIUkVBRF9MSU1JVCkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIldBUk5JTkc6IFN0YXJ0VGhyZWFkcyBvZiAlZCBleGNlZWRzIGNvbXBpbGUgdGltZSIKLSAgICAgICAgICAgICAgICAgICAgICIgbGltaXQgb2YgJWQgdGhyZWFkcywiLCB0aHJlYWRzX3RvX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgSEFSRF9USFJFQURfTElNSVQpOwotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIiBsb3dlcmluZyBTdGFydFRocmVhZHMgdG8gJWQuIFRvIGluY3JlYXNlLCBwbGVhc2UiCi0gICAgICAgICAgICAgICAgICAgICAiIHNlZSB0aGUiLCBIQVJEX1RIUkVBRF9MSU1JVCk7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiIEhBUkRfVEhSRUFEX0xJTUlUIGRlZmluZSBpbiAlcy4iLAotICAgICAgICAgICAgICAgICAgICAgQVBfTVBNX0hBUkRfTElNSVRTX0ZJTEUpOwotICAgIH0KLSAgICBlbHNlIGlmICh0aHJlYWRzX3RvX3N0YXJ0IDwgMSkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiV0FSTklORzogUmVxdWlyZSBTdGFydFRocmVhZHMgPiAwLCBzZXR0aW5nIHRvIDEiKTsKLQl0aHJlYWRzX3RvX3N0YXJ0ID0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbWluX3NwYXJlX3RocmVhZHMoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbWluX3NwYXJlX3RocmVhZHMgPSBhdG9pKGFyZyk7Ci0gICAgaWYgKG1pbl9zcGFyZV90aHJlYWRzIDw9IDApIHsKLSAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAiV0FSTklORzogZGV0ZWN0ZWQgTWluU3BhcmVUaHJlYWRzIHNldCB0byBub24tcG9zaXRpdmUuIik7Ci0gICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgIlJlc2V0dGluZyB0byAxIHRvIGF2b2lkIGFsbW9zdCBjZXJ0YWluIEFwYWNoZSBmYWlsdXJlLiIpOwotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICJQbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbi4iKTsKLSAgICAgICBtaW5fc3BhcmVfdGhyZWFkcyA9IDE7Ci0gICAgfQotICAgICAgIAotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X21heF9zcGFyZV90aHJlYWRzKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY29uc3QgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1heF9zcGFyZV90aHJlYWRzID0gYXRvaShhcmcpOwotICAgIGlmIChtYXhfc3BhcmVfdGhyZWFkcyA+PSBIQVJEX1RIUkVBRF9MSU1JVCkgewotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICJXQVJOSU5HOiBkZXRlY3RlZCBNaW5TcGFyZVRocmVhZHMgc2V0IGhpZ2hlciB0aGFuIik7Ci0gICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgIkhBUkRfVEhSRUFEX0xJTUlULiBSZXNldHRpbmcgdG8gJWQiLCBIQVJEX1RIUkVBRF9MSU1JVCk7Ci0gICAgICAgbWF4X3NwYXJlX3RocmVhZHMgPSBIQVJEX1RIUkVBRF9MSU1JVDsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbWF4X3RocmVhZHMoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbWF4X3RocmVhZHMgPSBhdG9pKGFyZyk7Ci0gICAgaWYgKG1heF90aHJlYWRzID4gSEFSRF9USFJFQURfTElNSVQpIHsKLSAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAiV0FSTklORzogZGV0ZWN0ZWQgTWF4VGhyZWFkc1BlckNoaWxkIHNldCBoaWdoZXIgdGhhbiIpOwotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICJIQVJEX1RIUkVBRF9MSU1JVC4gUmVzZXR0aW5nIHRvICVkIiwgSEFSRF9USFJFQURfTElNSVQpOwotICAgICAgIG1heF90aHJlYWRzID0gSEFSRF9USFJFQURfTElNSVQ7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X21heF9yZXF1ZXN0cyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNvbnN0IGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCA9IGF0b2koYXJnKTsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X21haW50YWluX2Nvbm5lY3Rpb25fc3RhdHVzKGNtZF9wYXJtcyAqY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkdW1teSwgaW50IGFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgYXBfcGVyY2hpbGRfc2V0X21haW50YWluX2Nvbm5lY3Rpb25fc3RhdHVzKGFyZyAhPSAwKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9jb3JlZHVtcGRpciAoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjb25zdCBjaGFyICphcmcpIAotewotICAgIGFwX2ZpbmZvX3QgZmluZm87Ci0gICAgY29uc3QgY2hhciAqZm5hbWU7Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZm5hbWUgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShjbWQtPnBvb2wsIGFyZyk7Ci0gICAgaWYgKChhcF9zdGF0KCZmaW5mbywgZm5hbWUsIGNtZC0+cG9vbCkgIT0gQVBSX1NVQ0NFU1MpIHx8IAotICAgICAgICAoZmluZm8uZmlsZXR5cGUgIT0gQVBSX0RJUikpIHsKLQlyZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsICJDb3JlRHVtcERpcmVjdG9yeSAiLCBmbmFtZSwgCi0JCQkgICIgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGEgZGlyZWN0b3J5IiwgTlVMTCk7Ci0gICAgfQotICAgIGFwX2NweXN0cm4oYXBfY29yZWR1bXBfZGlyLCBmbmFtZSwgc2l6ZW9mKGFwX2NvcmVkdW1wX2RpcikpOwotICAgIHJldHVybiBOVUxMOwotfQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9jaGlsZHByb2Nlc3MoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjb25zdCBjaGFyICphcmcpIAotewotfQotLyoKLSAgICBpZiAodW5saW5rKHNjb25mLT5zb2NrbmFtZSkgPCAwICYmCi0gICAgICAgIGVycm5vICE9IEVOT0VOVCkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywgbWFpbl9zZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgdW5saW5rIHVuaXggZG9tYWluIHNvY2tldCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICBzY29uZi0+c29ja25hbWUpOwotICAgICAgICAvKiBqdXN0IGEgd2FybmluZzsgZG9uJ3QgYmFpbCBvdXQKLSAgICB9Ci0KLSAgICBpZiAoKHNkID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKSkgPCAwKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGVycm5vLCBtYWluX3NlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBjcmVhdGUgdW5peCBkb21haW4gc29ja2V0Iik7Ci0gICAgICAgIHJldHVybiBlcnJubzsKLSAgICB9Ci0KLSAgICBtZW1zZXQoJnVuaXhfYWRkciwgMCwgc2l6ZW9mKHVuaXhfYWRkcikpOwotICAgIHVuaXhfYWRkci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKLSAgICBzdHJjcHkodW5peF9hZGRyLnN1bl9wYXRoLCBzY29uZi0+c29ja25hbWUpOwotCi0gICAgb21hc2sgPSB1bWFzaygwMDc3KTsgLyogc28gdGhhdCBvbmx5IEFwYWNoZSBjYW4gdXNlIHNvY2tldCAKLSAgICByYyA9IGJpbmQoc2QsIChzdHJ1Y3Qgc29ja2FkZHIgKikmdW5peF9hZGRyLCBzaXplb2YodW5peF9hZGRyKSk7Ci0qLwotCi0KLQotCi0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIHBlcmNoaWxkX2NtZHNbXSA9IHsKLVVOSVhfREFFTU9OX0NPTU1BTkRTCi1MSVNURU5fQ09NTUFORFMKLUFQX0lOSVRfVEFLRTEoIlBpZEZpbGUiLCBzZXRfcGlkZmlsZSwgTlVMTCwgUlNSQ19DT05GLAotICAgICAgICAgICAgICAiQSBmaWxlIGZvciBsb2dnaW5nIHRoZSBzZXJ2ZXIgcHJvY2VzcyBJRCIpLAotQVBfSU5JVF9UQUtFMSgiU2NvcmVCb2FyZEZpbGUiLCBzZXRfc2NvcmVib2FyZCwgTlVMTCwgUlNSQ19DT05GLAotICAgICAgICAgICAgICAiQSBmaWxlIGZvciBBcGFjaGUgdG8gbWFpbnRhaW4gcnVudGltZSBwcm9jZXNzIG1hbmFnZW1lbnQgaW5mb3JtYXRpb24iKSwKLUFQX0lOSVRfVEFLRTEoIkxvY2tGaWxlIiwgc2V0X2xvY2tmaWxlLCBOVUxMLCBSU1JDX0NPTkYsCi0gICAgICAgICAgICAgICJUaGUgbG9ja2ZpbGUgdXNlZCB3aGVuIEFwYWNoZSBuZWVkcyB0byBsb2NrIHRoZSBhY2NlcHQoKSBjYWxsIiksCi1BUF9JTklUX1RBS0UxKCJOdW1TZXJ2ZXJzIiwgc2V0X251bV9kYWVtb25zLCBOVUxMLCBSU1JDX0NPTkYsCi0gICAgICAgICAgICAgICJOdW1iZXIgb2YgY2hpbGRyZW4gYWxpdmUgYXQgdGhlIHNhbWUgdGltZSIpLAotQVBfSU5JVF9UQUtFMSgiU3RhcnRUaHJlYWRzIiwgc2V0X3RocmVhZHNfdG9fc3RhcnQsIE5VTEwsIFJTUkNfQ09ORiwKLSAgICAgICAgICAgICAgIk51bWJlciBvZiB0aHJlYWRzIGVhY2ggY2hpbGQgY3JlYXRlcyIpLAotQVBfSU5JVF9UQUtFMSgiTWluU3BhcmVUaHJlYWRzIiwgc2V0X21pbl9zcGFyZV90aHJlYWRzLCBOVUxMLCBSU1JDX0NPTkYsCi0gICAgICAgICAgICAgICJNaW5pbXVtIG51bWJlciBvZiBpZGxlIHRocmVhZHMgcGVyIGNoaWxkLCB0byBoYW5kbGUgcmVxdWVzdCBzcGlrZXMiKSwKLUFQX0lOSVRfVEFLRTEoIk1heFNwYXJlVGhyZWFkcyIsIHNldF9tYXhfc3BhcmVfdGhyZWFkcywgTlVMTCwgUlNSQ19DT05GLAotICAgICAgICAgICAgICAiTWF4aW11bSBudW1iZXIgb2YgaWRsZSB0aHJlYWRzIHBlciBjaGlsZCIpLAotQVBfSU5JVF9UQUtFMSgiTWF4VGhyZWFkc1BlckNoaWxkIiwgc2V0X21heF90aHJlYWRzLCBOVUxMLCBSU1JDX0NPTkYsCi0gICAgICAgICAgICAgICJNYXhpbXVtIG51bWJlciBvZiB0aHJlYWRzIHBlciBjaGlsZCIpLAotQVBfSU5JVF9UQUtFMSgiTWF4UmVxdWVzdHNQZXJDaGlsZCIsIHNldF9tYXhfcmVxdWVzdHMsIE5VTEwsIFJTUkNfQ09ORiwKLSAgICAgICAgICAgICAgIk1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIGEgcGFydGljdWxhciBjaGlsZCBzZXJ2ZXMgYmVmb3JlIGR5aW5nLiIpLAotQVBfSU5JVF9GTEFHKCJDb25uZWN0aW9uU3RhdHVzIiwgc2V0X21haW50YWluX2Nvbm5lY3Rpb25fc3RhdHVzLCBOVUxMLCBSU1JDX0NPTkYsCi0gICAgICAgICAgICAgIldoZXRoZXIgb3Igbm90IHRvIG1haW50YWluIHN0YXR1cyBpbmZvcm1hdGlvbiBvbiBjdXJyZW50IGNvbm5lY3Rpb25zIiksCi1BUF9JTklUX1RBS0UxKCJDb3JlRHVtcERpcmVjdG9yeSIsIHNldF9jb3JlZHVtcGRpciwgTlVMTCwgUlNSQ19DT05GLAotICAgICAgICAgICAgICAiVGhlIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RvcnkgQXBhY2hlIGNoYW5nZXMgdG8gYmVmb3JlIGR1bXBpbmcgY29yZSIpLAotQVBfSU5JVF9UQUtFMSgiQ2hpbGRQcm9jZXNzIiwgc2V0X2NoaWxkcHJvY2VzcywgTlVMTCwgUlNSQ19DT05GLAotICAgICAgICAgICAgICAiV2hpY2ggY2hpbGQgcHJvY2VzcyBpcyByZXNwb25zaWJsZSBmb3Igc2VydmluZyB0aGlzIHZpcnR1YWwgaG9zdCIpLAoteyBOVUxMIH0KLX07Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBtcG1fcGVyY2hpbGRfbW9kdWxlID0gewotICAgIE1QTTIwX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaG9vayB0byBydW4gYmVmb3JlIGFwYWNoZSBwYXJzZXMgYXJncyAqLwotICAgIE5VTEwsCQkJLyogY3JlYXRlIHBlci1kaXJlY3RvcnkgY29uZmlnIHN0cnVjdHVyZSAqLwotICAgIE5VTEwsCQkJLyogbWVyZ2UgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIE5VTEwsCQkJLyogY3JlYXRlIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZSAqLwotICAgIE5VTEwsCQkJLyogbWVyZ2UgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIHBlcmNoaWxkX2NtZHMsCQkvKiBjb21tYW5kIGFwX3RhYmxlX3QgKi8KLSAgICBOVUxMLAkJCS8qIGhhbmRsZXJzICovCi0gICAgcGVyY2hpbGRfaG9va3MgCQkvKiByZWdpc3Rlcl9ob29rcyAqLwotfTsKLQpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9tb25pdG9yaW5nLXNlcnZpY2VzLnR4dCBiL3NlcnZlci9tcG0vbW9uaXRvcmluZy1zZXJ2aWNlcy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NjY1ODkuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9tb25pdG9yaW5nLXNlcnZpY2VzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLUZyb206ICAgIFdpbGxpYW0gQS4gUm93ZSwgSnIuIAotRGF0ZTogICAgSnVuZSA3dGggJzAwCi1TdWJqZWN0OiBzZXJ2aWNlIG1vbml0b3JpbmcgaW4gQXBhY2hlIDEuMy4xMwotCi1UaGUgY29uY2VwdCBmb3IgYSB0YXNrYmFyIG1vbml0b3IgaGFzIGJlZW4gdGhyb3duIGFyb3VuZAotZm9yIGEgdmVyeSBsb25nIHdoaWxlLiAgMS4zLjEzIGludHJvZHVjZWQgV2luOXggc2VydmljZXMsCi1hbmQgdGhhdCBhZGRlZCBmdWVsIHRvIHRoZSBtaXguICBIZXJlIGFyZSBzb21lIHNpZGViYW5kCi1vYnNlcnZhdGlvbnMgSSd2ZSBtYWRlIGZvciBvdGhlciBkZXZlbG9wZXJzLi4uCi0KLUFib3V0IEFwYWNoZSBhcyBhIGNvbnNvbGUsIGRvbid0IHN0YXJ0IEFwYWNoZSBoaWRkZW4gd2l0aG91dAotYW55IGNvbW1hbmQgbGluZSBhcmd1bWVudHMgaWYgeW91IHdhbnQgdG8gbGF1bmNoIGl0IHlvdXJzZWxmCi1pbiBhIGhpZGRlbiB3aW5kb3cgKGl0IHdpbGwgZG8gdGhlIGNsYXNzaWMgdGVzdCBmb3IgCi1BbGxvY0NvbnNvbGUvRnJlZUNvbnNvbGUpLi4uIGRyb3AgaW4gc29tZSBhcmd1bWVudHMgc3VjaCBhcwotdGhlIC1mIG9yIC1yIG9wdGlvbiBhbmQgaXQgd2lsbCBmbHkgd2l0aG91dCB0aGlua2luZyBpdCBpcyBhIAotc2VydmljZSB1bmRlciA5eCBhbmQgTlQuCi0KLVJ1bGUgdHdvLCBkb24ndCB1c2UgLS1udHNlcnZpY2UgYXMgYW4gYXJndW1lbnQsIGV2ZXIuICBPbmx5Ci10aGUgV2luZG93cyBOVCBTZXJ2aWNlIENvbnRyb2wgTWFuYWdlciBpcyBhbGxvd2VkIHRvIHBhc3MgdGhhdAotZmxhZywgYW5kIG9ubHkgdGhhdCBmbGFnLCB3aGVuIGl0IHJ1bnMgQXBhY2hlLmV4ZS4gIERvIHVzZSAKLS0tbnRzZXJ2aWNlIGFzIHRoZSBzb2xlIGFyZ3VtZW50IHRvIHRoZSBleGVjdXRhYmxlIG5hbWUgaWYgCi15b3UgYXJlIGluc3RhbGxpbmcgYW4gQXBhY2hlIE5UIHNlcnZpY2UgeW91cnNlbGYuCi0KLVJ1bGUgdGhyZWUsIHVzZSAtayBzdGFydCBhbmQgLW4gbmFtZSB3aGVuIG1haW50YWluaW5nIHRoZQotSEtMTS9Tb2Z0d2FyZS9NaWNyb3NvZnQvV2luZG93cy9DdXJyZW50VmVyc2lvbi9SdW5TZXJ2aWNlcwotbGlzdCwgc2luY2UgdGhlcmUgaXMgbm8gb3RoZXIgd2F5IGZvciBBcGFjaGUgdG8ga25vdyB3aGF0IAotdGhlIHNlcnZpY2UgaXMgbmFtZWQgOikgIEFuZCBsb29rIGF0IGFueSA5eCBpbnN0YWxsZWQgc2VydmljZSdzIAotUnVuU2VydmljZXMgZW50cnkgaW4gdGhlIHJlZ2lzdHJ5IGZvciB0aGUgc3RhcnQgc2VydmljZSBzZW1hbnRpYy4KLQotUnVsZSBmb3VyLCB1c2UgdGhlIFdpbk5UIFNlcnZpY2UgQ29udHJvbCBNYW5hZ2VyIGV4Y2x1c2l2ZWx5Ci1mb3Igc3RhcnRpbmcsIHN0b3BwaW5nIGFuZCByZXN0YXJ0aW5nIEFwYWNoZSBhcyBhbiBOVCBzZXJ2aWNlLgotVGhlIHJlc3RhcnQgc2lnbmFsIGlzIHRoZSB2YWx1ZSAxMjgsIGFzIGRvY3VtZW50ZWQgaW4gc2VydmljZS5oIAotYW5kIHNlcnZpY2UuYyAtIHRoaXMgd2lsbCBjb250aW51ZSB0byB3b3JrIGluIEFwYWNoZSAyLjAuICBJZgotaXQgZmFpbHMsIHlvdSBhcmUgaGFuZGxpbmcgYW4gb2xkZXIgdmVyc2lvbiAocHJlIDEuMy4xMykgb2YKLUFwYWNoZSwgYW5kIG5lZWQgdG8gc3RvcCBhbmQgdGhlbiBzdGFydCB0aGUgc2VydmljZSBpbnN0ZWFkLgotCi1SdWxlIGZpdmUsIHVzZSB0aGUgbGVnYWN5IHBpZC1uYW1lZCBldmVudHMgdG8gc2lnbmFsIFdpbjl4IAotc2VydmljZSBBcGFjaGUgdG8gcmVzdGFydCBhbmQgc3RvcCB0aGUgc2VydmljZS4gIEJ1dCBkb24ndAotYm90aGVyIGxvb2tpbmcgZm9yIGh0dHBkLnBpZCBmaWxlcy4uLiB5b3UgY2FuIGdldCB0aGUgcGlkCi1yaWdodCBmcm9tIHRoZSBoaWRkZW4gc2VydmljZSBjb250cm9sIHdpbmRvdy4gIEFwYWNoZSAxLjMuMTMKLWFuZCAyLnggY3JlYXRlIGEgaGlkZGVuIHdpbmRvdyBuYW1lZCBmb3IgdGhlIG5hbWUgb2YgdGhlIAotc2VydmljZSAod2l0aG91dCB0aGUgc3BhY2VzKSwgd2l0aCBhIHdpbmRvdyBjbGFzcyBvZgotIkFwYWNoZVdpbjk1U2VydmljZU1vbml0b3IiLCBzbyBjYW4gdXNlIEZpbmRXaW5kb3cgdG8gdHJhY2sgCi1kb3duIHJ1bm5pbmcgV2luOXggc2VydmljZXMuICBTZWUgdGhlIHNlcnZpY2UuYyBjb2RlIGZvciBob3cgCi1JIGFjY29tcGxpc2hlZCB0aGlzIHByZXR0eSBzaW1wbHkgaW4gdGhlIC1rIHN0b3AvLWsgcmVzdGFydAotaGFuZGxlci4KLQotVGFza2JhciBNb25pdG9yIEFwcAotLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1CYXNpYyByZXF1aXJlbWVudHM6IGEgQyBjb2RlIGFwcGxpY2F0aW9uIHVzaW5nIHN0cmljdGx5IHRoZQotV2luMzIgQVBJLCBhbmQgbm90IE1GQyBvciBvdGhlciBXaW4zMiBmcmFtZXdvcmtzLiAgQ291bGQgdXNlCi10aGUgc2VydmljZS5jIG1vZHVsZSB0byBzaGFyZSBzb21lIGJhc2ljIGZ1bmN0aW9ucy4gIFRoYXQKLW1vZHVsZSBjb3VsZCBiZSBleHRlbmRlZCBpbiBBcGFjaGUgMi4wIHRvIG1ha2UgdGhpcyBhbGwgZWFzaWVyLgotCi1JIHRoaW5rIHdlIGFyZSBsb29raW5nIGZvciBhbiBleHRlcm5hbCBhcHAgdGhhdCBzaW1wbHkgYWN0cyAKLWFzIGEgbW9uaXRvciBvciBhbGxvd3MgYSBzdG9wcGVkIHNlcnZpY2UgdG8gYmUgc3RhcnRlZC4gIElmIAotdGhlIHVzZXIgbG9ncyBvZmYsIHdlIGxvb3NlIHRoZSBtb25pdG9yIGFwcCwgYnV0IGluc3RhbGxlZCBhcyAKLWEgc2hvcnRjdXQgaW4gdGhlIFN0YXJ0IGdyb3VwIG9yIGluIHRoZSByZWdpc3RyeSBrZXkKLUhLTE0vU29mdHdhcmUvTWljcm9zb2Z0L1dpbmRvd3MvQ3VycmVudFZlcnNpb24vUnVuCi13ZSB3aWxsIGJlIGp1c3QgZmluZS4gIEknZCBsaWtlIHRvIHNlZSB0aGUgbW9uaXRvciBydW4gb25seQotb25lIGluc3RhbmNlIHRvIG1vbml0b3IgYWxsIHJ1bm5pbmcgc2VydmljZXMsIGZvciBtZW1vcnkKLWFuZCByZXNvdXJjZSBjb25zZXJ2YXRpb24uCi0KLUkgd2FzIHRoaW5raW5nIHRoYXQgdGhlIGhvdmVyL2ljb25iYXIgdGl0bGUgd291bGQgdGVsbCB0aGVtIAotIlRlc3Qgc2VydmljZSBpcyBydW5uaW5nIiwgb3IgIlRlc3Qgc2VydmljZSBpcyBzdG9wcGVkIi4KLUlmIHRoZXkgbGVmdCBjbGljaywgdGhleSBjb3VsZCBzdG9wIG9yIHJlc3RhcnQsIG9yIHNpbXBseQotc3RhcnQgaWYgaXQgaXMgc3RvcHBlZC4gIFRoZXJlIGNvdWxkIGJlIGEgcHJlZmVyZW5jZSB0aGF0Ci1lYWNoIHNlcnZpY2UgZG9lc24ndCBnZXQgaXQncyBvd24gaW5kaXZpZHVhbCB0YXNrIGljb24gdW5sZXNzIAotaXQgaXMgcnVubmluZywgaWYgaXQgaXMgYSBtYW51YWwgc3RhcnQgc2VydmljZSAob3IgbWlzc2luZyAKLWZyb20gdGhlIFJ1blNlcnZpY2VzIGxpc3QsIHdoaWNoIGlzIHRoZSBlcXVpdmlsYW50IHVuZGVyIDl4KS4KLQotSWYgYSBzcGVjaWZpYyBzZXJ2aWNlIGlzIHNldCB0byBBdXRvIHN0YXJ0IG9yIGlzIGluIHRoZSAKLVJ1blNlcnZpY2VzIFdpbjl4IHJlZ2lzdHJ5IGtleSwgd2UgbXVzdCBzaG93IHRoZW0gdGhlIHN0b3BwZWQgCi1pY29uLCBvZiBjb3Vyc2UuICBXZSBtaWdodCBhbHNvIGtlZXAgdGhlIGljb24gZm9yIGFueSBydW5uaW5nCi1zZXJ2aWNlIHRoYXQgc3RvcHMgYWJydXB0bHkuICBCdXQgdGhlcmUgY291bGQgYmUgYSAnc2luZ2xlIAotaWNvbicgb3B0aW9uIGZvciB0aGUgdGFza2JhciBpY29uIG1vbml0b3IgdGhhdCBzYXlzIHNob3cgb25seQotYSBzaW5nbGUgc3RhdHVzIGljb24sIGZvciBzaW1wbGljaXR5IGlmIHRoZSBhZG1pbmlzdHJhdG9yIHJ1bnMKLW1hbnkgQXBhY2hlIHNlcnZpY2VzLgotCi1CdXQgSSB3YXMgaG9waW5nIHRoYXQgYW55IHJpZ2h0IGNsaWNrIHdvdWxkIHByb3ZpZGUgYSBtZW51Ci1vZiBhbGwgQXBhY2hlIHNlcnZpY2VzIHdpdGggdGhlaXIgc3RhdHVzLiAgZS5nLgotICBUZXN0IHNlcnZpY2UgaXMgc3RvcHBlZAotICBBcGFjaGVfMiBzZXJ2aWNlIGlzIHJ1bm5pbmcKLSAgTXlXZWIgc2VydmljZSBpcyBydW5uaW5nCi1hbmQgZWFjaCB3b3VsZCBkbyB0aGUgbG9naWNhbCBzdWJtZW51LCBzYW1lIGFzIGlmIHRoYXQKLXNwZWNpZmljIHRhc2tiYXIgaWNvbiB3ZXJlIGxlZnQgY2xpY2tlZCwgb2ZmZXJpbmcgdG8gc3RhcnQgb3IKLW9mZmVyaW5nIHRvIHN0b3Agb3IgcmVzdGFydCB0aGUgc2VydmVyLCBhcyBhcHByb3ByaWF0ZS4KLQotRmluYWxseSwgdG8gaWRlbnRpZnkgYWxsIGluc3RhbGxlZCBBcGFjaGUgc2VydmljZXMsIGp1c3QgcXVlcnkgCi10aGUgcmVnaXN0cnkga2V5IEhLTE1cU1lTVEVNXEN1cnJlbnRDb250cm9sU2V0XFNlcnZpY2VzIGZvciBhbnkgCi1rZXkgdGhhdCBoYXMgdGhlIEltYWdlUGF0aCB2YWx1ZSBvZiAiLi4uXEFwYWNoZS5leGUiLi4uIChxdW90ZXMKLWFyZSBzaWduaWZpY2FudCBoZXJlLCBpZiB0aGUgbGVhZGluZyBxdW90ZSBpcyBvbW1pdHRlZCB0aGUgCi1lbnRpcmUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgdGV4dCBcQXBhY2hlLmV4ZSAtIGJhc2VkIG9uIEFwYWNoZSdzIAotb3duIHNlcnZpY2UgaW5zdGFsbGVyIGluIGV2ZXJ5IHJlbGVhc2VkIHZlcnNpb24uKQpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9tcG10X29zMi8uY3ZzaWdub3JlIGIvc2VydmVyL21wbS9tcG10X29zMi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzUzYWM4Li4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vbXBtdF9vczIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotKi5sbwotKi5sYQotTWFrZWZpbGUKLS5kZXBzCi0ubGlicwpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9tcG10X29zMi9NYWtlZmlsZS5pbiBiL3NlcnZlci9tcG0vbXBtdF9vczIvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZTU5OGUuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9tcG10X29zMi9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCi1MVExJQlJBUllfTkFNRSAgICA9IGxpYm1wbXRfb3MyLmxhCi1MVExJQlJBUllfU09VUkNFUyA9IG1wbXRfb3MyLmMgbXBtdF9vczJfY2hpbGQuYwotCi1pbmNsdWRlICQodG9wX3NyY2RpcikvYnVpbGQvbHRsaWIubWsKZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vbXBtdF9vczIvY29uZmlnNS5tNCBiL3NlcnZlci9tcG0vbXBtdF9vczIvY29uZmlnNS5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI3YzI5Ni4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL21wbXRfb3MyL2NvbmZpZzUubTQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWlmIHRlc3QgIiRNUE1fTkFNRSIgPSAibXBtdF9vczIiIDsgdGhlbgotICAgIEFDX0NBQ0hFX1NBVkUKLSAgICBBUEFDSEVfRkFTVF9PVVRQVVQoc2VydmVyL21wbS8kTVBNX05BTUUvTWFrZWZpbGUpCi0gICAgQVBSX0FERFRPKENGTEFHUywtWm10KQotZmkKZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vbXBtdF9vczIvbXBtLmggYi9zZXJ2ZXIvbXBtL21wbXRfb3MyL21wbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2QyZjZjLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vbXBtdF9vczIvbXBtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotI2lmbmRlZiBBUEFDSEVfTVBNX01QTVRfT1MyX0gKLSNkZWZpbmUgQVBBQ0hFX01QTV9NUE1UX09TMl9ICi0KLSNkZWZpbmUgTVBNVF9PUzJfTVBNCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgIm1wbV9kZWZhdWx0LmgiCi0jaW5jbHVkZSAic2NvcmVib2FyZC5oIgotCi0jZGVmaW5lIE1QTV9OQU1FICJNUE1UX09TMiIKLQotZXh0ZXJuIHNlcnZlcl9yZWMgKmFwX3NlcnZlcl9jb25mOwotI2RlZmluZSBBUF9NUE1fV0FOVF9TRVRfUElERklMRQotI2RlZmluZSBBUF9NUE1fV0FOVF9TRVRfTUFYX1JFUVVFU1RTCi0KLSNlbmRpZiAvKiBBUEFDSEVfTVBNX1NQTVRfT1MyX0ggKi8KZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vbXBtdF9vczIvbXBtX2RlZmF1bHQuaCBiL3NlcnZlci9tcG0vbXBtdF9vczIvbXBtX2RlZmF1bHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAwYmViMi4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL21wbXRfb3MyL21wbV9kZWZhdWx0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBiYXNlZCB1cG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUKLSAqIG9yaWdpbmFsbHkgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsCi0gKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICovCi0KLSNpZm5kZWYgQVBBQ0hFX01QTV9ERUZBVUxUX0gKLSNkZWZpbmUgQVBBQ0hFX01QTV9ERUZBVUxUX0gKLQotLyogTnVtYmVyIG9mIHNlcnZlcnMgcHJvY2Vzc2VzIHRvIHNwYXduIG9mZiBieSBkZWZhdWx0Ci0gKi8KLSNpZm5kZWYgREVGQVVMVF9TVEFSVF9EQUVNT04KLSNkZWZpbmUgREVGQVVMVF9TVEFSVF9EQUVNT04gMgotI2VuZGlmCi0KLS8qIFdlIGRvbid0IG5lZWQgbWFueSBwcm9jZXNzZXMsIAotICogdGhleSdyZSBvbmx5IGZvciByZWR1bmRhbmN5IGluIHRoZSBldmVudCBvZiBhIGNyYXNoIAotICovCi0jZGVmaW5lIEhBUkRfU0VSVkVSX0xJTUlUIDEwCi0KLS8qIExpbWl0IG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgdGhyZWFkcyBwZXIgcHJvY2VzcwotICovCi0jaWZuZGVmIEhBUkRfVEhSRUFEX0xJTUlUCi0jZGVmaW5lIEhBUkRfVEhSRUFEX0xJTUlUIDI1NgotI2VuZGlmCi0KLS8qIE1heGltdW0gbnVtYmVyIG9mICpmcmVlKiBzZXJ2ZXIgdGhyZWFkcyAtLS0gbW9yZSB0aGFuIHRoaXMsIGFuZAotICogdGhleSB3aWxsIGRpZSBvZmYuCi0gKi8KLQotI2lmbmRlZiBERUZBVUxUX01BWF9TUEFSRV9USFJFQUQKLSNkZWZpbmUgREVGQVVMVF9NQVhfU1BBUkVfVEhSRUFEIDEwCi0jZW5kaWYKLQotLyogTWluaW11bSAtLS0gZmV3ZXIgdGhhbiB0aGlzLCBhbmQgbW9yZSB3aWxsIGJlIGNyZWF0ZWQgKi8KLQotI2lmbmRlZiBERUZBVUxUX01JTl9TUEFSRV9USFJFQUQKLSNkZWZpbmUgREVGQVVMVF9NSU5fU1BBUkVfVEhSRUFEIDUKLSNlbmRpZgotCi0vKiBXaGVyZSB0aGUgbWFpbi9wYXJlbnQgcHJvY2VzcydzIHBpZCBpcyBsb2dnZWQgKi8KLSNpZm5kZWYgREVGQVVMVF9QSURMT0cKLSNkZWZpbmUgREVGQVVMVF9QSURMT0cgImxvZ3MvaHR0cGQucGlkIgotI2VuZGlmCi0KLS8qCi0gKiBJbnRlcnZhbCwgaW4gbWljcm9zZWNvbmRzLCBiZXR3ZWVuIHNjb3JlYm9hcmQgbWFpbnRlbmFuY2UuCi0gKi8KLSNpZm5kZWYgU0NPUkVCT0FSRF9NQUlOVEVOQU5DRV9JTlRFUlZBTAotI2RlZmluZSBTQ09SRUJPQVJEX01BSU5URU5BTkNFX0lOVEVSVkFMIDEwMDAwMDAKLSNlbmRpZgotCi0vKiBOdW1iZXIgb2YgcmVxdWVzdHMgdG8gdHJ5IHRvIGhhbmRsZSBpbiBhIHNpbmdsZSBwcm9jZXNzLiAgSWYgPD0gMCwKLSAqIHRoZSBjaGlsZHJlbiBkb24ndCBkaWUgb2ZmLgotICovCi0jaWZuZGVmIERFRkFVTFRfTUFYX1JFUVVFU1RTX1BFUl9DSElMRAotI2RlZmluZSBERUZBVUxUX01BWF9SRVFVRVNUU19QRVJfQ0hJTEQgMTAwMDAKLSNlbmRpZgotCi0vKiBBUF9DSElMRF9USFJFQURfRlJPTV9JRCBpcyB1c2VkIGJ5IHRoZSBzY29yZWJvYXJkLiAgKi8KLSNkZWZpbmUgQVBfQ0hJTERfVEhSRUFEX0ZST01fSUQoaSkgICAgKGkgLyBIQVJEX1RIUkVBRF9MSU1JVCksIChpICUgSEFSRF9USFJFQURfTElNSVQpCi0jZGVmaW5lIEFQX0lEX0ZST01fQ0hJTERfVEhSRUFEKGMsIHQpICAgICgoYyAqIEhBUkRfVEhSRUFEX0xJTUlUKSArIHQpCi0KLSNlbmRpZiAvKiBBUF9NUE1fREVGQVVMVF9IICovCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL21wbXRfb3MyL21wbXRfb3MyLmMgYi9zZXJ2ZXIvbXBtL21wbXRfb3MyL21wbXRfb3MyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ODA2ZDEuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9tcG10X29zMi9tcG10X29zMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTg3ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCi0gKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAotICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqLwotCi0vKiBNdWx0aS1wcm9jZXNzLCBtdWx0aS10aHJlYWRlZCBNUE0gZm9yIE9TLzIKLSAqCi0gKiBTZXJ2ZXIgY29uc2lzdHMgb2YKLSAqIC0gYSBtYWluLCBwYXJlbnQgcHJvY2VzcwotICogLSBhIHNtYWxsLCBzdGF0aWMgbnVtYmVyIG9mIGNoaWxkIHByb2Nlc3NlcwotICoKLSAqIFRoZSBwYXJlbnQgcHJvY2VzcydzIGpvYiBpcyB0byBtYW5hZ2UgdGhlIGNoaWxkIHByb2Nlc3Nlcy4gVGhpcyBpbnZvbHZlcwotICogc3Bhd25pbmcgY2hpbGRyZW4gYXMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoZXJlIGFyZSBhbHdheXMgYXBfZGFlbW9uc190b19zdGFydAotICogcHJvY2Vzc2VzIGFjY2VwdGluZyBjb25uZWN0aW9ucy4KLSAqCi0gKiBFYWNoIGNoaWxkIHByb2Nlc3MgY29uc2lzdHMgb2YgYSBhIHBvb2wgb2Ygd29ya2VyIHRocmVhZHMgYW5kIGEKLSAqIG1haW4gdGhyZWFkIHRoYXQgYWNjZXB0cyBjb25uZWN0aW9ucyAmIHBhc3NlcyB0aGVtIHRvIHRoZSB3b3JrZXJzIHZpYQotICogYSB3b3JrIHF1ZXVlLiBUaGUgd29ya2VyIHRocmVhZCBwb29sIGlzIGR5bmFtaWMsIG1hbmFnZWQgYnkgYSBtYWludGFuZW5jZQotICogdGhyZWFkIHNvIHRoYXQgdGhlIG51bWJlciBvZiBpZGxlIHRocmVhZHMgaXMga2VwdCBiZXR3ZWVuCi0gKiBtaW5fc3BhcmVfdGhyZWFkcyAmIG1heF9zcGFyZV90aHJlYWRzLgotICoKLSAqLwotCi0vKgotIFRvZG8gbGlzdAotIC0gRml4IGxvZyBmaWxlIGNsYXNoaW5nIGJldHdlZW4gY2hpbGQgcHJvY2Vzc2VzCi0gLSBFbmZvcmNlIE1heENsaWVudHMgc29tZWhvdwotIC0gQ2F0Y2ggdGhyZWFkIGV4Y2VwdGlvbnMgJiBpbml0aWF0ZSBncmFjZWZ1bCBzaHV0ZG93biBvZiBjaGlsZCBwcm9jZXNzCi0qLwotI2RlZmluZSBDT1JFX1BSSVZBVEUKLSNkZWZpbmUgSU5DTF9OT1BNQVBJCi0jZGVmaW5lIElOQ0xfRE9TCi0jZGVmaW5lIElOQ0xfRE9TRVJST1JTCi0KLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgIm1wbV9kZWZhdWx0LmgiCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgkJLyogZm9yIGdldF9yZW1vdGVfaG9zdCAqLwotI2luY2x1ZGUgImh0dHBfY29ubmVjdGlvbi5oIgotI2luY2x1ZGUgIm1wbS5oIgotI2luY2x1ZGUgImFwX21wbS5oIgotI2luY2x1ZGUgImFwX2xpc3Rlbi5oIgotI2luY2x1ZGUgImFwcl9wb3J0YWJsZS5oIgotI2luY2x1ZGUgIm1wbV9jb21tb24uaCIKLSNpbmNsdWRlICJhcHJfc3RyaW5ncy5oIgotI2luY2x1ZGUgPG9zMi5oPgotI2luY2x1ZGUgPHByb2Nlc3MuaD4KLQotc2VydmVyX3JlYyAqYXBfc2VydmVyX2NvbmY7Ci1zdGF0aWMgYXByX3Bvb2xfdCAqcGNvbmYgPSBOVUxMOwkJLyogUG9vbCBmb3IgY29uZmlnIHN0dWZmICovCi1zdGF0aWMgY29uc3QgY2hhciAqYXBfcGlkX2ZuYW1lPU5VTEw7Ci0KLS8qIENvbmZpZyBnbG9iYWxzICovCi1zdGF0aWMgaW50IG9uZV9wcm9jZXNzID0gMDsKLXN0YXRpYyBpbnQgYXBfZGFlbW9uc190b19zdGFydCA9IDA7Ci1zdGF0aWMgaW50IGFwX3RocmVhZF9saW1pdCA9IDA7Ci1zdGF0aWMgaW50IGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQgPSAwOwotaW50IGFwX21pbl9zcGFyZV90aHJlYWRzID0gMDsKLWludCBhcF9tYXhfc3BhcmVfdGhyZWFkcyA9IDA7Ci0KLS8qIEtlZXAgdHJhY2sgb2YgYSBmZXcgaW50ZXJlc3Rpbmcgc3RhdGlzdGljcyAqLwotaW50IGFwX21heF9kYWVtb25zX2xpbWl0ID0gLTE7Ci0KLS8qIHZvbGF0aWxlIGp1c3QgaW4gY2FzZSAqLwotc3RhdGljIGludCB2b2xhdGlsZSBzaHV0ZG93bl9wZW5kaW5nOwotc3RhdGljIGludCB2b2xhdGlsZSByZXN0YXJ0X3BlbmRpbmc7Ci1zdGF0aWMgaW50IHZvbGF0aWxlIGlzX2dyYWNlZnVsID0gMDsKLWFwX2dlbmVyYXRpb25fdCB2b2xhdGlsZSBhcF9teV9nZW5lcmF0aW9uPTA7IC8qIFVzZWQgYnkgdGhlIHNjb3JlYm9hcmQgKi8KLXN0YXRpYyBpbnQgaXNfcGFyZW50X3Byb2Nlc3M9VFJVRTsKLUhNVFggYXBfbXBtX2FjY2VwdF9tdXRleCA9IDA7Ci0KLS8qIEFuIGFycmF5IG9mIHRoZXNlIGlzIHN0b3JlZCBpbiBhIHNoYXJlZCBtZW1vcnkgYXJlYSBmb3IgcGFzc2luZwotICogc29ja2V0cyBmcm9tIHRoZSBwYXJlbnQgdG8gY2hpbGQgcHJvY2Vzc2VzCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbmFtZTsKLSAgICBhcHJfb3Nfc29ja190IGxpc3Rlbl9mZDsKLX0gbGlzdGVuX3NvY2tldF90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgYXByX29zX2ZpbGVfdCBlcnJvcmxvZ19mZDsKLSAgICBhcHJfdGltZV90IHJlc3RhcnRfdGltZTsKLSAgICBITVRYIGFjY2VwdF9tdXRleDsKLSAgICBsaXN0ZW5fc29ja2V0X3QgbGlzdGVuZXJzWzFdOwotfSBwYXJlbnRfaW5mb190OwotCi1zdGF0aWMgY2hhciBtYXN0ZXJfbWFpbigpOwotc3RhdGljIHZvaWQgc3Bhd25fY2hpbGQoaW50IHNsb3QpOwotdm9pZCBhcF9tcG1fY2hpbGRfbWFpbihhcHJfcG9vbF90ICpwY29uZik7Ci1zdGF0aWMgdm9pZCBzZXRfc2lnbmFscygpOwotCi0KLWludCBhcF9tcG1fcnVuKGFwcl9wb29sX3QgKl9wY29uZiwgYXByX3Bvb2xfdCAqcGxvZywgc2VydmVyX3JlYyAqcyApCi17Ci0gICAgY2hhciAqbGlzdGVuZXJfc2htX25hbWU7Ci0gICAgcGFyZW50X2luZm9fdCAqcGFyZW50X2luZm87Ci0gICAgVUxPTkcgcmM7Ci0gICAgcGNvbmYgPSBfcGNvbmY7Ci0gICAgYXBfc2VydmVyX2NvbmYgPSBzOwotICAgIHJlc3RhcnRfcGVuZGluZyA9IDA7Ci0KLSAgICBEb3NTZXRNYXhGSChhcF90aHJlYWRfbGltaXQgKiAyKTsKLSAgICBsaXN0ZW5lcl9zaG1fbmFtZSA9IGFwcl9wc3ByaW50ZihwY29uZiwgIi9zaGFyZW1lbS9odHRwZC9wYXJlbnRfaW5mby4lZCIsIGdldHBwaWQoKSk7Ci0gICAgcmMgPSBEb3NHZXROYW1lZFNoYXJlZE1lbSgoUFBWT0lEKSZwYXJlbnRfaW5mbywgbGlzdGVuZXJfc2htX25hbWUsIFBBR19SRUFEKTsKLSAgICBpc19wYXJlbnRfcHJvY2VzcyA9IHJjICE9IDA7Ci0gICAgYXBfc2NvcmVib2FyZF9mbmFtZSA9IGFwcl9wc3ByaW50ZihwY29uZiwgIi9zaGFyZW1lbS9odHRwZC9zY29yZWJvYXJkLiVkIiwgaXNfcGFyZW50X3Byb2Nlc3MgPyBnZXRwaWQoKSA6IGdldHBwaWQoKSk7Ci0KLSAgICBpZiAocmMgPT0gMCkgewotICAgICAgICAvKiBDaGlsZCBwcm9jZXNzICovCi0gICAgICAgIGFwX2xpc3Rlbl9yZWMgKmxyOwotICAgICAgICBpbnQgbnVtX2xpc3RlbmVycyA9IDA7Ci0KLSAgICAgICAgYXByX2ZpbGVfY2xvc2UoYXBfc2VydmVyX2NvbmYtPmVycm9yX2xvZyk7Ci0gICAgICAgIGFwcl9vc19maWxlX3B1dCgmYXBfc2VydmVyX2NvbmYtPmVycm9yX2xvZywgJnBhcmVudF9pbmZvLT5lcnJvcmxvZ19mZCwgcGNvbmYpOwotICAgICAgICBhcF9yZXN0YXJ0X3RpbWUgPSBwYXJlbnRfaW5mby0+cmVzdGFydF90aW1lOwotICAgICAgICBhcF9tcG1fYWNjZXB0X211dGV4ID0gcGFyZW50X2luZm8tPmFjY2VwdF9tdXRleDsKLQotICAgICAgICAvKiBTZXQgdXAgYSBkZWZhdWx0IGxpc3RlbmVyIGlmIG5lY2Vzc2FyeSAqLwotICAgICAgICBpZiAoYXBfbGlzdGVuZXJzID09IE5VTEwpIHsKLSAgICAgICAgICAgIGFwX2xpc3Rlbl9yZWMgKmxyID0gYXByX3BjYWxsb2Mocy0+cHJvY2Vzcy0+cG9vbCwgc2l6ZW9mKGFwX2xpc3Rlbl9yZWMpKTsKLSAgICAgICAgICAgIGFwX2xpc3RlbmVycyA9IGxyOwotICAgICAgICAgICAgYXByX3NvY2thZGRyX2luZm9fZ2V0KCZsci0+YmluZF9hZGRyLCAiMC4wLjAuMCIsIEFQUl9VTlNQRUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9IVFRQX1BPUlQsIDAsIHMtPnByb2Nlc3MtPnBvb2wpOwotICAgICAgICAgICAgYXByX3NvY2tldF9jcmVhdGUoJmxyLT5zZCwgbHItPmJpbmRfYWRkci0+c2Euc2luLnNpbl9mYW1pbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0NLX1NUUkVBTSwgcy0+cHJvY2Vzcy0+cG9vbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGxyID0gYXBfbGlzdGVuZXJzOyBscjsgbHIgPSBsci0+bmV4dCkgewotICAgICAgICAgICAgYXByX29zX3NvY2tfcHV0KCZsci0+c2QsICZwYXJlbnRfaW5mby0+bGlzdGVuZXJzW251bV9saXN0ZW5lcnNdLmxpc3Rlbl9mZCwgcGNvbmYpOwotICAgICAgICAgICAgbnVtX2xpc3RlbmVycysrOwotICAgICAgICB9Ci0KLSAgICAgICAgRG9zRnJlZU1lbShwYXJlbnRfaW5mbyk7Ci0KLSAgICAgICAgLyogRG8gdGhlIHdvcmsgKi8KLSAgICAgICAgYXBfbXBtX2NoaWxkX21haW4ocGNvbmYpOwotCi0gICAgICAgIC8qIE91dHRhIGhlcmUgKi8KLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAvKiBQYXJlbnQgcHJvY2VzcyAqLwotICAgICAgICBjaGFyIHJlc3RhcnQ7Ci0gICAgICAgIGlzX3BhcmVudF9wcm9jZXNzID0gVFJVRTsKLSAgICAgICAgYXBfbG9nX3BpZChwY29uZiwgYXBfcGlkX2ZuYW1lKTsKLQotICAgICAgICBpZiAoYXBfc2V0dXBfbGlzdGVuZXJzKGFwX3NlcnZlcl9jb25mKSA8IDEpIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0FMRVJULCAwLCBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICJubyBsaXN0ZW5pbmcgc29ja2V0cyBhdmFpbGFibGUsIHNodXR0aW5nIGRvd24iKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdGFydCA9IG1hc3Rlcl9tYWluKCk7Ci0gICAgICAgICsrYXBfbXlfZ2VuZXJhdGlvbjsKLSAgICAgICAgYXBfc2NvcmVib2FyZF9pbWFnZS0+Z2xvYmFsLnJ1bm5pbmdfZ2VuZXJhdGlvbiA9IGFwX215X2dlbmVyYXRpb247Ci0KLSAgICAgICAgaWYgKCFyZXN0YXJ0KSB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpwaWRmaWxlID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocGNvbmYsIGFwX3BpZF9mbmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChwaWRmaWxlICE9IE5VTEwgJiYgcmVtb3ZlKHBpZGZpbGUpID09IDApIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19JTkZPLCBBUFJfU1VDQ0VTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfc2VydmVyX2NvbmYsICJyZW1vdmVkIFBJRCBmaWxlICVzIChwaWQ9JWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkZmlsZSwgZ2V0cGlkKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19OT1RJQ0UsIDAsIGFwX3NlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICJjYXVnaHQgU0lHVEVSTSwgc2h1dHRpbmcgZG93biIpOwotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICB9ICAvKiBQYXJlbnQgcHJvY2VzcyAqLwotCi0gICAgcmV0dXJuIDA7IC8qIFJlc3RhcnQgKi8KLX0KLQotCi0KLS8qIE1haW4gcHJvY2Vzc2luZyBvZiB0aGUgcGFyZW50IHByb2Nlc3MKLSAqIHJldHVybnMgVFJVRSBpZiByZXN0YXJ0aW5nCi0gKi8KLXN0YXRpYyBjaGFyIG1hc3Rlcl9tYWluKCkKLXsKLSAgICBzZXJ2ZXJfcmVjICpzID0gYXBfc2VydmVyX2NvbmY7Ci0gICAgYXBfbGlzdGVuX3JlYyAqbHI7Ci0gICAgcGFyZW50X2luZm9fdCAqcGFyZW50X2luZm87Ci0gICAgY2hhciAqbGlzdGVuZXJfc2htX25hbWU7Ci0gICAgaW50IGxpc3RlbmVyX251bSwgbnVtX2xpc3RlbmVycywgc2xvdDsKLSAgICBVTE9ORyByYzsKLQotICAgIHByaW50ZigiJXMgXG4iLCBhcF9nZXRfc2VydmVyX3ZlcnNpb24oKSk7Ci0gICAgc2V0X3NpZ25hbHMoKTsKLQotICAgIGlmIChhcF9zZXR1cF9saXN0ZW5lcnMoYXBfc2VydmVyX2NvbmYpIDwgMSkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19BTEVSVCwgMCwgcywKLSAgICAgICAgICAgICAgICAgICAgICJubyBsaXN0ZW5pbmcgc29ja2V0cyBhdmFpbGFibGUsIHNodXR0aW5nIGRvd24iKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlIGEgc2hhcmVkIG1lbW9yeSBibG9jayBmb3IgdGhlIGFycmF5IG9mIGxpc3RlbmVycyAqLwotICAgIGZvciAobnVtX2xpc3RlbmVycyA9IDAsIGxyID0gYXBfbGlzdGVuZXJzOyBscjsgbHIgPSBsci0+bmV4dCkgewotICAgICAgICBudW1fbGlzdGVuZXJzKys7Ci0gICAgfQotCi0gICAgbGlzdGVuZXJfc2htX25hbWUgPSBhcHJfcHNwcmludGYocGNvbmYsICIvc2hhcmVtZW0vaHR0cGQvcGFyZW50X2luZm8uJWQiLCBnZXRwaWQoKSk7Ci0gICAgcmMgPSBEb3NBbGxvY1NoYXJlZE1lbSgoUFBWT0lEKSZwYXJlbnRfaW5mbywgbGlzdGVuZXJfc2htX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocGFyZW50X2luZm9fdCkgKyBudW1fbGlzdGVuZXJzICogc2l6ZW9mKGxpc3Rlbl9zb2NrZXRfdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdfUkVBRHxQQUdfV1JJVEV8UEFHX0NPTU1JVCk7Ci0KLSAgICBpZiAocmMpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0FMRVJULCBBUFJfRlJPTV9PU19FUlJPUihyYyksIHMsCi0gICAgICAgICAgICAgICAgICAgICAiZmFpbHVyZSBhbGxvY2F0aW5nIHNoYXJlZCBtZW1vcnksIHNodXR0aW5nIGRvd24iKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIC8qIFN0b3JlIHRoZSBsaXN0ZW5lciBzb2NrZXRzIGluIHRoZSBzaGFyZWQgbWVtb3J5IGFyZWEgZm9yIG91ciBjaGlsZHJlbiB0byBzZWUgKi8KLSAgICBmb3IgKGxpc3RlbmVyX251bSA9IDAsIGxyID0gYXBfbGlzdGVuZXJzOyBscjsgbHIgPSBsci0+bmV4dCwgbGlzdGVuZXJfbnVtKyspIHsKLSAgICAgICAgYXByX29zX3NvY2tfZ2V0KCZwYXJlbnRfaW5mby0+bGlzdGVuZXJzW2xpc3RlbmVyX251bV0ubGlzdGVuX2ZkLCBsci0+c2QpOwotICAgIH0KLQotICAgIC8qIENyZWF0ZSBtdXRleCB0byBwcmV2ZW50IG11bHRpcGxlIGNoaWxkIHByb2Nlc3NlcyBmcm9tIGRldGVjdGluZwotICAgICAqIGEgY29ubmVjdGlvbiB3aXRoIGFwcl9wb2xsKCkKLSAgICAgKi8KLQotICAgIHJjID0gRG9zQ3JlYXRlTXV0ZXhTZW0oTlVMTCwgJmFwX21wbV9hY2NlcHRfbXV0ZXgsIERDX1NFTV9TSEFSRUQsIEZBTFNFKTsKLQotICAgIGlmIChyYykgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlQsIEFQUl9GUk9NX09TX0VSUk9SKHJjKSwgcywKLSAgICAgICAgICAgICAgICAgICAgICJmYWlsdXJlIGNyZWF0aW5nIGFjY2VwdCBtdXRleCwgc2h1dHRpbmcgZG93biIpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgYXBfcmVzdGFydF90aW1lID0gYXByX3RpbWVfbm93KCk7Ci0gICAgcGFyZW50X2luZm8tPnJlc3RhcnRfdGltZSA9IGFwX3Jlc3RhcnRfdGltZTsKLSAgICBwYXJlbnRfaW5mby0+YWNjZXB0X211dGV4ID0gYXBfbXBtX2FjY2VwdF9tdXRleDsKLSAgICBhcHJfb3NfZmlsZV9nZXQoJnBhcmVudF9pbmZvLT5lcnJvcmxvZ19mZCwgcy0+ZXJyb3JfbG9nKTsKLQotICAgIC8qIEFsbG9jYXRlIHNoYXJlZCBtZW1vcnkgZm9yIHNjb3JlYm9hcmQgKi8KLSAgICBpZiAoYXBfc2NvcmVib2FyZF9pbWFnZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJjID0gRG9zQWxsb2NTaGFyZWRNZW0oKFBQVk9JRCkmYXBfc2NvcmVib2FyZF9pbWFnZSwgYXBfc2NvcmVib2FyZF9mbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2NvcmVib2FyZCksIFBBR19DT01NSVR8UEFHX1JFQUR8UEFHX1dSSVRFKTsKLQotICAgICAgICBpZiAocmMpIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIEFQUl9GUk9NX09TX0VSUk9SKHJjKSwgYXBfc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgInVuYWJsZSB0byBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5IGZvciBzY29yZWJvYXJkICwgZXhpdGluZyIpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgbWVtc2V0KGFwX3Njb3JlYm9hcmRfaW1hZ2UsIDAsIHNpemVvZihzY29yZWJvYXJkKSk7Ci0gICAgfQotCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCAwLCBhcF9zZXJ2ZXJfY29uZiwKLQkJIiVzIGNvbmZpZ3VyZWQgLS0gcmVzdW1pbmcgbm9ybWFsIG9wZXJhdGlvbnMiLAotCQlhcF9nZXRfc2VydmVyX3ZlcnNpb24oKSk7Ci0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgMCwgYXBfc2VydmVyX2NvbmYsCi0JCSJTZXJ2ZXIgYnVpbHQ6ICVzIiwgYXBfZ2V0X3NlcnZlcl9idWlsdCgpKTsKLQotICAgIGlmIChvbmVfcHJvY2VzcykgewotICAgICAgICBhcF9zY29yZWJvYXJkX2ltYWdlLT5wYXJlbnRbMF0ucGlkID0gZ2V0cGlkKCk7Ci0gICAgICAgIGFwX21wbV9jaGlsZF9tYWluKHBjb25mKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHdoaWxlICghcmVzdGFydF9wZW5kaW5nICYmICFzaHV0ZG93bl9wZW5kaW5nKSB7Ci0gICAgICAgIFJFU1VMVENPREVTIHByb2NfcmM7Ci0gICAgICAgIFBJRCBjaGlsZF9waWQ7Ci0gICAgICAgIGludCBhY3RpdmVfY2hpbGRyZW4gPSAwOwotCi0gICAgICAgIC8qIENvdW50IG51bWJlciBvZiBhY3RpdmUgY2hpbGRyZW4gKi8KLSAgICAgICAgZm9yIChzbG90PTA7IHNsb3QgPCBIQVJEX1NFUlZFUl9MSU1JVDsgc2xvdCsrKSB7Ci0gICAgICAgICAgICBhY3RpdmVfY2hpbGRyZW4gKz0gYXBfc2NvcmVib2FyZF9pbWFnZS0+cGFyZW50W3Nsb3RdLnBpZCAhPSAwICYmCi0gICAgICAgICAgICAgICAgIWFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtzbG90XS5xdWllc2Npbmc7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBTcGF3biBjaGlsZHJlbiBpZiBuZWVkZWQgKi8KLSAgICAgICAgZm9yIChzbG90PTA7IHNsb3QgPCBIQVJEX1NFUlZFUl9MSU1JVCAmJiBhY3RpdmVfY2hpbGRyZW4gPCBhcF9kYWVtb25zX3RvX3N0YXJ0OyBzbG90KyspIHsKLSAgICAgICAgICAgIGlmIChhcF9zY29yZWJvYXJkX2ltYWdlLT5wYXJlbnRbc2xvdF0ucGlkID09IDApIHsKLSAgICAgICAgICAgICAgICBzcGF3bl9jaGlsZChzbG90KTsKLSAgICAgICAgICAgICAgICBhY3RpdmVfY2hpbGRyZW4rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJjID0gRG9zV2FpdENoaWxkKERDV0FfUFJPQ0VTU1RSRUUsIERDV1dfTk9XQUlULCAmcHJvY19yYywgJmNoaWxkX3BpZCwgMCk7Ci0KLSAgICAgICAgaWYgKHJjID09IDApIHsKLSAgICAgICAgICAgIC8qIEEgY2hpbGQgaGFzIHRlcm1pbmF0ZWQsIHJlbW92ZSBpdHMgc2NvcmVib2FyZCBlbnRyeSAmIHRlcm1pbmF0ZSBpZiBuZWNlc3NhcnkgKi8KLSAgICAgICAgICAgIGZvciAoc2xvdD0wOyBhcF9zY29yZWJvYXJkX2ltYWdlLT5wYXJlbnRbc2xvdF0ucGlkICE9IGNoaWxkX3BpZCAmJiBzbG90IDwgSEFSRF9TRVJWRVJfTElNSVQ7IHNsb3QrKyk7Ci0KLSAgICAgICAgICAgIGlmIChzbG90IDwgSEFSRF9TRVJWRVJfTElNSVQpIHsKLSAgICAgICAgICAgICAgICBhcF9zY29yZWJvYXJkX2ltYWdlLT5wYXJlbnRbc2xvdF0ucGlkID0gMDsKLSAgICAgICAgICAgICAgICBhcF9zY29yZWJvYXJkX2ltYWdlLT5wYXJlbnRbc2xvdF0ucXVpZXNjaW5nID0gMDsKLQotICAgICAgICAgICAgICAgIGlmIChwcm9jX3JjLmNvZGVUZXJtaW5hdGUgPT0gVENfRVhJVCkgewotICAgICAgICAgICAgICAgICAgICAvKiBDaGlsZCB0ZXJtaW5hdGVkIG5vcm1hbGx5LCBjaGVjayBpdHMgZXhpdCBjb2RlIGFuZAotICAgICAgICAgICAgICAgICAgICAgKiB0ZXJtaW5hdGUgc2VydmVyIGlmIGNoaWxkIGluZGljYXRlcyBhIGZhdGFsIGVycm9yCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpZiAocHJvY19yYy5jb2RlUmVzdWx0ID09IEFQRVhJVF9DSElMREZBVEFMKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHJjID09IEVSUk9SX0NISUxEX05PVF9DT01QTEVURSkgewotICAgICAgICAgICAgLyogTm8gY2hpbGQgZXhpdGVkLCBsZXRzIHNsZWVwIGZvciBhIHdoaWxlLi4uLiAqLwotICAgICAgICAgICAgYXByX3NsZWVwKFNDT1JFQk9BUkRfTUFJTlRFTkFOQ0VfSU5URVJWQUwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogU2lnbmFsIGNoaWxkcmVuIHRvIHNodXQgZG93biwgZWl0aGVyIGdyYWNlZnVsbHkgb3IgaW1tZWRpYXRlbHkgKi8KLSAgICBmb3IgKHNsb3Q9MDsgc2xvdDxIQVJEX1NFUlZFUl9MSU1JVDsgc2xvdCsrKSB7Ci0gICAgICBraWxsKGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtzbG90XS5waWQsIGlzX2dyYWNlZnVsID8gU0lHSFVQIDogU0lHVEVSTSk7Ci0gICAgfQotCi0gICAgRG9zRnJlZU1lbShwYXJlbnRfaW5mbyk7Ci0gICAgcmV0dXJuIHJlc3RhcnRfcGVuZGluZzsKLX0KLQotCi0KLXN0YXRpYyB2b2lkIHNwYXduX2NoaWxkKGludCBzbG90KQotewotICAgIFBQSUIgcHBpYjsKLSAgICBQVElCIHB0aWI7Ci0gICAgY2hhciBmYWlsX21vZHVsZVsxMDBdOwotICAgIGNoYXIgcHJvZ25hbWVbQ0NITUFYUEFUSF07Ci0gICAgUkVTVUxUQ09ERVMgcHJvY19yYzsKLSAgICBVTE9ORyByYzsKLQotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtzbG90XS5nZW5lcmF0aW9uID0gYXBfbXlfZ2VuZXJhdGlvbjsKLSAgICBEb3NHZXRJbmZvQmxvY2tzKCZwdGliLCAmcHBpYik7Ci0gICAgRG9zUXVlcnlNb2R1bGVOYW1lKHBwaWItPnBpYl9obXRlLCBzaXplb2YocHJvZ25hbWUpLCBwcm9nbmFtZSk7Ci0gICAgcmMgPSBEb3NFeGVjUGdtKGZhaWxfbW9kdWxlLCBzaXplb2YoZmFpbF9tb2R1bGUpLCBFWEVDX0FTWU5DUkVTVUxULAotICAgICAgICAgICAgICAgICAgICBwcGliLT5waWJfcGNoY21kLCBOVUxMLCAmcHJvY19yYywgcHJvZ25hbWUpOwotCi0gICAgaWYgKHJjKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIEFQUl9GUk9NX09TX0VSUk9SKHJjKSwgYXBfc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAiZXJyb3Igc3Bhd25pbmcgY2hpbGQsIHNsb3QgJWQiLCBzbG90KTsKLSAgICB9Ci0KLSAgICBpZiAoYXBfbWF4X2RhZW1vbnNfbGltaXQgPCBzbG90KSB7Ci0gICAgICAgIGFwX21heF9kYWVtb25zX2xpbWl0ID0gc2xvdDsKLSAgICB9Ci0KLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlLT5wYXJlbnRbc2xvdF0ucGlkID0gcHJvY19yYy5jb2RlVGVybWluYXRlOwotfQotCi0KLQotLyogU2lnbmFsIGhhbmRsaW5nIHJvdXRpbmVzICovCi0KLXN0YXRpYyB2b2lkIHNpZ190ZXJtKGludCBzaWcpCi17Ci0gICAgc2h1dGRvd25fcGVuZGluZyA9IDE7Ci19Ci0KLQotCi1zdGF0aWMgdm9pZCBzaWdfcmVzdGFydChpbnQgc2lnKQotewotICAgIGlmIChzaWcgPT0gU0lHVVNSMSkgewotICAgICAgICBpc19ncmFjZWZ1bCA9IDE7Ci0gICAgfQotCi0gICAgcmVzdGFydF9wZW5kaW5nID0gMTsKLX0KLQotCi0KLXN0YXRpYyB2b2lkIHNldF9zaWduYWxzKCkKLXsKLSAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhOwotCi0gICAgc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOwotICAgIHNhLnNhX2ZsYWdzID0gMDsKLSAgICBzYS5zYV9oYW5kbGVyID0gc2lnX3Rlcm07Ci0KLSAgICBpZiAoc2lnYWN0aW9uKFNJR1RFUk0sICZzYSwgTlVMTCkgPCAwKQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgYXBfc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHVEVSTSkiKTsKLQotICAgIGlmIChzaWdhY3Rpb24oU0lHSU5ULCAmc2EsIE5VTEwpIDwgMCkKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBhcF9zZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdJTlQpIik7Ci0KLSAgICBzYS5zYV9oYW5kbGVyID0gc2lnX3Jlc3RhcnQ7Ci0KLSAgICBpZiAoc2lnYWN0aW9uKFNJR0hVUCwgJnNhLCBOVUxMKSA8IDApCi0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgYXBfc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHSFVQKSIpOwotICAgIGlmIChzaWdhY3Rpb24oU0lHVVNSMSwgJnNhLCBOVUxMKSA8IDApCi0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgYXBfc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHVVNSMSkiKTsKLX0KLQotCi0KLS8qIEVucXVpcnkgZnVuY3Rpb25zIHVzZWQgZ2V0IE1QTSBzdGF0dXMgaW5mbyAqLwotCi1BUF9ERUNMQVJFKGFwcl9zdGF0dXNfdCkgYXBfbXBtX3F1ZXJ5KGludCBxdWVyeV9jb2RlLCBpbnQgKnJlc3VsdCkKLXsKLSAgICBzd2l0Y2ggKHF1ZXJ5X2NvZGUpIHsKLSAgICAgICAgY2FzZSBBUF9NUE1RX01BWF9EQUVNT05fVVNFRDoKLSAgICAgICAgICAgICpyZXN1bHQgPSBhcF9tYXhfZGFlbW9uc19saW1pdDsKLSAgICAgICAgICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLSAgICAgICAgY2FzZSBBUF9NUE1RX0lTX1RIUkVBREVEOgotICAgICAgICAgICAgKnJlc3VsdCA9IEFQX01QTVFfRFlOQU1JQzsKLSAgICAgICAgICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLSAgICAgICAgY2FzZSBBUF9NUE1RX0lTX0ZPUktFRDoKLSAgICAgICAgICAgICpyZXN1bHQgPSBBUF9NUE1RX05PVF9TVVBQT1JURUQ7Ci0gICAgICAgICAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci0gICAgICAgIGNhc2UgQVBfTVBNUV9IQVJEX0xJTUlUX0RBRU1PTlM6Ci0gICAgICAgICAgICAqcmVzdWx0ID0gSEFSRF9TRVJWRVJfTElNSVQ7Ci0gICAgICAgICAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci0gICAgICAgIGNhc2UgQVBfTVBNUV9IQVJEX0xJTUlUX1RIUkVBRFM6Ci0gICAgICAgICAgICAqcmVzdWx0ID0gSEFSRF9USFJFQURfTElNSVQ7Ci0gICAgICAgICAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci0gICAgICAgIGNhc2UgQVBfTVBNUV9NSU5fU1BBUkVfREVBTU9OUzoKLSAgICAgICAgICAgICpyZXN1bHQgPSAwOwotICAgICAgICAgICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotICAgICAgICBjYXNlIEFQX01QTVFfTUFYX1NQQVJFX0RBRU1PTlM6Ci0gICAgICAgICAgICAqcmVzdWx0ID0gMDsKLSAgICAgICAgICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLSAgICAgICAgY2FzZSBBUF9NUE1RX01BWF9SRVFVRVNUU19ERUFNT046Ci0gICAgICAgICAgICAqcmVzdWx0ID0gYXBfbWF4X3JlcXVlc3RzX3Blcl9jaGlsZDsKLSAgICAgICAgICAgIHJldHVybiBBUFJfU1VDQ0VTUzsgCi0gICAgfQotICAgIHJldHVybiBBUFJfRU5PVElNUEw7Ci19IAotCi0KLQotaW50IGFwX2dyYWNlZnVsX3N0b3Bfc2lnbmFsbGVkKHZvaWQpCi17Ci0gICAgcmV0dXJuIGlzX2dyYWNlZnVsOwotfQotCi0KLQotLyogQ29uZmlndXJhdGlvbiBoYW5kbGluZyBzdHVmZiAqLwotCi1zdGF0aWMgdm9pZCBtcG10X29zMl9wcmVfY29uZmlnKGFwcl9wb29sX3QgKnBjb25mLCBhcHJfcG9vbF90ICpwbG9nLCBhcHJfcG9vbF90ICpwdGVtcCkKLXsKLSAgICBvbmVfcHJvY2VzcyA9ICEhYXBfZXhpc3RzX2NvbmZpZ19kZWZpbmUoIk9ORV9QUk9DRVNTIik7Ci0gICAgaXNfZ3JhY2VmdWwgPSAwOwotICAgIGFwX2xpc3Rlbl9wcmVfY29uZmlnKCk7Ci0gICAgYXBfZGFlbW9uc190b19zdGFydCA9IERFRkFVTFRfU1RBUlRfREFFTU9OOwotICAgIGFwX3RocmVhZF9saW1pdCA9IEhBUkRfVEhSRUFEX0xJTUlUOwotICAgIGFwX3BpZF9mbmFtZSA9IERFRkFVTFRfUElETE9HOwotICAgIGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQgPSBERUZBVUxUX01BWF9SRVFVRVNUU19QRVJfQ0hJTEQ7Ci0gICAgYXBfZXh0ZW5kZWRfc3RhdHVzID0gMDsKLSAgICBhcF9taW5fc3BhcmVfdGhyZWFkcyA9IERFRkFVTFRfTUlOX1NQQVJFX1RIUkVBRDsKLSAgICBhcF9tYXhfc3BhcmVfdGhyZWFkcyA9IERFRkFVTFRfTUFYX1NQQVJFX1RIUkVBRDsKLX0KLQotCi0KLXN0YXRpYyB2b2lkIG1wbXRfb3MyX2hvb2tzKGFwcl9wb29sX3QgKnApCi17Ci0gICAgYXBfaG9va19wcmVfY29uZmlnKG1wbXRfb3MyX3ByZV9jb25maWcsIE5VTEwsIE5VTEwsIEFQUl9IT09LX01JRERMRSk7Ci19Ci0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2RhZW1vbnNfdG9fc3RhcnQoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0KLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBhcF9kYWVtb25zX3RvX3N0YXJ0ID0gYXRvaShhcmcpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9taW5fc3BhcmVfdGhyZWFkcyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksCi0JCQkJCSBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0KLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBhcF9taW5fc3BhcmVfdGhyZWFkcyA9IGF0b2koYXJnKTsKLQotICAgIGlmIChhcF9taW5fc3BhcmVfdGhyZWFkcyA8PSAwKSB7Ci0gICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgIldBUk5JTkc6IGRldGVjdGVkIE1pblNwYXJlVGhyZWFkcyBzZXQgdG8gbm9uLXBvc2l0aXZlLiIpOwotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICJSZXNldHRpbmcgdG8gMSB0byBhdm9pZCBhbG1vc3QgY2VydGFpbiBBcGFjaGUgZmFpbHVyZS4iKTsKLSAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIHJlYWQgdGhlIGRvY3VtZW50YXRpb24uIik7Ci0gICAgICAgYXBfbWluX3NwYXJlX3RocmVhZHMgPSAxOwotICAgIH0KLSAgICAgICAKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbWF4X3NwYXJlX3RocmVhZHMoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LAotCQkJCQkgY29uc3QgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotCi0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgYXBfbWF4X3NwYXJlX3RocmVhZHMgPSBhdG9pKGFyZyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgbXBtdF9vczJfY21kc1tdID0gewotTElTVEVOX0NPTU1BTkRTCi1BUF9JTklUX1RBS0UxKCAiU3RhcnRTZXJ2ZXJzIiwgc2V0X2RhZW1vbnNfdG9fc3RhcnQsIE5VTEwsIFJTUkNfQ09ORiwgCi0gICJOdW1iZXIgb2YgY2hpbGQgcHJvY2Vzc2VzIGxhdW5jaGVkIGF0IHNlcnZlciBzdGFydHVwIiApLAotQVBfSU5JVF9UQUtFMSgiTWluU3BhcmVUaHJlYWRzIiwgc2V0X21pbl9zcGFyZV90aHJlYWRzLCBOVUxMLCBSU1JDX0NPTkYsCi0gICJNaW5pbXVtIG51bWJlciBvZiBpZGxlIGNoaWxkcmVuLCB0byBoYW5kbGUgcmVxdWVzdCBzcGlrZXMiKSwKLUFQX0lOSVRfVEFLRTEoIk1heFNwYXJlVGhyZWFkcyIsIHNldF9tYXhfc3BhcmVfdGhyZWFkcywgTlVMTCwgUlNSQ19DT05GLAotICAiTWF4aW11bSBudW1iZXIgb2YgaWRsZSBjaGlsZHJlbiIpLAoteyBOVUxMIH0KLX07Ci0KLW1vZHVsZSBBUF9NT0RVTEVfREVDTEFSRV9EQVRBIG1wbV9tcG10X29zMl9tb2R1bGUgPSB7Ci0gICAgTVBNMjBfTU9EVUxFX1NUVUZGLAotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBob29rIHRvIHJ1biBiZWZvcmUgYXBhY2hlIHBhcnNlcyBhcmdzICovCi0gICAgTlVMTCwJCQkvKiBjcmVhdGUgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlICovCi0gICAgTlVMTCwJCQkvKiBtZXJnZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgTlVMTCwJCQkvKiBjcmVhdGUgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlICovCi0gICAgTlVMTCwJCQkvKiBtZXJnZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgbXBtdF9vczJfY21kcywJCS8qIGNvbW1hbmQgYXByX3RhYmxlX3QgKi8KLSAgICBtcG10X29zMl9ob29rcywJCS8qIHJlZ2lzdGVyX2hvb2tzICovCi19OwpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9tcG10X29zMi9tcG10X29zMl9jaGlsZC5jIGIvc2VydmVyL21wbS9tcG10X29zMi9tcG10X29zMl9jaGlsZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmE5NmNhLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vbXBtdF9vczIvbXBtdF9vczJfY2hpbGQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2MyArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLSAKLSNkZWZpbmUgQ09SRV9QUklWQVRFCi0jZGVmaW5lIElOQ0xfTk9QTUFQSQotI2RlZmluZSBJTkNMX0RPUwotI2RlZmluZSBJTkNMX0RPU0VSUk9SUwotCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJtcG1fZGVmYXVsdC5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIJCS8qIGZvciBnZXRfcmVtb3RlX2hvc3QgKi8KLSNpbmNsdWRlICJodHRwX2Nvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJtcG0uaCIKLSNpbmNsdWRlICJhcF9tcG0uaCIKLSNpbmNsdWRlICJhcF9saXN0ZW4uaCIKLSNpbmNsdWRlICJhcHJfcG9ydGFibGUuaCIKLSNpbmNsdWRlICJtcG1fY29tbW9uLmgiCi0jaW5jbHVkZSAiYXByX3N0cmluZ3MuaCIKLSNpbmNsdWRlIDxvczIuaD4KLSNpbmNsdWRlIDxwcm9jZXNzLmg+Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBhcHJfcG9vbF90ICpwY29ubjsKLSAgICBhcHJfc29ja2V0X3QgKmNvbm5fc2Q7Ci19IHdvcmtlcl9hcmdzX3Q7Ci0KLSNkZWZpbmUgV09SS1RZUEVfQ09OTiAwCi0jZGVmaW5lIFdPUktUWVBFX0VYSVQgMQotCi1zdGF0aWMgYXByX3Bvb2xfdCAqcGNoaWxkID0gTlVMTDsKLXN0YXRpYyBpbnQgY2hpbGRfc2xvdDsKLXN0YXRpYyBpbnQgc2h1dGRvd25fcGVuZGluZyA9IDA7Ci1leHRlcm4gaW50IGFwX215X2dlbmVyYXRpb247Ci1zdGF0aWMgaW50IHZvbGF0aWxlIGlzX2dyYWNlZnVsID0gMTsKLUhFViBzaHV0ZG93bl9ldmVudDsgLyogc2lnbmFsZWQgd2hlbiB0aGlzIGNoaWxkIGlzIHNodXR0aW5nIGRvd24gKi8KLQotLyogZ3JhYiBzb21lIE1QTSBnbG9iYWxzICovCi1leHRlcm4gaW50IGFwX21pbl9zcGFyZV90aHJlYWRzOwotZXh0ZXJuIGludCBhcF9tYXhfc3BhcmVfdGhyZWFkczsKLWV4dGVybiBITVRYIGFwX21wbV9hY2NlcHRfbXV0ZXg7Ci0KLXN0YXRpYyB2b2lkIHdvcmtlcl9tYWluKHZvaWQgKnZwQXJnKTsKLXN0YXRpYyB2b2lkIGNsZWFuX2NoaWxkX2V4aXQoaW50IGNvZGUpOwotc3RhdGljIHZvaWQgc2V0X3NpZ25hbHMoKTsKLXN0YXRpYyB2b2lkIHNlcnZlcl9tYWludGVuYW5jZSh2b2lkICp2cEFyZyk7Ci0KLQotc3RhdGljIHZvaWQgY2xlYW5fY2hpbGRfZXhpdChpbnQgY29kZSkKLXsKLSAgICBpZiAocGNoaWxkKSB7Ci0JYXByX3Bvb2xfZGVzdHJveShwY2hpbGQpOwotICAgIH0KLQotICAgIGV4aXQoY29kZSk7Ci19Ci0KLQotCi12b2lkIGFwX21wbV9jaGlsZF9tYWluKGFwcl9wb29sX3QgKnBjb25mKQotewotICAgIGFwX2xpc3Rlbl9yZWMgKmxyID0gTlVMTDsKLSAgICBhcF9saXN0ZW5fcmVjICpmaXJzdF9sciA9IE5VTEw7Ci0gICAgaW50IHJlcXVlc3RzX3RoaXNfY2hpbGQgPSAwOwotICAgIGFwcl9zb2NrZXRfdCAqc2QgPSBhcF9saXN0ZW5lcnMtPnNkOwotICAgIGludCBuc2RzLCBydiA9IDA7Ci0gICAgdW5zaWduZWQgbG9uZyB1bFRpbWVzOwotICAgIGludCBteV9waWQgPSBnZXRwaWQoKTsKLSAgICBVTE9ORyByYywgYzsKLSAgICBIUVVFVUUgd29ya3E7Ci0gICAgYXByX3BvbGxmZF90ICpwb2xsc2V0OwotICAgIGludCBudW1fbGlzdGVuZXJzOwotICAgIFRJRCBzZXJ2ZXJfbWFpbnRfdGlkOwotCi0gICAgLyogU3RvcCBDdHJsLUMvQ3RybC1CcmVhayBzaWduYWxzIGdvaW5nIHRvIGNoaWxkIHByb2Nlc3NlcyAqLwotICAgIERvc1NldFNpZ25hbEV4Y2VwdGlvbkZvY3VzKDAsICZ1bFRpbWVzKTsKLSAgICBzZXRfc2lnbmFscygpOwotCi0gICAgLyogQ3JlYXRlIHBvb2wgZm9yIGNoaWxkICovCi0gICAgYXByX3Bvb2xfY3JlYXRlKCZwY2hpbGQsIHBjb25mKTsKLQotICAgIC8qIENyZWF0ZSBhbiBldmVudCBzZW1hcGhvcmUgdXNlZCB0byB0cmlnZ2VyIG90aGVyIHRocmVhZHMgdG8gc2h1dGRvd24gKi8KLSAgICByYyA9IERvc0NyZWF0ZUV2ZW50U2VtKE5VTEwsICZzaHV0ZG93bl9ldmVudCwgMCwgRkFMU0UpOwotCi0gICAgaWYgKHJjKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIEFQUl9GUk9NX09TX0VSUk9SKHJjKSwgYXBfc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIGNyZWF0ZSBzaHV0ZG93biBzZW1hcGhvcmUsIGV4aXRpbmciKTsKLSAgICAgICAgY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotCi0gICAgLyogR2FpbiBhY2Nlc3MgdG8gdGhlIHNjb3JlYm9hcmQuICovCi0gICAgcmMgPSBEb3NHZXROYW1lZFNoYXJlZE1lbSgoUFBWT0lEKSZhcF9zY29yZWJvYXJkX2ltYWdlLCBhcF9zY29yZWJvYXJkX2ZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHX1JFQUR8UEFHX1dSSVRFKTsKLQotICAgIGlmIChyYykgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBBUFJfRlJPTV9PU19FUlJPUihyYyksIGFwX3NlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgInNjb3JlYm9hcmQgbm90IHJlYWRhYmxlIGluIGNoaWxkLCBleGl0aW5nIik7Ci0gICAgICAgIGNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotICAgIH0KLQotICAgIC8qIEdhaW4gYWNjZXNzIHRvIHRoZSBhY2NwZXQgbXV0ZXggKi8KLSAgICByYyA9IERvc09wZW5NdXRleFNlbShOVUxMLCAmYXBfbXBtX2FjY2VwdF9tdXRleCk7Ci0KLSAgICBpZiAocmMpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgQVBSX0ZST01fT1NfRVJST1IocmMpLCBhcF9zZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJhY2NlcHQgbXV0ZXggY291bGRuJ3QgYmUgYWNjZXNzZWQgaW4gY2hpbGQsIGV4aXRpbmciKTsKLSAgICAgICAgY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotCi0gICAgLyogRmluZCBvdXIgcGlkIGluIHRoZSBzY29yZWJvYXJkIHNvIHdlIGtub3cgd2hhdCBzbG90IG91ciBwYXJlbnQgYWxsb2NhdGVkIHVzICovCi0gICAgZm9yIChjaGlsZF9zbG90ID0gMDsgYXBfc2NvcmVib2FyZF9pbWFnZS0+cGFyZW50W2NoaWxkX3Nsb3RdLnBpZCAhPSBteV9waWQgJiYgY2hpbGRfc2xvdCA8IEhBUkRfU0VSVkVSX0xJTUlUOyBjaGlsZF9zbG90KyspOwotCi0gICAgaWYgKGNoaWxkX3Nsb3QgPT0gSEFSRF9TRVJWRVJfTElNSVQpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUnxBUExPR19OT0VSUk5PLCAwLCBhcF9zZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJjaGlsZCBwaWQgbm90IGZvdW5kIGluIHNjb3JlYm9hcmQsIGV4aXRpbmciKTsKLSAgICAgICAgY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotCi0gICAgYXBfbXlfZ2VuZXJhdGlvbiA9IGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtjaGlsZF9zbG90XS5nZW5lcmF0aW9uOwotCi0gICAgLyogU2V0IHVwIGFuIE9TLzIgcXVldWUgZm9yIHBhc3NpbmcgY29ubmVjdGlvbnMgJiB0ZXJtaW5hdGlvbiByZXF1ZXN0cwotICAgICAqIHRvIHdvcmtlciB0aHJlYWRzCi0gICAgICovCi0gICAgcmMgPSBEb3NDcmVhdGVRdWV1ZSgmd29ya3EsIFFVRV9GSUZPLCBhcHJfcHNwcmludGYocGNoaWxkLCAiL3F1ZXVlcy9odHRwZC93b3JrLiVkIiwgbXlfcGlkKSk7Ci0KLSAgICBpZiAocmMpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgQVBSX0ZST01fT1NfRVJST1IocmMpLCBhcF9zZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gY3JlYXRlIHdvcmsgcXVldWUsIGV4aXRpbmciKTsKLSAgICAgICAgY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotCi0gICAgLyogQ3JlYXRlIGluaXRpYWwgcG9vbCBvZiB3b3JrZXIgdGhyZWFkcyAqLwotICAgIGZvciAoYyA9IDA7IGMgPCBhcF9taW5fc3BhcmVfdGhyZWFkczsgYysrKSB7Ci0vLyAgICAgICAgYXBfc2NvcmVib2FyZF9pbWFnZS0+c2VydmVyc1tjaGlsZF9zbG90XVtjXS50aWQgPSBfYmVnaW50aHJlYWQod29ya2VyX21haW4sIE5VTEwsIDEyOCoxMDI0LCAodm9pZCAqKWMpOwotICAgIH0KLQotICAgIC8qIFN0YXJ0IG1haW50ZW5hbmNlIHRocmVhZCAqLwotICAgIHNlcnZlcl9tYWludF90aWQgPSBfYmVnaW50aHJlYWQoc2VydmVyX21haW50ZW5hbmNlLCBOVUxMLCAzMjc2OCwgTlVMTCk7Ci0KLSAgICAvKiBTZXQgdXAgcG9sbCAqLwotICAgIGZvciAobnVtX2xpc3RlbmVycyA9IDAsIGxyID0gYXBfbGlzdGVuZXJzOyBscjsgbHIgPSBsci0+bmV4dCkgewotICAgICAgICBudW1fbGlzdGVuZXJzKys7Ci0gICAgfQotCi0gICAgYXByX3BvbGxfc2V0dXAoJnBvbGxzZXQsIG51bV9saXN0ZW5lcnMsIHBjaGlsZCk7Ci0KLSAgICBmb3IgKGxyID0gYXBfbGlzdGVuZXJzOyBscjsgbHIgPSBsci0+bmV4dCkgewotICAgICAgICBhcHJfcG9sbF9zb2NrZXRfYWRkKHBvbGxzZXQsIGxyLT5zZCwgQVBSX1BPTExJTik7Ci0gICAgfQotCi0gICAgLyogTWFpbiBjb25uZWN0aW9uIGFjY2VwdCBsb29wICovCi0gICAgZG8gewotICAgICAgICBhcHJfcG9vbF90ICpwY29ubjsKLSAgICAgICAgd29ya2VyX2FyZ3NfdCAqd29ya2VyX2FyZ3M7Ci0KLSAgICAgICAgYXByX3Bvb2xfY3JlYXRlKCZwY29ubiwgcGNoaWxkKTsKLSAgICAgICAgd29ya2VyX2FyZ3MgPSBhcHJfcGFsbG9jKHBjb25uLCBzaXplb2Yod29ya2VyX2FyZ3NfdCkpOwotICAgICAgICB3b3JrZXJfYXJncy0+cGNvbm4gPSBwY29ubjsKLQotICAgICAgICBpZiAobnVtX2xpc3RlbmVycyA9PSAxKSB7Ci0gICAgICAgICAgICBydiA9IGFwcl9hY2NlcHQoJndvcmtlcl9hcmdzLT5jb25uX3NkLCBhcF9saXN0ZW5lcnMtPnNkLCBwY29ubik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByYyA9IERvc1JlcXVlc3RNdXRleFNlbShhcF9tcG1fYWNjZXB0X211dGV4LCBTRU1fSU5ERUZJTklURV9XQUlUKTsKLQotICAgICAgICAgICAgaWYgKHNodXRkb3duX3BlbmRpbmcpIHsKLSAgICAgICAgICAgICAgICBEb3NSZWxlYXNlTXV0ZXhTZW0oYXBfbXBtX2FjY2VwdF9tdXRleCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJ2ID0gQVBSX0ZST01fT1NfRVJST1IocmMpOwotCi0gICAgICAgICAgICBpZiAocnYgPT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICBydiA9IGFwcl9wb2xsKHBvbGxzZXQsICZuc2RzLCAtMSk7Ci0gICAgICAgICAgICAgICAgRG9zUmVsZWFzZU11dGV4U2VtKGFwX21wbV9hY2NlcHRfbXV0ZXgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocnYgPT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3RfbHIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBmaXJzdF9sciA9IGFwX2xpc3RlbmVyczsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsciA9IGZpcnN0X2xyOwotCi0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBhcHJfaW50MTZfdCBldmVudDsKLQotICAgICAgICAgICAgICAgICAgICBhcHJfcG9sbF9yZXZlbnRzX2dldCgmZXZlbnQsIGxyLT5zZCwgcG9sbHNldCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09IEFQUl9QT0xMSU4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcl9zb2NrYWRkcl90ICpzYTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcl9wb3J0X3QgcG9ydDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcl9zb2NrZXRfYWRkcl9nZXQoJnNhLCBBUFJfTE9DQUwsIGxyLT5zZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcHJfc29ja2FkZHJfcG9ydF9nZXQoJnBvcnQsIHNhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2xyID0gbHItPm5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsciA9IGxyLT5uZXh0OwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghbHIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxyID0gYXBfbGlzdGVuZXJzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAobHIgIT0gZmlyc3RfbHIpOwotCi0gICAgICAgICAgICAgICAgaWYgKGxyID09IGZpcnN0X2xyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNkID0gbHItPnNkOwotICAgICAgICAgICAgICAgIHJ2ID0gYXByX2FjY2VwdCgmd29ya2VyX2FyZ3MtPmNvbm5fc2QsIHNkLCBwY29ubik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocnYgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIGlmICghQVBSX1NUQVRVU19JU19FSU5UUihydikpIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBydiwgYXBfc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcHJfYWNjZXB0Iik7Ci0gICAgICAgICAgICAgICAgY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBEb3NXcml0ZVF1ZXVlKHdvcmtxLCBXT1JLVFlQRV9DT05OLCBzaXplb2Yod29ya2VyX2FyZ3NfdCksIHdvcmtlcl9hcmdzLCAwKTsKLSAgICAgICAgICAgIHJlcXVlc3RzX3RoaXNfY2hpbGQrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhcF9tYXhfcmVxdWVzdHNfcGVyX2NoaWxkICE9IDAgJiYgcmVxdWVzdHNfdGhpc19jaGlsZCA+PSBhcF9tYXhfcmVxdWVzdHNfcGVyX2NoaWxkKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfSB3aGlsZSAoIXNodXRkb3duX3BlbmRpbmcgJiYgYXBfbXlfZ2VuZXJhdGlvbiA9PSBhcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwucnVubmluZ19nZW5lcmF0aW9uKTsKLQotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtjaGlsZF9zbG90XS5xdWllc2NpbmcgPSAxOwotICAgIERvc1Bvc3RFdmVudFNlbShzaHV0ZG93bl9ldmVudCk7Ci0gICAgRG9zV2FpdFRocmVhZCgmc2VydmVyX21haW50X3RpZCwgRENXV19XQUlUKTsKLQotICAgIGlmIChpc19ncmFjZWZ1bCkgewotICAgICAgICBjaGFyIHNvbWVsZWZ0OwotCi0gICAgICAgIC8qIHRlbGwgb3VyIHdvcmtlciB0aHJlYWRzIHRvIGV4aXQgKi8KLSAgICAgICAgZm9yIChjPTA7IGM8SEFSRF9USFJFQURfTElNSVQ7IGMrKykgewotICAgICAgICAgICAgaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbY2hpbGRfc2xvdF1bY10uc3RhdHVzICE9IFNFUlZFUl9ERUFEKSB7Ci0gICAgICAgICAgICAgICAgRG9zV3JpdGVRdWV1ZSh3b3JrcSwgV09SS1RZUEVfRVhJVCwgMCwgTlVMTCwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBzb21lbGVmdCA9IDA7Ci0KLSAgICAgICAgICAgIGZvciAoYz0wOyBjPEhBUkRfVEhSRUFEX0xJTUlUOyBjKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoYXBfc2NvcmVib2FyZF9pbWFnZS0+c2VydmVyc1tjaGlsZF9zbG90XVtjXS5zdGF0dXMgIT0gU0VSVkVSX0RFQUQpIHsKLSAgICAgICAgICAgICAgICAgICAgc29tZWxlZnQgPSAxOwotICAgICAgICAgICAgICAgICAgICBEb3NTbGVlcCgxMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChzb21lbGVmdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRG9zUHVyZ2VRdWV1ZSh3b3JrcSk7Ci0KLSAgICAgICAgZm9yIChjPTA7IGM8SEFSRF9USFJFQURfTElNSVQ7IGMrKykgewotICAgICAgICAgICAgaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbY2hpbGRfc2xvdF1bY10uc3RhdHVzICE9IFNFUlZFUl9ERUFEKSB7Ci0gICAgICAgICAgICAgICAgRG9zS2lsbFRocmVhZChhcF9zY29yZWJvYXJkX2ltYWdlLT5zZXJ2ZXJzW2NoaWxkX3Nsb3RdW2NdLnRpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBhcHJfcG9vbF9kZXN0cm95KHBjaGlsZCk7Ci19Ci0KLQotCi12b2lkIGFkZF93b3JrZXIoKQotewotICAgIGludCB0aHJlYWRfc2xvdDsKLQotICAgIC8qIEZpbmQgYSBmcmVlIHRocmVhZCBzbG90ICovCi0gICAgZm9yICh0aHJlYWRfc2xvdD0wOyB0aHJlYWRfc2xvdCA8IEhBUkRfVEhSRUFEX0xJTUlUOyB0aHJlYWRfc2xvdCsrKSB7Ci0gICAgICAgIGlmIChhcF9zY29yZWJvYXJkX2ltYWdlLT5zZXJ2ZXJzW2NoaWxkX3Nsb3RdW3RocmVhZF9zbG90XS5zdGF0dXMgPT0gU0VSVkVSX0RFQUQpIHsKLSAgICAgICAgICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbY2hpbGRfc2xvdF1bdGhyZWFkX3Nsb3RdLnN0YXR1cyA9IFNFUlZFUl9TVEFSVElORzsKLSAgICAgICAgICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbY2hpbGRfc2xvdF1bdGhyZWFkX3Nsb3RdLnRpZCA9Ci0gICAgICAgICAgICAgICAgX2JlZ2ludGhyZWFkKHdvcmtlcl9tYWluLCBOVUxMLCAxMjgqMTAyNCwgKHZvaWQgKil0aHJlYWRfc2xvdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCi0KLXN0YXRpYyB2b2lkIHdvcmtlcl9tYWluKHZvaWQgKnZwQXJnKQotewotICAgIGxvbmcgY29ubl9pZDsKLSAgICBjb25uX3JlYyAqY3VycmVudF9jb25uOwotICAgIGFwcl9wb29sX3QgKnBjb25uOwotICAgIHdvcmtlcl9hcmdzX3QgKndvcmtlcl9hcmdzOwotICAgIEhRVUVVRSB3b3JrcTsKLSAgICBQSUQgb3duZXI7Ci0gICAgaW50IHJjOwotICAgIFJFUVVFU1REQVRBIHJkOwotICAgIFVMT05HIGxlbjsKLSAgICBCWVRFIHByaW9yaXR5OwotICAgIGludCB0aHJlYWRfc2xvdCA9IChpbnQpdnBBcmc7Ci0KLSAgICByYyA9IERvc09wZW5RdWV1ZSgmb3duZXIsICZ3b3JrcSwKLSAgICAgICAgICAgICAgICAgICAgICBhcHJfcHNwcmludGYocGNoaWxkLCAiL3F1ZXVlcy9odHRwZC93b3JrLiVkIiwgZ2V0cGlkKCkpKTsKLQotICAgIGlmIChyYykgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBBUFJfRlJPTV9PU19FUlJPUihyYyksIGFwX3NlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgInVuYWJsZSB0byBvcGVuIHdvcmsgcXVldWUsIGV4aXRpbmciKTsKLSAgICAgICAgYXBfc2NvcmVib2FyZF9pbWFnZS0+c2VydmVyc1tjaGlsZF9zbG90XVt0aHJlYWRfc2xvdF0udGlkID0gMDsKLSAgICB9Ci0KLSAgICBjb25uX2lkID0gQVBfSURfRlJPTV9DSElMRF9USFJFQUQoY2hpbGRfc2xvdCwgdGhyZWFkX3Nsb3QpOwotICAgIGFwX3VwZGF0ZV9jaGlsZF9zdGF0dXMoY2hpbGRfc2xvdCwgdGhyZWFkX3Nsb3QsIFNFUlZFUl9SRUFEWSwgTlVMTCk7Ci0KLSAgICB3aGlsZSAocmMgPSBEb3NSZWFkUXVldWUod29ya3EsICZyZCwgJmxlbiwgKFBQVk9JRCkmd29ya2VyX2FyZ3MsIDAsIERDV1dfV0FJVCwgJnByaW9yaXR5LCBOVUxMSEFORExFKSwKLSAgICAgICAgICAgcmMgPT0gMCAmJiByZC51bERhdGEgIT0gV09SS1RZUEVfRVhJVCkgewotICAgICAgICBwY29ubiA9IHdvcmtlcl9hcmdzLT5wY29ubjsKLSAgICAgICAgYXBfc29ja19kaXNhYmxlX25hZ2xlKHdvcmtlcl9hcmdzLT5jb25uX3NkKTsKLSAgICAgICAgY3VycmVudF9jb25uID0gYXBfbmV3X2Nvbm5lY3Rpb24ocGNvbm4sIGFwX3NlcnZlcl9jb25mLCB3b3JrZXJfYXJncy0+Y29ubl9zZCwgY29ubl9pZCk7Ci0KLSAgICAgICAgaWYgKGN1cnJlbnRfY29ubikgewotICAgICAgICAgICAgYXBfcHJvY2Vzc19jb25uZWN0aW9uKGN1cnJlbnRfY29ubik7Ci0gICAgICAgICAgICBhcF9saW5nZXJpbmdfY2xvc2UoY3VycmVudF9jb25uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFwcl9wb29sX2Rlc3Ryb3kocGNvbm4pOwotICAgICAgICBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKGNoaWxkX3Nsb3QsIHRocmVhZF9zbG90LCBTRVJWRVJfUkVBRFksIE5VTEwpOwotICAgIH0KLQotICAgIGFwX3VwZGF0ZV9jaGlsZF9zdGF0dXMoY2hpbGRfc2xvdCwgdGhyZWFkX3Nsb3QsIFNFUlZFUl9ERUFELCBOVUxMKTsKLX0KLQotCi0KLXN0YXRpYyB2b2lkIHNlcnZlcl9tYWludGVuYW5jZSh2b2lkICp2cEFyZykKLXsKLSAgICBpbnQgbnVtX2lkbGUsIG51bV9uZWVkZWQ7Ci0gICAgVUxPTkcgbnVtX3BlbmRpbmcgPSAwOwotICAgIGludCB0aHJlYWRudW07Ci0gICAgSFFVRVVFIHdvcmtxOwotICAgIFVMT05HIHJjOwotICAgIFBJRCBvd25lcjsKLQotICAgIHJjID0gRG9zT3BlblF1ZXVlKCZvd25lciwgJndvcmtxLAotICAgICAgICAgICAgICAgICAgICAgIGFwcl9wc3ByaW50ZihwY2hpbGQsICIvcXVldWVzL2h0dHBkL3dvcmsuJWQiLCBnZXRwaWQoKSkpOwotCi0gICAgaWYgKHJjKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIEFQUl9GUk9NX09TX0VSUk9SKHJjKSwgYXBfc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIG9wZW4gd29yayBxdWV1ZSBpbiBtYWludGVuYW5jZSB0aHJlYWQiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGRvIHsKLSAgICAgICAgZm9yIChudW1faWRsZT0wLCB0aHJlYWRudW09MDsgdGhyZWFkbnVtIDwgSEFSRF9USFJFQURfTElNSVQ7IHRocmVhZG51bSsrKSB7Ci0gICAgICAgICAgICBudW1faWRsZSArPSBhcF9zY29yZWJvYXJkX2ltYWdlLT5zZXJ2ZXJzW2NoaWxkX3Nsb3RdW3RocmVhZG51bV0uc3RhdHVzID09IFNFUlZFUl9SRUFEWTsKLSAgICAgICAgfQotCi0gICAgICAgIERvc1F1ZXJ5UXVldWUod29ya3EsICZudW1fcGVuZGluZyk7Ci0gICAgICAgIG51bV9uZWVkZWQgPSBhcF9taW5fc3BhcmVfdGhyZWFkcyAtIG51bV9pZGxlICsgbnVtX3BlbmRpbmc7Ci0KLSAgICAgICAgaWYgKG51bV9uZWVkZWQgPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKHRocmVhZG51bT0wOyB0aHJlYWRudW0gPCBudW1fbmVlZGVkOyB0aHJlYWRudW0rKykgewotICAgICAgICAgICAgICAgIGFkZF93b3JrZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChudW1faWRsZSAtIG51bV9wZW5kaW5nID4gYXBfbWF4X3NwYXJlX3RocmVhZHMpIHsKLSAgICAgICAgICAgIERvc1dyaXRlUXVldWUod29ya3EsIFdPUktUWVBFX0VYSVQsIDAsIE5VTEwsIDApOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoRG9zV2FpdEV2ZW50U2VtKHNodXRkb3duX2V2ZW50LCA1MDApID09IEVSUk9SX1RJTUVPVVQpOwotfQotCi0KLQotLyogU2lnbmFsIGhhbmRsaW5nIHJvdXRpbmVzICovCi0KLXN0YXRpYyB2b2lkIHNpZ190ZXJtKGludCBzaWcpCi17Ci0gICAgc2h1dGRvd25fcGVuZGluZyA9IDE7Ci0gICAgaXNfZ3JhY2VmdWwgPSAwOwotICAgIHNpZ25hbChTSUdURVJNLCBTSUdfREZMKTsKLX0KLQotCi0KLXN0YXRpYyB2b2lkIHNpZ19odXAoaW50IHNpZykKLXsKLSAgICBzaHV0ZG93bl9wZW5kaW5nID0gMTsKLSAgICBpc19ncmFjZWZ1bCA9IDE7Ci19Ci0KLQotCi1zdGF0aWMgdm9pZCBzZXRfc2lnbmFscygpCi17Ci0gICAgc3RydWN0IHNpZ2FjdGlvbiBzYTsKLQotICAgIHNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsKLSAgICBzYS5zYV9mbGFncyA9IDA7Ci0gICAgc2Euc2FfaGFuZGxlciA9IHNpZ190ZXJtOwotCi0gICAgaWYgKHNpZ2FjdGlvbihTSUdURVJNLCAmc2EsIE5VTEwpIDwgMCkKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIGFwX3NlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR1RFUk0pIik7Ci0KLSAgICBzYS5zYV9oYW5kbGVyID0gc2lnX2h1cDsKLQotICAgIGlmIChzaWdhY3Rpb24oU0lHSFVQLCAmc2EsIE5VTEwpIDwgMCkKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIGFwX3NlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR0hVUCkiKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vbmV0d2FyZS9tcG0uaCBiL3NlcnZlci9tcG0vbmV0d2FyZS9tcG0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlNTkzMy4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL25ldHdhcmUvbXBtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLSNpbmNsdWRlICJzY29yZWJvYXJkLmgiCi0vLyNpbmNsdWRlICJ1bml4ZC5oIgotCi0jaWZuZGVmIEFQQUNIRV9NUE1fVEhSRUFERURfSAotI2RlZmluZSBBUEFDSEVfTVBNX1RIUkVBREVEX0gKLQotI2RlZmluZSBUSFJFQURFRF9NUE0KLQotI2RlZmluZSBNUE1fTkFNRSAiTmV0V2FyZV9UaHJlYWRlZCIKLQotLy8jZGVmaW5lIEFQX01QTV9XQU5UX1JFQ0xBSU1fQ0hJTERfUFJPQ0VTU0VTCi0jZGVmaW5lIEFQX01QTV9XQU5UX1dBSVRfT1JfVElNRU9VVAotLy8jZGVmaW5lIEFQX01QTV9XQU5UX1BST0NFU1NfQ0hJTERfU1RBVFVTCi0jZGVmaW5lIEFQX01QTV9XQU5UX1NFVF9QSURGSUxFCi0jZGVmaW5lIEFQX01QTV9XQU5UX1NFVF9TQ09SRUJPQVJECi0jZGVmaW5lIEFQX01QTV9XQU5UX1NFVF9MT0NLRklMRQotI2RlZmluZSBBUF9NUE1fV0FOVF9TRVRfTUFYX1JFUVVFU1RTCi0jZGVmaW5lIEFQX01QTV9XQU5UX1NFVF9DT1JFRFVNUERJUgotLy8jZGVmaW5lIEFQX01QTV9XQU5UX1NFVF9BQ0NFUFRfTE9DS19NRUNICi0KLSNkZWZpbmUgTVBNX1NZTkNfQ0hJTERfVEFCTEUoKSAoYXBfc3luY19zY29yZWJvYXJkX2ltYWdlKCkpCi0jZGVmaW5lIE1QTV9DSElMRF9QSUQoaSkgKGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtpXS5waWQpCi0jZGVmaW5lIE1QTV9OT1RFX0NISUxEX0tJTExFRChpKSAoTVBNX0NISUxEX1BJRChpKSA9IDApCi0KLWV4dGVybiBpbnQgYXBfdGhyZWFkc19wZXJfY2hpbGQ7Ci1leHRlcm4gaW50IGFwX3RocmVhZF9zdGFja19zaXplOwotZXh0ZXJuIGludCBhcF9tYXhfd29ya2Vyc19saW1pdDsKLWV4dGVybiBzZXJ2ZXJfcmVjICphcF9zZXJ2ZXJfY29uZjsKLQotI2VuZGlmIC8qIEFQQUNIRV9NUE1fVEhSRUFERURfSCAqLwpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9uZXR3YXJlL21wbV9kZWZhdWx0LmggYi9zZXJ2ZXIvbXBtL25ldHdhcmUvbXBtX2RlZmF1bHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFlOGQxYS4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL25ldHdhcmUvbXBtX2RlZmF1bHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotI2lmbmRlZiBBUEFDSEVfTVBNX0RFRkFVTFRfSAotI2RlZmluZSBBUEFDSEVfTVBNX0RFRkFVTFRfSAotCi0jZGVmaW5lIEFQX0lEX0ZST01fQ0hJTERfVEhSRUFEKGMsIHQpICAgKChjICogSEFSRF9USFJFQURfTElNSVQpICsgdCkKLSNkZWZpbmUgQVBfQ0hJTERfVEhSRUFEX0ZST01fSUQoaSkgICAgICAoMCksIChpKQotCi0vKiBOdW1iZXIgb2Ygc2VydmVycyB0byBzcGF3biBvZmYgYnkgZGVmYXVsdCAtLS0gYWxzbywgaWYgZmV3ZXIgdGhhbgotICogdGhpcyBmcmVlIHdoZW4gdGhlIGNhcmV0YWtlciBjaGVja3MsIGl0IHdpbGwgc3Bhd24gbW9yZS4KLSAqLwotI2lmbmRlZiBERUZBVUxUX1NUQVJUX0RBRU1PTgotI2RlZmluZSBERUZBVUxUX1NUQVJUX0RBRU1PTiAxCi0jZW5kaWYKLQotLyogTWF4aW11bSBudW1iZXIgb2YgKmZyZWUqIHNlcnZlciBwcm9jZXNzZXMgLS0tIG1vcmUgdGhhbiB0aGlzLCBhbmQKLSAqIHRoZXkgd2lsbCBkaWUgb2ZmLgotICovCi0KLSNpZm5kZWYgREVGQVVMVF9NQVhfRlJFRV9EQUVNT04KLSNkZWZpbmUgREVGQVVMVF9NQVhfRlJFRV9EQUVNT04gMQotI2VuZGlmCi0KLS8qIE1pbmltdW0gLS0tIGZld2VyIHRoYW4gdGhpcywgYW5kIG1vcmUgd2lsbCBiZSBjcmVhdGVkICovCi0KLSNpZm5kZWYgREVGQVVMVF9NSU5fRlJFRV9EQUVNT04KLSNkZWZpbmUgREVGQVVMVF9NSU5fRlJFRV9EQUVNT04gMQotI2VuZGlmCi0KLS8qIExpbWl0IG9uIHRoZSB0b3RhbCAtLS0gY2xpZW50cyB3aWxsIGJlIGxvY2tlZCBvdXQgaWYgbW9yZSBzZXJ2ZXJzIHRoYW4KLSAqIHRoaXMgYXJlIG5lZWRlZC4gIEl0IGlzIGludGVuZGVkIHNvbGVseSB0byBrZWVwIHRoZSBzZXJ2ZXIgZnJvbSBjcmFzaGluZwotICogd2hlbiB0aGluZ3MgZ2V0IG91dCBvZiBoYW5kLgotICoKLSAqIFdlIGtlZXAgYSBoYXJkIG1heGltdW0gbnVtYmVyIG9mIHNlcnZlcnMsIGZvciB0d28gcmVhc29ucyAtLS0gZmlyc3Qgb2ZmLAotICogaW4gY2FzZSBzb21ldGhpbmcgZ29lcyBzZXJpb3VzbHkgd3JvbmcsIHdlIHdhbnQgdG8gc3RvcCB0aGUgZm9yayBib21iCi0gKiBzaG9ydCBvZiBhY3R1YWxseSBjcmFzaGluZyB0aGUgbWFjaGluZSB3ZSdyZSBydW5uaW5nIG9uIGJ5IGZpbGxpbmcgc29tZQotICoga2VybmVsIHRhYmxlLiAgU2Vjb25kbHksIGl0IGtlZXBzIHRoZSBzaXplIG9mIHRoZSBzY29yZWJvYXJkIGZpbGUgc21hbGwKLSAqIGVub3VnaCB0aGF0IHdlIGNhbiByZWFkIHRoZSB3aG9sZSB0aGluZyB3aXRob3V0IHdvcnJ5aW5nIHRvbyBtdWNoIGFib3V0Ci0gKiB0aGUgb3ZlcmhlYWQuCi0gKi8KLSNpZm5kZWYgSEFSRF9TRVJWRVJfTElNSVQKLSNkZWZpbmUgSEFSRF9TRVJWRVJfTElNSVQgMQotI2VuZGlmCi0KLS8qIExpbWl0IG9uIHRoZSB0aHJlYWRzIHBlciBwcm9jZXNzLiAgQ2xpZW50cyB3aWxsIGJlIGxvY2tlZCBvdXQgaWYgbW9yZSB0aGFuCi0gKiB0aGlzICAqIEhBUkRfU0VSVkVSX0xJTUlUIGFyZSBuZWVkZWQuCi0gKgotICogV2Uga2VlcCB0aGlzIGZvciBvbmUgcmVhc29uIGl0IGtlZXBzIHRoZSBzaXplIG9mIHRoZSBzY29yZWJvYXJkIGZpbGUgc21hbGwKLSAqIGVub3VnaCB0aGF0IHdlIGNhbiByZWFkIHRoZSB3aG9sZSB0aGluZyB3aXRob3V0IHdvcnJ5aW5nIHRvbyBtdWNoIGFib3V0Ci0gKiB0aGUgb3ZlcmhlYWQuCi0gKi8KLSNpZm5kZWYgSEFSRF9USFJFQURfTElNSVQKLSNkZWZpbmUgSEFSRF9USFJFQURfTElNSVQgMjA0OAotI2VuZGlmCi0KLSNpZm5kZWYgREVGQVVMVF9USFJFQURTX1BFUl9DSElMRAotI2RlZmluZSBERUZBVUxUX1RIUkVBRFNfUEVSX0NISUxEIDUwCi0jZW5kaWYKLQotLyogRmlsZSB1c2VkIGZvciBhY2NlcHQgbG9ja2luZywgd2hlbiB3ZSB1c2UgYSBmaWxlICovCi0jaWZuZGVmIERFRkFVTFRfTE9DS0ZJTEUKLSNkZWZpbmUgREVGQVVMVF9MT0NLRklMRSAibG9ncy9hY2NlcHQubG9jayIKLSNlbmRpZgotCi0vKiBTY29yZWJvYXJkIGZpbGUsIGlmIHRoZXJlIGlzIG9uZSAqLwotI2lmbmRlZiBERUZBVUxUX1NDT1JFQk9BUkQKLSNkZWZpbmUgREVGQVVMVF9TQ09SRUJPQVJEICJsb2dzL2FwYWNoZV9ydW50aW1lX3N0YXR1cyIKLSNlbmRpZgotCi0vKiBXaGVyZSB0aGUgbWFpbi9wYXJlbnQgcHJvY2VzcydzIHBpZCBpcyBsb2dnZWQgKi8KLSNpZm5kZWYgREVGQVVMVF9QSURMT0cKLSNkZWZpbmUgREVGQVVMVF9QSURMT0cgImxvZ3MvaHR0cGQucGlkIgotI2VuZGlmCi0KLS8qCi0gKiBJbnRlcnZhbCwgaW4gbWljcm9zZWNvbmRzLCBiZXR3ZWVuIHNjb3JlYm9hcmQgbWFpbnRlbmFuY2UuCi0gKi8KLSNpZm5kZWYgU0NPUkVCT0FSRF9NQUlOVEVOQU5DRV9JTlRFUlZBTAotI2RlZmluZSBTQ09SRUJPQVJEX01BSU5URU5BTkNFX0lOVEVSVkFMIDEwMDAwMDAKLSNlbmRpZgotCi0vKiBOdW1iZXIgb2YgcmVxdWVzdHMgdG8gdHJ5IHRvIGhhbmRsZSBpbiBhIHNpbmdsZSBwcm9jZXNzLiAgSWYgPD0gMCwKLSAqIHRoZSBjaGlsZHJlbiBkb24ndCBkaWUgb2ZmLgotICovCi0jaWZuZGVmIERFRkFVTFRfTUFYX1JFUVVFU1RTX1BFUl9DSElMRAotI2RlZmluZSBERUZBVUxUX01BWF9SRVFVRVNUU19QRVJfQ0hJTEQgMTAwMDAKLSNlbmRpZgotCi0jZW5kaWYgLyogQVBfTVBNX0RFRkFVTFRfSCAqLwpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9uZXR3YXJlL21wbV9uZXR3YXJlLmMgYi9zZXJ2ZXIvbXBtL25ldHdhcmUvbXBtX25ldHdhcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE2YTdhYi4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL25ldHdhcmUvbXBtX25ldHdhcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNTUgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBiYXNlZCB1cG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUKLSAqIG9yaWdpbmFsbHkgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsCi0gKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICovCi0KLS8qCi0gKiBodHRwZC5jOiBzaW1wbGUgaHR0cCBkYWVtb24gZm9yIGFuc3dlcmluZyBXV1cgZmlsZSByZXF1ZXN0cwotICoKLSAqIAotICogMDMtMjEtOTMgIFJvYiBNY0Nvb2wgd3JvdGUgb3JpZ2luYWwgY29kZSAodXAgdG8gTkNTQSBIVFRQZCAxLjMpCi0gKiAKLSAqIDAzLTA2LTk1ICBibG9uZwotICogIGNoYW5nZWQgc2VydmVyIG51bWJlciBmb3IgY2hpbGQtYWxvbmUgcHJvY2Vzc2VzIHRvIDAgYW5kIGNoYW5nZWQgbmFtZQotICogICBvZiBwcm9jZXNzZXMKLSAqCi0gKiAwMy0xMC05NSAgYmxvbmcKLSAqICAgICAgQWRkZWQgbnVtZXJvdXMgc3BlZWQgaGFja3MgcHJvcG9zZWQgYnkgUm9iZXJ0IFMuIFRoYXUgKHJzdEBhaS5taXQuZWR1KSAKLSAqICAgICAgaW5jbHVkaW5nIHNldCBncm91cCBiZWZvcmUgZm9yaywgYW5kIGNhbGwgZ2V0dGltZSBiZWZvcmUgdG8gZm9yawotICogICAgICB0byBzZXQgdXAgbGlicmFyaWVzLgotICoKLSAqIDA0LTE0LTk1ICByc3QgLyByaAotICogICAgICBCcmFuZG9uJ3MgY29kZSBzbmFyZmVkIGZyb20gTkNTQSAxLjQsIGJ1dCB0aW5rZXJlZCB0byB3b3JrIHdpdGggdGhlCi0gKiAgICAgIEFwYWNoZSBzZXJ2ZXIsIGFuZCBhbHNvIHRvIGhhdmUgY2hpbGQgcHJvY2Vzc2VzIGRvIGFjY2VwdCgpIGRpcmVjdGx5LgotICoKLSAqIEFwcmlsLUp1bHkgJzk1IHJzdAotICogICAgICBFeHRlbnNpdmUgcmV3b3JrIGZvciBBcGFjaGUuCi0gKi8KLQotLyogVE9ETzogdGhpcyBpcyBhIGNvYmJsZWQgdG9nZXRoZXIgcHJlZm9yayBNUE0gZXhhbXBsZS4uLiBpdCBzaG91bGQgbW9zdGx5Ci0gKiBUT0RPOiBiZWhhdmUgbGlrZSBhcGFjaGUtMS4zLi4uIGhlcmUncyBhIHNob3J0IGxpc3Qgb2YgdGhpbmdzIEkgdGhpbmsKLSAqIFRPRE86IG5lZWQgY2xlYW5pbmcgdXAgc3RpbGw6Ci0gKi8KLQotI2luY2x1ZGUgImFwci5oIgotI2luY2x1ZGUgImFwcl9wb3J0YWJsZS5oIgotI2luY2x1ZGUgImFwcl9zdHJpbmdzLmgiCi0jaW5jbHVkZSAiYXByX3RocmVhZF9wcm9jLmgiCi0jaW5jbHVkZSAiYXByX3NpZ25hbC5oIgotI2luY2x1ZGUgImFwcl90YWJsZXMuaCIKLSNpbmNsdWRlICJhcHJfZ2V0b3B0LmgiCi0KLSNkZWZpbmUgQVBSX1dBTlRfU1RESU8KLSNkZWZpbmUgQVBSX1dBTlRfU1RSRlVOQwotI2luY2x1ZGUgImFwcl93YW50LmgiCi0KLSNpZiBBUFJfSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jaWYgQVBSX0hBVkVfU1lTX1RZUEVTX0gKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNlbmRpZgotCi0jZGVmaW5lIENPUkVfUFJJVkFURQotCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJtcG1fZGVmYXVsdC5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIJCS8qIGZvciBnZXRfcmVtb3RlX2hvc3QgKi8KLSNpbmNsdWRlICJodHRwX2Nvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJzY29yZWJvYXJkLmgiCi0jaW5jbHVkZSAiYXBfbXBtLmgiCi0jaW5jbHVkZSAibXBtX2NvbW1vbi5oIgotI2luY2x1ZGUgImFwX2xpc3Rlbi5oIgotI2luY2x1ZGUgImFwX21tbi5oIgotCi0jaWZkZWYgSEFWRV9USU1FX0gKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0jZGVmaW5lIFdPUktFUl9ERUFEICAgICAgICAgU0VSVkVSX0RFQUQKLSNkZWZpbmUgV09SS0VSX1NUQVJUSU5HICAgICBTRVJWRVJfU1RBUlRJTkcKLSNkZWZpbmUgV09SS0VSX1JFQURZICAgICAgICBTRVJWRVJfUkVBRFkKLQotLyogY29uZmlnIGdsb2JhbHMgKi8KLQotaW50IGFwX3RocmVhZHNfcGVyX2NoaWxkPTA7ICAgICAgICAgLyogV29ya2VyIHRocmVhZHMgcGVyIGNoaWxkICovCi1pbnQgYXBfdGhyZWFkX3N0YWNrX3NpemU9NjU1MzY7Ci1zdGF0aWMgYXByX2xvY2tfdCAqYWNjZXB0X2xvY2s7Ci1zdGF0aWMgaW50IGFwX3RocmVhZHNfdG9fc3RhcnQ9MDsKLXN0YXRpYyBpbnQgYXBfdGhyZWFkc19taW5fZnJlZT0wOwotc3RhdGljIGludCBhcF90aHJlYWRzX21heF9mcmVlPTA7Ci1zdGF0aWMgaW50IGFwX3RocmVhZHNfbGltaXQ9MDsKLQotLyoKLSAqIFRoZSBtYXggY2hpbGQgc2xvdCBldmVyIGFzc2lnbmVkLCBwcmVzZXJ2ZWQgYWNyb3NzIHJlc3RhcnRzLiAgTmVjZXNzYXJ5Ci0gKiB0byBkZWFsIHdpdGggTWF4Q2xpZW50cyBjaGFuZ2VzIGFjcm9zcyBTSUdXSU5DSCByZXN0YXJ0cy4gIFdlIHVzZSB0aGlzCi0gKiB2YWx1ZSB0byBvcHRpbWl6ZSByb3V0aW5lcyB0aGF0IGhhdmUgdG8gc2NhbiB0aGUgZW50aXJlIHNjb3JlYm9hcmQuCi0gKi8KLWludCBhcF9tYXhfd29ya2Vyc19saW1pdCA9IC0xOwotc2VydmVyX3JlYyAqYXBfc2VydmVyX2NvbmY7Ci0KLS8qICpOb24qLXNoYXJlZCBodHRwX21haW4gZ2xvYmFscy4uLiAqLwotCi1zdGF0aWMgYXByX3NvY2tldF90ICpzZDsKLXN0YXRpYyBmZF9zZXQgbGlzdGVuZmRzOwotc3RhdGljIGludCBsaXN0ZW5tYXhmZDsKLQotLyogb25lX3Byb2Nlc3MgLS0tIGRlYnVnZ2luZyBtb2RlIHZhcmlhYmxlOyBjYW4gYmUgc2V0IGZyb20gdGhlIGNvbW1hbmQgbGluZQotICogd2l0aCB0aGUgLVggZmxhZy4gIElmIHNldCwgdGhpcyBnZXRzIHlvdSB0aGUgY2hpbGRfbWFpbiBsb29wIHJ1bm5pbmcKLSAqIGluIHRoZSBwcm9jZXNzIHdoaWNoIG9yaWdpbmFsbHkgc3RhcnRlZCB1cCAobm8gZGV0YWNoLCBubyBtYWtlX2NoaWxkKSwKLSAqIHdoaWNoIGlzIGEgcHJldHR5IG5pY2UgZGVidWdnaW5nIGVudmlyb25tZW50LiAgKFlvdSdsbCBnZXQgYSBTSUdIVVAKLSAqIGVhcmx5IGluIHN0YW5kYWxvbmVfbWFpbjsganVzdCBjb250aW51ZSB0aHJvdWdoLiAgVGhpcyBpcyB0aGUgc2VydmVyCi0gKiB0cnlpbmcgdG8ga2lsbCBvZmYgYW55IGNoaWxkIHByb2Nlc3NlcyB3aGljaCBpdCBtaWdodCBoYXZlIGx5aW5nCi0gKiBhcm91bmQgLS0tIEFwYWNoZSBkb2Vzbid0IGtlZXAgdHJhY2sgb2YgdGhlaXIgcGlkcywgaXQganVzdCBzZW5kcwotICogU0lHSFVQIHRvIHRoZSBwcm9jZXNzIGdyb3VwLCBpZ25vcmluZyBpdCBpbiB0aGUgcm9vdCBwcm9jZXNzLgotICogQ29udGludWUgdGhyb3VnaCBhbmQgeW91J2xsIGJlIGZpbmUuKS4KLSAqLwotCi1zdGF0aWMgaW50IG9uZV9wcm9jZXNzID0gMDsKLQotc3RhdGljIGFwcl9wb29sX3QgKnBjb25mOwkJLyogUG9vbCBmb3IgY29uZmlnIHN0dWZmICovCi1zdGF0aWMgYXByX3Bvb2xfdCAqcG1haW47CQkvKiBQb29sIGZvciBodHRwZCBjaGlsZCBzdHVmZiAqLwotCi1zdGF0aWMgcGlkX3QgYXBfbXlfcGlkOwkvKiBpdCBzZWVtcyBzaWxseSB0byBjYWxsIGdldHBpZCBhbGwgdGhlIHRpbWUgKi8KLXN0YXRpYyBwaWRfdCBwYXJlbnRfcGlkOwotI2lmbmRlZiBNVUxUSVRIUkVBRAotc3RhdGljIGludCBteV9jaGlsZF9udW07Ci0jZW5kaWYKLQotc3RhdGljIGludCBkaWVfbm93ID0gMDsKLXN0YXRpYyBhcHJfbG9ja190ICphY2NlcHRfbXV0ZXggPSBOVUxMOwotCi0vKiBLZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgY3VycmVudGx5IGFjdGl2ZSAqLwotc3RhdGljIGludCB3b3JrZXJfdGhyZWFkX2NvdW50Owotc3RhdGljIGFwcl9sb2NrX3QgKndvcmtlcl90aHJlYWRfY291bnRfbXV0ZXg7Ci0KLQotI2lmZGVmIEdQUk9GCi0vKiAKLSAqIGNoYW5nZSBkaXJlY3RvcnkgZm9yIGdwcm9mIHRvIHBsb3AgdGhlIGdtb24ub3V0IGZpbGUKLSAqIGNvbmZpZ3VyZSBpbiBodHRwZC5jb25mOgotICogR3Byb2ZEaXIgbG9ncy8gICAtPiAkU2VydmVyUm9vdC9sb2dzL2dtb24ub3V0Ci0gKiBHcHJvZkRpciBsb2dzLyUgIC0+ICRTZXJ2ZXJSb290L2xvZ3MvZ3Byb2YuJHBpZC9nbW9uLm91dAotICovCi1zdGF0aWMgdm9pZCBjaGRpcl9mb3JfZ3Byb2Yodm9pZCkKLXsKLSAgICBjb3JlX3NlcnZlcl9jb25maWcgKnNjb25mID0gCi0JYXBfZ2V0X21vZHVsZV9jb25maWcoYXBfc2VydmVyX2NvbmYtPm1vZHVsZV9jb25maWcsICZjb3JlX21vZHVsZSk7ICAgIAotICAgIGNoYXIgKmRpciA9IHNjb25mLT5ncHJvZl9kaXI7Ci0gICAgY29uc3QgY2hhciAqdXNlX2RpcjsKLQotICAgIGlmKGRpcikgewotICAgICAgICBhcHJfc3RhdHVzX3QgcmVzOwotCWNoYXIgYnVmWzUxMl07Ci0JaW50IGxlbiA9IHN0cmxlbihzY29uZi0+Z3Byb2ZfZGlyKSAtIDE7Ci0JaWYoKihkaXIgKyBsZW4pID09ICclJykgewotCSAgICBkaXJbbGVuXSA9ICdcMCc7Ci0JICAgIGFwcl9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXNncHJvZi4lZCIsIGRpciwgKGludClnZXRwaWQoKSk7Ci0JfSAKLQl1c2VfZGlyID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocGNvbmYsIGJ1ZlswXSA/IGJ1ZiA6IGRpcik7Ci0JcmVzID0gYXByX2Rpcl9tYWtlKHVzZV9kaXIsIDA3NTUsIHBjb25mKTsKLQlpZihyZXMgIT0gQVBSX1NVQ0NFU1MgJiYgIUFQUl9TVEFUVVNfSVNfRUVYSVNUKHJlcykpIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIGFwX3NlcnZlcl9jb25mLAotCQkJICJncHJvZjogZXJyb3IgY3JlYXRpbmcgZGlyZWN0b3J5ICVzIiwgZGlyKTsKLQl9Ci0gICAgfQotICAgIGVsc2UgewotCXVzZV9kaXIgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShwY29uZiwgImxvZ3MiKTsKLSAgICB9Ci0KLSAgICBjaGRpcihkaXIpOwotfQotI2Vsc2UKLSNkZWZpbmUgY2hkaXJfZm9yX2dwcm9mKCkKLSNlbmRpZgotCi0vKiBYWFggLSBJIGRvbid0IGtub3cgaWYgVFBGIHdpbGwgZXZlciB1c2UgdGhpcyBtb2R1bGUgb3Igbm90LCBzbyBsZWF2ZQotICogdGhlIGFwX2NoZWNrX3NpZ25hbHMgY2FsbHMgaW4gYnV0IGRpc2FibGUgdGhlbSAtIG1hbm9qICovCi0jZGVmaW5lIGFwX2NoZWNrX3NpZ25hbHMoKSAKLQotLyogYSBjbGVhbiBleGl0IGZyb20gYSBjaGlsZCB3aXRoIHByb3BlciBjbGVhbnVwICovCi1zdGF0aWMgdm9pZCBjbGVhbl9jaGlsZF9leGl0KGludCBjb2RlKSBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKTsKLXN0YXRpYyB2b2lkIGNsZWFuX2NoaWxkX2V4aXQoaW50IGNvZGUpCi17Ci0gICAgYXByX3RocmVhZF9tdXRleF9sb2NrKHdvcmtlcl90aHJlYWRfY291bnRfbXV0ZXgpOwotICAgIHdvcmtlcl90aHJlYWRfY291bnQtLTsKLSAgICBhcHJfdGhyZWFkX211dGV4X3VubG9jayh3b3JrZXJfdGhyZWFkX2NvdW50X211dGV4KTsKLSAgICBOWFRocmVhZEV4aXQoKHZvaWQqKSZjb2RlKTsKLX0KLQotc3RhdGljIGFwcl9zdGF0dXNfdCBhY2NlcHRfbXV0ZXhfY2hpbGRfY2xlYW51cCh2b2lkICpmb28pCi17Ci0gICAgcmV0dXJuIGFwcl90aHJlYWRfbXV0ZXhfdW5sb2NrKGFjY2VwdF9tdXRleCk7Ci19Ci0KLS8qIEluaXRpYWxpemUgbXV0ZXggbG9jay4KLSAqIERvbmUgYnkgZWFjaCBjaGlsZCBhdCBpdHMgYmlydGgKLSAqLwotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X2NoaWxkX2luaXQoYXByX3Bvb2xfdCAqcCkKLXsKLSAgICBhcHJfcG9vbF9jbGVhbnVwX3JlZ2lzdGVyKHAsIE5VTEwsIGFjY2VwdF9tdXRleF9jaGlsZF9jbGVhbnVwLCBhcHJfcG9vbF9jbGVhbnVwX251bGwpOwotfQotCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfb24odm9pZCkKLXsKLSAgICBhcHJfc3RhdHVzX3QgcmMgPSBhcHJfdGhyZWFkX211dGV4X2xvY2soYWNjZXB0X211dGV4KTsKLQotICAgIGlmIChyYyAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkcsIHJjLCBhcF9zZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJFcnJvciBnZXR0aW5nIGFjY2VwdCBsb2NrLiBFeGl0aW5nISIpOwotICAgICAgICBjbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9vZmYodm9pZCkKLXsKLSAgICBhcHJfc3RhdHVzX3QgcmMgPSBhcHJfdGhyZWFkX211dGV4X3VubG9jayhhY2NlcHRfbXV0ZXgpOwotCi0gICAgaWYgKHJjICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FTUVSRywgcmMsIGFwX3NlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAiRXJyb3IgZnJlZWluZyBhY2NlcHQgbG9jay4gRXhpdGluZyEiKTsKLSAgICAgICAgY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotfQotCi0vKiBPbiBzb21lIGFyY2hpdGVjdHVyZXMgaXQncyBzYWZlIHRvIGRvIHVuc2VyaWFsaXplZCBhY2NlcHQoKXMgaW4gdGhlIHNpbmdsZQotICogTGlzdGVuIGNhc2UuICBCdXQgaXQncyBuZXZlciBzYWZlIHRvIGRvIGl0IGluIHRoZSBjYXNlIHdoZXJlIHRoZXJlJ3MKLSAqIG11bHRpcGxlIExpc3RlbiBzdGF0ZW1lbnRzLiAgRGVmaW5lIFNJTkdMRV9MSVNURU5fVU5TRVJJQUxJWkVEX0FDQ0VQVAotICogd2hlbiBpdCdzIHNhZmUgaW4gdGhlIHNpbmdsZSBMaXN0ZW4gY2FzZS4KLSAqLwotI2lmZGVmIFNJTkdMRV9MSVNURU5fVU5TRVJJQUxJWkVEX0FDQ0VQVAotI2RlZmluZSBTQUZFX0FDQ0VQVChzdG10KSBkbyB7aWYgKGFwX2xpc3RlbmVycy0+bmV4dCkge3N0bXQ7fX0gd2hpbGUoMCkKLSNlbHNlCi0jZGVmaW5lIFNBRkVfQUNDRVBUKHN0bXQpIGRvIHtzdG10O30gd2hpbGUoMCkKLSNlbmRpZgotCi0vLyNpZmRlZiBOT19TRVJJQUxJWkVEX0FDQ0VQVAotLy8jZGVmaW5lIFNBRkVfQUNDRVBUKHN0bXQpIEFQUl9TVUNDRVNTCi0vLyNlbHNlCi0vLyNkZWZpbmUgU0FGRV9BQ0NFUFQoc3RtdCkgKHN0bXQpCi0vLyNlbmRpZgotCi1BUF9ERUNMQVJFKGFwcl9zdGF0dXNfdCkgYXBfbXBtX3F1ZXJ5KGludCBxdWVyeV9jb2RlLCBpbnQgKnJlc3VsdCkKLXsKLSAgICBzd2l0Y2gocXVlcnlfY29kZSl7Ci0gICAgICAgIGNhc2UgQVBfTVBNUV9NQVhfREFFTU9OX1VTRUQ6Ci0gICAgICAgICAgICAqcmVzdWx0ID0gYXBfdGhyZWFkc19saW1pdDsKLSAgICAgICAgICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLSAgICAgICAgY2FzZSBBUF9NUE1RX0lTX1RIUkVBREVEOgotICAgICAgICAgICAgKnJlc3VsdCA9IEFQX01QTVFfTk9UX1NVUFBPUlRFRDsKLSAgICAgICAgICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLSAgICAgICAgY2FzZSBBUF9NUE1RX0lTX0ZPUktFRDoKLSAgICAgICAgICAgICpyZXN1bHQgPSBBUF9NUE1RX0RZTkFNSUM7Ci0gICAgICAgICAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci0gICAgICAgIGNhc2UgQVBfTVBNUV9IQVJEX0xJTUlUX0RBRU1PTlM6Ci0gICAgICAgICAgICAqcmVzdWx0ID0gSEFSRF9TRVJWRVJfTElNSVQ7Ci0gICAgICAgICAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci0gICAgICAgIGNhc2UgQVBfTVBNUV9IQVJEX0xJTUlUX1RIUkVBRFM6Ci0gICAgICAgICAgICAqcmVzdWx0ID0gSEFSRF9USFJFQURfTElNSVQ7Ci0gICAgICAgICAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci0gICAgICAgIGNhc2UgQVBfTVBNUV9NQVhfVEhSRUFEUzoKLSAgICAgICAgICAgICpyZXN1bHQgPSAwOwotICAgICAgICAgICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotICAgICAgICBjYXNlIEFQX01QTVFfTUlOX1NQQVJFX0RFQU1PTlM6Ci0gICAgICAgICAgICAqcmVzdWx0ID0gYXBfdGhyZWFkc19taW5fZnJlZTsKLSAgICAgICAgICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLSAgICAgICAgY2FzZSBBUF9NUE1RX01JTl9TUEFSRV9USFJFQURTOgotICAgICAgICAgICAgKnJlc3VsdCA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci0gICAgICAgIGNhc2UgQVBfTVBNUV9NQVhfU1BBUkVfREFFTU9OUzoKLSAgICAgICAgICAgICpyZXN1bHQgPSBhcF90aHJlYWRzX21heF9mcmVlOwotICAgICAgICAgICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotICAgICAgICBjYXNlIEFQX01QTVFfTUFYX1NQQVJFX1RIUkVBRFM6Ci0gICAgICAgICAgICAqcmVzdWx0ID0gMDsKLSAgICAgICAgICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLSAgICAgICAgY2FzZSBBUF9NUE1RX01BWF9SRVFVRVNUU19ERUFNT046Ci0gICAgICAgICAgICAqcmVzdWx0ID0gYXBfbWF4X3JlcXVlc3RzX3Blcl9jaGlsZDsKLSAgICAgICAgICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLSAgICAgICAgY2FzZSBBUF9NUE1RX01BWF9EQUVNT05TOgotICAgICAgICAgICAgKnJlc3VsdCA9IGFwX3RocmVhZHNfbGltaXQ7Ci0gICAgICAgICAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci0gICAgfQotICAgIHJldHVybiBBUFJfRU5PVElNUEw7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb25uZWN0aW9uIHN0cnVjdHVyZXMgYW5kIGFjY291bnRpbmcuLi4KLSAqLwotCi1zdGF0aWMgdm9pZCBqdXN0X2RpZShpbnQgc2lnKQotewotICAgIGNsZWFuX2NoaWxkX2V4aXQoMCk7Ci19Ci0KLS8qIHZvbGF0aWxlIGp1c3QgaW4gY2FzZSAqLwotc3RhdGljIGludCB2b2xhdGlsZSBzaHV0ZG93bl9wZW5kaW5nOwotc3RhdGljIGludCB2b2xhdGlsZSByZXN0YXJ0X3BlbmRpbmc7Ci1zdGF0aWMgaW50IHZvbGF0aWxlIGlzX2dyYWNlZnVsOwotc3RhdGljIGludCB2b2xhdGlsZSB3YWl0X3RvX2ZpbmlzaD0xOwotYXBfZ2VuZXJhdGlvbl90IHZvbGF0aWxlIGFwX215X2dlbmVyYXRpb249MDsKLQotc3RhdGljIHZvaWQgc2lnX3Rlcm0oaW50IHNpZykKLXsKLSAgICBpZiAoc2h1dGRvd25fcGVuZGluZyA9PSAxKSB7Ci0JLyogVW0sIGlzIHRoaXMgX3Byb2JhYmx5XyBub3QgYW4gZXJyb3IsIGlmIHRoZSB1c2VyIGhhcwotCSAqIHRyaWVkIHRvIGRvIGEgc2h1dGRvd24gdHdpY2UgcXVpY2tseSwgc28gd2Ugd29uJ3QKLQkgKiB3b3JyeSBhYm91dCByZXBvcnRpbmcgaXQuCi0JICovCi0JcmV0dXJuOwotICAgIH0KLSAgICBzaHV0ZG93bl9wZW5kaW5nID0gMTsKLQotICAgIHdoaWxlICh3YWl0X3RvX2ZpbmlzaCkKLSAgICAgICAgZGVsYXkoNTAwKTsKLS8vICAgICAgICBOWFRocmVhZFlpZWxkKCk7Ci0gICAgZGVsYXkoMjAwMCk7Ci0vLyBUaGUgc2h1dCBkb3duIGZsYWcgd2FpdF90b19maW5pc2ggbmVlZHMgdG8gYmUgc2V0IGluICAKLS8vICAgIHRoZSBhdGV4aXQoKSByb3V0aW5lIHdoZW4gaXQgaXMgZmluYWxseSB3b3JraW5nLgotfQotCi0vKiByZXN0YXJ0KCkgaXMgdGhlIHNpZ25hbCBoYW5kbGVyIGZvciBTSUdIVVAgYW5kIFNJR1dJTkNICi0gKiBpbiB0aGUgcGFyZW50IHByb2Nlc3MsIHVubGVzcyBydW5uaW5nIGluIE9ORV9QUk9DRVNTIG1vZGUKLSAqLwotc3RhdGljIHZvaWQgcmVzdGFydChpbnQgc2lnKQotewotICAgIGlmIChyZXN0YXJ0X3BlbmRpbmcgPT0gMSkgewotICAgICAgICAvKiBQcm9iYWJseSBub3QgYW4gZXJyb3IgLSBkb24ndCBib3RoZXIgcmVwb3J0aW5nIGl0ICovCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcmVzdGFydF9wZW5kaW5nID0gMTsKLX0KLQotc3RhdGljIHZvaWQgc2V0X3NpZ25hbHModm9pZCkKLXsKLSAgICBhcHJfc2lnbmFsKFNJR1RFUk0sIHNpZ190ZXJtKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDaGlsZCBwcm9jZXNzIG1haW4gbG9vcC4KLSAqIFRoZSBmb2xsb3dpbmcgdmFycyBhcmUgc3RhdGljIHRvIGF2b2lkIGdldHRpbmcgY2xvYmJlcmVkIGJ5IGxvbmdqbXAoKTsKLSAqIHRoZXkgYXJlIHJlYWxseSBwcml2YXRlIHRvIGNoaWxkX21haW4uCi0gKi8KLQotLy9zdGF0aWMgaW50IHNydjsKLS8vc3RhdGljIGFwcl9zb2NrZXRfdCAqY3NkOwotLy9zdGF0aWMgaW50IHJlcXVlc3RzX3RoaXNfY2hpbGQ7Ci1zdGF0aWMgZmRfc2V0IG1haW5fZmRzOwotCi1pbnQgYXBfZ3JhY2VmdWxfc3RvcF9zaWduYWxsZWQodm9pZCkKLXsKLSAgICAvKiBub3QgZXZlciBjYWxsZWQgYW55bW9yZS4uLiAqLwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNldHVwX2xpc3Rlbl9wb2xsKGFwcl9wb29sX3QgKnBtYWluLCBhcHJfcG9sbGZkX3QgKipsaXN0ZW5fcG9sbCkKLXsKLSAgICBhcF9saXN0ZW5fcmVjICpscjsKLSAgICBpbnQgbnVtZmRzID0gMDsKLQotICAgIGZvciAobHIgPSBhcF9saXN0ZW5lcnM7IGxyOyBsciA9IGxyLT5uZXh0KSB7Ci0gICAgICAgIG51bWZkcysrOwotICAgIH0KLQotICAgIGFwcl9wb2xsX3NldHVwKGxpc3Rlbl9wb2xsLCBudW1mZHMsIHBtYWluKTsKLQotICAgIGZvciAobHIgPSBhcF9saXN0ZW5lcnM7IGxyOyBsciA9IGxyLT5uZXh0KSB7Ci0gICAgICAgIGFwcl9wb2xsX3NvY2tldF9hZGQoKmxpc3Rlbl9wb2xsLCBsci0+c2QsIEFQUl9QT0xMSU4pOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdm9pZCB3b3JrZXJfbWFpbih2b2lkICphcmcpCi17Ci0gICAgYXBfbGlzdGVuX3JlYyAqbHI7Ci0gICAgYXBfbGlzdGVuX3JlYyAqbGFzdF9scjsKLSAgICBhcF9saXN0ZW5fcmVjICpmaXJzdF9scjsKLSAgICBhcHJfcG9vbF90ICpwdHJhbnM7Ci0gICAgY29ubl9yZWMgKmN1cnJlbnRfY29ubjsKLSAgICBhcHJfc3RhdHVzX3Qgc3RhdCA9IEFQUl9FSU5JVDsKLSAgICBpbnQgc29ja2RlczsKLSAgICBpbnQgd29ya2VyX251bV9hcmcgPSAqKChpbnQqKWFyZyk7Ci0gICAgYXByX3BvbGxmZF90ICpsaXN0ZW5fcG9sbDsKLSAgICBpbnQgbnNkcywgcnY7Ci0KLSAgICBpbnQgbXlfd29ya2VyX251bSA9IHdvcmtlcl9udW1fYXJnOwotICAgIGFwcl9zb2NrZXRfdCAqY3NkID0gTlVMTDsKLSAgICBpbnQgcmVxdWVzdHNfdGhpc19jaGlsZCA9IDA7Ci0gICAgaW50IHNydjsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLQotICAgIGxhc3RfbHIgPSBOVUxMOwotICAgIHR2LnR2X3NlYyA9IDE7Ci0gICAgdHYudHZfdXNlYyA9IDA7Ci0KLSAgICBhcHJfcG9vbF9jcmVhdGUoJnB0cmFucywgcG1haW4pOwotCi0gICAgYXByX3RocmVhZF9tdXRleF9sb2NrKHdvcmtlcl90aHJlYWRfY291bnRfbXV0ZXgpOwotICAgIHdvcmtlcl90aHJlYWRfY291bnQrKzsKLSAgICBhcHJfdGhyZWFkX211dGV4X3VubG9jayh3b3JrZXJfdGhyZWFkX2NvdW50X211dGV4KTsKLQotICAgIGlmIChzZXR1cF9saXN0ZW5fcG9sbChwbWFpbiwgJmxpc3Rlbl9wb2xsKSkgewotICAgICAgICBjbGVhbl9jaGlsZF9leGl0KDEpOwotICAgIH0KLQotICAgIGFwX3VwZGF0ZV9jaGlsZF9zdGF0dXMoQVBfQ0hJTERfVEhSRUFEX0ZST01fSUQobXlfY2hpbGRfbnVtKSwgV09SS0VSX1JFQURZLCAocmVxdWVzdF9yZWMgKikgTlVMTCk7Ci0KLS8vICAgIGFwX3N5bmNfc2NvcmVib2FyZF9pbWFnZSgpOwotICAgIHdoaWxlICghZGllX25vdykgewotICAgICAgICAvKgotICAgICAgICAqIChSZSlpbml0aWFsaXplIHRoaXMgY2hpbGQgdG8gYSBwcmUtY29ubmVjdGlvbiBzdGF0ZS4KLSAgICAgICAgKi8KLSAgICAgICAgY3VycmVudF9jb25uID0gTlVMTDsKLSAgICAgICAgYXByX3Bvb2xfY2xlYXIocHRyYW5zKTsKLQotICAgICAgICBpZiAoKGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQgPiAwCi0gICAgICAgICAgICAmJiByZXF1ZXN0c190aGlzX2NoaWxkKysgPj0gYXBfbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCkpIHsKLSAgICAgICAgICAgIGNsZWFuX2NoaWxkX2V4aXQoMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKEFQX0NISUxEX1RIUkVBRF9GUk9NX0lEKG15X2NoaWxkX251bSksIFdPUktFUl9SRUFEWSwgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotCi0gICAgICAgIC8qCi0gICAgICAgICogV2FpdCBmb3IgYW4gYWNjZXB0YWJsZSBjb25uZWN0aW9uIHRvIGFycml2ZS4KLSAgICAgICAgKi8KLQotICAgICAgICAvKiBMb2NrIGFyb3VuZCAiYWNjZXB0IiwgaWYgbmVjZXNzYXJ5ICovCi0gICAgICAgIFNBRkVfQUNDRVBUKGFjY2VwdF9tdXRleF9vbigpKTsKLQotICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICBpZiAoc2h1dGRvd25fcGVuZGluZykgewotcHJpbnRmICgiVGhyZWFkICVkIGlzIHNodXR0aW5nIGRvd25cbiIsIGdldHBpZCgpKTsKLSAgICAgICAgICAgICAgICBTQUZFX0FDQ0VQVChhY2NlcHRfbXV0ZXhfb2ZmKCkpOwotICAgICAgICAgICAgICAgIGNsZWFuX2NoaWxkX2V4aXQoMCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIG1vcmUgdGhhbiBvbmUgc29ja2V0ICovCi0gICAgICAgICAgICBtZW1jcHkoJm1haW5fZmRzLCAmbGlzdGVuZmRzLCBzaXplb2YoZmRfc2V0KSk7Ci0gICAgICAgICAgICBzcnYgPSBzZWxlY3QobGlzdGVubWF4ZmQgKyAxLCAmbWFpbl9mZHMsIE5VTEwsIE5VTEwsICZ0dik7Ci0KLSAgICAgICAgICAgIGlmIChzcnYgPCAwICYmIGhfZXJybm8gIT0gRUlOVFIpIHsKLSAgICAgICAgICAgICAgICAvKiBTaW5nbGUgVW5peCBkb2N1bWVudHMgc2VsZWN0IGFzIHJldHVybmluZyBlcnJub3MKLSAgICAgICAgICAgICAgICAqIEVCQURGLCBFSU5UUiwgYW5kIEVJTlZBTC4uLiBhbmQgaW4gbm9uZSBvZiB0aG9zZQotICAgICAgICAgICAgICAgICogY2FzZXMgZG9lcyBpdCBtYWtlIHNlbnNlIHRvIGNvbnRpbnVlLiAgSW4gZmFjdAotICAgICAgICAgICAgICAgICogb24gTGludXggMi4wLnggd2Ugc2VlbSB0byBlbmQgdXAgd2l0aCBFRkFVTFQKLSAgICAgICAgICAgICAgICAqIG9jY2FzaW9uYWxseSwgYW5kIHdlJ2QgbG9vcCBmb3JldmVyIGR1ZSB0byBpdC4KLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGhfZXJybm8sIGFwX3NlcnZlcl9jb25mLCAic2VsZWN0OiAobGlzdGVuKSIpOwotICAgICAgICAgICAgICAgIGNsZWFuX2NoaWxkX2V4aXQoMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzcnYgPD0gMCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgLyogd2UgcmVtZW1iZXIgdGhlIGxhc3RfbHIgd2Ugc2VhcmNoZWQgbGFzdCB0aW1lIGFyb3VuZCBzbyB0aGF0Ci0gICAgICAgICAgICB3ZSBkb24ndCBlbmQgdXAgc3RhcnZpbmcgYW55IHBhcnRpY3VsYXIgbGlzdGVuaW5nIHNvY2tldCAqLwotICAgICAgICAgICAgaWYgKGxhc3RfbHIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGxyID0gYXBfbGlzdGVuZXJzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbHIgPSBsYXN0X2xyLT5uZXh0OwotICAgICAgICAgICAgICAgIGlmICghbHIpCi0gICAgICAgICAgICAgICAgICAgIGxyID0gYXBfbGlzdGVuZXJzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmlyc3RfbHIgPSBscjsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBhcHJfb3Nfc29ja19nZXQoJnNvY2tkZXMsIGxyLT5zZCk7Ci0gICAgICAgICAgICAgICAgaWYgKEZEX0lTU0VUKHNvY2tkZXMsICZtYWluX2ZkcykpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gZ290X2xpc3RlbmVyOwotICAgICAgICAgICAgICAgIGxyID0gbHItPm5leHQ7Ci0gICAgICAgICAgICAgICAgaWYgKCFscikKLSAgICAgICAgICAgICAgICAgICAgbHIgPSBhcF9saXN0ZW5lcnM7Ci0gICAgICAgICAgICB9IHdoaWxlIChsciAhPSBmaXJzdF9scik7Ci0gICAgICAgICAgICAvKiBGSVhNRTogaWYgd2UgZ2V0IGhlcmUsIHNvbWV0aGluZyBiYWQgaGFzIGhhcHBlbmVkLCBhbmQgd2UncmUKLSAgICAgICAgICAgIHByb2JhYmx5IGdvbm5hIHNwaW4gZm9yZXZlci4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBjb250aW51ZTsKLWdvdF9saXN0ZW5lcjoKLSAgICAgICAgICAgIGxhc3RfbHIgPSBscjsKLSAgICAgICAgICAgIHNkID0gbHItPnNkOwotCi0gICAgICAgICAgICAvKiBpZiB3ZSBhY2NlcHQoKSBzb21ldGhpbmcgd2UgZG9uJ3Qgd2FudCB0byBkaWUsIHNvIHdlIGhhdmUgdG8KLSAgICAgICAgICAgICogZGVmZXIgdGhlIGV4aXQKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBmb3IgKDs7KSB7Ci0vLyAgICAgICAgICAgICAgICBhcF9zeW5jX3Njb3JlYm9hcmRfaW1hZ2UoKTsKLSAgICAgICAgICAgICAgICBzdGF0ID0gYXByX2FjY2VwdCgmY3NkLCBzZCwgcHRyYW5zKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdCA9PSBBUFJfU1VDQ0VTUyB8fCAhQVBSX1NUQVRVU19JU19FSU5UUihzdGF0KSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzdGF0ID09IEFQUl9TVUNDRVNTKQotICAgICAgICAgICAgICAgIGJyZWFrOwkJLyogV2UgaGF2ZSBhIHNvY2tldCByZWFkeSBmb3IgcmVhZGluZyAqLwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogT3VyIG9sZCBiZWhhdmlvdXIgaGVyZSB3YXMgdG8gY29udGludWUgYWZ0ZXIgYWNjZXB0KCkKLSAgICAgICAgICAgICAgICAgKiBlcnJvcnMuICBCdXQgdGhpcyBsZWFkcyB1cyBpbnRvIGxvdHMgb2YgdHJvdWJsZXMKLSAgICAgICAgICAgICAgICAgKiBiZWNhdXNlIG1vc3Qgb2YgdGhlIGVycm9ycyBhcmUgcXVpdGUgZmF0YWwuICBGb3IKLSAgICAgICAgICAgICAgICAgKiBleGFtcGxlLCBFTUZJTEUgY2FuIGJlIGNhdXNlZCBieSBzbG93IGRlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAgKiBsZWFrcyAoc2F5IGluIGEgM3JkIHBhcnR5IG1vZHVsZSwgb3IgbGliYykuICBJdCdzCi0gICAgICAgICAgICAgICAgICogZm9vbGlzaCBmb3IgdXMgdG8gY29udGludWUgYWZ0ZXIgYW4gRU1GSUxFLiAgV2UgYWxzbwotICAgICAgICAgICAgICAgICAqIHNlZW0gdG8gdGlja2xlIGtlcm5lbCBidWdzIG9uIHNvbWUgcGxhdGZvcm1zIHdoaWNoCi0gICAgICAgICAgICAgICAgICogbGVhZCB0byBuZXZlci1lbmRpbmcgbG9vcHMgaGVyZS4gIFNvIGl0IHNlZW1zIGJlc3QKLSAgICAgICAgICAgICAgICAgKiB0byBqdXN0IGV4aXQgaW4gbW9zdCBjYXNlcy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXQpIHsKLQotCQkgICAgICAgICAgICAvKiBMaW51eCBnZW5lcmF0ZXMgdGhlIHJlc3Qgb2YgdGhlc2UsIG90aGVyIHRjcAotCQkgICAgICAgICAgICAgKiBzdGFja3MgKGkuZS4gYnNkKSB0ZW5kIHRvIGhpZGUgdGhlbSBiZWhpbmQKLQkJICAgICAgICAgICAgICogZ2V0c29ja29wdCgpIGludGVyZmFjZXMuICBUaGV5IG9jY3VyIHdoZW4KLQkJICAgICAgICAgICAgICogdGhlIG5ldCBnb2VzIHNvdXIgb3IgdGhlIGNsaWVudCBkaXNjb25uZWN0cwotCQkgICAgICAgICAgICAgKiBhZnRlciB0aGUgdGhyZWUtd2F5IGhhbmRzaGFrZSBoYXMgYmVlbiBkb25lCi0JCSAgICAgICAgICAgICAqIGluIHRoZSBrZXJuZWwgYnV0IGJlZm9yZSB1c2VybGFuZCBoYXMgcGlja2VkCi0JCSAgICAgICAgICAgICAqIHVwIHRoZSBzb2NrZXQuCi0JCSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBjYXNlIEVDT05OUkVTRVQ6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRVRJTUVET1VUOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEVIT1NUVU5SRUFDSDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBFTkVUVU5SRUFDSDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRU5FVERPV046Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBXaGVuIHRoZSBuZXR3b3JrIGxheWVyIGhhcyBiZWVuIHNodXQgZG93biwgdGhlcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICogaXMgbm90IG11Y2ggdXNlIGluIHNpbXBseSBleGl0aW5nOiB0aGUgcGFyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIHdvdWxkIHNpbXBseSByZS1jcmVhdGUgdXMgKGFuZCB3ZSdkIGZhaWwgYWdhaW4pLgotICAgICAgICAgICAgICAgICAgICAgICAgKiBVc2UgdGhlIENISUxERkFUQUwgY29kZSB0byB0ZWFyIHRoZSBzZXJ2ZXIgZG93bi4KLSAgICAgICAgICAgICAgICAgICAgICAgICogQEBAIE1hcnRpbidzIGlkZWEgZm9yIHBvc3NpYmxlIGltcHJvdmVtZW50OgotICAgICAgICAgICAgICAgICAgICAgICAgKiBBIGRpZmZlcmVudCBhcHByb2FjaCB3b3VsZCBiZSB0byBkZWZpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICogYSBuZXcgQVBFWElUX05FVERPV04gZXhpdCBjb2RlLCB0aGUgcmVjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAqIG9mIHdoaWNoIHdvdWxkIG1ha2UgdGhlIHBhcmVudCBzaHV0ZG93biBhbGwKLSAgICAgICAgICAgICAgICAgICAgICAgICogY2hpbGRyZW4sIHRoZW4gaWRsZS1sb29wIHVudGlsIGl0IGRldGVjdGVkIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIG5ldHdvcmsgaXMgdXAgYWdhaW4sIGFuZCByZXN0YXJ0IHRoZSBjaGlsZHJlbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICogQmVuIEh5ZGUgbm90ZWQgdGhhdCB0ZW1wb3JhcnkgRU5FVERPV04gc2l0dWF0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgKiBvY2N1ciBpbiBtb2JpbGUgSVAuCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLCBzdGF0LCBhcF9zZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXByX2FjY2VwdDogZ2l2aW5nIHVwLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHN0YXQsIGFwX3NlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcHJfYWNjZXB0OiAoY2xpZW50IHNvY2tldCkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFuX2NoaWxkX2V4aXQoMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0vLyAgICAgICAgICAgIGFwX3N5bmNfc2NvcmVib2FyZF9pbWFnZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgU0FGRV9BQ0NFUFQoYWNjZXB0X211dGV4X29mZigpKTsJLyogdW5sb2NrIGFmdGVyICJhY2NlcHQiICovCi0KLSAgICAgICAgLyoKLSAgICAgICAgKiBXZSBub3cgaGF2ZSBhIGNvbm5lY3Rpb24sIHNvIHNldCBpdCB1cCB3aXRoIHRoZSBhcHByb3ByaWF0ZQotICAgICAgICAqIHNvY2tldCBvcHRpb25zLCBmaWxlIGRlc2NyaXB0b3JzLCBhbmQgcmVhZC93cml0ZSBidWZmZXJzLgotICAgICAgICAqLwotCi0gICAgICAgIGFwcl9vc19zb2NrX2dldCgmc29ja2RlcywgY3NkKTsKLQotICAgICAgICBpZiAoc29ja2RlcyA+PSBGRF9TRVRTSVpFKSB7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLCAwLCBOVUxMLAotICAgICAgICAgICAgICAgICJuZXcgZmlsZSBkZXNjcmlwdG9yICVkIGlzIHRvbyBsYXJnZTsgeW91IHByb2JhYmx5IG5lZWQgIgotICAgICAgICAgICAgICAgICJ0byByZWJ1aWxkIEFwYWNoZSB3aXRoIGEgbGFyZ2VyIEZEX1NFVFNJWkUgIgotICAgICAgICAgICAgICAgICIoY3VycmVudGx5ICVkKSIsIAotICAgICAgICAgICAgICAgIHNvY2tkZXMsIEZEX1NFVFNJWkUpOwotICAgICAgICAgICAgYXByX3NvY2tldF9jbG9zZShjc2QpOwotLy8gICAgICAgICAgICBhcF9zeW5jX3Njb3JlYm9hcmRfaW1hZ2UoKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgYXBfc29ja19kaXNhYmxlX25hZ2xlKGNzZCk7Ci0KLSAgICAgICAgY3VycmVudF9jb25uID0gYXBfbmV3X2Nvbm5lY3Rpb24ocHRyYW5zLCBhcF9zZXJ2ZXJfY29uZiwgY3NkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfY2hpbGRfbnVtKTsKLSAgICAgICAgaWYgKGN1cnJlbnRfY29ubikgewotICAgICAgICAgICAgYXBfcHJvY2Vzc19jb25uZWN0aW9uKGN1cnJlbnRfY29ubik7Ci0gICAgICAgICAgICBhcF9saW5nZXJpbmdfY2xvc2UoY3VycmVudF9jb25uKTsKLSAgICAgICAgfQotICAgICAgICAKLS8vICAgICAgICBhcF9zeW5jX3Njb3JlYm9hcmRfaW1hZ2UoKTsKLSAgICB9Ci0gICAgY2xlYW5fY2hpbGRfZXhpdCgwKTsKLX0KLQotCi1zdGF0aWMgaW50IG1ha2VfY2hpbGQoc2VydmVyX3JlYyAqcywgaW50IHNsb3QpCi17Ci0gICAgaW50IHRpZDsKLSAgICBpbnQgZXJyPTA7Ci0gICAgTlhDb250ZXh0X3QgY3R4OwotCi0gICAgaWYgKHNsb3QgKyAxID4gYXBfbWF4X3dvcmtlcnNfbGltaXQpIHsKLSAgICAgICAgYXBfbWF4X3dvcmtlcnNfbGltaXQgPSBzbG90ICsgMTsKLSAgICB9Ci0KLSAgICBpZiAob25lX3Byb2Nlc3MpIHsKLSAgICAgICAgYXByX3NpZ25hbChTSUdJTlQsIGp1c3RfZGllKTsKLSAgICAgICAgYXByX3NpZ25hbChTSUdURVJNLCBqdXN0X2RpZSk7Ci0gICAgICAgIHdvcmtlcl9tYWluKCh2b2lkKikmc2xvdCk7Ci0gICAgfQotCi0gICAgYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhBUF9DSElMRF9USFJFQURfRlJPTV9JRChzbG90KSwgV09SS0VSX1NUQVJUSU5HLCAocmVxdWVzdF9yZWMgKikgTlVMTCk7Ci0KLSAgICBpZiAoY3R4ID0gTlhDb250ZXh0QWxsb2MoKHZvaWQgKCopKHZvaWQgKikpIHdvcmtlcl9tYWluLCAmc2xvdCwgTlhfUFJJT19NRUQsIGFwX3RocmVhZF9zdGFja19zaXplLCBOWF9DVFhfTk9STUFMLCAmZXJyKSkgewotICAgICAgICBjaGFyIHRocmVhZE5hbWVbMzJdOwotCi0gICAgICAgIHNwcmludGYgKHRocmVhZE5hbWUsICJBcGFjaGVfV29ya2VyICVkIiwgc2xvdCk7Ci0gICAgICAgIE5YQ29udGV4dFNldE5hbWUoY3R4LCB0aHJlYWROYW1lKTsKLSAgICAgICAgZXJyID0gTlhUaHJlYWRDcmVhdGUoY3R4LCBOWF9USFJfQklORF9DT05URVhULCAmdGlkKTsKLSAgICAgICAgaWYgKGVycikgewotICAgICAgICAgICAgTlhDb250ZXh0RnJlZSAoY3R4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChlcnIpIHsKLSAgICAgICAgLyogY3JlYXRlIHRocmVhZCBkaWRuJ3Qgc3VjY2VlZC4gRml4IHRoZSBzY29yZWJvYXJkIG9yIGVsc2UKLSAgICAgICAgKiBpdCB3aWxsIHNheSBTRVJWRVJfU1RBUlRJTkcgZm9yZXZlciBhbmQgZXZlcgotICAgICAgICAqLwotICAgICAgICBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKEFQX0NISUxEX1RIUkVBRF9GUk9NX0lEKHNsb3QpLCBXT1JLRVJfREVBRCwgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotCi0gICAgICAgIC8qIEluIGNhc2Ugc3lzdGVtIHJlc291cmNlcyBhcmUgbWF4eGVkIG91dCwgd2UgZG9uJ3Qgd2FudAotICAgICAgICBBcGFjaGUgcnVubmluZyBhd2F5IHdpdGggdGhlIENQVSB0cnlpbmcgdG8gZm9yayBvdmVyIGFuZAotICAgICAgICBvdmVyIGFuZCBvdmVyIGFnYWluLiAqLwotICAgICAgICBhcHJfdGhyZWFkX3lpZWxkKCk7Ci0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbMF1bc2xvdF0udGlkID0gdGlkOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotLyogc3RhcnQgdXAgYSBidW5jaCBvZiB3b3JrZXIgdGhyZWFkcyAqLwotc3RhdGljIHZvaWQgc3RhcnR1cF93b3JrZXJzKGludCBudW1iZXJfdG9fc3RhcnQpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBudW1iZXJfdG9fc3RhcnQgJiYgaSA8IGFwX3RocmVhZHNfbGltaXQ7ICsraSkgewotICAgICAgICBpZiAoYXBfc2NvcmVib2FyZF9pbWFnZS0+c2VydmVyc1swXVtpXS5zdGF0dXMgIT0gV09SS0VSX0RFQUQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYWtlX2NoaWxkKGFwX3NlcnZlcl9jb25mLCBpKSA8IDApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIC0tbnVtYmVyX3RvX3N0YXJ0OwotICAgIH0KLX0KLQotCi0vKgotICogaWRsZV9zcGF3bl9yYXRlIGlzIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCB3aWxsIGJlIHNwYXduZWQgb24gdGhlCi0gKiBuZXh0IG1haW50ZW5hbmNlIGN5Y2xlIGlmIHRoZXJlIGFyZW4ndCBlbm91Z2ggaWRsZSBzZXJ2ZXJzLiAgSXQgaXMKLSAqIGRvdWJsZWQgdXAgdG8gTUFYX1NQQVdOX1JBVEUsIGFuZCByZXNldCBvbmx5IHdoZW4gYSBjeWNsZSBnb2VzIGJ5Ci0gKiB3aXRob3V0IHRoZSBuZWVkIHRvIHNwYXduLgotICovCi1zdGF0aWMgaW50IGlkbGVfc3Bhd25fcmF0ZSA9IDE7Ci0jaWZuZGVmIE1BWF9TUEFXTl9SQVRFCi0jZGVmaW5lIE1BWF9TUEFXTl9SQVRFCSgzMikKLSNlbmRpZgotc3RhdGljIGludCBob2xkX29mZl9vbl9leHBvbmVudGlhbF9zcGF3bmluZzsKLQotc3RhdGljIHZvaWQgcGVyZm9ybV9pZGxlX3NlcnZlcl9tYWludGVuYW5jZShhcHJfcG9vbF90ICpwKQotewotICAgIGludCBpOwotICAgIGludCB0b19raWxsOwotICAgIGludCBpZGxlX2NvdW50OwotICAgIHdvcmtlcl9zY29yZSAqd3M7Ci0gICAgaW50IGZyZWVfbGVuZ3RoOwotICAgIGludCBmcmVlX3Nsb3RzW01BWF9TUEFXTl9SQVRFXTsKLSAgICBpbnQgbGFzdF9ub25fZGVhZDsKLSAgICBpbnQgdG90YWxfbm9uX2RlYWQ7Ci0KLSAgICAvKiBpbml0aWFsaXplIHRoZSBmcmVlX2xpc3QgKi8KLSAgICBmcmVlX2xlbmd0aCA9IDA7Ci0KLSAgICB0b19raWxsID0gLTE7Ci0gICAgaWRsZV9jb3VudCA9IDA7Ci0gICAgbGFzdF9ub25fZGVhZCA9IC0xOwotICAgIHRvdGFsX25vbl9kZWFkID0gMDsKLQotICAgIGFwX3N5bmNfc2NvcmVib2FyZF9pbWFnZSgpOwotICAgIGZvciAoaSA9IDA7IGkgPCBhcF90aHJlYWRzX2xpbWl0OyArK2kpIHsKLQlpbnQgc3RhdHVzOwotCi0JaWYgKGkgPj0gYXBfbWF4X3dvcmtlcnNfbGltaXQgJiYgZnJlZV9sZW5ndGggPT0gaWRsZV9zcGF3bl9yYXRlKQotCSAgICBicmVhazsKLQl3cyA9ICZhcF9zY29yZWJvYXJkX2ltYWdlLT5zZXJ2ZXJzW2ldWzBdOwotCXN0YXR1cyA9IHdzLT5zdGF0dXM7Ci0JaWYgKHN0YXR1cyA9PSBXT1JLRVJfREVBRCkgewotCSAgICAvKiB0cnkgdG8ga2VlcCBjaGlsZHJlbiBudW1iZXJzIGFzIGxvdyBhcyBwb3NzaWJsZSAqLwotCSAgICBpZiAoZnJlZV9sZW5ndGggPCBpZGxlX3NwYXduX3JhdGUpIHsKLQkJZnJlZV9zbG90c1tmcmVlX2xlbmd0aF0gPSBpOwotCQkrK2ZyZWVfbGVuZ3RoOwotCSAgICB9Ci0JfQotCWVsc2UgewotCSAgICAvKiBXZSBjb25zaWRlciBhIHN0YXJ0aW5nIHNlcnZlciBhcyBpZGxlIGJlY2F1c2Ugd2Ugc3RhcnRlZCBpdAotCSAgICAgKiBhdCBsZWFzdCBhIGN5Y2xlIGFnbywgYW5kIGlmIGl0IHN0aWxsIGhhc24ndCBmaW5pc2hlZCBzdGFydGluZwotCSAgICAgKiB0aGVuIHdlJ3JlIGp1c3QgZ29pbmcgdG8gc3dhbXAgdGhpbmdzIHdvcnNlIGJ5IGZvcmtpbmcgbW9yZS4KLQkgICAgICogU28gd2UgaG9wZWZ1bGx5IHdvbid0IG5lZWQgdG8gZm9yayBtb3JlIGlmIHdlIGNvdW50IGl0LgotCSAgICAgKiBUaGlzIGRlcGVuZHMgb24gdGhlIG9yZGVyaW5nIG9mIFNFUlZFUl9SRUFEWSBhbmQgU0VSVkVSX1NUQVJUSU5HLgotCSAgICAgKi8KLQkgICAgaWYgKHN0YXR1cyA8PSBTRVJWRVJfUkVBRFkpIHsKLQkJKysgaWRsZV9jb3VudDsKLQkJLyogYWx3YXlzIGtpbGwgdGhlIGhpZ2hlc3QgbnVtYmVyZWQgY2hpbGQgaWYgd2UgaGF2ZSB0by4uLgotCQkgKiBubyByZWFsbHkgd2VsbCB0aG91Z2h0IG91dCByZWFzb24gLi4uIG90aGVyIHRoYW4gb2JzZXJ2aW5nCi0JCSAqIHRoZSBzZXJ2ZXIgYmVoYXZpb3VyIHVuZGVyIGxpbnV4IHdoZXJlIGxvd2VyIG51bWJlcmVkIGNoaWxkcmVuCi0JCSAqIHRlbmQgdG8gc2VydmljZSBtb3JlIGhpdHMgKGFuZCBoZW5jZSBhcmUgbW9yZSBsaWtlbHkgdG8gaGF2ZQotCQkgKiB0aGVpciBkYXRhIGluIGNwdSBjYWNoZXMpLgotCQkgKi8KLQkJdG9fa2lsbCA9IGk7Ci0JICAgIH0KLQotCSAgICArK3RvdGFsX25vbl9kZWFkOwotCSAgICBsYXN0X25vbl9kZWFkID0gaTsKLQl9Ci0gICAgfQotICAgIGFwX21heF93b3JrZXJzX2xpbWl0ID0gbGFzdF9ub25fZGVhZCArIDE7Ci0gICAgaWYgKGlkbGVfY291bnQgPiBhcF90aHJlYWRzX21heF9mcmVlKSB7Ci0JLyoga2lsbCBvZmYgb25lIGNoaWxkLi4uIHdlIHVzZSB0aGUgcG9kIGJlY2F1c2UgdGhhdCdsbCBjYXVzZSBpdCB0bwotCSAqIHNodXQgZG93biBncmFjZWZ1bGx5LCBpbiBjYXNlIGl0IGhhcHBlbmVkIHRvIHBpY2sgdXAgYSByZXF1ZXN0Ci0JICogd2hpbGUgd2Ugd2VyZSBjb3VudGluZwotCSAqLwotCWlkbGVfc3Bhd25fcmF0ZSA9IDE7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlkbGVfY291bnQgPCBhcF90aHJlYWRzX21pbl9mcmVlKSB7Ci0JLyogdGVybWluYXRlIHRoZSBmcmVlIGxpc3QgKi8KLQlpZiAoZnJlZV9sZW5ndGggPT0gMCkgewotCSAgICAvKiBvbmx5IHJlcG9ydCB0aGlzIGNvbmRpdGlvbiBvbmNlICovCi0JICAgIHN0YXRpYyBpbnQgcmVwb3J0ZWQgPSAwOwotCi0JICAgIGlmICghcmVwb3J0ZWQpIHsKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCBhcF9zZXJ2ZXJfY29uZiwKLQkJCSAgICAic2VydmVyIHJlYWNoZWQgTWF4Q2xpZW50cyBzZXR0aW5nLCBjb25zaWRlciIKLQkJCSAgICAiIHJhaXNpbmcgdGhlIE1heENsaWVudHMgc2V0dGluZyIpOwotCQlyZXBvcnRlZCA9IDE7Ci0JICAgIH0KLQkgICAgaWRsZV9zcGF3bl9yYXRlID0gMTsKLQl9Ci0JZWxzZSB7Ci0JICAgIGlmIChpZGxlX3NwYXduX3JhdGUgPj0gOCkgewotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19JTkZPLCAwLCBhcF9zZXJ2ZXJfY29uZiwKLQkJICAgICJzZXJ2ZXIgc2VlbXMgYnVzeSwgKHlvdSBtYXkgbmVlZCAiCi0JCSAgICAidG8gaW5jcmVhc2UgU3RhcnRTZXJ2ZXJzLCBvciBNaW4vTWF4U3BhcmVTZXJ2ZXJzKSwgIgotCQkgICAgInNwYXduaW5nICVkIGNoaWxkcmVuLCB0aGVyZSBhcmUgJWQgaWRsZSwgYW5kICIKLQkJICAgICIlZCB0b3RhbCBjaGlsZHJlbiIsIGlkbGVfc3Bhd25fcmF0ZSwKLQkJICAgIGlkbGVfY291bnQsIHRvdGFsX25vbl9kZWFkKTsKLQkgICAgfQotCSAgICBmb3IgKGkgPSAwOyBpIDwgZnJlZV9sZW5ndGg7ICsraSkgewotCQltYWtlX2NoaWxkKGFwX3NlcnZlcl9jb25mLCBmcmVlX3Nsb3RzW2ldKTsKLQkgICAgfQotCSAgICAvKiB0aGUgbmV4dCB0aW1lIGFyb3VuZCB3ZSB3YW50IHRvIHNwYXduIHR3aWNlIGFzIG1hbnkgaWYgdGhpcwotCSAgICAgKiB3YXNuJ3QgZ29vZCBlbm91Z2gsIGJ1dCBub3QgaWYgd2UndmUganVzdCBkb25lIGEgZ3JhY2VmdWwKLQkgICAgICovCi0JICAgIGlmIChob2xkX29mZl9vbl9leHBvbmVudGlhbF9zcGF3bmluZykgewotCQktLWhvbGRfb2ZmX29uX2V4cG9uZW50aWFsX3NwYXduaW5nOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKGlkbGVfc3Bhd25fcmF0ZSA8IE1BWF9TUEFXTl9SQVRFKSB7Ci0JCWlkbGVfc3Bhd25fcmF0ZSAqPSAyOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICBlbHNlIHsKLQlpZGxlX3NwYXduX3JhdGUgPSAxOwotICAgIH0KLX0KLQotc3RhdGljIGludCBzZXR1cF9saXN0ZW5lcnMoc2VydmVyX3JlYyAqcykKLXsKLSAgICBhcF9saXN0ZW5fcmVjICpscjsKLSAgICBpbnQgc29ja2RlczsKLQotICAgIGlmIChhcF9zZXR1cF9saXN0ZW5lcnMocykgPCAxICkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19BTEVSVCwgMCwgcywKLSAgICAgICAgICAgICJubyBsaXN0ZW5pbmcgc29ja2V0cyBhdmFpbGFibGUsIHNodXR0aW5nIGRvd24iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGxpc3Rlbm1heGZkID0gLTE7Ci0gICAgRkRfWkVSTygmbGlzdGVuZmRzKTsKLSAgICBmb3IgKGxyID0gYXBfbGlzdGVuZXJzOyBscjsgbHIgPSBsci0+bmV4dCkgewotICAgICAgICBhcHJfb3Nfc29ja19nZXQoJnNvY2tkZXMsIGxyLT5zZCk7Ci0gICAgICAgIEZEX1NFVChzb2NrZGVzLCAmbGlzdGVuZmRzKTsKLSAgICAgICAgaWYgKHNvY2tkZXMgPiBsaXN0ZW5tYXhmZCkgewotICAgICAgICAgICAgbGlzdGVubWF4ZmQgPSBzb2NrZGVzOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEV4ZWN1dGl2ZSByb3V0aW5lcy4KLSAqLwotCi1pbnQgYXBfbXBtX3J1bihhcHJfcG9vbF90ICpfcGNvbmYsIGFwcl9wb29sX3QgKnBsb2csIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgaW50IGluZGV4OwotICAgIGludCByZW1haW5pbmdfd29ya2Vyc190b19zdGFydDsKLSAgICBhcHJfc3RhdHVzX3Qgc3RhdHVzPTA7Ci0KLSAgICBwY29uZiA9IF9wY29uZjsKLSAgICBhcF9zZXJ2ZXJfY29uZiA9IHM7Ci0KLSAgICBpZiAoc2V0dXBfbGlzdGVuZXJzKHMpKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0FMRVJULCBzdGF0dXMsIHMsCi0gICAgICAgICAgICAibm8gbGlzdGVuaW5nIHNvY2tldHMgYXZhaWxhYmxlLCBzaHV0dGluZyBkb3duIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBhcF9sb2dfcGlkKHBjb25mLCBhcF9waWRfZm5hbWUpOwotCi0gICAgd29ya2VyX3RocmVhZF9jb3VudCA9IDA7Ci0gICAgYXByX3RocmVhZF9tdXRleF9jcmVhdGUoJndvcmtlcl90aHJlYWRfY291bnRfbXV0ZXgsIHBjb25mKTsKLSAgICBhcHJfdGhyZWFkX211dGV4X2NyZWF0ZSgmYWNjZXB0X211dGV4LCBwY29uZik7Ci0gICAgaWYgKCFpc19ncmFjZWZ1bCkgewotICAgICAgICBhcF9ydW5fcHJlX21wbShwY29uZiwgU0JfTk9UX1NIQVJFRCk7Ci0gICAgfQotCi0gICAgc2V0X3NpZ25hbHMoKTsKLQotLyogTm9ybWFsIGNoaWxkIG1haW4gc3R1ZmYgKi8KLQotICAgIGFwcl9wb29sX2NyZWF0ZSgmcG1haW4sIHBjb25mKTsKLQotICAgIC8qIG5lZWRzIHRvIGJlIGRvbmUgYmVmb3JlIHdlIHN3aXRjaCBVSURzIHNvIHdlIGhhdmUgcGVybWlzc2lvbnMgKi8KLSAgICByZW9wZW5fc2NvcmVib2FyZChwbWFpbik7Ci0KLSAgICBhcF9ydW5fY2hpbGRfaW5pdChwbWFpbiwgYXBfc2VydmVyX2NvbmYpOwotCi0KLS8qIEVuZCBOb3JtYWwgY2hpbGQgbWFpbiBzdHVmZiAqLwotCi0gICAgaWYgKGFwX3RocmVhZHNfbWF4X2ZyZWUgPCBhcF90aHJlYWRzX21pbl9mcmVlICsgMSkJLyogRG9uJ3QgdGhyYXNoLi4uICovCi0gICAgICAgIGFwX3RocmVhZHNfbWF4X2ZyZWUgPSBhcF90aHJlYWRzX21pbl9mcmVlICsgMTsKLQotICAgIC8qIElmIHdlJ3JlIGRvaW5nIGEgZ3JhY2VmdWxfcmVzdGFydCB0aGVuIHdlJ3JlIGdvaW5nIHRvIHNlZSBhIGxvdAotCSogb2YgY2hpbGRyZW4gZXhpdGluZyBpbW1lZGlhdGVseSB3aGVuIHdlIGdldCBpbnRvIHRoZSBtYWluIGxvb3AKLQkqIGJlbG93IChiZWNhdXNlIHdlIGp1c3Qgc2VudCB0aGVtIFNJR1dJTkNIKS4gIFRoaXMgaGFwcGVucyBwcmV0dHkKLQkqIHJhcGlkbHkuLi4gYW5kIGZvciBlYWNoIG9uZSB0aGF0IGV4aXRzIHdlJ2xsIHN0YXJ0IGEgbmV3IG9uZSB1bnRpbAotCSogd2UgcmVhY2ggYXQgbGVhc3QgZGFlbW9uc19taW5fZnJlZS4gIEJ1dCB3ZSBtYXkgYmUgcGVybWl0dGVkIHRvCi0JKiBzdGFydCBtb3JlIHRoYW4gdGhhdCwgc28gd2UnbGwganVzdCBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IHdlJ3JlCi0JKiBzdXBwb3NlZCB0byBzdGFydCB1cCB3aXRob3V0IHRoZSAxIHNlY29uZCBwZW5hbHR5IGJldHdlZW4gZWFjaCBmb3JrLgotCSovCi0gICAgcmVtYWluaW5nX3dvcmtlcnNfdG9fc3RhcnQgPSBhcF90aHJlYWRzX3RvX3N0YXJ0OwotICAgIGlmIChyZW1haW5pbmdfd29ya2Vyc190b19zdGFydCA+IGFwX3RocmVhZHNfbGltaXQpIHsKLSAgICAgICAgcmVtYWluaW5nX3dvcmtlcnNfdG9fc3RhcnQgPSBhcF90aHJlYWRzX2xpbWl0OwotICAgIH0KLSAgICBpZiAoIWlzX2dyYWNlZnVsKSB7Ci0gICAgICAgIHN0YXJ0dXBfd29ya2VycyhyZW1haW5pbmdfd29ya2Vyc190b19zdGFydCk7Ci0gICAgICAgIHJlbWFpbmluZ193b3JrZXJzX3RvX3N0YXJ0ID0gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIGdpdmUgdGhlIHN5c3RlbSBzb21lIHRpbWUgdG8gcmVjb3ZlciBiZWZvcmUga2lja2luZyBpbnRvCi0gICAgICAgICogZXhwb25lbnRpYWwgbW9kZSAqLwotICAgICAgICBob2xkX29mZl9vbl9leHBvbmVudGlhbF9zcGF3bmluZyA9IDEwOwotICAgIH0KLQotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwgMCwgYXBfc2VydmVyX2NvbmYsCi0JCSIlcyBjb25maWd1cmVkIC0tIHJlc3VtaW5nIG5vcm1hbCBvcGVyYXRpb25zIiwKLQkJYXBfZ2V0X3NlcnZlcl92ZXJzaW9uKCkpOwotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0lORk8sIDAsIGFwX3NlcnZlcl9jb25mLAotCQkiU2VydmVyIGJ1aWx0OiAlcyIsIGFwX2dldF9zZXJ2ZXJfYnVpbHQoKSk7Ci0gICAgcmVzdGFydF9wZW5kaW5nID0gc2h1dGRvd25fcGVuZGluZyA9IDA7Ci0KLSAgICBwcmludGYoIiVzIFxuIiwgYXBfZ2V0X3NlcnZlcl92ZXJzaW9uKCkpOwotCi0gICAgd2hpbGUgKCFyZXN0YXJ0X3BlbmRpbmcgJiYgIXNodXRkb3duX3BlbmRpbmcpIHsKLSAgICAgICAgaW50IHdvcmtlcl9zbG90OwotICAgICAgICBhcHJfd2FpdF90IHN0YXR1czsKLQotLy8gICAgICAgIC8qIHRoaXMgaXMgYSBtZW1vcnkgbGVhaywgYnV0IEknbGwgZml4IGl0IGxhdGVyLiAqLwotLy8gICAgICAgIGFwcl9wcm9jX3QgcGlkOwotLy8KLS8vICAgICAgICBhcF93YWl0X29yX3RpbWVvdXQoJnN0YXR1cywgJnBpZCwgcGNvbmYpOwotLy8KLS8vICAgICAgICAvKiBYWFg6IGlmIGl0IHRha2VzIGxvbmdlciB0aGFuIDEgc2Vjb25kIGZvciBhbGwgb3VyIGNoaWxkcmVuCi0vLyAgICAgICAgKiB0byBzdGFydCB1cCBhbmQgZ2V0IGludG8gSURMRSBzdGF0ZSB0aGVuIHdlIG1heSBzcGF3biBhbgotLy8gICAgICAgICogZXh0cmEgY2hpbGQKLS8vICAgICAgICAqLwotLy8gICAgICAgIGlmIChwaWQucGlkICE9IC0xKSB7Ci0vLyAgICAgICAgICAgIGFwX3Byb2Nlc3NfY2hpbGRfc3RhdHVzKCZwaWQsIHN0YXR1cyk7Ci0vLyAgICAgICAgICAgIC8qIG5vbi1mYXRhbCBkZWF0aC4uLiBub3RlIHRoYXQgaXQncyBnb25lIGluIHRoZSBzY29yZWJvYXJkLiAqLwotLy8gICAgICAgICAgICBhcF9zeW5jX3Njb3JlYm9hcmRfaW1hZ2UoKTsKLS8vICAgICAgICAgICAgY2hpbGRfc2xvdCA9IGZpbmRfY2hpbGRfYnlfcGlkKCZwaWQpOwotLy8gICAgICAgICAgICBpZiAoY2hpbGRfc2xvdCA+PSAwKSB7Ci0vLyAgICAgICAgICAgICAgICBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKEFQX0NISUxEX1RIUkVBRF9GUk9NX0lEKGNoaWxkX3Nsb3QpLCBXT1JLRVJfREVBRCwKLS8vICAgICAgICAgICAgICAgICAgICAocmVxdWVzdF9yZWMgKikgTlVMTCk7Ci0vLyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nX3dvcmtlcnNfdG9fc3RhcnQgJiYgY2hpbGRfc2xvdCA8IGFwX3RocmVhZHNfbGltaXQpIHsKLS8vICAgICAgICAgICAgICAgICAgICAvKiB3ZSdyZSBzdGlsbCBkb2luZyBhIDEtZm9yLTEgcmVwbGFjZW1lbnQgb2YgZGVhZAotLy8gICAgICAgICAgICAgICAgICAgICogY2hpbGRyZW4gd2l0aCBuZXcgY2hpbGRyZW4KLS8vICAgICAgICAgICAgICAgICAgICAqLwotLy8gICAgICAgICAgICAgICAgICAgIG1ha2VfY2hpbGQoYXBfc2VydmVyX2NvbmYsIGNoaWxkX3Nsb3QpOwotLy8gICAgICAgICAgICAgICAgICAgIC0tcmVtYWluaW5nX3dvcmtlcnNfdG9fc3RhcnQ7Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyNpZiBBUFJfSEFTX09USEVSX0NISUxECi0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgZWxzZSBpZiAoYXByX3Byb2Nfb3RoZXJfY2hpbGRfcmVhZCgmcGlkLCBzdGF0dXMpID09IDApIHsKLS8vICAgICAgICAgICAgLyogaGFuZGxlZCAqLwotLy8jZW5kaWYKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgICBlbHNlIGlmIChpc19ncmFjZWZ1bCkgewotLy8gICAgICAgICAgICAgICAgLyogR3JlYXQsIHdlJ3ZlIHByb2JhYmx5IGp1c3QgbG9zdCBhIHNsb3QgaW4gdGhlCi0vLyAgICAgICAgICAgICAgICAqIHNjb3JlYm9hcmQuICBTb21laG93IHdlIGRvbid0IGtub3cgYWJvdXQgdGhpcwotLy8gICAgICAgICAgICAgICAgKiBjaGlsZC4KLS8vICAgICAgICAgICAgICAgICovCi0vLyAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLCAKLS8vICAgICAgICAgICAgICAgICAgICAwLCBhcF9zZXJ2ZXJfY29uZiwKLS8vICAgICAgICAgICAgICAgICAgICAibG9uZyBsb3N0IGNoaWxkIGNhbWUgaG9tZSEgKHBpZCAlbGQpIiwgKGxvbmcpcGlkLnBpZCk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgLyogRG9uJ3QgcGVyZm9ybSBpZGxlIG1haW50ZW5hbmNlIHdoZW4gYSBjaGlsZCBkaWVzLAotLy8gICAgICAgICAgICAqIG9ubHkgZG8gaXQgd2hlbiB0aGVyZSdzIGEgdGltZW91dC4gIFJlbWVtYmVyIG9ubHkgYQotLy8gICAgICAgICAgICAqIGZpbml0ZSBudW1iZXIgb2YgY2hpbGRyZW4gY2FuIGRpZSwgYW5kIGl0J3MgcHJldHR5Ci0vLyAgICAgICAgICAgICogcGF0aG9sb2dpY2FsIGZvciBhIGxvdCB0byBkaWUgc3VkZGVubHkuCi0vLyAgICAgICAgICAgICovCi0vLyAgICAgICAgICAgIGNvbnRpbnVlOwotLy8gICAgICAgIH0KLS8vICAgICAgICBlbHNlIGlmIChyZW1haW5pbmdfd29ya2Vyc190b19zdGFydCkgewotLy8gICAgICAgICAgICAvKiB3ZSBoaXQgYSAxIHNlY29uZCB0aW1lb3V0IGluIHdoaWNoIG5vbmUgb2YgdGhlIHByZXZpb3VzCi0vLyAgICAgICAgICAgICogZ2VuZXJhdGlvbiBvZiBjaGlsZHJlbiBuZWVkZWQgdG8gYmUgcmVhcGVkLi4uIHNvIGFzc3VtZQotLy8gICAgICAgICAgICAqIHRoZXkncmUgYWxsIGRvbmUsIGFuZCBwaWNrIHVwIHRoZSBzbGFjayBpZiBhbnkgaXMgbGVmdC4KLS8vICAgICAgICAgICAgKi8KLS8vICAgICAgICAgICAgc3RhcnR1cF9jaGlsZHJlbihyZW1haW5pbmdfd29ya2Vyc190b19zdGFydCk7Ci0vLyAgICAgICAgICAgIHJlbWFpbmluZ193b3JrZXJzX3RvX3N0YXJ0ID0gMDsKLS8vICAgICAgICAgICAgLyogSW4gYW55IGV2ZW50IHdlIHJlYWxseSBzaG91bGRuJ3QgZG8gdGhlIGNvZGUgYmVsb3cgYmVjYXVzZQotLy8gICAgICAgICAgICAqIGZldyBvZiB0aGUgc2VydmVycyB3ZSBqdXN0IHN0YXJ0ZWQgYXJlIGluIHRoZSBJRExFIHN0YXRlCi0vLyAgICAgICAgICAgICogeWV0LCBzbyB3ZSdkIG1pc3Rha2VubHkgY3JlYXRlIGFuIGV4dHJhIHNlcnZlci4KLS8vICAgICAgICAgICAgKi8KLS8vICAgICAgICAgICAgY29udGludWU7Ci0vLyAgICAgICAgfQotCi0vLyAgICAgICAgcGVyZm9ybV9pZGxlX3NlcnZlcl9tYWludGVuYW5jZShwY29uZik7Ci0gICAgICAgIGFwcl90aHJlYWRfeWllbGQoKTsKLSAgICB9Ci0KLSAgICBpZiAoc2h1dGRvd25fcGVuZGluZykgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19OT1RJQ0UsIDAsIGFwX3NlcnZlcl9jb25mLAotICAgICAgICAgICAgImNhdWdodCBTSUdURVJNLCBzaHV0dGluZyBkb3duIik7Ci0KLSAgICAgICAgd2hpbGUgKHdvcmtlcl90aHJlYWRfY291bnQgPiAwKQotICAgICAgICAgICAgYXByX3RocmVhZF95aWVsZCgpOwotCi0gICAgICAgIHByaW50ZiAoIlByZXNzIGFueSBrZXkgdG8gY29udGludWUuLi4iKTsKLSAgICAgICAgZ2V0YyhzdGRpbik7Ci0gICAgICAgIHdhaXRfdG9fZmluaXNoID0gMDsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLyogd2UndmUgYmVlbiB0b2xkIHRvIHJlc3RhcnQgKi8KLS8vICAgIGFwcl9zaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKLSAgICBpZiAob25lX3Byb2Nlc3MpIHsKLSAgICAgICAgLyogbm90IHdvcnRoIHRoaW5raW5nIGFib3V0ICovCi0JICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIC8qIGFkdmFuY2UgdG8gdGhlIG5leHQgZ2VuZXJhdGlvbiAqLwotICAgIC8qIFhYWDogd2UgcmVhbGx5IG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgbmV3IGdlbmVyYXRpb24gbnVtYmVyIGlzbid0IGluCi0gICAgICogdXNlIGJ5IGFueSBvZiB0aGUgY2hpbGRyZW4uCi0gICAgICovCi0gICAgKythcF9teV9nZW5lcmF0aW9uOwotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbC5ydW5uaW5nX2dlbmVyYXRpb24gPSBhcF9teV9nZW5lcmF0aW9uOwotICAgIHVwZGF0ZV9zY29yZWJvYXJkX2dsb2JhbCgpOwotICAgIAotICAgIGlmIChpc19ncmFjZWZ1bCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwgMCwgYXBfc2VydmVyX2NvbmYsCi0JCSAgICAiR3JhY2VmdWwgcmVzdGFydCByZXF1ZXN0ZWQsIGRvaW5nIHJlc3RhcnQiKTsKLQotCS8qIGtpbGwgb2ZmIHRoZSBpZGxlIG9uZXMgKi8KLQotI2lmbmRlZiBTQ09SRUJPQVJEX0ZJTEUKLQkvKiBUaGlzIGlzIG1vc3RseSBmb3IgZGVidWdnaW5nLi4uIHNvIHRoYXQgd2Uga25vdyB3aGF0IGlzIHN0aWxsCi0JICAgICogZ3JhY2VmdWxseSBkZWFsaW5nIHdpdGggZXhpc3RpbmcgcmVxdWVzdC4gIEJ1dCB3ZSBjYW4ndCByZWFsbHkKLQkgICAgKiBkbyBpdCBpZiB3ZSdyZSBpbiBhIFNDT1JFQk9BUkRfRklMRSBiZWNhdXNlIGl0J2xsIGNhdXNlCi0JICAgICogY29ycnVwdGlvbiB0b28gZWFzaWx5LgotCSAgICAqLwotCWFwX3N5bmNfc2NvcmVib2FyZF9pbWFnZSgpOwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGFwX3RocmVhZHNfbGltaXQ7ICsraW5kZXgpIHsKLQkgICAgaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbMF1baW5kZXhdLnN0YXR1cyAhPSBXT1JLRVJfREVBRCkgewotCQlhcF9zY29yZWJvYXJkX2ltYWdlLT5zZXJ2ZXJzWzBdW2luZGV4XS5zdGF0dXMgPSBTRVJWRVJfR1JBQ0VGVUw7Ci0JICAgIH0KLQl9Ci0jZW5kaWYKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIEtpbGwgJ2VtIG9mZiAqLwotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19OT1RJQ0UsIDAsIGFwX3NlcnZlcl9jb25mLAotICAgICAgICAgICAgIlNJR0hVUCByZWNlaXZlZC4gIEF0dGVtcHRpbmcgdG8gcmVzdGFydCIpOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBuZXR3YXJlX3ByZV9jb25maWcoYXByX3Bvb2xfdCAqcCwgYXByX3Bvb2xfdCAqcGxvZywgYXByX3Bvb2xfdCAqcHRlbXApCi17Ci0gICAgc3RhdGljIGludCByZXN0YXJ0X251bSA9IDA7Ci0gICAgaW50IG5vX2RldGFjaCwgZGVidWc7Ci0KLSAgICBkZWJ1ZyA9IGFwX2V4aXN0c19jb25maWdfZGVmaW5lKCJERUJVRyIpOwotCi0gICAgaWYgKGRlYnVnKQotICAgICAgICBub19kZXRhY2ggPSBvbmVfcHJvY2VzcyA9IDE7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbm9fZGV0YWNoID0gYXBfZXhpc3RzX2NvbmZpZ19kZWZpbmUoIk5PX0RFVEFDSCIpOwotICAgICAgICBvbmVfcHJvY2VzcyA9IGFwX2V4aXN0c19jb25maWdfZGVmaW5lKCJPTkVfUFJPQ0VTUyIpOwotICAgIH0KLQotICAgIC8qIHNpZ2gsIHdhbnQgdGhpcyBvbmx5IHRoZSBzZWNvbmQgdGltZSBhcm91bmQgKi8KLSAgICBpZiAocmVzdGFydF9udW0rKyA9PSAxKSB7Ci0gICAgICAgIGlzX2dyYWNlZnVsID0gMDsKLQotICAgICAgICBpZiAoIW9uZV9wcm9jZXNzICYmICFub19kZXRhY2gpIHsKLSAgICAgICAgICAgIGFwcl9wcm9jX2RldGFjaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcGFyZW50X3BpZCA9IGFwX215X3BpZCA9IGdldHBpZCgpOwotICAgIH0KLQotICAgIGFwX2xpc3Rlbl9wcmVfY29uZmlnKCk7Ci0gICAgYXBfdGhyZWFkc190b19zdGFydCA9IERFRkFVTFRfU1RBUlRfREFFTU9OOwotICAgIGFwX3RocmVhZHNfbWluX2ZyZWUgPSBERUZBVUxUX01JTl9GUkVFX0RBRU1PTjsKLSAgICBhcF90aHJlYWRzX21heF9mcmVlID0gREVGQVVMVF9NQVhfRlJFRV9EQUVNT047Ci0gICAgYXBfdGhyZWFkc19saW1pdCA9IEhBUkRfVEhSRUFEX0xJTUlUOwotICAgIGFwX3BpZF9mbmFtZSA9IERFRkFVTFRfUElETE9HOwotICAgIGFwX3Njb3JlYm9hcmRfZm5hbWUgPSBERUZBVUxUX1NDT1JFQk9BUkQ7Ci0gICAgYXBfbG9ja19mbmFtZSA9IERFRkFVTFRfTE9DS0ZJTEU7Ci0gICAgYXBfbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCA9IERFRkFVTFRfTUFYX1JFUVVFU1RTX1BFUl9DSElMRDsKLSAgICBhcF9leHRlbmRlZF9zdGF0dXMgPSAwOwotCi0gICAgYXByX2NweXN0cm4oYXBfY29yZWR1bXBfZGlyLCBhcF9zZXJ2ZXJfcm9vdCwgc2l6ZW9mKGFwX2NvcmVkdW1wX2RpcikpOwotfQotCi1zdGF0aWMgdm9pZCBuZXR3YXJlX21wbV9ob29rcyhhcHJfcG9vbF90ICpwKQotewotICAgIGFwX2hvb2tfcHJlX2NvbmZpZyhuZXR3YXJlX3ByZV9jb25maWcsIE5VTEwsIE5VTEwsIEFQUl9IT09LX01JRERMRSk7Ci19Ci0KLXZvaWQgbmV0d2FyZV9yZXdyaXRlX2FyZ3MocHJvY2Vzc19yZWMgKnByb2Nlc3MpIAotewotICAgIGNoYXIgKmRlZl9zZXJ2ZXJfcm9vdDsKLSAgICBjaGFyIG9wdGJ1ZlszXTsKLSAgICBjb25zdCBjaGFyICpvcHRhcmc7Ci0gICAgYXByX2dldG9wdF90ICpvcHQ7Ci0gICAgYXByX2FycmF5X2hlYWRlcl90ICptcG1fbmV3X2FyZ3Y7Ci0KLQotICAgIC8qIFJld3JpdGUgcHJvY2Vzcy0+YXJndltdOyAKLSAgICAgKgotICAgICAqIGFkZCBkZWZhdWx0IC1kIHNlcnZlcnJvb3QgZnJvbSB0aGUgcGF0aCBvZiB0aGlzIGV4ZWN1dGFibGUKLSAgICAgKiAKLSAgICAgKiBUaGUgZW5kIHJlc3VsdCB3aWxsIGxvb2sgbGlrZToKLSAgICAgKiAgICAgVGhlIC1kIHNlcnZlcnJvb3QgZGVmYXVsdCBmcm9tIHRoZSBydW5uaW5nIGV4ZWN1dGFibGUKLSAgICAgKi8KLSAgICBpZiAocHJvY2Vzcy0+YXJnYyA+IDApIHsKLSAgICAgICAgY2hhciAqcyA9IGFwcl9wc3RyZHVwIChwcm9jZXNzLT5wY29uZiwgcHJvY2Vzcy0+YXJndlswXSk7Ci0gICAgICAgIGlmIChzKSB7Ci0gICAgICAgICAgICBpbnQgaSwgbGVuID0gc3RybGVuKHMpOwotCi0gICAgICAgICAgICBmb3IgKGk9bGVuOyBpOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBpZiAoc1tpXSA9PSAnXFwnIHx8IHNbaV0gPT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNbaV0gPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICBhcHJfZmlsZXBhdGhfbWVyZ2UoJmRlZl9zZXJ2ZXJfcm9vdCwgTlVMTCwgcywgCi0gICAgICAgICAgICAgICAgICAgICAgICBBUFJfRklMRVBBVEhfVFJVRU5BTUUsIHByb2Nlc3MtPnBvb2wpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBVc2UgcHJvY2Vzcy0+cG9vbCBzbyB0aGF0IHRoZSByZXdyaXR0ZW4gYXJndgotICAgICAgICAgICAgKiBsYXN0cyBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBzZXJ2ZXIgcHJvY2VzcywKLSAgICAgICAgICAgICogYmVjYXVzZSBwY29uZiB3aWxsIGJlIGRlc3Ryb3llZCBhZnRlciB0aGUgCi0gICAgICAgICAgICAqIGluaXRpYWwgcHJlLWZsaWdodCBvZiB0aGUgY29uZmlnIHBhcnNlci4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBtcG1fbmV3X2FyZ3YgPSBhcHJfYXJyYXlfbWFrZShwcm9jZXNzLT5wb29sLCBwcm9jZXNzLT5hcmdjICsgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY29uc3QgY2hhciAqKSk7Ci0gICAgICAgICAgICAqKGNvbnN0IGNoYXIgKiopYXByX2FycmF5X3B1c2gobXBtX25ld19hcmd2KSA9IHByb2Nlc3MtPmFyZ3ZbMF07Ci0gICAgICAgICAgICAqKGNvbnN0IGNoYXIgKiopYXByX2FycmF5X3B1c2gobXBtX25ld19hcmd2KSA9ICItZCI7Ci0gICAgICAgICAgICAqKGNvbnN0IGNoYXIgKiopYXByX2FycmF5X3B1c2gobXBtX25ld19hcmd2KSA9IGRlZl9zZXJ2ZXJfcm9vdDsKLQotICAgICAgICAgICAgb3B0YnVmWzBdID0gJy0nOwotICAgICAgICAgICAgb3B0YnVmWzJdID0gJ1wwJzsKLSAgICAgICAgICAgIGFwcl9nZXRvcHRfaW5pdCgmb3B0LCBwcm9jZXNzLT5wb29sLCBwcm9jZXNzLT5hcmdjLCAoY2hhcioqKSBwcm9jZXNzLT5hcmd2KTsKLSAgICAgICAgICAgIHdoaWxlIChhcHJfZ2V0b3B0KG9wdCwgQVBfU0VSVkVSX0JBU0VBUkdTLCBvcHRidWYgKyAxLCAmb3B0YXJnKSA9PSBBUFJfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgIHN3aXRjaCAob3B0YnVmWzFdKSB7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgKihjb25zdCBjaGFyICoqKWFwcl9hcnJheV9wdXNoKG1wbV9uZXdfYXJndikgPQotICAgICAgICAgICAgICAgICAgICAgICAgYXByX3BzdHJkdXAocHJvY2Vzcy0+cG9vbCwgb3B0YnVmKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAob3B0YXJnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGNvbnN0IGNoYXIgKiopYXByX2FycmF5X3B1c2gobXBtX25ld19hcmd2KSA9IG9wdGFyZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcm9jZXNzLT5hcmdjID0gbXBtX25ld19hcmd2LT5uZWx0czsgCi0gICAgICAgICAgICBwcm9jZXNzLT5hcmd2ID0gKGNvbnN0IGNoYXIgKiBjb25zdCAqKSBtcG1fbmV3X2FyZ3YtPmVsdHM7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfdGhyZWFkc190b19zdGFydChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNvbnN0IGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgYXBfdGhyZWFkc190b19zdGFydCA9IGF0b2koYXJnKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9taW5fZnJlZV90aHJlYWRzKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY29uc3QgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX3RocmVhZHNfbWluX2ZyZWUgPSBhdG9pKGFyZyk7Ci0gICAgaWYgKGFwX3RocmVhZHNfbWluX2ZyZWUgPD0gMCkgewotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICJXQVJOSU5HOiBkZXRlY3RlZCBNaW5TcGFyZVNlcnZlcnMgc2V0IHRvIG5vbi1wb3NpdGl2ZS4iKTsKLSAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAiUmVzZXR0aW5nIHRvIDEgdG8gYXZvaWQgYWxtb3N0IGNlcnRhaW4gQXBhY2hlIGZhaWx1cmUuIik7Ci0gICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgIlBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uLiIpOwotICAgICAgIGFwX3RocmVhZHNfbWluX2ZyZWUgPSAxOwotICAgIH0KLSAgICAgICAKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9tYXhfZnJlZV90aHJlYWRzKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY29uc3QgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX3RocmVhZHNfbWF4X2ZyZWUgPSBhdG9pKGFyZyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfdGhyZWFkX2xpbWl0IChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNvbnN0IGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgYXBfdGhyZWFkc19saW1pdCA9IGF0b2koYXJnKTsKLSAgICBpZiAoYXBfdGhyZWFkc19saW1pdCA+IEhBUkRfVEhSRUFEX0xJTUlUKSB7Ci0gICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgIldBUk5JTkc6IE1heENsaWVudHMgb2YgJWQgZXhjZWVkcyBjb21waWxlIHRpbWUgbGltaXQgIgotICAgICAgICAgICAgICAgICAgICAib2YgJWQgc2VydmVycywiLCBhcF90aHJlYWRzX2xpbWl0LCBIQVJEX1NFUlZFUl9MSU1JVCk7Ci0gICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgIiBsb3dlcmluZyBNYXhDbGllbnRzIHRvICVkLiAgVG8gaW5jcmVhc2UsIHBsZWFzZSAiCi0gICAgICAgICAgICAgICAgICAgICJzZWUgdGhlIiwgSEFSRF9TRVJWRVJfTElNSVQpOwotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgIiBIQVJEX1NFUlZFUl9MSU1JVCBkZWZpbmUgaW4gJXMuIiwKLSAgICAgICAgICAgICAgICAgICAgQVBfTVBNX0hBUkRfTElNSVRTX0ZJTEUpOwotICAgICAgIGFwX3RocmVhZHNfbGltaXQgPSBIQVJEX1RIUkVBRF9MSU1JVDsKLSAgICB9IAotICAgIGVsc2UgaWYgKGFwX3RocmVhZHNfbGltaXQgPCAxKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAiV0FSTklORzogUmVxdWlyZSBNYXhDbGllbnRzID4gMCwgc2V0dGluZyB0byAxIik7Ci0gICAgICAgIGFwX3RocmVhZHNfbGltaXQgPSAxOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF90aHJlYWRfc3RhY2tzaXplKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICAKLSAgICBhcF90aHJlYWRfc3RhY2tfc2l6ZSA9IGF0b2koYXJnKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIG5ldHdhcmVfbXBtX2NtZHNbXSA9IHsKLUFQX0lOSVRfVEFLRTEoIlRocmVhZFN0YWNrU2l6ZSIsIHNldF90aHJlYWRfc3RhY2tzaXplLCBOVUxMLCBSU1JDX0NPTkYsCi0gICAgICAgICAgICAgICJTdGFjayBzaXplIGVhY2ggY3JlYXRlZCB0aHJlYWQgd2lsbCB1c2UuIiksCi1MSVNURU5fQ09NTUFORFMKLUFQX0lOSVRfVEFLRTEoIlN0YXJ0VGhyZWFkcyIsIHNldF90aHJlYWRzX3RvX3N0YXJ0LCBOVUxMLCBSU1JDX0NPTkYsCi0gICAgICAgICAgICAgICJOdW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgbGF1bmNoZWQgYXQgc2VydmVyIHN0YXJ0dXAiKSwKLUFQX0lOSVRfVEFLRTEoIk1pblNwYXJlVGhyZWFkcyIsIHNldF9taW5fZnJlZV90aHJlYWRzLCBOVUxMLCBSU1JDX0NPTkYsCi0gICAgICAgICAgICAgICJNaW5pbXVtIG51bWJlciBvZiBpZGxlIHRocmVhZHMsIHRvIGhhbmRsZSByZXF1ZXN0IHNwaWtlcyIpLAotQVBfSU5JVF9UQUtFMSgiTWF4U3BhcmVUaHJlYWRzIiwgc2V0X21heF9mcmVlX3RocmVhZHMsIE5VTEwsIFJTUkNfQ09ORiwKLSAgICAgICAgICAgICAgIk1heGltdW0gbnVtYmVyIG9mIGlkbGUgdGhyZWFkcyIpLAotQVBfSU5JVF9UQUtFMSgiTWF4VGhyZWFkcyIsIHNldF90aHJlYWRfbGltaXQsIE5VTEwsIFJTUkNfQ09ORiwKLSAgICAgICAgICAgICAgIk1heGltdW0gbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIGFsaXZlIGF0IHRoZSBzYW1lIHRpbWUiKSwKLXsgTlVMTCB9Ci19OwotCi1tb2R1bGUgQVBfTU9EVUxFX0RFQ0xBUkVfREFUQSBtcG1fbmV0d2FyZV9tb2R1bGUgPSB7Ci0gICAgTVBNMjBfTU9EVUxFX1NUVUZGLAotICAgIG5ldHdhcmVfcmV3cml0ZV9hcmdzLCAgIC8qIGhvb2sgdG8gcnVuIGJlZm9yZSBhcGFjaGUgcGFyc2VzIGFyZ3MgKi8KLSAgICBOVUxMLAkJCSAgICAgICAgLyogY3JlYXRlIHBlci1kaXJlY3RvcnkgY29uZmlnIHN0cnVjdHVyZSAqLwotICAgIE5VTEwsCQkJICAgICAgICAvKiBtZXJnZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgTlVMTCwJCQkgICAgICAgIC8qIGNyZWF0ZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLSAgICBOVUxMLAkJCSAgICAgICAgLyogbWVyZ2UgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIG5ldHdhcmVfbXBtX2NtZHMsICAgICAgIC8qIGNvbW1hbmQgYXByX3RhYmxlX3QgKi8KLSAgICBuZXR3YXJlX21wbV9ob29rcywgICAgICAvKiByZWdpc3RlciBob29rcyAqLwotfTsKZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vcHJlZm9yay8uY3ZzaWdub3JlIGIvc2VydmVyL21wbS9wcmVmb3JrLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYzdhN2MuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9wcmVmb3JrLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYWtlZmlsZQpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9wcmVmb3JrL01ha2VmaWxlLmluIGIvc2VydmVyL21wbS9wcmVmb3JrL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDA4NjA3Li4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vcHJlZm9yay9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQotREVQVEggICAgID0gLi4vLi4vLi4KLXRvcHNyY2RpciA9IEB0b3BzcmNkaXJACi1zcmNkaXIgICAgPSBAc3JjZGlyQAotVlBBVEggICAgID0gQHNyY2RpckAKLQotTFRMSUJSQVJZX05BTUUgICAgPSBsaWJwcmVmb3JrLmxhCi1MVExJQlJBUllfU09VUkNFUyA9IHByZWZvcmsuYwotCi1pbmNsdWRlICQodG9wc3JjZGlyKS9idWlsZC9sdGxpYi5tawpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9wcmVmb3JrL2NvbmZpZy5tNCBiL3NlcnZlci9tcG0vcHJlZm9yay9jb25maWcubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0Y2ZlMzguLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9wcmVmb3JrL2NvbmZpZy5tNAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotaWYgdGVzdCAiJE1QTV9OQU1FIiA9ICJwcmVmb3JrIiA7IHRoZW4KLSAgICBBUEFDSEVfT1VUUFVUKG1vZHVsZXMvbXBtLyRNUE1fTkFNRS9NYWtlZmlsZSkKLQotICAgIEFQQUNIRV9NUE1fQ0hFQ0tfU0hNRU0KLWZpCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL3ByZWZvcmsvbXBtLmggYi9zZXJ2ZXIvbXBtL3ByZWZvcmsvbXBtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmOGVhOTcuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9wcmVmb3JrL21wbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCi0gKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAotICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqLwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJtcG1fZGVmYXVsdC5oIgotI2luY2x1ZGUgInNjb3JlYm9hcmQuaCIKLQotI2lmbmRlZiBBUEFDSEVfTVBNX1BSRUZPUktfSAotI2RlZmluZSBBUEFDSEVfTVBNX1BSRUZPUktfSAotCi0jZGVmaW5lIFBSRUZPUktfTVBNCi0KLWV4dGVybiBpbnQgYXBfbWF4X2RhZW1vbnNfbGltaXQ7Ci1leHRlcm4gc2NvcmVib2FyZCAqYXBfc2NvcmVib2FyZF9pbWFnZTsKLWV4dGVybiBzZXJ2ZXJfcmVjICphcF9zZXJ2ZXJfY29uZjsKLWV4dGVybiBpbnQgYXBfbXlfcGlkOwotI2VuZGlmIC8qIEFQQUNIRV9NUE1fREVYVEVSX0ggKi8KZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vcHJlZm9yay9tcG1fZGVmYXVsdC5oIGIvc2VydmVyL21wbS9wcmVmb3JrL21wbV9kZWZhdWx0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZjlhYzIuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9wcmVmb3JrL21wbV9kZWZhdWx0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyAKLSAqIGFyZSBtZXQ6IAotICogCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gIAotICogCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCAKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAKLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgCi0gKiAgICBkaXN0cmlidXRpb24uIAotICogCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogCi0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwIAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIgCi0gKiAKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8gCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgCi0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4gCi0gKiAKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiIAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLiAKLSAqIAotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZyAKLSAqICAgIGFja25vd2xlZGdtZW50OiAKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAgCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIiAKLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZIAotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSAKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SIAotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCAKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCAKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyAKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIAotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCAKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAotICogCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueSAKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZCAKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciAKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4gCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIAotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uIAotICogCi0gKi8gCi0KLSNpZm5kZWYgQVBBQ0hFX01QTV9ERUZBVUxUX0gKLSNkZWZpbmUgQVBBQ0hFX01QTV9ERUZBVUxUX0gKLQotLyogTnVtYmVyIG9mIHNlcnZlcnMgdG8gc3Bhd24gb2ZmIGJ5IGRlZmF1bHQgLS0tIGFsc28sIGlmIGZld2VyIHRoYW4KLSAqIHRoaXMgZnJlZSB3aGVuIHRoZSBjYXJldGFrZXIgY2hlY2tzLCBpdCB3aWxsIHNwYXduIG1vcmUuCi0gKi8KLSNpZm5kZWYgREVGQVVMVF9TVEFSVF9EQUVNT04KLSNkZWZpbmUgREVGQVVMVF9TVEFSVF9EQUVNT04gNQotI2VuZGlmCi0KLS8qIE1heGltdW0gbnVtYmVyIG9mICpmcmVlKiBzZXJ2ZXIgcHJvY2Vzc2VzIC0tLSBtb3JlIHRoYW4gdGhpcywgYW5kCi0gKiB0aGV5IHdpbGwgZGllIG9mZi4KLSAqLwotCi0jaWZuZGVmIERFRkFVTFRfTUFYX0ZSRUVfREFFTU9OCi0jZGVmaW5lIERFRkFVTFRfTUFYX0ZSRUVfREFFTU9OIDEwCi0jZW5kaWYKLQotLyogTWluaW11bSAtLS0gZmV3ZXIgdGhhbiB0aGlzLCBhbmQgbW9yZSB3aWxsIGJlIGNyZWF0ZWQgKi8KLQotI2lmbmRlZiBERUZBVUxUX01JTl9GUkVFX0RBRU1PTgotI2RlZmluZSBERUZBVUxUX01JTl9GUkVFX0RBRU1PTiA1Ci0jZW5kaWYKLQotLyogTGltaXQgb24gdGhlIHRvdGFsIC0tLSBjbGllbnRzIHdpbGwgYmUgbG9ja2VkIG91dCBpZiBtb3JlIHNlcnZlcnMgdGhhbgotICogdGhpcyBhcmUgbmVlZGVkLiAgSXQgaXMgaW50ZW5kZWQgc29sZWx5IHRvIGtlZXAgdGhlIHNlcnZlciBmcm9tIGNyYXNoaW5nCi0gKiB3aGVuIHRoaW5ncyBnZXQgb3V0IG9mIGhhbmQuCi0gKgotICogV2Uga2VlcCBhIGhhcmQgbWF4aW11bSBudW1iZXIgb2Ygc2VydmVycywgZm9yIHR3byByZWFzb25zIC0tLSBmaXJzdCBvZmYsCi0gKiBpbiBjYXNlIHNvbWV0aGluZyBnb2VzIHNlcmlvdXNseSB3cm9uZywgd2Ugd2FudCB0byBzdG9wIHRoZSBmb3JrIGJvbWIKLSAqIHNob3J0IG9mIGFjdHVhbGx5IGNyYXNoaW5nIHRoZSBtYWNoaW5lIHdlJ3JlIHJ1bm5pbmcgb24gYnkgZmlsbGluZyBzb21lCi0gKiBrZXJuZWwgdGFibGUuICBTZWNvbmRseSwgaXQga2VlcHMgdGhlIHNpemUgb2YgdGhlIHNjb3JlYm9hcmQgZmlsZSBzbWFsbAotICogZW5vdWdoIHRoYXQgd2UgY2FuIHJlYWQgdGhlIHdob2xlIHRoaW5nIHdpdGhvdXQgd29ycnlpbmcgdG9vIG11Y2ggYWJvdXQKLSAqIHRoZSBvdmVyaGVhZC4KLSAqLwotI2lmbmRlZiBIQVJEX1NFUlZFUl9MSU1JVAotI2RlZmluZSBIQVJEX1NFUlZFUl9MSU1JVCAyNTYKLSNlbmRpZgotCi0jZW5kaWYgLyogQVBfTVBNX0RFRkFVTFRfSCAqLwpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9wcmVmb3JrL3ByZWZvcmsuYyBiL3NlcnZlci9tcG0vcHJlZm9yay9wcmVmb3JrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkN2MxOWUuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9wcmVmb3JrL3ByZWZvcmsuYworKysgL2Rldi9udWxsCkBAIC0xLDM1MTQgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogaHR0cGQuYzogc2ltcGxlIGh0dHAgZGFlbW9uIGZvciBhbnN3ZXJpbmcgV1dXIGZpbGUgcmVxdWVzdHMKLSAqCi0gKiAKLSAqIDAzLTIxLTkzICBSb2IgTWNDb29sIHdyb3RlIG9yaWdpbmFsIGNvZGUgKHVwIHRvIE5DU0EgSFRUUGQgMS4zKQotICogCi0gKiAwMy0wNi05NSAgYmxvbmcKLSAqICBjaGFuZ2VkIHNlcnZlciBudW1iZXIgZm9yIGNoaWxkLWFsb25lIHByb2Nlc3NlcyB0byAwIGFuZCBjaGFuZ2VkIG5hbWUKLSAqICAgb2YgcHJvY2Vzc2VzCi0gKgotICogMDMtMTAtOTUgIGJsb25nCi0gKiAgICAgIEFkZGVkIG51bWVyb3VzIHNwZWVkIGhhY2tzIHByb3Bvc2VkIGJ5IFJvYmVydCBTLiBUaGF1IChyc3RAYWkubWl0LmVkdSkgCi0gKiAgICAgIGluY2x1ZGluZyBzZXQgZ3JvdXAgYmVmb3JlIGZvcmssIGFuZCBjYWxsIGdldHRpbWUgYmVmb3JlIHRvIGZvcmsKLSAqICAgICAgdG8gc2V0IHVwIGxpYnJhcmllcy4KLSAqCi0gKiAwNC0xNC05NSAgcnN0IC8gcmgKLSAqICAgICAgQnJhbmRvbidzIGNvZGUgc25hcmZlZCBmcm9tIE5DU0EgMS40LCBidXQgdGlua2VyZWQgdG8gd29yayB3aXRoIHRoZQotICogICAgICBBcGFjaGUgc2VydmVyLCBhbmQgYWxzbyB0byBoYXZlIGNoaWxkIHByb2Nlc3NlcyBkbyBhY2NlcHQoKSBkaXJlY3RseS4KLSAqCi0gKiBBcHJpbC1KdWx5ICc5NSByc3QKLSAqICAgICAgRXh0ZW5zaXZlIHJld29yayBmb3IgQXBhY2hlLgotICovCi0KLS8qIFRPRE86IHRoaXMgaXMgYSBjb2JibGVkIHRvZ2V0aGVyIHByZWZvcmsgTVBNIGV4YW1wbGUuLi4gaXQgc2hvdWxkIG1vc3RseQotICogVE9ETzogYmVoYXZlIGxpa2UgYXBhY2hlLTEuMy4uLiBoZXJlJ3MgYSBzaG9ydCBsaXN0IG9mIHRoaW5ncyBJIHRoaW5rCi0gKiBUT0RPOiBuZWVkIGNsZWFuaW5nIHVwIHN0aWxsOgotICogVE9ETzogLSB1c2UgcmFsZidzIG1tIHN0dWZmIGZvciB0aGUgc2hhcmVkIG1lbSBhbmQgbXV0ZXhlcwotICogVE9ETzogLSBhYnN0cmFjdCB0aGUgTGlzdGVuIHN0dWZmLCBpdCdzIGdvaW5nIHRvIGJlIGNvbW1vbiB3aXRoIG90aGVyIE1QTQotICogVE9ETzogLSBjbGVhbiB1cCBzY29yZWJvYXJkIHN0dWZmIHdoZW4gd2UgZmlndXJlIG91dCBob3cgdG8gZG8gaXQgaW4gMi4wCi0gKi8KLQotI2RlZmluZSBDT1JFX1BSSVZBVEUKLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgkJLyogZm9yIGdldF9yZW1vdGVfaG9zdCAqLwotI2luY2x1ZGUgImh0dHBfY29ubmVjdGlvbi5oIgotI2luY2x1ZGUgInNjb3JlYm9hcmRfcHJlZm9yay5oIgotI2luY2x1ZGUgImFwX21wbS5oIgotI2luY2x1ZGUgInVuaXhkLmgiCi0jaWZkZWYgVVNFX1NITUdFVF9TQ09SRUJPQVJECi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL2lwYy5oPgotI2luY2x1ZGUgPHN5cy9zaG0uaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9CU1RSSU5HX0gKLSNpbmNsdWRlIDxic3RyaW5nLmg+CQkvKiBmb3IgSVJJWCwgRkRfU0VUIGNhbGxzIGJ6ZXJvKCkgKi8KLSNlbmRpZgotCi0vKiBjb25maWcgZ2xvYmFscyAqLwotCi1zdGF0aWMgaW50IGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQ9MDsKLXN0YXRpYyBjaGFyICphcF9waWRfZm5hbWU9TlVMTDsKLXN0YXRpYyBjaGFyICphcF9zY29yZWJvYXJkX2ZuYW1lPU5VTEw7Ci1zdGF0aWMgY2hhciAqYXBfbG9ja19mbmFtZTsKLXN0YXRpYyBjaGFyICphcF9zZXJ2ZXJfYXJndjA9TlVMTDsKLXN0YXRpYyBzdHJ1Y3QgaW5fYWRkciBhcF9iaW5kX2FkZHJlc3M7Ci1zdGF0aWMgaW50IGFwX2RhZW1vbnNfdG9fc3RhcnQ9MDsKLXN0YXRpYyBpbnQgYXBfZGFlbW9uc19taW5fZnJlZT0wOwotc3RhdGljIGludCBhcF9kYWVtb25zX21heF9mcmVlPTA7Ci1zdGF0aWMgaW50IGFwX2RhZW1vbnNfbGltaXQ9MDsKLXN0YXRpYyB0aW1lX3QgYXBfcmVzdGFydF90aW1lPTA7Ci1zdGF0aWMgaW50IGFwX2xpc3RlbmJhY2tsb2c7Ci1zdGF0aWMgaW50IGFwX2V4dGVuZGVkX3N0YXR1cyA9IDA7Ci0KLS8qCi0gKiBUaGUgbWF4IGNoaWxkIHNsb3QgZXZlciBhc3NpZ25lZCwgcHJlc2VydmVkIGFjcm9zcyByZXN0YXJ0cy4gIE5lY2Vzc2FyeQotICogdG8gZGVhbCB3aXRoIE1heENsaWVudHMgY2hhbmdlcyBhY3Jvc3MgU0lHVVNSMSByZXN0YXJ0cy4gIFdlIHVzZSB0aGlzCi0gKiB2YWx1ZSB0byBvcHRpbWl6ZSByb3V0aW5lcyB0aGF0IGhhdmUgdG8gc2NhbiB0aGUgZW50aXJlIHNjb3JlYm9hcmQuCi0gKi8KLXN0YXRpYyBpbnQgbWF4X2RhZW1vbnNfbGltaXQgPSAtMTsKLQotLyoKLSAqIER1cmluZyBjb25maWcgdGltZSwgbGlzdGVuZXJzIGlzIHRyZWF0ZWQgYXMgYSBOVUxMLXRlcm1pbmF0ZWQgbGlzdC4KLSAqIGNoaWxkX21haW4gcHJldmlvdXNseSB3b3VsZCBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0IGVhY2ggdGltZQotICogdGhyb3VnaCB0aGUgbG9vcCwgc28gYSBzb2NrZXQgZWFybHkgb24gaW4gdGhlIGxpc3QgY291bGQgZWFzaWx5IHN0YXJ2ZSBvdXQKLSAqIHNvY2tldHMgbGF0ZXIgb24gaW4gdGhlIGxpc3QuICBUaGUgc29sdXRpb24gaXMgdG8gc3RhcnQgYXQgdGhlIGxpc3RlbmVyCi0gKiBhZnRlciB0aGUgbGFzdCBvbmUgcHJvY2Vzc2VkLiAgQnV0IHRvIGRvIHRoYXQgZmFzdC9lYXNpbHkgaW4gY2hpbGRfbWFpbiBpdCdzCi0gKiB3YXkgbW9yZSBjb252ZW5pZW50IGZvciBsaXN0ZW5lcnMgdG8gYmUgYSByaW5nIHRoYXQgbG9vcHMgYmFjayBvbiBpdHNlbGYuCi0gKiBUaGUgcm91dGluZSBzZXR1cF9saXN0ZW5lcnMoKSBpcyBjYWxsZWQgYWZ0ZXIgY29uZmlnIHRpbWUgdG8gYm90aCBvcGVuIHVwCi0gKiB0aGUgc29ja2V0cyBhbmQgdG8gdHVybiB0aGUgTlVMTC10ZXJtaW5hdGVkIGxpc3QgaW50byBhIHJpbmcgdGhhdCBsb29wcyBiYWNrCi0gKiBvbiBpdHNlbGYuCi0gKgotICogaGVhZF9saXN0ZW5lciBpcyB1c2VkIGJ5IGVhY2ggY2hpbGQgdG8ga2VlcCB0cmFjayBvZiB3aGF0IHRoZXkgY29uc2lkZXIKLSAqIHRvIGJlIHRoZSAic3RhcnQiIG9mIHRoZSByaW5nLiAgSXQgaXMgYWxzbyBzZXQgYnkgbWFrZV9jaGlsZCB0byBlbnN1cmUKLSAqIHRoYXQgbmV3IGNoaWxkcmVuIGFsc28gZG9uJ3Qgc3RhcnZlIGFueSBzb2NrZXRzLgotICoKLSAqIE5vdGUgdGhhdCBsaXN0ZW5lcnMgIT0gTlVMTCBpcyBlbnN1cmVkIGJ5IHJlYWRfY29uZmlnKCkuCi0gKi8KLXN0YXRpYyBsaXN0ZW5fcmVjICphcF9saXN0ZW5lcnM7Ci1zdGF0aWMgbGlzdGVuX3JlYyAqaGVhZF9saXN0ZW5lcjsKLQotc3RhdGljIGNoYXIgYXBfY29yZWR1bXBfZGlyW01BWF9TVFJJTkdfTEVOXTsKLQotLyogKk5vbiotc2hhcmVkIGh0dHBfbWFpbiBnbG9iYWxzLi4uICovCi0KLXN0YXRpYyBzZXJ2ZXJfcmVjICpzZXJ2ZXJfY29uZjsKLXN0YXRpYyBpbnQgc2Q7Ci1zdGF0aWMgZmRfc2V0IGxpc3RlbmZkczsKLXN0YXRpYyBpbnQgbGlzdGVubWF4ZmQ7Ci0KLS8qIG9uZV9wcm9jZXNzIC0tLSBkZWJ1Z2dpbmcgbW9kZSB2YXJpYWJsZTsgY2FuIGJlIHNldCBmcm9tIHRoZSBjb21tYW5kIGxpbmUKLSAqIHdpdGggdGhlIC1YIGZsYWcuICBJZiBzZXQsIHRoaXMgZ2V0cyB5b3UgdGhlIGNoaWxkX21haW4gbG9vcCBydW5uaW5nCi0gKiBpbiB0aGUgcHJvY2VzcyB3aGljaCBvcmlnaW5hbGx5IHN0YXJ0ZWQgdXAgKG5vIGRldGFjaCwgbm8gbWFrZV9jaGlsZCksCi0gKiB3aGljaCBpcyBhIHByZXR0eSBuaWNlIGRlYnVnZ2luZyBlbnZpcm9ubWVudC4gIChZb3UnbGwgZ2V0IGEgU0lHSFVQCi0gKiBlYXJseSBpbiBzdGFuZGFsb25lX21haW47IGp1c3QgY29udGludWUgdGhyb3VnaC4gIFRoaXMgaXMgdGhlIHNlcnZlcgotICogdHJ5aW5nIHRvIGtpbGwgb2ZmIGFueSBjaGlsZCBwcm9jZXNzZXMgd2hpY2ggaXQgbWlnaHQgaGF2ZSBseWluZwotICogYXJvdW5kIC0tLSBBcGFjaGUgZG9lc24ndCBrZWVwIHRyYWNrIG9mIHRoZWlyIHBpZHMsIGl0IGp1c3Qgc2VuZHMKLSAqIFNJR0hVUCB0byB0aGUgcHJvY2VzcyBncm91cCwgaWdub3JpbmcgaXQgaW4gdGhlIHJvb3QgcHJvY2Vzcy4KLSAqIENvbnRpbnVlIHRocm91Z2ggYW5kIHlvdSdsbCBiZSBmaW5lLikuCi0gKi8KLQotc3RhdGljIGludCBvbmVfcHJvY2VzcyA9IDA7Ci0KLSNpZmRlZiBIQVNfT1RIRVJfQ0hJTEQKLS8qIHVzZWQgdG8gbWFpbnRhaW4gbGlzdCBvZiBjaGlsZHJlbiB3aGljaCBhcmVuJ3QgcGFydCBvZiB0aGUgc2NvcmVib2FyZCAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3RoZXJfY2hpbGRfcmVjIG90aGVyX2NoaWxkX3JlYzsKLXN0cnVjdCBvdGhlcl9jaGlsZF9yZWMgewotICAgIG90aGVyX2NoaWxkX3JlYyAqbmV4dDsKLSAgICBpbnQgcGlkOwotICAgIHZvaWQgKCptYWludGVuYW5jZSkgKGludCwgdm9pZCAqLCBhcF93YWl0X3QpOwotICAgIHZvaWQgKmRhdGE7Ci0gICAgaW50IHdyaXRlX2ZkOwotfTsKLXN0YXRpYyBvdGhlcl9jaGlsZF9yZWMgKm90aGVyX2NoaWxkcmVuOwotI2VuZGlmCi0KLXN0YXRpYyBwb29sICpwY29uZjsJCS8qIFBvb2wgZm9yIGNvbmZpZyBzdHVmZiAqLwotc3RhdGljIHBvb2wgKnBjaGlsZDsJCS8qIFBvb2wgZm9yIGh0dHBkIGNoaWxkIHN0dWZmICovCi0KLXN0YXRpYyBpbnQgbXlfcGlkOwkvKiBpdCBzZWVtcyBzaWxseSB0byBjYWxsIGdldHBpZCBhbGwgdGhlIHRpbWUgKi8KLSNpZm5kZWYgTVVMVElUSFJFQUQKLXN0YXRpYyBpbnQgbXlfY2hpbGRfbnVtOwotI2VuZGlmCi0KLSNpZmRlZiBUUEYKLWludCB0cGZfY2hpbGQgPSAwOwotY2hhciB0cGZfc2VydmVyX25hbWVbSU5FVERfU0VSVk5BTUVfTEVOR1RIKzFdOwotI2VuZGlmIC8qIFRQRiAqLwotCi1zdGF0aWMgc2NvcmVib2FyZCAqYXBfc2NvcmVib2FyZF9pbWFnZSA9IE5VTEw7Ci0KLXN0YXRpYyBpbnQgdm9sYXRpbGUgZXhpdF9hZnRlcl91bmJsb2NrID0gMDsKLQotI2lmZGVmIEdQUk9GCi0vKiAKLSAqIGNoYW5nZSBkaXJlY3RvcnkgZm9yIGdwcm9mIHRvIHBsb3AgdGhlIGdtb24ub3V0IGZpbGUKLSAqIGNvbmZpZ3VyZSBpbiBodHRwZC5jb25mOgotICogR3Byb2ZEaXIgbG9ncy8gICAtPiAkU2VydmVyUm9vdC9sb2dzL2dtb24ub3V0Ci0gKiBHcHJvZkRpciBsb2dzLyUgIC0+ICRTZXJ2ZXJSb290L2xvZ3MvZ3Byb2YuJHBpZC9nbW9uLm91dAotICovCi1zdGF0aWMgdm9pZCBjaGRpcl9mb3JfZ3Byb2Yodm9pZCkKLXsKLSAgICBjb3JlX3NlcnZlcl9jb25maWcgKnNjb25mID0gCi0JYXBfZ2V0X21vZHVsZV9jb25maWcoc2VydmVyX2NvbmYtPm1vZHVsZV9jb25maWcsICZjb3JlX21vZHVsZSk7ICAgIAotICAgIGNoYXIgKmRpciA9IHNjb25mLT5ncHJvZl9kaXI7Ci0KLSAgICBpZihkaXIpIHsKLQljaGFyIGJ1Zls1MTJdOwotCWludCBsZW4gPSBzdHJsZW4oc2NvbmYtPmdwcm9mX2RpcikgLSAxOwotCWlmKCooZGlyICsgbGVuKSA9PSAnJScpIHsKLQkgICAgZGlyW2xlbl0gPSAnXDAnOwotCSAgICBhcF9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXNncHJvZi4lZCIsIGRpciwgKGludClnZXRwaWQoKSk7Ci0JfSAKLQlkaXIgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShwY29uZiwgYnVmWzBdID8gYnVmIDogZGlyKTsKLQlpZihta2RpcihkaXIsIDA3NTUpIDwgMCAmJiBlcnJubyAhPSBFRVhJU1QpIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgc2VydmVyX2NvbmYsCi0JCQkgImdwcm9mOiBlcnJvciBjcmVhdGluZyBkaXJlY3RvcnkgJXMiLCBkaXIpOwotCX0KLSAgICB9Ci0gICAgZWxzZSB7Ci0JZGlyID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocGNvbmYsICJsb2dzIik7Ci0gICAgfQotCi0gICAgY2hkaXIoZGlyKTsKLX0KLSNlbHNlCi0jZGVmaW5lIGNoZGlyX2Zvcl9ncHJvZigpCi0jZW5kaWYKLQotLyogYSBjbGVhbiBleGl0IGZyb20gYSBjaGlsZCB3aXRoIHByb3BlciBjbGVhbnVwICovCi1zdGF0aWMgdm9pZCBjbGVhbl9jaGlsZF9leGl0KGludCBjb2RlKSBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKTsKLXN0YXRpYyB2b2lkIGNsZWFuX2NoaWxkX2V4aXQoaW50IGNvZGUpCi17Ci0gICAgaWYgKHBjaGlsZCkgewotCWFwX2Rlc3Ryb3lfcG9vbChwY2hpbGQpOwotICAgIH0KLSAgICBjaGRpcl9mb3JfZ3Byb2YoKTsKLSAgICBleGl0KGNvZGUpOwotfQotCi0jaWYgZGVmaW5lZChVU0VfRkNOVExfU0VSSUFMSVpFRF9BQ0NFUFQpIHx8IGRlZmluZWQoVVNFX0ZMT0NLX1NFUklBTElaRURfQUNDRVBUKQotc3RhdGljIHZvaWQgZXhwYW5kX2xvY2tfZm5hbWUocG9vbCAqcCkKLXsKLSAgICAvKiBYWFhYIHBvc3NpYmx5IGJvZ3VzIGNhc3QgKi8KLSAgICBhcF9sb2NrX2ZuYW1lID0gYXBfcHNwcmludGYocCwgIiVzLiVsdSIsCi0JYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocCwgYXBfbG9ja19mbmFtZSksICh1bnNpZ25lZCBsb25nKWdldHBpZCgpKTsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoVVNFX1VTTE9DS19TRVJJQUxJWkVEX0FDQ0VQVCkKLQotI2luY2x1ZGUgPHVsb2Nrcy5oPgotCi1zdGF0aWMgdWxvY2tfdCB1c2xvY2sgPSBOVUxMOwotCi0jZGVmaW5lIGFjY2VwdF9tdXRleF9jaGlsZF9pbml0KHgpCi0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9pbml0KHBvb2wgKnApCi17Ci0gICAgcHRyZGlmZl90IG9sZDsKLSAgICB1c3B0cl90ICp1czsKLQotCi0gICAgLyogZGVmYXVsdCBpcyA4LCBhbGxvY2F0ZSBlbm91Z2ggZm9yIGFsbCB0aGUgY2hpbGRyZW4gcGx1cyB0aGUgcGFyZW50ICovCi0gICAgaWYgKChvbGQgPSB1c2NvbmZpZyhDT05GX0lOSVRVU0VSUywgSEFSRF9TRVJWRVJfTElNSVQgKyAxKSkgPT0gLTEpIHsKLQlwZXJyb3IoInVzY29uZmlnKENPTkZfSU5JVFVTRVJTKSIpOwotCWV4aXQoLTEpOwotICAgIH0KLQotICAgIGlmICgob2xkID0gdXNjb25maWcoQ09ORl9MT0NLVFlQRSwgVVNfTk9ERUJVRykpID09IC0xKSB7Ci0JcGVycm9yKCJ1c2NvbmZpZyhDT05GX0xPQ0tUWVBFKSIpOwotCWV4aXQoLTEpOwotICAgIH0KLSAgICBpZiAoKG9sZCA9IHVzY29uZmlnKENPTkZfQVJFTkFUWVBFLCBVU19TSEFSRURPTkxZKSkgPT0gLTEpIHsKLQlwZXJyb3IoInVzY29uZmlnKENPTkZfQVJFTkFUWVBFKSIpOwotCWV4aXQoLTEpOwotICAgIH0KLSAgICBpZiAoKHVzID0gdXNpbml0KCIvZGV2L3plcm8iKSkgPT0gTlVMTCkgewotCXBlcnJvcigidXNpbml0Iik7Ci0JZXhpdCgtMSk7Ci0gICAgfQotCi0gICAgaWYgKCh1c2xvY2sgPSB1c25ld2xvY2sodXMpKSA9PSBOVUxMKSB7Ci0JcGVycm9yKCJ1c25ld2xvY2siKTsKLQlleGl0KC0xKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9vbih2b2lkKQotewotICAgIHN3aXRjaCAodXNzZXRsb2NrKHVzbG9jaykpIHsKLSAgICBjYXNlIDE6Ci0JLyogZ290IGxvY2sgKi8KLQlicmVhazsKLSAgICBjYXNlIDA6Ci0JZnByaW50ZihzdGRlcnIsICJkaWRuJ3QgZ2V0IGxvY2tcbiIpOwotCWNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotICAgIGNhc2UgLTE6Ci0JcGVycm9yKCJ1c3NldGxvY2siKTsKLQljbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9vZmYodm9pZCkKLXsKLSAgICBpZiAodXN1bnNldGxvY2sodXNsb2NrKSA9PSAtMSkgewotCXBlcnJvcigidXN1bnNldGxvY2siKTsKLQljbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci19Ci0KLSNlbGlmIGRlZmluZWQgKFVTRV9QVEhSRUFEX1NFUklBTElaRURfQUNDRVBUKQotCi0vKiBUaGlzIGNvZGUgcHJvYmFibHkgb25seSB3b3JrcyBvbiBTb2xhcmlzIC4uLiBidXQgaXQgd29ya3MgcmVhbGx5IGZhc3QKLSAqIG9uIFNvbGFyaXMuICBOb3RlIHRoYXQgcHRocmVhZCBtdXRleGVzIGFyZSAqTk9UKiByZWxlYXNlZCB3aGVuIGEgdGFzawotICogZGllcyAuLi4gdGhlIHRhc2sgaGFzIHRvIGZyZWUgaXQgaXRzZWxmLiAgU28gd2UgYmxvY2sgc2lnbmFscyBhbmQKLSAqIHRyeSB0byBiZSBuaWNlIGFib3V0IHJlbGVhc2luZyB0aGUgbXV0ZXguCi0gKi8KLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCAqYWNjZXB0X211dGV4ID0gKHZvaWQgKikoY2FkZHJfdCkgLTE7Ci1zdGF0aWMgaW50IGhhdmVfYWNjZXB0X211dGV4Owotc3RhdGljIHNpZ3NldF90IGFjY2VwdF9ibG9ja19tYXNrOwotc3RhdGljIHNpZ3NldF90IGFjY2VwdF9wcmV2aW91c19tYXNrOwotCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfY2hpbGRfY2xlYW51cCh2b2lkICpmb28pCi17Ci0gICAgaWYgKGFjY2VwdF9tdXRleCAhPSAodm9pZCAqKShjYWRkcl90KS0xCi0JJiYgaGF2ZV9hY2NlcHRfbXV0ZXgpIHsKLQlwdGhyZWFkX211dGV4X3VubG9jayhhY2NlcHRfbXV0ZXgpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X2NoaWxkX2luaXQocG9vbCAqcCkKLXsKLSAgICBhcF9yZWdpc3Rlcl9jbGVhbnVwKHAsIE5VTEwsIGFjY2VwdF9tdXRleF9jaGlsZF9jbGVhbnVwLCBhcF9udWxsX2NsZWFudXApOwotfQotCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfY2xlYW51cCh2b2lkICpmb28pCi17Ci0gICAgaWYgKGFjY2VwdF9tdXRleCAhPSAodm9pZCAqKShjYWRkcl90KS0xCi0JJiYgbXVubWFwKChjYWRkcl90KSBhY2NlcHRfbXV0ZXgsIHNpemVvZigqYWNjZXB0X211dGV4KSkpIHsKLQlwZXJyb3IoIm11bm1hcCIpOwotICAgIH0KLSAgICBhY2NlcHRfbXV0ZXggPSAodm9pZCAqKShjYWRkcl90KS0xOwotfQotCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfaW5pdChwb29sICpwKQotewotICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgbWF0dHI7Ci0gICAgaW50IGZkOwotCi0gICAgZmQgPSBvcGVuKCIvZGV2L3plcm8iLCBPX1JEV1IpOwotICAgIGlmIChmZCA9PSAtMSkgewotCXBlcnJvcigib3BlbigvZGV2L3plcm8pIik7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIGFjY2VwdF9tdXRleCA9IChwdGhyZWFkX211dGV4X3QgKikgbW1hcCgoY2FkZHJfdCkgMCwgc2l6ZW9mKCphY2NlcHRfbXV0ZXgpLAotCQkJCSBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBmZCwgMCk7Ci0gICAgaWYgKGFjY2VwdF9tdXRleCA9PSAodm9pZCAqKSAoY2FkZHJfdCkgLSAxKSB7Ci0JcGVycm9yKCJtbWFwIik7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIGNsb3NlKGZkKTsKLSAgICBpZiAoKGVycm5vID0gcHRocmVhZF9tdXRleGF0dHJfaW5pdCgmbWF0dHIpKSkgewotCXBlcnJvcigicHRocmVhZF9tdXRleGF0dHJfaW5pdCIpOwotCWV4aXQoQVBFWElUX0lOSVQpOwotICAgIH0KLSAgICBpZiAoKGVycm5vID0gcHRocmVhZF9tdXRleGF0dHJfc2V0cHNoYXJlZCgmbWF0dHIsCi0JCQkJCQlQVEhSRUFEX1BST0NFU1NfU0hBUkVEKSkpIHsKLQlwZXJyb3IoInB0aHJlYWRfbXV0ZXhhdHRyX3NldHBzaGFyZWQiKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0gICAgaWYgKChlcnJubyA9IHB0aHJlYWRfbXV0ZXhfaW5pdChhY2NlcHRfbXV0ZXgsICZtYXR0cikpKSB7Ci0JcGVycm9yKCJwdGhyZWFkX211dGV4X2luaXQiKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0gICAgc2lnZmlsbHNldCgmYWNjZXB0X2Jsb2NrX21hc2spOwotICAgIHNpZ2RlbHNldCgmYWNjZXB0X2Jsb2NrX21hc2ssIFNJR0hVUCk7Ci0gICAgc2lnZGVsc2V0KCZhY2NlcHRfYmxvY2tfbWFzaywgU0lHVEVSTSk7Ci0gICAgc2lnZGVsc2V0KCZhY2NlcHRfYmxvY2tfbWFzaywgU0lHVVNSMSk7Ci0gICAgYXBfcmVnaXN0ZXJfY2xlYW51cChwLCBOVUxMLCBhY2NlcHRfbXV0ZXhfY2xlYW51cCwgYXBfbnVsbF9jbGVhbnVwKTsKLX0KLQotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X29uKHZvaWQpCi17Ci0gICAgaW50IGVycjsKLQotICAgIGlmIChzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZhY2NlcHRfYmxvY2tfbWFzaywgJmFjY2VwdF9wcmV2aW91c19tYXNrKSkgewotCXBlcnJvcigic2lncHJvY21hc2soU0lHX0JMT0NLKSIpOwotCWNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotICAgIH0KLSAgICBpZiAoKGVyciA9IHB0aHJlYWRfbXV0ZXhfbG9jayhhY2NlcHRfbXV0ZXgpKSkgewotCWVycm5vID0gZXJyOwotCXBlcnJvcigicHRocmVhZF9tdXRleF9sb2NrIik7Ci0JY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotICAgIGhhdmVfYWNjZXB0X211dGV4ID0gMTsKLX0KLQotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X29mZih2b2lkKQotewotICAgIGludCBlcnI7Ci0KLSAgICBpZiAoKGVyciA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKGFjY2VwdF9tdXRleCkpKSB7Ci0JZXJybm8gPSBlcnI7Ci0JcGVycm9yKCJwdGhyZWFkX211dGV4X3VubG9jayIpOwotCWNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotICAgIH0KLSAgICAvKiBUaGVyZSBpcyBhIHNsaWdodCByYWNlIGNvbmRpdGlvbiByaWdodCBoZXJlLi4uIGlmIHdlIHdlcmUgdG8gZGllIHJpZ2h0Ci0gICAgICogbm93LCB3ZSdkIGRvIGFub3RoZXIgcHRocmVhZF9tdXRleF91bmxvY2suICBOb3csIGRvaW5nIHRoYXQgd291bGQgbGV0Ci0gICAgICogYW5vdGhlciBwcm9jZXNzIGludG8gdGhlIG11dGV4LiAgcHRocmVhZCBtdXRleGVzIGFyZSBkZXNpZ25lZCB0byBiZQotICAgICAqIGZhc3QsIGFzIHN1Y2ggdGhleSBkb24ndCBoYXZlIHByb3RlY3Rpb24gZm9yIHRoaW5ncyBsaWtlIHRlc3RpbmcgaWYgdGhlCi0gICAgICogdGhyZWFkIG93bmluZyBhIG11dGV4IGlzIGFjdHVhbGx5IHVubG9ja2luZyBpdCAob3IgZXZlbiBhbnkgd2F5IG9mCi0gICAgICogdGVzdGluZyB3aG8gb3ducyB0aGUgbXV0ZXgpLgotICAgICAqCi0gICAgICogSWYgd2Ugd2VyZSB0byB1bnNldCBoYXZlX2FjY2VwdF9tdXRleCBwcmlvciB0byByZWxlYXNpbmcgdGhlIG11dGV4Ci0gICAgICogdGhlbiB0aGUgcmFjZSBjb3VsZCByZXN1bHQgaW4gdGhlIHNlcnZlciB1bmFibGUgdG8gc2VydmUgaGl0cy4gIERvaW5nCi0gICAgICogaXQgdGhpcyB3YXkgbWVhbnMgdGhhdCB0aGUgc2VydmVyIGNhbiBjb250aW51ZSwgYnV0IGFuIGFkZGl0aW9uYWwKLSAgICAgKiBjaGlsZCBtaWdodCBiZSBpbiB0aGUgY3JpdGljYWwgc2VjdGlvbiAuLi4gYXQgbGVhc3QgaXQncyBzdGlsbCBzZXJ2aW5nCi0gICAgICogaGl0cy4KLSAgICAgKi8KLSAgICBoYXZlX2FjY2VwdF9tdXRleCA9IDA7Ci0gICAgaWYgKHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmYWNjZXB0X3ByZXZpb3VzX21hc2ssIE5VTEwpKSB7Ci0JcGVycm9yKCJzaWdwcm9jbWFzayhTSUdfU0VUTUFTSykiKTsKLQljbGVhbl9jaGlsZF9leGl0KDEpOwotICAgIH0KLX0KLQotI2VsaWYgZGVmaW5lZCAoVVNFX1NZU1ZTRU1fU0VSSUFMSVpFRF9BQ0NFUFQpCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvaXBjLmg+Ci0jaW5jbHVkZSA8c3lzL3NlbS5oPgotCi0jaWZkZWYgTkVFRF9VTklPTl9TRU1VTgotLyogaXQgbWFrZXMgbm8gc2Vuc2UsIGJ1dCB0aGlzIGlzbid0IGRlZmluZWQgb24gc29sYXJpcyAqLwotdW5pb24gc2VtdW4gewotICAgIGxvbmcgdmFsOwotICAgIHN0cnVjdCBzZW1pZF9kcyAqYnVmOwotICAgIHVzaG9ydCAqYXJyYXk7Ci19OwotCi0jZW5kaWYKLQotc3RhdGljIGludCBzZW1faWQgPSAtMTsKLXN0YXRpYyBzdHJ1Y3Qgc2VtYnVmIG9wX29uOwotc3RhdGljIHN0cnVjdCBzZW1idWYgb3Bfb2ZmOwotCi0vKiBXZSBnZXQgYSByYW5kb20gc2VtYXBob3JlIC4uLiB0aGUgbGFtZSBzeXN2IHNlbWFwaG9yZSBpbnRlcmZhY2UKLSAqIG1lYW5zIHdlIGhhdmUgdG8gYmUgc3VyZSB0byBjbGVhbiB0aGlzIHVwIG9yIGVsc2Ugd2UnbGwgbGVhawotICogc2VtYXBob3Jlcy4KLSAqLwotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X2NsZWFudXAodm9pZCAqZm9vKQotewotICAgIHVuaW9uIHNlbXVuIGljazsKLQotICAgIGlmIChzZW1faWQgPCAwKQotCXJldHVybjsKLSAgICAvKiB0aGlzIGlzIGlnbm9yZWQgYW55aG93ICovCi0gICAgaWNrLnZhbCA9IDA7Ci0gICAgc2VtY3RsKHNlbV9pZCwgMCwgSVBDX1JNSUQsIGljayk7Ci19Ci0KLSNkZWZpbmUgYWNjZXB0X211dGV4X2NoaWxkX2luaXQoeCkKLQotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X2luaXQocG9vbCAqcCkKLXsKLSAgICB1bmlvbiBzZW11biBpY2s7Ci0gICAgc3RydWN0IHNlbWlkX2RzIGJ1ZjsKLQotICAgIC8qIGFjcXVpcmUgdGhlIHNlbWFwaG9yZSAqLwotICAgIHNlbV9pZCA9IHNlbWdldChJUENfUFJJVkFURSwgMSwgSVBDX0NSRUFUIHwgMDYwMCk7Ci0gICAgaWYgKHNlbV9pZCA8IDApIHsKLQlwZXJyb3IoInNlbWdldCIpOwotCWV4aXQoQVBFWElUX0lOSVQpOwotICAgIH0KLSAgICBpY2sudmFsID0gMTsKLSAgICBpZiAoc2VtY3RsKHNlbV9pZCwgMCwgU0VUVkFMLCBpY2spIDwgMCkgewotCXBlcnJvcigic2VtY3RsKFNFVFZBTCkiKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0gICAgaWYgKCFnZXR1aWQoKSkgewotCS8qIHJlc3RyaWN0IGl0IHRvIHVzZSBvbmx5IGJ5IHRoZSBhcHByb3ByaWF0ZSB1c2VyX2lkIC4uLiBub3QgdGhhdCB0aGlzCi0JICogc3RvcHMgQ0dJcyBmcm9tIGFjcXVpcmluZyBpdCBhbmQgZGlua2luZyBhcm91bmQgd2l0aCBpdC4KLQkgKi8KLQlidWYuc2VtX3Blcm0udWlkID0gdW5peGRfY29uZmlnLnVzZXJfaWQ7Ci0JYnVmLnNlbV9wZXJtLmdpZCA9IHVuaXhkX2NvbmZpZy5ncm91cF9pZDsKLQlidWYuc2VtX3Blcm0ubW9kZSA9IDA2MDA7Ci0JaWNrLmJ1ZiA9ICZidWY7Ci0JaWYgKHNlbWN0bChzZW1faWQsIDAsIElQQ19TRVQsIGljaykgPCAwKSB7Ci0JICAgIHBlcnJvcigic2VtY3RsKElQQ19TRVQpIik7Ci0JICAgIGV4aXQoQVBFWElUX0lOSVQpOwotCX0KLSAgICB9Ci0gICAgYXBfcmVnaXN0ZXJfY2xlYW51cChwLCBOVUxMLCBhY2NlcHRfbXV0ZXhfY2xlYW51cCwgYXBfbnVsbF9jbGVhbnVwKTsKLQotICAgIC8qIHByZS1pbml0aWFsaXplIHRoZXNlICovCi0gICAgb3Bfb24uc2VtX251bSA9IDA7Ci0gICAgb3Bfb24uc2VtX29wID0gLTE7Ci0gICAgb3Bfb24uc2VtX2ZsZyA9IFNFTV9VTkRPOwotICAgIG9wX29mZi5zZW1fbnVtID0gMDsKLSAgICBvcF9vZmYuc2VtX29wID0gMTsKLSAgICBvcF9vZmYuc2VtX2ZsZyA9IFNFTV9VTkRPOwotfQotCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfb24odm9pZCkKLXsKLSAgICB3aGlsZSAoc2Vtb3Aoc2VtX2lkLCAmb3Bfb24sIDEpIDwgMCkgewotCWlmIChlcnJubyAhPSBFSU5UUikgewotCSAgICBwZXJyb3IoImFjY2VwdF9tdXRleF9vbiIpOwotCSAgICBjbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfb2ZmKHZvaWQpCi17Ci0gICAgd2hpbGUgKHNlbW9wKHNlbV9pZCwgJm9wX29mZiwgMSkgPCAwKSB7Ci0JaWYgKGVycm5vICE9IEVJTlRSKSB7Ci0JICAgIHBlcnJvcigiYWNjZXB0X211dGV4X29mZiIpOwotCSAgICBjbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLQl9Ci0gICAgfQotfQotCi0jZWxpZiBkZWZpbmVkKFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVCkKLXN0YXRpYyBzdHJ1Y3QgZmxvY2sgbG9ja19pdDsKLXN0YXRpYyBzdHJ1Y3QgZmxvY2sgdW5sb2NrX2l0OwotCi1zdGF0aWMgaW50IGxvY2tfZmQgPSAtMTsKLQotI2RlZmluZSBhY2NlcHRfbXV0ZXhfY2hpbGRfaW5pdCh4KQotCi0vKgotICogSW5pdGlhbGl6ZSBtdXRleCBsb2NrLgotICogTXVzdCBiZSBzYWZlIHRvIGNhbGwgdGhpcyBvbiBhIHJlc3RhcnQuCi0gKi8KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9pbml0KHBvb2wgKnApCi17Ci0KLSAgICBsb2NrX2l0Lmxfd2hlbmNlID0gU0VFS19TRVQ7CS8qIGZyb20gY3VycmVudCBwb2ludCAqLwotICAgIGxvY2tfaXQubF9zdGFydCA9IDA7CQkvKiAtIi0gKi8KLSAgICBsb2NrX2l0LmxfbGVuID0gMDsJCQkvKiB1bnRpbCBlbmQgb2YgZmlsZSAqLwotICAgIGxvY2tfaXQubF90eXBlID0gRl9XUkxDSzsJCS8qIHNldCBleGNsdXNpdmUvd3JpdGUgbG9jayAqLwotICAgIGxvY2tfaXQubF9waWQgPSAwOwkJCS8qIHBpZCBub3QgYWN0dWFsbHkgaW50ZXJlc3RpbmcgKi8KLSAgICB1bmxvY2tfaXQubF93aGVuY2UgPSBTRUVLX1NFVDsJLyogZnJvbSBjdXJyZW50IHBvaW50ICovCi0gICAgdW5sb2NrX2l0Lmxfc3RhcnQgPSAwOwkJLyogLSItICovCi0gICAgdW5sb2NrX2l0LmxfbGVuID0gMDsJCS8qIHVudGlsIGVuZCBvZiBmaWxlICovCi0gICAgdW5sb2NrX2l0LmxfdHlwZSA9IEZfVU5MQ0s7CQkvKiBzZXQgZXhjbHVzaXZlL3dyaXRlIGxvY2sgKi8KLSAgICB1bmxvY2tfaXQubF9waWQgPSAwOwkJLyogcGlkIG5vdCBhY3R1YWxseSBpbnRlcmVzdGluZyAqLwotCi0gICAgZXhwYW5kX2xvY2tfZm5hbWUocCk7Ci0gICAgbG9ja19mZCA9IGFwX3BvcGVuZihwLCBhcF9sb2NrX2ZuYW1lLCBPX0NSRUFUIHwgT19XUk9OTFkgfCBPX0VYQ0wsIDA2NDQpOwotICAgIGlmIChsb2NrX2ZkID09IC0xKSB7Ci0JcGVycm9yKCJvcGVuIik7Ci0JZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiBsb2NrIGZpbGU6ICVzXG4iLCBhcF9sb2NrX2ZuYW1lKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0gICAgdW5saW5rKGFwX2xvY2tfZm5hbWUpOwotfQotCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfb24odm9pZCkKLXsKLSAgICBpbnQgcmV0OwotCi0gICAgd2hpbGUgKChyZXQgPSBmY250bChsb2NrX2ZkLCBGX1NFVExLVywgJmxvY2tfaXQpKSA8IDAgJiYgZXJybm8gPT0gRUlOVFIpIHsKLQkvKiBub3AgKi8KLSAgICB9Ci0KLSAgICBpZiAocmV0IDwgMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FTUVSRywgc2VydmVyX2NvbmYsCi0JCSAgICAiZmNudGw6IEZfU0VUTEtXOiBFcnJvciBnZXR0aW5nIGFjY2VwdCBsb2NrLCBleGl0aW5nISAgIgotCQkgICAgIlBlcmhhcHMgeW91IG5lZWQgdG8gdXNlIHRoZSBMb2NrRmlsZSBkaXJlY3RpdmUgdG8gcGxhY2UgIgotCQkgICAgInlvdXIgbG9jayBmaWxlIG9uIGEgbG9jYWwgZGlzayEiKTsKLQljbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9vZmYodm9pZCkKLXsKLSAgICBpbnQgcmV0OwotCi0gICAgd2hpbGUgKChyZXQgPSBmY250bChsb2NrX2ZkLCBGX1NFVExLVywgJnVubG9ja19pdCkpIDwgMCAmJiBlcnJubyA9PSBFSU5UUikgewotCS8qIG5vcCAqLwotICAgIH0KLSAgICBpZiAocmV0IDwgMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FTUVSRywgc2VydmVyX2NvbmYsCi0JCSAgICAiZmNudGw6IEZfU0VUTEtXOiBFcnJvciBmcmVlaW5nIGFjY2VwdCBsb2NrLCBleGl0aW5nISAgIgotCQkgICAgIlBlcmhhcHMgeW91IG5lZWQgdG8gdXNlIHRoZSBMb2NrRmlsZSBkaXJlY3RpdmUgdG8gcGxhY2UgIgotCQkgICAgInlvdXIgbG9jayBmaWxlIG9uIGEgbG9jYWwgZGlzayEiKTsKLQljbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci19Ci0KLSNlbGlmIGRlZmluZWQoVVNFX0ZMT0NLX1NFUklBTElaRURfQUNDRVBUKQotCi1zdGF0aWMgaW50IGxvY2tfZmQgPSAtMTsKLQotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X2NsZWFudXAodm9pZCAqZm9vKQotewotICAgIHVubGluayhhcF9sb2NrX2ZuYW1lKTsKLX0KLQotLyoKLSAqIEluaXRpYWxpemUgbXV0ZXggbG9jay4KLSAqIERvbmUgYnkgZWFjaCBjaGlsZCBhdCBpdCdzIGJpcnRoCi0gKi8KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9jaGlsZF9pbml0KHBvb2wgKnApCi17Ci0KLSAgICBsb2NrX2ZkID0gYXBfcG9wZW5mKHAsIGFwX2xvY2tfZm5hbWUsIE9fV1JPTkxZLCAwNjAwKTsKLSAgICBpZiAobG9ja19mZCA9PSAtMSkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FTUVSRywgc2VydmVyX2NvbmYsCi0JCSAgICAiQ2hpbGQgY2Fubm90IG9wZW4gbG9jayBmaWxlOiAlcyIsIGFwX2xvY2tfZm5hbWUpOwotCWNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxESU5JVCk7Ci0gICAgfQotfQotCi0vKgotICogSW5pdGlhbGl6ZSBtdXRleCBsb2NrLgotICogTXVzdCBiZSBzYWZlIHRvIGNhbGwgdGhpcyBvbiBhIHJlc3RhcnQuCi0gKi8KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9pbml0KHBvb2wgKnApCi17Ci0gICAgZXhwYW5kX2xvY2tfZm5hbWUocCk7Ci0gICAgdW5saW5rKGFwX2xvY2tfZm5hbWUpOwotICAgIGxvY2tfZmQgPSBhcF9wb3BlbmYocCwgYXBfbG9ja19mbmFtZSwgT19DUkVBVCB8IE9fV1JPTkxZIHwgT19FWENMLCAwNjAwKTsKLSAgICBpZiAobG9ja19mZCA9PSAtMSkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FTUVSRywgc2VydmVyX2NvbmYsCi0JCSAgICAiUGFyZW50IGNhbm5vdCBvcGVuIGxvY2sgZmlsZTogJXMiLCBhcF9sb2NrX2ZuYW1lKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0gICAgYXBfcmVnaXN0ZXJfY2xlYW51cChwLCBOVUxMLCBhY2NlcHRfbXV0ZXhfY2xlYW51cCwgYXBfbnVsbF9jbGVhbnVwKTsKLX0KLQotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X29uKHZvaWQpCi17Ci0gICAgaW50IHJldDsKLQotICAgIHdoaWxlICgocmV0ID0gZmxvY2sobG9ja19mZCwgTE9DS19FWCkpIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKLQljb250aW51ZTsKLQotICAgIGlmIChyZXQgPCAwKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLCBzZXJ2ZXJfY29uZiwKLQkJICAgICJmbG9jazogTE9DS19FWDogRXJyb3IgZ2V0dGluZyBhY2NlcHQgbG9jay4gRXhpdGluZyEiKTsKLQljbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9vZmYodm9pZCkKLXsKLSAgICBpZiAoZmxvY2sobG9ja19mZCwgTE9DS19VTikgPCAwKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLCBzZXJ2ZXJfY29uZiwKLQkJICAgICJmbG9jazogTE9DS19VTjogRXJyb3IgZnJlZWluZyBhY2NlcHQgbG9jay4gRXhpdGluZyEiKTsKLQljbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci19Ci0KLSNlbGlmIGRlZmluZWQoVVNFX09TMlNFTV9TRVJJQUxJWkVEX0FDQ0VQVCkKLQotc3RhdGljIEhNVFggbG9ja19zZW0gPSAtMTsKLQotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X2NsZWFudXAodm9pZCAqZm9vKQotewotICAgIERvc1JlbGVhc2VNdXRleFNlbShsb2NrX3NlbSk7Ci0gICAgRG9zQ2xvc2VNdXRleFNlbShsb2NrX3NlbSk7Ci19Ci0KLS8qCi0gKiBJbml0aWFsaXplIG11dGV4IGxvY2suCi0gKiBEb25lIGJ5IGVhY2ggY2hpbGQgYXQgaXQncyBiaXJ0aAotICovCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfY2hpbGRfaW5pdChwb29sICpwKQotewotICAgIGludCByYyA9IERvc09wZW5NdXRleFNlbShOVUxMLCAmbG9ja19zZW0pOwotCi0gICAgaWYgKHJjICE9IDApIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FTUVSRywgc2VydmVyX2NvbmYsCi0JCSAgICAiQ2hpbGQgY2Fubm90IG9wZW4gbG9jayBzZW1hcGhvcmUsIHJjPSVkIiwgcmMpOwotCWNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxESU5JVCk7Ci0gICAgfQotfQotCi0vKgotICogSW5pdGlhbGl6ZSBtdXRleCBsb2NrLgotICogTXVzdCBiZSBzYWZlIHRvIGNhbGwgdGhpcyBvbiBhIHJlc3RhcnQuCi0gKi8KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9pbml0KHBvb2wgKnApCi17Ci0gICAgaW50IHJjID0gRG9zQ3JlYXRlTXV0ZXhTZW0oTlVMTCwgJmxvY2tfc2VtLCBEQ19TRU1fU0hBUkVELCBGQUxTRSk7Ci0KLSAgICBpZiAocmMgIT0gMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VNRVJHLCBzZXJ2ZXJfY29uZiwKLQkJICAgICJQYXJlbnQgY2Fubm90IGNyZWF0ZSBsb2NrIHNlbWFwaG9yZSwgcmM9JWQiLCByYyk7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotCi0gICAgYXBfcmVnaXN0ZXJfY2xlYW51cChwLCBOVUxMLCBhY2NlcHRfbXV0ZXhfY2xlYW51cCwgYXBfbnVsbF9jbGVhbnVwKTsKLX0KLQotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X29uKHZvaWQpCi17Ci0gICAgaW50IHJjID0gRG9zUmVxdWVzdE11dGV4U2VtKGxvY2tfc2VtLCBTRU1fSU5ERUZJTklURV9XQUlUKTsKLQotICAgIGlmIChyYyAhPSAwKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRU1FUkcsIHNlcnZlcl9jb25mLAotCQkgICAgIk9TMlNFTTogRXJyb3IgJWQgZ2V0dGluZyBhY2NlcHQgbG9jay4gRXhpdGluZyEiLCByYyk7Ci0JY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfb2ZmKHZvaWQpCi17Ci0gICAgaW50IHJjID0gRG9zUmVsZWFzZU11dGV4U2VtKGxvY2tfc2VtKTsKLSAgICAKLSAgICBpZiAocmMgIT0gMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VNRVJHLCBzZXJ2ZXJfY29uZiwKLQkJICAgICJPUzJTRU06IEVycm9yICVkIGZyZWVpbmcgYWNjZXB0IGxvY2suIEV4aXRpbmchIiwgcmMpOwotCWNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotICAgIH0KLX0KLQotI2VsaWYgZGVmaW5lZChVU0VfVFBGX0NPUkVfU0VSSUFMSVpFRF9BQ0NFUFQpCi0KLXN0YXRpYyBpbnQgdHBmX2NvcmVfaGVsZDsKLQotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X2NsZWFudXAodm9pZCAqZm9vKQotewotICAgIGlmKHRwZl9jb3JlX2hlbGQpCi0gICAgICAgIGNvcnVjKFJFU09VUkNFX0tFWSk7Ci19Ci0KLSNkZWZpbmUgYWNjZXB0X211dGV4X2luaXQoeCkKLQotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X2NoaWxkX2luaXQocG9vbCAqcCkKLXsKLSAgICBhcF9yZWdpc3Rlcl9jbGVhbnVwKHAsIE5VTEwsIGFjY2VwdF9tdXRleF9jbGVhbnVwLCBhcF9udWxsX2NsZWFudXApOwotICAgIHRwZl9jb3JlX2hlbGQgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfb24odm9pZCkKLXsKLSAgICBjb3JoYyhSRVNPVVJDRV9LRVkpOwotICAgIHRwZl9jb3JlX2hlbGQgPSAxOwotICAgIGFwX2NoZWNrX3NpZ25hbHMoKTsKLX0KLQotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X29mZih2b2lkKQotewotICAgIGNvcnVjKFJFU09VUkNFX0tFWSk7Ci0gICAgdHBmX2NvcmVfaGVsZCA9IDA7Ci0gICAgYXBfY2hlY2tfc2lnbmFscygpOwotfQotCi0jZWxzZQotLyogRGVmYXVsdCAtLS0gbm8gc2VyaWFsaXphdGlvbi4gIE90aGVyIG1ldGhvZHMgKmNvdWxkKiBnbyBoZXJlLAotICogYXMgI2VsaWZzLi4uCi0gKi8KLSNpZiAhZGVmaW5lZChNVUxUSVRIUkVBRCkKLS8qIE11bHRpdGhyZWFkZWQgc3lzdGVtcyBkb24ndCBjb21wbGV0ZSBiZXR3ZWVuIHByb2Nlc3NlcyBmb3IKLSAqIHRoZSBzb2NrZXRzLiAqLwotI2RlZmluZSBOT19TRVJJQUxJWkVEX0FDQ0VQVAotI2RlZmluZSBhY2NlcHRfbXV0ZXhfY2hpbGRfaW5pdCh4KQotI2RlZmluZSBhY2NlcHRfbXV0ZXhfaW5pdCh4KQotI2RlZmluZSBhY2NlcHRfbXV0ZXhfb24oKQotI2RlZmluZSBhY2NlcHRfbXV0ZXhfb2ZmKCkKLSNlbmRpZgotI2VuZGlmCi0KLS8qIE9uIHNvbWUgYXJjaGl0ZWN0dXJlcyBpdCdzIHNhZmUgdG8gZG8gdW5zZXJpYWxpemVkIGFjY2VwdCgpcyBpbiB0aGUgc2luZ2xlCi0gKiBMaXN0ZW4gY2FzZS4gIEJ1dCBpdCdzIG5ldmVyIHNhZmUgdG8gZG8gaXQgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlcmUncwotICogbXVsdGlwbGUgTGlzdGVuIHN0YXRlbWVudHMuICBEZWZpbmUgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBUCi0gKiB3aGVuIGl0J3Mgc2FmZSBpbiB0aGUgc2luZ2xlIExpc3RlbiBjYXNlLgotICovCi0jaWZkZWYgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBUCi0jZGVmaW5lIFNBRkVfQUNDRVBUKHN0bXQpIGRvIHtpZihhcF9saXN0ZW5lcnMtPm5leHQgIT0gYXBfbGlzdGVuZXJzKSB7c3RtdDt9fSB3aGlsZSgwKQotI2Vsc2UKLSNkZWZpbmUgU0FGRV9BQ0NFUFQoc3RtdCkgZG8ge3N0bXQ7fSB3aGlsZSgwKQotI2VuZGlmCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBkZWFsaW5nIHdpdGggb3RoZXIgY2hpbGRyZW4KLSAqLwotCi0jaWZkZWYgSEFTX09USEVSX0NISUxECi1BUElfRVhQT1JUKHZvaWQpIGFwX3JlZ2lzdGVyX290aGVyX2NoaWxkKGludCBwaWQsCi0JCSAgICAgICB2b2lkICgqbWFpbnRlbmFuY2UpIChpbnQgcmVhc29uLCB2b2lkICosIGFwX3dhaXRfdCBzdGF0dXMpLAotCQkJICB2b2lkICpkYXRhLCBpbnQgd3JpdGVfZmQpCi17Ci0gICAgb3RoZXJfY2hpbGRfcmVjICpvY3I7Ci0KLSAgICBvY3IgPSBhcF9wYWxsb2MocGNvbmYsIHNpemVvZigqb2NyKSk7Ci0gICAgb2NyLT5waWQgPSBwaWQ7Ci0gICAgb2NyLT5tYWludGVuYW5jZSA9IG1haW50ZW5hbmNlOwotICAgIG9jci0+ZGF0YSA9IGRhdGE7Ci0gICAgb2NyLT53cml0ZV9mZCA9IHdyaXRlX2ZkOwotICAgIG9jci0+bmV4dCA9IG90aGVyX2NoaWxkcmVuOwotICAgIG90aGVyX2NoaWxkcmVuID0gb2NyOwotfQotCi0vKiBub3RlIHRoYXQgc2luY2UgdGhpcyBjYW4gYmUgY2FsbGVkIGJ5IGEgbWFpbnRlbmFuY2UgZnVuY3Rpb24gd2hpbGUgd2UncmUKLSAqIHNjYW5uaW5nIHRoZSBvdGhlcl9jaGlsZHJlbiBsaXN0LCBhbGwgc2Nhbm5lcnMgc2hvdWxkIHByb3RlY3QgdGhlbXNlbGYKLSAqIGJ5IGxvYWRpbmcgb2NyLT5uZXh0IGJlZm9yZSBjYWxsaW5nIGFueSBtYWludGVuYW5jZSBmdW5jdGlvbi4KLSAqLwotQVBJX0VYUE9SVCh2b2lkKSBhcF91bnJlZ2lzdGVyX290aGVyX2NoaWxkKHZvaWQgKmRhdGEpCi17Ci0gICAgb3RoZXJfY2hpbGRfcmVjICoqcG9jciwgKm5vY3I7Ci0KLSAgICBmb3IgKHBvY3IgPSAmb3RoZXJfY2hpbGRyZW47ICpwb2NyOyBwb2NyID0gJigqcG9jciktPm5leHQpIHsKLQlpZiAoKCpwb2NyKS0+ZGF0YSA9PSBkYXRhKSB7Ci0JICAgIG5vY3IgPSAoKnBvY3IpLT5uZXh0OwotCSAgICAoKigqcG9jciktPm1haW50ZW5hbmNlKSAoT0NfUkVBU09OX1VOUkVHSVNURVIsICgqcG9jciktPmRhdGEsIC0xKTsKLQkgICAgKnBvY3IgPSBub2NyOwotCSAgICAvKiBYWFg6IHVtLCB3ZWxsIHdlJ3ZlIGp1c3Qgd2FzdGVkIHNvbWUgc3BhY2UgaW4gcGNvbmYgPyAqLwotCSAgICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotLyogdGVzdCB0byBlbnN1cmUgdGhhdCB0aGUgd3JpdGVfZmRzIGFyZSBhbGwgc3RpbGwgd3JpdGFibGUsIG90aGVyd2lzZQotICogaW52b2tlIHRoZSBtYWludGVuYW5jZSBmdW5jdGlvbnMgYXMgYXBwcm9wcmlhdGUgKi8KLXN0YXRpYyB2b2lkIHByb2JlX3dyaXRhYmxlX2Zkcyh2b2lkKQotewotICAgIGZkX3NldCB3cml0YWJsZV9mZHM7Ci0gICAgaW50IGZkX21heDsKLSAgICBvdGhlcl9jaGlsZF9yZWMgKm9jciwgKm5vY3I7Ci0gICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gICAgaW50IHJjOwotCi0gICAgaWYgKG90aGVyX2NoaWxkcmVuID09IE5VTEwpCi0JcmV0dXJuOwotCi0gICAgZmRfbWF4ID0gMDsKLSAgICBGRF9aRVJPKCZ3cml0YWJsZV9mZHMpOwotICAgIGRvIHsKLQlmb3IgKG9jciA9IG90aGVyX2NoaWxkcmVuOyBvY3I7IG9jciA9IG9jci0+bmV4dCkgewotCSAgICBpZiAob2NyLT53cml0ZV9mZCA9PSAtMSkKLQkJY29udGludWU7Ci0JICAgIEZEX1NFVChvY3ItPndyaXRlX2ZkLCAmd3JpdGFibGVfZmRzKTsKLQkgICAgaWYgKG9jci0+d3JpdGVfZmQgPiBmZF9tYXgpIHsKLQkJZmRfbWF4ID0gb2NyLT53cml0ZV9mZDsKLQkgICAgfQotCX0KLQlpZiAoZmRfbWF4ID09IDApCi0JICAgIHJldHVybjsKLQotCXR2LnR2X3NlYyA9IDA7Ci0JdHYudHZfdXNlYyA9IDA7Ci0JcmMgPSBhcF9zZWxlY3QoZmRfbWF4ICsgMSwgTlVMTCwgJndyaXRhYmxlX2ZkcywgTlVMTCwgJnR2KTsKLSAgICB9IHdoaWxlIChyYyA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICBpZiAocmMgPT0gLTEpIHsKLQkvKiBYWFg6IHVoaCB0aGlzIGNvdWxkIGJlIHJlYWxseSBiYWQsIHdlIGNvdWxkIGhhdmUgYSBiYWQgZmlsZQotCSAqIGRlc2NyaXB0b3IgZHVlIHRvIGEgYnVnIGluIG9uZSBvZiB0aGUgbWFpbnRlbmFuY2Ugcm91dGluZXMgKi8KLQlhcF9sb2dfdW5peGVycigicHJvYmVfd3JpdGFibGVfZmRzIiwgInNlbGVjdCIsCi0JCSAgICAiY291bGQgbm90IHByb2JlIHdyaXRhYmxlIGZkcyIsIHNlcnZlcl9jb25mKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIGlmIChyYyA9PSAwKQotCXJldHVybjsKLQotICAgIGZvciAob2NyID0gb3RoZXJfY2hpbGRyZW47IG9jcjsgb2NyID0gbm9jcikgewotCW5vY3IgPSBvY3ItPm5leHQ7Ci0JaWYgKG9jci0+d3JpdGVfZmQgPT0gLTEpCi0JICAgIGNvbnRpbnVlOwotCWlmIChGRF9JU1NFVChvY3ItPndyaXRlX2ZkLCAmd3JpdGFibGVfZmRzKSkKLQkgICAgY29udGludWU7Ci0JKCpvY3ItPm1haW50ZW5hbmNlKSAoT0NfUkVBU09OX1VOV1JJVEFCTEUsIG9jci0+ZGF0YSwgLTEpOwotICAgIH0KLX0KLQotLyogcG9zc2libHkgcmVhcCBhbiBvdGhlcl9jaGlsZCwgcmV0dXJuIDAgaWYgeWVzLCAtMSBpZiBub3QgKi8KLXN0YXRpYyBpbnQgcmVhcF9vdGhlcl9jaGlsZChpbnQgcGlkLCBhcF93YWl0X3Qgc3RhdHVzKQotewotICAgIG90aGVyX2NoaWxkX3JlYyAqb2NyLCAqbm9jcjsKLQotICAgIGZvciAob2NyID0gb3RoZXJfY2hpbGRyZW47IG9jcjsgb2NyID0gbm9jcikgewotCW5vY3IgPSBvY3ItPm5leHQ7Ci0JaWYgKG9jci0+cGlkICE9IHBpZCkKLQkgICAgY29udGludWU7Ci0Jb2NyLT5waWQgPSAtMTsKLQkoKm9jci0+bWFpbnRlbmFuY2UpIChPQ19SRUFTT05fREVBVEgsIG9jci0+ZGF0YSwgc3RhdHVzKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIERlYWxpbmcgd2l0aCB0aGUgc2NvcmVib2FyZC4uLiBhIGxvdCBvZiB0aGVzZSB2YXJpYWJsZXMgYXJlIGdsb2JhbAotICogb25seSB0byBhdm9pZCBnZXR0aW5nIGNsb2JiZXJlZCBieSB0aGUgbG9uZ2ptcCgpIHRoYXQgaGFwcGVucyB3aGVuCi0gKiBhIGhhcmQgdGltZW91dCBleHBpcmVzLi4uCi0gKgotICogV2UgYmVnaW4gd2l0aCByb3V0aW5lcyB3aGljaCBkZWFsIHdpdGggdGhlIGZpbGUgaXRzZWxmLi4uIAotICovCi0KLSNpZiBkZWZpbmVkKFVTRV9PUzJfU0NPUkVCT0FSRCkKLQotLyogVGhlIG5leHQgdHdvIHJvdXRpbmVzIGFyZSB1c2VkIHRvIGFjY2VzcyBzaGFyZWQgbWVtb3J5IHVuZGVyIE9TLzIuICAqLwotLyogVGhpcyByZXF1aXJlcyBFTVggdjA5YyB0byBiZSBpbnN0YWxsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotY2FkZHJfdCBjcmVhdGVfc2hhcmVkX2hlYXAoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IHNpemUpCi17Ci0gICAgVUxPTkcgcmM7Ci0gICAgdm9pZCAqbWVtOwotICAgIEhlYXBfdCBoOwotCi0gICAgcmMgPSBEb3NBbGxvY1NoYXJlZE1lbSgmbWVtLCBuYW1lLCBzaXplLAotCQkJICAgUEFHX0NPTU1JVCB8IFBBR19SRUFEIHwgUEFHX1dSSVRFKTsKLSAgICBpZiAocmMgIT0gMCkKLQlyZXR1cm4gTlVMTDsKLSAgICBoID0gX3VjcmVhdGUobWVtLCBzaXplLCAhX0JMT0NLX0NMRUFOLCBfSEVBUF9SRUdVTEFSIHwgX0hFQVBfU0hBUkVELAotCQkgTlVMTCwgTlVMTCk7Ci0gICAgaWYgKGggPT0gTlVMTCkKLQlEb3NGcmVlTWVtKG1lbSk7Ci0gICAgcmV0dXJuIChjYWRkcl90KSBoOwotfQotCi1jYWRkcl90IGdldF9zaGFyZWRfaGVhcChjb25zdCBjaGFyICpOYW1lKQotewotCi0gICAgUFZPSUQgQmFzZUFkZHJlc3M7CQkvKiBQb2ludGVyIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YKLQkJCQkgICB0aGUgc2hhcmVkIG1lbW9yeSBvYmplY3QgKi8KLSAgICBVTE9ORyBBdHRyaWJ1dGVGbGFnczsJLyogRmxhZ3MgZGVzY3JpYmluZyBjaGFyYWN0ZXJpc3RpY3MKLQkJCQkgICBvZiB0aGUgc2hhcmVkIG1lbW9yeSBvYmplY3QgKi8KLSAgICBBUElSRVQgcmM7CQkJLyogUmV0dXJuIGNvZGUgKi8KLQotICAgIC8qIFJlcXVlc3QgcmVhZCBhbmQgd3JpdGUgYWNjZXNzIHRvICovCi0gICAgLyogICB0aGUgc2hhcmVkIG1lbW9yeSBvYmplY3QgICAgICAgKi8KLSAgICBBdHRyaWJ1dGVGbGFncyA9IFBBR19XUklURSB8IFBBR19SRUFEOwotCi0gICAgcmMgPSBEb3NHZXROYW1lZFNoYXJlZE1lbSgmQmFzZUFkZHJlc3MsIE5hbWUsIEF0dHJpYnV0ZUZsYWdzKTsKLQotICAgIGlmIChyYyAhPSAwKSB7Ci0JcHJpbnRmKCJEb3NHZXROYW1lZFNoYXJlZE1lbSBlcnJvcjogcmV0dXJuIGNvZGUgPSAlbGQiLCByYyk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIEJhc2VBZGRyZXNzOwotfQotCi1zdGF0aWMgdm9pZCBzZXR1cF9zaGFyZWRfbWVtKHBvb2wgKnApCi17Ci0gICAgY2FkZHJfdCBtOwotCi0gICAgaW50IHJjOwotCi0gICAgbSA9IChjYWRkcl90KSBjcmVhdGVfc2hhcmVkX2hlYXAoIlxcU0hBUkVNRU1cXFNDT1JFQk9BUkQiLCBTQ09SRUJPQVJEX1NJWkUpOwotICAgIGlmIChtID09IDApIHsKLQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBDb3VsZCBub3QgY3JlYXRlIE9TLzIgU2hhcmVkIG1lbW9yeSBwb29sLlxuIiwKLQkJYXBfc2VydmVyX2FyZ3YwKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0KLSAgICByYyA9IF91b3BlbigoSGVhcF90KSBtKTsKLSAgICBpZiAocmMgIT0gMCkgewotCWZwcmludGYoc3RkZXJyLAotCQkiJXM6IENvdWxkIG5vdCB1b3BlbigpIG5ld2x5IGNyZWF0ZWQgT1MvMiBTaGFyZWQgbWVtb3J5IHBvb2wuXG4iLAotCQlhcF9zZXJ2ZXJfYXJndjApOwotICAgIH0KLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlID0gKHNjb3JlYm9hcmQgKikgbTsKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwucnVubmluZ19nZW5lcmF0aW9uID0gMDsKLX0KLQotc3RhdGljIHZvaWQgcmVvcGVuX3Njb3JlYm9hcmQocG9vbCAqcCkKLXsKLSAgICBjYWRkcl90IG07Ci0gICAgaW50IHJjOwotCi0gICAgbSA9IChjYWRkcl90KSBnZXRfc2hhcmVkX2hlYXAoIlxcU0hBUkVNRU1cXFNDT1JFQk9BUkQiKTsKLSAgICBpZiAobSA9PSAwKSB7Ci0JZnByaW50ZihzdGRlcnIsICIlczogQ291bGQgbm90IGZpbmQgZXhpc3RpbmcgT1MvMiBTaGFyZWQgbWVtb3J5IHBvb2wuXG4iLAotCQlhcF9zZXJ2ZXJfYXJndjApOwotCWV4aXQoQVBFWElUX0lOSVQpOwotICAgIH0KLQotICAgIHJjID0gX3VvcGVuKChIZWFwX3QpIG0pOwotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UgPSAoc2NvcmVib2FyZCAqKSBtOwotfQotCi0jZWxpZiBkZWZpbmVkKFVTRV9QT1NJWF9TQ09SRUJPQVJEKQotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0vKiAKLSAqIFBPU0lYIDEwMDMuNCBzdHlsZQotICoKLSAqIE5vdGUgMTogCi0gKiBBcyBvZiB2ZXJzaW9uIDQuMjNBLCBzaGFyZWQgbWVtb3J5IGluIFFOWCBtdXN0IHJlc2lkZSB1bmRlciAvZGV2L3NobWVtLAotICogd2hlcmUgbm8gc3ViZGlyZWN0b3JpZXMgYWxsb3dlZC4KLSAqCi0gKiBQT1NJWCBzaG1fb3BlbigpIGFuZCBzaG1fdW5saW5rKCkgd2lsbCB0YWtlIGNhcmUgYWJvdXQgdGhpcyBpc3N1ZSwKLSAqIGJ1dCB0byBhdm9pZCBjb25mdXNpb24sIEkgc3VnZ2VzdCB0byByZWRlZmluZSBzY29yZWJvYXJkIGZpbGUgbmFtZQotICogaW4gaHR0cGQuY29uZiB0byBjdXQgImxvZ3MvIiBmcm9tIGl0LiBXaXRoIGRlZmF1bHQgc2V0dXAgYWN0dWFsIG5hbWUKLSAqIHdpbGwgYmUgIi9kZXYvc2htZW0vbG9ncy5hcGFjaGVfc3RhdHVzIi4gCi0gKiAKLSAqIElmIHNvbWV0aGluZyB3ZW50IHdyb25nIGFuZCBBcGFjaGUgZGlkIG5vdCB1bmxpbmtlZCB0aGlzIG9iamVjdCB1cG9uCi0gKiBleGl0LCB5b3UgY2FuIHJlbW92ZSBpdCBtYW51YWxseSwgdXNpbmcgInJtIC1mIiBjb21tYW5kLgotICogCi0gKiBOb3RlIDI6Ci0gKiA8c3lzL21tYW4uaD4gaW4gUU5YIGRlZmluZXMgTUFQX0FOT04sIGJ1dCBjdXJyZW50IGltcGxlbWVudGF0aW9uIAotICogZG9lcyBOT1Qgc3VwcG9ydCBCU0Qgc3R5bGUgYW5vbnltb3VzIG1hcHBpbmcuIFNvLCB0aGUgb3JkZXIgb2YgCi0gKiBjb25kaXRpb25hbCBjb21waWxhdGlvbiBpcyBpbXBvcnRhbnQ6IAotICogdGhpcyAjaWZkZWYgc2VjdGlvbiBtdXN0IGJlIEFCT1ZFIHRoZSBuZXh0IG9uZSAoQlNEIHN0eWxlKS4KLSAqCi0gKiBJIHRlc3RlZCB0aGlzIHN0dWZmIGFuZCBpdCB3b3JrcyBmaW5lIGZvciBtZSwgYnV0IGlmIGl0IHByb3ZpZGVzIAotICogdHJvdWJsZSBmb3IgeW91LCBqdXN0IGNvbW1lbnQgb3V0IFVTRV9NTUFQX1NDT1JFQk9BUkQgaW4gUU5YIHNlY3Rpb24KLSAqIG9mIGFwX2NvbmZpZy5oCi0gKgotICogSnVuZSA1LCAxOTk3LCAKLSAqIElnb3IgTi4gS292YWxlbmtvIC0tIGluZm9oQG1haWwud3BsdXMubmV0Ci0gKi8KLQotc3RhdGljIHZvaWQgY2xlYW51cF9zaGFyZWRfbWVtKHZvaWQgKmQpCi17Ci0gICAgc2htX3VubGluayhhcF9zY29yZWJvYXJkX2ZuYW1lKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0dXBfc2hhcmVkX21lbShwb29sICpwKQotewotICAgIGNoYXIgYnVmWzUxMl07Ci0gICAgY2FkZHJfdCBtOwotICAgIGludCBmZDsKLQotICAgIGZkID0gc2htX29wZW4oYXBfc2NvcmVib2FyZF9mbmFtZSwgT19SRFdSIHwgT19DUkVBVCwgU19JUlVTUiB8IFNfSVdVU1IpOwotICAgIGlmIChmZCA9PSAtMSkgewotCWFwX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlczogY291bGQgbm90IG9wZW4oY3JlYXRlKSBzY29yZWJvYXJkIiwKLQkJICAgIGFwX3NlcnZlcl9hcmd2MCk7Ci0JcGVycm9yKGJ1Zik7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIGlmIChsdHJ1bmMoZmQsIChvZmZfdCkgU0NPUkVCT0FSRF9TSVpFLCBTRUVLX1NFVCkgPT0gLTEpIHsKLQlhcF9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXM6IGNvdWxkIG5vdCBsdHJ1bmMgc2NvcmVib2FyZCIsCi0JCSAgICBhcF9zZXJ2ZXJfYXJndjApOwotCXBlcnJvcihidWYpOwotCXNobV91bmxpbmsoYXBfc2NvcmVib2FyZF9mbmFtZSk7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIGlmICgobSA9IChjYWRkcl90KSBtbWFwKChjYWRkcl90KSAwLAotCQkJICAgIChzaXplX3QpIFNDT1JFQk9BUkRfU0laRSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkJCSAgICBNQVBfU0hBUkVELCBmZCwgKG9mZl90KSAwKSkgPT0gKGNhZGRyX3QpIC0gMSkgewotCWFwX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlczogY2Fubm90IG1tYXAgc2NvcmVib2FyZCIsCi0JCSAgICBhcF9zZXJ2ZXJfYXJndjApOwotCXBlcnJvcihidWYpOwotCXNobV91bmxpbmsoYXBfc2NvcmVib2FyZF9mbmFtZSk7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIGNsb3NlKGZkKTsKLSAgICBhcF9yZWdpc3Rlcl9jbGVhbnVwKHAsIE5VTEwsIGNsZWFudXBfc2hhcmVkX21lbSwgYXBfbnVsbF9jbGVhbnVwKTsKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlID0gKHNjb3JlYm9hcmQgKikgbTsKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwucnVubmluZ19nZW5lcmF0aW9uID0gMDsKLX0KLQotc3RhdGljIHZvaWQgcmVvcGVuX3Njb3JlYm9hcmQocG9vbCAqcCkKLXsKLX0KLQotI2VsaWYgZGVmaW5lZChVU0VfTU1BUF9TQ09SRUJPQVJEKQotCi1zdGF0aWMgdm9pZCBzZXR1cF9zaGFyZWRfbWVtKHBvb2wgKnApCi17Ci0gICAgY2FkZHJfdCBtOwotCi0jaWYgZGVmaW5lZChNQVBfQU5PTikKLS8qIEJTRCBzdHlsZSAqLwotI2lmZGVmIENPTlZFWE9TMTEKLSAgICAvKgotICAgICAqIDktQXVnLTk3IC0gSmVmZiBWZW50ZXJzICh2ZW50ZXJzQGNvbnZleC5ocC5jb20pCi0gICAgICogQ29udmV4T1MgbWFwcyBhZGRyZXNzIHNwYWNlIGFzIGZvbGxvd3M6Ci0gICAgICogICAweDAwMDAwMDAwIC0gMHg3ZmZmZmZmZiA6IEtlcm5lbAotICAgICAqICAgMHg4MDAwMDAwMCAtIDB4ZmZmZmZmZmYgOiBVc2VyCi0gICAgICogU3RhcnQgbW1hcHBlZCBhcmVhIDFHQiBhYm92ZSBzdGFydCBvZiB0ZXh0LgotICAgICAqCi0gICAgICogQWxzbywgdGhlIGxlbmd0aCByZXF1aXJlcyBhIHBvaW50ZXIgYXMgdGhlIGFjdHVhbCBsZW5ndGggaXMKLSAgICAgKiByZXR1cm5lZCAocm91bmRlZCB1cCB0byBhIHBhZ2UgYm91bmRhcnkpLgotICAgICAqLwotICAgIHsKLQl1bnNpZ25lZCBsZW4gPSBTQ09SRUJPQVJEX1NJWkU7Ci0KLQltID0gbW1hcCgoY2FkZHJfdCkgMHhDMDAwMDAwMCwgJmxlbiwKLQkJIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9BTk9OIHwgTUFQX1NIQVJFRCwgTk9GRCwgMCk7Ci0gICAgfQotI2VsaWYgZGVmaW5lZChNQVBfVE1QRklMRSkKLSAgICB7Ci0JY2hhciBtZmlsZVtdID0gIi90bXAvYXBhY2hlX3NobWVtX1hYWFgiOwotCWludCBmZCA9IG1rc3RlbXAobWZpbGUpOwotCWlmIChmZCA9PSAtMSkgewotCSAgICBwZXJyb3IoIm9wZW4iKTsKLQkgICAgZnByaW50ZihzdGRlcnIsICIlczogQ291bGQgbm90IG9wZW4gJXNcbiIsIGFwX3NlcnZlcl9hcmd2MCwgbWZpbGUpOwotCSAgICBleGl0KEFQRVhJVF9JTklUKTsKLQl9Ci0JbSA9IG1tYXAoKGNhZGRyX3QpIDAsIFNDT1JFQk9BUkRfU0laRSwKLQkJUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmQsIDApOwotCWlmIChtID09IChjYWRkcl90KSAtIDEpIHsKLQkgICAgcGVycm9yKCJtbWFwIik7Ci0JICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IENvdWxkIG5vdCBtbWFwICVzXG4iLCBhcF9zZXJ2ZXJfYXJndjAsIG1maWxlKTsKLQkgICAgZXhpdChBUEVYSVRfSU5JVCk7Ci0JfQotCWNsb3NlKGZkKTsKLQl1bmxpbmsobWZpbGUpOwotICAgIH0KLSNlbHNlCi0gICAgbSA9IG1tYXAoKGNhZGRyX3QpIDAsIFNDT1JFQk9BUkRfU0laRSwKLQkgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9BTk9OIHwgTUFQX1NIQVJFRCwgLTEsIDApOwotI2VuZGlmCi0gICAgaWYgKG0gPT0gKGNhZGRyX3QpIC0gMSkgewotCXBlcnJvcigibW1hcCIpOwotCWZwcmludGYoc3RkZXJyLCAiJXM6IENvdWxkIG5vdCBtbWFwIG1lbW9yeVxuIiwgYXBfc2VydmVyX2FyZ3YwKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0jZWxzZQotLyogU3VuIHN0eWxlICovCi0gICAgaW50IGZkOwotCi0gICAgZmQgPSBvcGVuKCIvZGV2L3plcm8iLCBPX1JEV1IpOwotICAgIGlmIChmZCA9PSAtMSkgewotCXBlcnJvcigib3BlbiIpOwotCWZwcmludGYoc3RkZXJyLCAiJXM6IENvdWxkIG5vdCBvcGVuIC9kZXYvemVyb1xuIiwgYXBfc2VydmVyX2FyZ3YwKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0gICAgbSA9IG1tYXAoKGNhZGRyX3QpIDAsIFNDT1JFQk9BUkRfU0laRSwKLQkgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkLCAwKTsKLSAgICBpZiAobSA9PSAoY2FkZHJfdCkgLSAxKSB7Ci0JcGVycm9yKCJtbWFwIik7Ci0JZnByaW50ZihzdGRlcnIsICIlczogQ291bGQgbm90IG1tYXAgL2Rldi96ZXJvXG4iLCBhcF9zZXJ2ZXJfYXJndjApOwotCWV4aXQoQVBFWElUX0lOSVQpOwotICAgIH0KLSAgICBjbG9zZShmZCk7Ci0jZW5kaWYKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlID0gKHNjb3JlYm9hcmQgKikgbTsKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwucnVubmluZ19nZW5lcmF0aW9uID0gMDsKLX0KLQotc3RhdGljIHZvaWQgcmVvcGVuX3Njb3JlYm9hcmQocG9vbCAqcCkKLXsKLX0KLQotI2VsaWYgZGVmaW5lZChVU0VfU0hNR0VUX1NDT1JFQk9BUkQpCi1zdGF0aWMga2V5X3Qgc2hta2V5ID0gSVBDX1BSSVZBVEU7Ci1zdGF0aWMgaW50IHNobWlkID0gLTE7Ci0KLXN0YXRpYyB2b2lkIHNldHVwX3NoYXJlZF9tZW0ocG9vbCAqcCkKLXsKLSAgICBzdHJ1Y3Qgc2htaWRfZHMgc2htYnVmOwotI2lmZGVmIE1PVkVCUkVBSwotICAgIGNoYXIgKm9icms7Ci0jZW5kaWYKLQotICAgIGlmICgoc2htaWQgPSBzaG1nZXQoc2hta2V5LCBTQ09SRUJPQVJEX1NJWkUsIElQQ19DUkVBVCB8IFNITV9SIHwgU0hNX1cpKSA9PSAtMSkgewotI2lmZGVmIExJTlVYCi0JaWYgKGVycm5vID09IEVOT1NZUykgewotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FTUVSRywgc2VydmVyX2NvbmYsCi0JCQkgIllvdXIga2VybmVsIHdhcyBidWlsdCB3aXRob3V0IENPTkZJR19TWVNWSVBDXG4iCi0JCQkgIiVzOiBQbGVhc2UgY29uc3VsdCB0aGUgQXBhY2hlIEZBUSBmb3IgZGV0YWlscyIsCi0JCQkgYXBfc2VydmVyX2FyZ3YwKTsKLQl9Ci0jZW5kaWYKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkcsIHNlcnZlcl9jb25mLAotCQkgICAgImNvdWxkIG5vdCBjYWxsIHNobWdldCIpOwotCWV4aXQoQVBFWElUX0lOSVQpOwotICAgIH0KLQotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0lORk8sIHNlcnZlcl9jb25mLAotCQkiY3JlYXRlZCBzaGFyZWQgbWVtb3J5IHNlZ21lbnQgIyVkIiwgc2htaWQpOwotCi0jaWZkZWYgTU9WRUJSRUFLCi0gICAgLyoKLSAgICAgKiBTb21lIFN5c1Ygc3lzdGVtcyBwbGFjZSB0aGUgc2hhcmVkIHNlZ21lbnQgV0FZIHRvbyBjbG9zZQotICAgICAqIHRvIHRoZSBkeW5hbWljIG1lbW9yeSBicmVhayBwb2ludCAoc2JyaygwKSkuIFRoaXMgc2V2ZXJlbHkKLSAgICAgKiBsaW1pdHMgdGhlIHVzZSBvZiBtYWxsb2Mvc2JyayBpbiB0aGUgcHJvZ3JhbSBzaW5jZSBzYnJrIHdpbGwKLSAgICAgKiByZWZ1c2UgdG8gbW92ZSBwYXN0IHRoYXQgcG9pbnQuCi0gICAgICoKLSAgICAgKiBUbyBnZXQgYXJvdW5kIHRoaXMsIHdlIG1vdmUgdGhlIGJyZWFrIHBvaW50ICJ3YXkgdXAgdGhlcmUiLAotICAgICAqIGF0dGFjaCB0aGUgc2VnbWVudCBhbmQgdGhlbiBtb3ZlIGJyZWFrIGJhY2sgZG93bi4gVWdseQotICAgICAqLwotICAgIGlmICgob2JyayA9IHNicmsoTU9WRUJSRUFLKSkgPT0gKGNoYXIgKikgLTEpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzZXJ2ZXJfY29uZiwKLQkgICAgInNicmsoKSBjb3VsZCBub3QgbW92ZSBicmVhayIpOwotICAgIH0KLSNlbmRpZgotCi0jZGVmaW5lIEJBRFNITUFUCSgoc2NvcmVib2FyZCAqKSgtMSkpCi0gICAgaWYgKChhcF9zY29yZWJvYXJkX2ltYWdlID0gKHNjb3JlYm9hcmQgKikgc2htYXQoc2htaWQsIDAsIDApKSA9PSBCQURTSE1BVCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FTUVSRywgc2VydmVyX2NvbmYsICJzaG1hdCBlcnJvciIpOwotCS8qCi0JICogV2UgZXhpdCBiZWxvdywgYWZ0ZXIgd2UgdHJ5IHRvIHJlbW92ZSB0aGUgc2VnbWVudAotCSAqLwotICAgIH0KLSAgICBlbHNlIHsJCQkvKiBvbmx5IHdvcnJ5IGFib3V0IHBlcm1pc3Npb25zIGlmIHdlIGF0dGFjaGVkIHRoZSBzZWdtZW50ICovCi0JaWYgKHNobWN0bChzaG1pZCwgSVBDX1NUQVQsICZzaG1idWYpICE9IDApIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgc2VydmVyX2NvbmYsCi0JCSJzaG1jdGwoKSBjb3VsZCBub3Qgc3RhdCBzZWdtZW50ICMlZCIsIHNobWlkKTsKLQl9Ci0JZWxzZSB7Ci0JICAgIHNobWJ1Zi5zaG1fcGVybS51aWQgPSB1bml4ZF9jb25maWcudXNlcl9pZDsKLQkgICAgc2htYnVmLnNobV9wZXJtLmdpZCA9IHVuaXhkX2NvbmZpZy5ncm91cF9pZDsKLQkgICAgaWYgKHNobWN0bChzaG1pZCwgSVBDX1NFVCwgJnNobWJ1ZikgIT0gMCkgewotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzZXJ2ZXJfY29uZiwKLQkJICAgICJzaG1jdGwoKSBjb3VsZCBub3Qgc2V0IHNlZ21lbnQgIyVkIiwgc2htaWQpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICAvKgotICAgICAqIFdlIG11c3QgYXZvaWQgbGVhdmluZyBzZWdtZW50cyBpbiB0aGUga2VybmVsJ3MKLSAgICAgKiAoc21hbGwpIHRhYmxlcy4KLSAgICAgKi8KLSAgICBpZiAoc2htY3RsKHNobWlkLCBJUENfUk1JRCwgTlVMTCkgIT0gMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBzZXJ2ZXJfY29uZiwKLQkJInNobWN0bDogSVBDX1JNSUQ6IGNvdWxkIG5vdCByZW1vdmUgc2hhcmVkIG1lbW9yeSBzZWdtZW50ICMlZCIsCi0JCXNobWlkKTsKLSAgICB9Ci0gICAgaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UgPT0gQkFEU0hNQVQpCS8qIG5vdyBiYWlsb3V0ICovCi0JZXhpdChBUEVYSVRfSU5JVCk7Ci0KLSNpZmRlZiBNT1ZFQlJFQUsKLSAgICBpZiAob2JyayA9PSAoY2hhciAqKSAtMSkKLQlyZXR1cm47CQkJLyogbm90aGluZyBlbHNlIHRvIGRvICovCi0gICAgaWYgKHNicmsoLShNT1ZFQlJFQUspKSA9PSAoY2hhciAqKSAtMSkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHNlcnZlcl9jb25mLAotCSAgICAic2JyaygpIGNvdWxkIG5vdCBtb3ZlIGJyZWFrIGJhY2siKTsKLSAgICB9Ci0jZW5kaWYKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwucnVubmluZ19nZW5lcmF0aW9uID0gMDsKLX0KLQotc3RhdGljIHZvaWQgcmVvcGVuX3Njb3JlYm9hcmQocG9vbCAqcCkKLXsKLX0KLQotI2VsaWYgZGVmaW5lZChVU0VfVFBGX1NDT1JFQk9BUkQpCi0KLXN0YXRpYyB2b2lkIGNsZWFudXBfc2NvcmVib2FyZF9oZWFwKCkKLXsKLSAgICBpbnQgcnY7Ci0gICAgcnYgPSByc3lzYyhhcF9zY29yZWJvYXJkX2ltYWdlLCBTQ09SRUJPQVJEX0ZSQU1FUywgU0NPUkVCT0FSRF9OQU1FKTsKLSAgICBpZihydiA9PSBSU1lTQ19FUlJPUikgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICJyc3lzYygpIGNvdWxkIG5vdCByZWxlYXNlIHNjb3JlYm9hcmQgc3lzdGVtIGhlYXAiKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHNldHVwX3NoYXJlZF9tZW0ocG9vbCAqcCkKLXsKLSAgICBjaW5mYyhDSU5GQ19XUklURSwgQ0lORkNfQ01NQ1RLMik7Ci0gICAgYXBfc2NvcmVib2FyZF9pbWFnZSA9IChzY29yZWJvYXJkICopIGdzeXNjKFNDT1JFQk9BUkRfRlJBTUVTLCBTQ09SRUJPQVJEX05BTUUpOwotCi0gICAgaWYgKCFhcF9zY29yZWJvYXJkX2ltYWdlKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiaHR0cGQ6IENvdWxkIG5vdCBjcmVhdGUgc2NvcmVib2FyZCBzeXN0ZW0gaGVhcCBzdG9yYWdlLlxuIik7Ci0gICAgICAgIGV4aXQoQVBFWElUX0lOSVQpOwotICAgIH0KLQotICAgIGFwX3JlZ2lzdGVyX2NsZWFudXAocCwgTlVMTCwgY2xlYW51cF9zY29yZWJvYXJkX2hlYXAsIGFwX251bGxfY2xlYW51cCk7Ci0gICAgYXBfc2NvcmVib2FyZF9pbWFnZS0+Z2xvYmFsLnJ1bm5pbmdfZ2VuZXJhdGlvbiA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlb3Blbl9zY29yZWJvYXJkKHBvb2wgKnApCi17Ci0gICAgY2luZmMoQ0lORkNfV1JJVEUsIENJTkZDX0NNTUNUSzIpOwotfQotCi0jZWxzZQotI2RlZmluZSBTQ09SRUJPQVJEX0ZJTEUKLXN0YXRpYyBzY29yZWJvYXJkIF9zY29yZWJvYXJkX2ltYWdlOwotc3RhdGljIGludCBzY29yZWJvYXJkX2ZkID0gLTE7Ci0KLS8qIFhYWDogdGhpbmdzIGFyZSBzZXJpb3VzbHkgc2NyZXdlZCBpZiB3ZSBldmVyIGhhdmUgdG8gZG8gYSBwYXJ0aWFsCi0gKiByZWFkIG9yIHdyaXRlIC4uLiB3ZSBjb3VsZCBnZXQgYSBjb3JydXB0ZWQgc2NvcmVib2FyZAotICovCi1zdGF0aWMgaW50IGZvcmNlX3dyaXRlKGludCBmZCwgdm9pZCAqYnVmZmVyLCBpbnQgYnVmc3opCi17Ci0gICAgaW50IHJ2LCBvcmlnX3N6ID0gYnVmc3o7Ci0KLSAgICBkbyB7Ci0JcnYgPSB3cml0ZShmZCwgYnVmZmVyLCBidWZzeik7Ci0JaWYgKHJ2ID4gMCkgewotCSAgICBidWZmZXIgPSAoY2hhciAqKSBidWZmZXIgKyBydjsKLQkgICAgYnVmc3ogLT0gcnY7Ci0JfQotICAgIH0gd2hpbGUgKChydiA+IDAgJiYgYnVmc3ogPiAwKSB8fCAocnYgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpKTsKLQotICAgIHJldHVybiBydiA8IDAgPyBydiA6IG9yaWdfc3ogLSBidWZzejsKLX0KLQotc3RhdGljIGludCBmb3JjZV9yZWFkKGludCBmZCwgdm9pZCAqYnVmZmVyLCBpbnQgYnVmc3opCi17Ci0gICAgaW50IHJ2LCBvcmlnX3N6ID0gYnVmc3o7Ci0KLSAgICBkbyB7Ci0JcnYgPSByZWFkKGZkLCBidWZmZXIsIGJ1ZnN6KTsKLQlpZiAocnYgPiAwKSB7Ci0JICAgIGJ1ZmZlciA9IChjaGFyICopIGJ1ZmZlciArIHJ2OwotCSAgICBidWZzeiAtPSBydjsKLQl9Ci0gICAgfSB3aGlsZSAoKHJ2ID4gMCAmJiBidWZzeiA+IDApIHx8IChydiA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikpOwotCi0gICAgcmV0dXJuIHJ2IDwgMCA/IHJ2IDogb3JpZ19zeiAtIGJ1ZnN6OwotfQotCi1zdGF0aWMgdm9pZCBjbGVhbnVwX3Njb3JlYm9hcmRfZmlsZSh2b2lkICpmb28pCi17Ci0gICAgdW5saW5rKGFwX3Njb3JlYm9hcmRfZm5hbWUpOwotfQotCi12b2lkIHJlb3Blbl9zY29yZWJvYXJkKHBvb2wgKnApCi17Ci0gICAgaWYgKHNjb3JlYm9hcmRfZmQgIT0gLTEpCi0JYXBfcGNsb3NlZihwLCBzY29yZWJvYXJkX2ZkKTsKLQotI2lmZGVmIFRQRgotICAgIGFwX3Njb3JlYm9hcmRfZm5hbWUgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShwLCBhcF9zY29yZWJvYXJkX2ZuYW1lKTsKLSNlbmRpZiAvKiBUUEYgKi8KLSAgICBzY29yZWJvYXJkX2ZkID0gYXBfcG9wZW5mKHAsIGFwX3Njb3JlYm9hcmRfZm5hbWUsIE9fQ1JFQVQgfCBPX0JJTkFSWSB8IE9fUkRXUiwgMDY2Nik7Ci0gICAgaWYgKHNjb3JlYm9hcmRfZmQgPT0gLTEpIHsKLQlwZXJyb3IoYXBfc2NvcmVib2FyZF9mbmFtZSk7Ci0JZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiBzY29yZWJvYXJkIGZpbGU6XG4iKTsKLQljbGVhbl9jaGlsZF9leGl0KDEpOwotICAgIH0KLX0KLSNlbmRpZgotCi0vKiBDYWxsZWQgYnkgcGFyZW50IHByb2Nlc3MgKi8KLXN0YXRpYyB2b2lkIHJlaW5pdF9zY29yZWJvYXJkKHBvb2wgKnApCi17Ci0gICAgaW50IHJ1bm5pbmdfZ2VuID0gMDsKLSAgICBpZiAoYXBfc2NvcmVib2FyZF9pbWFnZSkKLQlydW5uaW5nX2dlbiA9IGFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbC5ydW5uaW5nX2dlbmVyYXRpb247Ci0KLSNpZm5kZWYgU0NPUkVCT0FSRF9GSUxFCi0gICAgaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UgPT0gTlVMTCkgewotCXNldHVwX3NoYXJlZF9tZW0ocCk7Ci0gICAgfQotICAgIG1lbXNldChhcF9zY29yZWJvYXJkX2ltYWdlLCAwLCBTQ09SRUJPQVJEX1NJWkUpOwotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbC5ydW5uaW5nX2dlbmVyYXRpb24gPSBydW5uaW5nX2dlbjsKLSNlbHNlCi0gICAgYXBfc2NvcmVib2FyZF9pbWFnZSA9ICZfc2NvcmVib2FyZF9pbWFnZTsKLSAgICBhcF9zY29yZWJvYXJkX2ZuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocCwgYXBfc2NvcmVib2FyZF9mbmFtZSk7Ci0KLSAgICBzY29yZWJvYXJkX2ZkID0gYXBfcG9wZW5mKHAsIGFwX3Njb3JlYm9hcmRfZm5hbWUsIE9fQ1JFQVQgfCBPX0JJTkFSWSB8IE9fUkRXUiwgMDY0NCk7Ci0gICAgaWYgKHNjb3JlYm9hcmRfZmQgPT0gLTEpIHsKLQlwZXJyb3IoYXBfc2NvcmVib2FyZF9mbmFtZSk7Ci0JZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiBzY29yZWJvYXJkIGZpbGU6XG4iKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0gICAgYXBfcmVnaXN0ZXJfY2xlYW51cChwLCBOVUxMLCBjbGVhbnVwX3Njb3JlYm9hcmRfZmlsZSwgYXBfbnVsbF9jbGVhbnVwKTsKLQotICAgIG1lbXNldCgoY2hhciAqKSBhcF9zY29yZWJvYXJkX2ltYWdlLCAwLCBzaXplb2YoKmFwX3Njb3JlYm9hcmRfaW1hZ2UpKTsKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwucnVubmluZ19nZW5lcmF0aW9uID0gcnVubmluZ19nZW47Ci0gICAgZm9yY2Vfd3JpdGUoc2NvcmVib2FyZF9mZCwgYXBfc2NvcmVib2FyZF9pbWFnZSwgc2l6ZW9mKCphcF9zY29yZWJvYXJkX2ltYWdlKSk7Ci0jZW5kaWYKLX0KLQotLyogUm91dGluZXMgY2FsbGVkIHRvIGRlYWwgd2l0aCB0aGUgc2NvcmVib2FyZCBpbWFnZQotICogLS0tIG5vdGUgdGhhdCB3ZSBkbyAqbm90KiBuZWVkIHdyaXRlIGxvY2tzLCBzaW5jZSB1cGRhdGVfY2hpbGRfc3RhdHVzCi0gKiBvbmx5IHVwZGF0ZXMgYSAqc2luZ2xlKiByZWNvcmQgaW4gcGxhY2UsIGFuZCBvbmx5IG9uZSBwcm9jZXNzIHdyaXRlcyB0bwotICogYSBnaXZlbiBzY29yZWJvYXJkIHNsb3QgYXQgYSB0aW1lIChlaXRoZXIgdGhlIGNoaWxkIHByb2Nlc3Mgb3duaW5nIHRoYXQKLSAqIHNsb3QsIG9yIHRoZSBwYXJlbnQsIG5vdGluZyB0aGF0IHRoZSBjaGlsZCBoYXMgZGllZCkuCi0gKgotICogQXMgYSBmaW5hbCBub3RlIC0tLSBzZXR0aW5nIHRoZSBzY29yZSBlbnRyeSB0byBnZXRwaWQoKSBpcyBhbHdheXMgc2FmZSwKLSAqIHNpbmNlIHdoZW4gdGhlIHBhcmVudCBpcyB3cml0aW5nIGFuIGVudHJ5LCBpdCdzIG9ubHkgbm90aW5nIFNFUlZFUl9ERUFECi0gKiBhbnl3YXkuCi0gKi8KLQotYXBfaW5saW5lIHZvaWQgYXBfc3luY19zY29yZWJvYXJkX2ltYWdlKHZvaWQpCi17Ci0jaWZkZWYgU0NPUkVCT0FSRF9GSUxFCi0gICAgbHNlZWsoc2NvcmVib2FyZF9mZCwgMEwsIDApOwotICAgIGZvcmNlX3JlYWQoc2NvcmVib2FyZF9mZCwgYXBfc2NvcmVib2FyZF9pbWFnZSwgc2l6ZW9mKCphcF9zY29yZWJvYXJkX2ltYWdlKSk7Ci0jZW5kaWYKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX2V4aXN0c19zY29yZWJvYXJkX2ltYWdlKHZvaWQpCi17Ci0gICAgcmV0dXJuIChhcF9zY29yZWJvYXJkX2ltYWdlID8gMSA6IDApOwotfQotCi1zdGF0aWMgYXBfaW5saW5lIHZvaWQgcHV0X3Njb3JlYm9hcmRfaW5mbyhpbnQgY2hpbGRfbnVtLAotCQkJCSAgICAgICBzaG9ydF9zY29yZSAqbmV3X3Njb3JlX3JlYykKLXsKLSNpZmRlZiBTQ09SRUJPQVJEX0ZJTEUKLSAgICBsc2VlayhzY29yZWJvYXJkX2ZkLCAobG9uZykgY2hpbGRfbnVtICogc2l6ZW9mKHNob3J0X3Njb3JlKSwgMCk7Ci0gICAgZm9yY2Vfd3JpdGUoc2NvcmVib2FyZF9mZCwgbmV3X3Njb3JlX3JlYywgc2l6ZW9mKHNob3J0X3Njb3JlKSk7Ci0jZW5kaWYKLX0KLQotaW50IGFwX3VwZGF0ZV9jaGlsZF9zdGF0dXMoaW50IGNoaWxkX251bSwgaW50IHN0YXR1cywgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IG9sZF9zdGF0dXM7Ci0gICAgc2hvcnRfc2NvcmUgKnNzOwotCi0gICAgaWYgKGNoaWxkX251bSA8IDApCi0JcmV0dXJuIC0xOwotCi0gICAgYXBfY2hlY2tfc2lnbmFscygpOwotCi0gICAgYXBfc3luY19zY29yZWJvYXJkX2ltYWdlKCk7Ci0gICAgc3MgPSAmYXBfc2NvcmVib2FyZF9pbWFnZS0+c2VydmVyc1tjaGlsZF9udW1dOwotICAgIG9sZF9zdGF0dXMgPSBzcy0+c3RhdHVzOwotICAgIHNzLT5zdGF0dXMgPSBzdGF0dXM7Ci0KLSAgICBpZiAoYXBfZXh0ZW5kZWRfc3RhdHVzKSB7Ci0JaWYgKHN0YXR1cyA9PSBTRVJWRVJfUkVBRFkgfHwgc3RhdHVzID09IFNFUlZFUl9ERUFEKSB7Ci0JICAgIC8qCi0JICAgICAqIFJlc2V0IGluZGl2aWR1YWwgY291bnRlcnMKLQkgICAgICovCi0JICAgIGlmIChzdGF0dXMgPT0gU0VSVkVSX0RFQUQpIHsKLQkJc3MtPm15X2FjY2Vzc19jb3VudCA9IDBMOwotCQlzcy0+bXlfYnl0ZXNfc2VydmVkID0gMEw7Ci0JICAgIH0KLQkgICAgc3MtPmNvbm5fY291bnQgPSAodW5zaWduZWQgc2hvcnQpIDA7Ci0JICAgIHNzLT5jb25uX2J5dGVzID0gKHVuc2lnbmVkIGxvbmcpIDA7Ci0JfQotCWlmIChyKSB7Ci0JICAgIGNvbm5fcmVjICpjID0gci0+Y29ubmVjdGlvbjsKLQkgICAgYXBfY3B5c3Rybihzcy0+Y2xpZW50LCBhcF9nZXRfcmVtb3RlX2hvc3QoYywgci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJICBSRU1PVEVfTk9MT09LVVApLCBzaXplb2Yoc3MtPmNsaWVudCkpOwotCSAgICBpZiAoci0+dGhlX3JlcXVlc3QgPT0gTlVMTCkgewotCQkgICAgYXBfY3B5c3Rybihzcy0+cmVxdWVzdCwgIk5VTEwiLCBzaXplb2Yoc3MtPnJlcXVlc3QpKTsKLQkgICAgfSBlbHNlIGlmIChyLT5wYXJzZWRfdXJpLnBhc3N3b3JkID09IE5VTEwpIHsKLQkJICAgIGFwX2NweXN0cm4oc3MtPnJlcXVlc3QsIHItPnRoZV9yZXF1ZXN0LCBzaXplb2Yoc3MtPnJlcXVlc3QpKTsKLQkgICAgfSBlbHNlIHsKLQkJLyogRG9uJ3QgcmV2ZWFsIHRoZSBwYXNzd29yZCBpbiB0aGUgc2VydmVyLXN0YXR1cyB2aWV3ICovCi0JCSAgICBhcF9jcHlzdHJuKHNzLT5yZXF1ZXN0LCBhcF9wc3RyY2F0KHItPnBvb2wsIHItPm1ldGhvZCwgIiAiLAotCQkJCQkgICAgICAgYXBfdW5wYXJzZV91cmlfY29tcG9uZW50cyhyLT5wb29sLCAmci0+cGFyc2VkX3VyaSwgVU5QX09NSVRQQVNTV09SRCksCi0JCQkJCSAgICAgICByLT5hc3NiYWNrd2FyZHMgPyBOVUxMIDogIiAiLCByLT5wcm90b2NvbCwgTlVMTCksCi0JCQkJICAgICAgIHNpemVvZihzcy0+cmVxdWVzdCkpOwotCSAgICB9Ci0JICAgIHNzLT52aG9zdHJlYyA9ICByLT5zZXJ2ZXI7Ci0JfQotICAgIH0KLSAgICBpZiAoc3RhdHVzID09IFNFUlZFUl9TVEFSVElORyAmJiByID09IE5VTEwpIHsKLQkvKiBjbGVhbiB1cCB0aGUgc2xvdCdzIHZob3N0cmVjIHBvaW50ZXIgKG1heWJlIHJlLXVzZWQpCi0JICogYW5kIG1hcmsgdGhlIHNsb3QgYXMgYmVsb25naW5nIHRvIGEgbmV3IGdlbmVyYXRpb24uCi0JICovCi0Jc3MtPnZob3N0cmVjID0gTlVMTDsKLQlhcF9zY29yZWJvYXJkX2ltYWdlLT5wYXJlbnRbY2hpbGRfbnVtXS5nZW5lcmF0aW9uID0gYXBfbXlfZ2VuZXJhdGlvbjsKLSNpZmRlZiBTQ09SRUJPQVJEX0ZJTEUKLQlsc2VlayhzY29yZWJvYXJkX2ZkLCBYdE9mZnNldE9mKHNjb3JlYm9hcmQsIHBhcmVudFtjaGlsZF9udW1dKSwgMCk7Ci0JZm9yY2Vfd3JpdGUoc2NvcmVib2FyZF9mZCwgJmFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtjaGlsZF9udW1dLAotCSAgICBzaXplb2YocGFyZW50X3Njb3JlKSk7Ci0jZW5kaWYKLSAgICB9Ci0gICAgcHV0X3Njb3JlYm9hcmRfaW5mbyhjaGlsZF9udW0sIHNzKTsKLQotICAgIHJldHVybiBvbGRfc3RhdHVzOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfc2NvcmVib2FyZF9nbG9iYWwodm9pZCkKLXsKLSNpZmRlZiBTQ09SRUJPQVJEX0ZJTEUKLSAgICBsc2VlayhzY29yZWJvYXJkX2ZkLAotCSAgKGNoYXIgKikgJmFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbCAtKGNoYXIgKikgYXBfc2NvcmVib2FyZF9pbWFnZSwgMCk7Ci0gICAgZm9yY2Vfd3JpdGUoc2NvcmVib2FyZF9mZCwgJmFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbCwKLQkJc2l6ZW9mIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbCk7Ci0jZW5kaWYKLX0KLQotdm9pZCBhcF90aW1lX3Byb2Nlc3NfcmVxdWVzdChpbnQgY2hpbGRfbnVtLCBpbnQgc3RhdHVzKQotewotICAgIHNob3J0X3Njb3JlICpzczsKLSNpZiBkZWZpbmVkKE5PX0dFVFRJTUVPRkRBWSkgJiYgIWRlZmluZWQoTk9fVElNRVMpCi0gICAgc3RydWN0IHRtcyB0bXNfYmxrOwotI2VuZGlmCi0KLSAgICBpZiAoY2hpbGRfbnVtIDwgMCkKLQlyZXR1cm47Ci0KLSAgICBhcF9zeW5jX3Njb3JlYm9hcmRfaW1hZ2UoKTsKLSAgICBzcyA9ICZhcF9zY29yZWJvYXJkX2ltYWdlLT5zZXJ2ZXJzW2NoaWxkX251bV07Ci0KLSAgICBpZiAoc3RhdHVzID09IFNUQVJUX1BSRVFVRVNUKSB7Ci0jaWYgZGVmaW5lZChOT19HRVRUSU1FT0ZEQVkpCi0jaWZuZGVmIE5PX1RJTUVTCi0JaWYgKChzcy0+c3RhcnRfdGltZSA9IHRpbWVzKCZ0bXNfYmxrKSkgPT0gLTEpCi0jZW5kaWYgLyogTk9fVElNRVMgKi8KLQkgICAgc3MtPnN0YXJ0X3RpbWUgPSAoY2xvY2tfdCkgMDsKLSNlbHNlCi0JaWYgKGdldHRpbWVvZmRheSgmc3MtPnN0YXJ0X3RpbWUsIChzdHJ1Y3QgdGltZXpvbmUgKikgMCkgPCAwKQotCSAgICBzcy0+c3RhcnRfdGltZS50dl9zZWMgPQotCQlzcy0+c3RhcnRfdGltZS50dl91c2VjID0gMEw7Ci0jZW5kaWYKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RhdHVzID09IFNUT1BfUFJFUVVFU1QpIHsKLSNpZiBkZWZpbmVkKE5PX0dFVFRJTUVPRkRBWSkKLSNpZm5kZWYgTk9fVElNRVMKLQlpZiAoKHNzLT5zdG9wX3RpbWUgPSB0aW1lcygmdG1zX2JsaykpID09IC0xKQotI2VuZGlmCi0JICAgIHNzLT5zdG9wX3RpbWUgPSBzcy0+c3RhcnRfdGltZSA9IChjbG9ja190KSAwOwotI2Vsc2UKLQlpZiAoZ2V0dGltZW9mZGF5KCZzcy0+c3RvcF90aW1lLCAoc3RydWN0IHRpbWV6b25lICopIDApIDwgMCkKLQkgICAgc3MtPnN0b3BfdGltZS50dl9zZWMgPQotCQlzcy0+c3RvcF90aW1lLnR2X3VzZWMgPQotCQlzcy0+c3RhcnRfdGltZS50dl9zZWMgPQotCQlzcy0+c3RhcnRfdGltZS50dl91c2VjID0gMEw7Ci0jZW5kaWYKLQotICAgIH0KLQotICAgIHB1dF9zY29yZWJvYXJkX2luZm8oY2hpbGRfbnVtLCBzcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGluY3JlbWVudF9jb3VudHMoaW50IGNoaWxkX251bSwgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgbG9uZyBpbnQgYnMgPSAwOwotICAgIHNob3J0X3Njb3JlICpzczsKLQotICAgIGFwX3N5bmNfc2NvcmVib2FyZF9pbWFnZSgpOwotICAgIHNzID0gJmFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbY2hpbGRfbnVtXTsKLQotICAgIGlmIChyLT5zZW50X2JvZHljdCkKLQlhcF9iZ2V0b3B0KHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQk9fQllURUNULCAmYnMpOwotCi0jaWZuZGVmIE5PX1RJTUVTCi0gICAgdGltZXMoJnNzLT50aW1lcyk7Ci0jZW5kaWYKLSAgICBzcy0+YWNjZXNzX2NvdW50Kys7Ci0gICAgc3MtPm15X2FjY2Vzc19jb3VudCsrOwotICAgIHNzLT5jb25uX2NvdW50Kys7Ci0gICAgc3MtPmJ5dGVzX3NlcnZlZCArPSAodW5zaWduZWQgbG9uZykgYnM7Ci0gICAgc3MtPm15X2J5dGVzX3NlcnZlZCArPSAodW5zaWduZWQgbG9uZykgYnM7Ci0gICAgc3MtPmNvbm5fYnl0ZXMgKz0gKHVuc2lnbmVkIGxvbmcpIGJzOwotCi0gICAgcHV0X3Njb3JlYm9hcmRfaW5mbyhjaGlsZF9udW0sIHNzKTsKLX0KLQotc3RhdGljIGludCBmaW5kX2NoaWxkX2J5X3BpZChpbnQgcGlkKQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG1heF9kYWVtb25zX2xpbWl0OyArK2kpCi0JaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtpXS5waWQgPT0gcGlkKQotCSAgICByZXR1cm4gaTsKLQotICAgIHJldHVybiAtMTsKLX0KLQotc3RhdGljIHZvaWQgcmVjbGFpbV9jaGlsZF9wcm9jZXNzZXMoaW50IHRlcm1pbmF0ZSkKLXsKLSNpZm5kZWYgTVVMVElUSFJFQUQKLSAgICBpbnQgaSwgc3RhdHVzOwotICAgIGxvbmcgaW50IHdhaXR0aW1lID0gMTAyNCAqIDE2OwkvKiBpbiB1c2VjcyAqLwotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgIGludCB3YWl0cmV0LCB0cmllczsKLSAgICBpbnQgbm90X2RlYWRfeWV0OwotI2lmZGVmIEhBU19PVEhFUl9DSElMRAotICAgIG90aGVyX2NoaWxkX3JlYyAqb2NyLCAqbm9jcjsKLSNlbmRpZgotCi0gICAgYXBfc3luY19zY29yZWJvYXJkX2ltYWdlKCk7Ci0KLSAgICBmb3IgKHRyaWVzID0gdGVybWluYXRlID8gNCA6IDE7IHRyaWVzIDw9IDk7ICsrdHJpZXMpIHsKLQkvKiBkb24ndCB3YW50IHRvIGhvbGQgdXAgcHJvZ3Jlc3MgYW55IG1vcmUgdGhhbiAKLQkgKiBuZWNlc3NhcnksIGJ1dCB3ZSBuZWVkIHRvIGFsbG93IGNoaWxkcmVuIGEgZmV3IG1vbWVudHMgdG8gZXhpdC4KLQkgKiBTZXQgZGVsYXkgd2l0aCBhbiBleHBvbmVudGlhbCBiYWNrb2ZmLgotCSAqLwotCXR2LnR2X3NlYyA9IHdhaXR0aW1lIC8gMTAwMDAwMDsKLQl0di50dl91c2VjID0gd2FpdHRpbWUgJSAxMDAwMDAwOwotCXdhaXR0aW1lID0gd2FpdHRpbWUgKiA0OwotCWFwX3NlbGVjdCgwLCBOVUxMLCBOVUxMLCBOVUxMLCAmdHYpOwotCi0JLyogbm93IHNlZSB3aG8gaXMgZG9uZSAqLwotCW5vdF9kZWFkX3lldCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IG1heF9kYWVtb25zX2xpbWl0OyArK2kpIHsKLQkgICAgaW50IHBpZCA9IGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtpXS5waWQ7Ci0KLQkgICAgaWYgKHBpZCA9PSBteV9waWQgfHwgcGlkID09IDApCi0JCWNvbnRpbnVlOwotCi0JICAgIHdhaXRyZXQgPSB3YWl0cGlkKHBpZCwgJnN0YXR1cywgV05PSEFORyk7Ci0JICAgIGlmICh3YWl0cmV0ID09IHBpZCB8fCB3YWl0cmV0ID09IC0xKSB7Ci0JCWFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtpXS5waWQgPSAwOwotCQljb250aW51ZTsKLQkgICAgfQotCSAgICArK25vdF9kZWFkX3lldDsKLQkgICAgc3dpdGNoICh0cmllcykgewotCSAgICBjYXNlIDE6ICAgICAvKiAgMTZtcyAqLwotCSAgICBjYXNlIDI6ICAgICAvKiAgODJtcyAqLwotCQlicmVhazsKLQkgICAgY2FzZSAzOiAgICAgLyogMzQ0bXMgKi8KLQkJLyogcGVyaGFwcyBpdCBtaXNzZWQgdGhlIFNJR0hVUCwgbGV0cyB0cnkgYWdhaW4gKi8KLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfV0FSTklORywKLQkJCSAgICBzZXJ2ZXJfY29uZiwKLQkJICAgICJjaGlsZCBwcm9jZXNzICVkIGRpZCBub3QgZXhpdCwgc2VuZGluZyBhbm90aGVyIFNJR0hVUCIsCi0JCQkgICAgcGlkKTsKLQkJa2lsbChwaWQsIFNJR0hVUCk7Ci0JCXdhaXR0aW1lID0gMTAyNCAqIDE2OwotCQlicmVhazsKLQkgICAgY2FzZSA0OiAgICAgLyogIDE2bXMgKi8KLQkgICAgY2FzZSA1OiAgICAgLyogIDgybXMgKi8KLQkgICAgY2FzZSA2OiAgICAgLyogMzQ0bXMgKi8KLQkJYnJlYWs7Ci0JICAgIGNhc2UgNzogICAgIC8qIDEuNHNlYyAqLwotCQkvKiBvaywgbm93IGl0J3MgYmVpbmcgYW5ub3lpbmcgKi8KLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfV0FSTklORywKLQkJCSAgICBzZXJ2ZXJfY29uZiwKLQkJICAgImNoaWxkIHByb2Nlc3MgJWQgc3RpbGwgZGlkIG5vdCBleGl0LCBzZW5kaW5nIGEgU0lHVEVSTSIsCi0JCQkgICAgcGlkKTsKLQkJa2lsbChwaWQsIFNJR1RFUk0pOwotCQlicmVhazsKLQkgICAgY2FzZSA4OiAgICAgLyogIDYgc2VjICovCi0JCS8qIGRpZSBjaGlsZCBzY3VtICovCi0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgc2VydmVyX2NvbmYsCi0JCSAgICJjaGlsZCBwcm9jZXNzICVkIHN0aWxsIGRpZCBub3QgZXhpdCwgc2VuZGluZyBhIFNJR0tJTEwiLAotCQkJICAgIHBpZCk7Ci0JCWtpbGwocGlkLCBTSUdLSUxMKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgOTogICAgIC8qIDE0IHNlYyAqLwotCQkvKiBnYXZlIGl0IG91ciBiZXN0IHNob3QsIGJ1dCBhbGFzLi4uICBJZiB0aGlzIHJlYWxseSAKLQkJICogaXMgYSBjaGlsZCB3ZSBhcmUgdHJ5aW5nIHRvIGtpbGwgYW5kIGl0IHJlYWxseSBoYXNuJ3QKLQkJICogZXhpdGVkLCB3ZSB3aWxsIGxpa2VseSBmYWlsIHRvIGJpbmQgdG8gdGhlIHBvcnQKLQkJICogYWZ0ZXIgdGhlIHJlc3RhcnQuCi0JCSAqLwotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHNlcnZlcl9jb25mLAotCQkJICAgICJjb3VsZCBub3QgbWFrZSBjaGlsZCBwcm9jZXNzICVkIGV4aXQsICIKLQkJCSAgICAiYXR0ZW1wdGluZyB0byBjb250aW51ZSBhbnl3YXkiLCBwaWQpOwotCQlicmVhazsKLQkgICAgfQotCX0KLSNpZmRlZiBIQVNfT1RIRVJfQ0hJTEQKLQlmb3IgKG9jciA9IG90aGVyX2NoaWxkcmVuOyBvY3I7IG9jciA9IG5vY3IpIHsKLQkgICAgbm9jciA9IG9jci0+bmV4dDsKLQkgICAgaWYgKG9jci0+cGlkID09IC0xKQotCQljb250aW51ZTsKLQotCSAgICB3YWl0cmV0ID0gd2FpdHBpZChvY3ItPnBpZCwgJnN0YXR1cywgV05PSEFORyk7Ci0JICAgIGlmICh3YWl0cmV0ID09IG9jci0+cGlkKSB7Ci0JCW9jci0+cGlkID0gLTE7Ci0JCSgqb2NyLT5tYWludGVuYW5jZSkgKE9DX1JFQVNPTl9ERUFUSCwgb2NyLT5kYXRhLCBzdGF0dXMpOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHdhaXRyZXQgPT0gMCkgewotCQkoKm9jci0+bWFpbnRlbmFuY2UpIChPQ19SRUFTT05fUkVTVEFSVCwgb2NyLT5kYXRhLCAtMSk7Ci0JCSsrbm90X2RlYWRfeWV0OwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHdhaXRyZXQgPT0gLTEpIHsKLQkJLyogdWggd2hhdCB0aGUgaGVjaz8gdGhleSBkaWRuJ3QgY2FsbCB1bnJlZ2lzdGVyPyAqLwotCQlvY3ItPnBpZCA9IC0xOwotCQkoKm9jci0+bWFpbnRlbmFuY2UpIChPQ19SRUFTT05fTE9TVCwgb2NyLT5kYXRhLCAtMSk7Ci0JICAgIH0KLQl9Ci0jZW5kaWYKLQlpZiAoIW5vdF9kZWFkX3lldCkgewotCSAgICAvKiBub3RoaW5nIGxlZnQgdG8gd2FpdCBmb3IgKi8KLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZiAvKiBuZGVmIE1VTFRJVEhSRUFEICovCi19Ci0KLQotI2lmIGRlZmluZWQoTkVFRF9XQUlUUElEKQotLyoKLSAgIFN5c3RlbXMgd2l0aG91dCBhIHJlYWwgd2FpdHBpZCBzb21ldGltZXMgbG9zZSBhIGNoaWxkJ3MgZXhpdCB3aGlsZSB3YWl0aW5nCi0gICBmb3IgYW5vdGhlci4gIFNlYXJjaCB0aHJvdWdoIHRoZSBzY29yZWJvYXJkIGZvciBtaXNzaW5nIGNoaWxkcmVuLgotICovCi1pbnQgcmVhcF9jaGlsZHJlbihhcF93YWl0X3QgKnN0YXR1cykKLXsKLSAgICBpbnQgbiwgcGlkOwotCi0gICAgZm9yIChuID0gMDsgbiA8IG1heF9kYWVtb25zX2xpbWl0OyArK24pIHsKLSAgICAgICAgYXBfc3luY19zY29yZWJvYXJkX2ltYWdlKCk7Ci0JaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbbl0uc3RhdHVzICE9IFNFUlZFUl9ERUFEICYmCi0JCWtpbGwoKHBpZCA9IGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtuXS5waWQpLCAwKSA9PSAtMSkgewotCSAgICBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKG4sIFNFUlZFUl9ERUFELCBOVUxMKTsKLQkgICAgLyoganVzdCBtYXJrIGl0IGFzIGhhdmluZyBhIHN1Y2Nlc3NmdWwgZXhpdCBzdGF0dXMgKi8KLQkgICAgYnplcm8oKGNoYXIgKikgc3RhdHVzLCBzaXplb2YoYXBfd2FpdF90KSk7Ci0JICAgIHJldHVybihwaWQpOwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotLyogRmluYWxseSwgdGhpcyByb3V0aW5lIGlzIHVzZWQgYnkgdGhlIGNhcmV0YWtlciBwcm9jZXNzIHRvIHdhaXQgZm9yCi0gKiBhIHdoaWxlLi4uCi0gKi8KLQotLyogbnVtYmVyIG9mIGNhbGxzIHRvIHdhaXRfb3JfdGltZW91dCBiZXR3ZWVuIHdyaXRhYmxlIHByb2JlcyAqLwotI2lmbmRlZiBJTlRFUlZBTF9PRl9XUklUQUJMRV9QUk9CRVMKLSNkZWZpbmUgSU5URVJWQUxfT0ZfV1JJVEFCTEVfUFJPQkVTIDEwCi0jZW5kaWYKLXN0YXRpYyBpbnQgd2FpdF9vcl90aW1lb3V0X2NvdW50ZXI7Ci0KLXN0YXRpYyBpbnQgd2FpdF9vcl90aW1lb3V0KGFwX3dhaXRfdCAqc3RhdHVzKQotewotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgIGludCByZXQ7Ci0KLSAgICArK3dhaXRfb3JfdGltZW91dF9jb3VudGVyOwotICAgIGlmICh3YWl0X29yX3RpbWVvdXRfY291bnRlciA9PSBJTlRFUlZBTF9PRl9XUklUQUJMRV9QUk9CRVMpIHsKLQl3YWl0X29yX3RpbWVvdXRfY291bnRlciA9IDA7Ci0jaWZkZWYgSEFTX09USEVSX0NISUxECi0JcHJvYmVfd3JpdGFibGVfZmRzKCk7Ci0jZW5kaWYKLSAgICB9Ci0gICAgcmV0ID0gd2FpdHBpZCgtMSwgc3RhdHVzLCBXTk9IQU5HKTsKLSAgICBpZiAocmV0ID09IC0xICYmIGVycm5vID09IEVJTlRSKSB7Ci0JcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAocmV0ID4gMCkgewotCXJldHVybiByZXQ7Ci0gICAgfQotI2lmZGVmIE5FRURfV0FJVFBJRAotICAgIGlmICgocmV0ID0gcmVhcF9jaGlsZHJlbihzdGF0dXMpKSA+IDApIHsKLQlyZXR1cm4gcmV0OwotICAgIH0KLSNlbmRpZgotICAgIHR2LnR2X3NlYyA9IFNDT1JFQk9BUkRfTUFJTlRFTkFOQ0VfSU5URVJWQUwgLyAxMDAwMDAwOwotICAgIHR2LnR2X3VzZWMgPSBTQ09SRUJPQVJEX01BSU5URU5BTkNFX0lOVEVSVkFMICUgMTAwMDAwMDsKLSAgICBhcF9zZWxlY3QoMCwgTlVMTCwgTlVMTCwgTlVMTCwgJnR2KTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLQotI2lmIGRlZmluZWQoTlNJRykKLSNkZWZpbmUgTnVtU0lHIE5TSUcKLSNlbGlmIGRlZmluZWQoX05TSUcpCi0jZGVmaW5lIE51bVNJRyBfTlNJRwotI2VsaWYgZGVmaW5lZChfX05TSUcpCi0jZGVmaW5lIE51bVNJRyBfX05TSUcKLSNlbHNlCi0jZGVmaW5lIE51bVNJRyAzMiAgIC8qIGZvciAxOTk4J3MgdW5peGVzLCB0aGlzIGlzIHN0aWxsIGEgZ29vZCBhc3N1bXB0aW9uICovCi0jZW5kaWYKLQotI2lmZGVmIFNZU19TSUdMSVNUIC8qIHBsYXRmb3JtIGhhcyBzeXNfc2lnbGlzdFtdICovCi0jZGVmaW5lIElOSVRfU0lHTElTVCgpICAvKm5vdGhpbmcqLwotI2Vsc2UgLyogcGxhdGZvcm0gaGFzIG5vIHN5c19zaWdsaXN0W10sIGRlZmluZSBvdXIgb3duICovCi0jZGVmaW5lIFNZU19TSUdMSVNUIGFwX3N5c19zaWdsaXN0Ci0jZGVmaW5lIElOSVRfU0lHTElTVCgpIHNpZ2xpc3RfaW5pdCgpOwotCi1jb25zdCBjaGFyICphcF9zeXNfc2lnbGlzdFtOdW1TSUddOwotCi1zdGF0aWMgdm9pZCBzaWdsaXN0X2luaXQodm9pZCkKLXsKLSAgICBpbnQgc2lnOwotCi0gICAgYXBfc3lzX3NpZ2xpc3RbMF0gPSAiU2lnbmFsIDAiOwotI2lmZGVmIFNJR0hVUAotICAgIGFwX3N5c19zaWdsaXN0W1NJR0hVUF0gPSAiSGFuZ3VwIjsKLSNlbmRpZgotI2lmZGVmIFNJR0lOVAotICAgIGFwX3N5c19zaWdsaXN0W1NJR0lOVF0gPSAiSW50ZXJydXB0IjsKLSNlbmRpZgotI2lmZGVmIFNJR1FVSVQKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdRVUlUXSA9ICJRdWl0IjsKLSNlbmRpZgotI2lmZGVmIFNJR0lMTAotICAgIGFwX3N5c19zaWdsaXN0W1NJR0lMTF0gPSAiSWxsZWdhbCBpbnN0cnVjdGlvbiI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdUUkFQCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHVFJBUF0gPSAiVHJhY2UvQlBUIHRyYXAiOwotI2VuZGlmCi0jaWZkZWYgU0lHSU9UCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHSU9UXSA9ICJJT1QgaW5zdHJ1Y3Rpb24iOwotI2VuZGlmCi0jaWZkZWYgU0lHQUJSVAotICAgIGFwX3N5c19zaWdsaXN0W1NJR0FCUlRdID0gIkFib3J0IjsKLSNlbmRpZgotI2lmZGVmIFNJR0VNVAotICAgIGFwX3N5c19zaWdsaXN0W1NJR0VNVF0gPSAiRW11bGF0b3IgdHJhcCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdGUEUKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdGUEVdID0gIkFyaXRobWV0aWMgZXhjZXB0aW9uIjsKLSNlbmRpZgotI2lmZGVmIFNJR0tJTEwKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdLSUxMXSA9ICJLaWxsZWQiOwotI2VuZGlmCi0jaWZkZWYgU0lHQlVTCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHQlVTXSA9ICJCdXMgZXJyb3IiOwotI2VuZGlmCi0jaWZkZWYgU0lHU0VHVgotICAgIGFwX3N5c19zaWdsaXN0W1NJR1NFR1ZdID0gIlNlZ21lbnRhdGlvbiBmYXVsdCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdTWVMKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdTWVNdID0gIkJhZCBzeXN0ZW0gY2FsbCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdQSVBFCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHUElQRV0gPSAiQnJva2VuIHBpcGUiOwotI2VuZGlmCi0jaWZkZWYgU0lHQUxSTQotICAgIGFwX3N5c19zaWdsaXN0W1NJR0FMUk1dID0gIkFsYXJtIGNsb2NrIjsKLSNlbmRpZgotI2lmZGVmIFNJR1RFUk0KLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdURVJNXSA9ICJUZXJtaW5hdGVkIjsKLSNlbmRpZgotI2lmZGVmIFNJR1VTUjEKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdVU1IxXSA9ICJVc2VyIGRlZmluZWQgc2lnbmFsIDEiOwotI2VuZGlmCi0jaWZkZWYgU0lHVVNSMgotICAgIGFwX3N5c19zaWdsaXN0W1NJR1VTUjJdID0gIlVzZXIgZGVmaW5lZCBzaWduYWwgMiI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdDTEQKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdDTERdID0gIkNoaWxkIHN0YXR1cyBjaGFuZ2UiOwotI2VuZGlmCi0jaWZkZWYgU0lHQ0hMRAotICAgIGFwX3N5c19zaWdsaXN0W1NJR0NITERdID0gIkNoaWxkIHN0YXR1cyBjaGFuZ2UiOwotI2VuZGlmCi0jaWZkZWYgU0lHUFdSCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHUFdSXSA9ICJQb3dlci1mYWlsIHJlc3RhcnQiOwotI2VuZGlmCi0jaWZkZWYgU0lHV0lOQ0gKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdXSU5DSF0gPSAiV2luZG93IGNoYW5nZWQiOwotI2VuZGlmCi0jaWZkZWYgU0lHVVJHCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHVVJHXSA9ICJ1cmdlbnQgc29ja2V0IGNvbmRpdGlvbiI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdQT0xMCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHUE9MTF0gPSAiUG9sbGFibGUgZXZlbnQgb2NjdXJyZWQiOwotI2VuZGlmCi0jaWZkZWYgU0lHSU8KLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdJT10gPSAic29ja2V0IEkvTyBwb3NzaWJsZSI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdTVE9QCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHU1RPUF0gPSAiU3RvcHBlZCAoc2lnbmFsKSI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdUU1RQCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHVFNUUF0gPSAiU3RvcHBlZCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdDT05UCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHQ09OVF0gPSAiQ29udGludWVkIjsKLSNlbmRpZgotI2lmZGVmIFNJR1RUSU4KLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdUVElOXSA9ICJTdG9wcGVkICh0dHkgaW5wdXQpIjsKLSNlbmRpZgotI2lmZGVmIFNJR1RUT1UKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdUVE9VXSA9ICJTdG9wcGVkICh0dHkgb3V0cHV0KSI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdWVEFMUk0KLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdWVEFMUk1dID0gInZpcnR1YWwgdGltZXIgZXhwaXJlZCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdQUk9GCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHUFJPRl0gPSAicHJvZmlsaW5nIHRpbWVyIGV4cGlyZWQiOwotI2VuZGlmCi0jaWZkZWYgU0lHWENQVQotICAgIGFwX3N5c19zaWdsaXN0W1NJR1hDUFVdID0gImV4Y2VlZGVkIGNwdSBsaW1pdCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdYRlNaCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHWEZTWl0gPSAiZXhjZWVkZWQgZmlsZSBzaXplIGxpbWl0IjsKLSNlbmRpZgotICAgIGZvciAoc2lnPTA7IHNpZyA8IHNpemVvZihhcF9zeXNfc2lnbGlzdCkvc2l6ZW9mKGFwX3N5c19zaWdsaXN0WzBdKTsgKytzaWcpCi0gICAgICAgIGlmIChhcF9zeXNfc2lnbGlzdFtzaWddID09IE5VTEwpCi0gICAgICAgICAgICBhcF9zeXNfc2lnbGlzdFtzaWddID0gIiI7Ci19Ci0jZW5kaWYgLyogcGxhdGZvcm0gaGFzIHN5c19zaWdsaXN0W10gKi8KLQotCi0vKiBoYW5kbGUgYWxsIHZhcmlldGllcyBvZiBjb3JlIGR1bXBpbmcgc2lnbmFscyAqLwotc3RhdGljIHZvaWQgc2lnX2NvcmVkdW1wKGludCBzaWcpCi17Ci0gICAgY2hkaXIoYXBfY29yZWR1bXBfZGlyKTsKLSAgICBzaWduYWwoc2lnLCBTSUdfREZMKTsKLSAgICBraWxsKGdldHBpZCgpLCBzaWcpOwotICAgIC8qIEF0IHRoaXMgcG9pbnQgd2UndmUgZ290IHNpZyBibG9ja2VkLCBiZWNhdXNlIHdlJ3JlIHN0aWxsIGluc2lkZQotICAgICAqIHRoZSBzaWduYWwgaGFuZGxlci4gIFdoZW4gd2UgbGVhdmUgdGhlIHNpZ25hbCBoYW5kbGVyIGl0IHdpbGwKLSAgICAgKiBiZSB1bmJsb2NrZWQsIGFuZCB3ZSdsbCB0YWtlIHRoZSBzaWduYWwuLi4gYW5kIGNvcmVkdW1wIG9yIHdoYXRldmVyCi0gICAgICogaXMgYXBwcm9wcmlhdGUgZm9yIHRoaXMgcGFydGljdWxhciBVbml4LiAgSW4gYWRkaXRpb24gdGhlIHBhcmVudAotICAgICAqIHdpbGwgc2VlIHRoZSByZWFsIHNpZ25hbCB3ZSByZWNlaXZlZCAtLSB3aGVyZWFzIGlmIHdlIGNhbGxlZAotICAgICAqIGFib3J0KCkgaGVyZSwgdGhlIHBhcmVudCB3b3VsZCBvbmx5IHNlZSBTSUdBQlJULgotICAgICAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbm5lY3Rpb24gc3RydWN0dXJlcyBhbmQgYWNjb3VudGluZy4uLgotICovCi0KLXN0YXRpYyB2b2lkIGp1c3RfZGllKGludCBzaWcpCi17Ci0gICAgY2xlYW5fY2hpbGRfZXhpdCgwKTsKLX0KLQotc3RhdGljIGludCB2b2xhdGlsZSBkZWZlcnJlZF9kaWU7Ci1zdGF0aWMgaW50IHZvbGF0aWxlIHVzcjFfanVzdF9kaWU7Ci0KLXN0YXRpYyB2b2lkIHVzcjFfaGFuZGxlcihpbnQgc2lnKQotewotICAgIGlmICh1c3IxX2p1c3RfZGllKSB7Ci0JanVzdF9kaWUoc2lnKTsKLSAgICB9Ci0gICAgZGVmZXJyZWRfZGllID0gMTsKLX0KLQotLyogdm9sYXRpbGUganVzdCBpbiBjYXNlICovCi1zdGF0aWMgaW50IHZvbGF0aWxlIHNodXRkb3duX3BlbmRpbmc7Ci1zdGF0aWMgaW50IHZvbGF0aWxlIHJlc3RhcnRfcGVuZGluZzsKLXN0YXRpYyBpbnQgdm9sYXRpbGUgaXNfZ3JhY2VmdWw7Ci1hcF9nZW5lcmF0aW9uX3Qgdm9sYXRpbGUgYXBfbXlfZ2VuZXJhdGlvbj0wOwotCi1zdGF0aWMgdm9pZCBzaWdfdGVybShpbnQgc2lnKQotewotICAgIGlmIChzaHV0ZG93bl9wZW5kaW5nID09IDEpIHsKLQkvKiBVbSwgaXMgdGhpcyBfcHJvYmFibHlfIG5vdCBhbiBlcnJvciwgaWYgdGhlIHVzZXIgaGFzCi0JICogdHJpZWQgdG8gZG8gYSBzaHV0ZG93biB0d2ljZSBxdWlja2x5LCBzbyB3ZSB3b24ndAotCSAqIHdvcnJ5IGFib3V0IHJlcG9ydGluZyBpdC4KLQkgKi8KLQlyZXR1cm47Ci0gICAgfQotICAgIHNodXRkb3duX3BlbmRpbmcgPSAxOwotfQotCi1zdGF0aWMgdm9pZCByZXN0YXJ0KGludCBzaWcpCi17Ci0gICAgaWYgKHJlc3RhcnRfcGVuZGluZyA9PSAxKSB7Ci0JLyogUHJvYmFibHkgbm90IGFuIGVycm9yIC0gZG9uJ3QgYm90aGVyIHJlcG9ydGluZyBpdCAqLwotCXJldHVybjsKLSAgICB9Ci0gICAgcmVzdGFydF9wZW5kaW5nID0gMTsKLSAgICBpc19ncmFjZWZ1bCA9IHNpZyA9PSBTSUdVU1IxOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfc2lnbmFscyh2b2lkKQotewotI2lmbmRlZiBOT19VU0VfU0lHQUNUSU9OCi0gICAgc3RydWN0IHNpZ2FjdGlvbiBzYTsKLQotICAgIHNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsKLSAgICBzYS5zYV9mbGFncyA9IDA7Ci0KLSAgICBpZiAoIW9uZV9wcm9jZXNzKSB7Ci0Jc2Euc2FfaGFuZGxlciA9IHNpZ19jb3JlZHVtcDsKLSNpZiBkZWZpbmVkKFNBX09ORVNIT1QpCi0Jc2Euc2FfZmxhZ3MgPSBTQV9PTkVTSE9UOwotI2VsaWYgZGVmaW5lZChTQV9SRVNFVEhBTkQpCi0Jc2Euc2FfZmxhZ3MgPSBTQV9SRVNFVEhBTkQ7Ci0jZW5kaWYKLQlpZiAoc2lnYWN0aW9uKFNJR1NFR1YsICZzYSwgTlVMTCkgPCAwKQotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHU0VHVikiKTsKLSNpZmRlZiBTSUdCVVMKLQlpZiAoc2lnYWN0aW9uKFNJR0JVUywgJnNhLCBOVUxMKSA8IDApCi0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdCVVMpIik7Ci0jZW5kaWYKLSNpZmRlZiBTSUdBQk9SVAotCWlmIChzaWdhY3Rpb24oU0lHQUJPUlQsICZzYSwgTlVMTCkgPCAwKQotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHQUJPUlQpIik7Ci0jZW5kaWYKLSNpZmRlZiBTSUdBQlJUCi0JaWYgKHNpZ2FjdGlvbihTSUdBQlJULCAmc2EsIE5VTEwpIDwgMCkKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR0FCUlQpIik7Ci0jZW5kaWYKLSNpZmRlZiBTSUdJTEwKLQlpZiAoc2lnYWN0aW9uKFNJR0lMTCwgJnNhLCBOVUxMKSA8IDApCi0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdJTEwpIik7Ci0jZW5kaWYKLQlzYS5zYV9mbGFncyA9IDA7Ci0gICAgfQotICAgIHNhLnNhX2hhbmRsZXIgPSBzaWdfdGVybTsKLSAgICBpZiAoc2lnYWN0aW9uKFNJR1RFUk0sICZzYSwgTlVMTCkgPCAwKQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdURVJNKSIpOwotI2lmZGVmIFNJR0lOVAotICAgIGlmIChzaWdhY3Rpb24oU0lHSU5ULCAmc2EsIE5VTEwpIDwgMCkKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR0lOVCkiKTsKLSNlbmRpZgotI2lmZGVmIFNJR1hDUFUKLSAgICBzYS5zYV9oYW5kbGVyID0gU0lHX0RGTDsKLSAgICBpZiAoc2lnYWN0aW9uKFNJR1hDUFUsICZzYSwgTlVMTCkgPCAwKQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdYQ1BVKSIpOwotI2VuZGlmCi0jaWZkZWYgU0lHWEZTWgotICAgIHNhLnNhX2hhbmRsZXIgPSBTSUdfREZMOwotICAgIGlmIChzaWdhY3Rpb24oU0lHWEZTWiwgJnNhLCBOVUxMKSA8IDApCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR1hGU1opIik7Ci0jZW5kaWYKLSNpZmRlZiBTSUdQSVBFCi0gICAgc2Euc2FfaGFuZGxlciA9IFNJR19JR047Ci0gICAgaWYgKHNpZ2FjdGlvbihTSUdQSVBFLCAmc2EsIE5VTEwpIDwgMCkKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHUElQRSkiKTsKLSNlbmRpZgotCi0gICAgLyogd2Ugd2FudCB0byBpZ25vcmUgSFVQcyBhbmQgVVNSMSB3aGlsZSB3ZSdyZSBidXN5IHByb2Nlc3Npbmcgb25lICovCi0gICAgc2lnYWRkc2V0KCZzYS5zYV9tYXNrLCBTSUdIVVApOwotICAgIHNpZ2FkZHNldCgmc2Euc2FfbWFzaywgU0lHVVNSMSk7Ci0gICAgc2Euc2FfaGFuZGxlciA9IHJlc3RhcnQ7Ci0gICAgaWYgKHNpZ2FjdGlvbihTSUdIVVAsICZzYSwgTlVMTCkgPCAwKQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdIVVApIik7Ci0gICAgaWYgKHNpZ2FjdGlvbihTSUdVU1IxLCAmc2EsIE5VTEwpIDwgMCkKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHVVNSMSkiKTsKLSNlbHNlCi0gICAgaWYgKCFvbmVfcHJvY2VzcykgewotCXNpZ25hbChTSUdTRUdWLCBzaWdfY29yZWR1bXApOwotI2lmZGVmIFNJR0JVUwotCXNpZ25hbChTSUdCVVMsIHNpZ19jb3JlZHVtcCk7Ci0jZW5kaWYgLyogU0lHQlVTICovCi0jaWZkZWYgU0lHQUJPUlQKLQlzaWduYWwoU0lHQUJPUlQsIHNpZ19jb3JlZHVtcCk7Ci0jZW5kaWYgLyogU0lHQUJPUlQgKi8KLSNpZmRlZiBTSUdBQlJUCi0Jc2lnbmFsKFNJR0FCUlQsIHNpZ19jb3JlZHVtcCk7Ci0jZW5kaWYgLyogU0lHQUJSVCAqLwotI2lmZGVmIFNJR0lMTAotCXNpZ25hbChTSUdJTEwsIHNpZ19jb3JlZHVtcCk7Ci0jZW5kaWYgLyogU0lHSUxMICovCi0jaWZkZWYgU0lHWENQVQotCXNpZ25hbChTSUdYQ1BVLCBTSUdfREZMKTsKLSNlbmRpZiAvKiBTSUdYQ1BVICovCi0jaWZkZWYgU0lHWEZTWgotCXNpZ25hbChTSUdYRlNaLCBTSUdfREZMKTsKLSNlbmRpZiAvKiBTSUdYRlNaICovCi0gICAgfQotCi0gICAgc2lnbmFsKFNJR1RFUk0sIHNpZ190ZXJtKTsKLSNpZmRlZiBTSUdIVVAKLSAgICBzaWduYWwoU0lHSFVQLCByZXN0YXJ0KTsKLSNlbmRpZiAvKiBTSUdIVVAgKi8KLSNpZmRlZiBTSUdVU1IxCi0gICAgc2lnbmFsKFNJR1VTUjEsIHJlc3RhcnQpOwotI2VuZGlmIC8qIFNJR1VTUjEgKi8KLSNpZmRlZiBTSUdQSVBFCi0gICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwotI2VuZGlmIC8qIFNJR1BJUEUgKi8KLQotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29ubmVjdGlvbiBzdHJ1Y3R1cmVzIGFuZCBhY2NvdW50aW5nLi4uCi0gKi8KLQotCi1zdGF0aWMgY29ubl9yZWMgKm5ld19jb25uZWN0aW9uKHBvb2wgKnAsIHNlcnZlcl9yZWMgKnNlcnZlciwgQlVGRiAqaW5vdXQsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqcmVtYWRkciwKLQkJCSAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzYWRkciwKLQkJCSAgICAgaW50IGNoaWxkX251bSkKLXsKLSAgICBjb25uX3JlYyAqY29ubiA9IChjb25uX3JlYyAqKSBhcF9wY2FsbG9jKHAsIHNpemVvZihjb25uX3JlYykpOwotCi0gICAgLyogR290IGEgY29ubmVjdGlvbiBzdHJ1Y3R1cmUsIHNvIGluaXRpYWxpemUgd2hhdCBmaWVsZHMgd2UgY2FuCi0gICAgICogKHRoZSByZXN0IGFyZSB6ZXJvZWQgb3V0IGJ5IHBjYWxsb2MpLgotICAgICAqLwotCi0gICAgY29ubi0+Y2hpbGRfbnVtID0gY2hpbGRfbnVtOwotCi0gICAgY29ubi0+cG9vbCA9IHA7Ci0gICAgY29ubi0+bG9jYWxfYWRkciA9ICpzYWRkcjsKLSAgICBjb25uLT5iYXNlX3NlcnZlciA9IHNlcnZlcjsKLSAgICBjb25uLT5jbGllbnQgPSBpbm91dDsKLQotICAgIGNvbm4tPnJlbW90ZV9hZGRyID0gKnJlbWFkZHI7Ci0gICAgY29ubi0+cmVtb3RlX2lwID0gYXBfcHN0cmR1cChjb25uLT5wb29sLAotCQkJICAgICAgaW5ldF9udG9hKGNvbm4tPnJlbW90ZV9hZGRyLnNpbl9hZGRyKSk7Ci0KLSAgICByZXR1cm4gY29ubjsKLX0KLQotI2lmIGRlZmluZWQoVENQX05PREVMQVkpICYmICFkZWZpbmVkKE1QRSkgJiYgIWRlZmluZWQoVFBGKQotc3RhdGljIHZvaWQgc29ja19kaXNhYmxlX25hZ2xlKGludCBzKQotewotICAgIC8qIFRoZSBOYWdsZSBhbGdvcml0aG0gc2F5cyB0aGF0IHdlIHNob3VsZCBkZWxheSBzZW5kaW5nIHBhcnRpYWwKLSAgICAgKiBwYWNrZXRzIGluIGhvcGVzIG9mIGdldHRpbmcgbW9yZSBkYXRhLiAgV2UgZG9uJ3Qgd2FudCB0byBkbwotICAgICAqIHRoaXM7IHdlIGFyZSBub3QgdGVsbmV0LiAgVGhlcmUgYXJlIGJhZCBpbnRlcmFjdGlvbnMgYmV0d2VlbgotICAgICAqIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgYW5kIE5hZ2xlJ3MgYWxnb3JpdGhtIHRoYXQgaGF2ZSB2ZXJ5IHNldmVyZQotICAgICAqIHBlcmZvcm1hbmNlIHBlbmFsdGllcy4gIChGYWlsaW5nIHRvIGRpc2FibGUgTmFnbGUgaXMgbm90IG11Y2ggb2YgYQotICAgICAqIHByb2JsZW0gd2l0aCBzaW1wbGUgSFRUUC4pCi0gICAgICoKLSAgICAgKiBJbiBzcGl0ZSBvZiB0aGVzZSBwcm9ibGVtcywgZmFpbHVyZSBoZXJlIGlzIG5vdCBhIHNob290aW5nIG9mZmVuc2UuCi0gICAgICovCi0gICAgaW50IGp1c3Rfc2F5X25vID0gMTsKLQotICAgIGlmIChzZXRzb2Nrb3B0KHMsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgKGNoYXIgKikgJmp1c3Rfc2F5X25vLAotCQkgICBzaXplb2YoaW50KSkgPCAwKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIHNlcnZlcl9jb25mLAotCQkgICAgInNldHNvY2tvcHQ6IChUQ1BfTk9ERUxBWSkiKTsKLSAgICB9Ci19Ci0KLSNlbHNlCi0jZGVmaW5lIHNvY2tfZGlzYWJsZV9uYWdsZShzKQkvKiBOT09QICovCi0jZW5kaWYKLQotCi1zdGF0aWMgaW50IG1ha2Vfc29jayhwb29sICpwLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNlcnZlcikKLXsKLSAgICBpbnQgczsKLSAgICBpbnQgb25lID0gMTsKLSAgICBjaGFyIGFkZHJbNTEyXTsKLQotICAgIGlmIChzZXJ2ZXItPnNpbl9hZGRyLnNfYWRkciAhPSBodG9ubChJTkFERFJfQU5ZKSkKLQlhcF9zbnByaW50ZihhZGRyLCBzaXplb2YoYWRkciksICJhZGRyZXNzICVzIHBvcnQgJWQiLAotCQlpbmV0X250b2Eoc2VydmVyLT5zaW5fYWRkciksIG50b2hzKHNlcnZlci0+c2luX3BvcnQpKTsKLSAgICBlbHNlCi0JYXBfc25wcmludGYoYWRkciwgc2l6ZW9mKGFkZHIpLCAicG9ydCAlZCIsIG50b2hzKHNlcnZlci0+c2luX3BvcnQpKTsKLQotICAgIC8qIG5vdGUgdGhhdCBiZWNhdXNlIHdlJ3JlIGFib3V0IHRvIHNsYWNrIHdlIGRvbid0IHVzZSBwc29ja2V0ICovCi0gICAgaWYgKChzID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCkpID09IC0xKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0NSSVQsIHNlcnZlcl9jb25mLAotCQkgICAgIm1ha2Vfc29jazogZmFpbGVkIHRvIGdldCBhIHNvY2tldCBmb3IgJXMiLCBhZGRyKTsKLQlleGl0KDEpOwotICAgIH0KLQotICAgIC8qIFNvbGFyaXMgKHByb2JhYmx5IHZlcnNpb25zIDIuNCwgMi41LCBhbmQgMi41LjEgd2l0aCB2YXJpb3VzIGxldmVscwotICAgICAqIG9mIHRjcCBwYXRjaGVzKSBoYXMgc29tZSByZWFsbHkgd2VpcmQgYnVncyB3aGVyZSBpZiB5b3UgZHVwIHRoZQotICAgICAqIHNvY2tldCBub3cgaXQgYnJlYWtzIHRoaW5ncyBhY3Jvc3MgU0lHSFVQIHJlc3RhcnRzLiAgSXQnbGwgZWl0aGVyCi0gICAgICogYmUgdW5hYmxlIHRvIGJpbmQsIG9yIGl0IHdvbid0IHJlc3BvbmQuCi0gICAgICovCi0jaWYgZGVmaW5lZCAoU09MQVJJUzIpICYmIFNPTEFSSVMyIDwgMjYwCi0jZGVmaW5lIFdPUktBUk9VTkRfU09MQVJJU19CVUcKLSNlbmRpZgotCi0gICAgLyogUFIjMTI4MiBVbml4d2FyZSAxLnggYXBwZWFycyB0byBoYXZlIHRoZSBzYW1lIHByb2JsZW0gYXMgc29sYXJpcyAqLwotI2lmIGRlZmluZWQgKFVXKSAmJiBVVyA8IDIwMAotI2RlZmluZSBXT1JLQVJPVU5EX1NPTEFSSVNfQlVHCi0jZW5kaWYKLQotICAgIC8qIFBSIzE5NzMgTkNSIFNWUjQgc3lzdGVtcyBhcHBlYXIgdG8gaGF2ZSB0aGUgc2FtZSBwcm9ibGVtICovCi0jaWYgZGVmaW5lZCAoTVBSQVMpCi0jZGVmaW5lIFdPUktBUk9VTkRfU09MQVJJU19CVUcKLSNlbmRpZgotCi0jaWZuZGVmIFdPUktBUk9VTkRfU09MQVJJU19CVUcKLSAgICBzID0gYXBfc2xhY2socywgQVBfU0xBQ0tfSElHSCk7Ci0KLSAgICBhcF9ub3RlX2NsZWFudXBzX2Zvcl9zb2NrZXQocCwgcyk7CS8qIGFycmFuZ2UgdG8gY2xvc2Ugb24gZXhlYyBvciByZXN0YXJ0ICovCi0jaWZkZWYgVFBGCi0gICAgb3Nfbm90ZV9hZGRpdGlvbmFsX2NsZWFudXBzKHAsIHMpOwotI2VuZGlmIC8qIFRQRiAqLwotI2VuZGlmCi0KLSNpZm5kZWYgTVBFCi0vKiBNUEUgZG9lcyBub3Qgc3VwcG9ydCBTT19SRVVTRUFERFIgYW5kIFNPX0tFRVBBTElWRSAqLwotI2lmbmRlZiBfT1NEX1BPU0lYCi0gICAgaWYgKHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAoY2hhciAqKSAmb25lLCBzaXplb2YoaW50KSkgPCAwKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0NSSVQsIHNlcnZlcl9jb25mLAotCQkgICAgIm1ha2Vfc29jazogZm9yICVzLCBzZXRzb2Nrb3B0OiAoU09fUkVVU0VBRERSKSIsIGFkZHIpOwotCWNsb3NlKHMpOwotCXJldHVybiAtMTsKLSAgICB9Ci0jZW5kaWYgLypfT1NEX1BPU0lYKi8KLSAgICBvbmUgPSAxOwotI2lmZGVmIFNPX0tFRVBBTElWRQotICAgIGlmIChzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgKGNoYXIgKikgJm9uZSwgc2l6ZW9mKGludCkpIDwgMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19DUklULCBzZXJ2ZXJfY29uZiwKLQkJICAgICJtYWtlX3NvY2s6IGZvciAlcywgc2V0c29ja29wdDogKFNPX0tFRVBBTElWRSkiLCBhZGRyKTsKLQljbG9zZShzKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotI2VuZGlmCi0jZW5kaWYKLQotICAgIHNvY2tfZGlzYWJsZV9uYWdsZShzKTsKLQotICAgIC8qCi0gICAgICogVG8gc2VuZCBkYXRhIG92ZXIgaGlnaCBiYW5kd2lkdGgtZGVsYXkgY29ubmVjdGlvbnMgYXQgZnVsbAotICAgICAqIHNwZWVkIHdlIG11c3QgZm9yY2UgdGhlIFRDUCB3aW5kb3cgdG8gb3BlbiB3aWRlIGVub3VnaCB0byBrZWVwIHRoZQotICAgICAqIHBpcGUgZnVsbC4gIFRoZSBkZWZhdWx0IHdpbmRvdyBzaXplIG9uIG1hbnkgc3lzdGVtcwotICAgICAqIGlzIG9ubHkgNGtCLiAgQ3Jvc3MtY291bnRyeSBXQU4gY29ubmVjdGlvbnMgb2YgMTAwbXMKLSAgICAgKiBhdCAxTWIvcyBhcmUgbm90IGltcG9zc2libGUgZm9yIHdlbGwgY29ubmVjdGVkIHNpdGVzLgotICAgICAqIElmIHdlIGFzc3VtZSAxMDBtcyBjcm9zcy1jb3VudHJ5IGxhdGVuY3ksCi0gICAgICogYSA0a0IgYnVmZmVyIGxpbWl0cyB0aHJvdWdocHV0IHRvIDQwa0Ivcy4KLSAgICAgKgotICAgICAqIFRvIGF2b2lkIHRoaXMgcHJvYmxlbSBJJ3ZlIGFkZGVkIHRoZSBTZW5kQnVmZmVyU2l6ZSBkaXJlY3RpdmUKLSAgICAgKiB0byBhbGxvdyB0aGUgd2ViIG1hc3RlciB0byBjb25maWd1cmUgc2VuZCBidWZmZXIgc2l6ZS4KLSAgICAgKgotICAgICAqIFRoZSB0cmFkZS1vZmYgb2YgbGFyZ2VyIGJ1ZmZlcnMgaXMgdGhhdCBtb3JlIGtlcm5lbCBtZW1vcnkKLSAgICAgKiBpcyBjb25zdW1lZC4gIFlNTVYsIGtub3cgeW91ciBjdXN0b21lcnMgYW5kIHlvdXIgbmV0d29yayEKLSAgICAgKgotICAgICAqIC1Kb2huIEhlaWRlbWFubiA8am9obmhAaXNpLmVkdT4gMjUtT2N0LTk2Ci0gICAgICoKLSAgICAgKiBJZiBubyBzaXplIGlzIHNwZWNpZmllZCwgdXNlIHRoZSBrZXJuZWwgZGVmYXVsdC4KLSAgICAgKi8KLSNpZm5kZWYgQkVPUwkJCS8qIEJlT1MgZG9lcyBub3Qgc3VwcG9ydCBTT19TTkRCVUYgKi8KLSAgICBpZiAoc2VydmVyX2NvbmYtPnNlbmRfYnVmZmVyX3NpemUpIHsKLQlpZiAoc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19TTkRCVUYsCi0JCShjaGFyICopICZzZXJ2ZXJfY29uZi0+c2VuZF9idWZmZXJfc2l6ZSwgc2l6ZW9mKGludCkpIDwgMCkgewotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgc2VydmVyX2NvbmYsCi0JCQkibWFrZV9zb2NrOiBmYWlsZWQgdG8gc2V0IFNlbmRCdWZmZXJTaXplIGZvciAlcywgIgotCQkJInVzaW5nIGRlZmF1bHQiLCBhZGRyKTsKLQkgICAgLyogbm90IGEgZmF0YWwgZXJyb3IgKi8KLQl9Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBNUEUKLS8qIE1QRSByZXF1aXJlcyBDQVA9UE0gYW5kIEdFVFBSSVZNT0RFIHRvIGJpbmQgdG8gcG9ydHMgbGVzcyB0aGFuIDEwMjQgKi8KLSAgICBpZiAobnRvaHMoc2VydmVyLT5zaW5fcG9ydCkgPCAxMDI0KQotCUdFVFBSSVZNT0RFKCk7Ci0jZW5kaWYKLSAgICBpZiAoYmluZChzLCAoc3RydWN0IHNvY2thZGRyICopIHNlcnZlciwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpID09IC0xKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0NSSVQsIHNlcnZlcl9jb25mLAotCSAgICAibWFrZV9zb2NrOiBjb3VsZCBub3QgYmluZCB0byAlcyIsIGFkZHIpOwotI2lmZGVmIE1QRQotCWlmIChudG9ocyhzZXJ2ZXItPnNpbl9wb3J0KSA8IDEwMjQpCi0JICAgIEdFVFVTRVJNT0RFKCk7Ci0jZW5kaWYKLQljbG9zZShzKTsKLQlleGl0KDEpOwotICAgIH0KLSNpZmRlZiBNUEUKLSAgICBpZiAobnRvaHMoc2VydmVyLT5zaW5fcG9ydCkgPCAxMDI0KQotCUdFVFVTRVJNT0RFKCk7Ci0jZW5kaWYKLQotICAgIGlmIChsaXN0ZW4ocywgYXBfbGlzdGVuYmFja2xvZykgPT0gLTEpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzZXJ2ZXJfY29uZiwKLQkgICAgIm1ha2Vfc29jazogdW5hYmxlIHRvIGxpc3RlbiBmb3IgY29ubmVjdGlvbnMgb24gJXMiLCBhZGRyKTsKLQljbG9zZShzKTsKLQlleGl0KDEpOwotICAgIH0KLQotI2lmZGVmIFdPUktBUk9VTkRfU09MQVJJU19CVUcKLSAgICBzID0gYXBfc2xhY2socywgQVBfU0xBQ0tfSElHSCk7Ci0KLSAgICBhcF9ub3RlX2NsZWFudXBzX2Zvcl9zb2NrZXQocCwgcyk7CS8qIGFycmFuZ2UgdG8gY2xvc2Ugb24gZXhlYyBvciByZXN0YXJ0ICovCi0jZW5kaWYKLQotI2lmZGVmIENIRUNLX0ZEX1NFVFNJWkUKLSAgICAvKiBwcm90ZWN0IHZhcmlvdXMgZmRfc2V0cyAqLwotICAgIGlmIChzID49IEZEX1NFVFNJWkUpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLCBOVUxMLAotCSAgICAibWFrZV9zb2NrOiBwcm9ibGVtIGxpc3RlbmluZyBvbiAlcywgZmlsZWRlc2NyaXB0b3IgKCV1KSAiCi0JICAgICJsYXJnZXIgdGhhbiBGRF9TRVRTSVpFICgldSkgIgotCSAgICAiZm91bmQsIHlvdSBwcm9iYWJseSBuZWVkIHRvIHJlYnVpbGQgQXBhY2hlIHdpdGggYSAiCi0JICAgICJsYXJnZXIgRkRfU0VUU0laRSIsIGFkZHIsIHMsIEZEX1NFVFNJWkUpOwotCWNsb3NlKHMpOwotCXJldHVybiAtMTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHJldHVybiBzOwotfQotCi0KLS8qCi0gKiBEdXJpbmcgYSByZXN0YXJ0IHdlIGtlZXAgdHJhY2sgb2YgdGhlIG9sZCBsaXN0ZW5lcnMgaGVyZSwgc28gdGhhdCB3ZQotICogY2FuIHJlLXVzZSB0aGUgc29ja2V0cy4gIFdlIGhhdmUgdG8gZG8gdGhpcyBiZWNhdXNlIHdlIHdvbid0IGJlIGFibGUKLSAqIHRvIHJlLW9wZW4gdGhlIHNvY2tldHMgKCJBZGRyZXNzIGFscmVhZHkgaW4gdXNlIikuCi0gKgotICogVW5saWtlIHRoZSBsaXN0ZW5lcnMgcmluZywgb2xkX2xpc3RlbmVycyBpcyBhIE5VTEwgdGVybWluYXRlZCBsaXN0LgotICoKLSAqIGNvcHlfbGlzdGVuZXJzKCkgbWFrZXMgdGhlIGNvcHksIGZpbmRfbGlzdGVuZXIoKSBmaW5kcyBhbiBvbGQgbGlzdGVuZXIKLSAqIGFuZCBjbG9zZV91bnVzZWRfbGlzdGVuZXIoKSBjbGVhbnMgdXAgd2hhdGV2ZXIgd2Fzbid0IHVzZWQuCi0gKi8KLXN0YXRpYyBsaXN0ZW5fcmVjICpvbGRfbGlzdGVuZXJzOwotCi0vKiB1bmZvcnR1bmF0ZWx5IGNvcHlfbGlzdGVuZXJzIG1heSBiZSBjYWxsZWQgYmVmb3JlIGxpc3RlbmVycyBpcyBhIHJpbmcgKi8KLXN0YXRpYyB2b2lkIGNvcHlfbGlzdGVuZXJzKHBvb2wgKnApCi17Ci0gICAgbGlzdGVuX3JlYyAqbHI7Ci0KLSAgICBhcF9hc3NlcnQob2xkX2xpc3RlbmVycyA9PSBOVUxMKTsKLSAgICBpZiAoYXBfbGlzdGVuZXJzID09IE5VTEwpIHsKLQlyZXR1cm47Ci0gICAgfQotICAgIGxyID0gYXBfbGlzdGVuZXJzOwotICAgIGRvIHsKLQlsaXN0ZW5fcmVjICpuciA9IG1hbGxvYyhzaXplb2YgKm5yKTsKLQlpZiAobnIgPT0gTlVMTCkgewotCSAgICBmcHJpbnRmKHN0ZGVyciwgIk91Y2ghICBtYWxsb2MgZmFpbGVkIGluIGNvcHlfbGlzdGVuZXJzKClcbiIpOwotCSAgICBleGl0KDEpOwotCX0KLQkqbnIgPSAqbHI7Ci0JYXBfa2lsbF9jbGVhbnVwc19mb3Jfc29ja2V0KHAsIG5yLT5mZCk7Ci0JbnItPm5leHQgPSBvbGRfbGlzdGVuZXJzOwotCWFwX2Fzc2VydCghbnItPnVzZWQpOwotCW9sZF9saXN0ZW5lcnMgPSBucjsKLQlsciA9IGxyLT5uZXh0OwotICAgIH0gd2hpbGUgKGxyICYmIGxyICE9IGFwX2xpc3RlbmVycyk7Ci19Ci0KLQotc3RhdGljIGludCBmaW5kX2xpc3RlbmVyKGxpc3Rlbl9yZWMgKmxyKQotewotICAgIGxpc3Rlbl9yZWMgKm9yOwotCi0gICAgZm9yIChvciA9IG9sZF9saXN0ZW5lcnM7IG9yOyBvciA9IG9yLT5uZXh0KSB7Ci0JaWYgKCFtZW1jbXAoJm9yLT5sb2NhbF9hZGRyLCAmbHItPmxvY2FsX2FkZHIsIHNpemVvZihvci0+bG9jYWxfYWRkcikpKSB7Ci0JICAgIG9yLT51c2VkID0gMTsKLQkgICAgcmV0dXJuIG9yLT5mZDsKLQl9Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLQotCi1zdGF0aWMgdm9pZCBjbG9zZV91bnVzZWRfbGlzdGVuZXJzKHZvaWQpCi17Ci0gICAgbGlzdGVuX3JlYyAqb3IsICpuZXh0OwotCi0gICAgZm9yIChvciA9IG9sZF9saXN0ZW5lcnM7IG9yOyBvciA9IG5leHQpIHsKLQluZXh0ID0gb3ItPm5leHQ7Ci0JaWYgKCFvci0+dXNlZCkKLQkgICAgY2xvc2Vzb2NrZXQob3ItPmZkKTsKLQlmcmVlKG9yKTsKLSAgICB9Ci0gICAgb2xkX2xpc3RlbmVycyA9IE5VTEw7Ci19Ci0KLQotLyogb3BlbiBzb2NrZXRzLCBhbmQgdHVybiB0aGUgbGlzdGVuZXJzIGxpc3QgaW50byBhIHNpbmdseSBsaW5rZWQgcmluZyAqLwotc3RhdGljIHZvaWQgc2V0dXBfbGlzdGVuZXJzKHBvb2wgKnApCi17Ci0gICAgbGlzdGVuX3JlYyAqbHI7Ci0gICAgaW50IGZkOwotCi0gICAgbGlzdGVubWF4ZmQgPSAtMTsKLSAgICBGRF9aRVJPKCZsaXN0ZW5mZHMpOwotICAgIGxyID0gYXBfbGlzdGVuZXJzOwotICAgIGZvciAoOzspIHsKLQlmZCA9IGZpbmRfbGlzdGVuZXIobHIpOwotCWlmIChmZCA8IDApIHsKLQkgICAgZmQgPSBtYWtlX3NvY2socCwgJmxyLT5sb2NhbF9hZGRyKTsKLQl9Ci0JZWxzZSB7Ci0JICAgIGFwX25vdGVfY2xlYW51cHNfZm9yX3NvY2tldChwLCBmZCk7Ci0JfQotCWlmIChmZCA+PSAwKSB7Ci0JICAgIEZEX1NFVChmZCwgJmxpc3RlbmZkcyk7Ci0JICAgIGlmIChmZCA+IGxpc3Rlbm1heGZkKQotCQlsaXN0ZW5tYXhmZCA9IGZkOwotCX0KLQlsci0+ZmQgPSBmZDsKLQlpZiAobHItPm5leHQgPT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0JbHIgPSBsci0+bmV4dDsKLSAgICB9Ci0gICAgLyogdHVybiB0aGUgbGlzdCBpbnRvIGEgcmluZyAqLwotICAgIGxyLT5uZXh0ID0gYXBfbGlzdGVuZXJzOwotICAgIGhlYWRfbGlzdGVuZXIgPSBhcF9saXN0ZW5lcnM7Ci0gICAgY2xvc2VfdW51c2VkX2xpc3RlbmVycygpOwotCi0jaWZkZWYgTk9fU0VSSUFMSVpFRF9BQ0NFUFQKLSAgICAvKiB3YXJuIHRoZW0gYWJvdXQgdGhlIHN0YXJ2YXRpb24gcHJvYmxlbSBpZiB0aGV5J3JlIHVzaW5nIG11bHRpcGxlCi0gICAgICogc29ja2V0cwotICAgICAqLwotICAgIGlmIChhcF9saXN0ZW5lcnMtPm5leHQgIT0gYXBfbGlzdGVuZXJzKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfQ1JJVCwgTlVMTCwKLQkJICAgICJZb3UgY2Fubm90IHVzZSBtdWx0aXBsZSBMaXN0ZW5zIHNhZmVseSBvbiB5b3VyIHN5c3RlbSwgIgotCQkgICAgInByb2NlZWRpbmcgYW55d2F5LiAgU2VlIHNyYy9QT1JUSU5HLCBzZWFyY2ggZm9yICIKLQkJICAgICJTRVJJQUxJWkVEX0FDQ0VQVC4iKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotCi0vKgotICogRmluZCBhIGxpc3RlbmVyIHdoaWNoIGlzIHJlYWR5IGZvciBhY2NlcHQoKS4gIFRoaXMgYWR2YW5jZXMgdGhlCi0gKiBoZWFkX2xpc3RlbmVyIGdsb2JhbC4KLSAqLwotc3RhdGljIGFwX2lubGluZSBsaXN0ZW5fcmVjICpmaW5kX3JlYWR5X2xpc3RlbmVyKGZkX3NldCAqIG1haW5fZmRzKQotewotICAgIGxpc3Rlbl9yZWMgKmxyOwotCi0gICAgbHIgPSBoZWFkX2xpc3RlbmVyOwotICAgIGRvIHsKLQlpZiAoRkRfSVNTRVQobHItPmZkLCBtYWluX2ZkcykpIHsKLQkgICAgaGVhZF9saXN0ZW5lciA9IGxyLT5uZXh0OwotCSAgICByZXR1cm4gKGxyKTsKLQl9Ci0JbHIgPSBsci0+bmV4dDsKLSAgICB9IHdoaWxlIChsciAhPSBoZWFkX2xpc3RlbmVyKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENoaWxkIHByb2Nlc3MgbWFpbiBsb29wLgotICogVGhlIGZvbGxvd2luZyB2YXJzIGFyZSBzdGF0aWMgdG8gYXZvaWQgZ2V0dGluZyBjbG9iYmVyZWQgYnkgbG9uZ2ptcCgpOwotICogdGhleSBhcmUgcmVhbGx5IHByaXZhdGUgdG8gY2hpbGRfbWFpbi4KLSAqLwotCi1zdGF0aWMgaW50IHNydjsKLXN0YXRpYyBpbnQgY3NkOwotc3RhdGljIGludCByZXF1ZXN0c190aGlzX2NoaWxkOwotc3RhdGljIGZkX3NldCBtYWluX2ZkczsKLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9jaGlsZF90ZXJtaW5hdGUocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgci0+Y29ubmVjdGlvbi0+a2VlcGFsaXZlID0gMDsKLSAgICByZXF1ZXN0c190aGlzX2NoaWxkID0gYXBfbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCA9IDE7Ci19Ci0KLWludCBhcF9ncmFjZWZ1bF9zdG9wX3NpZ25hbGxlZCh2b2lkKQotewotICAgIGFwX3N5bmNfc2NvcmVib2FyZF9pbWFnZSgpOwotICAgIGlmIChkZWZlcnJlZF9kaWUgfHwKLQlhcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwucnVubmluZ19nZW5lcmF0aW9uICE9IGFwX215X2dlbmVyYXRpb24pIHsKLQlyZXR1cm4gMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNoaWxkX21haW4oaW50IGNoaWxkX251bV9hcmcpCi17Ci0gICAgTkVUX1NJWkVfVCBjbGVuOwotICAgIHN0cnVjdCBzb2NrYWRkciBzYV9zZXJ2ZXI7Ci0gICAgc3RydWN0IHNvY2thZGRyIHNhX2NsaWVudDsKLSAgICBsaXN0ZW5fcmVjICpscjsKLSAgICBwb29sICpwdHJhbnM7Ci0gICAgY29ubl9yZWMgKmN1cnJlbnRfY29ubjsKLQotICAgIG15X3BpZCA9IGdldHBpZCgpOwotICAgIGNzZCA9IC0xOwotICAgIG15X2NoaWxkX251bSA9IGNoaWxkX251bV9hcmc7Ci0gICAgcmVxdWVzdHNfdGhpc19jaGlsZCA9IDA7Ci0KLSAgICAvKiBHZXQgYSBzdWIgcG9vbCBmb3IgZ2xvYmFsIGFsbG9jYXRpb25zIGluIHRoaXMgY2hpbGQsIHNvIHRoYXQKLSAgICAgKiB3ZSBjYW4gaGF2ZSBjbGVhbnVwcyBvY2N1ciB3aGVuIHRoZSBjaGlsZCBleGl0cy4KLSAgICAgKi8KLSAgICBwY2hpbGQgPSBhcF9tYWtlX3N1Yl9wb29sKHBjb25mKTsKLQotICAgIHB0cmFucyA9IGFwX21ha2Vfc3ViX3Bvb2wocGNoaWxkKTsKLQotICAgIC8qIG5lZWRzIHRvIGJlIGRvbmUgYmVmb3JlIHdlIHN3aXRjaCBVSURzIHNvIHdlIGhhdmUgcGVybWlzc2lvbnMgKi8KLSAgICByZW9wZW5fc2NvcmVib2FyZChwY2hpbGQpOwotICAgIFNBRkVfQUNDRVBUKGFjY2VwdF9tdXRleF9jaGlsZF9pbml0KHBjaGlsZCkpOwotCi0gICAgaWYgKHVuaXhkX3NldHVwX2NoaWxkKCkpIHsKLQljbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci0KLSAgICBhcF9jaGlsZF9pbml0X2hvb2socGNoaWxkLCBzZXJ2ZXJfY29uZik7Ci0KLSAgICAodm9pZCkgYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhteV9jaGlsZF9udW0sIFNFUlZFUl9SRUFEWSwgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotCi0gICAgc2lnbmFsKFNJR0hVUCwganVzdF9kaWUpOwotICAgIHNpZ25hbChTSUdURVJNLCBqdXN0X2RpZSk7Ci0KLSNpZmRlZiBPUzIKLS8qIFN0b3AgQ3RybC1DL0N0cmwtQnJlYWsgc2lnbmFscyBnb2luZyB0byBjaGlsZCBwcm9jZXNzZXMgKi8KLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgdWxUaW1lczsKLSAgICAgICAgRG9zU2V0U2lnbmFsRXhjZXB0aW9uRm9jdXMoMCwgJnVsVGltZXMpOwotICAgIH0KLSNlbmRpZgotCi0gICAgd2hpbGUgKCFhcF9ncmFjZWZ1bF9zdG9wX3NpZ25hbGxlZCgpKSB7Ci0JQlVGRiAqY29ubl9pbzsKLQotCS8qIFByZXBhcmUgdG8gcmVjZWl2ZSBhIFNJR1VTUjEgZHVlIHRvIGdyYWNlZnVsIHJlc3RhcnQgc28gdGhhdAotCSAqIHdlIGNhbiBleGl0IGNsZWFubHkuCi0JICovCi0JdXNyMV9qdXN0X2RpZSA9IDE7Ci0Jc2lnbmFsKFNJR1VTUjEsIHVzcjFfaGFuZGxlcik7Ci0KLQkvKgotCSAqIChSZSlpbml0aWFsaXplIHRoaXMgY2hpbGQgdG8gYSBwcmUtY29ubmVjdGlvbiBzdGF0ZS4KLQkgKi8KLQotCWN1cnJlbnRfY29ubiA9IE5VTEw7Ci0KLQlhcF9jbGVhcl9wb29sKHB0cmFucyk7Ci0KLQlpZiAoKGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQgPiAwCi0JICAgICAmJiByZXF1ZXN0c190aGlzX2NoaWxkKysgPj0gYXBfbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCkpIHsKLQkgICAgY2xlYW5fY2hpbGRfZXhpdCgwKTsKLQl9Ci0KLQkodm9pZCkgYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhteV9jaGlsZF9udW0sIFNFUlZFUl9SRUFEWSwgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotCi0JLyoKLQkgKiBXYWl0IGZvciBhbiBhY2NlcHRhYmxlIGNvbm5lY3Rpb24gdG8gYXJyaXZlLgotCSAqLwotCi0JLyogTG9jayBhcm91bmQgImFjY2VwdCIsIGlmIG5lY2Vzc2FyeSAqLwotCVNBRkVfQUNDRVBUKGFjY2VwdF9tdXRleF9vbigpKTsKLQotCWZvciAoOzspIHsKLQkgICAgaWYgKGFwX2xpc3RlbmVycy0+bmV4dCAhPSBhcF9saXN0ZW5lcnMpIHsKLQkJLyogbW9yZSB0aGFuIG9uZSBzb2NrZXQgKi8KLQkJbWVtY3B5KCZtYWluX2ZkcywgJmxpc3RlbmZkcywgc2l6ZW9mKGZkX3NldCkpOwotCQlzcnYgPSBhcF9zZWxlY3QobGlzdGVubWF4ZmQgKyAxLCAmbWFpbl9mZHMsIE5VTEwsIE5VTEwsIE5VTEwpOwotCi0JCWlmIChzcnYgPCAwICYmIGVycm5vICE9IEVJTlRSKSB7Ci0JCSAgICAvKiBTaW5nbGUgVW5peCBkb2N1bWVudHMgc2VsZWN0IGFzIHJldHVybmluZyBlcnJub3MKLQkJICAgICAqIEVCQURGLCBFSU5UUiwgYW5kIEVJTlZBTC4uLiBhbmQgaW4gbm9uZSBvZiB0aG9zZQotCQkgICAgICogY2FzZXMgZG9lcyBpdCBtYWtlIHNlbnNlIHRvIGNvbnRpbnVlLiAgSW4gZmFjdAotCQkgICAgICogb24gTGludXggMi4wLnggd2Ugc2VlbSB0byBlbmQgdXAgd2l0aCBFRkFVTFQKLQkJICAgICAqIG9jY2FzaW9uYWxseSwgYW5kIHdlJ2QgbG9vcCBmb3JldmVyIGR1ZSB0byBpdC4KLQkJICAgICAqLwotCQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgc2VydmVyX2NvbmYsICJzZWxlY3Q6IChsaXN0ZW4pIik7Ci0JCSAgICBjbGVhbl9jaGlsZF9leGl0KDEpOwotCQl9Ci0KLQkJaWYgKHNydiA8PSAwKQotCQkgICAgY29udGludWU7Ci0KLQkJbHIgPSBmaW5kX3JlYWR5X2xpc3RlbmVyKCZtYWluX2Zkcyk7Ci0JCWlmIChsciA9PSBOVUxMKQotCQkgICAgY29udGludWU7Ci0JCXNkID0gbHItPmZkOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQkvKiBvbmx5IG9uZSBzb2NrZXQsIGp1c3QgcHJldGVuZCB3ZSBkaWQgdGhlIG90aGVyIHN0dWZmICovCi0JCXNkID0gYXBfbGlzdGVuZXJzLT5mZDsKLQkgICAgfQotCi0JICAgIC8qIGlmIHdlIGFjY2VwdCgpIHNvbWV0aGluZyB3ZSBkb24ndCB3YW50IHRvIGRpZSwgc28gd2UgaGF2ZSB0bwotCSAgICAgKiBkZWZlciB0aGUgZXhpdAotCSAgICAgKi8KLQkgICAgdXNyMV9qdXN0X2RpZSA9IDA7Ci0JICAgIGZvciAoOzspIHsKLQkJaWYgKGRlZmVycmVkX2RpZSkgewotCQkgICAgLyogd2UgZGlkbid0IGdldCBhIHNvY2tldCwgYW5kIHdlIHdlcmUgdG9sZCB0byBkaWUgKi8KLQkJICAgIGNsZWFuX2NoaWxkX2V4aXQoMCk7Ci0JCX0KLQkJY2xlbiA9IHNpemVvZihzYV9jbGllbnQpOwotCQljc2QgPSBhcF9hY2NlcHQoc2QsICZzYV9jbGllbnQsICZjbGVuKTsKLQkJaWYgKGNzZCA+PSAwIHx8IGVycm5vICE9IEVJTlRSKQotCQkgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgICBpZiAoY3NkID49IDApCi0JCWJyZWFrOwkJLyogV2UgaGF2ZSBhIHNvY2tldCByZWFkeSBmb3IgcmVhZGluZyAqLwotCSAgICBlbHNlIHsKLQotCQkvKiBPdXIgb2xkIGJlaGF2aW91ciBoZXJlIHdhcyB0byBjb250aW51ZSBhZnRlciBhY2NlcHQoKQotCQkgKiBlcnJvcnMuICBCdXQgdGhpcyBsZWFkcyB1cyBpbnRvIGxvdHMgb2YgdHJvdWJsZXMKLQkJICogYmVjYXVzZSBtb3N0IG9mIHRoZSBlcnJvcnMgYXJlIHF1aXRlIGZhdGFsLiAgRm9yCi0JCSAqIGV4YW1wbGUsIEVNRklMRSBjYW4gYmUgY2F1c2VkIGJ5IHNsb3cgZGVzY3JpcHRvcgotCQkgKiBsZWFrcyAoc2F5IGluIGEgM3JkIHBhcnR5IG1vZHVsZSwgb3IgbGliYykuICBJdCdzCi0JCSAqIGZvb2xpc2ggZm9yIHVzIHRvIGNvbnRpbnVlIGFmdGVyIGFuIEVNRklMRS4gIFdlIGFsc28KLQkJICogc2VlbSB0byB0aWNrbGUga2VybmVsIGJ1Z3Mgb24gc29tZSBwbGF0Zm9ybXMgd2hpY2gKLQkJICogbGVhZCB0byBuZXZlci1lbmRpbmcgbG9vcHMgaGVyZS4gIFNvIGl0IHNlZW1zIGJlc3QKLQkJICogdG8ganVzdCBleGl0IGluIG1vc3QgY2FzZXMuCi0JCSAqLwotICAgICAgICAgICAgICAgIHN3aXRjaCAoZXJybm8pIHsKLSNpZmRlZiBFUFJPVE8KLQkJICAgIC8qIEVQUk9UTyBvbiBjZXJ0YWluIG9sZGVyIGtlcm5lbHMgcmVhbGx5IG1lYW5zCi0JCSAgICAgKiBFQ09OTkFCT1JURUQsIHNvIHdlIG5lZWQgdG8gaWdub3JlIGl0IGZvciB0aGVtLgotCQkgICAgICogU2VlIGRpc2N1c3Npb24gaW4gbmV3LWh0dHBkIGFyY2hpdmVzIG5oLjk3MDEKLQkJICAgICAqIHNlYXJjaCBmb3IgRVBST1RPLgotCQkgICAgICoKLQkJICAgICAqIEFsc28gc2VlIG5oLjk2MDMsIHNlYXJjaCBmb3IgRVBST1RPOgotCQkgICAgICogVGhlcmUgaXMgcG90ZW50aWFsbHkgYSBidWcgaW4gU29sYXJpcyAyLnggeDw2LAotCQkgICAgICogYW5kIG90aGVyIGJveGVzIHRoYXQgaW1wbGVtZW50IHRjcCBzb2NrZXRzIGluCi0JCSAgICAgKiB1c2VybGFuZCAoaS5lLiBvbiB0b3Agb2YgU1RSRUFNUykuICBPbiB0aGVzZQotCQkgICAgICogc3lzdGVtcywgRVBST1RPIGNhbiBhY3R1YWxseSByZXN1bHQgaW4gYSBmYXRhbAotCQkgICAgICogbG9vcC4gIFNlZSBQUiM5ODEgZm9yIGV4YW1wbGUuICBJdCdzIGhhcmQgdG8KLQkJICAgICAqIGhhbmRsZSBib3RoIHVzZXMgb2YgRVBST1RPLgotCQkgICAgICovCi0gICAgICAgICAgICAgICAgY2FzZSBFUFJPVE86Ci0jZW5kaWYKLSNpZmRlZiBFQ09OTkFCT1JURUQKLSAgICAgICAgICAgICAgICBjYXNlIEVDT05OQUJPUlRFRDoKLSNlbmRpZgotCQkgICAgLyogTGludXggZ2VuZXJhdGVzIHRoZSByZXN0IG9mIHRoZXNlLCBvdGhlciB0Y3AKLQkJICAgICAqIHN0YWNrcyAoaS5lLiBic2QpIHRlbmQgdG8gaGlkZSB0aGVtIGJlaGluZAotCQkgICAgICogZ2V0c29ja29wdCgpIGludGVyZmFjZXMuICBUaGV5IG9jY3VyIHdoZW4KLQkJICAgICAqIHRoZSBuZXQgZ29lcyBzb3VyIG9yIHRoZSBjbGllbnQgZGlzY29ubmVjdHMKLQkJICAgICAqIGFmdGVyIHRoZSB0aHJlZS13YXkgaGFuZHNoYWtlIGhhcyBiZWVuIGRvbmUKLQkJICAgICAqIGluIHRoZSBrZXJuZWwgYnV0IGJlZm9yZSB1c2VybGFuZCBoYXMgcGlja2VkCi0JCSAgICAgKiB1cCB0aGUgc29ja2V0LgotCQkgICAgICovCi0jaWZkZWYgRUNPTk5SRVNFVAotICAgICAgICAgICAgICAgIGNhc2UgRUNPTk5SRVNFVDoKLSNlbmRpZgotI2lmZGVmIEVUSU1FRE9VVAotICAgICAgICAgICAgICAgIGNhc2UgRVRJTUVET1VUOgotI2VuZGlmCi0jaWZkZWYgRUhPU1RVTlJFQUNICi0JCWNhc2UgRUhPU1RVTlJFQUNIOgotI2VuZGlmCi0jaWZkZWYgRU5FVFVOUkVBQ0gKLQkJY2FzZSBFTkVUVU5SRUFDSDoKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSNpZmRlZiBUUEYKLQkJY2FzZSBFSU5BQ1Q6Ci0JCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkcsIHNlcnZlcl9jb25mLAotCQkJIm9mZmxvYWQgZGV2aWNlIGluYWN0aXZlIik7Ci0JCSAgICBjbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLQkJICAgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCBzZXJ2ZXJfY29uZiwKLQkJCSJzZWxlY3QvYWNjZXB0IGVycm9yICgldSkiLCBlcnJubyk7Ci0JCSAgICBjbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSNlbHNlCi0JCWRlZmF1bHQ6Ci0JCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzZXJ2ZXJfY29uZiwKLQkJCQkiYWNjZXB0OiAoY2xpZW50IHNvY2tldCkiKTsKLQkJICAgIGNsZWFuX2NoaWxkX2V4aXQoMSk7Ci0jZW5kaWYKLQkJfQotCSAgICB9Ci0KLQkgICAgaWYgKGFwX2dyYWNlZnVsX3N0b3Bfc2lnbmFsbGVkKCkpIHsKLQkJY2xlYW5fY2hpbGRfZXhpdCgwKTsKLQkgICAgfQotCSAgICB1c3IxX2p1c3RfZGllID0gMTsKLQl9Ci0KLQlTQUZFX0FDQ0VQVChhY2NlcHRfbXV0ZXhfb2ZmKCkpOwkvKiB1bmxvY2sgYWZ0ZXIgImFjY2VwdCIgKi8KLQotI2lmZGVmIFRQRgotCWlmIChjc2QgPT0gMCkgICAgICAgICAgICAgICAgICAgICAgIC8qIDAgaXMgaW52YWxpZCBzb2NrZXQgZm9yIFRQRiAqLwotCSAgICBjb250aW51ZTsKLSNlbmRpZgotCi0JLyogV2UndmUgZ290IGEgc29ja2V0LCBsZXQncyBhdCBsZWFzdCBwcm9jZXNzIG9uZSByZXF1ZXN0IG9mZiB0aGUKLQkgKiBzb2NrZXQgYmVmb3JlIHdlIGFjY2VwdCBhIGdyYWNlZnVsIHJlc3RhcnQgcmVxdWVzdC4gIFdlIHNldAotCSAqIHRoZSBzaWduYWwgdG8gaWdub3JlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBkaXN0dXJiIGFueQotCSAqIHRoaXJkIHBhcnR5IGNvZGUuCi0JICovCi0Jc2lnbmFsKFNJR1VTUjEsIFNJR19JR04pOwotCi0JYXBfbm90ZV9jbGVhbnVwc19mb3JfZmQocHRyYW5zLCBjc2QpOwotCi0JLyogcHJvdGVjdCB2YXJpb3VzIGZkX3NldHMgKi8KLSNpZmRlZiBDSEVDS19GRF9TRVRTSVpFCi0JaWYgKGNzZCA+PSBGRF9TRVRTSVpFKSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX1dBUk5JTkcsIE5VTEwsCi0JCSJbY3NkXSBmaWxlZGVzY3JpcHRvciAoJXUpIGxhcmdlciB0aGFuIEZEX1NFVFNJWkUgKCV1KSAiCi0JCSJmb3VuZCwgeW91IHByb2JhYmx5IG5lZWQgdG8gcmVidWlsZCBBcGFjaGUgd2l0aCBhICIKLQkJImxhcmdlciBGRF9TRVRTSVpFIiwgY3NkLCBGRF9TRVRTSVpFKTsKLQkgICAgY29udGludWU7Ci0JfQotI2VuZGlmCi0KLQkvKgotCSAqIFdlIG5vdyBoYXZlIGEgY29ubmVjdGlvbiwgc28gc2V0IGl0IHVwIHdpdGggdGhlIGFwcHJvcHJpYXRlCi0JICogc29ja2V0IG9wdGlvbnMsIGZpbGUgZGVzY3JpcHRvcnMsIGFuZCByZWFkL3dyaXRlIGJ1ZmZlcnMuCi0JICovCi0KLQljbGVuID0gc2l6ZW9mKHNhX3NlcnZlcik7Ci0JaWYgKGdldHNvY2tuYW1lKGNzZCwgJnNhX3NlcnZlciwgJmNsZW4pIDwgMCkgewotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzZXJ2ZXJfY29uZiwgImdldHNvY2tuYW1lIik7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotCXNvY2tfZGlzYWJsZV9uYWdsZShjc2QpOwotCi0JKHZvaWQpIGFwX3VwZGF0ZV9jaGlsZF9zdGF0dXMobXlfY2hpbGRfbnVtLCBTRVJWRVJfQlVTWV9SRUFELAotCQkJCSAgIChyZXF1ZXN0X3JlYyAqKSBOVUxMKTsKLQotCWNvbm5faW8gPSBhcF9iY3JlYXRlKHB0cmFucywgQl9SRFdSIHwgQl9TT0NLRVQpOwotCi0jaWZkZWYgQl9TRklPCi0JKHZvaWQpIHNmZGlzYyhjb25uX2lvLT5zZl9pbiwgU0ZfUE9QRElTQyk7Ci0Jc2ZkaXNjKGNvbm5faW8tPnNmX2luLCBic2Zpb19uZXcoY29ubl9pby0+cG9vbCwgY29ubl9pbykpOwotCXNmc2V0YnVmKGNvbm5faW8tPnNmX2luLCBOVUxMLCAwKTsKLQotCSh2b2lkKSBzZmRpc2MoY29ubl9pby0+c2Zfb3V0LCBTRl9QT1BESVNDKTsKLQlzZmRpc2MoY29ubl9pby0+c2Zfb3V0LCBic2Zpb19uZXcoY29ubl9pby0+cG9vbCwgY29ubl9pbykpOwotCXNmc2V0YnVmKGNvbm5faW8tPnNmX291dCwgTlVMTCwgMCk7Ci0jZW5kaWYKLQotCWFwX2JwdXNoZmQoY29ubl9pbywgY3NkKTsKLQotCWN1cnJlbnRfY29ubiA9IG5ld19jb25uZWN0aW9uKHB0cmFucywgc2VydmVyX2NvbmYsIGNvbm5faW8sCi0JCQkJICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJnNhX2NsaWVudCwKLQkJCQkgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmc2Ffc2VydmVyLAotCQkJCSAgICAgICAgICBteV9jaGlsZF9udW0pOwotCi0JYXBfcHJvY2Vzc19jb25uZWN0aW9uKGN1cnJlbnRfY29ubik7Ci0gICAgfQotfQotCi0jaWZkZWYgVFBGCi1zdGF0aWMgdm9pZCByZXNldF90cGZfbGlzdGVuZXJzKEFQQUNIRV9UUEZfSU5QVVQgKmlucHV0X3Bhcm1zKQotewotICAgIGludCBjb3VudDsKLSAgICBsaXN0ZW5fcmVjICpscjsKLQotICAgIGNvdW50ID0gMDsKLSAgICBsaXN0ZW5tYXhmZCA9IC0xOwotICAgIEZEX1pFUk8oJmxpc3RlbmZkcyk7Ci0gICAgbHIgPSBhcF9saXN0ZW5lcnM7Ci0KLSAgICBmb3IoOzspIHsKLSAgICAgICAgbHItPmZkID0gaW5wdXRfcGFybXMtPmxpc3RlbmVyc1tjb3VudF07Ci0gICAgICAgIGlmKGxyLT5mZCA+PSAwKSB7Ci0gICAgICAgICAgICBGRF9TRVQobHItPmZkLCAmbGlzdGVuZmRzKTsKLSAgICAgICAgICAgIGlmKGxyLT5mZCA+IGxpc3Rlbm1heGZkKQotICAgICAgICAgICAgICAgIGxpc3Rlbm1heGZkID0gbHItPmZkOwotICAgICAgICB9Ci0gICAgICAgIGlmKGxyLT5uZXh0ID09IE5VTEwpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgbHIgPSBsci0+bmV4dDsKLSAgICAgICAgY291bnQrKzsKLSAgICB9Ci0gICAgbHItPm5leHQgPSBhcF9saXN0ZW5lcnM7Ci0gICAgaGVhZF9saXN0ZW5lciA9IGFwX2xpc3RlbmVyczsKLSAgICBjbG9zZV91bnVzZWRfbGlzdGVuZXJzKCk7Ci19Ci0KLSNlbmRpZiAvKiBUUEYgKi8KLQotc3RhdGljIGludCBtYWtlX2NoaWxkKHNlcnZlcl9yZWMgKnMsIGludCBzbG90LCB0aW1lX3Qgbm93KQotewotICAgIGludCBwaWQ7Ci0KLSAgICBpZiAoc2xvdCArIDEgPiBtYXhfZGFlbW9uc19saW1pdCkgewotCW1heF9kYWVtb25zX2xpbWl0ID0gc2xvdCArIDE7Ci0gICAgfQotCi0gICAgaWYgKG9uZV9wcm9jZXNzKSB7Ci0Jc2lnbmFsKFNJR0hVUCwganVzdF9kaWUpOwotCXNpZ25hbChTSUdJTlQsIGp1c3RfZGllKTsKLSNpZmRlZiBTSUdRVUlUCi0Jc2lnbmFsKFNJR1FVSVQsIFNJR19ERkwpOwotI2VuZGlmCi0Jc2lnbmFsKFNJR1RFUk0sIGp1c3RfZGllKTsKLQljaGlsZF9tYWluKHNsb3QpOwotICAgIH0KLQotICAgIC8qIGF2b2lkIHN0YXJ2YXRpb24gKi8KLSAgICBoZWFkX2xpc3RlbmVyID0gaGVhZF9saXN0ZW5lci0+bmV4dDsKLQotICAgICh2b2lkKSBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKHNsb3QsIFNFUlZFUl9TVEFSVElORywgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotCi0KLSNpZmRlZiBfT1NEX1BPU0lYCi0gICAgLyogQlMyMDAwIHJlcXVpcmVzIGEgInNwZWNpYWwiIHZlcnNpb24gb2YgZm9yaygpIGJlZm9yZSBhIHNldHVpZCgpIGNhbGwgKi8KLSAgICBpZiAoKHBpZCA9IG9zX2ZvcmsodW5peGRfY29uZmlnLnVzZXJfbmFtZSkpID09IC0xKSB7Ci0jZWxpZiBkZWZpbmVkKFRQRikKLSAgICBpZiAoKHBpZCA9IG9zX2Zvcmsocywgc2xvdCkpID09IC0xKSB7Ci0jZWxzZQotICAgIGlmICgocGlkID0gZm9yaygpKSA9PSAtMSkgewotI2VuZGlmCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgcywgImZvcms6IFVuYWJsZSB0byBmb3JrIG5ldyBwcm9jZXNzIik7Ci0KLQkvKiBmb3JrIGRpZG4ndCBzdWNjZWVkLiBGaXggdGhlIHNjb3JlYm9hcmQgb3IgZWxzZQotCSAqIGl0IHdpbGwgc2F5IFNFUlZFUl9TVEFSVElORyBmb3JldmVyIGFuZCBldmVyCi0JICovCi0JKHZvaWQpIGFwX3VwZGF0ZV9jaGlsZF9zdGF0dXMoc2xvdCwgU0VSVkVSX0RFQUQsIChyZXF1ZXN0X3JlYyAqKSBOVUxMKTsKLQotCS8qIEluIGNhc2Ugc3lzdGVtIHJlc291cmNlcyBhcmUgbWF4eGVkIG91dCwgd2UgZG9uJ3Qgd2FudAotCSAgIEFwYWNoZSBydW5uaW5nIGF3YXkgd2l0aCB0aGUgQ1BVIHRyeWluZyB0byBmb3JrIG92ZXIgYW5kCi0JICAgb3ZlciBhbmQgb3ZlciBhZ2Fpbi4gKi8KLQlzbGVlcCgxMCk7Ci0KLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaWYgKCFwaWQpIHsKLSNpZmRlZiBBSVhfQklORF9QUk9DRVNTT1IKLS8qIGJ5IGRlZmF1bHQgQUlYIGJpbmRzIHRvIGEgc2luZ2xlIHByb2Nlc3NvcgotICogdGhpcyBiaXQgdW5iaW5kcyBjaGlsZHJlbiB3aGljaCB3aWxsIHRoZW4gYmluZCB0byBhbm90aGVyIGNwdQotICovCi0jaW5jbHVkZSA8c3lzL3Byb2Nlc3Nvci5oPgotCWludCBzdGF0dXMgPSBiaW5kcHJvY2Vzc29yKEJJTkRQUk9DRVNTLCAoaW50KWdldHBpZCgpLCAKLQkJCQkgICBQUk9DRVNTT1JfQ0xBU1NfQU5ZKTsKLQlpZiAoc3RhdHVzICE9IE9LKSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX1dBUk5JTkcsIHNlcnZlcl9jb25mLAotCQkJInByb2Nlc3NvciB1bmJpbmQgZmFpbGVkICVkIiwgc3RhdHVzKTsKLQl9Ci0jZW5kaWYKLQlSQUlTRV9TSUdTVE9QKE1BS0VfQ0hJTEQpOwotCS8qIERpc2FibGUgdGhlIHJlc3RhcnQgc2lnbmFsIGhhbmRsZXJzIGFuZCBlbmFibGUgdGhlIGp1c3RfZGllIHN0dWZmLgotCSAqIE5vdGUgdGhhdCBzaW5jZSByZXN0YXJ0KCkganVzdCBub3RlcyB0aGF0IGEgcmVzdGFydCBoYXMgYmVlbgotCSAqIHJlcXVlc3RlZCB0aGVyZSdzIG5vIHJhY2UgY29uZGl0aW9uIGhlcmUuCi0JICovCi0Jc2lnbmFsKFNJR0hVUCwganVzdF9kaWUpOwotCXNpZ25hbChTSUdVU1IxLCBqdXN0X2RpZSk7Ci0Jc2lnbmFsKFNJR1RFUk0sIGp1c3RfZGllKTsKLQljaGlsZF9tYWluKHNsb3QpOwotICAgIH0KLQotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtzbG90XS5waWQgPSBwaWQ7Ci0jaWZkZWYgU0NPUkVCT0FSRF9GSUxFCi0gICAgbHNlZWsoc2NvcmVib2FyZF9mZCwgWHRPZmZzZXRPZihzY29yZWJvYXJkLCBwYXJlbnRbc2xvdF0pLCAwKTsKLSAgICBmb3JjZV93cml0ZShzY29yZWJvYXJkX2ZkLCAmYXBfc2NvcmVib2FyZF9pbWFnZS0+cGFyZW50W3Nsb3RdLAotCQlzaXplb2YocGFyZW50X3Njb3JlKSk7Ci0jZW5kaWYKLQotICAgIHJldHVybiAwOwotfQotCi0KLS8qIHN0YXJ0IHVwIGEgYnVuY2ggb2YgY2hpbGRyZW4gKi8KLXN0YXRpYyB2b2lkIHN0YXJ0dXBfY2hpbGRyZW4oaW50IG51bWJlcl90b19zdGFydCkKLXsKLSAgICBpbnQgaTsKLSAgICB0aW1lX3Qgbm93ID0gdGltZSgwKTsKLQotICAgIGZvciAoaSA9IDA7IG51bWJlcl90b19zdGFydCAmJiBpIDwgYXBfZGFlbW9uc19saW1pdDsgKytpKSB7Ci0JaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbaV0uc3RhdHVzICE9IFNFUlZFUl9ERUFEKSB7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQlpZiAobWFrZV9jaGlsZChzZXJ2ZXJfY29uZiwgaSwgbm93KSA8IDApIHsKLQkgICAgYnJlYWs7Ci0JfQotCS0tbnVtYmVyX3RvX3N0YXJ0OwotICAgIH0KLX0KLQotCi0vKgotICogaWRsZV9zcGF3bl9yYXRlIGlzIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCB3aWxsIGJlIHNwYXduZWQgb24gdGhlCi0gKiBuZXh0IG1haW50ZW5hbmNlIGN5Y2xlIGlmIHRoZXJlIGFyZW4ndCBlbm91Z2ggaWRsZSBzZXJ2ZXJzLiAgSXQgaXMKLSAqIGRvdWJsZWQgdXAgdG8gTUFYX1NQQVdOX1JBVEUsIGFuZCByZXNldCBvbmx5IHdoZW4gYSBjeWNsZSBnb2VzIGJ5Ci0gKiB3aXRob3V0IHRoZSBuZWVkIHRvIHNwYXduLgotICovCi1zdGF0aWMgaW50IGlkbGVfc3Bhd25fcmF0ZSA9IDE7Ci0jaWZuZGVmIE1BWF9TUEFXTl9SQVRFCi0jZGVmaW5lIE1BWF9TUEFXTl9SQVRFCSgzMikKLSNlbmRpZgotc3RhdGljIGludCBob2xkX29mZl9vbl9leHBvbmVudGlhbF9zcGF3bmluZzsKLQotc3RhdGljIHZvaWQgcGVyZm9ybV9pZGxlX3NlcnZlcl9tYWludGVuYW5jZSh2b2lkKQotewotICAgIGludCBpOwotICAgIGludCB0b19raWxsOwotICAgIGludCBpZGxlX2NvdW50OwotICAgIHNob3J0X3Njb3JlICpzczsKLSAgICB0aW1lX3Qgbm93ID0gdGltZSgwKTsKLSAgICBpbnQgZnJlZV9sZW5ndGg7Ci0gICAgaW50IGZyZWVfc2xvdHNbTUFYX1NQQVdOX1JBVEVdOwotICAgIGludCBsYXN0X25vbl9kZWFkOwotICAgIGludCB0b3RhbF9ub25fZGVhZDsKLQotICAgIC8qIGluaXRpYWxpemUgdGhlIGZyZWVfbGlzdCAqLwotICAgIGZyZWVfbGVuZ3RoID0gMDsKLQotICAgIHRvX2tpbGwgPSAtMTsKLSAgICBpZGxlX2NvdW50ID0gMDsKLSAgICBsYXN0X25vbl9kZWFkID0gLTE7Ci0gICAgdG90YWxfbm9uX2RlYWQgPSAwOwotCi0gICAgYXBfc3luY19zY29yZWJvYXJkX2ltYWdlKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGFwX2RhZW1vbnNfbGltaXQ7ICsraSkgewotCWludCBzdGF0dXM7Ci0KLQlpZiAoaSA+PSBtYXhfZGFlbW9uc19saW1pdCAmJiBmcmVlX2xlbmd0aCA9PSBpZGxlX3NwYXduX3JhdGUpCi0JICAgIGJyZWFrOwotCXNzID0gJmFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbaV07Ci0Jc3RhdHVzID0gc3MtPnN0YXR1czsKLQlpZiAoc3RhdHVzID09IFNFUlZFUl9ERUFEKSB7Ci0JICAgIC8qIHRyeSB0byBrZWVwIGNoaWxkcmVuIG51bWJlcnMgYXMgbG93IGFzIHBvc3NpYmxlICovCi0JICAgIGlmIChmcmVlX2xlbmd0aCA8IGlkbGVfc3Bhd25fcmF0ZSkgewotCQlmcmVlX3Nsb3RzW2ZyZWVfbGVuZ3RoXSA9IGk7Ci0JCSsrZnJlZV9sZW5ndGg7Ci0JICAgIH0KLQl9Ci0JZWxzZSB7Ci0JICAgIC8qIFdlIGNvbnNpZGVyIGEgc3RhcnRpbmcgc2VydmVyIGFzIGlkbGUgYmVjYXVzZSB3ZSBzdGFydGVkIGl0Ci0JICAgICAqIGF0IGxlYXN0IGEgY3ljbGUgYWdvLCBhbmQgaWYgaXQgc3RpbGwgaGFzbid0IGZpbmlzaGVkIHN0YXJ0aW5nCi0JICAgICAqIHRoZW4gd2UncmUganVzdCBnb2luZyB0byBzd2FtcCB0aGluZ3Mgd29yc2UgYnkgZm9ya2luZyBtb3JlLgotCSAgICAgKiBTbyB3ZSBob3BlZnVsbHkgd29uJ3QgbmVlZCB0byBmb3JrIG1vcmUgaWYgd2UgY291bnQgaXQuCi0JICAgICAqIFRoaXMgZGVwZW5kcyBvbiB0aGUgb3JkZXJpbmcgb2YgU0VSVkVSX1JFQURZIGFuZCBTRVJWRVJfU1RBUlRJTkcuCi0JICAgICAqLwotCSAgICBpZiAoc3RhdHVzIDw9IFNFUlZFUl9SRUFEWSkgewotCQkrKyBpZGxlX2NvdW50OwotCQkvKiBhbHdheXMga2lsbCB0aGUgaGlnaGVzdCBudW1iZXJlZCBjaGlsZCBpZiB3ZSBoYXZlIHRvLi4uCi0JCSAqIG5vIHJlYWxseSB3ZWxsIHRob3VnaHQgb3V0IHJlYXNvbiAuLi4gb3RoZXIgdGhhbiBvYnNlcnZpbmcKLQkJICogdGhlIHNlcnZlciBiZWhhdmlvdXIgdW5kZXIgbGludXggd2hlcmUgbG93ZXIgbnVtYmVyZWQgY2hpbGRyZW4KLQkJICogdGVuZCB0byBzZXJ2aWNlIG1vcmUgaGl0cyAoYW5kIGhlbmNlIGFyZSBtb3JlIGxpa2VseSB0byBoYXZlCi0JCSAqIHRoZWlyIGRhdGEgaW4gY3B1IGNhY2hlcykuCi0JCSAqLwotCQl0b19raWxsID0gaTsKLQkgICAgfQotCi0JICAgICsrdG90YWxfbm9uX2RlYWQ7Ci0JICAgIGxhc3Rfbm9uX2RlYWQgPSBpOwotCX0KLSAgICB9Ci0gICAgbWF4X2RhZW1vbnNfbGltaXQgPSBsYXN0X25vbl9kZWFkICsgMTsKLSAgICBpZiAoaWRsZV9jb3VudCA+IGFwX2RhZW1vbnNfbWF4X2ZyZWUpIHsKLQkvKiBraWxsIG9mZiBvbmUgY2hpbGQuLi4gd2UgdXNlIFNJR1VTUjEgYmVjYXVzZSB0aGF0J2xsIGNhdXNlIGl0IHRvCi0JICogc2h1dCBkb3duIGdyYWNlZnVsbHksIGluIGNhc2UgaXQgaGFwcGVuZWQgdG8gcGljayB1cCBhIHJlcXVlc3QKLQkgKiB3aGlsZSB3ZSB3ZXJlIGNvdW50aW5nCi0JICovCi0Ja2lsbChhcF9zY29yZWJvYXJkX2ltYWdlLT5wYXJlbnRbdG9fa2lsbF0ucGlkLCBTSUdVU1IxKTsKLQlpZGxlX3NwYXduX3JhdGUgPSAxOwotICAgIH0KLSAgICBlbHNlIGlmIChpZGxlX2NvdW50IDwgYXBfZGFlbW9uc19taW5fZnJlZSkgewotCS8qIHRlcm1pbmF0ZSB0aGUgZnJlZSBsaXN0ICovCi0JaWYgKGZyZWVfbGVuZ3RoID09IDApIHsKLQkgICAgLyogb25seSByZXBvcnQgdGhpcyBjb25kaXRpb24gb25jZSAqLwotCSAgICBzdGF0aWMgaW50IHJlcG9ydGVkID0gMDsKLQotCSAgICBpZiAoIXJlcG9ydGVkKSB7Ci0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgc2VydmVyX2NvbmYsCi0JCQkgICAgInNlcnZlciByZWFjaGVkIE1heENsaWVudHMgc2V0dGluZywgY29uc2lkZXIiCi0JCQkgICAgIiByYWlzaW5nIHRoZSBNYXhDbGllbnRzIHNldHRpbmciKTsKLQkJcmVwb3J0ZWQgPSAxOwotCSAgICB9Ci0JICAgIGlkbGVfc3Bhd25fcmF0ZSA9IDE7Ci0JfQotCWVsc2UgewotCSAgICBpZiAoaWRsZV9zcGF3bl9yYXRlID49IDgpIHsKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgc2VydmVyX2NvbmYsCi0JCSAgICAic2VydmVyIHNlZW1zIGJ1c3ksICh5b3UgbWF5IG5lZWQgIgotCQkgICAgInRvIGluY3JlYXNlIFN0YXJ0U2VydmVycywgb3IgTWluL01heFNwYXJlU2VydmVycyksICIKLQkJICAgICJzcGF3bmluZyAlZCBjaGlsZHJlbiwgdGhlcmUgYXJlICVkIGlkbGUsIGFuZCAiCi0JCSAgICAiJWQgdG90YWwgY2hpbGRyZW4iLCBpZGxlX3NwYXduX3JhdGUsCi0JCSAgICBpZGxlX2NvdW50LCB0b3RhbF9ub25fZGVhZCk7Ci0JICAgIH0KLQkgICAgZm9yIChpID0gMDsgaSA8IGZyZWVfbGVuZ3RoOyArK2kpIHsKLSNpZmRlZiBUUEYKLSAgICAgICAgaWYobWFrZV9jaGlsZChzZXJ2ZXJfY29uZiwgZnJlZV9zbG90c1tpXSwgbm93KSA9PSAtMSkgewotICAgICAgICAgICAgaWYoZnJlZV9sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgIHNodXRkb3duX3BlbmRpbmcgPSAxOwotICAgICAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FTUVSRywgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgIk5vIGFjdGl2ZSBjaGlsZCBwcm9jZXNzZXM6IHNodXR0aW5nIGRvd24iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2Vsc2UKLQkJbWFrZV9jaGlsZChzZXJ2ZXJfY29uZiwgZnJlZV9zbG90c1tpXSwgbm93KTsKLSNlbmRpZiAvKiBUUEYgKi8KLQkgICAgfQotCSAgICAvKiB0aGUgbmV4dCB0aW1lIGFyb3VuZCB3ZSB3YW50IHRvIHNwYXduIHR3aWNlIGFzIG1hbnkgaWYgdGhpcwotCSAgICAgKiB3YXNuJ3QgZ29vZCBlbm91Z2gsIGJ1dCBub3QgaWYgd2UndmUganVzdCBkb25lIGEgZ3JhY2VmdWwKLQkgICAgICovCi0JICAgIGlmIChob2xkX29mZl9vbl9leHBvbmVudGlhbF9zcGF3bmluZykgewotCQktLWhvbGRfb2ZmX29uX2V4cG9uZW50aWFsX3NwYXduaW5nOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKGlkbGVfc3Bhd25fcmF0ZSA8IE1BWF9TUEFXTl9SQVRFKSB7Ci0JCWlkbGVfc3Bhd25fcmF0ZSAqPSAyOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICBlbHNlIHsKLQlpZGxlX3NwYXduX3JhdGUgPSAxOwotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZCBwcm9jZXNzX2NoaWxkX3N0YXR1cyhpbnQgcGlkLCBhcF93YWl0X3Qgc3RhdHVzKQotewotICAgIC8qIENoaWxkIGRpZWQuLi4gaWYgaXQgZGllZCBkdWUgdG8gYSBmYXRhbCBlcnJvciwKLQkqIHdlIHNob3VsZCBzaW1wbHkgYmFpbCBvdXQuCi0JKi8KLSAgICBpZiAoKFdJRkVYSVRFRChzdGF0dXMpKSAmJgotCVdFWElUU1RBVFVTKHN0YXR1cykgPT0gQVBFWElUX0NISUxERkFUQUwpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlR8QVBMT0dfTk9FUlJOTywgc2VydmVyX2NvbmYsCi0JCQkiQ2hpbGQgJWQgcmV0dXJuZWQgYSBGYXRhbCBlcnJvci4uLiBcbiIKLQkJCSJBcGFjaGUgaXMgZXhpdGluZyEiLAotCQkJcGlkKTsKLQlleGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci0gICAgaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpIHsKLQlzd2l0Y2ggKFdURVJNU0lHKHN0YXR1cykpIHsKLQljYXNlIFNJR1RFUk06Ci0JY2FzZSBTSUdIVVA6Ci0JY2FzZSBTSUdVU1IxOgotCWNhc2UgU0lHS0lMTDoKLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLSNpZmRlZiBTWVNfU0lHTElTVAotI2lmZGVmIFdDT1JFRFVNUAotCSAgICBpZiAoV0NPUkVEVU1QKHN0YXR1cykpIHsKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLAotCQkJICAgICBzZXJ2ZXJfY29uZiwKLQkJCSAgICAgImNoaWxkIHBpZCAlZCBleGl0IHNpZ25hbCAlcyAoJWQpLCAiCi0JCQkgICAgICJwb3NzaWJsZSBjb3JlZHVtcCBpbiAlcyIsCi0JCQkgICAgIHBpZCwgKFdURVJNU0lHKHN0YXR1cykgPj0gTnVtU0lHKSA/ICIiIDogCi0JCQkgICAgIFNZU19TSUdMSVNUW1dURVJNU0lHKHN0YXR1cyldLCBXVEVSTVNJRyhzdGF0dXMpLAotCQkJICAgICBhcF9jb3JlZHVtcF9kaXIpOwotCSAgICB9Ci0JICAgIGVsc2UgewotI2VuZGlmCi0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwKLQkJCSAgICAgc2VydmVyX2NvbmYsCi0JCQkgICAgICJjaGlsZCBwaWQgJWQgZXhpdCBzaWduYWwgJXMgKCVkKSIsIHBpZCwKLQkJCSAgICAgU1lTX1NJR0xJU1RbV1RFUk1TSUcoc3RhdHVzKV0sIFdURVJNU0lHKHN0YXR1cykpOwotI2lmZGVmIFdDT1JFRFVNUAotCSAgICB9Ci0jZW5kaWYKLSNlbHNlCi0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwKLQkJCSBzZXJ2ZXJfY29uZiwKLQkJCSAiY2hpbGQgcGlkICVkIGV4aXQgc2lnbmFsICVkIiwKLQkJCSBwaWQsIFdURVJNU0lHKHN0YXR1cykpOwotI2VuZGlmCi0JfQotICAgIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEV4ZWN1dGl2ZSByb3V0aW5lcy4KLSAqLwotCi1pbnQgYXBfbXBtX3J1bihwb29sICpfcGNvbmYsIHBvb2wgKnBsb2csIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgaW50IHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydDsKLQotICAgIHBjb25mID0gX3Bjb25mOwotCi0gICAgc2VydmVyX2NvbmYgPSBzOwotCi0gICAgYXBfbG9nX3BpZChwY29uZiwgYXBfcGlkX2ZuYW1lKTsKLSAgICBzZXR1cF9saXN0ZW5lcnMocGNvbmYpOwotCi0gICAgU0FGRV9BQ0NFUFQoYWNjZXB0X211dGV4X2luaXQocGNvbmYpKTsKLSAgICBpZiAoIWlzX2dyYWNlZnVsKSB7Ci0JcmVpbml0X3Njb3JlYm9hcmQocGNvbmYpOwotICAgIH0KLSNpZmRlZiBTQ09SRUJPQVJEX0ZJTEUKLSAgICBlbHNlIHsKLQlhcF9zY29yZWJvYXJkX2ZuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocGNvbmYsIGFwX3Njb3JlYm9hcmRfZm5hbWUpOwotCWFwX25vdGVfY2xlYW51cHNfZm9yX2ZkKHBjb25mLCBzY29yZWJvYXJkX2ZkKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHNldF9zaWduYWxzKCk7Ci0KLSAgICBpZiAoYXBfZGFlbW9uc19tYXhfZnJlZSA8IGFwX2RhZW1vbnNfbWluX2ZyZWUgKyAxKQkvKiBEb24ndCB0aHJhc2guLi4gKi8KLQlhcF9kYWVtb25zX21heF9mcmVlID0gYXBfZGFlbW9uc19taW5fZnJlZSArIDE7Ci0KLSAgICAvKiBJZiB3ZSdyZSBkb2luZyBhIGdyYWNlZnVsX3Jlc3RhcnQgdGhlbiB3ZSdyZSBnb2luZyB0byBzZWUgYSBsb3QKLQkqIG9mIGNoaWxkcmVuIGV4aXRpbmcgaW1tZWRpYXRlbHkgd2hlbiB3ZSBnZXQgaW50byB0aGUgbWFpbiBsb29wCi0JKiBiZWxvdyAoYmVjYXVzZSB3ZSBqdXN0IHNlbnQgdGhlbSBTSUdVU1IxKS4gIFRoaXMgaGFwcGVucyBwcmV0dHkKLQkqIHJhcGlkbHkuLi4gYW5kIGZvciBlYWNoIG9uZSB0aGF0IGV4aXRzIHdlJ2xsIHN0YXJ0IGEgbmV3IG9uZSB1bnRpbAotCSogd2UgcmVhY2ggYXQgbGVhc3QgZGFlbW9uc19taW5fZnJlZS4gIEJ1dCB3ZSBtYXkgYmUgcGVybWl0dGVkIHRvCi0JKiBzdGFydCBtb3JlIHRoYW4gdGhhdCwgc28gd2UnbGwganVzdCBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IHdlJ3JlCi0JKiBzdXBwb3NlZCB0byBzdGFydCB1cCB3aXRob3V0IHRoZSAxIHNlY29uZCBwZW5hbHR5IGJldHdlZW4gZWFjaCBmb3JrLgotCSovCi0gICAgcmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0ID0gYXBfZGFlbW9uc190b19zdGFydDsKLSAgICBpZiAocmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0ID4gYXBfZGFlbW9uc19saW1pdCkgewotCXJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydCA9IGFwX2RhZW1vbnNfbGltaXQ7Ci0gICAgfQotICAgIGlmICghaXNfZ3JhY2VmdWwpIHsKLQlzdGFydHVwX2NoaWxkcmVuKHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydCk7Ci0JcmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0ID0gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JLyogZ2l2ZSB0aGUgc3lzdGVtIHNvbWUgdGltZSB0byByZWNvdmVyIGJlZm9yZSBraWNraW5nIGludG8KLQkgICAgKiBleHBvbmVudGlhbCBtb2RlICovCi0JaG9sZF9vZmZfb25fZXhwb25lbnRpYWxfc3Bhd25pbmcgPSAxMDsKLSAgICB9Ci0KLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19OT1RJQ0UsIHNlcnZlcl9jb25mLAotCQkiJXMgY29uZmlndXJlZCAtLSByZXN1bWluZyBub3JtYWwgb3BlcmF0aW9ucyIsCi0JCWFwX2dldF9zZXJ2ZXJfdmVyc2lvbigpKTsKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19JTkZPLCBzZXJ2ZXJfY29uZiwKLQkJIlNlcnZlciBidWlsdDogJXMiLCBhcF9nZXRfc2VydmVyX2J1aWx0KCkpOwotICAgIHJlc3RhcnRfcGVuZGluZyA9IHNodXRkb3duX3BlbmRpbmcgPSAwOwotCi0gICAgd2hpbGUgKCFyZXN0YXJ0X3BlbmRpbmcgJiYgIXNodXRkb3duX3BlbmRpbmcpIHsKLQlpbnQgY2hpbGRfc2xvdDsKLQlhcF93YWl0X3Qgc3RhdHVzOwotCWludCBwaWQgPSB3YWl0X29yX3RpbWVvdXQoJnN0YXR1cyk7Ci0KLQkvKiBYWFg6IGlmIGl0IHRha2VzIGxvbmdlciB0aGFuIDEgc2Vjb25kIGZvciBhbGwgb3VyIGNoaWxkcmVuCi0JICogdG8gc3RhcnQgdXAgYW5kIGdldCBpbnRvIElETEUgc3RhdGUgdGhlbiB3ZSBtYXkgc3Bhd24gYW4KLQkgKiBleHRyYSBjaGlsZAotCSAqLwotCWlmIChwaWQgPj0gMCkgewotCSAgICBwcm9jZXNzX2NoaWxkX3N0YXR1cyhwaWQsIHN0YXR1cyk7Ci0JICAgIC8qIG5vbi1mYXRhbCBkZWF0aC4uLiBub3RlIHRoYXQgaXQncyBnb25lIGluIHRoZSBzY29yZWJvYXJkLiAqLwotCSAgICBhcF9zeW5jX3Njb3JlYm9hcmRfaW1hZ2UoKTsKLQkgICAgY2hpbGRfc2xvdCA9IGZpbmRfY2hpbGRfYnlfcGlkKHBpZCk7Ci0JICAgIGlmIChjaGlsZF9zbG90ID49IDApIHsKLQkJKHZvaWQpIGFwX3VwZGF0ZV9jaGlsZF9zdGF0dXMoY2hpbGRfc2xvdCwgU0VSVkVSX0RFQUQsCi0JCQkJCSAgICAocmVxdWVzdF9yZWMgKikgTlVMTCk7Ci0JCWlmIChyZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQKLQkJICAgICYmIGNoaWxkX3Nsb3QgPCBhcF9kYWVtb25zX2xpbWl0KSB7Ci0JCSAgICAvKiB3ZSdyZSBzdGlsbCBkb2luZyBhIDEtZm9yLTEgcmVwbGFjZW1lbnQgb2YgZGVhZAotCQkJKiBjaGlsZHJlbiB3aXRoIG5ldyBjaGlsZHJlbgotCQkJKi8KLQkJICAgIG1ha2VfY2hpbGQoc2VydmVyX2NvbmYsIGNoaWxkX3Nsb3QsIHRpbWUoMCkpOwotCQkgICAgLS1yZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQ7Ci0JCX0KLSNpZmRlZiBIQVNfT1RIRVJfQ0hJTEQKLQkgICAgfQotCSAgICBlbHNlIGlmIChyZWFwX290aGVyX2NoaWxkKHBpZCwgc3RhdHVzKSA9PSAwKSB7Ci0JCS8qIGhhbmRsZWQgKi8KLSNlbmRpZgotCSAgICB9Ci0JICAgIGVsc2UgaWYgKGlzX2dyYWNlZnVsKSB7Ci0JCS8qIEdyZWF0LCB3ZSd2ZSBwcm9iYWJseSBqdXN0IGxvc3QgYSBzbG90IGluIHRoZQotCQkgICAgKiBzY29yZWJvYXJkLiAgU29tZWhvdyB3ZSBkb24ndCBrbm93IGFib3V0IHRoaXMKLQkJICAgICogY2hpbGQuCi0JCSAgICAqLwotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLCBzZXJ2ZXJfY29uZiwKLQkJCSAgICAibG9uZyBsb3N0IGNoaWxkIGNhbWUgaG9tZSEgKHBpZCAlZCkiLCBwaWQpOwotCSAgICB9Ci0JICAgIC8qIERvbid0IHBlcmZvcm0gaWRsZSBtYWludGVuYW5jZSB3aGVuIGEgY2hpbGQgZGllcywKLQkJKiBvbmx5IGRvIGl0IHdoZW4gdGhlcmUncyBhIHRpbWVvdXQuICBSZW1lbWJlciBvbmx5IGEKLQkJKiBmaW5pdGUgbnVtYmVyIG9mIGNoaWxkcmVuIGNhbiBkaWUsIGFuZCBpdCdzIHByZXR0eQotCQkqIHBhdGhvbG9naWNhbCBmb3IgYSBsb3QgdG8gZGllIHN1ZGRlbmx5LgotCQkqLwotCSAgICBjb250aW51ZTsKLQl9Ci0JZWxzZSBpZiAocmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0KSB7Ci0JICAgIC8qIHdlIGhpdCBhIDEgc2Vjb25kIHRpbWVvdXQgaW4gd2hpY2ggbm9uZSBvZiB0aGUgcHJldmlvdXMKLQkJKiBnZW5lcmF0aW9uIG9mIGNoaWxkcmVuIG5lZWRlZCB0byBiZSByZWFwZWQuLi4gc28gYXNzdW1lCi0JCSogdGhleSdyZSBhbGwgZG9uZSwgYW5kIHBpY2sgdXAgdGhlIHNsYWNrIGlmIGFueSBpcyBsZWZ0LgotCQkqLwotCSAgICBzdGFydHVwX2NoaWxkcmVuKHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydCk7Ci0JICAgIHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydCA9IDA7Ci0JICAgIC8qIEluIGFueSBldmVudCB3ZSByZWFsbHkgc2hvdWxkbid0IGRvIHRoZSBjb2RlIGJlbG93IGJlY2F1c2UKLQkJKiBmZXcgb2YgdGhlIHNlcnZlcnMgd2UganVzdCBzdGFydGVkIGFyZSBpbiB0aGUgSURMRSBzdGF0ZQotCQkqIHlldCwgc28gd2UnZCBtaXN0YWtlbmx5IGNyZWF0ZSBhbiBleHRyYSBzZXJ2ZXIuCi0JCSovCi0JICAgIGNvbnRpbnVlOwotCX0KLQotCXBlcmZvcm1faWRsZV9zZXJ2ZXJfbWFpbnRlbmFuY2UoKTsKLSNpZmRlZiBUUEYKLSAgICBzaHV0ZG93bl9wZW5kaW5nID0gb3NfY2hlY2tfc2VydmVyKHRwZl9zZXJ2ZXJfbmFtZSk7Ci0gICAgYXBfY2hlY2tfc2lnbmFscygpOwotICAgIHNsZWVwKDEpOwotI2VuZGlmIC8qVFBGICovCi0gICAgfQotCi0gICAgaWYgKHNodXRkb3duX3BlbmRpbmcpIHsKLQkvKiBUaW1lIHRvIGdyYWNlZnVsbHkgc2h1dCBkb3duOgotCSAqIEtpbGwgY2hpbGQgcHJvY2Vzc2VzLCB0ZWxsIHRoZW0gdG8gY2FsbCBjaGlsZF9leGl0LCBldGMuLi4KLQkgKi8KLQlpZiAoYXBfa2lsbHBnKGdldHBncnAoKSwgU0lHVEVSTSkgPCAwKSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBzZXJ2ZXJfY29uZiwgImtpbGxwZyBTSUdURVJNIik7Ci0JfQotCXJlY2xhaW1fY2hpbGRfcHJvY2Vzc2VzKDEpOwkJLyogU3RhcnQgd2l0aCBTSUdURVJNICovCi0KLQkvKiBjbGVhbnVwIHBpZCBmaWxlIG9uIG5vcm1hbCBzaHV0ZG93biAqLwotCXsKLQkgICAgY29uc3QgY2hhciAqcGlkZmlsZSA9IE5VTEw7Ci0JICAgIHBpZGZpbGUgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZSAocGNvbmYsIGFwX3BpZF9mbmFtZSk7Ci0JICAgIGlmICggcGlkZmlsZSAhPSBOVUxMICYmIHVubGluayhwaWRmaWxlKSA9PSAwKQotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19JTkZPLAotCQkJCXNlcnZlcl9jb25mLAotCQkJCSJyZW1vdmVkIFBJRCBmaWxlICVzIChwaWQ9JWxkKSIsCi0JCQkJcGlkZmlsZSwgKGxvbmcpZ2V0cGlkKCkpOwotCX0KLQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwgc2VydmVyX2NvbmYsCi0JCSAgICAiY2F1Z2h0IFNJR1RFUk0sIHNodXR0aW5nIGRvd24iKTsKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiB3ZSd2ZSBiZWVuIHRvbGQgdG8gcmVzdGFydCAqLwotICAgIHNpZ25hbChTSUdIVVAsIFNJR19JR04pOwotICAgIHNpZ25hbChTSUdVU1IxLCBTSUdfSUdOKTsKLQotICAgIGlmIChvbmVfcHJvY2VzcykgewotCS8qIG5vdCB3b3J0aCB0aGlua2luZyBhYm91dCAqLwotCXJldHVybiAxOwotICAgIH0KLQotICAgIC8qIGFkdmFuY2UgdG8gdGhlIG5leHQgZ2VuZXJhdGlvbiAqLwotICAgIC8qIFhYWDogd2UgcmVhbGx5IG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgbmV3IGdlbmVyYXRpb24gbnVtYmVyIGlzbid0IGluCi0gICAgICogdXNlIGJ5IGFueSBvZiB0aGUgY2hpbGRyZW4uCi0gICAgICovCi0gICAgKythcF9teV9nZW5lcmF0aW9uOwotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbC5ydW5uaW5nX2dlbmVyYXRpb24gPSBhcF9teV9nZW5lcmF0aW9uOwotICAgIHVwZGF0ZV9zY29yZWJvYXJkX2dsb2JhbCgpOwotCi0gICAgaWYgKGlzX2dyYWNlZnVsKSB7Ci0jaWZuZGVmIFNDT1JFQk9BUkRfRklMRQotCWludCBpOwotI2VuZGlmCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCBzZXJ2ZXJfY29uZiwKLQkJICAgICJTSUdVU1IxIHJlY2VpdmVkLiAgRG9pbmcgZ3JhY2VmdWwgcmVzdGFydCIpOwotCi0JLyoga2lsbCBvZmYgdGhlIGlkbGUgb25lcyAqLwotCWlmIChhcF9raWxscGcoZ2V0cGdycCgpLCBTSUdVU1IxKSA8IDApIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIHNlcnZlcl9jb25mLCAia2lsbHBnIFNJR1VTUjEiKTsKLQl9Ci0jaWZuZGVmIFNDT1JFQk9BUkRfRklMRQotCS8qIFRoaXMgaXMgbW9zdGx5IGZvciBkZWJ1Z2dpbmcuLi4gc28gdGhhdCB3ZSBrbm93IHdoYXQgaXMgc3RpbGwKLQkgICAgKiBncmFjZWZ1bGx5IGRlYWxpbmcgd2l0aCBleGlzdGluZyByZXF1ZXN0LiAgQnV0IHdlIGNhbid0IHJlYWxseQotCSAgICAqIGRvIGl0IGlmIHdlJ3JlIGluIGEgU0NPUkVCT0FSRF9GSUxFIGJlY2F1c2UgaXQnbGwgY2F1c2UKLQkgICAgKiBjb3JydXB0aW9uIHRvbyBlYXNpbHkuCi0JICAgICovCi0JYXBfc3luY19zY29yZWJvYXJkX2ltYWdlKCk7Ci0JZm9yIChpID0gMDsgaSA8IGFwX2RhZW1vbnNfbGltaXQ7ICsraSkgewotCSAgICBpZiAoYXBfc2NvcmVib2FyZF9pbWFnZS0+c2VydmVyc1tpXS5zdGF0dXMgIT0gU0VSVkVSX0RFQUQpIHsKLQkJYXBfc2NvcmVib2FyZF9pbWFnZS0+c2VydmVyc1tpXS5zdGF0dXMgPSBTRVJWRVJfR1JBQ0VGVUw7Ci0JICAgIH0KLQl9Ci0jZW5kaWYKLSAgICB9Ci0gICAgZWxzZSB7Ci0JLyogS2lsbCAnZW0gb2ZmICovCi0JaWYgKGFwX2tpbGxwZyhnZXRwZ3JwKCksIFNJR0hVUCkgPCAwKSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBzZXJ2ZXJfY29uZiwgImtpbGxwZyBTSUdIVVAiKTsKLQl9Ci0JcmVjbGFpbV9jaGlsZF9wcm9jZXNzZXMoMCk7CQkvKiBOb3Qgd2hlbiBqdXN0IHN0YXJ0aW5nIHVwICovCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCBzZXJ2ZXJfY29uZiwKLQkJICAgICJTSUdIVVAgcmVjZWl2ZWQuICBBdHRlbXB0aW5nIHRvIHJlc3RhcnQiKTsKLSAgICB9Ci0KLSAgICAvKiBtdXN0IGNvcHkgbm93IGJlZm9yZSBwY29uZiBpcyBjbGVhcmVkICovCi0gICAgY29weV9saXN0ZW5lcnMocGNvbmYpOwotICAgIGlmICghaXNfZ3JhY2VmdWwpIHsKLQlhcF9yZXN0YXJ0X3RpbWUgPSB0aW1lKE5VTEwpOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBwcmVmb3JrX3ByZV9jb21tYW5kX2xpbmUocG9vbCAqcGNvbW1hbmRzKQotewotICAgIElOSVRfU0lHTElTVCgpOwotI2lmZGVmIEFVWDMKLSAgICAodm9pZCkgc2V0NDJzaWcoKTsKLSNlbmRpZgotICAgIC8qIFRPRE86IHNldCBvbmVfcHJvY2VzcyBwcm9wZXJseSAqLyBvbmVfcHJvY2VzcyA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHByZWZvcmtfcHJlX2NvbmZpZyhwb29sICpwY29uZiwgcG9vbCAqcGxvZywgcG9vbCAqcHRlbXApCi17Ci0gICAgc3RhdGljIGludCByZXN0YXJ0X251bSA9IDA7Ci0KLSAgICBvbmVfcHJvY2VzcyA9IGFwX2V4aXN0c19jb25maWdfZGVmaW5lKCJPTkVfUFJPQ0VTUyIpOwotCi0gICAgLyogc2lnaCwgd2FudCB0aGlzIG9ubHkgdGhlIHNlY29uZCB0aW1lIGFyb3VuZCAqLwotICAgIGlmIChyZXN0YXJ0X251bSsrID09IDEpIHsKLQlpc19ncmFjZWZ1bCA9IDA7Ci0KLQlpZiAoIW9uZV9wcm9jZXNzKSB7Ci0JICAgIHVuaXhkX2RldGFjaCgpOwotCX0KLQotCW15X3BpZCA9IGdldHBpZCgpOwotICAgIH0KLQotICAgIHVuaXhkX3ByZV9jb25maWcoKTsKLSAgICBhcF9kYWVtb25zX3RvX3N0YXJ0ID0gREVGQVVMVF9TVEFSVF9EQUVNT047Ci0gICAgYXBfZGFlbW9uc19taW5fZnJlZSA9IERFRkFVTFRfTUlOX0ZSRUVfREFFTU9OOwotICAgIGFwX2RhZW1vbnNfbWF4X2ZyZWUgPSBERUZBVUxUX01BWF9GUkVFX0RBRU1PTjsKLSAgICBhcF9kYWVtb25zX2xpbWl0ID0gSEFSRF9TRVJWRVJfTElNSVQ7Ci0gICAgYXBfcGlkX2ZuYW1lID0gREVGQVVMVF9QSURMT0c7Ci0gICAgYXBfc2NvcmVib2FyZF9mbmFtZSA9IERFRkFVTFRfU0NPUkVCT0FSRDsKLSAgICBhcF9sb2NrX2ZuYW1lID0gREVGQVVMVF9MT0NLRklMRTsKLSAgICBhcF9tYXhfcmVxdWVzdHNfcGVyX2NoaWxkID0gREVGQVVMVF9NQVhfUkVRVUVTVFNfUEVSX0NISUxEOwotICAgIC8qIFpaWiAgSW5pdGlhbGl6ZSB0aGUgTmV0d29yayBBZGRyZXNzIGhlcmUuICovCi0gICAgYXBfYmluZF9hZGRyZXNzLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOwotICAgIGFwX2xpc3RlbmVycyA9IE5VTEw7Ci0gICAgYXBfbGlzdGVuYmFja2xvZyA9IERFRkFVTFRfTElTVEVOQkFDS0xPRzsKLSAgICBhcF9leHRlbmRlZF9zdGF0dXMgPSAwOwotCi0gICAgYXBfY3B5c3RybihhcF9jb3JlZHVtcF9kaXIsIGFwX3NlcnZlcl9yb290LCBzaXplb2YoYXBfY29yZWR1bXBfZGlyKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHByZWZvcmtfcG9zdF9jb25maWcocG9vbCAqcGNvbmYsIHBvb2wgKnBsb2csIHBvb2wgKnB0ZW1wLCBzZXJ2ZXJfcmVjICpzKQotewotICAgIGlmIChhcF9saXN0ZW5lcnMgPT0gTlVMTCkgewotCS8qIGFsbG9jYXRlIGEgZGVmYXVsdCBsaXN0ZW5lciAqLwotCWxpc3Rlbl9yZWMgKm5ldzsKLQotCW5ldyA9IGFwX3BjYWxsb2MocGNvbmYsIHNpemVvZihsaXN0ZW5fcmVjKSk7Ci0JbmV3LT5sb2NhbF9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotCW5ldy0+bG9jYWxfYWRkci5zaW5fYWRkciA9IGFwX2JpbmRfYWRkcmVzczsKLQluZXctPmxvY2FsX2FkZHIuc2luX3BvcnQgPSBodG9ucyhzLT5wb3J0ID8gcy0+cG9ydCA6IERFRkFVTFRfSFRUUF9QT1JUKTsKLQluZXctPmZkID0gLTE7Ci0JbmV3LT5uZXh0ID0gTlVMTDsKLQlhcF9saXN0ZW5lcnMgPSBuZXc7Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3BpZGZpbGUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChjbWQtPnNlcnZlci0+aXNfdmlydHVhbCkgewotCXJldHVybiAiUGlkRmlsZSBkaXJlY3RpdmUgbm90IGFsbG93ZWQgaW4gPFZpcnR1YWxIb3N0PiI7Ci0gICAgfQotICAgIGFwX3BpZF9mbmFtZSA9IGFyZzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9zY29yZWJvYXJkKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBhcF9zY29yZWJvYXJkX2ZuYW1lID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2xvY2tmaWxlKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBhcF9sb2NrX2ZuYW1lID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2RhZW1vbnNfdG9fc3RhcnQoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX2RhZW1vbnNfdG9fc3RhcnQgPSBhdG9pKGFyZyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbWluX2ZyZWVfc2VydmVycyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBhcF9kYWVtb25zX21pbl9mcmVlID0gYXRvaShhcmcpOwotICAgIGlmIChhcF9kYWVtb25zX21pbl9mcmVlIDw9IDApIHsKLSAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkc6IGRldGVjdGVkIE1pblNwYXJlU2VydmVycyBzZXQgdG8gbm9uLXBvc2l0aXZlLlxuIik7Ci0gICAgICAgZnByaW50ZihzdGRlcnIsICJSZXNldHRpbmcgdG8gMSB0byBhdm9pZCBhbG1vc3QgY2VydGFpbiBBcGFjaGUgZmFpbHVyZS5cbiIpOwotICAgICAgIGZwcmludGYoc3RkZXJyLCAiUGxlYXNlIHJlYWQgdGhlIGRvY3VtZW50YXRpb24uXG4iKTsKLSAgICAgICBhcF9kYWVtb25zX21pbl9mcmVlID0gMTsKLSAgICB9Ci0gICAgICAgCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbWF4X2ZyZWVfc2VydmVycyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBhcF9kYWVtb25zX21heF9mcmVlID0gYXRvaShhcmcpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3NlcnZlcl9saW1pdCAoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX2RhZW1vbnNfbGltaXQgPSBhdG9pKGFyZyk7Ci0gICAgaWYgKGFwX2RhZW1vbnNfbGltaXQgPiBIQVJEX1NFUlZFUl9MSU1JVCkgewotICAgICAgIGZwcmludGYoc3RkZXJyLCAiV0FSTklORzogTWF4Q2xpZW50cyBvZiAlZCBleGNlZWRzIGNvbXBpbGUgdGltZSBsaW1pdCAiCi0gICAgICAgICAgICJvZiAlZCBzZXJ2ZXJzLFxuIiwgYXBfZGFlbW9uc19saW1pdCwgSEFSRF9TRVJWRVJfTElNSVQpOwotICAgICAgIGZwcmludGYoc3RkZXJyLCAiIGxvd2VyaW5nIE1heENsaWVudHMgdG8gJWQuICBUbyBpbmNyZWFzZSwgcGxlYXNlICIKLSAgICAgICAgICAgInNlZSB0aGVcbiIsIEhBUkRfU0VSVkVSX0xJTUlUKTsKLSAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiBIQVJEX1NFUlZFUl9MSU1JVCBkZWZpbmUgaW4gc3JjL2luY2x1ZGUvaHR0cGQuaC5cbiIpOwotICAgICAgIGFwX2RhZW1vbnNfbGltaXQgPSBIQVJEX1NFUlZFUl9MSU1JVDsKLSAgICB9IAotICAgIGVsc2UgaWYgKGFwX2RhZW1vbnNfbGltaXQgPCAxKSB7Ci0JZnByaW50ZihzdGRlcnIsICJXQVJOSU5HOiBSZXF1aXJlIE1heENsaWVudHMgPiAwLCBzZXR0aW5nIHRvIDFcbiIpOwotCWFwX2RhZW1vbnNfbGltaXQgPSAxOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9tYXhfcmVxdWVzdHMoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQgPSBhdG9pKGFyZyk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9jb3JlZHVtcGRpciAoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIHN0cnVjdCBzdGF0IGZpbmZvOwotICAgIGNvbnN0IGNoYXIgKmZuYW1lOwotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGZuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUoY21kLT5wb29sLCBhcmcpOwotICAgIC8qIFpaWiBjaGFuZ2UgdGhpcyB0byB0aGUgQVAgZnVuYyBGaWxlSW5mbyovCi0gICAgaWYgKChzdGF0KGZuYW1lLCAmZmluZm8pID09IC0xKSB8fCAhU19JU0RJUihmaW5mby5zdF9tb2RlKSkgewotCXJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIkNvcmVEdW1wRGlyZWN0b3J5ICIsIGZuYW1lLCAKLQkJCSAgIiBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSBkaXJlY3RvcnkiLCBOVUxMKTsKLSAgICB9Ci0gICAgYXBfY3B5c3RybihhcF9jb3JlZHVtcF9kaXIsIGZuYW1lLCBzaXplb2YoYXBfY29yZWR1bXBfZGlyKSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbGlzdGVuYmFja2xvZyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykgCi17Ci0gICAgaW50IGI7Ci0KLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBiID0gYXRvaShhcmcpOwotICAgIGlmIChiIDwgMSkgewotICAgICAgICByZXR1cm4gIkxpc3RlbkJhY2tsb2cgbXVzdCBiZSA+IDAiOwotICAgIH0KLSAgICBhcF9saXN0ZW5iYWNrbG9nID0gYjsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9saXN0ZW5lcihjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmlwcykKLXsKLSAgICBsaXN0ZW5fcmVjICpuZXc7Ci0gICAgY2hhciAqcG9ydHM7Ci0gICAgdW5zaWduZWQgc2hvcnQgcG9ydDsKLQotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBvcnRzID0gc3RyY2hyKGlwcywgJzonKTsKLSAgICBpZiAocG9ydHMgIT0gTlVMTCkgewotCWlmIChwb3J0cyA9PSBpcHMpIHsKLQkgICAgcmV0dXJuICJNaXNzaW5nIElQIGFkZHJlc3MiOwotCX0KLQllbHNlIGlmIChwb3J0c1sxXSA9PSAnXDAnKSB7Ci0JICAgIHJldHVybiAiQWRkcmVzcyBtdXN0IGVuZCBpbiA6PHBvcnQtbnVtYmVyPiI7Ci0JfQotCSoocG9ydHMrKykgPSAnXDAnOwotICAgIH0KLSAgICBlbHNlIHsKLQlwb3J0cyA9IGlwczsKLSAgICB9Ci0KLSAgICBuZXc9YXBfcGNhbGxvYyhjbWQtPnBvb2wsIHNpemVvZihsaXN0ZW5fcmVjKSk7Ci0gICAgLyogWlpaIGxldCdzIHNldCB0aGlzIHVzaW5nIHRoZSBBUCBmdW5jcy4gKi8KLSAgICBuZXctPmxvY2FsX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgaWYgKHBvcnRzID09IGlwcykgeyAvKiBubyBhZGRyZXNzICovCi0gICAgICAvKiAgWlpaIEluaXRpYWxpemUgdGhlIE5ldHdvcmsgQWRkcmVzcyAqLwotCW5ldy0+bG9jYWxfYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JbmV3LT5sb2NhbF9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGFwX2dldF92aXJ0aG9zdF9hZGRyKGlwcywgTlVMTCk7Ci0gICAgfQotICAgIHBvcnQgPSBhdG9pKHBvcnRzKTsKLSAgICBpZiAoIXBvcnQpIHsKLQlyZXR1cm4gIlBvcnQgbXVzdCBiZSBudW1lcmljIjsKLSAgICB9Ci0gICAgLyogWlpaIGNoYW5nZSB0byBBUCBmdW5jcy4qLwotICAgIG5ldy0+bG9jYWxfYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwotICAgIG5ldy0+ZmQgPSAtMTsgICAgLypaWlogY2hhbmdlIHRvIE5VTEwgKi8KLSAgICBuZXctPnVzZWQgPSAwOwotICAgIG5ldy0+bmV4dCA9IGFwX2xpc3RlbmVyczsKLSAgICBhcF9saXN0ZW5lcnMgPSBuZXc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIHRoZXJlIGFyZSBubyB0aHJlYWRzIGluIHRoZSBwcmVmb3JrIG1vZGVsLCBzbyB0aGUgbXV0ZXhlcyBhcmUKLSAgIG5vcHMuICovCi0vKiBUT0RPOiBtYWtlIHRoZXNlICNkZWZpbmVzIHRvIGVsaW1pbmF0ZSB0aGUgZnVuY3Rpb24gY2FsbCAqLwotCi1zdHJ1Y3QgYXBfdGhyZWFkX211dGV4IHsKLSAgICBpbnQgZHVtbXk7Ci19OwotCi1BUElfRVhQT1JUKGFwX3RocmVhZF9tdXRleCAqKSBhcF90aHJlYWRfbXV0ZXhfbmV3KHZvaWQpCi17Ci0gICAgcmV0dXJuIG1hbGxvYyhzaXplb2YoYXBfdGhyZWFkX211dGV4KSk7Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfdGhyZWFkX211dGV4X2xvY2soYXBfdGhyZWFkX211dGV4ICptdHgpCi17Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfdGhyZWFkX211dGV4X3VubG9jayhhcF90aHJlYWRfbXV0ZXggKm10eCkKLXsKLX0KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF90aHJlYWRfbXV0ZXhfZGVzdHJveShhcF90aHJlYWRfbXV0ZXggKm10eCkKLXsKLSAgICBmcmVlKG10eCk7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIHByZWZvcmtfY21kc1tdID0gewotVU5JWF9EQUVNT05fQ09NTUFORFMKLXsgIlBpZEZpbGUiLCBzZXRfcGlkZmlsZSwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAiQSBmaWxlIGZvciBsb2dnaW5nIHRoZSBzZXJ2ZXIgcHJvY2VzcyBJRCJ9LAoteyAiU2NvcmVCb2FyZEZpbGUiLCBzZXRfc2NvcmVib2FyZCwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAiQSBmaWxlIGZvciBBcGFjaGUgdG8gbWFpbnRhaW4gcnVudGltZSBwcm9jZXNzIG1hbmFnZW1lbnQgaW5mb3JtYXRpb24ifSwKLXsgIkxvY2tGaWxlIiwgc2V0X2xvY2tmaWxlLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAgICJUaGUgbG9ja2ZpbGUgdXNlZCB3aGVuIEFwYWNoZSBuZWVkcyB0byBsb2NrIHRoZSBhY2NlcHQoKSBjYWxsIn0sCi17ICJTdGFydFNlcnZlcnMiLCBzZXRfZGFlbW9uc190b19zdGFydCwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIk51bWJlciBvZiBjaGlsZCBwcm9jZXNzZXMgbGF1bmNoZWQgYXQgc2VydmVyIHN0YXJ0dXAiIH0sCi17ICJNaW5TcGFyZVNlcnZlcnMiLCBzZXRfbWluX2ZyZWVfc2VydmVycywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIk1pbmltdW0gbnVtYmVyIG9mIGlkbGUgY2hpbGRyZW4sIHRvIGhhbmRsZSByZXF1ZXN0IHNwaWtlcyIgfSwKLXsgIk1heFNwYXJlU2VydmVycyIsIHNldF9tYXhfZnJlZV9zZXJ2ZXJzLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiTWF4aW11bSBudW1iZXIgb2YgaWRsZSBjaGlsZHJlbiIgfSwKLXsgIk1heENsaWVudHMiLCBzZXRfc2VydmVyX2xpbWl0LCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiTWF4aW11bSBudW1iZXIgb2YgY2hpbGRyZW4gYWxpdmUgYXQgdGhlIHNhbWUgdGltZSIgfSwKLXsgIk1heFJlcXVlc3RzUGVyQ2hpbGQiLCBzZXRfbWF4X3JlcXVlc3RzLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiTWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdHMgYSBwYXJ0aWN1bGFyIGNoaWxkIHNlcnZlcyBiZWZvcmUgZHlpbmcuIiB9LAoteyAiQ29yZUR1bXBEaXJlY3RvcnkiLCBzZXRfY29yZWR1bXBkaXIsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJUaGUgbG9jYXRpb24gb2YgdGhlIGRpcmVjdG9yeSBBcGFjaGUgY2hhbmdlcyB0byBiZWZvcmUgZHVtcGluZyBjb3JlIiB9LAoteyAiTGlzdGVuQmFja2xvZyIsIHNldF9saXN0ZW5iYWNrbG9nLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiTWF4aW11bSBsZW5ndGggb2YgdGhlIHF1ZXVlIG9mIHBlbmRpbmcgY29ubmVjdGlvbnMsIGFzIHVzZWQgYnkgbGlzdGVuKDIpIiB9LAoteyAiTGlzdGVuIiwgc2V0X2xpc3RlbmVyLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiQSBwb3J0IG51bWJlciBvciBhIG51bWVyaWMgSVAgYWRkcmVzcyBhbmQgYSBwb3J0IG51bWJlciJ9LAoteyBOVUxMIH0KLX07Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBtcG1fcHJlZm9ya19tb2R1bGUgPSB7Ci0gICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsCi0gICAgcHJlZm9ya19wcmVfY29tbWFuZF9saW5lLAkvKiBwcmVfY29tbWFuZF9saW5lICovCi0gICAgcHJlZm9ya19wcmVfY29uZmlnLAkJLyogcHJlX2NvbmZpZyAqLwotICAgIHByZWZvcmtfcG9zdF9jb25maWcsCS8qIHBvc3RfY29uZmlnICovCi0gICAgTlVMTCwJCQkvKiBvcGVuX2xvZ3MgKi8KLSAgICBOVUxMLCAJCQkvKiBjaGlsZF9pbml0ICovCi0gICAgTlVMTCwJCQkvKiBjcmVhdGUgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlICovCi0gICAgTlVMTCwJCQkvKiBtZXJnZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgTlVMTCwJCQkvKiBjcmVhdGUgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlICovCi0gICAgTlVMTCwJCQkvKiBtZXJnZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgcHJlZm9ya19jbWRzLAkJLyogY29tbWFuZCB0YWJsZSAqLwotICAgIE5VTEwsCQkJLyogaGFuZGxlcnMgKi8KLSAgICBOVUxMLAkJCS8qIHRyYW5zbGF0ZV9oYW5kbGVyICovCi0gICAgTlVMTCwJCQkvKiBjaGVja191c2VyX2lkICovCi0gICAgTlVMTCwJCQkvKiBjaGVjayBhdXRoICovCi0gICAgTlVMTCwJCQkvKiBjaGVjayBhY2Nlc3MgKi8KLSAgICBOVUxMLAkJCS8qIHR5cGVfY2hlY2tlciAqLwotICAgIE5VTEwsCQkJLyogcHJlLXJ1biBmaXh1cHMgKi8KLSAgICBOVUxMLAkJCS8qIGxvZ2dlciAqLwotICAgIE5VTEwsCQkJLyogaGVhZGVyIHBhcnNlciAqLwotICAgIE5VTEwJCQkvKiBwb3N0X3JlYWRfcmVxdWVzdCAqLwotfTsKZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vd2lubnQvV2luOXhDb25Ib29rLmMgYi9zZXJ2ZXIvbXBtL3dpbm50L1dpbjl4Q29uSG9vay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjEyMjRhLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vd2lubnQvV2luOXhDb25Ib29rLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTcgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0yMDAwIFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0KLS8qCi0gKiBXaW45eENvbkhvb2suZGxsIC0gYSBob29rIHByb2MgdG8gY2xlYW4gdXAgV2luOTUvOTggY29uc29sZSBiZWhhdmlvci4KLSAqCi0gKiBJdCBpcyB3ZWxsKD8pIGRvY3VtZW50ZWQgYnkgTWljcm9zb2Z0IHRoYXQgdGhlIFdpbjl4IEhhbmRsZXJSb3V0aW5lCi0gKiBob29rZWQgYnkgdGhlIFNldENvbnNvbGVDdHJsSGFuZGxlciBuZXZlciByZWNlaXZlcyB0aGUgQ1RSTF9DTE9TRV9FVkVOVCwKLSAqIENUUkxfTE9HT0ZGX0VWRU5UIG9yIENUUkxfU0hVVERPV05fRVZFTlQgc2lnbmFscy4gIAotICoKLSAqIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYSBzZWNvbmQgd2luZG93IHRvIG1vbml0b3IgdGhlIFdNX0VORFNFU1NJT04gCi0gKiBtZXNzYWdlLCBidXQgdGhlIGNsb3NlIGJ1dHRvbiBzdGlsbCBmYWlscy4uCi0gKiAKLSAqIFRoZXJlIGlzIGEgMTZiaXQgcG9sbGluZyBtZXRob2QgZm9yIHRoZSBjbG9zZSB3aW5kb3cgb3B0aW9uLCBidXQgdGhpcwotICogaXMgQ1BVIGludGVuc2l2ZSBhbmQgcmVxdWlyZXMgdGh1bmtpbmcuCi0gKgotICogQXR0ZW1wdHMgdG8gc3ViY2xhc3MgdGhlICd0dHknIGNvbnNvbGUgZmFpbCwgc2luY2UgdGhhdCBtZXNzYWdlIHRocmVhZAotICogaXMgYWN0dWFsbHkgb3duZWQgYnkgdGhlIDE2IGJpdCB3aW5vbGRhcC5tb2QgcHJvY2VzcywgYWx0aG91Z2ggdGhlIAotICogd2luZG93IHJlcG9ydHMgaXQgaXMgb3duZWQgYnkgdGhlIHByb2Nlc3MvdGhyZWFkIG9mIHRoZSBjb25zb2xlIGFwcC4KLSAqCi0gKiBXaW45eENvbkhvb2sgaXMgdGh1bmtzIHRoZSBXTV9DTE9TRSBhbmQgV01fRU5EU0VTU0lPTiBtZXNzYWdlcywKLSAqIGZpcnN0IHRocm91Z2ggYSB3aW5kb3cgaG9vayBwcm9jZWR1cmUgaW4gdGhlIHdpbm9sZGFwIGNvbnRleHQsIGludG8KLSAqIGEgc3ViY2xhc3MgV25kUHJvYywgYW5kIG9uIHRvIGEgc2Vjb25kIGhpZGRlbiBtb25pdG9yIHdpbmRvdyBpbiB0aGUKLSAqIGNvbnNvbGUgYXBwbGljYXRpb24ncyBjb250ZXh0IHRoYXQgZGlzcGF0Y2hlcyB0aGVtIHRvIHRoZSBjb25zb2xlIGFwcCdzCi0gKiByZWdpc3RlcmVkIEhhbmRsZXJSb3V0aW5lLgotICovCi0KLSNkZWZpbmUgREJHIDEKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotLyoKLSAqICBpc190dHkgZmxhZ3MgdGhpcyBwcm9jZXNzOyAgLTEgPT0gdW5rbm93biwgMSA9PSBpZiB0dHksIDAgPT0gaWYgbm90Ci0gKiAgaHdfdHR5IGlzIHRoZSBoYW5kbGUgb2YgdGhlIHRvcCBsZXZlbCB0dHkgaW4gdGhpcyBwcm9jZXNzIGNvbnRleHQKLSAqICBpc19zdWJjbGFzc2VkIGlzIHRvZ2dsZWQgdG8gYXNzdXJlIERsbE1haW4gcmVtb3ZlcyB0aGUgc3ViY2xhc3MKLSAqICBpc19ob29rZWQgaXMgdG9nZ2xlZCB0byBhc3N1cmUgRGxsTWFpbiByZW1vdmVzIHRoZSBzdWJjbGFzcwotICovCi1zdGF0aWMgaW50IGlzX3R0eSA9IC0xOwotc3RhdGljIEhXTkQgaHd0dHkgPSBOVUxMOwotc3RhdGljIEJPT0wgaXNfc3ViY2xhc3NlZCA9IDA7Ci0KLXN0YXRpYyBITU9EVUxFIGhtb2RIb29rID0gTlVMTDsKLXN0YXRpYyBISE9PSyBoaGtHZXRNZXNzYWdlOwotLy9zdGF0aWMgSEhPT0sgaGhrQ2FsbFduZFByb2M7Ci0KLXN0YXRpYyBMUENUU1RSIG9yaWd3bmRwcm9wID0gTlVMTDsKLXN0YXRpYyBMUENUU1RSIGhvb2t3bmRwcm9wID0gTlVMTDsKLQotI2lmZGVmIERCRwotc3RhdGljIFZPSUQgRGJnUHJpbnRmKExQVFNUUiBmbXQsIC4uLik7Ci0jZW5kaWYKLQotc3RhdGljIEJPT0wgQ0FMTEJBQ0sgRW51bXR0eVdpbmRvdyhIV05EIHduZCwgTFBBUkFNIHJldHduZCk7Ci0KLQotQk9PTCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgQVBJRU5UUlkgRGxsTWFpbihQVk9JRCBoTW9kdWxlLCBVTE9ORyB1bFJlYXNvbiwgUENPTlRFWFQgcGN0eCkKLXsKLSAgICBpZiAodWxSZWFzb24gPT0gRExMX1BST0NFU1NfQVRUQUNIKSAKLSAgICB7Ci0jaWZkZWYgREJHCi0gICAgICAgIERiZ1ByaW50ZigiSCBQcm9jZXNzQXR0YWNoOiU4Ljh4XHJcbiIsIEdldEN1cnJlbnRQcm9jZXNzSWQoKSk7Ci0jZW5kaWYKLSAgICAgICAgb3JpZ3duZHByb3AgPSBNQUtFSU5UQVRPTShHbG9iYWxBZGRBdG9tKCJXaW45eENvbkhvb2tPcmlnUHJvYyIpKTsKLSAgICAgICAgaG9va3duZHByb3AgPSBNQUtFSU5UQVRPTShHbG9iYWxBZGRBdG9tKCJXaW45eENvbkhvb2tUaHVua1duZCIpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIHVsUmVhc29uID09IERMTF9QUk9DRVNTX0RFVEFDSCApIAotICAgIHsKLSAgICAgICAgSFdORCBwYXJlbnQ7Ci0jaWZkZWYgREJHCi0gICAgICAgIERiZ1ByaW50ZigiSCBQcm9jZXNzRGV0YWNoOiU4Ljh4XHJcbiIsIEdldEN1cnJlbnRQcm9jZXNzSWQoKSk7ICAgICAgICAgICAgICAgIAotI2VuZGlmCi0gICAgICAgIGlmIChpc19zdWJjbGFzc2VkKSB7Ci0gICAgICAgICAgICBXTkRQUk9DIG9yaWdwcm9jID0gKFdORFBST0MpIEdldFByb3AoaHd0dHksIG9yaWd3bmRwcm9wKTsKLSAgICAgICAgICAgIGlmIChvcmlncHJvYykgewotICAgICAgICAgICAgICAgIFNldFdpbmRvd0xvbmcoaHd0dHksIEdXTF9XTkRQUk9DLCAoTE9ORylvcmlncHJvYyk7Ci0gICAgICAgICAgICAgICAgUmVtb3ZlUHJvcChod3R0eSwgb3JpZ3duZHByb3ApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEVudW1XaW5kb3dzKEVudW10dHlXaW5kb3csIChMUEFSQU0pJnBhcmVudCk7Ci0gICAgICAgIGlmIChwYXJlbnQpIHsKLSAgICAgICAgICAgIEhXTkQgY2hpbGQgPSAoSFdORClHZXRQcm9wKHBhcmVudCwgaG9va3duZHByb3ApOwotICAgICAgICAgICAgaWYgKGNoaWxkKQotICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlKGNoaWxkLCBXTV9ERVNUUk9ZLCAwLCAwKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaG1vZEhvb2spCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChoaGtHZXRNZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgVW5ob29rV2luZG93c0hvb2tFeChoaGtHZXRNZXNzYWdlKTsKLSAgICAgICAgICAgICAgICBoaGtHZXRNZXNzYWdlID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZyZWVMaWJyYXJ5KGhtb2RIb29rKTsKLSAgICAgICAgICAgIGhtb2RIb29rID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBHbG9iYWxEZWxldGVBdG9tKChBVE9NKW9yaWd3bmRwcm9wKTsKLSAgICAgICAgR2xvYmFsRGVsZXRlQXRvbSgoQVRPTSlob29rd25kcHJvcCk7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBQSEFORExFUl9ST1VUSU5FIHBoYW5kbGVyOwotICAgIEhJTlNUQU5DRSBpbnN0YW5jZTsKLSAgICBIV05EIHBhcmVudDsKLX0gdHR5X2luZm87Ci0KLQotI2RlZmluZSBnd2x0dHlfcGhhbmRsZXIgMAotI2RlZmluZSBnd2x0dHlfdHR5d25kIDQKLQotLyogVGhpcyBpcyB0aGUgV25kUHJvYyBwcm9jZWR1cmUgZm9yIG91ciBpbnZpc2libGUgd2luZG93LgotICogV2hlbiBvdXIgdHR5IHN1YmNsYXNzIFduZFByb2MgcmVjaWV2ZXMgdGhlIFdNX0NMT1NFLCAKLSAqIG9yIFdNX1FVRVJZRU5EU0VTU0lPTiBtZXNzYWdlcywgd2UgY2FsbCB0aGUgaW5zdGFsbGVkCi0gKiBIYW5kbGVyUm91dGluZSB0aGF0IHdhcyByZWdpc3RlcmVkIHdpdGggCi0gKiBJZiBhIHVzZXIgbG9ncyBvZmYsIHRoZSB3aW5kb3cgaXMgc2VudCBXTV9RVUVSWUVORFNFU1NJT04gCi0gKiBhcyB3ZWxsLCBidXQgd2l0aCBsUGFyYW0gIT0gMC4gV2UgaWdub3JlIHRoaXMgY2FzZS4KLSAqLwotTFJFU1VMVCBDQUxMQkFDSyB0dHlDb25zb2xlQ3RybFduZFByb2MoSFdORCBod25kLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsKLSAgICBpZiAobXNnID09IFdNX0NSRUFURSkKLSAgICB7Ci0gICAgICAgIHR0eV9pbmZvICp0dHkgPSAodHR5X2luZm8qKSgoKExQQ1JFQVRFU1RSVUNUKWxQYXJhbSktPmxwQ3JlYXRlUGFyYW1zKTsKLSAgICAgICAgU2V0V2luZG93TG9uZyhod25kLCBnd2x0dHlfcGhhbmRsZXIsIChMT05HKXR0eS0+cGhhbmRsZXIpOwotICAgICAgICBTZXRXaW5kb3dMb25nKGh3bmQsIGd3bHR0eV90dHl3bmQsIChMT05HKXR0eS0+cGFyZW50KTsKLSNpZmRlZiBEQkcKLSAgICAgICAgRGJnUHJpbnRmKCJTIENyZWF0ZWQgdHR5Q29uSG9va0NoaWxkOiU4Ljh4XHJcbiIsIGh3bmQpOwotI2VuZGlmCi0gICAgICAgIFNldFByb3AoKCh0dHlfaW5mbyopdHR5KS0+cGFyZW50LCBob29rd25kcHJvcCwgaHduZCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBlbHNlIGlmIChtc2cgPT0gV01fREVTVFJPWSkKLSAgICB7Ci0gICAgICAgIEhXTkQgcGFyZW50ID0gKEhXTkQpR2V0V2luZG93TG9uZyhod25kLCBnd2x0dHlfdHR5d25kKTsKLSAgICAgICAgUmVtb3ZlUHJvcChwYXJlbnQsIGhvb2t3bmRwcm9wKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobXNnID09IFdNX0NMT1NFKQotICAgIHsKLSAgICAgICAgUEhBTkRMRVJfUk9VVElORSBwaGFuZGxlciA9IAotICAgICAgICAgICAgKFBIQU5ETEVSX1JPVVRJTkUpR2V0V2luZG93TG9uZyhod25kLCBnd2x0dHlfcGhhbmRsZXIpOwotI2lmZGVmIERCRwotICAgICAgICBEYmdQcmludGYoIlMgSW52b2tpbmcgQ1RSTF9DTE9TRV9FVkVOVDolOC44eFxyXG4iLAotICAgICAgICAgICAgICAgICAgR2V0Q3VycmVudFByb2Nlc3NJZCgpKTsKLSNlbmRpZgotICAgICAgICByZXR1cm4gIXBoYW5kbGVyKENUUkxfQ0xPU0VfRVZFTlQpOwotICAgIH0KLSAgICBlbHNlIGlmIChtc2cgPT0gV01fUVVFUllFTkRTRVNTSU9OKQotICAgIHsKLSAgICAgICAgaWYgKGxQYXJhbSAmIEVORFNFU1NJT05fTE9HT0ZGKSAKLSAgICAgICAgewotICAgICAgICAgICAgUEhBTkRMRVJfUk9VVElORSBwaGFuZGxlciA9IAotICAgICAgICAgICAgICAgIChQSEFORExFUl9ST1VUSU5FKUdldFdpbmRvd0xvbmcoaHduZCwgZ3dsdHR5X3BoYW5kbGVyKTsKLSNpZmRlZiBEQkcKLSAgICAgICAgICAgIERiZ1ByaW50ZigiUyBJbnZva2luZyBDVFJMX0xPR09GRl9FVkVOVDolOC44eFxyXG4iLAotICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRQcm9jZXNzSWQoKSk7Ci0jZW5kaWYKLSAgICAgICAgICAgIHJldHVybiAhcGhhbmRsZXIoQ1RSTF9MT0dPRkZfRVZFTlQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgUEhBTkRMRVJfUk9VVElORSBwaGFuZGxlciA9IAotICAgICAgICAgICAgICAgIChQSEFORExFUl9ST1VUSU5FKUdldFdpbmRvd0xvbmcoaHduZCwgZ3dsdHR5X3BoYW5kbGVyKTsKLSNpZmRlZiBEQkcKLSAgICAgICAgICAgIERiZ1ByaW50ZigiUyBJbnZva2luZyBDVFJMX1NIVVRET1dOX0VWRU5UOiU4Ljh4XHJcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgR2V0Q3VycmVudFByb2Nlc3NJZCgpKTsKLSNlbmRpZgotICAgICAgICAgICAgcmV0dXJuICFwaGFuZGxlcihDVFJMX1NIVVRET1dOX0VWRU5UKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKERlZldpbmRvd1Byb2MoaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSkpOwotfQotCi0KLURXT1JEIFdJTkFQSSB0dHlDb25zb2xlQ3RybFRocmVhZChMUFZPSUQgdHR5KQotewotICAgIC8qIFdoZW4gcnVubmluZyBhcyBhIHNlcnZpY2UgdW5kZXIgV2luZG93cyA5eCwgQ29uc29sZUN0cmxIYW5kbGVyIAotICAgICAqIGRvZXMgbm90IHJlc3BvbmQgcHJvcGVybHkgd2hlbiB0aGUgdXNlciBsb2dzIG9mZiBvciB0aGUgc3lzdGVtIAotICAgICAqIGlzIHNodXRkb3duLiAgSWYgdGhlIFdhdGNoV2luZG93IHRocmVhZCBpcyBjcmVhdGVkIHdpdGggYSBOVUxMCi0gICAgICogc2VydmljZV9uYW1lIGFyZ3VtZW50LCB0aGVuIHRoZSAuLi5TeXN0ZW1Nb25pdG9yIHdpbmRvdyBjbGFzcyBpcwotICAgICAqIHVzZWQgdG8gY3JlYXRlIHRoZSAiQXBhY2hlIiB3aW5kb3cgdG8gd2F0Y2ggZm9yIGxvZ29mZiBhbmQgc2h1dGRvd24uCi0gICAgICogSWYgdGhlIHNlcnZpY2VfbmFtZSBpcyBwcm92aWRlZCwgdGhlIC4uLlNlcnZpY2VNb25pdG9yIHdpbmRvdyBjbGFzcwotICAgICAqIGlzIHVzZWQgdG8gY3JlYXRlIHRoZSB3aW5kb3cgbmFtZWQgYnkgdGhlIHNlcnZpY2VfbmFtZSBhcmd1bWVudCwKLSAgICAgKiBhbmQgdGhlIGxvZ29mZiBtZXNzYWdlIGlzIGlnbm9yZWQuCi0gICAgICovCi0gICAgV05EQ0xBU1Mgd2M7Ci0gICAgSFdORCBod25kOwotICAgIE1TRyBtc2c7Ci0gICAgd2Muc3R5bGUgICAgICAgICA9IENTX0dMT0JBTENMQVNTOwotICAgIHdjLmxwZm5XbmRQcm9jICAgPSB0dHlDb25zb2xlQ3RybFduZFByb2M7IAotICAgIHdjLmNiQ2xzRXh0cmEgICAgPSAwOwotICAgIHdjLmNiV25kRXh0cmEgICAgPSA4OyAKLSAgICB3Yy5oSW5zdGFuY2UgICAgID0gTlVMTDsKLSAgICB3Yy5oSWNvbiAgICAgICAgID0gTlVMTDsKLSAgICB3Yy5oQ3Vyc29yICAgICAgID0gTlVMTDsKLSAgICB3Yy5oYnJCYWNrZ3JvdW5kID0gTlVMTDsKLSAgICB3Yy5scHN6TWVudU5hbWUgID0gTlVMTDsKLSAgICB3Yy5scHN6Q2xhc3NOYW1lID0gInR0eUNvbkhvb2tDaGlsZCI7Ci0gICAgCi0gICAgaWYgKCFSZWdpc3RlckNsYXNzKCZ3YykpIHsgCi0jaWZkZWYgREJHCi0gICAgICAgIERiZ1ByaW50ZigiUyBDcmVhdGVkIHR0eUNvbkhvb2tDaGlsZCBjbGFzc1xyXG4iKTsKLSNlbmRpZgotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBDcmVhdGUgYW4gaW52aXNpYmxlIHdpbmRvdyAqLwotICAgIGh3bmQgPSBDcmVhdGVXaW5kb3cod2MubHBzekNsYXNzTmFtZSwgIiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgV1NfT1ZFUkxBUFBFRCAmIH5XU19WSVNJQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgQ1dfVVNFREVGQVVMVCwgQ1dfVVNFREVGQVVMVCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBDV19VU0VERUZBVUxULCBDV19VU0VERUZBVUxULCAKLSAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgICAgKCh0dHlfaW5mbyopdHR5KS0+aW5zdGFuY2UsIHR0eSk7Ci0KLSAgICBpZiAoIWh3bmQpIHsKLSNpZmRlZiBEQkcKLSAgICAgICAgRGJnUHJpbnRmKCJTIEVycm9yIENyZWF0aW5nIHR0eUNvbkhvb2tDaGlsZDolZFxyXG4iLCBHZXRMYXN0RXJyb3IoKSk7Ci0jZW5kaWYKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgd2hpbGUgKEdldE1lc3NhZ2UoJm1zZywgTlVMTCwgMCwgMCkpIAotICAgIHsKLSAgICAgICAgVHJhbnNsYXRlTWVzc2FnZSgmbXNnKTsKLSAgICAgICAgRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOwotICAgICAgICBpZiAobXNnLm1lc3NhZ2UgPT0gV01fREVTVFJPWSkKLSAgICAgICAgICAgIERlc3Ryb3lXaW5kb3coaHduZCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0KLS8qIAotICogVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIHdoZW4gdGhpcyBwcm9jZXNzIGlzIHRoZSBhY3RpdmUgcHJvY2VzcyAKLSAqIChlLmcuIG9uY2UgaXQgaXMgcnVubmluZyBhIGNoaWxkIHByb2Nlc3MsIGl0IGNhbiBubyBsb25nZXIgZGV0ZXJtaW5lIAotICogd2hpY2ggY29uc29sZSB3aW5kb3cgaXMgaXRzIG93bi4pCi0gKi8KLXN0YXRpYyBCT09MIENBTExCQUNLIEVudW10dHlXaW5kb3coSFdORCB3bmQsIExQQVJBTSByZXR3bmQpCi17Ci0gICAgY2hhciB0bXBbNF07Ci0gICAgaWYgKEdldENsYXNzTmFtZSh3bmQsIHRtcCwgc2l6ZW9mKHRtcCkpICYmICFzdHJjbXAodG1wLCAidHR5IikpIAotICAgIHsKLSAgICAgICAgRFdPUkQgd25kcHJvYywgdGhpc3Byb2MgPSBHZXRDdXJyZW50UHJvY2Vzc0lkKCk7Ci0gICAgICAgIEdldFdpbmRvd1RocmVhZFByb2Nlc3NJZCh3bmQsICZ3bmRwcm9jKTsKLSAgICAgICAgaWYgKHduZHByb2MgPT0gdGhpc3Byb2MpIHsKLSAgICAgICAgICAgICooKEhXTkQqKXJldHduZCkgPSB3bmQ7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIEV4cG9ydGVkIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgZml4dXAgY2hpbGQgd2luZG93IGFuZCBkaXNwYXRjaAotICovCi1CT09MIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBXSU5BUEkgRml4Q29uc29sZUN0cmxIYW5kbGVyKAotICAgICAgICBQSEFORExFUl9ST1VUSU5FIHBoYW5kbGVyLAotICAgICAgICBCT09MIGFkZCkKLXsKLSAgICBIV05EIHBhcmVudDsKLSAgICBFbnVtV2luZG93cyhFbnVtdHR5V2luZG93LCAoTFBBUkFNKSZwYXJlbnQpOwotCi0gICAgaWYgKCFwYXJlbnQpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIGlmIChhZGQpCi0gICAgewotICAgICAgICBIQU5ETEUgaFRocmVhZDsKLSAgICAgICAgRFdPUkQgdGlkOwotICAgICAgICBzdGF0aWMgdHR5X2luZm8gdHR5OwotICAgICAgICB0dHkucGhhbmRsZXIgPSBwaGFuZGxlcjsKLSAgICAgICAgdHR5LnBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgdHR5Lmluc3RhbmNlID0gR2V0TW9kdWxlSGFuZGxlKE5VTEwpOwotCi0gICAgICAgIGhtb2RIb29rID0gTG9hZExpYnJhcnkoIldpbjl4Q29uSG9vay5kbGwiKTsKLSAgICAgICAgaWYgKGhtb2RIb29rKQotICAgICAgICB7Ci0gICAgICAgICAgICBoaGtHZXRNZXNzYWdlID0gU2V0V2luZG93c0hvb2tFeChXSF9HRVRNRVNTQUdFLAotICAgICAgICAgICAgICAgIChIT09LUFJPQylHZXRQcm9jQWRkcmVzcyhobW9kSG9vaywgIkdldE1zZ1Byb2MiKSwgaG1vZEhvb2ssIDApOwotICAgICAgICAgICAgLy9oaGtDYWxsV25kUHJvYyA9IFNldFdpbmRvd3NIb29rRXgoV0hfQ0FMTFdORFBST0MsCi0gICAgICAgICAgICAvLyAgICAoSE9PS1BST0MpR2V0UHJvY0FkZHJlc3MoaG1vZEhvb2ssICJDYWxsV25kUHJvYyIpLCBobW9kSG9vaywgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGhUaHJlYWQgPSBDcmVhdGVUaHJlYWQoTlVMTCwgMCwgdHR5Q29uc29sZUN0cmxUaHJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRCkmdHR5LCAwLCAmdGlkKTsKLSAgICAgICAgaWYgKGhUaHJlYWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENsb3NlSGFuZGxlKGhUaHJlYWQpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvKiByZW1vdmUgKi8KLSAgICB7Ci0gICAgICAgIEhXTkQgY2hpbGQgPSBGaW5kV2luZG93RXgocGFyZW50LCBOVUxMLCAidHR5Q29uSG9va0NoaWxkIiwgTlVMTCk7Ci0gICAgICAgIGlmIChjaGlsZCkKLSAgICAgICAgICAgIFNlbmRNZXNzYWdlKGNoaWxkLCBXTV9ERVNUUk9ZLCAwLCAwKTsKLSAgICAgICAgaWYgKGhtb2RIb29rKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaGhrR2V0TWVzc2FnZSkgewotICAgICAgICAgICAgICAgIFVuaG9va1dpbmRvd3NIb29rRXgoaGhrR2V0TWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgaGhrR2V0TWVzc2FnZSA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGcmVlTGlicmFyeShobW9kSG9vayk7Ci0gICAgICAgICAgICBobW9kSG9vayA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotCi0vKgotICogU3ViY2xhc3MgbWVzc2FnZSBwcm9jZXNzIGZvciB0aGUgdHR5IHdpbmRvdwotICovCi1MUkVTVUxUIENBTExCQUNLIFduZFByb2MoSFdORCBod25kLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsKLSAgICBXTkRQUk9DIG9yaWdwcm9jID0gKFdORFBST0MpIEdldFByb3AoaHduZCwgb3JpZ3duZHByb3ApOwotICAgIGlmICghb3JpZ3Byb2MpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgc3dpdGNoIChtc2cpCi0gICAgewotICAgICAgICBjYXNlIFdNX05DREVTVFJPWToKLSNpZmRlZiBEQkcKLSAgICAgICAgICAgIERiZ1ByaW50ZigiVyBQcm9jICUwOHggaHduZDolMDh4IFN1YmNsYXNzIHJlbW92ZWRcclxuIiwgCi0gICAgICAgICAgICAgICAgICAgICAgR2V0Q3VycmVudFByb2Nlc3NJZCgpLCBod25kKTsKLSNlbmRpZgotICAgICAgICAgICAgaXNfc3ViY2xhc3NlZCA9IEZBTFNFOwotICAgICAgICAgICAgU2V0V2luZG93TG9uZyhod25kLCBHV0xfV05EUFJPQywgKExPTkcpb3JpZ3Byb2MpOwotICAgICAgICAgICAgUmVtb3ZlUHJvcChod25kLCBvcmlnd25kcHJvcCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFdNX0NMT1NFOgotICAgICAgICBjYXNlIFdNX0VORFNFU1NJT046Ci0gICAgICAgIGNhc2UgV01fUVVFUllFTkRTRVNTSU9OOgotICAgICAgICB7Ci0gICAgICAgICAgICBIV05EIGNoaWxkID0gKEhXTkQpR2V0UHJvcChod25kLCBob29rd25kcHJvcCk7Ci0jaWZkZWYgREJHCi0gICAgICAgICAgICBEYmdQcmludGYoIlcgUHJvYyAlMDh4IGh3bmQ6JTA4eCBtc2c6JWRcclxuIiwgCi0gICAgICAgICAgICAgICAgICAgICAgR2V0Q3VycmVudFByb2Nlc3NJZCgpLCBod25kLCBtc2cpOwotI2VuZGlmCi0gICAgICAgICAgICBpZiAoIWNoaWxkKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgcmV0dXJuIFNlbmRNZXNzYWdlKGNoaWxkLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQ2FsbFdpbmRvd1Byb2Mob3JpZ3Byb2MsIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOwotfQotCi0KLWludCBIb29rUHJvYyhpbnQgaGMsIEhXTkQgKmh3bmQsIFVJTlQgKm1zZywgV1BBUkFNICp3UGFyYW0sIExQQVJBTSAqbFBhcmFtKQotewotICAgIGlmIChpc190dHkgPT0gLTEgJiYgKmh3bmQpIAotICAgIHsKLSAgICAgICAgY2hhciB0dHlidWZbNF07Ci0gICAgICAgIEhXTkQgaHR0eTsKLSAgICAgICAgaHd0dHkgPSAqaHduZDsKLSAgICAgICAgd2hpbGUgKGh0dHkgPSBHZXRQYXJlbnQoaHd0dHkpKQotICAgICAgICAgICAgaHd0dHkgPSBodHR5OwotICAgICAgICBpc190dHkgPSAoR2V0Q2xhc3NOYW1lKGh3dHR5LCB0dHlidWYsIHNpemVvZih0dHlidWYpKSAKLSAgICAgICAgICAgICAgICAgICYmICFzdHJjbXAodHR5YnVmLCAidHR5IikpOwotICAgICAgICBpZiAoaXNfdHR5KQotICAgICAgICB7Ci0gICAgICAgICAgICBXTkRQUk9DIG9yaWdwcm9jID0gKFdORFBST0MpR2V0V2luZG93TG9uZyhod3R0eSwgR1dMX1dORFBST0MpOwotICAgICAgICAgICAgU2V0UHJvcChod3R0eSwgb3JpZ3duZHByb3AsIG9yaWdwcm9jKTsKLSAgICAgICAgICAgIFNldFdpbmRvd0xvbmcoaHd0dHksIEdXTF9XTkRQUk9DLCAoTE9ORylXbmRQcm9jKTsKLSAgICAgICAgICAgIGlzX3N1YmNsYXNzZWQgPSBUUlVFOwotI2lmZGVmIERCRwotICAgICAgICAgICAgRGJnUHJpbnRmKCJXIFByb2MgJTA4eCBod25kOiUwOHggU3ViY2xhc3NlZFxyXG4iLCAKLSAgICAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50UHJvY2Vzc0lkKCksIGh3dHR5KTsKLSNlbmRpZgotICAgICAgICB9Ci0jaWZkZWYgREJHCi0gICAgICAgIERiZ1ByaW50ZigiSCBQcm9jICUwOHggJXMgJTA4eFxyXG4iLCBHZXRDdXJyZW50UHJvY2Vzc0lkKCksIAotICAgICAgICAgICAgICAgICAgaXNfdHR5ID8gInRyYWNraW5nIiA6ICJpZ25vcmluZyIsIGh3dHR5KTsKLSNlbmRpZgotICAgIH0KLQotICAgIGlmIChoYyA+PSAwICYmIGlzX3R0eSAmJiAqaHduZCA9PSBod3R0eSkKLSAgICB7Ci0gICAgICAgIGlmICgoKm1zZyA9PSBXTV9DTE9TRSkKLSAgICAgICAgIHx8ICgqbXNnID09IFdNX0VORFNFU1NJT04pKSB7Ci0gICAgICAgICAgICBEV09SRCBhcHBwaWQsIHR0eXBpZCA9IEdldEN1cnJlbnRQcm9jZXNzSWQoKTsKLSAgICAgICAgICAgIEdldFdpbmRvd1RocmVhZFByb2Nlc3NJZCgqaHduZCwgJmFwcHBpZCk7Ci0jaWZkZWYgREJHCi0gICAgICAgICAgICBEYmdQcmludGYoIkggUHJvYyAlMDh4IGh3bmQ6JTA4eCBvd25lZCBieSAlMDh4IG1zZzolZFxyXG4iLCB0dHlwaWQsICpod25kLCBhcHBwaWQsICptc2cpOwotI2VuZGlmCi0gICAgICAgICAgICAvLyptc2cgPSBXTV9OVUxMOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEV4cGVyaW1lbnRhbCwgcmV0dXJuIDAgb3IgMSB3aWxsIGJ5cGFzcyB0aGUgbmV4dCBob29rIGFuZCByZXR1cm4gdGhhdAotICAgICAgICAgICAgICogdmFsdWUgZnJvbSB0aGUgaG9vayBwcm9jZWR1cmUsIC0xIGNvbnRpbnVlcyB0byBjYWxsIHRoZSBuZXh0IGhvb2suCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLQotLyoKLSAqIFBvc3RNZXNzYWdlIEhvb2s6Ci0gKi8KLUxSRVNVTFQgX19kZWNsc3BlYyhkbGxleHBvcnQpIENBTExCQUNLIEdldE1zZ1Byb2MoSU5UIGhjLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotICAgIFBNU0cgcG1zZzsKLQotICAgIHBtc2cgPSAoUE1TRylsUGFyYW07Ci0KLSAgICBpZiAocG1zZykgewotICAgICAgICBpbnQgcnYgPSBIb29rUHJvYyhoYywgJnBtc2ctPmh3bmQsICZwbXNnLT5tZXNzYWdlLCAmcG1zZy0+bFBhcmFtLCAmcG1zZy0+d1BhcmFtKTsKLSAgICAgICAgaWYgKHJ2ICE9IC0xKQotICAgICAgICAgICAgcmV0dXJuIHJ2OwotICAgIH0KLSAgICAvKiAKLSAgICAgKiBDYWxsTmV4dEhvb2tFeCBhcHBhcmVudGx5IGlnbm9yZXMgdGhlIGhob29rIGFyZ3VtZW50LCBzbyBwYXNzIE5VTEwKLSAgICAgKi8KLSAgICByZXR1cm4gQ2FsbE5leHRIb29rRXgoTlVMTCwgaGMsIHdQYXJhbSwgbFBhcmFtKTsKLX0KLQotCi0vKgotICogU2VuZE1lc3NhZ2UgSG9vazoKLSAqLwotTFJFU1VMVCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgQ0FMTEJBQ0sgQ2FsbFduZFByb2MoSU5UIGhjLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotICAgIFBDV1BTVFJVQ1QgcGN3cHMgPSAoUENXUFNUUlVDVClsUGFyYW07Ci0gICAgCi0gICAgaWYgKHBjd3BzKSB7Ci0gICAgICAgIGludCBydiA9IEhvb2tQcm9jKGhjLCAmcGN3cHMtPmh3bmQsICZwY3dwcy0+bWVzc2FnZSwgJnBjd3BzLT53UGFyYW0sICZwY3dwcy0+bFBhcmFtKTsKLSAgICAgICAgaWYgKHJ2ICE9IC0xKQotICAgICAgICAgICAgcmV0dXJuIHJ2OwotICAgIH0KLSAgICAvKiAKLSAgICAgKiBDYWxsTmV4dEhvb2tFeCBhcHBhcmVudGx5IGlnbm9yZXMgdGhlIGhob29rIGFyZ3VtZW50LCBzbyBwYXNzIE5VTEwKLSAgICAgKi8KLSAgICByZXR1cm4gQ2FsbE5leHRIb29rRXgoTlVMTCwgaGMsIHdQYXJhbSwgbFBhcmFtKTsKLX0KLQotCi0jaWZkZWYgREJHCi1WT0lEIERiZ1ByaW50ZigKLSAgICBMUFRTVFIgZm10LAotICAgIC4uLgotICAgICkKLXsKLSAgICB2YV9saXN0IG1hcmtlcjsKLSAgICBUQ0hBUiBzekJ1ZlsyNTZdOwotICAgIERXT1JEIHQ7Ci0gICAgSEFORExFIGdEYmdPdXQ7Ci0KLSAgICB2YV9zdGFydChtYXJrZXIsIGZtdCk7Ci0gICAgd3ZzcHJpbnRmKHN6QnVmLCBmbXQsIG1hcmtlcik7Ci0gICAgdmFfZW5kKG1hcmtlcik7Ci0KLSAgICBnRGJnT3V0ID0gQ3JlYXRlRmlsZSgiQ09NMSIsIEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEUsIAotICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgT1BFTl9FWElTVElORywgRklMRV9GTEFHX1dSSVRFX1RIUk9VR0gsIE5VTEwpOwotICAgIFdyaXRlRmlsZShnRGJnT3V0LCBzekJ1Ziwgc3RybGVuKHN6QnVmKSwgJnQsIE5VTEwpOwotICAgIENsb3NlSGFuZGxlKGdEYmdPdXQpOwotfQotI2VuZGlmCi0KLQpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS93aW5udC9XaW45eENvbkhvb2suZGVmIGIvc2VydmVyL21wbS93aW5udC9XaW45eENvbkhvb2suZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODllYjc1Li4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vd2lubnQvV2luOXhDb25Ib29rLmRlZgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTElCUkFSWSBXaW45eENvbkhvb2sKLQotRVhFVFlQRSBXSU5ET1dTCi0KLUVYUE9SVFMKLSAgICBEbGxNYWluCi0gICAgR2V0TXNnUHJvYwotICAgIENhbGxXbmRQcm9jCi0gICAgRml4Q29uc29sZUN0cmxIYW5kbGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS93aW5udC9XaW45eENvbkhvb2suZHNwIGIvc2VydmVyL21wbS93aW5udC9XaW45eENvbkhvb2suZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzA0ZjViLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vd2lubnQvV2luOXhDb25Ib29rLmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9Ildpbjl4Q29uSG9vayIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyCi0KLUNGRz1XaW45eENvbkhvb2sgLSBXaW4zMiBSZWxlYXNlCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIldpbjl4Q29uSG9vay5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIldpbjl4Q29uSG9vay5tYWsiIENGRz0iV2luOXhDb25Ib29rIC0gV2luMzIgUmVsZWFzZSIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJXaW45eENvbkhvb2sgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFICJXaW45eENvbkhvb2sgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLU1UTD1taWRsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJXaW45eENvbkhvb2sgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiLlxSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIldpbjl4Q29uSG9va1IiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiV2luOXhDb25Ib29rUiIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvTzIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJTSEFSRURfTU9EVUxFIiAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hY2hpbmU6STM4NiAvYmFzZTpAIkJhc2VBZGRyLnJlZiIsbW9kX3N0YXR1cwotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiAvbm9sb2dvIC9iYXNlOiIweDFjMGYwMDAwIiAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFwIC9tYWNoaW5lOkkzODYKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIldpbjl4Q29uSG9vayAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxEZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIi5cRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiV2luOXhDb25Ib29rRCIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJXaW45eENvbkhvb2tEIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIlNIQVJFRF9NT0RVTEUiIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NiAvYmFzZTpAIkJhc2VBZGRyLnJlZiIsbW9kX3N0YXR1cwotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiAvbm9sb2dvIC9iYXNlOiIweDFjMGYwMDAwIiAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvaW5jcmVtZW50YWw6bm8gL21hcCAvZGVidWcgL21hY2hpbmU6STM4NgotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAiV2luOXhDb25Ib29rIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAiV2luOXhDb25Ib29rIC0gV2luMzIgRGVidWciCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXFdpbjl4Q29uSG9vay5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxXaW45eENvbkhvb2suZGVmCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxXaW45eENvbkhvb2suaAotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS93aW5udC9XaW45eENvbkhvb2suaCBiL3NlcnZlci9tcG0vd2lubnQvV2luOXhDb25Ib29rLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwN2NkYmUuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS93aW5udC9XaW45eENvbkhvb2suaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLQotCi0KLS8qCi0gKiBGaXhDb25zb2xlQ29udHJvbEhhbmRsZXIgd2lsbCByZWdpc3RlciBhIGhhbmRsZXIgcm91dGluZSB3aXRoIHRoZQotICogV2luOXhDb25Ib29rLmRsbCwgY3JlYXRpbmcgYSBoaWRkZW4gd2luZG93IGFuZCBmb3J3YXJkaW5nIHRoZQotICogV01fRU5EU0VTU0lPTiBhbmQgV01fQ0xPU0UgbWVzc2FnZXMgdG8gdGhlIHJlZ2lzdGVyZWQgaGFuZGxlcgotICogYXMgQ1RSTF9TSFVURE9XTl9FVkVOVCwgQ1RSTF9MT0dPRkZfRVZFTlQgYW5kIENUUkxfQ0xPU0VfRVZFTlQuIAotICovCi1CT09MIFdJTkFQSSBGaXhDb25zb2xlQ3RybEhhbmRsZXIoCi0gICAgICAgIFBIQU5ETEVSX1JPVVRJTkUgcGhhbmRsZXIsCi0gICAgICAgIEJPT0wgYWRkKTsKLQotLyoKLSAqIFBvc3RNZXNzYWdlIEhvb2s6Ci0gKi8KLUxSRVNVTFQgQ0FMTEJBQ0sgR2V0TXNnUHJvYyhJTlQgaGMsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwotCi0KLS8qCi0gKiBTZW5kTWVzc2FnZSBIb29rOgotICovCi1MUkVTVUxUIENBTExCQUNLIENhbGxXbmRQcm9jKElOVCBoYywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7Ci0KZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vd2lubnQvbXBtLmggYi9zZXJ2ZXIvbXBtL3dpbm50L21wbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzVkYmE2Li4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vd2lubnQvbXBtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBiYXNlZCB1cG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUKLSAqIG9yaWdpbmFsbHkgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsCi0gKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICovCi0KLSNpZm5kZWYgQVBBQ0hFX01QTV9XSU5OVF9ICi0jZGVmaW5lIEFQQUNIRV9NUE1fV0lOTlRfSAotCi0KLSNlbmRpZiAvKiBBUEFDSEVfTVBNX1dJTk5UX0ggKi8KZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vd2lubnQvbXBtX2RlZmF1bHQuaCBiL3NlcnZlci9tcG0vd2lubnQvbXBtX2RlZmF1bHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFjMmZlNC4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL3dpbm50L21wbV9kZWZhdWx0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCi0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgCi0gKiBhcmUgbWV0OiAKLSAqIAotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgCi0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuICAKLSAqIAotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgCi0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIAotICogICAgZGlzdHJpYnV0aW9uLiAKLSAqIAotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIAotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6IAotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cCAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iIAotICogCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvIAotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCi0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuIAotICogCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiAKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4gCi0gKiAKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcgCi0gKiAgICBhY2tub3dsZWRnbWVudDogCi0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwIAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIgCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWSAKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUiAKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCi0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSAKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCAKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKLSAqIAotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkgCi0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQgCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uIAotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlciAKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LiAKLSAqIAotICovIAotCi0jaWZuZGVmIEFQQUNIRV9NUE1fREVGQVVMVF9ICi0jZGVmaW5lIEFQQUNIRV9NUE1fREVGQVVMVF9ICi0KLS8qIE51bWJlciBvZiB0aHJlYWRzIHRvIHNwYXduIG9mZiBieSBkZWZhdWx0IC0tLSBhbHNvLCBpZiBmZXdlciB0aGFuCi0gKiB0aGlzIGZyZWUgd2hlbiB0aGUgY2FyZXRha2VyIGNoZWNrcywgaXQgd2lsbCBzcGF3biBtb3JlLgotICovCi0jaWZuZGVmIERFRkFVTFRfU1RBUlRfVEhSRUFECi0jZGVmaW5lIERFRkFVTFRfU1RBUlRfVEhSRUFEIDUKLSNlbmRpZgotCi0vKiBNYXhpbXVtIG51bWJlciBvZiAqZnJlZSogc2VydmVyIHRocmVhZHMgLS0tIG1vcmUgdGhhbiB0aGlzLCBhbmQKLSAqIHRoZXkgd2lsbCBkaWUgb2ZmLgotI2lmbmRlZiBERUZBVUxUX01BWF9TUEFSRV9USFJFQUQKLSNkZWZpbmUgREVGQVVMVF9NQVhfU1BBUkVfVEhSRUFEIDEwCi0jZW5kaWYKLSovCi0KLS8qIE1pbmltdW0gLS0tIGZld2VyIHRoYW4gdGhpcywgYW5kIG1vcmUgd2lsbCBiZSBjcmVhdGVkICovCi0vKgotI2lmbmRlZiBERUZBVUxUX01JTl9TUEFSRV9USFJFQUQKLSNkZWZpbmUgREVGQVVMVF9NSU5fU1BBUkVfVEhSRUFEIDUKLSNlbmRpZgotKi8KLQotLyogTGltaXQgb24gdGhlIHRocmVhZHMgcGVyIHByb2Nlc3MuICBDbGllbnRzIHdpbGwgYmUgbG9ja2VkIG91dCBpZiBtb3JlIHRoYW4KLSAqIHRoaXMgICogSEFSRF9TRVJWRVJfTElNSVQgYXJlIG5lZWRlZC4KLSAqCi0gKiBXZSBrZWVwIHRoaXMgZm9yIG9uZSByZWFzb24gaXQga2VlcHMgdGhlIHNpemUgb2YgdGhlIHNjb3JlYm9hcmQgZmlsZSBzbWFsbAotICogZW5vdWdoIHRoYXQgd2UgY2FuIHJlYWQgdGhlIHdob2xlIHRoaW5nIHdpdGhvdXQgd29ycnlpbmcgdG9vIG11Y2ggYWJvdXQKLSAqIHRoZSBvdmVyaGVhZC4KLSAqLwotI2lmbmRlZiBIQVJEX1RIUkVBRF9MSU1JVAotI2RlZmluZSBIQVJEX1RIUkVBRF9MSU1JVCA2NCAKLSNlbmRpZgotCi0vKiBOdW1iZXIgb2Ygc2VydmVycyB0byBzcGF3biBvZmYgYnkgZGVmYXVsdAotICovCi0jaWZuZGVmIERFRkFVTFRfTlVNX0RBRU1PTgotI2RlZmluZSBERUZBVUxUX05VTV9EQUVNT04gMQotI2VuZGlmCi0KLS8qIExpbWl0IG9uIHRoZSB0b3RhbCAtLS0gY2xpZW50cyB3aWxsIGJlIGxvY2tlZCBvdXQgaWYgbW9yZSBzZXJ2ZXJzIHRoYW4KLSAqIHRoaXMgYXJlIG5lZWRlZC4gIEl0IGlzIGludGVuZGVkIHNvbGVseSB0byBrZWVwIHRoZSBzZXJ2ZXIgZnJvbSBjcmFzaGluZwotICogd2hlbiB0aGluZ3MgZ2V0IG91dCBvZiBoYW5kLgotICoKLSAqIFdlIGtlZXAgYSBoYXJkIG1heGltdW0gbnVtYmVyIG9mIHNlcnZlcnMsIGZvciB0d28gcmVhc29ucyAtLS0gZmlyc3Qgb2ZmLAotICogaW4gY2FzZSBzb21ldGhpbmcgZ29lcyBzZXJpb3VzbHkgd3JvbmcsIHdlIHdhbnQgdG8gc3RvcCB0aGUgZm9yayBib21iCi0gKiBzaG9ydCBvZiBhY3R1YWxseSBjcmFzaGluZyB0aGUgbWFjaGluZSB3ZSdyZSBydW5uaW5nIG9uIGJ5IGZpbGxpbmcgc29tZQotICoga2VybmVsIHRhYmxlLiAgU2Vjb25kbHksIGl0IGtlZXBzIHRoZSBzaXplIG9mIHRoZSBzY29yZWJvYXJkIGZpbGUgc21hbGwKLSAqIGVub3VnaCB0aGF0IHdlIGNhbiByZWFkIHRoZSB3aG9sZSB0aGluZyB3aXRob3V0IHdvcnJ5aW5nIHRvbyBtdWNoIGFib3V0Ci0gKiB0aGUgb3ZlcmhlYWQuCi0gKi8KLSNpZm5kZWYgSEFSRF9TRVJWRVJfTElNSVQKLSNkZWZpbmUgSEFSRF9TRVJWRVJfTElNSVQgOCAKLSNlbmRpZgotCi0jZW5kaWYgLyogQVBfTVBNX0RFRkFVTFRfSCAqLwpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS93aW5udC9tcG1fd2lubnQuYyBiL3NlcnZlci9tcG0vd2lubnQvbXBtX3dpbm50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYjUzM2QuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS93aW5udC9tcG1fd2lubnQuYworKysgL2Rldi9udWxsCkBAIC0xLDE2ODMgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCi0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgCi0gKiBhcmUgbWV0OiAKLSAqIAotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgCi0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuICAKLSAqIAotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgCi0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIAotICogICAgZGlzdHJpYnV0aW9uLiAKLSAqIAotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIAotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6IAotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cCAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iIAotICogCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvIAotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCi0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuIAotICogCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiAKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4gCi0gKiAKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcgCi0gKiAgICBhY2tub3dsZWRnbWVudDogCi0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwIAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIgCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWSAKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUiAKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCi0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSAKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCAKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKLSAqIAotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkgCi0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQgCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uIAotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlciAKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LiAKLSAqIAotICovIAotIAotI2RlZmluZSBDT1JFX1BSSVZBVEUgCi0gCi0jaW5jbHVkZSAiaHR0cGQuaCIgCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiIAotI2luY2x1ZGUgImh0dHBfbG9nLmgiIAotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCS8qIGZvciByZWFkX2NvbmZpZyAqLyAKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIJCS8qIGZvciBnZXRfcmVtb3RlX2hvc3QgKi8gCi0jaW5jbHVkZSAiaHR0cF9jb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAiYXBfbXBtLmgiCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAiYXBfbGlzdGVuLmgiCi0jaW5jbHVkZSAibXVsdGl0aHJlYWQuaCIKLSNpbmNsdWRlICIuLi9vcy93aW4zMi9nZXRvcHQuaCIKLSNpbmNsdWRlICJtcG1fZGVmYXVsdC5oIgotLyoKLSAqIEFjdHVhbCBkZWZpbml0aW9ucyBvZiBXSU5OVCBNUE0gc3BlY2lmaWMgY29uZmlnIGdsb2JhbHMKLSAqLwotaW50IGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQ9MDsKLWludCBhcF9kYWVtb25zX3RvX3N0YXJ0PTA7Ci1zdGF0aWMgY2hhciAqbXBtX3BpZF9mbmFtZT1OVUxMOwotc3RhdGljIGludCBhcF90aHJlYWRzX3Blcl9jaGlsZCA9IDA7Ci0vL3N0YXRpYyBpbnQgYXBfbWF4X3RocmVhZHNfcGVyX2NoaWxkID0gMDsKLXN0YXRpYyBpbnQgd29ya2Vyc19tYXlfZXhpdCA9IDA7Ci1zdGF0aWMgaW50IG1heF9yZXF1ZXN0c19wZXJfY2hpbGQgPSAwOwotc3RhdGljIGludCByZXF1ZXN0c190aGlzX2NoaWxkOwotc3RhdGljIGludCBudW1fbGlzdGVuZmRzID0gMDsKLXN0YXRpYyBzdHJ1Y3QgcG9sbGZkICpsaXN0ZW5mZHM7Ci1zdGF0aWMgcG9vbCAqcGNvbmY7CQkvKiBQb29sIGZvciBjb25maWcgc3R1ZmYgKi8KLQotc3RhdGljIGNoYXIgYXBfY29yZWR1bXBfZGlyW01BWF9TVFJJTkdfTEVOXTsKLQotCi1zdGF0aWMgc2VydmVyX3JlYyAqc2VydmVyX2NvbmY7Ci0vKnN0YXRpYyBpbnQgc2Q7IFpaWiB3aHkgaXMgdGhlIGdsb2JhbC4uLj8gT25seSBzZWVtcyB0byBiZSBuZWVkZWQgb24gV2luMzIqLwotCi0vKiBvbmVfcHJvY2VzcyAtLS0gZGVidWdnaW5nIG1vZGUgdmFyaWFibGU7IGNhbiBiZSBzZXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lCi0gKiB3aXRoIHRoZSAtWCBmbGFnLiAgSWYgc2V0LCB0aGlzIGdldHMgeW91IHRoZSBjaGlsZF9tYWluIGxvb3AgcnVubmluZwotICogaW4gdGhlIHByb2Nlc3Mgd2hpY2ggb3JpZ2luYWxseSBzdGFydGVkIHVwIChubyBkZXRhY2gsIG5vIG1ha2VfY2hpbGQpLAotICogd2hpY2ggaXMgYSBwcmV0dHkgbmljZSBkZWJ1Z2dpbmcgZW52aXJvbm1lbnQuICAoWW91J2xsIGdldCBhIFNJR0hVUAotICogZWFybHkgaW4gc3RhbmRhbG9uZV9tYWluOyBqdXN0IGNvbnRpbnVlIHRocm91Z2guICBUaGlzIGlzIHRoZSBzZXJ2ZXIKLSAqIHRyeWluZyB0byBraWxsIG9mZiBhbnkgY2hpbGQgcHJvY2Vzc2VzIHdoaWNoIGl0IG1pZ2h0IGhhdmUgbHlpbmcKLSAqIGFyb3VuZCAtLS0gQXBhY2hlIGRvZXNuJ3Qga2VlcCB0cmFjayBvZiB0aGVpciBwaWRzLCBpdCBqdXN0IHNlbmRzCi0gKiBTSUdIVVAgdG8gdGhlIHByb2Nlc3MgZ3JvdXAsIGlnbm9yaW5nIGl0IGluIHRoZSByb290IHByb2Nlc3MuCi0gKiBDb250aW51ZSB0aHJvdWdoIGFuZCB5b3UnbGwgYmUgZmluZS4pLgotICovCi0KLXN0YXRpYyBpbnQgb25lX3Byb2Nlc3MgPSAwOwotCi0jaWZkZWYgREVCVUdfU0lHU1RPUAotaW50IHJhaXNlX3NpZ3N0b3BfZmxhZ3M7Ci0jZW5kaWYKLQotCi0vKiAqTm9uKi1zaGFyZWQgd2lubnQuYyBnbG9iYWxzLi4uICovCi1ldmVudCAqZXhpdF9ldmVudDsKLW11dGV4ICpzdGFydF9tdXRleDsKLWludCBteV9waWQ7Ci1pbnQgcGFyZW50X3BpZDsKLWludCBsaXN0ZW5tYXhmZDsKLQotLyogYSBjbGVhbiBleGl0IGZyb20gYSBjaGlsZCB3aXRoIHByb3BlciBjbGVhbnVwIAotICAgc3RhdGljIHZvaWQgY2xlYW5fY2hpbGRfZXhpdChpbnQgY29kZSkgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSk7IAotdm9pZCBjbGVhbl9jaGlsZF9leGl0KGludCBjb2RlKQotewotICAgIGlmIChwY2hpbGQpIHsKLQlhcF9kZXN0cm95X3Bvb2wocGNoaWxkKTsKLSAgICB9Ci0gICAgZXhpdChjb2RlKTsKLX0KLSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbm5lY3Rpb24gc3RydWN0dXJlcyBhbmQgYWNjb3VudGluZy4uLgotICovCi0KLS8qIHZvbGF0aWxlIGp1c3QgaW4gY2FzZSAqLwotc3RhdGljIGludCB2b2xhdGlsZSBzaHV0ZG93bl9wZW5kaW5nOwotc3RhdGljIGludCB2b2xhdGlsZSByZXN0YXJ0X3BlbmRpbmc7Ci1zdGF0aWMgaW50IHZvbGF0aWxlIGlzX2dyYWNlZnVsOwotCi0vKgotICogYXBfc3RhcnRfc2h1dGRvd24oKSBhbmQgYXBfc3RhcnRfcmVzdGFydCgpLCBiZWxvdywgYXJlIGEgZmlyc3Qgc3RhYiBhdAotICogZnVuY3Rpb25zIHRvIGluaXRpYXRlIHNodXRkb3duIG9yIHJlc3RhcnQgd2l0aG91dCByZWx5aW5nIG9uIHNpZ25hbHMuIAotICogUHJldmlvdXNseSB0aGlzIHdhcyBpbml0aWF0ZWQgaW4gc2lnX3Rlcm0oKSBhbmQgcmVzdGFydCgpIHNpZ25hbCBoYW5kbGVycywgCi0gKiBidXQgd2Ugd2FudCB0byBiZSBhYmxlIHRvIHN0YXJ0IGEgc2h1dGRvd24vcmVzdGFydCBmcm9tIG90aGVyIHNvdXJjZXMgLS0KLSAqIGUuZy4gb24gV2luMzIsIGZyb20gdGhlIHNlcnZpY2UgbWFuYWdlci4gTm93IHRoZSBzZXJ2aWNlIG1hbmFnZXIgY2FuCi0gKiBjYWxsIGFwX3N0YXJ0X3NodXRkb3duKCkgb3IgYXBfc3RhcnRfcmVzdGFydCgpIGFzIGFwcHJvcGlhdGUuICBOb3RlIHRoYXQKLSAqIHRoZXNlIGZ1bmN0aW9ucyBjYW4gYWxzbyBiZSBjYWxsZWQgYnkgdGhlIGNoaWxkIHByb2Nlc3Nlcywgc2luY2UgZ2xvYmFsCi0gKiB2YXJpYWJsZXMgYXJlIG5vIGxvbmdlciB1c2VkIHRvIHBhc3Mgb24gdGhlIHJlcXVpcmVkIGFjdGlvbiB0byB0aGUgcGFyZW50LgotICoKLSAqIFRoZXNlIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBwYXJlbnQgcHJvY2VzcyBpdHNlbGYsIHNpbmNlIHRoZQotICogcGFyZW50IHByb2Nlc3Mgd2lsbCB1c2UgdGhlIHNodXRkb3duX3BlbmRpbmcgYW5kIHJlc3RhcnRfcGVuZGluZyB2YXJpYWJsZXMKLSAqIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNodXRkb3duIG9yIHJlc3RhcnQuIFRoZSBjaGlsZCBwcm9jZXNzIHNob3VsZAotICogY2FsbCBzaWduYWxfcGFyZW50KCkgZGlyZWN0bHkgdG8gdGVsbCB0aGUgcGFyZW50IHRvIGRpZSAtLSB0aGlzIHdpbGwKLSAqIGNhdXNlIG5laXRoZXIgb2YgdGhvc2UgdmFyaWFibGUgdG8gYmUgc2V0LCB3aGljaCB0aGUgcGFyZW50IHdpbGwKLSAqIGFzc3VtZSBtZWFucyBzb21ldGhpbmcgc2VyaW91cyBpcyB3cm9uZyAod2hpY2ggaXQgd2lsbCBiZSwgZm9yIHRoZQotICogY2hpbGQgdG8gZm9yY2UgYW4gZXhpdCkgYW5kIHNvIGRvIGFuIGV4aXQgYW55d2F5LgotICovCi0KLXZvaWQgYXBfc3RhcnRfc2h1dGRvd24odm9pZCkKLXsKLSAgICBpZiAoc2h1dGRvd25fcGVuZGluZyA9PSAxKSB7Ci0JLyogVW0sIGlzIHRoaXMgX3Byb2JhYmx5XyBub3QgYW4gZXJyb3IsIGlmIHRoZSB1c2VyIGhhcwotCSAqIHRyaWVkIHRvIGRvIGEgc2h1dGRvd24gdHdpY2UgcXVpY2tseSwgc28gd2Ugd29uJ3QKLQkgKiB3b3JyeSBhYm91dCByZXBvcnRpbmcgaXQuCi0JICovCi0JcmV0dXJuOwotICAgIH0KLSAgICBzaHV0ZG93bl9wZW5kaW5nID0gMTsKLX0KLQotLyogZG8gYSBncmFjZWZ1bCByZXN0YXJ0IGlmIGdyYWNlZnVsID09IDEgKi8KLXZvaWQgYXBfc3RhcnRfcmVzdGFydChpbnQgZ3JhY2VmdWwpCi17Ci0KLSAgICBpZiAocmVzdGFydF9wZW5kaW5nID09IDEpIHsKLQkvKiBQcm9iYWJseSBub3QgYW4gZXJyb3IgLSBkb24ndCBib3RoZXIgcmVwb3J0aW5nIGl0ICovCi0JcmV0dXJuOwotICAgIH0KLSAgICByZXN0YXJ0X3BlbmRpbmcgPSAxOwotICAgIGlzX2dyYWNlZnVsID0gZ3JhY2VmdWw7Ci19Ci0KLXN0YXRpYyB2b2lkIHNpZ190ZXJtKGludCBzaWcpCi17Ci0gICAgYXBfc3RhcnRfc2h1dGRvd24oKTsKLX0KLQotc3RhdGljIHZvaWQgcmVzdGFydChpbnQgc2lnKQotewotICAgIGFwX3N0YXJ0X3Jlc3RhcnQoMSk7Ci19Ci0KLXN0YXRpYyBhcF9saXN0ZW5fcmVjICpvbGRfbGlzdGVuZXJzOwotc3RhdGljIGFwX2xpc3Rlbl9yZWMgKmhlYWRfbGlzdGVuZXI7Ci1zdGF0aWMgaW50IHNldHVwX2xpc3RlbmVycyhwb29sICpwY29uZiwgc2VydmVyX3JlYyAqcykKLXsKLSAgICBhcF9saXN0ZW5fcmVjICpscjsKLSAgICBpbnQgbnVtX2xpc3RlbmVycyA9IDA7Ci0KLSAgICBpZiAoYXBfbGlzdGVuX29wZW4ocGNvbmYsIHMtPnBvcnQpKSB7Ci0gICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGZvciAobHIgPSBhcF9saXN0ZW5lcnM7IGxyOyBsciA9IGxyLT5uZXh0KSB7Ci0gICAgICAgIG51bV9saXN0ZW5lcnMrKzsKLSAgICB9Ci0gICAgcmV0dXJuIG51bV9saXN0ZW5lcnM7Ci19Ci0KLXN0YXRpYyBpbnQgZmluZF9saXN0ZW5lcihhcF9saXN0ZW5fcmVjICpscikKLXsKLSAgICBhcF9saXN0ZW5fcmVjICpvcjsKLQotICAgIGZvciAob3IgPSBvbGRfbGlzdGVuZXJzOyBvcjsgb3IgPSBvci0+bmV4dCkgewotCWlmICghbWVtY21wKCZvci0+bG9jYWxfYWRkciwgJmxyLT5sb2NhbF9hZGRyLCBzaXplb2Yob3ItPmxvY2FsX2FkZHIpKSkgewotLy8JICAgIG9yLT51c2VkID0gMTsKLQkgICAgcmV0dXJuIG9yLT5mZDsKLQl9Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLQotCi1zdGF0aWMgdm9pZCBjbG9zZV91bnVzZWRfbGlzdGVuZXJzKHZvaWQpCi17Ci0gICAgYXBfbGlzdGVuX3JlYyAqb3IsICpuZXh0OwotCi0gICAgZm9yIChvciA9IG9sZF9saXN0ZW5lcnM7IG9yOyBvciA9IG5leHQpIHsKLQluZXh0ID0gb3ItPm5leHQ7Ci0vLwlpZiAoIW9yLT51c2VkKQotCSAgICBjbG9zZXNvY2tldChvci0+ZmQpOwotCWZyZWUob3IpOwotICAgIH0KLSAgICBvbGRfbGlzdGVuZXJzID0gTlVMTDsKLX0KLQotLyoKLSAqIEZpbmQgYSBsaXN0ZW5lciB3aGljaCBpcyByZWFkeSBmb3IgYWNjZXB0KCkuICBUaGlzIGFkdmFuY2VzIHRoZQotICogaGVhZF9saXN0ZW5lciBnbG9iYWwuCi0gKi8KLXN0YXRpYyBhcF9pbmxpbmUgYXBfbGlzdGVuX3JlYyAqZmluZF9yZWFkeV9saXN0ZW5lcihmZF9zZXQgKiBtYWluX2ZkcykKLS8vc3RhdGljIGFwX2xpc3Rlbl9yZWMgKmZpbmRfcmVhZHlfbGlzdGVuZXIoZmRfc2V0ICogbWFpbl9mZHMpCi17Ci0gICAgYXBfbGlzdGVuX3JlYyAqbHI7Ci0KLSAgICBsciA9IGhlYWRfbGlzdGVuZXI7Ci0gICAgZG8gewotCWlmIChGRF9JU1NFVChsci0+ZmQsIG1haW5fZmRzKSkgewotCSAgICBoZWFkX2xpc3RlbmVyID0gbHItPm5leHQ7Ci0JICAgIHJldHVybiAobHIpOwotCX0KLQlsciA9IGxyLT5uZXh0OwotICAgIH0gd2hpbGUgKGxyICE9IGhlYWRfbGlzdGVuZXIpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKgotICogU2lnbmFsbGluZyBBcGFjaGUgb24gTlQuCi0gKgotICogVW5kZXIgVW5peCwgQXBhY2hlIGNhbiBiZSB0b2xkIHRvIHNodXRkb3duIG9yIHJlc3RhcnQgYnkgc2VuZGluZyB2YXJpb3VzCi0gKiBzaWduYWxzIChIVVAsIFVTUiwgVEVSTSkuIE9uIE5UIHdlIGRvbid0IGhhdmUgZWFzeSBhY2Nlc3MgdG8gc2lnbmFscywgc28KLSAqIHdlIHVzZSAiZXZlbnRzIiBpbnN0ZWFkLiBUaGUgcGFyZW50IGFwYWNoZSBwcm9jZXNzIGdvZXMgaW50byBhIGxvb3AKLSAqIHdoZXJlIGl0IHdhaXRzIGZvcmV2ZXIgZm9yIGEgc2V0IG9mIGV2ZW50cy4gVHdvIG9mIHRob3NlIGV2ZW50cyBhcmUKLSAqIGNhbGxlZAotICoKLSAqICAgIGFwUElEX3NodXRkb3duCi0gKiAgICBhcFBJRF9yZXN0YXJ0Ci0gKgotICogKHdoZXJlIFBJRCBpcyB0aGUgUElEIG9mIHRoZSBhcGFjaGUgcGFyZW50IHByb2Nlc3MpLiBXaGVuIG9uZSBvZiB0aGVzZQotICogaXMgc2lnbmFsbGVkLCB0aGUgQXBhY2hlIHBhcmVudCBwZXJmb3JtcyB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uLiBUaGUgZXZlbnRzCi0gKiBjYW4gYmVjb21lIHNpZ25hbGxlZCB0aHJvdWdoIGludGVybmFsIEFwYWNoZSBtZXRob2RzIChlLmcuIGlmIHRoZSBjaGlsZAotICogZmluZHMgYSBmYXRhbCBlcnJvciBhbmQgbmVlZHMgdG8ga2lsbCBpdHMgcGFyZW50KSwgdmlhIHRoZSBzZXJ2aWNlCi0gKiBjb250cm9sIG1hbmFnZXIgKHRoZSBjb250cm9sIHRocmVhZCB3aWxsIHNpZ25hbCB0aGUgc2h1dGRvd24gZXZlbnQgd2hlbgotICogcmVxdWVzdGVkIHRvIHN0b3AgdGhlIEFwYWNoZSBzZXJ2aWNlKSwgZnJvbSB0aGUgLWsgQXBhY2hlIGNvbW1hbmQgbGluZSwKLSAqIG9yIGZyb20gYW55IGV4dGVybmFsIHByb2dyYW0gd2hpY2ggZmluZHMgdGhlIEFwYWNoZSBQSUQgZnJvbSB0aGUKLSAqIGh0dHBkLnBpZCBmaWxlLgotICoKLSAqIFRoZSBzaWduYWxfcGFyZW50KCkgZnVuY3Rpb24sIGJlbG93LCBpcyB1c2VkIHRvIHNpZ25hbCBvbmUgb2YgdGhlc2UgZXZlbnRzLgotICogSXQgY2FuIGJlIGNhbGxlZCBieSBhbnkgY2hpbGQgb3IgcGFyZW50IHByb2Nlc3MsIHNpbmNlIGl0IGRvZXMgbm90Ci0gKiByZWx5IG9uIGdsb2JhbCB2YXJpYWJsZXMuCi0gKgotICogT24gZW50cnksIHR5cGUgZ2l2ZXMgdGhlIGV2ZW50IHRvIHNpZ25hbC4gMCBtZWFucyBzaHV0ZG93biwgMSBtZWFucyAKLSAqIGdyYWNlZnVsIHJlc3RhcnQuCi0gKi8KLQotc3RhdGljIHZvaWQgc2lnbmFsX3BhcmVudChpbnQgdHlwZSkKLXsKLSAgICBIQU5ETEUgZTsKLSAgICBjaGFyICpzaWduYWxfbmFtZTsKLSAgICBleHRlcm4gY2hhciBzaWduYWxfc2h1dGRvd25fbmFtZVtdOwotICAgIGV4dGVybiBjaGFyIHNpZ25hbF9yZXN0YXJ0X25hbWVbXTsKLQotICAgIC8qIGFmdGVyIHVwZGF0aW5nIHRoZSBzaHV0ZG93bl9wZW5kaW5nIG9yIHJlc3RhcnQgZmxhZ3MsIHdlIG5lZWQKLSAgICAgKiB0byB3YWtlIHVwIHRoZSBwYXJlbnQgcHJvY2VzcyBzbyBpdCBjYW4gc2VlIHRoZSBjaGFuZ2VzLiBUaGUKLSAgICAgKiBwYXJlbnQgd2lsbCBub3JtYWxseSBiZSB3YWl0aW5nIGZvciBlaXRoZXIgYSBjaGlsZCBwcm9jZXNzCi0gICAgICogdG8gZGllLCBvciBmb3IgYSBzaWduYWwgb24gdGhlICJzcGFjaGUtc2lnbmFsIiBldmVudC4gU28gc2V0IHRoZQotICAgICAqICJhcGFjaGUtc2lnbmFsIiBldmVudCBoZXJlLgotICAgICAqLwotCi0gICAgaWYgKG9uZV9wcm9jZXNzKSB7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIHN3aXRjaCh0eXBlKSB7Ci0gICAgY2FzZSAwOiBzaWduYWxfbmFtZSA9IHNpZ25hbF9zaHV0ZG93bl9uYW1lOyBicmVhazsKLSAgICBjYXNlIDE6IHNpZ25hbF9uYW1lID0gc2lnbmFsX3Jlc3RhcnRfbmFtZTsgYnJlYWs7Ci0gICAgZGVmYXVsdDogcmV0dXJuOwotICAgIH0KLQotLy8gICAgQVBEMigic2lnbmFsX3BhcmVudCBzaWduYWxsaW5nIGV2ZW50IFwiJXNcIiIsIHNpZ25hbF9uYW1lKTsKLQotICAgIGUgPSBPcGVuRXZlbnQoRVZFTlRfQUxMX0FDQ0VTUywgRkFMU0UsIHNpZ25hbF9uYW1lKTsKLSAgICBpZiAoIWUpIHsKLQkvKiBVbSwgcHJvYmxlbSwgY2FuJ3Qgc2lnbmFsIHRoZSBwYXJlbnQsIHdoaWNoIG1lYW5zIHdlIGNhbid0Ci0JICogc2lnbmFsIG91cnNlbHZlcyB0byBkaWUuIElnbm9yZSBmb3Igbm93Li4uCi0JICovCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHfEFQTE9HX1dJTjMyRVJST1IsIHNlcnZlcl9jb25mLAotCSAgICAiT3BlbkV2ZW50IG9uICVzIGV2ZW50Iiwgc2lnbmFsX25hbWUpOwotCXJldHVybjsKLSAgICB9Ci0gICAgaWYgKFNldEV2ZW50KGUpID09IDApIHsKLQkvKiBTYW1lIHByb2JsZW0gYXMgYWJvdmUgKi8KLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkd8QVBMT0dfV0lOMzJFUlJPUiwgc2VydmVyX2NvbmYsCi0JICAgICJTZXRFdmVudCBvbiAlcyBldmVudCIsIHNpZ25hbF9uYW1lKTsKLQlDbG9zZUhhbmRsZShlKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIENsb3NlSGFuZGxlKGUpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSGVyZSBmb2xsb3dzIGEgbG9uZyBidW5jaCBvZiBnZW5lcmljIHNlcnZlciBib29ra2VlcGluZyBzdHVmZi4uLgotICovCi0KLXN0YXRpYyB2b2lkIHNvY2tfZGlzYWJsZV9uYWdsZShpbnQgcykgLyogWlpaIGFic3RyYWN0ICovCi17Ci0gICAgLyogVGhlIE5hZ2xlIGFsZ29yaXRobSBzYXlzIHRoYXQgd2Ugc2hvdWxkIGRlbGF5IHNlbmRpbmcgcGFydGlhbAotICAgICAqIHBhY2tldHMgaW4gaG9wZXMgb2YgZ2V0dGluZyBtb3JlIGRhdGEuICBXZSBkb24ndCB3YW50IHRvIGRvCi0gICAgICogdGhpczsgd2UgYXJlIG5vdCB0ZWxuZXQuICBUaGVyZSBhcmUgYmFkIGludGVyYWN0aW9ucyBiZXR3ZWVuCi0gICAgICogcGVyc2lzdGVudCBjb25uZWN0aW9ucyBhbmQgTmFnbGUncyBhbGdvcml0aG0gdGhhdCBoYXZlIHZlcnkgc2V2ZXJlCi0gICAgICogcGVyZm9ybWFuY2UgcGVuYWx0aWVzLiAgKEZhaWxpbmcgdG8gZGlzYWJsZSBOYWdsZSBpcyBub3QgbXVjaCBvZiBhCi0gICAgICogcHJvYmxlbSB3aXRoIHNpbXBsZSBIVFRQLikKLSAgICAgKgotICAgICAqIEluIHNwaXRlIG9mIHRoZXNlIHByb2JsZW1zLCBmYWlsdXJlIGhlcmUgaXMgbm90IGEgc2hvb3Rpbmcgb2ZmZW5zZS4KLSAgICAgKi8KLSAgICBpbnQganVzdF9zYXlfbm8gPSAxOwotCi0gICAgaWYgKHNldHNvY2tvcHQocywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAoY2hhciAqKSAmanVzdF9zYXlfbm8sCi0JCSAgIHNpemVvZihpbnQpKSA8IDApIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgc2VydmVyX2NvbmYsCi0JCSAgICAic2V0c29ja29wdDogKFRDUF9OT0RFTEFZKSIpOwotICAgIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTXVsdGl0aHJlYWRlZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqIFRoaXMgY29kZSBpcyBmYWlybHkgc3BlY2lmaWMgdG8gV2luMzIuCi0gKgotICogVGhlIG1vZGVsIHVzZWQgdG8gaGFuZGxlIHJlcXVlc3RzIGlzIGEgc2V0IG9mIHRocmVhZHMuIE9uZSAibWFpbiIKLSAqIHRocmVhZCBsaXN0ZW5zIGZvciBuZXcgcmVxdWVzdHMuIFdoZW4gc29tZXRoaW5nIGJlY29tZXMKLSAqIGF2YWlsYWJsZSwgaXQgZG9lcyBhIHNlbGVjdCBhbmQgcGxhY2VzIHRoZSBuZXdseSBhdmFpbGFibGUgc29ja2V0Ci0gKiBvbnRvIGEgbGlzdCBvZiAiam9icyIgKGFkZF9qb2IoKSkuIFRoZW4gYW55IG9uZSBvZiBhIGZpeGVkIG51bWJlcgotICogb2YgIndvcmtlciIgdGhyZWFkcyB0YWtlcyB0aGUgdG9wIGpvYiBvZmYgdGhlIGpvYiBsaXN0IHdpdGgKLSAqIHJlbW92ZV9qb2IoKSBhbmQgaGFuZGxlcyB0aGF0IGNvbm5lY3Rpb24gdG8gY29tcGxldGlvbi4gQWZ0ZXIKLSAqIHRoZSBjb25uZWN0aW9uIGhhcyBmaW5pc2hlZCB0aGUgdGhyZWFkIGlzIGZyZWUgdG8gdGFrZSBhbm90aGVyCi0gKiBqb2IgZnJvbSB0aGUgam9iIGxpc3QuCi0gKgotICogSW4gdGhlIGNvZGUsIHRoZSAibWFpbiIgdGhyZWFkIGlzIHJ1bm5pbmcgd2l0aGluIHRoZSB3b3JrZXJfbWFpbigpCi0gKiBmdW5jdGlvbi4gVGhlIGZpcnN0IHRoaW5nIHRoaXMgZnVuY3Rpb24gZG9lcyBpcyBjcmVhdGUgdGhlCi0gKiB3b3JrZXIgdGhyZWFkcywgd2hpY2ggb3BlcmF0ZSBpbiB0aGUgY2hpbGRfc3ViX21haW4oKSBmdW5jdGlvbi4gVGhlCi0gKiBtYWluIHRocmVhZCB0aGVuIGdvZXMgaW50byBhIGxvb3Agd2l0aGluIHdvcmtlcl9tYWluKCkgd2hlcmUgdGhleQotICogZG8gYSBzZWxlY3QoKSBvbiB0aGUgbGlzdGVuaW5nIHNvY2tldHMuIFRoZSBzZWxlY3QgdGltZXMgb3V0IG9uY2UKLSAqIHBlciBzZWNvbmQgc28gdGhhdCB0aGUgdGhyZWFkIGNhbiBjaGVjayBmb3IgYW4gImV4aXQiIHNpZ25hbAotICogZnJvbSB0aGUgcGFyZW50IHByb2Nlc3MgKHNlZSBiZWxvdykuIElmIHRoaXMgc2lnbmFsIGlzIHNldCwgdGhlIAotICogdGhyZWFkIGNhbiBleGl0LCBidXQgb25seSBhZnRlciBpdCBoYXMgYWNjZXB0ZWQgYWxsIGluY29taW5nCi0gKiBjb25uZWN0aW9ucyBhbHJlYWR5IGluIHRoZSBsaXN0ZW4gcXVldWUgKHNpbmNlIFdpbjMyIGFwcGVhcnMKLSAqIHRvIHRocm91Z2ggYXdheSBsaXN0ZW5lZCBidXQgdW5hY2NlcHRlZCBjb25uZWN0aW9ucyB3aGVuIGEgCi0gKiBwcm9jZXNzIGRpZXMpLgotICoKLSAqIEJlY2F1c2UgdGhlIG1haW4gYW5kIHdvcmtlciB0aHJlYWRzIGV4aXN0IHdpdGhpbiBhIHNpbmdsZSBwcm9jZXNzCi0gKiB0aGV5IGFyZSB2dWxuZXJhYmxlIHRvIGNyYXNoZXMgb3IgbWVtb3J5IGxlYWtzIChjcmFzaGVzIGNhbiBhbHNvCi0gKiBiZSBjYXVzZWQgd2l0aGluIG1vZHVsZXMsIG9mIGNvdXJzZSkuIFRoZXJlIGFsc28gbmVlZHMgdG8gYmUgYSAKLSAqIG1lY2hhbmlzbSB0byBwZXJmb3JtIHJlc3RhcnRzIGFuZCBzaHV0ZG93bnMuIFRoaXMgaXMgZG9uZSBieQotICogY3JlYXRpbmcgdGhlIG1haW4gJiB3b3JrZXIgdGhyZWFkcyB3aXRoaW4gYSBzdWJwcm9jZXNzLiBBCi0gKiBtYWluIHByb2Nlc3MgKHRoZSAicGFyZW50IHByb2Nlc3MiKSBjcmVhdGVzIG9uZSAob3IgbW9yZSkgCi0gKiBwcm9jZXNzZXMgdG8gZG8gdGhlIHdvcmssIHRoZW4gdGhlIHBhcmVudCBzaXRzIGFyb3VuZCB3YWl0aW5nCi0gKiBmb3IgdGhlIHdvcmtpbmcgcHJvY2VzcyB0byBkaWUsIGluIHdoaWNoIGNhc2UgaXQgc3RhcnRzIGEgbmV3Ci0gKiBvbmUuIFRoZSBwYXJlbnQgcHJvY2VzcyBhbHNvIGhhbmRsZXMgcmVzdGFydHMgKGJ5IGNyZWF0aW5nCi0gKiBhIG5ldyB3b3JraW5nIHByb2Nlc3MgdGhlbiBzaWduYWxsaW5nIHRoZSBwcmV2aW91cyB3b3JraW5nIHByb2Nlc3MgCi0gKiBleGl0ICkgYW5kIHNodXRkb3ducyAoYnkgc2lnbmFsbGluZyB0aGUgd29ya2luZyBwcm9jZXNzIHRvIGV4aXQpLgotICogVGhlIHBhcmVudCBwcm9jZXNzIG9wZXJhdGVzIHdpdGhpbiB0aGUgbWFzdGVyX21haW4oKSBmdW5jdGlvbi4gVGhpcwotICogcHJvY2VzcyBhbHNvIGhhbmRsZXMgcmVxdWVzdHMgZnJvbSB0aGUgc2VydmljZSBtYW5hZ2VyIChOVCBvbmx5KS4KLSAqCi0gKiBTaWduYWxsaW5nIGJldHdlZW4gdGhlIHBhcmVudCBhbmQgd29ya2luZyBwcm9jZXNzIHVzZXMgYSBXaW4zMgotICogZXZlbnQuIEVhY2ggY2hpbGQgaGFzIGEgdW5pcXVlIG5hbWUgZm9yIHRoZSBldmVudCwgd2hpY2ggaXMKLSAqIHBhc3NlZCB0byBpdCB3aXRoIHRoZSAtWiBhcmd1bWVudCB3aGVuIHRoZSBjaGlsZCBpcyBzcGF3bmVkLiBUaGUKLSAqIHBhcmVudCBzZXRzIChzaWduYWxzKSB0aGlzIGV2ZW50IHRvIHRlbGwgdGhlIGNoaWxkIHRvIGRpZS4KLSAqIEF0IHByZXNlbnQgYWxsIGNoaWxkcmVuIGRvIGEgZ3JhY2VmdWwgZGllIC0gdGhleSBmaW5pc2ggYWxsCi0gKiBjdXJyZW50IGpvYnMgX2FuZF8gZW1wdHkgdGhlIGxpc3RlbiBxdWV1ZSBiZWZvcmUgdGhleSBleGl0LgotICogQSBub24tZ3JhY2VmdWwgZGllIHdvdWxkIG5lZWQgYSBzZWNvbmQgZXZlbnQuIFRoZSAtWiBhcmd1bWVudCBpbgotICogdGhlIGNoaWxkIGlzIGFsc28gdXNlZCB0byBjcmVhdGUgdGhlIHNodXRkb3duIGFuZCByZXN0YXJ0IGV2ZW50cywKLSAqIHNpbmNlIHRoZSBwcmVmaXggKGFwUElEKSBjb250YWlucyB0aGUgcGFyZW50IHByb2Nlc3MgUElELgotICoKLSAqIFRoZSBjb2RlIGJlbG93IHN0YXJ0cyB3aXRoIGZ1bmN0aW9ucyBhdCB0aGUgbG93ZXN0IGxldmVsIC0KLSAqIHdvcmtlciB0aHJlYWRzLCBhbmQgd29ya3MgdXAgdG8gdGhlIHRvcCBsZXZlbCAtIHRoZSBtYWluKCkKLSAqIGZ1bmN0aW9uIG9mIHRoZSBwYXJlbnQgcHJvY2Vzcy4KLSAqCi0gKiBUaGUgc2NvcmVib2FyZCAoaW4gcHJvY2VzcyBtZW1vcnkpIGNvbnRhaW5zIGRldGFpbHMgb2YgdGhlIHdvcmtlcgotICogdGhyZWFkcyAod2l0aGluIHRoZSBhY3RpdmUgd29ya2luZyBwcm9jZXNzKS4gVGhlcmUgaXMgbm8gc2hhcmVkCi0gKiAic2NvcmVib2FyZCIgYmV0d2VlbiBwcm9jZXNzZXMsIHNpbmNlIG9ubHkgb25lIGlzIGV2ZXIgYWN0aXZlCi0gKiBhdCBvbmNlIChvciBhdCBtb3N0LCB0d28sIHdoZW4gb25lIGhhcyBiZWVuIHRvbGQgdG8gc2h1dGRvd24gYnV0Ci0gKiBpcyBwcm9jZXNzZXMgb3V0c3RhbmRpbmcgcmVxdWVzdHMsIGFuZCBhIG5ldyBvbmUgaGFzIGJlZW4gc3RhcnRlZCkuCi0gKiBUaGlzIGlzIGNvbnRyb2xsZWQgYnkgYSAic3RhcnRfbXV0ZXgiIHdoaWNoIGVuc3VyZXMgb25seSBvbmUgd29ya2luZwotICogcHJvY2VzcyBpcyBhY3RpdmUgYXQgb25jZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgY29kZSBwcm90ZWN0ZWQgYnkgI2lmZGVmIFVOR1JBQ0VGVUxfUkVTVEFSVFMvI2VuZGlmIHNlY3Rpb25zCi0gKiBjb3VsZCBpbXBsZW1lbnQgYSBzb3J0LW9mIHVuZ3JhY2VmdWwgcmVzdGFydCBmb3IgV2luMzIuIGluc3RlYWQgb2YKLSAqIGdyYWNlZnVsIHJlc3RhcnRzLiAKLSAqCi0gKiBIb3dldmVyIGl0IGRvZXMgbm90IHdvcmsgdG9vIHdlbGwgYmVjYXVzZSBpdCBkb2VzIG5vdCBpbnRlcmNlcHQgYQotICogY29ubmVjdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzIChpbiBjaGlsZF9zdWJfbWFpbigpKS4gV2UnZCBoYXZlIHRvCi0gKiBnZXQgdGhhdCB0byBwb2xsIG9uIHRoZSBleGl0IGV2ZW50LiAKLSAqLwotCi0vKgotICogRGVmaW5pdGlvbiBvZiBqb2JzLCBzaGFyZWQgYnkgbWFpbiBhbmQgd29ya2VyIHRocmVhZHMuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3Qgam9ibGlzdF9zIHsKLSAgICBzdHJ1Y3Qgam9ibGlzdF9zICpuZXh0OwotICAgIGludCBzb2NrOwotfSBqb2JsaXN0OwotCi0vKgotICogR2xvYmFscyBjb21tb24gdG8gbWFpbiBhbmQgd29ya2VyIHRocmVhZHMuIFRoaXMgc3RydWN0dXJlIGlzIG5vdAotICogdXNlZCBieSB0aGUgcGFyZW50IHByb2Nlc3MuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZ2xvYmFsc19zIHsKLSNpZmRlZiBVTkdSQUNFRlVMX1JFU1RBUlQKLSAgICBIQU5ETEUgdGhyZWFkX2V4aXRfZXZlbnQ7Ci0jZWxzZQotICAgIGludCBleGl0X25vdzsKLSNlbmRpZgotICAgIHNlbWFwaG9yZSAqam9ic2VtYXBob3JlOwotICAgIGpvYmxpc3QgKmpvYmhlYWQ7Ci0gICAgam9ibGlzdCAqam9idGFpbDsKLSAgICBtdXRleCAqam9ibXV0ZXg7Ci0gICAgaW50IGpvYmNvdW50OwotfSBnbG9iYWxzOwotCi1nbG9iYWxzIGFsbG93ZWRfZ2xvYmFscyA9Ci17MCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMH07Ci0KLS8qCi0gKiBhZGRfam9iKCkvcmVtb3ZlX2pvYigpIC0gYWRkIG9yIHJlbW92ZSBhbiBhY2NlcHRlZCBzb2NrZXQgZnJvbSB0aGUKLSAqIGxpc3Qgb2Ygc29ja2V0cyBjb25uZWN0ZWQgdG8gY2xpZW50cy4gYWxsb3dlZF9nbG9iYWxzLmpvYm11dGV4IHByb3RlY3RzCi0gKiBhZ2FpbnN0IG11bHRpcGxlIGNvbmN1cnJlbnQgYWNjZXNzIHRvIHRoZSBsaW5rZWQgbGlzdCBvZiBqb2JzLgotICovCi0KLXZvaWQgYWRkX2pvYihpbnQgc29jaykKLXsKLSAgICBqb2JsaXN0ICpuZXdfam9iOwotCi0gICAgYXBfYXNzZXJ0KGFsbG93ZWRfZ2xvYmFscy5qb2JtdXRleCk7Ci0gICAgLyogVE9ETzogSWYgdG9vIG1hbnkgam9icyBpbiBxdWV1ZSwgc2xlZXAsIGNoZWNrIGZvciBwcm9ibGVtcyAqLwotICAgIGFwX2FjcXVpcmVfbXV0ZXgoYWxsb3dlZF9nbG9iYWxzLmpvYm11dGV4KTsKLSAgICBuZXdfam9iID0gKGpvYmxpc3QgKikgbWFsbG9jKHNpemVvZihqb2JsaXN0KSk7Ci0gICAgaWYgKG5ld19qb2IgPT0gTlVMTCkgewotCWZwcmludGYoc3RkZXJyLCAiT3VjaCEgIE91dCBvZiBtZW1vcnkgaW4gYWRkX2pvYigpIVxuIik7Ci0gICAgfQotICAgIG5ld19qb2ItPm5leHQgPSBOVUxMOwotICAgIG5ld19qb2ItPnNvY2sgPSBzb2NrOwotICAgIGlmIChhbGxvd2VkX2dsb2JhbHMuam9idGFpbCAhPSBOVUxMKQotCWFsbG93ZWRfZ2xvYmFscy5qb2J0YWlsLT5uZXh0ID0gbmV3X2pvYjsKLSAgICBhbGxvd2VkX2dsb2JhbHMuam9idGFpbCA9IG5ld19qb2I7Ci0gICAgaWYgKCFhbGxvd2VkX2dsb2JhbHMuam9iaGVhZCkKLQlhbGxvd2VkX2dsb2JhbHMuam9iaGVhZCA9IG5ld19qb2I7Ci0gICAgYWxsb3dlZF9nbG9iYWxzLmpvYmNvdW50Kys7Ci0gICAgcmVsZWFzZV9zZW1hcGhvcmUoYWxsb3dlZF9nbG9iYWxzLmpvYnNlbWFwaG9yZSk7Ci0gICAgYXBfcmVsZWFzZV9tdXRleChhbGxvd2VkX2dsb2JhbHMuam9ibXV0ZXgpOwotfQotCi1pbnQgcmVtb3ZlX2pvYih2b2lkKQotewotICAgIGpvYmxpc3QgKmpvYjsKLSAgICBpbnQgc29jazsKLQotI2lmZGVmIFVOR1JBQ0VGVUxfUkVTVEFSVAotICAgIEhBTkRMRSBoT2JqZWN0c1syXTsKLSAgICBpbnQgcnY7Ci0KLSAgICBoT2JqZWN0c1swXSA9IGFsbG93ZWRfZ2xvYmFscy5qb2JzZW1hcGhvcmU7Ci0gICAgaE9iamVjdHNbMV0gPSBhbGxvd2VkX2dsb2JhbHMudGhyZWFkX2V4aXRfZXZlbnQ7Ci0KLSAgICBydiA9IFdhaXRGb3JNdWx0aXBsZU9iamVjdHMoMiwgaE9iamVjdHMsIEZBTFNFLCBJTkZJTklURSk7Ci0gICAgYXBfYXNzZXJ0KHJ2ICE9IFdBSVRfRkFJTEVEKTsKLSAgICBpZiAocnYgPT0gV0FJVF9PQkpFQ1RfMCArIDEpIHsKLQkvKiB0aHJlYWRfZXhpdF9ub3cgKi8KLS8vCUFQRDEoInRocmVhZCBnb3QgZXhpdCBub3cgZXZlbnQiKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotICAgIC8qIG11c3QgYmUgc2VtYXBob3JlICovCi0jZWxzZQotICAgIGFjcXVpcmVfc2VtYXBob3JlKGFsbG93ZWRfZ2xvYmFscy5qb2JzZW1hcGhvcmUpOwotI2VuZGlmCi0gICAgYXBfYXNzZXJ0KGFsbG93ZWRfZ2xvYmFscy5qb2JtdXRleCk7Ci0KLSNpZmRlZiBVTkdSQUNFRlVMX1JFU1RBUlQKLSAgICBpZiAoIWFsbG93ZWRfZ2xvYmFscy5qb2JoZWFkKSB7Ci0jZWxzZQotICAgIGFwX2FjcXVpcmVfbXV0ZXgoYWxsb3dlZF9nbG9iYWxzLmpvYm11dGV4KTsKLSAgICBpZiAoYWxsb3dlZF9nbG9iYWxzLmV4aXRfbm93ICYmICFhbGxvd2VkX2dsb2JhbHMuam9iaGVhZCkgewotI2VuZGlmCi0JYXBfcmVsZWFzZV9tdXRleChhbGxvd2VkX2dsb2JhbHMuam9ibXV0ZXgpOwotCXJldHVybiAoLTEpOwotICAgIH0KLSAgICBqb2IgPSBhbGxvd2VkX2dsb2JhbHMuam9iaGVhZDsKLSAgICBhcF9hc3NlcnQoam9iKTsKLSAgICBhbGxvd2VkX2dsb2JhbHMuam9iaGVhZCA9IGpvYi0+bmV4dDsKLSAgICBpZiAoYWxsb3dlZF9nbG9iYWxzLmpvYmhlYWQgPT0gTlVMTCkKLQlhbGxvd2VkX2dsb2JhbHMuam9idGFpbCA9IE5VTEw7Ci0gICAgYXBfcmVsZWFzZV9tdXRleChhbGxvd2VkX2dsb2JhbHMuam9ibXV0ZXgpOwotICAgIHNvY2sgPSBqb2ItPnNvY2s7Ci0gICAgZnJlZShqb2IpOwotICAgIHJldHVybiAoc29jayk7Ci19Ci0KLS8qCi0gKiBjaGlsZF9zdWJfbWFpbigpIC0gdGhpcyBpcyB0aGUgbWFpbiBsb29wIGZvciB0aGUgd29ya2VyIHRocmVhZHMKLSAqCi0gKiBFYWNoIHRocmVhZCBydW5zIHdpdGhpbiB0aGlzIGZ1bmN0aW9uLiBUaGV5IHdhaXQgd2l0aGluIHJlbW92ZV9qb2IoKQotICogZm9yIGEgam9iIHRvIGJlY29tZSBhdmFpbGFibGUsIHRoZW4gaGFuZGxlIGFsbCB0aGUgcmVxdWVzdHMgb24gdGhhdAotICogY29ubmVjdGlvbiB1bnRpbCBpdCBpcyBjbG9zZWQsIHRoZW4gcmV0dXJuIHRvIHJlbW92ZV9qb2IoKS4KLSAqCi0gKiBUaGUgd29ya2VyIHRocmVhZCB3aWxsIGV4aXQgd2hlbiBpdCByZW1vdmVzIGEgam9iIHdoaWNoIGNvbnRhaW5zCi0gKiBzb2NrZXQgbnVtYmVyIC0xLiBUaGlzIHByb3ZpZGVzIGEgZ3JhY2VmdWwgdGhyZWFkIGV4aXQsIHNpbmNlCi0gKiBpdCB3aWxsIG5ldmVyIGV4aXQgZHVyaW5nIGEgY29ubmVjdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaW4gdGhpcyBmdW5jdGlvbiBpcyBiYXNpY2FsbHkgZXF1aXZhbGVudCB0byB0aGUgY2hpbGRfbWFpbigpCi0gKiBmcm9tIHRoZSBtdWx0aS1wcm9jZXNzIChVbml4KSBlbnZpcm9ubWVudCwgZXhjZXB0IHRoYXQgd2UKLSAqCi0gKiAgLSBkbyBub3QgY2FsbCBjaGlsZF9pbml0X21vZHVsZXMgKGNoaWxkIGluaXQgQVBJIHBoYXNlKQotICogIC0gYmxvY2sgaW4gcmVtb3ZlX2pvYiwgYW5kIHdoZW4gdW5ibG9ja2VkIHdlIGhhdmUgYW4gYWxyZWFkeQotICogICAgYWNjZXB0ZWQgc29ja2V0LCBpbnN0ZWFkIG9mIGJsb2NraW5nIG9uIGEgbXV0ZXggb3Igc2VsZWN0KCkuCi0gKi8KLQotc3RhdGljIHZvaWQgY2hpbGRfc3ViX21haW4oaW50IGNoaWxkX251bSkKLXsKLSAgICBORVRfU0laRV9UIGNsZW47Ci0gICAgc3RydWN0IHNvY2thZGRyIHNhX3NlcnZlcjsKLSAgICBzdHJ1Y3Qgc29ja2FkZHIgc2FfY2xpZW50OwotICAgIHBvb2wgKnB0cmFuczsKLSAgICBpbnQgcmVxdWVzdHNfdGhpc19jaGlsZCA9IDA7Ci0gICAgaW50IGNzZCA9IC0xOwotICAgIGludCBkdXBwZWRfY3NkID0gLTE7Ci0gICAgaW50IHNydiA9IDA7Ci0KLSAgICAvKiBOb3RlOiBjdXJyZW50X2Nvbm4gdXNlZCB0byBiZSBhIGRlZmluZWQgYXQgZmlsZSBzY29wZSBhcyBmb2xsb3dzLi4uIFNpbmNlIHRoZSBzaWduYWwgY29kZSBpcwotICAgICAgIG5vdCBiZWluZyB1c2VkIGluIFdJTjMyLCBtYWtlIHRoZSB2YXJpYWJsZSBsb2NhbCAqLwotICAgIC8vICAgIHN0YXRpYyBBUEFDSEVfVExTIGNvbm5fcmVjICp2b2xhdGlsZSBjdXJyZW50X2Nvbm47Ci0gICAgY29ubl9yZWMgKmN1cnJlbnRfY29ubjsKLQotICAgIHB0cmFucyA9IGFwX21ha2Vfc3ViX3Bvb2wocGNvbmYpOwotCi0jaWYgMAotICAgIC8qIFpaWiBzY29yZWJvYXJkICovCi0gICAgKHZvaWQpIGFwX3VwZGF0ZV9jaGlsZF9zdGF0dXMoY2hpbGRfbnVtLCBTRVJWRVJfUkVBRFksIChyZXF1ZXN0X3JlYyAqKSBOVUxMKTsKLSNlbmRpZgotCi0gICAgLyoKLSAgICAgKiBTZXR1cCB0aGUganVtcCBidWZmZXJzIHNvIHRoYXQgd2UgY2FuIHJldHVybiBoZXJlIGFmdGVyIGEgdGltZW91dC4KLSAgICAgKi8KLSNpZiAwIC8qIFpaWiAqLwotI2lmIGRlZmluZWQoVVNFX0xPTkdKTVApCi0gICAgc2V0am1wKGptcGJ1ZmZlcik7Ci0jZWxzZQotICAgIHNpZ3NldGptcChqbXBidWZmZXIsIDEpOwotI2VuZGlmCi0jaWZkZWYgU0lHVVJHCi0gICAgc2lnbmFsKFNJR1VSRywgdGltZW91dCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0gICAgd2hpbGUgKDEpIHsKLQlCVUZGICpjb25uX2lvOwotCXJlcXVlc3RfcmVjICpyOwotCi0JLyoKLQkgKiAoUmUpaW5pdGlhbGl6ZSB0aGlzIGNoaWxkIHRvIGEgcHJlLWNvbm5lY3Rpb24gc3RhdGUuCi0JICovCi0jaWYgMCAgIC8qIFpaWiBBbGFybXMuLi4gKi8KLQlhcF9zZXRfY2FsbGJhY2tfYW5kX2FsYXJtKE5VTEwsIDApOyAvKiBDYW5jZWwgYW55IG91dHN0YW5kaW5nIGFsYXJtcyAqLwotI2VuZGlmCi0jaWYgMCAgIC8qIFpaWiB3aGF0IGlzIHRoaXM/IEl0J3Mgbm90IHRocmVhZCBzYWZlISAqLwotCXRpbWVvdXRfcmVxID0gTlVMTDsgICAgICAgICAgICAgICAgIC8qIE5vIHJlcXVlc3QgaW4gcHJvZ3Jlc3MgKi8KLSNlbmRpZgotCWN1cnJlbnRfY29ubiA9IE5VTEw7Ci0KLQlhcF9jbGVhcl9wb29sKHB0cmFucyk7Ci0KLSNpZiAwCi0gICAgICAgIC8qIFpaWiBzY29yZWJvYXJkICovCi0JKHZvaWQpIGFwX3VwZGF0ZV9jaGlsZF9zdGF0dXMoY2hpbGRfbnVtLCBTRVJWRVJfUkVBRFksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotI2VuZGlmCi0KLQkvKiBHZXQgam9iIGZyb20gdGhlIGpvYiBsaXN0LiBUaGlzIHdpbGwgYmxvY2sgdW50aWwgYSBqb2IgaXMgcmVhZHkuCi0JICogSWYgLTEgaXMgcmV0dXJuZWQgdGhlbiB0aGUgbWFpbiB0aHJlYWQgd2FudHMgdXMgdG8gZXhpdC4KLQkgKi8KLQljc2QgPSByZW1vdmVfam9iKCk7Ci0JaWYgKGNzZCA9PSAtMSkKLQkgICAgYnJlYWs7CQkvKiB0aW1lIHRvIGV4aXQgKi8KLQlyZXF1ZXN0c190aGlzX2NoaWxkKys7Ci0KLQlhcF9ub3RlX2NsZWFudXBzX2Zvcl9zb2NrZXQocHRyYW5zLCBjc2QpOwotCi0JLyoKLQkgKiBXZSBub3cgaGF2ZSBhIGNvbm5lY3Rpb24sIHNvIHNldCBpdCB1cCB3aXRoIHRoZSBhcHByb3ByaWF0ZQotCSAqIHNvY2tldCBvcHRpb25zLCBmaWxlIGRlc2NyaXB0b3JzLCBhbmQgcmVhZC93cml0ZSBidWZmZXJzLgotCSAqLwotCi0JY2xlbiA9IHNpemVvZihzYV9zZXJ2ZXIpOwotCWlmIChnZXRzb2NrbmFtZShjc2QsICZzYV9zZXJ2ZXIsICZjbGVuKSA8IDApIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIHNlcnZlcl9jb25mLCAiZ2V0c29ja25hbWUiKTsKLQkgICAgY29udGludWU7Ci0JfQotCWNsZW4gPSBzaXplb2Yoc2FfY2xpZW50KTsKLQlpZiAoKGdldHBlZXJuYW1lKGNzZCwgJnNhX2NsaWVudCwgJmNsZW4pKSA8IDApIHsKLQkgICAgLyogZ2V0IHBlZXJuYW1lIHdpbGwgZmFpbCBpZiB0aGUgaW5wdXQgaXNuJ3QgYSBzb2NrZXQgKi8KLQkgICAgcGVycm9yKCJnZXRwZWVybmFtZSIpOwotCSAgICBtZW1zZXQoJnNhX2NsaWVudCwgJ1wwJywgc2l6ZW9mKHNhX2NsaWVudCkpOwotCX0KLQotCXNvY2tfZGlzYWJsZV9uYWdsZShjc2QpOwotI2lmIDAKLSAgICAgICAgLyogWlpaIHNjb3JlYm9hcmQgKi8KLQkodm9pZCkgYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhjaGlsZF9udW0sIFNFUlZFUl9CVVNZX1JFQUQsCi0JCQkJICAgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotI2VuZGlmCi0KLS8qIFpaWiAuIFRoaXMgd2lsbCBicmVhayBDR0lzIHNpbmNlIHRoZXkgbmVlZCB0byBrbm93IHdoZXRoZXIgYSBmZCBpcyBhIHNvY2tldCBvcgotICAgYSBmaWxlIGhhbmRsZS4uLiBGaXggd2l0aCBBUFIKLSovCi0JY29ubl9pbyA9IGFwX2JjcmVhdGUocHRyYW5zLCBCX1JEV1IgfCBCX1NPQ0tFVCk7Ci0vLwljb25uX2lvID0gYXBfYmNyZWF0ZShwdHJhbnMsIEJfUkRXUik7Ci0JZHVwcGVkX2NzZCA9IGNzZDsKLSNpZiBkZWZpbmVkKE5FRURfRFVQUEVEX0NTRCkKLQlpZiAoKGR1cHBlZF9jc2QgPSBkdXAoY3NkKSkgPCAwKSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHNlcnZlcl9jb25mLAotCQkJImR1cDogY291bGRuJ3QgZHVwbGljYXRlIGNzZCIpOwotCSAgICBkdXBwZWRfY3NkID0gY3NkOwkvKiBPaCB3ZWxsLi4uICovCi0JfQotCWFwX25vdGVfY2xlYW51cHNfZm9yX3NvY2tldChwdHJhbnMsIGR1cHBlZF9jc2QpOwotI2VuZGlmCi0gICAgICAgIGFwX2JwdXNoZmQoY29ubl9pbywgY3NkKTsgLyogYXBfYnB1c2hmZChjb25uX2lvLCBjc2QsIGR1cHBlZF9jc2QpOyB3aHkgZGlkIHdlIGRyb3AgZHVwZWQgZmQ/ICovCi0gICAgICAgIAotCWN1cnJlbnRfY29ubiA9IGFwX25ld19jb25uZWN0aW9uKHB0cmFucywgc2VydmVyX2NvbmYsIGNvbm5faW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJnNhX2NsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmc2Ffc2VydmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF9udW0sIDApOyAvKiBTZXQgbXlfdGhyZWFkX251bSB0byAwIGZvciBub3cgKi8KLSAgICAgICAgCi0gICAgICAgIGFwX3Byb2Nlc3NfY29ubmVjdGlvbihjdXJyZW50X2Nvbm4pOwotICAgIH0gICAgICAgIAotfQotCi0KLXZvaWQgY2hpbGRfbWFpbihpbnQgY2hpbGRfbnVtX2FyZykKLXsKLSAgICAvKgotICAgICAqIE9ubHkgcmVhc29uIGZvciB0aGlzIGZ1bmN0aW9uLCBpcyB0byBwYXNzIGluCi0gICAgICogYXJndW1lbnRzIHRvIGNoaWxkX3N1Yl9tYWluKCkgb24gaXRzIHN0YWNrIHNvCi0gICAgICogdGhhdCBsb25nanVtcCBkb2Vzbid0IHRyeSB0byBjb3JydXB0IGl0cyBsb2NhbAotICAgICAqIHZhcmlhYmxlcyBhbmQgSSBkb24ndCBuZWVkIHRvIG1ha2UgdGhvc2UKLSAgICAgKiBkYW1uIHZhcmlhYmxlcyBzdGF0aWMvZ2xvYmFsCi0gICAgICovCi0gICAgY2hpbGRfc3ViX21haW4oY2hpbGRfbnVtX2FyZyk7Ci19Ci0KLQotCi12b2lkIGNsZWFudXBfdGhyZWFkKHRocmVhZCAqKmhhbmRsZXMsIGludCAqdGhyZWFkX2NudCwgaW50IHRocmVhZF90b19jbGVhbikKLXsKLSAgICBpbnQgaTsKLQotICAgIGZyZWVfdGhyZWFkKGhhbmRsZXNbdGhyZWFkX3RvX2NsZWFuXSk7Ci0gICAgZm9yIChpID0gdGhyZWFkX3RvX2NsZWFuOyBpIDwgKCgqdGhyZWFkX2NudCkgLSAxKTsgaSsrKQotCWhhbmRsZXNbaV0gPSBoYW5kbGVzW2kgKyAxXTsKLSAgICAoKnRocmVhZF9jbnQpLS07Ci19Ci0KLS8qCi0gKiBUaGUgV2luMzIgY2FsbCBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzIHdpbGwgb25seSBhbGxvdyB5b3UgdG8gd2FpdCBmb3IgCi0gKiBhIG1heGltdW0gb2YgTUFYSU1VTV9XQUlUX09CSkVDVFMgKGN1cnJlbnQgNjQpLiAgU2luY2UgdGhlIHRocmVhZGluZyAKLSAqIG1vZGVsIGluIHRoZSBtdWx0aXRocmVhZGVkIHZlcnNpb24gb2YgYXBhY2hlIHdhbnRzIHRvIHVzZSB0aGlzIGNhbGwsIAotICogd2UgYXJlIHJlc3RyaWN0ZWQgdG8gYSBtYXhpbXVtIG9mIDY0IHRocmVhZHMuICBUaGlzIGlzIGEgc2ltcGxpc3RpYyAKLSAqIHJvdXRpbmUgdGhhdCB3aWxsIGluY3JlYXNlIHRoaXMgc2l6ZS4KLSAqLwotc3RhdGljIERXT1JEIHdhaXRfZm9yX21hbnlfb2JqZWN0cyhEV09SRCBuQ291bnQsIENPTlNUIEhBTkRMRSAqbHBIYW5kbGVzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1NlY29uZHMpCi17Ci0gICAgdGltZV90IHRTdG9wVGltZTsKLSAgICBEV09SRCBkd1JldCA9IFdBSVRfVElNRU9VVDsKLSAgICBEV09SRCBkd0luZGV4PTA7Ci0gICAgQk9PTCBiRmlyc3QgPSBUUlVFOwotICAKLSAgICB0U3RvcFRpbWUgPSB0aW1lKE5VTEwpICsgZHdTZWNvbmRzOwotICAKLSAgICBkbyB7Ci0gICAgICAgIGlmICghYkZpcnN0KQotICAgICAgICAgICAgU2xlZXAoMTAwMCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJGaXJzdCA9IEZBTFNFOwotICAgICAgICAgIAotICAgICAgICBmb3IgKGR3SW5kZXggPSAwOyBkd0luZGV4ICogTUFYSU1VTV9XQUlUX09CSkVDVFMgPCBuQ291bnQ7IGR3SW5kZXgrKykgewotICAgICAgICAgICAgZHdSZXQgPSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKAotICAgICAgICAgICAgICAgICAgICAgICAgbWluKE1BWElNVU1fV0FJVF9PQkpFQ1RTLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ291bnQgLSAoZHdJbmRleCAqIE1BWElNVU1fV0FJVF9PQkpFQ1RTKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBscEhhbmRsZXMgKyAoZHdJbmRleCAqIE1BWElNVU1fV0FJVF9PQkpFQ1RTKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAwLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChkd1JldCAhPSBXQUlUX1RJTUVPVVQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlKCh0aW1lKE5VTEwpIDwgdFN0b3BUaW1lKSAmJiAoZHdSZXQgPT0gV0FJVF9USU1FT1VUKSk7Ci0gICAgCi0gICAgcmV0dXJuIGR3UmV0OwotfQotCi0vL2V4dGVybiB2b2lkIG1haW5fY29udHJvbF9zZXJ2ZXIodm9pZCAqKTsgLyogaW4gaGVsbG9wLmMgKi8KLQotI2RlZmluZSBNQVhfU0VMRUNUX0VSUk9SUyAxMDAKLQotLyoKLSAqIEluaXRpYWxpc2UgdGhlIHNpZ25hbCBuYW1lcywgaW4gdGhlIGdsb2JhbCB2YXJpYWJsZXMgc2lnbmFsX25hbWVfcHJlZml4LCAKLSAqIHNpZ25hbF9yZXN0YXJ0X25hbWUgYW5kIHNpZ25hbF9zaHV0ZG93bl9uYW1lLgotICovCi0KLSNkZWZpbmUgTUFYX1NJR05BTF9OQU1FIDMwICAvKiBMb25nIGVub3VnaCBmb3IgYXBQSURfc2h1dGRvd24sIHdoZXJlIFBJRCBpcyBhbiBpbnQgKi8KLWNoYXIgc2lnbmFsX25hbWVfcHJlZml4W01BWF9TSUdOQUxfTkFNRV07Ci1jaGFyIHNpZ25hbF9yZXN0YXJ0X25hbWVbTUFYX1NJR05BTF9OQU1FXTsgCi1jaGFyIHNpZ25hbF9zaHV0ZG93bl9uYW1lW01BWF9TSUdOQUxfTkFNRV07Ci1zdGF0aWMgdm9pZCBzZXR1cF9zaWduYWxfbmFtZXMoY2hhciAqcHJlZml4KQotewotICAgIGFwX3NucHJpbnRmKHNpZ25hbF9uYW1lX3ByZWZpeCwgc2l6ZW9mKHNpZ25hbF9uYW1lX3ByZWZpeCksIHByZWZpeCk7ICAgIAotICAgIGFwX3NucHJpbnRmKHNpZ25hbF9zaHV0ZG93bl9uYW1lLCBzaXplb2Yoc2lnbmFsX3NodXRkb3duX25hbWUpLCAKLQkiJXNfc2h1dGRvd24iLCBzaWduYWxfbmFtZV9wcmVmaXgpOyAgICAKLSAgICBhcF9zbnByaW50ZihzaWduYWxfcmVzdGFydF9uYW1lLCBzaXplb2Yoc2lnbmFsX3Jlc3RhcnRfbmFtZSksIAotCSIlc19yZXN0YXJ0Iiwgc2lnbmFsX25hbWVfcHJlZml4KTsgICAgCi19Ci0KLXN0YXRpYyB2b2lkIHNldHVwX2luaGVyaXRlZF9saXN0ZW5lcnMocG9vbCAqcCkKLXsKLSAgICBIQU5ETEUgcGlwZTsKLSAgICBhcF9saXN0ZW5fcmVjICpscjsKLSAgICBpbnQgZmQ7Ci0gICAgV1NBUFJPVE9DT0xfSU5GTyBXU0FQcm90b2NvbEluZm87Ci0gICAgRFdPUkQgQnl0ZXNSZWFkOwotCi0gICAgLyogT3BlbiB0aGUgcGlwZSB0byB0aGUgcGFyZW50IHByb2Nlc3MgdG8gcmVjZWl2ZSB0aGUgaW5oZXJpdGVkIHNvY2tldAotICAgICAqIGRhdGEuIFRoZSBzb2NrZXRzIGhhdmUgYmVlbiBzZXQgdG8gbGlzdGVuaW5nIGluIHRoZSBwYXJlbnQgcHJvY2Vzcy4KLSAgICAgKi8KLSAgICBwaXBlID0gR2V0U3RkSGFuZGxlKFNURF9JTlBVVF9IQU5ETEUpOwotCi0gICAgLyogU2V0dXAgdGhlIGxpc3RlbmVycyAqLwotICAgIGxpc3Rlbm1heGZkID0gLTE7Ci0gICAgRkRfWkVSTygmbGlzdGVuZmRzKTsKLSAgICBsciA9IGFwX2xpc3RlbmVyczsKLQotICAgIEZEX1pFUk8oJmxpc3RlbmZkcyk7Ci0KLSAgICBmb3IgKDs7KSB7Ci0JZmQgPSBmaW5kX2xpc3RlbmVyKGxyKTsKLQlpZiAoZmQgPCAwKSB7Ci0gICAgICAgICAgICBpZiAoIVJlYWRGaWxlKHBpcGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAmV1NBUHJvdG9jb2xJbmZvLCBzaXplb2YoV1NBUFJPVE9DT0xfSU5GTyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZCeXRlc1JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChMUE9WRVJMQVBQRUQpIE5VTEwpKXsKLSAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0lOMzJFUlJPUnxBUExPR19DUklULCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldHVwX2luaGVyaXRlZF9saXN0ZW5lcnM6IFVuYWJsZSB0byByZWFkIHNvY2tldCBkYXRhIGZyb20gcGFyZW50Iik7Ci0gICAgICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZkID0gV1NBU29ja2V0KEZST01fUFJPVE9DT0xfSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST01fUFJPVE9DT0xfSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST01fUFJPVE9DT0xfSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZXU0FQcm90b2NvbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgICAgICBpZiAoZmQgPT0gSU5WQUxJRF9TT0NLRVQpIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0lOMzJFUlJPUnxBUExPR19DUklULCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldHVwX2luaGVyaXRlZF9saXN0ZW5lcnM6IFdTQVNvY2tldCBmYWlsZWQgdG8gZ2V0IGluaGVyaXQgdGhlIHNvY2tldC4iKTsKLSAgICAgICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgICAgfQotLy8gICAgICAgICAgICBBUEQyKCJzZXR1cF9pbmhlcml0ZWRfbGlzdGVuZXJzOiBXU0FTb2NrZXQoKSByZXR1cm5lZCBzb2NrZXQgJWQiLCBmZCk7Ci0JfQotCWVsc2UgewotCSAgICBhcF9ub3RlX2NsZWFudXBzX2Zvcl9zb2NrZXQocCwgZmQpOwotCX0KLQlpZiAoZmQgPj0gMCkgewotCSAgICBGRF9TRVQoZmQsICZsaXN0ZW5mZHMpOwotCSAgICBpZiAoZmQgPiBsaXN0ZW5tYXhmZCkKLQkJbGlzdGVubWF4ZmQgPSBmZDsKLQl9Ci0JbHItPmZkID0gZmQ7Ci0JaWYgKGxyLT5uZXh0ID09IE5VTEwpCi0JICAgIGJyZWFrOwotCWxyID0gbHItPm5leHQ7Ci0gICAgfQotICAgIC8qIHR1cm4gdGhlIGxpc3QgaW50byBhIHJpbmcgKi8KLSAgICBsci0+bmV4dCA9IGFwX2xpc3RlbmVyczsKLSAgICBoZWFkX2xpc3RlbmVyID0gYXBfbGlzdGVuZXJzOwotICAgIGNsb3NlX3VudXNlZF9saXN0ZW5lcnMoKTsKLSAgICBDbG9zZUhhbmRsZShwaXBlKTsKLSAgICByZXR1cm47Ci19Ci0KLS8qCi0gKiB3b3JrZXJfbWFpbigpIGlzIG1haW4gbG9vcCBmb3IgdGhlIGNoaWxkIHByb2Nlc3MuIFRoZSBsb29wIGluCi0gKiB0aGlzIGZ1bmN0aW9uIGJlY29tZXMgdGhlIGNvbnRyb2xsaW5nIHRocmVhZCBmb3IgdGhlIGFjdHVhbGx5IHdvcmtpbmcKLSAqIHRocmVhZHMgKHdoaWNoIHJ1biBpbiBhIGxvb3AgaW4gY2hpbGRfc3ViX21haW4oKSkuCi0gKi8KLQotdm9pZCB3b3JrZXJfbWFpbih2b2lkKQotewotICAgIGludCBudGhyZWFkczsKLSAgICBmZF9zZXQgbWFpbl9mZHM7Ci0gICAgaW50IHNydjsKLSAgICBpbnQgY2xlbjsKLSAgICBpbnQgY3NkOwotICAgIGludCBzZCA9IC0xOyAvLyBtYWRlIHRoaXMgbG9jYWwgYW5kIG5vdCBnbG9iYWwKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2FfY2xpZW50OwotICAgIGludCB0b3RhbF9qb2JzID0gMDsKLSAgICB0aHJlYWQgKipjaGlsZF9oYW5kbGVzOwotICAgIGludCBydjsKLSAgICB0aW1lX3QgZW5kX3RpbWU7Ci0gICAgaW50IGk7Ci0gICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gICAgaW50IHdhaXRfdGltZSA9IDE7Ci0gICAgSEFORExFIGhPYmplY3RzWzJdOwotICAgIGludCBjb3VudF9zZWxlY3RfZXJyb3JzID0gMDsKLSAgICBwb29sICpwY2hpbGQ7Ci0KLSAgICBwY2hpbGQgPSBhcF9tYWtlX3N1Yl9wb29sKHBjb25mKTsKLQotLy8gICAgYXBfc3RhbmRhbG9uZSA9IDE7Ci0vLyAgICBzZCA9IC0xOyA/PyB0aGlzIHZhcmlhYmxlIGlzIGdsb2JhbCBpbiAxLjMueCEKLSAgICBudGhyZWFkcyA9IGFwX3RocmVhZHNfcGVyX2NoaWxkOwotCi0gICAgaWYgKG50aHJlYWRzIDw9IDApIC8qIG1heWJlIHRoaXMgaXMgbm90IG5lZWRlZC4uLiBTaG91bGQgYmUgY2hlY2tlZCBpbiBjb25maWcuLi4gKi8KLQludGhyZWFkcyA9IDE7Ci0KLSAgICBteV9waWQgPSBnZXRwaWQoKTsKLQotCi0gICAgYXBfcmVzdGFydF90aW1lID0gdGltZShOVUxMKTsKLQotLy8gICAgcmVpbml0X3Njb3JlYm9hcmQocGNvbmYpOwotCi0gICAgLyoKLSAgICAgKiBXYWl0IHVudGlsIHdlIGhhdmUgcGVybWlzc2lvbiB0byBzdGFydCBhY2NlcHRpbmcgY29ubmVjdGlvbnMuCi0gICAgICogc3RhcnRfbXV0ZXggaXMgdXNlZCB0byBlbnN1cmUgdGhhdCBvbmx5IG9uZSBjaGlsZCBldmVyCi0gICAgICogZ29lcyBpbnRvIHRoZSBsaXN0ZW4vYWNjZXB0IGxvb3AgYXQgb25jZS4gQWxzbyB3YWl0IG9uIGV4aXRfZXZlbnQsCi0gICAgICogaW4gY2FzZSB3ZSAodGhpcyBjaGlsZCkgaXMgdG9sZCB0byBkaWUgYmVmb3JlIHdlIGdldCBhIGNoYW5jZSB0bwotICAgICAqIHNlcnZlIGFueSByZXF1ZXN0cy4KLSAgICAgKi8KLSAgICBoT2JqZWN0c1swXSA9IChIQU5ETEUpc3RhcnRfbXV0ZXg7Ci0gICAgaE9iamVjdHNbMV0gPSAoSEFORExFKWV4aXRfZXZlbnQ7Ci0gICAgcnYgPSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKDIsIGhPYmplY3RzLCBGQUxTRSwgSU5GSU5JVEUpOwotICAgIGlmIChydiA9PSBXQUlUX0ZBSUxFRCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLEFQTE9HX0VSUnxBUExPR19XSU4zMkVSUk9SLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJXYWl0aW5nIGZvciBzdGFydF9tdXRleCBvciBleGl0X2V2ZW50IC0tIHByb2Nlc3Mgd2lsbCBleGl0Iik7Ci0KLQlhcF9kZXN0cm95X3Bvb2wocGNoaWxkKTsKLS8vCWNsZWFudXBfc2NvcmVib2FyZCgpOwotCWV4aXQoMCk7Ci0gICAgfQotICAgIGlmIChydiA9PSBXQUlUX09CSkVDVF8wICsgMSkgewotCS8qIGV4aXQgZXZlbnQgc2lnbmFsbGVkIC0gZXhpdCBub3cgKi8KLQlhcF9kZXN0cm95X3Bvb2wocGNoaWxkKTsKLS8vCWNsZWFudXBfc2NvcmVib2FyZCgpOwotCWV4aXQoMCk7Ci0gICAgfQotICAgIC8qIHN0YXJ0X211dGV4IG9idGFpbmVkLCBjb250aW51ZSBpbnRvIHRoZSBzZWxlY3QoKSBsb29wICovCi0gICAgaWYgKG9uZV9wcm9jZXNzKSB7Ci0gICAgICAgIHNldHVwX2xpc3RlbmVycyhwY29uZiwgc2VydmVyX2NvbmYpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIEdldCBsaXN0ZW5lcnMgZnJvbSB0aGUgcGFyZW50IHByb2Nlc3MgKi8KLSAgICAgICAgc2V0dXBfaW5oZXJpdGVkX2xpc3RlbmVycyhwY29uZik7Ci0gICAgfQotCi0gICAgaWYgKGxpc3Rlbm1heGZkID09IC0xKSB7Ci0JLyogSGVscCwgbm8gc29ja2V0cyB3ZXJlIG1hZGUsIGJldHRlciBsb2cgc29tZXRoaW5nIGFuZCBleGl0ICovCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0NSSVR8QVBMT0dfTk9FUlJOTywgTlVMTCwKLQkJICAgICJObyBzb2NrZXRzIHdlcmUgY3JlYXRlZCBmb3IgbGlzdGVuaW5nIik7Ci0KLQlzaWduYWxfcGFyZW50KDApOwkvKiB0ZWxsIHBhcmVudCB0byBkaWUgKi8KLQotCWFwX2Rlc3Ryb3lfcG9vbChwY2hpbGQpOwotLy8JY2xlYW51cF9zY29yZWJvYXJkKCk7Ci0JZXhpdCgwKTsKLSAgICB9Ci0vLyAgICBzZXRfc2lnbmFscygpOwotCi0vLyAgICBhcF9jaGlsZF9pbml0X21vZHVsZXMocGNvbmYsIHNlcnZlcl9jb25mKTsKLQotICAgIGFsbG93ZWRfZ2xvYmFscy5qb2JzZW1hcGhvcmUgPSBjcmVhdGVfc2VtYXBob3JlKDApOwotICAgIGFsbG93ZWRfZ2xvYmFscy5qb2JtdXRleCA9IGFwX2NyZWF0ZV9tdXRleChOVUxMKTsKLQotICAgIC8qIHNwYXduIG9mZiB0aGUgdGhyZWFkcyAqLwotICAgIGNoaWxkX2hhbmRsZXMgPSAodGhyZWFkICopIGFsbG9jYShudGhyZWFkcyAqIHNpemVvZihpbnQpKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgewotCWNoaWxkX2hhbmRsZXNbaV0gPSBjcmVhdGVfdGhyZWFkKCh2b2lkICgqKSh2b2lkICopKSBjaGlsZF9tYWluLCAodm9pZCAqKSBpKTsKLSAgICB9Ci0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoYXBfbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCAmJiAodG90YWxfam9icyA+IGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQpKSB7Ci0gICAgICAgICAgICAvKiBNYXhSZXF1ZXN0c1BlckNoaWxkIGhpdC4uLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBicmVhazsKLQl9Ci0gICAgICAgIC8qIEFsd2F5cyBjaGVjayBmb3IgdGhlIGV4aXQgZXZlbnQgYmVpbmcgc2lnbmFsZWQuCi0gICAgICAgICAqLwotICAgICAgICBydiA9IFdhaXRGb3JTaW5nbGVPYmplY3QoZXhpdF9ldmVudCwgMCk7Ci0gICAgICAgIGFwX2Fzc2VydCgocnYgPT0gV0FJVF9USU1FT1VUKSB8fCAocnYgPT0gV0FJVF9PQkpFQ1RfMCkpOwotICAgICAgICBpZiAocnYgPT0gV0FJVF9PQkpFQ1RfMCkgewotLy8gICAgICAgICAgICBBUEQxKCJjaGlsZDogZXhpdCBldmVudCBzaWduYWxsZWQsIGV4aXRpbmciKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLQl0di50dl9zZWMgPSB3YWl0X3RpbWU7Ci0JdHYudHZfdXNlYyA9IDA7Ci0KLQltZW1jcHkoJm1haW5fZmRzLCAmbGlzdGVuZmRzLCBzaXplb2YoZmRfc2V0KSk7Ci0Jc3J2ID0gYXBfc2VsZWN0KGxpc3Rlbm1heGZkICsgMSwgJm1haW5fZmRzLCBOVUxMLCBOVUxMLCAmdHYpOwotI2lmZGVmIFdJTjMyCi0JaWYgKHNydiA9PSBTT0NLRVRfRVJST1IpIHsKLQkgICAgLyogTWFwIHRoZSBXaW4zMiBlcnJvciBpbnRvIGEgc3RhbmRhcmQgVW5peCBlcnJvciBjb25kaXRpb24gKi8KLQkgICAgZXJybm8gPSBXU0FHZXRMYXN0RXJyb3IoKTsKLQkgICAgc3J2ID0gLTE7Ci0JfQotI2VuZGlmIC8qIFdJTjMyICovCi0KLQlpZiAoc3J2IDwgMCkgewotCSAgICAvKiBFcnJvciBvY2N1cnJlZCAtIGlmIEVJTlRSLCBsb29wIGFyb3VuZCB3aXRoIHByb2JsZW0gKi8KLQkgICAgaWYgKGVycm5vICE9IEVJTlRSKSB7Ci0JCS8qIEEgInJlYWwiIGVycm9yIG9jY3VycmVkLCBsb2cgaXQgYW5kIGluY3JlbWVudCB0aGUgY291bnQgb2YKLQkJICogc2VsZWN0IGVycm9ycy4gVGhpcyBjb3VudCBpcyB1c2VkIHRvIGVuc3VyZSB3ZSBkb24ndCBnbyBpbnRvCi0JCSAqIGEgYnVzeSBsb29wIG9mIGNvbnRpbnVvdXMgZXJyb3JzLgotCQkgKi8KLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgc2VydmVyX2NvbmYsICJzZWxlY3Q6IChsaXN0ZW4pIik7Ci0JCWNvdW50X3NlbGVjdF9lcnJvcnMrKzsKLQkJaWYgKGNvdW50X3NlbGVjdF9lcnJvcnMgPiBNQVhfU0VMRUNUX0VSUk9SUykgewotCQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUnxBUExPR19OT0VSUk5PLCBzZXJ2ZXJfY29uZiwKLQkJCSJUb28gbWFueSBlcnJvcnMgaW4gc2VsZWN0IGxvb3AuIENoaWxkIHByb2Nlc3MgZXhpdGluZy4iKTsKLQkJICAgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgICAgY29udGludWU7Ci0JfQotCWNvdW50X3NlbGVjdF9lcnJvcnMgPSAwOyAgICAvKiByZXNldCBjb3VudCBvZiBlcnJvcnMgKi8KLQlpZiAoc3J2ID09IDApIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCX0KLQotCXsKLQkgICAgYXBfbGlzdGVuX3JlYyAqbHI7Ci0KLQkgICAgbHIgPSBmaW5kX3JlYWR5X2xpc3RlbmVyKCZtYWluX2Zkcyk7Ci0JICAgIGlmIChsciAhPSBOVUxMKSB7Ci0JCXNkID0gbHItPmZkOwotCSAgICB9Ci0JfQotCWRvIHsKLQkgICAgY2xlbiA9IHNpemVvZihzYV9jbGllbnQpOwotCSAgICBjc2QgPSBhY2NlcHQoc2QsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhX2NsaWVudCwgJmNsZW4pOwotI2lmZGVmIFdJTjMyCi0JICAgIGlmIChjc2QgPT0gSU5WQUxJRF9TT0NLRVQpIHsKLQkJY3NkID0gLTE7Ci0JCWVycm5vID0gV1NBR2V0TGFzdEVycm9yKCk7Ci0JICAgIH0KLSNlbmRpZiAvKiBXSU4zMiAqLwotCX0gd2hpbGUgKGNzZCA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0JaWYgKGNzZCA8IDApIHsKLSNpZiBkZWZpbmVkKEVQUk9UTykgJiYgZGVmaW5lZChFQ09OTkFCT1JURUQpCi0JICAgIGlmICgoZXJybm8gIT0gRVBST1RPKSAmJiAoZXJybm8gIT0gRUNPTk5BQk9SVEVEKSkKLSNlbGlmIGRlZmluZWQoRVBST1RPKQotCSAgICBpZiAoZXJybm8gIT0gRVBST1RPKQotI2VsaWYgZGVmaW5lZChFQ09OTkFCT1JURUQpCi0JICAgIGlmIChlcnJubyAhPSBFQ09OTkFCT1JURUQpCi0jZW5kaWYKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgc2VydmVyX2NvbmYsCi0JCQkgICAgImFjY2VwdDogKGNsaWVudCBzb2NrZXQpIik7Ci0JfQotCWVsc2UgewotCSAgICBhZGRfam9iKGNzZCk7Ci0JICAgIHRvdGFsX2pvYnMrKzsKLQl9Ci0gICAgfQotICAgICAgCi0vLyAgICBBUEQyKCJwcm9jZXNzIFBJRCAlZCBleGl0aW5nIiwgbXlfcGlkKTsKLQotICAgIC8qIEdldCByZWFkeSB0byBzaHV0ZG93biBhbmQgZXhpdCAqLwotICAgIGFsbG93ZWRfZ2xvYmFscy5leGl0X25vdyA9IDE7Ci0gICAgYXBfcmVsZWFzZV9tdXRleChzdGFydF9tdXRleCk7Ci0KLSNpZmRlZiBVTkdSQUNFRlVMX1JFU1RBUlQKLSAgICBTZXRFdmVudChhbGxvd2VkX2dsb2JhbHMudGhyZWFkX2V4aXRfZXZlbnQpOwotI2Vsc2UKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgewotCWFkZF9qb2IoLTEpOwotICAgIH0KLSNlbmRpZgotCi0vLyAgICBBUEQyKCJwcm9jZXNzIFBJRCAlZCB3YWl0aW5nIGZvciB3b3JrZXIgdGhyZWFkcyB0byBleGl0IiwgbXlfcGlkKTsKLSAgICAvKiBXYWl0IGZvciBhbGwgeW91ciBjaGlsZHJlbiAqLwotICAgIGVuZF90aW1lID0gdGltZShOVUxMKSArIDE4MDsKLSAgICB3aGlsZSAobnRocmVhZHMpIHsKLSAgICAgICAgcnYgPSB3YWl0X2Zvcl9tYW55X29iamVjdHMobnRocmVhZHMsIGNoaWxkX2hhbmRsZXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfdGltZSAtIHRpbWUoTlVMTCkpOwotCWlmIChydiAhPSBXQUlUX1RJTUVPVVQpIHsKLQkgICAgcnYgPSBydiAtIFdBSVRfT0JKRUNUXzA7Ci0JICAgIGFwX2Fzc2VydCgocnYgPj0gMCkgJiYgKHJ2IDwgbnRocmVhZHMpKTsKLQkgICAgY2xlYW51cF90aHJlYWQoY2hpbGRfaGFuZGxlcywgJm50aHJlYWRzLCBydik7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQlicmVhazsKLSAgICB9Ci0KLS8vICAgIEFQRDIoInByb2Nlc3MgUElEICVkIGtpbGxpbmcgcmVtYWluaW5nIHdvcmtlciB0aHJlYWRzIiwgbXlfcGlkKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgewotCWtpbGxfdGhyZWFkKGNoaWxkX2hhbmRsZXNbaV0pOwotCWZyZWVfdGhyZWFkKGNoaWxkX2hhbmRsZXNbaV0pOwotICAgIH0KLSNpZmRlZiBVTkdSQUNFRlVMX1JFU1RBUlQKLSAgICBhcF9hc3NlcnQoQ2xvc2VIYW5kbGUoYWxsb3dlZF9nbG9iYWxzLnRocmVhZF9leGl0X2V2ZW50KSk7Ci0jZW5kaWYKLSAgICBkZXN0cm95X3NlbWFwaG9yZShhbGxvd2VkX2dsb2JhbHMuam9ic2VtYXBob3JlKTsKLSAgICBhcF9kZXN0cm95X211dGV4KGFsbG93ZWRfZ2xvYmFscy5qb2JtdXRleCk7Ci0KLS8vICAgIGFwX2NoaWxkX2V4aXRfbW9kdWxlcyhwY29uZiwgc2VydmVyX2NvbmYpOwotICAgIGFwX2Rlc3Ryb3lfcG9vbChwY2hpbGQpOwotCi0vLyAgICBjbGVhbnVwX3Njb3JlYm9hcmQoKTsKLQotLy8gICAgQVBEMigicHJvY2VzcyBQSUQgJWQgZXhpdGVkIiwgbXlfcGlkKTsKLS8vICAgIGNsZWFuX3BhcmVudF9leGl0KDApOwotfQkJCQkvKiBzdGFuZGFsb25lX21haW4gKi8KLQotLyoKLSAqIFNwYXduIGEgY2hpbGQgQXBhY2hlIHByb2Nlc3MuIFRoZSBjaGlsZCBwcm9jZXNzIGhhcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmcm9tCi0gKiBhcmdjIGFuZCBhcmd2W10sIHBsdXMgYSAtWiBhcmd1bWVudCBnaXZpbmcgdGhlIG5hbWUgb2YgYW4gZXZlbnQuIFRoZSBjaGlsZCBzaG91bGQKLSAqIG9wZW4gYW5kIHBvbGwgb3Igd2FpdCBvbiB0aGlzIGV2ZW50LiBXaGVuIGl0IGlzIHNpZ25hbGxlZCwgdGhlIGNoaWxkIHNob3VsZCBkaWUuCi0gKiBwcmVmaXggaXMgYSBwcmVmaXggc3RyaW5nIGZvciB0aGUgZXZlbnQgbmFtZS4KLSAqIAotICogVGhlIGNoaWxkX251bSBhcmd1bWVudCBvbiBlbnRyeSBjb250YWlucyBhIHNlcmlhbCBudW1iZXIgZm9yIHRoaXMgY2hpbGQgKHVzZWQgdG8gY3JlYXRlCi0gKiBhIHVuaXF1ZSBldmVudCBuYW1lKS4gT24gZXhpdCwgdGhpcyBudW1iZXIgd2lsbCBoYXZlIGJlZW4gaW5jcmVtZW50ZWQgYnkgb25lLCByZWFkeQotICogZm9yIHRoZSBuZXh0IGNhbGwuIAotICoKLSAqIE9uIGV4aXQsIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJlICpldiB3aWxsIGNvbnRhaW4gdGhlIGV2ZW50IGNyZWF0ZWQKLSAqIHRvIHNpZ25hbCB0aGUgbmV3IGNoaWxkIHByb2Nlc3MuCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgaGFuZGxlIHRvIHRoZSBjaGlsZCBwcm9jZXNzIGlmIHN1Y2Nlc3NmdWwsIGVsc2UgLTEuIElmIC0xIGlzCi0gKiByZXR1cm5lZCB0aGUgZXJyb3Igd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBsb2dnZWQgYnkgYXBfbG9nX2Vycm9yKCkuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIG1hc3Rlcl9tYWluIC0gdGhpcyBpcyB0aGUgcGFyZW50IChtYWluKSBwcm9jZXNzLiBXZSBjcmVhdGUgYQotICogY2hpbGQgcHJvY2VzcyB0byBkbyB0aGUgd29yaywgdGhlbiBzaXQgYXJvdW5kIHdhaXRpbmcgZm9yIGVpdGhlcgotICogdGhlIGNoaWxkIHRvIGV4aXQsIG9yIGEgcmVzdGFydCBvciBleGl0IHNpZ25hbC4gSWYgdGhlIGNoaWxkIGRpZXMsCi0gKiB3ZSBqdXN0IHJlc3Bhd24gYSBuZXcgb25lLiBJZiB3ZSBoYXZlIGEgc2h1dGRvd24gb3IgZ3JhY2VmdWwgcmVzdGFydCwKLSAqIHRlbGwgdGhlIGNoaWxkIHRvIGRpZSB3aGVuIGl0IGlzIHJlYWR5LiBJZiBpdCBpcyBhIG5vbi1ncmFjZWZ1bAotICogcmVzdGFydCwgZm9yY2UgdGhlIGNoaWxkIHRvIGRpZSBpbW1lZGlhdGVseS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE1BWF9QUk9DRVNTRVMgNTAgLyogbXVzdCBiZSA8IE1BWF9XQUlUX09CSkVDVFMtMSAqLwotCi1zdGF0aWMgdm9pZCBjbGVhbnVwX3Byb2Nlc3MoSEFORExFICpoYW5kbGVzLCBIQU5ETEUgKmV2ZW50cywgaW50IHBvc2l0aW9uLCBpbnQgKnByb2Nlc3NlcykKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgaGFuZGxlID0gMDsKLQotICAgIENsb3NlSGFuZGxlKGhhbmRsZXNbcG9zaXRpb25dKTsKLSAgICBDbG9zZUhhbmRsZShldmVudHNbcG9zaXRpb25dKTsKLQotICAgIGhhbmRsZSA9IChpbnQpaGFuZGxlc1twb3NpdGlvbl07Ci0KLSAgICBmb3IgKGkgPSBwb3NpdGlvbjsgaSA8ICgqcHJvY2Vzc2VzKS0xOyBpKyspIHsKLQloYW5kbGVzW2ldID0gaGFuZGxlc1tpICsgMV07Ci0JZXZlbnRzW2ldID0gZXZlbnRzW2kgKyAxXTsKLSAgICB9Ci0gICAgKCpwcm9jZXNzZXMpLS07Ci0KLS8vICAgIEFQRDQoImNsZWFudXBfcHJvY2Vzc2VzOiByZW1vdmVkIGNoaWxkIGluIHNsb3QgJWQgaGFuZGxlICVkLCBtYXg9JWQiLCBwb3NpdGlvbiwgaGFuZGxlLCAqcHJvY2Vzc2VzKTsKLX0KLQotc3RhdGljIGludCBjcmVhdGVfcHJvY2Vzcyhwb29sICpwLCBIQU5ETEUgKmhhbmRsZXMsIEhBTkRMRSAqZXZlbnRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwcm9jZXNzZXMsIGludCAqY2hpbGRfbnVtLCBjaGFyICpraWxsX2V2ZW50X25hbWUpCi17Ci0KLSAgICBpbnQgcnYsIGk7Ci0gICAgSEFORExFIGtpbGxfZXZlbnQ7Ci0gICAgY2hhciBidWZbMTAyNF07Ci0gICAgY2hhciBleGl0X2V2ZW50X25hbWVbNDBdOyAvKiBhcFBJRF9DIyAqLwotICAgIGNoYXIgKnBDb21tYW5kOwotICAgIGNoYXIgKnBFbnZCbG9jazsKLQotICAgIFNUQVJUVVBJTkZPIHNpOyAgICAgICAgICAgLyogRmlsbGVkIGluIHByaW9yIHRvIGNhbGwgdG8gQ3JlYXRlUHJvY2VzcyAqLwotICAgIFBST0NFU1NfSU5GT1JNQVRJT04gcGk7ICAgLyogZmlsbGVkIGluIG9uIGNhbGwgdG8gQ3JlYXRlUHJvY2VzICovCi0gICAgTFBXU0FQUk9UT0NPTF9JTkZPICBscFdTQVByb3RvY29sSW5mbzsKLSAgICBhcF9saXN0ZW5fcmVjICpscjsKLSAgICBEV09SRCBCeXRlc1dyaXR0ZW47Ci0gICAgSEFORExFIGhQaXBlUmVhZCA9IE5VTEw7Ci0gICAgSEFORExFIGhQaXBlV3JpdGUgPSBOVUxMOwotICAgIFNFQ1VSSVRZX0FUVFJJQlVURVMgc2EgPSB7MH07ICAKLQotICAgIHNhLm5MZW5ndGggPSBzaXplb2Yoc2EpOwotICAgIHNhLmJJbmhlcml0SGFuZGxlID0gVFJVRTsKLSAgICBzYS5scFNlY3VyaXR5RGVzY3JpcHRvciA9IE5VTEw7Ci0KLSAgICAvKiBCdWlsZCB0aGUgY29tbWFuZCBsaW5lLiBTaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgotICAgICAqIEM6L2FwYWNoZS9iaW4vYXBhY2hlLmV4ZSAtZiBhcF9zZXJ2ZXJfY29uZm5hbWUgCi0gICAgICogRmlyc3QsIGdldCB0aGUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZS4uLgotICAgICAqLwotICAgIHJ2ID0gR2V0TW9kdWxlRmlsZU5hbWUoTlVMTCwgYnVmLCBzaXplb2YoYnVmKSk7Ci0gICAgaWYgKHJ2ID09IHNpemVvZihidWYpKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XSU4zMkVSUk9SIHwgQVBMT0dfQ1JJVCwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAiUGFyZW50OiBQYXRoIHRvIEFwYWNoZSBwcm9jZXNzIHRvbyBsb25nIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYgKHJ2ID09IDApIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dJTjMyRVJST1IgfCBBUExPR19DUklULCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJQYXJlbnQ6IEdldE1vZHVsZUZpbGVOYW1lKCkgcmV0dXJuZWQgTlVMTCBmb3IgY3VycmVudCBwcm9jZXNzLiIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIAotICAgIC8qIENyZWF0ZSB0aGUgZXhpdCBldmVudCAoYXBQSURfQyMpLiBQYXJlbnQgc2lnbmFscyB0aGlzIGV2ZW50IHRvIHRlbGwgdGhlCi0gICAgICogY2hpbGQgdG8gZXhpdCAKLSAgICAgKi8KLSAgICBhcF9zbnByaW50ZihleGl0X2V2ZW50X25hbWUsIHNpemVvZihleGl0X2V2ZW50X25hbWUpLCAiJXNfQyVkIiwga2lsbF9ldmVudF9uYW1lLCArKygqY2hpbGRfbnVtKSk7Ci0gICAga2lsbF9ldmVudCA9IENyZWF0ZUV2ZW50KE5VTEwsIFRSVUUsIEZBTFNFLCBleGl0X2V2ZW50X25hbWUpOwotICAgIGlmICgha2lsbF9ldmVudCkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0lOMzJFUlJPUiB8IEFQTE9HX0NSSVQsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgIlBhcmVudDogQ291bGQgbm90IGNyZWF0ZSBleGl0IGV2ZW50IGZvciBjaGlsZCBwcm9jZXNzIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgCi0vLyAgICBwQ29tbWFuZCA9IGFwX3BzcHJpbnRmKHAsICJcIiVzXCIgLWYgXCIlc1wiIiwgYnVmLCBhcF9zZXJ2ZXJfY29uZm5hbWUpOyAgCi0gICAgcENvbW1hbmQgPSBhcF9wc3ByaW50ZihwLCAiXCIlc1wiIC1mIFwiJXNcIiIsIGJ1ZiwgU0VSVkVSX0NPTkZJR19GSUxFKTsgIAotCi0gICAgLyogQ3JlYXRlIGEgcGlwZSB0byBzZW5kIHNvY2tldCBpbmZvIHRvIHRoZSBjaGlsZCAqLwotICAgIGlmICghQ3JlYXRlUGlwZSgmaFBpcGVSZWFkLCAmaFBpcGVXcml0ZSwgJnNhLCAwKSkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0lOMzJFUlJPUiB8IEFQTE9HX0NSSVQsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgIlBhcmVudDogVW5hYmxlIHRvIGNyZWF0ZSBwaXBlIHRvIGNoaWxkIHByb2Nlc3MuXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHBFbnZCbG9jayA9IGFwX3BzcHJpbnRmKHAsICJBUF9QQVJFTlRfUElEPSVkXDBBUF9DSElMRF9OVU09JWRcMFwwIixwYXJlbnRfcGlkLCpjaGlsZF9udW0pOwotCi0gICAgLyogR2l2ZSB0aGUgcmVhZCBpbiBvZiB0aGUgcGlwZSAoaFBpcGVSZWFkKSB0byB0aGUgY2hpbGQgYXMgc3RkaW4uIFRoZSAKLSAgICAgKiBwYXJlbnQgd2lsbCB3cml0ZSB0aGUgc29ja2V0IGRhdGEgdG8gdGhlIGNoaWxkIG9uIHRoaXMgcGlwZS4KLSAgICAgKi8KLSAgICBtZW1zZXQoJnNpLCAwLCBzaXplb2Yoc2kpKTsKLSAgICBtZW1zZXQoJnBpLCAwLCBzaXplb2YocGkpKTsKLSAgICBzaS5jYiA9IHNpemVvZihzaSk7Ci0gICAgc2kuZHdGbGFncyAgICAgPSBTVEFSVEZfVVNFU0hPV1dJTkRPVyB8IFNUQVJURl9VU0VTVERIQU5ETEVTOwotICAgIHNpLndTaG93V2luZG93ID0gU1dfSElERTsKLSAgICBzaS5oU3RkSW5wdXQgICA9IGhQaXBlUmVhZDsKLQotICAgIGlmICghQ3JlYXRlUHJvY2VzcyhOVUxMLCBwQ29tbWFuZCwgTlVMTCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAgIFRSVUUsICAgICAgLyogSW5oZXJpdCBoYW5kbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgLyogQ3JlYXRpb24gZmxhZ3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcEVudkJsb2NrLCAvKiBFbnZpcm9ubWVudCBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAmc2ksICZwaSkpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dJTjMyRVJST1IgfCBBUExPR19DUklULCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJQYXJlbnQ6IE5vdCBhYmxlIHRvIGNyZWF0ZSB0aGUgY2hpbGQgcHJvY2Vzcy4iKTsKLSAgICAgICAgLyoKLSAgICAgICAgICogV2UgbXVzdCBjbG9zZSB0aGUgaGFuZGxlcyB0byB0aGUgbmV3IHByb2Nlc3MgYW5kIGl0cyBtYWluIHRocmVhZAotICAgICAgICAgKiB0byBwcmV2ZW50IGhhbmRsZSBhbmQgbWVtb3J5IGxlYWtzLgotICAgICAgICAgKi8gCi0gICAgICAgIENsb3NlSGFuZGxlKHBpLmhQcm9jZXNzKTsKLSAgICAgICAgQ2xvc2VIYW5kbGUocGkuaFRocmVhZCk7Ci0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19JTkZPLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJQYXJlbnQ6IENyZWF0ZWQgY2hpbGQgcHJvY2VzcyAlZCIsIHBpLmR3UHJvY2Vzc0lkKTsKLQotICAgICAgICAvKiBBc3N1bWUgdGhlIGNoaWxkIHByb2Nlc3MgbGl2ZXMuIFVwZGF0ZSB0aGUgcHJvY2VzcyBhbmQgZXZlbnQgdGFibGVzICovCi0gICAgICAgIGhhbmRsZXNbKnByb2Nlc3Nlc10gPSBwaS5oUHJvY2VzczsKLSAgICAgICAgZXZlbnRzWypwcm9jZXNzZXNdID0ga2lsbF9ldmVudDsKLSAgICAgICAgKCpwcm9jZXNzZXMpKys7Ci0KLSAgICAgICAgLyogV2UgbmV2ZXIgc3RvcmUgdGhlIHRocmVhZCdzIGhhbmRsZSwgc28gY2xvc2UgaXQgbm93LiAqLwotICAgICAgICBDbG9zZUhhbmRsZShwaS5oVGhyZWFkKTsKLQotICAgICAgICAvKiBSdW4gdGhlIGNoYWluIG9mIG9wZW4gc29ja2V0cy4gRm9yIGVhY2ggc29ja2V0LCBkdXBsaWNhdGUgaXQgCi0gICAgICAgICAqIGZvciB0aGUgdGFyZ2V0IHByb2Nlc3MgdGhlbiBzZW5kIHRoZSBXU0FQUk9UT0NPTF9JTkZPIAotICAgICAgICAgKiAocmV0dXJuZWQgYnkgZHVwIHNvY2tldCkgdG8gdGhlIGNoaWxkICovCi0gICAgICAgIGxyID0gYXBfbGlzdGVuZXJzOwotICAgICAgICB3aGlsZSAobHIgIT0gTlVMTCkgewotICAgICAgICAgICAgbHBXU0FQcm90b2NvbEluZm8gPSBhcF9wY2FsbG9jKHAsIHNpemVvZihXU0FQUk9UT0NPTF9JTkZPKSk7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0lORk8sIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICJQYXJlbnQ6IER1cGxpY2F0aW5nIHNvY2tldCAlZCBhbmQgc2VuZGluZyBpdCB0byBjaGlsZCBwcm9jZXNzICVkIiwgbHItPmZkLCBwaS5kd1Byb2Nlc3NJZCk7Ci0gICAgICAgICAgICBpZiAoV1NBRHVwbGljYXRlU29ja2V0KGxyLT5mZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpLmR3UHJvY2Vzc0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscFdTQVByb3RvY29sSW5mbykgPT0gU09DS0VUX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dJTjMyRVJST1IgfCBBUExPR19DUklULCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhcmVudDogV1NBRHVwbGljYXRlU29ja2V0IGZhaWxlZCBmb3Igc29ja2V0ICVkLiIsIGxyLT5mZCApOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFXcml0ZUZpbGUoaFBpcGVXcml0ZSwgbHBXU0FQcm90b2NvbEluZm8sIChEV09SRCkgc2l6ZW9mKFdTQVBST1RPQ09MX0lORk8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJ5dGVzV3JpdHRlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUE9WRVJMQVBQRUQpIE5VTEwpKSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dJTjMyRVJST1IgfCBBUExPR19DUklULCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhcmVudDogVW5hYmxlIHRvIHdyaXRlIGR1cGxpY2F0ZWQgc29ja2V0ICVkIHRvIHRoZSBjaGlsZC4iLCBsci0+ZmQgKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxyID0gbHItPm5leHQ7Ci0gICAgICAgICAgICBpZiAobHIgPT0gYXBfbGlzdGVuZXJzKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIENsb3NlSGFuZGxlKGhQaXBlUmVhZCk7Ci0gICAgQ2xvc2VIYW5kbGUoaFBpcGVXcml0ZSk7ICAgICAgICAKLQotICAgIHJldHVybiAwOwotfQotCi0vKiBUbyBzaGFyZSB0aGUgc2VtYXBob3JlcyB3aXRoIG90aGVyIHByb2Nlc3Nlcywgd2UgbmVlZCBhIE5VTEwgQUNMCi0gKiBDb2RlIGZyb20gTVMgS0IgUTEwNjM4NwotICovCi0KLXN0YXRpYyBQU0VDVVJJVFlfQVRUUklCVVRFUyBHZXROdWxsQUNMKCkKLXsKLSAgICBQU0VDVVJJVFlfREVTQ1JJUFRPUiBwU0Q7Ci0gICAgUFNFQ1VSSVRZX0FUVFJJQlVURVMgc2E7Ci0KLSAgICBzYSAgPSAoUFNFQ1VSSVRZX0FUVFJJQlVURVMpIExvY2FsQWxsb2MoTFBUUiwgc2l6ZW9mKFNFQ1VSSVRZX0FUVFJJQlVURVMpKTsKLSAgICBwU0QgPSAoUFNFQ1VSSVRZX0RFU0NSSVBUT1IpIExvY2FsQWxsb2MoTFBUUiwKLQkJCQkJICAgIFNFQ1VSSVRZX0RFU0NSSVBUT1JfTUlOX0xFTkdUSCk7Ci0gICAgaWYgKHBTRCA9PSBOVUxMIHx8IHNhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmICghSW5pdGlhbGl6ZVNlY3VyaXR5RGVzY3JpcHRvcihwU0QsIFNFQ1VSSVRZX0RFU0NSSVBUT1JfUkVWSVNJT04pCi0JfHwgR2V0TGFzdEVycm9yKCkpIHsKLSAgICAgICAgTG9jYWxGcmVlKCBwU0QgKTsKLSAgICAgICAgTG9jYWxGcmVlKCBzYSApOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKCFTZXRTZWN1cml0eURlc2NyaXB0b3JEYWNsKHBTRCwgVFJVRSwgKFBBQ0wpIE5VTEwsIEZBTFNFKQotCXx8IEdldExhc3RFcnJvcigpKSB7Ci0gICAgICAgIExvY2FsRnJlZSggcFNEICk7Ci0gICAgICAgIExvY2FsRnJlZSggc2EgKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHNhLT5uTGVuZ3RoID0gc2l6ZW9mKHNhKTsKLSAgICBzYS0+bHBTZWN1cml0eURlc2NyaXB0b3IgPSBwU0Q7Ci0gICAgc2EtPmJJbmhlcml0SGFuZGxlID0gVFJVRTsKLSAgICByZXR1cm4gc2E7Ci19Ci0KLQotc3RhdGljIHZvaWQgQ2xlYW5OdWxsQUNMKCB2b2lkICpzYSApIHsKLSAgICBpZiggc2EgKSB7Ci0gICAgICAgIExvY2FsRnJlZSggKChQU0VDVVJJVFlfQVRUUklCVVRFUylzYSktPmxwU2VjdXJpdHlEZXNjcmlwdG9yKTsKLSAgICAgICAgTG9jYWxGcmVlKCBzYSApOwotICAgIH0KLX0KLQotc3RhdGljIGludCBtYXN0ZXJfbWFpbihzZXJ2ZXJfcmVjICpzLCBIQU5ETEUgc2h1dGRvd25fZXZlbnQsIEhBTkRMRSByZXN0YXJ0X2V2ZW50KQotewotICAgIGludCByZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQ7Ci0KLSAgICBpbnQgY2hpbGRfbnVtID0gMDsKLSAgICBpbnQgcnYsIGNsZDsKLSAgICBIQU5ETEUgcHJvY2Vzc19oYW5kbGVzW01BWF9QUk9DRVNTRVNdOwotICAgIEhBTkRMRSBwcm9jZXNzX2tpbGxfZXZlbnRzW01BWF9QUk9DRVNTRVNdOwotICAgIGludCBjdXJyZW50X2xpdmVfcHJvY2Vzc2VzID0gMDsgLyogbnVtYmVyIG9mIGNoaWxkIHByb2Nlc3Mgd2Uga25vdyBhYm91dCAqLwotICAgIGludCBwcm9jZXNzZXNfdG9fY3JlYXRlID0gMDsgICAgLyogbnVtYmVyIG9mIGNoaWxkIHByb2Nlc3NlcyB0byBjcmVhdGUgKi8KLSAgICBwb29sICpwcGFyZW50ID0gTlVMTDsgIC8qIHBvb2wgZm9yIHRoZSBwYXJlbnQgcHJvY2Vzcy4gQ2xlYW5lZCBvbiBlYWNoIHJlc3RhcnQgKi8KLQotICAgIHJlc3RhcnRfcGVuZGluZyA9IHNodXRkb3duX3BlbmRpbmcgPSAwOwotCi0gICAgcmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0ID0gYXBfZGFlbW9uc190b19zdGFydDsKLQotICAgIC8qIENyZWF0ZSBjaGlsZCBwcm9jZXNzIAotICAgICAqIFNob3VsZCBvbmx5IGJlIG9uZSBpbiB0aGlzIHZlcnNpb24gb2YgQXBhY2hlIGZvciBXSU4zMiAKLSAgICAgKi8KLSAgICB3aGlsZSAocmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0LS0pIHsKLSAgICAgICAgaWYgKGNyZWF0ZV9wcm9jZXNzKHBjb25mLCBwcm9jZXNzX2hhbmRsZXMsIHByb2Nlc3Nfa2lsbF9ldmVudHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1cnJlbnRfbGl2ZV9wcm9jZXNzZXMsICZjaGlsZF9udW0sIHNpZ25hbF9wcmVmaXhfc3RyaW5nKSA8IDApIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICJtYXN0ZXJfbWFpbjogY3JlYXRlIGNoaWxkIHByb2Nlc3MgZmFpbGVkLiBFeGl0aW5nLiIpOwotICAgICAgICAgICAgc2h1dGRvd25fcGVuZGluZyA9IDE7Ci0gICAgICAgICAgICBnb3RvIGRpZV9ub3c7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBzZXJ2aWNlX3NldF9zdGF0dXMoU0VSVklDRV9SVU5OSU5HKTsqLwotICAgIHJlc3RhcnRfcGVuZGluZyA9IHNodXRkb3duX3BlbmRpbmcgPSAwOwotICAgIAotICAgIC8qIFdhaXQgZm9yIHNodXRkb3duIG9yIHJlc3RhcnQgZXZlbnRzIG9yIGZvciBjaGlsZCBkZWF0aCAqLwotICAgIHByb2Nlc3NfaGFuZGxlc1tjdXJyZW50X2xpdmVfcHJvY2Vzc2VzXSA9IHNodXRkb3duX2V2ZW50OwotICAgIHByb2Nlc3NfaGFuZGxlc1tjdXJyZW50X2xpdmVfcHJvY2Vzc2VzKzFdID0gcmVzdGFydF9ldmVudDsKLSAgICBydiA9IFdhaXRGb3JNdWx0aXBsZU9iamVjdHMoY3VycmVudF9saXZlX3Byb2Nlc3NlcysyLCAoSEFORExFICopcHJvY2Vzc19oYW5kbGVzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIElORklOSVRFKTsKLSAgICBpZiAocnYgPT0gV0FJVF9GQUlMRUQpIHsKLSAgICAgICAgLyogU29tZXRoaW5nIHNlcmlvdXMgaXMgd3JvbmcgKi8KLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfQ1JJVHxBUExPR19XSU4zMkVSUk9SLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJtYXN0ZXJfbWFpbjogOiBXYWl0Rm9yTXVsdGlwZU9iamVjdHMgb24gcHJvY2VzcyBoYW5kbGVzIGFuZCBhcGFjaGUtc2lnbmFsIC0tIGRvaW5nIHNodXRkb3duIik7Ci0gICAgICAgIHNodXRkb3duX3BlbmRpbmcgPSAxOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKHJ2ID09IFdBSVRfVElNRU9VVCkgewotICAgICAgICAvKiBIZXksIHRoaXMgY2Fubm90IGhhcHBlbiAqLwotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzLAotICAgICAgICAgICAgICAgICAgICAgIm1hc3Rlcl9tYWluOiBXYWl0Rm9yTXVsdGlwZU9iamVjdHMgd2l0aCBJTkZJTklURSB3YWl0IGV4aXRlZCB3aXRoIFdBSVRfVElNRU9VVCIpOwotICAgICAgICBzaHV0ZG93bl9wZW5kaW5nID0gMTsKLSAgICB9Ci0gICAgCi0gICAgY2xkID0gcnYgLSBXQUlUX09CSkVDVF8wOwotLy8gICAgICAgIEFQRDQoIm1haW4gcHJvY2Vzczogd2FpdCBmaW5pc2hlZCwgY2xkPSVkIGhhbmRsZSAlZCAobWF4PSVkKSIsIGNsZCwgcHJvY2Vzc19oYW5kbGVzW2NsZF0sIGN1cnJlbnRfbGl2ZV9wcm9jZXNzZXMpOwotICAgIGlmIChjbGQgPT0gY3VycmVudF9saXZlX3Byb2Nlc3NlcykgewotICAgICAgICAvKiBzaHV0ZG93bl9ldmVudCBzaWduYWxsZWQgKi8KLSAgICAgICAgc2h1dGRvd25fcGVuZGluZyA9IDE7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0lORk8sIHMsIAotICAgICAgICAgICAgICAgICAgICAgIm1hc3Rlcl9tYWluOiBTaHV0ZG93biBldmVudCBzaWduYWxlZC4gU2h1dHRpbmcgdGhlIHNlcnZlciBkb3duLiIpOwotICAgICAgICBpZiAoUmVzZXRFdmVudChzaHV0ZG93bl9ldmVudCkgPT0gMCkgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUnxBUExPR19XSU4zMkVSUk9SLCBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICJSZXNldEV2ZW50KHNodXRkb3duX2V2ZW50KSIpOwotICAgICAgICB9Ci0gICAgICAgIC8qIFNpZ25hbCBlYWNoIGNoaWxkIHByb2Nlc3NlcyB0byBkaWUgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGN1cnJlbnRfbGl2ZV9wcm9jZXNzZXM7IGkrKykgewotLy8gICAgICAgICAgICAgICAgQVBEMygibWFzdGVyX21haW46IHNpZ25hbGxpbmcgY2hpbGQgJWQsIGhhbmRsZSAlZCB0byBkaWUiLCBpLCBwcm9jZXNzX2hhbmRsZXNbaV0pOwotICAgICAgICAgICAgaWYgKFNldEV2ZW50KHByb2Nlc3Nfa2lsbF9ldmVudHNbaV0pID09IDApCi0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfRVJSfEFQTE9HX1dJTjMyRVJST1IsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFzdGVyX21haW46IFNldEV2ZW50IGZvciBjaGlsZCBwcm9jZXNzIGluIHNsb3QgIyVkIGZhaWxlZCIsIGkpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0gZWxzZSBpZiAoY2xkID09IGN1cnJlbnRfbGl2ZV9wcm9jZXNzZXMrMSkgewotICAgICAgICAvKiByZXN0YXJ0X2V2ZW50IHNpZ25hbGxlZCAqLwotICAgICAgICBpbnQgY2hpbGRyZW5fdG9fa2lsbCA9IGN1cnJlbnRfbGl2ZV9wcm9jZXNzZXM7Ci0gICAgICAgIHJlc3RhcnRfcGVuZGluZyA9IDE7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0lORk8sIHMsIAotICAgICAgICAgICAgICAgICAgICAgIm1hc3Rlcl9tYWluOiBSZXN0YXJ0IGV2ZW50IHNpZ25hbGVkLiBEb2luZyBhIGdyYWNlZnVsIHJlc3RhcnQuIik7Ci0gICAgICAgIGlmIChSZXNldEV2ZW50KHJlc3RhcnRfZXZlbnQpID09IDApIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlJ8QVBMT0dfV0lOMzJFUlJPUiwgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAibWFzdGVyX21haW46IFJlc2V0RXZlbnQocmVzdGFydF9ldmVudCkgZmFpbGVkLiIpOwotICAgICAgICB9Ci0gICAgICAgIC8qIFNpZ25hbCBlYWNoIGNoaWxkIHByb2Nlc3MgdG8gZGllICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGlsZHJlbl90b19raWxsOyBpKyspIHsKLS8vICAgICAgICAgICAgICAgIEFQRDMoIm1hc3Rlcl9tYWluOiBzaWduYWxsaW5nIGNoaWxkICMlZCBoYW5kbGUgJWQgdG8gZGllIiwgaSwgcHJvY2Vzc19oYW5kbGVzW2ldKTsKLSAgICAgICAgICAgIGlmIChTZXRFdmVudChwcm9jZXNzX2tpbGxfZXZlbnRzW2ldKSA9PSAwKQotICAgICAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlJ8QVBMT0dfV0lOMzJFUlJPUiwgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hc3Rlcl9tYWluOiBTZXRFdmVudCBmb3IgY2hpbGQgcHJvY2VzcyBpbiBzbG90ICMlZCBmYWlsZWQiLCBpKTsKLSAgICAgICAgICAgIC8qIFJlbW92ZSB0aGUgcHJvY2VzcyAoYW5kIGV2ZW50KSBmcm9tIHRoZSBwcm9jZXNzIHRhYmxlICovCi0gICAgICAgICAgICBjbGVhbnVwX3Byb2Nlc3MocHJvY2Vzc19oYW5kbGVzLCBwcm9jZXNzX2tpbGxfZXZlbnRzLCBpLCAmY3VycmVudF9saXZlX3Byb2Nlc3Nlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvY2Vzc2VzX3RvX2NyZWF0ZSA9IGFwX2RhZW1vbnNfdG9fc3RhcnQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogQSBjaGlsZCBwcm9jZXNzIG11c3QgaGF2ZSBleGl0ZWQgYmVjYXVzZSBvZiBNYXhSZXF1ZXN0UGVyQ2hpbGQgYmVpbmcgaGl0Ci0gICAgICAgICAqIG9yIGEgZmF0YWwgZXJyb3IgY29uZGl0aW9uIChzZWcgZmF1bHQsIGV0Yy4pLiBSZW1vdmUgdGhlIGRlYWQgcHJvY2VzcyAKLSAgICAgICAgICogZnJvbSB0aGUgcHJvY2Vzc19oYW5kbGVzIGFuZCBwcm9jZXNzX2tpbGxfZXZlbnRzIHRhYmxlIGFuZCBjcmVhdGUgYSBuZXcKLSAgICAgICAgICogY2hpbGQgcHJvY2Vzcy4KLSAgICAgICAgICogVE9ETzogQ29uc2lkZXIgcmVzdGFydGluZyB0aGUgY2hpbGQgaW1tZWRpYXRlbHkgd2l0aG91dCBsb29waW5nIHRocm91Z2ggaHR0cF9tYWluCi0gICAgICAgICAqIFRoaXMgd2lsbCBiZWNvbWUgbmVjZXNhc2FyeSBpZiB3ZSBldmVyIHN1cHBvcnQgbXVsdGlwbGUgY2hpbGRyZW4uCi0gICAgICAgICAqIE9uZSBvcHRpb24sIGNyZWF0ZSBhIHBhcmVudCB0aHJlYWQgd2hpY2ggd2FpdHMgb24gY2hpbGQgZGVhdGggYW5kIHJlc3RhcnRzIGl0LgotICAgICAgICAgKi8KLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgc2VydmVyX2NvbmYsIAotICAgICAgICAgICAgICAgICAgICAgIm1hc3Rlcl9tYWluOiBDaGlsZCBwcm9jZXNzZWQgZXhpdGVkIChkdWUgdG8gTWF4UmVxdWVzdHNQZXJDaGlsZD8pLiBSZXN0YXJ0aW5nIHRoZSBjaGlsZCBwcm9jZXNzLiIpOwotICAgICAgICBhcF9hc3NlcnQoY2xkIDwgY3VycmVudF9saXZlX3Byb2Nlc3Nlcyk7Ci0gICAgICAgIGNsZWFudXBfcHJvY2Vzcyhwcm9jZXNzX2hhbmRsZXMsIHByb2Nlc3Nfa2lsbF9ldmVudHMsIGNsZCwgJmN1cnJlbnRfbGl2ZV9wcm9jZXNzZXMpOwotLy8gICAgICAgICAgICBBUEQyKCJtYWluX3Byb2Nlc3M6IGNoaWxkIGluIHNsb3QgJWQgZGllZCIsIHJ2KTsKLSAgICAgICAgcmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0ID0gMTsKLSAgICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgLyogSWYgd2UgZHJvcHBlZCBvdXQgb2YgdGhlIGxvb3Agd2UgZGVmaW5pdGx5IHdhbnQgdG8gZGllIGNvbXBsZXRlbHkuIFdlIG5lZWQgdG8KLSAgICAgKiBtYWtlIHN1cmUgd2Ugd2FpdCBmb3IgYWxsIHRoZSBjaGlsZCBwcm9jZXNzIHRvIGV4aXQgZmlyc3QuCi0gICAgICovCi1kaWVfbm93OgotICAgIGlmIChzaHV0ZG93bl9wZW5kaW5nKSB7Ci0gICAgICAgIHRtc3RhcnQgPSB0aW1lKE5VTEwpOwotICAgICAgICB3aGlsZSAoY3VycmVudF9saXZlX3Byb2Nlc3NlcyAmJiAoKHRtc3RhcnQrNjApID4gdGltZShOVUxMKSkpIHsKLSAgICAgICAgICAgIHJ2ID0gV2FpdEZvck11bHRpcGxlT2JqZWN0cyhjdXJyZW50X2xpdmVfcHJvY2Vzc2VzLCAoSEFORExFICopcHJvY2Vzc19oYW5kbGVzLCBGQUxTRSwgMjAwMCk7Ci0gICAgICAgICAgICBpZiAocnYgPT0gV0FJVF9USU1FT1VUKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgYXBfYXNzZXJ0KHJ2ICE9IFdBSVRfRkFJTEVEKTsKLSAgICAgICAgICAgIGNsZCA9IHJ2IC0gV0FJVF9PQkpFQ1RfMDsKLSAgICAgICAgICAgIGFwX2Fzc2VydChydiA8IGN1cnJlbnRfbGl2ZV9wcm9jZXNzZXMpOwotLy8gICAgICAgICAgICBBUEQ0KCJtYWluX3Byb2Nlc3M6IGNoaWxkIGluICMlZCBoYW5kbGUgJWQgZGllZCwgbGVmdD0lZCIsIAotLy8gICAgICAgICAgICAgICAgIHJ2LCBwcm9jZXNzX2hhbmRsZXNbcnZdLCBjdXJyZW50X2xpdmVfcHJvY2Vzc2VzKTsKLSAgICAgICAgICAgIGNsZWFudXBfcHJvY2Vzcyhwcm9jZXNzX2hhbmRsZXMsIHByb2Nlc3Nfa2lsbF9ldmVudHMsIGNsZCwgJmN1cnJlbnRfbGl2ZV9wcm9jZXNzZXMpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdXJyZW50X2xpdmVfcHJvY2Vzc2VzOyBpKyspIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLEFQTE9HX0VSUnxBUExPR19OT0VSUk5PLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yY2luZyB0ZXJtaW5hdGlvbiBvZiBjaGlsZCAjJWQgKGhhbmRsZSAlZCkiLCBpLCBwcm9jZXNzX2hhbmRsZXNbaV0pOwotICAgICAgICAgICAgVGVybWluYXRlUHJvY2VzcygoSEFORExFKSBwcm9jZXNzX2hhbmRsZXNbaV0sIDEpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBDbG9zZUhhbmRsZShyZXN0YXJ0X2V2ZW50KTsKLSAgICBDbG9zZUhhbmRsZShzaHV0ZG93bl9ldmVudCk7Ci0KLSAgICBpZiAocHBhcmVudCkgewotCWFwX2Rlc3Ryb3lfcG9vbChwcGFyZW50KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKDApOwotfQotCi0vKiAKLSAqIHdpbm50X3ByZV9jb25maWcoKQotICogR2V0cyBjYWxsZWQgdHdpY2UgYXQgc3RhcnR1cC4gCi0gKi8KLXN0YXRpYyB2b2lkIHdpbm50X3ByZV9jb25maWcocG9vbCAqcGNvbmYsIHBvb2wgKnBsb2csIHBvb2wgKnB0ZW1wKSAKLXsKLSAgICBjaGFyICpwaWQ7Ci0gICAgb25lX3Byb2Nlc3MgPSAhIWdldGVudigiT05FX1BST0NFU1MiKTsKLQotICAgIC8qIFRyYWNrIHBhcmVudC9jaGlsZCBwaWRzLi4uICovCi0gICAgcGlkID0gZ2V0ZW52KCJBUF9QQVJFTlRfUElEIik7Ci0gICAgaWYgKHBpZCkgewotICAgICAgICAvKiBBUF9QQVJFTlRfUElEIGlzIG9ubHkgdmFsaWQgaW4gdGhlIGNoaWxkICovCi0gICAgICAgIHBhcmVudF9waWQgPSBhdG9pKHBpZCk7Ci0gICAgICAgIG15X3BpZCA9IGdldHBpZCgpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogVGhpcyBpcyB0aGUgcGFyZW50Li4uICovCi0gICAgICAgIHBhcmVudF9waWQgPSBteV9waWQgPSBnZXRwaWQoKTsKLSAgICAgICAgYXBfbG9nX3BpZChwY29uZiwgbXBtX3BpZF9mbmFtZSk7Ci0gICAgfQotCi0gICAgYXBfbGlzdGVuX3ByZV9jb25maWcoKTsKLSAgICBhcF9kYWVtb25zX3RvX3N0YXJ0ID0gREVGQVVMVF9OVU1fREFFTU9OCi0gICAgYXBfdGhyZWFkc19wZXJfY2hpbGQgPSBERUZBVUxUX1NUQVJUX1RIUkVBRDsKLSAgICBtcG1fcGlkX2ZuYW1lID0gREVGQVVMVF9QSURMT0c7Ci0gICAgbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCA9IERFRkFVTFRfTUFYX1JFUVVFU1RTX1BFUl9DSElMRDsKLQotICAgIGFwX2NweXN0cm4oYXBfY29yZWR1bXBfZGlyLCBhcF9zZXJ2ZXJfcm9vdCwgc2l6ZW9mKGFwX2NvcmVkdW1wX2RpcikpOwotfQotCi0vKgotTmVlZCB0byByZWdpc3RlciB0aGlzIGhvb2sgaWYgd2Ugd2FudCBpdC4uLgotKi8KLXN0YXRpYyB2b2lkIHdpbm50X3Bvc3RfY29uZmlnKHBvb2wgKnBjb25mLCBwb29sICpwbG9nLCBwb29sICpwdGVtcCwgc2VydmVyX3JlYyogc2VydmVyX2NvbmYpCi17Ci0gICAgc2VydmVyX2NvbmYgPSBzZXJ2ZXJfY29uZjsKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX21wbV9ydW4ocG9vbCAqX3Bjb25mLCBwb29sICpwbG9nLCBzZXJ2ZXJfcmVjICpzICkKLXsKLQotICAgIGludCBjaGlsZF9udW07Ci0gICAgY2hhciogZXhpdF9ldmVudF9uYW1lOwotCi0vLyAgICBjaGFyIHNpZ25hbF9wcmVmaXhfc3RyaW5nWzEwMF07Ci0gICAgaW50IGk7Ci0gICAgdGltZV90IHRtc3RhcnQ7Ci0gICAgSEFORExFIHNodXRkb3duX2V2ZW50OwkvKiB1c2VkIHRvIHNpZ25hbCBzaHV0ZG93biB0byBwYXJlbnQgKi8KLSAgICBIQU5ETEUgcmVzdGFydF9ldmVudDsJLyogdXNlZCB0byBzaWduYWwgYSByZXN0YXJ0IHRvIHBhcmVudCAqLwotCi0gICAgcGNvbmYgPSBfcGNvbmY7Ci0gICAgc2VydmVyX2NvbmYgPSBzOwotCi0gICAgaWYgKChwYXJlbnRfcGlkICE9IG15X3BpZCkgfHwgb25lX3Byb2Nlc3MpIHsKLSAgICAgICAgLyogQ2hpbGQgcHJvY2VzcyAqLwotICAgICAgICBjaGlsZF9udW0gPSBhdG9pKGdldGVudigiQVBfQ0hJTERfTlVNIikpOwotICAgICAgICBleGl0X2V2ZW50X25hbWUgPSBhcF9wc3ByaW50ZihwY29uZiwgImFwXyVkX0MlZCIsIHBhcmVudF9waWQsIGNoaWxkX251bSk7Ci0gICAgICAgIGV4aXRfZXZlbnQgPSBvcGVuX2V2ZW50KGV4aXRfZXZlbnRfbmFtZSk7Ci0gICAgICAgIHNldHVwX3NpZ25hbF9uYW1lcyhhcF9wc3ByaW50ZihwY29uZiwiYXBfJWQiLCBwYXJlbnRfcGlkKSk7Ci0gICAgICAgIHN0YXJ0X211dGV4ID0gYXBfb3Blbl9tdXRleChzaWduYWxfbmFtZV9wcmVmaXgpOwotICAgICAgICBhcF9hc3NlcnQoc3RhcnRfbXV0ZXgpOwotCi0gICAgICAgIHdvcmtlcl9tYWluKCk7Ci0KLQotICAgICAgICBkZXN0cm95X2V2ZW50KGV4aXRfZXZlbnQpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogUGFyZW50IHByb2Nlc3MgKi8KLSAgICAgICAgc3RhdGljIGludCByZXN0YXJ0ID0gMDsKLSAgICAgICAgUFNFQ1VSSVRZX0FUVFJJQlVURVMgc2EgPSBHZXROdWxsQUNMKCk7ICAvKiByZXR1cm5zIE5VTEwgaWYgaW52YWxpZCAoV2luOTU/KSAqLwotICAgICAgICBhcF9jbGVhcl9wb29sKHBsb2cpOwotICAgICAgICBhcF9vcGVuX2xvZ3Moc2VydmVyX2NvbmYsIHBsb2cpOwotCi0gICAgICAgIGlmICghcmVzdGFydCkgewotICAgICAgICAgICAgLyogc2VydmljZV9zZXRfc3RhdHVzKFNFUlZJQ0VfU1RBUlRfUEVORElORyk7Ki8KLQotICAgICAgICAgICAgc2V0dXBfc2lnbmFsX25hbWVzKGFwX3BzcHJpbnRmKHBjb25mLCJhcF8lZCIsIHBhcmVudF9waWQpKTsKLSAgICAgICAgCi0gICAgICAgICAgICAvKiBDcmVhdGUgc2h1dGRvd24gZXZlbnQsIGFwUElEX3NodXRkb3duLCB3aGVyZSBQSUQgaXMgdGhlIHBhcmVudCAKLSAgICAgICAgICAgICAqIEFwYWNoZSBwcm9jZXNzIElELiBTaHV0ZG93biBpcyBzaWduYWxlZCBieSAnYXBhY2hlIC1rIHNodXRkb3duJy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgc2h1dGRvd25fZXZlbnQgPSBDcmVhdGVFdmVudChzYSwgVFJVRSwgRkFMU0UsIHNpZ25hbF9zaHV0ZG93bl9uYW1lKTsKLSAgICAgICAgICAgIGlmICghc2h1dGRvd25fZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkd8QVBMT0dfV0lOMzJFUlJPUiwgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hc3Rlcl9tYWluOiBDYW5ub3QgY3JlYXRlIHNodXRkb3duIGV2ZW50ICVzIiwgc2lnbmFsX3NodXRkb3duX25hbWUpOwotICAgICAgICAgICAgICAgIENsZWFuTnVsbEFDTCgodm9pZCAqKXNhKTsKLSAgICAgICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBDcmVhdGUgcmVzdGFydCBldmVudCwgYXBQSURfcmVzdGFydCwgd2hlcmUgUElEIGlzIHRoZSBwYXJlbnQgCi0gICAgICAgICAgICAgKiBBcGFjaGUgcHJvY2VzcyBJRC4gUmVzdGFydCBpcyBzaWduYWxlZCBieSAnYXBhY2hlIC1rIHJlc3RhcnQnLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICByZXN0YXJ0X2V2ZW50ID0gQ3JlYXRlRXZlbnQoc2EsIFRSVUUsIEZBTFNFLCBzaWduYWxfcmVzdGFydF9uYW1lKTsKLSAgICAgICAgICAgIGlmICghcmVzdGFydF9ldmVudCkgewotICAgICAgICAgICAgICAgIENsb3NlSGFuZGxlKHNodXRkb3duX2V2ZW50KTsKLSAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkd8QVBMT0dfV0lOMzJFUlJPUiwgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hc3Rlcl9tYWluOiBDYW5ub3QgY3JlYXRlIHJlc3RhcnQgZXZlbnQgJXMiLCBzaWduYWxfcmVzdGFydF9uYW1lKTsKLSAgICAgICAgICAgICAgICBDbGVhbk51bGxBQ0woKHZvaWQgKilzYSk7Ci0gICAgICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENsZWFuTnVsbEFDTCgodm9pZCAqKXNhKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogQ3JlYXRlIHRoZSBzdGFydCBtdXRleCwgYXBQSUQsIHdoZXJlIFBJRCBpcyB0aGUgcGFyZW50IEFwYWNoZSBwcm9jZXNzIElELgotICAgICAgICAgICAgICogVGhzIHN0YXJ0IG11dGV4IGlzIHVzZWQgZHVyaW5nIGEgcmVzdGFydCB0byBwcmV2ZW50IG1vcmUgdGhhbiBvbmUgCi0gICAgICAgICAgICAgKiBjaGlsZCBwcm9jZXNzIGZyb20gZW50ZXJpbmcgdGhlIGFjY2VwdCBsb29wIGF0IG9uY2UuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHN0YXJ0X211dGV4ID0gYXBfY3JlYXRlX211dGV4KHNpZ25hbF9wcmVmaXhfc3RyaW5nKTsgICAgICAgIAotICAgICAgICAgICAgLyogVE9URDogQWRkIHNvbWUgY29kZSB0byBkZXRlY3QgZmFpbHVyZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyogR28gdG8gd29yay4uLiAqLwotICAgICAgICByZXN0YXJ0ID0gbWFzdGVyX21haW4oc2VydmVyX2NvbmYsIHNodXRkb3duX2V2ZW50LCByZXN0YXJ0X2V2ZW50KTsKLQotICAgICAgICBpZiAoIXJlc3RhcnQpIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBpZGZpbGUgPSBOVUxMOwotICAgICAgICAgICAgLyogU2h1dHRpbmcgZG93bi4gQ2xlYW4gdXAuLi4gKi8KLSAgICAgICAgICAgIHBpZGZpbGUgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZSAocGNvbmYsIG1wbV9waWRfZm5hbWUpOwotICAgICAgICAgICAgaWYgKCBwaWRmaWxlICE9IE5VTEwgJiYgdW5saW5rKHBpZGZpbGUpID09IDApCi0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdmVkIFBJRCBmaWxlICVzIChwaWQ9JWxkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZGZpbGUsIChsb25nKWdldHBpZCgpKTsKLSAgICAgICAgICAgIGFwX2Rlc3Ryb3lfbXV0ZXgoc3RhcnRfbXV0ZXgpOwotCi0gICAgICAgICAgICAvKiBzZXJ2aWNlX3NldF9zdGF0dXMoU0VSVklDRV9TVE9QUEVEKTsgKi8KLSAgICAgICAgfQotCi0gICAgcmV0dXJuICFyZXN0YXJ0OwotfQotCi1zdGF0aWMgdm9pZCB3aW5udF9ob29rcyh2b2lkKQotewotLy8gICAgSU5JVF9TSUdMSVNUKCkKLSAgICBvbmVfcHJvY2VzcyA9IDA7Ci0gICAgLyogQ29uZmlndXJhdGlvbiBob29rcyBpbXBsZW1lbnRlZCBieSBodHRwX2NvbmZpZy5jIC4uLiAqLwotICAgIGFwX2hvb2tfcHJlX2NvbmZpZyh3aW5udF9wcmVfY29uZmlnLCBOVUxMLCBOVUxMLCBIT09LX01JRERMRSk7Ci0gICAvKgotICAgIGFwX2hvb2tfcG9zdF9jb25maWcoKS4uLik7Ci0gICAgYXBfaG9va19vcGVuX2xvZ3MoeHh4LE5VTEwsTlVMTCxIT09LX01JRERMRSk7Ci0gICAqLwotCi0vKgotICAgIGFwX2hvb2tfdHJhbnNsYXRlX25hbWUoeHh4LE5VTEwsTlVMTCxIT09LX1JFQUxMWV9MQVNUKTsKLSAgICBhcF9ob29rX3Byb2Nlc3NfY29ubmVjdGlvbih4eHgsTlVMTCxOVUxMLAotCQkJICAgICAgIEhPT0tfUkVBTExZX0xBU1QpOwotICAgIGFwX2hvb2tfaHR0cF9tZXRob2QoeHh4LE5VTEwsTlVMTCxIT09LX1JFQUxMWV9MQVNUKTsKLSAgICBhcF9ob29rX2RlZmF1bHRfcG9ydCh4eHgsTlVMTCxOVUxMLEhPT0tfUkVBTExZX0xBU1QpOwotCi0gICAgLyogRklYTUU6IEkgc3VzcGVjdCB3ZSBjYW4gZWxpbWluYXRlIHRoZSBuZWVkIGZvciB0aGVzZSAtIEJlbiAqLwotICAgIGFwX2hvb2tfdHlwZV9jaGVja2VyKHh4eCxOVUxMLE5VTEwsSE9PS19SRUFMTFlfTEFTVCk7Ci0qLwotfQotCi0KLS8qIAotICogQ29tbWFuZCBwcm9jZXNzb3JzIAotICovCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3BpZGZpbGUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChjbWQtPnNlcnZlci0+aXNfdmlydHVhbCkgewotCXJldHVybiAiUGlkRmlsZSBkaXJlY3RpdmUgbm90IGFsbG93ZWQgaW4gPFZpcnR1YWxIb3N0PiI7Ci0gICAgfQotICAgIG1wbV9waWRfZm5hbWUgPSBhcmc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfdGhyZWFkc19wZXJfY2hpbGQgKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBhcF90aHJlYWRzX3Blcl9jaGlsZCA9IGF0b2koYXJnKTsKLSAgICBpZiAoYXBfdGhyZWFkc19wZXJfY2hpbGQgPiBIQVJEX1RIUkVBRF9MSU1JVCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkc6IFRocmVhZHNQZXJDaGlsZCBvZiAlZCBleGNlZWRzIGNvbXBpbGUgdGltZSIKLSAgICAgICAgICAgICAgICAibGltaXQgb2YgJWQgdGhyZWFkcyxcbiIsIGFwX3RocmVhZHNfcGVyX2NoaWxkLAotICAgICAgICAgICAgICAgIEhBUkRfVEhSRUFEX0xJTUlUKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIgbG93ZXJpbmcgVGhyZWFkc1BlckNoaWxkIHRvICVkLiBUbyBpbmNyZWFzZSwgcGxlYXNlIgotICAgICAgICAgICAgICAgICJzZWUgdGhlXG4iLCBIQVJEX1RIUkVBRF9MSU1JVCk7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiIEhBUkRfVEhSRUFEX0xJTUlUIGRlZmluZSBpbiBzcmMvaW5jbHVkZS9odHRwZC5oLlxuIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKGFwX3RocmVhZHNfcGVyX2NoaWxkIDwgMSkgewotCWZwcmludGYoc3RkZXJyLCAiV0FSTklORzogUmVxdWlyZSBUaHJlYWRzUGVyQ2hpbGQgPiAwLCBzZXR0aW5nIHRvIDFcbiIpOwotCWFwX3RocmVhZHNfcGVyX2NoaWxkID0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9tYXhfcmVxdWVzdHMoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1heF9yZXF1ZXN0c19wZXJfY2hpbGQgPSBhdG9pKGFyZyk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9jb3JlZHVtcGRpciAoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIHN0cnVjdCBzdGF0IGZpbmZvOwotICAgIGNvbnN0IGNoYXIgKmZuYW1lOwotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGZuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUoY21kLT5wb29sLCBhcmcpOwotICAgIC8qIFpaWiBjaGFuZ2UgdGhpcyB0byB0aGUgQVAgZnVuYyBGaWxlSW5mbyovCi0gICAgaWYgKChzdGF0KGZuYW1lLCAmZmluZm8pID09IC0xKSB8fCAhU19JU0RJUihmaW5mby5zdF9tb2RlKSkgewotCXJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIkNvcmVEdW1wRGlyZWN0b3J5ICIsIGZuYW1lLCAKLQkJCSAgIiBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSBkaXJlY3RvcnkiLCBOVUxMKTsKLSAgICB9Ci0gICAgYXBfY3B5c3RybihhcF9jb3JlZHVtcF9kaXIsIGZuYW1lLCBzaXplb2YoYXBfY29yZWR1bXBfZGlyKSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyB3aW5udF9jbWRzW10gPSB7Ci1MSVNURU5fQ09NTUFORFMKLXsgIlBpZEZpbGUiLCBzZXRfcGlkZmlsZSwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAiQSBmaWxlIGZvciBsb2dnaW5nIHRoZSBzZXJ2ZXIgcHJvY2VzcyBJRCJ9LAotLy97ICJTY29yZUJvYXJkRmlsZSIsIHNldF9zY29yZWJvYXJkLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotLy8gICAgIkEgZmlsZSBmb3IgQXBhY2hlIHRvIG1haW50YWluIHJ1bnRpbWUgcHJvY2VzcyBtYW5hZ2VtZW50IGluZm9ybWF0aW9uIn0sCi17ICJUaHJlYWRzUGVyQ2hpbGQiLCBzZXRfdGhyZWFkc19wZXJfY2hpbGQsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJOdW1iZXIgb2YgdGhyZWFkcyBlYWNoIGNoaWxkIGNyZWF0ZXMiIH0sCi17ICJNYXhSZXF1ZXN0c1BlckNoaWxkIiwgc2V0X21heF9yZXF1ZXN0cywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIk1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIGEgcGFydGljdWxhciBjaGlsZCBzZXJ2ZXMgYmVmb3JlIGR5aW5nLiIgfSwKLXsgIkNvcmVEdW1wRGlyZWN0b3J5Iiwgc2V0X2NvcmVkdW1wZGlyLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiVGhlIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RvcnkgQXBhY2hlIGNoYW5nZXMgdG8gYmVmb3JlIGR1bXBpbmcgY29yZSIgfSwKLXsgTlVMTCB9Ci19OwotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgbXBtX3dpbm50X21vZHVsZSA9IHsKLSAgICBTVEFOREFSRDIwX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLCAJCQkvKiBjaGlsZF9pbml0ICovCi0gICAgTlVMTCwJCQkvKiBjcmVhdGUgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlICovCi0gICAgTlVMTCwJCQkvKiBtZXJnZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgTlVMTCwJCQkvKiBjcmVhdGUgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlICovCi0gICAgTlVMTCwJCQkvKiBtZXJnZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgd2lubnRfY21kcywJCSAgICAgICAgLyogY29tbWFuZCB0YWJsZSAqLwotICAgIE5VTEwsCQkJLyogaGFuZGxlcnMgKi8KLSAgICBOVUxMLAkJCS8qIGNoZWNrIGF1dGggKi8KLSAgICBOVUxMLAkJCS8qIGNoZWNrIGFjY2VzcyAqLwotICAgIHdpbm50X2hvb2tzIAkJLyogcmVnaXN0ZXJfaG9va3MgKi8KLX07Ci0KLS8qIGZvcmNlIEV4cGF0IHRvIGJlIGxpbmtlZCBpbnRvIHRoZSBzZXJ2ZXIgZXhlY3V0YWJsZSAqLwotI2lmIGRlZmluZWQoVVNFX0VYUEFUKSAmJiAhZGVmaW5lZChTSEFSRURfQ09SRV9CT09UU1RSQVApCi0jaW5jbHVkZSAieG1scGFyc2UuaCIKLWNvbnN0IFhNTF9MQ2hhciAqc3Vja19pbl9leHBhdCh2b2lkKTsKLWNvbnN0IFhNTF9MQ2hhciAqc3Vja19pbl9leHBhdCh2b2lkKQotewotICAgIHJldHVybiBYTUxfRXJyb3JTdHJpbmcoWE1MX0VSUk9SX05PTkUpOwotfQotI2VuZGlmIC8qIFVTRV9FWFBBVCAqLwpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS93aW5udC9tcG1fd2lubnQuaCBiL3NlcnZlci9tcG0vd2lubnQvbXBtX3dpbm50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOTg3ZDcuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS93aW5udC9tcG1fd2lubnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIAotICogYXJlIG1ldDogCi0gKiAKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAgCi0gKiAKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIAotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSAKLSAqICAgIGRpc3RyaWJ1dGlvbi4gCi0gKiAKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyAKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAgCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIiAKLSAqIAotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0byAKLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCAKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLiAKLSAqIAotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIgCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuIAotICogCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nIAotICogICAgYWNrbm93bGVkZ21lbnQ6IAotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cCAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iIAotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkgCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIAotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IgCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgCi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gKiAKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55IAotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkIAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIAotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLiAKLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4gCi0gKiAKLSAqLyAKLQotI2lmbmRlZiBBUEFDSEVfTVBNX1dJTk5UX0gKLSNkZWZpbmUgQVBBQ0hFX01QTV9XSU5OVF9ICi0KLWV4dGVybiBpbnQgYXBfdGhyZWFkc19wZXJfY2hpbGQ7Ci1leHRlcm4gaW50IGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQ7Ci1leHRlcm4gdm9pZCBjbGVhbl9jaGlsZF9leGl0KGludCk7Ci1leHRlcm4gaW50IGFwX2V4dGVuZGVkX3N0YXR1czsKLWV4dGVybiB2b2lkIGNsZWFuX2NoaWxkX2V4aXQoaW50KTsKLQotI2VuZGlmIC8qIEFQQUNIRV9NUE1fV0lOTlRfSCAqLwpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS93aW5udC9udF9ldmVudGxvZy5jIGIvc2VydmVyL21wbS93aW5udC9udF9ldmVudGxvZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjJlYmM3Li4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vd2lubnQvbnRfZXZlbnRsb2cuYworKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotI2RlZmluZSBDT1JFX1BSSVZBVEUgCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAibXBtX3dpbm50LmgiCi0jaW5jbHVkZSAiYXByX3N0cmluZ3MuaCIKLSNpbmNsdWRlICJhcHJfbGliLmgiCi0KLSNpbmNsdWRlICJhcHJfZGJnX3dpbjMyX2hhbmRsZXMuaCIKLQotCi1zdGF0aWMgY2hhciAgKmRpc3BsYXlfbmFtZSAgPSBOVUxMOwotc3RhdGljIEhBTkRMRSBzdGRlcnJfdGhyZWFkID0gTlVMTDsKLXN0YXRpYyBIQU5ETEUgc3RkZXJyX3JlYWR5OwotCi1zdGF0aWMgRFdPUkQgV0lOQVBJIHNlcnZpY2Vfc3RkZXJyX3RocmVhZChMUFZPSUQgaFBpcGUpCi17Ci0gICAgSEFORExFIGhQaXBlUmVhZCA9IChIQU5ETEUpIGhQaXBlOwotICAgIEhBTkRMRSBoRXZlbnRTb3VyY2U7Ci0gICAgY2hhciBlcnJidWZbMjU2XTsKLSAgICBjaGFyICplcnJtc2cgPSBlcnJidWY7Ci0gICAgY29uc3QgY2hhciAqZXJyYXJnWzldOwotICAgIERXT1JEIGVycnJlczsKLSAgICBIS0VZIGhrOwotICAgIAotICAgIGVycmFyZ1swXSA9ICJUaGUgQXBhY2hlIHNlcnZpY2UgbmFtZWQiOwotICAgIGVycmFyZ1sxXSA9IGRpc3BsYXlfbmFtZTsKLSAgICBlcnJhcmdbMl0gPSAicmVwb3J0ZWQgdGhlIGZvbGxvd2luZyBlcnJvcjpcclxuPj4+IjsKLSAgICBlcnJhcmdbM10gPSBlcnJidWY7Ci0gICAgZXJyYXJnWzRdID0gTlVMTDsKLSAgICBlcnJhcmdbNV0gPSBOVUxMOwotICAgIGVycmFyZ1s2XSA9IE5VTEw7Ci0gICAgZXJyYXJnWzddID0gTlVMTDsKLSAgICBlcnJhcmdbOF0gPSBOVUxMOwotCi0gICAgLyogV2hhdCBhcmUgd2UgZ29pbmcgdG8gZG8gaW4gaGVyZSwgYmFpbCBvbiB0aGUgdXNlcj8gIG5vdC4gKi8KLSAgICBpZiAoIVJlZ0NyZWF0ZUtleShIS0VZX0xPQ0FMX01BQ0hJTkUsICJTWVNURU1cXEN1cnJlbnRDb250cm9sU2V0XFxTZXJ2aWNlcyIKLSAgICAgICAgICAgICAgICAgICAgICAiXFxFdmVudExvZ1xcQXBwbGljYXRpb25cXEFwYWNoZSBTZXJ2aWNlIiwgJmhrKSkgCi0gICAgewotICAgICAgICAvKiBUaGUgc3RvY2sgbWVzc2FnZSBmaWxlICovCi0gICAgICAgIGNoYXIgKm5ldG1zZ2tleSA9ICIlU3lzdGVtUm9vdCVcXFN5c3RlbTMyXFxuZXRtc2cuZGxsIjsKLSAgICAgICAgRFdPUkQgZHdEYXRhID0gRVZFTlRMT0dfRVJST1JfVFlQRSB8IEVWRU5UTE9HX1dBUk5JTkdfVFlQRSB8IAotICAgICAgICAgICAgICAgICAgICAgICBFVkVOVExPR19JTkZPUk1BVElPTl9UWVBFOyAKLSAKLSAgICAgICAgUmVnU2V0VmFsdWVFeChoaywgIkV2ZW50TWVzc2FnZUZpbGUiLCAwLCBSRUdfRVhQQU5EX1NaLAotICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBCWVRFKSBuZXRtc2drZXksIHN0cmxlbihuZXRtc2drZXkpICsgMSk7Ci0gICAgICAgIAotICAgICAgICBSZWdTZXRWYWx1ZUV4KGhrLCAiVHlwZXNTdXBwb3J0ZWQiLCAwLCBSRUdfRFdPUkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChMUEJZVEUpICZkd0RhdGEsIHNpemVvZihkd0RhdGEpKTsKLSAgICAgICAgUmVnQ2xvc2VLZXkoaGspOwotICAgIH0KLQotICAgIGhFdmVudFNvdXJjZSA9IFJlZ2lzdGVyRXZlbnRTb3VyY2UoTlVMTCwgIkFwYWNoZSBTZXJ2aWNlIik7Ci0KLSAgICBTZXRFdmVudChzdGRlcnJfcmVhZHkpOwotCi0gICAgd2hpbGUgKFJlYWRGaWxlKGhQaXBlUmVhZCwgZXJybXNnLCAxLCAmZXJycmVzLCBOVUxMKSAmJiAoZXJycmVzID09IDEpKQotICAgIHsKLSAgICAgICAgaWYgKChlcnJtc2cgPiBlcnJidWYpIHx8ICFpc3NwYWNlKCplcnJtc2cpKQotICAgICAgICB7Ci0gICAgICAgICAgICArK2Vycm1zZzsKLSAgICAgICAgICAgIGlmICgoKihlcnJtc2cgLSAxKSA9PSAnXG4nKSAKLSAgICAgICAgICAgICAgICAgICAgfHwgKGVycm1zZyA+PSBlcnJidWYgKyBzaXplb2YoZXJyYnVmKSAtIDEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdoaWxlICgoZXJybXNnID4gZXJyYnVmKSAmJiBpc3NwYWNlKCooZXJybXNnIC0gMSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC0tZXJybXNnOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqZXJybXNnID0gJ1wwJzsKLQotICAgICAgICAgICAgICAgIC8qIEdlbmVyaWMgbWVzc2FnZTogJyUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5JwotICAgICAgICAgICAgICAgICAqIFRoZSBldmVudCBjb2RlIGluIG5ldG1zZy5kbGwgaXMgMzI5OQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFJlcG9ydEV2ZW50KGhFdmVudFNvdXJjZSwgRVZFTlRMT0dfRVJST1JfVFlQRSwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI5OSwgTlVMTCwgOSwgMCwgZXJyYXJnLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBlcnJtc2cgPSBlcnJidWY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoKGVycnJlcyA9IEdldExhc3RFcnJvcigpKSAhPSBFUlJPUl9CUk9LRU5fUElQRSkgewotICAgICAgICBhcHJfc25wcmludGYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwKLSAgICAgICAgICAgICAgICAgICAgICJXaW4zMiBlcnJvciAlZCByZWFkaW5nIHN0ZGVyciBwaXBlIHN0cmVhbVxyXG4iLCAKLSAgICAgICAgICAgICAgICAgICAgIEdldExhc3RFcnJvcigpKTsKLQotICAgICAgICBSZXBvcnRFdmVudChoRXZlbnRTb3VyY2UsIEVWRU5UTE9HX0VSUk9SX1RZUEUsIDAsIAotICAgICAgICAgICAgICAgICAgICAzMjk5LCBOVUxMLCA5LCAwLCBlcnJhcmcsIE5VTEwpOwotICAgIH0KLQotICAgIENsb3NlSGFuZGxlKGhQaXBlUmVhZCk7Ci0gICAgRGVyZWdpc3RlckV2ZW50U291cmNlKGhFdmVudFNvdXJjZSk7Ci0gICAgQ2xvc2VIYW5kbGUoc3RkZXJyX3RocmVhZCk7Ci0gICAgc3RkZXJyX3RocmVhZCA9IE5VTEw7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotdm9pZCBtcG1fbnRfZXZlbnRsb2dfc3RkZXJyX2ZsdXNoKHZvaWQpCi17Ci0gICAgSEFORExFIGNsZWFudXBfdGhyZWFkID0gc3RkZXJyX3RocmVhZDsKLQotICAgIGlmIChjbGVhbnVwX3RocmVhZCkgewotICAgICAgICBIQU5ETEUgaEVyciA9IEdldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFKTsKLSAgICAgICAgZmNsb3NlKHN0ZGVycik7Ci0gICAgICAgIENsb3NlSGFuZGxlKGhFcnIpOwotICAgICAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KGNsZWFudXBfdGhyZWFkLCAzMDAwMCk7Ci0gICAgICAgIENsb3NlSGFuZGxlKGNsZWFudXBfdGhyZWFkKTsKLSAgICB9Ci19Ci0KLQotdm9pZCBtcG1fbnRfZXZlbnRsb2dfc3RkZXJyX29wZW4oY2hhciAqYXJndjAsIGFwcl9wb29sX3QgKnApCi17Ci0gICAgU0VDVVJJVFlfQVRUUklCVVRFUyBzYTsKLSAgICBIQU5ETEUgaFByb2MgPSBHZXRDdXJyZW50UHJvY2VzcygpOwotICAgIEhBTkRMRSBoUGlwZVJlYWQgPSBOVUxMOwotICAgIEhBTkRMRSBoUGlwZVdyaXRlID0gTlVMTDsKLSAgICBIQU5ETEUgaER1cCA9IE5VTEw7Ci0gICAgRFdPUkQgIHRocmVhZGlkOwotICAgIGludCAgICBmZDsKLQotICAgIGRpc3BsYXlfbmFtZSA9IGFyZ3YwOwotCi0gICAgLyogQ3JlYXRlIGEgcGlwZSB0byBzZW5kIHN0ZGVyciBtZXNzYWdlcyB0byB0aGUgc3lzdGVtIGVycm9yIGxvZy4KLSAgICAgKgotICAgICAqIF9kdXAyKCkgZHVwbGljYXRlcyB0aGUgd3JpdGUgaGFuZGxlIGluaGVyaXRhYmxlIGZvciB1cy4KLSAgICAgKi8KLSAgICBzYS5uTGVuZ3RoID0gc2l6ZW9mKHNhKTsKLSAgICBzYS5scFNlY3VyaXR5RGVzY3JpcHRvciA9IE5VTEw7Ci0gICAgc2EuYkluaGVyaXRIYW5kbGUgPSBGQUxTRTsKLSAgICBDcmVhdGVQaXBlKCZoUGlwZVJlYWQsICZoUGlwZVdyaXRlLCBOVUxMLCAwKTsgCi0gICAgYXBfYXNzZXJ0KGhQaXBlUmVhZCAmJiBoUGlwZVdyaXRlKTsKLQotICAgIHN0ZGVycl9yZWFkeSA9IENyZWF0ZUV2ZW50KE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCk7Ci0gICAgc3RkZXJyX3RocmVhZCA9IENyZWF0ZVRocmVhZChOVUxMLCAwLCBzZXJ2aWNlX3N0ZGVycl90aHJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBWT0lEKSBoUGlwZVJlYWQsIDAsICZ0aHJlYWRpZCk7Ci0gICAgYXBfYXNzZXJ0KHN0ZGVycl9yZWFkeSAmJiBzdGRlcnJfdGhyZWFkKTsKLQotICAgIFdhaXRGb3JTaW5nbGVPYmplY3Qoc3RkZXJyX3JlYWR5LCBJTkZJTklURSk7Ci0KLSAgICAvKiBGbHVzaCBzdGRlcnIgYW5kIHVuc2V0IGl0cyBidWZmZXIsIHRoZW4gY29tbWl0IGFuZCByZXBsYWNlIHN0ZGVyci4KLSAgICAgKiBUaGlzIGlzIHR5cGljYWxseSBhIG5vb3AgZm9yIFdpbjJLL1hQIHNpbmNlIHNlcnZpY2VzIHdpdGggTlVMTCBzdGQgCi0gICAgICogaGFuZGxlcyBbYnV0IHZhbGlkIEZJTEUgKidzLCBvZGRseSBlbm91Z2hdLCBidXQgaXMgcmVxdWlyZWQgCi0gICAgICogZm9yIE5UIDQuMCBhbmQgdG8gdXNlIHRoaXMgY29kZSBvdXRzaWRlIG9mIHNlcnZpY2VzLgotICAgICAqLwotICAgIGZmbHVzaChzdGRlcnIpOwotICAgIHNldHZidWYoc3RkZXJyLCBOVUxMLCBfSU9OQkYsIDApOwotICAgIF9jb21taXQoMiAvKiBzdGRlcnIgKi8pOwotICAgIGZkID0gX29wZW5fb3NmaGFuZGxlKChsb25nKSBoUGlwZVdyaXRlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBfT19XUk9OTFkgfCBfT19CSU5BUlkpOwotICAgIF9kdXAyKGZkLCAyKTsKLSAgICBfY2xvc2UoZmQpOwotICAgIF9zZXRtb2RlKDIsIF9PX0JJTkFSWSk7Ci0KLSAgICAvKiBoUGlwZVdyaXRlIHdhcyBfY2xvc2UoKSdlZCBhYm92ZSwgYW5kIF9kdXAyKCknZWQKLSAgICAgKiB0byBmZCAyIGNyZWF0aW5nIGEgbmV3LCBpbmhlcml0ZWQgV2luMzIgaGFuZGxlLgotICAgICAqIFJlY292ZXIgdGhhdCByZWFsIGhhbmRsZSBmcm9tIGZkIDIuCi0gICAgICovCi0gICAgaFBpcGVXcml0ZSA9IChIQU5ETEUpX2dldF9vc2ZoYW5kbGUoMik7Ci0KLSAgICBTZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSwgaFBpcGVXcml0ZSk7Ci0KLSAgICAvKiBUaGUgY29kZSBhYm92ZSBfd2lsbF8gY29ycnVwdCB0aGUgU3RkSGFuZGxlLi4uIAotICAgICAqIGFuZCB3ZSBtdXN0IGRvIHNvIGFueXdheXMuICBXZSBzZXQgdGhpcyB1cCBvbmx5Ci0gICAgICogYWZ0ZXIgd2UgaW5pdGlhbGl6ZWQgdGhlIHBvc2l4IHN0ZGVyciBBUEkuCi0gICAgICovCi0gICAgYXBfb3Blbl9zdGRlcnJfbG9nKHApOwotfQpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS93aW5udC9zZXJ2aWNlLmMgYi9zZXJ2ZXIvbXBtL3dpbm50L3NlcnZpY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwOGFlMS4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL3dpbm50L3NlcnZpY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi0jaWZkZWYgV0lOMzIKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHByb2Nlc3MuaD4KLSNpbmNsdWRlIDxkaXJlY3QuaD4KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25mX2dsb2JhbHMuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotI2luY2x1ZGUgIm11bHRpdGhyZWFkLmgiCi0jaW5jbHVkZSAic2VydmljZS5oIgotI2luY2x1ZGUgInJlZ2lzdHJ5LmgiCi0KLXN0YXRpYyBzdHJ1Y3QKLXsKLSAgICBpbnQgKCptYWluX2ZuKShpbnQsIGNoYXIgKiopOwotICAgIGV2ZW50ICpzdG9wX2V2ZW50OwotICAgIGludCBjb25uZWN0ZWQ7Ci0gICAgU0VSVklDRV9TVEFUVVNfSEFORExFIGhTZXJ2aWNlU3RhdHVzOwotICAgIGNoYXIgKm5hbWU7Ci0gICAgaW50IGV4aXRfc3RhdHVzOwotICAgIFNFUlZJQ0VfU1RBVFVTIHNzU3RhdHVzOwotICAgIEZJTEUgKmxvZ0ZpbGU7Ci19IGdsb2JkYXQ7Ci0KLXN0YXRpYyB2b2lkIFdJTkFQSSBzZXJ2aWNlX21haW5fZm4oRFdPUkQsIExQVFNUUiAqKTsKLXN0YXRpYyB2b2lkIFdJTkFQSSBzZXJ2aWNlX2N0cmwoRFdPUkQgY3RybENvZGUpOwotc3RhdGljIGludCBSZXBvcnRTdGF0dXNUb1NDTWdyKGludCBjdXJyZW50U3RhdGUsIGludCBleGl0Q29kZSwgaW50IHdhaXRIaW50KTsKLXN0YXRpYyBpbnQgYXBfc3RhcnRfc2VydmljZShTQ19IQU5ETEUpOwotc3RhdGljIGludCBhcF9zdG9wX3NlcnZpY2UoU0NfSEFORExFKTsKLQotaW50IHNlcnZpY2VfbWFpbihpbnQgKCptYWluX2ZuKShpbnQsIGNoYXIgKiopLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKQotewotICAgIFNFUlZJQ0VfVEFCTEVfRU5UUlkgZGlzcGF0Y2hUYWJsZVtdID0KLSAgICB7Ci0gICAgICAgIHsgIiIsIHNlcnZpY2VfbWFpbl9mbiB9LAotICAgICAgICB7IE5VTEwsIE5VTEwgfQotICAgIH07Ci0KLSAgICBnbG9iZGF0Lm1haW5fZm4gPSBtYWluX2ZuOwotICAgIGdsb2JkYXQuc3RvcF9ldmVudCA9IGNyZWF0ZV9ldmVudCgwLCAwLCAiYXBhY2hlLXNpZ25hbCIpOwotICAgIGdsb2JkYXQuY29ubmVjdGVkID0gMTsKLQotICAgIGlmKCFTdGFydFNlcnZpY2VDdHJsRGlzcGF0Y2hlcihkaXNwYXRjaFRhYmxlKSkKLSAgICB7Ci0gICAgICAgIC8qIFRoaXMgaXMgYSBnZW51aW5lIGZhaWx1cmUgb2YgdGhlIFNDTS4gKi8KLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUnxBUExPR19XSU4zMkVSUk9SLCBOVUxMLAotICAgICAgICAiRXJyb3Igc3RhcnRpbmcgc2VydmljZSBjb250cm9sIGRpc3BhdGNoZXIiKTsKLSAgICAgICAgcmV0dXJuKGdsb2JkYXQuZXhpdF9zdGF0dXMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4oZ2xvYmRhdC5leGl0X3N0YXR1cyk7Ci0gICAgfQotfQotCi12b2lkIHNlcnZpY2VfY2QoKQotewotICAgIC8qIGNoYW5nZSB0byB0aGUgZHJpdmUgd2l0aCB0aGUgZXhlY3V0YWJsZSAqLwotICAgIGNoYXIgYnVmWzMwMF07Ci0gICAgR2V0TW9kdWxlRmlsZU5hbWUoTlVMTCwgYnVmLCAzMDApOwotICAgIGJ1ZlsyXSA9IDA7Ci0gICAgY2hkaXIoYnVmKTsKLX0KLQotdm9pZCBfX3N0ZGNhbGwgc2VydmljZV9tYWluX2ZuKERXT1JEIGFyZ2MsIExQVFNUUiAqYXJndikKLXsKLSAgICBhcF9zZXJ2ZXJfYXJndjAgPSBnbG9iZGF0Lm5hbWUgPSBhcmd2WzBdOwotCi0gICAgaWYoIShnbG9iZGF0LmhTZXJ2aWNlU3RhdHVzID0gUmVnaXN0ZXJTZXJ2aWNlQ3RybEhhbmRsZXIoIGdsb2JkYXQubmFtZSwgc2VydmljZV9jdHJsKSkpCi0gICAgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSfEFQTE9HX1dJTjMyRVJST1IsIE5VTEwsCi0gICAgICAgICJGYWlsdXJlIHJlZ2lzdGVyaW5nIHNlcnZpY2UgaGFuZGxlciIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgUmVwb3J0U3RhdHVzVG9TQ01ncigKLSAgICAgICAgU0VSVklDRV9TVEFSVF9QRU5ESU5HLCAvLyBzZXJ2aWNlIHN0YXRlCi0gICAgICAgIE5PX0VSUk9SLCAgICAgICAgICAgICAgLy8gZXhpdCBjb2RlCi0gICAgICAgIDMwMDApOyAgICAgICAgICAgICAgICAgLy8gd2FpdCBoaW50Ci0KLSAgICBzZXJ2aWNlX2NkKCk7Ci0gICAgaWYoIHNlcnZpY2VfaW5pdCgpICkgCi0gICAgICAgIC8qIEFyZ3VtZW50cyBhcmUgb2sgZXhjZXB0IGZvciBcISAqLwotICAgICAgICBnbG9iZGF0LmV4aXRfc3RhdHVzID0gKCpnbG9iZGF0Lm1haW5fZm4pKCBhcmdjLCBhcmd2ICk7Ci0gICAgCi0gICAgUmVwb3J0U3RhdHVzVG9TQ01ncihTRVJWSUNFX1NUT1BQRUQsIE5PX0VSUk9SLCAwKTsKLQotICAgIHJldHVybjsKLX0KLQotdm9pZCBzZXJ2aWNlX3NldF9zdGF0dXMoaW50IHN0YXR1cykKLXsKLSAgICBSZXBvcnRTdGF0dXNUb1NDTWdyKHN0YXR1cywgTk9fRVJST1IsIDMwMDApOwotfQotCi0KLQotLy8KLS8vICBGVU5DVElPTjogc2VydmljZV9jdHJsCi0vLwotLy8gIFBVUlBPU0U6IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBTQ00gd2hlbmV2ZXIKLS8vICAgICAgICAgICBDb250cm9sU2VydmljZSgpIGlzIGNhbGxlZCBvbiB0aGlzIHNlcnZpY2UuCi0vLwotLy8gIFBBUkFNRVRFUlM6Ci0vLyAgICBkd0N0cmxDb2RlIC0gdHlwZSBvZiBjb250cm9sIHJlcXVlc3RlZAotLy8KLS8vICBSRVRVUk4gVkFMVUU6Ci0vLyAgICBub25lCi0vLwotLy8gIENPTU1FTlRTOgotLy8KLVZPSUQgV0lOQVBJIHNlcnZpY2VfY3RybChEV09SRCBkd0N0cmxDb2RlKQotewotICAgIGludCBzdGF0ZTsKLQotCi0gICAgc3RhdGUgPSBnbG9iZGF0LnNzU3RhdHVzLmR3Q3VycmVudFN0YXRlOwotICAgIHN3aXRjaChkd0N0cmxDb2RlKQotICAgIHsKLSAgICAgICAgLy8gU3RvcCB0aGUgc2VydmljZS4KLSAgICAgICAgLy8KLSAgICAgICAgY2FzZSBTRVJWSUNFX0NPTlRST0xfU1RPUDoKLSAgICAgICAgICAgIHN0YXRlID0gU0VSVklDRV9TVE9QX1BFTkRJTkc7Ci0JICAgIGFwX3N0YXJ0X3NodXRkb3duKCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvLyBVcGRhdGUgdGhlIHNlcnZpY2Ugc3RhdHVzLgotICAgICAgICAvLwotICAgICAgICBjYXNlIFNFUlZJQ0VfQ09OVFJPTF9JTlRFUlJPR0FURToKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8vIGludmFsaWQgY29udHJvbCBjb2RlCi0gICAgICAgIC8vCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLQotICAgIH0KLQotICAgIFJlcG9ydFN0YXR1c1RvU0NNZ3Ioc3RhdGUsIE5PX0VSUk9SLCAwKTsKLX0KLQotCi1pbnQgUmVwb3J0U3RhdHVzVG9TQ01ncihpbnQgY3VycmVudFN0YXRlLCBpbnQgZXhpdENvZGUsIGludCB3YWl0SGludCkKLXsKLSAgICBzdGF0aWMgaW50IGZpcnN0VGltZSA9IDE7Ci0gICAgc3RhdGljIGludCBjaGVja1BvaW50ID0gMTsKLSAgICBpbnQgcnY7Ci0gICAgCi0gICAgaWYoZmlyc3RUaW1lKQotICAgIHsKLSAgICAgICAgZmlyc3RUaW1lID0gMDsKLSAgICAgICAgZ2xvYmRhdC5zc1N0YXR1cy5kd1NlcnZpY2VUeXBlID0gU0VSVklDRV9XSU4zMl9PV05fUFJPQ0VTUzsKLSAgICAgICAgZ2xvYmRhdC5zc1N0YXR1cy5kd1NlcnZpY2VTcGVjaWZpY0V4aXRDb2RlID0gMDsKLSAgICAgICAgZ2xvYmRhdC5zc1N0YXR1cy5kd0NoZWNrUG9pbnQgPSAxOwotICAgIH0KLQotICAgIGlmKGdsb2JkYXQuY29ubmVjdGVkKQotICAgIHsKLSAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSA9PSBTRVJWSUNFX1NUQVJUX1BFTkRJTkcpCi0gICAgICAgICAgICBnbG9iZGF0LnNzU3RhdHVzLmR3Q29udHJvbHNBY2NlcHRlZCA9IDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGdsb2JkYXQuc3NTdGF0dXMuZHdDb250cm9sc0FjY2VwdGVkID0gU0VSVklDRV9BQ0NFUFRfU1RPUDsKLQotICAgICAgICBnbG9iZGF0LnNzU3RhdHVzLmR3Q3VycmVudFN0YXRlID0gY3VycmVudFN0YXRlOwotICAgICAgICBnbG9iZGF0LnNzU3RhdHVzLmR3V2luMzJFeGl0Q29kZSA9IGV4aXRDb2RlOwotICAgICAgICBpZih3YWl0SGludCkKLSAgICAgICAgICAgIGdsb2JkYXQuc3NTdGF0dXMuZHdXYWl0SGludCA9IHdhaXRIaW50OwotCi0gICAgICAgIGlmICggKCBjdXJyZW50U3RhdGUgPT0gU0VSVklDRV9SVU5OSU5HICkgfHwKLSAgICAgICAgICAgICAoIGN1cnJlbnRTdGF0ZSA9PSBTRVJWSUNFX1NUT1BQRUQgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdsb2JkYXQuc3NTdGF0dXMuZHdXYWl0SGludCA9IDA7Ci0gICAgICAgICAgICBnbG9iZGF0LnNzU3RhdHVzLmR3Q2hlY2tQb2ludCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZ2xvYmRhdC5zc1N0YXR1cy5kd0NoZWNrUG9pbnQgPSArK2NoZWNrUG9pbnQ7Ci0KLSAgICAgICAgcnYgPSBTZXRTZXJ2aWNlU3RhdHVzKGdsb2JkYXQuaFNlcnZpY2VTdGF0dXMsICZnbG9iZGF0LnNzU3RhdHVzKTsKLQotICAgIH0KLSAgICByZXR1cm4oMSk7Ci19Ci0KLXZvaWQgSW5zdGFsbFNlcnZpY2UoY2hhciAqc2VydmljZV9uYW1lLCBjaGFyICpjb25mKQotewotICAgIFNDX0hBTkRMRSAgIHNjaFNlcnZpY2U7Ci0gICAgU0NfSEFORExFICAgc2NoU0NNYW5hZ2VyOwotCi0gICAgVENIQVIgc3pQYXRoWzUxMl07Ci0gICAgVENIQVIgc3pRdW90ZWRQYXRoWzUxMl07Ci0KLSAgICBwcmludGYoIkluc3RhbGxpbmcgdGhlICVzIHNlcnZpY2UgdG8gdXNlICVzXG4iLCBzZXJ2aWNlX25hbWUsIGNvbmYpOwotCi0gICAgaWYgKEdldE1vZHVsZUZpbGVOYW1lKCBOVUxMLCBzelBhdGgsIDUxMiApID09IDApCi0gICAgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSfEFQTE9HX1dJTjMyRVJST1IsIE5VTEwsCi0gICAgICAgICJHZXRNb2R1bGVGaWxlTmFtZSBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGFwX3NucHJpbnRmKHN6UXVvdGVkUGF0aCwgNTEyLCAiXCIlc1wiIiwgc3pQYXRoKTsKLQotICAgIHNjaFNDTWFuYWdlciA9IE9wZW5TQ01hbmFnZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAvLyBtYWNoaW5lIChOVUxMID09IGxvY2FsKQotICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLy8gZGF0YWJhc2UgKE5VTEwgPT0gZGVmYXVsdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIFNDX01BTkFHRVJfQUxMX0FDQ0VTUyAgIC8vIGFjY2VzcyByZXF1aXJlZAotICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgIGlmICghc2NoU0NNYW5hZ2VyKSB7Ci0gICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUnxBUExPR19XSU4zMkVSUk9SLCBOVUxMLAotCSAgICJPcGVuU0NNYW5hZ2VyIGZhaWxlZCIpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc2NoU2VydmljZSA9IENyZWF0ZVNlcnZpY2UoCi0gICAgICAgICAgICBzY2hTQ01hbmFnZXIsICAgICAgICAgICAgICAgLy8gU0NNYW5hZ2VyIGRhdGFiYXNlCi0gICAgICAgICAgICBzZXJ2aWNlX25hbWUsICAgICAgICAgICAgICAgLy8gbmFtZSBvZiBzZXJ2aWNlCi0gICAgICAgICAgICBzZXJ2aWNlX25hbWUsICAgICAgICAgICAgICAgLy8gbmFtZSB0byBkaXNwbGF5Ci0gICAgICAgICAgICBTRVJWSUNFX0FMTF9BQ0NFU1MsICAgICAgICAgLy8gZGVzaXJlZCBhY2Nlc3MKLSAgICAgICAgICAgIFNFUlZJQ0VfV0lOMzJfT1dOX1BST0NFU1MsICAvLyBzZXJ2aWNlIHR5cGUKLSAgICAgICAgICAgIFNFUlZJQ0VfQVVUT19TVEFSVCwgICAgICAgLy8gc3RhcnQgdHlwZQotICAgICAgICAgICAgU0VSVklDRV9FUlJPUl9OT1JNQUwsICAgICAgIC8vIGVycm9yIGNvbnRyb2wgdHlwZQotICAgICAgICAgICAgc3pRdW90ZWRQYXRoLCAgICAgICAgICAgICAgIC8vIHNlcnZpY2UncyBiaW5hcnkKLSAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBsb2FkIG9yZGVyaW5nIGdyb3VwCi0gICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gdGFnIGlkZW50aWZpZXIKLSAgICAgICAgICAgIE5VTEwsICAgICAgIC8vIGRlcGVuZGVuY2llcwotICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8vIExvY2FsU3lzdGVtIGFjY291bnQKLSAgICAgICAgICAgIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAvLyBubyBwYXNzd29yZAotCi0gICAgICAgIGlmIChzY2hTZXJ2aWNlKSB7Ci0gICAgICAgICAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NoU2VydmljZSk7Ci0KLSAgICAgICAgICAgIC8qIE5vdyBzdG9yZSB0aGUgc2VydmVyX3Jvb3QgaW4gdGhlIHJlZ2lzdHJ5ICovCi0gICAgICAgICAgICBpZighYXBfcmVnaXN0cnlfc2V0X3NlcnZpY2VfY29uZihjb25mLCBzZXJ2aWNlX25hbWUpKQotICAgICAgICAgICAgICAgIHByaW50ZigiVGhlICVzIHNlcnZpY2UgaGFzIGJlZW4gaW5zdGFsbGVkIHN1Y2Nlc3NmdWxseS5cbiIsIHNlcnZpY2VfbmFtZSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUnxBUExPR19XSU4zMkVSUk9SLCBOVUxMLCAKLQkJIkNyZWF0ZVNlcnZpY2UgZmFpbGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NoU0NNYW5hZ2VyKTsKLSAgICB9Ci19Ci0KLQotdm9pZCBSZW1vdmVTZXJ2aWNlKGNoYXIgKnNlcnZpY2VfbmFtZSkKLXsKLSAgICBTQ19IQU5ETEUgICBzY2hTZXJ2aWNlOwotICAgIFNDX0hBTkRMRSAgIHNjaFNDTWFuYWdlcjsKLQotICAgIHByaW50ZigiUmVtb3ZpbmcgdGhlICVzIHNlcnZpY2VcbiIsIHNlcnZpY2VfbmFtZSk7Ci0KLSAgICBzY2hTQ01hbmFnZXIgPSBPcGVuU0NNYW5hZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLy8gbWFjaGluZSAoTlVMTCA9PSBsb2NhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgIC8vIGRhdGFiYXNlIChOVUxMID09IGRlZmF1bHQpCi0gICAgICAgICAgICAgICAgICAgICAgICBTQ19NQU5BR0VSX0FMTF9BQ0NFU1MgICAvLyBhY2Nlc3MgcmVxdWlyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgaWYgKCFzY2hTQ01hbmFnZXIpIHsKLSAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSfEFQTE9HX1dJTjMyRVJST1IsIE5VTEwsCi0JICAgIk9wZW5TQ01hbmFnZXIgZmFpbGVkIik7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBzY2hTZXJ2aWNlID0gT3BlblNlcnZpY2Uoc2NoU0NNYW5hZ2VyLCBzZXJ2aWNlX25hbWUsIFNFUlZJQ0VfQUxMX0FDQ0VTUyk7Ci0KLSAgICAgICAgaWYgKHNjaFNlcnZpY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgLyogQ291bGQgbm90IG9wZW4gdGhlIHNlcnZpY2UgKi8KLSAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUnxBUExPR19XSU4zMkVSUk9SLCBOVUxMLAotCQkJIk9wZW5TZXJ2aWNlIGZhaWxlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLyogdHJ5IHRvIHN0b3AgdGhlIHNlcnZpY2UgKi8KLSAgICAgICAgICAgIGFwX3N0b3Bfc2VydmljZShzY2hTZXJ2aWNlKTsKLQotICAgICAgICAgICAgLy8gbm93IHJlbW92ZSB0aGUgc2VydmljZQotICAgICAgICAgICAgaWYgKERlbGV0ZVNlcnZpY2Uoc2NoU2VydmljZSkgPT0gMCkKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUnxBUExPR19XSU4zMkVSUk9SLCBOVUxMLAotCQkgICAgIkRlbGV0ZVNlcnZpY2UgZmFpbGVkIik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcHJpbnRmKCJUaGUgJXMgc2VydmljZSBoYXMgYmVlbiByZW1vdmVkIHN1Y2Nlc3NmdWxseS5cbiIsIHNlcnZpY2VfbmFtZSApOwotICAgICAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjaFNlcnZpY2UpOwotICAgICAgICB9Ci0gICAgICAgIC8qIFNDTSByZW1vdmVzIHJlZ2lzdHJ5IHBhcmFtZXRlcnMgICovCi0gICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzY2hTQ01hbmFnZXIpOwotICAgIH0KLQotfQotCi0vKiBBIGhhY2sgdG8gZGV0ZXJtaW5lIGlmIHdlJ3JlIHJ1bm5pbmcgYXMgYSBzZXJ2aWNlIHdpdGhvdXQgd2FpdGluZyBmb3IKLSAqIHRoZSBTQ00gdG8gZmFpbDsgaWYgQWxsb2NDb25zb2xlIHN1Y2NlZWRzLCB3ZSdyZSBhIHNlcnZpY2UuCi0gKi8KLQotQk9PTCBpc1Byb2Nlc3NTZXJ2aWNlKCkgewotICAgIGlmKCAhQWxsb2NDb25zb2xlKCkgKSAKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIEZyZWVDb25zb2xlKCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qIERldGVybWluZSBpcyBzZXJ2aWNlX25hbWUgaXMgYSB2YWxpZCBzZXJ2aWNlCi0gKi8KLQotQk9PTCBpc1ZhbGlkU2VydmljZShjaGFyICpzZXJ2aWNlX25hbWUpIHsKLSAgICBTQ19IQU5ETEUgc2NoU0NNLCBzY2hTVkM7Ci0gICAgaW50IEVycjsKLQotICAgIGlmICghKHNjaFNDTSA9IE9wZW5TQ01hbmFnZXIoTlVMTCwgTlVMTCwgU0NfTUFOQUdFUl9BTExfQUNDRVNTKSkpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUnxBUExPR19XSU4zMkVSUk9SLCBOVUxMLAotICAgICAgICAiT3BlblNDTWFuYWdlciBmYWlsZWQiKTsKLSAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKChzY2hTVkMgPSBPcGVuU2VydmljZShzY2hTQ00sIHNlcnZpY2VfbmFtZSwgU0VSVklDRV9BTExfQUNDRVNTKSkpIHsKLSAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjaFNWQyk7Ci0gICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzY2hTQ00pOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLSAgICBFcnIgPSBHZXRMYXN0RXJyb3IoKTsKLSAgICBpZiAoRXJyICE9IEVSUk9SX1NFUlZJQ0VfRE9FU19OT1RfRVhJU1QgJiYgRXJyICE9IEVSUk9SX0lOVkFMSURfTkFNRSkKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUnxBUExPR19XSU4zMkVSUk9SLCBOVUxMLAotICAgICAgICAiT3BlblNlcnZpY2UgZmFpbGVkIik7Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLWludCBzZW5kX3NpZ25hbF90b19zZXJ2aWNlKGNoYXIgKnNlcnZpY2VfbmFtZSwgY2hhciAqc2lnKSB7Ci0gICAgU0NfSEFORExFICAgc2NoU2VydmljZTsKLSAgICBTQ19IQU5ETEUgICBzY2hTQ01hbmFnZXI7Ci0gICAgaW50IHN1Y2Nlc3MgPSBGQUxTRTsKLQotICAgIGVudW0gICAgICAgICAgICAgICAgICAgICAgICB7IHN0YXJ0LCAgICAgIHJlc3RhcnQsICAgICAgc3RvcCwgdW5rbm93biB9IGFjdGlvbjsKLSAgICBzdGF0aWMgY2hhciAqcGFyYW1bXSA9ICAgICAgeyAic3RhcnQiLCAgICAicmVzdGFydCIsICAgICJzaHV0ZG93biIgfTsKLSAgICBzdGF0aWMgY2hhciAqcGFydGljaXBsZVtdID0geyAic3RhcnRpbmciLCAicmVzdGFydGluZyIsICJzdG9wcGluZyIgfTsKLSAgICBzdGF0aWMgY2hhciAqcGFzdFtdICAgICAgID0geyAic3RhcnRlZCIsICAicmVzdGFydGVkIiwgICJzdG9wcGVkIiAgfTsKLQotICAgIGZvciAoYWN0aW9uID0gc3RhcnQ7IGFjdGlvbiA8IHVua25vd247IGFjdGlvbisrKQotICAgICAgICBpZiAoIXN0cmNhc2VjbXAoc2lnLCBwYXJhbVthY3Rpb25dKSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgaWYgKGFjdGlvbiA9PSB1bmtub3duKSB7Ci0gICAgICAgIHByaW50Zigic2lnbmFsIG11c3QgYmUgc3RhcnQsIHJlc3RhcnQsIG9yIHNodXRkb3duXG4iKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHNjaFNDTWFuYWdlciA9IE9wZW5TQ01hbmFnZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAvLyBtYWNoaW5lIChOVUxMID09IGxvY2FsKQotICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLy8gZGF0YWJhc2UgKE5VTEwgPT0gZGVmYXVsdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIFNDX01BTkFHRVJfQUxMX0FDQ0VTUyAgIC8vIGFjY2VzcyByZXF1aXJlZAotICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICBpZiAoIXNjaFNDTWFuYWdlcikgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSfEFQTE9HX1dJTjMyRVJST1IsIE5VTEwsCi0gICAgICAgICJPcGVuU0NNYW5hZ2VyIGZhaWxlZCIpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc2NoU2VydmljZSA9IE9wZW5TZXJ2aWNlKHNjaFNDTWFuYWdlciwgc2VydmljZV9uYW1lLCBTRVJWSUNFX0FMTF9BQ0NFU1MpOwotCi0gICAgICAgIGlmIChzY2hTZXJ2aWNlID09IE5VTEwpIHsKLSAgICAgICAgICAgIC8qIENvdWxkIG5vdCBvcGVuIHRoZSBzZXJ2aWNlICovCi0gICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlJ8QVBMT0dfV0lOMzJFUlJPUiwgTlVMTCwKLSAgICAgICAgICAgICJPcGVuU2VydmljZSBmYWlsZWQiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmICghUXVlcnlTZXJ2aWNlU3RhdHVzKHNjaFNlcnZpY2UsICZnbG9iZGF0LnNzU3RhdHVzKSkKLSAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSfEFQTE9HX1dJTjMyRVJST1IsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJRdWVyeVNlcnZpY2UgZmFpbGVkIik7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2xvYmRhdC5zc1N0YXR1cy5kd0N1cnJlbnRTdGF0ZSA9PSBTRVJWSUNFX1NUT1BQRUQgJiYgYWN0aW9uID09IHN0b3ApCi0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiVGhlICVzIHNlcnZpY2UgaXMgbm90IHN0YXJ0ZWQuXG4iLCBzZXJ2aWNlX25hbWUpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGdsb2JkYXQuc3NTdGF0dXMuZHdDdXJyZW50U3RhdGUgPT0gU0VSVklDRV9SVU5OSU5HICYmIGFjdGlvbiA9PSBzdGFydCkKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJUaGUgJXMgc2VydmljZSBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQuXG4iLCBzZXJ2aWNlX25hbWUpOwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwcmludGYoIlRoZSAlcyBzZXJ2aWNlIGlzICVzLlxuIiwgc2VydmljZV9uYW1lLCBwYXJ0aWNpcGxlW2FjdGlvbl0pOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gc3RvcCB8fCBhY3Rpb24gPT0gcmVzdGFydCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBhcF9zdG9wX3NlcnZpY2Uoc2NoU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gc3RhcnQgfHwgYWN0aW9uID09IHJlc3RhcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gYXBfc3RhcnRfc2VydmljZShzY2hTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIHN1Y2Nlc3MgKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJUaGUgJXMgc2VydmljZSBoYXMgJXMuXG4iLCBzZXJ2aWNlX25hbWUsIHBhc3RbYWN0aW9uXSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiRmFpbGVkIHRvICVzIHRoZSAlcyBzZXJ2aWNlLlxuIiwgc2lnLCBzZXJ2aWNlX25hbWUgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NoU2VydmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyogU0NNIHJlbW92ZXMgcmVnaXN0cnkgcGFyYW1ldGVycyAqLwotICAgICAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NoU0NNYW5hZ2VyKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLWludCBhcF9zdG9wX3NlcnZpY2UoU0NfSEFORExFIHNjaFNlcnZpY2UpCi17Ci0gICAgaWYgKENvbnRyb2xTZXJ2aWNlKHNjaFNlcnZpY2UsIFNFUlZJQ0VfQ09OVFJPTF9TVE9QLCAmZ2xvYmRhdC5zc1N0YXR1cykpIHsKLSAgICAgICAgU2xlZXAoMTAwMCk7Ci0gICAgICAgIHdoaWxlIChRdWVyeVNlcnZpY2VTdGF0dXMoc2NoU2VydmljZSwgJmdsb2JkYXQuc3NTdGF0dXMpKSB7Ci0gICAgICAgICAgICBpZiAoZ2xvYmRhdC5zc1N0YXR1cy5kd0N1cnJlbnRTdGF0ZSA9PSBTRVJWSUNFX1NUT1BfUEVORElORykKLSAgICAgICAgICAgICAgICBTbGVlcCgxMDAwKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoUXVlcnlTZXJ2aWNlU3RhdHVzKHNjaFNlcnZpY2UsICZnbG9iZGF0LnNzU3RhdHVzKSkKLSAgICAgICAgaWYgKGdsb2JkYXQuc3NTdGF0dXMuZHdDdXJyZW50U3RhdGUgPT0gU0VSVklDRV9TVE9QUEVEKQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1pbnQgYXBfc3RhcnRfc2VydmljZShTQ19IQU5ETEUgc2NoU2VydmljZSkgewotICAgIGlmIChTdGFydFNlcnZpY2Uoc2NoU2VydmljZSwgMCwgTlVMTCkpIHsKLSAgICAgICAgU2xlZXAoMTAwMCk7Ci0gICAgICAgIHdoaWxlKFF1ZXJ5U2VydmljZVN0YXR1cyhzY2hTZXJ2aWNlLCAmZ2xvYmRhdC5zc1N0YXR1cykpIHsKLSAgICAgICAgICAgIGlmKGdsb2JkYXQuc3NTdGF0dXMuZHdDdXJyZW50U3RhdGUgPT0gU0VSVklDRV9TVEFSVF9QRU5ESU5HKQotICAgICAgICAgICAgICAgIFNsZWVwKDEwMDApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChRdWVyeVNlcnZpY2VTdGF0dXMoc2NoU2VydmljZSwgJmdsb2JkYXQuc3NTdGF0dXMpKQotICAgICAgICBpZiAoZ2xvYmRhdC5zc1N0YXR1cy5kd0N1cnJlbnRTdGF0ZSA9PSBTRVJWSUNFX1JVTk5JTkcpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0gICAgICAgICAgIAotI2VuZGlmIC8qIFdJTjMyICovCi0KZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vd29ya2VyLy5jdnNpZ25vcmUgYi9zZXJ2ZXIvbXBtL3dvcmtlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGRmMjU3Li4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vd29ya2VyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLS5kZXBzCi0ubGlicwotKi5sbwotKi5sYQotTWFrZWZpbGUKZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vd29ya2VyL01ha2VmaWxlLmluIGIvc2VydmVyL21wbS93b3JrZXIvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YTAyNDMuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS93b3JrZXIvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQotTFRMSUJSQVJZX05BTUUgICAgPSBsaWJ3b3JrZXIubGEKLUxUTElCUkFSWV9TT1VSQ0VTID0gd29ya2VyLmMgZmRxdWV1ZS5jCi0KLWluY2x1ZGUgJCh0b3Bfc3JjZGlyKS9idWlsZC9sdGxpYi5tawpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS93b3JrZXIvY29uZmlnNS5tNCBiL3NlcnZlci9tcG0vd29ya2VyL2NvbmZpZzUubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYWI1MGUuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS93b3JrZXIvY29uZmlnNS5tNAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotZG5sICMjIFhYWCAtIE5lZWQgYSBtb3JlIHRob3JvdWdoIGNoZWNrIG9mIHRoZSBwcm9wZXIgZmxhZ3MgdG8gdXNlCi0KLWlmIHRlc3QgIiRNUE1fTkFNRSIgPSAid29ya2VyIiA7IHRoZW4KLSAgICBBUEFDSEVfRkFTVF9PVVRQVVQoc2VydmVyL21wbS8kTVBNX05BTUUvTWFrZWZpbGUpCi1maQpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS93b3JrZXIvZmRxdWV1ZS5jIGIvc2VydmVyL21wbS93b3JrZXIvZmRxdWV1ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDdhM2I3Li4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vd29ya2VyL2ZkcXVldWUuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotI2luY2x1ZGUgImZkcXVldWUuaCIKLSNpbmNsdWRlICJhcHJfcG9vbHMuaCIKLQotLyogQXNzdW1wdGlvbjogcXVldWUgaXRzZWxmIGlzIGFsbG9jYXRlZCBieSB0aGUgdXNlciAqLwotLyogQXNzdW1wdGlvbjogaW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgYXJlIGF0b21pYyBvbiBpbnQgKi8KLQotaW50IGFwX3F1ZXVlX3NpemUoRkRRdWV1ZSAqcXVldWUpIHsKLSAgICByZXR1cm4gKChxdWV1ZS0+dGFpbCAtIHF1ZXVlLT5oZWFkICsgcXVldWUtPmJvdW5kcykgJSBxdWV1ZS0+Ym91bmRzKTsKLX0KLQotaW50IGFwX3F1ZXVlX2Z1bGwoRkRRdWV1ZSAqcXVldWUpIHsKLSAgICByZXR1cm4ocXVldWUtPmJsYW5rcyA8PSAwKTsKLX0KLQotaW50IGFwX2Jsb2NrX29uX3F1ZXVlKEZEUXVldWUgKnF1ZXVlKSB7Ci0jaWYgMAotICAgIGlmIChwdGhyZWFkX211dGV4X2xvY2soJnF1ZXVlLT5vbmVfYmlnX211dGV4KSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBGRF9RVUVVRV9GQUlMVVJFOwotICAgIH0KLSNlbmRpZgotICAgIGlmIChhcF9xdWV1ZV9mdWxsKHF1ZXVlKSkgewotICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmcXVldWUtPm5vdF9mdWxsLCAmcXVldWUtPm9uZV9iaWdfbXV0ZXgpOwotICAgIH0KLSNpZiAwCi0gICAgaWYgKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxdWV1ZS0+b25lX2JpZ19tdXRleCkgIT0gMCkgewotICAgICAgICByZXR1cm4gRkRfUVVFVUVfRkFJTFVSRTsKLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm4gRkRfUVVFVUVfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCBpbmNyZWFzZV9ibGFua3MoRkRRdWV1ZSAqcXVldWUpIHsKLSAgICBxdWV1ZS0+YmxhbmtzKys7Ci0gICAgcmV0dXJuIEZEX1FVRVVFX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBhcHJfc3RhdHVzX3QgYXBfcXVldWVfZGVzdHJveSh2b2lkICpkYXRhKSB7Ci0gICAgRkRRdWV1ZSAqcXVldWUgPSBkYXRhOwotICAgIC8qIElnbm9yZSBlcnJvcnMgaGVyZSwgd2UgY2FuJ3QgZG8gYW55dGhpbmcgYWJvdXQgdGhlbSBhbnl3YXkgKi8KLSAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmcXVldWUtPm5vdF9lbXB0eSk7Ci0gICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJnF1ZXVlLT5ub3RfZnVsbCk7Ci0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZxdWV1ZS0+b25lX2JpZ19tdXRleCk7Ci0gICAgcmV0dXJuIEZEX1FVRVVFX1NVQ0NFU1M7Ci19Ci0KLWludCBhcF9xdWV1ZV9pbml0KEZEUXVldWUgKnF1ZXVlLCBpbnQgcXVldWVfY2FwYWNpdHksIGFwcl9wb29sX3QgKmEpIHsKLSAgICBpbnQgaTsKLSAgICBpbnQgYm91bmRzID0gcXVldWVfY2FwYWNpdHkgKyAxOwotICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmcXVldWUtPm9uZV9iaWdfbXV0ZXgsIE5VTEwpOwotICAgIHB0aHJlYWRfY29uZF9pbml0KCZxdWV1ZS0+bm90X2VtcHR5LCBOVUxMKTsKLSAgICBwdGhyZWFkX2NvbmRfaW5pdCgmcXVldWUtPm5vdF9mdWxsLCBOVUxMKTsKLSAgICBxdWV1ZS0+aGVhZCA9IHF1ZXVlLT50YWlsID0gMDsKLSAgICBxdWV1ZS0+ZGF0YSA9IGFwcl9wYWxsb2MoYSwgYm91bmRzICogc2l6ZW9mKEZEUXVldWVFbGVtZW50KSk7Ci0gICAgcXVldWUtPmJvdW5kcyA9IGJvdW5kczsKLSAgICBxdWV1ZS0+YmxhbmtzID0gcXVldWVfY2FwYWNpdHk7Ci0gICAgYXByX3Bvb2xfY2xlYW51cF9yZWdpc3RlcihhLCBxdWV1ZSwgYXBfcXVldWVfZGVzdHJveSwgYXByX3Bvb2xfY2xlYW51cF9udWxsKTsKLSAgICBmb3IgKGk9MDsgaSA8IGJvdW5kczsgKytpKQotICAgICAgICBxdWV1ZS0+ZGF0YVtpXS5zZCA9IE5VTEw7Ci0gICAgcmV0dXJuIEZEX1FVRVVFX1NVQ0NFU1M7Ci19Ci0KLWludCBhcF9xdWV1ZV9wdXNoKEZEUXVldWUgKnF1ZXVlLCBhcHJfc29ja2V0X3QgKnNkLCBhcHJfcG9vbF90ICpwKSB7Ci0gICAgcXVldWUtPmRhdGFbcXVldWUtPnRhaWxdLnNkID0gc2Q7Ci0gICAgcXVldWUtPmRhdGFbcXVldWUtPnRhaWxdLnAgID0gcDsKLSAgICBxdWV1ZS0+dGFpbCA9IChxdWV1ZS0+dGFpbCArIDEpICUgcXVldWUtPmJvdW5kczsKLSAgICBxdWV1ZS0+YmxhbmtzLS07Ci0gICAgcHRocmVhZF9jb25kX3NpZ25hbCgmcXVldWUtPm5vdF9lbXB0eSk7Ci0jaWYgMAotICAgIGlmIChxdWV1ZS0+aGVhZCA9PSAocXVldWUtPnRhaWwgKyAxKSAlIHF1ZXVlLT5ib3VuZHMpIHsKLSNlbmRpZgotICAgIGlmIChhcF9xdWV1ZV9mdWxsKHF1ZXVlKSkgewotICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmcXVldWUtPm5vdF9mdWxsLCAmcXVldWUtPm9uZV9iaWdfbXV0ZXgpOwotICAgIH0KLSAgICByZXR1cm4gRkRfUVVFVUVfU1VDQ0VTUzsKLX0KLQotYXByX3N0YXR1c190IGFwX3F1ZXVlX3BvcChGRFF1ZXVlICpxdWV1ZSwgYXByX3NvY2tldF90ICoqc2QsIGFwcl9wb29sX3QgKipwLCBpbnQgYmxvY2tfaWZfZW1wdHkpIHsKLSAgICBpbmNyZWFzZV9ibGFua3MocXVldWUpOwotICAgIC8qIFdlIGhhdmUganVzdCByZW1vdmVkIG9uZSBmcm9tIHRoZSBxdWV1ZS4gIEJ5IGRlZmluaXRpb24sIGl0IGlzCi0gICAgICogbm8gbG9uZ2VyIGZ1bGwuICBXZSBjYW4gQUxXQVlTIHNpZ25hbCB0aGUgbGlzdGVuZXIgdGhyZWFkIGF0Ci0gICAgICogdGhpcyBwb2ludC4gIEhvd2V2ZXIsIHRoZSBvcmlnaW5hbCBjb2RlIGRpZG4ndCBkbyBpdCB0aGlzIHdheSwKLSAgICAgKiBzbyBJIGFtIGxlYXZpbmcgdGhlIG9yaWdpbmFsIGNvZGUgaW4sIGp1c3QgY29tbWVudGVkIG91dC4gIEJUVywKLSAgICAgKiBvcmlnaW5hbGx5LCB0aGUgaW5jcmVhc2VfYmxhbmtzIHdhc24ndCBpbiB0aGlzIGZ1bmN0aW9uIGVpdGhlci4KLSAgICAgKgotICAgICBpZiAocXVldWUtPmJsYW5rcyA+IDApIHsKLSAgICAgKi8KLSAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZxdWV1ZS0+bm90X2Z1bGwpOwotCi0gICAgLyogICAgfSAgICAqLwotICAgIGlmIChxdWV1ZS0+aGVhZCA9PSBxdWV1ZS0+dGFpbCkgewotICAgICAgICBpZiAoYmxvY2tfaWZfZW1wdHkpIHsKLSAgICAgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZxdWV1ZS0+bm90X2VtcHR5LCAmcXVldWUtPm9uZV9iaWdfbXV0ZXgpOwotICAgICAgICB9Ci0gICAgfSAKLSAgICAKLSAgICAqc2QgPSBxdWV1ZS0+ZGF0YVtxdWV1ZS0+aGVhZF0uc2Q7Ci0gICAgKnAgID0gcXVldWUtPmRhdGFbcXVldWUtPmhlYWRdLnA7Ci0gICAgcXVldWUtPmRhdGFbcXVldWUtPmhlYWRdLnNkID0gTlVMTDsKLSAgICBpZiAoKnNkICE9IE5VTEwpIHsKLSAgICAgICAgcXVldWUtPmhlYWQgPSAocXVldWUtPmhlYWQgKyAxKSAlIHF1ZXVlLT5ib3VuZHM7Ci0gICAgfQotICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLX0KZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vd29ya2VyL2ZkcXVldWUuaCBiL3NlcnZlci9tcG0vd29ya2VyL2ZkcXVldWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFjYWIyZC4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL3dvcmtlci9mZHF1ZXVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotI2lmbmRlZiBGRFFVRVVFX0gKLSNkZWZpbmUgRkRRVUVVRV9ICi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0jZGVmaW5lIEZEX1FVRVVFX1NVQ0NFU1MgMAotI2RlZmluZSBGRF9RVUVVRV9GQUlMVVJFIC0xIC8qIE5lZWRzIHRvIGJlIGFuIGludmFsaWQgZmlsZSBkZXNjcmlwdG9yIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBxdWV1ZV9wb3Agc2VtYW50aWNzICovCi0KLXR5cGVkZWYgc3RydWN0IGZkX3F1ZXVlX2VsZW0gewotICAgIGFwcl9zb2NrZXRfdCAqc2Q7Ci0gICAgYXByX3Bvb2xfdCAqcDsKLX0gRkRRdWV1ZUVsZW1lbnQ7Ci0KLXR5cGVkZWYgc3RydWN0IGZkX3F1ZXVlIHsKLSAgICBpbnQgaGVhZDsKLSAgICBpbnQgdGFpbDsKLSAgICBGRFF1ZXVlRWxlbWVudCAqZGF0YTsKLSAgICBpbnQgYm91bmRzOwotICAgIGludCBibGFua3M7Ci0gICAgcHRocmVhZF9tdXRleF90IG9uZV9iaWdfbXV0ZXg7Ci0gICAgcHRocmVhZF9jb25kX3Qgbm90X2VtcHR5OwotICAgIHB0aHJlYWRfY29uZF90IG5vdF9mdWxsOwotfSBGRFF1ZXVlOwotCi1pbnQgYXBfcXVldWVfaW5pdChGRFF1ZXVlICpxdWV1ZSwgaW50IHF1ZXVlX3NpemUsIGFwcl9wb29sX3QgKmEpOwotaW50IGFwX3F1ZXVlX3B1c2goRkRRdWV1ZSAqcXVldWUsIGFwcl9zb2NrZXRfdCAqc2QsIGFwcl9wb29sX3QgKnApOwotYXByX3N0YXR1c190IGFwX3F1ZXVlX3BvcChGRFF1ZXVlICpxdWV1ZSwgYXByX3NvY2tldF90ICoqc2QsIGFwcl9wb29sX3QgKipwLCBpbnQgYmxvY2tfaWZfZW1wdHkpOwotaW50IGFwX3F1ZXVlX3NpemUoRkRRdWV1ZSAqcXVldWUpOwotaW50IGFwX3F1ZXVlX2Z1bGwoRkRRdWV1ZSAqcXVldWUpOwotaW50IGFwX2Jsb2NrX29uX3F1ZXVlKEZEUXVldWUgKnF1ZXVlKTsKLQotI2VuZGlmIC8qIEZEUVVFVUVfSCAqLwpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS93b3JrZXIvbXBtLmggYi9zZXJ2ZXIvbXBtL3dvcmtlci9tcG0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNlZDI3Yy4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL3dvcmtlci9tcG0uaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCi0gKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAotICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqLwotI2luY2x1ZGUgInNjb3JlYm9hcmQuaCIKLSNpbmNsdWRlICJ1bml4ZC5oIgotCi0jaWZuZGVmIEFQQUNIRV9NUE1fV09SS0VSX0gKLSNkZWZpbmUgQVBBQ0hFX01QTV9XT1JLRVJfSAotCi0jZGVmaW5lIFdPUktFUl9NUE0KLQotI2RlZmluZSBNUE1fTkFNRSAiV29ya2VyIgotCi0jZGVmaW5lIEFQX01QTV9ORUVEU19SRUNMQUlNX0NISUxEX1BST0NFU1NFUyAxCi0jZGVmaW5lIE1QTV9TWU5DX0NISUxEX1RBQkxFKCkgKGFwX3N5bmNfc2NvcmVib2FyZF9pbWFnZSgpKQotI2RlZmluZSBNUE1fQ0hJTERfUElEKGkpIChhcF9zY29yZWJvYXJkX2ltYWdlLT5wYXJlbnRbaV0ucGlkKQotI2RlZmluZSBNUE1fTk9URV9DSElMRF9LSUxMRUQoaSkgKE1QTV9DSElMRF9QSUQoaSkgPSAwKQotCi1leHRlcm4gaW50IGFwX3RocmVhZHNfcGVyX2NoaWxkOwotZXh0ZXJuIGludCBhcF9tYXhfZGFlbW9uc19saW1pdDsKLWV4dGVybiBzZXJ2ZXJfcmVjICphcF9zZXJ2ZXJfY29uZjsKLWV4dGVybiBjaGFyIGFwX2NvcmVkdW1wX2RpcltNQVhfU1RSSU5HX0xFTl07Ci0KLSNlbmRpZiAvKiBBUEFDSEVfTVBNX1dPUktFUl9IICovCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL3dvcmtlci9tcG1fZGVmYXVsdC5oIGIvc2VydmVyL21wbS93b3JrZXIvbXBtX2RlZmF1bHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRjMTMwNC4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL3dvcmtlci9tcG1fZGVmYXVsdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCi0gKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAotICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqLwotCi0jaWZuZGVmIEFQQUNIRV9NUE1fREVGQVVMVF9ICi0jZGVmaW5lIEFQQUNIRV9NUE1fREVGQVVMVF9ICi0KLSNkZWZpbmUgQVBfSURfRlJPTV9DSElMRF9USFJFQUQoYywgdCkgICAgKChjICogSEFSRF9USFJFQURfTElNSVQpICsgdCkKLSNkZWZpbmUgQVBfQ0hJTERfVEhSRUFEX0ZST01fSUQoaSkgICAgKGkgLyBIQVJEX1RIUkVBRF9MSU1JVCksIChpICUgSEFSRF9USFJFQURfTElNSVQpCi0KLS8qIE51bWJlciBvZiBzZXJ2ZXJzIHRvIHNwYXduIG9mZiBieSBkZWZhdWx0IC0tLSBhbHNvLCBpZiBmZXdlciB0aGFuCi0gKiB0aGlzIGZyZWUgd2hlbiB0aGUgY2FyZXRha2VyIGNoZWNrcywgaXQgd2lsbCBzcGF3biBtb3JlLgotICovCi0jaWZuZGVmIERFRkFVTFRfU1RBUlRfREFFTU9OCi0jZGVmaW5lIERFRkFVTFRfU1RBUlRfREFFTU9OIDMKLSNlbmRpZgotCi0vKiBNYXhpbXVtIG51bWJlciBvZiAqZnJlZSogc2VydmVyIHByb2Nlc3NlcyAtLS0gbW9yZSB0aGFuIHRoaXMsIGFuZAotICogdGhleSB3aWxsIGRpZSBvZmYuCi0gKi8KLQotI2lmbmRlZiBERUZBVUxUX01BWF9GUkVFX0RBRU1PTgotI2RlZmluZSBERUZBVUxUX01BWF9GUkVFX0RBRU1PTiAxMAotI2VuZGlmCi0KLS8qIE1pbmltdW0gLS0tIGZld2VyIHRoYW4gdGhpcywgYW5kIG1vcmUgd2lsbCBiZSBjcmVhdGVkICovCi0KLSNpZm5kZWYgREVGQVVMVF9NSU5fRlJFRV9EQUVNT04KLSNkZWZpbmUgREVGQVVMVF9NSU5fRlJFRV9EQUVNT04gMwotI2VuZGlmCi0KLS8qIExpbWl0IG9uIHRoZSB0b3RhbCAtLS0gY2xpZW50cyB3aWxsIGJlIGxvY2tlZCBvdXQgaWYgbW9yZSBzZXJ2ZXJzIHRoYW4KLSAqIHRoaXMgYXJlIG5lZWRlZC4gIEl0IGlzIGludGVuZGVkIHNvbGVseSB0byBrZWVwIHRoZSBzZXJ2ZXIgZnJvbSBjcmFzaGluZwotICogd2hlbiB0aGluZ3MgZ2V0IG91dCBvZiBoYW5kLgotICoKLSAqIFdlIGtlZXAgYSBoYXJkIG1heGltdW0gbnVtYmVyIG9mIHNlcnZlcnMsIGZvciB0d28gcmVhc29ucyAtLS0gZmlyc3Qgb2ZmLAotICogaW4gY2FzZSBzb21ldGhpbmcgZ29lcyBzZXJpb3VzbHkgd3JvbmcsIHdlIHdhbnQgdG8gc3RvcCB0aGUgZm9yayBib21iCi0gKiBzaG9ydCBvZiBhY3R1YWxseSBjcmFzaGluZyB0aGUgbWFjaGluZSB3ZSdyZSBydW5uaW5nIG9uIGJ5IGZpbGxpbmcgc29tZQotICoga2VybmVsIHRhYmxlLiAgU2Vjb25kbHksIGl0IGtlZXBzIHRoZSBzaXplIG9mIHRoZSBzY29yZWJvYXJkIGZpbGUgc21hbGwKLSAqIGVub3VnaCB0aGF0IHdlIGNhbiByZWFkIHRoZSB3aG9sZSB0aGluZyB3aXRob3V0IHdvcnJ5aW5nIHRvbyBtdWNoIGFib3V0Ci0gKiB0aGUgb3ZlcmhlYWQuCi0gKi8KLSNpZmRlZiBOT19USFJFQURTCi0jZGVmaW5lIEhBUkRfU0VSVkVSX0xJTUlUIDI1NgotI2VuZGlmCi0jaWZuZGVmIEhBUkRfU0VSVkVSX0xJTUlUCi0jZGVmaW5lIEhBUkRfU0VSVkVSX0xJTUlUIDggCi0jZW5kaWYKLQotLyogTGltaXQgb24gdGhlIHRocmVhZHMgcGVyIHByb2Nlc3MuICBDbGllbnRzIHdpbGwgYmUgbG9ja2VkIG91dCBpZiBtb3JlIHRoYW4KLSAqIHRoaXMgICogSEFSRF9TRVJWRVJfTElNSVQgYXJlIG5lZWRlZC4KLSAqCi0gKiBXZSBrZWVwIHRoaXMgZm9yIG9uZSByZWFzb24gaXQga2VlcHMgdGhlIHNpemUgb2YgdGhlIHNjb3JlYm9hcmQgZmlsZSBzbWFsbAotICogZW5vdWdoIHRoYXQgd2UgY2FuIHJlYWQgdGhlIHdob2xlIHRoaW5nIHdpdGhvdXQgd29ycnlpbmcgdG9vIG11Y2ggYWJvdXQKLSAqIHRoZSBvdmVyaGVhZC4KLSAqLwotI2lmZGVmIE5PX1RIUkVBRFMKLSNkZWZpbmUgSEFSRF9USFJFQURfTElNSVQgMQotI2VuZGlmCi0jaWZuZGVmIEhBUkRfVEhSRUFEX0xJTUlUCi0jZGVmaW5lIEhBUkRfVEhSRUFEX0xJTUlUIDY0IAotI2VuZGlmCi0KLSNpZmRlZiBOT19USFJFQURTCi0jZGVmaW5lIERFRkFVTFRfVEhSRUFEU19QRVJfQ0hJTEQgMQotI2VuZGlmCi0jaWZuZGVmIERFRkFVTFRfVEhSRUFEU19QRVJfQ0hJTEQKLSNkZWZpbmUgREVGQVVMVF9USFJFQURTX1BFUl9DSElMRCAyNQotI2VuZGlmCi0KLS8qIEZpbGUgdXNlZCBmb3IgYWNjZXB0IGxvY2tpbmcsIHdoZW4gd2UgdXNlIGEgZmlsZSAqLwotI2lmbmRlZiBERUZBVUxUX0xPQ0tGSUxFCi0jZGVmaW5lIERFRkFVTFRfTE9DS0ZJTEUgImxvZ3MvYWNjZXB0LmxvY2siCi0jZW5kaWYKLQotLyogU2NvcmVib2FyZCBmaWxlLCBpZiB0aGVyZSBpcyBvbmUgKi8KLSNpZm5kZWYgREVGQVVMVF9TQ09SRUJPQVJECi0jZGVmaW5lIERFRkFVTFRfU0NPUkVCT0FSRCAibG9ncy9hcGFjaGVfcnVudGltZV9zdGF0dXMiCi0jZW5kaWYKLQotLyogV2hlcmUgdGhlIG1haW4vcGFyZW50IHByb2Nlc3MncyBwaWQgaXMgbG9nZ2VkICovCi0jaWZuZGVmIERFRkFVTFRfUElETE9HCi0jZGVmaW5lIERFRkFVTFRfUElETE9HICJsb2dzL2h0dHBkLnBpZCIKLSNlbmRpZgotCi0vKgotICogSW50ZXJ2YWwsIGluIG1pY3Jvc2Vjb25kcywgYmV0d2VlbiBzY29yZWJvYXJkIG1haW50ZW5hbmNlLgotICovCi0jaWZuZGVmIFNDT1JFQk9BUkRfTUFJTlRFTkFOQ0VfSU5URVJWQUwKLSNkZWZpbmUgU0NPUkVCT0FSRF9NQUlOVEVOQU5DRV9JTlRFUlZBTCAxMDAwMDAwCi0jZW5kaWYKLQotLyogTnVtYmVyIG9mIHJlcXVlc3RzIHRvIHRyeSB0byBoYW5kbGUgaW4gYSBzaW5nbGUgcHJvY2Vzcy4gIElmIDw9IDAsCi0gKiB0aGUgY2hpbGRyZW4gZG9uJ3QgZGllIG9mZi4KLSAqLwotI2lmbmRlZiBERUZBVUxUX01BWF9SRVFVRVNUU19QRVJfQ0hJTEQKLSNkZWZpbmUgREVGQVVMVF9NQVhfUkVRVUVTVFNfUEVSX0NISUxEIDEwMDAwCi0jZW5kaWYKLQotI2VuZGlmIC8qIEFQX01QTV9ERUZBVUxUX0ggKi8KZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vd29ya2VyL3BvZC5jIGIvc2VydmVyL21wbS93b3JrZXIvcG9kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NjllNDMuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS93b3JrZXIvcG9kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBiYXNlZCB1cG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUKLSAqIG9yaWdpbmFsbHkgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsCi0gKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICovCi0KLSNpbmNsdWRlICJhcHIuaCIKLSNpbmNsdWRlICJhcHJfc3RyaW5ncy5oIgotI2luY2x1ZGUgImFwcl9sb2NrLmgiCi0jZGVmaW5lIEFQUl9XQU5UX1NUUkZVTkMKLSNpbmNsdWRlICJhcHJfd2FudC5oIgotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiCi0jaW5jbHVkZSAibXBtLmgiCi0jaW5jbHVkZSAicG9kLmgiCi0jaW5jbHVkZSAibXBtX2NvbW1vbi5oIgotI2luY2x1ZGUgImFwX21wbS5oIgotI2luY2x1ZGUgImFwX2xpc3Rlbi5oIgotI2luY2x1ZGUgIm1wbV9kZWZhdWx0LmgiCi0KLUFQX0RFQ0xBUkUoYXByX3N0YXR1c190KSBhcF9tcG1fcG9kX29wZW4oYXByX3Bvb2xfdCAqcCwgYXBfcG9kX3QgKipwb2QpCi17Ci0gICAgYXByX3N0YXR1c190IHJ2OwotCi0gICAgKnBvZCA9IGFwcl9wYWxsb2MocCwgc2l6ZW9mKCoqcG9kKSk7Ci0gICAgcnYgPSBhcHJfZmlsZV9waXBlX2NyZWF0ZSgmKCgqcG9kKS0+cG9kX2luKSwgJigoKnBvZCktPnBvZF9vdXQpLCBwKTsKLSAgICBpZiAocnYgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIHJ2OwotICAgIH0KLS8qCi0gICAgYXByX2ZpbGVfcGlwZV90aW1lb3V0X3NldCgoKnBvZCktPnBvZF9pbiwgMCk7Ci0qLwotICAgICgqcG9kKS0+cCA9IHA7Ci0gICAgCi0gICAgYXByX3NvY2thZGRyX2luZm9fZ2V0KCYoKnBvZCktPnNhLCBhcF9saXN0ZW5lcnMtPmJpbmRfYWRkci0+aG9zdG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFQUl9VTlNQRUMsIGFwX2xpc3RlbmVycy0+YmluZF9hZGRyLT5wb3J0LCAwLCBwKTsKLQotICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLX0KLQotQVBfREVDTEFSRShpbnQpIGFwX21wbV9wb2RfY2hlY2soYXBfcG9kX3QgKnBvZCkKLXsKLSAgICBjaGFyIGM7Ci0gICAgYXByX3NpemVfdCBsZW4gPSAxOwotICAgIGFwcl9zdGF0dXNfdCBydjsKLQotICAgIHJ2ID0gYXByX2ZpbGVfcmVhZChwb2QtPnBvZF9pbiwgJmMsICZsZW4pOwotCi0gICAgaWYgKChydiA9PSBBUFJfU1VDQ0VTUykgJiYgKGxlbiA9PTEpKSB7Ci0gICAgICAgIGlmIChjID09IFJFU1RBUlRfQ0hBUikgewotICAgICAgICAgICAgcmV0dXJuIEFQX1JFU1RBUlQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGMgPT0gR1JBQ0VGVUxfQ0hBUikgewotICAgICAgICAgICAgcmV0dXJuIEFQX0dSQUNFRlVMOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHJ2ICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBydjsKLSAgICB9Ci0gICAgcmV0dXJuIEFQX05PUkVTVEFSVDsKLX0KLQotQVBfREVDTEFSRShhcHJfc3RhdHVzX3QpIGFwX21wbV9wb2RfY2xvc2UoYXBfcG9kX3QgKnBvZCkKLXsKLSAgICBhcHJfc3RhdHVzX3QgcnY7Ci0KLSAgICBydiA9IGFwcl9maWxlX2Nsb3NlKHBvZC0+cG9kX291dCk7Ci0gICAgaWYgKHJ2ICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBydjsKLSAgICB9Ci0KLSAgICBydiA9IGFwcl9maWxlX2Nsb3NlKHBvZC0+cG9kX2luKTsKLSAgICBpZiAocnYgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIHJ2OwotICAgIH0KLSAgICByZXR1cm4gcnY7Ci19Ci0KLXN0YXRpYyBhcHJfc3RhdHVzX3QgcG9kX3NpZ25hbF9pbnRlcm5hbChhcF9wb2RfdCAqcG9kLCBpbnQgZ3JhY2VmdWwpCi17Ci0gICAgYXByX3N0YXR1c190IHJ2OwotICAgIGNoYXIgY2hhcl9vZl9kZWF0aCA9IGdyYWNlZnVsID8gR1JBQ0VGVUxfQ0hBUiA6IFJFU1RBUlRfQ0hBUjsKLSAgICBhcHJfc2l6ZV90IG9uZSA9IDE7Ci0KLSAgICBkbyB7Ci0gICAgICAgIHJ2ID0gYXByX2ZpbGVfd3JpdGUocG9kLT5wb2Rfb3V0LCAmY2hhcl9vZl9kZWF0aCwgJm9uZSk7Ci0gICAgfSB3aGlsZSAoQVBSX1NUQVRVU19JU19FSU5UUihydikpOwotICAgIGlmIChydiAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgcnYsIGFwX3NlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHBpcGVfb2ZfZGVhdGgiKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJ2OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGNvbm5lY3RzIHRvIHRoZSBzZXJ2ZXIsIHRoZW4gaW1tZWRpYXRlbHkgY2xvc2VzIHRoZSBjb25uZWN0aW9uLgotICogVGhpcyBwZXJtaXRzIHRoZSBNUE0gdG8gc2tpcCB0aGUgcG9sbCB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIGxpc3RlbmluZwotICogc29ja2V0LCBiZWNhdXNlIGl0IHByb3ZpZGVzIGEgYWx0ZXJuYXRlIHdheSB0byB1bmJsb2NrIGFuIGFjY2VwdCgpIHdoZW4KLSAqIHRoZSBwb2QgaXMgdXNlZC4KLSAqLwotCi1zdGF0aWMgYXByX3N0YXR1c190IGR1bW15X2Nvbm5lY3Rpb24oYXBfcG9kX3QgKnBvZCkKLXsKLSAgICBhcHJfc3RhdHVzX3QgcnY7Ci0gICAgYXByX3NvY2tldF90ICpzb2NrOwotICAgIGFwcl9wb29sX3QgKnA7Ci0gICAgCi0gICAgLyogY3JlYXRlIGEgdGVtcG9yYXJ5IHBvb2wgZm9yIHRoZSBzb2NrZXQuICBwY29uZiBzdGF5cyBhcm91bmQgdG9vIGxvbmcgKi8KLSAgICBydiA9IGFwcl9wb29sX2NyZWF0ZSgmcCwgcG9kLT5wKTsKLSAgICBpZiAocnYgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIHJ2OwotICAgIH0KLSAgICAKLSAgICBydiA9IGFwcl9zb2NrZXRfY3JlYXRlKCZzb2NrLCBwb2QtPnNhLT5mYW1pbHksIFNPQ0tfU1RSRUFNLCBwKTsKLSAgICBpZiAocnYgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIHJ2LCBhcF9zZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJnZXQgc29ja2V0IHRvIGNvbm5lY3QgdG8gbGlzdGVuZXIiKTsKLSAgICAgICAgcmV0dXJuIHJ2OwotICAgIH0KLSAgICAvKiBvbiBzb21lIHBsYXRmb3JtcyAoZS5nLiwgRnJlZUJTRCksIHRoZSBrZXJuZWwgd29uJ3QgYWNjZXB0IG1hbnkKLSAgICAgKiBxdWV1ZWQgY29ubmVjdGlvbnMgYmVmb3JlIGl0IHN0YXJ0cyBibG9ja2luZyBsb2NhbCBjb25uZWN0cy4uLgotICAgICAqIHdlIG5lZWQgdG8ga2VlcCBmcm9tIGJsb2NraW5nIHRvbyBsb25nIGFuZCBpbnN0ZWFkIHJldHVybiBhbiBlcnJvciwKLSAgICAgKiBiZWNhdXNlIHRoZSBNUE0gd29uJ3Qgd2FudCB0byBob2xkIHVwIGEgZ3JhY2VmdWwgcmVzdGFydCBmb3IgYQotICAgICAqIGxvbmcgdGltZQotICAgICAqLwotICAgIHJ2ID0gYXByX3NldHNvY2tldG9wdChzb2NrLCBBUFJfU09fVElNRU9VVCwgMyAqIEFQUl9VU0VDX1BFUl9TRUMpOwotICAgIGlmIChydiAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgcnYsIGFwX3NlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgInNldCB0aW1lb3V0IG9uIHNvY2tldCB0byBjb25uZWN0IHRvIGxpc3RlbmVyIik7Ci0gICAgICAgIHJldHVybiBydjsKLSAgICB9Ci0gICAgCi0gICAgcnYgPSBhcHJfY29ubmVjdChzb2NrLCBwb2QtPnNhKTsgICAgCi0gICAgaWYgKHJ2ICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgIGludCBsb2dfbGV2ZWwgPSBBUExPR19XQVJOSU5HOwotCi0gICAgICAgIGlmIChBUFJfU1RBVFVTX0lTX1RJTUVVUChydikpIHsKLSAgICAgICAgICAgIC8qIHByb2JhYmx5IHNvbWUgc2VydmVyIHByb2Nlc3NlcyBiYWlsZWQgb3V0IGFscmVhZHkgYW5kIHRoZXJlIAotICAgICAgICAgICAgICogaXMgbm9ib2R5IGFyb3VuZCB0byBjYWxsIGFjY2VwdCBhbmQgY2xlYXIgb3V0IHRoZSBrZXJuZWwgCi0gICAgICAgICAgICAgKiBjb25uZWN0aW9uIHF1ZXVlOyB1c3VhbGx5IHRoaXMgaXMgbm90IHdvcnRoIGxvZ2dpbmcKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbG9nX2xldmVsID0gQVBMT0dfREVCVUc7Ci0gICAgICAgIH0KLQkKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIGxvZ19sZXZlbCwgcnYsIGFwX3NlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgImNvbm5lY3QgdG8gbGlzdGVuZXIiKTsKLSAgICB9Ci0KLSAgICBhcHJfc29ja2V0X2Nsb3NlKHNvY2spOwotICAgIGFwcl9wb29sX2Rlc3Ryb3kocCk7Ci0KLSAgICByZXR1cm4gcnY7Ci19Ci0KLUFQX0RFQ0xBUkUoYXByX3N0YXR1c190KSBhcF9tcG1fcG9kX3NpZ25hbChhcF9wb2RfdCAqcG9kLCBpbnQgZ3JhY2VmdWwpCi17Ci0gICAgYXByX3N0YXR1c190IHJ2OwotCi0gICAgcnYgPSBwb2Rfc2lnbmFsX2ludGVybmFsKHBvZCwgZ3JhY2VmdWwpOwotICAgIGlmIChydiAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICByZXR1cm4gcnY7Ci0gICAgfQotICAgIHJldHVybiBkdW1teV9jb25uZWN0aW9uKHBvZCk7Ci19Ci0KLUFQX0RFQ0xBUkUodm9pZCkgYXBfbXBtX3BvZF9raWxscGcoYXBfcG9kX3QgKnBvZCwgaW50IG51bSwgaW50IGdyYWNlZnVsKQotewotICAgIGludCBpOwotICAgIGFwcl9zdGF0dXNfdCBydiA9IEFQUl9TVUNDRVNTOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bSAmJiBydiA9PSBBUFJfU1VDQ0VTUzsgaSsrKSB7Ci0gICAgICAgIHJ2ID0gcG9kX3NpZ25hbF9pbnRlcm5hbChwb2QsIGdyYWNlZnVsKTsKLSAgICB9Ci0gICAgaWYgKHJ2ID09IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW0gJiYgcnYgPT0gQVBSX1NVQ0NFU1M7IGkrKykgewotICAgICAgICAgICAgIHJ2ID0gZHVtbXlfY29ubmVjdGlvbihwb2QpOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL3dvcmtlci9wb2QuaCBiL3NlcnZlci9tcG0vd29ya2VyL3BvZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzY4YjRiLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vd29ya2VyL3BvZC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBiYXNlZCB1cG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUKLSAqIG9yaWdpbmFsbHkgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsCi0gKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICovCi0KLSNpbmNsdWRlICJhcHIuaCIKLSNpbmNsdWRlICJhcHJfc3RyaW5ncy5oIgotI2luY2x1ZGUgImFwcl9sb2NrLmgiCi0jZGVmaW5lIEFQUl9XQU5UX1NUUkZVTkMKLSNpbmNsdWRlICJhcHJfd2FudC5oIgotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiCi0jaW5jbHVkZSAibXBtLmgiCi0jaW5jbHVkZSAibXBtX2NvbW1vbi5oIgotI2luY2x1ZGUgImFwX21wbS5oIgotI2luY2x1ZGUgImFwX2xpc3Rlbi5oIgotI2luY2x1ZGUgIm1wbV9kZWZhdWx0LmgiCi0KLSNkZWZpbmUgUkVTVEFSVF9DSEFSICckJwotI2RlZmluZSBHUkFDRUZVTF9DSEFSICchJwotCi0jZGVmaW5lIEFQX1JFU1RBUlQgIDAKLSNkZWZpbmUgQVBfR1JBQ0VGVUwgMQotCi10eXBlZGVmIHN0cnVjdCBhcF9wb2RfdCBhcF9wb2RfdDsKLQotc3RydWN0IGFwX3BvZF90IHsKLSAgICBhcHJfZmlsZV90ICpwb2RfaW47Ci0gICAgYXByX2ZpbGVfdCAqcG9kX291dDsKLSAgICBhcHJfcG9vbF90ICpwOwotICAgIGFwcl9zb2NrYWRkcl90ICpzYTsKLX07Ci0KLUFQX0RFQ0xBUkUoYXByX3N0YXR1c190KSBhcF9tcG1fcG9kX29wZW4oYXByX3Bvb2xfdCAqcCwgYXBfcG9kX3QgKipwb2QpOwotQVBfREVDTEFSRShpbnQpIGFwX21wbV9wb2RfY2hlY2soYXBfcG9kX3QgKnBvZCk7Ci1BUF9ERUNMQVJFKGFwcl9zdGF0dXNfdCkgYXBfbXBtX3BvZF9jbG9zZShhcF9wb2RfdCAqcG9kKTsKLUFQX0RFQ0xBUkUoYXByX3N0YXR1c190KSBhcF9tcG1fcG9kX3NpZ25hbChhcF9wb2RfdCAqcG9kLCBpbnQgZ3JhY2VmdWwpOwotQVBfREVDTEFSRSh2b2lkKSBhcF9tcG1fcG9kX2tpbGxwZyhhcF9wb2RfdCAqcG9kLCBpbnQgbnVtLCBpbnQgZ3JhY2VmdWwpOwpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS93b3JrZXIvd29ya2VyLmMgYi9zZXJ2ZXIvbXBtL3dvcmtlci93b3JrZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY5NjlhZi4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL3dvcmtlci93b3JrZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NjAgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBiYXNlZCB1cG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUKLSAqIG9yaWdpbmFsbHkgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsCi0gKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICovCi0KLSNpbmNsdWRlICJhcHIuaCIKLSNpbmNsdWRlICJhcHJfcG9ydGFibGUuaCIKLSNpbmNsdWRlICJhcHJfc3RyaW5ncy5oIgotI2luY2x1ZGUgImFwcl9maWxlX2lvLmgiCi0jaW5jbHVkZSAiYXByX3RocmVhZF9wcm9jLmgiCi0jaW5jbHVkZSAiYXByX3NpZ25hbC5oIgotI2RlZmluZSBBUFJfV0FOVF9TVFJGVU5DCi0jaW5jbHVkZSAiYXByX3dhbnQuaCIKLQotI2lmIEFQUl9IQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpZiBBUFJfSEFWRV9TWVNfU09DS0VUX0gKLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jZW5kaWYKLSNpZiBBUFJfSEFWRV9TWVNfV0FJVF9ICi0jaW5jbHVkZSA8c3lzL3dhaXQuaD4gCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19QUk9DRVNTT1JfSAotI2luY2x1ZGUgPHN5cy9wcm9jZXNzb3IuaD4gLyogZm9yIGJpbmRwcm9jZXNzb3IoKSAqLwotI2VuZGlmCi0KLSNpZiAhQVBSX0hBU19USFJFQURTCi0jZXJyb3IgVGhlIFdvcmtlciBNUE0gcmVxdWlyZXMgQVBSIHRocmVhZHMsIGJ1dCB0aGV5IGFyZSB1bmF2YWlsYWJsZS4KLSNlbmRpZgotCi0jZGVmaW5lIENPUkVfUFJJVkFURSAKLSAKLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwZC5oIiAKLSNpbmNsdWRlICJodHRwX21haW4uaCIgCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIgCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIJLyogZm9yIHJlYWRfY29uZmlnICovIAotI2luY2x1ZGUgImh0dHBfY29yZS5oIgkJLyogZm9yIGdldF9yZW1vdGVfaG9zdCAqLyAKLSNpbmNsdWRlICJodHRwX2Nvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJhcF9tcG0uaCIKLSNpbmNsdWRlICJ1bml4ZC5oIgotI2luY2x1ZGUgIm1wbV9jb21tb24uaCIKLSNpbmNsdWRlICJhcF9saXN0ZW4uaCIKLSNpbmNsdWRlICJzY29yZWJvYXJkLmgiIAotI2luY2x1ZGUgImZkcXVldWUuaCIKLQotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPiAgICAgICAgICAgICAvKiBmb3IgSU5UX01BWCAqLwotCi0vKgotICogQWN0dWFsIGRlZmluaXRpb25zIG9mIGNvbmZpZyBnbG9iYWxzCi0gKi8KLQotaW50IGFwX3RocmVhZHNfcGVyX2NoaWxkPTA7ICAgICAgICAgLyogV29ya2VyIHRocmVhZHMgcGVyIGNoaWxkICovCi1zdGF0aWMgaW50IGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQ9MDsKLXN0YXRpYyBjb25zdCBjaGFyICphcF9waWRfZm5hbWU9TlVMTDsKLXN0YXRpYyBpbnQgYXBfZGFlbW9uc190b19zdGFydD0wOwotc3RhdGljIGludCBtaW5fc3BhcmVfdGhyZWFkcz0wOwotc3RhdGljIGludCBtYXhfc3BhcmVfdGhyZWFkcz0wOwotc3RhdGljIGludCBhcF9kYWVtb25zX2xpbWl0PTA7Ci1zdGF0aWMgaW50IGR5aW5nID0gMDsKLXN0YXRpYyBpbnQgd29ya2Vyc19tYXlfZXhpdCA9IDA7Ci1zdGF0aWMgaW50IHJlcXVlc3RzX3RoaXNfY2hpbGQ7Ci1zdGF0aWMgaW50IG51bV9saXN0ZW5zb2NrcyA9IDA7Ci1zdGF0aWMgYXByX3NvY2tldF90ICoqbGlzdGVuc29ja3M7Ci1zdGF0aWMgRkRRdWV1ZSAqd29ya2VyX3F1ZXVlOwotCi0vKiBUaGUgc3RydWN0dXJlIHVzZWQgdG8gcGFzcyB1bmlxdWUgaW5pdGlhbGl6YXRpb24gaW5mbyB0byBlYWNoIHRocmVhZCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCBwaWQ7Ci0gICAgaW50IHRpZDsKLSAgICBpbnQgc2Q7Ci0gICAgYXByX3Bvb2xfdCAqdHBvb2w7IC8qICJwdGhyZWFkIiB3b3VsZCBiZSBjb25mdXNpbmcgKi8KLX0gcHJvY19pbmZvOwotCi0vKiBTdHJ1Y3R1cmUgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvIHRoZSB0aHJlYWQgcmVzcG9uc2libGUgZm9yIAotICogY3JlYXRpbmcgdGhlIHJlc3Qgb2YgdGhlIHRocmVhZHMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBhcHJfdGhyZWFkX3QgKip0aHJlYWRzOwotICAgIGludCBjaGlsZF9udW1fYXJnOwotICAgIGFwcl90aHJlYWRhdHRyX3QgKnRocmVhZGF0dHI7Ci19IHRocmVhZF9zdGFydGVyOwotCi0vKgotICogVGhlIG1heCBjaGlsZCBzbG90IGV2ZXIgYXNzaWduZWQsIHByZXNlcnZlZCBhY3Jvc3MgcmVzdGFydHMuICBOZWNlc3NhcnkKLSAqIHRvIGRlYWwgd2l0aCBNYXhDbGllbnRzIGNoYW5nZXMgYWNyb3NzIFNJR1dJTkNIIHJlc3RhcnRzLiAgV2UgdXNlIHRoaXMKLSAqIHZhbHVlIHRvIG9wdGltaXplIHJvdXRpbmVzIHRoYXQgaGF2ZSB0byBzY2FuIHRoZSBlbnRpcmUgc2NvcmVib2FyZC4KLSAqLwotaW50IGFwX21heF9kYWVtb25zX2xpbWl0ID0gLTE7Ci0KLWNoYXIgYXBfY29yZWR1bXBfZGlyW01BWF9TVFJJTkdfTEVOXTsKLQotc3RhdGljIGFwcl9maWxlX3QgKnBpcGVfb2ZfZGVhdGhfaW4gPSBOVUxMOwotc3RhdGljIGFwcl9maWxlX3QgKnBpcGVfb2ZfZGVhdGhfb3V0ID0gTlVMTDsKLXN0YXRpYyBhcHJfbG9ja190ICpwaXBlX29mX2RlYXRoX211dGV4OyAgIC8qIGluc3VyZXMgdGhhdCBhIGNoaWxkIHByb2Nlc3Mgb25seQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXMgb25lIGNoYXJhY3RlciAqLwotCi0vKiAqTm9uKi1zaGFyZWQgaHR0cF9tYWluIGdsb2JhbHMuLi4gKi8KLQotc2VydmVyX3JlYyAqYXBfc2VydmVyX2NvbmY7Ci0KLS8qIG9uZV9wcm9jZXNzIC0tLSBkZWJ1Z2dpbmcgbW9kZSB2YXJpYWJsZTsgY2FuIGJlIHNldCBmcm9tIHRoZSBjb21tYW5kIGxpbmUKLSAqIHdpdGggdGhlIC1YIGZsYWcuICBJZiBzZXQsIHRoaXMgZ2V0cyB5b3UgdGhlIGNoaWxkX21haW4gbG9vcCBydW5uaW5nCi0gKiBpbiB0aGUgcHJvY2VzcyB3aGljaCBvcmlnaW5hbGx5IHN0YXJ0ZWQgdXAgKG5vIGRldGFjaCwgbm8gbWFrZV9jaGlsZCksCi0gKiB3aGljaCBpcyBhIHByZXR0eSBuaWNlIGRlYnVnZ2luZyBlbnZpcm9ubWVudC4gIChZb3UnbGwgZ2V0IGEgU0lHSFVQCi0gKiBlYXJseSBpbiBzdGFuZGFsb25lX21haW47IGp1c3QgY29udGludWUgdGhyb3VnaC4gIFRoaXMgaXMgdGhlIHNlcnZlcgotICogdHJ5aW5nIHRvIGtpbGwgb2ZmIGFueSBjaGlsZCBwcm9jZXNzZXMgd2hpY2ggaXQgbWlnaHQgaGF2ZSBseWluZwotICogYXJvdW5kIC0tLSBBcGFjaGUgZG9lc24ndCBrZWVwIHRyYWNrIG9mIHRoZWlyIHBpZHMsIGl0IGp1c3Qgc2VuZHMKLSAqIFNJR0hVUCB0byB0aGUgcHJvY2VzcyBncm91cCwgaWdub3JpbmcgaXQgaW4gdGhlIHJvb3QgcHJvY2Vzcy4KLSAqIENvbnRpbnVlIHRocm91Z2ggYW5kIHlvdSdsbCBiZSBmaW5lLikuCi0gKi8KLQotc3RhdGljIGludCBvbmVfcHJvY2VzcyA9IDA7Ci0KLSNpZmRlZiBERUJVR19TSUdTVE9QCi1pbnQgcmFpc2Vfc2lnc3RvcF9mbGFnczsKLSNlbmRpZgotCi1zdGF0aWMgYXByX3Bvb2xfdCAqcGNvbmY7CQkvKiBQb29sIGZvciBjb25maWcgc3R1ZmYgKi8KLXN0YXRpYyBhcHJfcG9vbF90ICpwY2hpbGQ7CQkvKiBQb29sIGZvciBodHRwZCBjaGlsZCBzdHVmZiAqLwotCi1zdGF0aWMgcGlkX3QgYXBfbXlfcGlkOyAvKiBMaW51eCBnZXRwaWQoKSBkb2Vzbid0IHdvcmsgZXhjZXB0IGluIG1haW4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQuIFVzZSB0aGlzIGluc3RlYWQgKi8KLS8qIEtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyBjdXJyZW50bHkgYWN0aXZlICovCi1zdGF0aWMgaW50IHdvcmtlcl90aHJlYWRfY291bnQ7Ci1zdGF0aWMgYXByX2xvY2tfdCAqd29ya2VyX3RocmVhZF9jb3VudF9tdXRleDsKLQotLyogTG9ja3MgZm9yIGFjY2VwdCBzZXJpYWxpemF0aW9uICovCi1zdGF0aWMgYXByX2xvY2tfdCAqYWNjZXB0X211dGV4Owotc3RhdGljIGFwcl9sb2NrbWVjaF9lX25wIGFjY2VwdF9sb2NrX21lY2ggPSBBUFJfTE9DS19ERUZBVUxUOwotc3RhdGljIGNvbnN0IGNoYXIgKmxvY2tfZm5hbWU7Ci0KLSNpZmRlZiBOT19TRVJJQUxJWkVEX0FDQ0VQVAotI2RlZmluZSBTQUZFX0FDQ0VQVChzdG10KSBBUFJfU1VDQ0VTUwotI2Vsc2UKLSNkZWZpbmUgU0FGRV9BQ0NFUFQoc3RtdCkgKHN0bXQpCi0jZW5kaWYKLQotQVBfREVDTEFSRShhcHJfc3RhdHVzX3QpIGFwX21wbV9xdWVyeShpbnQgcXVlcnlfY29kZSwgaW50ICpyZXN1bHQpCi17Ci0gICAgc3dpdGNoKHF1ZXJ5X2NvZGUpewotICAgICAgICBjYXNlIEFQX01QTVFfTUFYX0RBRU1PTl9VU0VEOgotICAgICAgICAgICAgKnJlc3VsdCA9IGFwX21heF9kYWVtb25zX2xpbWl0OwotICAgICAgICAgICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotICAgICAgICBjYXNlIEFQX01QTVFfSVNfVEhSRUFERUQ6Ci0gICAgICAgICAgICAqcmVzdWx0ID0gQVBfTVBNUV9TVEFUSUM7Ci0gICAgICAgICAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci0gICAgICAgIGNhc2UgQVBfTVBNUV9JU19GT1JLRUQ6Ci0gICAgICAgICAgICAqcmVzdWx0ID0gQVBfTVBNUV9EWU5BTUlDOwotICAgICAgICAgICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotICAgICAgICBjYXNlIEFQX01QTVFfSEFSRF9MSU1JVF9EQUVNT05TOgotICAgICAgICAgICAgKnJlc3VsdCA9IEhBUkRfU0VSVkVSX0xJTUlUOwotICAgICAgICAgICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotICAgICAgICBjYXNlIEFQX01QTVFfSEFSRF9MSU1JVF9USFJFQURTOgotICAgICAgICAgICAgKnJlc3VsdCA9IEhBUkRfVEhSRUFEX0xJTUlUOwotICAgICAgICAgICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotICAgICAgICBjYXNlIEFQX01QTVFfTUFYX1RIUkVBRFM6Ci0gICAgICAgICAgICAqcmVzdWx0ID0gYXBfdGhyZWFkc19wZXJfY2hpbGQ7Ci0gICAgICAgICAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci0gICAgICAgIGNhc2UgQVBfTVBNUV9NSU5fU1BBUkVfREVBTU9OUzoKLSAgICAgICAgICAgICpyZXN1bHQgPSAwOwotICAgICAgICAgICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotICAgICAgICBjYXNlIEFQX01QTVFfTUlOX1NQQVJFX1RIUkVBRFM6ICAgIAotICAgICAgICAgICAgKnJlc3VsdCA9IG1pbl9zcGFyZV90aHJlYWRzOwotICAgICAgICAgICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotICAgICAgICBjYXNlIEFQX01QTVFfTUFYX1NQQVJFX0RBRU1PTlM6Ci0gICAgICAgICAgICAqcmVzdWx0ID0gMDsKLSAgICAgICAgICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLSAgICAgICAgY2FzZSBBUF9NUE1RX01BWF9TUEFSRV9USFJFQURTOgotICAgICAgICAgICAgKnJlc3VsdCA9IG1heF9zcGFyZV90aHJlYWRzOwotICAgICAgICAgICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotICAgICAgICBjYXNlIEFQX01QTVFfTUFYX1JFUVVFU1RTX0RFQU1PTjoKLSAgICAgICAgICAgICpyZXN1bHQgPSBhcF9tYXhfcmVxdWVzdHNfcGVyX2NoaWxkOwotICAgICAgICAgICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotICAgICAgICBjYXNlIEFQX01QTVFfTUFYX0RBRU1PTlM6Ci0gICAgICAgICAgICAqcmVzdWx0ID0gYXBfZGFlbW9uc19saW1pdDsKLSAgICAgICAgICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLSAgICB9Ci0gICAgcmV0dXJuIEFQUl9FTk9USU1QTDsKLX0KLQotLyogYSBjbGVhbiBleGl0IGZyb20gYSBjaGlsZCB3aXRoIHByb3BlciBjbGVhbnVwICovIAotc3RhdGljIHZvaWQgY2xlYW5fY2hpbGRfZXhpdChpbnQgY29kZSkgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSk7Ci1zdGF0aWMgdm9pZCBjbGVhbl9jaGlsZF9leGl0KGludCBjb2RlKQotewotICAgIGlmIChwY2hpbGQpIHsKLQlhcHJfcG9vbF9kZXN0cm95KHBjaGlsZCk7Ci0gICAgfQotICAgIGV4aXQoY29kZSk7Ci19Ci0KLS8qIGhhbmRsZSBhbGwgdmFyaWV0aWVzIG9mIGNvcmUgZHVtcGluZyBzaWduYWxzICovCi1zdGF0aWMgdm9pZCBzaWdfY29yZWR1bXAoaW50IHNpZykKLXsKLSAgICBjaGRpcihhcF9jb3JlZHVtcF9kaXIpOwotICAgIGFwcl9zaWduYWwoc2lnLCBTSUdfREZMKTsKLSAgICBraWxsKGFwX215X3BpZCwgc2lnKTsKLSAgICAvKiBBdCB0aGlzIHBvaW50IHdlJ3ZlIGdvdCBzaWcgYmxvY2tlZCwgYmVjYXVzZSB3ZSdyZSBzdGlsbCBpbnNpZGUKLSAgICAgKiB0aGUgc2lnbmFsIGhhbmRsZXIuICBXaGVuIHdlIGxlYXZlIHRoZSBzaWduYWwgaGFuZGxlciBpdCB3aWxsCi0gICAgICogYmUgdW5ibG9ja2VkLCBhbmQgd2UnbGwgdGFrZSB0aGUgc2lnbmFsLi4uIGFuZCBjb3JlZHVtcCBvciB3aGF0ZXZlcgotICAgICAqIGlzIGFwcHJvcHJpYXRlIGZvciB0aGlzIHBhcnRpY3VsYXIgVW5peC4gIEluIGFkZGl0aW9uIHRoZSBwYXJlbnQKLSAgICAgKiB3aWxsIHNlZSB0aGUgcmVhbCBzaWduYWwgd2UgcmVjZWl2ZWQgLS0gd2hlcmVhcyBpZiB3ZSBjYWxsZWQKLSAgICAgKiBhYm9ydCgpIGhlcmUsIHRoZSBwYXJlbnQgd291bGQgb25seSBzZWUgU0lHQUJSVC4KLSAgICAgKi8KLX0KLQotc3RhdGljIHZvaWQganVzdF9kaWUoaW50IHNpZykKLXsKLSAgICBjbGVhbl9jaGlsZF9leGl0KDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbm5lY3Rpb24gc3RydWN0dXJlcyBhbmQgYWNjb3VudGluZy4uLgotICovCi0KLS8qIHZvbGF0aWxlIGp1c3QgaW4gY2FzZSAqLwotc3RhdGljIGludCB2b2xhdGlsZSBzaHV0ZG93bl9wZW5kaW5nOwotc3RhdGljIGludCB2b2xhdGlsZSByZXN0YXJ0X3BlbmRpbmc7Ci1zdGF0aWMgaW50IHZvbGF0aWxlIGlzX2dyYWNlZnVsOwotYXBfZ2VuZXJhdGlvbl90IHZvbGF0aWxlIGFwX215X2dlbmVyYXRpb247Ci0KLS8qCi0gKiBhcF9zdGFydF9zaHV0ZG93bigpIGFuZCBhcF9zdGFydF9yZXN0YXJ0KCksIGJlbG93LCBhcmUgYSBmaXJzdCBzdGFiIGF0Ci0gKiBmdW5jdGlvbnMgdG8gaW5pdGlhdGUgc2h1dGRvd24gb3IgcmVzdGFydCB3aXRob3V0IHJlbHlpbmcgb24gc2lnbmFscy4gCi0gKiBQcmV2aW91c2x5IHRoaXMgd2FzIGluaXRpYXRlZCBpbiBzaWdfdGVybSgpIGFuZCByZXN0YXJ0KCkgc2lnbmFsIGhhbmRsZXJzLCAKLSAqIGJ1dCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gc3RhcnQgYSBzaHV0ZG93bi9yZXN0YXJ0IGZyb20gb3RoZXIgc291cmNlcyAtLQotICogZS5nLiBvbiBXaW4zMiwgZnJvbSB0aGUgc2VydmljZSBtYW5hZ2VyLiBOb3cgdGhlIHNlcnZpY2UgbWFuYWdlciBjYW4KLSAqIGNhbGwgYXBfc3RhcnRfc2h1dGRvd24oKSBvciBhcF9zdGFydF9yZXN0YXJ0KCkgYXMgYXBwcm9waWF0ZS4gIE5vdGUgdGhhdAotICogdGhlc2UgZnVuY3Rpb25zIGNhbiBhbHNvIGJlIGNhbGxlZCBieSB0aGUgY2hpbGQgcHJvY2Vzc2VzLCBzaW5jZSBnbG9iYWwKLSAqIHZhcmlhYmxlcyBhcmUgbm8gbG9uZ2VyIHVzZWQgdG8gcGFzcyBvbiB0aGUgcmVxdWlyZWQgYWN0aW9uIHRvIHRoZSBwYXJlbnQuCi0gKgotICogVGhlc2Ugc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIHBhcmVudCBwcm9jZXNzIGl0c2VsZiwgc2luY2UgdGhlCi0gKiBwYXJlbnQgcHJvY2VzcyB3aWxsIHVzZSB0aGUgc2h1dGRvd25fcGVuZGluZyBhbmQgcmVzdGFydF9wZW5kaW5nIHZhcmlhYmxlcwotICogdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gc2h1dGRvd24gb3IgcmVzdGFydC4gVGhlIGNoaWxkIHByb2Nlc3Mgc2hvdWxkCi0gKiBjYWxsIHNpZ25hbF9wYXJlbnQoKSBkaXJlY3RseSB0byB0ZWxsIHRoZSBwYXJlbnQgdG8gZGllIC0tIHRoaXMgd2lsbAotICogY2F1c2UgbmVpdGhlciBvZiB0aG9zZSB2YXJpYWJsZSB0byBiZSBzZXQsIHdoaWNoIHRoZSBwYXJlbnQgd2lsbAotICogYXNzdW1lIG1lYW5zIHNvbWV0aGluZyBzZXJpb3VzIGlzIHdyb25nICh3aGljaCBpdCB3aWxsIGJlLCBmb3IgdGhlCi0gKiBjaGlsZCB0byBmb3JjZSBhbiBleGl0KSBhbmQgc28gZG8gYW4gZXhpdCBhbnl3YXkuCi0gKi8KLQotc3RhdGljIHZvaWQgYXBfc3RhcnRfc2h1dGRvd24odm9pZCkKLXsKLSAgICBpZiAoc2h1dGRvd25fcGVuZGluZyA9PSAxKSB7Ci0JLyogVW0sIGlzIHRoaXMgX3Byb2JhYmx5XyBub3QgYW4gZXJyb3IsIGlmIHRoZSB1c2VyIGhhcwotCSAqIHRyaWVkIHRvIGRvIGEgc2h1dGRvd24gdHdpY2UgcXVpY2tseSwgc28gd2Ugd29uJ3QKLQkgKiB3b3JyeSBhYm91dCByZXBvcnRpbmcgaXQuCi0JICovCi0JcmV0dXJuOwotICAgIH0KLSAgICBzaHV0ZG93bl9wZW5kaW5nID0gMTsKLX0KLQotLyogZG8gYSBncmFjZWZ1bCByZXN0YXJ0IGlmIGdyYWNlZnVsID09IDEgKi8KLXN0YXRpYyB2b2lkIGFwX3N0YXJ0X3Jlc3RhcnQoaW50IGdyYWNlZnVsKQotewotCi0gICAgaWYgKHJlc3RhcnRfcGVuZGluZyA9PSAxKSB7Ci0JLyogUHJvYmFibHkgbm90IGFuIGVycm9yIC0gZG9uJ3QgYm90aGVyIHJlcG9ydGluZyBpdCAqLwotCXJldHVybjsKLSAgICB9Ci0gICAgcmVzdGFydF9wZW5kaW5nID0gMTsKLSAgICBpc19ncmFjZWZ1bCA9IGdyYWNlZnVsOwotICAgIGlmIChpc19ncmFjZWZ1bCkgewotICAgICAgICBhcHJfcG9vbF9jbGVhbnVwX2tpbGwocGNvbmYsIE5VTEwsIGFwX2NsZWFudXBfc2NvcmVib2FyZCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBzaWdfdGVybShpbnQgc2lnKQotewotICAgIGFwX3N0YXJ0X3NodXRkb3duKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlc3RhcnQoaW50IHNpZykKLXsKLSAgICBhcF9zdGFydF9yZXN0YXJ0KHNpZyA9PSBTSUdXSU5DSCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF9zaWduYWxzKHZvaWQpCi17Ci0jaWZuZGVmIE5PX1VTRV9TSUdBQ1RJT04KLSAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhOwotCi0gICAgc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOwotICAgIHNhLnNhX2ZsYWdzID0gMDsKLQotICAgIGlmICghb25lX3Byb2Nlc3MpIHsKLQlzYS5zYV9oYW5kbGVyID0gc2lnX2NvcmVkdW1wOwotI2lmIGRlZmluZWQoU0FfT05FU0hPVCkKLQlzYS5zYV9mbGFncyA9IFNBX09ORVNIT1Q7Ci0jZWxpZiBkZWZpbmVkKFNBX1JFU0VUSEFORCkKLQlzYS5zYV9mbGFncyA9IFNBX1JFU0VUSEFORDsKLSNlbmRpZgotCWlmIChzaWdhY3Rpb24oU0lHU0VHViwgJnNhLCBOVUxMKSA8IDApCi0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgYXBfc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHU0VHVikiKTsKLSNpZmRlZiBTSUdCVVMKLQlpZiAoc2lnYWN0aW9uKFNJR0JVUywgJnNhLCBOVUxMKSA8IDApCi0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgYXBfc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHQlVTKSIpOwotI2VuZGlmCi0jaWZkZWYgU0lHQUJPUlQKLQlpZiAoc2lnYWN0aW9uKFNJR0FCT1JULCAmc2EsIE5VTEwpIDwgMCkKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBhcF9zZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdBQk9SVCkiKTsKLSNlbmRpZgotI2lmZGVmIFNJR0FCUlQKLQlpZiAoc2lnYWN0aW9uKFNJR0FCUlQsICZzYSwgTlVMTCkgPCAwKQotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIGFwX3NlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR0FCUlQpIik7Ci0jZW5kaWYKLSNpZmRlZiBTSUdJTEwKLQlpZiAoc2lnYWN0aW9uKFNJR0lMTCwgJnNhLCBOVUxMKSA8IDApCi0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgYXBfc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHSUxMKSIpOwotI2VuZGlmCi0Jc2Euc2FfZmxhZ3MgPSAwOwotICAgIH0KLSAgICBzYS5zYV9oYW5kbGVyID0gc2lnX3Rlcm07Ci0gICAgaWYgKHNpZ2FjdGlvbihTSUdURVJNLCAmc2EsIE5VTEwpIDwgMCkKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIGFwX3NlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR1RFUk0pIik7Ci0jaWZkZWYgU0lHSU5UCi0gICAgaWYgKHNpZ2FjdGlvbihTSUdJTlQsICZzYSwgTlVMTCkgPCAwKQotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIGFwX3NlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR0lOVCkiKTsKLSNlbmRpZgotI2lmZGVmIFNJR1hDUFUKLSAgICBzYS5zYV9oYW5kbGVyID0gU0lHX0RGTDsKLSAgICBpZiAoc2lnYWN0aW9uKFNJR1hDUFUsICZzYSwgTlVMTCkgPCAwKQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgYXBfc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHWENQVSkiKTsKLSNlbmRpZgotI2lmZGVmIFNJR1hGU1oKLSAgICBzYS5zYV9oYW5kbGVyID0gU0lHX0RGTDsKLSAgICBpZiAoc2lnYWN0aW9uKFNJR1hGU1osICZzYSwgTlVMTCkgPCAwKQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgYXBfc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHWEZTWikiKTsKLSNlbmRpZgotI2lmZGVmIFNJR1BJUEUKLSAgICBzYS5zYV9oYW5kbGVyID0gU0lHX0lHTjsKLSAgICBpZiAoc2lnYWN0aW9uKFNJR1BJUEUsICZzYSwgTlVMTCkgPCAwKQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgYXBfc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHUElQRSkiKTsKLSNlbmRpZgotCi0gICAgLyogd2Ugd2FudCB0byBpZ25vcmUgSFVQcyBhbmQgV0lOQ0ggd2hpbGUgd2UncmUgYnVzeSBwcm9jZXNzaW5nIG9uZSAqLwotICAgIHNpZ2FkZHNldCgmc2Euc2FfbWFzaywgU0lHSFVQKTsKLSAgICBzaWdhZGRzZXQoJnNhLnNhX21hc2ssIFNJR1dJTkNIKTsKLSAgICBzYS5zYV9oYW5kbGVyID0gcmVzdGFydDsKLSAgICBpZiAoc2lnYWN0aW9uKFNJR0hVUCwgJnNhLCBOVUxMKSA8IDApCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBhcF9zZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdIVVApIik7Ci0gICAgaWYgKHNpZ2FjdGlvbihTSUdXSU5DSCwgJnNhLCBOVUxMKSA8IDApCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBhcF9zZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdXSU5DSCkiKTsKLSNlbHNlCi0gICAgaWYgKCFvbmVfcHJvY2VzcykgewotCWFwcl9zaWduYWwoU0lHU0VHViwgc2lnX2NvcmVkdW1wKTsKLSNpZmRlZiBTSUdCVVMKLQlhcHJfc2lnbmFsKFNJR0JVUywgc2lnX2NvcmVkdW1wKTsKLSNlbmRpZiAvKiBTSUdCVVMgKi8KLSNpZmRlZiBTSUdBQk9SVAotCWFwcl9zaWduYWwoU0lHQUJPUlQsIHNpZ19jb3JlZHVtcCk7Ci0jZW5kaWYgLyogU0lHQUJPUlQgKi8KLSNpZmRlZiBTSUdBQlJUCi0JYXByX3NpZ25hbChTSUdBQlJULCBzaWdfY29yZWR1bXApOwotI2VuZGlmIC8qIFNJR0FCUlQgKi8KLSNpZmRlZiBTSUdJTEwKLQlhcHJfc2lnbmFsKFNJR0lMTCwgc2lnX2NvcmVkdW1wKTsKLSNlbmRpZiAvKiBTSUdJTEwgKi8KLSNpZmRlZiBTSUdYQ1BVCi0JYXByX3NpZ25hbChTSUdYQ1BVLCBTSUdfREZMKTsKLSNlbmRpZiAvKiBTSUdYQ1BVICovCi0jaWZkZWYgU0lHWEZTWgotCWFwcl9zaWduYWwoU0lHWEZTWiwgU0lHX0RGTCk7Ci0jZW5kaWYgLyogU0lHWEZTWiAqLwotICAgIH0KLQotICAgIGFwcl9zaWduYWwoU0lHVEVSTSwgc2lnX3Rlcm0pOwotI2lmZGVmIFNJR0hVUAotICAgIGFwcl9zaWduYWwoU0lHSFVQLCByZXN0YXJ0KTsKLSNlbmRpZiAvKiBTSUdIVVAgKi8KLSNpZmRlZiBTSUdXSU5DSAotICAgIGFwcl9zaWduYWwoU0lHV0lOQ0gsIHJlc3RhcnQpOwotI2VuZGlmIC8qIFNJR1dJTkNIICovCi0jaWZkZWYgU0lHUElQRQotICAgIGFwcl9zaWduYWwoU0lHUElQRSwgU0lHX0lHTik7Ci0jZW5kaWYgLyogU0lHUElQRSAqLwotCi0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBIZXJlIGZvbGxvd3MgYSBsb25nIGJ1bmNoIG9mIGdlbmVyaWMgc2VydmVyIGJvb2trZWVwaW5nIHN0dWZmLi4uCi0gKi8KLQotaW50IGFwX2dyYWNlZnVsX3N0b3Bfc2lnbmFsbGVkKHZvaWQpCi17Ci0gICAgLyogWFhYIC0gRG9lcyB0aGlzIHJlYWxseSB3b3JrPyAtIE1hbm9qICovCi0gICAgcmV0dXJuIGlzX2dyYWNlZnVsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENoaWxkIHByb2Nlc3MgbWFpbiBsb29wLgotICovCi0KLXN0YXRpYyB2b2lkIHByb2Nlc3Nfc29ja2V0KGFwcl9wb29sX3QgKnAsIGFwcl9zb2NrZXRfdCAqc29jaywgaW50IG15X2NoaWxkX251bSwgaW50IG15X3RocmVhZF9udW0pCi17Ci0gICAgY29ubl9yZWMgKmN1cnJlbnRfY29ubjsKLSAgICBsb25nIGNvbm5faWQgPSBBUF9JRF9GUk9NX0NISUxEX1RIUkVBRChteV9jaGlsZF9udW0sIG15X3RocmVhZF9udW0pOwotICAgIGludCBjc2Q7Ci0KLSAgICAodm9pZCkgYXByX29zX3NvY2tfZ2V0KCZjc2QsIHNvY2spOwotCi0gICAgaWYgKGNzZCA+PSBGRF9TRVRTSVpFKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX1dBUk5JTkcsIDAsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAibmV3IGZpbGUgZGVzY3JpcHRvciAlZCBpcyB0b28gbGFyZ2U7IHlvdSBwcm9iYWJseSBuZWVkICIKLSAgICAgICAgICAgICAgICAgICAgICJ0byByZWJ1aWxkIEFwYWNoZSB3aXRoIGEgbGFyZ2VyIEZEX1NFVFNJWkUgIgotICAgICAgICAgICAgICAgICAgICAgIihjdXJyZW50bHkgJWQpIiwgCi0gICAgICAgICAgICAgICAgICAgICBjc2QsIEZEX1NFVFNJWkUpOwotICAgICAgICBhcHJfc29ja2V0X2Nsb3NlKHNvY2spOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYXBfc29ja19kaXNhYmxlX25hZ2xlKHNvY2spOwotCi0gICAgY3VycmVudF9jb25uID0gYXBfbmV3X2Nvbm5lY3Rpb24ocCwgYXBfc2VydmVyX2NvbmYsIHNvY2ssIGNvbm5faWQpOwotICAgIGlmIChjdXJyZW50X2Nvbm4pIHsKLSAgICAgICAgYXBfcHJvY2Vzc19jb25uZWN0aW9uKGN1cnJlbnRfY29ubik7Ci0gICAgICAgIGFwX2xpbmdlcmluZ19jbG9zZShjdXJyZW50X2Nvbm4pOwotICAgIH0KLX0KLQotLyogcmVxdWVzdHNfdGhpc19jaGlsZCBoYXMgZ29uZSB0byB6ZXJvIG9yIGJlbG93LiAgU2VlIGlmIHRoZSBhZG1pbiBjb2RlZAotICAgIk1heFJlcXVlc3RzUGVyQ2hpbGQgMCIsIGFuZCBrZWVwIGdvaW5nIGluIHRoYXQgY2FzZS4gIERvaW5nIGl0IHRoaXMgd2F5Ci0gICBzaW1wbGlmaWVzIHRoZSBob3QgcGF0aCBpbiB3b3JrZXJfdGhyZWFkICovCi0KLXN0YXRpYyB2b2lkIGNoZWNrX2luZmluaXRlX3JlcXVlc3RzKHZvaWQpCi17Ci0gICAgaWYgKGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQpIHsKLSAgICAgICAgd29ya2Vyc19tYXlfZXhpdCA9IDE7ICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIHdvdyEgaWYgeW91J3JlIGV4ZWN1dGluZyB0aGlzIGNvZGUsIHlvdSBtYXkgaGF2ZSBzZXQgYSByZWNvcmQuCi0gICAgICAgICAqIGVpdGhlciB0aGlzIGNoaWxkIHByb2Nlc3MgaGFzIHNlcnZlZCBvdmVyIDIgYmlsbGlvbiByZXF1ZXN0cywgb3IKLSAgICAgICAgICogeW91J3JlIHJ1bm5pbmcgYSB0aHJlYWRlZCAyLjAgb24gYSAxNiBiaXQgbWFjaGluZS4gIAotICAgICAgICAgKgotICAgICAgICAgKiBJJ2xsIGJ1eSBwaXp6YSBhbmQgYmVlcnMgYXQgQXBhY2hlY29uIGZvciB0aGUgZmlyc3QgcGVyc29uIHRvIGRvCi0gICAgICAgICAqIHRoZSBmb3JtZXIgd2l0aG91dCBjaGVhdGluZyAoZG9ya2luZyB3aXRoIElOVF9NQVgsIG9yIHJ1bm5pbmcgd2l0aAotICAgICAgICAgKiB1bmNvbW1pdHRlZCBwZXJmb3JtYW5jZSBwYXRjaGVzLCBmb3IgZXhhbXBsZSkuICAgIAotICAgICAgICAgKgotICAgICAgICAgKiBmb3IgdGhlIGxhdHRlciBjYXNlLCB5b3UgcHJvYmFibHkgZGVzZXJ2ZSBhIGJlZXIgdG9vLiAgIEdyZWcgQW1lcwotICAgICAgICAgKi8KLSAgICAgICAgICAgIAotICAgICAgICByZXF1ZXN0c190aGlzX2NoaWxkID0gSU5UX01BWDsgICAgICAvKiBrZWVwIGdvaW5nICovIAotICAgIH0KLX0KLQotLyogU2V0cyB3b3JrZXJzX21heV9leGl0IGlmIHdlIHJlY2VpdmVkIGEgY2hhcmFjdGVyIG9uIHRoZSBwaXBlX29mX2RlYXRoICovCi1zdGF0aWMgdm9pZCBjaGVja19waXBlX29mX2RlYXRoKHZvaWQpCi17Ci0gICAgYXByX2xvY2tfYWNxdWlyZShwaXBlX29mX2RlYXRoX211dGV4KTsKLSAgICBpZiAoIXdvcmtlcnNfbWF5X2V4aXQpIHsKLSAgICAgICAgYXByX3N0YXR1c190IHJldDsKLSAgICAgICAgY2hhciBwaXBlX3JlYWRfY2hhcjsKLQlhcHJfc2l6ZV90IG4gPSAxOwotCi0gICAgICAgIHJldCA9IGFwcl9yZWN2KGxpc3RlbnNvY2tzWzBdLCAmcGlwZV9yZWFkX2NoYXIsICZuKTsKLSAgICAgICAgaWYgKEFQUl9TVEFUVVNfSVNfRUFHQUlOKHJldCkpIHsKLSAgICAgICAgICAgIC8qIEl0IGxvc3QgdGhlIGxvdHRlcnkuIEl0IG11c3QgY29udGludWUgdG8gc3VmZmVyCi0gICAgICAgICAgICAgKiB0aHJvdWdoIGEgbGlmZSBvZiBzZXJ2aXR1ZGUuICovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKiBJdCB3b24gdGhlIGxvdHRlcnkgKG9yIHNvbWV0aGluZyBlbHNlIGlzIHZlcnkKLSAgICAgICAgICAgICAqIHdyb25nKS4gRW1icmFjZSBkZWF0aCB3aXRoIG9wZW4gYXJtcy4gKi8KLSAgICAgICAgICAgIHdvcmtlcnNfbWF5X2V4aXQgPSAxOwotICAgICAgICB9Ci0gICAgfQotICAgIGFwcl9sb2NrX3JlbGVhc2UocGlwZV9vZl9kZWF0aF9tdXRleCk7Ci19Ci0KLXN0YXRpYyB2b2lkICpsaXN0ZW5lcl90aHJlYWQoYXByX3RocmVhZF90ICp0aGQsIHZvaWQgKiBkdW1teSkKLXsKLSAgICBwcm9jX2luZm8gKiB0aSA9IGR1bW15OwotICAgIGludCBwcm9jZXNzX3Nsb3QgPSB0aS0+cGlkOwotICAgIGludCB0aHJlYWRfc2xvdCA9IHRpLT50aWQ7Ci0gICAgYXByX3Bvb2xfdCAqdHBvb2wgPSB0aS0+dHBvb2w7Ci0gICAgYXByX3NvY2tldF90ICpjc2QgPSBOVUxMOwotICAgIGFwcl9wb29sX3QgKnB0cmFuczsJCS8qIFBvb2wgZm9yIHBlci10cmFuc2FjdGlvbiBzdHVmZiAqLwotICAgIGFwcl9zb2NrZXRfdCAqc2QgPSBOVUxMOwotICAgIGludCBuOwotICAgIGludCBjdXJyX3BvbGxmZCwgbGFzdF9wb2xsZmQgPSAwOwotICAgIGFwcl9wb2xsZmRfdCAqcG9sbHNldDsKLSAgICBhcHJfc3RhdHVzX3QgcnY7Ci0KLSAgICBmcmVlKHRpKTsKLQotICAgIGFwcl9wb29sX2NyZWF0ZSgmcHRyYW5zLCB0cG9vbCk7Ci0KLSAgICBhcHJfbG9ja19hY3F1aXJlKHdvcmtlcl90aHJlYWRfY291bnRfbXV0ZXgpOwotICAgIHdvcmtlcl90aHJlYWRfY291bnQrKzsKLSAgICBhcHJfbG9ja19yZWxlYXNlKHdvcmtlcl90aHJlYWRfY291bnRfbXV0ZXgpOwotCi0gICAgYXByX3BvbGxfc2V0dXAoJnBvbGxzZXQsIG51bV9saXN0ZW5zb2NrcysxLCB0cG9vbCk7Ci0gICAgZm9yKG49MCA7IG4gPD0gbnVtX2xpc3RlbnNvY2tzIDsgKytuKQotCWFwcl9wb2xsX3NvY2tldF9hZGQocG9sbHNldCwgbGlzdGVuc29ja3Nbbl0sIEFQUl9QT0xMSU4pOwotCi0gICAgd29ya2VyX3F1ZXVlID0gYXByX3BjYWxsb2MocGNoaWxkLCBzaXplb2YoKndvcmtlcl9xdWV1ZSkpOwotICAgIGFwX3F1ZXVlX2luaXQod29ya2VyX3F1ZXVlLCBhcF90aHJlYWRzX3Blcl9jaGlsZCwgcGNoaWxkKTsKLQotICAgIC8qIFRPRE86IFN3aXRjaCB0byBhIHN5c3RlbSB3aGVyZSB0aHJlYWRzIHJldXNlIHRoZSByZXN1bHRzIGZyb20gZWFybGllcgotICAgICAgIHBvbGwgY2FsbHMgLSBtYW5vaiAqLwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmIChyZXF1ZXN0c190aGlzX2NoaWxkIDw9IDApIHsKLSAgICAgICAgICAgIGNoZWNrX2luZmluaXRlX3JlcXVlc3RzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdvcmtlcnNfbWF5X2V4aXQpIGJyZWFrOwotCi0gICAgICAgIGlmICgocnYgPSBTQUZFX0FDQ0VQVChhcHJfbG9ja19hY3F1aXJlKGFjY2VwdF9tdXRleCkpKQotICAgICAgICAgICAgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FTUVSRywgcnYsIGFwX3NlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICJhcHJfbG9ja19hY3F1aXJlIGZhaWxlZC4gQXR0ZW1wdGluZyB0byBzaHV0ZG93biAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3MgZ3JhY2VmdWxseS4iKTsKLSAgICAgICAgICAgIHdvcmtlcnNfbWF5X2V4aXQgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKCF3b3JrZXJzX21heV9leGl0KSB7Ci0JICAgIGFwcl9zdGF0dXNfdCByZXQ7Ci0JICAgIGFwcl9pbnQxNl90IGV2ZW50OwotCi0gICAgICAgICAgICByZXQgPSBhcHJfcG9sbChwb2xsc2V0LCAmbiwgLTEpOwotICAgICAgICAgICAgaWYgKHJldCAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgIGlmIChBUFJfU1RBVFVTX0lTX0VJTlRSKHJldCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogYXByX3BvbGwoKSB3aWxsIG9ubHkgcmV0dXJuIGVycm9ycyBpbiBjYXRhc3Ryb3BoaWMKLSAgICAgICAgICAgICAgICAgKiBjaXJjdW1zdGFuY2VzLiBMZXQncyB0cnkgZXhpdGluZyBncmFjZWZ1bGx5LCBmb3Igbm93LiAqLwotICAgICAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHJldCwgKGNvbnN0IHNlcnZlcl9yZWMgKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfc2VydmVyX2NvbmYsICJhcHJfcG9sbDogKGxpc3RlbikiKTsKLSAgICAgICAgICAgICAgICB3b3JrZXJzX21heV9leGl0ID0gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHdvcmtlcnNfbWF5X2V4aXQpIGJyZWFrOwotCi0JICAgIGFwcl9wb2xsX3JldmVudHNfZ2V0KCZldmVudCwgbGlzdGVuc29ja3NbMF0sIHBvbGxzZXQpOwotICAgICAgICAgICAgaWYgKGV2ZW50ICYgQVBSX1BPTExJTikgewotICAgICAgICAgICAgICAgIC8qIEEgcHJvY2VzcyBnb3QgYSBzaWduYWwgb24gdGhlIHNodXRkb3duIHBpcGUuIENoZWNrIGlmIHdlJ3JlCi0gICAgICAgICAgICAgICAgICogdGhlIGx1Y2t5IHByb2Nlc3MgdG8gZGllLiAqLwotICAgICAgICAgICAgICAgIGNoZWNrX3BpcGVfb2ZfZGVhdGgoKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG51bV9saXN0ZW5zb2NrcyA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgc2QgPSBhcF9saXN0ZW5lcnMtPnNkOwotICAgICAgICAgICAgICAgIGdvdG8gZ290X2ZkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogZmluZCBhIGxpc3RlbmVyICovCi0gICAgICAgICAgICAgICAgY3Vycl9wb2xsZmQgPSBsYXN0X3BvbGxmZDsKLSAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJfcG9sbGZkKys7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyX3BvbGxmZCA+IG51bV9saXN0ZW5zb2NrcykgewotICAgICAgICAgICAgICAgICAgICAgICAgY3Vycl9wb2xsZmQgPSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIFhYWDogU2hvdWxkIHdlIGNoZWNrIGZvciBQT0xMRVJSPyAqLwotCQkgICAgYXByX3BvbGxfcmV2ZW50c19nZXQoJmV2ZW50LCBsaXN0ZW5zb2Nrc1tjdXJyX3BvbGxmZF0sIHBvbGxzZXQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgJiBBUFJfUE9MTElOKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0X3BvbGxmZCA9IGN1cnJfcG9sbGZkOwotCQkJc2Q9bGlzdGVuc29ja3NbY3Vycl9wb2xsZmRdOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBnb3RfZmQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IHdoaWxlIChjdXJyX3BvbGxmZCAhPSBsYXN0X3BvbGxmZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICBnb3RfZmQ6Ci0gICAgICAgIGlmICghd29ya2Vyc19tYXlfZXhpdCkgewotICAgICAgICAgICAgaWYgKChydiA9IGFwcl9hY2NlcHQoJmNzZCwgc2QsIHB0cmFucykpICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgY3NkID0gTlVMTDsKLSAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBydiwgYXBfc2VydmVyX2NvbmYsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXByX2FjY2VwdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChydiA9IFNBRkVfQUNDRVBUKGFwcl9sb2NrX3JlbGVhc2UoYWNjZXB0X211dGV4KSkpCi0gICAgICAgICAgICAgICAgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkcsIHJ2LCBhcF9zZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcl9sb2NrX3JlbGVhc2UgZmFpbGVkLiBBdHRlbXB0aW5nIHRvIHNodXRkb3duICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3MgZ3JhY2VmdWxseS4iKTsKLSAgICAgICAgICAgICAgICB3b3JrZXJzX21heV9leGl0ID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjc2QgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGFwX3F1ZXVlX3B1c2god29ya2VyX3F1ZXVlLCBjc2QsIHB0cmFucyk7Ci0gICAgICAgICAgICAgICAgYXBfYmxvY2tfb25fcXVldWUod29ya2VyX3F1ZXVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmICgocnYgPSBTQUZFX0FDQ0VQVChhcHJfbG9ja19yZWxlYXNlKGFjY2VwdF9tdXRleCkpKQotICAgICAgICAgICAgICAgICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLCBydiwgYXBfc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcHJfbG9ja19yZWxlYXNlIGZhaWxlZC4gQXR0ZW1wdGluZyB0byBzaHV0ZG93biAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzIGdyYWNlZnVsbHkuIik7Ci0gICAgICAgICAgICAgICAgd29ya2Vyc19tYXlfZXhpdCA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGFwcl9wb29sX2Rlc3Ryb3kodHBvb2wpOwotICAgIGFwX3VwZGF0ZV9jaGlsZF9zdGF0dXMocHJvY2Vzc19zbG90LCB0aHJlYWRfc2xvdCwgKGR5aW5nKSA/IFNFUlZFUl9ERUFEIDogU0VSVkVSX0dSQUNFRlVMLAotICAgICAgICAocmVxdWVzdF9yZWMgKikgTlVMTCk7Ci0gICAgZHlpbmcgPSAxOwotICAgIGFwcl9sb2NrX2FjcXVpcmUod29ya2VyX3RocmVhZF9jb3VudF9tdXRleCk7Ci0gICAgd29ya2VyX3RocmVhZF9jb3VudC0tOwotICAgIGlmICh3b3JrZXJfdGhyZWFkX2NvdW50ID09IDApIHsKLSAgICAgICAgLyogQWxsIHRoZSB0aHJlYWRzIGhhdmUgZXhpdGVkLCBub3cgZmluaXNoIHRoZSBzaHV0ZG93biBwcm9jZXNzCi0gICAgICAgICAqIGJ5IHNpZ25hbGxpbmcgdGhlIHNpZ3dhaXQgdGhyZWFkICovCi0gICAgICAgIGtpbGwoYXBfbXlfcGlkLCBTSUdURVJNKTsKLSAgICB9Ci0gICAgYXByX2xvY2tfcmVsZWFzZSh3b3JrZXJfdGhyZWFkX2NvdW50X211dGV4KTsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCAqd29ya2VyX3RocmVhZChhcHJfdGhyZWFkX3QgKnRoZCwgdm9pZCAqIGR1bW15KQotewotICAgIHByb2NfaW5mbyAqIHRpID0gZHVtbXk7Ci0gICAgaW50IHByb2Nlc3Nfc2xvdCA9IHRpLT5waWQ7Ci0gICAgaW50IHRocmVhZF9zbG90ID0gdGktPnRpZDsKLSAgICBhcHJfcG9vbF90ICp0cG9vbCA9IHRpLT50cG9vbDsKLSAgICBhcHJfc29ja2V0X3QgKmNzZCA9IE5VTEw7Ci0gICAgYXByX3Bvb2xfdCAqcHRyYW5zOwkJLyogUG9vbCBmb3IgcGVyLXRyYW5zYWN0aW9uIHN0dWZmICovCi0gICAgYXByX3NvY2tldF90ICpzZCA9IE5VTEw7Ci0gICAgaW50IG47Ci0gICAgaW50IGN1cnJfcG9sbGZkLCBsYXN0X3BvbGxmZCA9IDA7Ci0gICAgYXByX3BvbGxmZF90ICpwb2xsc2V0OwotICAgIGFwcl9zdGF0dXNfdCBydjsKLQotICAgIGZyZWUodGkpOwotCi0gICAgd2hpbGUgKCF3b3JrZXJzX21heV9leGl0KSB7Ci0gICAgICAgIGFwX3F1ZXVlX3BvcCh3b3JrZXJfcXVldWUsICZjc2QsICZwdHJhbnMsIDEpOwotICAgICAgICBwcm9jZXNzX3NvY2tldChwdHJhbnMsIGNzZCwgcHJvY2Vzc19zbG90LCB0aHJlYWRfc2xvdCk7Ci0gICAgICAgIHJlcXVlc3RzX3RoaXNfY2hpbGQtLTsKLSAgICAgICAgYXByX3Bvb2xfY2xlYXIocHRyYW5zKTsKLSAgICB9Ci0KLSAgICBhcHJfcG9vbF9kZXN0cm95KHRwb29sKTsKLSAgICBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKHByb2Nlc3Nfc2xvdCwgdGhyZWFkX3Nsb3QsIChkeWluZykgPyBTRVJWRVJfREVBRCA6IFNFUlZFUl9HUkFDRUZVTCwKLSAgICAgICAgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotICAgIGFwcl9sb2NrX2FjcXVpcmUod29ya2VyX3RocmVhZF9jb3VudF9tdXRleCk7Ci0gICAgaWYgKCFkeWluZykgewotICAgICAgICAvKiB0aGlzIGlzIHRoZSBmaXJzdCB0aHJlYWQgdG8gZXhpdCAqLwotICAgICAgICBpZiAoYXBfbXlfcGlkID09IGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtwcm9jZXNzX3Nsb3RdLnBpZCkgewotICAgICAgICAgICAgLyogdGVsbCB0aGUgcGFyZW50IHRoYXQgaXQgbWF5IHVzZSB0aGlzIHNjb3JlYm9hcmQgc2xvdCAqLwotICAgICAgICAgICAgYXBfc2NvcmVib2FyZF9pbWFnZS0+cGFyZW50W3Byb2Nlc3Nfc2xvdF0ucXVpZXNjaW5nID0gMTsKLSAgICAgICAgfSAgIAotICAgICAgICBkeWluZyA9IDE7Ci0gICAgfQotICAgIHdvcmtlcl90aHJlYWRfY291bnQtLTsKLSAgICBpZiAod29ya2VyX3RocmVhZF9jb3VudCA9PSAwKSB7Ci0gICAgICAgIC8qIEFsbCB0aGUgdGhyZWFkcyBoYXZlIGV4aXRlZCwgbm93IGZpbmlzaCB0aGUgc2h1dGRvd24gcHJvY2VzcwotICAgICAgICAgKiBieSBzaWduYWxsaW5nIHRoZSBzaWd3YWl0IHRocmVhZCAqLwotICAgICAgICBraWxsKGFwX215X3BpZCwgU0lHVEVSTSk7Ci0gICAgfQotICAgIGFwcl9sb2NrX3JlbGVhc2Uod29ya2VyX3RocmVhZF9jb3VudF9tdXRleCk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBjaGVja19zaWduYWwoaW50IHNpZ251bSkKLXsKLSAgICBzd2l0Y2ggKHNpZ251bSkgewotICAgICAgICBjYXNlIFNJR1RFUk06Ci0gICAgICAgIGNhc2UgU0lHSU5UOgotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCAqc3RhcnRfdGhyZWFkcyhhcHJfdGhyZWFkX3QgKnRoZCwgdm9pZCAqIGR1bW15KQotewotICAgIHRocmVhZF9zdGFydGVyICp0cyA9IGR1bW15OwotICAgIGFwcl90aHJlYWRfdCAqKnRocmVhZHMgPSB0cy0+dGhyZWFkczsKLSAgICBhcHJfdGhyZWFkYXR0cl90ICp0aHJlYWRfYXR0ciA9IHRzLT50aHJlYWRhdHRyOwotICAgIGludCBjaGlsZF9udW1fYXJnID0gdHMtPmNoaWxkX251bV9hcmc7Ci0gICAgaW50IGk7Ci0gICAgaW50IG15X2NoaWxkX251bSA9IGNoaWxkX251bV9hcmc7Ci0gICAgcHJvY19pbmZvICpteV9pbmZvID0gTlVMTDsKLSAgICBhcHJfc3RhdHVzX3QgcnY7Ci0gICAgaW50IHRocmVhZHNfY3JlYXRlZCA9IDA7Ci0gICAgYXByX3RocmVhZF90ICpsaXN0ZW5lcjsKLQotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIG15X2luZm8gPSAocHJvY19pbmZvICopbWFsbG9jKHNpemVvZihwcm9jX2luZm8pKTsKLSAgICAgICAgbXlfaW5mby0+cGlkID0gbXlfY2hpbGRfbnVtOwotICAgICAgICBteV9pbmZvLT50aWQgPSBpOwotICAgICAgICBteV9pbmZvLT5zZCA9IDA7Ci0gICAgICAgIGFwcl9wb29sX2NyZWF0ZSgmbXlfaW5mby0+dHBvb2wsIHBjaGlsZCk7Ci0JYXByX3RocmVhZF9jcmVhdGUoJmxpc3RlbmVyLCB0aHJlYWRfYXR0ciwgbGlzdGVuZXJfdGhyZWFkLCBteV9pbmZvLCBwY2hpbGQpOwotICAgICAgICBmb3IgKGk9MDsgaSA8IGFwX3RocmVhZHNfcGVyX2NoaWxkOyBpKyspIHsKLSAgICAgICAgICAgIGludCBzdGF0dXMgPSBhcF9zY29yZWJvYXJkX2ltYWdlLT5zZXJ2ZXJzW2NoaWxkX251bV9hcmddW2ldLnN0YXR1czsKLQotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBTRVJWRVJfR1JBQ0VGVUwgJiYgc3RhdHVzICE9IFNFUlZFUl9ERUFEKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgIAkgICAgbXlfaW5mbyA9IChwcm9jX2luZm8gKiltYWxsb2Moc2l6ZW9mKHByb2NfaW5mbykpOwotICAgICAgICAgICAgaWYgKG15X2luZm8gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgZXJybm8sIGFwX3NlcnZlcl9jb25mLAotCQkgICAgICAgICAgICAgIm1hbGxvYzogb3V0IG9mIG1lbW9yeSIpOwotICAgICAgICAgICAgICAgIGNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotICAgICAgICAgICAgfQotCSAgICBteV9pbmZvLT5waWQgPSBteV9jaGlsZF9udW07Ci0gICAgICAgICAgICBteV9pbmZvLT50aWQgPSBpOwotCSAgICBteV9pbmZvLT5zZCA9IDA7Ci0JICAgIGFwcl9wb29sX2NyZWF0ZSgmbXlfaW5mby0+dHBvb2wsIHBjaGlsZCk7Ci0JCi0gIAkgICAgLyogV2UgYXJlIGNyZWF0aW5nIHRocmVhZHMgcmlnaHQgbm93ICovCi0JICAgICh2b2lkKSBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKG15X2NoaWxkX251bSwgaSwgU0VSVkVSX1NUQVJUSU5HLCAKLQkgIAkJCSAgICAgICAgICAocmVxdWVzdF9yZWMgKikgTlVMTCk7Ci0gICAgICAgICAgICAvKiBXZSBsZXQgZWFjaCB0aHJlYWQgdXBkYXRlIGl0cyBvd24gc2NvcmVib2FyZCBlbnRyeS4gIFRoaXMgaXMKLSAgICAgICAgICAgICAqIGRvbmUgYmVjYXVzZSBpdCBsZXRzIHVzIGRlYWwgd2l0aCB0aWQgYmV0dGVyLgotCSAgICAgKi8KLQkgICAgaWYgKChydiA9IGFwcl90aHJlYWRfY3JlYXRlKCZ0aHJlYWRzW2ldLCB0aHJlYWRfYXR0ciwgd29ya2VyX3RocmVhZCwgbXlfaW5mbywgcGNoaWxkKSkpIHsKLQkgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgcnYsIGFwX3NlcnZlcl9jb25mLAotCQkJICAgICAiYXByX3RocmVhZF9jcmVhdGU6IHVuYWJsZSB0byBjcmVhdGUgd29ya2VyIHRocmVhZCIpOwotICAgICAgICAgICAgICAgIC8qIEluIGNhc2Ugc3lzdGVtIHJlc291cmNlcyBhcmUgbWF4eGVkIG91dCwgd2UgZG9uJ3Qgd2FudAotICAgICAgICAgICAgICAgICAgIEFwYWNoZSBydW5uaW5nIGF3YXkgd2l0aCB0aGUgQ1BVIHRyeWluZyB0byBmb3JrIG92ZXIgYW5kCi0gICAgICAgICAgICAgICAgICAgb3ZlciBhbmQgb3ZlciBhZ2FpbiBpZiB3ZSBleGl0LiAqLwotICAgICAgICAgICAgICAgIHNsZWVwKDEwKTsKLQkgICAgICAgIGNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotCSAgICB9Ci0gICAgICAgICAgICB0aHJlYWRzX2NyZWF0ZWQrKzsKLSAgICAgICAgfQotICAgICAgICBpZiAod29ya2Vyc19tYXlfZXhpdCB8fCB0aHJlYWRzX2NyZWF0ZWQgPT0gYXBfdGhyZWFkc19wZXJfY2hpbGQpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHNsZWVwKDEpOyAvKiB3YWl0IGZvciBwcmV2aW91cyBnZW5lcmF0aW9uIHRvIGNsZWFuIHVwIGFuIGVudHJ5ICovCi0gICAgfQotICAgIAotICAgIC8qIFdoYXQgc3RhdGUgc2hvdWxkIHRoaXMgY2hpbGRfbWFpbiBwcm9jZXNzIGJlIGxpc3RlZCBhcyBpbiB0aGUgc2NvcmVib2FyZC4uLj8KLSAgICAgKiAgYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhteV9jaGlsZF9udW0sIGksIFNFUlZFUl9TVEFSVElORywgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotICAgICAqIAotICAgICAqICBUaGlzIHN0YXRlIHNob3VsZCBiZSBsaXN0ZWQgc2VwYXJhdGVseSBpbiB0aGUgc2NvcmVib2FyZCwgaW4gc29tZSBraW5kCi0gICAgICogIG9mIHByb2Nlc3Nfc3RhdHVzLCBub3QgbWl4ZWQgaW4gd2l0aCB0aGUgd29ya2VyIHRocmVhZHMnIHN0YXR1cy4gICAKLSAgICAgKiAgImxpZmVfc3RhdHVzIiBpcyBhbG1vc3QgcmlnaHQsIGJ1dCBpdCdzIGluIHRoZSB3b3JrZXIncyBzdHJ1Y3R1cmUsIGFuZCAKLSAgICAgKiAgdGhlIG5hbWUgY291bGQgYmUgY2xlYXJlci4gICBnbGEKLSAgICAgKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgY2hpbGRfbWFpbihpbnQgY2hpbGRfbnVtX2FyZykKLXsKLSAgICBhcHJfdGhyZWFkX3QgKip0aHJlYWRzOwotICAgIGludCBpOwotICAgIGFwX2xpc3Rlbl9yZWMgKmxyOwotICAgIGFwcl9zdGF0dXNfdCBydjsKLSAgICB0aHJlYWRfc3RhcnRlciAqdHM7Ci0gICAgYXByX3RocmVhZGF0dHJfdCAqdGhyZWFkX2F0dHI7Ci0gICAgYXByX3RocmVhZF90ICpzdGFydF90aHJlYWRfaWQ7Ci0KLSAgICBhcF9teV9waWQgPSBnZXRwaWQoKTsKLSAgICBhcHJfcG9vbF9jcmVhdGUoJnBjaGlsZCwgcGNvbmYpOwotCi0gICAgLypzdHVmZiB0byBkbyBiZWZvcmUgd2Ugc3dpdGNoIGlkJ3MsIHNvIHdlIGhhdmUgcGVybWlzc2lvbnMuKi8KLSAgICByZW9wZW5fc2NvcmVib2FyZChwY2hpbGQpOwotCi0gICAgcnYgPSBTQUZFX0FDQ0VQVChhcHJfbG9ja19jaGlsZF9pbml0KCZhY2NlcHRfbXV0ZXgsIGxvY2tfZm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBwY2hpbGQpKTsKLSAgICBpZiAocnYgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLCBydiwgYXBfc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgaW5pdGlhbGl6ZSBjcm9zcy1wcm9jZXNzIGxvY2sgaW4gY2hpbGQiKTsKLSAgICAgICAgY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotCi0gICAgaWYgKHVuaXhkX3NldHVwX2NoaWxkKCkpIHsKLQljbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci0KLSAgICBhcF9ydW5fY2hpbGRfaW5pdChwY2hpbGQsIGFwX3NlcnZlcl9jb25mKTsKLQotICAgIC8qZG9uZSB3aXRoIGluaXQgY3JpdGljYWwgc2VjdGlvbiAqLwotCi0gICAgcnYgPSBhcHJfc2V0dXBfc2lnbmFsX3RocmVhZCgpOwotICAgIGlmIChydiAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkcsIHJ2LCBhcF9zZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBpbml0aWFsaXplIHNpZ25hbCB0aHJlYWQiKTsKLSAgICAgICAgY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotCi0gICAgaWYgKGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQpIHsKLSAgICAgICAgcmVxdWVzdHNfdGhpc19jaGlsZCA9IGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQ7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAvKiBjb2RpbmcgYSB2YWx1ZSBvZiB6ZXJvIG1lYW5zIGluZmluaXR5ICovCi0gICAgICAgIHJlcXVlc3RzX3RoaXNfY2hpbGQgPSBJTlRfTUFYOwotICAgIH0KLSAgICAKLSAgICAvKiBTZXQgdXAgdGhlIHBvbGxmZCBhcnJheSAqLwotICAgIGxpc3RlbnNvY2tzID0gYXByX3BjYWxsb2MocGNoaWxkLAotCQkJICAgIHNpemVvZigqbGlzdGVuc29ja3MpICogKG51bV9saXN0ZW5zb2NrcyArIDEpKTsKLSNpZiBBUFJfRklMRVNfQVNfU09DS0VUUwotICAgIGFwcl9zb2NrZXRfZnJvbV9maWxlKCZsaXN0ZW5zb2Nrc1swXSwgcGlwZV9vZl9kZWF0aF9pbik7Ci0jZW5kaWYKLSAgICBmb3IgKGxyID0gYXBfbGlzdGVuZXJzLCBpID0gMTsgaSA8PSBudW1fbGlzdGVuc29ja3M7IGxyID0gbHItPm5leHQsICsraSkKLQlsaXN0ZW5zb2Nrc1tpXT1sci0+c2Q7Ci0KLSAgICAvKiBTZXR1cCB3b3JrZXIgdGhyZWFkcyAqLwotCi0gICAgLyogY2xlYXIgdGhlIHN0b3JhZ2U7IHdlIG1heSBub3QgY3JlYXRlIGFsbCBvdXIgdGhyZWFkcyBpbW1lZGlhdGVseSwgYW5kIHdlIHdhbnQKLSAgICAgKiBhIDAgZW50cnkgdG8gaW5kaWNhdGUgYSB0aHJlYWQgd2hpY2ggd2FzIG5vdCBjcmVhdGVkCi0gICAgICovCi0gICAgdGhyZWFkcyA9IChhcHJfdGhyZWFkX3QgKiopY2FsbG9jKDEsIHNpemVvZihhcHJfdGhyZWFkX3QgKikgKiBhcF90aHJlYWRzX3Blcl9jaGlsZCk7Ci0gICAgaWYgKHRocmVhZHMgPT0gTlVMTCkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlQsIGVycm5vLCBhcF9zZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJtYWxsb2M6IG91dCBvZiBtZW1vcnkiKTsKLSAgICAgICAgY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotICAgIHdvcmtlcl90aHJlYWRfY291bnQgPSAwOwotICAgIGFwcl9sb2NrX2NyZWF0ZSgmd29ya2VyX3RocmVhZF9jb3VudF9tdXRleCwgQVBSX01VVEVYLCBBUFJfSU5UUkFQUk9DRVNTLAotICAgICAgICAgICAgICAgICAgICBOVUxMLCBwY2hpbGQpOwotICAgIGFwcl9sb2NrX2NyZWF0ZSgmcGlwZV9vZl9kZWF0aF9tdXRleCwgQVBSX01VVEVYLCBBUFJfSU5UUkFQUk9DRVNTLCAKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwgcGNoaWxkKTsKLQotICAgIHRzID0gYXByX3BhbGxvYyhwY2hpbGQsIHNpemVvZigqdHMpKTsKLQotICAgIGFwcl90aHJlYWRhdHRyX2NyZWF0ZSgmdGhyZWFkX2F0dHIsIHBjaGlsZCk7Ci0gICAgYXByX3RocmVhZGF0dHJfZGV0YWNoX3NldCh0aHJlYWRfYXR0ciwgMCk7ICAgIC8qIDAgbWVhbnMgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUgKi8KLQotICAgIHRzLT50aHJlYWRzID0gdGhyZWFkczsKLSAgICB0cy0+Y2hpbGRfbnVtX2FyZyA9IGNoaWxkX251bV9hcmc7Ci0gICAgdHMtPnRocmVhZGF0dHIgPSB0aHJlYWRfYXR0cjsKLQotICAgIGlmICgocnYgPSBhcHJfdGhyZWFkX2NyZWF0ZSgmc3RhcnRfdGhyZWFkX2lkLCB0aHJlYWRfYXR0ciwgc3RhcnRfdGhyZWFkcywgdHMsIHBjaGlsZCkpKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgcnYsIGFwX3NlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgImFwcl90aHJlYWRfY3JlYXRlOiB1bmFibGUgdG8gY3JlYXRlIHdvcmtlciB0aHJlYWQiKTsKLSAgICAgICAgLyogSW4gY2FzZSBzeXN0ZW0gcmVzb3VyY2VzIGFyZSBtYXh4ZWQgb3V0LCB3ZSBkb24ndCB3YW50Ci0gICAgICAgICAgIEFwYWNoZSBydW5uaW5nIGF3YXkgd2l0aCB0aGUgQ1BVIHRyeWluZyB0byBmb3JrIG92ZXIgYW5kCi0gICAgICAgICAgIG92ZXIgYW5kIG92ZXIgYWdhaW4gaWYgd2UgZXhpdC4gKi8KLSAgICAgICAgc2xlZXAoMTApOwotICAgICAgICBjbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci0KLSAgICBhcHJfc2lnbmFsX3RocmVhZChjaGVja19zaWduYWwpOwotCi0gICAgd29ya2Vyc19tYXlfZXhpdCA9IDE7ICAgLyogaGVscHMgdXMgdGVybWluYXRlIGEgbGl0dGxlIG1vcmUgcXVpY2tseSB3aGVuIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBkaXNwYXRjaCBvZiB0aGUgc2lnbmFsIHRocmVhZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJlYXRzIHRoZSBQaXBlIG9mIERlYXRoIGFuZCB0aGUgYnJvd3NlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAKLSAgICAvKiBBIHRlcm1pbmF0aW5nIHNpZ25hbCB3YXMgcmVjZWl2ZWQuIE5vdyBqb2luIGVhY2ggb2YgdGhlIHdvcmtlcnMgdG8gY2xlYW4gdGhlbSB1cC4KLSAgICAgKiAgIElmIHRoZSB3b3JrZXIgYWxyZWFkeSBleGl0ZWQsIHRoZW4gdGhlIGpvaW4gZnJlZXMgdGhlaXIgcmVzb3VyY2VzIGFuZCByZXR1cm5zLgotICAgICAqICAgSWYgdGhlIHdvcmtlciBoYXNuJ3QgZXhpdGVkLCB0aGVuIHRoaXMgYmxvY2tzIHVudGlsIHRoZXkgaGF2ZSAodGhlbiBjbGVhbnMgdXApLgotICAgICAqLwotICAgIGFwcl90aHJlYWRfam9pbigmcnYsIHN0YXJ0X3RocmVhZF9pZCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGFwX3RocmVhZHNfcGVyX2NoaWxkOyBpKyspIHsKLSAgICAgICAgaWYgKHRocmVhZHNbaV0pIHsgLyogaWYgd2UgZXZlciBjcmVhdGVkIHRoaXMgdGhyZWFkICovCi0gICAgICAgICAgICBhcHJfdGhyZWFkX2pvaW4oJnJ2LCB0aHJlYWRzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZyZWUodGhyZWFkcyk7Ci0KLSAgICBjbGVhbl9jaGlsZF9leGl0KDApOwotfQotCi1zdGF0aWMgaW50IG1ha2VfY2hpbGQoc2VydmVyX3JlYyAqcywgaW50IHNsb3QpIAotewotICAgIGludCBwaWQ7Ci0KLSAgICBpZiAoc2xvdCArIDEgPiBhcF9tYXhfZGFlbW9uc19saW1pdCkgewotCWFwX21heF9kYWVtb25zX2xpbWl0ID0gc2xvdCArIDE7Ci0gICAgfQotCi0gICAgaWYgKG9uZV9wcm9jZXNzKSB7Ci0Jc2V0X3NpZ25hbHMoKTsKLSAgICAgICAgYXBfc2NvcmVib2FyZF9pbWFnZS0+cGFyZW50W3Nsb3RdLnBpZCA9IGdldHBpZCgpOwotCWNoaWxkX21haW4oc2xvdCk7Ci0gICAgfQotCi0gICAgaWYgKChwaWQgPSBmb3JrKCkpID09IC0xKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGVycm5vLCBzLCAiZm9yazogVW5hYmxlIHRvIGZvcmsgbmV3IHByb2Nlc3MiKTsKLQotICAgICAgICAvKiBmb3JrIGRpZG4ndCBzdWNjZWVkLiBGaXggdGhlIHNjb3JlYm9hcmQgb3IgZWxzZQotICAgICAgICAgKiBpdCB3aWxsIHNheSBTRVJWRVJfU1RBUlRJTkcgZm9yZXZlciBhbmQgZXZlcgotICAgICAgICAgKi8KLSAgICAgICAgKHZvaWQpIGFwX3VwZGF0ZV9jaGlsZF9zdGF0dXMoc2xvdCwgMCwgU0VSVkVSX0RFQUQsIChyZXF1ZXN0X3JlYyAqKSBOVUxMKTsKLQotCS8qIEluIGNhc2Ugc3lzdGVtIHJlc291cmNlcyBhcmUgbWF4eGVkIG91dCwgd2UgZG9uJ3Qgd2FudAotCSAgIEFwYWNoZSBydW5uaW5nIGF3YXkgd2l0aCB0aGUgQ1BVIHRyeWluZyB0byBmb3JrIG92ZXIgYW5kCi0JICAgb3ZlciBhbmQgb3ZlciBhZ2Fpbi4gKi8KLQlzbGVlcCgxMCk7Ci0KLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaWYgKCFwaWQpIHsKLSNpZmRlZiBIQVZFX0JJTkRQUk9DRVNTT1IKLSAgICAgICAgLyogQnkgZGVmYXVsdCwgQUlYIGJpbmRzIHRvIGEgc2luZ2xlIHByb2Nlc3Nvci4gIFRoaXMgYml0IHVuYmluZHMKLQkgKiBjaGlsZHJlbiB3aGljaCB3aWxsIHRoZW4gYmluZCB0byBhbm90aGVyIENQVS4KLSAgICAgICAgICovCi0gICAgICAgIGludCBzdGF0dXMgPSBiaW5kcHJvY2Vzc29yKEJJTkRQUk9DRVNTLCAoaW50KWdldHBpZCgpLAotCQkJICAgICAgIFBST0NFU1NPUl9DTEFTU19BTlkpOwotCWlmIChzdGF0dXMgIT0gT0spCi0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX1dBUk5JTkcsIGVycm5vLCBhcF9zZXJ2ZXJfY29uZiwKLQkJCSAicHJvY2Vzc29yIHVuYmluZCBmYWlsZWQgJWQiLCBzdGF0dXMpOwotI2VuZGlmCi0gICAgICAgIFJBSVNFX1NJR1NUT1AoTUFLRV9DSElMRCk7Ci0KLSAgICAgICAgYXByX3NpZ25hbChTSUdURVJNLCBqdXN0X2RpZSk7Ci0gICAgICAgIGNoaWxkX21haW4oc2xvdCk7Ci0KLSAgICAgICAgY2xlYW5fY2hpbGRfZXhpdCgwKTsKLSAgICB9Ci0gICAgLyogZWxzZSAqLwotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtzbG90XS5xdWllc2NpbmcgPSAwOwotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtzbG90XS5waWQgPSBwaWQ7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIElmIHRoZXJlIGFyZW4ndCBtYW55IGNvbm5lY3Rpb25zIGNvbWluZyBpbiBmcm9tIHRoZSBuZXR3b3JrLCB0aGUgY2hpbGQgCi0gKiBwcm9jZXNzZXMgbWF5IG5lZWQgdG8gYmUgYXdha2VuZWQgZnJvbSB0aGVpciBuZXR3b3JrIGkvbyB3YWl0cy4KLSAqIFRoZSBwaXBlIG9mIGRlYXRoIGlzIGFuIGVmZmVjdGl2ZSBwcm9kLgotICovCi0gICAKLXN0YXRpYyB2b2lkIHdha2VfdXBfYW5kX2RpZSh2b2lkKSAKLXsKLSAgICBpbnQgaTsKLSAgICBjaGFyIGNoYXJfb2ZfZGVhdGggPSAnISc7Ci0gICAgYXByX3NpemVfdCBvbmUgPSAxOwotICAgIGFwcl9zdGF0dXNfdCBydjsKLSAgICAKLSAgICBmb3IgKGkgPSAwOyBpIDwgYXBfZGFlbW9uc19saW1pdDspIHsKLSAgICAgICAgaWYgKChydiA9IGFwcl9maWxlX3dyaXRlKHBpcGVfb2ZfZGVhdGhfb3V0LCAmY2hhcl9vZl9kZWF0aCwgJm9uZSkpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIGlmIChBUFJfU1RBVFVTX0lTX0VJTlRSKHJ2KSkgY29udGludWU7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgcnYsIGFwX3NlcnZlcl9jb25mLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGUgcGlwZV9vZl9kZWF0aCIpOwotICAgICAgICB9Ci0gICAgICAgIGkrKzsKLSAgICB9Ci19Ci0KLS8qIHN0YXJ0IHVwIGEgYnVuY2ggb2YgY2hpbGRyZW4gKi8KLXN0YXRpYyB2b2lkIHN0YXJ0dXBfY2hpbGRyZW4oaW50IG51bWJlcl90b19zdGFydCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IG51bWJlcl90b19zdGFydCAmJiBpIDwgYXBfZGFlbW9uc19saW1pdDsgKytpKSB7Ci0JaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtpXS5waWQgIT0gMCkgewotCSAgICBjb250aW51ZTsKLQl9Ci0JaWYgKG1ha2VfY2hpbGQoYXBfc2VydmVyX2NvbmYsIGkpIDwgMCkgewotCSAgICBicmVhazsKLQl9Ci0JLS1udW1iZXJfdG9fc3RhcnQ7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBpZGxlX3NwYXduX3JhdGUgaXMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IHdpbGwgYmUgc3Bhd25lZCBvbiB0aGUKLSAqIG5leHQgbWFpbnRlbmFuY2UgY3ljbGUgaWYgdGhlcmUgYXJlbid0IGVub3VnaCBpZGxlIHNlcnZlcnMuICBJdCBpcwotICogZG91YmxlZCB1cCB0byBNQVhfU1BBV05fUkFURSwgYW5kIHJlc2V0IG9ubHkgd2hlbiBhIGN5Y2xlIGdvZXMgYnkKLSAqIHdpdGhvdXQgdGhlIG5lZWQgdG8gc3Bhd24uCi0gKi8KLXN0YXRpYyBpbnQgaWRsZV9zcGF3bl9yYXRlID0gMTsKLSNpZm5kZWYgTUFYX1NQQVdOX1JBVEUKLSNkZWZpbmUgTUFYX1NQQVdOX1JBVEUJKDMyKQotI2VuZGlmCi1zdGF0aWMgaW50IGhvbGRfb2ZmX29uX2V4cG9uZW50aWFsX3NwYXduaW5nOwotCi1zdGF0aWMgdm9pZCBwZXJmb3JtX2lkbGVfc2VydmVyX21haW50ZW5hbmNlKHZvaWQpCi17Ci0gICAgaW50IGksIGo7Ci0gICAgaW50IGlkbGVfdGhyZWFkX2NvdW50OwotICAgIHdvcmtlcl9zY29yZSAqd3M7Ci0gICAgcHJvY2Vzc19zY29yZSAqcHM7Ci0gICAgaW50IGZyZWVfbGVuZ3RoOwotICAgIGludCBmcmVlX3Nsb3RzW01BWF9TUEFXTl9SQVRFXTsKLSAgICBpbnQgbGFzdF9ub25fZGVhZDsKLSAgICBpbnQgdG90YWxfbm9uX2RlYWQ7Ci0gICAgYXByX3NpemVfdCBvbmUgPSAxOwotICAgIGFwcl9zdGF0dXNfdCBydjsKLQotICAgIC8qIGluaXRpYWxpemUgdGhlIGZyZWVfbGlzdCAqLwotICAgIGZyZWVfbGVuZ3RoID0gMDsKLQotICAgIGlkbGVfdGhyZWFkX2NvdW50ID0gMDsKLSAgICBsYXN0X25vbl9kZWFkID0gLTE7Ci0gICAgdG90YWxfbm9uX2RlYWQgPSAwOwotCi0gICAgYXBfc3luY19zY29yZWJvYXJkX2ltYWdlKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGFwX2RhZW1vbnNfbGltaXQ7ICsraSkgewotCS8qIEluaXRpYWxpemF0aW9uIHRvIHNhdGlzZnkgdGhlIGNvbXBpbGVyLiBJdCBkb2Vzbid0IGtub3cKLQkgKiB0aGF0IGFwX3RocmVhZHNfcGVyX2NoaWxkIGlzIGFsd2F5cyA+IDAgKi8KLQlpbnQgc3RhdHVzID0gU0VSVkVSX0RFQUQ7Ci0JaW50IGFueV9keWluZ190aHJlYWRzID0gMDsKLQlpbnQgYW55X2RlYWRfdGhyZWFkcyA9IDA7Ci0KLQlpZiAoaSA+PSBhcF9tYXhfZGFlbW9uc19saW1pdCAmJiBmcmVlX2xlbmd0aCA9PSBpZGxlX3NwYXduX3JhdGUpCi0JICAgIGJyZWFrOwotICAgICAgICBwcyA9ICZhcF9zY29yZWJvYXJkX2ltYWdlLT5wYXJlbnRbaV07Ci0JZm9yIChqID0gMDsgaiA8IGFwX3RocmVhZHNfcGVyX2NoaWxkOyBqKyspIHsKLSAgICAgICAgICAgIHdzID0gJmFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbaV1bal07Ci0JICAgIHN0YXR1cyA9IHdzLT5zdGF0dXM7Ci0KLQkgICAgYW55X2R5aW5nX3RocmVhZHMgPSBhbnlfZHlpbmdfdGhyZWFkcyB8fCAoc3RhdHVzID09IFNFUlZFUl9HUkFDRUZVTCk7Ci0JICAgIGFueV9kZWFkX3RocmVhZHMgPSBhbnlfZGVhZF90aHJlYWRzIHx8IChzdGF0dXMgPT0gU0VSVkVSX0RFQUQpOwotCi0JICAgIC8qIFdlIGNvbnNpZGVyIGEgc3RhcnRpbmcgc2VydmVyIGFzIGlkbGUgYmVjYXVzZSB3ZSBzdGFydGVkIGl0Ci0JICAgICAqIGF0IGxlYXN0IGEgY3ljbGUgYWdvLCBhbmQgaWYgaXQgc3RpbGwgaGFzbid0IGZpbmlzaGVkIHN0YXJ0aW5nCi0JICAgICAqIHRoZW4gd2UncmUganVzdCBnb2luZyB0byBzd2FtcCB0aGluZ3Mgd29yc2UgYnkgZm9ya2luZyBtb3JlLgotCSAgICAgKiBTbyB3ZSBob3BlZnVsbHkgd29uJ3QgbmVlZCB0byBmb3JrIG1vcmUgaWYgd2UgY291bnQgaXQuCi0JICAgICAqIFRoaXMgZGVwZW5kcyBvbiB0aGUgb3JkZXJpbmcgb2YgU0VSVkVSX1JFQURZIGFuZCBTRVJWRVJfU1RBUlRJTkcuCi0JICAgICAqLwotCSAgICBpZiAoc3RhdHVzIDw9IFNFUlZFUl9SRUFEWSAmJiBzdGF0dXMgIT0gU0VSVkVSX0RFQUQgJiYKLSAgICAgICAgICAgICAgICAgICAgcHMtPmdlbmVyYXRpb24gPT0gYXBfbXlfZ2VuZXJhdGlvbiAmJiAKLSAgICAgICAgICAgICAgICAgLyogWFhYIHRoZSBmb2xsb3dpbmcgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSBpZiB3ZSBjbGVhbiB1cCAKLSAgICAgICAgICAgICAgICAgICogICAgIHByb3Blcmx5IGFmdGVyIHNlZyBmYXVsdHMsIGJ1dCB3ZSdyZSBub3QgeWV0ICAgIEdMQSAKLSAgICAgICAgICAgICAgICAgICovICAgICAKLSAgICAgICAgICAgICAgICAgICAgcHMtPnBpZCAhPSAwKSB7Ci0JICAgICAgICArK2lkbGVfdGhyZWFkX2NvdW50OwotCSAgICB9Ci0JfQotICAgICAgICAvKiBYWFggYW55X2RlYWRfdGhyZWFkcyBtYXkgbm90IGJlIG5lZWRlZCBhbnkgbW9yZSBHTEEgKi8KLSAgICAgICAgaWYgKGFueV9kZWFkX3RocmVhZHMgJiYgZnJlZV9sZW5ndGggPCBpZGxlX3NwYXduX3JhdGUgCi0gICAgICAgICAgICAgICAgJiYgKCFwcy0+cGlkICAgICAgICAgICAgICAgLyogbm8gcHJvY2VzcyBpbiB0aGUgc2xvdCAqLwotICAgICAgICAgICAgICAgICAgICB8fCBwcy0+cXVpZXNjaW5nKSkgeyAgIC8qIG9yIGF0IGxlYXN0IG9uZSBpcyBnb2luZyBhd2F5ICovCi0JICAgIGZyZWVfc2xvdHNbZnJlZV9sZW5ndGhdID0gaTsKLQkgICAgKytmcmVlX2xlbmd0aDsKLQl9Ci0JaWYgKCFhbnlfZHlpbmdfdGhyZWFkcykgewotICAgICAgICAgICAgbGFzdF9ub25fZGVhZCA9IGk7Ci0gICAgICAgICAgICArK3RvdGFsX25vbl9kZWFkOwotICAgICAgICB9Ci0gICAgfQotICAgIGFwX21heF9kYWVtb25zX2xpbWl0ID0gbGFzdF9ub25fZGVhZCArIDE7Ci0KLSAgICBpZiAoaWRsZV90aHJlYWRfY291bnQgPiBtYXhfc3BhcmVfdGhyZWFkcykgewotICAgICAgICBjaGFyIGNoYXJfb2ZfZGVhdGggPSAnISc7Ci0gICAgICAgIC8qIEtpbGwgb2ZmIG9uZSBjaGlsZCAqLwotICAgICAgICBpZiAoKHJ2ID0gYXByX2ZpbGVfd3JpdGUocGlwZV9vZl9kZWF0aF9vdXQsICZjaGFyX29mX2RlYXRoLCAmb25lKSkgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBydiwgYXBfc2VydmVyX2NvbmYsICJ3cml0ZSBwaXBlX29mX2RlYXRoIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWRsZV9zcGF3bl9yYXRlID0gMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaWRsZV90aHJlYWRfY291bnQgPCBtaW5fc3BhcmVfdGhyZWFkcykgewotICAgICAgICAvKiB0ZXJtaW5hdGUgdGhlIGZyZWUgbGlzdCAqLwotICAgICAgICBpZiAoZnJlZV9sZW5ndGggPT0gMCkgewotCSAgICAvKiBvbmx5IHJlcG9ydCB0aGlzIGNvbmRpdGlvbiBvbmNlICovCi0JICAgIHN0YXRpYyBpbnQgcmVwb3J0ZWQgPSAwOwotCSAgICAKLQkgICAgaWYgKCFyZXBvcnRlZCkgewotCSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCBhcF9zZXJ2ZXJfY29uZiwKLQkJCSAgICAgInNlcnZlciByZWFjaGVkIE1heENsaWVudHMgc2V0dGluZywgY29uc2lkZXIiCi0JCQkgICAgICIgcmFpc2luZyB0aGUgTWF4Q2xpZW50cyBzZXR0aW5nIik7Ci0JCXJlcG9ydGVkID0gMTsKLQkgICAgfQotCSAgICBpZGxlX3NwYXduX3JhdGUgPSAxOwotCX0KLQllbHNlIHsKLQkgICAgCi0JICAgIGlmIChpZGxlX3NwYXduX3JhdGUgPj0gOCkgewotCSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgMCwgYXBfc2VydmVyX2NvbmYsCi0JCQkgICAgICJzZXJ2ZXIgc2VlbXMgYnVzeSwgKHlvdSBtYXkgbmVlZCAiCi0JCQkgICAgICJ0byBpbmNyZWFzZSBTdGFydFNlcnZlcnMsIFRocmVhZHNQZXJDaGlsZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvciBNaW4vTWF4U3BhcmVUaHJlYWRzKSwgIgotCQkJICAgICAic3Bhd25pbmcgJWQgY2hpbGRyZW4sIHRoZXJlIGFyZSBhcm91bmQgJWQgaWRsZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRzLCBhbmQgJWQgdG90YWwgY2hpbGRyZW4iLCBmcmVlX2xlbmd0aCwKLQkJCSAgICAgaWRsZV90aHJlYWRfY291bnQsIHRvdGFsX25vbl9kZWFkKTsKLQkgICAgfQotCSAgICBmb3IgKGkgPSAwOyBpIDwgZnJlZV9sZW5ndGg7ICsraSkgewotCSAgICAgICAgbWFrZV9jaGlsZChhcF9zZXJ2ZXJfY29uZiwgZnJlZV9zbG90c1tpXSk7Ci0JICAgIH0KLQkgICAgLyogdGhlIG5leHQgdGltZSBhcm91bmQgd2Ugd2FudCB0byBzcGF3biB0d2ljZSBhcyBtYW55IGlmIHRoaXMKLQkgICAgICogd2Fzbid0IGdvb2QgZW5vdWdoLCBidXQgbm90IGlmIHdlJ3ZlIGp1c3QgZG9uZSBhIGdyYWNlZnVsCi0JICAgICAqLwotCSAgICBpZiAoaG9sZF9vZmZfb25fZXhwb25lbnRpYWxfc3Bhd25pbmcpIHsKLQkgICAgICAgIC0taG9sZF9vZmZfb25fZXhwb25lbnRpYWxfc3Bhd25pbmc7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoaWRsZV9zcGF3bl9yYXRlIDwgTUFYX1NQQVdOX1JBVEUpIHsKLQkgICAgICAgIGlkbGVfc3Bhd25fcmF0ZSAqPSAyOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGlkbGVfc3Bhd25fcmF0ZSA9IDE7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBzZXJ2ZXJfbWFpbl9sb29wKGludCByZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQpCi17Ci0gICAgaW50IGNoaWxkX3Nsb3Q7Ci0gICAgYXByX3dhaXRfdCBzdGF0dXM7Ci0gICAgYXByX3Byb2NfdCBwaWQ7Ci0gICAgaW50IGk7Ci0KLSAgICB3aGlsZSAoIXJlc3RhcnRfcGVuZGluZyAmJiAhc2h1dGRvd25fcGVuZGluZykgewotICAgICAgICBhcF93YWl0X29yX3RpbWVvdXQoJnN0YXR1cywgJnBpZCwgcGNvbmYpOwotICAgICAgICAKLSAgICAgICAgaWYgKHBpZC5waWQgIT0gLTEpIHsKLSAgICAgICAgICAgIGFwX3Byb2Nlc3NfY2hpbGRfc3RhdHVzKCZwaWQsIHN0YXR1cyk7Ci0gICAgICAgICAgICAvKiBub24tZmF0YWwgZGVhdGguLi4gbm90ZSB0aGF0IGl0J3MgZ29uZSBpbiB0aGUgc2NvcmVib2FyZC4gKi8KLSAgICAgICAgICAgIGNoaWxkX3Nsb3QgPSBmaW5kX2NoaWxkX2J5X3BpZCgmcGlkKTsKLSAgICAgICAgICAgIGlmIChjaGlsZF9zbG90ID49IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXBfdGhyZWFkc19wZXJfY2hpbGQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhjaGlsZF9zbG90LCBpLCBTRVJWRVJfREVBRCwgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtjaGlsZF9zbG90XS5waWQgPSAwOwotICAgICAgICAgICAgICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtjaGlsZF9zbG90XS5xdWllc2NpbmcgPSAwOwotCQlpZiAocmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0Ci0JCSAgICAmJiBjaGlsZF9zbG90IDwgYXBfZGFlbW9uc19saW1pdCkgewotCQkgICAgLyogd2UncmUgc3RpbGwgZG9pbmcgYSAxLWZvci0xIHJlcGxhY2VtZW50IG9mIGRlYWQKLSAgICAgICAgICAgICAgICAgICAgICogY2hpbGRyZW4gd2l0aCBuZXcgY2hpbGRyZW4KLSAgICAgICAgICAgICAgICAgICAgICovCi0JCSAgICBtYWtlX2NoaWxkKGFwX3NlcnZlcl9jb25mLCBjaGlsZF9zbG90KTsKLQkJICAgIC0tcmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0OwotCQl9Ci0jaWYgQVBSX0hBU19PVEhFUl9DSElMRAotCSAgICB9Ci0JICAgIGVsc2UgaWYgKGFwcl9wcm9jX290aGVyX2NoaWxkX3JlYWQoJnBpZCwgc3RhdHVzKSA9PSAwKSB7Ci0JCS8qIGhhbmRsZWQgKi8KLSNlbmRpZgotCSAgICB9Ci0JICAgIGVsc2UgaWYgKGlzX2dyYWNlZnVsKSB7Ci0JCS8qIEdyZWF0LCB3ZSd2ZSBwcm9iYWJseSBqdXN0IGxvc3QgYSBzbG90IGluIHRoZQotCQkgKiBzY29yZWJvYXJkLiAgU29tZWhvdyB3ZSBkb24ndCBrbm93IGFib3V0IHRoaXMgY2hpbGQuCi0JCSAqLwotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLCAwLAotCQkgICAgICAgICAgICAgYXBfc2VydmVyX2NvbmYsCi0JCSAgICAgICAgICAgICAibG9uZyBsb3N0IGNoaWxkIGNhbWUgaG9tZSEgKHBpZCAlbGQpIiwKLQkJICAgICAgICAgICAgIChsb25nKXBpZC5waWQpOwotCSAgICB9Ci0JICAgIC8qIERvbid0IHBlcmZvcm0gaWRsZSBtYWludGVuYW5jZSB3aGVuIGEgY2hpbGQgZGllcywKLSAgICAgICAgICAgICAqIG9ubHkgZG8gaXQgd2hlbiB0aGVyZSdzIGEgdGltZW91dC4gIFJlbWVtYmVyIG9ubHkgYQotICAgICAgICAgICAgICogZmluaXRlIG51bWJlciBvZiBjaGlsZHJlbiBjYW4gZGllLCBhbmQgaXQncyBwcmV0dHkKLSAgICAgICAgICAgICAqIHBhdGhvbG9naWNhbCBmb3IgYSBsb3QgdG8gZGllIHN1ZGRlbmx5LgotICAgICAgICAgICAgICovCi0JICAgIGNvbnRpbnVlOwotCX0KLQllbHNlIGlmIChyZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQpIHsKLQkgICAgLyogd2UgaGl0IGEgMSBzZWNvbmQgdGltZW91dCBpbiB3aGljaCBub25lIG9mIHRoZSBwcmV2aW91cwotCSAgICAgKiBnZW5lcmF0aW9uIG9mIGNoaWxkcmVuIG5lZWRlZCB0byBiZSByZWFwZWQuLi4gc28gYXNzdW1lCi0JICAgICAqIHRoZXkncmUgYWxsIGRvbmUsIGFuZCBwaWNrIHVwIHRoZSBzbGFjayBpZiBhbnkgaXMgbGVmdC4KLQkgICAgICovCi0JICAgIHN0YXJ0dXBfY2hpbGRyZW4ocmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0KTsKLQkgICAgcmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0ID0gMDsKLQkgICAgLyogSW4gYW55IGV2ZW50IHdlIHJlYWxseSBzaG91bGRuJ3QgZG8gdGhlIGNvZGUgYmVsb3cgYmVjYXVzZQotCSAgICAgKiBmZXcgb2YgdGhlIHNlcnZlcnMgd2UganVzdCBzdGFydGVkIGFyZSBpbiB0aGUgSURMRSBzdGF0ZQotCSAgICAgKiB5ZXQsIHNvIHdlJ2QgbWlzdGFrZW5seSBjcmVhdGUgYW4gZXh0cmEgc2VydmVyLgotCSAgICAgKi8KLQkgICAgY29udGludWU7Ci0JfQotCi0JcGVyZm9ybV9pZGxlX3NlcnZlcl9tYWludGVuYW5jZSgpOwotICAgIH0KLX0KLQotaW50IGFwX21wbV9ydW4oYXByX3Bvb2xfdCAqX3Bjb25mLCBhcHJfcG9vbF90ICpwbG9nLCBzZXJ2ZXJfcmVjICpzKQotewotICAgIGludCByZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQ7Ci0gICAgYXByX3N0YXR1c190IHJ2OwotCi0gICAgcGNvbmYgPSBfcGNvbmY7Ci0gICAgYXBfc2VydmVyX2NvbmYgPSBzOwotCi0gICAgcnYgPSBhcHJfZmlsZV9waXBlX2NyZWF0ZSgmcGlwZV9vZl9kZWF0aF9pbiwgJnBpcGVfb2ZfZGVhdGhfb3V0LCBwY29uZik7Ci0gICAgaWYgKHJ2ICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHJ2LAotICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHNlcnZlcl9yZWMqKSBhcF9zZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJhcHJfZmlsZV9waXBlX2NyZWF0ZSAocGlwZV9vZl9kZWF0aCkiKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBpZiAoKHJ2ID0gYXByX2ZpbGVfcGlwZV90aW1lb3V0X3NldChwaXBlX29mX2RlYXRoX2luLCAwKSkgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgcnYsCi0gICAgICAgICAgICAgICAgICAgICAoY29uc3Qgc2VydmVyX3JlYyopIGFwX3NlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgImFwcl9maWxlX3BpcGVfdGltZW91dF9zZXQgKHBpcGVfb2ZfZGVhdGgpIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgaWYgKChudW1fbGlzdGVuc29ja3MgPSBhcF9zZXR1cF9saXN0ZW5lcnMoYXBfc2VydmVyX2NvbmYpKSA8IDEpIHsKLSAgICAgICAgLyogWFhYOiBoZXksIHdoYXQncyB0aGUgcmlnaHQgd2F5IGZvciB0aGUgbXBtIHRvIGluZGljYXRlIGEgZmF0YWwgZXJyb3I/ICovCi0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0FMRVJULCAwLCBzLAotICAgICAgICAgICAgIm5vIGxpc3RlbmluZyBzb2NrZXRzIGF2YWlsYWJsZSwgc2h1dHRpbmcgZG93biIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgYXBfbG9nX3BpZChwY29uZiwgYXBfcGlkX2ZuYW1lKTsKLQotICAgIC8qIEluaXRpYWxpemUgY3Jvc3MtcHJvY2VzcyBhY2NlcHQgbG9jayAqLwotICAgIGxvY2tfZm5hbWUgPSBhcHJfcHNwcmludGYoX3Bjb25mLCAiJXMuJSIgQVBSX09TX1BST0NfVF9GTVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKF9wY29uZiwgbG9ja19mbmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX215X3BpZCk7Ci0gICAgcnYgPSBhcHJfbG9ja19jcmVhdGVfbnAoJmFjY2VwdF9tdXRleCwgQVBSX01VVEVYLCBBUFJfTE9DS0FMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHRfbG9ja19tZWNoLCBsb2NrX2ZuYW1lLCBfcGNvbmYpOwotICAgIGlmIChydiAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkcsIHJ2LCBzLAotICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGNyZWF0ZSBhY2NlcHQgbG9jayIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBpZiAoIWlzX2dyYWNlZnVsKSB7Ci0gICAgICAgIGFwX3J1bl9wcmVfbXBtKHBjb25mLCBTQl9TSEFSRUQpOwotICAgIH0KLQotICAgIHNldF9zaWduYWxzKCk7Ci0gICAgLyogRG9uJ3QgdGhyYXNoLi4uICovCi0gICAgaWYgKG1heF9zcGFyZV90aHJlYWRzIDwgbWluX3NwYXJlX3RocmVhZHMgKyBhcF90aHJlYWRzX3Blcl9jaGlsZCkKLQltYXhfc3BhcmVfdGhyZWFkcyA9IG1pbl9zcGFyZV90aHJlYWRzICsgYXBfdGhyZWFkc19wZXJfY2hpbGQ7Ci0KLSAgICAvKiBJZiB3ZSdyZSBkb2luZyBhIGdyYWNlZnVsX3Jlc3RhcnQgdGhlbiB3ZSdyZSBnb2luZyB0byBzZWUgYSBsb3QKLSAgICAgKiBvZiBjaGlsZHJlbiBleGl0aW5nIGltbWVkaWF0ZWx5IHdoZW4gd2UgZ2V0IGludG8gdGhlIG1haW4gbG9vcAotICAgICAqIGJlbG93IChiZWNhdXNlIHdlIGp1c3Qgc2VudCB0aGVtIFNJR1dJTkNIKS4gIFRoaXMgaGFwcGVucyBwcmV0dHkKLSAgICAgKiByYXBpZGx5Li4uIGFuZCBmb3IgZWFjaCBvbmUgdGhhdCBleGl0cyB3ZSdsbCBzdGFydCBhIG5ldyBvbmUgdW50aWwKLSAgICAgKiB3ZSByZWFjaCBhdCBsZWFzdCBkYWVtb25zX21pbl9mcmVlLiAgQnV0IHdlIG1heSBiZSBwZXJtaXR0ZWQgdG8KLSAgICAgKiBzdGFydCBtb3JlIHRoYW4gdGhhdCwgc28gd2UnbGwganVzdCBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IHdlJ3JlCi0gICAgICogc3VwcG9zZWQgdG8gc3RhcnQgdXAgd2l0aG91dCB0aGUgMSBzZWNvbmQgcGVuYWx0eSBiZXR3ZWVuIGVhY2ggZm9yay4KLSAgICAgKi8KLSAgICByZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQgPSBhcF9kYWVtb25zX3RvX3N0YXJ0OwotICAgIGlmIChyZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQgPiBhcF9kYWVtb25zX2xpbWl0KSB7Ci0JcmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0ID0gYXBfZGFlbW9uc19saW1pdDsKLSAgICB9Ci0gICAgaWYgKCFpc19ncmFjZWZ1bCkgewotCXN0YXJ0dXBfY2hpbGRyZW4ocmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0KTsKLQlyZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQgPSAwOwotICAgIH0KLSAgICBlbHNlIHsKLQkvKiBnaXZlIHRoZSBzeXN0ZW0gc29tZSB0aW1lIHRvIHJlY292ZXIgYmVmb3JlIGtpY2tpbmcgaW50bwotCSAgICAqIGV4cG9uZW50aWFsIG1vZGUgKi8KLQlob2xkX29mZl9vbl9leHBvbmVudGlhbF9zcGF3bmluZyA9IDEwOwotICAgIH0KLQotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwgMCwgYXBfc2VydmVyX2NvbmYsCi0JCSIlcyBjb25maWd1cmVkIC0tIHJlc3VtaW5nIG5vcm1hbCBvcGVyYXRpb25zIiwKLQkJYXBfZ2V0X3NlcnZlcl92ZXJzaW9uKCkpOwotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0lORk8sIDAsIGFwX3NlcnZlcl9jb25mLAotCQkiU2VydmVyIGJ1aWx0OiAlcyIsIGFwX2dldF9zZXJ2ZXJfYnVpbHQoKSk7Ci0gICAgcmVzdGFydF9wZW5kaW5nID0gc2h1dGRvd25fcGVuZGluZyA9IDA7Ci0KLSAgICBzZXJ2ZXJfbWFpbl9sb29wKHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydCk7Ci0KLSAgICBpZiAoc2h1dGRvd25fcGVuZGluZykgewotICAgICAgICAvKiBUaW1lIHRvIGdyYWNlZnVsbHkgc2h1dCBkb3duOgotICAgICAgICAgKiBLaWxsIGNoaWxkIHByb2Nlc3NlcywgdGVsbCB0aGVtIHRvIGNhbGwgY2hpbGRfZXhpdCwgZXRjLi4uCi0gICAgICAgICAqLwotICAgICAgICB3YWtlX3VwX2FuZF9kaWUoKTsKLQotICAgICAgICBpZiAodW5peGRfa2lsbHBnKGdldHBncnAoKSwgU0lHVEVSTSkgPCAwKSB7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIGFwX3NlcnZlcl9jb25mLCAia2lsbHBnIFNJR1RFUk0iKTsKLSAgICAgICAgfQotICAgICAgICBhcF9yZWNsYWltX2NoaWxkX3Byb2Nlc3NlcygxKTsJCS8qIFN0YXJ0IHdpdGggU0lHVEVSTSAqLwotICAgIAotICAgICAgICAvKiBjbGVhbnVwIHBpZCBmaWxlIG9uIG5vcm1hbCBzaHV0ZG93biAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpwaWRmaWxlID0gTlVMTDsKLSAgICAgICAgICAgIHBpZGZpbGUgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZSAocGNvbmYsIGFwX3BpZF9mbmFtZSk7Ci0gICAgICAgICAgICBpZiAoIHBpZGZpbGUgIT0gTlVMTCAmJiB1bmxpbmsocGlkZmlsZSkgPT0gMCkKLSAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19JTkZPLCAwLAotICAgICAgICAgICAgCQkgYXBfc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAJCSAicmVtb3ZlZCBQSUQgZmlsZSAlcyAocGlkPSVsZCkiLAotICAgICAgICAgICAgCQkgcGlkZmlsZSwgKGxvbmcpZ2V0cGlkKCkpOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwgMCwgYXBfc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAiY2F1Z2h0IFNJR1RFUk0sIHNodXR0aW5nIGRvd24iKTsKLSAgICAKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiB3ZSd2ZSBiZWVuIHRvbGQgdG8gcmVzdGFydCAqLwotICAgIGFwcl9zaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKLQotICAgIGlmIChvbmVfcHJvY2VzcykgewotCS8qIG5vdCB3b3J0aCB0aGlua2luZyBhYm91dCAqLwotCXJldHVybiAxOwotICAgIH0KLQotICAgIC8qIGFkdmFuY2UgdG8gdGhlIG5leHQgZ2VuZXJhdGlvbiAqLwotICAgIC8qIFhYWDogd2UgcmVhbGx5IG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgbmV3IGdlbmVyYXRpb24gbnVtYmVyIGlzbid0IGluCi0gICAgICogdXNlIGJ5IGFueSBvZiB0aGUgY2hpbGRyZW4uCi0gICAgICovCi0gICAgKythcF9teV9nZW5lcmF0aW9uOwotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbC5ydW5uaW5nX2dlbmVyYXRpb24gPSBhcF9teV9nZW5lcmF0aW9uOwotICAgIHVwZGF0ZV9zY29yZWJvYXJkX2dsb2JhbCgpOwotICAgIAotICAgIC8qIHdha2UgdXAgdGhlIGNoaWxkcmVuLi4udGltZSB0byBkaWUuICBCdXQgd2UnbGwgaGF2ZSBtb3JlIHNvb24gKi8KLSAgICB3YWtlX3VwX2FuZF9kaWUoKTsKLSAgICAKLSAgICBpZiAoaXNfZ3JhY2VmdWwpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19OT1RJQ0UsIDAsIGFwX3NlcnZlcl9jb25mLAotCQkgICAgIlNJR1dJTkNIIHJlY2VpdmVkLiAgRG9pbmcgZ3JhY2VmdWwgcmVzdGFydCIpOwotCi0JLyogVGhpcyBpcyBtb3N0bHkgZm9yIGRlYnVnZ2luZy4uLiBzbyB0aGF0IHdlIGtub3cgd2hhdCBpcyBzdGlsbAotICAgICAgICAgKiBncmFjZWZ1bGx5IGRlYWxpbmcgd2l0aCBleGlzdGluZyByZXF1ZXN0LgotICAgICAgICAgKi8KLQkKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAvKiBLaWxsICdlbSBhbGwuICBTaW5jZSB0aGUgY2hpbGQgYWN0cyB0aGUgc2FtZSBvbiB0aGUgcGFyZW50cyBTSUdURVJNIAotICAgICAgICogYW5kIGEgU0lHSFVQLCB3ZSBtYXkgYXMgd2VsbCB1c2UgdGhlIHNhbWUgc2lnbmFsLCBiZWNhdXNlIHNvbWUgdXNlcgotICAgICAgICogcHRocmVhZHMgYXJlIHN0ZWFsaW5nIHNpZ25hbHMgZnJvbSB1cyBsZWZ0IGFuZCByaWdodC4KLSAgICAgICAqLwotCWlmICh1bml4ZF9raWxscGcoZ2V0cGdycCgpLCBTSUdURVJNKSA8IDApIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBhcF9zZXJ2ZXJfY29uZiwgImtpbGxwZyBTSUdURVJNIik7Ci0JfQotICAgICAgICBhcF9yZWNsYWltX2NoaWxkX3Byb2Nlc3NlcygxKTsJCS8qIFN0YXJ0IHdpdGggU0lHVEVSTSAqLwotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwgMCwgYXBfc2VydmVyX2NvbmYsCi0JCSAgICAiU0lHSFVQIHJlY2VpdmVkLiAgQXR0ZW1wdGluZyB0byByZXN0YXJ0Iik7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB3b3JrZXJfcHJlX2NvbmZpZyhhcHJfcG9vbF90ICpwY29uZiwgYXByX3Bvb2xfdCAqcGxvZywgYXByX3Bvb2xfdCAqcHRlbXApCi17Ci0gICAgc3RhdGljIGludCByZXN0YXJ0X251bSA9IDA7Ci0gICAgaW50IG5vX2RldGFjaCA9IDA7Ci0KLSAgICBvbmVfcHJvY2VzcyA9ICEhYXBfZXhpc3RzX2NvbmZpZ19kZWZpbmUoIk9ORV9QUk9DRVNTIik7Ci0gICAgbm9fZGV0YWNoID0gISFhcF9leGlzdHNfY29uZmlnX2RlZmluZSgiTk9fREVUQUNIIik7Ci0KLSAgICAvKiBzaWdoLCB3YW50IHRoaXMgb25seSB0aGUgc2Vjb25kIHRpbWUgYXJvdW5kICovCi0gICAgaWYgKHJlc3RhcnRfbnVtKysgPT0gMSkgewotCWlzX2dyYWNlZnVsID0gMDsKLQotCWlmICghb25lX3Byb2Nlc3MgJiYgIW5vX2RldGFjaCkgewotCSAgICBhcHJfcHJvY19kZXRhY2goKTsKLQl9Ci0JYXBfbXlfcGlkID0gZ2V0cGlkKCk7Ci0gICAgfQotCi0gICAgdW5peGRfcHJlX2NvbmZpZyhwdGVtcCk7Ci0gICAgYXBfbGlzdGVuX3ByZV9jb25maWcoKTsKLSAgICBhcF9kYWVtb25zX3RvX3N0YXJ0ID0gREVGQVVMVF9TVEFSVF9EQUVNT047Ci0gICAgbWluX3NwYXJlX3RocmVhZHMgPSBERUZBVUxUX01JTl9GUkVFX0RBRU1PTiAqIERFRkFVTFRfVEhSRUFEU19QRVJfQ0hJTEQ7Ci0gICAgbWF4X3NwYXJlX3RocmVhZHMgPSBERUZBVUxUX01BWF9GUkVFX0RBRU1PTiAqIERFRkFVTFRfVEhSRUFEU19QRVJfQ0hJTEQ7Ci0gICAgYXBfZGFlbW9uc19saW1pdCA9IEhBUkRfU0VSVkVSX0xJTUlUOwotICAgIGFwX3RocmVhZHNfcGVyX2NoaWxkID0gREVGQVVMVF9USFJFQURTX1BFUl9DSElMRDsKLSAgICBhcF9waWRfZm5hbWUgPSBERUZBVUxUX1BJRExPRzsKLSAgICBhcF9zY29yZWJvYXJkX2ZuYW1lID0gREVGQVVMVF9TQ09SRUJPQVJEOwotICAgIGxvY2tfZm5hbWUgPSBERUZBVUxUX0xPQ0tGSUxFOwotICAgIGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQgPSBERUZBVUxUX01BWF9SRVFVRVNUU19QRVJfQ0hJTEQ7Ci0gICAgYXBfZXh0ZW5kZWRfc3RhdHVzID0gMDsKLQotICAgIGFwcl9jcHlzdHJuKGFwX2NvcmVkdW1wX2RpciwgYXBfc2VydmVyX3Jvb3QsIHNpemVvZihhcF9jb3JlZHVtcF9kaXIpKTsKLX0KLQotc3RhdGljIHZvaWQgd29ya2VyX2hvb2tzKGFwcl9wb29sX3QgKnApCi17Ci0gICAgb25lX3Byb2Nlc3MgPSAwOwotCi0gICAgYXBfaG9va19wcmVfY29uZmlnKHdvcmtlcl9wcmVfY29uZmlnLCBOVUxMLCBOVUxMLCBBUFJfSE9PS19NSURETEUpOwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfcGlkZmlsZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNvbnN0IGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKGNtZC0+c2VydmVyLT5pc192aXJ0dWFsKSB7Ci0JcmV0dXJuICJQaWRGaWxlIGRpcmVjdGl2ZSBub3QgYWxsb3dlZCBpbiA8VmlydHVhbEhvc3Q+IjsKLSAgICB9Ci0gICAgYXBfcGlkX2ZuYW1lID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3Njb3JlYm9hcmQoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LAotCQkJCSAgY29uc3QgY2hhciAqYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBhcF9zY29yZWJvYXJkX2ZuYW1lID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2xvY2tmaWxlKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY29uc3QgY2hhciAqYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBsb2NrX2ZuYW1lID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2RhZW1vbnNfdG9fc3RhcnQoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LAotCQkJCQljb25zdCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX2RhZW1vbnNfdG9fc3RhcnQgPSBhdG9pKGFyZyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbWluX3NwYXJlX3RocmVhZHMoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LAotCQkJCQkgY29uc3QgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1pbl9zcGFyZV90aHJlYWRzID0gYXRvaShhcmcpOwotICAgIGlmIChtaW5fc3BhcmVfdGhyZWFkcyA8PSAwKSB7Ci0gICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgIldBUk5JTkc6IGRldGVjdGVkIE1pblNwYXJlVGhyZWFkcyBzZXQgdG8gbm9uLXBvc2l0aXZlLiIpOwotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICJSZXNldHRpbmcgdG8gMSB0byBhdm9pZCBhbG1vc3QgY2VydGFpbiBBcGFjaGUgZmFpbHVyZS4iKTsKLSAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIHJlYWQgdGhlIGRvY3VtZW50YXRpb24uIik7Ci0gICAgICAgbWluX3NwYXJlX3RocmVhZHMgPSAxOwotICAgIH0KLSAgICAgICAKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9tYXhfc3BhcmVfdGhyZWFkcyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksCi0JCQkJCSBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbWF4X3NwYXJlX3RocmVhZHMgPSBhdG9pKGFyZyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfc2VydmVyX2xpbWl0IChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksCi0JCQkJICAgICBjb25zdCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX2RhZW1vbnNfbGltaXQgPSBhdG9pKGFyZyk7Ci0gICAgaWYgKGFwX2RhZW1vbnNfbGltaXQgPiBIQVJEX1NFUlZFUl9MSU1JVCkgewotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICJXQVJOSU5HOiBNYXhDbGllbnRzIG9mICVkIGV4Y2VlZHMgY29tcGlsZSB0aW1lIGxpbWl0ICIKLSAgICAgICAgICAgICAgICAgICAgIm9mICVkIHNlcnZlcnMsIiwgYXBfZGFlbW9uc19saW1pdCwgSEFSRF9TRVJWRVJfTElNSVQpOwotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICIgbG93ZXJpbmcgTWF4Q2xpZW50cyB0byAlZC4gIFRvIGluY3JlYXNlLCBwbGVhc2UgIgotICAgICAgICAgICAgICAgICAgICAic2VlIHRoZSIsIEhBUkRfU0VSVkVSX0xJTUlUKTsKLSAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAiIEhBUkRfU0VSVkVSX0xJTUlUIGRlZmluZSBpbiAlcy4iLAotICAgICAgICAgICAgICAgICAgICBBUF9NUE1fSEFSRF9MSU1JVFNfRklMRSk7Ci0gICAgICAgYXBfZGFlbW9uc19saW1pdCA9IEhBUkRfU0VSVkVSX0xJTUlUOwotICAgIH0gCi0gICAgZWxzZSBpZiAoYXBfZGFlbW9uc19saW1pdCA8IDEpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsICJXQVJOSU5HOiBSZXF1aXJlIE1heENsaWVudHMgPiAwLCBzZXR0aW5nIHRvIDEiKTsKLQlhcF9kYWVtb25zX2xpbWl0ID0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfdGhyZWFkc19wZXJfY2hpbGQgKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwKLQkJCQkJICBjb25zdCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX3RocmVhZHNfcGVyX2NoaWxkID0gYXRvaShhcmcpOwotICAgIGlmIChhcF90aHJlYWRzX3Blcl9jaGlsZCA+IEhBUkRfVEhSRUFEX0xJTUlUKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiV0FSTklORzogVGhyZWFkc1BlckNoaWxkIG9mICVkIGV4Y2VlZHMgY29tcGlsZSB0aW1lICIKLSAgICAgICAgICAgICAgICAgICAgICJsaW1pdCBvZiAlZCB0aHJlYWRzLCIsIGFwX3RocmVhZHNfcGVyX2NoaWxkLAotICAgICAgICAgICAgICAgICAgICAgSEFSRF9USFJFQURfTElNSVQpOwotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIiBsb3dlcmluZyBUaHJlYWRzUGVyQ2hpbGQgdG8gJWQuIFRvIGluY3JlYXNlLCBwbGVhc2UiCi0gICAgICAgICAgICAgICAgICAgICAiIHNlZSB0aGUiLCBIQVJEX1RIUkVBRF9MSU1JVCk7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiIEhBUkRfVEhSRUFEX0xJTUlUIGRlZmluZSBpbiAlcy4iLAotICAgICAgICAgICAgICAgICAgICAgQVBfTVBNX0hBUkRfTElNSVRTX0ZJTEUpOwotICAgICAgICBhcF90aHJlYWRzX3Blcl9jaGlsZCA9IEhBUkRfVEhSRUFEX0xJTUlUOwotICAgIH0KLSAgICBlbHNlIGlmIChhcF90aHJlYWRzX3Blcl9jaGlsZCA8IDEpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIldBUk5JTkc6IFJlcXVpcmUgVGhyZWFkc1BlckNoaWxkID4gMCwgc2V0dGluZyB0byAxIik7Ci0JYXBfdGhyZWFkc19wZXJfY2hpbGQgPSAxOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9tYXhfcmVxdWVzdHMoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LAotCQkJCSAgICBjb25zdCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQgPSBhdG9pKGFyZyk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9jb3JlZHVtcGRpciAoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LAotCQkJCSAgICBjb25zdCBjaGFyICphcmcpIAotewotICAgIGFwcl9maW5mb190IGZpbmZvOwotICAgIGNvbnN0IGNoYXIgKmZuYW1lOwotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGZuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUoY21kLT5wb29sLCBhcmcpOwotICAgIGlmICgoYXByX3N0YXQoJmZpbmZvLCBmbmFtZSwgQVBSX0ZJTkZPX1RZUEUsIGNtZC0+cG9vbCkgIT0gQVBSX1NVQ0NFU1MpIAotICAgICAgICB8fCAoZmluZm8uZmlsZXR5cGUgIT0gQVBSX0RJUikpIHsKLQlyZXR1cm4gYXByX3BzdHJjYXQoY21kLT5wb29sLCAiQ29yZUR1bXBEaXJlY3RvcnkgIiwgZm5hbWUsIAotCQkJICAiIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhIGRpcmVjdG9yeSIsIE5VTEwpOwotICAgIH0KLSAgICBhcHJfY3B5c3RybihhcF9jb3JlZHVtcF9kaXIsIGZuYW1lLCBzaXplb2YoYXBfY29yZWR1bXBfZGlyKSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfYWNjZXB0X2xvY2tfbWVjaChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoIXN0cmNhc2VjbXAoYXJnLCAiZGVmYXVsdCIpKSB7Ci0gICAgICAgIGFjY2VwdF9sb2NrX21lY2ggPSBBUFJfTE9DS19ERUZBVUxUOwotICAgIH0KLSNpZiBBUFJfSEFTX0ZMT0NLX1NFUklBTElaRQotICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZywgImZsb2NrIikpIHsKLSAgICAgICAgYWNjZXB0X2xvY2tfbWVjaCA9IEFQUl9MT0NLX0ZMT0NLOwotICAgIH0KLSNlbmRpZgotI2lmIEFQUl9IQVNfRkNOVExfU0VSSUFMSVpFCi0gICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJnLCAiZmNudGwiKSkgewotICAgICAgICBhY2NlcHRfbG9ja19tZWNoID0gQVBSX0xPQ0tfRkNOVEw7Ci0gICAgfQotI2VuZGlmCi0jaWYgQVBSX0hBU19TWVNWU0VNX1NFUklBTElaRQotICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZywgInN5c3ZzZW0iKSkgewotICAgICAgICBhY2NlcHRfbG9ja19tZWNoID0gQVBSX0xPQ0tfU1lTVlNFTTsKLSAgICB9Ci0jZW5kaWYKLSNpZiBBUFJfSEFTX1BST0NfUFRIUkVBRF9TRVJJQUxJWkUKLSAgICBlbHNlIGlmICghc3RyY2FzZWNtcChhcmcsICJwcm9jX3B0aHJlYWQiKSkgewotICAgICAgICBhY2NlcHRfbG9ja19tZWNoID0gQVBSX0xPQ0tfUFJPQ19QVEhSRUFEOwotICAgIH0KLSNlbmRpZgotICAgIGVsc2UgewotICAgICAgICByZXR1cm4gYXByX3BzdHJjYXQoY21kLT5wb29sLCBhcmcsICIgaXMgYW4gaW52YWxpZCBtdXRleCBtZWNoYW5pc207IHZhbGlkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbmVzIGZvciB0aGlzIHBsYXRmb3JtIGFyZTogZGVmYXVsdCIKLSNpZiBBUFJfSEFTX0ZMT0NLX1NFUklBTElaRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgZmxvY2siCi0jZW5kaWYKLSNpZiBBUFJfSEFTX0ZDTlRMX1NFUklBTElaRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgZmNudGwiCi0jZW5kaWYKLSNpZiBBUFJfSEFTX1NZU1ZTRU1fU0VSSUFMSVpFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBzeXN2c2VtIgotI2VuZGlmCi0jaWYgQVBSX0hBU19QUk9DX1BUSFJFQURfU0VSSUFMSVpFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBwcm9jX3B0aHJlYWQiCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICwgTlVMTCk7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgd29ya2VyX2NtZHNbXSA9IHsKLVVOSVhfREFFTU9OX0NPTU1BTkRTCi1MSVNURU5fQ09NTUFORFMKLUFQX0lOSVRfVEFLRTEoIlBpZEZpbGUiLCBzZXRfcGlkZmlsZSwgTlVMTCwgUlNSQ19DT05GLAotICAgICJBIGZpbGUgZm9yIGxvZ2dpbmcgdGhlIHNlcnZlciBwcm9jZXNzIElEIiksCi1BUF9JTklUX1RBS0UxKCJTY29yZUJvYXJkRmlsZSIsIHNldF9zY29yZWJvYXJkLCBOVUxMLCBSU1JDX0NPTkYsCi0gICAgIkEgZmlsZSBmb3IgQXBhY2hlIHRvIG1haW50YWluIHJ1bnRpbWUgcHJvY2VzcyBtYW5hZ2VtZW50IGluZm9ybWF0aW9uIiksCi1BUF9JTklUX1RBS0UxKCJMb2NrRmlsZSIsIHNldF9sb2NrZmlsZSwgTlVMTCwgUlNSQ19DT05GLAotICAgICJUaGUgbG9ja2ZpbGUgdXNlZCB3aGVuIEFwYWNoZSBuZWVkcyB0byBsb2NrIHRoZSBhY2NlcHQoKSBjYWxsIiksCi1BUF9JTklUX1RBS0UxKCJTdGFydFNlcnZlcnMiLCBzZXRfZGFlbW9uc190b19zdGFydCwgTlVMTCwgUlNSQ19DT05GLAotICAiTnVtYmVyIG9mIGNoaWxkIHByb2Nlc3NlcyBsYXVuY2hlZCBhdCBzZXJ2ZXIgc3RhcnR1cCIpLAotQVBfSU5JVF9UQUtFMSgiTWluU3BhcmVUaHJlYWRzIiwgc2V0X21pbl9zcGFyZV90aHJlYWRzLCBOVUxMLCBSU1JDX0NPTkYsCi0gICJNaW5pbXVtIG51bWJlciBvZiBpZGxlIGNoaWxkcmVuLCB0byBoYW5kbGUgcmVxdWVzdCBzcGlrZXMiKSwKLUFQX0lOSVRfVEFLRTEoIk1heFNwYXJlVGhyZWFkcyIsIHNldF9tYXhfc3BhcmVfdGhyZWFkcywgTlVMTCwgUlNSQ19DT05GLAotICAiTWF4aW11bSBudW1iZXIgb2YgaWRsZSBjaGlsZHJlbiIpLAotQVBfSU5JVF9UQUtFMSgiTWF4Q2xpZW50cyIsIHNldF9zZXJ2ZXJfbGltaXQsIE5VTEwsIFJTUkNfQ09ORiwKLSAgIk1heGltdW0gbnVtYmVyIG9mIGNoaWxkcmVuIGFsaXZlIGF0IHRoZSBzYW1lIHRpbWUiKSwKLUFQX0lOSVRfVEFLRTEoIlRocmVhZHNQZXJDaGlsZCIsIHNldF90aHJlYWRzX3Blcl9jaGlsZCwgTlVMTCwgUlNSQ19DT05GLAotICAiTnVtYmVyIG9mIHRocmVhZHMgZWFjaCBjaGlsZCBjcmVhdGVzIiksCi1BUF9JTklUX1RBS0UxKCJNYXhSZXF1ZXN0c1BlckNoaWxkIiwgc2V0X21heF9yZXF1ZXN0cywgTlVMTCwgUlNSQ19DT05GLAotICAiTWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdHMgYSBwYXJ0aWN1bGFyIGNoaWxkIHNlcnZlcyBiZWZvcmUgZHlpbmcuIiksCi1BUF9JTklUX1RBS0UxKCJDb3JlRHVtcERpcmVjdG9yeSIsIHNldF9jb3JlZHVtcGRpciwgTlVMTCwgUlNSQ19DT05GLAotICAiVGhlIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RvcnkgQXBhY2hlIGNoYW5nZXMgdG8gYmVmb3JlIGR1bXBpbmcgY29yZSIpLAotQVBfSU5JVF9UQUtFMSgiQWNjZXB0TXV0ZXgiLCBzZXRfYWNjZXB0X2xvY2tfbWVjaCwgTlVMTCwgUlNSQ19DT05GLAotICAgICAgICAgICAgICAiVGhlIHN5c3RlbSBtdXRleCBpbXBsZW1lbnRhdGlvbiB0byB1c2UgZm9yIHRoZSBhY2NlcHQgbXV0ZXgiKSwKLXsgTlVMTCB9Ci19OwotCi1tb2R1bGUgQVBfTU9EVUxFX0RFQ0xBUkVfREFUQSBtcG1fd29ya2VyX21vZHVsZSA9IHsKLSAgICBNUE0yMF9NT0RVTEVfU1RVRkYsCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGhvb2sgdG8gcnVuIGJlZm9yZSBhcGFjaGUgcGFyc2VzIGFyZ3MgKi8KLSAgICBOVUxMLAkJCS8qIGNyZWF0ZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLSAgICBOVUxMLAkJCS8qIG1lcmdlIHBlci1kaXJlY3RvcnkgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgICBOVUxMLAkJCS8qIGNyZWF0ZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLSAgICBOVUxMLAkJCS8qIG1lcmdlIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgICB3b3JrZXJfY21kcywJCS8qIGNvbW1hbmQgYXByX3RhYmxlX3QgKi8KLSAgICB3b3JrZXJfaG9va3MJCS8qIHJlZ2lzdGVyX2hvb2tzICovCi19OwotCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtX2NvbW1vbi5jIGIvc2VydmVyL21wbV9jb21tb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwMWI0Yy4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtX2NvbW1vbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotLyogVGhlIHB1cnBvc2Ugb2YgdGhpcyBmaWxlIGlzIHRvIHN0b3JlIHRoZSBjb2RlIHRoYXQgTU9TVCBtcG0ncyB3aWxsIG5lZWQKLSAqIHRoaXMgZG9lcyBub3QgbWVhbiBhIGZ1bmN0aW9uIG9ubHkgZ29lcyBpbnRvIHRoaXMgZmlsZSBpZiBldmVyeSBNUE0gbmVlZHMKLSAqIGl0LiAgSXQgbWVhbnMgdGhhdCBpZiBhIGZ1bmN0aW9uIGlzIG5lZWRlZCBieSBtb3JlIHRoYW4gb25lIE1QTSwgYW5kCi0gKiBmdXR1cmUgbWFpbnRlbmFuY2Ugd291bGQgYmUgc2VydmVkIGJ5IG1ha2luZyB0aGUgY29kZSBjb21tb24sIHRoZW4gdGhlCi0gKiBmdW5jdGlvbiBiZWxvbmdzIGhlcmUuCi0gKgotICogVGhpcyBpcyBnb2luZyBpbiBzcmMvbWFpbiBiZWNhdXNlIGl0IGlzIG5vdCBwbGF0Zm9ybSBzcGVjaWZpYywgaXQgaXMKLSAqIHNwZWNpZmljIHRvIG11bHRpLXByb2Nlc3Mgc2VydmVycywgYnV0IE5PVCB0byBVbml4LiAgV2hpY2ggaXMgd2h5IGl0Ci0gKiBkb2VzIG5vdCBiZWxvbmcgaW4gc3JjL29zL3VuaXgKLSAqLwotCi0jaW5jbHVkZSAiYXByX3RocmVhZF9wcm9jLmgiCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAibXBtLmgiCi0KLSNpZmRlZiBERVhURVJfTVBNCi0jZGVmaW5lIENISUxEX0lORk9fVEFCTEUgICAgIGFwX2NoaWxkX3RhYmxlCi0jZWxpZiBkZWZpbmVkKE1QTVRfUFRIUkVBRF9NUE0pIHx8IGRlZmluZWQgKFBSRUZPUktfTVBNKQotI2RlZmluZSBDSElMRF9JTkZPX1RBQkxFICAgICBhcF9zY29yZWJvYXJkX2ltYWdlLT5wYXJlbnQKLSNlbmRpZiAKLQotCi12b2lkIGFwX3JlY2xhaW1fY2hpbGRfcHJvY2Vzc2VzKGludCB0ZXJtaW5hdGUpCi17Ci0gICAgaW50IGksIHN0YXR1czsKLSAgICBsb25nIGludCB3YWl0dGltZSA9IDEwMjQgKiAxNjsgICAgICAvKiBpbiB1c2VjcyAqLwotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgIGludCB3YWl0cmV0LCB0cmllczsKLSAgICBpbnQgbm90X2RlYWRfeWV0OwotCi0jaWZuZGVmIERFWFRFUl9NUE0KLSAgICBhcF9zeW5jX3Njb3JlYm9hcmRfaW1hZ2UoKTsKLSNlbmRpZgotCi0gICAgZm9yICh0cmllcyA9IHRlcm1pbmF0ZSA/IDQgOiAxOyB0cmllcyA8PSA5OyArK3RyaWVzKSB7Ci0gICAgICAgIC8qIGRvbid0IHdhbnQgdG8gaG9sZCB1cCBwcm9ncmVzcyBhbnkgbW9yZSB0aGFuCi0gICAgICAgICAqIG5lY2Vzc2FyeSwgYnV0IHdlIG5lZWQgdG8gYWxsb3cgY2hpbGRyZW4gYSBmZXcgbW9tZW50cyB0byBleGl0LgotICAgICAgICAgKiBTZXQgZGVsYXkgd2l0aCBhbiBleHBvbmVudGlhbCBiYWNrb2ZmLgotICAgICAgICAgKi8KLSAgICAgICAgdHYudHZfc2VjID0gd2FpdHRpbWUgLyAxMDAwMDAwOwotICAgICAgICB0di50dl91c2VjID0gd2FpdHRpbWUgJSAxMDAwMDAwOwotICAgICAgICB3YWl0dGltZSA9IHdhaXR0aW1lICogNDsKLSAgICAgICAgYXBfc2VsZWN0KDAsIE5VTEwsIE5VTEwsIE5VTEwsICZ0dik7Ci0KLSAgICAgICAgLyogbm93IHNlZSB3aG8gaXMgZG9uZSAqLwotICAgICAgICBub3RfZGVhZF95ZXQgPSAwOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXBfbWF4X2RhZW1vbnNfbGltaXQ7ICsraSkgewotICAgICAgICAgICAgaW50IHBpZCA9IENISUxEX0lORk9fVEFCTEVbaV0ucGlkOwotCi0jaWZkZWYgREVYVEVSX01QTQotICAgICAgICAgICAgaWYgKGFwX2NoaWxkX3RhYmxlW2ldLnN0YXR1cyA9PSBTRVJWRVJfREVBRCkKLSNlbGlmIGRlZmluZWQoTVBNVF9QVEhSRUFEX01QTSkgfHwgZGVmaW5lZCAoUFJFRk9SS19NUE0pCi0gICAgICAgICAgICBpZiAocGlkID09IGFwX215X3BpZCB8fCBwaWQgPT0gMCkKLSNlbmRpZgotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICB3YWl0cmV0ID0gd2FpdHBpZChwaWQsICZzdGF0dXMsIFdOT0hBTkcpOwotICAgICAgICAgICAgaWYgKHdhaXRyZXQgPT0gcGlkIHx8IHdhaXRyZXQgPT0gLTEpIHsKLSNpZmRlZiBERVhURVJfTVBNCi0gICAgICAgICAgICAgICAgYXBfY2hpbGRfdGFibGVbaV0uc3RhdHVzID0gU0VSVkVSX0RFQUQ7Ci0jZWxpZiBkZWZpbmVkKE1QTVRfUFRIUkVBRF9NUE0pIHx8IGRlZmluZWQoUFJFRk9SS19NUE0pCi0gICAgICAgICAgICAgICAgYXBfc2NvcmVib2FyZF9pbWFnZS0+cGFyZW50W2ldLnBpZCA9IDA7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICsrbm90X2RlYWRfeWV0OwotICAgICAgICAgICAgc3dpdGNoICh0cmllcykgewotICAgICAgICAgICAgY2FzZSAxOiAgICAgLyogIDE2bXMgKi8KLSAgICAgICAgICAgIGNhc2UgMjogICAgIC8qICA4Mm1zICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDM6ICAgICAvKiAzNDRtcyAqLwotICAgICAgICAgICAgY2FzZSA0OiAgICAgLyogIDE2bXMgKi8KLSAgICAgICAgICAgIGNhc2UgNTogICAgIC8qICA4Mm1zICovCi0gICAgICAgICAgICBjYXNlIDY6ICAgICAvKiAzNDRtcyAqLwotICAgICAgICAgICAgY2FzZSA3OiAgICAgLyogMS40c2VjICovCi0gICAgICAgICAgICAgICAgLyogb2ssIG5vdyBpdCdzIGJlaW5nIGFubm95aW5nICovCi0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBhcF9zZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAiY2hpbGQgcHJvY2VzcyAlZCBzdGlsbCBkaWQgbm90IGV4aXQsIHNlbmRpbmcgYSBTSUdURVJNIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWQpOwotICAgICAgICAgICAgICAgIGtpbGwocGlkLCBTSUdURVJNKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgODogICAgIC8qICA2IHNlYyAqLwotICAgICAgICAgICAgICAgIC8qIGRpZSBjaGlsZCBzY3VtICovCi0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCBhcF9zZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAiY2hpbGQgcHJvY2VzcyAlZCBzdGlsbCBkaWQgbm90IGV4aXQsIHNlbmRpbmcgYSBTSUdLSUxMIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWQpOwotICAgICAgICAgICAgICAgIGtpbGwocGlkLCBTSUdLSUxMKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgOTogICAgIC8qIDE0IHNlYyAqLwotICAgICAgICAgICAgICAgIC8qIGdhdmUgaXQgb3VyIGJlc3Qgc2hvdCwgYnV0IGFsYXMuLi4gIElmIHRoaXMgcmVhbGx5Ci0gICAgICAgICAgICAgICAgICogaXMgYSBjaGlsZCB3ZSBhcmUgdHJ5aW5nIHRvIGtpbGwgYW5kIGl0IHJlYWxseSBoYXNuJ3QKLSAgICAgICAgICAgICAgICAgKiBleGl0ZWQsIHdlIHdpbGwgbGlrZWx5IGZhaWwgdG8gYmluZCB0byB0aGUgcG9ydAotICAgICAgICAgICAgICAgICAqIGFmdGVyIHRoZSByZXN0YXJ0LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgYXBfc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBtYWtlIGNoaWxkIHByb2Nlc3MgJWQgZXhpdCwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRlbXB0aW5nIHRvIGNvbnRpbnVlIGFueXdheSIsIHBpZCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXBfY2hlY2tfb3RoZXJfY2hpbGQoKTsKLSAgICAgICAgaWYgKCFub3RfZGVhZF95ZXQpIHsKLSAgICAgICAgICAgIC8qIG5vdGhpbmcgbGVmdCB0byB3YWl0IGZvciAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvc2VydmVyL3Byb3RvY29sLmMgYi9zZXJ2ZXIvcHJvdG9jb2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNiMWU3ZS4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvcHJvdG9jb2wuYworKysgL2Rldi9udWxsCkBAIC0xLDE1OTQgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBiYXNlZCB1cG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUKLSAqIG9yaWdpbmFsbHkgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsCi0gKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICovCi0KLS8qCi0gKiBodHRwX3Byb3RvY29sLmMgLS0tIHJvdXRpbmVzIHdoaWNoIGRpcmVjdGx5IGNvbW11bmljYXRlIHdpdGggdGhlIGNsaWVudC4KLSAqCi0gKiBDb2RlIG9yaWdpbmFsbHkgYnkgUm9iIE1jQ29vbDsgbXVjaCByZWRvbmUgYnkgUm9iZXJ0IFMuIFRoYXUKLSAqIGFuZCB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgImFwci5oIgotI2luY2x1ZGUgImFwcl9zdHJpbmdzLmgiCi0jaW5jbHVkZSAiYXByX2J1Y2tldHMuaCIKLSNpbmNsdWRlICJhcHJfbGliLmgiCi0jaW5jbHVkZSAiYXByX3NpZ25hbC5oIgotCi0jZGVmaW5lIEFQUl9XQU5UX1NURElPICAgICAgICAgIC8qIGZvciBzc2NhbmYgKi8KLSNkZWZpbmUgQVBSX1dBTlRfU1RSRlVOQwotI2RlZmluZSBBUFJfV0FOVF9NRU1GVU5DCi0jaW5jbHVkZSAiYXByX3dhbnQuaCIKLQotI2RlZmluZSBDT1JFX1BSSVZBVEUKLSNpbmNsdWRlICJ1dGlsX2ZpbHRlci5oIgotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiCi0jaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCi0jaW5jbHVkZSAiaHR0cF92aG9zdC5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiICAgICAgICAgICAvKiBGb3IgZXJyb3JzIGRldGVjdGVkIGluIGJhc2ljIGF1dGggY29tbW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN1cHBvcnQgY29kZS4uLiAqLwotI2luY2x1ZGUgInV0aWxfZGF0ZS5oIiAgICAgICAgICAvKiBGb3IgcGFyc2VIVFRQZGF0ZSBhbmQgQkFEX0RBVEUgKi8KLSNpbmNsdWRlICJ1dGlsX2NoYXJzZXQuaCIKLSNpbmNsdWRlICJ1dGlsX2ViY2RpYy5oIgotCi0jaWYgQVBSX0hBVkVfU1REQVJHX0gKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbmRpZgotI2lmIEFQUl9IQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotCi1BUFJfSE9PS19TVFJVQ1QoCi0JICAgIEFQUl9IT09LX0xJTksocG9zdF9yZWFkX3JlcXVlc3QpCi0JICAgIEFQUl9IT09LX0xJTksobG9nX3RyYW5zYWN0aW9uKQotCSAgICBBUFJfSE9PS19MSU5LKGh0dHBfbWV0aG9kKQotCSAgICBBUFJfSE9PS19MSU5LKGRlZmF1bHRfcG9ydCkKLSkKLQotLyoKLSAqIEJ1aWxkcyB0aGUgY29udGVudC10eXBlIHRoYXQgc2hvdWxkIGJlIHNlbnQgdG8gdGhlIGNsaWVudCBmcm9tIHRoZQotICogY29udGVudC10eXBlIHNwZWNpZmllZC4gIFRoZSBmb2xsb3dpbmcgcnVsZXMgYXJlIGZvbGxvd2VkOgotICogICAgLSBpZiB0eXBlIGlzIE5VTEwsIHR5cGUgaXMgc2V0IHRvIGFwX2RlZmF1bHRfdHlwZShyKQotICogICAgLSBpZiBjaGFyc2V0IGFkZGluZyBpcyBkaXNhYmxlZCwgc3RvcCBwcm9jZXNzaW5nIGFuZCByZXR1cm4gdHlwZS4KLSAqICAgIC0gdGhlbiwgaWYgdGhlcmUgYXJlIG5vIHBhcmFtZXRlcnMgb24gdHlwZSwgYWRkIHRoZSBkZWZhdWx0IGNoYXJzZXQKLSAqICAgIC0gcmV0dXJuIHR5cGUKLSAqLwotY29uc3QgY2hhciAqYXBfbWFrZV9jb250ZW50X3R5cGUocmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKnR5cGUpCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKm5lZWRjc2V0W10gPSB7Ci0JInRleHQvcGxhaW4iLAotCSJ0ZXh0L2h0bWwiLAotCU5VTEwgfTsKLSAgICBjb25zdCBjaGFyICoqcGNzZXQ7Ci0gICAgY29yZV9kaXJfY29uZmlnICpjb25mID0KLQkoY29yZV9kaXJfY29uZmlnICopYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCQkmY29yZV9tb2R1bGUpOwotCi0gICAgaWYgKCF0eXBlKSB7Ci0JdHlwZSA9IGFwX2RlZmF1bHRfdHlwZShyKTsKLSAgICB9Ci0gICAgaWYgKGNvbmYtPmFkZF9kZWZhdWx0X2NoYXJzZXQgIT0gQUREX0RFRkFVTFRfQ0hBUlNFVF9PTikgewotCXJldHVybiB0eXBlOwotICAgIH0KLQotICAgIGlmIChhcF9zdHJjYXNlc3RyKHR5cGUsICJjaGFyc2V0PSIpICE9IE5VTEwpIHsKLQkvKiBhbHJlYWR5IGhhcyBwYXJhbWV0ZXIsIGRvIG5vdGhpbmcgKi8KLQkvKiBYWFggd2UgZG9uJ3QgY2hlY2sgdGhlIHZhbGlkaXR5ICovCi0JOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAJLyogc2VlIGlmIGl0IG1ha2VzIHNlbnNlIHRvIGFkZCB0aGUgY2hhcnNldC4gQXQgcHJlc2VudCwKLQkgKiB3ZSBvbmx5IGFkZCBpdCBpZiB0aGUgQ29udGVudC10eXBlIGlzIG9uZSBvZiBuZWVkY3NldFtdCi0JICovCi0JZm9yIChwY3NldCA9IG5lZWRjc2V0OyAqcGNzZXQgOyBwY3NldCsrKSB7Ci0JICAgIGlmIChhcF9zdHJjYXNlc3RyKHR5cGUsICpwY3NldCkgIT0gTlVMTCkgewotCQl0eXBlID0gYXByX3BzdHJjYXQoci0+cG9vbCwgdHlwZSwgIjsgY2hhcnNldD0iLCAKLQkJCQkgICBjb25mLT5hZGRfZGVmYXVsdF9jaGFyc2V0X25hbWUsIE5VTEwpOwotCQlicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gICAgcmV0dXJuIHR5cGU7Ci19Ci0KLXN0YXRpYyBpbnQgcGFyc2VfYnl0ZXJhbmdlKGNoYXIgKnJhbmdlLCBhcHJfb2ZmX3QgY2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcl9vZmZfdCAqc3RhcnQsIGFwcl9vZmZfdCAqZW5kKQotewotICAgIGNoYXIgKmRhc2ggPSBzdHJjaHIocmFuZ2UsICctJyk7Ci0KLSAgICBpZiAoIWRhc2gpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKChkYXNoID09IHJhbmdlKSkgewotICAgICAgICAvKiBJbiB0aGUgZm9ybSAiLTUiICovCi0gICAgICAgICpzdGFydCA9IGNsZW5ndGggLSBhdG9sKGRhc2ggKyAxKTsKLSAgICAgICAgKmVuZCA9IGNsZW5ndGggLSAxOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgKmRhc2ggPSAnXDAnOwotICAgICAgICBkYXNoKys7Ci0gICAgICAgICpzdGFydCA9IGF0b2wocmFuZ2UpOwotICAgICAgICBpZiAoKmRhc2gpCi0gICAgICAgICAgICAqZW5kID0gYXRvbChkYXNoKTsKLSAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgLyogIjUtIiAqLwotICAgICAgICAgICAgKmVuZCA9IGNsZW5ndGggLSAxOwotICAgIH0KLQotICAgIGlmICgqc3RhcnQgPCAwKQotCSpzdGFydCA9IDA7Ci0KLSAgICBpZiAoKmVuZCA+PSBjbGVuZ3RoKQotICAgICAgICAqZW5kID0gY2xlbmd0aCAtIDE7Ci0KLSAgICBpZiAoKnN0YXJ0ID4gKmVuZCkKLQlyZXR1cm4gLTE7Ci0KLSAgICByZXR1cm4gKCpzdGFydCA+IDAgfHwgKmVuZCA8IGNsZW5ndGgpOwotfQotCi1zdGF0aWMgaW50IGFwX3NldF9ieXRlcmFuZ2UocmVxdWVzdF9yZWMgKnIpOwotCi10eXBlZGVmIHN0cnVjdCBieXRlcmFuZ2VfY3R4IHsKLSAgICBhcHJfYnVja2V0X2JyaWdhZGUgKmJiOwotICAgIGludCBudW1fcmFuZ2VzOwotICAgIGNvbnN0IGNoYXIgKm9yaWdfY3Q7Ci19IGJ5dGVyYW5nZV9jdHg7Ci0KLS8qCi0gKiBIZXJlIHdlIHRyeSB0byBiZSBjb21wYXRpYmxlIHdpdGggY2xpZW50cyB0aGF0IHdhbnQgbXVsdGlwYXJ0L3gtYnl0ZXJhbmdlcwotICogaW5zdGVhZCBvZiBtdWx0aXBhcnQvYnl0ZXJhbmdlcyAoYWxzbyBzZWUgYWJvdmUpLCBhcyBwZXIgSFRUUC8xLjEuIFdlCi0gKiBsb29rIGZvciB0aGUgUmVxdWVzdC1SYW5nZSBoZWFkZXIgKGUuZy4gTmV0c2NhcGUgMiBhbmQgMykgYXMgYW4gaW5kaWNhdGlvbgotICogdGhhdCB0aGUgYnJvd3NlciBzdXBwb3J0cyBhbiBvbGRlciBwcm90b2NvbC4gV2UgYWxzbyBjaGVjayBVc2VyLUFnZW50Ci0gKiBmb3IgTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIDMsIHdoaWNoIG5lZWRzIHRoaXMgYXMgd2VsbC4KLSAqLwotc3RhdGljIGludCB1c2VfcmFuZ2VfeChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb25zdCBjaGFyICp1YTsKLSAgICByZXR1cm4gKGFwcl90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIlJlcXVlc3QtUmFuZ2UiKSB8fAotICAgICAgICAgICAgKCh1YSA9IGFwcl90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIlVzZXItQWdlbnQiKSkKLSAgICAgICAgICAgICAmJiBhcF9zdHJzdHJfYyh1YSwgIk1TSUUgMyIpKSk7Ci19Ci0KLSNkZWZpbmUgQllURVJBTkdFX0ZNVCAiJSIgQVBSX09GRl9UX0ZNVCAiLSUiIEFQUl9PRkZfVF9GTVQgIi8lIiBBUFJfT0ZGX1RfRk1UCi0KLUFQX0NPUkVfREVDTEFSRV9OT05TVEQoYXByX3N0YXR1c190KSBhcF9ieXRlcmFuZ2VfZmlsdGVyKAotICAgIGFwX2ZpbHRlcl90ICpmLAotICAgIGFwcl9idWNrZXRfYnJpZ2FkZSAqYmIpCi17Ci0jZGVmaW5lIE1JTl9MRU5HVEgobGVuMSwgbGVuMikgKChsZW4xID4gbGVuMikgPyBsZW4yIDogbGVuMSkKLSAgICByZXF1ZXN0X3JlYyAqciA9IGYtPnI7Ci0gICAgYnl0ZXJhbmdlX2N0eCAqY3R4ID0gZi0+Y3R4OwotICAgIGFwcl9idWNrZXQgKmU7Ci0gICAgYXByX2J1Y2tldF9icmlnYWRlICpic2VuZDsKLSAgICBhcHJfb2ZmX3QgcmFuZ2Vfc3RhcnQ7Ci0gICAgYXByX29mZl90IHJhbmdlX2VuZDsKLSAgICBjaGFyICpjdXJyZW50OwotICAgIGNoYXIgKmJvdW5kX2hlYWQ7Ci0gICAgYXByX3NzaXplX3QgYmJfbGVuZ3RoOwotICAgIGFwcl9vZmZfdCBjbGVuZ3RoID0gMDsKLSAgICBhcHJfc3RhdHVzX3QgcnY7Ci0gICAgaW50IGZvdW5kID0gMDsKLQotICAgIGlmICghY3R4KSB7Ci0gICAgICAgIGludCBudW1fcmFuZ2VzID0gYXBfc2V0X2J5dGVyYW5nZShyKTsKLSAKLSAgICAgICAgaWYgKG51bV9yYW5nZXMgPT0gLTEpIHsKLSAgICAgICAgICAgIGFwX3JlbW92ZV9vdXRwdXRfZmlsdGVyKGYpOwotICAgICAgICAgICAgYnNlbmQgPSBhcHJfYnJpZ2FkZV9jcmVhdGUoci0+cG9vbCk7Ci0gICAgICAgICAgICBlID0gYXBfYnVja2V0X2Vycm9yX2NyZWF0ZShIVFRQX1JBTkdFX05PVF9TQVRJU0ZJQUJMRSwgTlVMTCwgci0+cG9vbCk7Ci0gICAgICAgICAgICBBUFJfQlJJR0FERV9JTlNFUlRfVEFJTChic2VuZCwgZSk7Ci0gICAgICAgICAgICBlID0gYXByX2J1Y2tldF9lb3NfY3JlYXRlKCk7Ci0gICAgICAgICAgICBBUFJfQlJJR0FERV9JTlNFUlRfVEFJTChic2VuZCwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gYXBfcGFzc19icmlnYWRlKGYtPm5leHQsIGJzZW5kKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobnVtX3JhbmdlcyA9PSAwKSB7Ci0gICAgICAgICAgICBhcF9yZW1vdmVfb3V0cHV0X2ZpbHRlcihmKTsKLSAgICAgICAgICAgIHJldHVybiBhcF9wYXNzX2JyaWdhZGUoZi0+bmV4dCwgYmIpOwotICAgICAgICB9Ci0KLSAgICAgICAgY3R4ID0gZi0+Y3R4ID0gYXByX3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKCpjdHgpKTsKLSAgICAgICAgY3R4LT5udW1fcmFuZ2VzID0gbnVtX3JhbmdlczsKLQotICAgICAgICBpZiAobnVtX3JhbmdlcyA+IDEpIHsKLSAgICAgICAgICAgIGN0eC0+b3JpZ19jdCA9IHItPmNvbnRlbnRfdHlwZTsKLSAgICAgICAgICAgIHItPmNvbnRlbnRfdHlwZSA9IAotICAgICAgICAgICAgICAgICBhcHJfcHN0cmNhdChyLT5wb29sLCAibXVsdGlwYXJ0IiwgdXNlX3JhbmdlX3gocikgPyAiL3gtIiA6ICIvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVyYW5nZXM7IGJvdW5kYXJ5PSIsIHItPmJvdW5kYXJ5LCBOVUxMKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGNyZWF0ZSBhIGJyaWdhZGUgaW4gY2FzZSB3ZSBuZXZlciBjYWxsIGFwX3NhdmVfYnJpZ2FkZSgpICovCi0gICAgICAgIGN0eC0+YmIgPSBhcHJfYnJpZ2FkZV9jcmVhdGUoci0+cG9vbCk7Ci0gICAgfQotCi0gICAgLyogV2UgY2FuJ3QgYWN0dWFsbHkgZGVhbCB3aXRoIGJ5dGUtcmFuZ2VzIHVudGlsIHdlIGhhdmUgdGhlIHdob2xlIGJyaWdhZGUKLSAgICAgKiBiZWNhdXNlIHRoZSBieXRlLXJhbmdlcyBjYW4gYmUgaW4gYW55IG9yZGVyLCBhbmQgYWNjb3JkaW5nIHRvIHRoZSBSRkMsCi0gICAgICogd2UgU0hPVUxEIHJldHVybiB0aGUgZGF0YSBpbiB0aGUgc2FtZSBvcmRlciBpdCB3YXMgcmVxdWVzdGVkLiAKLSAgICAgKi8KLSAgICBpZiAoIUFQUl9CVUNLRVRfSVNfRU9TKEFQUl9CUklHQURFX0xBU1QoYmIpKSkgewotICAgICAgICBhcF9zYXZlX2JyaWdhZGUoZiwgJmN0eC0+YmIsICZiYik7Ci0gICAgICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLSAgICB9Ci0KLSAgICAvKiBjb21wdXRlIHRoaXMgb25jZSAoaXQgaXMgYW4gaW52YXJpYW50KSAqLwotICAgIGJvdW5kX2hlYWQgPSBhcHJfcHN0cmNhdChyLT5wb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkxGICItLSIsIHItPmJvdW5kYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkxGICJDb250ZW50LXR5cGU6ICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX21ha2VfY29udGVudF90eXBlKHIsIGN0eC0+b3JpZ19jdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSTEYgIkNvbnRlbnQtcmFuZ2U6IGJ5dGVzICIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICBhcF94bGF0ZV9wcm90b190b19hc2NpaShib3VuZF9oZWFkLCBzdHJsZW4oYm91bmRfaGVhZCkpOwotCi0gICAgLyogSWYgd2UgaGF2ZSBhIHNhdmVkIGJyaWdhZGUgZnJvbSBhIHByZXZpb3VzIHJ1biwgY29uY2F0IHRoZSBwYXNzZWQKLSAgICAgKiBicmlnYWRlIHdpdGggb3VyIHNhdmVkIGJyaWdhZGUuICBPdGhlcndpc2UganVzdCBjb250aW51ZS4gIAotICAgICAqLwotICAgIGlmIChjdHgtPmJiKSB7Ci0gICAgICAgIEFQUl9CUklHQURFX0NPTkNBVChjdHgtPmJiLCBiYik7Ci0gICAgICAgIGJiID0gY3R4LT5iYjsKLSAgICAgICAgY3R4LT5iYiA9IE5VTEw7ICAgICAvKiAjIyMgc3RyaWN0bHkgbmVjZXNzYXJ5PyBjYWxsIGJyaWdhZGVfZGVzdHJveT8gKi8KLSAgICB9Ci0KLSAgICAvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHdlIHdvbid0IGhhdmUgYSBjb250ZW50IGxlbmd0aCB5ZXQsIHNvIHdlIGhhdmUgdG8KLSAgICAgKiBjb21wdXRlIHRoZSBsZW5ndGggYmVmb3JlIHdlIGNhbiBhY3R1YWxseSBkbyB0aGUgYnl0ZXJhbmdlIHdvcmsuCi0gICAgICovCi0gICAgKHZvaWQpIGFwcl9icmlnYWRlX2xlbmd0aChiYiwgMSwgJmJiX2xlbmd0aCk7Ci0gICAgY2xlbmd0aCA9IChhcHJfb2ZmX3QpYmJfbGVuZ3RoOwotCi0gICAgLyogdGhpcyBicmlnYWRlIGhvbGRzIHdoYXQgd2Ugd2lsbCBiZSBzZW5kaW5nICovCi0gICAgYnNlbmQgPSBhcHJfYnJpZ2FkZV9jcmVhdGUoci0+cG9vbCk7Ci0KLSAgICB3aGlsZSAoKGN1cnJlbnQgPSBhcF9nZXR3b3JkKHItPnBvb2wsICZyLT5yYW5nZSwgJywnKSkgJiYKLSAgICAgICAgICAgKHJ2ID0gcGFyc2VfYnl0ZXJhbmdlKGN1cnJlbnQsIGNsZW5ndGgsICZyYW5nZV9zdGFydCwgJnJhbmdlX2VuZCkpKSB7Ci0gICAgICAgIGFwcl9idWNrZXQgKmUyOwotICAgICAgICBhcHJfYnVja2V0ICplYzsKLQotICAgICAgICBpZiAocnYgPT0gLTEpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBmb3VuZCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY3R4LT5udW1fcmFuZ2VzID4gMSkgewotICAgICAgICAgICAgY2hhciAqdHM7Ci0KLSAgICAgICAgICAgIGUgPSBhcHJfYnVja2V0X3Bvb2xfY3JlYXRlKGJvdW5kX2hlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihib3VuZF9oZWFkKSwgci0+cG9vbCk7Ci0gICAgICAgICAgICBBUFJfQlJJR0FERV9JTlNFUlRfVEFJTChic2VuZCwgZSk7Ci0KLSAgICAgICAgICAgIHRzID0gYXByX3BzcHJpbnRmKHItPnBvb2wsIEJZVEVSQU5HRV9GTVQgQ1JMRiBDUkxGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2Vfc3RhcnQsIHJhbmdlX2VuZCwgY2xlbmd0aCk7Ci0gICAgICAgICAgICBhcF94bGF0ZV9wcm90b190b19hc2NpaSh0cywgc3RybGVuKHRzKSk7Ci0gICAgICAgICAgICBlID0gYXByX2J1Y2tldF9wb29sX2NyZWF0ZSh0cywgc3RybGVuKHRzKSwgci0+cG9vbCk7Ci0gICAgICAgICAgICBBUFJfQlJJR0FERV9JTlNFUlRfVEFJTChic2VuZCwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGUgPSBhcHJfYnJpZ2FkZV9wYXJ0aXRpb24oYmIsIHJhbmdlX3N0YXJ0KTsKLSAgICAgICAgZTIgPSBhcHJfYnJpZ2FkZV9wYXJ0aXRpb24oYmIsIHJhbmdlX2VuZCArIDEpOwotICAgICAgICAKLSAgICAgICAgZWMgPSBlOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBhcHJfYnVja2V0ICpmb287Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpzdHI7Ci0gICAgICAgICAgICBhcHJfc2l6ZV90IGxlbjsKLQotICAgICAgICAgICAgaWYgKGFwcl9idWNrZXRfY29weShlYywgJmZvbykgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICBhcHJfYnVja2V0X3JlYWQoZWMsICZzdHIsICZsZW4sIEFQUl9CTE9DS19SRUFEKTsKLSAgICAgICAgICAgICAgICBmb28gPSBhcHJfYnVja2V0X2hlYXBfY3JlYXRlKHN0ciwgbGVuLCAwLCBOVUxMKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFQUl9CUklHQURFX0lOU0VSVF9UQUlMKGJzZW5kLCBmb28pOwotICAgICAgICAgICAgZWMgPSBBUFJfQlVDS0VUX05FWFQoZWMpOwotICAgICAgICB9IHdoaWxlIChlYyAhPSBlMik7Ci0gICAgfQotCi0gICAgaWYgKGZvdW5kID09IDApIHsKLSAgICAgICAgYXBfcmVtb3ZlX291dHB1dF9maWx0ZXIoZik7Ci0gICAgICAgIHItPnN0YXR1cyA9IEhUVFBfT0s7Ci0gICAgICAgIHJldHVybiBIVFRQX1JBTkdFX05PVF9TQVRJU0ZJQUJMRTsKLSAgICB9Ci0KLSAgICBpZiAoY3R4LT5udW1fcmFuZ2VzID4gMSkgewotICAgICAgICBjaGFyICplbmQ7Ci0KLSAgICAgICAgLyogYWRkIHRoZSBmaW5hbCBib3VuZGFyeSAqLwotICAgICAgICBlbmQgPSBhcHJfcHN0cmNhdChyLT5wb29sLCBDUkxGICItLSIsIHItPmJvdW5kYXJ5LCAiLS0iIENSTEYsIE5VTEwpOwotICAgICAgICBhcF94bGF0ZV9wcm90b190b19hc2NpaShlbmQsIHN0cmxlbihlbmQpKTsKLSAgICAgICAgZSA9IGFwcl9idWNrZXRfcG9vbF9jcmVhdGUoZW5kLCBzdHJsZW4oZW5kKSwgci0+cG9vbCk7Ci0gICAgICAgIEFQUl9CUklHQURFX0lOU0VSVF9UQUlMKGJzZW5kLCBlKTsKLSAgICB9Ci0KLSAgICBlID0gYXByX2J1Y2tldF9lb3NfY3JlYXRlKCk7Ci0gICAgQVBSX0JSSUdBREVfSU5TRVJUX1RBSUwoYnNlbmQsIGUpOwotCi0gICAgLyogd2UncmUgZG9uZSB3aXRoIHRoZSBvcmlnaW5hbCBjb250ZW50ICovCi0gICAgYXByX2JyaWdhZGVfZGVzdHJveShiYik7Ci0KLSAgICAvKiBzZW5kIG91ciBtdWx0aXBhcnQgb3V0cHV0ICovCi0gICAgcmV0dXJuIGFwX3Bhc3NfYnJpZ2FkZShmLT5uZXh0LCBic2VuZCk7IAotfSAgICAKLQotQVBfREVDTEFSRSh2b2lkKSBhcF9zZXRfY29udGVudF9sZW5ndGgocmVxdWVzdF9yZWMgKnIsIGFwcl9vZmZfdCBjbGVuZ3RoKQotewotICAgIHItPmNsZW5ndGggPSBjbGVuZ3RoOwotICAgIGFwcl90YWJsZV9zZXRuKHItPmhlYWRlcnNfb3V0LCAiQ29udGVudC1MZW5ndGgiLAotICAgICAgICAgICAgICAgICAgIGFwcl9wc3ByaW50ZihyLT5wb29sLCAiJSIgQVBSX09GRl9UX0ZNVCwgY2xlbmd0aCkpOwotfQotCi0vKgotICogUmV0dXJuIHRoZSBsYXRlc3QgcmF0aW9uYWwgdGltZSBmcm9tIGEgcmVxdWVzdC9tdGltZSAobW9kaWZpY2F0aW9uIHRpbWUpCi0gKiBwYWlyLiAgV2UgcmV0dXJuIHRoZSBtdGltZSB1bmxlc3MgaXQncyBpbiB0aGUgZnV0dXJlLCBpbiB3aGljaCBjYXNlIHdlCi0gKiByZXR1cm4gdGhlIGN1cnJlbnQgdGltZS4gIFdlIHVzZSB0aGUgcmVxdWVzdCB0aW1lIGFzIGEgcmVmZXJlbmNlIGluIG9yZGVyCi0gKiB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvIHRpbWUoKS4gIFdlIGRvbid0IGNoZWNrIGZvciBmdXR1cm9zaXR5Ci0gKiB1bmxlc3MgdGhlIG10aW1lIGlzIGF0IGxlYXN0IGFzIG5ldyBhcyB0aGUgcmVmZXJlbmNlLgotICovCi1BUF9ERUNMQVJFKGFwcl90aW1lX3QpIGFwX3JhdGlvbmFsaXplX210aW1lKHJlcXVlc3RfcmVjICpyLCBhcHJfdGltZV90IG10aW1lKQotewotICAgIGFwcl90aW1lX3Qgbm93OwotCi0gICAgLyogRm9yIGFsbCBzdGF0aWMgcmVzcG9uc2VzLCBpdCdzIGFsbW9zdCBjZXJ0YWluIHRoYXQgdGhlIGZpbGUgd2FzCi0gICAgICogbGFzdCBtb2RpZmllZCBiZWZvcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVxdWVzdC4gIFNvIHRoZXJlJ3MKLSAgICAgKiBubyByZWFzb24gdG8gY2FsbCB0aW1lKE5VTEwpIGFnYWluLiAgQnV0IGlmIHRoZSByZXNwb25zZSBoYXMgYmVlbgotICAgICAqIGNyZWF0ZWQgb24gZGVtYW5kLCB0aGVuIGl0IG1pZ2h0IGJlIG5ld2VyIHRoYW4gdGhlIHRpbWUgdGhlIHJlcXVlc3QKLSAgICAgKiBzdGFydGVkLiAgSW4gdGhpcyBldmVudCB3ZSByZWFsbHkgaGF2ZSB0byBjYWxsIHRpbWUoTlVMTCkgYWdhaW4KLSAgICAgKiBzbyB0aGF0IHdlIGNhbiBnaXZlIHRoZSBjbGllbnRzIHRoZSBtb3N0IGFjY3VyYXRlIExhc3QtTW9kaWZpZWQuICBJZiB3ZQotICAgICAqIHdlcmUgZ2l2ZW4gYSB0aW1lIGluIHRoZSBmdXR1cmUsIHdlIHJldHVybiB0aGUgY3VycmVudCB0aW1lIC0gdGhlCi0gICAgICogTGFzdC1Nb2RpZmllZCBjYW4ndCBiZSBpbiB0aGUgZnV0dXJlLgotICAgICAqLwotICAgIG5vdyA9IChtdGltZSA8IHItPnJlcXVlc3RfdGltZSkgPyByLT5yZXF1ZXN0X3RpbWUgOiBhcHJfdGltZV9ub3coKTsKLSAgICByZXR1cm4gKG10aW1lID4gbm93KSA/IG5vdyA6IG10aW1lOwotfQotCi0vKgotICogQ29uc3RydWN0IGFuIGVudGl0eSB0YWcgKEVUYWcpIGZyb20gcmVzb3VyY2UgaW5mb3JtYXRpb24uICBJZiBpdCdzIGEgcmVhbAotICogZmlsZSwgYnVpbGQgaW4gc29tZSBvZiB0aGUgZmlsZSBjaGFyYWN0ZXJpc3RpY3MuICBJZiB0aGUgbW9kaWZpY2F0aW9uIHRpbWUKLSAqIGlzIG5ld2VyIHRoYW4gKHJlcXVlc3QtdGltZSBtaW51cyAxIHNlY29uZCksIG1hcmsgdGhlIEVUYWcgYXMgd2VhayAtIGl0Ci0gKiBjb3VsZCBiZSBtb2RpZmllZCBhZ2FpbiBpbiBhcyBzaG9ydCBhbiBpbnRlcnZhbC4gIFdlIHJhdGlvbmFsaXplIHRoZQotICogbW9kaWZpY2F0aW9uIHRpbWUgd2UncmUgZ2l2ZW4gdG8ga2VlcCBpdCBmcm9tIGJlaW5nIGluIHRoZSBmdXR1cmUuCi0gKi8KLUFQX0RFQ0xBUkUoY2hhciAqKSBhcF9tYWtlX2V0YWcocmVxdWVzdF9yZWMgKnIsIGludCBmb3JjZV93ZWFrKQotewotICAgIGNoYXIgKmV0YWc7Ci0gICAgY2hhciAqd2VhazsKLQotICAgIC8qCi0gICAgICogTWFrZSBhbiBFVGFnIGhlYWRlciBvdXQgb2YgdmFyaW91cyBwaWVjZXMgb2YgaW5mb3JtYXRpb24uIFdlIHVzZQotICAgICAqIHRoZSBsYXN0LW1vZGlmaWVkIGRhdGUgYW5kLCBpZiB3ZSBoYXZlIGEgcmVhbCBmaWxlLCB0aGUKLSAgICAgKiBsZW5ndGggYW5kIGlub2RlIG51bWJlciAtIG5vdGUgdGhhdCB0aGlzIGRvZXNuJ3QgaGF2ZSB0byBtYXRjaAotICAgICAqIHRoZSBjb250ZW50LWxlbmd0aCAoaS5lLiBpbmNsdWRlcyksIGl0IGp1c3QgaGFzIHRvIGJlIHVuaXF1ZQotICAgICAqIGZvciB0aGUgZmlsZS4KLSAgICAgKgotICAgICAqIElmIHRoZSByZXF1ZXN0IHdhcyBtYWRlIHdpdGhpbiBhIHNlY29uZCBvZiB0aGUgbGFzdC1tb2RpZmllZCBkYXRlLAotICAgICAqIHdlIHNlbmQgYSB3ZWFrIHRhZyBpbnN0ZWFkIG9mIGEgc3Ryb25nIG9uZSwgc2luY2UgaXQgY291bGQKLSAgICAgKiBiZSBtb2RpZmllZCBhZ2FpbiBsYXRlciBpbiB0aGUgc2Vjb25kLCBhbmQgdGhlIHZhbGlkYXRpb24KLSAgICAgKiB3b3VsZCBiZSBpbmNvcnJlY3QuCi0gICAgICovCi0gICAgCi0gICAgd2VhayA9ICgoci0+cmVxdWVzdF90aW1lIC0gci0+bXRpbWUgPiBBUFJfVVNFQ19QRVJfU0VDKQotCSAgICAmJiAhZm9yY2Vfd2VhaykgPyAiIiA6ICJXLyI7Ci0KLSAgICBpZiAoci0+ZmluZm8uZmlsZXR5cGUgIT0gMCkgewotICAgICAgICBldGFnID0gYXByX3BzcHJpbnRmKHItPnBvb2wsCi0JCQkgICAgIiVzXCIlbHgtJWx4LSVseFwiIiwgd2VhaywKLQkJCSAgICAodW5zaWduZWQgbG9uZykgci0+ZmluZm8uaW5vZGUsCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcpIHItPmZpbmZvLnNpemUsCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcpIHItPm10aW1lKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGV0YWcgPSBhcHJfcHNwcmludGYoci0+cG9vbCwgIiVzXCIlbHhcIiIsIHdlYWssCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcpIHItPm10aW1lKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXRhZzsKLX0KLQotQVBfREVDTEFSRSh2b2lkKSBhcF9zZXRfZXRhZyhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjaGFyICpldGFnOwotICAgIGNoYXIgKnZhcmlhbnRfZXRhZywgKnZsdjsKLSAgICBpbnQgdmx2X3dlYWs7Ci0KLSAgICBpZiAoIXItPnZsaXN0X3ZhbGlkYXRvcikgewotICAgICAgICBldGFnID0gYXBfbWFrZV9ldGFnKHIsIDApOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogSWYgd2UgaGF2ZSBhIHZhcmlhbnQgbGlzdCB2YWxpZGF0b3IgKHZsdikgZHVlIHRvIHRoZQotICAgICAgICAgKiByZXNwb25zZSBiZWluZyBuZWdvdGlhdGVkLCB0aGVuIHdlIGNyZWF0ZSBhIHN0cnVjdHVyZWQKLSAgICAgICAgICogZW50aXR5IHRhZyB3aGljaCBtZXJnZXMgdGhlIHZhcmlhbnQgZXRhZyB3aXRoIHRoZSB2YXJpYW50Ci0gICAgICAgICAqIGxpc3QgdmFsaWRhdG9yICh2bHYpLiAgVGhpcyBtZXJnaW5nIG1ha2VzIHJldmFsaWRhdGlvbgotICAgICAgICAgKiBzb21ld2hhdCBzYWZlciwgZW5zdXJlcyB0aGF0IGNhY2hlcyB3aGljaCBjYW4gZGVhbCB3aXRoCi0gICAgICAgICAqIFZhcnkgd2lsbCAoZXZlbnR1YWxseSkgYmUgdXBkYXRlZCBpZiB0aGUgc2V0IG9mIHZhcmlhbnRzIGlzCi0gICAgICAgICAqIGNoYW5nZWQsIGFuZCBpcyBhbHNvIGEgcHJvdG9jb2wgcmVxdWlyZW1lbnQgZm9yIHRyYW5zcGFyZW50Ci0gICAgICAgICAqIGNvbnRlbnQgbmVnb3RpYXRpb24uCi0gICAgICAgICAqLwotCi0gICAgICAgIC8qIGlmIHRoZSB2YXJpYW50IGxpc3QgdmFsaWRhdG9yIGlzIHdlYWssIHdlIG1ha2UgdGhlIHdob2xlCi0gICAgICAgICAqIHN0cnVjdHVyZWQgZXRhZyB3ZWFrLiAgSWYgd2Ugd291bGQgbm90LCB0aGVuIGNsaWVudHMgY291bGQKLSAgICAgICAgICogaGF2ZSBwcm9ibGVtcyBtZXJnaW5nIHJhbmdlIHJlc3BvbnNlcyBpZiB3ZSBoYXZlIGRpZmZlcmVudAotICAgICAgICAgKiB2YXJpYW50cyB3aXRoIHRoZSBzYW1lIG5vbi1nbG9iYWxseS11bmlxdWUgc3Ryb25nIGV0YWcuCi0gICAgICAgICAqLwotCi0gICAgICAgIHZsdiA9IHItPnZsaXN0X3ZhbGlkYXRvcjsKLSAgICAgICAgdmx2X3dlYWsgPSAodmx2WzBdID09ICdXJyk7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgdmFyaWFudF9ldGFnID0gYXBfbWFrZV9ldGFnKHIsIHZsdl93ZWFrKTsKLQotICAgICAgICAvKiBtZXJnZSB2YXJpYW50X2V0YWcgYW5kIHZsdiBpbnRvIGEgc3RydWN0dXJlZCBldGFnICovCi0KLSAgICAgICAgdmFyaWFudF9ldGFnW3N0cmxlbih2YXJpYW50X2V0YWcpIC0gMV0gPSAnXDAnOwotICAgICAgICBpZiAodmx2X3dlYWspCi0gICAgICAgICAgICB2bHYgKz0gMzsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdmx2Kys7Ci0gICAgICAgIGV0YWcgPSBhcHJfcHN0cmNhdChyLT5wb29sLCB2YXJpYW50X2V0YWcsICI7Iiwgdmx2LCBOVUxMKTsKLSAgICB9Ci0KLSAgICBhcHJfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkVUYWciLCBldGFnKTsKLX0KLQotLyogR2V0IGEgbGluZSBvZiBwcm90b2NvbCBpbnB1dCwgaW5jbHVkaW5nIGFueSBjb250aW51YXRpb24gbGluZXMKLSAqIGNhdXNlZCBieSBNSU1FIGZvbGRpbmcgKG9yIGJyb2tlbiBjbGllbnRzKSBpZiBmb2xkICE9IDAsIGFuZCBwbGFjZSBpdAotICogaW4gdGhlIGJ1ZmZlciBzLCBvZiBzaXplIG4gYnl0ZXMsIHdpdGhvdXQgdGhlIGVuZGluZyBuZXdsaW5lLgotICoKLSAqIFJldHVybnMgLTEgb24gZXJyb3IsIG9yIHRoZSBsZW5ndGggb2Ygcy4gIAotICoKLSAqIE5vdGVzOiBCZWNhdXNlIHRoZSBidWZmZXIgdXNlcyAxIGNoYXIgZm9yIE5VTCwgdGhlIG1vc3Qgd2UgY2FuIHJldHVybiBpcyAKLSAqICAgICAgICAobiAtIDEpIGFjdHVhbCBjaGFyYWN0ZXJzLiAgCi0gKgotICogICAgICAgIElmIG5vIExGIGlzIGRldGVjdGVkIG9uIHRoZSBsYXN0IGxpbmUgZHVlIHRvIGEgZHJvcHBlZCBjb25uZWN0aW9uIAotICogICAgICAgIG9yIGEgZnVsbCBidWZmZXIsIHRoYXQncyBjb25zaWRlcmVkIGFuIGVycm9yLgotICovCi1BUF9DT1JFX0RFQ0xBUkUoaW50KSBhcF9nZXRsaW5lKGNoYXIgKnMsIGludCBuLCByZXF1ZXN0X3JlYyAqciwgaW50IGZvbGQpCi17Ci0gICAgY2hhciAqcG9zID0gczsKLSAgICBjaGFyICpsYXN0X2NoYXI7Ci0gICAgY2hhciAqYmV5b25kX2J1ZmYgPSBzICsgbjsKLSAgICBjb25zdCBjaGFyICp0ZW1wOwotICAgIGludCByZXR2YWw7Ci0gICAgaW50IHRvdGFsID0gMDsKLSAgICBpbnQgbG9va2luZ19haGVhZCA9IDA7Ci0gICAgYXByX3NpemVfdCBsZW5ndGg7Ci0gICAgY29ubl9yZWMgKmMgPSByLT5jb25uZWN0aW9uOwotICAgIGNvcmVfcmVxdWVzdF9jb25maWcgKnJlcV9jZmc7Ci0gICAgYXByX2J1Y2tldF9icmlnYWRlICpiOwotICAgIGFwcl9idWNrZXQgKmU7Ci0KLSAgICByZXFfY2ZnID0gKGNvcmVfcmVxdWVzdF9jb25maWcgKikKLSAgICAgICAgICAgICAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5yZXF1ZXN0X2NvbmZpZywgJmNvcmVfbW9kdWxlKTsKLSAgICBiID0gcmVxX2NmZy0+YmI7Ci0gICAgLyogbWFrZSBzdXJlIGl0J3MgZW1wdHkgdW5sZXNzIHdlJ3JlIGZvbGRpbmcgKi8gCi0gICAgQVBfREVCVUdfQVNTRVJUKGZvbGQgfHwgQVBSX0JSSUdBREVfRU1QVFkoYikpOwotCi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKEFQUl9CUklHQURFX0VNUFRZKGIpKSB7Ci0gICAgICAgICAgICBpZiAoYXBfZ2V0X2JyaWdhZGUoYy0+aW5wdXRfZmlsdGVycywgYiwgQVBfTU9ERV9CTE9DS0lORykgIT0gQVBSX1NVQ0NFU1MgfHwKLSAgICAgICAgICAgICAgICBBUFJfQlJJR0FERV9FTVBUWShiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlID0gQVBSX0JSSUdBREVfRklSU1QoYik7IAotICAgICAgICBpZiAoZS0+bGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIGFwcl9idWNrZXRfZGVsZXRlKGUpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dmFsID0gYXByX2J1Y2tldF9yZWFkKGUsICZ0ZW1wLCAmbGVuZ3RoLCBBUFJfQkxPQ0tfUkVBRCk7Ci0KLSAgICAgICAgaWYgKHJldHZhbCAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICAgICAgdG90YWwgPSAoKGxlbmd0aCA8IDApICYmICh0b3RhbCA9PSAwKSkgPyAtMSA6IHRvdGFsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKGxvb2tpbmdfYWhlYWQpICYmICgqdGVtcCAhPSBBUFJfQVNDSUlfQkxBTkspICYmICgqdGVtcCAhPSBBUFJfQVNDSUlfVEFCKSkgeyAKLSAgICAgICAgICAgIC8qIGNhbid0IGZvbGQgYmVjYXVzZSBuZXh0IGxpbmUgaXNuJ3QgaW5kZW50ZWQsIAotICAgICAgICAgICAgICogc28gcmV0dXJuIHdoYXQgd2UgaGF2ZS4gIGxvb2thaGVhZCBicmlnYWRlIGlzIAotICAgICAgICAgICAgICogc3Rhc2hlZCBvbiByZXFfY2ZnLT5iYgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBBUF9ERUJVR19BU1NFUlQoIUFQUl9CUklHQURFX0VNUFRZKHJlcV9jZmctPmJiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBsYXN0X2NoYXIgPSBwb3MgKyBsZW5ndGggLSAxOwotICAgICAgICBpZiAobGFzdF9jaGFyIDwgYmV5b25kX2J1ZmYpIHsKLSAgICAgICAgICAgIG1lbWNweShwb3MsIHRlbXAsIGxlbmd0aCk7Ci0gICAgICAgICAgICBhcHJfYnVja2V0X2RlbGV0ZShlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIGlucHV0IGxpbmUgd2FzIGxhcmdlciB0aGFuIHRoZSBjYWxsZXIncyBidWZmZXIgKi8KLSAgICAgICAgICAgIGFwcl9icmlnYWRlX2Rlc3Ryb3koYik7IAotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHJlcV9jZmctPmJiIGJlaW5nIGJvZ3VzLgotICAgICAgICAgICAgICogdGhlIHJlcXVlc3QgaXMgYWJvdXQgdG8gZGllLCBhbmQgRXJyb3JEb2N1bWVudAotICAgICAgICAgICAgICogcmVkaXJlY3RzIGdldCBhIG5ldyByZXFfY2ZnLT5iYgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcG9zID0gbGFzdF9jaGFyOyAgICAgICAgLyogUG9pbnQgYXQgdGhlIGxhc3QgY2hhcmFjdGVyICAgICAgICAgICAqLwotCi0gICAgICAgIGlmICgqcG9zID09IEFQUl9BU0NJSV9MRikgeyAvKiBEaWQgd2UgZ2V0IGEgZnVsbCBsaW5lIG9mIGlucHV0PyAgICAgICovCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocG9zID4gcyAmJiAqKHBvcyAtIDEpID09IEFQUl9BU0NJSV9DUikgewotICAgICAgICAgICAgICAgIC0tcG9zOyAgICAgICAgICAvKiB6YXAgb3B0aW9uYWwgQ1IgYmVmb3JlIExGICAgICAgICAgICAgICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVHJpbSBhbnkgZXh0cmEgdHJhaWxpbmcgc3BhY2VzIG9yIHRhYnMgZXhjZXB0IGZvciB0aGUgZmlyc3QKLSAgICAgICAgICAgICAqIHNwYWNlIG9yIHRhYiBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgYmxhbmsgc3RyaW5nLiAgVGhpcyBtYWtlcwotICAgICAgICAgICAgICogaXQgbXVjaCBlYXNpZXIgdG8gY2hlY2sgZmllbGQgdmFsdWVzIGZvciBleGFjdCBtYXRjaGVzLCBhbmQKLSAgICAgICAgICAgICAqIHNhdmVzIG1lbW9yeSBhcyB3ZWxsLiAgVGVybWluYXRlIHN0cmluZyBhdCBlbmQgb2YgbGluZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgd2hpbGUgKHBvcyA+IChzICsgMSkgJiYgCi0gICAgICAgICAgICAgICAgICAgKCoocG9zIC0gMSkgPT0gQVBSX0FTQ0lJX0JMQU5LIHx8ICoocG9zIC0gMSkgPT0gQVBSX0FTQ0lJX1RBQikpIHsKLSAgICAgICAgICAgICAgICAtLXBvczsgICAgICAgICAgLyogdHJpbSBleHRyYSB0cmFpbGluZyBzcGFjZXMgb3IgdGFicyAgICAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKnBvcyA9ICdcMCc7ICAgICAgICAvKiB6YXAgZW5kIG9mIHN0cmluZyAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICB0b3RhbCA9IHBvcyAtIHM7ICAgIC8qIHVwZGF0ZSB0b3RhbCBzdHJpbmcgbGVuZ3RoICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgLyogbG9vayBhaGVhZCBhbm90aGVyIGxpbmUgaWYgbGluZSBmb2xkaW5nIGlzIGRlc2lyZWQgCi0gICAgICAgICAgICAgKiBhbmQgdGhpcyBsaW5lIGlzbid0IGVtcHR5Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChmb2xkICYmIHRvdGFsKSB7Ci0gICAgICAgICAgICAgICAgbG9va2luZ19haGVhZCA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBBUF9ERUJVR19BU1NFUlQoQVBSX0JSSUdBREVfRU1QVFkocmVxX2NmZy0+YmIpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIG5vIExGIHlldC4uLmNoYXJhY3RlciBtb2RlIGNsaWVudCAodGVsbmV0KS4uLmtlZXAgZ29pbmcKLSAgICAgICAgICAgICAqIGJ1bXAgcGFzdCBsYXN0IGNoYXJhY3RlciByZWFkLCAgIAotICAgICAgICAgICAgICogYW5kIHNldCB0b3RhbCBpbiBjYXNlIHdlIGJhaWwgYmVmb3JlIGZpbmRpbmcgYSBMRiAgIAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICB0b3RhbCA9ICsrcG9zIC0gczsgICAgCi0gICAgICAgICAgICBsb29raW5nX2FoZWFkID0gMDsgIC8qIG9ubHkgYXBwcm9wcmlhdGUgcmlnaHQgYWZ0ZXIgTEYgICAgICAgKi8gCi0gICAgICAgIH0KLSAgICB9Ci0gICAgYXBfeGxhdGVfcHJvdG9fZnJvbV9hc2NpaShzLCB0b3RhbCk7Ci0gICAgcmV0dXJuIHRvdGFsOwotfQotCi0vKiBwYXJzZV91cmk6IGJyZWFrIGFwYXJ0IHRoZSB1cmkKLSAqIFNpZGUgRWZmZWN0czoKLSAqIC0gc2V0cyByLT5hcmdzIHRvIHJlc3QgYWZ0ZXIgJz8nIChvciBOVUxMIGlmIG5vICc/JykKLSAqIC0gc2V0cyByLT51cmkgdG8gcmVxdWVzdCB1cmkgKHdpdGhvdXQgci0+YXJncyBwYXJ0KQotICogLSBzZXRzIHItPmhvc3RuYW1lIChpZiBub3Qgc2V0IGFscmVhZHkpIGZyb20gcmVxdWVzdCAoc2NoZW1lOi8vaG9zdDpwb3J0KQotICovCi1BUF9DT1JFX0RFQ0xBUkUodm9pZCkgYXBfcGFyc2VfdXJpKHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICp1cmkpCi17Ci0gICAgaW50IHN0YXR1cyA9IEhUVFBfT0s7Ci0KLSAgICByLT51bnBhcnNlZF91cmkgPSBhcHJfcHN0cmR1cChyLT5wb29sLCB1cmkpOwotCi0gICAgaWYgKHItPm1ldGhvZF9udW1iZXIgPT0gTV9DT05ORUNUKSB7Ci0Jc3RhdHVzID0gYXBfcGFyc2VfaG9zdGluZm9fY29tcG9uZW50cyhyLT5wb29sLCB1cmksICZyLT5wYXJzZWRfdXJpKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JLyogU2ltcGxlIHN5bnRheCBFcnJvcnMgaW4gVVJMcyBhcmUgdHJhcHBlZCBieSBwYXJzZV91cmlfY29tcG9uZW50cygpLiAqLwotCXN0YXR1cyA9IGFwX3BhcnNlX3VyaV9jb21wb25lbnRzKHItPnBvb2wsIHVyaSwgJnItPnBhcnNlZF91cmkpOwotICAgIH0KLQotICAgIGlmIChhcF9pc19IVFRQX1NVQ0NFU1Moc3RhdHVzKSkgewotCS8qIGlmIGl0IGhhcyBhIHNjaGVtZSB3ZSBtYXkgbmVlZCB0byBkbyBhYnNvbHV0ZVVSSSB2aG9zdCBzdHVmZiAqLwotCWlmIChyLT5wYXJzZWRfdXJpLnNjaGVtZQotCSAgICAmJiAhc3RyY2FzZWNtcChyLT5wYXJzZWRfdXJpLnNjaGVtZSwgYXBfaHR0cF9tZXRob2QocikpKSB7Ci0JICAgIHItPmhvc3RuYW1lID0gci0+cGFyc2VkX3VyaS5ob3N0bmFtZTsKLQl9Ci0JZWxzZSBpZiAoci0+bWV0aG9kX251bWJlciA9PSBNX0NPTk5FQ1QpIHsKLQkgICAgci0+aG9zdG5hbWUgPSByLT5wYXJzZWRfdXJpLmhvc3RuYW1lOwotCX0KLQlyLT5hcmdzID0gci0+cGFyc2VkX3VyaS5xdWVyeTsKLQlyLT51cmkgPSByLT5wYXJzZWRfdXJpLnBhdGggPyByLT5wYXJzZWRfdXJpLnBhdGgKLQkJCQkgICAgOiBhcHJfcHN0cmR1cChyLT5wb29sLCAiLyIpOwotI2lmIGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTjMyKQotCS8qIEhhbmRsZSBwYXRoIHRyYW5zbGF0aW9ucyBmb3IgT1MvMiBhbmQgcGx1ZyBzZWN1cml0eSBob2xlLgotCSAqIFRoaXMgd2lsbCBwcmV2ZW50ICJodHRwOi8vd3d3LndoZXJldmVyLmNvbS8uLlwuLlwvIiBmcm9tCi0JICogcmV0dXJuaW5nIGEgZGlyZWN0b3J5IGZvciB0aGUgcm9vdCBkcml2ZS4KLQkgKi8KLQl7Ci0JICAgIGNoYXIgKng7Ci0KLQkgICAgZm9yICh4ID0gci0+dXJpOyAoeCA9IHN0cmNocih4LCAnXFwnKSkgIT0gTlVMTDsgKQotCQkqeCA9ICcvJzsKLQl9Ci0jZW5kaWYgIC8qIE9TMiB8fCBXSU4zMiAqLwotICAgIH0KLSAgICBlbHNlIHsKLQlyLT5hcmdzID0gTlVMTDsKLQlyLT5ob3N0bmFtZSA9IE5VTEw7Ci0Jci0+c3RhdHVzID0gc3RhdHVzOyAgICAgICAgICAgICAvKiBzZXQgZXJyb3Igc3RhdHVzICovCi0Jci0+dXJpID0gYXByX3BzdHJkdXAoci0+cG9vbCwgdXJpKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgcmVhZF9yZXF1ZXN0X2xpbmUocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY2hhciBsW0RFRkFVTFRfTElNSVRfUkVRVUVTVF9MSU5FICsgMl07IC8qIGdldGxpbmUncyB0d28gZXh0cmEgZm9yIFxuXDAgKi8KLSAgICBjb25zdCBjaGFyICpsbCA9IGw7Ci0gICAgY29uc3QgY2hhciAqdXJpOwotI2lmIDAKLSAgICBjb25uX3JlYyAqY29ubiA9IHItPmNvbm5lY3Rpb247Ci0jZW5kaWYKLSAgICBpbnQgbWFqb3IgPSAxLCBtaW5vciA9IDA7ICAgLyogQXNzdW1lIEhUVFAvMS4wIGlmIG5vbi0iSFRUUCIgcHJvdG9jb2wgKi8KLSAgICBpbnQgbGVuOwotCi0gICAgLyogUmVhZCBwYXN0IGVtcHR5IGxpbmVzIHVudGlsIHdlIGdldCBhIHJlYWwgcmVxdWVzdCBsaW5lLAotICAgICAqIGEgcmVhZCBlcnJvciwgdGhlIGNvbm5lY3Rpb24gY2xvc2VzIChFT0YpLCBvciB3ZSB0aW1lb3V0LgotICAgICAqCi0gICAgICogV2Ugc2tpcCBlbXB0eSBsaW5lcyBiZWNhdXNlIGJyb3dzZXJzIGhhdmUgdG8gdGFjayBhIENSTEYgb24gdG8gdGhlIGVuZAotICAgICAqIG9mIFBPU1RzIHRvIHN1cHBvcnQgb2xkIENFUk4gd2Vic2VydmVycy4gIEJ1dCBub3RlIHRoYXQgd2UgbWF5IG5vdAotICAgICAqIGhhdmUgZmx1c2hlZCBhbnkgcHJldmlvdXMgcmVzcG9uc2UgY29tcGxldGVseSB0byB0aGUgY2xpZW50IHlldC4KLSAgICAgKiBXZSBkZWxheSB0aGUgZmx1c2ggYXMgbG9uZyBhcyBwb3NzaWJsZSBzbyB0aGF0IHdlIGNhbiBpbXByb3ZlCi0gICAgICogcGVyZm9ybWFuY2UgZm9yIGNsaWVudHMgdGhhdCBhcmUgcGlwZWxpbmluZyByZXF1ZXN0cy4gIElmIGEgcmVxdWVzdAotICAgICAqIGlzIHBpcGVsaW5lZCB0aGVuIHdlIHdvbid0IGJsb2NrIGR1cmluZyB0aGUgKGltcGxpY2l0KSByZWFkKCkgYmVsb3cuCi0gICAgICogSWYgdGhlIHJlcXVlc3RzIGFyZW4ndCBwaXBlbGluZWQsIHRoZW4gdGhlIGNsaWVudCBpcyBzdGlsbCB3YWl0aW5nCi0gICAgICogZm9yIHRoZSBmaW5hbCBidWZmZXIgZmx1c2ggZnJvbSB1cywgYW5kIHdlIHdpbGwgYmxvY2sgaW4gdGhlIGltcGxpY2l0Ci0gICAgICogcmVhZCgpLiAgQl9TQUZFUkVBRCBlbnN1cmVzIHRoYXQgdGhlIEJVRkYgbGF5ZXIgZmx1c2hlcyBpZiBpdCB3aWxsCi0gICAgICogaGF2ZSB0byBibG9jayBkdXJpbmcgYSByZWFkLgotICAgICAqLwotCi0gICAgd2hpbGUgKChsZW4gPSBhcF9nZXRsaW5lKGwsIHNpemVvZihsKSwgciwgMCkpIDw9IDApIHsKLSAgICAgICAgaWYgKGxlbiA8IDApIHsgICAgICAgICAgICAgLyogaW5jbHVkZXMgRU9GICovCi0JICAgIC8qIHRoaXMgaXMgYSBoYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHJlcXVlc3QgdGltZSBpcyBzZXQsCi0JICAgICAqIGl0J3Mgbm90IHBlcmZlY3QsIGJ1dCBpdCdzIGJldHRlciB0aGFuIG5vdGhpbmcgCi0JICAgICAqLwotCSAgICByLT5yZXF1ZXN0X3RpbWUgPSBhcHJfdGltZV9ub3coKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIHdlJ3ZlIHByb2JhYmx5IGdvdCBzb21ldGhpbmcgdG8gZG8sIGlnbm9yZSBncmFjZWZ1bCByZXN0YXJ0IHJlcXVlc3RzICovCi0KLSAgICAvKiBYWFggLSBzaWd3YWl0IGRvZXNuJ3Qgd29yayBpZiB0aGUgc2lnbmFsIGhhcyBiZWVuIFNJR19JR05lZCAodW5kZXIKLSAgICAgKiBsaW51eCAyLjAgdy8gZ2xpYmMgMi4wLCBhbnl3YXkpLCBhbmQgdGhpcyBzdGVwIGlzbid0IG5lY2Vzc2FyeSB3aGVuCi0gICAgICogd2UncmUgcnVubmluZyBhIHNpZ3dhaXQgdGhyZWFkIGFueXdheS4gSWYvd2hlbiB1bnRocmVhZGVkIG1vZGUgaXMKLSAgICAgKiBwdXQgYmFjayBpbiwgd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0byBpZ25vcmUgdGhpcyBzaWduYWwgaWZmIGEgc2lnd2FpdAotICAgICAqIHRocmVhZCBpc24ndCB1c2VkLiAtIG12c2sKLQotI2lmZGVmIFNJR1dJTkNICi0gICAgYXByX3NpZ25hbChTSUdXSU5DSCwgU0lHX0lHTik7Ci0jZW5kaWYKLSAgICAqLwotCi0gICAgci0+cmVxdWVzdF90aW1lID0gYXByX3RpbWVfbm93KCk7Ci0gICAgci0+dGhlX3JlcXVlc3QgPSBhcHJfcHN0cmR1cChyLT5wb29sLCBsKTsKLSAgICByLT5tZXRob2QgPSBhcF9nZXR3b3JkX3doaXRlKHItPnBvb2wsICZsbCk7Ci0KLSNpZiAwCi0vKiBYWFggSWYgd2Ugd2FudCB0byBrZWVwIHRyYWNrIG9mIHRoZSBNZXRob2QsIHRoZSBwcm90b2NvbCBtb2R1bGUgc2hvdWxkIGRvCi0gKiBpdC4gIFRoYXQgc3VwcG9ydCBpc24ndCBpbiB0aGUgc2NvcmVib2FyZCB5ZXQuICBIb3BlZnVsbHkgbmV4dCB3ZWVrIAotICogc29tZXRpbWUuICAgcmJiICovCi0gICAgYXBfdXBkYXRlX2Nvbm5lY3Rpb25fc3RhdHVzKEFQX0NISUxEX1RIUkVBRF9GUk9NX0lEKGNvbm4tPmlkKSwgIk1ldGhvZCIsIHItPm1ldGhvZCk7IAotI2VuZGlmCi0gICAgdXJpID0gYXBfZ2V0d29yZF93aGl0ZShyLT5wb29sLCAmbGwpOwotCi0gICAgLyogUHJvdmlkZSBxdWljayBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVxdWVzdCBtZXRob2QgYXMgc29vbiBhcyBrbm93biAqLwotCi0gICAgci0+bWV0aG9kX251bWJlciA9IGFwX21ldGhvZF9udW1iZXJfb2Yoci0+bWV0aG9kKTsKLSAgICBpZiAoci0+bWV0aG9kX251bWJlciA9PSBNX0dFVCAmJiByLT5tZXRob2RbMF0gPT0gJ0gnKSB7Ci0gICAgICAgIHItPmhlYWRlcl9vbmx5ID0gMTsKLSAgICB9Ci0KLSAgICBhcF9wYXJzZV91cmkociwgdXJpKTsKLQotICAgIC8qIGFwX2dldGxpbmUgcmV0dXJucyAoc2l6ZSBvZiBtYXggYnVmZmVyIC0gMSkgaWYgaXQgZmlsbHMgdXAgdGhlCi0gICAgICogYnVmZmVyIGJlZm9yZSBmaW5kaW5nIHRoZSBlbmQtb2YtbGluZS4gIFRoaXMgaXMgb25seSBnb2luZyB0bwotICAgICAqIGhhcHBlbiBpZiBpdCBleGNlZWRzIHRoZSBjb25maWd1cmVkIGxpbWl0IGZvciBhIHJlcXVlc3QtbGluZS4KLSAgICAgKi8KLSAgICBpZiAobGVuID4gci0+c2VydmVyLT5saW1pdF9yZXFfbGluZSkgewotICAgICAgICByLT5zdGF0dXMgICAgPSBIVFRQX1JFUVVFU1RfVVJJX1RPT19MQVJHRTsKLSAgICAgICAgci0+cHJvdG9fbnVtID0gSFRUUF9WRVJTSU9OKDEsMCk7Ci0gICAgICAgIHItPnByb3RvY29sICA9IGFwcl9wc3RyZHVwKHItPnBvb2wsICJIVFRQLzEuMCIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByLT5hc3NiYWNrd2FyZHMgPSAobGxbMF0gPT0gJ1wwJyk7Ci0gICAgci0+cHJvdG9jb2wgPSBhcHJfcHN0cmR1cChyLT5wb29sLCBsbFswXSA/IGxsIDogIkhUVFAvMC45Iik7Ci0vKiBYWFggSWYgd2Ugd2FudCB0byBrZWVwIHRyYWNrIG9mIHRoZSBNZXRob2QsIHRoZSBwcm90b2NvbCBtb2R1bGUgc2hvdWxkIGRvCi0gKiBpdC4gIFRoYXQgc3VwcG9ydCBpc24ndCBpbiB0aGUgc2NvcmVib2FyZCB5ZXQuICBIb3BlZnVsbHkgbmV4dCB3ZWVrIAotICogc29tZXRpbWUuICAgcmJiCi0gICAgYXBfdXBkYXRlX2Nvbm5lY3Rpb25fc3RhdHVzKGNvbm4tPmlkLCAiUHJvdG9jb2wiLCByLT5wcm90b2NvbCk7IAotICovCi0KLSAgICBpZiAoMiA9PSBzc2NhbmYoci0+cHJvdG9jb2wsICJIVFRQLyV1LiV1IiwgJm1ham9yLCAmbWlub3IpCi0gICAgICAmJiBtaW5vciA8IEhUVFBfVkVSU0lPTigxLDApKQkvKiBkb24ndCBhbGxvdyBIVFRQLzAuMTAwMCAqLwotCXItPnByb3RvX251bSA9IEhUVFBfVkVSU0lPTihtYWpvciwgbWlub3IpOwotICAgIGVsc2UKLQlyLT5wcm90b19udW0gPSBIVFRQX1ZFUlNJT04oMSwwKTsKLQotICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBnZXRfbWltZV9oZWFkZXJzKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNoYXIgZmllbGRbREVGQVVMVF9MSU1JVF9SRVFVRVNUX0ZJRUxEU0laRSArIDJdOyAvKiBnZXRsaW5lJ3MgdHdvIGV4dHJhICovCi0gICAgY2hhciAqdmFsdWU7Ci0gICAgY2hhciAqY29weTsKLSAgICBpbnQgbGVuOwotICAgIGludCBmaWVsZHNfcmVhZCA9IDA7Ci0gICAgYXByX3RhYmxlX3QgKnRtcF9oZWFkZXJzOwotCi0gICAgLyogV2UnbGwgdXNlIGFwcl90YWJsZV9vdmVybGFwIGxhdGVyIHRvIG1lcmdlIHRoZXNlIGludG8gci0+aGVhZGVyc19pbi4gKi8KLSAgICB0bXBfaGVhZGVycyA9IGFwcl90YWJsZV9tYWtlKHItPnBvb2wsIDUwKTsKLQotICAgIC8qCi0gICAgICogUmVhZCBoZWFkZXIgbGluZXMgdW50aWwgd2UgZ2V0IHRoZSBlbXB0eSBzZXBhcmF0b3IgbGluZSwgYSByZWFkIGVycm9yLAotICAgICAqIHRoZSBjb25uZWN0aW9uIGNsb3NlcyAoRU9GKSwgcmVhY2ggdGhlIHNlcnZlciBsaW1pdCwgb3Igd2UgdGltZW91dC4KLSAgICAgKi8KLSAgICB3aGlsZSAoKGxlbiA9IGFwX2dldGxpbmUoZmllbGQsIHNpemVvZihmaWVsZCksIHIsIDEpKSA+IDApIHsKLQotICAgICAgICBpZiAoci0+c2VydmVyLT5saW1pdF9yZXFfZmllbGRzICYmCi0gICAgICAgICAgICAoKytmaWVsZHNfcmVhZCA+IHItPnNlcnZlci0+bGltaXRfcmVxX2ZpZWxkcykpIHsKLSAgICAgICAgICAgIHItPnN0YXR1cyA9IEhUVFBfQkFEX1JFUVVFU1Q7Ci0gICAgICAgICAgICBhcHJfdGFibGVfc2V0bihyLT5ub3RlcywgImVycm9yLW5vdGVzIiwKLQkJCSAgICJUaGUgbnVtYmVyIG9mIHJlcXVlc3QgaGVhZGVyIGZpZWxkcyBleGNlZWRzICIKLQkJCSAgICJ0aGlzIHNlcnZlcidzIGxpbWl0LjxQPlxuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLyogYXBfZ2V0bGluZSByZXR1cm5zIChzaXplIG9mIG1heCBidWZmZXIgLSAxKSBpZiBpdCBmaWxscyB1cCB0aGUKLSAgICAgICAgICogYnVmZmVyIGJlZm9yZSBmaW5kaW5nIHRoZSBlbmQtb2YtbGluZS4gIFRoaXMgaXMgb25seSBnb2luZyB0bwotICAgICAgICAgKiBoYXBwZW4gaWYgaXQgZXhjZWVkcyB0aGUgY29uZmlndXJlZCBsaW1pdCBmb3IgYSBmaWVsZCBzaXplLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGxlbiA+IHItPnNlcnZlci0+bGltaXRfcmVxX2ZpZWxkc2l6ZSkgewotICAgICAgICAgICAgci0+c3RhdHVzID0gSFRUUF9CQURfUkVRVUVTVDsKLSAgICAgICAgICAgIGFwcl90YWJsZV9zZXRuKHItPm5vdGVzLCAiZXJyb3Itbm90ZXMiLAotCQkJICAgYXByX3BzdHJjYXQoci0+cG9vbCwKLQkJCQkgICAgICAgIlNpemUgb2YgYSByZXF1ZXN0IGhlYWRlciBmaWVsZCAiCi0JCQkJICAgICAgICJleGNlZWRzIHNlcnZlciBsaW1pdC48UD5cbiIKLQkJCQkgICAgICAgIjxQUkU+XG4iLAotCQkJCSAgICAgICBhcF9lc2NhcGVfaHRtbChyLT5wb29sLCBmaWVsZCksCi0JCQkJICAgICAgICI8L1BSRT5cbiIsIE5VTEwpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb3B5ID0gYXByX3BhbGxvYyhyLT5wb29sLCBsZW4gKyAxKTsKLSAgICAgICAgbWVtY3B5KGNvcHksIGZpZWxkLCBsZW4gKyAxKTsKLQotICAgICAgICBpZiAoISh2YWx1ZSA9IHN0cmNocihjb3B5LCAnOicpKSkgeyAgICAgLyogRmluZCB0aGUgY29sb24gc2VwYXJhdG9yICovCi0gICAgICAgICAgICByLT5zdGF0dXMgPSBIVFRQX0JBRF9SRVFVRVNUOyAgICAgICAvKiBvciBhYm9ydCB0aGUgYmFkIHJlcXVlc3QgKi8KLSAgICAgICAgICAgIGFwcl90YWJsZV9zZXRuKHItPm5vdGVzLCAiZXJyb3Itbm90ZXMiLAotCQkJICAgYXByX3BzdHJjYXQoci0+cG9vbCwKLQkJCQkgICAgICAgIlJlcXVlc3QgaGVhZGVyIGZpZWxkIGlzIG1pc3NpbmcgIgotCQkJCSAgICAgICAiY29sb24gc2VwYXJhdG9yLjxQPlxuIgotCQkJCSAgICAgICAiPFBSRT5cbiIsCi0JCQkJICAgICAgIGFwX2VzY2FwZV9odG1sKHItPnBvb2wsIGNvcHkpLAotCQkJCSAgICAgICAiPC9QUkU+XG4iLCBOVUxMKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAqdmFsdWUgPSAnXDAnOwotICAgICAgICArK3ZhbHVlOwotICAgICAgICB3aGlsZSAoKnZhbHVlID09ICcgJyB8fCAqdmFsdWUgPT0gJ1x0JykgewotICAgICAgICAgICAgKyt2YWx1ZTsgICAgICAgICAgICAvKiBTa2lwIHRvIHN0YXJ0IG9mIHZhbHVlICAgKi8KLQl9Ci0KLQlhcHJfdGFibGVfYWRkbih0bXBfaGVhZGVycywgY29weSwgdmFsdWUpOwotICAgIH0KLQotICAgIGFwcl90YWJsZV9vdmVybGFwKHItPmhlYWRlcnNfaW4sIHRtcF9oZWFkZXJzLCBBUFJfT1ZFUkxBUF9UQUJMRVNfTUVSR0UpOwotfQotCi1yZXF1ZXN0X3JlYyAqYXBfcmVhZF9yZXF1ZXN0KGNvbm5fcmVjICpjb25uKQotewotICAgIHJlcXVlc3RfcmVjICpyOwotICAgIGFwcl9wb29sX3QgKnA7Ci0gICAgY29uc3QgY2hhciAqZXhwZWN0OwotICAgIGludCBhY2Nlc3Nfc3RhdHVzOwotICAgIGNvcmVfcmVxdWVzdF9jb25maWcgKnJlcV9jZmc7Ci0KLSAgICBhcHJfcG9vbF9jcmVhdGUoJnAsIGNvbm4tPnBvb2wpOwotICAgIHIgPSBhcHJfcGNhbGxvYyhwLCBzaXplb2YocmVxdWVzdF9yZWMpKTsKLSAgICByLT5wb29sICAgICAgICAgICAgPSBwOwotICAgIHItPmNvbm5lY3Rpb24gICAgICA9IGNvbm47Ci0gICAgci0+c2VydmVyICAgICAgICAgID0gY29ubi0+YmFzZV9zZXJ2ZXI7Ci0KLSAgICBjb25uLT5rZXB0YWxpdmUgICAgPSBjb25uLT5rZWVwYWxpdmUgPT0gMTsKLSAgICBjb25uLT5rZWVwYWxpdmUgICAgPSAwOwotCi0gICAgci0+dXNlciAgICAgICAgICAgID0gTlVMTDsKLSAgICByLT5hcF9hdXRoX3R5cGUgICAgPSBOVUxMOwotCi0gICAgci0+YWxsb3dlZF9tZXRob2RzID0gYXBfbWFrZV9tZXRob2RfbGlzdChwLCAyKTsKLQotICAgIHItPmhlYWRlcnNfaW4gICAgICA9IGFwcl90YWJsZV9tYWtlKHItPnBvb2wsIDUwKTsKLSAgICByLT5zdWJwcm9jZXNzX2VudiAgPSBhcHJfdGFibGVfbWFrZShyLT5wb29sLCA1MCk7Ci0gICAgci0+aGVhZGVyc19vdXQgICAgID0gYXByX3RhYmxlX21ha2Uoci0+cG9vbCwgMTIpOwotICAgIHItPmVycl9oZWFkZXJzX291dCA9IGFwcl90YWJsZV9tYWtlKHItPnBvb2wsIDUpOwotICAgIHItPm5vdGVzICAgICAgICAgICA9IGFwcl90YWJsZV9tYWtlKHItPnBvb2wsIDUpOwotCi0gICAgci0+cmVxdWVzdF9jb25maWcgID0gYXBfY3JlYXRlX3JlcXVlc3RfY29uZmlnKHItPnBvb2wpOwotICAgIHJlcV9jZmcgPSBhcHJfcGNhbGxvYyhyLT5wb29sLCBzaXplb2YoY29yZV9yZXF1ZXN0X2NvbmZpZykpOwotICAgIHJlcV9jZmctPmJiID0gYXByX2JyaWdhZGVfY3JlYXRlKHItPnBvb2wpOwotICAgIGFwX3NldF9tb2R1bGVfY29uZmlnKHItPnJlcXVlc3RfY29uZmlnLCAmY29yZV9tb2R1bGUsIHJlcV9jZmcpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICByLT5wZXJfZGlyX2NvbmZpZyAgPSByLT5zZXJ2ZXItPmxvb2t1cF9kZWZhdWx0czsKLQotICAgIHItPnNlbnRfYm9keWN0ICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8qIGJ5dGVjdCBpc24ndCBmb3IgYm9keSAqLwotCi0gICAgci0+cmVhZF9sZW5ndGggICAgID0gMDsKLSAgICByLT5yZWFkX2JvZHkgICAgICAgPSBSRVFVRVNUX05PX0JPRFk7Ci0KLSAgICByLT5zdGF0dXMgICAgICAgICAgPSBIVFRQX1JFUVVFU1RfVElNRV9PVVQ7ICAvKiBVbnRpbCB3ZSBnZXQgYSByZXF1ZXN0ICovCi0gICAgci0+dGhlX3JlcXVlc3QgICAgID0gTlVMTDsKLSAgICByLT5vdXRwdXRfZmlsdGVycyAgPSBjb25uLT5vdXRwdXRfZmlsdGVyczsKLSAgICByLT5pbnB1dF9maWx0ZXJzICAgPSBjb25uLT5pbnB1dF9maWx0ZXJzOwotCi0gICAgYXByX3NldHNvY2tldG9wdChjb25uLT5jbGllbnRfc29ja2V0LCBBUFJfU09fVElNRU9VVCwgCi0gICAgICAgICAgICAgICAgICAgICAoaW50KShjb25uLT5rZXB0YWxpdmUKLSAgICAgICAgICAgICAgICAgICAgID8gci0+c2VydmVyLT5rZWVwX2FsaXZlX3RpbWVvdXQgKiBBUFJfVVNFQ19QRVJfU0VDCi0gICAgICAgICAgICAgICAgICAgICA6IHItPnNlcnZlci0+dGltZW91dCAqIEFQUl9VU0VDX1BFUl9TRUMpKTsKLSAgICAgICAgICAgICAgICAgICAgIAotICAgIGFwX2FkZF9vdXRwdXRfZmlsdGVyKCJCWVRFUkFOR0UiLCBOVUxMLCByLCByLT5jb25uZWN0aW9uKTsKLSAgICBhcF9hZGRfb3V0cHV0X2ZpbHRlcigiQ09OVEVOVF9MRU5HVEgiLCBOVUxMLCByLCByLT5jb25uZWN0aW9uKTsKLSAgICBhcF9hZGRfb3V0cHV0X2ZpbHRlcigiSFRUUF9IRUFERVIiLCBOVUxMLCByLCByLT5jb25uZWN0aW9uKTsKLQotICAgIC8qIEdldCB0aGUgcmVxdWVzdC4uLiAqLwotICAgIGlmICghcmVhZF9yZXF1ZXN0X2xpbmUocikpIHsKLSAgICAgICAgaWYgKHItPnN0YXR1cyA9PSBIVFRQX1JFUVVFU1RfVVJJX1RPT19MQVJHRSkgewotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLQkJCSAgInJlcXVlc3QgZmFpbGVkOiBVUkkgdG9vIGxvbmciKTsKLSAgICAgICAgICAgIGFwX3NlbmRfZXJyb3JfcmVzcG9uc2UociwgMCk7Ci0gICAgICAgICAgICBhcF9ydW5fbG9nX3RyYW5zYWN0aW9uKHIpOwotICAgICAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChyLT5jb25uZWN0aW9uLT5rZXB0YWxpdmUpIHsKLSAgICAgICAgYXByX3NldHNvY2tldG9wdChyLT5jb25uZWN0aW9uLT5jbGllbnRfc29ja2V0LCBBUFJfU09fVElNRU9VVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShyLT5zZXJ2ZXItPnRpbWVvdXQgKiBBUFJfVVNFQ19QRVJfU0VDKSk7Ci0gICAgfQotICAgIGlmICghci0+YXNzYmFja3dhcmRzKSB7Ci0gICAgICAgIGdldF9taW1lX2hlYWRlcnMocik7Ci0gICAgICAgIGlmIChyLT5zdGF0dXMgIT0gSFRUUF9SRVFVRVNUX1RJTUVfT1VUKSB7Ci0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotCQkJICAicmVxdWVzdCBmYWlsZWQ6IGVycm9yIHJlYWRpbmcgdGhlIGhlYWRlcnMiKTsKLSAgICAgICAgICAgIGFwX3NlbmRfZXJyb3JfcmVzcG9uc2UociwgMCk7Ci0gICAgICAgICAgICBhcF9ydW5fbG9nX3RyYW5zYWN0aW9uKHIpOwotICAgICAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmIChyLT5oZWFkZXJfb25seSkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIENsaWVudCBhc2tlZCBmb3IgaGVhZGVycyBvbmx5IHdpdGggSFRUUC8wLjksIHdoaWNoIGRvZXNuJ3Qgc2VuZAotICAgICAgICAgICAgICogaGVhZGVycyEgSGF2ZSB0byBkaW5rIHRoaW5ncyBqdXN0IHRvIG1ha2Ugc3VyZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAgICAgICAgICogY29tZXMgdGhyb3VnaC4uLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xpZW50IHNlbnQgaW52YWxpZCBIVFRQLzAuOSByZXF1ZXN0OiBIRUFEICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpKTsKLSAgICAgICAgICAgIHItPmhlYWRlcl9vbmx5ID0gMDsKLSAgICAgICAgICAgIHItPnN0YXR1cyA9IEhUVFBfQkFEX1JFUVVFU1Q7Ci0gICAgICAgICAgICBhcF9zZW5kX2Vycm9yX3Jlc3BvbnNlKHIsIDApOwotICAgICAgICAgICAgYXBfcnVuX2xvZ190cmFuc2FjdGlvbihyKTsKLSAgICAgICAgICAgIHJldHVybiByOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgci0+c3RhdHVzID0gSFRUUF9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgLyogVW50aWwgZnVydGhlciBub3RpY2UuICovCi0KLSAgICAvKiB1cGRhdGUgd2hhdCB3ZSB0aGluayB0aGUgdmlydHVhbCBob3N0IGlzIGJhc2VkIG9uIHRoZSBoZWFkZXJzIHdlJ3ZlCi0gICAgICogbm93IHJlYWQuIG1heSB1cGRhdGUgc3RhdHVzLgotICAgICAqLwotICAgIGFwX3VwZGF0ZV92aG9zdF9mcm9tX2hlYWRlcnMocik7Ci0KLSAgICAvKiB3ZSBtYXkgaGF2ZSBzd2l0Y2hlZCB0byBhbm90aGVyIHNlcnZlciAqLwotICAgIHItPnBlcl9kaXJfY29uZmlnID0gci0+c2VydmVyLT5sb29rdXBfZGVmYXVsdHM7Ci0KLSAgICBjb25uLT5rZXB0YWxpdmUgPSAwOyAgICAgICAgLyogV2Ugbm93IGhhdmUgYSByZXF1ZXN0IHRvIHBsYXkgd2l0aCAqLwotCi0gICAgaWYgKCghci0+aG9zdG5hbWUgJiYgKHItPnByb3RvX251bSA+PSBIVFRQX1ZFUlNJT04oMSwxKSkpIHx8Ci0gICAgICAgICgoci0+cHJvdG9fbnVtID09IEhUVFBfVkVSU0lPTigxLDEpKSAmJgotICAgICAgICAgIWFwcl90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIkhvc3QiKSkpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogQ2xpZW50IHNlbnQgdXMgYW4gSFRUUC8xLjEgb3IgbGF0ZXIgcmVxdWVzdCB3aXRob3V0IHRlbGxpbmcgdXMgdGhlCi0gICAgICAgICAqIGhvc3RuYW1lLCBlaXRoZXIgd2l0aCBhIGZ1bGwgVVJMIG9yIGEgSG9zdDogaGVhZGVyLiBXZSB0aGVyZWZvcmUKLSAgICAgICAgICogbmVlZCB0byAoYXMgcGVyIHRoZSAxLjEgc3BlYykgc2VuZCBhbiBlcnJvci4gIEFzIGEgc3BlY2lhbCBjYXNlLAotICAgICAgICAgKiBIVFRQLzEuMSBtZW50aW9ucyB0d2ljZSAoUzksIFMxNC4yMykgdGhhdCBhIHJlcXVlc3QgTVVTVCBjb250YWluCi0gICAgICAgICAqIGEgSG9zdDogaGVhZGVyLCBhbmQgdGhlIHNlcnZlciBNVVNUIHJlc3BvbmQgd2l0aCA0MDAgaWYgaXQgZG9lc24ndC4KLSAgICAgICAgICovCi0gICAgICAgIHItPnN0YXR1cyA9IEhUVFBfQkFEX1JFUVVFU1Q7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgImNsaWVudCBzZW50IEhUVFAvMS4xIHJlcXVlc3Qgd2l0aG91dCBob3N0bmFtZSAiCi0gICAgICAgICAgICAgICAgICAgICAgIihzZWUgUkZDMjYxNiBzZWN0aW9uIDE0LjIzKTogJXMiLCByLT51cmkpOwotICAgIH0KLSAgICBpZiAoci0+c3RhdHVzICE9IEhUVFBfT0spIHsKLSAgICAgICAgYXBfc2VuZF9lcnJvcl9yZXNwb25zZShyLCAwKTsKLSAgICAgICAgYXBfcnVuX2xvZ190cmFuc2FjdGlvbihyKTsKLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgfQotICAgIGlmICgoKGV4cGVjdCA9IGFwcl90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIkV4cGVjdCIpKSAhPSBOVUxMKSAmJgotICAgICAgICAoZXhwZWN0WzBdICE9ICdcMCcpKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFRoZSBFeHBlY3QgaGVhZGVyIGZpZWxkIHdhcyBhZGRlZCB0byBIVFRQLzEuMSBhZnRlciBSRkMgMjA2OAotICAgICAgICAgKiBhcyBhIG1lYW5zIHRvIHNpZ25hbCB3aGVuIGEgMTAwIHJlc3BvbnNlIGlzIGRlc2lyZWQgYW5kLAotICAgICAgICAgKiB1bmZvcnR1bmF0ZWx5LCB0byBzaWduYWwgYSBwb29yIG1hbidzIG1hbmRhdG9yeSBleHRlbnNpb24gdGhhdAotICAgICAgICAgKiB0aGUgc2VydmVyIG11c3QgdW5kZXJzdGFuZCBvciByZXR1cm4gNDE3IEV4cGVjdGF0aW9uIEZhaWxlZC4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChzdHJjYXNlY21wKGV4cGVjdCwgIjEwMC1jb250aW51ZSIpID09IDApIHsKLSAgICAgICAgICAgIHItPmV4cGVjdGluZ18xMDAgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgci0+c3RhdHVzID0gSFRUUF9FWFBFQ1RBVElPTl9GQUlMRUQ7Ci0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgMCwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWVudCBzZW50IGFuIHVucmVjb2duaXplZCBleHBlY3RhdGlvbiB2YWx1ZSBvZiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3Q6ICVzIiwgZXhwZWN0KTsKLSAgICAgICAgICAgIGFwX3NlbmRfZXJyb3JfcmVzcG9uc2UociwgMCk7Ci0gICAgICAgICAgICAodm9pZCkgYXBfZGlzY2FyZF9yZXF1ZXN0X2JvZHkocik7Ci0gICAgICAgICAgICBhcF9ydW5fbG9nX3RyYW5zYWN0aW9uKHIpOwotICAgICAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoKGFjY2Vzc19zdGF0dXMgPSBhcF9ydW5fcG9zdF9yZWFkX3JlcXVlc3QocikpKSB7Ci0gICAgICAgIGFwX2RpZShhY2Nlc3Nfc3RhdHVzLCByKTsKLSAgICAgICAgYXBfcnVuX2xvZ190cmFuc2FjdGlvbihyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHI7Ci19Ci0KLS8qCi0gKiBBIGNvdXBsZSBvZiBvdGhlciBmdW5jdGlvbnMgd2hpY2ggaW5pdGlhbGl6ZSBzb21lIG9mIHRoZSBmaWVsZHMgb2YKLSAqIGEgcmVxdWVzdCBzdHJ1Y3R1cmUsIGFzIGFwcHJvcHJpYXRlIGZvciBhZGp1bmN0cyBvZiBvbmUga2luZCBvciBhbm90aGVyCi0gKiB0byBhIHJlcXVlc3QgaW4gcHJvZ3Jlc3MuICBCZXN0IGhlcmUsIHJhdGhlciB0aGFuIGVsc2V3aGVyZSwgc2luY2UKLSAqICpzb21lb25lKiBoYXMgdG8gc2V0IHRoZSBwcm90b2NvbC1zcGVjaWZpYyBmaWVsZHMuLi4KLSAqLwotCi12b2lkIGFwX3NldF9zdWJfcmVxX3Byb3RvY29sKHJlcXVlc3RfcmVjICpybmV3LCBjb25zdCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBybmV3LT50aGVfcmVxdWVzdCAgICAgPSByLT50aGVfcmVxdWVzdDsgIC8qIEtlZXAgb3JpZ2luYWwgcmVxdWVzdC1saW5lICovCi0KLSAgICBybmV3LT5hc3NiYWNrd2FyZHMgICAgPSAxOyAgIC8qIERvbid0IHNlbmQgaGVhZGVycyBmcm9tIHRoaXMuICovCi0gICAgcm5ldy0+bm9fbG9jYWxfY29weSAgID0gMTsgICAvKiBEb24ndCB0cnkgdG8gc2VuZCBIVFRQX05PVF9NT0RJRklFRCBmb3IgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZnJhZ21lbnQuICovCi0gICAgcm5ldy0+bWV0aG9kICAgICAgICAgID0gIkdFVCI7Ci0gICAgcm5ldy0+bWV0aG9kX251bWJlciAgID0gTV9HRVQ7Ci0gICAgcm5ldy0+cHJvdG9jb2wgICAgICAgID0gIklOQ0xVREVEIjsKLQotICAgIHJuZXctPnN0YXR1cyAgICAgICAgICA9IEhUVFBfT0s7Ci0KLSAgICBybmV3LT5oZWFkZXJzX2luICAgICAgPSByLT5oZWFkZXJzX2luOwotICAgIHJuZXctPnN1YnByb2Nlc3NfZW52ICA9IGFwcl90YWJsZV9jb3B5KHJuZXctPnBvb2wsIHItPnN1YnByb2Nlc3NfZW52KTsKLSAgICBybmV3LT5oZWFkZXJzX291dCAgICAgPSBhcHJfdGFibGVfbWFrZShybmV3LT5wb29sLCA1KTsKLSAgICBybmV3LT5lcnJfaGVhZGVyc19vdXQgPSBhcHJfdGFibGVfbWFrZShybmV3LT5wb29sLCA1KTsKLSAgICBybmV3LT5ub3RlcyAgICAgICAgICAgPSBhcHJfdGFibGVfbWFrZShybmV3LT5wb29sLCA1KTsKLQotICAgIHJuZXctPmV4cGVjdGluZ18xMDAgICA9IHItPmV4cGVjdGluZ18xMDA7Ci0gICAgcm5ldy0+cmVhZF9sZW5ndGggICAgID0gci0+cmVhZF9sZW5ndGg7Ci0gICAgcm5ldy0+cmVhZF9ib2R5ICAgICAgID0gUkVRVUVTVF9OT19CT0RZOwotCi0gICAgcm5ldy0+bWFpbiA9IChyZXF1ZXN0X3JlYyAqKSByOwotfQotCi1zdGF0aWMgdm9pZCBlbmRfb3V0cHV0X3N0cmVhbShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBhcHJfYnVja2V0X2JyaWdhZGUgKmJiOwotICAgIGFwcl9idWNrZXQgKmI7Ci0KLSAgICBiYiA9IGFwcl9icmlnYWRlX2NyZWF0ZShyLT5wb29sKTsKLSAgICBiID0gYXByX2J1Y2tldF9lb3NfY3JlYXRlKCk7Ci0gICAgQVBSX0JSSUdBREVfSU5TRVJUX1RBSUwoYmIsIGIpOwotICAgIGFwX3Bhc3NfYnJpZ2FkZShyLT5vdXRwdXRfZmlsdGVycywgYmIpOwotfQotCi12b2lkIGFwX2ZpbmFsaXplX3N1Yl9yZXFfcHJvdG9jb2wocmVxdWVzdF9yZWMgKnN1YikKLXsKLSAgICBlbmRfb3V0cHV0X3N0cmVhbShzdWIpOyAKLX0KLQotLyogZmluYWxpemVfcmVxdWVzdF9wcm90b2NvbCBpcyBjYWxsZWQgYXQgY29tcGxldGlvbiBvZiBzZW5kaW5nIHRoZQotICogcmVzcG9uc2UuICBJdHMgc29sZSBwdXJwb3NlIGlzIHRvIHNlbmQgdGhlIHRlcm1pbmF0aW5nIHByb3RvY29sCi0gKiBpbmZvcm1hdGlvbiBmb3IgYW55IHdyYXBwZXJzIGFyb3VuZCB0aGUgcmVzcG9uc2UgbWVzc2FnZSBib2R5Ci0gKiAoaS5lLiwgdHJhbnNmZXIgZW5jb2RpbmdzKS4gIEl0IHNob3VsZCBoYXZlIGJlZW4gbmFtZWQgZmluYWxpemVfcmVzcG9uc2UuCi0gKi8KLUFQX0RFQ0xBUkUodm9pZCkgYXBfZmluYWxpemVfcmVxdWVzdF9wcm90b2NvbChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICB3aGlsZSAoci0+bmV4dCkgewotICAgICAgICByID0gci0+bmV4dDsKLSAgICB9Ci0gICAgLyogdGVsbCB0aGUgZmlsdGVyIGNoYWluIHRoZXJlIGlzIG5vIG1vcmUgY29udGVudCBjb21pbmcgKi8KLSAgICBpZiAoIXItPmVvc19zZW50KSB7Ci0gICAgICAgIGVuZF9vdXRwdXRfc3RyZWFtKHIpOwotICAgIH0KLX0gCi0KLS8qCi0gKiBTdXBwb3J0IGZvciB0aGUgQmFzaWMgYXV0aGVudGljYXRpb24gcHJvdG9jb2wsIGFuZCBhIGJpdCBmb3IgRGlnZXN0LgotICovCi0KLUFQX0RFQ0xBUkUodm9pZCkgYXBfbm90ZV9hdXRoX2ZhaWx1cmUocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaWYgKCFzdHJjYXNlY21wKGFwX2F1dGhfdHlwZShyKSwgIkJhc2ljIikpCi0gICAgICAgIGFwX25vdGVfYmFzaWNfYXV0aF9mYWlsdXJlKHIpOwotICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGFwX2F1dGhfdHlwZShyKSwgIkRpZ2VzdCIpKQotICAgICAgICBhcF9ub3RlX2RpZ2VzdF9hdXRoX2ZhaWx1cmUocik7Ci19Ci0KLUFQX0RFQ0xBUkUodm9pZCkgYXBfbm90ZV9iYXNpY19hdXRoX2ZhaWx1cmUocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaWYgKHN0cmNhc2VjbXAoYXBfYXV0aF90eXBlKHIpLCAiQmFzaWMiKSkKLSAgICAgICAgYXBfbm90ZV9hdXRoX2ZhaWx1cmUocik7Ci0gICAgZWxzZQotICAgICAgICBhcHJfdGFibGVfc2V0bihyLT5lcnJfaGVhZGVyc19vdXQsCi0gICAgICAgICAgICAgICAgICByLT5wcm94eXJlcSA/ICJQcm94eS1BdXRoZW50aWNhdGUiIDogIldXVy1BdXRoZW50aWNhdGUiLAotICAgICAgICAgICAgICAgICAgYXByX3BzdHJjYXQoci0+cG9vbCwgIkJhc2ljIHJlYWxtPVwiIiwgYXBfYXV0aF9uYW1lKHIpLCAiXCIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7Ci19Ci0KLUFQX0RFQ0xBUkUodm9pZCkgYXBfbm90ZV9kaWdlc3RfYXV0aF9mYWlsdXJlKHJlcXVlc3RfcmVjICpyKQotewotICAgIGFwcl90YWJsZV9zZXRuKHItPmVycl9oZWFkZXJzX291dCwKLQkgICAgci0+cHJveHlyZXEgPyAiUHJveHktQXV0aGVudGljYXRlIiA6ICJXV1ctQXV0aGVudGljYXRlIiwKLQkgICAgYXByX3BzcHJpbnRmKHItPnBvb2wsICJEaWdlc3QgcmVhbG09XCIlc1wiLCBub25jZT1cIiVsbHhcIiIsCi0JCWFwX2F1dGhfbmFtZShyKSwgci0+cmVxdWVzdF90aW1lKSk7Ci19Ci0KLUFQX0RFQ0xBUkUoaW50KSBhcF9nZXRfYmFzaWNfYXV0aF9wdyhyZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqKnB3KQotewotICAgIGNvbnN0IGNoYXIgKmF1dGhfbGluZSA9IGFwcl90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+cHJveHlyZXEgPyAiUHJveHktQXV0aG9yaXphdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiQXV0aG9yaXphdGlvbiIpOwotICAgIGNvbnN0IGNoYXIgKnQ7Ci0KLSAgICBpZiAoISh0ID0gYXBfYXV0aF90eXBlKHIpKSB8fCBzdHJjYXNlY21wKHQsICJCYXNpYyIpKQotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0KLSAgICBpZiAoIWFwX2F1dGhfbmFtZShyKSkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLAotCQkgICAgICAwLCByLCAibmVlZCBBdXRoTmFtZTogJXMiLCByLT51cmkpOwotICAgICAgICByZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgfQotCi0gICAgaWYgKCFhdXRoX2xpbmUpIHsKLSAgICAgICAgYXBfbm90ZV9iYXNpY19hdXRoX2ZhaWx1cmUocik7Ci0gICAgICAgIHJldHVybiBIVFRQX1VOQVVUSE9SSVpFRDsKLSAgICB9Ci0KLSAgICBpZiAoc3RyY2FzZWNtcChhcF9nZXR3b3JkKHItPnBvb2wsICZhdXRoX2xpbmUsICcgJyksICJCYXNpYyIpKSB7Ci0gICAgICAgIC8qIENsaWVudCB0cmllZCB0byBhdXRoZW50aWNhdGUgdXNpbmcgd3JvbmcgYXV0aCBzY2hlbWUgKi8KLSAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLQkJICAgICAgImNsaWVudCB1c2VkIHdyb25nIGF1dGhlbnRpY2F0aW9uIHNjaGVtZTogJXMiLCByLT51cmkpOwotICAgICAgICBhcF9ub3RlX2Jhc2ljX2F1dGhfZmFpbHVyZShyKTsKLSAgICAgICAgcmV0dXJuIEhUVFBfVU5BVVRIT1JJWkVEOwotICAgIH0KLQotICAgIHdoaWxlICgqYXV0aF9saW5lPT0gJyAnIHx8ICphdXRoX2xpbmU9PSAnXHQnKSB7Ci0gICAgICAgIGF1dGhfbGluZSsrOwotICAgIH0KLQotICAgIHQgPSBhcF9wYmFzZTY0ZGVjb2RlKHItPnBvb2wsIGF1dGhfbGluZSk7Ci0gICAgLyogTm90ZSB0aGF0IHRoaXMgYWxsb2NhdGlvbiBoYXMgdG8gYmUgbWFkZSBmcm9tIHItPmNvbm5lY3Rpb24tPnBvb2wKLSAgICAgKiBiZWNhdXNlIGl0IGhhcyB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbm5lY3Rpb24uICBUaGUgb3RoZXIgYWxsb2NhdGlvbnMKLSAgICAgKiBhcmUgdGVtcG9yYXJ5IGFuZCBjYW4gYmUgdG9zc2VkIGF3YXkgYW55IHRpbWUuCi0gICAgICovCi0gICAgci0+dXNlciA9IGFwX2dldHdvcmRfbnVsbHMgKHItPnBvb2wsICZ0LCAnOicpOwotICAgIHItPmFwX2F1dGhfdHlwZSA9ICJCYXNpYyI7Ci0KLSAgICAqcHcgPSB0OwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdHJ1Y3QgY29udGVudF9sZW5ndGhfY3R4IHsKLSAgICBhcHJfYnVja2V0X2JyaWdhZGUgKnNhdmVkOwotICAgIGludCBjb21wdXRlX2xlbjsKLSAgICBhcHJfc2l6ZV90IGN1cnJfbGVuOwotfTsKLQotLyogVGhpcyBmaWx0ZXIgY29tcHV0ZXMgdGhlIGNvbnRlbnQgbGVuZ3RoLCBidXQgaXQgYWxzbyBjb21wdXRlcyB0aGUgbnVtYmVyCi0gKiBvZiBieXRlcyBzZW50IHRvIHRoZSBjbGllbnQuICBUaGlzIG1lYW5zIHRoYXQgdGhpcyBmaWx0ZXIgd2lsbCBhbHdheXMgcnVuCi0gKiB0aHJvdWdoIGFsbCBvZiB0aGUgYnVja2V0cyBpbiBhbGwgYnJpZ2FkZXMgCi0gKi8KLUFQX0NPUkVfREVDTEFSRV9OT05TVEQoYXByX3N0YXR1c190KSBhcF9jb250ZW50X2xlbmd0aF9maWx0ZXIoYXBfZmlsdGVyX3QgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcl9idWNrZXRfYnJpZ2FkZSAqYikKLXsKLSAgICByZXF1ZXN0X3JlYyAqciA9IGYtPnI7Ci0gICAgc3RydWN0IGNvbnRlbnRfbGVuZ3RoX2N0eCAqY3R4OwotICAgIGFwcl9zdGF0dXNfdCBydjsKLSAgICBhcHJfYnVja2V0ICplOwotICAgIGludCBzZW5kX2l0ID0gMDsKLQotICAgIGN0eCA9IGYtPmN0eDsKLSAgICBpZiAoIWN0eCkgeyAvKiBmaXJzdCB0aW1lIHRocm91Z2ggKi8KLSAgICAgICAgZi0+Y3R4ID0gY3R4ID0gYXByX3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKHN0cnVjdCBjb250ZW50X2xlbmd0aF9jdHgpKTsKLSAgICB9Ci0KLSAgICBBUFJfQlJJR0FERV9GT1JFQUNIKGUsIGIpIHsKLSAgICAgICAgY29uc3QgY2hhciAqaWdub3JlZDsKLSAgICAgICAgYXByX3NpemVfdCBsZW5ndGg7Ci0KLSAgICAgICAgaWYgKEFQUl9CVUNLRVRfSVNfRU9TKGUpIHx8IEFQUl9CVUNLRVRfSVNfRkxVU0goZSkpIHsKLSAgICAgICAgICAgIHNlbmRfaXQgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlLT5sZW5ndGggPT0gLTEpIHsgLyogaWYgbGVuZ3RoIHVua25vd24gKi8KLSAgICAgICAgICAgIHJ2ID0gYXByX2J1Y2tldF9yZWFkKGUsICZpZ25vcmVkLCAmbGVuZ3RoLCBBUFJfQkxPQ0tfUkVBRCk7Ci0gICAgICAgICAgICBpZiAocnYgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcnY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBsZW5ndGggPSBlLT5sZW5ndGg7Ci0gICAgICAgIH0KLSAgICAgICAgY3R4LT5jdXJyX2xlbiArPSBsZW5ndGg7Ci0gICAgICAgIHItPmJ5dGVzX3NlbnQgKz0gbGVuZ3RoOwotICAgIH0KLQotICAgIGlmICgoY3R4LT5jdXJyX2xlbiA8IEFQX01JTl9CWVRFU19UT19XUklURSkgJiYgIXNlbmRfaXQpIHsKLSAgICAgICAgcmV0dXJuIGFwX3NhdmVfYnJpZ2FkZShmLCAmY3R4LT5zYXZlZCwgJmIpOwotICAgIH0KLQotICAgIC8qIFdlIHdpbGwgY29tcHV0ZSBhIGNvbnRlbnQgbGVuZ3RoIGlmOgotICAgICAqICAgICBXZSBhbHJlYWR5IGhhdmUgYWxsIHRoZSBkYXRhCi0gICAgICogICAgICAgICBUaGlzIGlzIGEgYml0IGNvbmZ1c2luZywgYmVjYXVzZSB3ZSB3aWxsIGFsd2F5cyBidWZmZXIgdXAKLSAgICAgKiAgICAgICAgIHRvIEFQX01JTl9CWVRFU19UT19XUklURSwgc28gaWYgd2UgZ2V0IGFsbCB0aGUgZGF0YSB3aGlsZQotICAgICAqICAgICAgICAgd2UgYXJlIGJ1ZmZlcmluZyB0aGF0IG11Y2ggZGF0YSwgd2Ugc2V0IHRoZSBjLWwuCi0gICAgICogIG9yIFdlIGFyZSBpbiBhIDEuMSByZXF1ZXN0IGFuZCB3ZSBjYW4ndCBjaHVuawotICAgICAqICBvciBUaGlzIGlzIGEga2VlcGFsaXZlIGNvbm5lY3Rpb24KLSAgICAgKiAgICAgICAgIFdlIG1heSB3YW50IHRvIGNoYW5nZSB0aGlzIGxhdGVyIHRvIGp1c3QgY2xvc2UgdGhlIGNvbm5lY3Rpb24KLSAgICAgKi8KLSAgICBpZiAoKHItPnByb3RvX251bSA9PSBIVFRQX1ZFUlNJT04oMSwxKQotICAgICAgICAmJiAhYXBfZmluZF9sYXN0X3Rva2VuKGYtPnItPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXByX3RhYmxlX2dldChyLT5oZWFkZXJzX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcmFuc2Zlci1FbmNvZGluZyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaHVua2VkIikpCi0gICAgICAgIHx8IChmLT5yLT5jb25uZWN0aW9uLT5rZWVwYWxpdmUpCi0gICAgICAgIHx8IChBUFJfQlVDS0VUX0lTX0VPUyhBUFJfQlJJR0FERV9MQVNUKGIpKSkpIHsKLSAgICAgICAgY3R4LT5jb21wdXRlX2xlbiA9IDE7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBjdHgtPmNvbXB1dGVfbGVuID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoY3R4LT5jb21wdXRlX2xlbikgewotICAgICAgICAvKiBzYXZlIHRoZSBicmlnYWRlOyB3ZSBjYW4ndCBwYXNzIGFueSBkYXRhIHRvIHRoZSBuZXh0Ci0gICAgICAgICAqIGZpbHRlciB1bnRpbCB3ZSBoYXZlIHRoZSBlbnRpcmUgY29udGVudCBsZW5ndGgKLSAgICAgICAgICovCi0gICAgICAgIGlmICghc2VuZF9pdCkgewotICAgICAgICAgICAgYXBfc2F2ZV9icmlnYWRlKGYsICZjdHgtPnNhdmVkLCAmYik7Ci0gICAgICAgICAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci0gICAgICAgIH0KLSAgICAgICAgYXBfc2V0X2NvbnRlbnRfbGVuZ3RoKHIsIHItPmJ5dGVzX3NlbnQpOwotICAgIH0KLSAgICBpZiAoY3R4LT5zYXZlZCkgewotICAgICAgICBBUFJfQlJJR0FERV9DT05DQVQoY3R4LT5zYXZlZCwgYik7Ci0gICAgICAgIGFwcl9icmlnYWRlX2Rlc3Ryb3koYik7Ci0gICAgICAgIGIgPSBjdHgtPnNhdmVkOwotICAgICAgICBjdHgtPnNhdmVkID0gTlVMTDsKLSAgICB9Ci0KLSAgICBjdHgtPmN1cnJfbGVuID0gMDsKLSAgICByZXR1cm4gYXBfcGFzc19icmlnYWRlKGYtPm5leHQsIGIpOwotfQotCi1zdGF0aWMgaW50IGFwX3NldF9ieXRlcmFuZ2UocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY29uc3QgY2hhciAqcmFuZ2U7Ci0gICAgY29uc3QgY2hhciAqaWZfcmFuZ2U7Ci0gICAgY29uc3QgY2hhciAqbWF0Y2g7Ci0gICAgY29uc3QgY2hhciAqY3Q7Ci0gICAgYXByX29mZl90IHJhbmdlX3N0YXJ0OwotICAgIGFwcl9vZmZfdCByYW5nZV9lbmQ7Ci0gICAgaW50IG51bV9yYW5nZXM7Ci0KLSAgICBpZiAoci0+YXNzYmFja3dhcmRzKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8qIENoZWNrIGZvciBSYW5nZSByZXF1ZXN0LWhlYWRlciAoSFRUUC8xLjEpIG9yIFJlcXVlc3QtUmFuZ2UgZm9yCi0gICAgICogYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgd2l0aCBzZWNvbmQtZHJhZnQgTHVvdG9uZW4vRnJhbmtzCi0gICAgICogYnl0ZS1yYW5nZXMgKGUuZy4gTmV0c2NhcGUgTmF2aWdhdG9yIDItMykuCi0gICAgICoKLSAgICAgKiBXZSBzdXBwb3J0IHRoaXMgZm9ybSwgd2l0aCBSZXF1ZXN0LVJhbmdlLCBhbmQgKGZhcnRoZXIgZG93bikgd2UKLSAgICAgKiBzZW5kIG11bHRpcGFydC94LWJ5dGVyYW5nZXMgaW5zdGVhZCBvZiBtdWx0aXBhcnQvYnl0ZXJhbmdlcyBmb3IKLSAgICAgKiBSZXF1ZXN0LVJhbmdlIGJhc2VkIHJlcXVlc3RzIHRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIE5ldHNjYXBlCi0gICAgICogTmF2aWdhdG9yIDItMyBhbmQgTVNJRSAzLgotICAgICAqLwotCi0gICAgaWYgKCEocmFuZ2UgPSBhcHJfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJSYW5nZSIpKSkKLSAgICAgICAgcmFuZ2UgPSBhcHJfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJSZXF1ZXN0LVJhbmdlIik7Ci0KLSAgICBpZiAoIXJhbmdlIHx8IHN0cm5jYXNlY21wKHJhbmdlLCAiYnl0ZXM9IiwgNikpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgdGhlIElmLVJhbmdlIGhlYWRlciBmb3IgRXRhZyBvciBEYXRlLgotICAgICAqIE5vdGUgdGhhdCB0aGlzIGNoZWNrIHdpbGwgcmV0dXJuIGZhbHNlIChhcyByZXF1aXJlZCkgaWYgZWl0aGVyCi0gICAgICogb2YgdGhlIHR3byBldGFncyBhcmUgd2Vhay4KLSAgICAgKi8KLSAgICBpZiAoKGlmX3JhbmdlID0gYXByX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiSWYtUmFuZ2UiKSkpIHsKLSAgICAgICAgaWYgKGlmX3JhbmdlWzBdID09ICciJykgewotICAgICAgICAgICAgaWYgKCEobWF0Y2ggPSBhcHJfdGFibGVfZ2V0KHItPmhlYWRlcnNfb3V0LCAiRXRhZyIpKSB8fAotICAgICAgICAgICAgICAgIChzdHJjbXAoaWZfcmFuZ2UsIG1hdGNoKSAhPSAwKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghKG1hdGNoID0gYXByX3RhYmxlX2dldChyLT5oZWFkZXJzX291dCwgIkxhc3QtTW9kaWZpZWQiKSkgfHwKLSAgICAgICAgICAgICAgICAgKHN0cmNtcChpZl9yYW5nZSwgbWF0Y2gpICE9IDApKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogd291bGQgYmUgbmljZSB0byBwaWNrIHRoaXMgdXAgZnJvbSBmLT5jdHggKi8KLSAgICBjdCA9IGFwX21ha2VfY29udGVudF90eXBlKHIsIHItPmNvbnRlbnRfdHlwZSk7Ci0KLSAgICBpZiAoIWFwX3N0cmNocl9jKHJhbmdlLCAnLCcpKSB7Ci0gICAgICAgIGludCBydjsKLSAgICAgICAgLyogQSBzaW5nbGUgcmFuZ2UgKi8KLQotICAgICAgICAvKiBydmFyc2VfYnl0ZXJhbmdlKCkgbW9kaWZpZXMgdGhlIGNvbnRlbnRzLCBzbyBtYWtlIGEgY29weSAqLwotICAgICAgICBpZiAoKHJ2ID0gcGFyc2VfYnl0ZXJhbmdlKGFwcl9wc3RyZHVwKHItPnBvb2wsIHJhbmdlICsgNiksIHItPmNsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyYW5nZV9zdGFydCwgJnJhbmdlX2VuZCkpIDw9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBydjsKLSAgICAgICAgfQotICAgICAgICBhcHJfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkNvbnRlbnQtUmFuZ2UiLAotICAgICAgICAgICAgICAgICAgICAgICBhcHJfcHNwcmludGYoci0+cG9vbCwgImJ5dGVzICIgQllURVJBTkdFX0ZNVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlX3N0YXJ0LCByYW5nZV9lbmQsIHItPmNsZW5ndGgpKTsKLQlhcHJfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkNvbnRlbnQtVHlwZSIsIGN0KTsKLQotICAgICAgICBudW1fcmFuZ2VzID0gMTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIGEgbXVsdGlwbGUgcmFuZ2UgKi8KLQotICAgICAgICBudW1fcmFuZ2VzID0gMjsKLQotICAgICAgICAvKiAjIyMgaXQgd291bGQgYmUgbmljZSBpZiByLT5ib3VuZGFyeSB3YXMgaW4gZi0+Y3R4ICovCi0gICAgICAgIHItPmJvdW5kYXJ5ID0gYXByX3BzcHJpbnRmKHItPnBvb2wsICIlcXglbHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5yZXF1ZXN0X3RpbWUsIChsb25nKSBnZXRwaWQoKSk7Ci0KLSAgICAgICAgYXByX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJDb250ZW50LVR5cGUiLAotCQkgICAgICAgYXByX3BzdHJjYXQoci0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11bHRpcGFydCIsIHVzZV9yYW5nZV94KHIpID8gIi94LSIgOiAiLyIsCi0JCQkJICAgImJ5dGVyYW5nZXM7IGJvdW5kYXJ5PSIsIHItPmJvdW5kYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7Ci0gICAgfQotCi0gICAgci0+c3RhdHVzID0gSFRUUF9QQVJUSUFMX0NPTlRFTlQ7Ci0gICAgci0+cmFuZ2UgPSByYW5nZSArIDY7Ci0KLSAgICByZXR1cm4gbnVtX3JhbmdlczsKLX0KLQotLyoKLSAqIFNlbmQgdGhlIGJvZHkgb2YgYSByZXNwb25zZSB0byB0aGUgY2xpZW50LgotICovCi1BUF9ERUNMQVJFKGFwcl9zdGF0dXNfdCkgYXBfc2VuZF9mZChhcHJfZmlsZV90ICpmZCwgcmVxdWVzdF9yZWMgKnIsIGFwcl9vZmZfdCBvZmZzZXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXByX3NpemVfdCBsZW4sIGFwcl9zaXplX3QgKm5ieXRlcykgCi17Ci0gICAgYXByX2J1Y2tldF9icmlnYWRlICpiYiA9IE5VTEw7Ci0gICAgYXByX2J1Y2tldCAqYjsKLSAgICBhcHJfc3RhdHVzX3QgcnY7Ci0KLSAgICBiYiA9IGFwcl9icmlnYWRlX2NyZWF0ZShyLT5wb29sKTsKLSAgICBiID0gYXByX2J1Y2tldF9maWxlX2NyZWF0ZShmZCwgb2Zmc2V0LCBsZW4pOwotICAgIEFQUl9CUklHQURFX0lOU0VSVF9UQUlMKGJiLCBiKTsKLQotICAgIHJ2ID0gYXBfcGFzc19icmlnYWRlKHItPm91dHB1dF9maWx0ZXJzLCBiYik7Ci0gICAgaWYgKHJ2ICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgICpuYnl0ZXMgPSAwOyAvKiBubyB3YXkgdG8gdGVsbCBob3cgbWFueSB3ZXJlIGFjdHVhbGx5IHNlbnQgKi8KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgICpuYnl0ZXMgPSBsZW47Ci0gICAgfQotCi0gICAgcmV0dXJuIHJ2OwotfQotCi0jaWYgQVBSX0hBU19NTUFQCi0vKiBzZW5kIGRhdGEgZnJvbSBhbiBpbi1tZW1vcnkgYnVmZmVyICovCi1BUF9ERUNMQVJFKHNpemVfdCkgYXBfc2VuZF9tbWFwKGFwcl9tbWFwX3QgKm1tLCByZXF1ZXN0X3JlYyAqciwgc2l6ZV90IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkKLXsKLSAgICBhcHJfYnVja2V0X2JyaWdhZGUgKmJiID0gTlVMTDsKLSAgICBhcHJfYnVja2V0ICpiOwotCi0gICAgYmIgPSBhcHJfYnJpZ2FkZV9jcmVhdGUoci0+cG9vbCk7Ci0gICAgYiA9IGFwcl9idWNrZXRfbW1hcF9jcmVhdGUobW0sIG9mZnNldCwgbGVuZ3RoKTsKLSAgICBBUFJfQlJJR0FERV9JTlNFUlRfVEFJTChiYiwgYik7Ci0gICAgYXBfcGFzc19icmlnYWRlKHItPm91dHB1dF9maWx0ZXJzLCBiYik7Ci0KLSAgICByZXR1cm4gbW0tPnNpemU7IC8qIFhYWCAtIGNoYW5nZSBBUEkgdG8gcmVwb3J0IGFwcl9zdGF0dXNfdD8gKi8KLX0KLSNlbmRpZiAvKiBBUFJfSEFTX01NQVAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNoYXIgKmJ1ZjsKLSAgICBjaGFyICpjdXI7Ci0gICAgYXByX3NpemVfdCBhdmFpbDsKLX0gb2xkX3dyaXRlX2ZpbHRlcl9jdHg7Ci0KLUFQX0NPUkVfREVDTEFSRV9OT05TVEQoYXByX3N0YXR1c190KSBhcF9vbGRfd3JpdGVfZmlsdGVyKAotICAgIGFwX2ZpbHRlcl90ICpmLCBhcHJfYnVja2V0X2JyaWdhZGUgKmJiKQotewotICAgIG9sZF93cml0ZV9maWx0ZXJfY3R4ICpjdHggPSBmLT5jdHg7Ci0KLSAgICBBUF9ERUJVR19BU1NFUlQoY3R4KTsKLQotICAgIGlmIChjdHgtPmJ1ZiAhPSBOVUxMKSB7Ci0gICAgICAgIGFwcl9zaXplX3QgbmJ5dGUgPSBjdHgtPmN1ciAtIGN0eC0+YnVmOwotCi0gICAgICAgIGlmIChuYnl0ZSAhPSAwKSB7Ci0gICAgICAgICAgICAvKiB3aGF0ZXZlciBpcyBjb21pbmcgZG93biB0aGUgcGlwZSAod2UgZG9uJ3QgY2FyZSksIHdlCi0gICAgICAgICAgICAgICBjYW4gc2ltcGx5IGluc2VydCBvdXIgYnVmZmVyZWQgZGF0YSBhdCB0aGUgZnJvbnQgYW5kCi0gICAgICAgICAgICAgICBwYXNzIHRoZSB3aG9sZSBidW5kbGUgZG93biB0aGUgY2hhaW4uICovCi0gICAgICAgICAgICBhcHJfYnVja2V0ICpiID0gYXByX2J1Y2tldF9oZWFwX2NyZWF0ZShjdHgtPmJ1ZiwgbmJ5dGUsIDAsIE5VTEwpOwotICAgICAgICAgICAgQVBSX0JSSUdBREVfSU5TRVJUX0hFQUQoYmIsIGIpOwotICAgICAgICAgICAgY3R4LT5idWYgPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGFwX3Bhc3NfYnJpZ2FkZShmLT5uZXh0LCBiYik7Ci19Ci0KLXN0YXRpYyBhcHJfc3RhdHVzX3QgZmx1c2hfYnVmZmVyKHJlcXVlc3RfcmVjICpyLCBvbGRfd3JpdGVfZmlsdGVyX2N0eCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXh0cmEsIGFwcl9zaXplX3QgZXh0cmFfbGVuKQotewotICAgIGFwcl9idWNrZXRfYnJpZ2FkZSAqYmIgPSBhcHJfYnJpZ2FkZV9jcmVhdGUoci0+cG9vbCk7Ci0gICAgYXByX3NpemVfdCBuYnl0ZSA9IGN0eC0+Y3VyIC0gY3R4LT5idWY7Ci0gICAgYXByX2J1Y2tldCAqYiA9IGFwcl9idWNrZXRfaGVhcF9jcmVhdGUoY3R4LT5idWYsIG5ieXRlLCAwLCBOVUxMKTsKLQotICAgIEFQUl9CUklHQURFX0lOU0VSVF9UQUlMKGJiLCBiKTsKLSAgICBjdHgtPmJ1ZiA9IE5VTEw7Ci0KLSAgICAvKiBpZiB0aGVyZSBpcyBleHRyYSBkYXRhLCB0aGVuIHNlbmQgdGhhdCwgdG9vICovCi0gICAgaWYgKGV4dHJhICE9IE5VTEwpIHsKLSAgICAgICAgYiA9IGFwcl9idWNrZXRfdHJhbnNpZW50X2NyZWF0ZShleHRyYSwgZXh0cmFfbGVuKTsKLSAgICAgICAgQVBSX0JSSUdBREVfSU5TRVJUX1RBSUwoYmIsIGIpOwotICAgIH0KLQotICAgIHJldHVybiBhcF9wYXNzX2JyaWdhZGUoci0+b3V0cHV0X2ZpbHRlcnMsIGJiKTsKLX0KLQotc3RhdGljIGFwcl9zdGF0dXNfdCBidWZmZXJfb3V0cHV0KHJlcXVlc3RfcmVjICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0ciwgYXByX3NpemVfdCBsZW4pCi17Ci0gICAgYXBfZmlsdGVyX3QgKmY7Ci0gICAgb2xkX3dyaXRlX2ZpbHRlcl9jdHggKmN0eDsKLSAgICBhcHJfc2l6ZV90IGFtdDsKLSAgICBhcHJfc3RhdHVzX3Qgc3RhdHVzOwotCi0gICAgaWYgKGxlbiA9PSAwKQotICAgICAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci0KLSAgICAvKiAjIyMgZnV0dXJlIG9wdGltaXphdGlvbjogcmVjb3JkIHNvbWUgZmxhZ3MgaW4gdGhlIHJlcXVlc3RfcmVjIHRvCi0gICAgICAgIyMjIHNheSB3aGV0aGVyIHdlJ3ZlIGFkZGVkIG91ciBmaWx0ZXIsIGFuZCB3aGV0aGVyIGl0IGlzIGZpcnN0LiAqLwotCi0gICAgLyogdGhpcyB3aWxsIHR5cGljYWxseSBleGl0IG9uIHRoZSBmaXJzdCB0ZXN0ICovCi0gICAgZm9yIChmID0gci0+b3V0cHV0X2ZpbHRlcnM7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0gICAgICAgIGlmIChzdHJjbXAoIk9MRF9XUklURSIsIGYtPmZyZWMtPm5hbWUpID09IDApCi0gICAgICAgICAgICBicmVhazsKLSAgICBpZiAoZiA9PSBOVUxMKSB7Ci0gICAgICAgIC8qIG91ciBmaWx0ZXIgaGFzbid0IGJlZW4gYWRkZWQgeWV0ICovCi0gICAgICAgIGN0eCA9IGFwcl9wY2FsbG9jKHItPnBvb2wsIHNpemVvZigqY3R4KSk7Ci0gICAgICAgIGFwX2FkZF9vdXRwdXRfZmlsdGVyKCJPTERfV1JJVEUiLCBjdHgsIHIsIHItPmNvbm5lY3Rpb24pOwotICAgIH0KLQotICAgIC8qIGlmIHRoZSBmaXJzdCBmaWx0ZXIgaXMgbm90IG91ciBidWZmZXJpbmcgZmlsdGVyLCB0aGVuIHdlIGhhdmUgdG8KLSAgICAgICBkZWxpdmVyIHRoZSBjb250ZW50IHRocm91Z2ggdGhlIG5vcm1hbCBmaWx0ZXIgY2hhaW4gKi8KLSAgICBpZiAoc3RyY21wKCJPTERfV1JJVEUiLCByLT5vdXRwdXRfZmlsdGVycy0+ZnJlYy0+bmFtZSkgIT0gMCkgewotICAgICAgICBhcHJfYnVja2V0X2JyaWdhZGUgKmJiID0gYXByX2JyaWdhZGVfY3JlYXRlKHItPnBvb2wpOwotICAgICAgICBhcHJfYnVja2V0ICpiID0gYXByX2J1Y2tldF90cmFuc2llbnRfY3JlYXRlKHN0ciwgbGVuKTsKLSAgICAgICAgQVBSX0JSSUdBREVfSU5TRVJUX1RBSUwoYmIsIGIpOwotCi0gICAgICAgIHJldHVybiBhcF9wYXNzX2JyaWdhZGUoci0+b3V0cHV0X2ZpbHRlcnMsIGJiKTsKLSAgICB9Ci0KLSAgICAvKiBncmFiIHRoZSBjb250ZXh0IGZyb20gb3VyIGZpbHRlciAqLwotICAgIGN0eCA9IHItPm91dHB1dF9maWx0ZXJzLT5jdHg7Ci0KLSAgICAvKiBpZiB0aGVyZSBpc24ndCBhIGJ1ZmZlciBpbiB0aGUgY29udGV4dCB5ZXQsIHB1dCBvbmUgdGhlcmUuICovCi0gICAgaWYgKGN0eC0+YnVmID09IE5VTEwpIHsKLSAgICAgICAgLyogdXNlIHRoZSBoZWFwIHNvIGl0IHdpbGwgZ2V0IGZyZWUnZCBhZnRlciBiZWluZyBmbHVzaGVkICovCi0gICAgICAgIGN0eC0+YXZhaWwgPSBBUF9NSU5fQllURVNfVE9fV1JJVEU7Ci0gICAgICAgIGN0eC0+YnVmID0gY3R4LT5jdXIgPSBtYWxsb2MoY3R4LT5hdmFpbCk7Ci0gICAgfQotCi0gICAgLyogc3F1ZWV6ZSB0aGUgZGF0YSBpbnRvIHRoZSBleGlzdGluZyBidWZmZXIgKi8KLSAgICBpZiAobGVuIDw9IGN0eC0+YXZhaWwpIHsKLSAgICAgICAgbWVtY3B5KGN0eC0+Y3VyLCBzdHIsIGxlbik7Ci0gICAgICAgIGN0eC0+Y3VyICs9IGxlbjsKLSAgICAgICAgaWYgKChjdHgtPmF2YWlsIC09IGxlbikgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBmbHVzaF9idWZmZXIociwgY3R4LCBOVUxMLCAwKTsKLSAgICAgICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotICAgIH0KLQotICAgIC8qIHRoZSBuZXcgY29udGVudCBjYW4ndCBmaXQgaW4gdGhlIGV4aXN0aW5nIGJ1ZmZlciAqLwotCi0gICAgaWYgKGxlbiA+PSBBUF9NSU5fQllURVNfVE9fV1JJVEUpIHsKLSAgICAgICAgLyogaXQgaXMgcmVhbGx5IGJpZy4gc2VuZCB3aGF0IHdlIGhhdmUsIGFuZCB0aGUgbmV3IHN0dWZmLiAqLwotICAgICAgICByZXR1cm4gZmx1c2hfYnVmZmVyKHIsIGN0eCwgc3RyLCBsZW4pOwotICAgIH0KLQotICAgIC8qIHRoZSBuZXcgZGF0YSBpcyBzbWFsbC4gcHV0IHNvbWUgaW50byB0aGUgY3VycmVudCBidWZmZXIsIGZsdXNoIGl0LAotICAgICAgIGFuZCB0aGVuIGRyb3AgdGhlIHJlbWFpbmluZyBpbnRvIGEgbmV3IGJ1ZmZlci4gKi8KLSAgICBhbXQgPSBjdHgtPmF2YWlsOwotICAgIG1lbWNweShjdHgtPmN1ciwgc3RyLCBhbXQpOwotICAgIGN0eC0+Y3VyICs9IGFtdDsKLSAgICBjdHgtPmF2YWlsID0gMDsKLSAgICBpZiAoKHN0YXR1cyA9IGZsdXNoX2J1ZmZlcihyLCBjdHgsIE5VTEwsIDApKSAhPSBBUFJfU1VDQ0VTUykKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLQotICAgIGN0eC0+YnVmID0gbWFsbG9jKEFQX01JTl9CWVRFU19UT19XUklURSk7Ci0gICAgbWVtY3B5KGN0eC0+YnVmLCBzdHIgKyBhbXQsIGxlbiAtIGFtdCk7Ci0gICAgY3R4LT5jdXIgPSBjdHgtPmJ1ZiArIChsZW4gLSBhbXQpOwotICAgIGN0eC0+YXZhaWwgPSBBUF9NSU5fQllURVNfVE9fV1JJVEUgLSAobGVuIC0gYW10KTsKLQotICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLX0KLQotQVBfREVDTEFSRShpbnQpIGFwX3JwdXRjKGludCBjLCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjaGFyIGMyID0gKGNoYXIpYzsKLQotICAgIGlmIChyLT5jb25uZWN0aW9uLT5hYm9ydGVkKSB7Ci0JcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGlmIChidWZmZXJfb3V0cHV0KHIsICZjMiwgMSkgIT0gQVBSX1NVQ0NFU1MpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIHJldHVybiBjOwotfQotCi1BUF9ERUNMQVJFKGludCkgYXBfcnB1dHMoY29uc3QgY2hhciAqc3RyLCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBhcHJfc2l6ZV90IGxlbjsKLQotICAgIGlmIChyLT5jb25uZWN0aW9uLT5hYm9ydGVkKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBpZiAoYnVmZmVyX291dHB1dChyLCBzdHIsIGxlbiA9IHN0cmxlbihzdHIpKSAhPSBBUFJfU1VDQ0VTUykKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgcmV0dXJuIGxlbjsKLX0KLQotQVBfREVDTEFSRShpbnQpIGFwX3J3cml0ZShjb25zdCB2b2lkICpidWYsIGludCBuYnl0ZSwgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaWYgKHItPmNvbm5lY3Rpb24tPmFib3J0ZWQpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGlmIChidWZmZXJfb3V0cHV0KHIsIGJ1ZiwgbmJ5dGUpICE9IEFQUl9TVUNDRVNTKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICByZXR1cm4gbmJ5dGU7Ci19Ci0KLUFQX0RFQ0xBUkUoaW50KSBhcF92cnByaW50ZihyZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IHZhKQotewotICAgIGNoYXIgYnVmWzQwOTZdOwotICAgIGFwcl9zaXplX3Qgd3JpdHRlbjsKLQotICAgIGlmIChyLT5jb25uZWN0aW9uLT5hYm9ydGVkKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAvKiAjIyMgZml4IHRoaXMgbWVjaGFuaXNtIHRvIGFsbG93IG1vcmUgdGhhbiA0SyBvZiBvdXRwdXQgKi8KLSAgICB3cml0dGVuID0gYXByX3ZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIHZhKTsKLSAgICBpZiAoYnVmZmVyX291dHB1dChyLCBidWYsIHdyaXR0ZW4pICE9IEFQUl9TVUNDRVNTKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICByZXR1cm4gd3JpdHRlbjsKLX0KLQotQVBfREVDTEFSRV9OT05TVEQoaW50KSBhcF9ycHJpbnRmKHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgICB2YV9saXN0IHZhOwotICAgIGludCBuOwotCi0gICAgaWYgKHItPmNvbm5lY3Rpb24tPmFib3J0ZWQpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIHZhX3N0YXJ0KHZhLCBmbXQpOwotICAgIG4gPSBhcF92cnByaW50ZihyLCBmbXQsIHZhKTsKLSAgICB2YV9lbmQodmEpOwotCi0gICAgcmV0dXJuIG47Ci19Ci0KLUFQX0RFQ0xBUkVfTk9OU1REKGludCkgYXBfcnZwdXRzKHJlcXVlc3RfcmVjICpyLCAuLi4pCi17Ci0gICAgdmFfbGlzdCB2YTsKLSAgICBjb25zdCBjaGFyICpzOwotICAgIGFwcl9zaXplX3QgbGVuOwotICAgIGFwcl9zaXplX3Qgd3JpdHRlbiA9IDA7Ci0KLSAgICBpZiAoci0+Y29ubmVjdGlvbi0+YWJvcnRlZCkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgLyogIyMjIFRPRE86IGlmIHRoZSB0b3RhbCBvdXRwdXQgaXMgbGFyZ2UsIHB1dCBhbGwgdGhlIHN0cmluZ3MKLSAgICAgICAjIyMgaW50byBhIHNpbmdsZSBicmlnYWRlLCByYXRoZXIgdGhhbiBmbHVzaGluZyBlYWNoIHRpbWUgd2UKLSAgICAgICAjIyMgZmlsbCB0aGUgYnVmZmVyICovCi0gICAgdmFfc3RhcnQodmEsIHIpOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIHMgPSB2YV9hcmcodmEsIGNvbnN0IGNoYXIgKik7Ci0gICAgICAgIGlmIChzID09IE5VTEwpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBsZW4gPSBzdHJsZW4ocyk7Ci0gICAgICAgIGlmIChidWZmZXJfb3V0cHV0KHIsIHMsIGxlbikgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHdyaXR0ZW4gKz0gbGVuOwotICAgIH0KLSAgICB2YV9lbmQodmEpOwotCi0gICAgcmV0dXJuIHdyaXR0ZW47Ci19Ci0KLUFQX0RFQ0xBUkUoaW50KSBhcF9yZmx1c2gocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgYXByX2J1Y2tldF9icmlnYWRlICpiYjsKLSAgICBhcHJfYnVja2V0ICpiOwotCi0gICAgYmIgPSBhcHJfYnJpZ2FkZV9jcmVhdGUoci0+cG9vbCk7Ci0gICAgYiA9IGFwcl9idWNrZXRfZmx1c2hfY3JlYXRlKCk7Ci0gICAgQVBSX0JSSUdBREVfSU5TRVJUX1RBSUwoYmIsIGIpOwotICAgIGlmIChhcF9wYXNzX2JyaWdhZGUoci0+b3V0cHV0X2ZpbHRlcnMsIGJiKSAhPSBBUFJfU1VDQ0VTUykKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIHJldHVybiAwOwotfQotCi1BUF9JTVBMRU1FTlRfSE9PS19SVU5fQUxMKGludCxwb3N0X3JlYWRfcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcXVlc3RfcmVjICpyKSwociksT0ssREVDTElORUQpCi1BUF9JTVBMRU1FTlRfSE9PS19SVU5fQUxMKGludCxsb2dfdHJhbnNhY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChyZXF1ZXN0X3JlYyAqciksKHIpLE9LLERFQ0xJTkVEKQotQVBfSU1QTEVNRU5UX0hPT0tfUlVOX0ZJUlNUKGNvbnN0IGNoYXIgKixodHRwX21ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgcmVxdWVzdF9yZWMgKnIpLChyKSxOVUxMKQotQVBfSU1QTEVNRU5UX0hPT0tfUlVOX0ZJUlNUKHVuc2lnbmVkIHNob3J0LGRlZmF1bHRfcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgcmVxdWVzdF9yZWMgKnIpLChyKSwwKQpkaWZmIC0tZ2l0IGEvc2VydmVyL3JlcXVlc3QuYyBiL3NlcnZlci9yZXF1ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhY2Y4ZmMuLjAwMDAwMDAKLS0tIGEvc2VydmVyL3JlcXVlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDExMjQgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBiYXNlZCB1cG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUKLSAqIG9yaWdpbmFsbHkgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsCi0gKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICovCi0KLS8qCi0gKiBodHRwX3JlcXVlc3QuYzogZnVuY3Rpb25zIHRvIGdldCBhbmQgcHJvY2VzcyByZXF1ZXN0cwotICoKLSAqIFJvYiBNY0Nvb2wgMy8yMS85MwotICoKLSAqIFRob3JvdWdobHkgcmV2YW1wZWQgYnkgcnN0IGZvciBBcGFjaGUuICBOQiB0aGlzIGZpbGUgcmVhZHMKLSAqIGJlc3QgZnJvbSB0aGUgYm90dG9tIHVwLgotICoKLSAqLwotCi0jaW5jbHVkZSAiYXByX3N0cmluZ3MuaCIKLSNpbmNsdWRlICJhcHJfZmlsZV9pby5oIgotI2luY2x1ZGUgImFwcl9mbm1hdGNoLmgiCi0KLSNkZWZpbmUgQVBSX1dBTlRfU1RSRlVOQwotI2luY2x1ZGUgImFwcl93YW50LmgiCi0KLSNkZWZpbmUgQ09SRV9QUklWQVRFCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfcmVxdWVzdC5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotI2luY2x1ZGUgInV0aWxfZmlsdGVyLmgiCi0jaW5jbHVkZSAidXRpbF9jaGFyc2V0LmgiCi0KLSNpbmNsdWRlICJtb2RfY29yZS5oIgotCi0jaWYgQVBSX0hBVkVfU1REQVJHX0gKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbmRpZgotCi1BUFJfSE9PS19TVFJVQ1QoCi0JICAgIEFQUl9IT09LX0xJTksodHJhbnNsYXRlX25hbWUpCi0JICAgIEFQUl9IT09LX0xJTksoY2hlY2tfdXNlcl9pZCkKLQkgICAgQVBSX0hPT0tfTElOSyhmaXh1cHMpCi0JICAgIEFQUl9IT09LX0xJTksodHlwZV9jaGVja2VyKQotCSAgICBBUFJfSE9PS19MSU5LKGFjY2Vzc19jaGVja2VyKQotCSAgICBBUFJfSE9PS19MSU5LKGF1dGhfY2hlY2tlcikKLQkgICAgQVBSX0hPT0tfTElOSyhpbnNlcnRfZmlsdGVyKQotKQotCi1BUF9JTVBMRU1FTlRfSE9PS19SVU5fRklSU1QoaW50LHRyYW5zbGF0ZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXF1ZXN0X3JlYyAqciksKHIpLERFQ0xJTkVEKQotQVBfSU1QTEVNRU5UX0hPT0tfUlVOX0ZJUlNUKGludCxjaGVja191c2VyX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXF1ZXN0X3JlYyAqciksKHIpLERFQ0xJTkVEKQotQVBfSU1QTEVNRU5UX0hPT0tfUlVOX0FMTChpbnQsZml4dXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAocmVxdWVzdF9yZWMgKnIpLChyKSxPSyxERUNMSU5FRCkKLUFQX0lNUExFTUVOVF9IT09LX1JVTl9GSVJTVChpbnQsdHlwZV9jaGVja2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXF1ZXN0X3JlYyAqciksKHIpLERFQ0xJTkVEKQotQVBfSU1QTEVNRU5UX0hPT0tfUlVOX0FMTChpbnQsYWNjZXNzX2NoZWNrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChyZXF1ZXN0X3JlYyAqciksKHIpLE9LLERFQ0xJTkVEKQotQVBfSU1QTEVNRU5UX0hPT0tfUlVOX0ZJUlNUKGludCxhdXRoX2NoZWNrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcXVlc3RfcmVjICpyKSwociksREVDTElORUQpCi1BUF9JTVBMRU1FTlRfSE9PS19WT0lEKGluc2VydF9maWx0ZXIsIChyZXF1ZXN0X3JlYyAqciksIChyKSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogR2V0dGluZyBhbmQgY2hlY2tpbmcgZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24uICBBbHNvIGNoZWNrcyB0aGUKLSAqIEZvbGxvd1N5bWxpbmtzIGFuZCBGb2xsb3dTeW1Pd25lciBzdHVmZiwgc2luY2UgdGhpcyBpcyByZWFsbHkgdGhlCi0gKiBvbmx5IHBsYWNlIHRoYXQgY2FuIGhhcHBlbiAoYmFycmluZyBhIG5ldyBtaWRfZGlyX3dhbGsgY2FsbG91dCkuCi0gKgotICogV2UgY2FuJ3QgZG8gaXQgYXMgYW4gYWNjZXNzX2NoZWNrZXIgbW9kdWxlIGZ1bmN0aW9uIHdoaWNoIGdldHMKLSAqIGNhbGxlZCB3aXRoIHRoZSBmaW5hbCBwZXJfZGlyX2NvbmZpZywgc2luY2Ugd2UgY291bGQgaGF2ZSBhIGRpcmVjdG9yeQotICogd2l0aCBGb2xsb3dTeW1MaW5rcyBkaXNhYmxlZCwgd2hpY2ggY29udGFpbnMgYSBzeW1saW5rIHRvIGFub3RoZXIKLSAqIHdpdGggYSAuaHRhY2Nlc3MgZmlsZSB3aGljaCB0dXJucyBGb2xsb3dTeW1MaW5rcyBiYWNrIG9uIC0tLSBhbmQKLSAqIGFjY2VzcyBpbiBzdWNoIGEgY2FzZSBtdXN0IGJlIGRlbmllZC4gIFNvLCB3aGF0ZXZlciBpdCBpcyB0aGF0Ci0gKiBjaGVja3MgRm9sbG93U3ltTGlua3MgbmVlZHMgdG8ga25vdyB0aGUgc3RhdGUgb2YgdGhlIG9wdGlvbnMgYXMKLSAqIHRoZXkgY2hhbmdlLCBhbGwgdGhlIHdheSBkb3duLgotICovCi0KLS8qCi0gKiBXZSBkb24ndCB3YW50IHBlb3BsZSBhYmxlIHRvIHNlcnZlIHVwIHBpcGVzLCBvciB1bml4IHNvY2tldHMsIG9yIG90aGVyCi0gKiBzY2FyeSB0aGluZ3MuICBOb3RlIHRoYXQgc3ltbGluayB0ZXN0cyBhcmUgcGVyZm9ybWVkIGxhdGVyLgotICovCi1zdGF0aWMgaW50IGNoZWNrX3NhZmVfZmlsZShyZXF1ZXN0X3JlYyAqcikKLXsKLQotICAgIGlmIChyLT5maW5mby5maWxldHlwZSA9PSAwICAgICAgLyogZG9lc24ndCBleGlzdCAqLwotICAgICAgICB8fCByLT5maW5mby5maWxldHlwZSA9PSBBUFJfRElSCi0gICAgICAgIHx8IHItPmZpbmZvLmZpbGV0eXBlID09IEFQUl9SRUcKLSAgICAgICAgfHwgci0+ZmluZm8uZmlsZXR5cGUgPT0gQVBSX0xOSykgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLSAgICAgICAgICAgICAgICAib2JqZWN0IGlzIG5vdCBhIGZpbGUsIGRpcmVjdG9yeSBvciBzeW1saW5rOiAlcyIsCi0gICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUpOwotICAgIHJldHVybiBIVFRQX0ZPUkJJRERFTjsKLX0KLQotCi1zdGF0aWMgaW50IGNoZWNrX3N5bWxpbmtzKGNoYXIgKmQsIGludCBvcHRzLCBhcHJfcG9vbF90ICpwKQotewotI2lmIGRlZmluZWQoT1MyKQotICAgIC8qIE9TLzIgZG9lc24ndCBoYXZlIHN5bWxpbmtzICovCi0gICAgcmV0dXJuIE9LOwotI2Vsc2UKLSAgICBhcHJfZmluZm9fdCBsZmksIGZpOwotICAgIGNoYXIgKmxhc3RwOwotICAgIGludCByZXM7Ci0KLSAgICBpZiAob3B0cyAmIE9QVF9TWU1fTElOS1MpCi0gICAgICAgIHJldHVybiBPSzsKLQotICAgIC8qCi0gICAgICogU3RyaXAgdHJhaWxpbmcgJy8nLCBpZiBhbnksIG9mZiB3aGF0IHdlJ3JlIGNoZWNraW5nOyB0cmFpbGluZyBzbGFzaGVzCi0gICAgICogbWFrZSBzb21lIHN5c3RlbXMgZm9sbG93IHN5bWxpbmtzIHRvIGRpcmVjdG9yaWVzIGV2ZW4gaW4gbHN0YXQoKS4KLSAgICAgKiBBZnRlciB3ZSd2ZSBkb25lIHRoZSBsc3RhdCwgcHV0IGl0IGJhY2suICBBbHNvLCBkb24ndCBib3RoZXIgY2hlY2tpbmcKLSAgICAgKiAnLycgYXQgYWxsLi4uCi0gICAgICogCi0gICAgICogTm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgbXVsdGlwbGUgc2xhc2hlcyBoZXJlIGJlY2F1c2Ugb2YKLSAgICAgKiBubzJzbGFzaCgpIGJlbG93Li4uCi0gICAgICovCi0KLSAgICBsYXN0cCA9IGQgKyBzdHJsZW4oZCkgLSAxOwotICAgIGlmIChsYXN0cCA9PSBkKQotICAgICAgICByZXR1cm4gT0s7ICAgICAgICAgICAgICAvKiBSb290IGRpcmVjdG9yeSwgJy8nICovCi0KLSAgICBpZiAoKmxhc3RwID09ICcvJykKLSAgICAgICAgKmxhc3RwID0gJ1wwJzsKLSAgICBlbHNlCi0gICAgICAgIGxhc3RwID0gTlVMTDsKLQotICAgIHJlcyA9IGFwcl9sc3RhdCgmbGZpLCBkLCBBUFJfRklORk9fVFlQRSB8IEFQUl9GSU5GT19PV05FUiwgcCk7Ci0KLSAgICBpZiAobGFzdHApCi0gICAgICAgICpsYXN0cCA9ICcvJzsKLQotICAgIC8qCi0gICAgICogTm90ZSB0aGF0IHdlIGRvbid0IHJlamVjdCBhY2Nlc3NlcyB0byBub25leGlzdGVudCBmaWxlcyAobXVsdGl2aWV3cyBvcgotICAgICAqIHRoZSBsaWtlIG1heSBjb25zIHVwIGEgd2F5IHRvIHJ1biB0aGUgdHJhbnNhY3Rpb24gYW55d2F5KS4uLgotICAgICAqLwotCi0gICAgaWYgKChyZXMgIT0gQVBSX1NVQ0NFU1MgJiYgcmVzICE9IEFQUl9JTkNPTVBMRVRFKQotICAgICAgICAgICB8fCAobGZpLmZpbGV0eXBlICE9IEFQUl9MTkspKQotICAgICAgICByZXR1cm4gT0s7Ci0KLSAgICAvKiBPSywgaXQncyBhIHN5bWxpbmsuICBNYXkgc3RpbGwgYmUgT0sgd2l0aCBPUFRfU1lNX09XTkVSICovCi0KLSAgICBpZiAoIShvcHRzICYgT1BUX1NZTV9PV05FUikpCi0gICAgICAgIHJldHVybiBIVFRQX0ZPUkJJRERFTjsKLQotICAgIC8qIE9QVF9TWU1fT1dORVIgb25seSB3b3JrcyBpZiB3ZSBjYW4gZ2V0IHRoZSBvd25lciBmcm9tIHRoZSBmaWxlICovCi0KLSAgICBpZiAocmVzICE9IEFQUl9TVUNDRVNTKQotICAgICAgICByZXR1cm4gSFRUUF9GT1JCSURERU47Ci0KLSAgICBpZiAoYXByX3N0YXQoJmZpLCBkLCBBUFJfRklORk9fT1dORVIsIHApICE9IEFQUl9TVUNDRVNTKQotICAgICAgICByZXR1cm4gSFRUUF9GT1JCSURERU47Ci0KLSAgICAvKiBUT0RPOiByZXBsYWNlIHdpdGggYW4gYXByX2NvbXBhcmVfdXNlcnMoKSBmbiAqLwotICAgIHJldHVybiAoZmkudXNlciA9PSBsZmkudXNlcikgPyBPSyA6IEhUVFBfRk9SQklEREVOOwotCi0jZW5kaWYKLX0KLQotLyogRGVhbGluZyB3aXRoIHRoZSBmaWxlIHN5c3RlbSB0byBnZXQgUEFUSF9JTkZPCi0gKi8KLXN0YXRpYyBpbnQgZ2V0X3BhdGhfaW5mbyhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjaGFyICpjcDsKLSAgICBjaGFyICpwYXRoID0gci0+ZmlsZW5hbWU7Ci0gICAgY2hhciAqZW5kID0gJnBhdGhbc3RybGVuKHBhdGgpXTsKLSAgICBjaGFyICpsYXN0X2NwID0gTlVMTDsKLSAgICBpbnQgcnY7Ci0jaWYgZGVmaW5lZChIQVZFX0RSSVZFX0xFVFRFUlMpIHx8IGRlZmluZWQoSEFWRV9VTkNfUEFUSFMpCi0gICAgY2hhciBiU3RyaXBTbGFzaD0xOwotI2VuZGlmCi0KLSAgICBpZiAoci0+ZmluZm8uZmlsZXR5cGUpIHsKLQkvKiBhc3N1bWUgcGF0aF9pbmZvIGFscmVhZHkgc2V0ICovCi0JcmV0dXJuIE9LOwotICAgIH0KLQotI2lmZGVmIEhBVkVfRFJJVkVfTEVUVEVSUwotICAgIC8qIElmIHRoZSBkaXJlY3RvcnkgaXMgeDpcLCB0aGVuIHdlIGRvbid0IHdhbnQgdG8gc3RyaXAKLSAgICAgKiB0aGUgdHJhaWxpbmcgc2xhc2ggc2luY2UgeDogaXMgbm90IGEgdmFsaWQgZGlyZWN0b3J5LgotICAgICAqLwotICAgIGlmIChzdHJsZW4ocGF0aCkgPT0gMyAmJiBwYXRoWzFdID09ICc6JyAmJiBwYXRoWzJdID09ICcvJykKLSAgICAgICAgYlN0cmlwU2xhc2ggPSAwOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1VOQ19QQVRIUwotICAgIC8qIElmIFVOQyBuYW1lID09IC8vbWFjaGluZS9zaGFyZS8sIGRvIG5vdCAKLSAgICAgKiBhZHZhbmNlIG92ZXIgdGhlIHRyYWlsaW5nIHNsYXNoLiAgQW55IG90aGVyCi0gICAgICogVU5DIG5hbWUgaXMgT0sgdG8gc3RyaXAgdGhlIHNsYXNoLgotICAgICAqLwotICAgIGNwID0gZW5kOwotICAgIGlmIChwYXRoWzBdID09ICcvJyAmJiBwYXRoWzFdID09ICcvJyAmJiAKLSAgICAgICAgcGF0aFsyXSAhPSAnLycgJiYgY3BbLTFdID09ICcvJykgewotICAgICAgICBjaGFyICpwOwotICAgICAgICBpbnQgaUNvdW50PTA7Ci0gICAgICAgIHAgPSBwYXRoOwotICAgICAgICB3aGlsZSAoKHAgPSBzdHJjaHIocCwnLycpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBwKys7Ci0gICAgICAgICAgICBpQ291bnQrKzsKLSAgICAgICAgfQotICAgIAotICAgICAgICBpZiAoaUNvdW50ID09IDQpCi0gICAgICAgICAgICBiU3RyaXBTbGFzaCA9IDA7Ci0gICAgfQotI2VuZGlmCi0gICAKLSNpZiBkZWZpbmVkKEhBVkVfRFJJVkVfTEVUVEVSUykgfHwgZGVmaW5lZChIQVZFX1VOQ19QQVRIUykKLSAgICBpZiAoYlN0cmlwU2xhc2gpCi0jZW5kaWYKLSAgICAgICAgLyogQWR2YW5jZSBvdmVyIHRyYWlsaW5nIHNsYXNoZXMgLi4uIE5PVCBwYXJ0IG9mIGZpbGVuYW1lIAotICAgICAgICAgKiBpZiBmaWxlIGlzIG5vdCBhIFVOQyBuYW1lIChXaW4zMiBvbmx5KS4KLSAgICAgICAgICovCi0gICAgICAgIGZvciAoY3AgPSBlbmQ7IGNwID4gcGF0aCAmJiBjcFstMV0gPT0gJy8nOyAtLWNwKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICB3aGlsZSAoY3AgPiBwYXRoKSB7Ci0KLSAgICAgICAgLyogU2VlIGlmIHRoZSBwYXRobmFtZSBlbmRpbmcgaGVyZSBleGlzdHMuLi4gKi8KLSAgICAgICAgKmNwID0gJ1wwJzsKLQotICAgICAgICAvKiAjIyMgV2Ugbm8gbG9uZ2VyIG5lZWQgdGhlIHRlc3QgYXBfb3NfaXNfZmlsZW5hbWVfdmFsaWQoKSBoZXJlIAotICAgICAgICAgKiBzaW5jZSBhcHJfc3RhdCBpc24ndCBhIHBvc2l4IHRoaW5nIC0gaXQncyBhcHJfc3RhdCdzIHJlc3BvbnNpYmlsaXR5Ci0gICAgICAgICAqIHRvIGhhbmRsZSB3aGF0ZXZlciBwYXRoIHN0cmluZyBhcnJpdmVzIGF0IGl0J3MgZG9vciAtIGJ5IHBsYXRmb3JtCi0gICAgICAgICAqIGFuZCB2b2x1bWUgcmVzdHJpY3Rpb25zIGFzIGFwcGxpY2FibGUuLi4gCi0gICAgICAgICAqIFRPRE86IFRoaXMgY29kZSBiZWNvbWVzIGV2ZW4gc2ltcGxlciBpZiBhcHJfc3RhdCBncm93cyAKLSAgICAgICAgICogYW4gQVBSX1BBVEhJTkNPTVBMRVRFIHJlc3VsdCB0byBpbmRpY2F0ZSB0aGF0IHdlIGFyZSBzdGFyaW5nIGF0Ci0gICAgICAgICAqIGFuIHBhcnRpYWwgdmlydHVhbCByb290LiAgT25seSBPUzIvV2luMzIvTmV0d2FyZSBuZWVkIGFwcGx5IGl0IDotKQotICAgICAgICAgKi8KLSAgICAgICAgcnYgPSBhcHJfc3RhdCgmci0+ZmluZm8sIHBhdGgsIEFQUl9GSU5GT19NSU4sIHItPnBvb2wpOwotCi0gICAgICAgIGlmIChjcCAhPSBlbmQpCi0gICAgICAgICAgICAqY3AgPSAnLyc7Ci0KLSAgICAgICAgaWYgKHJ2ID09IEFQUl9TVUNDRVNTIHx8IHJ2ID09IEFQUl9JTkNPTVBMRVRFKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQWhhISAgRm91bmQgc29tZXRoaW5nLiAgSWYgaXQgd2FzIGEgZGlyZWN0b3J5LCB3ZSB3aWxsIHNlYXJjaAotICAgICAgICAgICAgICogY29udGVudHMgb2YgdGhhdCBkaXJlY3RvcnkgZm9yIGEgbXVsdGlfbWF0Y2gsIHNvIHRoZSBQQVRIX0lORk8KLSAgICAgICAgICAgICAqIGFyZ3VtZW50IHN0YXJ0cyB3aXRoIHRoZSBjb21wb25lbnQgYWZ0ZXIgdGhhdC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHItPmZpbmZvLmZpbGV0eXBlID09IEFQUl9ESVIgJiYgbGFzdF9jcCkgewotICAgICAgICAgICAgICAgIHItPmZpbmZvLmZpbGV0eXBlID0gQVBSX05PRklMRTsgIC8qIE5vIHN1Y2ggZmlsZS4uLiAqLwotICAgICAgICAgICAgICAgIGNwID0gbGFzdF9jcDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgci0+cGF0aF9pbmZvID0gYXByX3BzdHJkdXAoci0+cG9vbCwgY3ApOwotICAgICAgICAgICAgKmNwID0gJ1wwJzsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKEFQUl9TVEFUVVNfSVNfRU5PRU5UKHJ2KSB8fCBBUFJfU1RBVFVTX0lTX0VOT1RESVIocnYpKSB7Ci0gICAgICAgICAgICBsYXN0X2NwID0gY3A7Ci0KLSAgICAgICAgICAgIHdoaWxlICgtLWNwID4gcGF0aCAmJiAqY3AgIT0gJy8nKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICB3aGlsZSAoY3AgPiBwYXRoICYmIGNwWy0xXSA9PSAnLycpCi0gICAgICAgICAgICAgICAgLS1jcDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmIChBUFJfU1RBVFVTX0lTX0VBQ0NFUyhydikpCi0gICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHJ2LCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjY2VzcyB0byAlcyBkZW5pZWQiLCByLT51cmkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBydiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY2Nlc3MgdG8gJXMgZmFpbGVkIiwgci0+dXJpKTsKLSAgICAgICAgICAgIHJldHVybiBIVFRQX0ZPUkJJRERFTjsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLUFQX0RFQ0xBUkUoaW50KSBkaXJlY3Rvcnlfd2FsayhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb3JlX3NlcnZlcl9jb25maWcgKnNjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcoci0+c2VydmVyLT5tb2R1bGVfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29yZV9tb2R1bGUpOwotICAgIGFwX2NvbmZfdmVjdG9yX3QgKnBlcl9kaXJfZGVmYXVsdHMgPSByLT5zZXJ2ZXItPmxvb2t1cF9kZWZhdWx0czsKLSAgICBhcF9jb25mX3ZlY3Rvcl90ICoqc2VjID0gKGFwX2NvbmZfdmVjdG9yX3QgKiopIHNjb25mLT5zZWMtPmVsdHM7Ci0gICAgaW50IG51bV9zZWMgPSBzY29uZi0+c2VjLT5uZWx0czsKLSAgICBjaGFyICp0ZXN0X2ZpbGVuYW1lOwotICAgIGNoYXIgKnRlc3RfZGlybmFtZTsKLSAgICBpbnQgcmVzOwotICAgIHVuc2lnbmVkIGksIG51bV9kaXJzOwotICAgIGludCBqLCB0ZXN0X2ZpbGVuYW1lX2xlbjsKLSNpZiBkZWZpbmVkKEhBVkVfVU5DX1BBVEhTKSB8fCBkZWZpbmVkKE5FVFdBUkUpCi0gICAgdW5zaWduZWQgaVN0YXJ0ID0gMTsKLSNlbmRpZgotICAgIGFwX2NvbmZfdmVjdG9yX3QgKmVudHJ5X2NvbmZpZzsKLSAgICBhcF9jb25mX3ZlY3Rvcl90ICp0aGlzX2NvbmY7Ci0gICAgY29yZV9kaXJfY29uZmlnICplbnRyeV9jb3JlOwotCi0gICAgLyoKLSAgICAgKiBBcmUgd2UgZGVhbGluZyB3aXRoIGEgZmlsZT8gSWYgbm90LCB3ZSBjYW4gKGhvcGVmdWx5KSBzYWZlbHkgYXNzdW1lIHdlCi0gICAgICogaGF2ZSBhIGhhbmRsZXIgdGhhdCBkb2Vzbid0IHJlcXVpcmUgb25lLCBidXQgZm9yIHNhZmV0eSdzIHNha2UsIGFuZCBzbwotICAgICAqIHdlIGhhdmUgc29tZXRoaW5nIGZpbmRfdHlwZXMoKSBjYW4gZ2V0IHNvbWV0aGluZyBvdXQgb2YsIGZha2Ugb25lLiBCdXQKLSAgICAgKiBkb24ndCBydW4gdGhyb3VnaCB0aGUgZGlyZWN0b3J5IGVudHJpZXMuCi0gICAgICovCi0KLSAgICBpZiAoci0+ZmlsZW5hbWUgPT0gTlVMTCkgewotICAgICAgICByLT5maWxlbmFtZSA9IGFwcl9wc3RyZHVwKHItPnBvb2wsIHItPnVyaSk7Ci0gICAgICAgIHItPmZpbmZvLmZpbGV0eXBlID0gQVBSX05PRklMRTsKLSAgICAgICAgci0+cGVyX2Rpcl9jb25maWcgPSBwZXJfZGlyX2RlZmF1bHRzOwotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEdvIGRvd24gdGhlIGRpcmVjdG9yeSBoaWVyYXJjaHkuICBXaGVyZSB3ZSBoYXZlIHRvIGNoZWNrIGZvciBzeW1saW5rcywKLSAgICAgKiBkbyBzby4gIFdoZXJlIGEgLmh0YWNjZXNzIGZpbGUgaGFzIHBlcm1pc3Npb24gdG8gb3ZlcnJpZGUgYW55dGhpbmcsCi0gICAgICogdHJ5IHRvIGZpbmQgb25lLiAgSWYgZWl0aGVyIG9mIHRoZXNlIHRoaW5ncyBmYWlscywgd2UgY291bGQgcG9rZQotICAgICAqIGFyb3VuZCwgc2VlIHdoeSwgYW5kIGFkanVzdCB0aGUgbG9va3VwX3JlYyBhY2NvcmRpbmdseSAtLS0gdGhpcyBtaWdodAotICAgICAqIHNhdmUgdXMgYSBjYWxsIHRvIGdldF9wYXRoX2luZm8gKHdpdGggdGhlIGF0dGVuZGFudCBzdGF0KClzKTsgaG93ZXZlciwKLSAgICAgKiBmb3IgdGhlIG1vbWVudCwgdGhhdCdzIG5vdCB3b3J0aCB0aGUgdHJvdWJsZS4KLSAgICAgKgotICAgICAqIEZha2UgZmlsZW5hbWVzIChpLmUuIHByb3h5Oikgb25seSBtYXRjaCBEaXJlY3Rvcnkgc2VjdGlvbnMuCi0gICAgICovCi0KLSAgICBpZiAoIWFwX29zX2lzX3BhdGhfYWJzb2x1dGUoci0+ZmlsZW5hbWUpKQotICAgIHsKLSAgICAgICAgY29uc3QgY2hhciAqZW50cnlfZGlyOwotCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fc2VjOyArK2opIHsKLQotICAgICAgICAgICAgZW50cnlfY29uZmlnID0gc2VjW2pdOwotICAgICAgICAgICAgZW50cnlfY29yZSA9IGFwX2dldF9tb2R1bGVfY29uZmlnKGVudHJ5X2NvbmZpZywgJmNvcmVfbW9kdWxlKTsKLSAgICAgICAgICAgIGVudHJ5X2RpciA9IGVudHJ5X2NvcmUtPmQ7Ci0KLSAgICAgICAgICAgIHRoaXNfY29uZiA9IE5VTEw7Ci0gICAgICAgICAgICBpZiAoZW50cnlfY29yZS0+cikgewotICAgICAgICAgICAgICAgIGlmICghYXBfcmVnZXhlYyhlbnRyeV9jb3JlLT5yLCByLT5maWxlbmFtZSwgMCwgTlVMTCwgMCkpCi0gICAgICAgICAgICAgICAgICAgIHRoaXNfY29uZiA9IGVudHJ5X2NvbmZpZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGVudHJ5X2NvcmUtPmRfaXNfZm5tYXRjaCkgewotICAgICAgICAgICAgICAgIGlmICghYXByX2ZubWF0Y2goZW50cnlfZGlyLCByLT5maWxlbmFtZSwgMCkpCi0gICAgICAgICAgICAgICAgICAgIHRoaXNfY29uZiA9IGVudHJ5X2NvbmZpZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJuY21wKHItPmZpbGVuYW1lLCBlbnRyeV9kaXIsIHN0cmxlbihlbnRyeV9kaXIpKSkKLSAgICAgICAgICAgICAgICB0aGlzX2NvbmYgPSBlbnRyeV9jb25maWc7Ci0KLSAgICAgICAgICAgIGlmICh0aGlzX2NvbmYpCi0gICAgICAgICAgICAgICAgcGVyX2Rpcl9kZWZhdWx0cyA9IGFwX21lcmdlX3Blcl9kaXJfY29uZmlncyhyLT5wb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyX2Rpcl9kZWZhdWx0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfY29uZik7Ci0gICAgICAgIH0KLQotICAgICAgICByLT5wZXJfZGlyX2NvbmZpZyA9IHBlcl9kaXJfZGVmYXVsdHM7Ci0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIC8qIFhYWCBUaGlzIG5lZWRzIHRvIGJlIHJvbGxlZCBpbnRvIEFQUiwgdGhlIEFQUiBmdW5jdGlvbiB3aWxsIG5vdAotICAgICAqIGJlIGFsbG93ZWQgdG8gZm9sZCB0aGUgY2FzZSBvZiBhbnkgbm9uLWV4aXN0YW50IHNlZ21lbnQgb2YgdGhlIHBhdGg6Ci0gICAgICovCi0gICAgci0+ZmlsZW5hbWUgPSBhcF9vc19jYXNlX2Nhbm9uaWNhbF9maWxlbmFtZShyLT5wb29sLCByLT5maWxlbmFtZSk7Ci0KLSAgICAvKiBUT0RPIFRoaXMgaXMgcmF0aGVyIHNpbGx5IHJpZ2h0IGhlcmUsIHdlIHNob3VsZCBzaW1wbHkgYmUgc2V0dGluZwotICAgICAqIGZpbGVuYW1lIGFuZCBwYXRoX2luZm8gYXQgdGhlIGVuZCBvZiBvdXIgZGlyZWN0b3J5X3dhbGsKLSAgICAgKi8KLSAgICByZXMgPSBnZXRfcGF0aF9pbmZvKHIpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICAvKiBYWFggVGhpcyBiZWNvbWVzIG1vb3QsIGFuZCB3aWxsIGFscmVhZHkgaGFwcGVuIGFib3ZlIGZvciBlbGVtZW50cwotICAgICAqIHRoYXQgYWN0dWFsbHkgZXhpc3Q6Ci0gICAgICovCi0gICAgci0+ZmlsZW5hbWUgPSBhcF9vc19jYW5vbmljYWxfZmlsZW5hbWUoci0+cG9vbCwgci0+ZmlsZW5hbWUpOwotCi0gICAgdGVzdF9maWxlbmFtZSA9IGFwcl9wc3RyZHVwKHItPnBvb2wsIHItPmZpbGVuYW1lKTsKLQotICAgIC8qIFhYWCBUaGlzIGJlY29tZXMgbXV0ZSwgc2luY2UgdGhlIEFQUiBjYW5vbmljYWwgcGFyc2luZyB3aWxsIGhhbmRsZQotICAgICAqIDJzbGFzaCBhbmQgZG90IGRpcmVjdG9yeSBpc3N1ZXM6Ci0gICAgICovCi0gICAgYXBfbm8yc2xhc2godGVzdF9maWxlbmFtZSk7Ci0gICAgbnVtX2RpcnMgPSBhcF9jb3VudF9kaXJzKHRlc3RfZmlsZW5hbWUpOwotCi0gICAgLyogWFhYIFRoaXMgbmVlZHMgdG8gYmUgcm9sbGVkIGludG8gQVBSOiAqLwotICAgIGlmICgocmVzID0gY2hlY2tfc2FmZV9maWxlKHIpKSkgewotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIHRlc3RfZmlsZW5hbWVfbGVuID0gc3RybGVuKHRlc3RfZmlsZW5hbWUpOwotICAgIGlmICh0ZXN0X2ZpbGVuYW1lW3Rlc3RfZmlsZW5hbWVfbGVuIC0gMV0gPT0gJy8nKQotICAgICAgICAtLW51bV9kaXJzOwotCi0gICAgaWYgKHItPmZpbmZvLmZpbGV0eXBlID09IEFQUl9ESVIpCi0gICAgICAgICsrbnVtX2RpcnM7Ci0KLSAgICAvKgotICAgICAqIFdlIHdpbGwgdXNlIHRlc3RfZGlybmFtZSBhcyBzY3JhdGNoIHNwYWNlIHdoaWxlIHdlIGJ1aWxkIGRpcmVjdG9yeQotICAgICAqIG5hbWVzIGR1cmluZyB0aGUgd2Fsay4gIFByb2ZpbGluZyBzaG93cyBkaXJlY3Rvcnlfd2FsayB0byBiZSBhIGJ1c3kKLSAgICAgKiBmdW5jdGlvbiBzbyB3ZSB0cnkgdG8gYXZvaWQgYWxsb2NhdGluZyBsb3RzIG9mIGV4dHJhIG1lbW9yeSBoZXJlLgotICAgICAqIFdlIG5lZWQgMiBleHRyYSBieXRlcywgb25lIGZvciB0cmFpbGluZyBcMCBhbmQgb25lIGJlY2F1c2UKLSAgICAgKiBtYWtlX2RpcnN0cl9wcmVmaXggd2lsbCBhZGQgcG90ZW50aWFsbHkgb25lIGV4dHJhIC8uCi0gICAgICovCi0gICAgdGVzdF9kaXJuYW1lID0gYXByX3BhbGxvYyhyLT5wb29sLCB0ZXN0X2ZpbGVuYW1lX2xlbiArIDIpOwotCi0gICAgLyogWFhYIFRoZXNlIGV4Y2VwdGlvbiBjYXNlcyBnbyBhd2F5IGlmIGFwcl9zdGF0KCkgcmV0dXJucyB0aGUKLSAgICAgKiBBUFJfUEFUSElOQ09NUExFVEUgc3RhdHVzLCBzbyB3ZSBza2lwIGhhcmQgZmlsZXN5c3RlbSB0ZXN0aW5nCi0gICAgICogb2YgdGhlIGluaXRpYWwgJ3BzZXVkbycgZWxlbWVudHM6Ci0gICAgICovCi0KLSNpZiBkZWZpbmVkKEhBVkVfVU5DX1BBVEhTKQotICAgIC8qIElmIHRoZSBuYW1lIGlzIGEgVU5DIG5hbWUsIHRoZW4gZG8gbm90IHBlcmZvcm0gYW55IHRydWUgZmlsZSB0ZXN0Ci0gICAgICogYWdhaW5zdCB0aGUgbWFjaGluZSBuYW1lIChzdGFydCBhdCAvL21hY2hpbmUvc2hhcmUvKQotICAgICAqIFRoaXMgaXMgb3B0aW1pemVkIHRvIHVzZSB0aGUgbm9ybWFsIHdhbGsgKHNraXBzIHRoZSByZWR1bmRhbnQgJy8nIHJvb3QpCi0gICAgICovCi0gICAgaWYgKG51bV9kaXJzID4gMyAmJiB0ZXN0X2ZpbGVuYW1lWzBdID09ICcvJyAmJiB0ZXN0X2ZpbGVuYW1lWzFdID09ICcvJykKLSAgICAgICAgaVN0YXJ0ID0gNDsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChORVRXQVJFKQotICAgIC8qIElmIHRoZSBuYW1lIGlzIGEgZnVsbHkgcXVhbGlmaWVkIHZvbHVtZSBuYW1lLCB0aGVuIGRvIG5vdCBwZXJmb3JtIGFueQotICAgICAqIHRydWUgZmlsZSB0ZXN0IG9uIHRoZSBtYWNoaW5lIG5hbWUgKHN0YXJ0IGF0IG1hY2hpbmUvc2hhcmU6LykKLSAgICAgKiBYWFg6IFRoZSBpbXBsZW1lbnRhdGlvbiBlbHVkZXMgbWUgYXQgdGhpcyBtb21lbnQuLi4gCi0gICAgICogICAgICBEb2VzIHRoaXMgbWFrZSBzZW5zZT8gIFBsZWFzZSB0ZXN0IQotICAgICAqLwotICAgIGlmIChudW1fZGlycyA+IDEgJiYgc3RyY2hyKHRlc3RfZmlsZW5hbWUsICcvJykgPCBzdHJjaHIodGVzdF9maWxlbmFtZSwgJzonKSkKLSAgICAgICAgaVN0YXJ0ID0gMjsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChIQVZFX0RSSVZFX0xFVFRFUlMpIHx8IGRlZmluZWQoTkVUV0FSRSkKLSAgICAvKiBTaG91bGQgbWF0Y2ggPERpcmVjdG9yeT4gc2VjdGlvbnMgc3RhcnRpbmcgZnJvbSAnLycsIG5vdCAnZTovJyAKLSAgICAgKiAoZm9yIGV4YW1wbGUpLiAgV0lOMzIvT1MyL05FVFdBUkUgZG8gbm90IGhhdmUgYSBzaW5nbGUgcm9vdCBkaXJlY3RvcnksCi0gICAgICogdGhleSBoYXZlIG9uZSBmb3IgZWFjaCBmaWxlc3lzdGVtLiAgVHJhZGl0aW9uYWxseSwgQXBhY2hlIGhhcyB0cmVhdGVkIAotICAgICAqIDxEaXJlY3RvcnkgLz4gcGVybWlzc2lvbnMgYXMgdGhlIGJhc2UgZm9yIHRoZSB3aG9sZSBzZXJ2ZXIsIGFuZCB0aGlzIAotICAgICAqIHRyYWRpdGlvbiBzaG91bGQgcHJvYmFibHkgYmUgcHJlc2VydmVkLiAKLSAgICAgKgotICAgICAqIE5PVEU6IE1VU1QgU1lOQyBXSVRIIGFwX21ha2VfZGlyc3RyX3ByZWZpeCgpIENIQU5HRSBJTiBzcmMvbWFpbi91dGlsLmMKLSAgICAgKi8KLSAgICBpZiAodGVzdF9maWxlbmFtZVswXSA9PSAnLycpCi0gICAgICAgIGkgPSAxOwotICAgIGVsc2UKLSAgICAgICAgaSA9IDA7Ci0jZWxzZQotICAgIC8qIE5vcm1hbCBGaWxlIFN5c3RlbXMgYXJlIHJvb3RlZCBhdCAvICovCi0gICAgaSA9IDE7Ci0jZW5kaWYgLyogZGVmIEhBVkVfRFJJVkVfTEVUVEVSUyB8fCBORVRXQVJFICovCi0KLSAgICAvKiBqIGtlZXBzIHRyYWNrIG9mIHdoaWNoIHNlY3Rpb24gd2UncmUgb24sIHNlZSBjb3JlX3Jlb3JkZXJfZGlyZWN0b3JpZXMgKi8KLSAgICBqID0gMDsKLSAgICBmb3IgKDsgaSA8PSBudW1fZGlyczsgKytpKSB7Ci0gICAgICAgIGludCBvdmVycmlkZXNfaGVyZTsKLSAgICAgICAgY29yZV9kaXJfY29uZmlnICpjb3JlX2RpciA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHBlcl9kaXJfZGVmYXVsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29yZV9tb2R1bGUpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFhYWDogdGhpcyBjb3VsZCBiZSBtYWRlIGZhc3RlciBieSBvbmx5IGNvcHlpbmcgdGhlIG5leHQgY29tcG9uZW50Ci0gICAgICAgICAqIHJhdGhlciB0aGFuIGNvcHlpbmcgdGhlIGVudGlyZSB0aGluZyBhbGwgb3Zlci4KLSAgICAgICAgICovCi0gICAgICAgIGFwX21ha2VfZGlyc3RyX3ByZWZpeCh0ZXN0X2Rpcm5hbWUsIHRlc3RfZmlsZW5hbWUsIGkpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIERvIHN5bWxpbmsgY2hlY2tzIGZpcnN0LCBiZWNhdXNlIHRoZXkgYXJlIGRvbmUgd2l0aCB0aGUKLSAgICAgICAgICogcGVybWlzc2lvbnMgYXBwcm9wcmlhdGUgdG8gdGhlICpwYXJlbnQqIGRpcmVjdG9yeS4uLgotICAgICAgICAgKi8KLQotI2lmIGRlZmluZWQoSEFWRV9VTkNfUEFUSFMpIHx8IGRlZmluZWQoTkVUV0FSRSkKLSAgICAgICAgLyogVGVzdCBvbmx5IGxlZ2FsIG5hbWVzIGFnYWluc3QgdGhlIHJlYWwgZmlsZXN5c3RlbSAqLwotICAgICAgICBpZiAoaSA+PSBpU3RhcnQpCi0jZW5kaWYKLSAgICAgICAgaWYgKChyZXMgPSBjaGVja19zeW1saW5rcyh0ZXN0X2Rpcm5hbWUsIGNvcmVfZGlyLT5vcHRzLCByLT5wb29sKSkpIHsKLSAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiU3ltYm9saWMgbGluayBub3QgYWxsb3dlZDogJXMiLCB0ZXN0X2Rpcm5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEJlZ2luICp0aGlzKiBsZXZlbCBieSBsb29raW5nIGZvciBtYXRjaGluZyA8RGlyZWN0b3J5PiBzZWN0aW9ucwotICAgICAgICAgKiBmcm9tIGFjY2Vzcy5jb25mLgotICAgICAgICAgKi8KLQotICAgICAgICBmb3IgKDsgaiA8IG51bV9zZWM7ICsraikgewotICAgICAgICAgICAgY2hhciAqZW50cnlfZGlyOwotCi0gICAgICAgICAgICBlbnRyeV9jb25maWcgPSBzZWNbal07Ci0gICAgICAgICAgICBlbnRyeV9jb3JlID0gYXBfZ2V0X21vZHVsZV9jb25maWcoZW50cnlfY29uZmlnLCAmY29yZV9tb2R1bGUpOwotICAgICAgICAgICAgZW50cnlfZGlyID0gZW50cnlfY29yZS0+ZDsKLQotICAgICAgICAgICAgaWYgKGVudHJ5X2NvcmUtPnIKLQkJfHwgIWFwX29zX2lzX3BhdGhfYWJzb2x1dGUoZW50cnlfZGlyKQotI2lmIGRlZmluZWQoSEFWRV9EUklWRV9MRVRURVJTKSB8fCBkZWZpbmVkKE5FVFdBUkUpCi0gICAgLyogVG8gYWNjb3VudCBmb3IgdGhlIHRvcC1sZXZlbCAiLyIgZGlyZWN0b3J5IHdoZW4gaSA9PSAwIAotICAgICAqIFhYWDogVGhlIG5ldCB0ZXN0IG1heSBiZSB3cm9uZy4uLiBtYXkgZmFpbCBhcF9vc19pc19wYXRoX2Fic29sdXRlCi0gICAgICovCi0gICAgICAgICAgICAgICAgfHwgKGVudHJ5X2NvcmUtPmRfY29tcG9uZW50cyA+IDEKLSAgICAgICAgICAgICAgICAgICAgJiYgZW50cnlfY29yZS0+ZF9jb21wb25lbnRzID4gaSkKLSNlbHNlCi0gICAgICAgICAgICAgICAgfHwgZW50cnlfY29yZS0+ZF9jb21wb25lbnRzID4gaQotI2VuZGlmIC8qIGRlZiBIQVZFX0RSSVZFX0xFVFRFUlMgfHwgTkVUV0FSRSAqLwotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgdGhpc19jb25mID0gTlVMTDsKLSAgICAgICAgICAgIGlmIChlbnRyeV9jb3JlLT5kX2lzX2ZubWF0Y2gpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWFwcl9mbm1hdGNoKGVudHJ5X2RpciwgdGVzdF9kaXJuYW1lLCBGTk1fUEFUSE5BTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXNfY29uZiA9IGVudHJ5X2NvbmZpZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKHRlc3RfZGlybmFtZSwgZW50cnlfZGlyKSkKLSAgICAgICAgICAgICAgICB0aGlzX2NvbmYgPSBlbnRyeV9jb25maWc7Ci0KLSAgICAgICAgICAgIGlmICh0aGlzX2NvbmYpIHsKLSAgICAgICAgICAgICAgICBwZXJfZGlyX2RlZmF1bHRzID0gYXBfbWVyZ2VfcGVyX2Rpcl9jb25maWdzKHItPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJfZGlyX2RlZmF1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19jb25mKTsKLSAgICAgICAgICAgICAgICBjb3JlX2RpciA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHBlcl9kaXJfZGVmYXVsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29yZV9tb2R1bGUpOwotICAgICAgICAgICAgfQotI2lmIGRlZmluZWQoSEFWRV9EUklWRV9MRVRURVJTKSB8fCBkZWZpbmVkKE5FVFdBUkUpCi0gICAgICAgICAgICAvKiBTbyB0aGF0IG90aGVyIHRvcC1sZXZlbCBkaXJlY3Rvcnkgc2VjdGlvbnMgKGUuZy4gImU6LyIpIGFyZW4ndAotICAgICAgICAgICAgICogc2tpcHBlZCB3aGVuIGkgPT0gMAotICAgICAgICAgICAgICogWFhYOiBJIGRvbid0IGdldCB5b3UgaGVyZSwgVGltLi4uIFRoYXQncyBhIGxldmVsIDEgc2VjdGlvbiwgYnV0Ci0gICAgICAgICAgICAgKiAgICAgIHdlIGFyZSBhdCBsZXZlbCAwLiBEaWQgeW91IG1lYW4gZmFzdC1mb3J3YXJkIHRvIHRoZSBuZXh0PwotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBlbHNlIGlmICghaSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSNlbmRpZiAvKiBkZWYgSEFWRV9EUklWRV9MRVRURVJTIHx8IE5FVFdBUkUgKi8KLSAgICAgICAgfQotICAgICAgICBvdmVycmlkZXNfaGVyZSA9IGNvcmVfZGlyLT5vdmVycmlkZTsKLQotICAgICAgICAvKiBJZiAuaHRhY2Nlc3MgZmlsZXMgYXJlIGVuYWJsZWQsIGNoZWNrIGZvciBvbmUuICovCi0KLSNpZiBkZWZpbmVkKEhBVkVfVU5DX1BBVEhTKSB8fCBkZWZpbmVkKE5FVFdBUkUpCi0gICAgICAgIC8qIFRlc3Qgb25seSBsZWdhbCBuYW1lcyBhZ2FpbnN0IHRoZSByZWFsIGZpbGVzeXN0ZW0gKi8KLSAgICAgICAgaWYgKGkgPj0gaVN0YXJ0KQotI2VuZGlmCi0gICAgICAgIGlmIChvdmVycmlkZXNfaGVyZSkgewotICAgICAgICAgICAgYXBfY29uZl92ZWN0b3JfdCAqaHRhY2Nlc3NfY29uZiA9IE5VTEw7Ci0KLSAgICAgICAgICAgIHJlcyA9IGFwX3BhcnNlX2h0YWNjZXNzKCZodGFjY2Vzc19jb25mLCByLCBvdmVycmlkZXNfaGVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcl9wc3RyZHVwKHItPnBvb2wsIHRlc3RfZGlybmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29uZi0+YWNjZXNzX25hbWUpOwotICAgICAgICAgICAgaWYgKHJlcykKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwotCi0gICAgICAgICAgICBpZiAoaHRhY2Nlc3NfY29uZikgewotICAgICAgICAgICAgICAgIHBlcl9kaXJfZGVmYXVsdHMgPSBhcF9tZXJnZV9wZXJfZGlyX2NvbmZpZ3Moci0+cG9vbCwKLQkJCQkJCQkgICAgcGVyX2Rpcl9kZWZhdWx0cywKLQkJCQkJCQkgICAgaHRhY2Nlc3NfY29uZik7Ci0JCXItPnBlcl9kaXJfY29uZmlnID0gcGVyX2Rpcl9kZWZhdWx0czsKLQkgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUaGVyZSdzIHR3byB0eXBlcyBvZiBJU19TUEVDSUFMIHNlY3Rpb25zIChzZWUgaHR0cF9jb3JlLmMpLCBhbmQgd2UndmUKLSAgICAgKiBhbHJlYWR5IGhhbmRsZWQgdGhlIHByb3h5Oi1zdHlsZSBzdHVmZi4gIE5vdyB3ZSdsbCBkZWFsIHdpdGggdGhlCi0gICAgICogcmVnZXhlcy4KLSAgICAgKi8KLSAgICBmb3IgKDsgaiA8IG51bV9zZWM7ICsraikgewotCi0gICAgICAgIGVudHJ5X2NvbmZpZyA9IHNlY1tqXTsKLSAgICAgICAgZW50cnlfY29yZSA9IGFwX2dldF9tb2R1bGVfY29uZmlnKGVudHJ5X2NvbmZpZywgJmNvcmVfbW9kdWxlKTsKLQotICAgICAgICBpZiAoZW50cnlfY29yZS0+cikgewotICAgICAgICAgICAgaWYgKCFhcF9yZWdleGVjKGVudHJ5X2NvcmUtPnIsIHRlc3RfZGlybmFtZSwgMCwgTlVMTCwgUkVHX05PVEVPTCkpIHsKLSAgICAgICAgICAgICAgICBwZXJfZGlyX2RlZmF1bHRzID0gYXBfbWVyZ2VfcGVyX2Rpcl9jb25maWdzKHItPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJfZGlyX2RlZmF1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlfY29uZmlnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByLT5wZXJfZGlyX2NvbmZpZyA9IHBlcl9kaXJfZGVmYXVsdHM7Ci0KLSAgICAvKgotICAgICAqIFN5bWxpbmsgcGVybWlzc2lvbnMgYXJlIGRldGVybWluZWQgYnkgdGhlIHBhcmVudC4gIElmIHRoZSByZXF1ZXN0IGlzCi0gICAgICogZm9yIGEgZGlyZWN0b3J5IHRoZW4gYXBwbHlpbmcgdGhlIHN5bWxpbmsgdGVzdCBoZXJlIHdvdWxkIHVzZSB0aGUKLSAgICAgKiBwZXJtaXNzaW9ucyBvZiB0aGUgZGlyZWN0b3J5IGFzIG9wcG9zZWQgdG8gaXRzIHBhcmVudC4gIENvbnNpZGVyIGEKLSAgICAgKiBzeW1saW5rIHBvaW50aW5nIHRvIGEgZGlyIHdpdGggYSAuaHRhY2Nlc3MgZGlzYWxsb3dpbmcgc3ltbGlua3MuICBJZgotICAgICAqIHlvdSBhY2Nlc3MgL3N5bWxpbmsgKG9yIC9zeW1saW5rLykgeW91IHdvdWxkIGdldCBhIDQwMyB3aXRob3V0IHRoaXMKLSAgICAgKiBTX0lTRElSIHRlc3QuICBCdXQgaWYgeW91IGFjY2Vzc2VkIC9zeW1saW5rL2luZGV4Lmh0bWwsIGZvciBleGFtcGxlLAotICAgICAqIHlvdSB3b3VsZCAqbm90KiBnZXQgdGhlIDQwMy4KLSAgICAgKi8KLSAgICBpZiAoci0+ZmluZm8uZmlsZXR5cGUgIT0gQVBSX0RJUgotICAgICAgICAmJiAocmVzID0gY2hlY2tfc3ltbGlua3Moci0+ZmlsZW5hbWUsIGFwX2FsbG93X29wdGlvbnMociksIHItPnBvb2wpKSkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotICAgICAgICAgICAgICAgICAgICAiU3ltYm9saWMgbGluayBub3QgYWxsb3dlZDogJXMiLCByLT5maWxlbmFtZSk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotICAgIHJldHVybiBPSzsgICAgICAgICAgICAgICAgICAvKiBDYW4gb25seSAiZmFpbCIgaWYgYWNjZXNzIGRlbmllZCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3ltbGluayBnb29wLiAqLwotfQotCi1BUF9ERUNMQVJFKGludCkgbG9jYXRpb25fd2FsayhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb3JlX3NlcnZlcl9jb25maWcgKnNjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcoci0+c2VydmVyLT5tb2R1bGVfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29yZV9tb2R1bGUpOwotICAgIGFwX2NvbmZfdmVjdG9yX3QgKnBlcl9kaXJfZGVmYXVsdHMgPSByLT5wZXJfZGlyX2NvbmZpZzsKLSAgICBhcF9jb25mX3ZlY3Rvcl90ICoqdXJsID0gKGFwX2NvbmZfdmVjdG9yX3QgKiopIHNjb25mLT5zZWNfdXJsLT5lbHRzOwotICAgIGludCBsZW4sIG51bV91cmwgPSBzY29uZi0+c2VjX3VybC0+bmVsdHM7Ci0gICAgY2hhciAqdGVzdF9sb2NhdGlvbjsKLSAgICBhcF9jb25mX3ZlY3Rvcl90ICp0aGlzX2NvbmY7Ci0gICAgYXBfY29uZl92ZWN0b3JfdCAqZW50cnlfY29uZmlnOwotICAgIGNvcmVfZGlyX2NvbmZpZyAqZW50cnlfY29yZTsKLSAgICBjaGFyICplbnRyeV91cmw7Ci0gICAgaW50IGo7Ci0KLSAgICBpZiAoIW51bV91cmwpIHsKLQlyZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgLyogTG9jYXRpb24gYW5kIExvY2F0aW9uTWF0Y2ggZGlmZmVyIG9uIHRoZWlyIGJlaGF2aW91ciB3LnIudC4gbXVsdGlwbGUKLSAgICAgKiBzbGFzaGVzLiAgTG9jYXRpb24gbWF0Y2hlcyBtdWx0aXBsZSBzbGFzaGVzIHdpdGggYSBzaW5nbGUgc2xhc2gsCi0gICAgICogTG9jYXRpb25NYXRjaCBkb2Vzbid0LiAgQW4gZXhjZXB0aW9uLCBmb3IgYmFja3dhcmRzIGJyb2tlbm5lc3MgaXMKLSAgICAgKiBhYnNvbHV0ZVVSSXMuLi4gaW4gd2hpY2ggY2FzZSBuZWl0aGVyIG1hdGNoIG11bHRpcGxlIHNsYXNoZXMuCi0gICAgICovCi0gICAgaWYgKHItPnVyaVswXSAhPSAnLycpIHsKLQl0ZXN0X2xvY2F0aW9uID0gci0+dXJpOwotICAgIH0KLSAgICBlbHNlIHsKLQl0ZXN0X2xvY2F0aW9uID0gYXByX3BzdHJkdXAoci0+cG9vbCwgci0+dXJpKTsKLQlhcF9ubzJzbGFzaCh0ZXN0X2xvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICAvKiBHbyB0aHJvdWdoIHRoZSBsb2NhdGlvbiBlbnRyaWVzLCBhbmQgY2hlY2sgZm9yIG1hdGNoZXMuICovCi0KLSAgICAvKiB3ZSBhcHBseSB0aGUgZGlyZWN0aXZlIHNlY3Rpb25zIGluIHNvbWUgb3JkZXI7Ci0gICAgICogc2hvdWxkIHJlYWxseSB0cnkgdGhlbSB3aXRoIHRoZSBtb3N0IGdlbmVyYWwgZmlyc3QuCi0gICAgICovCi0gICAgZm9yIChqID0gMDsgaiA8IG51bV91cmw7ICsraikgewotCi0JZW50cnlfY29uZmlnID0gdXJsW2pdOwotCi0JZW50cnlfY29yZSA9IGFwX2dldF9tb2R1bGVfY29uZmlnKGVudHJ5X2NvbmZpZywgJmNvcmVfbW9kdWxlKTsKLQllbnRyeV91cmwgPSBlbnRyeV9jb3JlLT5kOwotCi0JbGVuID0gc3RybGVuKGVudHJ5X3VybCk7Ci0KLQl0aGlzX2NvbmYgPSBOVUxMOwotCi0JaWYgKGVudHJ5X2NvcmUtPnIpIHsKLQkgICAgaWYgKCFhcF9yZWdleGVjKGVudHJ5X2NvcmUtPnIsIHItPnVyaSwgMCwgTlVMTCwgMCkpCi0JCXRoaXNfY29uZiA9IGVudHJ5X2NvbmZpZzsKLQl9Ci0JZWxzZSBpZiAoZW50cnlfY29yZS0+ZF9pc19mbm1hdGNoKSB7Ci0JICAgIGlmICghYXByX2ZubWF0Y2goZW50cnlfdXJsLCB0ZXN0X2xvY2F0aW9uLCBGTk1fUEFUSE5BTUUpKSB7Ci0JCXRoaXNfY29uZiA9IGVudHJ5X2NvbmZpZzsKLQkgICAgfQotCX0KLQllbHNlIGlmICghc3RybmNtcCh0ZXN0X2xvY2F0aW9uLCBlbnRyeV91cmwsIGxlbikgJiYKLSAgICAgICAgICAgICAgICAgKGVudHJ5X3VybFtsZW4gLSAxXSA9PSAnLycgfHwKLSAgICAgICAgICAgICAgICAgIHRlc3RfbG9jYXRpb25bbGVuXSA9PSAnLycgfHwgdGVzdF9sb2NhdGlvbltsZW5dID09ICdcMCcpKQotCSAgICB0aGlzX2NvbmYgPSBlbnRyeV9jb25maWc7Ci0KLQlpZiAodGhpc19jb25mKQotCSAgICBwZXJfZGlyX2RlZmF1bHRzID0gYXBfbWVyZ2VfcGVyX2Rpcl9jb25maWdzKHItPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcl9kaXJfZGVmYXVsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfY29uZik7Ci0gICAgfQotICAgIHItPnBlcl9kaXJfY29uZmlnID0gcGVyX2Rpcl9kZWZhdWx0czsKLQotICAgIHJldHVybiBPSzsKLX0KLQotQVBfREVDTEFSRShpbnQpIGZpbGVfd2FsayhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvbmYgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29yZV9tb2R1bGUpOwotICAgIGFwX2NvbmZfdmVjdG9yX3QgKnBlcl9kaXJfZGVmYXVsdHMgPSByLT5wZXJfZGlyX2NvbmZpZzsKLSAgICBhcF9jb25mX3ZlY3Rvcl90ICoqZmlsZSA9IChhcF9jb25mX3ZlY3Rvcl90ICoqKSBjb25mLT5zZWMtPmVsdHM7Ci0gICAgaW50IG51bV9maWxlcyA9IGNvbmYtPnNlYy0+bmVsdHM7Ci0gICAgY2hhciAqdGVzdF9maWxlOwotCi0gICAgLyogZ2V0IHRoZSBiYXNlbmFtZSAqLwotICAgIHRlc3RfZmlsZSA9IHN0cnJjaHIoci0+ZmlsZW5hbWUsICcvJyk7Ci0gICAgaWYgKHRlc3RfZmlsZSA9PSBOVUxMKSB7Ci0JdGVzdF9maWxlID0gci0+ZmlsZW5hbWU7Ci0gICAgfQotICAgIGVsc2UgewotCSsrdGVzdF9maWxlOwotICAgIH0KLQotICAgIC8qIEdvIHRocm91Z2ggdGhlIGZpbGUgZW50cmllcywgYW5kIGNoZWNrIGZvciBtYXRjaGVzLiAqLwotCi0gICAgaWYgKG51bV9maWxlcykgewotICAgICAgICBhcF9jb25mX3ZlY3Rvcl90ICp0aGlzX2NvbmY7Ci0gICAgICAgIGFwX2NvbmZfdmVjdG9yX3QgKmVudHJ5X2NvbmZpZzsKLSAgICAgICAgY29yZV9kaXJfY29uZmlnICplbnRyeV9jb3JlOwotICAgICAgICBjaGFyICplbnRyeV9maWxlOwotICAgICAgICBpbnQgajsKLQotICAgICAgICAvKiB3ZSBhcHBseSB0aGUgZGlyZWN0aXZlIHNlY3Rpb25zIGluIHNvbWUgb3JkZXI7Ci0gICAgICAgICAqIHNob3VsZCByZWFsbHkgdHJ5IHRoZW0gd2l0aCB0aGUgbW9zdCBnZW5lcmFsIGZpcnN0LgotICAgICAgICAgKi8KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bV9maWxlczsgKytqKSB7Ci0KLSAgICAgICAgICAgIGVudHJ5X2NvbmZpZyA9IGZpbGVbal07Ci0KLSAgICAgICAgICAgIGVudHJ5X2NvcmUgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhlbnRyeV9jb25maWcsICZjb3JlX21vZHVsZSk7Ci0gICAgICAgICAgICBlbnRyeV9maWxlID0gZW50cnlfY29yZS0+ZDsKLQotICAgICAgICAgICAgdGhpc19jb25mID0gTlVMTDsKLQotICAgICAgICAgICAgaWYgKGVudHJ5X2NvcmUtPnIpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWFwX3JlZ2V4ZWMoZW50cnlfY29yZS0+ciwgdGVzdF9maWxlLCAwLCBOVUxMLCAwKSkKLSAgICAgICAgICAgICAgICAgICAgdGhpc19jb25mID0gZW50cnlfY29uZmlnOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoZW50cnlfY29yZS0+ZF9pc19mbm1hdGNoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFhcHJfZm5tYXRjaChlbnRyeV9maWxlLCB0ZXN0X2ZpbGUsIEZOTV9QQVRITkFNRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpc19jb25mID0gZW50cnlfY29uZmlnOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAodGVzdF9maWxlLCBlbnRyeV9maWxlKSkgewotICAgICAgICAgICAgICAgIHRoaXNfY29uZiA9IGVudHJ5X2NvbmZpZzsKLQkgICAgfQotCi0gICAgICAgICAgICBpZiAodGhpc19jb25mKQotICAgICAgICAgICAgICAgIHBlcl9kaXJfZGVmYXVsdHMgPSBhcF9tZXJnZV9wZXJfZGlyX2NvbmZpZ3Moci0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcl9kaXJfZGVmYXVsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2NvbmYpOwotICAgICAgICB9Ci0gICAgICAgIHItPnBlcl9kaXJfY29uZmlnID0gcGVyX2Rpcl9kZWZhdWx0czsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUaGUgc3ViX3JlcXVlc3QgbWVjaGFuaXNtLgotICoKLSAqIEZucyB0byBsb29rIHVwIGEgcmVsYXRpdmUgVVJJIGZyb20sIGUuZy4sIGEgbWFwIGZpbGUgb3IgU1NJIGRvY3VtZW50LgotICogVGhlc2UgZG8gYWxsIGFjY2VzcyBjaGVja3MsIGV0Yy4sIGJ1dCBkb24ndCBhY3R1YWxseSBydW4gdGhlIHRyYW5zYWN0aW9uCi0gKiAuLi4gdXNlIHJ1bl9zdWJfcmVxIGJlbG93IGZvciB0aGF0LiAgQWxzbywgYmUgc3VyZSB0byB1c2UgZGVzdHJveV9zdWJfcmVxCi0gKiBhcyBhcHByb3ByaWF0ZSBpZiB5b3UncmUgbGlrZWx5IHRvIGJlIGNyZWF0aW5nIG1vcmUgdGhhbiBhIGZldyBvZiB0aGVzZS4KLSAqIChBbiBlYXJseSBBcGFjaGUgdmVyc2lvbiBkaWRuJ3QgZGVzdHJveSB0aGUgc3ViX3JlcXMgdXNlZCBpbiBkaXJlY3RvcnkKLSAqIGluZGV4aW5nLiAgVGhlIHJlc3VsdCwgd2hlbiBpbmRleGluZyBhIGRpcmVjdG9yeSB3aXRoIDgwMC1vZGQgZmlsZXMgaW4KLSAqIGl0LCB3YXMgbWFzc2l2ZWx5IGV4Y2Vzc2l2ZSBzdG9yYWdlIGFsbG9jYXRpb24pLgotICoKLSAqIE5vdGUgbW9yZSBtYW5pcHVsYXRpb24gb2YgcHJvdG9jb2wtc3BlY2lmaWMgdmFycyBpbiB0aGUgcmVxdWVzdAotICogc3RydWN0dXJlLi4uCi0gKi8KLQotc3RhdGljIHJlcXVlc3RfcmVjICptYWtlX3N1Yl9yZXF1ZXN0KGNvbnN0IHJlcXVlc3RfcmVjICpyKQotewotICAgIGFwcl9wb29sX3QgKnJycDsKLSAgICByZXF1ZXN0X3JlYyAqcnI7Ci0gICAgCi0gICAgYXByX3Bvb2xfY3JlYXRlKCZycnAsIHItPnBvb2wpOwotICAgIHJyID0gYXByX3BjYWxsb2MocnJwLCBzaXplb2YocmVxdWVzdF9yZWMpKTsKLSAgICByci0+cG9vbCA9IHJycDsKLSAgICByZXR1cm4gcnI7Ci19Ci0KLUFQX0NPUkVfREVDTEFSRV9OT05TVEQoYXByX3N0YXR1c190KSBhcF9zdWJfcmVxX291dHB1dF9maWx0ZXIoYXBfZmlsdGVyX3QgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcl9idWNrZXRfYnJpZ2FkZSAqYmIpCi17Ci0gICAgYXByX2J1Y2tldCAqZSA9IEFQUl9CUklHQURFX0xBU1QoYmIpOwotCi0gICAgaWYgKEFQUl9CVUNLRVRfSVNfRU9TKGUpKSB7Ci0gICAgICAgIGFwcl9idWNrZXRfZGVsZXRlKGUpOwotICAgIH0KLSAgICBhcF9wYXNzX2JyaWdhZGUoZi0+bmV4dCwgYmIpOwotICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLX0KLQotIAotQVBfREVDTEFSRShpbnQpIGFwX3NvbWVfYXV0aF9yZXF1aXJlZChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICAvKiBJcyB0aGVyZSBhIHJlcXVpcmUgbGluZSBjb25maWd1cmVkIGZvciB0aGUgdHlwZSBvZiAqdGhpcyogcmVxPyAqLwotIAotICAgIGNvbnN0IGFwcl9hcnJheV9oZWFkZXJfdCAqcmVxc19hcnIgPSBhcF9yZXF1aXJlcyhyKTsKLSAgICByZXF1aXJlX2xpbmUgKnJlcXM7Ci0gICAgaW50IGk7Ci0gCi0gICAgaWYgKCFyZXFzX2FycikKLSAgICAgICAgcmV0dXJuIDA7Ci0gCi0gICAgcmVxcyA9IChyZXF1aXJlX2xpbmUgKikgcmVxc19hcnItPmVsdHM7Ci0gCi0gICAgZm9yIChpID0gMDsgaSA8IHJlcXNfYXJyLT5uZWx0czsgKytpKQotICAgICAgICBpZiAocmVxc1tpXS5tZXRob2RfbWFzayAmICgxIDw8IHItPm1ldGhvZF9udW1iZXIpKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gCi0gICAgcmV0dXJuIDA7Ci19IAotCi1BUF9ERUNMQVJFKHJlcXVlc3RfcmVjICopIGFwX3N1Yl9yZXFfbWV0aG9kX3VyaShjb25zdCBjaGFyICptZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuZXdfZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RfcmVjICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfZmlsdGVyX3QgKm5leHRfZmlsdGVyKQotewotICAgIHJlcXVlc3RfcmVjICpybmV3OwotICAgIGludCByZXM7Ci0gICAgY2hhciAqdWRpcjsKLQotICAgIHJuZXcgPSBtYWtlX3N1Yl9yZXF1ZXN0KHIpOwotICAgIHJuZXctPmhvc3RuYW1lICAgICAgID0gci0+aG9zdG5hbWU7Ci0gICAgcm5ldy0+cmVxdWVzdF90aW1lICAgPSByLT5yZXF1ZXN0X3RpbWU7Ci0gICAgcm5ldy0+Y29ubmVjdGlvbiAgICAgPSByLT5jb25uZWN0aW9uOwotICAgIHJuZXctPnNlcnZlciAgICAgICAgID0gci0+c2VydmVyOwotCi0gICAgcm5ldy0+cmVxdWVzdF9jb25maWcgPSBhcF9jcmVhdGVfcmVxdWVzdF9jb25maWcocm5ldy0+cG9vbCk7Ci0gICAgYXBfc2V0X21vZHVsZV9jb25maWcocm5ldy0+cmVxdWVzdF9jb25maWcsICZjb3JlX21vZHVsZSwKLSAgICAgICAgICAgICAgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cmVxdWVzdF9jb25maWcsICZjb3JlX21vZHVsZSkpOwotCi0gICAgcm5ldy0+aHRhY2Nlc3MgICAgICAgPSByLT5odGFjY2VzczsKLSAgICBybmV3LT5wZXJfZGlyX2NvbmZpZyA9IHItPnNlcnZlci0+bG9va3VwX2RlZmF1bHRzOwotICAgIHJuZXctPmFsbG93ZWRfbWV0aG9kcyA9IGFwX21ha2VfbWV0aG9kX2xpc3Qocm5ldy0+cG9vbCwgMik7Ci0KLSAgICAvKiBtYWtlIGEgY29weSBvZiB0aGUgYWxsb3dlZC1tZXRob2RzIGxpc3QgKi8KLSAgICBhcF9jb3B5X21ldGhvZF9saXN0KHJuZXctPmFsbG93ZWRfbWV0aG9kcywgci0+YWxsb3dlZF9tZXRob2RzKTsKLQotICAgIC8qIHN0YXJ0IHdpdGggdGhlIHNhbWUgc2V0IG9mIG91dHB1dCBmaWx0ZXJzICovCi0gICAgaWYgKG5leHRfZmlsdGVyKSB7Ci0gICAgICAgIHJuZXctPm91dHB1dF9maWx0ZXJzID0gbmV4dF9maWx0ZXI7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBybmV3LT5vdXRwdXRfZmlsdGVycyA9IHItPm91dHB1dF9maWx0ZXJzOwotICAgIH0KLSAgICBhcF9hZGRfb3V0cHV0X2ZpbHRlcigiU1VCUkVRX0NPUkUiLCBOVUxMLCBybmV3LCBybmV3LT5jb25uZWN0aW9uKTsgCi0KLSAgICAvKiBubyBpbnB1dCBmaWx0ZXJzIGZvciBhIHN1YnJlcXVlc3QgKi8KLQotICAgIGFwX3NldF9zdWJfcmVxX3Byb3RvY29sKHJuZXcsIHIpOwotCi0gICAgLyogd291bGQgYmUgbmljZXIgdG8gcGFzcyAibWV0aG9kIiB0byBhcF9zZXRfc3ViX3JlcV9wcm90b2NvbCAqLwotICAgIHJuZXctPm1ldGhvZCA9IG1ldGhvZDsKLSAgICBybmV3LT5tZXRob2RfbnVtYmVyID0gYXBfbWV0aG9kX251bWJlcl9vZihtZXRob2QpOwotCi0gICAgaWYgKG5ld19maWxlWzBdID09ICcvJykKLSAgICAgICAgYXBfcGFyc2VfdXJpKHJuZXcsIG5ld19maWxlKTsKLSAgICBlbHNlIHsKLSAgICAgICAgdWRpciA9IGFwX21ha2VfZGlyc3RyX3BhcmVudChybmV3LT5wb29sLCByLT51cmkpOwotICAgICAgICB1ZGlyID0gYXBfZXNjYXBlX3VyaShybmV3LT5wb29sLCB1ZGlyKTsgICAgLyogcmUtZXNjYXBlIGl0ICovCi0gICAgICAgIGFwX3BhcnNlX3VyaShybmV3LCBhcF9tYWtlX2Z1bGxfcGF0aChybmV3LT5wb29sLCB1ZGlyLCBuZXdfZmlsZSkpOwotICAgIH0KLQotICAgIHJlcyA9IGFwX3VuZXNjYXBlX3VybChybmV3LT51cmkpOwotICAgIGlmIChyZXMpIHsKLSAgICAgICAgcm5ldy0+c3RhdHVzID0gcmVzOwotICAgICAgICByZXR1cm4gcm5ldzsKLSAgICB9Ci0KLSAgICBhcF9nZXRwYXJlbnRzKHJuZXctPnVyaSk7Ci0KLSAgICBpZiAoKHJlcyA9IGxvY2F0aW9uX3dhbGsocm5ldykpKSB7Ci0gICAgICAgIHJuZXctPnN0YXR1cyA9IHJlczsKLSAgICAgICAgcmV0dXJuIHJuZXc7Ci0gICAgfQotCi0gICAgcmVzID0gYXBfcnVuX3RyYW5zbGF0ZV9uYW1lKHJuZXcpOwotICAgIGlmIChyZXMpIHsKLSAgICAgICAgcm5ldy0+c3RhdHVzID0gcmVzOwotICAgICAgICByZXR1cm4gcm5ldzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFdlIGNvdWxkIGJlIGNsZXZlciBhdCB0aGlzIHBvaW50LCBhbmQgYXZvaWQgY2FsbGluZyBkaXJlY3Rvcnlfd2FsaywKLSAgICAgKiBldGMuIEhvd2V2ZXIsIHdlJ2QgbmVlZCB0byB0ZXN0IHRoYXQgdGhlIG9sZCBhbmQgbmV3IGZpbGVuYW1lcyBjb250YWluCi0gICAgICogdGhlIHNhbWUgZGlyZWN0b3J5IGNvbXBvbmVudHMsIHNvIGl0IHdvdWxkIHJlcXVpcmUgZHVwbGljYXRpbmcgdGhlCi0gICAgICogc3RhcnQgb2YgdHJhbnNsYXRlX25hbWUuIEluc3RlYWQgd2UgcmVseSBvbiB0aGUgY2FjaGUgb2YgLmh0YWNjZXNzCi0gICAgICogcmVzdWx0cy4KLSAgICAgKgotICAgICAqIE5COiBkaXJlY3Rvcnlfd2FsaygpIGNsZWFycyB0aGUgcGVyX2Rpcl9jb25maWcsIHNvIHdlIGRvbid0IGluaGVyaXQKLSAgICAgKiBmcm9tIGxvY2F0aW9uX3dhbGsoKSBhYm92ZQotICAgICAqLwotCi0gICAgaWYgKChyZXMgPSBkaXJlY3Rvcnlfd2FsayhybmV3KSkKLSAgICAgICAgfHwgKHJlcyA9IGZpbGVfd2FsayhybmV3KSkKLSAgICAgICAgfHwgKHJlcyA9IGxvY2F0aW9uX3dhbGsocm5ldykpCi0gICAgICAgIHx8ICgoYXBfc2F0aXNmaWVzKHJuZXcpID09IFNBVElTRllfQUxMCi0gICAgICAgICAgICAgfHwgYXBfc2F0aXNmaWVzKHJuZXcpID09IFNBVElTRllfTk9TUEVDKQotICAgICAgICAgICAgPyAoKHJlcyA9IGFwX3J1bl9hY2Nlc3NfY2hlY2tlcihybmV3KSkKLSAgICAgICAgICAgICAgIHx8IChhcF9zb21lX2F1dGhfcmVxdWlyZWQocm5ldykKLSAgICAgICAgICAgICAgICAgICAmJiAoKHJlcyA9IGFwX3J1bl9jaGVja191c2VyX2lkKHJuZXcpKQotICAgICAgICAgICAgICAgICAgICAgICB8fCAocmVzID0gYXBfcnVuX2F1dGhfY2hlY2tlcihybmV3KSkpKSkKLSAgICAgICAgICAgIDogKChyZXMgPSBhcF9ydW5fYWNjZXNzX2NoZWNrZXIocm5ldykpCi0gICAgICAgICAgICAgICAmJiAoIWFwX3NvbWVfYXV0aF9yZXF1aXJlZChybmV3KQotICAgICAgICAgICAgICAgICAgIHx8ICgocmVzID0gYXBfcnVuX2NoZWNrX3VzZXJfaWQocm5ldykpCi0gICAgICAgICAgICAgICAgICAgICAgIHx8IChyZXMgPSBhcF9ydW5fYXV0aF9jaGVja2VyKHJuZXcpKSkpKQotICAgICAgICAgICApCi0gICAgICAgIHx8IChyZXMgPSBhcF9ydW5fdHlwZV9jaGVja2VyKHJuZXcpKQotICAgICAgICB8fCAocmVzID0gYXBfcnVuX2ZpeHVwcyhybmV3KSkKLSAgICAgICApIHsKLSAgICAgICAgcm5ldy0+c3RhdHVzID0gcmVzOwotICAgIH0KLSAgICByZXR1cm4gcm5ldzsKLX0KLQotQVBfREVDTEFSRShyZXF1ZXN0X3JlYyAqKSBhcF9zdWJfcmVxX2xvb2t1cF91cmkoY29uc3QgY2hhciAqbmV3X2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0X3JlYyAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX2ZpbHRlcl90ICpuZXh0X2ZpbHRlcikKLXsKLSAgICByZXR1cm4gYXBfc3ViX3JlcV9tZXRob2RfdXJpKCJHRVQiLCBuZXdfZmlsZSwgciwgbmV4dF9maWx0ZXIpOwotfQotCi1BUF9ERUNMQVJFKHJlcXVlc3RfcmVjICopIGFwX3N1Yl9yZXFfbG9va3VwX2ZpbGUoY29uc3QgY2hhciAqbmV3X2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdF9yZWMgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfZmlsdGVyX3QgKm5leHRfZmlsdGVyKQotewotICAgIHJlcXVlc3RfcmVjICpybmV3OwotICAgIGludCByZXM7Ci0gICAgY2hhciAqZmRpcjsKLQotICAgIHJuZXcgPSBtYWtlX3N1Yl9yZXF1ZXN0KHIpOwotICAgIHJuZXctPmhvc3RuYW1lICAgICAgID0gci0+aG9zdG5hbWU7Ci0gICAgcm5ldy0+cmVxdWVzdF90aW1lICAgPSByLT5yZXF1ZXN0X3RpbWU7Ci0gICAgcm5ldy0+Y29ubmVjdGlvbiAgICAgPSByLT5jb25uZWN0aW9uOwotICAgIHJuZXctPnNlcnZlciAgICAgICAgID0gci0+c2VydmVyOwotCi0gICAgcm5ldy0+cmVxdWVzdF9jb25maWcgPSBhcF9jcmVhdGVfcmVxdWVzdF9jb25maWcocm5ldy0+cG9vbCk7Ci0gICAgYXBfc2V0X21vZHVsZV9jb25maWcocm5ldy0+cmVxdWVzdF9jb25maWcsICZjb3JlX21vZHVsZSwKLSAgICAgICAgICAgICAgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cmVxdWVzdF9jb25maWcsICZjb3JlX21vZHVsZSkpOwotCi0gICAgcm5ldy0+aHRhY2Nlc3MgICAgICAgPSByLT5odGFjY2VzczsKLSAgICBybmV3LT5jaHVua2VkICAgICAgICA9IHItPmNodW5rZWQ7Ci0gICAgcm5ldy0+YWxsb3dlZF9tZXRob2RzID0gYXBfbWFrZV9tZXRob2RfbGlzdChybmV3LT5wb29sLCAyKTsKLQotICAgIC8qIG1ha2UgYSBjb3B5IG9mIHRoZSBhbGxvd2VkLW1ldGhvZHMgbGlzdCAqLwotICAgIGFwX2NvcHlfbWV0aG9kX2xpc3Qocm5ldy0+YWxsb3dlZF9tZXRob2RzLCByLT5hbGxvd2VkX21ldGhvZHMpOwotCi0gICAgLyogc3RhcnQgd2l0aCB0aGUgc2FtZSBzZXQgb2Ygb3V0cHV0IGZpbHRlcnMgKi8KLSAgICBpZiAobmV4dF9maWx0ZXIpIHsKLSAgICAgICAgcm5ldy0+b3V0cHV0X2ZpbHRlcnMgPSBuZXh0X2ZpbHRlcjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJuZXctPm91dHB1dF9maWx0ZXJzID0gci0+b3V0cHV0X2ZpbHRlcnM7Ci0gICAgfQotICAgIGFwX2FkZF9vdXRwdXRfZmlsdGVyKCJTVUJSRVFfQ09SRSIsIE5VTEwsIHJuZXcsIHJuZXctPmNvbm5lY3Rpb24pOyAKLQotICAgIC8qIG5vIGlucHV0IGZpbHRlcnMgZm9yIGEgc3VicmVxdWVzdCAqLwotCi0gICAgYXBfc2V0X3N1Yl9yZXFfcHJvdG9jb2wocm5ldywgcik7Ci0gICAgZmRpciA9IGFwX21ha2VfZGlyc3RyX3BhcmVudChybmV3LT5wb29sLCByLT5maWxlbmFtZSk7Ci0KLSAgICAvKgotICAgICAqIENoZWNrIGZvciBhIHNwZWNpYWwgY2FzZS4uLiBpZiB0aGVyZSBhcmUgbm8gJy8nIGNoYXJhY3RlcnMgaW4gbmV3X2ZpbGUKLSAgICAgKiBhdCBhbGwsIHRoZW4gd2UgYXJlIGxvb2tpbmcgYXQgYSByZWxhdGl2ZSBsb29rdXAgaW4gdGhlIHNhbWUKLSAgICAgKiBkaXJlY3RvcnkuIFRoYXQgbWVhbnMgd2Ugd29uJ3QgaGF2ZSB0byByZWRvIGRpcmVjdG9yeV93YWxrLCBhbmQgd2UgbWF5Ci0gICAgICogbm90IGV2ZW4gaGF2ZSB0byByZWRvIGFjY2VzcyBjaGVja3MuCi0gICAgICovCi0KLSAgICBpZiAoYXBfc3RyY2hyX2MobmV3X2ZpbGUsICcvJykgPT0gTlVMTCkgewotICAgICAgICBjaGFyICp1ZGlyID0gYXBfbWFrZV9kaXJzdHJfcGFyZW50KHJuZXctPnBvb2wsIHItPnVyaSk7Ci0gICAgICAgIGFwcl9zdGF0dXNfdCBydjsKLQotICAgICAgICBybmV3LT51cmkgPSBhcF9tYWtlX2Z1bGxfcGF0aChybmV3LT5wb29sLCB1ZGlyLCBuZXdfZmlsZSk7Ci0gICAgICAgIHJuZXctPmZpbGVuYW1lID0gYXBfbWFrZV9mdWxsX3BhdGgocm5ldy0+cG9vbCwgZmRpciwgbmV3X2ZpbGUpOwotICAgICAgICBhcF9wYXJzZV91cmkocm5ldywgcm5ldy0+dXJpKTsgICAgLyogZmlsbCBpbiBwYXJzZWRfdXJpIHZhbHVlcyAqLwotCi0gICAgICAgIGlmICgoKHJ2ID0gYXByX3N0YXQoJnJuZXctPmZpbmZvLCBybmV3LT5maWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUFJfRklORk9fTUlOLCBybmV3LT5wb29sKSkgIT0gQVBSX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHJ2ICE9IEFQUl9JTkNPTVBMRVRFKSkgewotICAgICAgICAgICAgcm5ldy0+ZmluZm8uZmlsZXR5cGUgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChyZXMgPSBjaGVja19zYWZlX2ZpbGUocm5ldykpKSB7Ci0gICAgICAgICAgICBybmV3LT5zdGF0dXMgPSByZXM7Ci0gICAgICAgICAgICByZXR1cm4gcm5ldzsKLSAgICAgICAgfQotCi0gICAgICAgIHJuZXctPnBlcl9kaXJfY29uZmlnID0gci0+cGVyX2Rpcl9jb25maWc7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogbm8gbWF0dGVyIHdoYXQsIGlmIGl0J3MgYSBzdWJkaXJlY3RvcnksIHdlIG5lZWQgdG8gcmUtcnVuCi0gICAgICAgICAqIGRpcmVjdG9yeV93YWxrCi0gICAgICAgICAqLwotICAgICAgICBpZiAocm5ldy0+ZmluZm8uZmlsZXR5cGUgPT0gQVBSX0RJUikgewotICAgICAgICAgICAgcmVzID0gZGlyZWN0b3J5X3dhbGsocm5ldyk7Ci0gICAgICAgICAgICBpZiAoIXJlcykgewotICAgICAgICAgICAgICAgIHJlcyA9IGZpbGVfd2FsayhybmV3KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmICgocmVzID0gY2hlY2tfc3ltbGlua3Mocm5ldy0+ZmlsZW5hbWUsIGFwX2FsbG93X29wdGlvbnMocm5ldyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZXctPnBvb2wpKSkgewotICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHJuZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN5bWJvbGljIGxpbmsgbm90IGFsbG93ZWQ6ICVzIiwgcm5ldy0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIHJuZXctPnN0YXR1cyA9IHJlczsKLSAgICAgICAgICAgICAgICByZXR1cm4gcm5ldzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBkbyBhIGZpbGVfd2FsaywgaWYgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHBlcl9kaXJfY29uZmlnIHRoZW4KLSAgICAgICAgICAgICAqIHdlIGtub3cgdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHJlZG8gYWxsIHRoZSBhY2Nlc3MgY2hlY2tzCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICgocmVzID0gZmlsZV93YWxrKHJuZXcpKSkgewotICAgICAgICAgICAgICAgIHJuZXctPnN0YXR1cyA9IHJlczsKLSAgICAgICAgICAgICAgICByZXR1cm4gcm5ldzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChybmV3LT5wZXJfZGlyX2NvbmZpZyA9PSByLT5wZXJfZGlyX2NvbmZpZykgewotICAgICAgICAgICAgICAgIGlmICgocmVzID0gYXBfcnVuX3R5cGVfY2hlY2tlcihybmV3KSkgfHwgKHJlcyA9IGFwX3J1bl9maXh1cHMocm5ldykpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJuZXctPnN0YXR1cyA9IHJlczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJuZXc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0JLyogWFhYOiBAQEA6IFdoYXQgc2hvdWxkIGJlIGRvbmUgd2l0aCB0aGUgcGFyc2VkX3VyaSB2YWx1ZXM/ICovCi0JYXBfcGFyc2VfdXJpKHJuZXcsIG5ld19maWxlKTsJLyogZmlsbCBpbiBwYXJzZWRfdXJpIHZhbHVlcyAqLwotICAgICAgICAvKgotICAgICAgICAgKiBYWFg6IHRoaXMgc2hvdWxkIGJlIHNldCBwcm9wZXJseSBsaWtlIGl0IGlzIGluIHRoZSBzYW1lLWRpciBjYXNlCi0gICAgICAgICAqIGJ1dCBpdCdzIGFjdHVhbGx5IHNvbWV0aW1lcyB0byBpbXBvc3NpYmxlIHRvIGRvIGl0Li4uIGJlY2F1c2UgdGhlCi0gICAgICAgICAqIGZpbGUgbWF5IG5vdCBoYXZlIGEgdXJpIGFzc29jaWF0ZWQgd2l0aCBpdCAtZGpnCi0gICAgICAgICAqLwotICAgICAgICBybmV3LT51cmkgPSAiSU5URVJOQUxMWSBHRU5FUkFURUQgZmlsZS1yZWxhdGl2ZSByZXEiOwotICAgICAgICBybmV3LT5maWxlbmFtZSA9ICgoYXBfb3NfaXNfcGF0aF9hYnNvbHV0ZShuZXdfZmlsZSkpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXByX3BzdHJkdXAocm5ldy0+cG9vbCwgbmV3X2ZpbGUpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfbWFrZV9mdWxsX3BhdGgocm5ldy0+cG9vbCwgZmRpciwgbmV3X2ZpbGUpKTsKLSAgICAgICAgcm5ldy0+cGVyX2Rpcl9jb25maWcgPSByLT5zZXJ2ZXItPmxvb2t1cF9kZWZhdWx0czsKLSAgICAgICAgcmVzID0gZGlyZWN0b3J5X3dhbGsocm5ldyk7Ci0gICAgICAgIGlmICghcmVzKSB7Ci0gICAgICAgICAgICByZXMgPSBmaWxlX3dhbGsocm5ldyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocmVzCi0gICAgICAgIHx8ICgoYXBfc2F0aXNmaWVzKHJuZXcpID09IFNBVElTRllfQUxMCi0gICAgICAgICAgICAgfHwgYXBfc2F0aXNmaWVzKHJuZXcpID09IFNBVElTRllfTk9TUEVDKQotICAgICAgICAgICAgPyAoKHJlcyA9IGFwX3J1bl9hY2Nlc3NfY2hlY2tlcihybmV3KSkKLSAgICAgICAgICAgICAgIHx8IChhcF9zb21lX2F1dGhfcmVxdWlyZWQocm5ldykKLSAgICAgICAgICAgICAgICAgICAmJiAoKHJlcyA9IGFwX3J1bl9jaGVja191c2VyX2lkKHJuZXcpKQotICAgICAgICAgICAgICAgICAgICAgICB8fCAocmVzID0gYXBfcnVuX2F1dGhfY2hlY2tlcihybmV3KSkpKSkKLSAgICAgICAgICAgIDogKChyZXMgPSBhcF9ydW5fYWNjZXNzX2NoZWNrZXIocm5ldykpCi0gICAgICAgICAgICAgICAmJiAoIWFwX3NvbWVfYXV0aF9yZXF1aXJlZChybmV3KQotICAgICAgICAgICAgICAgICAgIHx8ICgocmVzID0gYXBfcnVuX2NoZWNrX3VzZXJfaWQocm5ldykpCi0gICAgICAgICAgICAgICAgICAgICAgIHx8IChyZXMgPSBhcF9ydW5fYXV0aF9jaGVja2VyKHJuZXcpKSkpKQotICAgICAgICAgICApCi0gICAgICAgIHx8IChyZXMgPSBhcF9ydW5fdHlwZV9jaGVja2VyKHJuZXcpKQotICAgICAgICB8fCAocmVzID0gYXBfcnVuX2ZpeHVwcyhybmV3KSkKLSAgICAgICApIHsKLSAgICAgICAgcm5ldy0+c3RhdHVzID0gcmVzOwotICAgIH0KLSAgICByZXR1cm4gcm5ldzsKLX0KLQotQVBfREVDTEFSRShpbnQpIGFwX3J1bl9zdWJfcmVxKHJlcXVlc3RfcmVjICpyKQotewotICAgIGludCByZXR2YWw7Ci0KLSAgICAvKiBzZWUgY29tbWVudHMgaW4gcHJvY2Vzc19yZXF1ZXN0X2ludGVybmFsKCkgKi8KLSAgICBhcF9ydW5faW5zZXJ0X2ZpbHRlcihyKTsKLSAgICByZXR2YWwgPSBhcF9pbnZva2VfaGFuZGxlcihyKTsKLSAgICBhcF9maW5hbGl6ZV9zdWJfcmVxX3Byb3RvY29sKHIpOwotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLUFQX0RFQ0xBUkUodm9pZCkgYXBfZGVzdHJveV9zdWJfcmVxKHJlcXVlc3RfcmVjICpyKQotewotICAgIC8qIFJlY2xhaW0gdGhlIHNwYWNlICovCi0gICAgYXByX3Bvb2xfZGVzdHJveShyLT5wb29sKTsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uIHRvIHNldCB0aGUgci0+bXRpbWUgZmllbGQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBpZiBpdCdzIGxhdGVyCi0gKiB0aGFuIHdoYXQncyBhbHJlYWR5IHRoZXJlLgotICovCi1BUF9ERUNMQVJFKHZvaWQpIGFwX3VwZGF0ZV9tdGltZShyZXF1ZXN0X3JlYyAqciwgYXByX3RpbWVfdCBkZXBlbmRlbmN5X210aW1lKQotewotICAgIGlmIChyLT5tdGltZSA8IGRlcGVuZGVuY3lfbXRpbWUpIHsKLQlyLT5tdGltZSA9IGRlcGVuZGVuY3lfbXRpbWU7Ci0gICAgfQotfQotCi0vKgotICogSXMgaXQgdGhlIGluaXRpYWwgbWFpbiByZXF1ZXN0LCB3aGljaCB3ZSBvbmx5IGdldCAqb25jZSogcGVyIEhUVFAgcmVxdWVzdD8KLSAqLwotQVBfREVDTEFSRShpbnQpIGFwX2lzX2luaXRpYWxfcmVxKHJlcXVlc3RfcmVjICpyKQotewotICAgIHJldHVybgotICAgICAgICAoci0+bWFpbiA9PSBOVUxMKSAgICAgICAvKiBvdGhlcndpc2UsIHRoaXMgaXMgYSBzdWItcmVxdWVzdCAqLwotICAgICAgICAmJgotICAgICAgICAoci0+cHJldiA9PSBOVUxMKTsgICAgICAvKiBvdGhlcndpc2UsIHRoaXMgaXMgYW4gaW50ZXJuYWwgcmVkaXJlY3QgKi8KLX0gCi0KZGlmZiAtLWdpdCBhL3NlcnZlci9zY29yZWJvYXJkLmMgYi9zZXJ2ZXIvc2NvcmVib2FyZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzZiYjg5Li4wMDAwMDAwCi0tLSBhL3NlcnZlci9zY29yZWJvYXJkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCi0gKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAotICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqLwotCi0jaW5jbHVkZSAiYXByX3N0cmluZ3MuaCIKLSNpbmNsdWRlICJhcHJfcG9ydGFibGUuaCIKLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJ1bml4ZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZl9nbG9iYWxzLmgiCi0jaW5jbHVkZSAibXBtLmgiCi0jaW5jbHVkZSAic2NvcmVib2FyZC5oIgotI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNlbmRpZgotCi1BUF9ERUNMQVJFX0RBVEEgc2NvcmVib2FyZCAqYXBfc2NvcmVib2FyZF9pbWFnZSA9IE5VTEw7Ci1BUF9ERUNMQVJFX0RBVEEgY29uc3QgY2hhciAqYXBfc2NvcmVib2FyZF9mbmFtZT1OVUxMOwotQVBfREVDTEFSRV9EQVRBIGludCBhcF9leHRlbmRlZF9zdGF0dXMgPSAwOwotQVBfREVDTEFSRV9EQVRBIGFwcl90aW1lX3QgYXBfcmVzdGFydF90aW1lID0gMDsKLQotI2lmIEFQUl9IQVNfU0hBUkVEX01FTU9SWQotI2luY2x1ZGUgImFwcl9zaG1lbS5oIgotCi1zdGF0aWMgYXByX3NobWVtX3QgKnNjb3JlYm9hcmRfc2htID0gTlVMTDsKLQotYXByX3N0YXR1c190IGFwX2NsZWFudXBfc2hhcmVkX21lbSh2b2lkICpkKQotewotICAgIGFwcl9zaG1fZnJlZShzY29yZWJvYXJkX3NobSwgYXBfc2NvcmVib2FyZF9pbWFnZSk7Ci0gICAgYXBfc2NvcmVib2FyZF9pbWFnZSA9IE5VTEw7Ci0gICAgYXByX3NobV9kZXN0cm95KHNjb3JlYm9hcmRfc2htKTsKLQotICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHZvaWQgc2V0dXBfc2hhcmVkX21lbShhcHJfcG9vbF90ICpwKQotewotICAgIGNoYXIgYnVmWzUxMl07Ci0gICAgY2hhciBlcnJtc2dbMTIwXTsKLSAgICBjb25zdCBjaGFyICpmbmFtZTsKLSAgICBhcHJfc3RhdHVzX3QgcnY7Ci0KLSAgICBmbmFtZSA9IGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHAsIGFwX3Njb3JlYm9hcmRfZm5hbWUpOwotICAgIHJ2ID0gYXByX3NobV9pbml0KCZzY29yZWJvYXJkX3NobSwgU0NPUkVCT0FSRF9TSVpFLCBmbmFtZSwgcCk7Ci0gICAgaWYgKHJ2ICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgIGFwcl9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXM6IGNvdWxkIG5vdCBvcGVuKGNyZWF0ZSkgc2NvcmVib2FyZDogJXMiLAotICAgICAgICAgICAgICAgICAgICBhcF9zZXJ2ZXJfYXJndjAsIGFwcl9zdHJlcnJvcihydiwgZXJybXNnLCBzaXplb2YgZXJybXNnKSk7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGJ1Zik7Ci0gICAgICAgIGV4aXQoQVBFWElUX0lOSVQpOwotICAgIH0KLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlID0gYXByX3NobV9tYWxsb2Moc2NvcmVib2FyZF9zaG0sIFNDT1JFQk9BUkRfU0laRSk7Ci0gICAgaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UgPT0gTlVMTCkgewotICAgICAgICBhcHJfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzOiBjYW5ub3QgYWxsb2NhdGUgc2NvcmVib2FyZCIsCi0gICAgICAgICAgICAgICAgICAgIGFwX3NlcnZlcl9hcmd2MCk7Ci0gICAgICAgIHBlcnJvcihidWYpOyAvKiBvLmsuIHNpbmNlIE1NIHNldHMgZXJybm8gKi8KLSAgICAgICAgYXByX3NobV9kZXN0cm95KHNjb3JlYm9hcmRfc2htKTsKLSAgICAgICAgZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIGFwcl9yZWdpc3Rlcl9jbGVhbnVwKHAsIE5VTEwsIGFwX2NsZWFudXBfc2hhcmVkX21lbSwgYXByX251bGxfY2xlYW51cCk7Ci0gICAgYXBfc2NvcmVib2FyZF9pbWFnZS0+Z2xvYmFsLnJ1bm5pbmdfZ2VuZXJhdGlvbiA9IDA7Ci19Ci0KLXZvaWQgcmVvcGVuX3Njb3JlYm9hcmQoYXByX3Bvb2xfdCAqcCkKLXsKLX0KLSNlbmRpZiAgIC8qIEFQUl9TSEFSRURfTUVNICovCi0KLS8qIENhbGxlZCBieSBwYXJlbnQgcHJvY2VzcyAqLwotdm9pZCByZWluaXRfc2NvcmVib2FyZChhcHJfcG9vbF90ICpwKQotewotICAgIGludCBydW5uaW5nX2dlbiA9IDA7Ci0gICAgaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UpCi0JcnVubmluZ19nZW4gPSBhcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwucnVubmluZ19nZW5lcmF0aW9uOwotICAgIGlmIChhcF9zY29yZWJvYXJkX2ltYWdlID09IE5VTEwpIHsKLSAgICAgICAgc2V0dXBfc2hhcmVkX21lbShwKTsKLSAgICB9Ci0gICAgbWVtc2V0KGFwX3Njb3JlYm9hcmRfaW1hZ2UsIDAsIFNDT1JFQk9BUkRfU0laRSk7Ci0gICAgYXBfc2NvcmVib2FyZF9pbWFnZS0+Z2xvYmFsLnJ1bm5pbmdfZ2VuZXJhdGlvbiA9IHJ1bm5pbmdfZ2VuOwotfQotCi0vKiBSb3V0aW5lcyBjYWxsZWQgdG8gZGVhbCB3aXRoIHRoZSBzY29yZWJvYXJkIGltYWdlCi0gKiAtLS0gbm90ZSB0aGF0IHdlIGRvICpub3QqIG5lZWQgd3JpdGUgbG9ja3MsIHNpbmNlIHVwZGF0ZV9jaGlsZF9zdGF0dXMKLSAqIG9ubHkgdXBkYXRlcyBhICpzaW5nbGUqIHJlY29yZCBpbiBwbGFjZSwgYW5kIG9ubHkgb25lIHByb2Nlc3Mgd3JpdGVzIHRvCi0gKiBhIGdpdmVuIHNjb3JlYm9hcmQgc2xvdCBhdCBhIHRpbWUgKGVpdGhlciB0aGUgY2hpbGQgcHJvY2VzcyBvd25pbmcgdGhhdAotICogc2xvdCwgb3IgdGhlIHBhcmVudCwgbm90aW5nIHRoYXQgdGhlIGNoaWxkIGhhcyBkaWVkKS4KLSAqCi0gKiBBcyBhIGZpbmFsIG5vdGUgLS0tIHNldHRpbmcgdGhlIHNjb3JlIGVudHJ5IHRvIGdldHBpZCgpIGlzIGFsd2F5cyBzYWZlLAotICogc2luY2Ugd2hlbiB0aGUgcGFyZW50IGlzIHdyaXRpbmcgYW4gZW50cnksIGl0J3Mgb25seSBub3RpbmcgU0VSVkVSX0RFQUQKLSAqIGFueXdheS4KLSAqLwotCi1hcHJfaW5saW5lIHZvaWQgYXBfc3luY19zY29yZWJvYXJkX2ltYWdlKHZvaWQpCi17Ci19Ci0KLUFQX0RFQ0xBUkUoaW50KSBhcF9leGlzdHNfc2NvcmVib2FyZF9pbWFnZSh2b2lkKQotewotICAgIHJldHVybiAoYXBfc2NvcmVib2FyZF9pbWFnZSA/IDEgOiAwKTsKLX0KLQotc3RhdGljIGFwcl9pbmxpbmUgdm9pZCBwdXRfc2NvcmVib2FyZF9pbmZvKGludCBjaGlsZF9udW0sIGludCB0aHJlYWRfbnVtLCAKLQkJCQkgICAgICAgc2hvcnRfc2NvcmUgKm5ld19zY29yZV9yZWMpCi17Ci0gICAgLyogWFhYIC0gbmVlZHMgdG8gYmUgZml4ZWQgdG8gYWNjb3VudCBmb3IgdGhyZWFkcyAqLwotI2lmZGVmIFNDT1JFQk9BUkRfRklMRQotICAgIGxzZWVrKHNjb3JlYm9hcmRfZmQsIChsb25nKSBjaGlsZF9udW0gKiBzaXplb2Yoc2hvcnRfc2NvcmUpLCAwKTsKLSAgICBmb3JjZV93cml0ZShzY29yZWJvYXJkX2ZkLCBuZXdfc2NvcmVfcmVjLCBzaXplb2Yoc2hvcnRfc2NvcmUpKTsKLSNlbmRpZgotfQotCi12b2lkIHVwZGF0ZV9zY29yZWJvYXJkX2dsb2JhbCh2b2lkKQotewotI2lmZGVmIFNDT1JFQk9BUkRfRklMRQotICAgIGxzZWVrKHNjb3JlYm9hcmRfZmQsCi0JICAoY2hhciAqKSAmYXBfc2NvcmVib2FyZF9pbWFnZS0+Z2xvYmFsIC0oY2hhciAqKSBhcF9zY29yZWJvYXJkX2ltYWdlLCAwKTsKLSAgICBmb3JjZV93cml0ZShzY29yZWJvYXJkX2ZkLCAmYXBfc2NvcmVib2FyZF9pbWFnZS0+Z2xvYmFsLAotCQlzaXplb2YgYXBfc2NvcmVib2FyZF9pbWFnZS0+Z2xvYmFsKTsKLSNlbmRpZgotfQotCi12b2lkIGluY3JlbWVudF9jb3VudHMoaW50IGNoaWxkX251bSwgaW50IHRocmVhZF9udW0sIHJlcXVlc3RfcmVjICpyKQotewotICAgIHNob3J0X3Njb3JlICpzczsKLQotICAgIHNzID0gJmFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbY2hpbGRfbnVtXVt0aHJlYWRfbnVtXTsKLQotI2lmZGVmIEhBVkVfVElNRVMKLSAgICB0aW1lcygmc3MtPnRpbWVzKTsKLSNlbmRpZgotICAgIHNzLT5hY2Nlc3NfY291bnQrKzsKLSAgICBzcy0+bXlfYWNjZXNzX2NvdW50Kys7Ci0gICAgc3MtPmNvbm5fY291bnQrKzsKLSAgICBzcy0+Ynl0ZXNfc2VydmVkICs9IHItPmJ5dGVzX3NlbnQ7Ci0gICAgc3MtPm15X2J5dGVzX3NlcnZlZCArPSByLT5ieXRlc19zZW50OwotICAgIHNzLT5jb25uX2J5dGVzICs9IHItPmJ5dGVzX3NlbnQ7Ci0KLSAgICBwdXRfc2NvcmVib2FyZF9pbmZvKGNoaWxkX251bSwgdGhyZWFkX251bSwgc3MpOwotfQotCi1BUF9ERUNMQVJFKGludCkgZmluZF9jaGlsZF9ieV9waWQoYXByX3Byb2NfdCAqcGlkKQotewotICAgIGludCBpOwotICAgIGludCBtYXhfZGFlbW9uc19saW1pdCA9IGFwX2dldF9tYXhfZGFlbW9ucygpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG1heF9kYWVtb25zX2xpbWl0OyArK2kpCi0JaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtpXS5waWQgPT0gcGlkLT5waWQpCi0JICAgIHJldHVybiBpOwotCi0gICAgcmV0dXJuIC0xOwotfQotCi1pbnQgYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhpbnQgY2hpbGRfbnVtLCBpbnQgdGhyZWFkX251bSwgaW50IHN0YXR1cywgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IG9sZF9zdGF0dXM7Ci0gICAgc2hvcnRfc2NvcmUgKnNzOwotICAgIHBhcmVudF9zY29yZSAqcHM7Ci0KLSAgICBpZiAoY2hpbGRfbnVtIDwgMCkKLQlyZXR1cm4gLTE7Ci0KLSAgICBzcyA9ICZhcF9zY29yZWJvYXJkX2ltYWdlLT5zZXJ2ZXJzW2NoaWxkX251bV1bdGhyZWFkX251bV07Ci0gICAgb2xkX3N0YXR1cyA9IHNzLT5zdGF0dXM7Ci0gICAgc3MtPnN0YXR1cyA9IHN0YXR1czsKLQotICAgIHBzID0gJmFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtjaGlsZF9udW1dOwotICAgIAotICAgIGlmICgoc3RhdHVzID09IFNFUlZFUl9SRUFEWSAgfHwgc3RhdHVzID09IFNFUlZFUl9BQ0NFUFRJTkcpCi0JJiYgb2xkX3N0YXR1cyA9PSBTRVJWRVJfU1RBUlRJTkcpIHsKLSAgICAgICAgc3MtPnRocmVhZF9udW0gPSBjaGlsZF9udW0gKiBIQVJEX1NFUlZFUl9MSU1JVCArIHRocmVhZF9udW07Ci0JcHMtPndvcmtlcl90aHJlYWRzID0gYXBfdGhyZWFkc19wZXJfY2hpbGQ7Ci0gICAgfQotCi0gICAgaWYgKGFwX2V4dGVuZGVkX3N0YXR1cykgewotCWlmIChzdGF0dXMgPT0gU0VSVkVSX1JFQURZIHx8IHN0YXR1cyA9PSBTRVJWRVJfREVBRCkgewotCSAgICAvKgotCSAgICAgKiBSZXNldCBpbmRpdmlkdWFsIGNvdW50ZXJzCi0JICAgICAqLwotCSAgICBpZiAoc3RhdHVzID09IFNFUlZFUl9ERUFEKSB7Ci0JCXNzLT5teV9hY2Nlc3NfY291bnQgPSAwTDsKLQkJc3MtPm15X2J5dGVzX3NlcnZlZCA9IDBMOwotCSAgICB9Ci0JICAgIHNzLT5jb25uX2NvdW50ID0gKHVuc2lnbmVkIHNob3J0KSAwOwotCSAgICBzcy0+Y29ubl9ieXRlcyA9ICh1bnNpZ25lZCBsb25nKSAwOwotCX0KLQlpZiAocikgewotCSAgICBjb25uX3JlYyAqYyA9IHItPmNvbm5lY3Rpb247Ci0JICAgIGFwcl9jcHlzdHJuKHNzLT5jbGllbnQsIGFwX2dldF9yZW1vdGVfaG9zdChjLCByLT5wZXJfZGlyX2NvbmZpZywKLQkJCQkgIFJFTU9URV9OT0xPT0tVUCksIHNpemVvZihzcy0+Y2xpZW50KSk7Ci0JICAgIGlmIChyLT50aGVfcmVxdWVzdCA9PSBOVUxMKSB7Ci0JCSAgICBhcHJfY3B5c3Rybihzcy0+cmVxdWVzdCwgIk5VTEwiLCBzaXplb2Yoc3MtPnJlcXVlc3QpKTsKLQkgICAgfSBlbHNlIGlmIChyLT5wYXJzZWRfdXJpLnBhc3N3b3JkID09IE5VTEwpIHsKLQkJICAgIGFwcl9jcHlzdHJuKHNzLT5yZXF1ZXN0LCByLT50aGVfcmVxdWVzdCwgc2l6ZW9mKHNzLT5yZXF1ZXN0KSk7Ci0JICAgIH0gZWxzZSB7Ci0JCS8qIERvbid0IHJldmVhbCB0aGUgcGFzc3dvcmQgaW4gdGhlIHNlcnZlci1zdGF0dXMgdmlldyAqLwotCQkgICAgYXByX2NweXN0cm4oc3MtPnJlcXVlc3QsIGFwcl9wc3RyY2F0KHItPnBvb2wsIHItPm1ldGhvZCwgIiAiLAotCQkJCQkgICAgICAgYXBfdW5wYXJzZV91cmlfY29tcG9uZW50cyhyLT5wb29sLCAmci0+cGFyc2VkX3VyaSwgVU5QX09NSVRQQVNTV09SRCksCi0JCQkJCSAgICAgICByLT5hc3NiYWNrd2FyZHMgPyBOVUxMIDogIiAiLCByLT5wcm90b2NvbCwgTlVMTCksCi0JCQkJICAgICAgIHNpemVvZihzcy0+cmVxdWVzdCkpOwotCSAgICB9Ci0JICAgIHNzLT52aG9zdHJlYyA9ICByLT5zZXJ2ZXI7Ci0JfQotICAgIH0KLSAgICAKLSAgICBwdXRfc2NvcmVib2FyZF9pbmZvKGNoaWxkX251bSwgdGhyZWFkX251bSwgc3MpOwotICAgIHJldHVybiBvbGRfc3RhdHVzOwotfQotCi12b2lkIGFwX3RpbWVfcHJvY2Vzc19yZXF1ZXN0KGludCBjaGlsZF9udW0sIGludCB0aHJlYWRfbnVtLCBpbnQgc3RhdHVzKQotewotICAgIHNob3J0X3Njb3JlICpzczsKLQotICAgIGlmIChjaGlsZF9udW0gPCAwKQotCXJldHVybjsKLQotICAgIHNzID0gJmFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbY2hpbGRfbnVtXVt0aHJlYWRfbnVtXTsKLQotICAgIGlmIChzdGF0dXMgPT0gU1RBUlRfUFJFUVVFU1QpIHsKLSAgICAgICAgc3MtPnN0YXJ0X3RpbWUgPSBhcHJfbm93KCk7IAotICAgIH0KLSAgICBlbHNlIGlmIChzdGF0dXMgPT0gU1RPUF9QUkVRVUVTVCkgewotICAgICAgICBzcy0+c3RvcF90aW1lID0gYXByX25vdygpOyAKLSAgICB9Ci0gICAgcHV0X3Njb3JlYm9hcmRfaW5mbyhjaGlsZF9udW0sIHRocmVhZF9udW0sIHNzKTsKLX0KLQpkaWZmIC0tZ2l0IGEvc2VydmVyL3V0aWwuYyBiL3NlcnZlci91dGlsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNTg1MDEuLjAwMDAwMDAKLS0tIGEvc2VydmVyL3V0aWwuYworKysgL2Rldi9udWxsCkBAIC0xLDIxNDUgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogdXRpbC5jOiBzdHJpbmcgdXRpbGl0eSB0aGluZ3MKLSAqIAotICogMy8yMS85MyBSb2IgTWNDb29sCi0gKiAxOTk1LTk2IE1hbnkgY2hhbmdlcyBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAKLSAqLwotCi0vKiBEZWJ1Z2dpbmcgYWlkOgotICogI2RlZmluZSBERUJVRyAgICAgICAgICAgIHRvIHRyYWNlIGFsbCBjZmdfb3BlbiooKS9jZmdfY2xvc2VmaWxlKCkgY2FsbHMKLSAqICNkZWZpbmUgREVCVUdfQ0ZHX0xJTkVTICB0byB0cmFjZSBldmVyeSBsaW5lIHJlYWQgZnJvbSB0aGUgY29uZmlnIGZpbGVzCi0gKi8KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25mX2dsb2JhbHMuaCIJLyogZm9yIHVzZXJfaWQgJiBncm91cF9pZCAqLwotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaWYgZGVmaW5lZChTVU5PUzQpCi0vKiBzdGRpby5oIGhhcyBiZWVuIHJlYWQgaW4gYXBfY29uZmlnLmggYWxyZWFkeS4gQWRkIG1pc3NpbmcgcHJvdG90eXBlcyBoZXJlOiAqLwotZXh0ZXJuIGludCBmZ2V0YyhGSUxFICopOwotZXh0ZXJuIGNoYXIgKmZnZXRzKGNoYXIgKnMsIGludCwgRklMRSopOwotZXh0ZXJuIGludCBmY2xvc2UoRklMRSAqKTsKLSNlbmRpZgotCi0vKiBBIGJ1bmNoIG9mIGZ1bmN0aW9ucyBpbiB1dGlsLmMgc2NhbiBzdHJpbmdzIGxvb2tpbmcgZm9yIGNlcnRhaW4gY2hhcmFjdGVycy4KLSAqIFRvIG1ha2UgdGhhdCBtb3JlIGVmZmljaWVudCB3ZSBlbmNvZGUgYSBsb29rdXAgdGFibGUuICBUaGUgdGVzdF9jaGFyX3RhYmxlCi0gKiBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBnZW5fdGVzdF9jaGFyLmMuCi0gKi8KLSNpbmNsdWRlICJ0ZXN0X2NoYXIuaCIKLQotLyogd2UgYXNzdW1lIHRoZSBmb2xrcyB1c2luZyB0aGlzIGVuc3VyZSAwIDw9IGMgPCAyNTYuLi4gd2hpY2ggbWVhbnMKLSAqIHlvdSBuZWVkIGEgY2FzdCB0byAodW5zaWduZWQgY2hhcikgZmlyc3QsIHlvdSBjYW4ndCBqdXN0IHBsdWcgYQotICogY2hhciBpbiBoZXJlIGFuZCBnZXQgaXQgdG8gd29yaywgYmVjYXVzZSBpZiBjaGFyIGlzIHNpZ25lZCB0aGVuIGl0Ci0gKiB3aWxsIGZpcnN0IGJlIHNpZ24gZXh0ZW5kZWQuCi0gKi8KLSNkZWZpbmUgVEVTVF9DSEFSKGMsIGYpCSh0ZXN0X2NoYXJfdGFibGVbKHVuc2lnbmVkKShjKV0gJiAoZikpCi0KLXZvaWQgYXBfdXRpbF9pbml0KHZvaWQpCi17Ci0gICAgLyogbm90aGluZyB0byBkby4uLiBwcmV2aW91c2x5IHRoZXJlIHdhcyBydW4tdGltZSBpbml0aWFsaXphdGlvbiBvZgotICAgICAqIHRlc3RfY2hhcl90YWJsZSBoZXJlCi0gICAgICovCi19Ci0KLQotQVBJX1ZBUl9FWFBPUlQgY29uc3QgY2hhciBhcF9tb250aF9zbmFtZXNbMTJdWzRdID0KLXsKLSAgICAiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiCi19OwotQVBJX1ZBUl9FWFBPUlQgY29uc3QgY2hhciBhcF9kYXlfc25hbWVzWzddWzRdID0KLXsKLSAgICAiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0IgotfTsKLQotQVBJX0VYUE9SVChjaGFyICopIGFwX2dldF90aW1lKCkKLXsKLSAgICB0aW1lX3QgdDsKLSAgICBjaGFyICp0aW1lX3N0cmluZzsKLQotICAgIHQgPSB0aW1lKE5VTEwpOwotICAgIHRpbWVfc3RyaW5nID0gY3RpbWUoJnQpOwotICAgIHRpbWVfc3RyaW5nW3N0cmxlbih0aW1lX3N0cmluZykgLSAxXSA9ICdcMCc7Ci0gICAgcmV0dXJuICh0aW1lX3N0cmluZyk7Ci19Ci0KLS8qCi0gKiBFeGFtaW5lIGEgZmllbGQgdmFsdWUgKHN1Y2ggYXMgYSBtZWRpYS0vY29udGVudC10eXBlKSBzdHJpbmcgYW5kIHJldHVybgotICogaXQgc2FucyBhbnkgcGFyYW1ldGVyczsgZS5nLiwgc3RyaXAgb2ZmIGFueSAnO2NoYXJzZXQ9Zm9vJyBhbmQgdGhlIGxpa2UuCi0gKi8KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9maWVsZF9ub3BhcmFtKHBvb2wgKnAsIGNvbnN0IGNoYXIgKmludHlwZSkKLXsKLSAgICBjb25zdCBjaGFyICpzZW1pOwotCi0gICAgc2VtaSA9IHN0cmNocihpbnR5cGUsICc7Jyk7Ci0gICAgaWYgKHNlbWkgPT0gTlVMTCkgewotCXJldHVybiBhcF9wc3RyZHVwKHAsIGludHlwZSk7Ci0gICAgfSAKLSAgICBlbHNlIHsKLQl3aGlsZSAoKHNlbWkgPiBpbnR5cGUpICYmIGFwX2lzc3BhY2Uoc2VtaVstMV0pKSB7Ci0JICAgIHNlbWktLTsKLQl9Ci0JcmV0dXJuIGFwX3BzdHJuZHVwKHAsIGludHlwZSwgc2VtaSAtIGludHlwZSk7Ci0gICAgfQotfQotCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfaHRfdGltZShwb29sICpwLCB0aW1lX3QgdCwgY29uc3QgY2hhciAqZm10LCBpbnQgZ210KQotewotICAgIGNoYXIgdHNbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgdGZbTUFYX1NUUklOR19MRU5dOwotICAgIHN0cnVjdCB0bSAqdG1zOwotCi0gICAgdG1zID0gKGdtdCA/IGdtdGltZSgmdCkgOiBsb2NhbHRpbWUoJnQpKTsKLSAgICBpZihnbXQpIHsKLQkvKiBDb252ZXJ0ICVaIHRvICJHTVQiIGFuZCAleiB0byAiKzAwMDAiOwotCSAqIG9uIGhvc3RzIHRoYXQgZG8gbm90IGhhdmUgYSB0aW1lIHpvbmUgc3RyaW5nIGluIHN0cnVjdCB0bSwKLQkgKiBzdHJmdGltZSBtdXN0IGFzc3VtZSBpdHMgYXJndW1lbnQgaXMgbG9jYWwgdGltZS4KLQkgKi8KLQljb25zdCBjaGFyICpmOwotCWNoYXIgKnN0cnA7Ci0JZm9yKHN0cnAgPSB0ZiwgZiA9IGZtdDsgc3RycCA8IHRmICsgc2l6ZW9mKHRmKSAtIDYgJiYgKCpzdHJwID0gKmYpCi0JICAgIDsgZisrLCBzdHJwKyspIHsKLQkgICAgaWYgKCpmICE9ICclJykgY29udGludWU7Ci0JICAgIHN3aXRjaCAoZlsxXSkgewotCSAgICBjYXNlICclJzoKLQkJKisrc3RycCA9ICorK2Y7Ci0JCWJyZWFrOwotCSAgICBjYXNlICdaJzoKLQkJKnN0cnArKyA9ICdHJzsKLQkJKnN0cnArKyA9ICdNJzsKLQkJKnN0cnAgPSAnVCc7Ci0JCWYrKzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgJ3onOiAvKiBjb21tb24gZXh0ZW5zaW9uICovCi0JCSpzdHJwKysgPSAnKyc7Ci0JCSpzdHJwKysgPSAnMCc7Ci0JCSpzdHJwKysgPSAnMCc7Ci0JCSpzdHJwKysgPSAnMCc7Ci0JCSpzdHJwID0gJzAnOwotCQlmKys7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotCSpzdHJwID0gJ1wwJzsKLQlmbXQgPSB0ZjsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayByZXR1cm4gY29kZT8gKi8KLSAgICBzdHJmdGltZSh0cywgTUFYX1NUUklOR19MRU4sIGZtdCwgdG1zKTsKLSAgICB0c1tNQVhfU1RSSU5HX0xFTiAtIDFdID0gJ1wwJzsKLSAgICByZXR1cm4gYXBfcHN0cmR1cChwLCB0cyk7Ci19Ci0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9nbV90aW1lc3RyXzgyMihwb29sICpwLCB0aW1lX3Qgc2VjKQotewotICAgIHN0cnVjdCB0bSAqdG1zOwotCi0gICAgdG1zID0gZ210aW1lKCZzZWMpOwotCi0gICAgLyogUkZDIGRhdGUgZm9ybWF0OyBhcyBzdHJmdGltZSAnJWEsICVkICViICVZICVUIEdNVCcgKi8KLSAgICByZXR1cm4gYXBfcHNwcmludGYocCwKLQkJIiVzLCAlLjJkICVzICVkICUuMmQ6JS4yZDolLjJkIEdNVCIsIGFwX2RheV9zbmFtZXNbdG1zLT50bV93ZGF5XSwKLQkJdG1zLT50bV9tZGF5LCBhcF9tb250aF9zbmFtZXNbdG1zLT50bV9tb25dLCB0bXMtPnRtX3llYXIgKyAxOTAwLAotCQl0bXMtPnRtX2hvdXIsIHRtcy0+dG1fbWluLCB0bXMtPnRtX3NlYyk7Ci19Ci0KLS8qIFdoYXQgYSBwYWluIGluIHRoZSBhc3MuICovCi0jaWYgZGVmaW5lZChIQVZFX0dNVE9GRikKLUFQSV9FWFBPUlQoc3RydWN0IHRtICopIGFwX2dldF9nbXRvZmYoaW50ICp0eikKLXsKLSAgICB0aW1lX3QgdHQgPSB0aW1lKE5VTEwpOwotICAgIHN0cnVjdCB0bSAqdDsKLQotICAgIHQgPSBsb2NhbHRpbWUoJnR0KTsKLSAgICAqdHogPSAoaW50KSAodC0+dG1fZ210b2ZmIC8gNjApOwotICAgIHJldHVybiB0OwotfQotI2Vsc2UKLUFQSV9FWFBPUlQoc3RydWN0IHRtICopIGFwX2dldF9nbXRvZmYoaW50ICp0eikKLXsKLSAgICB0aW1lX3QgdHQgPSB0aW1lKE5VTEwpOwotICAgIHN0cnVjdCB0bSBnbXQ7Ci0gICAgc3RydWN0IHRtICp0OwotICAgIGludCBkYXlzLCBob3VycywgbWludXRlczsKLQotICAgIC8qIEFzc3VtZSB3ZSBhcmUgbmV2ZXIgbW9yZSB0aGFuIDI0IGhvdXJzIGF3YXkuICovCi0gICAgZ210ID0gKmdtdGltZSgmdHQpOwkJLyogcmVtZW1iZXIgZ210aW1lL2xvY2FsdGltZSByZXR1cm4gcHRyIHRvIHN0YXRpYyAqLwotICAgIHQgPSBsb2NhbHRpbWUoJnR0KTsJCS8qIGJ1ZmZlci4uLiBzbyBiZSBjYXJlZnVsICovCi0gICAgZGF5cyA9IHQtPnRtX3lkYXkgLSBnbXQudG1feWRheTsKLSAgICBob3VycyA9ICgoZGF5cyA8IC0xID8gMjQgOiAxIDwgZGF5cyA/IC0yNCA6IGRheXMgKiAyNCkKLQkgICAgICsgdC0+dG1faG91ciAtIGdtdC50bV9ob3VyKTsKLSAgICBtaW51dGVzID0gaG91cnMgKiA2MCArIHQtPnRtX21pbiAtIGdtdC50bV9taW47Ci0gICAgKnR6ID0gbWludXRlczsKLSAgICByZXR1cm4gdDsKLX0KLSNlbmRpZgotCi0vKiBSb3kgb3dlcyBSb2IgYmVlci4gKi8KLS8qIFJvYiBvd2VzIFJveSBkaW5uZXIuICovCi0KLS8qIFRoZXNlIGxlZ2FjeSBjb21tZW50cyB3b3VsZCBtYWtlIGEgbG90IG1vcmUgc2Vuc2UgaWYgUm95IGhhZG4ndAotICogcmVwbGFjZWQgdGhlIG9sZCBsYXRlcl90aGFuKCkgcm91dGluZSB3aXRoIHV0aWxfZGF0ZS5jLgotICoKLSAqIFdlbGwsIG9rYXksIHRoZXkgc3RpbGwgd291bGRuJ3QgbWFrZSBhbnkgc2Vuc2UuCi0gKi8KLQotLyogTWF0Y2ggPSAwLCBOb01hdGNoID0gMSwgQWJvcnQgPSAtMQotICogQmFzZWQgbG9vc2VseSBvbiBzZWN0aW9ucyBvZiB3aWxkbWF0LmMgYnkgUmljaCBTYWx6Ci0gKiBIbW1tLi4uIHNob3VsZG4ndCB0aGlzIHJlYWxseSBnbyBjb21wb25lbnQgYnkgY29tcG9uZW50PwotICovCi1BUElfRVhQT1JUKGludCkgYXBfc3RyY21wX21hdGNoKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZXhwKQotewotICAgIGludCB4LCB5OwotCi0gICAgZm9yICh4ID0gMCwgeSA9IDA7IGV4cFt5XTsgKyt5LCArK3gpIHsKLQlpZiAoKCFzdHJbeF0pICYmIChleHBbeV0gIT0gJyonKSkKLQkgICAgcmV0dXJuIC0xOwotCWlmIChleHBbeV0gPT0gJyonKSB7Ci0JICAgIHdoaWxlIChleHBbKyt5XSA9PSAnKicpOwotCSAgICBpZiAoIWV4cFt5XSkKLQkJcmV0dXJuIDA7Ci0JICAgIHdoaWxlIChzdHJbeF0pIHsKLQkJaW50IHJldDsKLQkJaWYgKChyZXQgPSBhcF9zdHJjbXBfbWF0Y2goJnN0clt4KytdLCAmZXhwW3ldKSkgIT0gMSkKLQkJICAgIHJldHVybiByZXQ7Ci0JICAgIH0KLQkgICAgcmV0dXJuIC0xOwotCX0KLQllbHNlIGlmICgoZXhwW3ldICE9ICc/JykgJiYgKHN0clt4XSAhPSBleHBbeV0pKQotCSAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgcmV0dXJuIChzdHJbeF0gIT0gJ1wwJyk7Ci19Ci0KLUFQSV9FWFBPUlQoaW50KSBhcF9zdHJjYXNlY21wX21hdGNoKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZXhwKQotewotICAgIGludCB4LCB5OwotCi0gICAgZm9yICh4ID0gMCwgeSA9IDA7IGV4cFt5XTsgKyt5LCArK3gpIHsKLQlpZiAoKCFzdHJbeF0pICYmIChleHBbeV0gIT0gJyonKSkKLQkgICAgcmV0dXJuIC0xOwotCWlmIChleHBbeV0gPT0gJyonKSB7Ci0JICAgIHdoaWxlIChleHBbKyt5XSA9PSAnKicpOwotCSAgICBpZiAoIWV4cFt5XSkKLQkJcmV0dXJuIDA7Ci0JICAgIHdoaWxlIChzdHJbeF0pIHsKLQkJaW50IHJldDsKLQkJaWYgKChyZXQgPSBhcF9zdHJjYXNlY21wX21hdGNoKCZzdHJbeCsrXSwgJmV4cFt5XSkpICE9IDEpCi0JCSAgICByZXR1cm4gcmV0OwotCSAgICB9Ci0JICAgIHJldHVybiAtMTsKLQl9Ci0JZWxzZSBpZiAoKGV4cFt5XSAhPSAnPycpICYmIChhcF90b2xvd2VyKHN0clt4XSkgIT0gYXBfdG9sb3dlcihleHBbeV0pKSkKLQkgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiAoc3RyW3hdICE9ICdcMCcpOwotfQotCi1BUElfRVhQT1JUKGludCkgYXBfaXNfbWF0Y2hleHAoY29uc3QgY2hhciAqc3RyKQotewotICAgIHJlZ2lzdGVyIGludCB4OwotCi0gICAgZm9yICh4ID0gMDsgc3RyW3hdOyB4KyspCi0JaWYgKChzdHJbeF0gPT0gJyonKSB8fCAoc3RyW3hdID09ICc/JykpCi0JICAgIHJldHVybiAxOwotICAgIHJldHVybiAwOwotfQotCi0vKiAKLSAqIEFwYWNoZSBzdHViIGZ1bmN0aW9uIGZvciB0aGUgcmVnZXggbGlicmFyaWVzIHJlZ2V4ZWMoKSB0byBtYWtlIHN1cmUgdGhlCi0gKiB3aG9sZSByZWdleCgzKSBBUEkgaXMgYXZhaWxhYmxlIHRocm91Z2ggdGhlIEFwYWNoZSAoZXhwb3J0ZWQpIG5hbWVzcGFjZS4KLSAqIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIHRoZSBEU08gc2l0dWF0aW9ucyBvZiBtb2R1bGVzLgotICogRE8gTk9UIE1BS0UgQSBNQUNSTyBPVVQgT0YgVEhJUyBGVU5DVElPTiEKLSAqLwotQVBJX0VYUE9SVChpbnQpIGFwX3JlZ2V4ZWMoY29uc3QgcmVnZXhfdCAqcHJlZywgY29uc3QgY2hhciAqc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5tYXRjaCwgcmVnbWF0Y2hfdCBwbWF0Y2hbXSwgaW50IGVmbGFncykKLXsKLSAgICByZXR1cm4gcmVnZXhlYyhwcmVnLCBzdHJpbmcsIG5tYXRjaCwgcG1hdGNoLCBlZmxhZ3MpOwotfQotCi1BUElfRVhQT1JUKHNpemVfdCkgYXBfcmVnZXJyb3IoaW50IGVycmNvZGUsIGNvbnN0IHJlZ2V4X3QgKnByZWcsIGNoYXIgKmVycmJ1Ziwgc2l6ZV90IGVycmJ1Zl9zaXplKQotewotICAgIHJldHVybiByZWdlcnJvcihlcnJjb2RlLCBwcmVnLCBlcnJidWYsIGVycmJ1Zl9zaXplKTsKLX0KLQotCi0vKiBUaGlzIGZ1bmN0aW9uIHN1YnN0aXR1dGVzIGZvciAkMC0kOSwgZmlsbGluZyBpbiByZWd1bGFyIGV4cHJlc3Npb24KLSAqIHN1Ym1hdGNoZXMuIFBhc3MgaXQgdGhlIHNhbWUgbm1hdGNoIGFuZCBwbWF0Y2ggYXJndW1lbnRzIHRoYXQgeW91Ci0gKiBwYXNzZWQgYXBfcmVnZXhlYygpLiBwbWF0Y2ggc2hvdWxkIG5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gbnVtYmVyCi0gKiBvZiBzdWJleHByZXNzaW9ucyAtIGkuZS4gb25lIG1vcmUgdGhhbiB0aGUgcmVfbnN1YiBtZW1iZXIgb2YgcmVnZXhfdC4KLSAqCi0gKiBpbnB1dCBzaG91bGQgYmUgdGhlIHN0cmluZyB3aXRoIHRoZSAkLWV4cHJlc3Npb25zLCBzb3VyY2Ugc2hvdWxkIGJlIHRoZQotICogc3RyaW5nIHRoYXQgd2FzIG1hdGNoZWQgYWdhaW5zdC4KLSAqCi0gKiBJdCByZXR1cm5zIHRoZSBzdWJzdGl0dXRlZCBzdHJpbmcsIG9yIE5VTEwgb24gZXJyb3IuCi0gKgotICogUGFydHMgb2YgdGhpcyBjb2RlIGFyZSBiYXNlZCBvbiBIZW5yeSBTcGVuY2VyJ3MgcmVnc3ViKCksIGZyb20gaGlzCi0gKiBBVCZUIFY4IHJlZ2V4cCBwYWNrYWdlLgotICovCi0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9wcmVnc3ViKHBvb2wgKnAsIGNvbnN0IGNoYXIgKmlucHV0LCBjb25zdCBjaGFyICpzb3VyY2UsCi0JCQkgICBzaXplX3Qgbm1hdGNoLCByZWdtYXRjaF90IHBtYXRjaFtdKQotewotICAgIGNvbnN0IGNoYXIgKnNyYyA9IGlucHV0OwotICAgIGNoYXIgKmRlc3QsICpkc3Q7Ci0gICAgY2hhciBjOwotICAgIHNpemVfdCBubzsKLSAgICBpbnQgbGVuOwotCi0gICAgaWYgKCFzb3VyY2UpCi0JcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCFubWF0Y2gpCi0JcmV0dXJuIGFwX3BzdHJkdXAocCwgc3JjKTsKLQotICAgIC8qIEZpcnN0IHBhc3MsIGZpbmQgdGhlIHNpemUgKi8KLQotICAgIGxlbiA9IDA7Ci0KLSAgICB3aGlsZSAoKGMgPSAqc3JjKyspICE9ICdcMCcpIHsKLQlpZiAoYyA9PSAnJicpCi0JICAgIG5vID0gMDsKLQllbHNlIGlmIChjID09ICckJyAmJiBhcF9pc2RpZ2l0KCpzcmMpKQotCSAgICBubyA9ICpzcmMrKyAtICcwJzsKLQllbHNlCi0JICAgIG5vID0gMTA7Ci0KLQlpZiAobm8gPiA5KSB7CQkvKiBPcmRpbmFyeSBjaGFyYWN0ZXIuICovCi0JICAgIGlmIChjID09ICdcXCcgJiYgKCpzcmMgPT0gJyQnIHx8ICpzcmMgPT0gJyYnKSkKLQkJYyA9ICpzcmMrKzsKLQkgICAgbGVuKys7Ci0JfQotCWVsc2UgaWYgKG5vIDwgbm1hdGNoICYmIHBtYXRjaFtub10ucm1fc28gPCBwbWF0Y2hbbm9dLnJtX2VvKSB7Ci0JICAgIGxlbiArPSBwbWF0Y2hbbm9dLnJtX2VvIC0gcG1hdGNoW25vXS5ybV9zbzsKLQl9Ci0KLSAgICB9Ci0KLSAgICBkZXN0ID0gZHN0ID0gYXBfcGNhbGxvYyhwLCBsZW4gKyAxKTsKLQotICAgIC8qIE5vdyBhY3R1YWxseSBmaWxsIGluIHRoZSBzdHJpbmcgKi8KLQotICAgIHNyYyA9IGlucHV0OwotCi0gICAgd2hpbGUgKChjID0gKnNyYysrKSAhPSAnXDAnKSB7Ci0JaWYgKGMgPT0gJyYnKQotCSAgICBubyA9IDA7Ci0JZWxzZSBpZiAoYyA9PSAnJCcgJiYgYXBfaXNkaWdpdCgqc3JjKSkKLQkgICAgbm8gPSAqc3JjKysgLSAnMCc7Ci0JZWxzZQotCSAgICBubyA9IDEwOwotCi0JaWYgKG5vID4gOSkgewkJLyogT3JkaW5hcnkgY2hhcmFjdGVyLiAqLwotCSAgICBpZiAoYyA9PSAnXFwnICYmICgqc3JjID09ICckJyB8fCAqc3JjID09ICcmJykpCi0JCWMgPSAqc3JjKys7Ci0JICAgICpkc3QrKyA9IGM7Ci0JfQotCWVsc2UgaWYgKG5vIDwgbm1hdGNoICYmIHBtYXRjaFtub10ucm1fc28gPCBwbWF0Y2hbbm9dLnJtX2VvKSB7Ci0JICAgIGxlbiA9IHBtYXRjaFtub10ucm1fZW8gLSBwbWF0Y2hbbm9dLnJtX3NvOwotCSAgICBtZW1jcHkoZHN0LCBzb3VyY2UgKyBwbWF0Y2hbbm9dLnJtX3NvLCBsZW4pOwotCSAgICBkc3QgKz0gbGVuOwotCX0KLQotICAgIH0KLSAgICAqZHN0ID0gJ1wwJzsKLQotICAgIHJldHVybiBkZXN0OwotfQotCi0vKgotICogUGFyc2UgLi4gc28gd2UgZG9uJ3QgY29tcHJvbWlzZSBzZWN1cml0eQotICovCi1BUElfRVhQT1JUKHZvaWQpIGFwX2dldHBhcmVudHMoY2hhciAqbmFtZSkKLXsKLSAgICBpbnQgbCwgdzsKLQotICAgIC8qIEZvdXIgcGFzZXNlcywgYXMgcGVyIFJGQyAxODA4ICovCi0gICAgLyogYSkgcmVtb3ZlIC4vIHBhdGggc2VnbWVudHMgKi8KLQotICAgIGZvciAobCA9IDAsIHcgPSAwOyBuYW1lW2xdICE9ICdcMCc7KSB7Ci0JaWYgKG5hbWVbbF0gPT0gJy4nICYmIG5hbWVbbCArIDFdID09ICcvJyAmJiAobCA9PSAwIHx8IG5hbWVbbCAtIDFdID09ICcvJykpCi0JICAgIGwgKz0gMjsKLQllbHNlCi0JICAgIG5hbWVbdysrXSA9IG5hbWVbbCsrXTsKLSAgICB9Ci0KLSAgICAvKiBiKSByZW1vdmUgdHJhaWxpbmcgLiBwYXRoLCBzZWdtZW50ICovCi0gICAgaWYgKHcgPT0gMSAmJiBuYW1lWzBdID09ICcuJykKLQl3LS07Ci0gICAgZWxzZSBpZiAodyA+IDEgJiYgbmFtZVt3IC0gMV0gPT0gJy4nICYmIG5hbWVbdyAtIDJdID09ICcvJykKLQl3LS07Ci0gICAgbmFtZVt3XSA9ICdcMCc7Ci0KLSAgICAvKiBjKSByZW1vdmUgYWxsIHh4Ly4uLyBzZWdtZW50cy4gKGluY2x1ZGluZyBsZWFkaW5nIC4uLyBhbmQgLy4uLykgKi8KLSAgICBsID0gMDsKLQotICAgIHdoaWxlIChuYW1lW2xdICE9ICdcMCcpIHsKLQlpZiAobmFtZVtsXSA9PSAnLicgJiYgbmFtZVtsICsgMV0gPT0gJy4nICYmIG5hbWVbbCArIDJdID09ICcvJyAmJgotCSAgICAobCA9PSAwIHx8IG5hbWVbbCAtIDFdID09ICcvJykpIHsKLQkgICAgcmVnaXN0ZXIgaW50IG0gPSBsICsgMywgbjsKLQotCSAgICBsID0gbCAtIDI7Ci0JICAgIGlmIChsID49IDApIHsKLQkJd2hpbGUgKGwgPj0gMCAmJiBuYW1lW2xdICE9ICcvJykKLQkJICAgIGwtLTsKLQkJbCsrOwotCSAgICB9Ci0JICAgIGVsc2UKLQkJbCA9IDA7Ci0JICAgIG4gPSBsOwotCSAgICB3aGlsZSAoKG5hbWVbbl0gPSBuYW1lW21dKSkKLQkJKCsrbiwgKyttKTsKLQl9Ci0JZWxzZQotCSAgICArK2w7Ci0gICAgfQotCi0gICAgLyogZCkgcmVtb3ZlIHRyYWlsaW5nIHh4Ly4uIHNlZ21lbnQuICovCi0gICAgaWYgKGwgPT0gMiAmJiBuYW1lWzBdID09ICcuJyAmJiBuYW1lWzFdID09ICcuJykKLQluYW1lWzBdID0gJ1wwJzsKLSAgICBlbHNlIGlmIChsID4gMiAmJiBuYW1lW2wgLSAxXSA9PSAnLicgJiYgbmFtZVtsIC0gMl0gPT0gJy4nICYmIG5hbWVbbCAtIDNdID09ICcvJykgewotCWwgPSBsIC0gNDsKLQlpZiAobCA+PSAwKSB7Ci0JICAgIHdoaWxlIChsID49IDAgJiYgbmFtZVtsXSAhPSAnLycpCi0JCWwtLTsKLQkgICAgbCsrOwotCX0KLQllbHNlCi0JICAgIGwgPSAwOwotCW5hbWVbbF0gPSAnXDAnOwotICAgIH0KLX0KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9ubzJzbGFzaChjaGFyICpuYW1lKQotewotICAgIGNoYXIgKmQsICpzOwotCi0gICAgcyA9IGQgPSBuYW1lOwotCi0jaWZkZWYgV0lOMzIKLSAgICAvKiBDaGVjayBmb3IgVU5DIG5hbWVzLiAgTGVhdmUgbGVhZGluZyB0d28gc2xhc2hlcy4gKi8KLSAgICBpZiAoc1swXSA9PSAnLycgJiYgc1sxXSA9PSAnLycpCi0gICAgICAgICpkKysgPSAqcysrOwotI2VuZGlmCi0KLSAgICB3aGlsZSAoKnMpIHsKLQlpZiAoKCpkKysgPSAqcykgPT0gJy8nKSB7Ci0JICAgIGRvIHsKLQkJKytzOwotCSAgICB9IHdoaWxlICgqcyA9PSAnLycpOwotCX0KLQllbHNlIHsKLQkgICAgKytzOwotCX0KLSAgICB9Ci0gICAgKmQgPSAnXDAnOwotfQotCi0KLS8qCi0gKiBjb3B5IGF0IG1vc3QgbiBsZWFkaW5nIGRpcmVjdG9yaWVzIG9mIHMgaW50byBkCi0gKiBkIHNob3VsZCBiZSBhdCBsZWFzdCBhcyBsYXJnZSBhcyBzIHBsdXMgMSBleHRyYSBieXRlCi0gKiBhc3N1bWVzIG4gPiAwCi0gKiB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBldmVyIHVzZWZ1bCBwb2ludGVyIHRvIHRoZSB0cmFpbGluZyBcMCBvZiBkCi0gKgotICogZXhhbXBsZXM6Ci0gKiAgICAvYS9iLCAxICA9PT4gLwotICogICAgL2EvYiwgMiAgPT0+IC9hLwotICogICAgL2EvYiwgMyAgPT0+IC9hL2IvCi0gKiAgICAvYS9iLCA0ICA9PT4gL2EvYi8KLSAqLwotQVBJX0VYUE9SVChjaGFyICopIGFwX21ha2VfZGlyc3RyX3ByZWZpeChjaGFyICpkLCBjb25zdCBjaGFyICpzLCBpbnQgbikKLXsKLSAgICBmb3IgKDs7KSB7Ci0JKmQgPSAqczsKLQlpZiAoKmQgPT0gJ1wwJykgewotCSAgICAqZCA9ICcvJzsKLQkgICAgYnJlYWs7Ci0JfQotCWlmICgqZCA9PSAnLycgJiYgKC0tbikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JKytkOwotCSsrczsKLSAgICB9Ci0gICAgKisrZCA9IDA7Ci0gICAgcmV0dXJuIChkKTsKLX0KLQotCi0vKgotICogcmV0dXJuIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG5hbWUgaW5jbHVkaW5nIHRyYWlsaW5nIC8gb2YgdGhlIGZpbGUgcwotICovCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfbWFrZV9kaXJzdHJfcGFyZW50KHBvb2wgKnAsIGNvbnN0IGNoYXIgKnMpCi17Ci0gICAgY2hhciAqbGFzdF9zbGFzaCA9IHN0cnJjaHIocywgJy8nKTsKLSAgICBjaGFyICpkOwotICAgIGludCBsOwotCi0gICAgaWYgKGxhc3Rfc2xhc2ggPT0gTlVMTCkgewotCS8qIFhYWDogd2VsbCB0aGlzIGlzIHJlYWxseSBicm9rZW4gaWYgdGhpcyBoYXBwZW5zICovCi0JcmV0dXJuIChhcF9wc3RyZHVwKHAsICIvIikpOwotICAgIH0KLSAgICBsID0gKGxhc3Rfc2xhc2ggLSBzKSArIDE7Ci0gICAgZCA9IGFwX3BhbGxvYyhwLCBsICsgMSk7Ci0gICAgbWVtY3B5KGQsIHMsIGwpOwotICAgIGRbbF0gPSAwOwotICAgIHJldHVybiAoZCk7Ci19Ci0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4gIFVzZSBvbmUgb2YgdGhlIHByZWNlZWRpbmcgdHdvIGZ1bmN0aW9ucwotICogd2hpY2ggYXJlIGZhc3Rlci4KLSAqLwotQVBJX0VYUE9SVChjaGFyICopIGFwX21ha2VfZGlyc3RyKHBvb2wgKnAsIGNvbnN0IGNoYXIgKnMsIGludCBuKQotewotICAgIHJlZ2lzdGVyIGludCB4LCBmOwotICAgIGNoYXIgKnJlczsKLQotICAgIGZvciAoeCA9IDAsIGYgPSAwOyBzW3hdOyB4KyspIHsKLQlpZiAoc1t4XSA9PSAnLycpCi0JICAgIGlmICgoKytmKSA9PSBuKSB7Ci0JCXJlcyA9IGFwX3BhbGxvYyhwLCB4ICsgMik7Ci0JCW1lbWNweShyZXMsIHMsIHgpOwotCQlyZXNbeF0gPSAnLyc7Ci0JCXJlc1t4ICsgMV0gPSAnXDAnOwotCQlyZXR1cm4gcmVzOwotCSAgICB9Ci0gICAgfQotCi0gICAgaWYgKHNbc3RybGVuKHMpIC0gMV0gPT0gJy8nKQotCXJldHVybiBhcF9wc3RyZHVwKHAsIHMpOwotICAgIGVsc2UKLQlyZXR1cm4gYXBfcHN0cmNhdChwLCBzLCAiLyIsIE5VTEwpOwotfQotCi1BUElfRVhQT1JUKGludCkgYXBfY291bnRfZGlycyhjb25zdCBjaGFyICpwYXRoKQotewotICAgIHJlZ2lzdGVyIGludCB4LCBuOwotCi0gICAgZm9yICh4ID0gMCwgbiA9IDA7IHBhdGhbeF07IHgrKykKLQlpZiAocGF0aFt4XSA9PSAnLycpCi0JICAgIG4rKzsKLSAgICByZXR1cm4gbjsKLX0KLQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX2NoZGlyX2ZpbGUoY29uc3QgY2hhciAqZmlsZSkKLXsKLSAgICBjb25zdCBjaGFyICp4OwotICAgIGNoYXIgYnVmW0hVR0VfU1RSSU5HX0xFTl07Ci0KLSAgICB4ID0gc3RycmNocihmaWxlLCAnLycpOwotICAgIGlmICh4ID09IE5VTEwpIHsKLQljaGRpcihmaWxlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoeCAtIGZpbGUgPCBzaXplb2YoYnVmKSAtIDEpIHsKLQltZW1jcHkoYnVmLCBmaWxlLCB4IC0gZmlsZSk7Ci0JYnVmW3ggLSBmaWxlXSA9ICdcMCc7Ci0JY2hkaXIoYnVmKTsKLSAgICB9Ci0gICAgLyogWFhYOiB3ZWxsLCB0aGlzIGlzIGEgc2lsbHkgZnVuY3Rpb24sIG5vIG1ldGhvZCBvZiByZXBvcnRpbmcgYW4KLSAgICAgKiBlcnJvci4uLiBhaCB3ZWxsLiAqLwotfQotCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfZ2V0d29yZF9uYyhwb29sICphdHJhbnMsIGNoYXIgKipsaW5lLCBjaGFyIHN0b3ApCi17Ci0gICAgcmV0dXJuIGFwX2dldHdvcmQoYXRyYW5zLCAoY29uc3QgY2hhciAqKikgbGluZSwgc3RvcCk7Ci19Ci0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9nZXR3b3JkKHBvb2wgKmF0cmFucywgY29uc3QgY2hhciAqKmxpbmUsIGNoYXIgc3RvcCkKLXsKLSAgICBjaGFyICpwb3MgPSBzdHJjaHIoKmxpbmUsIHN0b3ApOwotICAgIGNoYXIgKnJlczsKLQotICAgIGlmICghcG9zKSB7Ci0JcmVzID0gYXBfcHN0cmR1cChhdHJhbnMsICpsaW5lKTsKLQkqbGluZSArPSBzdHJsZW4oKmxpbmUpOwotCXJldHVybiByZXM7Ci0gICAgfQotCi0gICAgcmVzID0gYXBfcHN0cm5kdXAoYXRyYW5zLCAqbGluZSwgcG9zIC0gKmxpbmUpOwotCi0gICAgd2hpbGUgKCpwb3MgPT0gc3RvcCkgewotCSsrcG9zOwotICAgIH0KLQotICAgICpsaW5lID0gcG9zOwotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotQVBJX0VYUE9SVChjaGFyICopIGFwX2dldHdvcmRfd2hpdGVfbmMocG9vbCAqYXRyYW5zLCBjaGFyICoqbGluZSkKLXsKLSAgICByZXR1cm4gYXBfZ2V0d29yZF93aGl0ZShhdHJhbnMsIChjb25zdCBjaGFyICoqKSBsaW5lKTsKLX0KLQotQVBJX0VYUE9SVChjaGFyICopIGFwX2dldHdvcmRfd2hpdGUocG9vbCAqYXRyYW5zLCBjb25zdCBjaGFyICoqbGluZSkKLXsKLSAgICBpbnQgcG9zID0gLTEsIHg7Ci0gICAgY2hhciAqcmVzOwotCi0gICAgZm9yICh4ID0gMDsgKCpsaW5lKVt4XTsgeCsrKSB7Ci0JaWYgKGFwX2lzc3BhY2UoKCpsaW5lKVt4XSkpIHsKLQkgICAgcG9zID0geDsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAgIGlmIChwb3MgPT0gLTEpIHsKLQlyZXMgPSBhcF9wc3RyZHVwKGF0cmFucywgKmxpbmUpOwotCSpsaW5lICs9IHN0cmxlbigqbGluZSk7Ci0JcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICByZXMgPSBhcF9wYWxsb2MoYXRyYW5zLCBwb3MgKyAxKTsKLSAgICBhcF9jcHlzdHJuKHJlcywgKmxpbmUsIHBvcyArIDEpOwotCi0gICAgd2hpbGUgKGFwX2lzc3BhY2UoKCpsaW5lKVtwb3NdKSkKLQkrK3BvczsKLQotICAgICpsaW5lICs9IHBvczsKLQotICAgIHJldHVybiByZXM7Ci19Ci0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9nZXR3b3JkX251bGxzX25jKHBvb2wgKmF0cmFucywgY2hhciAqKmxpbmUsIGNoYXIgc3RvcCkKLXsKLSAgICByZXR1cm4gYXBfZ2V0d29yZF9udWxscyhhdHJhbnMsIChjb25zdCBjaGFyICoqKSBsaW5lLCBzdG9wKTsKLX0KLQotQVBJX0VYUE9SVChjaGFyICopIGFwX2dldHdvcmRfbnVsbHMocG9vbCAqYXRyYW5zLCBjb25zdCBjaGFyICoqbGluZSwgY2hhciBzdG9wKQotewotICAgIGNoYXIgKnBvcyA9IHN0cmNocigqbGluZSwgc3RvcCk7Ci0gICAgY2hhciAqcmVzOwotCi0gICAgaWYgKCFwb3MpIHsKLQlyZXMgPSBhcF9wc3RyZHVwKGF0cmFucywgKmxpbmUpOwotCSpsaW5lICs9IHN0cmxlbigqbGluZSk7Ci0JcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICByZXMgPSBhcF9wc3RybmR1cChhdHJhbnMsICpsaW5lLCBwb3MgLSAqbGluZSk7Ci0KLSAgICArK3BvczsKLQotICAgICpsaW5lID0gcG9zOwotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotLyogR2V0IGEgd29yZCwgKG5ldykgY29uZmlnLWZpbGUgc3R5bGUgLS0tIHF1b3RlZCBzdHJpbmdzIGFuZCBiYWNrc2xhc2hlcwotICogYWxsIGhvbm9yZWQKLSAqLwotCi1zdGF0aWMgY2hhciAqc3Vic3RyaW5nX2NvbmYocG9vbCAqcCwgY29uc3QgY2hhciAqc3RhcnQsIGludCBsZW4sIGNoYXIgcXVvdGUpCi17Ci0gICAgY2hhciAqcmVzdWx0ID0gYXBfcGFsbG9jKHAsIGxlbiArIDIpOwotICAgIGNoYXIgKnJlc3AgPSByZXN1bHQ7Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKLQlpZiAoc3RhcnRbaV0gPT0gJ1xcJyAmJiAoc3RhcnRbaSArIDFdID09ICdcXCcKLQkJCQkgfHwgKHF1b3RlICYmIHN0YXJ0W2kgKyAxXSA9PSBxdW90ZSkpKQotCSAgICAqcmVzcCsrID0gc3RhcnRbKytpXTsKLQllbHNlCi0JICAgICpyZXNwKysgPSBzdGFydFtpXTsKLSAgICB9Ci0KLSAgICAqcmVzcCsrID0gJ1wwJzsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfZ2V0d29yZF9jb25mX25jKHBvb2wgKnAsIGNoYXIgKipsaW5lKQotewotICAgIHJldHVybiBhcF9nZXR3b3JkX2NvbmYocCwgKGNvbnN0IGNoYXIgKiopIGxpbmUpOwotfQotCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfZ2V0d29yZF9jb25mKHBvb2wgKnAsIGNvbnN0IGNoYXIgKipsaW5lKQotewotICAgIGNvbnN0IGNoYXIgKnN0ciA9ICpsaW5lLCAqc3RyZW5kOwotICAgIGNoYXIgKnJlczsKLSAgICBjaGFyIHF1b3RlOwotCi0gICAgd2hpbGUgKCpzdHIgJiYgYXBfaXNzcGFjZSgqc3RyKSkKLQkrK3N0cjsKLQotICAgIGlmICghKnN0cikgewotCSpsaW5lID0gc3RyOwotCXJldHVybiAiIjsKLSAgICB9Ci0KLSAgICBpZiAoKHF1b3RlID0gKnN0cikgPT0gJyInIHx8IHF1b3RlID09ICdcJycpIHsKLQlzdHJlbmQgPSBzdHIgKyAxOwotCXdoaWxlICgqc3RyZW5kICYmICpzdHJlbmQgIT0gcXVvdGUpIHsKLQkgICAgaWYgKCpzdHJlbmQgPT0gJ1xcJyAmJiBzdHJlbmRbMV0gJiYgc3RyZW5kWzFdID09IHF1b3RlKQotCQlzdHJlbmQgKz0gMjsKLQkgICAgZWxzZQotCQkrK3N0cmVuZDsKLQl9Ci0JcmVzID0gc3Vic3RyaW5nX2NvbmYocCwgc3RyICsgMSwgc3RyZW5kIC0gc3RyIC0gMSwgcXVvdGUpOwotCi0JaWYgKCpzdHJlbmQgPT0gcXVvdGUpCi0JICAgICsrc3RyZW5kOwotICAgIH0KLSAgICBlbHNlIHsKLQlzdHJlbmQgPSBzdHI7Ci0Jd2hpbGUgKCpzdHJlbmQgJiYgIWFwX2lzc3BhY2UoKnN0cmVuZCkpCi0JICAgICsrc3RyZW5kOwotCi0JcmVzID0gc3Vic3RyaW5nX2NvbmYocCwgc3RyLCBzdHJlbmQgLSBzdHIsIDApOwotICAgIH0KLQotICAgIHdoaWxlICgqc3RyZW5kICYmIGFwX2lzc3BhY2UoKnN0cmVuZCkpCi0JKytzdHJlbmQ7Ci0gICAgKmxpbmUgPSBzdHJlbmQ7Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX2NmZ19jbG9zZWZpbGUoY29uZmlnZmlsZV90ICpjZnApCi17Ci0jaWZkZWYgREVCVUcKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfREVCVUd8QVBMT0dfTk9FUlJOTywgTlVMTCwgCi0gICAgICAgICJEb25lIHdpdGggY29uZmlnIGZpbGUgJXMiLCBjZnAtPm5hbWUpOwotI2VuZGlmCi0gICAgcmV0dXJuIChjZnAtPmNsb3NlID09IE5VTEwpID8gMCA6IGNmcC0+Y2xvc2UoY2ZwLT5wYXJhbSk7Ci19Ci0KLS8qIENvbW1vbiBzdHJ1Y3R1cmUgdGhhdCBob2xkcyB0aGUgZmlsZSBhbmQgcG9vbCBmb3IgYXBfcGNmZ19vcGVuZmlsZSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHN0cnVjdCBwb29sICpwb29sOwotICAgIEZJTEUgKmZpbGU7Ci19IHBvb2xmaWxlX3Q7Ci0KLXN0YXRpYyBpbnQgY2ZnX2Nsb3NlKHZvaWQgKnBhcmFtKQotewotICAgIHBvb2xmaWxlX3QgKmNmcCA9IChwb29sZmlsZV90ICopIHBhcmFtOwotICAgIHJldHVybiAoYXBfcGZjbG9zZShjZnAtPnBvb2wsIGNmcC0+ZmlsZSkpOwotfQotCi1zdGF0aWMgaW50IGNmZ19nZXRjaCh2b2lkICpwYXJhbSkKLXsKLSAgICBwb29sZmlsZV90ICpjZnAgPSAocG9vbGZpbGVfdCAqKSBwYXJhbTsKLSAgICByZXR1cm4gKGZnZXRjKGNmcC0+ZmlsZSkpOwotfQotCi1zdGF0aWMgdm9pZCAqY2ZnX2dldHN0cih2b2lkICpidWYsIHNpemVfdCBidWZzaXosIHZvaWQgKnBhcmFtKQotewotICAgIHBvb2xmaWxlX3QgKmNmcCA9IChwb29sZmlsZV90ICopIHBhcmFtOwotICAgIHJldHVybiAoZmdldHMoYnVmLCBidWZzaXosIGNmcC0+ZmlsZSkpOwotfQotCi0vKiBPcGVuIGEgY29uZmlnZmlsZV90IGFzIEZJTEUsIHJldHVybiBvcGVuIGNvbmZpZ2ZpbGVfdCBzdHJ1Y3QgcG9pbnRlciAqLwotQVBJX0VYUE9SVChjb25maWdmaWxlX3QgKikgYXBfcGNmZ19vcGVuZmlsZShwb29sICpwLCBjb25zdCBjaGFyICpuYW1lKQotewotICAgIGNvbmZpZ2ZpbGVfdCAqbmV3X2NmZzsKLSAgICBwb29sZmlsZV90ICpuZXdfcGZpbGU7Ci0gICAgRklMRSAqZmlsZTsKLSAgICBzdHJ1Y3Qgc3RhdCBzdGJ1ZjsKLSAgICBpbnQgc2F2ZWRfZXJybm87Ci0KLSAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIgfCBBUExPR19OT0VSUk5PLCBOVUxMLAotICAgICAgICAgICAgICAgIkludGVybmFsIGVycm9yOiBwY2ZnX29wZW5maWxlKCkgY2FsbGVkIHdpdGggTlVMTCBmaWxlbmFtZSIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoIWFwX29zX2lzX2ZpbGVuYW1lX3ZhbGlkKG5hbWUpKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIgfCBBUExPR19OT0VSUk5PLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAiQWNjZXNzIHRvIGNvbmZpZyBmaWxlICVzIGRlbmllZDogbm90IGEgdmFsaWQgZmlsZW5hbWUiLAotICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLQllcnJubyA9IEVBQ0NFUzsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgZmlsZSA9IGFwX3Bmb3BlbihwLCBuYW1lLCAiciIpOwotI2lmZGVmIERFQlVHCi0gICAgc2F2ZWRfZXJybm8gPSBlcnJubzsKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfREVCVUcgfCBBUExPR19OT0VSUk5PLCBOVUxMLAotICAgICAgICAgICAgICAgICJPcGVuaW5nIGNvbmZpZyBmaWxlICVzICglcykiLAotICAgICAgICAgICAgICAgIG5hbWUsIChmaWxlID09IE5VTEwpID8gc3RyZXJyb3IoZXJybm8pIDogInN1Y2Nlc3NmdWwiKTsKLSAgICBlcnJubyA9IHNhdmVkX2Vycm5vOwotI2VuZGlmCi0gICAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAoZnN0YXQoZmlsZW5vKGZpbGUpLCAmc3RidWYpID09IDAgJiYKLSAgICAgICAgIVNfSVNSRUcoc3RidWYuc3RfbW9kZSkgJiYKLSNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKE9TMikKLSAgICAgICAgIShzdHJjYXNlY21wKG5hbWUsICJudWwiKSA9PSAwIHx8Ci0gICAgICAgICAgKHN0cmxlbihuYW1lKSA+PSA0ICYmCi0gICAgICAgICAgIHN0cmNhc2VjbXAobmFtZSArIHN0cmxlbihuYW1lKSAtIDQsICIvbnVsIikgPT0gMCkpKSB7Ci0jZWxzZQotICAgICAgICBzdHJjbXAobmFtZSwgIi9kZXYvbnVsbCIpICE9IDApIHsKLSNlbmRpZiAvKiBXSU4zMiB8fCBPUzIgKi8KLQlzYXZlZF9lcnJubyA9IGVycm5vOwotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSIHwgQVBMT0dfTk9FUlJOTywgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgIkFjY2VzcyB0byBmaWxlICVzIGRlbmllZCBieSBzZXJ2ZXI6IG5vdCBhIHJlZ3VsYXIgZmlsZSIsCi0gICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICAgICAgICBhcF9wZmNsb3NlKHAsIGZpbGUpOwotCWVycm5vID0gc2F2ZWRfZXJybm87Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIG5ld19jZmcgPSBhcF9wYWxsb2MocCwgc2l6ZW9mKCpuZXdfY2ZnKSk7Ci0gICAgbmV3X3BmaWxlID0gYXBfcGFsbG9jKHAsIHNpemVvZigqbmV3X3BmaWxlKSk7Ci0gICAgbmV3X3BmaWxlLT5maWxlID0gZmlsZTsKLSAgICBuZXdfcGZpbGUtPnBvb2wgPSBwOwotICAgIG5ld19jZmctPnBhcmFtID0gbmV3X3BmaWxlOwotICAgIG5ld19jZmctPm5hbWUgPSBhcF9wc3RyZHVwKHAsIG5hbWUpOwotICAgIG5ld19jZmctPmdldGNoID0gKGludCAoKikodm9pZCAqKSkgY2ZnX2dldGNoOwotICAgIG5ld19jZmctPmdldHN0ciA9ICh2b2lkICooKikodm9pZCAqLCBzaXplX3QsIHZvaWQgKikpIGNmZ19nZXRzdHI7Ci0gICAgbmV3X2NmZy0+Y2xvc2UgPSAoaW50ICgqKSh2b2lkICopKSBjZmdfY2xvc2U7Ci0gICAgbmV3X2NmZy0+bGluZV9udW1iZXIgPSAwOwotICAgIHJldHVybiBuZXdfY2ZnOwotfQotCi0KLS8qIEFsbG9jYXRlIGEgY29uZmlnZmlsZV90IGhhbmRsZSB3aXRoIHVzZXIgZGVmaW5lZCBmdW5jdGlvbnMgYW5kIHBhcmFtcyAqLwotQVBJX0VYUE9SVChjb25maWdmaWxlX3QgKikgYXBfcGNmZ19vcGVuX2N1c3RvbShwb29sICpwLCBjb25zdCBjaGFyICpkZXNjciwKLSAgICB2b2lkICpwYXJhbSwKLSAgICBpbnQoKmdldGNoKSh2b2lkICpwYXJhbSksCi0gICAgdm9pZCAqKCpnZXRzdHIpICh2b2lkICpidWYsIHNpemVfdCBidWZzaXosIHZvaWQgKnBhcmFtKSwKLSAgICBpbnQoKmNsb3NlX2Z1bmMpKHZvaWQgKnBhcmFtKSkKLXsKLSAgICBjb25maWdmaWxlX3QgKm5ld19jZmcgPSBhcF9wYWxsb2MocCwgc2l6ZW9mKCpuZXdfY2ZnKSk7Ci0jaWZkZWYgREVCVUcKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfREVCVUcgfCBBUExPR19OT0VSUk5PLCBOVUxMLCAiT3BlbmluZyBjb25maWcgaGFuZGxlciAlcyIsIGRlc2NyKTsKLSNlbmRpZgotICAgIG5ld19jZmctPnBhcmFtID0gcGFyYW07Ci0gICAgbmV3X2NmZy0+bmFtZSA9IGRlc2NyOwotICAgIG5ld19jZmctPmdldGNoID0gZ2V0Y2g7Ci0gICAgbmV3X2NmZy0+Z2V0c3RyID0gZ2V0c3RyOwotICAgIG5ld19jZmctPmNsb3NlID0gY2xvc2VfZnVuYzsKLSAgICBuZXdfY2ZnLT5saW5lX251bWJlciA9IDA7Ci0gICAgcmV0dXJuIG5ld19jZmc7Ci19Ci0KLQotLyogUmVhZCBvbmUgY2hhcmFjdGVyIGZyb20gYSBjb25maWdmaWxlX3QgKi8KLUFQSV9FWFBPUlQoaW50KSBhcF9jZmdfZ2V0Yyhjb25maWdmaWxlX3QgKmNmcCkKLXsKLSAgICByZWdpc3RlciBpbnQgY2ggPSBjZnAtPmdldGNoKGNmcC0+cGFyYW0pOwotICAgIGlmIChjaCA9PSBMRikgCi0JKytjZnAtPmxpbmVfbnVtYmVyOwotICAgIHJldHVybiBjaDsKLX0KLQotCi0vKiBSZWFkIG9uZSBsaW5lIGZyb20gb3BlbiBjb25maWdmaWxlX3QsIHN0cmlwIExGLCBpbmNyZWFzZSBsaW5lIG51bWJlciAqLwotLyogSWYgY3VzdG9tIGhhbmRsZXIgZG9lcyBub3QgZGVmaW5lIGEgZ2V0c3RyKCkgZnVuY3Rpb24sIHJlYWQgY2hhciBieSBjaGFyICovCi1BUElfRVhQT1JUKGludCkgYXBfY2ZnX2dldGxpbmUoY2hhciAqYnVmLCBzaXplX3QgYnVmc2l6ZSwgY29uZmlnZmlsZV90ICpjZnApCi17Ci0gICAgLyogSWYgYSAiZ2V0IHN0cmluZyIgZnVuY3Rpb24gaXMgZGVmaW5lZCwgdXNlIGl0ICovCi0gICAgaWYgKGNmcC0+Z2V0c3RyICE9IE5VTEwpIHsKLQljaGFyICpzcmMsICpkc3Q7Ci0JY2hhciAqY3A7Ci0JY2hhciAqY2J1ZiA9IGJ1ZjsKLQlzaXplX3QgY2J1ZnNpemUgPSBidWZzaXplOwotCi0Jd2hpbGUgKDEpIHsKLQkgICAgKytjZnAtPmxpbmVfbnVtYmVyOwotCSAgICBpZiAoY2ZwLT5nZXRzdHIoY2J1ZiwgY2J1ZnNpemUsIGNmcC0+cGFyYW0pID09IE5VTEwpCi0JCXJldHVybiAxOwotCi0JICAgIC8qCi0JICAgICAqICBjaGVjayBmb3IgbGluZSBjb250aW51YXRpb24sCi0JICAgICAqICBpLmUuIG1hdGNoIFteXFxdXFxbXHJdXG4gb25seQotCSAgICAgKi8KLQkgICAgY3AgPSBjYnVmOwotCSAgICB3aGlsZSAoY3AgPCBjYnVmK2NidWZzaXplICYmICpjcCAhPSAnXDAnKQotCQljcCsrOwotCSAgICBpZiAoY3AgPiBjYnVmICYmIGNwWy0xXSA9PSBMRikgewotCQljcC0tOwotCQlpZiAoY3AgPiBjYnVmICYmIGNwWy0xXSA9PSBDUikKLQkJICAgIGNwLS07Ci0JCWlmIChjcCA+IGNidWYgJiYgY3BbLTFdID09ICdcXCcpIHsKLQkJICAgIGNwLS07Ci0JCSAgICBpZiAoIShjcCA+IGNidWYgJiYgY3BbLTFdID09ICdcXCcpKSB7Ci0JCQkvKgotCQkJICogbGluZSBjb250aW51YXRpb24gcmVxdWVzdGVkIC0KLQkJCSAqIHRoZW4gcmVtb3ZlIGJhY2tzbGFzaCBhbmQgY29udGludWUKLQkJCSAqLwotCQkJY2J1ZnNpemUgLT0gKGNwLWNidWYpOwotCQkJY2J1ZiA9IGNwOwotCQkJY29udGludWU7Ci0JCSAgICB9Ci0JCSAgICBlbHNlIHsKLQkJCS8qIAotCQkJICogbm8gcmVhbCBjb250aW51YXRpb24gYmVjYXVzZSBlc2NhcGVkIC0KLQkJCSAqIHRoZW4ganVzdCByZW1vdmUgZXNjYXBlIGNoYXJhY3RlcgotCQkJICovCi0JCQlmb3IgKCA7IGNwIDwgY2J1ZitjYnVmc2l6ZSAmJiAqY3AgIT0gJ1wwJzsgY3ArKykKLQkJCSAgICBjcFswXSA9IGNwWzFdOwotCQkgICAgfSAgIAotCQl9Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JfQotCi0JLyoKLQkgKiBMZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZSBzcGFjZSBpcyBlbGltaW5hdGVkIGNvbXBsZXRlbHkKLQkgKi8KLQlzcmMgPSBidWY7Ci0Jd2hpbGUgKGFwX2lzc3BhY2UoKnNyYykpCi0JICAgICsrc3JjOwotCS8qIGJsYXN0IHRyYWlsaW5nIHdoaXRlc3BhY2UgKi8KLQlkc3QgPSAmc3JjW3N0cmxlbihzcmMpXTsKLQl3aGlsZSAoLS1kc3QgPj0gc3JjICYmIGFwX2lzc3BhY2UoKmRzdCkpCi0JICAgICpkc3QgPSAnXDAnOwotICAgICAgICAvKiBaYXAgbGVhZGluZyB3aGl0ZXNwYWNlIGJ5IHNoaWZ0aW5nICovCi0gICAgICAgIGlmIChzcmMgIT0gYnVmKQotCSAgICBmb3IgKGRzdCA9IGJ1ZjsgKCpkc3QrKyA9ICpzcmMrKykgIT0gJ1wwJzsgKQotCSAgICAgICAgOwotCi0jaWZkZWYgREVCVUdfQ0ZHX0xJTkVTCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0RFQlVHfEFQTE9HX05PRVJSTk8sIE5VTEwsICJSZWFkIGNvbmZpZzogJXMiLCBidWYpOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci0gICAgfSBlbHNlIHsKLQkvKiBObyAiZ2V0IHN0cmluZyIgZnVuY3Rpb24gZGVmaW5lZDsgcmVhZCBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyICovCi0JcmVnaXN0ZXIgaW50IGM7Ci0JcmVnaXN0ZXIgc2l6ZV90IGkgPSAwOwotCi0JYnVmWzBdID0gJ1wwJzsKLQkvKiBza2lwIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotCWRvIHsKLQkgICAgYyA9IGNmcC0+Z2V0Y2goY2ZwLT5wYXJhbSk7Ci0JfSB3aGlsZSAoYyA9PSAnXHQnIHx8IGMgPT0gJyAnKTsKLQotCWlmIChjID09IEVPRikKLQkgICAgcmV0dXJuIDE7Ci0JCi0JaWYoYnVmc2l6ZSA8IDIpIHsKLQkgICAgLyogdG9vIHNtYWxsLCBhc3N1bWUgY2FsbGVyIGlzIGNyYXp5ICovCi0JICAgIHJldHVybiAxOwotCX0KLQotCXdoaWxlICgxKSB7Ci0JICAgIGlmICgoYyA9PSAnXHQnKSB8fCAoYyA9PSAnICcpKSB7Ci0JCWJ1ZltpKytdID0gJyAnOwotCQl3aGlsZSAoKGMgPT0gJ1x0JykgfHwgKGMgPT0gJyAnKSkKLQkJICAgIGMgPSBjZnAtPmdldGNoKGNmcC0+cGFyYW0pOwotCSAgICB9Ci0JICAgIGlmIChjID09IENSKSB7Ci0JCS8qIHNpbGVudGx5IGlnbm9yZSBDUiAoX2Fzc3VtZV8gdGhhdCBhIExGIGZvbGxvd3MpICovCi0JCWMgPSBjZnAtPmdldGNoKGNmcC0+cGFyYW0pOwotCSAgICB9Ci0JICAgIGlmIChjID09IExGKSB7Ci0JCS8qIGluY3JlYXNlIGxpbmUgbnVtYmVyIGFuZCByZXR1cm4gb24gTEYgKi8KLQkJKytjZnAtPmxpbmVfbnVtYmVyOwotCSAgICB9Ci0JICAgIGlmIChjID09IEVPRiB8fCBjID09IDB4NCB8fCBjID09IExGIHx8IGkgPj0gKGJ1ZnNpemUgLSAyKSkgewotCQkvKiAKLQkJICogIGNoZWNrIGZvciBsaW5lIGNvbnRpbnVhdGlvbgotCQkgKi8KLQkJaWYgKGkgPiAwICYmIGJ1ZltpLTFdID09ICdcXCcpIHsKLQkJICAgIGktLTsKLQkJICAgIGlmICghKGkgPiAwICYmIGJ1ZltpLTFdID09ICdcXCcpKSB7Ci0JCQkvKiBsaW5lIGlzIGNvbnRpbnVlZCAqLwotCQkJYyA9IGNmcC0+Z2V0Y2goY2ZwLT5wYXJhbSk7Ci0JCQljb250aW51ZTsKLQkJICAgIH0KLQkJICAgIC8qIGVsc2Ugbm90aGluZyBuZWVkcyBiZSBkb25lIGJlY2F1c2UKLQkJICAgICAqIHRoZW4gdGhlIGJhY2tzbGFzaCBpcyBlc2NhcGVkIGFuZAotCQkgICAgICogd2UganVzdCBzdHJpcCB0byBhIHNpbmdsZSBvbmUKLQkJICAgICAqLwotCQl9Ci0JCS8qIGJsYXN0IHRyYWlsaW5nIHdoaXRlc3BhY2UgKi8KLQkJd2hpbGUgKGkgPiAwICYmIGFwX2lzc3BhY2UoYnVmW2kgLSAxXSkpCi0JCSAgICAtLWk7Ci0JCWJ1ZltpXSA9ICdcMCc7Ci0jaWZkZWYgREVCVUdfQ0ZHX0xJTkVTCi0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19ERUJVR3xBUExPR19OT0VSUk5PLCBOVUxMLCAiUmVhZCBjb25maWc6ICVzIiwgYnVmKTsKLSNlbmRpZgotCQlyZXR1cm4gMDsKLQkgICAgfQotCSAgICBidWZbaV0gPSBjOwotCSAgICArK2k7Ci0JICAgIGMgPSBjZnAtPmdldGNoKGNmcC0+cGFyYW0pOwotCX0KLSAgICB9Ci19Ci0KLS8qIFNpemUgYW4gSFRUUCBoZWFkZXIgZmllbGQgbGlzdCBpdGVtLCBhcyBzZXBhcmF0ZWQgYnkgYSBjb21tYS4KLSAqIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5vbi1lbXB0eSBsaXN0IGl0ZW0KLSAqIHdpdGhpbiB0aGUgb3JpZ2luYWwgc3RyaW5nIChvciBOVUxMIGlmIHRoZXJlIGlzIG5vbmUpIGFuZCB0aGUgYWRkcmVzcwotICogb2YgZmllbGQgaXMgc2hpZnRlZCB0byB0aGUgbmV4dCBub24tY29tbWEsIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlci4KLSAqIGxlbiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBpdGVtIGV4Y2x1ZGluZyBhbnkgYmVnaW5uaW5nIHdoaXRlc3BhY2UuCi0gKi8KLUFQSV9FWFBPUlQoY29uc3QgY2hhciAqKSBhcF9zaXplX2xpc3RfaXRlbShjb25zdCBjaGFyICoqZmllbGQsIGludCAqbGVuKQotewotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0ciA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopKmZpZWxkOwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRva2VuOwotICAgIGludCBpbl9xcGFpciwgaW5fcXN0ciwgaW5fY29tOwotCi0gICAgLyogRmluZCBmaXJzdCBub24tY29tbWEsIG5vbi13aGl0ZXNwYWNlIGJ5dGUgKi8KLQotICAgIHdoaWxlICgqcHRyID09ICcsJyB8fCBhcF9pc3NwYWNlKCpwdHIpKQotICAgICAgICArK3B0cjsKLQotICAgIHRva2VuID0gcHRyOwotCi0gICAgLyogRmluZCB0aGUgZW5kIG9mIHRoaXMgaXRlbSwgc2tpcHBpbmcgb3ZlciBkZWFkIGJpdHMgKi8KLQotICAgIGZvciAoaW5fcXBhaXIgPSBpbl9xc3RyID0gaW5fY29tID0gMDsKLSAgICAgICAgICpwdHIgJiYgKGluX3FwYWlyIHx8IGluX3FzdHIgfHwgaW5fY29tIHx8ICpwdHIgIT0gJywnKTsKLSAgICAgICAgICsrcHRyKSB7Ci0KLSAgICAgICAgaWYgKGluX3FwYWlyKSB7Ci0gICAgICAgICAgICBpbl9xcGFpciA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCpwdHIpIHsKLSAgICAgICAgICAgICAgICBjYXNlICdcXCc6IGluX3FwYWlyID0gMTsgICAgICAvKiBxdW90ZWQtcGFpciAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICciJyA6IGlmICghaW5fY29tKSAgICAgICAvKiBxdW90ZWQgc3RyaW5nIGRlbGltICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fcXN0ciA9ICFpbl9xc3RyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnKCcgOiBpZiAoIWluX3FzdHIpICAgICAgLyogY29tbWVudCAobWF5IG5lc3QpICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraW5fY29tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnKScgOiBpZiAoaW5fY29tKSAgICAgICAgLyogZW5kIGNvbW1lbnQgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0taW5fY29tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdCAgOiBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICgoKmxlbiA9IChwdHIgLSB0b2tlbikpID09IDApIHsKLSAgICAgICAgKmZpZWxkID0gKGNvbnN0IGNoYXIgKilwdHI7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8qIEFkdmFuY2UgZmllbGQgcG9pbnRlciB0byB0aGUgbmV4dCBub24tY29tbWEsIG5vbi13aGl0ZSBieXRlICovCi0KLSAgICB3aGlsZSAoKnB0ciA9PSAnLCcgfHwgYXBfaXNzcGFjZSgqcHRyKSkKLQkrK3B0cjsKLQotICAgICpmaWVsZCA9IChjb25zdCBjaGFyICopcHRyOwotICAgIHJldHVybiAoY29uc3QgY2hhciAqKXRva2VuOwotfQotCi0vKiBSZXRyaWV2ZSBhbiBIVFRQIGhlYWRlciBmaWVsZCBsaXN0IGl0ZW0sIGFzIHNlcGFyYXRlZCBieSBhIGNvbW1hLAotICogd2hpbGUgc3RyaXBwaW5nIGluc2lnbmlmaWNhbnQgd2hpdGVzcGFjZSBhbmQgbG93ZXJjYXNpbmcgYW55dGhpbmcgbm90IGluCi0gKiBhIHF1b3RlZCBzdHJpbmcgb3IgY29tbWVudC4gIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBuZXcgc3RyaW5nIGNvbnRhaW5pbmcKLSAqIHRoZSBjb252ZXJ0ZWQgbGlzdCBpdGVtIChvciBOVUxMIGlmIG5vbmUpIGFuZCB0aGUgYWRkcmVzcyBwb2ludGVkIHRvIGJ5Ci0gKiBmaWVsZCBpcyBzaGlmdGVkIHRvIHRoZSBuZXh0IG5vbi1jb21tYSwgbm9uLXdoaXRlc3BhY2UuCi0gKi8KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9nZXRfbGlzdF9pdGVtKHBvb2wgKnAsIGNvbnN0IGNoYXIgKipmaWVsZCkKLXsKLSAgICBjb25zdCBjaGFyICp0b2tfc3RhcnQ7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqcHRyOwotICAgIHVuc2lnbmVkIGNoYXIgKnBvczsKLSAgICBjaGFyICp0b2tlbjsKLSAgICBpbnQgYWRkc3BhY2UgPSAwLCBpbl9xcGFpciA9IDAsIGluX3FzdHIgPSAwLCBpbl9jb20gPSAwLCB0b2tfbGVuID0gMDsKLQotICAgIC8qIEZpbmQgdGhlIGJlZ2lubmluZyBhbmQgbWF4aW11bSBsZW5ndGggb2YgdGhlIGxpc3QgaXRlbSBzbyB0aGF0Ci0gICAgICogd2UgY2FuIGFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGUgbmV3IHN0cmluZyBhbmQgcmVzZXQgdGhlIGZpZWxkLgotICAgICAqLwotICAgIGlmICgodG9rX3N0YXJ0ID0gYXBfc2l6ZV9saXN0X2l0ZW0oZmllbGQsICZ0b2tfbGVuKSkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdG9rZW4gPSBhcF9wYWxsb2MocCwgdG9rX2xlbiArIDEpOwotCi0gICAgLyogU2NhbiB0aGUgdG9rZW4gYWdhaW4sIGJ1dCB0aGlzIHRpbWUgY29weSBvbmx5IHRoZSBnb29kIGJ5dGVzLgotICAgICAqIFdlIHNraXAgZXh0cmEgd2hpdGVzcGFjZSBhbmQgYW55IHdoaXRlc3BhY2UgYXJvdW5kIGEgJz0nLCAnLycsCi0gICAgICogb3IgJzsnIGFuZCBsb3dlcmNhc2Ugbm9ybWFsIGNoYXJhY3RlcnMgbm90IHdpdGhpbiBhIGNvbW1lbnQsCi0gICAgICogcXVvdGVkLXN0cmluZyBvciBxdW90ZWQtcGFpci4KLSAgICAgKi8KLSAgICBmb3IgKHB0ciA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopdG9rX3N0YXJ0LCBwb3MgPSAodW5zaWduZWQgY2hhciAqKXRva2VuOwotICAgICAgICAgKnB0ciAmJiAoaW5fcXBhaXIgfHwgaW5fcXN0ciB8fCBpbl9jb20gfHwgKnB0ciAhPSAnLCcpOwotICAgICAgICAgKytwdHIpIHsKLQotICAgICAgICBpZiAoaW5fcXBhaXIpIHsKLSAgICAgICAgICAgIGluX3FwYWlyID0gMDsKLSAgICAgICAgICAgICpwb3MrKyA9ICpwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCpwdHIpIHsKLSAgICAgICAgICAgICAgICBjYXNlICdcXCc6IGluX3FwYWlyID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRzcGFjZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb3MrKyA9ICcgJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb3MrKyA9ICpwdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRzcGFjZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICciJyA6IGlmICghaW5fY29tKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX3FzdHIgPSAhaW5fcXN0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRzcGFjZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb3MrKyA9ICcgJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb3MrKyA9ICpwdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRzcGFjZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICcoJyA6IGlmICghaW5fcXN0cikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2luX2NvbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRzcGFjZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb3MrKyA9ICcgJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb3MrKyA9ICpwdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRzcGFjZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICcpJyA6IGlmIChpbl9jb20pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1pbl9jb207Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqcG9zKysgPSAqcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkc3BhY2UgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnICcgOgotICAgICAgICAgICAgICAgIGNhc2UgJ1x0JzogaWYgKGFkZHNwYWNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluX2NvbSB8fCBpbl9xc3RyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb3MrKyA9ICpwdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkc3BhY2UgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnPScgOgotICAgICAgICAgICAgICAgIGNhc2UgJy8nIDoKLSAgICAgICAgICAgICAgICBjYXNlICc7JyA6IGlmICghKGluX2NvbSB8fCBpbl9xc3RyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRzcGFjZSA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBvcysrID0gKnB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQgIDogaWYgKGFkZHNwYWNlID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBvcysrID0gJyAnOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBvcysrID0gKGluX2NvbSB8fCBpbl9xc3RyKSA/ICpwdHIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhcF90b2xvd2VyKCpwdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkc3BhY2UgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKnBvcyA9ICdcMCc7Ci0KLSAgICByZXR1cm4gdG9rZW47Ci19Ci0KLS8qIEZpbmQgYW4gaXRlbSBpbiBjYW5vbmljYWwgZm9ybSAobG93ZXJjYXNlLCBubyBleHRyYSBzcGFjZXMpIHdpdGhpbgotICogYW4gSFRUUCBmaWVsZCB2YWx1ZSBsaXN0LiAgUmV0dXJucyAxIGlmIGZvdW5kLCAwIGlmIG5vdCBmb3VuZC4KLSAqIFRoaXMgd291bGQgYmUgbXVjaCBtb3JlIGVmZmljaWVudCBpZiB3ZSBzdG9yZWQgaGVhZGVyIGZpZWxkcyBhcwotICogYW4gYXJyYXkgb2YgbGlzdCBpdGVtcyBhcyB0aGV5IGFyZSByZWNlaXZlZCBpbnN0ZWFkIG9mIGEgcGxhaW4gc3RyaW5nLgotICovCi1BUElfRVhQT1JUKGludCkgYXBfZmluZF9saXN0X2l0ZW0ocG9vbCAqcCwgY29uc3QgY2hhciAqbGluZSwgY29uc3QgY2hhciAqdG9rKQotewotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBvczsKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwdHIgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWxpbmU7Ci0gICAgaW50IGdvb2QgPSAwLCBhZGRzcGFjZSA9IDAsIGluX3FwYWlyID0gMCwgaW5fcXN0ciA9IDAsIGluX2NvbSA9IDA7Ci0KLSAgICBpZiAoIWxpbmUgfHwgIXRvaykKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBkbyB7ICAvKiBsb29wIGZvciBlYWNoIGl0ZW0gaW4gbGluZSdzIGxpc3QgKi8KLQotICAgICAgICAvKiBGaW5kIGZpcnN0IG5vbi1jb21tYSwgbm9uLXdoaXRlc3BhY2UgYnl0ZSAqLwotCi0gICAgICAgIHdoaWxlICgqcHRyID09ICcsJyB8fCBhcF9pc3NwYWNlKCpwdHIpKQotICAgICAgICAgICAgKytwdHI7Ci0KLSAgICAgICAgaWYgKCpwdHIpCi0gICAgICAgICAgICBnb29kID0gMTsgIC8qIHVudGlsIHByb3ZlbiBvdGhlcndpc2UgZm9yIHRoaXMgaXRlbSAqLwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBicmVhazsgICAgIC8qIG5vIGl0ZW1zIGxlZnQgYW5kIG5vdGhpbmcgZ29vZCBmb3VuZCAqLwotCi0gICAgICAgIC8qIFdlIHNraXAgZXh0cmEgd2hpdGVzcGFjZSBhbmQgYW55IHdoaXRlc3BhY2UgYXJvdW5kIGEgJz0nLCAnLycsCi0gICAgICAgICAqIG9yICc7JyBhbmQgbG93ZXJjYXNlIG5vcm1hbCBjaGFyYWN0ZXJzIG5vdCB3aXRoaW4gYSBjb21tZW50LAotICAgICAgICAgKiBxdW90ZWQtc3RyaW5nIG9yIHF1b3RlZC1wYWlyLgotICAgICAgICAgKi8KLSAgICAgICAgZm9yIChwb3MgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXRvazsKLSAgICAgICAgICAgICAqcHRyICYmIChpbl9xcGFpciB8fCBpbl9xc3RyIHx8IGluX2NvbSB8fCAqcHRyICE9ICcsJyk7Ci0gICAgICAgICAgICAgKytwdHIpIHsKLQotICAgICAgICAgICAgaWYgKGluX3FwYWlyKSB7Ci0gICAgICAgICAgICAgICAgaW5fcXBhaXIgPSAwOwotICAgICAgICAgICAgICAgIGlmIChnb29kKQotICAgICAgICAgICAgICAgICAgICBnb29kID0gKCpwb3MrKyA9PSAqcHRyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoKnB0cikgewotICAgICAgICAgICAgICAgICAgICBjYXNlICdcXCc6IGluX3FwYWlyID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkc3BhY2UgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZCA9IGdvb2QgJiYgKCpwb3MrKyA9PSAnICcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2QgPSBnb29kICYmICgqcG9zKysgPT0gKnB0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkc3BhY2UgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICciJyA6IGlmICghaW5fY29tKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9xc3RyID0gIWluX3FzdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZHNwYWNlID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2QgPSBnb29kICYmICgqcG9zKysgPT0gJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29kID0gZ29vZCAmJiAoKnBvcysrID09ICpwdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHNwYWNlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnKCcgOiBpZiAoIWluX3FzdHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraW5fY29tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRzcGFjZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29kID0gZ29vZCAmJiAoKnBvcysrID09ICcgJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZCA9IGdvb2QgJiYgKCpwb3MrKyA9PSAqcHRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRzcGFjZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJyknIDogaWYgKGluX2NvbSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1pbl9jb207Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZCA9IGdvb2QgJiYgKCpwb3MrKyA9PSAqcHRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRzcGFjZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJyAnIDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnXHQnOiBpZiAoYWRkc3BhY2UgfHwgIWdvb2QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbl9jb20gfHwgaW5fcXN0cikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZCA9ICgqcG9zKysgPT0gKnB0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRzcGFjZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJz0nIDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnLycgOgotICAgICAgICAgICAgICAgICAgICBjYXNlICc7JyA6IGlmICghKGluX2NvbSB8fCBpbl9xc3RyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkc3BhY2UgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29kID0gZ29vZCAmJiAoKnBvcysrID09ICpwdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ICA6IGlmICghZ29vZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZHNwYWNlID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2QgPSAoKnBvcysrID09ICcgJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluX2NvbSB8fCBpbl9xc3RyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29kID0gZ29vZCAmJiAoKnBvcysrID09ICpwdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZCA9IGdvb2QgJiYgKCpwb3MrKyA9PSBhcF90b2xvd2VyKCpwdHIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRzcGFjZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChnb29kICYmICpwb3MpCi0gICAgICAgICAgICBnb29kID0gMDsgICAgICAgICAgLyogbm90IGdvb2QgaWYgb25seSBhIHByZWZpeCB3YXMgbWF0Y2hlZCAqLwotCi0gICAgfSB3aGlsZSAoKnB0ciAmJiAhZ29vZCk7Ci0KLSAgICByZXR1cm4gZ29vZDsKLX0KLQotCi0vKiBSZXRyaWV2ZSBhIHRva2VuLCBzcGFjaW5nIG92ZXIgaXQgYW5kIHJldHVybmluZyBhIHBvaW50ZXIgdG8KLSAqIHRoZSBmaXJzdCBub24td2hpdGUgYnl0ZSBhZnRlcndhcmRzLiAgTm90ZSB0aGF0IHRoZXNlIHRva2VucwotICogYXJlIGRlbGltaXRlZCBieSBzZW1pcyBhbmQgY29tbWFzOyBhbmQgY2FuIGFsc28gYmUgZGVsaW1pdGVkCi0gKiBieSB3aGl0ZXNwYWNlIGF0IHRoZSBjYWxsZXIncyBvcHRpb24uCi0gKi8KLQotQVBJX0VYUE9SVChjaGFyICopIGFwX2dldF90b2tlbihwb29sICpwLCBjb25zdCBjaGFyICoqYWNjZXB0X2xpbmUsIGludCBhY2NlcHRfd2hpdGUpCi17Ci0gICAgY29uc3QgY2hhciAqcHRyID0gKmFjY2VwdF9saW5lOwotICAgIGNvbnN0IGNoYXIgKnRva19zdGFydDsKLSAgICBjaGFyICp0b2tlbjsKLSAgICBpbnQgdG9rX2xlbjsKLQotICAgIC8qIEZpbmQgZmlyc3Qgbm9uLXdoaXRlIGJ5dGUgKi8KLQotICAgIHdoaWxlICgqcHRyICYmIGFwX2lzc3BhY2UoKnB0cikpCi0JKytwdHI7Ci0KLSAgICB0b2tfc3RhcnQgPSBwdHI7Ci0KLSAgICAvKiBmaW5kIHRva2VuIGVuZCwgc2tpcHBpbmcgb3ZlciBxdW90ZWQgc3RyaW5ncy4KLSAgICAgKiAoY29tbWVudHMgYXJlIGFscmVhZHkgZ29uZSkuCi0gICAgICovCi0KLSAgICB3aGlsZSAoKnB0ciAmJiAoYWNjZXB0X3doaXRlIHx8ICFhcF9pc3NwYWNlKCpwdHIpKQotCSAgICYmICpwdHIgIT0gJzsnICYmICpwdHIgIT0gJywnKSB7Ci0JaWYgKCpwdHIrKyA9PSAnIicpCi0JICAgIHdoaWxlICgqcHRyKQotCQlpZiAoKnB0cisrID09ICciJykKLQkJICAgIGJyZWFrOwotICAgIH0KLQotICAgIHRva19sZW4gPSBwdHIgLSB0b2tfc3RhcnQ7Ci0gICAgdG9rZW4gPSBhcF9wc3RybmR1cChwLCB0b2tfc3RhcnQsIHRva19sZW4pOwotCi0gICAgLyogQWR2YW5jZSBhY2NlcHRfbGluZSBwb2ludGVyIHRvIHRoZSBuZXh0IG5vbi13aGl0ZSBieXRlICovCi0KLSAgICB3aGlsZSAoKnB0ciAmJiBhcF9pc3NwYWNlKCpwdHIpKQotCSsrcHRyOwotCi0gICAgKmFjY2VwdF9saW5lID0gcHRyOwotICAgIHJldHVybiB0b2tlbjsKLX0KLQotCi0vKiBmaW5kIGh0dHAgdG9rZW5zLCBzZWUgdGhlIGRlZmluaXRpb24gb2YgdG9rZW4gZnJvbSBSRkMyMDY4ICovCi1BUElfRVhQT1JUKGludCkgYXBfZmluZF90b2tlbihwb29sICpwLCBjb25zdCBjaGFyICpsaW5lLCBjb25zdCBjaGFyICp0b2spCi17Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3RhcnRfdG9rZW47Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqczsKLQotICAgIGlmICghbGluZSkKLQlyZXR1cm4gMDsKLQotICAgIHMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWxpbmU7Ci0gICAgZm9yICg7OykgewotCS8qIGZpbmQgc3RhcnQgb2YgdG9rZW4sIHNraXAgYWxsIHN0b3AgY2hhcmFjdGVycywgbm90ZSBOVUwKLQkgKiBpc24ndCBhIHRva2VuIHN0b3AsIHNvIHdlIGRvbid0IG5lZWQgdG8gdGVzdCBmb3IgaXQKLQkgKi8KLQl3aGlsZSAoVEVTVF9DSEFSKCpzLCBUX0hUVFBfVE9LRU5fU1RPUCkpIHsKLQkgICAgKytzOwotCX0KLQlpZiAoISpzKSB7Ci0JICAgIHJldHVybiAwOwotCX0KLQlzdGFydF90b2tlbiA9IHM7Ci0JLyogZmluZCBlbmQgb2YgdGhlIHRva2VuICovCi0Jd2hpbGUgKCpzICYmICFURVNUX0NIQVIoKnMsIFRfSFRUUF9UT0tFTl9TVE9QKSkgewotCSAgICArK3M7Ci0JfQotCWlmICghc3RybmNhc2VjbXAoKGNvbnN0IGNoYXIgKilzdGFydF90b2tlbiwgKGNvbnN0IGNoYXIgKil0b2ssIHMgLSBzdGFydF90b2tlbikpIHsKLQkgICAgcmV0dXJuIDE7Ci0JfQotCWlmICghKnMpIHsKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLX0KLQotCi1BUElfRVhQT1JUKGludCkgYXBfZmluZF9sYXN0X3Rva2VuKHBvb2wgKnAsIGNvbnN0IGNoYXIgKmxpbmUsIGNvbnN0IGNoYXIgKnRvaykKLXsKLSAgICBpbnQgbGxlbiwgdGxlbiwgbGlkeDsKLQotICAgIGlmICghbGluZSkKLQlyZXR1cm4gMDsKLQotICAgIGxsZW4gPSBzdHJsZW4obGluZSk7Ci0gICAgdGxlbiA9IHN0cmxlbih0b2spOwotICAgIGxpZHggPSBsbGVuIC0gdGxlbjsKLQotICAgIGlmICgobGlkeCA8IDApIHx8Ci0JKChsaWR4ID4gMCkgJiYgIShhcF9pc3NwYWNlKGxpbmVbbGlkeCAtIDFdKSB8fCBsaW5lW2xpZHggLSAxXSA9PSAnLCcpKSkKLQlyZXR1cm4gMDsKLQotICAgIHJldHVybiAoc3RybmNhc2VjbXAoJmxpbmVbbGlkeF0sIHRvaywgdGxlbikgPT0gMCk7Ci19Ci0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9lc2NhcGVfc2hlbGxfY21kKHBvb2wgKnAsIGNvbnN0IGNoYXIgKnN0cikKLXsKLSAgICBjaGFyICpjbWQ7Ci0gICAgdW5zaWduZWQgY2hhciAqZDsKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzOwotCi0gICAgY21kID0gYXBfcGFsbG9jKHAsIDIgKiBzdHJsZW4oc3RyKSArIDEpOwkvKiBCZSBzYWZlICovCi0gICAgZCA9ICh1bnNpZ25lZCBjaGFyICopY21kOwotICAgIHMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXN0cjsKLSAgICBmb3IgKDsgKnM7ICsrcykgewotCi0jaWYgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lOMzIpCi0JLyogRG9uJ3QgYWxsb3cgJyYnIGluIHBhcmFtZXRlcnMgdW5kZXIgT1MvMi4gKi8KLQkvKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHNlbmQgY29tbWFuZHMgdG8gdGhlIHNoZWxsLiAqLwotCWlmICgqcyA9PSAnJicpIHsKLQkgICAgKmQrKyA9ICcgJzsKLQkgICAgY29udGludWU7Ci0JfQotI2VuZGlmCi0KLQlpZiAoVEVTVF9DSEFSKCpzLCBUX0VTQ0FQRV9TSEVMTF9DTUQpKSB7Ci0JICAgICpkKysgPSAnXFwnOwotCX0KLQkqZCsrID0gKnM7Ci0gICAgfQotICAgICpkID0gJ1wwJzsKLQotICAgIHJldHVybiBjbWQ7Ci19Ci0KLXN0YXRpYyBjaGFyIHgyYyhjb25zdCBjaGFyICp3aGF0KQotewotICAgIHJlZ2lzdGVyIGNoYXIgZGlnaXQ7Ci0KLSNpZm5kZWYgQ0hBUlNFVF9FQkNESUMKLSAgICBkaWdpdCA9ICgod2hhdFswXSA+PSAnQScpID8gKCh3aGF0WzBdICYgMHhkZikgLSAnQScpICsgMTAgOiAod2hhdFswXSAtICcwJykpOwotICAgIGRpZ2l0ICo9IDE2OwotICAgIGRpZ2l0ICs9ICh3aGF0WzFdID49ICdBJyA/ICgod2hhdFsxXSAmIDB4ZGYpIC0gJ0EnKSArIDEwIDogKHdoYXRbMV0gLSAnMCcpKTsKLSNlbHNlIC8qQ0hBUlNFVF9FQkNESUMqLwotICAgIGNoYXIgeHN0cls1XTsKLSAgICB4c3RyWzBdPScwJzsKLSAgICB4c3RyWzFdPSd4JzsKLSAgICB4c3RyWzJdPXdoYXRbMF07Ci0gICAgeHN0clszXT13aGF0WzFdOwotICAgIHhzdHJbNF09J1wwJzsKLSAgICBkaWdpdCA9IG9zX3RvZWJjZGljWzB4RkYgJiBzdHJ0b2woeHN0ciwgTlVMTCwgMTYpXTsKLSNlbmRpZiAvKkNIQVJTRVRfRUJDRElDKi8KLSAgICByZXR1cm4gKGRpZ2l0KTsKLX0KLQotLyoKLSAqIFVuZXNjYXBlcyBhIFVSTC4KLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvcgotICogRmFpbHVyZSBpcyBkdWUgdG8KLSAqICAgYmFkICUgZXNjYXBlICAgICAgIHJldHVybnMgQkFEX1JFUVVFU1QKLSAqCi0gKiAgIGRlY29kaW5nICUwMCAtPiBcMAotICogICBkZWNvZGluZyAlMmYgLT4gLyAgIChhIHNwZWNpYWwgY2hhcmFjdGVyKQotICogICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBOT1RfRk9VTkQKLSAqLwotQVBJX0VYUE9SVChpbnQpIGFwX3VuZXNjYXBlX3VybChjaGFyICp1cmwpCi17Ci0gICAgcmVnaXN0ZXIgaW50IHgsIHksIGJhZGVzYywgYmFkcGF0aDsKLQotICAgIGJhZGVzYyA9IDA7Ci0gICAgYmFkcGF0aCA9IDA7Ci0gICAgZm9yICh4ID0gMCwgeSA9IDA7IHVybFt5XTsgKyt4LCArK3kpIHsKLQlpZiAodXJsW3ldICE9ICclJykKLQkgICAgdXJsW3hdID0gdXJsW3ldOwotCWVsc2UgewotCSAgICBpZiAoIWFwX2lzeGRpZ2l0KHVybFt5ICsgMV0pIHx8ICFhcF9pc3hkaWdpdCh1cmxbeSArIDJdKSkgewotCQliYWRlc2MgPSAxOwotCQl1cmxbeF0gPSAnJSc7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCXVybFt4XSA9IHgyYygmdXJsW3kgKyAxXSk7Ci0JCXkgKz0gMjsKLQkJaWYgKHVybFt4XSA9PSAnLycgfHwgdXJsW3hdID09ICdcMCcpCi0JCSAgICBiYWRwYXRoID0gMTsKLQkgICAgfQotCX0KLSAgICB9Ci0gICAgdXJsW3hdID0gJ1wwJzsKLSAgICBpZiAoYmFkZXNjKQotCXJldHVybiBCQURfUkVRVUVTVDsKLSAgICBlbHNlIGlmIChiYWRwYXRoKQotCXJldHVybiBOT1RfRk9VTkQ7Ci0gICAgZWxzZQotCXJldHVybiBPSzsKLX0KLQotQVBJX0VYUE9SVChjaGFyICopIGFwX2NvbnN0cnVjdF9zZXJ2ZXIocG9vbCAqcCwgY29uc3QgY2hhciAqaG9zdG5hbWUsCi0JCQkJICAgIHVuc2lnbmVkIHBvcnQsIGNvbnN0IHJlcXVlc3RfcmVjICpyKQotewotICAgIGlmIChhcF9pc19kZWZhdWx0X3BvcnQocG9ydCwgcikpCi0JcmV0dXJuIGFwX3BzdHJkdXAocCwgaG9zdG5hbWUpOwotICAgIGVsc2UgewotCXJldHVybiBhcF9wc3ByaW50ZihwLCAiJXM6JXUiLCBob3N0bmFtZSwgcG9ydCk7Ci0gICAgfQotfQotCi0vKiBjMnggdGFrZXMgYW4gdW5zaWduZWQsIGFuZCBleHBlY3RzIHRoZSBjYWxsZXIgaGFzIGd1YXJhbnRlZWQgdGhhdAotICogMCA8PSB3aGF0IDwgMjU2Li4uIHdoaWNoIHVzdWFsbHkgbWVhbnMgdGhhdCB5b3UgaGF2ZSB0byBjYXN0IHRvCi0gKiB1bnNpZ25lZCBjaGFyIGZpcnN0LCBiZWNhdXNlICh1bnNpZ25lZCkoY2hhcikoeCkgZmlzdCBnb2VzIHRocm91Z2gKLSAqIHNpZ25lZCBleHRlbnNpb24gdG8gYW4gaW50IGJlZm9yZSB0aGUgdW5zaWduZWQgY2FzdC4KLSAqCi0gKiBUaGUgcmVhc29uIGZvciB0aGlzIGFzc3VtcHRpb24gaXMgdG8gYXNzaXN0IGdjYyBjb2RlIGdlbmVyYXRpb24gLS0KLSAqIHRoZSB1bnNpZ25lZCBjaGFyIC0+IHVuc2lnbmVkIGV4dGVuc2lvbiBpcyBhbHJlYWR5IGRvbmUgZWFybGllciBpbgotICogYm90aCB1c2VzIG9mIHRoaXMgY29kZSwgc28gdGhlcmUncyBubyBuZWVkIHRvIHdhc3RlIHRpbWUgZG9pbmcgaXQKLSAqIGFnYWluLgotICovCi1zdGF0aWMgY29uc3QgY2hhciBjMnhfdGFibGVbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKLQotc3RhdGljIGFwX2lubGluZSB1bnNpZ25lZCBjaGFyICpjMngodW5zaWduZWQgd2hhdCwgdW5zaWduZWQgY2hhciAqd2hlcmUpCi17Ci0gICAgKndoZXJlKysgPSAnJSc7Ci0gICAgKndoZXJlKysgPSBjMnhfdGFibGVbd2hhdCA+PiA0XTsKLSAgICAqd2hlcmUrKyA9IGMyeF90YWJsZVt3aGF0ICYgMHhmXTsKLSAgICByZXR1cm4gd2hlcmU7Ci19Ci0KLS8qCi0gKiBlc2NhcGVfcGF0aF9zZWdtZW50KCkgZXNjYXBlcyBhIHBhdGggc2VnbWVudCwgYXMgZGVmaW5lZCBpbiBSRkMgMTgwOC4gVGhpcwotICogcm91dGluZSBpcyAoc2hvdWxkIGJlKSBPUyBpbmRlcGVuZGVudC4KLSAqCi0gKiBvc19lc2NhcGVfcGF0aCgpIGNvbnZlcnRzIGFuIE9TIHBhdGggdG8gYSBVUkwsIGluIGFuIE9TIGRlcGVuZGVudCB3YXkuIEluIGFsbAotICogY2FzZXMgaWYgYSAnOicgb2NjdXJzIGJlZm9yZSB0aGUgZmlyc3QgJy8nIGluIHRoZSBVUkwsIHRoZSBVUkwgc2hvdWxkIGJlCi0gKiBwcmVmaXhlZCB3aXRoICIuLyIgKG9yIHRoZSAnOicgZXNjYXBlZCkuIEluIHRoZSBjYXNlIG9mIFVuaXgsIHRoaXMgbWVhbnMKLSAqIGxlYXZpbmcgJy8nIGFsb25lLCBidXQgb3RoZXJ3aXNlIGRvaW5nIHdoYXQgZXNjYXBlX3BhdGhfc2VnbWVudCgpIGRvZXMuIEZvcgotICogZWZmaWNpZW5jeSByZWFzb25zLCB3ZSBkb24ndCB1c2UgZXNjYXBlX3BhdGhfc2VnbWVudCgpLCB3aGljaCBpcyBwcm92aWRlZCBmb3IKLSAqIHJlZmVyZW5jZS4gQWdhaW4sIFJGQyAxODA4IGlzIHdoZXJlIHRoaXMgc3R1ZmYgaXMgZGVmaW5lZC4KLSAqCi0gKiBJZiBwYXJ0aWFsIGlzIHNldCwgb3NfZXNjYXBlX3BhdGgoKSBhc3N1bWVzIHRoYXQgdGhlIHBhdGggd2lsbCBiZSBhcHBlbmRlZCB0bwotICogc29tZXRoaW5nIHdpdGggYSAnLycgaW4gaXQgKGFuZCB0aHVzIGRvZXMgbm90IHByZWZpeCAiLi8iKS4KLSAqLwotCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfZXNjYXBlX3BhdGhfc2VnbWVudChwb29sICpwLCBjb25zdCBjaGFyICpzZWdtZW50KQotewotICAgIGNoYXIgKmNvcHkgPSBhcF9wYWxsb2MocCwgMyAqIHN0cmxlbihzZWdtZW50KSArIDEpOwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXNlZ21lbnQ7Ci0gICAgdW5zaWduZWQgY2hhciAqZCA9ICh1bnNpZ25lZCBjaGFyICopY29weTsKLSAgICB1bnNpZ25lZCBjOwotCi0gICAgd2hpbGUgKChjID0gKnMpKSB7Ci0JaWYgKFRFU1RfQ0hBUihjLCBUX0VTQ0FQRV9QQVRIX1NFR01FTlQpKSB7Ci0JICAgIGQgPSBjMngoYywgZCk7Ci0JfQotCWVsc2UgewotCSAgICAqZCsrID0gYzsKLQl9Ci0JKytzOwotICAgIH0KLSAgICAqZCA9ICdcMCc7Ci0gICAgcmV0dXJuIGNvcHk7Ci19Ci0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9vc19lc2NhcGVfcGF0aChwb29sICpwLCBjb25zdCBjaGFyICpwYXRoLCBpbnQgcGFydGlhbCkKLXsKLSAgICBjaGFyICpjb3B5ID0gYXBfcGFsbG9jKHAsIDMgKiBzdHJsZW4ocGF0aCkgKyAzKTsKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwYXRoOwotICAgIHVuc2lnbmVkIGNoYXIgKmQgPSAodW5zaWduZWQgY2hhciAqKWNvcHk7Ci0gICAgdW5zaWduZWQgYzsKLQotICAgIGlmICghcGFydGlhbCkgewotCWNoYXIgKmNvbG9uID0gc3RyY2hyKHBhdGgsICc6Jyk7Ci0JY2hhciAqc2xhc2ggPSBzdHJjaHIocGF0aCwgJy8nKTsKLQotCWlmIChjb2xvbiAmJiAoIXNsYXNoIHx8IGNvbG9uIDwgc2xhc2gpKSB7Ci0JICAgICpkKysgPSAnLic7Ci0JICAgICpkKysgPSAnLyc7Ci0JfQotICAgIH0KLSAgICB3aGlsZSAoKGMgPSAqcykpIHsKLQlpZiAoVEVTVF9DSEFSKGMsIFRfT1NfRVNDQVBFX1BBVEgpKSB7Ci0JICAgIGQgPSBjMngoYywgZCk7Ci0JfQotCWVsc2UgewotCSAgICAqZCsrID0gYzsKLQl9Ci0JKytzOwotICAgIH0KLSAgICAqZCA9ICdcMCc7Ci0gICAgcmV0dXJuIGNvcHk7Ci19Ci0KLS8qIGFwX2VzY2FwZV91cmkgaXMgbm93IGEgbWFjcm8gZm9yIG9zX2VzY2FwZV9wYXRoICovCi0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9lc2NhcGVfaHRtbChwb29sICpwLCBjb25zdCBjaGFyICpzKQotewotICAgIGludCBpLCBqOwotICAgIGNoYXIgKng7Ci0KLSAgICAvKiBmaXJzdCwgY291bnQgdGhlIG51bWJlciBvZiBleHRyYSBjaGFyYWN0ZXJzICovCi0gICAgZm9yIChpID0gMCwgaiA9IDA7IHNbaV0gIT0gJ1wwJzsgaSsrKQotCWlmIChzW2ldID09ICc8JyB8fCBzW2ldID09ICc+JykKLQkgICAgaiArPSAzOwotCWVsc2UgaWYgKHNbaV0gPT0gJyYnKQotCSAgICBqICs9IDQ7Ci0KLSAgICBpZiAoaiA9PSAwKQotCXJldHVybiBhcF9wc3RybmR1cChwLCBzLCBpKTsKLQotICAgIHggPSBhcF9wYWxsb2MocCwgaSArIGogKyAxKTsKLSAgICBmb3IgKGkgPSAwLCBqID0gMDsgc1tpXSAhPSAnXDAnOyBpKyssIGorKykKLQlpZiAoc1tpXSA9PSAnPCcpIHsKLQkgICAgbWVtY3B5KCZ4W2pdLCAiJmx0OyIsIDQpOwotCSAgICBqICs9IDM7Ci0JfQotCWVsc2UgaWYgKHNbaV0gPT0gJz4nKSB7Ci0JICAgIG1lbWNweSgmeFtqXSwgIiZndDsiLCA0KTsKLQkgICAgaiArPSAzOwotCX0KLQllbHNlIGlmIChzW2ldID09ICcmJykgewotCSAgICBtZW1jcHkoJnhbal0sICImYW1wOyIsIDUpOwotCSAgICBqICs9IDQ7Ci0JfQotCWVsc2UKLQkgICAgeFtqXSA9IHNbaV07Ci0KLSAgICB4W2pdID0gJ1wwJzsKLSAgICByZXR1cm4geDsKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX2lzX2RpcmVjdG9yeShjb25zdCBjaGFyICpwYXRoKQotewotICAgIHN0cnVjdCBzdGF0IGZpbmZvOwotCi0gICAgaWYgKHN0YXQocGF0aCwgJmZpbmZvKSA9PSAtMSkKLQlyZXR1cm4gMDsJCS8qIGluIGVycm9yIGNvbmRpdGlvbiwganVzdCByZXR1cm4gbm8gKi8KLQotICAgIHJldHVybiAoU19JU0RJUihmaW5mby5zdF9tb2RlKSk7Ci19Ci0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9tYWtlX2Z1bGxfcGF0aChwb29sICphLCBjb25zdCBjaGFyICpzcmMxLAotCQkJCSAgY29uc3QgY2hhciAqc3JjMikKLXsKLSAgICByZWdpc3RlciBpbnQgeDsKLQotICAgIHggPSBzdHJsZW4oc3JjMSk7Ci0gICAgaWYgKHggPT0gMCkKLQlyZXR1cm4gYXBfcHN0cmNhdChhLCAiLyIsIHNyYzIsIE5VTEwpOwotCi0gICAgaWYgKHNyYzFbeCAtIDFdICE9ICcvJykKLQlyZXR1cm4gYXBfcHN0cmNhdChhLCBzcmMxLCAiLyIsIHNyYzIsIE5VTEwpOwotICAgIGVsc2UKLQlyZXR1cm4gYXBfcHN0cmNhdChhLCBzcmMxLCBzcmMyLCBOVUxMKTsKLX0KLQotLyoKLSAqIENoZWNrIGZvciBhbiBhYnNvbHV0ZVVSSSBzeW50YXggKHNlZSBzZWN0aW9uIDMuMiBpbiBSRkMyMDY4KS4KLSAqLwotQVBJX0VYUE9SVChpbnQpIGFwX2lzX3VybChjb25zdCBjaGFyICp1KQotewotICAgIHJlZ2lzdGVyIGludCB4OwotCi0gICAgZm9yICh4ID0gMDsgdVt4XSAhPSAnOic7IHgrKykgewotCWlmICgoIXVbeF0pIHx8Ci0JICAgICgoIWFwX2lzYWxwaGEodVt4XSkpICYmICghYXBfaXNkaWdpdCh1W3hdKSkgJiYKLQkgICAgICh1W3hdICE9ICcrJykgJiYgKHVbeF0gIT0gJy0nKSAmJiAodVt4XSAhPSAnLicpKSkgewotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuICh4ID8gMSA6IDApOwkJLyogSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyAnOicsIGl0J3MgYnJva2VuLCB0b28gKi8KLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX2Nhbl9leGVjKGNvbnN0IHN0cnVjdCBzdGF0ICpmaW5mbykKLXsKLSNpZmRlZiBNVUxUSVBMRV9HUk9VUFMKLSAgICBpbnQgY250OwotI2VuZGlmCi0jaWYgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lOMzIpCi0gICAgLyogT1MvMiBkb3Nlbid0IGhhdmUgVXNlcnMgYW5kIEdyb3VwcyAqLwotICAgIHJldHVybiAxOwotI2Vsc2UKLSAgICBpZiAoYXBfdXNlcl9pZCA9PSBmaW5mby0+c3RfdWlkKQotCWlmIChmaW5mby0+c3RfbW9kZSAmIFNfSVhVU1IpCi0JICAgIHJldHVybiAxOwotICAgIGlmIChhcF9ncm91cF9pZCA9PSBmaW5mby0+c3RfZ2lkKQotCWlmIChmaW5mby0+c3RfbW9kZSAmIFNfSVhHUlApCi0JICAgIHJldHVybiAxOwotI2lmZGVmIE1VTFRJUExFX0dST1VQUwotICAgIGZvciAoY250ID0gMDsgY250IDwgTkdST1VQU19NQVg7IGNudCsrKSB7Ci0JaWYgKGdyb3VwX2lkX2xpc3RbY250XSA9PSBmaW5mby0+c3RfZ2lkKQotCSAgICBpZiAoZmluZm8tPnN0X21vZGUgJiBTX0lYR1JQKQotCQlyZXR1cm4gMTsKLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm4gKGZpbmZvLT5zdF9tb2RlICYgU19JWE9USCk7Ci0jZW5kaWYKLX0KLQotI2lmZGVmIE5FRURfU1RSRFVQCi1jaGFyICpzdHJkdXAoY29uc3QgY2hhciAqc3RyKQotewotICAgIGNoYXIgKnNkdXA7Ci0KLSAgICBpZiAoIShzZHVwID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihzdHIpICsgMSkpKSB7Ci0JZnByaW50ZihzdGRlcnIsICJPdWNoISAgT3V0IG9mIG1lbW9yeSBpbiBvdXIgc3RyZHVwKCkhXG4iKTsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgc2R1cCA9IHN0cmNweShzZHVwLCBzdHIpOwotCi0gICAgcmV0dXJuIHNkdXA7Ci19Ci0jZW5kaWYKLQotLyogVGhlIGZvbGxvd2luZyB0d28gcm91dGluZXMgd2VyZSBkb25hdGVkIGZvciBTVlI0IGJ5IEFuZHJlYXMgVm9nZWwgKi8KLSNpZmRlZiBORUVEX1NUUkNBU0VDTVAKLWludCBzdHJjYXNlY21wKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIpCi17Ci0gICAgY29uc3QgY2hhciAqcCA9IGE7Ci0gICAgY29uc3QgY2hhciAqcSA9IGI7Ci0gICAgZm9yIChwID0gYSwgcSA9IGI7ICpwICYmICpxOyBwKyssIHErKykgewotCWludCBkaWZmID0gYXBfdG9sb3dlcigqcCkgLSBhcF90b2xvd2VyKCpxKTsKLQlpZiAoZGlmZikKLQkgICAgcmV0dXJuIGRpZmY7Ci0gICAgfQotICAgIGlmICgqcCkKLQlyZXR1cm4gMTsJCS8qIHAgd2FzIGxvbmdlciB0aGFuIHEgKi8KLSAgICBpZiAoKnEpCi0JcmV0dXJuIC0xOwkJLyogcCB3YXMgc2hvcnRlciB0aGFuIHEgKi8KLSAgICByZXR1cm4gMDsJCQkvKiBFeGFjdCBtYXRjaCAqLwotfQotCi0jZW5kaWYKLQotI2lmZGVmIE5FRURfU1RSTkNBU0VDTVAKLWludCBzdHJuY2FzZWNtcChjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpiLCBpbnQgbikKLXsKLSAgICBjb25zdCBjaGFyICpwID0gYTsKLSAgICBjb25zdCBjaGFyICpxID0gYjsKLQotICAgIGZvciAocCA9IGEsIHEgPSBiOyAvKk5PVEhJTkcgKi8gOyBwKyssIHErKykgewotCWludCBkaWZmOwotCWlmIChwID09IGEgKyBuKQotCSAgICByZXR1cm4gMDsJCS8qICAgTWF0Y2ggdXAgdG8gbiBjaGFyYWN0ZXJzICovCi0JaWYgKCEoKnAgJiYgKnEpKQotCSAgICByZXR1cm4gKnAgLSAqcTsKLQlkaWZmID0gYXBfdG9sb3dlcigqcCkgLSBhcF90b2xvd2VyKCpxKTsKLQlpZiAoZGlmZikKLQkgICAgcmV0dXJuIGRpZmY7Ci0gICAgfQotICAgIC8qTk9UUkVBQ0hFRCAqLwotfQotI2VuZGlmCi0KLS8qIFRoZSBmb2xsb3dpbmcgcm91dGluZSB3YXMgZG9uYXRlZCBmb3IgVVRTMjEgYnkgZHdkQGJlbGwtbGFicy5jb20gKi8KLSNpZmRlZiBORUVEX1NUUlNUUgotY2hhciAqc3Ryc3RyKGNoYXIgKnMxLCBjaGFyICpzMikKLXsKLSAgICBjaGFyICpwMSwgKnAyOwotICAgIGlmICgqczIgPT0gJ1wwJykgewotCS8qIGFuIGVtcHR5IHMyICovCi0gICAgICAgIHJldHVybihzMSk7Ci0gICAgfQotICAgIHdoaWxlKChzMSA9IHN0cmNocihzMSwgKnMyKSkgIT0gTlVMTCkgewotCS8qIGZvdW5kIGZpcnN0IGNoYXJhY3RlciBvZiBzMiwgc2VlIGlmIHRoZSByZXN0IG1hdGNoZXMgKi8KLSAgICAgICAgcDEgPSBzMTsKLSAgICAgICAgcDIgPSBzMjsKLSAgICAgICAgd2hpbGUgKCorK3AxID09ICorK3AyKSB7Ci0gICAgICAgICAgICBpZiAoKnAxID09ICdcMCcpIHsKLSAgICAgICAgICAgICAgICAvKiBib3RoIHN0cmluZ3MgZW5kZWQgdG9nZXRoZXIgKi8KLSAgICAgICAgICAgICAgICByZXR1cm4oczEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgqcDIgPT0gJ1wwJykgewotICAgICAgICAgICAgLyogc2Vjb25kIHN0cmluZyBlbmRlZCwgYSBtYXRjaCAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQkvKiBkaWRuJ3QgZmluZCBhIG1hdGNoIGhlcmUsIHRyeSBzdGFydGluZyBhdCBuZXh0IGNoYXJhY3RlciBpbiBzMSAqLwotICAgICAgICBzMSsrOwotICAgIH0KLSAgICByZXR1cm4oczEpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0lOSVRHUk9VUFMKLWludCBpbml0Z3JvdXBzKGNvbnN0IGNoYXIgKm5hbWUsIGdpZF90IGJhc2VnaWQpCi17Ci0jaWYgZGVmaW5lZChRTlgpIHx8IGRlZmluZWQoTVBFKSB8fCBkZWZpbmVkKEJFT1MpIHx8IGRlZmluZWQoX09TRF9QT1NJWCkgfHwgZGVmaW5lZChUUEYpIHx8IGRlZmluZWQoX19UQU5ERU0pCi0vKiBRTlgsIE1QRSBhbmQgQmVPUyBkbyBub3QgYXBwZWFyIHRvIHN1cHBvcnQgc3VwcGxlbWVudGFyeSBncm91cHMuICovCi0gICAgcmV0dXJuIDA7Ci0jZWxzZSAvKiBuZGVmIFFOWCAqLwotICAgIGdpZF90IGdyb3Vwc1tOR1JPVVBTX01BWF07Ci0gICAgc3RydWN0IGdyb3VwICpnOwotICAgIGludCBpbmRleCA9IDA7Ci0KLSAgICBzZXRncmVudCgpOwotCi0gICAgZ3JvdXBzW2luZGV4KytdID0gYmFzZWdpZDsKLQotICAgIHdoaWxlIChpbmRleCA8IE5HUk9VUFNfTUFYICYmICgoZyA9IGdldGdyZW50KCkpICE9IE5VTEwpKQotCWlmIChnLT5ncl9naWQgIT0gYmFzZWdpZCkgewotCSAgICBjaGFyICoqbmFtZXM7Ci0KLQkgICAgZm9yIChuYW1lcyA9IGctPmdyX21lbTsgKm5hbWVzICE9IE5VTEw7ICsrbmFtZXMpCi0JCWlmICghc3RyY21wKCpuYW1lcywgbmFtZSkpCi0JCSAgICBncm91cHNbaW5kZXgrK10gPSBnLT5ncl9naWQ7Ci0JfQotCi0gICAgZW5kZ3JlbnQoKTsKLQotICAgIHJldHVybiBzZXRncm91cHMoaW5kZXgsIGdyb3Vwcyk7Ci0jZW5kaWYgLyogZGVmIFFOWCAqLwotfQotI2VuZGlmIC8qIGRlZiBORUVEX0lOSVRHUk9VUFMgKi8KLQotI2lmZGVmIE5FRURfV0FJVFBJRAotLyogRnJvbSBpa2x1ZnRAYW1kYWhsLmNvbQotICogdGhpcyBpcyBub3QgaWRlYWwgYnV0IGl0IHdvcmtzIGZvciBTVlIzIHZhcmlhbnRzCi0gKiBNb2RpZmllZCBieSBkd2RAYmVsbC1sYWJzLmNvbSB0byBjYWxsIHdhaXQzIGluc3RlYWQgb2Ygd2FpdCBiZWNhdXNlCi0gKiAgIGFwYWNoZSBzdGFydGVkIHRvIHVzZSB0aGUgV05PSEFORyBvcHRpb24uCi0gKi8KLWludCB3YWl0cGlkKHBpZF90IHBpZCwgaW50ICpzdGF0dXNwLCBpbnQgb3B0aW9ucykKLXsKLSAgICBpbnQgdG1wX3BpZDsKLSAgICBpZiAoa2lsbChwaWQsIDApID09IC0xKSB7Ci0JZXJybm8gPSBFQ0hJTEQ7Ci0JcmV0dXJuIC0xOwotICAgIH0KLSAgICB3aGlsZSAoKCh0bXBfcGlkID0gd2FpdDMoc3RhdHVzcCwgb3B0aW9ucywgMCkpICE9IHBpZCkgJiYKLQkJKHRtcF9waWQgIT0gLTEpICYmICh0bXBfcGlkICE9IDApICYmIChwaWQgIT0gLTEpKQotCTsKLSAgICByZXR1cm4gdG1wX3BpZDsKLX0KLSNlbmRpZgotCi1BUElfRVhQT1JUKGludCkgYXBfaW5kKGNvbnN0IGNoYXIgKnMsIGNoYXIgYykKLXsKLSAgICByZWdpc3RlciBpbnQgeDsKLQotICAgIGZvciAoeCA9IDA7IHNbeF07IHgrKykKLQlpZiAoc1t4XSA9PSBjKQotCSAgICByZXR1cm4geDsKLQotICAgIHJldHVybiAtMTsKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX3JpbmQoY29uc3QgY2hhciAqcywgY2hhciBjKQotewotICAgIHJlZ2lzdGVyIGludCB4OwotCi0gICAgZm9yICh4ID0gc3RybGVuKHMpIC0gMTsgeCAhPSAtMTsgeC0tKQotCWlmIChzW3hdID09IGMpCi0JICAgIHJldHVybiB4OwotCi0gICAgcmV0dXJuIC0xOwotfQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX3N0cl90b2xvd2VyKGNoYXIgKnN0cikKLXsKLSAgICB3aGlsZSAoKnN0cikgewotCSpzdHIgPSBhcF90b2xvd2VyKCpzdHIpOwotCSsrc3RyOwotICAgIH0KLX0KLQotQVBJX0VYUE9SVCh1aWRfdCkgYXBfdW5hbWUyaWQoY29uc3QgY2hhciAqbmFtZSkKLXsKLSNpZmRlZiBXSU4zMgotICAgIHJldHVybiAoMSk7Ci0jZWxzZQotICAgIHN0cnVjdCBwYXNzd2QgKmVudDsKLQotICAgIGlmIChuYW1lWzBdID09ICcjJykKLQlyZXR1cm4gKGF0b2koJm5hbWVbMV0pKTsKLQotICAgIGlmICghKGVudCA9IGdldHB3bmFtKG5hbWUpKSkgewotCWZwcmludGYoc3RkZXJyLCAiJXM6IGJhZCB1c2VyIG5hbWUgJXNcbiIsIGFwX3NlcnZlcl9hcmd2MCwgbmFtZSk7Ci0JZXhpdCgxKTsKLSAgICB9Ci0gICAgcmV0dXJuIChlbnQtPnB3X3VpZCk7Ci0jZW5kaWYKLX0KLQotQVBJX0VYUE9SVChnaWRfdCkgYXBfZ25hbWUyaWQoY29uc3QgY2hhciAqbmFtZSkKLXsKLSNpZmRlZiBXSU4zMgotICAgIHJldHVybiAoMSk7Ci0jZWxzZQotICAgIHN0cnVjdCBncm91cCAqZW50OwotCi0gICAgaWYgKG5hbWVbMF0gPT0gJyMnKQotCXJldHVybiAoYXRvaSgmbmFtZVsxXSkpOwotCi0gICAgaWYgKCEoZW50ID0gZ2V0Z3JuYW0obmFtZSkpKSB7Ci0JZnByaW50ZihzdGRlcnIsICIlczogYmFkIGdyb3VwIG5hbWUgJXNcbiIsIGFwX3NlcnZlcl9hcmd2MCwgbmFtZSk7Ci0JZXhpdCgxKTsKLSAgICB9Ci0gICAgcmV0dXJuIChlbnQtPmdyX2dpZCk7Ci0jZW5kaWYKLX0KLQotCi0vKgotICogUGFyc2VzIGEgaG9zdCBvZiB0aGUgZm9ybSA8YWRkcmVzcz5bOnBvcnRdCi0gKiA6cG9ydCBpcyBwZXJtaXR0ZWQgaWYgJ3BvcnQnIGlzIG5vdCBOVUxMCi0gKi8KLXVuc2lnbmVkIGxvbmcgYXBfZ2V0X3ZpcnRob3N0X2FkZHIoY2hhciAqdywgdW5zaWduZWQgc2hvcnQgKnBvcnRzKQotewotICAgIHN0cnVjdCBob3N0ZW50ICpoZXA7Ci0gICAgdW5zaWduZWQgbG9uZyBteV9hZGRyOwotICAgIGNoYXIgKnA7Ci0KLSAgICBwID0gc3RyY2hyKHcsICc6Jyk7Ci0gICAgaWYgKHBvcnRzICE9IE5VTEwpIHsKLQkqcG9ydHMgPSAwOwotCWlmIChwICE9IE5VTEwgJiYgc3RyY21wKHAgKyAxLCAiKiIpICE9IDApCi0JICAgICpwb3J0cyA9IGF0b2kocCArIDEpOwotICAgIH0KLQotICAgIGlmIChwICE9IE5VTEwpCi0JKnAgPSAnXDAnOwotICAgIGlmIChzdHJjbXAodywgIioiKSA9PSAwKSB7Ci0JaWYgKHAgIT0gTlVMTCkKLQkgICAgKnAgPSAnOic7Ci0JcmV0dXJuIGh0b25sKElOQUREUl9BTlkpOwotICAgIH0KLQotICAgIG15X2FkZHIgPSBhcF9pbmV0X2FkZHIoKGNoYXIgKil3KTsKLSAgICBpZiAobXlfYWRkciAhPSBJTkFERFJfTk9ORSkgewotCWlmIChwICE9IE5VTEwpCi0JICAgICpwID0gJzonOwotCXJldHVybiBteV9hZGRyOwotICAgIH0KLQotICAgIGhlcCA9IGdldGhvc3RieW5hbWUodyk7Ci0KLSAgICBpZiAoKCFoZXApIHx8IChoZXAtPmhfYWRkcnR5cGUgIT0gQUZfSU5FVCB8fCAhaGVwLT5oX2FkZHJfbGlzdFswXSkpIHsKLQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCByZXNvbHZlIGhvc3QgbmFtZSAlcyAtLS0gZXhpdGluZyFcbiIsIHcpOwotCWV4aXQoMSk7Ci0gICAgfQotCi0gICAgaWYgKGhlcC0+aF9hZGRyX2xpc3RbMV0pIHsKLQlmcHJpbnRmKHN0ZGVyciwgIkhvc3QgJXMgaGFzIG11bHRpcGxlIGFkZHJlc3NlcyAtLS1cbiIsIHcpOwotCWZwcmludGYoc3RkZXJyLCAieW91IG11c3QgY2hvb3NlIG9uZSBleHBsaWNpdGx5IGZvciB1c2UgYXNcbiIpOwotCWZwcmludGYoc3RkZXJyLCAiYSB2aXJ0dWFsIGhvc3QuICBFeGl0aW5nISEhXG4iKTsKLQlleGl0KDEpOwotICAgIH0KLQotICAgIGlmIChwICE9IE5VTEwpCi0JKnAgPSAnOic7Ci0KLSAgICByZXR1cm4gKChzdHJ1Y3QgaW5fYWRkciAqKSAoaGVwLT5oX2FkZHIpKS0+c19hZGRyOwotfQotCi0KLXN0YXRpYyBjaGFyICpmaW5kX2ZxZG4ocG9vbCAqYSwgc3RydWN0IGhvc3RlbnQgKnApCi17Ci0gICAgaW50IHg7Ci0KLSAgICBpZiAoIXN0cmNocihwLT5oX25hbWUsICcuJykpIHsKLQlmb3IgKHggPSAwOyBwLT5oX2FsaWFzZXNbeF07ICsreCkgewotCSAgICBpZiAoc3RyY2hyKHAtPmhfYWxpYXNlc1t4XSwgJy4nKSAmJgotCQkoIXN0cm5jYXNlY21wKHAtPmhfYWxpYXNlc1t4XSwgcC0+aF9uYW1lLCBzdHJsZW4ocC0+aF9uYW1lKSkpKQotCQlyZXR1cm4gYXBfcHN0cmR1cChhLCBwLT5oX2FsaWFzZXNbeF0pOwotCX0KLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIGFwX3BzdHJkdXAoYSwgKHZvaWQgKikgcC0+aF9uYW1lKTsKLX0KLQotY2hhciAqYXBfZ2V0X2xvY2FsX2hvc3QocG9vbCAqYSkKLXsKLSNpZm5kZWYgTUFYSE9TVE5BTUVMRU4KLSNkZWZpbmUgTUFYSE9TVE5BTUVMRU4gMjU2Ci0jZW5kaWYKLSAgICBjaGFyIHN0cltNQVhIT1NUTkFNRUxFTiArIDFdOwotICAgIGNoYXIgKnNlcnZlcl9ob3N0bmFtZTsKLSAgICBzdHJ1Y3QgaG9zdGVudCAqcDsKLQotI2lmZGVmIEJFT1MgLyogQmVPUyByZXR1cm5zIHplcm8gYXMgYW4gZXJyb3IgZm9yIGdldGhvc3RuYW1lICovCi0gICAgaWYgKGdldGhvc3RuYW1lKHN0ciwgc2l6ZW9mKHN0cikgLSAxKSA9PSAwKSB7Ci0jZWxzZSAgICAKLSAgICBpZiAoZ2V0aG9zdG5hbWUoc3RyLCBzaXplb2Yoc3RyKSAtIDEpICE9IDApIHsKLSNlbmRpZiAvKiBCZU9TICovCi0JcGVycm9yKCJVbmFibGUgdG8gZ2V0aG9zdG5hbWUiKTsKLQlleGl0KDEpOwotICAgIH0KLSAgICBzdHJbTUFYSE9TVE5BTUVMRU5dID0gJ1wwJzsKLSAgICBpZiAoKCEocCA9IGdldGhvc3RieW5hbWUoc3RyKSkpIHx8ICghKHNlcnZlcl9ob3N0bmFtZSA9IGZpbmRfZnFkbihhLCBwKSkpKSB7Ci0JZnByaW50ZihzdGRlcnIsICIlczogY2Fubm90IGRldGVybWluZSBsb2NhbCBob3N0IG5hbWUuXG4iLAotCQlhcF9zZXJ2ZXJfYXJndjApOwotCWZwcmludGYoc3RkZXJyLCAiVXNlIHRoZSBTZXJ2ZXJOYW1lIGRpcmVjdGl2ZSB0byBzZXQgaXQgbWFudWFsbHkuXG4iKTsKLQlleGl0KDEpOwotICAgIH0KLQotICAgIHJldHVybiBzZXJ2ZXJfaG9zdG5hbWU7Ci19Ci0KLS8qIHNpbXBsZSAncG9vbCcgYWxsb2MoKWluZyBnbHVlIHRvIGFwX2Jhc2U2NC5jCi0gKi8KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9wYmFzZTY0ZGVjb2RlKHBvb2wgKnAsIGNvbnN0IGNoYXIgKmJ1ZmNvZGVkKQotewotICAgIGNoYXIgKmRlY29kZWQ7Ci0gICAgaW50IGw7Ci0KLSAgICBkZWNvZGVkID0gKGNoYXIgKikgYXBfcGFsbG9jKHAsIDEgKyBhcF9iYXNlNjRkZWNvZGVfbGVuKGJ1ZmNvZGVkKSk7Ci0gICAgbCA9IGFwX2Jhc2U2NGRlY29kZShkZWNvZGVkLCBidWZjb2RlZCk7Ci0gICAgZGVjb2RlZFtsXSA9ICdcMCc7IC8qIG1ha2UgYmluYXJ5IHNlcXVlbmNlIGludG8gc3RyaW5nICovCi0KLSAgICByZXR1cm4gZGVjb2RlZDsKLX0KLQotQVBJX0VYUE9SVChjaGFyICopIGFwX3BiYXNlNjRlbmNvZGUocG9vbCAqcCwgY2hhciAqc3RyaW5nKSAKLXsgCi0gICAgY2hhciAqZW5jb2RlZDsKLSAgICBpbnQgbCA9IHN0cmxlbihzdHJpbmcpOwotCi0gICAgZW5jb2RlZCA9IChjaGFyICopIGFwX3BhbGxvYyhwLCAxICsgYXBfYmFzZTY0ZW5jb2RlX2xlbihsKSk7Ci0gICAgbCA9IGFwX2Jhc2U2NGVuY29kZShlbmNvZGVkLCBzdHJpbmcsIGwpOwotICAgIGVuY29kZWRbbF0gPSAnXDAnOyAvKiBtYWtlIGJpbmFyeSBzZXF1ZW5jZSBpbnRvIHN0cmluZyAqLwotCi0gICAgcmV0dXJuIGVuY29kZWQ7Ci19Ci0KLS8qIGRlcHJlY2F0ZWQgbmFtZXMgZm9yIHRoZSBhYm92ZSB0d28gZnVuY3Rpb25zLCBoZXJlIGZvciBjb21wYXRpYmlsaXR5Ci0gKi8KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF91dWRlY29kZShwb29sICpwLCBjb25zdCBjaGFyICpidWZjb2RlZCkKLXsKLSAgICByZXR1cm4gYXBfcGJhc2U2NGRlY29kZShwLCBidWZjb2RlZCk7Ci19Ci0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF91dWVuY29kZShwb29sICpwLCBjaGFyICpzdHJpbmcpIAoteyAKLSAgICByZXR1cm4gYXBfcGJhc2U2NGVuY29kZShwLCBzdHJpbmcpOwotfQotCi0jaWZkZWYgT1MyCi12b2lkIG9zMnBhdGhuYW1lKGNoYXIgKnBhdGgpCi17Ci0gICAgY2hhciBuZXdwYXRoW01BWF9TVFJJTkdfTEVOXTsKLSAgICBpbnQgbG9vcDsKLSAgICBpbnQgb2Zmc2V0OwotCi0gICAgb2Zmc2V0ID0gMDsKLSAgICBmb3IgKGxvb3AgPSAwOyBsb29wIDwgKHN0cmxlbihwYXRoKSArIDEpICYmIGxvb3AgPCBzaXplb2YobmV3cGF0aCkgLSAxOyBsb29wKyspIHsKLQlpZiAocGF0aFtsb29wXSA9PSAnLycpIHsKLQkgICAgbmV3cGF0aFtvZmZzZXRdID0gJ1xcJzsKLQkgICAgLyoKLQkgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgMTsKLQkgICAgICAgbmV3cGF0aFtvZmZzZXRdID0gJ1xcJzsKLQkgICAgICovCi0JfQotCWVsc2UKLQkgICAgbmV3cGF0aFtvZmZzZXRdID0gcGF0aFtsb29wXTsKLQlvZmZzZXQgPSBvZmZzZXQgKyAxOwotICAgIH07Ci0gICAgLyogRGVidWdnaW5nIGNvZGUgKi8KLSAgICAvKiBmcHJpbnRmKHN0ZGVyciwgIiVzIFxuIiwgbmV3cGF0aCk7ICovCi0KLSAgICBzdHJjcHkocGF0aCwgbmV3cGF0aCk7Ci19OwotCi0vKiBxdW90ZXMgaW4gdGhlIHN0cmluZyBhcmUgZG91YmxlZCB1cC4KLSAqIFVzZWQgdG8gZXNjYXBlIHF1b3RlcyBpbiBhcmdzIHBhc3NlZCB0byBPUy8yJ3MgY21kLmV4ZQotICovCi1jaGFyICphcF9kb3VibGVfcXVvdGVzKHBvb2wgKnAsIGNoYXIgKnN0cikKLXsKLSAgICBpbnQgbnVtX3F1b3RlcyA9IDA7Ci0gICAgaW50IGxlbiA9IDA7Ci0gICAgY2hhciAqcXVvdGVfZG91YmxlZF9zdHIsICpkZXN0OwotICAgIAotICAgIHdoaWxlIChzdHJbbGVuXSkgewotICAgICAgICBudW1fcXVvdGVzICs9IHN0cltsZW4rK10gPT0gJ1wiJzsKLSAgICB9Ci0gICAgCi0gICAgcXVvdGVfZG91YmxlZF9zdHIgPSBhcF9wYWxsb2MocCwgbGVuICsgbnVtX3F1b3RlcyArIDEpOwotICAgIGRlc3QgPSBxdW90ZV9kb3VibGVkX3N0cjsKLSAgICAKLSAgICB3aGlsZSAoKnN0cikgewotICAgICAgICBpZiAoKnN0ciA9PSAnXCInKQotICAgICAgICAgICAgKihkZXN0KyspID0gJ1wiJzsKLSAgICAgICAgKihkZXN0KyspID0gKihzdHIrKyk7Ci0gICAgfQotICAgIAotICAgICpkZXN0ID0gMDsKLSAgICByZXR1cm4gcXVvdGVfZG91YmxlZF9zdHI7Ci19Ci0jZW5kaWYKLQotCi0jaWZkZWYgTkVFRF9TVFJFUlJPUgotY2hhciAqCi0gICAgIHN0cmVycm9yKGludCBlcnIpCi17Ci0KLSAgICBjaGFyICpwOwotICAgIGV4dGVybiBjaGFyICpjb25zdCBzeXNfZXJybGlzdFtdOwotCi0gICAgcCA9IHN5c19lcnJsaXN0W2Vycl07Ci0gICAgcmV0dXJuIChwKTsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChORUVEX0RJRkZUSU1FKQotZG91YmxlIGRpZmZ0aW1lKHRpbWVfdCB0aW1lMSwgdGltZV90IHRpbWUwKQotewotICAgIHJldHVybiAodGltZTEgLSB0aW1lMCk7Ci19Ci0jZW5kaWYKLQotLyogd2Ugd2FudCB0byBkb3duY2FzZSB0aGUgdHlwZS9zdWJ0eXBlIGZvciBjb21wYXJpc29uIHB1cnBvc2VzCi0gKiBidXQgbm90aGluZyBlbHNlIGJlY2F1c2UgO3BhcmFtZXRlcj1mb28gdmFsdWVzIGFyZSBjYXNlIHNlbnNpdGl2ZS4KLSAqIFhYWDogaW4gdHJ1dGggd2Ugd2FudCB0byBkb3duY2FzZSBwYXJhbWV0ZXIgbmFtZXMuLi4gYnV0IHJlYWxseSwKLSAqIGFwYWNoZSBoYXMgbmV2ZXIgaGFuZGxlZCBwYXJhbWV0ZXJzIGFuZCBzdWNoIGNvcnJlY3RseS4gIFlvdQotICogYWxzbyBuZWVkIHRvIGNvbXByZXNzIHNwYWNlcyBhbmQgc3VjaCB0byBiZSBhYmxlIHRvIGNvbXBhcmUKLSAqIHByb3Blcmx5LiAtZGpnCi0gKi8KLUFQSV9FWFBPUlQodm9pZCkgYXBfY29udGVudF90eXBlX3RvbG93ZXIoY2hhciAqc3RyKQotewotICAgIGNoYXIgKnNlbWk7Ci0KLSAgICBzZW1pID0gc3RyY2hyKHN0ciwgJzsnKTsKLSAgICBpZiAoc2VtaSkgewotCSpzZW1pID0gJ1wwJzsKLSAgICB9Ci0gICAgd2hpbGUgKCpzdHIpIHsKLQkqc3RyID0gYXBfdG9sb3dlcigqc3RyKTsKLQkrK3N0cjsKLSAgICB9Ci0gICAgaWYgKHNlbWkpIHsKLQkqc2VtaSA9ICc7JzsKLSAgICB9Ci19Ci0KLS8qCi0gKiBHaXZlbiBhIHN0cmluZywgcmVwbGFjZSBhbnkgYmFyZSAiIHdpdGggXCIgLgotICovCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfZXNjYXBlX3F1b3RlcyAocG9vbCAqcCwgY29uc3QgY2hhciAqaW5zdHJpbmcpCi17Ci0gICAgaW50IG5ld2xlbiA9IDA7Ci0gICAgY29uc3QgY2hhciAqaW5jaHIgPSBpbnN0cmluZzsKLSAgICBjaGFyICpvdXRjaHIsICpvdXRzdHJpbmc7Ci0KLSAgICAvKgotICAgICAqIExvb2sgdGhyb3VnaCB0aGUgaW5wdXQgc3RyaW5nLCBqb2dnaW5nIHRoZSBsZW5ndGggb2YgdGhlIG91dHB1dAotICAgICAqIHN0cmluZyB1cCBieSBhbiBleHRyYSBieXRlIGVhY2ggdGltZSB3ZSBmaW5kIGFuIHVuZXNjYXBlZCAiLgotICAgICAqLwotICAgIHdoaWxlICgqaW5jaHIgIT0gJ1wwJykgewotCW5ld2xlbisrOwotICAgICAgICBpZiAoKmluY2hyID09ICciJykgewotCSAgICBuZXdsZW4rKzsKLQl9Ci0JLyoKLQkgKiBJZiB3ZSBmaW5kIGEgc2xvc2gsIGFuZCBpdCdzIG5vdCB0aGUgbGFzdCBieXRlIGluIHRoZSBzdHJpbmcsCi0JICogaXQncyBlc2NhcGluZyBzb21ldGhpbmcgLSBhZHZhbmNlIHBhc3QgYm90aCBieXRlcy4KLQkgKi8KLQlpZiAoKCppbmNociA9PSAnXFwnKSAmJiAoaW5jaHJbMV0gIT0gJ1wwJykpIHsKLQkgICAgaW5jaHIrKzsKLQkgICAgbmV3bGVuKys7Ci0JfQotCWluY2hyKys7Ci0gICAgfQotICAgIG91dHN0cmluZyA9IGFwX3BhbGxvYyhwLCBuZXdsZW4gKyAxKTsKLSAgICBpbmNociA9IGluc3RyaW5nOwotICAgIG91dGNociA9IG91dHN0cmluZzsKLSAgICAvKgotICAgICAqIE5vdyBjb3B5IHRoZSBpbnB1dCBzdHJpbmcgdG8gdGhlIG91dHB1dCBzdHJpbmcsIGluc2VydGluZyBhIHNsb3NoCi0gICAgICogaW4gZnJvbnQgb2YgZXZlcnkgIiB0aGF0IGRvZXNuJ3QgYWxyZWFkeSBoYXZlIG9uZS4KLSAgICAgKi8KLSAgICB3aGlsZSAoKmluY2hyICE9ICdcMCcpIHsKLQlpZiAoKCppbmNociA9PSAnXFwnKSAmJiAoaW5jaHJbMV0gIT0gJ1wwJykpIHsKLQkgICAgKm91dGNocisrID0gKmluY2hyKys7Ci0JICAgICpvdXRjaHIrKyA9ICppbmNocisrOwotCX0KLQlpZiAoKmluY2hyID09ICciJykgewotCSAgICAqb3V0Y2hyKysgPSAnXFwnOwotCX0KLQlpZiAoKmluY2hyICE9ICdcMCcpIHsKLQkgICAgKm91dGNocisrID0gKmluY2hyKys7Ci0JfQotICAgIH0KLSAgICAqb3V0Y2hyID0gJ1wwJzsKLSAgICByZXR1cm4gb3V0c3RyaW5nOwotfQpkaWZmIC0tZ2l0IGEvc2VydmVyL3V0aWxfY2ZndHJlZS5jIGIvc2VydmVyL3V0aWxfY2ZndHJlZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzgyZTFjLi4wMDAwMDAwCi0tLSBhL3NlcnZlci91dGlsX2NmZ3RyZWUuYworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotI2RlZmluZSBDT1JFX1BSSVZBVEUKLSNpbmNsdWRlICJ1dGlsX2NmZ3RyZWUuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotYXBfZGlyZWN0aXZlX3QgKmNvbmZfdHJlZTsKLQotYXBfZGlyZWN0aXZlX3QgKmFwX2FkZF9ub2RlKGFwX2RpcmVjdGl2ZV90ICoqcGFyZW50LCBhcF9kaXJlY3RpdmVfdCAqY3VycmVudCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfZGlyZWN0aXZlX3QgKnRvYWRkLCBpbnQgY2hpbGQpCi17Ci0gICAgaWYgKGN1cnJlbnQgPT0gTlVMTCkgewotICAgICAgICAvKiB3ZSBqdXN0IHN0YXJ0ZWQgYSBuZXcgcGFyZW50ICovCi0gICAgICAgIGlmICgqcGFyZW50ID09IE5VTEwpIHsKLSAgICAgICAgICAgIC8qIG5vIHBhcmVudCwgbm8gY3VycmVudDogcm9vdCBvZiB0cmVlICovCi0gICAgICAgICAgICBjb25mX3RyZWUgPSB0b2FkZDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICgqcGFyZW50KS0+Zmlyc3RfY2hpbGQgPSB0b2FkZDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG9hZGQ7Ci0gICAgfQotICAgIGN1cnJlbnQtPm5leHQgPSB0b2FkZDsKLSAgICB0b2FkZC0+cGFyZW50ID0gKnBhcmVudDsKLSAgICBpZiAoY2hpbGQpIHsKLSAgICAgICAgLyogc3dpdGNoIHBhcmVudHMsIG5hdmlnYXRlIGludG8gY2hpbGQgKi8KLSAgICAgICAgKnBhcmVudCA9IHRvYWRkOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbmZfdHJlZTsKLX0KLQotCmRpZmYgLS1naXQgYS9zZXJ2ZXIvdXRpbF9jaGFyc2V0LmMgYi9zZXJ2ZXIvdXRpbF9jaGFyc2V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNjEzZjkuLjAwMDAwMDAKLS0tIGEvc2VydmVyL3V0aWxfY2hhcnNldC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotCi0jaWZkZWYgQVBBQ0hFX1hMQVRFCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAidXRpbF9jaGFyc2V0LmgiCi0KLS8qIGFwX2hkcnNfdG9fYXNjaWksIGFwX2hkcnNfZnJvbV9hc2NpaQotICoKLSAqIFRoZXNlIGFyZSB0aGUgdHJhbnNsYXRpb24gaGFuZGxlcyB1c2VkIHRvIHRyYW5zbGF0ZSBiZXR3ZWVuIHRoZSBuZXR3b3JrCi0gKiBmb3JtYXQgb2YgcHJvdG9jb2wgaGVhZGVycyBhbmQgdGhlIGxvY2FsIG1hY2hpbmUgZm9ybWF0LgotICoKLSAqIEZvciBhbiBFQkNESUMgbWFjaGluZSwgdGhlc2UgYXJlIHZhbGlkIGhhbmRsZXMgd2hpY2ggYXJlIHNldCB1cCBhdAotICogaW5pdGlhbGl6YXRpb24gdG8gdHJhbnNsYXRlIGJldHdlZW4gSVNPLTg4NTktMSBhbmQgdGhlIGNvZGUgcGFnZSBvZgotICogdGhlIHNvdXJjZSBjb2RlLgotICoKLSAqIEZvciBhbiBBU0NJSSBtYWNoaW5lLCB0aGVzZSByZW1haW4gTlVMTCBzbyB0aGF0IHdoZW4gdGhleSBhcmUgc3RvcmVkCi0gKiBpbiB0aGUgQlVGRiB2aWEgYXBfYnNldG9wKEJPX1dYTEFURSBvciBCT19SWExBVEUpIGl0IGVuc3VyZXMgdGhhdCBubwotICogdHJhbnNsYXRpb24gaXMgcGVyZm9ybWVkLgotICovCi0gCi1hcF94bGF0ZV90ICphcF9oZHJzX3RvX2FzY2lpLCAqYXBfaGRyc19mcm9tX2FzY2lpOwotCi0vKiBhcF9sb2NhbGVfdG9fYXNjaWksIGFwX2xvY2FsZV9mcm9tX2FzY2lpCi0gKgotICogVGhlc2UgaGFuZGxlcyBhcmUgdXNlZCBmb3IgdGhlIHRyYW5zbGF0aW9uIG9mIGNvbnRlbnQsIHVubGVzcyBhCi0gKiBjb25maWd1cmF0aW9uIG1vZHVsZSBvdmVycmlkZXMgdGhlbS4KLSAqCi0gKiBGb3IgYW4gRUJDRElDIG1hY2hpbmUsIHRoZXNlIGFyZSB2YWxpZCBoYW5kbGVzIHdoaWNoIGFyZSBzZXQgdXAgYXQKLSAqIGluaXRpYWxpemF0aW9uIHRvIHRyYW5zbGF0ZSBiZXR3ZWVuIElTTy04ODU5LTEgYW5kIHRoZSBjb2RlIHBhZ2Ugb2YKLSAqIHRoZSBodHRwZCBwcm9jZXNzJ3MgbG9jYWxlLgotICoKLSAqIEZvciBhbiBBU0NJSSBtYWNoaW5lLCB0aGVzZSByZW1haW4gTlVMTCBzbyB0aGF0IG5vIHRyYW5zbGF0aW9uIGlzCi0gKiBwZXJmb3JtZWQgKHVubGVzcyBhIGNvbmZpZ3VyYXRpb24gbW9kdWxlIGRvZXMgc29tZXRoaW5nLCBvZiBjb3Vyc2UpLgotICovCi0KLWFwX3hsYXRlX3QgKmFwX2xvY2FsZV90b19hc2NpaSwgKmFwX2xvY2FsZV9mcm9tX2FzY2lpOwotCi1BUElfRVhQT1JUKGFwX3N0YXR1c190KSBhcF9zZXRfY29udGVudF94bGF0ZShyZXF1ZXN0X3JlYyAqciwgaW50IG91dHB1dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF94bGF0ZV90ICp4bGF0ZSkKLXsKLSAgICBhcF9zdGF0dXNfdCBydjsKLQotICAgIGlmIChvdXRwdXQpIHsKLSAgICAgICAgci0+cnJ4LT50b19uZXQgPSB4bGF0ZTsKLSAgICAgICAgcnYgPSBhcF9ic2V0b3B0KHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQk9fV1hMQVRFLCAmeGxhdGUpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgci0+cnJ4LT5mcm9tX25ldCA9IHhsYXRlOwotICAgICAgICBydiA9IGFwX2JzZXRvcHQoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCT19SWExBVEUsICZ4bGF0ZSk7Ci0gICAgfQotCi0gICAgaWYgKHJ2KSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBydiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAiQk9fJXNYTEFURSBmYWlsZWQiLAotICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA/ICJXIiA6ICJSIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJ2OwotfQotCi0jZW5kaWYgLypBUEFDSEVfWExBVEUqLwpkaWZmIC0tZ2l0IGEvc2VydmVyL3V0aWxfZGVidWcuYyBiL3NlcnZlci91dGlsX2RlYnVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNWZkY2EuLjAwMDAwMDAKLS0tIGEvc2VydmVyL3V0aWxfZGVidWcuYworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0KLSNpZmRlZiBBUF9ERUJVRwotIyB1bmRlZiBzdHJjaHIKLQotY2hhciAqYXBfc3RyY2hyKGNoYXIgKnMsIGludCBjKQoteyByZXR1cm4gc3RyY2hyKHMsYyk7IH0KLQotY29uc3QgY2hhciAqYXBfc3RyY2hyX2MoY29uc3QgY2hhciAqcywgaW50IGMpCi17IHJldHVybiBzdHJjaHIocyxjKTsgfQotCi0jIHVuZGVmIHN0cnJjaHIKLQotY2hhciAqYXBfc3RycmNocihjaGFyICpzLCBpbnQgYykKLXsgcmV0dXJuIHN0cnJjaHIocyxjKTsgfQotCi1jb25zdCBjaGFyICphcF9zdHJyY2hyX2MoY29uc3QgY2hhciAqcywgaW50IGMpCi17IHJldHVybiBzdHJyY2hyKHMsYyk7IH0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2ZXIvdXRpbF9lYmNkaWMuYyBiL3NlcnZlci91dGlsX2ViY2RpYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWY1ZTRjLi4wMDAwMDAwCi0tLSBhL3NlcnZlci91dGlsX2ViY2RpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQotICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKi8KLQotI2RlZmluZSBDT1JFX1BSSVZBVEUKLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLQotI2lmZGVmIENIQVJTRVRfRUJDRElDCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAidXRpbF9lYmNkaWMuaCIKLQotYXBfeGxhdGVfdCAqaGRyc190b19hc2NpaSwgKmhkcnNfZnJvbV9hc2NpaTsKLWFwX3hsYXRlX3QgKmxvY2FsZV90b19hc2NpaSwgKmxvY2FsZV9mcm9tX2FzY2lpOwotCi1hcF9zdGF0dXNfdCBhcF9pbml0X2ViY2RpYyhhcF9wb29sX3QgKnBvb2wpCi17Ci0gICAgYXBfc3RhdHVzX3QgcnY7Ci0gICAgY2hhciBidWZbODBdOwotCi0gICAgcnYgPSBhcF94bGF0ZV9vcGVuKCZoZHJzX3RvX2FzY2lpLCAiSVNPODg1OS0xIiwgQVBSX0RFRkFVTFRfQ0hBUlNFVCwgcG9vbCk7Ci0gICAgaWYgKHJ2KSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHJ2LCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgImFwX3hsYXRlX29wZW4oKSBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIHJ2OwotICAgIH0KLQotICAgIHJ2ID0gYXBfeGxhdGVfb3BlbigmaGRyc19mcm9tX2FzY2lpLCBBUFJfREVGQVVMVF9DSEFSU0VULCAiSVNPODg1OS0xIiwgcG9vbCk7Ci0gICAgaWYgKHJ2KSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHJ2LCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgImFwX3hsYXRlX29wZW4oKSBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIHJ2OwotICAgIH0KLQotICAgIGxvY2FsZV90b19hc2NpaSA9IGhkcnNfdG9fYXNjaWk7IC8qIFRPRE86ICJJU084ODU5LTEiIHRvIEFQUl9MT0NBTEVfQ0hBUlNFVCAqLwotICAgIGxvY2FsZV9mcm9tX2FzY2lpID0gaGRyc19mcm9tX2FzY2lpOyAvKiBUT0RPOiBBUFJfTE9DQUxFX0NIQVJTRVQgdG8gIklTTzg4NTktMSIgKi8KLQotICAgIHJ2ID0gYXBfTUQ1SW5pdEVCQ0RJQyhoZHJzX3RvX2FzY2lpKTsKLSAgICBpZiAocnYpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgcnYsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAiYXBfTUQ1SW5pdEVCQ0RJQygpIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gcnY7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLX0KLQotI2VuZGlmIC8qIENIQVJTRVRfRUJDRElDICovCmRpZmYgLS1naXQgYS9zZXJ2ZXIvdXRpbF9maWx0ZXIuYyBiL3NlcnZlci91dGlsX2ZpbHRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2JkYzk4Li4wMDAwMDAwCi0tLSBhL3NlcnZlci91dGlsX2ZpbHRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLSNpbmNsdWRlICJ1dGlsX2ZpbHRlci5oIgotCi0vKgotICogYXBfZmlsdGVyX3JlY190OgotICoKLSAqIFRoaXMgKGludGVybmFsKSBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgcmVjb3JkaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICogcmVnaXN0ZXJlZCBmaWx0ZXJzLiBJdCBhc3NvY2lhdGVzIGEgbmFtZSB3aXRoIHRoZSBmaWx0ZXIncyBjYWxsYmFjawotICogYW5kIGZpbHRlciB0eXBlLgotICoKLSAqIEF0IHRoZSBtb21lbnQsIHRoZXNlIGFyZSBzaW1wbHkgbGlua2VkIGluIGEgY2hhaW4sIHNvIGEgLT5uZXh0IHBvaW50ZXIKLSAqIGlzIGF2YWlsYWJsZS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgYXBfZmlsdGVyX3JlY190IHsKLSAgICBjb25zdCBjaGFyICpuYW1lOwotICAgIGFwX2ZpbHRlcl9mdW5jIGZpbHRlcl9mdW5jOwotICAgIGFwX2ZpbHRlcl90eXBlIGZ0eXBlOwotCi0gICAgc3RydWN0IGFwX2ZpbHRlcl9yZWNfdCAqbmV4dDsKLX0gYXBfZmlsdGVyX3JlY190OwotCi0vKiAjIyMgbWFrZSB0aGlzIHZpc2libGUgZm9yIGRpcmVjdCBtYW5pcHVsYXRpb24/Ci0gICAjIyMgdXNlIGEgaGFzaCB0YWJsZQotKi8KLXN0YXRpYyBhcF9maWx0ZXJfcmVjX3QgKnJlZ2lzdGVyZWRfZmlsdGVycyA9IE5VTEw7Ci0KLS8qIE5PVEU6IEFwYWNoZSdzIGN1cnJlbnQgZGVzaWduIGRvZXNuJ3QgYWxsb3cgYSBwb29sIHRvIGJlIHBhc3NlZCB0aHUsCi0gICBzbyB3ZSBkZXBlbmQgb24gYSBnbG9iYWwgdG8gaG9sZCB0aGUgY29ycmVjdCBwb29sCi0qLwotI2RlZmluZSBGSUxURVJfUE9PTCAgICAgYXBfZ2xvYmFsX2hvb2tfcG9vbAotI2luY2x1ZGUgImFwX2hvb2tzLmgiICAgLyogZm9yIGFwX2dsb2JhbF9ob29rX3Bvb2wgKi8KLQotLyoKLSoqIFRoaXMgbWFjcm8gcmV0dXJucyB0cnVlL2ZhbHNlIGlmIGEgZ2l2ZW4gZmlsdGVyIHNob3VsZCBiZSBpbnNlcnRlZCBCRUZPUkUKLSoqIGFub3RoZXIgZmlsdGVyLiBUaGlzIHdpbGwgaGFwcGVuIHdoZW4gb25lIG9mOiAxKSB0aGVyZSBpc24ndCBhbm90aGVyCi0qKiBmaWx0ZXI7IDIpIHRoYXQgZmlsdGVyIGhhcyBhIGhpZ2hlciBmaWx0ZXIgdHlwZSAoY2xhc3MpOyAzKSB0aGF0IGZpbHRlcgotKiogY29ycmVzcG9uZHMgdG8gYSBkaWZmZXJlbnQgcmVxdWVzdC4KLSovCi0jZGVmaW5lIElOU0VSVF9CRUZPUkUoZiwgYmVmb3JlX3RoaXMpICgoYmVmb3JlX3RoaXMpID09IE5VTEwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGJlZm9yZV90aGlzKS0+ZnR5cGUgPiAoZiktPmZ0eXBlKQotCi0KLXN0YXRpYyBhcF9zdGF0dXNfdCBmaWx0ZXJfY2xlYW51cCh2b2lkICpjdHgpCi17Ci0gICAgcmVnaXN0ZXJlZF9maWx0ZXJzID0gTlVMTDsKLSAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfcmVnaXN0ZXJfZmlsdGVyKGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9maWx0ZXJfZnVuYyBmaWx0ZXJfZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX2ZpbHRlcl90eXBlIGZ0eXBlKQotewotICAgIGFwX2ZpbHRlcl9yZWNfdCAqZnJlYyA9IGFwX3BhbGxvYyhGSUxURVJfUE9PTCwgc2l6ZW9mKCpmcmVjKSk7Ci0KLSAgICBmcmVjLT5uYW1lID0gbmFtZTsKLSAgICBmcmVjLT5maWx0ZXJfZnVuYyA9IGZpbHRlcl9mdW5jOwotICAgIGZyZWMtPmZ0eXBlID0gZnR5cGU7Ci0KLSAgICBmcmVjLT5uZXh0ID0gcmVnaXN0ZXJlZF9maWx0ZXJzOwotICAgIHJlZ2lzdGVyZWRfZmlsdGVycyA9IGZyZWM7Ci0KLSAgICBhcF9yZWdpc3Rlcl9jbGVhbnVwKEZJTFRFUl9QT09MLCBOVUxMLCBmaWx0ZXJfY2xlYW51cCwgTlVMTCk7Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfYWRkX2ZpbHRlcihjb25zdCBjaGFyICpuYW1lLCB2b2lkICpjdHgsIHJlcXVlc3RfcmVjICpyKQotewotICAgIGFwX2ZpbHRlcl9yZWNfdCAqZnJlYyA9IHJlZ2lzdGVyZWRfZmlsdGVyczsKLQotICAgIGZvciAoOyBmcmVjICE9IE5VTEw7IGZyZWMgPSBmcmVjLT5uZXh0KSB7Ci0gICAgICAgIGlmICghc3RyY2FzZWNtcChuYW1lLCBmcmVjLT5uYW1lKSkgewotICAgICAgICAgICAgYXBfZmlsdGVyX3QgKmYgPSBhcF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZigqZikpOwotCi0gICAgICAgICAgICBmLT5maWx0ZXJfZnVuYyA9IGZyZWMtPmZpbHRlcl9mdW5jOwotICAgICAgICAgICAgZi0+Y3R4ID0gY3R4OwotICAgICAgICAgICAgZi0+ZnR5cGUgPSBmcmVjLT5mdHlwZTsKLQotICAgICAgICAgICAgaWYgKElOU0VSVF9CRUZPUkUoZiwgci0+ZmlsdGVycykpIHsKLSAgICAgICAgICAgICAgICBmLT5uZXh0ID0gci0+ZmlsdGVyczsKLSAgICAgICAgICAgICAgICByLT5maWx0ZXJzID0gZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGFwX2ZpbHRlcl90ICpmc2NhbiA9IHItPmZpbHRlcnM7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCFJTlNFUlRfQkVGT1JFKGYsIGZzY2FuLT5uZXh0KSkKLSAgICAgICAgICAgICAgICAgICAgZnNjYW4gPSBmc2Nhbi0+bmV4dDsKLSAgICAgICAgICAgICAgICBmLT5uZXh0ID0gZnNjYW4tPm5leHQ7Ci0gICAgICAgICAgICAgICAgZnNjYW4tPm5leHQgPSBmOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvc2VydmVyL3V0aWxfbWQ1LmMgYi9zZXJ2ZXIvdXRpbF9tZDUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4ZGRmNi4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvdXRpbF9tZDUuYworKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE5DU0EgSFRUUGQgU2VydmVyCi0gKiBTb2Z0d2FyZSBEZXZlbG9wbWVudCBHcm91cAotICogTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMKLSAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbgotICogNjA1IEUuIFNwcmluZ2ZpZWxkLCBDaGFtcGFpZ24sIElMIDYxODIwCi0gKiBodHRwZEBuY3NhLnVpdWMuZWR1Ci0gKgotICogQ29weXJpZ2h0ICAoQykgIDE5OTUsIEJvYXJkIG9mIFRydXN0ZWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIG1kNS5jOiBOQ1NBIEhUVFBkIGNvZGUgd2hpY2ggdXNlcyB0aGUgbWQ1Yy5jIFJTQSBDb2RlCi0gKgotICogIE9yaWdpbmFsIENvZGUgQ29weXJpZ2h0IChDKSAxOTk0LCBKZWZmIEhvc3RldGxlciwgU3B5Z2xhc3MsIEluYy4KLSAqICBQb3J0aW9ucyBvZiBDb250ZW50LU1ENSBjb2RlIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCBieSBDYXJuZWdpZSBNZWxsb24KLSAqICAgICBVbml2ZXJzaXR5IChzZWUgQ29weXJpZ2h0IGJlbG93KS4KLSAqICBQb3J0aW9ucyBvZiBDb250ZW50LU1ENSBjb2RlIENvcHlyaWdodCAoQykgMTk5MSBCZWxsIENvbW11bmljYXRpb25zIAotICogICAgIFJlc2VhcmNoLCBJbmMuIChCZWxsY29yZSkgKHNlZSBDb3B5cmlnaHQgYmVsb3cpLgotICogIFBvcnRpb25zIGV4dHJhY3RlZCBmcm9tIG1wYWNrLCBKb2huIEcuIE15ZXJzIC0gamdtK0BjbXUuZWR1Ci0gKiAgQ29udGVudC1NRDUgQ29kZSBjb250cmlidXRlZCBieSBNYXJ0aW4gSGFtaWx0b24gKG1hcnRpbkBuZXQubHV0LmFjLnVrKQotICoKLSAqLwotCi0KLQotLyogbWQ1LmMgLS1Nb2R1bGUgSW50ZXJmYWNlIHRvIE1ENS4gKi8KLS8qIEplZmYgSG9zdGV0bGVyLCBTcHlnbGFzcywgSW5jLiwgMTk5NC4gKi8KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAidXRpbF9tZDUuaCIKLQotQVBJX0VYUE9SVChjaGFyICopIGFwX21kNV9iaW5hcnkocG9vbCAqcCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuZ3RoKQotewotICAgIGNvbnN0IGNoYXIgKmhleCA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKLSAgICBBUF9NRDVfQ1RYIG15X21kNTsKLSAgICB1bnNpZ25lZCBjaGFyIGhhc2hbMTZdOwotICAgIGNoYXIgKnIsIHJlc3VsdFszM107Ci0gICAgaW50IGk7Ci0KLSAgICAvKgotICAgICAqIFRha2UgdGhlIE1ENSBoYXNoIG9mIHRoZSBzdHJpbmcgYXJndW1lbnQuCi0gICAgICovCi0KLSAgICBhcF9NRDVJbml0KCZteV9tZDUpOwotICAgIGFwX01ENVVwZGF0ZSgmbXlfbWQ1LCBidWYsICh1bnNpZ25lZCBpbnQpbGVuZ3RoKTsKLSAgICBhcF9NRDVGaW5hbChoYXNoLCAmbXlfbWQ1KTsKLQotICAgIGZvciAoaSA9IDAsIHIgPSByZXN1bHQ7IGkgPCAxNjsgaSsrKSB7Ci0JKnIrKyA9IGhleFtoYXNoW2ldID4+IDRdOwotCSpyKysgPSBoZXhbaGFzaFtpXSAmIDB4Rl07Ci0gICAgfQotICAgICpyID0gJ1wwJzsKLQotICAgIHJldHVybiBhcF9wc3RyZHVwKHAsIHJlc3VsdCk7Ci19Ci0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9tZDUocG9vbCAqcCwgY29uc3QgdW5zaWduZWQgY2hhciAqc3RyaW5nKQotewotICAgIHJldHVybiBhcF9tZDVfYmluYXJ5KHAsIHN0cmluZywgKGludCkgc3RybGVuKChjaGFyICopc3RyaW5nKSk7Ci19Ci0KLS8qIHRoZXNlIHBvcnRpb25zIGV4dHJhY3RlZCBmcm9tIG1wYWNrLCBKb2huIEcuIE15ZXJzIC0gamdtK0BjbXUuZWR1ICovCi0KLS8qIChDKSBDb3B5cmlnaHQgMTk5MywxOTk0IGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5Ci0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKLSAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dAotICogZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzCi0gKiBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotICogYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgQ2FybmVnaWUKLSAqIE1lbGxvbiBVbml2ZXJzaXR5IG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eQotICogcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCi0gKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSBtYWtlcyBubwotICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCi0gKiB3YXJyYW50eS4KLSAqCi0gKiBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLSAqIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotICogQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIEJFIExJQUJMRQotICogRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLgotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTEgQmVsbCBDb21tdW5pY2F0aW9ucyBSZXNlYXJjaCwgSW5jLiAoQmVsbGNvcmUpCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBtYXRlcmlhbAotICogZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQKLSAqIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLSAqIGFwcGVhciBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBCZWxsY29yZSBub3QgYmUKLSAqIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhpcwotICogbWF0ZXJpYWwgd2l0aG91dCB0aGUgc3BlY2lmaWMsIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgotICogb2YgYW4gYXV0aG9yaXplZCByZXByZXNlbnRhdGl2ZSBvZiBCZWxsY29yZS4gIEJFTExDT1JFCi0gKiBNQUtFUyBOTyBSRVBSRVNFTlRBVElPTlMgQUJPVVQgVEhFIEFDQ1VSQUNZIE9SIFNVSVRBQklMSVRZCi0gKiBPRiBUSElTIE1BVEVSSUFMIEZPUiBBTlkgUFVSUE9TRS4gIElUIElTIFBST1ZJREVEICJBUyBJUyIsCi0gKiBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUy4gIAotICovCi0KLXN0YXRpYyBjaGFyIGJhc2lzXzY0W10gPQotIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwotCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfbWQ1Y29udGV4dFRvNjQocG9vbCAqYSwgQVBfTUQ1X0NUWCAqIGNvbnRleHQpCi17Ci0gICAgdW5zaWduZWQgY2hhciBkaWdlc3RbMThdOwotICAgIGNoYXIgKmVuY29kZWREaWdlc3Q7Ci0gICAgaW50IGk7Ci0gICAgY2hhciAqcDsKLQotICAgIGVuY29kZWREaWdlc3QgPSAoY2hhciAqKSBhcF9wY2FsbG9jKGEsIDI1ICogc2l6ZW9mKGNoYXIpKTsKLQotICAgIGFwX01ENUZpbmFsKGRpZ2VzdCwgY29udGV4dCk7Ci0gICAgZGlnZXN0W3NpemVvZihkaWdlc3QpIC0gMV0gPSBkaWdlc3Rbc2l6ZW9mKGRpZ2VzdCkgLSAyXSA9IDA7Ci0KLSAgICBwID0gZW5jb2RlZERpZ2VzdDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGRpZ2VzdCk7IGkgKz0gMykgewotCSpwKysgPSBiYXNpc182NFtkaWdlc3RbaV0gPj4gMl07Ci0JKnArKyA9IGJhc2lzXzY0WygoZGlnZXN0W2ldICYgMHgzKSA8PCA0KSB8ICgoaW50KSAoZGlnZXN0W2kgKyAxXSAmIDB4RjApID4+IDQpXTsKLQkqcCsrID0gYmFzaXNfNjRbKChkaWdlc3RbaSArIDFdICYgMHhGKSA8PCAyKSB8ICgoaW50KSAoZGlnZXN0W2kgKyAyXSAmIDB4QzApID4+IDYpXTsKLQkqcCsrID0gYmFzaXNfNjRbZGlnZXN0W2kgKyAyXSAmIDB4M0ZdOwotICAgIH0KLSAgICAqcC0tID0gJ1wwJzsKLSAgICAqcC0tID0gJz0nOwotICAgICpwLS0gPSAnPSc7Ci0gICAgcmV0dXJuIGVuY29kZWREaWdlc3Q7Ci19Ci0KLSNpZmRlZiBDSEFSU0VUX0VCQ0RJQwotCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfbWQ1ZGlnZXN0KHBvb2wgKnAsIEZJTEUgKmluZmlsZSwgaW50IGNvbnZlcnQpCi17Ci0gICAgQVBfTUQ1X0NUWCBjb250ZXh0OwotICAgIHVuc2lnbmVkIGNoYXIgYnVmWzEwMDBdOwotICAgIGxvbmcgbGVuZ3RoID0gMDsKLSAgICBpbnQgbmJ5dGVzOwotCi0gICAgYXBfTUQ1SW5pdCgmY29udGV4dCk7Ci0gICAgd2hpbGUgKChuYnl0ZXMgPSBmcmVhZChidWYsIDEsIHNpemVvZihidWYpLCBpbmZpbGUpKSkgewotICAgICAgbGVuZ3RoICs9IG5ieXRlczsKLSAgICAgICAgaWYgKCFjb252ZXJ0KSB7Ci0gICAgICAgICAgICBhc2NpaTJlYmNkaWMoYnVmLCBidWYsIG5ieXRlcyk7Ci0gICAgICAgIH0KLSAgICAgIGFwX01ENVVwZGF0ZSgmY29udGV4dCwgYnVmLCBuYnl0ZXMpOwotICAgIH0KLSAgICByZXdpbmQoaW5maWxlKTsKLSAgICByZXR1cm4gYXBfbWQ1Y29udGV4dFRvNjQocCwgJmNvbnRleHQpOwotfQotCi0jZWxzZQotCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfbWQ1ZGlnZXN0KHBvb2wgKnAsIEZJTEUgKmluZmlsZSkKLXsKLSAgICBBUF9NRDVfQ1RYIGNvbnRleHQ7Ci0gICAgdW5zaWduZWQgY2hhciBidWZbMTAwMF07Ci0gICAgbG9uZyBsZW5ndGggPSAwOwotICAgIHVuc2lnbmVkIGludCBuYnl0ZXM7Ci0KLSAgICBhcF9NRDVJbml0KCZjb250ZXh0KTsKLSAgICB3aGlsZSAoKG5ieXRlcyA9IGZyZWFkKGJ1ZiwgMSwgc2l6ZW9mKGJ1ZiksIGluZmlsZSkpKSB7Ci0JbGVuZ3RoICs9IG5ieXRlczsKLQlhcF9NRDVVcGRhdGUoJmNvbnRleHQsIGJ1ZiwgbmJ5dGVzKTsKLSAgICB9Ci0gICAgcmV3aW5kKGluZmlsZSk7Ci0gICAgcmV0dXJuIGFwX21kNWNvbnRleHRUbzY0KHAsICZjb250ZXh0KTsKLX0KLQotI2VuZGlmIC8qIENIQVJTRVRfRUJDRElDICovCmRpZmYgLS1naXQgYS9zZXJ2ZXIvdXRpbF9zY3JpcHQuYyBiL3NlcnZlci91dGlsX3NjcmlwdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjdkZDI5Li4wMDAwMDAwCi0tLSBhL3NlcnZlci91dGlsX3NjcmlwdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEzOCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLSNkZWZpbmUgQ09SRV9QUklWQVRFCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfY29uZl9nbG9iYWxzLmgiCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCQkvKiBGb3IgZG9jdW1lbnRfcm9vdC4gIFNpZ2guLi4gKi8KLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIJLyogZm9yIHN1Yl9yZXFfbG9va3VwX3VyaSgpICovCi0jaW5jbHVkZSAidXRpbF9zY3JpcHQuaCIKLSNpbmNsdWRlICJ1dGlsX2RhdGUuaCIJCS8qIEZvciBwYXJzZUhUVFBkYXRlKCkgKi8KLQotI2lmZGVmIE9TMgotI2RlZmluZSBJTkNMX0RPUwotI2luY2x1ZGUgPG9zMi5oPgotI2VuZGlmCi0KLS8qCi0gKiBWYXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIHdoaWNoIGFyZSBjb21tb24gdG8gYSB3aG9sZSBsb3Qgb2YKLSAqIHNjcmlwdC10eXBlIGV4dGVuc2lvbnMgbWVjaGFuaXNtcywgYW5kIG1pZ2h0IGFzIHdlbGwgYmUgZ2F0aGVyZWQKLSAqIGluIG9uZSBwbGFjZSAoaWYgb25seSB0byBhdm9pZCBjcmVhdGluZyBpbnRlci1tb2R1bGUgZGVwZW5kYW5jaWVzCi0gKiB3aGVyZSB0aGVyZSBkb24ndCBoYXZlIHRvIGJlKS4KLSAqLwotCi0jZGVmaW5lIE1BTEZPUk1FRF9NRVNTQUdFICJtYWxmb3JtZWQgaGVhZGVyIGZyb20gc2NyaXB0LiBCYWQgaGVhZGVyPSIKLSNkZWZpbmUgTUFMRk9STUVEX0hFQURFUl9MRU5HVEhfVE9fU0hPVyAzMAotCi0vKiBJZiBhIHJlcXVlc3QgaW5jbHVkZXMgcXVlcnkgaW5mbyBpbiB0aGUgVVJMIChzdHVmZiBhZnRlciAiPyIpLCBhbmQKLSAqIHRoZSBxdWVyeSBpbmZvIGRvZXMgbm90IGNvbnRhaW4gIj0iIChpbmRpY2F0aXZlIG9mIGEgRk9STSBzdWJtaXNzaW9uKSwKLSAqIHRoZW4gdGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBjcmVhdGUgdGhlIGFyZ3VtZW50IGxpc3QgdG8gYmUgcGFzc2VkCi0gKiB0byB0aGUgQ0dJIHNjcmlwdC4gIFdoZW4gc3VleGVjIGlzIGVuYWJsZWQsIHRoZSBzdWV4ZWMgcGF0aCwgdXNlciwgYW5kCi0gKiBncm91cCBhcmUgdGhlIGZpcnN0IHRocmVlIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQ7IGlmIG5vdCwgYWxsIHRocmVlCi0gKiBtdXN0IGJlIE5VTEwuICBUaGUgcXVlcnkgaW5mbyBpcyBzcGxpdCBpbnRvIHNlcGFyYXRlIGFyZ3VtZW50cywgd2hlcmUKLSAqICIrIiBpcyB0aGUgc2VwYXJhdG9yIGJldHdlZW4ga2V5d29yZCBhcmd1bWVudHMuCi0gKgotICogWFhYWDogbm90ZSB0aGF0IHRoZSBXSU4zMiBjb2RlIHVzZXMgb25lIG9mIHRoZSBzdWV4ZWMgc3RyaW5ncyAKLSAqIHRvIHBhc3MgYW4gaW50ZXJwcmV0ZXIgbmFtZS4gIFJlbWVtYmVyIHRoaXMgaWYgY2hhbmdpbmcgdGhlIHdheSB0aGV5Ci0gKiBhcmUgaGFuZGxlZCBpbiBjcmVhdGVfYXJndi4KLSAqCi0gKi8KLXN0YXRpYyBjaGFyICoqY3JlYXRlX2FyZ3YocG9vbCAqcCwgY2hhciAqcGF0aCwgY2hhciAqdXNlciwgY2hhciAqZ3JvdXAsCi0JCQkgIGNoYXIgKmF2MCwgY29uc3QgY2hhciAqYXJncykKLXsKLSAgICBpbnQgeCwgbnVtd29yZHM7Ci0gICAgY2hhciAqKmF2OwotICAgIGNoYXIgKnc7Ci0gICAgaW50IGlkeCA9IDA7Ci0KLSAgICAvKiBjb3VudCB0aGUgbnVtYmVyIG9mIGtleXdvcmRzICovCi0KLSAgICBmb3IgKHggPSAwLCBudW13b3JkcyA9IDE7IGFyZ3NbeF07IHgrKykgewotICAgICAgICBpZiAoYXJnc1t4XSA9PSAnKycpIHsKLQkgICAgKytudW13b3JkczsKLQl9Ci0gICAgfQotCi0gICAgaWYgKG51bXdvcmRzID4gQVBBQ0hFX0FSR19NQVggLSA1KSB7Ci0JbnVtd29yZHMgPSBBUEFDSEVfQVJHX01BWCAtIDU7CS8qIFRydW5jYXRlIGFyZ3MgdG8gcHJldmVudCBvdmVycnVuICovCi0gICAgfQotICAgIGF2ID0gKGNoYXIgKiopIGFwX3BhbGxvYyhwLCAobnVtd29yZHMgKyA1KSAqIHNpemVvZihjaGFyICopKTsKLQotICAgIGlmIChwYXRoKSB7Ci0JYXZbaWR4KytdID0gcGF0aDsKLSAgICB9Ci0gICAgaWYgKHVzZXIpIHsKLQlhdltpZHgrK10gPSB1c2VyOwotICAgIH0KLSAgICBpZiAoZ3JvdXApIHsKLQlhdltpZHgrK10gPSBncm91cDsKLSAgICB9Ci0KLSAgICBhdltpZHgrK10gPSBhdjA7Ci0KLSAgICBmb3IgKHggPSAxOyB4IDw9IG51bXdvcmRzOyB4KyspIHsKLQl3ID0gYXBfZ2V0d29yZF9udWxscyhwLCAmYXJncywgJysnKTsKLQlhcF91bmVzY2FwZV91cmwodyk7Ci0JYXZbaWR4KytdID0gYXBfZXNjYXBlX3NoZWxsX2NtZChwLCB3KTsKLSAgICB9Ci0gICAgYXZbaWR4XSA9IE5VTEw7Ci0gICAgcmV0dXJuIGF2OwotfQotCi0KLXN0YXRpYyBjaGFyICpodHRwMmVudihwb29sICphLCBjaGFyICp3KQotewotICAgIGNoYXIgKnJlcyA9IGFwX3BzdHJjYXQoYSwgIkhUVFBfIiwgdywgTlVMTCk7Ci0gICAgY2hhciAqY3AgPSByZXM7Ci0KLSAgICB3aGlsZSAoKisrY3ApIHsKLQlpZiAoIWFwX2lzYWxudW0oKmNwKSAmJiAqY3AgIT0gJ18nKSB7Ci0JICAgICpjcCA9ICdfJzsKLQl9Ci0JZWxzZSB7Ci0JICAgICpjcCA9IGFwX3RvdXBwZXIoKmNwKTsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotQVBJX0VYUE9SVChjaGFyICoqKSBhcF9jcmVhdGVfZW52aXJvbm1lbnQocG9vbCAqcCwgdGFibGUgKnQpCi17Ci0gICAgYXJyYXlfaGVhZGVyICplbnZfYXJyID0gYXBfdGFibGVfZWx0cyh0KTsKLSAgICB0YWJsZV9lbnRyeSAqZWx0cyA9ICh0YWJsZV9lbnRyeSAqKSBlbnZfYXJyLT5lbHRzOwotICAgIGNoYXIgKiplbnYgPSAoY2hhciAqKikgYXBfcGFsbG9jKHAsIChlbnZfYXJyLT5uZWx0cyArIDIpICogc2l6ZW9mKGNoYXIgKikpOwotICAgIGludCBpLCBqOwotICAgIGNoYXIgKnR6OwotICAgIGNoYXIgKndoYWNrOwotCi0gICAgaiA9IDA7Ci0gICAgaWYgKCFhcF90YWJsZV9nZXQodCwgIlRaIikpIHsKLQl0eiA9IGdldGVudigiVFoiKTsKLQlpZiAodHogIT0gTlVMTCkgewotCSAgICBlbnZbaisrXSA9IGFwX3BzdHJjYXQocCwgIlRaPSIsIHR6LCBOVUxMKTsKLQl9Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCBlbnZfYXJyLT5uZWx0czsgKytpKSB7Ci0gICAgICAgIGlmICghZWx0c1tpXS5rZXkpIHsKLQkgICAgY29udGludWU7Ci0JfQotCWVudltqXSA9IGFwX3BzdHJjYXQocCwgZWx0c1tpXS5rZXksICI9IiwgZWx0c1tpXS52YWwsIE5VTEwpOwotCXdoYWNrID0gZW52W2pdOwotCWlmIChhcF9pc2RpZ2l0KCp3aGFjaykpIHsKLQkgICAgKndoYWNrKysgPSAnXyc7Ci0JfQotCXdoaWxlICgqd2hhY2sgIT0gJz0nKSB7Ci0JICAgIGlmICghYXBfaXNhbG51bSgqd2hhY2spICYmICp3aGFjayAhPSAnXycpIHsKLQkJKndoYWNrID0gJ18nOwotCSAgICB9Ci0JICAgICsrd2hhY2s7Ci0JfQotCSsrajsKLSAgICB9Ci0KLSAgICBlbnZbal0gPSBOVUxMOwotICAgIHJldHVybiBlbnY7Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfYWRkX2NvbW1vbl92YXJzKHJlcXVlc3RfcmVjICpyKQotewotICAgIHRhYmxlICplOwotICAgIHNlcnZlcl9yZWMgKnMgPSByLT5zZXJ2ZXI7Ci0gICAgY29ubl9yZWMgKmMgPSByLT5jb25uZWN0aW9uOwotICAgIGNvbnN0IGNoYXIgKnJlbV9sb2duYW1lOwotICAgIGNoYXIgKmVudl9wYXRoOwotI2lmZGVmIFdJTjMyCi0gICAgY2hhciAqZW52X3RlbXA7Ci0jZW5kaWYKLSAgICBjb25zdCBjaGFyICpob3N0OwotICAgIGFycmF5X2hlYWRlciAqaGRyc19hcnIgPSBhcF90YWJsZV9lbHRzKHItPmhlYWRlcnNfaW4pOwotICAgIHRhYmxlX2VudHJ5ICpoZHJzID0gKHRhYmxlX2VudHJ5ICopIGhkcnNfYXJyLT5lbHRzOwotICAgIGludCBpOwotCi0gICAgLyogdXNlIGEgdGVtcG9yYXJ5IHRhYmxlIHdoaWNoIHdlJ2xsIG92ZXJsYXAgb250bwotICAgICAqIHItPnN1YnByb2Nlc3NfZW52IGxhdGVyCi0gICAgICovCi0gICAgZSA9IGFwX21ha2VfdGFibGUoci0+cG9vbCwgMjUgKyBoZHJzX2Fyci0+bmVsdHMpOwotCi0gICAgLyogRmlyc3QsIGFkZCBlbnZpcm9ubWVudCB2YXJzIGZyb20gaGVhZGVycy4uLiB0aGlzIGlzIGFzIHBlcgotICAgICAqIENHSSBzcGVjcywgdGhvdWdoIG90aGVyIHNvcnRzIG9mIHNjcmlwdGluZyBpbnRlcmZhY2VzIHNlZQotICAgICAqIHRoZSBzYW1lIHZhcnMuLi4KLSAgICAgKi8KLQotICAgIGZvciAoaSA9IDA7IGkgPCBoZHJzX2Fyci0+bmVsdHM7ICsraSkgewotICAgICAgICBpZiAoIWhkcnNbaV0ua2V5KSB7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotCS8qIEEgZmV3IGhlYWRlcnMgYXJlIHNwZWNpYWwgY2FzZWQgLS0tIEF1dGhvcml6YXRpb24gdG8gcHJldmVudAotCSAqIHJvZ3VlIHNjcmlwdHMgZnJvbSBjYXB0dXJpbmcgcGFzc3dvcmRzOyBjb250ZW50LXR5cGUgYW5kIC1sZW5ndGgKLQkgKiBmb3Igbm8gcGFydGljdWxhciByZWFzb24uCi0JICovCi0KLQlpZiAoIXN0cmNhc2VjbXAoaGRyc1tpXS5rZXksICJDb250ZW50LXR5cGUiKSkgewotCSAgICBhcF90YWJsZV9hZGRuKGUsICJDT05URU5UX1RZUEUiLCBoZHJzW2ldLnZhbCk7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKGhkcnNbaV0ua2V5LCAiQ29udGVudC1sZW5ndGgiKSkgewotCSAgICBhcF90YWJsZV9hZGRuKGUsICJDT05URU5UX0xFTkdUSCIsIGhkcnNbaV0udmFsKTsKLQl9Ci0JLyoKLQkgKiBZb3UgcmVhbGx5IGRvbid0IHdhbnQgdG8gZGlzYWJsZSB0aGlzIGNoZWNrLCBzaW5jZSBpdCBsZWF2ZXMgeW91Ci0JICogd2lkZSBvcGVuIHRvIENHSXMgc3RlYWxpbmcgcGFzc3dvcmRzIGFuZCBwZW9wbGUgdmlld2luZyB0aGVtCi0JICogaW4gdGhlIGVudmlyb25tZW50IHdpdGggInBzIC1lIi4gIEJ1dCwgaWYgeW91IG11c3QuLi4KLQkgKi8KLSNpZm5kZWYgU0VDVVJJVFlfSE9MRV9QQVNTX0FVVEhPUklaQVRJT04KLQllbHNlIGlmICghc3RyY2FzZWNtcChoZHJzW2ldLmtleSwgIkF1dGhvcml6YXRpb24iKSAKLQkJIHx8ICFzdHJjYXNlY21wKGhkcnNbaV0ua2V5LCAiUHJveHktQXV0aG9yaXphdGlvbiIpKSB7Ci0JICAgIGNvbnRpbnVlOwotCX0KLSNlbmRpZgotCWVsc2UgewotCSAgICBhcF90YWJsZV9hZGRuKGUsIGh0dHAyZW52KHItPnBvb2wsIGhkcnNbaV0ua2V5KSwgaGRyc1tpXS52YWwpOwotCX0KLSAgICB9Ci0KLSAgICBpZiAoIShlbnZfcGF0aCA9IGdldGVudigiUEFUSCIpKSkgewotCWVudl9wYXRoID0gREVGQVVMVF9QQVRIOwotICAgIH0KLQotI2lmZGVmIFdJTjMyCi0gICAgaWYgKGVudl90ZW1wID0gZ2V0ZW52KCJTeXN0ZW1Sb290IikpIHsKLSAgICAgICAgYXBfdGFibGVfYWRkbihlLCAiU3lzdGVtUm9vdCIsIGVudl90ZW1wKTsgICAgICAgICAKLSAgICB9Ci0gICAgaWYgKGVudl90ZW1wID0gZ2V0ZW52KCJDT01TUEVDIikpIHsKLSAgICAgICAgYXBfdGFibGVfYWRkbihlLCAiQ09NU1BFQyIsIGVudl90ZW1wKTsgICAgICAgICAgICAKLSAgICB9Ci0gICAgaWYgKGVudl90ZW1wID0gZ2V0ZW52KCJXSU5ESVIiKSkgewotICAgICAgICBhcF90YWJsZV9hZGRuKGUsICJXSU5ESVIiLCBlbnZfdGVtcCk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBhcF90YWJsZV9hZGRuKGUsICJQQVRIIiwgZW52X3BhdGgpOwotICAgIGFwX3RhYmxlX2FkZG4oZSwgIlNFUlZFUl9TSUdOQVRVUkUiLCBhcF9wc2lnbmF0dXJlKCIiLCByKSk7Ci0gICAgYXBfdGFibGVfYWRkbihlLCAiU0VSVkVSX1NPRlRXQVJFIiwgYXBfZ2V0X3NlcnZlcl92ZXJzaW9uKCkpOwotICAgIGFwX3RhYmxlX2FkZG4oZSwgIlNFUlZFUl9OQU1FIiwgYXBfZ2V0X3NlcnZlcl9uYW1lKHIpKTsKLSAgICBhcF90YWJsZV9hZGRuKGUsICJTRVJWRVJfQUREUiIsIHItPmNvbm5lY3Rpb24tPmxvY2FsX2lwKTsJLyogQXBhY2hlICovCi0gICAgYXBfdGFibGVfYWRkbihlLCAiU0VSVkVSX1BPUlQiLAotCQkgIGFwX3BzcHJpbnRmKHItPnBvb2wsICIldSIsIGFwX2dldF9zZXJ2ZXJfcG9ydChyKSkpOwotICAgIGhvc3QgPSBhcF9nZXRfcmVtb3RlX2hvc3QoYywgci0+cGVyX2Rpcl9jb25maWcsIFJFTU9URV9IT1NUKTsKLSAgICBpZiAoaG9zdCkgewotCWFwX3RhYmxlX2FkZG4oZSwgIlJFTU9URV9IT1NUIiwgaG9zdCk7Ci0gICAgfQotICAgIGFwX3RhYmxlX2FkZG4oZSwgIlJFTU9URV9BRERSIiwgYy0+cmVtb3RlX2lwKTsKLSAgICBhcF90YWJsZV9hZGRuKGUsICJET0NVTUVOVF9ST09UIiwgYXBfZG9jdW1lbnRfcm9vdChyKSk7CS8qIEFwYWNoZSAqLwotICAgIGFwX3RhYmxlX2FkZG4oZSwgIlNFUlZFUl9BRE1JTiIsIHMtPnNlcnZlcl9hZG1pbik7CS8qIEFwYWNoZSAqLwotICAgIGFwX3RhYmxlX2FkZG4oZSwgIlNDUklQVF9GSUxFTkFNRSIsIHItPmZpbGVuYW1lKTsJLyogQXBhY2hlICovCi0KLSAgICBhcF90YWJsZV9hZGRuKGUsICJSRU1PVEVfUE9SVCIsCi0JCSAgYXBfcHNwcmludGYoci0+cG9vbCwgIiVkIiwgbnRvaHMoYy0+cmVtb3RlX2FkZHIuc2luX3BvcnQpKSk7Ci0KLSAgICBpZiAoYy0+dXNlcikgewotCWFwX3RhYmxlX2FkZG4oZSwgIlJFTU9URV9VU0VSIiwgYy0+dXNlcik7Ci0gICAgfQotICAgIGlmIChjLT5hcF9hdXRoX3R5cGUpIHsKLQlhcF90YWJsZV9hZGRuKGUsICJBVVRIX1RZUEUiLCBjLT5hcF9hdXRoX3R5cGUpOwotICAgIH0KLSAgICByZW1fbG9nbmFtZSA9IGFwX2dldF9yZW1vdGVfbG9nbmFtZShyKTsKLSAgICBpZiAocmVtX2xvZ25hbWUpIHsKLQlhcF90YWJsZV9hZGRuKGUsICJSRU1PVEVfSURFTlQiLCBhcF9wc3RyZHVwKHItPnBvb2wsIHJlbV9sb2duYW1lKSk7Ci0gICAgfQotCi0gICAgLyogQXBhY2hlIGN1c3RvbSBlcnJvciByZXNwb25zZXMuIElmIHdlIGhhdmUgcmVkaXJlY3RlZCBzZXQgdHdvIG5ldyB2YXJzICovCi0KLSAgICBpZiAoci0+cHJldikgewotICAgICAgICBpZiAoci0+cHJldi0+YXJncykgewotCSAgICBhcF90YWJsZV9hZGRuKGUsICJSRURJUkVDVF9RVUVSWV9TVFJJTkciLCByLT5wcmV2LT5hcmdzKTsKLQl9Ci0JaWYgKHItPnByZXYtPnVyaSkgewotCSAgICBhcF90YWJsZV9hZGRuKGUsICJSRURJUkVDVF9VUkwiLCByLT5wcmV2LT51cmkpOwotCX0KLSAgICB9Ci0KLSAgICBhcF9vdmVybGFwX3RhYmxlcyhyLT5zdWJwcm9jZXNzX2VudiwgZSwgQVBfT1ZFUkxBUF9UQUJMRVNfU0VUKTsKLX0KLQotLyogVGhpcyAiY3V0ZSIgbGl0dGxlIGZ1bmN0aW9uIGNvbWVzIGFib3V0IGJlY2F1c2UgdGhlIHBhdGggaW5mbyBvbgotICogZmlsZW5hbWVzIGFuZCBVUkxzIGFyZW4ndCBhbHdheXMgdGhlIHNhbWUuIFNvIHdlIHRha2UgdGhlIHR3bywKLSAqIGFuZCBmaW5kIGFzIG11Y2ggb2YgdGhlIHR3byB0aGF0IG1hdGNoIGFzIHBvc3NpYmxlLgotICovCi0KLUFQSV9FWFBPUlQoaW50KSBhcF9maW5kX3BhdGhfaW5mbyhjb25zdCBjaGFyICp1cmksIGNvbnN0IGNoYXIgKnBhdGhfaW5mbykKLXsKLSAgICBpbnQgbHUgPSBzdHJsZW4odXJpKTsKLSAgICBpbnQgbHAgPSBzdHJsZW4ocGF0aF9pbmZvKTsKLQotICAgIHdoaWxlIChsdS0tICYmIGxwLS0gJiYgdXJpW2x1XSA9PSBwYXRoX2luZm9bbHBdKTsKLQotICAgIGlmIChsdSA9PSAtMSkgewotCWx1ID0gMDsKLSAgICB9Ci0KLSAgICB3aGlsZSAodXJpW2x1XSAhPSAnXDAnICYmIHVyaVtsdV0gIT0gJy8nKSB7Ci0gICAgICAgIGx1Kys7Ci0gICAgfQotICAgIHJldHVybiBsdTsKLX0KLQotLyogT2J0YWluIHRoZSBSZXF1ZXN0LVVSSSBmcm9tIHRoZSBvcmlnaW5hbCByZXF1ZXN0LWxpbmUsIHJldHVybmluZwotICogYSBuZXcgc3RyaW5nIGZyb20gdGhlIHJlcXVlc3QgcG9vbCBjb250YWluaW5nIHRoZSBVUkkgb3IgIiIuCi0gKi8KLXN0YXRpYyBjaGFyICpvcmlnaW5hbF91cmkocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY2hhciAqZmlyc3QsICpsYXN0OwotCi0gICAgaWYgKHItPnRoZV9yZXF1ZXN0ID09IE5VTEwpIHsKLQlyZXR1cm4gKGNoYXIgKikgYXBfcGNhbGxvYyhyLT5wb29sLCAxKTsKLSAgICB9Ci0KLSAgICBmaXJzdCA9IHItPnRoZV9yZXF1ZXN0OwkvKiB1c2UgdGhlIHJlcXVlc3QtbGluZSAqLwotCi0gICAgd2hpbGUgKCpmaXJzdCAmJiAhYXBfaXNzcGFjZSgqZmlyc3QpKSB7Ci0JKytmaXJzdDsJCS8qIHNraXAgb3ZlciB0aGUgbWV0aG9kICovCi0gICAgfQotICAgIHdoaWxlIChhcF9pc3NwYWNlKCpmaXJzdCkpIHsKLQkrK2ZpcnN0OwkJLyogICBhbmQgdGhlIHNwYWNlKHMpICAgKi8KLSAgICB9Ci0KLSAgICBsYXN0ID0gZmlyc3Q7Ci0gICAgd2hpbGUgKCpsYXN0ICYmICFhcF9pc3NwYWNlKCpsYXN0KSkgewotCSsrbGFzdDsJCQkvKiBlbmQgYXQgbmV4dCB3aGl0ZXNwYWNlICovCi0gICAgfQotCi0gICAgcmV0dXJuIGFwX3BzdHJuZHVwKHItPnBvb2wsIGZpcnN0LCBsYXN0IC0gZmlyc3QpOwotfQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX2FkZF9jZ2lfdmFycyhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICB0YWJsZSAqZSA9IHItPnN1YnByb2Nlc3NfZW52OwotCi0gICAgYXBfdGFibGVfc2V0bihlLCAiR0FURVdBWV9JTlRFUkZBQ0UiLCAiQ0dJLzEuMSIpOwotICAgIGFwX3RhYmxlX3NldG4oZSwgIlNFUlZFUl9QUk9UT0NPTCIsIHItPnByb3RvY29sKTsKLSAgICBhcF90YWJsZV9zZXRuKGUsICJSRVFVRVNUX01FVEhPRCIsIHItPm1ldGhvZCk7Ci0gICAgYXBfdGFibGVfc2V0bihlLCAiUVVFUllfU1RSSU5HIiwgci0+YXJncyA/IHItPmFyZ3MgOiAiIik7Ci0gICAgYXBfdGFibGVfc2V0bihlLCAiUkVRVUVTVF9VUkkiLCBvcmlnaW5hbF91cmkocikpOwotCi0gICAgLyogTm90ZSB0aGF0IHRoZSBjb2RlIGJlbG93IHNwZWNpYWwtY2FzZXMgc2NyaXB0cyBydW4gZnJvbSBpbmNsdWRlcywKLSAgICAgKiBiZWNhdXNlIGl0ICJrbm93cyIgdGhhdCB0aGUgc3ViX3JlcXVlc3QgaGFzIGJlZW4gaGFja2VkIHRvIGhhdmUgdGhlCi0gICAgICogYXJncyBhbmQgcGF0aF9pbmZvIG9mIHRoZSBvcmlnaW5hbCByZXF1ZXN0LCBhbmQgbm90IGFueSB0aGF0IG1heSBoYXZlCi0gICAgICogY29tZSB3aXRoIHRoZSBzY3JpcHQgVVJJIGluIHRoZSBpbmNsdWRlIGNvbW1hbmQuICBVZ2guCi0gICAgICovCi0KLSAgICBpZiAoIXN0cmNtcChyLT5wcm90b2NvbCwgIklOQ0xVREVEIikpIHsKLQlhcF90YWJsZV9zZXRuKGUsICJTQ1JJUFRfTkFNRSIsIHItPnVyaSk7Ci0JaWYgKHItPnBhdGhfaW5mbyAmJiAqci0+cGF0aF9pbmZvKSB7Ci0JICAgIGFwX3RhYmxlX3NldG4oZSwgIlBBVEhfSU5GTyIsIHItPnBhdGhfaW5mbyk7Ci0JfQotICAgIH0KLSAgICBlbHNlIGlmICghci0+cGF0aF9pbmZvIHx8ICEqci0+cGF0aF9pbmZvKSB7Ci0JYXBfdGFibGVfc2V0bihlLCAiU0NSSVBUX05BTUUiLCByLT51cmkpOwotICAgIH0KLSAgICBlbHNlIHsKLQlpbnQgcGF0aF9pbmZvX3N0YXJ0ID0gYXBfZmluZF9wYXRoX2luZm8oci0+dXJpLCByLT5wYXRoX2luZm8pOwotCi0JYXBfdGFibGVfc2V0bihlLCAiU0NSSVBUX05BTUUiLAotCQkgICAgICBhcF9wc3RybmR1cChyLT5wb29sLCByLT51cmksIHBhdGhfaW5mb19zdGFydCkpOwotCi0JYXBfdGFibGVfc2V0bihlLCAiUEFUSF9JTkZPIiwgci0+cGF0aF9pbmZvKTsKLSAgICB9Ci0KLSAgICBpZiAoci0+cGF0aF9pbmZvICYmIHItPnBhdGhfaW5mb1swXSkgewotCS8qCi0JICogVG8gZ2V0IFBBVEhfVFJBTlNMQVRFRCwgdHJlYXQgUEFUSF9JTkZPIGFzIGEgVVJJIHBhdGguCi0JICogTmVlZCB0byByZS1lc2NhcGUgaXQgZm9yIHRoaXMsIHNpbmNlIHRoZSBlbnRpcmUgVVJJIHdhcwotCSAqIHVuLWVzY2FwZWQgYmVmb3JlIHdlIGRldGVybWluZWQgd2hlcmUgdGhlIFBBVEhfSU5GTyBiZWdhbi4KLQkgKi8KLQlyZXF1ZXN0X3JlYyAqcGFfcmVxOwotCi0JcGFfcmVxID0gYXBfc3ViX3JlcV9sb29rdXBfdXJpKGFwX2VzY2FwZV91cmkoci0+cG9vbCwgci0+cGF0aF9pbmZvKSwgcik7Ci0KLQlpZiAocGFfcmVxLT5maWxlbmFtZSkgewotI2lmZGVmIFdJTjMyCi0JICAgIGNoYXIgYnVmZmVyW0hVR0VfU1RSSU5HX0xFTl07Ci0jZW5kaWYKLQkgICAgY2hhciAqcHQgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHBhX3JlcS0+ZmlsZW5hbWUsIHBhX3JlcS0+cGF0aF9pbmZvLAotCQkJCSAgTlVMTCk7Ci0jaWZkZWYgV0lOMzIKLQkgICAgLyogV2UgbmVlZCB0byBtYWtlIHRoaXMgYSByZWFsIFdpbmRvd3MgcGF0aCBuYW1lICovCi0JICAgIEdldEZ1bGxQYXRoTmFtZShwdCwgSFVHRV9TVFJJTkdfTEVOLCBidWZmZXIsIE5VTEwpOwotCSAgICBhcF90YWJsZV9zZXRuKGUsICJQQVRIX1RSQU5TTEFURUQiLCBhcF9wc3RyZHVwKHItPnBvb2wsIGJ1ZmZlcikpOwotI2Vsc2UKLQkgICAgYXBfdGFibGVfc2V0bihlLCAiUEFUSF9UUkFOU0xBVEVEIiwgcHQpOwotI2VuZGlmCi0JfQotCWFwX2Rlc3Ryb3lfc3ViX3JlcShwYV9yZXEpOwotICAgIH0KLX0KLQotCi1zdGF0aWMgaW50IHNldF9jb29raWVfZG9vX2Rvbyh2b2lkICp2LCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbCkKLXsKLSAgICBhcF90YWJsZV9hZGRuKHYsIGtleSwgdmFsKTsKLSAgICByZXR1cm4gMTsKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX3NjYW5fc2NyaXB0X2hlYWRlcl9lcnJfY29yZShyZXF1ZXN0X3JlYyAqciwgY2hhciAqYnVmZmVyLAotCQkJCSAgICAgICBpbnQgKCpnZXRzZnVuYykgKGNoYXIgKiwgaW50LCB2b2lkICopLAotCQkJCSAgICAgICB2b2lkICpnZXRzZnVuY19kYXRhKQotewotICAgIGNoYXIgeFtNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciAqdywgKmw7Ci0gICAgaW50IHA7Ci0gICAgaW50IGNnaV9zdGF0dXMgPSBIVFRQX09LOwotICAgIHRhYmxlICptZXJnZTsKLSAgICB0YWJsZSAqY29va2llX3RhYmxlOwotCi0gICAgaWYgKGJ1ZmZlcikgewotCSpidWZmZXIgPSAnXDAnOwotICAgIH0KLSAgICB3ID0gYnVmZmVyID8gYnVmZmVyIDogeDsKLQotICAgIGFwX2hhcmRfdGltZW91dCgicmVhZCBzY3JpcHQgaGVhZGVyIiwgcik7Ci0KLSAgICAvKiB0ZW1wb3JhcnkgcGxhY2UgdG8gaG9sZCBoZWFkZXJzIHRvIG1lcmdlIGluIGxhdGVyICovCi0gICAgbWVyZ2UgPSBhcF9tYWtlX3RhYmxlKHItPnBvb2wsIDEwKTsKLQotICAgIC8qIFRoZSBIVFRQIHNwZWNpZmljYXRpb24gc2F5cyB0aGF0IGl0IGlzIGxlZ2FsIHRvIG1lcmdlIGR1cGxpY2F0ZQotICAgICAqIGhlYWRlcnMgaW50byBvbmUuICBTb21lIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBDb29raWVzIGRvbid0IGxpa2UKLSAgICAgKiBtZXJnZWQgaGVhZGVycyBhbmQgcHJlZmVyIHRoYXQgZWFjaCBTZXQtQ29va2llIGhlYWRlciBpcyBzZW50Ci0gICAgICogc2VwYXJhdGVseS4gIExldHMgaHVtb3VyIHRob3NlIGJyb3dzZXJzIGJ5IG5vdCBtZXJnaW5nLgotICAgICAqIE9oIHdoYXQgYSBwYWluIGl0IGlzLgotICAgICAqLwotICAgIGNvb2tpZV90YWJsZSA9IGFwX21ha2VfdGFibGUoci0+cG9vbCwgMik7Ci0gICAgYXBfdGFibGVfZG8oc2V0X2Nvb2tpZV9kb29fZG9vLCBjb29raWVfdGFibGUsIHItPmVycl9oZWFkZXJzX291dCwgIlNldC1Db29raWUiLCBOVUxMKTsKLQotICAgIHdoaWxlICgxKSB7Ci0KLQlpZiAoKCpnZXRzZnVuYykgKHcsIE1BWF9TVFJJTkdfTEVOIC0gMSwgZ2V0c2Z1bmNfZGF0YSkgPT0gMCkgewotCSAgICBhcF9raWxsX3RpbWVvdXQocik7Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHIsCi0JCQkgICJQcmVtYXR1cmUgZW5kIG9mIHNjcmlwdCBoZWFkZXJzOiAlcyIsIHItPmZpbGVuYW1lKTsKLQkgICAgcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotCX0KLQotCS8qIERlbGV0ZSB0ZXJtaW5hbCAoQ1I/KUxGICovCi0KLQlwID0gc3RybGVuKHcpOwotCWlmIChwID4gMCAmJiB3W3AgLSAxXSA9PSAnXG4nKSB7Ci0JICAgIGlmIChwID4gMSAmJiB3W3AgLSAyXSA9PSAnXDAxNScpIHsKLQkJd1twIC0gMl0gPSAnXDAnOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQl3W3AgLSAxXSA9ICdcMCc7Ci0JICAgIH0KLQl9Ci0KLQkvKgotCSAqIElmIHdlJ3ZlIGZpbmlzaGVkIHJlYWRpbmcgdGhlIGhlYWRlcnMsIGNoZWNrIHRvIG1ha2Ugc3VyZSBhbnkKLQkgKiBIVFRQLzEuMSBjb25kaXRpb25zIGFyZSBtZXQuICBJZiBzbywgd2UncmUgZG9uZTsgbm9ybWFsIHByb2Nlc3NpbmcKLQkgKiB3aWxsIGhhbmRsZSB0aGUgc2NyaXB0J3Mgb3V0cHV0LiAgSWYgbm90LCBqdXN0IHJldHVybiB0aGUgZXJyb3IuCi0JICogVGhlIGFwcHJvcHJpYXRlIHRoaW5nIHRvIGRvIHdvdWxkIGJlIHRvIHNlbmQgdGhlIHNjcmlwdCBwcm9jZXNzIGEKLQkgKiBTSUdQSVBFIHRvIGxldCBpdCBrbm93IHdlJ3JlIGlnbm9yaW5nIGl0LCBjbG9zZSB0aGUgY2hhbm5lbCB0byB0aGUKLQkgKiBzY3JpcHQgcHJvY2VzcywgYW5kICp0aGVuKiByZXR1cm4gdGhlIGZhaWxlZC10by1tZWV0LWNvbmRpdGlvbgotCSAqIGVycm9yLiAgT3RoZXJ3aXNlIHdlJ2QgYmUgd2FpdGluZyBmb3IgdGhlIHNjcmlwdCB0byBmaW5pc2gKLQkgKiBibGl0aGVyaW5nIGJlZm9yZSB0ZWxsaW5nIHRoZSBjbGllbnQgdGhlIG91dHB1dCB3YXMgbm8gZ29vZC4KLQkgKiBIb3dldmVyLCB3ZSBkb24ndCBoYXZlIHRoZSBpbmZvcm1hdGlvbiB0byBkbyB0aGF0LCBzbyB3ZSBoYXZlIHRvCi0JICogbGVhdmUgaXQgdG8gYW4gdXBwZXIgbGF5ZXIuCi0JICovCi0JaWYgKHdbMF0gPT0gJ1wwJykgewotCSAgICBpbnQgY29uZF9zdGF0dXMgPSBPSzsKLQotCSAgICBhcF9raWxsX3RpbWVvdXQocik7Ci0JICAgIGlmICgoY2dpX3N0YXR1cyA9PSBIVFRQX09LKSAmJiAoci0+bWV0aG9kX251bWJlciA9PSBNX0dFVCkpIHsKLQkJY29uZF9zdGF0dXMgPSBhcF9tZWV0c19jb25kaXRpb25zKHIpOwotCSAgICB9Ci0JICAgIGFwX292ZXJsYXBfdGFibGVzKHItPmVycl9oZWFkZXJzX291dCwgbWVyZ2UsCi0JCUFQX09WRVJMQVBfVEFCTEVTX01FUkdFKTsKLQkgICAgaWYgKCFhcF9pc19lbXB0eV90YWJsZShjb29raWVfdGFibGUpKSB7Ci0JCS8qIHRoZSBjb29raWVzIGhhdmUgYWxyZWFkeSBiZWVuIGNvcGllZCB0byB0aGUgY29va2llX3RhYmxlICovCi0JCWFwX3RhYmxlX3Vuc2V0KHItPmVycl9oZWFkZXJzX291dCwgIlNldC1Db29raWUiKTsKLQkJci0+ZXJyX2hlYWRlcnNfb3V0ID0gYXBfb3ZlcmxheV90YWJsZXMoci0+cG9vbCwKLQkJICAgIHItPmVycl9oZWFkZXJzX291dCwgY29va2llX3RhYmxlKTsKLQkgICAgfQotCSAgICByZXR1cm4gY29uZF9zdGF0dXM7Ci0JfQotCi0JLyogaWYgd2Ugc2VlIGEgYm9ndXMgaGVhZGVyIGRvbid0IGlnbm9yZSBpdC4gU2hvdXQgYW5kIHNjcmVhbSAqLwotCi0jaWZkZWYgQ0hBUlNFVF9FQkNESUMKLQkgICAgLyogQ2hhbmNlcyBhcmUgdGhhdCB3ZSByZWNlaXZlZCBhbiBBU0NJSSBoZWFkZXIgdGV4dCBpbnN0ZWFkIG9mCi0JICAgICAqIHRoZSBleHBlY3RlZCBFQkNESUMgaGVhZGVyIGxpbmVzLiBUcnkgdG8gYXV0by1kZXRlY3Q6Ci0JICAgICAqLwotCWlmICghKGwgPSBzdHJjaHIodywgJzonKSkpIHsKLQkgICAgaW50IG1heWJlQVNDSUkgPSAwLCBtYXliZUVCQ0RJQyA9IDA7Ci0JICAgIGNoYXIgKmNwOwotCi0JICAgIGZvciAoY3AgPSB3OyAqY3AgIT0gJ1wwJzsgKytjcCkgewotCQlpZiAoaXNwcmludCgqY3ApICYmICFpc3ByaW50KG9zX3RvZWJjZGljWypjcF0pKQotCQkgICAgKyttYXliZUVCQ0RJQzsKLQkJaWYgKCFpc3ByaW50KCpjcCkgJiYgaXNwcmludChvc190b2ViY2RpY1sqY3BdKSkKLQkJICAgICsrbWF5YmVBU0NJSTsKLQkJfQotCSAgICBpZiAobWF5YmVBU0NJSSA+IG1heWJlRUJDRElDKSB7Ci0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgci0+c2VydmVyLAotCQkJICJDR0kgSW50ZXJmYWNlIEVycm9yOiBTY3JpcHQgaGVhZGVycyBhcHBhcmVudGx5IEFTQ0lJOiAoQ0dJID0gJXMpIiwgci0+ZmlsZW5hbWUpOwotCQlhc2NpaTJlYmNkaWModywgdywgY3AgLSB3KTsKLQkgICAgfQotCX0KLSNlbmRpZgotCWlmICghKGwgPSBzdHJjaHIodywgJzonKSkpIHsKLQkgICAgY2hhciBtYWxmb3JtZWRbKHNpemVvZiBNQUxGT1JNRURfTUVTU0FHRSkgKyAxCi0JCQkgICArIE1BTEZPUk1FRF9IRUFERVJfTEVOR1RIX1RPX1NIT1ddOwotCi0JICAgIHN0cmNweShtYWxmb3JtZWQsIE1BTEZPUk1FRF9NRVNTQUdFKTsKLQkgICAgc3RybmNhdChtYWxmb3JtZWQsIHcsIE1BTEZPUk1FRF9IRUFERVJfTEVOR1RIX1RPX1NIT1cpOwotCi0JICAgIGlmICghYnVmZmVyKSB7Ci0JCS8qIFNvYWsgdXAgYWxsIHRoZSBzY3JpcHQgb3V0cHV0IC0gbWF5IHNhdmUgYW4gb3V0cmlnaHQga2lsbCAqLwotCSAgICAgICAgd2hpbGUgKCgqZ2V0c2Z1bmMpICh3LCBNQVhfU1RSSU5HX0xFTiAtIDEsIGdldHNmdW5jX2RhdGEpKSB7Ci0JCSAgICBjb250aW51ZTsKLQkJfQotCSAgICB9Ci0KLQkgICAgYXBfa2lsbF90aW1lb3V0KHIpOwotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCByLAotCQkJICAiJXM6ICVzIiwgbWFsZm9ybWVkLCByLT5maWxlbmFtZSk7Ci0JICAgIHJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLQl9Ci0KLQkqbCsrID0gJ1wwJzsKLQl3aGlsZSAoKmwgJiYgYXBfaXNzcGFjZSgqbCkpIHsKLQkgICAgKytsOwotCX0KLQotCWlmICghc3RyY2FzZWNtcCh3LCAiQ29udGVudC10eXBlIikpIHsKLQkgICAgY2hhciAqdG1wOwotCi0JICAgIC8qIE51a2UgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLwotCi0JICAgIGNoYXIgKmVuZHAgPSBsICsgc3RybGVuKGwpIC0gMTsKLQkgICAgd2hpbGUgKGVuZHAgPiBsICYmIGFwX2lzc3BhY2UoKmVuZHApKSB7Ci0JCSplbmRwLS0gPSAnXDAnOwotCSAgICB9Ci0KLQkgICAgdG1wID0gYXBfcHN0cmR1cChyLT5wb29sLCBsKTsKLQkgICAgYXBfY29udGVudF90eXBlX3RvbG93ZXIodG1wKTsKLQkgICAgci0+Y29udGVudF90eXBlID0gdG1wOwotCX0KLQkvKgotCSAqIElmIHRoZSBzY3JpcHQgcmV0dXJuZWQgYSBzcGVjaWZpYyBzdGF0dXMsIHRoYXQncyB3aGF0Ci0JICogd2UnbGwgdXNlIC0gb3RoZXJ3aXNlIHdlIGFzc3VtZSAyMDAgT0suCi0JICovCi0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIlN0YXR1cyIpKSB7Ci0JICAgIHItPnN0YXR1cyA9IGNnaV9zdGF0dXMgPSBhdG9pKGwpOwotCSAgICByLT5zdGF0dXNfbGluZSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgbCk7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJMb2NhdGlvbiIpKSB7Ci0JICAgIGFwX3RhYmxlX3NldChyLT5oZWFkZXJzX291dCwgdywgbCk7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJDb250ZW50LUxlbmd0aCIpKSB7Ci0JICAgIGFwX3RhYmxlX3NldChyLT5oZWFkZXJzX291dCwgdywgbCk7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJUcmFuc2Zlci1FbmNvZGluZyIpKSB7Ci0JICAgIGFwX3RhYmxlX3NldChyLT5oZWFkZXJzX291dCwgdywgbCk7Ci0JfQotCS8qCi0JICogSWYgdGhlIHNjcmlwdCBnYXZlIHVzIGEgTGFzdC1Nb2RpZmllZCBoZWFkZXIsIHdlIGNhbid0IGp1c3QKLQkgKiBwYXNzIGl0IG9uIGJsaW5kbHkgYmVjYXVzZSBvZiByZXN0cmljdGlvbnMgb24gZnV0dXJlIHZhbHVlcy4KLQkgKi8KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiTGFzdC1Nb2RpZmllZCIpKSB7Ci0JICAgIHRpbWVfdCBtdGltZSA9IGFwX3BhcnNlSFRUUGRhdGUobCk7Ci0KLQkgICAgYXBfdXBkYXRlX210aW1lKHIsIG10aW1lKTsKLQkgICAgYXBfc2V0X2xhc3RfbW9kaWZpZWQocik7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJTZXQtQ29va2llIikpIHsKLQkgICAgYXBfdGFibGVfYWRkKGNvb2tpZV90YWJsZSwgdywgbCk7Ci0JfQotCWVsc2UgewotCSAgICBhcF90YWJsZV9hZGQobWVyZ2UsIHcsIGwpOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0c2Z1bmNfRklMRShjaGFyICpidWYsIGludCBsZW4sIHZvaWQgKmYpCi17Ci0gICAgcmV0dXJuIGZnZXRzKGJ1ZiwgbGVuLCAoRklMRSAqKSBmKSAhPSBOVUxMOwotfQotCi1BUElfRVhQT1JUKGludCkgYXBfc2Nhbl9zY3JpcHRfaGVhZGVyX2VycihyZXF1ZXN0X3JlYyAqciwgRklMRSAqZiwKLQkJCQkJICBjaGFyICpidWZmZXIpCi17Ci0gICAgcmV0dXJuIGFwX3NjYW5fc2NyaXB0X2hlYWRlcl9lcnJfY29yZShyLCBidWZmZXIsIGdldHNmdW5jX0ZJTEUsIGYpOwotfQotCi1zdGF0aWMgaW50IGdldHNmdW5jX0JVRkYoY2hhciAqdywgaW50IGxlbiwgdm9pZCAqZmIpCi17Ci0gICAgcmV0dXJuIGFwX2JnZXRzKHcsIGxlbiwgKEJVRkYgKikgZmIpID4gMDsKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX3NjYW5fc2NyaXB0X2hlYWRlcl9lcnJfYnVmZihyZXF1ZXN0X3JlYyAqciwgQlVGRiAqZmIsCi0JCQkJCSAgICAgICBjaGFyICpidWZmZXIpCi17Ci0gICAgcmV0dXJuIGFwX3NjYW5fc2NyaXB0X2hlYWRlcl9lcnJfY29yZShyLCBidWZmZXIsIGdldHNmdW5jX0JVRkYsIGZiKTsKLX0KLQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX3NlbmRfc2l6ZShzaXplX3Qgc2l6ZSwgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgLyogWFhYOiB0aGlzIC0xIHRoaW5nIGlzIGEgZ3Jvc3MgaGFjayAqLwotICAgIGlmIChzaXplID09IChzaXplX3QpLTEpIHsKLQlhcF9ycHV0cygiICAgIC0iLCByKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXNpemUpIHsKLQlhcF9ycHV0cygiICAgMGsiLCByKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2l6ZSA8IDEwMjQpIHsKLQlhcF9ycHV0cygiICAgMWsiLCByKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2l6ZSA8IDEwNDg1NzYpIHsKLQlhcF9ycHJpbnRmKHIsICIlNGRrIiwgKHNpemUgKyA1MTIpIC8gMTAyNCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNpemUgPCAxMDM4MDkwMjQpIHsKLQlhcF9ycHJpbnRmKHIsICIlNC4xZk0iLCBzaXplIC8gMTA0ODU3Ni4wKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JYXBfcnByaW50ZihyLCAiJTRkTSIsIChzaXplICsgNTI0Mjg4KSAvIDEwNDg1NzYpOwotICAgIH0KLX0KLQotI2lmIGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTjMyKQotc3RhdGljIGNoYXIgKipjcmVhdGVfYXJndl9jbWQocG9vbCAqcCwgY2hhciAqYXYwLCBjb25zdCBjaGFyICphcmdzLCBjaGFyICpwYXRoKQotewotICAgIHJlZ2lzdGVyIGludCB4LCBuOwotICAgIGNoYXIgKiphdjsKLSAgICBjaGFyICp3OwotCi0gICAgZm9yICh4ID0gMCwgbiA9IDI7IGFyZ3NbeF07IHgrKykgewotICAgICAgICBpZiAoYXJnc1t4XSA9PSAnKycpIHsKLQkgICAgKytuOwotCX0KLSAgICB9Ci0KLSAgICAvKiBBZGQgZXh0cmEgc3RyaW5ncyB0byBhcnJheS4gKi8KLSAgICBuID0gbiArIDI7Ci0KLSAgICBhdiA9IChjaGFyICoqKSBhcF9wYWxsb2MocCwgKG4gKyAxKSAqIHNpemVvZihjaGFyICopKTsKLSAgICBhdlswXSA9IGF2MDsKLQotICAgIC8qIE5vdyBpbnNlcnQgdGhlIGV4dHJhIHN0cmluZ3Mgd2UgbWFkZSByb29tIGZvciBhYm92ZS4gKi8KLSAgICBhdlsxXSA9IHN0cmR1cCgiL0MiKTsKLSAgICBhdlsyXSA9IHN0cmR1cChwYXRoKTsKLQotICAgIGZvciAoeCA9ICgxICsgMik7IHggPCBuOyB4KyspIHsKLQl3ID0gYXBfZ2V0d29yZChwLCAmYXJncywgJysnKTsKLQlhcF91bmVzY2FwZV91cmwodyk7Ci0JYXZbeF0gPSBhcF9lc2NhcGVfc2hlbGxfY21kKHAsIHcpOwotICAgIH0KLSAgICBhdltuXSA9IE5VTEw7Ci0gICAgcmV0dXJuIGF2OwotfQotI2VuZGlmCi0KLQotQVBJX0VYUE9SVChpbnQpIGFwX2NhbGxfZXhlYyhyZXF1ZXN0X3JlYyAqciwgY2hpbGRfaW5mbyAqcGluZm8sIGNoYXIgKmFyZ3YwLAotCQkJICAgICBjaGFyICoqZW52LCBpbnQgc2hlbGxjbWQpCi17Ci0gICAgaW50IHBpZCA9IDA7Ci0jaWYgZGVmaW5lZChSTElNSVRfQ1BVKSAgfHwgZGVmaW5lZChSTElNSVRfTlBST0MpIHx8IFwKLSAgICBkZWZpbmVkKFJMSU1JVF9EQVRBKSB8fCBkZWZpbmVkKFJMSU1JVF9WTUVNKSB8fCBkZWZpbmVkIChSTElNSVRfQVMpCi0KLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvbmY7Ci0gICAgY29uZiA9IChjb3JlX2Rpcl9jb25maWcgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCQkgICAgJmNvcmVfbW9kdWxlKTsKLQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoT1MyKQotICAgIC8qIHRoZSBmZCBvbiByLT5zZXJ2ZXItPmVycm9yX2xvZyBpcyBjbG9zZWQsIGJ1dCB3ZSBuZWVkIHNvbWV3aGVyZSB0bwotICAgICAqIHB1dCB0aGUgZXJyb3IgbWVzc2FnZXMgZnJvbSB0aGUgbG9nXyogZnVuY3Rpb25zLiBTbywgd2UgdXNlIHN0ZGVyciwKLSAgICAgKiBzaW5jZSB0aGF0IGlzIGJldHRlciB0aGFuIGFsbG93aW5nIGVycm9ycyB0byBnbyB1bm5vdGljZWQuICBEb24ndCBkbwotICAgICAqIHRoaXMgb24gV2luMzIsIHRob3VnaCwgc2luY2Ugd2UgaGF2ZW4ndCBmb3JrKCknZC4KLSAgICAgKi8KLSAgICByLT5zZXJ2ZXItPmVycm9yX2xvZyA9IHN0ZGVycjsKLSNlbmRpZgotCi0jaWZkZWYgUkxJTUlUX0NQVQotICAgIGlmIChjb25mLT5saW1pdF9jcHUgIT0gTlVMTCkgewotICAgICAgICBpZiAoKHNldHJsaW1pdChSTElNSVRfQ1BVLCBjb25mLT5saW1pdF9jcHUpKSAhPSAwKSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHItPnNlcnZlciwKLQkJCSAic2V0cmxpbWl0OiBmYWlsZWQgdG8gc2V0IENQVSB1c2FnZSBsaW1pdCIpOwotCX0KLSAgICB9Ci0jZW5kaWYKLSNpZmRlZiBSTElNSVRfTlBST0MKLSAgICBpZiAoY29uZi0+bGltaXRfbnByb2MgIT0gTlVMTCkgewotICAgICAgICBpZiAoKHNldHJsaW1pdChSTElNSVRfTlBST0MsIGNvbmYtPmxpbWl0X25wcm9jKSkgIT0gMCkgewotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLT5zZXJ2ZXIsCi0JCQkgInNldHJsaW1pdDogZmFpbGVkIHRvIHNldCBwcm9jZXNzIGxpbWl0Iik7Ci0JfQotICAgIH0KLSNlbmRpZgotI2lmIGRlZmluZWQoUkxJTUlUX0FTKQotICAgIGlmIChjb25mLT5saW1pdF9tZW0gIT0gTlVMTCkgewotICAgICAgICBpZiAoKHNldHJsaW1pdChSTElNSVRfQVMsIGNvbmYtPmxpbWl0X21lbSkpICE9IDApIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgci0+c2VydmVyLAotCQkJICJzZXRybGltaXQoUkxJTUlUX0FTKTogZmFpbGVkIHRvIHNldCBtZW1vcnkgIgotCQkJICJ1c2FnZSBsaW1pdCIpOwotCX0KLSAgICB9Ci0jZWxpZiBkZWZpbmVkKFJMSU1JVF9EQVRBKQotICAgIGlmIChjb25mLT5saW1pdF9tZW0gIT0gTlVMTCkgewotICAgICAgICBpZiAoKHNldHJsaW1pdChSTElNSVRfREFUQSwgY29uZi0+bGltaXRfbWVtKSkgIT0gMCkgewotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLT5zZXJ2ZXIsCi0JCQkgInNldHJsaW1pdChSTElNSVRfREFUQSk6IGZhaWxlZCB0byBzZXQgbWVtb3J5ICIKLQkJCSAidXNhZ2UgbGltaXQiKTsKLQl9Ci0gICAgfQotI2VsaWYgZGVmaW5lZChSTElNSVRfVk1FTSkKLSAgICBpZiAoY29uZi0+bGltaXRfbWVtICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKChzZXRybGltaXQoUkxJTUlUX1ZNRU0sIGNvbmYtPmxpbWl0X21lbSkpICE9IDApIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgci0+c2VydmVyLAotCQkJICJzZXRybGltaXQoUkxJTUlUX1ZNRU0pOiBmYWlsZWQgdG8gc2V0IG1lbW9yeSAiCi0JCQkgInVzYWdlIGxpbWl0Iik7Ci0JfQotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgT1MyCi0gICAgewotCS8qIEFkZGl0aW9ucyBieSBBbGVjIEtsb3NzLCB0byBhbGxvdyBleGVjJ2luZyBvZiBzY3JpcHRzIHVuZGVyIE9TLzIgKi8KLQlpbnQgaXNfc2NyaXB0ID0gMDsKLQljaGFyIGludGVycHJldGVyWzIwNDhdOwkvKiBob3BlIGl0J3MgZW5vdWdoIGZvciB0aGUgaW50ZXJwcmV0ZXIgcGF0aCAqLwotCWNoYXIgZXJyb3Jfb2JqZWN0WzI2MF07Ci0JRklMRSAqcHJvZ3JhbTsKLSAgICAgICAgY2hhciAqY21kbGluZSA9IHItPmZpbGVuYW1lLCAqY21kbGluZV9wb3M7Ci0gICAgICAgIGludCBjbWRsZW47Ci0JY2hhciAqYXJncyA9ICIiLCAqYXJnc19lbmQ7Ci0JVUxPTkcgcmM7Ci0gICAgICAgIFJFU1VMVENPREVTIHJlc2NvZGVzOwotICAgICAgICBpbnQgZW52X2xlbiwgZTsKLSAgICAgICAgY2hhciAqZW52X2Jsb2NrLCAqZW52X2Jsb2NrX3BvczsKLQotCWlmIChyLT5hcmdzICYmIHItPmFyZ3NbMF0gJiYgIXN0cmNocihyLT5hcmdzLCAnPScpKQotCSAgICBhcmdzID0gci0+YXJnczsKLQkgICAgCi0JcHJvZ3JhbSA9IGZvcGVuKHItPmZpbGVuYW1lLCAicnQiKTsKLQkKLQlpZiAoIXByb2dyYW0pIHsKLQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsICJmb3BlbiglcykgZmFpbGVkIiwKLQkJCSByLT5maWxlbmFtZSk7Ci0JICAgIHJldHVybiAocGlkKTsKLQl9Ci0JCi0JZmdldHMoaW50ZXJwcmV0ZXIsIHNpemVvZihpbnRlcnByZXRlciksIHByb2dyYW0pOwotCWZjbG9zZShwcm9ncmFtKTsKLQkKLQlpZiAoIXN0cm5jbXAoaW50ZXJwcmV0ZXIsICIjISIsIDIpKSB7Ci0JICAgIGlzX3NjcmlwdCA9IDE7Ci0gICAgICAgICAgICBpbnRlcnByZXRlcltzdHJsZW4oaW50ZXJwcmV0ZXIpIC0gMV0gPSAnXDAnOwotICAgICAgICAgICAgaWYgKGludGVycHJldGVyWzJdICE9ICcvJyAmJiBpbnRlcnByZXRlclsyXSAhPSAnXFwnICYmIGludGVycHJldGVyWzNdICE9ICc6JykgewotICAgICAgICAgICAgICAgIGNoYXIgYnVmZmVyWzMwMF07Ci0gICAgICAgICAgICAgICAgaWYgKERvc1NlYXJjaFBhdGgoU0VBUkNIX0VOVklST05NRU5ULCAiUEFUSCIsIGludGVycHJldGVyKzIsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGludGVycHJldGVyKzIsIGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyY2F0KGludGVycHJldGVyLCAiLmV4ZSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoRG9zU2VhcmNoUGF0aChTRUFSQ0hfRU5WSVJPTk1FTlQsICJQQVRIIiwgaW50ZXJwcmV0ZXIrMiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGludGVycHJldGVyKzIsIGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0JfQotCi0gICAgICAgIGlmIChpc19zY3JpcHQpIHsKLSAgICAgICAgICAgIGNtZGxpbmUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIGludGVycHJldGVyKzIsICIgIiwgci0+ZmlsZW5hbWUsIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0cnN0cihzdHJ1cHIoci0+ZmlsZW5hbWUpLCAiLkNNRCIpID4gMCkgewotICAgICAgICAgICAgLyogU3BlY2lhbCBjYXNlIHRvIGFsbG93IHVzZSBvZiBSRVhYIGNvbW1hbmRzIGFzIHNjcmlwdHMuICovCi0gICAgICAgICAgICBvczJwYXRobmFtZShyLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICBjbWRsaW5lID0gYXBfcHN0cmNhdChyLT5wb29sLCBTSEVMTF9QQVRILCAiIC9DICIsIHItPmZpbGVuYW1lLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNtZGxpbmUgPSByLT5maWxlbmFtZTsKLQl9Ci0JCi0gICAgICAgIGFyZ3MgPSBhcF9wc3RyZHVwKHItPnBvb2wsIGFyZ3MpOwotICAgICAgICBhcF91bmVzY2FwZV91cmwoYXJncyk7Ci0gICAgICAgIGFyZ3MgPSBhcF9kb3VibGVfcXVvdGVzKHItPnBvb2wsIGFyZ3MpOwotICAgICAgICBhcmdzX2VuZCA9IGFyZ3MgKyBzdHJsZW4oYXJncyk7Ci0KLSAgICAgICAgaWYgKGFyZ3NfZW5kIC0gYXJncyA+IDQwMDApIHsgLyogY21kLmV4ZSB3b24ndCBoYW5kbGUgbGluZXMgbG9uZ2VyIHRoYW4gNGsgKi8KLSAgICAgICAgICAgIGFyZ3NfZW5kID0gYXJncyArIDQwMDA7Ci0gICAgICAgICAgICAqYXJnc19lbmQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogKzQgPSAxIHNwYWNlIGJldHdlZW4gcHJvZ25hbWUgYW5kIGFyZ3MsIDIgZm9yIGRvdWJsZSBudWxsIGF0IGVuZCwgMiBmb3IgcG9zc2libGUgcXVvdGUgb24gZmlyc3QgYXJnICovCi0gICAgICAgIGNtZGxlbiA9IHN0cmxlbihjbWRsaW5lKSArIHN0cmxlbihhcmdzKSArIDQ7IAotICAgICAgICBjbWRsaW5lX3BvcyA9IGNtZGxpbmU7Ci0KLSAgICAgICAgd2hpbGUgKCpjbWRsaW5lX3BvcykgewotICAgICAgICAgICAgY21kbGVuICs9IDIgKiAoKmNtZGxpbmVfcG9zID09ICcrJyk7ICAvKiBBbGxvdyBzcGFjZSBmb3IgZWFjaCBhcmcgdG8gYmUgcXVvdGVkICovCi0gICAgICAgICAgICBjbWRsaW5lX3BvcysrOwotICAgICAgICB9Ci0KLSAgICAgICAgY21kbGluZSA9IGFwX3BzdHJuZHVwKHItPnBvb2wsIGNtZGxpbmUsIGNtZGxlbik7Ci0gICAgICAgIGNtZGxpbmVfcG9zID0gY21kbGluZSArIHN0cmxlbihjbWRsaW5lKTsKLQotCXdoaWxlIChhcmdzIDwgYXJnc19lbmQpIHsKLSAgICAgICAgICAgIGNoYXIgKmFyZzsKLQkgICAgCi0gICAgICAgICAgICBhcmcgPSBhcF9nZXR3b3JkX25jKHItPnBvb2wsICZhcmdzLCAnKycpOwotCi0gICAgICAgICAgICBpZiAoc3RycGJyayhhcmcsICImfDw+ICIpKQotICAgICAgICAgICAgICAgIGFyZyA9IGFwX3BzdHJjYXQoci0+cG9vbCwgIlwiIiwgYXJnLCAiXCIiLCBOVUxMKTsKLQotICAgICAgICAgICAgKihjbWRsaW5lX3BvcysrKSA9ICcgJzsKLSAgICAgICAgICAgIHN0cmNweShjbWRsaW5lX3BvcywgYXJnKTsKLSAgICAgICAgICAgIGNtZGxpbmVfcG9zICs9IHN0cmxlbihjbWRsaW5lX3Bvcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAqKCsrY21kbGluZV9wb3MpID0gMDsgLyogQWRkIHJlcXVpcmVkIHNlY29uZCB0ZXJtaW5hdG9yICovCi0JYXJncyA9IHN0cmNocihjbWRsaW5lLCAnICcpOwotCQotCWlmIChhcmdzKSB7Ci0JICAgICphcmdzID0gMDsKLQkgICAgYXJncysrOwotCX0KLQotICAgICAgICAvKiBDcmVhdGUgZW52aXJvbm1lbnQgYmxvY2sgZnJvbSBsaXN0IG9mIGVudmFyaWFibGVzICovCi0gICAgICAgIGZvciAoZW52X2xlbj0xLCBlPTA7IGVudltlXTsgZSsrKQotICAgICAgICAgICAgZW52X2xlbiArPSBzdHJsZW4oZW52W2VdKSArIDE7Ci0KLSAgICAgICAgZW52X2Jsb2NrID0gYXBfcGFsbG9jKHItPnBvb2wsIGVudl9sZW4pOwotICAgICAgICBlbnZfYmxvY2tfcG9zID0gZW52X2Jsb2NrOwotCi0gICAgICAgIGZvciAoZT0wOyBlbnZbZV07IGUrKykgewotICAgICAgICAgICAgc3RyY3B5KGVudl9ibG9ja19wb3MsIGVudltlXSk7Ci0gICAgICAgICAgICBlbnZfYmxvY2tfcG9zICs9IHN0cmxlbihlbnZfYmxvY2tfcG9zKSArIDE7Ci0gICAgICAgIH0KLQotICAgICAgICAqZW52X2Jsb2NrX3BvcyA9IDA7IC8qIGVudmlyb25tZW50IGJsb2NrIGlzIHRlcm1pbmF0ZWQgYnkgYSBkb3VibGUgbnVsbCAqLwotCi0JcmMgPSBEb3NFeGVjUGdtKGVycm9yX29iamVjdCwgc2l6ZW9mKGVycm9yX29iamVjdCksIEVYRUNfQVNZTkMsIGNtZGxpbmUsIGVudl9ibG9jaywgJnJlc2NvZGVzLCBjbWRsaW5lKTsKLQkKLQlpZiAocmMpIHsKLSAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLCAiRG9zRXhlY1BnbSglcyAlcykgZmFpbGVkLCAlcyAtICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY21kbGluZSwgYXJncyA/IGFyZ3MgOiAiIiwgYXBfb3NfZXJyb3JfbWVzc2FnZShyYyksIGVycm9yX29iamVjdCApOwotCSAgICByZXR1cm4gLTE7Ci0JfQotCQotCXJldHVybiByZXNjb2Rlcy5jb2RlVGVybWluYXRlOwotICAgIH0KLSNlbGlmIGRlZmluZWQoV0lOMzIpCi0gICAgewotICAgICAgICAvKiBBZGFwdGVkIGZyb20gQWxlYyBLbG9zcycgd29yayBmb3IgT1MvMiAqLwotICAgICAgICBjaGFyICppbnRlcnByZXRlciA9IE5VTEw7Ci0gICAgICAgIGNoYXIgKmFyZ3VtZW50cyA9IE5VTEw7Ci0gICAgICAgIGNoYXIgKmV4dCA9IE5VTEw7Ci0gICAgICAgIGNoYXIgKmV4ZW5hbWUgPSBOVUxMOwotICAgICAgICBjaGFyICpzID0gTlVMTDsKLSAgICAgICAgY2hhciAqcXVvdGVkX2ZpbGVuYW1lOwotICAgICAgICBjaGFyICpwQ29tbWFuZDsKLSAgICAgICAgY2hhciAqcEVudkJsb2NrLCAqcE5leHQ7Ci0KLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGludCBpRW52QmxvY2tMZW47Ci0KLSAgICAgICAgZmlsZV90eXBlX2UgZmlsZVR5cGU7Ci0KLSAgICAgICAgU1RBUlRVUElORk8gc2k7Ci0gICAgICAgIFBST0NFU1NfSU5GT1JNQVRJT04gcGk7Ci0KLSAgICAgICAgbWVtc2V0KCZzaSwgMCwgc2l6ZW9mKHNpKSk7Ci0gICAgICAgIG1lbXNldCgmcGksIDAsIHNpemVvZihwaSkpOwotCi0gICAgICAgIHBpZCA9IC0xOwotCi0gICAgICAgIGlmICghc2hlbGxjbWQpIHsKLQotICAgICAgICAgICAgZmlsZVR5cGUgPSBhcF9nZXRfd2luMzJfaW50ZXJwcmV0ZXIociwgJmludGVycHJldGVyKTsKLQotICAgICAgICAgICAgaWYgKGZpbGVUeXBlID09IGVGaWxlVHlwZVVOS05PV04pIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUnxBUExPR19OT0VSUk5PLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBleGVjdXRhYmxlOyBlbnN1cmUgaW50ZXJwcmV0ZWQgc2NyaXB0cyBoYXZlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiMhXCIgZmlyc3QgbGluZSIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIHJldHVybiAocGlkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIExvb2sgYXQgdGhlIGFyZ3VtZW50cy4uLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBhcmd1bWVudHMgPSAiIjsKLSAgICAgICAgICAgIGlmICgoci0+YXJncykgJiYgKHItPmFyZ3NbMF0pICYmICFzdHJjaHIoci0+YXJncywgJz0nKSkgeyAKLSAgICAgICAgICAgICAgICAvKiBJZiB3ZSBhcmUgaW4gdGhpcyBsZWcsIHRoZXJlIGFyZSBzb21lIG90aGVyIGFyZ3VtZW50cwotICAgICAgICAgICAgICAgICAqIHRoYXQgd2UgbXVzdCBpbmNsdWRlIGluIHRoZSBleGVjdXRpb24gb2YgdGhlIENHSS4KLSAgICAgICAgICAgICAgICAgKiBCZWNhdXNlIENyZWF0ZVByb2Nlc3MgaXMgdGhlIHdheSBpdCBpcywgd2UgaGF2ZSB0bwotICAgICAgICAgICAgICAgICAqIGNyZWF0ZSBhIGNvbW1hbmQgbGluZSBsaWtlIGZvcm1hdCBmb3IgdGhlIGV4ZWN1dGlvbgotICAgICAgICAgICAgICAgICAqIG9mIHRoZSBDR0kuICBUaGlzIG1lYW5zIHdlIG5lZWQgdG8gY3JlYXRlIG9uIGxvbmcKLSAgICAgICAgICAgICAgICAgKiBzdHJpbmcgd2l0aCB0aGUgZXhlY3V0YWJsZSBhbmQgYXJndW1lbnRzLgotICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICogVGhlIGFyZ3VtZW50cyBzdHJpbmcgY29tZXMgaW4gdGhlIHJlcXVlc3Qgc3RydWN0dXJlLAotICAgICAgICAgICAgICAgICAqIGFuZCBlYWNoIGFyZ3VtZW50IGlzIHNlcGFyYXRlZCBieSBhICcrJy4gIFdlJ2xsIHJlcGxhY2UKLSAgICAgICAgICAgICAgICAgKiB0aGVzZSBwbHVzZXMgd2l0aCBzcGFjZXMuCi0gICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICBpbnQgaVN0cmluZ1NpemUgPSAwOwotICAgICAgICAgICAgICAgIGludCB4OwotCSAgICAKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqICBEdXBsaWNhdGUgdGhlIHJlcXVlc3Qgc3RydWN0dXJlIHN0cmluZyBzbyB3ZSBkb24ndCBjaGFuZ2UgaXQuCi0gICAgICAgICAgICAgICAgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBhcmd1bWVudHMgPSBhcF9wc3RyZHVwKHItPnBvb2wsIHItPmFyZ3MpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogIENoYW5nZSB0aGUgJysnIHRvICcgJwotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGZvciAoeD0wOyBhcmd1bWVudHNbeF07IHgrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoJysnID09IGFyZ3VtZW50c1t4XSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzW3hdID0gJyAnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgIAotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogV2UgbmVlZCB0byB1bmVzY2FwZSBhbnkgY2hhcmFjdGVycyB0aGF0IGFyZSAKLSAgICAgICAgICAgICAgICAgKiBpbiB0aGUgYXJndW1lbnRzIGxpc3QuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgYXBfdW5lc2NhcGVfdXJsKGFyZ3VtZW50cyk7Ci0gICAgICAgICAgICAgICAgYXJndW1lbnRzID0gYXBfZXNjYXBlX3NoZWxsX2NtZChyLT5wb29sLCBhcmd1bWVudHMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogV2UgaGF2ZSB0aGUgaW50ZXJwcmV0ZXIgKGlmIHRoZXJlIGlzIG9uZSkgYW5kIHdlIGhhdmUgCi0gICAgICAgICAgICAgKiB0aGUgYXJndW1lbnRzIChpZiB0aGVyZSBhcmUgYW55KS4KLSAgICAgICAgICAgICAqIEJ1aWxkIHRoZSBjb21tYW5kIHN0cmluZyB0byBwYXNzIHRvIENyZWF0ZVByb2Nlc3MuIAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBxdW90ZWRfZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsICJcIiIsIHItPmZpbGVuYW1lLCAiXCIiLCBOVUxMKTsKLSAgICAgICAgICAgIGlmIChpbnRlcnByZXRlciAmJiAqaW50ZXJwcmV0ZXIpIHsKLSAgICAgICAgICAgICAgICBwQ29tbWFuZCA9IGFwX3BzdHJjYXQoci0+cG9vbCwgaW50ZXJwcmV0ZXIsICIgIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlZF9maWxlbmFtZSwgIiAiLCBhcmd1bWVudHMsIE5VTEwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcENvbW1hbmQgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHF1b3RlZF9maWxlbmFtZSwgIiAiLCBhcmd1bWVudHMsIE5VTEwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICBjaGFyICpzaGVsbF9jbWQgPSAiQ01ELkVYRSAvQyAiOwotICAgICAgICAgICAgT1NWRVJTSU9OSU5GTyBvc3ZlcjsKLSAgICAgICAgICAgIG9zdmVyLmR3T1NWZXJzaW9uSW5mb1NpemUgPSBzaXplb2YoT1NWRVJTSU9OSU5GTyk7Ci0gICAgICAgICAKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBVc2UgQ01ELkVYRSBmb3IgTlQsIENPTU1BTkQuQ09NIGZvciBXSU45NQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoR2V0VmVyc2lvbkV4KCZvc3ZlcikpIHsKLSAgICAgICAgICAgICAgICBpZiAob3N2ZXIuZHdQbGF0Zm9ybUlkICE9IFZFUl9QTEFURk9STV9XSU4zMl9OVCkgewotICAgICAgICAgICAgICAgICAgICBzaGVsbF9jbWQgPSAiQ09NTUFORC5DT00gL0MgIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9ICAgICAgIAotICAgICAgICAgICAgcENvbW1hbmQgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHNoZWxsX2NtZCwgYXJndjAsIE5VTEwpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogTWFrZSBjaGlsZCBwcm9jZXNzIHVzZSBoUGlwZU91dHB1dFdyaXRlIGFzIHN0YW5kYXJkIG91dCwKLSAgICAgICAgICogYW5kIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBzaG93IG9uIHNjcmVlbi4KLSAgICAgICAgICovCi0gICAgICAgIHNpLmNiID0gc2l6ZW9mKHNpKTsKLSAgICAgICAgc2kuZHdGbGFncyAgICAgPSBTVEFSVEZfVVNFU0hPV1dJTkRPVyB8IFNUQVJURl9VU0VTVERIQU5ETEVTOwotICAgICAgICBzaS53U2hvd1dpbmRvdyA9IFNXX0hJREU7Ci0gICAgICAgIHNpLmhTdGRJbnB1dCAgID0gcGluZm8tPmhQaXBlSW5wdXRSZWFkOwotICAgICAgICBzaS5oU3RkT3V0cHV0ICA9IHBpbmZvLT5oUGlwZU91dHB1dFdyaXRlOwotICAgICAgICBzaS5oU3RkRXJyb3IgICA9IHBpbmZvLT5oUGlwZUVycm9yV3JpdGU7Ci0gIAotICAgICAgICAvKgotICAgICAgICAgKiBXaW4zMidzIENyZWF0ZVByb2Nlc3MgY2FsbCByZXF1aXJlcyB0aGF0IHRoZSBlbnZpcm9ubWVudAotICAgICAgICAgKiBiZSBwYXNzZWQgaW4gYW4gZW52aXJvbm1lbnQgYmxvY2ssIGEgbnVsbCB0ZXJtaW5hdGVkIGJsb2NrIG9mCi0gICAgICAgICAqIG51bGwgdGVybWluYXRlZCBzdHJpbmdzLgotICAgICAgICAgKi8gIAotICAgICAgICBpID0gMDsKLSAgICAgICAgaUVudkJsb2NrTGVuID0gMTsKLSAgICAgICAgd2hpbGUgKGVudltpXSkgewotICAgICAgICAgICAgaUVudkJsb2NrTGVuICs9IHN0cmxlbihlbnZbaV0pICsgMTsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAKLSAgICAgICAgcEVudkJsb2NrID0gKGNoYXIgKilhcF9wY2FsbG9jKHItPnBvb2wsaUVudkJsb2NrTGVuKTsKLSAgICAKLSAgICAgICAgaSA9IDA7Ci0gICAgICAgIHBOZXh0ID0gcEVudkJsb2NrOwotICAgICAgICB3aGlsZSAoZW52W2ldKSB7Ci0gICAgICAgICAgICBzdHJjcHkocE5leHQsIGVudltpXSk7Ci0gICAgICAgICAgICBwTmV4dCA9IHBOZXh0ICsgc3RybGVuKHBOZXh0KSArIDE7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoQ3JlYXRlUHJvY2VzcyhOVUxMLCBwQ29tbWFuZCwgTlVMTCwgTlVMTCwgVFJVRSwgREVUQUNIRURfUFJPQ0VTUywgcEVudkJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9tYWtlX2RpcnN0cl9wYXJlbnQoci0+cG9vbCwgci0+ZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmc2ksICZwaSkpIHsKLSAgICAgICAgICAgIGlmIChmaWxlVHlwZSA9PSBlRmlsZVR5cGVFWEUxNikgewotICAgICAgICAgICAgICAgIC8qIEhhY2sgdG8gZ2V0IDE2LWJpdCBDR0kncyB3b3JraW5nLiBJdCB3b3JrcyBmb3IgYWxsIHRoZSAKLSAgICAgICAgICAgICAgICAgKiBzdGFuZGFyZCBtb2R1bGVzIHNoaXBwZWQgd2l0aCBBcGFjaGUuIHBpLmR3UHJvY2Vzc0lkIGlzIDAgCi0gICAgICAgICAgICAgICAgICogZm9yIDE2LWJpdCBDR0lzIGFuZCBhbGwgdGhlIFVuaXggc3BlY2lmaWMgY29kZSB0aGF0IGNhbGxzIAotICAgICAgICAgICAgICAgICAqIGFwX2NhbGxfZXhlYyBpbnRlcnByZXRzIHRoaXMgYXMgYSBmYWlsdXJlIGNhc2UuIEFuZCB3ZSBjYW4ndCAKLSAgICAgICAgICAgICAgICAgKiB1c2UgLTEgZWl0aGVyIGJlY2F1c2UgaXQgaXMgbWFwcGVkIHRvIDAgYnkgdGhlIGNhbGxlci4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwaWQgPSAtMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHBpZCA9IHBpLmR3UHJvY2Vzc0lkOwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogV2UgbXVzdCBjbG9zZSB0aGUgaGFuZGxlcyB0byB0aGUgbmV3IHByb2Nlc3MgYW5kIGl0cyBtYWluIHRocmVhZAotICAgICAgICAgICAgICAgICAqIHRvIHByZXZlbnQgaGFuZGxlIGFuZCBtZW1vcnkgbGVha3MuCi0gICAgICAgICAgICAgICAgICovIAotICAgICAgICAgICAgICAgIENsb3NlSGFuZGxlKHBpLmhQcm9jZXNzKTsKLSAgICAgICAgICAgICAgICBDbG9zZUhhbmRsZShwaS5oVGhyZWFkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKHBpZCk7Ci0gICAgfQotCi0jZWxzZQotICAgIGlmIChhcF9zdWV4ZWNfZW5hYmxlZAotCSYmICgoci0+c2VydmVyLT5zZXJ2ZXJfdWlkICE9IGFwX3VzZXJfaWQpCi0JICAgIHx8IChyLT5zZXJ2ZXItPnNlcnZlcl9naWQgIT0gYXBfZ3JvdXBfaWQpCi0JICAgIHx8ICghc3RybmNtcCgiL34iLCByLT51cmksIDIpKSkpIHsKLQotCWNoYXIgKmV4ZWN1c2VyLCAqZ3JwbmFtZTsKLQlzdHJ1Y3QgcGFzc3dkICpwdzsKLQlzdHJ1Y3QgZ3JvdXAgKmdyOwotCi0JaWYgKCFzdHJuY21wKCIvfiIsIHItPnVyaSwgMikpIHsKLQkgICAgZ2lkX3QgdXNlcl9naWQ7Ci0JICAgIGNoYXIgKnVzZXJuYW1lID0gYXBfcHN0cmR1cChyLT5wb29sLCByLT51cmkgKyAyKTsKLQkgICAgY2hhciAqcG9zID0gc3RyY2hyKHVzZXJuYW1lLCAnLycpOwotCi0JICAgIGlmIChwb3MpIHsKLQkJKnBvcyA9ICdcMCc7Ci0JICAgIH0KLQotCSAgICBpZiAoKHB3ID0gZ2V0cHduYW0odXNlcm5hbWUpKSA9PSBOVUxMKSB7Ci0JCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotCQkJICAgICAiZ2V0cHduYW06IGludmFsaWQgdXNlcm5hbWUgJXMiLCB1c2VybmFtZSk7Ci0JCXJldHVybiAocGlkKTsKLQkgICAgfQotCSAgICBleGVjdXNlciA9IGFwX3BzdHJjYXQoci0+cG9vbCwgIn4iLCBwdy0+cHdfbmFtZSwgTlVMTCk7Ci0JICAgIHVzZXJfZ2lkID0gcHctPnB3X2dpZDsKLQotCSAgICBpZiAoKGdyID0gZ2V0Z3JnaWQodXNlcl9naWQpKSA9PSBOVUxMKSB7Ci0JICAgICAgICBpZiAoKGdycG5hbWUgPSBhcF9wYWxsb2Moci0+cG9vbCwgMTYpKSA9PSBOVUxMKSB7Ci0JCSAgICByZXR1cm4gKHBpZCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCSAgICBhcF9zbnByaW50ZihncnBuYW1lLCAxNiwgIiVsZCIsIChsb25nKSB1c2VyX2dpZCk7Ci0JCX0KLQkgICAgfQotCSAgICBlbHNlIHsKLQkJZ3JwbmFtZSA9IGdyLT5ncl9uYW1lOwotCSAgICB9Ci0JfQotCWVsc2UgewotCSAgICBpZiAoKHB3ID0gZ2V0cHd1aWQoci0+c2VydmVyLT5zZXJ2ZXJfdWlkKSkgPT0gTlVMTCkgewotCQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgciwKLQkJCSAgICAgImdldHB3dWlkOiBpbnZhbGlkIHVzZXJpZCAlbGQiLAotCQkJICAgICAobG9uZykgci0+c2VydmVyLT5zZXJ2ZXJfdWlkKTsKLQkJcmV0dXJuIChwaWQpOwotCSAgICB9Ci0JICAgIGV4ZWN1c2VyID0gYXBfcHN0cmR1cChyLT5wb29sLCBwdy0+cHdfbmFtZSk7Ci0KLQkgICAgaWYgKChnciA9IGdldGdyZ2lkKHItPnNlcnZlci0+c2VydmVyX2dpZCkpID09IE5VTEwpIHsKLQkJYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsCi0JCQkgICAgICJnZXRncmdpZDogaW52YWxpZCBncm91cGlkICVsZCIsCi0JCQkgICAgIChsb25nKSByLT5zZXJ2ZXItPnNlcnZlcl9naWQpOwotCQlyZXR1cm4gKHBpZCk7Ci0JICAgIH0KLQkgICAgZ3JwbmFtZSA9IGdyLT5ncl9uYW1lOwotCX0KLQotCWlmIChzaGVsbGNtZCkgewotCSAgICBleGVjbGUoU1VFWEVDX0JJTiwgU1VFWEVDX0JJTiwgZXhlY3VzZXIsIGdycG5hbWUsIGFyZ3YwLAotCQkgICBOVUxMLCBlbnYpOwotCX0KLQotCWVsc2UgaWYgKCghci0+YXJncykgfHwgKCFyLT5hcmdzWzBdKSB8fCBzdHJjaHIoci0+YXJncywgJz0nKSkgewotCSAgICBleGVjbGUoU1VFWEVDX0JJTiwgU1VFWEVDX0JJTiwgZXhlY3VzZXIsIGdycG5hbWUsIGFyZ3YwLAotCQkgICBOVUxMLCBlbnYpOwotCX0KLQotCWVsc2UgewotCSAgICBleGVjdmUoU1VFWEVDX0JJTiwKLQkJICAgY3JlYXRlX2FyZ3Yoci0+cG9vbCwgU1VFWEVDX0JJTiwgZXhlY3VzZXIsIGdycG5hbWUsCi0JCQkgICAgICAgYXJndjAsIHItPmFyZ3MpLAotCQkgICBlbnYpOwotCX0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmIChzaGVsbGNtZCkgewotCSAgICBleGVjbGUoU0hFTExfUEFUSCwgU0hFTExfUEFUSCwgIi1jIiwgYXJndjAsIE5VTEwsIGVudik7Ci0JfQotCi0JZWxzZSBpZiAoKCFyLT5hcmdzKSB8fCAoIXItPmFyZ3NbMF0pIHx8IHN0cmNocihyLT5hcmdzLCAnPScpKSB7Ci0JICAgIGV4ZWNsZShyLT5maWxlbmFtZSwgYXJndjAsIE5VTEwsIGVudik7Ci0JfQotCi0JZWxzZSB7Ci0JICAgIGV4ZWN2ZShyLT5maWxlbmFtZSwKLQkJICAgY3JlYXRlX2FyZ3Yoci0+cG9vbCwgTlVMTCwgTlVMTCwgTlVMTCwgYXJndjAsIHItPmFyZ3MpLAotCQkgICBlbnYpOwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIChwaWQpOwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9zZXJ2ZXIvdXRpbF90aW1lLmMgYi9zZXJ2ZXIvdXRpbF90aW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYjA3NmIuLjAwMDAwMDAKLS0tIGEvc2VydmVyL3V0aWxfdGltZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaW5jbHVkZSAidXRpbF90aW1lLmgiCi0KLS8qIENhY2hlIGZvciBleHBsb2RlZCB2YWx1ZXMgb2YgcmVjZW50IHRpbWVzdGFtcHMKLSAqLwotCi1zdHJ1Y3QgZXhwbG9kZWRfdGltZV9jYWNoZV9lbGVtZW50IHsKLSAgICBhcHJfaW50NjRfdCB0OwotICAgIGFwcl9leHBsb2RlZF90aW1lX3QgeHQ7Ci0gICAgYXByX2ludDY0X3QgdF92YWxpZGF0ZTsgLyogcGxlYXNlIHNlZSBjb21tZW50cyBpbiBjYWNoZWRfZXhwbG9kZSgpICovCi19OwotCi0vKiB0aGUgIisgMSIgaXMgZm9yIHRoZSBjdXJyZW50IHNlY29uZDogKi8KLSNkZWZpbmUgVElNRV9DQUNIRV9TSVpFIChBUF9USU1FX1JFQ0VOVF9USFJFU0hPTEQgKyAxKQotCi1zdGF0aWMgc3RydWN0IGV4cGxvZGVkX3RpbWVfY2FjaGVfZWxlbWVudCBleHBsb2RlZF9jYWNoZV9sb2NhbHRpbWVbVElNRV9DQUNIRV9TSVpFXTsKLXN0YXRpYyBzdHJ1Y3QgZXhwbG9kZWRfdGltZV9jYWNoZV9lbGVtZW50IGV4cGxvZGVkX2NhY2hlX2dtdFtUSU1FX0NBQ0hFX1NJWkVdOwotCi0KLXN0YXRpYyBhcHJfc3RhdHVzX3QgY2FjaGVkX2V4cGxvZGUoYXByX2V4cGxvZGVkX3RpbWVfdCAqeHQsIGFwcl90aW1lX3QgdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV4cGxvZGVkX3RpbWVfY2FjaGVfZWxlbWVudCAqY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VfZ210KQotewotICAgIGFwcl9pbnQ2NF90IHNlY29uZHMgPSB0IC8gQVBSX1VTRUNfUEVSX1NFQzsKLSAgICBzdHJ1Y3QgZXhwbG9kZWRfdGltZV9jYWNoZV9lbGVtZW50ICpjYWNoZV9lbGVtZW50ID0KLSAgICAgICAgJihjYWNoZVtzZWNvbmRzICUgVElNRV9DQUNIRV9TSVpFXSk7Ci0gICAgc3RydWN0IGV4cGxvZGVkX3RpbWVfY2FjaGVfZWxlbWVudCBjYWNoZV9lbGVtZW50X3NuYXBzaG90OwotCi0gICAgLyogVGhlIGNhY2hlIGlzIGltcGxlbWVudGVkIGFzIGEgcmluZyBidWZmZXIuICBFYWNoIHNlY29uZCwKLSAgICAgKiBpdCB1c2VzIGEgZGlmZmVyZW50IGVsZW1lbnQgaW4gdGhlIGJ1ZmZlci4gIFRoZSB0aW1lc3RhbXAKLSAgICAgKiBpbiB0aGUgZWxlbWVudCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZWxlbWVudCBjb250YWlucyB0aGUKLSAgICAgKiBleHBsb2RlZCB0aW1lIGZvciB0aGUgY3VycmVudCBzZWNvbmQgKHZzIHRoZSB0aW1lCi0gICAgICogJ25vdyAtIEFQX1RJTUVfUkVDRU5UX1RIUkVTSE9MRCcgc2Vjb25kcyBhZ28pLiAgSWYgdGhlCi0gICAgICogY2FjaGVkIHZhbHVlIGlzIGZvciB0aGUgY3VycmVudCB0aW1lLCB3ZSB1c2UgaXQuICBPdGhlcndpc2UsCi0gICAgICogd2UgY29tcHV0ZSB0aGUgYXByX2V4cGxvZGVkX3RpbWVfdCBhbmQgc3RvcmUgaXQgaW4gdGhpcwotICAgICAqIGNhY2hlIGVsZW1lbnQuIE5vdGUgdGhhdCB0aGUgdGltZXN0YW1wIGluIHRoZSBjYWNoZQotICAgICAqIGVsZW1lbnQgaXMgdXBkYXRlZCBvbmx5IGFmdGVyIHRoZSBleHBsb2RlZCB0aW1lLiAgVGh1cwotICAgICAqIGlmIHR3byB0aHJlYWRzIGhpdCB0aGlzIGNhY2hlIGVsZW1lbnQgc2ltdWx0YW5lb3VzbHkKLSAgICAgKiBhdCB0aGUgc3RhcnQgb2YgYSBuZXcgc2Vjb25kLCB0aGV5J2xsIGJvdGggZXhwbG9kZSB0aGUKLSAgICAgKiB0aW1lIGFuZCBzdG9yZSBpdC4gIEkuZS4sIHRoZSB3cml0ZXJzIHdpbGwgY29sbGlkZSwgYnV0Ci0gICAgICogdGhleSdsbCBiZSB3cml0aW5nIHRoZSBzYW1lIHZhbHVlLgotICAgICAqLwotICAgIGlmIChjYWNoZV9lbGVtZW50LT50ID49IHNlY29uZHMpIHsKLSAgICAgICAgLyogVGhlcmUgaXMgYW4gaW50ZW50aW9uYWwgcmFjZSBjb25kaXRpb24gaW4gdGhpcyBkZXNpZ246Ci0gICAgICAgICAqIGluIGEgbXVsdGl0aHJlYWRlZCBhcHAsIG9uZSB0aHJlYWQgbWlnaHQgYmUgcmVhZGluZwotICAgICAgICAgKiBmcm9tIHRoaXMgY2FjaGVfZWxlbWVudCB0byByZXNvbHZlIGEgdGltZXN0YW1wIGZyb20KLSAgICAgICAgICogVElNRV9DQUNIRV9TSVpFIHNlY29uZHMgYWdvIGF0IHRoZSBzYW1lIHRpbWUgdGhhdAotICAgICAgICAgKiBhbm90aGVyIHRocmVhZCBpcyBjb3B5aW5nIHRoZSBleHBsb2RlZCBmb3JtIG9mIHRoZQotICAgICAgICAgKiBjdXJyZW50IHRpbWUgaW50byB0aGUgc2FtZSBjYWNoZV9lbGVtZW50LiAgKEkuZS4sIHRoZQotICAgICAgICAgKiBmaXJzdCB0aHJlYWQgbWlnaHQgaGl0IHRoaXMgZWxlbWVudCBvZiB0aGUgcmluZyBidWZmZXIKLSAgICAgICAgICoganVzdCBhcyB0aGUgZWxlbWVudCBpcyBiZWluZyByZWN5Y2xlZC4pICBUaGlzIGNhbgotICAgICAgICAgKiBhbHNvIGhhcHBlbiBhdCB0aGUgc3RhcnQgb2YgYSBuZXcgc2Vjb25kLCBpZiBhCi0gICAgICAgICAqIHJlYWRlciBhY2Nlc3NlcyB0aGUgY2FjaGVfZWxlbWVudCBhZnRlciBhIHdyaXRlcgotICAgICAgICAgKiBoYXMgdXBkYXRlZCBjYWNoZV9lbGVtZW50LnQgYnV0IGJlZm9yZSB0aGUgd3JpdGVyCi0gICAgICAgICAqIGhhcyBmaW5pc2hlZCB1cGRhdGluZyB0aGUgd2hvbGUgY2FjaGVfZWxlbWVudC4KLSAgICAgICAgICoKLSAgICAgICAgICogUmF0aGVyIHRoYW4gdHJ5aW5nIHRvIHByZXZlbnQgdGhpcyByYWNlIGNvbmRpdGlvbgotICAgICAgICAgKiB3aXRoIGxvY2tzLCB3ZSBhbGxvdyBpdCB0byBoYXBwZW4gYW5kIHRoZW4gZGV0ZWN0Ci0gICAgICAgICAqIGFuZCBjb3JyZWN0IGl0LiAgVGhlIGRldGVjdGlvbiB3b3JrcyBsaWtlIHRoaXM6Ci0gICAgICAgICAqICAgU3RlcCAxOiBUYWtlIGEgInNuYXBzaG90IiBvZiB0aGUgY2FjaGUgZWxlbWVudCBieQotICAgICAgICAgKiAgICAgICAgICAgY29weWluZyBpdCBpbnRvIGEgdGVtcG9yYXJ5IGJ1ZmZlci4KLSAgICAgICAgICogICBTdGVwIDI6IENoZWNrIHdoZXRoZXIgdGhlIHNuYXBzaG90IGNvbnRhaW5zIGNvbnNpc3RlbnQKLSAgICAgICAgICogICAgICAgICAgIGRhdGE6IHRoZSB0aW1lc3RhbXBzIGF0IHRoZSBzdGFydCBhbmQgZW5kIG9mCi0gICAgICAgICAqICAgICAgICAgICB0aGUgY2FjaGVfZWxlbWVudCBzaG91bGQgYm90aCBtYXRjaCB0aGUgJ3NlY29uZHMnCi0gICAgICAgICAqICAgICAgICAgICB2YWx1ZSB0aGF0IHdlIGNvbXB1dGVkIGZyb20gdGhlIGlucHV0IHRpbWUuCi0gICAgICAgICAqICAgICAgICAgICBJZiB0aGVzZSB0aHJlZSBkb24ndCBtYXRjaCwgdGhlbiB0aGUgc25hcHNob3QKLSAgICAgICAgICogICAgICAgICAgIHNob3dzIHRoZSBjYWNoZV9lbGVtZW50IGluIHRoZSBtaWRkbGUgb2YgYW4KLSAgICAgICAgICogICAgICAgICAgIHVwZGF0ZSwgYW5kIGl0cyBjb250ZW50cyBhcmUgaW52YWxpZC4KLSAgICAgICAgICogICBTdGVwIDM6IElmIHRoZSBzbmFwc2hvdCBpcyB2YWxpZCwgdXNlIGl0LiAgT3RoZXJ3aXNlLAotICAgICAgICAgKiAgICAgICAgICAganVzdCBnaXZlIHVwIG9uIHRoZSBjYWNoZSBhbmQgZXhwbG9kZSB0aGUKLSAgICAgICAgICogICAgICAgICAgIGlucHV0IHRpbWUuCi0gICAgICAgICAqLwotICAgICAgICBtZW1jcHkoJmNhY2hlX2VsZW1lbnRfc25hcHNob3QsIGNhY2hlX2VsZW1lbnQsCi0gICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGV4cGxvZGVkX3RpbWVfY2FjaGVfZWxlbWVudCkpOwotICAgICAgICBpZiAoKHNlY29uZHMgIT0gY2FjaGVfZWxlbWVudF9zbmFwc2hvdC50KSB8fAotICAgICAgICAgICAgKHNlY29uZHMgIT0gY2FjaGVfZWxlbWVudF9zbmFwc2hvdC50X3ZhbGlkYXRlKSkgewotICAgICAgICAgICAgLyogSW52YWxpZCBzbmFwc2hvdCAqLwotICAgICAgICAgICAgaWYgKHVzZV9nbXQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYXByX2V4cGxvZGVfZ210KHh0LCB0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBhcHJfZXhwbG9kZV9sb2NhbHRpbWUoeHQsIHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLyogVmFsaWQgc25hcHNob3QgKi8KLSAgICAgICAgICAgIG1lbWNweSh4dCwgJihjYWNoZV9lbGVtZW50X3NuYXBzaG90Lnh0KSwKLSAgICAgICAgICAgICAgICAgICBzaXplb2YoYXByX2V4cGxvZGVkX3RpbWVfdCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBhcHJfc3RhdHVzX3QgcjsKLSAgICAgICAgaWYgKHVzZV9nbXQpIHsKLSAgICAgICAgICAgIHIgPSBhcHJfZXhwbG9kZV9nbXQoeHQsIHQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgciA9IGFwcl9leHBsb2RlX2xvY2FsdGltZSh4dCwgdCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFBUFJfU1RBVFVTX0lTX1NVQ0NFU1MocikpIHsKLSAgICAgICAgICAgIHJldHVybiByOwotICAgICAgICB9Ci0gICAgICAgIGNhY2hlX2VsZW1lbnQtPnQgPSBzZWNvbmRzOwotICAgICAgICBtZW1jcHkoJihjYWNoZV9lbGVtZW50LT54dCksIHh0LCBzaXplb2YoYXByX2V4cGxvZGVkX3RpbWVfdCkpOwotICAgICAgICBjYWNoZV9lbGVtZW50LT50X3ZhbGlkYXRlID0gc2Vjb25kczsKLSAgICB9Ci0gICAgeHQtPnRtX3VzZWMgPSB0ICUgQVBSX1VTRUNfUEVSX1NFQzsKLSAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci19Ci0KLQotQVBfREVDTEFSRShhcHJfc3RhdHVzX3QpIGFwX2V4cGxvZGVfcmVjZW50X2xvY2FsdGltZShhcHJfZXhwbG9kZWRfdGltZV90ICogdG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcl90aW1lX3QgdCkKLXsKLSAgICByZXR1cm4gY2FjaGVkX2V4cGxvZGUodG0sIHQsIGV4cGxvZGVkX2NhY2hlX2xvY2FsdGltZSwgMCk7Ci19Ci0KLUFQX0RFQ0xBUkUoYXByX3N0YXR1c190KSBhcF9leHBsb2RlX3JlY2VudF9nbXQoYXByX2V4cGxvZGVkX3RpbWVfdCAqIHRtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHJfdGltZV90IHQpCi17Ci0gICAgcmV0dXJuIGNhY2hlZF9leHBsb2RlKHRtLCB0LCBleHBsb2RlZF9jYWNoZV9nbXQsIDEpOwotfQpkaWZmIC0tZ2l0IGEvc2VydmVyL3V0aWxfeG1sLmMgYi9zZXJ2ZXIvdXRpbF94bWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZjOGEwZi4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvdXRpbF94bWwuYworKysgL2Rldi9udWxsCkBAIC0xLDQyMSArMCwwIEBACi0vKgotKiogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAgR3JlZyBTdGVpbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoqCi0qKiBCeSB1c2luZyB0aGlzIGZpbGUsIHlvdSBhZ3JlZSB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgc2V0IGZvcnRoIGluCi0qKiB0aGUgTElDRU5TRS5odG1sIGZpbGUgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIG1vZF9kYXYKLSoqIGRpc3RyaWJ1dGlvbiBvciBhdCBodHRwOi8vd3d3LndlYmRhdi5vcmcvbW9kX2Rhdi9saWNlbnNlLTEuaHRtbC4KLSoqCi0qKiBDb250YWN0IGluZm9ybWF0aW9uOgotKiogICBHcmVnIFN0ZWluLCBQTyBCb3ggNzYwLCBQYWxvIEFsdG8sIENBLCA5NDMwMgotKiogICBnc3RlaW5AbHlyYS5vcmcsIGh0dHA6Ly93d3cud2ViZGF2Lm9yZy9tb2RfZGF2LwotKi8KLQotLyoKLSoqIERBViBleHRlbnNpb24gbW9kdWxlIGZvciBBcGFjaGUgMS4zLioKLSoqICAtIFhNTCBwYXJzZXIgZm9yIHRoZSBib2R5IG9mIGEgcmVxdWVzdAotKioKLSoqIFdyaXR0ZW4gYnkgR3JlZyBTdGVpbiwgZ3N0ZWluQGx5cmEub3JnLCBodHRwOi8vd3d3Lmx5cmEub3JnLwotKi8KLQotLyogSmFtZXMgQ2xhcmsncyBFeHBhdCBwYXJzZXIgKi8KLSNpbmNsdWRlIDx4bWxwYXJzZS5oPgotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLQotI2luY2x1ZGUgIm1vZF9kYXYuaCIKLQotCi0vKiBlcnJvcnMgcmVsYXRlZCB0byBuYW1lc3BhY2UgcHJvY2Vzc2luZyAqLwotI2RlZmluZSBEQVZfTlNfRVJST1JfVU5LTk9XTl9QUkVGSVgJKERBVl9OU19FUlJPUl9CQVNFKQotCi0vKiB0ZXN0IGZvciBhIG5hbWVzcGFjZSBwcmVmaXggdGhhdCBiZWdpbnMgd2l0aCBbWHhdW01tXVtMbF0gKi8KLSNkZWZpbmUgREFWX05TX0lTX1JFU0VSVkVEKG5hbWUpIFwKLQkoIChuYW1lWzBdID09ICdYJyB8fCBuYW1lWzBdID09ICd4JykgJiYgXAotCSAgKG5hbWVbMV0gPT0gJ00nIHx8IG5hbWVbMV0gPT0gJ20nKSAmJiBcCi0JICAobmFtZVsyXSA9PSAnTCcgfHwgbmFtZVsyXSA9PSAnbCcpICkKLQotLyogY29udGVudCBmb3IgcGFyc2luZyAqLwotdHlwZWRlZiBzdHJ1Y3QgZGF2X3htbF9jdHggewotICAgIGRhdl94bWxfZG9jICpkb2M7CQkvKiB0aGUgZG9jIHdlJ3JlIHBhcnNpbmcgKi8KLSAgICBhcF9wb29sICpwOwkJCS8qIHRoZSBwb29sIHdlIGFsbG9jYXRlIGZyb20gKi8KLSAgICBkYXZfeG1sX2VsZW0gKmN1cl9lbGVtOwkvKiBjdXJyZW50IGVsZW1lbnQgKi8KLQotICAgIGludCBlcnJvcjsJCQkvKiBhbiBlcnJvciBoYXMgb2NjdXJyZWQgKi8KLSAgICAvKiBlcnJvcnMgbWF5IGJlIERBVl9OU19FUlJPUl8qIG9yIG90aGVyIGVycm9ycyBkZWZpbmVkIGhlcmUgKG5vbmUgeWV0KSAqLwotCi19IGRhdl94bWxfY3R4OwotCi0vKiBzdHJ1Y3QgZm9yIHNjb3BpbmcgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QgZGF2X3htbF9uc19zY29wZSB7Ci0gICAgY29uc3QgY2hhciAqcHJlZml4OwkJLyogcHJlZml4IHVzZWQgZm9yIHRoaXMgbnMgKi8KLSAgICBpbnQgbnM7CQkJLyogaW5kZXggaW50byBuYW1lc3BhY2UgdGFibGUgKi8KLSAgICBpbnQgZW1wdHlVUkk7CQkvKiB0aGUgbmFtZXNwYWNlIFVSSSBpcyB0aGUgZW1wdHkgc3RyaW5nICovCi0gICAgc3RydWN0IGRhdl94bWxfbnNfc2NvcGUgKm5leHQ7CS8qIG5leHQgc2NvcGVkIG5hbWVzcGFjZSAqLwotfSBkYXZfeG1sX25zX3Njb3BlOwotCi0vKiAjIyMgbmVlZCBhIHNpbWlsYXIgbWVjaGFuaXNtIGZvciB4bWw6bGFuZyB2YWx1ZXMgKi8KLQotCi0vKiByZXR1cm4gbmFtZXNwYWNlIHRhYmxlIGluZGV4IGZvciBhIGdpdmVuIHByZWZpeCAqLwotc3RhdGljIGludCBkYXZfZmluZF9wcmVmaXgoZGF2X3htbF9jdHggKmN0eCwgY29uc3QgY2hhciAqcHJlZml4KQotewotICAgIGRhdl94bWxfZWxlbSAqZWxlbSA9IGN0eC0+Y3VyX2VsZW07Ci0KLSAgICAvKgotICAgICoqIFdhbGsgdXAgdGhlIHRyZWUsIGxvb2tpbmcgZm9yIGEgbmFtZXNwYWNlIHNjb3BlIHRoYXQgZGVmaW5lcyB0aGlzCi0gICAgKiogcHJlZml4LgotICAgICovCi0gICAgZm9yICg7IGVsZW07IGVsZW0gPSBlbGVtLT5wYXJlbnQpIHsKLQlkYXZfeG1sX25zX3Njb3BlICpuc19zY29wZSA9IGVsZW0tPm5zX3Njb3BlOwotCi0JZm9yIChuc19zY29wZSA9IGVsZW0tPm5zX3Njb3BlOyBuc19zY29wZTsgbnNfc2NvcGUgPSBuc19zY29wZS0+bmV4dCkgewotCSAgICBpZiAoc3RyY21wKHByZWZpeCwgbnNfc2NvcGUtPnByZWZpeCkgPT0gMCkgewotCQlpZiAobnNfc2NvcGUtPmVtcHR5VVJJKSB7Ci0JCSAgICAvKgotCQkgICAgKiogSXQgaXMgcG9zc2libGUgdG8gc2V0IHRoZSBkZWZhdWx0IG5hbWVzcGFjZSB0byBhbgotCQkgICAgKiogZW1wdHkgVVJJIHN0cmluZzsgdGhpcyByZXNldHMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0JCSAgICAqKiB0byBtZWFuICJubyBuYW1lc3BhY2UuIiBXZSBqdXN0IGZvdW5kIHRoZSBwcmVmaXgKLQkJICAgICoqIHJlZmVycyB0byBhbiBlbXB0eSBVUkksIHNvIHJldHVybiAibm8gbmFtZXNwYWNlLiIKLQkJICAgICovCi0JCSAgICByZXR1cm4gREFWX05TX05PTkU7Ci0JCX0KLQotCQlyZXR1cm4gbnNfc2NvcGUtPm5zOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIC8qCi0gICAgICogSWYgdGhlIHByZWZpeCBpcyBlbXB0eSAoIiIpLCB0aGlzIG1lYW5zIHRoYXQgYSBwcmVmaXggd2FzIG5vdAotICAgICAqIHNwZWNpZmllZCBpbiB0aGUgZWxlbWVudC9hdHRyaWJ1dGUuIFRoZSBzZWFyY2ggdGhhdCB3YXMgcGVyZm9ybWVkCi0gICAgICoganVzdCBhYm92ZSBkaWQgbm90IGxvY2F0ZSBhIGRlZmF1bHQgbmFtZXNwYWNlIFVSSSAod2hpY2ggaXMgc3RvcmVkCi0gICAgICogaW50byBuc19zY29wZSB3aXRoIGFuIGVtcHR5IHByZWZpeCkuIFRoaXMgbWVhbnMgdGhlIGVsZW1lbnQvYXR0cmlidXRlCi0gICAgICogaGFzICJubyBuYW1lc3BhY2UiLiBXZSBoYXZlIGEgcmVzZXJ2ZWQgdmFsdWUgZm9yIHRoaXMuCi0gICAgICovCi0gICAgaWYgKCpwcmVmaXggPT0gJ1wwJykgewotCXJldHVybiBEQVZfTlNfTk9ORTsKLSAgICB9Ci0KLSAgICAvKiBub3QgZm91bmQgKi8KLSAgICByZXR1cm4gREFWX05TX0VSUk9SX1VOS05PV05fUFJFRklYOwotfQotCi1zdGF0aWMgdm9pZCBkYXZfc3RhcnRfaGFuZGxlcih2b2lkICp1c2VyZGF0YSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKQotewotICAgIGRhdl94bWxfY3R4ICpjdHggPSB1c2VyZGF0YTsKLSAgICBkYXZfeG1sX2VsZW0gKmVsZW07Ci0gICAgZGF2X3htbF9hdHRyICphdHRyOwotICAgIGRhdl94bWxfYXR0ciAqcHJldjsKLSAgICBjaGFyICpjb2xvbjsKLSAgICBjb25zdCBjaGFyICpxdW90ZWQ7Ci0KLSAgICAvKiBwdW50IG9uY2Ugd2UgZmluZCBhbiBlcnJvciAqLwotICAgIGlmIChjdHgtPmVycm9yKQotCXJldHVybjsKLQotICAgIGVsZW0gPSBhcF9wY2FsbG9jKGN0eC0+cCwgc2l6ZW9mKCplbGVtKSk7Ci0KLSAgICAvKiBwcmVwIHRoZSBlbGVtZW50ICovCi0gICAgZWxlbS0+bmFtZSA9IGFwX3BzdHJkdXAoY3R4LT5wLCBuYW1lKTsKLQotICAgIC8qIGZpbGwgaW4gdGhlIGF0dHJpYnV0ZXMgKG5vdGU6IGVuZHMgdXAgaW4gcmV2ZXJzZSBvcmRlcikgKi8KLSAgICB3aGlsZSAoKmF0dHJzKSB7Ci0JYXR0ciA9IGFwX3BhbGxvYyhjdHgtPnAsIHNpemVvZigqYXR0cikpOwotCWF0dHItPm5hbWUgPSBhcF9wc3RyZHVwKGN0eC0+cCwgKmF0dHJzKyspOwotCWF0dHItPnZhbHVlID0gYXBfcHN0cmR1cChjdHgtPnAsICphdHRycysrKTsKLQlhdHRyLT5uZXh0ID0gZWxlbS0+YXR0cjsKLQllbGVtLT5hdHRyID0gYXR0cjsKLSAgICB9Ci0KLSAgICAvKiBob29rIHRoZSBlbGVtZW50IGludG8gdGhlIHRyZWUgKi8KLSAgICBpZiAoY3R4LT5jdXJfZWxlbSA9PSBOVUxMKSB7Ci0JLyogbm8gY3VycmVudCBlbGVtZW50OyB0aGlzIGFsc28gYmVjb21lcyB0aGUgcm9vdCAqLwotCWN0eC0+Y3VyX2VsZW0gPSBjdHgtPmRvYy0+cm9vdCA9IGVsZW07Ci0gICAgfQotICAgIGVsc2UgewotCS8qIHRoaXMgZWxlbWVudCBhcHBlYXJlZCB3aXRoaW4gdGhlIGN1cnJlbnQgZWxlbSAqLwotCWVsZW0tPnBhcmVudCA9IGN0eC0+Y3VyX2VsZW07Ci0KLQkvKiBzZXQgdXAgdGhlIGNoaWxkL3NpYmxpbmcgbGlua3MgKi8KLQlpZiAoZWxlbS0+cGFyZW50LT5sYXN0X2NoaWxkID09IE5VTEwpIHsKLQkgICAgLyogbm8gZmlyc3QgY2hpbGQgZWl0aGVyICovCi0JICAgIGVsZW0tPnBhcmVudC0+Zmlyc3RfY2hpbGQgPSBlbGVtLT5wYXJlbnQtPmxhc3RfY2hpbGQgPSBlbGVtOwotCX0KLQllbHNlIHsKLQkgICAgLyogaG9vayBvbnRvIHRoZSBlbmQgb2YgdGhlIHBhcmVudCdzIGNoaWxkcmVuICovCi0JICAgIGVsZW0tPnBhcmVudC0+bGFzdF9jaGlsZC0+bmV4dCA9IGVsZW07Ci0JICAgIGVsZW0tPnBhcmVudC0+bGFzdF9jaGlsZCA9IGVsZW07Ci0JfQotCi0JLyogdGhpcyBlbGVtZW50IGlzIG5vdyB0aGUgY3VycmVudCBlbGVtZW50ICovCi0JY3R4LT5jdXJfZWxlbSA9IGVsZW07Ci0gICAgfQotCi0gICAgLyogc2NhbiB0aGUgYXR0cmlidXRlcyBmb3IgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyAqLwotICAgIGZvciAocHJldiA9IE5VTEwsIGF0dHIgPSBlbGVtLT5hdHRyOwotCSBhdHRyOwotCSBhdHRyID0gYXR0ci0+bmV4dCkgewotCWlmIChzdHJuY21wKGF0dHItPm5hbWUsICJ4bWxucyIsIDUpID09IDApIHsKLQkgICAgY29uc3QgY2hhciAqcHJlZml4ID0gJmF0dHItPm5hbWVbNV07Ci0JICAgIGRhdl94bWxfbnNfc2NvcGUgKm5zX3Njb3BlOwotCi0JICAgIC8qIHRlc3QgZm9yIHhtbG5zOmZvbz0gZm9ybSBhbmQgeG1sbnM9IGZvcm0gKi8KLQkgICAgaWYgKCpwcmVmaXggPT0gJzonKQotCQkrK3ByZWZpeDsKLQkgICAgZWxzZSBpZiAoKnByZWZpeCAhPSAnXDAnKSB7Ci0JCS8qIGFkdmFuY2UgInByZXYiIHNpbmNlICJhdHRyIiBpcyBzdGlsbCBwcmVzZW50ICovCi0JCXByZXYgPSBhdHRyOwotCQljb250aW51ZTsKLQkgICAgfQotCi0JICAgIC8qIHF1b3RlIHRoZSBVUkkgYmVmb3JlIHdlIGV2ZXIgc3RhcnQgd29ya2luZyB3aXRoIGl0ICovCi0JICAgIHF1b3RlZCA9IGRhdl9xdW90ZV9zdHJpbmcoY3R4LT5wLCBhdHRyLT52YWx1ZSwgMSk7Ci0KLQkgICAgLyogYnVpbGQgYW5kIGluc2VydCB0aGUgbmV3IHNjb3BlICovCi0JICAgIG5zX3Njb3BlID0gYXBfcGNhbGxvYyhjdHgtPnAsIHNpemVvZigqbnNfc2NvcGUpKTsKLQkgICAgbnNfc2NvcGUtPnByZWZpeCA9IHByZWZpeDsKLQkgICAgbnNfc2NvcGUtPm5zID0gZGF2X2luc2VydF91cmkoY3R4LT5kb2MtPm5hbWVzcGFjZXMsIHF1b3RlZCk7Ci0JICAgIG5zX3Njb3BlLT5lbXB0eVVSSSA9ICpxdW90ZWQgPT0gJ1wwJzsKLQkgICAgbnNfc2NvcGUtPm5leHQgPSBlbGVtLT5uc19zY29wZTsKLQkgICAgZWxlbS0+bnNfc2NvcGUgPSBuc19zY29wZTsKLQotCSAgICAvKiByZW1vdmUgdGhpcyBhdHRyaWJ1dGUgZnJvbSB0aGUgZWxlbWVudCAqLwotCSAgICBpZiAocHJldiA9PSBOVUxMKQotCQllbGVtLT5hdHRyID0gYXR0ci0+bmV4dDsKLQkgICAgZWxzZQotCQlwcmV2LT5uZXh0ID0gYXR0ci0+bmV4dDsKLQotCSAgICAvKiBOb3RlOiBwcmV2IHdpbGwgbm90IGJlIGFkdmFuY2VkIHNpbmNlIHdlIGp1c3QgcmVtb3ZlZCAiYXR0ciIgKi8KLQl9Ci0JZWxzZSBpZiAoc3RyY21wKGF0dHItPm5hbWUsICJ4bWw6bGFuZyIpID09IDApIHsKLQkgICAgLyogc2F2ZSBhd2F5IHRoZSBsYW5ndWFnZSAoaW4gcXVvdGVkIGZvcm0pICovCi0JICAgIGVsZW0tPmxhbmcgPSBkYXZfcXVvdGVfc3RyaW5nKGN0eC0+cCwgYXR0ci0+dmFsdWUsIDEpOwotCi0JICAgIC8qIHJlbW92ZSB0aGlzIGF0dHJpYnV0ZSBmcm9tIHRoZSBlbGVtZW50ICovCi0JICAgIGlmIChwcmV2ID09IE5VTEwpCi0JCWVsZW0tPmF0dHIgPSBhdHRyLT5uZXh0OwotCSAgICBlbHNlCi0JCXByZXYtPm5leHQgPSBhdHRyLT5uZXh0OwotCi0JICAgIC8qIE5vdGU6IHByZXYgd2lsbCBub3QgYmUgYWR2YW5jZWQgc2luY2Ugd2UganVzdCByZW1vdmVkICJhdHRyIiAqLwotCX0KLQllbHNlIHsKLQkgICAgLyogYWR2YW5jZSAicHJldiIgc2luY2UgImF0dHIiIGlzIHN0aWxsIHByZXNlbnQgKi8KLQkgICAgcHJldiA9IGF0dHI7Ci0JfQotICAgIH0KLQotICAgIC8qCi0gICAgKiogSWYgYW4geG1sOmxhbmcgYXR0cmlidXRlIGRpZG4ndCBleGlzdCAobGFuZz09TlVMTCksIHRoZW4gY29weSB0aGUKLSAgICAqKiBsYW5ndWFnZSBmcm9tIHRoZSBwYXJlbnQgZWxlbWVudCAoaWYgcHJlc2VudCkuCi0gICAgKioKLSAgICAqKiBOT1RFOiBkYXZfZWxlbV9zaXplKCkgKmRlcGVuZHMqIHVwb24gdGhpcyBwb2ludGVyIGVxdWFsaXR5LgotICAgICovCi0gICAgaWYgKGVsZW0tPmxhbmcgPT0gTlVMTCAmJiBlbGVtLT5wYXJlbnQgIT0gTlVMTCkKLQllbGVtLT5sYW5nID0gZWxlbS0+cGFyZW50LT5sYW5nOwotCi0gICAgLyogYWRqdXN0IHRoZSBlbGVtZW50J3MgbmFtZXNwYWNlICovCi0gICAgY29sb24gPSBzdHJjaHIoZWxlbS0+bmFtZSwgJzonKTsKLSAgICBpZiAoY29sb24gPT0gTlVMTCkgewotCS8qCi0JICogVGhlIGVsZW1lbnQgaXMgdXNpbmcgdGhlIGRlZmF1bHQgbmFtZXNwYWNlLCB3aGljaCB3aWxsIGFsd2F5cwotCSAqIGJlIGZvdW5kLiBFaXRoZXIgaXQgd2lsbCBiZSAibm8gbmFtZXNwYWNlIiwgb3IgYSBkZWZhdWx0Ci0JICogbmFtZXNwYWNlIFVSSSBoYXMgYmVlbiBzcGVjaWZpZWQgYXQgc29tZSBwb2ludC4KLQkgKi8KLQllbGVtLT5ucyA9IGRhdl9maW5kX3ByZWZpeChjdHgsICIiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoREFWX05TX0lTX1JFU0VSVkVEKGVsZW0tPm5hbWUpKSB7Ci0JZWxlbS0+bnMgPSBEQVZfTlNfTk9ORTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JKmNvbG9uID0gJ1wwJzsKLQllbGVtLT5ucyA9IGRhdl9maW5kX3ByZWZpeChjdHgsIGVsZW0tPm5hbWUpOwotCWVsZW0tPm5hbWUgPSBjb2xvbiArIDE7Ci0KLQlpZiAoREFWX05TX0lTX0VSUk9SKGVsZW0tPm5zKSkgewotCSAgICBjdHgtPmVycm9yID0gZWxlbS0+bnM7Ci0JICAgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gICAgLyogYWRqdXN0IGFsbCByZW1haW5pbmcgYXR0cmlidXRlcycgbmFtZXNwYWNlcyAqLwotICAgIGZvciAoYXR0ciA9IGVsZW0tPmF0dHI7IGF0dHI7IGF0dHIgPSBhdHRyLT5uZXh0KSB7Ci0JY29sb24gPSBzdHJjaHIoYXR0ci0+bmFtZSwgJzonKTsKLQlpZiAoY29sb24gPT0gTlVMTCkgewotCSAgICAvKgotCSAgICAgKiBBdHRyaWJ1dGVzIGRvIE5PVCB1c2UgdGhlIGRlZmF1bHQgbmFtZXNwYWNlLiBUaGVyZWZvcmUsCi0JICAgICAqIHdlIHBsYWNlIHRoZW0gaW50byB0aGUgIm5vIG5hbWVzcGFjZSIgY2F0ZWdvcnkuCi0JICAgICAqLwotCSAgICBhdHRyLT5ucyA9IERBVl9OU19OT05FOwotCX0KLQllbHNlIGlmIChEQVZfTlNfSVNfUkVTRVJWRUQoYXR0ci0+bmFtZSkpIHsKLQkgICAgYXR0ci0+bnMgPSBEQVZfTlNfTk9ORTsKLQl9Ci0JZWxzZSB7Ci0JICAgICpjb2xvbiA9ICdcMCc7Ci0JICAgIGF0dHItPm5zID0gZGF2X2ZpbmRfcHJlZml4KGN0eCwgYXR0ci0+bmFtZSk7Ci0JICAgIGF0dHItPm5hbWUgPSBjb2xvbiArIDE7Ci0KLQkgICAgaWYgKERBVl9OU19JU19FUlJPUihhdHRyLT5ucykpIHsKLQkJY3R4LT5lcnJvciA9IGF0dHItPm5zOwotCQlyZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBkYXZfZW5kX2hhbmRsZXIodm9pZCAqdXNlcmRhdGEsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgZGF2X3htbF9jdHggKmN0eCA9IHVzZXJkYXRhOwotCi0gICAgLyogcHVudCBvbmNlIHdlIGZpbmQgYW4gZXJyb3IgKi8KLSAgICBpZiAoY3R4LT5lcnJvcikKLQlyZXR1cm47Ci0KLSAgICAvKiBwb3AgdXAgb25lIGxldmVsICovCi0gICAgY3R4LT5jdXJfZWxlbSA9IGN0eC0+Y3VyX2VsZW0tPnBhcmVudDsKLX0KLQotc3RhdGljIHZvaWQgZGF2X2NkYXRhX2hhbmRsZXIodm9pZCAqdXNlcmRhdGEsIGNvbnN0IGNoYXIgKmRhdGEsIGludCBsZW4pCi17Ci0gICAgZGF2X3htbF9jdHggKmN0eCA9IHVzZXJkYXRhOwotICAgIGRhdl94bWxfZWxlbSAqZWxlbTsKLSAgICBkYXZfdGV4dF9oZWFkZXIgKmhkcjsKLSAgICBjb25zdCBjaGFyICpzOwotCi0gICAgLyogcHVudCBvbmNlIHdlIGZpbmQgYW4gZXJyb3IgKi8KLSAgICBpZiAoY3R4LT5lcnJvcikKLQlyZXR1cm47Ci0KLSAgICBlbGVtID0gY3R4LT5jdXJfZWxlbTsKLSAgICBzID0gYXBfcHN0cm5kdXAoY3R4LT5wLCBkYXRhLCBsZW4pOwotCi0gICAgaWYgKGVsZW0tPmxhc3RfY2hpbGQgPT0gTlVMTCkgewotCS8qIG5vIGNoaWxkcmVuIHlldC4gdGhpcyBjZGF0YSBmb2xsb3dzIHRoZSBzdGFydCB0YWcgKi8KLQloZHIgPSAmZWxlbS0+Zmlyc3RfY2RhdGE7Ci0gICAgfQotICAgIGVsc2UgewotCS8qIGNoaWxkIGVsZW1lbnRzIGV4aXN0LiB0aGlzIGNkYXRhIGZvbGxvd3MgdGhlIGxhc3QgY2hpbGQuICovCi0JaGRyID0gJmVsZW0tPmxhc3RfY2hpbGQtPmZvbGxvd2luZ19jZGF0YTsKLSAgICB9Ci0KLSAgICBkYXZfdGV4dF9hcHBlbmQoY3R4LT5wLCBoZHIsIHMpOwotfQotCi1pbnQgZGF2X3BhcnNlX2lucHV0KHJlcXVlc3RfcmVjICogciwgZGF2X3htbF9kb2MgKipwZG9jKQotewotICAgIGludCByZXN1bHQ7Ci0gICAgZGF2X3htbF9jdHggY3R4ID0KLSAgICB7MH07Ci0gICAgWE1MX1BhcnNlciBwYXJzZXI7Ci0KLSAgICBpZiAoKHJlc3VsdCA9IGFwX3NldHVwX2NsaWVudF9ibG9jayhyLCBSRVFVRVNUX0NIVU5LRURfREVDSFVOSykpICE9IE9LKQotCXJldHVybiByZXN1bHQ7Ci0KLSAgICBpZiAoci0+cmVtYWluaW5nID09IDApIHsKLQkqcGRvYyA9IE5VTEw7Ci0JcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGN0eC5wID0gci0+cG9vbDsKLSAgICBjdHguZG9jID0gYXBfcGNhbGxvYyhjdHgucCwgc2l6ZW9mKCpjdHguZG9jKSk7Ci0KLSAgICBjdHguZG9jLT5uYW1lc3BhY2VzID0gYXBfbWFrZV9hcnJheShjdHgucCwgNSwgc2l6ZW9mKGNvbnN0IGNoYXIgKikpOwotICAgIGRhdl9pbnNlcnRfdXJpKGN0eC5kb2MtPm5hbWVzcGFjZXMsICJEQVY6Iik7Ci0KLSAgICAvKiAjIyMgd2Ugc2hvdWxkIGdldCB0aGUgZW5jb2RpbmcgZnJvbSBDb250ZW50LUVuY29kaW5nICovCi0gICAgcGFyc2VyID0gWE1MX1BhcnNlckNyZWF0ZShOVUxMKTsKLSAgICBpZiAocGFyc2VyID09IE5VTEwpIHsKLQkvKiAjIyMgYW55dGhpbmcgYmV0dGVyIHRvIGRvPyAqLwotCWZwcmludGYoc3RkZXJyLCAiT3VjaCEgIFhNTF9QYXJzZXJDcmVhdGUoKSBmYWlsZWQhXG4iKTsKLQlleGl0KDEpOwotICAgIH0KLQotICAgIFhNTF9TZXRVc2VyRGF0YShwYXJzZXIsICh2b2lkICopICZjdHgpOwotICAgIFhNTF9TZXRFbGVtZW50SGFuZGxlcihwYXJzZXIsIGRhdl9zdGFydF9oYW5kbGVyLCBkYXZfZW5kX2hhbmRsZXIpOwotICAgIFhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihwYXJzZXIsIGRhdl9jZGF0YV9oYW5kbGVyKTsKLQotICAgIGlmIChhcF9zaG91bGRfY2xpZW50X2Jsb2NrKHIpKSB7Ci0JbG9uZyBsZW47Ci0JY2hhciAqYnVmZmVyOwotCWNoYXIgZW5kOwotCWludCBydjsKLQlzaXplX3QgdG90YWxfcmVhZCA9IDA7Ci0Jc2l6ZV90IGxpbWl0X3htbF9ib2R5ID0gZGF2X2dldF9saW1pdF94bWxfYm9keShyKTsKLQotCS8qIGFsbG9jYXRlIG91ciB3b3JraW5nIGJ1ZmZlciAqLwotCWJ1ZmZlciA9IGFwX3BhbGxvYyhyLT5wb29sLCBEQVZfUkVBRF9CTE9DS1NJWkUpOwotCi0JLyogcmVhZCB0aGUgYm9keSwgc3R1ZmZpbmcgaXQgaW50byB0aGUgcGFyc2VyICovCi0Jd2hpbGUgKChsZW4gPSBhcF9nZXRfY2xpZW50X2Jsb2NrKHIsIGJ1ZmZlciwgREFWX1JFQURfQkxPQ0tTSVpFKSkgPiAwKSB7Ci0JICAgIHRvdGFsX3JlYWQgKz0gbGVuOwotCSAgICBpZiAobGltaXRfeG1sX2JvZHkgJiYgdG90YWxfcmVhZCA+IGxpbWl0X3htbF9ib2R5KSB7Ci0JCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0VSUiwgciwKLQkJCSAgICAgICJYTUwgcmVxdWVzdCBib2R5IGlzIGxhcmdlciB0aGFuIHRoZSBjb25maWd1cmVkICIKLQkJCSAgICAgICJsaW1pdCBvZiAlbHUiLCAodW5zaWduZWQgbG9uZylsaW1pdF94bWxfYm9keSk7Ci0JCWdvdG8gcmVhZF9lcnJvcjsKLQkgICAgfQotCi0JICAgIHJ2ID0gWE1MX1BhcnNlKHBhcnNlciwgYnVmZmVyLCBsZW4sIDApOwotCSAgICBpZiAocnYgPT0gMCkKLQkJZ290byBwYXJzZXJfZXJyb3I7Ci0JfQotCWlmIChsZW4gPT0gLTEpIHsKLQkgICAgLyogYXBfZ2V0X2NsaWVudF9ibG9jaygpIGhhcyBsb2dnZWQgYW4gZXJyb3IgKi8KLQkgICAgZ290byByZWFkX2Vycm9yOwotCX0KLQotCS8qIHRlbGwgdGhlIHBhcnNlciB0aGF0IHdlJ3JlIGRvbmUgKi8KLQlydiA9IFhNTF9QYXJzZShwYXJzZXIsICZlbmQsIDAsIDEpOwotCWlmIChydiA9PSAwKQotCSAgICBnb3RvIHBhcnNlcl9lcnJvcjsKLSAgICB9Ci0KLSAgICBYTUxfUGFyc2VyRnJlZShwYXJzZXIpOwotCi0gICAgaWYgKGN0eC5lcnJvcikgewotCXN3aXRjaCAoY3R4LmVycm9yKSB7Ci0JY2FzZSBEQVZfTlNfRVJST1JfVU5LTk9XTl9QUkVGSVg6Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSIHwgQVBMT0dfTk9FUlJOTywgciwKLQkJCSAgIkFuIHVuZGVmaW5lZCBuYW1lc3BhY2UgcHJlZml4IHdhcyB1c2VkLiIpOwotCSAgICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSIHwgQVBMT0dfTk9FUlJOTywgciwKLQkJCSAgIlRoZXJlIHdhcyBhbiBlcnJvciB3aXRoaW4gdGhlIFhNTCByZXF1ZXN0IGJvZHkuIik7Ci0JICAgIGJyZWFrOwotCX0KLQotCS8qIEFwYWNoZSB3aWxsIHN1cHBseSBhIGRlZmF1bHQgZXJyb3IsIHBsdXMgdGhlIGVycm9yIGxvZyBhYm92ZS4gKi8KLQlyZXR1cm4gSFRUUF9CQURfUkVRVUVTVDsKLSAgICB9Ci0KLSAgICAvKiAjIyMgYXNzZXJ0OiBjdHguY3VyX2VsZW0gPT0gTlVMTCAqLwotCi0gICAgKnBkb2MgPSBjdHguZG9jOwotCi0gICAgcmV0dXJuIE9LOwotCi0gIHBhcnNlcl9lcnJvcjoKLSAgICB7Ci0JZW51bSBYTUxfRXJyb3IgZXJyID0gWE1MX0dldEVycm9yQ29kZShwYXJzZXIpOwotCi0JLyogIyMjIGZpeCB0aGlzIGVycm9yIG1lc3NhZ2UgKGRlZmF1bHQgdnMgc3BlY2lhbCkgKi8KLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiB8IEFQTE9HX05PRVJSTk8sIHIsCi0JCSAgICAgICJYTUwgcGFyc2VyIGVycm9yIGNvZGU6ICVzICglZCkuIiwKLQkJICAgICAgWE1MX0Vycm9yU3RyaW5nKGVyciksIGVycik7Ci0KLQlYTUxfUGFyc2VyRnJlZShwYXJzZXIpOwotCi0JLyogQXBhY2hlIHdpbGwgc3VwcGx5IGEgZGVmYXVsdCBlcnJvciwgcGx1cyB0aGUgZXJyb3IgbG9nIGFib3ZlLiAqLwotCXJldHVybiBIVFRQX0JBRF9SRVFVRVNUOwotICAgIH0KLQotICByZWFkX2Vycm9yOgotICAgIFhNTF9QYXJzZXJGcmVlKHBhcnNlcik7Ci0KLSAgICAvKiBBcGFjaGUgd2lsbCBzdXBwbHkgYSBkZWZhdWx0IGVycm9yLCBwbHVzIHdoYXRldmVyIHdhcyBsb2dnZWQuICovCi0gICAgcmV0dXJuIEhUVFBfQkFEX1JFUVVFU1Q7Ci19CmRpZmYgLS1naXQgYS9zZXJ2ZXIvdmhvc3QuYyBiL3NlcnZlci92aG9zdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTMwNDhmLi4wMDAwMDAwCi0tLSBhL3NlcnZlci92aG9zdC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTE3ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIGh0dHBfdmhvc3QuYzogZnVuY3Rpb25zIHBlcnRhaW5pbmcgdG8gdmlydHVhbCBob3N0IGFkZHJlc3NlcwotICoJKGNvbmZpZ3VyYXRpb24gYW5kIHJ1bi10aW1lKQotICovCi0KLSNkZWZpbmUgQ09SRV9QUklWQVRFCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfY29uZl9nbG9iYWxzLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX3Zob3N0LmgiCi0jaW5jbHVkZSAiaHR0cF9wcm90b2NvbC5oIgotCi0vKgotICogQWZ0ZXIgYWxsIHRoZSBkZWZpbml0aW9ucyB0aGVyZSdzIGFuIGV4cGxhbmF0aW9uIG9mIGhvdyBpdCdzIGFsbCBwdXQKLSAqIHRvZ2V0aGVyLgotICovCi0KLS8qIG1ldGEtbGlzdCBvZiBuYW1lLXZob3N0cy4gIEVhY2ggc2VydmVyX3JlYyBjYW4gYmUgaW4gcG9zc2libHkgbXVsdGlwbGUKLSAqIGxpc3RzIG9mIG5hbWUtdmhvc3RzLgotICovCi10eXBlZGVmIHN0cnVjdCBuYW1lX2NoYWluIG5hbWVfY2hhaW47Ci1zdHJ1Y3QgbmFtZV9jaGFpbiB7Ci0gICAgbmFtZV9jaGFpbiAqbmV4dDsKLSAgICBzZXJ2ZXJfYWRkcl9yZWMgKnNhcjsJLyogdGhlIHJlY29yZCBjYXVzaW5nIGl0IHRvIGJlIGluCi0JCQkJICogdGhpcyBjaGFpbiAobmVlZGVkIGZvciBwb3J0IGNvbXBhcmlzb25zKSAqLwotICAgIHNlcnZlcl9yZWMgKnNlcnZlcjsJCS8qIHRoZSBzZXJ2ZXIgdG8gdXNlIG9uIGEgbWF0Y2ggKi8KLX07Ci0KLS8qIG1ldGEtbGlzdCBvZiBpcCBhZGRyZXNzZXMuICBFYWNoIHNlcnZlcl9yZWMgY2FuIGJlIGluIHBvc3NpYmx5IG11bHRpcGxlCi0gKiBoYXNoIGNoYWlucyBzaW5jZSBpdCBjYW4gaGF2ZSBtdWx0aXBsZSBpcHMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IGlwYWRkcl9jaGFpbiBpcGFkZHJfY2hhaW47Ci1zdHJ1Y3QgaXBhZGRyX2NoYWluIHsKLSAgICBpcGFkZHJfY2hhaW4gKm5leHQ7Ci0gICAgc2VydmVyX2FkZHJfcmVjICpzYXI7CS8qIHRoZSByZWNvcmQgY2F1c2luZyBpdCB0byBiZSBpbgotCQkJCSAqIHRoaXMgY2hhaW4gKG5lZWQgZm9yIGJvdGggaXAgYWRkciBhbmQgcG9ydAotCQkJCSAqIGNvbXBhcmlzb25zKSAqLwotICAgIHNlcnZlcl9yZWMgKnNlcnZlcjsJCS8qIHRoZSBzZXJ2ZXIgdG8gdXNlIGlmIHRoaXMgbWF0Y2hlcyAqLwotICAgIG5hbWVfY2hhaW4gKm5hbWVzOwkJLyogaWYgbm9uLU5VTEwgdGhlbiBhIGxpc3Qgb2YgbmFtZS12aG9zdHMKLSAgICAJCQkJICogc2hhcmluZyB0aGlzIGFkZHJlc3MgKi8KLX07Ci0KLS8qIFRoaXMgZGVmaW5lcyB0aGUgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSB1c2VkIGZvciBoYXNoaW5nIGlwIGFkZHJlc3NlcwotICogb2YgdmlydHVhbCBob3N0cy4gIEl0IG11c3QgYmUgYSBwb3dlciBvZiB0d28uCi0gKi8KLSNpZm5kZWYgSVBIQVNIX1RBQkxFX1NJWkUKLSNkZWZpbmUgSVBIQVNIX1RBQkxFX1NJWkUgMjU2Ci0jZW5kaWYKLQotLyogQSAobikgYnVja2V0IGhhc2ggdGFibGUsIGVhY2ggZW50cnkgaGFzIGEgcG9pbnRlciB0byBhIHNlcnZlciByZWMgYW5kCi0gKiBhIHBvaW50ZXIgdG8gdGhlIG90aGVyIGVudHJpZXMgaW4gdGhhdCBidWNrZXQuICBFYWNoIGluZGl2aWR1YWwgYWRkcmVzcywKLSAqIGV2ZW4gZm9yIHZpcnR1YWxob3N0cyB3aXRoIG11bHRpcGxlIGFkZHJlc3NlcywgaGFzIGFuIGVudHJ5IGluIHRoaXMgaGFzaAotICogdGFibGUuICBUaGVyZSBhcmUgZXh0cmEgYnVja2V0cyBmb3IgX2RlZmF1bHRfLCBhbmQgbmFtZS12aG9zdCBlbnRyaWVzLgotICoKLSAqIE5vdGUgdGhhdCBhZnRlciBjb25maWcgdGltZSB0aGlzIGlzIGNvbnN0YW50LCBzbyBpdCBpcyB0aHJlYWQtc2FmZS4KLSAqLwotc3RhdGljIGlwYWRkcl9jaGFpbiAqaXBoYXNoX3RhYmxlW0lQSEFTSF9UQUJMRV9TSVpFXTsKLQotLyogZHVtcCBvdXQgc3RhdGlzdGljcyBhYm91dCB0aGUgaGFzaCBmdW5jdGlvbiAqLwotLyogI2RlZmluZSBJUEhBU0hfU1RBVElTVElDUyAqLwotCi0vKiBsaXN0IG9mIHRoZSBfZGVmYXVsdF8gc2VydmVycyAqLwotc3RhdGljIGlwYWRkcl9jaGFpbiAqZGVmYXVsdF9saXN0OwotCi0vKiBsaXN0IG9mIHRoZSBOYW1lVmlydHVhbEhvc3QgYWRkcmVzc2VzICovCi1zdGF0aWMgc2VydmVyX2FkZHJfcmVjICpuYW1lX3Zob3N0X2xpc3Q7Ci1zdGF0aWMgc2VydmVyX2FkZHJfcmVjICoqbmFtZV92aG9zdF9saXN0X3RhaWw7Ci0KLS8qCi0gKiBIb3cgaXQncyB1c2VkOgotICoKLSAqIFRoZSBpcCBhZGRyZXNzIGRldGVybWluZXMgd2hpY2ggY2hhaW4gaW4gaXBoYXNoX3RhYmxlIGlzIGludGVyZXN0aW5nLCB0aGVuCi0gKiBhIGNvbXBhcmlzb24gaXMgZG9uZSBkb3duIHRoYXQgY2hhaW4gdG8gZmluZCB0aGUgZmlyc3QgaXBhZGRyX2NoYWluIHdob3NlCi0gKiBzYXIgbWF0Y2hlcyB0aGUgYWRkcmVzczpwb3J0IHBhaXIuCi0gKgotICogSWYgdGhhdCBpcGFkZHJfY2hhaW4gaGFzIG5hbWVzID09IE5VTEwgdGhlbiB5b3UncmUgZG9uZSwgaXQncyBhbiBpcC12aG9zdC4KLSAqCi0gKiBPdGhlcndpc2UgaXQncyBhIG5hbWUtdmhvc3QgbGlzdCwgYW5kIHRoZSBkZWZhdWx0IGlzIHRoZSBzZXJ2ZXIgaW4gdGhlCi0gKiBpcGFkZHJfY2hhaW4gcmVjb3JkLiAgV2UgdHVjayBhd2F5IHRoZSBpcGFkZHJfY2hhaW4gcmVjb3JkIGluIHRoZQotICogY29ubl9yZWMgZmllbGQgdmhvc3RfbG9va3VwX2RhdGEuICBMYXRlciBvbiBhZnRlciB0aGUgaGVhZGVycyB3ZSBnZXQgYQotICogc2Vjb25kIGNoYW5jZSwgYW5kIHdlIHVzZSB0aGUgbmFtZV9jaGFpbiB0byBmaWd1cmUgb3V0IHdoYXQgbmFtZS12aG9zdAotICogbWF0Y2hlcyB0aGUgaGVhZGVycy4KLSAqCi0gKiBJZiB0aGVyZSB3YXMgbm8gaXAgYWRkcmVzcyBtYXRjaCBpbiB0aGUgaXBoYXNoX3RhYmxlIHRoZW4gZG8gYSBsb29rdXAKLSAqIGluIHRoZSBkZWZhdWx0X2xpc3QuCi0gKgotICogSG93IGl0J3MgcHV0IHRvZ2V0aGVyIC4uLiB3ZWxsIHlvdSBzaG91bGQgYmUgYWJsZSB0byBmaWd1cmUgdGhhdCBvdXQKLSAqIGZyb20gaG93IGl0J3MgdXNlZC4gIE9yIHNvbWV0aGluZyBsaWtlIHRoYXQuCi0gKi8KLQotCi0vKiBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY29uZmlnICovCi12b2lkIGFwX2luaXRfdmhvc3RfY29uZmlnKHBvb2wgKnApCi17Ci0gICAgbWVtc2V0KGlwaGFzaF90YWJsZSwgMCwgc2l6ZW9mKGlwaGFzaF90YWJsZSkpOwotICAgIGRlZmF1bHRfbGlzdCA9IE5VTEw7Ci0gICAgbmFtZV92aG9zdF9saXN0ID0gTlVMTDsKLSAgICBuYW1lX3Zob3N0X2xpc3RfdGFpbCA9ICZuYW1lX3Zob3N0X2xpc3Q7Ci19Ci0KLQotLyoKLSAqIFBhcnNlcyBhIGhvc3Qgb2YgdGhlIGZvcm0gPGFkZHJlc3M+Wzpwb3J0XQotICogcGFkZHIgaXMgdXNlZCB0byBjcmVhdGUgYSBsaXN0IGluIHRoZSBvcmRlciBvZiBpbnB1dAotICogKipwYWRkciBpcyB0aGUgLT5uZXh0IHBvaW50ZXIgb2YgdGhlIGxhc3QgZW50cnkgKG9yIHMtPmFkZHJzKQotICogKnBhZGRyIGlzIHRoZSB2YXJpYWJsZSB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgKipwYWRkciBiZXR3ZWVuIGNhbGxzCi0gKiBwb3J0IGlzIHRoZSBkZWZhdWx0IHBvcnQgdG8gYXNzdW1lCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpnZXRfYWRkcmVzc2VzKHBvb2wgKnAsIGNoYXIgKncsIHNlcnZlcl9hZGRyX3JlYyAqKipwYWRkciwKLQkJCSAgICB1bnNpZ25lZCBwb3J0KQotewotICAgIHN0cnVjdCBob3N0ZW50ICpoZXA7Ci0gICAgdW5zaWduZWQgbG9uZyBteV9hZGRyOwotICAgIHNlcnZlcl9hZGRyX3JlYyAqc2FyOwotICAgIGNoYXIgKnQ7Ci0gICAgaW50IGksIGlzX2FuX2lwX2FkZHI7Ci0KLSAgICBpZiAoKncgPT0gMCkKLQlyZXR1cm4gTlVMTDsKLQotICAgIHQgPSBzdHJjaHIodywgJzonKTsKLSAgICBpZiAodCkgewotCWlmIChzdHJjbXAodCArIDEsICIqIikgPT0gMCkgewotCSAgICBwb3J0ID0gMDsKLQl9Ci0JZWxzZSBpZiAoKGkgPSBhdG9pKHQgKyAxKSkpIHsKLQkgICAgcG9ydCA9IGk7Ci0JfQotCWVsc2UgewotCSAgICByZXR1cm4gIjpwb3J0IG11c3QgYmUgbnVtZXJpYyI7Ci0JfQotCSp0ID0gMDsKLSAgICB9Ci0KLSAgICBpc19hbl9pcF9hZGRyID0gMDsKLSAgICBpZiAoc3RyY21wKHcsICIqIikgPT0gMCkgewotCW15X2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKLQlpc19hbl9pcF9hZGRyID0gMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh3LCAiX2RlZmF1bHRfIikgPT0gMAotCSAgICAgfHwgc3RyY21wKHcsICIyNTUuMjU1LjI1NS4yNTUiKSA9PSAwKSB7Ci0JbXlfYWRkciA9IERFRkFVTFRfVkhPU1RfQUREUjsKLQlpc19hbl9pcF9hZGRyID0gMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKG15X2FkZHIgPSBhcF9pbmV0X2FkZHIodykpICE9IElOQUREUl9OT05FKSB7Ci0JaXNfYW5faXBfYWRkciA9IDE7Ci0gICAgfQotICAgIGlmIChpc19hbl9pcF9hZGRyKSB7Ci0Jc2FyID0gYXBfcGNhbGxvYyhwLCBzaXplb2Yoc2VydmVyX2FkZHJfcmVjKSk7Ci0JKipwYWRkciA9IHNhcjsKLQkqcGFkZHIgPSAmc2FyLT5uZXh0OwotCXNhci0+aG9zdF9hZGRyLnNfYWRkciA9IG15X2FkZHI7Ci0Jc2FyLT5ob3N0X3BvcnQgPSBwb3J0OwotCXNhci0+dmlydGhvc3QgPSBhcF9wc3RyZHVwKHAsIHcpOwotCWlmICh0ICE9IE5VTEwpCi0JICAgICp0ID0gJzonOwotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGhlcCA9IGdldGhvc3RieW5hbWUodyk7Ci0KLSAgICBpZiAoKCFoZXApIHx8IChoZXAtPmhfYWRkcnR5cGUgIT0gQUZfSU5FVCB8fCAhaGVwLT5oX2FkZHJfbGlzdFswXSkpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIE5VTEwsCi0JICAgICJDYW5ub3QgcmVzb2x2ZSBob3N0IG5hbWUgJXMgLS0tIGlnbm9yaW5nISIsIHcpOwotCWlmICh0ICE9IE5VTEwpCi0JICAgICp0ID0gJzonOwotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGhlcC0+aF9hZGRyX2xpc3RbaV07ICsraSkgewotCXNhciA9IGFwX3BjYWxsb2MocCwgc2l6ZW9mKHNlcnZlcl9hZGRyX3JlYykpOwotCSoqcGFkZHIgPSBzYXI7Ci0JKnBhZGRyID0gJnNhci0+bmV4dDsKLQlzYXItPmhvc3RfYWRkciA9ICooc3RydWN0IGluX2FkZHIgKikgaGVwLT5oX2FkZHJfbGlzdFtpXTsKLQlzYXItPmhvc3RfcG9ydCA9IHBvcnQ7Ci0Jc2FyLT52aXJ0aG9zdCA9IGFwX3BzdHJkdXAocCwgdyk7Ci0gICAgfQotCi0gICAgaWYgKHQgIT0gTlVMTCkKLQkqdCA9ICc6JzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCi0vKiBwYXJzZSB0aGUgPFZpcnR1YWxIb3N0PiBhZGRyZXNzZXMgKi8KLWNvbnN0IGNoYXIgKmFwX3BhcnNlX3Zob3N0X2FkZHJzKHBvb2wgKnAsIGNvbnN0IGNoYXIgKmhvc3RuYW1lLCBzZXJ2ZXJfcmVjICpzKQotewotICAgIHNlcnZlcl9hZGRyX3JlYyAqKmFkZHJzOwotICAgIGNvbnN0IGNoYXIgKmVycjsKLQotICAgIC8qIHN0YXJ0IHRoZSBsaXN0IG9mIGFkZHJlc2VzICovCi0gICAgYWRkcnMgPSAmcy0+YWRkcnM7Ci0gICAgd2hpbGUgKGhvc3RuYW1lWzBdKSB7Ci0JZXJyID0gZ2V0X2FkZHJlc3NlcyhwLCBhcF9nZXR3b3JkX2NvbmYocCwgJmhvc3RuYW1lKSwgJmFkZHJzLCBzLT5wb3J0KTsKLQlpZiAoZXJyKSB7Ci0JICAgICphZGRycyA9IE5VTEw7Ci0JICAgIHJldHVybiBlcnI7Ci0JfQotICAgIH0KLSAgICAvKiB0ZXJtaW5hdGUgdGhlIGxpc3QgKi8KLSAgICAqYWRkcnMgPSBOVUxMOwotICAgIGlmIChzLT5hZGRycykgewotCWlmIChzLT5hZGRycy0+aG9zdF9wb3J0KSB7Ci0JICAgIC8qIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHBvcnQgd2hpY2ggaXMgaW5oZXJpdGVkIGZyb20gbWFpbl9zZXJ2ZXIgKi8KLQkgICAgcy0+cG9ydCA9IHMtPmFkZHJzLT5ob3N0X3BvcnQ7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCi1jb25zdCBjaGFyICphcF9zZXRfbmFtZV92aXJ0dWFsX2hvc3QgKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIC8qIHVzZSB3aGF0ZXZlciBwb3J0IHRoZSBtYWluIHNlcnZlciBoYXMgYXQgdGhpcyBwb2ludCAqLwotICAgIHJldHVybiBnZXRfYWRkcmVzc2VzKGNtZC0+cG9vbCwgYXJnLCAmbmFtZV92aG9zdF9saXN0X3RhaWwsCi0JCQkgICAgY21kLT5zZXJ2ZXItPnBvcnQpOwotfQotCi0KLS8qIGhhc2ggdGFibGUgc3RhdGlzdGljcywga2VlcCB0aGlzIGluIGhlcmUgZm9yIHRoZSBiZXRhIHBlcmlvZCBzbwotICogd2UgY2FuIGZpbmQgb3V0IGlmIHRoZSBoYXNoIGZ1bmN0aW9uIGlzIG9rCi0gKi8KLSNpZmRlZiBJUEhBU0hfU1RBVElTVElDUwotc3RhdGljIGludCBpcGhhc2hfY29tcGFyZShjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQotewotICAgIHJldHVybiAoKihjb25zdCBpbnQgKikgYiAtICooY29uc3QgaW50ICopIGEpOwotfQotCi0KLXN0YXRpYyB2b2lkIGR1bXBfaXBoYXNoX3N0YXRpc3RpY3Moc2VydmVyX3JlYyAqbWFpbl9zKQotewotICAgIHVuc2lnbmVkIGNvdW50W0lQSEFTSF9UQUJMRV9TSVpFXTsKLSAgICBpbnQgaTsKLSAgICBpcGFkZHJfY2hhaW4gKnNyYzsKLSAgICB1bnNpZ25lZCB0b3RhbDsKLSAgICBjaGFyIGJ1ZltIVUdFX1NUUklOR19MRU5dOwotICAgIGNoYXIgKnA7Ci0KLSAgICB0b3RhbCA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IElQSEFTSF9UQUJMRV9TSVpFOyArK2kpIHsKLQljb3VudFtpXSA9IDA7Ci0JZm9yIChzcmMgPSBpcGhhc2hfdGFibGVbaV07IHNyYzsgc3JjID0gc3JjLT5uZXh0KSB7Ci0JICAgICsrY291bnRbaV07Ci0JICAgIGlmIChpIDwgSVBIQVNIX1RBQkxFX1NJWkUpIHsKLQkJLyogZG9uJ3QgY291bnQgdGhlIHNsb3AgYnVja2V0cyBpbiB0aGUgdG90YWwgKi8KLQkJKyt0b3RhbDsKLQkgICAgfQotCX0KLSAgICB9Ci0gICAgcXNvcnQoY291bnQsIElQSEFTSF9UQUJMRV9TSVpFLCBzaXplb2YoY291bnRbMF0pLCBpcGhhc2hfY29tcGFyZSk7Ci0gICAgcCA9IGJ1ZiArIGFwX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCSAgICAiaXBoYXNoOiB0b3RhbCBoYXNoZWQgPSAldSwgYXZnIGNoYWluID0gJXUsICIKLQkJICAgICJjaGFpbiBsZW5ndGhzIChjb3VudCB4IGxlbik6IiwKLQkJICAgIHRvdGFsLCB0b3RhbCAvIElQSEFTSF9UQUJMRV9TSVpFKTsKLSAgICB0b3RhbCA9IDE7Ci0gICAgZm9yIChpID0gMTsgaSA8IElQSEFTSF9UQUJMRV9TSVpFOyArK2kpIHsKLQlpZiAoY291bnRbaSAtIDFdICE9IGNvdW50W2ldKSB7Ci0JICAgIHAgKz0gYXBfc25wcmludGYocCwgc2l6ZW9mKGJ1ZikgLSAocCAtIGJ1ZiksICIgJXV4JXUiLAotCQkJICAgICB0b3RhbCwgY291bnRbaSAtIDFdKTsKLQkgICAgdG90YWwgPSAxOwotCX0KLQllbHNlIHsKLQkgICAgKyt0b3RhbDsKLQl9Ci0gICAgfQotICAgIHAgKz0gYXBfc25wcmludGYocCwgc2l6ZW9mKGJ1ZikgLSAocCAtIGJ1ZiksICIgJXV4JXUiLAotCQkgICAgIHRvdGFsLCBjb3VudFtJUEhBU0hfVEFCTEVfU0laRSAtIDFdKTsKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19ERUJVRywgbWFpbl9zLCBidWYpOwotfQotI2VuZGlmCi0KLQotLyogVGhpcyBoYXNoaW5nIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGdldCBnb29kIGRpc3RyaWJ1dGlvbiBpbiB0aGUgY2FzZXMKLSAqIHdoZXJlIHRoZSBzZXJ2ZXIgaXMgaGFuZGxpbmcgZW50aXJlICJuZXR3b3JrcyIgb2Ygc2VydmVycy4gIGkuZS4gYQotICogd2hhY2sgb2YgLzI0cy4gIFRoaXMgaXMgcHJvYmFibHkgdGhlIG1vc3QgY29tbW9uIGNvbmZpZ3VyYXRpb24gZm9yCi0gKiBJU1BzIHdpdGggbGFyZ2UgdmlydHVhbCBzZXJ2ZXJzLgotICoKLSAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgc3ltbWV0cmljIChpLmUuIGNvbGxhcHNlcyBhbGwgNCBvY3RldHMKLSAqIGludG8gb25lKSwgc28gbWFjaGluZSBieXRlIG9yZGVyIChiaWcvbGl0dGxlIGVuZGlhbm5lc3MpIGRvZXMgbm90IG1hdHRlci4KLSAqCi0gKiBIYXNoIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IERhdmlkIEhhbmtpbnMuCi0gKi8KLXN0YXRpYyBhcF9pbmxpbmUgdW5zaWduZWQgaGFzaF9pbmFkZHIodW5zaWduZWQga2V5KQotewotICAgIGtleSBePSAoa2V5ID4+IDE2KTsKLSAgICByZXR1cm4gKChrZXkgPj4gOCkgXiBrZXkpICUgSVBIQVNIX1RBQkxFX1NJWkU7Ci19Ci0KLQotCi1zdGF0aWMgaXBhZGRyX2NoYWluICpuZXdfaXBhZGRyX2NoYWluKHBvb2wgKnAsCi0JCQkJICAgIHNlcnZlcl9yZWMgKnMsIHNlcnZlcl9hZGRyX3JlYyAqc2FyKQotewotICAgIGlwYWRkcl9jaGFpbiAqbmV3OwotCi0gICAgbmV3ID0gYXBfcGFsbG9jKHAsIHNpemVvZigqbmV3KSk7Ci0gICAgbmV3LT5uYW1lcyA9IE5VTEw7Ci0gICAgbmV3LT5zZXJ2ZXIgPSBzOwotICAgIG5ldy0+c2FyID0gc2FyOwotICAgIG5ldy0+bmV4dCA9IE5VTEw7Ci0gICAgcmV0dXJuIG5ldzsKLX0KLQotCi1zdGF0aWMgbmFtZV9jaGFpbiAqbmV3X25hbWVfY2hhaW4ocG9vbCAqcCwgc2VydmVyX3JlYyAqcywgc2VydmVyX2FkZHJfcmVjICpzYXIpCi17Ci0gICAgbmFtZV9jaGFpbiAqbmV3OwotCi0gICAgbmV3ID0gYXBfcGFsbG9jKHAsIHNpemVvZigqbmV3KSk7Ci0gICAgbmV3LT5zZXJ2ZXIgPSBzOwotICAgIG5ldy0+c2FyID0gc2FyOwotICAgIG5ldy0+bmV4dCA9IE5VTEw7Ci0gICAgcmV0dXJuIG5ldzsKLX0KLQotCi1zdGF0aWMgYXBfaW5saW5lIGlwYWRkcl9jaGFpbiAqZmluZF9pcGFkZHIoc3RydWN0IGluX2FkZHIgKnNlcnZlcl9pcCwKLSAgICB1bnNpZ25lZCBwb3J0KQotewotICAgIHVuc2lnbmVkIGJ1Y2tldDsKLSAgICBpcGFkZHJfY2hhaW4gKnRyYXY7Ci0gICAgdW5zaWduZWQgYWRkcjsKLQotICAgIC8qIHNjYW4gdGhlIGhhc2ggdGFibGUgZm9yIGFuIGV4YWN0IG1hdGNoIGZpcnN0ICovCi0gICAgYWRkciA9IHNlcnZlcl9pcC0+c19hZGRyOwotICAgIGJ1Y2tldCA9IGhhc2hfaW5hZGRyKGFkZHIpOwotICAgIGZvciAodHJhdiA9IGlwaGFzaF90YWJsZVtidWNrZXRdOyB0cmF2OyB0cmF2ID0gdHJhdi0+bmV4dCkgewotCXNlcnZlcl9hZGRyX3JlYyAqc2FyID0gdHJhdi0+c2FyOwotCWlmICgoc2FyLT5ob3N0X2FkZHIuc19hZGRyID09IGFkZHIpCi0JICAgICYmIChzYXItPmhvc3RfcG9ydCA9PSAwIHx8IHNhci0+aG9zdF9wb3J0ID09IHBvcnQKLQkJfHwgcG9ydCA9PSAwKSkgewotCSAgICByZXR1cm4gdHJhdjsKLQl9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi0KLXN0YXRpYyBpcGFkZHJfY2hhaW4gKmZpbmRfZGVmYXVsdF9zZXJ2ZXIodW5zaWduZWQgcG9ydCkKLXsKLSAgICBzZXJ2ZXJfYWRkcl9yZWMgKnNhcjsKLSAgICBpcGFkZHJfY2hhaW4gKnRyYXY7Ci0KLSAgICBmb3IgKHRyYXYgPSBkZWZhdWx0X2xpc3Q7IHRyYXY7IHRyYXYgPSB0cmF2LT5uZXh0KSB7Ci0gICAgICAgIHNhciA9IHRyYXYtPnNhcjsKLSAgICAgICAgaWYgKHNhci0+aG9zdF9wb3J0ID09IDAgfHwgc2FyLT5ob3N0X3BvcnQgPT0gcG9ydCkgewotICAgICAgICAgICAgLyogbWF0Y2ghICovCi0JICAgIHJldHVybiB0cmF2OwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi0KLXN0YXRpYyB2b2lkIGR1bXBfdmhvc3RfY29uZmlnKEZJTEUgKmYpCi17Ci0gICAgaW50IGk7Ci0gICAgaXBhZGRyX2NoYWluICppYzsKLSAgICBuYW1lX2NoYWluICpuYzsKLSAgICBjaGFyIGJ1ZltNQVhfU1RSSU5HX0xFTl07Ci0KLSAgICBmcHJpbnRmKGYsICJWaXJ0dWFsSG9zdCBjb25maWd1cmF0aW9uOlxuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IElQSEFTSF9UQUJMRV9TSVpFOyArK2kpIHsKLQlmb3IgKGljID0gaXBoYXNoX3RhYmxlW2ldOyBpYzsgaWMgPSBpYy0+bmV4dCkgewotCSAgICBpZiAoaWMtPnNhci0+aG9zdF9wb3J0ID09IDApIHsKLQkJYXBfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVwQToqIiwgJmljLT5zYXItPmhvc3RfYWRkcik7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCWFwX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcEE6JXUiLCAmaWMtPnNhci0+aG9zdF9hZGRyLAotCQkgICAgaWMtPnNhci0+aG9zdF9wb3J0KTsKLQkgICAgfQotCSAgICBpZiAoaWMtPm5hbWVzID09IE5VTEwpIHsKLQkJZnByaW50ZihmLCAiJS0yMnMgJXMgKCVzOiV1KVxuIiwgYnVmLAotCQkgICAgaWMtPnNlcnZlci0+c2VydmVyX2hvc3RuYW1lLCBpYy0+c2VydmVyLT5kZWZuX25hbWUsCi0JCSAgICBpYy0+c2VydmVyLT5kZWZuX2xpbmVfbnVtYmVyKTsKLQkJY29udGludWU7Ci0JICAgIH0KLQkgICAgZnByaW50ZihmLCAiJS0yMnMgaXMgYSBOYW1lVmlydHVhbEhvc3RcbiIKLQkgICAgICAgICAgICAgICAiJTIycyBkZWZhdWx0IHNlcnZlciAlcyAoJXM6JXUpXG4iLAotCQkgICAgICAgYnVmLCAiIiwgaWMtPnNlcnZlci0+c2VydmVyX2hvc3RuYW1lLAotCQkgICAgICAgaWMtPnNlcnZlci0+ZGVmbl9uYW1lLCBpYy0+c2VydmVyLT5kZWZuX2xpbmVfbnVtYmVyKTsKLQkgICAgZm9yIChuYyA9IGljLT5uYW1lczsgbmM7IG5jID0gbmMtPm5leHQpIHsKLQkJaWYgKG5jLT5zYXItPmhvc3RfcG9ydCkgewotCQkgICAgZnByaW50ZihmLCAiJTIycyBwb3J0ICV1ICIsICIiLCBuYy0+c2FyLT5ob3N0X3BvcnQpOwotCQl9Ci0JCWVsc2UgewotCQkgICAgZnByaW50ZihmLCAiJTIycyBwb3J0ICogIiwgIiIpOwotCQl9Ci0JCWZwcmludGYoZiwgIm5hbWV2aG9zdCAlcyAoJXM6JXUpXG4iLAotCQkJbmMtPnNlcnZlci0+c2VydmVyX2hvc3RuYW1lLAotCQkJbmMtPnNlcnZlci0+ZGVmbl9uYW1lLAotCQkJbmMtPnNlcnZlci0+ZGVmbl9saW5lX251bWJlcik7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIGlmIChkZWZhdWx0X2xpc3QpIHsKLQlmcHJpbnRmKGYsICJfZGVmYXVsdF8gc2VydmVyczpcbiIpOwotCWZvciAoaWMgPSBkZWZhdWx0X2xpc3Q7IGljOyBpYyA9IGljLT5uZXh0KSB7Ci0JICAgIGlmIChpYy0+c2FyLT5ob3N0X3BvcnQgPT0gMCkgewotCQlmcHJpbnRmKGYsICJwb3J0ICogIik7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCWZwcmludGYoZiwgInBvcnQgJXUgIiwgaWMtPnNhci0+aG9zdF9wb3J0KTsKLQkgICAgfQotCSAgICBmcHJpbnRmKGYsICJzZXJ2ZXIgJXMgKCVzOiV1KVxuIiwKLQkJaWMtPnNlcnZlci0+c2VydmVyX2hvc3RuYW1lLCBpYy0+c2VydmVyLT5kZWZuX25hbWUsCi0JCWljLT5zZXJ2ZXItPmRlZm5fbGluZV9udW1iZXIpOwotCX0KLSAgICB9Ci19Ci0KLS8qIGNvbXBpbGUgdGhlIHRhYmxlcyBhbmQgc3VjaCB3ZSBuZWVkIHRvIGRvIHRoZSBydW4tdGltZSB2aG9zdCBsb29rdXBzICovCi12b2lkIGFwX2Zpbmlfdmhvc3RfY29uZmlnKHBvb2wgKnAsIHNlcnZlcl9yZWMgKm1haW5fcykKLXsKLSAgICBzZXJ2ZXJfYWRkcl9yZWMgKnNhcjsKLSAgICBpbnQgaGFzX2RlZmF1bHRfdmhvc3RfYWRkcjsKLSAgICBzZXJ2ZXJfcmVjICpzOwotICAgIGludCBpOwotICAgIGlwYWRkcl9jaGFpbiAqKmlwaGFzaF90YWJsZV90YWlsW0lQSEFTSF9UQUJMRV9TSVpFXTsKLQotICAgIC8qIHRlcm1pbmF0ZSB0aGUgbmFtZV92aG9zdCBsaXN0ICovCi0gICAgKm5hbWVfdmhvc3RfbGlzdF90YWlsID0gTlVMTDsKLQotICAgIC8qIE1haW4gaG9zdCBmaXJzdCAqLwotICAgIHMgPSBtYWluX3M7Ci0KLSAgICBpZiAoIXMtPnNlcnZlcl9ob3N0bmFtZSkgewotCXMtPnNlcnZlcl9ob3N0bmFtZSA9IGFwX2dldF9sb2NhbF9ob3N0KHApOwotICAgIH0KLQotICAgIC8qIGluaXRpYWxpemUgdGhlIHRhaWxzICovCi0gICAgZm9yIChpID0gMDsgaSA8IElQSEFTSF9UQUJMRV9TSVpFOyArK2kpIHsKLQlpcGhhc2hfdGFibGVfdGFpbFtpXSA9ICZpcGhhc2hfdGFibGVbaV07Ci0gICAgfQotCi0gICAgLyogVGhlIGZpcnN0IHRoaW5ncyB0byBnbyBpbnRvIHRoZSBoYXNoIHRhYmxlIGFyZSB0aGUgTmFtZVZpcnR1YWxIb3N0cwotICAgICAqIFNpbmNlIG5hbWVfdmhvc3RfbGlzdCBpcyBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IHRoZSBkaXJlY3RpdmVzCi0gICAgICogb2NjdXJlZCBpbiB0aGUgY29uZmlnIGZpbGUsIHdlJ2xsIGNvcHkgaXQgaW4gdGhhdCBvcmRlci4KLSAgICAgKi8KLSAgICBmb3IgKHNhciA9IG5hbWVfdmhvc3RfbGlzdDsgc2FyOyBzYXIgPSBzYXItPm5leHQpIHsKLQl1bnNpZ25lZCBidWNrZXQgPSBoYXNoX2luYWRkcihzYXItPmhvc3RfYWRkci5zX2FkZHIpOwotCWlwYWRkcl9jaGFpbiAqbmV3ID0gbmV3X2lwYWRkcl9jaGFpbihwLCBOVUxMLCBzYXIpOwotCi0JKmlwaGFzaF90YWJsZV90YWlsW2J1Y2tldF0gPSBuZXc7Ci0JaXBoYXNoX3RhYmxlX3RhaWxbYnVja2V0XSA9ICZuZXctPm5leHQ7Ci0KLQkvKiBOb3RpY2UgdGhhdCB3aGF0IHdlJ3ZlIGRvbmUgaXMgaW5zZXJ0IGFuIGlwYWRkcl9jaGFpbiB3aXRoCi0JICogYm90aCBzZXJ2ZXIgYW5kIG5hbWVzIE5VTEwuICBSZW1lbWJlciB0aGF0LgotCSAqLwotICAgIH0KLQotICAgIC8qIFRoZSBuZXh0IHRoaW5ncyB0byBnbyBpbnRvIHRoZSBoYXNoIHRhYmxlIGFyZSB0aGUgdmlydHVhbCBob3N0cwotICAgICAqIHRoZW1zZWx2ZXMuICBUaGV5J3JlIGxpc3RlZCBvZmYgb2YgbWFpbl9zLT5uZXh0IGluIHRoZSByZXZlcnNlCi0gICAgICogb3JkZXIgdGhleSBvY2N1cmVkIGluIHRoZSBjb25maWcgZmlsZSwgc28gd2UgaW5zZXJ0IHRoZW0gYXQKLSAgICAgKiB0aGUgaXBoYXNoX3RhYmxlX3RhaWwgYnV0IGRvbid0IGFkdmFuY2UgdGhlIHRhaWwuCi0gICAgICovCi0KLSAgICBmb3IgKHMgPSBtYWluX3MtPm5leHQ7IHM7IHMgPSBzLT5uZXh0KSB7Ci0JaGFzX2RlZmF1bHRfdmhvc3RfYWRkciA9IDA7Ci0JZm9yIChzYXIgPSBzLT5hZGRyczsgc2FyOyBzYXIgPSBzYXItPm5leHQpIHsKLQkgICAgaXBhZGRyX2NoYWluICppYzsKLQotCSAgICBpZiAoc2FyLT5ob3N0X2FkZHIuc19hZGRyID09IERFRkFVTFRfVkhPU1RfQUREUgotCQl8fCBzYXItPmhvc3RfYWRkci5zX2FkZHIgPT0gSU5BRERSX0FOWSkgewotCQkvKiBhZGQgaXQgdG8gZGVmYXVsdCBidWNrZXQgZm9yIGVhY2ggYXBwcm9wcmlhdGUgc2FyCi0JCSAqIHNpbmNlIHdlIG5lZWQgdG8gZG8gYSBwb3J0IHRlc3QKLQkJICovCi0JCWlwYWRkcl9jaGFpbiAqb3RoZXI7Ci0KLQkJb3RoZXIgPSBmaW5kX2RlZmF1bHRfc2VydmVyKHNhci0+aG9zdF9wb3J0KTsKLQkJaWYgKG90aGVyICYmIG90aGVyLT5zYXItPmhvc3RfcG9ydCAhPSAwKSB7Ci0JCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLCBtYWluX3MsCi0JCQkgICAgIl9kZWZhdWx0XyBWaXJ0dWFsSG9zdCBvdmVybGFwIG9uIHBvcnQgJXUsIgotCQkJICAgICIgdGhlIGZpcnN0IGhhcyBwcmVjZWRlbmNlIiwgc2FyLT5ob3N0X3BvcnQpOwotCQl9Ci0JCWhhc19kZWZhdWx0X3Zob3N0X2FkZHIgPSAxOwotCQlpYyA9IG5ld19pcGFkZHJfY2hhaW4ocCwgcywgc2FyKTsKLQkJaWMtPm5leHQgPSBkZWZhdWx0X2xpc3Q7Ci0JCWRlZmF1bHRfbGlzdCA9IGljOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQkvKiBzZWUgaWYgaXQgbWF0Y2hlcyBzb21ldGhpbmcgd2UndmUgYWxyZWFkeSBnb3QgKi8KLQkJaWMgPSBmaW5kX2lwYWRkcigmc2FyLT5ob3N0X2FkZHIsIHNhci0+aG9zdF9wb3J0KTsKLQotCQkvKiB0aGUgZmlyc3QgdGltZSB3ZSBlbmNvdW50ZXIgYSBOYW1lVmlydHVhbEhvc3QgYWRkcmVzcwotCQkgKiBpYy0+c2VydmVyIHdpbGwgYmUgTlVMTCwgb24gc3Vic2VxdWVudCBlbmNvdW50ZXJzCi0JCSAqIGljLT5uYW1lcyB3aWxsIGJlIG5vbi1OVUxMLgotCQkgKi8KLQkJaWYgKGljICYmIChpYy0+bmFtZXMgfHwgaWMtPnNlcnZlciA9PSBOVUxMKSkgewotCQkgICAgbmFtZV9jaGFpbiAqbmMgPSBuZXdfbmFtZV9jaGFpbihwLCBzLCBzYXIpOwotCQkgICAgbmMtPm5leHQgPSBpYy0+bmFtZXM7Ci0JCSAgICBpYy0+bmFtZXMgPSBuYzsKLQkJICAgIGljLT5zZXJ2ZXIgPSBzOwotCQkgICAgaWYgKHNhci0+aG9zdF9wb3J0ICE9IGljLT5zYXItPmhvc3RfcG9ydCkgewotCQkJLyogb25lIG9mIHRoZSB0d28gaXMgYSAqIHBvcnQsIHRoZSBvdGhlciBpc24ndCAqLwotCQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCBtYWluX3MsCi0JCQkJIlZpcnR1YWxIb3N0ICVzOiV1IC0tIG1peGluZyAqICIKLQkJCQkicG9ydHMgYW5kIG5vbi0qIHBvcnRzIHdpdGggIgotCQkJCSJhIE5hbWVWaXJ0dWFsSG9zdCBhZGRyZXNzIGlzIG5vdCBzdXBwb3J0ZWQsIgotCQkJCSIgcHJvY2VlZGluZyB3aXRoIHVuZGVmaW5lZCByZXN1bHRzIiwKLQkJCQlzYXItPnZpcnRob3N0LCBzYXItPmhvc3RfcG9ydCk7Ci0JCSAgICB9Ci0JCX0KLQkJZWxzZSBpZiAoaWMpIHsKLQkJICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX1dBUk5JTkcsIG1haW5fcywKLQkJCSAgICAiVmlydHVhbEhvc3QgJXM6JXUgb3ZlcmxhcHMgd2l0aCAiCi0JCQkgICAgIlZpcnR1YWxIb3N0ICVzOiV1LCB0aGUgZmlyc3QgaGFzIHByZWNlZGVuY2UsICIKLQkJCSAgICAicGVyaGFwcyB5b3UgbmVlZCBhIE5hbWVWaXJ0dWFsSG9zdCBkaXJlY3RpdmUiLAotCQkJICAgIHNhci0+dmlydGhvc3QsIHNhci0+aG9zdF9wb3J0LAotCQkJICAgIGljLT5zYXItPnZpcnRob3N0LCBpYy0+c2FyLT5ob3N0X3BvcnQpOwotCQkgICAgaWMtPnNhciA9IHNhcjsKLQkJICAgIGljLT5zZXJ2ZXIgPSBzOwotCQl9Ci0JCWVsc2UgewotCQkgICAgdW5zaWduZWQgYnVja2V0ID0gaGFzaF9pbmFkZHIoc2FyLT5ob3N0X2FkZHIuc19hZGRyKTsKLQotCQkgICAgaWMgPSBuZXdfaXBhZGRyX2NoYWluKHAsIHMsIHNhcik7Ci0JCSAgICBpYy0+bmV4dCA9ICppcGhhc2hfdGFibGVfdGFpbFtidWNrZXRdOwotCQkgICAgKmlwaGFzaF90YWJsZV90YWlsW2J1Y2tldF0gPSBpYzsKLQkJfQotCSAgICB9Ci0JfQotCi0JLyogT2sgbm93IHdlIHdhbnQgdG8gc2V0IHVwIGEgc2VydmVyX2hvc3RuYW1lIGlmIHRoZSB1c2VyIHdhcwotCSAqIHNpbGx5IGVub3VnaCB0byBmb3JnZXQgb25lLgotCSAqIFhYWDogVGhpcyBpcyBzaWxseSB3ZSBzaG91bGQganVzdCBjcmFzaCBhbmQgYnVybi4KLQkgKi8KLQlpZiAoIXMtPnNlcnZlcl9ob3N0bmFtZSkgewotCSAgICBpZiAoaGFzX2RlZmF1bHRfdmhvc3RfYWRkcikgewotCQlzLT5zZXJ2ZXJfaG9zdG5hbWUgPSBtYWluX3MtPnNlcnZlcl9ob3N0bmFtZTsKLQkgICAgfQotCSAgICBlbHNlIGlmICghcy0+YWRkcnMpIHsKLQkJLyogd2hhdCBlbHNlIGNhbiB3ZSBkbz8gIGF0IHRoaXMgcG9pbnQgdGhpcyB2aG9zdCBoYXMKLQkJICAgIG5vIGNvbmZpZ3VyZWQgbmFtZSwgcHJvYmFibHkgYmVjYXVzZSB0aGV5IHVzZWQKLQkJICAgIEROUyBpbiB0aGUgVmlydHVhbEhvc3Qgc3RhdGVtZW50LiAgSXQncyBkaXNhYmxlZAotCQkgICAgYW55aG93IGJ5IHRoZSBob3N0IG1hdGNoaW5nIGNvZGUuICAtZGpnICovCi0JCXMtPnNlcnZlcl9ob3N0bmFtZSA9Ci0JCSAgICBhcF9wc3RyZHVwKHAsICJib2d1c19ob3N0X3dpdGhvdXRfZm9yd2FyZF9kbnMiKTsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJc3RydWN0IGhvc3RlbnQgKmg7Ci0KLQkJaWYgKChoID0gZ2V0aG9zdGJ5YWRkcigoY2hhciAqKSAmKHMtPmFkZHJzLT5ob3N0X2FkZHIpLAotCQkJCQlzaXplb2Yoc3RydWN0IGluX2FkZHIpLCBBRl9JTkVUKSkpIHsKLQkJICAgIHMtPnNlcnZlcl9ob3N0bmFtZSA9IGFwX3BzdHJkdXAocCwgKGNoYXIgKikgaC0+aF9uYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJICAgIC8qIGFnYWluLCB3aGF0IGNhbiB3ZSBkbz8gIFRoZXkgZGlkbid0IHNwZWNpZnkgYQotCQkgICAgICAgU2VydmVyTmFtZSwgYW5kIHRoZWlyIEROUyBpc24ndCB3b3JraW5nLiAtZGpnICovCi0JCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIG1haW5fcywKLQkJCSAgICAiRmFpbGVkIHRvIHJlc29sdmUgc2VydmVyIG5hbWUgIgotCQkJICAgICJmb3IgJXMgKGNoZWNrIEROUykgLS0gb3Igc3BlY2lmeSBhbiBleHBsaWNpdCAiCi0JCQkgICAgIlNlcnZlck5hbWUiLAotCQkJICAgIGluZXRfbnRvYShzLT5hZGRycy0+aG9zdF9hZGRyKSk7Ci0JCSAgICBzLT5zZXJ2ZXJfaG9zdG5hbWUgPQotCQkJYXBfcHN0cmR1cChwLCAiYm9ndXNfaG9zdF93aXRob3V0X3JldmVyc2VfZG5zIik7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICAvKiBub3cgZ28gdGhyb3VnaCBhbmQgZGVsZXRlIGFueSBOYW1lVmlydHVhbEhvc3RzIHRoYXQgZGlkbid0IGhhdmUgYW55Ci0gICAgICogaG9zdHMgYXNzb2NpYXRlZCB3aXRoIHRoZW0uICBMYW1lcnMuCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IElQSEFTSF9UQUJMRV9TSVpFOyArK2kpIHsKLQlpcGFkZHJfY2hhaW4gKipwaWMgPSAmaXBoYXNoX3RhYmxlW2ldOwotCi0Jd2hpbGUgKCpwaWMpIHsKLQkgICAgaXBhZGRyX2NoYWluICppYyA9ICpwaWM7Ci0KLQkgICAgaWYgKGljLT5zZXJ2ZXIgPT0gTlVMTCkgewotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLCBtYWluX3MsCi0JCQkiTmFtZVZpcnR1YWxIb3N0ICVzOiV1IGhhcyBubyBWaXJ0dWFsSG9zdHMiLAotCQkJaWMtPnNhci0+dmlydGhvc3QsIGljLT5zYXItPmhvc3RfcG9ydCk7Ci0JCSpwaWMgPSBpYy0+bmV4dDsKLQkgICAgfQotCSAgICBlbHNlIGlmIChpYy0+bmFtZXMgPT0gTlVMTCkgewotCQkvKiBpZiBzZXJ2ZXIgIT0gTlVMTCBhbmQgbmFtZXMgPT0gTlVMTCB0aGVuIHdlJ3JlIGRvbmUKLQkJICogbG9va2luZyBhdCBOYW1lVmlydHVhbEhvc3RzCi0JCSAqLwotCQlicmVhazsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJcGljID0gJmljLT5uZXh0OwotCSAgICB9Ci0JfQotICAgIH0KLQotI2lmZGVmIElQSEFTSF9TVEFUSVNUSUNTCi0gICAgZHVtcF9pcGhhc2hfc3RhdGlzdGljcyhtYWluX3MpOwotI2VuZGlmCi0gICAgaWYgKGFwX2R1bXBfc2V0dGluZ3MpIHsKLQlkdW1wX3Zob3N0X2NvbmZpZyhzdGRlcnIpOwotICAgIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHJ1bi10aW1lIHZob3N0IG1hdGNoaW5nIGZ1bmN0aW9ucwotICovCi0KLS8qIFJlbW92ZSA6cG9ydCBhbmQgb3B0aW9uYWxseSBhIHNpbmdsZSB0cmFpbGluZyAuIGZyb20gdGhlIGhvc3RuYW1lLCB0aGlzCi0gKiBjYW5vbmljYWxpemVzIGl0IHNvbWV3aGF0LgotICovCi1zdGF0aWMgdm9pZCBmaXhfaG9zdG5hbWUocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY29uc3QgY2hhciAqaG9zdG5hbWUgPSByLT5ob3N0bmFtZTsKLSAgICBjaGFyICpob3N0ID0gYXBfZ2V0d29yZChyLT5wb29sLCAmaG9zdG5hbWUsICc6Jyk7CS8qIGdldCByaWQgb2YgcG9ydCAqLwotICAgIHNpemVfdCBsOwotCi0gICAgLyogdHJpbSBhIHRyYWlsaW5nIC4gKi8KLSAgICBsID0gc3RybGVuKGhvc3QpOwotICAgIGlmIChsID4gMCAmJiBob3N0W2wtMV0gPT0gJy4nKSB7Ci0gICAgICAgIGhvc3RbbC0xXSA9ICdcMCc7Ci0gICAgfQotCi0gICAgci0+aG9zdG5hbWUgPSBob3N0OwotfQotCi0KLS8qIHJldHVybiAxIGlmIGhvc3QgbWF0Y2hlcyBTZXJ2ZXJOYW1lIG9yIFNlcnZlckFsaWFzZXMgKi8KLXN0YXRpYyBpbnQgbWF0Y2hlc19hbGlhc2VzKHNlcnZlcl9yZWMgKnMsIGNvbnN0IGNoYXIgKmhvc3QpCi17Ci0gICAgaW50IGk7Ci0gICAgYXJyYXlfaGVhZGVyICpuYW1lczsKLQotICAgIC8qIG1hdGNoIFNlcnZlck5hbWUgKi8KLSAgICBpZiAoIXN0cmNhc2VjbXAoaG9zdCwgcy0+c2VydmVyX2hvc3RuYW1lKSkgewotCXJldHVybiAxOwotICAgIH0KLQotICAgIC8qIHNlYXJjaCBhbGwgdGhlIGFsaWFzZXMgZnJvbSBTZXJ2ZXJBbGlhcyBkaXJlY3RpdmUgKi8KLSAgICBuYW1lcyA9IHMtPm5hbWVzOwotICAgIGlmIChuYW1lcykgewotCWNoYXIgKipuYW1lID0gKGNoYXIgKiopIG5hbWVzLT5lbHRzOwotCWZvciAoaSA9IDA7IGkgPCBuYW1lcy0+bmVsdHM7ICsraSkgewotCSAgICBpZighbmFtZVtpXSkgY29udGludWU7Ci0JICAgIGlmICghc3RyY2FzZWNtcChob3N0LCBuYW1lW2ldKSkKLQkJcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgICBuYW1lcyA9IHMtPndpbGRfbmFtZXM7Ci0gICAgaWYgKG5hbWVzKSB7Ci0JY2hhciAqKm5hbWUgPSAoY2hhciAqKikgbmFtZXMtPmVsdHM7Ci0JZm9yIChpID0gMDsgaSA8IG5hbWVzLT5uZWx0czsgKytpKSB7Ci0JICAgIGlmKCFuYW1lW2ldKSBjb250aW51ZTsKLQkgICAgaWYgKCFhcF9zdHJjYXNlY21wX21hdGNoKGhvc3QsIG5hbWVbaV0pKQotCQlyZXR1cm4gMTsKLQl9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0KLS8qIFN1cHBvc2UgYSByZXF1ZXN0IGNhbWUgaW4gb24gdGhlIHNhbWUgc29ja2V0IGFzIHRoaXMgciwgYW5kIGluY2x1ZGVkCi0gKiBhIGhlYWRlciAiSG9zdDogaG9zdDpwb3J0Iiwgd291bGQgaXQgbWFwIHRvIHItPnNlcnZlcj8gIEl0J3MgbW9yZQotICogdGhhbiBqdXN0IHRoYXQgdGhvdWdoLiAgV2hlbiB3ZSBkbyB0aGUgbm9ybWFsIG1hdGNoZXMgZm9yIGVhY2ggcmVxdWVzdAotICogd2UgZG9uJ3QgZXZlbiBib3RoZXIgY29uc2lkZXJpbmcgSG9zdDogZXRjIG9uIG5vbi1uYW1ldmlydHVhbGhvc3RzLAotICogd2UganVzdCBjYWxsIGl0IGEgbWF0Y2guICBCdXQgaGVyZSB3ZSByZXF1aXJlIHRoZSBob3N0OnBvcnQgdG8gbWF0Y2gKLSAqIHRoZSBTZXJ2ZXJOYW1lIGFuZC9vciBTZXJ2ZXJBbGlhc2VzLgotICovCi1BUElfRVhQT1JUKGludCkgYXBfbWF0Y2hlc19yZXF1ZXN0X3Zob3N0KHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICpob3N0LAotICAgIHVuc2lnbmVkIHBvcnQpCi17Ci0gICAgc2VydmVyX3JlYyAqczsKLSAgICBzZXJ2ZXJfYWRkcl9yZWMgKnNhcjsKLQotICAgIHMgPSByLT5zZXJ2ZXI7Ci0KLSAgICAvKiBzZWFyY2ggYWxsIHRoZSA8VmlydHVhbEhvc3Q+IHZhbHVlcyAqLwotICAgIC8qIFhYWDogSWYgdGhpcyBpcyBhIE5hbWVWaXJ0dWFsSG9zdCB0aGVuIHdlIG1heSBub3QgYmUgZG9pbmcgdGhlIFJpZ2h0IFRoaW5nCi0gICAgICogY29uc2lkZXI6IAotICAgICAqCi0gICAgICogICAgIE5hbWVWaXJ0dWFsSG9zdCAxMC4xLjEuMQotICAgICAqICAgICA8VmlydHVhbEhvc3QgMTAuMS4xLjE+Ci0gICAgICogICAgIFNlcnZlck5hbWUgdjEKLSAgICAgKiAgICAgPC9WaXJ0dWFsSG9zdD4KLSAgICAgKiAgICAgPFZpcnR1YWxIb3N0IDEwLjEuMS4xPgotICAgICAqICAgICBTZXJ2ZXJOYW1lIHYyCi0gICAgICogICAgIDwvVmlydHVhbEhvc3Q+Ci0gICAgICoKLSAgICAgKiBTdXBwb3NlIHItPnNlcnZlciBpcyB2MiwgYW5kIHdlJ3JlIGFza2VkIHRvIG1hdGNoICIxMC4xLjEuMSIuICBXZSdsbCBzYXkKLSAgICAgKiAieXVwIGl0J3MgdjIiLCB3aGVuIHJlYWxseSBpdCBpc24ndC4uLiBpZiBhIHJlcXVlc3QgY2FtZSBpbiBmb3IgMTAuMS4xLjEKLSAgICAgKiBpdCB3b3VsZCByZWFsbHkgZ28gdG8gdjEuCi0gICAgICovCi0gICAgZm9yIChzYXIgPSBzLT5hZGRyczsgc2FyOyBzYXIgPSBzYXItPm5leHQpIHsKLQlpZiAoKHNhci0+aG9zdF9wb3J0ID09IDAgfHwgcG9ydCA9PSBzYXItPmhvc3RfcG9ydCkKLQkgICAgJiYgIXN0cmNhc2VjbXAoaG9zdCwgc2FyLT52aXJ0aG9zdCkpIHsKLQkgICAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLQotICAgIC8qIHRoZSBQb3J0IGhhcyB0byBtYXRjaCBub3csIGJlY2F1c2UgdGhlIHJlc3QgZG9uJ3QgaGF2ZSBwb3J0cyBhc3NvY2lhdGVkCi0gICAgICogd2l0aCB0aGVtLiAqLwotICAgIGlmIChwb3J0ICE9IHMtPnBvcnQpIHsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbWF0Y2hlc19hbGlhc2VzKHMsIGhvc3QpOwotfQotCi0KLXN0YXRpYyB2b2lkIGNoZWNrX2hvc3RhbGlhcyhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICAvKgotICAgICAqIEV2ZW4gaWYgdGhlIHJlcXVlc3QgaGFzIGEgSG9zdDogaGVhZGVyIGNvbnRhaW5pbmcgYSBwb3J0IHdlIGlnbm9yZQotICAgICAqIHRoYXQgcG9ydC4gIFdlIGFsd2F5cyB1c2UgdGhlIHBoeXNpY2FsIHBvcnQgb2YgdGhlIHNvY2tldC4gIFRoZXJlCi0gICAgICogYXJlIGEgZmV3IHJlYXNvbnMgZm9yIHRoaXM6Ci0gICAgICoKLSAgICAgKiAtIHRoZSBkZWZhdWx0IG9mIDgwIG9yIDQ0MyBmb3IgU1NMIGlzIGVhc2llciB0byBoYW5kbGUgdGhpcyB3YXkKLSAgICAgKiAtIHRoZXJlIGlzIGxlc3Mgb2YgYSBwb3NzaWJpbGl0eSBvZiBhIHNlY3VyaXR5IHByb2JsZW0KLSAgICAgKiAtIGl0IHNpbXBsaWZpZXMgdGhlIGRhdGEgc3RydWN0dXJlCi0gICAgICogLSB0aGUgY2xpZW50IG1heSBoYXZlIG5vIGlkZWEgdGhhdCBhIHByb3h5IHNvbWV3aGVyZSBhbG9uZyB0aGUgd2F5Ci0gICAgICogICB0cmFuc2xhdGVkIHRoZSByZXF1ZXN0IHRvIGFub3RoZXIgaXA6cG9ydAotICAgICAqIC0gZXhjZXB0IGZvciB0aGUgYWRkcmVzc2VzIGZyb20gdGhlIFZpcnR1YWxIb3N0IGxpbmUsIG5vbmUgb2YgdGhlIG90aGVyCi0gICAgICogICBuYW1lcyB3ZSdsbCBtYXRjaCBoYXZlIHBvcnRzIGFzc29jaWF0ZWQgd2l0aCB0aGVtCi0gICAgICovCi0gICAgY29uc3QgY2hhciAqaG9zdCA9IHItPmhvc3RuYW1lOwotICAgIHVuc2lnbmVkIHBvcnQgPSBudG9ocyhyLT5jb25uZWN0aW9uLT5sb2NhbF9hZGRyLnNpbl9wb3J0KTsKLSAgICBzZXJ2ZXJfcmVjICpzOwotICAgIHNlcnZlcl9yZWMgKmxhc3RfczsKLSAgICBuYW1lX2NoYWluICpzcmM7Ci0KLSAgICBsYXN0X3MgPSBOVUxMOwotCi0gICAgLyogUmVjYWxsIHRoYXQgdGhlIG5hbWVfY2hhaW4gaXMgYSBsaXN0IG9mIHNlcnZlcl9hZGRyX3JlY3MsIHNvbWUgb2YKLSAgICAgKiB3aG9zZSBwb3J0cyBtYXkgbm90IG1hdGNoLiAgQWxzbyBlYWNoIHNlcnZlciBtYXkgYXBwZWFyIG1vcmUgdGhhbgotICAgICAqIG9uY2UgaW4gdGhlIGNoYWluIC0tIHNwZWNpZmljYWxseSwgaXQgd2lsbCBhcHBlYXIgb25jZSBmb3IgZWFjaAotICAgICAqIGFkZHJlc3MgZnJvbSBpdHMgVmlydHVhbEhvc3QgbGluZSB3aGljaCBtYXRjaGVkLiAgV2Ugb25seSB3YW50IHRvCi0gICAgICogZG8gdGhlIGZ1bGwgU2VydmVyTmFtZS9TZXJ2ZXJBbGlhcyBjb21wYXJpc29ucyBvbmNlIGZvciBlYWNoCi0gICAgICogc2VydmVyLCBmb3J0dW5hdGVseSB3ZSBrbm93IHRoYXQgYWxsIHRoZSBWaXJ0dWFsSG9zdCBhZGRyZXNzZXMgZm9yCi0gICAgICogYSBzaW5nbGUgc2VydmVyIGFyZSBhZGphY2VudCB0byBlYWNoIG90aGVyLgotICAgICAqLwotCi0gICAgZm9yIChzcmMgPSByLT5jb25uZWN0aW9uLT52aG9zdF9sb29rdXBfZGF0YTsgc3JjOyBzcmMgPSBzcmMtPm5leHQpIHsKLSAgICAgICAgc2VydmVyX2FkZHJfcmVjICpzYXI7Ci0KLQkvKiBXZSBvbmx5IGNvbnNpZGVyIGFkZHJlc3NlcyBvbiB0aGUgbmFtZV9jaGFpbiB3aGljaCBoYXZlIGEgbWF0Y2hpbmcKLQkgKiBwb3J0Ci0JICovCi0Jc2FyID0gc3JjLT5zYXI7Ci0JaWYgKHNhci0+aG9zdF9wb3J0ICE9IDAgJiYgcG9ydCAhPSBzYXItPmhvc3RfcG9ydCkgewotCSAgICBjb250aW51ZTsKLQl9Ci0KLSAgICAgICAgcyA9IHNyYy0+c2VydmVyOwotCi0JLyogZG9lcyBpdCBtYXRjaCB0aGUgdmlydGhvc3QgZnJvbSB0aGUgc2FyPyAqLwotCWlmICghc3RyY2FzZWNtcChob3N0LCBzYXItPnZpcnRob3N0KSkgewotCSAgICBnb3RvIGZvdW5kOwotCX0KLQotCWlmIChzID09IGxhc3RfcykgewotCSAgICAvKiB3ZSd2ZSBhbHJlYWR5IGRvbmUgU2VydmVyTmFtZSBhbmQgU2VydmVyQWxpYXMgY2hlY2tzIGZvciB0aGlzCi0JICAgICAqIHZob3N0Ci0JICAgICAqLwotCSAgICBjb250aW51ZTsKLQl9Ci0JbGFzdF9zID0gczsKLQotCWlmIChtYXRjaGVzX2FsaWFzZXMocywgaG9zdCkpIHsKLQkgICAgZ290byBmb3VuZDsKLQl9Ci0gICAgfQotICAgIHJldHVybjsKLQotZm91bmQ6Ci0gICAgLyogcyBpcyB0aGUgZmlyc3QgbWF0Y2hpbmcgc2VydmVyLCB3ZSdyZSBkb25lICovCi0gICAgci0+c2VydmVyID0gci0+Y29ubmVjdGlvbi0+c2VydmVyID0gczsKLX0KLQotCi1zdGF0aWMgdm9pZCBjaGVja19zZXJ2ZXJwYXRoKHJlcXVlc3RfcmVjICpyKQotewotICAgIHNlcnZlcl9yZWMgKnM7Ci0gICAgc2VydmVyX3JlYyAqbGFzdF9zOwotICAgIG5hbWVfY2hhaW4gKnNyYzsKLSAgICB1bnNpZ25lZCBwb3J0ID0gbnRvaHMoci0+Y29ubmVjdGlvbi0+bG9jYWxfYWRkci5zaW5fcG9ydCk7Ci0KLSAgICAvKgotICAgICAqIFRoaXMgaXMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgU2VydmVyUGF0aCBjb2RlIGluIGh0dHBfY29yZSwgc28gd2UKLSAgICAgKiBnZXQgdGhlIHJpZ2h0IGhvc3QgYXR0YWNoZWQgdG8gYSBub24tIEhvc3Qtc2VuZGluZyByZXF1ZXN0LgotICAgICAqCi0gICAgICogU2VlIHRoZSBjb21tZW50IGluIGNoZWNrX2hvc3RhbGlhcyBhYm91dCBob3cgZWFjaCB2aG9zdCBjYW4gYmUKLSAgICAgKiBsaXN0ZWQgbXVsdGlwbGUgdGltZXMuCi0gICAgICovCi0KLSAgICBsYXN0X3MgPSBOVUxMOwotICAgIGZvciAoc3JjID0gci0+Y29ubmVjdGlvbi0+dmhvc3RfbG9va3VwX2RhdGE7IHNyYzsgc3JjID0gc3JjLT5uZXh0KSB7Ci0JLyogV2Ugb25seSBjb25zaWRlciBhZGRyZXNzZXMgb24gdGhlIG5hbWVfY2hhaW4gd2hpY2ggaGF2ZSBhIG1hdGNoaW5nCi0JICogcG9ydAotCSAqLwotCWlmIChzcmMtPnNhci0+aG9zdF9wb3J0ICE9IDAgJiYgcG9ydCAhPSBzcmMtPnNhci0+aG9zdF9wb3J0KSB7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotICAgICAgICBzID0gc3JjLT5zZXJ2ZXI7Ci0JaWYgKHMgPT0gbGFzdF9zKSB7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQlsYXN0X3MgPSBzOwotCi0gICAgICAgIGlmIChzLT5wYXRoICYmICFzdHJuY21wKHItPnVyaSwgcy0+cGF0aCwgcy0+cGF0aGxlbikgJiYKLSAgICAgICAgICAgIChzLT5wYXRoW3MtPnBhdGhsZW4gLSAxXSA9PSAnLycgfHwKLSAgICAgICAgICAgICByLT51cmlbcy0+cGF0aGxlbl0gPT0gJy8nIHx8Ci0gICAgICAgICAgICAgci0+dXJpW3MtPnBhdGhsZW5dID09ICdcMCcpKSB7Ci0gICAgICAgICAgICByLT5zZXJ2ZXIgPSByLT5jb25uZWN0aW9uLT5zZXJ2ZXIgPSBzOwotCSAgICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotCi12b2lkIGFwX3VwZGF0ZV92aG9zdF9mcm9tX2hlYWRlcnMocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgLyogbXVzdCBzZXQgdGhpcyBmb3IgSFRUUC8xLjEgc3VwcG9ydCAqLwotICAgIGlmIChyLT5ob3N0bmFtZSB8fCAoci0+aG9zdG5hbWUgPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIkhvc3QiKSkpIHsKLQlmaXhfaG9zdG5hbWUocik7Ci0gICAgfQotICAgIC8qIGNoZWNrIGlmIHdlIHR1Y2tlZCBhd2F5IGEgbmFtZV9jaGFpbiAqLwotICAgIGlmIChyLT5jb25uZWN0aW9uLT52aG9zdF9sb29rdXBfZGF0YSkgewotICAgICAgICBpZiAoci0+aG9zdG5hbWUpCi0gICAgICAgICAgICBjaGVja19ob3N0YWxpYXMocik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNoZWNrX3NlcnZlcnBhdGgocik7Ci0gICAgfQotfQotCi0KLS8qIENhbGxlZCBmb3IgYSBuZXcgY29ubmVjdGlvbiB3aGljaCBoYXMgYSBrbm93biBsb2NhbF9hZGRyLiAgTm90ZSB0aGF0IHRoZQotICogbmV3IGNvbm5lY3Rpb24gaXMgYXNzdW1lZCB0byBoYXZlIGNvbm4tPnNlcnZlciA9PSBtYWluIHNlcnZlci4KLSAqLwotdm9pZCBhcF91cGRhdGVfdmhvc3RfZ2l2ZW5faXAoY29ubl9yZWMgKmNvbm4pCi17Ci0gICAgaXBhZGRyX2NoYWluICp0cmF2OwotICAgIHVuc2lnbmVkIHBvcnQgPSBudG9ocyhjb25uLT5sb2NhbF9hZGRyLnNpbl9wb3J0KTsKLQotICAgIC8qIHNjYW4gdGhlIGhhc2ggdGFibGUgZm9yIGFuIGV4YWN0IG1hdGNoIGZpcnN0ICovCi0gICAgdHJhdiA9IGZpbmRfaXBhZGRyKCZjb25uLT5sb2NhbF9hZGRyLnNpbl9hZGRyLCBwb3J0KTsKLSAgICBpZiAodHJhdikgewotCS8qIHNhdmUgdGhlIG5hbWVfY2hhaW4gZm9yIGxhdGVyIGluIGNhc2UgdGhpcyBpcyBhIG5hbWUtdmhvc3QgKi8KLQljb25uLT52aG9zdF9sb29rdXBfZGF0YSA9IHRyYXYtPm5hbWVzOwotCWNvbm4tPnNlcnZlciA9IHRyYXYtPnNlcnZlcjsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgLyogVGhlcmUncyBjZXJ0YWlubHkgbm8gbmFtZS12aG9zdHMgd2l0aCB0aGlzIGFkZHJlc3MsIHRoZXkgd291bGQgaGF2ZQotICAgICAqIGJlZW4gbWF0Y2hlZCBhYm92ZS4KLSAgICAgKi8KLSAgICBjb25uLT52aG9zdF9sb29rdXBfZGF0YSA9IE5VTEw7Ci0KLSAgICAvKiBtYXliZSB0aGVyZSdzIGEgZGVmYXVsdCBzZXJ2ZXIgbWF0Y2hpbmcgdGhpcyBwb3J0ICovCi0gICAgdHJhdiA9IGZpbmRfZGVmYXVsdF9zZXJ2ZXIocG9ydCk7Ci0gICAgaWYgKHRyYXYpIHsKLQljb25uLT5zZXJ2ZXIgPSB0cmF2LT5zZXJ2ZXI7Ci0gICAgfQotCi0gICAgLyogb3RoZXJ3aXNlIHdlJ3JlIHN0dWNrIHdpdGgganVzdCB0aGUgbWFpbiBzZXJ2ZXIgKi8KLX0KZGlmZiAtLWdpdCBhL3NyY2xpYi8uY3ZzaWdub3JlIGIvc3JjbGliLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYzdhN2MuLjAwMDAwMDAKLS0tIGEvc3JjbGliLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYWtlZmlsZQpkaWZmIC0tZ2l0IGEvc3JjbGliL01ha2VmaWxlLmluIGIvc3JjbGliL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDcyNWYyLi4wMDAwMDAwCi0tLSBhL3NyY2xpYi9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotCi1ERVBUSCAgICAgPSAuLgotdG9wc3JjZGlyID0gQHRvcHNyY2RpckAKLXNyY2RpciAgICA9IEBzcmNkaXJACi1WUEFUSCAgICAgPSBAc3JjZGlyQAotCi1TVUJESVJTID0gYXByCi0KLWluY2x1ZGUgJCh0b3BzcmNkaXIpL2J1aWxkL3J1bGVzLm1rCmRpZmYgLS1naXQgYS9zcmNsaWIvcGNyZS8uY3ZzaWdub3JlIGIvc3JjbGliL3BjcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExMTVjYy4uMDAwMDAwMAotLS0gYS9zcmNsaWIvcGNyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotKi5sYQotKi5sbwotLmxpYnMKLU1ha2VmaWxlCi1jaGFydGFibGVzLmMKLWNvbmZpZy5oCi1jb25maWcubG9nCi1jb25maWcuc3RhdHVzCi1kZnRhYmxlcwotbGlidG9vbAotcGNyZS1jb25maWcKLXBjcmUuaAotcGNyZXRlc3QKLXBncmVwCmRpZmYgLS1naXQgYS9zcmNsaWIvcGNyZS9SdW5UZXN0IGIvc3JjbGliL3BjcmUvUnVuVGVzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODVlZWI2Mi4uMDAwMDAwMAotLS0gYS9zcmNsaWIvcGNyZS9SdW5UZXN0CisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIFJ1biBQQ1JFIHRlc3RzCi0KLWNmPWRpZmYKLQotIyBTZWxlY3Qgd2hpY2ggdGVzdHMgdG8gcnVuOyBpZiBubyBzZWxlY3Rpb24sIHJ1biBhbGwKLQotZG8xPW5vCi1kbzI9bm8KLWRvMz1ubwotZG80PW5vCi0KLXdoaWxlIFsgJCMgLWd0IDAgXSA7IGRvCi0gIGNhc2UgJDEgaW4KLSAgICAxKSBkbzE9eWVzOzsKLSAgICAyKSBkbzI9eWVzOzsKLSAgICAzKSBkbzM9eWVzOzsKLSAgICA0KSBkbzQ9eWVzOzsKLSAgICAqKSBlY2hvICJVbmtub3duIHRlc3QgbnVtYmVyICQxIjsgZXhpdCAxOzsKLSAgZXNhYwotICBzaGlmdAotZG9uZQotCi1pZiBbICRkbzEgPSBubyAtYSAkZG8yID0gbm8gLWEgJGRvMyA9IG5vIC1hICRkbzQgPSBubyBdIDsgdGhlbgotICBkbzE9eWVzCi0gIGRvMj15ZXMKLSAgZG8zPXllcwotICBkbzQ9eWVzCi1maQotCi0jIFByaW1hcnkgdGVzdCwgUGVybC1jb21wYXRpYmxlCi0KLWlmIFsgJGRvMSA9IHllcyBdIDsgdGhlbgotICBlY2hvICJUZXN0aW5nIG1haW4gZnVuY3Rpb25hbGl0eSAoUGVybCBjb21wYXRpYmxlKSIKLSAgLi9wY3JldGVzdCB0ZXN0ZGF0YS90ZXN0aW5wdXQxIHRlc3R0cnkKLSAgaWYgWyAkPyA9IDAgXSA7IHRoZW4KLSAgICAkY2YgdGVzdHRyeSB0ZXN0ZGF0YS90ZXN0b3V0cHV0MQotICAgIGlmIFsgJD8gIT0gMCBdIDsgdGhlbiBleGl0IDE7IGZpCi0gIGVsc2UgZXhpdCAxCi0gIGZpCi1maQotCi0jIFBDUkUgdGVzdHMgdGhhdCBhcmUgbm90IFBlcmwtY29tcGF0aWJsZSAtIEFQSSAmIGVycm9yIHRlc3RzLCBtb3N0bHkKLQotaWYgWyAkZG8yID0geWVzIF0gOyB0aGVuCi0gIGVjaG8gIlRlc3RpbmcgQVBJIGFuZCBlcnJvciBoYW5kbGluZyAobm90IFBlcmwgY29tcGF0aWJsZSkiCi0gIC4vcGNyZXRlc3QgLWkgdGVzdGRhdGEvdGVzdGlucHV0MiB0ZXN0dHJ5Ci0gIGlmIFsgJD8gPSAwIF0gOyB0aGVuCi0gICAgJGNmIHRlc3R0cnkgdGVzdGRhdGEvdGVzdG91dHB1dDIKLSAgICBpZiBbICQ/ICE9IDAgXSA7IHRoZW4gZXhpdCAxOyBmaQotICBlbHNlIGV4aXQgMQotICBmaQotZmkKLQotIyBBZGRpdGlvbmFsIFBlcmwtY29tcGF0aWJsZSB0ZXN0cyBmb3IgUGVybCA1LjAwNSdzIG5ldyBmZWF0dXJlcwotCi1pZiBbICRkbzMgPSB5ZXMgXSA7IHRoZW4KLSAgZWNobyAiVGVzdGluZyBQZXJsIDUuMDA1IGZlYXR1cmVzIChQZXJsIDUuMDA1IGNvbXBhdGlibGUpIgotICAuL3BjcmV0ZXN0IHRlc3RkYXRhL3Rlc3RpbnB1dDMgdGVzdHRyeQotICBpZiBbICQ/ID0gMCBdIDsgdGhlbgotICAgICRjZiB0ZXN0dHJ5IHRlc3RkYXRhL3Rlc3RvdXRwdXQzCi0gICAgaWYgWyAkPyAhPSAwIF0gOyB0aGVuIGV4aXQgMTsgZmkKLSAgZWxzZSBleGl0IDEKLSAgZmkKLWZpCi0KLWlmIFsgJGRvMSA9IHllcyAtYSAkZG8yID0geWVzIC1hICRkbzMgPSB5ZXMgXSA7IHRoZW4KLSAgZWNobyAiVGhlIHRocmVlIG1haW4gdGVzdHMgYWxsIHJhbiBPSyIKLSAgZWNobyAiICIgCi1maQotCi0jIExvY2FsZS1zcGVjaWZpYyB0ZXN0cywgcHJvdmlkZWQgdGhlICJmciIgbG9jYWxlIGlzIGF2YWlsYWJsZQotCi1pZiBbICRkbzQgPSB5ZXMgXSA7IHRoZW4KLSAgbG9jYWxlIC1hIHwgZ3JlcCAnXmZyJCcgPi9kZXYvbnVsbAotICBpZiBbICQ/IC1lcSAwIF0gOyB0aGVuCi0gICAgZWNobyAiVGVzdGluZyBsb2NhbGUtc3BlY2lmaWMgZmVhdHVyZXMgKHVzaW5nICdmcicgbG9jYWxlKSIKLSAgICAuL3BjcmV0ZXN0IHRlc3RkYXRhL3Rlc3RpbnB1dDQgdGVzdHRyeQotICAgIGlmIFsgJD8gPSAwIF0gOyB0aGVuCi0gICAgICAkY2YgdGVzdHRyeSB0ZXN0ZGF0YS90ZXN0b3V0cHV0NAotICAgICAgaWYgWyAkPyAhPSAwIF0gOyB0aGVuIGV4aXQgMTsgZmkKLSAgICAgIGVjaG8gIkxvY2FsZSB0ZXN0IHJhbiBPSyIgCi0gICAgICBlY2hvICIgIiAKLSAgICBlbHNlIGV4aXQgMQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICJDYW5ub3QgdGVzdCBsb2NhbGUtc3BlY2lmaWMgZmVhdHVyZXMgLSAnZnInIGxvY2FsZSBub3QgZm91bmQsIgotICAgIGVjaG8gIm9yIHRoZSBcImxvY2FsZVwiIGNvbW1hbmQgaXMgbm90IGF2YWlsYWJsZSB0byBjaGVjayBmb3IgaXQuIgotICAgIGVjaG8gIiAiIAotICBmaQotZmkKLQotIyBFbmQKZGlmZiAtLWdpdCBhL3NyY2xpYi9wY3JlL2NvbmZpZy5odyBiL3NyY2xpYi9wY3JlL2NvbmZpZy5odwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI0ZjVkZS4uMDAwMDAwMAotLS0gYS9zcmNsaWIvcGNyZS9jb25maWcuaHcKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0KLS8qIE9uIFVuaXggc3lzdGVtcyBjb25maWcuaW4gaXMgY29udmVydGVkIGJ5IGNvbmZpZ3VyZSBpbnRvIGNvbmZpZy5oLiBQQ1JFIGlzCi13cml0dGVuIGluIFN0YW5kYXJkIEMsIGJ1dCB0aGVyZSBhcmUgYSBmZXcgbm9uLXN0YW5kYXJkIHRoaW5ncyBpdCBjYW4gY29wZQotd2l0aCwgYWxsb3dpbmcgaXQgdG8gcnVuIG9uIFN1bk9TNCBhbmQgb3RoZXIgImNsb3NlIHRvIHN0YW5kYXJkIiBzeXN0ZW1zLgotCi1PbiBhIG5vbi1Vbml4IHN5c3RlbSB5b3Ugc2hvdWxkIGp1c3QgY29weSB0aGlzIGZpbGUgaW50byBjb25maWcuaCBhbmQgY2hhbmdlCi10aGUgZGVmaW5pdGlvbnMgb2YgSEFWRV9TVFJFUlJPUiBhbmQgSEFWRV9NRU1NT1ZFIHRvIDEuIFVuZm9ydHVuYXRlbHksIGJlY2F1c2UKLW9mIHRoZSB3YXkgYXV0b2NvbmYgd29ya3MsIHRoZXNlIGNhbm5vdCBiZSBtYWRlIHRoZSBkZWZhdWx0cy4gKi8KLQotLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICovCi0KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3RkZGVmLmg+IGRvZXNuJ3QgZGVmaW5lIHNpemVfdC4gKi8KLQotI3VuZGVmIHNpemVfdAotCi0vKiBUaGUgZm9sbG93aW5nIHR3byBkZWZpbml0aW9ucyBhcmUgbWFpbmx5IGZvciB0aGUgYmVuZWZpdCBvZiBTdW5PUzQsIHdoaWNoCi1kb2Vzbid0IGhhdmUgdGhlIHN0cmVycm9yKCkgb3IgbWVtbW92ZSgpIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBwcmVzZW50IGluCi1hbGwgU3RhbmRhcmQgQyBsaWJyYXJpZXMuIFRoZSBtYWNyb3Mgc2hvdWxkIG5vcm1hbGx5IGJlIGRlZmluZWQgd2l0aCB0aGUgdmFsdWUKLTEgZm9yIG90aGVyIHN5c3RlbXMsIGJ1dCB1bmZvcnR1bmF0ZWx5IHdlIGNhbid0IG1ha2UgdGhpcyB0aGUgZGVmYXVsdCBiZWNhdXNlCi0iY29uZmlndXJlIiBmaWxlcyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgd2lsbCBvbmx5IGNoYW5nZSAwIHRvIDE7IHRoZXkgd29uJ3QKLWNoYW5nZSAxIHRvIDAgaWYgdGhlIGZ1bmN0aW9ucyBhcmUgbm90IGZvdW5kLiAqLwotCi0jZGVmaW5lIEhBVkVfU1RSRVJST1IgMQotI2RlZmluZSBIQVZFX01FTU1PVkUgIDEKLQotLyogRW5kICovCmRpZmYgLS1naXQgYS9zcmNsaWIvcGNyZS9jb25maWd1cmUgYi9zcmNsaWIvcGNyZS9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmZiOWZkZgotLS0gL2Rldi9udWxsCisrKyBiL3NyY2xpYi9wY3JlL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDc0ODIgQEAKKyMhIC9iaW4vc2gKKyMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KKyMgR2VuZXJhdGVkIGJ5IEF1dG9jb25mIDIuNTAuCisjCisjIENvcHlyaWdodCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisKKyMgRmluZCB0aGUgY29ycmVjdCBQQVRIIHNlcGFyYXRvci4gIFVzdWFsbHkgdGhpcyBpcyBgOicsIGJ1dAorIyBESkdQUCB1c2VzIGA7JyBsaWtlIERPUy4KK2lmIHRlc3QgIlgke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgVU5BTUU9JHtVTkFNRS1gdW5hbWUgMj4vZGV2L251bGxgfQorICBjYXNlIFgkVU5BTUUgaW4KKyAgICAqLURPUykgbHRfY3Zfc3lzX3BhdGhfc2VwYXJhdG9yPSc7JyA7OworICAgICopICAgICBsdF9jdl9zeXNfcGF0aF9zZXBhcmF0b3I9JzonIDs7CisgIGVzYWMKK2ZpCisKKyMgQ2hlY2sgdGhhdCB3ZSBhcmUgcnVubmluZyB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisKK2Nhc2UgWCRFQ0hPIGluCitYKi0tZmFsbGJhY2stZWNobykKKyAgIyBSZW1vdmUgb25lIGxldmVsIG9mIHF1b3RhdGlvbiAod2hpY2ggd2FzIHJlcXVpcmVkIGZvciBNYWtlKS4KKyAgRUNITz1gZWNobyAiJEVDSE8iIHwgc2VkICdzLFxcXFxcJFxcJDAsJyQwJywnYAorICA7OworZXNhYworCitlY2hvPSR7RUNITy1lY2hvfQoraWYgdGVzdCAiWCQxIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgorICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KKyAgc2hpZnQKK2VsaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KKyAgIyBBdm9pZCBpbmxpbmUgZG9jdW1lbnQgaGVyZSwgaXQgbWF5IGJlIGxlZnQgb3ZlcgorICA6CitlbGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbgorICAjIFlpcHBlZSwgJGVjaG8gd29ya3MhCisgIDoKK2Vsc2UKKyAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgorICBleGVjICRTSEVMTCAiJDAiIC0tbm8tcmVleGVjICR7MSsiJEAifQorZmkKKworaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KKyAgIyB1c2VkIGFzIGZhbGxiYWNrIGVjaG8KKyAgc2hpZnQKKyAgY2F0IDw8RU9GCisKK0VPRgorICBleGl0IDAKK2ZpCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCitpZiB0ZXN0ICJYJHtDRFBBVEgrc2V0fSIgPSBYc2V0OyB0aGVuIENEUEFUSD06OyBleHBvcnQgQ0RQQVRIOyBmaQorCitpZiB0ZXN0IC16ICIkRUNITyI7IHRoZW4KK2lmIHRlc3QgIlgke2VjaG9fdGVzdF9zdHJpbmcrc2V0fSIgIT0gWHNldDsgdGhlbgorIyBmaW5kIGEgc3RyaW5nIGFzIGxhcmdlIGFzIHBvc3NpYmxlLCBhcyBsb25nIGFzIHRoZSBzaGVsbCBjYW4gY29wZSB3aXRoIGl0CisgIGZvciBjbWQgaW4gJ3NlZCA1MHEgIiQwIicgJ3NlZCAyMHEgIiQwIicgJ3NlZCAxMHEgIiQwIicgJ3NlZCAycSAiJDAiJyAnZWNobyB0ZXN0JzsgZG8KKyAgICAjIGV4cGVjdGVkIHNpemVzOiBsZXNzIHRoYW4gMktiLCAxS2IsIDUxMiBieXRlcywgMTYgYnl0ZXMsIC4uLgorICAgIGlmIChlY2hvX3Rlc3Rfc3RyaW5nPSJgZXZhbCAkY21kYCIpIDI+L2Rldi9udWxsICYmCisgICAgICAgZWNob190ZXN0X3N0cmluZz0iYGV2YWwgJGNtZGAiICYmCisgICAgICAgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGwKKyAgICB0aGVuCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKK2ZpCisKK2lmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgorICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisgIDoKK2Vsc2UKKyAgIyBUaGUgU29sYXJpcywgQUlYLCBhbmQgRGlnaXRhbCBVbml4IGRlZmF1bHQgZWNobyBwcm9ncmFtcyB1bnF1b3RlCisgICMgYmFja3NsYXNoZXMuICBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gcXVvdGUgYmFja3NsYXNoZXMgdXNpbmcKKyAgIyAgIGVjaG8gIiRzb21ldGhpbmciIHwgc2VkICdzL1xcL1xcXFwvZycKKyAgIworICAjIFNvLCBmaXJzdCB3ZSBsb29rIGZvciBhIHdvcmtpbmcgZWNobyBpbiB0aGUgdXNlcidzIFBBVEguCisKKyAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUn0iCisgIGZvciBkaXIgaW4gJFBBVEggL3Vzci91Y2I7IGRvCisgICAgaWYgKHRlc3QgLWYgJGRpci9lY2hvIHx8IHRlc3QgLWYgJGRpci9lY2hvJGFjX2V4ZWV4dCkgJiYKKyAgICAgICB0ZXN0ICJYYCgkZGlyL2VjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCisgICAgICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRkaXIvZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKKyAgICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKyAgICAgIGVjaG89IiRkaXIvZWNobyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRzYXZlX2lmcyIKKworICBpZiB0ZXN0ICJYJGVjaG8iID0gWGVjaG87IHRoZW4KKyAgICAjIFdlIGRpZG4ndCBmaW5kIGEgYmV0dGVyIGVjaG8sIHNvIGxvb2sgZm9yIGFsdGVybmF0aXZlcy4KKyAgICBpZiB0ZXN0ICJYYChwcmludCAtciAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKKyAgICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAocHJpbnQgLXIgIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisgICAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisgICAgICAjIFRoaXMgc2hlbGwgaGFzIGEgYnVpbHRpbiBwcmludCAtciB0aGF0IGRvZXMgdGhlIHRyaWNrLgorICAgICAgZWNobz0ncHJpbnQgLXInCisgICAgZWxpZiAodGVzdCAtZiAvYmluL2tzaCB8fCB0ZXN0IC1mIC9iaW4va3NoJGFjX2V4ZWV4dCkgJiYKKwkgdGVzdCAiWCRDT05GSUdfU0hFTEwiICE9IFgvYmluL2tzaDsgdGhlbgorICAgICAgIyBJZiB3ZSBoYXZlIGtzaCwgdHJ5IHJ1bm5pbmcgY29uZmlndXJlIGFnYWluIHdpdGggaXQuCisgICAgICBPUklHSU5BTF9DT05GSUdfU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKyAgICAgIGV4cG9ydCBPUklHSU5BTF9DT05GSUdfU0hFTEwKKyAgICAgIENPTkZJR19TSEVMTD0vYmluL2tzaAorICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAorICAgICAgZXhlYyAkQ09ORklHX1NIRUxMICIkMCIgLS1uby1yZWV4ZWMgJHsxKyIkQCJ9CisgICAgZWxzZQorICAgICAgIyBUcnkgdXNpbmcgcHJpbnRmLgorICAgICAgZWNobz0ncHJpbnRmICVzXG4nCisgICAgICBpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKKwkgZWNob190ZXN0aW5nX3N0cmluZz1gKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorCSB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKwkjIENvb2wsIHByaW50ZiB3b3JrcworCToKKyAgICAgIGVsaWYgZWNob190ZXN0aW5nX3N0cmluZz1gKCRPUklHSU5BTF9DT05GSUdfU0hFTEwgIiQwIiAtLWZhbGxiYWNrLWVjaG8gJ1x0JykgMj4vZGV2L251bGxgICYmCisJICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICdYXHQnICYmCisJICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRPUklHSU5BTF9DT05GSUdfU0hFTEwgIiQwIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisJICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisJQ09ORklHX1NIRUxMPSRPUklHSU5BTF9DT05GSUdfU0hFTEwKKwlleHBvcnQgQ09ORklHX1NIRUxMCisJU0hFTEw9IiRDT05GSUdfU0hFTEwiCisJZXhwb3J0IFNIRUxMCisJZWNobz0iJENPTkZJR19TSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iCisgICAgICBlbGlmIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkQ09ORklHX1NIRUxMICIkMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCAmJgorCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAnWFx0JyAmJgorCSAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkQ09ORklHX1NIRUxMICIkMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorCWVjaG89IiRDT05GSUdfU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvIgorICAgICAgZWxzZQorCSMgbWF5YmUgd2l0aCBhIHNtYWxsZXIgc3RyaW5nLi4uCisJcHJldj06CisKKwlmb3IgY21kIGluICdlY2hvIHRlc3QnICdzZWQgMnEgIiQwIicgJ3NlZCAxMHEgIiQwIicgJ3NlZCAyMHEgIiQwIicgJ3NlZCA1MHEgIiQwIic7IGRvCisJICBpZiAodGVzdCAiWCRlY2hvX3Rlc3Rfc3RyaW5nIiA9ICJYYGV2YWwgJGNtZGAiKSAyPi9kZXYvbnVsbAorCSAgdGhlbgorCSAgICBicmVhaworCSAgZmkKKwkgIHByZXY9IiRjbWQiCisJZG9uZQorCisJaWYgdGVzdCAiJHByZXYiICE9ICdzZWQgNTBxICIkMCInOyB0aGVuCisJICBlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRwcmV2YAorCSAgZXhwb3J0IGVjaG9fdGVzdF9zdHJpbmcKKwkgIGV4ZWMgJHtPUklHSU5BTF9DT05GSUdfU0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19ICIkMCIgJHsxKyIkQCJ9CisJZWxzZQorCSAgIyBPb3BzLiAgV2UgbG9zdCBjb21wbGV0ZWx5LCBzbyBqdXN0IHN0aWNrIHdpdGggZWNoby4KKwkgIGVjaG89ZWNobworCWZpCisgICAgICBmaQorICAgIGZpCisgIGZpCitmaQorZmkKKworIyBDb3B5IGVjaG8gYW5kIHF1b3RlIHRoZSBjb3B5IHN1aXRhYmx5IGZvciBwYXNzaW5nIHRvIGxpYnRvb2wgZnJvbQorIyB0aGUgTWFrZWZpbGUsIGluc3RlYWQgb2YgcXVvdGluZyB0aGUgb3JpZ2luYWwsIHdoaWNoIGlzIHVzZWQgbGF0ZXIuCitFQ0hPPSRlY2hvCitpZiB0ZXN0ICJYJEVDSE8iID0gIlgkQ09ORklHX1NIRUxMICQwIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KKyAgIEVDSE89IiRDT05GSUdfU0hFTEwgXFxcJFwkMCAtLWZhbGxiYWNrLWVjaG8iCitmaQorCisjIEJlIEJvdXJuZSBjb21wYXRpYmxlCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKK2VsaWYgdGVzdCAtbiAiJHtCQVNIX1ZFUlNJT04rc2V0fSIgJiYgKHNldCAtbyBwb3NpeCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHNldCAtbyBwb3NpeAorZmkKKworIyBOYW1lIG9mIHRoZSBleGVjdXRhYmxlLgorYXNfbWU9YGVjaG8gIiQwIiB8c2VkICdzLC4qW1xcL10sLCdgCisKK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQorZWNobyA+Y29uZiQkLmZpbGUKK2lmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAjIFdlIGNvdWxkIGp1c3QgY2hlY2sgZm9yIERKR1BQOyBidXQgdGhpcyB0ZXN0IGEpIHdvcmtzIGIpIGlzIG1vcmUgZ2VuZXJpYworICAjIGFuZCBjKSB3aWxsIHJlbWFpbiB2YWxpZCBvbmNlIERKR1BQIHN1cHBvcnRzIHN5bWxpbmtzIChESkdQUCAyLjA0KS4KKyAgaWYgdGVzdCAtZiBjb25mJCQuZXhlOyB0aGVuCisgICAgIyBEb24ndCB1c2UgbG4gYXQgYWxsOyB3ZSBkb24ndCBoYXZlIGFueSBsaW5rcworICAgIGFzX2xuX3M9J2NwIC1wJworICBlbHNlCisgICAgYXNfbG5fcz0nbG4gLXMnCisgIGZpCitlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19sbl9zPWxuCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCisKK2FzX2V4ZWN1dGFibGVfcD0idGVzdCAtZiIKKworIyBTdXBwb3J0IHVuc2V0IHdoZW4gcG9zc2libGUuCitpZiAoRk9PPUZPTzsgdW5zZXQgRk9PKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfdW5zZXQ9dW5zZXQKK2Vsc2UKKyAgYXNfdW5zZXQ9ZmFsc2UKK2ZpCisKKyMgTkxTIG51aXNhbmNlcy4KKyRhc191bnNldCBMQU5HIHx8IHRlc3QgIiR7TEFORytzZXR9IiAhPSBzZXQgfHwgeyBMQU5HPUM7IGV4cG9ydCBMQU5HOyB9CiskYXNfdW5zZXQgTENfQUxMIHx8IHRlc3QgIiR7TENfQUxMK3NldH0iICE9IHNldCB8fCB7IExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyB9CiskYXNfdW5zZXQgTENfVElNRSB8fCB0ZXN0ICIke0xDX1RJTUUrc2V0fSIgIT0gc2V0IHx8IHsgTENfVElNRT1DOyBleHBvcnQgTENfVElNRTsgfQorJGFzX3Vuc2V0IExDX0NUWVBFIHx8IHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgIT0gc2V0IHx8IHsgTENfQ1RZUEU9QzsgZXhwb3J0IExDX0NUWVBFOyB9CiskYXNfdW5zZXQgTEFOR1VBR0UgfHwgdGVzdCAiJHtMQU5HVUFHRStzZXR9IiAhPSBzZXQgfHwgeyBMQU5HVUFHRT1DOyBleHBvcnQgTEFOR1VBR0U7IH0KKyRhc191bnNldCBMQ19DT0xMQVRFIHx8IHRlc3QgIiR7TENfQ09MTEFURStzZXR9IiAhPSBzZXQgfHwgeyBMQ19DT0xMQVRFPUM7IGV4cG9ydCBMQ19DT0xMQVRFOyB9CiskYXNfdW5zZXQgTENfTlVNRVJJQyB8fCB0ZXN0ICIke0xDX05VTUVSSUMrc2V0fSIgIT0gc2V0IHx8IHsgTENfTlVNRVJJQz1DOyBleHBvcnQgTENfTlVNRVJJQzsgfQorJGFzX3Vuc2V0IExDX01FU1NBR0VTIHx8IHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgIT0gc2V0IHx8IHsgTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyB9CisKKyMgSUZTCisjIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLgorYXNfbmw9JworJworSUZTPSIgCSRhc19ubCIKKworIyBDRFBBVEguCiskYXNfdW5zZXQgQ0RQQVRIIHx8IHRlc3QgIiR7Q0RQQVRIK3NldH0iICE9IHNldCB8fCB7IENEUEFUSD06OyBleHBvcnQgQ0RQQVRIOyB9CisKKyMgTmFtZSBvZiB0aGUgaG9zdC4KKyMgaG9zdG5hbWUgb24gc29tZSBzeXN0ZW1zIChTVlIzLjIsIExpbnV4KSByZXR1cm5zIGEgYm9ndXMgZXhpdCBzdGF0dXMsCisjIHNvIHVuYW1lIGdldHMgcnVuIHRvby4KK2FjX2hvc3RuYW1lPWAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAorCitleGVjIDY+JjEKKworIworIyBJbml0aWFsaXphdGlvbnMuCisjCithY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCitjcm9zc19jb21waWxpbmc9bm8KK3N1YmRpcnM9CitNRkxBR1M9IE1BS0VGTEFHUz0KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisKKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KKyMgVGhpcyB2YXJpYWJsZSBzZWVtcyBvYnNvbGV0ZS4gIEl0IHNob3VsZCBwcm9iYWJseSBiZSByZW1vdmVkLCBhbmQKKyMgb25seSBhY19tYXhfc2VkX2xpbmVzIHNob3VsZCBiZSB1c2VkLgorOiAke2FjX21heF9oZXJlX2xpbmVzPTM4fQorCisjIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCithY19jcl9hej0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCithY19jcl9BWj0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCithY19jcl8wOT0nMDEyMzQ1Njc4OScKK2FjX2NyX2FsbnVtPSRhY19jcl9heiRhY19jcl9BWiRhY19jcl8wOQorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgc2ggYW5kIENQUCB2YXJpYWJsZSBuYW1lcy4KK2FjX3RyX3NoPSJzZWQgeSUqKyVwcCU7cyVbXl8kYWNfY3JfYWxudW1dJV8lZyIKK2FjX3RyX2NwcD0ic2VkIHklKiRhY19jcl9heiVQJGFjX2NyX0FaJTtzJVteXyRhY19jcl9hbG51bV0lXyVnIgorCithY191bmlxdWVfZmlsZT0iZGZ0YWJsZXMuYyIKKyMgRmFjdG9yaW5nIGRlZmF1bHQgaGVhZGVycyBmb3IgbW9zdCB0ZXN0cy4KK2FjX2luY2x1ZGVzX2RlZmF1bHQ9IlwKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaWYgU1REQ19IRUFERVJTCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbHNlCisjIGlmIEhBVkVfU1RETElCX0gKKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBlbmRpZgorI2VuZGlmCisjaWYgSEFWRV9TVFJJTkdfSAorIyBpZiAhU1REQ19IRUFERVJTICYmIEhBVkVfTUVNT1JZX0gKKyMgIGluY2x1ZGUgPG1lbW9yeS5oPgorIyBlbmRpZgorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjIGlmIEhBVkVfU1RSSU5HU19ICisjICBpbmNsdWRlIDxzdHJpbmdzLmg+CisjIGVuZGlmCisjZW5kaWYKKyNpZiBIQVZFX0lOVFRZUEVTX0gKKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorI2lmIEhBVkVfVU5JU1REX0gKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYiCisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KK2FjX2luaXRfaGVscD0KK2FjX2luaXRfdmVyc2lvbj1mYWxzZQorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2NhY2hlX2ZpbGU9L2Rldi9udWxsCitleGVjX3ByZWZpeD1OT05FCitub19jcmVhdGU9Citub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCisKKyMgSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvcHRpb25zLgorIyBUaGVzZSBhcmUgbGVmdCB1bmV4cGFuZGVkIHNvIHVzZXJzIGNhbiAibWFrZSBpbnN0YWxsIGV4ZWNfcHJlZml4PS9mb28iCisjIGFuZCBhbGwgdGhlIHZhcmlhYmxlcyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBiYXNlZCBvbiBleGVjX3ByZWZpeAorIyBieSBkZWZhdWx0IHdpbGwgYWN0dWFsbHkgY2hhbmdlLgorIyBVc2UgYnJhY2VzIGluc3RlYWQgb2YgcGFyZW5zIGJlY2F1c2Ugc2gsIHBlcmwsIGV0Yy4gYWxzbyBhY2NlcHQgdGhlbS4KK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2luZm9kaXI9JyR7cHJlZml4fS9pbmZvJworbWFuZGlyPScke3ByZWZpeH0vbWFuJworCisjIElkZW50aXR5IG9mIHRoaXMgcGFja2FnZS4KK1BBQ0tBR0VfTkFNRT0KK1BBQ0tBR0VfVEFSTkFNRT0KK1BBQ0tBR0VfVkVSU0lPTj0KK1BBQ0tBR0VfU1RSSU5HPQorUEFDS0FHRV9CVUdSRVBPUlQ9CisKK2FjX3ByZXY9Citmb3IgYWNfb3B0aW9uCitkbworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGFjX29wdGFyZz1gZXhwciAieCRhY19vcHRpb24iIDogJ3hbXj1dKj1cKC4qXCknYAorCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAkYWNfb3B0aW9uIGluCisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkX2FsaWFzIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkX2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSRhY19vcHRhcmcgOzsKKworICAtLWNvbmZpZy1jYWNoZSB8IC1DKQorICAgIGNhY2hlX2ZpbGU9Y29uZmlnLmNhY2hlIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAorICB8IC0tZGE9KikKKyAgICBkYXRhZGlyPSRhY19vcHRhcmcgOzsKKworICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKmRpc2FibGUtXCguKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY19mZWF0dXJlIiA6ICIuKlteLV8kYWNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfZmVhdHVyZSIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlIHwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJlbmFibGVfJGFjX2ZlYXR1cmU9bm8iIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY19mZWF0dXJlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZW5hYmxlLVwoW149XSpcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfZmVhdHVyZSIgOiAiLipbXi1fJGFjX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX2ZlYXR1cmUiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZSB8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAkYWNfb3B0aW9uIGluCisgICAgICAqPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJlbmFibGVfJGFjX2ZlYXR1cmU9JyRhY19vcHRhcmcnIiA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC1oKQorICAgIGFjX2luaXRfaGVscD1sb25nIDs7CisgIC1oZWxwPXIqIHwgLS1oZWxwPXIqIHwgLS1oZWw9ciogfCAtLWhlPXIqIHwgLWhyKikKKyAgICBhY19pbml0X2hlbHA9cmVjdXJzaXZlIDs7CisgIC1oZWxwPXMqIHwgLS1oZWxwPXMqIHwgLS1oZWw9cyogfCAtLWhlPXMqIHwgLWhzKikKKyAgICBhY19pbml0X2hlbHA9c2hvcnQgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3RfYWxpYXMgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0X2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9JGFjX29wdGFyZyA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAorICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCisgIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQorICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OworICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCisgIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKKyAgICBsb2NhbHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9JGFjX29wdGFyZyA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0kYWNfb3B0YXJnIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9JGFjX29wdGFyZyA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9JGFjX29wdGFyZyA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSRhY19vcHRhcmcgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0X2FsaWFzIDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXRfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC1WKQorICAgIGFjX2luaXRfdmVyc2lvbj06IDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3BhY2thZ2U9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRoLVwoW149XSpcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfcGFja2FnZSIgOiAiLipbXi1fJGFjX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3BhY2thZ2UiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICRhY19vcHRpb24gaW4KKyAgICAgICo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgIndpdGhfJGFjX3BhY2thZ2U9JyRhY19vcHRhcmcnIiA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY19wYWNrYWdlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aG91dC1cKC4qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3BhY2thZ2UiIDogIi4qW14tXyRhY19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY19wYWNrYWdlIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2UgfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgIndpdGhfJGFjX3BhY2thZ2U9bm8iIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0kYWNfb3B0YXJnIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSRhY19vcHRhcmcgOzsKKworICAtKikgeyBlY2hvICIkYXNfbWU6IGVycm9yOiB1bnJlY29nbml6ZWQgb3B0aW9uOiAkYWNfb3B0aW9uCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICA7OworCisgICo9KikKKyAgICBhY19lbnZ2YXI9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4XChbXj1dKlwpPSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfZW52dmFyIiA6ICIuKlteXyRhY19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCB2YXJpYWJsZSBuYW1lOiAkYWNfZW52dmFyIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAKKyAgICBldmFsICIkYWNfZW52dmFyPSckYWNfb3B0YXJnJyIKKyAgICBleHBvcnQgJGFjX2VudnZhciA7OworCisgICopCisgICAgIyBGSVhNRTogc2hvdWxkIGJlIHJlbW92ZWQgaW4gYXV0b2NvbmYgMy4wLgorICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogeW91IHNob3VsZCB1c2UgLS1idWlsZCwgLS1ob3N0LCAtLXRhcmdldCIgPiYyCisgICAgZXhwciAieCRhY19vcHRpb24iIDogIi4qW14tLl8kYWNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IGludmFsaWQgaG9zdCB0eXBlOiAkYWNfb3B0aW9uIiA+JjIKKyAgICA6ICR7YnVpbGRfYWxpYXM9JGFjX29wdGlvbn0gJHtob3N0X2FsaWFzPSRhY19vcHRpb259ICR7dGFyZ2V0X2FsaWFzPSRhY19vcHRpb259CisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICBhY19vcHRpb249LS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgCisgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAkYWNfb3B0aW9uIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworIyBCZSBzdXJlIHRvIGhhdmUgYWJzb2x1dGUgcGF0aHMuCitmb3IgYWNfdmFyIGluIGJpbmRpciBzYmluZGlyIGxpYmV4ZWNkaXIgZGF0YWRpciBzeXNjb25mZGlyIHNoYXJlZHN0YXRlZGlyIFwKKyAgICAgICAgICAgICAgbG9jYWxzdGF0ZWRpciBsaWJkaXIgaW5jbHVkZWRpciBvbGRpbmNsdWRlZGlyIGluZm9kaXIgbWFuZGlyIFwKKyAgICAgICAgICAgICAgZXhlY19wcmVmaXggcHJlZml4CitkbworICBldmFsIGFjX3ZhbD0kYGVjaG8gJGFjX3ZhcmAKKyAgY2FzZSAkYWNfdmFsIGluCisgICAgW1xcLyRdKiB8ID86W1xcL10qICkgOzsKKyAgICBOT05FICkgOzsKKyAgICAqKSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBleHBlY3RlZCBhbiBhYnNvbHV0ZSBwYXRoIGZvciAtLSRhY192YXI6ICRhY192YWwiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKKyAgZXNhYworZG9uZQorCisjIFRoZXJlIG1pZ2h0IGJlIHBlb3BsZSB3aG8gZGVwZW5kIG9uIHRoZSBvbGQgYnJva2VuIGJlaGF2aW9yOiBgJGhvc3QnCisjIHVzZWQgdG8gaG9sZCB0aGUgYXJndW1lbnQgb2YgLS1ob3N0IGV0Yy4KK2J1aWxkPSRidWlsZF9hbGlhcworaG9zdD0kaG9zdF9hbGlhcwordGFyZ2V0PSR0YXJnZXRfYWxpYXMKKworIyBGSVhNRTogc2hvdWxkIGJlIHJlbW92ZWQgaW4gYXV0b2NvbmYgMy4wLgoraWYgdGVzdCAieCRob3N0X2FsaWFzIiAhPSB4OyB0aGVuCisgIGlmIHRlc3QgIngkYnVpbGRfYWxpYXMiID0geDsgdGhlbgorICAgIGNyb3NzX2NvbXBpbGluZz1tYXliZQorICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogSWYgeW91IHdhbnRlZCB0byBzZXQgdGhlIC0tYnVpbGQgdHlwZSwgZG9uJ3QgdXNlIC0taG9zdC4KKyAgICBJZiBhIGNyb3NzIGNvbXBpbGVyIGlzIGRldGVjdGVkIHRoZW4gY3Jvc3MgY29tcGlsZSBtb2RlIHdpbGwgYmUgdXNlZC4iID4mMgorICBlbGlmIHRlc3QgIngkYnVpbGRfYWxpYXMiICE9ICJ4JGhvc3RfYWxpYXMiOyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPXllcworICBmaQorZmkKKworYWNfdG9vbF9wcmVmaXg9Cit0ZXN0IC1uICIkaG9zdF9hbGlhcyIgJiYgYWNfdG9vbF9wcmVmaXg9JGhvc3RfYWxpYXMtCisKK3Rlc3QgIiRzaWxlbnQiID0geWVzICYmIGV4ZWMgNj4vZGV2L251bGwKKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCisgIGFjX3Byb2c9JDAKKyAgYWNfY29uZmRpcj1gZWNobyAiJGFjX3Byb2ciIHwgc2VkICdzJVtcXC9dW15cXC9dW15cXC9dKiQlJSdgCisgIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgZWxzZQorICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICBmaQorZmkKK3NyY2Rpcj1gZWNobyAiJHNyY2RpciIgfCBzZWQgJ3MlXChbXlxcL11cKVtcXC9dKiQlXDElJ2AKK2FjX2Vudl9idWlsZF9hbGlhc19zZXQ9JHtidWlsZF9hbGlhcytzZXR9CithY19lbnZfYnVpbGRfYWxpYXNfdmFsdWU9JGJ1aWxkX2FsaWFzCithY19jdl9lbnZfYnVpbGRfYWxpYXNfc2V0PSR7YnVpbGRfYWxpYXMrc2V0fQorYWNfY3ZfZW52X2J1aWxkX2FsaWFzX3ZhbHVlPSRidWlsZF9hbGlhcworYWNfZW52X2hvc3RfYWxpYXNfc2V0PSR7aG9zdF9hbGlhcytzZXR9CithY19lbnZfaG9zdF9hbGlhc192YWx1ZT0kaG9zdF9hbGlhcworYWNfY3ZfZW52X2hvc3RfYWxpYXNfc2V0PSR7aG9zdF9hbGlhcytzZXR9CithY19jdl9lbnZfaG9zdF9hbGlhc192YWx1ZT0kaG9zdF9hbGlhcworYWNfZW52X3RhcmdldF9hbGlhc19zZXQ9JHt0YXJnZXRfYWxpYXMrc2V0fQorYWNfZW52X3RhcmdldF9hbGlhc192YWx1ZT0kdGFyZ2V0X2FsaWFzCithY19jdl9lbnZfdGFyZ2V0X2FsaWFzX3NldD0ke3RhcmdldF9hbGlhcytzZXR9CithY19jdl9lbnZfdGFyZ2V0X2FsaWFzX3ZhbHVlPSR0YXJnZXRfYWxpYXMKK2FjX2Vudl9DQ19zZXQ9JHtDQytzZXR9CithY19lbnZfQ0NfdmFsdWU9JENDCithY19jdl9lbnZfQ0Nfc2V0PSR7Q0Mrc2V0fQorYWNfY3ZfZW52X0NDX3ZhbHVlPSRDQworYWNfZW52X0NGTEFHU19zZXQ9JHtDRkxBR1Mrc2V0fQorYWNfZW52X0NGTEFHU192YWx1ZT0kQ0ZMQUdTCithY19jdl9lbnZfQ0ZMQUdTX3NldD0ke0NGTEFHUytzZXR9CithY19jdl9lbnZfQ0ZMQUdTX3ZhbHVlPSRDRkxBR1MKK2FjX2Vudl9MREZMQUdTX3NldD0ke0xERkxBR1Mrc2V0fQorYWNfZW52X0xERkxBR1NfdmFsdWU9JExERkxBR1MKK2FjX2N2X2Vudl9MREZMQUdTX3NldD0ke0xERkxBR1Mrc2V0fQorYWNfY3ZfZW52X0xERkxBR1NfdmFsdWU9JExERkxBR1MKK2FjX2Vudl9DUFBGTEFHU19zZXQ9JHtDUFBGTEFHUytzZXR9CithY19lbnZfQ1BQRkxBR1NfdmFsdWU9JENQUEZMQUdTCithY19jdl9lbnZfQ1BQRkxBR1Nfc2V0PSR7Q1BQRkxBR1Mrc2V0fQorYWNfY3ZfZW52X0NQUEZMQUdTX3ZhbHVlPSRDUFBGTEFHUworYWNfZW52X0NQUF9zZXQ9JHtDUFArc2V0fQorYWNfZW52X0NQUF92YWx1ZT0kQ1BQCithY19jdl9lbnZfQ1BQX3NldD0ke0NQUCtzZXR9CithY19jdl9lbnZfQ1BQX3ZhbHVlPSRDUFAKKworIworIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgorIworaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAibG9uZyI7IHRoZW4KKyAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICAgIyBUaGUgbGlzdCBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgaGFzIGJlZW4gdHJpbW1lZCB0byByZW1vdmUgbWFueQorICAgICMgb3B0aW9ucyB0aGF0IGFyZSB0b3RhbGx5IGlycmVsZXZhbnQgdG8gUENSRSAoZS5nLiByZWxhdGluZyB0byBYKSwKKyAgICAjIG9yIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IGl0cyBNYWtlZmlsZS4KKyAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICBjYXQgPDxFT0YKK1xgY29uZmlndXJlJyBjb25maWd1cmVzIHRoaXMgcGFja2FnZSB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCisKK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgorCitUbyBhc3NpZ24gZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuLCBDQywgQ0ZMQUdTLi4uKSwgc3BlY2lmeSB0aGVtIGFzCitWQVI9VkFMVUUuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZSB1c2VmdWwgdmFyaWFibGVzLgorCitEZWZhdWx0cyBmb3IgdGhlIG9wdGlvbnMgYXJlIHNwZWNpZmllZCBpbiBicmFja2V0cy4KKworQ29uZmlndXJhdGlvbjoKKyAgLWgsIC0taGVscCAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKKyAgICAgIC0taGVscD1zaG9ydCAgICAgICAgZGlzcGxheSBvcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZQorICAgICAgLS1oZWxwPXJlY3Vyc2l2ZSAgICBkaXNwbGF5IHRoZSBzaG9ydCBoZWxwIG9mIGFsbCB0aGUgaW5jbHVkZWQgcGFja2FnZXMKKyAgLVYsIC0tdmVyc2lvbiAgICAgICAgICAgZGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisgIC1xLCAtLXF1aWV0LCAtLXNpbGVudCAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAgICAgLS1jYWNoZS1maWxlPUZJTEUgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRSBbZGlzYWJsZWRdCisgIC1DLCAtLWNvbmZpZy1jYWNoZSAgICAgIGFsaWFzIGZvciBcYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnCisgIC1uLCAtLW5vLWNyZWF0ZSAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgICAgICAtLXNyY2Rpcj1ESVIgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIFxgLi4nXQorCitFT0YKKworICBjYXQgPDxFT0YKK0luc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVhdCisKK0J5IGRlZmF1bHQsIFxgbWFrZSBpbnN0YWxsJyB3aWxsIGluc3RhbGwgYWxsIHRoZSBmaWxlcyBpbgorXGAkYWNfZGVmYXVsdF9wcmVmaXgvYmluJywgXGAkYWNfZGVmYXVsdF9wcmVmaXgvbGliJyBldGMuICBZb3UgY2FuIHNwZWNpZnkKK2FuIGluc3RhbGxhdGlvbiBwcmVmaXggb3RoZXIgdGhhbiBcYCRhY19kZWZhdWx0X3ByZWZpeCcgdXNpbmcgXGAtLXByZWZpeCcsCitmb3IgaW5zdGFuY2UgXGAtLXByZWZpeD1cJEhPTUUnLgorCitGb3IgYmV0dGVyIGNvbnRyb2wsIHVzZSB0aGUgb3B0aW9ucyBiZWxvdy4KKworRmluZSB0dW5pbmcgb2YgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKKyAgLS1iaW5kaXI9RElSICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIFtFUFJFRklYL2Jpbl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgIEMgaGVhZGVyIGZpbGVzIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBbUFJFRklYL21hbl0KK0VPRgorCisgIGNhdCA8PFxFT0YKKworRU9GCitmaQorCitpZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgorCisgIGNhdCA8PFxFT0YKKworT3B0aW9uYWwgRmVhdHVyZXM6CisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLWVuYWJsZS11dGY4ICAgICAgICAgICBlbmFibGUgVVRGOCBzdXBwb3J0IChpbmNvbXBsZXRlKQorICAtLWVuYWJsZS1uZXdsaW5lLWlzLWNyICB1c2UgQ1IgYXMgdGhlIG5ld2xpbmUgY2hhcmFjdGVyCisgIC0tZW5hYmxlLW5ld2xpbmUtaXMtbGYgIHVzZSBMRiBhcyB0aGUgbmV3bGluZSBjaGFyYWN0ZXIKKyAgLS1lbmFibGUtc2hhcmVkICAgICAgIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgZGVmYXVsdD15ZXMKKyAgLS1lbmFibGUtc3RhdGljICAgICAgIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgZGVmYXVsdD15ZXMKKyAgLS1lbmFibGUtZmFzdC1pbnN0YWxsICAgICAgIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBkZWZhdWx0PXllcworICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBhdm9pZCBsb2NraW5nIChtaWdodCBicmVhayBwYXJhbGxlbCBidWlsZHMpCisKK09wdGlvbmFsIFBhY2thZ2VzOgorICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgZGVmYXVsdD1ubworICAtLXdpdGgtcGljICAgICAgICAgICAgICB0cnkgdG8gdXNlIG9ubHkgUElDL25vbi1QSUMgb2JqZWN0cyBkZWZhdWx0PXVzZSBib3RoCisKK1NvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgorICBDQyAgICAgICAgICBDIGNvbXBpbGVyIGNvbW1hbmQKKyAgQ0ZMQUdTICAgICAgQyBjb21waWxlciBmbGFncworICBMREZMQUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKKyAgICAgICAgICAgICAgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPgorICBDUFBGTEFHUyAgICBDL0MrKyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+IGlmIHlvdSBoYXZlCisgICAgICAgICAgICAgIGhlYWRlcnMgaW4gYSBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGluY2x1ZGUgZGlyPgorICBDUFAgICAgICAgICBDIHByZXByb2Nlc3NvcgorCitVc2UgdGhlc2UgdmFyaWFibGVzIHRvIG92ZXJyaWRlIHRoZSBjaG9pY2VzIG1hZGUgYnkgYGNvbmZpZ3VyZScgb3IgdG8gaGVscAoraXQgdG8gZmluZCBsaWJyYXJpZXMgYW5kIHByb2dyYW1zIHdpdGggbm9uc3RhbmRhcmQgbmFtZXMvbG9jYXRpb25zLgorCitFT0YKK2ZpCisKK2lmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gInJlY3Vyc2l2ZSI7IHRoZW4KKyAgIyBJZiB0aGVyZSBhcmUgc3ViZGlycywgcmVwb3J0IHRoZWlyIHNwZWNpZmljIC0taGVscC4KKyAgYWNfcG9wZGlyPWBwd2RgCisgIGZvciBhY19zdWJkaXIgaW4gOiAkYWNfc3ViZGlyc19hbGw7IGRvIHRlc3QgIngkYWNfc3ViZGlyIiA9IHg6ICYmIGNvbnRpbnVlCisgICAgY2QgJGFjX3N1YmRpcgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gLyRhY19zdWJkaXIuCisgICAgYWNfZG90cz1gZWNobyAkYWNfc3ViZGlyIHwKKyAgICAgICAgICAgICBzZWQgJ3MsXlwuLywsO3MsW14vXSQsJi8sO3MsW14vXSovLC4uLyxnJ2AKKworICAgIGNhc2UgJHNyY2RpciBpbgorICAgIC4pICMgTm8gLS1zcmNkaXIgb3B0aW9uLiAgV2UgYXJlIGJ1aWxkaW5nIGluIHBsYWNlLgorICAgICAgYWNfc3ViX3NyY2Rpcj0kc3JjZGlyIDs7CisgICAgW1xcL10qIHwgPzpbXFwvXSogKSAjIEFic29sdXRlIHBhdGguCisgICAgICBhY19zdWJfc3JjZGlyPSRzcmNkaXIvJGFjX3N1YmRpciA7OworICAgICopICMgUmVsYXRpdmUgcGF0aC4KKyAgICAgIGFjX3N1Yl9zcmNkaXI9JGFjX2RvdHMkc3JjZGlyLyRhY19zdWJkaXIgOzsKKyAgICBlc2FjCisKKyAgICAjIENoZWNrIGZvciBndWVzdGVkIGNvbmZpZ3VyZTsgb3RoZXJ3aXNlIGdldCBDeWdudXMgc3R5bGUgY29uZmlndXJlLgorICAgIGlmIHRlc3QgLWYgJGFjX3N1Yl9zcmNkaXIvY29uZmlndXJlLmdudTsgdGhlbgorICAgICAgZWNobworICAgICAgJFNIRUxMICRhY19zdWJfc3JjZGlyL2NvbmZpZ3VyZS5nbnUgIC0taGVscD1yZWN1cnNpdmUKKyAgICBlbGlmIHRlc3QgLWYgJGFjX3N1Yl9zcmNkaXIvY29uZmlndXJlOyB0aGVuCisgICAgICBlY2hvCisgICAgICAkU0hFTEwgJGFjX3N1Yl9zcmNkaXIvY29uZmlndXJlICAtLWhlbHA9cmVjdXJzaXZlCisgICAgZWxpZiB0ZXN0IC1mICRhY19zdWJfc3JjZGlyL2NvbmZpZ3VyZS5hYyB8fAorICAgICAgICAgICB0ZXN0IC1mICRhY19zdWJfc3JjZGlyL2NvbmZpZ3VyZS5pbjsgdGhlbgorICAgICAgZWNobworICAgICAgJGFjX2NvbmZpZ3VyZSAtLWhlbHAKKyAgICBlbHNlCisgICAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX3N1YmRpciIgPiYyCisgICAgZmkKKyAgICBjZCAkYWNfcG9wZGlyCisgIGRvbmUKK2ZpCisKK3Rlc3QgLW4gIiRhY19pbml0X2hlbHAiICYmIGV4aXQgMAoraWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgorICBjYXQgPDxcRU9GCisKK0NvcHlyaWdodCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCitFT0YKKyAgZXhpdCAwCitmaQorZXhlYyA1PmNvbmZpZy5sb2cKK2NhdCA+JjUgPDxFT0YKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorCitJdCB3YXMgY3JlYXRlZCBieSAkYXNfbWUsIHdoaWNoIHdhcworZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjUwLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCisKKyAgJCAkMCAkQAorCitFT0YKK3sKK2NhdCA8PF9BU1VOQU1FCisjIyAtLS0tLS0tLS0tICMjCisjIyBQbGF0Zm9ybS4gICMjCisjIyAtLS0tLS0tLS0tICMjCisKK2hvc3RuYW1lID0gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisvYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGwgICAgIHx8IGVjaG8gdW5rbm93bmAKKworL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbCAgICAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAoraG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsICAgICAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi9tYWNoaW5lICAgICAgICAgICA9IGAoL2Jpbi9tYWNoaW5lKSAyPi9kZXYvbnVsbCAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGwgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorCitQQVRIID0gJFBBVEgKKworX0FTVU5BTUUKK30gPiY1CisKK2NhdCA+JjUgPDxFT0YKKyMjIC0tLS0tLS0tLS0tLSAjIworIyMgQ29yZSB0ZXN0cy4gICMjCisjIyAtLS0tLS0tLS0tLS0gIyMKKworRU9GCisKKyMgS2VlcCBhIHRyYWNlIG9mIHRoZSBjb21tYW5kIGxpbmUuCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGEtY2hhcmFjdGVycy4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorYWNfc2VwPQorZm9yIGFjX2FyZworZG8KKyAgY2FzZSAkYWNfYXJnIGluCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykgOzsKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OworICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP1wiXCddKikKKyAgICBhY19hcmc9YGVjaG8gIiRhY19hcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgCisgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyRhY19zZXAnJGFjX2FyZyciCisgICAgYWNfc2VwPSIgIiA7OworICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzJGFjX3NlcCRhY19hcmciCisgICAgIGFjX3NlcD0iICIgOzsKKyAgZXNhYworICAjIEdldCByaWQgb2YgdGhlIGxlYWRpbmcgc3BhY2UuCitkb25lCisKKyMgV2hlbiBpbnRlcnJ1cHRlZCBvciBleGl0J2QsIGNsZWFudXAgdGVtcG9yYXJ5IGZpbGVzLCBhbmQgY29tcGxldGUKKyMgY29uZmlnLmxvZy4gIFdlIHJlbW92ZSBjb21tZW50cyBiZWNhdXNlIGFueXdheSB0aGUgcXVvdGVzIGluIHRoZXJlCisjIHdvdWxkIGNhdXNlIHByb2JsZW1zIG9yIGxvb2sgdWdseS4KK3RyYXAgJ2V4aXRfc3RhdHVzPSQ/CisgICMgU2F2ZSBpbnRvIGNvbmZpZy5sb2cgc29tZSBpbmZvcm1hdGlvbiB0aGF0IG1pZ2h0IGhlbHAgaW4gZGVidWdnaW5nLgorICBlY2hvID4mNQorICBlY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIyIgPiY1CisgIGVjaG8gIiMjIENhY2hlIHZhcmlhYmxlcy4gICMjIiA+JjUKKyAgZWNobyAiIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMiID4mNQorICBlY2hvID4mNQorICAjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAoreworICAoc2V0KSAyPiYxIHwKKyAgICBjYXNlIGAoYWNfc3BhY2U9JyInIicgJyInIic7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCisgICAgKmFjX3NwYWNlPVwgKikKKyAgICAgIHNlZCAtbiBcCisgICAgICAgICJzLyciJyInLyciJyInXFxcXCciJyInJyInIicvZzsKKyAgICAJICBzL15cXChbXyRhY19jcl9hbG51bV0qX2N2X1tfJGFjX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSciJyInXFwyJyInIicvcCIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHNlZCAtbiBcCisgICAgICAgICJzL15cXChbXyRhY19jcl9hbG51bV0qX2N2X1tfJGFjX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPVxcMi9wIgorICAgICAgOzsKKyAgICBlc2FjOworfSA+JjUKKyAgc2VkICIvXiQvZCIgY29uZmRlZnMuaCA+Y29uZnRlc3QubG9nCisgIGlmIHRlc3QgLXMgY29uZnRlc3QubG9nOyB0aGVuCisgICAgZWNobyA+JjUKKyAgICBlY2hvICIjIyAtLS0tLS0tLS0tLS0gIyMiID4mNQorICAgIGVjaG8gIiMjIGNvbmZkZWZzLmguICAjIyIgPiY1CisgICAgZWNobyAiIyMgLS0tLS0tLS0tLS0tICMjIiA+JjUKKyAgICBlY2hvID4mNQorICAgIGNhdCBjb25mdGVzdC5sb2cgPiY1CisgIGZpCisgIChlY2hvOyBlY2hvKSA+JjUKKyAgdGVzdCAiJGFjX3NpZ25hbCIgIT0gMCAmJgorICAgIGVjaG8gIiRhc19tZTogY2F1Z2h0IHNpZ25hbCAkYWNfc2lnbmFsIiA+JjUKKyAgZWNobyAiJGFzX21lOiBleGl0ICRleGl0X3N0YXR1cyIgPiY1CisgIHJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgorICAgIGV4aXQgJGV4aXRfc3RhdHVzCisgICAgICcgMAorZm9yIGFjX3NpZ25hbCBpbiAxIDIgMTMgMTU7IGRvCisgIHRyYXAgJ2FjX3N0YXR1cz0kPzsgYWNfc2lnbmFsPSckYWNfc2lnbmFsJzsgeyAoZXhpdCAkYWNfc3RhdHVzKTsgZXhpdCAkYWNfc3RhdHVzOyB9JyAkYWNfc2lnbmFsCitkb25lCithY19zaWduYWw9MAorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KK2VjaG8gPmNvbmZkZWZzLmgKKworIyBMZXQgdGhlIHNpdGUgZmlsZSBzZWxlY3QgYW4gYWx0ZXJuYXRlIGNhY2hlIGZpbGUgaWYgaXQgd2FudHMgdG8uCisjIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgoraWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZWxzZQorICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZmkKK2ZpCitmb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KKyAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICB7IGVjaG8gIiRhc19tZToxMDEyOiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNjt9CisgICAgY2F0ICIkYWNfc2l0ZV9maWxlIiA+JjUKKyAgICAuICIkYWNfc2l0ZV9maWxlIgorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwKKyAgIyBmaWxlcyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuCisgIGlmIHRlc3QgLWYgIiRjYWNoZV9maWxlIjsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOjEwMjM6IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4KKyAgICAgIFtcXC9dKiB8ID86W1xcL10qICkgLiAkY2FjaGVfZmlsZTs7CisgICAgICAqKSAgICAgICAgICAgICAgICAgICAgICAuIC4vJGNhY2hlX2ZpbGU7OworICAgIGVzYWMKKyAgZmkKK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6MTAzMTogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgPiRjYWNoZV9maWxlCitmaQorCisjIENoZWNrIHRoYXQgdGhlIHByZWNpb3VzIHZhcmlhYmxlcyBzYXZlZCBpbiB0aGUgY2FjaGUgaGF2ZSBrZXB0IHRoZSBzYW1lCisjIHZhbHVlLgorYWNfc3VnZ2VzdF9yZW1vdmluZ19jYWNoZT1mYWxzZQorZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8CisgICAgICAgICAgICAgICBzZWQgLW4gJ3MvXmFjX2Vudl9cKFthLXpBLVpfMC05XSpcKV9zZXQ9LiovXDEvcCdgOyBkbworICBldmFsIGFjX29sZF9zZXQ9XCRhY19jdl9lbnZfJHthY192YXJ9X3NldAorICBldmFsIGFjX25ld19zZXQ9XCRhY19lbnZfJHthY192YXJ9X3NldAorICBldmFsIGFjX29sZF92YWw9IlwkYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZSIKKyAgZXZhbCBhY19uZXdfdmFsPSJcJGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWUiCisgIGNhc2UgJGFjX29sZF9zZXQsJGFjX25ld19zZXQgaW4KKyAgICBzZXQsKQorICAgICAgeyBlY2hvICIkYXNfbWU6MTA0NzogV0FSTklORzogXGAkYWNfdmFyJyB3YXMgc2V0IHRvIFxgJGFjX29sZF92YWwnIGluIHRoZSBwcmV2aW91cyBydW4iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KKyAgICAgIGFjX3N1Z2dlc3RfcmVtb3ZpbmdfY2FjaGU9OiA7OworICAgICxzZXQpCisgICAgICB7IGVjaG8gIiRhc19tZToxMDUxOiBXQVJOSU5HOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9CisgICAgICBhY19zdWdnZXN0X3JlbW92aW5nX2NhY2hlPTogOzsKKyAgICAsKTs7CisgICAgKikKKyAgICAgIGlmIHRlc3QgIngkYWNfb2xkX3ZhbCIgIT0gIngkYWNfbmV3X3ZhbCI7IHRoZW4KKyAgICAgICAgeyBlY2hvICIkYXNfbWU6MTA1NzogV0FSTklORzogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9CisgICAgICAgIHsgZWNobyAiJGFzX21lOjEwNTk6IFdBUk5JTkc6ICAgZm9ybWVyIHZhbHVlOiAgJGFjX29sZF92YWwiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAgIGZvcm1lciB2YWx1ZTogICRhY19vbGRfdmFsIiA+JjI7fQorICAgICAgICB7IGVjaG8gIiRhc19tZToxMDYxOiBXQVJOSU5HOiAgIGN1cnJlbnQgdmFsdWU6ICRhY19uZXdfdmFsIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogICBjdXJyZW50IHZhbHVlOiAkYWNfbmV3X3ZhbCIgPiYyO30KKyAgICAgICAgYWNfc3VnZ2VzdF9yZW1vdmluZ19jYWNoZT06CisgICAgICBmaTs7CisgIGVzYWMKK2RvbmUKK2lmICRhY19zdWdnZXN0X3JlbW92aW5nX2NhY2hlOyB0aGVuCisgIHsgZWNobyAiJGFzX21lOjEwNjg6IFdBUk5JTkc6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiYyO30KKyAgeyBlY2hvICIkYXNfbWU6MTA3MDogV0FSTklORzogY29uc2lkZXIgcmVtb3ZpbmcgJGNhY2hlX2ZpbGUgYW5kIHN0YXJ0aW5nIG92ZXIiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjb25zaWRlciByZW1vdmluZyAkY2FjaGVfZmlsZSBhbmQgc3RhcnRpbmcgb3ZlciIgPiYyO30KK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworY2FzZSBgZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsM2AsYGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsM2AgaW4KKyAgKmMqLC1uKikgRUNIT19OPSBFQ0hPX0M9JworJyBFQ0hPX1Q9JwknIDs7CisgICpjKiwqICApIEVDSE9fTj0tbiBFQ0hPX0M9IEVDSE9fVD0gOzsKKyAgKikgICAgICBFQ0hPX049IEVDSE9fQz0nXGMnIEVDSE9fVD0gOzsKK2VzYWMKK2VjaG8gIiMhICRTSEVMTCIgPmNvbmZ0ZXN0LnNoCitlY2hvICAiZXhpdCAwIiAgID4+Y29uZnRlc3Quc2gKK2NobW9kICt4IGNvbmZ0ZXN0LnNoCitpZiB7IChlY2hvICIkYXNfbWU6MTA4OTogUEFUSD1cIi47LlwiOyBjb25mdGVzdC5zaCIpID4mNQorICAoUEFUSD0iLjsuIjsgY29uZnRlc3Quc2gpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZToxMDkyOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KKyAgYWNfcGF0aF9zZXBhcmF0b3I9JzsnCitlbHNlCisgIGFjX3BhdGhfc2VwYXJhdG9yPToKK2ZpCitQQVRIX1NFUEFSQVRPUj0iJGFjX3BhdGhfc2VwYXJhdG9yIgorcm0gLWYgY29uZnRlc3Quc2gKKworYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyBjb25maWcuaDpjb25maWcuaW4iCisKK1BDUkVfTUFKT1I9MworUENSRV9NSU5PUj05CitQQ1JFX0RBVEU9MDItSmFuLTIwMDIKK1BDUkVfVkVSU0lPTj0ke1BDUkVfTUFKT1J9LiR7UENSRV9NSU5PUn0KKworUENSRV9MSUJfVkVSU0lPTj0wOjE6MAorUENSRV9QT1NJWExJQl9WRVJTSU9OPTA6MDowCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1nY2M7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZToxMTE5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBhY19zYXZlX0lGUz0kSUZTOyBJRlM9JGFjX3BhdGhfc2VwYXJhdG9yCithY19kdW1teT0iJFBBVEgiCitmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgSUZTPSRhY19zYXZlX0lGUworICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAkYXNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkIiB8fCBjb250aW51ZQorYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1nY2MiCitlY2hvICIkYXNfbWU6MTEzNDogZm91bmQgJGFjX2Rpci8kYWNfd29yZCIgPiY1CiticmVhaworZG9uZQorCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZToxMTQyOiByZXN1bHQ6ICRDQyIgPiY1CitlY2hvICIke0VDSE9fVH0kQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6MTE0NTogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6MTE1NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgorYWNfZHVtbXk9IiRQQVRIIgorZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgIElGUz0kYWNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKK2FjX2N2X3Byb2dfYWNfY3RfQ0M9ImdjYyIKK2VjaG8gIiRhc19tZToxMTY5OiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKK2JyZWFrCitkb25lCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOjExNzc6IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9DQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZToxMTgwOiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgQ0M9JGFjX2N0X0NDCitlbHNlCisgIENDPSIkYWNfY3ZfcHJvZ19DQyIKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Y2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Y2M7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZToxMTkzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBhY19zYXZlX0lGUz0kSUZTOyBJRlM9JGFjX3BhdGhfc2VwYXJhdG9yCithY19kdW1teT0iJFBBVEgiCitmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgSUZTPSRhY19zYXZlX0lGUworICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAkYXNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkIiB8fCBjb250aW51ZQorYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1jYyIKK2VjaG8gIiRhc19tZToxMjA4OiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKK2JyZWFrCitkb25lCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOjEyMTY6IHJlc3VsdDogJENDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZToxMjE5OiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19DQyI7IHRoZW4KKyAgYWNfY3RfQ0M9JENDCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6MTIyODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgorYWNfZHVtbXk9IiRQQVRIIgorZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgIElGUz0kYWNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKK2FjX2N2X3Byb2dfYWNfY3RfQ0M9ImNjIgorZWNobyAiJGFzX21lOjEyNDM6IGZvdW5kICRhY19kaXIvJGFjX3dvcmQiID4mNQorYnJlYWsKK2RvbmUKKworZmkKK2ZpCithY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBlY2hvICIkYXNfbWU6MTI1MTogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0NDIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOjEyNTQ6IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworICBDQz0kYWNfY3RfQ0MKK2Vsc2UKKyAgQ0M9IiRhY19jdl9wcm9nX0NDIgorZmkKKworZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZToxMjY3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBhY19wcm9nX3JlamVjdGVkPW5vCisgIGFjX3NhdmVfSUZTPSRJRlM7IElGUz0kYWNfcGF0aF9zZXBhcmF0b3IKK2FjX2R1bW15PSIkUEFUSCIKK2ZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICBJRlM9JGFjX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICRhc19leGVjdXRhYmxlX3AgIiRhY19kaXIvJGFjX3dvcmQiIHx8IGNvbnRpbnVlCitpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKyAgY29udGludWUKK2ZpCithY19jdl9wcm9nX0NDPSJjYyIKK2VjaG8gIiRhc19tZToxMjg3OiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKK2JyZWFrCitkb25lCisKK2lmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KKyAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgorICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKKyAgc2hpZnQKKyAgaWYgdGVzdCAkIyAhPSAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAkezErIiRAIn0KKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOjEzMDk6IHJlc3VsdDogJENDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZToxMzEyOiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgZm9yIGFjX3Byb2cgaW4gY2wKKyAgZG8KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOjEzMjM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIGFjX3NhdmVfSUZTPSRJRlM7IElGUz0kYWNfcGF0aF9zZXBhcmF0b3IKK2FjX2R1bW15PSIkUEFUSCIKK2ZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICBJRlM9JGFjX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICRhc19leGVjdXRhYmxlX3AgIiRhY19kaXIvJGFjX3dvcmQiIHx8IGNvbnRpbnVlCithY19jdl9wcm9nX0NDPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKK2VjaG8gIiRhc19tZToxMzM4OiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKK2JyZWFrCitkb25lCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOjEzNDY6IHJlc3VsdDogJENDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZToxMzQ5OiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgICB0ZXN0IC1uICIkQ0MiICYmIGJyZWFrCisgIGRvbmUKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICBmb3IgYWNfcHJvZyBpbiBjbAorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZToxMzYyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBhY19zYXZlX0lGUz0kSUZTOyBJRlM9JGFjX3BhdGhfc2VwYXJhdG9yCithY19kdW1teT0iJFBBVEgiCitmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgSUZTPSRhY19zYXZlX0lGUworICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAkYXNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkIiB8fCBjb250aW51ZQorYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX3Byb2ciCitlY2hvICIkYXNfbWU6MTM3NzogZm91bmQgJGFjX2Rpci8kYWNfd29yZCIgPiY1CiticmVhaworZG9uZQorCitmaQorZmkKK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCitpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZToxMzg1OiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6MTM4ODogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIHRlc3QgLW4gIiRhY19jdF9DQyIgJiYgYnJlYWsKK2RvbmUKKworICBDQz0kYWNfY3RfQ0MKK2ZpCisKK2ZpCisKK3Rlc3QgLXogIiRDQyIgJiYgeyB7IGVjaG8gIiRhc19tZToxNDAwOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSAxNDA1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5leGUiCisjIFRyeSB0byBjcmVhdGUgYW4gZXhlY3V0YWJsZSB3aXRob3V0IC1vIGZpcnN0LCBkaXNyZWdhcmQgYS5vdXQuCisjIEl0IHdpbGwgaGVscCB1cyBkaWFnbm9zZSBicm9rZW4gY29tcGlsZXIsIGFuZCBmaW5kaW5nIG91dCBhbiBpbnR1aXRpb24KKyMgb2YgZXhlZXh0LgorZWNobyAiJGFzX21lOjE0MjE6IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQuLi4gJEVDSE9fQyIgPiY2CithY19saW5rX2RlZmF1bHQ9YGVjaG8gIiRhY19saW5rIiB8IHNlZCAncy8gLW8gKmNvbmZ0ZXN0W14gXSovLydgCitpZiB7IChldmFsIGVjaG8gIiRhc19tZToxNDI0OiBcIiRhY19saW5rX2RlZmF1bHRcIiIpID4mNQorICAoZXZhbCAkYWNfbGlua19kZWZhdWx0KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6MTQyNzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisgIGZvciBhY19maWxlIGluIGBscyBhLmV4ZSBjb25mdGVzdC5leGUgYS4qIGNvbmZ0ZXN0IGNvbmZ0ZXN0LiogMj4vZGV2L251bGxgOyBkbworICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi5vIHwgKi5vYmogfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiApIDs7CisgICAgYS5vdXQgKSAjIFdlIGZvdW5kIHRoZSBkZWZhdWx0IGV4ZWN1dGFibGUsIGJ1dCBleGVleHQ9JycgaXMgbW9zdAorICAgICAgICAgICAgIyBjZXJ0YWlubHkgcmlnaHQuCisgICAgICAgICAgICBicmVhazs7CisgICAgKi4qICkgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCisgICAgICAgICAgZXhwb3J0IGFjX2N2X2V4ZWV4dAorICAgICAgICAgIGJyZWFrOzsKKyAgICAqICkgYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK3sgeyBlY2hvICIkYXNfbWU6MTQ0NDogZXJyb3I6IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcyIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMiID4mMjt9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQorZmkKKworYWNfZXhlZXh0PSRhY19jdl9leGVleHQKK2VjaG8gIiRhc19tZToxNDUwOiByZXN1bHQ6ICRhY19maWxlIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19maWxlIiA+JjYKKworIyBDaGVjayB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCisjIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCitlY2hvICIkYXNfbWU6MTQ1NTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3JrcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MuLi4gJEVDSE9fQyIgPiY2CisjIEZJWE1FOiBUaGVzZSBjcm9zcyBjb21waWxlciBoYWNrcyBzaG91bGQgYmUgcmVtb3ZlZCBmb3IgQXV0b2NvbmYgMy4wCisjIElmIG5vdCBjcm9zcyBjb21waWxpbmcsIGNoZWNrIHRoYXQgd2UgY2FuIHJ1biBhIHNpbXBsZSBwcm9ncmFtLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0geWVzOyB0aGVuCisgIGlmIHsgYWNfdHJ5PScuLyRhY19maWxlJworICB7IChldmFsIGVjaG8gIiRhc19tZToxNDYxOiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6MTQ2NDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPW5vCisgIGVsc2UKKyAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCisJY3Jvc3NfY29tcGlsaW5nPXllcworICAgIGVsc2UKKwl7IHsgZWNobyAiJGFzX21lOjE0NzE6IGVycm9yOiBjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCitJZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biBDIGNvbXBpbGVkIHByb2dyYW1zLgorSWYgeW91IG1lYW50IHRvIGNyb3NzIGNvbXBpbGUsIHVzZSBcYC0taG9zdCcuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgZmkKKyAgZmkKK2ZpCitlY2hvICIkYXNfbWU6MTQ3OTogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKKworcm0gLWYgYS5vdXQgYS5leGUgY29uZnRlc3QkYWNfY3ZfZXhlZXh0CithY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQorIyBDaGVjayB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCisjIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCitlY2hvICIkYXNfbWU6MTQ4NjogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nLi4uICRFQ0hPX0MiID4mNgorZWNobyAiJGFzX21lOjE0ODg6IHJlc3VsdDogJGNyb3NzX2NvbXBpbGluZyIgPiY1CitlY2hvICIke0VDSE9fVH0kY3Jvc3NfY29tcGlsaW5nIiA+JjYKKworZWNobyAiJGFzX21lOjE0OTE6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeC4uLiAkRUNIT19DIiA+JjYKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjE0OTM6IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjE0OTY6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgorICAjIElmIGJvdGggYGNvbmZ0ZXN0LmV4ZScgYW5kIGBjb25mdGVzdCcgYXJlIGBwcmVzZW50JyAod2VsbCwgb2JzZXJ2YWJsZSkKKyMgY2F0Y2ggYGNvbmZ0ZXN0LmV4ZScuICBGb3IgaW5zdGFuY2Ugd2l0aCBDeWd3aW4sIGBscyBjb25mdGVzdCcgd2lsbAorIyB3b3JrIHByb3Blcmx5IChpLmUuLCByZWZlciB0byBgY29uZnRlc3QuZXhlJyksIHdoaWxlIGl0IHdvbid0IHdpdGgKKyMgYHJtJy4KK2ZvciBhY19maWxlIGluIGAobHMgY29uZnRlc3QuZXhlOyBscyBjb25mdGVzdDsgbHMgY29uZnRlc3QuKikgMj4vZGV2L251bGxgOyBkbworICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi5vIHwgKi5vYmogfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiApIDs7CisgICAgKi4qICkgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCisgICAgICAgICAgZXhwb3J0IGFjX2N2X2V4ZWV4dAorICAgICAgICAgIGJyZWFrOzsKKyAgICAqICkgYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgIHsgeyBlY2hvICIkYXNfbWU6MTUxMjogZXJyb3I6IGNhbm5vdCBjb21wdXRlIEVYRUVYVDogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgRVhFRVhUOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluayIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworcm0gLWYgY29uZnRlc3QkYWNfY3ZfZXhlZXh0CitlY2hvICIkYXNfbWU6MTUxODogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9leGVleHQiID4mNgorCitybSAtZiBjb25mdGVzdC4kYWNfZXh0CitFWEVFWFQ9JGFjX2N2X2V4ZWV4dAorYWNfZXhlZXh0PSRFWEVFWFQKK2VjaG8gIiRhc19tZToxNTI0OiBjaGVja2luZyBmb3Igb2JqZWN0IHN1ZmZpeCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBvYmplY3Qgc3VmZml4Li4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9vYmpleHQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSAxNTMwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QubyBjb25mdGVzdC5vYmoKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjE1NDI6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjE1NDU6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgorICBmb3IgYWNfZmlsZSBpbiBgKGxzIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqOyBscyBjb25mdGVzdC4qKSAyPi9kZXYvbnVsbGA7IGRvCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiApIDs7CisgICAgKikgYWNfY3Zfb2JqZXh0PWBleHByICIkYWNfZmlsZSIgOiAnLipcLlwoLipcKSdgCisgICAgICAgYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK3sgeyBlY2hvICIkYXNfbWU6MTU1NzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIE9CSkVYVDogY2Fubm90IGNvbXBpbGUiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgT0JKRVhUOiBjYW5ub3QgY29tcGlsZSIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworcm0gLWYgY29uZnRlc3QuJGFjX2N2X29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOjE1NjQ6IHJlc3VsdDogJGFjX2N2X29iamV4dCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfb2JqZXh0IiA+JjYKK09CSkVYVD0kYWNfY3Zfb2JqZXh0CithY19vYmpleHQ9JE9CSkVYVAorZWNobyAiJGFzX21lOjE1Njg6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlci4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfY19jb21waWxlcl9nbnUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSAxNTc0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50CittYWluICgpCit7CisjaWZuZGVmIF9fR05VQ19fCisgICAgICAgY2hva2UgbWUKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjE1ODk6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjE1OTI6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6MTU5NTogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjE1OTg6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jb21waWxlcl9nbnU9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2FjX2NvbXBpbGVyX2dudT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorYWNfY3ZfY19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQorCitmaQorZWNobyAiJGFzX21lOjE2MTA6IHJlc3VsdDogJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY2CitHQ0M9YHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllcyAmJiBlY2hvIHllc2AKK2FjX3Rlc3RfQ0ZMQUdTPSR7Q0ZMQUdTK3NldH0KK2FjX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKK0NGTEFHUz0iLWciCitlY2hvICIkYXNfbWU6MTYxNjogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfZytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNsaW5lIDE2MjIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZToxNjM0OiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZToxNjM3OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKyAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOjE2NDA6IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZToxNjQzOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CithY19jdl9wcm9nX2NjX2c9bm8KK2ZpCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6MTY1MzogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19nIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2NjX2ciID4mNgoraWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgorICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0KKyAgZmkKK2ZpCisjIFNvbWUgcGVvcGxlIHVzZSBhIEMrKyBjb21waWxlciB0byBjb21waWxlIEMuICBTaW5jZSB3ZSB1c2UgYGV4aXQnLAorIyBpbiBDKysgd2UgbmVlZCB0byBkZWNsYXJlIGl0LiAgSW4gY2FzZSBzb21lb25lIHVzZXMgdGhlIHNhbWUgY29tcGlsZXIKKyMgZm9yIGJvdGggY29tcGlsaW5nIEMgYW5kIEMrKyB3ZSBuZWVkIHRvIGhhdmUgdGhlIEMrKyBjb21waWxlciBkZWNpZGUKKyMgdGhlIGRlY2xhcmF0aW9uIG9mIGV4aXQsIHNpbmNlIGl0J3MgdGhlIG1vc3QgZGVtYW5kaW5nIGVudmlyb25tZW50LgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjaWZuZGVmIF9fY3BsdXNwbHVzCisgIGNob2tlIG1lCisjZW5kaWYKK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MTY4MDogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6MTY4MzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZToxNjg2OiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6MTY4OTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGZvciBhY19kZWNsYXJhdGlvbiBpbiBcCisgICAnJ1wKKyAgICcjaW5jbHVkZSA8c3RkbGliLmg+JyBcCisgICAnZXh0ZXJuICJDIiB2b2lkIHN0ZDo6ZXhpdCAoaW50KSB0aHJvdyAoKTsgdXNpbmcgc3RkOjpleGl0OycgXAorICAgJ2V4dGVybiAiQyIgdm9pZCBzdGQ6OmV4aXQgKGludCk7IHVzaW5nIHN0ZDo6ZXhpdDsnIFwKKyAgICdleHRlcm4gIkMiIHZvaWQgZXhpdCAoaW50KSB0aHJvdyAoKTsnIFwKKyAgICdleHRlcm4gIkMiIHZvaWQgZXhpdCAoaW50KTsnIFwKKyAgICd2b2lkIGV4aXQgKGludCk7JworZG8KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSAxNzAxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyRhY19kZWNsYXJhdGlvbgoraW50CittYWluICgpCit7CitleGl0ICg0Mik7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjE3MTQ6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjE3MTc6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6MTcyMDogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjE3MjM6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgMTczMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCiskYWNfZGVjbGFyYXRpb24KK2ludAorbWFpbiAoKQoreworZXhpdCAoNDIpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZToxNzQ1OiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZToxNzQ4OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKyAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOjE3NTE6IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZToxNzU0OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZG9uZQorZWNobyAnI2lmZGVmIF9fY3BsdXNwbHVzJyA+PmNvbmZkZWZzLmgKK2VjaG8gJGFjX2RlY2xhcmF0aW9uICAgICAgPj5jb25mZGVmcy5oCitlY2hvICcjZW5kaWYnICAgICAgICAgICAgID4+Y29uZmRlZnMuaAorCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2ZpCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCisgIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9zaHRvb2w7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9zaHRvb2wgaW5zdGFsbCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIHsgeyBlY2hvICIkYXNfbWU6MTc5NTogZXJyb3I6IGNhbm5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCithY19jb25maWdfZ3Vlc3M9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiCithY19jb25maWdfc3ViPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIKK2FjX2NvbmZpZ3VyZT0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZ3VyZSIgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgorCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFtaWdhT1MgL0MvaW5zdGFsbCwgd2hpY2ggaW5zdGFsbHMgYm9vdGJsb2NrcyBvbiBmbG9wcHkgZGlzY3MKKyMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCisjIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKKyMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKKyMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgorZWNobyAiJGFzX21lOjE4MTU6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICAgIGFjX3NhdmVfSUZTPSRJRlM7IElGUz0kYWNfcGF0aF9zZXBhcmF0b3IKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICBJRlM9JGFjX3NhdmVfSUZTCisgICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCisgICAgY2FzZSAkYWNfZGlyLyBpbgorICAgIC8gfCAuLyB8IC4vLyB8IC9jQy8qIFwKKyAgICB8IC9ldGMvKiB8IC91c3Ivc2Jpbi8qIHwgL3Vzci9ldGMvKiB8IC9zYmluLyogfCAvdXNyL2Fmc3dzL2Jpbi8qIFwKKyAgICB8IC91c3IvdWNiLyogKSA7OworICAgICopCisgICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgICAjIGJ5IGRlZmF1bHQuCisgICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICAgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCisJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorICAgICAgICAgICAgZ3JlcCBkc3Btc2cgIiRhY19kaXIvJGFjX3Byb2ciID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCisJICAgIDoKKwkgIGVsaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKwkgICAgZ3JlcCBwd3BsdXMgIiRhY19kaXIvJGFjX3Byb2ciID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMtLWRvbid0IHVzZS4KKwkgICAgOgorCSAgZWxzZQorCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCisJICAgIGJyZWFrIDIKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKK2ZpCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgICAgSU5TVEFMTD0kYWNfY3ZfcGF0aF9pbnN0YWxsCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCisgICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgorICAgIElOU1RBTEw9JGFjX2luc3RhbGxfc2gKKyAgZmkKK2ZpCitlY2hvICIkYXNfbWU6MTg2NDogcmVzdWx0OiAkSU5TVEFMTCIgPiY1CitlY2hvICIke0VDSE9fVH0kSU5TVEFMTCIgPiY2CisKKyMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KKyMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCit0ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZToxODc4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgorYWNfZHVtbXk9IiRQQVRIIgorZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgIElGUz0kYWNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKK2FjX2N2X3Byb2dfUkFOTElCPSIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIKK2VjaG8gIiRhc19tZToxODkzOiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKK2JyZWFrCitkb25lCisKK2ZpCitmaQorUkFOTElCPSRhY19jdl9wcm9nX1JBTkxJQgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFzX21lOjE5MDE6IHJlc3VsdDogJFJBTkxJQiIgPiY1CitlY2hvICIke0VDSE9fVH0kUkFOTElCIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOjE5MDQ6IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KKyAgYWNfY3RfUkFOTElCPSRSQU5MSUIKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOjE5MTM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9IiRhY19jdF9SQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBhY19zYXZlX0lGUz0kSUZTOyBJRlM9JGFjX3BhdGhfc2VwYXJhdG9yCithY19kdW1teT0iJFBBVEgiCitmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgSUZTPSRhY19zYXZlX0lGUworICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAkYXNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkIiB8fCBjb250aW51ZQorYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9InJhbmxpYiIKK2VjaG8gIiRhc19tZToxOTI4OiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKK2JyZWFrCitkb25lCisKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCIiAmJiBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0iOiIKK2ZpCitmaQorYWNfY3RfUkFOTElCPSRhY19jdl9wcm9nX2FjX2N0X1JBTkxJQgoraWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFzX21lOjE5Mzc6IHJlc3VsdDogJGFjX2N0X1JBTkxJQiIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfUkFOTElCIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOjE5NDA6IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworICBSQU5MSUI9JGFjX2N0X1JBTkxJQgorZWxzZQorICBSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKK2VjaG8gIiRhc19tZToxOTU0OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yLi4uICRFQ0hPX0MiID4mNgorIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KK2lmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCisgIENQUD0KK2ZpCitpZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgorICBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ1BQK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgICAgICAjIERvdWJsZSBxdW90ZXMgYmVjYXVzZSBDUFAgbmVlZHMgdG8gYmUgZXhwYW5kZWQKKyAgICBmb3IgQ1BQIGluICIkQ0MgLUUiICIkQ0MgLUUgLXRyYWRpdGlvbmFsLWNwcCIgIi9saWIvY3BwIgorICAgIGRvCisgICAgICAjIGJyZWFrIDIgc2luY2UgdGhlcmUgaXMgYSBsb29wIGluIHRoZXJlLgorICAgICAgYWNfcHJlcHJvY19vaz1mYWxzZQorZm9yIGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSAxOTc2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyAgICAgICAgICAgICAgICAgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiB7IChldmFsIGVjaG8gIiRhc19tZToxOTgxOiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1CisgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGVncmVwIC12ICdeICpcKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZToxOTg3OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbDsgdGhlbgorICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGFjX2NwcF9lcnI9JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcKKyAgZWxzZQorICAgIGFjX2NwcF9lcnI9CisgIGZpCitlbHNlCisgIGFjX2NwcF9lcnI9eWVzCitmaQoraWYgdGVzdCAteiAiJGFjX2NwcF9lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uLWV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSAyMDEwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgorX0FDRU9GCitpZiB7IChldmFsIGVjaG8gIiRhc19tZToyMDE0OiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1CisgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGVncmVwIC12ICdeICpcKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZToyMDIwOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbDsgdGhlbgorICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGFjX2NwcF9lcnI9JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcKKyAgZWxzZQorICAgIGFjX2NwcF9lcnI9CisgIGZpCitlbHNlCisgIGFjX2NwcF9lcnI9eWVzCitmaQoraWYgdGVzdCAteiAiJGFjX2NwcF9lcnIiOyB0aGVuCisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorCitkb25lCisjIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbgorICBicmVhayAyCitmaQorCisgICAgZG9uZQorICAgIGFjX2N2X3Byb2dfQ1BQPSRDUFAKKworZmkKKyAgQ1BQPSRhY19jdl9wcm9nX0NQUAorZWxzZQorICBhY19jdl9wcm9nX0NQUD0kQ1BQCitmaQorZWNobyAiJGFzX21lOjIwNTc6IHJlc3VsdDogJENQUCIgPiY1CitlY2hvICIke0VDSE9fVH0kQ1BQIiA+JjYKK2FjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgMjA2NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisgICAgICAgICAgICAgICAgICAgICBTeW50YXggZXJyb3IKK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MjA3MjogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBlZ3JlcCAtdiAnXiAqXCsnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6MjA3ODogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCisgIGVsc2UKKyAgICBhY19jcHBfZXJyPQorICBmaQorZWxzZQorICBhY19jcHBfZXJyPXllcworZmkKK2lmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCitjb250aW51ZQorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbi1leGlzdGVudCBoZWFkZXJzCisgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgMjEwMSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MjEwNTogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBlZ3JlcCAtdiAnXiAqXCsnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6MjExMTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCisgIGVsc2UKKyAgICBhY19jcHBfZXJyPQorICBmaQorZWxzZQorICBhY19jcHBfZXJyPXllcworZmkKK2lmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgICMgUGFzc2VzIGJvdGggdGVzdHMuCithY19wcmVwcm9jX29rPToKK2JyZWFrCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4KKyAgOgorZWxzZQorICB7IHsgZWNobyAiJGFzX21lOjIxMzk6IGVycm9yOiBDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2siID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogQyBwcmVwcm9jZXNzb3IgXCIkQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQorCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK2VjaG8gIiRhc19tZToyMTUwOiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9oZWFkZXJfc3RkYytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNsaW5lIDIxNTYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisKK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MjE2NDogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBlZ3JlcCAtdiAnXiAqXCsnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6MjE3MDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCisgIGVsc2UKKyAgICBhY19jcHBfZXJyPQorICBmaQorZWxzZQorICBhY19jcHBfZXJyPXllcworZmkKK2lmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgorICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNsaW5lIDIxOTIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNsaW5lIDIyMTAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgOgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNsaW5lIDIyMzEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCisjIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZWxzZQorIyBkZWZpbmUgSVNMT1dFUihjKSAoKCdhJyA8PSAoYykgJiYgKGMpIDw9ICdpJykgXAorICAgICAgICAgICAgICAgICAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAorICAgICAgICAgICAgICAgICAgICAgfHwgKCdzJyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gKChjKSB8IDB4NDApIDogKGMpKQorI2VuZGlmCisKKyNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCitpbnQKK21haW4gKCkKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICBpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpCisgICAgICAgIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQorICAgICAgZXhpdCgyKTsKKyAgZXhpdCAoMCk7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MjI1NzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6MjI2MDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6MjI2MjogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjIyNjU6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CitlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CithY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvcmUgY29yZS4qICouY29yZSBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2ZpCitmaQorZWNobyAiJGFzX21lOjIyNzg6IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9oZWFkZXJfc3RkYyIgPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBTVERDX0hFQURFUlMgMQorRU9GCisKK2ZpCisKK2ZvciBhY19oZWFkZXIgaW4gbGltaXRzLmgKK2RvCithY19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhY190cl9zaGAKK2VjaG8gIiRhc19tZToyMjkxOiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNgoraWYgZXZhbCAidGVzdCBcIlwkeyRhY19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNsaW5lIDIyOTcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjIzMDE6IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0KSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZWdyZXAgLXYgJ14gKlwrJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOjIzMDc6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgZXZhbCAiJGFjX2FjX0hlYWRlcj15ZXMiCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBldmFsICIkYWNfYWNfSGVhZGVyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOjIzMjY6IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFjX2FjX0hlYWRlcid9J2AiID4mNQorZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFjX2FjX0hlYWRlcid9J2AiID4mNgoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYWNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFjX3RyX2NwcGAgMQorRU9GCisKK2ZpCitkb25lCisKK2VjaG8gIiRhc19tZToyMzM2OiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgQU5TSSBDIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IEFOU0kgQy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19zdGRjK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2N2X3Byb2dfY2Nfc3RkYz1ubworYWNfc2F2ZV9DQz0kQ0MKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgMjM0NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLworc3RydWN0IGJ1ZiB7IGludCB4OyB9OworRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKK3N0YXRpYyBjaGFyICplIChwLCBpKQorICAgICBjaGFyICoqcDsKKyAgICAgaW50IGk7Cit7CisgIHJldHVybiBwW2ldOworfQorc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQoreworICBjaGFyICpzOworICB2YV9saXN0IHY7CisgIHZhX3N0YXJ0ICh2LHApOworICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOworICB2YV9lbmQgKHYpOworICByZXR1cm4gczsKK30KK2ludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOworc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50IGEpO307CitzdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKK2ludCBwYWlybmFtZXMgKGludCwgY2hhciAqKiwgRklMRSAqKCopKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KSwgaW50LCBpbnQpOworaW50IGFyZ2M7CitjaGFyICoqYXJndjsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGYgKGUsIGFyZ3YsIDApICE9IGFyZ3ZbMF0gIHx8ICBmIChlLCBhcmd2LCAxKSAhPSBhcmd2WzFdOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCisjIERvbid0IHRyeSBnY2MgLWFuc2k7IHRoYXQgdHVybnMgb2ZmIHVzZWZ1bCBleHRlbnNpb25zIGFuZAorIyBicmVha3Mgc29tZSBzeXN0ZW1zJyBoZWFkZXIgZmlsZXMuCisjIEFJWAkJCS1xbGFuZ2x2bD1hbnNpCisjIFVsdHJpeCBhbmQgT1NGLzEJLXN0ZDEKKyMgSFAtVVggMTAuMjAgYW5kIGxhdGVyCS1BZQorIyBIUC1VWCBvbGRlciB2ZXJzaW9ucwktQWEgLURfSFBVWF9TT1VSQ0UKKyMgU1ZSNAkJCS1YYyAtRF9fRVhURU5TSU9OU19fCitmb3IgYWNfYXJnIGluICIiIC1xbGFuZ2x2bD1hbnNpIC1zdGQxIC1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05TX18iCitkbworICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MjM5MzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6MjM5NjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZToyMzk5OiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6MjQwMjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X3Byb2dfY2Nfc3RkYz0kYWNfYXJnCiticmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CitmaQorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorZG9uZQorcm0gLWYgY29uZnRlc3QuJGFjX2V4dCBjb25mdGVzdC4kYWNfb2JqZXh0CitDQz0kYWNfc2F2ZV9DQworCitmaQorCitjYXNlICJ4JGFjX2N2X3Byb2dfY2Nfc3RkYyIgaW4KKyAgeHx4bm8pCisgICAgZWNobyAiJGFzX21lOjI0MTk6IHJlc3VsdDogbm9uZSBuZWVkZWQiID4mNQorZWNobyAiJHtFQ0hPX1R9bm9uZSBuZWVkZWQiID4mNiA7OworICAqKQorICAgIGVjaG8gIiRhc19tZToyNDIyOiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX3N0ZGMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3Byb2dfY2Nfc3RkYyIgPiY2CisgICAgQ0M9IiRDQyAkYWNfY3ZfcHJvZ19jY19zdGRjIiA7OworZXNhYworCitlY2hvICIkYXNfbWU6MjQyNzogY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0Li4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9jX2NvbnN0K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgMjQzMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludAorbWFpbiAoKQoreworLyogRklYTUU6IEluY2x1ZGUgdGhlIGNvbW1lbnRzIHN1Z2dlc3RlZCBieSBQYXVsLiAqLworI2lmbmRlZiBfX2NwbHVzcGx1cworICAvKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLworICB0eXBlZGVmIGludCBjaGFyc2V0WzJdOworICBjb25zdCBjaGFyc2V0IHg7CisgIC8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCisgIGNoYXIgY29uc3QgKmNvbnN0ICpjY3A7CisgIGNoYXIgKipwOworICAvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLworICBzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307CisgIHN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OworICAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCisgICAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluCisgICAgIGFuIGFybSBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQKKyAgICAgZXhwcmVzc2lvbiAqLworICBjb25zdCBjaGFyICpnID0gInN0cmluZyI7CisgIGNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKKyAgLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KKyAgKytjY3A7CisgIHAgPSAoY2hhcioqKSBjY3A7CisgIGNjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOworICB7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLworICAgIGNoYXIgKnQ7CisgICAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKKworICAgICp0KysgPSAwOworICB9CisgIHsgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCisgICAgaW50IHhbXSA9IHsyNSwgMTd9OworICAgIGNvbnN0IGludCAqZm9vID0gJnhbMF07CisgICAgKytmb287CisgIH0KKyAgeyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCisgICAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7CisgICAgaXB0ciBwID0gMDsKKyAgICArK3A7CisgIH0KKyAgeyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCisgICAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLworICAgIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07CisgICAgc3RydWN0IHMgKmI7IGItPmogPSA1OworICB9CisgIHsgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCisgICAgY29uc3QgaW50IGZvbyA9IDEwOworICB9CisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZToyNDkxOiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZToyNDk0OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKyAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOjI0OTc6IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZToyNTAwOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfY19jb25zdD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorYWNfY3ZfY19jb25zdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZToyNTEwOiByZXN1bHQ6ICRhY19jdl9jX2NvbnN0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9jX2NvbnN0IiA+JjYKK2lmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBjb25zdAorRU9GCisKK2ZpCisKK2ZvciBhY19oZWFkZXIgaW4gc3RkbGliLmggc3RyaW5nLmggbWVtb3J5Lmggc3RyaW5ncy5oIGludHR5cGVzLmggdW5pc3RkLmgKK2RvCithY19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhY190cl9zaGAKK2VjaG8gIiRhc19tZToyNTIzOiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNgoraWYgZXZhbCAidGVzdCBcIlwkeyRhY19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNsaW5lIDI1MjkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjI1MzM6IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0KSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZWdyZXAgLXYgJ14gKlwrJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOjI1Mzk6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgZXZhbCAiJGFjX2FjX0hlYWRlcj15ZXMiCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBldmFsICIkYWNfYWNfSGVhZGVyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOjI1NTg6IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFjX2FjX0hlYWRlcid9J2AiID4mNQorZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFjX2FjX0hlYWRlcid9J2AiID4mNgoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYWNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFjX3RyX2NwcGAgMQorRU9GCisKK2ZpCitkb25lCisKK2VjaG8gIiRhc19tZToyNTY4OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNpemVfdC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfdHlwZV9zaXplX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSAyNTc0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyRhY19pbmNsdWRlc19kZWZhdWx0CitpbnQKK21haW4gKCkKK3sKK2lmICgoc2l6ZV90ICopIDApCisgIHJldHVybiAwOworaWYgKHNpemVvZiAoc2l6ZV90KSkKKyAgcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjI1ODk6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjI1OTI6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6MjU5NTogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjI1OTg6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl90eXBlX3NpemVfdD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorYWNfY3ZfdHlwZV9zaXplX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6MjYwODogcmVzdWx0OiAkYWNfY3ZfdHlwZV9zaXplX3QiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfc2l6ZV90IiA+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0geWVzOyB0aGVuCisgIDoKK2Vsc2UKKworY2F0ID4+Y29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBzaXplX3QgdW5zaWduZWQKK0VPRgorCitmaQorCitmb3IgYWNfZnVuYyBpbiBiY29weSBtZW1tb3ZlIHN0cmVycm9yCitkbworYWNfYWNfdmFyPWBlY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhY190cl9zaGAKK2VjaG8gIiRhc19tZToyNjIzOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2CitpZiBldmFsICJ0ZXN0IFwiXCR7JGFjX2FjX3ZhcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgMjYyOSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYyAoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYyAoKTsKK2NoYXIgKCpmKSAoKTsKKworaW50CittYWluICgpCit7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCitmID0gJGFjX2Z1bmM7CisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MjY2MDogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6MjY2MzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOjI2NjY6IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZToyNjY5OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgZXZhbCAiJGFjX2FjX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2V2YWwgIiRhY19hY192YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZToyNjc5OiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhY19hY192YXInfSdgIiA+JjUKK2VjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhY19hY192YXInfSdgIiA+JjYKK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFjX2FjX3Zhcid9J2AgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+Y29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYWNfdHJfY3BwYCAxCitFT0YKKworZmkKK2RvbmUKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXV0Zjggb3IgLS1kaXNhYmxlLXV0Zjggd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfdXRmOCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfdXRmOCIKKyAgaWYgdGVzdCAiJGVuYWJsZXZhbCIgPSAieWVzIjsgdGhlbgorICBVVEY4PS1EU1VQUE9SVF9VVEY4CitmaQorCitmaTsKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5ld2xpbmUtaXMtY3Igb3IgLS1kaXNhYmxlLW5ld2xpbmUtaXMtY3Igd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbmV3bGluZV9pc19jcitzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbmV3bGluZV9pc19jciIKKyAgaWYgdGVzdCAiJGVuYWJsZXZhbCIgPSAieWVzIjsgdGhlbgorICBORVdMSU5FPS1ETkVXTElORT0xMworZmkKKworZmk7CisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1uZXdsaW5lLWlzLWxmIG9yIC0tZGlzYWJsZS1uZXdsaW5lLWlzLWxmIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX25ld2xpbmVfaXNfbGYrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX25ld2xpbmVfaXNfbGYiCisgIGlmIHRlc3QgIiRlbmFibGV2YWwiID0gInllcyI7IHRoZW4KKyAgTkVXTElORT0tRE5FV0xJTkU9MTAKK2ZpCisKK2ZpOworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2hhcmVkIG9yIC0tZGlzYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaGFyZWQiCisgIHA9JHtQQUNLQUdFLWRlZmF1bHR9CitjYXNlICRlbmFibGV2YWwgaW4KK3llcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKK25vKSBlbmFibGVfc2hhcmVkPW5vIDs7CisqKQorICBlbmFibGVfc2hhcmVkPW5vCisgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCisgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKyAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICA7OworZXNhYworZWxzZQorICBlbmFibGVfc2hhcmVkPXllcworZmk7CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc3RhdGljIG9yIC0tZGlzYWJsZS1zdGF0aWMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zdGF0aWMiCisgIHA9JHtQQUNLQUdFLWRlZmF1bHR9CitjYXNlICRlbmFibGV2YWwgaW4KK3llcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKK25vKSBlbmFibGVfc3RhdGljPW5vIDs7CisqKQorICBlbmFibGVfc3RhdGljPW5vCisgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCisgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKyAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICA7OworZXNhYworZWxzZQorICBlbmFibGVfc3RhdGljPXllcworZmk7CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZmFzdC1pbnN0YWxsIG9yIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfZmFzdF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9mYXN0X2luc3RhbGwiCisgIHA9JHtQQUNLQUdFLWRlZmF1bHR9CitjYXNlICRlbmFibGV2YWwgaW4KK3llcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKK25vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7CisqKQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCisgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCisgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKyAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICA7OworZXNhYworZWxzZQorICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcworZmk7CisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCiskYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMSB8fAorICB7IHsgZWNobyAiJGFzX21lOjI3ODQ6IGVycm9yOiBjYW5ub3QgcnVuICRhY19jb25maWdfc3ViIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gJGFjX2NvbmZpZ19zdWIiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworZWNobyAiJGFzX21lOjI3ODg6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2J1aWxkK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2N2X2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwordGVzdCAteiAiJGFjX2N2X2J1aWxkX2FsaWFzIiAmJgorICBhY19jdl9idWlsZF9hbGlhcz1gJGFjX2NvbmZpZ19ndWVzc2AKK3Rlc3QgLXogIiRhY19jdl9idWlsZF9hbGlhcyIgJiYKKyAgeyB7IGVjaG8gIiRhc19tZToyNzk3OiBlcnJvcjogY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorYWNfY3ZfYnVpbGQ9YCRhY19jb25maWdfc3ViICRhY19jdl9idWlsZF9hbGlhc2AgfHwKKyAgeyB7IGVjaG8gIiRhc19tZToyODAxOiBlcnJvcjogJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2J1aWxkX2FsaWFzIGZhaWxlZC4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2J1aWxkX2FsaWFzIGZhaWxlZC4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworZmkKK2VjaG8gIiRhc19tZToyODA2OiByZXN1bHQ6ICRhY19jdl9idWlsZCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfYnVpbGQiID4mNgorYnVpbGQ9JGFjX2N2X2J1aWxkCitidWlsZF9jcHU9YGVjaG8gJGFjX2N2X2J1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2J1aWxkX3ZlbmRvcj1gZWNobyAkYWNfY3ZfYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAorYnVpbGRfb3M9YGVjaG8gJGFjX2N2X2J1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKKworZWNobyAiJGFzX21lOjI4MTM6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9ob3N0K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2N2X2hvc3RfYWxpYXM9JGhvc3RfYWxpYXMKK3Rlc3QgLXogIiRhY19jdl9ob3N0X2FsaWFzIiAmJgorICBhY19jdl9ob3N0X2FsaWFzPSRhY19jdl9idWlsZF9hbGlhcworYWNfY3ZfaG9zdD1gJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2hvc3RfYWxpYXNgIHx8CisgIHsgeyBlY2hvICIkYXNfbWU6MjgyMjogZXJyb3I6ICRhY19jb25maWdfc3ViICRhY19jdl9ob3N0X2FsaWFzIGZhaWxlZCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfaG9zdF9hbGlhcyBmYWlsZWQiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworZmkKK2VjaG8gIiRhc19tZToyODI3OiByZXN1bHQ6ICRhY19jdl9ob3N0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9ob3N0IiA+JjYKK2hvc3Q9JGFjX2N2X2hvc3QKK2hvc3RfY3B1PWBlY2hvICRhY19jdl9ob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2hvc3RfdmVuZG9yPWBlY2hvICRhY19jdl9ob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2hvc3Rfb3M9YGVjaG8gJGFjX2N2X2hvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWdudS1sZCBvciAtLXdpdGhvdXQtZ251LWxkIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0iJHdpdGhfZ251X2xkIgorICB0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMKK2Vsc2UKKyAgd2l0aF9nbnVfbGQ9bm8KK2ZpOworYWNfcHJvZz1sZAoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCisgIGVjaG8gIiRhc19tZToyODQ0OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MuLi4gJEVDSE9fQyIgPiY2CisgIGNhc2UgJGhvc3QgaW4KKyAgKi0qLW1pbmd3KikKKyAgICAjIGdjYyBsZWF2ZXMgYSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4gd2hpY2ggdXBzZXRzIG1pbmd3CisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1IHwgdHIgLWQgJ1wwMTUnYCA7OworICAqKQorICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAgOzsKKyAgZXNhYworICBjYXNlICRhY19wcm9nIGluCisgICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCisgICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKQorICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJworICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKKyAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCisgICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KKwlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCisgICAgICBkb25lCisgICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKKyAgICAgIDs7CisgICIiKQorICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgorICAgIGFjX3Byb2c9bGQKKyAgICA7OworICAqKQorICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KKyAgICB3aXRoX2dudV9sZD11bmtub3duCisgICAgOzsKKyAgZXNhYworZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgIGVjaG8gIiRhc19tZToyODc0OiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEdOVSBsZC4uLiAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOjI4Nzc6IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQuLi4gJEVDSE9fQyIgPiY2CitmaQoraWYgdGVzdCAiJHtsdF9jdl9wYXRoX0xEK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUi06fSIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKKyAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KKyAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorICAgICAgaWYgIiRsdF9jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKKyAgICAgIGVsc2UKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZWxzZQorICBsdF9jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorZmkKK2ZpCisKK0xEPSIkbHRfY3ZfcGF0aF9MRCIKK2lmIHRlc3QgLW4gIiRMRCI7IHRoZW4KKyAgZWNobyAiJGFzX21lOjI5MDc6IHJlc3VsdDogJExEIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRMRCIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZToyOTEwOiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCit0ZXN0IC16ICIkTEQiICYmIHsgeyBlY2hvICIkYXNfbWU6MjkxMzogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitlY2hvICIkYXNfbWU6MjkxNjogY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3ZfcHJvZ19nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KK2lmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9eWVzCitlbHNlCisgIGx0X2N2X3Byb2dfZ251X2xkPW5vCitmaQorZmkKK2VjaG8gIiRhc19tZToyOTI4OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2dudV9sZCIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfY3ZfcHJvZ19nbnVfbGQiID4mNgord2l0aF9nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkCisKK2VjaG8gIiRhc19tZToyOTMyOiBjaGVja2luZyBmb3IgJExEIG9wdGlvbiB0byByZWxvYWQgb2JqZWN0IGZpbGVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlcy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3ZfbGRfcmVsb2FkX2ZsYWcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfbGRfcmVsb2FkX2ZsYWc9Jy1yJworZmkKK2VjaG8gIiRhc19tZToyOTM5OiByZXN1bHQ6ICRsdF9jdl9sZF9yZWxvYWRfZmxhZyIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfY3ZfbGRfcmVsb2FkX2ZsYWciID4mNgorcmVsb2FkX2ZsYWc9JGx0X2N2X2xkX3JlbG9hZF9mbGFnCit0ZXN0IC1uICIkcmVsb2FkX2ZsYWciICYmIHJlbG9hZF9mbGFnPSIgJHJlbG9hZF9mbGFnIgorCitlY2hvICIkYXNfbWU6Mjk0NDogY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9jdl9wYXRoX05NK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KKyAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgIGx0X2N2X3BhdGhfTk09IiROTSIKK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUi06fSIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIHRtcF9ubT0kYWNfZGlyLyR7YWNfdG9vbF9wcmVmaXh9bm0KKyAgICBpZiB0ZXN0IC1mICR0bXBfbm0gfHwgdGVzdCAtZiAkdG1wX25tJGFjX2V4ZWV4dCA7IHRoZW4KKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgorICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKKyAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKKyAgICAgICMgVHJ1NjQncyBubSBjb21wbGFpbnMgdGhhdCAvZGV2L251bGwgaXMgYW4gaW52YWxpZCBvYmplY3QgZmlsZQorICAgICAgaWYgKCR0bXBfbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwICcoL2Rldi9udWxsfEludmFsaWQgZmlsZSBvciBvYmplY3QgdHlwZSknID4vZGV2L251bGw7IHRoZW4KKwlsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1CIgorCWJyZWFrCisgICAgICBlbGlmICgkdG1wX25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgorCWx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLXAiCisJYnJlYWsKKyAgICAgIGVsc2UKKwlsdF9jdl9wYXRoX05NPSR7bHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAorCWNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRsdF9jdl9wYXRoX05NIiAmJiBsdF9jdl9wYXRoX05NPW5tCitmaQorZmkKKworTk09IiRsdF9jdl9wYXRoX05NIgorZWNobyAiJGFzX21lOjI5ODA6IHJlc3VsdDogJE5NIiA+JjUKK2VjaG8gIiR7RUNIT19UfSROTSIgPiY2CisKK2VjaG8gIiRhc19tZToyOTgzOiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3Jrcy4uLiAkRUNIT19DIiA+JjYKK0xOX1M9JGFzX2xuX3MKK2lmIHRlc3QgIiRMTl9TIiA9ICJsbiAtcyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOjI5ODc6IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZToyOTkwOiByZXN1bHQ6IG5vLCB1c2luZyAkTE5fUyIgPiY1CitlY2hvICIke0VDSE9fVH1ubywgdXNpbmcgJExOX1MiID4mNgorZmkKKworZWNobyAiJGFzX21lOjI5OTQ6IGNoZWNraW5nIGhvdyB0byByZWNvZ25pc2UgZGVwZW5kYW50IGxpYnJhcmllcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGhvdyB0byByZWNvZ25pc2UgZGVwZW5kYW50IGxpYnJhcmllcy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRNQUdJQ19DTUQnCitsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0KK2x0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSd1bmtub3duJworIyBOZWVkIHRvIHNldCB0aGUgcHJlY2VkaW5nIHZhcmlhYmxlIG9uIGFsbCBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0CisjIGludGVybGlicmFyeSBkZXBlbmRlbmNpZXMuCisjICdub25lJyAtLSBkZXBlbmRlbmNpZXMgbm90IHN1cHBvcnRlZC4KKyMgYHVua25vd24nIC0tIHNhbWUgYXMgbm9uZSwgYnV0IGRvY3VtZW50cyB0aGF0IHdlIHJlYWxseSBkb24ndCBrbm93LgorIyAncGFzc19hbGwnIC0tIGFsbCBkZXBlbmRlbmNpZXMgcGFzc2VkIHdpdGggbm8gY2hlY2tzLgorIyAndGVzdF9jb21waWxlJyAtLSBjaGVjayBieSBtYWtpbmcgdGVzdCBwcm9ncmFtLgorIyBbJ2ZpbGVfbWFnaWMgW3JlZ2V4XSddIC0tIGNoZWNrIGJ5IGxvb2tpbmcgZm9yIGZpbGVzIGluIGxpYnJhcnkgcGF0aAorIyB3aGljaCByZXNwb25kcyB0byB0aGUgJGZpbGVfbWFnaWNfY21kIHdpdGggYSBnaXZlbiBlZ3JlcCByZWdleC4KKyMgSWYgeW91IGhhdmUgYGZpbGUnIG9yIGVxdWl2YWxlbnQgb24geW91ciBzeXN0ZW0gYW5kIHlvdSdyZSBub3Qgc3VyZQorIyB3aGV0aGVyIGBwYXNzX2FsbCcgd2lsbCAqYWx3YXlzKiB3b3JrLCB5b3UgcHJvYmFibHkgd2FudCB0aGlzIG9uZS4KKworY2FzZSAkaG9zdF9vcyBpbgorYWl4NCogfCBhaXg1KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworYmVvcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2JzZGk0KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTUxdU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL3Vzci9iaW4vZmlsZSAtTCcKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3NobGliL2xpYmMuc28KKyAgOzsKKworY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBmaWxlIGZvcm1hdCBwZWkqLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpPycKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRPQkpEVU1QIC1mJworICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBNYWNoLU8gZHluYW1pY2FsbHkgbGlua2VkIHNoYXJlZCBsaWJyYXJ5JworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL3Vzci9iaW4vZmlsZSAtTCcKKyAgY2FzZSAiJGhvc3Rfb3MiIGluCisgIHJoYXBzb2R5KiB8IGRhcndpbjEuMDEyKQorICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL1N5c3RlbS5mcmFtZXdvcmsvVmVyc2lvbnMvKi9TeXN0ZW0gfCBoZWFkIC0xYAorICAgIDs7CisgICopICMgRGFyd2luIDEuMyBvbgorICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPScvdXNyL2xpYi9saWJTeXN0ZW0uZHlsaWInCisgICAgOzsKKyAgZXNhYworICA7OworCitmcmVlYnNkKikKKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KKyAgICBjYXNlICRob3N0X2NwdSBpbgorICAgIGkqODYgKQorICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHRoZSBwcmVzZW5jZSBvZiBPcGVuQlNEIGhlcmUgd2FzIGEgbWlzdGFrZS4KKyAgICAgICMgTGV0J3MgYWNjZXB0IGJvdGggb2YgdGhlbSB1bnRpbCB0aGlzIGlzIGNsZWFyZWQgdXAuCisgICAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoRnJlZUJTRHxPcGVuQlNEKS9pWzMtOV04NiAoY29tcGFjdCApP2RlbWFuZCBwYWdlZCBzaGFyZWQgbGlicmFyeScKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28uKmAKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgZmkKKyAgOzsKKworZ251KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworaHB1eDEwLjIwKnxocHV4MTEqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxQQS1SSVNDWzAtOV0uWzAtOV0pIHNoYXJlZCBsaWJyYXJ5JworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYmMuc2wKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqKQorICBjYXNlICRob3N0X29zIGluCisgIGlyaXg1KikKKyAgICAjIHRoaXMgd2lsbCBiZSBvdmVycmlkZGVuIHdpdGggcGFzc19hbGwsIGJ1dCBsZXQgdXMga2VlcCBpdCBqdXN0IGluIGNhc2UKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgMzItYml0IE1TQiBkeW5hbWljIGxpYiBNSVBTIC0gdmVyc2lvbiAxIgorICAgIDs7CisgICopCisgICAgY2FzZSAkTEQgaW4KKyAgICAqLTMyfCoiLTMyICIpIGxpYm1hZ2ljPTMyLWJpdDs7CisgICAgKi1uMzJ8KiItbjMyICIpIGxpYm1hZ2ljPU4zMjs7CisgICAgKi02NHwqIi02NCAiKSBsaWJtYWdpYz02NC1iaXQ7OworICAgICopIGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgICBlc2FjCisgICAgIyB0aGlzIHdpbGwgYmUgb3ZlcnJpZGRlbiB3aXRoIHBhc3NfYWxsLCBidXQgbGV0IHVzIGtlZXAgaXQganVzdCBpbiBjYXNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9ImZpbGVfbWFnaWMgRUxGICR7bGlibWFnaWN9IE1TQiBtaXBzLVsxMjM0XSBkeW5hbWljIGxpYiBNSVBTIC0gdmVyc2lvbiAxIgorICAgIDs7CisgIGVzYWMKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL2xpYiR7bGlic3VmZn0vbGliYy5zbypgCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKKyMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KK2xpbnV4LWdudSopCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIGFscGhhKiB8IGkqODYgfCBwb3dlcnBjKiB8IHNwYXJjKiB8IGlhNjQqICkKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbCA7OworICAqKQorICAgICMgZ2xpYmMgdXAgdG8gMi4xLjEgZG9lcyBub3QgcGVyZm9ybSBzb21lIHJlbG9jYXRpb25zIG9uIEFSTQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW0xNXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliICknIDs7CisgIGVzYWMKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL2xpYi9saWJjLnNvKiAvbGliL2xpYmMtKi5zb2AKKyAgOzsKKworbmV0YnNkKikKKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW14vXC5dK1wuc29cLlswLTldK1wuWzAtOV0rJCcKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9cLl0rXC5zbyQnCisgIGZpCisgIDs7CisKK25ld29zNiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChleGVjdXRhYmxlfGR5bmFtaWMgbGliKScKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJubHMuc28KKyAgOzsKKworb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAjIHRoaXMgd2lsbCBiZSBvdmVycmlkZGVuIHdpdGggcGFzc19hbGwsIGJ1dCBsZXQgdXMga2VlcCBpdCBqdXN0IGluIGNhc2UKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgQ09GRiBmb3JtYXQgYWxwaGEgc2hhcmVkIGxpYnJhcnknCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3NjbzMuMnY1KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc29sYXJpcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9saWIvbGliYy5zbworICA7OworCitzeXN2NXV3Wzc4XSogfCBzeXN2NCp1dzIqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyogfCBzeXN2NSopCisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgIG1vdG9yb2xhKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKSBNWzAtOV1bMC05XSogVmVyc2lvbiBbMC05XScKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvKmAKKyAgICA7OworICBuY3IpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgICA7OworICBzZXF1ZW50KQorICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTE1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIgKScKKyAgICA7OworICBzbmkpCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtMTV1TQiBkeW5hbWljIGxpYiIKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vbGliL2xpYmMuc28KKyAgICA7OworICBlc2FjCisgIDs7Citlc2FjCisKK2ZpCitlY2hvICIkYXNfbWU6MzE2MjogcmVzdWx0OiAkbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kIiA+JjYKK2ZpbGVfbWFnaWNfY21kPSRsdF9jdl9maWxlX21hZ2ljX2NtZAorZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kCisKKyMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCitlY2hvICIkYXNfbWU6MzE2ODogY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0Li4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisKKyMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgorIyBbVGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KV0KKworIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgorc3ltY29kZT0nW0JDREVHUlNUXScKKworIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCitzeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJworCisjIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCitzeW14ZnJtPSdcMSBcMlwzIFwzJworCisjIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCitsdF9jdl9nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCisKKyMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCitjYXNlICRob3N0X29zIGluCithaXgqKQorICBzeW1jb2RlPSdbQkNEVF0nCisgIDs7CitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgIHN5bWNvZGU9J1tBQkNER0lTVFddJworICA7OworaHB1eCopICMgSXRzIGxpbmtlciBkaXN0aW5ndWlzaGVzIGRhdGEgZnJvbSBjb2RlIHN5bWJvbHMKKyAgbHRfY3ZfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDEoKTsvcCcgLWUgJ3MvXiRzeW1jb2RlKiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKKyAgOzsKK2lyaXgqKQorICBzeW1jb2RlPSdbQkNERUdSU1RdJworICA7Oworc29sYXJpcyogfCBzeXN2NSopCisgIHN5bWNvZGU9J1tCRFRdJworICA7Oworc3lzdjQpCisgIHN5bWNvZGU9J1tERk5TVFVdJworICA7OworZXNhYworCisjIEhhbmRsZSBDUkxGIGluIG1pbmd3IHRvb2wgY2hhaW4KK29wdF9jcj0KK2Nhc2UgJGhvc3Rfb3MgaW4KK21pbmd3KikKKyAgb3B0X2NyPWBlY2hvICd4XHswLDFcfScgfCB0ciB4ICdcMDE1J2AgIyBvcHRpb24gY3IgaW4gcmVnZXhwCisgIDs7Citlc2FjCisKKyMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgoraWYgJE5NIC1WIDI+JjEgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCisgIHN5bWNvZGU9J1tBQkNER0lTVFddJworZmkKKworIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KK2ZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KKworICAjIFdyaXRlIHRoZSByYXcgYW5kIEMgaWRlbnRpZmllcnMuCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qWyAJXVwoJHN5bWNvZGUkc3ltY29kZSpcKVsgCV1bIAldKlwoJGFjX3N5bXByZnhcKSRzeW1wYXQkb3B0X2NyJC8kc3lteGZybS9wJyIKKworICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KKyAgcGlwZV93b3Jrcz1ubworICBybSAtZiBjb25mdGVzdCoKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorY2hhciBubV90ZXN0X3ZhcjsKK3ZvaWQgbm1fdGVzdF9mdW5jKCl7fQorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK2ludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYygpO3JldHVybigwKTt9CitFT0YKKworICBpZiB7IChldmFsIGVjaG8gIiRhc19tZTozMjQ1OiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTozMjQ4OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KKyAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KKyAgICBubGlzdD1jb25mdGVzdC5ubQorICAgIGlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjMyNTI6IFwiJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJG5saXN0XCIiKSA+JjUKKyAgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJG5saXN0KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6MzI1NTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHRlc3QgLXMgIiRubGlzdCI7IHRoZW4KKyAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCisgICAgICBpZiBzb3J0ICIkbmxpc3QiIHwgdW5pcSA+ICIkbmxpc3QiVDsgdGhlbgorCW12IC1mICIkbmxpc3QiVCAiJG5saXN0IgorICAgICAgZWxzZQorCXJtIC1mICIkbmxpc3QiVAorICAgICAgZmkKKworICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgorICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwlpZiBlZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LiRhY19leHQKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworRU9GCisJICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCisJICBldmFsICIkbHRfY3ZfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRubGlzdCIgPj4gY29uZnRlc3QuJGFjX2V4dCcKKworCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKKyNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KKyMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgorI2Vsc2UKKyMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgorIyBkZWZpbmUgY29uc3QKKyNlbmRpZgorCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KK2NvbnN0IHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGx0X3B0cl90IGFkZHJlc3M7Cit9CitsdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KK3sKK0VPRgorCSAgc2VkICJzL14kc3ltY29kZSRzeW1jb2RlKiBcKC4qXCkgXCguKlwpJC8gIHtcIlwyXCIsIChsdF9wdHJfdCkgXCZcMn0sLyIgPCAiJG5saXN0IiA+PiBjb25mdGVzdC4kYWNfZXh0CisJICBjYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKKyAgezAsIChsdF9wdHJfdCkgMH0KK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitFT0YKKwkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCisJICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0c3RtLiRhY19vYmpleHQKKwkgIHNhdmVfTElCUz0iJExJQlMiCisJICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKwkgIExJQlM9ImNvbmZ0c3RtLiRhY19vYmpleHQiCisJICBDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgorCSAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MzMwNzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6MzMxMDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KKwkgICAgcGlwZV93b3Jrcz15ZXMKKwkgIGZpCisJICBMSUJTPSIkc2F2ZV9MSUJTIgorCSAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisJZWxzZQorCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRubGlzdCIgPiY1CisJZmkKKyAgICAgIGVsc2UKKwllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkbmxpc3QiID4mNQorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICJjYW5ub3QgcnVuICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKKyAgICBmaQorICBlbHNlCisgICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QqIGNvbmZ0c3QqCisKKyAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgorICBpZiB0ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KKyAgICBicmVhaworICBlbHNlCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KKyAgZmkKK2RvbmUKKworZmkKKworZ2xvYmFsX3N5bWJvbF9waXBlPSIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIKK2lmIHRlc3QgLXogIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorICBnbG9iYWxfc3ltYm9sX3RvX2NkZWNsPQorZWxzZQorICBnbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSIkbHRfY3ZfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCIKK2ZpCitpZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlJGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wiOyB0aGVuCisgIGVjaG8gIiRhc19tZTozMzQ4OiByZXN1bHQ6IGZhaWxlZCIgPiY1CitlY2hvICIke0VDSE9fVH1mYWlsZWQiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6MzM1MTogcmVzdWx0OiBvayIgPiY1CitlY2hvICIke0VDSE9fVH1vayIgPiY2CitmaQorCitmb3IgYWNfaGVhZGVyIGluIGRsZmNuLmgKK2RvCithY19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhY190cl9zaGAKK2VjaG8gIiRhc19tZTozMzU4OiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNgoraWYgZXZhbCAidGVzdCBcIlwkeyRhY19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNsaW5lIDMzNjQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjMzNjg6IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0KSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZWdyZXAgLXYgJ14gKlwrJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOjMzNzQ6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgZXZhbCAiJGFjX2FjX0hlYWRlcj15ZXMiCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBldmFsICIkYWNfYWNfSGVhZGVyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOjMzOTM6IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFjX2FjX0hlYWRlcid9J2AiID4mNQorZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFjX2FjX0hlYWRlcid9J2AiID4mNgoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYWNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFjX3RyX2NwcGAgMQorRU9GCisKK2ZpCitkb25lCisKKyMgT25seSBwZXJmb3JtIHRoZSBjaGVjayBmb3IgZmlsZSwgaWYgdGhlIGNoZWNrIG1ldGhvZCByZXF1aXJlcyBpdAorY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KK2ZpbGVfbWFnaWMqKQorICBpZiB0ZXN0ICIkZmlsZV9tYWdpY19jbWQiID0gJyRNQUdJQ19DTUQnOyB0aGVuCisgICAgZWNobyAiJGFzX21lOjM0MDc6IGNoZWNraW5nIGZvciAke2FjX3Rvb2xfcHJlZml4fWZpbGUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJHthY190b29sX3ByZWZpeH1maWxlLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9jdl9wYXRoX01BR0lDX0NNRCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXNlICRNQUdJQ19DTUQgaW4KKyAgLyopCisgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkTUFHSUNfQ01EIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikKKyAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgYWNfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCisgIElGUz0iJHtJRlM9ICAgfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iL3Vzci9iaW46JFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyR7YWNfdG9vbF9wcmVmaXh9ZmlsZTsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRhY19kaXIvJHthY190b29sX3ByZWZpeH1maWxlIgorICAgICAgaWYgdGVzdCAtbiAiJGZpbGVfbWFnaWNfdGVzdF9maWxlIjsgdGhlbgorCWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJImZpbGVfbWFnaWMgIiopCisJICBmaWxlX21hZ2ljX3JlZ2V4PSJgZXhwciBcIiRkZXBsaWJzX2NoZWNrX21ldGhvZFwiIDogXCJmaWxlX21hZ2ljIFwoLipcKVwiYCIKKwkgIE1BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgorCSAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCRmaWxlX21hZ2ljX3Rlc3RfZmlsZSAyPiAvZGV2L251bGwgfAorCSAgICBlZ3JlcCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCisJICAgIDoKKwkgIGVsc2UKKwkgICAgY2F0IDw8RU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKKyoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KKyoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcworKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0CisqKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKKyoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKKyoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KKyoqKiBidWctbGlidG9vbEBnbnUub3JnCisKK0VPRgorCSAgZmkgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICBNQUdJQ19DTUQ9IiRhY19zYXZlX01BR0lDX0NNRCIKKyAgOzsKK2VzYWMKK2ZpCisKK01BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgoraWYgdGVzdCAtbiAiJE1BR0lDX0NNRCI7IHRoZW4KKyAgZWNobyAiJGFzX21lOjM0NjI6IHJlc3VsdDogJE1BR0lDX0NNRCIgPiY1CitlY2hvICIke0VDSE9fVH0kTUFHSUNfQ01EIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOjM0NjU6IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworaWYgdGVzdCAteiAiJGx0X2N2X3BhdGhfTUFHSUNfQ01EIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICAgZWNobyAiJGFzX21lOjM0NzE6IGNoZWNraW5nIGZvciBmaWxlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGZpbGUuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X3BhdGhfTUFHSUNfQ01EK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhc2UgJE1BR0lDX0NNRCBpbgorICAvKikKKyAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQorICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBhY19zYXZlX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIKKyAgSUZTPSIke0lGUz0gICB9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIvdXNyL2JpbjokUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvZmlsZTsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRhY19kaXIvZmlsZSIKKyAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCSJmaWxlX21hZ2ljICIqKQorCSAgZmlsZV9tYWdpY19yZWdleD0iYGV4cHIgXCIkZGVwbGlic19jaGVja19tZXRob2RcIiA6IFwiZmlsZV9tYWdpYyBcKC4qXClcImAiCisJICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKKwkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKKwkgICAgZWdyZXAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICA6CisJICBlbHNlCisJICAgIGNhdCA8PEVPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiB0aGUgY29tbWFuZCBsaWJ0b29sIHVzZXMgdG8gZGV0ZWN0IHNoYXJlZCBsaWJyYXJpZXMsCisqKiogJGZpbGVfbWFnaWNfY21kLCBwcm9kdWNlcyBvdXRwdXQgdGhhdCBsaWJ0b29sIGNhbm5vdCByZWNvZ25pemUuCisqKiogVGhlIHJlc3VsdCBpcyB0aGF0IGxpYnRvb2wgbWF5IGZhaWwgdG8gcmVjb2duaXplIHNoYXJlZCBsaWJyYXJpZXMKKyoqKiBhcyBzdWNoLiAgVGhpcyB3aWxsIGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMgdGhhdAorKioqIGRlcGVuZCBvbiBzaGFyZWQgbGlicmFyaWVzLCBidXQgcHJvZ3JhbXMgbGlua2VkIHdpdGggc3VjaCBsaWJ0b29sCisqKiogbGlicmFyaWVzIHdpbGwgd29yayByZWdhcmRsZXNzIG9mIHRoaXMgcHJvYmxlbS4gIE5ldmVydGhlbGVzcywgeW91CisqKiogbWF5IHdhbnQgdG8gcmVwb3J0IHRoZSBwcm9ibGVtIHRvIHlvdXIgc3lzdGVtIG1hbmFnZXIgYW5kL29yIHRvCisqKiogYnVnLWxpYnRvb2xAZ251Lm9yZworCitFT0YKKwkgIGZpIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgTUFHSUNfQ01EPSIkYWNfc2F2ZV9NQUdJQ19DTUQiCisgIDs7Citlc2FjCitmaQorCitNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKK2lmIHRlc3QgLW4gIiRNQUdJQ19DTUQiOyB0aGVuCisgIGVjaG8gIiRhc19tZTozNTI2OiByZXN1bHQ6ICRNQUdJQ19DTUQiID4mNQorZWNobyAiJHtFQ0hPX1R9JE1BR0lDX0NNRCIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTozNTI5OiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgZWxzZQorICAgIE1BR0lDX0NNRD06CisgIGZpCitmaQorCisgIGZpCisgIDs7Citlc2FjCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTozNTQ1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgorYWNfZHVtbXk9IiRQQVRIIgorZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgIElGUz0kYWNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKK2FjX2N2X3Byb2dfUkFOTElCPSIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIKK2VjaG8gIiRhc19tZTozNTYwOiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKK2JyZWFrCitkb25lCisKK2ZpCitmaQorUkFOTElCPSRhY19jdl9wcm9nX1JBTkxJQgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFzX21lOjM1Njg6IHJlc3VsdDogJFJBTkxJQiIgPiY1CitlY2hvICIke0VDSE9fVH0kUkFOTElCIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOjM1NzE6IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KKyAgYWNfY3RfUkFOTElCPSRSQU5MSUIKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOjM1ODA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9IiRhY19jdF9SQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBhY19zYXZlX0lGUz0kSUZTOyBJRlM9JGFjX3BhdGhfc2VwYXJhdG9yCithY19kdW1teT0iJFBBVEgiCitmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgSUZTPSRhY19zYXZlX0lGUworICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAkYXNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkIiB8fCBjb250aW51ZQorYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9InJhbmxpYiIKK2VjaG8gIiRhc19tZTozNTk1OiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKK2JyZWFrCitkb25lCisKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCIiAmJiBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0iOiIKK2ZpCitmaQorYWNfY3RfUkFOTElCPSRhY19jdl9wcm9nX2FjX2N0X1JBTkxJQgoraWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFzX21lOjM2MDQ6IHJlc3VsdDogJGFjX2N0X1JBTkxJQiIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfUkFOTElCIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOjM2MDc6IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworICBSQU5MSUI9JGFjX2N0X1JBTkxJQgorZWxzZQorICBSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXN0cmlwOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6MzYxOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX1NUUklQK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19TVFJJUD0iJFNUUklQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgorYWNfZHVtbXk9IiRQQVRIIgorZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgIElGUz0kYWNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKK2FjX2N2X3Byb2dfU1RSSVA9IiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiCitlY2hvICIkYXNfbWU6MzYzNDogZm91bmQgJGFjX2Rpci8kYWNfd29yZCIgPiY1CiticmVhaworZG9uZQorCitmaQorZmkKK1NUUklQPSRhY19jdl9wcm9nX1NUUklQCitpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCisgIGVjaG8gIiRhc19tZTozNjQyOiByZXN1bHQ6ICRTVFJJUCIgPiY1CitlY2hvICIke0VDSE9fVH0kU1RSSVAiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6MzY0NTogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfU1RSSVAiOyB0aGVuCisgIGFjX2N0X1NUUklQPSRTVFJJUAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBzdHJpcDsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOjM2NTQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9TVFJJUCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9IiRhY19jdF9TVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIGFjX3NhdmVfSUZTPSRJRlM7IElGUz0kYWNfcGF0aF9zZXBhcmF0b3IKK2FjX2R1bW15PSIkUEFUSCIKK2ZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICBJRlM9JGFjX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICRhc19leGVjdXRhYmxlX3AgIiRhY19kaXIvJGFjX3dvcmQiIHx8IGNvbnRpbnVlCithY19jdl9wcm9nX2FjX2N0X1NUUklQPSJzdHJpcCIKK2VjaG8gIiRhc19tZTozNjY5OiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKK2JyZWFrCitkb25lCisKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfYWNfY3RfU1RSSVAiICYmIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9IjoiCitmaQorZmkKK2FjX2N0X1NUUklQPSRhY19jdl9wcm9nX2FjX2N0X1NUUklQCitpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCisgIGVjaG8gIiRhc19tZTozNjc4OiByZXN1bHQ6ICRhY19jdF9TVFJJUCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfU1RSSVAiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6MzY4MTogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIFNUUklQPSRhY19jdF9TVFJJUAorZWxzZQorICBTVFJJUD0iJGFjX2N2X3Byb2dfU1RSSVAiCitmaQorCitlbmFibGVfZGxvcGVuPW5vCitlbmFibGVfd2luMzJfZGxsPW5vCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1saWJ0b29sLWxvY2sgb3IgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9saWJ0b29sX2xvY2src2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKKworZmk7Cit0ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siICE9IHhubyAmJiBlbmFibGVfbGlidG9vbF9sb2NrPXllcworCisjIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKKyMgbGlidG9vbCBzdXBwb3J0LgorY2FzZSAkaG9zdCBpbgorKi0qLWlyaXg2KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICcjbGluZSAzNzA1ICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MzcwNjogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6MzcwOTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorICAgICozMi1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKKyAgICAgIDs7CisgICAgKk4zMiopCisgICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKKyAgICAgIDs7CisgICAgKjY0LWJpdCopCisgICAgICBMRD0iJHtMRC1sZH0gLTY0IgorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKworKi0qLXNjbzMuMnY1KikKKyAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgorICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKKyAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgorICBlY2hvICIkYXNfbWU6MzczMDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X2NjX25lZWRzX2JlbGYrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKworICAgICBhY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKyAgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSAzNzQzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjM3NTU6IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjM3NTg6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTozNzYxOiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6Mzc2NDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGx0X2N2X2NjX25lZWRzX2JlbGY9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2x0X2N2X2NjX25lZWRzX2JlbGY9bm8KK2ZpCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgIGFjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworZmkKK2VjaG8gIiRhc19tZTozNzgwOiByZXN1bHQ6ICRsdF9jdl9jY19uZWVkc19iZWxmIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9jdl9jY19uZWVkc19iZWxmIiA+JjYKKyAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KKyAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKKyAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKKyAgZmkKKyAgOzsKKworZXNhYworCisjIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCisjIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgorWHNlZD0nc2VkIC1lIHMvXlgvLycKK3NlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGAkXFxcXF1cKS9cXFwxL2cnCisKKyMgU2FtZSBhcyBhYm92ZSwgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgorZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woW1xcIlxcYFxcXFxdXCkvXFxcMS9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2hlbGwgdmFyaWFibGUgaW4gYQorIyBkb3VibGVfcXVvdGVfc3Vic3QnZWQgc3RyaW5nLgorZGVsYXlfdmFyaWFibGVfc3Vic3Q9J3MvXFxcXFxcXFxcXFwkL1xcXFxcXCQvZycKKworIyBDb25zdGFudHM6CitybT0icm0gLWYiCisKKyMgR2xvYmFsIHZhcmlhYmxlczoKK2RlZmF1bHRfb2ZpbGU9bGlidG9vbAorY2FuX2J1aWxkX3NoYXJlZD15ZXMKKworIyBBbGwga25vd24gbGlua2VycyByZXF1aXJlIGEgYC5hJyBhcmNoaXZlIGZvciBzdGF0aWMgbGlua2luZyAoZXhjZXB0IE0kVkMsCisjIHdoaWNoIG5lZWRzICcubGliJykuCitsaWJleHQ9YQorbHRtYWluPSIkYWNfYXV4X2Rpci9sdG1haW4uc2giCitvZmlsZT0iJGRlZmF1bHRfb2ZpbGUiCit3aXRoX2dudV9sZD0iJGx0X2N2X3Byb2dfZ251X2xkIgorbmVlZF9sb2Nrcz0iJGVuYWJsZV9saWJ0b29sX2xvY2siCisKK29sZF9DQz0iJENDIgorb2xkX0NGTEFHUz0iJENGTEFHUyIKKworIyBTZXQgc2FuZSBkZWZhdWx0cyBmb3IgdmFyaW91cyB2YXJpYWJsZXMKK3Rlc3QgLXogIiRBUiIgJiYgQVI9YXIKK3Rlc3QgLXogIiRBUl9GTEFHUyIgJiYgQVJfRkxBR1M9Y3J1Cit0ZXN0IC16ICIkQVMiICYmIEFTPWFzCit0ZXN0IC16ICIkQ0MiICYmIENDPWNjCit0ZXN0IC16ICIkRExMVE9PTCIgJiYgRExMVE9PTD1kbGx0b29sCit0ZXN0IC16ICIkTEQiICYmIExEPWxkCit0ZXN0IC16ICIkTE5fUyIgJiYgTE5fUz0ibG4gLXMiCit0ZXN0IC16ICIkTUFHSUNfQ01EIiAmJiBNQUdJQ19DTUQ9ZmlsZQordGVzdCAteiAiJE5NIiAmJiBOTT1ubQordGVzdCAteiAiJE9CSkRVTVAiICYmIE9CSkRVTVA9b2JqZHVtcAordGVzdCAteiAiJFJBTkxJQiIgJiYgUkFOTElCPToKK3Rlc3QgLXogIiRTVFJJUCIgJiYgU1RSSVA9OgordGVzdCAteiAiJGFjX29iamV4dCIgJiYgYWNfb2JqZXh0PW8KKworaWYgdGVzdCB4IiRob3N0IiAhPSB4IiRidWlsZCI7IHRoZW4KKyAgYWNfdG9vbF9wcmVmaXg9JHtob3N0X2FsaWFzfS0KK2Vsc2UKKyAgYWNfdG9vbF9wcmVmaXg9CitmaQorCisjIFRyYW5zZm9ybSBsaW51eCogdG8gKi0qLWxpbnV4LWdudSosIHRvIHN1cHBvcnQgb2xkIGNvbmZpZ3VyZSBzY3JpcHRzLgorY2FzZSAkaG9zdF9vcyBpbgorbGludXgtZ251KikgOzsKK2xpbnV4KikgaG9zdD1gZWNobyAkaG9zdCB8IHNlZCAncy9eXCguKi0uKi1saW51eFwpXCguKlwpJC9cMS1nbnVcMi8nYAorZXNhYworCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCisgICMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcworICAjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCisgIGlmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgorICAgIENPTExFQ1RfTkFNRVM9CisgICAgZXhwb3J0IENPTExFQ1RfTkFNRVMKKyAgZmkKKyAgOzsKK2VzYWMKKworIyBEZXRlcm1pbmUgY29tbWFuZHMgdG8gY3JlYXRlIG9sZC1zdHlsZSBzdGF0aWMgYXJjaGl2ZXMuCitvbGRfYXJjaGl2ZV9jbWRzPSckQVIgJEFSX0ZMQUdTICRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA2NDQgJG9sZGxpYicKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9CisKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIG9sZF9hcmNoaXZlX2NtZHM9IiRvbGRfYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkb2xkbGliIgorICBvbGRfcG9zdGluc3RhbGxfY21kcz0iXCRSQU5MSUIgXCRvbGRsaWJ+JG9sZF9wb3N0aW5zdGFsbF9jbWRzIgorZmkKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK3NldCBkdW1teSAkQ0MKK2NvbXBpbGVyPSIkMiIKKworIyMgRklYTUU6IHRoaXMgc2hvdWxkIGJlIGEgc2VwYXJhdGUgbWFjcm8KKyMjCitlY2hvICIkYXNfbWU6Mzg3NTogY2hlY2tpbmcgZm9yIG9iamRpciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBvYmpkaXIuLi4gJEVDSE9fQyIgPiY2CitybSAtZiAubGlicyAyPi9kZXYvbnVsbAorbWtkaXIgLmxpYnMgMj4vZGV2L251bGwKK2lmIHRlc3QgLWQgLmxpYnM7IHRoZW4KKyAgb2JqZGlyPS5saWJzCitlbHNlCisgICMgTVMtRE9TIGRvZXMgbm90IGFsbG93IGZpbGVuYW1lcyB0aGF0IGJlZ2luIHdpdGggYSBkb3QuCisgIG9iamRpcj1fbGlicworZmkKK3JtZGlyIC5saWJzIDI+L2Rldi9udWxsCitlY2hvICIkYXNfbWU6Mzg4NjogcmVzdWx0OiAkb2JqZGlyIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRvYmpkaXIiID4mNgorIyMKKyMjIEVORCBGSVhNRQorCisjIyBGSVhNRTogdGhpcyBzaG91bGQgYmUgYSBzZXBhcmF0ZSBtYWNybworIyMKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1waWMgb3IgLS13aXRob3V0LXBpYyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfcGljK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX3BpYyIKKyAgcGljX21vZGU9IiR3aXRodmFsIgorZWxzZQorICBwaWNfbW9kZT1kZWZhdWx0CitmaTsKK3Rlc3QgLXogIiRwaWNfbW9kZSIgJiYgcGljX21vZGU9ZGVmYXVsdAorCisjIFdlIGFzc3VtZSBoZXJlIHRoYXQgdGhlIHZhbHVlIGZvciBsdF9jdl9wcm9nX2NjX3BpYyB3aWxsIG5vdCBiZSBjYWNoZWQKKyMgaW4gaXNvbGF0aW9uLCBhbmQgdGhhdCBzZWVpbmcgaXQgc2V0IChmcm9tIHRoZSBjYWNoZSkgaW5kaWNhdGVzIHRoYXQKKyMgdGhlIGFzc29jaWF0ZWQgdmFsdWVzIGFyZSBzZXQgKGluIHRoZSBjYWNoZSkgY29ycmVjdGx5IHRvby4KK2VjaG8gIiRhc19tZTozOTA2OiBjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9jdl9wcm9nX2NjX3BpYytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICAgbHRfY3ZfcHJvZ19jY19waWM9CisgIGx0X2N2X3Byb2dfY2Nfc2hsaWI9CisgIGx0X2N2X3Byb2dfY2Nfd2w9CisgIGx0X2N2X3Byb2dfY2Nfc3RhdGljPQorICBsdF9jdl9wcm9nX2NjX25vX2J1aWx0aW49CisgIGx0X2N2X3Byb2dfY2NfY2FuX2J1aWxkX3NoYXJlZD0kY2FuX2J1aWxkX3NoYXJlZAorCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgbHRfY3ZfcHJvZ19jY193bD0nLVdsLCcKKyAgICBsdF9jdl9wcm9nX2NjX3N0YXRpYz0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgIyBCZWxvdyB0aGVyZSBpcyBhIGRpcnR5IGhhY2sgdG8gZm9yY2Ugbm9ybWFsIHN0YXRpYyBsaW5raW5nIHdpdGggLWxkbAorICAgICAgIyBUaGUgcHJvYmxlbSBpcyBiZWNhdXNlIGxpYmRsIGR5bmFtaWNhbGx5IGxpbmtlZCB3aXRoIGJvdGggbGliYyBhbmQKKyAgICAgICMgbGliQyAoQUlYIEMrKyBsaWJyYXJ5KSwgd2hpY2ggb2J2aW91c2x5IGRvZXNuJ3QgaW5jbHVkZWQgaW4gbGlicmFyaWVzCisgICAgICAjIGxpc3QgYnkgZ2NjLiBUaGlzIGNhdXNlIHVuZGVmaW5lZCBzeW1ib2xzIHdpdGggLXN0YXRpYyBmbGFncy4KKyAgICAgICMgVGhpcyBoYWNrIGFsbG93cyBDIHByb2dyYW1zIHRvIGJlIGxpbmtlZCB3aXRoICItc3RhdGljIC1sZGwiLCBidXQKKyAgICAgICMgd2Ugbm90IHN1cmUgYWJvdXQgQysrIHByb2dyYW1zLgorICAgICAgbHRfY3ZfcHJvZ19jY19zdGF0aWM9IiRsdF9jdl9wcm9nX2NjX3N0YXRpYyAke2x0X2N2X3Byb2dfY2Nfd2x9LWxDIgorICAgICAgOzsKKyAgICBhbWlnYW9zKikKKyAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgIGx0X2N2X3Byb2dfY2NfcGljPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgICA7OworICAgIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCisgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCisgICAgICBsdF9jdl9wcm9nX2NjX3BpYz0nLWZuby1jb21tb24nCisgICAgICA7OworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IG9zMiopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgbHRfY3ZfcHJvZ19jY19waWM9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCSBsdF9jdl9wcm9nX2NjX3BpYz0tS2NvbmZvcm1fcGljCisgICAgICBmaQorICAgICAgOzsKKyAgICAqKQorICAgICAgbHRfY3ZfcHJvZ19jY19waWM9Jy1mUElDJworICAgICAgOzsKKyAgICBlc2FjCisgIGVsc2UKKyAgICAjIFBPUlRNRSBDaGVjayBmb3IgUElDIGZsYWdzIGZvciB0aGUgc3lzdGVtIGNvbXBpbGVyLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgzKiB8IGFpeDQqIHwgYWl4NSopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICAgICAjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorICAgICAgICBsdF9jdl9wcm9nX2NjX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICAgIGx0X2N2X3Byb2dfY2Nfd2w9Jy1XbCwnCisgICAgICBlbHNlCisgICAgICAgIGx0X2N2X3Byb2dfY2Nfc3RhdGljPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCisgICAgICBmaQorICAgICAgOzsKKworICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9jdl9wcm9nX2NjX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/CisgICAgICBsdF9jdl9wcm9nX2NjX3dsPSctV2wsJworICAgICAgbHRfY3ZfcHJvZ19jY19zdGF0aWM9IiR7bHRfY3ZfcHJvZ19jY193bH0tYSAke2x0X2N2X3Byb2dfY2Nfd2x9YXJjaGl2ZSIKKyAgICAgIGx0X2N2X3Byb2dfY2NfcGljPScrWicKKyAgICAgIDs7CisKKyAgICBpcml4NSogfCBpcml4NiopCisgICAgICBsdF9jdl9wcm9nX2NjX3dsPSctV2wsJworICAgICAgbHRfY3ZfcHJvZ19jY19zdGF0aWM9Jy1ub25fc2hhcmVkJworICAgICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgorICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IG9zMiopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgbHRfY3ZfcHJvZ19jY19waWM9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgbHRfY3ZfcHJvZ19jY19waWM9Jy1LUElDJworICAgICAgbHRfY3ZfcHJvZ19jY19zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgorICAgICAgbHRfY3ZfcHJvZ19jY193bD0nLVdsLCcKKyAgICAgIGx0X2N2X3Byb2dfY2Nfc3RhdGljPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBzY28zLjJ2NSopCisgICAgICBsdF9jdl9wcm9nX2NjX3BpYz0nLUtwaWMnCisgICAgICBsdF9jdl9wcm9nX2NjX3N0YXRpYz0nLWRuJworICAgICAgbHRfY3ZfcHJvZ19jY19zaGxpYj0nLWJlbGYnCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBsdF9jdl9wcm9nX2NjX3BpYz0nLUtQSUMnCisgICAgICBsdF9jdl9wcm9nX2NjX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICBsdF9jdl9wcm9nX2NjX3dsPSctV2wsJworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBsdF9jdl9wcm9nX2NjX3BpYz0nLVBJQycKKyAgICAgIGx0X2N2X3Byb2dfY2Nfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIGx0X2N2X3Byb2dfY2Nfd2w9Jy1Rb3B0aW9uIGxkICcKKyAgICAgIDs7CisKKyAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyogfCBzeXN2NSopCisgICAgICBsdF9jdl9wcm9nX2NjX3BpYz0nLUtQSUMnCisgICAgICBsdF9jdl9wcm9nX2NjX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICBpZiB0ZXN0ICJ4JGhvc3RfdmVuZG9yIiA9IHhzbmk7IHRoZW4KKyAgICAgICAgbHRfY3ZfcHJvZ19jY193bD0nLUxEJworICAgICAgZWxzZQorICAgICAgICBsdF9jdl9wcm9nX2NjX3dsPSctV2wsJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICB1dHM0KikKKyAgICAgIGx0X2N2X3Byb2dfY2NfcGljPSctcGljJworICAgICAgbHRfY3ZfcHJvZ19jY19zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKwlsdF9jdl9wcm9nX2NjX3BpYz0nLUtjb25mb3JtX3BpYycKKwlsdF9jdl9wcm9nX2NjX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgICopCisgICAgICBsdF9jdl9wcm9nX2NjX2Nhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIDs7CisgICAgZXNhYworICBmaQorCitmaQorCitpZiB0ZXN0IC16ICIkbHRfY3ZfcHJvZ19jY19waWMiOyB0aGVuCisgIGVjaG8gIiRhc19tZTo0MDUzOiByZXN1bHQ6IG5vbmUiID4mNQorZWNobyAiJHtFQ0hPX1R9bm9uZSIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTo0MDU2OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NjX3BpYyIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfY3ZfcHJvZ19jY19waWMiID4mNgorCisgICMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBwaWNfZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyAgZWNobyAiJGFzX21lOjQwNjA6IGNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfY3ZfcHJvZ19jY19waWMgd29ya3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X2N2X3Byb2dfY2NfcGljIHdvcmtzLi4uICRFQ0hPX0MiID4mNgorICBpZiB0ZXN0ICIke2x0X2N2X3Byb2dfY2NfcGljX3dvcmtzK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICBDRkxBR1M9IiRDRkxBR1MgJGx0X2N2X3Byb2dfY2NfcGljIC1EUElDIgorICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgNDA2OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjQwODA6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjQwODM6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6NDA4NjogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjQwODk6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICAgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKwkjIE9uIEhQLVVYLCBib3RoIENDIGFuZCBHQ0Mgb25seSB3YXJuIHRoYXQgUElDIGlzIHN1cHBvcnRlZC4uLiB0aGVuCisJIyB0aGV5IGNyZWF0ZSBub24tUElDIG9iamVjdHMuICBTbywgaWYgdGhlcmUgd2VyZSBhbnkgd2FybmluZ3MsIHdlCisJIyBhc3N1bWUgdGhhdCBQSUMgaXMgbm90IHN1cHBvcnRlZC4KKwlpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorCSAgbHRfY3ZfcHJvZ19jY19waWNfd29ya3M9bm8KKwllbHNlCisJICBsdF9jdl9wcm9nX2NjX3BpY193b3Jrcz15ZXMKKwlmaQorCTs7CisgICAgICAqKQorCWx0X2N2X3Byb2dfY2NfcGljX3dvcmtzPXllcworCTs7CisgICAgICBlc2FjCisKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICAgICAgbHRfY3ZfcHJvZ19jY19waWNfd29ya3M9bm8KKworZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCitmaQorCisgIGlmIHRlc3QgIlgkbHRfY3ZfcHJvZ19jY19waWNfd29ya3MiID0gWG5vOyB0aGVuCisgICAgbHRfY3ZfcHJvZ19jY19waWM9CisgICAgbHRfY3ZfcHJvZ19jY19jYW5fYnVpbGRfc2hhcmVkPW5vCisgIGVsc2UKKyAgICBsdF9jdl9wcm9nX2NjX3BpYz0iICRsdF9jdl9wcm9nX2NjX3BpYyIKKyAgZmkKKworICBlY2hvICIkYXNfbWU6NDEyNTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jY19waWNfd29ya3MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X3Byb2dfY2NfcGljX3dvcmtzIiA+JjYKK2ZpCisjIworIyMgRU5EIEZJWE1FCisKKyMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIHNoYXJlZCBsaWJyYXJ5IGNvbXBpbGF0aW9uIGZsYWdzLgoraWYgdGVzdCAtbiAiJGx0X2N2X3Byb2dfY2Nfc2hsaWIiOyB0aGVuCisgIHsgZWNobyAiJGFzX21lOjQxMzM6IFdBUk5JTkc6IFxgJENDJyByZXF1aXJlcyBcYCRsdF9jdl9wcm9nX2NjX3NobGliJyB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogXGAkQ0MnIHJlcXVpcmVzIFxgJGx0X2N2X3Byb2dfY2Nfc2hsaWInIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiID4mMjt9CisgIGlmIGVjaG8gIiRvbGRfQ0MgJG9sZF9DRkxBR1MgIiB8IGVncmVwIC1lICJbIAldJGx0X2N2X3Byb2dfY2Nfc2hsaWJbIAldIiA+L2Rldi9udWxsOyB0aGVuIDoKKyAgZWxzZQorICAgeyBlY2hvICIkYXNfbWU6NDEzNzogV0FSTklORzogYWRkIFxgJGx0X2N2X3Byb2dfY2Nfc2hsaWInIHRvIHRoZSBDQyBvciBDRkxBR1MgZW52IHZhcmlhYmxlIGFuZCByZWNvbmZpZ3VyZSIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IGFkZCBcYCRsdF9jdl9wcm9nX2NjX3NobGliJyB0byB0aGUgQ0Mgb3IgQ0ZMQUdTIGVudiB2YXJpYWJsZSBhbmQgcmVjb25maWd1cmUiID4mMjt9CisgICAgbHRfY3ZfcHJvZ19jY19jYW5fYnVpbGRfc2hhcmVkPW5vCisgIGZpCitmaQorCisjIyBGSVhNRTogdGhpcyBzaG91bGQgYmUgYSBzZXBhcmF0ZSBtYWNybworIyMKK2VjaG8gIiRhc19tZTo0MTQ1OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X2N2X3Byb2dfY2Nfc3RhdGljIHdvcmtzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF9jdl9wcm9nX2NjX3N0YXRpYyB3b3Jrcy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3ZfcHJvZ19jY19zdGF0aWNfd29ya3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgICBsdF9jdl9wcm9nX2NjX3N0YXRpY193b3Jrcz1ubworICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICBMREZMQUdTPSIkTERGTEFHUyAkbHRfY3ZfcHJvZ19jY19zdGF0aWMiCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgNDE1NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTo0MTY2OiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTo0MTY5OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKyAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6NDE3MjogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjQxNzU6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBsdF9jdl9wcm9nX2NjX3N0YXRpY193b3Jrcz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKworZmkKKworIyBCZWx0ICphbmQqIGJyYWNlcyB0byBzdG9wIG15IHRyb3VzZXJzIGZhbGxpbmcgZG93bjoKK3Rlc3QgIlgkbHRfY3ZfcHJvZ19jY19zdGF0aWNfd29ya3MiID0gWG5vICYmIGx0X2N2X3Byb2dfY2Nfc3RhdGljPQorZWNobyAiJGFzX21lOjQxODk6IHJlc3VsdDogJGx0X2N2X3Byb2dfY2Nfc3RhdGljX3dvcmtzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9jdl9wcm9nX2NjX3N0YXRpY193b3JrcyIgPiY2CisKK3BpY19mbGFnPSIkbHRfY3ZfcHJvZ19jY19waWMiCitzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3M9IiRsdF9jdl9wcm9nX2NjX3NobGliIgord2w9IiRsdF9jdl9wcm9nX2NjX3dsIgorbGlua19zdGF0aWNfZmxhZz0iJGx0X2N2X3Byb2dfY2Nfc3RhdGljIgorbm9fYnVpbHRpbl9mbGFnPSIkbHRfY3ZfcHJvZ19jY19ub19idWlsdGluIgorY2FuX2J1aWxkX3NoYXJlZD0iJGx0X2N2X3Byb2dfY2NfY2FuX2J1aWxkX3NoYXJlZCIKKyMjCisjIyBFTkQgRklYTUUKKworIyMgRklYTUU6IHRoaXMgc2hvdWxkIGJlIGEgc2VwYXJhdGUgbWFjcm8KKyMjCisjIENoZWNrIHRvIHNlZSBpZiBvcHRpb25zIC1vIGFuZCAtYyBhcmUgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydGVkIGJ5IGNvbXBpbGVyCitlY2hvICIkYXNfbWU6NDIwNDogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X2NvbXBpbGVyX2NfbytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorCiskcm0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKK21rZGlyIGNvbmZ0ZXN0CitjZCBjb25mdGVzdAorZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC4kYWNfZXh0Citta2RpciBvdXQKKyMgQWNjb3JkaW5nIHRvIFRvbSBUcm9tZXksIElhbiBMYW5jZSBUYXlsb3IgcmVwb3J0ZWQgdGhlcmUgYXJlIEMgY29tcGlsZXJzCisjIHRoYXQgd2lsbCBjcmVhdGUgdGVtcG9yYXJ5IGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSByZWdhcmRsZXNzIG9mCisjIHRoZSBvdXRwdXQgZGlyZWN0b3J5LiAgVGh1cywgbWFraW5nIENXRCByZWFkLW9ubHkgd2lsbCBjYXVzZSB0aGlzIHRlc3QKKyMgdG8gZmFpbCwgZW5hYmxpbmcgbG9ja2luZyBvciBhdCBsZWFzdCB3YXJuaW5nIHRoZSB1c2VyIG5vdCB0byBkbyBwYXJhbGxlbAorIyBidWlsZHMuCitjaG1vZCAtdyAuCitzYXZlX0NGTEFHUz0iJENGTEFHUyIKK0NGTEFHUz0iJENGTEFHUyAtbyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQiCitjb21waWxlcl9jX289bm8KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDIyNDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj5vdXQvY29uZnRlc3QuZXJyOyB9ICYmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0OyB0aGVuCisgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICBpZiB0ZXN0IC1zIG91dC9jb25mdGVzdC5lcnI7IHRoZW4KKyAgICBsdF9jdl9jb21waWxlcl9jX289bm8KKyAgZWxzZQorICAgIGx0X2N2X2NvbXBpbGVyX2Nfbz15ZXMKKyAgZmkKK2Vsc2UKKyAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgY2F0IG91dC9jb25mdGVzdC5lcnIgMT4mNQorICBsdF9jdl9jb21waWxlcl9jX289bm8KK2ZpCitDRkxBR1M9IiRzYXZlX0NGTEFHUyIKK2NobW9kIHUrdyAuCiskcm0gY29uZnRlc3QqIG91dC8qCitybWRpciBvdXQKK2NkIC4uCitybWRpciBjb25mdGVzdAorJHJtIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCisKK2ZpCisKK2NvbXBpbGVyX2Nfbz0kbHRfY3ZfY29tcGlsZXJfY19vCitlY2hvICIkYXNfbWU6NDI0ODogcmVzdWx0OiAkY29tcGlsZXJfY19vIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRjb21waWxlcl9jX28iID4mNgorCitpZiB0ZXN0IHgiJGNvbXBpbGVyX2NfbyIgPSB4InllcyI7IHRoZW4KKyAgIyBDaGVjayB0byBzZWUgaWYgd2UgY2FuIHdyaXRlIHRvIGEgLmxvCisgIGVjaG8gIiRhc19tZTo0MjUzOiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS5sbyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLmxvLi4uICRFQ0hPX0MiID4mNgorICBpZiB0ZXN0ICIke2x0X2N2X2NvbXBpbGVyX29fbG8rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKworICBsdF9jdl9jb21waWxlcl9vX2xvPW5vCisgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgLWMgLW8gY29uZnRlc3QubG8iCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgNDI2MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludAorbWFpbiAoKQoreworaW50IHNvbWVfdmFyaWFibGUgPSAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTo0Mjc1OiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTo0Mjc4OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKyAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOjQyODE6IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTo0Mjg0OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgIGx0X2N2X2NvbXBpbGVyX29fbG89bm8KKyAgICBlbHNlCisgICAgICBsdF9jdl9jb21waWxlcl9vX2xvPXllcworICAgIGZpCisKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKworZmkKKworICBjb21waWxlcl9vX2xvPSRsdF9jdl9jb21waWxlcl9vX2xvCisgIGVjaG8gIiRhc19tZTo0MzA0OiByZXN1bHQ6ICRjb21waWxlcl9jX2xvIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRjb21waWxlcl9jX2xvIiA+JjYKK2Vsc2UKKyAgY29tcGlsZXJfb19sbz1ubworZmkKKyMjCisjIyBFTkQgRklYTUUKKworIyMgRklYTUU6IHRoaXMgc2hvdWxkIGJlIGEgc2VwYXJhdGUgbWFjcm8KKyMjCisjIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gZG8gaGFyZCBsaW5rcyB0byBsb2NrIHNvbWUgZmlsZXMgaWYgbmVlZGVkCitoYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCitpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgorICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKKyAgZWNobyAiJGFzX21lOjQzMTg6IGNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcy4uLiAkRUNIT19DIiA+JjYKKyAgaGFyZF9saW5rcz15ZXMKKyAgJHJtIGNvbmZ0ZXN0KgorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICB0b3VjaCBjb25mdGVzdC5hCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgZWNobyAiJGFzX21lOjQzMjY6IHJlc3VsdDogJGhhcmRfbGlua3MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGhhcmRfbGlua3MiID4mNgorICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOjQzMjk6IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjI7fQorICAgIG5lZWRfbG9ja3M9d2FybgorICBmaQorZWxzZQorICBuZWVkX2xvY2tzPW5vCitmaQorIyMKKyMjIEVORCBGSVhNRQorCisjIyBGSVhNRTogdGhpcyBzaG91bGQgYmUgYSBzZXBhcmF0ZSBtYWNybworIyMKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICMgQ2hlY2sgdG8gc2VlIGlmIG9wdGlvbnMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyBhcmUgc3VwcG9ydGVkIGJ5IGNvbXBpbGVyCisgIGVjaG8gIiRhc19tZTo0MzQzOiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zLi4uICRFQ0hPX0MiID4mNgorICBlY2hvICJpbnQgc29tZV92YXJpYWJsZSA9IDA7IiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgIENGTEFHUz0iJENGTEFHUyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIC1jIGNvbmZ0ZXN0LiRhY19leHQiCisgIGNvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucz1ubworICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNsaW5lIDQzNTAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQKK21haW4gKCkKK3sKK2ludCBzb21lX3ZhcmlhYmxlID0gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NDM2MjogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6NDM2NTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTo0MzY4OiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6NDM3MTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICBjb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9bm8KKyAgICBlbHNlCisgICAgICBjb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9eWVzCisgICAgZmkKKworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CitmaQorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorICBlY2hvICIkYXNfbWU6NDM4NzogcmVzdWx0OiAkY29tcGlsZXJfcnR0aV9leGNlcHRpb25zIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRjb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID4mNgorCisgIGlmIHRlc3QgIiRjb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID0gInllcyI7IHRoZW4KKyAgICBub19idWlsdGluX2ZsYWc9JyAtZm5vLWJ1aWx0aW4gLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucycKKyAgZWxzZQorICAgIG5vX2J1aWx0aW5fZmxhZz0nIC1mbm8tYnVpbHRpbicKKyAgZmkKK2ZpCisjIworIyMgRU5EIEZJWE1FCisKKyMjIEZJWE1FOiB0aGlzIHNob3VsZCBiZSBhIHNlcGFyYXRlIG1hY3JvCisjIworIyBTZWUgaWYgdGhlIGxpbmtlciBzdXBwb3J0cyBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgorZWNobyAiJGFzX21lOjQ0MDI6IGNoZWNraW5nIHdoZXRoZXIgdGhlIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0aGUgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gJEVDSE9fQyIgPiY2CisKK2FsbG93X3VuZGVmaW5lZF9mbGFnPQorbm9fdW5kZWZpbmVkX2ZsYWc9CituZWVkX2xpYl9wcmVmaXg9dW5rbm93bgorbmVlZF92ZXJzaW9uPXVua25vd24KKyMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgorIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCithcmNoaXZlX2NtZHM9CithcmNoaXZlX2V4cHN5bV9jbWRzPQorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0KK29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPQorZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPQord2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Cit0aHJlYWRfc2FmZV9mbGFnX3NwZWM9CitoYXJkY29kZV9pbnRvX2xpYnM9bm8KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9CitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPQoraGFyZGNvZGVfZGlyZWN0PW5vCitoYXJkY29kZV9taW51c19MPW5vCitoYXJkY29kZV9zaGxpYnBhdGhfdmFyPXVuc3VwcG9ydGVkCitydW5wYXRoX3Zhcj0KK2xpbmtfYWxsX2RlcGxpYnM9dW5rbm93bgorYWx3YXlzX2V4cG9ydF9zeW1ib2xzPW5vCitleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8IHNlZCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyMgaW5jbHVkZV9leHBzeW1zIHNob3VsZCBiZSBhIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIHN5bWJvbHMgdG8gYmUgKmFsd2F5cyoKKyMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0CitpbmNsdWRlX2V4cHN5bXM9CisjIGV4Y2x1ZGVfZXhwc3ltcyBjYW4gYmUgYW4gZWdyZXAgcmVndWxhciBleHByZXNzaW9uIG9mIHN5bWJvbHMgdG8gZXhjbHVkZQorIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgorIyBlbmQgb2YgbGluZS4gIEV4YW1wbGU6IGBhfGJjfC4qZC4qJyB3aWxsIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgYGEnIGFuZCBgYmMnLAorIyBhcyB3ZWxsIGFzIGFueSBzeW1ib2wgdGhhdCBjb250YWlucyBgZCcuCitleGNsdWRlX2V4cHN5bXM9Il9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKKyMgQWx0aG91Z2ggX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGEgdmFsaWQgc3ltYm9sIEMgbmFtZSwgbW9zdCBhLm91dAorIyBwbGF0Zm9ybXMgKGFiKXVzZSBpdCBpbiBQSUMgY29kZSwgYnV0IHRoZWlyIGxpbmtlcnMgZ2V0IGNvbmZ1c2VkIGlmCisjIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKKyMgcmVseSBvbiB0aGlzIHN5bWJvbCBuYW1lLCBpdCdzIHByb2JhYmx5IGZpbmUgdG8gbmV2ZXIgaW5jbHVkZSBpdCBpbgorIyBwcmVsb2FkZWQgc3ltYm9sIHRhYmxlcy4KK2V4dHJhY3RfZXhwc3ltc19jbWRzPQorCitjYXNlICRob3N0X29zIGluCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogKQorICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCisgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgIHdpdGhfZ251X2xkPW5vCisgIGZpCisgIDs7CisKK2VzYWMKKworbGRfc2hsaWJzPXllcworaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQorICB3bGFyYz0nJHt3bH0nCisKKyAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyogfCBhaXg0KiB8IGFpeDUqKQorICAgICMgT24gQUlYLCB0aGUgR05VIGxpbmtlciBpcyB2ZXJ5IGJyb2tlbgorICAgICMgTm90ZTpDaGVjayBHTlUgbGlua2VyIG9uIEFJWCA1LUlBNjQgd2hlbi9pZiBpdCBiZWNvbWVzIGF2YWlsYWJsZS4KKyAgICBsZF9zaGxpYnM9bm8KKyAgICBjYXQgPDxFT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi45LjEsIGlzIHJlcG9ydGVkCisqKiogdG8gYmUgdW5hYmxlIHRvIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEFJWC4KKyoqKiBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIElmIHlvdQorKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gbW9kaWZ5IHlvdXIgUEFUSAorKioqIHNvIHRoYXQgYSBub24tR05VIGxpbmtlciBpcyBmb3VuZCwgYW5kIHRoZW4gcmVzdGFydC4KKworRU9GCisgICAgOzsKKworICBhbWlnYW9zKikKKyAgICBhcmNoaXZlX2NtZHM9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisKKyAgICAjIFNhbXVlbCBBLiBGYWx2byBJSSA8a2M1dGphQGRvbHBoaW4ub3BlbnByb2plY3RzLm5ldD4gcmVwb3J0cworICAgICMgdGhhdCB0aGUgc2VtYW50aWNzIG9mIGR5bmFtaWMgbGlicmFyaWVzIG9uIEFtaWdhT1MsIGF0IGxlYXN0IHVwCisgICAgIyB0byB2ZXJzaW9uIDQsIGlzIHRvIHNoYXJlIGRhdGEgYW1vbmcgbXVsdGlwbGUgcHJvZ3JhbXMgbGlua2VkCisgICAgIyB3aXRoIHRoZSBzYW1lIGR5bmFtaWMgbGlicmFyeS4gIFNpbmNlIHRoaXMgZG9lc24ndCBtYXRjaCB0aGUKKyAgICAjIGJlaGF2aW9yIG9mIHNoYXJlZCBsaWJyYXJpZXMgb24gb3RoZXIgcGxhdGZvcm1zLCB3ZSBjYW4gdXNlCisgICAgIyB0aGVtLgorICAgIGxkX3NobGlicz1ubworICAgIDs7CisKKyAgYmVvcyopCisgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZWdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICAgICMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKKyAgICAgICMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKKyAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgIGVsc2UKKyAgICAgIGxkX3NobGlicz1ubworICAgIGZpCisgICAgOzsKKworICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcworCisgICAgZXh0cmFjdF9leHBzeW1zX2NtZHM9J3Rlc3QgLWYgJG91dHB1dF9vYmpkaXIvaW1wZ2VuLmMgfHwgXAorICAgICAgc2VkIC1lICIvXiMgXC9cKiBpbXBnZW5cLmMgc3RhcnRzIGhlcmUgXCpcLy8sL14jIFwvXCogaW1wZ2VuLmMgZW5kcyBoZXJlIFwqXC8vIHsgcy9eIyAvLztzL14jICokLy87IHA7IH0iIC1lIGQgPCAkJycwID4gJG91dHB1dF9vYmpkaXIvaW1wZ2VuLmN+CisgICAgICB0ZXN0IC1mICRvdXRwdXRfb2JqZGlyL2ltcGdlbi5leGUgfHwgKGNkICRvdXRwdXRfb2JqZGlyICYmIFwKKyAgICAgIGlmIHRlc3QgIngkSE9TVF9DQyIgIT0gIngiIDsgdGhlbiAkSE9TVF9DQyAtbyBpbXBnZW4gaW1wZ2VuLmMgOyBcCisgICAgICBlbHNlICRDQyAtbyBpbXBnZW4gaW1wZ2VuLmMgOyBmaSl+CisgICAgICAkb3V0cHV0X29iamRpci9pbXBnZW4gJGRpci8kc29yb290ID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1kZWYnCisKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0nJERMTFRPT0wgLS1hcz0kQVMgLS1kbGxuYW1lICRzb25hbWUgLS1kZWYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1kZWYgLS1vdXRwdXQtbGliICRvdXRwdXRfb2JqZGlyLyRuZXdsaWInCisKKyAgICAjIGN5Z3dpbiBhbmQgbWluZ3cgZGxscyBoYXZlIGRpZmZlcmVudCBlbnRyeSBwb2ludHMgYW5kIHNldHMgb2Ygc3ltYm9scworICAgICMgdG8gZXhjbHVkZS4KKyAgICAjIEZJWE1FOiB3aGF0IGFib3V0IHZhbHVlcyBmb3IgTVNWQz8KKyAgICBkbGxfZW50cnk9X19jeWd3aW5fZGxsX2VudHJ5QDEyCisgICAgZGxsX2V4Y2x1ZGVfc3ltYm9scz1EbGxNYWluQDEyLF9jeWd3aW5fZGxsX2VudHJ5QDEyLF9jeWd3aW5fbm9uY3lnd2luX2RsbF9lbnRyeUAxMn4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgbWluZ3cqKQorICAgICAgIyBtaW5ndyB2YWx1ZXMKKyAgICAgIGRsbF9lbnRyeT1fRGxsTWFpbkNSVFN0YXJ0dXBAMTIKKyAgICAgIGRsbF9leGNsdWRlX3N5bWJvbHM9RGxsTWFpbkAxMixEbGxNYWluQ1JUU3RhcnR1cEAxMixEbGxFbnRyeVBvaW50QDEyfgorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIG1pbmd3IGFuZCBjeWd3aW4gZGlmZmVyLCBhbmQgaXQncyBzaW1wbGVzdCB0byBqdXN0IGV4Y2x1ZGUgdGhlIHVuaW9uCisgICAgIyBvZiB0aGUgdHdvIHN5bWJvbCBzZXRzLgorICAgIGRsbF9leGNsdWRlX3N5bWJvbHM9RGxsTWFpbkAxMixfY3lnd2luX2RsbF9lbnRyeUAxMixfY3lnd2luX25vbmN5Z3dpbl9kbGxfZW50cnlAMTIsRGxsTWFpbkNSVFN0YXJ0dXBAMTIsRGxsRW50cnlQb2ludEAxMgorCisgICAgIyByZWNlbnQgY3lnd2luIGFuZCBtaW5ndyBzeXN0ZW1zIHN1cHBseSBhIHN0dWIgRGxsTWFpbiB3aGljaCB0aGUgdXNlcgorICAgICMgY2FuIG92ZXJyaWRlLCBidXQgb24gb2xkZXIgc3lzdGVtcyB3ZSBoYXZlIHRvIHN1cHBseSBvbmUgKGluIGx0ZGxsLmMpCisgICAgaWYgdGVzdCAieCRsdF9jdl9uZWVkX2RsbG1haW4iID0gInh5ZXMiOyB0aGVuCisgICAgICBsdGRsbF9vYmo9JyRvdXRwdXRfb2JqZGlyLyRzb25hbWUtbHRkbGwuJyIkYWNfb2JqZXh0ICIKKyAgICAgIGx0ZGxsX2NtZHM9J3Rlc3QgLWYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1sdGRsbC5jIHx8IHNlZCAtZSAiL14jIFwvXCogbHRkbGxcLmMgc3RhcnRzIGhlcmUgXCpcLy8sL14jIFwvXCogbHRkbGwuYyBlbmRzIGhlcmUgXCpcLy8geyBzL14jIC8vOyBwOyB9IiAtZSBkIDwgWyRdMCA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtbHRkbGwuY34KKwl0ZXN0IC1mICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtbHRkbGwuJGFjX29iamV4dCB8fCAoY2QgJG91dHB1dF9vYmpkaXIgJiYgJENDIC1jICRzb25hbWUtbHRkbGwuYyl+JworICAgIGVsc2UKKyAgICAgIGx0ZGxsX29iaj0KKyAgICAgIGx0ZGxsX2NtZHM9CisgICAgZmkKKworICAgICMgRXh0cmFjdCB0aGUgc3ltYm9sIGV4cG9ydCBsaXN0IGZyb20gYW4gYC0tZXhwb3J0LWFsbCcgZGVmIGZpbGUsCisgICAgIyB0aGVuIHJlZ2VuZXJhdGUgdGhlIGRlZiBmaWxlIGZyb20gdGhlIHN5bWJvbCBleHBvcnQgbGlzdCwgc28gdGhhdAorICAgICMgdGhlIGNvbXBpbGVkIGRsbCBvbmx5IGV4cG9ydHMgdGhlIHN5bWJvbCBleHBvcnQgbGlzdC4KKyAgICAjIEJlIGNhcmVmdWwgbm90IHRvIHN0cmlwIHRoZSBEQVRBIHRhZyBsZWZ0IGJlIG5ld2VyIGRsbHRvb2xzLgorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHM9IiRsdGRsbF9jbWRzIicKKyAgICAgICRETExUT09MIC0tZXhwb3J0LWFsbCAtLWV4Y2x1ZGUtc3ltYm9scyAnJGRsbF9leGNsdWRlX3N5bWJvbHMnIC0tb3V0cHV0LWRlZiAkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZiAnJGx0ZGxsX29iaickbGlib2JqcyAkY29udmVuaWVuY2V+CisgICAgICBzZWQgLWUgIjEsL0VYUE9SVFMvZCIgLWUgInMvIEAgWzAtOV0qLy8iIC1lICJzLyAqOy4qJC8vIiA8ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmID4gJGV4cG9ydF9zeW1ib2xzJworCisgICAgIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQorICAgICMgaXMgRVhQT1JUUyksIHVzZSBpdCBhcyBpcy4KKyAgICAjIElmIERBVEEgdGFncyBmcm9tIGEgcmVjZW50IGRsbHRvb2wgYXJlIHByZXNlbnQsIGhvbm91ciB0aGVtIQorICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J2lmIHRlc3QgInhgaGVhZCAtMSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisgICAgICAgIGNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZjsKKyAgICAgIGVsc2UKKyAgICAgICAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1kZWY7CisgICAgICAgIF9sdF9oaW50PTE7CisgICAgICAgIGNhdCAkZXhwb3J0X3N5bWJvbHMgfCB3aGlsZSByZWFkIHN5bWJvbDsgZG8KKyAgICAgICAgIHNldCBkdW1teSBcJHN5bWJvbDsKKyAgICAgICAgIGNhc2UgXCQjIGluCisgICAgICAgICAgIDIpIGVjaG8gIiAgIFwkMiBAIFwkX2x0X2hpbnQgOyAiID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmOzsKKyAgICAgICAgICAgKikgZWNobyAiICAgICBcJDIgQCBcJF9sdF9oaW50IFwkMyA7ICIgPj4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1kZWY7OworICAgICAgICAgZXNhYzsKKyAgICAgICAgIF9sdF9oaW50PWBleHByIDEgKyBcJF9sdF9oaW50YDsKKyAgICAgICAgZG9uZTsKKyAgICAgIGZpfgorICAgICAgJyIkbHRkbGxfY21kcyInCisgICAgICAkQ0MgLVdsLC0tYmFzZS1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUtYmFzZSAnJGx0X2N2X2NjX2RsbF9zd2l0Y2gnIC1XbCwtZSwnJGRsbF9lbnRyeScgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAnJGx0ZGxsX29iaickbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+CisgICAgICAkRExMVE9PTCAtLWFzPSRBUyAtLWRsbG5hbWUgJHNvbmFtZSAtLWV4Y2x1ZGUtc3ltYm9scyAnJGRsbF9leGNsdWRlX3N5bWJvbHMnIC0tZGVmICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmIC0tYmFzZS1maWxlICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtYmFzZSAtLW91dHB1dC1leHAgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1leHB+CisgICAgICAkQ0MgLVdsLC0tYmFzZS1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUtYmFzZSAkb3V0cHV0X29iamRpci8kc29uYW1lLWV4cCAnJGx0X2N2X2NjX2RsbF9zd2l0Y2gnIC1XbCwtZSwnJGRsbF9lbnRyeScgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAnJGx0ZGxsX29iaickbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+CisgICAgICAkRExMVE9PTCAtLWFzPSRBUyAtLWRsbG5hbWUgJHNvbmFtZSAtLWV4Y2x1ZGUtc3ltYm9scyAnJGRsbF9leGNsdWRlX3N5bWJvbHMnIC0tZGVmICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmIC0tYmFzZS1maWxlICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtYmFzZSAtLW91dHB1dC1leHAgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1leHAgLS1vdXRwdXQtbGliICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRsbC5hfgorICAgICAgJENDICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZXhwICckbHRfY3ZfY2NfZGxsX3N3aXRjaCcgLVdsLC1lLCckZGxsX2VudHJ5JyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICckbHRkbGxfb2JqJyRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICA7OworCisgIG5ldGJzZCopCisgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbyAkbGliJworICAgICAgd2xhcmM9CisgICAgZWxzZQorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtbm9kZWZhdWx0bGlicyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkIC1ub2RlZmF1bHRsaWJzICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgIGZpCisgICAgOzsKKworICBzb2xhcmlzKiB8IHN5c3Y1KikKKyAgICBpZiAkTEQgLXYgMj4mMSB8IGVncmVwICdCRkQgMlwuOCcgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIGxkX3NobGlicz1ubworICAgICAgY2F0IDw8RU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFRoZSByZWxlYXNlcyAyLjguKiBvZiB0aGUgR05VIGxpbmtlciBjYW5ub3QgcmVsaWFibHkKKyoqKiBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTb2xhcmlzIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKKyoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKKyoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuOS4xIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5CisqKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcworKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK0VPRgorICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgZWdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgIGVsc2UKKyAgICAgIGxkX3NobGlicz1ubworICAgIGZpCisgICAgOzsKKworICBzdW5vczQqKQorICAgIGFyY2hpdmVfY21kcz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICB3bGFyYz0KKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIDs7CisKKyAgKikKKyAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBlZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgZWxzZQorICAgICAgbGRfc2hsaWJzPW5vCisgICAgZmkKKyAgICA7OworICBlc2FjCisKKyAgaWYgdGVzdCAiJGxkX3NobGlicyIgPSB5ZXM7IHRoZW4KKyAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAgICMgZGxsdG9vbCBkb2Vzbid0IHVuZGVyc3RhbmQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KKyAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQorICAgICAgOzsKKyAgICAqKQorICAgICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZWdyZXAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCisJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisgICAgICBlbHNlCisJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9CisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCitlbHNlCisgICMgUE9SVE1FIGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIGxpbmtlciAobm90IEdOVSBsZCkKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBhaXgzKikKKyAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKKyAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckTEQgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgJEFSX0ZMQUdTICRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKyAgICAjIE5vdGU6IHRoaXMgbGlua2VyIGhhcmRjb2RlcyB0aGUgZGlyZWN0b3JpZXMgaW4gTElCUEFUSCBpZiB0aGVyZQorICAgICMgYXJlIG5vIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSAtTC4KKyAgICBoYXJkY29kZV9taW51c19MPXllcworICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgLXogIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorICAgICAgIyBOZWl0aGVyIGRpcmVjdCBoYXJkY29kaW5nIG5vciBzdGF0aWMgbGlua2luZyBpcyBzdXBwb3J0ZWQgd2l0aCBhCisgICAgICAjIGJyb2tlbiBjb2xsZWN0Mi4KKyAgICAgIGhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAorICAgIGZpCisgICAgOzsKKworICBhaXg0KiB8IGFpeDUqKQorICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KKyAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKKyAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bworICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90CisgICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCisKKyAgICBhcmNoaXZlX2NtZHM9JycKKyAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSc6JworICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCisgICAgICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCisJIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgZ3JlcCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKyAgICAgIHRoZW4KKwkjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKKwloYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBlbHNlCisgICAgICAgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKyAgICAgICAgaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCisgICAgICAgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKKyAgICAgICAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKKyAgICAgICAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCisgICAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KKyAgICAgIGZpCisgICAgICBzaGFyZWRfZmxhZz0nLXNoYXJlZCcKKyAgICBlbHNlCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICAgICBzaGFyZWRfZmxhZz0nLUcnCisgICAgICBlbHNlCisgICAgICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgIGZpCisKKyAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICAgIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAorICAgICAgIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisgICAgICBleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JworICAgICAgbm9fZW50cnlfZmxhZz0iIgorICAgIGVsc2UKKyAgICAgICMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nLCBvciBub3JtYWwgQUlYIHN0eWxlIGxpbmtpbmcuCisgICAgICAjIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZSBuZWVkIHRvIGRvIHJ1biB0aW1lIGxpbmtpbmcuCisgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisgICAgICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKyAgICAgICAgaWYgKHRlc3QgJGxkX2ZsYWcgPSAiLWJydGwiIHx8IHRlc3QgJGxkX2ZsYWcgPSAiLVdsLC1icnRsIiApOyB0aGVuCisgICAgICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKKyAgICAgICAgICBicmVhaworICAgICAgICBmaQorICAgICAgZG9uZQorICAgICAgZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKKyAgICAgIG5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICBmaQorICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBjYW4gZG8gc3RyYW5nZSB0aGluZ3MsIHNvIGl0IGlzIGJldHRlciB0bworICAgICMgZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgorICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKKyAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6L3Vzci9saWI6L2xpYicKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgLVdsLC1HJworICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRub19lbnRyeV9mbGFnIFwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKyAgICBlbHNlCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKKyAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0iLXpub2RlZnMiCisgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS1oJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRub19lbnRyeV9mbGFnIFwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKyAgICAgIGVsc2UKKyAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tYm5vbGlicGF0aCAke3dsfS1ibGlicGF0aDokbGliZGlyOi91c3IvbGliOi9saWInCisgICAgICAgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsIC1iZXJvayB3aWxsCisgICAgICAgICMgICAgICAgICAgIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScke3dsfS1iZXJvayIKKyAgICAgICAgIyBUaGlzIGlzIGEgYml0IHN0cmFuZ2UsIGJ1dCBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMKKyAgICAgICAgIyBpdCdzIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kbm9fZW50cnlfZmxhZyBcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiJyB+JEFSIC1jcmxvICRvYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvYmpkaXIvJHNvbmFtZScKKyAgICAgIGZpCisgICAgZmkKKyAgICA7OworCisgIGFtaWdhb3MqKQorICAgIGFyY2hpdmVfY21kcz0nJHJtICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAjIHNlZSBjb21tZW50IGFib3V0IGRpZmZlcmVudCBzZW1hbnRpY3Mgb24gdGhlIEdOVSBsZCBzZWN0aW9uCisgICAgbGRfc2hsaWJzPW5vCisgICAgOzsKKworICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKKyAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyAnCisgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgorICAgIGxpYmV4dD1saWIKKyAgICAjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCisgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgYGVjaG8gIiRkZXBsaWJzIiB8IHNlZCAtZSAnXCcncy8gLWxjJC8vJ1wnJ2AgLWxpbmsgLWRsbH5saW5rbmFtZXM9JworICAgICMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCisgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0ndHJ1ZScKKyAgICAjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgorICAgIG9sZF9hcmNoaXZlX2NtZHM9J2xpYiAvT1VUOiRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKKyAgICBmaXhfc3JjZmlsZV9wYXRoPSdgY3lncGF0aCAtdyAiJHNyY2ZpbGUiYCcKKyAgICA7OworCisgIGRhcndpbiogfCByaGFwc29keSopCisgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Jy11bmRlZmluZWQgc3VwcHJlc3MnCisgICAgIyBGSVhNRTogUmVseWluZyBvbiBwb3NpeHkgJCgpIHdpbGwgY2F1c2UgcHJvYmxlbXMgZm9yCisgICAgIyAgICAgICAgY3Jvc3MtY29tcGlsYXRpb24sIGJ1dCB1bmZvcnR1bmF0ZWx5IHRoZSBlY2hvIHRlc3RzIGRvIG5vdAorICAgICMgICAgICAgIHlldCBkZXRlY3QgenNoIGVjaG8ncyByZW1vdmFsIG9mIFwgZXNjYXBlcy4KKyAgICBhcmNoaXZlX2NtZHM9JyRDQyAkKHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gLWJ1bmRsZSB8fCBlY2hvIC1keW5hbWljbGliKSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyRsaW5rb3B0cyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICQodGVzdCAtbiAiJHZlcnN0cmluZyIgLWEgeCR2ZXJzdHJpbmcgIT0geDAuMCAmJiBlY2hvICR2ZXJzdHJpbmcpJworICAgICMgV2UgbmVlZCB0byBhZGQgJ18nIHRvIHRoZSBzeW1ib2xzIGluICRleHBvcnRfc3ltYm9scyBmaXJzdAorICAgICNhcmNoaXZlX2V4cHN5bV9jbWRzPSIkYXJjaGl2ZV9jbWRzIicgJiYgc3RyaXAgLXMgJGV4cG9ydF9zeW1ib2xzJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Jy1hbGxfbG9hZCAkY29udmVuaWVuY2UnCisgICAgOzsKKworICBmcmVlYnNkMSopCisgICAgbGRfc2hsaWJzPW5vCisgICAgOzsKKworICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKKyAgIyBzdXBwb3J0LiAgRnV0dXJlIHZlcnNpb25zIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IGFuIGV4cGxpY2l0IGMrK3J0MC5vCisgICMgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcsIGFuZCBoZWxwcyBzaWduaWZpY2FudGx5IChhdCB0aGUgY29zdCBvZiBhIGxpdHRsZQorICAjIGV4dHJhIHNwYWNlKS4KKyAgZnJlZWJzZDIuMiopCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC91c3IvbGliL2MrK3J0MC5vJworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIDs7CisKKyAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgorICBmcmVlYnNkMiopCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9taW51c19MPXllcworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICA7OworCisgICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KKyAgZnJlZWJzZCopCisgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICA7OworCisgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBocHV4OSopIGFyY2hpdmVfY21kcz0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JExEIC1iICtiICRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInIDs7CisgICAgKikgYXJjaGl2ZV9jbWRzPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyA7OworICAgIGVzYWMKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgaGFyZGNvZGVfbWludXNfTD15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILCBidXQgYXMgdGhlIGRlZmF1bHQKKwkJCSAjIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKKyAgICA7OworCisgIGlyaXg1KiB8IGlyaXg2KikKKyAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgZWxzZQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgIGZpCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgOzsKKworICBuZXRic2QqKQorICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICMgYS5vdXQKKyAgICBlbHNlCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgorICAgIGZpCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgOzsKKworICBuZXdzb3M2KQorICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCisgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgOzsKKworICBvcGVuYnNkKikKKyAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgOzsKKworICBvczIqKQorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICBoYXJkY29kZV9taW51c19MPXllcworICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisgICAgYXJjaGl2ZV9jbWRzPSckZWNobyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBEQVRBID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBFWFBPUlRTID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCisgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgIDs7CisKKyAgb3NmMyopCisgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKyAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgZWxzZQorICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICBmaQorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICA7OworCisgIG9zZjQqIHwgb3NmNSopCSMgYXMgb3NmMyogd2l0aCB0aGUgYWRkaXRpb24gb2YgLW1zeW0gZmxhZworICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgZWxzZQorICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICItZXhwb3J0ZWRfc3ltYm9sICIgPj4gJGxpYi5leHA7IGVjaG8gIlwkaSIgPj4gJGxpYi5leHA7IGRvbmU7IGVjaG8gIi1oaWRkZW4iPj4gJGxpYi5leHB+CisgICAgICAkTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1pbnB1dCAkbGliLmV4cCAkbGlua2VyX2ZsYWdzICRsaWJvYmpzICRkZXBsaWJzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+JHJtICRsaWIuZXhwJworCisgICAgICAjQm90aCBjIGFuZCBjeHggY29tcGlsZXIgc3VwcG9ydCAtcnBhdGggZGlyZWN0bHkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1ycGF0aCAkbGliZGlyJworICAgIGZpCisgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgOzsKKworICBzY28zLjJ2NSopCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCisgICAgOzsKKworICBzb2xhcmlzKikKKyAgICBub191bmRlZmluZWRfZmxhZz0nIC16IGRlZnMnCisgICAgIyAkQ0MgLXNoYXJlZCB3aXRob3V0IEdOVSBsZCB3aWxsIG5vdCBjcmVhdGUgYSBsaWJyYXJ5IGZyb20gQysrCisgICAgIyBvYmplY3QgZmlsZXMgYW5kIGEgc3RhdGljIGxpYnN0ZGMrKywgYmV0dGVyIGF2b2lkIGl0IGJ5IG5vdworICAgIGFyY2hpdmVfY21kcz0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkJJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JHJtICRsaWIuZXhwJworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIHNvbGFyaXMyLlswLTVdIHwgc29sYXJpczIuWzAtNV0uKikgOzsKKyAgICAqKSAjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQorICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Jy16IGFsbGV4dHJhY3QkY29udmVuaWVuY2UgLXogZGVmYXVsdGV4dHJhY3QnIDs7CisgICAgZXNhYworICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgOzsKKworICBzdW5vczQqKQorICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNlcXVlbnQ7IHRoZW4KKyAgICAgICMgVXNlICRDQyB0byBsaW5rIHVuZGVyIHNlcXVlbnQsIGJlY2F1c2UgaXQgdGhyb3dzIGluIHNvbWUgZXh0cmEgLm8KKyAgICAgICMgZmlsZXMgdGhhdCBtYWtlIC5pbml0IGFuZCAuZmluaSBzZWN0aW9ucyB3b3JrLgorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgIGVsc2UKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICBmaQorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgOzsKKworICBzeXN2NCkKKyAgICBpZiB0ZXN0ICJ4JGhvc3RfdmVuZG9yIiA9IHhzbm87IHRoZW4KKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1Cc3ltYm9saWMgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMgIyBpcyB0aGlzIHJlYWxseSB0cnVlPz8/CisgICAgZWxzZQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9kaXJlY3Q9bm8gI01vdG9yb2xhIG1hbnVhbCBzYXlzIHllcywgYnV0IG15IHRlc3RzIHNheSB0aGV5IGxpZQorICAgIGZpCisgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICA7OworCisgIHN5c3Y0LjMqKQorICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Jy1CZXhwb3J0JworICAgIDs7CisKKyAgc3lzdjUqKQorICAgIG5vX3VuZGVmaW5lZF9mbGFnPScgLXogdGV4dCcKKyAgICAjICRDQyAtc2hhcmVkIHdpdGhvdXQgR05VIGxkIHdpbGwgbm90IGNyZWF0ZSBhIGxpYnJhcnkgZnJvbSBDKysKKyAgICAjIG9iamVjdCBmaWxlcyBhbmQgYSBzdGF0aWMgbGlic3RkYysrLCBiZXR0ZXIgYXZvaWQgaXQgYnkgbm93CisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCQkkTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc34kcm0gJGxpYi5leHAnCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworICAgIDs7CisKKyAgdXRzNCopCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICA7OworCisgIGRndXgqKQorICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgOzsKKworICBzeXN2NCpNUCopCisgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgICAgaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCisgICAgICBsZF9zaGxpYnM9eWVzCisgICAgZmkKKyAgICA7OworCisgIHN5c3Y0LjJ1dzIqKQorICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgaGFyZGNvZGVfbWludXNfTD1ubworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICBoYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKyAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgIDs7CisKKyAgc3lzdjV1dzcqIHwgdW5peHdhcmU3KikKKyAgICBub191bmRlZmluZWRfZmxhZz0nJHt3bH0teiAke3dsfXRleHQnCisgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgZWxzZQorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgZmkKKyAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIDs7CisKKyAgKikKKyAgICBsZF9zaGxpYnM9bm8KKyAgICA7OworICBlc2FjCitmaQorZWNobyAiJGFzX21lOjUwMTQ6IHJlc3VsdDogJGxkX3NobGlicyIgPiY1CitlY2hvICIke0VDSE9fVH0kbGRfc2hsaWJzIiA+JjYKK3Rlc3QgIiRsZF9zaGxpYnMiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworIyMKKyMjIEVORCBGSVhNRQorCisjIyBGSVhNRTogdGhpcyBzaG91bGQgYmUgYSBzZXBhcmF0ZSBtYWNybworIyMKKyMgQ2hlY2sgaGFyZGNvZGluZyBhdHRyaWJ1dGVzLgorZWNobyAiJGFzX21lOjUwMjM6IGNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zLi4uICRFQ0hPX0MiID4mNgoraGFyZGNvZGVfYWN0aW9uPQoraWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiIHx8IFwKKyAgIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKworICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RhbnQgZGlyZWN0b3JpZXMuCisgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IG5vICYmCisgICAgICMgSWYgdGhlIG9ubHkgbWVjaGFuaXNtIHRvIGF2b2lkIGhhcmRjb2RpbmcgaXMgc2hsaWJwYXRoX3Zhciwgd2UKKyAgICAgIyBoYXZlIHRvIHJlbGluaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGxpbmsgd2l0aCBhbiBpbnN0YWxsZWQgbGlicmFyeQorICAgICAjIHdoZW4gd2Ugc2hvdWxkIGJlIGxpbmtpbmcgd2l0aCBhIHlldC10by1iZS1pbnN0YWxsZWQgb25lCisgICAgICMjIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiAhPSBubyAmJgorICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0gbm87IHRoZW4KKyAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgorICAgIGhhcmRjb2RlX2FjdGlvbj1yZWxpbmsKKyAgZWxzZQorICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCisgICAgaGFyZGNvZGVfYWN0aW9uPWltbWVkaWF0ZQorICBmaQorZWxzZQorICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZworICAjIGRpcmVjdG9yaWVzLgorICBoYXJkY29kZV9hY3Rpb249dW5zdXBwb3J0ZWQKK2ZpCitlY2hvICIkYXNfbWU6NTA0NzogcmVzdWx0OiAkaGFyZGNvZGVfYWN0aW9uIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRoYXJkY29kZV9hY3Rpb24iID4mNgorIyMKKyMjIEVORCBGSVhNRQorCisjIyBGSVhNRTogdGhpcyBzaG91bGQgYmUgYSBzZXBhcmF0ZSBtYWNybworIyMKK3N0cmlwbGliPQorb2xkX3N0cmlwbGliPQorZWNobyAiJGFzX21lOjUwNTY6IGNoZWNraW5nIHdoZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZS4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgLW4gIiRTVFJJUCIgJiYgJFNUUklQIC1WIDI+JjEgfCBncmVwICJHTlUgc3RyaXAiID4vZGV2L251bGw7IHRoZW4KKyAgdGVzdCAteiAiJG9sZF9zdHJpcGxpYiIgJiYgb2xkX3N0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC1kZWJ1ZyIKKyAgdGVzdCAteiAiJHN0cmlwbGliIiAmJiBzdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtdW5uZWVkZWQiCisgIGVjaG8gIiRhc19tZTo1MDYxOiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6NTA2NDogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorIyMKKyMjIEVORCBGSVhNRQorCityZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCit0ZXN0IC16ICIkZGVwbGlic19jaGVja19tZXRob2QiICYmIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KKworIyMgRklYTUU6IHRoaXMgc2hvdWxkIGJlIGEgc2VwYXJhdGUgbWFjcm8KKyMjCisjIFBPUlRNRSBGaWxsIGluIHlvdXIgbGQuc28gY2hhcmFjdGVyaXN0aWNzCitlY2hvICIkYXNfbWU6NTA3NjogY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICRFQ0hPX0MiID4mNgorbGlicmFyeV9uYW1lc19zcGVjPQorbGlibmFtZV9zcGVjPSdsaWIkbmFtZScKK3NvbmFtZV9zcGVjPQorcG9zdGluc3RhbGxfY21kcz0KK3Bvc3R1bmluc3RhbGxfY21kcz0KK2ZpbmlzaF9jbWRzPQorZmluaXNoX2V2YWw9CitzaGxpYnBhdGhfdmFyPQorc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KK3ZlcnNpb25fdHlwZT1ub25lCitkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKK3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAkbGlibmFtZS5hJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKworICAjIEFJWCBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgorICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCisgIDs7CisKK2FpeDQqIHwgYWl4NSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICMgQUlYIDUgc3VwcG9ydHMgSUE2NAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICRsaWJuYW1lLnNvJworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGVsc2UKKyAgICAjIFdpdGggR0NDIHVwIHRvIDIuOTUueCwgY29sbGVjdDIgd291bGQgY3JlYXRlIGFuIGltcG9ydCBmaWxlCisgICAgIyBmb3IgZGVwZW5kZW5jZSBsaWJyYXJpZXMuICBUaGUgaW1wb3J0IGZpbGUgd291bGQgc3RhcnQgd2l0aAorICAgICMgdGhlIGxpbmUgYCMhIC4nLiAgVGhpcyB3b3VsZCBjYXVzZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgdG8KKyAgICAjIGRlcGVuZCBvbiBgLicsIGFsd2F5cyBhbiBpbnZhbGlkIGxpYnJhcnkuICBUaGlzIHdhcyBmaXhlZCBpbgorICAgICMgZGV2ZWxvcG1lbnQgc25hcHNob3RzIG9mIEdDQyBwcmlvciB0byAzLjAuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgIGFpeDQgfCBhaXg0LlswMV0gfCBhaXg0LlswMV0uKikKKyAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCisgICAgICAgICAgIGVjaG8gJyB5ZXMgJworICAgICAgICAgICBlY2hvICcjZW5kaWYnOyB9IHwgJHtDQ30gLUUgLSB8IGdyZXAgeWVzID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIDoKKyAgICAgIGVsc2UKKyAgICAgICAgY2FuX2J1aWxkX3NoYXJlZD1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICAgICMgQUlYIChvbiBQb3dlciopIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIGN1cnJlbnRseSB3ZSBjYW4gbm90IGhhcmRjb2RlIGNvcnJlY3QKKyAgICAjIHNvbmFtZSBpbnRvIGV4ZWN1dGFibGUuIFByb2JhYmx5IHdlIGNhbiBhZGQgdmVyc2lvbmluZyBzdXBwb3J0IHRvCisgICAgIyBjb2xsZWN0Miwgc28gYWRkaXRpb25hbCBsaW5rcyBjYW4gYmUgdXNlZnVsIGluIGZ1dHVyZS4KKyAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgSWYgdXNpbmcgcnVuIHRpbWUgbGlua2luZyAob24gQUlYIDQuMiBvciBsYXRlcikgdXNlIGxpYjxuYW1lPi5zbyBpbnN0ZWFkIG9mCisgICAgICAjIGxpYjxuYW1lPi5hIHRvIGxldCBwZW9wbGUga25vdyB0aGF0IHRoZXNlIGFyZSBub3QgdHlwaWNhbCBBSVggc2hhcmVkIGxpYnJhcmllcy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJworICAgIGVsc2UKKyAgICAgICMgV2UgcHJlc2VydmUgLmEgYXMgZXh0ZW5zaW9uIGZvciBzaGFyZWQgbGlicmFyaWVzIHRocm91Z2ggQUlYNC4yCisgICAgICAjIGFuZCBsYXRlciB3aGVuIHdlIGFyZSBub3QgZG9pbmcgcnVuIHRpbWUgbGlua2luZy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uYSAkbGlibmFtZS5hJworICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJworICAgIGZpCisgICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgICAgZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgZmkKKyAgOzsKKworYW1pZ2FvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCisgICMgQ3JlYXRlICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgZW50cmllcyBpbiAvc3lzL2xpYnMuCisgIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdcJydzJV4uKi9cKFteL10qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJHJtIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiKGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEpIjsgKGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEpIHx8IGV4aXQgMTsgZG9uZScKKyAgOzsKKworYmVvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfS5zbycKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAorICA7OworCitic2RpNCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPS1yZHluYW1pYworICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAorICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKKyAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCisgIDs7CisKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgdmVyc2lvbl90eXBlPXdpbmRvd3MKKyAgbmVlZF92ZXJzaW9uPW5vCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBjYXNlICRHQ0MsJGhvc3Rfb3MgaW4KKyAgeWVzLGN5Z3dpbiopCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKKyAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCBzZWQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9LmRsbCcKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSdkbHBhdGg9YGJhc2ggMj4mMSAtYyAnXCcnLiAkZGlyLyR7ZmlsZX1pO2VjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KKyAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgorICAgICAgJGluc3RhbGxfcHJvZyAubGlicy8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZScKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWBiYXNoIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+CisgICAgICAgJHJtIFwkZGxwYXRoJworICAgIDs7CisgIHllcyxtaW5ndyopCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8IHNlZCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0uZGxsJworICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8IHNlZCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicy87LyAvZyJgCisgICAgOzsKKyAgeWVzLHB3MzIqKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8IHNlZCAtZSAncy8uLy0vZydgJHt2ZXJzdWZmaXh9LmRsbCcKKyAgICA7OworICAqKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCBzZWQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9LmRsbCAkbGlibmFtZS5saWInCisgICAgOzsKKyAgZXNhYworICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJworICAjIEZJWE1FOiBmaXJzdCB3ZSBzaG91bGQgc2VhcmNoIC4gYW5kIHRoZSBkaXJlY3RvcnkgdGhlIGV4ZWN1dGFibGUgaXMgaW4KKyAgc2hsaWJwYXRoX3Zhcj1QQVRICisgIDs7CisKK2RhcndpbiogfCByaGFwc29keSopCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkeWxkIgorICB2ZXJzaW9uX3R5cGU9ZGFyd2luCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgIyBGSVhNRTogUmVseWluZyBvbiBwb3NpeHkgJCgpIHdpbGwgY2F1c2UgcHJvYmxlbXMgZm9yCisgICMgICAgICAgIGNyb3NzLWNvbXBpbGF0aW9uLCBidXQgdW5mb3J0dW5hdGVseSB0aGUgZWNobyB0ZXN0cyBkbyBub3QKKyAgIyAgICAgICAgeWV0IGRldGVjdCB6c2ggZWNobydzIHJlbW92YWwgb2YgXCBlc2NhcGVzLgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHt2ZXJzdWZmaXh9LiQodGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyBzbyB8fCBlY2hvIGR5bGliKSAke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9LiQodGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyBzbyB8fCBlY2hvIGR5bGliKSAke2xpYm5hbWV9LiQodGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyBzbyB8fCBlY2hvIGR5bGliKScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0uJCh0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIHNvIHx8IGVjaG8gZHlsaWIpJworICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIHNobGlicGF0aF92YXI9RFlMRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworZnJlZWJzZDEqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitmcmVlYnNkKikKKyAgb2JqZm9ybWF0PWB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdCAmJiAvdXNyL2Jpbi9vYmpmb3JtYXQgfHwgZWNobyBhb3V0YAorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC0kb2JqZm9ybWF0CisgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorICAgIGZyZWVic2QtZWxmKikKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvICRsaWJuYW1lLnNvJworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgZnJlZWJzZC0qKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJGxpYm5hbWUuc28kdmVyc3VmZml4JworICAgICAgbmVlZF92ZXJzaW9uPXllcworICAgICAgOzsKKyAgZXNhYworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBjYXNlICRob3N0X29zIGluCisgIGZyZWVic2QyKikKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgOzsKKyAgKikKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZXNhYworICA7OworCitnbnUqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR7bWFqb3J9ICR7bGlibmFtZX0uc28nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKyAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bworICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc2wkdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNsJG1ham9yICRsaWJuYW1lLnNsJworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc2wkbWFqb3InCisgICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqKQorICB2ZXJzaW9uX3R5cGU9aXJpeAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28gJGxpYm5hbWUuc28nCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgaXJpeDUqKQorICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KKyAgICA7OworICAqKQorICAgIGNhc2UgJExEIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKKyAgICAqLTMyfCoiLTMyICIpIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKKyAgICAqLW4zMnwqIi1uMzIgIikgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7CisgICAgKi02NHwqIi02NCAiKSBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OworICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCisgIDs7CisKKyMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KK2xpbnV4LWdudW9sZGxkKiB8IGxpbnV4LWdudWFvdXQqIHwgbGludXgtZ251Y29mZiopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKKyMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KK2xpbnV4LWdudSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAjIFRoaXMgaW1wbGllcyBubyBmYXN0X2luc3RhbGwsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZS4KKyAgIyBTb21lIHJld29yayB3aWxsIGJlIG5lZWRlZCB0byBhbGxvdyBmb3IgZmFzdF9pbnN0YWxsCisgICMgYmVmb3JlIHRoaXMgY2FuIGJlIGVuYWJsZWQuCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKworICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KKyAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQorICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKKyAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKKyAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCisgICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgorICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJworICA7OworCituZXRic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfS5zbyR2ZXJzdWZmaXgnCisgICAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIChhLm91dCkgbGQuc28nCisgIGVsc2UKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyAke2xpYm5hbWV9LnNvJworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKKyAgZmkKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK25ld3NvczYpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCitvcGVuYnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICBuZWVkX3ZlcnNpb249bm8KKyAgZmkKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfS5zbyR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKK29zMiopCisgIGxpYm5hbWVfc3BlYz0nJG5hbWUnCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbCAkbGlibmFtZS5hJworICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbycKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28gJGxpYm5hbWUuc28nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9zaGxpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIvY21wbHJzL2NjIC91c3IvbGliIC91c3IvbG9jYWwvbGliIC92YXIvc2hsaWIiCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgorICA7OworCitzY28zLjJ2NSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworc29sYXJpcyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJworICA7OworCitzdW5vczQqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfS5zbyR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIG5lZWRfbGliX3ByZWZpeD1ubworICBmaQorICBuZWVkX3ZlcnNpb249eWVzCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKiB8IHN5c3Y1KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgICAgc25pKQorICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICA7OworICAgIG1vdG9yb2xhKQorICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvY2NzL2xpYicKKyAgICAgIDs7CisgIGVzYWMKKyAgOzsKKwordXRzNCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitkZ3V4KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworc3lzdjQqTVAqKQorICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCisgICAgdmVyc2lvbl90eXBlPWxpbnV4CisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5zby4kdmVyc3VmZml4ICRsaWJuYW1lLnNvLiRtYWpvciAkbGlibmFtZS5zbycKKyAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUuc28uJG1ham9yJworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGZpCisgIDs7CisKKyopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7Citlc2FjCitlY2hvICIkYXNfbWU6NTQ1ODogcmVzdWx0OiAkZHluYW1pY19saW5rZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGR5bmFtaWNfbGlua2VyIiA+JjYKK3Rlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisjIworIyMgRU5EIEZJWE1FCisKKyMjIEZJWE1FOiB0aGlzIHNob3VsZCBiZSBhIHNlcGFyYXRlIG1hY3JvCisjIworIyBSZXBvcnQgdGhlIGZpbmFsIGNvbnNlcXVlbmNlcy4KK2VjaG8gIiRhc19tZTo1NDY3OiBjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gJEVDSE9fQyIgPiY2CitlY2hvICIkYXNfbWU6NTQ2OTogcmVzdWx0OiAkY2FuX2J1aWxkX3NoYXJlZCIgPiY1CitlY2hvICIke0VDSE9fVH0kY2FuX2J1aWxkX3NoYXJlZCIgPiY2CisjIworIyMgRU5EIEZJWE1FCisKK2lmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gcmVsaW5rOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCitlbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8CisgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCitmaQorCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKK2ZpCisKK2lmIHRlc3QgIngkZW5hYmxlX2Rsb3BlbiIgIT0geHllczsgdGhlbgorICBlbmFibGVfZGxvcGVuPXVua25vd24KKyAgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24KKyAgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duCitlbHNlCisgIGx0X2N2X2Rsb3Blbj1ubworICBsdF9jdl9kbG9wZW5fbGlicz0KKworICBjYXNlICRob3N0X29zIGluCisgIGJlb3MqKQorICAgIGx0X2N2X2Rsb3Blbj0ibG9hZF9hZGRfb24iCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCisgICAgOzsKKworICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgbHRfY3ZfZGxvcGVuPSJMb2FkTGlicmFyeSIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgIDs7CisKKyAgKikKKyAgICBlY2hvICIkYXNfbWU6NTUwOTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9saWJfZGxfZGxvcGVuK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGwgICRMSUJTIgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSA1NTE3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBkbG9wZW4gKCk7CitpbnQKK21haW4gKCkKK3sKK2Rsb3BlbiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjU1MzY6IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjU1Mzk6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTo1NTQyOiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6NTU0NTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2xpYl9kbF9kbG9wZW49eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2FjX2N2X2xpYl9kbF9kbG9wZW49bm8KK2ZpCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQorZWNobyAiJGFzX21lOjU1NTY6IHJlc3VsdDogJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNgoraWYgdGVzdCAkYWNfY3ZfbGliX2RsX2Rsb3BlbiA9IHllczsgdGhlbgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCitlbHNlCisgIGVjaG8gIiRhc19tZTo1NTYxOiBjaGVja2luZyBmb3IgZGxvcGVuIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGRsb3Blbi4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfZnVuY19kbG9wZW4rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSA1NTY3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIGRsb3BlbiAoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBkbG9wZW4gKCk7CitjaGFyICgqZikgKCk7CisKK2ludAorbWFpbiAoKQoreworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViX2Rsb3BlbikgfHwgZGVmaW5lZCAoX19zdHViX19fZGxvcGVuKQorY2hva2UgbWUKKyNlbHNlCitmID0gZGxvcGVuOworI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjU1OTg6IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjU2MDE6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTo1NjA0OiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6NTYwNzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2Z1bmNfZGxvcGVuPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CithY19jdl9mdW5jX2Rsb3Blbj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6NTYxNzogcmVzdWx0OiAkYWNfY3ZfZnVuY19kbG9wZW4iID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Z1bmNfZGxvcGVuIiA+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfZGxvcGVuID0geWVzOyB0aGVuCisgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIgorZWxzZQorICBlY2hvICIkYXNfbWU6NTYyMjogY2hlY2tpbmcgZm9yIHNobF9sb2FkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNobF9sb2FkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9mdW5jX3NobF9sb2FkK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgNTYyOCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBzaGxfbG9hZCAoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBzaGxfbG9hZCAoKTsKK2NoYXIgKCpmKSAoKTsKKworaW50CittYWluICgpCit7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfc2hsX2xvYWQpIHx8IGRlZmluZWQgKF9fc3R1Yl9fX3NobF9sb2FkKQorY2hva2UgbWUKKyNlbHNlCitmID0gc2hsX2xvYWQ7CisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NTY1OTogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6NTY2MjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOjU2NjU6IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTo1NjY4OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfZnVuY19zaGxfbG9hZD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorYWNfY3ZfZnVuY19zaGxfbG9hZD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6NTY3ODogcmVzdWx0OiAkYWNfY3ZfZnVuY19zaGxfbG9hZCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfZnVuY19zaGxfbG9hZCIgPiY2CitpZiB0ZXN0ICRhY19jdl9mdW5jX3NobF9sb2FkID0geWVzOyB0aGVuCisgIGx0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiCitlbHNlCisgIGVjaG8gIiRhc19tZTo1NjgzOiBjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sc3ZsZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxzdmxkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9saWJfc3ZsZF9kbG9wZW4rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxzdmxkICAkTElCUyIKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgNTY5MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgZGxvcGVuICgpOworaW50CittYWluICgpCit7CitkbG9wZW4gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTo1NzEwOiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTo1NzEzOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKyAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6NTcxNjogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjU3MTk6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9saWJfc3ZsZF9kbG9wZW49eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2FjX2N2X2xpYl9zdmxkX2Rsb3Blbj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCitlY2hvICIkYXNfbWU6NTczMDogcmVzdWx0OiAkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfc3ZsZF9kbG9wZW4iID4mNgoraWYgdGVzdCAkYWNfY3ZfbGliX3N2bGRfZGxvcGVuID0geWVzOyB0aGVuCisgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxzdmxkIgorZWxzZQorICBlY2hvICIkYXNfbWU6NTczNTogY2hlY2tpbmcgZm9yIHNobF9sb2FkIGluIC1sZGxkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNobF9sb2FkIGluIC1sZGxkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9saWJfZGxkX3NobF9sb2FkK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGxkICAkTElCUyIKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgNTc0MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgc2hsX2xvYWQgKCk7CitpbnQKK21haW4gKCkKK3sKK3NobF9sb2FkICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NTc2MjogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6NTc2NTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOjU3Njg6IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTo1NzcxOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfbGliX2RsZF9zaGxfbG9hZD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorYWNfY3ZfbGliX2RsZF9zaGxfbG9hZD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCitlY2hvICIkYXNfbWU6NTc4MjogcmVzdWx0OiAkYWNfY3ZfbGliX2RsZF9zaGxfbG9hZCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX2RsZF9zaGxfbG9hZCIgPiY2CitpZiB0ZXN0ICRhY19jdl9saWJfZGxkX3NobF9sb2FkID0geWVzOyB0aGVuCisgIGx0X2N2X2Rsb3Blbj0iZGxkX2xpbmsiIGx0X2N2X2Rsb3Blbl9saWJzPSItZGxkIgorZmkKKworZmkKKworZmkKKworZmkKKworZmkKKworICAgIDs7CisgIGVzYWMKKworICBpZiB0ZXN0ICJ4JGx0X2N2X2Rsb3BlbiIgIT0geG5vOyB0aGVuCisgICAgZW5hYmxlX2Rsb3Blbj15ZXMKKyAgZWxzZQorICAgIGVuYWJsZV9kbG9wZW49bm8KKyAgZmkKKworICBjYXNlICRsdF9jdl9kbG9wZW4gaW4KKyAgZGxvcGVuKQorICAgIHNhdmVfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKKyAgICAgICAgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzICYmIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURIQVZFX0RMRkNOX0giCisKKyAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKworICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgTElCUz0iJGx0X2N2X2Rsb3Blbl9saWJzICRMSUJTIgorCisgICAgZWNobyAiJGFzX21lOjU4MTY6IGNoZWNraW5nIHdoZXRoZXIgYSBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBhIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X2Rsb3Blbl9zZWxmK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIAkgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuX3NlbGY9Y3Jvc3MKK2Vsc2UKKyAgICBsdF9kbHVua25vd249MDsgbHRfZGxub191c2NvcmU9MTsgbHRfZGxuZWVkX3VzY29yZT0yCisgIGx0X3N0YXR1cz0kbHRfZGx1bmtub3duCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDU4MjcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWYgSEFWRV9ETEZDTl9ICisjaW5jbHVkZSA8ZGxmY24uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIFJUTERfR0xPQkFMCisjICBkZWZpbmUgTFRfRExHTE9CQUwJCVJUTERfR0xPQkFMCisjZWxzZQorIyAgaWZkZWYgRExfR0xPQkFMCisjICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJRExfR0xPQkFMCisjICBlbHNlCisjICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJMAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBXZSBtYXkgaGF2ZSB0byBkZWZpbmUgTFRfRExMQVpZX09SX05PVyBpbiB0aGUgY29tbWFuZCBsaW5lIGlmIHdlCisgICBmaW5kIG91dCBpdCBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0uICovCisjaWZuZGVmIExUX0RMTEFaWV9PUl9OT1cKKyMgIGlmZGVmIFJUTERfTEFaWQorIyAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJUlRMRF9MQVpZCisjICBlbHNlCisjICAgIGlmZGVmIERMX0xBWlkKKyMgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJRExfTEFaWQorIyAgICBlbHNlCisjICAgICAgaWZkZWYgUlRMRF9OT1cKKyMgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCVJUTERfTk9XCisjICAgICAgZWxzZQorIyAgICAgICAgaWZkZWYgRExfTk9XCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCURMX05PVworIyAgICAgICAgZWxzZQorIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkwCisjICAgICAgICBlbmRpZgorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB2b2lkIGV4aXQgKGludCk7CisjZW5kaWYKKwordm9pZCBmbm9yZCgpIHsgaW50IGk9NDI7fQoraW50IG1haW4gKCkKK3sKKyAgdm9pZCAqc2VsZiA9IGRsb3BlbiAoMCwgTFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PVyk7CisgIGludCBzdGF0dXMgPSAkbHRfZGx1bmtub3duOworCisgIGlmIChzZWxmKQorICAgIHsKKyAgICAgIGlmIChkbHN5bSAoc2VsZiwiZm5vcmQiKSkgICAgICAgc3RhdHVzID0gJGx0X2Rsbm9fdXNjb3JlOworICAgICAgZWxzZSBpZiAoZGxzeW0oIHNlbGYsIl9mbm9yZCIpKSBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKKyAgICAgIC8qIGRsY2xvc2UgKHNlbGYpOyAqLworICAgIH0KKworICAgIGV4aXQgKHN0YXR1cyk7Cit9CitFT0YKKyAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NTg4ODogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6NTg5MTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gMj4vZGV2L251bGw7IHRoZW4KKyAgICAoLi9jb25mdGVzdDsgZXhpdDsgKSAyPi9kZXYvbnVsbAorICAgIGx0X3N0YXR1cz0kPworICAgIGNhc2UgeCRsdF9zdGF0dXMgaW4KKyAgICAgIHgkbHRfZGxub191c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmPXllcyA7OworICAgICAgeCRsdF9kbG5lZWRfdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZj15ZXMgOzsKKyAgICAgIHgkbHRfdW5rbm93bnx4KikgbHRfY3ZfZGxvcGVuX3NlbGY9bm8gOzsKKyAgICBlc2FjCisgIGVsc2UgOgorICAgICMgY29tcGlsYXRpb24gZmFpbGVkCisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9bm8KKyAgZmkKK2ZpCitybSAtZnIgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYXNfbWU6NTkwODogcmVzdWx0OiAkbHRfY3ZfZGxvcGVuX3NlbGYiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X2Rsb3Blbl9zZWxmIiA+JjYKKworICAgIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuX3NlbGYiID0geHllczsgdGhlbgorICAgICAgTERGTEFHUz0iJExERkxBR1MgJGxpbmtfc3RhdGljX2ZsYWciCisgICAgICBlY2hvICIkYXNfbWU6NTkxMzogY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZi4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIAkgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPWNyb3NzCitlbHNlCisgICAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgorICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA1OTI0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmIEhBVkVfRExGQ05fSAorI2luY2x1ZGUgPGRsZmNuLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBSVExEX0dMT0JBTAorIyAgZGVmaW5lIExUX0RMR0xPQkFMCQlSVExEX0dMT0JBTAorI2Vsc2UKKyMgIGlmZGVmIERMX0dMT0JBTAorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCURMX0dMT0JBTAorIyAgZWxzZQorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCTAKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQorICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLworI2lmbmRlZiBMVF9ETExBWllfT1JfTk9XCisjICBpZmRlZiBSVExEX0xBWlkKKyMgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCVJUTERfTEFaWQorIyAgZWxzZQorIyAgICBpZmRlZiBETF9MQVpZCisjICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCURMX0xBWlkKKyMgICAgZWxzZQorIyAgICAgIGlmZGVmIFJUTERfTk9XCisjICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlSVExEX05PVworIyAgICAgIGVsc2UKKyMgICAgICAgIGlmZGVmIERMX05PVworIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlETF9OT1cKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJMAorIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpOworI2VuZGlmCisKK3ZvaWQgZm5vcmQoKSB7IGludCBpPTQyO30KK2ludCBtYWluICgpCit7CisgIHZvaWQgKnNlbGYgPSBkbG9wZW4gKDAsIExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1cpOworICBpbnQgc3RhdHVzID0gJGx0X2RsdW5rbm93bjsKKworICBpZiAoc2VsZikKKyAgICB7CisgICAgICBpZiAoZGxzeW0gKHNlbGYsImZub3JkIikpICAgICAgIHN0YXR1cyA9ICRsdF9kbG5vX3VzY29yZTsKKyAgICAgIGVsc2UgaWYgKGRsc3ltKCBzZWxmLCJfZm5vcmQiKSkgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7CisgICAgICAvKiBkbGNsb3NlIChzZWxmKTsgKi8KKyAgICB9CisKKyAgICBleGl0IChzdGF0dXMpOworfQorRU9GCisgIGlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjU5ODU6IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjU5ODg6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9IDI+L2Rldi9udWxsOyB0aGVuCisgICAgKC4vY29uZnRlc3Q7IGV4aXQ7ICkgMj4vZGV2L251bGwKKyAgICBsdF9zdGF0dXM9JD8KKyAgICBjYXNlIHgkbHRfc3RhdHVzIGluCisgICAgICB4JGx0X2Rsbm9fdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzIDs7CisgICAgICB4JGx0X2RsbmVlZF91c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMgOzsKKyAgICAgIHgkbHRfdW5rbm93bnx4KikgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vIDs7CisgICAgZXNhYworICBlbHNlIDoKKyAgICAjIGNvbXBpbGF0aW9uIGZhaWxlZAorICAgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1ubworICBmaQorZmkKK3JtIC1mciBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhc19tZTo2MDA1OiByZXN1bHQ6ICRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgPiY2CisgICAgZmkKKworICAgIENQUEZMQUdTPSIkc2F2ZV9DUFBGTEFHUyIKKyAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmPSRsdF9jdl9kbG9wZW5fc2VsZiA7OworICAqKSBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93biA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz0kbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93biA7OworICBlc2FjCitmaQorCisjIyBGSVhNRTogdGhpcyBzaG91bGQgYmUgYSBzZXBhcmF0ZSBtYWNybworIyMKK2lmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBjYXNlICRhcmNoaXZlX2NtZHMgaW4KKyAgKid+JyopCisgICAgIyBGSVhNRTogd2UgbWF5IGhhdmUgdG8gZGVhbCB3aXRoIG11bHRpLWNvbW1hbmQgc2VxdWVuY2VzLgorICAgIDs7CisgICckQ0MgJyopCisgICAgIyBUZXN0IHdoZXRoZXIgdGhlIGNvbXBpbGVyIGltcGxpY2l0bHkgbGlua3Mgd2l0aCAtbGMgc2luY2Ugb24gc29tZQorICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYworICAgICMgdG8gbGQsIGRvbid0IGFkZCAtbGMgYmVmb3JlIC1sZ2NjLgorICAgIGVjaG8gIiRhc19tZTo2MDM3OiBjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4iID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4uLi4gJEVDSE9fQyIgPiY2CisgICAgaWYgdGVzdCAiJHtsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICAkcm0gY29uZnRlc3QqCisgICAgZWNobyAnc3RhdGljIGludCBkdW1teTsnID4gY29uZnRlc3QuJGFjX2V4dAorCisgICAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NjA0NTogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6NjA0ODogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisgICAgICBzb25hbWU9Y29uZnRlc3QKKyAgICAgIGxpYj1jb25mdGVzdAorICAgICAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0CisgICAgICBkZXBsaWJzPQorICAgICAgd2w9JGx0X2N2X3Byb2dfY2Nfd2wKKyAgICAgIGNvbXBpbGVyX2ZsYWdzPS12CisgICAgICBsaW5rZXJfZmxhZ3M9LXYKKyAgICAgIHZlcnN0cmluZz0KKyAgICAgIG91dHB1dF9vYmpkaXI9LgorICAgICAgbGlibmFtZT1jb25mdGVzdAorICAgICAgc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPQorICAgICAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NjA2MjogXCIkYXJjaGl2ZV9jbWRzIDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjFcIiIpID4mNQorICAoZXZhbCAkYXJjaGl2ZV9jbWRzIDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjEpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTo2MDY1OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KKyAgICAgIHRoZW4KKwlsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYz1ubworICAgICAgZWxzZQorCWx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjPXllcworICAgICAgZmkKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSRzYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnCisgICAgZWxzZQorICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgICAgZmkKK2ZpCisKKyAgICBlY2hvICIkYXNfbWU6NjA3ODogcmVzdWx0OiAkbHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjIiA+JjYKKyAgICA7OworICBlc2FjCitmaQorbmVlZF9sYz0ke2x0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjLXllc30KKyMjCisjIyBFTkQgRklYTUUKKworIyMgRklYTUU6IHRoaXMgc2hvdWxkIGJlIGEgc2VwYXJhdGUgbWFjcm8KKyMjCisjIFRoZSBzZWNvbmQgY2xhdXNlIHNob3VsZCBvbmx5IGZpcmUgd2hlbiBib290c3RyYXBwaW5nIHRoZQorIyBsaWJ0b29sIGRpc3RyaWJ1dGlvbiwgb3RoZXJ3aXNlIHlvdSBmb3Jnb3QgdG8gc2hpcCBsdG1haW4uc2gKKyMgd2l0aCB5b3VyIHBhY2thZ2UsIGFuZCB5b3Ugd2lsbCBnZXQgY29tcGxhaW50cyB0aGF0IHRoZXJlIGFyZQorIyBubyBydWxlcyB0byBnZW5lcmF0ZSBsdG1haW4uc2guCitpZiB0ZXN0IC1mICIkbHRtYWluIjsgdGhlbgorICA6CitlbHNlCisgICMgSWYgdGhlcmUgaXMgbm8gTWFrZWZpbGUgeWV0LCB3ZSByZWx5IG9uIGEgbWFrZSBydWxlIHRvIGV4ZWN1dGUKKyAgIyBgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2snIHRvIHJlcnVuIHRoZXNlIHRlc3RzIGFuZCBjcmVhdGUgdGhlCisgICMgbGlidG9vbCBzY3JpcHQgdGhlbi4KKyAgdGVzdCAtZiBNYWtlZmlsZSAmJiBtYWtlICIkbHRtYWluIgorZmkKKworaWYgdGVzdCAtZiAiJGx0bWFpbiI7IHRoZW4KKyAgdHJhcCAiJHJtIFwiJHtvZmlsZX1UXCI7IGV4aXQgMSIgMSAyIDE1CisgICRybSAtZiAiJHtvZmlsZX1UIgorCisgIGVjaG8gY3JlYXRpbmcgJG9maWxlCisKKyAgIyBOb3cgcXVvdGUgYWxsIHRoZSB0aGluZ3MgdGhhdCBtYXkgY29udGFpbiBtZXRhY2hhcmFjdGVycyB3aGlsZSBiZWluZworICAjIGNhcmVmdWwgbm90IHRvIG92ZXJxdW90ZSB0aGUgQUNfU1VCU1RlZCB2YWx1ZXMuICBXZSB0YWtlIGNvcGllcyBvZiB0aGUKKyAgIyB2YXJpYWJsZXMgYW5kIHF1b3RlIHRoZSBjb3BpZXMgZm9yIGdlbmVyYXRpb24gb2YgdGhlIGxpYnRvb2wgc2NyaXB0LgorICBmb3IgdmFyIGluIGVjaG8gb2xkX0NDIG9sZF9DRkxBR1MgXAorICAgIEFSIEFSX0ZMQUdTIENDIExEIExOX1MgTk0gU0hFTEwgXAorICAgIHJlbG9hZF9mbGFnIHJlbG9hZF9jbWRzIHdsIFwKKyAgICBwaWNfZmxhZyBsaW5rX3N0YXRpY19mbGFnIG5vX2J1aWx0aW5fZmxhZyBleHBvcnRfZHluYW1pY19mbGFnX3NwZWMgXAorICAgIHRocmVhZF9zYWZlX2ZsYWdfc3BlYyB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyBsaWJuYW1lX3NwZWMgXAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYyBzb25hbWVfc3BlYyBcCisgICAgUkFOTElCIG9sZF9hcmNoaXZlX2NtZHMgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyBvbGRfcG9zdGluc3RhbGxfY21kcyBcCisgICAgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBhcmNoaXZlX2NtZHMgYXJjaGl2ZV9leHBzeW1fY21kcyBwb3N0aW5zdGFsbF9jbWRzIFwKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHMgZXh0cmFjdF9leHBzeW1zX2NtZHMgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMgXAorICAgIG9sZF9zdHJpcGxpYiBzdHJpcGxpYiBmaWxlX21hZ2ljX2NtZCBleHBvcnRfc3ltYm9sc19jbWRzIFwKKyAgICBkZXBsaWJzX2NoZWNrX21ldGhvZCBhbGxvd191bmRlZmluZWRfZmxhZyBub191bmRlZmluZWRfZmxhZyBcCisgICAgZmluaXNoX2NtZHMgZmluaXNoX2V2YWwgZ2xvYmFsX3N5bWJvbF9waXBlIGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wgXAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciAgXAorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCisgICAgY29tcGlsZXJfY19vIGNvbXBpbGVyX29fbG8gbmVlZF9sb2NrcyBleGNsdWRlX2V4cHN5bXMgaW5jbHVkZV9leHBzeW1zOyBkbworCisgICAgY2FzZSAkdmFyIGluCisgICAgcmVsb2FkX2NtZHMgfCBvbGRfYXJjaGl2ZV9jbWRzIHwgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyB8IFwKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcyB8IG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgfCBcCisgICAgZXhwb3J0X3N5bWJvbHNfY21kcyB8IGFyY2hpdmVfY21kcyB8IGFyY2hpdmVfZXhwc3ltX2NtZHMgfCBcCisgICAgZXh0cmFjdF9leHBzeW1zX2NtZHMgfCBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyB8IFwKKyAgICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAorICAgIGZpbmlzaF9jbWRzIHwgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMpCisgICAgICAjIERvdWJsZS1xdW90ZSBkb3VibGUtZXZhbGVkIHN0cmluZ3MuCisgICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkZG91YmxlX3F1b3RlX3N1YnN0XCIgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiIC1lIFwiXCRkZWxheV92YXJpYWJsZV9zdWJzdFwiXGBcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiXGBcXFwiIgorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICBjYXQgPDxfX0VPRl9fID4gIiR7b2ZpbGV9VCIKKyMhICRTSEVMTAorCisjIGAkZWNobyAiJG9maWxlIiB8IHNlZCAncyVeLiovJSUnYCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUCkKKyMgTk9URTogQ2hhbmdlcyBtYWRlIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3Q6IGxvb2sgYXQgbHRtYWluLnNoLgorIworIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgT3JpZ2luYWxseSBieSBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIFNlZCB0aGF0IGhlbHBzIHVzIGF2b2lkIGFjY2lkZW50YWxseSB0cmlnZ2VyaW5nIGVjaG8oMSkgb3B0aW9ucyBsaWtlIC1uLgorWHNlZD0ic2VkIC1lIHMvXlgvLyIKKworIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKKyMgaWYgQ0RQQVRIIGlzIHNldC4KK2lmIHRlc3QgIlhcJHtDRFBBVEgrc2V0fSIgPSBYc2V0OyB0aGVuIENEUEFUSD06OyBleHBvcnQgQ0RQQVRIOyBmaQorCisjICMjIyBCRUdJTiBMSUJUT09MIENPTkZJRworCisjIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisKKyMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KK1NIRUxMPSRsdF9TSEVMTAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX2xpYnM9JGVuYWJsZV9zaGFyZWQKKworIyBXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9uZWVkX2xjPSRuZWVkX2xjCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KK2J1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCisKKyMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgorZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCisKKyMgVGhlIGhvc3Qgc3lzdGVtLgoraG9zdF9hbGlhcz0kaG9zdF9hbGlhcworaG9zdD0kaG9zdAorCisjIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlcy4KK2VjaG89JGx0X2VjaG8KKworIyBUaGUgYXJjaGl2ZXIuCitBUj0kbHRfQVIKK0FSX0ZMQUdTPSRsdF9BUl9GTEFHUworCisjIFRoZSBkZWZhdWx0IEMgY29tcGlsZXIuCitDQz0kbHRfQ0MKKworIyBJcyB0aGUgY29tcGlsZXIgdGhlIEdOVSBDIGNvbXBpbGVyPword2l0aF9nY2M9JEdDQworCisjIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCitMRD0kbHRfTEQKKworIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgorTE5fUz0kbHRfTE5fUworCisjIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KK05NPSRsdF9OTQorCisjIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtCitTVFJJUD0kU1RSSVAKKworIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zICJmaWxlIgorTUFHSUNfQ01EPSRNQUdJQ19DTUQKKworIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCitETExUT09MPSIkRExMVE9PTCIKKworIyBVc2VkIG9uIGN5Z3dpbjogb2JqZWN0IGR1bXBlci4KK09CSkRVTVA9IiRPQkpEVU1QIgorCisjIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCitBUz0iJEFTIgorCisjIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KK29iamRpcj0kb2JqZGlyCisKKyMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KK3JlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZworcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCisKKyMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KK3dsPSRsdF93bAorCisjIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KK29iamV4dD0iJGFjX29iamV4dCIKKworIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCitsaWJleHQ9IiRsaWJleHQiCisKKyMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgorZXhlZXh0PSIkZXhlZXh0IgorCisjIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KK3BpY19mbGFnPSRsdF9waWNfZmxhZworcGljX21vZGU9JHBpY19tb2RlCisKKyMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPworY29tcGlsZXJfY19vPSRsdF9jb21waWxlcl9jX28KKworIyBDYW4gd2Ugd3JpdGUgZGlyZWN0bHkgdG8gYSAubG8gPworY29tcGlsZXJfb19sbz0kbHRfY29tcGlsZXJfb19sbworCisjIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uID8KK25lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKKworIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPworbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKKworIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPworbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KKworIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgorCisjIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKKworIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKKworIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgorbGlua19zdGF0aWNfZmxhZz0kbHRfbGlua19zdGF0aWNfZmxhZworCisjIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCitub19idWlsdGluX2ZsYWc9JGx0X25vX2J1aWx0aW5fZmxhZworCisjIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYworCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYworCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KK3RocmVhZF9zYWZlX2ZsYWdfc3BlYz0kbHRfdGhyZWFkX3NhZmVfZmxhZ19zcGVjCisKKyMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCit2ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQorCisjIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgorbGlibmFtZV9zcGVjPSRsdF9saWJuYW1lX3NwZWMKKworIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgorIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FLgorbGlicmFyeV9uYW1lc19zcGVjPSRsdF9saWJyYXJ5X25hbWVzX3NwZWMKKworIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KK3NvbmFtZV9zcGVjPSRsdF9zb25hbWVfc3BlYworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCitSQU5MSUI9JGx0X1JBTkxJQgorb2xkX2FyY2hpdmVfY21kcz0kbHRfb2xkX2FyY2hpdmVfY21kcworb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMKKworIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGEgc2hhcmVkIGFyY2hpdmUuCithcmNoaXZlX2NtZHM9JGx0X2FyY2hpdmVfY21kcworYXJjaGl2ZV9leHBzeW1fY21kcz0kbHRfYXJjaGl2ZV9leHBzeW1fY21kcworcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcworcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9wb3N0dW5pbnN0YWxsX2NtZHMKKworIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCitvbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgorc3RyaXBsaWI9JGx0X3N0cmlwbGliCisKKyMgTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHMuCitkZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfZGVwbGlic19jaGVja19tZXRob2QKKworIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMuCitmaWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKKworIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KK2FsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9hbGxvd191bmRlZmluZWRfZmxhZworCisjIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCitub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWcKKworIyBDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnkuCitmaW5pc2hfY21kcz0kbHRfZmluaXNoX2NtZHMKKworIyBTYW1lIGFzIGFib3ZlLCBidXQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQgbm90IHNob3duLgorZmluaXNoX2V2YWw9JGx0X2ZpbmlzaF9ldmFsCisKKyMgVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lcy4KK2dsb2JhbF9zeW1ib2xfcGlwZT0kbHRfZ2xvYmFsX3N5bWJvbF9waXBlCisKKyMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgorZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAorCisjIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KK3J1bnBhdGhfdmFyPSRydW5wYXRoX3ZhcgorCisjIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCitzaGxpYnBhdGhfdmFyPSRzaGxpYnBhdGhfdmFyCisKKyMgSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoPworc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKKworIyBIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZS4KK2hhcmRjb2RlX2FjdGlvbj0kaGFyZGNvZGVfYWN0aW9uCisKKyMgV2hldGhlciB3ZSBzaG91bGQgaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIGxpYnJhcmllcy4KK2hhcmRjb2RlX2ludG9fbGlicz0kaGFyZGNvZGVfaW50b19saWJzCisKKyMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYworCisjIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcgorCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgRElSL2xpYk5BTUUuc28gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorIyByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfZGlyZWN0PSRoYXJkY29kZV9kaXJlY3QKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKyMgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0wKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50bworIyB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX3NobGlicGF0aF92YXI9JGhhcmRjb2RlX3NobGlicGF0aF92YXIKKworIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKKyMgcmVzdG9yZWQgYXQgcmVsaW5rIHRpbWUuCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIgorCisjIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KK2xpbmtfYWxsX2RlcGxpYnM9JGxpbmtfYWxsX2RlcGxpYnMKKworIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisKKyMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYworCisjIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCitmaXhfc3JjZmlsZV9wYXRoPSIkZml4X3NyY2ZpbGVfcGF0aCIKKworIyBTZXQgdG8geWVzIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkLgorYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSRhbHdheXNfZXhwb3J0X3N5bWJvbHMKKworIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgorZXhwb3J0X3N5bWJvbHNfY21kcz0kbHRfZXhwb3J0X3N5bWJvbHNfY21kcworCisjIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCitleHRyYWN0X2V4cHN5bXNfY21kcz0kbHRfZXh0cmFjdF9leHBzeW1zX2NtZHMKKworIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgorZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXMKKworIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCitpbmNsdWRlX2V4cHN5bXM9JGx0X2luY2x1ZGVfZXhwc3ltcworCisjICMjIyBFTkQgTElCVE9PTCBDT05GSUcKKworX19FT0ZfXworCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgY2F0IDw8XEVPRiA+PiAiJHtvZmlsZX1UIgorCisjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKKyMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcworIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgoraWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCisgIENPTExFQ1RfTkFNRVM9CisgIGV4cG9ydCBDT0xMRUNUX05BTUVTCitmaQorRU9GCisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKKyAgICBjYXQgPDwnRU9GJyA+PiAiJHtvZmlsZX1UIgorICAgICAgIyBUaGlzIGlzIGEgc291cmNlIHByb2dyYW0gdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSBkbGxzIG9uIFdpbmRvd3MKKyAgICAgICMgRG9uJ3QgcmVtb3ZlIG5vciBtb2RpZnkgdGhlIHN0YXJ0aW5nIGFuZCBjbG9zaW5nIGNvbW1lbnRzCisjIC8qIGx0ZGxsLmMgc3RhcnRzIGhlcmUgKi8KKyMgI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjICNpbmNsdWRlIDx3aW5kb3dzLmg+CisjICN1bmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCisjICNpbmNsdWRlIDxzdGRpby5oPgorIworIyAjaWZuZGVmIF9fQ1lHV0lOX18KKyMgIyAgaWZkZWYgX19DWUdXSU4zMl9fCisjICMgICAgZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCisjICMgIGVuZGlmCisjICNlbmRpZgorIworIyAjaWZkZWYgX19jcGx1c3BsdXMKKyMgZXh0ZXJuICJDIiB7CisjICNlbmRpZgorIyBCT09MIEFQSUVOVFJZIERsbE1haW4gKEhJTlNUQU5DRSBoSW5zdCwgRFdPUkQgcmVhc29uLCBMUFZPSUQgcmVzZXJ2ZWQpOworIyAjaWZkZWYgX19jcGx1c3BsdXMKKyMgfQorIyAjZW5kaWYKKyMKKyMgI2lmZGVmIF9fQ1lHV0lOX18KKyMgI2luY2x1ZGUgPGN5Z3dpbi9jeWd3aW5fZGxsLmg+CisjIERFQ0xBUkVfQ1lHV0lOX0RMTCggRGxsTWFpbiApOworIyAjZW5kaWYKKyMgSElOU1RBTkNFIF9faERsbEluc3RhbmNlX2Jhc2U7CisjCisjIEJPT0wgQVBJRU5UUlkKKyMgRGxsTWFpbiAoSElOU1RBTkNFIGhJbnN0LCBEV09SRCByZWFzb24sIExQVk9JRCByZXNlcnZlZCkKKyMgeworIyAgIF9faERsbEluc3RhbmNlX2Jhc2UgPSBoSW5zdDsKKyMgICByZXR1cm4gVFJVRTsKKyMgfQorIyAvKiBsdGRsbC5jIGVuZHMgaGVyZSAqLworICAgICAgICAjIFRoaXMgaXMgYSBzb3VyY2UgcHJvZ3JhbSB0aGF0IGlzIHVzZWQgdG8gY3JlYXRlIGltcG9ydCBsaWJyYXJpZXMKKyAgICAgICAgIyBvbiBXaW5kb3dzIGZvciBkbGxzIHdoaWNoIGxhY2sgdGhlbS4gRG9uJ3QgcmVtb3ZlIG5vciBtb2RpZnkgdGhlCisgICAgICAgICMgc3RhcnRpbmcgYW5kIGNsb3NpbmcgY29tbWVudHMKKyMgLyogaW1wZ2VuLmMgc3RhcnRzIGhlcmUgKi8KKyMgLyogICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBsaWJ0b29sLgorIworIyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjICAqLworIworIyAjaW5jbHVkZSA8c3RkaW8uaD4JCS8qIGZvciBwcmludGYoKSAqLworIyAjaW5jbHVkZSA8dW5pc3RkLmg+CQkvKiBmb3Igb3BlbigpLCBsc2VlaygpLCByZWFkKCkgKi8KKyMgI2luY2x1ZGUgPGZjbnRsLmg+CQkvKiBmb3IgT19SRE9OTFksIE9fQklOQVJZICovCisjICNpbmNsdWRlIDxzdHJpbmcuaD4JCS8qIGZvciBzdHJkdXAoKSAqLworIworIyAvKiBPX0JJTkFSWSBpc24ndCByZXF1aXJlZCAob3IgZXZlbiBkZWZpbmVkIHNvbWV0aW1lcykgdW5kZXIgVW5peCAqLworIyAjaWZuZGVmIE9fQklOQVJZCisjICNkZWZpbmUgT19CSU5BUlkgMAorIyAjZW5kaWYKKyMKKyMgc3RhdGljIHVuc2lnbmVkIGludAorIyBwZV9nZXQxNiAoZmQsIG9mZnNldCkKKyMgICAgICBpbnQgZmQ7CisjICAgICAgaW50IG9mZnNldDsKKyMgeworIyAgIHVuc2lnbmVkIGNoYXIgYlsyXTsKKyMgICBsc2VlayAoZmQsIG9mZnNldCwgU0VFS19TRVQpOworIyAgIHJlYWQgKGZkLCBiLCAyKTsKKyMgICByZXR1cm4gYlswXSArIChiWzFdPDw4KTsKKyMgfQorIworIyBzdGF0aWMgdW5zaWduZWQgaW50CisjIHBlX2dldDMyIChmZCwgb2Zmc2V0KQorIyAgICAgaW50IGZkOworIyAgICAgaW50IG9mZnNldDsKKyMgeworIyAgIHVuc2lnbmVkIGNoYXIgYls0XTsKKyMgICBsc2VlayAoZmQsIG9mZnNldCwgU0VFS19TRVQpOworIyAgIHJlYWQgKGZkLCBiLCA0KTsKKyMgICByZXR1cm4gYlswXSArIChiWzFdPDw4KSArIChiWzJdPDwxNikgKyAoYlszXTw8MjQpOworIyB9CisjCisjIHN0YXRpYyB1bnNpZ25lZCBpbnQKKyMgcGVfYXMzMiAocHRyKQorIyAgICAgIHZvaWQgKnB0cjsKKyMgeworIyAgIHVuc2lnbmVkIGNoYXIgKmIgPSBwdHI7CisjICAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCkgKyAoYlsyXTw8MTYpICsgKGJbM108PDI0KTsKKyMgfQorIworIyBpbnQKKyMgbWFpbiAoYXJnYywgYXJndikKKyMgICAgIGludCBhcmdjOworIyAgICAgY2hhciAqYXJndltdOworIyB7CisjICAgICBpbnQgZGxsOworIyAgICAgdW5zaWduZWQgbG9uZyBwZV9oZWFkZXJfb2Zmc2V0LCBvcHRoZHJfb2ZzLCBudW1fZW50cmllcywgaTsKKyMgICAgIHVuc2lnbmVkIGxvbmcgZXhwb3J0X3J2YSwgZXhwb3J0X3NpemUsIG5zZWN0aW9ucywgc2VjcHRyLCBleHBwdHI7CisjICAgICB1bnNpZ25lZCBsb25nIG5hbWVfcnZhcywgbmV4cDsKKyMgICAgIHVuc2lnbmVkIGNoYXIgKmV4cGRhdGEsICplcnZhOworIyAgICAgY2hhciAqZmlsZW5hbWUsICpkbGxfbmFtZTsKKyMKKyMgICAgIGZpbGVuYW1lID0gYXJndlsxXTsKKyMKKyMgICAgIGRsbCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZfE9fQklOQVJZKTsKKyMgICAgIGlmIChkbGwgPCAxKQorIyAJcmV0dXJuIDE7CisjCisjICAgICBkbGxfbmFtZSA9IGZpbGVuYW1lOworIworIyAgICAgZm9yIChpPTA7IGZpbGVuYW1lW2ldOyBpKyspCisjIAlpZiAoZmlsZW5hbWVbaV0gPT0gJy8nIHx8IGZpbGVuYW1lW2ldID09ICdcXCcgIHx8IGZpbGVuYW1lW2ldID09ICc6JykKKyMgCSAgICBkbGxfbmFtZSA9IGZpbGVuYW1lICsgaSArMTsKKyMKKyMgICAgIHBlX2hlYWRlcl9vZmZzZXQgPSBwZV9nZXQzMiAoZGxsLCAweDNjKTsKKyMgICAgIG9wdGhkcl9vZnMgPSBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDIwOworIyAgICAgbnVtX2VudHJpZXMgPSBwZV9nZXQzMiAoZGxsLCBvcHRoZHJfb2ZzICsgOTIpOworIworIyAgICAgaWYgKG51bV9lbnRyaWVzIDwgMSkgLyogbm8gZXhwb3J0cyAqLworIyAJcmV0dXJuIDE7CisjCisjICAgICBleHBvcnRfcnZhID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDk2KTsKKyMgICAgIGV4cG9ydF9zaXplID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDEwMCk7CisjICAgICBuc2VjdGlvbnMgPSBwZV9nZXQxNiAoZGxsLCBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArMik7CisjICAgICBzZWNwdHIgPSAocGVfaGVhZGVyX29mZnNldCArIDQgKyAyMCArCisjIAkgICAgICBwZV9nZXQxNiAoZGxsLCBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDE2KSk7CisjCisjICAgICBleHBwdHIgPSAwOworIyAgICAgZm9yIChpID0gMDsgaSA8IG5zZWN0aW9uczsgaSsrKQorIyAgICAgeworIyAJY2hhciBzbmFtZVs4XTsKKyMgCXVuc2lnbmVkIGxvbmcgc2VjcHRyMSA9IHNlY3B0ciArIDQwICogaTsKKyMgCXVuc2lnbmVkIGxvbmcgdmFkZHIgPSBwZV9nZXQzMiAoZGxsLCBzZWNwdHIxICsgMTIpOworIyAJdW5zaWduZWQgbG9uZyB2c2l6ZSA9IHBlX2dldDMyIChkbGwsIHNlY3B0cjEgKyAxNik7CisjIAl1bnNpZ25lZCBsb25nIGZwdHIgPSBwZV9nZXQzMiAoZGxsLCBzZWNwdHIxICsgMjApOworIyAJbHNlZWsoZGxsLCBzZWNwdHIxLCBTRUVLX1NFVCk7CisjIAlyZWFkKGRsbCwgc25hbWUsIDgpOworIyAJaWYgKHZhZGRyIDw9IGV4cG9ydF9ydmEgJiYgdmFkZHIrdnNpemUgPiBleHBvcnRfcnZhKQorIyAJeworIyAJICAgIGV4cHB0ciA9IGZwdHIgKyAoZXhwb3J0X3J2YSAtIHZhZGRyKTsKKyMgCSAgICBpZiAoZXhwb3J0X3J2YSArIGV4cG9ydF9zaXplID4gdmFkZHIgKyB2c2l6ZSkKKyMgCQlleHBvcnRfc2l6ZSA9IHZzaXplIC0gKGV4cG9ydF9ydmEgLSB2YWRkcik7CisjIAkgICAgYnJlYWs7CisjIAl9CisjICAgICB9CisjCisjICAgICBleHBkYXRhID0gKHVuc2lnbmVkIGNoYXIqKW1hbGxvYyhleHBvcnRfc2l6ZSk7CisjICAgICBsc2VlayAoZGxsLCBleHBwdHIsIFNFRUtfU0VUKTsKKyMgICAgIHJlYWQgKGRsbCwgZXhwZGF0YSwgZXhwb3J0X3NpemUpOworIyAgICAgZXJ2YSA9IGV4cGRhdGEgLSBleHBvcnRfcnZhOworIworIyAgICAgbmV4cCA9IHBlX2FzMzIgKGV4cGRhdGErMjQpOworIyAgICAgbmFtZV9ydmFzID0gcGVfYXMzMiAoZXhwZGF0YSszMik7CisjCisjICAgICBwcmludGYgKCJFWFBPUlRTXG4iKTsKKyMgICAgIGZvciAoaSA9IDA7IGk8bmV4cDsgaSsrKQorIyAgICAgeworIyAJdW5zaWduZWQgbG9uZyBuYW1lX3J2YSA9IHBlX2FzMzIgKGVydmErbmFtZV9ydmFzK2kqNCk7CisjIAlwcmludGYgKCJcdCVzIEAgJWxkIDtcbiIsIGVydmErbmFtZV9ydmEsIDErIGkpOworIyAgICAgfQorIworIyAgICAgcmV0dXJuIDA7CisjIH0KKyMgLyogaW1wZ2VuLmMgZW5kcyBoZXJlICovCisKK0VPRgorICAgIDs7CisgIGVzYWMKKworICAjIFdlIHVzZSBzZWQgaW5zdGVhZCBvZiBjYXQgYmVjYXVzZSBiYXNoIG9uIERKR1BQIGdldHMgY29uZnVzZWQgaWYKKyAgIyBpZiBmaW5kcyBtaXhlZCBDUi9MRiBhbmQgTEYtb25seSBsaW5lcy4gIFNpbmNlIHNlZCBvcGVyYXRlcyBpbgorICAjIHRleHQgbW9kZSwgaXQgcHJvcGVybHkgY29udmVydHMgbGluZXMgdG8gQ1IvTEYuICBUaGlzIGJhc2ggcHJvYmxlbQorICAjIGlzIHJlcG9ydGVkbHkgZml4ZWQsIGJ1dCB3aHkgbm90IHJ1biBvbiBvbGQgdmVyc2lvbnMgdG9vPworICBzZWQgJyRxJyAiJGx0bWFpbiIgPj4gIiR7b2ZpbGV9VCIgfHwgKHJtIC1mICIke29maWxlfVQiOyBleGl0IDEpCisKKyAgbXYgLWYgIiR7b2ZpbGV9VCIgIiRvZmlsZSIgfHwgXAorICAgIChybSAtZiAiJG9maWxlIiAmJiBjcCAiJHtvZmlsZX1UIiAiJG9maWxlIiAmJiBybSAtZiAiJHtvZmlsZX1UIikKKyAgY2htb2QgK3ggIiRvZmlsZSIKK2ZpCisjIworIyMgRU5EIEZJWE1FCisKKyMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKK0xJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgorCisjIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgorTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCisKKyMgUHJldmVudCBtdWx0aXBsZSBleHBhbnNpb24KKworYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIE1ha2VmaWxlIHBjcmUuaDpwY3JlLmluIHBjcmUtY29uZmlnOnBjcmUtY29uZmlnLmluIFJ1blRlc3Q6UnVuVGVzdC5pbiIKK2FjX2NvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyBkZWZhdWx0IgorY2F0ID5jb25mY2FjaGUgPDxcX0FDRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucywgc2VlIGNvbmZpZ3VyZSdzIG9wdGlvbiAtLWNvbmZpZy1jYWNoZS4KKyMgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLiAgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3QKKyMgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQKKyMgdGhlIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworIyBgYWNfY3ZfZW52X2ZvbycgdmFyaWFibGVzIChzZXQgb3IgdW5zZXQpIHdpbGwgYmUgb3ZlcnJpZGVuIHdoZW4KKyMgbG9hZGluZyB0aGlzIGZpbGUsIG90aGVyICp1bnNldCogYGFjX2N2X2Zvbycgd2lsbCBiZSBhc3NpZ25lZCB0aGUKKyMgZm9sbG93aW5nIHZhbHVlcy4KKworX0FDRU9GCisKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgoreworICAoc2V0KSAyPiYxIHwKKyAgICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgorICAgICphY19zcGFjZT1cICopCisgICAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlCisgICAgICAjIHN1YnN0aXR1dGlvbiB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKyAgICAgIHNlZCAtbiBcCisgICAgICAgICJzLycvJ1xcXFwnJy9nOworICAgIAkgIHMvXlxcKFtfJGFjX2NyX2FsbnVtXSpfY3ZfW18kYWNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9J1xcMicvcCIKKyAgICAgIDs7CisgICAgKikKKyAgICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgICBzZWQgLW4gXAorICAgICAgICAicy9eXFwoW18kYWNfY3JfYWxudW1dKl9jdl9bXyRhY19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT1cXDIvcCIKKyAgICAgIDs7CisgICAgZXNhYzsKK30gfAorICBzZWQgJworICAgICB0IGNsZWFyCisgICAgIDogY2xlYXIKKyAgICAgcy9eXChbXj1dKlwpPVwoLipbe31dLipcKSQvdGVzdCAiJHtcMStzZXR9IiA9IHNldCB8fCAmLworICAgICB0IGVuZAorICAgICAvXmFjX2N2X2Vudi8hcy9eXChbXj1dKlwpPVwoLipcKSQvXDE9JHtcMT1cMn0vCisgICAgIDogZW5kJyA+PmNvbmZjYWNoZQoraWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbiA6OyBlbHNlCisgIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKyAgICB0ZXN0ICJ4JGNhY2hlX2ZpbGUiICE9ICJ4L2Rldi9udWxsIiAmJiBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgICBjYXQgY29uZmNhY2hlID4kY2FjaGVfZmlsZQorICBlbHNlCisgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCisjIFZQQVRIIG1heSBjYXVzZSB0cm91YmxlIHdpdGggc29tZSBtYWtlcywgc28gd2UgcmVtb3ZlICQoc3JjZGlyKSwKKyMgJHtzcmNkaXJ9IGFuZCBAc3JjZGlyQCBmcm9tIFZQQVRIIGlmIHNyY2RpciBpcyAiLiIsIHN0cmlwIGxlYWRpbmcgYW5kCisjIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQorIyAoYWN0dWFsbHkgd2UgbGVhdmUgYW4gZW1wdHkgbGluZSB0byBwcmVzZXJ2ZSBsaW5lIG51bWJlcnMpLgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPS97CitzLzoqXCQoc3JjZGlyKToqLzovOworcy86Klwke3NyY2Rpcn06Ki86LzsKK3MvOipAc3JjZGlyQDoqLzovOworcy9eXChbXj1dKj1bIAldKlwpOiovXDEvOworcy86KiQvLzsKK3MvXltePV0qPVsgCV0qJC8vOworfScKK2ZpCisKK0RFRlM9LURIQVZFX0NPTkZJR19ICisKKzogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KK2FjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCithY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzICRDT05GSUdfU1RBVFVTIgoreyBlY2hvICIkYXNfbWU6NjcyNjogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNQorZWNobyAiJGFzX21lOiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY2O30KK2NhdCA+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKKyMhICRTSEVMTAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyMgY29uZmlndXJlLCBpcyBpbiBjb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworZGVidWc9ZmFsc2UKK1NIRUxMPVwke0NPTkZJR19TSEVMTC0kU0hFTEx9CithY19jc19pbnZvY2F0aW9uPSJcJDAgXCRAIgorCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCisjIEJlIEJvdXJuZSBjb21wYXRpYmxlCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKK2VsaWYgdGVzdCAtbiAiJHtCQVNIX1ZFUlNJT04rc2V0fSIgJiYgKHNldCAtbyBwb3NpeCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHNldCAtbyBwb3NpeAorZmkKKworIyBOYW1lIG9mIHRoZSBleGVjdXRhYmxlLgorYXNfbWU9YGVjaG8gIiQwIiB8c2VkICdzLC4qW1xcL10sLCdgCisKK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQorZWNobyA+Y29uZiQkLmZpbGUKK2lmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAjIFdlIGNvdWxkIGp1c3QgY2hlY2sgZm9yIERKR1BQOyBidXQgdGhpcyB0ZXN0IGEpIHdvcmtzIGIpIGlzIG1vcmUgZ2VuZXJpYworICAjIGFuZCBjKSB3aWxsIHJlbWFpbiB2YWxpZCBvbmNlIERKR1BQIHN1cHBvcnRzIHN5bWxpbmtzIChESkdQUCAyLjA0KS4KKyAgaWYgdGVzdCAtZiBjb25mJCQuZXhlOyB0aGVuCisgICAgIyBEb24ndCB1c2UgbG4gYXQgYWxsOyB3ZSBkb24ndCBoYXZlIGFueSBsaW5rcworICAgIGFzX2xuX3M9J2NwIC1wJworICBlbHNlCisgICAgYXNfbG5fcz0nbG4gLXMnCisgIGZpCitlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19sbl9zPWxuCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCisKK2FzX2V4ZWN1dGFibGVfcD0idGVzdCAtZiIKKworIyBTdXBwb3J0IHVuc2V0IHdoZW4gcG9zc2libGUuCitpZiAoRk9PPUZPTzsgdW5zZXQgRk9PKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfdW5zZXQ9dW5zZXQKK2Vsc2UKKyAgYXNfdW5zZXQ9ZmFsc2UKK2ZpCisKKyMgTkxTIG51aXNhbmNlcy4KKyRhc191bnNldCBMQU5HIHx8IHRlc3QgIiR7TEFORytzZXR9IiAhPSBzZXQgfHwgeyBMQU5HPUM7IGV4cG9ydCBMQU5HOyB9CiskYXNfdW5zZXQgTENfQUxMIHx8IHRlc3QgIiR7TENfQUxMK3NldH0iICE9IHNldCB8fCB7IExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyB9CiskYXNfdW5zZXQgTENfVElNRSB8fCB0ZXN0ICIke0xDX1RJTUUrc2V0fSIgIT0gc2V0IHx8IHsgTENfVElNRT1DOyBleHBvcnQgTENfVElNRTsgfQorJGFzX3Vuc2V0IExDX0NUWVBFIHx8IHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgIT0gc2V0IHx8IHsgTENfQ1RZUEU9QzsgZXhwb3J0IExDX0NUWVBFOyB9CiskYXNfdW5zZXQgTEFOR1VBR0UgfHwgdGVzdCAiJHtMQU5HVUFHRStzZXR9IiAhPSBzZXQgfHwgeyBMQU5HVUFHRT1DOyBleHBvcnQgTEFOR1VBR0U7IH0KKyRhc191bnNldCBMQ19DT0xMQVRFIHx8IHRlc3QgIiR7TENfQ09MTEFURStzZXR9IiAhPSBzZXQgfHwgeyBMQ19DT0xMQVRFPUM7IGV4cG9ydCBMQ19DT0xMQVRFOyB9CiskYXNfdW5zZXQgTENfTlVNRVJJQyB8fCB0ZXN0ICIke0xDX05VTUVSSUMrc2V0fSIgIT0gc2V0IHx8IHsgTENfTlVNRVJJQz1DOyBleHBvcnQgTENfTlVNRVJJQzsgfQorJGFzX3Vuc2V0IExDX01FU1NBR0VTIHx8IHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgIT0gc2V0IHx8IHsgTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyB9CisKKyMgSUZTCisjIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLgorYXNfbmw9JworJworSUZTPSIgCSRhc19ubCIKKworIyBDRFBBVEguCiskYXNfdW5zZXQgQ0RQQVRIIHx8IHRlc3QgIiR7Q0RQQVRIK3NldH0iICE9IHNldCB8fCB7IENEUEFUSD06OyBleHBvcnQgQ0RQQVRIOyB9CisKK2V4ZWMgNj4mMQorCitfQUNFT0YKKworIyBGaWxlcyB0aGF0IGNvbmZpZy5zdGF0dXMgd2FzIG1hZGUgZm9yLgoraWYgdGVzdCAtbiAiJGFjX2NvbmZpZ19maWxlcyI7IHRoZW4KKyAgZWNobyAiY29uZmlnX2ZpbGVzPVwiJGFjX2NvbmZpZ19maWxlc1wiIiA+PiRDT05GSUdfU1RBVFVTCitmaQorCitpZiB0ZXN0IC1uICIkYWNfY29uZmlnX2hlYWRlcnMiOyB0aGVuCisgIGVjaG8gImNvbmZpZ19oZWFkZXJzPVwiJGFjX2NvbmZpZ19oZWFkZXJzXCIiID4+JENPTkZJR19TVEFUVVMKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY19jb25maWdfbGlua3MiOyB0aGVuCisgIGVjaG8gImNvbmZpZ19saW5rcz1cIiRhY19jb25maWdfbGlua3NcIiIgPj4kQ09ORklHX1NUQVRVUworZmkKKworaWYgdGVzdCAtbiAiJGFjX2NvbmZpZ19jb21tYW5kcyI7IHRoZW4KKyAgZWNobyAiY29uZmlnX2NvbW1hbmRzPVwiJGFjX2NvbmZpZ19jb21tYW5kc1wiIiA+PiRDT05GSUdfU1RBVFVTCitmaQorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxFT0YKKworYWNfY3NfdXNhZ2U9IlwKK1xgJGFzX21lJyBpbnN0YW50aWF0ZXMgZmlsZXMgZnJvbSB0ZW1wbGF0ZXMgYWNjb3JkaW5nIHRvIHRoZQorY3VycmVudCBjb25maWd1cmF0aW9uLgorCitVc2FnZTogJDAgW09QVElPTlNdIFtGSUxFXS4uLgorCisgIC1oLCAtLWhlbHAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLVYsIC0tdmVyc2lvbiAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisgIC1kLCAtLWRlYnVnICAgICAgZG9uJ3QgcmVtb3ZlIHRlbXBvcmFyeSBmaWxlcworICAgICAgLS1yZWNoZWNrICAgIHVwZGF0ZSAkYXNfbWUgYnkgcmVjb25maWd1cmluZyBpbiB0aGUgc2FtZSBjb25kaXRpb25zCisgIC0tZmlsZT1GSUxFWzpURU1QTEFURV0KKyAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIEZJTEUKKyAgLS1oZWFkZXI9RklMRVs6VEVNUExBVEVdCisgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gaGVhZGVyIEZJTEUKKworQ29uZmlndXJhdGlvbiBmaWxlczoKKyRjb25maWdfZmlsZXMKKworQ29uZmlndXJhdGlvbiBoZWFkZXJzOgorJGNvbmZpZ19oZWFkZXJzCisKK0NvbmZpZ3VyYXRpb24gY29tbWFuZHM6CiskY29uZmlnX2NvbW1hbmRzCisKK1JlcG9ydCBidWdzIHRvIDxidWctYXV0b2NvbmZAZ251Lm9yZz4uIgorRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8RU9GCithY19jc192ZXJzaW9uPSJcXAorY29uZmlnLnN0YXR1cworY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjUwLAorICB3aXRoIG9wdGlvbnMgXFwiYGVjaG8gIiRhY19jb25maWd1cmVfYXJncyIgfCBzZWQgJ3MvW1xcIiJcYFwkXS9cXFxcJi9nJ2BcXCIKKworQ29weXJpZ2h0IDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBjb25maWcuc3RhdHVzIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgorc3JjZGlyPSRzcmNkaXIKK0lOU1RBTEw9IiRJTlNUQUxMIgorRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XEVPRgorIyBJZiBubyBmaWxlIGFyZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIsIHRoZW4gd2UgbmVlZCB0byBwcm92aWRlIGRlZmF1bHQKKyMgdmFsdWUuICBCeSB3ZSBuZWVkIHRvIGtub3cgaWYgZmlsZXMgd2VyZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCithY19uZWVkX2RlZmF1bHRzPToKK3doaWxlIHRlc3QgJCMgIT0gMAorZG8KKyAgY2FzZSAkMSBpbgorICAtLSo9KikKKyAgICBhY19vcHRpb249YGV4cHIgIngkMSIgOiAneFwoW149XSpcKT0nYAorICAgIGFjX29wdGFyZz1gZXhwciAieCQxIiA6ICd4W149XSo9XCguKlwpJ2AKKyAgICBzaGlmdAorICAgIHNldCBkdW1teSAiJGFjX29wdGlvbiIgIiRhY19vcHRhcmciICR7MSsiJEAifQorICAgIHNoaWZ0CisgICAgOzsKKyAgLSopOzsKKyAgKikgIyBUaGlzIGlzIG5vdCBhbiBvcHRpb24sIHNvIHRoZSB1c2VyIGhhcyBwcm9iYWJseSBnaXZlbiBleHBsaWNpdAorICAgICAjIGFyZ3VtZW50cy4KKyAgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIGVzYWMKKworICBjYXNlICQxIGluCisgICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCitFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8RU9GCisgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQorICAgIGVjaG8gInJ1bm5pbmcgJFNIRUxMICQwICIgJGFjX2NvbmZpZ3VyZV9hcmdzICIgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCisgICAgZXhlYyAkU0hFTEwgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7CitFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XEVPRgorICAtLXZlcnNpb24gfCAtLXZlcnMqIHwgLVYgKQorICAgIGVjaG8gIiRhY19jc192ZXJzaW9uIjsgZXhpdCAwIDs7CisgIC0taGUgfCAtLWgpCisgICAgIyBDb25mbGljdCBiZXR3ZWVuIC0taGVscCBhbmQgLS1oZWFkZXIKKyAgICB7IHsgZWNobyAiJGFzX21lOjY5MDI6IGVycm9yOiBhbWJpZ3VvdXMgb3B0aW9uOiAkMQorVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogYW1iaWd1b3VzIG9wdGlvbjogJDEKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKKyAgLS1oZWxwIHwgLS1oZWwgfCAtaCApCisgICAgZWNobyAiJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7CisgIC0tZGVidWcgfCAtLWQqIHwgLWQgKQorICAgIGRlYnVnPTogOzsKKyAgLS1maWxlIHwgLS1maWwgfCAtLWZpIHwgLS1mICkKKyAgICBzaGlmdAorICAgIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyAkMSIKKyAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKKyAgLS1oZWFkZXIgfCAtLWhlYWRlIHwgLS1oZWFkIHwgLS1oZWEgKQorICAgIHNoaWZ0CisgICAgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyAkMSIKKyAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKKworICAjIEhhbmRsaW5nIG9mIGFyZ3VtZW50cy4KKyAgJ01ha2VmaWxlJyApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBNYWtlZmlsZSIgOzsKKyAgJ3BjcmUuaCcgKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgcGNyZS5oOnBjcmUuaW4iIDs7CisgICdwY3JlLWNvbmZpZycgKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgcGNyZS1jb25maWc6cGNyZS1jb25maWcuaW4iIDs7CisgICdSdW5UZXN0JyApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBSdW5UZXN0OlJ1blRlc3QuaW4iIDs7CisgICdkZWZhdWx0JyApIENPTkZJR19DT01NQU5EUz0iJENPTkZJR19DT01NQU5EUyBkZWZhdWx0IiA7OworICAnY29uZmlnLmgnICkgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyBjb25maWcuaDpjb25maWcuaW4iIDs7CisKKyAgIyBUaGlzIGlzIGFuIGVycm9yLgorICAtKikgeyB7IGVjaG8gIiRhc19tZTo2OTI5OiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbjogJDEKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICQxCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworICAqKSB7IHsgZWNobyAiJGFzX21lOjY5MzQ6IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkMSIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkMSIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7CisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworZXhlYyA1Pj5jb25maWcubG9nCitjYXQgPiY1IDw8IF9BQ0VPRgorCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgUnVubmluZyBjb25maWcuc3RhdHVzLiAgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKK1RoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgJGFzX21lIDIuNTAsIGV4ZWN1dGVkIHdpdGgKKyAgPiAkYWNfY3NfaW52b2NhdGlvbgorb24gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCisKK19BQ0VPRgorRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XEVPRgorIyBJZiB0aGUgdXNlciBkaWQgbm90IHVzZSB0aGUgYXJndW1lbnRzIHRvIHNwZWNpZnkgdGhlIGl0ZW1zIHRvIGluc3RhbnRpYXRlLAorIyB0aGVuIHRoZSBlbnZ2YXIgaW50ZXJmYWNlIGlzIHVzZWQuICBTZXQgb25seSB0aG9zZSB0aGF0IGFyZSBub3QuCisjIFdlIHVzZSB0aGUgbG9uZyBmb3JtIGZvciB0aGUgZGVmYXVsdCBhc3NpZ25tZW50IGJlY2F1c2Ugb2YgYW4gZXh0cmVtZWx5CisjIGJpemFycmUgYnVnIG9uIFN1bk9TIDQuMS4zLgoraWYgJGFjX25lZWRfZGVmYXVsdHM7IHRoZW4KKyAgdGVzdCAiJHtDT05GSUdfRklMRVMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0ZJTEVTPSRjb25maWdfZmlsZXMKKyAgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiA9IHNldCB8fCBDT05GSUdfSEVBREVSUz0kY29uZmlnX2hlYWRlcnMKKyAgdGVzdCAiJHtDT05GSUdfQ09NTUFORFMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0NPTU1BTkRTPSRjb25maWdfY29tbWFuZHMKK2ZpCisKKyMgQ3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgYW5kIGhvb2sgZm9yIGl0cyByZW1vdmFsIHVubGVzcyBkZWJ1Z2dpbmcuCiskZGVidWcgfHwKK3sKKyAgdHJhcCAnZXhpdF9zdGF0dXM9JD87IHJtIC1yZiAkdG1wICYmIGV4aXQgJGV4aXRfc3RhdHVzJyAwCisgIHRyYXAgJ3sgKGV4aXQgJD8pOyBleGl0ICQ/OyB9JyAxIDIgMTMgMTUKK30KKworIyBDcmVhdGUgYSAoc2VjdXJlKSB0bXAgZGlyZWN0b3J5IGZvciB0bXAgZmlsZXMuCis6ICR7VE1QRElSPS90bXB9Cit7CisgIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgLXEgIiRUTVBESVIvY3NYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYKKyAgdGVzdCAtbiAiJHRtcCIgJiYgdGVzdCAtZCAiJHRtcCIKK30gIHx8Cit7CisgIHRtcD0kVE1QRElSL2NzJCQtJFJBTkRPTQorICAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApCit9IHx8Cit7CisgICBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluICRUTVBESVIiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Cit9CisKK0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PEVPRgorCisjCisjIENPTkZJR19GSUxFUyBzZWN0aW9uLgorIworCisjIE5vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIHNjcmlwdHMgaWYgdGhlcmUgYXJlIG5vIENPTkZJR19GSUxFUy4KKyMgVGhpcyBoYXBwZW5zIGZvciBpbnN0YW5jZSB3aGVuIC4vY29uZmlnLnN0YXR1cyBjb25maWcuaAoraWYgdGVzdCAtbiAiXCRDT05GSUdfRklMRVMiOyB0aGVuCisgICMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCisgIHNlZCAncy8sQC9AQC87IHMvQCwvQEAvOyBzLyw7dCB0XCQvQDt0IHQvOyAvQDt0IHRcJC9zL1tcXFxcJixdL1xcXFwmL2c7CisgICBzL0BALyxALzsgcy9AQC9ALC87IHMvQDt0IHRcJC8sO3QgdC8nID5cJHRtcC9zdWJzLnNlZCA8PFxcQ0VPRgorcyxAU0hFTExALCRTSEVMTCw7dCB0CitzLEBleGVjX3ByZWZpeEAsJGV4ZWNfcHJlZml4LDt0IHQKK3MsQHByZWZpeEAsJHByZWZpeCw7dCB0CitzLEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCwkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSw7dCB0CitzLEBiaW5kaXJALCRiaW5kaXIsO3QgdAorcyxAc2JpbmRpckAsJHNiaW5kaXIsO3QgdAorcyxAbGliZXhlY2RpckAsJGxpYmV4ZWNkaXIsO3QgdAorcyxAZGF0YWRpckAsJGRhdGFkaXIsO3QgdAorcyxAc3lzY29uZmRpckAsJHN5c2NvbmZkaXIsO3QgdAorcyxAc2hhcmVkc3RhdGVkaXJALCRzaGFyZWRzdGF0ZWRpciw7dCB0CitzLEBsb2NhbHN0YXRlZGlyQCwkbG9jYWxzdGF0ZWRpciw7dCB0CitzLEBsaWJkaXJALCRsaWJkaXIsO3QgdAorcyxAaW5jbHVkZWRpckAsJGluY2x1ZGVkaXIsO3QgdAorcyxAb2xkaW5jbHVkZWRpckAsJG9sZGluY2x1ZGVkaXIsO3QgdAorcyxAaW5mb2RpckAsJGluZm9kaXIsO3QgdAorcyxAbWFuZGlyQCwkbWFuZGlyLDt0IHQKK3MsQFBBQ0tBR0VfTkFNRUAsJFBBQ0tBR0VfTkFNRSw7dCB0CitzLEBQQUNLQUdFX1RBUk5BTUVALCRQQUNLQUdFX1RBUk5BTUUsO3QgdAorcyxAUEFDS0FHRV9WRVJTSU9OQCwkUEFDS0FHRV9WRVJTSU9OLDt0IHQKK3MsQFBBQ0tBR0VfU1RSSU5HQCwkUEFDS0FHRV9TVFJJTkcsO3QgdAorcyxAUEFDS0FHRV9CVUdSRVBPUlRALCRQQUNLQUdFX0JVR1JFUE9SVCw7dCB0CitzLEBFQ0hPX0NALCRFQ0hPX0MsO3QgdAorcyxARUNIT19OQCwkRUNIT19OLDt0IHQKK3MsQEVDSE9fVEAsJEVDSE9fVCw7dCB0CitzLEBQQVRIX1NFUEFSQVRPUkAsJFBBVEhfU0VQQVJBVE9SLDt0IHQKK3MsQERFRlNALCRERUZTLDt0IHQKK3MsQExJQlNALCRMSUJTLDt0IHQKK3MsQENDQCwkQ0MsO3QgdAorcyxAQ0ZMQUdTQCwkQ0ZMQUdTLDt0IHQKK3MsQExERkxBR1NALCRMREZMQUdTLDt0IHQKK3MsQENQUEZMQUdTQCwkQ1BQRkxBR1MsO3QgdAorcyxAYWNfY3RfQ0NALCRhY19jdF9DQyw7dCB0CitzLEBFWEVFWFRALCRFWEVFWFQsO3QgdAorcyxAT0JKRVhUQCwkT0JKRVhULDt0IHQKK3MsQElOU1RBTExfUFJPR1JBTUAsJElOU1RBTExfUFJPR1JBTSw7dCB0CitzLEBJTlNUQUxMX1NDUklQVEAsJElOU1RBTExfU0NSSVBULDt0IHQKK3MsQElOU1RBTExfREFUQUAsJElOU1RBTExfREFUQSw7dCB0CitzLEBSQU5MSUJALCRSQU5MSUIsO3QgdAorcyxAYWNfY3RfUkFOTElCQCwkYWNfY3RfUkFOTElCLDt0IHQKK3MsQENQUEAsJENQUCw7dCB0CitzLEBidWlsZEAsJGJ1aWxkLDt0IHQKK3MsQGJ1aWxkX2NwdUAsJGJ1aWxkX2NwdSw7dCB0CitzLEBidWlsZF92ZW5kb3JALCRidWlsZF92ZW5kb3IsO3QgdAorcyxAYnVpbGRfb3NALCRidWlsZF9vcyw7dCB0CitzLEBob3N0QCwkaG9zdCw7dCB0CitzLEBob3N0X2NwdUAsJGhvc3RfY3B1LDt0IHQKK3MsQGhvc3RfdmVuZG9yQCwkaG9zdF92ZW5kb3IsO3QgdAorcyxAaG9zdF9vc0AsJGhvc3Rfb3MsO3QgdAorcyxATE5fU0AsJExOX1MsO3QgdAorcyxARUNIT0AsJEVDSE8sO3QgdAorcyxAU1RSSVBALCRTVFJJUCw7dCB0CitzLEBhY19jdF9TVFJJUEAsJGFjX2N0X1NUUklQLDt0IHQKK3MsQExJQlRPT0xALCRMSUJUT09MLDt0IHQKK3MsQEhBVkVfTUVNTU9WRUAsJEhBVkVfTUVNTU9WRSw7dCB0CitzLEBIQVZFX1NUUkVSUk9SQCwkSEFWRV9TVFJFUlJPUiw7dCB0CitzLEBORVdMSU5FQCwkTkVXTElORSw7dCB0CitzLEBVVEY4QCwkVVRGOCw7dCB0CitzLEBQQ1JFX01BSk9SQCwkUENSRV9NQUpPUiw7dCB0CitzLEBQQ1JFX01JTk9SQCwkUENSRV9NSU5PUiw7dCB0CitzLEBQQ1JFX0RBVEVALCRQQ1JFX0RBVEUsO3QgdAorcyxAUENSRV9WRVJTSU9OQCwkUENSRV9WRVJTSU9OLDt0IHQKK3MsQFBDUkVfTElCX1ZFUlNJT05ALCRQQ1JFX0xJQl9WRVJTSU9OLDt0IHQKK3MsQFBDUkVfUE9TSVhMSUJfVkVSU0lPTkAsJFBDUkVfUE9TSVhMSUJfVkVSU0lPTiw7dCB0CitDRU9GCisKK0VPRgorCisgIGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XEVPRgorICAjIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAorICAjIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KKyAgYWNfbWF4X3NlZF9saW5lcz00OAorICBhY19zZWRfZnJhZz0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KKyAgYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCisgIGFjX2VuZD0kYWNfbWF4X3NlZF9saW5lcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCisgIGFjX21vcmVfbGluZXM9OgorICBhY19zZWRfY21kcz0KKyAgd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCisgICAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCisgICAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgJHRtcC9zdWJzLnNlZCA+JHRtcC9zdWJzLmZyYWcKKyAgICBlbHNlCisgICAgICBzZWQgIiR7YWNfZW5kfXEiICR0bXAvc3Vicy5zZWQgPiR0bXAvc3Vicy5mcmFnCisgICAgZmkKKyAgICBpZiB0ZXN0ICEgLXMgJHRtcC9zdWJzLmZyYWc7IHRoZW4KKyAgICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKyAgICBlbHNlCisgICAgICAjIFRoZSBwdXJwb3NlIG9mIHRoZSBsYWJlbCBhbmQgb2YgdGhlIGJyYW5jaGluZyBjb25kaXRpb24gaXMgdG8KKyAgICAgICMgc3BlZWQgdXAgdGhlIHNlZCBwcm9jZXNzaW5nIChpZiB0aGVyZSBhcmUgbm8gYEAnIGF0IGFsbCwgdGhlcmUKKyAgICAgICMgaXMgbm8gbmVlZCB0byBicm93c2UgYW55IG9mIHRoZSBzdWJzdGl0dXRpb25zKS4KKyAgICAgICMgVGhlc2UgYXJlIHRoZSB0d28gZXh0cmEgc2VkIGNvbW1hbmRzIG1lbnRpb25lZCBhYm92ZS4KKyAgICAgIChlY2hvICc6dAorICAvQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiJyAmJiBjYXQgJHRtcC9zdWJzLmZyYWcpID4kdG1wL3N1YnMtJGFjX3NlZF9mcmFnLnNlZAorICAgICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAJYWNfc2VkX2NtZHM9InNlZCAtZiAkdG1wL3N1YnMtJGFjX3NlZF9mcmFnLnNlZCIKKyAgICAgIGVsc2UKKyAgCWFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgJHRtcC9zdWJzLSRhY19zZWRfZnJhZy5zZWQiCisgICAgICBmaQorICAgICAgYWNfc2VkX2ZyYWc9YGV4cHIgJGFjX3NlZF9mcmFnICsgMWAKKyAgICAgIGFjX2JlZz0kYWNfZW5kCisgICAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2xpbmVzYAorICAgIGZpCisgIGRvbmUKKyAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAgIGFjX3NlZF9jbWRzPWNhdAorICBmaQorZmkgIyB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIgorCitFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XEVPRgorZm9yIGFjX2ZpbGUgaW4gOiAkQ09ORklHX0ZJTEVTOyBkbyB0ZXN0ICJ4JGFjX2ZpbGUiID0geDogJiYgY29udGludWUKKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICRhY19maWxlIGluCisgIC0gfCAqOi0gfCAqOi06KiApICMgaW5wdXQgZnJvbSBzdGRpbgorICAgICAgICBjYXQgPiR0bXAvc3RkaW4KKyAgICAgICAgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKKyAgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLDouKiwsJ2AgOzsKKyAgKjoqICkgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKKyAgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLDouKiwsJ2AgOzsKKyAgKiApICAgYWNfZmlsZV9pbj0kYWNfZmlsZS5pbiA7OworICBlc2FjCisKKyAgIyBDb21wdXRlIEBzcmNkaXJALCBAdG9wX3NyY2RpckAsIGFuZCBASU5TVEFMTEAgZm9yIHN1YmRpcmVjdG9yaWVzLgorICBhY19kaXI9YCRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisgICAgICAgICBYIiRhY19maWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAorICAgICAgICAgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKKyAgICAgICAgIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgXAorICAgICAgICAgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgiJGFjX2ZpbGUiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXClbXi9dLioveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAorICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICB7IGNhc2UgIiRhY19kaXIiIGluCisgIFtcXC9dKiB8ID86W1xcL10qICkgYXNfaW5jcl9kaXI9OzsKKyAgKikgICAgICAgICAgICAgICAgICAgICAgYXNfaW5jcl9kaXI9Ljs7Citlc2FjCithc19kdW1teT0iJGFjX2RpciIKK2ZvciBhc19ta2Rpcl9kaXIgaW4gYElGUz0nL1xcJzsgc2V0IFggJGFzX2R1bW15OyBzaGlmdDsgZWNobyAiJEAiYDsgZG8KKyAgY2FzZSAkYXNfbWtkaXJfZGlyIGluCisgICAgIyBTa2lwIERPUyBkcml2ZXNwZWMKKyAgICA/OikgYXNfaW5jcl9kaXI9JGFzX21rZGlyX2RpciA7OworICAgICopCisgICAgICBhc19pbmNyX2Rpcj0kYXNfaW5jcl9kaXIvJGFzX21rZGlyX2RpcgorICAgICAgdGVzdCAtZCAiJGFzX2luY3JfZGlyIiB8fCBta2RpciAiJGFzX2luY3JfZGlyIgorICAgIDs7CisgIGVzYWMKK2RvbmU7IH0KKworICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyxeXC4vLCwnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICAgIGFjX2RvdHM9YGVjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAncywvW14vXSosLi4vLGcnYAorICBlbHNlCisgICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICRzcmNkaXIgaW4KKyAgLikgIGFjX3NyY2Rpcj0uCisgICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4KKyAgICAgICAgIGFjX3RvcF9zcmNkaXI9LgorICAgICAgZWxzZQorICAgICAgICAgYWNfdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90cyB8IHNlZCAncywvJCwsJ2AKKyAgICAgIGZpIDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkKKyAgICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7CisgICAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIGFjX3NyY2Rpcj0kYWNfZG90cyRzcmNkaXIkYWNfZGlyX3N1ZmZpeAorICAgIGFjX3RvcF9zcmNkaXI9JGFjX2RvdHMkc3JjZGlyIDs7CisgIGVzYWMKKworICBjYXNlICRJTlNUQUxMIGluCisgIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX0lOU1RBTEw9JElOU1RBTEwgOzsKKyAgKikgYWNfSU5TVEFMTD0kYWNfZG90cyRJTlNUQUxMIDs7CisgIGVzYWMKKworICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisgICAgeyBlY2hvICIkYXNfbWU6NzE3OTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZmlsZSIgPiY2O30KKyAgICBybSAtZiAiJGFjX2ZpbGUiCisgIGZpCisgICMgTGV0J3Mgc3RpbGwgcHJldGVuZCBpdCBpcyBgY29uZmlndXJlJyB3aGljaCBpbnN0YW50aWF0ZXMgKGkuZS4sIGRvbid0CisgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKKyAgIyAgICAvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZy5zdGF0dXMuICAqLworICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW4gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZCAncywuKi8sLCdgIGJ5IGNvbmZpZ3VyZS4iCisKKyAgIyBGaXJzdCBsb29rIGZvciB0aGUgaW5wdXQgZmlsZXMgaW4gdGhlIGJ1aWxkIHRyZWUsIG90aGVyd2lzZSBpbiB0aGUKKyAgIyBzcmMgdHJlZS4KKyAgYWNfZmlsZV9pbnB1dHM9YElGUz06CisgICAgZm9yIGYgaW4gJGFjX2ZpbGVfaW47IGRvCisgICAgICBjYXNlICRmIGluCisgICAgICAtKSBlY2hvICR0bXAvc3RkaW4gOzsKKyAgICAgIFtcXC8kXSopCisgICAgICAgICAjIEFic29sdXRlIChjYW4ndCBiZSBET1Mtc3R5bGUsIGFzIElGUz06KQorICAgICAgICAgdGVzdCAtZiAiJGYiIHx8IHsgeyBlY2hvICIkYXNfbWU6NzE5NzogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgICAgICBlY2hvICRmOzsKKyAgICAgICopICMgUmVsYXRpdmUKKyAgICAgICAgIGlmIHRlc3QgLWYgIiRmIjsgdGhlbgorICAgICAgICAgICAjIEJ1aWxkIHRyZWUKKyAgICAgICAgICAgZWNobyAkZgorICAgICAgICAgZWxpZiB0ZXN0IC1mICIkc3JjZGlyLyRmIjsgdGhlbgorICAgICAgICAgICAjIFNvdXJjZSB0cmVlCisgICAgICAgICAgIGVjaG8gJHNyY2Rpci8kZgorICAgICAgICAgZWxzZQorICAgICAgICAgICAjIC9kZXYvbnVsbCB0cmVlCisgICAgICAgICAgIHsgeyBlY2hvICIkYXNfbWU6NzIxMDogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgICAgICBmaTs7CisgICAgICBlc2FjCisgICAgZG9uZWAgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9CitFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8RU9GCisgIHNlZCAiJGFjX3Zwc3ViCiskZXh0cmFzdWIKK0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcRU9GCis6dAorL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYgorcyxAY29uZmlndXJlX2lucHV0QCwkY29uZmlndXJlX2lucHV0LDt0IHQKK3MsQHNyY2RpckAsJGFjX3NyY2Rpciw7dCB0CitzLEB0b3Bfc3JjZGlyQCwkYWNfdG9wX3NyY2Rpciw7dCB0CitzLEBJTlNUQUxMQCwkYWNfSU5TVEFMTCw7dCB0CisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+JHRtcC9vdXQKKyAgcm0gLWYgJHRtcC9zdGRpbgorICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisgICAgbXYgJHRtcC9vdXQgJGFjX2ZpbGUKKyAgZWxzZQorICAgIGNhdCAkdG1wL291dAorICAgIHJtIC1mICR0bXAvb3V0CisgIGZpCisKK2RvbmUKK0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcRU9GCisKKyMKKyMgQ09ORklHX0hFQURFUiBzZWN0aW9uLgorIworCisjIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQorIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgorIworIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgorYWNfZEE9J3MsXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCithY19kQj0nWyAJXS4qJCxcMSNcMicKK2FjX2RDPScgJworYWNfZEQ9Jyw7dCcKKyMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY191QT0ncyxeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKK2FjX3VCPSckLFwxI1wyZGVmaW5lXDMnCithY191Qz0nICcKK2FjX3VEPScsO3QnCisKK2ZvciBhY19maWxlIGluIDogJENPTkZJR19IRUFERVJTOyBkbyB0ZXN0ICJ4JGFjX2ZpbGUiID0geDogJiYgY29udGludWUKKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICRhY19maWxlIGluCisgIC0gfCAqOi0gfCAqOi06KiApICMgaW5wdXQgZnJvbSBzdGRpbgorICAgICAgICBjYXQgPiR0bXAvc3RkaW4KKyAgICAgICAgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKKyAgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLDouKiwsJ2AgOzsKKyAgKjoqICkgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKKyAgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLDouKiwsJ2AgOzsKKyAgKiApICAgYWNfZmlsZV9pbj0kYWNfZmlsZS5pbiA7OworICBlc2FjCisKKyAgdGVzdCB4IiRhY19maWxlIiAhPSB4LSAmJiB7IGVjaG8gIiRhc19tZTo3MjcxOiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQorCisgICMgRmlyc3QgbG9vayBmb3IgdGhlIGlucHV0IGZpbGVzIGluIHRoZSBidWlsZCB0cmVlLCBvdGhlcndpc2UgaW4gdGhlCisgICMgc3JjIHRyZWUuCisgIGFjX2ZpbGVfaW5wdXRzPWBJRlM9OgorICAgIGZvciBmIGluICRhY19maWxlX2luOyBkbworICAgICAgY2FzZSAkZiBpbgorICAgICAgLSkgZWNobyAkdG1wL3N0ZGluIDs7CisgICAgICBbXFwvJF0qKQorICAgICAgICAgIyBBYnNvbHV0ZSAoY2FuJ3QgYmUgRE9TLXN0eWxlLCBhcyBJRlM9OikKKyAgICAgICAgIHRlc3QgLWYgIiRmIiB8fCB7IHsgZWNobyAiJGFzX21lOjcyODI6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgICAgICAgZWNobyAkZjs7CisgICAgICAqKSAjIFJlbGF0aXZlCisgICAgICAgICBpZiB0ZXN0IC1mICIkZiI7IHRoZW4KKyAgICAgICAgICAgIyBCdWlsZCB0cmVlCisgICAgICAgICAgIGVjaG8gJGYKKyAgICAgICAgIGVsaWYgdGVzdCAtZiAiJHNyY2Rpci8kZiI7IHRoZW4KKyAgICAgICAgICAgIyBTb3VyY2UgdHJlZQorICAgICAgICAgICBlY2hvICRzcmNkaXIvJGYKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIyAvZGV2L251bGwgdHJlZQorICAgICAgICAgICB7IHsgZWNobyAiJGFzX21lOjcyOTU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgICAgICAgZmk7OworICAgICAgZXNhYworICAgIGRvbmVgIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorICAjIFJlbW92ZSB0aGUgdHJhaWxpbmcgc3BhY2VzLgorICBzZWQgJ3MvWyAJXSokLy8nICRhY19maWxlX2lucHV0cyA+JHRtcC9pbgorCitFT0YKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIHR3byBzZWQgc2NyaXB0cywgYGNvbmZ0ZXN0LmRlZmluZXMnIGFuZAorIyBgY29uZnRlc3QudW5kZWZzJywgdGhhdCBzdWJzdGl0dXRlcyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvCisjIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBUaGUgZmlyc3QgaGFuZGxlcyBgI2RlZmluZScKKyMgdGVtcGxhdGVzLCBhbmQgdGhlIHNlY29uZCBgI3VuZGVmJyB0ZW1wbGF0ZXMuCisjIEFuZCBmaXJzdDogUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluCisjIGNvbmZpZy5zdGF0dXMuICBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudAorIyBpbiBjb25maWcuc3RhdHVzLgorcm0gLWYgY29uZnRlc3QuZGVmaW5lcyBjb25mdGVzdC51bmRlZnMKKyMgVXNpbmcgYSBoZXJlIGRvY3VtZW50IGluc3RlYWQgb2YgYSBzdHJpbmcgcmVkdWNlcyB0aGUgcXVvdGluZyBuaWdodG1hcmUuCisjIFB1dHRpbmcgY29tbWVudHMgaW4gc2VkIHNjcmlwdHMgaXMgbm90IHBvcnRhYmxlLgorIworIyBgZW5kJyBpcyB1c2VkIHRvIGF2b2lkIHRoYXQgdGhlIHNlY29uZCBtYWluIHNlZCBjb21tYW5kIChtZWFudCBmb3IKKyMgMC1hcnkgQ1BQIG1hY3JvcykgYXBwbGllcyB0byBuLWFyeSBtYWNybyBkZWZpbml0aW9ucy4KKyMgU2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIGZvciBgY2xlYXInLgorY2F0ID5jb25mZGVmMnNlZC5zZWQgPDxcRU9GCitzL1tcXCYsXS9cXCYvZworcyxbXFwkYF0sXFwmLGcKK3QgY2xlYXIKKzogY2xlYXIKK3MsXlsgCV0qI1sgCV0qZGVmaW5lWyAJXVsgCV0qXChcKFteIAkoXVteIAkoXSpcKShbXildKilcKVsgCV0qXCguKlwpJCwke2FjX2RBfVwyJHthY19kQn1cMSR7YWNfZEN9XDMke2FjX2REfSxncAordCBlbmQKK3MsXlsgCV0qI1sgCV0qZGVmaW5lWyAJXVsgCV0qXChbXiAJXVteIAldKlwpWyAJXSpcKC4qXCkkLCR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9LGdwCis6IGVuZAorRU9GCisjIElmIHNvbWUgbWFjcm9zIHdlcmUgY2FsbGVkIHNldmVyYWwgdGltZXMgdGhlcmUgbWlnaHQgYmUgc2V2ZXJhbCB0aW1lcworIyB0aGUgc2FtZSAjZGVmaW5lcywgd2hpY2ggaXMgdXNlbGVzcy4gIE5ldmVydGhlbGVzcywgd2UgbWF5IG5vdCB3YW50IHRvCisjIHNvcnQgdGhlbSwgc2luY2Ugd2Ugd2FudCB0aGUgKmxhc3QqIEFDLURFRklORSB0byBiZSBob25vcmVkLgordW5pcSBjb25mZGVmcy5oIHwgc2VkIC1uIC1mIGNvbmZkZWYyc2VkLnNlZCA+Y29uZnRlc3QuZGVmaW5lcworc2VkICdzL2FjX2QvYWNfdS9nJyBjb25mdGVzdC5kZWZpbmVzID5jb25mdGVzdC51bmRlZnMKK3JtIC1mIGNvbmZkZWYyc2VkLnNlZAorCisjIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCisjIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCisjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KK2NhdCA+PmNvbmZ0ZXN0LnVuZGVmcyA8PFxFT0YKK3MsXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qLC8qICYgKi8sCitFT0YKKworIyBCcmVhayB1cCBjb25mdGVzdC5kZWZpbmVzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uIHRoZSBzaXplCisjIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vICgxMDAgY21kcykuCitlY2hvICcgICMgSGFuZGxlIGFsbCB0aGUgI2RlZmluZSB0ZW1wbGF0ZXMgb25seSBpZiBuZWNlc3NhcnkuJyA+PiRDT05GSUdfU1RBVFVTCitlY2hvICcgIGlmIGVncmVwICJeWyAJXSojWyAJXSpkZWZpbmUiICR0bXAvaW4gPi9kZXYvbnVsbDsgdGhlbicgPj4kQ09ORklHX1NUQVRVUworZWNobyAnICAjIElmIHRoZXJlIGFyZSBubyBkZWZpbmVzLCB3ZSBtYXkgaGF2ZSBhbiBlbXB0eSBpZi9maScgPj4kQ09ORklHX1NUQVRVUworZWNobyAnICA6JyA+PiRDT05GSUdfU1RBVFVTCitybSAtZiBjb25mdGVzdC50YWlsCit3aGlsZSBncmVwIC4gY29uZnRlc3QuZGVmaW5lcyA+L2Rldi9udWxsCitkbworICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gJHRtcC9kZWZpbmVzLnNlZC4KKyAgZWNobyAnICBjYXQgPiR0bXAvZGVmaW5lcy5zZWQgPDxDRU9GJyA+PiRDT05GSUdfU1RBVFVTCisgICMgU3BlZWQgdXA6IGRvbid0IGNvbnNpZGVyIHRoZSBub24gYCNkZWZpbmUnIGxpbmVzLgorICBlY2hvICcvXlsgCV0qI1sgCV0qZGVmaW5lLyFiJyA+PiRDT05GSUdfU1RBVFVTCisgICMgV29yayBhcm91bmQgdGhlIGZvcmdldC10by1yZXNldC10aGUtZmxhZyBidWcuCisgIGVjaG8gJ3QgY2xyJyA+PiRDT05GSUdfU1RBVFVTCisgIGVjaG8gJzogY2xyJyA+PiRDT05GSUdfU1RBVFVTCisgIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QuZGVmaW5lcyA+PiRDT05GSUdfU1RBVFVTCisgIGVjaG8gJ0NFT0YKKyAgc2VkIC1mICR0bXAvZGVmaW5lcy5zZWQgJHRtcC9pbiA+JHRtcC9vdXQKKyAgcm0gLWYgJHRtcC9pbgorICBtdiAkdG1wL291dCAkdG1wL2luCisnID4+JENPTkZJR19TVEFUVVMKKyAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LmRlZmluZXMgPmNvbmZ0ZXN0LnRhaWwKKyAgcm0gLWYgY29uZnRlc3QuZGVmaW5lcworICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LmRlZmluZXMKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0LmRlZmluZXMKK2VjaG8gJyAgZmkgIyBlZ3JlcCcgPj4kQ09ORklHX1NUQVRVUworZWNobyA+PiRDT05GSUdfU1RBVFVTCisKKyMgQnJlYWsgdXAgY29uZnRlc3QudW5kZWZzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uIHRoZSBzaXplCisjIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vICgxMDAgY21kcykuCitlY2hvICcgICMgSGFuZGxlIGFsbCB0aGUgI3VuZGVmIHRlbXBsYXRlcycgPj4kQ09ORklHX1NUQVRVUworcm0gLWYgY29uZnRlc3QudGFpbAord2hpbGUgZ3JlcCAuIGNvbmZ0ZXN0LnVuZGVmcyA+L2Rldi9udWxsCitkbworICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gJHRtcC91bmRlZnMuc2VkLgorICBlY2hvICcgIGNhdCA+JHRtcC91bmRlZnMuc2VkIDw8Q0VPRicgPj4kQ09ORklHX1NUQVRVUworICAjIFNwZWVkIHVwOiBkb24ndCBjb25zaWRlciB0aGUgbm9uIGAjdW5kZWYnCisgIGVjaG8gJy9eWyAJXSojWyAJXSp1bmRlZi8hYicgPj4kQ09ORklHX1NUQVRVUworICAjIFdvcmsgYXJvdW5kIHRoZSBmb3JnZXQtdG8tcmVzZXQtdGhlLWZsYWcgYnVnLgorICBlY2hvICd0IGNscicgPj4kQ09ORklHX1NUQVRVUworICBlY2hvICc6IGNscicgPj4kQ09ORklHX1NUQVRVUworICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnVuZGVmcyA+PiRDT05GSUdfU1RBVFVTCisgIGVjaG8gJ0NFT0YKKyAgc2VkIC1mICR0bXAvdW5kZWZzLnNlZCAkdG1wL2luID4kdG1wL291dAorICBybSAtZiAkdG1wL2luCisgIG12ICR0bXAvb3V0ICR0bXAvaW4KKycgPj4kQ09ORklHX1NUQVRVUworICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudW5kZWZzID5jb25mdGVzdC50YWlsCisgIHJtIC1mIGNvbmZ0ZXN0LnVuZGVmcworICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnVuZGVmcworZG9uZQorcm0gLWYgY29uZnRlc3QudW5kZWZzCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XEVPRgorICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAorICAjIHVzZSAkYXNfbWUpLCBwZW9wbGUgd291bGQgYmUgc3VycHJpc2VkIHRvIHJlYWQ6CisgICMgICAgLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWcuc3RhdHVzLiAgKi8KKyAgaWYgdGVzdCB4IiRhY19maWxlIiA9IHgtOyB0aGVuCisgICAgZWNobyAiLyogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4kdG1wL2NvbmZpZy5oCisgIGVsc2UKKyAgICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+JHRtcC9jb25maWcuaAorICBmaQorICBjYXQgJHRtcC9pbiA+PiR0bXAvY29uZmlnLmgKKyAgcm0gLWYgJHRtcC9pbgorICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisgICAgaWYgY21wIC1zICRhY19maWxlICR0bXAvY29uZmlnLmggMj4vZGV2L251bGw7IHRoZW4KKyAgICAgIHsgZWNobyAiJGFzX21lOjc0MTI6ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY1CitlY2hvICIkYXNfbWU6ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY2O30KKyAgICBlbHNlCisgICAgICBhY19kaXI9YCRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisgICAgICAgICBYIiRhY19maWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAorICAgICAgICAgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKKyAgICAgICAgIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgXAorICAgICAgICAgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgiJGFjX2ZpbGUiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXClbXi9dLioveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAorICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgICAgIHsgY2FzZSAiJGFjX2RpciIgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhc19pbmNyX2Rpcj07OworICAqKSAgICAgICAgICAgICAgICAgICAgICBhc19pbmNyX2Rpcj0uOzsKK2VzYWMKK2FzX2R1bW15PSIkYWNfZGlyIgorZm9yIGFzX21rZGlyX2RpciBpbiBgSUZTPScvXFwnOyBzZXQgWCAkYXNfZHVtbXk7IHNoaWZ0OyBlY2hvICIkQCJgOyBkbworICBjYXNlICRhc19ta2Rpcl9kaXIgaW4KKyAgICAjIFNraXAgRE9TIGRyaXZlc3BlYworICAgID86KSBhc19pbmNyX2Rpcj0kYXNfbWtkaXJfZGlyIDs7CisgICAgKikKKyAgICAgIGFzX2luY3JfZGlyPSRhc19pbmNyX2Rpci8kYXNfbWtkaXJfZGlyCisgICAgICB0ZXN0IC1kICIkYXNfaW5jcl9kaXIiIHx8IG1rZGlyICIkYXNfaW5jcl9kaXIiCisgICAgOzsKKyAgZXNhYworZG9uZTsgfQorCisgICAgICBmaQorICAgICAgcm0gLWYgJGFjX2ZpbGUKKyAgICAgIG12ICR0bXAvY29uZmlnLmggJGFjX2ZpbGUKKyAgICBmaQorICBlbHNlCisgICAgY2F0ICR0bXAvY29uZmlnLmgKKyAgICBybSAtZiAkdG1wL2NvbmZpZy5oCisgIGZpCitkb25lCitFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XEVPRgorCisjCisjIENPTkZJR19DT01NQU5EUyBzZWN0aW9uLgorIworZm9yIGFjX2ZpbGUgaW4gOiAkQ09ORklHX0NPTU1BTkRTOyBkbyB0ZXN0ICJ4JGFjX2ZpbGUiID0geDogJiYgY29udGludWUKKyAgYWNfZGVzdD1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLDouKiwsJ2AKKyAgYWNfc291cmNlPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsW146XSo6LCwnYAorCisgIGNhc2UgJGFjX2Rlc3QgaW4KKyAgICBkZWZhdWx0ICkgY2htb2QgYSt4IFJ1blRlc3QgcGNyZS1jb25maWcgOzsKKyAgZXNhYworZG9uZQorRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XEVPRgorCit7IChleGl0IDApOyBleGl0IDA7IH0KK0VPRgorY2htb2QgK3ggJENPTkZJR19TVEFUVVMKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCisKKyMgY29uZmlndXJlIGlzIHdyaXRpbmcgdG8gY29uZmlnLmxvZywgYW5kIHRoZW4gY2FsbHMgY29uZmlnLnN0YXR1cy4KKyMgY29uZmlnLnN0YXR1cyBkb2VzIGl0cyBvd24gcmVkaXJlY3Rpb24sIGFwcGVuZGluZyB0byBjb25maWcubG9nLgorIyBVbmZvcnR1bmF0ZWx5LCBvbiBET1MgdGhpcyBmYWlscywgYXMgY29uZmlnLmxvZyBpcyBzdGlsbCBrZXB0IG9wZW4KKyMgYnkgY29uZmlndXJlLCBzbyBjb25maWcuc3RhdHVzIHdvbid0IGJlIGFibGUgdG8gd3JpdGUgdG8gaXQ7IGl0cworIyBvdXRwdXQgaXMgc2ltcGx5IGRpc2NhcmRlZC4gIFNvIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwKKyMgZWZmZWN0aXZlbHkgY2xvc2luZyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQKKyMgYXBwZW5kZWQgdG8gYnkgY29uZmlnLnN0YXR1cy4gIFdoZW4gY29taW5nIGJhY2sgdG8gY29uZmlndXJlLCB3ZQorIyBuZWVkIHRvIG1ha2UgdGhlIEZEIGF2YWlsYWJsZSBhZ2Fpbi4KK2lmIHRlc3QgIiRub19jcmVhdGUiICE9IHllczsgdGhlbgorICBhY19jc19zdWNjZXNzPToKKyAgZXhlYyA1Pi9kZXYvbnVsbAorICAkU0hFTEwgJENPTkZJR19TVEFUVVMgfHwgYWNfY3Nfc3VjY2Vzcz1mYWxzZQorICBleGVjIDU+PmNvbmZpZy5sb2cKKyAgIyBVc2UgfHwsIG5vdCAmJiwgdG8gYXZvaWQgZXhpdGluZyBmcm9tIHRoZSBpZiB3aXRoICQ/ID0gMSwgd2hpY2gKKyAgIyB3b3VsZCBtYWtlIGNvbmZpZ3VyZSBmYWlsIGlmIHRoaXMgaXMgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24uCisgICRhY19jc19zdWNjZXNzIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorZmkKKwpkaWZmIC0tZ2l0IGEvc3JjbGliL3BjcmUvZGZ0YWJsZXMuZHNwIGIvc3JjbGliL3BjcmUvZGZ0YWJsZXMuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjk1NWNiLi4wMDAwMDAwCi0tLSBhL3NyY2xpYi9wY3JlL2RmdGFibGVzLmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9ImRmdGFibGVzIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMwotCi1DRkc9ZGZ0YWJsZXMgLSBXaW4zMiBEZWJ1ZwotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJkZnRhYmxlcy5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgImRmdGFibGVzLm1hayIgQ0ZHPSJkZnRhYmxlcyAtIFdpbjMyIERlYnVnIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgImRmdGFibGVzIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uXAotICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFICJkZnRhYmxlcyAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAiZGZ0YWJsZXMgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgImRmdGFibGVzX1IiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL0ZEIC9jCi0jIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9wZGI6bm9uZSAvbWFjaGluZTpJMzg2Ci0KLSFFTFNFSUYgICIkKENGRykiID09ICJkZnRhYmxlcyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICIiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiZGZ0YWJsZXNfRCIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9HWC0gL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvRkQgL2MKLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL3BkYjpub25lIC9kZWJ1ZyAvbWFjaGluZTpJMzg2Ci0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJkZnRhYmxlcyAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgImRmdGFibGVzIC0gV2luMzIgRGVidWciCi0jIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxkZnRhYmxlcy5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2h3IgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxjb25maWcuaHcKLQotIUlGICAiJChDRkcpIiA9PSAiZGZ0YWJsZXMgLSBXaW4zMiBSZWxlYXNlIgotCi0jIEJlZ2luIEN1c3RvbSBCdWlsZAotSW5wdXRQYXRoPS5cY29uZmlnLmh3Ci0KLSIuXGNvbmZpZy5oIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCWVjaG8gQ3JlYXRpbmcgcGNyZSBjb25maWcuaCBmcm9tIGNvbmZpZy5odyAKLQljb3B5IC5cY29uZmlnLmh3IC5cY29uZmlnLmggCi0JCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImRmdGFibGVzIC0gV2luMzIgRGVidWciCi0KLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkCi1JbnB1dFBhdGg9Llxjb25maWcuaHcKLQotIi5cY29uZmlnLmgiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JZWNobyBDcmVhdGluZyBwY3JlIGNvbmZpZy5oIGZyb20gY29uZmlnLmh3IAotCWNvcHkgLlxjb25maWcuaHcgLlxjb25maWcuaCAKLQkKLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGludGVybmFsLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHBjcmUuaHcKLQotIUlGICAiJChDRkcpIiA9PSAiZGZ0YWJsZXMgLSBXaW4zMiBSZWxlYXNlIgotCi0jIEJlZ2luIEN1c3RvbSBCdWlsZAotSW5wdXRQYXRoPS5ccGNyZS5odwotCi0iLlxwY3JlLmgiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JZWNobyBDcmVhdGluZyBwY3JlLmggZnJvbSBwY3JlLmh3IAotCWNvcHkgLlxwY3JlLmh3IC5ccGNyZS5oIAotCQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJkZnRhYmxlcyAtIFdpbjMyIERlYnVnIgotCi0jIEJlZ2luIEN1c3RvbSBCdWlsZAotSW5wdXRQYXRoPS5ccGNyZS5odwotCi0iLlxwY3JlLmgiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JZWNobyBDcmVhdGluZyBwY3JlLmggZnJvbSBwY3JlLmh3IAotCWNvcHkgLlxwY3JlLmh3IC5ccGNyZS5oIAotCQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL3NyY2xpYi9wY3JlL2RvYy9wZ3JlcC4xIGIvc3JjbGliL3BjcmUvZG9jL3BncmVwLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZTliNTcuLjAwMDAwMDAKLS0tIGEvc3JjbGliL3BjcmUvZG9jL3BncmVwLjEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0uVEggUEdSRVAgMQotLlNIIE5BTUUKLXBncmVwIC0gYSBncmVwIHdpdGggUGVybC1jb21wYXRpYmxlIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCi0uU0ggU1lOT1BTSVMKLS5CIHBncmVwIFstVmNoaWxuc3Z4XSBwYXR0ZXJuIFtmaWxlXSAuLi4KLQotCi0uU0ggREVTQ1JJUFRJT04KLVxmQnBncmVwXGZSIHNlYXJjaGVzIGZpbGVzIGZvciBjaGFyYWN0ZXIgcGF0dGVybnMsIGluIHRoZSBzYW1lIHdheSBhcyBvdGhlcgotZ3JlcCBjb21tYW5kcyBkbywgYnV0IGl0IHVzZXMgdGhlIFBDUkUgcmVndWxhciBleHByZXNzaW9uIGxpYnJhcnkgdG8gc3VwcG9ydAotcGF0dGVybnMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZSByZWd1bGFyIGV4cHJlc3Npb25zIG9mIFBlcmwgNS4gU2VlCi1cZkJwY3JlKDMpXGZSIGZvciBhIGZ1bGwgZGVzY3JpcHRpb24gb2Ygc3ludGF4IGFuZCBzZW1hbnRpY3MuCi0KLUlmIG5vIGZpbGVzIGFyZSBzcGVjaWZpZWQsIFxmQnBncmVwXGZSIHJlYWRzIHRoZSBzdGFuZGFyZCBpbnB1dC4gQnkgZGVmYXVsdCwKLWVhY2ggbGluZSB0aGF0IG1hdGNoZXMgdGhlIHBhdHRlcm4gaXMgY29waWVkIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQsIGFuZCBpZgotdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBmaWxlLCB0aGUgZmlsZSBuYW1lIGlzIHByaW50ZWQgYmVmb3JlIGVhY2ggbGluZSBvZgotb3V0cHV0LiBIb3dldmVyLCB0aGVyZSBhcmUgb3B0aW9ucyB0aGF0IGNhbiBjaGFuZ2UgaG93IFxmQnBncmVwXGZSIGJlaGF2ZXMuCi0KLUxpbmVzIGFyZSBsaW1pdGVkIHRvIEJVRlNJWiBjaGFyYWN0ZXJzLiBCVUZTSVogaXMgZGVmaW5lZCBpbiBcZkI8c3RkaW8uaD5cZlIuCi1UaGUgbmV3bGluZSBjaGFyYWN0ZXIgaXMgcmVtb3ZlZCBmcm9tIHRoZSBlbmQgb2YgZWFjaCBsaW5lIGJlZm9yZSBpdCBpcyBtYXRjaGVkCi1hZ2FpbnN0IHRoZSBwYXR0ZXJuLgotCi0KLS5TSCBPUFRJT05TCi0uVFAgMTAKLVxmQi1WXGZSCi1Xcml0ZSB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIFBDUkUgbGlicmFyeSBiZWluZyB1c2VkIHRvIHRoZSBzdGFuZGFyZCBlcnJvcgotc3RyZWFtLgotLlRQCi1cZkItY1xmUgotRG8gbm90IHByaW50IGluZGl2aWR1YWwgbGluZXM7IGluc3RlYWQganVzdCBwcmludCBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YKLWxpbmVzIHRoYXQgd291bGQgb3RoZXJ3aXNlIGhhdmUgYmVlbiBwcmludGVkLiBJZiBzZXZlcmFsIGZpbGVzIGFyZSBnaXZlbiwgYQotY291bnQgaXMgcHJpbnRlZCBmb3IgZWFjaCBvZiB0aGVtLgotLlRQCi1cZkItaFxmUgotU3VwcHJlc3MgcHJpbnRpbmcgb2YgZmlsZW5hbWVzIHdoZW4gc2VhcmNoaW5nIG11bHRpcGxlIGZpbGVzLgotLlRQCi1cZkItaVxmUgotSWdub3JlIHVwcGVyL2xvd2VyIGNhc2UgZGlzdGluY3Rpb25zIGR1cmluZyBjb21wYXJpc29ucy4KLS5UUAotXGZCLWxcZlIKLUluc3RlYWQgb2YgcHJpbnRpbmcgbGluZXMgZnJvbSB0aGUgZmlsZXMsIGp1c3QgcHJpbnQgdGhlIG5hbWVzIG9mIHRoZSBmaWxlcwotY29udGFpbmluZyBsaW5lcyB0aGF0IHdvdWxkIGhhdmUgYmVlbiBwcmludGVkLiBFYWNoIGZpbGUgbmFtZSBpcyBwcmludGVkCi1vbmNlLCBvbiBhIHNlcGFyYXRlIGxpbmUuCi0uVFAKLVxmQi1uXGZSCi1QcmVjZWRlIGVhY2ggbGluZSBieSBpdHMgbGluZSBudW1iZXIgaW4gdGhlIGZpbGUuCi0uVFAKLVxmQi1zXGZSCi1Xb3JrIHNpbGVudGx5LCB0aGF0IGlzLCBkaXNwbGF5IG5vdGhpbmcgZXhjZXB0IGVycm9yIG1lc3NhZ2VzLgotVGhlIGV4aXQgc3RhdHVzIGluZGljYXRlcyB3aGV0aGVyIGFueSBtYXRjaGVzIHdlcmUgZm91bmQuCi0uVFAKLVxmQi12XGZSCi1JbnZlcnQgdGhlIHNlbnNlIG9mIHRoZSBtYXRjaCwgc28gdGhhdCBsaW5lcyB3aGljaCBkbyBcZklub3RcZlIgbWF0Y2ggdGhlCi1wYXR0ZXJuIGFyZSBub3cgdGhlIG9uZXMgdGhhdCBhcmUgZm91bmQuCi0uVFAKLVxmQi14XGZSCi1Gb3JjZSB0aGUgcGF0dGVybiB0byBiZSBhbmNob3JlZCAoaXQgbXVzdCBzdGFydCBtYXRjaGluZyBhdCB0aGUgYmVnaW5uaW5nIG9mCi10aGUgbGluZSkgYW5kIGluIGFkZGl0aW9uLCByZXF1aXJlIGl0IHRvIG1hdGNoIHRoZSBlbnRpcmUgbGluZS4gVGhpcyBpcwotZXF1aXZhbGVudCB0byBoYXZpbmcgXiBhbmQgJCBjaGFyYWN0ZXJzIGF0IHRoZSBzdGFydCBhbmQgZW5kIG9mIGVhY2gKLWFsdGVybmF0aXZlIGJyYW5jaCBpbiB0aGUgcmVndWxhciBleHByZXNzaW9uLgotCi0KLS5TSCBTRUUgQUxTTwotXGZCcGNyZSgzKVxmUiwgUGVybCA1IGRvY3VtZW50YXRpb24KLQotCi0uU0ggRElBR05PU1RJQ1MKLUV4aXQgc3RhdHVzIGlzIDAgaWYgYW55IG1hdGNoZXMgd2VyZSBmb3VuZCwgMSBpZiBubyBtYXRjaGVzIHdlcmUgZm91bmQsIGFuZCAyCi1mb3Igc3ludGF4IGVycm9ycyBvciBpbmFjZXNzaWJsZSBmaWxlcyAoZXZlbiBpZiBtYXRjaGVzIHdlcmUgZm91bmQpLgotCi0KLS5TSCBBVVRIT1IKLVBoaWxpcCBIYXplbCA8cGgxMEBjYW0uYWMudWs+Ci0uYnIKLUNvcHlyaWdodCAoYykgMTk5Ny0xOTk5IFVuaXZlcnNpdHkgb2YgQ2FtYnJpZGdlLgpkaWZmIC0tZ2l0IGEvc3JjbGliL3BjcmUvZG9jL3BncmVwLmh0bWwgYi9zcmNsaWIvcGNyZS9kb2MvcGdyZXAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRlZmVkNi4uMDAwMDAwMAotLS0gYS9zcmNsaWIvcGNyZS9kb2MvcGdyZXAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08SFRNTD4KLTxIRUFEPgotPFRJVExFPnBncmVwIHNwZWNpZmljYXRpb248L1RJVExFPgotPC9IRUFEPgotPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdGV4dD0iIzAwMDA1QSI+Ci08SDE+cGdyZXAgc3BlY2lmaWNhdGlvbjwvSDE+Ci1UaGlzIEhUTUwgZG9jdW1lbnQgaGFzIGJlZW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgb3JpZ2luYWwgbWFuIHBhZ2UuCi1JZiB0aGVyZSBpcyBhbnkgbm9uc2Vuc2UgaW4gaXQsIHBsZWFzZSBjb25zdWx0IHRoZSBtYW4gcGFnZSBpbiBjYXNlIHRoZQotY29udmVyc2lvbiB3ZW50IHdyb25nLgotPFVMPgotPExJPjxBIE5BTUU9IlRPQzEiIEhSRUY9IiNTRUMxIj5OQU1FPC9BPgotPExJPjxBIE5BTUU9IlRPQzIiIEhSRUY9IiNTRUMyIj5TWU5PUFNJUzwvQT4KLTxMST48QSBOQU1FPSJUT0MzIiBIUkVGPSIjU0VDMyI+REVTQ1JJUFRJT048L0E+Ci08TEk+PEEgTkFNRT0iVE9DNCIgSFJFRj0iI1NFQzQiPk9QVElPTlM8L0E+Ci08TEk+PEEgTkFNRT0iVE9DNSIgSFJFRj0iI1NFQzUiPlNFRSBBTFNPPC9BPgotPExJPjxBIE5BTUU9IlRPQzYiIEhSRUY9IiNTRUM2Ij5ESUFHTk9TVElDUzwvQT4KLTxMST48QSBOQU1FPSJUT0M3IiBIUkVGPSIjU0VDNyI+QVVUSE9SPC9BPgotPC9VTD4KLTxMST48QSBOQU1FPSJTRUMxIiBIUkVGPSIjVE9DMSI+TkFNRTwvQT4KLTxQPgotcGdyZXAgLSBhIGdyZXAgd2l0aCBQZXJsLWNvbXBhdGlibGUgcmVndWxhciBleHByZXNzaW9ucy4KLTwvUD4KLTxMST48QSBOQU1FPSJTRUMyIiBIUkVGPSIjVE9DMSI+U1lOT1BTSVM8L0E+Ci08UD4KLTxCPnBncmVwIFstVmNoaWxuc3Z4XSBwYXR0ZXJuIFtmaWxlXSAuLi48L0I+Ci08L1A+Ci08TEk+PEEgTkFNRT0iU0VDMyIgSFJFRj0iI1RPQzEiPkRFU0NSSVBUSU9OPC9BPgotPFA+Ci08Qj5wZ3JlcDwvQj4gc2VhcmNoZXMgZmlsZXMgZm9yIGNoYXJhY3RlciBwYXR0ZXJucywgaW4gdGhlIHNhbWUgd2F5IGFzIG90aGVyCi1ncmVwIGNvbW1hbmRzIGRvLCBidXQgaXQgdXNlcyB0aGUgUENSRSByZWd1bGFyIGV4cHJlc3Npb24gbGlicmFyeSB0byBzdXBwb3J0Ci1wYXR0ZXJucyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgb2YgUGVybCA1LiBTZWUKLTxCPnBjcmUoMyk8L0I+IGZvciBhIGZ1bGwgZGVzY3JpcHRpb24gb2Ygc3ludGF4IGFuZCBzZW1hbnRpY3MuCi08L1A+Ci08UD4KLUlmIG5vIGZpbGVzIGFyZSBzcGVjaWZpZWQsIDxCPnBncmVwPC9CPiByZWFkcyB0aGUgc3RhbmRhcmQgaW5wdXQuIEJ5IGRlZmF1bHQsCi1lYWNoIGxpbmUgdGhhdCBtYXRjaGVzIHRoZSBwYXR0ZXJuIGlzIGNvcGllZCB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LCBhbmQgaWYKLXRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZmlsZSwgdGhlIGZpbGUgbmFtZSBpcyBwcmludGVkIGJlZm9yZSBlYWNoIGxpbmUgb2YKLW91dHB1dC4gSG93ZXZlciwgdGhlcmUgYXJlIG9wdGlvbnMgdGhhdCBjYW4gY2hhbmdlIGhvdyA8Qj5wZ3JlcDwvQj4gYmVoYXZlcy4KLTwvUD4KLTxQPgotTGluZXMgYXJlIGxpbWl0ZWQgdG8gQlVGU0laIGNoYXJhY3RlcnMuIEJVRlNJWiBpcyBkZWZpbmVkIGluIDxCPiYjNjA7c3RkaW8uaCYjNjI7PC9CPi4KLVRoZSBuZXdsaW5lIGNoYXJhY3RlciBpcyByZW1vdmVkIGZyb20gdGhlIGVuZCBvZiBlYWNoIGxpbmUgYmVmb3JlIGl0IGlzIG1hdGNoZWQKLWFnYWluc3QgdGhlIHBhdHRlcm4uCi08L1A+Ci08TEk+PEEgTkFNRT0iU0VDNCIgSFJFRj0iI1RPQzEiPk9QVElPTlM8L0E+Ci08UD4KLTxCPi1WPC9CPgotV3JpdGUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBQQ1JFIGxpYnJhcnkgYmVpbmcgdXNlZCB0byB0aGUgc3RhbmRhcmQgZXJyb3IKLXN0cmVhbS4KLTwvUD4KLTxQPgotPEI+LWM8L0I+Ci1EbyBub3QgcHJpbnQgaW5kaXZpZHVhbCBsaW5lczsgaW5zdGVhZCBqdXN0IHByaW50IGEgY291bnQgb2YgdGhlIG51bWJlciBvZgotbGluZXMgdGhhdCB3b3VsZCBvdGhlcndpc2UgaGF2ZSBiZWVuIHByaW50ZWQuIElmIHNldmVyYWwgZmlsZXMgYXJlIGdpdmVuLCBhCi1jb3VudCBpcyBwcmludGVkIGZvciBlYWNoIG9mIHRoZW0uCi08L1A+Ci08UD4KLTxCPi1oPC9CPgotU3VwcHJlc3MgcHJpbnRpbmcgb2YgZmlsZW5hbWVzIHdoZW4gc2VhcmNoaW5nIG11bHRpcGxlIGZpbGVzLgotPC9QPgotPFA+Ci08Qj4taTwvQj4KLUlnbm9yZSB1cHBlci9sb3dlciBjYXNlIGRpc3RpbmN0aW9ucyBkdXJpbmcgY29tcGFyaXNvbnMuCi08L1A+Ci08UD4KLTxCPi1sPC9CPgotSW5zdGVhZCBvZiBwcmludGluZyBsaW5lcyBmcm9tIHRoZSBmaWxlcywganVzdCBwcmludCB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzCi1jb250YWluaW5nIGxpbmVzIHRoYXQgd291bGQgaGF2ZSBiZWVuIHByaW50ZWQuIEVhY2ggZmlsZSBuYW1lIGlzIHByaW50ZWQKLW9uY2UsIG9uIGEgc2VwYXJhdGUgbGluZS4KLTwvUD4KLTxQPgotPEI+LW48L0I+Ci1QcmVjZWRlIGVhY2ggbGluZSBieSBpdHMgbGluZSBudW1iZXIgaW4gdGhlIGZpbGUuCi08L1A+Ci08UD4KLTxCPi1zPC9CPgotV29yayBzaWxlbnRseSwgdGhhdCBpcywgZGlzcGxheSBub3RoaW5nIGV4Y2VwdCBlcnJvciBtZXNzYWdlcy4KLVRoZSBleGl0IHN0YXR1cyBpbmRpY2F0ZXMgd2hldGhlciBhbnkgbWF0Y2hlcyB3ZXJlIGZvdW5kLgotPC9QPgotPFA+Ci08Qj4tdjwvQj4KLUludmVydCB0aGUgc2Vuc2Ugb2YgdGhlIG1hdGNoLCBzbyB0aGF0IGxpbmVzIHdoaWNoIGRvIDxJPm5vdDwvST4gbWF0Y2ggdGhlCi1wYXR0ZXJuIGFyZSBub3cgdGhlIG9uZXMgdGhhdCBhcmUgZm91bmQuCi08L1A+Ci08UD4KLTxCPi14PC9CPgotRm9yY2UgdGhlIHBhdHRlcm4gdG8gYmUgYW5jaG9yZWQgKGl0IG11c3Qgc3RhcnQgbWF0Y2hpbmcgYXQgdGhlIGJlZ2lubmluZyBvZgotdGhlIGxpbmUpIGFuZCBpbiBhZGRpdGlvbiwgcmVxdWlyZSBpdCB0byBtYXRjaCB0aGUgZW50aXJlIGxpbmUuIFRoaXMgaXMKLWVxdWl2YWxlbnQgdG8gaGF2aW5nIF4gYW5kICQgY2hhcmFjdGVycyBhdCB0aGUgc3RhcnQgYW5kIGVuZCBvZiBlYWNoCi1hbHRlcm5hdGl2ZSBicmFuY2ggaW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KLTwvUD4KLTxMST48QSBOQU1FPSJTRUM1IiBIUkVGPSIjVE9DMSI+U0VFIEFMU088L0E+Ci08UD4KLTxCPnBjcmUoMyk8L0I+LCBQZXJsIDUgZG9jdW1lbnRhdGlvbgotPC9QPgotPExJPjxBIE5BTUU9IlNFQzYiIEhSRUY9IiNUT0MxIj5ESUFHTk9TVElDUzwvQT4KLTxQPgotRXhpdCBzdGF0dXMgaXMgMCBpZiBhbnkgbWF0Y2hlcyB3ZXJlIGZvdW5kLCAxIGlmIG5vIG1hdGNoZXMgd2VyZSBmb3VuZCwgYW5kIDIKLWZvciBzeW50YXggZXJyb3JzIG9yIGluYWNlc3NpYmxlIGZpbGVzIChldmVuIGlmIG1hdGNoZXMgd2VyZSBmb3VuZCkuCi08L1A+Ci08TEk+PEEgTkFNRT0iU0VDNyIgSFJFRj0iI1RPQzEiPkFVVEhPUjwvQT4KLTxQPgotUGhpbGlwIEhhemVsICYjNjA7cGgxMEBjYW0uYWMudWsmIzYyOwotPEJSPgotQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkgVW5pdmVyc2l0eSBvZiBDYW1icmlkZ2UuCmRpZmYgLS1naXQgYS9zcmNsaWIvcGNyZS9kb2MvcGdyZXAudHh0IGIvc3JjbGliL3BjcmUvZG9jL3BncmVwLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNkMDhjMC4uMDAwMDAwMAotLS0gYS9zcmNsaWIvcGNyZS9kb2MvcGdyZXAudHh0CisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotTkFNRQotICAgICBwZ3JlcCAtIGEgZ3JlcCB3aXRoIFBlcmwtY29tcGF0aWJsZSByZWd1bGFyIGV4cHJlc3Npb25zLgotCi0KLQotU1lOT1BTSVMKLSAgICAgcGdyZXAgWy1WY2hpbG5zdnhdIHBhdHRlcm4gW2ZpbGVdIC4uLgotCi0KLQotREVTQ1JJUFRJT04KLSAgICAgcGdyZXAgc2VhcmNoZXMgZmlsZXMgZm9yIGNoYXJhY3RlciBwYXR0ZXJucywgaW4gdGhlIHNhbWUgd2F5Ci0gICAgIGFzICBvdGhlciAgZ3JlcCAgY29tbWFuZHMgIGRvLCAgYnV0IGl0IHVzZXMgdGhlIFBDUkUgcmVndWxhcgotICAgICBleHByZXNzaW9uIGxpYnJhcnkgdG8gc3VwcG9ydCBwYXR0ZXJucyB0aGF0ICBhcmUgIGNvbXBhdGlibGUKLSAgICAgd2l0aCAgdGhlICByZWd1bGFyICBleHByZXNzaW9ucyBvZiBQZXJsIDUuIFNlZSBwY3JlKDMpIGZvciBhCi0gICAgIGZ1bGwgZGVzY3JpcHRpb24gb2Ygc3ludGF4IGFuZCBzZW1hbnRpY3MuCi0KLSAgICAgSWYgbm8gZmlsZXMgYXJlIHNwZWNpZmllZCwgcGdyZXAgcmVhZHMgdGhlICBzdGFuZGFyZCAgaW5wdXQuCi0gICAgIEJ5ICBkZWZhdWx0LCBlYWNoIGxpbmUgdGhhdCBtYXRjaGVzIHRoZSBwYXR0ZXJuIGlzIGNvcGllZCB0bwotICAgICB0aGUgc3RhbmRhcmQgb3V0cHV0LCBhbmQgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBmaWxlLCB0aGUKLSAgICAgZmlsZSAgbmFtZSAgaXMgIHByaW50ZWQgYmVmb3JlIGVhY2ggbGluZSBvZiBvdXRwdXQuIEhvd2V2ZXIsCi0gICAgIHRoZXJlIGFyZSBvcHRpb25zIHRoYXQgY2FuIGNoYW5nZSBob3cgcGdyZXAgYmVoYXZlcy4KLQotICAgICBMaW5lcyBhcmUgbGltaXRlZCB0byBCVUZTSVogY2hhcmFjdGVycy4gQlVGU0laIGlzIGRlZmluZWQgaW4KLSAgICAgPHN0ZGlvLmg+LiAgVGhlIG5ld2xpbmUgY2hhcmFjdGVyIGlzIHJlbW92ZWQgZnJvbSB0aGUgZW5kIG9mCi0gICAgIGVhY2ggbGluZSBiZWZvcmUgaXQgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBwYXR0ZXJuLgotCi0KLQotT1BUSU9OUwotICAgICAtViAgICAgICAgV3JpdGUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBQQ1JFIGxpYnJhcnkgYmVpbmcKLSAgICAgICAgICAgICAgIHVzZWQgdG8gdGhlIHN0YW5kYXJkIGVycm9yIHN0cmVhbS4KLQotICAgICAtYyAgICAgICAgRG8gbm90IHByaW50IGluZGl2aWR1YWwgbGluZXM7IGluc3RlYWQganVzdCAgcHJpbnQKLSAgICAgICAgICAgICAgIGEgIGNvdW50ICBvZiB0aGUgbnVtYmVyIG9mIGxpbmVzIHRoYXQgd291bGQgb3RoZXItCi0gICAgICAgICAgICAgICB3aXNlIGhhdmUgIGJlZW4gIHByaW50ZWQuICBJZiAgc2V2ZXJhbCAgZmlsZXMgIGFyZQotICAgICAgICAgICAgICAgZ2l2ZW4sIGEgY291bnQgaXMgcHJpbnRlZCBmb3IgZWFjaCBvZiB0aGVtLgotCi0gICAgIC1oICAgICAgICBTdXBwcmVzcyBwcmludGluZyBvZiBmaWxlbmFtZXMgd2hlbiBzZWFyY2hpbmcgbXVsLQotICAgICAgICAgICAgICAgdGlwbGUgZmlsZXMuCi0KLSAgICAgLWkgICAgICAgIElnbm9yZSB1cHBlci9sb3dlciBjYXNlIGRpc3RpbmN0aW9ucyAgZHVyaW5nICBjb20tCi0gICAgICAgICAgICAgICBwYXJpc29ucy4KLQotICAgICAtbCAgICAgICAgSW5zdGVhZCBvZiBwcmludGluZyBsaW5lcyAgZnJvbSAgdGhlICBmaWxlcywgIGp1c3QKLSAgICAgICAgICAgICAgIHByaW50IHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgY29udGFpbmluZyBsaW5lcyB0aGF0Ci0gICAgICAgICAgICAgICB3b3VsZCBoYXZlIGJlZW4gcHJpbnRlZC4gRWFjaCBmaWxlIG5hbWUgaXMgcHJpbnRlZAotICAgICAgICAgICAgICAgb25jZSwgb24gYSBzZXBhcmF0ZSBsaW5lLgotCi0gICAgIC1uICAgICAgICBQcmVjZWRlIGVhY2ggbGluZSBieSBpdHMgbGluZSBudW1iZXIgaW4gdGhlIGZpbGUuCi0KLSAgICAgLXMgICAgICAgIFdvcmsgc2lsZW50bHksIHRoYXQgIGlzLCAgZGlzcGxheSAgbm90aGluZyAgZXhjZXB0Ci0gICAgICAgICAgICAgICBlcnJvciBtZXNzYWdlcy4gIFRoZSBleGl0IHN0YXR1cyBpbmRpY2F0ZXMgd2hldGhlcgotICAgICAgICAgICAgICAgYW55IG1hdGNoZXMgd2VyZSBmb3VuZC4KLQotICAgICAtdiAgICAgICAgSW52ZXJ0IHRoZSBzZW5zZSBvZiB0aGUgbWF0Y2gsIHNvIHRoYXQgbGluZXMgd2hpY2gKLSAgICAgICAgICAgICAgIGRvIG5vdCBtYXRjaCB0aGUgcGF0dGVybiBhcmUgbm93IHRoZSBvbmVzIHRoYXQgYXJlCi0gICAgICAgICAgICAgICBmb3VuZC4KLQotICAgICAteCAgICAgICAgRm9yY2UgdGhlIHBhdHRlcm4gdG8gYmUgYW5jaG9yZWQgIChpdCAgbXVzdCAgc3RhcnQKLSAgICAgICAgICAgICAgIG1hdGNoaW5nICBhdCAgdGhlICBiZWdpbm5pbmcgIG9mICB0aGUgbGluZSkgYW5kIGluCi0gICAgICAgICAgICAgICBhZGRpdGlvbiwgcmVxdWlyZSBpdCB0byAgbWF0Y2ggIHRoZSAgZW50aXJlICBsaW5lLgotICAgICAgICAgICAgICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGhhdmluZyBeIGFuZCAkIGNoYXJhY3RlcnMgYXQKLSAgICAgICAgICAgICAgIHRoZSBzdGFydCBhbmQgZW5kIG9mIGVhY2ggIGFsdGVybmF0aXZlICBicmFuY2ggIGluCi0gICAgICAgICAgICAgICB0aGUgcmVndWxhciBleHByZXNzaW9uLgotCi0KLQotU0VFIEFMU08KLSAgICAgcGNyZSgzKSwgUGVybCA1IGRvY3VtZW50YXRpb24KLQotCi0KLQotCi1ESUFHTk9TVElDUwotICAgICBFeGl0IHN0YXR1cyBpcyAwIGlmIGFueSBtYXRjaGVzIHdlcmUgZm91bmQsIDEgaWYgbm8gIG1hdGNoZXMKLSAgICAgd2VyZSAgZm91bmQsICBhbmQgIDIgIGZvciBzeW50YXggZXJyb3JzIG9yIGluYWNlc3NpYmxlIGZpbGVzCi0gICAgIChldmVuIGlmIG1hdGNoZXMgd2VyZSBmb3VuZCkuCi0KLQotCi1BVVRIT1IKLSAgICAgUGhpbGlwIEhhemVsIDxwaDEwQGNhbS5hYy51az4KLSAgICAgQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkgVW5pdmVyc2l0eSBvZiBDYW1icmlkZ2UuCi0KZGlmZiAtLWdpdCBhL3NyY2xpYi9wY3JlL2luc3RhbGwtc2ggYi9zcmNsaWIvcGNyZS9pbnN0YWxsLXNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU5ZGUyMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmNsaWIvcGNyZS9pbnN0YWxsLXNoCkBAIC0wLDAgKzEsMjUxIEBACisjIS9iaW4vc2gKKyMKKyMgaW5zdGFsbCAtIGluc3RhbGwgYSBwcm9ncmFtLCBzY3JpcHQsIG9yIGRhdGFmaWxlCisjIFRoaXMgY29tZXMgZnJvbSBYMTFSNSAobWl0L3V0aWwvc2NyaXB0cy9pbnN0YWxsLnNoKS4KKyMKKyMgQ29weXJpZ2h0IDE5OTEgYnkgdGhlIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyMKKyMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisjIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisjIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisjIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIE0uSS5ULiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgorIyBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisjIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE0uSS5ULiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlCisjIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIgorIyB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyMKKyMgQ2FsbGluZyB0aGlzIHNjcmlwdCBpbnN0YWxsLXNoIGlzIHByZWZlcnJlZCBvdmVyIGluc3RhbGwuc2gsIHRvIHByZXZlbnQKKyMgYG1ha2UnIGltcGxpY2l0IHJ1bGVzIGZyb20gY3JlYXRpbmcgYSBmaWxlIGNhbGxlZCBpbnN0YWxsIGZyb20gaXQKKyMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KKyMKKyMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgorIyBmcm9tIHNjcmF0Y2guICBJdCBjYW4gb25seSBpbnN0YWxsIG9uZSBmaWxlIGF0IGEgdGltZSwgYSByZXN0cmljdGlvbgorIyBzaGFyZWQgd2l0aCBtYW55IE9TJ3MgaW5zdGFsbCBwcm9ncmFtcy4KKworCisjIHNldCBET0lUUFJPRyB0byBlY2hvIHRvIHRlc3QgdGhpcyBzY3JpcHQKKworIyBEb24ndCB1c2UgOi0gc2luY2UgNC4zQlNEIGFuZCBlYXJsaWVyIHNoZWxscyBkb24ndCBsaWtlIGl0LgorZG9pdD0iJHtET0lUUFJPRy19IgorCisKKyMgcHV0IGluIGFic29sdXRlIHBhdGhzIGlmIHlvdSBkb24ndCBoYXZlIHRoZW0gaW4geW91ciBwYXRoOyBvciB1c2UgZW52LiB2YXJzLgorCittdnByb2c9IiR7TVZQUk9HLW12fSIKK2NwcHJvZz0iJHtDUFBST0ctY3B9IgorY2htb2Rwcm9nPSIke0NITU9EUFJPRy1jaG1vZH0iCitjaG93bnByb2c9IiR7Q0hPV05QUk9HLWNob3dufSIKK2NoZ3JwcHJvZz0iJHtDSEdSUFBST0ctY2hncnB9Igorc3RyaXBwcm9nPSIke1NUUklQUFJPRy1zdHJpcH0iCitybXByb2c9IiR7Uk1QUk9HLXJtfSIKK21rZGlycHJvZz0iJHtNS0RJUlBST0ctbWtkaXJ9IgorCit0cmFuc2Zvcm1iYXNlbmFtZT0iIgordHJhbnNmb3JtX2FyZz0iIgoraW5zdGNtZD0iJG12cHJvZyIKK2NobW9kY21kPSIkY2htb2Rwcm9nIDA3NTUiCitjaG93bmNtZD0iIgorY2hncnBjbWQ9IiIKK3N0cmlwY21kPSIiCitybWNtZD0iJHJtcHJvZyAtZiIKK212Y21kPSIkbXZwcm9nIgorc3JjPSIiCitkc3Q9IiIKK2Rpcl9hcmc9IiIKKword2hpbGUgWyB4IiQxIiAhPSB4IF07IGRvCisgICAgY2FzZSAkMSBpbgorCS1jKSBpbnN0Y21kPSIkY3Bwcm9nIgorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktZCkgZGlyX2FyZz10cnVlCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1tKSBjaG1vZGNtZD0iJGNobW9kcHJvZyAkMiIKKwkgICAgc2hpZnQKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLW8pIGNob3duY21kPSIkY2hvd25wcm9nICQyIgorCSAgICBzaGlmdAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCisJICAgIHNoaWZ0CisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1zKSBzdHJpcGNtZD0iJHN0cmlwcHJvZyIKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLXQ9KikgdHJhbnNmb3JtYXJnPWBlY2hvICQxIHwgc2VkICdzLy10PS8vJ2AKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLWI9KikgdHJhbnNmb3JtYmFzZW5hbWU9YGVjaG8gJDEgfCBzZWQgJ3MvLWI9Ly8nYAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwkqKSAgaWYgWyB4IiRzcmMiID0geCBdCisJICAgIHRoZW4KKwkJc3JjPSQxCisJICAgIGVsc2UKKwkJIyB0aGlzIGNvbG9uIGlzIHRvIHdvcmsgYXJvdW5kIGEgMzg2QlNEIC9iaW4vc2ggYnVnCisJCToKKwkJZHN0PSQxCisJICAgIGZpCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKyAgICBlc2FjCitkb25lCisKK2lmIFsgeCIkc3JjIiA9IHggXQordGhlbgorCWVjaG8gImluc3RhbGw6CW5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIgorCWV4aXQgMQorZWxzZQorCXRydWUKK2ZpCisKK2lmIFsgeCIkZGlyX2FyZyIgIT0geCBdOyB0aGVuCisJZHN0PSRzcmMKKwlzcmM9IiIKKwkKKwlpZiBbIC1kICRkc3QgXTsgdGhlbgorCQlpbnN0Y21kPToKKwkJY2htb2RjbWQ9IiIKKwllbHNlCisJCWluc3RjbWQ9bWtkaXIKKwlmaQorZWxzZQorCisjIFdhaXRpbmcgZm9yIHRoaXMgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlICIkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQKKyMgbWlnaHQgY2F1c2UgZGlyZWN0b3JpZXMgdG8gYmUgY3JlYXRlZCwgd2hpY2ggd291bGQgYmUgZXNwZWNpYWxseSBiYWQgCisjIGlmICRzcmMgKGFuZCB0aHVzICRkc3R0bXApIGNvbnRhaW5zICcqJy4KKworCWlmIFsgLWYgJHNyYyAtbyAtZCAkc3JjIF0KKwl0aGVuCisJCXRydWUKKwllbHNlCisJCWVjaG8gImluc3RhbGw6ICAkc3JjIGRvZXMgbm90IGV4aXN0IgorCQlleGl0IDEKKwlmaQorCQorCWlmIFsgeCIkZHN0IiA9IHggXQorCXRoZW4KKwkJZWNobyAiaW5zdGFsbDoJbm8gZGVzdGluYXRpb24gc3BlY2lmaWVkIgorCQlleGl0IDEKKwllbHNlCisJCXRydWUKKwlmaQorCisjIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyBpZiB5b3VyIHN5c3RlbQorIyBkb2VzIG5vdCBsaWtlIGRvdWJsZSBzbGFzaGVzIGluIGZpbGVuYW1lcywgeW91IG1heSBuZWVkIHRvIGFkZCBzb21lIGxvZ2ljCisKKwlpZiBbIC1kICRkc3QgXQorCXRoZW4KKwkJZHN0PSIkZHN0Ii9gYmFzZW5hbWUgJHNyY2AKKwllbHNlCisJCXRydWUKKwlmaQorZmkKKworIyMgdGhpcyBzZWQgY29tbWFuZCBlbXVsYXRlcyB0aGUgZGlybmFtZSBjb21tYW5kCitkc3RkaXI9YGVjaG8gJGRzdCB8IHNlZCAtZSAncyxbXi9dKiQsLDtzLC8kLCw7cyxeJCwuLCdgCisKKyMgTWFrZSBzdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHMuCisjICB0aGlzIHBhcnQgaXMgdGFrZW4gZnJvbSBOb2FoIEZyaWVkbWFuJ3MgbWtpbnN0YWxsZGlycyBzY3JpcHQKKworIyBTa2lwIGxvdHMgb2Ygc3RhdCBjYWxscyBpbiB0aGUgdXN1YWwgY2FzZS4KK2lmIFsgISAtZCAiJGRzdGRpciIgXTsgdGhlbgorZGVmYXVsdElGUz0nCQorJworSUZTPSIke0lGUy0ke2RlZmF1bHRJRlN9fSIKKworb0lGUz0iJHtJRlN9IgorIyBTb21lIHNoJ3MgY2FuJ3QgaGFuZGxlIElGUz0vIGZvciBzb21lIHJlYXNvbi4KK0lGUz0nJScKK3NldCAtIGBlY2hvICR7ZHN0ZGlyfSB8IHNlZCAtZSAnc0AvQCVAZycgLWUgJ3NAXiVAL0AnYAorSUZTPSIke29JRlN9IgorCitwYXRoY29tcD0nJworCit3aGlsZSBbICQjIC1uZSAwIF0gOyBkbworCXBhdGhjb21wPSIke3BhdGhjb21wfSR7MX0iCisJc2hpZnQKKworCWlmIFsgISAtZCAiJHtwYXRoY29tcH0iIF0gOworICAgICAgICB0aGVuCisJCSRta2RpcnByb2cgIiR7cGF0aGNvbXB9IgorCWVsc2UKKwkJdHJ1ZQorCWZpCisKKwlwYXRoY29tcD0iJHtwYXRoY29tcH0vIgorZG9uZQorZmkKKworaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF0KK3RoZW4KKwkkZG9pdCAkaW5zdGNtZCAkZHN0ICYmCisKKwlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCisJaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgorCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKKwlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpCitlbHNlCisKKyMgSWYgd2UncmUgZ29pbmcgdG8gcmVuYW1lIHRoZSBmaW5hbCBleGVjdXRhYmxlLCBkZXRlcm1pbmUgdGhlIG5hbWUgbm93LgorCisJaWYgWyB4IiR0cmFuc2Zvcm1hcmciID0geCBdIAorCXRoZW4KKwkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdGAKKwllbHNlCisJCWRzdGZpbGU9YGJhc2VuYW1lICRkc3QgJHRyYW5zZm9ybWJhc2VuYW1lIHwgCisJCQlzZWQgJHRyYW5zZm9ybWFyZ2AkdHJhbnNmb3JtYmFzZW5hbWUKKwlmaQorCisjIGRvbid0IGFsbG93IHRoZSBzZWQgY29tbWFuZCB0byBjb21wbGV0ZWx5IGVsaW1pbmF0ZSB0aGUgZmlsZW5hbWUKKworCWlmIFsgeCIkZHN0ZmlsZSIgPSB4IF0gCisJdGhlbgorCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0YAorCWVsc2UKKwkJdHJ1ZQorCWZpCisKKyMgTWFrZSBhIHRlbXAgZmlsZSBuYW1lIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgorCisJZHN0dG1wPSRkc3RkaXIvI2luc3QuJCQjCisKKyMgTW92ZSBvciBjb3B5IHRoZSBmaWxlIG5hbWUgdG8gdGhlIHRlbXAgbmFtZQorCisJJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wICYmCisKKwl0cmFwICJybSAtZiAke2RzdHRtcH0iIDAgJiYKKworIyBhbmQgc2V0IGFueSBvcHRpb25zOyBkbyBjaG1vZCBsYXN0IHRvIHByZXNlcnZlIHNldHVpZCBiaXRzCisKKyMgSWYgYW55IG9mIHRoZXNlIGZhaWwsIHdlIGFib3J0IHRoZSB3aG9sZSB0aGluZy4gIElmIHdlIHdhbnQgdG8KKyMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQorIyBlcnJvcnMgZnJvbSB0aGUgYWJvdmUgIiRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KKworCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCisJaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKKwlpZiBbIHgiJHN0cmlwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJHN0cmlwY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgorCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCisKKyMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKworCSRkb2l0ICRybWNtZCAtZiAkZHN0ZGlyLyRkc3RmaWxlICYmCisJJGRvaXQgJG12Y21kICRkc3R0bXAgJGRzdGRpci8kZHN0ZmlsZSAKKworZmkgJiYKKworCitleGl0IDAKZGlmZiAtLWdpdCBhL3NyY2xpYi9wY3JlL2x0Y29uZmlnIGIvc3JjbGliL3BjcmUvbHRjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEwMTMzNGYuLjAwMDAwMDAKLS0tIGEvc3JjbGliL3BjcmUvbHRjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwzMDc4ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBsdGNvbmZpZyAtIENyZWF0ZSBhIHN5c3RlbS1zcGVjaWZpYyBsaWJ0b29sLgotIyBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgT3JpZ2luYWxseSBieSBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIEEgbG90IG9mIHRoaXMgc2NyaXB0IGlzIHRha2VuIGZyb20gYXV0b2NvbmYtMi4xMC4KLQotIyBDaGVjayB0aGF0IHdlIGFyZSBydW5uaW5nIHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLWVjaG89ZWNobwotaWYgdGVzdCAiWCQxIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgotICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KLSAgc2hpZnQKLWVsaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyBBdm9pZCBpbmxpbmUgZG9jdW1lbnQgaGVyZSwgaXQgbWF5IGJlIGxlZnQgb3ZlcgotICA6Ci1lbGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbgotICAjIFlpcHBlZSwgJGVjaG8gd29ya3MhCi0gIDoKLWVsc2UKLSAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgotICBleGVjICIkU0hFTEwiICIkMCIgLS1uby1yZWV4ZWMgJHsxKyIkQCJ9Ci1maQotCi1pZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgotICAjIHVzZWQgYXMgZmFsbGJhY2sgZWNobwotICBzaGlmdAotICBjYXQgPDxFT0YKLSQqCi1FT0YKLSAgZXhpdCAwCi1maQotCi0jIEZpbmQgdGhlIGNvcnJlY3QgUEFUSCBzZXBhcmF0b3IuICBVc3VhbGx5IHRoaXMgaXMgYDonLCBidXQKLSMgREpHUFAgdXNlcyBgOycgbGlrZSBET1MuCi1pZiB0ZXN0ICJYJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBYc2V0OyB0aGVuCi0gIFVOQU1FPSR7VU5BTUUtYHVuYW1lIDI+L2Rldi9udWxsYH0KLSAgY2FzZSBYJFVOQU1FIGluCi0gICAgKi1ET1MpIFBBVEhfU0VQQVJBVE9SPSc7JyA7OwotICAgICopICAgICBQQVRIX1NFUEFSQVRPUj0nOicgOzsKLSAgZXNhYwotZmkKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLWlmIHRlc3QgIlgke0NEUEFUSCtzZXR9IiA9IFhzZXQ7IHRoZW4gQ0RQQVRIPTo7IGV4cG9ydCBDRFBBVEg7IGZpCi0KLWlmIHRlc3QgIlgke2VjaG9fdGVzdF9zdHJpbmcrc2V0fSIgIT0gWHNldDsgdGhlbgotICAjIGZpbmQgYSBzdHJpbmcgYXMgbGFyZ2UgYXMgcG9zc2libGUsIGFzIGxvbmcgYXMgdGhlIHNoZWxsIGNhbiBjb3BlIHdpdGggaXQKLSAgZm9yIGNtZCBpbiAnc2VkIDUwcSAiJDAiJyAnc2VkIDIwcSAiJDAiJyAnc2VkIDEwcSAiJDAiJyAnc2VkIDJxICIkMCInICdlY2hvIHRlc3QnOyBkbwotICAgICMgZXhwZWN0ZWQgc2l6ZXM6IGxlc3MgdGhhbiAyS2IsIDFLYiwgNTEyIGJ5dGVzLCAxNiBieXRlcywgLi4uCi0gICAgaWYgKGVjaG9fdGVzdF9zdHJpbmc9ImBldmFsICRjbWRgIikgMj4vZGV2L251bGwgJiYKLSAgICAgICBlY2hvX3Rlc3Rfc3RyaW5nPSJgZXZhbCAkY21kYCIgJiYKLSAgICAgICAodGVzdCAiWCRlY2hvX3Rlc3Rfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi1maQotCi1pZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiICE9ICdYXHQnIHx8Ci0gICB0ZXN0ICJYYCgkZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAiICE9IFgiJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0gICMgVGhlIFNvbGFyaXMsIEFJWCwgYW5kIERpZ2l0YWwgVW5peCBkZWZhdWx0IGVjaG8gcHJvZ3JhbXMgdW5xdW90ZQotICAjIGJhY2tzbGFzaGVzLiAgVGhpcyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHF1b3RlIGJhY2tzbGFzaGVzIHVzaW5nCi0gICMgICBlY2hvICIkc29tZXRoaW5nIiB8IHNlZCAncy9cXC9cXFxcL2cnCi0gICMKLSAgIyBTbywgZmlyc3Qgd2UgbG9vayBmb3IgYSB3b3JraW5nIGVjaG8gaW4gdGhlIHVzZXIncyBQQVRILgotCi0gIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSR7UEFUSF9TRVBBUkFUT1J9IgotICBmb3IgZGlyIGluICRQQVRIIC91c3IvdWNiOyBkbwotICAgIGlmICh0ZXN0IC1mICRkaXIvZWNobyB8fCB0ZXN0IC1mICRkaXIvZWNobyRhY19leGVleHQpICYmCi0gICAgICAgdGVzdCAiWGAoJGRpci9lY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotICAgICAgIHRlc3QgIlhgKCRkaXIvZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAiID0gWCIkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLSAgICAgIGVjaG89IiRkaXIvZWNobyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRzYXZlX2lmcyIKLQotICBpZiB0ZXN0ICJYJGVjaG8iID0gWGVjaG87IHRoZW4KLSAgICAjIFdlIGRpZG4ndCBmaW5kIGEgYmV0dGVyIGVjaG8sIHNvIGxvb2sgZm9yIGFsdGVybmF0aXZlcy4KLSAgICBpZiB0ZXN0ICJYYChwcmludCAtciAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLSAgICAgICB0ZXN0ICJYYChwcmludCAtciAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAiID0gWCIkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLSAgICAgICMgVGhpcyBzaGVsbCBoYXMgYSBidWlsdGluIHByaW50IC1yIHRoYXQgZG9lcyB0aGUgdHJpY2suCi0gICAgICBlY2hvPSdwcmludCAtcicKLSAgICBlbGlmICh0ZXN0IC1mIC9iaW4va3NoIHx8IHRlc3QgLWYgL2Jpbi9rc2gkYWNfZXhlZXh0KSAmJgotCSB0ZXN0ICJYJENPTkZJR19TSEVMTCIgIT0gWC9iaW4va3NoOyB0aGVuCi0gICAgICAjIElmIHdlIGhhdmUga3NoLCB0cnkgcnVubmluZyBsdGNvbmZpZyBhZ2FpbiB3aXRoIGl0LgotICAgICAgT1JJR0lOQUxfQ09ORklHX1NIRUxMPSIke0NPTkZJR19TSEVMTC0vYmluL3NofSIKLSAgICAgIGV4cG9ydCBPUklHSU5BTF9DT05GSUdfU0hFTEwKLSAgICAgIENPTkZJR19TSEVMTD0vYmluL2tzaAotICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAotICAgICAgZXhlYyAiJENPTkZJR19TSEVMTCIgIiQwIiAtLW5vLXJlZXhlYyAkezErIiRAIn0KLSAgICBlbHNlCi0gICAgICAjIFRyeSB1c2luZyBwcmludGYuCi0gICAgICBlY2hvPSdwcmludGYgIiVzXG4iJwotICAgICAgaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0JIHRlc3QgIlhgKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCIgPSBYIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotCSMgQ29vbCwgcHJpbnRmIHdvcmtzCi0JOgotICAgICAgZWxpZiB0ZXN0ICJYYCgiJE9SSUdJTkFMX0NPTkZJR19TSEVMTCIgIiQwIiAtLWZhbGxiYWNrLWVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0JICAgdGVzdCAiWGAoIiRPUklHSU5BTF9DT05GSUdfU0hFTEwiICIkMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCIgPSBYIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotCUNPTkZJR19TSEVMTD0iJE9SSUdJTkFMX0NPTkZJR19TSEVMTCIKLQlleHBvcnQgQ09ORklHX1NIRUxMCi0JU0hFTEw9IiRDT05GSUdfU0hFTEwiCi0JZXhwb3J0IFNIRUxMCi0JZWNobz0iJENPTkZJR19TSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iCi0gICAgICBlbGlmIHRlc3QgIlhgKCIkQ09ORklHX1NIRUxMIiAiJDAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLQkgICB0ZXN0ICJYYCgiJENPTkZJR19TSEVMTCIgIiQwIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgIiA9IFgiJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0JZWNobz0iJENPTkZJR19TSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iCi0gICAgICBlbHNlCi0JIyBtYXliZSB3aXRoIGEgc21hbGxlciBzdHJpbmcuLi4KLQlwcmV2PToKLQotCWZvciBjbWQgaW4gJ2VjaG8gdGVzdCcgJ3NlZCAycSAiJDAiJyAnc2VkIDEwcSAiJDAiJyAnc2VkIDIwcSAiJDAiJyAnc2VkIDUwcSAiJDAiJzsgZG8KLQkgIGlmICh0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlhgZXZhbCAkY21kYCIpIDI+L2Rldi9udWxsOyB0aGVuCi0JICAgIGJyZWFrCi0JICBmaQotCSAgcHJldj0iJGNtZCIKLQlkb25lCi0KLQlpZiB0ZXN0ICIkcHJldiIgIT0gJ3NlZCA1MHEgIiQwIic7IHRoZW4KLQkgIGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJHByZXZgCi0JICBleHBvcnQgZWNob190ZXN0X3N0cmluZwotCSAgZXhlYyAiJHtPUklHSU5BTF9DT05GSUdfU0hFTEx9IiAiJDAiICR7MSsiJEAifQotCWVsc2UKLQkgICMgT29wcy4gIFdlIGxvc3QgY29tcGxldGVseSwgc28ganVzdCBzdGljayB3aXRoIGVjaG8uCi0JICBlY2hvPWVjaG8KLQlmaQotICAgICAgZmkKLSAgICBmaQotICBmaQotZmkKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcwotIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KLVhzZWQ9J3NlZCAtZSBzL15YLy8nCi1zZWRfcXVvdGVfc3Vic3Q9J3MvXChbXFwiXFxgJFxcXFxdXCkvXFxcMS9nJwotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KLWRvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGBcXFxcXVwpL1xcXDEvZycKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNoZWxsIHZhcmlhYmxlIGluIGEKLSMgZG91YmxlX3F1b3RlX3N1YnN0J2VkIHN0cmluZy4KLWRlbGF5X3ZhcmlhYmxlX3N1YnN0PSdzL1xcXFxcXFxcXFxcJC9cXFxcXFwkL2cnCi0KLSMgVGhlIG5hbWUgb2YgdGhpcyBwcm9ncmFtLgotcHJvZ25hbWU9YCRlY2hvICJYJDAiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotIyBDb25zdGFudHM6Ci1QUk9HUkFNPWx0Y29uZmlnCi1QQUNLQUdFPWxpYnRvb2wKLVZFUlNJT049MS4zLjQKLVRJTUVTVEFNUD0iICgxLjM4NS4yLjE5NiAxOTk5LzEyLzA3IDIxOjQ3OjU3KSIKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLXJtPSJybSAtZiIKLQotaGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotCi0jIEdsb2JhbCB2YXJpYWJsZXM6Ci1kZWZhdWx0X29maWxlPWxpYnRvb2wKLWNhbl9idWlsZF9zaGFyZWQ9eWVzCi1lbmFibGVfc2hhcmVkPXllcwotIyBBbGwga25vd24gbGlua2VycyByZXF1aXJlIGEgYC5hJyBhcmNoaXZlIGZvciBzdGF0aWMgbGlua2luZyAoZXhjZXB0IE0kVkMsCi0jIHdoaWNoIG5lZWRzICcubGliJykuCi1lbmFibGVfc3RhdGljPXllcwotZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLWVuYWJsZV9kbG9wZW49dW5rbm93bgotZW5hYmxlX3dpbjMyX2RsbD1ubwotbHRtYWluPQotc2lsZW50PQotc3JjZGlyPQotYWNfY29uZmlnX2d1ZXNzPQotYWNfY29uZmlnX3N1Yj0KLWhvc3Q9Ci1ub25vcHQ9Ci1vZmlsZT0iJGRlZmF1bHRfb2ZpbGUiCi12ZXJpZnlfaG9zdD15ZXMKLXdpdGhfZ2NjPW5vCi13aXRoX2dudV9sZD1ubwotbmVlZF9sb2Nrcz15ZXMKLWFjX2V4dD1jCi1vYmpleHQ9bwotbGliZXh0PWEKLWV4ZWV4dD0KLWNhY2hlX2ZpbGU9Ci0KLW9sZF9BUj0iJEFSIgotb2xkX0NDPSIkQ0MiCi1vbGRfQ0ZMQUdTPSIkQ0ZMQUdTIgotb2xkX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCi1vbGRfTERGTEFHUz0iJExERkxBR1MiCi1vbGRfTEQ9IiRMRCIKLW9sZF9MTl9TPSIkTE5fUyIKLW9sZF9MSUJTPSIkTElCUyIKLW9sZF9OTT0iJE5NIgotb2xkX1JBTkxJQj0iJFJBTkxJQiIKLW9sZF9ETExUT09MPSIkRExMVE9PTCIKLW9sZF9PQkpEVU1QPSIkT0JKRFVNUCIKLW9sZF9BUz0iJEFTIgotCi0jIFBhcnNlIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLWFyZ3M9Ci1wcmV2PQotZm9yIG9wdGlvbgotZG8KLSAgY2FzZSAiJG9wdGlvbiIgaW4KLSAgLSo9Kikgb3B0YXJnPWBlY2hvICIkb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIG9wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLSAgICBldmFsICIkcHJldj1cJG9wdGlvbiIKLSAgICBwcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJG9wdGlvbiIgaW4KLSAgLS1oZWxwKSBjYXQgPDxFT00KLVVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gW0hPU1QgW0xUTUFJTl1dCi0KLUdlbmVyYXRlIGEgc3lzdGVtLXNwZWNpZmljIGxpYnRvb2wgc2NyaXB0LgotCi0gICAgLS1kZWJ1ZyAgICAgICAgICAgICAgICBlbmFibGUgdmVyYm9zZSBzaGVsbCB0cmFjaW5nCi0gICAgLS1kaXNhYmxlLXNoYXJlZCAgICAgICBkbyBub3QgYnVpbGQgc2hhcmVkIGxpYnJhcmllcwotICAgIC0tZGlzYWJsZS1zdGF0aWMgICAgICAgZG8gbm90IGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMKLSAgICAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIGRvIG5vdCBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24KLSAgICAtLWVuYWJsZS1kbG9wZW4gICAgICAgIGVuYWJsZSBkbG9wZW4gc3VwcG9ydAotICAgIC0tZW5hYmxlLXdpbjMyLWRsbCAgICAgZW5hYmxlIGJ1aWxkaW5nIGRsbHMgb24gd2luMzIgaG9zdHMKLSAgICAtLWhlbHAgICAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0Ci0gICAgLS1uby12ZXJpZnkgICAgICAgICAgICBkbyBub3QgdmVyaWZ5IHRoYXQgSE9TVCBpcyBhIHZhbGlkIGhvc3QgdHlwZQotLW8sIC0tb3V0cHV0PUZJTEUgICAgICAgICAgc3BlY2lmeSB0aGUgb3V0cHV0IGZpbGUgW2RlZmF1bHQ9JGRlZmF1bHRfb2ZpbGVdCi0gICAgLS1xdWlldCAgICAgICAgICAgICAgICBzYW1lIGFzIFxgLS1zaWxlbnQnCi0gICAgLS1zaWxlbnQgICAgICAgICAgICAgICBkbyBub3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcwotICAgIC0tc3JjZGlyPURJUiAgICAgICAgICAgZmluZCBcYGNvbmZpZy5ndWVzcycgaW4gRElSCi0gICAgLS12ZXJzaW9uICAgICAgICAgICAgICBvdXRwdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotICAgIC0td2l0aC1nY2MgICAgICAgICAgICAgYXNzdW1lIHRoYXQgdGhlIEdOVSBDIGNvbXBpbGVyIHdpbGwgYmUgdXNlZAotICAgIC0td2l0aC1nbnUtbGQgICAgICAgICAgYXNzdW1lIHRoYXQgdGhlIEMgY29tcGlsZXIgdXNlcyB0aGUgR05VIGxpbmtlcgotICAgIC0tZGlzYWJsZS1sb2NrICAgICAgICAgZGlzYWJsZSBmaWxlIGxvY2tpbmcKLSAgICAtLWNhY2hlLWZpbGU9RklMRSAgICAgIGNvbmZpZ3VyZSBjYWNoZSBmaWxlCi0KLUxUTUFJTiBpcyB0aGUgXGBsdG1haW4uc2gnIHNoZWxsIHNjcmlwdCBmcmFnbWVudCBvciBcYGx0bWFpbi5jJyBwcm9ncmFtCi10aGF0IHByb3ZpZGVzIGJhc2ljIGxpYnRvb2wgZnVuY3Rpb25hbGl0eS4KLQotSE9TVCBpcyB0aGUgY2Fub25pY2FsIGhvc3Qgc3lzdGVtIG5hbWUgW2RlZmF1bHQ9Z3Vlc3NlZF0uCi1FT00KLSAgZXhpdCAwCi0gIDs7Ci0KLSAgLS1kZWJ1ZykKLSAgICBlY2hvICIkcHJvZ25hbWU6IGVuYWJsaW5nIHNoZWxsIHRyYWNlIG1vZGUiCi0gICAgc2V0IC14Ci0gICAgOzsKLQotICAtLWRpc2FibGUtc2hhcmVkKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0KLSAgLS1kaXNhYmxlLXN0YXRpYykgZW5hYmxlX3N0YXRpYz1ubyA7OwotCi0gIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwpIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKLQotICAtLWVuYWJsZS1kbG9wZW4pIGVuYWJsZV9kbG9wZW49eWVzIDs7Ci0KLSAgLS1lbmFibGUtd2luMzItZGxsKSBlbmFibGVfd2luMzJfZGxsPXllcyA7OwotCi0gIC0tcXVpZXQgfCAtLXNpbGVudCkgc2lsZW50PXllcyA7OwotCi0gIC0tc3JjZGlyKSBwcmV2PXNyY2RpciA7OwotICAtLXNyY2Rpcj0qKSBzcmNkaXI9IiRvcHRhcmciIDs7Ci0KLSAgLS1uby12ZXJpZnkpIHZlcmlmeV9ob3N0PW5vIDs7Ci0KLSAgLS1vdXRwdXQgfCAtbykgcHJldj1vZmlsZSA7OwotICAtLW91dHB1dD0qKSBvZmlsZT0iJG9wdGFyZyIgOzsKLQotICAtLXZlcnNpb24pIGVjaG8gIiRQUk9HUkFNIChHTlUgJFBBQ0tBR0UpICRWRVJTSU9OJFRJTUVTVEFNUCI7IGV4aXQgMCA7OwotCi0gIC0td2l0aC1nY2MpIHdpdGhfZ2NjPXllcyA7OwotICAtLXdpdGgtZ251LWxkKSB3aXRoX2dudV9sZD15ZXMgOzsKLQotICAtLWRpc2FibGUtbG9jaykgbmVlZF9sb2Nrcz1ubyA7OwotCi0gIC0tY2FjaGUtZmlsZT0qKSBjYWNoZV9maWxlPSIkb3B0YXJnIiA7OwotCi0gIC0qKQotICAgIGVjaG8gIiRwcm9nbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYCRvcHRpb24nIiAxPiYyCi0gICAgZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0IDEKLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAteiAiJGx0bWFpbiI7IHRoZW4KLSAgICAgIGx0bWFpbj0iJG9wdGlvbiIKLSAgICBlbGlmIHRlc3QgLXogIiRob3N0IjsgdGhlbgotIyBUaGlzIGdlbmVyYXRlcyBhbiB1bm5lY2Vzc2FyeSB3YXJuaW5nIGZvciBzcGFyYy1zdW4tc29sYXJpczQuMS4zX1UxCi0jICAgICAgaWYgdGVzdCAtbiAiYGVjaG8gJG9wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSMgICAgICAgIGVjaG8gIiRwcm9nbmFtZTogd2FybmluZyBcYCRvcHRpb24nIGlzIG5vdCBhIHZhbGlkIGhvc3QgdHlwZSIgMT4mMgotIyAgICAgIGZpCi0gICAgICBob3N0PSIkb3B0aW9uIgotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRwcm9nbmFtZTogdG9vIG1hbnkgYXJndW1lbnRzIiAxPiYyCi0gICAgICBlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkgOzsKLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC16ICIkbHRtYWluIjsgdGhlbgotICBlY2hvICIkcHJvZ25hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBMVE1BSU4gZmlsZSIgMT4mMgotICBlY2hvICIkaGVscCIgMT4mMgotICBleGl0IDEKLWZpCi0KLWlmIHRlc3QgISAtZiAiJGx0bWFpbiI7IHRoZW4KLSAgZWNobyAiJHByb2duYW1lOiBcYCRsdG1haW4nIGRvZXMgbm90IGV4aXN0IiAxPiYyCi0gIGVjaG8gIiRoZWxwIiAxPiYyCi0gIGV4aXQgMQotZmkKLQotIyBRdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotbHRjb25maWdfYXJncz0KLWZvciBhcmcKLWRvCi0gIGNhc2UgIiRhcmciIGluCi0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGx0Y29uZmlnX2FyZ3M9IiRsdGNvbmZpZ19hcmdzICckYXJnJyIgOzsKLSAgKikgbHRjb25maWdfYXJncz0iJGx0Y29uZmlnX2FyZ3MgJGFyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIEEgcmVsZXZhbnQgc3Vic2V0IG9mIEFDX0lOSVQuCi0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4+Li9jb25maWcubG9nCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgTEFORyBhbmQgTENfQUxMIHRvIEMgaWYgYWxyZWFkeSBzZXQuCi0jIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZAotIyBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotaWYgdGVzdCAiWCR7TENfQUxMK3NldH0iID0gWHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIlgke0xBTkcrc2V0fSIgICA9IFhzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi0KLWlmIHRlc3QgLW4gIiRjYWNoZV9maWxlIiAmJiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSB3aXRoaW4gbHRjb25maWciCi0gIC4gJGNhY2hlX2ZpbGUKLWZpCi0KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gICMgQXNzdW1lIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGlzIHRoZSBzYW1lIG9uZSBhcyB0aGUgcGF0aCB0byBMVE1BSU4uCi0gIHNyY2Rpcj1gJGVjaG8gIlgkbHRtYWluIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gIHRlc3QgIiRzcmNkaXIiID0gIiRsdG1haW4iICYmIHNyY2Rpcj0uCi1maQotCi10cmFwICIkcm0gY29uZnRlc3QqOyBleGl0IDEiIDEgMiAxNQotaWYgdGVzdCAiJHZlcmlmeV9ob3N0IiA9IHllczsgdGhlbgotICAjIENoZWNrIGZvciBjb25maWcuZ3Vlc3MgYW5kIGNvbmZpZy5zdWIuCi0gIGFjX2F1eF9kaXI9Ci0gIGZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL2NvbmZpZy5ndWVzczsgdGhlbgotICAgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gICAgZWNobyAiJHByb2duYW1lOiBjYW5ub3QgZmluZCBjb25maWcuZ3Vlc3MgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjIKLSAgICBlY2hvICIkaGVscCIgMT4mMgotICAgIGV4aXQgMQotICBmaQotICBhY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi0gIGFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotCi0gICMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLSAgaWYgJFNIRUxMICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogY2Fubm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMgotICAgIGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi0KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci0KLSAgaG9zdF9hbGlhcz0kaG9zdAotICBjYXNlICIkaG9zdF9hbGlhcyIgaW4KLSAgIiIpCi0gICAgaWYgaG9zdF9hbGlhcz1gJFNIRUxMICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlCi0gICAgICBlY2hvICIkcHJvZ25hbWU6IGNhbm5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyCi0gICAgICBlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkgOzsKLSAgZXNhYwotICBob3N0PWAkU0hFTEwgJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCi0gIGVjaG8gIiRhY190JGhvc3QiIDE+JjYKLQotICAjIE1ha2Ugc3VyZSB0aGUgaG9zdCB2ZXJpZmllZC4KLSAgdGVzdCAteiAiJGhvc3QiICYmIGV4aXQgMQotCi1lbGlmIHRlc3QgLXogIiRob3N0IjsgdGhlbgotICBlY2hvICIkcHJvZ25hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBob3N0IHR5cGUgaWYgeW91IHVzZSBcYC0tbm8tdmVyaWZ5JyIgMT4mMgotICBlY2hvICIkaGVscCIgMT4mMgotICBleGl0IDEKLWVsc2UKLSAgaG9zdF9hbGlhcz0kaG9zdAotZmkKLQotIyBUcmFuc2Zvcm0gbGludXgqIHRvICotKi1saW51eC1nbnUqLCB0byBzdXBwb3J0IG9sZCBjb25maWd1cmUgc2NyaXB0cy4KLWNhc2UgIiRob3N0X29zIiBpbgotbGludXgtZ251KikgOzsKLWxpbnV4KikgaG9zdD1gZWNobyAkaG9zdCB8IHNlZCAncy9eXCguKi0uKi1saW51eFwpXCguKlwpJC9cMS1nbnVcMi8nYAotZXNhYwotCi1ob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1ob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1ob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLQotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgzKikKLSAgIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCi0gICMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcwotICAjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCi0gIGlmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgotICAgIENPTExFQ1RfTkFNRVM9Ci0gICAgZXhwb3J0IENPTExFQ1RfTkFNRVMKLSAgZmkKLSAgOzsKLWVzYWMKLQotIyBEZXRlcm1pbmUgY29tbWFuZHMgdG8gY3JlYXRlIG9sZC1zdHlsZSBzdGF0aWMgYXJjaGl2ZXMuCi1vbGRfYXJjaGl2ZV9jbWRzPSckQVIgY3J1ICRvbGRsaWIkb2xkb2JqcycKLW9sZF9wb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA2NDQgJG9sZGxpYicKLW9sZF9wb3N0dW5pbnN0YWxsX2NtZHM9Ci0KLSMgU2V0IGEgc2FuZSBkZWZhdWx0IGZvciBgQVInLgotdGVzdCAteiAiJEFSIiAmJiBBUj1hcgotCi0jIFNldCBhIHNhbmUgZGVmYXVsdCBmb3IgYE9CSkRVTVAnLgotdGVzdCAteiAiJE9CSkRVTVAiICYmIE9CSkRVTVA9b2JqZHVtcAotCi0jIElmIFJBTkxJQiBpcyBub3Qgc2V0LCB0aGVuIHJ1biB0aGUgdGVzdC4KLWlmIHRlc3QgIiR7UkFOTElCK3NldH0iICE9ICJzZXQiOyB0aGVuCi0gIHJlc3VsdD1ubwotCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciByYW5saWIuLi4gJGFjX2MiIDE+JjYKLSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUn0iCi0gIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRkaXIvcmFubGliIHx8IHRlc3QgLWYgJGRpci9yYW5saWIkYWNfZXhlZXh0OyB0aGVuCi0gICAgICBSQU5MSUI9InJhbmxpYiIKLSAgICAgIHJlc3VsdD0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJHNhdmVfaWZzIgotCi0gIGVjaG8gIiRhY190JHJlc3VsdCIgMT4mNgotZmkKLQotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRvbGRsaWIiCi0gIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSJcJFJBTkxJQiBcJG9sZGxpYn4kb2xkX3Bvc3RpbnN0YWxsX2NtZHMiCi1maQotCi0jIFNldCBzYW5lIGRlZmF1bHRzIGZvciBgRExMVE9PTCcsIGBPQkpEVU1QJywgYW5kIGBBUycsIHVzZWQgb24gY3lnd2luLgotdGVzdCAteiAiJERMTFRPT0wiICYmIERMTFRPT0w9ZGxsdG9vbAotdGVzdCAteiAiJE9CSkRVTVAiICYmIE9CSkRVTVA9b2JqZHVtcAotdGVzdCAteiAiJEFTIiAmJiBBUz1hcwotCi0jIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgdXNpbmcgR0NDLgotaWYgdGVzdCAiJHdpdGhfZ2NjIiAhPSB5ZXMgfHwgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIElmIENDIGlzIG5vdCBzZXQsIHRoZW4gdHJ5IHRvIGZpbmQgR0NDIG9yIGEgdXNhYmxlIENDLgotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdjYy4uLiAkYWNfYyIgMT4mNgotICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSR7UEFUSF9TRVBBUkFUT1J9IgotICAgIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgICAgaWYgdGVzdCAtZiAkZGlyL2djYyB8fCB0ZXN0IC1mICRkaXIvZ2NjJGFjX2V4ZWV4dDsgdGhlbgotCUNDPSJnY2MiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIElGUz0iJHNhdmVfaWZzIgotCi0gICAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICAgICAgZWNobyAiJGFjX3QkQ0MiIDE+JjYKLSAgICBlbHNlCi0gICAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gICAgZmkKLSAgZmkKLQotICAjIE5vdCAiZ2NjIiwgc28gdHJ5ICJjYyIsIHJlamVjdGluZyAiL3Vzci91Y2IvY2MiLgotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNjLi4uICRhY19jIiAxPiY2Ci0gICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUn0iCi0gICAgY2NfcmVqZWN0ZWQ9bm8KLSAgICBmb3IgZGlyIGluICRQQVRIOyBkbwotICAgICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICAgIGlmIHRlc3QgLWYgJGRpci9jYyB8fCB0ZXN0IC1mICRkaXIvY2MkYWNfZXhlZXh0OyB0aGVuCi0JaWYgdGVzdCAiJGRpci9jYyIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0JICBjY19yZWplY3RlZD15ZXMKLQkgIGNvbnRpbnVlCi0JZmkKLQlDQz0iY2MiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIElGUz0iJHNhdmVfaWZzIgotICAgIGlmIHRlc3QgJGNjX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICAgICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gICAgICBzZXQgZHVtbXkgJENDCi0gICAgICBzaGlmdAotICAgICAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotCSMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotCSMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIG5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotCSMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIG5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0Jc2hpZnQKLQlzZXQgZHVtbXkgIiRkaXIvY2MiICIkQCIKLQlzaGlmdAotCUNDPSIkQCIKLSAgICAgIGZpCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgICAgIGVjaG8gIiRhY190JENDIiAxPiY2Ci0gICAgZWxzZQotICAgICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgICBlY2hvICIkcHJvZ25hbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLSAgZmkKLQotICAjIE5vdyBzZWUgaWYgdGhlIGNvbXBpbGVyIGlzIHJlYWxseSBHQ0MuCi0gIHdpdGhfZ2NjPW5vCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDLi4uICRhY19jIiAxPiY2Ci0gIGVjaG8gIiRwcm9nbmFtZTo1ODE6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLQotICAkcm0gY29uZnRlc3QuYwotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLSAgaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gJHByb2duYW1lOjU4OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgd2l0aF9nY2M9eWVzCi0gIGZpCi0gICRybSBjb25mdGVzdC5jCi0gIGVjaG8gIiRhY190JHdpdGhfZ2NjIiAxPiY2Ci1maQotCi0jIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotc2V0IGR1bW15ICRDQwotY29tcGlsZXI9IiQyIgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2JqZWN0IHN1ZmZpeC4uLiAkYWNfYyIgMT4mNgotJHJtIGNvbmZ0ZXN0KgotZWNobyAnaW50IGkgPSAxOycgPiBjb25mdGVzdC5jCi1lY2hvICIkcHJvZ25hbWU6NjAzOiBjaGVja2luZyBmb3Igb2JqZWN0IHN1ZmZpeCIgPiYgNQotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo2MDQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXJyOyB9OyB0aGVuCi0gICMgQXBwZW5kIGFueSB3YXJuaW5ncyB0byB0aGUgY29uZmlnLmxvZy4KLSAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0KLSAgZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICBjYXNlICRhY19maWxlIGluCi0gICAgKi5jKSA7OwotICAgICopIG9iamV4dD1gZWNobyAkYWNfZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Li8vYCA7OwotICAgIGVzYWMKLSAgZG9uZQotZWxzZQotICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci1maQotJHJtIGNvbmZ0ZXN0KgotZWNobyAiJGFjX3Qkb2JqZXh0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeC4uLiAkYWNfYyIgMT4mNgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2V4ZWV4dD0ibm8iCi0gICRybSBjb25mdGVzdCoKLSAgZWNobyAnbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LmMKLSAgZWNobyAiJHByb2duYW1lOjYyOTogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JiA1Ci0gIGlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6NjMwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVycjsgfTsgdGhlbgotICAgICMgQXBwZW5kIGFueSB3YXJuaW5ncyB0byB0aGUgY29uZmlnLmxvZy4KLSAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLQotICAgIGZvciBhY19maWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICBjYXNlICRhY19maWxlIGluCi0gICAgICAqLmMgfCAqLmVyciB8ICouJG9iamV4dCApIDs7Ci0gICAgICAqKSBhY19jdl9leGVleHQ9LmBlY2hvICRhY19maWxlIHwgc2VkIC1lIHMvY29uZnRlc3QuLy9gIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICBlbHNlCi0gICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLSAgZmkKLSAgJHJtIGNvbmZ0ZXN0KgotZmkKLWlmIHRlc3QgIlgkYWNfY3ZfZXhlZXh0IiA9IFhubzsgdGhlbgotICBleGVleHQ9IiIKLWVsc2UKLSAgZXhlZXh0PSIkYWNfY3ZfZXhlZXh0IgotZmkKLWVjaG8gIiRhY190JGFjX2N2X2V4ZWV4dCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQy4uLiAkYWNfYyIgMT4mNgotcGljX2ZsYWc9Ci1zcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3M9Ci13bD0KLWxpbmtfc3RhdGljX2ZsYWc9Ci1ub19idWlsdGluX2ZsYWc9Ci0KLWlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgd2w9Jy1XbCwnCi0gIGxpbmtfc3RhdGljX2ZsYWc9Jy1zdGF0aWMnCi0KLSAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgotICAgIDs7Ci0gIGFpeCopCi0gICAgIyBCZWxvdyB0aGVyZSBpcyBhIGRpcnR5IGhhY2sgdG8gZm9yY2Ugbm9ybWFsIHN0YXRpYyBsaW5raW5nIHdpdGggLWxkbAotICAgICMgVGhlIHByb2JsZW0gaXMgYmVjYXVzZSBsaWJkbCBkeW5hbWljYWxseSBsaW5rZWQgd2l0aCBib3RoIGxpYmMgYW5kCi0gICAgIyBsaWJDIChBSVggQysrIGxpYnJhcnkpLCB3aGljaCBvYnZpb3VzbHkgZG9lc24ndCBpbmNsdWRlZCBpbiBsaWJyYXJpZXMKLSAgICAjIGxpc3QgYnkgZ2NjLiBUaGlzIGNhdXNlIHVuZGVmaW5lZCBzeW1ib2xzIHdpdGggLXN0YXRpYyBmbGFncy4KLSAgICAjIFRoaXMgaGFjayBhbGxvd3MgQyBwcm9ncmFtcyB0byBiZSBsaW5rZWQgd2l0aCAiLXN0YXRpYyAtbGRsIiwgYnV0Ci0gICAgIyB3ZSBub3Qgc3VyZSBhYm91dCBDKysgcHJvZ3JhbXMuCi0gICAgbGlua19zdGF0aWNfZmxhZz0iJGxpbmtfc3RhdGljX2ZsYWcgJHt3bH0tbEMiCi0gICAgOzsKLSAgY3lnd2luKiB8IG1pbmd3KiB8IG9zMiopCi0gICAgIyBXZSBjYW4gYnVpbGQgRExMcyBmcm9tIG5vbi1QSUMuCi0gICAgOzsKLSAgYW1pZ2FvcyopCi0gICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAotICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAotICAgICMgbGlrZSBgLW02ODA0MCcuCi0gICAgcGljX2ZsYWc9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKLSAgICA7OwotICBzeXN2NCpNUCopCi0gICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgotICAgICAgIHBpY19mbGFnPS1LY29uZm9ybV9waWMKLSAgICBmaQotICAgIDs7Ci0gICopCi0gICAgcGljX2ZsYWc9Jy1mUElDJwotICAgIDs7Ci0gIGVzYWMKLWVsc2UKLSAgIyBQT1JUTUUgQ2hlY2sgZm9yIFBJQyBmbGFncyBmb3IgdGhlIHN5c3RlbSBjb21waWxlci4KLSAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gIGFpeDMqIHwgYWl4NCopCi0gICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKLSAgICA7OwotCi0gIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAgICMgSXMgdGhlcmUgYSBiZXR0ZXIgbGlua19zdGF0aWNfZmxhZyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/Ci0gICAgd2w9Jy1XbCwnCi0gICAgbGlua19zdGF0aWNfZmxhZz0iJHt3bH0tYSAke3dsfWFyY2hpdmUiCi0gICAgcGljX2ZsYWc9JytaJwotICAgIDs7Ci0KLSAgaXJpeDUqIHwgaXJpeDYqKQotICAgIHdsPSctV2wsJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1ub25fc2hhcmVkJwotICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KLSAgICA7OwotCi0gIGN5Z3dpbiogfCBtaW5ndyogfCBvczIqKQotICAgICMgV2UgY2FuIGJ1aWxkIERMTHMgZnJvbSBub24tUElDLgotICAgIDs7Ci0KLSAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgotICAgIHdsPSctV2wsJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1ub25fc2hhcmVkJwotICAgIDs7Ci0KLSAgc2NvMy4ydjUqKQotICAgIHBpY19mbGFnPSctS3BpYycKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctZG4nCi0gICAgc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzPSctYmVsZicKLSAgICA7OwotCi0gIHNvbGFyaXMqKQotICAgIHBpY19mbGFnPSctS1BJQycKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctQnN0YXRpYycKLSAgICB3bD0nLVdsLCcKLSAgICA7OwotCi0gIHN1bm9zNCopCi0gICAgcGljX2ZsYWc9Jy1QSUMnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLUJzdGF0aWMnCi0gICAgd2w9Jy1Rb3B0aW9uIGxkICcKLSAgICA7OwotCi0gIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKiB8IHN5c3Y1KikKLSAgICBwaWNfZmxhZz0nLUtQSUMnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLUJzdGF0aWMnCi0gICAgd2w9Jy1XbCwnCi0gICAgOzsKLQotICB1dHM0KikKLSAgICBwaWNfZmxhZz0nLXBpYycKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctQnN0YXRpYycKLSAgICA7OwotICBzeXN2NCpNUCopCi0gICAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgotICAgICAgcGljX2ZsYWc9Jy1LY29uZm9ybV9waWMnCi0gICAgICBsaW5rX3N0YXRpY19mbGFnPSctQnN0YXRpYycKLSAgICBmaQotICAgIDs7Ci0gICopCi0gICAgY2FuX2J1aWxkX3NoYXJlZD1ubwotICAgIDs7Ci0gIGVzYWMKLWZpCi0KLWlmIHRlc3QgLW4gIiRwaWNfZmxhZyI7IHRoZW4KLSAgZWNobyAiJGFjX3QkcGljX2ZsYWciIDE+JjYKLQotICAjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgcGljX2ZsYWcgYWN0dWFsbHkgd29ya3MuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkcGljX2ZsYWcgd29ya3MuLi4gJGFjX2MiIDE+JjYKLSAgJHJtIGNvbmZ0ZXN0KgotICBlY2hvICJpbnQgc29tZV92YXJpYWJsZSA9IDA7IiA+IGNvbmZ0ZXN0LmMKLSAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAkcGljX2ZsYWcgLURQSUMiCi0gIGVjaG8gIiRwcm9nbmFtZTo3NzY6IGNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkcGljX2ZsYWcgd29ya3MiID4mNQotICBpZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjc3NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kb2JqZXh0OyB0aGVuCi0gICAgIyBBcHBlbmQgYW55IHdhcm5pbmdzIHRvIHRoZSBjb25maWcubG9nLgotICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgIAotICAgIGNhc2UgIiRob3N0X29zIiBpbgotICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAgICAgIyBPbiBIUC1VWCwgYm90aCBDQyBhbmQgR0NDIG9ubHkgd2FybiB0aGF0IFBJQyBpcyBzdXBwb3J0ZWQuLi4gdGhlbiB0aGV5Ci0gICAgICAjIGNyZWF0ZSBub24tUElDIG9iamVjdHMuICBTbywgaWYgdGhlcmUgd2VyZSBhbnkgd2FybmluZ3MsIHdlIGFzc3VtZSB0aGF0Ci0gICAgICAjIFBJQyBpcyBub3Qgc3VwcG9ydGVkLgotICAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLQllY2hvICIkYWNfdCJubyAxPiY2Ci0JY2FuX2J1aWxkX3NoYXJlZD1ubwotCXBpY19mbGFnPQotICAgICAgZWxzZQotCWVjaG8gIiRhY190InllcyAxPiY2Ci0JcGljX2ZsYWc9IiAkcGljX2ZsYWciCi0gICAgICBmaQotICAgICAgOzsKLSAgICAqKQotICAgICAgZWNobyAiJGFjX3QieWVzIDE+JjYKLSAgICAgIHBpY19mbGFnPSIgJHBpY19mbGFnIgotICAgICAgOzsKLSAgICBlc2FjCi0gIGVsc2UKLSAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgotICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgIGNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICBwaWNfZmxhZz0KLSAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gIGZpCi0gIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgotICAkcm0gY29uZnRlc3QqCi1lbHNlCi0gIGVjaG8gIiRhY190Im5vbmUgMT4mNgotZmkKLQotIyBDaGVjayB0byBzZWUgaWYgb3B0aW9ucyAtbyBhbmQgLWMgYXJlIHNpbXVsdGFuZW91c2x5IHN1cHBvcnRlZCBieSBjb21waWxlcgotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuby4uLiAkYWNfYyIgMT4mNgotJHJtIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCi1ta2RpciBjb25mdGVzdAotY2QgY29uZnRlc3QKLSRybSBjb25mdGVzdCoKLWVjaG8gImludCBzb21lX3ZhcmlhYmxlID0gMDsiID4gY29uZnRlc3QuYwotbWtkaXIgb3V0Ci0jIEFjY29yZGluZyB0byBUb20gVHJvbWV5LCBJYW4gTGFuY2UgVGF5bG9yIHJlcG9ydGVkIHRoZXJlIGFyZSBDIGNvbXBpbGVycwotIyB0aGF0IHdpbGwgY3JlYXRlIHRlbXBvcmFyeSBmaWxlcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgcmVnYXJkbGVzcyBvZgotIyB0aGUgb3V0cHV0IGRpcmVjdG9yeS4gIFRodXMsIG1ha2luZyBDV0QgcmVhZC1vbmx5IHdpbGwgY2F1c2UgdGhpcyB0ZXN0Ci0jIHRvIGZhaWwsIGVuYWJsaW5nIGxvY2tpbmcgb3IgYXQgbGVhc3Qgd2FybmluZyB0aGUgdXNlciBub3QgdG8gZG8gcGFyYWxsZWwKLSMgYnVpbGRzLgotY2htb2QgLXcgLgotc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9IiRDRkxBR1MgLW8gb3V0L2NvbmZ0ZXN0Mi5vIgotZWNobyAiJHByb2duYW1lOjgyOTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUubyIgPiY1Ci1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjgzMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj5vdXQvY29uZnRlc3QuZXJyOyB9ICYmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0Mi5vOyB0aGVuCi0KLSAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgaWYgdGVzdCAtcyBvdXQvY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gICAgICBjb21waWxlcl9jX289bm8KLSAgICBlbHNlCi0gICAgICBlY2hvICIkYWNfdCJ5ZXMgMT4mNgotICAgICAgY29tcGlsZXJfY19vPXllcwotICAgIGZpCi1lbHNlCi0gICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCi0gIGNhdCBvdXQvY29uZnRlc3QuZXJyIDE+JjUKLSAgY29tcGlsZXJfY19vPW5vCi0gIGVjaG8gIiRhY190Im5vIDE+JjYKLWZpCi1DRkxBR1M9IiRzYXZlX0NGTEFHUyIKLWNobW9kIHUrdyAuCi0kcm0gY29uZnRlc3QqIG91dC8qCi1ybWRpciBvdXQKLWNkIC4uCi1ybWRpciBjb25mdGVzdAotJHJtIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCi0KLWlmIHRlc3QgeCIkY29tcGlsZXJfY19vIiA9IHgieWVzIjsgdGhlbgotICAjIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gd3JpdGUgdG8gYSAubG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUubG8uLi4gJGFjX2MiIDE+JjYKLSAgJHJtIGNvbmZ0ZXN0KgotICBlY2hvICJpbnQgc29tZV92YXJpYWJsZSA9IDA7IiA+IGNvbmZ0ZXN0LmMKLSAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYyAtbyBjb25mdGVzdC5sbyIKLSAgZWNobyAiJHByb2duYW1lOjg2MjogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUubG8iID4mNQotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo4NjM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXJyOyB9ICYmIHRlc3QgLXMgY29uZnRlc3QubG87IHRoZW4KLQotICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotCWVjaG8gIiRhY190Im5vIDE+JjYKLQljb21waWxlcl9vX2xvPW5vCi0gICAgICBlbHNlCi0JZWNobyAiJGFjX3QieWVzIDE+JjYKLQljb21waWxlcl9vX2xvPXllcwotICAgICAgZmkKLSAgZWxzZQotICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCi0gICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgY29tcGlsZXJfb19sbz1ubwotICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgZmkKLSAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCi0gICRybSBjb25mdGVzdCoKLWVsc2UKLSAgY29tcGlsZXJfb19sbz1ubwotZmkKLQotIyBDaGVjayB0byBzZWUgaWYgd2UgY2FuIGRvIGhhcmQgbGlua3MgdG8gbG9jayBzb21lIGZpbGVzIGlmIG5lZWRlZAotaGFyZF9saW5rcz0ibm90dGVzdGVkIgotaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KLSAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcy4uLiAkYWNfYyIgMT4mNgotICBoYXJkX2xpbmtzPXllcwotICAkcm0gY29uZnRlc3QqCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCi0gIHRvdWNoIGNvbmZ0ZXN0LmEKLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+JjUgfHwgaGFyZF9saW5rcz1ubwotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubwotICBlY2hvICIkYWNfdCRoYXJkX2xpbmtzIiAxPiY2Ci0gICRybSBjb25mdGVzdCoKLSAgaWYgdGVzdCAiJGhhcmRfbGlua3MiID0gbm87IHRoZW4KLSAgICBlY2hvICIqKiogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiYyCi0gICAgbmVlZF9sb2Nrcz13YXJuCi0gIGZpCi1lbHNlCi0gIG5lZWRfbG9ja3M9bm8KLWZpCi0KLWlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayB0byBzZWUgaWYgb3B0aW9ucyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIGFyZSBzdXBwb3J0ZWQgYnkgY29tcGlsZXIKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMgLi4uICRhY19jIiAxPiY2Ci0gICRybSBjb25mdGVzdCoKLSAgZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC5jCi0gIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyAtYyBjb25mdGVzdC5jIgotICBlY2hvICIkcHJvZ25hbWU6OTE0OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIgPiY1Ci0gIGlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6OTE1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVycjsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0Lm87IHRoZW4KLQotICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotCWVjaG8gIiRhY190Im5vIDE+JjYKLQljb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9bm8KLSAgICAgIGVsc2UKLQllY2hvICIkYWNfdCJ5ZXMgMT4mNgotCWNvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucz15ZXMKLSAgICAgIGZpCi0gIGVsc2UKLSAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgotICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgIGNvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucz1ubwotICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgZmkKLSAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCi0gICRybSBjb25mdGVzdCoKLQotICBpZiB0ZXN0ICIkY29tcGlsZXJfcnR0aV9leGNlcHRpb25zIiA9ICJ5ZXMiOyB0aGVuCi0gICAgbm9fYnVpbHRpbl9mbGFnPScgLWZuby1idWlsdGluIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMnCi0gIGVsc2UKLSAgICBub19idWlsdGluX2ZsYWc9JyAtZm5vLWJ1aWx0aW4nCi0gIGZpCi0gIAotZmkKLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgc2hhcmVkIGxpYnJhcnkgY29tcGlsYXRpb24gZmxhZ3MuCi1pZiB0ZXN0IC1uICIkc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzIjsgdGhlbgotICBlY2hvICIkcHJvZ25hbWU6IHdhcm5pbmc6IFxgJENDJyByZXF1aXJlcyBcYCRzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3MnIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiIDE+JjIKLSAgaWYgZWNobyAiJG9sZF9DQyAkb2xkX0NGTEFHUyAiIHwgZWdyZXAgLWUgIlsgCV0kc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzWyAJXSIgPi9kZXYvbnVsbDsgdGhlbiA6Ci0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGFkZCBcYCRzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3MnIHRvIHRoZSBDQyBvciBDRkxBR1MgZW52IHZhcmlhYmxlIGFuZCByZWNvbmZpZ3VyZSIgMT4mMgotICAgIGNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgZmkKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbGlua19zdGF0aWNfZmxhZyB3b3Jrcy4uLiAkYWNfYyIgMT4mNgotJHJtIGNvbmZ0ZXN0KgotZWNobyAnbWFpbigpe3JldHVybigwKTt9JyA+IGNvbmZ0ZXN0LmMKLXNhdmVfTERGTEFHUz0iJExERkxBR1MiCi1MREZMQUdTPSIkTERGTEFHUyAkbGlua19zdGF0aWNfZmxhZyIKLWVjaG8gIiRwcm9nbmFtZTo5NTg6IGNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbGlua19zdGF0aWNfZmxhZyB3b3JrcyIgPiY1Ci1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjk1OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIGVjaG8gIiRhY190JGxpbmtfc3RhdGljX2ZsYWciIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3Qibm9uZSAxPiY2Ci0gIGxpbmtfc3RhdGljX2ZsYWc9Ci1maQotTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKLSRybSBjb25mdGVzdCoKLQotaWYgdGVzdCAteiAiJExOX1MiOyB0aGVuCi0gICMgQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiB1c2UgbG4gLXMsIG9yIHdlIG5lZWQgaGFyZCBsaW5rcy4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3Jrcy4uLiAkYWNfYyIgMT4mNgotICAkcm0gY29uZnRlc3QuZGF0Ci0gIGlmIGxuIC1zIFggY29uZnRlc3QuZGF0IDI+L2Rldi9udWxsOyB0aGVuCi0gICAgJHJtIGNvbmZ0ZXN0LmRhdAotICAgIExOX1M9ImxuIC1zIgotICBlbHNlCi0gICAgTE5fUz1sbgotICBmaQotICBpZiB0ZXN0ICIkTE5fUyIgPSAibG4gLXMiOyB0aGVuCi0gICAgZWNobyAiJGFjX3QieWVzIDE+JjYKLSAgZWxzZQotICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgZmkKLWZpCi0KLSMgTWFrZSBzdXJlIExEIGlzIGFuIGFic29sdXRlIHBhdGguCi1pZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIGFjX3Byb2c9bGQKLSAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICAgICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQy4uLiAkYWNfYyIgMT4mNgotICAgIGVjaG8gIiRwcm9nbmFtZTo5OTE6IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIgPiY1Ci0gICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICAgIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotICAgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikKLSAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKLSAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCi0gICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCi0JYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAotICAgICAgZG9uZQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAgICIiKQotICAgICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZSBub3QgdXNpbmcgR0NDLgotICAgICAgYWNfcHJvZz1sZAotICAgICAgOzsKLSAgICAqKQotICAgICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgICAgOzsKLSAgICBlc2FjCi0gIGVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgbGQuLi4gJGFjX2MiIDE+JjYKLSAgICBlY2hvICIkcHJvZ25hbWU6MTAxNTogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1Ci0gIGVsc2UKLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci0gICAgZWNobyAiJHByb2duYW1lOjEwMTg6IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKLSAgZmkKLQotICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUn0iCi0gICAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIiB8fCB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nJGFjX2V4ZWV4dCI7IHRoZW4KLQlMRD0iJGFjX2Rpci8kYWNfcHJvZyIKLQkjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0JIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotCSMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotCWlmICIkTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JICB0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0JZWxzZQotCSAgdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLQlmaQotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIGZpCi0KLSAgaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICAgIGVjaG8gIiRhY190JExEIiAxPiY2Ci0gIGVsc2UKLSAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gIGZpCi0KLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICAgIGVjaG8gIiRwcm9nbmFtZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi1maQotCi0jIENoZWNrIHRvIHNlZSBpZiBpdCByZWFsbHkgaXMgb3IgaXMgbm90IEdOVSBsZC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkLi4uICRhY19jIiAxPiY2Ci0jIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICB3aXRoX2dudV9sZD15ZXMKLWVsc2UKLSAgd2l0aF9nbnVfbGQ9bm8KLWZpCi1lY2hvICIkYWNfdCR3aXRoX2dudV9sZCIgMT4mNgotCi0jIFNlZSBpZiB0aGUgbGlua2VyIHN1cHBvcnRzIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAkYWNfYyIgMT4mNgotCi1hbGxvd191bmRlZmluZWRfZmxhZz0KLW5vX3VuZGVmaW5lZF9mbGFnPQotbmVlZF9saWJfcHJlZml4PXVua25vd24KLW5lZWRfdmVyc2lvbj11bmtub3duCi0jIHdoZW4geW91IHNldCBuZWVkX3ZlcnNpb24gdG8gbm8sIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSAtc2V0X3ZlcnNpb24KLSMgZmxhZ3MgdG8gYmUgbGVmdCB3aXRob3V0IGFyZ3VtZW50cwotYXJjaGl2ZV9jbWRzPQotYXJjaGl2ZV9leHBzeW1fY21kcz0KLW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9Ci1leHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Ci13aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KLXRocmVhZF9zYWZlX2ZsYWdfc3BlYz0KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Ci1oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPQotaGFyZGNvZGVfZGlyZWN0PW5vCi1oYXJkY29kZV9taW51c19MPW5vCi1oYXJkY29kZV9zaGxpYnBhdGhfdmFyPXVuc3VwcG9ydGVkCi1ydW5wYXRoX3Zhcj0KLWFsd2F5c19leHBvcnRfc3ltYm9scz1ubwotZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCBzZWQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCi0jIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCi0jIGluY2x1ZGVkIGluIHRoZSBzeW1ib2wgbGlzdAotaW5jbHVkZV9leHBzeW1zPQotIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGVncmVwIHJlZ3VsYXIgZXhwcmVzc2lvbiBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKLSMgaXQgd2lsbCBiZSB3cmFwcGVkIGJ5IGAgKCcgYW5kIGApJCcsIHNvIG9uZSBtdXN0IG5vdCBtYXRjaCBiZWdpbm5pbmcgb3IKLSMgZW5kIG9mIGxpbmUuICBFeGFtcGxlOiBgYXxiY3wuKmQuKicgd2lsbCBleGNsdWRlIHRoZSBzeW1ib2xzIGBhJyBhbmQgYGJjJywKLSMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgotZXhjbHVkZV9leHBzeW1zPSJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCi0jIEFsdGhvdWdoIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpcyBhIHZhbGlkIHN5bWJvbCBDIG5hbWUsIG1vc3QgYS5vdXQKLSMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgotIyB0aGUgc3ltYm9sIGlzIGV4cGxpY2l0bHkgcmVmZXJlbmNlZC4gIFNpbmNlIHBvcnRhYmxlIGNvZGUgY2Fubm90Ci0jIHJlbHkgb24gdGhpcyBzeW1ib2wgbmFtZSwgaXQncyBwcm9iYWJseSBmaW5lIHRvIG5ldmVyIGluY2x1ZGUgaXQgaW4KLSMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCi0KLWNhc2UgIiRob3N0X29zIiBpbgotY3lnd2luKiB8IG1pbmd3KikKLSAgIyBGSVhNRTogdGhlIE1TVkMrKyBwb3J0IGhhc24ndCBiZWVuIHRlc3RlZCBpbiBhIGxvb29vbmcgdGltZQotICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZwotICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgotICBpZiB0ZXN0ICIkd2l0aF9nY2MiICE9IHllczsgdGhlbgotICAgIHdpdGhfZ251X2xkPW5vCi0gIGZpCi0gIDs7Ci0KLWVzYWMKLQotbGRfc2hsaWJzPXllcwotaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQotICB3bGFyYz0nJHt3bH0nCi0KLSAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCi0gIGNhc2UgIiRob3N0X29zIiBpbgotICBhaXgzKiB8IGFpeDQqKQotICAgICMgT24gQUlYLCB0aGUgR05VIGxpbmtlciBpcyB2ZXJ5IGJyb2tlbgotICAgIGxkX3NobGlicz1ubwotICAgIGNhdCA8PEVPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiB0aGUgR05VIGxpbmtlciwgYXQgbGVhc3QgdXAgdG8gcmVsZWFzZSAyLjkuMSwgaXMgcmVwb3J0ZWQKLSoqKiB0byBiZSB1bmFibGUgdG8gcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gQUlYLgotKioqIFRoZXJlZm9yZSwgbGlidG9vbCBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgSWYgeW91Ci0qKiogcmVhbGx5IGNhcmUgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIHlvdSBtYXkgd2FudCB0byBtb2RpZnkgeW91ciBQQVRICi0qKiogc28gdGhhdCBhIG5vbi1HTlUgbGlua2VyIGlzIGZvdW5kLCBhbmQgdGhlbiByZXN0YXJ0LgotCi1FT0YKLSAgICA7OwotCi0gIGFtaWdhb3MqKQotICAgIGFyY2hpdmVfY21kcz0nJHJtICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiBjcnUgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLQotICAgICMgU2FtdWVsIEEuIEZhbHZvIElJIDxrYzV0amFAZG9scGhpbi5vcGVucHJvamVjdHMubmV0PiByZXBvcnRzCi0gICAgIyB0aGF0IHRoZSBzZW1hbnRpY3Mgb2YgZHluYW1pYyBsaWJyYXJpZXMgb24gQW1pZ2FPUywgYXQgbGVhc3QgdXAKLSAgICAjIHRvIHZlcnNpb24gNCwgaXMgdG8gc2hhcmUgZGF0YSBhbW9uZyBtdWx0aXBsZSBwcm9ncmFtcyBsaW5rZWQKLSAgICAjIHdpdGggdGhlIHNhbWUgZHluYW1pYyBsaWJyYXJ5LiAgU2luY2UgdGhpcyBkb2Vzbid0IG1hdGNoIHRoZQotICAgICMgYmVoYXZpb3Igb2Ygc2hhcmVkIGxpYnJhcmllcyBvbiBvdGhlciBwbGF0Zm9ybXMsIHdlIGNhbiB1c2UKLSAgICAjIHRoZW0uCi0gICAgbGRfc2hsaWJzPW5vCi0gICAgOzsKLQotICBiZW9zKikKLSAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBlZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgICAgIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYwotICAgICAgIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gICAgZWxzZQotICAgICAgbGRfc2hsaWJzPW5vCi0gICAgZmkKLSAgICA7OwotCi0gIGN5Z3dpbiogfCBtaW5ndyopCi0gICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcwotICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcwotCi0gICAgIyBFeHRyYWN0IHRoZSBzeW1ib2wgZXhwb3J0IGxpc3QgZnJvbSBhbiBgLS1leHBvcnQtYWxsJyBkZWYgZmlsZSwKLSAgICAjIHRoZW4gcmVnZW5lcmF0ZSB0aGUgZGVmIGZpbGUgZnJvbSB0aGUgc3ltYm9sIGV4cG9ydCBsaXN0LCBzbyB0aGF0Ci0gICAgIyB0aGUgY29tcGlsZWQgZGxsIG9ubHkgZXhwb3J0cyB0aGUgc3ltYm9sIGV4cG9ydCBsaXN0LgotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHM9J3Rlc3QgLWYgJG9iamRpci8kc29uYW1lLWx0ZGxsLmMgfHwgc2VkIC1lICIvXiMgXC9cKiBsdGRsbFwuYyBzdGFydHMgaGVyZSBcKlwvLywvXiMgXC9cKiBsdGRsbC5jIGVuZHMgaGVyZSBcKlwvLyB7IHMvXiMgLy87IHA7IH0iIC1lIGQgPCAkMCA+ICRvYmpkaXIvJHNvbmFtZS1sdGRsbC5jfgotICAgICAgdGVzdCAtZiAkb2JqZGlyLyRzb25hbWUtbHRkbGwuJG9iamV4dCB8fCAoY2QgJG9iamRpciAmJiAkQ0MgLWMgJHNvbmFtZS1sdGRsbC5jKX4KLSAgICAgICRETExUT09MIC0tZXhwb3J0LWFsbCAtLWV4Y2x1ZGUtc3ltYm9scyBEbGxNYWluQDEyLF9jeWd3aW5fZGxsX2VudHJ5QDEyLF9jeWd3aW5fbm9uY3lnd2luX2RsbF9lbnRyeUAxMiAtLW91dHB1dC1kZWYgJG9iamRpci8kc29uYW1lLWRlZiAgJG9iamRpci8kc29uYW1lLWx0ZGxsLiRvYmpleHQgJGxpYm9ianMgJGNvbnZlbmllbmNlfgotICAgICAgc2VkIC1lICIxLC9FWFBPUlRTL2QiIC1lICJzLyBAIFswLTldKiA7ICovLyIgPCAkb2JqZGlyLyRzb25hbWUtZGVmID4gJGV4cG9ydF9zeW1ib2xzJwotCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nZWNobyBFWFBPUlRTID4gJG9iamRpci8kc29uYW1lLWRlZn4KLSAgICAgIF9sdF9oaW50PTE7Ci0gICAgICBmb3Igc3ltYm9sIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8KLQllY2hvICIJXCRzeW1ib2wgQCBcJF9sdF9oaW50IDsgIiA+PiAkb2JqZGlyLyRzb25hbWUtZGVmOwotCV9sdF9oaW50PWBleHByIDEgKyBcJF9sdF9oaW50YDsKLSAgICAgIGRvbmV+Ci0gICAgICB0ZXN0IC1mICRvYmpkaXIvJHNvbmFtZS1sdGRsbC5jIHx8IHNlZCAtZSAiL14jIFwvXCogbHRkbGxcLmMgc3RhcnRzIGhlcmUgXCpcLy8sL14jIFwvXCogbHRkbGwuYyBlbmRzIGhlcmUgXCpcLy8geyBzL14jIC8vOyBwOyB9IiAtZSBkIDwgJDAgPiAkb2JqZGlyLyRzb25hbWUtbHRkbGwuY34KLSAgICAgIHRlc3QgLWYgJG9iamRpci8kc29uYW1lLWx0ZGxsLiRvYmpleHQgfHwgKGNkICRvYmpkaXIgJiYgJENDIC1jICRzb25hbWUtbHRkbGwuYyl+Ci0gICAgICAkQ0MgLVdsLC0tYmFzZS1maWxlLCRvYmpkaXIvJHNvbmFtZS1iYXNlIC1XbCwtLWRsbCAtbm9zdGFydGZpbGVzIC1XbCwtZSxfX2N5Z3dpbl9kbGxfZW50cnlAMTIgLW8gJGxpYiAkb2JqZGlyLyRzb25hbWUtbHRkbGwuJG9iamV4dCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHN+Ci0gICAgICAkRExMVE9PTCAtLWFzPSRBUyAtLWRsbG5hbWUgJHNvbmFtZSAtLWV4Y2x1ZGUtc3ltYm9scyBEbGxNYWluQDEyLF9jeWd3aW5fZGxsX2VudHJ5QDEyLF9jeWd3aW5fbm9uY3lnd2luX2RsbF9lbnRyeUAxMiAtLWRlZiAkb2JqZGlyLyRzb25hbWUtZGVmIC0tYmFzZS1maWxlICRvYmpkaXIvJHNvbmFtZS1iYXNlIC0tb3V0cHV0LWV4cCAkb2JqZGlyLyRzb25hbWUtZXhwfgotICAgICAgJENDIC1XbCwtLWJhc2UtZmlsZSwkb2JqZGlyLyRzb25hbWUtYmFzZSAkb2JqZGlyLyRzb25hbWUtZXhwIC1XbCwtLWRsbCAtbm9zdGFydGZpbGVzIC1XbCwtZSxfX2N5Z3dpbl9kbGxfZW50cnlAMTIgLW8gJGxpYiAkb2JqZGlyLyRzb25hbWUtbHRkbGwuJG9iamV4dCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHN+Ci0gICAgICAkRExMVE9PTCAtLWFzPSRBUyAtLWRsbG5hbWUgJHNvbmFtZSAtLWV4Y2x1ZGUtc3ltYm9scyBEbGxNYWluQDEyLF9jeWd3aW5fZGxsX2VudHJ5QDEyLF9jeWd3aW5fbm9uY3lnd2luX2RsbF9lbnRyeUAxMiAtLWRlZiAkb2JqZGlyLyRzb25hbWUtZGVmIC0tYmFzZS1maWxlICRvYmpkaXIvJHNvbmFtZS1iYXNlIC0tb3V0cHV0LWV4cCAkb2JqZGlyLyRzb25hbWUtZXhwfgotICAgICAgJENDICRvYmpkaXIvJHNvbmFtZS1leHAgLVdsLC0tZGxsIC1ub3N0YXJ0ZmlsZXMgLVdsLC1lLF9fY3lnd2luX2RsbF9lbnRyeUAxMiAtbyAkbGliICRvYmpkaXIvJHNvbmFtZS1sdGRsbC4kb2JqZXh0ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLQotICAgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0nJERMTFRPT0wgLS1hcz0kQVMgLS1kbGxuYW1lICRzb25hbWUgLS1kZWYgJG9iamRpci8kc29uYW1lLWRlZiAtLW91dHB1dC1saWIgJG9iamRpci8kbGlibmFtZS5hJyAKLSAgICA7OwotCi0gIG5ldGJzZCopCi0gICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgIGVsc2UKLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAtbyAkbGliJwotICAgICAgIyBjYW4gd2Ugc3VwcG9ydCBzb25hbWUgYW5kL29yIGV4cHN5bXMgd2l0aCBhLm91dD8gLW9saXZhCi0gICAgZmkKLSAgICA7OwotCi0gIHNvbGFyaXMqIHwgc3lzdjUqKQotICAgIGlmICRMRCAtdiAyPiYxIHwgZWdyZXAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgbGRfc2hsaWJzPW5vCi0gICAgICBjYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogVGhlIHJlbGVhc2VzIDIuOC4qIG9mIHRoZSBHTlUgbGlua2VyIGNhbm5vdCByZWxpYWJseQotKioqIGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNvbGFyaXMgc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAotKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQotKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi45LjEgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKLSoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCi0qKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KLQotRU9GCi0gICAgZWxpZiAkTEQgLS1oZWxwIDI+JjEgfCBlZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgZWxzZQotICAgICAgbGRfc2hsaWJzPW5vCi0gICAgZmkKLSAgICA7OyAgICAgIAotCi0gIHN1bm9zNCopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgd2xhcmM9Ci0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gICopCi0gICAgaWYgJExEIC0taGVscCAyPiYxIHwgZWdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgIGVsc2UKLSAgICAgIGxkX3NobGlicz1ubwotICAgIGZpCi0gICAgOzsKLSAgZXNhYwotCi0gIGlmIHRlc3QgIiRsZF9zaGxpYnMiID0geWVzOyB0aGVuCi0gICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBjeWd3aW4qIHwgbWluZ3cqKQotICAgICAgIyBkbGx0b29sIGRvZXNuJ3QgdW5kZXJzdGFuZCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgotICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Ci0gICAgICA7OwotICAgICopCi0gICAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBlZ3JlcCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCi0gICAgICBlbHNlCi0gICAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotZWxzZQotICAjIFBPUlRNRSBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBsaW5rZXIgKG5vdCBHTlUgbGQpCi0gIGNhc2UgIiRob3N0X29zIiBpbgotICBhaXgzKikKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckTEQgLW8gJG9iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAtYkU6JGV4cG9ydF9zeW1ib2xzIC1UNTEyIC1INTEyIC1iTTpTUkV+JEFSIGNydSAkbGliICRvYmpkaXIvJHNvbmFtZScKLSAgICAjIE5vdGU6IHRoaXMgbGlua2VyIGhhcmRjb2RlcyB0aGUgZGlyZWN0b3JpZXMgaW4gTElCUEFUSCBpZiB0aGVyZQotICAgICMgYXJlIG5vIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSAtTC4KLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0gICAgICAjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKLSAgICAgICMgYnJva2VuIGNvbGxlY3QyLgotICAgICAgaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCi0gICAgZmkKLSAgICA7OwotCi0gIGFpeDQqKQotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LWIgJHt3bH1ub2xpYnBhdGggJHt3bH0tYiAke3dsfWxpYnBhdGg6JGxpYmRpcjovdXNyL2xpYjovbGliJwotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JzonCi0gICAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICAgICAgY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAotICAgICAgaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYgXAotCSBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8IGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCi0gICAgICB0aGVuCi0JIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCi0JaGFyZGNvZGVfZGlyZWN0PXllcwotICAgICAgZWxzZQotCSMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKLQloYXJkY29kZV9kaXJlY3Q9dW5zdXBwb3J0ZWQKLQkjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCi0JIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKLQkjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKLQloYXJkY29kZV9taW51c19MPXllcwotCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLQloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPQotICAgICAgZmkKLSAgICAgIHNoYXJlZF9mbGFnPSctc2hhcmVkJwotICAgIGVsc2UKLSAgICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgZmkKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWJlcm9rJwotICAgIGFyY2hpdmVfY21kcz0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LWJleHBhbGwgJHt3bH0tYm5vZW50cnkke2FsbG93X3VuZGVmaW5lZF9mbGFnfScKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWJub2VudHJ5JHthbGxvd191bmRlZmluZWRfZmxhZ30nCi0gICAgY2FzZSAiJGhvc3Rfb3MiIGluIGFpeDQuWzAxXXxhaXg0LlswMV0uKikKLSAgICAgICMgQWNjb3JkaW5nIHRvIEdyZWcgV29vbGVkZ2UsIC1iZXhwYWxsIGlzIG9ubHkgc3VwcG9ydGVkIGZyb20gQUlYIDQuMiBvbgotICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcyA7OwotICAgIGVzYWMKLSAgIDs7Ci0KLSAgYW1pZ2FvcyopCi0gICAgYXJjaGl2ZV9jbWRzPSckcm0gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSIGNydSAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG9iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgZGlmZmVyZW50IHNlbWFudGljcyBvbiB0aGUgR05VIGxkIHNlY3Rpb24KLSAgICBsZF9zaGxpYnM9bm8KLSAgICA7OwotCi0gIGN5Z3dpbiogfCBtaW5ndyopCi0gICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKLSAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgotICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKLSAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyAnCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLSAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgotICAgIGxpYmV4dD1saWIKLSAgICAjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCi0gICAgYXJjaGl2ZV9jbWRzPSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkbGlua29wdHMgYGVjaG8gIiRkZXBsaWJzIiB8IHNlZCAtZSAnXCcncy8gLWxjJC8vJ1wnJ2AgLWxpbmsgLWRsbH5saW5rbmFtZXM9JwotICAgICMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0ndHJ1ZScKLSAgICAjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgotICAgIG9sZF9hcmNoaXZlX2NtZHM9J2xpYiAvT1VUOiRvbGRsaWIkb2xkb2JqcycKLSAgICBmaXhfc3JjZmlsZV9wYXRoPSdgY3lncGF0aCAtdyAkc3JjZmlsZWAnCi0gICAgOzsKLQotICBmcmVlYnNkMSopCi0gICAgbGRfc2hsaWJzPW5vCi0gICAgOzsKLQotICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKLSAgIyBzdXBwb3J0LiAgRnV0dXJlIHZlcnNpb25zIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IGFuIGV4cGxpY2l0IGMrK3J0MC5vCi0gICMgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcsIGFuZCBoZWxwcyBzaWduaWZpY2FudGx5IChhdCB0aGUgY29zdCBvZiBhIGxpdHRsZQotICAjIGV4dHJhIHNwYWNlKS4KLSAgZnJlZWJzZDIuMiopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgL3Vzci9saWIvYysrcnQwLm8nCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICAjIFVuZm9ydHVuYXRlbHksIG9sZGVyIHZlcnNpb25zIG9mIEZyZWVCU0QgMiBkbyBub3QgaGF2ZSB0aGlzIGZlYXR1cmUuCi0gIGZyZWVic2QyKikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCi0gIGZyZWVic2QqKQotICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgICBocHV4OSopIGFyY2hpdmVfY21kcz0nJHJtICRvYmpkaXIvJHNvbmFtZX4kTEQgLWIgK2IgJGluc3RhbGxfbGliZGlyIC1vICRvYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHN+dGVzdCAkb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvYmpkaXIvJHNvbmFtZSAkbGliJyA7OwotICAgICopIGFyY2hpdmVfY21kcz0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJyA7OwotICAgIGVzYWMKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKLSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILCBidXQgYXMgdGhlIGRlZmF1bHQKLQkJCSAjIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKLSAgICA7OwotCi0gIGlyaXg1KiB8IGlyaXg2KikKLSAgICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotICAgIGVsc2UKLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgZmkKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0gICAgOzsKLQotICBuZXRic2QqKQotICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJyAgIyBhLm91dAotICAgIGVsc2UKLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnICAgICAgIyBFTEYKLSAgICBmaQotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LVIkbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBvcGVuYnNkKikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIG9zMiopCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLSAgICBhcmNoaXZlX2NtZHM9JyRlY2hvICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiREVTQ1JJUFRJT04gXCIkbGlibmFtZVwiIiA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBEQVRBID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG9iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gRVhQT1JUUyA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG9iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICRvYmpkaXIvJGxpYm5hbWUuZGVmJwotICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9J2VteGltcCAtbyAkb2JqZGlyLyRsaWJuYW1lLmEgJG9iamRpci8kbGlibmFtZS5kZWYnCi0gICAgOzsKLQotICBvc2YzKikKLSAgICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgZWxzZQotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgZmkKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0gICAgOzsKLQotICBvc2Y0KiB8IG9zZjUqKSAgIyBBcyBvc2YzKiB3aXRoIHRoZSBhZGRpdGlvbiBvZiB0aGUgLW1zeW0gZmxhZwotICAgIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotICAgIGVsc2UKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJwotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotICAgIGZpCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotICAgIDs7Ci0KLSAgc2NvMy4ydjUqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0gICAgaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCi0gICAgOzsKLQotICBzb2xhcmlzKikKLSAgICBub191bmRlZmluZWRfZmxhZz0nIC16IHRleHQnCi0gICAgIyAkQ0MgLXNoYXJlZCB3aXRob3V0IEdOVSBsZCB3aWxsIG5vdCBjcmVhdGUgYSBsaWJyYXJ5IGZyb20gQysrCi0gICAgIyBvYmplY3QgZmlsZXMgYW5kIGEgc3RhdGljIGxpYnN0ZGMrKywgYmV0dGVyIGF2b2lkIGl0IGJ5IG5vdwotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotCQkkTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzfiRybSAkbGliLmV4cCcKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIGNhc2UgIiRob3N0X29zIiBpbgotICAgIHNvbGFyaXMyLlswLTVdIHwgc29sYXJpczIuWzAtNV0uKikgOzsKLSAgICAqKSAjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQotICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Jy16IGFsbGV4dHJhY3QkY29udmVuaWVuY2UgLXogZGVmYXVsdGV4dHJhY3QnIDs7Ci0gICAgZXNhYwotICAgIDs7Ci0KLSAgc3Vub3M0KikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgc3lzdjQpCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIGhhcmRjb2RlX2RpcmVjdD1ubyAjTW90b3JvbGEgbWFudWFsIHNheXMgeWVzLCBidXQgbXkgdGVzdHMgc2F5IHRoZXkgbGllIAotICAgIDs7ICAKLQotICBzeXN2NC4zKikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Jy1CZXhwb3J0JwotICAgIDs7Ci0KLSAgc3lzdjUqKQotICAgIG5vX3VuZGVmaW5lZF9mbGFnPScgLXogdGV4dCcKLSAgICAjICRDQyAtc2hhcmVkIHdpdGhvdXQgR05VIGxkIHdpbGwgbm90IGNyZWF0ZSBhIGxpYnJhcnkgZnJvbSBDKysKLSAgICAjIG9iamVjdCBmaWxlcyBhbmQgYSBzdGF0aWMgbGlic3RkYysrLCBiZXR0ZXIgYXZvaWQgaXQgYnkgbm93Ci0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0JCSRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHN+JHJtICRsaWIuZXhwJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Ci0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLSAgICA7OwotCi0gIHV0czQqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIGRndXgqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIHN5c3Y0Kk1QKikKLSAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICAgIGhhcmRjb2RlX3J1bnBhdGhfdmFyPXllcwotICAgICAgbGRfc2hsaWJzPXllcwotICAgIGZpCi0gICAgOzsKLQotICBzeXN2NC4ydXcyKikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD1ubwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICBoYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKLSAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAotICAgIDs7Ci0KLSAgdW5peHdhcmU3KikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICAqKQotICAgIGxkX3NobGlicz1ubwotICAgIDs7Ci0gIGVzYWMKLWZpCi1lY2hvICIkYWNfdCRsZF9zaGxpYnMiIDE+JjYKLXRlc3QgIiRsZF9zaGxpYnMiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi1pZiB0ZXN0IC16ICIkTk0iOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubS4uLiAkYWNfYyIgMT4mNgotICBjYXNlICIkTk0iIGluCi0gIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gICopCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUn0iCi0gICAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL3VjYiAvdXNyL2Njcy9iaW4gL2JpbjsgZG8KLSAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm0gfHwgdGVzdCAtZiAkYWNfZGlyL25tJGFjX2V4ZWV4dDsgdGhlbgotCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotCSMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0JIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotCWlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCSAgTk09IiRhY19kaXIvbm0gLUIiCi0JICBicmVhawotCWVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JICBOTT0iJGFjX2Rpci9ubSAtcCIKLQkgIGJyZWFrCi0JZWxzZQotCSAgTk09JHtOTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCSAgY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKLQlmaQotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gICAgdGVzdCAteiAiJE5NIiAmJiBOTT1ubQotICAgIDs7Ci0gIGVzYWMKLSAgZWNobyAiJGFjX3QkTk0iIDE+JjYKLWZpCi0KLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi1lY2hvICRhY19uICJjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQuLi4gJGFjX2MiIDE+JjYKLQotIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCi0jIFtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspXQotCi0jIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCi1zeW1jb2RlPSdbQkNERUdSU1RdJwotCi0jIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KLXN5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCi0KLSMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KLXN5bXhmcm09J1wxIFwyXDMgXDMnCi0KLSMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLQotIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4KikKLSAgc3ltY29kZT0nW0JDRFRdJwotICA7OwotY3lnd2luKiB8IG1pbmd3KikKLSAgc3ltY29kZT0nW0FCQ0RHSVNUV10nCi0gIDs7Ci1ocHV4KikgIyBJdHMgbGlua2VyIGRpc3Rpbmd1aXNoZXMgZGF0YSBmcm9tIGNvZGUgc3ltYm9scwotICBnbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgOzsKLWlyaXgqKQotICBzeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpcyopCi0gIHN5bWNvZGU9J1tCRFRdJwotICA7Owotc3lzdjQpCi0gIHN5bWNvZGU9J1tERk5TVFVdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBzeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgIyBXcml0ZSB0aGUgcmF3IGFuZCBDIGlkZW50aWZpZXJzLgotICBnbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbIAldXCgkc3ltY29kZVwpWyAJXVsgCV0qXCgkYWNfc3ltcHJmeFwpJHN5bXBhdCQvJHN5bXhmcm0vcCciCi0KLSAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi0gIHBpcGVfd29ya3M9bm8KLSAgJHJtIGNvbmZ0ZXN0KgotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1jaGFyIG5tX3Rlc3RfdmFyOwotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmMoKTtyZXR1cm4oMCk7fQotRU9GCi0KLSAgZWNobyAiJHByb2duYW1lOjE2MzU6IGNoZWNraW5nIGlmIGdsb2JhbF9zeW1ib2xfcGlwZSB3b3JrcyIgPiY1Ci0gIGlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MTYzNjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRvYmpleHQ7IHRoZW4KLSAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgICBubGlzdD1jb25mdGVzdC5ubQotICAgIGlmIHsgZWNobyAiJHByb2duYW1lOjE2Mzk6IGV2YWwgXCIkTk0gY29uZnRlc3QuJG9iamV4dCB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPiAkbmxpc3RcIiIgPiY1OyBldmFsICIkTk0gY29uZnRlc3QuJG9iamV4dCB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPiAkbmxpc3QgMj4mNSI7IH0gJiYgdGVzdCAtcyAiJG5saXN0IjsgdGhlbgotCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJG5saXN0IiB8IHVuaXEgPiAiJG5saXN0IlQ7IHRoZW4KLQltdiAtZiAiJG5saXN0IlQgIiRubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJG5saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17Ci1FT0YKLQkgIHNlZCAncy9eLiBcKC4qXCkgXCguKlwpJC8gIHsiXDIiLCAobHRfcHRyX3QpIFwmXDJ9LC8nIDwgIiRubGlzdCIgPj4gY29uZnRlc3QuYwotCSAgY2F0IDw8XEVPRiA+PiBjb25mdGVzdC5jCi0gIHswLCAobHRfcHRyX3QpIDB9Ci19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotRU9GCi0JICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgotCSAgbXYgY29uZnRlc3QuJG9iamV4dCBjb25mdHN0bS4kb2JqZXh0Ci0JICBzYXZlX0xJQlM9IiRMSUJTIgotCSAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JICBMSUJTPSJjb25mdHN0bS4kb2JqZXh0IgotCSAgQ0ZMQUdTPSIkQ0ZMQUdTJG5vX2J1aWx0aW5fZmxhZyIKLQkgIGlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MTY5MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0JICAgIHBpcGVfd29ya3M9eWVzCi0JICBlbHNlCi0JICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0JICAgIGNhdCBjb25mdGVzdC5jID4mNQotCSAgZmkKLQkgIExJQlM9IiRzYXZlX0xJQlMiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRubGlzdCIgPiY1Ci0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRnbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICAgIGNhdCBjb25mdGVzdC5jID4mNQotICBmaQotICAkcm0gY29uZnRlc3QqIGNvbmZ0c3QqCi0KLSAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotICBpZiB0ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgICBicmVhawotICBlbHNlCi0gICAgZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotaWYgdGVzdCAiJHBpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gIGVjaG8gIiR7YWNfdH1vayIgMT4mNgotZWxzZQotICBlY2hvICIke2FjX3R9ZmFpbGVkIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICBnbG9iYWxfc3ltYm9sX3RvX2NkZWNsPQotZmkKLQotIyBDaGVjayBoYXJkY29kaW5nIGF0dHJpYnV0ZXMuCi1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zLi4uICRhY19jIiAxPiY2Ci1oYXJkY29kZV9hY3Rpb249Ci1pZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyIgfHwgXAotICAgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotCi0gICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGFudCBkaXJlY3Rvcmllcy4KLSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gbm8gJiYKLSAgICAgIyBJZiB0aGUgb25seSBtZWNoYW5pc20gdG8gYXZvaWQgaGFyZGNvZGluZyBpcyBzaGxpYnBhdGhfdmFyLCB3ZQotICAgICAjIGhhdmUgdG8gcmVsaW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgbGluayB3aXRoIGFuIGluc3RhbGxlZCBsaWJyYXJ5Ci0gICAgICMgd2hlbiB3ZSBzaG91bGQgYmUgbGlua2luZyB3aXRoIGEgeWV0LXRvLWJlLWluc3RhbGxlZCBvbmUKLSAgICAgIyMgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiICE9IG5vICYmCi0gICAgIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiAhPSBubzsgdGhlbgotICAgICMgTGlua2luZyBhbHdheXMgaGFyZGNvZGVzIHRoZSB0ZW1wb3JhcnkgbGlicmFyeSBkaXJlY3RvcnkuCi0gICAgaGFyZGNvZGVfYWN0aW9uPXJlbGluawotICBlbHNlCi0gICAgIyBXZSBjYW4gbGluayB3aXRob3V0IGhhcmRjb2RpbmcsIGFuZCB3ZSBjYW4gaGFyZGNvZGUgbm9uZXhpc3RpbmcgZGlycy4KLSAgICBoYXJkY29kZV9hY3Rpb249aW1tZWRpYXRlCi0gIGZpCi1lbHNlCi0gICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCi0gICMgZGlyZWN0b3JpZXMuCi0gIGhhcmRjb2RlX2FjdGlvbj11bnN1cHBvcnRlZAotZmkKLWVjaG8gIiRhY190JGhhcmRjb2RlX2FjdGlvbiIgMT4mNgotCi0KLXJlbG9hZF9mbGFnPQotcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlcy4uLiAkYWNfYyIgMT4mNgotIyBQT1JUTUUgU29tZSBsaW5rZXJzIG1heSBuZWVkIGEgZGlmZmVyZW50IHJlbG9hZCBmbGFnLgotcmVsb2FkX2ZsYWc9Jy1yJwotZWNobyAiJGFjX3QkcmVsb2FkX2ZsYWciIDE+JjYKLXRlc3QgLW4gIiRyZWxvYWRfZmxhZyIgJiYgcmVsb2FkX2ZsYWc9IiAkcmVsb2FkX2ZsYWciCi0KLSMgUE9SVE1FIEZpbGwgaW4geW91ciBsZC5zbyBjaGFyYWN0ZXJpc3RpY3MKLWxpYnJhcnlfbmFtZXNfc3BlYz0KLWxpYm5hbWVfc3BlYz0nbGliJG5hbWUnCi1zb25hbWVfc3BlYz0KLXBvc3RpbnN0YWxsX2NtZHM9Ci1wb3N0dW5pbnN0YWxsX2NtZHM9Ci1maW5pc2hfY21kcz0KLWZpbmlzaF9ldmFsPQotc2hsaWJwYXRoX3Zhcj0KLXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD11bmtub3duCi12ZXJzaW9uX3R5cGU9bm9uZQotZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgotc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIiCi1zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCi1maWxlX21hZ2ljX2NtZD0KLWZpbGVfbWFnaWNfdGVzdF9maWxlPQotZGVwbGlic19jaGVja19tZXRob2Q9J3Vua25vd24nCi0jIE5lZWQgdG8gc2V0IHRoZSBwcmVjZWRpbmcgdmFyaWFibGUgb24gYWxsIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQKLSMgaW50ZXJsaWJyYXJ5IGRlcGVuZGVuY2llcy4KLSMgJ25vbmUnIC0tIGRlcGVuZGVuY2llcyBub3Qgc3VwcG9ydGVkLgotIyBgdW5rbm93bicgLS0gc2FtZSBhcyBub25lLCBidXQgZG9jdW1lbnRzIHRoYXQgd2UgcmVhbGx5IGRvbid0IGtub3cuCi0jICdwYXNzX2FsbCcgLS0gYWxsIGRlcGVuZGVuY2llcyBwYXNzZWQgd2l0aCBubyBjaGVja3MuCi0jICd0ZXN0X2NvbXBpbGUnIC0tIGNoZWNrIGJ5IG1ha2luZyB0ZXN0IHByb2dyYW0uCi0jICdmaWxlX21hZ2ljIFtyZWdleF0nIC0tIGNoZWNrIGJ5IGxvb2tpbmcgZm9yIGZpbGVzIGluIGxpYnJhcnkgcGF0aAotIyB3aGljaCByZXNwb25kcyB0byB0aGUgJGZpbGVfbWFnaWNfY21kIHdpdGggYSBnaXZlbiBlZ3JlcCByZWdleC4KLSMgSWYgeW91IGhhdmUgYGZpbGUnIG9yIGVxdWl2YWxlbnQgb24geW91ciBzeXN0ZW0gYW5kIHlvdSdyZSBub3Qgc3VyZQotIyB3aGV0aGVyIGBwYXNzX2FsbCcgd2lsbCAqYWx3YXlzKiB3b3JrLCB5b3UgcHJvYmFibHkgd2FudCB0aGlzIG9uZS4KLWVjaG8gJGFjX24gImNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcy4uLiAkYWNfYyIgMT4mNgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICRsaWJuYW1lLmEnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotCi0gICMgQUlYIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgOzsKLQotYWl4NCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICAjIEFJWCBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0Ci0gICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KLSAgIyBjb2xsZWN0Miwgc28gYWRkaXRpb25hbCBsaW5rcyBjYW4gYmUgdXNlZnVsIGluIGZ1dHVyZS4KLSAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhvdWdoIEFJWDQuMgotICAjIGFuZCBsYXRlciBsaW5rZXIgc3VwcG9ydHMgLnNvCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLmEnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotICBkZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1hbWlnYW9zKikKLSAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKLSAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KLSAgZmluaXNoX2V2YWw9J2ZvciBsaWIgaW4gYGxzICRsaWJkaXIvKi5peGxpYnJhcnkgMj4vZGV2L251bGxgOyBkbyBsaWJuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ1wnJ3MlXi4qL1woW14vXSpcKVwuaXhsaWJyYXJ5JCVcMSUnXCcnYDsgdGVzdCAkcm0gL3N5cy9saWJzLyR7bGlibmFtZX1faXhsaWJyYXJ5LmE7ICRzaG93ICIoY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSkiOyAoY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSkgfHwgZXhpdCAxOyBkb25lJwotICA7OwotCi1iZW9zKikKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9LnNvJwotICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCi0gIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIGx0X2N2X2Rsb3Blbj0ibG9hZF9hZGRfb24iCi0gIGx0X2N2X2Rsb3Blbl9saWJzPQotICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMKLSAgOzsKLQotYnNkaTQqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKScKLSAgZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICBmaWxlX21hZ2ljX3Rlc3RfZmlsZT0vc2hsaWIvbGliYy5zbwotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgotICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9LXJkeW5hbWljCi0gICMgdGhlIGRlZmF1bHQgbGQuc28uY29uZiBhbHNvIGNvbnRhaW5zIC91c3IvY29udHJpYi9saWIgYW5kCi0gICMgL3Vzci9YMTFSNi9saWIgKC91c3IvWDExIGlzIGEgbGluayB0byAvdXNyL1gxMVI2KSwgYnV0IGxldCB1cyBhbGxvdwotICAjIGxpYnRvb2wgdG8gaGFyZC1jb2RlIHRoZXNlIGludG8gcHJvZ3JhbXMKLSAgOzsKLQotY3lnd2luKiB8IG1pbmd3KikKLSAgdmVyc2lvbl90eXBlPXdpbmRvd3MKLSAgbmVlZF92ZXJzaW9uPW5vCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8IHNlZCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0uZGxsICRsaWJuYW1lLmEnCi0gIGVsc2UKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgc2VkIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fS5kbGwgJGxpYm5hbWUubGliJwotICBmaQotICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJwotICBkZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBmaWxlIGZvcm1hdCBwZWkqLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpPycKLSAgZmlsZV9tYWdpY19jbWQ9JyR7T0JKRFVNUH0gLWYnCi0gICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgotICBzaGxpYnBhdGhfdmFyPVBBVEgKLSAgbHRfY3ZfZGxvcGVuPSJMb2FkTGlicmFyeSIKLSAgbHRfY3ZfZGxvcGVuX2xpYnM9Ci0gIDs7Ci0KLWZyZWVic2QxKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLSAgCi1mcmVlYnNkKikKLSAgb2JqZm9ybWF0PWB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdCAmJiAvdXNyL2Jpbi9vYmpmb3JtYXQgfHwgZWNobyBhb3V0YAotICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC0kb2JqZm9ybWF0Ci0gIGNhc2UgIiR2ZXJzaW9uX3R5cGUiIGluCi0gICAgZnJlZWJzZC1lbGYqKQotICAgICAgZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTE1dU0Igc2hhcmVkIG9iamVjdCcKLSAgICAgIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgICAgIGZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28qYAotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28gJGxpYm5hbWUuc28nCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBmcmVlYnNkLSopCi0gICAgICBkZXBsaWJzX2NoZWNrX21ldGhvZD11bmtub3duCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAkbGlibmFtZS5zbyR2ZXJzdWZmaXgnCi0gICAgICBuZWVkX3ZlcnNpb249eWVzCi0gICAgICA7OwotICBlc2FjCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGNhc2UgIiRob3N0X29zIiBpbgotICBmcmVlYnNkMiogfCBmcmVlYnNkMy5bMDFdKiB8IGZyZWVic2RlbGYzLlswMV0qKQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgICA7OwotICAqKSAjIGZyb20gMy4yIG9uCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgOzsKLSAgZXNhYwotICA7OwotCi1nbnUqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR7bWFqb3J9ICR7bGlibmFtZX0uc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0gICMgR2l2ZSBhIHNvbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWpvciB2ZXJzaW9uIHNvIHRoYXQgZGxkLnNsIHJlZnVzZXMgdG8KLSAgIyBsaW5rIGFnYWluc3Qgb3RoZXIgdmVyc2lvbnMuCi0gIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8gIyArcyBpcyByZXF1aXJlZCB0byBlbmFibGUgU0hMSUJfUEFUSAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNsJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbCRtYWpvciAkbGlibmFtZS5zbCcKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNsJG1ham9yJwotICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NS4KLSAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCi0gIDs7Ci0KLWlyaXg1KiB8IGlyaXg2KikKLSAgdmVyc2lvbl90eXBlPWlyaXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvICRsaWJuYW1lLnNvJwotICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgaXJpeDUqKQotICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KLSAgICAjIHRoaXMgd2lsbCBiZSBvdmVycmlkZGVuIHdpdGggcGFzc19hbGwsIGJ1dCBsZXQgdXMga2VlcCBpdCBqdXN0IGluIGNhc2UKLSAgICBkZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgMzItYml0IE1TQiBkeW5hbWljIGxpYiBNSVBTIC0gdmVyc2lvbiAxIgotICAgIDs7Ci0gICopCi0gICAgY2FzZSAiJExEIiBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECi0gICAgKi0zMnwqIi0zMiAiKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPTMyLWJpdDs7Ci0gICAgKi1uMzJ8KiItbjMyICIpIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiBsaWJtYWdpYz1OMzI7OwotICAgICotNjR8KiItNjQgIikgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgbGlibWFnaWM9NjQtYml0OzsKLSAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgZXNhYwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUlkke3NobGlic3VmZn1fUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IgotICBmaWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC9saWIke2xpYnN1ZmZ9L2xpYmMuc28qYAotICBkZXBsaWJzX2NoZWNrX21ldGhvZD0ncGFzc19hbGwnCi0gIDs7Ci0KLSMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KLWxpbnV4LWdudW9sZGxkKiB8IGxpbnV4LWdudWFvdXQqIHwgbGludXgtZ251Y29mZiopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLSMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KLWxpbnV4LWdudSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBkZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtMTV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiApJwotICBmaWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC9saWIvbGliYy5zbyogL2xpYi9saWJjLSouc29gCi0KLSAgaWYgdGVzdCAtZiAvbGliL2xkLnNvLjE7IHRoZW4KLSAgICBkeW5hbWljX2xpbmtlcj0nR05VIGxkLnNvJwotICBlbHNlCi0gICAgIyBPbmx5IHRoZSBHTlUgbGQuc28gc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyBvbiBNa0xpbnV4LgotICAgIGNhc2UgIiRob3N0X2NwdSIgaW4KLSAgICBwb3dlcnBjKikgZHluYW1pY19saW5rZXI9bm8gOzsKLSAgICAqKSBkeW5hbWljX2xpbmtlcj0nTGludXggbGQuc28nIDs7Ci0gICAgZXNhYwotICBmaQotICA7OwotCi1uZXRic2QqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0uc28kdmVyc3VmZml4JwotICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCi0gICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJwotICBlbHNlCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28gJHtsaWJuYW1lfS5zbycKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gICAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCi0gIGZpCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLW9wZW5ic2QqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgIG5lZWRfdmVyc2lvbj1ubwotICBmaQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9LnNvJHZlcnN1ZmZpeCcKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotb3MyKikKLSAgbGlibmFtZV9zcGVjPSckbmFtZScKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsICRsaWJuYW1lLmEnCi0gIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIDs7Ci0KLW9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgdmVyc2lvbl90eXBlPW9zZgotICBuZWVkX3ZlcnNpb249bm8KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyAkbGlibmFtZS5zbycKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgIyB0aGlzIHdpbGwgYmUgb3ZlcnJpZGRlbiB3aXRoIHBhc3NfYWxsLCBidXQgbGV0IHVzIGtlZXAgaXQganVzdCBpbiBjYXNlCi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIENPRkYgZm9ybWF0IGFscGhhIHNoYXJlZCBsaWJyYXJ5JwotICBmaWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdwYXNzX2FsbCcKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCi0gIDs7Ci0KLXNjbzMuMnY1KikKLSAgdmVyc2lvbl90eXBlPW9zZgotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1zb2xhcmlzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQotICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJwotICBkZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XS1iaXQgW0xNXVNCIGR5bmFtaWMgbGliIgotICBmaWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGZpbGVfbWFnaWNfdGVzdF9maWxlPS9saWIvbGliYy5zbwotICA7OwotCi1zdW5vczQqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfS5zbyR2ZXJzdWZmaXgnCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICBmaQotICBuZWVkX3ZlcnNpb249eWVzCi0gIDs7Ci0KLXN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKiB8IHN5c3Y1KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGNhc2UgIiRob3N0X3ZlbmRvciIgaW4KLSAgICBuY3IpCi0gICAgICBkZXBsaWJzX2NoZWNrX21ldGhvZD0ncGFzc19hbGwnCi0gICAgICA7OwotICAgIG1vdG9yb2xhKQotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvY2NzL2xpYicKLSAgICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKSBNWzAtOV1bMC05XSogVmVyc2lvbiBbMC05XScKLSAgICAgIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgICAgIGZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28qYAotICAgICAgOzsKLSAgZXNhYwotICA7OwotCi11dHM0KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLWRndXgqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1zeXN2NCpNUCopCi0gIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KLSAgICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLnNvLiR2ZXJzdWZmaXggJGxpYm5hbWUuc28uJG1ham9yICRsaWJuYW1lLnNvJwotICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZS5zby4kbWFqb3InCi0gICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgZmkKLSAgOzsKLQotKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLWVzYWMKLWVjaG8gIiRhY190JGR5bmFtaWNfbGlua2VyIiAxPiY2Ci10ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubwotCi0jIFJlcG9ydCB0aGUgZmluYWwgY29uc2VxdWVuY2VzLgotZWNobyAiY2hlY2tpbmcgaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICRjYW5fYnVpbGRfc2hhcmVkIiAxPiY2Ci0KLSMgT25seSB0cnkgdG8gYnVpbGQgd2luMzIgZGxscyBpZiBBQ19MSUJUT09MX1dJTjMyX0RMTCB3YXMgdXNlZCBpbgotIyBjb25maWd1cmUuaW4sIG90aGVyd2lzZSBidWlsZCBzdGF0aWMgb25seSBsaWJyYXJpZXMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWN5Z3dpbiogfCBtaW5ndyogfCBvczIqKQotICBpZiB0ZXN0IHgkY2FuX2J1aWxkX3NoYXJlZCA9IHh5ZXM7IHRoZW4KLSAgICB0ZXN0IHgkZW5hYmxlX3dpbjMyX2RsbCA9IHhubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgZWNobyAiY2hlY2tpbmcgaWYgcGFja2FnZSBzdXBwb3J0cyBkbGxzLi4uICRjYW5fYnVpbGRfc2hhcmVkIiAxPiY2Ci0gIGZpCi07OwotZXNhYwotCi1pZiB0ZXN0IC1uICIkZmlsZV9tYWdpY190ZXN0X2ZpbGUiICYmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX2NtZCI7IHRoZW4KLSAgY2FzZSAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiBpbgotICAiZmlsZV9tYWdpYyAiKikKLSAgICBmaWxlX21hZ2ljX3JlZ2V4PSJgZXhwciBcIiRkZXBsaWJzX2NoZWNrX21ldGhvZFwiIDogXCJmaWxlX21hZ2ljIFwoLipcKVwiYCIKLSAgICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcJGZpbGVfbWFnaWNfdGVzdF9maWxlIDI+IC9kZXYvbnVsbCB8Ci0gICAgICAgZWdyZXAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgOgotICAgIGVsc2UKLSAgICAgIGNhdCA8PEVPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiB0aGUgY29tbWFuZCBsaWJ0b29sIHVzZXMgdG8gZGV0ZWN0IHNoYXJlZCBsaWJyYXJpZXMsCi0qKiogJGZpbGVfbWFnaWNfY21kLCBwcm9kdWNlcyBvdXRwdXQgdGhhdCBsaWJ0b29sIGNhbm5vdCByZWNvZ25pemUuCi0qKiogVGhlIHJlc3VsdCBpcyB0aGF0IGxpYnRvb2wgbWF5IGZhaWwgdG8gcmVjb2duaXplIHNoYXJlZCBsaWJyYXJpZXMKLSoqKiBhcyBzdWNoLiAgVGhpcyB3aWxsIGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMgdGhhdAotKioqIGRlcGVuZCBvbiBzaGFyZWQgbGlicmFyaWVzLCBidXQgcHJvZ3JhbXMgbGlua2VkIHdpdGggc3VjaCBsaWJ0b29sCi0qKiogbGlicmFyaWVzIHdpbGwgd29yayByZWdhcmRsZXNzIG9mIHRoaXMgcHJvYmxlbS4gIE5ldmVydGhlbGVzcywgeW91Ci0qKiogbWF5IHdhbnQgdG8gcmVwb3J0IHRoZSBwcm9ibGVtIHRvIHlvdXIgc3lzdGVtIG1hbmFnZXIgYW5kL29yIHRvCi0qKiogYnVnLWxpYnRvb2xAZ251Lm9yZwotCi1FT0YKLSAgICBmaSA7OwotICBlc2FjCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuLi4gJGFjX2MiIDE+JjYKLXRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubwotCi0jIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKLSMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4MyopCi0gIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgotICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKLSAgZmkKLSAgOzsKLQotYWl4NCopCi0gIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0gIDs7Ci1lc2FjCi0KLWVjaG8gIiRhY190JGVuYWJsZV9zaGFyZWQiIDE+JjYKLQotIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKLQotZWNobyAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLi4uICRlbmFibGVfc3RhdGljIiAxPiY2Ci0KLWlmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gcmVsaW5rOyB0aGVuCi0gICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi1lbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8Ci0gICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCi0gICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2JqZGlyLi4uICRhY19jIiAxPiY2Ci1ybSAtZiAubGlicyAyPi9kZXYvbnVsbAotbWtkaXIgLmxpYnMgMj4vZGV2L251bGwKLWlmIHRlc3QgLWQgLmxpYnM7IHRoZW4KLSAgb2JqZGlyPS5saWJzCi1lbHNlCi0gICMgTVMtRE9TIGRvZXMgbm90IGFsbG93IGZpbGVuYW1lcyB0aGF0IGJlZ2luIHdpdGggYSBkb3QuCi0gIG9iamRpcj1fbGlicwotZmkKLXJtZGlyIC5saWJzIDI+L2Rldi9udWxsCi1lY2hvICIkYWNfdCRvYmpkaXIiIDE+JjYKLQotaWYgdGVzdCAieCRlbmFibGVfZGxvcGVuIiAhPSB4eWVzOyB0aGVuCi0gIGVuYWJsZV9kbG9wZW49dW5rbm93bgotICBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93bgotICBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24KLWVsc2UKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsdF9jdl9kbG9wZW4nK3NldH0nYFwiICE9IHNldCI7IHRoZW4KLSAgbHRfY3ZfZGxvcGVuPW5vIGx0X2N2X2Rsb3Blbl9saWJzPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gIiRwcm9nbmFtZToyMjEyOiBjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiID4mNQotYWNfbGliX3Zhcj1gZWNobyBkbCdfJ2Rsb3BlbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxkbCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjIwICJsdGNvbmZpZyIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGRsb3BlbigpOwotCi1pbnQgbWFpbigpIHsKLWRsb3BlbigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjIzMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBkbG9wZW4iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjIyNTI6IGNoZWNraW5nIGZvciBkbG9wZW4iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfZGxvcGVuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjI1NyAibHRjb25maWciCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBkbG9wZW4oKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZGxvcGVuKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfZGxvcGVuKSB8fCBkZWZpbmVkIChfX3N0dWJfX19kbG9wZW4pCi1jaG9rZSBtZQotI2Vsc2UKLWRsb3BlbigpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToyMjgyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jX2Rsb3Blbj15ZXMiCi1lbHNlCi0gIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfZGxvcGVuPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJ2Rsb3BlbmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBsdF9jdl9kbG9wZW49ImRsb3BlbiIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZGxkX2xpbmsgaW4gLWxkbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjIyOTk6IGNoZWNraW5nIGZvciBkbGRfbGluayBpbiAtbGRsZCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGRsZCdfJ2RsZF9saW5rIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGRsZCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzA3ICJsdGNvbmZpZyIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGRsZF9saW5rKCk7Ci0KLWludCBtYWluKCkgewotZGxkX2xpbmsoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjIzMjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGx0X2N2X2Rsb3Blbj0iZGxkX2xpbmsiIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsZCIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2hsX2xvYWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjIzMzk6IGNoZWNraW5nIGZvciBzaGxfbG9hZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19zaGxfbG9hZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzNDQgImx0Y29uZmlnIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgc2hsX2xvYWQoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgc2hsX2xvYWQoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl9zaGxfbG9hZCkgfHwgZGVmaW5lZCAoX19zdHViX19fc2hsX2xvYWQpCi1jaG9rZSBtZQotI2Vsc2UKLXNobF9sb2FkKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjIzNjk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfc2hsX2xvYWQ9eWVzIgotZWxzZQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jX3NobF9sb2FkPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nc2hsX2xvYWRgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2hsX2xvYWQgaW4gLWxkbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjIzODc6IGNoZWNraW5nIGZvciBzaGxfbG9hZCBpbiAtbGRsZCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGRsZCdfJ3NobF9sb2FkIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGRsZCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzk1ICJsdGNvbmZpZyIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgc2hsX2xvYWQoKTsKLQotaW50IG1haW4oKSB7Ci1zaGxfbG9hZCgpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjQwOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGxkIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotZmkKLQotICAgIAotZmkKLQotICAKLWZpCi0KLQotZmkKLQotZmkKLQotICBpZiB0ZXN0ICJ4JGx0X2N2X2Rsb3BlbiIgIT0geG5vOyB0aGVuCi0gICAgZW5hYmxlX2Rsb3Blbj15ZXMKLSAgZmkKLQotICBjYXNlICIkbHRfY3ZfZGxvcGVuIiBpbgotICBkbG9wZW4pCi1mb3IgYWNfaGRyIGluIGRsZmNuLmg7IGRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gIiRwcm9nbmFtZToyNDUyOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ1NyAibHRjb25maWciCi0jaW5jbHVkZSA8JGFjX2hkcj4KLWludCBmbm9yZCA9IDA7Ci1FT0YKLWFjX3RyeT0iJGFjX2NvbXBpbGUgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjQ2MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgIGlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geHllczsgdGhlbgotICAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtREhBVkVfRExGQ05fSCIKLSAgICBmaQotICAgIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKLSAgICBMSUJTPSIkbHRfY3ZfZGxvcGVuX2xpYnMgJExJQlMiCi0KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjI0OTA6IGNoZWNraW5nIHdoZXRoZXIgYSBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiA+JjUKLWlmIHRlc3QgIiR7bHRfY3ZfZGxvcGVuX3NlbGYrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgICBsdF9jdl9kbG9wZW5fc2VsZj1jcm9zcwotICBlbHNlCi0gICAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2xpbmUgMjQ5OCAibHRjb25maWciCi0KLSNpZiBIQVZFX0RMRkNOX0gKLSNpbmNsdWRlIDxkbGZjbi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZkZWYgUlRMRF9HTE9CQUwKLSMgZGVmaW5lIExURExfR0xPQkFMCVJUTERfR0xPQkFMCi0jZWxzZQotIyBpZmRlZiBETF9HTE9CQUwKLSMgIGRlZmluZSBMVERMX0dMT0JBTAlETF9HTE9CQUwKLSMgZWxzZQotIyAgZGVmaW5lIExURExfR0xPQkFMCTAKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBXZSBtYXkgaGF2ZSB0byBkZWZpbmUgTFRETF9MQVpZX09SX05PVyBpbiB0aGUgY29tbWFuZCBsaW5lIGlmIHdlCi0gICBmaW5kIG91dCBpdCBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0uICovCi0jaWZuZGVmIExURExfTEFaWV9PUl9OT1cKLSMgaWZkZWYgUlRMRF9MQVpZCi0jICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwlSVExEX0xBWlkKLSMgZWxzZQotIyAgaWZkZWYgRExfTEFaWQotIyAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCURMX0xBWlkKLSMgIGVsc2UKLSMgICBpZmRlZiBSVExEX05PVwotIyAgICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwlSVExEX05PVwotIyAgIGVsc2UKLSMgICAgaWZkZWYgRExfTk9XCi0jICAgICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwlETF9OT1cKLSMgICAgZWxzZQotIyAgICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJMAotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWZub3JkKCkgeyBpbnQgaT00Mjt9Ci1tYWluKCkgeyB2b2lkICpzZWxmLCAqcHRyMSwgKnB0cjI7IHNlbGY9ZGxvcGVuKDAsTFRETF9HTE9CQUx8TFRETF9MQVpZX09SX05PVyk7Ci0gICAgaWYoc2VsZikgeyBwdHIxPWRsc3ltKHNlbGYsImZub3JkIik7IHB0cjI9ZGxzeW0oc2VsZiwiX2Zub3JkIik7Ci0JICAgICAgIGlmKHB0cjEgfHwgcHRyMikgeyBkbGNsb3NlKHNlbGYpOyBleGl0KDApOyB9IH0gZXhpdCgxKTsgfSAKLQotRU9GCi1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjI1NDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCi1lbHNlCi0gIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGx0X2N2X2Rsb3Blbl9zZWxmPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRsdF9jdl9kbG9wZW5fc2VsZiIgMT4mNgotCi0gIGlmIHRlc3QgIiRsdF9jdl9kbG9wZW5fc2VsZiIgPSB5ZXM7IHRoZW4KLSAgICBMREZMQUdTPSIkTERGTEFHUyAkbGlua19zdGF0aWNfZmxhZyIKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjI1NjM6IGNoZWNraW5nIHdoZXRoZXIgYSBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiA+JjUKLWlmIHRlc3QgIiR7bHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPWNyb3NzCi0gIGVsc2UKLSAgICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jbGluZSAyNTcxICJsdGNvbmZpZyIKLQotI2lmIEhBVkVfRExGQ05fSAotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBSVExEX0dMT0JBTAotIyBkZWZpbmUgTFRETF9HTE9CQUwJUlRMRF9HTE9CQUwKLSNlbHNlCi0jIGlmZGVmIERMX0dMT0JBTAotIyAgZGVmaW5lIExURExfR0xPQkFMCURMX0dMT0JBTAotIyBlbHNlCi0jICBkZWZpbmUgTFRETF9HTE9CQUwJMAotIyBlbmRpZgotI2VuZGlmCi0KLS8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVERMX0xBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKLSAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KLSNpZm5kZWYgTFRETF9MQVpZX09SX05PVwotIyBpZmRlZiBSVExEX0xBWlkKLSMgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCVJUTERfTEFaWQotIyBlbHNlCi0jICBpZmRlZiBETF9MQVpZCi0jICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJRExfTEFaWQotIyAgZWxzZQotIyAgIGlmZGVmIFJUTERfTk9XCi0jICAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCVJUTERfTk9XCi0jICAgZWxzZQotIyAgICBpZmRlZiBETF9OT1cKLSMgICAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCURMX05PVwotIyAgICBlbHNlCi0jICAgICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwkwCi0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotZm5vcmQoKSB7IGludCBpPTQyO30KLW1haW4oKSB7IHZvaWQgKnNlbGYsICpwdHIxLCAqcHRyMjsgc2VsZj1kbG9wZW4oMCxMVERMX0dMT0JBTHxMVERMX0xBWllfT1JfTk9XKTsKLSAgICBpZihzZWxmKSB7IHB0cjE9ZGxzeW0oc2VsZiwiZm5vcmQiKTsgcHRyMj1kbHN5bShzZWxmLCJfZm5vcmQiKTsKLSAgICBpZihwdHIxIHx8IHB0cjIpIHsgZGxjbG9zZShzZWxmKTsgZXhpdCgwKTsgfSB9IGV4aXQoMSk7IH0gCi0KLUVPRgotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToyNjE3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMKLWVsc2UKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMiIDE+JjYKLWZpCi0gICAgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRsdF9jdl9kbG9wZW5fc2VsZiIgaW4KLSAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGY9JGx0X2N2X2Rsb3Blbl9zZWxmIDs7Ci0gICopIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIiBpbgotICB5ZXN8bm8pIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9JGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyA7OwotICAqKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24gOzsKLSAgZXNhYwotZmkKLQotIyBDb3B5IGVjaG8gYW5kIHF1b3RlIHRoZSBjb3B5LCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCwgYmVjYXVzZSBpdCBpcwotIyB1c2VkIGxhdGVyLgotbHRlY2hvPSIkZWNobyIKLWlmIHRlc3QgIlgkbHRlY2hvIiA9ICJYJENPTkZJR19TSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iOyB0aGVuCi0gICBsdGVjaG89IiRDT05GSUdfU0hFTEwgXCQwIC0tZmFsbGJhY2stZWNobyIKLWZpCi1MVFNIRUxMPSIkU0hFTEwiCi0KLUxUQ09ORklHX1ZFUlNJT049IiRWRVJTSU9OIgotCi0jIE9ubHkgcXVvdGUgdmFyaWFibGVzIGlmIHdlJ3JlIHVzaW5nIGx0bWFpbi5zaC4KLWNhc2UgIiRsdG1haW4iIGluCi0qLnNoKQotICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzLgotICBmb3IgdmFyIGluIGx0ZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBvbGRfQ1BQRkxBR1MgXAotICAgIG9sZF9MRCBvbGRfTERGTEFHUyBvbGRfTElCUyBcCi0gICAgb2xkX05NIG9sZF9SQU5MSUIgb2xkX0xOX1Mgb2xkX0RMTFRPT0wgb2xkX09CSkRVTVAgb2xkX0FTIFwKLSAgICBBUiBDQyBMRCBMTl9TIE5NIExUU0hFTEwgTFRDT05GSUdfVkVSU0lPTiBcCi0gICAgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgd2wgXAotICAgIHBpY19mbGFnIGxpbmtfc3RhdGljX2ZsYWcgbm9fYnVpbHRpbl9mbGFnIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyBcCi0gICAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIGxpYm5hbWVfc3BlYyBcCi0gICAgbGlicmFyeV9uYW1lc19zcGVjIHNvbmFtZV9zcGVjIFwKLSAgICBSQU5MSUIgb2xkX2FyY2hpdmVfY21kcyBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIG9sZF9wb3N0aW5zdGFsbF9jbWRzIFwKLSAgICBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIGFyY2hpdmVfY21kcyBhcmNoaXZlX2V4cHN5bV9jbWRzIHBvc3RpbnN0YWxsX2NtZHMgcG9zdHVuaW5zdGFsbF9jbWRzIFwKLSAgICBmaWxlX21hZ2ljX2NtZCBleHBvcnRfc3ltYm9sc19jbWRzIGRlcGxpYnNfY2hlY2tfbWV0aG9kIGFsbG93X3VuZGVmaW5lZF9mbGFnIG5vX3VuZGVmaW5lZF9mbGFnIFwKLSAgICBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBnbG9iYWxfc3ltYm9sX3BpcGUgZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yICBcCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKLSAgICBjb21waWxlcl9jX28gY29tcGlsZXJfb19sbyBuZWVkX2xvY2tzIGV4Y2x1ZGVfZXhwc3ltcyBpbmNsdWRlX2V4cHN5bXM7IGRvCi0KLSAgICBjYXNlICIkdmFyIiBpbgotICAgIHJlbG9hZF9jbWRzIHwgb2xkX2FyY2hpdmVfY21kcyB8IG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMgfCBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgfCBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHMgfCBhcmNoaXZlX2NtZHMgfCBhcmNoaXZlX2V4cHN5bV9jbWRzIHwgXAotICAgIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBcCi0gICAgZmluaXNoX2NtZHMgfCBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKLSAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KLSAgICAgIGV2YWwgIiR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgICopCi0gICAgICBldmFsICIkdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotCi0gIGNhc2UgIiRsdGVjaG8iIGluCi0gIConXCQwIC0tZmFsbGJhY2stZWNobyInKQotICAgIGx0ZWNobz1gJGVjaG8gIlgkbHRlY2hvIiB8ICRYc2VkIC1lICdzL1xcXFxcXFwkMCAtLWZhbGxiYWNrLWVjaG8iJC8kMCAtLWZhbGxiYWNrLWVjaG8iLydgCi0gICAgOzsKLSAgZXNhYwotCi0gIHRyYXAgIiRybSBcIiRvZmlsZVwiOyBleGl0IDEiIDEgMiAxNQotICBlY2hvICJjcmVhdGluZyAkb2ZpbGUiCi0gICRybSAiJG9maWxlIgotICBjYXQgPDxFT0YgPiAiJG9maWxlIgotIyEgJFNIRUxMCi0KLSMgYCRlY2hvICIkb2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QKQotIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdGNvbmZpZyBvciBsdG1haW4uc2guCi0jCi0jIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBPcmlnaW5hbGx5IGJ5IEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgU2VkIHRoYXQgaGVscHMgdXMgYXZvaWQgYWNjaWRlbnRhbGx5IHRyaWdnZXJpbmcgZWNobygxKSBvcHRpb25zIGxpa2UgLW4uCi1Yc2VkPSJzZWQgLWUgcy9eWC8vIgotCi0jIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAotIyBpZiBDRFBBVEggaXMgc2V0LgotaWYgdGVzdCAiWFwke0NEUEFUSCtzZXR9IiA9IFhzZXQ7IHRoZW4gQ0RQQVRIPTo7IGV4cG9ydCBDRFBBVEg7IGZpCi0KLSMjIyBCRUdJTiBMSUJUT09MIENPTkZJRwotRU9GCi0gIGNmZ2ZpbGU9IiRvZmlsZSIKLSAgOzsKLQotKikKLSAgIyBEb3VibGUtcXVvdGUgdGhlIHZhcmlhYmxlcyB0aGF0IG5lZWQgaXQgKGZvciBhZXN0aGV0aWNzKS4KLSAgZm9yIHZhciBpbiBvbGRfQ0Mgb2xkX0NGTEFHUyBvbGRfQ1BQRkxBR1MgXAotICAgIG9sZF9MRCBvbGRfTERGTEFHUyBvbGRfTElCUyBcCi0gICAgb2xkX05NIG9sZF9SQU5MSUIgb2xkX0xOX1Mgb2xkX0RMTFRPT0wgb2xkX09CSkRVTVAgb2xkX0FTOyBkbwotICAgIGV2YWwgIiR2YXI9XFxcIlwkdmFyXFxcIiIKLSAgZG9uZQotCi0gICMgSnVzdCBjcmVhdGUgYSBjb25maWcgZmlsZS4KLSAgY2ZnZmlsZT0iJG9maWxlLmNmZyIKLSAgdHJhcCAiJHJtIFwiJGNmZ2ZpbGVcIjsgZXhpdCAxIiAxIDIgMTUKLSAgZWNobyAiY3JlYXRpbmcgJGNmZ2ZpbGUiCi0gICRybSAiJGNmZ2ZpbGUiCi0gIGNhdCA8PEVPRiA+ICIkY2ZnZmlsZSIKLSMgYCRlY2hvICIkY2ZnZmlsZSIgfCBzZWQgJ3MlXi4qLyUlJ2AgLSBMaWJ0b29sIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVApCi1FT0YKLSAgOzsKLWVzYWMKLQotY2F0IDw8RU9GID4+ICIkY2ZnZmlsZSIKLSMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgQ0M9JG9sZF9DQyBDRkxBR1M9JG9sZF9DRkxBR1MgQ1BQRkxBR1M9JG9sZF9DUFBGTEFHUyBcXAotIyBMRD0kb2xkX0xEIExERkxBR1M9JG9sZF9MREZMQUdTIExJQlM9JG9sZF9MSUJTIFxcCi0jIE5NPSRvbGRfTk0gUkFOTElCPSRvbGRfUkFOTElCIExOX1M9JG9sZF9MTl9TIFxcCi0jIERMTFRPT0w9JG9sZF9ETExUT09MIE9CSkRVTVA9JG9sZF9PQkpEVU1QIEFTPSRvbGRfQVMgXFwKLSMgICAkMCRsdGNvbmZpZ19hcmdzCi0jCi0jIENvbXBpbGVyIGFuZCBvdGhlciB0ZXN0IG91dHB1dCBwcm9kdWNlZCBieSAkcHJvZ25hbWUsIHVzZWZ1bCBmb3IKLSMgZGVidWdnaW5nICRwcm9nbmFtZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotIyBUaGUgdmVyc2lvbiBvZiAkcHJvZ25hbWUgdGhhdCBnZW5lcmF0ZWQgdGhpcyBzY3JpcHQuCi1MVENPTkZJR19WRVJTSU9OPSRMVENPTkZJR19WRVJTSU9OCi0KLSMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KLVNIRUxMPSRMVFNIRUxMCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCi1idWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbi4KLWZhc3RfaW5zdGFsbD0kZW5hYmxlX2Zhc3RfaW5zdGFsbAotCi0jIFRoZSBob3N0IHN5c3RlbS4KLWhvc3RfYWxpYXM9JGhvc3RfYWxpYXMKLWhvc3Q9JGhvc3QKLQotIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi1lY2hvPSRsdGVjaG8KLQotIyBUaGUgYXJjaGl2ZXIuCi1BUj0kQVIKLQotIyBUaGUgZGVmYXVsdCBDIGNvbXBpbGVyLgotQ0M9JENDCi0KLSMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KLUxEPSRMRAotCi0jIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCi1MTl9TPSRMTl9TCi0KLSMgQSBCU0QtY29tcGF0aWJsZSBubSBwcm9ncmFtLgotTk09JE5NCi0KLSMgVXNlZCBvbiBjeWd3aW46IERMTCBjcmVhdGlvbiBwcm9ncmFtLgotRExMVE9PTD0iJERMTFRPT0wiCi0KLSMgVXNlZCBvbiBjeWd3aW46IG9iamVjdCBkdW1wZXIuCi1PQkpEVU1QPSIkT0JKRFVNUCIKLQotIyBVc2VkIG9uIGN5Z3dpbjogYXNzZW1ibGVyLgotQVM9IiRBUyIKLQotIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXMuCi1vYmpkaXI9JG9iamRpcgotCi0jIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCi1yZWxvYWRfZmxhZz0kcmVsb2FkX2ZsYWcKLXJlbG9hZF9jbWRzPSRyZWxvYWRfY21kcwotCi0jIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCi13bD0kd2wKLQotIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCi1vYmpleHQ9IiRvYmpleHQiCi0KLSMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgotbGliZXh0PSIkbGliZXh0IgotCi0jIEV4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKS4KLWV4ZWV4dD0iJGV4ZWV4dCIKLQotIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCi1waWNfZmxhZz0kcGljX2ZsYWcKLQotIyBEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnM/Ci1jb21waWxlcl9jX289JGNvbXBpbGVyX2NfbwotCi0jIENhbiB3ZSB3cml0ZSBkaXJlY3RseSB0byBhIC5sbyA/Ci1jb21waWxlcl9vX2xvPSRjb21waWxlcl9vX2xvCi0KLSMgTXVzdCB3ZSBsb2NrIGZpbGVzIHdoZW4gZG9pbmcgY29tcGlsYXRpb24gPwotbmVlZF9sb2Nrcz0kbmVlZF9sb2NrcwotCi0jIERvIHdlIG5lZWQgdGhlIGxpYiBwcmVmaXggZm9yIG1vZHVsZXM/Ci1uZWVkX2xpYl9wcmVmaXg9JG5lZWRfbGliX3ByZWZpeAotCi0jIERvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/Ci1uZWVkX3ZlcnNpb249JG5lZWRfdmVyc2lvbgotCi0jIFdoZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZC4KLWRsb3Blbj0kZW5hYmxlX2Rsb3BlbgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKLQotIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKLQotIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgotbGlua19zdGF0aWNfZmxhZz0kbGlua19zdGF0aWNfZmxhZwotCi0jIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCi1ub19idWlsdGluX2ZsYWc9JG5vX2J1aWx0aW5fZmxhZwotCi0jIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCi1leHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KLXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KLXRocmVhZF9zYWZlX2ZsYWdfc3BlYz0kdGhyZWFkX3NhZmVfZmxhZ19zcGVjCi0KLSMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCi12ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQotCi0jIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgotbGlibmFtZV9zcGVjPSRsaWJuYW1lX3NwZWMKLQotIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgotIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FLgotbGlicmFyeV9uYW1lc19zcGVjPSRsaWJyYXJ5X25hbWVzX3NwZWMKLQotIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KLXNvbmFtZV9zcGVjPSRzb25hbWVfc3BlYwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCi1SQU5MSUI9JFJBTkxJQgotb2xkX2FyY2hpdmVfY21kcz0kb2xkX2FyY2hpdmVfY21kcwotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JG9sZF9wb3N0aW5zdGFsbF9jbWRzCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRvbGRfcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KLW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGEgc2hhcmVkIGFyY2hpdmUuCi1hcmNoaXZlX2NtZHM9JGFyY2hpdmVfY21kcwotYXJjaGl2ZV9leHBzeW1fY21kcz0kYXJjaGl2ZV9leHBzeW1fY21kcwotcG9zdGluc3RhbGxfY21kcz0kcG9zdGluc3RhbGxfY21kcwotcG9zdHVuaW5zdGFsbF9jbWRzPSRwb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KLWRlcGxpYnNfY2hlY2tfbWV0aG9kPSRkZXBsaWJzX2NoZWNrX21ldGhvZAotCi0jIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gZmlsZV9tYWdpYy4KLWZpbGVfbWFnaWNfY21kPSRmaWxlX21hZ2ljX2NtZAotCi0jIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgotYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGFsbG93X3VuZGVmaW5lZF9mbGFnCi0KLSMgRmxhZyB0aGF0IGZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9scy4KLW5vX3VuZGVmaW5lZF9mbGFnPSRub191bmRlZmluZWRfZmxhZwotCi0jIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KLWZpbmlzaF9jbWRzPSRmaW5pc2hfY21kcwotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCi1maW5pc2hfZXZhbD0kZmluaXNoX2V2YWwKLQotIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgotZ2xvYmFsX3N5bWJvbF9waXBlPSRnbG9iYWxfc3ltYm9sX3BpcGUKLQotIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSRnbG9iYWxfc3ltYm9sX3RvX2NkZWNsCi0KLSMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgotcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCi0KLSMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KLXNobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKLQotIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/Ci1zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAotCi0jIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgotaGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb24KLQotIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCi0jIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjCi0KLSMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlIC1ycGF0aCBmbGFnIHdpdGggYSBzZXBhcmF0ZWQgYXJndW1lbnQuCi1oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRS5zbyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdAotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQotIyByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfbWludXNfTD0kaGFyZGNvZGVfbWludXNfTAotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCi0jIHRoZSByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3ZhcgotCi0jIENvbXBpbGUtdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcwotc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKLQotIyBSdW4tdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcwotc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjCi0KLSMgRml4IHRoZSBzaGVsbCB2YXJpYWJsZSBcJHNyY2ZpbGUgZm9yIHRoZSBjb21waWxlci4KLWZpeF9zcmNmaWxlX3BhdGg9IiRmaXhfc3JjZmlsZV9wYXRoIgotCi0jIFNldCB0byB5ZXMgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWQuCi1hbHdheXNfZXhwb3J0X3N5bWJvbHM9JGFsd2F5c19leHBvcnRfc3ltYm9scwotCi0jIFRoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHMuCi1leHBvcnRfc3ltYm9sc19jbWRzPSRleHBvcnRfc3ltYm9sc19jbWRzCi0KLSMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KLWV4Y2x1ZGVfZXhwc3ltcz0kZXhjbHVkZV9leHBzeW1zCi0KLSMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgotaW5jbHVkZV9leHBzeW1zPSRpbmNsdWRlX2V4cHN5bXMKLQotRU9GCi0KLWNhc2UgIiRsdG1haW4iIGluCi0qLnNoKQotICBlY2hvICcjIyMgRU5EIExJQlRPT0wgQ09ORklHJyA+PiAiJG9maWxlIgotICBlY2hvID4+ICIkb2ZpbGUiCi0gIGNhc2UgIiRob3N0X29zIiBpbgotICBhaXgzKikKLSAgICBjYXQgPDxcRU9GID4+ICIkb2ZpbGUiCi0KLSMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQotIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCi0jIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCi1pZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KLSAgQ09MTEVDVF9OQU1FUz0KLSAgZXhwb3J0IENPTExFQ1RfTkFNRVMKLWZpCi1FT0YKLSAgICA7OwotICBlc2FjCi0KLSAgIyBBcHBlbmQgdGhlIGx0bWFpbi5zaCBzY3JpcHQuCi0gIHNlZCAnJHEnICIkbHRtYWluIiA+PiAiJG9maWxlIiB8fCAocm0gLWYgIiRvZmlsZSI7IGV4aXQgMSkKLSAgIyBXZSB1c2Ugc2VkIGluc3RlYWQgb2YgY2F0IGJlY2F1c2UgYmFzaCBvbiBESkdQUCBnZXRzIGNvbmZ1c2VkIGlmCi0gICMgaWYgZmluZHMgbWl4ZWQgQ1IvTEYgYW5kIExGLW9ubHkgbGluZXMuICBTaW5jZSBzZWQgb3BlcmF0ZXMgaW4KLSAgIyB0ZXh0IG1vZGUsIGl0IHByb3Blcmx5IGNvbnZlcnRzIGxpbmVzIHRvIENSL0xGLiAgVGhpcyBiYXNoIHByb2JsZW0KLSAgIyBpcyByZXBvcnRlZGx5IGZpeGVkLCBidXQgd2h5IG5vdCBydW4gb24gb2xkIHZlcnNpb25zIHRvbz8KLQotICBjaG1vZCAreCAiJG9maWxlIgotICA7OwotCi0qKQotICAjIENvbXBpbGUgdGhlIGxpYnRvb2wgcHJvZ3JhbS4KLSAgZWNobyAiRklYTUU6IHdvdWxkIGNvbXBpbGUgJGx0bWFpbiIKLSAgOzsKLWVzYWMKLQotdGVzdCAtbiAiJGNhY2hlX2ZpbGUiIHx8IGV4aXQgMAotCi0jIEFDX0NBQ0hFX1NBVkUKLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi1leGl0IDAKLQotIyBMb2NhbCBWYXJpYWJsZXM6Ci0jIG1vZGU6c2hlbGwtc2NyaXB0Ci0jIHNoLWluZGVudGF0aW9uOjIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvc3JjbGliL3BjcmUvbWtpbnN0YWxsZGlycyBiL3NyY2xpYi9wY3JlL21raW5zdGFsbGRpcnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjRmMDU0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyY2xpYi9wY3JlL21raW5zdGFsbGRpcnMKQEAgLTAsMCArMSw0MCBAQAorIyEgL2Jpbi9zaAorIyBta2luc3RhbGxkaXJzIC0tLSBtYWtlIGRpcmVjdG9yeSBoaWVyYXJjaHkKKyMgQXV0aG9yOiBOb2FoIEZyaWVkbWFuIDxmcmllZG1hbkBwcmVwLmFpLm1pdC5lZHU+CisjIENyZWF0ZWQ6IDE5OTMtMDUtMTYKKyMgUHVibGljIGRvbWFpbgorCisjICRJZDogbWtpbnN0YWxsZGlycyx2IDEuMSAyMDAyLzAzLzIwIDA1OjU0OjEwIGJyaWFucCBFeHAgJAorCitlcnJzdGF0dXM9MAorCitmb3IgZmlsZQorZG8KKyAgIHNldCBmbm9yZCBgZWNobyAiOiRmaWxlIiB8IHNlZCAtbmUgJ3MvXjpcLy8jLztzL146Ly87cy9cLy8gL2c7cy9eIy9cLy87cCdgCisgICBzaGlmdAorCisgICBwYXRoY29tcD0KKyAgIGZvciBkCisgICBkbworICAgICBwYXRoY29tcD0iJHBhdGhjb21wJGQiCisgICAgIGNhc2UgIiRwYXRoY29tcCIgaW4KKyAgICAgICAtKiApIHBhdGhjb21wPS4vJHBhdGhjb21wIDs7CisgICAgIGVzYWMKKworICAgICBpZiB0ZXN0ICEgLWQgIiRwYXRoY29tcCI7IHRoZW4KKyAgICAgICAgZWNobyAibWtkaXIgJHBhdGhjb21wIgorCisgICAgICAgIG1rZGlyICIkcGF0aGNvbXAiIHx8IGxhc3RlcnI9JD8KKworICAgICAgICBpZiB0ZXN0ICEgLWQgIiRwYXRoY29tcCI7IHRoZW4KKyAgCSAgZXJyc3RhdHVzPSRsYXN0ZXJyCisgICAgICAgIGZpCisgICAgIGZpCisKKyAgICAgcGF0aGNvbXA9IiRwYXRoY29tcC8iCisgICBkb25lCitkb25lCisKK2V4aXQgJGVycnN0YXR1cworCisjIG1raW5zdGFsbGRpcnMgZW5kcyBoZXJlCmRpZmYgLS1naXQgYS9zcmNsaWIvcGNyZS9wY3JlLmRzcCBiL3NyY2xpYi9wY3JlL3BjcmUuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjY3ODE1Li4wMDAwMDAwCi0tLSBhL3NyY2xpYi9wY3JlL3BjcmUuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0icGNyZSIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNS4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIgMHgwMTA0Ci0KLUNGRz1wY3JlIC0gV2luMzIgRGVidWcKLSFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAicGNyZS5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgInBjcmUubWFrIiBDRkc9InBjcmUgLSBXaW4zMiBEZWJ1ZyIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJwY3JlIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpCi0hTUVTU0FHRSAicGNyZSAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gInBjcmUgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiTGliUiIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJMaWJSIgotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL0ZEIC9jCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSUIzMj1saW5rLmV4ZSAtbGliCi0jIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KLSMgQUREIExJQjMyIC9ub2xvZ28KLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInBjcmUgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiTGliRCIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJMaWJEIgotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aNyAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aNyAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9GRCAvYwotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElCMzI9bGluay5leGUgLWxpYgotIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvCi0jIEFERCBMSUIzMiAvbm9sb2dvCi0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJwY3JlIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAicGNyZSAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiouYyIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cZGZ0YWJsZXMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gInBjcmUgLSBXaW4zMiBSZWxlYXNlIgotCi0jIEJlZ2luIEN1c3RvbSBCdWlsZAotSW5wdXRQYXRoPS5cZGZ0YWJsZXMuZXhlCi0KLSIuXGNoYXJ0YWJsZXMuYyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQkuXGRmdGFibGVzLmV4ZSA+LlxjaGFydGFibGVzLmMgCi0JRWNobyBDcmVhdGluZyBwY3JlIGNoYXJ0YWJsZXMuYyBmcm9tIGRmdGFibGVzIAotCQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJwY3JlIC0gV2luMzIgRGVidWciCi0KLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkCi1JbnB1dFBhdGg9LlxkZnRhYmxlcy5leGUKLQotIi5cY2hhcnRhYmxlcy5jIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCS5cZGZ0YWJsZXMuZXhlID4uXGNoYXJ0YWJsZXMuYyAKLQlFY2hvIENyZWF0aW5nIHBjcmUgY2hhcnRhYmxlcy5jIGZyb20gZGZ0YWJsZXMgCi0JCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxnZXQuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbWFrZXRhYmxlcy5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxwY3JlLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHN0dWR5LmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiouaCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cY29uZmlnLmh3Ci0KLSFJRiAgIiQoQ0ZHKSIgPT0gInBjcmUgLSBXaW4zMiBSZWxlYXNlIgotCi0jIEJlZ2luIEN1c3RvbSBCdWlsZAotSW5wdXRQYXRoPS5cY29uZmlnLmh3Ci0KLSIuXGNvbmZpZy5oIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCWVjaG8gQ3JlYXRpbmcgcGNyZSBjb25maWcuaCBmcm9tIGNvbmZpZy5odyAKLQljb3B5IC5cY29uZmlnLmh3IC5cY29uZmlnLmggCi0JCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInBjcmUgLSBXaW4zMiBEZWJ1ZyIKLQotIyBCZWdpbiBDdXN0b20gQnVpbGQKLUlucHV0UGF0aD0uXGNvbmZpZy5odwotCi0iLlxjb25maWcuaCIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQllY2hvIENyZWF0aW5nIHBjcmUgY29uZmlnLmggZnJvbSBjb25maWcuaHcgCi0JY29weSAuXGNvbmZpZy5odyAuXGNvbmZpZy5oIAotCQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5ccGNyZS5odwotCi0hSUYgICIkKENGRykiID09ICJwY3JlIC0gV2luMzIgUmVsZWFzZSIKLQotIyBCZWdpbiBDdXN0b20gQnVpbGQKLUlucHV0UGF0aD0uXHBjcmUuaHcKLQotIi5ccGNyZS5oIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCWVjaG8gQ3JlYXRpbmcgcGNyZS5oIGZyb20gcGNyZS5odyAKLQljb3B5IC5ccGNyZS5odyAuXHBjcmUuaCAKLQkKLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAicGNyZSAtIFdpbjMyIERlYnVnIgotCi0jIEJlZ2luIEN1c3RvbSBCdWlsZAotSW5wdXRQYXRoPS5ccGNyZS5odwotCi0iLlxwY3JlLmgiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JZWNobyBDcmVhdGluZyBwY3JlLmggZnJvbSBwY3JlLmh3IAotCWNvcHkgLlxwY3JlLmh3IC5ccGNyZS5oIAotCQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXGluY2x1ZGVccGNyZXBvc2l4LmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9zcmNsaWIvcGNyZS9wY3JlLmh3IGIvc3JjbGliL3BjcmUvcGNyZS5odwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY2ZTJkZS4uMDAwMDAwMAotLS0gYS9zcmNsaWIvcGNyZS9wY3JlLmh3CisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgIFBlcmwtQ29tcGF0aWJsZSBSZWd1bGFyIEV4cHJlc3Npb25zICAgICAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDAgVW5pdmVyc2l0eSBvZiBDYW1icmlkZ2UgKi8KLQotI2lmbmRlZiBfUENSRV9ICi0jZGVmaW5lIF9QQ1JFX0gKLQotI2RlZmluZSBQQ1JFX01BSk9SIDMKLSNkZWZpbmUgUENSRV9NSU5PUiAxCi0jZGVmaW5lIFBDUkVfREFURSAgMDktRmViLTIwMDAKLQotLyogV2luMzIgdXNlcyBETEwgYnkgZGVmYXVsdCAqLwotCi0jaWZkZWYgX1dJTjMyCi0jIGlmZGVmIFNUQVRJQwotIyAgZGVmaW5lIFBDUkVfRExfSU1QT1JUCi0jIGVsc2UKLSMgIGRlZmluZSBQQ1JFX0RMX0lNUE9SVCBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSMgZW5kaWYKLSNlbHNlCi0jIGRlZmluZSBQQ1JFX0RMX0lNUE9SVAotI2VuZGlmCi0KLS8qIEhhdmUgdG8gaW5jbHVkZSBzdGRsaWIuaCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCBzaXplX3QgaXMgZGVmaW5lZDsKLWl0IGlzIG5lZWRlZCBoZXJlIGZvciBtYWxsb2MuICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotLyogQWxsb3cgZm9yIEMrKyB1c2VycyAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIE9wdGlvbnMgKi8KLQotI2RlZmluZSBQQ1JFX0NBU0VMRVNTICAgICAgICAweDAwMDEKLSNkZWZpbmUgUENSRV9NVUxUSUxJTkUgICAgICAgMHgwMDAyCi0jZGVmaW5lIFBDUkVfRE9UQUxMICAgICAgICAgIDB4MDAwNAotI2RlZmluZSBQQ1JFX0VYVEVOREVEICAgICAgICAweDAwMDgKLSNkZWZpbmUgUENSRV9BTkNIT1JFRCAgICAgICAgMHgwMDEwCi0jZGVmaW5lIFBDUkVfRE9MTEFSX0VORE9OTFkgIDB4MDAyMAotI2RlZmluZSBQQ1JFX0VYVFJBICAgICAgICAgICAweDAwNDAKLSNkZWZpbmUgUENSRV9OT1RCT0wgICAgICAgICAgMHgwMDgwCi0jZGVmaW5lIFBDUkVfTk9URU9MICAgICAgICAgIDB4MDEwMAotI2RlZmluZSBQQ1JFX1VOR1JFRURZICAgICAgICAweDAyMDAKLSNkZWZpbmUgUENSRV9OT1RFTVBUWSAgICAgICAgMHgwNDAwCi0KLS8qIEV4ZWMtdGltZSBhbmQgZ2V0LXRpbWUgZXJyb3IgY29kZXMgKi8KLQotI2RlZmluZSBQQ1JFX0VSUk9SX05PTUFUQ0ggICAgICAgICgtMSkKLSNkZWZpbmUgUENSRV9FUlJPUl9OVUxMICAgICAgICAgICAoLTIpCi0jZGVmaW5lIFBDUkVfRVJST1JfQkFET1BUSU9OICAgICAgKC0zKQotI2RlZmluZSBQQ1JFX0VSUk9SX0JBRE1BR0lDICAgICAgICgtNCkKLSNkZWZpbmUgUENSRV9FUlJPUl9VTktOT1dOX05PREUgICAoLTUpCi0jZGVmaW5lIFBDUkVfRVJST1JfTk9NRU1PUlkgICAgICAgKC02KQotI2RlZmluZSBQQ1JFX0VSUk9SX05PU1VCU1RSSU5HICAgICgtNykKLQotLyogUmVxdWVzdCB0eXBlcyBmb3IgcGNyZV9mdWxsaW5mbygpICovCi0KLSNkZWZpbmUgUENSRV9JTkZPX09QVElPTlMgICAgICAgICAwCi0jZGVmaW5lIFBDUkVfSU5GT19TSVpFICAgICAgICAgICAgMQotI2RlZmluZSBQQ1JFX0lORk9fQ0FQVFVSRUNPVU5UICAgIDIKLSNkZWZpbmUgUENSRV9JTkZPX0JBQ0tSRUZNQVggICAgICAzCi0jZGVmaW5lIFBDUkVfSU5GT19GSVJTVENIQVIgICAgICAgNAotI2RlZmluZSBQQ1JFX0lORk9fRklSU1RUQUJMRSAgICAgIDUKLSNkZWZpbmUgUENSRV9JTkZPX0xBU1RMSVRFUkFMICAgICA2Ci0KLS8qIFR5cGVzICovCi0KLXR5cGVkZWYgdm9pZCBwY3JlOwotdHlwZWRlZiB2b2lkIHBjcmVfZXh0cmE7Ci0KLS8qIFN0b3JlIGdldCBhbmQgZnJlZSBmdW5jdGlvbnMuIFRoZXNlIGNhbiBiZSBzZXQgdG8gYWx0ZXJuYXRpdmUgbWFsbG9jL2ZyZWUKLWZ1bmN0aW9ucyBpZiByZXF1aXJlZC4gU29tZSBtYWdpYyBpcyByZXF1aXJlZCBmb3IgV2luMzIgRExMOyBpdCBpcyBudWxsIG9uCi1vdGhlciBPUy4gKi8KLQotUENSRV9ETF9JTVBPUlQgZXh0ZXJuIHZvaWQgKigqcGNyZV9tYWxsb2MpKHNpemVfdCk7Ci1QQ1JFX0RMX0lNUE9SVCBleHRlcm4gdm9pZCAgKCpwY3JlX2ZyZWUpKHZvaWQgKik7Ci0KLSN1bmRlZiBQQ1JFX0RMX0lNUE9SVAotCi0vKiBGdW5jdGlvbnMgKi8KLQotZXh0ZXJuIHBjcmUgKnBjcmVfY29tcGlsZShjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKiwgaW50ICosCi0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKik7Ci1leHRlcm4gaW50IHBjcmVfY29weV9zdWJzdHJpbmcoY29uc3QgY2hhciAqLCBpbnQgKiwgaW50LCBpbnQsIGNoYXIgKiwgaW50KTsKLWV4dGVybiBpbnQgcGNyZV9leGVjKGNvbnN0IHBjcmUgKiwgY29uc3QgcGNyZV9leHRyYSAqLCBjb25zdCBjaGFyICosCi0gIGludCwgaW50LCBpbnQsIGludCAqLCBpbnQpOwotZXh0ZXJuIGludCBwY3JlX2dldF9zdWJzdHJpbmcoY29uc3QgY2hhciAqLCBpbnQgKiwgaW50LCBpbnQsIGNvbnN0IGNoYXIgKiopOwotZXh0ZXJuIGludCBwY3JlX2dldF9zdWJzdHJpbmdfbGlzdChjb25zdCBjaGFyICosIGludCAqLCBpbnQsIGNvbnN0IGNoYXIgKioqKTsKLWV4dGVybiBpbnQgcGNyZV9pbmZvKGNvbnN0IHBjcmUgKiwgaW50ICosIGludCAqKTsKLWV4dGVybiBpbnQgcGNyZV9mdWxsaW5mbyhjb25zdCBwY3JlICosIGNvbnN0IHBjcmVfZXh0cmEgKiwgaW50LCB2b2lkICopOwotZXh0ZXJuIHVuc2lnbmVkIGNvbnN0IGNoYXIgKnBjcmVfbWFrZXRhYmxlcyh2b2lkKTsKLWV4dGVybiBwY3JlX2V4dHJhICpwY3JlX3N0dWR5KGNvbnN0IHBjcmUgKiwgaW50LCBjb25zdCBjaGFyICoqKTsKLWV4dGVybiBjb25zdCBjaGFyICpwY3JlX3ZlcnNpb24odm9pZCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgLyogZXh0ZXJuICJDIiAqLwotI2VuZGlmCi0KLSNlbmRpZiAvKiBFbmQgb2YgcGNyZS5oICovCmRpZmYgLS1naXQgYS9zcmNsaWIvcGNyZS9wY3JlcG9zaXguZHNwIGIvc3JjbGliL3BjcmUvcGNyZXBvc2l4LmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUxZTRhMS4uMDAwMDAwMAotLS0gYS9zcmNsaWIvcGNyZS9wY3JlcG9zaXguZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0icGNyZXBvc2l4IiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IiAweDAxMDQKLQotQ0ZHPXBjcmVwb3NpeCAtIFdpbjMyIERlYnVnCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgInBjcmVwb3NpeC5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgInBjcmVwb3NpeC5tYWsiIENGRz0icGNyZXBvc2l4IC0gV2luMzIgRGVidWciCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAicGNyZXBvc2l4IC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpCi0hTUVTU0FHRSAicGNyZXBvc2l4IC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLQotIUlGICAiJChDRkcpIiA9PSAicGNyZXBvc2l4IC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIkxpYlIiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiTGliUi9wb3NpeCIKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvTzIgL0kgIi4uXGluY2x1ZGUiIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRkQgL2MKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJQjMyPWxpbmsuZXhlIC1saWIKLSMgQUREIEJBU0UgTElCMzIgL25vbG9nbwotIyBBREQgTElCMzIgL25vbG9nbwotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAicGNyZXBvc2l4IC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIkxpYkQiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiTGliRC9wb3NpeCIKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HWCAvWjcgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HWCAvWjcgL09kIC9JICIuLlxpbmNsdWRlIiAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL0ZEIC9jCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSUIzMj1saW5rLmV4ZSAtbGliCi0jIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KLSMgQUREIExJQjMyIC9ub2xvZ28KLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgInBjcmVwb3NpeCAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgInBjcmVwb3NpeCAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiouYyIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5ccGNyZXBvc2l4LmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiouaCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cY29uZmlnLmh3Ci0KLSFJRiAgIiQoQ0ZHKSIgPT0gInBjcmVwb3NpeCAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkCi1JbnB1dFBhdGg9Llxjb25maWcuaHcKLQotIi5cY29uZmlnLmgiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JZWNobyBDcmVhdGluZyBwY3JlIGNvbmZpZy5oIGZyb20gY29uZmlnLmh3IAotCWNvcHkgLlxjb25maWcuaHcgLlxjb25maWcuaCAKLQkKLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAicGNyZXBvc2l4IC0gV2luMzIgRGVidWciCi0KLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkCi1JbnB1dFBhdGg9Llxjb25maWcuaHcKLQotIi5cY29uZmlnLmgiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JZWNobyBDcmVhdGluZyBwY3JlIGNvbmZpZy5oIGZyb20gY29uZmlnLmh3IAotCWNvcHkgLlxjb25maWcuaHcgLlxjb25maWcuaCAKLQkKLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxpbmNsdWRlXHBjcmUuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5ccGNyZS5odwotCi0hSUYgICIkKENGRykiID09ICJwY3JlcG9zaXggLSBXaW4zMiBSZWxlYXNlIgotCi0jIEJlZ2luIEN1c3RvbSBCdWlsZAotSW5wdXRQYXRoPS5ccGNyZS5odwotCi0iLlxwY3JlLmgiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JZWNobyBDcmVhdGluZyBwY3JlLmggZnJvbSBwY3JlLmh3IAotCWNvcHkgLlxwY3JlLmh3IC5ccGNyZS5oIAotCQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJwY3JlcG9zaXggLSBXaW4zMiBEZWJ1ZyIKLQotIyBCZWdpbiBDdXN0b20gQnVpbGQKLUlucHV0UGF0aD0uXHBjcmUuaHcKLQotIi5ccGNyZS5oIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCWVjaG8gQ3JlYXRpbmcgcGNyZS5oIGZyb20gcGNyZS5odyAKLQljb3B5IC5ccGNyZS5odyAuXHBjcmUuaCAKLQkKLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9zcmNsaWIvcGNyZS9wZ3JlcC5jIGIvc3JjbGliL3BjcmUvcGdyZXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQxYjg3ZS4uMDAwMDAwMAotLS0gYS9zcmNsaWIvcGNyZS9wZ3JlcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgUENSRSBncmVwIHByb2dyYW0gICAgICAgICAgICAgICAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJwY3JlLmgiCi0KLSNkZWZpbmUgRkFMU0UgMAotI2RlZmluZSBUUlVFIDEKLQotdHlwZWRlZiBpbnQgQk9PTDsKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgR2xvYmFsIHZhcmlhYmxlcyAgICAgICAgICAgICAgICAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHBjcmUgKnBhdHRlcm47Ci1zdGF0aWMgcGNyZV9leHRyYSAqaGludHM7Ci0KLXN0YXRpYyBCT09MIGNvdW50X29ubHkgPSBGQUxTRTsKLXN0YXRpYyBCT09MIGZpbGVuYW1lc19vbmx5ID0gRkFMU0U7Ci1zdGF0aWMgQk9PTCBpbnZlcnQgPSBGQUxTRTsKLXN0YXRpYyBCT09MIG51bWJlciA9IEZBTFNFOwotc3RhdGljIEJPT0wgc2lsZW50ID0gRkFMU0U7Ci1zdGF0aWMgQk9PTCB3aG9sZV9saW5lcyA9IEZBTFNFOwotCi0KLQotI2lmICEgSEFWRV9TVFJFUlJPUgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgIFByb3ZpZGUgc3RyZXJyb3IoKSBmb3Igbm9uLUFOU0kgbGlicmFyaWVzICAqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBTb21lIG9sZC1mYXNoaW9uZWQgc3lzdGVtcyBzdGlsbCBhcm91bmQgKGUuZy4gU3VuT1M0KSBkb24ndCBoYXZlIHN0cmVycm9yKCkKLWluIHRoZWlyIGxpYnJhcmllcywgYnV0IGNhbiBwcm92aWRlIHRoZSBzYW1lIGZhY2lsaXR5IGJ5IHRoaXMgc2ltcGxlCi1hbHRlcm5hdGl2ZSBmdW5jdGlvbi4gKi8KLQotZXh0ZXJuIGludCAgIHN5c19uZXJyOwotZXh0ZXJuIGNoYXIgKnN5c19lcnJsaXN0W107Ci0KLWNoYXIgKgotc3RyZXJyb3IoaW50IG4pCi17Ci1pZiAobiA8IDAgfHwgbiA+PSBzeXNfbmVycikgcmV0dXJuICJ1bmtub3duIGVycm9yIG51bWJlciI7Ci1yZXR1cm4gc3lzX2Vycmxpc3Rbbl07Ci19Ci0jZW5kaWYgLyogSEFWRV9TVFJFUlJPUiAqLwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgICAgICAgICAgIEdyZXAgYW4gaW5kaXZpZHVhbCBmaWxlICAgICAgICAgICAqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50Ci1wZ3JlcChGSUxFICppbiwgY2hhciAqbmFtZSkKLXsKLWludCByYyA9IDE7Ci1pbnQgbGluZW51bWJlciA9IDA7Ci1pbnQgY291bnQgPSAwOwotaW50IG9mZnNldHNbOTldOwotY2hhciBidWZmZXJbQlVGU0laXTsKLQotd2hpbGUgKGZnZXRzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGluKSAhPSBOVUxMKQotICB7Ci0gIEJPT0wgbWF0Y2g7Ci0gIGludCBsZW5ndGggPSAoaW50KXN0cmxlbihidWZmZXIpOwotICBpZiAobGVuZ3RoID4gMCAmJiBidWZmZXJbbGVuZ3RoLTFdID09ICdcbicpIGJ1ZmZlclstLWxlbmd0aF0gPSAwOwotICBsaW5lbnVtYmVyKys7Ci0KLSAgbWF0Y2ggPSBwY3JlX2V4ZWMocGF0dGVybiwgaGludHMsIGJ1ZmZlciwgbGVuZ3RoLCAwLCAwLCBvZmZzZXRzLCA5OSkgPj0gMDsKLSAgaWYgKG1hdGNoICYmIHdob2xlX2xpbmVzICYmIG9mZnNldHNbMV0gIT0gbGVuZ3RoKSBtYXRjaCA9IEZBTFNFOwotCi0gIGlmIChtYXRjaCAhPSBpbnZlcnQpCi0gICAgewotICAgIGlmIChjb3VudF9vbmx5KSBjb3VudCsrOwotCi0gICAgZWxzZSBpZiAoZmlsZW5hbWVzX29ubHkpCi0gICAgICB7Ci0gICAgICBmcHJpbnRmKHN0ZG91dCwgIiVzXG4iLCAobmFtZSA9PSBOVUxMKT8gIjxzdGRpbj4iIDogbmFtZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICAgIH0KLQotICAgIGVsc2UgaWYgKHNpbGVudCkgcmV0dXJuIDA7Ci0KLSAgICBlbHNlCi0gICAgICB7Ci0gICAgICBpZiAobmFtZSAhPSBOVUxMKSBmcHJpbnRmKHN0ZG91dCwgIiVzOiIsIG5hbWUpOwotICAgICAgaWYgKG51bWJlcikgZnByaW50ZihzdGRvdXQsICIlZDoiLCBsaW5lbnVtYmVyKTsKLSAgICAgIGZwcmludGYoc3Rkb3V0LCAiJXNcbiIsIGJ1ZmZlcik7Ci0gICAgICB9Ci0KLSAgICByYyA9IDA7Ci0gICAgfQotICB9Ci0KLWlmIChjb3VudF9vbmx5KQotICB7Ci0gIGlmIChuYW1lICE9IE5VTEwpIGZwcmludGYoc3Rkb3V0LCAiJXM6IiwgbmFtZSk7Ci0gIGZwcmludGYoc3Rkb3V0LCAiJWRcbiIsIGNvdW50KTsKLSAgfQotCi1yZXR1cm4gcmM7Ci19Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgIFVzYWdlIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludAotdXNhZ2UoaW50IHJjKQotewotZnByaW50ZihzdGRlcnIsICJVc2FnZTogcGdyZXAgWy1WY2hpbG5zdnhdIHBhdHRlcm4gW2ZpbGVdIC4uLlxuIik7Ci1yZXR1cm4gcmM7Ci19Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgIE1haW4gcHJvZ3JhbSAgICAgICAgICAgICAgICAgICAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW50Ci1tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLWludCBpOwotaW50IHJjID0gMTsKLWludCBvcHRpb25zID0gMDsKLWludCBlcnJwdHI7Ci1jb25zdCBjaGFyICplcnJvcjsKLUJPT0wgZmlsZW5hbWVzID0gVFJVRTsKLQotLyogUHJvY2VzcyB0aGUgb3B0aW9ucyAqLwotCi1mb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQotICB7Ci0gIGNoYXIgKnM7Ci0gIGlmIChhcmd2W2ldWzBdICE9ICctJykgYnJlYWs7Ci0gIHMgPSBhcmd2W2ldICsgMTsKLSAgd2hpbGUgKCpzICE9IDApCi0gICAgewotICAgIHN3aXRjaCAoKnMrKykKLSAgICAgIHsKLSAgICAgIGNhc2UgJ2MnOiBjb3VudF9vbmx5ID0gVFJVRTsgYnJlYWs7Ci0gICAgICBjYXNlICdoJzogZmlsZW5hbWVzID0gRkFMU0U7IGJyZWFrOwotICAgICAgY2FzZSAnaSc6IG9wdGlvbnMgfD0gUENSRV9DQVNFTEVTUzsgYnJlYWs7Ci0gICAgICBjYXNlICdsJzogZmlsZW5hbWVzX29ubHkgPSBUUlVFOwotICAgICAgY2FzZSAnbic6IG51bWJlciA9IFRSVUU7IGJyZWFrOwotICAgICAgY2FzZSAncyc6IHNpbGVudCA9IFRSVUU7IGJyZWFrOwotICAgICAgY2FzZSAndic6IGludmVydCA9IFRSVUU7IGJyZWFrOwotICAgICAgY2FzZSAneCc6IHdob2xlX2xpbmVzID0gVFJVRTsgb3B0aW9ucyB8PSBQQ1JFX0FOQ0hPUkVEOyBicmVhazsKLQotICAgICAgY2FzZSAnVic6Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlBDUkUgdmVyc2lvbiAlc1xuIiwgcGNyZV92ZXJzaW9uKCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgInBncmVwOiB1bmtub3duIG9wdGlvbiAlY1xuIiwgc1stMV0pOwotICAgICAgcmV0dXJuIHVzYWdlKDIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0vKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IGEgcmVnZXhwIGFyZ3VtZW50ICovCi0KLWlmIChpID49IGFyZ2MpIHJldHVybiB1c2FnZSgwKTsKLQotLyogQ29tcGlsZSB0aGUgcmVndWxhciBleHByZXNzaW9uLiAqLwotCi1wYXR0ZXJuID0gcGNyZV9jb21waWxlKGFyZ3ZbaSsrXSwgb3B0aW9ucywgJmVycm9yLCAmZXJycHRyLCBOVUxMKTsKLWlmIChwYXR0ZXJuID09IE5VTEwpCi0gIHsKLSAgZnByaW50ZihzdGRlcnIsICJwZ3JlcDogZXJyb3IgaW4gcmVnZXggYXQgb2Zmc2V0ICVkOiAlc1xuIiwgZXJycHRyLCBlcnJvcik7Ci0gIHJldHVybiAyOwotICB9Ci0KLS8qIFN0dWR5IHRoZSByZWd1bGFyIGV4cHJlc3Npb24sIGFzIHdlIHdpbGwgYmUgcnVubmluZyBpdCBtYXkgdGltZXMgKi8KLQotaGludHMgPSBwY3JlX3N0dWR5KHBhdHRlcm4sIDAsICZlcnJvcik7Ci1pZiAoZXJyb3IgIT0gTlVMTCkKLSAgewotICBmcHJpbnRmKHN0ZGVyciwgInBncmVwOiBlcnJvciB3aGlsZSBzdHVkaW5nIHJlZ2V4OiAlc1xuIiwgZXJyb3IpOwotICByZXR1cm4gMjsKLSAgfQotCi0vKiBJZiB0aGVyZSBhcmUgbm8gZnVydGhlciBhcmd1bWVudHMsIGRvIHRoZSBidXNpbmVzcyBvbiBzdGRpbiBhbmQgZXhpdCAqLwotCi1pZiAoaSA+PSBhcmdjKSByZXR1cm4gcGdyZXAoc3RkaW4sIE5VTEwpOwotCi0vKiBPdGhlcndpc2UsIHdvcmsgdGhyb3VnaCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyBhcyBmaWxlcy4gSWYgdGhlcmUgaXMgb25seQotb25lLCBkb24ndCBnaXZlIGl0cyBuYW1lIG9uIHRoZSBvdXRwdXQuICovCi0KLWlmIChpID09IGFyZ2MgLSAxKSBmaWxlbmFtZXMgPSBGQUxTRTsKLWlmIChmaWxlbmFtZXNfb25seSkgZmlsZW5hbWVzID0gVFJVRTsKLQotZm9yICg7IGkgPCBhcmdjOyBpKyspCi0gIHsKLSAgRklMRSAqaW4gPSBmb3Blbihhcmd2W2ldLCAiciIpOwotICBpZiAoaW4gPT0gTlVMTCkKLSAgICB7Ci0gICAgZnByaW50ZihzdGRlcnIsICIlczogZmFpbGVkIHRvIG9wZW46ICVzXG4iLCBhcmd2W2ldLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJjID0gMjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgaW50IGZyYyA9IHBncmVwKGluLCBmaWxlbmFtZXM/IGFyZ3ZbaV0gOiBOVUxMKTsKLSAgICBpZiAoZnJjID09IDAgJiYgcmMgPT0gMSkgcmMgPSAwOwotICAgIGZjbG9zZShpbik7Ci0gICAgfQotICB9Ci0KLXJldHVybiByYzsKLX0KLQotLyogRW5kICovCmRpZmYgLS1naXQgYS9zdXBwb3J0Ly5jdnNpZ25vcmUgYi9zdXBwb3J0Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OWYxMTQuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotTWFrZWZpbGUKLXJvdGF0ZWxvZ3MKLWh0cGFzc3dkCi1odGRpZ2VzdAotdW5lc2NhcGUKLWluYzJzaHRtbAotaHR0cGRfbW9uaXRvcgotc3VleGVjCi1sb2dyZXNvbHZlCi1hYgotYXB4cwpkaWZmIC0tZ2l0IGEvc3VwcG9ydC8uaW5kZW50LnBybyBiL3N1cHBvcnQvLmluZGVudC5wcm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZmJlOWYuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC8uaW5kZW50LnBybworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS1pNCAtbnBzbCAtZGkwIC1iciAtbmNlIC1kMCAtY2xpMCAtbnBjcyAtbmZjMQotLVRCVUZGCi0tVEZJTEUKLS1UVFJBTlMKLS1UVUlOVDQKLS1UX3RyYW5zCi0tVGFsbG93X29wdGlvbnNfdAotLVRhcGFjaGVfc2ZpbwotLVRhcnJheV9oZWFkZXIKLS1UYm9vbF9pbnQKLS1UYnVmX2FyZWEKLS1UYnVmZl9zdHJ1Y3QKLS1UYnVmZnkKLS1UY21kX2hvdwotLVRjbWRfcGFybXMKLS1UY29tbWFuZF9yZWMKLS1UY29tbWFuZF9zdHJ1Y3QKLS1UY29ubl9yZWMKLS1UY29yZV9kaXJfY29uZmlnCi0tVGNvcmVfc2VydmVyX2NvbmZpZwotLVRkaXJfbWFrZXJfZnVuYwotLVRldmVudAotLVRnbG9iYWxzX3MKLS1UaGFuZGxlcl9mdW5jCi0tVGhhbmRsZXJfcmVjCi0tVGpvYmxpc3RfcwotLVRsaXN0ZW5fcmVjCi0tVG1lcmdlcl9mdW5jCi0tVG1vZGVfdAotLVRtb2R1bGUKLS1UbW9kdWxlX3N0cnVjdAotLVRtdXRleAotLVRuX2xvbmcKLS1Ub3RoZXJfY2hpbGRfcmVjCi0tVG92ZXJyaWRlc190Ci0tVHBhcmVudF9zY29yZQotLVRwaWRfdAotLVRwaXBlZF9sb2cKLS1UcG9vbAotLVRyZXF1ZXN0X3JlYwotLVRyZXF1aXJlX2xpbmUKLS1UcmxpbV90Ci0tVHNjb3JlYm9hcmQKLS1Uc2VtYXBob3JlCi0tVHNlcnZlcl9hZGRyX3JlYwotLVRzZXJ2ZXJfcmVjCi0tVHNlcnZlcl9yZWNfY2hhaW4KLS1Uc2hvcnRfc2NvcmUKLS1UdGFibGUKLS1UdGFibGVfZW50cnkKLS1UdGhyZWFkCi0tVHVfd2lkZV9pbnQKLS1UdnRpbWVfdAotLVR3aWRlX2ludApkaWZmIC0tZ2l0IGEvc3VwcG9ydC9NYWtlZmlsZS5pbiBiL3N1cHBvcnQvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NjBiNTYuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLQotREVQVEggICAgID0gLi4KLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLXNyY2RpciAgICA9IEBzcmNkaXJACi1WUEFUSCAgICAgPSBAc3JjZGlyQAotCi1QUk9HUkFNUyA9IGh0cGFzc3dkIGh0ZGlnZXN0IHJvdGF0ZWxvZ3MgbG9ncmVzb2x2ZSBhYgotdGFyZ2V0cyAgPSAkKFBST0dSQU1TKQotCi1QUk9HUkFNX0xEQUREICAgICAgICA9ICQoRVhUUkFfTERGTEFHUykgJChQUk9HUkFNX0RFUEVOREVOQ0lFUykgJChFWFRSQV9MSUJTKQotUFJPR1JBTV9ERVBFTkRFTkNJRVMgPSAuLi9saWIvYXByLyQoTElCUFJFKWFwci5hIFwKLQkuLi9hcC9saWJhcC5sYQotCi1pbmNsdWRlICQodG9wX3NyY2RpcikvYnVpbGQvcnVsZXMubWsKLWluY2x1ZGUgJCh0b3Bfc3JjZGlyKS9idWlsZC9wcm9ncmFtLm1rCi0KLWh0cGFzc3dkX09CSkVDVFMgPSBodHBhc3N3ZC5sbwotaHRwYXNzd2Q6ICQoaHRwYXNzd2RfT0JKRUNUUykKLQkkKExJTkspICQoaHRwYXNzd2RfT0JKRUNUUykgJChQUk9HUkFNX0xEQUREKQotCi1odGRpZ2VzdF9PQkpFQ1RTID0gaHRkaWdlc3QubG8KLWh0ZGlnZXN0OiAkKGh0ZGlnZXN0X09CSkVDVFMpCi0JJChMSU5LKSAkKGh0ZGlnZXN0X09CSkVDVFMpICQoUFJPR1JBTV9MREFERCkKLQotcm90YXRlbG9nc19PQkpFQ1RTID0gcm90YXRlbG9ncy5sbwotcm90YXRlbG9nczogJChyb3RhdGVsb2dzX09CSkVDVFMpCi0JJChMSU5LKSAkKHJvdGF0ZWxvZ3NfT0JKRUNUUykgJChQUk9HUkFNX0xEQUREKQotCi1sb2dyZXNvbHZlX09CSkVDVFMgPSBsb2dyZXNvbHZlLmxvCi1sb2dyZXNvbHZlOiAkKGxvZ3Jlc29sdmVfT0JKRUNUUykKLQkkKExJTkspICQobG9ncmVzb2x2ZV9PQkpFQ1RTKSAkKFBST0dSQU1fTERBREQpCi0KLWFiX09CSkVDVFMgPSBhYi5sbwotYWI6ICQoYWJfT0JKRUNUUykKLQkkKExJTkspICQoYWJfT0JKRUNUUykgJChQUk9HUkFNX0xEQUREKQotCmRpZmYgLS1naXQgYS9zdXBwb3J0L05XR05VaHRkaWdlc3QgYi9zdXBwb3J0L05XR05VaHRkaWdlc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYzFjOTYuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9OV0dOVWh0ZGlnZXN0CisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLSMKLSMgTWFrZSBzdXJlIGFsbCBuZWVkZWQgbWFjcm8ncyBhcmUgZGVmaW5lZAotIwotCi0jCi0jIEdldCB0aGUgJ2hlYWQnIG9mIHRoZSBidWlsZCBlbnZpcm9ubWVudCBpZiBuZWNlc3NhcnkuICBUaGlzIGluY2x1ZGVzIGRlZmF1bHQKLSMgdGFyZ2V0cyBhbmQgcGF0aHMgdG8gdG9vbHMKLSMKLQotaWZuZGVmIEVudmlyb25tZW50RGVmaW5lZAotaW5jbHVkZSAkKEFQX1dPUkspXGJ1aWxkXE5XR05VaGVhZC5pbmMKLWVuZGlmCi0KLSMKLSMgVGhlc2UgZGlyZWN0b3JpZXMgd2lsbCBiZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbmNsdWRlIGxpc3QsIGZvbGxvd2VkIGJ5Ci0jIElOQ0RJUlMKLSMKLVhJTkNESVJTCSs9IFwKLQkJCSQoTldPUykgXAotCQkJJChBUF9XT1JLKS9zcmNsaWIvYXByL2luY2x1ZGUgXAotCQkJJChBUF9XT1JLKS9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSBcCi0JCQkkKEFQX1dPUkspL3NyY2xpYi9hcHIvbWlzYy9uZXR3YXJlIFwKLQkJCSQoQVBfV09SSykvc3JjbGliL2FwciBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBmbGFncyB3aWxsIGNvbWUgYWZ0ZXIgQ0ZMQUdTCi0jCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBkZWZpbmVzIHdpbGwgY29tZSBhZnRlciBERUZJTkVTCi0jCi1YREVGSU5FUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBmbGFncyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaW5rLm9wdCBmaWxlCi0jCi1YTEZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSB2YWx1ZXMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgY29ycmVjdCB2YXJpYWJsZXMgYmFzZWQgb24gdGhlIHZhbHVlIG9mCi0jIFJFTEVBU0UKLSMKLWlmZXEgIiQoUkVMRUFTRSkiICJkZWJ1ZyIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJICAgCSQoRU9MSVNUKQotZW5kaWYKLQotaWZlcSAiJChSRUxFQVNFKSIgIm5vb3B0IgotWElOQ0RJUlMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhDRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YREVGSU5FUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWExGTEFHUwkJKz0gXAotCQkgICAJJChFT0xJU1QpCi1lbmRpZgotCi1pZmVxICIkKFJFTEVBU0UpIiAicmVsZWFzZSIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotZW5kaWYKLQotIwotIyBUaGVzZSBhcmUgdXNlZCBieSB0aGUgbGluayB0YXJnZXQgaWYgYW4gTkxNIGlzIGJlaW5nIGdlbmVyYXRlZAotIyBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmsgJ25hbWUnIGRpcmVjdGl2ZSB0byBuYW1lIHRoZSBubG0uICBJZiBsZWZ0IGJsYW5rCi0jIFRBUkdFVF9ubG0gKHNlZSBiZWxvdykgd2lsbCBiZSB1c2VkLgotIwotTkxNX05BTUUJCT0gaHRkaWdlc3QKLQotIwotIyBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmsgJy1kZXNjICcgZGlyZWN0aXZlLiAKLSMgSWYgbGVmdCBibGFuaywgTkxNX05BTUUgd2lsbCBiZSB1c2VkLgotIwotTkxNX0RFU0NSSVBUSU9OCT0gSFQgRGlnZXN0IFV0aWxpdHkgZm9yIE5ldFdhcmUKLQotIwotIyBUaGlzIGlzIHVzZWQgYnkgdGhlICctdGhyZWFkbmFtZScgZGlyZWN0aXZlLiAgSWYgbGVmdCBibGFuaywKLSMgTkxNX05BTUUgVGhyZWFkIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9USFJFQURfTkFNRQk9IGh0ZGlnZXN0Ci0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgVkVSU0lPTiB2YWx1ZSBpbiAKLSMgJChBUF9XT1JLKVxidWlsZFxOV0dOVWVudmlyb25tZW50LmluYwotIwotTkxNX1ZFUlNJT04JCT0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBvZiA2NEsKLSMKLU5MTV9TVEFDS19TSVpFCT0gODE5MgotCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZW50cnknIGRpcmVjdGl2ZQotIwotTkxNX0VOVFJZX1NZTQk9IF9MaWJDUHJlbHVkZQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWV4aXQnIGRpcmVjdGl2ZQotIwotTkxNX0VYSVRfU1lNCT0gX0xpYkNQb3N0bHVkZQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWNoZWNrJyBkaXJlY3RpdmUKLSMKLU5MTV9DSEVDS19TWU0JPQotCi0jCi0jIElmIHRoZXNlIGFyZSBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZmxhZ3MnIGRpcmVjdGl2ZQotIwotTkxNX0ZMQUdTCQk9IEFVVE9VTkxPQUQsIFBTRVVET1BSRUVNUFRJT04KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIGxpbmtlZCBpbiB3aXRoIHRoZSBYRENEYXRhIG9wdGlvbiBpbiB0aGUgZGVmIAotIyBmaWxlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb2YgJChOV09TKS9hcGFjaGUueGRjLiAgWERDRGF0YSBjYW4gYmUgZGlzYWJsZWQKLSMgYnkgc2V0dGluZyBBUEFDSEVfVU5JUFJPQyBpbiB0aGUgZW52aXJvbm1lbnQKLSMKLVhEQ0RBVEEgICAgICAgICA9IAotCi0jCi0jIElmIHRoZXJlIGlzIGFuIE5MTSB0YXJnZXQsIHB1dCBpdCBoZXJlCi0jCi1UQVJHRVRfbmxtID0gXAotCSQoT0JKRElSKS9odGRpZ2VzdC5ubG0gXAotCSQoRU9MSVNUKQotCi0jCi0jIElmIHRoZXJlIGlzIGFuIExJQiB0YXJnZXQsIHB1dCBpdCBoZXJlCi0jCi1UQVJHRVRfbGliID0gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgT0JKIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIE5MTSB0YXJnZXQgYWJvdmUuCi0jIFBhdGhzIG11c3QgYWxsIHVzZSB0aGUgJy8nIGNoYXJhY3RlcgotIwotRklMRVNfbmxtX29ianMgPSBcCi0JJChPQkpESVIpL2h0ZGlnZXN0Lm8gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgTElCIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIE5MTSB0YXJnZXQgYWJvdmUuCi0jIFRoZXNlIHdpbGwgYmUgYWRkZWQgYXMgYSBsaWJyYXJ5IGNvbW1hbmQgaW4gdGhlIGxpbmsub3B0IGZpbGUuCi0jCi1GSUxFU19ubG1fbGlicyA9IFwKLSAgIAlsaWJjcHJlLm8gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgbW9kdWxlcyB0aGF0IHRoZSBhYm92ZSBOTE0gdGFyZ2V0IGRlcGVuZHMgb24gdG8gbG9hZC4KLSMgVGhlc2Ugd2lsbCBiZSBhZGRlZCBhcyBhIG1vZHVsZSBjb21tYW5kIGluIHRoZSBsaW5rLm9wdCBmaWxlLgotIwotRklMRVNfbmxtX21vZHVsZXMgPSBcCi0JYXBybGliIFwKLQlsaWJjIFwKLQkkKEVPTElTVCkKLQotIwotIyBJZiB0aGUgbmxtIGhhcyBhIG1zZyBmaWxlLCBwdXQgaXQncyBwYXRoIGhlcmUKLSMKLUZJTEVfbmxtX21zZyA9Ci0gCi0jCi0jIElmIHRoZSBubG0gaGFzIGEgaGxwIGZpbGUgcHV0IGl0J3MgcGF0aCBoZXJlCi0jCi1GSUxFX25sbV9obHAgPQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlICQoTldPUylcY29weXJpZ2h0LnR4dC4KLSMKLUZJTEVfbmxtX2NvcHlyaWdodCA9Ci0KLSMKLSMgQW55IGFkZGl0aW9uYWwgaW1wb3J0cyBnbyBoZXJlCi0jCi1GSUxFU19ubG1fWGltcG9ydHMgPSBcCi0JQCQoQVBSKS9hcHJsaWIuaW1wIFwKLQlAbGliYy5pbXAgXAotCSQoRU9MSVNUKQotIAotIyAgIAotIyBBbnkgc3ltYm9scyBleHBvcnRlZCB0byBoZXJlCi0jCi1GSUxFU19ubG1fZXhwb3J0cyA9IFwKLQkkKEVPTElTVCkKLQkKLSMgICAKLSMgVGhlc2UgYXJlIHRoZSBPQkogZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTElCIHRhcmdldCBhYm92ZS4KLSMgUGF0aHMgbXVzdCBhbGwgdXNlIHRoZSAnLycgY2hhcmFjdGVyCi0jCi1GSUxFU19saWJfb2JqcyA9IFwKLQkJJChFT0xJU1QpCi0KLSMKLSMgaW1wbGVtZW50IHRhcmdldHMgYW5kIGRlcGVuZGFuY2llcyAobGVhdmUgdGhpcyBzZWN0aW9uIGFsb25lKQotIwotCi1saWJzIDo6ICQoT0JKRElSKSAkKFRBUkdFVF9saWIpCi0KLW5sbXMgOjogbGlicyAkKFRBUkdFVF9ubG0pCi0KLSMKLSMgVXBkYXRlZCB0aGlzIHRhcmdldCB0byBjcmVhdGUgbmVjZXNzYXJ5IGRpcmVjdG9yaWVzIGFuZCBjb3B5IGZpbGVzIHRvIHRoZSAKLSMgY29ycmVjdCBwbGFjZS4gIChTZWUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jIGZvciBleGFtcGxlcykKLSMKLWluc3RhbGwgOjogbmxtcyBGT1JDRQotCi0jCi0jIEFueSBzcGVjaWFsaXplZCBydWxlcyBoZXJlCi0jCi0KLSMKLSMgSW5jbHVkZSB0aGUgJ3RhaWwnIG1ha2VmaWxlIHRoYXQgaGFzIHRhcmdldHMgdGhhdCBkZXBlbmQgb24gdmFyaWFibGVzIGRlZmluZWQKLSMgaW4gdGhpcyBtYWtlZmlsZQotIwotCi1pbmNsdWRlICQoQVBfV09SSylcYnVpbGRcTldHTlV0YWlsLmluYwotCmRpZmYgLS1naXQgYS9zdXBwb3J0L05XR05VaHRwYXNzd2QgYi9zdXBwb3J0L05XR05VaHRwYXNzd2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMDA1MjkuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9OV0dOVWh0cGFzc3dkCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLSMKLSMgTWFrZSBzdXJlIGFsbCBuZWVkZWQgbWFjcm8ncyBhcmUgZGVmaW5lZAotIwotCi0jCi0jIEdldCB0aGUgJ2hlYWQnIG9mIHRoZSBidWlsZCBlbnZpcm9ubWVudCBpZiBuZWNlc3NhcnkuICBUaGlzIGluY2x1ZGVzIGRlZmF1bHQKLSMgdGFyZ2V0cyBhbmQgcGF0aHMgdG8gdG9vbHMKLSMKLQotaWZuZGVmIEVudmlyb25tZW50RGVmaW5lZAotaW5jbHVkZSAkKEFQX1dPUkspXGJ1aWxkXE5XR05VaGVhZC5pbmMKLWVuZGlmCi0KLSMKLSMgVGhlc2UgZGlyZWN0b3JpZXMgd2lsbCBiZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbmNsdWRlIGxpc3QsIGZvbGxvd2VkIGJ5Ci0jIElOQ0RJUlMKLSMKLVhJTkNESVJTCSs9IFwKLQkJCSQoTldPUykgXAotCQkJJChBUF9XT1JLKS9zcmNsaWIvYXByL2luY2x1ZGUgXAotCQkJJChBUF9XT1JLKS9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSBcCi0JCQkkKEFQX1dPUkspL3NyY2xpYi9hcHIvbWlzYy9uZXR3YXJlIFwKLQkJCSQoQVBfV09SSykvc3JjbGliL2FwciBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBmbGFncyB3aWxsIGNvbWUgYWZ0ZXIgQ0ZMQUdTCi0jCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBkZWZpbmVzIHdpbGwgY29tZSBhZnRlciBERUZJTkVTCi0jCi1YREVGSU5FUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBmbGFncyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaW5rLm9wdCBmaWxlCi0jCi1YTEZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSB2YWx1ZXMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgY29ycmVjdCB2YXJpYWJsZXMgYmFzZWQgb24gdGhlIHZhbHVlIG9mCi0jIFJFTEVBU0UKLSMKLWlmZXEgIiQoUkVMRUFTRSkiICJkZWJ1ZyIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJICAgCSQoRU9MSVNUKQotZW5kaWYKLQotaWZlcSAiJChSRUxFQVNFKSIgIm5vb3B0IgotWElOQ0RJUlMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhDRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YREVGSU5FUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWExGTEFHUwkJKz0gXAotCQkgICAJJChFT0xJU1QpCi1lbmRpZgotCi1pZmVxICIkKFJFTEVBU0UpIiAicmVsZWFzZSIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotZW5kaWYKLQotIwotIyBUaGVzZSBhcmUgdXNlZCBieSB0aGUgbGluayB0YXJnZXQgaWYgYW4gTkxNIGlzIGJlaW5nIGdlbmVyYXRlZAotIyBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmsgJ25hbWUnIGRpcmVjdGl2ZSB0byBuYW1lIHRoZSBubG0uICBJZiBsZWZ0IGJsYW5rCi0jIFRBUkdFVF9ubG0gKHNlZSBiZWxvdykgd2lsbCBiZSB1c2VkLgotIwotTkxNX05BTUUJCT0gaHRwYXNzd2QKLQotIwotIyBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmsgJy1kZXNjICcgZGlyZWN0aXZlLiAKLSMgSWYgbGVmdCBibGFuaywgTkxNX05BTUUgd2lsbCBiZSB1c2VkLgotIwotTkxNX0RFU0NSSVBUSU9OCT0gSFQgUGFzc3dvcmQgVXRpbGl0eSBmb3IgTmV0V2FyZQotCi0jCi0jIFRoaXMgaXMgdXNlZCBieSB0aGUgJy10aHJlYWRuYW1lJyBkaXJlY3RpdmUuICBJZiBsZWZ0IGJsYW5rLAotIyBOTE1fTkFNRSBUaHJlYWQgd2lsbCBiZSB1c2VkLgotIwotTkxNX1RIUkVBRF9OQU1FCT0gaHRwYXNzd2QKLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSBWRVJTSU9OIHZhbHVlIGluIAotIyAkKEFQX1dPUkspXGJ1aWxkXE5XR05VZW52aXJvbm1lbnQuaW5jCi0jCi1OTE1fVkVSU0lPTgkJPQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG9mIDY0SwotIwotTkxNX1NUQUNLX1NJWkUJPSA4MTkyCi0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1lbnRyeScgZGlyZWN0aXZlCi0jCi1OTE1fRU5UUllfU1lNCT0gX0xpYkNQcmVsdWRlCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctZXhpdCcgZGlyZWN0aXZlCi0jCi1OTE1fRVhJVF9TWU0JPSBfTGliQ1Bvc3RsdWRlCi0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsaW5rICctY2hlY2snIGRpcmVjdGl2ZQotIwotTkxNX0NIRUNLX1NZTQk9Ci0KLSMKLSMgSWYgdGhlc2UgYXJlIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1mbGFncycgZGlyZWN0aXZlCi0jCi1OTE1fRkxBR1MJCT0gIEFVVE9VTkxPQUQsIFBTRVVET1BSRUVNUFRJT04KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIGxpbmtlZCBpbiB3aXRoIHRoZSBYRENEYXRhIG9wdGlvbiBpbiB0aGUgZGVmIAotIyBmaWxlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb2YgJChOV09TKS9hcGFjaGUueGRjLiAgWERDRGF0YSBjYW4gYmUgZGlzYWJsZWQKLSMgYnkgc2V0dGluZyBBUEFDSEVfVU5JUFJPQyBpbiB0aGUgZW52aXJvbm1lbnQKLSMKLVhEQ0RBVEEgICAgICAgICA9IAotCi0jCi0jIElmIHRoZXJlIGlzIGFuIE5MTSB0YXJnZXQsIHB1dCBpdCBoZXJlCi0jCi1UQVJHRVRfbmxtID0gXAotCSQoT0JKRElSKS9odHBhc3N3ZC5ubG0gXAotCSQoRU9MSVNUKQotCi0jCi0jIElmIHRoZXJlIGlzIGFuIExJQiB0YXJnZXQsIHB1dCBpdCBoZXJlCi0jCi1UQVJHRVRfbGliID0gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgT0JKIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIE5MTSB0YXJnZXQgYWJvdmUuCi0jIFBhdGhzIG11c3QgYWxsIHVzZSB0aGUgJy8nIGNoYXJhY3RlcgotIwotRklMRVNfbmxtX29ianMgPSBcCi0JJChPQkpESVIpL2h0cGFzc3dkLm8gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgTElCIGZpbGVzIG5lZWRlZCB0byBjcmVhdGUgdGhlIE5MTSB0YXJnZXQgYWJvdmUuCi0jIFRoZXNlIHdpbGwgYmUgYWRkZWQgYXMgYSBsaWJyYXJ5IGNvbW1hbmQgaW4gdGhlIGxpbmsub3B0IGZpbGUuCi0jCi1GSUxFU19ubG1fbGlicyA9IFwKLSAgIAlsaWJjcHJlLm8gXAotCSQoRU9MSVNUKQotCi0jCi0jIFRoZXNlIGFyZSB0aGUgbW9kdWxlcyB0aGF0IHRoZSBhYm92ZSBOTE0gdGFyZ2V0IGRlcGVuZHMgb24gdG8gbG9hZC4KLSMgVGhlc2Ugd2lsbCBiZSBhZGRlZCBhcyBhIG1vZHVsZSBjb21tYW5kIGluIHRoZSBsaW5rLm9wdCBmaWxlLgotIwotRklMRVNfbmxtX21vZHVsZXMgPSBcCi0JYXBybGliIFwKLQlsaWJjIFwKLQkkKEVPTElTVCkKLQotIwotIyBJZiB0aGUgbmxtIGhhcyBhIG1zZyBmaWxlLCBwdXQgaXQncyBwYXRoIGhlcmUKLSMKLUZJTEVfbmxtX21zZyA9Ci0gCi0jCi0jIElmIHRoZSBubG0gaGFzIGEgaGxwIGZpbGUgcHV0IGl0J3MgcGF0aCBoZXJlCi0jCi1GSUxFX25sbV9obHAgPQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlICQoTldPUylcY29weXJpZ2h0LnR4dC4KLSMKLUZJTEVfbmxtX2NvcHlyaWdodCA9Ci0KLSMKLSMgQW55IGFkZGl0aW9uYWwgaW1wb3J0cyBnbyBoZXJlCi0jCi1GSUxFU19ubG1fWGltcG9ydHMgPSBcCi0JQCQoQVBSKS9hcHJsaWIuaW1wIFwKLQlAbGliYy5pbXAgXAotCSQoRU9MSVNUKQotIAotIyAgIAotIyBBbnkgc3ltYm9scyBleHBvcnRlZCB0byBoZXJlCi0jCi1GSUxFU19ubG1fZXhwb3J0cyA9IFwKLQkkKEVPTElTVCkKLQkKLSMgICAKLSMgVGhlc2UgYXJlIHRoZSBPQkogZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTElCIHRhcmdldCBhYm92ZS4KLSMgUGF0aHMgbXVzdCBhbGwgdXNlIHRoZSAnLycgY2hhcmFjdGVyCi0jCi1GSUxFU19saWJfb2JqcyA9IFwKLQkJJChFT0xJU1QpCi0KLSMKLSMgaW1wbGVtZW50IHRhcmdldHMgYW5kIGRlcGVuZGFuY2llcyAobGVhdmUgdGhpcyBzZWN0aW9uIGFsb25lKQotIwotCi1saWJzIDo6ICQoT0JKRElSKSAkKFRBUkdFVF9saWIpCi0KLW5sbXMgOjogbGlicyAkKFRBUkdFVF9ubG0pCi0KLSMKLSMgVXBkYXRlZCB0aGlzIHRhcmdldCB0byBjcmVhdGUgbmVjZXNzYXJ5IGRpcmVjdG9yaWVzIGFuZCBjb3B5IGZpbGVzIHRvIHRoZSAKLSMgY29ycmVjdCBwbGFjZS4gIChTZWUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jIGZvciBleGFtcGxlcykKLSMKLWluc3RhbGwgOjogbmxtcyBGT1JDRQotCi0jCi0jIEFueSBzcGVjaWFsaXplZCBydWxlcyBoZXJlCi0jCi0KLSMKLSMgSW5jbHVkZSB0aGUgJ3RhaWwnIG1ha2VmaWxlIHRoYXQgaGFzIHRhcmdldHMgdGhhdCBkZXBlbmQgb24gdmFyaWFibGVzIGRlZmluZWQKLSMgaW4gdGhpcyBtYWtlZmlsZQotIwotCi1pbmNsdWRlICQoQVBfV09SSylcYnVpbGRcTldHTlV0YWlsLmluYwotCmRpZmYgLS1naXQgYS9zdXBwb3J0L05XR05VbWFrZWZpbGUgYi9zdXBwb3J0L05XR05VbWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMWFlZjUuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9OV0dOVW1ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLSMKLSMgRGVjbGFyZSB0aGUgc3ViLWRpcmVjdG9yaWVzIHRvIGJlIGJ1aWx0IGhlcmUKLSMKLQotU1VCRElSUyA9IFwKLQkkKEVPTElTVCkgCi0KLSMKLSMgR2V0IHRoZSAnaGVhZCcgb2YgdGhlIGJ1aWxkIGVudmlyb25tZW50LiAgVGhpcyBpbmNsdWRlcyBkZWZhdWx0IHRhcmdldHMgYW5kCi0jIHBhdGhzIHRvIHRvb2xzCi0jCi0KLWluY2x1ZGUgJChBUF9XT1JLKVxidWlsZFxOV0dOVWhlYWQuaW5jCi0KLSMKLSMgYnVpbGQgdGhpcyBsZXZlbCdzIGZpbGVzCi0KLSMKLSMgTWFrZSBzdXJlIGFsbCBuZWVkZWQgbWFjcm8ncyBhcmUgZGVmaW5lZAotIwotCi0jIFRoZXNlIGRpcmVjdG9yaWVzIHdpbGwgYmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5jbHVkZSBsaXN0LCBmb2xsb3dlZCBieQotIyBJTkNESVJTCi0jCi1YSU5DRElSUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBmbGFncyB3aWxsIGNvbWUgYWZ0ZXIgQ0ZMQUdTCi0jCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBkZWZpbmVzIHdpbGwgY29tZSBhZnRlciBERUZJTkVTCi0jCi1YREVGSU5FUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBmbGFncyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaW5rLm9wdCBmaWxlCi0jCi1YTEZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSB2YWx1ZXMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgY29ycmVjdCB2YXJpYWJsZXMgYmFzZWQgb24gdGhlIHZhbHVlIG9mCi0jIFJFTEVBU0UKLSMKLWlmZXEgIiQoUkVMRUFTRSkiICJkZWJ1ZyIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJICAgCSQoRU9MSVNUKQotZW5kaWYKLQotaWZlcSAiJChSRUxFQVNFKSIgIm5vb3B0IgotWElOQ0RJUlMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhDRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YREVGSU5FUwkrPSBcCi0JCQkkKEVPTElTVCkKLQotWExGTEFHUwkJKz0gXAotCQkgICAJJChFT0xJU1QpCi1lbmRpZgotCi1pZmVxICIkKFJFTEVBU0UpIiAicmVsZWFzZSIKLVhJTkNESVJTCSs9IFwKLQkJCSQoRU9MSVNUKQotCi1YQ0ZMQUdTCQkrPSBcCi0JCQkkKEVPTElTVCkKLQotWERFRklORVMJKz0gXAotCQkJJChFT0xJU1QpCi0KLVhMRkxBR1MJCSs9IFwKLQkJCSQoRU9MSVNUKQotZW5kaWYKLQotIwotIyBUaGVzZSBhcmUgdXNlZCBieSB0aGUgbGluayB0YXJnZXQgaWYgYW4gTkxNIGlzIGJlaW5nIGdlbmVyYXRlZAotIyBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmsgJ25hbWUnIGRpcmVjdGl2ZSB0byBuYW1lIHRoZSBubG0uICBJZiBsZWZ0IGJsYW5rCi0jIFRBUkdFVF9ubG0gKHNlZSBiZWxvdykgd2lsbCBiZSB1c2VkLgotIwotTkxNX05BTUUJCT0KLQotIwotIyBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmsgJy1kZXNjICcgZGlyZWN0aXZlLiAKLSMgSWYgbGVmdCBibGFuaywgTkxNX05BTUUgd2lsbCBiZSB1c2VkLgotIwotTkxNX0RFU0NSSVBUSU9OCT0KLQotIwotIyBUaGlzIGlzIHVzZWQgYnkgdGhlICctdGhyZWFkbmFtZScgZGlyZWN0aXZlLiAgSWYgbGVmdCBibGFuaywKLSMgTkxNX05BTUUgVGhyZWFkIHdpbGwgYmUgdXNlZC4KLSMKLU5MTV9USFJFQURfTkFNRQk9Ci0KLSMKLSMgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgVkVSU0lPTiB2YWx1ZSBpbiAKLSMgJChBUF9XT1JLKVxidWlsZFxOV0dOVWVudmlyb25tZW50LmluYwotIwotTkxNX1ZFUlNJT04JCT0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBvZiA2NEsKLSMKLU5MTV9TVEFDS19TSVpFCT0KLQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWVudHJ5JyBkaXJlY3RpdmUKLSMKLU5MTV9FTlRSWV9TWU0JPQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWV4aXQnIGRpcmVjdGl2ZQotIwotTkxNX0VYSVRfU1lNCT0KLQotIwotIyBJZiB0aGlzIGlzIHNwZWNpZmllZCBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxpbmsgJy1jaGVjaycgZGlyZWN0aXZlCi0jCi1OTE1fQ0hFQ0tfU1lNCT0KLQotIwotIyBJZiB0aGVzZSBhcmUgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgbGluayAnLWZsYWdzJyBkaXJlY3RpdmUKLSMKLU5MTV9GTEFHUwkJPQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgbGlua2VkIGluIHdpdGggdGhlIFhEQ0RhdGEgb3B0aW9uIGluIHRoZSBkZWYgCi0jIGZpbGUgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBvZiAkKE5XT1MpL2FwYWNoZS54ZGMuICBYRENEYXRhIGNhbiBiZSBkaXNhYmxlZAotIyBieSBzZXR0aW5nIEFQQUNIRV9VTklQUk9DIGluIHRoZSBlbnZpcm9ubWVudAotIwotWERDREFUQSAgICAgICAgID0gCi0KLSMKLSMgSWYgdGhlcmUgaXMgYW4gTkxNIHRhcmdldCwgcHV0IGl0IGhlcmUKLSMKLVRBUkdFVF9ubG0gPSBcCi0JJChPQkpESVIpL2h0cGFzc3dkLm5sbSBcCi0JJChPQkpESVIpL2h0ZGlnZXN0Lm5sbSBcCi0JJChFT0xJU1QpCi0KLSMKLSMgSWYgdGhlcmUgaXMgYW4gTElCIHRhcmdldCwgcHV0IGl0IGhlcmUKLSMKLVRBUkdFVF9saWIgPSBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBPQkogZmlsZXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgTkxNIHRhcmdldCBhYm92ZS4KLSMgUGF0aHMgbXVzdCBhbGwgdXNlIHRoZSAnLycgY2hhcmFjdGVyCi0jCi1GSUxFU19ubG1fb2JqcyA9IFwKLQkkKEVPTElTVCkKLQotIwotIyBUaGVzZSBhcmUgdGhlIExJQiBmaWxlcyBuZWVkZWQgdG8gY3JlYXRlIHRoZSBOTE0gdGFyZ2V0IGFib3ZlLgotIyBUaGVzZSB3aWxsIGJlIGFkZGVkIGFzIGEgbGlicmFyeSBjb21tYW5kIGluIHRoZSBsaW5rLm9wdCBmaWxlLgotIwotRklMRVNfbmxtX2xpYnMgPSBcCi0JJChFT0xJU1QpCi0KLSMKLSMgVGhlc2UgYXJlIHRoZSBtb2R1bGVzIHRoYXQgdGhlIGFib3ZlIE5MTSB0YXJnZXQgZGVwZW5kcyBvbiB0byBsb2FkLgotIyBUaGVzZSB3aWxsIGJlIGFkZGVkIGFzIGEgbW9kdWxlIGNvbW1hbmQgaW4gdGhlIGxpbmsub3B0IGZpbGUuCi0jCi1GSUxFU19ubG1fbW9kdWxlcyA9IFwKLQkkKEVPTElTVCkKLQotIwotIyBJZiB0aGUgbmxtIGhhcyBhIG1zZyBmaWxlLCBwdXQgaXQncyBwYXRoIGhlcmUKLSMKLUZJTEVfbmxtX21zZyA9Ci0gCi0jCi0jIElmIHRoZSBubG0gaGFzIGEgaGxwIGZpbGUgcHV0IGl0J3MgcGF0aCBoZXJlCi0jCi1GSUxFX25sbV9obHAgPQotCi0jCi0jIElmIHRoaXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlICQoTldPUylcY29weXJpZ2h0LnR4dC4KLSMKLUZJTEVfbmxtX2NvcHlyaWdodCA9Ci0KLSMKLSMgQW55IGFkZGl0aW9uYWwgaW1wb3J0cyBnbyBoZXJlCi0jCi1GSUxFU19ubG1fWGltcG9ydHMgPSBcCi0JJChFT0xJU1QpCi0gCi0jICAgCi0jIEFueSBzeW1ib2xzIGV4cG9ydGVkIHRvIGhlcmUKLSMKLUZJTEVTX25sbV9leHBvcnRzID0gXAotCSQoRU9MSVNUKQotCQotIyAgIAotIyBUaGVzZSBhcmUgdGhlIE9CSiBmaWxlcyBuZWVkZWQgdG8gY3JlYXRlIHRoZSBMSUIgdGFyZ2V0IGFib3ZlLgotIyBQYXRocyBtdXN0IGFsbCB1c2UgdGhlICcvJyBjaGFyYWN0ZXIKLSMKLUZJTEVTX2xpYl9vYmpzID0gXAotCQkkKEVPTElTVCkKLQotIwotIyBpbXBsZW1lbnQgdGFyZ2V0cyBhbmQgZGVwZW5kYW5jaWVzIChsZWF2ZSB0aGlzIHNlY3Rpb24gYWxvbmUpCi0jCi0KLWxpYnMgOjogJChPQkpESVIpICQoVEFSR0VUX2xpYikKLQotbmxtcyA6OiBsaWJzICQoVEFSR0VUX25sbSkKLQotIwotIyBVcGRhdGVkIHRoaXMgdGFyZ2V0IHRvIGNyZWF0ZSBuZWNlc3NhcnkgZGlyZWN0b3JpZXMgYW5kIGNvcHkgZmlsZXMgdG8gdGhlIAotIyBjb3JyZWN0IHBsYWNlLiAgKFNlZSAkKEFQX1dPUkspXGJ1aWxkXE5XR05VaGVhZC5pbmMgZm9yIGV4YW1wbGVzKQotIwotaW5zdGFsbCA6OiBubG1zIEZPUkNFCi0JY29weSAkKE9CSkRJUilcKi5ubG0gJChJTlNUQUxMKVxBcGFjaGUyXCouKgotCi0jCi0jIEFueSBzcGVjaWFsaXplZCBydWxlcyBoZXJlCi0jCi0KLSMKLSMgSW5jbHVkZSB0aGUgJ3RhaWwnIG1ha2VmaWxlIHRoYXQgaGFzIHRhcmdldHMgdGhhdCBkZXBlbmQgb24gdmFyaWFibGVzIGRlZmluZWQKLSMgaW4gdGhpcyBtYWtlZmlsZQotIwotCi1pbmNsdWRlICQoQVBfV09SSylcYnVpbGRcTldHTlV0YWlsLmluYwotCi0KZGlmZiAtLWdpdCBhL3N1cHBvcnQvUkVBRE1FIGIvc3VwcG9ydC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZTljYWYuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi1TdXBwb3J0IGZpbGVzOgotCi1hYgotCUFCdXNlIHlvdXIgc2VydmVyIHdpdGggdGhpcyBiZW5jaG1hcmtlci4gUnVkaW1lbnRhcnkKLQljb21tYW5kIGxpbmUgdGVzdGluZyB0b29sLgotCi1hcGFjaGVjdGwKLQlBcGFjaGUgcnVuLXRpbWUgQ29udHJvbCBzY3JpcHQuIFRvIGZhY2lsaXRhdGUgdGhlCi0JYWRtaW5pc3RyYXRvciBhbmQvb3IgeW91ciByYy5kIHNjcmlwdHMgdG8gY29udHJvbCB0aGUgCi0JZnVuY3Rpb25pbmcgb2YgdGhlIEFwYWNoZSBodHRwZCBkYWVtb24uCi0KLWFweHMKLQlBUGFjaGUgZVh0ZW5TaW9uIHRvb2wuIEVhc2VzIGJ1aWxkaW5nIGFuZCBpbnN0YWxsaW5nCi0JRFNPIHN0eWxlIG1vZHVsZXMuCi0KLWRibW1hbmFnZQotCUNyZWF0ZSBhbmQgdXBkYXRlIHVzZXIgYXV0aGVudGljYXRpb24gZmlsZXMgaW4gdGhlIGZhc3RlcgotCURCTSBmb3JtYXQgdXNlZCBieSBtb2RfYXV0aF9kYi4KLQotaHRkaWdlc3QKLQlDcmVhdGUgYW5kIHVwZGF0ZSB1c2VyIGF1dGhlbnRpY2F0aW9uIGZpbGVzIHVzZWQgaW4KLQlESUdFU1QgYXV0aGVudGlmaWNhdGlvbi4gU2VlIG1vZF9hdXRoX2RpZ2VzdC4KLQotaHRwYXNzd2QgCi0JQ3JlYXRlIGFuZCB1cGRhdGUgdXNlciBhdXRoZW50aWNhdGlvbiBmaWxlcyB1c2VkIGluCi0JQkFTSUMgYXV0aGVudGlmaWNhdGlvbi4gSS5lLiB0aGUgaHRwYXNzd2QgZmlsZXMuCi0JU2VlIG1vZF9hdXRoLgotCi1odHRwZC44Ci0JR2VuZXJhbCBhcGFjaGUgbWFuIHBhZ2UuCi0KLWxvZ19zZXJ2ZXJfc3RhdHVzCi0JVGhpcyBzY3JpcHQgaXMgZGVzaWduZWQgdG8gYmUgcnVuIGF0IGEgZnJlcXVlbnQgaW50ZXJ2YWwgYnkgc29tZXRoaW5nCi0JbGlrZSBjcm9uLiAgSXQgY29ubmVjdHMgdG8gdGhlIHNlcnZlciBhbmQgZG93bmxvYWRzIHRoZSBzdGF0dXMKLQlpbmZvcm1hdGlvbi4gIEl0IHJlZm9ybWF0cyB0aGUgaW5mb3JtYXRpb24gdG8gYSBzaW5nbGUgbGluZSBhbmQgbG9ncwotCWl0IHRvIGEgZmlsZS4gCi0KLWxvZ3Jlc29sdmUKLQlyZXNvbHZlIGhvc3RuYW1lcyBmb3IgSVAtYWRyZXNzZXMgaW4gQXBhY2hlIGxvZ2ZpbGVzCi0KLXBoZl9hYnVzZV9sb2cuY2dpCi0JVGhpcyBzY3JpcHQgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IHBlb3BsZSB0cnlpbmcgdG8gYWJ1c2UgYW4gYW5jaWVudAotCWFuZCBsb25nIHBsdWdnZWQgc2VjdXJpdHkgaG9sZSB3aGljaCBleGlzdGVkIGluIGEgQ0dJIHNjcmlwdCBkaXN0cmlidXRlZAotCXdpdGggQXBhY2hlIDEuMC4zIGFuZCBlYXJsaWVyIHZlcnNpb25zLgotCi1yb3RhdGVsb2dzCi0Jcm90YXRlIEFwYWNoZSBsb2dzIHdpdGhvdXQgaGF2aW5nIHRvIGtpbGwgdGhlIHNlcnZlci4KLQotc3BsaXQtbG9nZmlsZQotCVRoaXMgc2NyaXB0IHdpbGwgdGFrZSBhIGNvbWJpbmVkIHZpcnR1YWwgaG9zdHMgYWNjZXNzCi0JbG9nIGZpbGUgYW5kIGJyZWFrIGl0cyBjb250ZW50cyBpbnRvIHNlcGFyYXRlIGZpbGVzLgotCi1zdWV4ZWMKLQlTd2l0Y2ggVXNlciBGb3IgRXhlYy4gVXNlZCBpbnRlcm5hbGx5IGJ5IGFwYWNoZSwgCi0gICAgICAgIHNlZSAgdGhlICBkb2N1bWVudCAgYEFwYWNoZSAgc3VFWEVDICBTdXBwb3J0JwotCXVuZGVyIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzL3N1ZXhlYy5odG1sIC4KLQotU0hBMQotCVRoaXMgZGlyZWN0b3J5IGluY2x1ZGVzIHNvbWUgdXRpbGl0aWVzIHRvIGFsbG93IEFwYWNoZSAxLjMuNiB0byAKLQlyZWNvZ25pemUgcGFzc3dvcmRzIGluIFNIQTEgZm9ybWF0LCBhcyB1c2VkIGJ5IE5ldHNjYXBlIHdlYiAKLQlzZXJ2ZXJzLiBJdCBpcyBub3QgaW5zdGFsbGVkIGJ5IGRlZmF1bHQuCi0KZGlmZiAtLWdpdCBhL3N1cHBvcnQvU0hBMS9SRUFETUUuc2hhMSBiL3N1cHBvcnQvU0hBMS9SRUFETUUuc2hhMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk5OGUxZi4uMDAwMDAwMAotLS0gYS9zdXBwb3J0L1NIQTEvUkVBRE1FLnNoYTEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1UaGlzIGRpcmVjdG9yeSBpbmNsdWRlcyBzb21lIHV0aWxpdGllcyB0byBhbGxvdyBBcGFjaGUgMS4zLjYgdG8gCi1yZWNvZ25pemUgcGFzc3dvcmRzIGluIFNIQTEgZm9ybWF0LCBhcyB1c2VkIGJ5IE5ldHNjYXBlIHdlYiBzZXJ2ZXJzLiAgCi0KLUZyb20gTmV0c2NhcGUncyBhZG1pbiBpbnRlcmZhY2UsIGV4cG9ydCB0aGUgcGFzc3dvcmQgZGF0YWJhc2UgdG8gYW4gCi1sZGlmIGZpbGUgYW5kIHRoZW4gdXNlIGNvbnZlcnQucGwgaW4gdGhpcyBkaXN0cmlidXRpb24gdG8gZ2VuZXJhdGUgCi1hcGFjaGUgc3R5bGUgcGFzc3dvcmQgZmlsZXMuICAKLQotTm90ZTogU0hBMSBzdXBwb3J0IGlzIHVzZWZ1bCBmb3IgbWlncmF0aW9uIHB1cnBvc2VzLCBidXQgaXMgbGVzcwotICAgICAgc2VjdXJlIHRoYW4gQXBhY2hlJ3MgcGFzc3dvcmQgZm9ybWF0LCBzaW5jZSBBcGFjaGUncyAoTUQ1KQotICAgICAgcGFzc3dvcmQgZm9ybWF0IHVzZXMgYSByYW5kb20gZWlnaHQgY2hhcmFjdGVyIHNhbHQgdG8gZ2VuZXJhdGUKLSAgICAgIG9uZSBvZiBtYW55IHBvc3NpYmxlIGhhc2hlcyBmb3IgdGhlIHNhbWUgcGFzc3dvcmQuICBOZXRzY2FwZQotICAgICAgdXNlcyBwbGFpbiBTSEExIHdpdGhvdXQgYSBzYWx0LCBzbyB0aGUgc2FtZSBwYXNzd29yZAotICAgICAgd2lsbCBhbHdheXMgZ2VuZXJhdGUgdGhlIHNhbWUgaGFzaCwgbWFraW5nIGl0IGVhc2llcgotICAgICAgdG8gYnJlYWsgc2luY2UgdGhlIHNlYXJjaCBzcGFjZSBpcyBzbWFsbGVyLgotCi1UaGlzIGNvZGUgd2FzIGNvbnRyaWJ1dGVkIGJ5IENsaW50b24gV29uZyA8Y2xpbnRkd0BuZXRjb20uY29tPi4KLQotUkVBRE1FLnNoYTEgCi0JdGhpcyBmaWxlCi0KLWNvbnZlcnQtc2hhMS5wbCAKLQl0YWtlcyBhbiBsZGlmIGR1bXAgZnJvbSBOZXRzY2FwZSdzIHdlYiBzZXJ2ZXIgb24KLSAgICAgICAgc3RhbmRhcmQgaW4sIG91dHB1dHMgYXBhY2hlIGh0cGFzc3dkIGZvcm1hdCBvbiBzdGFuZGFyZCBvdXQuCi0KLSAgICAgICAgVXNhZ2U6IGNvbnZlcnQucGwgPCBsZGlmID4gcGFzc3dvcmRzCi0KLWh0cGFzc3dkLXNoYTEucGwKLQlwZXJsIHNjcmlwdCB0byBnZW5lcmF0ZSBlbnRyaWVzIGluIGFwYWNoZSBodHBhc3N3ZCBmb3JtYXQuCi0KLSAgICAgICAJVXNhZ2U6IGh0cGFzc3dkLXNoYTEucGwgc29tZV91c2VyIHNvbWVfcGFzc3dvcmQKLQotbGRpZi1zaGExLmV4YW1wbGUKLQlzYW1wbGUgbGRpZiBkdW1wIHdpdGggb25lIHNoYTEgcGFzc3dvcmQgYW5kIG9uZSBjcnlwdCBwYXNzd29yZC4KLQpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9TSEExL2NvbnZlcnQtc2hhMS5wbCBiL3N1cHBvcnQvU0hBMS9jb252ZXJ0LXNoYTEucGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MjI4MDIuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9TSEExL2NvbnZlcnQtc2hhMS5wbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMhL3Vzci9iaW4vcGVybCAtdwotdXNlIHN0cmljdDsKLQotIyBUaGlzIGlzIHB1YmxpYyBkb21haW4gY29kZS4gIERvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggaXQuCi0jIEl0IHdhcyBvcmlnaW5hbGx5IGluY2x1ZGVkIGluIENsaW50b24gV29uZydzIEFwYWNoZSAxLjMuNiBTSEExL2xkaWYKLSMgcGF0Y2ggZGlzdHJpYnV0aW9uIGFzIHNhbXBsZSBjb2RlIGZvciBjb252ZXJ0aW5nIGFjY291bnRzIGZyb20KLSMgbGRpZiBmb3JtYXQgKGFzIHVzZWQgYnkgTmV0c2NhcGUgd2ViIHNlcnZlcnMpIHRvIEFwYWNoZSBwYXNzd29yZCBmb3JtYXQuCi0KLW15ICR1aWQ9Jyc7Ci1teSAkcGFzc3dkPScnOwotCi13aGlsZSAobXkgJGxpbmUgPSA8PikgewotICBjaG9tcCAkbGluZTsKLSAgaWYgKCAkbGluZSA9fiAvdWlkOlxzKiguKykvKSB7ICR1aWQgPSAkMSB9Ci0gIGlmICggJGxpbmUgPX4gL3VzZXJwYXNzd29yZDpccyooXHtcdytcfS4rKS8pIHsKLSAgICAkcGFzc3dkID0gJDE7Ci0gICAgJHBhc3N3ZCA9fiBzL15ce2NyeXB0XH0vL2k7ICAjIEFwYWNoZSBzdG9yZXMgY3J5cHQgd2l0aG91dCBhIG1hZ2ljIHN0cmluZwotICB9Ci0KLSAgaWYgKGxlbmd0aCgkbGluZSk9PTApIHsKLQotICAgIGlmIChsZW5ndGggJHVpZCBhbmQgbGVuZ3RoICRwYXNzd2QpIHsKLSAgICAgIHByaW50ICR1aWQsICc6JywgJHBhc3N3ZCwgIlxuIjsKLSAgICB9ICMgb3V0cHV0IGlmIHdlIGhhdmUgc29tZXRoaW5nIHRvIHByaW50Ci0KLSAgICAkdWlkID0gJyc7Ci0gICAgJHBhc3N3ZCA9ICcnOwotCi0gIH0gIyBpZiBuZXdsaW5lCi19ICMgd2hpbGUgc29tZXRoaW5nIHRvIHJlYWQKLQotIyBoYW5kbGUgbGFzdCBlbnRyeSBpZiB0aGVyZSBpc24ndCBhIG5ld2xpbmUgYmVmb3JlIEVPRgotICAgIGlmIChsZW5ndGggJHVpZCBhbmQgbGVuZ3RoICRwYXNzd2QpIHsKLSAgcHJpbnQgJHVpZCwgJzonLCAkcGFzc3dkLCAiXG4iOwotfQotCmRpZmYgLS1naXQgYS9zdXBwb3J0L1NIQTEvaHRwYXNzd2Qtc2hhMS5wbCBiL3N1cHBvcnQvU0hBMS9odHBhc3N3ZC1zaGExLnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDYyNGQxLi4wMDAwMDAwCi0tLSBhL3N1cHBvcnQvU0hBMS9odHBhc3N3ZC1zaGExLnBsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyEvdXNyL2Jpbi9wZXJsIC13Ci11c2Ugc3RyaWN0OwotIwotIyBVdGlsaXR5IHdoaWNoIHRha2VzIGEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkCi0jIG9uIHRoZSBjb21tYW5kIGxpbmUgYW5kIGdlbmVyYXRlcyBhIHVzZXJuYW1lCi0jIHNoYTEtZW5jcnl0cGVkIHBhc3N3b3JkIG9uIHRoZSBzdGRvdXQuCi0jIAotIyBUeXBpY2FsIHVzZWFnZToKLSMgCS4vaHRwYXNzd2Qtc2hhMS5wbCBkaXJreCBNeVNlY3JldCA+PiBzaGExLXBhc3N3ZAotIwotIyBUaGlzIGlzIHB1YmxpYyBkb21haW4gY29kZS4gIERvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggaXQuCi0jIEl0IHdhcyBvcmlnaW5hbGx5IGluY2x1ZGVkIGluIENsaW50b24gV29uZydzIEFwYWNoZSAxLjMuNiBTSEExL2xkaWYKLSMgcGF0Y2ggZGlzdHJpYnV0aW9uIGFzIHNhbXBsZSBjb2RlIGZvciBnZW5lcmF0aW5nIGVudHJpZXMgZm9yCi0jIEFwYWNoZSBwYXNzd29yZCBmaWxlcyB1c2luZyBTSEExLgotCi11c2UgTUlNRTo6QmFzZTY0OyAgIyBodHRwOi8vd3d3LmNwYW4ub3JnL21vZHVsZXMvYnktbW9kdWxlL01JTUUvCi11c2UgRGlnZXN0OjpTSEExOyAgIyBodHRwOi8vd3d3LmNwYW4ub3JnL21vZHVsZXMvYnktbW9kdWxlL01ENS8KLQotaWYgKCQjQVJHViE9MSkgeyBkaWUgIlVzYWdlICQwOiB1c2VyIHBhc3N3b3JkXG4iIH0KLQotcHJpbnQgJEFSR1ZbMF0sICc6e1NIQX0nLCBlbmNvZGVfYmFzZTY0KCBEaWdlc3Q6OlNIQTE6OnNoYTEoJEFSR1ZbMV0pICk7Ci0KZGlmZiAtLWdpdCBhL3N1cHBvcnQvU0hBMS9sZGlmLXNoYTEuZXhhbXBsZSBiL3N1cHBvcnQvU0hBMS9sZGlmLXNoYTEuZXhhbXBsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhmZTkxNy4uMDAwMDAwMAotLS0gYS9zdXBwb3J0L1NIQTEvbGRpZi1zaGExLmV4YW1wbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1kbjogY249c29tZXVzZXIKLWNuOiBzb21ldXNlcgotc246IHNvbWV1c2VyCi1vYmplY3RjbGFzczogdG9wCi1vYmplY3RjbGFzczogcGVyc29uCi1vYmplY3RjbGFzczogb3JnYW5pemF0aW9uYWxQZXJzb24KLW9iamVjdGNsYXNzOiBpbmV0T3JnUGVyc29uCi11aWQ6IHNvbWV1c2VyCi11c2VycGFzc3dvcmQ6IHtTSEF9R3ZGK2MzSWR2Z3hBQVJ1QzdVdXhwOXZqemlrPQotCi1kbjogY249YW5vdGhlcnVzZXIKLWNuOiBhbm90aGVydXNlcgotc246IGFub3RoZXJ1c2VyCi1vYmplY3RjbGFzczogdG9wCi1vYmplY3RjbGFzczogcGVyc29uCi1vYmplY3RjbGFzczogb3JnYW5pemF0aW9uYWxQZXJzb24KLW9iamVjdGNsYXNzOiBpbmV0T3JnUGVyc29uCi11aWQ6IGFub3RoZXJ1c2VyCi11c2VycGFzc3dvcmQ6IHtjcnlwdH1lRm5wLjRzejVYbkg2CmRpZmYgLS1naXQgYS9zdXBwb3J0L2FiLmMgYi9zdXBwb3J0L2FiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkOTY4YjIuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9hYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEwMCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAgICoqIFRoaXMgcHJvZ3JhbSBpcyBiYXNlZCBvbiBaZXVzQmVuY2ggVjEuMCB3cml0dGVuIGJ5IEFkYW0gVHdpc3MKLSAgICoqIHdoaWNoIGlzIENvcHlyaWdodCAoYykgMTk5NiBieSBaZXVzIFRlY2hub2xvZ3kgTHRkLiBodHRwOi8vd3d3LnpldXN0ZWNoLm5ldC8KLSAgICoqCi0gICAqKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgYW5kIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FyYW50aWVzLAotICAgKiogaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCi0gICAqKiBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4gIEluIG5vIGV2ZW50IHNoYWxsCi0gICAqKiBaZXVzIFRlY2hub2xvZ3kgTHRkLiBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLAotICAgKiogZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZWQgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLAotICAgKiogcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsKLSAgICoqIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQgYW5kIG9uIHRoZW9yeSBvZiBsaWFiaWxpdHkuICBXaGV0aGVyCi0gICAqKiBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpCi0gICAqKiBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZQotICAgKiogcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0gICAqKgotICovCi0KLS8qCi0gICAqKiBISVNUT1JZOgotICAgKiogICAgLSBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQWRhbSBUd2lzcyA8YWRhbUB6ZXVzLmNvLnVrPiwgTWFyY2ggMTk5NgotICAgKiogICAgICB3aXRoIGlucHV0IGZyb20gTWlrZSBCZWxzaGUgPG1iZWxzaGVAbmV0c2NhcGUuY29tPiBhbmQKLSAgICoqICAgICAgTWljaGFlbCBDYW1wYW5lbGxhIDxjYW1wYW5lbGxhQHN0ZXZtcy5lbmV0LmRlYy5jb20+Ci0gICAqKiAgICAtIEVuaGFuY2VkIGJ5IERlYW4gR2F1ZGV0IDxkZ2F1ZGV0QGFwYWNoZS5vcmc+LCBOb3ZlbWJlciAxOTk3Ci0gICAqKiAgICAtIENsZWFuZWQgdXAgYnkgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGFwYWNoZS5vcmc+LCBNYXJjaCAxOTk4Ci0gICAqKiAgICAtIFBPU1QgYW5kIHZlcmJvc2l0eSBieSBLdXJ0IFN1c3NtYW4gPGtsc0BtZXJsb3QuY29tPiwgQXVndXN0IDE5OTgKLSAgICoqICAgIC0gSFRNTCB0YWJsZSBvdXRwdXQgYWRkZWQgYnkgRGF2aWQgTi4gV2VsdG9uIDxkYXZpZHdAcHJvc2EuaXQ+LCBKYW51YXJ5IDE5OTkKLSAgICoqICAgIC0gQWRkZWQgQ29va2llLCBBcmJpdHJhcnkgaGVhZGVyIGFuZCBhdXRoIHN1cHBvcnQuIDxkaXJreEB3ZWJ3ZWF2aW5nLm9yZz4sIEFwcmlsIDE5OQotICAgKioKLSAqLwotCi0vKgotICogQlVHUzoKLSAqCi0gKiAtIHVzZXMgc3RyY3B5L2V0Yy4KLSAqIC0gaGFzIHZhcmlvdXMgb3RoZXIgcG9vciBidWZmZXIgYXR0YWNrcyByZWxhdGVkIHRvIHRoZSBsYXp5IHBhcnNpbmcgb2YKLSAqICAgcmVzcG9uc2UgaGVhZGVycyBmcm9tIHRoZSBzZXJ2ZXIKLSAqIC0gZG9lc24ndCBpbXBsZW1lbnQgbXVjaCBvZiBIVFRQLzEueCwgb25seSBhY2NlcHRzIGNlcnRhaW4gZm9ybXMgb2YKLSAqICAgcmVzcG9uc2VzCi0gKiAtIChwZXJmb3JtYW5jZSBwcm9ibGVtKSBoZWF2eSB1c2Ugb2Ygc3Ryc3RyIHNob3dzIHVwIHRvcCBpbiBwcm9maWxlCi0gKiAgIG9ubHkgYW4gaXNzdWUgZm9yIGxvb3BiYWNrIHVzYWdlCi0gKi8KLQotI2RlZmluZSBWRVJTSU9OICIxLjNhIgotCi0vKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogYWZmZWN0cyBpbmNsdWRlIGZpbGVzIG9uIFNvbGFyaXMgKi8KLSNkZWZpbmUgQlNEX0NPTVAKLQotLyogYWxsb3cgY29tcGlsYXRpb24gb3V0c2lkZSBhbiBBcGFjaGUgYnVpbGQgdHJlZSAqLwotI2lmZGVmIE5PX0FQQUNIRV9JTkNMVURFUwotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgYXBfc2VsZWN0ICAgICAgIHNlbGVjdAotI2Vsc2UJCQkJLyogKCEpTk9fQVBBQ0hFX0lOQ0xVREVTICovCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAiYXAuaCIKLSNpZmRlZiBDSEFSU0VUX0VCQ0RJQwotI2luY2x1ZGUgImViY2RpYy5oIgotI2VuZGlmCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotCi0jaWZuZGVmIE5PX1dSSVRFVgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy91aW8uaD4KLSNlbmRpZgotCi0jZW5kaWYJCQkJLyogTk9fQVBBQ0hFX0lOQ0xVREVTICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIERFRklOSVRJT05TIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIG1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIG9uIGEgdGltZSBsaW1pdGVkIHRlc3QgKi8KLSNkZWZpbmUgTUFYX1JFUVVFU1RTIDUwMDAwCi0KLS8qIGdvb2Qgb2xkIHN0YXRlIGhvc3RuYW1lICovCi0jZGVmaW5lIFNUQVRFX1VOQ09OTkVDVEVEIDAKLSNkZWZpbmUgU1RBVEVfQ09OTkVDVElORyAgMQotI2RlZmluZSBTVEFURV9SRUFEICAgICAgICAyCi0KLSNkZWZpbmUgQ0JVRkZTSVpFICAgICAgIDUxMgotCi1zdHJ1Y3QgY29ubmVjdGlvbiB7Ci0gICAgaW50IGZkOwotICAgIGludCBzdGF0ZTsKLSAgICBpbnQgcmVhZDsJCQkvKiBhbW91bnQgb2YgYnl0ZXMgcmVhZCAqLwotICAgIGludCBicmVhZDsJCQkvKiBhbW91bnQgb2YgYm9keSByZWFkICovCi0gICAgaW50IGxlbmd0aDsJCQkvKiBDb250ZW50LUxlbmd0aCB2YWx1ZSB1c2VkIGZvciBrZWVwLWFsaXZlICovCi0gICAgY2hhciBjYnVmZltDQlVGRlNJWkVdOwkvKiBhIGJ1ZmZlciB0byBzdG9yZSBzZXJ2ZXIgcmVzcG9uc2UgaGVhZGVyICovCi0gICAgaW50IGNieDsJCQkvKiBvZmZzZXQgaW4gY2J1ZmZlciAqLwotICAgIGludCBrZWVwYWxpdmU7CQkvKiBub24temVybyBpZiBhIGtlZXAtYWxpdmUgcmVxdWVzdCAqLwotICAgIGludCBnb3RoZWFkZXI7CQkvKiBub24temVybyBpZiB3ZSBoYXZlIHRoZSBlbnRpcmUgaGVhZGVyIGluCi0JCQkJICogY2J1ZmYgKi8KLSAgICBzdHJ1Y3QgdGltZXZhbCBzdGFydCwgY29ubmVjdCwgZG9uZTsKLX07Ci0KLXN0cnVjdCBkYXRhIHsKLSAgICBpbnQgcmVhZDsJCQkvKiBudW1iZXIgb2YgYnl0ZXMgcmVhZCAqLwotICAgIGludCBjdGltZTsJCQkvKiB0aW1lIGluIG1zIHRvIGNvbm5lY3QgKi8KLSAgICBpbnQgdGltZTsJCQkvKiB0aW1lIGluIG1zIGZvciBjb25uZWN0aW9uICovCi19OwotCi0jZGVmaW5lIGFwX21pbihhLGIpICgoYSk8KGIpKT8oYSk6KGIpCi0jZGVmaW5lIGFwX21heChhLGIpICgoYSk+KGIpKT8oYSk6KGIpCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHTE9CQUxTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotaW50IHZlcmJvc2l0eSA9IDA7CQkvKiBubyB2ZXJib3NpdHkgYnkgZGVmYXVsdCAqLwotaW50IHBvc3RpbmcgPSAwOwkJLyogR0VUIGJ5IGRlZmF1bHQgKi8KLWludCByZXF1ZXN0cyA9IDE7CQkvKiBOdW1iZXIgb2YgcmVxdWVzdHMgdG8gbWFrZSAqLwotaW50IGNvbmN1cnJlbmN5ID0gMTsJCS8qIE51bWJlciBvZiBtdWx0aXBsZSByZXF1ZXN0cyB0byBtYWtlICovCi1pbnQgdGxpbWl0ID0gMDsJCQkvKiB0aW1lIGxpbWl0IGluIGNzICovCi1pbnQga2VlcGFsaXZlID0gMDsJCS8qIHRyeSBhbmQgZG8ga2VlcGFsaXZlIGNvbm5lY3Rpb25zICovCi1jaGFyIHNlcnZlcm5hbWVbMTAyNF07CQkvKiBuYW1lIHRoYXQgc2VydmVyIHJlcG9ydHMgKi8KLWNoYXIgaG9zdG5hbWVbMTAyNF07CQkvKiBob3N0IG5hbWUgKi8KLWNoYXIgcGF0aFsxMDI0XTsJCS8qIHBhdGggbmFtZSAqLwotY2hhciBwb3N0ZmlsZVsxMDI0XTsJCS8qIG5hbWUgb2YgZmlsZSBjb250YWluaW5nIHBvc3QgZGF0YSAqLwotY2hhciAqcG9zdGRhdGE7CQkJLyogKmJ1ZmZlciBjb250YWluaW5nIGRhdGEgZnJvbSBwb3N0ZmlsZSAqLwotaW50IHBvc3RsZW4gPSAwOwkJLyogbGVuZ3RoIG9mIGRhdGEgdG8gYmUgUE9TVGVkICovCi1jaGFyIGNvbnRlbnRfdHlwZVsxMDI0XTsJLyogY29udGVudCB0eXBlIHRvIHB1dCBpbiBQT1NUIGhlYWRlciAqLwotY2hhciBjb29raWVbMTAyNF0sCQkvKiBvcHRpb25hbCBjb29raWUgbGluZSAqLwotICAgICBhdXRoWzEwMjRdLAkJLyogb3B0aW9uYWwgKGJhc2ljL3V1ZW5jb2RlZCkKLQkJCQkgKiBhdXRoZW50aWZpY2F0aW9uICovCi0gICAgIGhkcnNbNDA5Nl07CQkvKiBvcHRpb25hbCBhcmJpdHJhcnkgaGVhZGVycyAqLwotaW50IHBvcnQgPSA4MDsJCQkvKiBwb3J0IG51bWJlciAqLwotCi1pbnQgdXNlX2h0bWwgPSAwOwkJLyogdXNlIGh0bWwgaW4gdGhlIHJlcG9ydCAqLwotY2hhciAqdGFibGVzdHJpbmc7Ci1jaGFyICp0cnN0cmluZzsKLWNoYXIgKnRkc3RyaW5nOwotCi1pbnQgZG9jbGVuID0gMDsJCQkvKiB0aGUgbGVuZ3RoIHRoZSBkb2N1bWVudCBzaG91bGQgYmUgKi8KLWludCB0b3RhbHJlYWQgPSAwOwkJLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgKi8KLWludCB0b3RhbGJyZWFkID0gMDsJCS8qIHRvdG9hbCBhbW91bnQgb2YgZW50aXR5IGJvZHkgcmVhZCAqLwotaW50IHRvdGFscG9zdGVkID0gMDsJCS8qIHRvdGFsIG51bWJlciBvZiBieXRlcyBwb3N0ZWQsIGluYy4gaGVhZGVycyAqLwotaW50IGRvbmUgPSAwOwkJCS8qIG51bWJlciBvZiByZXF1ZXN0cyB3ZSBoYXZlIGRvbmUgKi8KLWludCBkb25la2EgPSAwOwkJCS8qIG51bWJlciBvZiBrZWVwIGFsaXZlIGNvbm5lY3Rpb25zIGRvbmUgKi8KLWludCBnb29kID0gMCwgYmFkID0gMDsJCS8qIG51bWJlciBvZiBnb29kIGFuZCBiYWQgcmVxdWVzdHMgKi8KLQotLyogc3RvcmUgZXJyb3IgY2FzZXMgKi8KLWludCBlcnJfbGVuZ3RoID0gMCwgZXJyX2Nvbm4gPSAwLCBlcnJfZXhjZXB0ID0gMDsKLWludCBlcnJfcmVzcG9uc2UgPSAwOwotCi1zdHJ1Y3QgdGltZXZhbCBzdGFydCwgZW5kdGltZTsKLQotLyogZ2xvYmFsIHJlcXVlc3QgKGFuZCBpdHMgbGVuZ3RoKSAqLwotY2hhciByZXF1ZXN0WzUxMl07Ci1pbnQgcmVxbGVuOwotCi0vKiBvbmUgZ2xvYmFsIHRocm93LWF3YXkgYnVmZmVyIHRvIHJlYWQgc3R1ZmYgaW50byAqLwotY2hhciBidWZmZXJbODE5Ml07Ci0KLXN0cnVjdCBjb25uZWN0aW9uICpjb247CQkvKiBjb25uZWN0aW9uIGFycmF5ICovCi1zdHJ1Y3QgZGF0YSAqc3RhdHM7CQkvKiBkYXRlIGZvciBlYWNoIHJlcXVlc3QgKi8KLQotZmRfc2V0IHJlYWRiaXRzLCB3cml0ZWJpdHM7CS8qIGJpdHMgZm9yIHNlbGVjdCAqLwotc3RydWN0IHNvY2thZGRyX2luIHNlcnZlcjsJLyogc2VydmVyIGFkZHIgc3RydWN0dXJlICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBzaW1wbGUgbGl0dGxlIGZ1bmN0aW9uIHRvIHBlcnJvciBhbmQgZXhpdCAqLwotCi1zdGF0aWMgdm9pZCBlcnIoY2hhciAqcykKLXsKLSAgICBpZiAoZXJybm8pIHsKLQlwZXJyb3Iocyk7Ci0gICAgfQotICAgIGVsc2UgewotCXByaW50ZigiJXMiLCBzKTsKLSAgICB9Ci0gICAgZXhpdChlcnJubyk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiB3cml0ZSBvdXQgcmVxdWVzdCB0byBhIGNvbm5lY3Rpb24gLSBhc3N1bWVzIHdlIGNhbiB3cml0ZQotICAgKHNtYWxsKSByZXF1ZXN0IG91dCBpbiBvbmUgZ28gaW50byBvdXIgbmV3IHNvY2tldCBidWZmZXIgICovCi0KLXN0YXRpYyB2b2lkIHdyaXRlX3JlcXVlc3Qoc3RydWN0IGNvbm5lY3Rpb24gKiBjKQotewotI2lmbmRlZiBOT19XUklURVYKLSAgICBzdHJ1Y3QgaW92ZWMgb3V0WzJdOyBpbnQgb3V0Y250ID0gMTsKLSNlbmRpZgotICAgIGdldHRpbWVvZmRheSgmYy0+Y29ubmVjdCwgMCk7Ci0jaWZuZGVmIE5PX1dSSVRFVgotICAgIG91dFswXS5pb3ZfYmFzZSA9IHJlcXVlc3Q7Ci0gICAgb3V0WzBdLmlvdl9sZW4gPSByZXFsZW47Ci0KLSAgICBpZiAocG9zdGluZykgewotCW91dFsxXS5pb3ZfYmFzZSA9IHBvc3RkYXRhOwotCW91dFsxXS5pb3ZfbGVuID0gcG9zdGxlbjsKLQlvdXRjbnQgPSAyOwotCXRvdGFscG9zdGVkICs9IChyZXFsZW4gKyBwb3N0bGVuKTsKLSAgICB9Ci0gICAgd3JpdGV2KGMtPmZkLG91dCwgb3V0Y250KTsKLSNlbHNlCi0gICAgd3JpdGUoYy0+ZmQscmVxdWVzdCxyZXFsZW4pOwotICAgIGlmIChwb3N0aW5nKSB7Ci0gICAgICAgIHdyaXRlKGMtPmZkLHBvc3RkYXRhLHBvc3RsZW4pOwotICAgICAgICB0b3RhbHBvc3RlZCArPSAocmVxbGVuICsgcG9zdGxlbik7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBjLT5zdGF0ZSA9IFNUQVRFX1JFQUQ7Ci0gICAgRkRfU0VUKGMtPmZkLCAmcmVhZGJpdHMpOwotICAgIEZEX0NMUihjLT5mZCwgJndyaXRlYml0cyk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBtYWtlIGFuIGZkIG5vbiBibG9ja2luZyAqLwotCi1zdGF0aWMgdm9pZCBub25ibG9jayhpbnQgZmQpCi17Ci0gICAgaW50IGkgPSAxOwotICAgIGlvY3RsKGZkLCBGSU9OQklPLCAmaSk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiByZXR1cm5zIHRoZSB0aW1lIGluIG1zIGJldHdlZW4gdHdvIHRpbWV2YWxzICovCi0KLXN0YXRpYyBpbnQgdGltZWRpZihzdHJ1Y3QgdGltZXZhbCBhLCBzdHJ1Y3QgdGltZXZhbCBiKQotewotICAgIHJlZ2lzdGVyIGludCB1cywgczsKLQotICAgIHVzID0gYS50dl91c2VjIC0gYi50dl91c2VjOwotICAgIHVzIC89IDEwMDA7Ci0gICAgcyA9IGEudHZfc2VjIC0gYi50dl9zZWM7Ci0gICAgcyAqPSAxMDAwOwotICAgIHJldHVybiBzICsgdXM7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBjYWxjdWxhdGUgYW5kIG91dHB1dCByZXN1bHRzICovCi0KLXN0YXRpYyB2b2lkIG91dHB1dF9yZXN1bHRzKHZvaWQpCi17Ci0gICAgaW50IHRpbWV0YWtlbjsKLQotICAgIGdldHRpbWVvZmRheSgmZW5kdGltZSwgMCk7Ci0gICAgdGltZXRha2VuID0gdGltZWRpZihlbmR0aW1lLCBzdGFydCk7Ci0KLSAgICBwcmludGYoIlxyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHIiKTsKLSAgICBwcmludGYoIlNlcnZlciBTb2Z0d2FyZTogICAgICAgICVzXG4iLCBzZXJ2ZXJuYW1lKTsKLSAgICBwcmludGYoIlNlcnZlciBIb3N0bmFtZTogICAgICAgICVzXG4iLCBob3N0bmFtZSk7Ci0gICAgcHJpbnRmKCJTZXJ2ZXIgUG9ydDogICAgICAgICAgICAlZFxuIiwgcG9ydCk7Ci0gICAgcHJpbnRmKCJcbiIpOwotICAgIHByaW50ZigiRG9jdW1lbnQgUGF0aDogICAgICAgICAgJXNcbiIsIHBhdGgpOwotICAgIHByaW50ZigiRG9jdW1lbnQgTGVuZ3RoOiAgICAgICAgJWQgYnl0ZXNcbiIsIGRvY2xlbik7Ci0gICAgcHJpbnRmKCJcbiIpOwotICAgIHByaW50ZigiQ29uY3VycmVuY3kgTGV2ZWw6ICAgICAgJWRcbiIsIGNvbmN1cnJlbmN5KTsKLSAgICBwcmludGYoIlRpbWUgdGFrZW4gZm9yIHRlc3RzOiAgICVkLiUwM2Qgc2Vjb25kc1xuIiwKLQkgICB0aW1ldGFrZW4gLyAxMDAwLCB0aW1ldGFrZW4gJSAxMDAwKTsKLSAgICBwcmludGYoIkNvbXBsZXRlIHJlcXVlc3RzOiAgICAgICVkXG4iLCBkb25lKTsKLSAgICBwcmludGYoIkZhaWxlZCByZXF1ZXN0czogICAgICAgICVkXG4iLCBiYWQpOwotICAgIGlmIChiYWQpCi0JcHJpbnRmKCIgICAoQ29ubmVjdDogJWQsIExlbmd0aDogJWQsIEV4Y2VwdGlvbnM6ICVkKVxuIiwKLQkgICAgICAgZXJyX2Nvbm4sIGVycl9sZW5ndGgsIGVycl9leGNlcHQpOwotICAgIGlmIChlcnJfcmVzcG9uc2UpCi0JcHJpbnRmKCJOb24tMnh4IHJlc3BvbnNlczogICAgICAlZFxuIiwgZXJyX3Jlc3BvbnNlKTsKLSAgICBpZiAoa2VlcGFsaXZlKQotCXByaW50ZigiS2VlcC1BbGl2ZSByZXF1ZXN0czogICAgJWRcbiIsIGRvbmVrYSk7Ci0gICAgcHJpbnRmKCJUb3RhbCB0cmFuc2ZlcnJlZDogICAgICAlZCBieXRlc1xuIiwgdG90YWxyZWFkKTsKLSAgICBpZiAocG9zdGluZykKLQlwcmludGYoIlRvdGFsIFBPU1RlZDogICAgICAgICAgICVkXG4iLCB0b3RhbHBvc3RlZCk7Ci0gICAgcHJpbnRmKCJIVE1MIHRyYW5zZmVycmVkOiAgICAgICAlZCBieXRlc1xuIiwgdG90YWxicmVhZCk7Ci0KLSAgICAvKiBhdm9pZCBkaXZpZGUgYnkgemVybyAqLwotICAgIGlmICh0aW1ldGFrZW4pIHsKLQlwcmludGYoIlJlcXVlc3RzIHBlciBzZWNvbmQ6ICAgICUuMmZcbiIsIDEwMDAgKiAoZmxvYXQpIChkb25lKSAvIHRpbWV0YWtlbik7Ci0JcHJpbnRmKCJUcmFuc2ZlciByYXRlOiAgICAgICAgICAlLjJmIGtiL3MgcmVjZWl2ZWRcbiIsCi0JICAgICAgIChmbG9hdCkgKHRvdGFscmVhZCkgLyB0aW1ldGFrZW4pOwotCWlmIChwb3N0aW5nKSB7Ci0JICAgIHByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgJS4yZiBrYi9zIHNlbnRcbiIsCi0JCSAgIChmbG9hdCkgKHRvdGFscG9zdGVkKSAvIHRpbWV0YWtlbik7Ci0JICAgIHByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgJS4yZiBrYi9zIHRvdGFsXG4iLAotCQkgICAoZmxvYXQpICh0b3RhbHJlYWQgKyB0b3RhbHBvc3RlZCkgLyB0aW1ldGFrZW4pOwotCX0KLSAgICB9Ci0KLSAgICB7Ci0JLyogd29yayBvdXQgY29ubmVjdGlvbiB0aW1lcyAqLwotCWludCBpOwotCWludCB0b3RhbGNvbiA9IDAsIHRvdGFsID0gMDsKLQlpbnQgbWluY29uID0gOTk5OTk5OSwgbWludG90ID0gOTk5OTk5OwotCWludCBtYXhjb24gPSAwLCBtYXh0b3QgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IHJlcXVlc3RzOyBpKyspIHsKLQkgICAgc3RydWN0IGRhdGEgcyA9IHN0YXRzW2ldOwotCSAgICBtaW5jb24gPSBhcF9taW4obWluY29uLCBzLmN0aW1lKTsKLQkgICAgbWludG90ID0gYXBfbWluKG1pbnRvdCwgcy50aW1lKTsKLQkgICAgbWF4Y29uID0gYXBfbWF4KG1heGNvbiwgcy5jdGltZSk7Ci0JICAgIG1heHRvdCA9IGFwX21heChtYXh0b3QsIHMudGltZSk7Ci0JICAgIHRvdGFsY29uICs9IHMuY3RpbWU7Ci0JICAgIHRvdGFsICs9IHMudGltZTsKLQl9Ci0JaWYgKHJlcXVlc3RzID4gMCkgeyAvKiBhdm9pZCBkaXZpc2lvbiBieSB6ZXJvIChpZiAwIHJlcXVlc3RzKSAqLwotCSAgICBwcmludGYoIlxuQ29ubm5lY3Rpb24gVGltZXMgKG1zKVxuIik7Ci0JICAgIHByaW50ZigiICAgICAgICAgICAgICBtaW4gICBhdmcgICBtYXhcbiIpOwotCSAgICBwcmludGYoIkNvbm5lY3Q6ICAgICU1ZCAlNWQgJTVkXG4iLCBtaW5jb24sIHRvdGFsY29uIC8gcmVxdWVzdHMsIG1heGNvbik7Ci0JICAgIHByaW50ZigiUHJvY2Vzc2luZzogJTVkICU1ZCAlNWRcbiIsCi0JCSAgIG1pbnRvdCAtIG1pbmNvbiwgKHRvdGFsIC8gcmVxdWVzdHMpIC0gKHRvdGFsY29uIC8gcmVxdWVzdHMpLAotCQkgICBtYXh0b3QgLSBtYXhjb24pOwotCSAgICBwcmludGYoIlRvdGFsOiAgICAgICU1ZCAlNWQgJTVkXG4iLCBtaW50b3QsIHRvdGFsIC8gcmVxdWVzdHMsIG1heHRvdCk7Ci0JfQotICAgIH0KLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIGNhbGN1bGF0ZSBhbmQgb3V0cHV0IHJlc3VsdHMgaW4gSFRNTCAgKi8KLQotc3RhdGljIHZvaWQgb3V0cHV0X2h0bWxfcmVzdWx0cyh2b2lkKQotewotICAgIGludCB0aW1ldGFrZW47Ci0KLSAgICBnZXR0aW1lb2ZkYXkoJmVuZHRpbWUsIDApOwotICAgIHRpbWV0YWtlbiA9IHRpbWVkaWYoZW5kdGltZSwgc3RhcnQpOwotCi0gICAgcHJpbnRmKCJcblxuPHRhYmxlICVzPlxuIiwgdGFibGVzdHJpbmcpOwotICAgIHByaW50ZigiPHRyICVzPjx0aCBjb2xzcGFuPTIgJXM+U2VydmVyIFNvZnR3YXJlOjwvdGg+IgotCSAgICI8dGQgY29sc3Bhbj0yICVzPiVzPC90ZD48L3RyPlxuIiwKLQkgICB0cnN0cmluZywgdGRzdHJpbmcsIHRkc3RyaW5nLCBzZXJ2ZXJuYW1lKTsKLSAgICBwcmludGYoIjx0ciAlcz48dGggY29sc3Bhbj0yICVzPlNlcnZlciBIb3N0bmFtZTo8L3RoPiIKLQkgICAiPHRkIGNvbHNwYW49MiAlcz4lczwvdGQ+PC90cj5cbiIsCi0JICAgdHJzdHJpbmcsIHRkc3RyaW5nLCB0ZHN0cmluZywgaG9zdG5hbWUpOwotICAgIHByaW50ZigiPHRyICVzPjx0aCBjb2xzcGFuPTIgJXM+U2VydmVyIFBvcnQ6PC90aD4iCi0JICAgIjx0ZCBjb2xzcGFuPTIgJXM+JWQ8L3RkPjwvdHI+XG4iLAotCSAgIHRyc3RyaW5nLCB0ZHN0cmluZywgdGRzdHJpbmcsIHBvcnQpOwotICAgIHByaW50ZigiPHRyICVzPjx0aCBjb2xzcGFuPTIgJXM+RG9jdW1lbnQgUGF0aDo8L3RoPiIKLQkgICAiPHRkIGNvbHNwYW49MiAlcz4lczwvdGQ+PC90cj5cbiIsCi0JICAgdHJzdHJpbmcsIHRkc3RyaW5nLCB0ZHN0cmluZywgcGF0aCk7Ci0gICAgcHJpbnRmKCI8dHIgJXM+PHRoIGNvbHNwYW49MiAlcz5Eb2N1bWVudCBMZW5ndGg6PC90aD4iCi0JICAgIjx0ZCBjb2xzcGFuPTIgJXM+JWQgYnl0ZXM8L3RkPjwvdHI+XG4iLAotCSAgIHRyc3RyaW5nLCB0ZHN0cmluZywgdGRzdHJpbmcsIGRvY2xlbik7Ci0gICAgcHJpbnRmKCI8dHIgJXM+PHRoIGNvbHNwYW49MiAlcz5Db25jdXJyZW5jeSBMZXZlbDo8L3RoPiIKLQkgICAiPHRkIGNvbHNwYW49MiAlcz4lZDwvdGQ+PC90cj5cbiIsCi0JICAgdHJzdHJpbmcsIHRkc3RyaW5nLCB0ZHN0cmluZywgY29uY3VycmVuY3kpOwotICAgIHByaW50ZigiPHRyICVzPjx0aCBjb2xzcGFuPTIgJXM+VGltZSB0YWtlbiBmb3IgdGVzdHM6PC90aD4iCi0JICAgIjx0ZCBjb2xzcGFuPTIgJXM+JWQuJTAzZCBzZWNvbmRzPC90ZD48L3RyPlxuIiwKLQkgICB0cnN0cmluZywgdGRzdHJpbmcsIHRkc3RyaW5nLCB0aW1ldGFrZW4gLyAxMDAwLCB0aW1ldGFrZW4gJSAxMDAwKTsKLSAgICBwcmludGYoIjx0ciAlcz48dGggY29sc3Bhbj0yICVzPkNvbXBsZXRlIHJlcXVlc3RzOjwvdGg+IgotCSAgICI8dGQgY29sc3Bhbj0yICVzPiVkPC90ZD48L3RyPlxuIiwKLQkgICB0cnN0cmluZywgdGRzdHJpbmcsIHRkc3RyaW5nLCBkb25lKTsKLSAgICBwcmludGYoIjx0ciAlcz48dGggY29sc3Bhbj0yICVzPkZhaWxlZCByZXF1ZXN0czo8L3RoPiIKLQkgICAiPHRkIGNvbHNwYW49MiAlcz4lZDwvdGQ+PC90cj5cbiIsCi0JICAgdHJzdHJpbmcsIHRkc3RyaW5nLCB0ZHN0cmluZywgYmFkKTsKLSAgICBpZiAoYmFkKQotCXByaW50ZigiPHRyICVzPjx0ZCBjb2xzcGFuPTQgJXMgPiAgIChDb25uZWN0OiAlZCwgTGVuZ3RoOiAlZCwgRXhjZXB0aW9uczogJWQpPC90ZD48L3RyPlxuIiwKLQkgICAgICAgdHJzdHJpbmcsIHRkc3RyaW5nLCBlcnJfY29ubiwgZXJyX2xlbmd0aCwgZXJyX2V4Y2VwdCk7Ci0gICAgaWYgKGVycl9yZXNwb25zZSkKLQlwcmludGYoIjx0ciAlcz48dGggY29sc3Bhbj0yICVzPk5vbi0yeHggcmVzcG9uc2VzOjwvdGg+IgotCSAgICAgICAiPHRkIGNvbHNwYW49MiAlcz4lZDwvdGQ+PC90cj5cbiIsCi0JICAgICAgIHRyc3RyaW5nLCB0ZHN0cmluZywgdGRzdHJpbmcsIGVycl9yZXNwb25zZSk7Ci0gICAgaWYgKGtlZXBhbGl2ZSkKLQlwcmludGYoIjx0ciAlcz48dGggY29sc3Bhbj0yICVzPktlZXAtQWxpdmUgcmVxdWVzdHM6PC90aD4iCi0JICAgICAgICI8dGQgY29sc3Bhbj0yICVzPiVkPC90ZD48L3RyPlxuIiwKLQkgICAgICAgdHJzdHJpbmcsIHRkc3RyaW5nLCB0ZHN0cmluZywgZG9uZWthKTsKLSAgICBwcmludGYoIjx0ciAlcz48dGggY29sc3Bhbj0yICVzPlRvdGFsIHRyYW5zZmVycmVkOjwvdGg+IgotCSAgICI8dGQgY29sc3Bhbj0yICVzPiVkIGJ5dGVzPC90ZD48L3RyPlxuIiwKLQkgICB0cnN0cmluZywgdGRzdHJpbmcsIHRkc3RyaW5nLCB0b3RhbHJlYWQpOwotICAgIGlmIChwb3N0aW5nKQotCXByaW50ZigiPHRyICVzPjx0aCBjb2xzcGFuPTIgJXM+VG90YWwgUE9TVGVkOjwvdGg+IgotCSAgICAgICAiPHRkIGNvbHNwYW49MiAlcz4lZDwvdGQ+PC90cj5cbiIsCi0JICAgICAgIHRyc3RyaW5nLCB0ZHN0cmluZywgdGRzdHJpbmcsIHRvdGFscG9zdGVkKTsKLSAgICBwcmludGYoIjx0ciAlcz48dGggY29sc3Bhbj0yICVzPkhUTUwgdHJhbnNmZXJyZWQ6PC90aD4iCi0JICAgIjx0ZCBjb2xzcGFuPTIgJXM+JWQgYnl0ZXM8L3RkPjwvdHI+XG4iLAotCSAgIHRyc3RyaW5nLCB0ZHN0cmluZywgdGRzdHJpbmcsIHRvdGFsYnJlYWQpOwotCi0gICAgLyogYXZvaWQgZGl2aWRlIGJ5IHplcm8gKi8KLSAgICBpZiAodGltZXRha2VuKSB7Ci0JcHJpbnRmKCI8dHIgJXM+PHRoIGNvbHNwYW49MiAlcz5SZXF1ZXN0cyBwZXIgc2Vjb25kOjwvdGg+IgotCSAgICAgICAiPHRkIGNvbHNwYW49MiAlcz4lLjJmPC90ZD48L3RyPlxuIiwKLQkgICB0cnN0cmluZywgdGRzdHJpbmcsIHRkc3RyaW5nLCAxMDAwICogKGZsb2F0KSAoZG9uZSkgLyB0aW1ldGFrZW4pOwotCXByaW50ZigiPHRyICVzPjx0aCBjb2xzcGFuPTIgJXM+VHJhbnNmZXIgcmF0ZTo8L3RoPiIKLQkgICAgICAgIjx0ZCBjb2xzcGFuPTIgJXM+JS4yZiBrYi9zIHJlY2VpdmVkPC90ZD48L3RyPlxuIiwKLQkgICAgIHRyc3RyaW5nLCB0ZHN0cmluZywgdGRzdHJpbmcsIChmbG9hdCkgKHRvdGFscmVhZCkgLyB0aW1ldGFrZW4pOwotCWlmIChwb3N0aW5nKSB7Ci0JICAgIHByaW50ZigiPHRyICVzPjx0ZCBjb2xzcGFuPTIgJXM+Jm5ic3A7PC90ZD4iCi0JCSAgICI8dGQgY29sc3Bhbj0yICVzPiUuMmYga2IvcyBzZW50PC90ZD48L3RyPlxuIiwKLQkJICAgdHJzdHJpbmcsIHRkc3RyaW5nLCB0ZHN0cmluZywKLQkJICAgKGZsb2F0KSAodG90YWxwb3N0ZWQpIC8gdGltZXRha2VuKTsKLQkgICAgcHJpbnRmKCI8dHIgJXM+PHRkIGNvbHNwYW49MiAlcz4mbmJzcDs8L3RkPiIKLQkJICAgIjx0ZCBjb2xzcGFuPTIgJXM+JS4yZiBrYi9zIHRvdGFsPC90ZD48L3RyPlxuIiwKLQkJICAgdHJzdHJpbmcsIHRkc3RyaW5nLCB0ZHN0cmluZywKLQkJICAgKGZsb2F0KSAodG90YWxyZWFkICsgdG90YWxwb3N0ZWQpIC8gdGltZXRha2VuKTsKLQl9Ci0gICAgfQotCi0gICAgewotCS8qIHdvcmsgb3V0IGNvbm5lY3Rpb24gdGltZXMgKi8KLQlpbnQgaTsKLQlpbnQgdG90YWxjb24gPSAwLCB0b3RhbCA9IDA7Ci0JaW50IG1pbmNvbiA9IDk5OTk5OTksIG1pbnRvdCA9IDk5OTk5OTsKLQlpbnQgbWF4Y29uID0gMCwgbWF4dG90ID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCByZXF1ZXN0czsgaSsrKSB7Ci0JICAgIHN0cnVjdCBkYXRhIHMgPSBzdGF0c1tpXTsKLQkgICAgbWluY29uID0gYXBfbWluKG1pbmNvbiwgcy5jdGltZSk7Ci0JICAgIG1pbnRvdCA9IGFwX21pbihtaW50b3QsIHMudGltZSk7Ci0JICAgIG1heGNvbiA9IGFwX21heChtYXhjb24sIHMuY3RpbWUpOwotCSAgICBtYXh0b3QgPSBhcF9tYXgobWF4dG90LCBzLnRpbWUpOwotCSAgICB0b3RhbGNvbiArPSBzLmN0aW1lOwotCSAgICB0b3RhbCArPSBzLnRpbWU7Ci0JfQotCi0JaWYgKHJlcXVlc3RzID4gMCkgeyAvKiBhdm9pZCBkaXZpc2lvbiBieSB6ZXJvIChpZiAwIHJlcXVlc3RzKSAqLwotCSAgICBwcmludGYoIjx0ciAlcz48dGggJXMgY29sc3Bhbj00PkNvbm5uZWN0aW9uIFRpbWVzIChtcyk8L3RoPjwvdHI+XG4iLAotCQkgICB0cnN0cmluZywgdGRzdHJpbmcpOwotCSAgICBwcmludGYoIjx0ciAlcz48dGggJXM+Jm5ic3A7PC90aD4gPHRoICVzPm1pbjwvdGg+ICAgPHRoICVzPmF2ZzwvdGg+ICAgPHRoICVzPm1heDwvdGg+PC90cj5cbiIsCi0JCSAgIHRyc3RyaW5nLCB0ZHN0cmluZywgdGRzdHJpbmcsIHRkc3RyaW5nLCB0ZHN0cmluZyk7Ci0JICAgIHByaW50ZigiPHRyICVzPjx0aCAlcz5Db25uZWN0OjwvdGg+IgotCQkgICAiPHRkICVzPiU1ZDwvdGQ+IgotCQkgICAiPHRkICVzPiU1ZDwvdGQ+IgotCQkgICAiPHRkICVzPiU1ZDwvdGQ+PC90cj5cbiIsCi0JCSAgIHRyc3RyaW5nLCB0ZHN0cmluZywgdGRzdHJpbmcsIG1pbmNvbiwgdGRzdHJpbmcsIHRvdGFsY29uIC8gcmVxdWVzdHMsIHRkc3RyaW5nLCBtYXhjb24pOwotCSAgICBwcmludGYoIjx0ciAlcz48dGggJXM+UHJvY2Vzc2luZzo8L3RoPiIKLQkJICAgIjx0ZCAlcz4lNWQ8L3RkPiIKLQkJICAgIjx0ZCAlcz4lNWQ8L3RkPiIKLQkJICAgIjx0ZCAlcz4lNWQ8L3RkPjwvdHI+XG4iLAotCQkgICB0cnN0cmluZywgdGRzdHJpbmcsIHRkc3RyaW5nLCBtaW50b3QgLSBtaW5jb24sIHRkc3RyaW5nLAotCQkgICAodG90YWwgLyByZXF1ZXN0cykgLSAodG90YWxjb24gLyByZXF1ZXN0cyksIHRkc3RyaW5nLCBtYXh0b3QgLSBtYXhjb24pOwotCSAgICBwcmludGYoIjx0ciAlcz48dGggJXM+VG90YWw6PC90aD4iCi0JCSAgICI8dGQgJXM+JTVkPC90ZD4iCi0JCSAgICI8dGQgJXM+JTVkPC90ZD4iCi0JCSAgICI8dGQgJXM+JTVkPC90ZD48L3RyPlxuIiwKLQkJICAgdHJzdHJpbmcsIHRkc3RyaW5nLCB0ZHN0cmluZywgbWludG90LCB0ZHN0cmluZywgdG90YWwgLyByZXF1ZXN0cywgdGRzdHJpbmcsIG1heHRvdCk7Ci0JfQotCXByaW50ZigiPC90YWJsZT5cbiIpOwotICAgIH0KLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIHN0YXJ0IGFzbmNocm9ub3VzIG5vbi1ibG9ja2luZyBjb25uZWN0aW9uICovCi0KLXN0YXRpYyB2b2lkIHN0YXJ0X2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3Rpb24gKiBjKQotewotICAgIGMtPnJlYWQgPSAwOwotICAgIGMtPmJyZWFkID0gMDsKLSAgICBjLT5rZWVwYWxpdmUgPSAwOwotICAgIGMtPmNieCA9IDA7Ci0gICAgYy0+Z290aGVhZGVyID0gMDsKLQotICAgIGMtPmZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKLSAgICBpZiAoYy0+ZmQgPCAwKQotCWVycigic29ja2V0Iik7Ci0KLSAgICBub25ibG9jayhjLT5mZCk7Ci0gICAgZ2V0dGltZW9mZGF5KCZjLT5zdGFydCwgMCk7Ci0KLSAgICBpZiAoY29ubmVjdChjLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmIHNlcnZlciwgc2l6ZW9mKHNlcnZlcikpIDwgMCkgewotCWlmIChlcnJubyA9PSBFSU5QUk9HUkVTUykgewotCSAgICBjLT5zdGF0ZSA9IFNUQVRFX0NPTk5FQ1RJTkc7Ci0JICAgIEZEX1NFVChjLT5mZCwgJndyaXRlYml0cyk7Ci0JICAgIHJldHVybjsKLQl9Ci0JZWxzZSB7Ci0JICAgIGNsb3NlKGMtPmZkKTsKLQkgICAgZXJyX2Nvbm4rKzsKLQkgICAgaWYgKGJhZCsrID4gMTApIHsKLQkJZXJyKCJcblRlc3QgYWJvcnRlZCBhZnRlciAxMCBmYWlsdXJlc1xuXG4iKTsKLQkgICAgfQotCSAgICBzdGFydF9jb25uZWN0KGMpOwotCX0KLSAgICB9Ci0KLSAgICAvKiBjb25uZWN0ZWQgZmlyc3QgdGltZSAqLwotICAgIHdyaXRlX3JlcXVlc3QoYyk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBjbG9zZSBkb3duIGNvbm5lY3Rpb24gYW5kIHNhdmUgc3RhdHMgKi8KLQotc3RhdGljIHZvaWQgY2xvc2VfY29ubmVjdGlvbihzdHJ1Y3QgY29ubmVjdGlvbiAqIGMpCi17Ci0gICAgaWYgKGMtPnJlYWQgPT0gMCAmJiBjLT5rZWVwYWxpdmUpIHsKLQkvKiBzZXJ2ZXIgaGFzIGxlZ2l0aW1hdGVseSBzaHV0IGRvd24gYW4gaWRsZSBrZWVwIGFsaXZlIHJlcXVlc3QgKi8KLQlnb29kLS07CQkJLyogY29ubmVjdGlvbiBuZXZlciBoYXBwZW5kICovCi0gICAgfQotICAgIGVsc2UgewotCWlmIChnb29kID09IDEpIHsKLQkgICAgLyogZmlyc3QgdGltZSBoZXJlICovCi0JICAgIGRvY2xlbiA9IGMtPmJyZWFkOwotCX0KLQllbHNlIGlmIChjLT5icmVhZCAhPSBkb2NsZW4pIHsKLQkgICAgYmFkKys7Ci0JICAgIGVycl9sZW5ndGgrKzsKLQl9Ci0KLQkvKiBzYXZlIG91dCB0aW1lICovCi0JaWYgKGRvbmUgPCByZXF1ZXN0cykgewotCSAgICBzdHJ1Y3QgZGF0YSBzOwotCSAgICBnZXR0aW1lb2ZkYXkoJmMtPmRvbmUsIDApOwotCSAgICBzLnJlYWQgPSBjLT5yZWFkOwotCSAgICBzLmN0aW1lID0gdGltZWRpZihjLT5jb25uZWN0LCBjLT5zdGFydCk7Ci0JICAgIHMudGltZSA9IHRpbWVkaWYoYy0+ZG9uZSwgYy0+c3RhcnQpOwotCSAgICBzdGF0c1tkb25lKytdID0gczsKLQl9Ci0gICAgfQotCi0gICAgY2xvc2UoYy0+ZmQpOwotICAgIEZEX0NMUihjLT5mZCwgJnJlYWRiaXRzKTsKLSAgICBGRF9DTFIoYy0+ZmQsICZ3cml0ZWJpdHMpOwotCi0gICAgLyogY29ubmVjdCBhZ2FpbiAqLwotICAgIHN0YXJ0X2Nvbm5lY3QoYyk7Ci0gICAgcmV0dXJuOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogcmVhZCBkYXRhIGZyb20gY29ubmVjdGlvbiAqLwotCi1zdGF0aWMgdm9pZCByZWFkX2Nvbm5lY3Rpb24oc3RydWN0IGNvbm5lY3Rpb24gKiBjKQotewotICAgIGludCByOwotICAgIGNoYXIgKnBhcnQ7Ci0gICAgY2hhciByZXNwY29kZVs0XTsJCS8qIDMgZGlnaXRzIGFuZCBudWxsICovCi0KLSAgICByID0gcmVhZChjLT5mZCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgaWYgKHIgPT0gMCB8fCAociA8IDAgJiYgZXJybm8gIT0gRUFHQUlOKSkgewotCWdvb2QrKzsKLQljbG9zZV9jb25uZWN0aW9uKGMpOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAociA8IDAgJiYgZXJybm8gPT0gRUFHQUlOKQotCXJldHVybjsKLQotICAgIGMtPnJlYWQgKz0gcjsKLSAgICB0b3RhbHJlYWQgKz0gcjsKLQotICAgIGlmICghYy0+Z290aGVhZGVyKSB7Ci0JY2hhciAqczsKLQlpbnQgbCA9IDQ7Ci0JaW50IHNwYWNlID0gQ0JVRkZTSVpFIC0gYy0+Y2J4IC0gMTsJLyogLTEgdG8gYWxsb3cgZm9yIDAKLQkJCQkJCSAqIHRlcm1pbmF0b3IgKi8KLQlpbnQgdG9jb3B5ID0gKHNwYWNlIDwgcikgPyBzcGFjZSA6IHI7Ci0jaWZuZGVmIENIQVJTRVRfRUJDRElDCi0JbWVtY3B5KGMtPmNidWZmICsgYy0+Y2J4LCBidWZmZXIsIHRvY29weSk7Ci0jZWxzZQkJCQkvKiBDSEFSU0VUX0VCQ0RJQyAqLwotCWFzY2lpMmViY2RpYyhjLT5jYnVmZiArIGMtPmNieCwgYnVmZmVyLCB0b2NvcHkpOwotI2VuZGlmCQkJCS8qIENIQVJTRVRfRUJDRElDICovCi0JYy0+Y2J4ICs9IHRvY29weTsKLQlzcGFjZSAtPSB0b2NvcHk7Ci0JYy0+Y2J1ZmZbYy0+Y2J4XSA9IDA7CS8qIHRlcm1pbmF0ZSBmb3IgYmVuZWZpdCBvZiBzdHJzdHIgKi8KLQlpZiAodmVyYm9zaXR5ID49IDQpIHsKLQkgICAgcHJpbnRmKCJMT0c6IGhlYWRlciByZWNlaXZlZDpcbiVzXG4iLCBjLT5jYnVmZik7Ci0JfQotCXMgPSBzdHJzdHIoYy0+Y2J1ZmYsICJcclxuXHJcbiIpOwotCS8qCi0JICogdGhpcyBuZXh0IGxpbmUgaXMgc28gdGhhdCB3ZSB0YWxrIHRvIE5DU0EgMS41IHdoaWNoIGJsYXRhbnRseQotCSAqIGJyZWFrcyB0aGUgaHR0cCBzcGVjaWZpY2F0aW9uCi0JICovCi0JaWYgKCFzKSB7Ci0JICAgIHMgPSBzdHJzdHIoYy0+Y2J1ZmYsICJcblxuIik7Ci0JICAgIGwgPSAyOwotCX0KLQotCWlmICghcykgewotCSAgICAvKiByZWFkIHJlc3QgbmV4dCB0aW1lICovCi0JICAgIGlmIChzcGFjZSkKLQkJcmV0dXJuOwotCSAgICBlbHNlIHsKLQkJLyogaGVhZGVyIGlzIGluIGludmFsaWQgb3IgdG9vIGJpZyAtIGNsb3NlIGNvbm5lY3Rpb24gKi8KLQkJY2xvc2UoYy0+ZmQpOwotCQlpZiAoYmFkKysgPiAxMCkgewotCQkgICAgZXJyKCJcblRlc3QgYWJvcnRlZCBhZnRlciAxMCBmYWlsdXJlc1xuXG4iKTsKLQkJfQotCQlGRF9DTFIoYy0+ZmQsICZ3cml0ZWJpdHMpOwotCQlzdGFydF9jb25uZWN0KGMpOwotCSAgICB9Ci0JfQotCWVsc2UgewotCSAgICAvKiBoYXZlIGZ1bGwgaGVhZGVyICovCi0JICAgIGlmICghZ29vZCkgewotCQkvKiB0aGlzIGlzIGZpcnN0IHRpbWUsIGV4dHJhY3Qgc29tZSBpbnRlcmVzdGluZyBpbmZvICovCi0JCWNoYXIgKnAsICpxOwotCQlwID0gc3Ryc3RyKGMtPmNidWZmLCAiU2VydmVyOiIpOwotCQlxID0gc2VydmVybmFtZTsKLQkJaWYgKHApIHsKLQkJICAgIHAgKz0gODsKLQkJICAgIHdoaWxlICgqcCA+IDMyKQotCQkJKnErKyA9ICpwKys7Ci0JCX0KLQkJKnEgPSAwOwotCSAgICB9Ci0KLQkgICAgLyoKLQkgICAgICogWFhYOiB0aGlzIHBhcnNpbmcgaXNuJ3QgZXZlbiByZW1vdGVseSBIVFRQIGNvbXBsaWFudC4uLiBidXQgaW4KLQkgICAgICogdGhlIGludGVyZXN0IG9mIHNwZWVkIGl0IGRvZXNuJ3QgdG90YWxseSBoYXZlIHRvIGJlLCBpdCBqdXN0Ci0JICAgICAqIG5lZWRzIHRvIGJlIGV4dGVuZGVkIHRvIGhhbmRsZSB3aGF0ZXZlciBzZXJ2ZXJzIGZvbGtzIHdhbnQgdG8KLQkgICAgICogdGVzdCBhZ2FpbnN0LiAtZGpnCi0JICAgICAqLwotCi0JICAgIC8qIGNoZWNrIHJlc3BvbnNlIGNvZGUgKi8KLQkgICAgcGFydCA9IHN0cnN0cihjLT5jYnVmZiwgIkhUVFAiKTsJLyogcmVhbGx5IEhUVFAvMS54XyAqLwotCSAgICBzdHJuY3B5KHJlc3Bjb2RlLCAocGFydCArIHN0cmxlbigiSFRUUC8xLnhfIikpLCAzKTsKLQkgICAgcmVzcGNvZGVbM10gPSAnXDAnOwotCSAgICBpZiAocmVzcGNvZGVbMF0gIT0gJzInKSB7Ci0JCWVycl9yZXNwb25zZSsrOwotCQlpZiAodmVyYm9zaXR5ID49IDIpCi0JCSAgICBwcmludGYoIldBUk5JTkc6IFJlc3BvbnNlIGNvZGUgbm90IDJ4eCAoJXMpXG4iLCByZXNwY29kZSk7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAodmVyYm9zaXR5ID49IDMpIHsKLQkJcHJpbnRmKCJMT0c6IFJlc3BvbnNlIGNvZGUgPSAlc1xuIiwgcmVzcGNvZGUpOwotCSAgICB9Ci0KLQkgICAgYy0+Z290aGVhZGVyID0gMTsKLQkgICAgKnMgPSAwOwkJLyogdGVybWluYXRlIGF0IGVuZCBvZiBoZWFkZXIgKi8KLQkgICAgaWYgKGtlZXBhbGl2ZSAmJgotCQkoc3Ryc3RyKGMtPmNidWZmLCAiS2VlcC1BbGl2ZSIpCi0JCSB8fCBzdHJzdHIoYy0+Y2J1ZmYsICJrZWVwLWFsaXZlIikpKSB7CS8qIGZvciBiZW5lZml0IG9mIE1TSUlTICovCi0JCWNoYXIgKmNsOwotCQljbCA9IHN0cnN0cihjLT5jYnVmZiwgIkNvbnRlbnQtTGVuZ3RoOiIpOwotCQkvKiBoYW5kbGUgTkNTQSwgd2hpY2ggc2VuZHMgQ29udGVudC1sZW5ndGg6ICovCi0JCWlmICghY2wpCi0JCSAgICBjbCA9IHN0cnN0cihjLT5jYnVmZiwgIkNvbnRlbnQtbGVuZ3RoOiIpOwotCQlpZiAoY2wpIHsKLQkJICAgIGMtPmtlZXBhbGl2ZSA9IDE7Ci0JCSAgICBjLT5sZW5ndGggPSBhdG9pKGNsICsgMTYpOwotCQl9Ci0JICAgIH0KLQkgICAgYy0+YnJlYWQgKz0gYy0+Y2J4IC0gKHMgKyBsIC0gYy0+Y2J1ZmYpICsgciAtIHRvY29weTsKLQkgICAgdG90YWxicmVhZCArPSBjLT5icmVhZDsKLQl9Ci0gICAgfQotICAgIGVsc2UgewotCS8qIG91dHNpZGUgaGVhZGVyLCBldmVyeXRoaW5nIHdlIGhhdmUgcmVhZCBpcyBlbnRpdHkgYm9keSAqLwotCWMtPmJyZWFkICs9IHI7Ci0JdG90YWxicmVhZCArPSByOwotICAgIH0KLQotICAgIGlmIChjLT5rZWVwYWxpdmUgJiYgKGMtPmJyZWFkID49IGMtPmxlbmd0aCkpIHsKLQkvKiBmaW5pc2hlZCBhIGtlZXAtYWxpdmUgY29ubmVjdGlvbiAqLwotCWdvb2QrKzsKLQlkb25la2ErKzsKLQkvKiBzYXZlIG91dCB0aW1lICovCi0JaWYgKGdvb2QgPT0gMSkgewotCSAgICAvKiBmaXJzdCB0aW1lIGhlcmUgKi8KLQkgICAgZG9jbGVuID0gYy0+YnJlYWQ7Ci0JfQotCWVsc2UgaWYgKGMtPmJyZWFkICE9IGRvY2xlbikgewotCSAgICBiYWQrKzsKLQkgICAgZXJyX2xlbmd0aCsrOwotCX0KLQlpZiAoZG9uZSA8IHJlcXVlc3RzKSB7Ci0JICAgIHN0cnVjdCBkYXRhIHM7Ci0JICAgIGdldHRpbWVvZmRheSgmYy0+ZG9uZSwgMCk7Ci0JICAgIHMucmVhZCA9IGMtPnJlYWQ7Ci0JICAgIHMuY3RpbWUgPSB0aW1lZGlmKGMtPmNvbm5lY3QsIGMtPnN0YXJ0KTsKLQkgICAgcy50aW1lID0gdGltZWRpZihjLT5kb25lLCBjLT5zdGFydCk7Ci0JICAgIHN0YXRzW2RvbmUrK10gPSBzOwotCX0KLQljLT5rZWVwYWxpdmUgPSAwOwotCWMtPmxlbmd0aCA9IDA7Ci0JYy0+Z290aGVhZGVyID0gMDsKLQljLT5jYnggPSAwOwotCWMtPnJlYWQgPSBjLT5icmVhZCA9IDA7Ci0Jd3JpdGVfcmVxdWVzdChjKTsKLQljLT5zdGFydCA9IGMtPmNvbm5lY3Q7CS8qIHplcm8gY29ubmVjdCB0aW1lIHdpdGgga2VlcC1hbGl2ZSAqLwotICAgIH0KLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIHJ1biB0aGUgdGVzdHMgKi8KLQotc3RhdGljIHZvaWQgdGVzdCh2b2lkKQotewotICAgIHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQsIG5vdzsKLSAgICBmZF9zZXQgc2VsX3JlYWQsIHNlbF9leGNlcHQsIHNlbF93cml0ZTsKLSAgICBpbnQgaTsKLQotICAgIGlmICghdXNlX2h0bWwpIHsKLQlwcmludGYoIkJlbmNobWFya2luZyAlcyAoYmUgcGF0aWVudCkuLi4iLCBob3N0bmFtZSk7Ci0JZmZsdXNoKHN0ZG91dCk7Ci0gICAgfQotCi0gICAgewotCS8qIGdldCBzZXJ2ZXIgaW5mb3JtYXRpb24gKi8KLQlzdHJ1Y3QgaG9zdGVudCAqaGU7Ci0JaGUgPSBnZXRob3N0YnluYW1lKGhvc3RuYW1lKTsKLQlpZiAoIWhlKQotCSAgICBlcnIoImJhZCBob3N0bmFtZSIpOwotCXNlcnZlci5zaW5fZmFtaWx5ID0gaGUtPmhfYWRkcnR5cGU7Ci0Jc2VydmVyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0Jc2VydmVyLnNpbl9hZGRyLnNfYWRkciA9ICgodW5zaWduZWQgbG9uZyAqKSAoaGUtPmhfYWRkcl9saXN0WzBdKSlbMF07Ci0gICAgfQotCi0gICAgY29uID0gbWFsbG9jKGNvbmN1cnJlbmN5ICogc2l6ZW9mKHN0cnVjdCBjb25uZWN0aW9uKSk7Ci0gICAgbWVtc2V0KGNvbiwgMCwgY29uY3VycmVuY3kgKiBzaXplb2Yoc3RydWN0IGNvbm5lY3Rpb24pKTsKLQotICAgIHN0YXRzID0gbWFsbG9jKHJlcXVlc3RzICogc2l6ZW9mKHN0cnVjdCBkYXRhKSk7Ci0KLSAgICBGRF9aRVJPKCZyZWFkYml0cyk7Ci0gICAgRkRfWkVSTygmd3JpdGViaXRzKTsKLQotICAgIC8qIHNldHVwIHJlcXVlc3QgKi8KLSAgICBpZiAoIXBvc3RpbmcpIHsKLQlzcHJpbnRmKHJlcXVlc3QsICJHRVQgJXMgSFRUUC8xLjBcclxuIgotCQkiVXNlci1BZ2VudDogQXBhY2hlQmVuY2gvJXNcclxuIgotCQkiJXMiICIlcyIgIiVzIgotCQkiSG9zdDogJXNcclxuIgotCQkiQWNjZXB0OiAqLypcclxuIgotCQkiXHJcbiIgIiVzIiwKLQkJcGF0aCwKLQkJVkVSU0lPTiwKLQkJa2VlcGFsaXZlID8gIkNvbm5lY3Rpb246IEtlZXAtQWxpdmVcclxuIiA6ICIiLAotCQljb29raWUsIGF1dGgsIGhvc3RuYW1lLCBoZHJzKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0Jc3ByaW50ZihyZXF1ZXN0LCAiUE9TVCAlcyBIVFRQLzEuMFxyXG4iCi0JCSJVc2VyLUFnZW50OiBBcGFjaGVCZW5jaC8lc1xyXG4iCi0JCSIlcyIgIiVzIiAiJXMiCi0JCSJIb3N0OiAlc1xyXG4iCi0JCSJBY2NlcHQ6ICovKlxyXG4iCi0JCSJDb250ZW50LWxlbmd0aDogJWRcclxuIgotCQkiQ29udGVudC10eXBlOiAlc1xyXG4iCi0JCSIlcyIKLQkJIlxyXG4iLAotCQlwYXRoLAotCQlWRVJTSU9OLAotCQlrZWVwYWxpdmUgPyAiQ29ubmVjdGlvbjogS2VlcC1BbGl2ZVxyXG4iIDogIiIsCi0JCWNvb2tpZSwgYXV0aCwKLQkJaG9zdG5hbWUsIHBvc3RsZW4sCi0JCShjb250ZW50X3R5cGVbMF0pID8gY29udGVudF90eXBlIDogInRleHQvcGxhaW4iLCBoZHJzKTsKLSAgICB9Ci0KLSAgICBpZiAodmVyYm9zaXR5ID49IDIpCi0JcHJpbnRmKCJJTkZPOiBQT1NUIGhlYWRlciA9PSBcbi0tLVxuJXNcbi0tLVxuIiwgcmVxdWVzdCk7Ci0KLSAgICByZXFsZW4gPSBzdHJsZW4ocmVxdWVzdCk7Ci0KLSNpZmRlZiBDSEFSU0VUX0VCQ0RJQwotICAgIGViY2RpYzJhc2NpaShyZXF1ZXN0LCByZXF1ZXN0LCByZXFsZW4pOwotI2VuZGlmCQkJCS8qIENIQVJTRVRfRUJDRElDICovCi0KLSAgICAvKiBvayAtIGxldHMgc3RhcnQgKi8KLSAgICBnZXR0aW1lb2ZkYXkoJnN0YXJ0LCAwKTsKLQotICAgIC8qIGluaXRpYWxpc2UgbG90cyBvZiByZXF1ZXN0cyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBjb25jdXJyZW5jeTsgaSsrKQotCXN0YXJ0X2Nvbm5lY3QoJmNvbltpXSk7Ci0KLSAgICB3aGlsZSAoZG9uZSA8IHJlcXVlc3RzKSB7Ci0JaW50IG47Ci0JLyogc2V0dXAgYml0IGFycmF5cyAqLwotCW1lbWNweSgmc2VsX2V4Y2VwdCwgJnJlYWRiaXRzLCBzaXplb2YocmVhZGJpdHMpKTsKLQltZW1jcHkoJnNlbF9yZWFkLCAmcmVhZGJpdHMsIHNpemVvZihyZWFkYml0cykpOwotCW1lbWNweSgmc2VsX3dyaXRlLCAmd3JpdGViaXRzLCBzaXplb2YocmVhZGJpdHMpKTsKLQotCS8qIGNoZWNrIGZvciB0aW1lIGxpbWl0IGV4cGlyeSAqLwotCWdldHRpbWVvZmRheSgmbm93LCAwKTsKLQlpZiAodGxpbWl0ICYmIHRpbWVkaWYobm93LCBzdGFydCkgPiAodGxpbWl0ICogMTAwMCkpIHsKLQkgICAgcmVxdWVzdHMgPSBkb25lOwkvKiBzbyBzdGF0cyBhcmUgY29ycmVjdCAqLwotCX0KLQotCS8qIFRpbWVvdXQgb2YgMzAgc2Vjb25kcy4gKi8KLQl0aW1lb3V0LnR2X3NlYyA9IDMwOwotCXRpbWVvdXQudHZfdXNlYyA9IDA7Ci0JbiA9IGFwX3NlbGVjdChGRF9TRVRTSVpFLCAmc2VsX3JlYWQsICZzZWxfd3JpdGUsICZzZWxfZXhjZXB0LCAmdGltZW91dCk7Ci0JaWYgKCFuKSB7Ci0JICAgIGVycigiXG5TZXJ2ZXIgdGltZWQgb3V0XG5cbiIpOwotCX0KLQlpZiAobiA8IDEpCi0JICAgIGVycigic2VsZWN0Iik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY29uY3VycmVuY3k7IGkrKykgewotCSAgICBpbnQgcyA9IGNvbltpXS5mZDsKLQkgICAgaWYgKEZEX0lTU0VUKHMsICZzZWxfZXhjZXB0KSkgewotCQliYWQrKzsKLQkJZXJyX2V4Y2VwdCsrOwotCQlzdGFydF9jb25uZWN0KCZjb25baV0pOwotCQljb250aW51ZTsKLQkgICAgfQotCSAgICBpZiAoRkRfSVNTRVQocywgJnNlbF9yZWFkKSkKLQkJcmVhZF9jb25uZWN0aW9uKCZjb25baV0pOwotCSAgICBpZiAoRkRfSVNTRVQocywgJnNlbF93cml0ZSkpCi0JCXdyaXRlX3JlcXVlc3QoJmNvbltpXSk7Ci0JfQotICAgIH0KLSAgICBpZiAodXNlX2h0bWwpCi0Jb3V0cHV0X2h0bWxfcmVzdWx0cygpOwotICAgIGVsc2UKLQlvdXRwdXRfcmVzdWx0cygpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIGRpc3BsYXkgY29weXJpZ2h0IGluZm9ybWF0aW9uICovCi1zdGF0aWMgdm9pZCBjb3B5cmlnaHQodm9pZCkKLXsKLSAgICBpZiAoIXVzZV9odG1sKSB7Ci0JcHJpbnRmKCJUaGlzIGlzIEFwYWNoZUJlbmNoLCBWZXJzaW9uICVzXG4iLCBWRVJTSU9OKTsKLQlwcmludGYoIkNvcHlyaWdodCAoYykgMTk5NiBBZGFtIFR3aXNzLCBaZXVzIFRlY2hub2xvZ3kgTHRkLCBodHRwOi8vd3d3LnpldXN0ZWNoLm5ldC9cbiIpOwotCXByaW50ZigiQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgVGhlIEFwYWNoZSBHcm91cCwgaHR0cDovL3d3dy5hcGFjaGUub3JnL1xuIik7Ci0JcHJpbnRmKCJcbiIpOwotICAgIH0KLSAgICBlbHNlIHsKLQlwcmludGYoIjxwPlxuIik7Ci0JcHJpbnRmKCIgVGhpcyBpcyBBcGFjaGVCZW5jaCwgVmVyc2lvbiAlczxicj5cbiIsIFZFUlNJT04pOwotCXByaW50ZigiIENvcHlyaWdodCAoYykgMTk5NiBBZGFtIFR3aXNzLCBaZXVzIFRlY2hub2xvZ3kgTHRkLCBodHRwOi8vd3d3LnpldXN0ZWNoLm5ldC88YnI+XG4iKTsKLQlwcmludGYoIiBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvPGJyPlxuIik7Ci0JcHJpbnRmKCI8L3A+XG48cD5cbiIpOwotICAgIH0KLX0KLQotLyogZGlzcGxheSB1c2FnZSBpbmZvcm1hdGlvbiAqLwotc3RhdGljIHZvaWQgdXNhZ2UoY2hhciAqcHJvZ25hbWUpCi17Ci0gICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgW29wdGlvbnNdIFtodHRwOi8vXWhvc3RuYW1lWzpwb3J0XS9wYXRoXG4iLCBwcm9nbmFtZSk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJPcHRpb25zIGFyZTpcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1uIHJlcXVlc3RzICAgICBOdW1iZXIgb2YgcmVxdWVzdHMgdG8gcGVyZm9ybVxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICAgLWMgY29uY3VycmVuY3kgIE51bWJlciBvZiBtdWx0aXBsZSByZXF1ZXN0cyB0byBtYWtlXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtdCB0aW1lbGltaXQgICAgU2Vjb25kcyB0byBtYXguIHdhaXQgZm9yIHJlc3BvbnNlc1xuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICAgLXAgcG9zdGZpbGUgICAgIEZpbGUgY29udGFpbmcgZGF0YSB0byBQT1NUXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtVCBjb250ZW50LXR5cGUgQ29udGVudC10eXBlIGhlYWRlciBmb3IgUE9TVGluZ1xuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICAgLXYgdmVyYm9zaXR5ICAgIEhvdyBtdWNoIHRyb3VibGVzaG9vdGluZyBpbmZvIHRvIHByaW50XG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtdyAgICAgICAgICAgICAgUHJpbnQgb3V0IHJlc3VsdHMgaW4gSFRNTCB0YWJsZXNcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC14IGF0dHJpYnV0ZXMgICBTdHJpbmcgdG8gaW5zZXJ0IGFzIHRhYmxlIGF0dHJpYnV0ZXNcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC15IGF0dHJpYnV0ZXMgICBTdHJpbmcgdG8gaW5zZXJ0IGFzIHRyIGF0dHJpYnV0ZXNcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC16IGF0dHJpYnV0ZXMgICBTdHJpbmcgdG8gaW5zZXJ0IGFzIHRkIG9yIHRoIGF0dHJpYnV0ZXNcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1DIGF0dHJpYnV0ZSAgICBBZGQgY29va2llLCBlZy4gJ0FwYWNoZT0xMjM0LiAocmVwZWF0YWJsZSlcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1IIGF0dHJpYnV0ZSAgICBBZGQgQXJiaXRyYXJ5IGhlYWRlciBsaW5lLCBlZy4gJ0FjY2VwdC1FbmNvZGluZzogem9wJ1xuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgICAgIEluc2VydGVkIGFmdGVyIGFsbCBub3JtYWwgaGVhZGVyIGxpbmVzLiAocmVwZWF0YWJsZSlcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1BIGF0dHJpYnV0ZSAgICBBZGQgQmFzaWMgV1dXIEF1dGhlbnRpY2F0aW9uLCB0aGUgYXR0cmlidXRlc1xuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgICAgIGFyZSBhIGNvbG9uIHNlcGFyYXRlZCB1c2VybmFtZSBhbmQgcGFzc3dvcmQuXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtcCBhdHRyaWJ1dGUgICAgQWRkIEJhc2ljIFByb3h5IEF1dGhlbnRpY2F0aW9uLCB0aGUgYXR0cmlidXRlc1xuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgICAgIGFyZSBhIGNvbG9uIHNlcGFyYXRlZCB1c2VybmFtZSBhbmQgcGFzc3dvcmQuXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtViAgICAgICAgICAgICAgUHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXRcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1rICAgICAgICAgICAgICBVc2UgSFRUUCBLZWVwQWxpdmUgZmVhdHVyZVxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICAgLWggICAgICAgICAgICAgIERpc3BsYXkgdXNhZ2UgaW5mb3JtYXRpb24gKHRoaXMgbWVzc2FnZSlcbiIpOwotICAgIGV4aXQoRUlOVkFMKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBzcGxpdCBVUkwgaW50byBwYXJ0cyAqLwotCi1zdGF0aWMgaW50IHBhcnNlX3VybChjaGFyICp1cmwpCi17Ci0gICAgY2hhciAqY3A7Ci0gICAgY2hhciAqaDsKLSAgICBjaGFyICpwID0gTlVMTDsKLQotICAgIGlmIChzdHJsZW4odXJsKSA+IDcgJiYgc3RybmNtcCh1cmwsICJodHRwOi8vIiwgNykgPT0gMCkKLQl1cmwgKz0gNzsKLSAgICBoID0gdXJsOwotICAgIGlmICgoY3AgPSBzdHJjaHIodXJsLCAnOicpKSAhPSBOVUxMKSB7Ci0JKmNwKysgPSAnXDAnOwotCXAgPSBjcDsKLQl1cmwgPSBjcDsKLSAgICB9Ci0gICAgaWYgKChjcCA9IHN0cmNocih1cmwsICcvJykpID09IE5VTEwpCi0JcmV0dXJuIDE7Ci0gICAgc3RyY3B5KHBhdGgsIGNwKTsKLSAgICAqY3AgPSAnXDAnOwotICAgIHN0cmNweShob3N0bmFtZSwgaCk7Ci0gICAgaWYgKHAgIT0gTlVMTCkKLQlwb3J0ID0gYXRvaShwKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiByZWFkIGRhdGEgdG8gUE9TVCBmcm9tIGZpbGUsIHNhdmUgY29udGVudHMgYW5kIGxlbmd0aCAqLwotCi1zdGF0aWMgaW50IG9wZW5fcG9zdGZpbGUoY2hhciAqcGZpbGUpCi17Ci0gICAgaW50IHBvc3RmZCwgc3RhdHVzOwotICAgIHN0cnVjdCBzdGF0IHBvc3RmaWxlc3RhdDsKLQotICAgIGlmICgocG9zdGZkID0gb3BlbihwZmlsZSwgT19SRE9OTFkpKSA9PSAtMSkgewotCXByaW50ZigiSW52YWxpZCBwb3N0ZmlsZSBuYW1lICglcylcbiIsIHBmaWxlKTsKLQlyZXR1cm4gZXJybm87Ci0gICAgfQotICAgIGlmICgoc3RhdHVzID0gZnN0YXQocG9zdGZkLCAmcG9zdGZpbGVzdGF0KSkgPT0gLTEpIHsKLQlwZXJyb3IoIkNhblwndCBzdGF0IHBvc3RmaWxlXG4iKTsKLQlyZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBwb3N0ZGF0YSA9IG1hbGxvYyhwb3N0ZmlsZXN0YXQuc3Rfc2l6ZSk7Ci0gICAgaWYgKCFwb3N0ZGF0YSkgewotCXByaW50ZigiQ2FuXCd0IGFsbG9jIHBvc3RmaWxlIGJ1ZmZlclxuIik7Ci0JcmV0dXJuIEVOT01FTTsKLSAgICB9Ci0gICAgaWYgKHJlYWQocG9zdGZkLCBwb3N0ZGF0YSwgcG9zdGZpbGVzdGF0LnN0X3NpemUpICE9IHBvc3RmaWxlc3RhdC5zdF9zaXplKSB7Ci0JcHJpbnRmKCJlcnJvciByZWFkaW5nIHBvc3RmaWxlbiIpOwotCXJldHVybiBFSU87Ci0gICAgfQotICAgIHBvc3RsZW4gPSBwb3N0ZmlsZXN0YXQuc3Rfc2l6ZTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1leHRlcm4gY2hhciAqb3B0YXJnOwotZXh0ZXJuIGludCBvcHRpbmQsIG9wdGVyciwgb3B0b3B0OwotCi0vKiBzb3J0IG91dCBjb21tYW5kLWxpbmUgYXJncyBhbmQgY2FsbCB0ZXN0ICovCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgaW50IGMsIHIsbDsKLSAgICBjaGFyIHRtcFsxMDI0XTsKLQotICAgIC8qIHRhYmxlIGRlZmF1bHRzICAqLwotICAgIHRhYmxlc3RyaW5nID0gIiI7Ci0gICAgdHJzdHJpbmcgPSAiIjsKLSAgICB0ZHN0cmluZyA9ICJiZ2NvbG9yPXdoaXRlIjsKLSAgICBjb29raWVbMF0gPSAnXDAnOwotICAgIGF1dGhbMF0gPSAnXDAnOwotICAgIGhkcnNbMF0gPSAnXDAnOwotICAgIG9wdGluZCA9IDE7Ci0gICAgd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJuOmM6dDpUOnA6djprVmh3eDp5Ono6QzpIOlA6QToiKSkgPiAwKSB7Ci0Jc3dpdGNoIChjKSB7Ci0JY2FzZSAnbic6Ci0JICAgIHJlcXVlc3RzID0gYXRvaShvcHRhcmcpOwotCSAgICBpZiAoIXJlcXVlc3RzKSB7Ci0JCWVycigiSW52YWxpZCBudW1iZXIgb2YgcmVxdWVzdHNcbiIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgJ2snOgotCSAgICBrZWVwYWxpdmUgPSAxOwotCSAgICBicmVhazsKLQljYXNlICdjJzoKLQkgICAgY29uY3VycmVuY3kgPSBhdG9pKG9wdGFyZyk7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ3AnOgotCSAgICBpZiAoMCA9PSAociA9IG9wZW5fcG9zdGZpbGUob3B0YXJnKSkpIHsKLQkJcG9zdGluZyA9IDE7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAocG9zdGRhdGEpIHsKLQkJZXhpdChyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlICd2JzoKLQkgICAgdmVyYm9zaXR5ID0gYXRvaShvcHRhcmcpOwotCSAgICBicmVhazsKLQljYXNlICd0JzoKLQkgICAgdGxpbWl0ID0gYXRvaShvcHRhcmcpOwotCSAgICByZXF1ZXN0cyA9IE1BWF9SRVFVRVNUUzsJLyogbmVlZCB0byBzaXplIGRhdGEgYXJyYXkgb24KLQkJCQkJICogc29tZXRoaW5nICovCi0JICAgIGJyZWFrOwotCWNhc2UgJ1QnOgotCSAgICBzdHJjcHkoY29udGVudF90eXBlLCBvcHRhcmcpOwotCSAgICBicmVhazsKLQljYXNlICdDJzogCi0JICAgIHN0cm5jYXQoY29va2llLCAiQ29va2llOiAiLCBzaXplb2YoY29va2llKSk7Ci0JICAgIHN0cm5jYXQoY29va2llLCBvcHRhcmcsIHNpemVvZihjb29raWUpKTsKLQkgICAgc3RybmNhdChjb29raWUsICJcclxuIiwgc2l6ZW9mKGNvb2tpZSkpOwotCSAgICBicmVhazsKLQljYXNlICdBJzogCi0JICAgIC8qIGFzc3VtZSB1c2VybmFtZSBwYXNzd2QgYWxyZWFkeSB0byBiZSBpbiBjb2xvbiBzZXBhcmF0ZWQgZm9ybS4gUmVhZHkKLQkgICAgICogdG8gYmUgdXUtZW5jb2RlZC4KLQkgICAgICovCi0JICAgIHdoaWxlKGlzc3BhY2UoKm9wdGFyZykpCi0JCW9wdGFyZysrOwotCSAgICBsPWFwX2Jhc2U2NGVuY29kZSh0bXAsb3B0YXJnLHN0cmxlbihvcHRhcmcpKTsKLQkgICAgdG1wW2xdPSdcMCc7Ci0KLQkgICAgc3RybmNhdChhdXRoLCAiQXV0aG9yaXphdGlvbjogYmFzaWMgIiwgc2l6ZW9mKGF1dGgpKTsKLQkgICAgc3RybmNhdChhdXRoLCB0bXAsIHNpemVvZihhdXRoKSk7Ci0JICAgIHN0cm5jYXQoYXV0aCwgIlxyXG4iLCBzaXplb2YoYXV0aCkpOwotCSAgICBicmVhazsKLQljYXNlICdQJzoKLQkgICAgLyoKLQkgICAgICogYXNzdW1lIHVzZXJuYW1lIHBhc3N3ZCBhbHJlYWR5IHRvIGJlIGluIGNvbG9uIHNlcGFyYXRlZCBmb3JtLgotCSAgICAgKi8KLQkgICAgd2hpbGUoaXNzcGFjZSgqb3B0YXJnKSkKLQkJb3B0YXJnKys7Ci0JICAgIGw9YXBfYmFzZTY0ZW5jb2RlKHRtcCxvcHRhcmcsc3RybGVuKG9wdGFyZykpOwotCSAgICB0bXBbbF09J1wwJzsKLQotCSAgICBzdHJuY2F0KGF1dGgsICJQcm94eS1BdXRob3JpemF0aW9uOiBiYXNpYyAiLCBzaXplb2YoYXV0aCkpOwotCSAgICBzdHJuY2F0KGF1dGgsIHRtcCwgc2l6ZW9mKGF1dGgpKTsKLQkgICAgc3RybmNhdChhdXRoLCAiXHJcbiIsIHNpemVvZihhdXRoKSk7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ0gnOgotCSAgICBzdHJuY2F0KGhkcnMsIG9wdGFyZywgc2l6ZW9mKGhkcnMpKTsKLQkgICAgc3RybmNhdChoZHJzLCAiXHJcbiIsIHNpemVvZihoZHJzKSk7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ1YnOgotCSAgICBjb3B5cmlnaHQoKTsKLQkgICAgZXhpdCgwKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAndyc6Ci0JICAgIHVzZV9odG1sID0gMTsKLQkgICAgYnJlYWs7Ci0JICAgIC8qCi0JICAgICAqIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIHRocmVlIGFyZSB1c2VkLCB0dXJuIG9uIGh0bWwgb3V0cHV0Ci0JICAgICAqIGF1dG9tYXRpY2FsbHkKLQkgICAgICovCi0JY2FzZSAneCc6Ci0JICAgIHVzZV9odG1sID0gMTsKLQkgICAgdGFibGVzdHJpbmcgPSBvcHRhcmc7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ3knOgotCSAgICB1c2VfaHRtbCA9IDE7Ci0JICAgIHRyc3RyaW5nID0gb3B0YXJnOwotCSAgICBicmVhazsKLQljYXNlICd6JzoKLQkgICAgdXNlX2h0bWwgPSAxOwotCSAgICB0ZHN0cmluZyA9IG9wdGFyZzsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnaCc6Ci0JICAgIHVzYWdlKGFyZ3ZbMF0pOwotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBpbnZhbGlkIG9wdGlvbiBgJWMnXG4iLCBhcmd2WzBdLCBjKTsKLQkgICAgdXNhZ2UoYXJndlswXSk7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0gICAgaWYgKG9wdGluZCAhPSBhcmdjIC0gMSkgewotCWZwcmludGYoc3RkZXJyLCAiJXM6IHdyb25nIG51bWJlciBvZiBhcmd1bWVudHNcbiIsIGFyZ3ZbMF0pOwotCXVzYWdlKGFyZ3ZbMF0pOwotICAgIH0KLQotICAgIGlmIChwYXJzZV91cmwoYXJndltvcHRpbmQrK10pKSB7Ci0JZnByaW50ZihzdGRlcnIsICIlczogaW52YWxpZCBVUkxcbiIsIGFyZ3ZbMF0pOwotCXVzYWdlKGFyZ3ZbMF0pOwotICAgIH0KLQotICAgIGNvcHlyaWdodCgpOwotICAgIHRlc3QoKTsKLQotICAgIGV4aXQoMCk7Ci19CmRpZmYgLS1naXQgYS9zdXBwb3J0L2FiLmRzcCBiL3N1cHBvcnQvYWIuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTkxNDFkLi4wMDAwMDAwCi0tLSBhL3N1cHBvcnQvYWIuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJhYiIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNS4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMKLQotQ0ZHPWFiIC0gV2luMzIgRGVidWcKLSFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiYWIubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJhYi5tYWsiIENGRz0iYWIgLSBXaW4zMiBEZWJ1ZyIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJhYiAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvblwKLSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAiYWIgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImFiIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImFiIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiYWIiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIiIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvTzIgL0kgIi4uXGluY2x1ZGUiIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9GRCAvYwotIyBTVUJUUkFDVCBDUFAgL1lYCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgYWR2YXBpMzIubGliIHdzb2NrMzIubGliIHdzMl8zMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NiAvb3V0OiJyZWxlYXNlL2FiLmV4ZSIKLSMgU1VCVFJBQ1QgTElOSzMyIC9wZGI6bm9uZQotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiYWIgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImFiMCIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImFiMCIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICIiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9JICIuLlxsaWJcYXByXGluY2x1ZGUiIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9GRCAvYwotIyBTVUJUUkFDVCBDUFAgL1lYCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgYWR2YXBpMzIubGliIHdzb2NrMzIubGliIHdzMl8zMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2luY3JlbWVudGFsOm5vIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6ImRlYnVnL2FiLmV4ZSIgL3BkYnR5cGU6c2VwdAotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAiYWIgLSBXaW4zMiBSZWxlYXNlIgotIyBOYW1lICJhYiAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxhYi5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9zdXBwb3J0L2Ficy5kc3AgYi9zdXBwb3J0L2Ficy5kc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkODQ2N2EuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9hYnMuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iYWJzIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMwotCi1DRkc9YWJzIC0gV2luMzIgRGVidWcKLSFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiYWJzLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiYWJzLm1hayIgQ0ZHPSJhYnMgLSBXaW4zMiBEZWJ1ZyIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJhYnMgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgImFicyAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImFicyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL0QgIkFQUl9ERUNMQVJFX1NUQVRJQyIgL0QgIkFQVV9ERUNMQVJFX1NUQVRJQyIgL0QgIlNTTCIgL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvSSAiLi4vc3JjbGliL2Fwci9pbmNsdWRlIiAvSSAiLi4vc3JjbGliL2Fwci11dGlsL2luY2x1ZGUiIC9JICIuLi9pbmNsdWRlIiAvSSAiLi4vc3JjbGliL29wZW5zc2wvaW5jMzIiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9DT05TT0xFIiAvRCAiQVBSX0RFQ0xBUkVfU1RBVElDIiAvRCAiQVBVX0RFQ0xBUkVfU1RBVElDIiAvRCAiVVNFX1NTTCIgL0ZkIlJlbGVhc2UvYWJzIiAvRkQgL2MKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgd3NvY2szMi5saWIgd3MyXzMyLmxpYiBzc2xlYXkzMi5saWIgbGliZWF5MzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYXAgL21hY2hpbmU6STM4NiAvbGlicGF0aDoiLi4vc3JjbGliL29wZW5zc2wvb3V0MzJkbGwiCi0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIGFkdmFwaTMyLmxpYiB3c29jazMyLmxpYiB3czJfMzIubGliIHNzbGVheTMyLmxpYiBsaWJlYXkzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hcCAvbWFjaGluZTpJMzg2IC9saWJwYXRoOiIuLi9zcmNsaWIvb3BlbnNzbC9vdXQzMmRsbCIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImFicyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTURkIC9XMyAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvRCAiQVBSX0RFQ0xBUkVfU1RBVElDIiAvRCAiQVBVX0RFQ0xBUkVfU1RBVElDIiAvRCAiU1NMIiAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HWCAvWmkgL09kIC9JICIuLi9zcmNsaWIvYXByL2luY2x1ZGUiIC9JICIuLi9zcmNsaWIvYXByLXV0aWwvaW5jbHVkZSIgL0kgIi4uL2luY2x1ZGUiIC9JICIuLi9zcmNsaWIvb3BlbnNzbC9pbmMzMiIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX0NPTlNPTEUiIC9EICJBUFJfREVDTEFSRV9TVEFUSUMiIC9EICJBUFVfREVDTEFSRV9TVEFUSUMiIC9EICJVU0VfU1NMIiAvRmQiRGVidWcvYWJzIiAvRkQgL2MKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIGFkdmFwaTMyLmxpYiB3c29jazMyLmxpYiB3czJfMzIubGliIHNzbGVheTMyLmxpYiBsaWJlYXkzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2luY3JlbWVudGFsOm5vIC9tYXAgL2RlYnVnIC9tYWNoaW5lOkkzODYgL2xpYnBhdGg6Ii4uL3NyY2xpYi9vcGVuc3NsL291dDMyZGxsIgotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiBhZHZhcGkzMi5saWIgd3NvY2szMi5saWIgd3MyXzMyLmxpYiBzc2xlYXkzMi5saWIgbGliZWF5MzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9pbmNyZW1lbnRhbDpubyAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9saWJwYXRoOiIuLi9zcmNsaWIvb3BlbnNzbC9vdXQzMmRsbCIKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgImFicyAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgImFicyAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxhYi5jCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImFicyAtIFdpbjMyIFJlbGVhc2UiCi0jIEFERCBDUFAgL0ZvIlJlbGVhc2UvYWJzLm9iaiIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImFicyAtIFdpbjMyIERlYnVnIgotIyBBREQgQ1BQIC9GbyJEZWJ1Zy9hYnMub2JqIgotCi0hRU5ESUYgCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxhYnMucmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlxidWlsZFx3aW4zMlx3aW4zMnZlci5hd2sKLQotIUlGICAiJChDRkcpIiA9PSAiYWJzIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBDcmVhdGluZyBWZXJzaW9uIFJlc291cmNlCi1JbnB1dFBhdGg9Li5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSIuXGFicy5yYyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQlhd2sgLWYgLi4vYnVpbGQvd2luMzIvd2luMzJ2ZXIuYXdrIGFiICJBcGFjaGVCZW5jaC9TU0wgVXRpbGl0eSIgIC4uL2luY2x1ZGUvYXBfcmVsZWFzZS5oID4gLlxhYnMucmMKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJhYnMgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBDcmVhdGluZyBWZXJzaW9uIFJlc291cmNlCi1JbnB1dFBhdGg9Li5cYnVpbGRcd2luMzJcd2luMzJ2ZXIuYXdrCi0KLSIuXGFicy5yYyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQlhd2sgLWYgLi4vYnVpbGQvd2luMzIvd2luMzJ2ZXIuYXdrIGFiICJBcGFjaGVCZW5jaC9TU0wgVXRpbGl0eSIgIC4uL2luY2x1ZGUvYXBfcmVsZWFzZS5oID4gLlxhYnMucmMKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvc3VwcG9ydC9hcGFjaGVjdGwuaW4gYi9zdXBwb3J0L2FwYWNoZWN0bC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY5YmM2Zi4uMDAwMDAwMAotLS0gYS9zdXBwb3J0L2FwYWNoZWN0bC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSMgU2VlIGxpY2Vuc2UgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCi0jCi0jIEFwYWNoZSBjb250cm9sIHNjcmlwdCBkZXNpZ25lZCB0byBhbGxvdyBhbiBlYXN5IGNvbW1hbmQgbGluZSBpbnRlcmZhY2UKLSMgdG8gY29udHJvbGxpbmcgQXBhY2hlLiAgV3JpdHRlbiBieSBNYXJjIFNsZW1rbywgMTk5Ny8wOC8yMwotIyAKLSMgVGhlIGV4aXQgY29kZXMgcmV0dXJuZWQgYXJlOgotIwkwIC0gb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKLSMJMSAtIAotIwkyIC0gdXNhZ2UgZXJyb3IKLSMJMyAtIGh0dHBkIGNvdWxkIG5vdCBiZSBzdGFydGVkCi0jCTQgLSBodHRwZCBjb3VsZCBub3QgYmUgc3RvcHBlZAotIwk1IC0gaHR0cGQgY291bGQgbm90IGJlIHN0YXJ0ZWQgZHVyaW5nIGEgcmVzdGFydAotIwk2IC0gaHR0cGQgY291bGQgbm90IGJlIHJlc3RhcnRlZCBkdXJpbmcgYSByZXN0YXJ0Ci0jCTcgLSBodHRwZCBjb3VsZCBub3QgYmUgcmVzdGFydGVkIGR1cmluZyBhIGdyYWNlZnVsIHJlc3RhcnQKLSMJOCAtIGNvbmZpZ3VyYXRpb24gc3ludGF4IGVycm9yCi0jCi0jIFdoZW4gbXVsdGlwbGUgYXJndW1lbnRzIGFyZSBnaXZlbiwgb25seSB0aGUgZXJyb3IgZnJvbSB0aGUgX2xhc3RfCi0jIG9uZSBpcyByZXBvcnRlZC4gIFJ1biAiYXBhY2hlY3RsIGhlbHAiIGZvciB1c2FnZSBpbmZvCi0jCi0jCi0jIHx8fHx8fHx8fHx8fHx8fHx8fHx8IFNUQVJUIENPTkZJR1VSQVRJT04gU0VDVElPTiAgfHx8fHx8fHx8fHx8fHx8fHx8fHwKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQotIyAKLSMgdGhlIHBhdGggdG8geW91ciBQSUQgZmlsZQotUElERklMRT1AcHJlZml4QC9sb2dzL2h0dHBkLnBpZAotIwotIyB0aGUgcGF0aCB0byB5b3VyIGh0dHBkIGJpbmFyeSwgaW5jbHVkaW5nIG9wdGlvbnMgaWYgbmVjZXNzYXJ5Ci1IVFRQRD0nQHByZWZpeEAvYmluL2h0dHBkJwotIwotIyBhIGNvbW1hbmQgdGhhdCBvdXRwdXRzIGEgZm9ybWF0dGVkIHRleHQgdmVyc2lvbiBvZiB0aGUgSFRNTCBhdCB0aGUKLSMgdXJsIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuICBEZXNpZ25lZCBmb3IgbHlueCwgaG93ZXZlciBvdGhlcgotIyBwcm9ncmFtcyBtYXkgd29yay4gIAotTFlOWD0ibHlueCAtZHVtcCIKLSMKLSMgdGhlIFVSTCB0byB5b3VyIHNlcnZlcidzIG1vZF9zdGF0dXMgc3RhdHVzIHBhZ2UuICBJZiB5b3UgZG8gbm90Ci0jIGhhdmUgb25lLCB0aGVuIHN0YXR1cyBhbmQgZnVsbHN0YXR1cyB3aWxsIG5vdCB3b3JrLgotU1RBVFVTVVJMPSJodHRwOi8vbG9jYWxob3N0OkBQT1JUQC9zZXJ2ZXItc3RhdHVzIgotIwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIHx8fHx8fHx8fHx8fHx8fHx8fHx8ICAgRU5EIENPTkZJR1VSQVRJT04gU0VDVElPTiAgfHx8fHx8fHx8fHx8fHx8fHx8fHwKLQotRVJST1I9MAotQVJHVj0iJEAiCi1pZiBbICJ4JEFSR1YiID0gIngiIF0gOyB0aGVuIAotICAgIEFSR1M9ImhlbHAiCi1maQotCi1mb3IgQVJHIGluICRAICRBUkdTCi1kbwotICAgICMgY2hlY2sgZm9yIHBpZGZpbGUKLSAgICBpZiBbIC1mICRQSURGSUxFIF0gOyB0aGVuCi0JUElEPWBjYXQgJFBJREZJTEVgCi0JaWYgWyAieCRQSUQiICE9ICJ4IiBdICYmIGtpbGwgLTAgJFBJRCAyPi9kZXYvbnVsbCA7IHRoZW4KLQkgICAgU1RBVFVTPSJodHRwZCAocGlkICRQSUQpIHJ1bm5pbmciCi0JICAgIFJVTk5JTkc9MQotCWVsc2UKLQkgICAgU1RBVFVTPSJodHRwZCAocGlkICRQSUQ/KSBub3QgcnVubmluZyIKLQkgICAgUlVOTklORz0wCi0JZmkKLSAgICBlbHNlCi0JU1RBVFVTPSJodHRwZCAobm8gcGlkIGZpbGUpIG5vdCBydW5uaW5nIgotCVJVTk5JTkc9MAotICAgIGZpCi0KLSAgICBjYXNlICRBUkcgaW4KLSAgICBzdGFydCkKLQlpZiBbICRSVU5OSU5HIC1lcSAxIF07IHRoZW4KLQkgICAgZWNobyAiJDAgJEFSRzogaHR0cGQgKHBpZCAkUElEKSBhbHJlYWR5IHJ1bm5pbmciCi0JICAgIGNvbnRpbnVlCi0JZmkKLQlpZiAkSFRUUEQgOyB0aGVuCi0JICAgIGVjaG8gIiQwICRBUkc6IGh0dHBkIHN0YXJ0ZWQiCi0JZWxzZQotCSAgICBlY2hvICIkMCAkQVJHOiBodHRwZCBjb3VsZCBub3QgYmUgc3RhcnRlZCIKLQkgICAgRVJST1I9MwotCWZpCi0JOzsKLSAgICBzdG9wKQotCWlmIFsgJFJVTk5JTkcgLWVxIDAgXTsgdGhlbgotCSAgICBlY2hvICIkMCAkQVJHOiAkU1RBVFVTIgotCSAgICBjb250aW51ZQotCWZpCi0JaWYga2lsbCAkUElEIDsgdGhlbgotCSAgICBlY2hvICIkMCAkQVJHOiBodHRwZCBzdG9wcGVkIgotCWVsc2UKLQkgICAgZWNobyAiJDAgJEFSRzogaHR0cGQgY291bGQgbm90IGJlIHN0b3BwZWQiCi0JICAgIEVSUk9SPTQKLQlmaQotCTs7Ci0gICAgcmVzdGFydCkKLQlpZiBbICRSVU5OSU5HIC1lcSAwIF07IHRoZW4KLQkgICAgZWNobyAiJDAgJEFSRzogaHR0cGQgbm90IHJ1bm5pbmcsIHRyeWluZyB0byBzdGFydCIKLQkgICAgaWYgJEhUVFBEIDsgdGhlbgotCQllY2hvICIkMCAkQVJHOiBodHRwZCBzdGFydGVkIgotCSAgICBlbHNlCi0JCWVjaG8gIiQwICRBUkc6IGh0dHBkIGNvdWxkIG5vdCBiZSBzdGFydGVkIgotCQlFUlJPUj01Ci0JICAgIGZpCi0JZWxzZQotCSAgICBpZiAkSFRUUEQgLXQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCWlmIGtpbGwgLUhVUCAkUElEIDsgdGhlbgotCQkgICAgZWNobyAiJDAgJEFSRzogaHR0cGQgcmVzdGFydGVkIgotCQllbHNlCi0JCSAgICBlY2hvICIkMCAkQVJHOiBodHRwZCBjb3VsZCBub3QgYmUgcmVzdGFydGVkIgotCQkgICAgRVJST1I9NgotCQlmaQotCSAgICBlbHNlCi0JCWVjaG8gIiQwICRBUkc6IGNvbmZpZ3VyYXRpb24gYnJva2VuLCBpZ25vcmluZyByZXN0YXJ0IgotCQllY2hvICIkMCAkQVJHOiAocnVuICdhcGFjaGVjdGwgY29uZmlndGVzdCcgZm9yIGRldGFpbHMpIgotCQlFUlJPUj02Ci0JICAgIGZpCi0JZmkKLQk7OwotICAgIGdyYWNlZnVsKQotCWlmIFsgJFJVTk5JTkcgLWVxIDAgXTsgdGhlbgotCSAgICBlY2hvICIkMCAkQVJHOiBodHRwZCBub3QgcnVubmluZywgdHJ5aW5nIHRvIHN0YXJ0IgotCSAgICBpZiAkSFRUUEQgOyB0aGVuCi0JCWVjaG8gIiQwICRBUkc6IGh0dHBkIHN0YXJ0ZWQiCi0JICAgIGVsc2UKLQkJZWNobyAiJDAgJEFSRzogaHR0cGQgY291bGQgbm90IGJlIHN0YXJ0ZWQiCi0JCUVSUk9SPTUKLQkgICAgZmkKLQllbHNlCi0JICAgIGlmICRIVFRQRCAtdCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJaWYga2lsbCAtV0lOQ0ggJFBJRCA7IHRoZW4KLQkJICAgIGVjaG8gIiQwICRBUkc6IGh0dHBkIGdyYWNlZnVsbHkgcmVzdGFydGVkIgotCQllbHNlCi0JCSAgICBlY2hvICIkMCAkQVJHOiBodHRwZCBjb3VsZCBub3QgYmUgcmVzdGFydGVkIgotCQkgICAgRVJST1I9NwotCQlmaQotCSAgICBlbHNlCi0JCWVjaG8gIiQwICRBUkc6IGNvbmZpZ3VyYXRpb24gYnJva2VuLCBpZ25vcmluZyByZXN0YXJ0IgotCQllY2hvICIkMCAkQVJHOiAocnVuICdhcGFjaGVjdGwgY29uZmlndGVzdCcgZm9yIGRldGFpbHMpIgotCQlFUlJPUj03Ci0JICAgIGZpCi0JZmkKLQk7OwotICAgIHN0YXR1cykKLQkkTFlOWCAkU1RBVFVTVVJMIHwgYXdrICcgL3Byb2Nlc3MkLyB7IHByaW50OyBleGl0IH0geyBwcmludCB9ICcKLQk7OwotICAgIGZ1bGxzdGF0dXMpCi0JJExZTlggJFNUQVRVU1VSTAotCTs7Ci0gICAgY29uZmlndGVzdCkKLQlpZiAkSFRUUEQgLXQ7IHRoZW4KLQkgICAgOgotCWVsc2UKLQkgICAgRVJST1I9OAotCWZpCi0JOzsKLSAgICAqKQotCWVjaG8gInVzYWdlOiAkMCAoc3RhcnR8c3RvcHxyZXN0YXJ0fGZ1bGxzdGF0dXN8c3RhdHVzfGdyYWNlZnVsfGNvbmZpZ3Rlc3R8aGVscCkiCi0JY2F0IDw8RU9GCi0KLXN0YXJ0ICAgICAgLSBzdGFydCBodHRwZAotc3RvcCAgICAgICAtIHN0b3AgaHR0cGQKLXJlc3RhcnQgICAgLSByZXN0YXJ0IGh0dHBkIGlmIHJ1bm5pbmcgYnkgc2VuZGluZyBhIFNJR0hVUCBvciBzdGFydCBpZiAKLSAgICAgICAgICAgICBub3QgcnVubmluZwotZnVsbHN0YXR1cyAtIGR1bXAgYSBmdWxsIHN0YXR1cyBzY3JlZW47IHJlcXVpcmVzIGx5bnggYW5kIG1vZF9zdGF0dXMgZW5hYmxlZAotc3RhdHVzICAgICAtIGR1bXAgYSBzaG9ydCBzdGF0dXMgc2NyZWVuOyByZXF1aXJlcyBseW54IGFuZCBtb2Rfc3RhdHVzIGVuYWJsZWQKLWdyYWNlZnVsICAgLSBkbyBhIGdyYWNlZnVsIHJlc3RhcnQgYnkgc2VuZGluZyBhIFNJR1dJTkNIIG9yIHN0YXJ0IGlmIG5vdCBydW5uaW5nCi1jb25maWd0ZXN0IC0gZG8gYSBjb25maWd1cmF0aW9uIHN5bnRheCB0ZXN0Ci1oZWxwICAgICAgIC0gdGhpcyBzY3JlZW4KLQotRU9GCi0JRVJST1I9MgotICAgIDs7Ci0KLSAgICBlc2FjCi0KLWRvbmUKLQotZXhpdCAkRVJST1IKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0jCi0jIENvcHlyaWdodCAoYykgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0jIHJlc2VydmVkLgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0jIGFyZSBtZXQ6Ci0jCi0jIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMKLSMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0jICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgICAgZGlzdHJpYnV0aW9uLgotIwotIyAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSMgICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSMgICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0jICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotIyAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0jICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0jCi0jIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0jICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotIyAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSMgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0jCi0jIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotIyAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSMgICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSMgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSMgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotIyBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotIyBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0jIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotIyBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSMgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0jIFNVQ0ggREFNQUdFLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotIyBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSMgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0jIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSMKLSMgUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCi0jIG9yaWdpbmFsbHkgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsCi0jIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0jCmRpZmYgLS1naXQgYS9zdXBwb3J0L2FweHMuaW4gYi9zdXBwb3J0L2FweHMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZGQzNWQuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9hcHhzLmluCisrKyAvZGV2L251bGwKQEAgLTEsNjU1ICswLDAgQEAKLSMhL3Vzci9sb2NhbC9iaW4vcGVybAotIyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMjIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyMKLSMjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0jIyBhcmUgbWV0OgotIyMKLSMjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotIyMKLSMjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSMjICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMjICAgIGRpc3RyaWJ1dGlvbi4KLSMjCi0jIyAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSMjICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotIyMgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotIyMgICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSMjCi0jIyA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0jIyAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotIyMgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotIyMgICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0jIwotIyMgNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSMjICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotIyMgICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotIyMKLSMjIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSMjICAgIGFja25vd2xlZGdtZW50OgotIyMgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotIyMgICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSMjCi0jIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSMjIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSMjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotIyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSMjIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotIyMgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0jIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIyMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIyMgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIyMgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIyMgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotIyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMjCi0jIyBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotIyMgaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0jIyBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSMjIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSMjIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSMjIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotIyMKLQotIyMKLSMjICBhcHhzIC0tIEFQYWNoZSBlWHRlblNpb24gdG9vbAotIyMgIFdyaXR0ZW4gYnkgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGFwYWNoZS5vcmc+Ci0jIwotCi1yZXF1aXJlIDUuMDAzOwotdXNlIHN0cmljdDsKLXBhY2thZ2UgYXB4czsKLQotIyMKLSMjICBDb25maWd1cmF0aW9uCi0jIwotCi1teSAkQ0ZHX1RBUkdFVCAgICAgICAgPSAnQFRBUkdFVEAnOyAgICAgICAgICAgICMgc3Vic3RpdHV0ZWQgdmlhIE1ha2VmaWxlLnRtcGwgCi1teSAkQ0ZHX0NDICAgICAgICAgICAgPSAnQENDQCc7ICAgICAgICAgICAgICAgICMgc3Vic3RpdHV0ZWQgdmlhIE1ha2VmaWxlLnRtcGwKLW15ICRDRkdfQ0ZMQUdTICAgICAgICA9ICdAQ0ZMQUdTQCc7ICAgICAgICAgICAgIyBzdWJzdGl0dXRlZCB2aWEgTWFrZWZpbGUudG1wbAotbXkgJENGR19DRkxBR1NfU0hMSUIgID0gJ0BDRkxBR1NfU0hMSUJAJzsgICAgICAjIHN1YnN0aXR1dGVkIHZpYSBNYWtlZmlsZS50bXBsCi1teSAkQ0ZHX0xEX1NITElCICAgICAgPSAnQExEX1NITElCQCc7ICAgICAgICAgICMgc3Vic3RpdHV0ZWQgdmlhIE1ha2VmaWxlLnRtcGwKLW15ICRDRkdfTERGTEFHU19TSExJQiA9ICdATERGTEFHU19NT0RfU0hMSUJAJzsgIyBzdWJzdGl0dXRlZCB2aWEgTWFrZWZpbGUudG1wbCAKLW15ICRDRkdfTElCU19TSExJQiAgICA9ICdATElCU19TSExJQkAnOyAgICAgICAgIyBzdWJzdGl0dXRlZCB2aWEgTWFrZWZpbGUudG1wbCAKLW15ICRDRkdfUFJFRklYICAgICAgICA9ICdAcHJlZml4QCc7ICAgICAgICAgICAgIyBzdWJzdGl0dXRlZCB2aWEgQVBBQ0kgaW5zdGFsbAotbXkgJENGR19TQklORElSICAgICAgID0gJ0BzYmluZGlyQCc7ICAgICAgICAgICAjIHN1YnN0aXR1dGVkIHZpYSBBUEFDSSBpbnN0YWxsCi1teSAkQ0ZHX0lOQ0xVREVESVIgICAgPSAnQGluY2x1ZGVkaXJAJzsgICAgICAgICMgc3Vic3RpdHV0ZWQgdmlhIEFQQUNJIGluc3RhbGwKLW15ICRDRkdfTElCRVhFQ0RJUiAgICA9ICdAbGliZXhlY2RpckAnOyAgICAgICAgIyBzdWJzdGl0dXRlZCB2aWEgQVBBQ0kgaW5zdGFsbAotbXkgJENGR19TWVNDT05GRElSICAgID0gJ0BzeXNjb25mZGlyQCc7ICAgICAgICAjIHN1YnN0aXR1dGVkIHZpYSBBUEFDSSBpbnN0YWxsCi0KLSMjCi0jIyAgQ2xlYW51cCB0aGUgYWJvdmUgc3R1ZmYKLSMjCi0kQ0ZHX0NGTEFHUyA9fiBzfF5ccyt8fDsKLSRDRkdfQ0ZMQUdTID1+IHN8XHMrJHx8OwotJENGR19DRkxBR1MgPX4gc3xccytgLithcGFjaWB8fDsKLQotIyMKLSMjICBJbml0aWFsIHNoYXJlZCBvYmplY3Qgc3VwcG9ydCBjaGVjawotIyMKLWlmIChub3QgLXggIiRDRkdfU0JJTkRJUi8kQ0ZHX1RBUkdFVCIpIHsKLQlwcmludCBTVERFUlIgImFweHM6RXJyb3I6ICRDRkdfU0JJTkRJUi8kQ0ZHX1RBUkdFVCBub3QgZm91bmQgb3Igbm90IGV4ZWN1dGFibGVcbiI7Ci0JZXhpdCgxKTsKLX0KLWlmIChub3QgZ3JlcCgvbW9kX3NvLywgYCRDRkdfU0JJTkRJUi8kQ0ZHX1RBUkdFVCAtbGApKSB7Ci0gICAgcHJpbnQgU1RERVJSICJhcHhzOkVycm9yOiBTb3JyeSwgbm8gc2hhcmVkIG9iamVjdCBzdXBwb3J0IGZvciBBcGFjaGVcbiI7Ci0gICAgcHJpbnQgU1RERVJSICJhcHhzOkVycm9yOiBhdmFpbGFibGUgdW5kZXIgeW91ciBwbGF0Zm9ybS4gTWFrZSBzdXJlXG4iOwotICAgIHByaW50IFNUREVSUiAiYXB4czpFcnJvcjogdGhlIEFwYWNoZSBtb2R1bGUgbW9kX3NvIGlzIGNvbXBpbGVkIGludG9cbiI7Ci0gICAgcHJpbnQgU1RERVJSICJhcHhzOkVycm9yOiB5b3VyIHNlcnZlciBiaW5hcnkgYCRDRkdfU0JJTkRJUi8kQ0ZHX1RBUkdFVCcuXG4iOwotICAgIGV4aXQoMSk7Ci19Ci0KLSMjCi0jIyAgcGFyc2UgYXJndW1lbnQgbGluZQotIyMKLQotIyAgIGRlZmF1bHRzIGZvciBwYXJhbWV0ZXJzCi1teSAkb3B0X24gPSAnJzsKLW15ICRvcHRfZyA9ICcnOwotbXkgJG9wdF9jID0gMDsKLW15ICRvcHRfbyA9ICcnOwotbXkgQG9wdF9EID0gKCk7Ci1teSBAb3B0X0kgPSAoKTsKLW15IEBvcHRfTCA9ICgpOwotbXkgQG9wdF9sID0gKCk7Ci1teSBAb3B0X1cgPSAoKTsKLW15IEBvcHRfUyA9ICgpOwotbXkgJG9wdF9lID0gMDsKLW15ICRvcHRfaSA9IDA7Ci1teSAkb3B0X2EgPSAwOwotbXkgJG9wdF9BID0gMDsKLW15ICRvcHRfcSA9IDA7Ci0KLSMgICB0aGlzIHN1YnJvdXRpbmUgaXMgZGVyaXZlZCBmcm9tIFBlcmwncyBnZXRvcHRzLnBsIHdpdGggdGhlIGVuaGFuY2VtZW50IG9mCi0jICAgdGhlICIrIiBtZXRhY2hhcmF0ZXIgYXQgdGhlIGZvcm1hdCBzdHJpbmcgdG8gYWxsb3cgYSBsaXN0IHRvIGJlIGJ1aWxkIGJ5Ci0jICAgc3Vic2VxdWVudCBvY2N1cmFuY2Ugb2YgdGhlIHNhbWUgb3B0aW9uLgotc3ViIEdldG9wdHMgewotICAgIG15ICgkYXJndW1lbnRhdGl2ZSwgQEFSR1YpID0gQF87Ci0gICAgbXkgKEBhcmdzLCAkZmlyc3QsICRyZXN0LCAkcG9zKTsKLSAgICBteSAoJGVycnMpID0gMDsKLSAgICBsb2NhbCAoJF8pOwotICAgIGxvY2FsICgkWykgPSAwOwotCi0gICAgQGFyZ3MgPSBzcGxpdCggLyAqLywgJGFyZ3VtZW50YXRpdmUpOwotICAgIHdoaWxlKEBBUkdWICYmICgkXyA9ICRBUkdWWzBdKSA9fiAvXi0oLikoLiopLykgewotICAgICAgICAoJGZpcnN0LCAkcmVzdCkgPSAoJDEsJDIpOwotICAgICAgICBpZiAoJF8gPX4gbXxeLS0kfCkgewotICAgICAgICAgICAgc2hpZnQoQEFSR1YpOwotICAgICAgICAgICAgbGFzdDsKLSAgICAgICAgfQotICAgICAgICAkcG9zID0gaW5kZXgoJGFyZ3VtZW50YXRpdmUsJGZpcnN0KTsKLSAgICAgICAgaWYoJHBvcyA+PSAkWykgewotICAgICAgICAgICAgaWYoJGFyZ3NbJHBvcysxXSBlcSAnOicpIHsKLSAgICAgICAgICAgICAgICBzaGlmdChAQVJHVik7Ci0gICAgICAgICAgICAgICAgaWYoJHJlc3QgZXEgJycpIHsKLSAgICAgICAgICAgICAgICAgICAgdW5sZXNzIChAQVJHVikgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgU1RERVJSICJhcHhzOkVycm9yOiBJbmNvbXBsZXRlIG9wdGlvbjogJGZpcnN0IChuZWVkcyBhbiBhcmd1bWVudClcbiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICArKyRlcnJzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICRyZXN0ID0gc2hpZnQoQEFSR1YpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBldmFsICJcJG9wdF8kZmlyc3QgPSBcJHJlc3Q7IjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2lmICgkYXJnc1skcG9zKzFdIGVxICcrJykgewotICAgICAgICAgICAgICAgIHNoaWZ0KEBBUkdWKTsKLSAgICAgICAgICAgICAgICBpZigkcmVzdCBlcSAnJykgewotICAgICAgICAgICAgICAgICAgICB1bmxlc3MgKEBBUkdWKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludCBTVERFUlIgImFweHM6RXJyb3I6IEluY29tcGxldGUgb3B0aW9uOiAkZmlyc3QgKG5lZWRzIGFuIGFyZ3VtZW50KVxuIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICsrJGVycnM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgJHJlc3QgPSBzaGlmdChAQVJHVik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGV2YWwgInB1c2goXEBvcHRfJGZpcnN0LCBcJHJlc3QpOyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBldmFsICJcJG9wdF8kZmlyc3QgPSAxIjsKLSAgICAgICAgICAgICAgICBpZigkcmVzdCBlcSAnJykgewotICAgICAgICAgICAgICAgICAgICBzaGlmdChAQVJHVik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkQVJHVlswXSA9ICItJHJlc3QiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHByaW50IFNUREVSUiAiYXB4czpFcnJvcjogVW5rbm93biBvcHRpb246ICRmaXJzdFxuIjsKLSAgICAgICAgICAgICsrJGVycnM7Ci0gICAgICAgICAgICBpZigkcmVzdCBuZSAnJykgewotICAgICAgICAgICAgICAgICRBUkdWWzBdID0gIi0kcmVzdCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBzaGlmdChAQVJHVik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICgkZXJycyA9PSAwLCBAQVJHVik7Ci19Ci0KLXN1YiB1c2FnZSB7Ci0gICAgcHJpbnQgU1RERVJSICJVc2FnZTogYXB4cyAtZyBbLVMgPHZhcj49PHZhbD5dIC1uIDxtb2RuYW1lPlxuIjsKLSAgICBwcmludCBTVERFUlIgIiAgICAgICBhcHhzIC1xIFstUyA8dmFyPj08dmFsPl0gPHF1ZXJ5PiAuLi5cbiI7Ci0gICAgcHJpbnQgU1RERVJSICIgICAgICAgYXB4cyAtYyBbLVMgPHZhcj49PHZhbD5dIFstbyA8ZHNvZmlsZT5dIFstRCA8bmFtZT5bPTx2YWx1ZT5dXVxuIjsKLSAgICBwcmludCBTVERFUlIgIiAgICAgICAgICAgICAgIFstSSA8aW5jZGlyPl0gWy1MIDxsaWJkaXI+XSBbLWwgPGxpYm5hbWU+XSBbLVdjLDxmbGFncz5dXG4iOwotICAgIHByaW50IFNUREVSUiAiICAgICAgICAgICAgICAgWy1XbCw8ZmxhZ3M+XSA8ZmlsZXM+IC4uLlxuIjsKLSAgICBwcmludCBTVERFUlIgIiAgICAgICBhcHhzIC1pIFstUyA8dmFyPj08dmFsPl0gWy1hXSBbLUFdIFstbiA8bW9kbmFtZT5dIDxkc29maWxlPiAuLi5cbiI7Ci0gICAgcHJpbnQgU1RERVJSICIgICAgICAgYXB4cyAtZSBbLVMgPHZhcj49PHZhbD5dIFstYV0gWy1BXSBbLW4gPG1vZG5hbWU+XSA8ZHNvZmlsZT4gLi4uXG4iOwotICAgIGV4aXQoMSk7Ci19Ci0KLSMgICBvcHRpb24gaGFuZGxpbmcKLW15ICRyYzsKLSgkcmMsIEBBUkdWKSA9ICZHZXRvcHRzKCJxbjpnY286SStEK0wrbCtXK1MrZWlhQSIsIEBBUkdWKTsKLSZ1c2FnZSBpZiAoJHJjID09IDApOwotJnVzYWdlIGlmICgkI0FSR1YgPT0gLTEgYW5kIG5vdCAkb3B0X2cpOwotJnVzYWdlIGlmIChub3QgJG9wdF9xIGFuZCBub3QgKCRvcHRfZyBhbmQgJG9wdF9uKSBhbmQgbm90ICRvcHRfaSBhbmQgbm90ICRvcHRfYyBhbmQgbm90ICRvcHRfZSk7Ci0KLSMgICBhcmd1bWVudCBoYW5kbGluZwotbXkgQGFyZ3MgPSBAQVJHVjsKLW15ICRuYW1lID0gJ3Vua25vd24nOwotJG5hbWUgPSAkb3B0X24gaWYgKCRvcHRfbiBuZSAnJyk7Ci0KLWlmIChAb3B0X1MpIHsKLSAgICBteSAoJG9wdF9TKTsKLSAgICBmb3JlYWNoICRvcHRfUyAoQG9wdF9TKSB7Ci0JaWYgKCRvcHRfUyA9fiBtL14oW149XSspPSguKikkLykgewotCSAgICBteSAoJHZhcikgPSAkMTsKLQkgICAgbXkgKCR2YWwpID0gJDI7Ci0JICAgIG15ICRvbGR2YWwgPSBldmFsICJcJENGR18kdmFyIjsKLQotCSAgICB1bmxlc3MgKCR2YXIgYW5kICRvbGR2YWwpIHsKLQkJcHJpbnQgU1RERVJSICJhcHhzOkVycm9yOiBubyBjb25maWcgdmFyaWFibGUgJHZhclxuIjsKLQkJJnVzYWdlOwotCSAgICB9Ci0KLQkgICAgZXZhbCAiXCRDRkdfJHt2YXJ9PVwiJHt2YWx9XCIiOwotCX0gZWxzZSB7Ci0JICAgIHByaW50IFNUREVSUiAiYXB4czpFcnJvcjogbWFsZm9ybWF0dGVkIC1TIG9wdGlvblxuIjsKLQkgICAgJnVzYWdlOwotCX0JCi0gICAgfQotfQotCi0jIwotIyMgIE9wZXJhdGlvbgotIyMKLQotIyAgIGhlbHBlciBmdW5jdGlvbiBmb3IgZXhlY3V0aW5nIGEgbGlzdCBvZgotIyAgIHN5c3RlbSBjb21tYW5kIHdpdGggcmV0dXJuIGNvZGUgY2hlY2tzCi1zdWIgZXhlY3V0ZV9jbWRzIHsKLSAgICBteSAoQGNtZHMpID0gQF87Ci0gICAgbXkgKCRjbWQsICRyYyk7Ci0KLSAgICBmb3JlYWNoICRjbWQgKEBjbWRzKSB7Ci0gICAgICAgIHByaW50IFNUREVSUiAiJGNtZFxuIjsKLSAgICAgICAgJHJjID0gc3lzdGVtKCIkY21kIik7Ci0gICAgICAgIGlmICgkcmMgIT0gMCkgewotICAgICAgICAgICAgcHJpbnRmKFNUREVSUiAiYXB4czpCcmVhazogQ29tbWFuZCBmYWlsZWQgd2l0aCByYz0lZFxuIiwgJHJjIDw8IDgpOwotICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotaWYgKCRvcHRfZykgewotICAgICMjCi0gICAgIyMgIFNBTVBMRSBNT0RVTEUgU09VUkNFIEdFTkVSQVRJT04KLSAgICAjIwotCi0gICAgaWYgKC1kICRuYW1lKSB7Ci0gICAgICAgIHByaW50IFNUREVSUiAiYXB4czpFcnJvcjogRGlyZWN0b3J5IGAkbmFtZScgYWxyZWFkeSBleGlzdHMuIFJlbW92ZSBmaXJzdFxuIjsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBteSAkZGF0YSA9IGpvaW4oJycsIDxEQVRBPik7Ci0gICAgJGRhdGEgPX4gc3wlTkFNRSV8JG5hbWV8c2c7Ci0gICAgJGRhdGEgPX4gc3wlVEFSR0VUJXwkQ0ZHX1RBUkdFVHxzZzsKLQotICAgIG15ICgkbWtmLCAkc3JjKSA9ICgkZGF0YSA9fiBtfF4oLispLT0jPS1cbiguKyl8cyk7Ci0KLSAgICBwcmludCBTVERFUlIgIkNyZWF0aW5nIFtESVJdICAkbmFtZVxuIjsKLSAgICBzeXN0ZW0oIm1rZGlyICRuYW1lIik7Ci0gICAgcHJpbnQgU1RERVJSICJDcmVhdGluZyBbRklMRV0gJG5hbWUvTWFrZWZpbGVcbiI7Ci0gICAgb3BlbihGUCwgIj4ke25hbWV9L01ha2VmaWxlIikgfHwgZGllOwotICAgIHByaW50IEZQICRta2Y7Ci0gICAgY2xvc2UoRlApOwotICAgIHByaW50IFNUREVSUiAiQ3JlYXRpbmcgW0ZJTEVdICRuYW1lL21vZF8kbmFtZS5jXG4iOwotICAgIG9wZW4oRlAsICI+JHtuYW1lfS9tb2RfJHtuYW1lfS5jIikgfHwgZGllOwotICAgIHByaW50IEZQICRzcmM7Ci0gICAgY2xvc2UoRlApOwotCi0gICAgZXhpdCgwKTsKLX0KLQotCi1pZiAoJG9wdF9xKSB7Ci0gICAgIyMKLSAgICAjIyAgUVVFUlkgSU5GT1JNQVRJT04gCi0gICAgIyMKLQotICAgIG15ICRyZXN1bHQgPSAnJzsKLSAgICBteSAkYXJnOwotICAgIGZvcmVhY2ggJGFyZyAoQGFyZ3MpIHsKLSAgICAgICAgbXkgJG9rID0gMDsKLSAgICAgICAgbXkgJG5hbWU7Ci0gICAgICAgIGZvcmVhY2ggJG5hbWUgKHF3KAotICAgICAgICAgICAgVEFSR0VUIENDIENGTEFHUyBDRkxBR1NfU0hMSUIgTERfU0hMSUIgTERGTEFHU19TSExJQiBMSUJTX1NITElCCi0gICAgICAgICAgICBQUkVGSVggU0JJTkRJUiBJTkNMVURFRElSIExJQkVYRUNESVIgU1lTQ09ORkRJUgotICAgICAgICApKSB7Ci0gICAgICAgICAgICBpZiAoJGFyZyBlcSAkbmFtZSBvciAkYXJnIGVxIGxjKCRuYW1lKSkgewotICAgICAgICAgICAgICAgIG15ICR2YWwgPSBldmFsICJcJENGR18kbmFtZSI7Ci0gICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAiJHt2YWx9OjoiOwotICAgICAgICAgICAgICAgICRvayA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5vdCAkb2spIHsKLSAgICAgICAgICAgIHByaW50ZihTVERFUlIgImFweHM6RXJyb3I6IEludmFsaWQgcXVlcnkgc3RyaW5nIGAlcydcbiIsICRhcmcpOwotICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAkcmVzdWx0ID1+IHN8OjokfHw7Ci0gICAgJHJlc3VsdCA9fiBzfDo6fCB8OwotICAgIHByaW50ICRyZXN1bHQ7Ci19Ci0KLWlmICgkb3B0X2MpIHsKLSAgICAjIwotICAgICMjICBTSEFSRUQgT0JKRUNUIENPTVBJTEFUSU9OCi0gICAgIyMKLQotICAgICMgICBzcGxpdCBmaWxlcyBpbnRvIHNvdXJjZXMgYW5kIG9iamVjdHMKLSAgICBteSBAc3JjcyA9ICgpOwotICAgIG15IEBvYmpzID0gKCk7Ci0gICAgbXkgJGY7Ci0gICAgZm9yZWFjaCAkZiAoQGFyZ3MpIHsKLSAgICAgICAgaWYgKCRmID1+IG18XC5jJHwpIHsKLSAgICAgICAgICAgIHB1c2goQHNyY3MsICRmKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHB1c2goQG9ianMsICRmKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgICMgICBkZXRlcm1pbmUgb3V0cHV0IGZpbGUKLSAgICBteSAkZHNvX2ZpbGU7Ci0gICAgaWYgKCRvcHRfbyBlcSAnJykgewotICAgICAgICBpZiAoJCNzcmNzID4gLTEpIHsKLSAgICAgICAgICAgICRkc29fZmlsZSA9ICRzcmNzWzBdOwotICAgICAgICAgICAgJGRzb19maWxlID1+IHN8XC5bXi5dKyR8LnNvfDsKLSAgICAgICAgfQotICAgICAgICBlbHNpZiAoJCNvYmpzID4gLTEpIHsKLSAgICAgICAgICAgICRkc29fZmlsZSA9ICRvYmpzWzBdOwotICAgICAgICAgICAgJGRzb19maWxlID1+IHN8XC5bXi5dKyR8LnNvfDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICRkc29fZmlsZSA9ICJtb2RfdW5rbm93bi5zbyI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgICRkc29fZmlsZSA9ICRvcHRfbzsKLSAgICB9Ci0KLSAgICAjICAgY3JlYXRlIGNvbXBpbGF0aW9uIGNvbW1hbmRzCi0gICAgbXkgQGNtZHMgPSAoKTsKLSAgICBteSAkb3B0ID0gJyc7Ci0gICAgbXkgKCRvcHRfV2MsICRvcHRfSSwgJG9wdF9EKTsKLSAgICBmb3JlYWNoICRvcHRfV2MgKEBvcHRfVykgewotICAgICAgICAkb3B0IC49ICIkMSAiIGlmICgkb3B0X1djID1+IG18XlxzKmMsKC4qKSR8KTsKLSAgICB9Ci0gICAgZm9yZWFjaCAkb3B0X0kgKEBvcHRfSSkgewotICAgICAgICAkb3B0IC49ICItSSRvcHRfSSAiOwotICAgIH0KLSAgICBmb3JlYWNoICRvcHRfRCAoQG9wdF9EKSB7Ci0gICAgICAgICRvcHQgLj0gIi1EJG9wdF9EICI7Ci0gICAgfQotICAgIG15ICRjZmxhZ3MgPSAiJENGR19DRkxBR1MgJENGR19DRkxBR1NfU0hMSUIiOwotICAgIG15ICRzOwotICAgIGZvcmVhY2ggJHMgKEBzcmNzKSB7Ci0gICAgICAgIG15ICRvID0gJHM7Ci0gICAgICAgICRvID1+IHN8XC5jJHwub3w7Ci0gICAgICAgIHB1c2goQGNtZHMsICIkQ0ZHX0NDICRjZmxhZ3MgLUkkQ0ZHX0lOQ0xVREVESVIgJG9wdCAtYyAkcyIpOwotICAgICAgICB1bnNoaWZ0KEBvYmpzLCAkbyk7Ci0gICAgfQotCi0gICAgIyAgIGNyZWF0ZSBsaW5rIGNvbW1hbmQKLSAgICBteSAkY21kID0gIiRDRkdfTERfU0hMSUIgJENGR19MREZMQUdTX1NITElCIC1vICRkc29fZmlsZSI7Ci0gICAgbXkgJG87Ci0gICAgZm9yZWFjaCAkbyAoQG9ianMpIHsKLSAgICAgICAgJGNtZCAuPSAiICRvIjsKLSAgICB9Ci0gICAgJG9wdCA9ICcnOwotICAgIG15ICgkb3B0X1dsLCAkb3B0X0wsICRvcHRfbCk7Ci0gICAgZm9yZWFjaCAkb3B0X1dsIChAb3B0X1cpIHsKLQkJaWYoJENGR19MRF9TSExJQiBuZSAiZ2NjIikgewotCSAgICAgICAgJG9wdCAuPSAiICQxIiBpZiAoJG9wdF9XbCA9fiBtfF5ccypsLCguKikkfCk7Ci0JCX0gZWxzZSB7Ci0JICAgICAgICAkb3B0IC49ICIgLVckb3B0X1dsIjsKLQkJfQotICAgIH0KLSAgICBmb3JlYWNoICRvcHRfTCAoQG9wdF9MKSB7Ci0gICAgICAgICRvcHQgLj0gIiAtTCRvcHRfTCI7Ci0gICAgfQotICAgIGZvcmVhY2ggJG9wdF9sIChAb3B0X2wpIHsKLSAgICAgICAgJG9wdCAuPSAiIC1sJG9wdF9sIjsKLSAgICB9Ci0gICAgJGNtZCAuPSAkb3B0OwotICAgICRjbWQgLj0gIiAkQ0ZHX0xJQlNfU0hMSUIiOwotICAgIHB1c2goQGNtZHMsICRjbWQpOwotCi0gICAgIyAgIGV4ZWN1dGUgdGhlIGNvbW1hbmRzCi0gICAgJmV4ZWN1dGVfY21kcyhAY21kcyk7Ci0KLSAgICAjICAgYWxsb3cgb25lLXN0ZXAgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbgotICAgIGlmICgkb3B0X2kgb3IgJG9wdF9lKSB7Ci0gICAgICAgIEBhcmdzID0gKCAkZHNvX2ZpbGUgKTsKLSAgICB9Ci19Ci0KLWlmICgkb3B0X2kgb3IgJG9wdF9lKSB7Ci0gICAgIyMKLSAgICAjIyAgU0hBUkVEIE9CSkVDVCBJTlNUQUxMQVRJT04KLSAgICAjIwotCi0gICAgIyAgIGRldGVybWluZSBpbnN0YWxsYXRpb24gY29tbWFuZHMKLSAgICAjICAgYW5kIGNvcnJlc3BvbmRpbmcgTG9hZE1vZHVsZS9BZGRNb2R1bGUgZGlyZWN0aXZlcwotICAgIG15IEBsbWQgPSAoKTsKLSAgICBteSBAYW1kID0gKCk7Ci0gICAgbXkgQGNtZHMgPSAoKTsKLSAgICBteSAkZjsKLSAgICBmb3JlYWNoICRmIChAYXJncykgewotICAgICAgICBpZiAoJGYgIX4gbXxcLnNvJHwpIHsKLSAgICAgICAgICAgIHByaW50IFNUREVSUiAiYXB4czpFcnJvcjogZmlsZSAkZiBpcyBub3QgYSBzaGFyZWQgb2JqZWN0XG4iOwotICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgICBteSAkdCA9ICRmOwotICAgICAgICAkdCA9fiBzfF4uKy8oW14vXSspJHwkMXw7Ci0gICAgICAgIGlmICgkb3B0X2kpIHsKLQkgICAgcHVzaChAY21kcywgImNwICRmICRDRkdfTElCRVhFQ0RJUi8kdCIpOwotCSAgICBwdXNoKEBjbWRzLCAiY2htb2QgNzU1ICRDRkdfTElCRVhFQ0RJUi8kdCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgIyAgIGRldGVybWluZSBtb2R1bGUgc3ltYm9sbmFtZSBhbmQgZmlsZW5hbWUKLSAgICAgICAgbXkgJGZpbGVuYW1lID0gJyc7Ci0gICAgICAgIGlmICgkbmFtZSBlcSAndW5rbm93bicpIHsKLSAgICAgICAgICAgICRuYW1lID0gJyc7Ci0gICAgICAgICAgICBteSAkYmFzZSA9ICRmOwotICAgICAgICAgICAgJGJhc2UgPX4gc3xcLlteLl0rJHx8OwotICAgICAgICAgICAgaWYgKC1mICIkYmFzZS5jIikgewotICAgICAgICAgICAgICAgIG9wZW4oRlAsICI8JGJhc2UuYyIpOwotICAgICAgICAgICAgICAgIG15ICRjb250ZW50ID0gam9pbignJywgPEZQPik7Ci0gICAgICAgICAgICAgICAgY2xvc2UoRlApOwotICAgICAgICAgICAgICAgIGlmICgkY29udGVudCA9fiBtfC4qbW9kdWxlXHMrKD86TU9EVUxFX1ZBUl9FWFBPUlRccyspPyhbYS16QS1aMC05X10rKV9tb2R1bGVccyo9XHMqLip8cykgewotICAgICAgICAgICAgICAgICAgICAkbmFtZSA9ICIkMSI7Ci0gICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSA9ICIkYmFzZS5jIjsKLSAgICAgICAgICAgICAgICAgICAgJGZpbGVuYW1lID1+IHN8XlteL10rL3x8OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgkbmFtZSBlcSAnJykgewotICAgICAgICAgICAgICAgIGlmICgkYmFzZSA9fiBtfC4qbW9kXyhbYS16QS1aMC05X10rKVwuLit8KSB7Ci0gICAgICAgICAgICAgICAgICAgICRuYW1lID0gIiQxIjsKLSAgICAgICAgICAgICAgICAgICAgJGZpbGVuYW1lID0gJGJhc2U7Ci0gICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSA9fiBzfF5bXi9dKy98fDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoJG5hbWUgZXEgJycpIHsKLSAgICAgICAgICAgICAgICBwcmludCAiYXB4czpFcnJvcjogU29ycnksIGNhbm5vdCBkZXRlcm1pbmUgYm9vdHN0cmFwIHN5bWJvbCBuYW1lXG4iOwotICAgICAgICAgICAgICAgIHByaW50ICJhcHhzOkVycm9yOiBQbGVhc2Ugc3BlY2lmeSBvbmUgd2l0aCBvcHRpb24gYC1uJ1xuIjsKLSAgICAgICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgkZmlsZW5hbWUgZXEgJycpIHsKLSAgICAgICAgICAgICRmaWxlbmFtZSA9ICJtb2RfJHtuYW1lfS5jIjsKLSAgICAgICAgfQotICAgICAgICBteSAkZGlyID0gJENGR19MSUJFWEVDRElSOwotICAgICAgICAkZGlyID1+IHN8XiRDRkdfUFJFRklYLz98fDsKLSAgICAgICAgJGRpciA9fiBzfCguKSR8JDEvfDsKLSAgICAgICAgcHVzaChAbG1kLCBzcHJpbnRmKCJMb2FkTW9kdWxlICUtMThzICVzIiwgIiR7bmFtZX1fbW9kdWxlIiwgIiRkaXIkdCIpKTsKLSAgICAgICAgcHVzaChAYW1kLCBzcHJpbnRmKCJBZGRNb2R1bGUgJXMiLCAkZmlsZW5hbWUpKTsKLSAgICB9Ci0KLSAgICAjICAgZXhlY3V0ZSB0aGUgY29tbWFuZHMKLSAgICAmZXhlY3V0ZV9jbWRzKEBjbWRzKTsKLQotICAgICMgICBhY3RpdmF0ZSBtb2R1bGUgdmlhIExvYWRNb2R1bGUvQWRkTW9kdWxlIGRpcmVjdGl2ZQotICAgIGlmICgkb3B0X2Egb3IgJG9wdF9BKSB7Ci0gICAgICAgIGlmIChub3QgLWYgIiRDRkdfU1lTQ09ORkRJUi8kQ0ZHX1RBUkdFVC5jb25mIikgewotICAgICAgICAgICAgcHJpbnQgImFweHM6RXJyb3I6IENvbmZpZyBmaWxlICRDRkdfU1lTQ09ORkRJUi8kQ0ZHX1RBUkdFVC5jb25mIG5vdCBmb3VuZFxuIjsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBvcGVuKEZQLCAiPCRDRkdfU1lTQ09ORkRJUi8kQ0ZHX1RBUkdFVC5jb25mIikgfHwgZGllOwotICAgICAgICBteSAkY29udGVudCA9IGpvaW4oJycsIDxGUD4pOwotICAgICAgICBjbG9zZShGUCk7Ci0KLSAgICAgICAgaWYgKCRjb250ZW50ICF+IG18XG4jP1xzKkxvYWRNb2R1bGVccyt8KSB7Ci0gICAgICAgICAgICBwcmludCBTVERFUlIgImFweHM6RXJyb3I6IEFjdGl2YXRpb24gZmFpbGVkIGZvciBjdXN0b20gJENGR19TWVNDT05GRElSLyRDRkdfVEFSR0VULmNvbmYgZmlsZS5cbiI7Ci0gICAgICAgICAgICBwcmludCBTVERFUlIgImFweHM6RXJyb3I6IEF0IGxlYXN0IG9uZSBgTG9hZE1vZHVsZScgZGlyZWN0aXZlIGFscmVhZHkgaGFzIHRvIGV4aXN0LlxuIjsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBteSAkbG1kOwotICAgICAgICBteSAkYyA9ICcnOwotICAgICAgICAkYyA9ICcjJyBpZiAoJG9wdF9BKTsKLSAgICAgICAgZm9yZWFjaCAkbG1kIChAbG1kKSB7Ci0gICAgICAgICAgICBteSAkd2hhdCA9ICRvcHRfQSA/ICJwcmVwYXJpbmciIDogImFjdGl2YXRpbmciOwotICAgICAgICAgICAgaWYgKCRjb250ZW50ICF+IG18XG4jP1xzKiRsbWR8KSB7Ci0gICAgICAgICAgICAgICAgICRjb250ZW50ID1+IHN8XiguKlxuIz9ccypMb2FkTW9kdWxlXHMrW15cbl0rXG4pfCQxJGMkbG1kXG58c2c7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAkY29udGVudCA9fiBzfF4oLipcbikjP1xzKiRsbWRbXlxuXSpcbnwkMSRjJGxtZFxufHNnOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgJGxtZCA9fiBtfExvYWRNb2R1bGVccysoLis/KV9tb2R1bGUuKnw7Ci0gICAgICAgICAgICBwcmludCBTVERFUlIgIlskd2hhdCBtb2R1bGUgYCQxJyBpbiAkQ0ZHX1NZU0NPTkZESVIvJENGR19UQVJHRVQuY29uZl1cbiI7Ci0gICAgICAgIH0KLSAgICAgICAgbXkgJGFtZDsKLSAgICAgICAgZm9yZWFjaCAkYW1kIChAYW1kKSB7Ci0gICAgICAgICAgICBpZiAoJGNvbnRlbnQgIX4gbXxcbiM/XHMqJGFtZHwpIHsKLSAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPX4gc3xeKC4qXG4jP1xzKkFkZE1vZHVsZVxzK1teXG5dK1xuKXwkMSRjJGFtZFxufHNnOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPX4gc3xeKC4qXG4pIz9ccyokYW1kW15cbl0qXG58JDEkYyRhbWRcbnxzZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoQGxtZCBvciBAYW1kKSB7Ci0gICAgICAgICAgICBvcGVuKEZQLCAiPiRDRkdfU1lTQ09ORkRJUi8kQ0ZHX1RBUkdFVC5jb25mLm5ldyIpIHx8IGRpZTsKLSAgICAgICAgICAgIHByaW50IEZQICRjb250ZW50OwotICAgICAgICAgICAgY2xvc2UoRlApOwotICAgICAgICAgICAgc3lzdGVtKCJjcCAkQ0ZHX1NZU0NPTkZESVIvJENGR19UQVJHRVQuY29uZiAkQ0ZHX1NZU0NPTkZESVIvJENGR19UQVJHRVQuY29uZi5iYWsgJiYgIiAuCi0gICAgICAgICAgICAgICAgICAgImNwICRDRkdfU1lTQ09ORkRJUi8kQ0ZHX1RBUkdFVC5jb25mLm5ldyAkQ0ZHX1NZU0NPTkZESVIvJENGR19UQVJHRVQuY29uZiAmJiAiIC4KLSAgICAgICAgICAgICAgICAgICAicm0gJENGR19TWVNDT05GRElSLyRDRkdfVEFSR0VULmNvbmYubmV3Iik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLSMjRU9GIyMKLV9fREFUQV9fCi0jIwotIyMgIE1ha2VmaWxlIC0tIEJ1aWxkIHByb2NlZHVyZSBmb3Igc2FtcGxlICVOQU1FJSBBcGFjaGUgbW9kdWxlCi0jIyAgQXV0b2dlbmVyYXRlZCB2aWEgYGBhcHhzIC1uICVOQU1FJSAtZycnLgotIyMKLQotIyAgIHRoZSB1c2VkIHRvb2xzCi1BUFhTPWFweHMKLUFQQUNIRUNUTD1hcGFjaGVjdGwKLQotIyAgIGFkZGl0aW9uYWwgZGVmaW5lcywgaW5jbHVkZXMgYW5kIGxpYnJhcmllcwotI0RFRj0tRG15X2RlZmluZT1teV92YWx1ZQotI0lOQz0tSW15L2luY2x1ZGUvZGlyCi0jTElCPS1MbXkvbGliL2RpciAtbG15bGliCi0KLSMgICB0aGUgZGVmYXVsdCB0YXJnZXQKLWFsbDogbW9kXyVOQU1FJS5zbwotCi0jICAgY29tcGlsZSB0aGUgc2hhcmVkIG9iamVjdCBmaWxlCi1tb2RfJU5BTUUlLnNvOiBtb2RfJU5BTUUlLmMKLQkkKEFQWFMpIC1jICQoREVGKSAkKElOQykgJChMSUIpIG1vZF8lTkFNRSUuYwotCi0jICAgaW5zdGFsbCB0aGUgc2hhcmVkIG9iamVjdCBmaWxlIGludG8gQXBhY2hlIAotaW5zdGFsbDogYWxsCi0JJChBUFhTKSAtaSAtYSAtbiAnJU5BTUUlJyBtb2RfJU5BTUUlLnNvCi0KLSMgICBjbGVhbnVwCi1jbGVhbjoKLQktcm0gLWYgbW9kXyVOQU1FJS5vIG1vZF8lTkFNRSUuc28KLQotIyAgIHNpbXBsZSB0ZXN0Ci10ZXN0OiByZWxvYWQKLQlseW54IC1taW1lX2hlYWRlciBodHRwOi8vbG9jYWxob3N0LyVOQU1FJQotCi0jICAgaW5zdGFsbCBhbmQgYWN0aXZhdGUgc2hhcmVkIG9iamVjdCBieSByZWxvYWRpbmcgQXBhY2hlIHRvCi0jICAgZm9yY2UgYSByZWxvYWQgb2YgdGhlIHNoYXJlZCBvYmplY3QgZmlsZQotcmVsb2FkOiBpbnN0YWxsIHJlc3RhcnQKLQotIyAgIHRoZSBnZW5lcmFsIEFwYWNoZSBzdGFydC9yZXN0YXJ0L3N0b3AKLSMgICBwcm9jZWR1cmVzCi1zdGFydDoKLQkkKEFQQUNIRUNUTCkgc3RhcnQKLXJlc3RhcnQ6Ci0JJChBUEFDSEVDVEwpIHJlc3RhcnQKLXN0b3A6Ci0JJChBUEFDSEVDVEwpIHN0b3AKLQotLT0jPS0KLS8qIAotKiogIG1vZF8lTkFNRSUuYyAtLSBBcGFjaGUgc2FtcGxlICVOQU1FJSBtb2R1bGUKLSoqICBbQXV0b2dlbmVyYXRlZCB2aWEgYGBhcHhzIC1uICVOQU1FJSAtZycnXQotKioKLSoqICBUbyBwbGF5IHdpdGggdGhpcyBzYW1wbGUgbW9kdWxlIGZpcnN0IGNvbXBpbGUgaXQgaW50byBhCi0qKiAgRFNPIGZpbGUgYW5kIGluc3RhbGwgaXQgaW50byBBcGFjaGUncyBsaWJleGVjIGRpcmVjdG9yeSAKLSoqICBieSBydW5uaW5nOgotKioKLSoqICAgICQgYXB4cyAtYyAtaSBtb2RfJU5BTUUlLmMKLSoqCi0qKiAgVGhlbiBhY3RpdmF0ZSBpdCBpbiBBcGFjaGUncyAlVEFSR0VUJS5jb25mIGZpbGUgZm9yIGluc3RhbmNlCi0qKiAgZm9yIHRoZSBVUkwgLyVOQU1FJSBpbiBhcyBmb2xsb3dzOgotKioKLSoqICAgICMgICAlVEFSR0VUJS5jb25mCi0qKiAgICBMb2FkTW9kdWxlICVOQU1FJV9tb2R1bGUgbGliZXhlYy9tb2RfJU5BTUUlLnNvCi0qKiAgICA8TG9jYXRpb24gLyVOQU1FJT4KLSoqICAgIFNldEhhbmRsZXIgJU5BTUUlCi0qKiAgICA8L0xvY2F0aW9uPgotKioKLSoqICBUaGVuIGFmdGVyIHJlc3RhcnRpbmcgQXBhY2hlIHZpYQotKioKLSoqICAgICQgYXBhY2hlY3RsIHJlc3RhcnQKLSoqCi0qKiAgeW91IGltbWVkaWF0ZWx5IGNhbiByZXF1ZXN0IHRoZSBVUkwgLyVOQU1FIGFuZCB3YXRjaCBmb3IgdGhlCi0qKiAgb3V0cHV0IG9mIHRoaXMgbW9kdWxlLiBUaGlzIGNhbiBiZSBhY2hpZXZlZCBmb3IgaW5zdGFuY2UgdmlhOgotKioKLSoqICAgICQgbHlueCAtbWltZV9oZWFkZXIgaHR0cDovL2xvY2FsaG9zdC8lTkFNRSUgCi0qKgotKiogIFRoZSBvdXRwdXQgc2hvdWxkIGJlIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZyBvbmU6Ci0qKgotKiogICAgSFRUUC8xLjEgMjAwIE9LCi0qKiAgICBEYXRlOiBUdWUsIDMxIE1hciAxOTk4IDE0OjQyOjIyIEdNVAotKiogICAgU2VydmVyOiBBcGFjaGUvMS4zLjQgKFVuaXgpCi0qKiAgICBDb25uZWN0aW9uOiBjbG9zZQotKiogICAgQ29udGVudC1UeXBlOiB0ZXh0L2h0bWwKLSoqICAKLSoqICAgIFRoZSBzYW1wbGUgcGFnZSBmcm9tIG1vZF8lTkFNRSUuYwotKi8gCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9wcm90b2NvbC5oIgotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotCi0vKiBUaGUgc2FtcGxlIGNvbnRlbnQgaGFuZGxlciAqLwotc3RhdGljIGludCAlTkFNRSVfaGFuZGxlcihyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICByLT5jb250ZW50X3R5cGUgPSAidGV4dC9odG1sIjsgICAgICAKLSAgICBhcF9zZW5kX2h0dHBfaGVhZGVyKHIpOwotICAgIGlmICghci0+aGVhZGVyX29ubHkpCi0gICAgICAgIGFwX3JwdXRzKCJUaGUgc2FtcGxlIHBhZ2UgZnJvbSBtb2RfJU5BTUUlLmNcbiIsIHIpOwotICAgIHJldHVybiBPSzsKLX0KLQotLyogRGlzcGF0Y2ggbGlzdCBvZiBjb250ZW50IGhhbmRsZXJzICovCi1zdGF0aWMgY29uc3QgaGFuZGxlcl9yZWMgJU5BTUUlX2hhbmRsZXJzW10gPSB7IAotICAgIHsgIiVOQU1FJSIsICVOQU1FJV9oYW5kbGVyIH0sIAotICAgIHsgTlVMTCwgTlVMTCB9Ci19OwotCi0vKiBEaXNwYXRjaCBsaXN0IGZvciBBUEkgaG9va3MgKi8KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCAlTkFNRSVfbW9kdWxlID0gewotICAgIFNUQU5EQVJEX01PRFVMRV9TVFVGRiwgCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgaW5pdGlhbGl6ZXIgICAgICAgICAgICAgICAgICAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHBlci1kaXIgICAgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIG1lcmdlICBwZXItZGlyICAgIGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogbWVyZ2UgIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHRhYmxlIG9mIGNvbmZpZyBmaWxlIGNvbW1hbmRzICAgICAgICovCi0gICAgJU5BTUUlX2hhbmRsZXJzLCAgICAgICAvKiBbIzhdIE1JTUUtdHlwZWQtZGlzcGF0Y2hlZCBoYW5kbGVycyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogWyMxXSBVUkkgdG8gZmlsZW5hbWUgdHJhbnNsYXRpb24gICAgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIFsjNF0gdmFsaWRhdGUgdXNlciBpZCBmcm9tIHJlcXVlc3QgICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBbIzVdIGNoZWNrIGlmIHRoZSB1c2VyIGlzIG9rIF9oZXJlXyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogWyMzXSBjaGVjayBhY2Nlc3MgYnkgaG9zdCBhZGRyZXNzICAgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIFsjNl0gZGV0ZXJtaW5lIE1JTUUgdHlwZSAgICAgICAgICAgICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBbIzddIHByZS1ydW4gZml4dXBzICAgICAgICAgICAgICAgICAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogWyM5XSBsb2cgYSB0cmFuc2FjdGlvbiAgICAgICAgICAgICAgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIFsjMl0gaGVhZGVyIHBhcnNlciAgICAgICAgICAgICAgICAgICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBjaGlsZF9pbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogY2hpbGRfZXhpdCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBOVUxMICAgICAgICAgICAgICAgICAgIC8qIFsjMF0gcG9zdCByZWFkLXJlcXVlc3QgICAgICAgICAgICAgICovCi19OwotCmRpZmYgLS1naXQgYS9zdXBwb3J0L2NoZWNrZ2lkLmMgYi9zdXBwb3J0L2NoZWNrZ2lkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhY2VjMjAuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9jaGVja2dpZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICovCi0KLS8qCi0gKiBHaXZlbiBvbmUgb3IgbW9yZSBncm91cCBpZGVudGlmZXJzIG9uIHRoZSBjb21tYW5kIGxpbmUgKGUuZy4sCi0gKiAiaHR0cGQiIG9yICIjLTEiKSwgZmlndXJlIG91dCB3aGV0aGVyIHRoZXknbGwgYmUgdmFsaWQgZm9yCi0gKiB0aGUgc2VydmVyIHRvIHVzZSBhdCBydW4tdGltZS4KLSAqCi0gKiBJZiBhIGdyb3VwbmFtZSBpc24ndCBmb3VuZCwgb3Igd2UgY2FuJ3Qgc2V0Z2lkKCkgdG8gaXQsIHJldHVybgotICogLTEuICBJZiBhbGwgZ3JvdXBzIGFyZSB2YWxpZCwgcmV0dXJuIDAuCi0gKgotICogVGhpcyBtYXkgbmVlZCB0byBiZSBydW4gYXMgdGhlIHN1cGVydXNlciBmb3IgdGhlIHNldGdpZCgpIHRvCi0gKiBzdWNjZWVkOyBydW5uaW5nIGl0IGFzIGFueSBvdGhlciB1c2VyIG1heSByZXN1bHQgaW4gYSBmYWxzZQotICogbmVnYXRpdmUuCi0gKi8KLQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2lmIEFQUl9IQVZFX1NURElPX0gKLSNpbmNsdWRlIDxzdGRpby5oPgotI2VuZGlmCi0jaWYgQVBSX0hBVkVfU1lTX1RZUEVTX0gKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNlbmRpZgotI2lmIEhBVkVfR1JQX0gKLSNpbmNsdWRlIDxncnAuaD4KLSNlbmRpZgotI2lmIEFQUl9IQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgcmVzdWx0OwotICAgIGdpZF90IGdpZDsKLSAgICBzdHJ1Y3QgZ3JvdXAgKmdyZW50OwotICAgIHN0cnVjdCBncm91cCBmYWtlX2dyZW50OwotCi0gICAgLyoKLSAgICAgKiBBc3N1bWUgc3VjY2Vzcy4gOi0pCi0gICAgICovCi0gICAgcmVzdWx0ID0gMDsKLSAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgKytpKSB7Ci0gICAgICAgIGNoYXIgKmFyZzsKLSAgICAgICAgYXJnID0gYXJndltpXTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBJZiBpdCdzIGZyb20gYSAnR3JvdXAgIy0xJyBzdGF0ZW1lbnQsIGdldCB0aGUgbnVtZXJpYyB2YWx1ZQotICAgICAgICAgKiBhbmQgc2tpcCB0aGUgZ3JvdXAgbG9va3VwIHN0dWZmLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCphcmcgPT0gJyMnKSB7Ci0gICAgICAgICAgICBnaWQgPSBhdG9pKCZhcmdbMV0pOwotICAgICAgICAgICAgZmFrZV9ncmVudC5ncl9naWQgPSBnaWQ7Ci0gICAgICAgICAgICBncmVudCA9ICZmYWtlX2dyZW50OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZ3JlbnQgPSBnZXRncm5hbShhcmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQSBOVUxMIHJldHVybiBtZWFucyBubyBzdWNoIGdyb3VwIHdhcyBmb3VuZCwgc28gd2UncmUgZG9uZQotICAgICAgICAgKiB3aXRoIHRoaXMgb25lLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGdyZW50ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGdyb3VwICclcycgbm90IGZvdW5kXG4iLCBhcmd2WzBdLCBhcmcpOwotICAgICAgICAgICAgcmVzdWx0ID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpbnQgY2hlY2s7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBTZWUgaWYgd2UgY2FuIHN3aXRjaCB0byB0aGUgbnVtZXJpYyBHSUQgd2UgaGF2ZS4gSWYgc28sCi0gICAgICAgICAgICAgKiBhbGwgd2VsbCBhbmQgZ29vZDsgaWYgbm90LCB3ZWxsLi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgZ2lkID0gZ3JlbnQtPmdyX2dpZDsKLSAgICAgICAgICAgIGNoZWNrID0gc2V0Z2lkKGdpZCk7Ci0gICAgICAgICAgICBpZiAoY2hlY2sgIT0gMCkgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGludmFsaWQgZ3JvdXAgJyVzJ1xuIiwgYXJndlswXSwgYXJnKTsKLSAgICAgICAgICAgICAgICBwZXJyb3IoYXJndlswXSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoKLSAgICAgKiBXb3JzdC1jYXNlIHJldHVybiB2YWx1ZS4KLSAgICAgKi8KLSAgICByZXR1cm4gcmVzdWx0OwotfQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIG1vZGU6IEMKLSAqIGMtZmlsZS1zdHlsZTogImJzZCIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9jb25maWcubTQgYi9zdXBwb3J0L2NvbmZpZy5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UzNzc0Ny4uMDAwMDAwMAotLS0gYS9zdXBwb3J0L2NvbmZpZy5tNAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLQotCi1odHBhc3N3ZF9MVEZMQUdTPSIiCi1odGRpZ2VzdF9MVEZMQUdTPSIiCi1yb3RhdGVsb2dzX0xURkxBR1M9IiIKLWxvZ3Jlc29sdmVfTFRGTEFHUz0iIgotYWJfTFRGTEFHUz0iIgotCi1kbmwgWFhYIFNob3VsZCB3ZSBjaGFuZ2UgdGhlIGZvb19MVEZMQUdTPSItc3RhdGljIiBzZXR0aW5ncyBiZWxvdwotZG5sIHRvIHNvbWV0aGluZyBsaWtlIEFQUl9BRERUTz8gLWFhcm9uCi0KLUFDX0FSR19FTkFCTEUoc3RhdGljLWh0cGFzc3dkLFsgIC0tZW5hYmxlLXN0YXRpYy1odHBhc3N3ZCAgQnVpbGQgYSBzdGF0aWNhbGx5IGxpbmtlZCB2ZXJzaW9uIG9mIGh0cGFzc3dkXSxbCi1pZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJ5ZXMiIDsgdGhlbgotICBodHBhc3N3ZF9MVEZMQUdTPSItc3RhdGljIgotZmkKLV0pCi1BUEFDSEVfU1VCU1QoaHRwYXNzd2RfTFRGTEFHUykKLQotQUNfQVJHX0VOQUJMRShzdGF0aWMtaHRkaWdlc3QsWyAgLS1lbmFibGUtc3RhdGljLWh0ZGlnZXN0ICBCdWlsZCBhIHN0YXRpY2FsbHkgbGlua2VkIHZlcnNpb24gb2YgaHRkaWdlc3RdLFsKLWlmIHRlc3QgIiRlbmFibGV2YWwiID0gInllcyIgOyB0aGVuCi0gIGh0ZGlnZXN0X0xURkxBR1M9Ii1zdGF0aWMiCi1maQotXSkKLUFQQUNIRV9TVUJTVChodGRpZ2VzdF9MVEZMQUdTKQotCi1BQ19BUkdfRU5BQkxFKHN0YXRpYy1yb3RhdGVsb2dzLFsgIC0tZW5hYmxlLXN0YXRpYy1yb3RhdGVsb2dzICBCdWlsZCBhIHN0YXRpY2FsbHkgbGlua2VkIHZlcnNpb24gb2Ygcm90YXRlbG9nc10sWwotaWYgdGVzdCAiJGVuYWJsZXZhbCIgPSAieWVzIiA7IHRoZW4KLSAgcm90YXRlbG9nc19MVEZMQUdTPSItc3RhdGljIgotZmkKLV0pCi1BUEFDSEVfU1VCU1Qocm90YXRlbG9nc19MVEZMQUdTKQotCi1BQ19BUkdfRU5BQkxFKHN0YXRpYy1sb2dyZXNvbHZlLFsgIC0tZW5hYmxlLXN0YXRpYy1sb2dyZXNvbHZlICBCdWlsZCBhIHN0YXRpY2FsbHkgbGlua2VkIHZlcnNpb24gb2YgbG9ncmVzb2x2ZV0sWwotaWYgdGVzdCAiJGVuYWJsZXZhbCIgPSAieWVzIiA7IHRoZW4KLSAgbG9ncmVzb2x2ZV9MVEZMQUdTPSItc3RhdGljIgotZmkKLV0pCi1BUEFDSEVfU1VCU1QobG9ncmVzb2x2ZV9MVEZMQUdTKQotCi1BQ19BUkdfRU5BQkxFKHN0YXRpYy1hYixbICAtLWVuYWJsZS1zdGF0aWMtYWIgICAgICBCdWlsZCBhIHN0YXRpY2FsbHkgbGlua2VkIHZlcnNpb24gb2YgYWJdLFsKLWlmIHRlc3QgIiRlbmFibGV2YWwiID0gInllcyIgOyB0aGVuCi0gIGFiX0xURkxBR1M9Ii1zdGF0aWMiCi1maQotXSkKLUFQQUNIRV9TVUJTVChhYl9MVEZMQUdTKQpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9kYm1tYW5hZ2UuaW4gYi9zdXBwb3J0L2RibW1hbmFnZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3NTYzNy4uMDAwMDAwMAotLS0gYS9zdXBwb3J0L2RibW1hbmFnZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0jIUBwZXJsYmluQAotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0jCi0jIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSMgYXJlIG1ldDoKLSMKLSMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIwotIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSMgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyAgICBkaXN0cmlidXRpb24uCi0jCi0jIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotIyAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotIyAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSMgICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0jICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSMgICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSMKLSMgNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSMgICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0jICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotIyAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSMKLSMgNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0jICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotIyAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotIyBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIyBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0jIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0jIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0jIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotIyBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSMgU1VDSCBEQU1BR0UuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0jIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotIyBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSMgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotIwotCi0jZm9yIG1vcmUgZnVuY3Rpb25hbGl0eSBzZWUgdGhlIEhUVFBEOjpVc2VyQWRtaW4gbW9kdWxlOgotIyBodHRwOi8vd3d3LnBlcmwuY29tL0NQQU4vbW9kdWxlcy9ieS1tb2R1bGUvSFRUUEQvSFRUUEQtVG9vbHMteC54eC50YXIuZ3oKLSMKLSMgdXNhZ2U6IGRibW1hbmFnZSA8REJNZmlsZT4gPGNvbW1hbmQ+IDx1c2VyPiA8cGFzc3dvcmQ+IDxncm91cHM+IDxjb21tZW50PgotCi1wYWNrYWdlIGRibW1hbmFnZTsKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWxkYiAgICAtbG5kYm0gICAgLWxnZGJtICAgIC1sc2RibQotQkVHSU4geyBAQW55REJNX0ZpbGU6OklTQSA9IHF3KERCX0ZpbGUgTkRCTV9GaWxlIEdEQk1fRmlsZSBTREJNX0ZpbGUpIH0KLXVzZSBzdHJpY3Q7Ci11c2UgRmNudGw7Ci11c2UgQW55REJNX0ZpbGUgKCk7Ci0KLXN1YiB1c2FnZSB7Ci0gICAgbXkgJGNtZHMgPSBqb2luICJ8Iiwgc29ydCBrZXlzICVkYm1jOjo7Ci0gICAgZGllIDw8U1lOVEFYOwotVXNhZ2U6IGRibW1hbmFnZSBbZW5jXSBkYm5hbWUgY29tbWFuZCBbdXNlcm5hbWUgW3B3IFtncm91cFssZ3JvdXBdIFtjb21tZW50XV1dXQotCi0gICAgd2hlcmUgZW5jIGlzICAtZCBmb3IgY3J5cHQgZW5jcnlwdGlvbiAoZGVmYXVsdCBleGNlcHQgb24gV2luMzIsIE5ldHdhcmUpCi0gICAgICAgICAgICAgICAgICAtbSBmb3IgTUQ1IGVuY3J5cHRpb24gKGRlZmF1bHQgb24gV2luMzIsIE5ldHdhcmUpCi0gICAgICAgICAgICAgICAgICAtcyBmb3IgU0hBMSBlbmNyeXB0aW9uCi0gICAgICAgICAgICAgICAgICAtcCBmb3IgcGxhaW50ZXh0Ci0KLSAgICBjb21tYW5kIGlzIG9uZSBvZjogJGNtZHMKLQotICAgIHB3IG9mIC4gZm9yIHVwZGF0ZSBjb21tYW5kIHJldGFpbnMgdGhlIG9sZCBwYXNzd29yZAotICAgIHB3IG9mIC0gKG9yIGJsYW5rKSBmb3IgdXBkYXRlIGNvbW1hbmQgcHJvbXB0cyBmb3IgdGhlIHBhc3N3b3JkCi0KLSAgICBncm91cHMgb3IgY29tbWVudCBvZiAuIChvciBibGFuaykgZm9yIHVwZGF0ZSBjb21tYW5kIHJldGFpbnMgb2xkIHZhbHVlcwotICAgIGdyb3VwcyBvciBjb21tZW50IG9mIC0gZm9yIHVwZGF0ZSBjb21tYW5kIGNsZWFycyB0aGUgZXhpc3RpbmcgdmFsdWUKLSAgICBncm91cHMgb3IgY29tbWVudCBvZiAtIGZvciBhZGQgYW5kIGFkZHVzZXIgY29tbWFuZHMgaXMgdGhlIGVtcHR5IHZhbHVlCi1TWU5UQVgKLX0KLQotc3ViIG5lZWRfc2hhMV9jcnlwdCB7Ci0gICAgaWYgKCFldmFsICgncmVxdWlyZSAiRGlnZXN0L1NIQTEucG0iOycpKSB7Ci0gICAgICAgIHByaW50IFNUREVSUiA8PFNIQUVSUjsKLWRibW1hbmFnZSBTSEExIHBhc3N3b3JkcyByZXF1aXJlIHRoZSBpbnRlcmZhY2Ugb3IgdGhlIG1vZHVsZSBEaWdlc3Q6OlNIQTEKLWF2YWlsYWJsZSBmcm9tIENQQU46Ci0gCi0gICAgaHR0cDovL3d3dy5jcGFuLm9yZy9tb2R1bGVzL2J5LW1vZHVsZS9EaWdlc3QvRGlnZXN0LU1ENS0yLjEyLnRhci5negotIAotUGxlYXNlIGluc3RhbGwgRGlnZXN0OjpTSEExIGFuZCB0cnkgYWdhaW4sIG9yIHVzZSBhIGRpZmZlcmVudCBjcnlwdCBvcHRpb246Ci0KLVNIQUVSUgotICAgICAgICB1c2FnZSgpOwotICAgIH0KLX0KLQotc3ViIG5lZWRfbWQ1X2NyeXB0IHsKLSAgICBpZiAoIWV2YWwgKCdyZXF1aXJlICJDcnlwdC9QYXNzd2RNRDUucG0iOycpKSB7Ci0gICAgICAgIHByaW50IFNUREVSUiA8PE1ENUVSUjsKLWRibW1hbmFnZSBNRDUgcGFzc3dvcmRzIHJlcXVpcmUgdGhlIG1vZHVsZSBDcnlwdDo6UGFzc3dkTUQ1IGF2YWlsYWJsZSBmcm9tIENQQU4KLSAKLSAgICBodHRwOi8vd3d3LmNwYW4ub3JnL21vZHVsZXMvYnktbW9kdWxlL0NyeXB0L0NyeXB0LVBhc3N3ZE1ENS0xLjEudGFyLmd6Ci0gCi1QbGVhc2UgaW5zdGFsbCBDcnlwdDo6UGFzc3dkTUQ1IGFuZCB0cnkgYWdhaW4sIG9yIHVzZSBhIGRpZmZlcmVudCBjcnlwdCBvcHRpb246Ci0KLU1ENUVSUgotICAgICAgICB1c2FnZSgpOwotICAgIH0KLX0KLQotIyBpZiB5b3VyIG9zbmFtZSBpcyBpbiAkbmV3c3R5bGVfc2FsdCwgdGhlbiB1c2UgbmV3IHN0eWxlIHNhbHQgKHN0YXJ0cyB3aXRoICdfJyBhbmQgY29udGFpbnMKLSMgZm91ciBieXRlcyBvZiBpdGVyYXRpb24gY291bnQgYW5kIGZvdXIgYnl0ZXMgb2Ygc2FsdCkuICBPdGhlcndpc2UsIGp1c3QgdXNlCi0jIHRoZSB0cmFkaXRpb25hbCB0d28tYnl0ZSBzYWx0LgotIyBzZWUgdGhlIG1hbiBwYWdlIG9uIHlvdXIgc3lzdGVtIHRvIGRlY2lkZSBpZiB5b3UgaGF2ZSBhIG5ld2VyIGNyeXB0KCkgbGliLgotIyBJIGJlbGlldmUgdGhhdCA0LjRCU0QgZGVyaXZlZCBzeXN0ZW1zIGRvIChhdCBsZWFzdCBCU0QvT1MgMi4wIGRvZXMpLgotIyBUaGUgbmV3IHN0eWxlIGNyeXB0KCkgYWxsb3dzIHVwIHRvIDIwIGNoYXJhY3RlcnMgb2YgdGhlIHBhc3N3b3JkIHRvIGJlCi0jIHNpZ25pZmljYW50IHJhdGhlciB0aGFuIG9ubHkgOC4KLSMKLW15ICRuZXdzdHlsZV9zYWx0X3BsYXRmb3JtcyA9IGpvaW4gJ3wnLCBxd3tic2Rvc307ICNvdGhlcnM/Ci1teSAkbmV3c3R5bGVfc2FsdCA9ICReTyA9fiAvKD86JG5ld3N0eWxlX3NhbHRfcGxhdGZvcm1zKS87Ci0KLSMgU29tZSBwbGF0Zm9ybXMganVzdCBjYW4ndCBjcnlwdCgpIGZvciBBcGFjaGUKLSMKLW15ICRjcnlwdF9ub3Rfc3VwcG9ydGVkX3BsYXRmb3JtcyA9IGpvaW4gJ3wnLCBxd3tNU1dpbjMyIE5ldFdhcmV9OyAjb3RoZXJzPwotbXkgJGNyeXB0X25vdF9zdXBwb3J0ZWQgPSAkXk8gPX4gLyg/OiRjcnlwdF9ub3Rfc3VwcG9ydGVkX3BsYXRmb3JtcykvOwotCi1teSAkY3J5cHRfbWV0aG9kID0gImNyeXB0IjsKLQotaWYgKCRjcnlwdF9ub3Rfc3VwcG9ydGVkKSB7Ci0gICAgJGNyeXB0X21ldGhvZCA9ICJtZDUiOwotfQotCi0jIFNvbWUgcGxhdGZvcm1zIHdvbid0IGp1bXAgdGhyb3VnaCBvdXIgZmF2b3JpdGUgaG9vcHMKLSMKLW15ICRub3RfdW5peF9wbGF0Zm9ybXMgPSBqb2luICd8JywgcXd7TVNXaW4zMiBOZXRXYXJlfTsgI290aGVycz8KLW15ICRub3RfdW5peCA9ICReTyA9fiAvKD86JG5vdF91bml4X3BsYXRmb3JtcykvOwotCi1pZiAoJGNyeXB0X25vdF9zdXBwb3J0ZWQpIHsKLSAgICAkY3J5cHRfbWV0aG9kID0gIm1kNSI7Ci19Ci0KLWlmIChAQVJHVlswXSBlcSAiLWQiKSB7Ci0gICAgc2hpZnQgQEFSR1Y7Ci0gICAgaWYgKCRjcnlwdF9ub3Rfc3VwcG9ydGVkKSB7Ci0gICAgICAgIHByaW50IFNUREVSUiAKLSAgICAgICAgICAgICAgIldhcm5pbmc6IEFwYWNoZS8kXk8gZG9lcyBub3Qgc3VwcG9ydCBjcnlwdCgpZWQgcGFzc3dvcmRzIVxuXG4iOwotICAgIH0KLSAgICAkY3J5cHRfbWV0aG9kID0gImNyeXB0IjsKLX0KLQotaWYgKEBBUkdWWzBdIGVxICItbSIpIHsKLSAgICBzaGlmdCBAQVJHVjsKLSAgICAkY3J5cHRfbWV0aG9kID0gIm1kNSI7Ci19Ci0KLWlmIChAQVJHVlswXSBlcSAiLXAiKSB7Ci0gICAgc2hpZnQgQEFSR1Y7Ci0gICAgaWYgKCEkY3J5cHRfbm90X3N1cHBvcnRlZCkgewotICAgICAgICBwcmludCBTVERFUlIgCi0gICAgICAgICAgICAgICJXYXJuaW5nOiBBcGFjaGUvJF5PIGRvZXMgbm90IHN1cHBvcnQgcGxhaW50ZXh0IHBhc3N3b3JkcyFcblxuIjsKLSAgICB9Ci0gICAgJGNyeXB0X21ldGhvZCA9ICJwbGFpbiI7Ci19Ci0KLWlmIChAQVJHVlswXSBlcSAiLXMiKSB7Ci0gICAgc2hpZnQgQEFSR1Y7Ci0gICAgbmVlZF9zaGExX2NyeXB0KCk7Ci0gICAgJGNyeXB0X21ldGhvZCA9ICJzaGExIjsKLX0KLQotaWYgKCRjcnlwdF9tZXRob2QgZXEgIm1kNSIpIHsKLSAgICBuZWVkX21kNV9jcnlwdCgpOwotfQotCi1teSgkZmlsZSwkY29tbWFuZCwka2V5LCRjcnlwdGVkX3B3ZCwkZ3JvdXBzLCRjb21tZW50KSA9IEBBUkdWOwotCi11c2FnZSgpIHVubGVzcyAkZmlsZSBhbmQgJGNvbW1hbmQgYW5kIGRlZmluZWQgJnskZGJtYzo6eyRjb21tYW5kfX07Ci0KLSMgcmVtb3ZlIGV4dGVuc2lvbiBpZiBhbnkKLW15ICRjaG9wID0gam9pbiAnfCcsIHF3e2RiLj8gcGFnIGRpcn07Ci0kZmlsZSA9fiBzL1wuKCRjaG9wKSQvLzsKLQotbXkgJGlzX3VwZGF0ZSA9ICRjb21tYW5kIGVxICJ1cGRhdGUiOwotbXkgJURCID0gKCk7Ci1teSBAcmFuZ2UgPSAoKTsKLW15KCRtb2RlLCAkZmxhZ3MpID0gJGNvbW1hbmQgPX4gCi0gICAgL14oPzp2aWV3fGNoZWNrKSQvID8gKDA2NDQsIE9fUkRPTkxZKSA6ICgwNjQ0LCBPX1JEV1J8T19DUkVBVCk7Ci0KLXRpZSAoJURCLCAiQW55REJNX0ZpbGUiLCAkZmlsZSwgJGZsYWdzLCAkbW9kZSkgfHwgZGllICJDYW4ndCB0aWUgJGZpbGU6ICQhIjsKLWRibWMtPiRjb21tYW5kKCk7Ci11bnRpZSAlREI7Ci0KLQotbXkgJHg7Ci1zdWIgZ2Vuc2VlZCB7Ci0gICAgbXkgJHBzZjsKLSAgICBpZiAoJG5vdF91bml4KSB7Ci0Jc3JhbmQgKHRpbWUgXiAkJCBvciB0aW1lIF4gKCQkICsgKCQkIDw8IDE1KSkpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgZm9yIChxdygteGx3d2EgLWxlKSkgeyAKLQkgICAgYHBzICRfIDI+L2Rldi9udWxsYDsKLSAgICAgICAgICAgICRwc2YgPSAkXywgbGFzdCB1bmxlc3MgJD87Ci0gICAgICAgIH0KLSAgICAgICAgc3JhbmQgKHRpbWUgXiAkJCBeIHVucGFjaygiJUwqIiwgYHBzICRwc2YgfCBnemlwIC1mYCkpOwotICAgIH0KLSAgICBAcmFuZ2UgPSAocXcoLiAvKSwgJzAnLi4nOScsJ2EnLi4neicsJ0EnLi4nWicpOwotICAgICR4ID0gaW50IHNjYWxhciBAcmFuZ2U7Ci19Ci0KLXN1YiByYW5kY2hhciB7IAotICAgIGpvaW4gJycsIG1hcCAkcmFuZ2VbcmFuZCAkeF0sIDEuLnNoaWZ0fHwxOwotfQotCi1zdWIgc2FsdHB3X2NyeXB0IHsKLSAgICBnZW5zZWVkKCkgdW5sZXNzIEByYW5nZTsgCi0gICAgcmV0dXJuICRuZXdzdHlsZV9zYWx0ID8gCi0Jam9pbiAnJywgIl8iLCByYW5kY2hhciwgImEuLiIsIHJhbmRjaGFyKDQpIDoKLSAgICAgICAgcmFuZGNoYXIoMik7Ci19Ci0KLXN1YiBjcnlwdHB3X2NyeXB0IHsKLSAgICBteSAoJHB3LCAkc2FsdCkgPSBAXzsKLSAgICAkc2FsdCA9IHNhbHRwd19jcnlwdCB1bmxlc3MgJHNhbHQ7Ci0gICAgY3J5cHQgJHB3LCAkc2FsdDsKLX0KLQotc3ViIHNhbHRwd19tZDUgewotICAgIGdlbnNlZWQoKSB1bmxlc3MgQHJhbmdlOyAKLSAgICByYW5kY2hhcig4KTsKLX0KLQotc3ViIGNyeXB0cHdfbWQ1IHsKLSAgICBteSgkcHcsICRzYWx0KSA9IEBfOwotICAgICRzYWx0ID0gc2FsdHB3X21kNSB1bmxlc3MgJHNhbHQ7Ci0gICAgQ3J5cHQ6OlBhc3N3ZE1ENTo6YXBhY2hlX21kNV9jcnlwdCgkcHcsICRzYWx0KTsKLX0KLQotc3ViIGNyeXB0cHdfc2hhMSB7Ci0gICAgbXkoJHB3LCAkc2FsdCkgPSBAXzsKLSAgICAne1NIQX0nIC4gRGlnZXN0OjpTSEExOjpzaGExX2Jhc2U2NCgkcHcpIC4gIj0iOwotfQotCi1zdWIgY3J5cHRwdyB7Ci0gICAgaWYgKCRjcnlwdF9tZXRob2QgZXEgIm1kNSIpIHsKLSAgICAgICAgcmV0dXJuIGNyeXB0cHdfbWQ1KEBfKTsKLSAgICB9IGVsc2lmICgkY3J5cHRfbWV0aG9kIGVxICJzaGExIikgewotICAgICAgICByZXR1cm4gY3J5cHRwd19zaGExKEBfKTsKLSAgICB9IGVsc2lmICgkY3J5cHRfbWV0aG9kIGVxICJjcnlwdCIpIHsKLSAgICAgICAgcmV0dXJuIGNyeXB0cHdfY3J5cHQoQF8pOwotICAgIH0KLSAgICBAX1swXTsgIyBvdGhlcndpc2UgcmV0dXJuIHBsYWludGV4dAotfQotCi1zdWIgZ2V0cGFzcyB7Ci0gICAgbXkgJHByb21wdCA9IHNoaWZ0IHx8ICJFbnRlciBwYXNzd29yZDoiOwotCi0gICAgdW5sZXNzKCRub3RfdW5peCkgeyAKLQlvcGVuIFNURElOLCAiL2Rldi90dHkiIG9yIHdhcm4gImNvdWxkbid0IG9wZW4gL2Rldi90dHkgJCFcbiI7Ci0Jc3lzdGVtICJzdHR5IC1lY2hvOyI7Ci0gICAgfQotCi0gICAgbXkoJGMsJHB3ZCk7Ci0gICAgcHJpbnQgU1RERVJSICRwcm9tcHQ7Ci0gICAgd2hpbGUgKCgkYyA9IGdldGMoU1RESU4pKSBuZSAnJyBhbmQgJGMgbmUgIlxuIiBhbmQgJGMgbmUgIlxyIikgewotCSRwd2QgLj0gJGM7Ci0gICAgfQotCi0gICAgc3lzdGVtICJzdHR5IGVjaG8iIHVubGVzcyAkbm90X3VuaXg7Ci0gICAgcHJpbnQgU1RERVJSICJcbiI7Ci0gICAgZGllICJDYW4ndCB1c2UgZW1wdHkgcGFzc3dvcmQhXG4iIHVubGVzcyBsZW5ndGggJHB3ZDsKLSAgICByZXR1cm4gJHB3ZDsKLX0KLQotc3ViIGRibWM6OnVwZGF0ZSB7Ci0gICAgZGllICJTb3JyeSwgdXNlciBgJGtleScgZG9lc24ndCBleGlzdCFcbiIgdW5sZXNzICREQnska2V5fTsKLSAgICAkY3J5cHRlZF9wd2QgPSAoc3BsaXQgLzovLCAkREJ7JGtleX0sIDMpWzBdIGlmICRjcnlwdGVkX3B3ZCBlcSAnLic7Ci0gICAgJGdyb3VwcyA9IChzcGxpdCAvOi8sICREQnska2V5fSwgMylbMV0gaWYgISRncm91cHMgfHwgJGdyb3VwcyBlcSAnLic7Ci0gICAgJGNvbW1lbnQgPSAoc3BsaXQgLzovLCAkREJ7JGtleX0sIDMpWzJdIGlmICEkY29tbWVudCB8fCAkY29tbWVudCBlcSAnLic7Ci0gICAgaWYgKCEkY3J5cHRlZF9wd2QgfHwgJGNyeXB0ZWRfcHdkIGVxICctJykgewotICAgICAgICBkYm1jLT5hZGR1c2VyOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgZGJtYy0+YWRkOwotICAgIH0KLX0KLQotc3ViIGRibWM6OmFkZCB7Ci0gICAgZGllICJDYW4ndCB1c2UgZW1wdHkgcGFzc3dvcmQhXG4iIHVubGVzcyAkY3J5cHRlZF9wd2Q7Ci0gICAgdW5sZXNzKCRpc191cGRhdGUpIHsKLQlkaWUgIlNvcnJ5LCB1c2VyIGAka2V5JyBhbHJlYWR5IGV4aXN0cyFcbiIgaWYgJERCeyRrZXl9OwotICAgIH0KLSAgICAkZ3JvdXBzID0gJycgaWYgJGdyb3VwcyBlcSAnLSc7Ci0gICAgJGNvbW1lbnQgPSAnJyBpZiAkY29tbWVudCBlcSAnLSc7Ci0gICAgJGdyb3VwcyAuPSAiOiIgLiAkY29tbWVudCBpZiAkY29tbWVudDsKLSAgICAkY3J5cHRlZF9wd2QgLj0gIjoiIC4gJGdyb3VwcyBpZiAkZ3JvdXBzOwotICAgICREQnska2V5fSA9ICRjcnlwdGVkX3B3ZDsKLSAgICBteSAkYWN0aW9uID0gJGlzX3VwZGF0ZSA/ICJ1cGRhdGVkIiA6ICJhZGRlZCI7Ci0gICAgcHJpbnQgIlVzZXIgJGtleSAkYWN0aW9uIHdpdGggcGFzc3dvcmQgZW5jcnlwdGVkIHRvICREQnska2V5fSB1c2luZyAkY3J5cHRfbWV0aG9kXG4iOwotfQotCi1zdWIgZGJtYzo6YWRkdXNlciB7Ci0gICAgbXkgJHZhbHVlID0gZ2V0cGFzcyAiTmV3IHBhc3N3b3JkOiI7Ci0gICAgZGllICJUaGV5IGRvbid0IG1hdGNoLCBzb3JyeS5cbiIgdW5sZXNzIGdldHBhc3MoIlJlLXR5cGUgbmV3IHBhc3N3b3JkOiIpIGVxICR2YWx1ZTsKLSAgICAkY3J5cHRlZF9wd2QgPSBjcnlwdHB3ICR2YWx1ZTsKLSAgICBkYm1jLT5hZGQ7Ci19Ci0KLXN1YiBkYm1jOjpkZWxldGUgewotICAgIGRpZSAiU29ycnksIHVzZXIgYCRrZXknIGRvZXNuJ3QgZXhpc3QhXG4iIHVubGVzcyAkREJ7JGtleX07Ci0gICAgZGVsZXRlICREQnska2V5fSwgcHJpbnQgImAka2V5JyBkZWxldGVkXG4iOwotfQotCi1zdWIgZGJtYzo6dmlldyB7Ci0gICAgcHJpbnQgJGtleSA/ICIka2V5OiREQnska2V5fVxuIiA6IG1hcCB7ICIkXzokREJ7JF99XG4iIGlmICREQnskX30gfSBrZXlzICVEQjsKLX0KLQotc3ViIGRibWM6OmNoZWNrIHsKLSAgICBkaWUgIlNvcnJ5LCB1c2VyIGAka2V5JyBkb2Vzbid0IGV4aXN0IVxuIiB1bmxlc3MgJERCeyRrZXl9OwotICAgIG15ICRjaGtwYXNzID0gKHNwbGl0IC86LywgJERCeyRrZXl9LCAzKVswXTsKLSAgICBteSAkdGVzdHBhc3MgPSBnZXRwYXNzKCk7Ci0gICAgaWYgKHN1YnN0cigkY2hrcGFzcywgMCwgNikgZXEgJyRhcHIxJCcpIHsKLSAgICAgICAgbmVlZF9tZDVfY3J5cHQ7Ci0gICAgICAgICRjcnlwdF9tZXRob2QgPSAibWQ1IjsKLSAgICB9IGVsc2lmIChzdWJzdHIoJGNoa3Bhc3MsIDAsIDUpIGVxICd7U0hBfScpIHsKLSAgICAgICAgbmVlZF9zaGExX2NyeXB0OwotICAgICAgICAkY3J5cHRfbWV0aG9kID0gInNoYTEiOwotICAgIH0gZWxzaWYgKGxlbmd0aCgkY2hrcGFzcykgPT0gMTMgJiYgJGNoa3Bhc3MgbmUgJHRlc3RwYXNzKSB7Ci0gICAgICAgICRjcnlwdF9tZXRob2QgPSAiY3J5cHQiOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICRjcnlwdF9tZXRob2QgPSAicGxhaW4iOwotICAgIH0KLSAgICBwcmludCAkY3J5cHRfbWV0aG9kIC4gKGNyeXB0cHcoJHRlc3RwYXNzLCAkY2hrcGFzcykgZXEgJGNoa3Bhc3MgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA/ICIgcGFzc3dvcmQgb2tcbiIgOiAiIHBhc3N3b3JkIG1pc21hdGNoXG4iKTsKLX0KLQotc3ViIGRibWM6OmltcG9ydCB7Ci0gICAgd2hpbGUoZGVmaW5lZCgkXyA9IDxTVERJTj4pIGFuZCBjaG9tcCkgewotCSgka2V5LCRjcnlwdGVkX3B3ZCwkZ3JvdXBzLCRjb21tZW50KSA9IHNwbGl0IC86LywgJF8sIDQ7Ci0JZGJtYy0+YWRkOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9lbnZ2YXJzLXN0ZC5pbiBiL3N1cHBvcnQvZW52dmFycy1zdGQuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YTg2MDYuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9lbnZ2YXJzLXN0ZC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMgZW52dmFycy1zdGQgLSBkZWZhdWx0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgYXBhY2hlY3RsCi0jCi0jIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgZnJvbSBlbnZ2YXJzLXN0ZC5pbgotIwotIyB0aGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhdXRvbWF0aWNhbGx5IHVuY29tbWVudGVkIGZvcgotIyBiaW5hcnkgYnVpbGRzCi0jYmluYnVpbGQgQFNITElCUEFUSF9WQVJAPSdAcHJlZml4QC9saWIvOiRAU0hMSUJQQVRIX1ZBUkAnCi0jYmluYnVpbGQgZXhwb3J0IEBTSExJQlBBVEhfVkFSQAotIwotQE9TX1NQRUNJRklDX1ZBUlNACmRpZmYgLS1naXQgYS9zdXBwb3J0L2h0ZGJtLmMgYi9zdXBwb3J0L2h0ZGJtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YTJmNDcuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9odGRibS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjI3ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCi0gKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAotICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqLwotCi0vKgotICogaHRkYm0uYzogc2ltcGxlIHByb2dyYW0gZm9yIG1hbmlwdWxhdGluZyBEQk0KLSAqIHBhc3N3b3JkIGRhdGFiYXNlcyBmb3IgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICoKLSAqIENvbnRyaWJ1dGVkIGJ5IE1sYWRlbiBUdXJrIDxtdHVya0BtYXBwaW5nc29mdC5jb20+Ci0gKiAxMiBPY3QgMjAwMQotICovCi0KLSNpbmNsdWRlICJhcHIuaCIKLSNpbmNsdWRlICJhcHJfbGliLmgiCi0jaW5jbHVkZSAiYXByX3N0cmluZ3MuaCIKLSNpbmNsdWRlICJhcHJfZmlsZV9pby5oIgotI2luY2x1ZGUgImFwcl9maWxlX2luZm8uaCIKLSNpbmNsdWRlICJhcHJfcG9vbHMuaCIKLSNpbmNsdWRlICJhcHJfc2lnbmFsLmgiCi0jaW5jbHVkZSAiYXByX21kNS5oIgotI2luY2x1ZGUgImFwcl9zaGExLmgiCi0jaW5jbHVkZSAiYXByX2RibS5oIgotCi0jaWYgQVBSX0hBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmIEFQUl9IQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLSNpZiBBUFJfSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLQotI2lmIEFQUl9DSEFSU0VUX0VCQ0RJQwotI2luY2x1ZGUgImFwcl94bGF0ZS5oIgotI2VuZGlmIC8qQVBSX0NIQVJTRVRfRUJDRElDKi8KLQotI2lmIEFQUl9IQVZFX0NSWVBUX0gKLSNpbmNsdWRlIDxjcnlwdC5oPgotI2VuZGlmCi0KLQotI2lmICFBUFJfQ0hBUlNFVF9FQkNESUMKLSNkZWZpbmUgTEYgMTAKLSNkZWZpbmUgQ1IgMTMKLSNlbHNlIC8qQVBSX0NIQVJTRVRfRUJDRElDKi8KLSNkZWZpbmUgTEYgJ1xuJwotI2RlZmluZSBDUiAnXHInCi0jZW5kaWYgLypBUFJfQ0hBUlNFVF9FQkNESUMqLwotCi0jZGVmaW5lIE1BWF9TVFJJTkdfTEVOIDI1NgotI2RlZmluZSBBTEdfUExBSU4gMAotI2RlZmluZSBBTEdfQVBNRDUgMQotI2RlZmluZSBBTEdfQVBTSEEgMgotIAotI2lmIEFQUl9IQVZFX0NSWVBUX0gKLSNkZWZpbmUgQUxHX0NSWVBUIDMKLSNlbmRpZgotCi0KLSNkZWZpbmUgRVJSX0ZJTEVQRVJNICAgIDEKLSNkZWZpbmUgRVJSX1NZTlRBWCAgICAgIDIKLSNkZWZpbmUgRVJSX1BXTUlTTUFUQ0ggIDMKLSNkZWZpbmUgRVJSX0lOVEVSUlVQVEVEIDQKLSNkZWZpbmUgRVJSX09WRVJGTE9XICAgIDUKLSNkZWZpbmUgRVJSX0JBRFVTRVIgICAgIDYKLSNkZWZpbmUgRVJSX0VNUFRZICAgICAgIDcKLQotCi10eXBlZGVmIHN0cnVjdCBhcHVfaHRkYm1fdCBhcHVfaHRkYm1fdDsKLQotc3RydWN0IGFwdV9odGRibV90IHsKLSAgICBhcHJfZGJtX3QgICAgICAgICAgICAgICAqZGJtOwotICAgIGFwcl9wb29sX3QgICAgICAgICAgICAgICpwb29sOwotI2lmIEFQUl9DSEFSU0VUX0VCQ0RJQwotICAgIGFwcl94bGF0ZV90ICAgICAgICAgICAgICp0b19hc2NpaTsKLSNlbmRpZgotICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICpmaWxlbmFtZTsKLSAgICBjaGFyICAgICAgICAgICAgICAgICAgICAqdXNlcm5hbWU7Ci0gICAgY2hhciAgICAgICAgICAgICAgICAgICAgKnVzZXJwYXNzOwotICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICpjb21tZW50OwotICAgIGludCAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICByZG9ubHk7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgYWxnOwotfTsKLQotCi0jZGVmaW5lIEFQVV9IVERCTV9ERUNMQVJFKHgpIHN0YXRpYyB4Ci0jZGVmaW5lIEFQVV9IVERCTV9TVEFOREFMT05FIDEKLQotI2RlZmluZSBBUFVfSFREQk1fTUFLRSAgIDAKLSNkZWZpbmUgQVBVX0hUREJNX0RFTEVURSAxCi0jZGVmaW5lIEFQVV9IVERCTV9WRVJJRlkgMgotI2RlZmluZSBBUFVfSFREQk1fTElTVCAgIDMKLSNkZWZpbmUgQVBVX0hUREJNX05PRklMRSA0Ci0jZGVmaW5lIEFQVV9IVERCTV9TVERJTiAgNQotCi1BUFVfSFREQk1fREVDTEFSRSh2b2lkKSBhcHVfaHRkYm1fdGVybWluYXRlKGFwdV9odGRibV90ICpodGRibSkgCi17Ci0gICAgCi0gICAgaWYgKGh0ZGJtLT5kYm0pCi0gICAgICAgIGFwcl9kYm1fY2xvc2UoaHRkYm0tPmRibSk7Ci0gICAgaHRkYm0tPmRibSA9IE5VTEw7Ci19Ci0KLSNpZiBBUFVfSFREQk1fU1RBTkRBTE9ORQotCi1zdGF0aWMgYXB1X2h0ZGJtX3QgKmg7Ci0gIAotQVBVX0hUREJNX0RFQ0xBUkUodm9pZCkgYXB1X2h0ZGJtX2ludGVycnVwdGVkKHZvaWQpIAotewotICAgIGFwdV9odGRibV90ZXJtaW5hdGUoaCk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJodGRibSBJbnRlcnJ1cHRlZCAhXG4iKTsKLSAgICBleGl0KEVSUl9JTlRFUlJVUFRFRCk7Ci19Ci0jZW5kaWYKLQotQVBVX0hUREJNX0RFQ0xBUkUoYXByX3N0YXR1c190KSBhcHVfaHRkYm1faW5pdChhcHJfcG9vbF90ICoqcG9vbCwgYXB1X2h0ZGJtX3QgKipoZGJtKSAKLXsKLQotI2lmIEFQUl9DSEFSU0VUX0VCQ0RJQwotICAgIGFwcl9zdGF0dXNfdCBydjsKLSNlbmRpZgotCi0jaWYgQVBVX0hUREJNX1NUQU5EQUxPTkUgICAgCi0gICAgYXByX2luaXRpYWxpemUoKTsKLSAgICBhdGV4aXQoYXByX3Rlcm1pbmF0ZSk7Ci0gICAgYXByX3Bvb2xfY3JlYXRlKCBwb29sLCBOVUxMKTsKLSAgICBhcHJfc2lnbmFsKFNJR0lOVCwgKHZvaWQgKCopKGludCkpIGFwdV9odGRibV9pbnRlcnJ1cHRlZCk7Ci0KLSNlbmRpZgotCi0gICAgKCpoZGJtKSA9IChhcHVfaHRkYm1fdCAqKWFwcl9wY2FsbG9jKCpwb29sLCBzaXplb2YoYXB1X2h0ZGJtX3QpKTsKLSAgICAoKmhkYm0pLT5wb29sID0gKnBvb2w7Ci0KLSNpZiBBUFJfQ0hBUlNFVF9FQkNESUMKLSAgICBydiA9IGFwcl94bGF0ZV9vcGVuKHRvX2FzY2lpLCAiSVNPODg1OS0xIiwgQVBSX0RFRkFVTFRfQ0hBUlNFVCwgKCpoZGJtKS0+cG9vbCk7Ci0gICAgaWYgKHJ2KSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiYXByX3hsYXRlX29wZW4odG8gQVNDSUkpLT4lZFxuIiwgcnYpOwotICAgICAgICByZXR1cm4gQVBSX0VHRU5FUkFMOwotICAgIH0KLSAgICBydiA9IGFwcl9TSEExSW5pdEVCQ0RJQygoKmhkYm0pLT50b19hc2NpaSk7Ci0gICAgaWYgKHJ2KSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiYXByX1NIQTFJbml0RUJDRElDKCktPiVkXG4iLCBydik7Ci0gICAgICAgIHJldHVybiBBUFJfRUdFTkVSQUw7Ci0gICAgfQotICAgIHJ2ID0gYXByX01ENUluaXRFQkNESUMoKCpoZGJtKS0+dG9fYXNjaWkpOwotICAgIGlmIChydikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImFwcl9NRDVJbml0RUJDRElDKCktPiVkXG4iLCBydik7Ci0gICAgICAgIHJldHVybiBBUFJfRUdFTkVSQUw7Ci0gICAgfQotI2VuZGlmIC8qQVBSX0NIQVJTRVRfRUJDRElDKi8KLQotICAgIC8qIFNldCBNRDUgYXMgZGVmYXVsdCAqLwotICAgICgqaGRibSktPmFsZyA9IEFMR19BUE1ENTsKLSAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci19Ci0KLUFQVV9IVERCTV9ERUNMQVJFKGFwcl9zdGF0dXNfdCkgYXB1X2h0ZGJtX29wZW4oYXB1X2h0ZGJtX3QgKmh0ZGJtKSAKLXsKLSAgICBpZiAoaHRkYm0tPmNyZWF0ZSkKLSAgICAgICAgcmV0dXJuIGFwcl9kYm1fb3BlbigmaHRkYm0tPmRibSwgaHRkYm0tPmZpbGVuYW1lLCBBUFJfREJNX1JXQ1JFQVRFLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUFJfT1NfREVGQVVMVCwgaHRkYm0tPnBvb2wpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGFwcl9kYm1fb3BlbigmaHRkYm0tPmRibSwgaHRkYm0tPmZpbGVuYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBodGRibS0+cmRvbmx5ID8gQVBSX0RCTV9SRUFET05MWSA6IEFQUl9EQk1fUkVBRFdSSVRFLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUFJfT1NfREVGQVVMVCwgaHRkYm0tPnBvb2wpOwotfQotCi1BUFVfSFREQk1fREVDTEFSRShjaGFyICopIGFwX2dldHdvcmQoYXByX3Bvb2xfdCAqYXRyYW5zLCBjaGFyICoqbGluZSwgY2hhciBzdG9wKQotewotICAgIGNoYXIgKnBvcyA9IHN0cnJjaHIoKmxpbmUsIHN0b3ApOwotICAgIGNoYXIgKnJlczsKLQotICAgIGlmICghcG9zKSB7Ci0gICAgICAgIHJlcyA9IGFwcl9wc3RyZHVwKGF0cmFucywgKmxpbmUpOwotICAgICAgICAqbGluZSArPSBzdHJsZW4oKmxpbmUpOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIHJlcyA9IGFwcl9wc3RybmR1cChhdHJhbnMsICpsaW5lLCBwb3MgLSAqbGluZSk7Ci0KLSAgICB3aGlsZSAoKnBvcyA9PSBzdG9wKQotICAgICAgICArK3BvczsKLSAgICAqbGluZSA9IHBvczsKLSAgICByZXR1cm4gcmVzOwotfQotCi1BUFVfSFREQk1fREVDTEFSRShhcHJfc3RhdHVzX3QpIGFwdV9odGRibV9zYXZlKGFwdV9odGRibV90ICpodGRibSwgaW50ICpjaGFuZ2VkKSAKLXsKLSAgICBhcHJfZGF0dW1fdCBrZXksIHZhbDsKLQotICAgIGlmICghaHRkYm0tPnVzZXJuYW1lKQotICAgICAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci0KLSAgICBrZXkuZHB0ciA9IGh0ZGJtLT51c2VybmFtZTsKLSAgICBrZXkuZHNpemUgPSBzdHJsZW4oaHRkYm0tPnVzZXJuYW1lKTsKLSAgICBpZiAoYXByX2RibV9leGlzdHMoaHRkYm0tPmRibSwga2V5KSkKLSAgICAgICAgKmNoYW5nZWQgPSAxOwotCi0gICAgdmFsLmRzaXplID0gc3RybGVuKGh0ZGJtLT51c2VycGFzcyk7Ci0gICAgaWYgKCFodGRibS0+Y29tbWVudCkKLSAgICAgICAgdmFsLmRwdHIgID0gaHRkYm0tPnVzZXJwYXNzOwotICAgIGVsc2UgewotICAgICAgICB2YWwuZHB0ciA9IGFwcl9wc3RyY2F0KGh0ZGJtLT5wb29sLCBodGRibS0+dXNlcnBhc3MsICI7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodGRibS0+Y29tbWVudCwgTlVMTCk7Ci0gICAgICAgIHZhbC5kc2l6ZSArPSAoc3RybGVuKGh0ZGJtLT5jb21tZW50KSArIDEpOwotICAgIH0KLSAgICByZXR1cm4gYXByX2RibV9zdG9yZShodGRibS0+ZGJtLCBrZXksIHZhbCk7Ci19Ci0KLUFQVV9IVERCTV9ERUNMQVJFKGFwcl9zdGF0dXNfdCkgYXB1X2h0ZGJtX2RlbChhcHVfaHRkYm1fdCAqaHRkYm0pIAotewotICAgIGFwcl9kYXR1bV90IGtleTsKLQotICAgIGtleS5kcHRyID0gaHRkYm0tPnVzZXJuYW1lOwotICAgIGtleS5kc2l6ZSA9IHN0cmxlbihodGRibS0+dXNlcm5hbWUpOwotICAgIGlmICghYXByX2RibV9leGlzdHMoaHRkYm0tPmRibSwga2V5KSkKLSAgICAgICAgcmV0dXJuIEFQUl9FTk9FTlQ7Ci0KLSAgICByZXR1cm4gYXByX2RibV9kZWxldGUoaHRkYm0tPmRibSwga2V5KTsKLX0KLQotQVBVX0hUREJNX0RFQ0xBUkUoYXByX3N0YXR1c190KSBhcHVfaHRkYm1fdmVyaWZ5KGFwdV9odGRibV90ICpodGRibSkgCi17Ci0gICAgYXByX2RhdHVtX3Qga2V5LCB2YWw7Ci0gICAgY2hhciBwd2RbTUFYX1NUUklOR19MRU5dID0gezB9OwotICAgIGNoYXIgKnJlYywgKmNtbnQ7Ci0KLSAgICBrZXkuZHB0ciA9IGh0ZGJtLT51c2VybmFtZTsKLSAgICBrZXkuZHNpemUgPSBzdHJsZW4oaHRkYm0tPnVzZXJuYW1lKTsKLSAgICBpZiAoIWFwcl9kYm1fZXhpc3RzKGh0ZGJtLT5kYm0sIGtleSkpCi0gICAgICAgIHJldHVybiBBUFJfRU5PRU5UOyAgICAKLSAgICBpZiAoYXByX2RibV9mZXRjaChodGRibS0+ZGJtLCBrZXksICZ2YWwpICE9IEFQUl9TVUNDRVNTKQotICAgICAgICByZXR1cm4gQVBSX0VOT0VOVDsKLSAgICByZWMgPSBhcHJfcHN0cm5kdXAoaHRkYm0tPnBvb2wsIHZhbC5kcHRyLCB2YWwuZHNpemUpOwotICAgIGNtbnQgPSBzdHJjaHIocmVjLCAnOycpOwotICAgIGlmIChjbW50KQotICAgICAgICBzdHJuY3B5KHB3ZCwgcmVjLCBjbW50IC0gcmVjKTsKLSAgICBlbHNlCi0gICAgICAgIHN0cmNweShwd2QsIHJlYyk7Ci0gICAgcmV0dXJuIGFwcl9wYXNzd29yZF92YWxpZGF0ZShodGRibS0+dXNlcnBhc3MsIHB3ZCk7Ci19Ci0KLUFQVV9IVERCTV9ERUNMQVJFKGFwcl9zdGF0dXNfdCkgYXB1X2h0ZGJtX2xpc3QoYXB1X2h0ZGJtX3QgKmh0ZGJtKSAKLXsKLSAgICBhcHJfc3RhdHVzX3QgcnY7Ci0gICAgYXByX2RhdHVtX3Qga2V5LCB2YWw7Ci0gICAgY2hhciAqcmVjLCAqY21udDsKLSAgICBjaGFyIGtiW01BWF9TVFJJTkdfTEVOXTsKLSAgICBpbnQgaSA9IDA7Ci0KLSAgICBydiA9IGFwcl9kYm1fZmlyc3RrZXkoaHRkYm0tPmRibSwgJmtleSk7Ci0gICAgaWYgKHJ2ICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRW1wdHkgZGF0YWJhc2UgLS0gJXNcbiIsIGh0ZGJtLT5maWxlbmFtZSk7IAotICAgICAgICByZXR1cm4gQVBSX0VOT0VOVDsKLSAgICB9Ci0gICAgcmVjID0gYXByX3BjYWxsb2MoaHRkYm0tPnBvb2wsIEhVR0VfU1RSSU5HX0xFTik7Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwgIkR1bXBpbmcgcmVjb3JkcyBmcm9tIGRhdGFiYXNlIC0tICVzXG4iLCBodGRibS0+ZmlsZW5hbWUpOyAKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAlLTMyc0NvbW1lbnRcbiIsICJVc2VybmFtZSIpOyAgICAKLSAgICB3aGlsZSAoa2V5LmRwdHIgIT0gTlVMTCkgewotICAgICAgICBydiA9IGFwcl9kYm1fZmV0Y2goaHRkYm0tPmRibSwga2V5LCAmdmFsKTsKLSAgICAgICAgaWYgKHJ2ICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCBnZXR0aW5nIGRhdGEgZnJvbSAlc1xuIiwgaHRkYm0tPmZpbGVuYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBBUFJfRUdFTkVSQUw7Ci0gICAgICAgIH0KLSAgICAgICAgc3RybmNweShrYiwga2V5LmRwdHIsIGtleS5kc2l6ZSk7Ci0gICAgICAgIGtiW2tleS5kc2l6ZV0gPSAnXDAnOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAlLTMycyIsIGtiKTsKLSAgICAgICAgc3RybmNweShyZWMsIHZhbC5kcHRyLCB2YWwuZHNpemUpOwotICAgICAgICByZWNbdmFsLmRzaXplXSA9ICdcMCc7Ci0gICAgICAgIGNtbnQgPSBzdHJjaHIocmVjLCAnOycpOwotICAgICAgICBpZiAoY21udCkKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBjbW50ICsgMSk7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSAgICAgICAgcnYgPSBhcHJfZGJtX25leHRrZXkoaHRkYm0tPmRibSwgJmtleSk7Ci0gICAgICAgIGlmIChydiAhPSBBUFJfU1VDQ0VTUykKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIGdldHRpbmcgTmV4dEtleVxuIik7Ci0gICAgICAgICsraTsKLSAgICB9Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwgIlRvdGFsICNyZWNvcmRzIDogJWRcbiIsIGkpOwotICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHZvaWQgdG82NChjaGFyICpzLCB1bnNpZ25lZCBsb25nIHYsIGludCBuKQotewotICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGl0b2E2NFtdID0gICAgICAgICAvKiAwIC4uLiA2MyA9PiBBU0NJSSAtIDY0ICovCi0gICAgIi4vMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOwotCi0gICAgd2hpbGUgKC0tbiA+PSAwKSB7Ci0gICAgICAgICpzKysgPSBpdG9hNjRbdiYweDNmXTsKLSAgICAgICAgdiA+Pj0gNjsKLSAgICB9Ci19Ci0KLUFQVV9IVERCTV9ERUNMQVJFKGFwcl9zdGF0dXNfdCkgYXB1X2h0ZGJtX21ha2UoYXB1X2h0ZGJtX3QgKmh0ZGJtKSAKLXsKLSAgICBjaGFyIGNwd1tNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciBzYWx0WzldOwotCi0gICAgc3dpdGNoIChodGRibS0+YWxnKSB7Ci0gICAgICAgIGNhc2UgQUxHX0FQU0hBOgotICAgICAgICAgICAgLyogWFhYIGNwdyA+PSAyOCArIHN0cmxlbihzaGExKSBjaGFycyAtIGZpeGVkIGxlbiBTSEEgKi8KLSAgICAgICAgICAgIGFwcl9zaGExX2Jhc2U2NChodGRibS0+dXNlcnBhc3Msc3RybGVuKGh0ZGJtLT51c2VycGFzcyksY3B3KTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBBTEdfQVBNRDU6IAotICAgICAgICAgICAgKHZvaWQpIHNyYW5kKChpbnQpIHRpbWUoKHRpbWVfdCAqKSBOVUxMKSk7Ci0gICAgICAgICAgICB0bzY0KCZzYWx0WzBdLCByYW5kKCksIDgpOwotICAgICAgICAgICAgc2FsdFs4XSA9ICdcMCc7Ci0gICAgICAgICAgICBhcHJfbWQ1X2VuY29kZSgoY29uc3QgY2hhciAqKWh0ZGJtLT51c2VycGFzcywgKGNvbnN0IGNoYXIgKilzYWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdywgc2l6ZW9mKGNwdykpOwotICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBTEdfUExBSU46Ci0gICAgICAgICAgICAvKiBYWFggdGhpcyBsZW4gbGltaXRhdGlvbiBpcyBub3QgaW4gc3luYyB3aXRoIGFueSBIVFRQZCBsZW4uICovCi0gICAgICAgICAgICBhcHJfY3B5c3RybihjcHcsaHRkYm0tPnVzZXJwYXNzLHNpemVvZihjcHcpKTsKLSAgICAgICAgYnJlYWs7Ci0jaWYgQVBSX0hBVkVfQ1JZUFRfSAotICAgICAgICBjYXNlIEFMR19DUllQVDoKLSAgICAgICAgICAgICh2b2lkKSBzcmFuZCgoaW50KSB0aW1lKCh0aW1lX3QgKikgTlVMTCkpOwotICAgICAgICAgICAgdG82NCgmc2FsdFswXSwgcmFuZCgpLCA4KTsKLSAgICAgICAgICAgIHNhbHRbOF0gPSAnXDAnOwotICAgICAgICAgICAgYXByX2NweXN0cm4oY3B3LCAoY2hhciAqKWNyeXB0KGh0ZGJtLT51c2VycGFzcywgc2FsdCksIHNpemVvZihjcHcpIC0gMSk7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNSWVBUIGlzIG5vdyBkZXByaWNpYXRlZCwgdXNlIE1ENSBpbnN0ZWFkICFcbiIpOwotI2VuZGlmCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBodGRibS0+dXNlcnBhc3MgPSBhcHJfcHN0cmR1cChodGRibS0+cG9vbCwgY3B3KTsKLSAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci19Ci0KLUFQVV9IVERCTV9ERUNMQVJFKGFwcl9zdGF0dXNfdCkgYXB1X2h0ZGJtX3ZhbGlkX3VzZXJuYW1lKGFwdV9odGRibV90ICpodGRibSkKLXsKLSAgICBpZiAoIWh0ZGJtLT51c2VybmFtZSB8fCAoc3RybGVuKGh0ZGJtLT51c2VybmFtZSkgPiA2NCkgfHwgKHN0cmxlbihodGRibS0+dXNlcm5hbWUpIDwgMSkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHVzZXJuYW1lIGxlbmd0aFxuIik7Ci0gICAgICAgIHJldHVybiBBUFJfRUlOVkFMOwotICAgIH0KLSAgICBpZiAoc3RyY2hyKGh0ZGJtLT51c2VybmFtZSwgJzonKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzZXJuYW1lIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyc1xuIik7Ci0gICAgICAgIHJldHVybiBBUFJfRUlOVkFMOwotICAgIH0KLSAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyB2b2lkIGh0ZGJtX3VzYWdlKHZvaWQpCi17Ci0KLSNpZiBBUFJfSEFWRV9DUllQVF9ICi0jZGVmaW5lIENSWVBUX09QVElPTiAiZCIKLSNlbHNlCi0jZGVmaW5lIENSWVBUX09QVElPTiAiIgotI2VuZGlmCi0gICAgZnByaW50ZihzdGRlcnIsICJodGRibSAtLSBwcm9ncmFtIGZvciBtYW5pcHVsYXRpbmcgREJNIHBhc3N3b3JkIGRhdGFiYXNlcy5cblxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogaHRkYm0gICAgWy1jbSJDUllQVF9PUFRJT04icHN0dnhdIGRhdGFiYXNlIHVzZXJuYW1lXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICAtYltjbSJDUllQVF9PUFRJT04icHRzdl0gZGF0YWJhc2UgdXNlcm5hbWUgcGFzc3dvcmRcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIC1uW20iQ1JZUFRfT1BUSU9OInBzdF0gICB1c2VybmFtZVxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgLW5iW20iQ1JZUFRfT1BUSU9OInBzdF0gIHVzZXJuYW1lIHBhc3N3b3JkXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICAtdlttIkNSWVBUX09QVElPTiJwc10gICAgZGF0YWJhc2UgdXNlcm5hbWVcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIC12YlttIkNSWVBUX09QVElPTiJwc10gICBkYXRhYmFzZSB1c2VybmFtZSBwYXNzd29yZFxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgLXhbbSJDUllQVF9PUFRJT04icHNdICAgIGRhdGFiYXNlIHVzZXJuYW1lXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICAtbCAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiT3B0aW9uczpcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgLWIgICBVc2UgdGhlIHBhc3N3b3JkIGZyb20gdGhlIGNvbW1hbmQgbGluZSByYXRoZXIiCi0gICAgICAgICAgICAgICAgICAgICJ0aGFuIHByb21wdGluZyBmb3IgaXQuXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgIC1jICAgQ3JlYXRlIGEgbmV3IGRhdGFiYXNlLlxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICAtbiAgIERvbid0IHVwZGF0ZSBkYXRhYmFzZTsgZGlzcGxheSByZXN1bHRzIG9uIHN0ZG91dC5cbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgLW0gICBGb3JjZSBNRDUgZW5jcnlwdGlvbiBvZiB0aGUgcGFzc3dvcmQgKGRlZmF1bHQpLlxuIik7Ci0jaWYgQVBSX0hBVkVfQ1JZUFRfSAotICAgIGZwcmludGYoc3RkZXJyLCAiICAgLWQgICBGb3JjZSBDUllQVCBlbmNyeXB0aW9uIG9mIHRoZSBwYXNzd29yZCAobm93IGRlcHJpY2lhdGVkKS5cbiIpOwotI2VuZGlmCi0gICAgZnByaW50ZihzdGRlcnIsICIgICAtcCAgIERvIG5vdCBlbmNyeXB0IHRoZSBwYXNzd29yZCAocGxhaW50ZXh0KS5cbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgLXMgICBGb3JjZSBTSEEgZW5jcnlwdGlvbiBvZiB0aGUgcGFzc3dvcmQuXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgIC1sICAgRGlzcGxheSB1c2VybmFtZXMgZnJvbSBkYXRhYmFzZSBvbiBzdGRvdXQuXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgIC10ICAgVGhlIGxhc3QgcGFyYW0gaXMgdXNlcm5hbWUgY29tbWVudC5cbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgLXYgICBWZXJpZnkgdGhlIHVzZXJuYW1lL3Bhc3N3b3JkLlxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICAteCAgIFJlbW92ZSB0aGUgdXNlcm5hbWUgcmVjb3JkIGZyb20gZGF0YWJhc2UuXG4iKTsKLSAgICBleGl0KEVSUl9TWU5UQVgpOwotCi19Ci0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkKLXsKLSAgICBhcHJfcG9vbF90ICpwb29sOwotICAgIGFwcl9zdGF0dXNfdCBydjsKLSAgICBhcHJfc2l6ZV90IGw7Ci0gICAgY2hhciBwd2lbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgcHdjW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjaGFyIGVycmJ1ZltNQVhfU1RSSU5HX0xFTl07Ci0gICAgY29uc3QgY2hhciAqYXJnOwotICAgIGludCAgbmVlZF9maWxlID0gMTsKLSAgICBpbnQgIG5lZWRfdXNlciA9IDE7Ci0gICAgaW50ICBuZWVkX3B3ZCAgPSAxOwotICAgIGludCAgbmVlZF9jbW50ID0gMDsKLSAgICBpbnQgIHB3ZF9zdXBwbGllZCA9IDA7Ci0gICAgaW50ICBjaGFuZ2VkOwotICAgIGludCAgY21kID0gQVBVX0hUREJNX01BS0U7Ci0gICAgaW50ICBpOwotICAgIGludCBhcmdzX2xlZnQgPSAyOwotCi0gICAgaWYgKChydiA9IGFwdV9odGRibV9pbml0KCZwb29sLCAmaCkpICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGluaXRpYWxpemUgaHRkYm0gdGVybWluYXRpbmchXG4iKTsKLSAgICAgICAgYXByX3N0cmVycm9yKHJ2LCBlcnJidWYsIHNpemVvZihlcnJidWYpKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBQcmVsaW1pbmFyeSBjaGVjayB0byBtYWtlIHN1cmUgdGhleSBwcm92aWRlZCBhdCBsZWFzdAotICAgICAqIHRocmVlIGFyZ3VtZW50cywgd2UnbGwgZG8gYmV0dGVyIGFyZ3VtZW50IGNoZWNraW5nIGFzIAotICAgICAqIHdlIHBhcnNlIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgICovCi0gICAgaWYgKGFyZ2MgPCAzKQotICAgICAgIGh0ZGJtX3VzYWdlKCk7Ci0gICAgLyoKLSAgICAgKiBHbyB0aHJvdWdoIHRoZSBhcmd1bWVudCBsaXN0IGFuZCBwaWNrIG91dCBhbnkgb3B0aW9ucy4gIFRoZXkKLSAgICAgKiBoYXZlIHRvIHByZWNlZGUgYW55IG90aGVyIGFyZ3VtZW50cy4KLSAgICAgKi8KLSAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7Ci0gICAgICAgIGFyZyA9IGFyZ3ZbaV07Ci0gICAgICAgIGlmICgqYXJnICE9ICctJykKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKCorK2FyZyAhPSAnXDAnKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCphcmcpIHsKLSAgICAgICAgICAgIGNhc2UgJ2InOgotICAgICAgICAgICAgICAgIHB3ZF9zdXBwbGllZCA9IDE7Ci0gICAgICAgICAgICAgICAgbmVlZF9wd2QgPSAwOwotICAgICAgICAgICAgICAgIGFyZ3NfbGVmdCsrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnYyc6Ci0gICAgICAgICAgICAgICAgaC0+Y3JlYXRlID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ24nOgotICAgICAgICAgICAgICAgIG5lZWRfZmlsZSA9IDA7Ci0gICAgICAgICAgICAgICAgY21kID0gQVBVX0hUREJNX05PRklMRTsKLSAgICAgICAgICAgICAgICBhcmdzX2xlZnQtLTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ2wnOgotICAgICAgICAgICAgICAgIG5lZWRfcHdkID0gMDsKLSAgICAgICAgICAgICAgICBuZWVkX3VzZXIgPSAwOwotICAgICAgICAgICAgICAgIGNtZCA9IEFQVV9IVERCTV9MSVNUOwotICAgICAgICAgICAgICAgIGgtPnJkb25seSA9IDE7Ci0gICAgICAgICAgICAgICAgYXJnc19sZWZ0LS07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICd0JzoKLSAgICAgICAgICAgICAgICBuZWVkX2NtbnQgPSAxOwotICAgICAgICAgICAgICAgIGFyZ3NfbGVmdCsrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAndic6Ci0gICAgICAgICAgICAgICAgaC0+cmRvbmx5ID0gMTsKLSAgICAgICAgICAgICAgICBjbWQgPSBBUFVfSFREQk1fVkVSSUZZOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAneCc6Ci0gICAgICAgICAgICAgICAgbmVlZF9wd2QgPSAwOwotICAgICAgICAgICAgICAgIGNtZCA9IEFQVV9IVERCTV9ERUxFVEU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdtJzoKLSAgICAgICAgICAgICAgICBoLT5hbGcgPSBBTEdfQVBNRDU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdwJzoKLSAgICAgICAgICAgICAgICBoLT5hbGcgPSBBTEdfUExBSU47Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdzJzoKLSAgICAgICAgICAgICAgICBoLT5hbGcgPSBBTEdfQVBTSEE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0jaWYgQVBSX0hBVkVfQ1JZUFRfSAotICAgICAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICAgICAgaC0+YWxnID0gQUxHX0NSWVBUOwotICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGh0ZGJtX3VzYWdlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoKLSAgICAgKiBNYWtlIHN1cmUgd2Ugc3RpbGwgaGF2ZSBleGFjdGx5IHRoZSByaWdodCBudW1iZXIgb2YgYXJndW1lbnRzIGxlZnQKLSAgICAgKiAodGhlIGZpbGVuYW1lLCB0aGUgdXNlcm5hbWUsIGFuZCBwb3NzaWJseSB0aGUgcGFzc3dvcmQgaWYgLWIgd2FzCi0gICAgICogc3BlY2lmaWVkKS4KLSAgICAgKi8KLSAgICBpZiAoKGFyZ2MgLSBpKSAhPSBhcmdzX2xlZnQpCi0gICAgICAgIGh0ZGJtX3VzYWdlKCk7Ci0KLSAgICBpZiAoIW5lZWRfZmlsZSkKLSAgICAgICAgaS0tOwotICAgIGVsc2UgewotICAgICAgICBoLT5maWxlbmFtZSA9IGFwcl9wc3RyZHVwKGgtPnBvb2wsIGFyZ3ZbaV0pOwotICAgICAgICBpZiAoKHJ2ID0gYXB1X2h0ZGJtX29wZW4oaCkpICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIG9wcGVuaW5nIGRhdGFiYXNlICVzXG4iLCBhcmd2W2ldKTsKLSAgICAgICAgICAgIGFwcl9zdHJlcnJvcihydiwgZXJyYnVmLCBzaXplb2YoZXJyYnVmKSk7Ci0gICAgICAgICAgICBleGl0KEVSUl9GSUxFUEVSTSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG5lZWRfdXNlcikgewotICAgICAgICBoLT51c2VybmFtZSA9IGFwcl9wc3RyZHVwKHBvb2wsIGFyZ3ZbaSsxXSk7Ci0gICAgICAgIGlmIChhcHVfaHRkYm1fdmFsaWRfdXNlcm5hbWUoaCkgIT0gQVBSX1NVQ0NFU1MpCi0gICAgICAgICAgICBleGl0KEVSUl9CQURVU0VSKTsKLSAgICB9Ci0gICAgaWYgKHB3ZF9zdXBwbGllZCkKLSAgICAgICAgaC0+dXNlcnBhc3MgPSBhcHJfcHN0cmR1cChwb29sLCBhcmd2W2krMl0pOwotCi0gICAgaWYgKG5lZWRfcHdkKSB7Ci0gICAgICAgIGwgPSBzaXplb2YocHdjKTsKLSAgICAgICAgaWYgKGFwcl9wYXNzd29yZF9nZXQoIkVudGVyIHBhc3N3b3JkICAgICAgICA6ICIsIHB3aSwgJmwpICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBhc3N3b3JkIHRvbyBsb25nXG4iKTsKLSAgICAgICAgICAgIGV4aXQoRVJSX09WRVJGTE9XKTsKLSAgICAgICAgfQotICAgICAgICBsID0gc2l6ZW9mKHB3Yyk7Ci0gICAgICAgIGlmIChhcHJfcGFzc3dvcmRfZ2V0KCJSZS10eXBlIHBhc3N3b3JkICAgICAgOiAiLCBwd2MsICZsKSAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJQYXNzd29yZCB0b28gbG9uZ1xuIik7Ci0gICAgICAgICAgICBleGl0KEVSUl9PVkVSRkxPVyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0cmNtcChwd2ksIHB3YykgIT0gMCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJQYXNzd29yZCB2ZXJpZmljYXRpb24gZXJyb3JcbiIpOwotICAgICAgICAgICAgZXhpdChFUlJfUFdNSVNNQVRDSCk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICBoLT51c2VycGFzcyA9IGFwcl9wc3RyZHVwKHBvb2wsICBwd2kpOwotICAgIH0KLSAgICBpZiAobmVlZF9jbW50ICYmIHB3ZF9zdXBwbGllZCkKLSAgICAgICAgaC0+Y29tbWVudCA9IGFwcl9wc3RyZHVwKHBvb2wsIGFyZ3ZbaSszXSk7Ci0gICAgZWxzZSBpZiAobmVlZF9jbW50KQotICAgICAgICBoLT5jb21tZW50ID0gYXByX3BzdHJkdXAocG9vbCwgYXJndltpKzJdKTsKLQotICAgIHN3aXRjaCAoY21kKSB7Ci0gICAgICAgIGNhc2UgQVBVX0hUREJNX1ZFUklGWToKLSAgICAgICAgICAgIGlmICgocnYgPSBhcHVfaHRkYm1fdmVyaWZ5KGgpKSAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgIGlmKHJ2ID09IEFQUl9FTk9FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJUaGUgdXNlciAnJXMnIGNvbGQgbm90IGJlIGZvdW5kIGluIGRhdGFiYXNlXG4iLCBoLT51c2VybmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGV4aXQoRVJSX0JBRFVTRVIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJQYXNzd29yZCBtaXNtYXRjaCBmb3IgdXNlciAnJXMnXG4iLCBoLT51c2VybmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGV4aXQoRVJSX1BXTUlTTUFUQ0gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBhc3N3b3JkIHZhbGlkYXRlZCBmb3IgdXNlciAnJXMnXG4iLCBoLT51c2VybmFtZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBUFVfSFREQk1fREVMRVRFOgotICAgICAgICAgICAgaWYgKGFwdV9odGRibV9kZWwoaCkgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBmaW5kIHVzZXIgJyVzJyBpbiBkYXRhYmFzZVxuIiwgaC0+dXNlcm5hbWUpOwotICAgICAgICAgICAgICAgIGV4aXQoRVJSX0JBRFVTRVIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaC0+dXNlcm5hbWUgPSBOVUxMOwotICAgICAgICAgICAgY2hhbmdlZCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBUFVfSFREQk1fTElTVDoKLSAgICAgICAgICAgIGFwdV9odGRibV9saXN0KGgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBhcHVfaHRkYm1fbWFrZShoKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgfSAgICAKLSAgICBpZiAobmVlZF9maWxlICYmICFoLT5yZG9ubHkpIHsKLSAgICAgICAgaWYgKChydiA9IGFwdV9odGRibV9zYXZlKGgsICZjaGFuZ2VkKSkgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIGFwcl9zdHJlcnJvcihydiwgZXJyYnVmLCBzaXplb2YoZXJyYnVmKSk7Ci0gICAgICAgICAgICBleGl0KEVSUl9GSUxFUEVSTSk7Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50ZihzdGRvdXQsICJEYXRhYmFzZSAlcyAlcy5cbiIsIGgtPmZpbGVuYW1lLCAKLSAgICAgICAgICAgICAgICBoLT5jcmVhdGUgPyAiY3JlYXRlZCIgOiAoY2hhbmdlZCA/ICJtb2RpZmllZCIgOiAidXBkYXRlZCIpKTsKLSAgICB9Ci0gICAgaWYgKGNtZCA9PSBBUFVfSFREQk1fTk9GSUxFKQotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiVzXG4iLCBoLT51c2VybmFtZSwgaC0+dXNlcnBhc3MpOwotICAgIGFwdV9odGRibV90ZXJtaW5hdGUoaCk7Ci0gICAgYXByX3Rlcm1pbmF0ZSgpOwotICAgIAotICAgIHJldHVybiAwOyAvKiBTdXByZXNzIGNvbXBpbGVyIHdhcm5pbmcuICovCi19CmRpZmYgLS1naXQgYS9zdXBwb3J0L2h0ZGJtLmRzcCBiL3N1cHBvcnQvaHRkYm0uZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTNjNTJmLi4wMDAwMDAwCi0tLSBhL3N1cHBvcnQvaHRkYm0uZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iaHRkYm0iIC0gUGFja2FnZSBPd25lcj08ND4KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDAKLSMgKiogRE8gTk9UIEVESVQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzCi0KLUNGRz1odGRibSAtIFdpbjMyIERlYnVnCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgImh0ZGJtLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiaHRkYm0ubWFrIiBDRkc9Imh0ZGJtIC0gV2luMzIgRGVidWciCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAiaHRkYm0gLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgImh0ZGJtIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAiaHRkYm0gLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9EICJBUFJfREVDTEFSRV9TVEFUSUMiIC9EICJBUFVfREVDTEFSRV9TVEFUSUMiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0kgIi4uL3NyY2xpYi9hcHIvaW5jbHVkZSIgL0kgIi4uL3NyY2xpYi9hcHItdXRpbC9pbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfQ09OU09MRSIgL0QgIkFQUl9ERUNMQVJFX1NUQVRJQyIgL0QgIkFQVV9ERUNMQVJFX1NUQVRJQyIgL0ZkIlJlbGVhc2UvaHRkYm0iIC9GRCAvYwotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgYWR2YXBpMzIubGliIHdzb2NrMzIubGliIHdzMl8zMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hcCAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIGFkdmFwaTMyLmxpYiB3c29jazMyLmxpYiB3czJfMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYXAgL21hY2hpbmU6STM4NgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiaHRkYm0gLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL0QgIkFQUl9ERUNMQVJFX1NUQVRJQyIgL0QgIkFQVV9ERUNMQVJFX1NUQVRJQyIgL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTURkIC9XMyAvR1ggL1ppIC9PZCAvSSAiLi4vc3JjbGliL2Fwci9pbmNsdWRlIiAvSSAiLi4vc3JjbGliL2Fwci11dGlsL2luY2x1ZGUiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9DT05TT0xFIiAvRCAiQVBSX0RFQ0xBUkVfU1RBVElDIiAvRCAiQVBVX0RFQ0xBUkVfU1RBVElDIiAvRmQiRGVidWcvaHRkYm0iIC9GRCAvYwotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgYWR2YXBpMzIubGliIHdzb2NrMzIubGliIHdzMl8zMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2luY3JlbWVudGFsOm5vIC9tYXAgL2RlYnVnIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgYWR2YXBpMzIubGliIHdzb2NrMzIubGliIHdzMl8zMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2luY3JlbWVudGFsOm5vIC9tYXAgL2RlYnVnIC9tYWNoaW5lOkkzODYKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgImh0ZGJtIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAiaHRkYm0gLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caHRkYm0uYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caHRkYm0ucmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlxidWlsZFx3aW4zMlx3aW4zMnZlci5hd2sKLQotIUlGICAiJChDRkcpIiA9PSAiaHRkYm0gLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIENyZWF0aW5nIFZlcnNpb24gUmVzb3VyY2UKLUlucHV0UGF0aD0uLlxidWlsZFx3aW4zMlx3aW4zMnZlci5hd2sKLQotIi5caHRkYm0ucmMiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JYXdrIC1mIC4uL2J1aWxkL3dpbjMyL3dpbjMydmVyLmF3ayBodGRibSAiaHRkYm0gVXRpbGl0eSIgIC4uL2luY2x1ZGUvYXBfcmVsZWFzZS5oID4gLlxodGRibS5yYwotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImh0ZGJtIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDEKLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQ3JlYXRpbmcgVmVyc2lvbiBSZXNvdXJjZQotSW5wdXRQYXRoPS4uXGJ1aWxkXHdpbjMyXHdpbjMydmVyLmF3awotCi0iLlxodGRibS5yYyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQlhd2sgLWYgLi4vYnVpbGQvd2luMzIvd2luMzJ2ZXIuYXdrIGh0ZGJtICJodGRibSBVdGlsaXR5IiAgLi4vaW5jbHVkZS9hcF9yZWxlYXNlLmggPiAuXGh0ZGJtLnJjCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL3N1cHBvcnQvaHRkaWdlc3QuYyBiL3N1cHBvcnQvaHRkaWdlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmYzQxOC4uMDAwMDAwMAotLS0gYS9zdXBwb3J0L2h0ZGlnZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTk9URSEgVGhpcyBwcm9ncmFtIGlzIG5vdCBzYWZlIGFzIGEgc2V0dWlkIGV4ZWN1dGFibGUhICBEbyBub3QgbWFrZSBpdAotICogc2V0dWlkIQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGh0ZGlnZXN0LmM6IHNpbXBsZSBwcm9ncmFtIGZvciBtYW5pcHVsYXRpbmcgZGlnZXN0IHBhc3N3ZCBmaWxlIGZvciBBcGFjaGUKLSAqCi0gKiBieSBBbGV4ZWkgS29zdXQsIGJhc2VkIG9uIGh0cGFzc3dkLmMsIGJ5IFJvYiBNY0Nvb2wKLSAqLwotCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSAiYXAuaCIKLSNpbmNsdWRlICJhcF9tZDUuaCIKLSNpZiBkZWZpbmVkKE1QRSkgfHwgZGVmaW5lZChRTlgpIHx8IGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX19UQU5ERU0pCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHN5cy9zaWduYWwuaD4KLSNlbmRpZgotCi0jaWZkZWYgV0lOMzIKLSNpbmNsdWRlIDxjb25pby5oPgotI2RlZmluZSB1bmxpbmsgX3VubGluawotI2VuZGlmCi0KLSNpZmRlZiBDSEFSU0VUX0VCQ0RJQwotI2RlZmluZSBMRiAnXG4nCi0jZGVmaW5lIENSICdccicKLSNlbHNlCi0jZGVmaW5lIExGIDEwCi0jZGVmaW5lIENSIDEzCi0jZW5kaWYgLyogQ0hBUlNFVF9FQkNESUMgKi8KLQotI2RlZmluZSBNQVhfU1RSSU5HX0xFTiAyNTYKLQotY2hhciAqdG47Ci0KLXN0YXRpYyB2b2lkIGdldHdvcmQoY2hhciAqd29yZCwgY2hhciAqbGluZSwgY2hhciBzdG9wKQotewotICAgIGludCB4ID0gMCwgeTsKLQotICAgIGZvciAoeCA9IDA7ICgobGluZVt4XSkgJiYgKGxpbmVbeF0gIT0gc3RvcCkpOyB4KyspCi0Jd29yZFt4XSA9IGxpbmVbeF07Ci0KLSAgICB3b3JkW3hdID0gJ1wwJzsKLSAgICBpZiAobGluZVt4XSkKLQkrK3g7Ci0gICAgeSA9IDA7Ci0KLSAgICB3aGlsZSAoKGxpbmVbeSsrXSA9IGxpbmVbeCsrXSkpOwotfQotCi1zdGF0aWMgaW50IGdldGxpbmUoY2hhciAqcywgaW50IG4sIEZJTEUgKmYpCi17Ci0gICAgcmVnaXN0ZXIgaW50IGkgPSAwOwotCi0gICAgd2hpbGUgKDEpIHsKLQlzW2ldID0gKGNoYXIpIGZnZXRjKGYpOwotCi0JaWYgKHNbaV0gPT0gQ1IpCi0JICAgIHNbaV0gPSBmZ2V0YyhmKTsKLQotCWlmICgoc1tpXSA9PSAweDQpIHx8IChzW2ldID09IExGKSB8fCAoaSA9PSAobiAtIDEpKSkgewotCSAgICBzW2ldID0gJ1wwJzsKLQkgICAgcmV0dXJuIChmZW9mKGYpID8gMSA6IDApOwotCX0KLQkrK2k7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBwdXRsaW5lKEZJTEUgKmYsIGNoYXIgKmwpCi17Ci0gICAgaW50IHg7Ci0KLSAgICBmb3IgKHggPSAwOyBsW3hdOyB4KyspCi0JZnB1dGMobFt4XSwgZik7Ci0gICAgZnB1dGMoJ1xuJywgZik7Ci19Ci0KLQotc3RhdGljIHZvaWQgYWRkX3Bhc3N3b3JkKGNoYXIgKnVzZXIsIGNoYXIgKnJlYWxtLCBGSUxFICpmKQotewotICAgIGNoYXIgKnB3OwotICAgIEFQX01ENV9DVFggY29udGV4dDsKLSAgICB1bnNpZ25lZCBjaGFyIGRpZ2VzdFsxNl07Ci0gICAgY2hhciBzdHJpbmdbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgcHdpbltNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciBwd3ZbTUFYX1NUUklOR19MRU5dOwotICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgaWYgKGFwX2dldHBhc3MoIk5ldyBwYXNzd29yZDogIiwgcHdpbiwgc2l6ZW9mKHB3aW4pKSAhPSAwKSB7Ci0JZnByaW50ZihzdGRlcnIsICJwYXNzd29yZCB0b28gbG9uZyIpOwotCWV4aXQoNSk7Ci0gICAgfQotICAgIGFwX2dldHBhc3MoIlJlLXR5cGUgbmV3IHBhc3N3b3JkOiAiLCBwd3YsIHNpemVvZihwd3YpKTsKLSAgICBpZiAoc3RyY21wKHB3aW4sIHB3dikgIT0gMCkgewotCWZwcmludGYoc3RkZXJyLCAiVGhleSBkb24ndCBtYXRjaCwgc29ycnkuXG4iKTsKLQlpZiAodG4pIHsKLQkgICAgdW5saW5rKHRuKTsKLQl9Ci0JZXhpdCgxKTsKLSAgICB9Ci0gICAgcHcgPSBwd2luOwotICAgIGZwcmludGYoZiwgIiVzOiVzOiIsIHVzZXIsIHJlYWxtKTsKLQotICAgIC8qIERvIE1ENSBzdHVmZiAqLwotICAgIHNwcmludGYoc3RyaW5nLCAiJXM6JXM6JXMiLCB1c2VyLCByZWFsbSwgcHcpOwotCi0gICAgYXBfTUQ1SW5pdCgmY29udGV4dCk7Ci0gICAgYXBfTUQ1VXBkYXRlKCZjb250ZXh0LCAodW5zaWduZWQgY2hhciAqKSBzdHJpbmcsIHN0cmxlbihzdHJpbmcpKTsKLSAgICBhcF9NRDVGaW5hbChkaWdlc3QsICZjb250ZXh0KTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCWZwcmludGYoZiwgIiUwMngiLCBkaWdlc3RbaV0pOwotCi0gICAgZnByaW50ZihmLCAiXG4iKTsKLX0KLQotc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBodGRpZ2VzdCBbLWNdIHBhc3N3b3JkZmlsZSByZWFsbSB1c2VybmFtZVxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICJUaGUgLWMgZmxhZyBjcmVhdGVzIGEgbmV3IGZpbGUuXG4iKTsKLSAgICBleGl0KDEpOwotfQotCi1zdGF0aWMgdm9pZCBpbnRlcnJ1cHRlZCh2b2lkKQotewotICAgIGZwcmludGYoc3RkZXJyLCAiSW50ZXJydXB0ZWQuXG4iKTsKLSAgICBpZiAodG4pCi0JdW5saW5rKHRuKTsKLSAgICBleGl0KDEpOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICAgIEZJTEUgKnRmcCwgKmY7Ci0gICAgY2hhciB1c2VyW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjaGFyIHJlYWxtW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjaGFyIGxpbmVbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgbFtNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciB3W01BWF9TVFJJTkdfTEVOXTsKLSAgICBjaGFyIHhbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgY29tbWFuZFtNQVhfU1RSSU5HX0xFTl07Ci0gICAgaW50IGZvdW5kOwotCi0gICAgdG4gPSBOVUxMOwotICAgIHNpZ25hbChTSUdJTlQsICh2b2lkICgqKShpbnQpKSBpbnRlcnJ1cHRlZCk7Ci0gICAgaWYgKGFyZ2MgPT0gNSkgewotCWlmIChzdHJjbXAoYXJndlsxXSwgIi1jIikpCi0JICAgIHVzYWdlKCk7Ci0JaWYgKCEodGZwID0gZm9wZW4oYXJndlsyXSwgInciKSkpIHsKLQkgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBwYXNzd2QgZmlsZSAlcyBmb3Igd3JpdGluZy5cbiIsCi0JCSAgICBhcmd2WzJdKTsKLQkgICAgcGVycm9yKCJmb3BlbiIpOwotCSAgICBleGl0KDEpOwotCX0KLQlwcmludGYoIkFkZGluZyBwYXNzd29yZCBmb3IgJXMgaW4gcmVhbG0gJXMuXG4iLCBhcmd2WzRdLCBhcmd2WzNdKTsKLQlhZGRfcGFzc3dvcmQoYXJndls0XSwgYXJndlszXSwgdGZwKTsKLQlmY2xvc2UodGZwKTsKLQlleGl0KDApOwotICAgIH0KLSAgICBlbHNlIGlmIChhcmdjICE9IDQpCi0JdXNhZ2UoKTsKLQotICAgIHRuID0gdG1wbmFtKE5VTEwpOwotICAgIGlmICghKHRmcCA9IGZvcGVuKHRuLCAidyIpKSkgewotCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IG9wZW4gdGVtcCBmaWxlLlxuIik7Ci0JZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBpZiAoIShmID0gZm9wZW4oYXJndlsxXSwgInIiKSkpIHsKLQlmcHJpbnRmKHN0ZGVyciwKLQkJIkNvdWxkIG5vdCBvcGVuIHBhc3N3ZCBmaWxlICVzIGZvciByZWFkaW5nLlxuIiwgYXJndlsxXSk7Ci0JZnByaW50ZihzdGRlcnIsICJVc2UgLWMgb3B0aW9uIHRvIGNyZWF0ZSBuZXcgb25lLlxuIik7Ci0JZXhpdCgxKTsKLSAgICB9Ci0gICAgc3RyY3B5KHVzZXIsIGFyZ3ZbM10pOwotICAgIHN0cmNweShyZWFsbSwgYXJndlsyXSk7Ci0KLSAgICBmb3VuZCA9IDA7Ci0gICAgd2hpbGUgKCEoZ2V0bGluZShsaW5lLCBNQVhfU1RSSU5HX0xFTiwgZikpKSB7Ci0JaWYgKGZvdW5kIHx8IChsaW5lWzBdID09ICcjJykgfHwgKCFsaW5lWzBdKSkgewotCSAgICBwdXRsaW5lKHRmcCwgbGluZSk7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQlzdHJjcHkobCwgbGluZSk7Ci0JZ2V0d29yZCh3LCBsLCAnOicpOwotCWdldHdvcmQoeCwgbCwgJzonKTsKLQlpZiAoc3RyY21wKHVzZXIsIHcpIHx8IHN0cmNtcChyZWFsbSwgeCkpIHsKLQkgICAgcHV0bGluZSh0ZnAsIGxpbmUpOwotCSAgICBjb250aW51ZTsKLQl9Ci0JZWxzZSB7Ci0JICAgIHByaW50ZigiQ2hhbmdpbmcgcGFzc3dvcmQgZm9yIHVzZXIgJXMgaW4gcmVhbG0gJXNcbiIsIHVzZXIsIHJlYWxtKTsKLQkgICAgYWRkX3Bhc3N3b3JkKHVzZXIsIHJlYWxtLCB0ZnApOwotCSAgICBmb3VuZCA9IDE7Ci0JfQotICAgIH0KLSAgICBpZiAoIWZvdW5kKSB7Ci0JcHJpbnRmKCJBZGRpbmcgdXNlciAlcyBpbiByZWFsbSAlc1xuIiwgdXNlciwgcmVhbG0pOwotCWFkZF9wYXNzd29yZCh1c2VyLCByZWFsbSwgdGZwKTsKLSAgICB9Ci0gICAgZmNsb3NlKGYpOwotICAgIGZjbG9zZSh0ZnApOwotI2lmIGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTjMyKQotICAgIHNwcmludGYoY29tbWFuZCwgImNvcHkgXCIlc1wiIFwiJXNcIiIsIHRuLCBhcmd2WzFdKTsKLSNlbHNlCi0gICAgc3ByaW50Zihjb21tYW5kLCAiY3AgJXMgJXMiLCB0biwgYXJndlsxXSk7Ci0jZW5kaWYKLSAgICBzeXN0ZW0oY29tbWFuZCk7Ci0gICAgdW5saW5rKHRuKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3N1cHBvcnQvaHRkaWdlc3QuZHNwIGIvc3VwcG9ydC9odGRpZ2VzdC5kc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMGY4N2UuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9odGRpZ2VzdC5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJodGRpZ2VzdCIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNS4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMKLQotQ0ZHPWh0ZGlnZXN0IC0gV2luMzIgRGVidWcKLSFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiaHRkaWdlc3QubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJodGRpZ2VzdC5tYWsiIENGRz0iaHRkaWdlc3QgLSBXaW4zMiBEZWJ1ZyIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJodGRpZ2VzdCAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvblwKLSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAiaHRkaWdlc3QgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImh0ZGlnZXN0IC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImh0ZGlnZXN0IgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiaHRkaWdlc3QiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIiIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvSSAiLi5caW5jbHVkZSIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NiAvb3V0OiJyZWxlYXNlL2h0ZGlnZXN0LmV4ZSIKLSMgU1VCVFJBQ1QgTElOSzMyIC9wZGI6bm9uZQotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiaHRkaWdlc3QgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImh0ZGlnZXMwIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiaHRkaWdlczAiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIiIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aaSAvT2QgL0kgIi4uXGluY2x1ZGUiIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6ImRlYnVnL2h0ZGlnZXN0LmV4ZSIgL3BkYnR5cGU6c2VwdAotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAiaHRkaWdlc3QgLSBXaW4zMiBSZWxlYXNlIgotIyBOYW1lICJodGRpZ2VzdCAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cYXBcYXBfY3B5c3Rybi5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cYXBcYXBfZ2V0cGFzcy5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cYXBcYXBfbWQ1Yy5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxodGRpZ2VzdC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9zdXBwb3J0L2h0cGFzc3dkLmMgYi9zdXBwb3J0L2h0cGFzc3dkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYTI0ZTAuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9odHBhc3N3ZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTc3ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTk9URSEgVGhpcyBwcm9ncmFtIGlzIG5vdCBzYWZlIGFzIGEgc2V0dWlkIGV4ZWN1dGFibGUhICBEbyBub3QgbWFrZSBpdAotICogc2V0dWlkIQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGh0cGFzc3dkLmM6IHNpbXBsZSBwcm9ncmFtIGZvciBtYW5pcHVsYXRpbmcgcGFzc3dvcmQgZmlsZSBmb3IKLSAqIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIAotICogT3JpZ2luYWxseSBieSBSb2IgTWNDb29sCi0gKgotICogRXhpdCB2YWx1ZXM6Ci0gKiAgMDogU3VjY2VzcwotICogIDE6IEZhaWx1cmU7IGZpbGUgYWNjZXNzL3Blcm1pc3Npb24gcHJvYmxlbQotICogIDI6IEZhaWx1cmU7IGNvbW1hbmQgbGluZSBzeW50YXggcHJvYmxlbSAodXNhZ2UgbWVzc2FnZSBpc3N1ZWQpCi0gKiAgMzogRmFpbHVyZTsgcGFzc3dvcmQgdmVyaWZpY2F0aW9uIGZhaWx1cmUKLSAqICA0OiBGYWlsdXJlOyBvcGVyYXRpb24gaW50ZXJydXB0ZWQgKHN1Y2ggYXMgd2l0aCBDVFJML0MpCi0gKiAgNTogRmFpbHVyZTsgYnVmZmVyIHdvdWxkIG92ZXJmbG93ICh1c2VybmFtZSwgZmlsZW5hbWUsIG9yIGNvbXB1dGVkCi0gKiAgICAgcmVjb3JkIHRvbyBsb25nKQotICogIDY6IEZhaWx1cmU7IHVzZXJuYW1lIGNvbnRhaW5zIGlsbGVnYWwgb3IgcmVzZXJ2ZWQgY2hhcmFjdGVycwotICovCi0KLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgImFwLmgiCi0jaW5jbHVkZSAiYXBfbWQ1LmgiCi0jaW5jbHVkZSAiYXBfc2hhMS5oIgotCi0jaWZkZWYgV0lOMzIKLSNpbmNsdWRlIDxjb25pby5oPgotI2luY2x1ZGUgIi4uL29zL3dpbjMyL2dldG9wdC5oIgotI2RlZmluZSB1bmxpbmsgX3VubGluawotI2VuZGlmCi0KLSNpZm5kZWYgQ0hBUlNFVF9FQkNESUMKLSNkZWZpbmUgTEYgMTAKLSNkZWZpbmUgQ1IgMTMKLSNlbHNlIC8qQ0hBUlNFVF9FQkNESUMqLwotI2RlZmluZSBMRiAnXG4nCi0jZGVmaW5lIENSICdccicKLSNlbmRpZiAvKkNIQVJTRVRfRUJDRElDKi8KLQotI2RlZmluZSBNQVhfU1RSSU5HX0xFTiAyNTYKLSNkZWZpbmUgQUxHX1BMQUlOIDAKLSNkZWZpbmUgQUxHX0NSWVBUIDEKLSNkZWZpbmUgQUxHX0FQTUQ1IDIKLSNkZWZpbmUgQUxHX0FQU0hBIDMgCi0KLSNkZWZpbmUgRVJSX0ZJTEVQRVJNIDEKLSNkZWZpbmUgRVJSX1NZTlRBWCAyCi0jZGVmaW5lIEVSUl9QV01JU01BVENIIDMKLSNkZWZpbmUgRVJSX0lOVEVSUlVQVEVEIDQKLSNkZWZpbmUgRVJSX09WRVJGTE9XIDUKLSNkZWZpbmUgRVJSX0JBRFVTRVIgNgotCi0vKgotICogVGhpcyBuZWVkcyB0byBiZSBkZWNsYXJlZCBzdGF0aWNhbGx5IHNvIHRoZSBzaWduYWwgaGFuZGxlciBjYW4KLSAqIGFjY2VzcyBpdC4KLSAqLwotc3RhdGljIGNoYXIgKnRlbXBmaWxlbmFtZTsKLQotLyoKLSAqIEdldCBhIGxpbmUgb2YgaW5wdXQgZnJvbSB0aGUgdXNlciwgbm90IGluY2x1ZGluZyBhbnkgdGVybWluYXRpbmcKLSAqIG5ld2xpbmUuCi0gKi8KLXN0YXRpYyBpbnQgZ2V0bGluZShjaGFyICpzLCBpbnQgbiwgRklMRSAqZikKLXsKLSAgICByZWdpc3RlciBpbnQgaSA9IDA7Ci0KLSAgICB3aGlsZSAoMSkgewotCXNbaV0gPSAoY2hhcikgZmdldGMoZik7Ci0KLQlpZiAoc1tpXSA9PSBDUikgewotCSAgICBzW2ldID0gZmdldGMoZik7Ci0JfQotCi0JaWYgKChzW2ldID09IDB4NCkgfHwgKHNbaV0gPT0gTEYpIHx8IChpID09IChuIC0gMSkpKSB7Ci0JICAgIHNbaV0gPSAnXDAnOwotCSAgICByZXR1cm4gKGZlb2YoZikgPyAxIDogMCk7Ci0JfQotCSsraTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHB1dGxpbmUoRklMRSAqZiwgY2hhciAqbCkKLXsKLSAgICBpbnQgeDsKLQotICAgIGZvciAoeCA9IDA7IGxbeF07IHgrKykgewotCWZwdXRjKGxbeF0sIGYpOwotICAgIH0KLSAgICBmcHV0YygnXG4nLCBmKTsKLX0KLQotLyoKLSAqIE1ha2UgYSBwYXNzd29yZCByZWNvcmQgZnJvbSB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uICBBIHplcm8gcmV0dXJuCi0gKiBpbmRpY2F0ZXMgc3VjY2VzczsgZmFpbHVyZSBtZWFucyB0aGF0IHRoZSBvdXRwdXQgYnVmZmVyIGNvbnRhaW5zIGFuCi0gKiBlcnJvciBtZXNzYWdlIGluc3RlYWQuCi0gKi8KLXN0YXRpYyBpbnQgbWtyZWNvcmQoY2hhciAqdXNlciwgY2hhciAqcmVjb3JkLCBzaXplX3QgcmxlbiwgY2hhciAqcGFzc3dkLAotCQkgICAgaW50IGFsZykKLXsKLSAgICBjaGFyICpwdzsKLSAgICBjaGFyIGNwd1sxMjBdOwotICAgIGNoYXIgcHdpbltNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciBwd3ZbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgc2FsdFs5XTsKLQotICAgIGlmIChwYXNzd2QgIT0gTlVMTCkgewotCXB3ID0gcGFzc3dkOwotICAgIH0KLSAgICBlbHNlIHsKLQlpZiAoYXBfZ2V0cGFzcygiTmV3IHBhc3N3b3JkOiAiLCBwd2luLCBzaXplb2YocHdpbikpICE9IDApIHsKLQkgICAgYXBfc25wcmludGYocmVjb3JkLCAocmxlbiAtIDEpLCAicGFzc3dvcmQgdG9vIGxvbmcgKD4lZCkiLAotCQkJc2l6ZW9mKHB3aW4pIC0gMSk7Ci0JICAgIHJldHVybiBFUlJfT1ZFUkZMT1c7Ci0JfQotCWFwX2dldHBhc3MoIlJlLXR5cGUgbmV3IHBhc3N3b3JkOiAiLCBwd3YsIHNpemVvZihwd3YpKTsKLQlpZiAoc3RyY21wKHB3aW4sIHB3dikgIT0gMCkgewotCSAgICBhcF9jcHlzdHJuKHJlY29yZCwgInBhc3N3b3JkIHZlcmlmaWNhdGlvbiBlcnJvciIsIChybGVuIC0gMSkpOwotCSAgICByZXR1cm4gRVJSX1BXTUlTTUFUQ0g7Ci0JfQotCXB3ID0gcHdpbjsKLSAgICAgICAgbWVtc2V0KHB3diwgJ1wwJywgc2l6ZW9mKHB3aW4pKTsKLSAgICB9Ci0gICAgc3dpdGNoIChhbGcpIHsKLQotICAgIGNhc2UgQUxHX0FQU0hBOgotCS8qIFhYWCBjcHcgPj0gMjggKyBzdHJsZW4oc2hhMSkgY2hhcnMgLSBmaXhlZCBsZW4gU0hBICovCi0gCWFwX3NoYTFfYmFzZTY0KHB3LHN0cmxlbihwdyksY3B3KTsKLQlicmVhazsKLQotICAgIGNhc2UgQUxHX0FQTUQ1OiAKLSAgICAgICAgKHZvaWQpIHNyYW5kKChpbnQpIHRpbWUoKHRpbWVfdCAqKSBOVUxMKSk7Ci0gICAgICAgIGFwX3RvNjQoJnNhbHRbMF0sIHJhbmQoKSwgOCk7Ci0gICAgICAgIHNhbHRbOF0gPSAnXDAnOwotCi0JYXBfTUQ1RW5jb2RlKChjb25zdCB1bnNpZ25lZCBjaGFyICopcHcsIChjb25zdCB1bnNpZ25lZCBjaGFyICopc2FsdCwKLQkJICAgICBjcHcsIHNpemVvZihjcHcpKTsKLQlicmVhazsKLQotICAgIGNhc2UgQUxHX1BMQUlOOgotCS8qIFhYWCB0aGlzIGxlbiBsaW1pdGF0aW9uIGlzIG5vdCBpbiBzeW5jIHdpdGggYW55IEhUVFBkIGxlbi4gKi8KLQlhcF9jcHlzdHJuKGNwdyxwdyxzaXplb2YoY3B3KSk7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIEFMR19DUllQVDoKLSAgICBkZWZhdWx0OgotICAgICAgICAodm9pZCkgc3JhbmQoKGludCkgdGltZSgodGltZV90ICopIE5VTEwpKTsKLSAgICAgICAgYXBfdG82NCgmc2FsdFswXSwgcmFuZCgpLCA4KTsKLSAgICAgICAgc2FsdFs4XSA9ICdcMCc7Ci0KLQlhcF9jcHlzdHJuKGNwdywgKGNoYXIgKiljcnlwdChwdywgc2FsdCksIHNpemVvZihjcHcpIC0gMSk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIG1lbXNldChwdywgJ1wwJywgc3RybGVuKHB3KSk7Ci0KLSAgICAvKgotICAgICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSB1c2VybmFtZSwKLSAgICAgKiBoYXNoLCBhbmQgZGVsaW1pdGVycy4KLSAgICAgKi8KLSAgICBpZiAoKHN0cmxlbih1c2VyKSArIDEgKyBzdHJsZW4oY3B3KSkgPiAocmxlbiAtIDEpKSB7Ci0JYXBfY3B5c3RybihyZWNvcmQsICJyZXN1bHRhbnQgcmVjb3JkIHRvbyBsb25nIiwgKHJsZW4gLSAxKSk7Ci0JcmV0dXJuIEVSUl9PVkVSRkxPVzsKLSAgICB9Ci0gICAgc3RyY3B5KHJlY29yZCwgdXNlcik7Ci0gICAgc3RyY2F0KHJlY29yZCwgIjoiKTsKLSAgICBzdHJjYXQocmVjb3JkLCBjcHcpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHVzYWdlKHZvaWQpCi17Ci0gICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTpcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiXHRodHBhc3N3ZCBbLWNtZHBzXSBwYXNzd29yZGZpbGUgdXNlcm5hbWVcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiXHRodHBhc3N3ZCAtYltjbWRwc10gcGFzc3dvcmRmaWxlIHVzZXJuYW1lIHBhc3N3b3JkXG5cbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiIC1jICBDcmVhdGUgYSBuZXcgZmlsZS5cbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiIC1tICBGb3JjZSBNRDUgZW5jcnlwdGlvbiBvZiB0aGUgcGFzc3dvcmQiCi0jaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChUUEYpCi0JIiAoZGVmYXVsdCkiCi0jZW5kaWYKLQkiLlxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgLWQgIEZvcmNlIENSWVBUIGVuY3J5cHRpb24gb2YgdGhlIHBhc3N3b3JkIgotI2lmICghKGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoVFBGKSkpCi0JICAgICIgKGRlZmF1bHQpIgotI2VuZGlmCi0JICAgICIuXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAtcCAgRG8gbm90IGVuY3J5cHQgdGhlIHBhc3N3b3JkIChwbGFpbnRleHQpLlxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgLXMgIEZvcmNlIFNIQSBlbmNyeXB0aW9uIG9mIHRoZSBwYXNzd29yZC5cbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiIC1iICBVc2UgdGhlIHBhc3N3b3JkIGZyb20gdGhlIGNvbW1hbmQgbGluZSByYXRoZXIgIgotCSAgICAidGhhbiBwcm9tcHRpbmcgZm9yIGl0LlxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsCi0JICAgICJPbiBXaW5kb3dzIGFuZCBUUEYgc3lzdGVtcyB0aGUgJy1tJyBmbGFnIGlzIHVzZWQgYnkgZGVmYXVsdC5cbiIpOwotICAgIGZwcmludGYoc3RkZXJyLAotCSAgICAiT24gYWxsIG90aGVyIHN5c3RlbXMsIHRoZSAnLXAnIGZsYWcgd2lsbCBwcm9iYWJseSBub3Qgd29yay5cbiIpOwotICAgIHJldHVybiBFUlJfU1lOVEFYOwotfQotCi1zdGF0aWMgdm9pZCBpbnRlcnJ1cHRlZCh2b2lkKQotewotICAgIGZwcmludGYoc3RkZXJyLCAiSW50ZXJydXB0ZWQuXG4iKTsKLSAgICBpZiAodGVtcGZpbGVuYW1lICE9IE5VTEwpIHsKLQl1bmxpbmsodGVtcGZpbGVuYW1lKTsKLSAgICB9Ci0gICAgZXhpdChFUlJfSU5URVJSVVBURUQpOwotfQotCi0vKgotICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBzcGVjaWZpZWQgZmlsZSBjYW4gYmUgb3BlbmVkIGZvciB0aGUgZ2l2ZW4KLSAqIGFjY2Vzcy4KLSAqLwotc3RhdGljIGludCBhY2Nlc3NpYmxlKGNoYXIgKmZuYW1lLCBjaGFyICptb2RlKQotewotICAgIEZJTEUgKnM7Ci0KLSAgICBzID0gZm9wZW4oZm5hbWUsIG1vZGUpOwotICAgIGlmIChzID09IE5VTEwpIHsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgZmNsb3NlKHMpOwotICAgIHJldHVybiAxOwotfQotCi0vKgotICogUmV0dXJuIHRydWUgaWYgYSBmaWxlIGlzIHJlYWRhYmxlLgotICovCi1zdGF0aWMgaW50IHJlYWRhYmxlKGNoYXIgKmZuYW1lKQotewotICAgIHJldHVybiBhY2Nlc3NpYmxlKGZuYW1lLCAiciIpOwotfQotCi0vKgotICogUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBmaWxlIGNhbiBiZSBvcGVuZWQgZm9yIHdyaXRlIGFjY2Vzcy4KLSAqLwotc3RhdGljIGludCB3cml0YWJsZShjaGFyICpmbmFtZSkKLXsKLSAgICByZXR1cm4gYWNjZXNzaWJsZShmbmFtZSwgImEiKTsKLX0KLQotLyoKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBuYW1lZCBmaWxlIGV4aXN0cywgcmVnYXJkbGVzcyBvZiBwZXJtaXNzaW9ucy4KLSAqLwotc3RhdGljIGludCBleGlzdHMoY2hhciAqZm5hbWUpCi17Ci0jaWZkZWYgV0lOMzIKLSAgICBzdHJ1Y3QgX3N0YXQgc2J1ZjsKLSNlbHNlCi0gICAgc3RydWN0IHN0YXQgc2J1ZjsKLSNlbmRpZgotICAgIGludCBjaGVjazsKLQotI2lmZGVmIFdJTjMyCi0gICAgY2hlY2sgPSBfc3RhdChmbmFtZSwgJnNidWYpOwotI2Vsc2UKLSAgICBjaGVjayA9IHN0YXQoZm5hbWUsICZzYnVmKTsKLSNlbmRpZgotICAgIHJldHVybiAoKGNoZWNrID09IC0xKSAmJiAoZXJybm8gPT0gRU5PRU5UKSkgPyAwIDogMTsKLX0KLQotLyoKLSAqIENvcHkgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiBvbmUgZmlsZSB0byB0aGUgY3VycmVudCBwb3NpdGlvbgotICogb2YgYW5vdGhlci4KLSAqLwotc3RhdGljIHZvaWQgY29weV9maWxlKEZJTEUgKnRhcmdldCwgRklMRSAqc291cmNlKQotewotICAgIHN0YXRpYyBjaGFyIGxpbmVbTUFYX1NUUklOR19MRU5dOwotCi0gICAgd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgc291cmNlKSAhPSBOVUxMKSB7Ci0JZnB1dHMobGluZSwgdGFyZ2V0KTsKLSAgICB9Ci19Ci0KLS8qCi0gKiBMZXQncyBkbyBpdC4gIFdlIGVuZCB1cCBkb2luZyBhIGxvdCBvZiBmaWxlIG9wZW5pbmcgYW5kIGNsb3NpbmcsCi0gKiBidXQgd2hhdCBkbyB3ZSBjYXJlPyAgVGhpcyBhcHBsaWNhdGlvbiBpc24ndCBydW4gY29uc3RhbnRseS4KLSAqLwotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgICBGSUxFICpmdGVtcCA9IE5VTEw7Ci0gICAgRklMRSAqZnB3ID0gTlVMTDsKLSAgICBjaGFyIHVzZXJbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgcGFzc3dvcmRbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgcmVjb3JkW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjaGFyIGxpbmVbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgcHdmaWxlbmFtZVtNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciAqYXJnOwotICAgIGludCBmb3VuZCA9IDA7Ci0gICAgaW50IGFsZyA9IEFMR19DUllQVDsKLSAgICBpbnQgbmV3ZmlsZSA9IDA7Ci0gICAgaW50IG5vbmludGVyYWN0aXZlID0gMDsKLSAgICBpbnQgaTsKLSAgICBpbnQgYXJnc19sZWZ0ID0gMjsKLQotICAgIHRlbXBmaWxlbmFtZSA9IE5VTEw7Ci0gICAgc2lnbmFsKFNJR0lOVCwgKHZvaWQgKCopKGludCkpIGludGVycnVwdGVkKTsKLQotICAgIC8qCi0gICAgICogUHJlbGltaW5hcnkgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZXkgcHJvdmlkZWQgYXQgbGVhc3QKLSAgICAgKiB0aHJlZSBhcmd1bWVudHMsIHdlJ2xsIGRvIGJldHRlciBhcmd1bWVudCBjaGVja2luZyBhcyAKLSAgICAgKiB3ZSBwYXJzZSB0aGUgY29tbWFuZCBsaW5lLgotICAgICAqLwotICAgIGlmIChhcmdjIDwgMykgewotCXJldHVybiB1c2FnZSgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogR28gdGhyb3VnaCB0aGUgYXJndW1lbnQgbGlzdCBhbmQgcGljayBvdXQgYW55IG9wdGlvbnMuICBUaGV5Ci0gICAgICogaGF2ZSB0byBwcmVjZWRlIGFueSBvdGhlciBhcmd1bWVudHMuCi0gICAgICovCi0gICAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgewotCWFyZyA9IGFyZ3ZbaV07Ci0JaWYgKCphcmcgIT0gJy0nKSB7Ci0JICAgIGJyZWFrOwotCX0KLQl3aGlsZSAoKisrYXJnICE9ICdcMCcpIHsKLQkgICAgaWYgKCphcmcgPT0gJ2MnKSB7Ci0JCW5ld2ZpbGUrKzsKLQkgICAgfQotCSAgICBlbHNlIGlmICgqYXJnID09ICdtJykgewotCQlhbGcgPSBBTEdfQVBNRDU7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoKmFyZyA9PSAncycpIHsKLQkJYWxnID0gQUxHX0FQU0hBOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKCphcmcgPT0gJ3AnKSB7Ci0JCWFsZyA9IEFMR19QTEFJTjsKLQkgICAgfQotCSAgICBlbHNlIGlmICgqYXJnID09ICdkJykgewotCQlhbGcgPSBBTEdfQ1JZUFQ7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoKmFyZyA9PSAnYicpIHsKLQkJbm9uaW50ZXJhY3RpdmUrKzsKLQkJYXJnc19sZWZ0Kys7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCXJldHVybiB1c2FnZSgpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIC8qCi0gICAgICogTWFrZSBzdXJlIHdlIHN0aWxsIGhhdmUgZXhhY3RseSB0aGUgcmlnaHQgbnVtYmVyIG9mIGFyZ3VtZW50cyBsZWZ0Ci0gICAgICogKHRoZSBmaWxlbmFtZSwgdGhlIHVzZXJuYW1lLCBhbmQgcG9zc2libHkgdGhlIHBhc3N3b3JkIGlmIC1iIHdhcwotICAgICAqIHNwZWNpZmllZCkuCi0gICAgICovCi0gICAgaWYgKChhcmdjIC0gaSkgIT0gYXJnc19sZWZ0KSB7Ci0JcmV0dXJuIHVzYWdlKCk7Ci0gICAgfQotICAgIGlmIChzdHJsZW4oYXJndltpXSkgPiAoc2l6ZW9mKHB3ZmlsZW5hbWUpIC0gMSkpIHsKLQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBmaWxlbmFtZSB0b28gbG9uZ1xuIiwgYXJndlswXSk7Ci0JcmV0dXJuIEVSUl9PVkVSRkxPVzsKLSAgICB9Ci0gICAgc3RyY3B5KHB3ZmlsZW5hbWUsIGFyZ3ZbaV0pOwotICAgIGlmIChzdHJsZW4oYXJndltpICsgMV0pID4gKHNpemVvZih1c2VyKSAtIDEpKSB7Ci0JZnByaW50ZihzdGRlcnIsICIlczogdXNlcm5hbWUgdG9vIGxvbmcgKD4lZClcbiIsIGFyZ3ZbMF0sCi0JCXNpemVvZih1c2VyKSAtIDEpOwotCXJldHVybiBFUlJfT1ZFUkZMT1c7Ci0gICAgfQotICAgIHN0cmNweSh1c2VyLCBhcmd2W2kgKyAxXSk7Ci0gICAgaWYgKChhcmcgPSBzdHJjaHIodXNlciwgJzonKSkgIT0gTlVMTCkgewotCWZwcmludGYoc3RkZXJyLCAiJXM6IHVzZXJuYW1lIGNvbnRhaW5zIGlsbGVnYWwgY2hhcmFjdGVyICclYydcbiIsCi0JCWFyZ3ZbMF0sICphcmcpOwotCXJldHVybiBFUlJfQkFEVVNFUjsKLSAgICB9Ci0gICAgaWYgKG5vbmludGVyYWN0aXZlKSB7Ci0JaWYgKHN0cmxlbihhcmd2W2kgKyAyXSkgPiAoc2l6ZW9mKHBhc3N3b3JkKSAtIDEpKSB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHBhc3N3b3JkIHRvbyBsb25nICg+JWQpXG4iLCBhcmd2WzBdLAotCQkgICAgc2l6ZW9mKHBhc3N3b3JkKSAtIDEpOwotCSAgICByZXR1cm4gRVJSX09WRVJGTE9XOwotCX0KLQlzdHJjcHkocGFzc3dvcmQsIGFyZ3ZbaSArIDJdKTsKLSAgICB9Ci0KLSNpZmRlZiBXSU4zMgotICAgIGlmIChhbGcgPT0gQUxHX0NSWVBUKSB7Ci0JYWxnID0gQUxHX0FQTUQ1OwotCWZwcmludGYoc3RkZXJyLCAiQXV0b21hdGljYWxseSB1c2luZyBNRDUgZm9ybWF0IG9uIFdpbmRvd3MuXG4iKTsKLSAgICB9Ci0jZW5kaWYKLQotI2lmICghKGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoVFBGKSkpCi0gICAgaWYgKGFsZyA9PSBBTEdfUExBSU4pIHsKLQlmcHJpbnRmKHN0ZGVyciwiV2FybmluZzogc3RvcmluZyBwYXNzd29yZHMgYXMgcGxhaW4gdGV4dCBtaWdodCAiCi0JCSJqdXN0IG5vdCB3b3JrIG9uIHRoaXMgcGxhdGZvcm0uXG4iKTsKLSAgICB9Ci0jZW5kaWYKLSAgICAvKgotICAgICAqIFZlcmlmeSB0aGF0IHRoZSBmaWxlIGV4aXN0cyBpZiAtYyB3YXMgb21pdHRlZC4gIFdlIGdpdmUgYSBzcGVjaWFsCi0gICAgICogbWVzc2FnZSBpZiBpdCBkb2Vzbid0LgotICAgICAqLwotICAgIGlmICgoISBuZXdmaWxlKSAmJiAoISBleGlzdHMocHdmaWxlbmFtZSkpKSB7Ci0JZnByaW50ZihzdGRlcnIsICIlczogY2Fubm90IG1vZGlmeSBmaWxlICVzOyB1c2UgJy1jJyB0byBjcmVhdGUgaXRcbiIsCi0JCWFyZ3ZbMF0sIHB3ZmlsZW5hbWUpOwotCXBlcnJvcigiZm9wZW4iKTsKLQlleGl0KEVSUl9GSUxFUEVSTSk7Ci0gICAgfQotICAgIC8qCi0gICAgICogVmVyaWZ5IHRoYXQgd2UgY2FuIHJlYWQgdGhlIGV4aXN0aW5nIGZpbGUgaW4gdGhlIGNhc2Ugb2YgYW4gdXBkYXRlCi0gICAgICogdG8gaXQgKHJhdGhlciB0aGFuIGNyZWF0aW9uIG9mIGEgbmV3IG9uZSkuCi0gICAgICovCi0gICAgaWYgKCghIG5ld2ZpbGUpICYmICghIHJlYWRhYmxlKHB3ZmlsZW5hbWUpKSkgewotCWZwcmludGYoc3RkZXJyLCAiJXM6IGNhbm5vdCBvcGVuIGZpbGUgJXMgZm9yIHJlYWQgYWNjZXNzXG4iLAotCQlhcmd2WzBdLCBwd2ZpbGVuYW1lKTsKLQlwZXJyb3IoImZvcGVuIik7Ci0JZXhpdChFUlJfRklMRVBFUk0pOwotICAgIH0KLSAgICAvKgotICAgICAqIE5vdyBjaGVjayB0byBzZWUgaWYgd2UgY2FuIHByZXNlcnZlIGFuIGV4aXN0aW5nIGZpbGUgaW4gY2FzZQotICAgICAqIG9mIHBhc3N3b3JkIHZlcmlmaWNhdGlvbiBlcnJvcnMgb24gYSAtYyBvcGVyYXRpb24uCi0gICAgICovCi0gICAgaWYgKG5ld2ZpbGUgJiYgZXhpc3RzKHB3ZmlsZW5hbWUpICYmICghIHJlYWRhYmxlKHB3ZmlsZW5hbWUpKSkgewotCWZwcmludGYoc3RkZXJyLCAiJXM6IGNhbm5vdCBvcGVuIGZpbGUgJXMgZm9yIHJlYWQgYWNjZXNzXG4iCi0JCSIlczogZXhpc3RpbmcgYXV0aCBkYXRhIHdvdWxkIGJlIGxvc3Qgb24gcGFzc3dvcmQgbWlzbWF0Y2giLAotCQlhcmd2WzBdLCBwd2ZpbGVuYW1lLCBhcmd2WzBdKTsKLQlwZXJyb3IoImZvcGVuIik7Ci0JZXhpdChFUlJfRklMRVBFUk0pOwotICAgIH0KLSAgICAvKgotICAgICAqIE5vdyB2ZXJpZnkgdGhhdCB0aGUgZmlsZSBpcyB3cml0YWJsZSEKLSAgICAgKi8KLSAgICBpZiAoISB3cml0YWJsZShwd2ZpbGVuYW1lKSkgewotCWZwcmludGYoc3RkZXJyLCAiJXM6IGNhbm5vdCBvcGVuIGZpbGUgJXMgZm9yIHdyaXRlIGFjY2Vzc1xuIiwKLQkJYXJndlswXSwgcHdmaWxlbmFtZSk7Ci0JcGVycm9yKCJmb3BlbiIpOwotCWV4aXQoRVJSX0ZJTEVQRVJNKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEFsbCB0aGUgZmlsZSBhY2Nlc3MgY2hlY2tzIGhhdmUgYmVlbiBtYWRlLiAgVGltZSB0byBnbyB0byB3b3JrOwotICAgICAqIHRyeSB0byBjcmVhdGUgdGhlIHJlY29yZCBmb3IgdGhlIHVzZXJuYW1lIGluIHF1ZXN0aW9uLiAgSWYgdGhhdAotICAgICAqIGZhaWxzLCB0aGVyZSdzIG5vIG5lZWQgdG8gd2FzdGUgYW55IHRpbWUgb24gZmlsZSBtYW5pcHVsYXRpb25zLgotICAgICAqIEFueSBlcnJvciBtZXNzYWdlIHRleHQgaXMgcmV0dXJuZWQgaW4gdGhlIHJlY29yZCBidWZmZXIsIHNpbmNlCi0gICAgICogdGhlIG1rcmVjb3JkKCkgcm91dGluZSBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIGFyZ3ZbXS4KLSAgICAgKi8KLSAgICBpID0gbWtyZWNvcmQodXNlciwgcmVjb3JkLCBzaXplb2YocmVjb3JkKSAtIDEsCi0JCSBub25pbnRlcmFjdGl2ZSA/IHBhc3N3b3JkIDogTlVMTCwKLQkJIGFsZyk7Ci0gICAgaWYgKGkgIT0gMCkgewotCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzXG4iLCBhcmd2WzBdLCByZWNvcmQpOwotCWV4aXQoaSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBXZSBjYW4gYWNjZXNzIHRoZSBmaWxlcyB0aGUgcmlnaHQgd2F5LCBhbmQgd2UgaGF2ZSBhIHJlY29yZAotICAgICAqIHRvIGFkZCBvciB1cGRhdGUuICBMZXQncyBkbyBpdC4uCi0gICAgICovCi0gICAgdGVtcGZpbGVuYW1lID0gdG1wbmFtKE5VTEwpOwotICAgIGZ0ZW1wID0gZm9wZW4odGVtcGZpbGVuYW1lLCAidysiKTsKLSAgICBpZiAoZnRlbXAgPT0gTlVMTCkgewotCWZwcmludGYoc3RkZXJyLCAiJXM6IHVuYWJsZSB0byBjcmVhdGUgdGVtcG9yYXJ5IGZpbGVcbiIsIGFyZ3ZbMF0pOwotCXBlcnJvcigiZm9wZW4iKTsKLQlleGl0KEVSUl9GSUxFUEVSTSk7Ci0gICAgfQotICAgIC8qCi0gICAgICogSWYgd2UncmUgbm90IGNyZWF0aW5nIGEgbmV3IGZpbGUsIGNvcHkgcmVjb3JkcyBmcm9tIHRoZSBleGlzdGluZwotICAgICAqIG9uZSB0byB0aGUgdGVtcG9yYXJ5IGZpbGUgdW50aWwgd2UgZmluZCB0aGUgc3BlY2lmaWVkIHVzZXIuCi0gICAgICovCi0gICAgaWYgKCEgbmV3ZmlsZSkgewotCWNoYXIgc2NyYXRjaFtNQVhfU1RSSU5HX0xFTl07Ci0KLQlmcHcgPSBmb3Blbihwd2ZpbGVuYW1lLCAiciIpOwotCXdoaWxlICghIChnZXRsaW5lKGxpbmUsIHNpemVvZihsaW5lKSwgZnB3KSkpIHsKLQkgICAgY2hhciAqY29sb247Ci0KLQkgICAgaWYgKChsaW5lWzBdID09ICcjJykgfHwgKGxpbmVbMF0gPT0gJ1wwJykpIHsKLQkJcHV0bGluZShmdGVtcCwgbGluZSk7Ci0JCWNvbnRpbnVlOwotCSAgICB9Ci0JICAgIHN0cmNweShzY3JhdGNoLCBsaW5lKTsKLQkgICAgLyoKLQkgICAgICogU2VlIGlmIHRoaXMgaXMgb3VyIHVzZXIuCi0JICAgICAqLwotCSAgICBjb2xvbiA9IHN0cmNocihzY3JhdGNoLCAnOicpOwotCSAgICBpZiAoY29sb24gIT0gTlVMTCkgewotCQkqY29sb24gPSAnXDAnOwotCSAgICB9Ci0JICAgIGlmIChzdHJjbXAodXNlciwgc2NyYXRjaCkgIT0gMCkgewotCQlwdXRsaW5lKGZ0ZW1wLCBsaW5lKTsKLQkJY29udGludWU7Ci0JICAgIH0KLQkgICAgZm91bmQrKzsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSAgICBpZiAoZm91bmQpIHsKLQlmcHJpbnRmKHN0ZGVyciwgIlVwZGF0aW5nICIpOwotICAgIH0KLSAgICBlbHNlIHsKLQlmcHJpbnRmKHN0ZGVyciwgIkFkZGluZyAiKTsKLSAgICB9Ci0gICAgZnByaW50ZihzdGRlcnIsICJwYXNzd29yZCBmb3IgdXNlciAlc1xuIiwgdXNlcik7Ci0gICAgLyoKLSAgICAgKiBOb3cgYWRkIHRoZSB1c2VyIHJlY29yZCB3ZSBjcmVhdGVkLgotICAgICAqLwotICAgIHB1dGxpbmUoZnRlbXAsIHJlY29yZCk7Ci0gICAgLyoKLSAgICAgKiBJZiB3ZSdyZSB1cGRhdGluZyBhbiBleGlzdGluZyBmaWxlLCB0aGVyZSBtYXkgYmUgYWRkaXRpb25hbAotICAgICAqIHJlY29yZHMgYmV5b25kIHRoZSBvbmUgd2UncmUgdXBkYXRpbmcsIHNvIGNvcHkgdGhlbS4KLSAgICAgKi8KLSAgICBpZiAoISBuZXdmaWxlKSB7Ci0JY29weV9maWxlKGZ0ZW1wLCBmcHcpOwotCWZjbG9zZShmcHcpOwotICAgIH0KLSAgICAvKgotICAgICAqIFRoZSB0ZW1wb3JhcnkgZmlsZSBub3cgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHRoYXQgc2hvdWxkIGJlCi0gICAgICogaW4gdGhlIGFjdHVhbCBwYXNzd29yZCBmaWxlLiAgQ2xvc2UgdGhlIG9wZW4gZmlsZXMsIHJlLW9wZW4gdGhlbQotICAgICAqIGluIHRoZSBhcHByb3ByaWF0ZSBtb2RlLCBhbmQgY29weSB0aGVtIGZpbGUgdG8gdGhlIHJlYWwgb25lLgotICAgICAqLwotICAgIGZjbG9zZShmdGVtcCk7Ci0gICAgZnB3ID0gZm9wZW4ocHdmaWxlbmFtZSwgIncrIik7Ci0gICAgZnRlbXAgPSBmb3Blbih0ZW1wZmlsZW5hbWUsICJyIik7Ci0gICAgY29weV9maWxlKGZwdywgZnRlbXApOwotICAgIGZjbG9zZShmcHcpOwotICAgIGZjbG9zZShmdGVtcCk7Ci0gICAgdW5saW5rKHRlbXBmaWxlbmFtZSk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9zdXBwb3J0L2h0cGFzc3dkLmRzcCBiL3N1cHBvcnQvaHRwYXNzd2QuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTQ5ZDdmLi4wMDAwMDAwCi0tLSBhL3N1cHBvcnQvaHRwYXNzd2QuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iaHRwYXNzd2QiIC0gUGFja2FnZSBPd25lcj08ND4KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDUuMDAKLSMgKiogRE8gTk9UIEVESVQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzCi0KLUNGRz1odHBhc3N3ZCAtIFdpbjMyIERlYnVnCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgImh0cGFzc3dkLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiaHRwYXNzd2QubWFrIiBDRkc9Imh0cGFzc3dkIC0gV2luMzIgRGVidWciCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAiaHRwYXNzd2QgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb25cCi0gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgImh0cGFzc3dkIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJodHBhc3N3ZCAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0kgIi4uXGluY2x1ZGUiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9EICJXSU4zMl9MRUFOX0FORF9NRUFOIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgd3MyXzMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0KLSFFTFNFSUYgICIkKENGRykiID09ICJodHBhc3N3ZCAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aaSAvT2QgL0kgIi4uXGluY2x1ZGUiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9EICJXSU4zMl9MRUFOX0FORF9NRUFOIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgd3MyXzMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0Ci0jIFNVQlRSQUNUIExJTkszMiAvcGRiOm5vbmUKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgImh0cGFzc3dkIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAiaHRwYXNzd2QgLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXGFwXGFwX2NweXN0cm4uYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXGFwXGFwX2dldHBhc3MuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXGFwXGFwX21kNWMuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXGFwXGFwX3NucHJpbnRmLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlxhcFxhcF9zaGExLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlxhcFxhcF9jaGVja3Bhc3MuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXGFwXGFwX2Jhc2U2NC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxodHBhc3N3ZC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9zdXBwb3J0L2xpc3RfaG9va3MucGwgYi9zdXBwb3J0L2xpc3RfaG9va3MucGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1MmM1NjcuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9saXN0X2hvb2tzLnBsCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotIyEvdXNyL2Jpbi9wZXJsIC13Ci0KLXVzZSBzdHJpY3Q7Ci0KLXVzZSBDYXJwOwotCi1teSAkcGF0aD1zaGlmdDsKLQotZmluZEluRGlyKCRwYXRoKTsKLQotZm9yZWFjaCBteSAkaG9vayAoc29ydCBrZXlzICU6Okhvb2tzKSB7Ci0gICAgbXkgJGg9JDo6SG9va3N7JGhvb2t9OwotICAgIGZvciBteSAkeCAocXcoZGVjbGFyZWQgaW1wbGVtZW50ZWQgdHlwZSBhcmdzKSkgewotCWNyb2FrICIkaG9vayBkYXR1bSAnJHgnIG1pc3NpbmciIGlmICFleGlzdHMgJGgtPnskeH07Ci0gICAgfQotICAgIHByaW50ICIkaG9va1xuIjsKLSAgICBwcmludCAiICBkZWNsYXJlZCBpbiAkaC0+e2RlY2xhcmVkfVxuIjsKLSAgICBwcmludCAiICBpbXBsZW1lbnRlZCBpbiAkaC0+e2ltcGxlbWVudGVkfVxuIjsKLSAgICBwcmludCAiICB0eXBlIGlzICRoLT57dHlwZX1cbiI7Ci0gICAgcHJpbnQgIiAgJGgtPntyZXR9ICRob29rKCRoLT57YXJnc30pXG4iOwotICAgIHByaW50ICJcbiI7Ci19Ci0KLXN1YiBmaW5kSW5EaXIgewotICAgIG15ICRwYXRoPXNoaWZ0OwotCi0gICAgbG9jYWwoKkQpOwotICAgIG9wZW5kaXIoRCwkcGF0aCkgfHwgY3JvYWsgIkNhbid0IG9wZW4gJHBhdGg6ICQhIjsKLSAgICB3aGlsZShteSAkZj1yZWFkZGlyIEQpIHsKLQluZXh0IGlmICRmPX4vXlwuLzsKLQlteSAkZmlsZT0iJHBhdGgvJGYiOwotCi0JaWYoLWQgJGZpbGUpIHsKLQkgICAgZmluZEluRGlyKCRmaWxlKTsKLQkgICAgbmV4dDsKLQl9Ci0JbmV4dCBpZiAkZmlsZSAhfiAvXC5bY2hdJC87Ci0KLQlzY2FuRmlsZSgkZmlsZSk7Ci0gICAgfQotICAgIGNsb3NlZGlyIEQ7Ci19Ci0KLXN1YiBzY2FuRmlsZSB7Ci0gICAgbXkgJGZpbGU9c2hpZnQ7Ci0KLSMgICAgcHJpbnQgInNjYW5uaW5nICRmaWxlXG4iOwotCi0gICAgb3BlbihGLCRmaWxlKSB8fCBjcm9hayAiQ2FuJ3Qgb3BlbiAkZmlsZTogJCEiOwotICAgIHdoaWxlKDxGPikgewotCW5leHQgaWYgL1wjZGVmaW5lLzsKLQluZXh0IGlmIC9cQGRlZmZ1bmMvOwotCWlmKC9BUF9ERUNMQVJFX0hPT0tcKCguKilcKS8pIHsKLQkgICAgbXkgJGRlZj0kMTsKLQkgICAgbXkoJHJldCwkbmFtZSwkYXJncyk9JGRlZj1+LyhbXixcc10rKVxzKixccyooW14sXHNdKylccyosXHMqXCgoLiopXCkvOwotCSAgICBjcm9hayAiRG9uJ3QgdW5kZXJzdGFuZCAkZGVmIGluICRmaWxlIiBpZiAhZGVmaW5lZCAkYXJnczsKLSMJICAgIHByaW50ICJmb3VuZCAkcmV0ICRuYW1lKCRhcmdzKSBpbiAkZmlsZVxuIjsKLQotCSAgICBjcm9hayAiJG5hbWUgZGVjbGFyZWQgdHdpY2UhICgkXykiCi0JCWlmIGV4aXN0cyAkOjpIb29rc3skbmFtZX0tPntkZWNsYXJlZH07Ci0JICAgICQ6Okhvb2tzeyRuYW1lfS0+e2RlY2xhcmVkfT0kZmlsZTsKLQkgICAgJDo6SG9va3N7JG5hbWV9LT57cmV0fT0kcmV0OwotCSAgICAkOjpIb29rc3skbmFtZX0tPnthcmdzfT0kYXJnczsKLQl9Ci0JaWYoL0FQX0lNUExFTUVOVF9IT09LXygpKFZPSUQpXCgoW14sXHNdKykvCi0JICAgfHwgL0FQX0lNUExFTUVOVChfT1BUSU9OQUx8KV9IT09LXyguKj8pXChbXixdKz9ccyosXHMqKFteLFxzXSspLykgewotCSAgICBteSgkdHlwZSwkbmFtZSk9KCQxID8gIk9QVElPTkFMICQyIiA6ICQyLCQzKTsKLQotIwkgICAgcHJpbnQgImZvdW5kICRuYW1lICR0eXBlIGluICRmaWxlXG4iOwotCi0JICAgIGNyb2FrICIkbmFtZSBpbXBsZW1lbnRlZCB0d2ljZSAoJDo6SG9va3N7JG5hbWV9LT57aW1wbGVtZW50ZWR9IGFuZCAkZmlsZSkgKCRfKSIKLQkJaWYgZXhpc3RzICQ6Okhvb2tzeyRuYW1lfS0+e2ltcGxlbWVudGVkfTsKLQkgICAgJDo6SG9va3N7JG5hbWV9LT57aW1wbGVtZW50ZWR9PSRmaWxlOwotCSAgICAkOjpIb29rc3skbmFtZX0tPnt0eXBlfT0kdHlwZTsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9sb2dfc2VydmVyX3N0YXR1cy5pbiBiL3N1cHBvcnQvbG9nX3NlcnZlcl9zdGF0dXMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMDE2MDQuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9sb2dfc2VydmVyX3N0YXR1cy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0jIUBwZXJsYmluQAotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0jCi0jIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSMgYXJlIG1ldDoKLSMKLSMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIwotIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSMgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyAgICBkaXN0cmlidXRpb24uCi0jCi0jIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotIyAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotIyAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSMgICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0jICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSMgICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSMKLSMgNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSMgICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0jICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotIyAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSMKLSMgNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0jICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotIyAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotIyBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIyBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0jIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0jIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0jIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotIyBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSMgU1VDSCBEQU1BR0UuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0jIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotIyBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSMgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotIwotIyBMb2cgU2VydmVyIFN0YXR1cwotIyBNYXJrIEogQ294LCBVSyBXZWIgTHRkIDE5OTYsIG1hcmtAdWt3ZWIuY29tCi0jCi0jIFRoaXMgc2NyaXB0IGlzIGRlc2lnbmVkIHRvIGJlIHJ1biBhdCBhIGZyZXF1ZW50IGludGVydmFsIGJ5IHNvbWV0aGluZwotIyBsaWtlIGNyb24uICBJdCBjb25uZWN0cyB0byB0aGUgc2VydmVyIGFuZCBkb3dubG9hZHMgdGhlIHN0YXR1cwotIyBpbmZvcm1hdGlvbi4gIEl0IHJlZm9ybWF0cyB0aGUgaW5mb3JtYXRpb24gdG8gYSBzaW5nbGUgbGluZSBhbmQgbG9ncwotIyBpdCB0byBhIGZpbGUuICBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSAkd2hlcmVsb2cgaXMgd3JpdGFibGUgYnkgdGhlCi0jIHVzZXIgd2hvIHJ1bnMgdGhpcyBzY3JpcHQuCi0jCi1yZXF1aXJlICdzeXMvc29ja2V0LnBoJzsKLQotJHdoZXJlbG9nID0gIi92YXIvbG9nL2dyYXBoLyI7ICAjIExvZ3Mgd2lsbCBiZSBsaWtlICIvdmFyL2xvZy9ncmFwaC8xOTk2MDMxMiIKLSRzZXJ2ZXIgPSAibG9jYWxob3N0IjsgICAgICAgICAgIyBOYW1lIG9mIHNlcnZlciwgY291bGQgYmUgInd3dy5mb28uY29tIgotJHBvcnQgPSAiODAiOyAgICAgICAgICAgICAgICAgICAjIFBvcnQgb24gc2VydmVyCi0kcmVxdWVzdCA9ICIvc3RhdHVzLz9hdXRvIjsgICAgICMgUmVxdWVzdCB0byBzZW5kCi0KLXN1YiB0Y3BfY29ubmVjdAotewotCWxvY2FsKCRob3N0LCRwb3J0KSA9QF87Ci0gICAgICAgICRzb2NrYWRkcj0nUyBuIGE0IHg4JzsKLSAgICAgICAgY2hvcCgkaG9zdG5hbWU9YGhvc3RuYW1lYCk7Ci0gICAgICAgICRwb3J0PShnZXRzZXJ2YnluYW1lKCRwb3J0LCAndGNwJykpWzJdICB1bmxlc3MgJHBvcnQgPX4gL15cZCskLzsKLSAgICAgICAgJG1lPXBhY2soJHNvY2thZGRyLCZBRl9JTkVULDAsKGdldGhvc3RieW5hbWUoJGhvc3RuYW1lKSlbNF0pOwotICAgICAgICAkdGhlbT1wYWNrKCRzb2NrYWRkciwmQUZfSU5FVCwkcG9ydCwoZ2V0aG9zdGJ5bmFtZSgkaG9zdCkpWzRdKTsKLSAgICAgICAgc29ja2V0KFMsJlBGX0lORVQsJlNPQ0tfU1RSRUFNLChnZXRwcm90b2J5bmFtZSgndGNwJykpWzJdKSB8fCAKLQkJZGllICJzb2NrZXQ6ICQhIjsKLSAgICAgICAgYmluZChTLCRtZSkgfHwgcmV0dXJuICJiaW5kOiAkISI7Ci0gICAgICAgIGNvbm5lY3QoUywkdGhlbSkgfHwgcmV0dXJuICJjb25uZWN0OiAkISI7Ci0gICAgICAgIHNlbGVjdChTKTsgCi0JJHwgPSAxOyAKLQlzZWxlY3Qoc3Rkb3V0KTsKLQlyZXR1cm4gIiI7Ci19Ci0KLSMjIyBNYWluCi0KLXsKLSAgICAgICAgJHllYXI9YGRhdGUgKyV5YDsKLQljaG9tcCgkeWVhcik7Ci0JJHllYXIgKz0gKCR5ZWFyIDwgNzApID8gMjAwMCA6IDE5MDA7Ci0JJGRhdGUgPSAkeWVhciAuIGBkYXRlICslbSVkOiVIJU0lU2A7Ci0JY2hvbXAoJGRhdGUpOwotCSgkZGF5LCR0aW1lKT1zcGxpdCgvOi8sJGRhdGUpOwotCSRyZXM9JnRjcF9jb25uZWN0KCRzZXJ2ZXIsJHBvcnQpOwotCW9wZW4oT1VULCI+PiR3aGVyZWxvZyRkYXkiKTsKLQlpZiAoJHJlcykgewotCQlwcmludCBPVVQgIiR0aW1lOi0xOi0xOi0xOi0xOiRyZXNcbiI7Ci0JCWV4aXQgMTsKLQl9Ci0JcHJpbnQgUyAiR0VUICRyZXF1ZXN0XG4iOwotCXdoaWxlICg8Uz4pIHsKLQkJJHJlcXVlc3RzPSQxIGlmICggbXxeQnVzeVNlcnZlcnM6XCAoXFMrKXwpOwotCQkkaWRsZT0kMSBpZiAoIG18XklkbGVTZXJ2ZXJzOlwgKFxTKyl8KTsKLQkJJG51bWJlcj0kMSBpZiAoIG18c3NlczpcIChcUyspfCk7Ci0JCSRjcHU9JDEgaWYgKG18XkNQVUxvYWQ6XCAoXFMrKXwpOwotCX0KLQlwcmludCBPVVQgIiR0aW1lOiRyZXF1ZXN0czokaWRsZTokbnVtYmVyOiRjcHVcbiI7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9sb2dyZXNvbHZlLmMgYi9zdXBwb3J0L2xvZ3Jlc29sdmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNkYzZlNS4uMDAwMDAwMAotLS0gYS9zdXBwb3J0L2xvZ3Jlc29sdmUuYworKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKgotICogbG9ncmVzb2x2ZSAxLjEKLSAqCi0gKiBUb20gUmF0aGJvcm5lIC0gdG9tckB1dW5ldC5jYSAtIGh0dHA6Ly93d3cudXVuZXQuY2EvfnRvbXIvCi0gKiBVVU5FVCBDYW5hZGEsIEFwcmlsIDE2LCAxOTk1Ci0gKgotICogUmV3cml0dGVuIGJ5IERhdmlkIFJvYmluc29uLiAoZHJ0ckBhc3QuY2FtLmFjLnVrKQotICoKLSAqIFVzYWdlOiBsb2dyZXNvbHZlIFstcyBmaWxlbmFtZV0gWy1jXSA8IGFjY2Vzc19sb2cgPiBuZXdfbG9nCi0gKgotICogQXJndW1lbnRzOgotICogICAgLXMgZmlsZW5hbWUgICAgIG5hbWUgb2YgYSBmaWxlIHRvIHJlY29yZCBzdGF0aXN0aWNzCi0gKiAgICAtYyAgICAgICAgICAgICAgY2hlY2sgdGhlIEROUyBmb3IgYSBtYXRjaGluZyBBIHJlY29yZCBmb3IgdGhlIGhvc3QuCi0gKgotICogTm90ZXM6Ci0gKgotICogVG8gZ2VuZXJhdGUgbWVhbmluZ2Z1bCBzdGF0aXN0aWNzIGZyb20gYW4gSFRUUEQgbG9nIGZpbGUsIGl0J3MgZ29vZAotICogdG8gaGF2ZSB0aGUgZG9tYWluIG5hbWUgb2YgZWFjaCBtYWNoaW5lIHRoYXQgYWNjZXNzZWQgeW91ciBzaXRlLCBidXQKLSAqIGRvaW5nIHRoaXMgb24gdGhlIGZseSBjYW4gc2xvdyBIVFRQRCBkb3duLgotICoKLSAqIENvbXBpbGluZyBOQ1NBIEhUVFBEIHdpdGggdGhlIC1ETUlOSU1BTF9ETlMgZmxhZyB0dXJucyBJUCMtPmhvc3RuYW1lCi0gKiByZXNvbHV0aW9uIG9mZi4gQmVmb3JlIHJ1bm5pbmcgeW91ciBzdGF0cyBwcm9ncmFtLCBqdXN0IHJ1biB5b3VyIGxvZwotICogZmlsZSB0aHJvdWdoIHRoaXMgcHJvZ3JhbSAobG9ncmVzb2x2ZSkgYW5kIGFsbCBvZiB5b3VyIElQIG51bWJlcnMgd2lsbAotICogYmUgcmVzb2x2ZWQgaW50byBob3N0bmFtZXMgKHdoZXJlIHBvc3NpYmxlKS4KLSAqCi0gKiBsb2dyZXNvbHZlIHRha2VzIGFuIEhUVFBEIGFjY2VzcyBsb2cgKGluIHRoZSBDT01NT04gbG9nIGZpbGUgZm9ybWF0LAotICogb3IgYW55IG90aGVyIGZvcm1hdCB0aGF0IGhhcyB0aGUgSVAgbnVtYmVyL2RvbWFpbiBuYW1lIGFzIHRoZSBmaXJzdAotICogZmllbGQgZm9yIHRoYXQgbWF0dGVyKSwgYW5kIG91dHB1dHMgdGhlIHNhbWUgZmlsZSB3aXRoIGFsbCBvZiB0aGUKLSAqIGRvbWFpbiBuYW1lcyBsb29rZWQgdXAuIFdoZXJlIG5vIGRvbWFpbiBuYW1lIGNhbiBiZSBmb3VuZCwgdGhlIElQCi0gKiBudW1iZXIgaXMgbGVmdCBpbi4KLSAqCi0gKiBUbyBtaW5pbWl6ZSBpbXBhY3Qgb24geW91ciBuYW1lc2VydmVyLCBsb2dyZXNvbHZlIGhhcyBpdHMgdmVyeSBvd24KLSAqIGludGVybmFsIGhhc2gtdGFibGUgY2FjaGUuIFRoaXMgbWVhbnMgdGhhdCBlYWNoIElQIG51bWJlciB3aWxsIG9ubHkKLSAqIGJlIGxvb2tlZCB1cCB0aGUgZmlyc3QgdGltZSBpdCBpcyBmb3VuZCBpbiB0aGUgbG9nIGZpbGUuCi0gKgotICogVGhlIC1jIG9wdGlvbiBjYXVzZXMgbG9ncmVzb2x2ZSB0byBhcHBseSB0aGUgc2FtZSBjaGVjayBhcyBodHRwZAotICogY29tcGlsZWQgd2l0aCAtRE1BWElNVU1fRE5TOyBhZnRlciBmaW5kaW5nIHRoZSBob3N0bmFtZSBmcm9tIHRoZSBJUAotICogYWRkcmVzcywgaXQgbG9va3MgdXAgdGhlIElQIGFkZHJlc3NlcyBmb3IgdGhlIGhvc3RuYW1lIGFuZCBjaGVja3MKLSAqIHRoYXQgb25lIG9mIHRoZXNlIG1hdGNoZXMgdGhlIG9yaWdpbmFsIGFkZHJlc3MuCi0gKi8KLQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2lmbmRlZiBNUEUKLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBjZ2V0aG9zdChzdHJ1Y3QgaW5fYWRkciBpcG51bSwgY2hhciAqc3RyaW5nLCBpbnQgY2hlY2spOwotc3RhdGljIGludCBnZXRsaW5lKGNoYXIgKnMsIGludCBuKTsKLXN0YXRpYyB2b2lkIHN0YXRzKEZJTEUgKm91dHB1dCk7Ci0KLQotLyogbWF4aW11bSBsaW5lIGxlbmd0aCAqLwotI2RlZmluZSBNQVhMSU5FIDEwMjQKLQotLyogbWF4aW11bSBsZW5ndGggb2YgYSBkb21haW4gbmFtZSAqLwotI2lmbmRlZiBNQVhETkFNRQotI2RlZmluZSBNQVhETkFNRSAyNTYKLSNlbmRpZgotCi0vKiBudW1iZXIgb2YgYnVja2V0cyBpbiBjYWNoZSBoYXNoIHRhYmxlICovCi0jZGVmaW5lIEJVQ0tFVFMgMjU2Ci0KLSNpZiBkZWZpbmVkKE5FRURfU1RSRFVQKQotY2hhciAqc3RyZHVwIChjb25zdCBjaGFyICpzdHIpCi17Ci0gICAgY2hhciAqZHVwOwotCi0gICAgaWYgKCEoZHVwID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihzdHIpICsgMSkpKQotCXJldHVybiBOVUxMOwotICAgIGR1cCA9IHN0cmNweShkdXAsIHN0cik7Ci0KLSAgICByZXR1cm4gZHVwOwotfQotI2VuZGlmCi0KLS8qCi0gKiBzdHJ1Y3QgbnNyZWMgLSByZWNvcmQgb2YgbmFtZXNlcnZpY2UgZm9yIGNhY2hlIGxpbmtlZCBsaXN0Ci0gKiAKLSAqIGlwbnVtIC0gSVAgbnVtYmVyIGhvc3RuYW1lIC0gaG9zdG5hbWUgbm9uYW1lIC0gbm9uemVybyBpZiBJUCBudW1iZXIgaGFzIG5vCi0gKiBob3N0bmFtZSwgaS5lLiBob3N0bmFtZT1JUCBudW1iZXIKLSAqLwotCi1zdHJ1Y3QgbnNyZWMgewotICAgIHN0cnVjdCBpbl9hZGRyIGlwbnVtOwotICAgIGNoYXIgKmhvc3RuYW1lOwotICAgIGludCBub25hbWU7Ci0gICAgc3RydWN0IG5zcmVjICpuZXh0OwotfSAgICAqbnNjYWNoZVtCVUNLRVRTXTsKLQotLyoKLSAqIHN0YXRpc3RpY3MgLSBvYnZpb3VzCi0gKi8KLQotI2lmbmRlZiBoX2Vycm5vCi1leHRlcm4gaW50IGhfZXJybm87IC8qIHNvbWUgbWFjaGluZXMgZG9uJ3QgaGF2ZSB0aGlzIGluIHRoZWlyIGhlYWRlcnMgKi8KLSNlbmRpZgotCi0vKiBsYXJnZXN0ZSB2YWx1ZSBmb3IgaF9lcnJubyAqLwotI2RlZmluZSBNQVhfRVJSIChOT19BRERSRVNTKQotI2RlZmluZSBVTktOT1dOX0VSUiAoTUFYX0VSUisxKQotI2RlZmluZSBOT19SRVZFUlNFICAoTUFYX0VSUisyKQotCi1zdGF0aWMgaW50IGNhY2hlaGl0cyA9IDA7Ci1zdGF0aWMgaW50IGNhY2hlc2l6ZSA9IDA7Ci1zdGF0aWMgaW50IGVudHJpZXMgPSAwOwotc3RhdGljIGludCByZXNvbHZlcyA9IDA7Ci1zdGF0aWMgaW50IHdpdGhuYW1lID0gMDsKLXN0YXRpYyBpbnQgZXJyb3JzW01BWF9FUlIgKyAzXTsKLQotLyoKLSAqIGNnZXRob3N0IC0gZ2V0cyBob3N0bmFtZSBieSBJUCBhZGRyZXNzLCBjYWNoaW5nLCBhbmQgYWRkaW5nIHVucmVzb2x2YWJsZQotICogSVAgbnVtYmVycyB3aXRoIHRoZWlyIElQIG51bWJlciBhcyBob3N0bmFtZSwgc2V0dGluZyBub25hbWUgZmxhZwotICovCi0KLXN0YXRpYyB2b2lkIGNnZXRob3N0IChzdHJ1Y3QgaW5fYWRkciBpcG51bSwgY2hhciAqc3RyaW5nLCBpbnQgY2hlY2spCi17Ci0gICAgc3RydWN0IG5zcmVjICoqY3VycmVudCwgKm5ldzsKLSAgICBzdHJ1Y3QgaG9zdGVudCAqaG9zdGRhdGE7Ci0gICAgY2hhciAqbmFtZTsKLQotICAgIGN1cnJlbnQgPSAmbnNjYWNoZVsoKGlwbnVtLnNfYWRkciArIChpcG51bS5zX2FkZHIgPj4gOCkgKwotCQkJIChpcG51bS5zX2FkZHIgPj4gMTYpICsgKGlwbnVtLnNfYWRkciA+PiAyNCkpICUgQlVDS0VUUyldOwotCi0gICAgd2hpbGUgKCpjdXJyZW50ICE9IE5VTEwgJiYgaXBudW0uc19hZGRyICE9ICgqY3VycmVudCktPmlwbnVtLnNfYWRkcikKLQljdXJyZW50ID0gJigqY3VycmVudCktPm5leHQ7Ci0KLSAgICBpZiAoKmN1cnJlbnQgPT0gTlVMTCkgewotCWNhY2hlc2l6ZSsrOwotCW5ldyA9IChzdHJ1Y3QgbnNyZWMgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3QgbnNyZWMpKTsKLQlpZiAobmV3ID09IE5VTEwpIHsKLQkgICAgcGVycm9yKCJtYWxsb2MiKTsKLQkgICAgZnByaW50ZihzdGRlcnIsICJJbnN1ZmZpY2llbnQgbWVtb3J5XG4iKTsKLQkgICAgZXhpdCgxKTsKLQl9Ci0JKmN1cnJlbnQgPSBuZXc7Ci0JbmV3LT5uZXh0ID0gTlVMTDsKLQotCW5ldy0+aXBudW0gPSBpcG51bTsKLQotCWhvc3RkYXRhID0gZ2V0aG9zdGJ5YWRkcigoY29uc3QgY2hhciAqKSAmaXBudW0sIHNpemVvZihzdHJ1Y3QgaW5fYWRkciksCi0JCQkJIEFGX0lORVQpOwotCWlmIChob3N0ZGF0YSA9PSBOVUxMKSB7Ci0JICAgIGlmIChoX2Vycm5vID4gTUFYX0VSUikKLQkJZXJyb3JzW1VOS05PV05fRVJSXSsrOwotCSAgICBlbHNlCi0JCWVycm9yc1toX2Vycm5vXSsrOwotCSAgICBuZXctPm5vbmFtZSA9IGhfZXJybm87Ci0JICAgIG5hbWUgPSBzdHJkdXAoaW5ldF9udG9hKGlwbnVtKSk7Ci0JfQotCWVsc2UgewotCSAgICBuZXctPm5vbmFtZSA9IDA7Ci0JICAgIG5hbWUgPSBzdHJkdXAoaG9zdGRhdGEtPmhfbmFtZSk7Ci0JICAgIGlmIChjaGVjaykgewotCQlpZiAobmFtZSA9PSBOVUxMKSB7Ci0JCSAgICBwZXJyb3IoInN0cmR1cCIpOwotCQkgICAgZnByaW50ZihzdGRlcnIsICJJbnN1ZmZpY2llbnQgbWVtb3J5XG4iKTsKLQkJICAgIGV4aXQoMSk7Ci0JCX0KLQkJaG9zdGRhdGEgPSBnZXRob3N0YnluYW1lKG5hbWUpOwotCQlpZiAoaG9zdGRhdGEgIT0gTlVMTCkgewotCQkgICAgY2hhciAqKmhwdHI7Ci0KLQkJICAgIGZvciAoaHB0ciA9IGhvc3RkYXRhLT5oX2FkZHJfbGlzdDsgKmhwdHIgIT0gTlVMTDsgaHB0cisrKQotCQkJaWYgKCgoc3RydWN0IGluX2FkZHIgKikgKCpocHRyKSktPnNfYWRkciA9PSBpcG51bS5zX2FkZHIpCi0JCQkgICAgYnJlYWs7Ci0JCSAgICBpZiAoKmhwdHIgPT0gTlVMTCkKLQkJCWhvc3RkYXRhID0gTlVMTDsKLQkJfQotCQlpZiAoaG9zdGRhdGEgPT0gTlVMTCkgewotCQkgICAgZnByaW50ZihzdGRlcnIsICJCYWQgaG9zdDogJXMgIT0gJXNcbiIsIG5hbWUsCi0JCQkgICAgaW5ldF9udG9hKGlwbnVtKSk7Ci0JCSAgICBuZXctPm5vbmFtZSA9IE5PX1JFVkVSU0U7Ci0JCSAgICBmcmVlKG5hbWUpOwotCQkgICAgbmFtZSA9IHN0cmR1cChpbmV0X250b2EoaXBudW0pKTsKLQkJICAgIGVycm9yc1tOT19SRVZFUlNFXSsrOwotCQl9Ci0JICAgIH0KLQl9Ci0JbmV3LT5ob3N0bmFtZSA9IG5hbWU7Ci0JaWYgKG5ldy0+aG9zdG5hbWUgPT0gTlVMTCkgewotCSAgICBwZXJyb3IoInN0cmR1cCIpOwotCSAgICBmcHJpbnRmKHN0ZGVyciwgIkluc3VmZmljaWVudCBtZW1vcnlcbiIpOwotCSAgICBleGl0KDEpOwotCX0KLSAgICB9Ci0gICAgZWxzZQotCWNhY2hlaGl0cysrOwotCi0gICAgLyogc2l6ZSBvZiBzdHJpbmcgPT0gTUFYRE5BTUUgKzEgKi8KLSAgICBzdHJuY3B5KHN0cmluZywgKCpjdXJyZW50KS0+aG9zdG5hbWUsIE1BWEROQU1FKTsKLSAgICBzdHJpbmdbTUFYRE5BTUVdID0gJ1wwJzsKLX0KLQotLyoKLSAqIHByaW50cyB2YXJpb3VzIHN0YXRpc3RpY3MgdG8gb3V0cHV0Ci0gKi8KLQotc3RhdGljIHZvaWQgc3RhdHMgKEZJTEUgKm91dHB1dCkKLXsKLSAgICBpbnQgaTsKLSAgICBjaGFyICppcHN0cmluZzsKLSAgICBzdHJ1Y3QgbnNyZWMgKmN1cnJlbnQ7Ci0gICAgY2hhciAqZXJyc3RyaW5nW01BWF9FUlIgKyAzXTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfRVJSICsgMzsgaSsrKQotCWVycnN0cmluZ1tpXSA9ICJVbmtub3duIGVycm9yIjsKLSAgICBlcnJzdHJpbmdbSE9TVF9OT1RfRk9VTkRdID0gIkhvc3Qgbm90IGZvdW5kIjsKLSAgICBlcnJzdHJpbmdbVFJZX0FHQUlOXSA9ICJUcnkgYWdhaW4iOwotICAgIGVycnN0cmluZ1tOT19SRUNPVkVSWV0gPSAiTm9uIHJlY292ZXJhYmxlIGVycm9yIjsKLSAgICBlcnJzdHJpbmdbTk9fREFUQV0gPSAiTm8gZGF0YSByZWNvcmQiOwotICAgIGVycnN0cmluZ1tOT19BRERSRVNTXSA9ICJObyBhZGRyZXNzIjsKLSAgICBlcnJzdHJpbmdbTk9fUkVWRVJTRV0gPSAiTm8gcmV2ZXJzZSBlbnRyeSI7Ci0KLSAgICBmcHJpbnRmKG91dHB1dCwgImxvZ3Jlc29sdmUgU3RhdGlzdGljczpcbiIpOwotCi0gICAgZnByaW50ZihvdXRwdXQsICJFbnRyaWVzOiAlZFxuIiwgZW50cmllcyk7Ci0gICAgZnByaW50ZihvdXRwdXQsICIgICAgV2l0aCBuYW1lICAgOiAlZFxuIiwgd2l0aG5hbWUpOwotICAgIGZwcmludGYob3V0cHV0LCAiICAgIFJlc29sdmVzICAgIDogJWRcbiIsIHJlc29sdmVzKTsKLSAgICBpZiAoZXJyb3JzW0hPU1RfTk9UX0ZPVU5EXSkKLQlmcHJpbnRmKG91dHB1dCwgIiAgICAtIE5vdCBmb3VuZCA6ICVkXG4iLCBlcnJvcnNbSE9TVF9OT1RfRk9VTkRdKTsKLSAgICBpZiAoZXJyb3JzW1RSWV9BR0FJTl0pCi0JZnByaW50ZihvdXRwdXQsICIgICAgLSBUcnkgYWdhaW4gOiAlZFxuIiwgZXJyb3JzW1RSWV9BR0FJTl0pOwotICAgIGlmIChlcnJvcnNbTk9fREFUQV0pCi0JZnByaW50ZihvdXRwdXQsICIgICAgLSBObyBkYXRhICAgOiAlZFxuIiwgZXJyb3JzW05PX0RBVEFdKTsKLSAgICBpZiAoZXJyb3JzW05PX0FERFJFU1NdKQotCWZwcmludGYob3V0cHV0LCAiICAgIC0gTm8gYWRkcmVzczogJWRcbiIsIGVycm9yc1tOT19BRERSRVNTXSk7Ci0gICAgaWYgKGVycm9yc1tOT19SRVZFUlNFXSkKLQlmcHJpbnRmKG91dHB1dCwgIiAgICAtIE5vIHJldmVyc2U6ICVkXG4iLCBlcnJvcnNbTk9fUkVWRVJTRV0pOwotICAgIGZwcmludGYob3V0cHV0LCAiQ2FjaGUgaGl0cyAgICAgIDogJWRcbiIsIGNhY2hlaGl0cyk7Ci0gICAgZnByaW50ZihvdXRwdXQsICJDYWNoZSBzaXplICAgICAgOiAlZFxuIiwgY2FjaGVzaXplKTsKLSAgICBmcHJpbnRmKG91dHB1dCwgIkNhY2hlIGJ1Y2tldHMgICA6ICAgICBJUCBudW1iZXIgKiBob3N0bmFtZVxuIik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgQlVDS0VUUzsgaSsrKQotCWZvciAoY3VycmVudCA9IG5zY2FjaGVbaV07IGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpIHsKLQkgICAgaXBzdHJpbmcgPSBpbmV0X250b2EoY3VycmVudC0+aXBudW0pOwotCSAgICBpZiAoY3VycmVudC0+bm9uYW1lID09IDApCi0JCWZwcmludGYob3V0cHV0LCAiICAlM2QgICUxNXMgLSAlc1xuIiwgaSwgaXBzdHJpbmcsCi0JCQljdXJyZW50LT5ob3N0bmFtZSk7Ci0JICAgIGVsc2UgewotCQlpZiAoY3VycmVudC0+bm9uYW1lID4gTUFYX0VSUiArIDIpCi0JCSAgICBmcHJpbnRmKG91dHB1dCwgIiAgJTNkICAlMTVzIDogVW5rbm93biBlcnJvclxuIiwgaSwKLQkJCSAgICBpcHN0cmluZyk7Ci0JCWVsc2UKLQkJICAgIGZwcmludGYob3V0cHV0LCAiICAlM2QgICUxNXMgOiAlc1xuIiwgaSwgaXBzdHJpbmcsCi0JCQkgICAgZXJyc3RyaW5nW2N1cnJlbnQtPm5vbmFtZV0pOwotCSAgICB9Ci0JfQotfQotCi0KLS8qCi0gKiBnZXRzIGEgbGluZSBmcm9tIHN0ZGluCi0gKi8KLQotc3RhdGljIGludCBnZXRsaW5lIChjaGFyICpzLCBpbnQgbikKLXsKLSAgICBjaGFyICpjcDsKLQotICAgIGlmICghZmdldHMocywgbiwgc3RkaW4pKQotCXJldHVybiAoMCk7Ci0gICAgY3AgPSBzdHJjaHIocywgJ1xuJyk7Ci0gICAgaWYgKGNwKQotCSpjcCA9ICdcMCc7Ci0gICAgcmV0dXJuICgxKTsKLX0KLQotaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gICAgc3RydWN0IGluX2FkZHIgaXBudW07Ci0gICAgY2hhciAqYmFyLCBob3N0c3RyaW5nW01BWEROQU1FICsgMV0sIGxpbmVbTUFYTElORV0sICpzdGF0ZmlsZTsKLSAgICBpbnQgaSwgY2hlY2s7Ci0KLSAgICBjaGVjayA9IDA7Ci0gICAgc3RhdGZpbGUgPSBOVUxMOwotICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKLQlpZiAoc3RyY21wKGFyZ3ZbaV0sICItYyIpID09IDApCi0JICAgIGNoZWNrID0gMTsKLQllbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIi1zIikgPT0gMCkgewotCSAgICBpZiAoaSA9PSBhcmdjIC0gMSkgewotCQlmcHJpbnRmKHN0ZGVyciwgImxvZ3Jlc29sdmU6IG1pc3NpbmcgZmlsZW5hbWUgdG8gLXNcbiIpOwotCQlleGl0KDEpOwotCSAgICB9Ci0JICAgIGkrKzsKLQkgICAgc3RhdGZpbGUgPSBhcmd2W2ldOwotCX0KLQllbHNlIHsKLQkgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogbG9ncmVzb2x2ZSBbLXMgc3RhdGZpbGVdIFstY10gPCBpbnB1dCA+IG91dHB1dFxuIik7Ci0JICAgIGV4aXQoMCk7Ci0JfQotICAgIH0KLQotCi0gICAgZm9yIChpID0gMDsgaSA8IEJVQ0tFVFM7IGkrKykKLQluc2NhY2hlW2ldID0gTlVMTDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0VSUiArIDI7IGkrKykKLQllcnJvcnNbaV0gPSAwOwotCi0gICAgd2hpbGUgKGdldGxpbmUobGluZSwgTUFYTElORSkpIHsKLQlpZiAobGluZVswXSA9PSAnXDAnKQotCSAgICBjb250aW51ZTsKLQllbnRyaWVzKys7Ci0JaWYgKCFpc2RpZ2l0KGxpbmVbMF0pKSB7CS8qIHNob3J0IGN1dCAqLwotCSAgICBwdXRzKGxpbmUpOwotCSAgICB3aXRobmFtZSsrOwotCSAgICBjb250aW51ZTsKLQl9Ci0JYmFyID0gc3RyY2hyKGxpbmUsICcgJyk7Ci0JaWYgKGJhciAhPSBOVUxMKQotCSAgICAqYmFyID0gJ1wwJzsKLQlpcG51bS5zX2FkZHIgPSBpbmV0X2FkZHIobGluZSk7Ci0JaWYgKGlwbnVtLnNfYWRkciA9PSAweGZmZmZmZmZmdSkgewotCSAgICBpZiAoYmFyICE9IE5VTEwpCi0JCSpiYXIgPSAnICc7Ci0JICAgIHB1dHMobGluZSk7Ci0JICAgIHdpdGhuYW1lKys7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotCXJlc29sdmVzKys7Ci0KLQljZ2V0aG9zdChpcG51bSwgaG9zdHN0cmluZywgY2hlY2spOwotCWlmIChiYXIgIT0gTlVMTCkKLQkgICAgcHJpbnRmKCIlcyAlc1xuIiwgaG9zdHN0cmluZywgYmFyICsgMSk7Ci0JZWxzZQotCSAgICBwdXRzKGhvc3RzdHJpbmcpOwotICAgIH0KLQotICAgIGlmIChzdGF0ZmlsZSAhPSBOVUxMKSB7Ci0JRklMRSAqZnA7Ci0JZnAgPSBmb3BlbihzdGF0ZmlsZSwgInciKTsKLQlpZiAoZnAgPT0gTlVMTCkgewotCSAgICBmcHJpbnRmKHN0ZGVyciwgImxvZ3Jlc29sdmU6IGNvdWxkIG5vdCBvcGVuIHN0YXRpc3RpY3MgZmlsZSAnJXMnXG4iCi0JCSAgICAsc3RhdGZpbGUpOwotCSAgICBleGl0KDEpOwotCX0KLQlzdGF0cyhmcCk7Ci0JZmNsb3NlKGZwKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKDApOwotfQpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9sb2dyZXNvbHZlLmRzcCBiL3N1cHBvcnQvbG9ncmVzb2x2ZS5kc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNWQ4N2UuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9sb2dyZXNvbHZlLmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ibG9ncmVzb2x2ZSIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNS4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMKLQotQ0ZHPWxvZ3Jlc29sdmUgLSBXaW4zMiBEZWJ1ZwotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJsb2dyZXNvbHZlLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAibG9ncmVzb2x2ZS5tYWsiIENGRz0ibG9ncmVzb2x2ZSAtIFdpbjMyIERlYnVnIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgImxvZ3Jlc29sdmUgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb25cCi0gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgImxvZ3Jlc29sdmUgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uXAotICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImxvZ3Jlc29sdmUgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9JICIuLi9pbmNsdWRlIiAvSSAiLi4vbGliL2Fwci9pbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfQ09OU09MRSIgL0QgIldJTjMyX0xFQU5fQU5EX01FQU4iIC9GRCAvYwotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIHdzb2NrMzIubGliIHdzMl8zMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hcCAvbWFjaGluZTpJMzg2Ci0jIFNVQlRSQUNUIExJTkszMiAvcGRiOm5vbmUgL25vZGVmYXVsdGxpYgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibG9ncmVzb2x2ZSAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9JICIuLi9pbmNsdWRlIiAvSSAiLi4vbGliL2Fwci9pbmNsdWRlIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfQ09OU09MRSIgL0QgIldJTjMyX0xFQU5fQU5EX01FQU4iIC9GRCAvYwotIyBTVUJUUkFDVCBDUFAgL0ZyCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgd3NvY2szMi5saWIgd3MyXzMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9ub2RlZmF1bHRsaWIKLSMgU1VCVFJBQ1QgTElOSzMyIC9wZGI6bm9uZQotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAibG9ncmVzb2x2ZSAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgImxvZ3Jlc29sdmUgLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbG9ncmVzb2x2ZS5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9zdXBwb3J0L2xvZ3Jlc29sdmUucGwuaW4gYi9zdXBwb3J0L2xvZ3Jlc29sdmUucGwuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMTQyZjEuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9sb2dyZXNvbHZlLnBsLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLSMhQHBlcmxiaW5ACi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotIyByZXNlcnZlZC4KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIyBhcmUgbWV0OgotIwotIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jCi0jIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotIyAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jICAgIGRpc3RyaWJ1dGlvbi4KLSMKLSMgMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0jICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0jICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotIyAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSMgICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotIyAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotIwotIyA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotIyAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSMgICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0jICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotIwotIyA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSMgICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0jICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0jIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0jIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0jIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSMgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSMgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSMgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0jIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotIyBTVUNIIERBTUFHRS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSMgaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0jIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotIyA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0jCi0jIGxvZ3Jlc29sdmUucGwKLSMKLSMgdiAxLjIgYnkgcm9iaCBAIGltZGIuY29tCi0jIAotIyB1c2FnZTogbG9ncmVzb2x2ZS5wbCA8aW5maWxlID5vdXRmaWxlCi0jCi0jIGlucHV0ID0gQXBhY2hlL05DU0EvLi4gbG9nZmlsZSB3aXRoIElQIG51bWJlcnMgYXQgc3RhcnQgb2YgbGluZXMKLSMgb3V0cHV0ID0gc2FtZSBsb2dmaWxlIHdpdGggSVAgYWRkcmVzc2VzIHJlc29sdmVkIHRvIGhvc3RuYW1lcyB3aGVyZQotIyAgbmFtZSBsb29rdXBzIHN1Y2NlZWRlZC4KLSMKLSMgdGhpcyBkaWZmZXJzIGZyb20gdGhlIEMgYmFzZWQgJ2xvZ3Jlc29sdmUnIGluIHRoYXQgdGhpcyBzY3JpcHQKLSMgc3Bhd25zIGEgbnVtYmVyICgkQ0hJTERSRU4pIG9mIHN1YnByb2Nlc3NlcyB0byByZXNvbHZlIGFkZHJlc3NlcwotIyBjb25jdXJyZW50bHkgYW5kIHNldHMgYSBzaG9ydCB0aW1lb3V0ICgkVElNRU9VVCkgZm9yIGVhY2ggbG9va3VwIGluCi0jIG9yZGVyIHRvIGtlZXAgdGhpbmdzIG1vdmluZyBxdWlja2x5LgotIwotIyB0aGUgcGFyZW50IHByb2Nlc3MgaGFuZGxlcyBjYWNoaW5nIG9mIElQLT5ob3N0bmFtZXMgdXNpbmcgYSBQZXJsIGhhc2gKLSMgaXQgYWxzbyBhdm9pZHMgc2VuZGluZyB0aGUgc2FtZSBJUCB0byBtdWx0aXBsZSBjaGlsZCBwcm9jZXNzZXMgdG8gYmUKLSMgcmVzb2x2ZWQgbXVsdGlwbGUgdGltZXMgY29uY3VycmVudGx5LgotIwotIyBEZXBlbmRpbmcgb24gdGhlIHNldHRpbmdzIG9mICRDSElMRFJFTiBhbmQgJFRJTUVPVVQgeW91IHNob3VsZCBzZWUKLSMgc2lnbmlmaWNhbnQgcmVkdWN0aW9ucyBpbiB0aGUgb3ZlcmFsbCB0aW1lIHRha2VuIHRvIHJlc29sdmUgeW91cgotIyBsb2dmaWxlcy4gV2l0aCAkQ0hJTERSRU49NDAgYW5kICRUSU1FT1VUPTUgSSd2ZSBzZWVuIDIwMCwwMDAgLSAzMDAsMDAwCi0jIGxvZ2ZpbGUgbGluZXMgcHJvY2Vzc2VkIHBlciBob3VyIGNvbXBhcmVkIHRvIH40NSwwMDAgcGVyIGhvdXIKLSMgd2l0aCAnbG9ncmVzb2x2ZScuCi0jCi0jIEkgaGF2ZW4ndCB5ZXQgc2VlbiBhbnkgbm90aWNhYmxlIHJlZHVjdGlvbiBpbiB0aGUgcGVyY2VudGFnZSBvZiBJUHMKLSMgdGhhdCBmYWlsIHRvIGdldCByZXNvbHZlZC4gWW91ciBtaWxlYWdlIHdpbGwgbm8gZG91YnQgdmFyeS4gNXMgaXMgbG9uZwotIyBlbm91Z2ggdG8gd2FpdCBJTU8uCi0jCi0jIEtub3duIHRvIHdvcmsgd2l0aCBGcmVlQlNEIDIuMgotIyBLbm93biB0byBoYXZlIHByb2JsZW1zIHdpdGggU29sYXJpcwotIwotIyA5ODA0MTcgLSB1c2UgJ3NvY2thZGRyX3VuJyBmb3IgYmluZC9jb25uZWN0IHRvIG1ha2UgdGhlIHNjcmlwdCB3b3JrCi0jICB3aXRoIGxpbnV4LiBGaXggZnJvbSBMdXVrIGRlIEJvZXIgPGx1dWtfZGVfYm9lckBwaS5uZXQ+Ci0KLXJlcXVpcmUgNS4wMDQ7Ci0KLSR8PTE7Ci0KLXVzZSBGaWxlSGFuZGxlOwotdXNlIFNvY2tldDsKLQotdXNlIHN0cmljdDsKLW5vIHN0cmljdCAncmVmcyc7Ci0KLXVzZSB2YXJzIHF3KCRQUk9UT0NPTCk7Ci0kUFJPVE9DT0wgPSAwOwotCi1teSAkQ0hJTERSRU4gPSA0MDsKLW15ICRUSU1FT1VUICA9IDU7Ci0KLW15ICRmaWxlbmFtZTsKLW15ICVoYXNoID0gKCk7Ci1teSAkcGFyZW50ID0gJCQ7Ci0KLW15IEBjaGlsZHJlbiA9ICgpOwotZm9yIChteSAkY2hpbGQgPSAxOyAkY2hpbGQgPD0kQ0hJTERSRU47ICRjaGlsZCsrKSB7Ci0JbXkgJGYgPSBmb3JrKCk7CQotCWlmICghJGYpIHsKLQkJJGZpbGVuYW1lID0gIi4vLnNvY2tldC4kcGFyZW50LiRjaGlsZCI7Ci0JCWlmICgtZSAkZmlsZW5hbWUpIHsgdW5saW5rKCRmaWxlbmFtZSkgfHwgd2FybiAiJGZpbGVuYW1lIC4uICQhXG4iO30KLQkJJmNoaWxkKCRjaGlsZCk7Ci0JCWV4aXQoMCk7Ci0JfQotCXB1c2goQGNoaWxkcmVuLCAkZik7Ci19Ci0KLSZwYXJlbnQ7Ci0mY2xlYW51cDsKLQotIyMgcmVtb3ZlIGFsbCB0ZW1wb3JhcnkgZmlsZXMgYmVmb3JlIHNodXR0aW5nIGRvd24KLXN1YiBjbGVhbnVwIHsKLQkgIyBkaWUga2lkZGllcywgZGllCi0Ja2lsbCgxNSwgQGNoaWxkcmVuKTsKLQlmb3IgKG15ICRjaGlsZCA9IDE7ICRjaGlsZCA8PSRDSElMRFJFTjsgJGNoaWxkKyspIHsKLQkJaWYgKC1lICIuLy5zb2NrZXQuJHBhcmVudC4kY2hpbGQiKSB7Ci0JCQl1bmxpbmsoIi4vLnNvY2tldC4kcGFyZW50LiRjaGlsZCIpCi0JCQkJfHwgd2FybiAiLnNvY2tldC4kcGFyZW50LiRjaGlsZCAkISI7Ci0JCX0KLQl9Ci19Ci0JCi1zdWIgcGFyZW50IHsKLQkjIFRyYXAgc29tZSBwb3NzaWJsZSBzaWduYWxzIHRvIHRyaWdnZXIgdGVtcCBmaWxlIGNsZWFudXAKLQkkU0lHeydLSUxMJ30gPSAkU0lHeydJTlQnfSA9ICRTSUd7J1BJUEUnfSA9IFwmY2xlYW51cDsKLQotCW15ICVDSElMRFNPQ0s7Ci0JbXkgJGZpbGVuYW1lOwotIAotCSAjIyBmb3JrIGNoaWxkIHByb2Nlc3Nlcy4gRWFjaCBjaGlsZCB3aWxsIGNyZWF0ZSBhIHNvY2tldCBjb25uZWN0aW9uCi0JICMjIHRvIHRoaXMgcGFyZW50IGFuZCB1c2UgYW4gdW5pcXVlIHRlbXAgZmlsZW5hbWUgdG8gZG8gc28uCi0JZm9yIChteSAkY2hpbGQgPSAxOyAkY2hpbGQgPD0kQ0hJTERSRU47ICRjaGlsZCsrKSB7Ci0JCSRDSElMRFNPQ0t7JGNoaWxkfT0gRmlsZUhhbmRsZS0+bmV3OwotCi0JCWlmICghc29ja2V0KCRDSElMRFNPQ0t7JGNoaWxkfSwgQUZfVU5JWCwgU09DS19TVFJFQU0sICRQUk9UT0NPTCkpIHsKLQkJCXdhcm4gInBhcmVudCBzb2NrZXQgdG8gY2hpbGQgZmFpbGVkICQhIjsKLQkJfQotCQkkZmlsZW5hbWUgPSAiLi8uc29ja2V0LiRwYXJlbnQuJGNoaWxkIjsKLQkJbXkgJHJlc3BvbnNlOwotCQlkbyB7Ci0JCQkkcmVzcG9uc2UgPSBjb25uZWN0KCRDSElMRFNPQ0t7JGNoaWxkfSwgc29ja2FkZHJfdW4oJGZpbGVuYW1lKSk7Ci0JCQlpZiAoJHJlc3BvbnNlICE9IDEpIHsKLQkJCQlzbGVlcCgxKTsKLQkJCX0gICAgICAgICAgICAgICAgICAgICAgIAotCQl9IHdoaWxlICgkcmVzcG9uc2UgIT0gMSk7Ci0JCSRDSElMRFNPQ0t7JGNoaWxkfS0+YXV0b2ZsdXNoOwotCX0KLQkjIyBBbGwgY2hpbGQgcHJvY2Vzc2VzIHNob3VsZCBub3cgYmUgcmVhZHkgb3IgYXQgd29yc3Qgd2FybWluZyB1cCAKLQotCW15IChAYnVmZmVyLCAkY2hpbGQsICRpcCwgJHJlc3QsICRob3N0bmFtZSwgJHJlc3BvbnNlKTsKLQkgIyMgcmVhZCB0aGUgbG9nZmlsZSBsaW5lcyBmcm9tIFNURElOCi0Jd2hpbGUoPFNURElOPikgewotCQlAYnVmZmVyID0gKCk7CSMgZW1wdHkgdGhlIGxvZ2ZpbGUgbGluZSBidWZmZXIgYXJyYXkuCi0JCSRjaGlsZCA9IDE7CQkjIGNoaWxkcmVuIGFyZSBudW1iZXJlZCAxLi5OLCBzdGFydCB3aXRoICMxCi0KLQkJIyB3aGlsZSB3ZSBoYXZlIGEgY2hpbGQgdG8gdGFsayB0byBhbmQgZGF0YSB0byBnaXZlIGl0Li4KLQkJZG8gewotCQkJcHVzaChAYnVmZmVyLCAkXyk7CQkJCQkjIGJ1ZmZlciB0aGUgbGluZQotCQkJKCRpcCwgJHJlc3QpID0gc3BsaXQoLyAvLCAkXywgMik7CSMgc2VwYXJhdGUgSVAgZm9ybSByZXN0Ci0KLQkJCXVubGVzcyAoJGhhc2h7JGlwfSkgewkJCQkjIHJlc29sdmUgaWYgdW5zZWVuIElQCi0JCQkJJENISUxEU09DS3skY2hpbGR9LT5wcmludCgiJGlwXG4iKTsgIyBwYXNzIElQIHRvIG5leHQgY2hpbGQKLQkJCQkkaGFzaHskaXB9ID0gJGlwOwkJCQkjIGRvbid0IGxvb2sgaXQgdXAgYWdhaW4uCi0JCQkJJGNoaWxkKys7Ci0JCQl9Ci0JCX0gd2hpbGUgKCgkY2hpbGQgPCAoJENISUxEUkVOLTEpKSBhbmQgKCRfID0gPFNURElOPikpOwotCi0JCSAjIyBub3cgcG9sbCBlYWNoIGNoaWxkIGZvciBhIHJlc3BvbnNlCi0JCXdoaWxlICgtLSRjaGlsZCA+IDApIHsgCi0JCQkkcmVzcG9uc2UgPSAkQ0hJTERTT0NLeyRjaGlsZH0tPmdldGxpbmU7Ci0JCQljaG9tcCgkcmVzcG9uc2UpOwotCQkJICMgY2hpbGQgc2VuZHMgdXMgYmFjayBib3RoIHRoZSBJUCBhbmQgSE9TVE5BTUUsIG5vIG5lZWQgZm9yIHVzCi0JCQkgIyB0byByZW1lbWJlciB3aGF0IGNoaWxkIHJlY2VpdmVkIGFueSBnaXZlbiBJUCwgYW5kIG5vIHdvcnJpZXMKLQkJCSAjIHdoYXQgb3JkZXIgd2UgdGFsayB0byB0aGUgY2hpbGRyZW4KLQkJCSgkaXAsICRob3N0bmFtZSkgPSBzcGxpdCgvXHwvLCAkcmVzcG9uc2UsIDIpOwotCQkJJGhhc2h7JGlwfSA9ICRob3N0bmFtZTsKLQkJfQotCi0JCSAjIHJlc29sdmUgYWxsIHRoZSBsb2dmaWxlcyBsaW5lcyBoZWxkIGluIHRoZSBsb2cgYnVmZmVyIGFycmF5Li4KLQkJZm9yIChteSAkbGluZSA9IDA7ICRsaW5lIDw9JCNidWZmZXI7ICRsaW5lKyspIHsKLQkJCSAjIGdldCBuZXh0IGJ1ZmZlcmVkIGxpbmUKLQkJCSgkaXAsICRyZXN0KSA9IHNwbGl0KC8gLywgJGJ1ZmZlclskbGluZV0sIDIpOwotCQkJICMgc2VwYXJhdGUgSVAgZnJvbSByZXN0IGFuZCByZXBsYWNlIHdpdGggY2FjaGVkIGhvc3RuYW1lCi0JCQlwcmludGYgU1RET1VUICgiJXMgJXMiLCAkaGFzaHskaXB9LCAkcmVzdCk7Ci0JCX0KLQl9Ci19Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotc3ViIGNoaWxkIHsKLQkgIyBhcmcgPSBudW1lcmljIElEIC0gaG93IHRoZSBwYXJlbnQgcmVmZXJzIHRvIG1lCi0JbXkgJG1lID0gc2hpZnQ7Ci0KLQkgIyBhZGQgdHJhcCBmb3IgYWxhcm0gc2lnbmFscy4KLQkkU0lHeydBTFJNJ30gPSBzdWIgeyBkaWUgImFsYXJtZWQiOyB9OwotCi0JICMgY3JlYXRlIGEgc29ja2V0IHRvIGNvbW11bmljYXRlIHdpdGggcGFyZW50Ci0Jc29ja2V0KElOQk9VTkQsIEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAkUFJPVE9DT0wpCi0JCXx8IGRpZSAiRXJyb3Igd2l0aCBTb2NrZXQ6ICEkXG4iOwotCSRmaWxlbmFtZSA9ICIuLy5zb2NrZXQuJHBhcmVudC4kbWUiOwotCWJpbmQoSU5CT1VORCwgc29ja2FkZHJfdW4oJGZpbGVuYW1lKSkKLQkJfHwgZGllICJFcnJvciBCaW5kaW5nICRmaWxlbmFtZTogJCFcbiI7Ci0JbGlzdGVuKElOQk9VTkQsIDUpIHx8IGRpZSAiRXJyb3IgTGlzdGVuaW5nOiAkIVxuIjsKLQotCW15ICgkaXAsICRzZW5kX2JhY2spOwotCW15ICR0YWxrID0gRmlsZUhhbmRsZS0+bmV3OwotCi0JICMgYWNjZXB0IGEgY29ubmVjdGlvbiBmcm9tIHRoZSBwYXJlbnQgcHJvY2Vzcy4gV2Ugb25seSBldmVyIGhhdmUKLQkgIyBoYXZlIG9uZSBjb25uZWN0aW9uIHdoZXJlIHdlIGV4Y2hhbmdlIDEgbGluZSBvZiBpbmZvIHdpdGggdGhlCi0JICMgcGFyZW50Li4gMSBsaW5lIGluIChJUCBhZGRyZXNzKSwgMSBsaW5lIG91dCAoSVAgKyBob3N0bmFtZSkuCi0JYWNjZXB0KCR0YWxrLCBJTkJPVU5EKSB8fCBkaWUgIkVycm9yIEFjY2VwdGluZzogJCFcbiI7Ci0JICMgZGlzYWJsZSBJL08gYnVmZmVyaW5nIGp1c3QgaW4gY2FzZQotCSR0YWxrLT5hdXRvZmx1c2g7Ci0JICMgd2hpbGUgdGhlIHBhcmVudCBrZWVwcyBzZW5kaW5nIGRhdGEsIHdlIGtlZXAgcmVzcG9uZGluZy4uCi0Jd2hpbGUoKCRpcCA9ICR0YWxrLT5nZXRsaW5lKSkgewotCQljaG9tcCgkaXApOwotCQkgIyByZXNvbHZlIHRoZSBJUCBpZiB0aW1lIHBlcm1pdHMgYW5kIHNlbmQgYmFjayB3aGF0IHdlIGZvdW5kLi4KLQkJJHNlbmRfYmFjayA9IHNwcmludGYoIiVzfCVzIiwgJGlwLCAmbnNsb29rdXAoJGlwKSk7Ci0JCSR0YWxrLT5wcmludCgkc2VuZF9iYWNrLiJcbiIpOwotCX0KLX0KLQotIyBwZXJmb3JtIGEgdGltZSByZXN0cmljdGVkIGhvc3RuYW1lIGxvb2t1cC4KLXN1YiBuc2xvb2t1cCB7Ci0JICMgZ2V0IHRoZSBJUCBhcyBhbiBhcmcKLQlteSAkaXAgPSBzaGlmdDsKLQlteSAkaG9zdG5hbWUgPSB1bmRlZjsKLQotCSAjIGRvIHRoZSBob3N0bmFtZSBsb29rdXAgaW5zaWRlIGFuIGV2YWwuIFRoZSBldmFsIHdpbGwgdXNlIHRoZQotCSAjIGFscmVhZHkgY29uZmlndXJlZCBTSUduYWwgaGFuZGxlciBhbmQgZHJvcCBvdXQgb2YgdGhlIHt9IGJsb2NrCi0JICMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBhbGFybSBvY2N1cmVkIG9yIG5vdC4KLQlldmFsIHsKLQkJYWxhcm0oJFRJTUVPVVQpOwotCQkkaG9zdG5hbWUgPSBnZXRob3N0YnlhZGRyKGdldGhvc3RieW5hbWUoJGlwKSwgQUZfSU5FVCk7Ci0JCWFsYXJtKDApOwotCX07Ci0JaWYgKCRAID1+IC9hbGFybS8pIHsKLQkJICMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcGVyaGFwcy4uCi0JCSMgcHJpbnQgImFsYXJtaW5nLCBpc24ndCBpdD8gKCRpcCkiOwotCX0KLQotCSAjIHJldHVybiB0aGUgaG9zdG5hbWUgb3IgdGhlIElQIGFkZHJlc3MgaXRzZWxmIGlmIHRoZXJlIGlzIG5vIGhvc3RuYW1lCi0JJGhvc3RuYW1lIG5lICIiID8gJGhvc3RuYW1lIDogJGlwOwotfQotCi0KZGlmZiAtLWdpdCBhL3N1cHBvcnQvcGhmX2FidXNlX2xvZy5jZ2kuaW4gYi9zdXBwb3J0L3BoZl9hYnVzZV9sb2cuY2dpLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjNmNTUzLi4wMDAwMDAwCi0tLSBhL3N1cHBvcnQvcGhmX2FidXNlX2xvZy5jZ2kuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIUBwZXJsYmluQAotCi0jIFRoaXMgc2NyaXB0IGlzIHVzZWQgdG8gZGV0ZWN0IHBlb3BsZSB0cnlpbmcgdG8gYWJ1c2UgdGhlIHNlY3VyaXR5IGhvbGUgd2hpY2gKLSMgZXhpc3RlZCBpbiBBIENHSSBzY3JpcHQgZGlyZXN0cmlidXRlZCB3aXRoIEFwYWNoZSAxLjAuMyBhbmQgZWFybGllciB2ZXJzaW9ucy4KLSMgWW91IGNhbiByZWRpcmVjdCB0aGVtIHRvIGhlcmUgdXNpbmcgdGhlICI8TG9jYXRpb24gL2NnaS1iaW4vcGhmKj4iIHN1Z2dlc3Rpb24KLSMgaW4gaHR0cGQuY29uZi4gIAotIwotIyBUaGUgZm9ybWF0IGxvZ2dlZCB0byBpcwotIyAgICAiW2RhdGVdIHJlbW90ZV9hZGRyIHJlbW90ZV9ob3N0IFtkYXRlXSByZWZlcnJlciB1c2VyX2FnZW50Ii4KLQotJExPRyA9ICIvdmFyL2xvZy9waGZfbG9nIjsKLQotcmVxdWlyZSAiY3RpbWUucGwiOwotJHdoZW4gPSAmY3RpbWUodGltZSk7Ci0kd2hlbiA9fiBzL1xuLy9nbzsKLSRFTlZ7SFRUUF9VU0VSX0FHRU5UfSAuPSAiIHZpYSAkRU5We0hUVFBfVklBfSIgaWYoJEVOVntIVFRQX1ZJQX0pOwotCi1vcGVuKExPRywgIj4+JExPRyIpIHx8IGRpZSAiYm9vIGhvbywgcGhmX2xvZyAkISI7Ci1wcmludCBMT0cgIlskd2hlbl0gJEVOVntSRU1PVEVfQUREUn0gJEVOVntSRU1PVEVfSE9TVH0gJEVOVnskSFRUUF9SRUZFUkVSfSAkRU5We0hUVFBfVVNFUl9BR0VOVH1cbiI7Ci1jbG9zZShMT0cpOwotCi1wcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcclxuXHJcbjxCTElOSz5TbWlsZSwgeW91J3JlIG9uIENhbmRpZCBDYW1lcmEuPC9CTElOSz5cbiI7CmRpZmYgLS1naXQgYS9zdXBwb3J0L3JvdGF0ZWxvZ3MuYyBiL3N1cHBvcnQvcm90YXRlbG9ncy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzZiZDk3Li4wMDAwMDAwCi0tLSBhL3N1cHBvcnQvcm90YXRlbG9ncy5jCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIFNpbXBsZSBwcm9ncmFtIHRvIHJvdGF0ZSBBcGFjaGUgbG9ncyB3aXRob3V0IGhhdmluZyB0byBraWxsIHRoZSBzZXJ2ZXIuCi0gKgotICogQ29udHJpYnV0ZWQgYnkgQmVuIExhdXJpZSA8YmVuQGFsZ3JvdXAuY28udWs+Ci0gKgotICogMTIgTWFyIDE5OTYKLSAqLwotCi0KLSNkZWZpbmUgQlVGU0laRQkJNjU1MzYKLSNkZWZpbmUgTUFYX1BBVEgJMTAyNAotCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLQotaW50IG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBjaGFyIGJ1ZltCVUZTSVpFXSwgYnVmMltNQVhfUEFUSF07Ci0gICAgdGltZV90IHRMb2dFbmQgPSAwOwotICAgIHRpbWVfdCB0Um90YXRpb247Ci0gICAgaW50IG5Mb2dGRCA9IC0xOwotICAgIGludCBuUmVhZDsKLSAgICBjaGFyICpzekxvZ1Jvb3Q7Ci0KLSAgICBpZiAoYXJnYyAhPSAzKSB7Ci0JZnByaW50ZihzdGRlcnIsCi0JCSIlcyA8bG9nZmlsZT4gPHJvdGF0aW9uIHRpbWUgaW4gc2Vjb25kcz5cblxuIiwKLQkJYXJndlswXSk7Ci0jaWZkZWYgT1MyCi0JZnByaW50ZihzdGRlcnIsCi0JCSJBZGQgdGhpczpcblxuVHJhbnNmZXJMb2cgXCJ8JXMuZXhlIC9zb21lL3doZXJlIDg2NDAwXCJcblxuIiwKLQkJYXJndlswXSk7Ci0jZWxzZQotCWZwcmludGYoc3RkZXJyLAotCQkiQWRkIHRoaXM6XG5cblRyYW5zZmVyTG9nIFwifCVzIC9zb21lL3doZXJlIDg2NDAwXCJcblxuIiwKLQkJYXJndlswXSk7Ci0jZW5kaWYKLQlmcHJpbnRmKHN0ZGVyciwKLQkJInRvIGh0dHBkLmNvbmYuIFRoZSBnZW5lcmF0ZWQgbmFtZSB3aWxsIGJlIC9zb21lL3doZXJlLm5ubm4gIgotCQkid2hlcmUgbm5ubiBpcyB0aGVcbnN5c3RlbSB0aW1lIGF0IHdoaWNoIHRoZSBsb2cgbm9taW5hbGx5ICIKLQkJInN0YXJ0cyAoTi5CLiB0aGlzIHRpbWUgd2lsbCBhbHdheXMgYmUgYVxubXVsdGlwbGUgb2YgdGhlICIKLQkJInJvdGF0aW9uIHRpbWUsIHNvIHlvdSBjYW4gc3luY2hyb25pemUgY3JvbiBzY3JpcHRzIHdpdGggaXQpLlxuIgotCQkiQXQgdGhlIGVuZCBvZiBlYWNoIHJvdGF0aW9uIHRpbWUgYSBuZXcgbG9nIGlzIHN0YXJ0ZWQuXG4iKTsKLQlleGl0KDEpOwotICAgIH0KLQotICAgIHN6TG9nUm9vdCA9IGFyZ3ZbMV07Ci0gICAgdFJvdGF0aW9uID0gYXRvaShhcmd2WzJdKTsKLSAgICBpZiAodFJvdGF0aW9uIDw9IDApIHsKLQlmcHJpbnRmKHN0ZGVyciwgIlJvdGF0aW9uIHRpbWUgbXVzdCBiZSA+IDBcbiIpOwotCWV4aXQoNik7Ci0gICAgfQotCi0gICAgZm9yICg7OykgewotCW5SZWFkID0gcmVhZCgwLCBidWYsIHNpemVvZiBidWYpOwotCWlmIChuUmVhZCA9PSAwKQotCSAgICBleGl0KDMpOwotCWlmIChuUmVhZCA8IDApCi0JICAgIGlmIChlcnJubyAhPSBFSU5UUikKLQkJZXhpdCg0KTsKLQlpZiAobkxvZ0ZEID49IDAgJiYgKHRpbWUoTlVMTCkgPj0gdExvZ0VuZCB8fCBuUmVhZCA8IDApKSB7Ci0JICAgIGNsb3NlKG5Mb2dGRCk7Ci0JICAgIG5Mb2dGRCA9IC0xOwotCX0KLQlpZiAobkxvZ0ZEIDwgMCkgewotCSAgICB0aW1lX3QgdExvZ1N0YXJ0ID0gKHRpbWUoTlVMTCkgLyB0Um90YXRpb24pICogdFJvdGF0aW9uOwotCSAgICBzcHJpbnRmKGJ1ZjIsICIlcy4lMDEwZCIsIHN6TG9nUm9vdCwgKGludCkgdExvZ1N0YXJ0KTsKLQkgICAgdExvZ0VuZCA9IHRMb2dTdGFydCArIHRSb3RhdGlvbjsKLQkgICAgbkxvZ0ZEID0gb3BlbihidWYyLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0FQUEVORCwgMDY2Nik7Ci0JICAgIGlmIChuTG9nRkQgPCAwKSB7Ci0JCXBlcnJvcihidWYyKTsKLQkJZXhpdCgyKTsKLQkgICAgfQotCX0KLQlpZiAod3JpdGUobkxvZ0ZELCBidWYsIG5SZWFkKSAhPSBuUmVhZCkgewotCSAgICBwZXJyb3IoYnVmMik7Ci0JICAgIGV4aXQoNSk7Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3N1cHBvcnQvcm90YXRlbG9ncy5kc3AgYi9zdXBwb3J0L3JvdGF0ZWxvZ3MuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTAyMDlkLi4wMDAwMDAwCi0tLSBhL3N1cHBvcnQvcm90YXRlbG9ncy5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9InJvdGF0ZWxvZ3MiIC0gUGFja2FnZSBPd25lcj08ND4KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDUuMDAKLSMgKiogRE8gTk9UIEVESVQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzCi0KLUNGRz1yb3RhdGVsb2dzIC0gV2luMzIgRGVidWcKLSFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAicm90YXRlbG9ncy5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgInJvdGF0ZWxvZ3MubWFrIiBDRkc9InJvdGF0ZWxvZ3MgLSBXaW4zMiBEZWJ1ZyIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJyb3RhdGVsb2dzIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uXAotICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFICJyb3RhdGVsb2dzIC0gV2luMzIgRGVidWciIChiYXNlZCBvblwKLSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJyb3RhdGVsb2dzIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9JICIuLi9pbmNsdWRlIiAvSSAiLi4vbGliL2Fwci9pbmNsdWRlIiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0KLSFFTFNFSUYgICIkKENGRykiID09ICJyb3RhdGVsb2dzIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIgotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWmkgL09kIC9JICIuLi9pbmNsdWRlIiAvSSAiLi4vbGliL2Fwci9pbmNsdWRlIiAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0Ci0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJyb3RhdGVsb2dzIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAicm90YXRlbG9ncyAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxyb3RhdGVsb2dzLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL3N1cHBvcnQvc3BsaXQtbG9nZmlsZS5pbiBiL3N1cHBvcnQvc3BsaXQtbG9nZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkZTJlYi4uMDAwMDAwMAotLS0gYS9zdXBwb3J0L3NwbGl0LWxvZ2ZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0jIUBwZXJsYmluQAotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0jCi0jIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSMgYXJlIG1ldDoKLSMKLSMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIwotIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSMgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyAgICBkaXN0cmlidXRpb24uCi0jCi0jIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotIyAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotIyAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSMgICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0jICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSMgICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSMKLSMgNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSMgICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0jICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotIyAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSMKLSMgNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0jICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotIyAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotIyBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIyBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0jIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0jIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0jIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotIyBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSMgU1VDSCBEQU1BR0UuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0jIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotIyBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSMgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotCi0jIFRoaXMgc2NyaXB0IHdpbGwgdGFrZSBhIGNvbWJpbmVkIFdlYiBzZXJ2ZXIgYWNjZXNzCi0jIGxvZyBmaWxlIGFuZCBicmVhayBpdHMgY29udGVudHMgaW50byBzZXBhcmF0ZSBmaWxlcy4KLSMgSXQgYXNzdW1lcyB0aGF0IHRoZSBmaXJzdCBmaWVsZCBvZiBlYWNoIGxpbmUgaXMgdGhlCi0jIHZpcnR1YWwgaG9zdCBpZGVudGl0eSAocHV0IHRoZXJlIGJ5ICIldiIpLCBhbmQgdGhhdAotIyB0aGUgbG9nZmlsZXMgc2hvdWxkIGJlIG5hbWVkIHRoYXQrIi5sb2ciIGluIHRoZSBjdXJyZW50Ci0jIGRpcmVjdG9yeS4KLSMKLSMgVGhlIGNvbWJpbmVkIGxvZyBmaWxlIGlzIHJlYWQgZnJvbSBzdGRpbi4gUmVjb3JkcyByZWFkCi0jIHdpbGwgYmUgYXBwZW5kZWQgdG8gYW55IGV4aXN0aW5nIGxvZyBmaWxlcy4KLSMKLSVpc19vcGVuID0gKCk7Ci0KLXdoaWxlICgkbG9nX2xpbmUgPSA8U1RESU4+KSB7Ci0gICAgIwotICAgICMgR2V0IHRoZSBmaXJzdCB0b2tlbiBmcm9tIHRoZSBsb2cgcmVjb3JkOyBpdCdzIHRoZQotICAgICMgaWRlbnRpdHkgb2YgdGhlIHZpcnR1YWwgaG9zdCB0byB3aGljaCB0aGUgcmVjb3JkCi0gICAgIyBhcHBsaWVzLgotICAgICMKLSAgICAoJHZob3N0KSA9IHNwbGl0ICgvXHMvLCAkbG9nX2xpbmUpOwotICAgICMKLSAgICAjIE5vcm1hbGl6ZSB0aGUgdmlydHVhbCBob3N0IG5hbWUgdG8gYWxsIGxvd2VyY2FzZS4KLSAgICAjIElmIGl0J3MgYmxhbmssIHRoZSByZXF1ZXN0IHdhcyBoYW5kbGVkIGJ5IHRoZSBkZWZhdWx0Ci0gICAgIyBzZXJ2ZXIsIHNvIHN1cHBseSBhIGRlZmF1bHQgbmFtZS4gIFRoaXMgc2hvdWxkbid0Ci0gICAgIyBoYXBwZW4sIGJ1dCBjYXV0aW9uIHJvY2tzLgotICAgICMKLSAgICAkdmhvc3QgPSBsYyAoJHZob3N0KSBvciAiYWNjZXNzIjsKLSAgICAjCi0gICAgIyBJZiB0aGUgbG9nIGZpbGUgZm9yIHRoaXMgdmlydHVhbCBob3N0IGlzbid0IG9wZW5lZAotICAgICMgeWV0LCBkbyBpdCBub3cuCi0gICAgIwotICAgIGlmICghICRpc19vcGVueyR2aG9zdH0pIHsKLSAgICAgICAgb3BlbiAkdmhvc3QsICI+PiR7dmhvc3R9LmxvZyIKLSAgICAgICAgICAgIG9yIGRpZSAoIkNhbid0IG9wZW4gJHt2aG9zdH0ubG9nIik7Ci0gICAgICAgICRpc19vcGVueyR2aG9zdH0gPSAxOwotICAgIH0KLSAgICAjCi0gICAgIyBTdHJpcCBvZmYgdGhlIGZpcnN0IHRva2VuICh3aGljaCBtYXkgYmUgbnVsbCBpbiB0aGUKLSAgICAjIGNhc2Ugb2YgdGhlIGRlZmF1bHQgc2VydmVyKSwgYW5kIHdyaXRlIHRoZSBlZGl0ZWQKLSAgICAjIHJlY29yZCB0byB0aGUgY3VycmVudCBsb2cgZmlsZS4KLSAgICAjCi0gICAgJGxvZ19saW5lID1+IHMvXlxTKlxzKy8vOwotICAgIHByaW50ZiAkdmhvc3QgIiVzIiwgJGxvZ19saW5lOwotfQotZXhpdCAwOwpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9zdWV4ZWMuYyBiL3N1cHBvcnQvc3VleGVjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZjNmY2MuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9zdWV4ZWMuYworKysgL2Rldi9udWxsCkBAIC0xLDU2NiArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBzdWV4ZWMuYyAtLSAiV3JhcHBlciIgc3VwcG9ydCBwcm9ncmFtIGZvciBzdUVYRUMgYmVoYXZpb3VyIGZvciBBcGFjaGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBOT1RFISA6IERPIE5PVCBlZGl0IHRoaXMgY29kZSEhISAgVW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZywKLSAqICAgICAgICAgZWRpdGluZyB0aGlzIGNvZGUgbWlnaHQgb3BlbiB1cCB5b3VyIHN5c3RlbSBpbiB1bmV4cGVjdGVkIAotICogICAgICAgICB3YXlzIHRvIHdvdWxkLWJlIGNyYWNrZXJzLiAgRXZlcnkgcHJlY2F1dGlvbiBoYXMgYmVlbiB0YWtlbiAKLSAqICAgICAgICAgdG8gbWFrZSB0aGlzIGNvZGUgYXMgc2FmZSBhcyBwb3NzaWJsZTsgYWx0ZXIgaXQgYXQgeW91ciBvd24KLSAqICAgICAgICAgcmlzay4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKgotICovCi0KLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLSNpbmNsdWRlICJzdWV4ZWMuaCIKLQotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVGhlcmUgaXMgbm8gaW5pdGdyb3VwcygpIGluIFFOWCwgc28gSSBiZWxpZXZlIHRoaXMgaXMgc2FmZSA6LSkKLSAqIFVzZSBjYyAtb3N1ZXhlYyAtMyAtTyAtbWYgLURRTlggc3VleGVjLmMgdG8gY29tcGlsZS4KLSAqCi0gKiBNYXkgMTcsIDE5OTcuCi0gKiBJZ29yIE4uIEtvdmFsZW5rbyAtLSBpbmZvaEBtYWlsLndwbHVzLm5ldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmIGRlZmluZWQoTkVFRF9JTklUR1JPVVBTKQotaW50IGluaXRncm91cHMoY29uc3QgY2hhciAqbmFtZSwgZ2lkX3QgYmFzZWdpZCkKLXsKLS8qIFFOWCBhbmQgTVBFIGRvIG5vdCBhcHBlYXIgdG8gc3VwcG9ydCBzdXBwbGVtZW50YXJ5IGdyb3Vwcy4gKi8KLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQQVRIX01BWCkKLSNkZWZpbmUgQVBfTUFYUEFUSCBQQVRIX01BWAotI2VsaWYgZGVmaW5lZChNQVhQQVRITEVOKQotI2RlZmluZSBBUF9NQVhQQVRIIE1BWFBBVEhMRU4KLSNlbHNlCi0jZGVmaW5lIEFQX01BWFBBVEggODE5MgotI2VuZGlmCi0KLSNkZWZpbmUgQVBfRU5WQlVGIDI1NgotCi1leHRlcm4gY2hhciAqKmVudmlyb247Ci1zdGF0aWMgRklMRSAqbG9nID0gTlVMTDsKLQotY2hhciAqc2FmZV9lbnZfbHN0W10gPQotewotICAgICJBVVRIX1RZUEUiLAotICAgICJDT05URU5UX0xFTkdUSCIsCi0gICAgIkNPTlRFTlRfVFlQRSIsCi0gICAgIkRBVEVfR01UIiwKLSAgICAiREFURV9MT0NBTCIsCi0gICAgIkRPQ1VNRU5UX05BTUUiLAotICAgICJET0NVTUVOVF9QQVRIX0lORk8iLAotICAgICJET0NVTUVOVF9ST09UIiwKLSAgICAiRE9DVU1FTlRfVVJJIiwKLSAgICAiRklMRVBBVEhfSU5GTyIsCi0gICAgIkdBVEVXQVlfSU5URVJGQUNFIiwKLSAgICAiTEFTVF9NT0RJRklFRCIsCi0gICAgIlBBVEhfSU5GTyIsCi0gICAgIlBBVEhfVFJBTlNMQVRFRCIsCi0gICAgIlFVRVJZX1NUUklORyIsCi0gICAgIlFVRVJZX1NUUklOR19VTkVTQ0FQRUQiLAotICAgICJSRU1PVEVfQUREUiIsCi0gICAgIlJFTU9URV9IT1NUIiwKLSAgICAiUkVNT1RFX0lERU5UIiwKLSAgICAiUkVNT1RFX1BPUlQiLAotICAgICJSRU1PVEVfVVNFUiIsCi0gICAgIlJFRElSRUNUX1FVRVJZX1NUUklORyIsCi0gICAgIlJFRElSRUNUX1NUQVRVUyIsCi0gICAgIlJFRElSRUNUX1VSTCIsCi0gICAgIlJFUVVFU1RfTUVUSE9EIiwKLSAgICAiUkVRVUVTVF9VUkkiLAotICAgICJTQ1JJUFRfRklMRU5BTUUiLAotICAgICJTQ1JJUFRfTkFNRSIsCi0gICAgIlNDUklQVF9VUkkiLAotICAgICJTQ1JJUFRfVVJMIiwKLSAgICAiU0VSVkVSX0FETUlOIiwKLSAgICAiU0VSVkVSX05BTUUiLAotICAgICJTRVJWRVJfQUREUiIsCi0gICAgIlNFUlZFUl9QT1JUIiwKLSAgICAiU0VSVkVSX1BST1RPQ09MIiwKLSAgICAiU0VSVkVSX1NPRlRXQVJFIiwKLSAgICAiVU5JUVVFX0lEIiwKLSAgICAiVVNFUl9OQU1FIiwKLSAgICAiVFoiLAotICAgIE5VTEwKLX07Ci0KLQotc3RhdGljIHZvaWQgZXJyX291dHB1dChjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCi17Ci0jaWZkZWYgTE9HX0VYRUMKLSAgICB0aW1lX3QgdGltZXZhcjsKLSAgICBzdHJ1Y3QgdG0gKmx0OwotCi0gICAgaWYgKCFsb2cpIHsKLQlpZiAoKGxvZyA9IGZvcGVuKExPR19FWEVDLCAiYSIpKSA9PSBOVUxMKSB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIG9wZW4gbG9nIGZpbGVcbiIpOwotCSAgICBwZXJyb3IoImZvcGVuIik7Ci0JICAgIGV4aXQoMSk7Ci0JfQotICAgIH0KLQotICAgIHRpbWUoJnRpbWV2YXIpOwotICAgIGx0ID0gbG9jYWx0aW1lKCZ0aW1ldmFyKTsKLQotICAgIGZwcmludGYobG9nLCAiWyVkLSUuMmQtJS4yZCAlLjJkOiUuMmQ6JS4yZF06ICIsCi0JICAgIGx0LT50bV95ZWFyICsgMTkwMCwgbHQtPnRtX21vbiArIDEsIGx0LT50bV9tZGF5LAotCSAgICBsdC0+dG1faG91ciwgbHQtPnRtX21pbiwgbHQtPnRtX3NlYyk7Ci0KLSAgICB2ZnByaW50Zihsb2csIGZtdCwgYXApOwotCi0gICAgZmZsdXNoKGxvZyk7Ci0jZW5kaWYgLyogTE9HX0VYRUMgKi8KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGxvZ19lcnIoY29uc3QgY2hhciAqZm10LC4uLikKLXsKLSNpZmRlZiBMT0dfRVhFQwotICAgIHZhX2xpc3QgYXA7Ci0KLSAgICB2YV9zdGFydChhcCwgZm10KTsKLSAgICBlcnJfb3V0cHV0KGZtdCwgYXApOwotICAgIHZhX2VuZChhcCk7Ci0jZW5kaWYgLyogTE9HX0VYRUMgKi8KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGNsZWFuX2Vudih2b2lkKQotewotICAgIGNoYXIgcGF0aGJ1Zls1MTJdOwotICAgIGNoYXIgKipjbGVhbmVudjsKLSAgICBjaGFyICoqZXA7Ci0gICAgaW50IGNpZHggPSAwOwotICAgIGludCBpZHg7Ci0KLQotICAgIGlmICgoY2xlYW5lbnYgPSAoY2hhciAqKikgY2FsbG9jKEFQX0VOVkJVRiwgc2l6ZW9mKGNoYXIgKikpKSA9PSBOVUxMKSB7Ci0gICAgICAgIGxvZ19lcnIoImZhaWxlZCB0byBtYWxsb2MgbWVtb3J5IGZvciBlbnZpcm9ubWVudFxuIik7Ci0JZXhpdCgxMjApOwotICAgIH0KLQotICAgIHNwcmludGYocGF0aGJ1ZiwgIlBBVEg9JXMiLCBTQUZFX1BBVEgpOwotICAgIGNsZWFuZW52W2NpZHhdID0gc3RyZHVwKHBhdGhidWYpOwotICAgIGNpZHgrKzsKLQotICAgIGZvciAoZXAgPSBlbnZpcm9uOyAqZXAgJiYgY2lkeCA8IEFQX0VOVkJVRi0xOyBlcCsrKSB7Ci0JaWYgKCFzdHJuY21wKCplcCwgIkhUVFBfIiwgNSkpIHsKLQkgICAgY2xlYW5lbnZbY2lkeF0gPSAqZXA7Ci0JICAgIGNpZHgrKzsKLQl9Ci0JZWxzZSB7Ci0JICAgIGZvciAoaWR4ID0gMDsgc2FmZV9lbnZfbHN0W2lkeF07IGlkeCsrKSB7Ci0JCWlmICghc3RybmNtcCgqZXAsIHNhZmVfZW52X2xzdFtpZHhdLAotCQkJICAgICBzdHJsZW4oc2FmZV9lbnZfbHN0W2lkeF0pKSkgewotCQkgICAgY2xlYW5lbnZbY2lkeF0gPSAqZXA7Ci0JCSAgICBjaWR4Kys7Ci0JCSAgICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIGNsZWFuZW52W2NpZHhdID0gTlVMTDsKLQotICAgIGVudmlyb24gPSBjbGVhbmVudjsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgICBpbnQgdXNlcmRpciA9IDA7CQkvKiB+dXNlcmRpciBmbGFnICAgICAgICAgICAgICovCi0gICAgdWlkX3QgdWlkOwkJCS8qIHVzZXIgaW5mb3JtYXRpb24gICAgICAgICAgKi8KLSAgICBnaWRfdCBnaWQ7CQkJLyogdGFyZ2V0IGdyb3VwIHBsYWNlaG9sZGVyICAqLwotICAgIGNoYXIgKnRhcmdldF91bmFtZTsJCS8qIHRhcmdldCB1c2VyIG5hbWUgICAgICAgICAgKi8KLSAgICBjaGFyICp0YXJnZXRfZ25hbWU7CQkvKiB0YXJnZXQgZ3JvdXAgbmFtZSAgICAgICAgICovCi0gICAgY2hhciAqdGFyZ2V0X2hvbWVkaXI7CS8qIHRhcmdldCBob21lIGRpcmVjdG9yeSAgICAgKi8KLSAgICBjaGFyICphY3R1YWxfdW5hbWU7CQkvKiBhY3R1YWwgdXNlciBuYW1lICAgICAgICAgICovCi0gICAgY2hhciAqYWN0dWFsX2duYW1lOwkJLyogYWN0dWFsIGdyb3VwIG5hbWUgICAgICAgICAqLwotICAgIGNoYXIgKnByb2c7CQkJLyogbmFtZSBvZiB0aGlzIHByb2dyYW0gICAgICAqLwotICAgIGNoYXIgKmNtZDsJCQkvKiBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkICAgICovCi0gICAgY2hhciBjd2RbQVBfTUFYUEFUSF07CS8qIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKi8KLSAgICBjaGFyIGR3ZFtBUF9NQVhQQVRIXTsJLyogZG9jcm9vdCB3b3JraW5nIGRpcmVjdG9yeSAqLwotICAgIHN0cnVjdCBwYXNzd2QgKnB3OwkJLyogcGFzc3dvcmQgZW50cnkgaG9sZGVyICAgICAqLwotICAgIHN0cnVjdCBncm91cCAqZ3I7CQkvKiBncm91cCBlbnRyeSBob2xkZXIgICAgICAgICovCi0gICAgc3RydWN0IHN0YXQgZGlyX2luZm87CS8qIGRpcmVjdG9yeSBpbmZvIGhvbGRlciAgICAgKi8KLSAgICBzdHJ1Y3Qgc3RhdCBwcmdfaW5mbzsJLyogcHJvZ3JhbSBpbmZvIGhvbGRlciAgICAgICAqLwotCi0gICAgLyoKLSAgICAgKiBJZiB0aGVyZSBhcmUgYSBwcm9wZXIgbnVtYmVyIG9mIGFyZ3VtZW50cywgc2V0Ci0gICAgICogYWxsIG9mIHRoZW0gdG8gdmFyaWFibGVzLiAgT3RoZXJ3aXNlLCBlcnJvciBvdXQuCi0gICAgICovCi0gICAgcHJvZyA9IGFyZ3ZbMF07Ci0gICAgaWYgKGFyZ2MgPCA0KSB7Ci0JbG9nX2VycigidG9vIGZldyBhcmd1bWVudHNcbiIpOwotCWV4aXQoMTAxKTsKLSAgICB9Ci0gICAgdGFyZ2V0X3VuYW1lID0gYXJndlsxXTsKLSAgICB0YXJnZXRfZ25hbWUgPSBhcmd2WzJdOwotICAgIGNtZCA9IGFyZ3ZbM107Ci0KLSAgICAvKgotICAgICAqIENoZWNrIGV4aXN0ZW5jZS92YWxpZGl0eSBvZiB0aGUgVUlEIG9mIHRoZSB1c2VyCi0gICAgICogcnVubmluZyB0aGlzIHByb2dyYW0uICBFcnJvciBvdXQgaWYgaW52YWxpZC4KLSAgICAgKi8KLSAgICB1aWQgPSBnZXR1aWQoKTsKLSAgICBpZiAoKHB3ID0gZ2V0cHd1aWQodWlkKSkgPT0gTlVMTCkgewotCWxvZ19lcnIoImludmFsaWQgdWlkOiAoJWxkKVxuIiwgdWlkKTsKLQlleGl0KDEwMik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIHVzZXIgcnVubmluZyB0aGlzIHByb2dyYW0KLSAgICAgKiBpcyB0aGUgdXNlciBhbGxvd2VkIHRvIGRvIHNvIGFzIGRlZmluZWQgaW4KLSAgICAgKiBzdWV4ZWMuaC4gIElmIG5vdCB0aGUgYWxsb3dlZCB1c2VyLCBlcnJvciBvdXQuCi0gICAgICovCi0jaWZkZWYgX09TRF9QT1NJWAotICAgIC8qIFVzZXIgbmFtZSBjb21wYXJpc29ucyBhcmUgY2FzZSBpbnNlbnNpdGl2ZSBvbiBCUzIwMDAvT1NEICovCi0gICAgaWYgKHN0cmNhc2VjbXAoSFRUUERfVVNFUiwgcHctPnB3X25hbWUpKSB7Ci0gICAgICAgIGxvZ19lcnIoInVzZXIgbWlzbWF0Y2ggKCVzIGluc3RlYWQgb2YgJXMpXG4iLCBwdy0+cHdfbmFtZSwgSFRUUERfVVNFUik7Ci0JZXhpdCgxMDMpOwotICAgIH0KLSNlbHNlICAvKl9PU0RfUE9TSVgqLwotICAgIGlmIChzdHJjbXAoSFRUUERfVVNFUiwgcHctPnB3X25hbWUpKSB7Ci0gICAgICAgIGxvZ19lcnIoInVzZXIgbWlzbWF0Y2ggKCVzIGluc3RlYWQgb2YgJXMpXG4iLCBwdy0+cHdfbmFtZSwgSFRUUERfVVNFUik7Ci0JZXhpdCgxMDMpOwotICAgIH0KLSNlbmRpZiAvKl9PU0RfUE9TSVgqLwotCi0gICAgLyoKLSAgICAgKiBDaGVjayBmb3IgYSBsZWFkaW5nICcvJyAoYWJzb2x1dGUgcGF0aCkgaW4gdGhlIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQsCi0gICAgICogb3IgYXR0ZW1wdHMgdG8gYmFjayB1cCBvdXQgb2YgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LAotICAgICAqIHRvIHByb3RlY3QgYWdhaW5zdCBhdHRhY2tzLiAgSWYgYW55IGFyZQotICAgICAqIGZvdW5kLCBlcnJvciBvdXQuICBOYXVnaHR5IG5hdWdodHkgY3JhY2tlcnMuCi0gICAgICovCi0gICAgaWYgKChjbWRbMF0gPT0gJy8nKSB8fCAoIXN0cm5jbXAoY21kLCAiLi4vIiwgMykpCi0JfHwgKHN0cnN0cihjbWQsICIvLi4vIikgIT0gTlVMTCkpIHsKLSAgICAgICAgbG9nX2VycigiaW52YWxpZCBjb21tYW5kICglcylcbiIsIGNtZCk7Ci0JZXhpdCgxMDQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSB+dXNlcmRpciByZXF1ZXN0LiAgSWYKLSAgICAgKiBzbywgc2V0IHRoZSBmbGFnLCBhbmQgcmVtb3ZlIHRoZSAnficgZnJvbSB0aGUKLSAgICAgKiB0YXJnZXQgdXNlcm5hbWUuCi0gICAgICovCi0gICAgaWYgKCFzdHJuY21wKCJ+IiwgdGFyZ2V0X3VuYW1lLCAxKSkgewotCXRhcmdldF91bmFtZSsrOwotCXVzZXJkaXIgPSAxOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRXJyb3Igb3V0IGlmIHRoZSB0YXJnZXQgdXNlcm5hbWUgaXMgaW52YWxpZC4KLSAgICAgKi8KLSAgICBpZiAoKHB3ID0gZ2V0cHduYW0odGFyZ2V0X3VuYW1lKSkgPT0gTlVMTCkgewotCWxvZ19lcnIoImludmFsaWQgdGFyZ2V0IHVzZXIgbmFtZTogKCVzKVxuIiwgdGFyZ2V0X3VuYW1lKTsKLQlleGl0KDEwNSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBFcnJvciBvdXQgaWYgdGhlIHRhcmdldCBncm91cCBuYW1lIGlzIGludmFsaWQuCi0gICAgICovCi0gICAgaWYgKHN0cnNwbih0YXJnZXRfZ25hbWUsICIxMjM0NTY3ODkwIikgIT0gc3RybGVuKHRhcmdldF9nbmFtZSkpIHsKLQlpZiAoKGdyID0gZ2V0Z3JuYW0odGFyZ2V0X2duYW1lKSkgPT0gTlVMTCkgewotCSAgICBsb2dfZXJyKCJpbnZhbGlkIHRhcmdldCBncm91cCBuYW1lOiAoJXMpXG4iLCB0YXJnZXRfZ25hbWUpOwotCSAgICBleGl0KDEwNik7Ci0JfQotCWdpZCA9IGdyLT5ncl9naWQ7Ci0JYWN0dWFsX2duYW1lID0gc3RyZHVwKGdyLT5ncl9uYW1lKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JZ2lkID0gYXRvaSh0YXJnZXRfZ25hbWUpOwotCWFjdHVhbF9nbmFtZSA9IHN0cmR1cCh0YXJnZXRfZ25hbWUpOwotICAgIH0KLQotI2lmZGVmIF9PU0RfUE9TSVgKLSAgICAvKgotICAgICAqIEluaXRpYWxpemUgQlMyMDAwIHVzZXIgZW52aXJvbm1lbnQKLSAgICAgKi8KLSAgICB7Ci0JcGlkX3QgcGlkOwotCWludCBzdGF0dXM7Ci0KLQlzd2l0Y2ggKHBpZCA9IHVmb3JrKHRhcmdldF91bmFtZSkpCi0JewotCWNhc2UgLTE6CS8qIEVycm9yICovCi0JICAgIGxvZ19lcnIoImZhaWxlZCB0byBzZXR1cCBiczIwMDAgZW52aXJvbm1lbnQgZm9yIHVzZXIgJXM6ICVzXG4iLAotCQkgICAgdGFyZ2V0X3VuYW1lLCBzdHJlcnJvcihlcnJubykpOwotCSAgICBleGl0KDE1MCk7Ci0JY2FzZSAwOgkvKiBDaGlsZCAqLwotCSAgICBicmVhazsKLQlkZWZhdWx0OgkvKiBGYXRoZXIgKi8KLQkgICAgd2hpbGUgKHBpZCAhPSB3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCkpCi0JCTsKLQkgICAgLyogQEBAIEZJWE1FOiBzaG91bGQgd2UgZGVhbCB3aXRoIFNUT1Agc2lnbmFscyBhcyB3ZWxsPyAqLwotCSAgICBpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkKLQkJa2lsbCAoZ2V0cGlkKCksIFdURVJNU0lHKHN0YXR1cykpOwotCSAgICBleGl0KFdFWElUU1RBVFVTKHN0YXR1cykpOwotCX0KLSAgICB9Ci0jZW5kaWYgLypfT1NEX1BPU0lYKi8KLQotICAgIC8qCi0gICAgICogU2F2ZSB0aGVzZSBmb3IgbGF0ZXIgc2luY2UgaW5pdGdyb3VwcyB3aWxsIGhvc2UgdGhlIHN0cnVjdAotICAgICAqLwotICAgIHVpZCA9IHB3LT5wd191aWQ7Ci0gICAgYWN0dWFsX3VuYW1lID0gc3RyZHVwKHB3LT5wd19uYW1lKTsKLSAgICB0YXJnZXRfaG9tZWRpciA9IHN0cmR1cChwdy0+cHdfZGlyKTsKLQotICAgIC8qCi0gICAgICogTG9nIHRoZSB0cmFuc2FjdGlvbiBoZXJlIHRvIGJlIHN1cmUgd2UgaGF2ZSBhbiBvcGVuIGxvZyAKLSAgICAgKiBiZWZvcmUgd2Ugc2V0dWlkKCkuCi0gICAgICovCi0gICAgbG9nX2VycigidWlkOiAoJXMvJXMpIGdpZDogKCVzLyVzKSBjbWQ6ICVzXG4iLAotCSAgICB0YXJnZXRfdW5hbWUsIGFjdHVhbF91bmFtZSwKLQkgICAgdGFyZ2V0X2duYW1lLCBhY3R1YWxfZ25hbWUsCi0JICAgIGNtZCk7Ci0KLSAgICAvKgotICAgICAqIEVycm9yIG91dCBpZiBhdHRlbXB0IGlzIG1hZGUgdG8gZXhlY3V0ZSBhcyByb290IG9yIGFzCi0gICAgICogYSBVSUQgbGVzcyB0aGFuIFVJRF9NSU4uICBUc2sgdHNrLgotICAgICAqLwotICAgIGlmICgodWlkID09IDApIHx8ICh1aWQgPCBVSURfTUlOKSkgewotCWxvZ19lcnIoImNhbm5vdCBydW4gYXMgZm9yYmlkZGVuIHVpZCAoJWQvJXMpXG4iLCB1aWQsIGNtZCk7Ci0JZXhpdCgxMDcpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRXJyb3Igb3V0IGlmIGF0dGVtcHQgaXMgbWFkZSB0byBleGVjdXRlIGFzIHJvb3QgZ3JvdXAKLSAgICAgKiBvciBhcyBhIEdJRCBsZXNzIHRoYW4gR0lEX01JTi4gIFRzayB0c2suCi0gICAgICovCi0gICAgaWYgKChnaWQgPT0gMCkgfHwgKGdpZCA8IEdJRF9NSU4pKSB7Ci0JbG9nX2VycigiY2Fubm90IHJ1biBhcyBmb3JiaWRkZW4gZ2lkICglZC8lcylcbiIsIGdpZCwgY21kKTsKLQlleGl0KDEwOCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDaGFuZ2UgVUlEL0dJRCBoZXJlIHNvIHRoYXQgdGhlIGZvbGxvd2luZyB0ZXN0cyB3b3JrIG92ZXIgTkZTLgotICAgICAqCi0gICAgICogSW5pdGlhbGl6ZSB0aGUgZ3JvdXAgYWNjZXNzIGxpc3QgZm9yIHRoZSB0YXJnZXQgdXNlciwKLSAgICAgKiBhbmQgc2V0Z2lkKCkgdG8gdGhlIHRhcmdldCBncm91cC4gSWYgdW5zdWNjZXNzZnVsLCBlcnJvciBvdXQuCi0gICAgICovCi0gICAgaWYgKCgoc2V0Z2lkKGdpZCkpICE9IDApIHx8IChpbml0Z3JvdXBzKGFjdHVhbF91bmFtZSwgZ2lkKSAhPSAwKSkgewotCWxvZ19lcnIoImZhaWxlZCB0byBzZXRnaWQgKCVsZDogJXMpXG4iLCBnaWQsIGNtZCk7Ci0JZXhpdCgxMDkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogc2V0dWlkKCkgdG8gdGhlIHRhcmdldCB1c2VyLiAgRXJyb3Igb3V0IG9uIGZhaWwuCi0gICAgICovCi0gICAgaWYgKChzZXR1aWQodWlkKSkgIT0gMCkgewotCWxvZ19lcnIoImZhaWxlZCB0byBzZXR1aWQgKCVsZDogJXMpXG4iLCB1aWQsIGNtZCk7Ci0JZXhpdCgxMTApOwotICAgIH0KLQotICAgIC8qCi0gICAgICogR2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhcyB3ZWxsIGFzIHRoZSBwcm9wZXIKLSAgICAgKiBkb2N1bWVudCByb290IChkZXBlbmRhbnQgdXBvbiB3aGV0aGVyIG9yIG5vdCBpdCBpcyBhCi0gICAgICogfnVzZXJkaXIgcmVxdWVzdCkuICBFcnJvciBvdXQgaWYgd2UgY2Fubm90IGdldCBlaXRoZXIgb25lLAotICAgICAqIG9yIGlmIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlzIG5vdCBpbiB0aGUgZG9jcm9vdC4KLSAgICAgKiBVc2UgY2hkaXIoKXMgYW5kIGdldGN3ZCgpcyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIHN5bWxpbmtlZAotICAgICAqIGRpcmVjdG9yaWVzLiAgWXVjay4KLSAgICAgKi8KLSAgICBpZiAoZ2V0Y3dkKGN3ZCwgQVBfTUFYUEFUSCkgPT0gTlVMTCkgewotCWxvZ19lcnIoImNhbm5vdCBnZXQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeVxuIik7Ci0JZXhpdCgxMTEpOwotICAgIH0KLQotICAgIGlmICh1c2VyZGlyKSB7Ci0JaWYgKCgoY2hkaXIodGFyZ2V0X2hvbWVkaXIpKSAhPSAwKSB8fAotCSAgICAoKGNoZGlyKFVTRVJESVJfU1VGRklYKSkgIT0gMCkgfHwKLQkgICAgKChnZXRjd2QoZHdkLCBBUF9NQVhQQVRIKSkgPT0gTlVMTCkgfHwKLQkgICAgKChjaGRpcihjd2QpKSAhPSAwKSkgewotCSAgICBsb2dfZXJyKCJjYW5ub3QgZ2V0IGRvY3Jvb3QgaW5mb3JtYXRpb24gKCVzKVxuIiwgdGFyZ2V0X2hvbWVkaXIpOwotCSAgICBleGl0KDExMik7Ci0JfQotICAgIH0KLSAgICBlbHNlIHsKLQlpZiAoKChjaGRpcihET0NfUk9PVCkpICE9IDApIHx8Ci0JICAgICgoZ2V0Y3dkKGR3ZCwgQVBfTUFYUEFUSCkpID09IE5VTEwpIHx8Ci0JICAgICgoY2hkaXIoY3dkKSkgIT0gMCkpIHsKLQkgICAgbG9nX2VycigiY2Fubm90IGdldCBkb2Nyb290IGluZm9ybWF0aW9uICglcylcbiIsIERPQ19ST09UKTsKLQkgICAgZXhpdCgxMTMpOwotCX0KLSAgICB9Ci0KLSAgICBpZiAoKHN0cm5jbXAoY3dkLCBkd2QsIHN0cmxlbihkd2QpKSkgIT0gMCkgewotCWxvZ19lcnIoImNvbW1hbmQgbm90IGluIGRvY3Jvb3QgKCVzLyVzKVxuIiwgY3dkLCBjbWQpOwotCWV4aXQoMTE0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFN0YXQgdGhlIGN3ZCBhbmQgdmVyaWZ5IGl0IGlzIGEgZGlyZWN0b3J5LCBvciBlcnJvciBvdXQuCi0gICAgICovCi0gICAgaWYgKCgobHN0YXQoY3dkLCAmZGlyX2luZm8pKSAhPSAwKSB8fCAhKFNfSVNESVIoZGlyX2luZm8uc3RfbW9kZSkpKSB7Ci0JbG9nX2VycigiY2Fubm90IHN0YXQgZGlyZWN0b3J5OiAoJXMpXG4iLCBjd2QpOwotCWV4aXQoMTE1KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEVycm9yIG91dCBpZiBjd2QgaXMgd3JpdGFibGUgYnkgb3RoZXJzLgotICAgICAqLwotICAgIGlmICgoZGlyX2luZm8uc3RfbW9kZSAmIFNfSVdPVEgpIHx8IChkaXJfaW5mby5zdF9tb2RlICYgU19JV0dSUCkpIHsKLQlsb2dfZXJyKCJkaXJlY3RvcnkgaXMgd3JpdGFibGUgYnkgb3RoZXJzOiAoJXMpXG4iLCBjd2QpOwotCWV4aXQoMTE2KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEVycm9yIG91dCBpZiB3ZSBjYW5ub3Qgc3RhdCB0aGUgcHJvZ3JhbS4KLSAgICAgKi8KLSAgICBpZiAoKChsc3RhdChjbWQsICZwcmdfaW5mbykpICE9IDApIHx8IChTX0lTTE5LKHByZ19pbmZvLnN0X21vZGUpKSkgewotCWxvZ19lcnIoImNhbm5vdCBzdGF0IHByb2dyYW06ICglcylcbiIsIGNtZCk7Ci0JZXhpdCgxMTcpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRXJyb3Igb3V0IGlmIHRoZSBwcm9ncmFtIGlzIHdyaXRhYmxlIGJ5IG90aGVycy4KLSAgICAgKi8KLSAgICBpZiAoKHByZ19pbmZvLnN0X21vZGUgJiBTX0lXT1RIKSB8fCAocHJnX2luZm8uc3RfbW9kZSAmIFNfSVdHUlApKSB7Ci0JbG9nX2VycigiZmlsZSBpcyB3cml0YWJsZSBieSBvdGhlcnM6ICglcy8lcylcbiIsIGN3ZCwgY21kKTsKLQlleGl0KDExOCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBFcnJvciBvdXQgaWYgdGhlIGZpbGUgaXMgc2V0dWlkIG9yIHNldGdpZC4KLSAgICAgKi8KLSAgICBpZiAoKHByZ19pbmZvLnN0X21vZGUgJiBTX0lTVUlEKSB8fCAocHJnX2luZm8uc3RfbW9kZSAmIFNfSVNHSUQpKSB7Ci0JbG9nX2VycigiZmlsZSBpcyBlaXRoZXIgc2V0dWlkIG9yIHNldGdpZDogKCVzLyVzKVxuIiwgY3dkLCBjbWQpOwotCWV4aXQoMTE5KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEVycm9yIG91dCBpZiB0aGUgdGFyZ2V0IG5hbWUvZ3JvdXAgaXMgZGlmZmVyZW50IGZyb20KLSAgICAgKiB0aGUgbmFtZS9ncm91cCBvZiB0aGUgY3dkIG9yIHRoZSBwcm9ncmFtLgotICAgICAqLwotICAgIGlmICgodWlkICE9IGRpcl9pbmZvLnN0X3VpZCkgfHwKLQkoZ2lkICE9IGRpcl9pbmZvLnN0X2dpZCkgfHwKLQkodWlkICE9IHByZ19pbmZvLnN0X3VpZCkgfHwKLQkoZ2lkICE9IHByZ19pbmZvLnN0X2dpZCkpIHsKLQlsb2dfZXJyKCJ0YXJnZXQgdWlkL2dpZCAoJWxkLyVsZCkgbWlzbWF0Y2ggIgotCQkid2l0aCBkaXJlY3RvcnkgKCVsZC8lbGQpIG9yIHByb2dyYW0gKCVsZC8lbGQpXG4iLAotCQl1aWQsIGdpZCwKLQkJZGlyX2luZm8uc3RfdWlkLCBkaXJfaW5mby5zdF9naWQsCi0JCXByZ19pbmZvLnN0X3VpZCwgcHJnX2luZm8uc3RfZ2lkKTsKLQlleGl0KDEyMCk7Ci0gICAgfQotICAgIC8qCi0gICAgICogRXJyb3Igb3V0IGlmIHRoZSBwcm9ncmFtIGlzIG5vdCBleGVjdXRhYmxlIGZvciB0aGUgdXNlci4KLSAgICAgKiBPdGhlcndpc2UsIHNoZSB3b24ndCBmaW5kIGFueSBlcnJvciBpbiB0aGUgbG9ncyBleGNlcHQgZm9yCi0gICAgICogIltlcnJvcl0gUHJlbWF0dXJlIGVuZCBvZiBzY3JpcHQgaGVhZGVyczogLi4uIgotICAgICAqLwotICAgIGlmICghKHByZ19pbmZvLnN0X21vZGUgJiBTX0lYVVNSKSkgewotCWxvZ19lcnIoImZpbGUgaGFzIG5vIGV4ZWN1dGUgcGVybWlzc2lvbjogKCVzLyVzKVxuIiwgY3dkLCBjbWQpOwotCWV4aXQoMTIxKTsKLSAgICB9Ci0KLSAgICBjbGVhbl9lbnYoKTsKLQotICAgIC8qIAotICAgICAqIEJlIHN1cmUgdG8gY2xvc2UgdGhlIGxvZyBmaWxlIHNvIHRoZSBDR0kgY2FuJ3QKLSAgICAgKiBtZXNzIHdpdGggaXQuICBJZiB0aGUgZXhlYyBmYWlscywgaXQgd2lsbCBiZSByZW9wZW5lZCAKLSAgICAgKiBhdXRvbWF0aWNhbGx5IHdoZW4gbG9nX2VyciBpcyBjYWxsZWQuICBOb3RlIHRoYXQgdGhlIGxvZwotICAgICAqIG1pZ2h0IG5vdCBhY3R1YWxseSBiZSBvcGVuIGlmIExPR19FWEVDIGlzbid0IGRlZmluZWQuCi0gICAgICogSG93ZXZlciwgdGhlICJsb2ciIGNlbGwgaXNuJ3QgaWZkZWYnZCBzbyBsZXQncyBiZSBkZWZlbnNpdmUKLSAgICAgKiBhbmQgYXNzdW1lIHNvbWVvbmUgbWlnaHQgaGF2ZSBkb25lIHNvbWV0aGluZyB3aXRoIGl0Ci0gICAgICogb3V0c2lkZSBhbiBpZmRlZidkIExPR19FWEVDIGJsb2NrLgotICAgICAqLwotICAgIGlmIChsb2cgIT0gTlVMTCkgewotCWZjbG9zZShsb2cpOwotCWxvZyA9IE5VTEw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBFeGVjdXRlIHRoZSBjb21tYW5kLCByZXBsYWNpbmcgb3VyIGltYWdlIHdpdGggaXRzIG93bi4KLSAgICAgKi8KLSNpZmRlZiBORUVEX0hBU0hCQU5HX0VNVUwKLSAgICAvKiBXZSBuZWVkIHRoZSAjISBlbXVsYXRpb24gd2hlbiB3ZSB3YW50IHRvIGV4ZWN1dGUgc2NyaXB0cyAqLwotICAgIHsKLQlleHRlcm4gY2hhciAqKmVudmlyb247Ci0KLQlhcF9leGVjdmUoY21kLCAmYXJndlszXSwgZW52aXJvbik7Ci0gICAgfQotI2Vsc2UgLypORUVEX0hBU0hCQU5HX0VNVUwqLwotICAgIGV4ZWN2KGNtZCwgJmFyZ3ZbM10pOwotI2VuZGlmIC8qTkVFRF9IQVNIQkFOR19FTVVMKi8KLQotICAgIC8qCi0gICAgICogKEkgY2FuJ3QgaGVscCBteXNlbGYuLi5zb3JyeS4pCi0gICAgICoKLSAgICAgKiBVaCBvaC4gIFN0aWxsIGhlcmUuICBXaGVyZSdzIHRoZSBrYWJvb20/ICBUaGVyZSB3YXMgc3VwcG9zZWQgdG8gYmUgYW4KLSAgICAgKiBFQVJUSC1zaGF0dGVyaW5nIGthYm9vbSEKLSAgICAgKgotICAgICAqIE9oIHdlbGwsIGxvZyB0aGUgZmFpbHVyZSBhbmQgZXJyb3Igb3V0LgotICAgICAqLwotICAgIGxvZ19lcnIoIiglZCklczogZXhlYyBmYWlsZWQgKCVzKVxuIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSwgY21kKTsKLSAgICBleGl0KDI1NSk7Ci19CmRpZmYgLS1naXQgYS9zdXBwb3J0L3N1ZXhlYy5oIGIvc3VwcG9ydC9zdWV4ZWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkyYmFkZC4uMDAwMDAwMAotLS0gYS9zdXBwb3J0L3N1ZXhlYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIHN1ZXhlYy5oIC0tIHVzZXItZGVmaW5hYmxlIHZhcmlhYmxlcyBmb3IgdGhlIHN1ZXhlYyB3cmFwcGVyIGNvZGUuCi0gKiAgICAgICAgICAgICAoU2VlIFJFQURNRS5jb25maWd1cmUgb24gaG93IHRvIGN1c3RvbWl6ZSB0aGVzZSB2YXJpYWJsZXMuKQotICovCi0KLQotI2lmbmRlZiBfU1VFWEVDX0gKLSNkZWZpbmUgX1NVRVhFQ19ICi0KLS8qCi0gKiBIVFRQRF9VU0VSIC0tIERlZmluZSBhcyB0aGUgdXNlcm5hbWUgdW5kZXIgd2hpY2ggQXBhY2hlIG5vcm1hbGx5Ci0gKiAgICAgICAgICAgICAgIHJ1bnMuICBUaGlzIGlzIHRoZSBvbmx5IHVzZXIgYWxsb3dlZCB0byBleGVjdXRlCi0gKiAgICAgICAgICAgICAgIHRoaXMgcHJvZ3JhbS4KLSAqLwotI2lmbmRlZiBIVFRQRF9VU0VSCi0jZGVmaW5lIEhUVFBEX1VTRVIgInd3dyIKLSNlbmRpZgotCi0vKgotICogVUlEX01JTiAtLSBEZWZpbmUgdGhpcyBhcyB0aGUgbG93ZXN0IFVJRCBhbGxvd2VkIHRvIGJlIGEgdGFyZ2V0IHVzZXIKLSAqICAgICAgICAgICAgZm9yIHN1RVhFQy4gIEZvciBtb3N0IHN5c3RlbXMsIDUwMCBvciAxMDAgaXMgY29tbW9uLgotICovCi0jaWZuZGVmIFVJRF9NSU4KLSNkZWZpbmUgVUlEX01JTiAxMDAKLSNlbmRpZgotCi0vKgotICogR0lEX01JTiAtLSBEZWZpbmUgdGhpcyBhcyB0aGUgbG93ZXN0IEdJRCBhbGxvd2VkIHRvIGJlIGEgdGFyZ2V0IGdyb3VwCi0gKiAgICAgICAgICAgIGZvciBzdUVYRUMuICBGb3IgbW9zdCBzeXN0ZW1zLCAxMDAgaXMgY29tbW9uLgotICovCi0jaWZuZGVmIEdJRF9NSU4KLSNkZWZpbmUgR0lEX01JTiAxMDAKLSNlbmRpZgotCi0vKgotICogVVNFUkRJUl9TVUZGSVggLS0gRGVmaW5lIHRvIGJlIHRoZSBzdWJkaXJlY3RvcnkgdW5kZXIgdXNlcnMnIAotICogICAgICAgICAgICAgICAgICAgaG9tZSBkaXJlY3RvcmllcyB3aGVyZSBzdUVYRUMgYWNjZXNzIHNob3VsZAotICogICAgICAgICAgICAgICAgICAgYmUgYWxsb3dlZC4gIEFsbCBleGVjdXRhYmxlcyB1bmRlciB0aGlzIGRpcmVjdG9yeQotICogICAgICAgICAgICAgICAgICAgd2lsbCBiZSBleGVjdXRhYmxlIGJ5IHN1RVhFQyBhcyB0aGUgdXNlciBzbyAKLSAqICAgICAgICAgICAgICAgICAgIHRoZXkgc2hvdWxkIGJlICJzYWZlIiBwcm9ncmFtcy4gIElmIHlvdSBhcmUgCi0gKiAgICAgICAgICAgICAgICAgICB1c2luZyBhICJzaW1wbGUiIFVzZXJEaXIgZGlyZWN0aXZlIChpZS4gb25lIAotICogICAgICAgICAgICAgICAgICAgd2l0aG91dCBhICIqIiBpbiBpdCkgdGhpcyBzaG91bGQgYmUgc2V0IHRvIAotICogICAgICAgICAgICAgICAgICAgdGhlIHNhbWUgdmFsdWUuICBzdUVYRUMgd2lsbCBub3Qgd29yayBwcm9wZXJseQotICogICAgICAgICAgICAgICAgICAgaW4gY2FzZXMgd2hlcmUgdGhlIFVzZXJEaXIgZGlyZWN0aXZlIHBvaW50cyB0byAKLSAqICAgICAgICAgICAgICAgICAgIGEgbG9jYXRpb24gdGhhdCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHVzZXIncwotICogICAgICAgICAgICAgICAgICAgaG9tZSBkaXJlY3RvcnkgYXMgcmVmZXJlbmNlZCBpbiB0aGUgcGFzc3dkIGZpbGUuCi0gKgotICogICAgICAgICAgICAgICAgICAgSWYgeW91IGhhdmUgVmlydHVhbEhvc3RzIHdpdGggYSBkaWZmZXJlbnQKLSAqICAgICAgICAgICAgICAgICAgIFVzZXJEaXIgZm9yIGVhY2gsIHlvdSB3aWxsIG5lZWQgdG8gZGVmaW5lIHRoZW0gdG8KLSAqICAgICAgICAgICAgICAgICAgIGFsbCByZXNpZGUgaW4gb25lIHBhcmVudCBkaXJlY3Rvcnk7IHRoZW4gbmFtZSB0aGF0Ci0gKiAgICAgICAgICAgICAgICAgICBwYXJlbnQgZGlyZWN0b3J5IGhlcmUuICBJRiBUSElTIElTIE5PVCBERUZJTkVECi0gKiAgICAgICAgICAgICAgICAgICBQUk9QRVJMWSwgflVTRVJESVIgQ0dJIFJFUVVFU1RTIFdJTEwgTk9UIFdPUkshCi0gKiAgICAgICAgICAgICAgICAgICBTZWUgdGhlIHN1RVhFQyBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbGVkCi0gKiAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbi4KLSAqLwotI2lmbmRlZiBVU0VSRElSX1NVRkZJWAotI2RlZmluZSBVU0VSRElSX1NVRkZJWCAicHVibGljX2h0bWwiCi0jZW5kaWYKLQotLyoKLSAqIExPR19FWEVDIC0tIERlZmluZSB0aGlzIGFzIGEgZmlsZW5hbWUgaWYgeW91IHdhbnQgYWxsIHN1RVhFQwotICogICAgICAgICAgICAgdHJhbnNhY3Rpb25zIGFuZCBlcnJvcnMgbG9nZ2VkIGZvciBhdWRpdGluZyBhbmQKLSAqICAgICAgICAgICAgIGRlYnVnZ2luZyBwdXJwb3Nlcy4KLSAqLwotI2lmbmRlZiBMT0dfRVhFQwotI2RlZmluZSBMT0dfRVhFQyAiL3Vzci9sb2NhbC9hcGFjaGUvbG9ncy9jZ2kubG9nIgkvKiBOZWVkIG1lPyAqLwotI2VuZGlmCi0KLS8qCi0gKiBET0NfUk9PVCAtLSBEZWZpbmUgYXMgdGhlIERvY3VtZW50Um9vdCBzZXQgZm9yIEFwYWNoZS4gIFRoaXMKLSAqICAgICAgICAgICAgIHdpbGwgYmUgdGhlIG9ubHkgaGllcmFyY2h5IChhc2lkZSBmcm9tIFVzZXJEaXJzKQotICogICAgICAgICAgICAgdGhhdCBjYW4gYmUgdXNlZCBmb3Igc3VFWEVDIGJlaGF2aW9yLgotICovCi0jaWZuZGVmIERPQ19ST09UCi0jZGVmaW5lIERPQ19ST09UICIvdXNyL2xvY2FsL2FwYWNoZS9odGRvY3MiCi0jZW5kaWYKLQotLyoKLSAqIFNBRkVfUEFUSCAtLSBEZWZpbmUgYSBzYWZlIFBBVEggZW52aXJvbm1lbnQgdG8gcGFzcyB0byBDR0kgZXhlY3V0YWJsZXMuCi0gKgotICovCi0jaWZuZGVmIFNBRkVfUEFUSAotI2RlZmluZSBTQUZFX1BBVEggIi91c3IvbG9jYWwvYmluOi91c3IvYmluOi9iaW4iCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9TVUVYRUNfSCAqLwpkaWZmIC0tZ2l0IGEvc3VwcG9ydC91dGlsaXRpZXNudy5kZWYgYi9zdXBwb3J0L3V0aWxpdGllc253LmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI2YjhjOS4uMDAwMDAwMAotLS0gYS9zdXBwb3J0L3V0aWxpdGllc253LmRlZgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotTU9EVUxFICBBUFJMSUIuTkxNCi1NT0RVTEUgIExJQkMuTkxNCi0KZGlmZiAtLWdpdCBhL3N1cHBvcnQvd2luMzIvLmN2c2lnbm9yZSBiL3N1cHBvcnQvd2luMzIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY1OGZmNS4uMDAwMDAwMAotLS0gYS9zdXBwb3J0L3dpbjMyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVJlbGVhc2UKLURlYnVnCi0qLnBsZwpkaWZmIC0tZ2l0IGEvc3VwcG9ydC93aW4zMi9BcGFjaGVNb25pdG9yLmMgYi9zdXBwb3J0L3dpbjMyL0FwYWNoZU1vbml0b3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU2Zjg5Ni4uMDAwMDAwMAotLS0gYS9zdXBwb3J0L3dpbjMyL0FwYWNoZU1vbml0b3IuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNjcgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCi0gKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAotICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQXBhY2hlU2VydmljZS5jIFNpbXBsZSBwcm9ncmFtIHRvIG1hbmFnZSBhbmQgbW9uaXRvciBBcGFjaGUgc2VydmljZXMuCi0gKgotICogQ29udHJpYnV0ZWQgYnkgTWxhZGVuIFR1cmsgPG10dXJrQG1hcHBpbmdzb2Z0LmNvbT4KLSAqCi0gKiAwNSBBdWcgMjAwMQotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gKi8KLQotI2RlZmluZSBfV0lOMzJfV0lOTlQgMHgwNDAwCi0jaWZuZGVmIFNUUklDVAotI2RlZmluZSBTVFJJQ1QKLSNlbmRpZgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPHdpbmRvd3N4Lmg+Ci0jaW5jbHVkZSA8Y29tbWN0cmwuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgIkFwYWNoZU1vbml0b3IuaCIKLQotCi0jZGVmaW5lIE9TX1ZFUlNJT05fV0lOTlQgICAgMQotI2RlZmluZSBPU19WRVJTSU9OX1dJTjlYICAgIDIKLSNkZWZpbmUgT1NfVkVSU0lPTl9XSU4ySyAgICAzCi0vKiBTaG91bGQgYmUgZW5vdWdoICovCi0jZGVmaW5lIE1BWF9BUEFDSEVfU0VSVklDRVMgMTI4Ci0KLSNkZWZpbmUgV01fVFJBWU1FU1NBR0UgICAgICAgICAoV01fQVBQKzEpCi0jZGVmaW5lIFdNX1VQREFURU1FU1NBR0UgICAgICAgKFdNX1VTRVIrMSkKLSNkZWZpbmUgU0VSVklDRV9BUEFDSEVfUkVTVEFSVCAxMjgKLSNkZWZpbmUgWEJJVE1BUCAgICAgICAgICAgICAgICAxNgotI2RlZmluZSBZQklUTUFQICAgICAgICAgICAgICAgIDE2IAotI2RlZmluZSBNQVhfTE9BRFNUUklORyAgICAgICAgIDEwMAotCi0jaWZuZGVmIFNFUlZJQ0VfUlVOU19JTl9TWVNURU1fUFJPQ0VTUwotI2RlZmluZSBTRVJWSUNFX1JVTlNfSU5fU1lTVEVNX1BST0NFU1MgIDB4MDAwMDAwMDEKLQotdHlwZWRlZiBzdHJ1Y3QgX1NFUlZJQ0VfU1RBVFVTX1BST0NFU1MgewotICAgIERXT1JEICAgZHdTZXJ2aWNlVHlwZTsKLSAgICBEV09SRCAgIGR3Q3VycmVudFN0YXRlOwotICAgIERXT1JEICAgZHdDb250cm9sc0FjY2VwdGVkOwotICAgIERXT1JEICAgZHdXaW4zMkV4aXRDb2RlOwotICAgIERXT1JEICAgZHdTZXJ2aWNlU3BlY2lmaWNFeGl0Q29kZTsKLSAgICBEV09SRCAgIGR3Q2hlY2tQb2ludDsKLSAgICBEV09SRCAgIGR3V2FpdEhpbnQ7Ci0gICAgRFdPUkQgICBkd1Byb2Nlc3NJZDsKLSAgICBEV09SRCAgIGR3U2VydmljZUZsYWdzOwotfSBTRVJWSUNFX1NUQVRVU19QUk9DRVNTLCAqTFBTRVJWSUNFX1NUQVRVU19QUk9DRVNTOwotCi10eXBlZGVmIGVudW0gX1NDX1NUQVRVU19UWVBFIHsKLSAgICBTQ19TVEFUVVNfUFJPQ0VTU19JTkZPICAgICAgPSAwCi19IFNDX1NUQVRVU19UWVBFOwotCi0jZW5kaWYKLQotdHlwZWRlZiBCT09MIChXSU5BUEkgKlFVRVJZU0VSVklDRVNUQVRVU0VYKShTQ19IQU5ETEUsIFNDX1NUQVRVU19UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEJZVEUsIERXT1JELCBMUERXT1JEKTsKLQotdHlwZWRlZiBzdHJ1Y3QgX3N0X0FQQUNIRV9TRVJWSUNFCi17Ci0gICAgTFBTVFIgICAgc3pTZXJ2aWNlTmFtZTsKLSAgICBMUFNUUiAgICBzekRpc3BsYXlOYW1lOwotICAgIExQU1RSICAgIHN6RGVzY3JpcHRpb247Ci0gICAgTFBTVFIgICAgc3pJbWFnZVBhdGg7Ci0gICAgRFdPUkQgICAgZHdQaWQ7Ci19IFNUX0FQQUNIRV9TRVJWSUNFOwotCi0vKiBHbG9iYWwgdmFyaWFibGVzICovCi1ISU5TVEFOQ0UgICAgICAgICBhcF9oSW5zdGFuY2UgPSBOVUxMOwotSFdORCAgICAgICAgICAgICAgYXBfaHduZEFib3V0RGxnID0gTlVMTDsKLVRDSEFSICAgICAgICAgICAgIHN6VGl0bGVbTUFYX0xPQURTVFJJTkddOyAgICAgICAgICAvKiBUaGUgdGl0bGUgYmFyIHRleHQgKi8KLVRDSEFSICAgICAgICAgICAgIHN6V2luZG93Q2xhc3NbTUFYX0xPQURTVFJJTkddOyAgICAvKiBXaW5kb3cgQ2xhc3MgTmFtZSAgKi8KLUhJQ09OICAgICAgICAgICAgIGFwX2ljb1N0b3A7Ci1ISUNPTiAgICAgICAgICAgICBhcF9pY29SdW47Ci1VSU5UICAgICAgICAgICAgICBhcF91aVRhc2tiYXJDcmVhdGVkOwotRFdPUkQgICAgICAgICAgICAgYXBfT1NWZXJzaW9uOwotQk9PTCAgICAgICAgICAgICAgZGxnQWJvdXRPbiA9IEZBTFNFOwotQk9PTCAgICAgICAgICAgICAgZGxnU2VydmljZU9uID0gRkFMU0U7Ci1TVF9BUEFDSEVfU0VSVklDRSBhcF9zdFNlcnZpY2VzW01BWF9BUEFDSEVfU0VSVklDRVNdOwotCi1IQklUTUFQICAgICAgICAgICBoYm1wU3RhcnQsIGhibXBTdG9wOyAKLUhCSVRNQVAgICAgICAgICAgIGhibXBQaWN0dXJlLCBoYm1wT2xkOyAKLUhXTkQgICAgICAgICAgICAgIGFwX2hTZXJ2aWNlRGxnOwotQk9PTCAgICAgICAgICAgICAgYXBfcmVzY2FuU2VydmljZXM7Ci1IV05EICAgICAgICAgICAgICBhcF9oU2VydmljZURsZzsKLQotCi12b2lkIGFwX0NsZWFyU2VydmljZXNTdCgpCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9BUEFDSEVfU0VSVklDRVM7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChhcF9zdFNlcnZpY2VzW2ldLnN6U2VydmljZU5hbWUpCi0gICAgICAgICAgICBmcmVlKGFwX3N0U2VydmljZXNbaV0uc3pTZXJ2aWNlTmFtZSk7Ci0gICAgICAgIGlmIChhcF9zdFNlcnZpY2VzW2ldLnN6RGlzcGxheU5hbWUpCi0gICAgICAgICAgICBmcmVlKGFwX3N0U2VydmljZXNbaV0uc3pEaXNwbGF5TmFtZSk7Ci0gICAgICAgIGlmIChhcF9zdFNlcnZpY2VzW2ldLnN6RGVzY3JpcHRpb24pCi0gICAgICAgICAgICBmcmVlKGFwX3N0U2VydmljZXNbaV0uc3pEZXNjcmlwdGlvbik7Ci0gICAgICAgIGlmIChhcF9zdFNlcnZpY2VzW2ldLnN6SW1hZ2VQYXRoKQotICAgICAgICAgICAgZnJlZShhcF9zdFNlcnZpY2VzW2ldLnN6SW1hZ2VQYXRoKTsKLQotICAgIH0KLSAgICBaZXJvTWVtb3J5KGFwX3N0U2VydmljZXMsIHNpemVvZihTVF9BUEFDSEVfU0VSVklDRSkgKiBNQVhfQVBBQ0hFX1NFUlZJQ0VTKTsKLQotfQotCi12b2lkIEVycm9yTWVzc2FnZShEV09SRCBkd0Vycm9yKQotewotICAgIExQVk9JRCBscE1zZ0J1ZjsKLSAgICBGb3JtYXRNZXNzYWdlKEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8Ci0gICAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSB8Ci0gICAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywKLSAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICBkd0Vycm9yID09IEVSUk9SX1NVQ0NFU1MgPyBHZXRMYXN0RXJyb3IoKSA6IGR3RXJyb3IsCi0gICAgICAgICAgICAgICAgICBNQUtFTEFOR0lEKExBTkdfTkVVVFJBTCwgU1VCTEFOR19ERUZBVUxUKSwKLSAgICAgICAgICAgICAgICAgIChMUFRTVFIpICZscE1zZ0J1ZiwgMCwgTlVMTCk7Ci0gICAgTWVzc2FnZUJveChOVUxMLCAoTFBDVFNUUilscE1zZ0J1ZiwgIkVycm9yIiwgTUJfT0sgfCBNQl9JQ09ORVJST1IpOwotICAgIExvY2FsRnJlZShscE1zZ0J1Zik7Ci0KLX0KLQotTFBUU1RSIEdldFN0cmluZ1JlcyhpbnQgaWQpCi17Ci0gIHN0YXRpYyBUQ0hBUiBidWZmZXJbTUFYX1BBVEhdOwotCi0gIGJ1ZmZlclswXSA9IDA7Ci0gIExvYWRTdHJpbmcoR2V0TW9kdWxlSGFuZGxlIChOVUxMKSwgaWQsIGJ1ZmZlciwgTUFYX1BBVEgpOwotICByZXR1cm4gYnVmZmVyOwotfQotCi1CT09MIEdldFN5c3RlbU9TVmVyc2lvbihMUFNUUiBzelZlcnNpb24sIExQRFdPUkQgZHdWZXJzaW9uKQotewotICAgIE9TVkVSU0lPTklORk9FWCBvc3ZpOwotICAgIEJPT0wgYk9zVmVyc2lvbkluZm9FeDsKLSAgICBjaGFyIHN6QnVmZlsyNTZdOwotICAgIEhLRVkgaEtleTsKLSAgICBjaGFyIHN6UHJvZHVjdFR5cGVbODBdOwotICAgIERXT1JEIGR3QnVmTGVuOwotICAgIAotICAgIC8qIAotICAgIFRyeSBjYWxsaW5nIEdldFZlcnNpb25FeCB1c2luZyB0aGUgT1NWRVJTSU9OSU5GT0VYIHN0cnVjdHVyZS4KLSAgICBJZiB0aGF0IGZhaWxzLCB0cnkgdXNpbmcgdGhlIE9TVkVSU0lPTklORk8gc3RydWN0dXJlLgotICAgICovCi0gICAgWmVyb01lbW9yeSgmb3N2aSwgc2l6ZW9mKE9TVkVSU0lPTklORk9FWCkpOwotICAgIG9zdmkuZHdPU1ZlcnNpb25JbmZvU2l6ZSA9IHNpemVvZihPU1ZFUlNJT05JTkZPRVgpOwotICAgIAotICAgIGlmICghKGJPc1ZlcnNpb25JbmZvRXggPSBHZXRWZXJzaW9uRXgoKE9TVkVSU0lPTklORk8gKikgJm9zdmkpKSkKLSAgICB7Ci0gICAgICAgIC8qIElmIE9TVkVSU0lPTklORk9FWCBkb2Vzbid0IHdvcmssIHRyeSBPU1ZFUlNJT05JTkZPLiAqLyAgICAgICAgCi0gICAgICAgIG9zdmkuZHdPU1ZlcnNpb25JbmZvU2l6ZSA9IHNpemVvZihPU1ZFUlNJT05JTkZPKTsKLSAgICAgICAgaWYgKCFHZXRWZXJzaW9uRXgoKE9TVkVSU0lPTklORk8gKikgJm9zdmkpKSAKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgCi0gICAgc3dpdGNoIChvc3ZpLmR3UGxhdGZvcm1JZCkKLSAgICB7Ci0gICAgY2FzZSBWRVJfUExBVEZPUk1fV0lOMzJfTlQ6ICAgICAgICAKLSAgICAgICAgLyogVGVzdCBmb3IgdGhlIHByb2R1Y3QuICovICAgICAgICAKLSAgICAgICAgaWYgKHN6VmVyc2lvbiE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvc3ZpLmR3TWFqb3JWZXJzaW9uIDw9IDQpCi0gICAgICAgICAgICAgICAgc3RyY3B5KHN6VmVyc2lvbiwgIk1TIFdpbmRvd3MgTlQgIik7Ci0gICAgICAgICAgICBlbHNlIGlmIChvc3ZpLmR3TWFqb3JWZXJzaW9uID09IDUgJiYgb3N2aS5kd01pbm9yVmVyc2lvbiA9PSAwKQotICAgICAgICAgICAgICAgIHN0cmNweShzelZlcnNpb24sICJNUyBXaW5kb3dzIDIwMDAgIik7Ci0gICAgICAgICAgICBlbHNlIGlmIChvc3ZpLmR3TWFqb3JWZXJzaW9uID09IDUgJiYgb3N2aS5kd01pbm9yVmVyc2lvbiA9PSAxKQotICAgICAgICAgICAgICAgIHN0cmNweShzelZlcnNpb24sICJXaGlzdGxlciAiKTsKLSAgICAgICAgICAgIC8qIFRlc3QgZm9yIHByb2R1Y3QgdHlwZS4qLyAgICAgICAgICAgIAotI2lmZGVmIFZFUl9WT1JLU1RBVElPTl9OVAotICAgICAgICAgICAgaWYgKGJPc1ZlcnNpb25JbmZvRXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG9zdmkud1Byb2R1Y3RUeXBlID09IFZFUl9OVF9XT1JLU1RBVElPTikKLSAgICAgICAgICAgICAgICB7Ci0jaWZkZWYgVkVSX1NVSVRFX1BFUlNPTkFMCi0gICAgICAgICAgICAgICAgICAgIGlmIChvc3ZpLndTdWl0ZU1hc2sgJiBWRVJfU1VJVEVfUEVSU09OQUwpCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJjYXQoc3pWZXJzaW9uLCAiUGVyc29uYWwgIik7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICBzdHJjYXQoc3pWZXJzaW9uLCAiUHJvZmVzc2lvbmFsICIpOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZWxzZSBpZiAob3N2aS53UHJvZHVjdFR5cGUgPT0gVkVSX05UX1NFUlZFUikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvc3ZpLndTdWl0ZU1hc2sgJiBWRVJfU1VJVEVfREFUQUNFTlRFUikKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNhdChzelZlcnNpb24sICJEYXRhQ2VudGVyIFNlcnZlciAiKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAob3N2aS53U3VpdGVNYXNrICYgVkVSX1NVSVRFX0VOVEVSUFJJU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJjYXQoc3pWZXJzaW9uLCAiQWR2YW5jZWQgU2VydmVyICIpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJjYXQoc3pWZXJzaW9uLCAiU2VydmVyICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSNlbmRpZiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBSZWdPcGVuS2V5RXgoSEtFWV9MT0NBTF9NQUNISU5FLAotICAgICAgICAgICAgICAgICAgICAiU1lTVEVNXFxDdXJyZW50Q29udHJvbFNldFxcQ29udHJvbFxcUHJvZHVjdE9wdGlvbnMiLAotICAgICAgICAgICAgICAgICAgICAwLCBLRVlfUVVFUllfVkFMVUUsICZoS2V5KTsKLSAgICAgICAgICAgICAgICBSZWdRdWVyeVZhbHVlRXgoaEtleSwgIlByb2R1Y3RUeXBlIiwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgKExQQllURSkgc3pQcm9kdWN0VHlwZSwgJmR3QnVmTGVuKTsKLSAgICAgICAgICAgICAgICBSZWdDbG9zZUtleShoS2V5KTsKLSAgICAgICAgICAgICAgICBpZiAobHN0cmNtcGkoIldJTk5UIiwgc3pQcm9kdWN0VHlwZSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgc3RyY2F0KHN6VmVyc2lvbiwgIldvcmtzdGF0aW9uICIpOwotICAgICAgICAgICAgICAgIGlmIChsc3RyY21waSgiU0VSVkVSTlQiLCBzelByb2R1Y3RUeXBlKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBzdHJjYXQoc3pWZXJzaW9uLCAiU2VydmVyICIpOwotI2lmZGVmIFZFUl9WT1JLU1RBVElPTl9OVAotICAgICAgICAgICAgfSAgICAgICAgICAgIAotI2VuZGlmCi0gICAgICAgICAgICAvKiBHZXQgdmVyc2lvbiwgc2VydmljZSBwYWNrIChpZiBhbnkpLCBhbmQgYnVpbGQgbnVtYmVyLiAqLwotICAgICAgICAgICAgaWYgKG9zdmkuZHdNYWpvclZlcnNpb24gPD0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzcHJpbnRmKHN6QnVmZiwgInZlcnNpb24gJWQuJWQgJXMgKEJ1aWxkLSVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9zdmkuZHdNYWpvclZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBvc3ZpLmR3TWlub3JWZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgb3N2aS5zekNTRFZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBvc3ZpLmR3QnVpbGROdW1iZXIgJiAweEZGRkYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgICBzcHJpbnRmKHN6QnVmZiwgIiVzIChCdWlsZC0lZClcbiIsCi0gICAgICAgICAgICAgICAgICAgIG9zdmkuc3pDU0RWZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICBvc3ZpLmR3QnVpbGROdW1iZXIgJiAweEZGRkYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RyY2F0KHN6VmVyc2lvbiwgc3pCdWZmKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChkd1ZlcnNpb24gIT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG9zdmkuZHdNYWpvclZlcnNpb24gPD0gNCkKLSAgICAgICAgICAgICAgICAqZHdWZXJzaW9uID0gT1NfVkVSU0lPTl9XSU5OVDsKLSAgICAgICAgICAgIGVsc2UgaWYgKG9zdmkuZHdNYWpvclZlcnNpb24gPT0gNSkKLSAgICAgICAgICAgICAgICAqZHdWZXJzaW9uID0gT1NfVkVSU0lPTl9XSU4ySzsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgICAgCi0gICAgY2FzZSBWRVJfUExBVEZPUk1fV0lOMzJfV0lORE9XUzoKLSAgICAgICAgaWYgKHN6VmVyc2lvbiAhPSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAob3N2aS5kd01ham9yVmVyc2lvbiA9PSA0ICYmIG9zdmkuZHdNaW5vclZlcnNpb24gPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJjcHkoc3pWZXJzaW9uLCAiTVMgV2luZG93cyA5NSAiKTsKLSAgICAgICAgICAgICAgICBpZiAob3N2aS5zekNTRFZlcnNpb25bMV0gPT0gJ0MnKQotICAgICAgICAgICAgICAgICAgICBzdHJjYXQoc3pWZXJzaW9uLCAiT1NSMiAiKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKG9zdmkuZHdNYWpvclZlcnNpb24gPT0gNCAmJiBvc3ZpLmR3TWlub3JWZXJzaW9uID09IDEwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmNweShzelZlcnNpb24sICJNUyBXaW5kb3dzIDk4ICIpOwotICAgICAgICAgICAgICAgIGlmIChvc3ZpLnN6Q1NEVmVyc2lvblsxXSA9PSAnQScpCi0gICAgICAgICAgICAgICAgICAgIHN0cmNhdChzelZlcnNpb24sICJTRSAiKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKG9zdmkuZHdNYWpvclZlcnNpb24gPT0gNCAmJiBvc3ZpLmR3TWlub3JWZXJzaW9uID09IDkwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmNweShzelZlcnNpb24sICJNUyBXaW5kb3dzIE1lICIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChkd1ZlcnNpb24gIT0gTlVMTCkKLSAgICAgICAgICAgICpkd1ZlcnNpb24gPSBPU19WRVJTSU9OX1dJTjlYOwotICAgICAgICAKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAgIGNhc2UgVkVSX1BMQVRGT1JNX1dJTjMyczoKLSAgICAgICAgaWYgKHN6VmVyc2lvbiAhPSBOVUxMKQotICAgICAgICAgICAgc3RyY3B5KHN6VmVyc2lvbiwgIk1pY3Jvc29mdCBXaW4zMnMgIik7Ci0gICAgICAgIGlmIChkd1ZlcnNpb24gIT0gTlVMTCkKLSAgICAgICAgICAgICpkd1ZlcnNpb24gPSBPU19WRVJTSU9OX1dJTjlYOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIFRSVUU7IAotfQotCi1zdGF0aWMgVk9JRCBTaG93Tm90aWZ5SWNvbihIV05EIGhXbmQsIERXT1JEIGR3TWVzc2FnZSkKLXsKLSAgICAKLSAgICBOT1RJRllJQ09OREFUQSBuaWQ7Ci0gICAgaW50ICBpID0gMCwgbiA9IDA7Ci0KLSAgICBaZXJvTWVtb3J5KCZuaWQsc2l6ZW9mKG5pZCkpOwotICAgIG5pZC5jYlNpemUgPSBzaXplb2YoTk9USUZZSUNPTkRBVEEpOwotICAgIG5pZC5oV25kID0gaFduZDsKLSAgICBuaWQudUlEID0gMHhGRjsKLSAgICBuaWQudUZsYWdzID0gTklGX0lDT04gfCBOSUZfTUVTU0FHRSB8IE5JRl9USVA7Ci0gICAgbmlkLnVDYWxsYmFja01lc3NhZ2UgPSBXTV9UUkFZTUVTU0FHRTsKLSAgICAKLSAgICB3aGlsZSAoYXBfc3RTZXJ2aWNlc1tpXS5zelNlcnZpY2VOYW1lICE9IE5VTEwpCi0gICAgeyAgICAKLSAgICAgICAgaWYgKGFwX3N0U2VydmljZXNbaV0uZHdQaWQgIT0gMCkKLSAgICAgICAgICAgICsrbjsKLSAgICAgICAgKytpOwotICAgIH0KLSAgICBpZiAoZHdNZXNzYWdlICE9IE5JTV9ERUxFVEUpCi0gICAgewotICAgICAgICBpZiAobikKLSAgICAgICAgICAgIG5pZC5oSWNvbiA9IGFwX2ljb1J1bjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbmlkLmhJY29uID0gYXBfaWNvU3RvcDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBuaWQuaEljb24gPSBOVUxMOwotCi0gICAgc3ByaW50ZihuaWQuc3pUaXAsICJSdW5uaW5nOiAlZCBTZXJ2aWNlcyIsIG4pOyAgICAKLSAgICBTaGVsbF9Ob3RpZnlJY29uKGR3TWVzc2FnZSwgJm5pZCk7Ci0gICAgCi19Ci0KLXZvaWQgU2hvd1RyeVBvcHVwTWVudShIV05EIGhXbmQpCi17Ci0gICAgLyogY3JlYXRlIHBvcHVwIG1lbnUgKi8KLSAgICBITUVOVSBoTWVudSA9IENyZWF0ZVBvcHVwTWVudSgpOwotICAgIFBPSU5UIHB0OwotCi0gICAgaWYgKGhNZW51KQotICAgIHsKLSAgICAgICAgQXBwZW5kTWVudShoTWVudSwgIE1GX1NUUklORywgSURNX0FCT1VULCAiJkFib3V0Li4uIik7Ci0gICAgICAgIEFwcGVuZE1lbnUoaE1lbnUsICBNRl9TVFJJTkcsIElETV9SRVNUT1JFLCAiJlNob3cgU2VydmljZXMuLi4iKTsKLSAgICAgICAgQXBwZW5kTWVudShoTWVudSwgIE1GX1NFUEFSQVRPUiwgMCwgIiIpOwotICAgICAgICBBcHBlbmRNZW51KGhNZW51LCAgTUZfU1RSSU5HLCBJRE1fRVhJVCwgICImRXhpdC4uLiIpOwotCi0gICAgICAgIEdldEN1cnNvclBvcygmcHQpOwotICAgICAgICBTZXRGb3JlZ3JvdW5kV2luZG93KE5VTEwpOwotICAgICAgICBUcmFja1BvcHVwTWVudShoTWVudSwgVFBNX0xFRlRBTElHTnxUUE1fUklHSFRCVVRUT04sIHB0LngsIHB0LnksIDAsIGhXbmQsIE5VTEwpOwotICAgIH0KLX0KLQotQk9PTCBDZW50ZXJXaW5kb3coSFdORCBod25kQ2hpbGQpCi17Ci0gICBSRUNUICAgIHJDaGlsZCwgcldvcmtBcmVhOwotICAgaW50ICAgICB3Q2hpbGQsIGhDaGlsZDsKLSAgIGludCAgICAgeE5ldywgeU5ldzsKLSAgIEJPT0wgIGJSZXN1bHQ7Ci0KLSAgIC8qIEdldCB0aGUgSGVpZ2h0IGFuZCBXaWR0aCBvZiB0aGUgY2hpbGQgd2luZG93ICovCi0gICBHZXRXaW5kb3dSZWN0KGh3bmRDaGlsZCwgJnJDaGlsZCk7Ci0gICB3Q2hpbGQgPSByQ2hpbGQucmlnaHQgLSByQ2hpbGQubGVmdDsKLSAgIGhDaGlsZCA9IHJDaGlsZC5ib3R0b20gLSByQ2hpbGQudG9wOwotCi0gICAvKiBHZXQgdGhlIGxpbWl0cyBvZiB0aGUgJ3dvcmthcmVhJyAqLwotICAgYlJlc3VsdCA9IFN5c3RlbVBhcmFtZXRlcnNJbmZvKAotICAgICAgU1BJX0dFVFdPUktBUkVBLCAgLyogc3lzdGVtIHBhcmFtZXRlciB0byBxdWVyeSBvciBzZXQgKi8KLSAgICAgIHNpemVvZihSRUNUKSwKLSAgICAgICZyV29ya0FyZWEsCi0gICAgICAwKTsKLSAgIGlmICghYlJlc3VsdCkgewotICAgICAgcldvcmtBcmVhLmxlZnQgPSByV29ya0FyZWEudG9wID0gMDsKLSAgICAgIHJXb3JrQXJlYS5yaWdodCA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTQ1JFRU4pOwotICAgICAgcldvcmtBcmVhLmJvdHRvbSA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lTQ1JFRU4pOwotICAgfQotCi0gICAvKiBDYWxjdWxhdGUgbmV3IFggcG9zaXRpb24sIHRoZW4gYWRqdXN0IGZvciB3b3JrYXJlYSAqLwotICAgeE5ldyA9IChyV29ya0FyZWEucmlnaHQgLSB3Q2hpbGQpLzI7Ci0gICB5TmV3ID0gKHJXb3JrQXJlYS5ib3R0b20gLSBoQ2hpbGQpLzI7Ci0gICByZXR1cm4gU2V0V2luZG93UG9zIChod25kQ2hpbGQsIEhXTkRfVE9QLCB4TmV3LCB5TmV3LCAwLCAwLCBTV1BfTk9TSVpFIHwgU1dQX1NIT1dXSU5ET1cpOwotfQotCi1zdGF0aWMgdm9pZCBhZGRJdGVtKEhXTkQgaERsZywgTFBTVFIgbHBTdHIsIEhCSVRNQVAgaEJtcCkgCi17IAotICAgIGludCBuSXRlbTsgCi0gCi0gICAgbkl0ZW0gPSBTZW5kTWVzc2FnZShoRGxnLCBMQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pbHBTdHIpOyAKLSAgICBTZW5kTWVzc2FnZShoRGxnLCBMQl9TRVRJVEVNREFUQSwgbkl0ZW0sIChMUEFSQU0paEJtcCk7IAotfSAKLQotCi1CT09MIFJ1bkFuZEZvcmdldENvbnNvbGUoTFBUU1RSIHN6Q21kTGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIG5SZXRWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICBzaG93Q29uc29sZSkKLXsKLSAgICAKLSAgICAKLSAgICBTVEFSVFVQSU5GTyBzdEluZm87Ci0gICAgUFJPQ0VTU19JTkZPUk1BVElPTiBwckluZm87Ci0gICAgQk9PTCBiUmVzdWx0OwotICAgIFplcm9NZW1vcnkoJnN0SW5mbywgc2l6ZW9mKHN0SW5mbykpOwotICAgIHN0SW5mby5jYiA9IHNpemVvZihzdEluZm8pOwotICAgIHN0SW5mby5kd0ZsYWdzID0gU1RBUlRGX1VTRVNIT1dXSU5ET1c7Ci0gICAgc3RJbmZvLndTaG93V2luZG93ID0gc2hvd0NvbnNvbGUgPyBTV19TSE9XTk9STUFMIDogU1dfSElERTsKLSAgICAKLSAgICBiUmVzdWx0ID0gQ3JlYXRlUHJvY2VzcyhOVUxMLAotICAgICAgICBzekNtZExpbmUsCi0gICAgICAgIE5VTEwsCi0gICAgICAgIE5VTEwsCi0gICAgICAgIFRSVUUsCi0gICAgICAgIENSRUFURV9ORVdfQ09OU09MRSAsCi0gICAgICAgIE5VTEwsCi0gICAgICAgIE5VTEwgLAotICAgICAgICAmc3RJbmZvLAotICAgICAgICAmcHJJbmZvKTsKLSAgICBpZiAoblJldFZhbHVlKQotICAgICAgICAqblJldFZhbHVlID0gR2V0TGFzdEVycm9yKCk7Ci0gICAgCi0gICAgQ2xvc2VIYW5kbGUocHJJbmZvLmhUaHJlYWQpOwotICAgIENsb3NlSGFuZGxlKHBySW5mby5oUHJvY2Vzcyk7Ci0gICAgaWYgKCFiUmVzdWx0KSAKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotQk9PTCBBcGFjaGVNYW5hZ2VTZXJ2aWNlKExQQ1NUUiBzelNlcnZpY2VOYW1lLCBMUENTVFIgc3pJbWFnZVBhdGgsIERXT1JEIGR3Q29tbWFuZCkKLXsKLSAgICAKLSAgICBDSEFSIHN6QnVmW01BWF9QQVRIXTsKLSAgICBMUFNUUiBzUG9zOwotICAgIERXT1JEIHJldENvZGU7Ci0gICAgQk9PTCAgcmV0VmFsdWU7Ci0gICAgQk9PTCAgbnRTZXJ2aWNlID0gVFJVRTsKLSAgICBTQ19IQU5ETEUgICBzY2hTZXJ2aWNlOwotICAgIFNDX0hBTkRMRSAgIHNjaFNDTWFuYWdlcjsgICAgCi0gICAgU0VSVklDRV9TVEFUVVMgc2NoU1N0YXR1czsKLSAgICBMUFNUUiAqYXJnczsKLSAgICBpbnQgICB0aWNrczsKLQotICAgIGlmIChhcF9PU1ZlcnNpb24gPT0gT1NfVkVSU0lPTl9XSU45WCkKLSAgICB7Ci0gICAgICAgIHNQb3MgPSBzdHJzdHIoc3pJbWFnZVBhdGgsICItayBzdGFydCIpOwotICAgICAgICBpZiAoc1BvcykKLSAgICAgICAgewotICAgICAgICAgICAgbHN0cmNweW4oc3pCdWYsIHN6SW1hZ2VQYXRoLCBzUG9zIC0gc3pJbWFnZVBhdGgpOwotICAgICAgICAgICAgc3dpdGNoIChkd0NvbW1hbmQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNFUlZJQ0VfQ09OVFJPTF9TVE9QOgotICAgICAgICAgICAgICAgIGxzdHJjYXQoc3pCdWYsICIgLWsgc3RvcCAtbiAiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU0VSVklDRV9DT05UUk9MX0NPTlRJTlVFOgotICAgICAgICAgICAgICAgIGxzdHJjYXQoc3pCdWYsICIgLWsgc3RhcnQgLW4gIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNFUlZJQ0VfQVBBQ0hFX1JFU1RBUlQ6Ci0gICAgICAgICAgICAgICAgbHN0cmNhdChzekJ1ZiwgIiAtayByZXN0YXJ0IC1uICIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTRVJWSUNFX0NPTlRST0xfU0hVVERPV046Ci0gICAgICAgICAgICAgICAgbHN0cmNhdChzekJ1ZiwgIiAtayB1bmluc3RhbGwgLW4gIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxzdHJjYXQoc3pCdWYsIHN6U2VydmljZU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgaWYgKCFSdW5BbmRGb3JnZXRDb25zb2xlKHN6QnVmLCAmcmV0Q29kZSwgRkFMU0UpKQotICAgICAgICB7Ci0gICAgICAgICAgICBFcnJvck1lc3NhZ2UocmV0Q29kZSk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc1BvcyA9IHN0cnN0cihzekltYWdlUGF0aCwgIi0tbnRzZXJ2aWNlIik7Ci0gICAgICAgIGlmICghc1BvcykKLSAgICAgICAgewotICAgICAgICAgICAgc1BvcyA9IHN0cnN0cihzekltYWdlUGF0aCwgIi1rIHJ1bnNlcnZpY2UiKTsKLSAgICAgICAgICAgIG50U2VydmljZSA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzUG9zKQotICAgICAgICB7Ci0gICAgICAgICAgICBsc3RyY3B5bihzekJ1Ziwgc3pJbWFnZVBhdGgsIHNQb3MgLSBzekltYWdlUGF0aCk7Ci0gICAgICAgICAgICBpZiAoZHdDb21tYW5kID09IFNFUlZJQ0VfQ09OVFJPTF9TSFVURE9XTikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsc3RyY2F0KHN6QnVmLCAiIC1rIHVuaW5zdGFsbCAtbiAiKTsKLSAgICAgICAgICAgICAgICBsc3RyY2F0KHN6QnVmLCBzelNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoIVJ1bkFuZEZvcmdldENvbnNvbGUoc3pCdWYsICZyZXRDb2RlLCBGQUxTRSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UocmV0Q29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIHNjaFNDTWFuYWdlciA9IE9wZW5TQ01hbmFnZXIoCi0gICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgIFNDX01BTkFHRVJfQUxMX0FDQ0VTUwotICAgICAgICAgICApOwotICAgICAgICBpZiAoIXNjaFNDTWFuYWdlcikKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgCi0gICAgICAgIHNjaFNlcnZpY2UgPSBPcGVuU2VydmljZShzY2hTQ01hbmFnZXIsIHN6U2VydmljZU5hbWUsIFNFUlZJQ0VfQUxMX0FDQ0VTUyk7Ci0gICAgICAgIGlmIChzY2hTZXJ2aWNlICE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldFZhbHVlID0gRkFMU0U7Ci0gICAgICAgICAgICBzd2l0Y2ggKGR3Q29tbWFuZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfQ09OVFJPTF9TVE9QOgotICAgICAgICAgICAgICAgICAgICBpZihDb250cm9sU2VydmljZShzY2hTZXJ2aWNlLCBTRVJWSUNFX0NPTlRST0xfU1RPUCwgJnNjaFNTdGF0dXMpKSAKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoUXVlcnlTZXJ2aWNlU3RhdHVzKHNjaFNlcnZpY2UsICZzY2hTU3RhdHVzKSkgCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjaFNTdGF0dXMuZHdDdXJyZW50U3RhdGUgPT0gU0VSVklDRV9TVE9QX1BFTkRJTkcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsZWVwKDEwMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKFF1ZXJ5U2VydmljZVN0YXR1cyhzY2hTZXJ2aWNlLCAmc2NoU1N0YXR1cykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNjaFNTdGF0dXMuZHdDdXJyZW50U3RhdGUgPT0gU0VSVklDRV9TVE9QUEVEKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbHVlID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfQ09OVFJPTF9DT05USU5VRToKLSAgICAgICAgICAgICAgICAgICAgYXJncyA9IChjaGFyICoqKW1hbGxvYygzICogc2l6ZW9mKGNoYXIqKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSBzekJ1ZjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG50U2VydmljZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMV0gPSAiLS1udHNlcnZpY2UiOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMV0gPSAiLWsiOwotICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1syXSA9ICJydW5zZXJ2aWNlIjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZihTdGFydFNlcnZpY2Uoc2NoU2VydmljZSwgbnRTZXJ2aWNlID8gMiA6IDMsIGFyZ3MpKSAKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoUXVlcnlTZXJ2aWNlU3RhdHVzKHNjaFNlcnZpY2UsICZzY2hTU3RhdHVzKSkgCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjaFNTdGF0dXMuZHdDdXJyZW50U3RhdGUgPT0gU0VSVklDRV9TVEFSVF9QRU5ESU5HKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbGVlcCgxMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChRdWVyeVNlcnZpY2VTdGF0dXMoc2NoU2VydmljZSwgJnNjaFNTdGF0dXMpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihzY2hTU3RhdHVzLmR3Q3VycmVudFN0YXRlID09IFNFUlZJQ0VfUlVOTklORykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWx1ZSA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogaXMgdGhpcyBPSyB0byBkbz8gKi8KLSAgICAgICAgICAgICAgICAgICAgZnJlZShhcmdzKTsKLSAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX0FQQUNIRV9SRVNUQVJUOgotICAgICAgICAgICAgICAgICAgICBpZihDb250cm9sU2VydmljZShzY2hTZXJ2aWNlLCBTRVJWSUNFX0FQQUNIRV9SRVNUQVJULCAmc2NoU1N0YXR1cykpIAotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aWNrcyA9IDYwOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoc2NoU1N0YXR1cy5kd0N1cnJlbnRTdGF0ZSA9PSBTRVJWSUNFX1NUQVJUX1BFTkRJTkcpIAotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsZWVwKDEwMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFRdWVyeVNlcnZpY2VTdGF0dXMoc2NoU2VydmljZSwgJnNjaFNTdGF0dXMpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjaFNlcnZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NoU0NNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIS0tdGlja3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmKHNjaFNTdGF0dXMuZHdDdXJyZW50U3RhdGUgPT0gU0VSVklDRV9SVU5OSU5HKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbHVlID0gVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NoU2VydmljZSk7Ci0gICAgICAgICAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NoU0NNYW5hZ2VyKTsKLSAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZTsKLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFwX3Jlc2NhblNlcnZpY2VzID0gVFJVRTsKLSAgICAgICAgCi0gICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzY2hTQ01hbmFnZXIpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBGQUxTRTsKLX0KLQotQk9PTCBJc1NlcnZpY2VSdW5uaW5nKExQQ1NUUiBzelNlcnZpY2VOYW1lLCBMUERXT1JEIGxwZHdQaWQpCi17Ci0KLSAgICBEV09SRCBkd1BpZCwgZHdCeXRlczsKLSAgICBIV05EICBoV25kOwotICAgIFNDX0hBTkRMRSAgIHNjaFNlcnZpY2U7Ci0gICAgU0NfSEFORExFICAgc2NoU0NNYW5hZ2VyOyAgICAKLSAgICBTRVJWSUNFX1NUQVRVUyBzY2hTU3RhdHVzOwotICAgIFNFUlZJQ0VfU1RBVFVTX1BST0NFU1Mgc2NoU1Byb2Nlc3M7Ci0gICAgSEFORExFIGhBZHZhcGk7Ci0gICAgUVVFUllTRVJWSUNFU1RBVFVTRVggcFF1ZXJ5U2VydmljZVN0YXR1c0V4ID0gTlVMTDsKLQotICAgIGlmIChhcF9PU1ZlcnNpb24gPT0gT1NfVkVSU0lPTl9XSU45WCkKLSAgICB7Ci0gICAgICAgIGhXbmQgPSBGaW5kV2luZG93KCJBcGFjaGVXaW45NVNlcnZpY2VNb25pdG9yIiwgc3pTZXJ2aWNlTmFtZSk7Ci0gICAgICAgIGlmIChoV25kICYmIEdldFdpbmRvd1RocmVhZFByb2Nlc3NJZChoV25kLCAmZHdQaWQpKQotICAgICAgICB7Ci0gICAgICAgICAgICAqbHBkd1BpZCA9IGR3UGlkOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCi0gICAgICAgIGR3UGlkID0gMDsKLSAgICAgICAgc2NoU0NNYW5hZ2VyID0gT3BlblNDTWFuYWdlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NfTUFOQUdFUl9BTExfQUNDRVNTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICBpZiAoIXNjaFNDTWFuYWdlcikKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgICAgICBzY2hTZXJ2aWNlID0gT3BlblNlcnZpY2Uoc2NoU0NNYW5hZ2VyLCBzelNlcnZpY2VOYW1lLCBTRVJWSUNFX1FVRVJZX1NUQVRVUyk7Ci0gICAgICAgIGlmIChzY2hTZXJ2aWNlICE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChRdWVyeVNlcnZpY2VTdGF0dXMoc2NoU2VydmljZSwgJnNjaFNTdGF0dXMpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGR3UGlkID0gc2NoU1N0YXR1cy5kd0N1cnJlbnRTdGF0ZTsKLSAgICAgICAgICAgICAgICBpZiAobHBkd1BpZCkKLSAgICAgICAgICAgICAgICAgICAgKmxwZHdQaWQgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFwX09TVmVyc2lvbiA9PSBPU19WRVJTSU9OX1dJTjJLKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhBZHZhcGkgPSBMb2FkTGlicmFyeSgiQURWQVBJMzIuRExMIik7Ci0gICAgICAgICAgICAgICAgaWYgKGhBZHZhcGkgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgcFF1ZXJ5U2VydmljZVN0YXR1c0V4ID0gKFFVRVJZU0VSVklDRVNUQVRVU0VYKUdldFByb2NBZGRyZXNzKGhBZHZhcGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJRdWVyeVNlcnZpY2VTdGF0dXNFeCIpOwotICAgICAgICAgICAgICAgIGlmIChoQWR2YXBpICE9IE5VTEwgJiYgcFF1ZXJ5U2VydmljZVN0YXR1c0V4ICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAocFF1ZXJ5U2VydmljZVN0YXR1c0V4KHNjaFNlcnZpY2UsIFNDX1NUQVRVU19QUk9DRVNTX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUEJZVEUpJnNjaFNQcm9jZXNzLCBzaXplb2YoU0VSVklDRV9TVEFUVVNfUFJPQ0VTUyksICZkd0J5dGVzKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZHdQaWQgPSBzY2hTUHJvY2Vzcy5kd0N1cnJlbnRTdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChscGR3UGlkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpscGR3UGlkID0gc2NoU1Byb2Nlc3MuZHdQcm9jZXNzSWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGhBZHZhcGkgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgRnJlZUxpYnJhcnkoaEFkdmFwaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NoU2VydmljZSk7Ci0gICAgICAgICAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NoU0NNYW5hZ2VyKTsKLSAgICAgICAgICAgIHJldHVybiBkd1BpZCA9PSBTRVJWSUNFX1JVTk5JTkcgPyBUUlVFIDogRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXBfcmVzY2FuU2VydmljZXMgPSBUUlVFOwotCi0gICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzY2hTQ01hbmFnZXIpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICB9Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLUJPT0wgRmluZFJ1bm5pbmdTZXJ2aWNlcygpCi17Ci0gICAgaW50IGkgPSAwOwotICAgIERXT1JEIGR3UGlkOwotICAgIEJPT0wgcnYgPSBGQUxTRTsKLSAgICB3aGlsZSAoYXBfc3RTZXJ2aWNlc1tpXS5zelNlcnZpY2VOYW1lICE9IE5VTEwpCi0gICAgeyAgICAKLSAgICAgICAgaWYgKCFJc1NlcnZpY2VSdW5uaW5nKGFwX3N0U2VydmljZXNbaV0uc3pTZXJ2aWNlTmFtZSwgJmR3UGlkKSkKLSAgICAgICAgICAgIGR3UGlkID0gMDsKLSAgICAgICAgaWYgKGFwX3N0U2VydmljZXNbaV0uZHdQaWQgIT0gZHdQaWQpCi0gICAgICAgICAgICBydiA9IFRSVUU7Ci0gICAgICAgIGFwX3N0U2VydmljZXNbaV0uZHdQaWQgPSBkd1BpZDsKLSAgICAgICAgKytpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcnY7Ci19Ci0KLUJPT0wgR2V0QXBhY2hlU2VydmljZXNTdGF0dXMoKQotewotCi0gICAgQ0hBUiBzektleVtNQVhfUEFUSF07Ci0gICAgQ0hBUiBhY2hLZXlbTUFYX1BBVEhdOwotICAgIENIQVIgc3pJbWFnZVBhdGhbTUFYX1BBVEhdOwotICAgIENIQVIgc3pCdWZbTUFYX1BBVEhdOwotCi0gICAgSEtFWSBoS2V5LCBoU3ViS2V5OwotICAgIERXT1JEIHJldENvZGUsIHJ2LCBkd0tleVR5cGU7Ci0gICAgRFdPUkQgZHdCdWZMZW4gPSBNQVhfUEFUSDsKLQotICAgIGludCAgaSwgc3RQb3MgPSAwOwotICAgIGFwX3Jlc2NhblNlcnZpY2VzID0gRkFMU0U7Ci0KLSAgICByZXRDb2RlID0gUmVnT3BlbktleUV4KEhLRVlfTE9DQUxfTUFDSElORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcU2VydmljZXNcXCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgS0VZX1JFQUQsICZoS2V5KTsKLSAgICBpZiAocmV0Q29kZSAhPSBFUlJPUl9TVUNDRVNTKQotICAgIHsKLSAgICAgICAgRXJyb3JNZXNzYWdlKHJldENvZGUpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGFwX0NsZWFyU2VydmljZXNTdCgpOwotICAgIGZvciAoaSA9IDAsIHJldENvZGUgPSBFUlJPUl9TVUNDRVNTOyByZXRDb2RlID09IEVSUk9SX1NVQ0NFU1M7IGkrKykKLSAgICB7Ci0KLSAgICAgICAgcmV0Q29kZSA9IFJlZ0VudW1LZXkoaEtleSwgaSwgYWNoS2V5LCBNQVhfUEFUSCk7Ci0gICAgICAgIGlmIChyZXRDb2RlID09IEVSUk9SX1NVQ0NFU1MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxzdHJjcHkoc3pLZXksICJTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxTZXJ2aWNlc1xcIik7Ci0gICAgICAgICAgICBsc3RyY2F0KHN6S2V5LCBhY2hLZXkpOwotCi0gICAgICAgICAgICBpZiAoUmVnT3BlbktleUV4KEhLRVlfTE9DQUxfTUFDSElORSwgc3pLZXksIDAsIAotICAgICAgICAgICAgICAgIEtFWV9RVUVSWV9WQUxVRSwgJmhTdWJLZXkpID09IEVSUk9SX1NVQ0NFU1MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZHdCdWZMZW4gPSBNQVhfUEFUSDsKLSAgICAgICAgICAgICAgICBydiA9IFJlZ1F1ZXJ5VmFsdWVFeChoU3ViS2V5LCAiSW1hZ2VQYXRoIiwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR3S2V5VHlwZSwgc3pJbWFnZVBhdGgsICZkd0J1Zkxlbik7Ci0KLSAgICAgICAgICAgICAgICBpZiAocnYgPT0gRVJST1JfU1VDQ0VTUyAmJiAoZHdLZXlUeXBlID09IFJFR19TWiAgfHwgZHdLZXlUeXBlID09IFJFR19FWFBBTkRfU1opICYmIGR3QnVmTGVuKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbHN0cmNweShzekJ1Ziwgc3pJbWFnZVBhdGgpOwotICAgICAgICAgICAgICAgICAgICBDaGFyTG93ZXIoc3pCdWYpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3Ryc3RyKHN6QnVmLCAiXFxhcGFjaGUuZXhlIikgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBfc3RTZXJ2aWNlc1tzdFBvc10uc3pTZXJ2aWNlTmFtZSA9IHN0cmR1cChhY2hLZXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXBfc3RTZXJ2aWNlc1tzdFBvc10uc3pJbWFnZVBhdGggPSBzdHJkdXAoc3pJbWFnZVBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZHdCdWZMZW4gPSBNQVhfUEFUSDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZWdRdWVyeVZhbHVlRXgoaFN1YktleSwgIkRlc2NyaXB0aW9uIiwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR3S2V5VHlwZSwgc3pCdWYsICZkd0J1ZkxlbikgPT0gRVJST1JfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9zdFNlcnZpY2VzW3N0UG9zXS5zekRlc2NyaXB0aW9uID0gc3RyZHVwKHN6QnVmKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZHdCdWZMZW4gPSBNQVhfUEFUSDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZWdRdWVyeVZhbHVlRXgoaFN1YktleSwgIkRpc3BsYXlOYW1lIiwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR3S2V5VHlwZSwgc3pCdWYsICZkd0J1ZkxlbikgPT0gRVJST1JfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9zdFNlcnZpY2VzW3N0UG9zXS5zekRpc3BsYXlOYW1lPSBzdHJkdXAoc3pCdWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKytzdFBvczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdFBvcyA+PSBNQVhfQVBBQ0hFX1NFUlZJQ0VTKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldENvZGUgPSAhRVJST1JfU1VDQ0VTUzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBSZWdDbG9zZUtleShoU3ViS2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBSZWdDbG9zZUtleShoS2V5KTsKLSAgICBGaW5kUnVubmluZ1NlcnZpY2VzKCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUxSRVNVTFQgQ0FMTEJBQ0sgU2VydmljZURsZ1Byb2MoSFdORCBoRGxnLCBVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCi17Ci0KLSAgICBDSEFSIHRjaEJ1ZmZlcltNQVhfUEFUSF07IAotICAgIENIQVIgdHNiQnVmZmVyW01BWF9QQVRIXTsKLSAgICBDSEFSIHN6QnVmWzY0XTsKLSAgICBIV05EIGhMaXN0Qm94OwotICAgIHN0YXRpYyBIV05EIGhTdGF0dXNCYXI7IAotICAgIFRFWFRNRVRSSUMgdG07IAotICAgIGludCBpLCB5OyAKLSAgICBIREMgaGRjTWVtOyAKLSAgICBMUE1FQVNVUkVJVEVNU1RSVUNUIGxwbWlzOyAKLSAgICBMUERSQVdJVEVNU1RSVUNUIGxwZGlzOyAKLSAgICBSRUNUIHJjQml0bWFwOyAKLSAgICBVSU5UIG5JdGVtOwotCi0gICAgc3dpdGNoIChtZXNzYWdlKSAKLSAgICB7IAotIAotICAgICAgICBjYXNlIFdNX0lOSVRESUFMT0c6IAotICAgICAgICAgICAgU2hvd1dpbmRvdyhoRGxnLCBTV19ISURFKTsKLSAgICAgICAgICAgIGFwX2hTZXJ2aWNlRGxnID0gaERsZzsKLSAgICAgICAgICAgIGhibXBTdGFydCA9IExvYWRCaXRtYXAoYXBfaEluc3RhbmNlLCBNQUtFSU5UUkVTT1VSQ0UoSURCX0JNUFJVTikpOyAKLSAgICAgICAgICAgIGhibXBTdG9wICA9IExvYWRCaXRtYXAoYXBfaEluc3RhbmNlLCBNQUtFSU5UUkVTT1VSQ0UoSURCX0JNUFNUT1ApKTsgCi0KLSAgICAgICAgICAgIEJ1dHRvbl9FbmFibGUoR2V0RGxnSXRlbShoRGxnLCBJRENfU1NUQVJUKSwgRkFMU0UpOwotICAgICAgICAgICAgQnV0dG9uX0VuYWJsZShHZXREbGdJdGVtKGhEbGcsIElEQ19TU1RPUCksIEZBTFNFKTsKLSAgICAgICAgICAgIEJ1dHRvbl9FbmFibGUoR2V0RGxnSXRlbShoRGxnLCBJRENfU1JFU1RBUlQpLCBGQUxTRSk7Ci0gICAgICAgICAgICBCdXR0b25fRW5hYmxlKEdldERsZ0l0ZW0oaERsZywgSURDX1NVTklOU1RBTEwpLCBGQUxTRSk7Ci0gICAgICAgICAgICBoTGlzdEJveCA9IEdldERsZ0l0ZW0oaERsZywgSURMX1NFUlZJQ0VTKTsgCi0gICAgICAgICAgICBoU3RhdHVzQmFyID0gQ3JlYXRlU3RhdHVzV2luZG93KFNCVF9UT09MVElQUyB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIGhEbGcsIElEQ19TVEFUQkFSKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChHZXRBcGFjaGVTZXJ2aWNlc1N0YXR1cygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkgPSAwOwotICAgICAgICAgICAgICAgIHdoaWxlIChhcF9zdFNlcnZpY2VzW2ldLnN6U2VydmljZU5hbWUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICB7ICAgIAotICAgICAgICAgICAgICAgICAgICBhZGRJdGVtKGhMaXN0Qm94LCBhcF9zdFNlcnZpY2VzW2ldLnN6RGlzcGxheU5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgYXBfc3RTZXJ2aWNlc1tpXS5kd1BpZCA9PSAwID8gaGJtcFN0b3AgOiBoYm1wU3RhcnQpOwotICAgICAgICAgICAgICAgICAgICArK2k7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ2VudGVyV2luZG93KGhEbGcpOwotICAgICAgICAgICAgU2hvd1dpbmRvdyhoRGxnLCBTV19TSE9XKTsKLSAgICAgICAgICAgIFNldEZvY3VzKGhMaXN0Qm94KTsgCi0gICAgICAgICAgICBTZW5kTWVzc2FnZShoTGlzdEJveCwgTEJfU0VUQ1VSU0VMLCAwLCAwKTsgCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgV01fVVBEQVRFTUVTU0FHRToKLSAgICAgICAgICAgIGhMaXN0Qm94ID0gR2V0RGxnSXRlbShoRGxnLCBJRExfU0VSVklDRVMpOyAKLSAgICAgICAgICAgIFNlbmRNZXNzYWdlKGhMaXN0Qm94LCBMQl9SRVNFVENPTlRFTlQsIDAsIDApOyAKLSAgICAgICAgICAgIEJ1dHRvbl9FbmFibGUoR2V0RGxnSXRlbShoRGxnLCBJRENfU1NUQVJUKSwgRkFMU0UpOwotICAgICAgICAgICAgQnV0dG9uX0VuYWJsZShHZXREbGdJdGVtKGhEbGcsIElEQ19TU1RPUCksIEZBTFNFKTsKLSAgICAgICAgICAgIEJ1dHRvbl9FbmFibGUoR2V0RGxnSXRlbShoRGxnLCBJRENfU1JFU1RBUlQpLCBGQUxTRSk7Ci0gICAgICAgICAgICBCdXR0b25fRW5hYmxlKEdldERsZ0l0ZW0oaERsZywgSURDX1NVTklOU1RBTEwpLCBGQUxTRSk7Ci0gICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChhcF9zdFNlcnZpY2VzW2ldLnN6U2VydmljZU5hbWUgIT0gTlVMTCkKLSAgICAgICAgICAgIHsgICAgCi0gICAgICAgICAgICAgICAgYWRkSXRlbShoTGlzdEJveCwgYXBfc3RTZXJ2aWNlc1tpXS5zekRpc3BsYXlOYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgYXBfc3RTZXJ2aWNlc1tpXS5kd1BpZCA9PSAwID8gaGJtcFN0b3AgOiBoYm1wU3RhcnQpOwotICAgICAgICAgICAgICAgICsraTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNlbmRNZXNzYWdlKGhMaXN0Qm94LCBMQl9TRVRDVVJTRUwsIDAsIDApOyAKLSAgICAgICAgICAgIC8qIERpcnR5IGhhY2sgdG8gYnJpbmcgdGhlIHdpbmRvdyB0byB0aGUgZm9yZWdyb3VuZCAqLwotICAgICAgICAgICAgIFNldFdpbmRvd1BvcyhoRGxnLCBIV05EX1RPUE1PU1QsIDAsIDAsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSB8IFNXUF9TSE9XV0lORE9XKTsKLSAgICAgICAgICAgIFNldFdpbmRvd1BvcyhoRGxnLCBIV05EX05PVE9QTU9TVCwgMCwgMCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXUF9OT1NJWkUgfCBTV1BfTk9NT1ZFIHwgU1dQX1NIT1dXSU5ET1cpOwotICAgICAgICAgICAgU2V0Rm9jdXMoaExpc3RCb3gpOyAKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBXTV9NRUFTVVJFSVRFTTogCi0gCi0gICAgICAgICAgICBscG1pcyA9IChMUE1FQVNVUkVJVEVNU1RSVUNUKSBsUGFyYW07IAotICAgICAgICAgICAgbHBtaXMtPml0ZW1IZWlnaHQgPSAxNjsgCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsgCi0gCi0gICAgICAgIGNhc2UgV01fRFJBV0lURU06IAotIAotICAgICAgICAgICAgbHBkaXMgPSAoTFBEUkFXSVRFTVNUUlVDVCkgbFBhcmFtOyAKLSAgICAgICAgICAgIGlmIChscGRpcy0+aXRlbUlEID09IC0xKSAKLSAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgICAgYnJlYWs7IAotICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIHN3aXRjaCAobHBkaXMtPml0ZW1BY3Rpb24pIAotICAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgICBjYXNlIE9EQV9TRUxFQ1Q6IAotICAgICAgICAgICAgICAgIGNhc2UgT0RBX0RSQVdFTlRJUkU6IAotICAgICAgICAgICAgICAgICAgICBoYm1wUGljdHVyZSA9IChIQklUTUFQKVNlbmRNZXNzYWdlKGxwZGlzLT5od25kSXRlbSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBMQl9HRVRJVEVNREFUQSwgbHBkaXMtPml0ZW1JRCwgKExQQVJBTSkgMCk7IAotIAotICAgICAgICAgICAgICAgICAgICBoZGNNZW0gPSBDcmVhdGVDb21wYXRpYmxlREMobHBkaXMtPmhEQyk7IAotICAgICAgICAgICAgICAgICAgICBoYm1wT2xkID0gU2VsZWN0T2JqZWN0KGhkY01lbSwgaGJtcFBpY3R1cmUpOyAKLSAKLSAgICAgICAgICAgICAgICAgICAgQml0Qmx0KGxwZGlzLT5oREMsIAotICAgICAgICAgICAgICAgICAgICAgICAgbHBkaXMtPnJjSXRlbS5sZWZ0LCBscGRpcy0+cmNJdGVtLnRvcCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBscGRpcy0+cmNJdGVtLnJpZ2h0IC0gbHBkaXMtPnJjSXRlbS5sZWZ0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGxwZGlzLT5yY0l0ZW0uYm90dG9tIC0gbHBkaXMtPnJjSXRlbS50b3AsIAotICAgICAgICAgICAgICAgICAgICAgICAgaGRjTWVtLCAwLCAwLCBTUkNDT1BZKTsgCi0gICAgICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlKGxwZGlzLT5od25kSXRlbSwgTEJfR0VUVEVYVCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBscGRpcy0+aXRlbUlELCAoTFBBUkFNKSB0Y2hCdWZmZXIpOyAKLSAKLSAgICAgICAgICAgICAgICAgICAgR2V0VGV4dE1ldHJpY3MobHBkaXMtPmhEQywgJnRtKTsgIAotICAgICAgICAgICAgICAgICAgICB5ID0gKGxwZGlzLT5yY0l0ZW0uYm90dG9tICsgbHBkaXMtPnJjSXRlbS50b3AgLSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtLnRtSGVpZ2h0KSAvIDI7IAotICAKLSAgICAgICAgICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGhkY01lbSwgaGJtcE9sZCk7IAotICAgICAgICAgICAgICAgICAgICBEZWxldGVEQyhoZGNNZW0pOyAKLSAKLSAgICAgICAgICAgICAgICAgICAgcmNCaXRtYXAubGVmdCA9IGxwZGlzLT5yY0l0ZW0ubGVmdCArIFhCSVRNQVA7IAotICAgICAgICAgICAgICAgICAgICByY0JpdG1hcC50b3AgPSBscGRpcy0+cmNJdGVtLnRvcDsgCi0gICAgICAgICAgICAgICAgICAgIHJjQml0bWFwLnJpZ2h0ID0gbHBkaXMtPnJjSXRlbS5yaWdodDsgCi0gICAgICAgICAgICAgICAgICAgIHJjQml0bWFwLmJvdHRvbSA9IGxwZGlzLT5yY0l0ZW0udG9wICsgWUJJVE1BUDsgCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxwZGlzLT5pdGVtU3RhdGUgJiBPRFNfU0VMRUNURUQpIAotICAgICAgICAgICAgICAgICAgICB7IAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhibXBQaWN0dXJlID09IGhibXBTdG9wKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1dHRvbl9FbmFibGUoR2V0RGxnSXRlbShoRGxnLCBJRENfU1NUQVJUKSwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnV0dG9uX0VuYWJsZShHZXREbGdJdGVtKGhEbGcsIElEQ19TU1RPUCksIEZBTFNFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXR0b25fRW5hYmxlKEdldERsZ0l0ZW0oaERsZywgSURDX1NSRVNUQVJUKSwgRkFMU0UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1dHRvbl9FbmFibGUoR2V0RGxnSXRlbShoRGxnLCBJRENfU1VOSU5TVEFMTCksIFRSVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaGJtcFBpY3R1cmUgPT0gaGJtcFN0YXJ0KSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXR0b25fRW5hYmxlKEdldERsZ0l0ZW0oaERsZywgSURDX1NTVEFSVCksIEZBTFNFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXR0b25fRW5hYmxlKEdldERsZ0l0ZW0oaERsZywgSURDX1NTVE9QKSwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnV0dG9uX0VuYWJsZShHZXREbGdJdGVtKGhEbGcsIElEQ19TUkVTVEFSVCksIFRSVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1dHRvbl9FbmFibGUoR2V0RGxnSXRlbShoRGxnLCBJRENfU1VOSU5TVEFMTCksIEZBTFNFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGFwX3N0U2VydmljZXNbaV0uc3pTZXJ2aWNlTmFtZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgeyAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobHN0cmNtcChhcF9zdFNlcnZpY2VzW2ldLnN6RGlzcGxheU5hbWUsIHRjaEJ1ZmZlcikgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcF9zdFNlcnZpY2VzW2ldLnN6RGVzY3JpcHRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsc3RyY3B5KHRzYkJ1ZmZlciwgYXBfc3RTZXJ2aWNlc1tpXS5zekRlc2NyaXB0aW9uKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzdHJjcHkodHNiQnVmZmVyLCBhcF9zdFNlcnZpY2VzW2ldLnN6SW1hZ2VQYXRoKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcF9zdFNlcnZpY2VzW2ldLmR3UGlkICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXBfc3RTZXJ2aWNlc1tpXS5kd1BpZCAmIDB4RkYwMDAwMDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzekJ1ZiwgIiAgUElEIDogMHglMDhYIiwgYXBfc3RTZXJ2aWNlc1tpXS5kd1BpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzekJ1ZiwgIiAgUElEIDogJWQiLCBhcF9zdFNlcnZpY2VzW2ldLmR3UGlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzdHJjYXQodHNiQnVmZmVyLCBzekJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UoaFN0YXR1c0JhciwgU0JfU0VUVEVYVCwgMCwgKExQQVJBTSl0c2JCdWZmZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBTZXRUZXh0Q29sb3IobHBkaXMtPmhEQywgR2V0U3lzQ29sb3IoQ09MT1JfSElHSExJR0hUVEVYVCkpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldEJrQ29sb3IobHBkaXMtPmhEQywgR2V0U3lzQ29sb3IoQ09MT1JfSElHSExJR0hUKSk7IAotICAgICAgICAgICAgICAgICAgICAgICAgRmlsbFJlY3QobHBkaXMtPmhEQywgJnJjQml0bWFwLCAoSEJSVVNIKShDT0xPUl9ISUdITElHSFRURVhUKSk7IAotICAgICAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgU2V0VGV4dENvbG9yKGxwZGlzLT5oREMsIEdldFN5c0NvbG9yKENPTE9SX01FTlVURVhUKSk7IAotICAgICAgICAgICAgICAgICAgICAgICBTZXRCa0NvbG9yKGxwZGlzLT5oREMsIEdldFN5c0NvbG9yKENPTE9SX1dJTkRPVykpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgRmlsbFJlY3QobHBkaXMtPmhEQywgJnJjQml0bWFwLCAoSEJSVVNIKShDT0xPUl9XSU5ET1crMSkpOyAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBUZXh0T3V0KGxwZGlzLT5oREMsIAotICAgICAgICAgICAgICAgICAgICAgICAgWEJJVE1BUCArIDYsIAotICAgICAgICAgICAgICAgICAgICAgICAgeSwgCi0gICAgICAgICAgICAgICAgICAgICAgICB0Y2hCdWZmZXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKHRjaEJ1ZmZlcikpOyAKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAotIAotICAgICAgICAgICAgICAgIGNhc2UgT0RBX0ZPQ1VTOiAKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAotICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIHJldHVybiBUUlVFOyAgCi0gICAgICAgIGNhc2UgV01fQ09NTUFORDogCi0gICAgICAgICAgICBzd2l0Y2ggKExPV09SRCh3UGFyYW0pKSAKLSAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgICAgY2FzZSBJRExfU0VSVklDRVM6Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoSElXT1JEKHdQYXJhbSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTEJOX0RCTENMSzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRBcGFjaGVTZXJ2aWNlc1N0YXR1cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlKGhEbGcsIFdNX1VQREFURU1FU1NBR0UsIDAsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBJRE9LOiAKLSAgICAgICAgICAgICAgICAgICAgRW5kRGlhbG9nKGhEbGcsIFRSVUUpOyAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7IAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSURDX1NTVEFSVDogCi0gICAgICAgICAgICAgICAgICAgIEJ1dHRvbl9FbmFibGUoR2V0RGxnSXRlbShoRGxnLCBJRENfU1NUQVJUKSwgRkFMU0UpOwotICAgICAgICAgICAgICAgICAgICBoTGlzdEJveCA9IEdldERsZ0l0ZW0oaERsZywgSURMX1NFUlZJQ0VTKTsgCi0gICAgICAgICAgICAgICAgICAgIG5JdGVtID0gU2VuZE1lc3NhZ2UoaExpc3RCb3gsIExCX0dFVENVUlNFTCwgMCwgMCk7IAotICAgICAgICAgICAgICAgICAgICBpZiAobkl0ZW0gIT0gTEJfRVJSKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGVNYW5hZ2VTZXJ2aWNlKGFwX3N0U2VydmljZXNbbkl0ZW1dLnN6U2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9zdFNlcnZpY2VzW25JdGVtXS5zekltYWdlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFUlZJQ0VfQ09OVFJPTF9DT05USU5VRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQnV0dG9uX0VuYWJsZShHZXREbGdJdGVtKGhEbGcsIElEQ19TU1RBUlQpLCBUUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBJRENfU1NUT1A6IAotICAgICAgICAgICAgICAgICAgICBCdXR0b25fRW5hYmxlKEdldERsZ0l0ZW0oaERsZywgSURDX1NTVE9QKSwgRkFMU0UpOwotICAgICAgICAgICAgICAgICAgICBoTGlzdEJveCA9IEdldERsZ0l0ZW0oaERsZywgSURMX1NFUlZJQ0VTKTsgCi0gICAgICAgICAgICAgICAgICAgIG5JdGVtID0gU2VuZE1lc3NhZ2UoaExpc3RCb3gsIExCX0dFVENVUlNFTCwgMCwgMCk7IAotICAgICAgICAgICAgICAgICAgICBpZiAobkl0ZW0gIT0gTEJfRVJSKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGVNYW5hZ2VTZXJ2aWNlKGFwX3N0U2VydmljZXNbbkl0ZW1dLnN6U2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9zdFNlcnZpY2VzW25JdGVtXS5zekltYWdlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFUlZJQ0VfQ09OVFJPTF9TVE9QKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBCdXR0b25fRW5hYmxlKEdldERsZ0l0ZW0oaERsZywgSURDX1NTVE9QKSwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSURDX1NSRVNUQVJUOiAKLSAgICAgICAgICAgICAgICAgICAgQnV0dG9uX0VuYWJsZShHZXREbGdJdGVtKGhEbGcsIElEQ19TUkVTVEFSVCksIEZBTFNFKTsKLSAgICAgICAgICAgICAgICAgICAgaExpc3RCb3ggPSBHZXREbGdJdGVtKGhEbGcsIElETF9TRVJWSUNFUyk7IAotICAgICAgICAgICAgICAgICAgICBuSXRlbSA9IFNlbmRNZXNzYWdlKGhMaXN0Qm94LCBMQl9HRVRDVVJTRUwsIDAsIDApOyAKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5JdGVtICE9IExCX0VSUikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlTWFuYWdlU2VydmljZShhcF9zdFNlcnZpY2VzW25JdGVtXS5zelNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfc3RTZXJ2aWNlc1tuSXRlbV0uc3pJbWFnZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVJWSUNFX0FQQUNIRV9SRVNUQVJUKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBCdXR0b25fRW5hYmxlKEdldERsZ0l0ZW0oaERsZywgSURDX1NSRVNUQVJUKSwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSURDX1NVTklOU1RBTEw6IAotICAgICAgICAgICAgICAgICAgICBCdXR0b25fRW5hYmxlKEdldERsZ0l0ZW0oaERsZywgSURDX1NVTklOU1RBTEwpLCBGQUxTRSk7Ci0gICAgICAgICAgICAgICAgICAgIGhMaXN0Qm94ID0gR2V0RGxnSXRlbShoRGxnLCBJRExfU0VSVklDRVMpOyAKLSAgICAgICAgICAgICAgICAgICAgbkl0ZW0gPSBTZW5kTWVzc2FnZShoTGlzdEJveCwgTEJfR0VUQ1VSU0VMLCAwLCAwKTsgCi0gICAgICAgICAgICAgICAgICAgIGlmIChuSXRlbSAhPSBMQl9FUlIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZU1hbmFnZVNlcnZpY2UoYXBfc3RTZXJ2aWNlc1tuSXRlbV0uc3pTZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX3N0U2VydmljZXNbbkl0ZW1dLnN6SW1hZ2VQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VSVklDRV9DT05UUk9MX1NIVVRET1dOKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhcF9yZXNjYW5TZXJ2aWNlcyA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIEJ1dHRvbl9FbmFibGUoR2V0RGxnSXRlbShoRGxnLCBJRENfU1VOSU5TVEFMTCksIFRSVUUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFdNX1NJWkU6Ci0gICAgICAgICAgICBzd2l0Y2ggKExPV09SRCh3UGFyYW0pKSAKLSAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgICAgY2FzZSBTSVpFX01JTklNSVpFRDoKLSAgICAgICAgICAgICAgICAgICAgRW5kRGlhbG9nKGhEbGcsIFRSVUUpOyAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7IAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBXTV9FUkFTRUJLR05EOgotICAgICAgICAgICAgCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBXTV9DTE9TRTogCi0gICAgICAgICAgICBFbmREaWFsb2coaERsZywgVFJVRSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgY2FzZSBXTV9ERVNUUk9ZOiAKLSAgICAgICAgICAgIERlbGV0ZU9iamVjdChoYm1wU3RhcnQpOyAKLSAgICAgICAgICAgIERlbGV0ZU9iamVjdChoYm1wU3RvcCk7IAotICAgICAgICAgICAgcmV0dXJuIFRSVUU7IAotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotLyogQWJvdXQgQm94IGZyb20gTVMgR2VuZXJpYyBTYW1wbGUgKi8KLUxSRVNVTFQgQ0FMTEJBQ0sgQWJvdXREbGdQcm9jKEhXTkQgaERsZywgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotICAgIHN0YXRpYyAgSEZPTlQgaGZvbnREbGc7ICAgIC8qIEZvbnQgZm9yIGRpYWxvZyB0ZXh0ICovCi0gICAgc3RhdGljICBIRk9OVCBoRmluZVByaW50OyAgLyogRm9udCBmb3IgJ2ZpbmUgcHJpbnQnIGluIGRpYWxvZyAqLwotICAgIERXT1JEICAgZHdWZXJJbmZvU2l6ZTsgICAgIC8qIFNpemUgb2YgdmVyc2lvbiBpbmZvcm1hdGlvbiBibG9jayAqLwotICAgIExQU1RSICAgbHBWZXJzaW9uOyAgICAgICAgIC8qIFN0cmluZyBwb2ludGVyIHRvICd2ZXJzaW9uJyB0ZXh0ICovCi0gICAgRFdPUkQgICBkd1ZlckhuZD0wOyAgICAgICAgLyogQW4gJ2lnbm9yZWQnIHBhcmFtZXRlciwgYWx3YXlzICcwJyAqLwotICAgIFVJTlQgICAgdVZlcnNpb25MZW47Ci0gICAgV09SRCAgICB3Um9vdExlbjsKLSAgICBCT09MICAgIGJSZXRDb2RlOwotICAgIGludCAgICAgaTsKLSAgICBjaGFyICAgIHN6RnVsbFBhdGhbMjU2XTsKLSAgICBjaGFyICAgIHN6UmVzdWx0WzI1Nl07Ci0gICAgY2hhciAgICBzekdldE5hbWVbMjU2XTsKLSAgICBjaGFyICAgIHN6VmVyc2lvblsyNTZdOwotICAgIERXT1JEIGR3UmVzdWx0OwotICAgIAotICAgIHN3aXRjaCAobWVzc2FnZSkgewotICAgIGNhc2UgV01fSU5JVERJQUxPRzoKLSAgICAgICAgU2hvd1dpbmRvdyhoRGxnLCBTV19ISURFKTsKLSAgICAgICAgYXBfaHduZEFib3V0RGxnID0gaERsZzsKLSAgICAgICAgCi0gICAgICAgIGhmb250RGxnID0gQ3JlYXRlRm9udCgxNCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAgICAgICAgIFZBUklBQkxFX1BJVENIIHwgRkZfU1dJU1MsICIiKTsKLSAgICAgICAgaEZpbmVQcmludCA9IENyZWF0ZUZvbnQoMTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAgICAgICBWQVJJQUJMRV9QSVRDSCB8IEZGX1NXSVNTLCAiIik7Ci0KLSAgICAgICAgQ2VudGVyV2luZG93KGhEbGcpOwotICAgICAgICBHZXRNb2R1bGVGaWxlTmFtZShhcF9oSW5zdGFuY2UsIHN6RnVsbFBhdGgsIHNpemVvZihzekZ1bGxQYXRoKSk7Ci0gICAgICAgIAotICAgICAgICAvKiBOb3cgbGV0cyBkaXZlIGluIGFuZCBwdWxsIG91dCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbjogKi8KLSAgICAgICAgZHdWZXJJbmZvU2l6ZSA9IEdldEZpbGVWZXJzaW9uSW5mb1NpemUoc3pGdWxsUGF0aCwgJmR3VmVySG5kKTsKLSAgICAgICAgaWYgKGR3VmVySW5mb1NpemUpIHsKLSAgICAgICAgICAgIExQU1RSICAgbHBzdHJWZmZJbmZvOwotICAgICAgICAgICAgSEFORExFICBoTWVtOwotICAgICAgICAgICAgaE1lbSA9IEdsb2JhbEFsbG9jKEdNRU1fTU9WRUFCTEUsIGR3VmVySW5mb1NpemUpOwotICAgICAgICAgICAgbHBzdHJWZmZJbmZvICA9IEdsb2JhbExvY2soaE1lbSk7Ci0gICAgICAgICAgICBHZXRGaWxlVmVyc2lvbkluZm8oc3pGdWxsUGF0aCwgZHdWZXJIbmQsIGR3VmVySW5mb1NpemUsIGxwc3RyVmZmSW5mbyk7Ci0gICAgICAgICAgICBsc3RyY3B5KHN6R2V0TmFtZSwgR2V0U3RyaW5nUmVzKElEU19WRVJfSU5GT19MQU5HKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHdSb290TGVuID0gbHN0cmxlbihzekdldE5hbWUpOyAvKiBTYXZlIHRoaXMgcG9zaXRpb24gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogU2V0IHRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nOiAqLwotICAgICAgICAgICAgbHN0cmNhdChzekdldE5hbWUsICJQcm9kdWN0TmFtZSIpOwotICAgICAgICAgICAgYlJldENvZGUgPSBWZXJRdWVyeVZhbHVlKChMUFZPSUQpbHBzdHJWZmZJbmZvLAotICAgICAgICAgICAgICAgIChMUFNUUilzekdldE5hbWUsCi0gICAgICAgICAgICAgICAgKExQVk9JRCkmbHBWZXJzaW9uLAotICAgICAgICAgICAgICAgIChVSU5UICopJnVWZXJzaW9uTGVuKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogTm90aWNlIG9yZGVyIG9mIHZlcnNpb24gYW5kIHN0cmluZy4uLiAqLwotICAgICAgICAgICAgbHN0cmNweShzelJlc3VsdCwgIkFib3V0ICIpOwotICAgICAgICAgICAgbHN0cmNhdChzelJlc3VsdCwgbHBWZXJzaW9uKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU2V0V2luZG93VGV4dChoRGxnLCBzelJlc3VsdCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFdhbGsgdGhyb3VnaCB0aGUgZGlhbG9nIGl0ZW1zIHRoYXQgd2Ugd2FudCB0byByZXBsYWNlOiAqLwotICAgICAgICAgICAgZm9yIChpID0gRExHX1ZFUkZJUlNUOyBpIDw9IERMR19WRVJMQVNUOyBpKyspIHsKLSAgICAgICAgICAgICAgICBHZXREbGdJdGVtVGV4dChoRGxnLCBpLCBzelJlc3VsdCwgc2l6ZW9mKHN6UmVzdWx0KSk7Ci0gICAgICAgICAgICAgICAgc3pHZXROYW1lW3dSb290TGVuXSA9IChjaGFyKTA7Ci0gICAgICAgICAgICAgICAgbHN0cmNhdChzekdldE5hbWUsIHN6UmVzdWx0KTsKLSAgICAgICAgICAgICAgICB1VmVyc2lvbkxlbiAgID0gMDsKLSAgICAgICAgICAgICAgICBscFZlcnNpb24gICAgID0gTlVMTDsKLSAgICAgICAgICAgICAgICBiUmV0Q29kZSAgICAgID0gIFZlclF1ZXJ5VmFsdWUoKExQVk9JRClscHN0clZmZkluZm8sCi0gICAgICAgICAgICAgICAgICAgIChMUFNUUilzekdldE5hbWUsCi0gICAgICAgICAgICAgICAgICAgIChMUFZPSUQpJmxwVmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgKFVJTlQgKikmdVZlcnNpb25MZW4pOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChiUmV0Q29kZSAmJiB1VmVyc2lvbkxlbiAmJiBscFZlcnNpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgLyogUmVwbGFjZSBkaWFsb2cgaXRlbSB0ZXh0IHdpdGggdmVyc2lvbiBpbmZvICovCi0gICAgICAgICAgICAgICAgICAgIGxzdHJjcHkoc3pSZXN1bHQsIGxwVmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIFNldERsZ0l0ZW1UZXh0KGhEbGcsIGksIHN6UmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZHdSZXN1bHQgPSBHZXRMYXN0RXJyb3IoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHdzcHJpbnRmKHN6UmVzdWx0LCBHZXRTdHJpbmdSZXMoSURTX1ZFUlNJT05fRVJST1IpLCBkd1Jlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgIFNldERsZ0l0ZW1UZXh0KGhEbGcsIGksIHN6UmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UoR2V0RGxnSXRlbShoRGxnLCBpKSwgV01fU0VURk9OVCwKLSAgICAgICAgICAgICAgICAgICAgKFVJTlQpKChpPT1ETEdfVkVSTEFTVCk/aEZpbmVQcmludDpoZm9udERsZyksCi0gICAgICAgICAgICAgICAgICAgIFRSVUUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIEdsb2JhbFVubG9jayhoTWVtKTsKLSAgICAgICAgICAgIEdsb2JhbEZyZWUoaE1lbSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSAKLSAgICAgICAgCi0gICAgICAgIFNlbmRNZXNzYWdlKEdldERsZ0l0ZW0oaERsZywgSURDX0xBQkVMKSwgV01fU0VURk9OVCwKLSAgICAgICAgICAgIChXUEFSQU0paGZvbnREbGcsKExQQVJBTSlUUlVFKTsKLSAgICAgICAgaWYgKCFHZXRTeXN0ZW1PU1ZlcnNpb24oc3pWZXJzaW9uLCBOVUxMKSkKLSAgICAgICAgICAgIHN0cmNweShzelZlcnNpb24sICJVbmtub3duIFZlcnNpb24iKTsKLSAgICAgICAgU2V0V2luZG93VGV4dChHZXREbGdJdGVtKGhEbGcsIElEQ19PU1ZFUlNJT04pLCBzelZlcnNpb24pOwotICAgICAgICBTaG93V2luZG93KGhEbGcsIFNXX1NIT1cpOwotICAgICAgICByZXR1cm4gKFRSVUUpOwotICAgICAgICAKLSAgICAgIGNhc2UgV01fQ09NTUFORDoKLSAgICAgICAgICBpZiAoTE9XT1JEKHdQYXJhbSkgPT0gSURPSyB8fCBMT1dPUkQod1BhcmFtKSA9PSBJRENBTkNFTCkgewotICAgICAgICAgICAgICBFbmREaWFsb2coaERsZywgVFJVRSk7Ci0gICAgICAgICAgICAgIERlbGV0ZU9iamVjdChoZm9udERsZyk7Ci0gICAgICAgICAgICAgIERlbGV0ZU9iamVjdChoRmluZVByaW50KTsKLSAgICAgICAgICAgICAgcmV0dXJuIChUUlVFKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICAKLSAgIHJldHVybiBGQUxTRTsKLX0KLQotVk9JRCBDQUxMQkFDSyBNYWluVGltZXJQcm9jKEhXTkQgaFduZCwgVUlOVCB1TXNnLCBVSU5UIGlkRXZlbnQsIERXT1JEIGR3VGltZSkKLXsKLSAgICBpZiAoYXBfcmVzY2FuU2VydmljZXMpCi0gICAgewotICAgICAgICBHZXRBcGFjaGVTZXJ2aWNlc1N0YXR1cygpOwotICAgICAgICBTaG93Tm90aWZ5SWNvbihoV25kLCBOSU1fTU9ESUZZKTsKLSAgICAgICAgaWYgKGFwX2hTZXJ2aWNlRGxnKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZW5kTWVzc2FnZShhcF9oU2VydmljZURsZywgV01fVVBEQVRFTUVTU0FHRSwgMCwgMCk7Ci0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChGaW5kUnVubmluZ1NlcnZpY2VzKCkpCi0gICAgewotICAgICAgICBTaG93Tm90aWZ5SWNvbihoV25kLCBOSU1fTU9ESUZZKTsKLSAgICAgICAgaWYgKGFwX2hTZXJ2aWNlRGxnKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZW5kTWVzc2FnZShhcF9oU2VydmljZURsZywgV01fVVBEQVRFTUVTU0FHRSwgMCwgMCk7Ci0KLSAgICAgICAgfQotICAgIH0KLX0KLQotCi1MUkVTVUxUIENBTExCQUNLIFduZFByb2MoSFdORCBoV25kLCBVSU5UIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCi17Ci0gICAgaWYgKG1lc3NhZ2UgPT0gYXBfdWlUYXNrYmFyQ3JlYXRlZCkKLSAgICB7Ci0gICAgICAgIC8qIHJlaW5zdGFsbCB0cmF5IGljb24gKi8KLSAgICAgICAgU2hvd05vdGlmeUljb24oaFduZCwgTklNX0FERCk7Ci0gICAgICAgIHJldHVybiBEZWZXaW5kb3dQcm9jKGhXbmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICB9Ci0gICAgc3dpdGNoIChtZXNzYWdlKSAKLSAgICB7Ci0gICAgICAgIGNhc2UgV01fQ1JFQVRFOgotICAgICAgICAgICAgR2V0U3lzdGVtT1NWZXJzaW9uKE5VTEwsICZhcF9PU1ZlcnNpb24pOwotICAgICAgICAgICAgR2V0QXBhY2hlU2VydmljZXNTdGF0dXMoKTsKLSAgICAgICAgICAgIFNob3dOb3RpZnlJY29uKGhXbmQsIE5JTV9BREQpOwotICAgICAgICAgICAgU2V0VGltZXIoaFduZCwgMTAsIDEwMDAsIChUSU1FUlBST0MpTWFpblRpbWVyUHJvYyk7Ci0gICAgICAgICAgICAgIGFwX2hTZXJ2aWNlRGxnID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFdNX1FVSVQ6Ci0gICAgICAgICAgICBTaG93Tm90aWZ5SWNvbihoV25kLCBOSU1fREVMRVRFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgV01fVFJBWU1FU1NBR0U6Ci0gICAgICAgICAgICBzd2l0Y2gobFBhcmFtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgV01fTEJVVFRPTkRCTENMSzoKLSAgICAgICAgICAgICAgICAgICBpZiAoIWRsZ1NlcnZpY2VPbikKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGRsZ1NlcnZpY2VPbiA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgIERpYWxvZ0JveChhcF9oSW5zdGFuY2UsIE1BS0VJTlRSRVNPVVJDRShJRERfQVBTUlZNT05fRElBTE9HKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFduZCwgKERMR1BST0MpU2VydmljZURsZ1Byb2MpOwotICAgICAgICAgICAgICAgICAgICAgICBkbGdTZXJ2aWNlT24gPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgYXBfaFNlcnZpY2VEbGcgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcF9oU2VydmljZURsZykKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIC8qIERpcnR5IGhhY2sgdG8gYnJpbmcgdGhlIHdpbmRvdyB0byB0aGUgZm9yZWdyb3VuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICBTZXRXaW5kb3dQb3MoYXBfaFNlcnZpY2VEbGcsIEhXTkRfVE9QTU9TVCwgMCwgMCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXUF9OT1NJWkUgfCBTV1BfTk9NT1ZFIHwgU1dQX1NIT1dXSU5ET1cpOwotICAgICAgICAgICAgICAgICAgICAgICBTZXRXaW5kb3dQb3MoYXBfaFNlcnZpY2VEbGcsIEhXTkRfTk9UT1BNT1NULCAwLCAwLCAwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dQX05PU0laRSB8IFNXUF9OT01PVkUgfCBTV1BfU0hPV1dJTkRPVyk7Ci0gICAgICAgICAgICAgICAgICAgICAgIFNldEZvY3VzKGFwX2hTZXJ2aWNlRGxnKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBXTV9SQlVUVE9OVVA6Ci0gICAgICAgICAgICAgICAgICAgIFNob3dUcnlQb3B1cE1lbnUoaFduZCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7ICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgV01fQ09NTUFORDoKLSAgICAgICAgICAgIHN3aXRjaCAoTE9XT1JEKHdQYXJhbSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjYXNlIElETV9SRVNUT1JFOgotICAgICAgICAgICAgICAgICAgIGlmICghZGxnU2VydmljZU9uKQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgZGxnU2VydmljZU9uID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgRGlhbG9nQm94KGFwX2hJbnN0YW5jZSwgTUFLRUlOVFJFU09VUkNFKElERF9BUFNSVk1PTl9ESUFMT0cpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoV25kLCAoRExHUFJPQylTZXJ2aWNlRGxnUHJvYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGRsZ1NlcnZpY2VPbiA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICBhcF9oU2VydmljZURsZyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFwX2hTZXJ2aWNlRGxnKQotICAgICAgICAgICAgICAgICAgICAgICBTZXRGb2N1cyhhcF9oU2VydmljZURsZyk7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgSURNX0FCT1VUOgotICAgICAgICAgICAgICAgICAgIGlmICghZGxnQWJvdXRPbikKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgZGxnQWJvdXRPbiA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgRGlhbG9nQm94KGFwX2hJbnN0YW5jZSwgTUFLRUlOVFJFU09VUkNFKElERF9BQk9VVEJPWCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhXbmQsIChETEdQUk9DKUFib3V0RGxnUHJvYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgZGxnQWJvdXRPbiA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgIGFwX2h3bmRBYm91dERsZyA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcF9od25kQWJvdXREbGcpCi0gICAgICAgICAgICAgICAgICAgICAgIFNldEZvY3VzKGFwX2h3bmRBYm91dERsZyk7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIElETV9FWElUOgotICAgICAgICAgICAgICAgICAgICBQb3N0UXVpdE1lc3NhZ2UoMCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIERlZldpbmRvd1Byb2MoaFduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwotICAgIH0KLQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotLyogQ3JlYXRlIG1haW4gaW52aXNpYmxlIHdpbmRvdyAqLwotSFdORCBDcmVhdGVNYWluV2luZG93KEhJTlNUQU5DRSBoSW5zdGFuY2UpCi17Ci0gICAgSFdORCAgICAgICBoV25kID0gTlVMTDsKLSAgICBXTkRDTEFTU0VYIHdjZXg7Ci0KLSAgICB3Y2V4LmNiU2l6ZSA9IHNpemVvZihXTkRDTEFTU0VYKTsgCi0KLSAgICB3Y2V4LnN0eWxlICAgICAgICAgID0gQ1NfSFJFRFJBVyB8IENTX1ZSRURSQVc7Ci0gICAgd2NleC5scGZuV25kUHJvYyAgICA9IChXTkRQUk9DKVduZFByb2M7Ci0gICAgd2NleC5jYkNsc0V4dHJhICAgICA9IDA7Ci0gICAgd2NleC5jYlduZEV4dHJhICAgICA9IDA7Ci0gICAgd2NleC5oSW5zdGFuY2UgICAgICA9IGhJbnN0YW5jZTsKLSAgICB3Y2V4LmhJY29uICAgICAgICAgID0gTG9hZEljb24oaEluc3RhbmNlLCAoTFBDVFNUUilJRElfQVBTUlZNT04pOwotICAgIHdjZXguaEN1cnNvciAgICAgICAgPSBMb2FkQ3Vyc29yKE5VTEwsIElEQ19BUlJPVyk7Ci0gICAgd2NleC5oYnJCYWNrZ3JvdW5kICA9IChIQlJVU0gpKENPTE9SX1dJTkRPVysxKTsKLSAgICB3Y2V4Lmxwc3pNZW51TmFtZSAgID0gKExQQ1NUUilJRENfQVBTUlZNT047Ci0gICAgd2NleC5scHN6Q2xhc3NOYW1lICA9IHN6V2luZG93Q2xhc3M7Ci0gICAgd2NleC5oSWNvblNtICAgICAgICA9IExvYWRJY29uKHdjZXguaEluc3RhbmNlLCAoTFBDVFNUUilJRElfQVBTTUFMTCk7Ci0KLSAgICBpZiAoUmVnaXN0ZXJDbGFzc0V4KCZ3Y2V4KSkKLSAgICB7Ci0gICAgICAgIGhXbmQgPSBDcmVhdGVXaW5kb3coc3pXaW5kb3dDbGFzcywgc3pUaXRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgaEluc3RhbmNlLCBOVUxMKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaFduZDsKLQotfQotCi0KLWludCBXSU5BUEkgV2luTWFpbihISU5TVEFOQ0UgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICBISU5TVEFOQ0UgaFByZXZJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgTFBUU1RSIGxwQ21kTGluZSwKLSAgICAgICAgICAgICAgICAgICAgaW50IG5DbWRTaG93KQotewotICAgIEhXTkQgICAgaHduZDsKLSAgICBNU0cgICAgIG1zZzsKLSAgICAvKiBzaW5nbGUgaW5zdGFuY2UgbXV0ZXggKi8KLSAgICBIQU5ETEUgaE11dGV4ID0gQ3JlYXRlTXV0ZXgoTlVMTCwgRkFMU0UsICJBUFNSVk1PTl9NVVRFWCIpOwotICAgIGlmKChoTXV0ZXggPT0gTlVMTCkgfHwgKEdldExhc3RFcnJvcigpID09IEVSUk9SX0FMUkVBRFlfRVhJU1RTKSkKLSAgICB7Ci0gICAgICAgIGlmIChoTXV0ZXgpCi0gICAgICAgICAgICBDbG9zZUhhbmRsZShoTXV0ZXgpOwotCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEluaXRDb21tb25Db250cm9scygpOwotICAgIGFwX2hJbnN0YW5jZSA9IGhJbnN0YW5jZTsKLQotICAgIExvYWRTdHJpbmcoaEluc3RhbmNlLCBJRFNfQVBQX1RJVExFLCBzelRpdGxlLCBNQVhfTE9BRFNUUklORyk7Ci0gICAgTG9hZFN0cmluZyhoSW5zdGFuY2UsIElEQ19BUFNSVk1PTiwgIHN6V2luZG93Q2xhc3MsIE1BWF9MT0FEU1RSSU5HKTsKLSAgICBhcF9pY29TdG9wICA9IExvYWRJY29uKGhJbnN0YW5jZSwgTUFLRUlOVFJFU09VUkNFKElESV9JQ09TVE9QKSk7Ci0gICAgYXBfaWNvUnVuICAgPSBMb2FkSWNvbihoSW5zdGFuY2UsIE1BS0VJTlRSRVNPVVJDRShJRElfSUNPUlVOKSk7Ci0gICAgYXBfdWlUYXNrYmFyQ3JlYXRlZCA9IFJlZ2lzdGVyV2luZG93TWVzc2FnZSgiVGFza2JhckNyZWF0ZWQiKTsKLQotICAgIFplcm9NZW1vcnkoYXBfc3RTZXJ2aWNlcywgc2l6ZW9mKFNUX0FQQUNIRV9TRVJWSUNFKSAqIE1BWF9BUEFDSEVfU0VSVklDRVMpOwotICAgIGh3bmQgPSBDcmVhdGVNYWluV2luZG93KGhJbnN0YW5jZSk7Ci0gICAgaWYgKGh3bmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHdoaWxlIChHZXRNZXNzYWdlKCZtc2csIE5VTEwsIDAsIDApID09IFRSVUUpIAotICAgICAgICB7Ci0gICAgICAgICAgICBUcmFuc2xhdGVNZXNzYWdlKCZtc2cpOwotICAgICAgICAgICAgRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOwotICAgICAgICB9ICAgIAotICAgICAgICBhcF9DbGVhclNlcnZpY2VzU3QoKTsKLSAgICB9Ci0gICAgQ2xvc2VIYW5kbGUoaE11dGV4KTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3N1cHBvcnQvd2luMzIvQXBhY2hlTW9uaXRvci5kc3AgYi9zdXBwb3J0L3dpbjMyL0FwYWNoZU1vbml0b3IuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Njk5YTc1Li4wMDAwMDAwCi0tLSBhL3N1cHBvcnQvd2luMzIvQXBhY2hlTW9uaXRvci5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJBcGFjaGVNb25pdG9yIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIiAweDAxMDEKLQotQ0ZHPUFwYWNoZU1vbml0b3IgLSBXaW4zMiBEZWJ1ZwotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJBcGFjaGVNb25pdG9yLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiQXBhY2hlTW9uaXRvci5tYWsiIENGRz0iQXBhY2hlTW9uaXRvciAtIFdpbjMyIERlYnVnIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgIkFwYWNoZU1vbml0b3IgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFICJBcGFjaGVNb25pdG9yIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1NVEw9bWlkbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAiQXBhY2hlTW9uaXRvciAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9GZCJSZWxlYXNlL0FwYWNoZU1vbml0b3IiIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC9vIE5VTCAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiBhZHZhcGkzMi5saWIgY29tY3RsMzIubGliIHNoZWxsMzIubGliIHZlcnNpb24ubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9tYXAgL21hY2hpbmU6STM4NgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiQXBhY2hlTW9uaXRvciAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9GZCJEZWJ1Zy9BcGFjaGVNb25pdG9yIiAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC9vIE5VTCAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kZWJ1ZyAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIGFkdmFwaTMyLmxpYiBjb21jdGwzMi5saWIgc2hlbGwzMi5saWIgdmVyc2lvbi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2luY3JlbWVudGFsOm5vIC9kZWJ1ZyAvbWFjaGluZTpJMzg2Ci0jIFNVQlRSQUNUIExJTkszMiAvcGRiOm5vbmUKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIkFwYWNoZU1vbml0b3IgLSBXaW4zMiBSZWxlYXNlIgotIyBOYW1lICJBcGFjaGVNb25pdG9yIC0gV2luMzIgRGVidWciCi0jIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICIqLnJjLCouaWNvLCouYm1wIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxhcGFjaGVfaGVhZGVyLmJtcAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cQXBhY2hlTW9uaXRvci5pY28KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXEFwYWNoZU1vbml0b3IucmMKLQotIUlGICAiJChDRkcpIiA9PSAiQXBhY2hlTW9uaXRvciAtIFdpbjMyIFJlbGVhc2UiCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJBcGFjaGVNb25pdG9yIC0gV2luMzIgRGVidWciCi0KLSFFTkRJRiAKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cYXBydW4uaWNvCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxhcHNtYWxsLmljbwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cYXBzcnZtb24uaWNvCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxhcHN0b3AuaWNvCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxzcnVuLmJtcAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cc3N0b3AuYm1wCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cQXBhY2hlTW9uaXRvci5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9zdXBwb3J0L3dpbjMyL0FwYWNoZU1vbml0b3IuaCBiL3N1cHBvcnQvd2luMzIvQXBhY2hlTW9uaXRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmRmYzE1Li4wMDAwMDAwCi0tLSBhL3N1cHBvcnQvd2luMzIvQXBhY2hlTW9uaXRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy97e05PX0RFUEVOREVOQ0lFU319Ci0vLyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBnZW5lcmF0ZWQgaW5jbHVkZSBmaWxlLgotLy8gVXNlZCBieSBBcFNydm1vbi5yYwotLy8KLSNkZWZpbmUgSUREX0FQU1JWTU9OX0RJQUxPRyAgICAgICAgICAgICAxMDEKLSNkZWZpbmUgSUREX0FCT1VUQk9YICAgICAgICAgICAgICAgICAgICAxMDIKLSNkZWZpbmUgSURTX0FQUF9USVRMRSAgICAgICAgICAgICAgICAgICAxMDMKLSNkZWZpbmUgSURNX1JFU1RPUkUgICAgICAgICAgICAgICAgICAgICAxMDQKLSNkZWZpbmUgSURNX0FCT1VUICAgICAgICAgICAgICAgICAgICAgICAxMDUKLSNkZWZpbmUgSURNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAxMDYKLSNkZWZpbmUgSURJX0FQU1JWTU9OTSAgICAgICAgICAgICAgICAgICAxMDcKLSNkZWZpbmUgSURJX0FQU1JWTU9OICAgICAgICAgICAgICAgICAgICAxMDgKLSNkZWZpbmUgSURJX0FQU01BTEwgICAgICAgICAgICAgICAgICAgICAxMDkKLSNkZWZpbmUgSURDX0FQU1JWTU9OICAgICAgICAgICAgICAgICAgICAxMTAKLSNkZWZpbmUgSURTX1ZFUlNJT05fRVJST1IgICAgICAgICAgICAgICAxMTEKLSNkZWZpbmUgSURTX1ZFUl9JTkZPX0xBTkcgICAgICAgICAgICAgICAxMTIKLSNkZWZpbmUgSURSX01BSU5GUkFNRSAgICAgICAgICAgICAgICAgICAxMjgKLSNkZWZpbmUgSURJX0lDT1NUT1AgICAgICAgICAgICAgICAgICAgICAxMjkKLSNkZWZpbmUgSURJX0lDT1JVTiAgICAgICAgICAgICAgICAgICAgICAxMzAKLSNkZWZpbmUgSURDX1NUQVRCQVIgICAgICAgICAgICAgICAgICAgICAxMzQKLSNkZWZpbmUgRExHX1ZFUkZJUlNUICAgICAgICAgICAgICAgICAgICAxNDAKLSNkZWZpbmUgSURDX0NPTVBBTlkgICAgICAgICAgICAgICAgICAgICAxNDAKLSNkZWZpbmUgSURDX0ZJTEVERVNDICAgICAgICAgICAgICAgICAgICAxNDEKLSNkZWZpbmUgSURDX1BST0RWRVIgICAgICAgICAgICAgICAgICAgICAxNDIKLSNkZWZpbmUgSURDX0NPUFlSSUdIVCAgICAgICAgICAgICAgICAgICAxNDMKLSNkZWZpbmUgSURDX09TVkVSU0lPTiAgICAgICAgICAgICAgICAgICAxNDQKLSNkZWZpbmUgSURDX1RSQURFTUFSSyAgICAgICAgICAgICAgICAgICAxNDUKLSNkZWZpbmUgRExHX1ZFUkxBU1QgICAgICAgICAgICAgICAgICAgICAxNDUKLSNkZWZpbmUgSURDX0xBQkVMICAgICAgICAgICAgICAgICAgICAgICAxNDYKLSNkZWZpbmUgSURCX0JNUFNUT1AgICAgICAgICAgICAgICAgICAgICAxNTUKLSNkZWZpbmUgSURCX0JNUFJVTiAgICAgICAgICAgICAgICAgICAgICAxNTYKLSNkZWZpbmUgSURCX0JNUEhFQURFUiAgICAgICAgICAgICAgICAgICAxNTgKLSNkZWZpbmUgSURMX1NFUlZJQ0VTICAgICAgICAgICAgICAgICAgICAxMDAzCi0jZGVmaW5lIElEQ19TU1RBUlQgICAgICAgICAgICAgICAgICAgICAgMTAwNAotI2RlZmluZSBJRENfU1NUT1AgICAgICAgICAgICAgICAgICAgICAgIDEwMDUKLSNkZWZpbmUgSURDX1NSRVNUQVJUICAgICAgICAgICAgICAgICAgICAxMDA2Ci0jZGVmaW5lIElEQ19TVU5JTlNUQUxMICAgICAgICAgICAgICAgICAgMTAwOAotI2RlZmluZSBJRENfU1RBVElDICAgICAgICAgICAgICAgICAgICAgIC0xCi0KLS8vIE5leHQgZGVmYXVsdCB2YWx1ZXMgZm9yIG5ldyBvYmplY3RzCi0vLyAKLSNpZmRlZiBBUFNUVURJT19JTlZPS0VECi0jaWZuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKLSNkZWZpbmUgX0FQU19ORVhUX1JFU09VUkNFX1ZBTFVFICAgICAgICAxNTkKLSNkZWZpbmUgX0FQU19ORVhUX0NPTU1BTkRfVkFMVUUgICAgICAgICAzMjc3MQotI2RlZmluZSBfQVBTX05FWFRfQ09OVFJPTF9WQUxVRSAgICAgICAgIDEwMDkKLSNkZWZpbmUgX0FQU19ORVhUX1NZTUVEX1ZBTFVFICAgICAgICAgICAxMTAKLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9zdXBwb3J0L3dpbjMyL0FwYWNoZU1vbml0b3IuaWNvIGIvc3VwcG9ydC93aW4zMi9BcGFjaGVNb25pdG9yLmljbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QyOGRjNS4uMDAwMDAwMAotLS0gYS9zdXBwb3J0L3dpbjMyL0FwYWNoZU1vbml0b3IuaWNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3VwcG9ydC93aW4zMi9hcGFjaGVfaGVhZGVyLmJtcCBiL3N1cHBvcnQvd2luMzIvYXBhY2hlX2hlYWRlci5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMTE2ZmMuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC93aW4zMi9hcGFjaGVfaGVhZGVyLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N1cHBvcnQvd2luMzIvYXBydW4uaWNvIGIvc3VwcG9ydC93aW4zMi9hcHJ1bi5pY28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZDU4MzIuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC93aW4zMi9hcHJ1bi5pY28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zdXBwb3J0L3dpbjMyL2Fwc3RvcC5pY28gYi9zdXBwb3J0L3dpbjMyL2Fwc3RvcC5pY28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYTQ5YWQuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC93aW4zMi9hcHN0b3AuaWNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3VwcG9ydC93aW4zMi9zcnVuLmJtcCBiL3N1cHBvcnQvd2luMzIvc3J1bi5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZWNkNDYuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC93aW4zMi9zcnVuLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N1cHBvcnQvd2luMzIvc3N0b3AuYm1wIGIvc3VwcG9ydC93aW4zMi9zc3RvcC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNzNkODcuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC93aW4zMi9zc3RvcC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zdXBwb3J0L3dpbjMyL3dpbnR0eS5jIGIvc3VwcG9ydC93aW4zMi93aW50dHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhjNTk3OS4uMDAwMDAwMAotLS0gYS9zdXBwb3J0L3dpbjMyL3dpbnR0eS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiB3aW50dHkgOiBhIEFwYWNoZS9XaW5OVCBzdXBwb3J0IHV0aWxpdHkgZm9yIG1vbml0b3JpbmcgYW5kIAotICogICAgICAgICAgcmVmbGVjdGluZyB1c2VyIGZlZWRiYWNrIGZyb20gdGhlIEFwYWNoZSBwcm9jZXNzIHZpYQotICogICAgICAgICAgc3RkaW4vc3Rkb3V0LCBldmVuIGFzIHJ1bm5pbmcgd2l0aGluIHRoZSBzZXJ2aWNlIGNvbnRleHQuCi0gKgotICogT3JpZ2luYWxseSBjb250cmlidXRlZCBieSBXaWxsaWFtIFJvd2UgPHdyb3dlQGNvdmFsZW50Lm5ldD4KLSAqCi0gKiBOb3RlOiB0aGlzIGltcGxlbWVudGF0aW9uIGlzIF92ZXJ5XyBleHBlcmltZW50YWwsIGFuZCBlcnJvciBoYW5kbGluZwotICogaXMgZmFyIGZyb20gY29tcGxldGUuICBVc2luZyBpdCBhcyBhIGNnaSBvciBwaXBlIHByb2Nlc3MgYWxsb3dzIHRoZQotICogcHJvZ3JhbW1lciB0byBkaXNjb3ZlciBpZiBmYWNpbGl0aWVzIHN1Y2ggYXMgcmVsaWFibGUgcGlwZWQgbG9ncwotICogYXJlIHdvcmtpbmcgYXMgZXhwZWN0ZWQsIG9yIGFuc3dlciBvcGVyYXRvciBwcm9tcHRzIHRoYXQgd291bGQKLSAqIG90aGVyd2lzZSBiZSBkaXNjYXJkZWQgYnkgdGhlIHNlcnZpY2UgcHJvY2Vzcy4KLSAqCi0gKiBBbHNvIG5vdGUgdGhlIGlzc2VydmljZSBkZXRlY3Rpb24gc2VtYW50aWNzLCB3aGljaCBmYXIgZXhjZWVkIGFueQotICogbWVjaGFuaXNtIHdlIGhhdmUgZGlzY292ZXJlZCB0aHVzIGZhci4KLSAqIAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLWNvbnN0IGNoYXIgKm9wdGlvbnMgPSAKLSJTeW50YXg6IHdpbnR0eSBbb3B0c10gWy0/XVxuXG4iCi0iICBvcHRzOiAtY3toYXJhY3Rlcn0gICBvciAtbHtpbmV9IGlucHV0XG4iCi0iXHQtcXt1aWV0fSAgICAgICBvciAtZXtjaG99IGlucHV0XG4iCi0iXHRvcHRzOiAtdXtucHJvY2Vzc2VkfSBvciAtcHtyb2Nlc3NlZH0gaW5wdXRcbiIKLSJcdG9wdHM6IC1ue293cmFwfSAgICAgIG9yIC13e3JhcH0gb3V0cHV0IGxpbmVzXG4iCi0iXHRvcHRzOiAtZntvcm1hdHRlZH0gICBvciAtcnthd30gb3V0cHV0IGxpbmVzXG4iCi0iXHRvcHRzOiAtdntlcmJvc2V9IGVycm9yIGNoZWNraW5nXG4iCi0iXHRvcHRzOiAtPyBmb3IgdGhpcyBtZXNzYWdlXG5cbiI7Ci0KLUhBTkRMRSBoZXJyb3V0OwotQk9PTCB2ZXJib3NlID0gRkFMU0U7Ci0KLXZvaWQgcHJpbnRlcnIoY2hhciAqZm10LCAuLi4pIAotewotICAgIGNoYXIgc3RyWzEwMjRdOwotICAgIHZhX2xpc3QgYXJnczsKLSAgICBEV09SRCBsZW47Ci0gICAgaWYgKCF2ZXJib3NlKQotICAgICAgICByZXR1cm47Ci0gICAgdmFfc3RhcnQoYXJncywgZm10KTsKLSAgICB3dnNwcmludGYoc3RyLCBmbXQsIGFyZ3MpOwotICAgIFdyaXRlRmlsZShoZXJyb3V0LCBzdHIsIGxlbiA9IHN0cmxlbihzdHIpLCAmbGVuLCBOVUxMKTsKLX0KLQotRFdPUkQgV0lOQVBJIGZlZWRiYWNrKExQVk9JRCBwaXBlb3V0KTsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQotewotICAgIGNoYXIgc3RyWzEwMjRdLCAqY29udGl0bGU7Ci0gICAgSEFORExFIGhwcm9jLCB0aHJlYWQ7Ci0gICAgSEFORExFIGh3aW5zdGEsIGhzYXZld2luc3RhOwotICAgIEhBTkRMRSBoZGVzaywgaHNhdmVkZXNrOwotICAgIEhBTkRMRSBjb25pbiwgY29ub3V0OwotICAgIEhBTkRMRSBwaXBlaW4sIHBpcGVvdXQ7Ci0gICAgSEFORExFIGhzdGRpbiwgaHN0ZG91dCwgaHN0ZGVycjsKLSAgICBEV09SRCBjb25tb2RlOwotICAgIERXT1JEIG5ld2lubW9kZSA9IDAsIG5vdGlubW9kZSA9IDA7Ci0gICAgRFdPUkQgbmV3b3V0bW9kZSA9IDAsIG5vdG91dG1vZGUgPSAwOwotICAgIERXT1JEIHRpZDsKLSAgICBEV09SRCBsZW47Ci0gICAgQk9PTCBpc3NlcnZpY2UgPSBGQUxTRTsKLQotICAgIHdoaWxlICgtLWFyZ2MpIHsKLSAgICAgICAgKythcmd2OwotICAgICAgICBpZiAoKiphcmd2ID09ICcvJyB8fCAqKmFyZ3YgPT0gJy0nKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHRvbG93ZXIoKCphcmd2KVsxXSkpIHsKLSAgICAgICAgICAgICAgICBjYXNlICdjJzoKLSAgICAgICAgICAgICAgICAgICAgbm90aW5tb2RlIHw9IEVOQUJMRV9MSU5FX0lOUFVUOyAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdsJzoKLSAgICAgICAgICAgICAgICAgICAgbmV3aW5tb2RlIHw9IEVOQUJMRV9MSU5FX0lOUFVUOyAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdxJzoKLSAgICAgICAgICAgICAgICAgICAgbm90aW5tb2RlIHw9IEVOQUJMRV9FQ0hPX0lOUFVUOyAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdlJzoKLSAgICAgICAgICAgICAgICAgICAgbmV3aW5tb2RlIHw9IEVOQUJMRV9FQ0hPX0lOUFVUOyAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICd1JzoKLSAgICAgICAgICAgICAgICAgICAgbm90aW5tb2RlIHw9IEVOQUJMRV9QUk9DRVNTRURfSU5QVVQ7ICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdwJzoKLSAgICAgICAgICAgICAgICAgICAgbmV3aW5tb2RlIHw9IEVOQUJMRV9QUk9DRVNTRURfSU5QVVQ7ICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICduJzoKLSAgICAgICAgICAgICAgICAgICAgbm90b3V0bW9kZSB8PSBFTkFCTEVfV1JBUF9BVF9FT0xfT1VUUFVUOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICd3JzoKLSAgICAgICAgICAgICAgICAgICAgbmV3b3V0bW9kZSB8PSBFTkFCTEVfV1JBUF9BVF9FT0xfT1VUUFVUOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdyJzoKLSAgICAgICAgICAgICAgICAgICAgbm90b3V0bW9kZSB8PSBFTkFCTEVfUFJPQ0VTU0VEX09VVFBVVDsgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdmJzoKLSAgICAgICAgICAgICAgICAgICAgbmV3b3V0bW9kZSB8PSBFTkFCTEVfUFJPQ0VTU0VEX09VVFBVVDsgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICd2JzoKLSAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgICAgICAgICAgICBjb250aXRsZSA9ICooKythcmd2KTsKLSAgICAgICAgICAgICAgICAgICAgLS1hcmdjOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICc/JzoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKG9wdGlvbnMpOwotICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwotCQlkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBwcmludGYoIndpbnR0eSBvcHRpb24gJXMgbm90IHJlY29nbml6ZWQsIHVzZSAtPyBmb3IgaGVscC5cblxuIiwgKmFyZ3YpOwotICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcHJpbnRmKCJ3aW50dHkgYXJndW1lbnQgJXMgbm90IHVuZGVyc3Rvb2QsIHVzZSAtPyBmb3IgaGVscC5cblxuIiwgKmFyZ3YpOwotICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGhwcm9jID0gR2V0Q3VycmVudFByb2Nlc3MoKTsKLSAgICBoZXJyb3V0ID0gaHN0ZGVyciA9IEdldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFKTsKLSAgICBpZiAoIWhzdGRlcnIgfHwgaHN0ZGVyciA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotICAgICAgICBwcmludGVycigiR2V0U3RkSGFuZGxlKFNURF9FUlJPUl9IQU5ETEUpIGZhaWxlZCAoJWQpXG4iLCBHZXRMYXN0RXJyb3IoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFEdXBsaWNhdGVIYW5kbGUoaHByb2MsIGhzdGRlcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaHByb2MsICZoZXJyb3V0LCAwLCBGQUxTRSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgRFVQTElDQVRFX0NMT1NFX1NPVVJDRSB8IERVUExJQ0FURV9TQU1FX0FDQ0VTUykpIHsKLSAgICAgICAgcHJpbnRlcnIoIkR1cEhhbmRsZShzdGRlcnIpIGZhaWxlZCAoJWQpXG4iLCBHZXRMYXN0RXJyb3IoKSk7Ci0gICAgfQotCi0gICAgaHN0ZGluID0gR2V0U3RkSGFuZGxlKFNURF9JTlBVVF9IQU5ETEUpOwotICAgIGlmICghaHN0ZGluIHx8IGhzdGRpbiA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotICAgICAgICBwcmludGVycigiR2V0U3RkSGFuZGxlKFNURF9JTlBVVF9IQU5ETEUpIGZhaWxlZCAoJWQpXG4iLCBHZXRMYXN0RXJyb3IoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFEdXBsaWNhdGVIYW5kbGUoaHByb2MsIGhzdGRpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBocHJvYywgJnBpcGVpbiwgMCwgRkFMU0UsIAotICAgICAgICAgICAgICAgICAgICAgICAgIERVUExJQ0FURV9DTE9TRV9TT1VSQ0UgfCBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpKSB7Ci0gICAgICAgIHByaW50ZXJyKCJEdXBIYW5kbGUoc3RkaW4pIGZhaWxlZCAoJWQpXG4iLCBHZXRMYXN0RXJyb3IoKSk7Ci0gICAgfQotCi0gICAgaHN0ZG91dCA9IEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSk7Ci0gICAgaWYgKCFoc3Rkb3V0IHx8IGhzdGRvdXQgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLSAgICAgICAgcHJpbnRlcnIoIkdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSkgZmFpbGVkICglZClcbiIsIEdldExhc3RFcnJvcigpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIUR1cGxpY2F0ZUhhbmRsZShocHJvYywgaHN0ZG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBocHJvYywgJnBpcGVvdXQsIDAsIEZBTFNFLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBEVVBMSUNBVEVfQ0xPU0VfU09VUkNFIHwgRFVQTElDQVRFX1NBTUVfQUNDRVNTKSkgewotICAgICAgICBwcmludGVycigiRHVwSGFuZGxlKHN0ZG91dCkgZmFpbGVkICglZClcbiIsIEdldExhc3RFcnJvcigpKTsKLSAgICB9Ci0KLSAgICBoc2F2ZXdpbnN0YSA9IEdldFByb2Nlc3NXaW5kb3dTdGF0aW9uKCk7Ci0gICAgaWYgKCFoc2F2ZXdpbnN0YSB8fCBoc2F2ZXdpbnN0YSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotICAgICAgICBwcmludGVycigiR2V0UHJvY1dpblN0YSgpIGZhaWxlZCAoJWQpXG4iLCBHZXRMYXN0RXJyb3IoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFHZXRVc2VyT2JqZWN0SW5mb3JtYXRpb24oaHNhdmV3aW5zdGEsIFVPSV9OQU1FLCBzdHIsIHNpemVvZihzdHIpLCAmbGVuKSkgewotICAgICAgICBwcmludGVycigiR2V0VXNlck9iamVjdEluZm8oR2V0UHJvY1dpblN0YSkgZmFpbGVkICglZClcbiIsIEdldExhc3RFcnJvcigpKTsKLSAgICAgICAgQ2xvc2VIYW5kbGUoaHNhdmV3aW5zdGEpOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJuaWNtcChzdHIsICJTZXJ2aWNlLSIsIDgpID09IDApIHsKLSAgICAgICAgaXNzZXJ2aWNlID0gVFJVRTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBDbG9zZUhhbmRsZShoc2F2ZXdpbnN0YSk7Ci0gICAgU2V0TGFzdEVycm9yKDApOwotCi0gICAgaWYgKCFGcmVlQ29uc29sZSgpKQotICAgICAgICBwcmludGVycigiRHVwSGFuZGxlKHN0ZG91dCkgZmFpbGVkICglZClcbiIsIEdldExhc3RFcnJvcigpKTsKLQotICAgIGlmIChpc3NlcnZpY2UpIHsKLSAgICAgICAgaHdpbnN0YSA9IE9wZW5XaW5kb3dTdGF0aW9uKCJXaW5TdGEwIiwgVFJVRSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lOU1RBX0FDQ0VTU0NMSVBCT0FSRCAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgV0lOU1RBX0FDQ0VTU0dMT0JBTEFUT01TICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBXSU5TVEFfRU5VTURFU0tUT1BTCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgV0lOU1RBX0VOVU1FUkFURSAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgV0lOU1RBX1JFQURBVFRSSUJVVEVTICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBXSU5TVEFfUkVBRFNDUkVFTgotICAgICAgICAgICAgICAgICAgICAgICAgICB8IFdJTlNUQV9XUklURUFUVFJJQlVURVMpOwotICAgICAgICBpZiAoIWh3aW5zdGEgfHwgaHdpbnN0YSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotICAgICAgICAgICAgcHJpbnRlcnIoIk9wZW5XaW5TdGEoV2luU3RhMCkgZmFpbGVkICglZClcbiIsIEdldExhc3RFcnJvcigpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghU2V0UHJvY2Vzc1dpbmRvd1N0YXRpb24oaHdpbnN0YSkpIHsKLSAgICAgICAgICAgIHByaW50ZXJyKCJTZXRQcm9jV2luU3RhKFdpblN0YTApIGZhaWxlZCAoJWQpXG4iLCBHZXRMYXN0RXJyb3IoKSk7Ci0gICAgICAgIH0KLQloc2F2ZWRlc2sgPSBHZXRUaHJlYWREZXNrdG9wKEdldEN1cnJlbnRUaHJlYWRJZCgpKTsKLSAgICAgICAgaGRlc2sgPSBPcGVuRGVza3RvcCgiRGVmYXVsdCIsIDAsIFRSVUUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0tUT1BfUkVBRE9CSkVDVFMgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICB8IERFU0tUT1BfQ1JFQVRFV0lORE9XICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICB8IERFU0tUT1BfQ1JFQVRFTUVOVSAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICB8IERFU0tUT1BfSE9PS0NPTlRST0wgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICB8IERFU0tUT1BfSk9VUk5BTFJFQ09SRCAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICB8IERFU0tUT1BfSk9VUk5BTFBMQVlCQUNLIAotICAgICAgICAgICAgICAgICAgICAgICAgICB8IERFU0tUT1BfRU5VTUVSQVRFICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICB8IERFU0tUT1BfV1JJVEVPQkpFQ1RTKTsKLSAgICAgICAgaWYgKCFoZGVzayB8fCBoZGVzayA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotICAgICAgICAgICAgcHJpbnRlcnIoIk9wZW5EZXNrdG9wKERlZmF1bHQpIGZhaWxlZCAoJWQpXG4iLCBHZXRMYXN0RXJyb3IoKSk7Ci0gICAgICAgIH0gCi0gICAgICAgIGVsc2UgaWYgKCFTZXRUaHJlYWREZXNrdG9wKGhkZXNrKSkgewotICAgICAgICAgICAgcHJpbnRlcnIoIlNldFRocmVhZERlc2t0b3AoRGVmYXVsdCkgZmFpbGVkICglZClcbiIsIEdldExhc3RFcnJvcigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghQWxsb2NDb25zb2xlKCkpIHsKLSAgICAgICAgcHJpbnRlcnIoIkFsbG9jQ29uc29sZShEZWZhdWx0KSBmYWlsZWQgKCVkKVxuIiwgR2V0TGFzdEVycm9yKCkpOwotICAgIH0KLQotICAgIGlmIChjb250aXRsZSAmJiAhU2V0Q29uc29sZVRpdGxlKGNvbnRpdGxlKSkgewotICAgICAgICBwcmludGVycigiU2V0Q29uc29sZVRpdGxlKCkgZmFpbGVkICglZClcbiIsIEdldExhc3RFcnJvcigpKTsKLSAgICB9Ci0KLSAgICBjb25vdXQgPSBHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpOwotICAgIGlmICghY29ub3V0IHx8IGNvbm91dCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotICAgICAgICBwcmludGVycigiR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKSBmYWlsZWQgKCVkKVxuIiwgR2V0TGFzdEVycm9yKCkpOwotICAgIH0KLSAgICBlbHNlIGlmICghR2V0Q29uc29sZU1vZGUoY29ub3V0LCAmY29ubW9kZSkpIHsKLSAgICAgICAgcHJpbnRlcnIoIkdldENvbnNvbGVNb2RlKENPTk9VVCkgZmFpbGVkICglZClcbiIsIEdldExhc3RFcnJvcigpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIVNldENvbnNvbGVNb2RlKGNvbm91dCwgY29ubW9kZSA9ICgoY29ubW9kZSB8IG5ld291dG1vZGUpICYgfm5vdG91dG1vZGUpKSkgewotICAgICAgICBwcmludGVycigiU2V0Q29uc29sZU1vZGUoQ09OT1VULCAweCV4KSBmYWlsZWQgKCVkKVxuIiwgY29ubW9kZSwgR2V0TGFzdEVycm9yKCkpOwotICAgIH0KLQotICAgIGNvbmluID0gR2V0U3RkSGFuZGxlKFNURF9JTlBVVF9IQU5ETEUpOwotICAgIGlmICghY29uaW4gfHwgY29uaW4gPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLSAgICAgICAgcHJpbnRlcnIoIkdldFN0ZEhhbmRsZShTVERfSU5QVVRfSEFORExFKSBmYWlsZWQgKCVkKVxuIiwgR2V0TGFzdEVycm9yKCkpOwotICAgIH0KLSAgICBlbHNlIGlmICghR2V0Q29uc29sZU1vZGUoY29uaW4sICZjb25tb2RlKSkgewotICAgICAgICBwcmludGVycigiR2V0Q29uc29sZU1vZGUoQ09OT1VUKSBmYWlsZWQgKCVkKVxuIiwgR2V0TGFzdEVycm9yKCkpOwotICAgIH0KLSAgICBlbHNlIGlmICghU2V0Q29uc29sZU1vZGUoY29uaW4sIGNvbm1vZGUgPSAoKGNvbm1vZGUgfCBuZXdpbm1vZGUpICYgfm5vdGlubW9kZSkpKSB7Ci0gICAgICAgIHByaW50ZXJyKCJTZXRDb25zb2xlTW9kZShDT05JTiwgMHgleCkgZmFpbGVkICglZClcbiIsIGNvbm1vZGUsIEdldExhc3RFcnJvcigpKTsKLSAgICB9Ci0KLSAgICB0aHJlYWQgPSBDcmVhdGVUaHJlYWQoTlVMTCwgMCwgZmVlZGJhY2ssIChMUFZPSUQpcGlwZW91dCwgMCwgJnRpZCk7Ci0KLSAgICB3aGlsZSAoUmVhZEZpbGUocGlwZWluLCBzdHIsIHNpemVvZihzdHIpLCAmbGVuLCBOVUxMKSkKLSAgICAgICAgaWYgKCFsZW4gfHwgIVdyaXRlRmlsZShjb25vdXQsIHN0ciwgbGVuLCAmbGVuLCBOVUxMKSkKLSAgICAgICAgICAgYnJlYWs7Ci0KLSAgICBwcmludGVycigiW0VPRl0gZnJvbSBzdGRpbiAoJWQpXG4iLCBHZXRMYXN0RXJyb3IoKSk7Ci0KLSAgICBDbG9zZUhhbmRsZShwaXBlb3V0KTsKLSAgICBpZiAoIUdldENvbnNvbGVUaXRsZShzdHIsIHNpemVvZihzdHIpKSkgewotICAgICAgICBwcmludGVycigiU2V0Q29uc29sZVRpdGxlKCkgZmFpbGVkICglZClcbiIsIEdldExhc3RFcnJvcigpKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHN0cmNhdChzdHIsICIgLSBbRmluaXNoZWRdIik7Ci0gICAgICAgIGlmICghU2V0Q29uc29sZVRpdGxlKHN0cikpIHsKLSAgICAgICAgICAgIHByaW50ZXJyKCJTZXRDb25zb2xlVGl0bGUoKSBmYWlsZWQgKCVkKVxuIiwgR2V0TGFzdEVycm9yKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgV2FpdEZvclNpbmdsZU9iamVjdCh0aHJlYWQsIElORklOSVRFKTsKLSAgICBGcmVlQ29uc29sZSgpOwotICAgIENsb3NlSGFuZGxlKGhlcnJvdXQpOwotICAgIGlmIChpc3NlcnZpY2UpIHsKLSAgICAgICAgaWYgKCFTZXRQcm9jZXNzV2luZG93U3RhdGlvbihoc2F2ZXdpbnN0YSkpIHsKLSAgICAgICAgICAgIGxlbiA9IEdldExhc3RFcnJvcigpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghU2V0VGhyZWFkRGVza3RvcChoc2F2ZWRlc2spKSB7Ci0gICAgICAgICAgICBsZW4gPSBHZXRMYXN0RXJyb3IoKTsKLSAgICAgICAgfQotICAgICAgICBDbG9zZURlc2t0b3AoaGRlc2spOwotICAgICAgICBDbG9zZVdpbmRvd1N0YXRpb24oaHdpbnN0YSk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0KLURXT1JEIFdJTkFQSSBmZWVkYmFjayhMUFZPSUQgYXJnKQotewotICAgIEhBTkRMRSBjb25pbjsKLSAgICBIQU5ETEUgcGlwZW91dCA9IChIQU5ETEUpYXJnOwotICAgIGNoYXIgKnN0clsxMDI0XTsKLSAgICBEV09SRCBsZW47Ci0KLSAgICBjb25pbiA9IEdldFN0ZEhhbmRsZShTVERfSU5QVVRfSEFORExFKTsKLSAgICBpZiAoIWNvbmluKSB7Ci0gICAgICAgIGxlbiA9IEdldExhc3RFcnJvcigpOwotICAgIH0KLQotICAgIHdoaWxlIChSZWFkRmlsZShjb25pbiwgc3RyLCBzaXplb2Yoc3RyKSwgJmxlbiwgTlVMTCkpCi0gICAgICAgIGlmICghbGVuIHx8ICFXcml0ZUZpbGUocGlwZW91dCwgc3RyLCBsZW4sICZsZW4sIE5VTEwpKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICBwcmludGVycigiW0VPRl0gZnJvbSBDb25zb2xlICglZClcbiIsIEdldExhc3RFcnJvcigpKTsKLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc3VwcG9ydC93aW4zMi93aW50dHkuZHNwIGIvc3VwcG9ydC93aW4zMi93aW50dHkuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjYyYjVlLi4wMDAwMDAwCi0tLSBhL3N1cHBvcnQvd2luMzIvd2ludHR5LmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0id2ludHR5IiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMwotCi1DRkc9d2ludHR5IC0gV2luMzIgRGVidWcKLSFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAid2ludHR5Lm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAid2ludHR5Lm1hayIgQ0ZHPSJ3aW50dHkgLSBXaW4zMiBEZWJ1ZyIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJ3aW50dHkgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgIndpbnR0eSAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIndpbnR0eSAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL0QgIkFQUl9ERUNMQVJFX1NUQVRJQyIgL0QgIkFQVV9ERUNMQVJFX1NUQVRJQyIgL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvSSAiLi4vc3JjbGliL2Fwci9pbmNsdWRlIiAvSSAiLi4vc3JjbGliL2Fwci11dGlsL2luY2x1ZGUiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9DT05TT0xFIiAvRCAiQVBSX0RFQ0xBUkVfU1RBVElDIiAvRCAiQVBVX0RFQ0xBUkVfU1RBVElDIiAvRmQiUmVsZWFzZS93aW50dHkiIC9GRCAvYwotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBhZHZhcGkzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2luY3JlbWVudGFsOm5vIC9tYXAgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGFkdmFwaTMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvaW5jcmVtZW50YWw6bm8gL21hcCAvbWFjaGluZTpJMzg2Ci0KLSFFTFNFSUYgICIkKENGRykiID09ICJ3aW50dHkgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL0QgIkFQUl9ERUNMQVJFX1NUQVRJQyIgL0QgIkFQVV9ERUNMQVJFX1NUQVRJQyIgL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTURkIC9XMyAvR1ggL1pJIC9PZCAvSSAiLi4vc3JjbGliL2Fwci9pbmNsdWRlIiAvSSAiLi4vc3JjbGliL2Fwci11dGlsL2luY2x1ZGUiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9DT05TT0xFIiAvRCAiQVBSX0RFQ0xBUkVfU1RBVElDIiAvRCAiQVBVX0RFQ0xBUkVfU1RBVElDIiAvRmQiRGVidWcvd2ludHR5IiAvRkQgL2MKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgYWR2YXBpMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9pbmNyZW1lbnRhbDpubyAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgYWR2YXBpMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9pbmNyZW1lbnRhbDpubyAvbWFwIC9kZWJ1ZyAvbWFjaGluZTpJMzg2Ci0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJ3aW50dHkgLSBXaW4zMiBSZWxlYXNlIgotIyBOYW1lICJ3aW50dHkgLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cd2ludHR5LmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL3Rlc3QvLmN2c2lnbm9yZSBiL3Rlc3QvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIyNDRhNC4uMDAwMDAwMAotLS0gYS90ZXN0Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1hLm91dAotdGltZS1GQ05UTAotdGltZS1GTE9DSwotdGltZS1TWVNWU0VNCi10aW1lLVNZU1ZTRU0yCi10aW1lLVBUSFJFQUQKLXRpbWUtVVNMT0NLCi16YgotdGVzdC13cml0ZXYKLXRlc3RfZGF0ZQotdGVzdF9zZWxlY3QKZGlmZiAtLWdpdCBhL3Rlc3QvLmluZGVudC5wcm8gYi90ZXN0Ly5pbmRlbnQucHJvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWZiZTlmLi4wMDAwMDAwCi0tLSBhL3Rlc3QvLmluZGVudC5wcm8KKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0taTQgLW5wc2wgLWRpMCAtYnIgLW5jZSAtZDAgLWNsaTAgLW5wY3MgLW5mYzEKLS1UQlVGRgotLVRGSUxFCi0tVFRSQU5TCi0tVFVJTlQ0Ci0tVF90cmFucwotLVRhbGxvd19vcHRpb25zX3QKLS1UYXBhY2hlX3NmaW8KLS1UYXJyYXlfaGVhZGVyCi0tVGJvb2xfaW50Ci0tVGJ1Zl9hcmVhCi0tVGJ1ZmZfc3RydWN0Ci0tVGJ1ZmZ5Ci0tVGNtZF9ob3cKLS1UY21kX3Bhcm1zCi0tVGNvbW1hbmRfcmVjCi0tVGNvbW1hbmRfc3RydWN0Ci0tVGNvbm5fcmVjCi0tVGNvcmVfZGlyX2NvbmZpZwotLVRjb3JlX3NlcnZlcl9jb25maWcKLS1UZGlyX21ha2VyX2Z1bmMKLS1UZXZlbnQKLS1UZ2xvYmFsc19zCi0tVGhhbmRsZXJfZnVuYwotLVRoYW5kbGVyX3JlYwotLVRqb2JsaXN0X3MKLS1UbGlzdGVuX3JlYwotLVRtZXJnZXJfZnVuYwotLVRtb2RlX3QKLS1UbW9kdWxlCi0tVG1vZHVsZV9zdHJ1Y3QKLS1UbXV0ZXgKLS1Ubl9sb25nCi0tVG90aGVyX2NoaWxkX3JlYwotLVRvdmVycmlkZXNfdAotLVRwYXJlbnRfc2NvcmUKLS1UcGlkX3QKLS1UcGlwZWRfbG9nCi0tVHBvb2wKLS1UcmVxdWVzdF9yZWMKLS1UcmVxdWlyZV9saW5lCi0tVHJsaW1fdAotLVRzY29yZWJvYXJkCi0tVHNlbWFwaG9yZQotLVRzZXJ2ZXJfYWRkcl9yZWMKLS1Uc2VydmVyX3JlYwotLVRzZXJ2ZXJfcmVjX2NoYWluCi0tVHNob3J0X3Njb3JlCi0tVHRhYmxlCi0tVHRhYmxlX2VudHJ5Ci0tVHRocmVhZAotLVR1X3dpZGVfaW50Ci0tVHZ0aW1lX3QKLS1Ud2lkZV9pbnQKZGlmZiAtLWdpdCBhL3Rlc3QvTWFrZWZpbGUuaW4gYi90ZXN0L01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzc3MGY3Li4wMDAwMDAwCi0tLSBhL3Rlc3QvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0KLVBST0dSQU1TID0gZGJ1Ci10YXJnZXRzICA9ICQoUFJPR1JBTVMpCi0KLVBST0dSQU1fTERBREQgICAgICAgID0gJChFWFRSQV9MREZMQUdTKSAkKFBST0dSQU1fREVQRU5ERU5DSUVTKSAkKEVYVFJBX0xJQlMpCi1QUk9HUkFNX0RFUEVOREVOQ0lFUyA9IC4uL2FwL2xpYmFwLmxhIFwKLQkuLi9saWIvYXB1dGlsL2xpYmFwdXRpbC5sYSBcCi0JLi4vbGliL3NkYm0vbGlic2RibS5sYSBcCi0JLi4vbGliL2Fwci8kKExJQlBSRSlhcHIuYQotCi1pbmNsdWRlICQodG9wX3NyY2RpcikvYnVpbGQvcnVsZXMubWsKLQotZGJ1X09CSkVDVFMgPSBkYnUubG8KLWRidTogJChkYnVfT0JKRUNUUykKLQkkKExJTkspICQoZGJ1X09CSkVDVFMpICQoUFJPR1JBTV9MREFERCkKZGlmZiAtLWdpdCBhL3Rlc3QvUkVBRE1FIGIvdGVzdC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOGJlNTAuLjAwMDAwMDAKLS0tIGEvdGVzdC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHVzZWZ1bCB0ZXN0IGNvZGUgZm9yIHRlc3RpbmcgdmFyaW91cyBiaXRzCi1vZiBBcGFjaGUgZnVuY3Rpb25hbGl0eS4gIFRoaXMgc3R1ZmYgaXMgZm9yIHRoZSBkZXZlbG9wZXJzIG9ubHksCi1zbyB3ZSBtaWdodCByZW1vdmUgaXQgb24gcHVibGljIHJlbGVhc2VzLgpkaWZmIC0tZ2l0IGEvdGVzdC9jaGVja19jaHVua2VkIGIvdGVzdC9jaGVja19jaHVua2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTEyMTY3Li4wMDAwMDAwCi0tLSBhL3Rlc3QvY2hlY2tfY2h1bmtlZAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSMhL3Vzci9iaW4vcGVybCAtdwotCi0jIFRoaXMgaXMgbWVhbnQgdG8gYmUgdXNlZCBvbiB0aGUgcmF3IG91dHB1dCBvZiBhbiBIVFRQLzEuMSBjb25uZWN0aW9uCi0jIHRvIGNoZWNrIHRoYXQgdGhlIGNodW5rcyBhcmUgYWxsIGNvcnJlY3RseSBsYWlkIG91dC4gIEl0J3MgZWFzaWVzdAotIyB0byB1c2UgYSB0b29sIGxpa2UgbmV0Y2F0IHRvIGdlbmVyYXRlIHRoZSBvdXRwdXQuICBUaGlzIHNjcmlwdAotIyAqaW5zaXN0cyogdGhhdCBcciBleGlzdCBpbiB0aGUgb3V0cHV0LgotIwotIyBZb3UgY2FuIGZpbmQgbmV0Y2F0IGF0IGF2aWFuLm9yZzovc3JjL2hhY2tzL25jMTEwLnRnei4KLQotdXNlIHN0cmljdDsKLQotbXkgJGlzX2NodW5rZWQgPSAwOwotCi0jIG11c3QgdG9zcyBoZWFkZXJzCi13aGlsZSg8PikgewotICAgIGlmICgvXlRyYW5zZmVyLUVuY29kaW5nOlxzK2NodW5rZWQvaSkgewotCSRpc19jaHVua2VkID0gMTsKLSAgICB9Ci0gICAgbGFzdCBpZiAoJF8gZXEgIlxyXG4iKTsKLX0KLQotJGlzX2NodW5rZWQgfHwgZGllICJ3YXNuJ3QgY2h1bmtlZFxuIjsKLQotZm9yKDs7KSB7Ci0gICAgJF8gPSA8PiB8fCBkaWUgInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUhXG4iOwotCi0gICAgbSNeKFswLTlhLWZdKykgKlxyJCNpIHx8IGRpZSAiYm9ndXMgY2h1bmtsZW46ICRfIjsKLQotICAgIG15ICRjaHVua2xlbiA9IGhleCgkMSk7Ci0KLSAgICBleGl0IDAgaWYgKCRjaHVua2xlbiA9PSAwKTsKLQotICAgIGNob3A7IGNob3A7Ci0gICAgcHJpbnQgIiRfICI7Ci0KLSAgICBteSAkZGF0YSA9ICcnOwotICAgIHJlYWQoQVJHViwgJGRhdGEsICRjaHVua2xlbikgPT0gJGNodW5rbGVuIHx8IGRpZSAic2hvcnQgcmVhZCFcbiI7Ci0KLSAgICAkXyA9IDw+IHx8IGRpZSAidW5leHBlY3RlZCBlbmQgb2YgZmlsZSFcbiI7Ci0KLSAgICAkXyBlcSAiXHJcbiIgfHwgZGllICJtaXNzaW5nIGNodW5rIHRyYWlsZXIhXG4iOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9jbHMuYyBiL3Rlc3QvY2xzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMTE0YTcuLjAwMDAwMDAKLS0tIGEvdGVzdC9jbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxkaXJlbnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotLyoKLSAqIENvbXBhcmUgYSBzdHJpbmcgdG8gYSBtYXNrCi0gKiBNYXNrIGNoYXJhY3RlcnM6Ci0gKiAgIEAgLSB1cHBlcmNhc2UgbGV0dGVyCi0gKiAgICMgLSBsb3dlcmNhc2UgbGV0dGVyCi0gKiAgICYgLSBoZXggZGlnaXQKLSAqICAgIyAtIGRpZ2l0Ci0gKiAgICogLSBzd2FsbG93IHJlbWFpbmluZyBjaGFyYWN0ZXJzIAotICogIDx4PiAtIGV4YWN0IG1hdGNoIGZvciBhbnkgb3RoZXIgY2hhcmFjdGVyCi0gKi8KLXN0YXRpYyBpbnQgY2hlY2ttYXNrKGNvbnN0IGNoYXIgKmRhdGEsIGNvbnN0IGNoYXIgKm1hc2spCi17Ci0gICAgaW50IGksIGNoLCBkOwotCi0gICAgZm9yIChpID0gMDsgbWFza1tpXSAhPSAnXDAnICYmIG1hc2tbaV0gIT0gJyonOyBpKyspIHsKLQljaCA9IG1hc2tbaV07Ci0JZCA9IGRhdGFbaV07Ci0JaWYgKGNoID09ICdAJykgewotCSAgICBpZiAoIWlzdXBwZXIoZCkpCi0JCXJldHVybiAwOwotCX0KLQllbHNlIGlmIChjaCA9PSAnJCcpIHsKLQkgICAgaWYgKCFpc2xvd2VyKGQpKQotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSBpZiAoY2ggPT0gJyMnKSB7Ci0JICAgIGlmICghaXNkaWdpdChkKSkKLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgaWYgKGNoID09ICcmJykgewotCSAgICBpZiAoIWlzeGRpZ2l0KGQpKQotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSBpZiAoY2ggIT0gZCkKLQkgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKG1hc2tbaV0gPT0gJyonKQotCXJldHVybiAxOwotICAgIGVsc2UKLQlyZXR1cm4gKGRhdGFbaV0gPT0gJ1wwJyk7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0cyA4IGhleCBkaWdpdHMgdG8gYSB0aW1lIGludGVnZXIKLSAqLwotc3RhdGljIGludCBoZXgyc2VjKGNvbnN0IGNoYXIgKngpCi17Ci0gICAgaW50IGksIGNoOwotICAgIHVuc2lnbmVkIGludCBqOwotCi0gICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCA4OyBpKyspIHsKLQljaCA9IHhbaV07Ci0JaiA8PD0gNDsKLQlpZiAoaXNkaWdpdChjaCkpCi0JICAgIGogfD0gY2ggLSAnMCc7Ci0JZWxzZSBpZiAoaXN1cHBlcihjaCkpCi0JICAgIGogfD0gY2ggLSAoJ0EnIC0gMTApOwotCWVsc2UKLQkgICAgaiB8PSBjaCAtICgnYScgLSAxMCk7Ci0gICAgfQotICAgIGlmIChqID09IDB4ZmZmZmZmZmYpCi0JcmV0dXJuIC0xOwkJLyogc28gdGhhdCBpdCB3b3JrcyB3aXRoIDgtYnl0ZSBpbnRzICovCi0gICAgZWxzZQotCXJldHVybiBqOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgaW50IGksIHZlcjsKLSAgICBESVIgKmQ7Ci0gICAgc3RydWN0IGRpcmVudCAqZTsKLSAgICBjb25zdCBjaGFyICpzOwotICAgIEZJTEUgKmZwOwotICAgIGNoYXIgcGF0aFtGSUxFTkFNRV9NQVggKyAxXTsKLSAgICBjaGFyIGxpbmVbMTAzNV07Ci0gICAgdGltZV90IGRhdGUsIGxtb2QsIGV4cGlyZTsKLSAgICB1bnNpZ25lZCBpbnQgbGVuOwotICAgIHN0cnVjdCB0bSB0czsKLSAgICBjaGFyIHNkYXRlWzMwXSwgc2xtb2RbMzBdLCBzZXhwaXJlWzMwXTsKLSAgICBjb25zdCBjaGFyIHRpbWVfZm9ybWF0W10gPSAiJWUgJWIgJVkgJVIiOwotCi0gICAgaWYgKGFyZ2MgIT0gMikgewotCXByaW50ZigiVXNhZ2U6IGNscyBkaXJlY3RvcnlcbiIpOwotCWV4aXQoMCk7Ci0gICAgfQotCi0gICAgZCA9IG9wZW5kaXIoYXJndlsxXSk7Ci0gICAgaWYgKGQgPT0gTlVMTCkgewotCXBlcnJvcigib3BlbmRpciIpOwotCWV4aXQoMSk7Ci0gICAgfQotCi0gICAgZm9yICg7OykgewotCWUgPSByZWFkZGlyKGQpOwotCWlmIChlID09IE5VTEwpCi0JICAgIGJyZWFrOwotCXMgPSBlLT5kX25hbWU7Ci0JaWYgKHNbMF0gPT0gJy4nIHx8IHNbMF0gPT0gJyMnKQotCSAgICBjb250aW51ZTsKLQlzcHJpbnRmKHBhdGgsICIlcy8lcyIsIGFyZ3ZbMV0sIHMpOwotCWZwID0gZm9wZW4ocGF0aCwgInIiKTsKLQlpZiAoZnAgPT0gTlVMTCkgewotCSAgICBwZXJyb3IoImZvcGVuIik7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQlpZiAoZmdldHMobGluZSwgMTAzNCwgZnApID09IE5VTEwpIHsKLQkgICAgcGVycm9yKCJmZ2V0cyIpOwotCSAgICBmY2xvc2UoZnApOwotCSAgICBjb250aW51ZTsKLQl9Ci0JaWYgKCFjaGVja21hc2sobGluZSwgIiYmJiYmJiYmICYmJiYmJiYmICYmJiYmJiYmICYmJiYmJiYmICYmJiYmJiYmXG4iKSkgewotCSAgICBmcHJpbnRmKHN0ZGVyciwgIkJhZCBjYWNoZSBmaWxlXG4iKTsKLQkgICAgZmNsb3NlKGZwKTsKLQkgICAgY29udGludWU7Ci0JfQotCWRhdGUgPSBoZXgyc2VjKGxpbmUpOwotCWxtb2QgPSBoZXgyc2VjKGxpbmUgKyA5KTsKLQlleHBpcmUgPSBoZXgyc2VjKGxpbmUgKyAxOCk7Ci0JdmVyID0gaGV4MnNlYyhsaW5lICsgMjcpOwotCWxlbiA9IGhleDJzZWMobGluZSArIDM1KTsKLQlpZiAoZmdldHMobGluZSwgMTAzNCwgZnApID09IE5VTEwpIHsKLQkgICAgcGVycm9yKCJmZ2V0cyIpOwotCSAgICBmY2xvc2UoZnApOwotCSAgICBjb250aW51ZTsKLQl9Ci0JZmNsb3NlKGZwKTsKLQlpID0gc3RybGVuKGxpbmUpOwotCWlmIChzdHJuY21wKGxpbmUsICJYLVVSTDogIiwgNykgIT0gMCB8fCBsaW5lW2kgLSAxXSAhPSAnXG4nKSB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCAiQmFkIGNhY2hlIGZpbGVcbiIpOwotCSAgICBjb250aW51ZTsKLQl9Ci0JbGluZVtpIC0gMV0gPSAnXDAnOwotCWlmIChkYXRlICE9IC0xKSB7Ci0JICAgIHRzID0gKmdtdGltZSgmZGF0ZSk7Ci0JICAgIHN0cmZ0aW1lKHNkYXRlLCAzMCwgdGltZV9mb3JtYXQsICZ0cyk7Ci0JfQotCWVsc2UKLQkgICAgc3RyY3B5KHNkYXRlLCAiLSIpOwotCi0JaWYgKGxtb2QgIT0gLTEpIHsKLQkgICAgdHMgPSAqZ210aW1lKCZsbW9kKTsKLQkgICAgc3RyZnRpbWUoc2xtb2QsIDMwLCB0aW1lX2Zvcm1hdCwgJnRzKTsKLQl9Ci0JZWxzZQotCSAgICBzdHJjcHkoc2xtb2QsICItIik7Ci0KLQlpZiAoZXhwaXJlICE9IC0xKSB7Ci0JICAgIHRzID0gKmdtdGltZSgmZXhwaXJlKTsKLQkgICAgc3RyZnRpbWUoc2V4cGlyZSwgMzAsIHRpbWVfZm9ybWF0LCAmdHMpOwotCX0KLQllbHNlCi0JICAgIHN0cmNweShzZXhwaXJlLCAiLSIpOwotCi0JcHJpbnRmKCIlczogJWQ7ICVzICAlcyAgJXNcbiIsIGxpbmUgKyA3LCB2ZXIsIHNkYXRlLCBzbG1vZCwgc2V4cGlyZSk7Ci0gICAgfQotCi0gICAgY2xvc2VkaXIoZCk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90ZXN0L3RjcGR1bXBzY2lpLnR4dCBiL3Rlc3QvdGNwZHVtcHNjaWkudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzEwNjBlLi4wMDAwMDAwCi0tLSBhL3Rlc3QvdGNwZHVtcHNjaWkudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotCi1Gcm9tIG1hcmNzQHpuZXAuY29tIEZyaSBBcHIgMTcgMTU6MTY6MTYgMTk5OAotRGF0ZTogU2F0LCAyMiBOb3YgMTk5NyAyMDo0NDoxMCAtMDcwMCAoTVNUKQotRnJvbTogTWFyYyBTbGVta28gPG1hcmNzQHpuZXAuY29tPgotVG86IFRMT1NBUCA8bmV3LWh0dHBkQGFwYWNoZS5vcmc+Ci1TdWJqZWN0OiBSZTogR2V0dGluZyBldGhlcm5ldCBwYWNrZXRzIGNvbnRlbnQgdW5kZXIgRnJlZUJTRD8gIChmd2QpCi1SZXBseS1UbzogbmV3LWh0dHBkQGFwYWNoZS5vcmcKLQotQW55b25lIHRvbyBsYXp5IHRvIGhhY2sgdGNwZHVtcCAoZWcuIG15IHRjcGR1bXAgaGFzIGEgLVggb3B0aW9uIHRvIGRpc3BsYXkKLXRoZSBkYXRhIGluIEFTQ0lJKSBjYW4gdXNlIHNvbWV0aGluZyBsaWtlIHRoZSBiZWxvdyB0byBncmFiIEhUVFAgaGVhZGVycwotd2hlbiBkZWJ1Z2dpbmcgYnJva2VuIGNsaWVudHMuCi0KLU5vdGhpbmcgY29tcGxpY2F0ZWQsIGJ1dCBoYW5keS4KLQotLS0tLS0tLS0tLSBGb3J3YXJkZWQgbWVzc2FnZSAtLS0tLS0tLS0tCi1EYXRlOiBTYXQsIDIyIE5vdiAxOTk3IDE0OjM1OjIzIFBTVAotRnJvbTogQmlsbCBGZW5uZXIgPGZlbm5lckBwYXJjLnhlcm94LmNvbT4KLVRvOiBOYXRlIFdpbGxpYW1zIDxuYXRlQG10LnNyaS5jb20+Ci1DYzogYm1haEBjYS5zYW5kaWEuZ292LCBoYWNrZXJzQEZyZWVCU0QuT1JHCi1TdWJqZWN0OiBSZTogR2V0dGluZyBldGhlcm5ldCBwYWNrZXRzIGNvbnRlbnQgdW5kZXIgRnJlZUJTRD8gCi0KLUkgdXN1YWxseSBqdXN0IHVzZSB0aGlzIHBlcmwgc2NyaXB0LCB3aGljaCBJIGNhbGwgInRjcGR1bXBzY2lpIi4KLVRoZW4gcnVuICJ0Y3BkdW1wc2NpaSAtcyAxNTAwIC14IFtvdGhlciB0Y3BkdW1wIGFyZ3NdIi4KLQotICBCaWxsCi0KLSMhL2ltcG9ydC9taXNjL2Jpbi9wZXJsCi0jCi0jCi1vcGVuKFRDUERVTVAsInRjcGR1bXAgLWwgQEFSR1Z8Iik7Ci13aGlsZSAoPFRDUERVTVA+KSB7Ci0JaWYgKC9eXHMrKFxTXFMpKy8pIHsKLQkJJHNhdiA9ICRfOwotCQkkYXNjID0gIiI7Ci0JCXdoaWxlIChzL1xzKihcU1xTKVxzKi8vKSB7Ci0JCQkkaSA9IGhleCgkMSk7Ci0JCQlpZiAoJGkgPCAzMiB8fCAkaSA+IDEyNikgewotCQkJCSRhc2MgLj0gIi4iOwotCQkJfSBlbHNlIHsKLQkJCQkkYXNjIC49IHBhY2soQyxoZXgoJDEpKTsKLQkJCX0KLQkJfQotCQkkZm9vID0gIi4iIHggbGVuZ3RoKCRhc2MpOwotCQkkXyA9ICRzYXY7Ci0JCXMvXHQvICAgICAgICAvZzsKLQkJcy9eJGZvby8kYXNjLzsKLQl9Ci0JcHJpbnQ7Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdC13cml0ZXYuYyBiL3Rlc3QvdGVzdC13cml0ZXYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUyYzcwMS4uMDAwMDAwMAotLS0gYS90ZXN0L3Rlc3Qtd3JpdGV2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICAgIHRlc3Qtd3JpdGV2OiB1c2UgdGhpcyB0byBmaWd1cmUgb3V0IGlmIHlvdXIgd3JpdGV2KCkgZG9lcyBpbnRlbGxpZ2VudAotICAgIHRoaW5ncyBvbiB0aGUgbmV0d29yay4gIFNvbWUgd3JpdGV2KClzIHdoZW4gZ2l2ZW4gbXVsdGlwbGUgYnVmZmVycwotICAgIHdpbGwgYnJlYWsgdGhlbSB1cCBpbnRvIG11bHRpcGxlIHBhY2tldHMsIHdoaWNoIGlzIGEgd2FzdGUuCi0KLSAgICBMaW51eCBwcmlvciB0byAyLjAuMzEgaGFzIHRoaXMgcHJvYmxlbS4KLQotICAgIFNvbGFyaXMgMi41LCAyLjUuMSBkb2Vzbid0IGFwcGVhciB0bywgMi42IGhhc24ndCBiZWVuIHRlc3RlZC4KLQotICAgIElSSVggNS4zIGRvZXNuJ3QgaGF2ZSB0aGlzIHByb2JsZW0uCi0KLSAgICBUbyB1c2UgdGhpcyB5b3Ugd2FudCB0byBzbm9vcCB0aGUgd2lyZSB3aXRoIHRjcGR1bXAsIGFuZCB0aGVuIHJ1bgotICAgICJ0ZXN0LXdyaXRldiBhLmIuYy5kIHBvcnQjIiAuLi4gYWdhaW5zdCBzb21lIFRDUCBzZXJ2aWNlIG9uIGFub3RoZXIKLSAgICBib3guICBGb3IgZXhhbXBsZSB5b3UgY2FuIHJ1biBpdCBhZ2FpbnN0IHBvcnQgODAgb24gYW5vdGhlciBzZXJ2ZXIuCi0gICAgWW91IHdhbnQgdG8gbG9vayB0byBzZWUgaG93IG1hbnkgZGF0YSBwYWNrZXRzIGFyZSBzZW50LCB5b3UncmUgaG9waW5nCi0gICAgb25seSBvbmUgb2Ygc2l6ZSAzMDAgaXMgc2VudC4KLSovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0jaW5jbHVkZSA8c3lzL3Vpby5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpZm5kZWYgSU5BRERSX05PTkUKLSNkZWZpbmUgSU5BRERSX05PTkUgKC0xdWwpCi0jZW5kaWYKLQotdm9pZCBtYWluKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKQotewotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzZXJ2ZXJfYWRkcjsKLSAgICBpbnQgczsKLSAgICBzdHJ1Y3QgaW92ZWMgdmVjdG9yWzNdOwotICAgIGNoYXIgYnVmWzEwMF07Ci0gICAgaW50IGk7Ci0gICAgY29uc3QgaW50IGp1c3Rfc2F5X25vID0gMTsKLQotICAgIGlmKCBhcmdjICE9IDMgKSB7Ci11c2FnZToKLQlmcHJpbnRmKCBzdGRlcnIsICJ1c2FnZTogdGVzdC13cml0ZXYgYS5iLmMuZCBwb3J0I1xuIiApOwotCWV4aXQoIDEgKTsKLSAgICB9Ci0gICAgc2VydmVyX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgc2VydmVyX2FkZHIuc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKCBhcmd2WzFdICk7Ci0gICAgaWYoIHNlcnZlcl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9PSBJTkFERFJfTk9ORSApIHsKLQlmcHJpbnRmKCBzdGRlcnIsICJib2d1cyBhZGRyZXNzXG4iICk7Ci0JZ290byB1c2FnZTsKLSAgICB9Ci0gICAgc2VydmVyX2FkZHIuc2luX3BvcnQgPSBodG9ucyggYXRvaSggYXJndlsyXSApICk7Ci0KLSAgICBzID0gc29ja2V0KCBBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCApOwotICAgIGlmKCBzIDwgMCApIHsKLQlwZXJyb3IoInNvY2tldCIpOwotCWV4aXQoMSk7Ci0gICAgfQotICAgIGlmKCBjb25uZWN0KCBzLCAoc3RydWN0IHNvY2thZGRyICopJnNlcnZlcl9hZGRyLCBzaXplb2YoIHNlcnZlcl9hZGRyICkgKQotCSE9IDAgKSB7Ci0JcGVycm9yKCJjb25uZWN0Iik7Ci0JZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBpZiggc2V0c29ja29wdChzLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIChjaGFyKikmanVzdF9zYXlfbm8sCi0Jc2l6ZW9mKGp1c3Rfc2F5X25vKSkgIT0gMCApIHsKLQlwZXJyb3IoICJUQ1BfTk9ERUxBWSIgKTsKLQlleGl0KDEpOwotICAgIH0KLSAgICAvKiBub3cgYnVpbGQgdXAgYSB0d28gcGFydCB3cml0ZXYgYW5kIHdyaXRlIGl0IG91dCAqLwotICAgIGZvciggaSA9IDA7IGkgPCBzaXplb2YoIGJ1ZiApOyArK2kgKSB7Ci0JYnVmW2ldID0gJ3gnOwotICAgIH0KLSAgICB2ZWN0b3JbMF0uaW92X2Jhc2UgPSBidWY7Ci0gICAgdmVjdG9yWzBdLmlvdl9sZW4gPSBzaXplb2YoYnVmKTsKLSAgICB2ZWN0b3JbMV0uaW92X2Jhc2UgPSBidWY7Ci0gICAgdmVjdG9yWzFdLmlvdl9sZW4gPSBzaXplb2YoYnVmKTsKLSAgICB2ZWN0b3JbMl0uaW92X2Jhc2UgPSBidWY7Ci0gICAgdmVjdG9yWzJdLmlvdl9sZW4gPSBzaXplb2YoYnVmKTsKLQotICAgIGkgPSB3cml0ZXYoIHMsICZ2ZWN0b3JbMF0sIDMgKTsKLSAgICBmcHJpbnRmKCBzdGRvdXQsICJpPSVkLCBlcnJubz0lZFxuIiwgaSwgZXJybm8gKTsKLSAgICBleGl0KDApOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC90ZXN0X2ZpbmQuYyBiL3Rlc3QvdGVzdF9maW5kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmODg3ZjUuLjAwMDAwMDAKLS0tIGEvdGVzdC90ZXN0X2ZpbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qIFRoaXMgcHJvZ3JhbSB0ZXN0cyB0aGUgYXBfZmluZF9saXN0X2l0ZW0gcm91dGluZSBpbiAuLi9tYWluL3V0aWwuYy4KLSAqCi0gKiBUaGUgZGVmaW5lcyBpbiB0aGlzIHNhbXBsZSBjb21waWxlIGxpbmUgYXJlIHNwZWNpZmljIHRvIFJveSdzIHN5c3RlbS4KLSAqIFRoZXkgc2hvdWxkIG1hdGNoIHdoYXRldmVyIHdhcyB1c2VkIHRvIGNvbXBpbGUgQXBhY2hlIGZpcnN0LgotICoKLSAgICAgZ2NjIC1nIC1PMiAtSS4uL29zL3VuaXggLUkuLi9pbmNsdWRlIC1vIHRlc3RfZmluZCBcCi0gICAgICAgICAgICAtRFNPTEFSSVMyPTI1MCAtV2FsbCAtREFMTE9DX0RFQlVHIC1EUE9PTF9ERUJVRyBcCi0gICAgICAgICAgICAuLi9tYWluL2FsbG9jLm8gLi4vbWFpbi9idWZmLm8gLi4vbWFpbi91dGlsLm8gXAotICAgICAgICAgICAgLi4vYXAvbGliYXAuYSAtbHNvY2tldCAtbG5zbCB0ZXN0X2ZpbmQuYwotICogCi0gKiBSb3kgRmllbGRpbmcsIDE5OTkKLSAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJhbGxvYy5oIgotCi0vKgotICogRHVtbXkgYSBidW5jaCBvZiBzdHVmZiBqdXN0IHRvIGdldCBhIGNvbXBpbGUKLSAqLwotdWlkX3QgYXBfdXNlcl9pZDsKLWdpZF90IGFwX2dyb3VwX2lkOwotdm9pZCAqYXBfZHVtbXlfbXV0ZXggPSAmYXBfZHVtbXlfbXV0ZXg7Ci1jaGFyICphcF9zZXJ2ZXJfYXJndjA7Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfYmxvY2tfYWxhcm1zKHZvaWQpCi17Ci0gICAgOwotfQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX3VuYmxvY2tfYWxhcm1zKHZvaWQpCi17Ci0gICAgOwotfQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX2xvZ19lcnJvcihjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotICAgIDsKLX0KLQotaW50IG1haW4gKHZvaWQpCi17Ci0gICAgYXBfcG9vbCAqcDsKLSAgICBjaGFyIGxpbmVbNTEyXTsKLSAgICBjaGFyIHRva1s1MTJdOwotCi0gICAgcCA9IGFwX2luaXRfYWxsb2MoKTsKLQotICAgIHByaW50ZigiRW50ZXIgZmllbGQgdmFsdWUgdG8gZmluZCBpdGVtcyB3aXRoaW46XG4iKTsKLSAgICBpZiAoIWdldHMobGluZSkpCi0gICAgICAgIGV4aXQoMCk7Ci0KLSAgICBwcmludGYoIkVudGVyIHNlYXJjaCBpdGVtOlxuIik7Ci0gICAgd2hpbGUgKGdldHModG9rKSkgewotICAgICAgICBwcmludGYoIiAgWyVzXSA9PSAlc1xuIiwgdG9rLCBhcF9maW5kX2xpc3RfaXRlbShwLCBsaW5lLCB0b2spCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiWWVzIiA6ICJObyIpOwotICAgICAgICBwcmludGYoIkVudGVyIHNlYXJjaCBpdGVtOlxuIik7Ci0gICAgfQotICAgIAotICAgIGV4aXQoMCk7Ci19CmRpZmYgLS1naXQgYS90ZXN0L3Rlc3RfbGltaXRzLmMgYi90ZXN0L3Rlc3RfbGltaXRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNzZjZTIuLjAwMDAwMDAKLS0tIGEvdGVzdC90ZXN0X2xpbWl0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogdGVzdF9saW1pdHMuYwotICoKLSAqIEEgc2ltcGxlIHByb2dyYW0gZm9yIHNlbmRpbmcgYWJ1c2l2ZSByZXF1ZXN0cyB0byBhIHNlcnZlciwgYmFzZWQKLSAqIG9uIHRoZSBzaW91eC5jIGV4cGxvaXQgY29kZSB0aGF0IHRoaXMgbmltcm9kIHBvc3RlZCAoc2VlIGJlbG93KS4KLSAqIFJveSBhZGRlZCBvcHRpb25zIGZvciB0ZXN0aW5nIGxvbmcgaGVhZGVyIGZpZWxkc2l6ZSAoLXQgaCksIGxvbmcKLSAqIHJlcXVlc3QtbGluZXMgKC10IHIpLCBhbmQgYSBsb25nIHJlcXVlc3QgYm9keSAoLXQgYikuCi0gKgotICogRnJlZUJTRCAyLjIueCwgRnJlZUJTRCAzLjAsIElSSVggNS4zLCBJUklYIDYuMjoKLSAqICAgZ2NjIC1vIHRlc3RfbGltaXRzIHRlc3RfbGltaXRzLmMKLSAqIAotICogU29sYXJpcyAyLjUuMToKLSAqICAgZ2NjIC1vIHRlc3RfbGltaXRzIHRlc3RfbGltaXRzLmMgLWxzb2NrZXQgLWxuc2wKLSAqIAotICoKLSAqIE1lc3NhZ2UtSUQ6IDw4NjF6cXNwdnR3LmZzZkBuaW9iZS5ld294Lm9yZz4KLSAqIERhdGU6IAlGcmksIDcgQXVnIDE5OTggMTk6MDQ6MjcgKzAyMDAKLSAqIFNlbmRlcjogQnVndHJhcSBMaXN0IDxCVUdUUkFRQG5ldHNwYWNlLm9yZz4KLSAqIEZyb206IERhZy1FcmxpbmcgQ29pZGFuID0/SVNPLTg4NTktMT9RP1NtPUY4cmdyYXY/PSA8Zmlucm9kQEVXT1guT1JHPgotICogU3ViamVjdDogICAgICBZQSBBcGFjaGUgRG9TIGF0dGFjawotICogCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTggRGFnLUVybGluZyBDb2RhbiBTbXJncmF2Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogICAgaW4gdGhpcyBwb3NpdGlvbiBhbmQgdW5jaGFuZ2VkLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdWdoIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotLyoKLSAqIEt1ZG9zIHRvIE1hcmsgSHVpemVyIHdobyBvcmlnaW5hbGx5IHN1Z2dlc3RlZCB0aGlzIG9uIGZyZWVic2QtY3VycmVudAotICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvdWlvLmg+Ci0KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotCi0jaW5jbHVkZSA8bmV0ZGIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jZGVmaW5lIFRFU1RfTE9OR19SRVFVRVNUX0xJTkUgICAgICAxCi0jZGVmaW5lIFRFU1RfTE9OR19SRVFVRVNUX0ZJRUxEUyAgICAyCi0jZGVmaW5lIFRFU1RfTE9OR19SRVFVRVNUX0ZJRUxEU0laRSAzCi0jZGVmaW5lIFRFU1RfTE9OR19SRVFVRVNUX0JPRFkgICAgICA0Ci0KLXZvaWQKLXVzYWdlKHZvaWQpCi17Ci0gICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAidXNhZ2U6IHRlc3RfbGltaXRzIFstdCAocnxufGh8YildIFstYSBhZGRyZXNzXSBbLXAgcG9ydF0gWy1uIG51bV1cbiIpOwotICAgIGV4aXQoMSk7Ci19Ci0KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47Ci0gICAgc3RydWN0IGhvc3RlbnQgKmhlOwotICAgIEZJTEUgKmY7Ci0gICAgaW50IG8sIHNkOwotCi0gICAgLyogZGVmYXVsdCBwYXJhbWV0ZXJzICovCi0gICAgY2hhciAqYWRkciA9ICJsb2NhbGhvc3QiOwotICAgIGludCBwb3J0ID0gODA7Ci0gICAgaW50IG51bSA9IDEwMDA7Ci0gICAgaW50IHRlc3R0eXBlID0gVEVTVF9MT05HX1JFUVVFU1RfRklFTERTOwotCi0gICAgLyogZ2V0IG9wdGlvbnMgKi8KLSAgICB3aGlsZSAoKG8gPSBnZXRvcHQoYXJnYywgYXJndiwgInQ6YTpwOm46IikpICE9IEVPRikKLSAgICAgICAgc3dpdGNoIChvKSB7Ci0gICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgICAgaWYgKCpvcHRhcmcgPT0gJ3InKQotICAgICAgICAgICAgICAgIHRlc3R0eXBlID0gVEVTVF9MT05HX1JFUVVFU1RfTElORTsKLSAgICAgICAgICAgIGVsc2UgaWYgKCpvcHRhcmcgPT0gJ24nKQotICAgICAgICAgICAgICAgIHRlc3R0eXBlID0gVEVTVF9MT05HX1JFUVVFU1RfRklFTERTOwotICAgICAgICAgICAgZWxzZSBpZiAoKm9wdGFyZyA9PSAnaCcpCi0gICAgICAgICAgICAgICAgdGVzdHR5cGUgPSBURVNUX0xPTkdfUkVRVUVTVF9GSUVMRFNJWkU7Ci0gICAgICAgICAgICBlbHNlIGlmICgqb3B0YXJnID09ICdiJykKLSAgICAgICAgICAgICAgICB0ZXN0dHlwZSA9IFRFU1RfTE9OR19SRVFVRVNUX0JPRFk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnYSc6Ci0gICAgICAgICAgICBhZGRyID0gb3B0YXJnOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ3AnOgotICAgICAgICAgICAgcG9ydCA9IGF0b2kob3B0YXJnKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICduJzoKLSAgICAgICAgICAgIG51bSA9IGF0b2kob3B0YXJnKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgfQotCi0gICAgaWYgKGFyZ2MgIT0gb3B0aW5kKQotICAgICAgICB1c2FnZSgpOwotCi0gICAgLyogY29ubmVjdCAqLwotICAgIGlmICgoaGUgPSBnZXRob3N0YnluYW1lKGFkZHIpKSA9PSBOVUxMKSB7Ci0gICAgICAgIHBlcnJvcigiZ2V0aG9zdGJ5bmFtZSIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICBiemVybygmc2luLCBzaXplb2Yoc2luKSk7Ci0gICAgYmNvcHkoaGUtPmhfYWRkciwgKGNoYXIgKikmc2luLnNpbl9hZGRyLCBoZS0+aF9sZW5ndGgpOwotICAgIHNpbi5zaW5fZmFtaWx5ID0gaGUtPmhfYWRkcnR5cGU7Ci0gICAgc2luLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0KLSAgICBpZiAoKHNkID0gc29ja2V0KHNpbi5zaW5fZmFtaWx5LCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApKSA9PSAtMSkgewotICAgICAgICBwZXJyb3IoInNvY2tldCIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGlmIChjb25uZWN0KHNkLCAoc3RydWN0IHNvY2thZGRyICopJnNpbiwgc2l6ZW9mKHNpbikpID09IC0xKSB7Ci0gICAgICAgIHBlcnJvcigiY29ubmVjdCIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGlmICgoZiA9IGZkb3BlbihzZCwgInIrIikpID09IE5VTEwpIHsKLSAgICAgICAgcGVycm9yKCJmZG9wZW4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICAvKiBhdHRhY2shICovCi0gICAgZnByaW50ZihzdGRlcnIsICJUZXN0aW5nIGxpa2UgYSBwbGFndWUgb2YgbG9jdXN0cyBvbiAlc1xuIiwgYWRkcik7Ci0KLSAgICBpZiAodGVzdHR5cGUgPT0gVEVTVF9MT05HX1JFUVVFU1RfTElORSkgewotICAgICAgICBmcHJpbnRmKGYsICJHRVQgIik7Ci0gICAgICAgIHdoaWxlIChudW0tLSAmJiAhZmVycm9yKGYpKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGYsICIvMTIzNDU2Nzg5Iik7Ci0gICAgICAgICAgICBmZmx1c2goZik7Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50ZihmLCAiIEhUVFAvMS4wXHJcblxyXG4iKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZwcmludGYoZiwgIkdFVCAvZnJlZC9mb28gSFRUUC8xLjBcclxuIik7Ci0KLSAgICAgICAgaWYgKHRlc3R0eXBlID09IFRFU1RfTE9OR19SRVFVRVNUX0ZJRUxEU0laRSkgewotICAgICAgICAgICAgd2hpbGUgKG51bS0tICYmICFmZXJyb3IoZikpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJVc2VyLUFnZW50OiBzaW91eCIpOwotICAgICAgICAgICAgICAgIGZmbHVzaChmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZwcmludGYoZiwgIlxyXG4iKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0ZXN0dHlwZSA9PSBURVNUX0xPTkdfUkVRVUVTVF9GSUVMRFMpIHsKLSAgICAgICAgICAgIHdoaWxlIChudW0tLSAmJiAhZmVycm9yKGYpKQotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIlVzZXItQWdlbnQ6IHNpb3V4XHJcbiIpOwotICAgICAgICAgICAgZnByaW50ZihmLCAiXHJcbiIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRlc3R0eXBlID09IFRFU1RfTE9OR19SRVFVRVNUX0JPRFkpIHsKLSAgICAgICAgICAgIGZwcmludGYoZiwgIlVzZXItQWdlbnQ6IHNpb3V4XHJcbiIpOwotICAgICAgICAgICAgZnByaW50ZihmLCAiQ29udGVudC1MZW5ndGg6IDMzNTU0NDMzXHJcbiIpOwotICAgICAgICAgICAgZnByaW50ZihmLCAiXHJcbiIpOwotICAgICAgICAgICAgd2hpbGUgKG51bS0tICYmICFmZXJyb3IoZikpCi0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiVXNlci1BZ2VudDogc2lvdXhcclxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGYsICJcclxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZmZsdXNoKGYpOwotCi0gICAgewotICAgICAgICBzc2l6ZV90IGxlbjsKLSAgICAgICAgY2hhciBidWZmWzUxMl07Ci0KLSAgICAgICAgd2hpbGUgKChsZW4gPSByZWFkKHNkLCBidWZmLCA1MTIpKSA+IDApCi0gICAgICAgICAgICBsZW4gPSB3cml0ZSgxLCBidWZmLCBsZW4pOwotICAgIH0KLSAgICBpZiAoZmVycm9yKGYpKSB7Ci0gICAgICAgIHBlcnJvcigiZnByaW50ZiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGZjbG9zZShmKTsKLSAgICBleGl0KDApOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC90ZXN0X3BhcnNlci5jIGIvdGVzdC90ZXN0X3BhcnNlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2UyYzIxLi4wMDAwMDAwCi0tLSBhL3Rlc3QvdGVzdF9wYXJzZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qIFRoaXMgcHJvZ3JhbSB0ZXN0cyB0aGUgYXBfZ2V0X2xpc3RfaXRlbSByb3V0aW5lIGluIC4uL21haW4vdXRpbC5jLgotICoKLSAqIFRoZSBkZWZpbmVzIGluIHRoaXMgc2FtcGxlIGNvbXBpbGUgbGluZSBhcmUgc3BlY2lmaWMgdG8gUm95J3Mgc3lzdGVtLgotICogVGhleSBzaG91bGQgbWF0Y2ggd2hhdGV2ZXIgd2FzIHVzZWQgdG8gY29tcGlsZSBBcGFjaGUgZmlyc3QuCi0gKgotICAgICBnY2MgLWcgLU8yIC1JLi4vb3MvdW5peCAtSS4uL2luY2x1ZGUgLW8gdGVzdF9wYXJzZXIgXAotICAgICAgICAgICAgLURTT0xBUklTMj0yNTAgLVdhbGwgLURBTExPQ19ERUJVRyAtRFBPT0xfREVCVUcgXAotICAgICAgICAgICAgLi4vbWFpbi9hbGxvYy5vIC4uL21haW4vYnVmZi5vIC4uL21haW4vdXRpbC5vIFwKLSAgICAgICAgICAgIC4uL2FwL2xpYmFwLmEgLWxzb2NrZXQgLWxuc2wgdGVzdF9wYXJzZXIuYwotICogCi0gKiBSb3kgRmllbGRpbmcsIDE5OTkKLSAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJhbGxvYy5oIgotCi0vKgotICogRHVtbXkgYSBidW5jaCBvZiBzdHVmZiBqdXN0IHRvIGdldCBhIGNvbXBpbGUKLSAqLwotdWlkX3QgYXBfdXNlcl9pZDsKLWdpZF90IGFwX2dyb3VwX2lkOwotdm9pZCAqYXBfZHVtbXlfbXV0ZXggPSAmYXBfZHVtbXlfbXV0ZXg7Ci1jaGFyICphcF9zZXJ2ZXJfYXJndjA7Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfYmxvY2tfYWxhcm1zKHZvaWQpCi17Ci0gICAgOwotfQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX3VuYmxvY2tfYWxhcm1zKHZvaWQpCi17Ci0gICAgOwotfQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX2xvZ19lcnJvcihjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgICA7Ci19Ci0KLWludCBtYWluICh2b2lkKQotewotICAgIGFwX3Bvb2wgKnA7Ci0gICAgY29uc3QgY2hhciAqZmllbGQ7Ci0gICAgY2hhciAqbmV3c3RyOwotICAgIGNoYXIgaW5zdHJbNTEyXTsKLQotICAgIHAgPSBhcF9pbml0X2FsbG9jKCk7Ci0KLSAgICB3aGlsZSAoZ2V0cyhpbnN0cikpIHsKLSAgICAgICAgcHJpbnRmKCIgIFslc10gPT1cbiIsIGluc3RyKTsKLSAgICAgICAgZmllbGQgPSBpbnN0cjsKLSAgICAgICAgd2hpbGUgKChuZXdzdHIgPSBhcF9nZXRfbGlzdF9pdGVtKHAsICZmaWVsZCkpICE9IE5VTEwpCi0gICAgICAgICAgICBwcmludGYoIiAgPCVzPiAuLlxuIiwgbmV3c3RyKTsKLSAgICB9Ci0gICAgCi0gICAgZXhpdCgwKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdF9zZWxlY3QuYyBiL3Rlc3QvdGVzdF9zZWxlY3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwYTZhNC4uMDAwMDAwMAotLS0gYS90ZXN0L3Rlc3Rfc2VsZWN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKiBUaGlzIGlzIGp1c3QgYSBxdWljayB0ZXN0IHByb2dyYW0gdG8gc2VlIGhvdyBsb25nIGEgd2FpdCBpcwotICogcHJvZHVjZWQgYnkgYSBzZWxlY3QgbG9vcCB3aXRoIGFuIGV4cG9uZW50aWFsIGJhY2tvZmYuCi0gKgotICogICBnY2MgLWcgLU8yIC1vIHRlc3Rfc2VsZWN0IHRlc3Rfc2VsZWN0LmMKLSAqICAgdGVzdF9zZWxlY3QKLSAqCi0gKiBSb3kgRmllbGRpbmcsIDE5OTYKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotCi1pbnQgbWFpbiAodm9pZCkKLXsKLSAgICBpbnQgc3J2OwotICAgIGxvbmcgd2FpdHRpbWUgPSA0MDk2OwotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotCi0gICAgcHJpbnRmKCJTdGFydFxuIik7Ci0gICAgd2hpbGUgKCh3YWl0dGltZSA+IDApICYmICh3YWl0dGltZSA8IDMwMDAwMDApKSB7Ci0gICAgICAgIHByaW50ZigiJWRcbiIsIHdhaXR0aW1lKTsKLSAgICAgICAgdHYudHZfc2VjICA9IHdhaXR0aW1lLzEwMDAwMDA7Ci0gICAgICAgIHR2LnR2X3VzZWMgPSB3YWl0dGltZSUxMDAwMDAwOwotICAgICAgICB3YWl0dGltZSA8PD0gMTsKLSAgICAgICAgc3J2ID0gc2VsZWN0KDAsIE5VTEwsIE5VTEwsIE5VTEwsICZ0dik7Ci0gICAgfQotICAgIHByaW50ZigiRW5kXG4iKTsKLSAgICBleGl0KDApOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC90aW1lLXNlbS5jIGIvdGVzdC90aW1lLXNlbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmY2N2M3Li4wMDAwMDAwCi0tLSBhL3Rlc3QvdGltZS1zZW0uYworKysgL2Rldi9udWxsCkBAIC0xLDU3MiArMCwwIEBACi0vKgotdGltZS1zZW0uYyBoYXMgdGhlIGJhc2ljcyBvZiB0aGUgc2VtYXBob3JlcyB3ZSB1c2UgaW4gaHR0cF9tYWluLmMuICBJdCdzCi1pbnRlbmRlZCBmb3IgdGltaW5nIGRpZmZlcmVuY2VzIGJldHdlZW4gdmFyaW91cyBtZXRob2RzIG9uIGFuCi1hcmNoaXRlY3R1cmUuICBJbiBwcmFjdGljZSB3ZSd2ZSBmb3VuZCBtYW55IHRoaW5ncyBhZmZlY3Qgd2hpY2ggc2VtYXBob3JlCi10byBiZSB1c2VkOgotCi0gICAgLSBORlMgZmlsZXN5c3RlbXMgYWJzb2x1dGVseSBzdWNrIGZvciBmY250bCgpIGFuZCBmbG9jaygpCi0KLSAgICAtIHVzbG9jayBhYnNvbHV0ZWx5IHN1Y2tzIG9uIHNpbmdsZS1wcm9jZXNzb3IgSVJJWCBib3hlcywgYnV0Ci0JYWJzb2x1dGVseSByb2NrcyBvbiBtdWx0aS1wcm9jZXNzb3IgYm94ZXMuICBUaGUgY29udmVyc2UKLQlpcyB0cnVlIGZvciBmY250bC4gIHN5c3ZzZW0gc2VlbXMgYSBtb2RlcmF0ZSBiYWxhbmNlLgotCi0gICAgLSBVbmRlciBTb2xhcmlzIHlvdSBjYW4ndCBoYXZlIHRvbyBtYW55IHByb2Nlc3NlcyB1c2UgU0VNX1VORE8sIHRoZXJlCi0JbWlnaHQgYmUgYSB0dW5lYWJsZSBzb21ld2hlcmUgdGhhdCBpbmNyZWFzZXMgdGhlIGxpbWl0IGZyb20gMjkuCi0JV2UncmUgbm90IHN1cmUgd2hhdCB0aGUgdHVuYWJsZSBpcywgc28gdGhlcmUncyBhIGRlZmluZQotCU5PX1NFTV9VTkRPIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHNpbXVsYXRlIHVzIHRyYXBwaW5nL2Jsb2NraW5nCi0Jc2lnbmFscyB0byBiZSBhYmxlIHRvIHByb3Blcmx5IHJlbGVhc2UgdGhlIHNlbWFwaG9yZSBvbiBhIGNsZWFuCi0JY2hpbGQgZGVhdGguICBZb3UnbGwgYWxzbyBuZWVkIHRvIGRlZmluZSBORUVEX1VOSU9OX1NFTVVOCi0JdW5kZXIgc29sYXJpcy4KLQotWW91J2xsIG5lZWQgdG8gZGVmaW5lIFVTRV9TSE1HRVRfU0NPUkVCT0FSRCBpZiBhbm9ueW1vdXMgc2hhcmVkIG1tYXAoKQotZG9lc24ndCB3b3JrIG9uIHlvdXIgc3lzdGVtIChpLmUuIGxpbnV4KS4KLQotYXJndlsxXSBpcyB0aGUgI2NoaWxkcmVuLCBhcmd2WzJdIGlzIHRoZSAjaXRlcmF0aW9ucyBwZXIgY2hpbGQKLQotWW91IHNob3VsZCBydW4gZWFjaCBvdmVyIG1hbnkgZGlmZmVyZW50ICNjaGlsZHJlbiBpbnB1dHMsIGFuZCBjaG9vc2UKLSNpdGVyIHN1Y2ggdGhhdCB0aGUgcHJvZ3JhbSBydW5zIGZvciBhdCBsZWFzdCBhIHNlY29uZCBvciBzby4uLiBvciBldmVuCi1sb25nZXIgZGVwZW5kaW5nIG9uIHlvdXIgcGF0aWVuY2UuCi0KLWNvbXBpbGUgd2l0aDoKLQotZ2NjIC1vIHRpbWUtRkNOVEwgLVdhbGwgLU8gdGltZS1zZW0uYyAtRFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVAotZ2NjIC1vIHRpbWUtRkxPQ0sgLVdhbGwgLU8gdGltZS1zZW0uYyAtRFVTRV9GTE9DS19TRVJJQUxJWkVEX0FDQ0VQVAotZ2NjIC1vIHRpbWUtU1lTVlNFTSAtV2FsbCAtTyB0aW1lLXNlbS5jIC1EVVNFX1NZU1ZTRU1fU0VSSUFMSVpFRF9BQ0NFUFQKLWdjYyAtbyB0aW1lLVNZU1ZTRU0yIC1XYWxsIC1PIHRpbWUtc2VtLmMgLURVU0VfU1lTVlNFTV9TRVJJQUxJWkVEX0FDQ0VQVCAtRE5PX1NFTV9VTkRPCi1nY2MgLW8gdGltZS1QVEhSRUFEIC1XYWxsIC1PIHRpbWUtc2VtLmMgLURVU0VfUFRIUkVBRF9TRVJJQUxJWkVEX0FDQ0VQVCAtbHB0aHJlYWQKLWdjYyAtbyB0aW1lLVVTTE9DSyAtV2FsbCAtTyB0aW1lLXNlbS5jIC1EVVNFX1VTTE9DS19TRVJJQUxJWkVEX0FDQ0VQVAotCi1ub3QgYWxsIHZlcnNpb25zIHdvcmsgb24gYWxsIHN5c3RlbXMuCi0qLwotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotI2lmIGRlZmluZWQoVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUKQotCi1zdGF0aWMgc3RydWN0IGZsb2NrIGxvY2tfaXQ7Ci1zdGF0aWMgc3RydWN0IGZsb2NrIHVubG9ja19pdDsKLQotc3RhdGljIGludCBmY250bF9mZD0tMTsKLQotI2RlZmluZSBhY2NlcHRfbXV0ZXhfY2hpbGRfaW5pdCgpCi0jZGVmaW5lIGFjY2VwdF9tdXRleF9jbGVhbnVwKCkKLQotLyoKLSAqIEluaXRpYWxpemUgbXV0ZXggbG9jay4KLSAqIE11c3QgYmUgc2FmZSB0byBjYWxsIHRoaXMgb24gYSByZXN0YXJ0LgotICovCi12b2lkCi1hY2NlcHRfbXV0ZXhfaW5pdCh2b2lkKQotewotCi0gICAgbG9ja19pdC5sX3doZW5jZSA9IFNFRUtfU0VUOyAgIC8qIGZyb20gY3VycmVudCBwb2ludCAqLwotICAgIGxvY2tfaXQubF9zdGFydCAgPSAwOyAgICAgICAgICAvKiAtIi0gKi8KLSAgICBsb2NrX2l0LmxfbGVuICAgID0gMDsgICAgICAgICAgLyogdW50aWwgZW5kIG9mIGZpbGUgKi8KLSAgICBsb2NrX2l0LmxfdHlwZSAgID0gRl9XUkxDSzsgICAgLyogc2V0IGV4Y2x1c2l2ZS93cml0ZSBsb2NrICovCi0gICAgbG9ja19pdC5sX3BpZCAgICA9IDA7ICAgICAgICAgIC8qIHBpZCBub3QgYWN0dWFsbHkgaW50ZXJlc3RpbmcgKi8KLSAgICB1bmxvY2tfaXQubF93aGVuY2UgPSBTRUVLX1NFVDsgLyogZnJvbSBjdXJyZW50IHBvaW50ICovCi0gICAgdW5sb2NrX2l0Lmxfc3RhcnQgID0gMDsgICAgICAgIC8qIC0iLSAqLwotICAgIHVubG9ja19pdC5sX2xlbiAgICA9IDA7ICAgICAgICAvKiB1bnRpbCBlbmQgb2YgZmlsZSAqLwotICAgIHVubG9ja19pdC5sX3R5cGUgICA9IEZfVU5MQ0s7ICAvKiBzZXQgZXhjbHVzaXZlL3dyaXRlIGxvY2sgKi8KLSAgICB1bmxvY2tfaXQubF9waWQgICAgPSAwOyAgICAgICAgLyogcGlkIG5vdCBhY3R1YWxseSBpbnRlcmVzdGluZyAqLwotCi0gICAgcHJpbnRmKCJvcGVuaW5nIHRlc3QtbG9jay10aGluZyBpbiBjdXJyZW50IGRpcmVjdG9yeVxuIik7Ci0gICAgZmNudGxfZmQgPSBvcGVuKCJ0ZXN0LWxvY2stdGhpbmciLCBPX0NSRUFUIHwgT19XUk9OTFkgfCBPX0VYQ0wsIDA2NDQpOwotICAgIGlmIChmY250bF9mZCA9PSAtMSkKLSAgICB7Ci0JcGVycm9yICgib3BlbiIpOwotCWZwcmludGYgKHN0ZGVyciwgIkNhbm5vdCBvcGVuIGxvY2sgZmlsZTogJXNcbiIsICJ0ZXN0LWxvY2stdGhpbmciKTsKLQlleGl0ICgxKTsKLSAgICB9Ci0gICAgdW5saW5rKCJ0ZXN0LWxvY2stdGhpbmciKTsKLX0KLQotdm9pZCBhY2NlcHRfbXV0ZXhfb24odm9pZCkKLXsKLSAgICBpbnQgcmV0OwotICAgIAotICAgIHdoaWxlICgocmV0ID0gZmNudGwoZmNudGxfZmQsIEZfU0VUTEtXLCAmbG9ja19pdCkpIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKLQljb250aW51ZTsKLQotICAgIGlmIChyZXQgPCAwKSB7Ci0JcGVycm9yICgiZmNudGwgbG9ja19pdCIpOwotCWV4aXQoMSk7Ci0gICAgfQotfQotCi12b2lkIGFjY2VwdF9tdXRleF9vZmYodm9pZCkKLXsKLSAgICBpZiAoZmNudGwgKGZjbnRsX2ZkLCBGX1NFVExLVywgJnVubG9ja19pdCkgPCAwKQotICAgIHsKLQlwZXJyb3IgKCJmY250bCB1bmxvY2tfaXQiKTsKLQlleGl0KDEpOwotICAgIH0KLX0KLQotI2VsaWYgZGVmaW5lZChVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQpCi0KLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotCi1zdGF0aWMgaW50IGZsb2NrX2ZkPS0xOwotCi0jZGVmaW5lIEZOQU1FICJ0ZXN0LWxvY2stdGhpbmciCi0KLS8qCi0gKiBJbml0aWFsaXplIG11dGV4IGxvY2suCi0gKiBNdXN0IGJlIHNhZmUgdG8gY2FsbCB0aGlzIG9uIGEgcmVzdGFydC4KLSAqLwotdm9pZCBhY2NlcHRfbXV0ZXhfaW5pdCh2b2lkKQotewotCi0gICAgcHJpbnRmKCJvcGVuaW5nICIgRk5BTUUgIiBpbiBjdXJyZW50IGRpcmVjdG9yeVxuIik7Ci0gICAgZmxvY2tfZmQgPSBvcGVuKEZOQU1FLCBPX0NSRUFUIHwgT19XUk9OTFkgfCBPX0VYQ0wsIDA2NDQpOwotICAgIGlmIChmbG9ja19mZCA9PSAtMSkKLSAgICB7Ci0JcGVycm9yICgib3BlbiIpOwotCWZwcmludGYgKHN0ZGVyciwgIkNhbm5vdCBvcGVuIGxvY2sgZmlsZTogJXNcbiIsICJ0ZXN0LWxvY2stdGhpbmciKTsKLQlleGl0ICgxKTsKLSAgICB9Ci19Ci0KLXZvaWQgYWNjZXB0X211dGV4X2NoaWxkX2luaXQodm9pZCkKLXsKLSAgICBmbG9ja19mZCA9IG9wZW4oRk5BTUUsIE9fV1JPTkxZLCAwNjAwKTsKLSAgICBpZiAoZmxvY2tfZmQgPT0gLTEpIHsKLQlwZXJyb3IoIm9wZW4iKTsKLQlleGl0KDEpOwotICAgIH0KLX0KLQotdm9pZCBhY2NlcHRfbXV0ZXhfY2xlYW51cCh2b2lkKQotewotICAgIHVubGluayhGTkFNRSk7Ci19Ci0KLXZvaWQgYWNjZXB0X211dGV4X29uKHZvaWQpCi17Ci0gICAgaW50IHJldDsKLSAgICAKLSAgICB3aGlsZSAoKHJldCA9IGZsb2NrKGZsb2NrX2ZkLCBMT0NLX0VYKSkgPCAwICYmIGVycm5vID09IEVJTlRSKQotCWNvbnRpbnVlOwotCi0gICAgaWYgKHJldCA8IDApIHsKLQlwZXJyb3IgKCJmbG9jayhMT0NLX0VYKSIpOwotCWV4aXQoMSk7Ci0gICAgfQotfQotCi12b2lkIGFjY2VwdF9tdXRleF9vZmYodm9pZCkKLXsKLSAgICBpZiAoZmxvY2sgKGZsb2NrX2ZkLCBMT0NLX1VOKSA8IDApCi0gICAgewotCXBlcnJvciAoImZsb2NrKExPQ0tfVU4pIik7Ci0JZXhpdCgxKTsKLSAgICB9Ci19Ci0KLSNlbGlmIGRlZmluZWQgKFVTRV9TWVNWU0VNX1NFUklBTElaRURfQUNDRVBUKQotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL2lwYy5oPgotI2luY2x1ZGUgPHN5cy9zZW0uaD4KLQotc3RhdGljICAgaW50IHNlbV9pZCA9IC0xOwotI2lmZGVmIE5PX1NFTV9VTkRPCi1zdGF0aWMgc2lnc2V0X3QgYWNjZXB0X2Jsb2NrX21hc2s7Ci1zdGF0aWMgc2lnc2V0X3QgYWNjZXB0X3ByZXZpb3VzX21hc2s7Ci0jZW5kaWYKLQotI2RlZmluZSBhY2NlcHRfbXV0ZXhfY2hpbGRfaW5pdCgpCi0jZGVmaW5lIGFjY2VwdF9tdXRleF9jbGVhbnVwKCkKLQotdm9pZCBhY2NlcHRfbXV0ZXhfaW5pdCh2b2lkKQotewotI2lmZGVmIE5FRURfVU5JT05fU0VNVU4KLSAgICAvKiBiZWxpZXZlIGl0IG9yIG5vdCwgeW91IG5lZWQgdG8gZGVmaW5lIHRoaXMgdW5kZXIgc29sYXJpcyAqLwotICAgIHVuaW9uIHNlbXVuIHsKLQlpbnQgdmFsOwotCXN0cnVjdCBzZW1pZF9kcyAqYnVmOwotCXVzaG9ydCAqYXJyYXk7Ci0gICAgfTsKLSNlbmRpZgotCi0gICAgdW5pb24gc2VtdW4gaWNrOwotCi0gICAgc2VtX2lkID0gc2VtZ2V0KDk5OSwgMSwgSVBDX0NSRUFUIHwgMDY2Nik7Ci0gICAgaWYgKHNlbV9pZCA8IDApIHsKLSAgICAgICBwZXJyb3IgKCJzZW1nZXQiKTsKLSAgICAgICBleGl0ICgxKTsKLSAgICB9Ci0gICAgaWNrLnZhbCA9IDE7Ci0gICAgaWYgKHNlbWN0bChzZW1faWQsIDAsIFNFVFZBTCwgaWNrKSA8IDApIHsKLSAgICAgICBwZXJyb3IgKCJzZW1jdGwiKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0jaWZkZWYgTk9fU0VNX1VORE8KLSAgICBzaWdmaWxsc2V0KCZhY2NlcHRfYmxvY2tfbWFzayk7Ci0gICAgc2lnZGVsc2V0KCZhY2NlcHRfYmxvY2tfbWFzaywgU0lHSFVQKTsKLSAgICBzaWdkZWxzZXQoJmFjY2VwdF9ibG9ja19tYXNrLCBTSUdURVJNKTsKLSAgICBzaWdkZWxzZXQoJmFjY2VwdF9ibG9ja19tYXNrLCBTSUdVU1IxKTsKLSNlbmRpZgotfQotCi12b2lkIGFjY2VwdF9tdXRleF9vbigpCi17Ci0gICAgc3RydWN0IHNlbWJ1ZiBvcDsKLQotI2lmZGVmIE5PX1NFTV9VTkRPCi0gICAgaWYgKHNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJmFjY2VwdF9ibG9ja19tYXNrLCAmYWNjZXB0X3ByZXZpb3VzX21hc2spKSB7Ci0JcGVycm9yKCJzaWdwcm9jbWFzayhTSUdfQkxPQ0spIik7Ci0JZXhpdCAoMSk7Ci0gICAgfQotICAgIG9wLnNlbV9mbGcgPSAwOwotI2Vsc2UKLSAgICBvcC5zZW1fZmxnID0gU0VNX1VORE87Ci0jZW5kaWYKLSAgICBvcC5zZW1fbnVtID0gMDsKLSAgICBvcC5zZW1fb3AgID0gLTE7Ci0gICAgaWYgKHNlbW9wKHNlbV9pZCwgJm9wLCAxKSA8IDApIHsKLQlwZXJyb3IgKCJhY2NlcHRfbXV0ZXhfb24iKTsKLQlleGl0ICgxKTsKLSAgICB9Ci19Ci0KLXZvaWQgYWNjZXB0X211dGV4X29mZigpCi17Ci0gICAgc3RydWN0IHNlbWJ1ZiBvcDsKLQotICAgIG9wLnNlbV9udW0gPSAwOwotICAgIG9wLnNlbV9vcCAgPSAxOwotI2lmZGVmIE5PX1NFTV9VTkRPCi0gICAgb3Auc2VtX2ZsZyA9IDA7Ci0jZWxzZQotICAgIG9wLnNlbV9mbGcgPSBTRU1fVU5ETzsKLSNlbmRpZgotICAgIGlmIChzZW1vcChzZW1faWQsICZvcCwgMSkgPCAwKSB7Ci0JcGVycm9yICgiYWNjZXB0X211dGV4X29mZiIpOwotICAgICAgICBleGl0ICgxKTsKLSAgICB9Ci0jaWZkZWYgTk9fU0VNX1VORE8KLSAgICBpZiAoc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZhY2NlcHRfcHJldmlvdXNfbWFzaywgTlVMTCkpIHsKLQlwZXJyb3IoInNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLKSIpOwotCWV4aXQgKDEpOwotICAgIH0KLSNlbmRpZgotfQotCi0jZWxpZiBkZWZpbmVkIChVU0VfUFRIUkVBRF9TRVJJQUxJWkVEX0FDQ0VQVCkKLQotLyogbm90ZTogcHRocmVhZCBtdXRleGVzIGFyZW4ndCByZWxlYXNlZCBvbiBjaGlsZCBkZWF0aCwgaGVuY2UgdGhlCi0gKiBzaWduYWwgZ29vcCAuLi4gaW4gYSByZWFsIGltcGxlbWVudGF0aW9uIHdlJ2QgZG8gc3BlY2lhbCB0aGluZ3MKLSAqIGR1cmluZyBodXAsIHRlcm0sIHVzcjEuCi0gKi8KLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXg7Ci1zdGF0aWMgc2lnc2V0X3QgYWNjZXB0X2Jsb2NrX21hc2s7Ci1zdGF0aWMgc2lnc2V0X3QgYWNjZXB0X3ByZXZpb3VzX21hc2s7Ci0KLSNkZWZpbmUgYWNjZXB0X211dGV4X2NoaWxkX2luaXQoKQotI2RlZmluZSBhY2NlcHRfbXV0ZXhfY2xlYW51cCgpCi0KLXZvaWQgYWNjZXB0X211dGV4X2luaXQodm9pZCkKLXsKLSAgICBwdGhyZWFkX211dGV4YXR0cl90IG1hdHRyOwotICAgIGludCBmZDsKLQotICAgIGZkID0gb3BlbiAoIi9kZXYvemVybyIsIE9fUkRXUik7Ci0gICAgaWYgKGZkID09IC0xKSB7Ci0JcGVycm9yICgib3BlbigvZGV2L3plcm8pIik7Ci0JZXhpdCAoMSk7Ci0gICAgfQotICAgIG11dGV4ID0gKHB0aHJlYWRfbXV0ZXhfdCAqKW1tYXAgKChjYWRkcl90KTAsIHNpemVvZiAoKm11dGV4KSwKLQkJICAgIFBST1RfUkVBRHxQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBmZCwgMCk7Ci0gICAgaWYgKG11dGV4ID09ICh2b2lkICopKGNhZGRyX3QpLTEpIHsKLQlwZXJyb3IgKCJtbWFwIik7Ci0JZXhpdCAoMSk7Ci0gICAgfQotICAgIGNsb3NlIChmZCk7Ci0gICAgaWYgKHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJm1hdHRyKSkgewotCXBlcnJvciAoInB0aHJlYWRfbXV0ZXhhdHRyX2luaXQiKTsKLQlleGl0ICgxKTsKLSAgICB9Ci0gICAgaWYgKHB0aHJlYWRfbXV0ZXhhdHRyX3NldHBzaGFyZWQoJm1hdHRyLCBQVEhSRUFEX1BST0NFU1NfU0hBUkVEKSkgewotCXBlcnJvciAoInB0aHJlYWRfbXV0ZXhhdHRyX3NldHBzaGFyZWQiKTsKLQlleGl0ICgxKTsKLSAgICB9Ci0gICAgaWYgKHB0aHJlYWRfbXV0ZXhfaW5pdChtdXRleCwgJm1hdHRyKSkgewotCXBlcnJvciAoInB0aHJlYWRfbXV0ZXhfaW5pdCIpOwotCWV4aXQgKDEpOwotICAgIH0KLSAgICBzaWdmaWxsc2V0KCZhY2NlcHRfYmxvY2tfbWFzayk7Ci0gICAgc2lnZGVsc2V0KCZhY2NlcHRfYmxvY2tfbWFzaywgU0lHSFVQKTsKLSAgICBzaWdkZWxzZXQoJmFjY2VwdF9ibG9ja19tYXNrLCBTSUdURVJNKTsKLSAgICBzaWdkZWxzZXQoJmFjY2VwdF9ibG9ja19tYXNrLCBTSUdVU1IxKTsKLX0KLQotdm9pZCBhY2NlcHRfbXV0ZXhfb24oKQotewotICAgIGlmIChzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZhY2NlcHRfYmxvY2tfbWFzaywgJmFjY2VwdF9wcmV2aW91c19tYXNrKSkgewotCXBlcnJvcigic2lncHJvY21hc2soU0lHX0JMT0NLKSIpOwotCWV4aXQgKDEpOwotICAgIH0KLSAgICBpZiAocHRocmVhZF9tdXRleF9sb2NrIChtdXRleCkpIHsKLQlwZXJyb3IgKCJwdGhyZWFkX211dGV4X2xvY2siKTsKLQlleGl0ICgxKTsKLSAgICB9Ci19Ci0KLXZvaWQgYWNjZXB0X211dGV4X29mZigpCi17Ci0gICAgaWYgKHB0aHJlYWRfbXV0ZXhfdW5sb2NrIChtdXRleCkpIHsKLQlwZXJyb3IgKCJwdGhyZWFkX211dGV4X3VubG9jayIpOwotCWV4aXQgKDEpOwotICAgIH0KLSAgICBpZiAoc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZhY2NlcHRfcHJldmlvdXNfbWFzaywgTlVMTCkpIHsKLQlwZXJyb3IoInNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLKSIpOwotCWV4aXQgKDEpOwotICAgIH0KLX0KLQotI2VsaWYgZGVmaW5lZCAoVVNFX1VTTE9DS19TRVJJQUxJWkVEX0FDQ0VQVCkKLQotI2luY2x1ZGUgPHVsb2Nrcy5oPgotCi1zdGF0aWMgdXNwdHJfdCAqdXMgPSBOVUxMOwotc3RhdGljIHVsb2NrX3QgdXNsb2NrID0gTlVMTDsKLQotI2RlZmluZSBhY2NlcHRfbXV0ZXhfY2hpbGRfaW5pdCgpCi0jZGVmaW5lIGFjY2VwdF9tdXRleF9jbGVhbnVwKCkKLQotdm9pZCBhY2NlcHRfbXV0ZXhfaW5pdCh2b2lkKQotewotICAgIHB0cmRpZmZfdCBvbGQ7Ci0gICAgLyogZGVmYXVsdCBpcyA4ICovCi0jZGVmaW5lIENPTkZfSU5JVFVTRVJTX01BWCAxNQotICAgIGlmICgob2xkID0gdXNjb25maWcoQ09ORl9JTklUVVNFUlMsIENPTkZfSU5JVFVTRVJTX01BWCkpID09IC0xKSB7Ci0gICAgICAgIHBlcnJvcigidXNjb25maWciKTsKLSAgICAgICAgZXhpdCgtMSk7Ci0gICAgfQotICAgIGlmICgob2xkID0gdXNjb25maWcoQ09ORl9MT0NLVFlQRSwgVVNfTk9ERUJVRykpID09IC0xKSB7Ci0gICAgICAgIHBlcnJvcigidXNjb25maWciKTsKLSAgICAgICAgZXhpdCgtMSk7Ci0gICAgfQotICAgIGlmICgob2xkID0gdXNjb25maWcoQ09ORl9BUkVOQVRZUEUsIFVTX1NIQVJFRE9OTFkpKSA9PSAtMSkgewotICAgICAgICBwZXJyb3IoInVzY29uZmlnIik7Ci0gICAgICAgIGV4aXQoLTEpOwotICAgIH0KLSAgICBpZiAoKHVzID0gdXNpbml0KCIvZGV2L3plcm8iKSkgPT0gTlVMTCkgewotICAgICAgICBwZXJyb3IoInVzaW5pdCIpOwotICAgICAgICBleGl0KC0xKTsKLSAgICB9Ci0gICAgaWYgKCh1c2xvY2sgPSB1c25ld2xvY2sodXMpKSA9PSBOVUxMKSB7Ci0gICAgICAgIHBlcnJvcigidXNuZXdsb2NrIik7Ci0gICAgICAgIGV4aXQoLTEpOwotICAgIH0KLX0KLXZvaWQgYWNjZXB0X211dGV4X29uKCkKLXsKLSAgICBzd2l0Y2godXNzZXRsb2NrKHVzbG9jaykpIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgLyogZ290IGxvY2sgKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRpZG4ndCBnZXQgbG9ja1xuIik7Ci0gICAgICAgICAgICBleGl0KC0xKTsKLSAgICAgICAgY2FzZSAtMToKLSAgICAgICAgICAgIHBlcnJvcigidXNzZXRsb2NrIik7Ci0gICAgICAgICAgICBleGl0KC0xKTsKLSAgICB9Ci19Ci12b2lkIGFjY2VwdF9tdXRleF9vZmYoKQotewotICAgIGlmICh1c3Vuc2V0bG9jayh1c2xvY2spID09IC0xKSB7Ci0gICAgICAgIHBlcnJvcigidXN1bnNldGxvY2siKTsKLSAgICAgICAgZXhpdCgtMSk7Ci0gICAgfQotfQotI2VuZGlmCi0KLQotI2lmbmRlZiBVU0VfU0hNR0VUX1NDT1JFQk9BUkQKLXN0YXRpYyB2b2lkICpnZXRfc2hhcmVkX21lbShzaXplX3Qgc2l6ZSkKLXsKLSAgICB2b2lkICpyZXN1bHQ7Ci0KLSAgICAvKiBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5IGZvciB0aGUgc2hhcmVkX2NvdW50ZXIgKi8KLSAgICByZXN1bHQgPSAodW5zaWduZWQgbG9uZyAqKW1tYXAgKChjYWRkcl90KTAsIHNpemUsCi0JCSAgICBQUk9UX1JFQUR8UFJPVF9XUklURSwgTUFQX0FOT058TUFQX1NIQVJFRCwgLTEsIDApOwotICAgIGlmIChyZXN1bHQgPT0gKHZvaWQgKikoY2FkZHJfdCktMSkgewotCXBlcnJvciAoIm1tYXAiKTsKLQlleGl0ICgxKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLSNlbHNlCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL2lwYy5oPgotI2luY2x1ZGUgPHN5cy9zaG0uaD4KLQotc3RhdGljIHZvaWQgKmdldF9zaGFyZWRfbWVtKHNpemVfdCBzaXplKQotewotICAgIGtleV90IHNobWtleSA9IElQQ19QUklWQVRFOwotICAgIGludCBzaG1pZCA9IC0xOwotICAgIHZvaWQgKnJlc3VsdDsKLSNpZmRlZiBNT1ZFQlJFQUsKLSAgICBjaGFyICpvYnJrOwotI2VuZGlmCi0KLSAgICBpZiAoKHNobWlkID0gc2htZ2V0KHNobWtleSwgc2l6ZSwgSVBDX0NSRUFUIHwgU0hNX1IgfCBTSE1fVykpID09IC0xKSB7Ci0JcGVycm9yKCJzaG1nZXQiKTsKLQlleGl0KDEpOwotICAgIH0KLQotI2lmZGVmIE1PVkVCUkVBSwotICAgIC8qCi0gICAgICogU29tZSBTeXNWIHN5c3RlbXMgcGxhY2UgdGhlIHNoYXJlZCBzZWdtZW50IFdBWSB0b28gY2xvc2UKLSAgICAgKiB0byB0aGUgZHluYW1pYyBtZW1vcnkgYnJlYWsgcG9pbnQgKHNicmsoMCkpLiBUaGlzIHNldmVyZWx5Ci0gICAgICogbGltaXRzIHRoZSB1c2Ugb2YgbWFsbG9jL3NicmsgaW4gdGhlIHByb2dyYW0gc2luY2Ugc2JyayB3aWxsCi0gICAgICogcmVmdXNlIHRvIG1vdmUgcGFzdCB0aGF0IHBvaW50LgotICAgICAqCi0gICAgICogVG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSBtb3ZlIHRoZSBicmVhayBwb2ludCAid2F5IHVwIHRoZXJlIiwKLSAgICAgKiBhdHRhY2ggdGhlIHNlZ21lbnQgYW5kIHRoZW4gbW92ZSBicmVhayBiYWNrIGRvd24uIFVnbHkKLSAgICAgKi8KLSAgICBpZiAoKG9icmsgPSBzYnJrKE1PVkVCUkVBSykpID09IChjaGFyICopIC0xKSB7Ci0JcGVycm9yKCJzYnJrIik7Ci0gICAgfQotI2VuZGlmCi0KLSNkZWZpbmUgQkFEU0hNQVQJKCh2b2lkICopKC0xKSkKLSAgICBpZiAoKHJlc3VsdCA9IHNobWF0KHNobWlkLCAwLCAwKSkgPT0gQkFEU0hNQVQpIHsKLQlwZXJyb3IoInNobWF0Iik7Ci0gICAgfQotICAgIC8qCi0gICAgICogV2UgbXVzdCBhdm9pZCBsZWF2aW5nIHNlZ21lbnRzIGluIHRoZSBrZXJuZWwncwotICAgICAqIChzbWFsbCkgdGFibGVzLgotICAgICAqLwotICAgIGlmIChzaG1jdGwoc2htaWQsIElQQ19STUlELCBOVUxMKSAhPSAwKSB7Ci0JcGVycm9yKCJzaG1jdGwoSVBDX1JNSUQpIik7Ci0gICAgfQotICAgIGlmIChyZXN1bHQgPT0gQkFEU0hNQVQpCS8qIG5vdyBiYWlsb3V0ICovCi0JZXhpdCgxKTsKLQotI2lmZGVmIE1PVkVCUkVBSwotICAgIGlmIChvYnJrID09IChjaGFyICopIC0xKQotCXJldHVybjsJCQkvKiBub3RoaW5nIGVsc2UgdG8gZG8gKi8KLSAgICBpZiAoc2JyaygtKE1PVkVCUkVBSykpID09IChjaGFyICopIC0xKSB7Ci0JcGVycm9yKCJzYnJrIDIiKTsKLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm4gcmVzdWx0OwotfQotI2VuZGlmCi0KLSNpZmRlZiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORwotLyogZG9uJ3QgYXNrICovCi0jZGVmaW5lIF9QIF9fUAotI2luY2x1ZGUgPHNjaGVkLmg+Ci0jZGVmaW5lIFlJRUxECXNjaGVkX3lpZWxkKCkKLSNlbHNlCi0jZGVmaW5lIFlJRUxECWRvIHsgc3RydWN0IHRpbWV2YWwgemVybzsgemVyby50dl9zZWMgPSB6ZXJvLnR2X3VzZWMgPSAwOyBzZWxlY3QoMCwwLDAsMCwmemVybyk7IH0gd2hpbGUoMCkKLSNlbmRpZgotCi12b2lkIG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBpbnQgbnVtX2l0ZXI7Ci0gICAgaW50IG51bV9jaGlsZDsKLSAgICBpbnQgaTsKLSAgICBzdHJ1Y3QgdGltZXZhbCBmaXJzdDsKLSAgICBzdHJ1Y3QgdGltZXZhbCBsYXN0OwotICAgIGxvbmcgbXM7Ci0gICAgaW50IHBpZDsKLSAgICB1bnNpZ25lZCBsb25nICpzaGFyZWRfY291bnRlcjsKLQotICAgIGlmIChhcmdjICE9IDMpIHsKLQlmcHJpbnRmIChzdGRlcnIsICJVc2FnZTogdGltZS1zZW0gbnVtLWNoaWxkIG51bS1pdGVyXG4iKTsKLQlleGl0ICgxKTsKLSAgICB9Ci0KLSAgICBudW1fY2hpbGQgPSBhdG9pIChhcmd2WzFdKTsKLSAgICBudW1faXRlciA9IGF0b2kgKGFyZ3ZbMl0pOwotCi0gICAgLyogYWxsb2NhdGUgc2hhcmVkIG1lbW9yeSBmb3IgdGhlIHNoYXJlZF9jb3VudGVyICovCi0gICAgc2hhcmVkX2NvdW50ZXIgPSBnZXRfc2hhcmVkX21lbShzaXplb2YoKnNoYXJlZF9jb3VudGVyKSk7Ci0KLSAgICAvKiBpbml0aWFsaXplIGNvdW50ZXIgdG8gMCAqLwotICAgICpzaGFyZWRfY291bnRlciA9IDA7Ci0KLSAgICBhY2NlcHRfbXV0ZXhfaW5pdCAoKTsKLQotICAgIC8qIHBhcmVudCBncmFicyBtdXRleCB1bnRpbCBkb25lIHNwYXduaW5nIGNoaWxkcmVuICovCi0gICAgYWNjZXB0X211dGV4X29uICgpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bV9jaGlsZDsgKytpKSB7Ci0JcGlkID0gZm9yaygpOwotCWlmIChwaWQgPT0gMCkgewotCSAgICAvKiBjaGlsZCwgZG8gb3VyIHRoaW5nICovCi0JICAgIGFjY2VwdF9tdXRleF9jaGlsZF9pbml0KCk7Ci0JICAgIGZvciAoaSA9IDA7IGkgPCBudW1faXRlcjsgKytpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JCWFjY2VwdF9tdXRleF9vbiAoKTsKLQkJdG1wID0gKnNoYXJlZF9jb3VudGVyOwotCQlZSUVMRDsKLQkJKnNoYXJlZF9jb3VudGVyID0gdG1wICsgMTsKLQkJYWNjZXB0X211dGV4X29mZiAoKTsKLQkgICAgfQotCSAgICBleGl0ICgwKTsKLQl9IGVsc2UgaWYgKHBpZCA9PSAtMSkgewotCSAgICBwZXJyb3IgKCJmb3JrIik7Ci0JICAgIGV4aXQgKDEpOwotCX0KLSAgICB9Ci0KLSAgICAvKiBhIHF1aWNrIHRlc3QgdG8gc2VlIHRoYXQgbm90aGluZyBpcyBzY3Jld2VkIHVwICovCi0gICAgaWYgKCpzaGFyZWRfY291bnRlciAhPSAwKSB7Ci0JcHV0cyAoIldURiEgc2hhcmVkX2NvdW50ZXIgIT0gMCBiZWZvcmUgdGhlIGNoaWxkcmVuIGhhdmUgYmVlbiBzdGFydGVkISIpOwotCWV4aXQgKDEpOwotICAgIH0KLQotICAgIGdldHRpbWVvZmRheSAoJmZpcnN0LCBOVUxMKTsKLSAgICAvKiBsYXVuY2ggY2hpbGRyZW4gaW50byBhY3Rpb24gKi8KLSAgICBhY2NlcHRfbXV0ZXhfb2ZmICgpOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY2hpbGQ7ICsraSkgewotCWlmICh3YWl0KE5VTEwpID09IC0xKSB7Ci0JICAgIHBlcnJvciAoIndhaXQiKTsKLQl9Ci0gICAgfQotICAgIGdldHRpbWVvZmRheSAoJmxhc3QsIE5VTEwpOwotCi0gICAgaWYgKCpzaGFyZWRfY291bnRlciAhPSBudW1fY2hpbGQgKiBudW1faXRlcikgewotCXByaW50ZiAoIldURiEgc2hhcmVkX2NvdW50ZXIgIT0gbnVtX2NoaWxkICogbnVtX2l0ZXIhXG4iCi0JCSJzaGFyZWRfY291bnRlciA9ICVsdVxubnVtX2NoaWxkID0gJWRcbm51bV9pdGVyPSVkXG4iLAotCQkqc2hhcmVkX2NvdW50ZXIsCi0JCW51bV9jaGlsZCwgbnVtX2l0ZXIpOwotICAgIH0KLQotICAgIGxhc3QudHZfc2VjIC09IGZpcnN0LnR2X3NlYzsKLSAgICBtcyA9IGxhc3QudHZfdXNlYyAtIGZpcnN0LnR2X3VzZWM7Ci0gICAgaWYgKG1zIDwgMCkgewotCS0tbGFzdC50dl9zZWM7Ci0JbXMgKz0gMTAwMDAwMDsKLSAgICB9Ci0gICAgbGFzdC50dl91c2VjID0gbXM7Ci0gICAgcHJpbnRmICgiJThsdS4lMDZsdVxuIiwgbGFzdC50dl9zZWMsIGxhc3QudHZfdXNlYyk7Ci0KLSAgICBhY2NlcHRfbXV0ZXhfY2xlYW51cCgpOwotCi0gICAgZXhpdCgwKTsKLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdC96Yi5jIGIvdGVzdC96Yi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTY2NjZlLi4wMDAwMDAwCi0tLSBhL3Rlc3QvemIuYworKysgL2Rldi9udWxsCkBAIC0xLDU2NyArMCwwIEBACi0KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBaZXVzQmVuY2ggVjEuMDEKLQkJCSAgICA9PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9ncmFtIGlzIENvcHlyaWdodCAoQykgWmV1cyBUZWNobm9sb2d5IExpbWl0ZWQgMTk5Ni4KLQotVGhpcyBwcm9ncmFtIG1heSBiZSB1c2VkIGFuZCBjb3BpZWQgZnJlZWx5IHByb3ZpZGluZyB0aGlzIGNvcHlyaWdodCBub3RpY2UKLWlzIG5vdCByZW1vdmVkLgotCi1UaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgYW5kIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FyYW50aWVzLCAKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAotZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuICBJbiBubyBldmVudCBzaGFsbCAKLVpldXMgVGVjaG5vbG9neSBMdGQuIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIAotZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZWQgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCAKLXByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZCBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7Ci1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiB0aGVvcnkgb2YgbGlhYmlsaXR5LiAgV2hldGhlcgotaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHkgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSAKLWFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlCi1wb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotICAgICBXcml0dGVuIGJ5IEFkYW0gVHdpc3MgKGFkYW1AemV1cy5jby51aykuICBNYXJjaCAxOTk2Ci0KLVRoYW5rcyB0byB0aGUgZm9sbG93aW5nIHBlb3BsZSBmb3IgdGhlaXIgaW5wdXQ6Ci0gIE1pa2UgQmVsc2hlIChtYmVsc2hlQG5ldHNjYXBlLmNvbSkgCi0gIE1pY2hhZWwgQ2FtcGFuZWxsYSAoY2FtcGFuZWxsYUBzdGV2bXMuZW5ldC5kZWMuY29tKQotCi0qLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBOb3RlcyBvbiBjb21waWxpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoaXMgc2hvdWxkIGNvbXBpbGUgdW5tb2RpZmllZCB1c2luZyBnY2Mgb24gSFAtVVgsIEZyZWVCU0QsIExpbnV4LAotSVJJWCwgU29sYXJpcywgQUlYIGFuZCBEaWdpdGFsIFVuaXggKE9TRikuICBPbiBTb2xhcmlzIDIueCB5b3Ugd2lsbAotbmVlZCB0byBjb21waWxlIHdpdGggIi1sbnNsIC1sc29ja2V0IiBvcHRpb25zLiAgSWYgeW91IGhhdmUgYW55Ci1kaWZmaWN1bHRpZXMgY29tcGlsaW5nIHRoZW4gbGV0IG1lIGtub3cuCi0KLU9uIFN1bk9TIDQueC54IHlvdSBtYXkgbmVlZCB0byBjb21waWxlIHdpdGggLURTVU5PUzQgdG8gYWRkIHRoZSBmb2xsb3dpbmcgCi10d28gbGluZXMgb2YgY29kZSB3aGljaCBhcHBlYXIgbm90IHRvIGV4aXN0IGluIG15IFN1bk9TIGhlYWRlcnMgKi8KLQotI2lmZGVmIFNVTk9TNAotZXh0ZXJuIGNoYXIgKm9wdGFyZzsgCi1leHRlcm4gaW50IG9wdGluZCwgb3B0ZXJyLCBvcHRvcHQ7ICAgCi0jZW5kaWYKLQotLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIGFmZmVjdHMgaW5jbHVkZSBmaWxlcyBvbiBTb2xhcmlzICovCi0jZGVmaW5lIEJTRF9DT01QCi0KLSNpbmNsdWRlIDxzeXMvdGltZS5oPiAKLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+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==